Projects
Essentials
gstreamer-plugins-bad-codecs
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 10
View file
gstreamer-plugins-bad-codecs.changes
Changed
@@ -1,4 +1,9 @@ ------------------------------------------------------------------- +Thu Jan 26 20:29:50 UTC 2023 - Bjørn Lie <zaitor@opensuse.org> + +- Update to version 1.22.0 + +------------------------------------------------------------------- Fri Dec 23 20:13:27 UTC 2022 - Bjørn Lie <zaitor@opensuse.org> - Update to version 1.20.5
View file
gstreamer-plugins-bad-codecs.spec
Changed
@@ -4,10 +4,10 @@ %define _name gst-plugins-bad %define gst_branch 1.0 -%define _version 1.20.0 +%define _version 1.22.0 Name: gstreamer-plugins-bad-codecs -Version: 1.20.5 +Version: 1.22.0 Release: 0 Summary: Codecs/plugins for gstreamer-plugins-bad License: LGPL-2.1-or-later
View file
gst-plugins-bad-1.20.5.tar.xz/docs/random/ChangeLog-0.8
Deleted
@@ -1,17760 +0,0 @@ -2005-09-02 Flavio Oliveira <flavio.oliveira@indt.org.br> - - * configure.ac: - * ext/Makefile.am: - * ext/gsm/Makefile.am: - * ext/gsm/gstgsm.c: - * ext/gsm/gstgsmenc.c: Ported GSM Encoder to GStreamer 0.9. - * PORTED_09: - -2005-08-31 Flavio Oliveira <flavio.oliveira@indt.org.br> - - * configure.ac: - * ext/Makefile.am: - * ext/faac/Makefile.am: - * ext/faac/gstfaac.c: Ported to GStreamer 0.9. - -2005-08-31 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - * ext/Makefile.am: - * ext/mad/Makefile.am: - * ext/mad/gstid3tag.c: - * ext/mad/gstmad.c: - * ext/mad/gstmad.h: - * gst/mpegaudio/.cvsignore: - * gst/mpegaudio/Makefile.am: - * gst/mpegaudio/README.crh: - * gst/mpegaudio/common.c: - * gst/mpegaudio/common.h: - * gst/mpegaudio/encode.c: - * gst/mpegaudio/encoder.h: - * gst/mpegaudio/fixes.txt: - * gst/mpegaudio/gstmpegaudio.c: - * gst/mpegaudio/gstmpegaudio.h: - * gst/mpegaudio/mpegaudio.vcproj: - * gst/mpegaudio/musicin.c: - * gst/mpegaudio/musicin.h: - * gst/mpegaudio/psy.c: - * gst/mpegaudio/putbits.c: - * gst/mpegaudio/putbits.h: - * gst/mpegaudio/readme.txt: - * gst/mpegaudio/release.txt: - * gst/mpegaudio/subs.c: - * gst/mpegaudio/table_absthr.h: - * gst/mpegaudio/table_alloc.h: - * gst/mpegaudio/table_cb.h: - * gst/mpegaudio/table_enwindow.h: - * gst/mpegaudio/table_th.h: - * gst/mpegaudio/tables.c: - * gst/mpegaudio/tonal.c: - * po/af.po: - * po/az.po: - * po/cs.po: - * po/en_GB.po: - * po/hu.po: - * po/it.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - * sys/Makefile.am: - - all these plugins are moved to gst-plugins-ugly - -2005-08-31 Michael Smith <msmith@fluendo.com> - - * configure.ac: - * gst/dvdlpcmdec/Makefile.am: - * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcm_reset), - (gst_dvdlpcmdec_init), (gst_dvdlpcmdec_link), (update_timestamps), - (gst_dvdlpcmdec_chain): - * gst/dvdlpcmdec/gstdvdlpcmdec.h: - Port LPCM decoder to 0.9 - -2005-08-30 Jan Schmidt <thaytan@mad.scientist.com> - - * configure.ac: - Remove plugins that should have disappeared. - -2005-08-30 Jan Schmidt <thaytan@mad.scientist.com> - - * autogen.sh: - * configure.ac: - Make autogen work again. - -2005-08-30 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - * ext/Makefile.am: - * ext/aalib/Makefile.am: - * ext/aalib/gstaasink.c: - * ext/aalib/gstaasink.h: - * ext/cairo/Makefile.am: - * ext/cairo/gstcairo.c: - * ext/cairo/gsttextoverlay.c: - * ext/cairo/gsttextoverlay.h: - * ext/cairo/gsttimeoverlay.c: - * ext/cairo/gsttimeoverlay.h: - * ext/dv/Makefile.am: - * ext/dv/NOTES: - * ext/dv/demo-play.c: - * ext/dv/gstdv.c: - * ext/dv/gstdvdec.c: - * ext/dv/gstdvdec.h: - * ext/dv/gstdvdemux.c: - * ext/dv/gstdvdemux.h: - * ext/esd/Makefile.am: - * ext/esd/README: - * ext/esd/esdmon.c: - * ext/esd/esdmon.h: - * ext/esd/esdsink.c: - * ext/esd/esdsink.h: - * ext/esd/gstesd.c: - * ext/flac/Makefile.am: - * ext/flac/flac_compat.h: - * ext/flac/gstflac.c: - * ext/flac/gstflacdec.c: - * ext/flac/gstflacdec.h: - * ext/flac/gstflacenc.c: - * ext/flac/gstflacenc.h: - * ext/flac/gstflactag.c: - * ext/flac/gstflactag.h: - * ext/gconf/Makefile.am: - * ext/gconf/gconf.c: - * ext/gconf/gconf.h: - * ext/gconf/gstgconfaudiosink.c: - * ext/gconf/gstgconfaudiosink.h: - * ext/gconf/gstgconfelements.c: - * ext/gconf/gstgconfelements.h: - * ext/gconf/gstgconfvideosink.c: - * ext/gconf/gstgconfvideosink.h: - * ext/gdk_pixbuf/Makefile.am: - * ext/gdk_pixbuf/gst_loader.c: - * ext/gdk_pixbuf/gstgdkanimation.c: - * ext/gdk_pixbuf/gstgdkanimation.h: - * ext/gdk_pixbuf/gstgdkpixbuf.c: - * ext/gdk_pixbuf/gstgdkpixbuf.h: - * ext/gdk_pixbuf/pixbufscale.c: - * ext/gdk_pixbuf/pixbufscale.h: - * ext/jpeg/Makefile.am: - * ext/jpeg/README: - * ext/jpeg/gstjpeg.c: - * ext/jpeg/gstjpegdec.c: - * ext/jpeg/gstjpegdec.h: - * ext/jpeg/gstjpegenc.c: - * ext/jpeg/gstjpegenc.h: - * ext/jpeg/gstsmokedec.c: - * ext/jpeg/gstsmokedec.h: - * ext/jpeg/gstsmokeenc.c: - * ext/jpeg/gstsmokeenc.h: - * ext/jpeg/smokecodec.c: - * ext/jpeg/smokecodec.h: - * ext/jpeg/smokeformat.h: - * ext/ladspa/Makefile.am: - * ext/ladspa/gstladspa.c: - * ext/ladspa/gstladspa.h: - * ext/ladspa/gstsignalprocessor.c: - * ext/ladspa/gstsignalprocessor.h: - * ext/ladspa/load.c: - * ext/ladspa/search.c: - * ext/ladspa/utils.h: - * ext/libcaca/Makefile.am: - * ext/libcaca/gstcacasink.c: - * ext/libcaca/gstcacasink.h: - * ext/libmng/Makefile.am: - * ext/libmng/gstmng.c: - * ext/libmng/gstmng.h: - * ext/libmng/gstmngdec.c: - * ext/libmng/gstmngdec.h: - * ext/libmng/gstmngenc.c: - * ext/libmng/gstmngenc.h: - * ext/libpng/Makefile.am: - * ext/libpng/gstpng.c: - * ext/libpng/gstpng.h: - * ext/libpng/gstpngdec.c: - * ext/libpng/gstpngdec.h: - * ext/libpng/gstpngenc.c: - * ext/libpng/gstpngenc.h: - * ext/mikmod/Makefile.am: - * ext/mikmod/README: - * ext/mikmod/drv_gst.c: - * ext/mikmod/gstmikmod.c: - * ext/mikmod/gstmikmod.h: - * ext/mikmod/mikmod_reader.c: - * ext/mikmod/mikmod_types.c: - * ext/mikmod/mikmod_types.h: - * ext/pango/Makefile.am: - * ext/pango/gsttextoverlay.c: - * ext/pango/gsttextoverlay.h: - * ext/pango/gsttimeoverlay.c: - * ext/pango/gsttimeoverlay.h: - * ext/raw1394/Makefile.am: - * ext/raw1394/gst1394.c: - * ext/raw1394/gstdv1394src.c: - * ext/raw1394/gstdv1394src.h: - * ext/shout2/Makefile.am: - * ext/shout2/gstshout2.c: - * ext/shout2/gstshout2.h: - * ext/speex/Makefile.am: - * ext/speex/gstspeex.c: - * ext/speex/gstspeexdec.c: - * ext/speex/gstspeexdec.h: - * ext/speex/gstspeexenc.c: - * ext/speex/gstspeexenc.h: - * gst/avi/.cvsignore: - * gst/avi/Makefile.am: - * gst/avi/README: - * gst/avi/avi-ids.h: - * gst/avi/avi.vcproj: - * gst/avi/gstavi.c: - * gst/avi/gstavidemux.c: - * gst/avi/gstavidemux.h: - * gst/avi/gstavimux.c: - * gst/avi/gstavimux.h: - * gst/level/gstlevel.c: (gst_level_transform): - * sys/Makefile.am: - * sys/oss/.cvsignore: - * sys/oss/Makefile.am: - * sys/oss/gst-i18n-plugin.h: - * sys/oss/gstossaudio.c: - * sys/oss/gstossdmabuffer.c: - * sys/oss/gstossdmabuffer.h: - * sys/oss/gstosshelper.c: - * sys/oss/gstosshelper.h: - * sys/oss/gstossmixer.c: - * sys/oss/gstossmixer.h: - * sys/oss/gstossmixerelement.c: - * sys/oss/gstossmixerelement.h: - * sys/oss/gstossmixertrack.c: - * sys/oss/gstossmixertrack.h: - * sys/oss/gstosssink.c: - * sys/oss/gstosssink.h: - * sys/oss/gstosssrc.c: - * sys/oss/gstosssrc.h: - * sys/oss/oss_probe.c: - * sys/osxaudio/Makefile.am: - * sys/osxaudio/gstosxaudio.c: - * sys/osxaudio/gstosxaudioelement.c: - * sys/osxaudio/gstosxaudioelement.h: - * sys/osxaudio/gstosxaudiosink.c: - * sys/osxaudio/gstosxaudiosink.h: - * sys/osxaudio/gstosxaudiosrc.c: - * sys/osxaudio/gstosxaudiosrc.h: - * sys/osxvideo/Makefile.am: - * sys/osxvideo/cocoawindow.h: - * sys/osxvideo/cocoawindow.m: - * sys/osxvideo/osxvideosink.h: - * sys/osxvideo/osxvideosink.m: - all these plugins are moved to gst-plugins-good - -2005-08-28 Flavio Oliveira <flavio.oliveira@indt.org.br> - - * gst/wavenc/gstwavenc.c: Ported to GStreamer 0.9. - Need to fix performance issues. - -2005-08-28 Andy Wingo <wingo@pobox.com> - - * Updates for two-arg init from GST_BOILERPLATE. - - * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_init): Use - the second arg for the class, because G_OBJECT_GET_CLASS (self) - returns the wrong thing. - (gst_signal_processor_add_pad_from_template): Make pads of the - right type. - - * ext/ladspa/gstladspa.c (gst_ladspa_class_get_param_spec): Make - writable param specs G_PARAM_CONSTRUCT so default values work. - (gst_ladspa_init): Use the second arg for the class. - -2005-08-26 Andy Wingo <wingo@pobox.com> - - * ext/ladspa/gstladspa.c: - * ext/ladspa/gstladspa.h: Finish porting, still doesn't work but - it does compile and register. I have more features than you. - - * ext/ladspa/gstsignalprocessor.h: - * ext/ladspa/gstsignalprocessor.c: Updates, bug fixen. - -2005-08-26 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/effectv/gstquark.c: (gst_quarktv_init), - (gst_quarktv_change_state): - do proper cleanup/creation, fixes state changes - -2005-08-25 Jan Schmidt <thaytan@mad.scientist.com> - - * gst/level/gstlevel.c: (gst_level_message_new): - Revert unpopular change for GST_MESSAGE_SRC to GObject. - -2005-08-25 Andy Wingo <wingo@pobox.com> - - * ext/ladspa/gstladspa.h: - * ext/ladspa/gstladspa.c: Halfway-ported. Doesn't compile yet. - - * ext/ladspa/gstsignalprocessor.h: - * ext/ladspa/gstsignalprocessor.c: New files, the start of a base - class for DSP elements. - - * configure.ac: Sort the external libs checks, add a ladspa check, - output the ladspa makefile. - -2005-08-25 Owen Fraser-Green <owen@discobabe.net> - - * gst/realmedia/rmdemux.c (gst_rmdemux_loop, gst_rmdemux_chain): - Fixed EOS. - (gst_rmdemux_parse_indx_data, gst_rmdemux_parse_indx): Handle - malformed index headers where the packet size is incorrect. - -2005-08-24 Andy Wingo <wingo@pobox.com> - - * ext/dv/gstdvdemux.c (gst_dvdemux_demux_frame): Send out valid - segment end timestamps. - -2005-08-24 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - * ext/Makefile.am: - lame and mpegaudioparse seem to work - * gst/videobox/gstvideobox.c: (gst_video_box_class_init), - (gst_video_box_transform_caps), (gst_video_box_get_unit_size): - update for basetransform changes - -2005-08-24 Jan Schmidt <thaytan@mad.scientist.com> - * gst/level/gstlevel.c: (gst_level_message_new): - GST_MESSAGE_SRC became a GObject - -2005-08-23 Stefan Kost <ensonic@users.sf.net> - - * ext/speex/gstspeexenc.h: - Fixed include path of adapter - -2005-08-23 Wim Taymans <wim@fluendo.com> - - * ext/speex/gstspeexdec.c: (gst_speex_dec_class_init): - * ext/speex/gstspeexenc.c: (gst_speexenc_class_init): - Fix property warning. - -2005-08-23 Wim Taymans <wim@fluendo.com> - - * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), - (gst_rtpamrdec_sink_setcaps), (gst_rtpamrdec_chain): - * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), - (gst_rtpamrenc_init), (gst_rtpamrenc_chain): - * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), - (gst_rtph263penc_flush), (gst_rtph263penc_chain): - Small updates, RFC reference to payload encoders. - -2005-08-23 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * ext/Makefile.am: - * ext/speex/Makefile.am: - * ext/speex/gstspeex.c: (plugin_init): - * ext/speex/gstspeexdec.c: (speex_get_query_types), - (gst_speex_dec_init), (speex_dec_src_query), (speex_dec_src_event), - (speex_dec_event), (speex_dec_chain): - Port speexdec. Leads to some unfamiliar warnings on console, - but works otherwise. - -2005-08-23 Andy Wingo <wingo@pobox.com> - - * sys/oss/gstosssrc.c (gst_oss_src_open): Set the device-name - property after opening the mixer. - - * sys/oss/gstosssrc.c: - * sys/oss/gstosssrc.h: Easy to implement a mixer, eh... - - * sys/oss/gstossmixerelement.h: - * sys/oss/gstossmixerelement.c: Added mixer element like - alsamixer. - - * sys/oss/Makefile.am: - * sys/oss/gstossaudio.c: Register the ossmixer element. - - * sys/oss/gstossmixer.h: - * sys/oss/gstossmixer.c: Refactored to be more like alsamixer. - - * sys/oss/gstossmixertrack.h: - * sys/oss/gstossmixertrack.c: Split out from gstossmixer.ch, - like gstalsamixer. - - * sys/oss/gstosssrc.c: - * sys/oss/gstosssink.c: Where before we used a gstosselement - object as a helper library, now just call functions from - gstosshelper. - - * sys/oss/gstosshelper.h: - * sys/oss/gstosshelper.c: Made a real library. Removed - propertyprobe for now, should add it back later. - - * sys/oss/gstosselement.h: - * sys/oss/gstosselement.c: Removed, we don't have a shared base - class. - - * sys/oss/gstosshelper.c (gst_oss_helper_probe_caps): Search - higher-to-lower, makes 16 bit appear earlier in the caps, which - makes it preferred. - - * sys/oss/gstosssrc.h: - * sys/oss/gstosssrc.c: Totally ported, dude. - - * sys/oss/Makefile.am: - * sys/oss/gstossaudio.c: Add osssrc. - - * sys/oss/gstosssink.c: We do native byte order. - -2005-08-23 Owen Fraser-Green <owen@discobabe.net> - - * gst/realmedia/rmdemux.c (gst_rmdemux_src_event): Fixed bug - causing events to be passed wrong way. - (gst_rmdemux_parse_packet): Avoid accidentally skipping audio. - -2005-08-22 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/mad/gstid3tag.c: (gst_id3_tag_init), - (gst_id3_tag_sink_event), (gst_id3_tag_do_caps_nego), - (gst_id3_tag_chain), (gst_id3_tag_change_state), (plugin_init): - Works a bit better now, but still needs a rewrite to use - get_range instead of this seeking nastiness. - -2005-08-22 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * ext/Makefile.am: - * ext/flac/Makefile.am: - * ext/flac/gstflac.c: (plugin_init): - * ext/flac/gstflacdec.c: (flacdec_get_type), (gst_flacdec_init), - (gst_flacdec_update_metadata), (gst_flacdec_seek), - (gst_flacdec_tell), (gst_flacdec_length), (gst_flacdec_read), - (gst_flacdec_write), (gst_flacdec_loop), - (gst_flacdec_get_src_query_types), (gst_flacdec_src_query), - (gst_flacdec_src_event), (gst_flacdec_sink_activate), - (gst_flacdec_sink_activate_pull), (gst_flacdec_change_state): - * ext/flac/gstflacdec.h: - Port flacdec (seeking is still slow'ish). - -2005-08-22 Owen Fraser-Green <owen@discobabe.net> - - * gst/realmedia/rmdemux.c: - (gst_rmdemux_perform_seek, gst_rmdemux_parse_packet): - Seeking improvements. - -2005-08-19 Wim Taymans <wim@fluendo.com> - - * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_class_init): - Remove get_time code that is both wrong and unneeded. - -2005-08-19 Wim Taymans <wim@fluendo.com> - - * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), - (gst_rtph263penc_flush), (gst_rtph263penc_chain), - (gst_rtph263penc_set_property), (gst_rtph263penc_get_property): - * gst/rtp/gstrtph263penc.h: - Added configurable pt and ssrc, to be merged in the caps or - a base class... - -2005-08-19 Wim Taymans <wim@fluendo.com> - - * gst/rtp/gstrtph263pdec.c: (gst_rtph263pdec_init), - (gst_rtph263pdec_chain): - * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_class_init), - (gst_rtph263penc_flush), (gst_rtph263penc_chain): - Some cleanups in the h263p (de)payloaders. - -2005-08-19 Wim Taymans <wim@fluendo.com> - - * ext/amrnb/amrnbdec.c: - * ext/amrnb/amrnbenc.c: (gst_amrnbenc_setcaps): - * ext/amrnb/amrnbparse.c: - Update caps with audio/AMR. - - * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), - (gst_rtpamrdec_sink_setcaps), (gst_rtpamrdec_chain), - (gst_rtpamrdec_change_state): - * gst/rtp/gstrtpamrdec.h: - * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), - (gst_rtpamrenc_init), (gst_rtpamrenc_chain): - Dont set FT headers twice, it was already in the encoded - bitstream. - - * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), - (gst_rtspsrc_close), (gst_rtspsrc_play): - * gst/rtsp/rtspconnection.c: (parse_line): - Cleanups - - * gst/udp/gstudpsrc.c: (gst_udpsrc_class_init), - (gst_udpsrc_create), (gst_udpsrc_set_property), - (gst_udpsrc_get_property): - * gst/udp/gstudpsrc.h: - Added caps property, we need this soon to type the buffers. - -2005-08-18 Wim Taymans <wim@fluendo.com> - - * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_init), - (gst_rtpamrdec_chain): - Fix up amr depayloader a bit. - - * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), - (gst_rtspsrc_close), (gst_rtspsrc_play): - Look for options result in Public and Allow header fields.. - spec says Allow but some servers return Public... - -2005-08-18 Wim Taymans <wim@fluendo.com> - - * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_class_init), - (gst_rtpamrenc_init), (gst_rtpamrenc_chain), - (gst_rtpamrenc_set_property), (gst_rtpamrenc_get_property): - * gst/rtp/gstrtpamrenc.h: - Added payload_type and ssrc properties to the payloader. - - * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), - (gst_rtspsrc_close), (gst_rtspsrc_play): - Options need to be stripped and are in the Public header field. - - * gst/rtsp/rtspurl.c: (rtsp_url_parse): - Fix url / parsing... - - -2005-08-18 Wim Taymans <wim@fluendo.com> - - * gst/rtp/Makefile.am: - * gst/rtp/gstrtp.c: (plugin_init): - * gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_get_type), - (gst_rtpamrdec_base_init), (gst_rtpamrdec_class_init), - (gst_rtpamrdec_init), (gst_rtpamrdec_chain), - (gst_rtpamrdec_set_property), (gst_rtpamrdec_get_property), - (gst_rtpamrdec_change_state), (gst_rtpamrdec_plugin_init): - * gst/rtp/gstrtpamrdec.h: - * gst/rtp/gstrtpamrenc.c: (gst_rtpamrenc_get_type), - (gst_rtpamrenc_base_init), (gst_rtpamrenc_class_init), - (gst_rtpamrenc_init), (gst_rtpamrenc_chain), - (gst_rtpamrenc_set_property), (gst_rtpamrenc_get_property), - (gst_rtpamrenc_change_state), (gst_rtpamrenc_plugin_init): - * gst/rtp/gstrtpamrenc.h: - * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_class_init), - (gst_rtpmpaenc_flush), (gst_rtpmpaenc_chain): - Added very simplistic amr payloader. depayloader does not - work yet. - -2005-08-18 Wim Taymans <wim@fluendo.com> - - * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send), (gst_rtspsrc_open), - (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), - (gst_rtspsrc_change_state): - * gst/rtsp/gstrtspsrc.h: - * gst/rtsp/rtspdefs.c: (rtsp_method_as_text), (rtsp_find_method): - * gst/rtsp/rtspdefs.h: - * gst/rtsp/rtsptransport.c: (rtsp_transport_parse): - Handle RTSP defaults better. - Issue OPTIONS request to figure out what we are allowed to do. - Make the methods a bitfield so we can easily collect supported - options. - Fix rtsp_find_method. - Do proper RTSP connection shutdown. - -2005-08-18 Wim Taymans <wim@fluendo.com> - - * gst/rtp/Makefile.am: - * gst/rtp/gstrtp-common.h: - * gst/rtp/gstrtp.c: (plugin_init): - * gst/rtp/gstrtpL16enc.h: - * gst/rtp/gstrtpdec.c: (gst_rtpdec_get_type), - (gst_rtpdec_class_init), (gst_rtpdec_chain_rtp), - (gst_rtpdec_chain_rtcp), (gst_rtpdec_change_state), - (gst_rtpdec_plugin_init): - * gst/rtp/gstrtph263pdec.c: (gst_rtph263pdec_get_type), - (gst_rtph263pdec_base_init), (gst_rtph263pdec_class_init), - (gst_rtph263pdec_init), (gst_rtph263pdec_chain), - (gst_rtph263pdec_set_property), (gst_rtph263pdec_get_property), - (gst_rtph263pdec_change_state), (gst_rtph263pdec_plugin_init): - * gst/rtp/gstrtph263pdec.h: - * gst/rtp/gstrtph263penc.c: (gst_rtph263penc_get_type), - (gst_rtph263penc_base_init), (gst_rtph263penc_class_init), - (gst_rtph263penc_init), (gst_rtph263penc_flush), - (gst_rtph263penc_chain), (gst_rtph263penc_set_property), - (gst_rtph263penc_get_property), (gst_rtph263penc_change_state), - (gst_rtph263penc_plugin_init): - * gst/rtp/gstrtph263penc.h: - * gst/rtp/gstrtpmpadec.c: (gst_rtpmpadec_get_type), - (gst_rtpmpadec_base_init), (gst_rtpmpadec_class_init), - (gst_rtpmpadec_init), (gst_rtpmpadec_chain), - (gst_rtpmpadec_set_property), (gst_rtpmpadec_get_property), - (gst_rtpmpadec_change_state), (gst_rtpmpadec_plugin_init): - * gst/rtp/gstrtpmpadec.h: - * gst/rtp/gstrtpmpaenc.c: (gst_rtpmpaenc_get_type), - (gst_rtpmpaenc_base_init), (gst_rtpmpaenc_class_init), - (gst_rtpmpaenc_init), (gst_rtpmpaenc_flush), (gst_rtpmpaenc_chain), - (gst_rtpmpaenc_set_property), (gst_rtpmpaenc_get_property), - (gst_rtpmpaenc_change_state), (gst_rtpmpaenc_plugin_init): - * gst/rtp/gstrtpmpaenc.h: - * gst/rtp/rtp-packet.c: - * gst/rtp/rtp-packet.h: - Remove old code that is now in gst-libs/gst/rtp/. - Added some payload/depayloaders. - - * gst/udp/gstudpsink.c: (gst_udpsink_class_init): - Fix port number range. - -2005-08-17 Wim Taymans <wim@fluendo.com> - - * configure.ac: - Added mpegaudioparse - - * ext/lame/gstlame.c: (gst_lame_src_getcaps), - (gst_lame_src_setcaps), (gst_lame_sink_setcaps), - (gst_lame_sink_event), (gst_lame_chain): - Some cleanups. - Fix memleak. - - * gst/mpegaudioparse/gstmpegaudioparse.c: - (gst_mp3parse_class_init), (gst_mp3parse_init), - (gst_mp3parse_chain), (gst_mp3parse_change_state): - * gst/mpegaudioparse/gstmpegaudioparse.h: - Ported mpegaudioparse - -2005-08-17 Wim Taymans <wim@fluendo.com> - - * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_open), (gst_rtspsrc_play): - Support absolute control urls too. - -2005-08-16 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), - (gst_avi_demux_stream_header): - * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), - (gst_qtdemux_add_stream), (qtdemux_parse_tree): - Uncomment metadata and codec-name handling. - -2005-08-16 Wim Taymans <wim@fluendo.com> - - * configure.ac: - * ext/amrnb/amrnbparse.c: (gst_amrnbparse_read_header): - Fix compile warning. - - * ext/lame/gstlame.c: (gst_lame_class_init), - (gst_lame_src_getcaps), (gst_lame_src_setcaps), - (gst_lame_sink_setcaps), (gst_lame_init), (gst_lame_sink_event), - (gst_lame_chain), (gst_lame_change_state): - * ext/lame/gstlame.h: - Port lame plugin - -2005-08-16 Andy Wingo <wingo@pobox.com> - - * ext/dv/gstdvdemux.c (gst_dvdemux_flush): Use gst_adapter_take so - we have our own copy of the data. - (gst_dvdemux_demux_video): Set the take() data as malloc_data so - it will get freed later. - - * ext/raw1394/gstdv1394src.c (gst_dv1394src_iso_receive): Note - license info in the source code -- was only in the commit log - before. - - * ext/dv/gstdvdec.h: - * ext/dv/gstdvdec.c: Only decodes systemstream=FALSE dv video -- - old pipelines using dvdec should probably have a dvdemux first. - - * ext/dv/gstdvdemux.h: - * ext/dv/gstdvdemux.c: Split out from dvdec, chunks the incoming - systemstream=TRUE data into frames, sets caps data, and spits out - PCM audio in addition to systemstream=FALSE video frames. Operates - in chain mode only for now; should make a getrange version as - well. - - * ext/dv/gstdv.c: New file, registers the libgstdv plugin. - - * ext/dv/Makefile.am: Library name changed to libgstdv. Split - dvdec into dvdemux and dvdec. - -2005-08-16 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/faad/gstfaad.c: (gst_faad_event), (gst_faad_chain): - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): - Handle _push() return values. - -2005-08-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/faad/gstfaad.c: (gst_faad_event): - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): - Fix debug. - -2005-08-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), - (qtdemux_video_caps): - Forwardport from 0.8 to implement RLE. - -2005-08-15 Wim Taymans <wim@fluendo.com> - - * gst/rtsp/README: - Added rtsp server implementation docs. - -2005-08-14 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/aalib/gstaasink.c: - aalib is LGPL, so this plugin can be LGPL - * ext/arts/gst_arts.c: (plugin_init): - rename, we don't like underscores - * ext/audiofile/gstaf.c: - * ext/sndfile/gstsf.c: - rename, we like a descriptive plugin name - * ext/gconf/gstgconfelements.c: - change description a little - * ext/musicbrainz/gsttrm.c: - musicbrainz is LGPL, so plugin can be LGPL - * ext/raw1394/gst1394.c: - rename, we like all-digit names - * gst/equalizer/gstiirequalizer.c: - * gst/fdsrc/gstfdsrc.c: - * gst/multifilesink/gstmultifilesink.c: - rename - * gst/virtualdub/gstvirtualdub.c: - use GST_PLUGIN_DEFINE - * sys/dxr3/dxr3init.c: - only uses system headers, and code is LGPL, so plugin is LGPL - -2005-08-13 Tim-Philipp Müller <tim at centricular dot net> - - * ext/mad/Makefile.am: - * gst/avi/Makefile.am: - * gst/effectv/Makefile.am: - * gst/udp/Makefile.am: - * gst/wavparse/Makefile.am: - Use -lgstfoo-@GST_MAJORMINOR@ instead of -lgstfoo-0.9 - -2005-08-12 Tim-Philipp Müller <tim at centricular dot net> - - * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_decode_indirect), - (gst_jpeg_dec_decode_direct), (gst_jpeg_dec_chain): - Fix decoding of pictures with certain uneven or unaligned - widths where jpeglib needs more horizontal padding than our - I420 buffers provide, resulting in blocky artifacts at the - left side of the picture (#164176). - Also make use of our shiny new GST_ROUND_N() macros. - -2005-08-11 Tim-Philipp Müller <tim at centricular dot net> - - * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), (gst_jpeg_dec_chain), - (gst_jpeg_dec_change_state): - * ext/jpeg/gstjpegdec.h: - Fix crashes/invalid memory access for pictures that have a height - that is not a multiple of 16 (or rather: v_samp_factor * DCTSIZE). - - Also fix the state change function for downwards state changes - (need to chain up to parent before destroying our resources, to - make sure pads get deactivated and our chain function isn't - running and using those very same resources in another thread). - - The jpeg line buffer only needs to be v_samp_factor*DCTSIZE lines - per plane, not picture_height lines; allocate that on the stack. - -2005-08-10 Tim-Philipp Müller <tim at centricular dot net> - - * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers), - (gst_wavparse_stream_data): - Add some fixes from 0.8 branch: allow 24/32bps songs and - blockalign samples to the header-specified size, if any - (#311070); error out on channels==0 or bitrate==0 - (#309043, #304588). - -2005-08-10 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/level/gstlevel.c: (gst_level_init), (gst_level_set_caps), - (gst_level_transform): - * gst/level/gstlevel.h: - remove unused MS struct member - don't reset the CS values for channels on every _chain, so that - level actually correctly calculates the RMS value. sigh. - calculate RMS values correctly for peak and decay peak sums; - before we were signalling them as if they already were amplitude - and not power values. sigh. - Remind me to not try and pretend I'm writing DSP code. - -2005-08-10 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/faad/gstfaad.c: (gst_faad_class_init), (gst_faad_setcaps): - Add debug category, remove Close() call that made it crash - whenever reusing, renegotiating or anything; Close() actually - free()s the handle and should only be called on READY->NULL. - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): - Actually set caps on buffer (in addition to pad), also. - -2005-08-10 Owen Fraser-Green <owen@discobabe.net> - - * gst/realmedia/rmdemux.c (gst_rmdemux_sink_activate) - (gst_rmdemux_sink_activate_push, gst_rmdemux_sink_activate_pull) - (gst_rmdemux_loop, gst_rmdemux_src_event) - (gst_rmdemux_perform_seek, gst_rmdemux_src_query): Implemented - push-pull and seeking. - -2005-08-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/faad/gstfaad.c: (gst_faad_event): - Sign/unsign mismatch. - * configure.ac: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_class_init), - (gst_qtdemux_init), (gst_qtdemux_get_src_query_types), - (gst_qtdemux_handle_src_query), (gst_qtdemux_handle_src_event), - (plugin_init), (gst_qtdemux_handle_sink_event), - (gst_qtdemux_change_state), (gst_qtdemux_loop_header), - (qtdemux_sink_activate), (qtdemux_sink_activate_pull), - (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_parse_tree), - (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): - * gst/qtdemux/qtdemux.h: - Half-assed port (hey, it works). - -2005-08-09 Tim-Philipp Müller <tim at centricular dot net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header): - Fix AVI header parsing: add missing break statement after - GST_RIFF_INFO_LIST parsing code; gst_riff_read_chunk() has - already advanced the avi->offset, no need to do it twice - (fixes MovieOfMovies.avi). - -2005-08-09 Tim-Philipp Müller <tim at centricular dot net> - - * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), - (gst_jpeg_dec_setcaps), (gst_jpeg_dec_chain), - (gst_jpeg_dec_change_state): - * ext/jpeg/gstjpegdec.h: - Make mjpeg actually work and skip jpeg data parsing if we - know that the input is packetized (ie. each input buffer - is exactly one jpeg frame). - -2005-08-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_chain): - It'd be nice if I could listen to my mp3 files, so send out an - initial discont, as the sink apparently wants. - -2005-08-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event), - (gst_avi_demux_handle_seek): - Fix seeking (or, well, fix threading issue where a variable was - set before a lock was taken and was already unset before that - same lock was taken and was thus no longer in existance when it - actually had to be used). - -2005-08-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): - Mixing binary and logical operators is not going to work; fix - position-querying in Totem. - -2005-08-08 Tim-Philipp Müller <tim at centricular dot net> - - * ext/faad/gstfaad.c: (gst_faad_base_init), (gst_faad_class_init), - (gst_faad_init), (gst_faad_setcaps), (gst_faad_srcgetcaps), - (gst_faad_event), (gst_faad_update_caps), (gst_faad_chain), - (gst_faad_change_state): - * ext/faad/gstfaad.h: - Fix negotiation (#310932) and miscellaneous other stuff. Probably - still needs some more work. - -2005-08-08 Tim-Philipp Müller <tim at centricular dot net> - - * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_init), - (gst_jpeg_dec_setcaps), (gst_jpeg_dec_chain): - Add setcaps() function (for mjpeg). - -2005-08-08 Andy Wingo <wingo@pobox.com> - - * ext/esd/esdsink.c (gst_esdsink_getcaps): Seems that wierd - va_list caps setting function was borked. Fixed esdsink. - - * sys/oss/gstosssink.c (gst_oss_sink_open, gst_oss_sink_close) - (gst_oss_sink_prepare, gst_oss_sink_unprepare): Update for newer - audiosink api. - - * ext/raw1394/gstdv1394src.c (gst_dv1394src_get_property) - (gst_dv1394src_set_property): Style. All about the style. - - * ext/esd/esdsink.c (gst_esdsink_getcaps): Return specific caps - only if in READY or higher (i.e., if _open() has been called.) - (gst_esdsink_open, gst_esdsink_close, gst_esdsink_prepare) - (gst_esdsink_unprepare): Update for audiosink changes. - (gst_esdsink_change_state): Die! - -2005-08-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/jpeg/Makefile.am: - Fix compile. - -2005-08-08 Tim-Philipp Müller <tim at centricular dot net> - - * configure.ac: - * ext/Makefile.am: - * ext/jpeg/Makefile.am: - * ext/jpeg/gstjpeg.c: (plugin_init): - * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_get_type), - (gst_jpeg_dec_finalize), (gst_jpeg_dec_base_init), - (gst_jpeg_dec_class_init), (gst_jpeg_dec_fill_input_buffer), - (gst_jpeg_dec_init_source), (gst_jpeg_dec_skip_input_data), - (gst_jpeg_dec_resync_to_restart), (gst_jpeg_dec_term_source), - (gst_jpeg_dec_my_output_message), (gst_jpeg_dec_my_emit_message), - (gst_jpeg_dec_my_error_exit), (gst_jpeg_dec_init), - (is_jpeg_start_marker), (is_jpeg_end_marker), - (gst_jpeg_dec_find_jpeg_header), (gst_jpeg_dec_ensure_header), - (gst_jpeg_dec_have_end_marker), - (gst_jpeg_dec_parse_tag_has_entropy_segment), - (gst_jpeg_dec_parse_image_data), (gst_jpeg_dec_chain), - (gst_jpeg_dec_change_state): - * ext/jpeg/gstjpegdec.h: - Port jpegdec to 0.9; handles 'progressive loading' now, ie. input does - no longer need to be one single buffer. - -2005-08-04 Andy Wingo <wingo@pobox.com> - - * sys/oss/gstossaudio.c (plugin_init): Second-class citizen. - - * gst/videobox/gstvideobox.c (gst_video_box_get_size): Update for - API changes. - - * configure.ac (DEFAULT_AUDIOSINK, DEFAULT_VIDEOSINK): Set to - autoaudiosink and autovideosink. - -2005-08-04 Edward Hervey <edward@fluendo.com> - - * gst/avi/gstavidemux.c: (gst_avi_demux_reset), - (gst_avi_demux_parse_stream), (gst_avi_demux_process_next_entry): - You need to allocatate (len+1) characters to store a len size string. - Also don't stop the processing task if the output pad is not linked. - -2005-08-03 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_reset), - (gst_gconf_audio_sink_init), (do_toggle_element), - (cb_toggle_element), (gst_gconf_audio_sink_change_state): - * ext/gconf/gstgconfaudiosink.h: - * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset), - (gst_gconf_video_sink_init), (do_toggle_element), - (cb_toggle_element), (gst_gconf_video_sink_change_state): - * ext/gconf/gstgconfvideosink.h: - * gst/autodetect/gstautoaudiosink.c: (gst_auto_audio_sink_reset), - (gst_auto_audio_sink_init), (gst_auto_audio_sink_detect), - (gst_auto_audio_sink_change_state): - * gst/autodetect/gstautoaudiosink.h: - * gst/autodetect/gstautovideosink.c: (gst_auto_video_sink_reset), - (gst_auto_video_sink_init), (gst_auto_video_sink_detect), - (gst_auto_video_sink_change_state): - * gst/autodetect/gstautovideosink.h: - Use new ghostpad API; now they actually work in Totem, also. - -2005-08-03 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/libpng/Makefile.am: - Fix uninstalled build. - -2005-08-02 Edward Hervey <edward@fluendo.com> - - * configure.ac: - * ext/Makefile.am: - * ext/libpng/Makefile.am: - * ext/libpng/gstpng.c: - * ext/libpng/gstpngenc.c: - Ported pngenc , still have to port pngdec... - -2005-08-01 Stefan Kost <ensonic@users.sf.net> - - reviewed by: <delete if not using a buddy> - - * configure.ac: - * ext/ladspa/Makefile.am: - * ext/ladspa/gstladspa.c: (gst_ladspa_init), (gst_ladspa_loop), - (gst_ladspa_chain), (gst_ladspa_get), (plugin_init): - * ext/ladspa/gstladspa.h: - deactivate and remove dparams (libgstcontrol) - -2005-07-27 Wim Taymans <wim@fluendo.com> - - * ext/faad/gstfaad.c: (gst_faad_event): - Compile fixes. - -2005-07-27 Wim Taymans <wim@fluendo.com> - - * ext/amrnb/amrnbparse.c: (gst_amrnbparse_event), - (gst_amrnbparse_loop): - * ext/dv/gstdvdec.c: (gst_dvdec_handle_sink_event), - (gst_dvdec_handle_src_event), (gst_dvdec_decode_frame): - * ext/mad/gstid3tag.c: (gst_id3_tag_src_event), - (gst_id3_tag_sink_event), (gst_id3_tag_chain): - * ext/mad/gstmad.c: (gst_mad_src_query), (index_seek), - (normal_seek), (gst_mad_sink_event), (gst_mad_chain): - * ext/mpeg2dec/gstmpeg2dec.c: - * ext/shout2/gstshout2.c: (gst_shout2send_event): - * ext/sidplay/gstsiddec.cc: - * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event), - (gst_avi_demux_send_event), (gst_avi_demux_stream_header), - (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry): - * gst/goom/gstgoom.c: (gst_goom_event): - * gst/realmedia/rmdemux.c: (gst_rmdemux_sink_event), - (gst_rmdemux_chain), (gst_rmdemux_send_event), - (gst_rmdemux_add_stream): - * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek), - (gst_wavparse_stream_headers), (gst_wavparse_stream_data), - (gst_wavparse_loop), (gst_wavparse_srcpad_event): - Various event updates and cleanups. - -2005-07-25 Christian Schaller <uraeus@gnome.org> - - - * gst-plugins.spec.in: add silence and videoflip - * gst/videofilter/Makefile.am: add missing header to noinst - -2005-07-25 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/videofilter/Makefile.am: - * gst/videofilter/gstgamma.c: (gst_gamma_setup): - * gst/videofilter/gstvideobalance.c: (gst_videobalance_setup): - * gst/videofilter/gstvideofilter.c: (gst_videofilter_class_init), - (gst_videofilter_getcaps), (gst_videofilter_setcaps), - (gst_videofilter_init), (gst_videofilter_chain), - (gst_videofilter_set_property), (gst_videofilter_get_property), - (gst_videofilter_setup), (gst_videofilter_class_add_pad_templates): - * gst/videofilter/gstvideofilter.h: - * gst/videofilter/gstvideoflip.c: (gst_videoflip_init), - (gst_videoflip_set_property), (gst_videoflip_get_property), - (plugin_init), (gst_videoflip_setup), (gst_videoflip_planar411): - forward port from 0.9 and enable videoflip now that it works - -2005-07-23 Edward Hervey <edward@fluendo.com> - - * configure.ac: - * gst/silence/Makefile.am: - * gst/silence/gstsilence.h: - * gst/silence/gstsilence.c: - Ported silence to 0.9 using GstBaseSrc ... 180 lines :) - -2005-07-22 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/mad/gstmad.c: (gst_mad_src_event): - First try forwarding events, makes seeking in AVI files with mp3 - audio work again. - -2005-07-20 Andy Wingo <wingo@pobox.com> - - * ext/mpeg2dec/gstmpeg2dec.c (gst_mpeg2dec_sink_event): Signedness - fix. - -2005-07-20 Edward Hervey <edward@fluendo.com> - - * configure.ac: - * gst/wavparse/gstwavparse.c: - * gst/wavparse/gstwavparse.h: - * gst/wavparse/Makefile.am: - Ported wavparse to 0.9 . Playing, seeking and state changes work. - Could need more loving on the headers though. - -2005-07-20 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * ext/Makefile.am: - * ext/gconf/Makefile.am: - * ext/gconf/gconf.c: (gst_bin_find_unconnected_pad), - (gst_gconf_render_bin_from_description), - (gst_gconf_get_default_video_sink): - * ext/gconf/gstgconfaudiosink.c: (gst_gconf_audio_sink_base_init), - (gst_gconf_audio_sink_class_init), (gst_gconf_audio_sink_dispose), - (cb_toggle_element), (gst_gconf_audio_sink_change_state): - * ext/gconf/gstgconfelements.h: - * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_base_init), - (gst_gconf_video_sink_class_init), (gst_gconf_video_sink_dispose), - (cb_toggle_element), (gst_gconf_video_sink_change_state): - * gst/autodetect/gstautoaudiosink.c: - (gst_auto_audio_sink_base_init), (gst_auto_audio_sink_class_init), - (gst_auto_audio_sink_detect), (gst_auto_audio_sink_change_state): - * gst/autodetect/gstautovideosink.c: - (gst_auto_video_sink_base_init), (gst_auto_video_sink_class_init), - (gst_auto_video_sink_find_best), (gst_auto_video_sink_detect): - Port auto/gconfsinks to 0.9. They actually appear to work here in - Totem as well, making them actually useful. - -2005-07-20 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/faad/Makefile.am: - Fix uninstalled build. - -2005-07-19 Wim Taymans <wim@fluendo.com> - - * sys/oss/gstosssink.c: (gst_oss_sink_get_format), - (gst_oss_sink_open): - Parse spec to set correct oss values. - -2005-07-19 Edgard N. A. G. Lima <edgard.lima@indt.org.br> - - * configure.ac - * ext/Makefile.am - * ext/amrnb/amrnbdec.c - * ext/amrnb/amrnbenc.c - * ext/amrnb/amrnbparse.c - * ext/faad/gstfaad.c - * ext/mpeg2dec/gstmpeg2dec.c - Ported amrnb, faad, mpeg2dec to 0.9 - -2005-07-19 Andy Wingo <wingo@pobox.com> - - * ext/dv/gstdvdec.c (gst_dvdec_decode_video): Set the proper - framerate on the outbound buffer. - - * ext/dv/gstdvdec.c (gst_dvdec_decode_video): Don't clobber - alloc_buffer's return value. - (gst_dvdec_decode_frame): Handle unlinked pads with grace and - agility. - - * ext/dv/gstdvdec.h: Fix signedness error. - -2005-07-19 Wim Taymans <wim@fluendo.com> - - * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), - (gst_dvdec_sink_convert), (gst_dvdec_get_src_query_types), - (gst_dvdec_src_query), (gst_dvdec_get_sink_query_types), - (gst_dvdec_sink_query), (gst_dvdec_send_event), - (gst_dvdec_handle_sink_event), (gst_dvdec_handle_src_event), - (gst_dvdec_decode_audio), (gst_dvdec_decode_video), - (gst_dvdec_decode_frame), (gst_dvdec_flush), (gst_dvdec_chain): - * ext/dv/gstdvdec.h: - Implemented seeking in dvdec. - -2005-07-19 Andy Wingo <wingo@pobox.com> - - * ext/Makefile.am: Enable dvdev and raw1394src. - -2005-07-18 Andy Wingo <wingo@pobox.com> - - * configure.ac: Use AS_LIBTOOL_TAGS. Fix crap gettext commit - comment. - -2005-07-18 Wim Taymans <wim@fluendo.com> - - * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_add_element), - (gst_rtspsrc_play): - Fix for core changes. - -2005-07-18 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/mad/gstid3tag.c: (gst_id3_tag_sink_event): - When returning to NORMAL state after reading tags, - pass on the discont event. - -2005-07-18 Wim Taymans <wim@fluendo.com> - - * gst/realmedia/rmdemux.c: (gst_rmdemux_sink_event), - (gst_rmdemux_change_state), (gst_rmdemux_chain), - (gst_rmdemux_get_stream_by_id), (gst_rmdemux_send_event), - (gst_rmdemux_add_stream): - Send discont event before pushing first buffer. - -2005-07-17 Philippe Khalaf <burger@speedy.org> - - * gst/fdsrc/gstfdsrc.c: - Removed #include <gst_private.h> - -2005-07-16 Philippe Khalaf <burger@speedy.org> - - * gst/fdsrc/gstfdsrc.c: - * gst/fdsrc/gstfdsrc.h: - * gst/fdsrc/Makefile.am: - Moved fdsrc 0.9 port from gstreamer/gst/elements to here. - -2005-07-16 Wim Taymans <wim@fluendo.com> - - * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_sink_event), - (gst_mad_chain): - Add convert function for proper timestamp calculations. - - * gst/avi/gstavidemux.c: (gst_avi_demux_send_event), - (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), - (gst_avi_demux_process_next_entry), (gst_avi_demux_loop): - Send out initial discont. - -2005-07-15 Wim Taymans <wim@fluendo.com> - - * gst/level/gstlevel.c: (gst_level_transform): - * gst/videobox/gstvideobox.c: (gst_video_box_class_init), - (gst_video_box_get_size), (gst_video_box_transform): - Port to new base class. - -2005-07-14 Wim Taymans <wim@fluendo.com> - - * ext/raw1394/gstdv1394src.c: (gst_dv1394src_get_type), - (gst_dv1394src_class_init), (gst_dv1394src_init), - (gst_dv1394src_iso_receive), (gst_dv1394src_create), - (gst_dv1394src_change_state), (gst_dv1394src_query): - It's PUSH_SRC now. - -2005-07-14 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), - (gst_udpsrc_class_init): - more autistic cleanliness in functions/names/defines - - -2005-07-10 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/aalib/gstaasink.c: (gst_aasink_get_type), - (gst_aasink_class_init), (gst_aasink_init): - * ext/esd/esdsink.c: (gst_esdsink_get_type), - (gst_esdsink_class_init): - * ext/libcaca/gstcacasink.c: (gst_cacasink_get_type), - (gst_cacasink_class_init), (gst_cacasink_init): - * ext/shout2/gstshout2.c: (gst_shout2send_get_type), - (gst_shout2send_class_init), (gst_shout2send_init): - * gst/udp/gstdynudpsink.c: (gst_dynudpsink_get_type), - (gst_dynudpsink_class_init): - * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_type), - (gst_multiudpsink_class_init): - more macro splitting - -2005-07-08 Andy Wingo <wingo@pobox.com> - - * sys/oss/: Port from THREADED+wim's fixes. - - * gst/avi/Makefile.am (libgstavi_la_CFLAGS): No gettext hacks, the - defines come from config.h. - - * autogen.sh: Run autopoint, etc. - - * Makefile.am (DIST_SUBDIRS, SUBDIRS): Go into po/. - - * configure.ac: Add gettext stuff. - -2005-07-07 Wim Taymans <wim@fluendo.com> - - * gst/videobox/gstvideobox.c: (gst_video_box_init), - (gst_video_box_transform_caps), (gst_video_box_set_caps): - Logic was reversed. Needs some more fixes in the transform - function to include AYUV output. - Moved AYUV as prefered format. - -2005-07-07 Wim Taymans <wim@fluendo.com> - - * configure.ac: - * ext/dv/Makefile.am: - * ext/dv/gstdvdec.c: (gst_dvdec_class_init), (gst_dvdec_init), - (gst_dvdec_get_src_query_types), (gst_dvdec_src_query), - (gst_dvdec_handle_sink_event), (gst_dvdec_handle_src_event), - (gst_dvdec_video_getcaps), (gst_dvdec_video_setcaps), - (gst_dvdec_decode_audio), (gst_dvdec_decode_video), - (gst_dvdec_decode_frame), (gst_dvdec_chain), - (gst_dvdec_change_state), (gst_dvdec_set_property), - (gst_dvdec_get_property), (plugin_init): - * ext/dv/gstdvdec.h: - * ext/esd/esdsink.c: (gst_esdsink_class_init): - Ported DVdec to 0.9. - Parent of esdsink is GstAudioSink. - -2005-07-07 Wim Taymans <wim@fluendo.com> - - * configure.ac: - * ext/raw1394/Makefile.am: - * ext/raw1394/gstdv1394src.c: (gst_dv1394src_get_type), - (gst_dv1394src_class_init), (gst_dv1394src_init), - (gst_dv1394src_iso_receive), (gst_dv1394src_create), - (gst_dv1394src_change_state), (gst_dv1394src_convert), - (gst_dv1394src_get_query_types), (gst_dv1394src_query): - * ext/raw1394/gstdv1394src.h: - Ported the 1394 source to 0.9. - -2005-07-07 Wim Taymans <wim@fluendo.com> - - * ext/mad/gstid3tag.c: (gst_id3_tag_get_query_types): - * ext/mad/gstmad.c: (gst_mad_get_query_types), (gst_mad_src_query): - * gst/avi/gstavidemux.c: (gst_avi_demux_get_src_query_types): - Remove deprecated/unsed code. - -2005-07-06 Edward Hervey <edward@fluendo.com> - - * gst/udp/gstudpsrc.c: (gst_udpsrc_init): - GST_BASESRC --> GST_BASE_SRC - -2005-07-05 Andy Wingo <wingo@pobox.com> - - * gst/oneton: Removed (replaced by deinterleave). - - * gst/adder: - * gst/audioconvert: - * gst/audiorate: - * gst/audioscale: - * gst/ffmpegcolorspace: - * gst/playback: - * gst/sine: - * gst/subparse: - * gst/tags: - * gst/tcp: - * gst/videoscale: - * gst/volume: Removed dirs that are now in gst-plugins-base. - -2005-07-05 Edward Hervey <edward@fluendo.com> - - * configure.ac: (GST_PLUGINS_ALL): - videofilter must be compiled first, since other plugins depend ont it. - -2005-07-05 Andy Wingo <wingo@pobox.com> - - * Way, way, way too many files: - Remove crack comment from the 2000 era. - -2005-07-05 Andy Wingo <wingo@pobox.com> - - * gst/videobox/gstvideobox.c: Clean up, port to 0.9, use - BaseTransform. - - * gst/videobox/Makefile.am: Link to base libs, include - plugins-base cflags, dist the README. - - * configure.ac (GST_PLUGIN_ALL, AC_CONFIG_FILES): Add videobox to - the build. - -2005-07-04 Wim Taymans <wim@fluendo.com> - - * gst/realmedia/rmdemux.c: - I don't think that piece of changelog should go there. - -2005-07-04 Andy Wingo <wingo@pobox.com> - - * examples/level/: - * examples/level/Makefile.am: - * examples/level/README: - * examples/level/demo.c: - * examples/level/plot.c: Examples moved out of the source dir. Not - updated tho. - - * configure.ac: Add level to the build. - - * gst/level/Makefile.am: - * gst/level/gstlevel.h: - * gst/level/gstlevel.c: Cleaned up, ported to 0.9. - - * ext/aalib/gstaasink.c (gst_aasink_fixate): Update for newer - fixate prototype. - -2005-07-03 Owen Fraser-Green <owen@discobabe.net> - - * gst/realmedia/rmdemux.c (gst_rmdemux_add_stream), - (gst_rmdemux_src_getcaps), (gst_rmdemux_chain): - Added getcaps function no_more_pads call - -2005-07-01 Philippe Khalaf <burger@speedy.org> - * gst/udp/Makefile.am: - * gst/udp/gstudp.c: - * gst/udp/gstdynudpsink.c: (new) - * gst/udp/gstdynudpsink.h: (new) - Added new element (udpdynsink) that receives GstNetBuffers and sends the - udp packets to the source given in the buffer. It's used by rtpsession - element for now. - * gst/udp/gstudpsrc.c: - Fixed memory leak. - -2005-07-01 Jan Schmidt <thaytan@mad.scientist.com> - - * configure.ac: - * ext/mad/Makefile.am: - * sys/oss/Makefile.am: - Roll gstreamer-interfaces-0.9.pc into gstreamer-plugins-base-0.9.pc - -2005-07-01 Jan Schmidt <thaytan@mad.scientist.com> - * ext/libcaca/Makefile.am: - * ext/mad/Makefile.am: - * gst/effectv/Makefile.am: - * gst/udp/Makefile.am: - Replace GST_PLUGINS_LIBS_* with GST_PLUGINS_BASE_* - - * ext/mad/gstid3tag.c: (gst_id3_tag_src_query), - (gst_id3_tag_src_event), (gst_id3_tag_sink_event), - (gst_id3_tag_chain), (plugin_init): - * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_chain): - Signedness warning fix, use gst_pad_get_peer instead of GST_PAD_PEER - in querying and event handling, because we're not holding the pad - lock and the peer may disappear. - * gst/avi/gstavidemux.c: (gst_avi_demux_parse_subindex), - (gst_avi_demux_parse_index), (gst_avi_demux_massage_index): - Signedness warning fixes. - - * gst/videofilter/gstvideotemplate.c: (plugin_init): - Remove gst_library_load - -2005-06-30 Edward Hervey <edward@fluendo.com> - - * gst/avi/Makefile.am: (libgstavi_la_LIBADD): - Added linking to libgstriff-0.9 - - * ext/mad/gstmad.c: (gst_mad_src_query): - check the format of the upstream query and return query if it's the - same format as the requested one. - -2005-06-30 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): - Compiler pains. - -2005-06-30 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * gst/avi/Makefile.am: - * gst/avi/gstavi.c: (plugin_init): - * gst/avi/gstavidemux.c: (gst_avi_demux_get_type), - (gst_avi_demux_class_init), (gst_avi_demux_init), - (gst_avi_demux_reset), (gst_avi_demux_index_next), - (gst_avi_demux_index_entry_for_time), - (gst_avi_demux_index_entry_for_byte), - (gst_avi_demux_index_entry_for_frame), (gst_avi_demux_src_convert), - (gst_avi_demux_handle_src_query), (gst_avi_demux_handle_src_event), - (gst_avi_demux_parse_file_header), (gst_avi_demux_stream_init), - (gst_avi_demux_parse_avih), (gst_avi_demux_parse_superindex), - (gst_avi_demux_parse_subindex), (gst_avi_demux_read_subindexes), - (gst_avi_demux_parse_stream), (gst_avi_demux_parse_odml), - (gst_avi_demux_parse_index), (gst_avi_demux_stream_index), - (gst_avi_demux_stream_scan), (gst_avi_demux_massage_index), - (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), - (gst_avi_demux_process_next_entry), (gst_avi_demux_stream_data), - (gst_avi_demux_loop), (gst_avi_demux_sink_activate), - (gst_avi_demux_sink_activate_pull): - * gst/avi/gstavidemux.h: - Port from -THREADED to HEAD, and fix for latest API changes of - the day. Keep avimux dead for now. - -2005-06-29 Wim Taymans <wim@fluendo.com> - - * ext/shout2/gstshout2.c: (gst_shout2send_render): - Fix build. - -2005-06-29 Andy Wingo <wingo@pobox.com> - - * gst/videofilter/gstvideoexample.c: Removed gst_library_load, I - think. Whatever this plugin actually does, that I don't know. - -2005-06-29 Andy Wingo <wingo@pobox.com> - - * ext/mad/gstid3tag.c (gst_id3_tag_get_event_masks): Reschmoove. - - * ext/mad/gstmad.c (gst_mad_get_event_masks): Remove. - (gst_mad_chain): Appease GCC. - - * ext/libcaca/gstcacasink.c (gst_cacasink_setcaps): Signedness. - - * ext/aalib/gstaasink.c (gst_aasink_fixate): Unref caps, not free. - (gst_aasink_scale): Signedness. - - * gst/udp/gstudpsink.c (gst_udpsink_get_type): Actually add the - URI handler. - - * gst/udp/gstudpsrc.c (gst_udpsrc_start): - (gst_udpsrc_create): Signedness. - - * gst/rtsp/sdpmessage.c (sdp_message_parse_buffer): Thanks - compiler! - (sdp_parse_line): Signedness fix. - - * configure.ac (GST_CFLAGS): GCC strikes back!!! Let the build - breakage ensue!!! - - * gst/rtsp/gstrtspsrc.c (gst_rtspsrc_loop, gst_rtspsrc_open): - Signedness, unused var fixes. - (gst_rtspsrc_close): Unused? - - * gst/realmedia/rmdemux.c (re_hexdump_bytes): Unused. - - * gst/law/mulaw-encode.c (gst_mulawenc_chain): Signeness fix. - - * gst/law/alaw-encode.c (alawenc_getcaps): Remove unneeded - declarations. Typo (probably crasher) fix. - - * gst/law/mulaw-encode.c (mulawdec_getcaps): - * gst/law/mulaw-encode.c (mulawenc_getcaps): - * gst/law/alaw-decode.c (alawdec_getcaps): Same crasher fix. - - * gst/goom/gstgoom.c (gst_goom_init): Hook up the event function. - - * gst/effectv/gstwarp.c (gst_warptv_setup): Signedness fix. - - * gst/effectv/gstdice.c (gst_dicetv_draw): Um, deferencing - uninitialized pointer not good. - - * gst/videofilter/gstvideoexample.c (plugin_init): - * gst/videofilter/Makefile.am (libgstvideoexample_la_LIBADD): Link - to libgstvideofilter instead of gst_library_load. - - * gst/alpha/gstalpha.c (gst_alpha_chroma_key_i420) - (gst_alpha_chroma_key_ayuv): Signedness fixen. - -2005-06-29 Wim Taymans <wim@fluendo.com> - - * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), - (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), - (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), - (gst_rtspsrc_stream_setup_rtp), - (gst_rtspsrc_stream_configure_transport), (find_stream), - (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play), - (gst_rtspsrc_change_state): - Fix case where outpad could not be decided. - -2005-06-29 Andy Wingo <wingo@pobox.com> - - * ext/Makefile.am (MAD_DIR): Add mad to the build. - -2005-06-28 Wim Taymans <wim@fluendo.com> - - * ext/mad/gstid3tag.c: (gst_id3_tag_src_link): - * gst/udp/gstudpsrc.c: (gst_udpsrc_init): - Fix old RPAD macro. - basesrc -> base_src - -2005-06-27 Wim Taymans <wim@fluendo.com> - - * ext/mad/gstid3tag.c: (gst_id3_tag_src_link): - * ext/mad/gstmad.c: (gst_mad_chain): - RPAD_ -> PAD - Fix args in bufferalloc function call. - Makes the mad plugin compile again - -2005-06-27 Owen Fraser-Green <owen@discobabe.net> - - * gst/realmedia/rmdemux.c: Rewrote to use gstadapter. Also parses - audio and video header packets for known properties. - -2005-06-23 Wim Taymans <wim@fluendo.com> - - * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), - (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), - (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), - (gst_rtspsrc_stream_setup_rtp), - (gst_rtspsrc_stream_configure_transport), (find_stream), - (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play), - (gst_rtspsrc_change_state): - * gst/rtsp/rtspurl.c: (rtsp_url_parse): - Make rtspsrc a live source. - Don't try to parse NULL urls. - -2005-06-23 Wim Taymans <wim@fluendo.com> - - * gst/udp/gstudpsrc.c: (gst_udpsrc_init): - Make udpsrc a live source. - -2005-06-02 Wim Taymans <wim@fluendo.com> - - * gst/udp/Makefile.am: - Use versioned net lib. - -2005-06-02 Wim Taymans <wim@fluendo.com> - - * gst/udp/Makefile.am: - Fix hack in makefile. - -2005-06-02 Andy Wingo <wingo@pobox.com> - - * ext/mad/gstid3tag.c: Finish porting to 0.9: no more gstdata, - check for link functions before calling them, give - gst_message_new_tag its own copy of the tag list, set the parser - state before sending the event (because in 0.9 events are - processed immediately), casting fixes. - - * ext/mad/Makefile.am (libgstmad_la_LDFLAGS): Link with - gsttagedit. - -2005-06-02 Wim Taymans <wim@fluendo.com> - - * gst/udp/Makefile.am: - * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_type), - (gst_multiudpsink_base_init), (gst_multiudpsink_class_init), - (gst_multiudpsink_init), (gst_multiudpsink_finalize), - (gst_multiudpsink_get_times), (gst_multiudpsink_render), - (gst_multiudpsink_set_property), (gst_multiudpsink_init_send), - (gst_multiudpsink_add), (client_compare), (free_client), - (gst_multiudpsink_remove), (gst_multiudpsink_clear), - (gst_multiudpsink_get_stats): - * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), - (gst_udpsrc_base_init), (gst_udpsrc_class_init), - (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start), - (gst_udpsrc_unlock), (gst_udpsrc_stop): - Use NetBuffer and small cleanups. - Implement client removal in multiudpsink. - -2005-06-02 Wim Taymans <wim@fluendo.com> - - * gst/rtsp/README: - * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), - (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), - (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), - (gst_rtspsrc_stream_setup_rtp), - (gst_rtspsrc_stream_configure_transport), (find_stream), - (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play), - (gst_rtspsrc_change_state): - * gst/rtsp/rtsptransport.c: (rtsp_transport_new), - (rtsp_transport_init), (parse_mode), (parse_range), - (rtsp_transport_parse), (rtsp_transport_free): - RTSP cleanups. - -2005-06-02 Wim Taymans <wim@fluendo.com> - - * gst/effectv/gstquark.c: (gst_quarktv_chain): - * gst/goom/gstgoom.c: (gst_goom_chain): - * gst/videobox/Makefile.am: - * gst/videobox/gstvideobox.c: (gst_video_box_class_init), - (gst_video_box_init), (gst_video_box_sink_setcaps), - (gst_video_box_chain): - * gst/videofilter/gstvideofilter.c: (gst_videofilter_chain): - * gst/videorate/gstvideorate.c: (gst_videorate_class_init), - (gst_videorate_getcaps), (gst_videorate_setcaps), - (gst_videorate_init), (gst_videorate_event), (gst_videorate_chain), - (gst_videorate_change_state): - Bufferalloc changes. - -2005-05-25 Wim Taymans <wim@fluendo.com> - - * ext/mad/gstmad.c: (gst_mad_chain), (gst_mad_change_state): - * ext/sidplay/gstsiddec.cc: - * gst/alpha/gstalpha.c: (gst_alpha_chain): - * gst/goom/gstgoom.c: (gst_goom_chain): - No need to take the lock anymore, core already did - that before calling us. - -2005-05-25 Wim Taymans <wim@fluendo.com> - - * ext/amrnb/amrnbdec.c: (gst_amrnbdec_init), (gst_amrnbdec_chain), - (gst_amrnbdec_state_change): - * ext/amrnb/amrnbenc.c: (gst_amrnbenc_base_init), - (gst_amrnbenc_finalize), (gst_amrnbenc_chain), - (gst_amrnbenc_state_change): - * ext/amrnb/amrnbparse.c: (gst_amrnbparse_init), - (gst_amrnbparse_query), (gst_amrnbparse_chain), - (gst_amrnbparse_read_header), (gst_amrnbparse_loop), - (gst_amrnbparse_sink_activate), (gst_amrnbparse_state_change): - Core already took the lock. - -2005-05-19 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * ext/esd/Makefile.am: - Disable tcp elements and esdmon (they don't compile). - -2005-05-19 Jan Schmidt <thaytan@mad.scientist.com> - - * Makefile.am: - * ext/Makefile.am: - * sys/Makefile.am: - Make my automake version shut up about undefined variables - * gst/goom/gstgoom.c: - GstAdapter moved to base objects. - -2005-05-18 Wim Taymans <wim@fluendo.com> - - * ext/amrnb/Makefile.am: - * ext/amrnb/amrnb.c: (plugin_init): - * ext/amrnb/amrnbdec.c: (gst_amrnbdec_init), - (gst_amrnbdec_setcaps), (gst_amrnbdec_chain), - (gst_amrnbdec_state_change): - * ext/amrnb/amrnbdec.h: - * ext/amrnb/amrnbenc.c: (gst_amrnbenc_get_type), - (gst_amrnbenc_base_init), (gst_amrnbenc_class_init), - (gst_amrnbenc_init), (gst_amrnbenc_finalize), - (gst_amrnbenc_setcaps), (gst_amrnbenc_chain), - (gst_amrnbenc_state_change): - * ext/amrnb/amrnbenc.h: - * ext/amrnb/amrnbparse.c: (gst_amrnbparse_init), - (gst_amrnbparse_query), (gst_amrnbparse_event), - (gst_amrnbparse_chain), (gst_amrnbparse_read_header), - (gst_amrnbparse_loop), (gst_amrnbparse_sink_activate), - (gst_amrnbparse_state_change): - * ext/amrnb/amrnbparse.h: - Ported AMR decoder/parse. - Added AMR encoder. - -2005-05-18 Wim Taymans <wim@fluendo.com> - - * configure.ac: - * gst/goom/Makefile.am: - * gst/goom/gstgoom.c: (gst_goom_init), (gst_goom_sink_setcaps), - (gst_goom_src_setcaps), (gst_goom_src_negotiate), (gst_goom_event), - (gst_goom_chain), (gst_goom_change_state), (plugin_init): - Ported goom. - Added goom and alpha to build. - -2005-05-17 Wim Taymans <wim@fluendo.com> - - * configure.ac: - * gst/alpha/Makefile.am: - * gst/alpha/gstalpha.c: (gst_alpha_class_init), (gst_alpha_init), - (gst_alpha_sink_setcaps), (gst_alpha_chain): - Ported alpha, remove alphacolor as functionality is in - ffmpegcolorspace. - -2005-05-17 Wim Taymans <wim@fluendo.com> - - * ext/libcaca/gstcacasink.c: (gst_cacasink_setcaps), - (gst_cacasink_render), (gst_cacasink_open), (gst_cacasink_close), - (gst_cacasink_change_state): - * ext/libcaca/gstcacasink.h: - Cleanups. - -2005-05-15 David Schleef <ds@schleef.org> - - Move core plugins out of core. I don't mind fdsrc/fdsink - going back into the core; they were just disabled there, so - I moved them. Some of this stuff could (should) be deleted. - * gst/oldcore/Makefile.am: - * gst/oldcore/gstaggregator.c: - * gst/oldcore/gstaggregator.h: - * gst/oldcore/gstelements.c: - * gst/oldcore/gstfdsink.c: - * gst/oldcore/gstfdsink.h: - * gst/oldcore/gstfdsrc.c: - * gst/oldcore/gstfdsrc.h: - * gst/oldcore/gstmd5sink.c: - * gst/oldcore/gstmd5sink.h: - * gst/oldcore/gstmultifilesrc.c: - * gst/oldcore/gstmultifilesrc.h: - * gst/oldcore/gstpipefilter.c: - * gst/oldcore/gstpipefilter.h: - * gst/oldcore/gstshaper.c: - * gst/oldcore/gstshaper.h: - * gst/oldcore/gststatistics.c: - * gst/oldcore/gststatistics.h: - -2005-05-13 Christian Schaller <uraeus@gnome.org> - - * ext/Makefile.am: dist esd directory - * gst-plugins.spec.in: add rtp plugins and esd plugin - * gst/effectv/Makefile.am: fix videofilter linking - * gst/rtp/Makefile.am: add missing headers - * gst/rtsp/Makefile.am: add missing headers - -2005-05-12 Wim Taymans <wim@fluendo.com> - - * configure.ac: - * ext/sidplay/gstsiddec.cc: - Add working plugins to build. - Make sidplay compile again. - -2005-05-12 Wim Taymans <wim@fluendo.com> - - * ext/mad/gstid3tag.c: (gst_id3_tag_src_query): - * ext/mad/gstmad.c: (gst_mad_chain): - Fix mad and id3tag compilation again. - -2005-05-12 Wim Taymans <wim@fluendo.com> - - * gst/udp/.cvsignore: - * gst/udp/Makefile.am: - * gst/udp/gstmultiudpsink.c: (gst_multiudpsink_get_type), - (gst_multiudpsink_base_init), (gst_multiudpsink_class_init), - (gst_multiudpsink_init), (gst_multiudpsink_finalize), - (gst_multiudpsink_get_times), (gst_multiudpsink_render), - (gst_multiudpsink_set_property), (gst_multiudpsink_get_property), - (gst_multiudpsink_init_send), (gst_multiudpsink_close), - (gst_multiudpsink_add), (gst_multiudpsink_remove), - (gst_multiudpsink_clear), (gst_multiudpsink_get_stats), - (gst_multiudpsink_change_state): - * gst/udp/gstmultiudpsink.h: - * gst/udp/gstudp-marshal.list: - * gst/udp/gstudp.c: (plugin_init): - * gst/udp/gstudp.h: - * gst/udp/gstudpsink.c: (gst_udpsink_get_type), - (gst_udpsink_base_init), (gst_udpsink_class_init), - (gst_udpsink_init), (gst_udpsink_set_uri), - (gst_udpsink_set_property), (gst_udpsink_get_property), - (gst_udpsink_uri_get_type), (gst_udpsink_uri_get_protocols), - (gst_udpsink_uri_get_uri), (gst_udpsink_uri_set_uri), - (gst_udpsink_uri_handler_init): - * gst/udp/gstudpsink.h: - * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), - (gst_udpsrc_base_init), (gst_udpsrc_class_init), - (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start), - (gst_udpsrc_unlock), (gst_udpsrc_stop): - * gst/udp/gstudpsrc.h: - Added multifdsink to send UDP to multiple addresses. - Cleaned up UDP source/sink elements some more. - Make UDP sink extends from multiudpsink. - -2005-05-12 Tim-Philipp Müller <tim at centricular dot net> - - * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_sink_event): - Make queries actually work (update core first). - -2005-05-12 Wim Taymans <wim@fluendo.com> - - * gst/rtsp/README: - * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get_type), - (gst_tcpclientsrc_base_init), (gst_tcpclientsrc_class_init), - (gst_tcpclientsrc_init), (gst_tcpclientsrc_getcaps), - (gst_tcpclientsrc_stop), (gst_tcpclientsrc_eos), - (gst_tcpclientsrc_create), (gst_tcpclientsrc_start): - * gst/tcp/gsttcpclientsrc.h: - * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_get_type), - (gst_tcpserversrc_base_init), (gst_tcpserversrc_class_init), - (gst_tcpserversrc_init), (gst_tcpserversrc_create), - (gst_tcpserversrc_start), (gst_tcpserversrc_stop): - * gst/tcp/gsttcpserversrc.h: - * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_get_type), - (gst_tcpsrc_base_init), (gst_tcpsrc_class_init), (gst_tcpsrc_init), - (gst_tcpsrc_create), (gst_tcpsrc_start), (gst_tcpsrc_stop): - * gst/tcp/gsttcpsrc.h: - * gst/udp/gstudpsink.c: (gst_udpsink_base_init), - (gst_udpsink_init), (gst_udpsink_get_times), (gst_udpsink_render), - (gst_udpsink_set_property), (gst_udpsink_get_property), - (gst_udpsink_change_state): - * gst/udp/gstudpsink.h: - * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), - (gst_udpsrc_base_init), (gst_udpsrc_class_init), (gst_udpsrc_init), - (gst_udpsrc_create), (gst_udpsrc_set_uri), (gst_udpsrc_start), - (gst_udpsrc_stop): - * gst/udp/gstudpsrc.h: - Make UDP and TCP elements use PushSrc. - - -2005-05-11 Tim-Philipp Müller <tim at centricular dot net> - - * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_src_query), - (index_seek), (normal_seek), (gst_mad_sink_event): - Port to new query API and replace gst_pad_convert() - and gst_pad_get_formats() usage. gstid3tag looks like - it needs some more love before it will work again, if - not a rewrite. - -2005-05-12 Zeeshan Ali <zeenix@gmail.com> - - * gst/effectv/Makefile.am: - Fixed the effectv build again. - -2005-05-11 Wim Taymans <wim@fluendo.com> - - * gst/tcp/Makefile.am: - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_get_type), - (gst_multifdsink_base_init), (gst_multifdsink_class_init), - (gst_multifdsink_init), (gst_multifdsink_handle_client_write), - (gst_multifdsink_queue_buffer), (gst_multifdsink_render), - (gst_multifdsink_change_state): - * gst/tcp/gstmultifdsink.h: - * gst/tcp/gsttcp.c: - * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_get_type), - (gst_tcpclientsink_base_init), (gst_tcpclientsink_class_init), - (gst_tcpclientsink_init), (gst_tcpclientsink_render), - (gst_tcpclientsink_set_property), (gst_tcpclientsink_get_property), - (gst_tcpclientsink_change_state): - * gst/tcp/gsttcpclientsink.h: - * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_class_init), - (gst_tcpclientsrc_init_receive): - * gst/tcp/gsttcpplugin.c: (plugin_init): - * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init): - * gst/tcp/gsttcpserversink.h: - * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_class_init): - * gst/tcp/gsttcpsink.c: (gst_tcpsink_get_type), - (gst_tcpsink_base_init), (gst_tcpsink_class_init), - (gst_tcpsink_setcaps), (gst_tcpsink_init), (gst_tcpsink_get_times), - (gst_tcpsink_render), (gst_tcpsink_set_property), - (gst_tcpsink_get_property): - * gst/tcp/gsttcpsink.h: - * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_class_init), (gst_tcpsrc_get): - Ported over some sink elements. - Sources not ported yet as they require a PushSource base class. - -2005-05-11 Tim-Philipp Müller <tim at centricular dot net> - - * gst/effectv/Makefile.am: - * gst/videofilter/Makefile.am: - Turn videofilter into a library (private for now) - -2005-05-11 Wim Taymans <wim@fluendo.com> - - * gst/rtsp/README: - * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), - (gst_rtspsrc_class_init), (gst_rtspsrc_create_stream), - (gst_rtspsrc_add_element), (gst_rtspsrc_set_state), - (gst_rtspsrc_stream_setup_rtp), - (gst_rtspsrc_stream_configure_transport), (find_stream), - (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_play): - * gst/rtsp/rtsp.h: - * gst/rtsp/rtspconnection.c: (rtsp_connection_create), - (rtsp_connection_send), (read_line), (parse_request_line), - (parse_line), (read_body), (rtsp_connection_receive), - (rtsp_connection_free): - * gst/rtsp/rtspconnection.h: - * gst/rtsp/rtspdefs.c: (rtsp_find_method): - * gst/rtsp/rtspdefs.h: - * gst/rtsp/rtspmessage.c: (rtsp_message_set_body), - (rtsp_message_take_body): - * gst/rtsp/rtspmessage.h: - * gst/rtsp/rtspstream.h: - * gst/rtsp/sdpmessage.c: (sdp_parse_line): - Added README - Some cleanups. - -2005-05-11 Wim Taymans <wim@fluendo.com> - - * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), - (gst_rtspsrc_class_init), (gst_rtspsrc_init), - (gst_rtspsrc_create_stream), (gst_rtspsrc_add_element), - (gst_rtspsrc_set_state), (gst_rtspsrc_stream_setup_rtp), - (gst_rtspsrc_stream_configure_transport), (find_stream), - (gst_rtspsrc_loop), (gst_rtspsrc_open), (gst_rtspsrc_close), - (gst_rtspsrc_play), (gst_rtspsrc_change_state): - * gst/rtsp/gstrtspsrc.h: - Setup UDP sources correctly, receives raw data from RTSP - compliant servers now. - -2005-05-11 Wim Taymans <wim@fluendo.com> - - * gst/rtsp/.cvsignore: - * gst/rtsp/Makefile.am: - * gst/rtsp/gstrtsp.c: (plugin_init): - * gst/rtsp/gstrtsp.h: - * gst/rtsp/gstrtspsrc.c: (gst_rtsp_proto_get_type), - (gst_rtspsrc_get_type), (gst_rtspsrc_base_init), - (gst_rtspsrc_class_init), (gst_rtspsrc_init), - (gst_rtspsrc_set_property), (gst_rtspsrc_get_property), - (gst_rtspsrc_create_stream), (rtspsrc_add_element), - (gst_rtspsrc_stream_setup_rtp), - (gst_rtspsrc_stream_configure_transport), (find_stream), - (gst_rtspsrc_loop), (gst_rtspsrc_send), (gst_rtspsrc_open), - (gst_rtspsrc_close), (gst_rtspsrc_play), (gst_rtspsrc_pause), - (gst_rtspsrc_activate), (gst_rtspsrc_change_state): - * gst/rtsp/gstrtspsrc.h: - * gst/rtsp/rtsp.h: - * gst/rtsp/rtspconnection.c: (rtsp_connection_open), - (rtsp_connection_create), (append_header), (rtsp_connection_send), - (read_line), (read_string), (read_key), (parse_response_status), - (parse_line), (read_body), (rtsp_connection_receive), - (rtsp_connection_close): - * gst/rtsp/rtspconnection.h: - * gst/rtsp/rtspdefs.c: (rtsp_init_status), (rtsp_method_as_text), - (rtsp_header_as_text), (rtsp_status_as_text), - (rtsp_status_to_string), (rtsp_find_header_field): - * gst/rtsp/rtspdefs.h: - * gst/rtsp/rtspmessage.c: (rtsp_message_new_request), - (rtsp_message_init_request), (rtsp_message_new_response), - (rtsp_message_init_response), (rtsp_message_init_data), - (rtsp_message_add_header), (rtsp_message_remove_header), - (rtsp_message_get_header), (rtsp_message_get_header_copy), - (rtsp_message_set_body), (rtsp_message_set_body_copy), - (rtsp_message_get_body), (rtsp_message_get_body_copy), (dump_mem), - (dump_key_value), (rtsp_message_dump): - * gst/rtsp/rtspmessage.h: - * gst/rtsp/rtspstream.h: - * gst/rtsp/rtsptransport.c: (rtsp_transport_new), - (rtsp_transport_init), (parse_mode), (parse_range), - (rtsp_transport_parse), (rtsp_transport_free): - * gst/rtsp/rtsptransport.h: - * gst/rtsp/rtspurl.c: (rtsp_url_parse), (rtsp_url_free): - * gst/rtsp/rtspurl.h: - * gst/rtsp/sdp.h: - * gst/rtsp/sdpmessage.c: (sdp_message_new), (sdp_message_init), - (sdp_message_clean), (sdp_message_free), (sdp_media_new), - (sdp_media_init), (sdp_message_set_origin), - (sdp_message_get_origin), (sdp_message_set_connection), - (sdp_message_get_connection), (sdp_message_add_bandwidth), - (sdp_message_add_time), (sdp_message_add_zone), - (sdp_message_set_key), (sdp_message_get_key), - (sdp_message_get_attribute_val), (sdp_message_add_attribute), - (sdp_message_add_media), (sdp_media_add_attribute), - (sdp_media_add_bandwidth), (sdp_media_add_format), - (sdp_media_get_attribute_val), (read_string), (read_string_del), - (sdp_parse_line), (sdp_message_parse_buffer), (print_media), - (sdp_message_dump): - * gst/rtsp/sdpmessage.h: - * gst/rtsp/test.c: (main): - Ported to 0.9. - Set up transports, init UDP ports, init RTP session managers. - -2005-05-11 Wim Taymans <wim@fluendo.com> - - * gst/rtp/Makefile.am: - * gst/rtp/gstrtp.c: (plugin_init): - * gst/rtp/gstrtpdec.c: (gst_rtpdec_get_type), - (gst_rtpdec_class_init), (gst_rtpdec_init), (gst_rtpdec_chain_rtp), - (gst_rtpdec_chain_rtcp), (gst_rtpdec_set_property), - (gst_rtpdec_get_property), (gst_rtpdec_change_state), - (gst_rtpdec_plugin_init): - * gst/rtp/gstrtpdec.h: - * gst/udp/gstudpsink.c: (gst_udpsink_base_init), - (gst_udpsink_get_times), (gst_udpsink_render), - (gst_udpsink_change_state): - * gst/udp/gstudpsrc.c: (gst_udpsrc_get_type), - (gst_udpsrc_base_init), (gst_udpsrc_class_init), (gst_udpsrc_init), - (gst_udpsrc_loop), (gst_udpsrc_set_uri), (gst_udpsrc_set_property), - (gst_udpsrc_get_property), (gst_udpsrc_init_receive), - (gst_udpsrc_activate), (gst_udpsrc_change_state), - (gst_udpsrc_uri_get_type), (gst_udpsrc_uri_get_protocols), - (gst_udpsrc_uri_get_uri), (gst_udpsrc_uri_set_uri), - (gst_udpsrc_uri_handler_init): - * gst/udp/gstudpsrc.h: - UDP fixes, added uri handler. - Added rtpdec that will manage the RTP session in the future. - -2005-05-10 Arwed v. Merkatz <v.merkatz@gmx.net> - - * PORTED_09: - * configure.ac: - * ext/Makefile.am: - * ext/esd/Makefile.am: - * ext/esd/esdsink.c: (gst_esdsink_get_type), - (gst_esdsink_class_init), (gst_esdsink_init), - (gst_esdsink_dispose), (gst_esdsink_change_state), - (gst_caps_set_each), (gst_esdsink_getcaps), (gst_esdsink_open), - (gst_esdsink_close), (gst_esdsink_write), (gst_esdsink_delay), - (gst_esdsink_reset), (gst_esdsink_set_property), - (gst_esdsink_get_property), (gst_esdsink_factory_init): - * ext/esd/esdsink.h: - * ext/esd/gstesd.c: (plugin_init): - Ported esdsink plugin - -2005-05-10 Wim Taymans <wim@fluendo.com> - - * gst/udp/Makefile.am: - * gst/udp/gstudpsink.c: (gst_udpsink_get_type), - (gst_udpsink_base_init), (gst_udpsink_class_init), - (gst_udpsink_init), (gst_udpsink_get_times), (gst_udpsink_render), - (gst_udpsink_set_property), (gst_udpsink_get_property), - (gst_udpsink_init_send), (gst_udpsink_close), - (gst_udpsink_change_state): - * gst/udp/gstudpsink.h: - * gst/udp/gstudpsrc.c: (gst_udpsrc_base_init), - (gst_udpsrc_class_init), (gst_udpsrc_init), (gst_udpsrc_loop), - (gst_udpsrc_set_property), (gst_udpsrc_get_property), - (gst_udpsrc_init_receive), (gst_udpsrc_close), - (gst_udpsrc_activate), (gst_udpsrc_change_state): - * gst/udp/gstudpsrc.h: - Ported udp src/sink. - -2005-05-09 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * PORTED_09: - * configure.ac: - * ext/Makefile.am: - * ext/shout2/Makefile.am: - * ext/shout2/gstshout2.c: (gst_shout2send_get_type), - (gst_shout2send_base_init), (gst_shout2send_class_init), - (gst_shout2send_init), (gst_shout2send_event), - (gst_shout2send_render), (gst_shout2send_set_property), - (gst_shout2send_get_property), (gst_shout2send_setcaps), - (gst_shout2send_change_state): - * ext/shout2/gstshout2.h: - - Port shout2 plugin - -2005-05-08 Zeeshan Ali <zeenix@gmail.com> - - * configure.ac: - * ext/Makefile.am: - * ext/libcaca/Makefile.am: - * ext/libcaca/gstcacasink.c: (gst_cacasink_get_type), - (gst_cacasink_class_init), (gst_cacasink_get_times), - (gst_cacasink_setcaps), (gst_cacasink_init), (gst_cacasink_render), - (plugin_init): - * ext/libcaca/gstcacasink.h: - Ported the libcaca plugin. - -2005-05-08 Zeeshan Ali <zeenix@gmail.com> - - * configure.ac: - * ext/mad/Makefile.am: - * effectv/Makefile.am: - Fixed a few things to enable the mad and effectv to be able to find the - headers in the gst-plugins-base/gst-libs and to link against the libs - in there. - -2005-05-07 Zeeshan Ali <zeenix@gmail.com> - - * configure.ac: - Fixed the build by fixing a small mistake of Wim. - -2005-05-06 Wim Taymans <wim@fluendo.com> - - * configure.ac: - * ext/aalib/Makefile.am: - * ext/aalib/gstaasink.c: (gst_aasink_get_type), - (gst_aasink_class_init), (gst_aasink_fixate), (gst_aasink_setcaps), - (gst_aasink_init), (gst_aasink_get_times), (gst_aasink_render), - (gst_aasink_set_property), (gst_aasink_get_property), - (gst_aasink_open), (gst_aasink_close), (gst_aasink_change_state): - * ext/aalib/gstaasink.h: - * gst/smpte/Makefile.am: - * gst/smpte/gstsmpte.c: (gst_smpte_setcaps), (gst_smpte_init), - (gst_smpte_collected): - * gst/smpte/gstsmpte.h: - Ported 2 more plugins. usgly hack in the Makefile.am though, I'm - sure someone will fix it. - -2005-05-06 Christian Schaller <uraeus@gnome.org> - - * configure.ac: add sidplay - * ext/Makefile.am: add sidplay - * ext/sidplay/Makefile.am: add GST_PLUGINS_CFLAGS - * ext/sidplay/gstsiddec.cc: remove bytestream.h - -2005-05-06 Christian Schaller <uraeus@gnome.org> - - * configure.ac: add gst-plugins-libs - -2005-05-06 Wim Taymans <wim@fluendo.com> - - * configure.ac: - * ext/sidplay/gstsiddec.cc: - * ext/sidplay/gstsiddec.h: - Ported sidplay. - -2005-05-06 Christian Schaller <uraeus@gnome.org> - - * configure.ac: - * ext/mad/Makefile.am: add linking of gstinterfaces - * ext/mad/gstid3tag.c: (plugin_init): remove library_load - * gst-plugins.spec.in: - * gst/effectv/Makefile.am: link to libgstvideofilter - * gst/effectv/gsteffectv.c: (plugin_init): same as for mad - * gst/videofilter/Makefile.am: make sure videoflip is not built - -2005-05-06 Wim Taymans <wim@fluendo.com> - - * gst/law/alaw-decode.c: (alawdec_getcaps), (alawdec_setcaps), - (gst_alawdec_init), (gst_alawdec_chain): - * gst/law/alaw-encode.c: (alawenc_getcaps), (alawenc_setcaps), - (gst_alawenc_init), (gst_alawenc_chain): - * gst/law/mulaw-decode.c: (mulawdec_getcaps), (mulawdec_setcaps), - (gst_mulawdec_init), (gst_mulawdec_chain): - * gst/law/mulaw-encode.c: (mulawenc_getcaps), (mulawenc_setcaps), - (gst_mulawenc_init), (gst_mulawenc_chain): - Ported alaw and mulaw plugins to 0.9, fixed the negotiation as - well. - -2005-05-06 Christian Schaller <uraeus@gnome.org> - - * ext/alsa: removed plugins that are now in gst-plugins-base - * ext/gnomevfs: - * ext/theora: - * ext/vorbis: - * gst/adder: - * gst/audioconvert: - * gst/ffmpegcolorspace: - * gst/typefind: - * gst/videofilter: comment out videoflip and gamma plugins - -2005-05-06 Christian Schaller <uraeus@gnome.org> - - * gst-libs: Remove all files as this is in gst-plugins-base now - * gst-libs/README: add a remove informing of this move - -2005-05-06 Christian Schaller <uraeus@gnome.org> - - * PORTED_09: update to add videofilter - * configure.ac: re-add videofilter - * gst/videofilter/Makefile.am: remove videobalance (not ported yet) - * gst/videofilter/gstgamma.c: (gst_gamma_class_init): - * gst/videofilter/gstvideobalance.c: (gst_videobalance_class_init): - * gst/videofilter/gstvideofilter.c: (gst_videofilter_getcaps), - (gst_videofilter_setcaps), (gst_videofilter_init), - (gst_videofilter_chain), (gst_videofilter_set_output_size): - * gst/videofilter/gstvideoflip.c: (gst_videoflip_class_init): - -2005-05-06 Christian Schaller <uraeus@gnome.org> - - * ext/mad: ported plugin from threaded branch - * gst/effectv: ported plugins from threaded branch - * gst/law: enable law plugin as it compiles (Wim will fixor) - -2005-05-06 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * configure.ac: - fix typo - -2005-05-05 Christian Schaller <uraeus@gnome.org> - - * Update configure.ac and Makefiles to only build what is actually - ported and not moved into gst-plugins-base - -2005-02-22 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - hunting season on 0.9 is now OPEN - -2005-02-22 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): - Kick the hell out of gcc for not warning me about a symbol conflict. - -2005-02-22 Luca Ognibene <luogni@tin.it> - - Reviewed by: Tim-Philipp Müller <tim at centricular dot net> - - * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_link): - Don't leak caps string (fixes #168134) - - * ext/jpeg/gstjpegenc.c: (gst_jpegenc_class_init), - (gst_jpegenc_init), (gst_jpegenc_finalize), - (gst_jpegenc_change_state): - Don't leak line buffers and context struct (fixes #168133). - -2005-02-21 Tim-Philipp Müller <tim at centricular dot net> - - * configure.ac: - * ext/dirac/gstdiracdec.cc: - (gst_diracdec_chain): - Since dirac 0.5.0 the framerate in dirac is expressed as a - rational number. Fix build and up requirement to 0.5.0, and - also pass parameters to gst_diracdec_link in the right order - (fixes #167959). - -2005-02-21 Maciej Katafiasz <mathrick@freedesktop.org> - - * ext/faad/gstfaad.c: (gst_faad_sinkconnect), (gst_faad_chain): - * ext/faad/gstfaad.h: - TEH LONGEST DEBUGGING SESSION EVAR is over. Fix interaction with - certain invalid muxed streams, where some packets will contain - junk after decoder data. Partially fixes #149158. - -2005-02-21 Jan Schmidt <thaytan@mad.scientist.com> - * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_chain): - Make sure we only write to writable buffers - -2005-02-20 Tim-Philipp Müller <tim at centricular dot net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_audio_caps_with_data): - Do actually fix invalid RIFF fmt header values for alaw - and mulaw audio instead of just saying so. - - * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): - Give gst_riff_create_audio_caps_with_data() a chance to - fix up broken format header fields before extracting any - parameters from the header. (fixes #167633) - -2005-02-19 Martin Holters <martin.holters@gmx.de> - - Reviewed by: Tim-Philipp Müller <tim at centricular dot net> - - * gst/audioconvert/bufferframesconvert.c: - (buffer_frames_convert_link): - Don't leak othercaps. (fixes #167878) - -2005-02-19 Arwed v. Merkatz <v.merkatz@gmx.net>> - - * configure.ac: - * ext/libvisual/visual.c: (gst_visual_srclink), - (gst_visual_change_state): - Support libvisual 0.2.0. - -2005-02-18 Tim-Philipp Müller <tim at centricular dot net> - - * ext/jpeg/gstjpegdec.c: (gst_jpegdec_chain): - * ext/jpeg/gstjpegenc.c: (gst_jpegenc_resync), (gst_jpegenc_chain): - Use same rowstrides for I420 as used everywhere else. - -2005-02-17 Tim-Philipp Müller <tim at centricular dot net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_invert): - Declare variables at beginning of block and make gcc-2.95 happy - (fixes # 167482, patch by Gergely Nagy). - - * gst/tcp/gsttcpclientsrc.c: - * gst/tcp/gsttcpclientsrc.h: - Move some includes into the header, so that struct sockaddr_in is - defined when it should be defined on FreeBSD as well (fixes - #167483). - - * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_init_receive): - Don't pass uninitialised values to setsockopt() here either. - -2005-02-17 Luca Ognibene <luogni at tin dot it> - - Reviewed by: Tim-Philipp Müller <tim at centricular dot net> - - * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_init_send): - Don't pass uninitialised values to setsockopt(). (fixes #167704) - -2005-02-16 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybin.c: (add_sink): - Invert bin_add/link order to workaround deadlock in opt. - -2005-02-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/modplug/gstmodplug.cc: - Add missing break causing position queries to fail. - -2005-02-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_pad_populate): - Granpos can apparently be -1, which screws up calculations... - -2005-02-16 Jan Schmidt <thaytan@mad.scientist.com> - - * sys/ximage/ximagesink.c: (gst_ximagesink_chain), - (gst_ximagesink_send_pending_navigation), - (gst_ximagesink_navigation_send_event), (gst_ximagesink_finalize), - (gst_ximagesink_init): - * sys/ximage/ximagesink.h: - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), - (gst_xvimagesink_send_pending_navigation), - (gst_xvimagesink_navigation_send_event), - (gst_xvimagesink_finalize), (gst_xvimagesink_init): - * sys/xvimage/xvimagesink.h: - Use a mutex protected list to marshal navigation - events into the stream thread from whichever thread - sends them. - -2005-02-15 Tim-Philipp Müller <tim at centricular dot net> - - * gst/speed/demo-mp3.c: (time_tick_cb), (main): - Display current position and track length; misc. clean-ups. - - * gst/speed/gstspeed.c: (speed_get_query_types), (speed_src_query), - (speed_init), (speed_chain): - Add query function, so that the stream length and current position - get adjusted when queried (note that current position queries may - still be wrong if the audio sink returns values based on buffer - timestamps instead of passing on the query). - -2005-02-13 Benjamin Otte <otte@gnome.org> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link), - (gst_audio_convert_channels): - create channel conversion matrix when linking - * gst/audioconvert/.cvsignore: - * gst/audioconvert/Makefile.am: - * gst/audioconvert/channelmixtest.c: (main): - add (ugly) test that ensures stereo <=> mono conversion works - correctly - -2005-02-13 Benjamin Otte <otte@gnome.org> - - * gst/audioconvert/gstchannelmix.h: - include missing header file - * gst/audioconvert/gstchannelmix.c: - (gst_audio_convert_fill_compatible): - use same sign for both channels when converting to/from compatible - channel. Previously used different signs made the signals cancel - each other out and appear like silence. (fixes #167269) - -2005-02-12 Tim-Philipp Müller <tim at centricular dot net> - - * gst/ffmpegcolorspace/avcodec.h: - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: - (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt), - (gst_ffmpegcsp_avpicture_fill): - * gst/ffmpegcolorspace/imgconvert.c: - Convert to and from YV12 (fixes #156379). - -2005-02-12 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), - (gst_ximagesink_sink_link), (gst_ximagesink_change_state), - (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id), - (gst_ximagesink_expose), (gst_ximagesink_set_property), - (gst_ximagesink_finalize), (gst_ximagesink_init): Protect interface - methods from chain and negotiation and vice versa (Fixes #166142). - * sys/ximage/ximagesink.h: Add stream_lock. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), - (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), - (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_xwindow_id), - (gst_xvimagesink_expose): Check for xcontext before trying to link. - -2005-02-12 Tim-Philipp Müller <tim at centricular dot net> - - * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_open): - Don't send "Hey! You gave me a NULL pointer you naughty person" as - error message when we can't open the DVD device (when dvdnav_open() - fails, src->dvdnav is NULL, so dvdnav_err_to_string() will return - the above). Send something more useful instead (fixes #167117). - -2005-02-11 Julien MOUTTE <julien@moutte.net> - - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_put), - (gst_xvimagesink_sink_link), (gst_xvimagesink_change_state), - (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), - (gst_xvimagesink_buffer_alloc), (gst_xvimagesink_set_xwindow_id), - (gst_xvimagesink_expose), (gst_xvimagesink_set_property), - (gst_xvimagesink_finalize), (gst_xvimagesink_init): Protect interface - methods from chain and negotiation and vice versa (Fixes #166142). - Fix a possible bug of images in the buffer pool being discarded because - we are looking at the wrong geometry. - * sys/xvimage/xvimagesink.h: Add stream_lock. - -2005-02-11 David Schleef <ds@schleef.org> - - * ext/mpeg2dec/gstmpeg2dec.c: (crop_buffer): Change uint to - unsigned int. (fixes #167128) - -2005-02-11 David Schleef <ds@schleef.org> - - * gst/librfb/Makefile.am: Testing stuff before committing is - for wimps... and people with fast machines. Fix stupid - mistake. - -2005-02-11 David Schleef <ds@schleef.org> - - * configure.ac: Pull in librfb from my CVS tree, because it is - too small and annoying to be separate. Move rfbsrc plugin - to gst/. - * ext/Makefile.am: - * ext/librfb/Makefile.am: - * ext/librfb/gstrfbsrc.c: - * gst/librfb/Makefile.am: - * gst/librfb/gstrfbsrc.c: - * gst/librfb/rfb.c: - * gst/librfb/rfb.h: - * gst/librfb/rfbbuffer.c: - * gst/librfb/rfbbuffer.h: - * gst/librfb/rfbbytestream.c: - * gst/librfb/rfbbytestream.h: - * gst/librfb/rfbcontext.h: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - * gst/librfb/rfbutil.h: - -2005-02-10 Tim-Philipp Müller <tim at centricular dot net> - - * gst/speed/Makefile.am: - * gst/speed/demo-mp3.c: (main): - * gst/speed/filter.func: - * gst/speed/gstspeed.c: (speed_link), (speed_parse_caps), - (speed_class_init), (speed_init), (speed_chain_int16), - (speed_chain_float32), (speed_chain), (speed_set_property), - (speed_get_property), (speed_change_state): - * gst/speed/gstspeed.h: - Fix speed element and make it chain-based (fixes #156467), - and make it handle more than one channel. - -2005-02-10 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/dts/gstdtsdec.c: (gst_dtsdec_init), (gst_dtsdec_channels), - (gst_dtsdec_handle_event), (gst_dtsdec_handle_frame), - (gst_dtsdec_chain), (gst_dtsdec_change_state): - * ext/dts/gstdtsdec.h: - Don't clobber the stack constructing the channels array. - Make the element chain-based. DTS tracks can now be played. - -2005-02-09 Tim-Philipp Müller <tim at centricular dot net> - - * gst-libs/gst/audio/multichannel.h: - * gst-libs/gst/gconf/gconf.h: - * gst-libs/gst/idct/idct.h: - * gst-libs/gst/media-info/media-info-priv.h: - * gst-libs/gst/play/play.h: - * gst-libs/gst/resample/private.h: - * gst-libs/gst/resample/resample.h: - * gst-libs/gst/riff/riff-ids.h: - * gst-libs/gst/video/video.h: - * gst-libs/gst/video/videosink.h: - Add G_BEGIN_DECLS and G_END_DECLS around headers where - missing, so that they work when included from C++ code. - -2005-02-09 David Schleef <ds@schleef.org> - - * testsuite/gst-lint: Check for non-statically scoped - parent_class variables. This won't be a problem once - plugins are loaded with RTLD_LOCAL. - -2005-02-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/mplex/gstmplexibitstream.cc: - gcc madness. - -2005-02-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstogmparse.c: - * gst/debug/gstnavigationtest.c: - Die, thou faulty symbol pollutors (non-static parent_class). - -2005-02-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/mplex/gstmplexibitstream.cc: - Fix event handling (#165525). - -2005-02-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/mikmod/gstmikmod.c: - * gst/modplug/gstmodplug.cc: - Add missing endianness to template (fixes #165509). - -2005-02-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_data): - Fix wrong order of reading of optional bytes (#165290). - -2005-02-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): - Implement FILLER event awareness. - -2005-02-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_convert): - Fix track calculations (#166208). - -2005-02-08 Gergely Nagy <algernon@bonehunter.rulez.org> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/libpng/gstpngdec.c: (gst_pngdec_init), (gst_pngdec_chain): - * ext/libpng/gstpngenc.c: - Fix byte-order, use proper fixed caps. Fixes #164197. - -2005-02-08 Jan Schmidt <thaytan@mad.scientist.com> - - * configure.ac: - Add dvdlpcmdec - - * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_reset), - (free_all_buffers), (gst_mpeg2dec_alloc_buffer): - Don't push buffers if the src pad isn't negotiated yet. - - * gst/audioconvert/gstaudioconvert.c: - (gst_audio_convert_buffer_to_default_format), - (gst_audio_convert_buffer_from_default_format): - Add support for 24-bit width. - - * gst/dvdlpcmdec/.cvsignore: - * gst/dvdlpcmdec/Makefile.am: - * gst/dvdlpcmdec/gstdvdlpcmdec.c: (gst_dvdlpcmdec_get_type), - (gst_dvdlpcmdec_base_init), (gst_dvdlpcmdec_class_init), - (gst_dvdlpcm_reset), (gst_dvdlpcmdec_init), (gst_dvdlpcmdec_link), - (gst_dvdlpcmdec_chain), (gst_dvdlpcmdec_change_state), - (plugin_init): - * gst/dvdlpcmdec/gstdvdlpcmdec.h: - New decoder for rearranging DVD LPCM into our audio/x-raw-int - format. Needs support for the channels maps if someone can find - a DVD LPCM track with > 2 channels. - - * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_handle_dvd_event), - (gst_dvd_demux_send_discont), (gst_dvd_demux_handle_discont), - (gst_dvd_demux_get_audio_stream), (gst_dvd_demux_process_private): - * gst/mpegstream/gstdvddemux.h: - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_discont), - (gst_mpeg_demux_new_output_pad), (gst_mpeg_demux_init_stream), - (gst_mpeg_demux_send_subbuffer), (gst_mpeg_demux_handle_src_query): - * gst/mpegstream/gstmpegdemux.h: - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_reset), - (gst_mpeg_parse_parse_packhead), (gst_mpeg_parse_loop), - (gst_mpeg_parse_get_rate), (gst_mpeg_parse_convert_src), - (gst_mpeg_parse_handle_src_query), - (gst_mpeg_parse_handle_src_event): - Use audio/x-dvd-lpcm for LPCM output. - Add DTS output. - -2005-02-08 Gergely Nagy <algernon@bonehunter.rulez.org> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/alpha/gstalphacolor.c: (gst_alpha_color_sink_link), - (transform_rgb), (transform_bgr), (gst_alpha_color_chain): - Add BGRA handling (#165736). - -2005-02-08 Francis Labonte <francis_labonte@hotmail.com> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/law/alaw-decode.c: (alawdec_link): - * gst/law/alaw-encode.c: (alawenc_link): - * gst/law/mulaw-decode.c: (mulawdec_link): - * gst/law/mulaw-encode.c: (mulawenc_link): - Fix caps memleaks (#166600). - -2005-02-08 Tim-Philipp Müller <tim at centricular dot net> - - * ext/tarkin/mem.h: - * ext/tarkin/wavelet.h: - * ext/tarkin/yuv.h: - * gst/ffmpegcolorspace/avcodec.h: - Include "_stdint.h" instead of <stdint.h>. Fixes build on - systems that don't have stdint.h, like Solaris9 (fixes #166631). - -2005-02-05 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_change_state): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_clear), - (gst_xvimagesink_change_state): - Clear window on PAUSED->READY instead of READY->PAUSED. Stop - Xv video (and thereby regenerate Xv colourkey) in clear() so - that PLAY -> READY -> PLAY works (fixes #162504). - -2005-02-05 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_getcaps): - Switch to list instead of range, since MJPEG-devices really just - support decimations, not any size. - -2005-02-05 Jan Schmidt <thaytan@mad.scientist.com> - * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_open_decoder), - (gst_mpeg2dec_reset), (free_all_buffers), - (gst_mpeg2dec_alloc_buffer), (handle_sequence): - * ext/mpeg2dec/gstmpeg2dec.h: - The libmpeg2 user-allocated buffer management is awkward, - to say the least. Hopefully this fixes things. - -2005-02-04 Andy Wingo <wingo@pobox.com> - - * gst/audioconvert/bufferframesconvert.c - (buffer_frames_convert_fixate): New function, fixates to 256 - frames per buffer by default. (Much better than 1.) - (buffer_frames_convert_init): Set the fixate function for both src - and sink pad. - (buffer_frames_convert_link): After success setting nonfixed caps, - get the negotiated caps so we can know how many buffer-frames it - will be. No idea how this worked at all before. - -2005-02-05 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), - (gst_mpeg2dec_close_decoder), (put_buffer), (check_buffer), - (free_buffer), (free_all_buffers), (gst_mpeg2dec_alloc_buffer), - (handle_sequence), (handle_picture): - * ext/mpeg2dec/gstmpeg2dec.h: - Rearrange buffer tracking and refcounting and refactor - a little for readability. - -2005-02-04 Jan Schmidt <thaytan@mad.scientist.com> - * sys/v4l/gstv4l.c: (plugin_init): - * sys/v4l/gstv4ljpegsrc.c: (gst_v4ljpegsrc_get_type), - (gst_v4ljpegsrc_base_init), (gst_v4ljpegsrc_class_init), - (gst_v4ljpegsrc_init), (gst_v4ljpegsrc_src_link), - (gst_v4ljpegsrc_getcaps), (gst_v4ljpegsrc_get): - * sys/v4l/gstv4ljpegsrc.h: - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_open), (gst_v4lsrc_src_link): - * sys/v4l/v4l_calls.h: - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_palette_name), - (gst_v4lsrc_get_fps): - * sys/v4l/v4lsrc_calls.h: - Add new v4ljpegsrc for handling the ov51x hacky "I'll give - you jpeg inside rgb frames" driver. - Don't error in the v4lsrc link function, just return - REFUSED. - -2005-02-03 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_change_state), - (gst_qcamsrc_open): - Use GST_ELEMENT_ERROR, not g_warning, if open failed. - -2005-02-02 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): - Change caps on MJPEG-B so it doesn't interfere with MJPEG/JPEG. - -2005-02-02 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/raw1394/gstdv1394src.c: (gst_dv1394src_change_state): - Reset negotiated state on PAUSED->READY. - -2005-02-02 David Schleef <ds@schleef.org> - - * configure.ac: Put DEFAULT_AUDIOSINK in config.h and use - whereever possible. (Fixes #165997) - * examples/capsfilter/capsfilter1.c: (main): - * examples/dynparams/filter.c: (create_ui): - * examples/seeking/cdparanoia.c: (get_track_info), (main): - * examples/seeking/chained.c: (main): - * examples/seeking/seek.c: (make_mod_pipeline), (make_dv_pipeline), - (make_wav_pipeline), (make_flac_pipeline), (make_sid_pipeline), - (make_vorbis_pipeline), (make_mp3_pipeline), (make_avi_pipeline), - (make_mpeg_pipeline), (make_mpegnt_pipeline): - * examples/seeking/spider_seek.c: (make_spider_pipeline): - * examples/switch/switcher.c: (main): - * ext/dv/demo-play.c: (main): - * ext/faad/gstfaad.c: (gst_faad_change_state): - * ext/mad/gstmad.c: (gst_mad_chain): - * ext/smoothwave/demo-osssrc.c: (main): - * gst-libs/gst/gconf/gconf.c: (gst_gconf_set_string), - (gst_gconf_render_bin_from_description), - (gst_gconf_get_default_audio_sink), - (gst_gconf_get_default_video_sink), - (gst_gconf_get_default_audio_src), - (gst_gconf_get_default_video_src), - (gst_gconf_get_default_visualization_element): - * gst/level/demo.c: (main): - * gst/level/plot.c: (main): - * gst/playback/gstplaybin.c: (gen_video_element), - (gen_audio_element): - * gst/playback/test.c: (gen_video_element), (gen_audio_element): - * gst/playondemand/demo-mp3.c: (setup_pipeline): - * gst/sine/demo-dparams.c: (main): - * gst/spectrum/demo-osssrc.c: (main): - * gst/speed/demo-mp3.c: (main): - * gst/volume/demo.c: (main): - * testsuite/embed/embed.c: (main): - -2005-02-02 Jan Schmidt <thaytan@mad.scientist.com> - - * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_class_init), - (gst_tcpclientsink_finalize): - * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_class_init), - (gst_tcpclientsrc_finalize): - * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), - (gst_tcpserversink_init), (gst_tcpserversink_finalize): - * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_class_init), - (gst_tcpserversrc_init), (gst_tcpserversrc_finalize): - Don't leak the hostname when shutting down. - In tcpserversrc, take a copy of the default hostname. - -2005-02-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/raw1394/gstdv1394src.c: (gst_dv1394src_iso_receive): - Set caps to systemstream=TRUE. - -2005-02-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * testsuite/Makefile.am: - Fix more OSX buildbots. - -2005-02-02 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/mpeg2dec/gstmpeg2dec.c: - Don't send things to NULL PAD_PEERs - - * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_chain): - Copy-on-write the incoming buffer. - - * gst/mpegstream/gstdvddemux.h: - * gst/mpegstream/gstmpegclock.h: - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), - (normal_seek), (gst_mpeg_demux_handle_src_event): - * gst/mpegstream/gstmpegdemux.h: - * gst/mpegstream/gstmpegpacketize.h: - * gst/mpegstream/gstmpegparse.c: - (gst_mpeg_parse_update_streaminfo), (gst_mpeg_parse_reset), - (gst_mpeg_parse_handle_discont), (gst_mpeg_parse_parse_packhead), - (gst_mpeg_parse_loop), (gst_mpeg_parse_get_rate), - (gst_mpeg_parse_convert_src), (gst_mpeg_parse_handle_src_query), - (gst_mpeg_parse_handle_src_event), (gst_mpeg_parse_change_state): - * gst/mpegstream/gstmpegparse.h: - * gst/mpegstream/gstrfc2250enc.h: - Various changes to the way time is computed that make seeking and - total time estimation much better here. - Use G_BEGIN/END_DECLS instead of __cplusplus - - * gst/videocrop/gstvideocrop.c: (gst_video_crop_chain): - Use gst_buffer_stamp instead of only copying the TIMESTAMP - -2005-02-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/subparse/gstsubparse.c: - Fix OSX buildbot. - -2005-01-31 Tim-Philipp Müller <tim at centricular dot net> - - * ext/theora/theoraenc.c: (theora_buffer_from_packet), - (theora_enc_chain), (theora_enc_change_state): - * ext/vorbis/vorbisenc.c: (gst_vorbisenc_init), - (gst_vorbisenc_buffer_from_packet), (gst_vorbisenc_chain), - (gst_vorbisenc_change_state): - * ext/vorbis/vorbisenc.h: - Set granulepos and timestamp correctly for streams not - starting at 0, taking into account the initial delay. - -2005-01-31 Tim-Philipp Müller <tim at centricular dot net> - - * gst/mpegstream/gstdvddemux.c: - Add audio/x-dts to audio pad template caps - -2005-01-30 David Schleef <ds@schleef.org> - - * ext/polyp/polypsink.c: (gst_polypsink_base_init), - (create_context), (gst_polypsink_link): Fix silly endianness - bug. Add some debugging. Remove float from caps; it doesn't - work. Attempt to get remote audio working. - -2005-01-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): - Add 3IV2 fourcc. - -2005-01-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream), (swap_line), - (gst_avi_demux_invert), (gst_avi_demux_process_next_entry), - (gst_avi_demux_stream_data): - * gst/avi/gstavidemux.h: - Invert DIB images. Fixes #132341. - -2005-01-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcsp_chain): - D'oh, reference the palette data, not the palette structure. - Fixes color distortion in #132341. - -2005-01-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/videoscale/gstvideoscale.c: (gst_videoscale_link): - PAR can be non-fixed when not provided as argument (#162626). - -2005-01-29 David Moore <dcm@acm.org> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), - (gst_qtdemux_loop_header): - Re-apply patch from #142272 that allows non-seekable sources, - re-proposed by Daniel Drake <dsd@gentoo.org>. - -2005-01-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/rtp/gstrtpgsmenc.c: (gst_rtpgsmenc_init): - Use the src template for creating the src pad (#162330). - -2005-01-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * ext/musepack/Makefile.am: - * ext/musepack/gstmusepackdec.c: (gst_musepackdec_class_init), - (gst_musepackdec_init), (gst_musepackdec_dispose), - (gst_musepackdec_src_query), (gst_musepackdec_src_convert), - (gst_musepack_stream_init), (gst_musepackdec_loop), - (gst_musepackdec_change_state): - * ext/musepack/gstmusepackdec.cpp: - * ext/musepack/gstmusepackdec.h: - * ext/musepack/gstmusepackreader.c: (gst_musepack_reader_peek), - (gst_musepack_reader_read), (gst_musepack_reader_seek), - (gst_musepack_reader_tell), (gst_musepack_reader_get_size), - (gst_musepack_reader_canseek), (gst_musepack_init_reader): - * ext/musepack/gstmusepackreader.cpp: - * ext/musepack/gstmusepackreader.h: - Update to 1.1 API (#165446). - -2005-01-28 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/Makefile.am: - Unbreak buildbot. - -2005-01-28 Andy Wingo <wingo@pobox.com> - - * ext/dv/gstdvdec.c: Change the pixel aspect ratio of dvdec output - to reflect a different dubious internet source. Add a reference - and some commentary. - -2005-01-28 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gststreamselector.c: (gst_stream_selector_init), - (gst_stream_selector_get_caps), (gst_stream_selector_chain): - * gst/playback/gststreamselector.h: - Be more selective when we're redoing caps negotiation from - within the chain function on a stream change. - -2005-01-28 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * ext/Makefile.am: - * ext/amrnb/Makefile.am: - * ext/amrnb/amrnb.c: (plugin_init): - * ext/amrnb/amrnbdec.c: (gst_amrnbdec_get_type), - (gst_amrnbdec_base_init), (gst_amrnbdec_class_init), - (gst_amrnbdec_init), (gst_amrnbdec_link), (gst_amrnbdec_chain), - (gst_amrnbdec_state_change): - * ext/amrnb/amrnbdec.h: - * ext/amrnb/amrnbparse.c: (gst_amrnbparse_get_type), - (gst_amrnbparse_base_init), (gst_amrnbparse_class_init), - (gst_amrnbparse_init), (gst_amrnbparse_formats), - (gst_amrnbparse_querytypes), (gst_amrnbparse_query), - (gst_amrnbparse_handle_event), (gst_amrnbparse_reserve), - (gst_amrnbparse_loop), (gst_amrnbparse_state_change): - * ext/amrnb/amrnbparse.h: - Add support for AMR-NB (mobile phone audio format; #155163, #163286). - * gst/typefind/gsttypefindfunctions.c: (plugin_init): - Add AMR-NB/-WB raw formats. - * ext/alsa/gstalsa.c: (gst_alsa_link): - Keep valid time when changing format. - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (qtdemux_parse_trak): - Add some more format-specific options (#140141, #143555, #155163). - -2005-01-28 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_parse_blockgroup): - Fix logic error in timing of subtitle stream synchronization. - * gst/typefind/gsttypefindfunctions.c: (qt_type_find): - Add skip-chunk, which is found in kodak-camera streams. - -2005-01-27 Thomas Vander Stichele <thomas at apestaart dot org> - - * po/LINGUAS: - * po/vi.po: - Adding Vietnamese translation (submitted by Clytie Siddall) - -2005-01-27 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstdecodebin.c: (try_to_link_1): - Use realpad for signal. - -2005-01-27 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/mad/gstid3demuxbin.c: (gst_id3demux_bin_base_init): - Fix category so decodebin picks it up. - -2005-01-27 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/mad/Makefile.am: - * ext/mad/gstid3demuxbin.c: (gst_id3demux_bin_get_type), - (gst_id3demux_bin_base_init), (gst_id3demux_bin_class_init), - (gst_id3demux_bin_init), (gst_id3demux_bin_remove_pad), - (found_type), (gst_id3demux_bin_change_state): - * ext/mad/gstid3tag.c: (gst_id3_tag_add_src_pad), - (gst_id3_tag_init), (gst_id3_tag_handle_event), - (gst_id3_tag_src_link), (gst_id3_tag_chain), - (gst_id3_tag_change_state), (plugin_init): - * ext/mad/gstmad.h: - Add id3demuxbin (which is a simple bin consisting of id3demux - and typefind), take over rank from id3demux, remove typefind - code from id3demux. Makes all broken mp3s that I know of work, - and thereby fixes #152688. - -2005-01-27 Edward Hervey <bilboed@bilboed.com> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/mad/gstmad.c: (gst_mad_src_event): - * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event): - Allow seeks on audio pad, make mad forward those (#164826). - * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): - Set duration (#165335). - -2005-01-27 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_init), - (gst_asf_demux_commit_taglist), (gst_asf_demux_process_comment), - (gst_asf_demux_process_ext_content_desc), - (gst_asf_demux_change_state), (gst_asf_demux_add_audio_stream), - (gst_asf_demux_add_video_stream), (gst_asf_demux_setup_pad): - * gst/asfdemux/gstasfdemux.h: - Improve metadata display, e.g. if the metadata comes before the - streams are loaded (which is perfectly valid). - -2005-01-27 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * tools/gst-launch-ext-m.m: - Fix AVI/ASF pipelines (#165340). - -2005-01-26 Amaury Jacquot <sxpert@esitcom.org> - * ext/cairo/gsttextoverlay.c: include string.h and strings.h to fix - build failure on amd64 - -2005-01-26 Tim-Philipp Müller <tim at centricular dot net> - - * ext/mad/gstid3tag.c: (mad_id3_parse_latin1_string), - (mad_id3_parse_comment_frame), (gst_mad_id3_to_tag_list): - Check environment variables GST_ID3V2_TAG_ENCODING, - GST_ID3_TAG_ENCODING and GST_TAG_ENCODING for a colon-separated - list of character encodings to force interpretation of non-unicode - strings stored in an ID3v2 tag to a particular encoding. If none - is specified, try to use current locale's encoding, then fall back - to ISO-8859-1 (which will always succeed). (Resolves #149274) - * gst/tags/gstid3tag.c: (gst_tag_from_id3_tag), - (gst_tag_extract_id3v1_string), (gst_tag_list_new_from_id3v1): - Check environment variables GST_ID3V1_TAG_ENCODING, - GST_ID3_TAG_ENCODING and GST_TAG_ENCODING for a colon-separated - list of character encodings to use in case a string encountered - in an ID3v1 tag is not valid UTF-8 already. If no encoding is - specified, try to use the current locale's encoding, then fall - back to ISO-8859-1 (which will always succeed). - -2005-01-25 Benjamin Otte <otte@gnome.org> - - * ext/mad/gstmad.c: (gst_mad_check_caps_reset), (gst_mad_chain): - - on half framerate, compute the rate in advance so the comparisons - don't compare wrong values - - don't use mad_synth/frame_mute anymore, this mirrors mad_decoder - behaviour - - don't use mad_header_decode anymore, mad_frame_decode does that - automatically - - when getting rid of consumed bytes, reset the stream's skiplen - (fixes #163867) - -2005-01-26 Jan Schmidt <thaytan@mad.scientist.com> - - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_class_init) - Use 1/2 a second for default max_discont, as PES streams from DVB - seem to have larger spacings in the SCR. - Fix a typo. - -2005-01-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (group_commit): - Notify delayed stream-info availability. - -2005-01-26 Jan Schmidt <thaytan@mad.scientist.com> - * ext/a52dec/gsta52dec.c: (gst_a52dec_push), - (gst_a52dec_handle_event), (gst_a52dec_chain): - Add some debug output. Check that a discont has a valid - time associated. - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), - (gst_alsa_sink_loop): - Ignore TAG events. A little extra debug for broken timestamps. - * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_init), (dvdnavsrc_loop), - (dvdnavsrc_change_state): - Ensure we send a discont to engage the link before we send any - other events. - * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_init), - (dvdreadsrc_finalize), (_close), (_open), (_seek_title), - (_seek_chapter), (seek_sector), (dvdreadsrc_get), - (dvdreadsrc_uri_get_uri), (dvdreadsrc_uri_set_uri): - Handle URI of the form dvd://title,chapter,angle. Currently only - dvd://title works in totem because typefinding sends a seek that ends - up going back to chapter 1 regardless. - * ext/mpeg2dec/gstmpeg2dec.c: - * ext/mpeg2dec/gstmpeg2dec.h: - Output correct timestamps and handle disconts. - * ext/ogg/gstoggdemux.c: (get_relative): - Small guard against a null dereference. - * ext/pango/gsttextoverlay.c: (gst_textoverlay_finalize), - (gst_textoverlay_set_property): - Free memory when done. Don't call gst_event_filler_get_duration on - EOS events. Use GST_LOG and GST_WARNING instead of g_message and - g_warning. - * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init), - (draw_line), (gst_smoothwave_dispose), (gst_sw_sinklink), - (gst_sw_srclink), (gst_smoothwave_chain): - Draw solid lines, prettier colours. - * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init): - Add a default palette that'll work for some movies. - * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_init), - (gst_dvd_demux_handle_dvd_event), (gst_dvd_demux_send_discont), - (gst_dvd_demux_send_subbuffer), (gst_dvd_demux_reset): - * gst/mpegstream/gstdvddemux.h: - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_discont), - (gst_mpeg_demux_parse_syshead), (gst_mpeg_demux_parse_pes): - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init), - (gst_mpeg_parse_handle_discont), (gst_mpeg_parse_parse_packhead): - * gst/mpegstream/gstmpegparse.h: - Use PTM/NAV events when for timestamp adjustment when connected to - dvdnavsrc. Don't use many discont events where one suffices. - * gst/playback/gstplaybasebin.c: (group_destroy), - (gen_preroll_element), (gst_play_base_bin_add_element): - * gst/playback/gstplaybasebin.h: - Make sure we remove subtitles from the same bin we put them in. - * gst/subparse/gstsubparse.c: (convert_encoding), (parse_subrip), - (gst_subparse_buffer_format_autodetect), - (gst_subparse_change_state): - Fix some memleaks and invalid accesses. - * gst/typefind/gsttypefindfunctions.c: (ogganx_type_find), - (oggskel_type_find), (cmml_type_find), (plugin_init): - Some typefind functions for Annodex v3.0 files - * gst/wavparse/gstwavparse.h: - GstRiffReadClass is the correct parent class. - -2005-01-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data): - Add extradata to huffyuv (fixes #165013). - * gst-libs/gst/riff/riff-read.c: - (gst_riff_read_strf_vids_with_data): - Fix extradata extraction if it is in the chunk size. - -2005-01-25 Edward Hervey <bilboed@bilboed.com> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/effectv/gstquark.c: (gst_quarktv_class_init), - (gst_quarktv_change_state), (gst_quarktv_dispose): - Memory free'ing location fix (#164708). - -2005-01-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (group_commit), - (gen_preroll_element), (probe_triggered), (gen_source_element), - (setup_source), (gst_play_base_bin_change_state), - (gst_play_base_bin_add_element): - Don't block for streams. - * gst/playback/gststreaminfo.c: (stream_info_change_state), - (gst_stream_info_set_mute): - Use gst_pad_set_active_recursive. - -2005-01-25 Andy Wingo <wingo@pobox.com> - - * sys/v4l/gstv4lelement.c (gst_v4l_iface_supported): Fix compile - for #ifndef HAVE_XVIDEO. - -2005-01-24 Jeffrey C. Ollie - - reviewed by: Maciej Katafiasz <mathrick@freedesktop.org> - - * ext/gsm/gstgsmdec.c: (gst_gsmdec_init), (gst_gsmdec_chain): - * ext/gsm/gstgsmdec.h: - * ext/gsm/gstgsmenc.c: (gst_gsmenc_init), (gst_gsmenc_chain): - * ext/gsm/gstgsmenc.h: - Fix rate to 8kHz as per spec, removes obscure errors when no rate - was given by property. Add proper buffer timestamps and offsets. - -2005-01-24 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_audio_caps_with_data): - Audio can be <8000Hz. - -2005-01-22 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): - Explicit state change to workaround refcount bugs. - -2005-01-22 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavimux.c: (gst_avimux_write_tag), - (gst_avimux_riff_get_avi_header): - Fix... - -2005-01-19 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_element_data), - (gst_riff_read_element_data): - * gst-libs/gst/riff/riff-read.h: - Add _peek version (req'ed in CDXA). - * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_init), - (gst_cdxaparse_loop): - Fix parsing in playbin. - * gst/playback/gstdecodebin.c: (close_pad_link): - Ignore current_ pads, they cause major annoyance. - -2005-01-19 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): - Safety guard. - -2005-01-19 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavimux.c: (gst_avimux_write_tag): - Fix padding... - -2005-01-19 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/ebml-read.c: (gst_ebml_read_buffer): - Allow for 0-sized buffers. Fixes length query problems in - starwars.mkv from the testsuite. - -2005-01-19 Tim-Philipp Müller <tim at centricular dot net> - - * gst/videobox/gstvideobox.c: (gst_video_box_copy_plane_i420), - (gst_video_box_i420), (gst_video_box_chain): - Fix row strides for I420 (fixes #163159) - -2005-01-19 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): - MPEG2 has a useful rate property, so we can actually use that. - For MPEG-1, continue using the bytes/time properties. - -2005-01-19 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data), - (gst_riff_create_video_template_caps): - Add intel-h263. - -2005-01-19 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/mad/gstmad.c: (gst_mad_check_caps_reset), (gst_mad_chain): - Fail if caps negotiation fails. Should fix #162184, and should - definately be in there regardless of it fixing the actual bug. - * gst/avi/gstavimux.c: (gst_avimux_get_type), (gst_avimux_init), - (gst_avimux_write_tag), (gst_avimux_riff_get_avi_header), - (gst_avimux_riff_get_avix_header), - (gst_avimux_riff_get_video_header), - (gst_avimux_riff_get_audio_header), (gst_avimux_write_index), - (gst_avimux_start_file), (gst_avimux_handle_event), - (gst_avimux_change_state): - * gst/avi/gstavimux.h: - Refactor structure writing to use GST_WRITE_UINT macros, add - metadata writing support. - -2005-01-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gststreaminfo.c: (gst_stream_info_dispose): - Elements may already be destroyed when this function is called. - -2005-01-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), - (gst_qtdemux_loop_header), (gst_qtdemux_handle_esds): - More memory leak fixes (#149162). - -2005-01-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), - (gst_qtdemux_add_stream): - Fix two memleaks. - -2005-01-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/faad/gstfaad.c: (gst_faad_srcgetcaps): - Argh... - -2005-01-17 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/faad/gstfaad.c: (gst_faad_srcgetcaps): - Fix off-by-one bug. Fixes warnings during playback of sincity.mp4 - when fixating to six channels in Totem. - -2005-01-17 Tim-Philipp Müller <tim at centricular dot net> - - * ext/dvdread/dvdreadsrc.c: (get_next_cell_for): - Fix compile warnings on Solaris 10 buildbot - -2005-01-17 Tim-Philipp Müller <tim at centricular dot net> - - * ext/dvdread/dvdreadsrc.c: (_read): - Don't read beyond the last cell in a chapter (fixes - invalid memory access) - -2005-01-17 Tim-Philipp Müller <tim at centricular dot net> - - * ext/dvdread/stream_labels.c: - (dvdreadsrc_get_audio_stream_labels): - Use NULL for an empty GList instead of g_list_alloc(); fix - memory leaks; s/LCPM/LPCM/; use g_strdup_printf() instead - of GString (easier to bulk free later) - -2005-01-17 Gergely Nagy <algernon@bonehunter.rulez.org> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: - (gst_ffmpeg_pixfmt_to_caps): - Fix BGRA32 caps (#164209). - -2005-01-17 Gergely Nagy <algernon@bonehunter.rulez.org> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: - (gst_ffmpeg_caps_to_pixfmt): - alpha_mask can be RGBA/ABGR. Fixes #164265. - -2005-01-17 Francis Labonte <francis_labonte@hotmail.com> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/mpeg2dec/gstmpeg2dec.c: (crop_buffer), - (gst_mpeg2dec_alloc_buffer): - * ext/mpeg2dec/gstmpeg2dec.h: - Crop if decoding size is not the actual image size (#163676). - -2005-01-17 Steve Baker <steve@stevebaker.org> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/typefind/gsttypefindfunctions.c: (aiff_type_find), - (svx_type_find), (sds_type_find), (ircam_type_find), (plugin_init): - Add libsndfile typefind functions (#163309). - -2005-01-17 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * tools/gst-launch-ext-m.m: - Add .aac, fix .m1v/.m2v (#163891). - -2005-01-17 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsaclock.c: (gst_alsa_clock_wait): - Sanity check, don't wait endlessly since the clock might not - actually run at this point (which is a deadlock). Fixes #164069. - -2005-01-16 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (probe_triggered): - Of course, only pause if group is done... - -2005-01-16 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (probe_triggered): - Thread safety. - -2005-01-16 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/swfdec/gstswfdec.c: (gst_swfdec_change_state): - Don't return state change success when the parent - failed. - -2005-01-16 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavimux.c: (gst_avimux_handle_event): - Free events (fix memleak in #162905). - -2005-01-15 Gergely Nagy <algernon@bonehunter.rulez.org> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: - (gst_ffmpeg_caps_to_pixfmt): - Fix for depth = 15. Fixes #161675. - -2005-01-14 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_getcaps): - Set FPS correctly, even for webcams and the like. - * sys/v4l/v4l_calls.c: (gst_v4l_set_chan_norm): - Don error on setting while capturing. - -2005-01-14 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * ext/dv/gstdvdec.c: - * gst/subparse/gstsubparse.c: (parse_mdvdsub): - * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect): - I'm a bad boy. using /1001. to force C to do float division - and not integer division (as it did in my last commit) - Thanks to David I. Lehn for pointing this mistake. - -2005-01-14 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l/gstv4lelement.c: (gst_v4l_iface_supported): - Revert Johan´s 1.35->1.36 since it breaks compat. - -2005-01-14 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * ext/dv/gstdvdec.c: - * ext/libfame/gstlibfame.c: - * gst/subparse/gstsubparse.c: (parse_mdvdsub): - * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect): - replace framerate aproximations by their real value - (24000/1001, 30000/1001, 60000/1001) - Finish fixing bug #164049 - -2005-01-13 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/ogg/gstoggmux.c: - eos/bos debugging - * gst/tcp/gstmultifdsink.c: - * gst/tcp/gstmultifdsink.h: - * gst/tcp/gsttcp.c: - * gst/tcp/gsttcp.h: - * gst/tcp/gsttcpclientsink.c: - * gst/tcp/gsttcpclientsrc.c: - * gst/tcp/gsttcpserversink.c: - * gst/tcp/gsttcpserversrc.c: - improve reusability of elements after state changes and errors - make multifdsink throw away streamheaders when receiving new ones - -2005-01-13 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsa.c: (gst_alsa_rates_probe): - Fix for if items are already in list... - -2005-01-12 Benjamin Otte <otte@gnome.org> - - * gst/adder/gstadder.c: (gst_adder_loop): - fix adder a bit so it doesn't screw up with events as much anymore - -2005-01-12 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_link), - (pixbufscale_scale), (gst_pixbufscale_chain): - * ext/gdk_pixbuf/pixbufscale.h: - Incorporate changes from Tim-Philipp Mueller <t.i.m@orange.net> - to ensure rowstrides are calculated the same way as - ffmpegcolorspace - Use gst_buffer_stamp instead of copying TIMESTAMP manually, so - that we pick up duration and offset also. - -2005-01-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavimux.c: (gst_avimux_class_init), - (gst_avimux_pad_unlink), (gst_avimux_release_pad): - Reusability fixes. - -2005-01-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_update), - (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), - (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record), - (gst_alsa_mixer_set_option), (gst_alsa_mixer_get_option): - Update flags when requested. - -2005-01-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsa.c: (gst_alsa_rates_probe): - Fix dmix. - -2005-01-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), - (gst_play_base_bin_init), (gst_play_base_bin_dispose), - (probe_triggered), (new_decoded_pad), (gen_source_element), - (gst_play_base_bin_set_property), (gst_play_base_bin_get_property): - * gst/playback/gstplaybasebin.h: - * gst/playback/gstplaybin.c: (gst_play_bin_class_init), - (gst_play_bin_init), (group_switch), (remove_sinks), (setup_sinks), - (gst_play_bin_change_state): - Implement group-switch signal for use in apps to clear metadata - cache, clean up subtitle, add suburi property instead of # hack, - some error-out fixes. - -2005-01-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): - Debug. - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_grab_frame): - If we got a state change in the _get handler, don't return success. - -2005-01-10 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * ext/jpeg/gstjpegdec.c: (gst_jpegdec_my_output_message), - (gst_jpegdec_my_emit_message), (gst_jpegdec_init): - Make jpegdec quiet on MJPEG decoding - * gst/asfdemux/README: - Fix mimetypes for MJPEG and H263 - -2005-01-10 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/theora/theoradec.c: (theora_dec_chain): - Fix broken code generation by gcc by swapping arguments. - * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query): - Fix \n in debug. - -2005-01-10 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * TODO: - delete this file, it is by far outdated - * ext/alsa/gstalsa.1: remove - * ext/alsa/gstalsa.c: (add_rates), (add_channels), (gst_alsa_caps), - (gst_alsa_check_sample_rates), (gst_alsa_rates_probe), - (gst_alsa_get_caps): - Add HW probing for supported sample rates. Fixes #161704 - -2005-01-10 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): - Don't crash, biatch! :). - -2005-01-10 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/musepack/gstmusepackreader.cpp: - * gst/apetag/apedemux.c: (gst_ape_demux_stream_data): - Some work on tags - still doesn't work in playbin... - * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): - Handle events... - -2005-01-10 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (qtdemux_parse_tree): - Also shove tags on kid pads. - -2005-01-10 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_use_event): - Don't bail on unknown events. - * gst/audioscale/gstaudioscale.c: (gst_audioscale_chain): - Don't crash on events before negotiation. - * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): - Send tags on pads, too. - * gst/playback/gststreamselector.c: - (gst_stream_selector_request_new_pad): - Forward events on first pad if no input was selected yet. - -2005-01-10 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (setup_substreams): - Don't disable streamtype if the stream doesn't exist, since - then playing a video after audio will disable both and nothing - will happen. Fixes the testsuite. - -2005-01-10 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l/gstv4lxoverlay.c: (gst_v4l_xoverlay_interface_init), - (gst_v4l_xoverlay_set_xwindow_id): - * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_interface_init), - (gst_v4l2_xoverlay_set_xwindow_id): - Add debug categories, fix overlay disabling. - -2005-01-10 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * ext/alsa/gstalsa.c: (gst_alsa_class_init), (gst_alsa_get_caps): - * ext/alsa/gstalsa.h: - Add HW probing for period_count/size and buffer_size MIX/MAX - Adjust default/user defined value if out of bounds - Should fix bug #162024 - -2005-01-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event): - Fix warning (#161191). - -2005-01-09 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * ext/dvdread/stream_labels.c: - (dvdreadsrc_get_audio_stream_labels): - Fix warning (init the good variable in switch default) - -2005-01-09 Koop Mast <kwm@rainbow-runner.nl> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/tta/gstttaparse.c: (gst_tta_src_event): - Fix gcc-2.95 compile (#163485). - -2005-01-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * ext/flac/gstflacenc.c: (gst_flacenc_init), - (gst_flacenc_seek_callback), (gst_flacenc_write_callback), - (gst_flacenc_tell_callback), (gst_flacenc_chain), - (gst_flacenc_change_state): - * ext/flac/gstflacenc.h: - Update for API change in flac-1.1.1. Update requirement in - configure.ac. Fixes #162974. - -2005-01-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (group_destroy): - Remove hack to get rid of assert and get rid of unlinked - signals properly. - -2005-01-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (setup_source): - Set source to NULL so that resources are free'ed. Fixes issues - with playback of CDDA and similar device-accessing things. - -2005-01-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * testsuite/embed/Makefile.am: - test->noinst, fix make test in buildbot. - -2005-01-09 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * ext/dvdread/stream_labels.c: new file - * ext/dvdread/stream_labels.h: new file - * ext/dvdread/Makefile.am: - * ext/dvdread/dvdreadsrc.c: (_seek_title): - Extract audio stream label from DVD IFO files. - It only dump them on the console for now, still have to - make playbin aware of them. - -2005-01-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (setup_source): - Fix hanging subs. - -2005-01-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init), - (gen_preroll_element), (remove_groups), (setup_subtitle), - (gen_source_element), (setup_source): - * gst/playback/gstplaybasebin.h: - Multiple .sub files is just a stupid idea... Fix some threading - mistakes. Interestingly, external .sub files cause playbin to - hang, I don't know why... Parsing fixes contributed by François - Kooman <fkooman@tuxed.net>. - -2005-01-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * testsuite/embed/Makefile.am: - Fix buildbot. - -2005-01-09 Gergely Nagy <algernon@bonehunter.rulez.org> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), - (gst_pngenc_init), (gst_pngenc_chain), (gst_pngenc_get_property), - (gst_pngenc_set_property): - * ext/libpng/gstpngenc.h: - Add compression level property (#163323). - -2005-01-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * examples/capsfilter/capsfilter1.c: (main): - * examples/seeking/spider_seek.c: (make_spider_pipeline): - * ext/dvdread/Makefile.am: - * ext/dvdread/demo-play: - * ext/dvdread/demo-play.c: - * gconf/gstreamer.schemas.in: - * gst-libs/gst/gconf/gconf.c: - * sys/v4l/TODO: - * testsuite/Makefile.am: - * testsuite/embed/Makefile.am: - * testsuite/embed/embed.c: (cb_expose), (main): - Remove all references to xvideosink, fix examples (#140845). - * gst/playback/gstplaybasebin.c: (group_destroy): - Apparently, disposal does not unlink - so do explicitely. - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): - Add debug. - -2005-01-09 Maciej Katafiasz <mathrick@freedesktop.org> - - * README: fix PKG_CONFIG_PATH instructions, what was there - previously was breaking default search path, not nice. - Fixes #163358 - -2005-01-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/audioscale/gstaudioscale.c: (gst_audioscale_init), - (gst_audioscale_chain): - %#^@^#@^@#^#@^#@^@#^@#^@#^@#^#@^#@^#@^@#^#@ fix seeking - when resampling - how the ^@$^!@^! is this possible?!? - -2005-01-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsa.c: (gst_alsa_change_state): - Reset variables on READY. - * gst/matroska/matroska-mux.c: (gst_matroska_mux_request_new_pad), - (gst_matroska_mux_loop): - Require data before writing header. - -2005-01-09 Francis Labonte <francis_labonte@hotmail.com> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/mad/gstmad.c: (gst_mad_chain): - Don't call mad_stream_sync() directly after recovering sync. - Fixes #151661. - -2005-01-09 Martin Eikermann <meiker@upb.de> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init), - (snapshot_handler), (gst_snapshot_sinkconnect), - (gst_snapshot_chain): - Allocate resources when required, fix recursive signal emission - and fix caps. Fixes #161667. - -2005-01-09 Gergely Nagy <algernon@bonehunter.rulez.org> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/libpng/gstpngdec.c: (gst_pngdec_src_getcaps), - (gst_pngdec_chain): - Handle only 8-bppc (bits-per-pixel-component) images, better - error handling and correct strides. Fixes #163177. - * ext/libpng/gstpngenc.c: (gst_pngenc_sinklink), - (gst_pngenc_chain): - Better error handling. Fixes #163348. - -2005-01-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_get_type), - (dvdnavsrc_uri_get_type), (dvdnavsrc_uri_get_protocols), - (dvdnavsrc_uri_get_uri), (dvdnavsrc_uri_set_uri), - (dvdnavsrc_uri_handler_init): - Add DVD-nav URI (dvdnav://) for Totem testing purposes. - * gst/playback/gstplaybasebin.c: (gen_source_element): - Add MMS to streaming URIs. - -2005-01-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_navigation_send_event): - * sys/xvimage/xvimagesink.c: - (gst_xvimagesink_navigation_send_event): - Check for pad availability before sending event. - -2005-01-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-plugins.spec.in: - Add subparse. - -2005-01-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - Since we use functions from CVS, up requirement. - -2005-01-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/Makefile.am: - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), - (group_destroy), (group_commit), (group_is_muted), - (gen_preroll_element), (add_stream), (unknown_type), - (probe_triggered), (preroll_unlinked), (mute_stream), - (silence_stream), (new_decoded_pad), (setup_substreams), - (setup_source), (get_active_source), (mute_group_type), - (muted_group_change_state), (set_active_source), - (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), - (play_base_eos), (gst_play_base_bin_change_state): - * gst/playback/gstplaybasebin.h: - * gst/playback/gstplaybin.c: (add_sink), (setup_sinks): - * gst/playback/gststreaminfo.c: (gst_stream_info_class_init), - (gst_stream_info_dispose), (stream_info_mute_pad), - (stream_info_change_state), (gst_stream_info_set_mute): - * gst/playback/gststreamselector.c: (gst_stream_selector_get_type), - (gst_stream_selector_base_init), (gst_stream_selector_class_init), - (gst_stream_selector_init), (gst_stream_selector_dispose), - (gst_stream_selector_get_linked_pad), - (gst_stream_selector_get_caps), (gst_stream_selector_link), - (gst_stream_selector_get_linked_pads), - (gst_stream_selector_request_new_pad), (gst_stream_selector_chain): - * gst/playback/gststreamselector.h: - Adding stream selection support plus required properties for - applications to use this. Fully fixes #100931. - -2005-01-08 Benjamin Otte <otte@gnome.org> - - * gst/games/gstpuzzle.c: (nav_event_handler): - - handle nav events differently: forward every event no matter if it - was handled or not. - - translate events - You can now cheat by using navigationtest ! puzzle and moving the - mouse close to the edge of a tile. ;) - -2005-01-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * ext/ogg/gstoggdemux.c: (gst_ogg_pad_new): - * ext/ogg/gstogmparse.c: (gst_ogm_text_parse_get_type), - (gst_ogm_text_parse_base_init), (gst_ogm_text_parse_init), - (gst_ogm_parse_get_sink_querytypes), (gst_ogm_parse_sink_convert), - (gst_ogm_parse_sink_query), (gst_ogm_parse_chain), - (gst_ogm_parse_plugin_init): - * ext/pango/gsttextoverlay.c: (gst_textoverlay_linkedpads), - (gst_textoverlay_link), (gst_textoverlay_getcaps), - (gst_textoverlay_event), (gst_textoverlay_video_chain), - (gst_textoverlay_loop), (gst_textoverlay_init), (plugin_init): - * ext/pango/gsttextoverlay.h: - * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), - (gst_matroska_demux_handle_seek_event), - (gst_matroska_demux_sync_streams), - (gst_matroska_demux_parse_blockgroup), - (gst_matroska_demux_subtitle_caps), - (gst_matroska_demux_plugin_init): - * gst/matroska/matroska-ids.h: - * gst/playback/gstdecodebin.c: (close_pad_link): - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init), - (gen_preroll_element), (remove_groups), (add_stream), - (new_decoded_pad), (setup_subtitles), (gen_source_element), - (setup_source): - * gst/playback/gstplaybasebin.h: - * gst/playback/gstplaybin.c: (gen_text_element), (setup_sinks): - * gst/subparse/Makefile.am: - * gst/subparse/gstsubparse.c: (gst_subparse_get_type), - (gst_subparse_base_init), (gst_subparse_class_init), - (gst_subparse_init), (gst_subparse_formats), - (gst_subparse_eventmask), (gst_subparse_event), - (gst_subparse_handle_event), (convert_encoding), (get_next_line), - (parse_mdvdsub), (parse_mdvdsub_init), (parse_subrip), - (parse_subrip_deinit), (parse_subrip_init), (parse_mpsub), - (parse_mpsub_deinit), (parse_mpsub_init), - (gst_subparse_buffer_format_autodetect), - (gst_subparse_format_autodetect), (gst_subparse_loop), - (gst_subparse_change_state), (gst_subparse_type_find), - (plugin_init): - * gst/subparse/gstsubparse.h: - * gst/typefind/gsttypefindfunctions.c: (ogmtext_type_find), - (plugin_init): - Add subtitle support, .sub parser (supports SRT and MPsub), - OGM text support, Matroska UTF-8 text support, deadlock fixes - all over the place, subtitle awareness in decodebin/playbin - and some fixes to textoverlay to handle subtitles in a stream - correctly. Fixes #100931. - -2005-01-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query): - Check for pad availability before doing a query on it. - -2005-01-08 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * ext/dv/gstdvdec.c: - really fix bpp24/32 dvdec caps (classic rgba indeed) - * gst/asfdemux/gstasfdemux.c: - (gst_asf_demux_process_ext_content_desc): - don't send text tags if they are empty (bis repetita) - -2005-01-08 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * ext/dv/gstdvdec.c: - remove unneeded comment from dvdec - (related to DV 4CC codes in AVI files) - moved them in gstreamer/docs/random/mimetypes - * gst/asfdemux/gstasfdemux.c: - (gst_asf_demux_process_ext_content_desc): - don't send text tags if they are empty - fix mem leak on error path - * gst/ffmpegcolorspace/avcodec.h: - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: - (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt), - (gst_ffmpegcsp_avpicture_fill): - * gst/ffmpegcolorspace/imgconvert.c: (img_get_alpha_info): - * gst/ffmpegcolorspace/imgconvert_template.h: - adds BGR32 and BGRA32 to ffmpegcolorspace - (still bad colors, fixing it on next commit) - helps with dvdec outputing BGR32 - -2005-01-08 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * ext/dv/gstdvdec.c: - Fix audio caps i just broke (missing ',') - * gst/matroska/matroska-mux.c: (gst_matroska_mux_get_type), - (gst_matroska_mux_reset): - Fix typo + add FIXME about old "x-gst-metadata" crap - -2005-01-07 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * ext/dv/demo-play.c: (main): - xvideosink -> xvimagesink - * ext/dv/gstdvdec.c: - change rgb 32/32 caps to 24/32 (no alpha) - change nb of channels to be a list (2 or 4, not 2) - change sample rate to be a list (32, 44.1, 48 kHz) not a range - * gst/asfdemux/gstasfdemux.c: - (gst_asf_demux_process_ext_content_desc): - Add 'date/year' to extracted metadata list - -2005-01-07 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): - The return value of fixate_to does not imply that the requested - value was set, so don't assume. - -2005-01-07 Gergely Nagy <algernon@bonehunter.rulez.org> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/libpng/gstpngdec.c: - * ext/libpng/gstpngenc.c: (gst_pngenc_base_init), - (gst_pngenc_sinklink), (gst_pngenc_init), (gst_pngenc_chain): - * ext/libpng/gstpngenc.h: - Alpha support (encoder; #163161), mime fixage. - -2005-01-07 Sebastien Cote <sc5@hermes.usherb.ca> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/faac/gstfaac.c: (gst_faac_outputformat_get_type), - (gst_faac_class_init), (gst_faac_init), (gst_faac_srcconnect), - (gst_faac_set_property), (gst_faac_get_property): - * ext/faac/gstfaac.h: - Allow for ADTS output (#153434). - -2005-01-07 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_getcaps): - Fix against template (#150576). - -2005-01-06 Benjamin Otte <otte@gnome.org> - - * gst/games/gstpuzzle.c: (draw_puzzle): - don't draw a puzzle if either width or height of tiles would be 0. - -2005-01-06 Benjamin Otte <otte@gnome.org> - - * gst/games/gstpuzzle.c: (gst_puzzle_get_type), - (gst_puzzle_class_init), (gst_puzzle_finalize): - no memleaks, please - (gst_puzzle_create), (gst_puzzle_init), - (gst_puzzle_set_property), (gst_puzzle_setup): - change initialization code around so we don't reshuffle on resize - (draw_puzzle): - fix another stupid typo - -2005-01-06 Benjamin Otte <otte@gnome.org> - - * gst/games/gstvideoimage.c: (copy_hline_YUY2): - fix stupid typo that borked copying on YUY2 - -2005-01-06 Benjamin Otte <otte@gnome.org> - - * gst/games/gstpuzzle.c: (draw_puzzle): - fix edges when image sizes aren't multiples of tile sizes - -2005-01-06 Benjamin Otte <otte@gnome.org> - - * gst/games/gstpuzzle.c: (gst_puzzle_base_init): - make RGB endianness work correctly - (gst_puzzle_show), (gst_puzzle_swap), (gst_puzzle_move): - refactor and fix race with initial shuffling - (nav_event_handler): - allow using the mouse to puzzle - (draw_puzzle): - insist on tiles having width and height as multiples of 4 to get - clean YUV image handling - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), - (gst_xvimagesink_handle_xevents), (gst_xvimagesink_buffer_alloc): - s/DEBUG/LOG/ for common messages - (gst_xvimagesink_navigation_send_event): - fix mouse event translation to not include screen PAR - * sys/ximage/ximagesink.c: (gst_ximagesink_navigation_send_event): - fix mouse event translation to actually work - -2005-01-06 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * gst/asfdemux/gstasfdemux.c: - (gst_asf_demux_process_ext_content_desc): - Extract TrackNumber metadata + clean up code - * gst/games/gstvideoimage.c: (gst_video_image_draw_rectangle): - Hope this is the good fix (var used unitialised) - -2005-01-06 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/faad/gstfaad.c: (gst_faad_chain): - Only increment timestamp if it's valid. Fixes raw AAC streams. - -2005-01-06 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * configure.ac: - * gst/games/Makefile.am: - * gst/games/gstpuzzle.c: - add a puzzle game with... - * gst/games/gstvideoimage.c: - * gst/games/gstvideoimage.h: - ... full colorspace support (that includes YUV9 and RGB16)) stolen - from videotestsrc and made into something that would be a nice - library for a lot of other plugins. - -2005-01-06 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * configure.ac: - don't compile faad plugin if a RC of 2.0 is found - Fixes #155346 (and FC1 buildbot) - * gst/asfdemux/gstasfdemux.c: - (gst_asf_demux_process_ext_content_desc): - try to make Solaris compiler happier - -2005-01-06 Paul Jack <pjack@sfaf.org> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init): - Fix segfault (#161667). - -2005-01-05 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_getcaps): - Fix framerate reporting. - -2005-01-05 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr> - - * gst-libs/gst/riff/riff-ids.h: - * gst/wavenc/riff.h: - Add AMR (VBR and CBR) ids to riff.h audio codec list - * gst/asfdemux/gstasfdemux.c: - (gst_asf_demux_process_ext_content_desc), - (gst_asf_demux_process_object): - Retrieve more tags from ASF files (Genre, AlbumTitle, Artist) - -2005-01-05 Martin Eikermann <meiker@upb.de> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), - (gst_dvd_demux_handle_discont): - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_class_init), - (gst_mpeg_demux_handle_discont): - Recreate pads on new-media (#160730). - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_new_pad): - Send discont even if manager changes timestamps (#161929). - -2005-01-05 Sebastien Cote <sc5@hermes.usherb.ca> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/resample/resample.c: (gst_resample_sinc_ft_s16): - Fix invalid memory access (#159211). - -2005-01-05 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * examples/gstplay/player.c: (main): - Don't iterate. - * examples/seeking/seek.c: (fixate), (make_playerbin_pipeline): - Add visualizations. - * ext/a52dec/gsta52dec.c: (gst_a52dec_push), - (gst_a52dec_handle_frame): - Set duration. - * ext/dvdnav/gst-dvd: - Add audioconvert. Fixes #161325. - * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_get): - Explicitely case to gint64. Possible valgrind error. - * gst-libs/gst/play/play.c: (caps_set), (setup_size), - (gst_play_tick_callback), (gst_play_change_state), - (gst_play_dispose), (gst_play_init), (gst_play_class_init), - (gst_play_set_location), (gst_play_get_location), - (gst_play_seek_to_time), (gst_play_set_data_src), - (gst_play_set_video_sink), (gst_play_set_audio_sink), - (gst_play_set_visualization), (gst_play_connect_visualization), - (gst_play_get_framerate), (gst_play_get_all_by_interface), - (gst_play_new): - Use playbin. Fixes #139749 and #147744. - * gst/apetag/apedemux.c: (gst_ape_demux_parse_tags): - Add genre tag. - * gst/audioscale/gstaudioscale.c: (gst_audioscale_method_get_type), - (audioscale_get_type), (gst_audioscale_base_init), - (gst_audioscale_class_init), (gst_audioscale_expand_caps), - (gst_audioscale_getcaps), (gst_audioscale_fixate), - (gst_audioscale_link), (gst_audioscale_get_buffer), - (gst_audioscale_decrease_rate), (gst_audioscale_increase_rate), - (gst_audioscale_init), (gst_audioscale_dispose), - (gst_audioscale_chain), (gst_audioscale_set_property), - (gst_audioscale_get_property), (plugin_init): - Indent properly. - * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private): - Fix LPCM. - * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta), - (qtdemux_tag_add_str), (qtdemux_tag_add_num), - (qtdemux_tag_add_gnre), (qtdemux_video_caps): - Add more metadata (fixes #162656). - -2005-01-05 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - back to cvs - -=== release 0.8.7 === - -2005-01-05 Thomas Vander Stichele <thomas at apestaart dot org> - - * NEWS: - * RELEASE: - * configure.ac: - releasing 0.8.7, "Hyperspace" - -2005-01-05 Thomas Vander Stichele <thomas at apestaart dot org> - - patch by: Tim-Philipp Müller <t.i.m@zen.co.uk> - - * gst/playback/gstplaybasebin.c: - Fix for #162924 - free caps after use, not before - -2005-01-04 Thomas Vander Stichele <thomas at apestaart dot org> - - patch by: Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: - * gst/wavparse/gstwavparse.c: - Fix for #154773 - fixes playback of small .wav files - -2005-01-03 Thomas Vander Stichele <thomas at apestaart dot org> - - patch by: Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/audioscale/gstaudioscale.c: - Fix for #162819 - make audioscale reusable - Fixes playback of more than one file with playbin/totem - -2004-12-29 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/ffmpegcolorspace/avcodec.h: - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: - * gst/ffmpegcolorspace/imgconvert.c: - clean up the mess that made me cry and avoid needless duplication - -2004-12-29 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/ffmpegcolorspace/imgconvert.c: - give some indication of why we're segfaulting - -2004-12-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - Fix indentation, fix v4l2 plugin detection. - * ext/Makefile.am: - Fix libmms location (Maciej, use diff -u!). - * ext/alsa/gstalsa.c: (gst_alsa_init): - Initialize caps cache to NULL. - * gst/playback/gstplaybin.c: (gst_play_bin_change_state): - Only change state on audiosink if it exists. - -2004-12-28 Maciej Katafiasz <mathrick@mathrick.org> - - * gst/matroska/matroska-demux.c: - * gst/matroska/matroska-ids.h: - * gst/matroska/matroska-demux.h: - Fix Vorbis streams failing to decode in some files, where cluster_time - isn't 0, because then it doesn't send codec_priv before actual data. - Remove time-based test and replace it with marker set on beginning of - new stream - -2004-12-28 David Schleef <ds@schleef.org> - - Merge patch from Ronald fixing problems with streaming - text. - * ext/cairo/gstcairo.c: (plugin_init): - * ext/cairo/gsttextoverlay.c: (gst_textoverlay_render_text), - (gst_text_overlay_blit_1), (gst_text_overlay_blit_sub2x2), - (gst_textoverlay_video_chain), (gst_textoverlay_loop), - (gst_textoverlay_font_init), (gst_textoverlay_init), - (gst_textoverlay_set_property): - * ext/cairo/gsttextoverlay.h: - -2004-12-27 David Schleef <ds@schleef.org> - - * ext/cairo/gsttextoverlay.c: (gst_textoverlay_render_text), - (gst_text_overlay_blit_1), (gst_text_overlay_blit_sub2x2), - (gst_textoverlay_video_chain), (gst_textoverlay_loop), - (gst_textoverlay_font_init), (gst_textoverlay_init), - (gst_textoverlay_set_property): Improvements to actually - render text as white on black outline on video, including - font selection and horizontal/vertical alignment. (Ronald's - christmas present) - * ext/cairo/gsttextoverlay.h: - -2004-12-26 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * ext/ogg/gstogg.c: - * ext/ogg/gstogmparse.c: - fix ogmaudio/videoparse plugin registration - (riff won't load if bytestream is already loaded) - -2004-12-24 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/audioconvert/gstchannelmix.c: - fix for GLIB < 2.4 - -2004-12-24 Thomas Vander Stichele <thomas at apestaart dot org> - - * Makefile.am: - * configure.ac: - disable docs again until it actually passes make distcheck. - -2004-12-24 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (qtdemux_type_get), (qtdemux_audio_caps): - * gst/typefind/gsttypefindfunctions.c: (q3gp_type_find), - (plugin_init): - Add 3GP (variables name Q3GP because they can't start with a - number). Add samr audio fourcc (used in .3gp files), decoder - is work in progress. Also do a GST_WARNING instead of ERROR - in case of unknown nodes, to decrease output. - -2004-12-24 Thomas Vander Stichele <thomas at apestaart dot org> - - * Makefile.am: - really fix dist - -2004-12-23 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - * ext/speex/gstspeexdec.h: - * ext/speex/gstspeexenc.h: - Fixes #158382. Make speex plugin compatible with both 1.0 and 1.1. - Fix detection code in configure.ac - -2004-12-23 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_parse_blockgroup): - Save position, so that queries give proper return values. Don't - know how this could ever have worked before... - -2004-12-23 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - Put additional LAME check inside the conditional. Fixes #152339 - -2004-12-23 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), - (gst_avi_demux_stream_scan): - Add some more debug. Fix logic error when setting movi offset - while reading index. - -2004-12-23 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), - (gst_avi_demux_stream_scan), (gst_avi_demux_handle_seek), - (gst_avi_demux_process_next_entry): - Add some debugging. Better detection of broken indexes and the - accompanying index recovery. No infinite loops on state changes - when we're still in our loopfunction. - -2004-12-22 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - Fix up. - -2004-12-22 Archana Shah <archana.shah@wipro.com> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/sunaudio/gstsunmixer.c: (gst_sunaudiomixer_set_volume): - Normalizing the value before setting - (gst_sunaudiomixer_get_volume): - Normalizing the value after getting. Fixes bug# 161980 - -2004-12-22 Christian Fredrik Kalager Schaller <uraeus@gnome.org> - - * Makefile.am: Make sure docs gets disted - * docs/Makefile.am: Make sure all needed files get disted - * gst-plugins.spec.in: latest updates - -2004-12-22 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): - Revert patch 1.38 as clock distribution over schedulers does - not work correcly in the core yet. - -2004-12-21 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * sys/oss/README: remove this file, which predates my birth - (and which content is by far outdated) - -2004-12-20 Stefan Kost <ensonic@users.sf.net> - - * Makefile.am: - * configure.ac: - * docs/Makefile.am: - * docs/libs/Makefile.am: - * docs/libs/gst-plugins-libs-docs.sgml: - * docs/libs/gst-plugins-libs-sections.txt: - * docs/libs/tmpl/gstgconf.sgml: - * docs/upload.mak: - * docs/version.entities.in: - Added boilerplate gtk-doc files for plugin-libs documentation. - -2004-12-19 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/auparse/gstauparse.c: fix int and float audio caps - -2004-12-19 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l/gstv4lelement.c: (gst_v4l_iface_supported): - * sys/v4l2/gstv4l2element.c: (gst_v4l2_iface_supported): - g_assert() can be a macro, don't use #ifdef inside it. - -2004-12-19 Edward Hervey <bilboed@bilboed.com> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/videorate/gstvideorate.c: (gst_videorate_blank_data), - (gst_videorate_init), (gst_videorate_chain), - (gst_videorate_change_state): - Event handling (fixes #159986). - -2004-12-19 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data): - Add BLZ0 (Blizzard's version of DivX) fourcc. - -2004-12-18 David Schleef <ds@schleef.org> - - * gst/tta/gstttadec.c: (gst_tta_dec_link): And yet another - portability fix. - -2004-12-18 David Schleef <ds@schleef.org> - - * gst/tta/ttadec.h: Disable some header code that isn't used - and clearly isn't portable. - -2004-12-18 David Schleef <ds@schleef.org> - - * gst/ffmpegcolorspace/imgconvert.c: (get_pix_fmt_info), - (avcodec_get_chroma_sub_sample), (avcodec_get_pix_fmt_name), - (avcodec_get_pix_fmt), (avpicture_layout), - (avcodec_get_pix_fmt_loss), (avg_bits_per_pixel), (img_copy), - (get_convert_table_entry), (img_convert), (img_get_alpha_info): - Fix code to not use GCC extensions (and c99 extensions that - Forte does not like.) - -2004-12-19 Tim-Philipp Müller <t.i.m@zen.co.uk> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_link), - (gst_deinterlace_chain): - Rowstride fixes. Fixes #161039. - * gst/videocrop/gstvideocrop.c: (gst_video_crop_init), - (gst_video_crop_get_property), (gst_video_crop_add_to_struct_val), - (gst_video_crop_getcaps), (gst_video_crop_link), - (gst_video_crop_i420), (gst_video_crop_chain), - (gst_video_crop_change_state): - Rework of negotiation. Actually works now. Fixes #158650. - -2004-12-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/matroska-demux.c: (gst_matroska_ebmlnum_sint): - That was very stupid. - -2004-12-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_parse_blockgroup): - Fix possible crasher. - -2004-12-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/matroska-demux.c: (gst_matroska_ebmlnum_uint), - (gst_matroska_ebmlnum_sint), (gst_matroska_demux_parse_blockgroup): - Lace sizes can be zero. - -2004-12-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/musepack/gstmusepackdec.cpp: - Fetch error return values. Fixes #161624. - * gst/apetag/apedemux.c: (gst_ape_demux_stream_data): - Really EOS. - -2004-12-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index): - Work for truncated (unfinished download etc.) files. Fixes #160514. - -2004-12-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): - Fix for integer overflow. Makes #156001 not crash. Probably masks - the real bug. - -2004-12-17 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/ac3parse/gstac3parse.c: (plugin_init): - Parsers never have ranks. Fixes #159651. - -2004-12-17 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/playback/gstdecodebin.c: (compare_ranks): - make sure the facotries are ordered the same every time even if they - have the same rank by using the name - * gst/playback/gstdecodebin.c: (find_compatibles): - make sure we don't add factories to the list twice - -2004-12-16 David Schleef <ds@schleef.org> - - * configure.ac: look for musepack headers as musepack/*.h - (fixes #159847) - * ext/musepack/gstmusepackdec.h: use <musepack/*.h> - * ext/musepack/gstmusepackreader.h: same - -2004-12-17 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-read.c: - (gst_riff_read_strf_auds_with_data): - Read extradata correctly (fixes #155879). - -2004-12-16 David Schleef <ds@schleef.org> - - * gst/audioscale/gstaudioscale.c: allow passthru of >2 channel - audio. does _not_ attempt or allow conversion unless channels - is 1 or 2. - -2004-12-16 Christian Fredrik Kalager Schaller <uraeus@gnome.org> - - * tools/gst-launch-ext-m.m: fix mpeg and vob pipelines - -2004-12-16 David Schleef <ds@schleef.org> - - * gst/audioscale/gstaudioscale.c: the resample library only - handles 1 or 2 channels. Change caps to compensate. - -2004-12-16 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/matroska-demux.c: (aac_rate_idx), (aac_profile_idx), - (gst_matroska_demux_audio_caps): - Some MPEG-AAC hacks, because else it doesn't work... - -2004-12-16 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data), - (gst_riff_create_video_template_caps): - Add h264. - -2004-12-16 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/audio/Makefile.am: - Try to fix buildbot. - -2004-12-16 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/tcp/gstmultifdsink.c: - Clean up and uniformize debugging. - -2004-12-16 Edward Hervey <bilboed@bilboed.com> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), - (gst_dvd_demux_reset), (gst_dvd_demux_change_state): - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_reset), - (gst_mpeg_demux_change_state): - Reset on ready. Fixes 160276. - -2004-12-16 Sebastien Cote <sc5@hermes.usherb.ca> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcsp_pad_link): - Fix memleak (#154815). - -2004-12-16 James Bowes <bowes@cs.dal.ca> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init), - (gst_musicbrainz_init), (gst_musicbrainz_chain), - (gst_musicbrainz_set_property), (gst_musicbrainz_get_property): - * ext/musicbrainz/gsttrm.h: - Add support for using a proxy server when getting a trm id from - the MusicBrainz database (#149613). - -2004-12-16 Christophe Fergeau <teuf@gnome.org> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstdecodebin.c: (new_pad), (close_link): - * gst/playback/gstplaybasebin.c: (new_decoded_pad): - Fix memleaks (#157233). - -2004-12-16 Sebastien Cote <sc5@hermes.usherb.ca> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/resample/resample.c: (gst_resample_close): - * gst-libs/gst/resample/resample.h: - * gst/audioscale/gstaudioscale.c: - Fix memleak (#159215). - -2004-12-16 Toni Willberg <toniw@iki.fi> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/oss/gstosselement.c: (gst_osselement_probe_caps): - * sys/oss/oss_probe.c: (main): - Check for mono/stereo support (similar to samplerate probing), - fixes #159433. Also add missing copyright header to oss_probe.c. - -2004-12-15 David Schleef <ds@schleef.org> - - * configure.ac: add audioresample and cairo plugins. Remove - HAVE_MMX stuff, because it's not used. - * ext/Makefile.am: same - * ext/audioresample/Makefile.am: You are not ready for an - audio resampling element based on audioresample. - * ext/audioresample/gstaudioresample.c: - * ext/audioresample/gstaudioresample.h: - * ext/cairo/Makefile.am: You are not ready for overlay elements - based on cairo. Don't look too closely, these elements kinda - suck right now. - * ext/cairo/gstcairo.c: new - * ext/cairo/gsttextoverlay.c: new - * ext/cairo/gsttextoverlay.h: new - * ext/cairo/gsttimeoverlay.c: new - * ext/cairo/gsttimeoverlay.h: new - * gst-libs/gst/media-info/media-info-priv.h: fix compile - problem with compilers that don't support variadic macros. - -2004-12-15 Balamurali Viswanathan <balamurali.viswanathan@wipro.com> - - Reviewed by: David Schleef <ds@schleef.org> - - * sys/sunaudio/gstsunaudio.c: (plugin_init): Apply patch from - Bala, registering sunaudiosrc (oops!), and cleaning up code a - bit. Also ran indent-gst. - * sys/sunaudio/gstsunaudiosrc.c: (gst_sunaudiosrc_init), - (gst_sunaudiosrc_change_state), (gst_sunaudiosrc_get), - (gst_sunaudiosrc_setparams): - -2004-12-14 David Schleef <ds@schleef.org> - - * gst/festival/gstfestival.c: (gst_festival_chain): Set the - output rate to 16000. Should fix #160235. - -2004-12-14 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * gst/typefind/gsttypefindfunctions.c: (mpeg2_sys_type_find): - Add typefinding for mpeg2 pes streams - -2004-12-13 David Schleef <ds@schleef.org> - - * configure.ac: Applied patch from bug #143659, making default - sources and sinks OS-dependent (for Solaris), and added code - for OS/X. - * gconf/gstreamer.schemas.in: use OS-dependent sinks in gconf. - -2004-12-13 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst-libs/gst/riff/riff-media.c: - forgot to add h2.64 to avidemux template caps - -2004-12-13 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/wavenc/riff.h: - * gst-libs/gst/riff/riff-media.c: - * gst-libs/gst/riff/riff-ids.h: - * gst/avi/gstavimux.c - add 4CC code for VideoSoft h264 in AVI (VSSH) - fixes bug #160655 - remove s323 from riff, it's quicktime specific :( - -2004-12-13 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/asfdemux/README - * gst/wavenc/riff.h - * gst-libs/gst/riff/riff-ids.h - * gst-libs/gst/riff/riff-media.c - * gst/qtdemux/qtdemux.c: - add new 4CC codes for h263 related codecs - fixes partially bug #155163 - -2004-12-12 Christian Fredrik Kalager Schaller <christian at fluendo dot com> - - * configure.ac: Update polyaudio requirement to 0.7 - * ext/polyp/polypsink.c: (create_stream): add patch from iain (158258) - -2004-12-11 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * gst/interleave/deinterleave.c: - fix my name's spelling! :) - -2004-12-11 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * AUTHORS ChangeLog - * gst/auparse/gstauparse.c - * gst/interleave/deinterleave.c - * gst/law/: - alaw-decode.c alaw-encode.c - mulaw-decode.c mulaw-encode.c - * gst/oneton/gstoneton.c - * sys/osxaudio/: - gstosxaudioelement.c gstosxaudiosink.c gstosxaudiosrc.c - * sys/osxvideo/: - cocoawindow.h cocoawindow.m - osxvideosink.h osxvideosink.m - - put the same mail address for Zaheer Abbas Merali everywhere - -2004-12-10 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_loop): - Align by packetsize, and assert that we a packet available before - playing. The first makes webstreams work (they often include - trailing padding data in a packet), the second allows pausing a - ASF stream in totem without getting demux errors afterwards. - -2004-12-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (get_relative): - Check for non-NULL before accessing member (end-of-chain). - -2004-12-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init), - (cdparanoia_set_property), (cdparanoia_get_property): - * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_class_init), - (dvdnavsrc_set_property), (dvdnavsrc_get_property): - * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_class_init), - (dvdreadsrc_init), (dvdreadsrc_set_property), - (dvdreadsrc_get_property): - * sys/vcd/vcdsrc.c: (gst_vcdsrc_class_init), - (gst_vcdsrc_set_property), (gst_vcdsrc_get_property): - Synchronize property names where not yet the case. Devices are - now device=X, other versions are deprecated (but still exist). - Also use g_free() unconditionally. - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), - (setup_source), (gst_play_base_bin_get_property): - Expose source. - -2004-12-09 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: move GCONF macro outside conditional for the am - conditional. Fixes #160439 - -2004-12-08 David Schleef <ds@schleef.org> - - * tools/gst-visualise-m.m: Switch to elements that currently - exist. - -2004-12-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstogmparse.c: (gst_ogm_parse_chain): - We love wrong commas. - -2004-12-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_handle_src_query): - Don't set DEFAULT, unsupported - makes length display incorrectly - in some cases. - -2004-12-07 Christian Fredrik Kalager Schaller <uraeus@gnome.org> - - * gst/monoscope/README: remove blurb about files being GPL - * gst/monoscope/gstmonoscope.c: Change license field to LGPL - * gst/monoscope/monoscope.c: Change license to BSD with explanation - monoscope is now effectively LGPL licensed - -2004-12-07 Christian Fredrik Kalager Schaller <uraeus@gnome.org> - - * gst/monoscope/README: Update information to be more correct - * gst/monoscope/convolve.c: Relicense to LGPL - * gst/monoscope/convolve.h: Relicense to LGPL - -2004-12-06 Arwed v. Merkatz <v.merkatz@gmx.net> - - * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): - set BUFFER_DURATION to correct values (mpeg1 audio frame length is fixed) - * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_link): - set default_duration for mpeg1 audio - -2004-12-06 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/alsa/gstalsa.c: (gst_alsa_get_caps), (gst_alsa_close_audio): - * ext/alsa/gstalsa.h: - refactor big chunks of the core caps negotiation code to make it - a lot faster, because people claim it's really slow - (actually, just cache the getcaps when the device is opened) - -2004-12-06 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/a52dec/gsta52dec.c: (gst_a52dec_init), - (gst_a52dec_handle_event), (gst_a52dec_update_streaminfo), - (gst_a52dec_handle_frame), (gst_a52dec_chain), - (gst_a52dec_change_state), (plugin_init): - * ext/a52dec/gsta52dec.h: - Do something useful with timestamps. Make chain-based (since - there's really no reason to be loopbased). - * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): - Update current_byte/frame correctly. - -2004-12-04 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/apetag/apedemux.c: (gst_ape_demux_parse_tags), - (gst_ape_demux_stream_init): - Forward tags, too. - -2004-12-04 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/apetag/apedemux.c: (gst_ape_demux_stream_init): - Let's make sure we're done typefinding when detecting tags. - -2004-12-03 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/ebml-read.c: (gst_ebml_read_class_init), - (gst_ebml_read_init), (gst_ebml_read_use_event), - (gst_ebml_read_element_id), (gst_ebml_peek_id), - (gst_ebml_read_seek), (gst_ebml_read_skip), - (gst_ebml_read_reserve), (gst_ebml_read_buffer), - (gst_ebml_read_master): - * gst/matroska/ebml-read.h: - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_parse_contents), - (gst_matroska_demux_loop_stream), (gst_matroska_demux_audio_caps): - Disgustingly evil hack for working around INTERRUPT events and - their extremely annoying habit of being a pain in the ass. We - simply peek a cluster before reading any of it. - -2004-12-03 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/musepack/gstmusepackdec.cpp: - There's also floating point libmusepacks. - -2004-12-03 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/faad/gstfaad.c: (gst_faad_chanpos_from_gst), - (gst_faad_chanpos_to_gst), (gst_faad_chain): - Set DURATION even if source buffer didn't. Also use increasing - timestamps. - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_audio_caps_with_data): - Block_align can have larger values than 8192. - -2004-12-02 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/law/alaw-decode.c: (alawdec_getcaps), (alawdec_link): - * gst/law/alaw-encode.c: (alawenc_getcaps), (alawenc_link): - * gst/law/mulaw-decode.c: (mulawdec_getcaps), (mulawdec_link): - * gst/law/mulaw-encode.c: (mulawenc_getcaps), (mulawenc_link): - Fix caps. - -2004-12-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l/v4l_calls.c: (gst_v4l_get_chan_names): - Fix logic bug. - -2004-12-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_type_find): - Yay, another one. - -2004-12-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/esd/esdsink.c: (gst_esdsink_chain): - Make error actually say something useful (fixes #156798). - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data), - (gst_riff_create_video_template_caps): - Add Intel Video 5.0 fourcc (IV50). - -2004-12-01 Christophe Fergeau <teuf@gnome.org> - - * ext/mad/gstmad.c: (mpg123_parse_xing_header): fix xing header - detection on mono and stereo mp3 files. - -2004-12-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): - Don't crash on EMPTY caps (e.g. when the demuxer didn't recognize - the contained stream). - -2004-12-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/faad/gstfaad.c: (gst_faad_srcconnect), (gst_faad_chain): - Oops, remove debug. - -2004-12-01 Sebastien Cote <sc5@hermes.usherb.ca> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/law/alaw-decode.c: (alawdec_getcaps): - * gst/law/mulaw-decode.c: (mulawdec_getcaps): - Prevent warnings when negotiating caps (fixes #159338). - -2004-12-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcsp_chain): - Remove old leftover that shouldn't be there... - -2004-12-01 Sebastien Cote <sc5@hermes.usherb.ca> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_use_event): - Don't forward DISCONT events (fixes #159684). - -2004-12-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybin.c: (remove_sinks), (setup_sinks): - Unlink manually since sometimes bin disposal (and therefore - pad unlinking) is delayed, which will cause a new media file - to not be able to start playing instantly. - -2004-11-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gststreaminfo.c: (stream_info_mute_pad): - On mute of an unlinked stream, check for pad availability so - we don't crash on unlinked pad. - -2004-11-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), - (gst_avi_demux_massage_index): - Fix quite humiliating bug in omitting 0-sized index chunks but - forgetting to count them for timestamps. - -2004-11-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/a52dec/gsta52dec.c: (gst_a52dec_loop): - Actually leave the loop if we failed to sync. Don't crash. - -2004-11-28 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_get_audio_stream), - (gst_dvd_demux_process_private): - * gst/mpegstream/gstdvddemux.h: - Fix crash (#159759). Doesn't work, though. :-(. - -2004-11-28 Benjamin Otte <otte@gnome.org> - - * gst/audioconvert/gstchannelmix.c: (gst_audio_convert_mix): - more overwriting protection due to modifying channels one by one - instead of all at once - -2004-11-28 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/audioconvert/gstchannelmix.c: - (gst_audio_convert_fill_normalize): - Normalize using absolute values. - -2004-11-28 Julien MOUTTE <julien@moutte.net> - - * configure.ac: - * ext/Makefile.am: - * ext/directfb/Makefile.am: - * ext/directfb/directfbvideosink.c: (gst_directfbvideosink_create), - (gst_directfbvideosink_get_pixel_format), - (gst_directfbvideosink_get_format_from_fourcc), - (gst_directfbvideosink_fixate), (gst_directfbvideosink_getcaps), - (gst_directfbvideosink_sink_link), - (gst_directfbvideosink_change_state), - (gst_directfbvideosink_chain), (gst_directfbvideosink_buffer_free), - (gst_directfbvideosink_buffer_alloc), - (gst_directfbvideosink_interface_supported), - (gst_directfbvideosink_interface_init), - (gst_directfbvideosink_navigation_send_event), - (gst_directfbvideosink_navigation_init), - (gst_directfbvideosink_set_property), - (gst_directfbvideosink_get_property), - (gst_directfbvideosink_finalize), (gst_directfbvideosink_init), - (gst_directfbvideosink_base_init), - (gst_directfbvideosink_class_init), - (gst_directfbvideosink_get_type), (plugin_init): - * ext/directfb/directfbvideosink.h: Adding a first version of - directfbvideosink. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_init): Initializing some - more. - -2004-11-28 Benjamin Otte <otte@gnome.org> - - * gst/audioconvert/gstchannelmix.c: (gst_audio_convert_mix): - walk the samples backwards if out_channels > in_channels so we don't - overwrite data - -2004-11-28 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/audioconvert/Makefile.am: - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_init), - (gst_audio_convert_link), (gst_audio_convert_change_state), - (gst_audio_convert_channels): - * gst/audioconvert/gstchannelmix.c: - (gst_audio_convert_unset_matrix), - (gst_audio_convert_fill_identical), - (gst_audio_convert_fill_compatible), - (gst_audio_convert_detect_pos), (gst_audio_convert_fill_one_other), - (gst_audio_convert_fill_others), - (gst_audio_convert_fill_normalize), - (gst_audio_convert_fill_matrix), (gst_audio_convert_setup_matrix), - (gst_audio_convert_passthrough), (gst_audio_convert_mix): - * gst/audioconvert/gstchannelmix.h: - Implement a channel mixer. - -2004-11-28 Martin Soto <martinsoto@users.sourceforge.net> - - * ext/alsa/gstalsasink.c (gst_alsa_sink_loop): - * ext/alsa/gstalsa.h: - * ext/alsa/gstalsa.c (gst_alsa_set_clock): - Make alsasink actually honor gst_element_set_clock and use that - clock instead of its internal one. - -2004-11-27 Christophe Fergeau <teuf@gnome.org> - - * gst/playback/gstplaybasebin.c: (setup_source): fixed a caps leak - (gst_play_base_bin_change_state): nullify source and decoder when - going from READY to NULL so that we don't try to do weird stuff with - them when going from NULL to READY - * gst/playback/gstplaybin.c: (gst_play_bin_init): use gst_object_unref - instead of g_object_unref - (gen_video_element), (gen_audio_element): more refcounting fixes, now - it should be correct - (gst_play_bin_change_state): don't call remove_sinks if we are - currently disposing the object - -2004-11-27 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/a52dec/gsta52dec.c: (gst_a52dec_loop): - Don't forget bass if it's there. Else left channel is silent... - -2004-11-27 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/a52dec/gsta52dec.c: (gst_a52dec_loop), - (gst_a52dec_change_state): - Don't do sample adjusting anymore, we use float audio now. - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): - Don't fixate to non-existing properties. - -2004-11-27 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/a52dec/gsta52dec.c: (gst_a52dec_channels), - (gst_a52dec_change_state): - Advertise that we can do surround sound. - -2004-11-27 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/a52dec/gsta52dec.c: (gst_a52dec_reneg): - Add buffer-frames=0. - * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_get_type), - (dvdreadsrc_init), (dvdreadsrc_get_event_mask), - (dvdreadsrc_get_query_types), (dvdreadsrc_get_formats), - (dvdreadsrc_srcpad_event), (dvdreadsrc_srcpad_query), - (_seek_title), (_seek_chapter), (get_next_cell_for), (_read), - (seek_sector), (dvdreadsrc_get), (dvdreadsrc_open_file), - (dvdreadsrc_change_state), (dvdreadsrc_uri_get_type), - (dvdreadsrc_uri_get_protocols), (dvdreadsrc_uri_get_uri), - (dvdreadsrc_uri_set_uri), (dvdreadsrc_uri_handler_init): - * ext/dvdread/dvdreadsrc.h: - Add seeking, querying for bytes, sectors, title, angle and - chapter. Handle multiple chapters. Relicense to LGPL because - Billy agreed on that (thanks Billy!). - -2004-11-27 Christophe Fergeau <teuf@gnome.org> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_dispose): - call parent dispose method - -2004-11-27 Martin Soto <martinsoto@users.sourceforge.net> - - * gst-libs/gst/audio/audioclock.c (gst_audio_clock_set_active) - (gst_audio_clock_get_internal_time): - Fix active <-> inactive transitions: ensure time value always - grows and avoid abrupt value changes. - -2004-11-27 Arwed v. Merkatz <v.merkatz@gmx.net> - - * configure.ac: - * gst/tta/Makefile.am: - * gst/tta/crc32.h: - * gst/tta/filters.h: - * gst/tta/gsttta.c: - * gst/tta/gstttadec.c: - * gst/tta/gstttadec.h: - * gst/tta/gstttaparse.c: - * gst/tta/gstttaparse.h: - * gst/tta/ttadec.h: - added TTA parser and decoder - -2004-11-26 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), - (probe_triggered), (check_queue), (buffer_underrun), - (buffer_running), (buffer_overrun), (gen_source_element), - (setup_source): - * gst/playback/gstplaybasebin.h: - Implement buffering. Needs some more work. - -2004-11-26 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/theora/theoradec.c: (theora_dec_chain): - Fix ilog mask range overflow. - -2004-11-26 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsa.c: (gst_alsa_get_caps): - Don't omit the last (which in case of dmix is the only :) ) - channel count. Don't set channels if <= 2. - -2004-11-26 Christophe Fergeau <teuf@gnome.org> - - * gst/playback/gstplaybin.c: (gen_video_element), - (gen_audio_element): Removed 2 obsolete comments - -2004-11-26 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * ext/vorbis/oggvorbisenc.c - * ext/vorbis/vorbisenc.c : - change description fields of those plugins to differentiate them - (pitivi show Encoders by description, they had the same one) - -2004-11-25 Christophe Fergeau <teuf@gnome.org> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybin.c: (gst_play_bin_dispose), - (gst_play_bin_set_property), (gen_video_element), - (gen_audio_element): - Refcounting fixes for provided audio-/videosinks. - -2004-11-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybin.c: (gen_video_element), - (gen_audio_element), (setup_sinks), (gst_play_bin_change_state): - Don't reference all sinks, but only the video- and audiosinks. - The vis. element should be disposed when we're done with it. - We don't have any reason to keep it around. This fixes warnings - when reusing playbin for playing multiple audio files with - vis. enabled. Also release audio device on pause - idea stolen - from Rhythmbox. - -2004-11-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push), - (gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init): - * ext/alsa/gstalsa.c: (gst_alsa_get_caps): - * ext/alsa/gstalsaplugin.c: (plugin_init): - * ext/dts/gstdtsdec.c: (gst_dtsdec_channels), - (gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init): - * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst), - (gst_faad_chanpos_to_gst), (gst_faad_sinkconnect), - (gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain), - (gst_faad_change_state), (plugin_init): - * ext/faad/gstfaad.h: - * ext/vorbis/vorbis.c: (plugin_init): - * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): - * gst-libs/gst/audio/Makefile.am: - * gst-libs/gst/audio/audio.c: (plugin_init): - * gst-libs/gst/audio/multichannel.c: - (gst_audio_check_channel_positions), - (gst_audio_get_channel_positions), - (gst_audio_set_channel_positions), - (gst_audio_set_structure_channel_positions_list), - (add_list_to_struct), (gst_audio_set_caps_channel_positions_list), - (gst_audio_fixate_channel_positions): - * gst-libs/gst/audio/multichannel.h: - * gst-libs/gst/audio/testchannels.c: (main): - * gst/audioconvert/gstaudioconvert.c: - (gst_audio_convert_class_init), (gst_audio_convert_init), - (gst_audio_convert_dispose), (gst_audio_convert_getcaps), - (gst_audio_convert_parse_caps), (gst_audio_convert_link), - (gst_audio_convert_fixate), (gst_audio_convert_channels): - * gst/audioconvert/plugin.c: (plugin_init): - Surround sound support. - -2004-11-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_push): - Fix position for discont if we're close as well. Nitpicking, but - saves a few milliseconds of extra waiting or skipping. - -2004-11-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstdecodebin.c: (gst_decode_bin_factory_filter): - We sometimes need parsers for playback, so add those too. - -2004-11-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * gst/apetag/Makefile.am: - * gst/apetag/apedemux.c: (gst_ape_demux_get_type), - (gst_ape_demux_base_init), (gst_ape_demux_class_init), - (gst_ape_demux_init), (gst_ape_demux_get_src_formats), - (gst_ape_demux_get_src_query_types), - (gst_ape_demux_handle_src_query), (gst_ape_demux_get_event_mask), - (gst_ape_demux_handle_src_event), (gst_ape_demux_handle_event), - (gst_ape_demux_typefind_peek), (gst_ape_demux_typefind_get_length), - (gst_ape_demux_typefind_suggest), (gst_ape_demux_typefind), - (gst_ape_demux_parse_tags), (gst_ape_demux_stream_init), - (gst_ape_demux_stream_data), (gst_ape_demux_loop), - (gst_ape_demux_change_state): - * gst/apetag/apedemux.h: - * gst/apetag/apetag.c: (plugin_init): - * gst/typefind/gsttypefindfunctions.c: (apetag_type_find), - (plugin_init): - APE v1/2 tag reader plus typefind function. - -2004-11-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): - * gst/typefind/gsttypefindfunctions.c: (mp3_type_find): - Remove hacks for older core. Require newer core version - accordingly. - -2004-11-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/cdxaparse/Makefile.am: - * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_get_type), - (gst_cdxaparse_class_init), (gst_cdxaparse_init), - (gst_cdxaparse_loop), (gst_cdxaparse_change_state), (plugin_init): - * gst/cdxaparse/gstcdxaparse.h: - * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_get_type), - (gst_cdxastrip_base_init), (gst_cdxastrip_class_init), - (gst_cdxastrip_init), (gst_cdxastrip_get_src_formats), - (gst_cdxastrip_get_src_query_types), - (gst_cdxastrip_handle_src_query), (gst_cdxastrip_get_event_mask), - (gst_cdxastrip_handle_src_event), (gst_cdxastrip_strip), - (gst_cdxastrip_sync), (gst_cdxastrip_handle_event), - (gst_cdxastrip_chain), (gst_cdxastrip_change_state): - * gst/cdxaparse/gstcdxastrip.h: - SVCD/VCD header stripping separated from CDXA image parsing. - * gst/typefind/gsttypefindfunctions.c: (mp3_type_find), - (plugin_init): - Add VCD/SVCD header typefinding for VCD/SVCD. - * sys/vcd/vcdsrc.c: (gst_vcdsrc_get_type), (gst_vcdsrc_base_init), - (gst_vcdsrc_class_init), (gst_vcdsrc_init), - (gst_vcdsrc_set_property), (gst_vcdsrc_get_property), - (gst_vcdsrc_get_event_mask), (gst_vcdsrc_get_query_types), - (gst_vcdsrc_get_formats), (gst_vcdsrc_srcpad_event), - (gst_vcdsrc_srcpad_query), (gst_vcdsrc_get), - (gst_vcdsrc_open_file), (gst_vcdsrc_close_file), - (gst_vcdsrc_change_state), (gst_vcdsrc_msf), - (gst_vcdsrc_recalculate), (gst_vcdsrc_uri_get_type), - (gst_vcdsrc_uri_get_protocols), (gst_vcdsrc_uri_get_uri), - (gst_vcdsrc_uri_set_uri), (gst_vcdsrc_uri_handler_init): - * sys/vcd/vcdsrc.h: - Fix up, add seeking, querying, URI interface. Works in totem now. - -2004-11-25 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - back to CVS - -=== release 0.8.6 === - -2004-11-25 Thomas Vander Stichele <thomas at apestaart dot org> - - * NEWS: - * RELEASE: - * configure.ac: - * po/af.po: - * po/az.po: - * po/cs.po: - * po/en_GB.po: - * po/hu.po: - * po/it.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - releasing 0.8.6, "IOU Love" - -2004-11-23 Thomas Vander Stichele <thomas at apestaart dot org> - - patch by: Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: - Fix unplayable files error handling. Fixes #158365 - -2004-11-23 Thomas Vander Stichele <thomas at apestaart dot org> - - patch by: Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/typefind/gsttypefindfunctions.c: - Fix broken mp3 typefinding. Fixes #158375 - -2004-11-23 Thomas Vander Stichele <thomas at apestaart dot org> - - patch by: Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: - Fix sync on broken files. Fixes #158976 - -2004-11-23 Thomas Vander Stichele <thomas at apestaart dot org> - - patch by: Edward Hervey <bilboed@bilboed.com> - - * ext/libpng/gstpngenc.c: - Copy over buffer properties. Fixes #158832 - -2004-11-23 Thomas Vander Stichele <thomas at apestaart dot org> - - patch by: Tim-Philipp Müller <t.i.m@zen.co.uk> - - * ext/dvdread/dvdreadsrc.c: - Fixes invalid reads (#158462) - -2004-11-23 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/v4l/gstv4lsrc.c: - * sys/v4l/gstv4lsrc.h: - * sys/v4l/v4lsrc_calls.c: - Probe less and cache it. Fixes #159187. - -2004-11-23 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/videorate/gstvideorate.c: - Handle all video formats. Fixes #159186. - -2004-11-16 Jan Schmidt <thaytan@mad.scientist.com> - * gst/synaesthesia/gstsynaesthesia.c: - (gst_synaesthesia_class_init), (gst_synaesthesia_init), - (gst_synaesthesia_dispose), (gst_synaesthesia_finalize), - (gst_synaesthesia_sink_link), (gst_synaesthesia_src_getcaps), - (gst_synaesthesia_src_link), (gst_synaesthesia_chain), - (gst_synaesthesia_change_state), (plugin_init): - Fix up synaesthesia to work under different samplerates/ buffer sizes. - Force 320x200 output, as that's the only thing the underlying - synaesthesia implementation supports. Still needs to be made - re-entrant. - -2004-11-14 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - Fix mpeg2enc configure check (similar to mplex check below). - -2004-11-14 Koop Mast <kwm@rainbow-runner.nl> - - reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: - Fix for gcc-2.95 (fixes #158221). - -2004-11-13 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): - Re-add clock distribution hack (until new core is released). - Fixes #158125. - -2004-11-13 Arwed v. Merkatz <v.merkatz@gmx.net> - * configure.ac: - fix mplex configure check segfaulting on some systems (bug #140994) - -2004-11-13 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsa.c: (gst_alsa_pcm_wait): - add debugging - * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): - do a wait when we enter the loop func with no data available to - write instead of getting into an 100% CPU loop by just returning and - being called again by the scheduler - -2004-11-13 Jan Schmidt <thaytan@mad.scientist.com> - - * configure.ac: - * ext/libvisual/visual.c: (gst_visual_get_type), - (libvisual_log_handler), (gst_visual_getcaps), - (gst_visual_srclink), (gst_visual_change_state), (make_valid_name), - (plugin_init): - Update libvisual to 0.1.7. Link in the debug handling to gstreamer - * ext/smoothwave/Makefile.am: - * ext/smoothwave/demo-osssrc.c: (main): - * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_class_init), - (gst_smoothwave_init), (gst_smoothwave_dispose), (gst_sw_sinklink), - (gst_sw_srclink), (gst_smoothwave_chain), (gst_sw_change_state), - (plugin_init): - * ext/smoothwave/gstsmoothwave.h: - Make gstsmoothwave a working element in the 20th century. - - * gst/chart/gstchart.c: (gst_chart_init), (gst_chart_srcconnect): - Fix incorrect link function - -2004-11-12 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/volume/gstvolume.c: - Allow buffer-frames=0. - -2004-11-12 Iain <iaingnome@gmail.com> - - * configure.ac: Check for polypaudio - - * ext/Makefile.am: Build the polyp dir - - * ext/polyp: The polypsink sources. - -2004-10-30 Iain <iaingnome@gmail.com> - - * gst/interleave/interleave.c (interleave_unlink): Change the src pads - caps to reflect the new number of channels. - -2004-11-12 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): - Fix for negotiation order problem. This would show when the - ALSA loopfuction was called before any other function. ALSA - wouldn't do anything because we're not negotiated yet, leading - to an infinite loop. Showed in e.g. Rhythmbox. Fixes #158006. - -2004-11-11 Tim-Philipp Müller <t.i.m@zen.co.uk> - - reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query): - No warnings (#157986). - -2004-11-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/typefind/gsttypefindfunctions.c: (plugin_init): - Prefer apev1/2 and id3v1 (at end of file) over musepack. - -2004-11-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/matroska-demux.c: (gst_matroska_demux_loop_stream): - Signal no-more-pads (so it works in playbin). - -2004-11-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/musepack/gstmusepackreader.cpp: - Workaround for older core. - -2004-11-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/ffmpegcolorspace/imgconvert.c: (yuv420p_to_yuv422): - Actually test for odd width/height rather than testing whether - a temporary variable that was 0 before we subtracted 1 is now - not equal to zero (which it always is). - -2004-11-11 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * sys/v4l2/gstv4l2element.c: (gst_v4l2_iface_supported): - Fix compilation if HAVE_XVIDEO is not defined - -2004-11-11 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * sys/v4l/gstv4lelement.c: (gst_v4l_iface_supported): - Fix compilation if HAVE_XVIDEO is not defined - -2004-11-11 Jan Schmidt <thaytan@mad.scientist.com> - - * gst/goom/gstgoom.c: (gst_goom_class_init), (gst_goom_init), - (gst_goom_dispose), (gst_goom_sinkconnect), (gst_goom_chain), - (gst_goom_change_state), (plugin_init): - Use the bytestream adapter so goom doesn't depend on the input - buffer size. - Add a debug category - -2004-11-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsa.c: (gst_alsa_change_state): - Only set hardware parameters *after* negotiation. Before - negotiation, it will set ANY and that seems to cause crashes - (see e.g. #151288, #153227). - -2004-11-10 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_time): - This seems to be antique leftover. It needs to pass error - checking. - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_init), - (gst_sdlvideosink_deinitsdl), (gst_sdlvideosink_initsdl), - (gst_sdlvideosink_destroy), (gst_sdlvideosink_create), - (gst_sdlvideosink_sinkconnect), (gst_sdlvideosink_chain): - Fix GstXOverlay implementation (#151059). - -2004-11-10 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): - Don't assert (#157853). - -2004-11-10 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), - Fix bytes/samples confustion. - (gst_alsa_sink_mmap), (gst_alsa_sink_loop): - Fix for underrun (#144389). - -2004-11-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/typefind/gsttypefindfunctions.c: (mp3_type_find): - Disable halfway-seek for pending release (since it needs a new - core release). - -2004-11-09 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/v4l/gstv4lsrc.c: - * sys/v4l/gstv4lsrc.h: - * sys/v4l/v4lsrc_calls.c: - add autoprobe-fps property so we can separate autoprobing parts - -2004-11-09 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/v4l/gstv4lsrc.c: - * sys/v4l/v4lsrc_calls.c: - initialise fourcc to catch unset fourcc's, and debug - -2004-11-09 Wim Taymans <wim@fluendo.com> - - * gst/playback/README: - * gst/playback/gstdecodebin.c: (close_pad_link), (try_to_link_1): - * gst/playback/gstplaybin.c: (gst_play_bin_init), - (gst_play_bin_dispose), (gst_play_bin_set_property), - (remove_sinks), (setup_sinks), (gst_play_bin_change_state), - (gst_play_bin_get_event_masks), (gst_play_bin_send_event), - (gst_play_bin_get_formats), (gst_play_bin_convert), - (gst_play_bin_get_query_types), (gst_play_bin_query): - Cleanups and some more documentation. - -2004-11-09 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/libcaca/gstcacasink.c: (gst_cacasink_class_init), - (gst_cacasink_init), (gst_cacasink_chain): - * ext/libcaca/gstcacasink.h: - Cacasink inherits from VideoSink, so let that store the clock. - -2004-11-09 Wim Taymans <wim@fluendo.com> - - * gst/playback/README: - * gst/playback/gstplaybasebin.c: (group_destroy), (group_is_muted), - (add_stream), (unknown_type), (add_element_stream), (no_more_pads), - (probe_triggered), (preroll_unlinked), (new_decoded_pad), - (gst_play_base_bin_change_state), (gst_play_base_bin_found_tag): - * gst/playback/gstplaybin.c: (gen_vis_element), (remove_sinks), - (setup_sinks): - * gst/playback/gststreaminfo.c: (gst_stream_info_set_mute), - (gst_stream_info_is_mute), (gst_stream_info_set_property): - * gst/playback/gststreaminfo.h: - Updated README. - Only switch groups if all streams have muted (EOSed). - Send Tags in sync with the stream playback instead of in - the playback/preroll phase. - Some cleanups, free the fakesrc elements. - -2004-11-09 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/alsa/gstalsa.c: (gst_alsa_get_caps_internal): - buffer-frames property was missing - * ext/arts/gst_arts.c: - rate missing from sinkcaps - * ext/audiofile/gstafparse.c: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsrc.c: - * ext/swfdec/gstswfdec.c: - int audio doesn't know buffer-frames - * ext/cdparanoia/gstcdparanoia.c: - int audio doesn't know chunksize either - * ext/nas/nassink.c: - it's endianness, not endianess - * gst-libs/gst/audio/audio.h: - make float standard pad template caps really describe float - * gst/law/mulaw.c: (linear_factory): - signed only, please - * gst/mpegstream/gstdvddemux.c: - widths of 20 are not valid - -2004-11-08 Thomas Vander Stichele <thomas at apestaart dot org> - - Submitted by: Luca Ferretti <elle.uca@infinito.it> - - * po/LINGUAS: - * po/it.po: - Add Italian - -2004-11-08 Wim Taymans <wim@fluendo.com> - - * gst/playback/README: - * gst/playback/gstdecodebin.c: (close_pad_link), (try_to_link_1): - * gst/playback/gstplaybasebin.c: (probe_triggered), - (gst_play_base_bin_change_state): - Updated README, added more comments for fixmes etc.. - -2004-11-08 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_add_element): - We can remove this hack now. - -2004-11-08 Wim Taymans <wim@fluendo.com> - - * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_ayuv), - (gst_videomixer_fill_checker), (gst_videomixer_fill_color), - (gst_videomixer_blend_buffers), (gst_videomixer_loop): - Only mix AYUV for maximum quality. - -2004-11-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (get_relative), (gst_ogg_demux_src_query), - (gst_ogg_demux_push), (gst_ogg_pad_push): - Let's act as if we're synchronized now! :). - * ext/theora/theoradec.c: (theora_dec_chain): - Add some debug. - -2004-11-08 Wim Taymans <wim@fluendo.com> - - * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), - (gst_alpha_set_property), (gst_alpha_sink_link), - (gst_alpha_set_ayuv), (gst_alpha_set_i420), - (gst_alpha_chroma_key_ayuv), (gst_alpha_chroma_key_i420), - (gst_alpha_init_params), (gst_alpha_chain): - Implement alpha functions for AYUV too, this increases - accuracy quite a bit. - -2004-11-08 Wim Taymans <wim@fluendo.com> - - * gst/ffmpegcolorspace/avcodec.h: - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: - (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt), - (gst_ffmpegcsp_avpicture_fill): - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcsp_caps_remove_format_info): - * gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size), - (shrink12), (img_get_alpha_info), (deinterlace_line), - (deinterlace_line_inplace): - * gst/ffmpegcolorspace/imgconvert_template.h: - Added AYUV colorspace and handle RGBA a bit more respectful. - -2004-11-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): - Actually always send a discont (cornercase when resending the - same serial-tagged chain twice). - -2004-11-08 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_clear), - (gst_ximagesink_finalize): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_clear), - (gst_xvimagesink_finalize): Some more cleanups, leaks fixed and checks. - -2004-11-08 Wim Taymans <wim@fluendo.com> - - * gst/typefind/gsttypefindfunctions.c: (aac_type_find): - Don't segfault on NULL data. - -2004-11-08 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstdecodebin.c: (unlinked): - * gst/playback/gstplay-marshal.list: - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), - (gst_play_base_bin_init), (group_create), (get_active_group), - (get_building_group), (group_destroy), (group_commit), - (queue_overrun), (remove_groups), (add_stream), (unknown_type), - (add_element_stream), (no_more_pads), (probe_triggered), - (preroll_unlinked), (new_decoded_pad), (removed_decoded_pad), - (state_change), (setup_source), (gst_play_base_bin_get_property), - (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), - (gst_play_base_bin_link_stream), - (gst_play_base_bin_get_streaminfo): - * gst/playback/gstplaybasebin.h: - * gst/playback/gstplaybin.c: (gst_play_bin_class_init), - (remove_sinks), (setup_sinks), (gst_play_bin_change_state): - Add support for chained ogg files. Prepare for playlist - support. This patch introduces the concept of pad groups, which - together compose one playable media file. - -2004-11-07 David Schleef <ds@schleef.org> - - * testsuite/gst-lint: Check for pad templates that aren't statically - scoped. - -2004-11-07 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * ext/Makefile.am: - * ext/musepack/Makefile.am: - * ext/musepack/gstmusepackdec.cpp: - * ext/musepack/gstmusepackdec.h: - * ext/musepack/gstmusepackreader.cpp: - * ext/musepack/gstmusepackreader.h: - Add musepack decoder. - * ext/faad/gstfaad.c: (gst_faad_base_init): - Make pad templates static. - * gst/typefind/gsttypefindfunctions.c: (mp3_type_find), - (plugin_init): - Add musepack typefinder, make mp3 typefinding work halfway stream, - which doesn't actually work yet because id3demux doesn't implement - _get_length(). - -2004-11-07 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), - (gst_ogg_mux_queue_pads), (gst_ogg_mux_loop): - Fix interrupt event handling (#144436). - -2004-11-07 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/mad/gstid3tag.c: (gst_id3_tag_do_typefind): - Hide unused glory. - -2004-11-06 Tim-Philipp Müller <t.i.m@zen.co.uk> - - reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/vorbis/vorbisenc.c: (raw_caps_factory): - Fix weird caps (#157548). - -2004-11-06 Tim-Philipp Müller <t.i.m@zen.co.uk> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/rtp/gstrtpgsmparse.c: (gst_rtpgsm_caps_nego): - Add missing NULL terminator (#157543). - -2004-11-05 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/tcp/gsttcp.h: - * gst/tcp/gsttcpclientsink.c: - * gst/tcp/gsttcpclientsrc.c: - * gst/tcp/gsttcpserversink.c: - * gst/tcp/gsttcpserversrc.c: - ports can go up to 65535. Move common defines to gsttcp.h - -2004-11-05 Wim Taymans <wim@fluendo.com> - - * gst/videotestsrc/videotestsrc.c: (paint_setup_Y41B), - (paint_hline_Y41B), (paint_setup_Y42B), (paint_hline_Y42B): - Added two more colorspaces. - -2004-11-05 Wim Taymans <wim@fluendo.com> - - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: - (gst_ffmpegcsp_avpicture_fill): - * gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size), - (yuv422p_to_yuv422), (yuv420p_to_yuv422), (shrink12), - (img_convert), (deinterlace_line), (deinterlace_line_inplace): - More stride fixes. - -2004-11-05 Wim Taymans <wim@fluendo.com> - - * gst/alpha/gstalpha.c: (gst_alpha_set_property), (gst_alpha_add), - (gst_alpha_chroma_key), (gst_alpha_init_params), (gst_alpha_chain): - * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_i420), - (gst_videomixer_fill_checker), (gst_videomixer_blend_buffers), - (gst_videomixer_loop): - More stride fixes. - -2004-11-05 Benjamin Otte <otte@gnome.org> - - * ext/mad/gstmad.c: (gst_mad_chain): - don't overflow data buffer. Flush not needed sync data when syncing - failed. - -2004-11-04 Wim Taymans <wim@fluendo.com> - - * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), - (gst_alpha_class_init), (gst_alpha_init), (gst_alpha_set_property), - (gst_alpha_get_property), (gst_alpha_add), (gst_alpha_chroma_key), - (gst_alpha_init_params), (gst_alpha_chain), - (gst_alpha_change_state): - Updated the chroma keying algorithm with something more - sophisticated. - -2004-11-03 Wim Taymans <wim@fluendo.com> - - * gst/videomixer/videomixer.c: (gst_videomixer_blend_ayuv_i420), - (gst_videomixer_fill_checker), (gst_videomixer_fill_color), - (gst_videomixer_blend_buffers), (gst_videomixer_loop): - Fix stride issues. Does not completely work for odd - heights. - -2004-11-03 Wim Taymans <wim@fluendo.com> - - * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), - (gst_alpha_chroma_key), (gst_alpha_chain): - Fix stride issues. Does not completely work for odd - heights. - -2004-11-03 Christophe Fergeau <teuf@gnome.org> - - * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps): - * gst/videoscale/videoscale.c: (videoscale_find_by_structure): - leak fixes - -2004-11-03 Wim Taymans <wim@fluendo.com> - - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: - (gst_ffmpegcsp_avpicture_fill): - * gst/ffmpegcolorspace/imgconvert.c: (avpicture_get_size), - (avpicture_alloc): - * gst/ffmpegcolorspace/imgconvert_template.h: - Use correct _fill function to get correct strides. - -2004-11-02 David Schleef <ds@schleef.org> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_parse_tree), - (qtdemux_parse_udta), (qtdemux_tag_add), (gst_qtdemux_handle_esds): - Change all g_print()s to debugging. Add a bunch of consistency - checks. - -2004-11-02 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), - (try_to_link_1), (get_our_ghost_pad), (remove_element_chain), - (unlinked), (no_more_pads), (close_link): - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init), - (unknown_type), (add_element_stream), (new_decoded_pad), - (removed_decoded_pad), (setup_source): - * gst/playback/gststreaminfo.c: (gst_stream_info_get_type), - (gst_stream_info_class_init), (gst_stream_info_init), - (gst_stream_info_new), (gst_stream_info_dispose), - (stream_info_mute_pad), (gst_stream_info_set_property), - (gst_stream_info_get_property): - * gst/playback/gststreaminfo.h: - Fix playback of multiple files. - a slightly different approach to handling dynamic pad removals. - This one only looks at pads that we have linked. - -2004-11-01 Christophe Fergeau <teuf@gnome.org> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_finalize): fix an "invalid - free" warning from libc. - -2004-11-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), - (get_unconnected_element), (remove_starting_from), (pad_removed), - (close_link): - Implement support for dynamic pad changing. We listen to "live" - pad removals (i.e. while playing) and re-setup autoplugging - after that. Playbasebin/playbin need some more work for this - to finally work, but decodebin supports (and replugs) chained - ogg now. - -2004-11-02 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/alsa/gstalsa.c: (gst_alsa_class_init), (gst_alsa_dispose), - (gst_alsa_finalize): - * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init), - (gst_cdaudio_finalize): - * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init), - (cdparanoia_finalize): - * ext/divx/gstdivxdec.c: (gst_divxdec_dispose): - * ext/divx/gstdivxenc.c: (gst_divxenc_dispose): - * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_class_init), - (dvdreadsrc_finalize): - * ext/flac/gstflacdec.c: (gst_flacdec_class_init), - (gst_flacdec_finalize): - * ext/flac/gstflacenc.c: (gst_flacenc_class_init), - (gst_flacenc_finalize): - * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_class_init), - (gst_gnomevfssink_finalize): - * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_class_init), - (gst_gnomevfssrc_finalize): - * ext/libfame/gstlibfame.c: (gst_fameenc_class_init), - (gst_fameenc_finalize): - * ext/nas/nassink.c: (gst_nassink_class_init), - (gst_nassink_finalize): - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_finalize), - (gst_sdlvideosink_class_init): - * ext/sndfile/gstsf.c: (gst_sf_dispose): - * gst-libs/gst/mixer/mixertrack.c: (gst_mixer_track_dispose): - * gst-libs/gst/tuner/tunerchannel.c: (gst_tuner_channel_dispose): - * gst-libs/gst/tuner/tunernorm.c: (gst_tuner_norm_dispose): - * gst-libs/gst/xwindowlistener/xwindowlistener.c: - (gst_x_window_listener_dispose): - * gst/audioscale/gstaudioscale.c: - * gst/playondemand/gstplayondemand.c: (play_on_demand_class_init), - (play_on_demand_finalize): - * gst/videofilter/gstvideobalance.c: (gst_videobalance_dispose): - * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): - * sys/cdrom/gstcdplayer.c: (cdplayer_class_init), - (cdplayer_finalize): - * sys/glsink/glimagesink.c: (gst_glimagesink_finalize), - (gst_glimagesink_class_init): - * sys/oss/gstosselement.c: (gst_osselement_class_init), - (gst_osselement_finalize): - * sys/oss/gstosssink.c: (gst_osssink_dispose): - * sys/oss/gstosssrc.c: (gst_osssrc_dispose): - * sys/v4l/gstv4lelement.c: (gst_v4lelement_dispose): - Fixes a bunch of problems with finalize and dispose functions, - either assumptions that dispose is only called once, or not calling - the parent class dispose/finalize function - -2004-11-01 Stefan Kost <ensonic@users.sf.net> - - * ext/esd/esdsink.c: (gst_esdsink_init), (gst_esdsink_link): - added two api precondition guards - use g_strdup with getenv to fix crash when using ENVVAR - -2004-11-01 Jan Schmidt <thaytan@mad.scientist.com> - * ext/esd/esdsink.c: (gst_esdsink_class_init), - (gst_esdsink_finalize): - Use a finalize function, not dispose, and more importantly, - call the parent class finalize function too - -2004-11-01 Johan Dahlin <johan@gnome.org> - - * ext/ogg/gstoggdemux.c: - * gst/tags/gstvorbistag.c: - Plug leaks. - -2004-10-31 Benjamin Otte <otte@gnome.org> - - * gst/tags/gstvorbistag.c: (gst_vorbis_tag_chain): - lotsa memleaks today. But they're all small... - -2004-10-31 Benjamin Otte <otte@gnome.org> - - * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): - another memleak crushed - -2004-10-31 Benjamin Otte <otte@gnome.org> - - * gst/tags/gstvorbistag.c: (gst_tag_to_vorbis_comments): - fix memleak - -2004-10-31 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): - Hack to prevent crash when going to READY inside signal handler - while this function is active. - -2004-10-31 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/ffmpegcolorspace/Makefile.am: - * gst/ffmpegcolorspace/avcodec.h: - * gst/ffmpegcolorspace/common.h: - * gst/ffmpegcolorspace/dsputil.c: (dsputil_static_init): - * gst/ffmpegcolorspace/dsputil.h: - * gst/ffmpegcolorspace/gstffmpeg.c: (plugin_init): - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: - (gst_ffmpeg_get_palette), (gst_ffmpeg_set_palette), - (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_smpfmt_to_caps), - (gst_ffmpegcsp_codectype_to_caps), (gst_ffmpeg_caps_to_smpfmt), - (gst_ffmpeg_caps_to_pixfmt), (gst_ffmpegcsp_caps_with_codectype), - (gst_ffmpegcsp_avpicture_fill): - * gst/ffmpegcolorspace/gstffmpegcodecmap.h: - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcsp_caps_remove_format_info), (gst_ffmpegcsp_getcaps), - (gst_ffmpegcsp_pad_link), (gst_ffmpegcsp_get_type), - (gst_ffmpegcsp_base_init), (gst_ffmpegcsp_class_init), - (gst_ffmpegcsp_init), (gst_ffmpegcsp_chain), - (gst_ffmpegcsp_change_state), (gst_ffmpegcsp_set_property), - (gst_ffmpegcsp_get_property), (gst_ffmpegcolorspace_register): - * gst/ffmpegcolorspace/imgconvert.c: - (avcodec_get_chroma_sub_sample), (avcodec_get_pix_fmt_name), - (avcodec_get_pix_fmt), (avpicture_fill), (avpicture_layout), - (avpicture_get_size), (avcodec_get_pix_fmt_loss), - (avg_bits_per_pixel), (avcodec_find_best_pix_fmt1), - (avcodec_find_best_pix_fmt), (img_copy_plane), (img_copy), - (yuv422_to_yuv420p), (uyvy422_to_yuv420p), (uyvy422_to_yuv422p), - (yuv422_to_yuv422p), (yuv422p_to_yuv422), (yuv422p_to_uyvy422), - (uyvy411_to_yuv411p), (yuv420p_to_yuv422), (C_JPEG_TO_CCIR), - (img_convert_init), (img_apply_table), (shrink41), (shrink21), - (shrink12), (shrink22), (shrink44), (grow21_line), (grow41_line), - (grow21), (grow22), (grow41), (grow44), (conv411), - (gif_clut_index), (build_rgb_palette), (bitcopy_n), (mono_to_gray), - (monowhite_to_gray), (monoblack_to_gray), (gray_to_mono), - (gray_to_monowhite), (gray_to_monoblack), (avpicture_alloc), - (avpicture_free), (is_yuv_planar), (img_convert), - (get_alpha_info_pal8), (img_get_alpha_info), (deinterlace_line), - (deinterlace_line_inplace), (deinterlace_bottom_field), - (deinterlace_bottom_field_inplace), (avpicture_deinterlace): - * gst/ffmpegcolorspace/imgconvert_template.h: - * gst/ffmpegcolorspace/mem.c: (av_malloc), (av_realloc), (av_free): - * gst/ffmpegcolorspace/mmx.h: - * gst/ffmpegcolorspace/utils.c: (av_mallocz), (av_strdup), - (av_fast_realloc), (av_mallocz_static), (av_free_static), - (av_freep), (avcodec_get_context_defaults), - (avcodec_alloc_context), (avcodec_init): - Sync back from gst-ffmpeg. Deprecates ffcolorspace. Adds palette - handling plus update from ffmpeg CVS. Large clean-up. - -2004-10-31 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/Makefile.am: - We need the marshallers for decodebin, too. - -2004-10-30 David Schleef <ds@schleef.org> - - * gst/typefind/gsttypefindfunctions.c: (qt_type_find): Make - quicktime typefinding work with 64-bit offsets. - -2004-10-30 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/dv/gstdvdec.c: (gst_dvdec_handle_sink_event): - Set EOS on the element when processing an EOS event. - * ext/speex/gstspeexdec.h: - * ext/speex/gstspeexenc.h: - Only keep a const ptr to the mode - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_audio_caps_with_data), - (gst_riff_create_audio_template_caps): - Allow WMAV3, with up to 6 channels. - * gst/asfdemux/gstasfmux.c: (gst_asfmux_request_new_pad): - Don't call gst_pad_set_event_function on a sink pad. - * gst/mpegstream/gstdvddemux.c: - (gst_dvd_demux_get_subpicture_stream), - (gst_dvd_demux_set_cur_audio), (gst_dvd_demux_set_cur_subpicture): - Copy the explicit caps that were set across to the cur_* pads, - instead of trying to use a possibly non-existent negotiated caps. - Reset the type of subpicture pads to UNKNOWN after calling - init_stream, so that the caps get set. - -2004-10-29 Martin Pitt <martin.pitt@canonical.com> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_chunk): - Don't touch buffer if it is of size 0 (fixes #151064). - -2004-10-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_push), (gst_ogg_pad_push): - Synchronized discont handling. - -2004-10-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), - (gst_ogg_demux_push): - Make seeking sort-of exact again (fixes #156387). - -2004-10-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (unknown_type), - (add_element_stream), (new_decoded_pad), - (gst_play_base_bin_change_state): - * gst/playback/gststreaminfo.c: (gst_stream_info_class_init), - (gst_stream_info_init), (gst_stream_info_new), - (gst_stream_info_dispose), (gst_stream_info_get_property): - * gst/playback/gststreaminfo.h: - Make caps explicitely available. Makes testing for unsupported - types possible. Improves error reporting. - -2004-10-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/audioconvert/gstaudioconvert.c: - (gst_audio_convert_buffer_to_default_format): - Really don't touch read-only buffers (#156563). - -2004-10-29 Sebastien Cote <sc5@hermes.usherb.ca> - - Reviewd by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): - Fix memleak (#155223). - -2004-10-29 Wim Taymans <wim@fluendo.com> - - * gst/tcp/.cvsignore: - * gst/tcp/gstmultifdsink.c: (gst_sync_method_get_type), - (gst_multifdsink_class_init), (gst_multifdsink_init), - (gst_multifdsink_add), (gst_multifdsink_remove), - (gst_multifdsink_remove_client_link), (is_sync_frame), - (gst_multifdsink_new_client), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), - (gst_multifdsink_handle_clients), (gst_multifdsink_set_property), - (gst_multifdsink_get_property): - * gst/tcp/gstmultifdsink.h: - Added burst on connect sync_method, deprecated sync_clients, - streamlined the sync code some more. - -2004-10-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (thread_error), (setup_source), - (gst_play_base_bin_change_state): - Improve error reporting. - -2004-10-28 Wim Taymans <wim@fluendo.com> - - * gst/tcp/Makefile.am: - * gst/tcp/fdsetstress.c: (mess_some_more), (run_test), (main): - * gst/tcp/gstfdset.c: (nearest_pow), (resize), (ensure_size), - (gst_fdset_new), (gst_fdset_free), (gst_fdset_set_mode), - (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read), - (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), - (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), - (gst_fdset_wait): - Added more locks around fdset structures. Fixed/reworked - the poll array resizing code. - Added stress test for fdset. - -2004-10-28 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * gst-libs/gst/audio/gstaudiofilter.c: (gst_audiofilter_link): - fix build - -2004-10-28 Benjamin Otte <otte@gnome.org> - - * gst-libs/gst/audio/gstaudiofilter.c: (gst_audiofilter_link): - fix link function to always query channels and query width for - floats - * configure.ac: - add equalizer dir - * gst/equalizer/Makefile.am: - * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_get_type), - (gst_iir_equalizer_base_init), (gst_iir_equalizer_class_init), - (gst_iir_equalizer_init), (gst_iir_equalizer_finalize), - (arg_to_scale), (setup_filter), - (gst_iir_equalizer_compute_frequencies), - (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), - (gst_iir_equalizer_filter_inplace), (gst_iir_equalizer_setup), - (plugin_init): - add an equalizer - -2004-10-27 Thomas Vander Stichele <thomas at apestaart dot org> - - Submitted by: Kjartan Maraas <kmaraas@broadpark.no> - - * po/LINGUAS: - * po/nb.po: - Added Norwegian Bokmaal translation - -2004-10-27 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): - Don't break on options (fixes #156488). - -2004-10-27 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - * ext/cdaudio/Makefile.am: - * sys/Makefile.am: - fix build on older automake - -2004-10-26 Wim Taymans <wim@fluendo.com> - - * ext/dv/gstdvdec.c: (gst_dvdec_video_getcaps), - (gst_dvdec_video_link), (gst_dvdec_push), (gst_dvdec_loop): - Allow a little margin when negotiating the framerate. - -2004-10-26 Stefan Kost <ensonic@users.sf.net> - - * gst/level/gstlevel.c: - synchonised naming of pads and pad-templates - -2004-10-26 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), - (gst_ogg_demux_handle_event), (_find_chain_get_unknown_part), - (_find_streams_check), (gst_ogg_demux_push): - Fix EOS again. Needs to be done in a better way. We should not - remove the pad if there is no new chained stream. - -2004-10-26 Iain <iaingnome@gmail.com> - - * ext/ogg/gstoggdemux.c (gst_ogg_pad_new): Free the tag list. - * gst/audioscale/gstaudioscale.c (gst_audioscale_link): Free the copy - of the caps. - * gst/interleave/interleave.c (interleave_class_init): Hook up release - pad. - (interleave_release_pad): Remove the pad. - * gst/level/gstlevel.c: Allow the level to take 1 or 2 channels. - * sys/sunaudio/gstsunaudio.c (gst_sunaudio_setparams): Pay attention to - the set device. - * sys/xvimage/xvimagesink.c (gst_xvimagesink_get_xv_support): Free the - attrs - (gst_xvimagesink_xcontext_clear): Free the xcontext. - (gst_xvimagesink_finalize): Free the par. - -2004-10-26 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavimux.c: (gst_avimux_audsinkconnect), - (gst_avimux_stop_file): - First calculate the rate, and only then use it. Hdr.rate is a - multiple and not a derivative of hdr.scale. Scale is not the - same as blockalign but is solely related to rate. - -2004-10-26 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_init), - (gst_gnomevfssink_handle_event), (gst_gnomevfssink_chain): - Implement seeking. - -2004-10-25 James Henstridge <james@jamesh.id.au> - - Reviewed by: David Schleef <ds@schleef.org> - - * examples/gstplay/player.c: (got_stream_length), (main): - * examples/seeking/cdplayer.c: (update_scale): - * examples/seeking/seek.c: (format_value), (update_scale): - * examples/seeking/spider_seek.c: (format_value), (update_scale), - (stop_seek): - Build fixes on AMD64. - -2004-10-25 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - reviewed by: Ronald Bultje <rbultje at gnome dot org> - - * sys/v4l/v4l_calls.c: (gst_v4l_get_chan_names): - Fix for some v4l cards which hang in v4lsrc - -2004-10-25 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggdemux.c: (gst_ogg_pad_remove), - (gst_ogg_demux_push), (gst_ogg_chains_clear): - Make sure to remove the pad when a new chain is - encountered. Set some vars to NULL so we don't try - to reference freed memory. - -2004-10-25 Wim Taymans <wim@fluendo.com> - - * examples/seeking/Makefile.am: - * examples/seeking/cdplayer.c: (update_scale): - * examples/seeking/chained.c: (unlinked), (new_pad), (main): - * examples/seeking/playbin.c: (make_playerbin_pipeline), - (format_value), (update_scale), (iterate), (start_seek), - (stop_seek), (print_media_info), (play_cb), (pause_cb), (stop_cb), - (print_usage), (main): - Added some more examples, update others. - -2004-10-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/flac/gstflacdec.c: (gst_flacdec_update_metadata): - * ext/speex/gstspeexdec.c: (speex_dec_chain): - * ext/theora/theoradec.c: (theora_dec_chain): - * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): - Add codec-name metadata. - -2004-10-25 Takao Fujiwara <Takao.Fujiwara@Sun.COM> - - Reviewd by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): - * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): - * ext/alsa/gstalsamixertrack.h: - * po/POTFILES.in: - ALSA mixer track label internationalization (#154054). - -2004-10-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/theora/theoradec.c: (theora_dec_chain): - Export bitrate as metadata. - -2004-10-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): - * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): - * ext/alsa/gstalsamixertrack.h: - Fix names, fix loop. - -2004-10-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/speex/gstspeexdec.c: (gst_speex_dec_init), - (speex_dec_convert): - sinkconvert function so oggdemux can get the file length (totem). - -2004-10-25 James Morrison <ja2morri@csclub.uwaterloo.ca> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_chunk): - Don't push incomplete packets. - * gst/typefind/gsttypefindfunctions.c: (m4a_type_find): - Fix MPEG-4 audio typefinding. - -2004-10-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l/Makefile.am: - * sys/v4l/gstv4l.c: (plugin_init): - * sys/v4l/gstv4lelement.c: (gst_v4lelement_get_type), - (gst_v4lelement_init), (gst_v4lelement_dispose), - (gst_v4lelement_change_state): - * sys/v4l/gstv4lelement.h: - * sys/v4l/gstv4lxoverlay.c: (gst_v4l_xoverlay_open), - (gst_v4l_xoverlay_close), (idle_refresh), - (gst_v4l_xoverlay_set_xwindow_id): - * sys/v4l/gstv4lxoverlay.h: - * sys/v4l/v4l-overlay_calls.c: - * sys/v4l/v4l_calls.h: - * sys/v4l2/Makefile.am: - * sys/v4l2/gstv4l2.c: (plugin_init): - * sys/v4l2/gstv4l2element.c: (gst_v4l2element_get_type), - (gst_v4l2element_init), (gst_v4l2element_dispose), - (gst_v4l2element_change_state): - * sys/v4l2/gstv4l2element.h: - * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_open), - (gst_v4l2_xoverlay_close), (idle_refresh), - (gst_v4l2_xoverlay_set_xwindow_id): - * sys/v4l2/gstv4l2xoverlay.h: - * sys/v4l2/v4l2-overlay_calls.c: - * sys/v4l2/v4l2_calls.h: - Remove client-side overlay handling, use the X-server v4l plugin - for that. Nicer overlay, less code. Also make the plugin - compileable without X (but then without overlay, obviously). - Makes xwindowlistener obsolete, should we remove that? - -2004-10-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/oss/gstosssrc.c: (gst_osssrc_get_time), (gst_osssrc_get), - (gst_osssrc_src_query): - * sys/oss/gstosssrc.h: - OK, so people want offset in DEFAULT. This time, actually fix all - cases. - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_getcaps): - Add FPS properly. - -2004-10-24 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/asfdemux/gstasfmux.c: - * gst/avi/gstavimux.c: - Framerate. - -2004-10-24 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l2/gstv4l2element.c: (gst_v4l2element_set_property): - Fix properties (channel, norm, frequency). - -2004-10-24 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l2/gstv4l2element.c: (gst_v4l2element_get_property): - Flag typo. - * sys/v4l2/v4l2_calls.c: (gst_v4l2_set_defaults): - No warnings. - -2004-10-24 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_clear_format_list): - Fix hang. - -2004-10-24 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l2/gstv4l2element.h: - Yet Another Hack (tm) for kernel header borkedness. - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init), - (gst_v4l2src_v4l2fourcc_to_caps), (gst_v4l2_fourcc_from_structure), - (gst_v4l2src_link), (gst_v4l2src_getcaps), - (gst_v4l2src_change_state): - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_capture_init), - (gst_v4l2src_capture_start), (gst_v4l2src_capture_stop): - Fix caps, keep track of state, work. - -2004-10-24 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_getcaps): - Quiet. - -2004-10-24 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/oss/gstosssrc.c: (gst_osssrc_get): - Don't mix bytes and samples. - -2004-10-24 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggmux.c: - Basic pad template which accepts OGM tracks, speex, flac, vorbis - and theora. Any is incorrect. - * gst/asfdemux/gstasfmux.c: (gst_asfmux_vidsink_link): - Fix caps. - * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_base_init): - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_base_init), - (gst_v4lmjpegsrc_init), (gst_v4lmjpegsrc_srcconnect), - (gst_v4lmjpegsrc_getcaps), (gst_v4lmjpegsrc_change_state): - * sys/v4l/gstv4lmjpegsrc.h: - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_src_link), (gst_v4lsrc_getcaps), - (gst_v4lsrc_change_state): - * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_capture_start), - (gst_v4lmjpegsrc_capture_stop): - Fix caps. Keep track of internal state. Work. - -2004-10-23 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/Makefile.am: - Fix the build fixes. - -2004-10-23 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), - (gst_ogg_demux_src_event), (_find_chain_seek), - (gst_ogg_pad_push): - Check for pad availability before using it. - * ext/ogg/gstoggdemux.c: (_find_chain_process): - Fix parsing of chained ogg. Needs more work on the decoder side. - -2004-10-22 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/spectrum/Makefile.am: - * gst/spectrum/demo-osssrc.c: (spectrum_chain), (main), - (idle_func): - Fix demo and reenable it. Yes, I'm currently playing with audio - analysis tools - -2004-10-22 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): - We love it if files that start at zero work too... - -2004-10-22 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate): - Handle files with missing EOS headers. - -2004-10-21 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * gst/tcp/gsttcpserversink.c: - (gst_tcpserversink_handle_server_read), - (gst_tcpserversink_init_send): - Zero some variables first (need for accept not to return EINVAL) - -2004-10-20 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), - (gst_ogg_demux_src_event), (gst_ogg_pad_push): - * ext/theora/theoradec.c: (theora_dec_sink_convert), - (theora_dec_chain): - * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), - (gst_vorbis_dec_init), (vorbis_dec_convert), (vorbis_dec_chain): - Seeking and querying finetune. - -2004-10-20 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - * ext/Makefile.am: - * ext/raw1394/Makefile.am: - fix the build - -2004-10-20 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate): - Wrong return. - * gst/playback/Makefile.am: - * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init): - * gst/playback/gstplay-marshal.list: - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init): - Fix marshallers. - -2004-10-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event): - Silence. - -2004-10-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), - (gst_ogg_demux_src_event), (gst_ogg_pad_populate), - (gst_ogg_pad_push): - Yay for non-lineair granulepos in theora. - -2004-10-18 Wim Taymans <wim@fluendo.com> - - * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_video_getcaps), - (gst_dvdec_video_link), (gst_dvdec_push), (gst_dvdec_loop): - * ext/dv/gstdvdec.h: - Make sure we renegotiate aspect ratio when the camera switches. - -2004-10-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), - (gst_ogg_demux_src_event), (gst_ogg_pad_push): - Start at zero. - * ext/theora/theoradec.c: (theora_dec_chain): - Skip headers. Bad idea for chained ogg, but fixes seeking. - -2004-10-18 Wim Taymans <wim@fluendo.com> - - * configure.ac: - I swear, this is the last time I touch this. - -2004-10-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), - (gst_ogg_demux_src_event), (gst_ogg_pad_populate), - (_read_bos_process), (gst_ogg_demux_iterate), (gst_ogg_pad_new): - Faster seeking. - * ext/theora/theoradec.c: (theora_dec_sink_convert): - Time-to-default conversion. - * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): - Don't error on unknown packets, just skip. We should probably - read them if we want to support chained ogg. - -2004-10-18 Wim Taymans <wim@fluendo.com> - - * configure.ac: - Added cdaudio to wrong list. - -2004-10-18 Wim Taymans <wim@fluendo.com> - - * configure.ac: - Revive cdaudio. - -2004-10-18 Wim Taymans <wim@fluendo.com> - - * ext/dv/gstdvdec.c: (gst_dvdec_video_getcaps), - (gst_dvdec_video_link), (gst_dvdec_push): - * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_class_init), - (gst_smokeenc_resync), (gst_smokeenc_chain): - Fix mimetype on smoke encoder. - Add aspect ratio to dvdec. Not sure if these - values are correct though.... - -2004-10-18 Wim Taymans <wim@fluendo.com> - - * ext/vorbis/vorbisenc.c: (gst_vorbisenc_class_init): - Fix vorbis property descriptions and ranges. - -2004-10-18 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate): - Really do nothing when no data is available. - Go to the playing state when the stream is not seekable - instead of failing. - -2004-10-18 Wim Taymans <wim@fluendo.com> - - * ext/cdaudio/gstcdaudio.c: (_do_init), (gst_cdaudio_base_init), - (gst_cdaudio_get_event_masks), (gst_cdaudio_send_event), - (gst_cdaudio_query), (plugin_init), (cdaudio_uri_get_type), - (cdaudio_uri_get_protocols), (cdaudio_uri_get_uri), - (cdaudio_uri_set_uri), (cdaudio_uri_handler_init): - Added uri handler for cd:// - Port to new API. - -2004-10-18 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), - (gst_decode_bin_init), (find_compatibles), (close_pad_link), - (try_to_link_1), (no_more_pads), (close_link), (type_found): - * gst/playback/gstplaybasebin.c: (gen_preroll_element), - (remove_prerolls), (unknown_type), (add_element_stream), - (new_decoded_pad), (setup_source), (gst_play_base_bin_add_element), - (gst_play_base_bin_remove_element), - (gst_play_base_bin_link_stream): - * gst/playback/gstplaybin.c: (gen_video_element), - (gen_vis_element), (remove_sinks), (setup_sinks): - * gst/playback/gststreaminfo.c: (gst_stream_type_get_type), - (gst_stream_info_get_type), (gst_stream_info_class_init), - (gst_stream_info_init), (gst_stream_info_new), - (gst_stream_info_dispose), (stream_info_mute_pad), - (gst_stream_info_set_property), (gst_stream_info_get_property): - * gst/playback/gststreaminfo.h: - Add sink padtemplate to decodebin. - Added some more comments. - Make queue size configurable in playbasebin. - Added possibility to use elements as sinks (ex cdaudio). - -2004-10-15 Wim Taymans <wim@fluendo.com> - - * ext/speex/gstspeexenc.c: (gst_speexenc_class_init), - (gst_speexenc_chain): - Fix speex timestamps so that it gets muxed properly. - -2004-10-15 Wim Taymans <wim@fluendo.com> - - * ext/raw1394/gstdv1394src.c: (gst_dv1394src_get_type), - (gst_dv1394src_base_init), (gst_dv1394src_class_init), - (gst_dv1394src_init), (gst_dv1394src_dispose), - (gst_dv1394src_iso_receive), (gst_dv1394src_discover_avc_node), - (gst_dv1394src_change_state), (gst_dv1394src_get_event_mask), - (gst_dv1394src_event), (gst_dv1394src_get_formats), - (gst_dv1394src_convert), (gst_dv1394src_get_query_types), - (gst_dv1394src_query), (gst_dv1394src_uri_get_type), - (gst_dv1394src_uri_get_protocols), (gst_dv1394src_uri_get_uri), - (gst_dv1394src_uri_set_uri), (gst_dv1394src_uri_handler_init): - * ext/raw1394/gstdv1394src.h: - Added conversion/query functions. - Update buffer timestamps, - Added signals. - Added uri dv:// so it might play from the firewire in playbin. - Fix a possible leak. - Added debugging. - -2004-10-15 Wim Taymans <wim@fluendo.com> - - * ext/raw1394/gstdv1394src.c: (gst_dv1394src_class_init), - (gst_dv1394src_init), (gst_dv1394src_set_property), - (gst_dv1394src_get_property), (gst_dv1394src_iso_receive), - (gst_dv1394src_discover_avc_node), (gst_dv1394src_change_state): - * ext/raw1394/gstdv1394src.h: - Added AV/C VTR control support needed for some cameras. - Added automatic port detection. - Added properties for selecting the channel. - The configure.ac script is not yet updated to reflect the - new libavc1394 and librom1394 dependencies. - -2004-10-15 Wim Taymans <wim@fluendo.com> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (qtdemux_parse), (gst_qtdemux_handle_esds): - An esds box is not a container. - Fix parsing of mp4v boxes. - Do not try to renegotiate fps for each frame. Need to - find a better method. This should fix mp4 playback. - -2004-10-14 David Schleef <ds@schleef.org> - - * configure.ac: update for swfdec-0.3 and liboil-0.2 - * ext/swfdec/gstswfdec.c: update for swfdec-0.3 - * ext/swfdec/gstswfdec.h: same - * gst/videofilter/gstvideobalance.c: update for liboil-0.2 - * gst/videotestsrc/videotestsrc.c: same - -2004-10-14 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), - (gst_multifdsink_remove), (gst_multifdsink_remove_client_link), - (is_sync_frame), (gst_multifdsink_new_client), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), - (gst_multifdsink_handle_clients), (gst_multifdsink_change_state): - Turn warnings into info. - Don't allow a state change in the streaming thread. - -2004-10-14 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/vorbis/oggvorbisenc.c: - * ext/vorbis/vorbisdec.c: - fix template sample rate - -2004-10-13 Wim Taymans <wim@fluendo.com> - - * ext/mad/gstmad.c: (gst_mad_check_caps_reset), (gst_mad_chain): - Decoding the header first fixes some problems in resyncing - in more mp3s. - -2004-10-12 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstplaybin.c: (gen_video_element), - (gen_vis_element), (remove_sinks), (setup_sinks): - Added vis plugin support, need to configure the vis - element to activate it. - -2004-10-12 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get), - (gst_gnomevfssrc_srcpad_query), (gst_gnomevfssrc_srcpad_event): - Some debug. - * gst/avi/gstavidemux.c: (gst_avi_demux_reset), - (gst_avi_demux_handle_src_event), (gst_avi_demux_read_superindex), - (gst_avi_demux_read_subindexes), (gst_avi_demux_add_stream), - (gst_avi_demux_stream_index), (gst_avi_demux_skip), - (gst_avi_demux_sync), (gst_avi_demux_stream_scan), - (gst_avi_demux_massage_index), (gst_avi_demux_stream_header): - * gst/avi/gstavidemux.h: - Support for openDML-2.0 indx/ix## chunks. Support for broken index - recovery (where, if part of the index is broken, we will still read - the rest of the index and recover the broken part by stream - scanning). More broken media support. EOS workarounds. General AVI - braindamage headache recovery. Aspirin included. - -2004-10-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_open), - (cdparanoia_event), (cdparanoia_query): - Get rid of hideous lead-in. - -2004-10-11 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstplaybasebin.c: (setup_source): - Wrong var used to get g_list_next. - -2004-10-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init), - (cdparanoia_get), (cdparanoia_open): - Report discid as metadata, add duration. - -2004-10-11 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstplaybasebin.c: (setup_source): - Cleanup the previous pipeline a little earlier for the - case that a source element provides raw data. - -2004-10-11 Benjamin Otte <otte@gnome.org> - - * ext/mad/gstid3tag.c: (gst_id3_tag_chain): - reset v1 tag offset when there is no v1 tag. Fixes id3demux always - consuming the last 128 bytes, even though it was valid mp3 data. - -2004-10-10 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps), - (gst_v4lsrc_getcaps), (gst_v4lsrc_get): - * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): - Change g_warnings to GST_WARNING_OBJECT and fix colourspace issue - -2004-10-10 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_src_link), (gst_v4lsrc_getcaps): - Fix for webcams that support only specific width or height - -2004-10-09 Tim-Philipp Müller <t.i.m@zen.co.uk> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/wavenc/gstwavenc.c: (gst_wavenc_stop_file): - Fix wrong discont event setup (fixes #154967). - -2004-10-09 Sebastien Cote <sc5@hermes.usherb.ca> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/auparse/gstauparse.c: (gst_auparse_chain): - Error out on invalid data (fixes #154807). - -2004-10-09 Tim-Philipp Müller <t.i.m@zen.co.uk> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/dvdread/dvdreadsrc.c: (_read): - Make titles > 0 work again (fixes #154834). - -2004-10-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_template_caps): - WMV3 missing in template caps. - -2004-10-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): - OK, so the original code was too strict. It makes random AVI files - hang for seconds upon opening, which is unacceptable and is far - beyond the original goal of getting multiple chunks for one-chunk - sounc stream files. So now do just that. - -2004-10-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (setup_source), - (gst_play_base_bin_change_state): - Actually clean up streaminfo if output fails. This would trigger - if, for example, there was no CD in the drive. No preroll, so - a streaminfo structure is created, but the subsequent state change - of the thread fails. - * gst/playback/gstplaybin.c: (gst_play_bin_change_state): - Don't change state if parent failed. - -2004-10-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybin.c: (gst_play_bin_class_init), - (gst_play_bin_init), (gst_play_bin_get_property), (handoff), - (gen_video_element), (remove_sinks): - Add small bits of code for screenshot handling. - -2004-10-08 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstplaybin.c: (gst_play_bin_set_property), - (gen_video_element), (gen_audio_element), (setup_sinks): - Don't assume the user provided sinks are named "sink"... - -2004-10-08 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstplaybasebin.c: (gen_preroll_element), - (unknown_type), (setup_source), (gst_play_base_bin_remove_element), - (gst_play_base_bin_link_stream): - Do not try to autoplug sources that generate raw streams like - cdparanoia. - disconnect the preroll overrun signal when we don't need it anymore. - -2004-10-08 Milosz Derezynski <internalerror.rez@fhtw-berlin.de> - - * ext/cdparanoia/gstcdparanoia.c: (_do_init), - Added reworked patch from #154903 from milosz derezynski (deadchip). - -2004-10-08 Wim Taymans <wim@fluendo.com> - - * ext/cdparanoia/gstcdparanoia.c: (_do_init), - (cdparanoia_base_init), (cdparanoia_class_init), (cdparanoia_init), - (cdparanoia_dispose), (cdparanoia_get), (cdparanoia_change_state), - (cdparanoia_convert), (cdparanoia_uri_get_type), - (cdparanoia_uri_get_protocols), (cdparanoia_uri_get_uri), - (cdparanoia_uri_set_uri), (cdparanoia_uri_handler_init): - * ext/cdparanoia/gstcdparanoia.h: - This adds the cdda://<tracknum> uri. - -2004-10-08 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), - (gst_decode_bin_init), (find_compatibles), (close_pad_link), - (try_to_link_1), (no_more_pads), (close_link), (type_found): - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), - (unknown_type), (gst_play_base_bin_remove_element), - (gst_play_base_bin_link_stream): - * gst/playback/gstplaybasebin.h: - * gst/playback/gstplaybin.c: (gst_play_bin_init), - (gst_play_bin_set_property), (gen_video_element), - (gen_audio_element), (setup_sinks): - * gst/playback/gststreaminfo.c: (gst_stream_type_get_type), - (gst_stream_info_get_type), (gst_stream_info_class_init), - (gst_stream_info_init), (gst_stream_info_new), - (gst_stream_info_dispose), (stream_info_mute_pad), - (gst_stream_info_set_property), (gst_stream_info_get_property): - * gst/playback/gststreaminfo.h: - Reuse the audio and video bins. - Some internal cleanups in the stream selection code. - -2004-10-08 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), - (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): - * sys/ximage/ximagesink.h: - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), - (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): - * sys/xvimage/xvimagesink.h: Reverting Ronald's changes as the issue is - not coming from those elements. Moreover these elements should not keep - the xid they have been given when in NULL state. - -2004-10-07 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), - (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): - * sys/ximage/ximagesink.h: - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), - (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): - * sys/xvimage/xvimagesink.h: - Actually only create a new toplevel window if we're not gonna - embed it right after. - -2004-10-07 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstplaybasebin.c: (play_base_bin_mute_pad), - (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream): - * gst/playback/gstplaybin.c: (setup_sinks): - Implement muting/unmuting of streams, mute streams that are not - used. - -2004-10-07 Wim Taymans <wim@fluendo.com> - - * gst/typefind/gsttypefindfunctions.c: (ac3_type_find), - (plugin_init): - Added lame audio/x-ac3 typefind function. - -2004-10-06 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * configure.ac: - bump nano to cvs - -=== release 0.8.5 === - -2004-10-06 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * NEWS: - * RELEASE: - * configure.ac: - releasing 0.8.5, "Take You On" - -2004-10-06 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstdecodebin.c: (gst_decode_bin_init), - (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), - (no_more_pads), (close_link), (type_found): - * gst/playback/gstplaybasebin.c: (new_decoded_pad): - * gst/playback/gstplaybin.c: (gen_video_element): - Do not signal the no_more_pads after the first pad when - we are plugging a non dynamic element with multiple - output pads (like swfdec, dvdec, ...). - -2004-10-06 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - bump for prerelease - -2004-10-06 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/wavparse/gstwavparse.c: - add ATRAC3 to STATIC CAPS to fix a warning - - * gst/matroska/ebml-read.c: - * gst-libs/gst/riff/riff-read.c: - fix typos - -2004-10-06 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst-libs/gst/riff/riff-media.c: - generate caps for ATRAC3 audio streams - - * gst/realmedia/rmdemux.c: - generate caps for ATRAC3 audio streams - -2004-10-06 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/wavparse/Makefile.am - * gst/wavparse/riff.h - * gst/wavparse/wavparse.vcproj - riff.h removal (unused and duplication with riff-ids.h) - -2004-10-06 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/wavparse/gstwavparse.h - remove duplicated defines for audio codec codes - - * gst-libs/gst/riff/riff-ids.h - * gst/wavenc/riff.h: - add "4CC" code for ATRAC3 audio streams - add "4CC" code for ITU_G721_ADPCM (unused for now) - -2004-10-06 Wim Taymans <wim@fluendo.com> - - * gst/flx/gstflxdec.c: (gst_flxdec_init), (gst_flxdec_loop): - Actually _do_ negotiation. Pass gdouble as arg instead - of guint64 for the framerate. - -2004-10-06 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstdecodebin.c: (gst_decode_bin_init), - (find_compatibles), (close_pad_link), (try_to_link_1), - (no_more_pads), (close_link), (type_found): - * gst/playback/gstplaybasebin.c: (new_decoded_pad): - * gst/playback/gstplaybin.c: (gen_video_element), - (gen_audio_element): - Set state on newly added element to READY so that negotiation - can happen ASAP. - Addes some more debug info. - Do not try to plug pads with multiple caps structures or ANY - because it is too dangerous since we do not do dynamic - replugging. - -2004-10-06 Thomas Vander Stichele <thomas at apestaart dot org> - - written by: Gora Mohanty <gora_mohanty@yahoo.co.in> - - * po/LINGUAS: - * po/or.po: - add Oriya translation - -2004-10-05 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): - Prevent overwrite of size member. Makes audio sound crappy. - -2004-10-05 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/typefind/gsttypefindfunctions.c: (plugin_init): - Add rmvb to the list of known RealMedia extensions - -2004-10-05 Wim Taymans <wim@fluendo.com> - - * ext/libmng/gstmngdec.c: (gst_mngdec_loop), (mngdec_error), - (mngdec_openstream), (mngdec_closestream), - (mngdec_handle_sink_event), (mngdec_readdata), - (mngdec_gettickcount), (mngdec_settimer), (mngdec_processheader), - (mngdec_getcanvasline), (mngdec_refresh), - (gst_mngdec_change_state): - Set the framerate correctly. - -2004-10-04 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): - There was something wrong with the index massaging. - -2004-10-04 Wim Taymans <wim@fluendo.com> - - * ext/jpeg/gstjpeg.c: (smoke_type_find), (plugin_init): - * ext/jpeg/gstsmokedec.c: (gst_smokedec_init), - (gst_smokedec_chain): - * ext/jpeg/gstsmokedec.h: - * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_class_init), - (gst_smokeenc_init), (gst_smokeenc_resync), (gst_smokeenc_chain): - * ext/jpeg/gstsmokeenc.h: - * ext/jpeg/smokecodec.c: (smokecodec_encode_new), - (smokecodec_decode_new), (smokecodec_info_free), - (smokecodec_set_quality), (smokecodec_get_quality), - (smokecodec_set_threshold), (smokecodec_get_threshold), - (smokecodec_set_bitrate), (smokecodec_get_bitrate), - (find_best_size), (abs_diff), (put), (smokecodec_encode_id), - (smokecodec_encode), (smokecodec_parse_id), - (smokecodec_parse_header), (smokecodec_decode): - * ext/jpeg/smokecodec.h: - * ext/jpeg/smokeformat.h: - Updated smoke, new bitstream, allows embedding in ogg. - -2004-10-04 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_event): - Fix seeking in some files. All this code is no longer needed (and - actually breaks stuff) because we now synchronize the full index - right when reading the header. - -2004-10-04 Wim Taymans <wim@fluendo.com> - - * configure.ac: - configure update for libmng. - -2004-10-04 Wim Taymans <wim@fluendo.com> - - * ext/libmng/Makefile.am: - * ext/libmng/gstmng.c: (plugin_init): - * ext/libmng/gstmng.h: - * ext/libmng/gstmngdec.c: (gst_mngdec_get_type), - (gst_mngdec_base_init), (gst_mngdec_class_init), - (gst_mngdec_sinklink), (gst_mngdec_init), (gst_mngdec_src_getcaps), - (gst_mngdec_loop), (gst_mngdec_get_property), - (gst_mngdec_set_property), (mngdec_error), (mngdec_openstream), - (mngdec_closestream), (mngdec_handle_sink_event), - (mngdec_readdata), (mngdec_gettickcount), (mngdec_settimer), - (mngdec_processheader), (mngdec_getcanvasline), (mngdec_refresh), - (gst_mngdec_change_state): - * ext/libmng/gstmngdec.h: - * ext/libmng/gstmngenc.c: (gst_mngenc_get_type), - (mng_caps_factory), (raw_caps_factory), (gst_mngenc_base_init), - (gst_mngenc_class_init), (gst_mngenc_sinklink), (gst_mngenc_init), - (gst_mngenc_chain), (gst_mngenc_get_property), - (gst_mngenc_set_property): - * ext/libmng/gstmngenc.h: - Added basic MNG decoder. Needs more work. The encoder does - not work yet. - -2004-10-04 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/realmedia/rmdemux.c: (gst_rmdemux_handle_sink_event), - (gst_rmdemux_loop), (gst_rmdemux_add_stream), - (gst_rmdemux_parse_mdpr), (gst_rmdemux_dump_mdpr): - Don't hang on length=0 chunks. Some negotiation fixes. Signal - no-more-pads. - -2004-10-04 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - you need at least 1.0.4 of speex - -2004-10-04 Iain <iaingnome@gmail.com> - - * ext/speex/gstspeexdec.h: Revert the includes changes. - - * ext/speex/gstspeexenc.ch: Revert the includes changes. - -2004-09-30 Iain <iaingnome@gmail.com> - - * sys/sunaudio/gstsunaudio.c (gst_sunaudiosink_open): Use the device - found during init or set as a property instead of hardcoding /dev/audio - -2004-10-04 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/realmedia/rmdemux.c: (gst_rmdemux_class_init), - (gst_rmdemux_init), (gst_rmdemux_handle_sink_event), - (gst_rmdemux_loop), (gst_rmdemux_add_stream), (re_hexdump_bytes), - (re_dump_pascal_string), (gst_rmdemux_dump__rmf), - (gst_rmdemux_dump_prop), (gst_rmdemux_parse_mdpr), - (gst_rmdemux_dump_mdpr), (gst_rmdemux_dump_indx), - (gst_rmdemux_dump_data): - Use debug category, fix EOS handling. filesrc ! rmdemux now - works. - -2004-10-04 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), - (gst_avi_demux_stream_scan), (sort), (gst_avi_demux_massage_index), - (gst_avi_demux_stream_header), (gst_avi_demux_stream_data): - Improve allocation, cutting and sorting of the index. How takes a - few seconds instead of minutes. - -2004-10-03 Christophe Fergeau <teuf@gnome.org> - - * gst/realmedia/rmdemux.c: (gst_rmdemux_parse_mdpr): - fixed compilation - -2004-10-02 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data), - (gst_riff_create_video_template_caps): - Add wing commander format mimetype/fourccs. - * gst/avi/gstavidemux.c: (gst_avi_demux_massage_index): - Don't crash if some value is 0. - -2004-10-02 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data), - (gst_riff_create_video_template_caps): - Add DIB fourcc (raw, palettized 8-bit RGB). - * gst-libs/gst/riff/riff-read.c: - (gst_riff_read_strf_vids_with_data): - Oops, fix strf_data reading bug. - * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): - Use a non-NULL tag. - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): - Time for hacks. Sorry Dave. At least one quicktime movie (a - trailer) that I've encountered contains multiple video tracks. - One of those is the actual video track, the other are one-frame - tracks (images). Unfortunately, the number of frames according - to the trak header is 1 for each, so that doesn't help. So - instead, I look at the duration and discard tracks with a - duration shorter than 20% of the length of the stream. Better - than nothing. - -2004-10-01 Christian Schaller <christian@fluendo.com> - - * ext/ivorbis/vorbis.c: - Patch from Phil Blundell (Bug 152341) - -2004-10-01 Wim Taymans <wim@fluendo.com> - - * ext/speex/gstspeexdec.c: (gst_speex_dec_class_init), - (speex_dec_get_formats), (speex_dec_convert), - (speex_dec_src_query), (speex_dec_src_event), (speex_dec_event), - (speex_dec_chain), (gst_speexdec_get_property), - (gst_speexdec_set_property): - Small cleanups. - -2004-10-01 Wim Taymans <wim@fluendo.com> - - * gst/wavparse/gstwavparse.c: (gst_wavparse_class_init), - (gst_wavparse_stream_init), (gst_wavparse_fmt), - (gst_wavparse_other), (gst_wavparse_loop), - (gst_wavparse_pad_convert), (gst_wavparse_pad_query), - (gst_wavparse_srcpad_event): - * gst/wavparse/gstwavparse.h: - Added some more debugging info. - Fix the case where the length of the file is 0. - Make sure we seek to sample borders. - -2004-10-01 Wim Taymans <wim@fluendo.com> - - * gst/playback/README: - * gst/playback/gstdecodebin.c: (gst_decode_bin_factory_filter), - (gst_decode_bin_init), (find_compatibles), (close_pad_link), - (try_to_link_1), (no_more_pads), (close_link), (type_found): - Add some debug info to decodebin, update README - -2004-10-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/dvdnav/dvdnavsrc.c: (dvdnav_handle_navigation_event): - Don't use g_print(); use GST_DEBUG(). - -2004-10-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), - (gst_ogg_mux_queue_pads): - Handle EOS properly. - -2004-10-01 Sebastien Cote <sc5@hermes.usherb.ca> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_sinkconnect), - (gst_faad_chain), (gst_faad_change_state): - * ext/faad/gstfaad.h: - Allow playback of raw (unframed) MPEG AAC files (#148993). - -2004-10-01 Sebastien Cote <sc5@hermes.usherb.ca> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): - Throw error if we didn't recognize the stream. Fixes #152289. - -2004-10-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/videoscale/gstvideoscale.c: (gst_videoscale_link): - Fix negotiation. - -2004-10-01 Francis Labonte <francis_labonte@hotmail.com> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt): - Fix memleak. - -2004-10-01 Balamurali Viswanathan <balamurali.viswanathan@wipro.com> - - Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/sunaudio/gstsunaudio.c: (gst_sunaudiosink_setparams): - Solve #152805. - * sys/sunaudio/gstsunmixer.c: (gst_sunaudiomixer_set_mute): - Solve 152806. - -2004-10-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data), - (gst_riff_create_audio_caps_with_data): - Add codec_data handling (like asfdemux used to do). - * gst/asfdemux/gstasf.c: (plugin_init): - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), - (gst_asf_demux_add_audio_stream), (gst_asf_demux_add_video_stream): - Use riff-media for caps creation instead of our own (mostly - broken) copy of its functions. - -2004-10-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_try_capture): - Don't actually error out if we get another return value than - -EINVAL. Opposite to what I first thought, drivers have random - return values for this, although -EINVAL is the expected return - value. Since this is not fatal, we shouldn't use - GST_ELEMENT_ERROR() but just GST_ERROR_OBJECT(). - -2004-10-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_class_init), - (dvdreadsrc_init), (dvdreadsrc_dispose), (dvdreadsrc_set_property), - (dvdreadsrc_get_property), (_open), (_seek), (_read), - (dvdreadsrc_get), (dvdreadsrc_open_file), - (dvdreadsrc_change_state): - Fix. Don't do one big huge loop around the whole DVD, that will - cache all data and thus eat sizeof(dvd) (several GB) before we - see something. - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): - Actually NULL'ify event after using it. - * gst/matroska/ebml-read.c: (gst_ebml_read_use_event), - (gst_ebml_read_handle_event), (gst_ebml_read_element_id), - (gst_ebml_read_element_length), (gst_ebml_read_element_data), - (gst_ebml_read_seek), (gst_ebml_read_skip): - Handle events. - * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_base_init), - (gst_dvd_demux_init), (gst_dvd_demux_get_audio_stream), - (gst_dvd_demux_get_subpicture_stream), (gst_dvd_demux_plugin_init): - Fix timing (this will probably break if I seek using menus, but - I didn't get there yet). VOBs and normal DVDs should now work. - Add a mpeg2-only pad with high rank so this get autoplugged for - MPEG-2 movies. - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_base_init), - (gst_mpeg_demux_class_init), (gst_mpeg_demux_init), - (gst_mpeg_demux_new_output_pad), (gst_mpeg_demux_get_video_stream), - (gst_mpeg_demux_get_audio_stream), - (gst_mpeg_demux_get_private_stream), (gst_mpeg_demux_parse_packet), - (gst_mpeg_demux_parse_pes), (gst_mpeg_demux_plugin_init): - Use this as second rank for MPEG-1 and MPEG-2. Still use this for - MPEG-1 but use dvddemux for MPEG-2. - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_class_init), - (gst_mpeg_parse_init), (gst_mpeg_parse_new_pad), - (gst_mpeg_parse_parse_packhead): - Timing. Only add pad template if it exists. Add sink template from - class and not from ourselves. This means we will always use the - correct sink template even if it is not the one defined in this - file. - -2004-09-29 Wim Taymans <wim@fluendo.com> - - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_packet), - (gst_mpeg_demux_parse_pes): - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): - Fix playback of mpeg again, timestamps where screwed up by - patch 1.61. - -2004-09-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/flac/gstflacdec.c: (gst_flacdec_src_query): - Only return true if we actually filled something in. Prevents - player applications from showing a random length for flac files. - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_class_init), - (gst_riff_read_use_event), (gst_riff_read_handle_event), - (gst_riff_read_seek), (gst_riff_read_skip), (gst_riff_read_strh), - (gst_riff_read_strf_vids_with_data), - (gst_riff_read_strf_auds_with_data), (gst_riff_read_strf_iavs): - OK, ok, so I implemented event handling. Apparently it's normal - that we receive random events at random points without asking - for it. - * gst/avi/gstavidemux.c: (gst_avi_demux_reset), - (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), - (gst_avi_demux_handle_src_event), (gst_avi_demux_stream_index), - (gst_avi_demux_sync), (gst_avi_demux_stream_scan), - (gst_avi_demux_massage_index), (gst_avi_demux_stream_header), - (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry), - (gst_avi_demux_stream_data), (gst_avi_demux_loop): - * gst/avi/gstavidemux.h: - Implement non-lineair chunk handling and subchunk processing. - The first solves playback of AVI files where the audio and video - data of individual buffers that we read are not synchronized. - This should not happen according to the wonderful AVI specs, but - of course it does happen in reality. It is also a prerequisite for - the second. Subchunk processing allows us to cut chunks in small - pieces and process each of these pieces separately. This is - required because I've seen several AVI files with incredibly large - audio chunks, even some files with only one audio chunk for the - whole file. This allows for proper playback including seeking. - This patch is supposed to fix all AVI A/V sync issues. - * gst/flx/gstflxdec.c: (gst_flxdec_class_init), - (flx_decode_chunks), (flx_decode_color), (gst_flxdec_loop): - Work. - * gst/modplug/gstmodplug.cc: - Proper return value setting for the query() function. - * gst/playback/gstplaybasebin.c: (setup_source): - Being in non-playing state (after, e.g., EOS) is not necessarily - a bad thing. Allow for that. This fixes playback of short files. - They don't actually playback fully now, because the clock already - runs. This means that small files (<500kB) with a small length - (<2sec) will still not or barely play. Other files, such as mod - or flx, will work correctly, however. - -2004-09-28 Wim Taymans <wim@fluendo.com> - - * ext/speex/gstspeex.c: (plugin_init): - * ext/speex/gstspeexdec.c: (gst_speex_dec_base_init), - (gst_speex_dec_class_init), (speex_dec_get_formats), - (speex_get_event_masks), (speex_get_query_types), - (gst_speex_dec_init), (speex_dec_convert), (speex_dec_src_query), - (speex_dec_src_event), (speex_dec_event), (speex_dec_chain), - (gst_speexdec_get_property), (gst_speexdec_set_property), - (speex_dec_change_state): - * ext/speex/gstspeexdec.h: - * ext/speex/gstspeexenc.c: (gst_speexenc_get_formats), - (gst_speexenc_get_type), (speex_caps_factory), (raw_caps_factory), - (gst_speexenc_base_init), (gst_speexenc_class_init), - (gst_speexenc_sinkconnect), (gst_speexenc_convert_src), - (gst_speexenc_convert_sink), (gst_speexenc_get_query_types), - (gst_speexenc_src_query), (gst_speexenc_init), - (gst_speexenc_get_tag_value), (comment_init), (comment_add), - (gst_speexenc_metadata_set1), (gst_speexenc_set_metadata), - (gst_speexenc_setup), (gst_speexenc_buffer_from_data), - (gst_speexenc_push_buffer), (gst_speexenc_set_header_on_caps), - (gst_speexenc_chain), (gst_speexenc_get_property), - (gst_speexenc_set_property), (gst_speexenc_change_state): - * ext/speex/gstspeexenc.h: - Rewrote speex encoder, make sure it can be embedded in ogg. - Implemented speex decoder. - -2004-09-28 Christian Schaller <christian@fluendo.com> - - * configure.ac: - Remove kioslave plugin. Markey is brewing a new working one - * ext/Makefile.am: Remove kioslave plugin - * ext/kio: remove - * gst-plugins.spec.in: remove kio plugin from spec - -2004-09-27 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), - (gst_multifdsink_remove), (gst_multifdsink_remove_client_link), - (is_sync_frame), (gst_multifdsink_client_queue_buffer), - (gst_multifdsink_new_client), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), - (gst_multifdsink_handle_clients): - * gst/tcp/gstmultifdsink.h: - Make syncing to keyframes actually work for new clients and lagging - clients. - -2004-09-26 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/debug/gstnavigationtest.c: (gst_navigationtest_class_init), - (gst_navigationtest_handle_src_event), (draw_box_planar411), - (gst_navigationtest_planar411), (gst_navigationtest_change_state): - * gst/debug/gstnavigationtest.h: - make navigationtest display button-press and button-release events - -2004-09-26 Iain <iaingnome@gmail.com> - - * gst/interleave/interleave.c (all_channels_new_media): Checks if all - the channels have received a new media event. - (interleave_buffered_loop): Compresses a new media event on all - channels into one. - -2004-09-26 Iain <iaingnome@gmail.com> - - * gst/wavenc/gstwavenc.c (gst_wavenc_chain): Company says we need to - call the sinkpad's default event handler and not the srcpads. He also - says this is confusing :) - (gst_wavenc_stop_file): Company says that seek events only go upstream - we should send a discontinuous downstream instead. - -2004-09-25 Christian Schaller <christian@fluendo.com> - - * Update SPEC file to be usable in conjunction with Fedora Core, - Fedora.us and freshrpms packages - * Fix typo in multifilesrc test Makefile - -2004-09-24 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstplaybasebin.c: (new_decoded_pad): - Only signal the no_more_pads signal when we have - added the stream to our list. - -2004-09-24 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstplaybasebin.c: (remove_prerolls), - (new_decoded_pad): - * gst/playback/gstplaybasebin.h: - * gst/playback/gstplaybin.c: (setup_sinks): - Don't try to preroll or decode more than one audio/video - track. - -2004-09-24 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): - Throw error if we failed to find a suitable output. This should - throw an error if we successfully set up a pipeline (e.g. because - we recognized a media file) but found no decodable streams in it - (e.g. because it contains only media stream types for which we - have no decoders, or because it's not a media type). - -2004-09-23 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/dirac/Makefile.am: - * ext/dirac/gstdirac.cc: - * ext/dirac/gstdiracdec.cc: - * ext/dirac/gstdiracdec.h: - Do something. Don't actually know if this works because I don't - have a demuxer yet. - * ext/gsm/gstgsmdec.c: (gst_gsmdec_getcaps): - Add channels=1 to caps returned from _getcaps(). - * ext/ogg/gstogmparse.c: (gst_ogm_audio_parse_get_type), - (gst_ogm_video_parse_get_type), (gst_ogm_audio_parse_base_init), - (gst_ogm_video_parse_base_init), (gst_ogm_parse_init), - (gst_ogm_audio_parse_init), (gst_ogm_video_parse_init), - (gst_ogm_parse_sink_convert), (gst_ogm_parse_chain), - (gst_ogm_parse_change_state): - Separate between audio/video so ogmaudioparse actually uses the - audio pad templates. Both audio and video work now, including - autoplugging. Also use sometimes-srcpad hack. - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): - Handle events better. Don't hang on infinite loops. - * gst/avi/gstavidemux.c: (gst_avi_demux_class_init), - (gst_avi_demux_init), (gst_avi_demux_reset), - (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), - (gst_avi_demux_stream_header), (gst_avi_demux_stream_data), - (gst_avi_demux_change_state): - * gst/avi/gstavidemux.h: - Improve A/V sync. Still not perfect. - * gst/matroska/ebml-read.c: (gst_ebml_read_seek), - (gst_ebml_read_skip): - Handle events better. - * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), - (gst_qtdemux_loop_header), (qtdemux_parse_trak), - (qtdemux_audio_caps): - Add IMA4. Improve event handling. Save offset after a seek when - the headers are at the end of the file so that we don't end up in - an infinite loop. - * gst/typefind/gsttypefindfunctions.c: (qt_type_find): - Add low-priority typefind support for files with no length. - -2004-09-23 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * testsuite/multifilesink/Makefile.am: - fix typo - -2004-09-22 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls): Fix - mistakes from thaytan's patches. - -2004-09-23 Jan Schmidt <thaytan@mad.scientist.com> - - * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy): - For completeness, XSync in the destroy function as xvimage does. - -2004-09-23 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_getcaps): - Correct caps negotiation - * gst/volume/gstvolume.c: (volume_chain_float), - (volume_chain_int16): - Modify debug output to be little more informative - * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), - (gst_xvimagesink_xvimage_destroy): - Add XSync calls after detaching from the shared memory segment to - avoid a crash. - -2004-09-22 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/ogg/gstoggmux.c: (gst_ogg_mux_init), - (gst_ogg_mux_next_buffer), (gst_ogg_mux_loop): - * ext/vorbis/vorbis.c: (plugin_init): - * ext/vorbis/vorbisenc.c: (gst_vorbisenc_init), - (gst_vorbisenc_chain): - * ext/vorbis/vorbisenc.h: - remove explicit newmedia support from oggmux and vorbisenc - add debug category to vorbisenc - * gst/multifilesink/gstmultifilesink.c: - (gst_multifilesink_class_init), (gst_multifilesink_init), - (gst_multifilesink_dispose), (gst_multifilesink_set_location), - (gst_multifilesink_set_property), (gst_multifilesink_next_file), - (gst_multifilesink_handle_event), (gst_multifilesink_chain), - (plugin_init): - * gst/multifilesink/gstmultifilesink.h: - add support for streamheader in multifilesink - -2004-09-22 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/asfdemux/gstasfdemux.c: (_read_var_length), (_read_guid), - (gst_asf_demux_process_segment), (gst_asf_demux_handle_data), - (gst_asf_demux_process_chunk), (gst_asf_demux_handle_sink_event): - Prevent infinite loops. More correct error reporting. - * gst/auparse/gstauparse.c: (gst_auparse_chain): - Error out if negotiation fails. - * gst/playback/gstplaybasebin.c: (setup_source), - (gst_play_base_bin_change_state), (gst_play_base_bin_error), - (gst_play_base_bin_found_tag): - Error/tag forwarding. Pre-roll fixes for source errors on state - changes (e.g. "file does not exist") to prevent hangs. - -2004-09-21 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * testsuite/multifilesink/Makefile.am: - * testsuite/multifilesink/lame_test.c: (gst_newmedia_base_init), - (gst_newmedia_class_init), (gst_newmedia_init), - (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), - (newfile_signal), (test_signal), (main): - * testsuite/multifilesink/multifilesrc_test.c: (main): - * testsuite/multifilesink/oggtheora_test.c: - (gst_newmedia_base_init), (gst_newmedia_class_init), - (gst_newmedia_init), (gst_newmedia_chain), (gst_newmedia_trigger), - (test_format), (newfile_signal), (test_signal), (main): - * testsuite/multifilesink/oggvorbis_test.c: - (gst_newmedia_base_init), (gst_newmedia_class_init), - (gst_newmedia_init), (gst_newmedia_chain), (gst_newmedia_trigger), - (test_format), (newfile_signal), (test_signal), (main): - * testsuite/multifilesink/wavenc_test.c: (gst_newmedia_base_init), - (gst_newmedia_class_init), (gst_newmedia_init), - (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), - (newfile_signal), (test_signal), (main): - New media tests - -2004-09-20 Christian Schaller <christian@fluendo.com> - - * Fix mikmod license to LGPL as they have relicensed - * Move Dirac and Effectv into LGPL section of README_license - -2004-09-20 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/mad/gstmad.c: (gst_mad_check_caps_reset), - (gst_mad_change_state): - Allow for mp3 rate/channels changes. However, only very - conservatively. Reason that we *have* to enable this is smiply - because the mad find_sync() function is not good enough, it will - regularly sync on random data as valid frames and therefore make - us provide random caps as *final* caps of the stream. The best fix - I could think of is to simply require several of the same stream - changes in a row before we change caps. - The actual testcase that works now is # - * ext/ogg/Makefile.am: - * ext/ogg/gstogg.c: (plugin_init): - * ext/ogg/gstogmparse.c: - OGM support (video only for now; I need an audio sample file). - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), - (gst_asf_demux_process_stream), (gst_asf_demux_video_caps), - (gst_asf_demux_add_video_stream): - WMV extradata. - * gst/playback/gstplaybasebin.c: (unknown_type): - Don't error out on single unknown-types after all. It's wrong. - If we found type of video and audio but not of a subtitle stream, - it will still error out (which is unwanted). Will find a better fix - later on. - * gst/typefind/gsttypefindfunctions.c: (ogmvideo_type_find), - (ogmaudio_type_find), (plugin_init): - OGM support. - -2004-09-20 Johan Dahlin <johan@gnome.org> - - * ext/jpeg/gstjpegdec.c (gst_jpegdec_chain): Allocate the buffer - after setting caps. - -2004-09-19 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * gst/wavenc/gstwavenc.c: (gst_wavenc_init), (gst_wavenc_chain): - * gst/wavenc/gstwavenc.h: - Added newmedia support to wavenc - -2004-09-17 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstfdset.c: (gst_fdset_fd_has_closed), - (gst_fdset_fd_has_error), (gst_fdset_fd_can_read), - (gst_fdset_fd_can_write), (gst_fdset_wait): - * gst/tcp/gstmultifdsink.c: (gst_client_status_get_type), - (gst_multifdsink_init), (gst_multifdsink_add), - (gst_multifdsink_remove), (gst_multifdsink_get_stats), - (gst_multifdsink_remove_client_link), - (gst_multifdsink_client_queue_buffer), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_recover_client), (gst_multifdsink_handle_clients), - (gst_multifdsink_close), (gst_multifdsink_change_state): - * gst/tcp/gstmultifdsink.h: - * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), - (gst_tcpserversink_removed): - Small cleanups in fdset.c - Use a hastable to map fd to the client structure for faster - lookup in _remove and get_stats. - Added virtual function to close the fds. - Handle clients even when the select/poll call was unblocked because - of a command. - Implement syncing to keyframe in the recovery procedure. - -2004-09-16 Iain <iaingnome@gmail.com> - - * gst/audioconvert/gstaudioconvert.c (_fixate_caps_to_int): Free the - try caps. - -2004-09-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_get_audio_stream): - Caps are only set if the type of the stream is unknown, but this - is initialized in ->init_stream(), so set to UNKNOWN after calling - ->init_stream() so that capsnego starts. - -2004-09-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), - (gst_avi_demux_stream_data): - Just hardcode for raw audio then. AVI audio sucks. - -2004-09-15 Arwed v. Merkatz <v.merkatz@gmx.net> - - * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps): - * gst/matroska/matroska-mux.c: (audiosink_templ), - (gst_matroska_mux_audio_pad_link): - * gst/typefind/gsttypefindfunctions.c: (tta_caps), (plugin_init): - Use audio/x-ttafile for tta files and audio/x-tta for raw tta frames. - -2004-09-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), - (gst_avi_demux_stream_data): - Try to fix a/v sync issues. - -2004-09-15 David Schleef <ds@schleef.org> - - * configure.ac: remove NASM check, since we don't use it. Update - dirac check to 0.4 - * ext/dirac/gstdiracdec.cc: update to current 0.4 API - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): - Initialized variables. - * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), - (gst_qtdemux_loop_header), (qtdemux_parse), (qtdemux_parse_trak), - (gst_qtdemux_handle_esds), (qtdemux_audio_caps): Fix seeking, add - SVQ3 format - -2004-09-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), - (gst_avi_demux_add_stream), (gst_avi_demux_stream_data): - * gst/avi/gstavidemux.h: - Fix for compressed audio (mp3) timestamp generation. How did this - ever work? - -2004-09-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybin.c: (gst_play_bin_get_property): - Volume is a double not a float. - -2004-09-15 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_remove_client_link), - (gst_multifdsink_handle_clients), (gst_multifdsink_change_state): - Don't close the fd in multifdsink as we didn't open it in the - first place. Some cleanups. - -2004-09-15 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): - * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), - (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): - Fix the case where the muxer would mark pages as delta - frames when they are not (vorbis only ogg). - -2004-09-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: (state_change), (setup_source), - (gst_play_base_bin_change_state): - Handle the case where we failed to setup a clear pipeline. This - will throw an error (or EOS, another nice case) and if you don't - catch that, the app will wait for the signal forever (and thus - hang). - -2004-09-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/gnomevfs/gstgnomevfssink.c: - (gst_gnomevfssink_uri_get_protocols): - * ext/gnomevfs/gstgnomevfssrc.c: - (gst_gnomevfssrc_uri_get_protocols): - * ext/gnomevfs/gstgnomevfsuri.c: (gst_gnomevfs_get_supported_uris): - * ext/gnomevfs/gstgnomevfsuri.h: - Use _uri_new() instead of _open(), so it doesn't take as long and - Christophe's computer won't hang. - * gst/playback/gstplaybasebin.c: (unknown_type): - Throw error on unknown media type, so apps actually display it. - -2004-09-14 Brian Cameron <brian.cameron@sun.com - - * tools/gst-launch-ext-m.m: Changed ~ to $ENV{HOME} to allow - this script to work on Solaris since bash shell handles echo - differenly than bash. - -2004-09-17 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstplaybasebin.c: (queue_overrun), (no_more_pads), - (setup_source), (gst_play_base_bin_set_property), - (gst_play_base_bin_add_element): - * gst/playback/gstplaybin.c: (gst_play_bin_send_event): - Some more work on making sure seeking pauses the pipeline and - that changing the uri actually does something. - -2004-09-17 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstfdset.c: (gst_fdset_wait): - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_close): - * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_init_send), - (gst_tcpserversink_close): - Be a bit more paranoid when freeing memory. - -2004-09-13 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), - (qtdemux_parse_trak): - Don't crash by dividing by zero (see sample movie in #126922). - -2004-09-13 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): - Don't touch non-existing data (fixes crash on file in #140147). - -2004-09-13 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/playback/gstplaybasebin.c: - (gst_play_base_bin_dispose), (gst_play_base_bin_set_property): - Handle double disposals, and proper change of URIs. - -2004-09-13 Martin Eikermann <meiker@upb.de> - - * gst/mpegstream/gstmpegparse.c: - fix synchronistation for streams recorded from digital PCR - fixes bug #119376 - -2004-09-13 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/gnomevfs/Makefile.am: - * ext/gnomevfs/gstgnomevfs.c: (plugin_init): - * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_get_type), - (gst_gnomevfssink_dispose), (gst_gnomevfssink_init), - (gst_gnomevfssink_uri_get_type), - (gst_gnomevfssink_uri_get_protocols), - (gst_gnomevfssink_uri_get_uri), (gst_gnomevfssink_uri_set_uri), - (gst_gnomevfssink_uri_handler_init), - (gst_gnomevfssink_set_property), (gst_gnomevfssink_get_property), - (gst_gnomevfssink_open_file), (gst_gnomevfssink_close_file): - * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get_type), - (gst_gnomevfssrc_init), (gst_gnomevfssrc_dispose), - (gst_gnomevfssrc_uri_get_type), - (gst_gnomevfssrc_uri_get_protocols), (gst_gnomevfssrc_uri_get_uri), - (gst_gnomevfssrc_uri_set_uri), (gst_gnomevfssrc_uri_handler_init), - (gst_gnomevfssrc_set_property), (gst_gnomevfssrc_get_property), - (gst_gnomevfssrc_open_file), (gst_gnomevfssrc_close_file): - * ext/gnomevfs/gstgnomevfsuri.c: (gst_gnomevfs_get_supported_uris): - * ext/gnomevfs/gstgnomevfsuri.h: - Add URI support to Gnome-VFS plugins. Tries to load a fixed list - of fake URIs to see which this version of Gnome-VFS likes, and - uses that for the Gst-URI interface. Makes playbin support http:// - streams. Also fix up some stupid behaviour in gnomevfssrc. - -2004-09-13 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_update), - (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), - (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record), - (gst_alsa_mixer_set_option), (gst_alsa_mixer_get_option): - Update mixer (to sync with other sessions) if we try to obtain - a new value. This makes alsamixer work accross applications. - * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_time): - Only call sync functions if we're running, else alsalib asserts. - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query): - Sometimes fails to compile. Possibly a gcc bug. - * gst/playback/gstplaybin.c: (gen_video_element), - (gen_audio_element): - Add a reference to an application-provided object, because we lose - this same reference if we add it to the bin. If we don't do this, - we can only use this object once and thus crash if we go from - ready to playing, back to ready and back to playing again. - Also add an audioscale element because several cheap soundcards - - like mine - don't support all samplerates. - * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), - (gst_ximagesink_xcontext_clear), (gst_ximagesink_change_state): - Fix wrong order or PAR calls. Makes automatically obtained PAR - from the X server atually being used. - -2004-09-12 David Schleef <ds@schleef.org> - - Fixes: #151879, #151881, #151882, #151883, #151884, #151886, - #151887, #152102, #152247. - * examples/indexing/indexmpeg.c: 64-bit warning fixes. - * examples/seeking/cdparanoia.c: same - * examples/seeking/cdplayer.c: same - * examples/seeking/seek.c: same - * examples/seeking/spider_seek.c: same - * examples/seeking/vorbisfile.c: same - * examples/stats/mp2ogg.c: same - * ext/esd/esdsink.c: (gst_esdsink_class_init), - (gst_esdsink_dispose): Dispose of element properly. - * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_seek): 64-bit warning - fixes. - * ext/nas/nassink.c: (gst_nassink_class_init), - (gst_nassink_dispose): Dispose of element correctly. - * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): Fix leak. - * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), - (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy): - Fix 64-bit warning. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), - (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy): - Fix 64-bit warning. - -2004-09-12 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * configure.ac : change speex detection as 1.1.6 now uses - .pc/pkg-config and they changed their headers location. - -2004-09-09 Arwed v. Merkatz <v.merkatz@gmx.net> - - * gst/matroska/matroska-mux.h: - * gst/matroska/matroska-mux.c: (gst_matroska_mux_reset), - (gst_matroska_mux_start), (gst_matroska_mux_finish), - (gst_matroska_mux_write_data): - Write multiple blocks/frames per cluster. - Write meta-seek information (seek heads). - -2004-09-09 Scott Wheeler <wheeler@kde.org> - - * gst/gstplaybin.c: (gst_play_bin_class_init), (gst_play_bin_init), - (gst_play_bin_set_property), (gst_play_bin_get_property), - (gen_audio_element), (gen_audio_element): - Add a volume element / property to the pipeline. - -2004-09-07 Wim Taymans <wim@fluendo.com> - - * gst/videomixer/videomixer.c: (gst_videomixer_blend_buffers): - Copy timestamps from the master pad to the output buffers. - -2004-09-03 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/raw1394/gstdv1394src.c: - throw errors when applicable - -2004-09-01 Arwed v. Merkatz <v.merkatz@gmx.net> - - * gst/matroska/ebml-ids.h: - * gst/matroska/ebml-read.c: (gst_ebml_read_date): - * gst/matroska/ebml-write.c: (gst_ebml_write_date): - * gst/matroska/matroska-mux.c: (gst_matroska_mux_finish): - automatically convert unix time <-> ebml time when reading/writing - a date, use gst_ebml_write_uint to write CUETIME, - not gst_ebml_write_date. - * gst/matroska/matroska-ids.h: - * gst/matroska/matroska-mux.c: (gst_matroska_mux_create_uid), - (gst_matroska_mux_reset), (gst_matroska_mux_audio_pad_link), - (gst_matroska_mux_track_header), (gst_matroska_mux_start), - (gst_matroska_mux_write_data): - Write track and segment UIDs, write muxing date, write - TRACKDEFAULTDURATION for TTA audio, write BLOCKDURATION if known. - Create cues for audio only files. - -2004-08-31 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): - * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): - Re-commit ALSA switches. - * gst/adder/gstadder.c: (gst_adder_loop): - 64-bit fix (#151416). - * gst/debug/progressreport.c: (gst_progressreport_report): - 64-bit fix (#151419). - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_parse_contents): - 64-bit fix (#151420). - * gst/playback/test3.c: (update_scale): - 64-bit fix (#151421). - -2004-08-31 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - bump nano to cvs - -=== release 0.8.4 === - -2004-08-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: releasing 0.8.4, "Alias" - -2004-08-31 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/theora/Makefile.am: - fix makefile. Fixes #151462. - -2004-08-30 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstfdset.c: (gst_fdset_free), (gst_fdset_wait): - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), - (gst_multifdsink_remove_client_link), - (gst_multifdsink_client_queue_buffer), - (gst_multifdsink_handle_client_write): - * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_init_send): - * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_init_receive): - Fix some memory leaks. - -2004-08-30 Thomas Vander Stichele <thomas at apestaart dot org> - - Patch by: David Schleef - - * configure.ac: - * sys/Makefile.am: - rename our detection macro for V4L2. Fixes #151236. - -2004-08-30 Thomas Vander Stichele <thomas at apestaart dot org> - - Patch by: David Schleef - - * configure.ac: - check to define LAMEPRESET. Fixes #151232. - -2004-08-27 David Schleef <ds@schleef.org> - - * sys/glsink/glimagesink.c: (gst_glimagesink_ximage_put), - (gst_glimagesink_xwindow_new), (gst_glimagesink_xcontext_get), - (gst_glimagesink_fixate): Move local variable declarations to - make gcc-2.95 happy. - -2004-08-27 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - bump nano for prerelease - -2004-08-27 David Schleef <ds@schleef.org> - - * sys/sunaudio/Makefile.am: Add sunaudiosrc patch from Bala - * sys/sunaudio/gstsunaudiosrc.c: - * sys/sunaudio/gstsunaudiosrc.h: - -2004-08-27 Arwed v. Merkatz <v.merkatz@gmx.net> - - * gst/matroska/ebml-read.c: (gst_ebml_peed_id), (gst_ebml_read_element_id), - handle EOS correctly - * gst/matroska/matroska-mux.c: (gst_matroska_mux_video_pad_link): - * gst/matroska/matroska-mux.h: - added BITMAPINFOHEADER structure, mux video/x-divx and video/x-xvid in - VFW compatibility mode - -2004-08-27 Thomas Vander Stichele <thomas at apestaart dot org> - - patch by: Zaheer Abbas Merali - - * ext/ogg/gstoggmux.c: - * ext/vorbis/vorbisenc.c: - * ext/vorbis/vorbisenc.h: - handle NEWMEDIA - -2004-08-26 Arwed v. Merkatz <v.merkatz@gmx.net> - - * gst/matroska/ebml-write.c: (gst_ebml_write_float), - fix byte order reversion on little endian machines. - * gst/matroska/matroska-mux.c: (audiosink_templ), - (gst_matroska_mux_audio_pad_link): - add TTA codec to the list of supported codecs. - * gst/matroska/matroska-mux.c: (gst_matroska_mux_init), - (gst_matroska_mux_start), (gst_matroska_mux_finish), - (gst_matroska_mux_write_data): - * gst/matroska/matroska-mux.h: - write segment duration correctly, write muxing app string, fixes bugs - #140897 and #140898. - * gst/matroska/matroska-mux.c: (gst_matroska_mux_loop), - wait for all pads to be negotiated before starting to mux. - -2004-08-26 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/lame/gstlame.c: (gst_lame_init), (gst_lame_chain): - * ext/lame/gstlame.h: - Added new media support to lame - -2004-08-25 Arwed v. Merkatz <v.merkatz@gmx.net> - - * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_blockgroup), - send vorbis headers at the beginning of a stream, fixes bug #141554. - Interpret BLOCKDURATION and set buffer duration accordingly, fixes - bug #148950. - * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps), - (gst_matroska_demux_plugin_init): - * gst/matroska/matroska-ids.h: - enable demuxing of TTA audio streams, fixes bug #148951. - * gst/typefind/gsttypefindfunctions.c: (tta_type_find), (plugin_init), - enable typefinding for TTA audio files, fixes bug #148711. - * ext/xvid/gstxviddec.c: (gst_xviddec_chain), - set XVID_LOWDELAY flag for decoding so xvid always returns an image, - fixes playback of packed bitstream and xvid with bframes, bug #135407. - -2004-08-24 Sebastien Cote <sc5@hermes.usherb.ca> - - * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), - (gst_riff_read_element_data), (gst_riff_read_seek), - (gst_riff_read_skip): fix infinite loop in wavparse, fixes bug - #144616, patch reviewed by Ronald and committed by Christophe Fergeau - <teuf@gnome.org> - -2004-08-23 Iain <iaingnome@gmail.com> - - * ext/mad/gstid3tag.c (gst_mad_id3_to_tag_list): Special case COMM - tags. They appear to be handled differently to normal. - (tag_list_to_id3_tag_foreach): Ditto. - -2004-08-22 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), - (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): - Make sure we never send -1 granulepos. - -2004-08-20 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), - (gst_ogg_mux_loop): - I will accept bitchslappings with non sharp objects. - -2004-08-20 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * configure.ac: - Clean up the test for lame presets - -2004-08-19 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * configure.ac: - * ext/lame/Makefile.am: - * ext/lame/gstlame.c: (gst_lame_class_init), - (gst_lame_set_property), (gst_lame_get_property), (gst_lame_setup): - Only enable lame presets if version of lame has presets in API - -2004-08-19 Jan Schmidt <thaytan@mad.scientist.com> - * gst/udp/gstudpsrc.c: (gst_udpsrc_init), (gst_udpsrc_get): - * gst/udp/gstudpsrc.h: - Don't call gst_pad_push in a get function. Fixes #150449 - -2004-08-18 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstfdset.c: (gst_fdset_free), (gst_fdset_set_mode), - (gst_fdset_get_mode), (gst_fdset_add_fd), (gst_fdset_remove_fd), - (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read), - (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), - (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), - (gst_fdset_wait): - * gst/tcp/gstfdset.h: - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), - (gst_multifdsink_client_queue_buffer), - (gst_multifdsink_handle_client_write): - * gst/tcp/gstmultifdsink.h: - Some extra checks in gstfdset. - Only use send() when the fd is a socket. Don't try to - read from write only fds. - -2004-08-18 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstfdset.c: (gst_fdset_add_fd), (gst_fdset_remove_fd), - (gst_fdset_fd_ctl_write), (gst_fdset_fd_ctl_read), - (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), - (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), - (gst_fdset_wait): - Add more locking and bounds checking. - -2004-08-18 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstfdset.c: (ensure_size), (gst_fdset_wait): - Realloc test fdset in the lock and right before starting - the poll call. Bump the limit to 4096. - -2004-08-17 David Schleef <ds@schleef.org> - - * sys/sunaudio/Makefile.am: - * sys/sunaudio/gstsunaudio.c: Fix caps to handle full range - of rates and channels. Make debugging less obnoxious. - - Patch from Balamurali Viswanathan implementing a mixer for - Sun audio. (bug #144091): - * sys/sunaudio/gstsunelement.c: - * sys/sunaudio/gstsunelement.h: - * sys/sunaudio/gstsunmixer.c: - * sys/sunaudio/gstsunmixer.h: - -2004-08-17 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * gst/audioscale/gstaudioscale.c: - * gst/audioscale/gstaudioscale.h: - made audioscale resample from any sample rate to any sample rate - -2004-08-17 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/libpng/gstpngdec.c: - error out on unsupported types - -2004-08-17 Iain <iaingnome@gmail.com> - - * ext/flac/gstflacenc.c (gst_flacenc_update_quality): Only set the - mid_side and loose_mid_side properties if its a stereo stream. - -2004-08-17 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoradec.c: (gst_theora_dec_class_init), - (theora_get_formats), (theora_dec_src_convert), - (theora_dec_sink_convert), (theora_dec_src_query), - (theora_dec_src_event), (theora_dec_event), (theora_dec_chain): - Add a debug line. - -2004-08-17 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_iterate), - (gst_ogg_pad_push): - * ext/ogg/gstoggmux.c: (gst_ogg_mux_init), - (gst_ogg_mux_request_new_pad), (gst_ogg_mux_next_buffer), - (gst_ogg_mux_buffer_from_page), (gst_ogg_mux_push_page), - (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): - Mark delta units in the muxer. - Try to decode the packet after an out-of-sync error from - libogg. - -2004-08-17 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), - (gst_multifdsink_init), (gst_multifdsink_add), - (gst_multifdsink_client_queue_buffer), - (gst_multifdsink_set_property), (gst_multifdsink_get_property): - * gst/tcp/gstmultifdsink.h: - Added option to send a keyframe to clients as the first buffer. - Make timeout property writable. - -2004-08-17 Thomas Vander Stichele <thomas at apestaart dot org> - - patch by: Wim Taymans - - * gst/tcp/gstfdset.c: - * gst/tcp/gstmultifdsink.c: - fix index comparison, should include 0 - -2004-08-16 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstfdset.c: (ensure_size), (gst_fdset_new), - (gst_fdset_add_fd), (gst_fdset_remove_fd), - (gst_fdset_fd_has_closed), (gst_fdset_fd_has_error), - (gst_fdset_fd_can_read), (gst_fdset_fd_can_write), - (gst_fdset_wait): - copy when reallocing for poll so the select arguments don't get - changed during the call - -2004-08-16 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoraenc.c: (gst_border_mode_get_type), - (gst_theora_enc_class_init), (theora_enc_sink_link), - (theora_buffer_from_packet), (theora_enc_chain): - Fix bug where buffers were not marked as keyframes - correctly. - -2004-08-15 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/lame/gstlame.c: (gst_lame_vbrmode_get_type), - (gst_lame_preset_get_type), (gst_lame_class_init): - describe the enum values for vbr mode and presets more verbosely - -2004-08-13 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/lame/gstlame.c: (gst_lame_mode_get_type), - (gst_lame_quality_get_type), (gst_lame_padding_get_type), - (gst_lame_preset_get_type), (gst_lame_class_init), (gst_lame_init), - (gst_lame_set_property), (gst_lame_get_property), (gst_lame_setup): - * ext/lame/gstlame.h: - add preset property to lame so it can use lame presets - -2004-08-13 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/lame/gstlame.c: (gst_lame_get_property): - whoops forgot break, thanks teuf - -2004-08-13 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/lame/gstlame.c: (gst_lame_vbrmode_get_type), - (gst_lame_class_init), (gst_lame_src_getcaps), - (gst_lame_sink_link), (gst_lame_init), (gst_lame_set_property), - (gst_lame_get_property), (gst_lame_setup): - * ext/lame/gstlame.h: - fix lame's broken vbr stuff, allow it to resample if need be, and also - make xing header optional - -2004-08-12 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/lame/gstlame.c: (gst_lame_src_getcaps), (gst_lame_init): - added getcaps function so samplerate doesnt get fixated to silly values - -2004-08-12 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/lame/gstlame.c: (gst_lame_src_link): - revert previous fix - -2004-08-12 Johan Dahlin <johan@gnome.org> - - * sys/v4l/gstv4lelement.c (gst_v4l_iface_supported): Remove bogus - checks. Doesn't matter what state we are in. Interfaces are a - compile time thing, not runtime. It also broke the python bindings. - -2004-08-12 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/lame/gstlame.c: (gst_lame_src_link): - made source pad link function check if sinkpad is ok..fixes the problem - where core fixates the output rate of lame stupidly - -2004-08-12 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_src_link), (gst_v4lsrc_fixate): - * sys/v4l/v4l_calls.c: - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_set_capture): - fix fixate function to handle nonsimple caps. - remove bogus check in _link - cleanups - -2004-08-12 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/lame/gstlame.c: (gst_lame_class_init), (gst_lame_init): - set default compression ratio parameter to 0.0 so bitrate parameter - works :) - -2004-08-11 David Schleef <ds@schleef.org> - - * gst/tcp/gstfdset.c: Fix compile problem on OS/X. - -2004-08-11 David Schleef <ds@schleef.org> - - * gst/mpeg1sys/gstmpeg1systemencode.c: Oops, this was correct - before. - -2004-08-11 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/videosink.h: Change copyright block to LGPL. - -2004-08-11 David Schleef <ds@schleef.org> - - * ext/pango/gsttextoverlay.c: Add copyright block and fix plugin - license field - * gst-libs/gst/idct/Makefile.am: Remove mmx/sse code - * gst-libs/gst/video/gstvideosink.c: Change copyright block to - LGPL. - * gst/auparse/gstauparse.c: Fix plugin license field. - * gst/monoscope/gstmonoscope.c: Fix plugin license field. - * gst/mpeg1sys/gstmpeg1systemencode.c: Fix plugin license field. - * gst/rtp/gstrtp.c: Fix plugin license field. - -2004-08-11 Wim Taymans <wim@fluendo.com> - - * gst/tcp/Makefile.am: - * gst/tcp/gstfdset.c: (gst_fdset_mode_get_type), (nearest_pow), - (ensure_size), (gst_fdset_new), (gst_fdset_free), - (gst_fdset_set_mode), (gst_fdset_get_mode), (gst_fdset_add_fd), - (gst_fdset_remove_fd), (gst_fdset_fd_ctl_write), - (gst_fdset_fd_ctl_read), (gst_fdset_fd_has_closed), - (gst_fdset_fd_has_error), (gst_fdset_fd_can_read), - (gst_fdset_fd_can_write), (gst_fdset_wait): - * gst/tcp/gstfdset.h: - * gst/tcp/gstmultifdsink.c: (gst_unit_type_get_type), - (gst_multifdsink_class_init), (gst_multifdsink_init), - (gst_multifdsink_add), (gst_multifdsink_remove), - (gst_multifdsink_clear), (gst_multifdsink_get_stats), - (gst_multifdsink_remove_client_link), - (gst_multifdsink_handle_client_read), - (gst_multifdsink_client_queue_data), - (gst_multifdsink_client_queue_caps), - (gst_multifdsink_client_queue_buffer), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), - (gst_multifdsink_handle_clients), (gst_multifdsink_set_property), - (gst_multifdsink_get_property), (gst_multifdsink_init_send), - (gst_multifdsink_close): - * gst/tcp/gstmultifdsink.h: - * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), - (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), - (gst_tcpserversink_handle_wait), (gst_tcpserversink_init_send), - (gst_tcpserversink_close): - * gst/tcp/gsttcpserversink.h: - Abstracted away the select call, implemented poll (yes we ran into - the 1024 limit in production). - -2004-08-11 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/tcp/gsttcp.c: - * gst/tcp/gsttcpplugin.c: - improve debuggging, remove assert - -2004-08-10 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_unit_type_get_type), - (gst_client_status_get_type), (gst_multifdsink_class_init), - (gst_multifdsink_init), (gst_multifdsink_remove_client_link), - (gst_multifdsink_handle_client_read), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), - (gst_multifdsink_handle_clients), (gst_multifdsink_set_property), - (gst_multifdsink_get_property): - * gst/tcp/gstmultifdsink.h: - * gst/tcp/gsttcp-marshal.list: - Starting to prepare for specifying buffer time in other units - than buffers. Expose remove reason in signal. - -2004-08-10 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_add), - (gst_multifdsink_remove), (gst_multifdsink_clear), - (gst_multifdsink_remove_client_link), - (gst_multifdsink_handle_client_read), - (gst_multifdsink_client_queue_data), - (gst_multifdsink_client_queue_buffer), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients), - (gst_multifdsink_chain), (gst_multifdsink_close): - * gst/tcp/gstmultifdsink.h: - Added more debugging info. Changed the way clients are - removed from the lists. Fixed a bug where a bad file descriptor - could cause many clients to be removed. - -2004-08-06 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/videotestsrc/gstvideotestsrc.c: (generate_capslist): - allow all pixel-aspect-ratios, not just 1:1 - -2004-08-09 David Schleef <ds@schleef.org> - - * sys/glsink/ARB_multitexture.h: Remove old files. - * sys/glsink/EXT_paletted_texture.h: - * sys/glsink/NV_register_combiners.h: - * sys/glsink/gstgl_nvimage.c: - * sys/glsink/gstgl_pdrimage.c: - * sys/glsink/gstgl_rgbimage.c: - * sys/glsink/gstglsink.c: - * sys/glsink/gstglsink.h: - * sys/glsink/gstglxwindow.c: - * sys/glsink/regcomb_yuvrgb.c: - -2004-08-09 David Schleef <ds@schleef.org> - - Patch from Gernot Ziegler <gz@lysator.liu.se> rewriting the - GL sink plugin. (Bug #147302) - - * configure.ac: Test for OpenGL - * sys/Makefile.am: Use test for OpenGL - * sys/glsink/Makefile.am: - * sys/glsink/glimagesink.c: rewrite - * sys/glsink/glimagesink.h: rewrite - -2004-08-09 David Schleef <ds@schleef.org> - - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_base_init): Only allow - sane framerates. - * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): same - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): same - * testsuite/gst-lint: Test for G_GUINT64_FORMAT usage near gettext. - -2004-08-09 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), - (gst_multifdsink_add), (gst_multifdsink_get_stats), - (gst_multifdsink_client_remove), - (gst_multifdsink_handle_client_read), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients): - Do a bit more logging, make the client_read code more robust. - -2004-08-09 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/jpeg/gstjpegdec.c: (gst_jpegdec_init_source), - (gst_jpegdec_fill_input_buffer), (gst_jpegdec_skip_input_data), - (gst_jpegdec_resync_to_restart), (gst_jpegdec_term_source), - (gst_jpegdec_init), (gst_jpegdec_chain): - * gst/multipart/multipartdemux.c: (gst_multipart_demux_init), - (gst_multipart_demux_chain), (gst_multipart_demux_change_state): - cleanups, debugging fixes and memleak plugging - -2004-08-09 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoradec.c: (gst_theora_dec_class_init), - (theora_get_formats), (theora_dec_src_convert), - (theora_dec_sink_convert), (theora_dec_src_query), - (theora_dec_src_event), (theora_dec_event), (theora_dec_chain), - (theora_dec_change_state): - Don't crash on missing header packets. - -2004-08-09 Thomas Vander Stichele <thomas at apestaart dot org> - - * po/LINGUAS: - * po/sq.po: - Added Albanian translation (Laurent Dhima) - * po/cs.po: - updated - -2004-08-09 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/lame/gstlame.c: - fix/add debugging - -2004-08-09 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/ximage/ximagesink.c: - * sys/xvimage/xvimagesink.c: - assign all TOO_LAZY's to a real category. Thanks to Warthy Warthog. - -2004-08-06 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), - (gst_multifdsink_add), (gst_multifdsink_get_stats), - (gst_multifdsink_client_remove), - (gst_multifdsink_handle_client_read), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients): - Make sure we don't try to read more from a client that what - ioctl says us or we deadlock. - -2004-08-05 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_src_link), - (gst_videotestsrc_change_state), (gst_videotestsrc_src_query), - (gst_videotestsrc_handle_src_event), (gst_videotestsrc_get): - decouple running_time and n_frames so it can handle changing - framerate while running - -2004-08-05 Thomas Vander Stichele <thomas at apestaart dot org> - - * po/nl.po: - * po/sv.po: - updated translations - -2004-08-04 Benjamin Otte <otte@gnome.org> - - * gst/videotestsrc/gstvideotestsrc.c: - (gst_videotestsrc_get_capslist), (generate_capslist), - (plugin_init): - generate the list of supported caps at startup and reuse it instead - of always generating it - -2004-07-30 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/multipart/multipartmux.c: (gst_multipart_mux_pad_link): - whoops, last checkin broke normal build - -2004-08-03 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_get_volume), - (gst_alsa_mixer_set_volume), (gst_alsa_mixer_set_mute), - (gst_alsa_mixer_set_record), (gst_alsa_mixer_set_option), - (gst_alsa_mixer_get_option): - * ext/dvdnav/dvdnavsrc.c: (dvdnav_get_event_name), - (dvdnavsrc_print_event): - * ext/ogg/gstoggdemux.c: (_find_chain_process), (gst_ogg_print): - * ext/ogg/gstoggmux.c: (gst_ogg_mux_pad_link), - (gst_ogg_mux_pad_unlink): - * gst/multipart/multipartmux.c: (gst_multipart_mux_pad_link), - (gst_multipart_mux_pad_unlink): - * gst/videofilter/gstvideobalance.c: - (gst_videobalance_colorbalance_set_value): - * gst/videomixer/videomixer.c: (gst_videomixer_pad_link), - (gst_videomixer_pad_unlink): - * po/uk.po: - * sys/oss/gstossmixer.c: - * sys/v4l/gstv4lcolorbalance.c: - * sys/v4l/gstv4ltuner.c: - * sys/v4l/v4lsrc_calls.c: - * sys/v4l2/gstv4l2colorbalance.c: - * sys/v4l2/gstv4l2tuner.c: - compile fixes for --disable-gst-debug, G_DISABLE_ASSERT and friends - -2004-08-03 Benjamin Otte <otte@gnome.org> - - * examples/dynparams/filter.c: (ui_control_create): - * examples/gstplay/player.c: (print_tag): - * ext/alsa/gstalsa.c: (gst_alsa_request_new_pad): - * ext/gdk_pixbuf/gstgdkanimation.c: - (gst_gdk_animation_iter_may_advance): - * ext/jack/gstjack.c: (gst_jack_request_new_pad): - * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list), - (tag_list_to_id3_tag_foreach), (gst_id3_tag_handle_event): - * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_get_tag_value): - * ext/vorbis/vorbisenc.c: (gst_vorbisenc_get_tag_value): - * ext/xine/xineaudiodec.c: (gst_xine_audio_dec_chain): - * gst-libs/gst/media-info/media-info-test.c: (print_tag): - * gst/sine/demo-dparams.c: (main): - * gst/tags/gstvorbistag.c: (gst_tag_to_vorbis_comments): - * testsuite/alsa/formats.c: (create_pipeline): - * testsuite/alsa/sinesrc.c: (sinesrc_force_caps), (sinesrc_get): - fixes for G_DISABLE_ASSERT and friends - * gst/typefind/gsttypefindfunctions.c: (aac_type_find), - (mp3_type_frame_length_from_header), (mp3_type_find), - (plugin_init): - require mp3 typefinding to have at least MIN_HEADERS valid headers - add typefinding for AAC adts files - -2004-08-04 Jan Schmidt <thaytan@mad.scientist.com> - - * sys/ximage/ximagesink.c: - (gst_ximagesink_calculate_pixel_aspect_ratio): - * sys/xvimage/xvimagesink.c: - (gst_xvimagesink_calculate_pixel_aspect_ratio): - Make sure we calculate pixel-aspect-ratio using floating point maths - -2004-08-03 Thomas Vander Stichele <thomas at apestaart dot org> - - * po/uk.po: - updated translation - -2004-08-03 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get): - add debugging for display PAR calculation - -2004-08-02 David Schleef <ds@schleef.org> - - * configure.ac: Fix mikmod CFLAGS. - -2004-07-27 Benjamin Otte <otte@gnome.org> - - * gst/audioscale/gstaudioscale.c: - - fix templates to only support S16, it's the only format that works - - make caps nego code use try_set_caps_nonfixed and fixation instead - of try_set_caps twice, which is not nice for autopluggers - - change rank to secondary, so autopluggers can pick it up after - audioconvert - -2004-08-02 Iain <iain@prettypeople.org> - - * gst/interleave/interleave.c (interleave_init), - (interleave_request_new_pad), - (interleave_pad_removed), - (interleave_buffered_loop): Use the real pad count, not the artificial - one. - -2004-08-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: bump nano back to development - -=== release 0.8.3 === - -2004-08-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: releasing 0.8.3, "Water" - -2004-08-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/xvimage/xvimagesink.c: - (gst_xvimagesink_calculate_pixel_aspect_ratio), - (gst_xvimagesink_xcontext_clear), (gst_xvimagesink_sink_link), - (gst_xvimagesink_change_state), (gst_xvimagesink_buffer_alloc), - (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), - (gst_xvimagesink_init), (gst_xvimagesink_class_init): - * sys/xvimage/xvimagesink.h: - apply similar PAR fixes as to ximagesink - -2004-08-02 Thomas Vander Stichele <thomas at apestaart dot org> - - patch from: Benjamin Otte - - * ext/lame/gstlame.c: (gst_lame_src_link), (gst_lame_init): - add link function to lame. Fixes #148986. - -2004-08-02 Johan Dahlin <johan@gnome.org> - - * gst/multipart/multipartmux.c (gst_multipart_mux_next_buffer): - fix debugging log - -2004-07-30 David Schleef <ds@schleef.org> - - * gst/videomixer/Makefile.am: Fix things that should have been - fixed in the last checkin. - -2004-07-30 David Schleef <ds@schleef.org> - - * gst/multipart/Makefile.am: Fix things that should have been - fixed in the last checkin. - -2004-07-30 David Schleef <ds@schleef.org> - - * testsuite/multifilesink/Makefile.am: Fix unused variable. - -2004-07-30 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - bump nano for prerelease - * po/af.po: - * po/az.po: - * po/cs.po: - * po/en_GB.po: - * po/hu.po: - * po/nl.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - updates - -2004-07-30 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), - (gst_multifdsink_add), (gst_multifdsink_remove), - (gst_multifdsink_clear), (gst_multifdsink_get_stats), - (gst_multifdsink_client_remove), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_queue_buffer), (gst_multifdsink_handle_clients): - * gst/tcp/gstmultifdsink.h: - Recover from a select with a bad file descriptor by removing - the client. - -2004-07-30 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - fix requirement of core - * gst-libs/gst/play/play.c: (gst_play_error_plugin), - (gst_play_pipeline_setup): - don't use colorspace element. do use hermescolorspace element. - make macro to get a colorspace element. - mark strings for translation. - * po/POTFILES.in: - add play.c - * po/af.po: - * po/az.po: - * po/cs.po: - * po/en_GB.po: - * po/hu.po: - * po/nl.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - update translations - -2004-07-30 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/libpng/gstpngenc.c: (gst_pngenc_class_init): - fix default for newmedia flag - -2004-07-30 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoradec.c: (gst_theora_dec_class_init), - (gst_theora_dec_init), (theora_get_formats), - (theora_dec_src_convert), (theora_dec_sink_convert), - (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), - (theora_dec_chain), (theora_dec_set_property), - (theora_dec_get_property): - * ext/theora/theoraenc.c: (gst_border_mode_get_type), - (gst_theora_enc_class_init), (gst_theora_enc_init), - (theora_enc_sink_link), (theora_enc_chain), - (theora_enc_set_property), (theora_enc_get_property): - Added cropping option to theora decoder. - Added border option to theora encoder. - -2004-07-30 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), - (gst_pngenc_init), (gst_pngenc_chain), (gst_pngenc_get_property), - (gst_pngenc_set_property): - * ext/libpng/gstpngenc.h: - Added newmedia support to pngenc so now gst-launch-0.8 videotestsrc ! ffmpegcolorspace ! pngenc snapshot=false newmedia=true ! multifilesink location=blah%d.png works as expected - -2004-07-30 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoraenc.c: (gst_theora_enc_class_init), - (theora_enc_sink_link), (theora_enc_chain), - (theora_enc_set_property), (theora_enc_get_property): - Fix encoding of non-multiple-of-16 video. - -2004-07-29 David Schleef <ds@schleef.org> - - * configure.ac: make test for audiofile more strict - -2004-07-25 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/typefind/gsttypefindfunctions.c: (plugin_init): - give different names to typefind functions - -2004-07-28 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), - (gst_ximagesink_calculate_pixel_aspect_ratio), - (gst_ximagesink_xcontext_get), (gst_ximagesink_getcaps), - (gst_ximagesink_sink_link), (gst_ximagesink_change_state), - (gst_ximagesink_set_xwindow_id), (gst_ximagesink_set_property), - (gst_ximagesink_get_property), (gst_ximagesink_init): - * sys/ximage/ximagesink.h: - allocate PAR's dynamically. - use autodetected PAR if no object-set PAR is given. - add workaround for directfb's X not setting physical size. - fix to xvimagesink will follow tomorrow. - -2004-07-28 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/lame/gstlame.c: (gst_lame_chain): send tag events downstream - * ext/shout2/gstshout2.c: (gst_shout2send_protocol_get_type), - (gst_shout2send_get_type), (gst_shout2send_set_clock), - (gst_shout2send_class_init), (gst_shout2send_init), - (set_shout_metadata), (gst_shout2send_set_metadata), - (gst_shout2send_chain), (gst_shout2send_set_property), - (gst_shout2send_get_property), (gst_shout2send_connect), - (gst_shout2send_change_state): - * ext/shout2/gstshout2.h: - - fix for sending mp3 audio to icecast2 server, if pad link function not - called before PAUSED state - - added option to use GStreamer clock sync (as opposed to libshout's own sync) - - added tagging support for mp3 audio broadcasted - * gst/monoscope/gstmonoscope.c: (gst_monoscope_class_init): - debug info - -2004-07-28 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query), - (gst_ogg_demux_push): - Return query failure when we don't know the length of - an ogg stream insteda of returning TRUE with a bogus value. - -2004-07-28 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoradec.c: (theora_get_formats), - (theora_dec_src_convert), (theora_dec_sink_convert), - (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), - (theora_dec_chain): - Don't screw up the 1 Chroma for 1 luma sample situation when we - have an odd offset/width by adding a black border in those cases. - -2004-07-28 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoradec.c: (theora_get_formats), - (theora_dec_src_convert), (theora_dec_sink_convert), - (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), - (theora_dec_chain): - * ext/theora/theoraenc.c: (theora_enc_sink_link): - Added first attempt at cropping of the image as required by the - theora spec. We need more properties in the caps (offset_x, - offset_y,stride) to implement this correctly. - -2004-07-28 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/dvdnav/README: - Update the README to use dvddemux - * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_getcaps): - Ensure getcaps returns a subset of the template caps - * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_base_init), - (gst_mpeg2subt_init): - Ensure getcaps returns a subset of the template caps - * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), - (gst_dvd_demux_init), (gst_dvd_demux_get_video_stream), - (gst_dvd_demux_get_subpicture_stream), - (gst_dvd_demux_send_subbuffer), (gst_dvd_demux_set_cur_subpicture): - * gst/mpegstream/gstdvddemux.h: - Set the explicit caps on the current_video pad before pushing - anything - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream), - (gst_mpeg_demux_get_audio_stream): - Free caps used to gst_pad_set_explicit_caps, which takes a const - GstCaps * - -2004-07-28 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: update GStreamer requirement to 0.8.4 because of - GstFraction. - -2004-07-28 Wim Taymans <wim@fluendo.com> - - * gst/wavparse/gstwavparse.c: (gst_wavparse_fmt), - (gst_wavparse_handle_seek), (gst_wavparse_srcpad_event): - Add the pad to the element after setting up the caps. This - makes it a lot easier to autoplug. - -2004-07-27 Steve Lhomme <steve.lhomme@free.fr> - - * gst/median/gstmedian.c: - * gst/mpeg2subt/gstmpeg2subt.c: - * gst/mpegaudioparse/gstmpegaudioparse.c: - * gst/mpegstream/gstdvddemux.c: - * gst/mpegstream/gstmpegdemux.c: - * gst/mpegstream/gstmpegpacketize.c: - * gst/rtjpeg/gstrtjpeg.c: - * gst/rtjpeg/gstrtjpegdec.c: - * gst/rtjpeg/gstrtjpegenc.c: - * gst/sine/gstsinesrc.c: - * gst/smooth/gstsmooth.c: - * gst/smpte/gstsmpte.c: - * gst/smpte/gstsmpte.h: - * gst/stereo/gststereo.c: - * gst/videofilter/gstgamma.c: - * gst/videofilter/gstvideobalance.c: - * gst/videofilter/gstvideofilter.c: - * gst/videofilter/gstvideoflip.c: - * gst/videoscale/gstvideoscale.c: - * gst/videoscale/videoscale.c: - * gst/videotestsrc/gstvideotestsrc.c: - * gst/videotestsrc/videotestsrc.c: - * gst/wavenc/gstwavenc.c: - * gst/wavparse/gstwavparse.c: - fix local includes and 64 bits constants - -2004-07-27 Steve Lhomme <steve.lhomme@free.fr> - - * win32/gst.sln: - * gst-libs/gst/*/*.vcproj: - * gst/*/*.vcproj: - more working plugins - -2004-07-27 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * testsuite/alsa/Makefile.am: - * testsuite/alsa/srcstate.c: - add test for alsasrc changing state - -2004-07-27 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * gst/silence/gstsilence.c: (gst_silence_init), (gst_silence_link), - (gst_silence_get): - * gst/silence/gstsilence.h: - fix silence generation for 16bit raw audio - -2004-07-27 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_parse_metadata), - (gst_matroska_demux_video_caps), (gst_matroska_demux_plugin_init): - * gst/mpegaudio/common.c: - * gst/videoscale/gstvideoscale.c: (gst_videoscale_class_init), - (gst_videoscale_getcaps), (gst_videoscale_link), - (gst_videoscale_src_fixate), (gst_videoscale_init), - (gst_videoscale_finalize): - * gst/videoscale/gstvideoscale.h: - * gst/videotestsrc/gstvideotestsrc.c: - (gst_videotestsrc_get_capslist): - * gst/wavenc/gstwavenc.c: - * sys/oss/gstossmixer.c: (fill_labels): - * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), - (gst_ximagesink_handle_xevents), - (gst_ximagesink_calculate_pixel_aspect_ratio), - (gst_ximagesink_xcontext_get), (gst_ximagesink_fixate), - (gst_ximagesink_getcaps), (gst_ximagesink_sink_link), - (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id), - (gst_ximagesink_set_property), (gst_ximagesink_get_property), - (gst_ximagesink_init), (gst_ximagesink_class_init): - * sys/ximage/ximagesink.h: - * sys/xvimage/xvimagesink.c: - (gst_xvimagesink_calculate_pixel_aspect_ratio), - (gst_xvimagesink_xcontext_get), (gst_xvimagesink_sink_link), - (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc), - (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), - (gst_xvimagesink_init), (gst_xvimagesink_class_init): - * sys/xvimage/xvimagesink.h: - first batch of pixel aspect ratio commits. - -2004-07-27 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcolorspace_class_init), (gst_ffmpegcolorspace_chain): - * gst/ffmpegcolorspace/imgconvert.c: (avpicture_fill): - handle stride, needs work if we want to move stride handling - upstream, but works correctly for our purposes. - -2004-07-27 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/videoscale/README: - add testing examples - * gst/videoscale/gstvideoscale.c: (gst_videoscale_link), - (gst_videoscale_chain): - * gst/videoscale/videoscale.c: (gst_videoscale_setup), - (gst_videoscale_get_size): - add get_size function that handles stride like videotestsrc. - fixes conversion for YUV formats for as much as I can test them. - -2004-07-27 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), - (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), - (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), - (gst_xvimagesink_xvimage_put): - further cleanups, logging, error handling and synchronizing - -2004-07-27 Wim Taymans <wim@fluendo.com> - - * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), - (gst_videomixer_pad_class_init), (gst_videomixer_pad_get_property), - (gst_videomixer_pad_set_property), - (gst_videomixer_pad_sinkconnect), (gst_videomixer_pad_init), - (gst_video_mixer_background_get_type), (gst_videomixer_get_type), - (gst_videomixer_class_init), (gst_videomixer_init), - (gst_videomixer_getcaps), (gst_videomixer_request_new_pad), - (gst_videomixer_blend_ayuv_i420), (pad_zorder_compare), - (gst_videomixer_sort_pads), (gst_videomixer_fill_checker), - (gst_videomixer_fill_color), (gst_videomixer_fill_queues), - (gst_videomixer_blend_buffers), (gst_videomixer_update_queues), - (gst_videomixer_loop), (plugin_init): - Be a nicer negotiation citizen and provide a getcaps function on - the srcpad. This also fixes a crash when resizing. - -2004-07-27 Julien MOUTTE <julien@moutte.net> - - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), - (gst_xvimagesink_xvimage_new): Some fixes to image size calculation. - -2004-07-27 Wim Taymans <wim@fluendo.com> - - * ext/libpng/gstpngdec.c: (gst_pngdec_src_getcaps): - * ext/libpng/gstpngenc.c: (gst_pngenc_class_init), - (gst_pngenc_init), (gst_pngenc_chain), (gst_pngenc_get_property), - (gst_pngenc_set_property): - * ext/libpng/gstpngenc.h: - Added snapshot property to pngenc. - removed g_print from pngdec - -2004-07-27 Steve Lhomme <steve.lhomme@free.fr> - - * gst/ac3parse/ac3parse.vcproj - * gst/adder/adder.vcproj - * gst/alpha/alpha.vcproj - * gst/alpha/alphacolor.vcproj - * gst/asfdemux/asf.vcproj - * gst/audioconvert/audioconvert.vcproj - * gst/audiorate/audiorate.vcproj - * gst/audioscale/audioscale.vcproj - * gst/auparse/auparse.vcproj - * gst/avi/avi.vcproj - * gst/cdxaparse/cdxaparse.vcproj - * gst/chart/chart.vcproj - * gst/colorspace/colorspace.vcproj - * gst/cutter/cutter.vcproj - * gst/debug/debug.vcproj - * gst/debug/efence.vcproj - * gst/debug/navigationtest.vcproj - * gst/deinterlace/deinterlace.vcproj - * gst/effectv/effectv.vcproj - * gst/ffmpegcolorspace/ffmpegcolorspace.vcproj - * gst/filter/filter.vcproj - * gst/flx/flxdec.vcproj - * gst/goom/goom.vcproj - * gst/interleave/interleave.vcproj - * gst/law/alaw.vcproj - * gst/law/mulaw.vcproj - * gst/matroska/matroska.vcproj - * gst/median/median.vcproj - * gst/mixmatrix/mixmatrix.vcproj - * gst/mpeg1sys/mpeg1systemencode.vcproj - * gst/mpeg1videoparse/mp1videoparse.vcproj - * gst/mpeg2sub/mpeg2subt.vcproj - * gst/mpegaudio/mpegaudio.vcproj - * gst/mpegaudioparse/mpegaudioparse.vcproj - * gst/mpegstream/mpegstream.vcproj - * gst/multifilesink/multifilesink.vcproj - * gst/multipart/multipart.vcproj - * gst/oneton/oneton.vcproj - * gst/overlay/overlay.vcproj - * gst/passthrough/passthrough.vcproj - * gst/qtdemux/qtdemux.vcproj - * gst/realmedia/rmdemux.vcproj - * gst/rtjpeg/rtjpeg.vcproj - * gst/rtp/rtp.vcproj - * gst/silence/silence.vcproj - * gst/sine/sinesrc.vcproj - * gst/smooth/smooth.vcproj - * gst/smpte/smpte.vcproj - * gst/spectrum/spectrum.vcproj - * gst/speed/speed.vcproj - * gst/stereo/stereo.vcproj - * gst/switch/switch.vcproj - * gst/tags/tagedit.vcproj - * gst/tcp/tcp.vcproj - * gst/typefind/typefindfunctions.vcproj - * gst/udp/udp.vcproj - * gst/videobox/videobox.vcproj - * gst/videocrop/videocrop.vcproj - * gst/videodrop/videodrop.vcproj - * gst/videofilter/gamma.vcproj - * gst/videofilter/videobalance.vcproj - * gst/videofilter/videofilter.vcproj - * gst/videofilter/videoflip.vcproj - * gst/videoflip/videoflip.vcproj - * gst/videomixer/videomixer.vcproj - * gst/videorate/videorate.vcproj - * gst/videoscale/videoscale.vcproj - * gst/videotestsrc/videotestsrc.vcproj - * gst/virtualdub/virtualdub.vcproj - * gst/volenv/volenv.vcproj - * gst/volume/volume.vcproj - * gst/wavenc/wavenc.vcproj - * gst/wavparse/wavparse.vcproj - * gst/y4m/y4menc.vcproj - * gst-libs/gst/audio/audio.vcproj - * gst-libs/gst/audio/audiofilter.vcproj - * gst-libs/gst/colorbalance/colorbalance.vcproj - * gst-libs/gst/idct/idtc.vcproj - * gst-libs/gst/media-info/media-info.vcproj - * gst-libs/gst/mixer/mixer.vcproj - * gst-libs/gst/navigation/navigation.vcproj - * gst-libs/gst/play/play.vcproj - * gst-libs/gst/propertyprobe/propertyprobe.vcproj - * gst-libs/gst/resample/resample.vcproj - * gst-libs/gst/riff/riff.vcproj - * gst-libs/gst/tuner/tuner.vcproj - * gst-libs/gst/video/video.vcproj - * gst-libs/gst/xoverlay/xoverlay.vcproj - avoid problems with math.h, fix release dependancy - rename GStreamer-0.8.lib to libgstreamer.lib - -2004-07-27 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate): When - the atom is not available we have to unlock the mutex. Fixes #148023 - -2004-07-26 Steve Lhomme <steve.lhomme@free.fr> - - * gst-libs/gst/media-info/media-info.h: - issue for a vararg macro with MSVC - -2004-07-26 Steve Lhomme <steve.lhomme@free.fr> - - * gst/effectv/effectv.vcproj - * gst-libs/gst/idct/idct.vcproj: - * gst-libs/gst/media-info/media-info.vcproj: - * gst-libs/gst/navigation/navigation.vcproj: - * gst-libs/gst/propertyprobe/propertyprobe.vcproj: - * gst-libs/gst/video/video.vcproj: - * gst-libs/gst/xoverlay/xoverlay.vcproj: - fixes for build problems - -2004-07-26 Steve Lhomme <steve.lhomme@free.fr> - - * gst-libs/gst/audio/audio.def: - * gst-libs/gst/audio/riff.def: - add some definitions needed by plugins - -2004-07-26 Steve Lhomme <steve.lhomme@free.fr> - - * gst/asfdemux/gstasfmux.c - Fix some 64 bits constants to be glib friendly - -2004-07-26 Steve Lhomme <steve.lhomme@free.fr> - - * gst/ac3parse/gstac3parse.c - * gst/audioscale/gstaudioscale.c - * gst/auparse/gstauparse.c - * gst/colorspace/gstcolorspace.c - * gst/colorspace/yuv2rgb.h - local include fixes - -2004-07-26 Steve Lhomme <steve.lhomme@free.fr> - - * win32/gst.sln - add more plugins to the build - -2004-07-26 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), - (gst_ximagesink_ximage_new): Some more fixes to image size calculation. - -2004-07-26 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/level/gstlevel.c: (gst_level_link), (gst_level_chain), - (gst_level_set_property), (gst_level_get_property), - (gst_level_base_init), (gst_level_class_init): - add debugging categories. cleanups. - -2004-07-26 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/videoscale/videoscale.c: (gst_videoscale_setup), - (gst_videoscale_planar411), (gst_videoscale_planar400), - (gst_videoscale_packed422), (gst_videoscale_packed422rev), - (gst_videoscale_scale_nearest_str1), - (gst_videoscale_scale_nearest_str2), - (gst_videoscale_scale_nearest_str4), - (gst_videoscale_scale_nearest_16bit), - (gst_videoscale_scale_nearest_24bit): - fixed stride issues - tested with 320x240 -> 321, 322, 324 x240 - tested with YV12, I420, YUY2, UYVY - fixed packed422rev (don't think it could have worked before) - by testing with UYVY - -2004-07-26 Benjamin Otte <otte@gnome.org> - - * ext/lame/gstlame.c: (gst_lame_sink_link), (gst_lame_init), - (gst_lame_chain), (gst_lame_setup), (gst_lame_change_state), - (plugin_init): - add debugging category, add error checks like checking return values - of setup calls, make sure it still works after - PLAYING=>NULL=>PLAYING, fix encoding of mono streams - -2004-07-26 Wim Taymans <wim@fluendo.com> - - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream), - (gst_mpeg_demux_get_audio_stream), - (gst_mpeg_demux_process_private): - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_send_data): - Check for error codes from the negotiation functions. Make sure - we really set the pad caps when a new pad is created. - -2004-07-26 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: - (gst_ffmpeg_caps_to_pix_fmt): - * gst/ffmpegcolorspace/gstffmpegcodecmap.h: - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcolorspace_pad_link): - don't make function do two things at the same time without reason. - -2004-07-26 Steve Lhomme <steve.lhomme@free.fr> - - * gst/ac3parse/ac3parse.vcproj - * gst/adder/adder.vcproj - * gst/alpha/alpha.vcproj - * gst/alpha/alphacolor.vcproj - * gst/asfdemux/asf.vcproj - * gst/audioconvert/audioconvert.vcproj - * gst/audiorate/audiorate.vcproj - * gst/audioscale/audioscale.vcproj - * gst/auparse/auparse.vcproj - * gst/avi/avi.vcproj - * gst/cdxaparse/cdxaparse.vcproj - * gst/chart/chart.vcproj - * gst/colorspace/colorspace.vcproj - * gst/cutter/cutter.vcproj - * gst/debug/debug.vcproj - * gst/debug/efence.vcproj - * gst/debug/navigationtest.vcproj - * gst/deinterlace/deinterlace.vcproj - * gst/effectv/effectv.vcproj - * gst/ffmpegcolorspace/ffmpegcolorspace.vcproj - * gst/filter/filter.vcproj - * gst/flx/flxdec.vcproj - * gst/goom/goom.vcproj - * gst/interleave/interleave.vcproj - * gst/law/alaw.vcproj - * gst/law/mulaw.vcproj - * gst/matroska/matroska.vcproj - * gst/median/median.vcproj - * gst/mixmatrix/mixmatrix.vcproj - * gst/mpeg1sys/mpeg1systemencode.vcproj - * gst/mpeg1videoparse/mp1videoparse.vcproj - * gst/mpeg2sub/mpeg2subt.vcproj - * gst/mpegaudio/mpegaudio.vcproj - * gst/mpegaudioparse/mpegaudioparse.vcproj - * gst/mpegstream/mpegstream.vcproj - * gst/multifilesink/multifilesink.vcproj - * gst/multipart/multipart.vcproj - * gst/oneton/oneton.vcproj - * gst/overlay/overlay.vcproj - * gst/passthrough/passthrough.vcproj - * gst/qtdemux/qtdemux.vcproj - * gst/realmedia/rmdemux.vcproj - * gst/rtjpeg/rtjpeg.vcproj - * gst/rtp/rtp.vcproj - * gst/silence/silence.vcproj - * gst/sine/sinesrc.vcproj - * gst/smooth/smooth.vcproj - * gst/smpte/smpte.vcproj - * gst/spectrum/spectrum.vcproj - * gst/speed/speed.vcproj - * gst/stereo/stereo.vcproj - * gst/switch/switch.vcproj - * gst/tags/tagedit.vcproj - * gst/tcp/tcp.vcproj - * gst/typefind/typefindfunctions.vcproj - * gst/udp/udp.vcproj - * gst/videobox/videobox.vcproj - * gst/videocrop/videocrop.vcproj - * gst/videodrop/videodrop.vcproj - * gst/videofilter/gamma.vcproj - * gst/videofilter/videobalance.vcproj - * gst/videofilter/videofilter.vcproj - * gst/videofilter/videoflip.vcproj - * gst/videoflip/videoflip.vcproj - * gst/videomixer/videomixer.vcproj - * gst/videorate/videorate.vcproj - * gst/videoscale/videoscale.vcproj - * gst/videotestsrc/videotestsrc.vcproj - * gst/virtualdub/virtualdub.vcproj - * gst/volenv/volenv.vcproj - * gst/volume/volume.vcproj - * gst/wavenc/wavenc.vcproj - * gst/wavparse/wavparse.vcproj - * gst/y4m/y4menc.vcproj - more plugins supported under windows - -2004-07-26 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), - (gst_ximagesink_ximage_put), (gst_ximagesink_renegotiate_size), - (gst_ximagesink_chain), (gst_ximagesink_buffer_alloc): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), - (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc): - Add debugging statements. Use the sizes as returned by the - *CreateImage calls. - -2004-07-26 Johan Dahlin <johan@gnome.org> - - * gst/tcp/gsttcpclientsrc.c (gst_tcpclientsrc_get): Make sure that - the pad is negotiated. - - * gst/ffmpegcolorspace/gstffmpegcolorspace.c (gst_ffmpegcolorspace_chain): Ditto - -2004-07-26 Steve Lhomme <steve.lhomme@free.fr> - - * gst-libs/gst/colorbalance/colorbalance.vcproj: - * gst-libs/gst/idct/idct.vcproj: - * gst-libs/gst/media-info/media-info.vcproj: - * gst-libs/gst/mixer/mixer.vcproj: - * gst-libs/gst/navigation/navigation.vcproj: - * gst-libs/gst/play/play.vcproj: - * gst-libs/gst/propertyprobe/propertyprobe.vcproj: - * gst-libs/gst/resample/resample.vcproj: - * gst-libs/gst/tuner/tuner.vcproj: - * gst-libs/gst/video/video.vcproj: - * gst-libs/gst/xoverlay/xoverlay.vcproj: - more plugins supported under windows - -2004-07-25 Iain <iain@prettypeople.org> - - * gst/wavparse/gstwavparse.c (gst_wavparse_fmt): Set the caps on the - pad now rather than when the pad is created because state changes wipe - explicit caps (fixes #148043). - -2004-07-25 Sebastien Cote <sc5@hermes.usherb.ca> - - reviewed by Benjamin Otte <otte@gnome.org> - - * ext/mad/gstmad.c: - fix mad plugin crashing on Sun (fixes #148289) - -2004-07-25 Steve Lhomme <steve.lhomme@free.fr> - - * gst/avi/avi.def: - * gst/avi/avi.vcproj: - * gst/matroska/matroska.def: - * gst/matroska/matroska.vcproj: - remove unused .def files - -2004-07-25 Steve Lhomme <steve.lhomme@free.fr> - - * gst-libs/gst/audio/gstaudiofilter.c: - Clean the local include - -2004-07-25 Steve Lhomme <steve.lhomme@free.fr> - - * win32/gst.sln: - * gst-libs/gst/audio/audio.def: - * gst-libs/gst/audio/audio.vcproj: - * gst-libs/gst/audio/audiofilter.vcproj: - * gst-libs/gst/audio/riff.def: - * gst-libs/gst/audio/riff.vcproj: - * gst-libs/gst/gst-libs.def: - * gst-libs/gst/gst-libs.vcproj: - * gst/avi/avi.vcproj: - * gst/avi/avi.vcproj: - Copy the files where needed after building, cleaner projects - -2004-07-25 Steve Lhomme <steve.lhomme@free.fr> - - * gst/matroska/ebml-write.c: - Fix some 64 bits constants to be glib friendly - -2004-07-24 Steve Lhomme <steve.lhomme@free.fr> - - * win32/gst.sln: - * gst-libs/gst/gst-libs.def: - * gst-libs/gst/gst-libs.vcproj: - * gst/matroska/matroska.def: - * gst/matroska/matroska.vcproj: - Add the preliminary canvas to build plugins on Win32 - -2004-07-23 Benjamin Otte <otte@gnome.org> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): - don't enfore negotiation from source side, it breaks - sinesrc ! audioconvert ! osssink - -2004-07-22 David Schleef <ds@schleef.org> - - * gst/typefind/gsttypefindfunctions.c: (plugin_init): Add typefind - for ELF files, since they can easily be recognized as audio/mpeg. - (bug #147441) - -2004-07-22 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/videoscale/videoscale.c: (gst_videoscale_setup), - (gst_videoscale_planar411), (gst_videoscale_scale_nearest_32bit), - (gst_videoscale_scale_nearest_24bit), - (gst_videoscale_scale_nearest_16bit): - fix 16bit and 24bit for stride (24bit might need testing) - don't pretend we do more than one algorithm - -2004-07-22 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * configure.ac: - * gst/Makefile.am: - * gst/multifilesink/Makefile.am: - * gst/multifilesink/gstmultifilesink.c: - (gst_multifilesink_get_formats), - (gst_multifilesink_get_query_types), (_do_init), - (gst_multifilesink_base_init), (gst_multifilesink_class_init), - (gst_multifilesink_init), (gst_multifilesink_dispose), - (gst_multifilesink_set_location), (gst_multifilesink_set_property), - (gst_multifilesink_get_property), (gst_multifilesink_open_file), - (gst_multifilesink_close_file), (gst_multifilesink_next_file), - (gst_multifilesink_pad_query), (gst_multifilesink_handle_event), - (gst_multifilesink_chain), (gst_multifilesink_change_state), - (gst_multifilesink_uri_get_type), - (gst_multifilesink_uri_get_protocols), - (gst_multifilesink_uri_get_uri), (gst_multifilesink_uri_set_uri), - (gst_multifilesink_uri_handler_init), (plugin_init): - * gst/multifilesink/gstmultifilesink.h: - * testsuite/Makefile.am: - * testsuite/multifilesink/Makefile.am: - * testsuite/multifilesink/fakesrc_test.c: (gst_newmedia_base_init), - (gst_newmedia_class_init), (gst_newmedia_init), - (gst_newmedia_chain), (gst_newmedia_trigger), (test_format), - (newfile_signal), (test_signal), (main): - multifilesink plugin for creating new files every time a new media - discontinuity event occurs - -2004-07-22 Wim Taymans <wim@fluendo.com> - - * gst/alpha/Makefile.am: - * gst/alpha/gstalphacolor.c: (gst_alpha_color_get_type), - (gst_alpha_color_base_init), (gst_alpha_color_class_init), - (gst_alpha_color_init), (gst_alpha_color_set_property), - (gst_alpha_color_get_property), (gst_alpha_color_sink_link), - (transform), (gst_alpha_color_chain), - (gst_alpha_color_change_state), (plugin_init): - Stupid plugin to to RGBA to AYUV conversion because none of - the colorspace plugins can handle that yet. - -2004-07-22 Wim Taymans <wim@fluendo.com> - - * examples/seeking/seek.c: (update_scale), (main): - * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), - (gst_decode_bin_class_init), (gst_decode_bin_is_dynamic), - (gst_decode_bin_factory_filter), (compare_ranks), (print_feature), - (gst_decode_bin_init), (gst_decode_bin_dispose), - (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), - (no_more_pads), (close_link), (type_found), - (gst_decode_bin_set_property), (gst_decode_bin_get_property), - (plugin_init): - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), - (gst_play_base_bin_class_init), (gst_play_base_bin_init), - (gst_play_base_bin_dispose), (queue_overrun), - (gen_preroll_element), (remove_prerolls), (unknown_type), - (no_more_pads), (new_stream), (setup_source), - (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), - (play_base_eos), (gst_play_base_bin_change_state), - (gst_play_base_bin_add_element), - (gst_play_base_bin_remove_element), - (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), - (gst_play_base_bin_unlink_stream), - (gst_play_base_bin_get_streaminfo): - * gst/playback/gstplaybin.c: (gen_video_element), - (gen_audio_element): - * gst/playback/gststreaminfo.h: - More playback updates, attempt to fix things after the state change - breakage. - -2004-07-22 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/videoscale/videoscale.c: (gst_videoscale_planar411), - (gst_videoscale_scale_nearest_16bit): - comment algorithm - -2004-07-22 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/videotestsrc/gstvideotestsrc.c: - (gst_videotestsrc_class_init), (gst_videotestsrc_src_link), - (gst_videotestsrc_init), (gst_videotestsrc_get), - (gst_videotestsrc_set_pattern), (gst_videotestsrc_set_property), - (gst_videotestsrc_get_property): - * gst/videotestsrc/gstvideotestsrc.h: - * gst/videotestsrc/videotestsrc.c: - * gst/videotestsrc/videotestsrc.h: - cleanup and commenting - -2004-07-21 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_init), - (gst_ogg_demux_get_formats), (gst_ogg_demux_src_query), - (gst_ogg_demux_src_event), (gst_ogg_demux_src_convert), - (gst_ogg_demux_handle_event), (gst_ogg_demux_seek_before), - (_find_chain_get_unknown_part), (_find_streams_check), - (gst_ogg_demux_push), (gst_ogg_pad_push): - * ext/theora/theoradec.c: (theora_get_formats), - (theora_dec_src_convert), (theora_dec_sink_convert), - (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), - (theora_dec_chain): - * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), - (vorbis_dec_convert), (vorbis_dec_src_query), - (vorbis_dec_src_event), (vorbis_dec_event): - More seeking fixes, oggdemux now supports seeking to time and - uses the downstream element to convert granulepos to time. - Seeking in theora-only ogg files now works. - -2004-07-21 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoradec.c: (gst_theora_dec_init), - (theora_get_formats), (theora_get_event_masks), - (theora_get_query_types), (theora_dec_src_convert), - (theora_dec_sink_convert), (theora_dec_src_query), - (theora_dec_src_event), (theora_dec_event), (theora_dec_chain): - * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), - (vorbis_get_event_masks), (vorbis_get_query_types), - (gst_vorbis_dec_init), (vorbis_dec_convert), - (vorbis_dec_src_query), (vorbis_dec_src_event), (vorbis_dec_event): - Added query/convert/formats functions to vorbis and theora decoders - so that the outside world can use them too. Fixed seeking on an - ogg/theora/vorbis file by disabling the seeking seeking on the - theora srcpad. - -2004-07-21 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), - (gst_ximagesink_renegotiate_size), (gst_ximagesink_sink_link), - (gst_ximagesink_chain), (gst_ximagesink_set_xwindow_id): Optimize - images creation for both elements. We don't create the image on caps - nego or renego, we just destroy the internal one if present if it does - not match the needs. The chain function takes care of creating a new - image when needed. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), - (gst_xvimagesink_xwindow_decorate), (gst_xvimagesink_sink_link), - (gst_xvimagesink_chain), (gst_xvimagesink_buffer_alloc), - (gst_xvimagesink_set_xwindow_id): Additionally xvimage now contains - the image format information. The buffer pool checks for the context - image format and discard images with different formats. - * sys/xvimage/xvimagesink.h: Adding im_format in the xvimage structure. - -2004-07-21 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcolorspace_chain): - no point in doing any chaining if the pad we want to push from - isn't usable. - -2004-07-20 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_audio_caps_with_data): - Fix double end-to-native symbol conversion (#148021). - -2004-07-20 David Schleef <ds@schleef.org> - - * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate): - Don't use an Atom that doesn't exist. - -2004-07-20 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), - (gst_multifdsink_add), (gst_multifdsink_get_stats), - (gst_multifdsink_client_remove), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_queue_buffer): - * gst/tcp/gstmultifdsink.h: - More multifdsink stats. Avoid deadlock by releasing locks - before sending out a signal. - -2004-07-20 Thomas Vander Stichele <thomas at apestaart dot org> - - * po/LINGUAS: - * po/hu.po: - added Hungarian translation (Laszlo Dvornik) - -2004-07-20 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), - (gst_multifdsink_add), (gst_multifdsink_client_remove), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_queue_buffer): - * gst/tcp/gsttcp-marshal.list: - Fixed the stupid marshal definition. - -2004-07-20 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), - (gst_multifdsink_init), (gst_multifdsink_add), - (gst_multifdsink_client_remove), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_queue_buffer), (gst_multifdsink_chain), - (gst_multifdsink_set_property), (gst_multifdsink_get_property), - (gst_multifdsink_init_send): - * gst/tcp/gstmultifdsink.h: - Added more stats, added timeout for a client, fixed some typos - and added some comments. - -2004-07-20 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), - (gst_multifdsink_add), (gst_multifdsink_get_stats), - (gst_multifdsink_client_remove), - (gst_multifdsink_handle_client_write): - * gst/tcp/gstmultifdsink.h: - * gst/tcp/gsttcp-marshal.list: - Added get_stats method that returns a GValueArray of - stats values. - -2004-07-19 Benjamin Otte <otte@gnome.org> - - * ext/ladspa/gstladspa.c: (gst_ladspa_base_init): - make sure longname, description and author are valid UTF-8 - -2004-07-19 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/ximage/ximagesink.c: (gst_ximagesink_change_state), - (gst_ximagesink_set_property): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_change_state), - (gst_xvimagesink_set_property): - make sure SYNCHRONOUS is respected after getting the X context - -2004-07-18 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_handle_src_event), - (gst_matroska_demux_parse_blockgroup): - * gst/matroska/matroska-ids.h: - add BlockReference tag and ignore it to clear out log. - ignore NAVIGATION events to clear out log. - -2004-07-18 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init), - (gst_matroska_demux_add_stream): - * gst/matroska/matroska-mux.c: (gst_matroska_mux_class_init): - add debug categories - -2004-07-16 Wim Taymans <wim@fluendo.com> - - * ext/libpng/Makefile.am: - * ext/libpng/gstpng.c: (plugin_init): - * ext/libpng/gstpngdec.c: (user_error_fn), (user_warning_fn), - (gst_pngdec_get_type), (gst_pngdec_base_init), - (gst_pngdec_class_init), (gst_pngdec_sinklink), (gst_pngdec_init), - (gst_pngdec_src_getcaps), (user_read_data), (gst_pngdec_chain): - * ext/libpng/gstpngdec.h: - Added png decoder. - -2004-07-16 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xerror), - (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_new), - (gst_ximagesink_ximage_destroy), (gst_ximagesink_sink_link), - (gst_ximagesink_chain), (gst_ximagesink_buffer_free), - (gst_ximagesink_buffer_alloc): - * sys/ximage/ximagesink.h: - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), - (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), - (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), - (gst_xvimagesink_buffer_alloc): - * sys/xvimage/xvimagesink.h: Getting the 2 video sinks synchronized - again. Using internal data pointer of the x(v)image to store image's - data to be coherent with the buffer alloc mechanism. Investigated the - image destruction code to be sure that everything gets freed correctly. - -2004-07-16 Wim Taymans <wim@fluendo.com> - - * gst-libs/gst/riff/riff-read.c: - (gst_riff_read_strf_vids_with_data), - (gst_riff_read_strf_auds_with_data): - * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), - (gst_avi_demux_add_stream), (gst_avi_demux_stream_header): - Make sure we don't create 0 sized subbuffers in riff-read. - Signal the no more pads signal after reading the avi header. - -2004-07-16 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), - (gst_decode_bin_class_init), (gst_decode_bin_is_dynamic), - (gst_decode_bin_factory_filter), (compare_ranks), (print_feature), - (gst_decode_bin_init), (gst_decode_bin_dispose), - (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), - (no_more_pads), (close_link), (type_found), - (gst_decode_bin_set_property), (gst_decode_bin_get_property), - (gst_decode_bin_change_state), (plugin_init): - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), - (gst_play_base_bin_class_init), (gst_play_base_bin_init), - (gst_play_base_bin_dispose), (queue_overrun), - (gen_preroll_element), (remove_prerolls), (unknown_type), - (no_more_pads), (new_stream), (setup_source), - (gst_play_base_bin_set_property), (gst_play_base_bin_get_property), - (play_base_eos), (gst_play_base_bin_change_state), - (gst_play_base_bin_add_element), - (gst_play_base_bin_remove_element), - (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), - (gst_play_base_bin_unlink_stream), - (gst_play_base_bin_get_streaminfo): - * gst/playback/gstplaybasebin.h: - Better error recovery. Added configurable preroll queue size. Faster - detection of no-more-pads. - -2004-07-16 Wim Taymans <wim@fluendo.com> - - * gst-libs/gst/video/video.h: - Added 32 bits RGBA. Not sure if we should use another mime-type - for alpha rgb. Currently the presence of the alpha_mask property - signals an alpha channel. - -2004-07-16 Wim Taymans <wim@fluendo.com> - - * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): - FPS seems to be 0.0 to MAX everywhere else. - -2004-07-15 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data): - mp42/mp43 (no caps) exist too. - * gst/matroska/matroska-demux.c: (gst_matroska_demux_video_caps): - Set pixel_width/height; we've got them in-caps. - * gst/typefind/gsttypefindfunctions.c: (plugin_init): - * gst/wavparse/gstwavparse.c: (plugin_init): - Both are valid primary. - * sys/oss/gstossmixer.c: - Remove i18n hack and enable translations. - -2004-07-15 Benjamin Otte <otte@gnome.org> - - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), - (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy): - fix for non-shm xv. Original patch by Tim Ringenbach (fixes #147248) - -2004-07-15 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsa.c: (gst_alsa_open_audio), - (gst_alsa_sw_params_dump), (gst_alsa_hw_params_dump), - (gst_alsa_close_audio): - disable some of the debugging code for now. Writing debugging to a - buffer is broken in current alsalib releases. - -2004-07-12 Benjamin Otte <otte@gnome.org> - - * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_alloc_buffer): - use bufferpools - -2004-07-14 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/theora/theoradec.c: (gst_theora_dec_class_init), - (theora_dec_src_query), (theora_dec_event): - * ext/theora/theoraenc.c: (gst_theora_enc_class_init): - add debugging categories. Remove \n's. - -2004-07-13 Johan Dahlin <johan@gnome.org> - - * gst/playback/gstplaybin.c (gst_play_bin_set_property) - (gst_play_bin_get_property): Impl. - -2004-07-13 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_seek_before): - When trying to find the stream length, seek back N pages - instead of just one, where N is the number of streams in - the current chain. - -2004-07-13 Wim Taymans <wim@fluendo.com> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_audio_caps_with_data), - (gst_riff_create_audio_caps), - (gst_riff_create_audio_template_caps): - * gst-libs/gst/riff/riff-media.h: - * gst-libs/gst/riff/riff-read.c: - (gst_riff_read_strf_vids_with_data), - (gst_riff_read_strf_auds_with_data), (gst_riff_read_strf_auds): - * gst-libs/gst/riff/riff-read.h: - * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), - (gst_avi_demux_add_stream): - Set codec_data on caps for avidemuxer. - -2004-07-12 David Schleef <ds@schleef.org> - - * configure.ac: Fix test for Objective C - -2004-07-12 Jan Schmidt <thaytan@mad.scientist.com> - * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_get_capslist), - (gst_gdk_pixbuf_chain): - Add svg and pcx to template caps, and ensure that getcaps returns a - subset of the template caps. - Copy each row manually for output, as gdkpixbuf may pad the - rowstride to a 32-bit word boundary. - -2004-07-12 Wim Taymans <wim@fluendo.com> - - * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps), - (gst_riff_create_video_template_caps): - Fix the template caps to include some more media types. - -2004-07-12 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), - (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), - (compare_ranks), (print_feature), (gst_decode_bin_init), - (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), - (try_to_link_1), (new_pad), (close_link), (type_found), - (gst_decode_bin_set_property), (gst_decode_bin_get_property), - (gst_decode_bin_change_state), (plugin_init): - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), - (gst_play_base_bin_class_init), (gst_play_base_bin_init), - (gst_play_base_bin_dispose), (queue_overrun), - (gen_preroll_element), (remove_prerolls), (no_more_pads), - (new_stream), (setup_source), (gst_play_base_bin_set_property), - (gst_play_base_bin_get_property), (play_base_eos), - (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), - (gst_play_base_bin_remove_element), - (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), - (gst_play_base_bin_unlink_stream), - (gst_play_base_bin_get_streaminfo): - * gst/playback/gstplaybasebin.h: - * gst/playback/gstplaybin.c: (gst_play_bin_get_type), - (gst_play_bin_class_init), (gst_play_bin_init), - (gst_play_bin_dispose), (gst_play_bin_set_property), - (gst_play_bin_get_property), (gen_video_element), - (gen_audio_element), (remove_sinks), (setup_sinks), - (gst_play_bin_change_state), (gst_play_bin_get_event_masks), - (gst_play_bin_send_event), (gst_play_bin_get_formats), - (gst_play_bin_convert), (gst_play_bin_get_query_types), - (gst_play_bin_query), (plugin_init): - * gst/playback/test4.c: (main): - More fixes on reusing of the element. - -2004-07-11 Benjamin Otte <otte@gnome.org> - - * ext/mad/gstmad.c: (normal_seek): - allow seeking for other methods than just SET - -2004-07-11 Andy Wingo <wingo@pobox.com> - - * gst/audioconvert/gstaudioconvert.c (gst_audio_convert_link): For - float, "any" caps -> buffer_frames=0,MAX. - - * gst/interleave/interleave.c (interleave_getcaps): Seems the core - doesn't intersect our caps with the template any more. Do it - ourselves. - (interleave_buffered_loop): Use g_newa instead of malloc/free. - -2004-07-09 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), - (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), - (compare_ranks), (print_feature), (gst_decode_bin_init), - (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), - (try_to_link_1), (new_pad), (close_link), (type_found), - (gst_decode_bin_set_property), (gst_decode_bin_get_property), - (gst_decode_bin_change_state), (plugin_init): - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), - (gst_play_base_bin_class_init), (gst_play_base_bin_init), - (gst_play_base_bin_dispose), (queue_overrun), - (gen_preroll_element), (remove_prerolls), (no_more_pads), - (new_stream), (setup_source), (gst_play_base_bin_set_property), - (gst_play_base_bin_get_property), (play_base_eos), - (gst_play_base_bin_change_state), (gst_play_base_bin_add_element), - (gst_play_base_bin_remove_element), - (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), - (gst_play_base_bin_unlink_stream), - (gst_play_base_bin_get_streaminfo): - * gst/playback/gstplaybasebin.h: - * gst/playback/gstplaybin.c: (gst_play_bin_get_type), - (gst_play_bin_class_init), (gst_play_bin_init), - (gst_play_bin_dispose), (gst_play_bin_set_property), - (gst_play_bin_get_property), (gen_video_element), - (gen_audio_element), (remove_sinks), (setup_sinks), - (gst_play_bin_change_state), (gst_play_bin_get_event_masks), - (gst_play_bin_send_event), (gst_play_bin_get_formats), - (gst_play_bin_convert), (gst_play_bin_get_query_types), - (gst_play_bin_query), (plugin_init): - * gst/playback/test4.c: (main): - Work on object reuse and seeking. - -2004-07-09 Wim Taymans <wim@fluendo.com> - - * examples/seeking/seek.c: (iterate): - Don't consume all CPU in the idle loop. - -2004-07-09 Wim Taymans <wim@fluendo.com> - - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_new_output_pad), - (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_process_private): - Add pad to element *after* setting the pad functions so that - the scheduler can use the correct ones. - -2004-07-09 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoradec.c: (theora_dec_from_granulepos), - (theora_dec_src_query), (theora_dec_src_event), (theora_dec_chain): - Sync to keyframe after seek - -2004-07-09 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * ext/alsa/gstalsa.c: (gst_alsa_change_state): - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), - (gst_alsa_sink_loop), (gst_alsa_sink_change_state): - * ext/alsa/gstalsasrc.c: (gst_alsa_src_change_state): - * ext/libvisual/visual.c: (gst_visual_change_state): - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_change_state): - * ext/theora/theoradec.c: (theora_dec_change_state): - * ext/theora/theoraenc.c: (theora_enc_change_state): - * ext/vorbis/vorbisdec.c: (vorbis_dec_change_state): - * gst-libs/gst/navigation/navigation.c: - * gst/adder/gstadder.c: (gst_adder_change_state): - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain), - (gst_audio_convert_get_buffer): - * gst/multipart/multipartdemux.c: - (gst_multipart_demux_change_state): - * gst/playback/gstdecodebin.c: (gst_decode_bin_change_state): - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_change_state): - * gst/playback/gstplaybin.c: (gst_play_bin_change_state): - * gst/videoscale/gstvideoscale.c: - (gst_videoscale_handle_src_event): - * gst/volume/gstvolume.c: (volume_chain_int16): - don't assert in state change, this should be done by the base - GstElement class. - various debugging fixes. - -2004-07-08 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * configure.ac: - * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), - (gst_play_dispose), (gst_play_set_location), - (gst_play_set_data_src), (gst_play_set_video_sink), - (gst_play_set_audio_sink), (gst_play_set_visualization), - (gst_play_connect_visualization), (gst_play_get_sink_element), - (gst_play_get_all_by_interface): - * gst-libs/gst/play/play.h: - add new method to get elements implementing an interface. - add various error logging - -2004-07-08 Wim Taymans <wim@fluendo.com> - - * examples/seeking/seek.c: (make_dv_pipeline), (make_avi_pipeline), - (make_mpeg_pipeline), (make_mpegnt_pipeline), - (make_playerbin_pipeline), (query_durations_elems), - (query_durations_pads), (query_positions_elems), - (query_positions_pads), (update_scale), (iterate), (stop_seek), - (main): - Added playbin seeking example. - -2004-07-08 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * gst-libs/gst/play/play.c: (gst_play_set_location), - (gst_play_set_data_src), (gst_play_set_video_sink), - (gst_play_set_audio_sink), (gst_play_set_visualization), - (gst_play_connect_visualization), (gst_play_get_framerate): - use a macro to look up elements from hash table - -2004-07-08 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), - (gst_play_get_length_callback), (gst_play_set_location), - (gst_play_seek_to_time), (gst_play_set_data_src), - (gst_play_set_video_sink), (gst_play_set_audio_sink), - (gst_play_set_visualization), (gst_play_connect_visualization), - (gst_play_get_sink_element): - - add debugging info - - fix looking up sink elements by iterating over complete caps - - put everything except for source and autoplugger in a complete bin - -2004-07-08 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * ext/alsa/gstalsa.c: (gst_alsa_drain_audio): - * ext/alsa/gstalsasink.c: (gst_alsa_sink_flush_one_pad), - (gst_alsa_sink_check_event), (gst_alsa_sink_mmap), - (gst_alsa_sink_write), (gst_alsa_sink_loop): - * ext/alsa/gstalsasink.h: - - add debugging info - - clean up schizophrenia of data/buffer/event - - fix double event unref error - -2004-07-08 Wim Taymans <wim@fluendo.com> - - * gst/playback/Makefile.am: - Add headers to noinst - -2004-07-08 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * tools/gst-launch-ext-m.m: - * tools/gst-launch-ext.1.in: - convert to the third millenium - -2004-07-07 David Schleef <ds@schleef.org> - - * sys/dxr3/Makefile.am: noinst_SOURCES should be nodist_SOURCES - -2004-07-07 Wim Taymans <wim@fluendo.com> - - * gst/playback/Makefile.am: - * gst/playback/README: - * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), - (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), - (compare_ranks), (print_feature), (gst_decode_bin_init), - (gst_decode_bin_dispose), (find_compatibles), (close_pad_link), - (try_to_link_1), (new_pad), (close_link), (type_found), - (gst_decode_bin_set_property), (gst_decode_bin_get_property), - (plugin_init): - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), - (gst_play_base_bin_class_init), (gst_play_base_bin_init), - (gst_play_base_bin_dispose), (rebuild_pipeline), (queue_overrun), - (gen_preroll_element), (no_more_pads), (new_stream), - (setup_source), (gst_play_base_bin_set_property), - (gst_play_base_bin_get_property), (gst_play_base_bin_change_state), - (gst_play_base_bin_add_element), - (gst_play_base_bin_remove_element), - (gst_play_base_bin_mute_stream), (gst_play_base_bin_link_stream), - (gst_play_base_bin_unlink_stream), - (gst_play_base_bin_get_streaminfo): - * gst/playback/gstplaybasebin.h: - * gst/playback/gstplaybin.c: (gst_play_bin_get_type), - (gst_play_bin_class_init), (gst_play_bin_init), - (gst_play_bin_dispose), (gst_play_bin_set_property), - (gst_play_bin_get_property), (gen_video_element), - (gen_audio_element), (setup_sinks), (gst_play_bin_change_state), - (gst_play_bin_get_event_masks), (gst_play_bin_send_event), - (gst_play_bin_get_formats), (gst_play_bin_convert), - (gst_play_bin_get_query_types), (gst_play_bin_query), - (plugin_init): - * gst/playback/gststreaminfo.c: (gst_stream_type_get_type), - (gst_stream_info_get_type), (gst_stream_info_class_init), - (gst_stream_info_init), (gst_stream_info_new), - (gst_stream_info_dispose), (gst_stream_info_set_property), - (gst_stream_info_get_property): - * gst/playback/gststreaminfo.h: - * gst/playback/test.c: (gen_video_element), (gen_audio_element), - (main): - * gst/playback/test2.c: (main): - * gst/playback/test3.c: (update_scale), (main): - More playbin fixes. Added README. Do better element filtering. - Added base class to preroll media. Added test apps. - -2004-07-07 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_flush_decoder): - * ext/mpeg2dec/gstmpeg2dec.h: - various debugging improvements. Reset stream to next picture - instead of sequence header, otherwise seeks cannot work. - -2004-07-07 Wim Taymans <wim@fluendo.com> - - * gst/videobox/gstvideobox.c: (gst_video_box_fill_get_type), - (gst_video_box_class_init), (gst_video_box_set_property), - (gst_video_box_i420), (gst_video_box_ayuv), (gst_video_box_chain): - Use pad_alloc where possible. - -2004-07-07 Wim Taymans <wim@fluendo.com> - - * sys/oss/gstosselement.c: (gst_osselement_reset), - (gst_osselement_parse_caps): - * sys/oss/gstosselement.h: - * sys/oss/gstosssrc.c: (gst_osssrc_get): - Fix offset on osssrc. - -2004-07-07 Wim Taymans <wim@fluendo.com> - - * ext/theora/theora.c: (plugin_init): - * ext/theora/theoradec.c: (theora_dec_from_granulepos), - (theora_dec_src_query), (theora_dec_chain): - * ext/theora/theoraenc.c: (gst_theora_enc_class_init), - (theora_enc_sink_link), (theora_buffer_from_packet), - (theora_push_packet), (theora_enc_chain): - Fix theora granulepos calculation. - Fix overflow in duration/position calculation. - Bump rank to PRIMARY for theoradec. - Use granulepos of last packet to calculate position. - Set keyframe flag on buffers when needed. - -2004-07-06 David Schleef <ds@schleef.org> - - * gst/playback/Makefile.am: 'test' in bin_PROGRAMS? Are you - serious? (Fixed, obviously.) - -2004-07-06 Thomas Vander Stichele <thomas at apestaart dot org> - - * po/LINGUAS: - * po/cs.po: - added Czech translation (Miloslav Trmac) - -2004-07-05 Wim Taymans <wim@fluendo.com> - - * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), - (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), - (compare_ranks), (gst_decode_bin_init), (gst_decode_bin_dispose), - (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), - (close_link), (type_found), (gst_decode_bin_set_property), - (gst_decode_bin_get_property), (gst_decode_bin_get_event_masks), - (gst_decode_bin_send_event), (gst_decode_bin_get_formats), - (gst_decode_bin_convert), (gst_decode_bin_get_query_types), - (gst_decode_bin_query), (plugin_init): - * gst/playback/gstplaybin.c: (gst_play_bin_get_type), - (gst_play_bin_class_init), (gst_play_bin_init), - (gst_play_bin_dispose), (rebuild_pipeline), (get_audio_element), - (get_video_element), (new_pad), (setup_source), - (gst_play_bin_set_property), (gst_play_bin_get_property), - (gst_play_bin_change_state), (gst_play_bin_add_element), - (gst_play_bin_remove_element), (gst_play_bin_get_event_masks), - (gst_play_bin_send_event), (gst_play_bin_get_formats), - (gst_play_bin_convert), (gst_play_bin_get_query_types), - (gst_play_bin_query), (gst_play_bin_get_clock), (plugin_init): - * gst/playback/test.c: (main): - More fixes, cleaned up playbin, make it use decodebin. Added - threaded property to playbin. - -2004-07-05 Wim Taymans <wim@fluendo.com> - - * configure.ac: - * gst/playback/Makefile.am: - * gst/playback/decodetest.c: (main): - * gst/playback/gstdecodebin.c: (gst_decode_bin_get_type), - (gst_decode_bin_class_init), (gst_decode_bin_factory_filter), - (compare_ranks), (gst_decode_bin_init), (gst_decode_bin_dispose), - (find_compatibles), (close_pad_link), (try_to_link_1), (new_pad), - (close_link), (type_found), (gst_decode_bin_set_property), - (gst_decode_bin_get_property), (gst_decode_bin_change_state), - (gst_decode_bin_get_event_masks), (gst_decode_bin_send_event), - (gst_decode_bin_get_formats), (gst_decode_bin_convert), - (gst_decode_bin_get_query_types), (gst_decode_bin_query), - (plugin_init): - * gst/playback/gstplaybin.c: (gst_play_bin_get_type), - (gst_play_bin_class_init), (gst_play_bin_init), - (gst_play_bin_dispose), (gen_default_output), (rebuild_pipeline), - (collect_sink_pads), (find_compatibles), (close_pad_link), - (try_to_link_1), (new_pad), (close_link), (type_found), - (setup_source), (gst_play_bin_set_property), - (gst_play_bin_get_property), (gst_play_bin_factory_filter), - (compare_ranks), (gst_play_bin_collect_factories), - (gst_play_bin_change_state), (gst_play_bin_add_element), - (gst_play_bin_remove_element), (gst_play_bin_get_event_masks), - (gst_play_bin_send_event), (gst_play_bin_get_formats), - (gst_play_bin_convert), (gst_play_bin_get_query_types), - (gst_play_bin_query), (gst_play_bin_get_clock), (plugin_init): - * gst/playback/test.c: (main): - Added some playback helper elements and some test apps, very alpha - still. - -2004-07-04 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsa.c: (gst_alsa_xrun_recovery): - only restart audio when we indeed have an xrun to fix repeated - xruns. Fix suggested by Giuliano Pochini. - -2004-07-03 David Schleef <ds@schleef.org> - - * ext/alsa/gstalsaplugin.c: (gst_alsa_error_wrapper): Disable - call to gst_debug_log() if debugging is disabled (bug #145118) - -2004-07-03 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsa.c: (gst_alsa_xrun_recovery): - use our own functions for restarting the alsa device. - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): - I should apply patches myself - use MIN for the third argument, not - the second, this fixes seeking - -2004-07-02 David Schleef <ds@schleef.org> - - * ext/flac/gstflacdec.c: (gst_flacdec_class_init), - (gst_flacdec_write): Actually, GST_PAD_CAPS() has nothing to - do with the logic. - -2004-07-02 David Schleef <ds@schleef.org> - - * ext/flac/gstflacdec.c: (gst_flacdec_write): Set duration on - output buffers. Fix logic mistake. (bug #144866) - -2004-07-02 David Schleef <ds@schleef.org> - - * gst-libs/gst/xoverlay/Makefile.am: xoverlay no longer depends - on X. (bug #144753) - -2004-07-02 David Schleef <ds@schleef.org> - - * gst/wavenc/gstwavenc.c: (gst_wavenc_setup), - (gst_wavenc_stop_file): Switch to GST_WRITE_UINT32_LE macros - (bug #144624) - * sys/oss/gstosselement.c: (gst_osselement_probe_caps), - (gst_osselement_rate_probe_check): Add another workaround for - buggy drivers (bug #145336) - -2004-07-02 David Schleef <ds@schleef.org> - - * gst/tcp/gstmultifdsink.c: (gst_multifdsink_handle_client_write): - Most systems don't have MSG_NOSIGNAL. - -2004-07-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * Makefile.am: - * gst-libs/gst/colorbalance/Makefile.am: - * gst-libs/gst/mixer/Makefile.am: - * gst-libs/gst/play/Makefile.am: - * gst-libs/gst/tuner/Makefile.am: - (hopefully) fix both install and dist and make error message useful. - needs testing across automakes. - -2004-07-02 Benjamin Otte <otte@gnome.org> - - * ext/ogg/gstogg.c: (plugin_init): - we require bytestream now - * ext/ogg/gstoggdemux.c: - huge diff to implement chain setup in a fast and generic way. This - improves tag reading and startup of huge files (read: Theora videos) - quite a bit. It probably contains bugs, too, so please test. - Seeking is not improved to the fast method. - -2004-06-29 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): - * ext/ogg/gstoggmux.c: - Fix memleak in oggdemux when running unconnected pads. - doc update in mux, start working on keyframe mode. - -2004-06-29 Benjamin Otte <otte@gnome.org> - - * sys/oss/gstosssink.c: - * sys/oss/gstosssrc.c: - advertise correct template caps - we indeed do non-native endianness - and 8bit audio has no endianness - * sys/ximage/ximagesink.c: (gst_ximagesink_getcaps): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_getcaps): - avoid (wrong) duplications in getcaps function and return - template caps - -2004-06-29 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_recover_policy_get_type), - (gst_multifdsink_class_init), (gst_multifdsink_add), - (gst_multifdsink_remove), (gst_multifdsink_clear), - (gst_multifdsink_client_remove), - (gst_multifdsink_handle_client_read), - (gst_multifdsink_client_queue_data), - (gst_multifdsink_client_queue_caps), - (gst_multifdsink_client_queue_buffer), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), - (gst_multifdsink_handle_clients), (gst_multifdsink_thread), - (gst_multifdsink_init_send), (gst_multifdsink_close): - Fix wrong GList iteration that could crash the server when - more then 2 clients disconnect at the same time. Read all the - pending commands in one batch to recover from command storms under - very heavy load. - -2004-06-28 Wim Taymans <wim@fluendo.com> - - * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), - (gst_videomixer_pad_class_init), (gst_videomixer_pad_get_property), - (gst_videomixer_pad_set_property), - (gst_videomixer_pad_sinkconnect), (gst_videomixer_pad_init), - (gst_video_mixer_background_get_type), (gst_videomixer_get_type), - (gst_videomixer_class_init), (gst_videomixer_init), - (gst_videomixer_request_new_pad), (gst_videomixer_blend_ayuv_i420), - (pad_zorder_compare), (gst_videomixer_sort_pads), - (gst_videomixer_fill_checker), (gst_videomixer_fill_color), - (gst_videomixer_fill_queues), (gst_videomixer_blend_buffers), - (gst_videomixer_update_queues), (gst_videomixer_loop), - (plugin_init): - Avoid divide by zero, choose masterpad as the pad with the highest - framerate. - -2004-06-27 Julien Moutte <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate), - (gst_ximagesink_xwindow_new): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate), - (gst_xvimagesink_xwindow_new): I prefer locking the mutex in the - function directly. We might want to call it from somewhere else one day. - -2004-06-27 Julien Moutte <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_decorate), - (gst_ximagesink_xwindow_new): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_decorate), - (gst_xvimagesink_xwindow_new): Trying to fix the random behaviour of - window decorations. - -2004-06-27 Wim Taymans <wim@fluendo.com> - - * ext/dv/gstdvdec.c: (gst_dvdec_class_init), (gst_dvdec_init), - (gst_dvdec_video_getcaps), (gst_dvdec_video_link), - (gst_dvdec_push), (gst_dvdec_loop), (gst_dvdec_change_state), - (gst_dvdec_set_property), (gst_dvdec_get_property): - * ext/dv/gstdvdec.h: - Implement drop_factor property to lower the framerate with - a factor. - -2004-06-27 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/colorbalance/Makefile.am: - * gst-libs/gst/mixer/Makefile.am: - * gst-libs/gst/play/Makefile.am: - * gst-libs/gst/tuner/Makefile.am: - unbreak Company's fix that didn't install the -enum.h files - -2004-06-27 Wim Taymans <wim@fluendo.com> - - * ext/dv/gstdvdec.c: (gst_dvdec_push), (gst_dvdec_loop), - (gst_dvdec_change_state): - * ext/dv/gstdvdec.h: - Fix timestamp, duration and offset of the buffers. - -2004-06-27 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gstmultifdsink.c: (gst_recover_policy_get_type), - (gst_multifdsink_class_init), (gst_multifdsink_add), - (gst_multifdsink_remove), (gst_multifdsink_clear), - (gst_multifdsink_client_remove), - (gst_multifdsink_handle_client_read), - (gst_multifdsink_client_queue_data), - (gst_multifdsink_client_queue_caps), - (gst_multifdsink_client_queue_buffer), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), - (gst_multifdsink_handle_clients), (gst_multifdsink_thread), - (gst_multifdsink_init_send), (gst_multifdsink_close): - * gst/tcp/gstmultifdsink.h: - * gst/tcp/gsttcpserversink.c: - (gst_tcpserversink_handle_server_read), - (gst_tcpserversink_handle_select), (gst_tcpserversink_close): - More multifdsink fixes, more recovery policy fixes. - Removed stupid g_print - -2004-06-26 Wim Taymans <wim@fluendo.com> - - * gst/tcp/Makefile.am: - * gst/tcp/gstmultifdsink.c: (gst_recover_policy_get_type), - (gst_multifdsink_get_type), (gst_multifdsink_base_init), - (gst_multifdsink_class_init), (gst_multifdsink_init), - (gst_multifdsink_debug_fdset), (gst_multifdsink_client_remove), - (gst_multifdsink_handle_client_read), - (gst_multifdsink_client_queue_data), - (gst_multifdsink_client_queue_caps), - (gst_multifdsink_client_queue_buffer), - (gst_multifdsink_handle_client_write), - (gst_multifdsink_recover_client), (gst_multifdsink_queue_buffer), - (gst_multifdsink_handle_clients), (gst_multifdsink_thread), - (gst_multifdsink_chain), (gst_multifdsink_set_property), - (gst_multifdsink_get_property), (gst_multifdsink_init_send), - (gst_multifdsink_close), (gst_multifdsink_change_state): - * gst/tcp/gstmultifdsink.h: - * gst/tcp/gsttcpplugin.c: (plugin_init): - * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_get_type), - (gst_tcpserversink_class_init), (gst_tcpserversink_init), - (gst_tcpserversink_handle_server_read), - (gst_tcpserversink_handle_select), - (gst_tcpserversink_set_property), (gst_tcpserversink_get_property), - (gst_tcpserversink_init_send), (gst_tcpserversink_close): - * gst/tcp/gsttcpserversink.h: - Added multifdsink, made tcpserversink a subclass of fdsink, removed - one of the locks, added recovery policy to multifdsink. - -2004-06-26 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/videorate/gstvideorate.c: (gst_videorate_chain): - fix decision for when getting frames with same timestamp - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init), (gst_v4lsrc_init), - (gst_v4lsrc_get), (gst_v4lsrc_set_property), - (gst_v4lsrc_get_property): - * sys/v4l/gstv4lsrc.h: - add latency offset property - -2004-06-26 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/videorate/gstvideorate.c: (gst_videorate_chain), - (plugin_init): - fix debugging. add category. - -2004-06-25 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/sine/gstsinesrc.c: (gst_sinesrc_get): - fix wrong offsets - -2004-06-25 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), - (gst_alsa_src_get_time), (gst_alsa_src_loop), - (gst_alsa_src_change_state): - return a time that is in sync with the element's processing - -2004-06-25 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), - (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), - (gst_tcpserversink_client_remove), - (gst_tcpserversink_handle_client_read), - (gst_tcpserversink_client_queue_data), - (gst_tcpserversink_client_queue_caps), - (gst_tcpserversink_client_queue_buffer), - (gst_tcpserversink_handle_client_write), - (gst_tcpserversink_queue_buffer), - (gst_tcpserversink_handle_clients), (gst_tcpserversink_thread), - (gst_tcpserversink_chain), (gst_tcpserversink_set_property), - (gst_tcpserversink_get_property), (gst_tcpserversink_init_send), - (gst_tcpserversink_close): - * gst/tcp/gsttcpserversink.h: - Serversink rewrite. Really do non blocking writes to clients and - maintain an internal queue to handle slower clients while not - disturbing fast clients. - -2004-06-25 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): - better debug, don't override OFFSET and OFFSET_END - -2004-06-25 Iain <iain@prettypeople.org> - - * gst-libs/gst/media-info/media-info-priv.c (gmi_set_mime): Add - name=source for the wavparse pipeline. - -2004-06-24 Johan Dahlin <johan@gnome.org> - - * ext/theora/theoraenc.c (theora_enc_chain): Call - gst_pad_try_set_caps instead of gst_pad_set_explicit_caps so the - streamheader caps are set correctly. - -2004-06-24 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/vorbis/vorbisenc.c: (raw_caps_factory), - (gst_vorbisenc_setup), (gst_vorbisenc_set_property): - respect minimum bitrate; same could be done for max bitrate - -2004-06-24 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/vorbis/vorbisenc.c: (raw_caps_factory), - (gst_vorbisenc_setup): - fix sample rate range - -2004-06-24 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_class_init), - (gst_oggvorbisenc_setup): - * ext/vorbis/vorbisenc.c: (gst_vorbisenc_class_init), - (gst_vorbisenc_setup): - resolve ambiguities in code and description - -2004-06-24 Wim Taymans <wim@fluendo.com> - - * ext/alsa/gstalsa.c: (gst_alsa_start), (gst_alsa_xrun_recovery): - * ext/alsa/gstalsa.h: - * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), - (gst_alsa_src_update_avail), (gst_alsa_src_loop): - Use alsa trigger_tstamp to get the timestamp of the first - sample in the buffer for more precise sync. Some cleanups. - -2004-06-24 Wim Taymans <wim@fluendo.com> - - * gst/audiorate/gstaudiorate.c: (gst_audiorate_link), - (gst_audiorate_init), (gst_audiorate_chain), - (gst_audiorate_set_property), (gst_audiorate_get_property): - * gst/videorate/gstvideorate.c: (gst_videorate_class_init), - (gst_videorate_chain): - Added some logging, fixed an overflow bug in videorate. - -2004-06-24 Benjamin Otte <otte@gnome.org> - - * ext/kio/Makefile.am: - fix for builddir != srcdir and distcheck - -2004-06-24 Benjamin Otte <otte@gnome.org> - - * gst-libs/gst/colorbalance/Makefile.am: - * gst-libs/gst/mixer/Makefile.am: - * gst-libs/gst/play/Makefile.am: - * gst-libs/gst/tuner/Makefile.am: - * gst/tcp/Makefile.am: - * sys/dxr3/Makefile.am: - don't include -enumtypes.ch or -marshal.ch files in the disted - tarball. - Also add all *.list files that were missing. - * Makefile.am: - add a distcheck hook to ensure the above doesn't happen again. - -2004-06-23 David I. Lehn <dlehn@users.sourceforge.net> - - * ext/Makefile.am: s/DTS_DIR=dvdread/DTS_DIR=dts/ - -2004-06-23 Colin Walters <walters@redhat.com> - - * m4/Makefile.am: Distribute gst-fionread.m4. - -2004-06-23 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: back to dev - -2004-06-23 Wim Taymans <wim@fluendo.com> - - * ext/alsa/gstalsa.c: (gst_alsa_change_state), (gst_alsa_start), - (gst_alsa_xrun_recovery): - * ext/alsa/gstalsa.h: - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event), - (gst_alsa_sink_loop), (gst_alsa_sink_get_time): - * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), - (gst_alsa_src_get_time), (gst_alsa_src_update_avail), - (gst_alsa_src_loop): - Add clock to alsasrc. Take new capture timestamp when - restarting after an overrun. Split up some functions between - alsasrc and alsasink. - -=== release 0.8.2 === - -2004-06-23 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/alsa/gstalsa.c: (gst_alsa_init), (gst_alsa_dispose), - (gst_alsa_change_state), (gst_alsa_update_avail), - (gst_alsa_xrun_recovery): - * ext/alsa/gstalsa.h: - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): - merge back changes from release - -2004-06-23 Wim Taymans <wim@fluendo.com> - - * gst/audiorate/gstaudiorate.c: (gst_audiorate_class_init), - (gst_audiorate_init), (gst_audiorate_chain), - (gst_audiorate_set_property), (gst_audiorate_get_property): - Implement sample dropping and notify - -2004-06-22 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoraenc.c: (gst_theora_enc_class_init), - (theora_enc_sink_link), (theora_buffer_from_packet), - (theora_push_packet), (theora_enc_chain): - Some cleanups, make sure the timestamps are correct. - -2004-06-22 Wim Taymans <wim@fluendo.com> - - * ext/alsa/gstalsa.c: (gst_alsa_get_time), (gst_alsa_clock_update), - (gst_alsa_change_state), (gst_alsa_update_avail), - (gst_alsa_xrun_recovery): - * ext/alsa/gstalsa.h: - * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): - Cleanups, take queued samples into account when reporting - the time. - -2004-06-22 Wim Taymans <wim@fluendo.com> - - * gst/videorate/gstvideorate.c: (gst_videorate_class_init), - (gst_videorate_init): - Initialize the property as well. - -2004-06-22 Wim Taymans <wim@fluendo.com> - - * gst/videorate/gstvideorate.c: (gst_videorate_class_init), - (gst_videorate_init), (gst_videorate_chain), - (gst_videorate_set_property), (gst_videorate_get_property): - Add property to make videorate silent. - Add property to prefer new frames over old ones. - -2004-06-22 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * sys/osxvideo/Makefile.am: - Workaround so that the osxvideo .so file gets linked with the - Cocoa, OpenGL and QuickTime frameworks - -2004-06-22 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * sys/osxaudio/Makefile.am: - Workaround so that the osxaudio .so file gets linked with the - CoreAudio framework - -2004-06-22 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * configure.ac: - Whoops, my fault...fixed build issues - -2004-06-22 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * configure.ac: - Add objective-c support if running in Darwin/Mac OS X - * sys/Makefile.am: - * sys/osxvideo: - * sys/osxvideo/Makefile.am: - * sys/osxvideo/osxvideosink.h: - * sys/osxvideo/osxvideosink.m: - * sys/osxvideo/cocoawindow.h: - * sys/osxvideo/cocoawindow.m: - Add osxvideosink, a cocoa-based osx video sink - - -2004-06-19 Jan Schmidt <thaytan@mad.scientist.com> - * ext/dvdnav/gst-dvd: - Grab the gconf key from the right spot - * gst/debug/gstnavseek.c: (gst_navseek_init), - (gst_navseek_segseek), (gst_navseek_handle_src_event), - (gst_navseek_chain): - * gst/debug/gstnavseek.h: - Add 's', 'e' and 'l' keypresses to navseek to define the start,end - and loop parameters of a segment seek. - * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_init), - (gst_videotestsrc_get_event_masks), - (gst_videotestsrc_handle_src_event), (gst_videotestsrc_get): - * gst/videotestsrc/gstvideotestsrc.h: - Add seeking support to videotestsrc - Initialise the timestamp_offset variable. - -2004-06-18 Wim Taymans <wim@fluendo.com> - - * ext/sidplay/gstsiddec.cc: - Fix negotiation and set correct end offset. - -2004-06-18 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: branch and prerelease - -2004-06-17 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_init), - (gst_tcpclientsrc_getcaps), (gst_tcpclientsrc_get), - (gst_tcpclientsrc_init_receive): - * gst/tcp/gsttcpclientsrc.h: - read caps when connecting to server for GDP so we set them correctly - -2004-06-17 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/videorate/gstvideorate.c: (gst_videorate_chain): - notify drops and duplicates - * gst/videoscale/videoscale.c: (videoscale_get_structure): - no good reason to limit ourselves to 100x100 - -2004-06-17 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init), (gst_v4lsrc_init), - (gst_v4lsrc_open), (gst_v4lsrc_src_link), (gst_v4lsrc_getcaps), - (gst_v4lsrc_get), (gst_v4lsrc_set_property), - (gst_v4lsrc_get_property): - * sys/v4l/gstv4lsrc.h: - * sys/v4l/v4l_calls.c: (gst_v4l_set_window_properties), - (gst_v4l_open), (gst_v4l_get_picture), (gst_v4l_get_audio), - (gst_v4l_set_audio): - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_grab_frame), - (gst_v4lsrc_try_capture): - * sys/v4l/v4lsrc_calls.h: - change try_palette to more general try_capture - add autoprobe option so we can turn off autoprobing - various fixes - -2004-06-17 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - add videorate - * sys/ximage/ximagesink.c: (gst_ximagesink_finalize), - (gst_ximagesink_class_init): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_finalize), - (gst_xvimagesink_class_init): - run them as finalize, not dispose, since dispose can be invoked - multiple times - -2004-06-17 Wim Taymans <wim@fluendo.com> - - * ext/alsa/gstalsa.c: (gst_alsa_init), (gst_alsa_dispose), - (gst_alsa_get_time), (gst_alsa_xrun_recovery): - * ext/alsa/gstalsa.h: - * ext/alsa/gstalsaclock.c: (gst_alsa_clock_get_type): - * ext/alsa/gstalsasrc.c: (gst_alsa_src_init), (gst_alsa_src_loop), - (gst_alsa_src_change_state): - * ext/alsa/gstalsasrc.h: - Make the xrun code timestamp and offset the buffers correctly. - moved the clock to the base class, use alsa methods to get time. - Do correct timestamping on outgoing buffers. - -2004-06-17 Wim Taymans <wim@fluendo.com> - - * gst/audiorate/Makefile.am: - * gst/audiorate/gstaudiorate.c: (gst_audiorate_get_type), - (gst_audiorate_base_init), (gst_audiorate_class_init), - (gst_audiorate_link), (gst_audiorate_init), (gst_audiorate_chain), - (gst_audiorate_set_property), (gst_audiorate_get_property), - (gst_audiorate_change_state), (plugin_init): - Added an audiorate converter that fills in gaps. - -2004-06-17 Johan Dahlin <johan@gnome.org> - - * ext/tcp/*: Revert Zaheer changes, to make things actually work again. - -2004-06-16 Wim Taymans <wim@fluendo.com> - - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get): - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_sync_mode_get_type), - (gst_v4lsrc_class_init), (gst_v4lsrc_init), (gst_v4lsrc_get_fps), - (gst_v4lsrc_get), (gst_v4lsrc_set_property), - (gst_v4lsrc_get_property): - * sys/v4l/gstv4lsrc.h: - Added a copy mode to v4lsrc where it will output a copied version - of its internal hardware buffer. - Fix the wrong FLAG_SET usage. The flags are integers, not bits, you - can't | them. - -2004-06-16 Wim Taymans <wim@fluendo.com> - - * sys/oss/gstosssrc.c: (gst_osssrc_get): - Timestamp fixes. - -2004-06-16 Wim Taymans <wim@fluendo.com> - - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_sync_mode_get_type), - (gst_v4lsrc_class_init), (gst_v4lsrc_init), (gst_v4lsrc_get_fps), - (gst_v4lsrc_get), (gst_v4lsrc_set_property), - (gst_v4lsrc_get_property): - * sys/v4l/gstv4lsrc.h: - * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): - Added a sync mode enum property to control v4lsrc timestamp method - Removed the use-fixed-fps property and moved functionality in - the enum. - Don't error on an error value from v4l-conf, it might not always - be a real error. - -2004-06-16 Wim Taymans <wim@fluendo.com> - - * gst/videorate/Makefile.am: - * gst/videorate/gstvideorate.c: (gst_videorate_get_type), - (gst_videorate_base_init), (gst_videorate_class_init), - (gst_videorate_getcaps), (gst_videorate_link), - (gst_videorate_init), (gst_videorate_chain), - (gst_videorate_set_property), (gst_videorate_get_property), - (gst_videorate_change_state), (plugin_init): - Added a video timestamp corrector. - -2004-06-15 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - fixed a potential leak with previous commit - - * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): - -2004-06-15 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): - Added missing refcount, fixes bug #144425 - Cheers Tim for finding the bug - -2004-06-15 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/v4l/gstv4l.c: (plugin_init): - * sys/v4l/gstv4lcolorbalance.c: - * sys/v4l/gstv4lcolorbalance.h: - * sys/v4l/gstv4lelement.c: - * sys/v4l/gstv4lelement.h: - * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_class_init): - * sys/v4l/gstv4lmjpegsink.h: - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): - * sys/v4l/gstv4lmjpegsrc.h: - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_fps_list), - (gst_v4lsrc_get_fps), (gst_v4lsrc_srcconnect), - (gst_v4lsrc_getcaps), (gst_v4lsrc_get): - * sys/v4l/gstv4lsrc.h: - * sys/v4l/gstv4ltuner.c: - * sys/v4l/gstv4ltuner.h: - * sys/v4l/gstv4lxoverlay.c: - * sys/v4l/gstv4lxoverlay.h: - * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay), - (gst_v4l_set_window), (gst_v4l_enable_overlay): - * sys/v4l/v4l_calls.c: (gst_v4l_set_window_properties), - (gst_v4l_open), (gst_v4l_get_picture), (gst_v4l_get_audio), - (gst_v4l_set_audio): - * sys/v4l/v4l_calls.h: - * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_sync_thread), - (gst_v4lmjpegsink_queue_frame), (gst_v4lmjpegsink_sync_frame), - (gst_v4lmjpegsink_set_buffer), (gst_v4lmjpegsink_set_playback), - (gst_v4lmjpegsink_playback_init), - (gst_v4lmjpegsink_playback_start), (gst_v4lmjpegsink_get_buffer), - (gst_v4lmjpegsink_play_frame), (gst_v4lmjpegsink_wait_frame), - (gst_v4lmjpegsink_playback_stop), - (gst_v4lmjpegsink_playback_deinit): - * sys/v4l/v4lmjpegsink_calls.h: - * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_queue_frame), - (gst_v4lmjpegsrc_sync_next_frame), (gst_v4lmjpegsrc_set_buffer), - (gst_v4lmjpegsrc_set_capture), (gst_v4lmjpegsrc_set_capture_m), - (gst_v4lmjpegsrc_capture_init), (gst_v4lmjpegsrc_capture_start), - (gst_v4lmjpegsrc_grab_frame), (gst_v4lmjpegsrc_requeue_frame), - (gst_v4lmjpegsrc_capture_stop), (gst_v4lmjpegsrc_capture_deinit): - * sys/v4l/v4lmjpegsrc_calls.h: - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), - (gst_v4lsrc_sync_frame), (gst_v4lsrc_set_capture), - (gst_v4lsrc_capture_init), (gst_v4lsrc_capture_start), - (gst_v4lsrc_grab_frame), (gst_v4lsrc_requeue_frame), - (gst_v4lsrc_capture_stop), (gst_v4lsrc_capture_deinit), - (gst_v4lsrc_try_palette): - * sys/v4l/v4lsrc_calls.h: - bunch of paranoia cleanups - -2004-06-14 David Schleef <ds@schleef.org> - - * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_init), - (cdparanoia_get), (cdparanoia_open), (cdparanoia_change_state): - Send discont events and change timestamps appropriately when - we get a seek event. (bug #144240) - * ext/cdparanoia/gstcdparanoia.h: - -2004-06-14 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsa.c: Use snd_pcm_hw_params_set_rate _near instead of - snd_pcm_hw_params_set_rate since the latter fails for no good - reason on some setups. - -2004-06-14 David Schleef <ds@schleef.org> - - * gst/volume/demo.c: (value_changed_callback): exp10() is not - standard. Thank you for playing. - -2004-06-14 Wim Taymans <wim@fluendo.com> - - * gst/ffmpegcolorspace/imgconvert.c: (img_convert): - Patch 1.3 broke the ordering of the colorspace info and - made the plugin basically work by coincidence, reordered - the info. - -2004-06-14 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/lame/gstlame.c: - * ext/mad/gstmad.c: - sync caps. Make sure mad can only output a list of rates, not - a full range. In the future, have three caps lists for each of the - mpeg versions. Change mpegversion to a double as well. - -2004-06-14 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/volume/.cvsignore: - * gst/volume/Makefile.am: - * gst/volume/demo.c: (value_changed_callback), (idler), - (setup_gui), (main): - added small demo app - -2004-06-13 Jan Schmidt <thaytan@mad.scientist.com> - * ext/esd/esdsink.c: (gst_esdsink_change_state): - * ext/esd/esdsink.h: - Close the esd connection on pause, because esd will just wait - - blocking all other esd clients indefinitely. - -2004-06-12 Christophe Fergeau <teuf@gnome.org> - - * gst/tags/gstvorbistag.c: replaced a g_warning which I added in my - previous commit with GST_DEBUG - -2004-06-12 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - add a header check for a dvdread header in dvdnav. Fixes #133002 - -2004-06-12 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_init_send): - * gst/tcp/gsttcpclientsink.h: - * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_init_receive): - * gst/tcp/gsttcpclientsrc.h: - * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_init), - (gst_tcpserversink_handle_server_read), - (gst_tcpserversink_init_send): - * gst/tcp/gsttcpserversink.h: - * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_init_receive): - * gst/tcp/gsttcpserversrc.h: - Modified the tcp plugins so they are portable (IPv4,IPv6, any future - version of IP) - -2004-06-12 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * configure.ac: - Added ogg library so that OSX detects libtheora properly - -2004-06-11 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoradec.c: (theora_dec_chain), - (theora_dec_change_state): - Don't try to decode frames before we received a keyframe. - -2004-06-11 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init), - (gst_ogg_mux_init), (gst_ogg_mux_next_buffer), - (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), - (gst_ogg_mux_send_headers), (gst_ogg_mux_loop), - (gst_ogg_mux_get_property), (gst_ogg_mux_set_property): - Added property to set the maximum delay of a page. - -2004-06-10 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init), - (gst_ogg_mux_init), (gst_ogg_mux_next_buffer), - (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), - (gst_ogg_mux_send_headers), (gst_ogg_mux_loop), - (gst_ogg_mux_get_property), (gst_ogg_mux_set_property): - Added max-delay property to control the maximum amount - of data to put in one page. - -2004-06-10 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoraenc.c: (gst_theora_enc_class_init), - (gst_theora_enc_init), (theora_enc_sink_link), - (theora_buffer_from_packet), (theora_enc_set_property), - (theora_enc_get_property): - Set duration on encoded buffer, added some more properties - -2004-06-10 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer), - (gst_ogg_mux_get_headers), (gst_ogg_mux_set_header_on_caps), - (gst_ogg_mux_send_headers), (gst_ogg_mux_loop): - * ext/theora/theoraenc.c: (theora_enc_chain): - Fix refcounting bugs - -2004-06-10 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_init), - (gst_asf_demux_loop), (gst_asf_demux_process_file), - (gst_asf_demux_process_data), (gst_asf_demux_handle_data), - (gst_asf_demux_process_object), (gst_asf_demux_get_stream), - (gst_asf_demux_process_chunk), (gst_asf_demux_handle_sink_event), - (gst_asf_demux_handle_src_event), (gst_asf_demux_handle_src_query), - (gst_asf_demux_change_state): - * gst/asfdemux/gstasfdemux.h: - You know Chimaira? "I - HATE - EVERYTHING". Yeah, that's what this - feels like. I think we should set a new requirement for demuxers - from now on to implement sane loop functions, data loops, query - and seek functions before first commit into CVS. And this commit - fixes all of the above. - -2004-06-10 Christophe Fergeau <teuf@gnome.org> - - * gst/tags/gstvorbistag.c: (gst_vorbis_tag_add): make sure parsed - vorbis comments are properly encoded in UTF-8 before adding them - to a GstTagList - -2004-06-09 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsa.c: (add_channels): - handle min <= max correctly - * ext/alsa/gstalsa.c: (gst_alsa_fixate_to_mimetype), - (gst_alsa_fixate_field_nearest_int), (gst_alsa_fixate): - add fixation functions so we fixate correctly. No preferring of alaw - anymore because it's the first structure. - * ext/alsa/gstalsa.h: - * ext/alsa/gstalsa.c: (gst_alsa_sw_params_dump), - (gst_alsa_hw_params_dump): - add functions to ease debugging in alsalib - * ext/alsa/gstalsa.c: (gst_alsa_probe_hw_params), - (gst_alsa_set_hw_params), (gst_alsa_set_sw_params), - (gst_alsa_start_audio): - only specify hw params if we really setup a format (fixes #134007 - - or at least works around it) - -2004-06-09 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggmux.c: (gst_ogg_mux_init), - (gst_ogg_mux_next_buffer), (gst_ogg_mux_buffer_from_page), - (gst_ogg_mux_push_page), (gst_ogg_mux_get_headers), - (gst_ogg_mux_set_header_on_caps), (gst_ogg_mux_send_headers), - (gst_ogg_mux_loop): - Use stream caps to setup the initial pages in the ogg stream. - Correctly set the streamheader caps on the srcpad. - -2004-06-09 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_fps_list), - (gst_v4lsrc_get_fps), (gst_v4lsrc_srcconnect), - (gst_v4lsrc_getcaps): - * sys/v4l/v4l_calls.c: (gst_v4l_set_window_properties), - (gst_v4l_get_picture), (gst_v4l_get_audio), (gst_v4l_set_audio): - add querying of fps lists for webcams. Negotiating to a framerate - now works. - -2004-06-08 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/theora/theoraenc.c: (theora_buffer_from_packet), - (theora_push_buffer), (theora_push_packet), - (theora_set_header_on_caps), (theora_enc_chain): - mark buffers and put on streamheader, raw theora streaming - now works too, whee - -2004-06-08 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/tcp/gsttcp.c: (gst_tcp_gdp_read_header), - (gst_tcp_gdp_read_caps): - do a looping read for caps and GDP headers too - -2004-06-08 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): - * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_get): - return EOS instead of NULL in _get - -2004-06-08 Wim Taymans <wim@fluendo.com> - - * gst/tcp/gsttcp.c: (gst_tcp_gdp_read_header), - (gst_tcp_gdp_read_caps), (gst_tcp_gdp_write_header), - (gst_tcp_gdp_write_caps): - * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): - * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_gdp_read_caps), - (gst_tcpserversrc_gdp_read_header), (gst_tcpserversrc_get): - Memory leak fixes - -2004-06-08 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/vorbis/Makefile.am: - * ext/vorbis/vorbis.c: (plugin_init): - * ext/vorbis/vorbisparse.c: (gst_vorbis_parse_base_init), - (gst_vorbis_parse_class_init), (gst_vorbis_parse_init), - (vorbis_parse_set_header_on_caps), (vorbis_parse_chain), - (vorbis_parse_change_state): - * ext/vorbis/vorbisparse.h: - adding a vorbisparse element that marks the buffers, streaming - raw vorbis using GDP now works, whee - -2004-06-08 Wim Taymans <wim@fluendo.com> - - * ext/jpeg/Makefile.am: - * ext/jpeg/README: - * ext/jpeg/gstjpeg.c: (plugin_init): - * ext/jpeg/gstsmokedec.c: (gst_smokedec_get_type), - (gst_smokedec_base_init), (gst_smokedec_class_init), - (gst_smokedec_init), (gst_smokedec_link), (gst_smokedec_chain): - * ext/jpeg/gstsmokedec.h: - * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_get_type), - (gst_smokeenc_base_init), (gst_smokeenc_class_init), - (gst_smokeenc_init), (gst_smokeenc_getcaps), (gst_smokeenc_link), - (gst_smokeenc_resync), (gst_smokeenc_chain), - (gst_smokeenc_set_property), (gst_smokeenc_get_property): - * ext/jpeg/gstsmokeenc.h: - * ext/jpeg/smokecodec.c: (smokecodec_init_destination), - (smokecodec_flush_destination), (smokecodec_term_destination), - (smokecodec_init_source), (smokecodec_fill_input_buffer), - (smokecodec_skip_input_data), (smokecodec_resync_to_restart), - (smokecodec_term_source), (smokecodec_encode_new), - (smokecodec_decode_new), (smokecodec_info_free), - (smokecodec_set_quality), (smokecodec_get_quality), - (smokecodec_set_threshold), (smokecodec_get_threshold), - (smokecodec_set_bitrate), (smokecodec_get_bitrate), - (find_best_size), (abs_diff), (put), (smokecodec_encode), - (smokecodec_parse_header), (smokecodec_decode): - * ext/jpeg/smokecodec.h: - Added a new simple jpeg based codec - -2004-06-08 Wim Taymans <wim@fluendo.com> - - * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), - (gst_multipart_mux_loop): - Fix memory leak - -2004-06-08 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_get): - * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_client_remove), - (gst_tcpserversink_handle_client_read), (gst_tcp_buffer_write), - (gst_tcpserversink_handle_client_write), (gst_tcpserversink_chain), - (gst_tcpserversink_init_send), (gst_tcpserversink_close): - * gst/tcp/gsttcpserversink.h: - take streamheader into account - -2004-06-08 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/level/Makefile.am: - * gst/level/gstlevel.c: (gst_level_class_init): - clean up marshal generation - -2004-06-08 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/tcp/Makefile.am: - * gst/tcp/gsttcpclientsink.c: (gst_tcpclientsink_get_type), - (gst_tcpclientsink_class_init), (gst_tcpclientsink_init), - (gst_tcpclientsink_set_property), (gst_tcpclientsink_get_property): - * gst/tcp/gsttcpclientsrc.c: (gst_tcpclientsrc_class_init), - (gst_tcpclientsrc_init), (gst_tcpclientsrc_set_property), - (gst_tcpclientsrc_get_property): - * gst/tcp/gsttcpserversink.c: (gst_tcpserversink_class_init), - (gst_tcpserversink_init), (gst_tcpserversink_handle_server_read), - (gst_tcpserversink_handle_client_read), - (gst_tcpserversink_handle_client_write), - (gst_tcpserversink_set_property), (gst_tcpserversink_get_property): - * gst/tcp/gsttcpserversink.h: - add signals client-added and client-removed - * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_class_init), - (gst_tcpserversrc_init), (gst_tcpserversrc_set_property), - (gst_tcpserversrc_get_property): - uniformized, change default protocol to NONE - * gst/tcp/gsttcp-marshal.list: added -2004-06-07 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): - handle discont events if they happen before caps nego - -2004-06-07 Wim Taymans <wim@fluendo.com> - - * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), - (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain), - (gst_multipart_demux_plugin_init): - * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), - (gst_multipart_mux_init), (gst_multipart_mux_loop), - (gst_multipart_mux_change_state): - Small updates, fix a memleak - -2004-06-07 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * configure.ac: OSS portability - * ext/arts/gst_arts.c: idem - * sys/oss/gstosselement.c: idem - * sys/oss/gstossmixer.c: idem - * sys/oss/gstosssink.c: idem - * sys/oss/gstosssrc.c: idem - * sys/oss/oss_probe.c: idem - - check for soundcard.h in different places for some BSD - -2004-06-07 Jan Schmidt <thaytan@mad.scientist.com> - - * AUTHORS: - Add me to the authors file - * configure.ac: - Increase the libdv requirement to >= version 0.100 - * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), - (gst_dvdec_src_query), (gst_dvdec_handle_sink_event), - (gst_dvdec_push), (gst_dvdec_loop), (gst_dvdec_change_state): - * ext/dv/gstdvdec.h: - Add support for the new_media flag when sending DISCONT events - Make the querying work when video pad is not linked - -2004-06-07 Tim-Philipp Müller <t.i.m@zen.co.uk> - - reviewed by Benjamin Otte <otte@gnome.org> - - * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_init): - create a NULL-initialized array of pads, so we don't think they - exist already. (fixes #143130) - -2004-06-07 Benjamin Otte <otte@gnome.org> - - * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_init), - (mixmatrix_resize), (gst_mixmatrix_set_all_caps), - (gst_mixmatrix_request_new_pad), (gst_mixmatrix_loop): - don't use // coments - -2004-06-07 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsa.c: (gst_alsa_samples_to_timestamp): - cast to GstClockTime to get higher granularity - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): - use gst_element_set_time_delay to get the exact time - * ext/mad/gstmad.c: (gst_mad_chain): - use the negotiated rate instead of the current frame's rate which - might be wrong because of bit errors. This avoids emitting totally - bogus timestamps and screwing sync. - (fixes #143454) - -2004-06-07 Tim-Philipp Müller <t.i.m@zen.co.uk> - - reviewed by Benjamin Otte <otte@gnome.org> - - * gst/adder/gstadder.c: (gst_adder_loop): - properly error out when no negotiation has happened yet. (fixes - #143032) - -2004-06-06 Benjamin Otte <otte@gnome.org> - - * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): - forward correctly transformed offset in discont events. Based on - patch by Arwed v. Merkatz. (fixes #142851) - -2004-06-06 David Schleef <ds@schleef.org> - - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: that's - G_HAVE_GNUC_VARARGS, not G_HAVE_GNU_VARARGS. Should fix compile - problems on several systems. - -2004-06-06 Benjamin Otte <otte@gnome.org> - - * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_init): - use explicit caps on the srcpad - * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): - properly error out if caps couldn't be set (fixes #142764) - -2004-06-06 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsa.c: (gst_alsa_probe_hw_params), - (gst_alsa_set_hw_params), (gst_alsa_set_sw_params), - (gst_alsa_start_audio): - - don't call set_periods_integer anymore, it breaks the - configuration randomly - - call snd_pcm_hw_params_set_access directly instead of using masks - - don't fail if the sw_params can't be set, just use the default - params and hope it works. Alsalib has weird issues when you touch - sw_params and does no proper error reporting about what failed. - * ext/alsa/gstalsa.c: (gst_alsa_open_audio), - (gst_alsa_close_audio): - make our alsa debugging go via gst debugging and not conditionally - defined - * ext/alsa/gstalsa.h: - add ALSA_DEBUG_FLUSH macro - * ext/alsa/gstalsaplugin.c: (gst_alsa_error_wrapper), - (plugin_init): - wrap alsa errors to be printed via the gst debugging system and not - spammed to stderr - -2004-06-04 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), - (gst_qtdemux_handle_src_query), (gst_qtdemux_handle_src_event), - (gst_qtdemux_handle_sink_event), (gst_qtdemux_change_state), - (gst_qtdemux_loop_header), (qtdemux_dump_mvhd), - (qtdemux_parse_trak): - * gst/qtdemux/qtdemux.h: - Bitch. Also known as seeking, querying & co. - * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), - (gst_osssink_change_state): - * sys/oss/gstosssink.h: - Resyncing is for weenies, this hack is no longer needed and was - broken anyway (since it - unintendedly - always leaves resync to - TRUE). - -2004-06-05 Andrew Turner <zxombie@hotpop.com> - - * gst/tcp/gsttcp.c: portability (Solaris 10/FreeBSD) - * gst/tcp/gsttcpclientsrc.h: idem - - define MSG_NOSIGNAL if not done - - include unistd.h for off_t - (fixes #143749) - -2004-06-05 Benjamin Otte <otte@gnome.org> - - * configure.ac: - * ext/kio/Makefile.am: - check for qt's moc preprocessor explicitly and use it - -2004-06-03 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * gst/tcp/gsttcp.c: (gst_tcp_socket_write): - don't get a signal for EPIPE on socket writes - (somebody check if this works on other platforms) - -2004-06-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/alsa/gstalsaclock.c: (gst_alsa_clock_get_type): - * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): - check error condition on available samples correctly - -2004-06-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/alsa/gstalsasrc.c: (gst_alsa_src_get_time): - avoid a segfault - * gst/tcp/gsttcp.c: (gst_tcp_socket_write), (gst_tcp_socket_read), - (gst_tcp_gdp_read_header), (gst_tcp_gdp_read_caps): - * gst/tcp/gsttcpserversrc.c: (gst_tcpserversrc_gdp_read_caps), - (gst_tcpserversrc_gdp_read_header): - use ssize_t over size_t since the former is signed and thus the - check for error codes can work - -2004-06-02 Wim Taymans <wim@fluendo.com> - - reviewed by: Johan - - * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), - (gst_multipart_mux_loop): - Oops - -2004-06-02 Wim Taymans <wim@fluendo.com> - - * gst/multipart/multipartmux.c: (gst_multipart_mux_class_init), - (gst_multipart_mux_init), (gst_multipart_mux_loop), - (gst_multipart_mux_get_property), (gst_multipart_mux_set_property), - (gst_multipart_mux_change_state): - Added configurable boundary specifier, added the value as a - caps field as well. - -2004-06-02 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * gst/tcp/gsttcp.c: - * gst/tcp/gsttcpclientsrc.c: - * gst/tcp/gsttcpclientsrc.h: - * gst/tcp/gsttcpserversrc.c: - - portability fix, to compile on OSX - (fixes #143146) - - * sys/osxaudio/gstosxaudioelement.c: - * sys/osxaudio/gstosxaudiosink.c: - * sys/osxaudio/gstosxaudiosrc.c: - - compilation warnings on OSX - (fixes #143153) - -2004-06-02 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * ext/vorbis/vorbisdec.c : sign warning fixes - - * gst-libs/gst/mixer/mixertrack.c : - do no use defines which are glib 2.4 specific - -2004-06-01 Christophe Fergeau <teuf@gnome.org> - - * ext/flac/gstflactag.c: strip ending framing bit from vorbiscomment - buffer since libflac doesn't expect it (reports a sync error when - it encounters that) - - -2004-06-01 Owen Fraser-Green <owen@discobabe.net> - - * gst-libs/gst/mixer/mixertrack.h: Changed struct syntax - * gst-libs/gst/mixer/mixertrack.c: - (gst_mixer_track_get_property), (get_mixer_track_init), - (get_mixer_track_get_property): Added property accessors - * gst-libs/gst/mixer/mixeroptions.h: Changed struct syntax - * gst-libs/gst/mixer/mixeroptions.c: - (gst_mixer_options_get_values): Added - * gst-libs/gst/mixer/mixer.h: Changed GstMixerClass syntax - * gst-libs/gst/mixer/mixer.c: Fixed comment - - -2004-06-01 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * ext/alsa/gstalsa.c: (gst_alsa_open_audio): - improve error messages on open - - -2004-06-01 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): - check if v4l-conf is in path - -2004-06-01 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/media-info/media-info-priv.c: (gmi_set_mime): - change assert to a more readable error message - -2004-05-31 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst-libs/gst/tuner/tunerchannel.h: - - add a freq_multiplicator field to make the conversion - between internal frequency unit and Hz - * sys/v4l/gstv4lelement.c: - * sys/v4l2/gstv4l2element.c: - - change default video device to /dev/video0 - * sys/v4l/v4l_calls.c: - * sys/v4l2/v4l2_calls.c: - - we only expose frequency to the user in Hz instead of - bastard v4lX unit (either 62.5kHz or 62.5Hz) - -2004-05-31 Jan Schmidt <thaytan@mad.scientist.com> - * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): - Initialise b_o_s and e_o_s variables - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data): - Add some unusual fourcc's from mplayer avi's - * gst/multipart/multipartmux.c: (gst_multipart_mux_plugin_init): - Make the muxer have rank GST_RANK_NONE, so it doesn't mess up - autoplugging. - -2004-05-28 Wim Taymans <wim@fluendo.com> - - * configure.ac: - * gst/alpha/Makefile.am: - * gst/alpha/gstalpha.c: (gst_alpha_method_get_type), - (gst_alpha_get_type), (gst_alpha_base_init), - (gst_alpha_class_init), (gst_alpha_init), (gst_alpha_set_property), - (gst_alpha_get_property), (gst_alpha_sink_link), (gst_alpha_add), - (gst_alpha_chroma_key), (gst_alpha_chain), - (gst_alpha_change_state), (plugin_init): - A plugin to add an alpha channel to I420 video. Can optionally do - chroma keying. - * gst/multipart/Makefile.am: - * gst/multipart/multipart.c: (plugin_init): - * gst/multipart/multipartdemux.c: (gst_multipart_demux_base_init), - (gst_multipart_demux_class_init), (gst_multipart_demux_init), - (gst_multipart_demux_finalize), (gst_multipart_demux_handle_event), - (gst_multipart_find_pad_by_mime), (gst_multipart_demux_chain), - (gst_multipart_demux_change_state), - (gst_multipart_demux_plugin_init): - * gst/multipart/multipartmux.c: (gst_multipart_mux_get_type), - (gst_multipart_mux_base_init), (gst_multipart_mux_class_init), - (gst_multipart_mux_get_sink_event_masks), (gst_multipart_mux_init), - (gst_multipart_mux_sinkconnect), (gst_multipart_mux_pad_link), - (gst_multipart_mux_pad_unlink), - (gst_multipart_mux_request_new_pad), - (gst_multipart_mux_handle_src_event), - (gst_multipart_mux_next_buffer), (gst_multipart_mux_compare_pads), - (gst_multipart_mux_queue_pads), (gst_multipart_mux_loop), - (gst_multipart_mux_get_property), (gst_multipart_mux_set_property), - (gst_multipart_mux_change_state), (gst_multipart_mux_plugin_init): - A Multipart demuxer/muxer. Not sure if it violates specs. Used to - send multipart jpeg images to a browser. - * gst/videobox/Makefile.am: - * gst/videobox/README: - * gst/videobox/gstvideobox.c: (gst_video_box_fill_get_type), - (gst_video_box_get_type), (gst_video_box_base_init), - (gst_video_box_class_init), (gst_video_box_init), - (gst_video_box_set_property), (gst_video_box_get_property), - (gst_video_box_sink_link), (gst_video_box_i420), - (gst_video_box_ayuv), (gst_video_box_chain), - (gst_video_box_change_state), (plugin_init): - Crops or adds borders around an image. can do alpha channel - borders as well. - * gst/videomixer/Makefile.am: - * gst/videomixer/README: - * gst/videomixer/videomixer.c: (gst_videomixer_pad_get_type), - (gst_videomixer_pad_base_init), (gst_videomixer_pad_class_init), - (gst_videomixer_pad_get_sink_event_masks), - (gst_videomixer_pad_get_property), - (gst_videomixer_pad_set_property), - (gst_videomixer_pad_sinkconnect), (gst_videomixer_pad_link), - (gst_videomixer_pad_unlink), (gst_videomixer_pad_init), - (gst_video_mixer_background_get_type), (gst_videomixer_get_type), - (gst_videomixer_base_init), (gst_videomixer_class_init), - (gst_videomixer_init), (gst_videomixer_request_new_pad), - (gst_videomixer_handle_src_event), - (gst_videomixer_blend_ayuv_i420), (gst_videomixer_fill_checker), - (gst_videomixer_fill_color), (gst_videomixer_fill_queues), - (gst_videomixer_blend_buffers), (gst_videomixer_update_queues), - (gst_videomixer_loop), (gst_videomixer_get_property), - (gst_videomixer_set_property), (gst_videomixer_change_state), - (plugin_init): - Generic video mixer plugin, can handle multiple inputs all with - different framerates and video sizes. Is fully alpha channel - aware. - -2004-05-27 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): - Select first track as master track. Not sure how else to handle - that... - * ext/ogg/gstoggmux.c: (gst_ogg_mux_next_buffer): - Discard discont events. Should fix #142962. - -2004-05-26 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/Makefile.am: - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_interface_init), - (gst_alsa_mixer_build_list), (gst_alsa_mixer_get_volume), - (gst_alsa_mixer_set_volume), (gst_alsa_mixer_set_mute), - (gst_alsa_mixer_set_record), (gst_alsa_mixer_set_option), - (gst_alsa_mixer_get_option): - * ext/alsa/gstalsamixer.h: - * ext/alsa/gstalsamixeroptions.c: - (gst_alsa_mixer_options_get_type), - (gst_alsa_mixer_options_class_init), (gst_alsa_mixer_options_init), - (gst_alsa_mixer_options_new): - * ext/alsa/gstalsamixeroptions.h: - * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_new): - * ext/alsa/gstalsamixertrack.h: - Add enumerations (as GstMixerOptions). Make correct distinction - between input/output tracks. Add capture/playback private flag. - Use flag to decide on whether to set capture or playback volumes - or switches. Use playback and record switches. - * gst-libs/gst/mixer/Makefile.am: - * gst-libs/gst/mixer/mixer-marshal.list: - * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init), - (gst_mixer_set_option), (gst_mixer_get_option), - (gst_mixer_mute_toggled), (gst_mixer_record_toggled), - (gst_mixer_volume_changed), (gst_mixer_option_changed): - * gst-libs/gst/mixer/mixer.h: - * gst-libs/gst/mixer/mixeroptions.c: (gst_mixer_options_get_type), - (gst_mixer_options_class_init), (gst_mixer_options_init), - (gst_mixer_options_dispose): - * gst-libs/gst/mixer/mixeroptions.h: - Add GstMixerOptions. - * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): - Rename Audio Mixer to OSS Mixer (similar to Alsa Mixer). Fix - broken device detection on computers with multiple OSS sound - cards. - -2004-05-26 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): - fixate nicely even when the peer is not negotiating - -2004-05-25 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/audioconvert/gstaudioconvert.c: - (gst_audio_convert_parse_caps): - make sure we don't allow depth > width - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_fixate): - fixate endianness to G_BYTE_ORDER as default - * gst/audioscale/gstaudioscale.c: - we don't handle another endianness as host-endianness - -2004-05-25 David Schleef <ds@schleef.org> - - * gst/ffmpegcolorspace/mem.c: malloc() is in stdlib.h, not malloc.h - -2004-05-24 Benjamin Otte <otte@gnome.org> - - * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_sinkconnect), - (gst_oggvorbisenc_setup): - properly fail when we can't setup the vorbis encoder due to - unsupported settings - * ext/vorbis/vorbisenc.c: (gst_vorbisenc_sinkconnect), - (gst_vorbisenc_setup): - same - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): - fix case where warnings occured when one pad was unlinked while the - other's link function was called - -2004-05-24 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/tcp/Makefile.am: - use GST_ENABLE_NEW - -2004-05-24 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst-libs/gst/resample/private.h: - don't use optimizations that are #if 0'ed - -2004-05-24 Wim Taymans <wim@fluendo.com> - - * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query): - Fix potential division by zero error and hopefully get - the position query right to get correct timestamps on avi - audio. - -2004-05-24 Wim Taymans <wim@fluendo.com> - - * gst/videoscale/videoscale.c: (gst_videoscale_scale_nearest), - (gst_videoscale_scale_nearest_str2), - (gst_videoscale_scale_nearest_str4), - (gst_videoscale_scale_nearest_32bit), - (gst_videoscale_scale_nearest_24bit), - (gst_videoscale_scale_nearest_16bit): - Fix the scaling algorithm and avoid a buffer overflow. - removed the while loop in the scaling function as it - was used for point sampling only. - -2004-05-24 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/mad/gstid3tag.c: (gst_id3_tag_get_type), - (gst_id3_tag_class_init), (gst_id3_tag_init), - (gst_id3_tag_set_property), (gst_id3_tag_get_tag_to_render), - (gst_id3_tag_handle_event), (gst_id3_tag_do_caps_nego), - (gst_id3_tag_send_tag_event): - lots of fixes to make id3mux work and id3demux work correctly - -2004-05-24 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * ext/Makefile.am: - add rules to build shout2send (was removed by accident - when this module was no more marked experimental/broken) - -2004-05-24 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - * ext/shout2/gstshout2.c: - * ext/shout2/gstshout2.h: - adding a "connection problem" signal to shout2send - (fixes #142954) - -2004-05-21 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/kio/kioreceiver.cpp: - * ext/kio/kioreceiver.h: - fix sign comparison issues - -2004-05-21 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/cdxaparse/gstcdxaparse.c: - * gst/cdxaparse/gstcdxaparse.h: - some renaming - add some checks/sanity - prepare for seek addition - - * sys/sunaudio/gstsunaudio.c: - remove exported dupe init function - -2004-05-21 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_get_formats), - (gst_dvdec_src_convert), (gst_dvdec_sink_convert): - Fix format conversion and position querying. - * gst/debug/progressreport.c: (gst_progressreport_report): - Don't output a bogus total value that we didn't query. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): - Always set XV_AUTOPAINT_COLORKEY to true. Fixes xvimagesink showing - only a blank window after xine has been used. - -2004-05-21 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * m4/as-arts.m4: - sync with upstream version to fix test on FC2 - readd with -ko to preserve Id header - -2004-05-20 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * configure.ac: - test for FIONREAD ioctl in sys/filio.h for Solaris compat. - * gst/tcp/gsttcpclientsrc.c: idem - * gst/tcp/gsttcpserversink.c: idem - * gst/tcp/gsttcpserversrc.c: idem - * m4/gst-fionread.m4: idem - - * sys/sunaudio/gstsunaudio.c: change category to Sink/Audio - - * configure.ac: enable speex plugin for speex 1.1.5+ - * ext/speex/gstspeexenc.c: fix cast warning - - * ext/esd/README: fix typo - -2004-05-20 David Schleef <ds@schleef.org> - - * configure.ac: Minor cosmetic change to convince the buildbot to - reautogen. - * sys/sunaudio/gstsunaudio.c: (gst_sunaudiosink_class_init), - (gst_sunaudiosink_init), (gst_sunaudiosink_getcaps), - (gst_sunaudiosink_pad_link), (gst_sunaudiosink_chain), - (gst_sunaudiosink_setparams), (gst_sunaudiosink_open), - (gst_sunaudiosink_close), (gst_sunaudiosink_change_state), - (gst_sunaudiosink_set_property), (gst_sunaudiosink_get_property): - More hacking. Plays audio now. - -2004-05-20 David Schleef <ds@schleef.org> - - * configure.ac: - * sys/Makefile.am: - -2004-05-20 David Schleef <ds@schleef.org> - - * sys/osxaudio/Makefile.am: New OS X audio plugin by Zaheer Abbas Merali - * sys/osxaudio/gstosxaudio.c: - * sys/osxaudio/gstosxaudioelement.c: - * sys/osxaudio/gstosxaudioelement.h: - * sys/osxaudio/gstosxaudiosink.c: - * sys/osxaudio/gstosxaudiosink.h: - * sys/osxaudio/gstosxaudiosrc.c: - * sys/osxaudio/gstosxaudiosrc.h: - -2004-05-20 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/vorbis/vorbisenc.c: (gst_vorbisenc_set_header_on_caps), - (gst_vorbisenc_chain): - put the codec headers on the caps as streamheader as well as - pushing them out - -2004-05-20 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/vorbis/vorbisenc.c: (vorbis_granule_time_copy), - (gst_vorbisenc_buffer_from_packet), (gst_vorbisenc_push_buffer), - (gst_vorbisenc_push_packet), (gst_vorbisenc_chain): - split up push_packet into two functions - -2004-05-20 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/tcp/.cvsignore: - ignore enums - * gst/tcp/Makefile.am: - * gst/tcp/README: - * gst/tcp/gsttcp.c: - * gst/tcp/gsttcp.h: - * gst/tcp/gsttcpclientsink.c: - * gst/tcp/gsttcpclientsink.h: - * gst/tcp/gsttcpclientsrc.c: - * gst/tcp/gsttcpclientsrc.h: - * gst/tcp/gsttcpplugin.c: - * gst/tcp/gsttcpserversink.c: - * gst/tcp/gsttcpserversink.h: - * gst/tcp/gsttcpserversrc.c: - * gst/tcp/gsttcpserversrc.h: - add new tcp elements - -2004-05-19 Wim Taymans <wim@fluendo.com> - - * gst/law/mulaw-conversion.c: (mulaw_encode): - Fix overflow bug in ulaw encoding. - -2004-05-19 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/mad/gstmad.c: (gst_mad_handle_event): - don't unref the event twice - -2004-05-19 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * configure.ac: - remove -Wno-sign-compare - -2004-05-19 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * configure.ac: - remove -DG_DISABLE_DEPRECATED. It's not usable without workarounds - if you want to work against glib 2.2 and 2.4 - -2004-05-19 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/tcp/Makefile.am: - * gst/tcp/gsttcp.c: - * gst/tcp/gsttcp.h: - * gst/tcp/gsttcpsink.h: - * gst/tcp/gsttcpsrc.h: - gsttcp -> gsttcpplugin + CVS surgery in preparation for tcp merge - -2004-05-19 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/debug/tests.c: (md5_get_value): - fix segfault on gst-inspect - -2004-05-19 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/debug/testplugin.c: - * gst/debug/tests.c: - * gst/debug/tests.h: - add new extensible and configurable testing element. Current tests - include buffer count, stream length, timestamp/duration matching and - md5. - * gst/debug/Makefile.am: - * gst/debug/gstdebug.c: (plugin_init): - add infrastructure for new element - -2004-05-19 Johan Dahlin <johan@gnome.org> - - * ext/dv/gstdvdec.c (gst_dvdec_quality_get_type): Add proper - ending of the array. Fixes gst-inspect segfault on ppc. - -2004-05-19 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * ext/dirac/gstdiracdec.cc : change category to Codec/Decoder/Video - - * m4/a52.m4 : don't fix a test that should fail with current a52dec lib - -2004-05-18 David Schleef <ds@schleef.org> - - * gst/ffmpegcolorspace/imgconvert.c: (img_convert): Fixes for - warnings (bugs, actually) noticed by gcc but not forte. - -2004-05-18 David Schleef <ds@schleef.org> - - * sys/sunaudio/Makefile.am: - * sys/sunaudio/gstsunaudio.c: New sunaudiosink - -2004-05-18 David Schleef <ds@schleef.org> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), - (gst_qtdemux_loop_header): Patch from dcm@acm.org (David Moore) - to allow qtdemux to use non-seekable streams. (bug #142272) - -2004-05-18 David Schleef <ds@schleef.org> - - * gst-libs/gst/resample/resample.c: (gst_resample_sinc_ft_s16), - (gst_resample_sinc_ft_float): Remove use of static temporary - buffer. This code was obviously not supposed to last long, but - it's stuck in our ABI, so it required a little hack to make it - ABI-compatible. Fixes #142585. - * gst-libs/gst/resample/resample.h: same. - -2004-05-18 David Schleef <ds@schleef.org> - - * configure.ac: Add sunaudio - * examples/Makefile.am: make gstplay depend on gconf - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: Remove c99-isms - * gst/ffmpegcolorspace/imgconvert.c: (build_rgb_palette), - (convert_table_lookup), (img_convert): remove c99-isms - * gst/ffmpegcolorspace/imgconvert_template.h: make a constant - unsigned, to fix a warning on Solaris - * gst/mpeg1sys/systems.c: bcopy->memcpy - * gst/rtjpeg/RTjpeg.c: (RTjpeg_yuvrgb8): bcopy->memcpy - * sys/Makefile.am: Add sunaudio - -2004-05-18 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstoggmux.c: (gst_ogg_mux_get_type), (gst_ogg_mux_init), - (gst_ogg_mux_sinkconnect), (gst_ogg_mux_request_new_pad), - (gst_ogg_mux_next_buffer), (gst_ogg_mux_push_page), - (gst_ogg_mux_compare_pads), (gst_ogg_mux_queue_pads), - (gst_ogg_mux_loop): - Fix an ugly memleak where the muxer didn't flush enough ogg - pages. This also resulted in badly muxed ogg files. - -2004-05-18 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/asfdemux/asfheaders.c : - * gst/asfdemux/asfheaders.h : - * gst/asfdemux/gstasfdemux.c : - - fix ASF_OBJ_PADDING guid - - add 3 new object guids (language list, metadata, - extended stream properties) - - add a function to parse extended header objects - -2004-05-18 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * sys/oss/gstosselement.c: (gst_osselement_sync_parms): - remove leftover debugging g_print - -2004-05-17 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/mad/gstmad.c: (gst_mad_handle_event): - Fix for when the first format in a discont event is not a - byte-based one. Should fix #137710. - -2004-05-18 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * m4/a52.m4 : fix compilation with -Wall -Werror - * m4/libfame.m4 : idem - * m4/libmikmod.m4 : idem - -2004-05-17 Benjamin Otte <otte@gnome.org> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): - signal the new tags before giving up the reference - -2004-05-17 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/shout2/gstshout2.c: - use application/ogg instead of application/x-ogg (patch by Patrick - Guimond, fixes #142432) - * sys/oss/gstosselement.c: (gst_osselement_reset), - (gst_osselement_sync_parms): - don't set fragment size unless specified (fixes #142493) - -2004-05-17 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * configure.ac : fix compilation of v4l2src with "-Wall -Werror" - fixes #142664 - -2004-05-17 Benjamin Otte <otte@gnome.org> - - * ext/mad/gstid3tag.c: (gst_id3_tag_chain): - compute offsets correctly for internal buffers so timestamps are set - correctly when we can't seek. Also handle cases where there are no - offsets. (based on a patch by David Moore, fixes #142507) - -2004-05-17 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): - use correct variable when determining amount of data to skip so we - don't skip into the void and segfault - -2004-05-16 Benjamin Otte <otte@gnome.org> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_audio_caps): - Hi, I'm a memleak - -2004-05-16 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/asfdemux/gstasfdemux.c: - - fix a mem leak and always propagate tags - - add WMV3 to known video codecs (but no decoder yet) - - replace "surplus data" at end of audio header for what - it is : codec specific data - - fix a typo - -2004-05-16 Arwed v. Merkatz <v.merkatz@gmx.net> - - reviewed by: Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/audio/audioclock.c: - Fix wrong return type (#142205). - -2004-05-16 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/mad/gstmad.c: (gst_mad_class_init), (gst_mad_init): - Ignore CRCs by default (fixes #142566). - -2004-05-16 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_open), - (gst_alsa_mixer_close), (gst_alsa_mixer_supported), - (gst_alsa_mixer_build_list), (gst_alsa_mixer_free_list), - (gst_alsa_mixer_change_state), (gst_alsa_mixer_list_tracks), - (gst_alsa_mixer_get_volume), (gst_alsa_mixer_set_volume), - (gst_alsa_mixer_set_mute), (gst_alsa_mixer_set_record): - Fix for cases where we fail to attach to a mixer. - -2004-05-16 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): - Don't touch events after not owning them anymore. - * gst/wavparse/gstwavparse.c: (gst_wavparse_base_init), - (gst_wavparse_fmt), (gst_wavparse_other), - (gst_wavparse_handle_seek), (gst_wavparse_loop), - (gst_wavparse_pad_convert), (gst_wavparse_pad_query), - (gst_wavparse_srcpad_event): - * gst/wavparse/gstwavparse.h: - Add seeking, fix querying. - -2004-05-16 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): - - process comments even if they don't end with \0\0 - g_convert would ignore them if present and works well without them - -2004-05-16 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsa.c: (gst_alsa_caps), (gst_alsa_get_caps): - simplify caps - -2004-05-16 Benjamin Otte <otte@gnome.org> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): - don't write to memory we might not write to - g_convert does that - for us anyway (fixes #142613) - (gst_asf_demux_audio_caps): - comment out gst_util_dump_mem - -2004-05-16 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): - compute correct expected timestamps after seek (broken since - last commit) - * ext/gdk_pixbuf/pixbufscale.c: (pixbufscale_init): - rename element and debugging category to gdkpixbufscale - -2004-05-16 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): - add error checking to snd_pcm_delay and remove duplicate call to - snd_pcm_delay that caused issues (see inline code comments) - * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_time): - make more readable and fix return value when snd_pcm_delay fails - (fixes #142586) - -2004-05-15 Jan Schmidt <thaytan@mad.scientisti.com> - * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_method_get_type), - (gst_pixbufscale_get_type), (gst_pixbufscale_base_init), - (gst_pixbufscale_class_init), (gst_pixbufscale_getcaps), - (gst_pixbufscale_link), (gst_pixbufscale_init), - (gst_pixbufscale_handle_src_event), (pixbufscale_scale), - (gst_pixbufscale_chain), (gst_pixbufscale_set_property), - (gst_pixbufscale_get_property), (pixbufscale_init): - * ext/gdk_pixbuf/pixbufscale.h: - Add these files I forgot earlier - -2004-05-15 Jan Schmidt <thaytan@mad.scientist.com> - * ext/gdk_pixbuf/Makefile.am: - * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): - * ext/gdk_pixbuf/gstgdkpixbuf.h: - Add new pixbufscale element to scale RGB video - using gdk_pixbuf, because gdk_pixbuf does BILINEAR - and HYPER interpolation correctly. - * ext/theora/theoraenc.c: (theora_enc_chain), - Discard buffer and return if explicit caps could not be set - (theora_enc_get_property): - Make _get return kbps for the bitrate consistent with - the _set function. - - -2004-05-14 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/libvisual/visual.c: (gst_visual_chain): - add missing visual_audio_analyze - -2004-05-14 David Schleef <ds@schleef.org> - - * ext/esd/esdsink.c: (gst_esdsink_chain): Fix crash when ESD - is killed while we're playing. - * gst/qtdemux/qtdemux.c: (qtdemux_parse): call - gst_element_no_more_pads(). - -2004-05-14 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst-libs/gst/riff/riff-read.c : - - fix INFO tag extraction in RIFF/AVI files - because gst_event_unref (event) also freed taglist - - avoid a mem leak - -2004-05-13 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * ext/mad/gstid3tag.c : move from "Codec/(Dem/M)uxer" to "Codec/(Dem/M)uxer/Audio" - * gst/wavenc/gstwavenc.c : move from "Codec/Encoder/Audio" to "Codec/Muxer/Audio" - - * gst/auparse/gstauparse.c : - - add code (commented for now) to support audio/x-adpcm on src pad - (we have no decoder for those layout yet) - - * gst/cdxaparse/gstcdxaparse.c : - * gst/cdxaparse/gstcdxaparse.h : - - partial rewrite using RiffRead (ripped iain's wavparse code) - - * gst/rtp/gstrtpL16enc.c : typo - * gst/rtp/gstrtpgsmenc.c : typo - -2004-05-13 Benjamin Otte <otte@gnome.org> - - * configure.ac: - check for exact version of libvisual, it's not supposed to be - API/ABI stable yet - -2004-05-13 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_push): - signal no-more-pads - -2004-05-13 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/dv/gstdvdec.c: (gst_dvdec_src_convert) - Report which format was used for GST_FORMAT_DEFAULT - * gst/debug/Makefile.am: - * gst/debug/gstdebug.c: (plugin_init): - * gst/debug/progressreport.c: (gst_progressreport_base_init), - (gst_progressreport_class_init), (gst_progressreport_init), - (gst_progressreport_report), (gst_progressreport_set_property), - (gst_progressreport_get_property), (gst_progressreport_chain), - (gst_progressreport_plugin_init): - Add progressreport element for testing. - -2004-05-13 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get), (gst_v4lsrc_change_state): - * sys/v4l/gstv4lsrc.h: - * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_playback_init): - * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_capture_init): - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_init), - (gst_v4lsrc_grab_frame): - add more debugging - send a discont at start - -2004-05-12 Colin Walters <walters@redhat.com> - - * gst/asfdemux/gstasfdemux.c (gst_asf_demux_process_segment): Avoid - inflooping if we can't find a chunk. Or in other words, don't blow - chunks if we don't have a chunk to blow. - -2004-05-13 Jan Schmidt <thaytan@mad.scientist.com> - * ext/audiofile/gstafsrc.c: (gst_afsrc_get): - Remove old debug output - * ext/dv/gstdvdec.c: (gst_dvdec_quality_get_type), - (gst_dvdec_class_init), (gst_dvdec_loop), (gst_dvdec_change_state), - (gst_dvdec_set_property), (gst_dvdec_get_property): - Change the quality setting to an enum, so it works from gst-launch - Don't renegotiate a non-linked pad. Allows audio only decoding. - * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_getcaps), - (gst_deinterlace_link), (gst_deinterlace_init): - * gst/videodrop/gstvideodrop.c: (gst_videodrop_getcaps), - (gst_videodrop_link): - Some caps negotiation fixes - -2004-05-12 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * ext/tarkin/gsttarkin.c : - - Change RANK from NONE to PRIMARY - * ext/gdk_pixbuf/gstgdkpixbuf.c : - - Change RANK from NONE to MARGINAL - * ext/divx/gstdivxenc.c : - - Change RANK from PRIMARY to NONE (encoder/spider issue) - -2004-05-12 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/vorbis/vorbisenc.c: (vorbis_granule_time_copy), - (gst_vorbisenc_push_packet): - copy a function that was added between 1.0 and 1.0.1 until we - depend on worthwhile features of post-1.0 - -2004-05-12 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * configure.ac: - enable shout2 by default - * ext/shout2/gstshout2.c: (gst_shout2send_protocol_get_type), - (gst_shout2send_base_init), (gst_shout2send_init), - (gst_shout2send_connect), (gst_shout2send_change_state): - * ext/shout2/gstshout2.h: - make this work again. Based on a patch by Zaheer Abbas Merali (fixes - #142262) - * ext/theora/theora.c: (plugin_init): - don't set rank on encoders - -2004-05-11 Jeremy Simon <jesimon@libertysurf.fr> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_audio_caps): - Use codec_data property instead of flag1 and flag2 for wma - -2004-05-11 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/cdxaparse/gstcdxaparse.c : - - Add mpegversion to CAPS to make it link - - Rank is as GST_RANK_SECONDARY instead of NONE - * gst/auparse/gstauparse.c : - - Document all audio encoding we can encounter from Solaris 9 - headers and libsndfile information. - - Increase max. rate from 48000 to 192000 (to match other elements) - - Don't try to play junk data between header and samples - -2004-05-11 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/libvisual/visual.c: (gst_visual_getcaps): - use the right caps depending on endianness (I hope) - * ext/ogg/gstoggmux.c: (gst_ogg_mux_plugin_init): - use GST_RANK_NONE for all non-decoding elements or spider gets - mighty confused - -2004-05-11 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_comment): - Fix some odd cases and fix BE metadata parsing of unicode16 text. - -2004-05-11 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/switch/gstswitch.c: (gst_switch_release_pad), - (gst_switch_request_new_pad), (gst_switch_poll_sinkpads), - (gst_switch_loop), (gst_switch_get_type): - whoever that was: DO NOT IMPORT PRIVATE SYMBOLS THAT ARE NOT IN - HEADERS. Had to be said. - -2004-05-10 David Schleef <ds@schleef.org> - - * configure.ac: Add prototype Dirac support. - * ext/Makefile.am: - * ext/dirac/Makefile.am: - * ext/dirac/gstdirac.cc: - * ext/dirac/gstdiracdec.cc: - -2004-05-10 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/auparse/gstauparse.c: (gst_auparse_class_init), - (gst_auparse_init), (gst_auparse_chain), - (gst_auparse_change_state): - Hack around spider. Remove me some day please. - -2004-05-10 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/auparse/gstauparse.c: (gst_auparse_chain): - Fix for some uninitialized variables in previous patch, also - makes it work. Fixes #142286 while we're at it. - -2004-05-11 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/auparse/gstauparse.c: - fixes a-law, adds mu-law, linear pcm (8,16,24,32), ieee (32, 64) - only unsupported formats are ADPCM/CCITT G.72x - reviewed by Ronald - * gst-libs/gst/audio/audio.h: adds 24bit depth to PCM (x-raw-int) - -2004-05-10 Wim Taymans <wim@fluendo.com> - - * ext/vorbis/Makefile.am: - * ext/vorbis/README: - * ext/vorbis/oggvorbisenc.c: (gst_oggvorbisenc_get_formats), - (oggvorbisenc_get_type), (vorbis_caps_factory), (raw_caps_factory), - (gst_oggvorbisenc_base_init), (gst_oggvorbisenc_class_init), - (gst_oggvorbisenc_sinkconnect), (gst_oggvorbisenc_convert_src), - (gst_oggvorbisenc_convert_sink), - (gst_oggvorbisenc_get_query_types), (gst_oggvorbisenc_src_query), - (gst_oggvorbisenc_init), (gst_oggvorbisenc_get_tag_value), - (gst_oggvorbisenc_metadata_set1), (gst_oggvorbisenc_set_metadata), - (get_constraints_string), (update_start_message), - (gst_oggvorbisenc_setup), (gst_oggvorbisenc_write_page), - (gst_oggvorbisenc_chain), (gst_oggvorbisenc_get_property), - (gst_oggvorbisenc_set_property), (gst_oggvorbisenc_change_state): - * ext/vorbis/oggvorbisenc.h: - * ext/vorbis/vorbis.c: (plugin_init): - * ext/vorbis/vorbisenc.c: (vorbis_caps_factory), - (raw_caps_factory), (gst_vorbisenc_class_init), - (gst_vorbisenc_init), (gst_vorbisenc_setup), - (gst_vorbisenc_push_packet), (gst_vorbisenc_chain), - (gst_vorbisenc_get_property), (gst_vorbisenc_set_property): - * ext/vorbis/vorbisenc.h: - Added a raw vorbis encoder to be used with the oggmuxer. - We still need the old encoder for some gnome applications, - read the README to find out how that works. - The raw encoder is called "rawvorbisenc" until 0.9. - -2004-05-10 Wim Taymans <wim@fluendo.com> - - * ext/ogg/gstogg.c: (plugin_init): - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_plugin_init), - (gst_ogg_print): - * ext/ogg/gstoggmux.c: (gst_ogg_mux_get_type), - (gst_ogg_mux_base_init), (gst_ogg_mux_class_init), - (gst_ogg_mux_get_sink_event_masks), (gst_ogg_mux_init), - (gst_ogg_mux_sinkconnect), (gst_ogg_mux_pad_link), - (gst_ogg_mux_pad_unlink), (gst_ogg_mux_request_new_pad), - (gst_ogg_mux_handle_src_event), (gst_ogg_mux_next_buffer), - (gst_ogg_mux_push_page), (gst_ogg_mux_compare_pads), - (gst_ogg_mux_queue_pads), (gst_ogg_mux_loop), - (gst_ogg_mux_get_property), (gst_ogg_mux_set_property), - (gst_ogg_mux_change_state), (gst_ogg_mux_plugin_init): - Added an ogg muxer. - Small typo fixes in the demuxer. - -2004-05-10 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoraenc.c: (gst_theora_enc_class_init), - (theora_enc_sink_link), (theora_push_packet), (theora_enc_chain), - (theora_enc_change_state), (theora_enc_set_property), - (theora_enc_get_property): - Mark the last packet with an EOS flag which is not really needed - in gstreamer. - Do some better video framerate initialisation. - Update the buffer timestamp. - -2004-05-10 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/dv/gstdvdec.c: (gst_dvdec_change_state): - Return the result of the parent state change call - -2004-05-10 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * gst/law/alaw.c : alawdec should be registered with type ALAWDEC, not ALAWENC - * gst/law/alaw-decode.c : put audio/x-alaw on pads, instead of audio/x-mulaw - * gst/law/alaw-encode.c : (idem) - * ext/a52dec/gsta52dec.c : mark audio/a52, audio/ac3 as deprecated in a comment - * gst/ac3parse/gstac3parse.c : audio/ac3 => audio/x-ac3 - * gst/realmedia/rmdemux.c : audio/a52 => audio/x-ac3 - -2004-05-09 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): - don't use a fixed buffer size when writing variable length data to - it. Fixes memory corruption and makes alsasrc work - -2004-05-09 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/gnomevfs/gstgnomevfssink.c: - (_gst_boolean_allow_overwrite_accumulator), - (gst_gnomevfssink_class_init), (gst_gnomevfssink_open_file): - Run glib's default signal handler (??) in RUN_CLEANUP rather than - RUN_LAST, and don't use that to set the accumulator value because - then it's always FALSE. - -2004-05-09 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data), - (gst_riff_create_audio_caps), - (gst_riff_create_audio_template_caps): - * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): - Fix for unaligned RIFF files (i.e. where all the chunks together - in a LIST chunk are not of the same size as the size given in - the LIST chunk header). Fixes several odd WAVE files. Also fix - ADPCM (block_align property) in audio, so that wavparse based - on this works now as it used to stand-alone. - -2004-05-09 Edward Hervey <bilboed@bilboed.com> - - reviewed by Benjamin Otte <otte@gnome.org> - - * ext/a52dec/gsta52dec.c: - * ext/divx/gstdivxdec.c: - * ext/divx/gstdivxenc.c: - * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init): - * ext/faac/gstfaac.c: (gst_faac_base_init): - * ext/faad/gstfaad.c: (gst_faad_base_init): - * ext/ivorbis/vorbisfile.c: - * ext/lame/gstlame.c: - * ext/libfame/gstlibfame.c: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): - * ext/sidplay/gstsiddec.cc: - * ext/speex/gstspeexdec.c: - * ext/speex/gstspeexenc.c: - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxvidenc.c: - correct klasses. Mostly s,Codec/(Audio|Video),\1/Codec, - (fixes #142193) - -2004-05-08 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsa.c: (device_list), - (gst_alsa_class_probe_devices): - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_open): - Fix alsa oddness in mixer after the combination of using mixer - in source/sink elements and using hw:x,y instead of just hw:x. - -2004-05-09 Benjamin Otte <otte@gnome.org> - - * gst/wavparse/gstwavparse.c: (gst_wavparse_destroy_sourcepad), - (gst_wavparse_create_sourcepad): - make PAUSED=>READY=>PAUSED=READY work by not destroying NULL - sourcepads - -2004-05-09 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): - allow discont events before caps nego - -2004-05-08 Benjamin Otte <otte@gnome.org> - - * ext/vorbis/vorbisdec.c: (vorbis_dec_event): - don't leak events - -2004-05-08 Benjamin Otte <otte@gnome.org> - - * gst/level/gstlevel.c: (gst_level_link), (gst_level_chain), - (gst_level_change_state), (gst_level_init): - * gst/level/gstlevel.h: - figure out if we're initialized directly instead of keeping a - variable that's wrong in 90% of cases - don't initialize pads and then leak them and use a new unitialized - pad. (fixes #142084) - these were bugs so n00bish I didn't find them for an hour :/ - -2004-05-08 Iain <iain@prettypeople.org> - - * gst/wavparse/gstwavparse.ch: Rewrote to use RiffRead instead. - * gst-libs/gst/riff/riff-read.c (gst_riff_read_peek_head): Unstatic it - (gst_riff_read_element_data): Ditto, and added a got_bytes argument to - return the length that was read. - (gst_riff_read_strf_auds): Allow fmt tags as well. - -2004-05-07 David Schleef <ds@schleef.org> - - * ext/faad/gstfaad.c: (gst_faad_sinkconnect): HACK to correct - signed char assumption in faad.h. - -2004-05-07 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_caps): - Missing break, detected by Daniel Gazard <daniel.gazard@free.fr>. - -2004-05-07 Colin Walters <walters@redhat.com> - - * gst/volume/gstvolume.c (gst_volume_dispose): Unref dpman. - * ext/flac/gstflacdec.c (gst_flacdec_dispose): Add dispose - function. - * gst/audioscale/gstaudioscale.c (gst_audioscale_dispose): - Add dispose function. - -2004-05-08 Jan Schmidt <thaytan@mad.scientist.com> - * ext/dv/gstdvdec.c: (gst_dvdec_video_link): - Fix caps nego and pad templates. RGB mode caps should - work now. - * ext/dvdnav/gst-dvd: - Move mpeg2dec inside the thread because otherwise the - queue rejects cap changes mid-stream - * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_get_type), - (gst_mpeg2dec_flush_decoder): - For mpeg2dec > 0.4.0, call the flush function instead of - manually extracting all in-flight frames. - * ext/raw1394/gstdv1394src.c: (gst_dv1394src_factory), - (gst_dv1394src_init), (gst_dv1394src_iso_receive): - Change mime type video/dv go video/x-dv to match the - rest of gst-plugins - -2004-05-07 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_build_list): - * ext/alsa/gstalsasink.c: (gst_alsa_sink_get_type), - (gst_alsa_sink_class_init): - * ext/alsa/gstalsasink.h: - * ext/alsa/gstalsasrc.c: (gst_alsa_src_get_type), - (gst_alsa_src_class_init): - * ext/alsa/gstalsasrc.h: - Make alsasink/src a subclass of alsamixer so that mixer stuff - shows up in gst-rec. Needs some finetuning. - -2004-05-05 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/lame/gstlame.c: (gst_lame_chain): - simplify - * ext/mad/gstmad.c: (gst_mad_handle_event): - fix event leak - * gst/typefind/gsttypefindfunctions.c: (mp3_type_find): - be able to detect mp3 files < 4096 bytes - -2004-05-06 Wim Taymans <wim@fluendo.com> - - * ext/theora/theoraenc.c: (gst_theora_enc_class_init), - (theora_enc_sink_link), (theora_push_packet), (theora_enc_chain), - (theora_enc_set_property), (theora_enc_get_property): - Also encode the first frame, cleanup some code. - -2004-05-06 Wim Taymans <wim@fluendo.com> - - * ext/mpeg2enc/gstmpeg2enc.cc: - Forward events first before deciding that negotiation was - not performed. - -2004-05-06 Wim Taymans <wim@fluendo.com> - - * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): - First process the events before deciding that negotiation - was not performed. - -2004-05-06 Wim Taymans <wim@fluendo.com> - - * ext/theora/Makefile.am: - * ext/theora/theora.c: (plugin_init): - * ext/theora/theoradec.c: (theora_dec_change_state): - * ext/theora/theoraenc.c: (gst_theora_enc_base_init), - (gst_theora_enc_class_init), (gst_theora_enc_init), - (theora_enc_sink_link), (theora_enc_event), (theora_push_packet), - (theora_enc_chain), (theora_enc_change_state), - (theora_enc_set_property), (theora_enc_get_property): - Added a theora encoder, grouped the encoder and decoder into the - same plugin. - -2004-05-05 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/jpeg/gstjpegenc.c: (gst_jpegenc_get_type), - (gst_jpegenc_chain): - fix DURATION on outgoing buffers - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_sink_event): - debug using time formats - * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support), - (gst_xvimagesink_sink_link): - windows with width/height 0 generate X errors, so don't allow them - -2004-05-05 Wim Taymans <wim@fluendo.com> - - * ext/mpeg2dec/gstmpeg2dec.c: (src_templ), - (gst_mpeg2dec_base_init), (gst_mpeg2dec_init), - (gst_mpeg2dec_negotiate_format): - * ext/mpeg2dec/gstmpeg2dec.h: - removed the static pad template so that we can add the - more accurate framerate value to the caps. - - -2004-05-04 Benjamin Otte <otte@gnome.org> - - * configure.ac: - check for kdemacros.h, too (should fix #141821) - * ext/vorbis/vorbisdec.c: (vorbis_dec_event), (vorbis_dec_chain): - don't crash if no header was sent, but nicely error out (fixes part - of #141554) - -2004-05-04 Wim Taymans <wim@fluendo.com> - - * ext/mpeg2enc/gstmpeg2enc.cc: (gst_mpeg2enc_dispose): call the - parent dispose function to avoid segfault on destroy. - -2004-05-04 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), - (plugin_init): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), - (gst_xvimagesink_sink_link): - clean up debugging caps - also recreate xvimage when format has changed - -2004-05-04 Benjamin Otte <otte@gnome.org> - - * ext/libvisual/Makefile.am: - * ext/libvisual/visual.c: (gst_visual_class_init), - (gst_visual_init), (gst_visual_dispose), (gst_visual_getcaps), - (gst_visual_srclink), (gst_visual_chain), - (gst_visual_change_state), (plugin_init): - use a GstAdapter to correctly adapt buffer sizes - allows using a - framerate - -2004-05-03 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/v4l/gstv4lelement.h: - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_fps), (gst_v4lsrc_getcaps), - (gst_v4lsrc_buffer_free): - * sys/v4l/v4l_calls.c: (gst_v4l_get_capabilities): - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), - (gst_v4lsrc_sync_frame), (gst_v4lsrc_grab_frame), - (gst_v4lsrc_requeue_frame): - move some debugging categories around - query for fps index and set accordingly if found - -2004-05-03 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * ext/lame/gstlame.c: - correct defaults that lame_init puts out of range - -2004-05-03 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/divx/gstdivxenc.c: (gst_divxenc_get_type), - (gst_divxenc_class_init): - fix range since -1 is the default - * gst/mpeg1sys/gstmpeg1systemencode.c: - (gst_mpeg1_system_encode_get_type), (gst_system_encode_multiplex): - * gst/rtjpeg/gstrtjpegdec.c: (gst_rtjpegdec_get_type), - (gst_rtjpegdec_chain): - * gst/rtjpeg/gstrtjpegenc.c: (gst_rtjpegenc_get_type), - (gst_rtjpegenc_chain): - * sys/qcam/gstqcamsrc.c: (gst_autoexp_mode_get_type), - (gst_qcamsrc_get_type), (gst_qcamsrc_change_state): - * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_get_type): - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get_type): - * sys/v4l/gstv4lsrc.c: - * sys/v4l/v4l_calls.c: (gst_v4l_open): - * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_playback_init): - * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_capture_init): - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_init): - * sys/vcd/vcdsrc.c: (vcdsrc_get_type), (vcdsrc_get): - remove gst_info calls - -2004-05-03 Thomas Vander Stichele <thomas at apestaart dot org> - - * Makefile.am: - * po/af.po: - * po/az.po: - * po/en_GB.po: - * po/nl.po: - * po/sr.po: - * po/sv.po: - Updated translations - -2004-05-03 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/audioconvert/gstaudioconvert.c: (_fixate_caps_to_int): - refactor/comment code - -2004-05-02 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/asfdemux/Makefile.am: - * gst/asfdemux/asfheaders.c: - * gst/asfdemux/asfheaders.h: - * gst/asfdemux/gstasf.c: (plugin_init): - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_get_type), - (gst_asf_demux_base_init), (gst_asf_demux_process_comment), - (gst_asf_demux_setup_pad): - * gst/asfdemux/gstasfdemux.h: - * gst/asfdemux/gstasfmux.c: - * gst/asfdemux/gstasfmux.h: - Add tagging support to demuxer, split out registration in its own - file instead of in demux (hacky), and prevent having some tables - in our memory multiple times (in asfheaders.h). - -2004-05-01 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_parse_metadata): - * gst/matroska/matroska-ids.h: - Basic tag reading support. - -2004-04-30 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/matroska-demux.c: (gst_matroska_demux_audio_caps): - Really detect ac-3 audio. - * gst/typefind/gsttypefindfunctions.c: (matroska_type_find): - really detect matroska files (off-by-1). - -2004-04-30 David Schleef <ds@schleef.org> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (gst_qtdemux_add_stream), (qtdemux_parse), (qtdemux_type_get), - (qtdemux_dump_stsz), (qtdemux_dump_stco), (qtdemux_dump_co64), - (qtdemux_dump_unknown), (qtdemux_parse_tree), (qtdemux_parse_udta), - (qtdemux_tag_add), (get_size), (gst_qtdemux_handle_esds): More qtdemux - hackage -- parse a lot more atoms, extract a few tags. One might even - mistake this for tag support. Maybe it is. - * gst/qtdemux/qtdemux.h: - -2004-04-30 Colin Walters <walters@verbum.org> - - * ext/alsa/gstalsasink.c (gst_alsa_sink_mmap): Plug a memleak. - -2004-04-30 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcolorspace_getcaps): - remove broken nego fix - -2004-04-30 Benjamin Otte <otte@gnome.org> - - * configure.ac: - * ext/Makefile.am: - * ext/libvisual/Makefile.am: - * ext/libvisual/visual.c: - add initial support for libvisual (http://libvisual.sourceforge.net) - libvisual is still quite alpha, so expect crashes in there :) - -2004-04-29 David Schleef <ds@schleef.org> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), (qtdemux_parse), - (qtdemux_parse_trak), (get_size), (gst_qtdemux_handle_esds): Hacked - up qtdemux to make it spit out codec_data. Do _not_ look at this - code; you will no longer respect me. - -2004-04-29 Stephane Loeuillet <stephane.loeuillet@tiscali.fr> - - * ext/alsa/gstalsa.c : (gst_alsa_class_probe_devices) - * ext/alsa/gstalsa.h : - change alsa pcm device discovery to find more than 1 device - per card. code review by Ronald. - -2004-04-29 David Schleef <ds@schleef.org> - - * sys/oss/gstosselement.c: (gst_osselement_rate_probe_check): - Add a check for a driver bug on FreeBSD. (bug #140565) - -2004-04-29 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/jpeg/gstjpegdec.c: (gst_jpegdec_get_type): - * ext/jpeg/gstjpegenc.c: (gst_jpegenc_get_type), - (gst_jpegenc_getcaps): - move format setting to inner loop - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcolorspace_getcaps): - use GST_PAD_CAPS if available so that we use already negotiated - caps - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (qtdemux_parse_moov), (qtdemux_parse): - extra debugging - * sys/qcam/qcam-Linux.c: (qc_lock_wait), (qc_unlock): - * sys/qcam/qcam-os.c: (qc_lock_wait), (qc_unlock): - move hardcoded path to DEFINE - -2004-04-28 David Schleef <ds@schleef.org> - - * gst/speed/gstspeed.c: (speed_parse_caps): Fix caps parsing. - (bug #140064) - -2004-04-28 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsa.c: (gst_alsa_class_probe_devices): - Don't probe for playback device if we're a source element. Fixes - #139658. - -2004-04-29 Benjamin Otte <otte@gnome.org> - - * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event), - (gst_id3_tag_chain): - rewrite buffer offset - -2004-04-28 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * ext/Makefile.am: - * ext/dts/Makefile.am: - * ext/dts/gstdtsdec.c: (gst_dtsdec_get_type), - (gst_dtsdec_base_init), (gst_dtsdec_class_init), (gst_dtsdec_init), - (gst_dtsdec_channels), (gst_dtsdec_renegotiate), - (gst_dtsdec_handle_event), (gst_dtsdec_update_streaminfo), - (gst_dtsdec_loop), (gst_dtsdec_change_state), - (gst_dtsdec_set_property), (gst_dtsdec_get_property), - (plugin_init): - * ext/dts/gstdtsdec.h: - New DTS decoder. - * ext/faad/gstfaad.c: (gst_faad_sinkconnect), - (gst_faad_srcconnect): - Add ESDS atom handling (.m4a). - -2004-04-27 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/divx/gstdivxdec.c: (plugin_init): - Remove comment that makes no sense. - * ext/mad/gstid3tag.c: (gst_id3_tag_set_property): - Fix for obvious typo that resulted in warnings during gst-register. - * ext/xvid/gstxviddec.c: (gst_xviddec_src_link), - (gst_xviddec_sink_link): - Fix caps negotiation a bit better. - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): - We call this 'codec_data', not 'esds'. - -2004-04-27 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/monoscope/gstmonoscope.c: - make sure we only provide 256x128 - * gst/monoscope/monoscope.c: (monoscope_init): - assert size of 256x128 - -2004-04-27 Thomas Vander Stichele <thomas at apestaart dot org> - - * Makefile.am: - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_init), (gst_v4lsrc_fixate), - (gst_v4lsrc_getcaps), (gst_v4lsrc_buffer_free): - fixate to max width and height of device - -2004-04-27 Thomas Vander Stichele <thomas at apestaart dot org> - - * Makefile.am: - * sys/v4l/gstv4l.c: - * sys/v4l/gstv4lsrc.c: - * sys/v4l/v4l_calls.c: - * sys/v4l/v4lsrc_calls.c: - fix for qc-usb driver which fakes having more than one buffer - by handing the same buffer twice, which confused GStreamer's/v4lsrc - buffer_free override - add debugging - -2004-04-27 Thomas Vander Stichele <thomas at apestaart dot org> - - * Makefile.am: - * gst/videotestsrc/gstvideotestsrc.c: - (gst_videotestsrc_class_init), (gst_videotestsrc_change_state), - (gst_videotestsrc_init), (gst_videotestsrc_get), - (gst_videotestsrc_set_property), (gst_videotestsrc_get_property): - * gst/videotestsrc/gstvideotestsrc.h: - add num-buffers property - - 2004-04-26 Benjamin Otte <otte@gnome.org> - - * ext/mad/gstid3tag.c: (plugin_init): - set id3mux rank to NONE so it doesn't confuse spider - require audio/mpeg,mpegversion=1 in id3mux - -2004-04-26 Benjamin Otte <otte@gnome.org> - - * configure.ac: - detect faad correctly as non-working if it's indeed non-working - -2004-04-26 Thomas Vander Stichele <thomas at apestaart dot org> - - * Makefile.am: - * ext/jpeg/gstjpegenc.c: (gst_jpegenc_get_type), - (gst_jpegenc_class_init), (gst_jpegenc_getcaps): - fix _getcaps so it only negotiates to its supported format - -2004-04-25 Benjamin Otte <otte@gnome.org> - - * gst/audioconvert/gstaudioconvert.c: (_fixate_caps_to_int): - fix memleak - -2004-04-23 Benjamin Otte <otte@gnome.org> - - * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps): - audio/x-raw-int with height rules! not. Now it's depth. - -2004-04-22 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/wavparse/gstwavparse.c: (gst_wavparse_create_sourcepad), - (gst_wavparse_parse_fmt), (gst_wavparse_handle_sink_event), - (gst_wavparse_loop): - Missing variable initialization. Add handling of DVI ADPCM. Fix - mis-parsing of LIST chunks. This works around a bug where we mis- - parse non-aligning LIST chunks (so LIST chunks where the contents - don't align with the actual LIST size). The correct fix is to use - rifflib, I'm not going to fix wavparse - too much work. All this - fixes #104878. - -2004-04-22 Zaheer Abbas Merali <zaheerabbas at merali dot org> - - reviewed by Benjamin Otte <otte@gnome.org> - - * ext/shout/gstshout.c: (gst_icecastsend_change_state): - fix shoutcast not working (fixes #140844) - -2004-04-22 Benjamin Otte <otte@gnome.org> - - * ext/hermes/gsthermescolorspace.c: - (gst_hermes_colorspace_caps_remove_format_info): - * gst/colorspace/gstcolorspace.c: - (gst_colorspace_caps_remove_format_info): - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcolorspace_caps_remove_format_info): - s/gst_caps_simplify/gst_caps_do_simplify/ - -2004-04-22 Benjamin Otte <otte@gnome.org> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data): - mpegversion is an int - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_base_init): - don't try to create pad templates with NULL caps, use any caps - instead. - -2004-04-20 David Schleef <ds@schleef.org> - - * ext/sdl/Makefile.am: Link against libgstinterfaces, not - libgstxoverlay. jmmv@menta.net (Julio M. Merino Vidal) - (bug #140384) - -2004-04-20 Daniel Gazard <daniel.gazard@epita.fr> - - reviewed by David Schleef - - * ext/mad/gstid3tag.c: Add stdlib.h - * gst/rtp/gstrtpgsmenc.c: same - * gst/tags/gstid3tag.c: same - * gst/udp/gstudpsrc.c: (gst_udpsrc_get): Fix GST_DISABLE_LOADSAVE - * gst/tcp/gsttcpsink.c: (gst_tcpsink_sink_link): Adjust - GST_DISABLE_LOADSAVE use. - * gst/udp/gstudpsink.c: (gst_udpsink_sink_link): Likewise. - * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_get): Likewise. - * ext/gnomevfs/gstgnomevfssrc.c: Include <stdlib.h> (needed by - atol(3)). - * sys/oss/gstosselement.h: Include <sys/types.h> (needed for dev_t). - * gst/tags/gstvorbistag.c: Include <stdlib.h> (needed by - strtoul(3)). - * gst/rtp/gstrtpL16enc.c: Include <stdlib.h> (needed by random(3)). - * ext/mad/Makefile.am: (libgstmad_la_CFLAGS): Add $(MAD_CFLAGS) - $(ID3_CFLAGS). - * ext/libfame/Makefile.am: (libgstlibfame_la_CFLAGS): Add - $(LIBFAME_CFLAGS). - -2004-04-20 David Schleef <ds@schleef.org> - - * gst/realmedia/rmdemux.c: This was supposed to part of the - last checkin. Same idea. - -2004-04-20 Daniel Gazard <daniel.gazard@epita.fr> - - reviewed by David Schleef - - * configure.ac: bump required gstreamer version to 0.8.1.1 - because of following changes --ds - - * gst-libs/gst/riff/riff-read.c: Include gst/gstutils.h. - (gst_riff_peek_head, gst_riff_peek_list, gst_riff_read_list) - (gst_riff_read_header): Use GST_READ_UINT* - macros to access possibly unaligned memory. - - * gst/typefind/gsttypefindfunctions.c: Include gst/gstutils.h. - (mp3_type_find): Use GST_READ_UINT* - macros to access possibly unaligned memory. - (mp3_type_find, mpeg1_parse_header, qt_type_find) - (speex_type_find): Likewise - - * gst/tags/gstvorbistag.c: (ADVANCE): Likewise - - * gst/qtdemux/qtdemux.c: Include stdlib.h (needed by realloc). - (QTDEMUX_GUINT32_GET, QTDEMUX_GUINT16_GET, QTDEMUX_FP32_GET) - (QTDEMUX_FP16_GET, QTDEMUX_FOURCC_GET) - (gst_qtdemux_loop_header, gst_qtdemux_loop_header) - (qtdemux_node_dump_foreach, qtdemux_tree_get_child_by_type) - (qtdemux_tree_get_sibling_by_type): Use GST_READ_UINT* - macros to access possibly unaligned memory. - - * gst/mpegstream/gstmpegpacketize.c: (parse_generic, parse_chunk): - Likewise. - - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead) - (gst_mpeg_demux_parse_packet, gst_mpeg_demux_parse_pes): Likewise. - - * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): - Likewise. - - * gst/mpeg2sub/gstmpeg2subt.c: (GST_BUFFER_DATA) - (gst_mpeg2subt_chain_subtitle): Likewise. - - * gst/mpeg1videoparse/gstmp1videoparse.c: (mp1videoparse_parse_seq) - (gst_mp1videoparse_time_code, gst_mp1videoparse_real_chain): - Likewise. - - * gst/mpeg1sys/buffer.c: (mpeg1mux_buffer_update_audio_info): - Likewise. - - * gst/cdxaparse/gstcdxaparse.c: (gst_bytestream_peek_bytes): - Likewise. - - * gst/asfdemux/gstasfdemux.c: (_read_var_length, _read_uint): - Likewise. - -2004-04-20 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - update required version of GStreamer because of GST_TIME_FORMAT - -2004-04-20 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/mad/gstid3tag.c: (gst_id3_tag_init): - remove leftover g_print - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): - don't try setting only a subset of the caps. We don't want to kill - autoplugging on purpose - -2004-04-20 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/ximage/ximagesink.c: (plugin_init): - * sys/xvimage/xvimagesink.c: (plugin_init): - add debugging categories - -2004-04-20 Thomas Vander Stichele <thomas at apestaart dot org> - - * po/en_GB.po: - * po/LINGUAS: - Adding en_GB translation (Gareth Owen) - -2004-04-20 David Schleef <ds@schleef.org> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), - (qtdemux_parse), (qtdemux_type_get), (qtdemux_dump_mvhd), - (qtdemux_dump_tkhd), (qtdemux_dump_stsd), (qtdemux_dump_unknown), - (qtdemux_parse_trak), (qtdemux_video_caps), (qtdemux_audio_caps): - A number of new features and hacks to extract the esds atom and - put it into the caps. (bug #137724) - -2004-04-19 David Schleef <ds@schleef.org> - - * gconf/Makefile.am: Fix for non-GNU make - * gst-libs/gst/Makefile.am: Change directory order to handle - GstPlay linking with gstinterfaces - * gst-libs/gst/audio/make_filter: make use of tr portable - * gst-libs/gst/play/Makefile.am: Add intended \ - * gst-libs/gst/xwindowlistener/xwindowlistener.c: - (gst_xwin_set_clips): Switch to ISO variadic macro. Use a - function prototype instead of void *. - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: Switch to ISO variadic - macro. - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcolorspace_chain): wrap NULL in GST_ELEMENT_ERROR call - * gst/videofilter/make_filter: make use of tr portable - * pkgconfig/Makefile.am: Remove GNU extension in Makefile target - -2004-04-19 Thomas Vander Stichele <thomas at apestaart dot org> - - * po/LINGUAS: - * po/uk.po: - Added Ukrainian translation (Maxim V. Dziumanenko) - -2004-04-18 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/gsm/gstgsmdec.c: (gst_gsmdec_init), (gst_gsmdec_getcaps), - (gst_gsmdec_link), (gst_gsmdec_chain): - Fix capsnego, simplify chain function slightly. - * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): - Add GSM. - -2004-04-18 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/wavparse/gstwavparse.c: (gst_wavparse_init), - (gst_wavparse_destroy_sourcepad), (gst_wavparse_create_sourcepad), - (gst_wavparse_parse_fmt), (gst_wavparse_change_state): - Hack to make wavparse work with spider (always -> sometimes pad). - Fixes #135862 && #140411. - -2004-04-18 Benjamin Otte <otte@gnome.org> - - * sys/oss/gstosselement.c: (gst_osselement_sync_parms), - (gst_osselement_rate_probe_check), - (gst_osselement_rate_check_rate), (gst_osselement_rate_add_rate): - get rid of \n in debug output - -2004-04-17 Iain <iain@prettypeople.org> - - * gst/wavparse/gstwavparse.c (gst_wavparse_loop): Allow all events, - not just EOS. - -2004-04-17 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/mad/gstid3tag.c: (gst_id3_tag_get_type), - (gst_id3_tag_class_init), (gst_id3_tag_get_caps), - (gst_id3_tag_add_src_pad), (gst_id3_tag_init), - (gst_id3_tag_set_property), (gst_id3_tag_do_caps_nego), - (gst_id3_tag_src_link), (gst_id3_tag_chain), - (gst_id3_tag_change_state), (plugin_init): - deprecate id3tag element and replace with id3demux/id3mux. - great side effect: this ugly file is now even uglier, yay! - * ext/mad/gstmad.h: - remove non-available function - update for new get_type - -2004-04-17 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * configure.ac: - require mpeg2dec >= 0.4.0 - -2004-04-17 Benjamin Otte <otte@gnome.org> - - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support), - (gst_xvimagesink_xcontext_get), (gst_xvimagesink_change_state), - (gst_xvimagesink_set_xwindow_id): - call GST_ELEMENT_ERROR whenever get_xcontext fails. Includes - assorted cleanup fixes. - -2004-04-16 David Schleef <ds@schleef.org> - - * sys/ximage/ximagesink.h: Compile fix for FreeBSD. (bug #140268) - * sys/xvimage/xvimagesink.h: same - -2004-04-16 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file): - Fix GST_ELEMENT_ERROR with (NULL) - -2004-04-15 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data): - Add div3456 as fourccs for DivX 3 (fixes #140137). - -2004-04-15 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: - (gst_riff_create_video_caps_with_data), - (gst_riff_create_video_caps), (gst_riff_create_audio_caps), - (gst_riff_create_video_template_caps), - (gst_riff_create_audio_template_caps): - * gst-libs/gst/riff/riff-media.h: - * gst-libs/gst/riff/riff-read.c: - (gst_riff_read_strf_vids_with_data), (gst_riff_read_strf_vids): - * gst-libs/gst/riff/riff-read.h: - * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): - Add MS RLE support. I added some functions to read out strf chunks - into strf chunks and the data behind it. This is usually color - palettes (as in RLE, but also in 8-bit RGB). Also use those during - caps creation. Lastly, add ADPCM (similar to wavparse - which - should eventually be rifflib based). - * gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init), - (gst_matroska_demux_init), (gst_matroska_demux_reset): - * gst/matroska/matroska-demux.h: - Remove placeholders for some prehistoric tagging system. Didn't add - support for any tag system really anyway. - * gst/qtdemux/qtdemux.c: - Add support for audio/x-m4a (MPEG-4) through spider. - * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), - (gst_wavparse_loop): - ADPCM support (#135862). Increase max. buffer size because we - cannot split buffers for ADPCM (screws references) and I've seen - files with 2048 byte chunks. 4096 seems safe for now. - -2004-04-15 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: bump nano to 1 - -=== release 0.8.1 === - -2004-04-15 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: releasing 0.8.1, "Comforting Sounds" - -2004-04-14 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps): - Fix typo in divxversion (3 instead of 4 for "DIVX" fourcc). - Fixes #140058 - -2004-04-14 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_plugin_init): - lower rank of dvddemux so that it's not used for mpeg playback. - -2004-04-14 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * configure.ac: - save libs correctly when checking mad - -2004-04-14 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/mad/gstid3tag.c: (plugin_init): - lower rank of id3tag as proposed by Benjamin. Fixes #139926. - -2004-04-13 David Schleef <ds@schleef.org> - - * common/m4/gst-feature.m4: Call -config scripts with - --plugin-libs if it is supported. - * gst/avi/gstavimux.c: (gst_avimux_vidsinkconnect): sequences of - JPEG images are image/jpeg. - * gst/debug/Makefile.am: - * gst/debug/negotiation.c: (gst_negotiation_class_init), - (gst_negotiation_getcaps), (gst_negotiation_pad_link), - (gst_negotiation_update_caps), (gst_negotiation_get_property), - (gst_negotiation_plugin_init): Add a property that acts like - filter caps. - * testsuite/gst-lint: Move license checking to be a standard - test. - -2004-04-13 David Schleef <ds@schleef.org> - - * gst/avi/gstavidemux.c: (gst_avi_demux_reset): Fix memleak. - patch from Sebastien Cote (bug #139958) - -2004-04-13 Thomas Vander Stichele <thomas at apestaart dot org> - - * examples/gstplay/Makefile.am: - * examples/gstplay/player.c: (main): - make the commandline player example use gconf settings - -2004-04-13 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/libcaca/gstcacasink.c: (gst_cacasink_class_init), - (gst_cacasink_sinkconnect), (gst_cacasink_init), - (gst_cacasink_chain), (gst_cacasink_open), (gst_cacasink_close): - init/end library during state transition, not object - creation/disposal. get rid of custom dispose handler. - - -2004-04-12 Christian Schaller <Uraeus@gnome.org> - - * sys/oss/gstosselement.c: s/lstat/stat/ from freeBSD, since it can - be a symlink - -2004-04-11 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_data): - Handle JUNK chunks inside data section. Prevents warnings. - -2004-04-11 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps), - (gst_riff_create_video_template_caps): - Add MS video v1. - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_index), - (gst_avi_demux_stream_data): - Add support for "rec-list" chunks. - -2004-04-11 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps): - Fix another codecname mismatch. - -2004-04-11 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps): - Fix divx caps mismatch and move from video/x-jpeg to image/jpeg - so that MJPEG plays back. - -2004-04-10 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_init), - (gst_mp1videoparse_real_chain), (gst_mp1videoparse_change_state): - * gst/mpeg1videoparse/gstmp1videoparse.h: - Fix for some slight mis-cuts in buffer parsing, and for some - potential overflows or faults-causers. Adds disconts. Also fixes - #139105 while we're at it. - -2004-04-10 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * sys/v4l2/gstv4l2element.h: - Workaround for missing struct v4l2_buffer declaration in Suse 9 - and Mandrake 10 linux/videodev2.h header file (#135919). - -2004-04-10 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file): - Bail out if no filename was given. - -2004-04-10 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_caps), - (gst_v4l2_fourcc_from_structure): - Add Y41B/Y42B YUV formats (see #125732), fix Y41P (was typo'ed to - Y41B somewhere). - -2004-04-09 Benjamin Otte <otte@gnome.org> - - * ext/gnomevfs/gstgnomevfssink.c: - (_gst_boolean_allow_overwrite_accumulator), - (gst_gnomevfssink_class_init): - fix erase signal - if any handler returns false the file will not be - overwritten. If no handler is connected, the file will not be - overwritten either. - renamed signal to "allow-overwrite" - * ext/mad/gstid3tag.c: (tag_list_to_id3_tag_foreach): - free string when adding it to ID3 failed - * ext/vorbis/vorbisdec.c: (vorbis_dec_event): - unref event when done - * gst/audioconvert/gstaudioconvert.c: (_fixate_caps_to_int): - free caps - * gst/typefind/gsttypefindfunctions.c: - (mpeg_video_stream_type_find): - fix invalid read - -2004-04-08 David Schleef <ds@schleef.org> - - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcolorspace_register): Change rank to PRIMARY. - -2004-04-08 David Schleef <ds@schleef.org> - - * gst/colorspace/gstcolorspace.c: Don't advertise a conversion - we don't support (bug #139532) - -2004-04-07 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/mad/gstmad.c: (gst_mad_handle_event), - (gst_mad_check_caps_reset), (gst_mad_chain), - (gst_mad_change_state): - only set explicit caps if they haven't been set before for - this stream. MPEG-audio sample rate/channels aren't allowed - to change in-stream. - Fixes #139382 - -2004-04-06 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_base_init), - (_gst_boolean_did_something_accumulator), - (gst_gnomevfssink_class_init), (gst_gnomevfssink_dispose), - (gst_gnomevfssink_init), (gst_gnomevfssink_set_property), - (gst_gnomevfssink_get_property), (gst_gnomevfssink_open_file), - (gst_gnomevfssink_close_file), (gst_gnomevfssink_chain), - (gst_gnomevfssink_change_state): - Fix erase signal. Don't erase by default. Remove handoff signal. - Remove erase property. Don't segfault. General cleanup. - -2004-04-07 Benjamin Otte <otte@gnome.org> - - * gst-libs/gst/gconf/test-gconf.c: (main): - add missing gst_init - -2004-04-07 Benjamin Otte <otte@gnome.org> - - * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_dispose): - free the mutexes, too - -2004-04-07 Benjamin Otte <otte@gnome.org> - - * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_dispose): - actually free the URI string - * ext/mad/gstid3tag.c: (gst_id3_tag_src_event): - compute offset correctly when passing discont events - * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): - don't leak discont events - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_video_caps): - add some missing breaks so caps aren't copied randomly - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_get_video_stream): - if we realloc memory, we better use it - -2004-04-06 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/mad/gstmad.c: (normal_seek): - fix GST_FORMAT_TIME usage - -2004-04-05 David Schleef <ds@schleef.org> - - * ext/kio/kiosrc.cpp: Undefine KDE_DEPRECATED so we can use - a deprecated function (hack!) - -2004-04-05 Benjamin Otte <otte@gnome.org> - - * ext/esd/esdmon.c: (gst_esdmon_get): - fix nonterminated vararg and memleak - -2004-04-05 Benjamin Otte <otte@gnome.org> - - * ext/ladspa/gstladspa.c: (gst_ladspa_class_init), - (gst_ladspa_init), (gst_ladspa_force_src_caps), - (gst_ladspa_set_property), (gst_ladspa_get_property), - (gst_ladspa_instantiate), (gst_ladspa_activate), - (gst_ladspa_deactivate), (gst_ladspa_loop), (gst_ladspa_chain): - clean up debugging - -2004-04-05 Stefan Kost <kost@imn.htwk-leipzig.de> - - reviewed by Benjamin Otte <otte@gnome.org> - - * ext/ladspa/gstladspa.c: (gst_ladspa_class_init): - check for broken LADSPA parameters (fixes #138635) - -2004-04-05 Benjamin Otte <otte@gnome.org> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_getcaps): - advertise buffer-frames correctly on sinkpads - -2004-04-05 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/mad/gstmad.c: (gst_mad_get_type), (gst_mad_layer_get_type), - (gst_mad_mode_get_type), (gst_mad_emphasis_get_type), - (gst_mad_get_event_masks), (gst_mad_get_query_types), (index_seek), - (normal_seek), (gst_mad_src_event), (gst_mad_handle_event), - (gst_mad_check_caps_reset), (gst_mad_chain): - add more debugging, only reset caps when we're not in error state - -2004-04-05 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/mad/gstmad.c: add debugging category, comment + cleanups - -2004-04-05 Julio M. Merino Vidal <jmmv@menta.net> - - reviewed by Benjamin Otte <otte@gnome.org> - - * configure.ac: - fix == in test(1) operator - -2004-04-05 Julio M. Merino Vidal <jmmv@menta.net> - - reviewed by Benjamin Otte <otte@gnome.org> - - * configure.ac: - fix --export-symblos-regex to a working regex. - -2004-04-04 Benjamin Otte <otte@gnome.org> - - * sys/oss/.cvsignore: - add for oss_probe - -2004-04-03 Tim-Phillip Müller <t.i.m@zen.co.uk> - - reviewed by Benjamin Otte <otte@gnome.org> - - * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): - add missing 'new_media' argument (fixes #138168) - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_handle_seek_event): - add vararg terminator (fixes #138169) - -2004-04-02 David Schleef <ds@schleef.org> - - * ext/gdk_pixbuf/Makefile.am: Make sure gstgdkanimation.h is - disted (bug #138914) - -2004-04-01 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsa.c: (gst_alsa_change_state), - (gst_alsa_close_audio): - handle case better where a soundcard can't pause - * ext/ogg/gstoggdemux.c: - don't crash when we get events but don't have pads yet - -2004-04-01 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/oss/gstosselement.c: (gst_osselement_probe_caps): - throw an error if we couldn't probe any caps. - -2004-04-01 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/dvdnav/gst-dvd: - Add a really simple sample DVD player - -2004-04-01 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/a52dec/gsta52dec.c: (gst_a52dec_get_type), (gst_a52dec_init), - (gst_a52dec_push), (gst_a52dec_handle_event), - (gst_a52dec_update_streaminfo), (gst_a52dec_loop), - (gst_a52dec_change_state): - * ext/a52dec/gsta52dec.h: - Use a debug category, Output timestamps correctly - Emit tag info, Handle events, tell liba52dec about cpu - capabilities so it can use MMX etc. - * ext/dv/gstdvdec.c: (gst_dvdec_loop), (gst_dvdec_change_state): - Fix a crasher accessing invalid memory - * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_init), - (dvdnavsrc_update_highlight), (dvdnavsrc_loop), - (dvdnavsrc_get_event_mask), (dvdnav_handle_navigation_event), - (dvdnavsrc_event), (dvdnavsrc_get_formats), (dvdnavsrc_convert), - (dvdnavsrc_query): - Some support for byte-format seeking. - Small fixes for still frames and menu button overlays - * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_get_type), - (gst_mpeg2dec_alloc_buffer): - Use a debug category. Adjust the report level of several items to - LOG. Call mpeg2_custom_fbuf to mark our buffers as 'custom buffers' - so it doesn't lose the GstBuffer pointer - * gst/debug/Makefile.am: - * gst/debug/gstdebug.c: (plugin_init): - * gst/debug/gstnavseek.c: (gst_navseek_get_type), - (gst_navseek_base_init), (gst_navseek_class_init), - (gst_navseek_init), (gst_navseek_seek), - (gst_navseek_handle_src_event), (gst_navseek_set_property), - (gst_navseek_get_property), (gst_navseek_chain), - (gst_navseek_plugin_init): - * gst/debug/gstnavseek.h: - Add the navseek debug element for seeking back and forth in a - video stream using arrow keys. - * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_get_type), - (gst_mpeg2subt_base_init), (gst_mpeg2subt_class_init), - (gst_mpeg2subt_init), (gst_mpeg2subt_finalize), - (gst_mpeg2subt_getcaps_video), (gst_mpeg2subt_link_video), - (gst_mpeg2subt_handle_video), (gst_mpeg2subt_src_event), - (gst_mpeg2subt_parse_header), (gst_get_nibble), - (gst_setup_palette), (gst_get_rle_code), (gst_draw_rle_line), - (gst_merge_uv_data), (gst_mpeg2subt_merge_title), - (gst_update_still_frame), (gst_mpeg2subt_handle_subtitle), - (gst_mpeg2subt_handle_dvd_event), (gst_mpeg2subt_loop): - * gst/mpeg2sub/gstmpeg2subt.h: - Pretty much a complete rewrite. Now a loopbased element. May still - require work to properly synchronise subtitle buffers. - * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private), - (gst_dvd_demux_send_subbuffer): - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_subbuffer): - Don't attempt to create subbuffers of size 0 - Reduce a couple of error outputs to warnings. - * gst/y4m/gsty4mencode.c: (gst_y4mencode_sinkconnect), - (gst_y4mencode_chain): - Output the y4m frame header correctly. - -2004-04-01 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/adder/gstadder.c: (gst_adder_get_type), (gst_adder_loop): - throw errors instead of allowing SIGFPE - -2004-04-01 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/gconf/gconf.c: (gst_gconf_get_string), - (gst_gconf_render_bin_from_key): - leak plugging and style fixing - -2004-03-31 David Schleef <ds@schleef.org> - - * gst/audioscale/gstaudioscale.c: (gst_audioscale_expand_value), - (gst_audioscale_getcaps): Fix getcaps to expand and union lists. - (bug #138225) - * gst/debug/Makefile.am: - * gst/debug/breakmydata.c: (gst_break_my_data_plugin_init): - * gst/debug/gstdebug.c: (plugin_init): Merge elements into one - plugin. - * gst/debug/negotiation.c: (gst_gst_negotiation_get_type), - (gst_negotiation_base_init), (gst_negotiation_class_init), - (gst_negotiation_init), (gst_negotiation_getcaps), - (gst_negotiation_pad_link), (gst_negotiation_chain), - (gst_negotiation_set_property), (gst_negotiation_get_property), - (gst_negotiation_plugin_init): New element to talk about random - negotiation things happening in a pipeline. - -2004-03-31 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/adder/gstadder.c: (gst_adder_get_type), (gst_adder_loop): - fix integer addition with help of Stefan Kost - -2004-03-31 Thomas Vander Stichele <thomas at apestaart dot org> - - * po/nl.po: updated Dutch translation (Elros Cyriatan) - -2004-03-30 David Schleef <ds@schleef.org> - - * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_alloc_buffer), - (gst_mpeg2dec_negotiate_format): Handle Y42B-format MPEG - video, patch from Matthew.Spencer@eu.sony.com (Matthew Spencer) - (bug #137504) - * ext/mpeg2dec/gstmpeg2dec.h: - -2004-03-30 David Schleef <ds@schleef.org> - - * ext/gdk_pixbuf/Makefile.am: Remove spurious rules. (bug #136527) - -2004-03-30 David Schleef <ds@schleef.org> - - * tools/gst-launch-ext-m.m: Applied patch from gnome@flyn.org (W. - Michael Petullo) to handle .mov - -2004-03-30 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * sys/oss/gstosselement.c: (gst_osselement_probe_caps), - (gst_osselement_rate_check_rate): - probe caps correctly for sound cards that only support one format - -2004-03-30 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/kio/kiosrc.cpp: (process_events): - update handling event processing if inside KDE - untested - -2004-03-29 David Schleef <ds@schleef.org> - - * ext/hermes/gsthermescolorspace.c: (plugin_init): decrease rank - by 2 to not interfere with other colorspaces. - * ext/pango/gsttextoverlay.c: (plugin_init): change rank to NONE - * gst/colorspace/gstcolorspace.c: (plugin_init): decrease rank by - one to not interfere with ffmpeg_colorspace. - -2004-03-29 David Schleef <ds@schleef.org> - - * ext/alsa/gstalsa.c: (gst_alsa_fixate): Don't fixate fields that - aren't in the caps. - * gst/sine/gstsinesrc.c: change rate caps to 1,MAX - * gst/videocrop/gstvideocrop.c: (plugin_init): Change rank to NONE. - -2004-03-30 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst-libs/gst/riff/riff-media.c: - fail on error, don't try to set stuff on NULL caps - -2004-03-30 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * configure.ac: - * ext/Makefile.am: - * ext/kio/Makefile.am: - * ext/kio/kioreceiver.cpp: - * ext/kio/kioreceiver.h: - * ext/kio/kiosrc.cpp: - * ext/kio/kiosrc.h: - add experimental kiosrc plugin - * ext/alsa/gstalsaplugin.c: (plugin_init): - initialize debugging category only when we're sure registering the - plugins worked. - -2004-03-29 Thomas Vander Stichele <thomas at apestaart dot org> - - * examples/gstplay/player.c: (main): - * gst-libs/gst/play/play.c: (gst_play_class_init), - (gst_play_set_location), (gst_play_set_data_src), - (gst_play_set_video_sink), (gst_play_set_audio_sink), - (gst_play_set_visualization), (gst_play_connect_visualization): - check return values of element_set_state and return FALSE where - failed - -2004-03-29 Benjamin Otte <otte@gnome.org> - - * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event): - try harder to check if an event is really a discont - -2004-03-29 Thomas Vander Stichele <thomas at apestaart dot org> - - * po/LINGUAS: adding Azerbaijani (Mətin Əmirov) - * po/az.po: - -2004-03-28 Benjamin Otte <otte@gnome.org> - - * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private): - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), - (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_parse_pes): - get rid of non-standard "..." ranges in case statements. - -2004-03-27 Martin Soto <martinsoto@users.sourceforge.net> - - * gst/mpegstream/gstmpegdemux.c: - * gst/mpegstream/gstmpegdemux.h: Complete overhaul. All DVD - specific functionality split to the new dvddemux element. - * gst/mpegstream/gstdvddemux.c: - * gst/mpegstream/gstdvddemux.h: New demultiplexer for DVD (VOB) - streams, derived from mpegdemux. - * gst/mpegstream/gstmpegparse.c: Discontinuity handling cleaned - up. SCR based timestamp rewriting can be turned off (will probably - completely disappear soon). - * ext/dvdnav/dvdnavsrc.c: Changes resulting from a few months - hacking. General cleanup. All printf statements replaced by - debugging messages. Almost complete libdvdnav support. - (dvdnavsrc_class_init): Got rid of unnecessary signals (replaced - by events. New properties for audio and subpicture languages. - (dvdnavsrc_update_highlight): Now uses events. - (dvdnavsrc_user_op): Cleaned up. - (dvdnavsrc_get): Renamed to dvdnavsrc_loop (element is now loop - based). Lots of cleanup, and propper support for most libdvdnav - events. - (dvdnavsrc_make_dvd_event): New function. - (dvdnavsrc_make_dvd_nav_packet_event): New function. - (dvdnavsrc_make_clut_change_event): New function. - -2004-03-26 Benjamin Otte <otte@gnome.org> - - * gst/typefind/gsttypefindfunctions.c: (theora_type_find): - fix bug where typefinding would claim it's theora whenever less then - 7 bytes of data were available - -2004-03-25 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/law/alaw-decode.c: (alawdec_getcaps), (alawdec_link), - (gst_alawdec_base_init), (gst_alawdec_class_init), - (gst_alawdec_init), (gst_alawdec_chain): - * gst/law/alaw-encode.c: (alawenc_getcaps), (alawenc_link), - (gst_alawenc_base_init), (gst_alawenc_class_init), - (gst_alawenc_init), (gst_alawenc_chain): - * gst/law/mulaw-decode.c: (mulawdec_getcaps), (mulawdec_link), - (gst_mulawdec_base_init), (gst_mulawdec_class_init), - (gst_mulawdec_init), (gst_mulawdec_chain): - * gst/law/mulaw-encode.c: (mulawenc_getcaps), (mulawenc_link), - (gst_mulawenc_base_init), (gst_mulawenc_class_init), - (gst_mulawenc_init), (gst_mulawenc_chain): - Fix capsnego in all four, remove the unused property functions and - simplify the chain functions slightly. I guess we could use macros - or something similar for those, since the code is so similar, but - I'm currently too lazy... - -2004-03-24 David Schleef <ds@schleef.org> - - * sys/oss/gstosselement.c: (gst_osselement_sync_parms), - (gst_osselement_close_audio), (gst_osselement_probe_caps), - (gst_osselement_get_format_structure), - (gst_osselement_rate_probe_check), (gst_osselement_rate_add_range), - (gst_osselement_rate_check_rate), (gst_osselement_rate_add_rate), - (gst_osselement_rate_int_compare): Add code to handle rate probing - (bug #120883) - * sys/oss/gstosselement.h: same - * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_getcaps): - Use rate probing provided by osselement. - * sys/oss/gstosssrc.c: (gst_osssrc_init), (gst_osssrc_getcaps): same - -2004-03-24 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/xvid/gstxvidenc.c: (gst_xvidenc_set_property), - (gst_xvidenc_get_property): - ulong/int mess-up. - -2004-03-24 David Schleef <ds@schleef.org> - - * ext/speex/gstspeexdec.c: (gst_speexdec_base_init), - (gst_speexdec_init): - * ext/speex/gstspeexenc.c: (gst_speexenc_base_init), - (gst_speexenc_init): Create the pad template correctly (from - the static pad template, not a NULL pointer.) - -2004-03-25 Benjamin Otte <otte@gnome.org> - - * gst/debug/Makefile.am: - * gst/debug/breakmydata.c: - add element that quasi-randomly changes bytes in the stream. - Intended use is robustness checking of demuxers and decoders in - media tests. - -2004-03-24 Benjamin Otte <otte@gnome.org> - - * ext/alsa/gstalsa.c: (gst_alsa_open_audio), - (gst_alsa_probe_hw_params): - * ext/alsa/gstalsa.h: - debugging output fixes - -2004-03-24 Benjamin Otte <otte@gnome.org> - - * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_set_property): - don't g_return_if_fail if element is PLAYING, fail silently as every - other element. - * gst/effectv/gstquark.c: (gst_quarktv_chain): - only fix needed for cast lvalue issues in gst-plugins - * gst/volenv/gstvolenv.c: (gst_volenv_init): - add proxy_getcaps - -2004-03-24 Benjamin Otte <otte@gnome.org> - - * gst/level/gstlevel.c: (gst_level_init): - add proxying getcaps function, so level doesn't advertise impossible - caps - -2004-03-24 David Schleef <ds@schleef.org> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), - (gst_qtdemux_loop_header), (qtdemux_parse_moov), (qtdemux_parse), - (qtdemux_node_dump_foreach), (qtdemux_dump_mvhd), - (qtdemux_dump_tkhd), (qtdemux_dump_elst), (qtdemux_dump_mdhd), - (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), (qtdemux_dump_dref), - (qtdemux_dump_stsd), (qtdemux_dump_stts), (qtdemux_dump_stss), - (qtdemux_dump_stsc), (qtdemux_dump_stsz), (qtdemux_dump_stco), - (qtdemux_dump_co64), (qtdemux_dump_dcom), (qtdemux_dump_cmvd), - (qtdemux_parse_tree), (qtdemux_parse_trak): Fix debugging - messages. Divide the chunk size by the compression ratio - (needed for MACE audio) - -2004-03-23 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): - Fix buffer overflow read error. - -2004-03-23 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsa.h: - Remove unused entry. - * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps): - Add cinepak. - * gst/videodrop/gstvideodrop.c: (gst_videodrop_getcaps), - (gst_videodrop_link), (gst_videodrop_chain): - Fix, sort of. Was horribly broken with new capsnego. Bah... - -2004-03-23 Jeremy Simon <jesimon@libertysurf.fr> - - * gst/typefind/gsttypefindfunctions.c: (ape_type_find), - (plugin_init): - Add a monkeysaudio typefind function - -2004-03-23 Johan Dahlin <johan@gnome.org> - - * gst-libs/gst/play/play.c (gst_play_audio_fixate) - (gst_play_video_fixate): Check so the structure has the field - before trying to fixate them, this makes it possible to have - fakesinks for video and audio output without printing errors on - the output console. - -2004-03-22 David Schleef <ds@schleef.org> - - * sys/oss/Makefile.am: - * sys/oss/oss_probe.c: (main), (probe_check), (add_range), - (check_rate), (add_rate): Rate probing test app. - -2004-03-21 Benjamin Otte <otte@gnome.org> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link), - (_fixate_caps_to_int), (gst_audio_convert_fixate): - add a fixation function that pretty much does the right thing (fixes - #137556) - -2004-03-20 David I. Lehn <dlehn@users.sourceforge.net> - - * configure.ac: GST_PACKAGE default: s/GStreamer/GStreamer Plugins/ - -2004-03-20 Tim-Phillip Müller <t.i.m@zen.co.uk> - - reviewed by: Benjamin Otte <otte@gnome.org> - - * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): - terminate gst_event_new_discontinuous correctly (fixes parts of - #137711) - -2004-03-19 David Schleef <ds@schleef.org> - - * gst-libs/gst/Makefile.am: Enable xoverlay unconditionally, - since it doesn't depend on X, and it's part of our ABI. - -2004-03-19 Iain <iain@prettypeople.org> - - * gst/interleave/deinterleave.c (deinterleave_sink_link): Use the - is_int in the structure, not the local variable. - -2004-03-19 David Schleef <ds@schleef.org> - - * ext/librfb/gstrfbsrc.c: (gst_rfbsrc_change_state), - (gst_rfbsrc_init), (gst_rfbsrc_getcaps), (gst_rfbsrc_fixate), - (gst_rfbsrc_link), (gst_rfbsrc_paint_rect), (gst_rfbsrc_get): - Improvements in caps negotiation. - -2004-03-18 Thomas Vander Stichele <thomas at apestaart dot org> - - * po/LINGUAS: - * po/af.po: - adding Afrikaans (Petri Jooste) - -2004-03-18 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcolorspace_chain): - throw error instead of g_critical (#137588) - -2004-03-18 Thomas Vander Stichele <thomas at apestaart dot org> - - * Makefile.am: - * configure.ac: - dist common and m4 correctly - * po/sv.po: - -2004-03-17 David Schleef <ds@schleef.org> - - * pkgconfig/gstreamer-media-info.pc.in: Add Version. - (bug #137348) - -2004-03-17 Thomas Vander Stichele <thomas at apestaart dot org> - - * po/LINGUAS: - * po/sv.po: - adding Swedish translation (Christian Rose) - -2004-03-17 Thomas Vander Stichele <thomas at apestaart dot org> - - * Makefile.am: use release.mak - -2004-03-16 Thomas Vander Stichele <thomas at apestaart dot org> - - * common/ChangeLog: - * common/gst-autogen.sh: - add some explanation about the version detection - * configure.ac: - fix X check - -2004-03-16 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: bump nano to 1 - -=== release 0.8.0 === - -2004-03-16 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: release 0.8.0, "Pharmaceutical Itch" - -2004-03-16 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - update libtool version - * gst-libs/gst/media-info/Makefile.am: - actually use libtool version - -2004-03-15 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: fix speex detection to work with 1.0 but not 1.1 - -2004-03-15 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - * gst-plugins.spec.in: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-gconf-uninstalled.pc.in: - * pkgconfig/gstreamer-interfaces-uninstalled.pc.in: - * pkgconfig/gstreamer-libs-uninstalled.pc.in: - * pkgconfig/gstreamer-libs.pc.in: - * pkgconfig/gstreamer-media-info-uninstalled.pc.in: - * pkgconfig/gstreamer-play-uninstalled.pc.in: - * pkgconfig/gstreamer-plugins-uninstalled.pc.in: - * pkgconfig/gstreamer-plugins.pc.in: - remove @VERSION@ from some of the pc files since core and plugins - are decoupled. - created gstreamer-plugins.pc as it's a better name, but keeping - -libs around for now to get fixes upstream done first. - -2004-03-15 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/play/play.c: (gst_play_get_framerate), - (gst_play_get_sink_element): First draft of gst_play_get_framerate. - * gst-libs/gst/play/play.h: - -2004-03-15 Thomas Vander Stichele <thomas at apestaart dot org> - - * *.c, *.cc: don't mix tabs and spaces - -2004-03-15 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/play/play.c: (gst_play_pipeline_setup): - use the new ffmpegcolorspace - * gst-plugins.spec.in: - package new colorspace and media-info - * configure.ac: - * pkgconfig/Makefile.am: - fix some more disting issues - * pkgconfig/gstreamer-media-info-uninstalled.pc.in: - * pkgconfig/gstreamer-media-info.pc.in: - generate media-info pc files - -2004-03-15 Johan Dahlin <johan@gnome.org> - - * *.h: Revert indenting - -2004-03-15 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - adding ffmpegcolorspace element - * gst/ffmpegcolorspace/Makefile.am: - * gst/ffmpegcolorspace/avcodec.h: - * gst/ffmpegcolorspace/common.h: - * gst/ffmpegcolorspace/dsputil.c: (dsputil_static_init): - * gst/ffmpegcolorspace/dsputil.h: - * gst/ffmpegcolorspace/gstffmpeg.c: (plugin_init): - * gst/ffmpegcolorspace/gstffmpegcodecmap.c: - (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_pix_fmt_to_caps), - (gst_ffmpeg_caps_to_pix_fmt): - * gst/ffmpegcolorspace/gstffmpegcodecmap.h: - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcolorspace_caps_remove_format_info), - (gst_ffmpegcolorspace_getcaps), (gst_ffmpegcolorspace_pad_link), - (gst_ffmpegcolorspace_get_type), (gst_ffmpegcolorspace_base_init), - (gst_ffmpegcolorspace_class_init), (gst_ffmpegcolorspace_init), - (gst_ffmpegcolorspace_chain), (gst_ffmpegcolorspace_change_state), - (gst_ffmpegcolorspace_set_property), - (gst_ffmpegcolorspace_get_property), - (gst_ffmpegcolorspace_register): - * gst/ffmpegcolorspace/imgconvert.c: - (avcodec_get_chroma_sub_sample), (avcodec_get_pix_fmt_name), - (avcodec_get_pix_fmt), (avpicture_fill), (avpicture_layout), - (avpicture_get_size), (avcodec_get_pix_fmt_loss), - (avg_bits_per_pixel), (avcodec_find_best_pix_fmt1), - (avcodec_find_best_pix_fmt), (img_copy_plane), (img_copy), - (yuv422_to_yuv420p), (yuv422_to_yuv422p), (yuv422p_to_yuv422), - (C_JPEG_TO_CCIR), (img_convert_init), (img_apply_table), - (shrink41), (shrink21), (shrink12), (shrink22), (shrink44), - (grow21_line), (grow41_line), (grow21), (grow22), (grow41), - (grow44), (conv411), (gif_clut_index), (build_rgb_palette), - (bitcopy_n), (mono_to_gray), (monowhite_to_gray), - (monoblack_to_gray), (gray_to_mono), (gray_to_monowhite), - (gray_to_monoblack), (avpicture_alloc), (avpicture_free), - (is_yuv_planar), (img_convert), (get_alpha_info_pal8), - (img_get_alpha_info), (deinterlace_line), - (deinterlace_line_inplace), (deinterlace_bottom_field), - (deinterlace_bottom_field_inplace), (avpicture_deinterlace): - * gst/ffmpegcolorspace/imgconvert_template.h: - * gst/ffmpegcolorspace/mem.c: (av_malloc), (av_realloc), (av_free): - * gst/ffmpegcolorspace/mmx.h: - * gst/ffmpegcolorspace/utils.c: (avcodec_init): - adding ffmpegcolorspace element supplied by Ronald after cleaning - up and pulling in the right bits of upstream source. - I'm sure a better C/compiler wizard could do some cleaning up (for - example use GLIB's malloc stuff), but as a first pass this - works very well - -2004-03-15 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/alsa/gstalsa.h: - I assume Ronald forgot to commit the change to have cardname - as a struct member. Expect some public spanking at the next - opportunity. - -2004-03-15 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsa.c: (gst_alsa_get_property), - (gst_alsa_open_audio), (gst_alsa_close_audio): - * ext/alsa/gstalsa.c: - Don't open the device if we're a mixer (= padless). - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_class_init), - (gst_alsa_mixer_init), (gst_alsa_mixer_open), - (gst_alsa_mixer_close), (gst_alsa_mixer_change_state): - Open mixer during state change rather than during object - initialization. Also, get a device name. Currently in a somewhat - hackish fashion, but I didn't really find something better. - -2004-03-14 Thomas Vander Stichele <thomas at apestaart dot org> - - * *.c, *.h: run gst-indent - -2004-03-14 Benjamin Otte <otte@gnome.org> - - * gst/modplug/gstmodplug.cc: - * gst/modplug/gstmodplug.h: - set correct timestamps on outgoing buffers - -2004-03-14 Benjamin Otte <otte@gnome.org> - - * gst/modplug/gstmodplug.cc: - handle events - don't do crap when a discont arrives that's not - necessary - This allows correct loading and playback of mods in Rhythmbox - -2004-03-14 Benjamin Otte <otte@gnome.org> - - * configure.ac: - * gst-libs/gst/gconf/Makefile.am: - * pkgconfig/Makefile.am: - move gstreamer-gconf pkgconfig files to pkgconfig/ dir. Make sure - they get rebuilt properly - * configure.ac: - when checking for vorbis, try pkgconfig first. - * gst/modplug/gstmodplug.cc: - add fixate function - -2004-03-14 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): - Fix for obvious mistake, where we first shift the offset and then - read a samplesize element assuming the old offset. Note that this - part still has something weird, i.e. my movies containing those - don't actually play well, but at least there's something that looks - like sound now. - -2004-03-14 Jan Schmidt <thaytan@mad.scientist.com> - * gst/typefind/gsttypefindfunctions.c: (speex_type_find), - (plugin_init): - Add a typefind function for speex format - -2004-03-13 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_video_caps), - (gst_asf_demux_setup_pad): - Use 25fps as our "fake" fps value (marked for fixage in 0.9.x) - instead of 0. Reason is simple: some elements have a fps range - of 1-max instead of 0-max. So now ASF video actually works. - -2004-03-13 Thomas Vander Stichele <thomas at apestaart dot org> - - * po/LINGUAS: - * po/sr.po: - adding serbian as a language - -2004-03-13 Benjamin Otte <otte@gnome.org> - - * gst/sine/gstsinesrc.c: (gst_sinesrc_get): - return taglist correctly from _get function, don't gst_pad_push it. - (fixes #137042) - -2004-03-13 Jan Schmidt <thaytan@mad.scientist.com> - * ext/alsa/gstalsa.c: (gst_alsa_class_probe_devices): - -2004-03-13 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_free_list): - * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_class_init), - (gst_alsa_mixer_track_new): - * ext/alsa/gstalsamixertrack.h: - Fix ancient leftovers... MixerTrack is a GObject. - -2004-03-13 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsa.c: (gst_alsa_class_probe_devices): - * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): - Don't block during probing... - -2004-03-12 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsa.c: (gst_alsa_get_type), (gst_alsa_class_init), - (gst_alsa_get_property), (gst_alsa_probe_get_properties), - (gst_alsa_class_probe_devices), (gst_alsa_class_list_devices), - (gst_alsa_probe_probe_property), (gst_alsa_probe_needs_probe), - (gst_alsa_probe_get_values), (gst_alsa_probe_interface_init), - (gst_alsa_open_audio), (gst_alsa_close_audio): - * ext/alsa/gstalsa.h: - Add propertyprobe interface implementation, add some device-name - property, all this so that it looks good in gnome-volume-control. - -2004-03-12 David Schleef <ds@schleef.org> - - * configure.ac: the Hermes library controls hermescolorspace, not - colorspace. - * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_base_init), - (gst_mpeg2dec_init): minor pet peeve: disable code with #ifdef, - not /* */ - * ext/sdl/sdlvideosink.c: Change XID to unsigned long. - * ext/sdl/sdlvideosink.h: ditto. - * gst/colorspace/gstcolorspace.c: Fix old comments about Hermes - -2004-03-12 Benjamin Otte <otte@gnome.org> - - * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_set_xwindow_id), - (gst_x_overlay_got_xwindow_id): - * gst-libs/gst/xoverlay/xoverlay.h: - replace XID with unsigned long to get rid of the xlibs dependency in - XOverlay (fixes #137004) - -2004-03-13 Jan Schmidt <thaytan@mad.scientist.com> - * gst/effectv/gstaging.c: (gst_agingtv_base_init), - (gst_agingtv_setup): - * gst/effectv/gstdice.c: (gst_dicetv_get_type), - (gst_dicetv_base_init), (gst_dicetv_class_init), - (gst_dicetv_setup), (gst_dicetv_init), (gst_dicetv_draw): - * gst/effectv/gstedge.c: (gst_edgetv_get_type), - (gst_edgetv_base_init), (gst_edgetv_class_init), (gst_edgetv_init), - (gst_edgetv_setup), (gst_edgetv_rgb32): - * gst/effectv/gsteffectv.c: - * gst/effectv/gstquark.c: (gst_quarktv_link), (gst_quarktv_init), - (gst_quarktv_set_property): - * gst/effectv/gstrev.c: (gst_revtv_get_type), - (gst_revtv_base_init), (gst_revtv_class_init), (gst_revtv_init), - (gst_revtv_setup), (gst_revtv_rgb32): - * gst/effectv/gstshagadelic.c: (gst_shagadelictv_get_type), - (gst_shagadelictv_base_init), (gst_shagadelictv_class_init), - (gst_shagadelictv_init), (gst_shagadelictv_setup), - (gst_shagadelictv_rgb32): - * gst/effectv/gstvertigo.c: (gst_vertigotv_get_type), - (gst_vertigotv_base_init), (gst_vertigotv_class_init), - (gst_vertigotv_setup), (gst_vertigotv_init), (gst_vertigotv_rgb32): - * gst/effectv/gstwarp.c: - Port everything that can be ported to videofilter and fix up the caps. - Can someone with a big-endian machine please check these? - -2004-03-10 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_get_time), - (gst_osssink_chain), (gst_osssink_change_state): - Latest fixes for A/V sync, audio playback and such. This is about - all... MPEG playback issues are mostly related to the async build- - up of MPEG files, I cannot fix that. Use basicgthread to solve it. - -2004-03-10 Thomas Vander Stichele <thomas at apestaart dot org> - - patch from: Stephane Loeuillet - - * configure.ac: - use pkg-config for some libraries, falling back to the old .m4 way - (fixes #131270) - * m4/libdv.m4: - removed - -2004-03-10 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - * tools/Makefile.am: - * tools/Makefile.in: - * tools/gst-launch-ext-m.m: - * tools/gst-launch-ext.1.in: - * tools/gst-visualise-m.m: - * tools/gst-visualise.1: - * tools/gst-visualise.1.in: - reorganizing generation of script tools - -2004-03-10 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/divx/gstdivxdec.c: - Downgrade priority. We prefer ffdec_mpeg4. - * ext/faad/gstfaad.c: (gst_faad_srcgetcaps), (gst_faad_srcconnect), - (gst_faad_chain), (gst_faad_change_state): - Fix capsnego. Doesn't work for some sounds because we don't have - a 5:1 to stereo element. - * ext/xvid/gstxvid.c: (plugin_init): - Add priority. - * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), - (gst_osssink_change_state): - Add discont handling. - -2004-03-09 Colin Walters <walters@verbum.org> - - * gst/audioconvert/gstaudioconvert.c: Fix typo in width 8 - conversion. - -2004-03-09 Benjamin Otte <otte@gnome.org> - - * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init): - the signals take 2 arguments - -2004-03-09 David Schleef <ds@schleef.org> - - * ext/alsa/gstalsa.c: (gst_alsa_request_new_pad), - (gst_alsa_fixate): Add fixate function. (bug #136686) - * ext/alsa/gstalsa.h: - * ext/alsa/gstalsasink.c: (gst_alsa_sink_init): - -2004-03-09 Benjamin Otte <otte@gnome.org> - - * ext/mikmod/gstmikmod.c: (gst_mikmod_init), (gst_mikmod_loop), - (gst_mikmod_change_state): - * ext/mikmod/gstmikmod.h: - make mikmod's loop function not loop infinitely and call - gst_element_yield anymore - * gst/modplug/gstmodplug.cc: - fix pad negotiation (fixes #136590) - -2004-03-09 David Schleef <ds@schleef.org> - - * ext/lcs/Makefile.am: Fix so that the lcs colorspace plugin - doesn't conflict with the internal colorspace plugin. - * gst-libs/gst/audio/make_filter: Use `` instead of $() to - satisfy the crappy-ass shell shipped by a certain vendor. - * gst/videofilter/make_filter: same (bug #135299) - -2004-03-09 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: bump nano to 1 - -=== release 0.7.6 === - -2004-03-09 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.in: releasing 0.7.6, "There" - -2004-03-09 Thomas Vander Stichele <thomas at apestaart dot org> - - * pkgconfig/gstreamer-play-uninstalled.pc.in: - * pkgconfig/gstreamer-play.pc.in: - synchronize the two - -2004-03-09 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_base_init), - (cdparanoia_open), (cdparanoia_event): - fix/add error handling - * po/POTFILES.in: - add cdparanoia source - * tools/Makefile.am: - make scripts executable - -2004-03-09 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - * ext/vorbis/Makefile.am: - * sys/Makefile.am: - remove id3types, vorbisfile and xvideosink from the build (#133783) - -2004-03-08 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): - Fix metadata read crash (#136537). - -2004-03-08 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/media-info/media-info-priv.c: (gmi_set_mime): - * gst-libs/gst/media-info/media-info.c: (gst_media_info_read): - adding mime types, fixing the one-stop function - -2004-03-08 Christian Schaller <Uraeus@gnome.org> - - * ext/nas/nassink.c and /ext/nas/nassink.h: - More NAS love from Arwed von Merkatz - So lets all sing 'Can you feel the NAS tonight' - -2004-03-08 Christian Schaller <Uraeus@gnome.org> - - * tools/gst-launch-ext.in: - Replace vorbisfile with oggdemux/vorbisdec/audioconvert - -2004-03-08 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_base_init), - (gst_mpeg2dec_init): - remove the user_data pad for now, because it is being used in - fixating causing MPEG playback to fixate on 1000 Hz for playback. - If someone knows how to fix this properly, please do. - -2004-03-08 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/oss/gstosssink.c: (gst_osssink_get_delay), - (gst_osssink_get_time): - add a warning, IMO this won't get triggered anymore, remove later - -2004-03-07 David Schleef <ds@schleef.org> - - * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Added Cinepak - format (bug #136470) - -2004-03-07 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/Makefile.am: - * gst-libs/gst/media-info/Makefile.am: - * gst-libs/gst/media-info/media-info-priv.c: (found_tag_callback), - (error_callback), (gst_media_info_error_create), - (gst_media_info_error_element), (gmip_init), (gmip_reset), - (gmi_clear_decoder), (gmip_find_type_pre), (gmip_find_type): - * gst-libs/gst/media-info/media-info-priv.h: - * gst-libs/gst/media-info/media-info-test.c: (main): - * gst-libs/gst/media-info/media-info.c: (gst_media_info_init), - (gst_media_info_class_init), (gst_media_info_instance_init), - (gst_media_info_set_source), (gst_media_info_read_with_idler), - (gst_media_info_read_idler), (gst_media_info_read): - * gst-libs/gst/media-info/media-info.h: - fixed, should work now - -2004-03-07 Christian Schaller <Uraeus@gnome.org> - - * ext/nas/nassink.c: - A bunch of NAS fixes from Arwed von Merkatz - -2004-03-06 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), - (qtdemux_parse_trak): - Fix crash (j might be greater than n_samples, in which case we're - writing outside the allocated space for the array) and memleak. - -2004-03-06 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * sys/oss/gstosssink.c: (gst_osssink_chain): - And another caller that couldn't handle delay < 0 (unsigned - integer overflow). Video now continues playing on an audio - buffer underrun, and the clock continues working. Audio still - stalls. - -2004-03-06 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * sys/oss/gstosssink.c: (gst_osssink_get_delay), - (gst_osssink_get_time): - get_delay() may return values lower than 0. In those cases, we - should not actually cast to *unsigned* int64, that will break - stuff horribly. In my case, it screwed up A/V sync in movies - in totem rather badly. - -2004-03-06 Christophe Fergeau <teuf@gnome.org> - - * ext/faac/gstfaac.c: (gst_faac_chain): - * ext/flac/gstflactag.c: (gst_flac_tag_chain): - * ext/libpng/gstpngenc.c: (user_write_data): - * ext/mikmod/gstmikmod.c: (gst_mikmod_loop): - * gst/ac3parse/gstac3parse.c: (gst_ac3parse_chain): - * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_chain_subtitle): - * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_add_slice): - Fix several misuse of gst_buffer_merge (it doesn't take ownership - of any buffer), should fix some leaks. I hope I didn't unref buffers - that shouldn't be... - -2004-03-06 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/media-info/media-info-priv.c: (have_type_callback), - (deep_notify_callback), (tag_flag_score), (found_tag_callback), - (error_callback), (gmi_reset), (gmi_seek_to_track), - (gmi_get_decoder), (gmi_set_mime), (gmip_find_type_pre), - (gmip_find_type_post), (gmip_find_stream_post), - (gmip_find_track_streaminfo_post): - * gst-libs/gst/media-info/media-info-priv.h: - * gst-libs/gst/media-info/media-info-test.c: (print_tag), - (info_print), (main): - * gst-libs/gst/media-info/media-info.c: - (gst_media_info_error_create), (gst_media_info_error_element), - (gst_media_info_instance_init), (gst_media_info_get_property), - (gst_media_info_new), (gst_media_info_set_source), - (gst_media_info_read_idler), (gst_media_info_read): - * gst-libs/gst/media-info/media-info.h: - first pass at making this work again. This seems to work on - tagged ogg/vorbis and mp3 files. - -2004-03-06 Benjamin Otte <otte@gnome.org> - - * ext/mad/gstid3tag.c: (gst_id3_tag_chain): - fix huge leak: gst_buffer_merge doesn't unref the first argument - itself. - -2004-03-06 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/mad/gstmad.c: (gst_mad_class_init), (gst_mad_update_info): - report layer/mode/emphasis - -2004-03-06 Christophe Fergeau <teuf@gnome.org> - - * ext/mad/gstmad.c: (gst_mad_chain): fixed caps leak - -2004-03-06 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/ogg/gstoggdemux.c: (gst_ogg_pad_new): - signal serial - -2004-03-06 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/vorbis/vorbis.c: (plugin_init): - * ext/vorbis/vorbisdec.c: (vorbis_dec_get_formats), - (gst_vorbis_dec_init), (vorbis_dec_event): - add debug category - make vorbisdec handle _BYTE and _TIME queries - -2004-03-06 Christophe Fergeau <teuf@gnome.org> - - * ext/mad/gstmad.c: (gst_mad_chain): send the average bitrate read - from the xing header - -2004-03-06 Benjamin Otte <otte@gnome.org> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_getcaps), - (gst_audio_convert_link), (gst_audio_convert_change_state), - (gst_audio_convert_buffer_from_default_format): - do conversions from/to float correctly, fix some caps nego errors, - export correct supported caps in template and getcaps, use correct - caps in try_set_caps functions - -2004-03-06 Christophe Fergeau <teuf@gnome.org> - - For some reason, I only committed a ChangeLog entry yesterday and - not the corresponding code... - * ext/mad/gstmad.c: Fix detection of Xing headers - * gst/tags/gstid3tag.c: Changes to support TLEN tags - -2004-03-06 Benjamin Otte <otte@gnome.org> - - * ext/ogg/gstoggdemux.c: (gst_ogg_get_pad_by_pad), - (gst_ogg_demux_src_query): - make sure to handle the case where there's no current chain - gracefully. - -2004-03-05 David Schleef <ds@schleef.org> - - * ext/aalib/gstaasink.c: (gst_aasink_fixate), (gst_aasink_init): - Add fixate function. (bug #131128) - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_init), - (gst_sdlvideosink_fixate): Add fixate function. - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): - Fix attempt to print a non-pointer using GST_PTR_FORMAT. - * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt): - Fix missing break that was causing ulaw to be interpreted as - raw int. - -2004-03-05 David Schleef <ds@schleef.org> - - * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_add_slice): - Fix code that ignores return value of gst_buffer_merge(). - (bug #114560) - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_descramble_segment): - * gst/mpegstream/gstrfc2250enc.c: (gst_rfc2250_enc_add_slice): same - * testsuite/gst-lint: Check for above. - -2004-03-05 David Schleef <ds@schleef.org> - - * gst/udp/gstudpsrc.c: (gst_udpsrc_get): Check for unfixed - caps and throw an element error. (bug #136334) - -2004-03-05 David Schleef <ds@schleef.org> - - * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_srcgetcaps), - (gst_faad_chain): Fix negotiation. - * ext/librfb/gstrfbsrc.c: (gst_rfbsrc_handle_src_event): Add - key and button events. - * gst-libs/gst/floatcast/floatcast.h: Fix a minor bug in this - dung heap of code. - * gst-libs/gst/gconf/gstreamer-gconf-uninstalled.pc.in: gstgconf - depends on gconf - * gst-libs/gst/gconf/gstreamer-gconf.pc.in: same - * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), - (gst_play_video_fixate), (gst_play_audio_fixate): Add a fixate - function to encourage better negotiation, particularly between - audioconvert and osssink. - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain): - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): Make some debugging - more important. - * gst/typefind/gsttypefindfunctions.c: Fix mistake in flash - typefinding. - * gst/vbidec/vbiscreen.c: Add glib header - * pkgconfig/gstreamer-play.pc.in: Depends on gst-interfaces. - -2004-03-06 Christophe Fergeau <teuf@users.sourceforge.net> - - * ext/mad/gstmad.c: Fix detection of Xing headers - * gst/tags/gstid3tag.c: Changes to support TLEN tags - -2004-03-06 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), - (gst_wavparse_pad_convert), (gst_wavparse_pad_query): - debug updates - -2004-03-06 Christophe Fergeau <teuf@gnome.org> - - * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): - * ext/mad/gstmad.c: (gst_mad_init), (is_xhead), - (mpg123_parse_xing_header), (gst_mad_chain): parse Xing header in vbr - files, and report the parsed length as a GST_TAG_DURATION tag. - * gst/tags/gstid3tag.c: support TLEN (duration) tag - -2004-03-05 Benjamin Otte <otte@gnome.org> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_channels): - convert channels correctly. convert correctly to unsigned. - -2004-03-05 Julien MOUTTE <julien@moutte.net> - - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_change_state): Check if - we have a window before clearing it. - -2004-03-05 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_change_state): Check if we - have a window before clearing it. - -2004-03-05 Thomas Vander Stichele <thomas at apestaart dot org> - - * gconf/gstreamer.schemas.in: - * gst-libs/gst/gconf/Makefile.am: - version installation path the same way as for 0.6 - * pkgconfig/gstreamer-interfaces-uninstalled.pc.in: - * pkgconfig/gstreamer-libs-uninstalled.pc.in: - * pkgconfig/gstreamer-play-uninstalled.pc.in: - remove comment that was fixed - -2004-03-05 David Schleef <ds@schleef.org> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_src_formats), - (gst_qtdemux_src_convert), (gst_qtdemux_get_src_query_types), - (gst_qtdemux_get_event_mask), (gst_qtdemux_handle_src_query), - (gst_qtdemux_handle_src_event), (gst_qtdemux_add_stream): - Add prototype code for handling seeking and querying. - -2004-03-04 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * examples/gstplay/player.c: (main): - Initialize variables to NULL. Prevents a segfault because the - (uninitialized) variable is not NULL, resulting in a crash on - trying to reach error->message. - -2004-03-05 Benjamin Otte <otte@gnome.org> - - * gst/audioconvert/gstaudioconvert.c: - (gst_audio_convert_buffer_to_default_format): - make float=>int conversion work correctly even in cornercases. - -2004-03-04 David I. Lehn <dlehn@users.sourceforge.net> - - * debian/README.Debian: - * debian/build-deps: - * debian/changelog: - * debian/control: - * debian/control.in: - * debian/copyright: - * debian/gstreamer-a52dec.files: - * debian/gstreamer-aa.files: - * debian/gstreamer-alsa.files: - * debian/gstreamer-alsa.manpages: - * debian/gstreamer-arts.files: - * debian/gstreamer-artsd.files: - * debian/gstreamer-audiofile.files: - * debian/gstreamer-avifile.files: - * debian/gstreamer-cdparanoia.files: - * debian/gstreamer-colorspace.files: - * debian/gstreamer-doc.files: - * debian/gstreamer-dv.files: - * debian/gstreamer-dvd.files: - * debian/gstreamer-esd.files: - * debian/gstreamer-festival.files: - * debian/gstreamer-flac.files: - * debian/gstreamer-gconf.conffiles: - * debian/gstreamer-gconf.files: - * debian/gstreamer-gconf.postinst: - * debian/gstreamer-gnomevfs.files: - * debian/gstreamer-gsm.files: - * debian/gstreamer-http.files: - * debian/gstreamer-jack.files: - * debian/gstreamer-jpeg.files: - * debian/gstreamer-mad.files: - * debian/gstreamer-mikmod.files: - * debian/gstreamer-misc.files: - * debian/gstreamer-mpeg2dec.files: - * debian/gstreamer-oss.files: - * debian/gstreamer-plugin-apps.files: - * debian/gstreamer-plugin-apps.manpages: - * debian/gstreamer-plugin-libs-dev.files: - * debian/gstreamer-plugin-libs.files: - * debian/gstreamer-plugin-template.postinst: - * debian/gstreamer-plugin-template.postrm: - * debian/gstreamer-sdl.files: - * debian/gstreamer-sid.files: - * debian/gstreamer-vorbis.files: - * debian/gstreamer-x.files: - * debian/mk.control: - * debian/rules: - Debian package info not maintained here. - -2004-03-04 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/aalib/gstaasink.c: (gst_aasink_class_init): - * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init): - * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init): - * ext/divx/gstdivxenc.c: (gst_divxenc_class_init): - * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_class_init): - * ext/gsm/gstgsmenc.c: (gst_gsmenc_class_init): - * ext/jpeg/gstjpegenc.c: (gst_jpegenc_class_init): - * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init): - * ext/speex/gstspeexenc.c: (gst_speexenc_class_init): - * ext/xvid/gstxvidenc.c: (gst_xvidenc_class_init): - * gst-libs/gst/colorbalance/colorbalance.c: - (gst_color_balance_class_init): - * gst-libs/gst/colorbalance/colorbalancechannel.c: - (gst_color_balance_channel_class_init): - * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init): - * gst-libs/gst/play/play.c: (gst_play_class_init): - * gst-libs/gst/propertyprobe/propertyprobe.c: - (gst_property_probe_iface_init): - * gst-libs/gst/tuner/tuner.c: (gst_tuner_class_init): - * gst-libs/gst/tuner/tunerchannel.c: - (gst_tuner_channel_class_init): - * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_base_init): - * gst/cutter/gstcutter.c: (gst_cutter_class_init): - * gst/effectv/gstvertigo.c: (gst_vertigotv_class_init): - * sys/cdrom/gstcdplayer.c: (cdplayer_class_init): - * sys/dxr3/dxr3spusink.c: (dxr3spusink_class_init): - * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_class_init): - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init): - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init): - fix signals to use - instead of _ - * ext/libcaca/gstcacasink.h: - * ext/sdl/sdlvideosink.h: - fix header rename - -2004-03-04 David Schleef <ds@schleef.org> - - * testsuite/gst-lint: Add a check for bad signal names. - -2004-03-04 <kost@imn.htwk-leipzig.de> - - reviewed by David Schleef - - * gst/videofilter/gstgamma.c: (gst_gamma_rgb32): Fix typo that - modified the alpha channel and caused a warning. (bug #136192) - -2004-04-03 Christian Schaller <Uraeus@gnome.org> - - * gst-plugins.spec.in: - Change names of plugins to actually be correct. Try to keep things - alphabetical to avoid getting beat up by Thomas - -2004-03-03 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/gconf/gconf.c: (gst_gconf_get_default_video_sink): - Using ximagesink as a default if no gconf key found. We should - probably consider using alsasink instead of osssink for the audio - part. - -2004-03-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - fix --with-plugins, don't think it ever worked before - * gst-plugins.spec.in: - even more updates - -2004-03-01 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/sdl/sdlvideosink.h: - * sys/ximage/ximagesink.h: - * sys/xvideo/xvideosink.h: - * sys/xvimage/xvimagesink.h: - Fix for move of gstvideosink.h -> videosink.h. - -2004-03-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/xwindowlistener/Makefile.am: - this is a plugin library, not a library - -2004-03-01 David Schleef <ds@schleef.org> - - * AUTHORS: Added some names. Add yourself if you're still - missing. - -2004-03-01 David Schleef <ds@schleef.org> - - * MAINTAINERS: Add - -2004-03-01 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-plugins.spec.in: clean up spec file - -2004-03-01 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstvideosink.c: - * gst-libs/gst/video/gstvideosink.h: - rename gstvideosink.h to videosink.h to match other headers - * gst/mixmatrix/Makefile.am: - fix plugin filename - * gst/tags/Makefile.am: fix plugin filename - -2004-03-01 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/tags/Makefile.am: fix plugin filename - -2004-03-01 Thomas Vander Stichele <thomas at apestaart dot org> - - * examples/gstplay/player.c: (got_time_tick), (main): - add error handler - display time_tick more readably - * gst/mixmatrix/Makefile.am: - fix plugin file name - -2004-02-29 Christophe Fergeau <teuf@gnome.org> - - * sys/oss/gstosselement.c: (gst_osselement_probe), - (device_combination_append), (gst_osselement_class_probe_devices): - * sys/oss/gstosselement.h: - Reworked enumeration of oss dsps and mixers so that gst-mixer works - on my system using alsa oss emulation, fixes bug #135597 - -2004-02-29 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/videodrop/gstvideodrop.c: (gst_videodrop_init), - (gst_videodrop_chain), (gst_videodrop_change_state): - * gst/videodrop/gstvideodrop.h: - Work based on timestamp of input data, not based on the expected - framerate from the input. The consequence is that this element now - not only scales framerates, but also functions as a framerate - corrector or framerate stabilizer/constantizer. - -2004-02-27 David Schleef <ds@schleef.org> - - patches from jmmv@menta.net (Julio M. Merino Vidal) - - * gst/interleave/deinterleave.c: (deinterleave_chain): Fix - GST_ELEMENT_ERROR call (bug #135634) - * gst/interleave/interleave.c: (interleave_buffered_loop), - (interleave_bytestream_loop): Don't use alloca() (bug #135640) - * sys/cdrom/gstcdplayer_ioctl_bsd.h: Fix ioctls on NetBSD (bug #135645) - * sys/oss/gstosssink.c: (gst_osssink_get_delay), - (gst_osssink_chain): Fix ioctls on NetBSD. (bug #135644) - * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_sync_next_frame), - (gst_v4lmjpegsrc_set_capture), (gst_v4lmjpegsrc_set_capture_m), - (gst_v4lmjpegsrc_capture_init), (gst_v4lmjpegsrc_requeue_frame): - Fix GST_ELEMENT_ERROR call. - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_try_palette): Fix - GST_ELEMENT_ERROR call. - -2004-02-27 Benjamin Otte <otte@gnome.org> - - * gst-libs/gst/audio/audio.h: - add macro to make sure header isn't included twice - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_chunk): - don't use gst_buffer_free - * gst/playondemand/filter.func: - don't use gst_data_free. Free data only once. - -2004-02-26 David Schleef <ds@schleef.org> - - * gst-libs/gst/colorbalance/Makefile.am: - * gst-libs/gst/mixer/Makefile.am: - * gst-libs/gst/tuner/Makefile.am: - * gst/level/Makefile.am: -marshal.ch and -enum.ch files - should not be disted, -marshal.h files should not be installed, - and -enum.h files _should_ be installed. Fix to make this the - case. - -=== release 0.7.5 === - -2004-02-26 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: release 0.7.5, "Under The Sea" - -2004-02-25 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link), - (gst_audio_convert_change_state), (gst_audio_convert_get_buffer): - * gst/videoscale/gstvideoscale.c: - * sys/oss/gstosselement.c: (gst_osselement_sync_parms): - assorted debug/warning fixes - -2004-02-25 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps), - (gst_videoscale_init), (gst_videoscale_chain), - (gst_videoscale_set_property), (plugin_init): - * gst/videoscale/gstvideoscale.h: - * gst/videoscale/videoscale.c: (gst_videoscale_setup), - (gst_videoscale_scale_rgb), (gst_videoscale_planar411), - (gst_videoscale_planar400), (gst_videoscale_packed422), - (gst_videoscale_packed422rev), (gst_videoscale_32bit), - (gst_videoscale_24bit), (gst_videoscale_16bit), - (gst_videoscale_bilinear), (gst_videoscale_bicubic), - (gst_videoscale_scale_plane_slow), - (gst_videoscale_scale_point_sample), - (gst_videoscale_scale_nearest), - (gst_videoscale_scale_nearest_str2), - (gst_videoscale_scale_nearest_str4), - (gst_videoscale_scale_nearest_32bit), - (gst_videoscale_scale_nearest_24bit), - (gst_videoscale_scale_nearest_16bit): - add debugging category and use it properly - fix use of GST_PTR_FORMAT - -2004-02-25 Andy Wingo <wingo@pobox.com> - - * gst/interleave/interleave.c (interleave_buffered_loop): Always - push only when channel->buffer is NULL. Prevents segfaults doing - the state change after a nonlocal exit, like a scheme exception. - - * gst/audioconvert/gstaudioconvert.c (gst_audio_convert_getcaps): - Handle the case where the intersected caps is empty. - -2004-02-25 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/law/mulaw-decode.c: (mulawdec_link): - * gst/law/mulaw.c: (plugin_init): - fix mulawdec so it actually works again - -2004-02-24 Arwed v. Merkatz <v.merkatz@gmx.net> - - reviewed by: David Schleef <ds@schleef.org> - - * gst/videofilter/gstgamma.c: (gst_gamma_class_init), - (gst_gamma_init), (gst_gamma_set_property), - (gst_gamma_get_property), (gst_gamma_calculate_tables), - (gst_gamma_rgb24), (gst_gamma_rgb32): Adds gamma correction - for RGB, with separate r g and b correction factors. (#131167) - -2004-02-24 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/vorbis/vorbisdec.c: (vorbis_dec_chain): - only signal tags for bitrate if they're > 0 (#134894) - -2004-02-24 David Schleef <ds@schleef.org> - - * gst/qtdemux/qtdemux.c: (plugin_init), (gst_qtdemux_loop_header), - (qtdemux_parse_moov), (qtdemux_parse), (qtdemux_node_dump_foreach), - (qtdemux_dump_mvhd), (qtdemux_dump_tkhd), (qtdemux_dump_elst), - (qtdemux_dump_mdhd), (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), - (qtdemux_dump_dref), (qtdemux_dump_stsd), (qtdemux_dump_stts), - (qtdemux_dump_stss), (qtdemux_dump_stsc), (qtdemux_dump_stsz), - (qtdemux_dump_stco), (qtdemux_dump_co64), (qtdemux_dump_dcom), - (qtdemux_dump_cmvd), (qtdemux_parse_tree), (qtdemux_parse_trak): - Cleanups. Convert g_prints to GST_LOGs. Add qtdemux debug - category. Attempt to fix timestamp calculation. - -2004-02-24 Johan Dahlin <johan@gnome.org> - - * gst-libs/gst/gconf/gconf.c: Add \n to g_print error messages - -2004-02-23 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - * gconf/Makefile.am: - * gconf/gstreamer.schemas: - * gst-libs/gst/gconf/Makefile.am: - * gst-libs/gst/gconf/gconf.c: - version gconf schemas and install locations - -2004-02-23 Benjamin Otte <otte@gnome.org> - - * ext/xine/xineinput.c: (gst_xine_input_dispose): - (gst_xine_input_subclass_init): - call parent dispose. - change pad template for CD reader correctly - * ext/xine/Makefile.am: - * ext/xine/gstxine.h: - * ext/xine/xine.c: (plugin_init): - * ext/xine/xineaudiosink.c: - wrap audio sinks, too - * gst-libs/gst/resample/private.h: - * gst-libs/gst/resample/resample.c: (gst_resample_init), - (gst_resample_reinit), (gst_resample_scale), - (gst_resample_nearest_s16), (gst_resample_bilinear_s16), - (gst_resample_sinc_slow_s16), (gst_resample_sinc_s16), - (gst_resample_sinc_ft_s16), (gst_resample_nearest_float), - (gst_resample_bilinear_float), (gst_resample_sinc_slow_float), - (gst_resample_sinc_float), (gst_resample_sinc_ft_float): - * gst-libs/gst/resample/resample.h: - * gst/audioscale/gstaudioscale.c: (gst_audioscale_method_get_type), - (gst_audioscale_class_init), (gst_audioscale_link), - (gst_audioscale_get_buffer), (gst_audioscale_init), - (gst_audioscale_chain), (gst_audioscale_set_property), - (gst_audioscale_get_property): - * gst/audioscale/gstaudioscale.h: - s/resample_*/gst_resample_*/i to not clobber namespaces - -2004-02-23 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps), - (gst_riff_create_audio_caps), (gst_riff_create_iavs_caps), - (gst_riff_create_video_template_caps), - (gst_riff_create_audio_template_caps), - (gst_riff_create_iavs_template_caps): - * gst-libs/gst/riff/riff-media.h: - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init), - (gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream), - (gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream): - * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream): - * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), - (gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps), - (gst_matroska_demux_plugin_init): First batch implementing audio and - video codec tags in demuxers. - -2004-02-22 Benjamin Otte <otte@gnome.org> - - * ext/xine/Makefile.am: - * ext/xine/gstxine.h: - * ext/xine/xine.c: (plugin_init): - * ext/xine/xineinput.c: - add input plugin wrapper. Playback from files, http, mms and cdda - works. - * ext/xine/xineaudiodec.c: (gst_xine_audio_dec_chain): - remove leftover G_GNUC_UNUSED - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_stream), - (gst_asf_demux_identify_guid): - improve debugging output - -2004-02-22 Benjamin Otte <otte@gnome.org> - - reported by: Padraig O'Briain <padraig.obriain@sun.com> - - * autogen.sh: - replace test -e with test -x for mkinstalldirs to be more portable. - (fixes #134816) - -2004-02-22 Benjamin Otte <otte@gnome.org> - - reported by: Stefan Kost <kost@imn.htwk-leipzig.de> - - * gst/audioconvert/gstaudioconvert.c: (plugin_init): - set rank to PRIMARY - * gst/volume/gstvolume.c: (plugin_init): - set rank to NONE - fixes #134960 - -2004-02-22 Julio M. Merino Vidal <jmmv@menta.net> - - reviewed by Benjamin Otte <otte@gnome.org> - - * ext/flac/gstflacenc.c: (gst_flacenc_chain): - escape NULL strings in GST_ELEMENT_ERROR properly (fixes #135116) - -2004-02-22 Benjamin Otte <otte@gnome.org> - - * configure.ac: - export _*{gst,Gst,GST}.* symbols from plugins - -2004-02-22 Christophe Fergeau <teuf@gnome.org> - - reviewed by: Benjamin Otte <otte@gnome.org> - - * ext/lame/gstlame.c: (add_one_tag): - * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): - * ext/vorbis/vorbisenc.c: (gst_vorbisenc_get_tag_value), - (gst_vorbisenc_metadata_set1): - * gst/tags/gstid3tag.c: - * gst/tags/gstvorbistag.c: (gst_vorbis_tag_add): - apply fixes from bugs #135042 (lame can't write tags) and #133817 - (add GST_ALBUM_VOLUME_{COUNT,NUMBER} tags) - -2004-02-22 Ramon Garcia <ramon_garcia_f@yahoo.com> - - * configure.ac: Export only gst_plugin_desc from plugins. - Note that this change only makes any effect with Linux using libtool - 1.5.2 or higher. Otherwise it is silently ignored, but it would build - fine. And don't try to have several versions of libtool in different - directories. - -2004-02-20 Andy Wingo <wingo@pobox.com> - - * gst/intfloat/, gst/oneton: Removed, replaced by audioconvert and - interleave respectively. - - * gst/interleave/deinterleave.c: New plugin: deinterleave - (replaces on oneton). - * gst/interleave/interleave.c: New plugin: interleave. - * gst/interleave/plugin.h: Support file. - * gst/interleave/plugin.c: Support file. - - * configure.ac: Remove intfloat and oneton, add interleave. - - * ext/sndfile/gstsf.c: Handle events better. - - * gst/audioconvert/gstaudioconvert.c: Change to support int2float - and float2int operation. int2float has scheduling problems as - noted in in2float_chain. - -2004-02-20 Benjamin Otte <otte@gnome.org> - - * ext/xine/Makefile.am: - * ext/xine/gstxine.h: - * ext/xine/xine.c: - * ext/xine/xineaudiodec.c: - * ext/xine/xinecaps.c: - add first version of xine plugin wrapper. Currently only wraps the - QDM2 win32 DLL, and even that only in proof-of-concept quality. - * configure.ac: - * ext/Makefile.am: - add xine plugin wrapper, disabled by default. Use --enable-xine to - build. Note that it'll segfault on gst-register if you don't remove - the goom and tvtime post plugins from xine. - * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), - (qtdemux_parse), (qtdemux_parse_trak), (qtdemux_audio_caps): - add extradata parsing for QDM2. - change around debugging prints. - -2004-02-19 Benjamin Otte <otte@gnome.org> - - * ext/lame/gstlame.c: (gst_lame_chain): - * ext/vorbis/vorbisenc.c: (gst_vorbisenc_chain): - use gst_tag_list_insert when you want to insert tags - -2004-02-18 David Schleef <ds@schleef.org> - - * configure.ac: Move massink to gst-rotten - * ext/Makefile.am: - * ext/mas/Makefile.am: - * ext/mas/massink.c: - * ext/mas/massink.h: - -2004-02-18 David Schleef <ds@schleef.org> - - * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): Disable gdk_pixbuf - typefinding, since it seems to be worse than nothing. - * gst/typefind/gsttypefindfunctions.c: (qt_type_find): Add ftyp - atom to recognize .mp4 and .m4a files as video/quicktime. - -2004-02-18 David Schleef <ds@schleef.org> - - * gst/sine/demo-dparams.c: (quit_live), - (dynparm_log_value_changed), (dynparm_value_changed), (main): - Use double dparams, not float. - * gst/sine/gstsinesrc.c: (gst_sinesrc_class_init), - (gst_sinesrc_init): Change sync default to FALSE, since multiple - sync'd elements don't really work correctly. - * gst/volume/gstvolume.c: (volume_class_init), (volume_init), - (volume_update_volume), (volume_get_property): Change dparam - to double. - -2004-02-18 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: - (gst_ximagesink_xwindow_update_geometry), - (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents), - (gst_ximagesink_change_state), (gst_ximagesink_expose), - (gst_ximagesink_init): Rework the way software video scaling works. So - now we check on each chain call if the video frames are feeling the - window. If not we try to renegotiate caps. On failure we memorize that - and we won't try again for that PLAYING sessions. - * sys/ximage/ximagesink.h: Adding a boolean to store the caps renego - failure. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_init): initialize the - synchronous flag. - -2004-02-18 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/play/play.c: (gst_play_pipeline_setup): - break up _link so we can give a better debug message for errors - -2004-02-18 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): - set up debug category - -2004-02-18 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), - (gst_ximagesink_handle_xevents), (gst_ximagesink_expose): Reorganizing - the way renegotiation work. The event handling function is not taking - care of external windows and renegotiate method check for pad flags - NEGOTIATING. Should fix : #133209 - -2004-02-17 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_expose): Checking if the - pad is negotiating before trying renegotiation. - -2004-02-17 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_type_find): - pass on all possible mime types as typefind hints - -2004-02-17 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new): Fix a - possible SHM leak if we crash. All other apps using XShm are doing - that. - -2004-02-17 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), - (gst_ximagesink_expose): Renegotiate size on expose. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_expose): Update window - size on expose. - -2004-02-16 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * testsuite/alsa/sinesrc.c: - cosmetic fix to fix compile issue with gcc 2.95.4 - -2004-02-16 Julien MOUTTE <julien@moutte.net> - - * ext/alsa/gstalsa.c: (gst_alsa_open_audio), - (gst_alsa_timestamp_to_bytes): Alsa should trigger an error if it - failed opening the audio device. - * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), - (gst_ximagesink_ximage_destroy), (gst_ximagesink_ximage_put), - (gst_ximagesink_xwindow_new), (gst_ximagesink_xwindow_destroy), - (gst_ximagesink_xwindow_resize), (gst_ximagesink_xwindow_clear), - (gst_ximagesink_renegotiate_size), (gst_ximagesink_handle_xevents), - (gst_ximagesink_xcontext_get), (gst_ximagesink_xcontext_clear), - (gst_ximagesink_change_state), (gst_ximagesink_chain), - (gst_ximagesink_set_xwindow_id): Clearing window in READY TO PAUSED. - Removing some useless g_return_if_fail like wingo suggested. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), - (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xvimage_put), - (gst_xvimagesink_xwindow_new), (gst_xvimagesink_xwindow_destroy), - (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_xwindow_clear), - (gst_xvimagesink_update_colorbalance), - (gst_xvimagesink_handle_xevents), (gst_xvimagesink_xcontext_get), - (gst_xvimagesink_xcontext_clear), - (gst_xvimagesink_get_fourcc_from_caps), - (gst_xvimagesink_change_state), (gst_xvimagesink_chain), - (gst_xvimagesink_set_xwindow_id), - (gst_xvimagesink_colorbalance_list_channels), - (gst_xvimagesink_colorbalance_set_value), - (gst_xvimagesink_colorbalance_get_value): Clearing window in READY TO - PAUSED. Removing some useless g_return_if_fail like wingo suggested. - -2004-02-16 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain): - throw error when not negotiated instead of asserting - -2004-02-15 Julien MOUTTE <julien@moutte.net> - - * gst/switch/gstswitch.c: (gst_switch_loop): More fixes for - correct data refcounting. - -2004-02-15 Julien MOUTTE <julien@moutte.net> - - * gst/switch/gstswitch.c: (gst_switch_change_state), - (gst_switch_class_init): Cleaning the sinkpads correctly on state - change, mostly the EOS flag. - -2004-02-15 Julien MOUTTE <julien@moutte.net> - - * examples/gstplay/player.c: (got_eos), (main): Adding some - output for debugging. - * gst-libs/gst/play/play.c: (gst_play_state_change): Stop our - timeouts if we go to any state different from PLAYING. - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): Fix some - more EOS bugs in riff lib. - -2004-02-14 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/play/play.c: (gst_play_connect_visualization): Disable - visualization until i find a way to fix switch correctly. - * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): Fix a bug when - EOS arrives. - * gst/switch/gstswitch.c: (gst_switch_release_pad), - (gst_switch_request_new_pad), (gst_switch_poll_sinkpads), - (gst_switch_loop), (gst_switch_dispose), (gst_switch_class_init): - Reworked switch to get a more correct behaviour with events and refing - of data stored in sinkpads. - * gst/switch/gstswitch.h: Adding an eos flag for every sinkpad so that - we don't pull from a pad in EOS. - -2004-02-14 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/mad/gstid3tag.c: (gst_id3_tag_chain): - remove v1 tag even if we can't read it (makes sure we don't detect - it again) - -2004-02-14 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/alsa/gstalsa.c: (gst_alsa_pcm_wait), - (gst_alsa_xrun_recovery): - * ext/alsa/gstalsa.h: - try xrun recovery when wait failed. Make xrun recovery function - return TRUE/FALSE to indicate success. (might fix #134354) - -2004-02-13 David Schleef <ds@schleef.org> - - * gst/sine/demo-dparams.c: (dynparm_log_value_changed), - (dynparm_value_changed), (main): Convert from float to double. - * gst/sine/gstsinesrc.c: (gst_sinesrc_init): same. - -2004-02-13 David Schleef <ds@schleef.org> - - * gst/silence/gstsilence.c: (gst_silence_class_init), - (gst_silence_set_clock), (gst_silence_get), - (gst_silence_set_property), (gst_silence_get_property): - * gst/silence/gstsilence.h: Add sync property. - * gst/sine/gstsinesrc.c: (gst_sinesrc_class_init), - (gst_sinesrc_init), (gst_sinesrc_set_clock), (gst_sinesrc_get), - (gst_sinesrc_set_property), (gst_sinesrc_get_property): - * gst/sine/gstsinesrc.h: Add sync property. - -2004-02-13 David Schleef <ds@schleef.org> - - * gst/intfloat/gstint2float.c: (conv_f32_s16), - (gst_int2float_chain_gint16): Change stdint usage to glib types. - -2004-02-13 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - * ext/Makefile.am: - * gst-libs/ext/Makefile.am: - move ffmpeg plugin to gst-ffmpeg module - -2004-02-13 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: use GST_ARCH to detect architecture - -2004-02-12 Julien MOUTTE <julien@moutte.net> - - * gst/vbidec/vbiscreen.c: Fixing thomasvs fixes. Missing header. - -2004-02-12 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/ladspa/gstladspa.c: (gst_ladspa_base_init): - classify LADSPA plugins based on number of src/sink pads - (#133663, Stefan Kost) - * gst/sine/gstsinesrc.c: (gst_sinesrc_init): - fix dparams registration - (#133528, Stefan Kost) - * gst/vbidec/vbiscreen.c: (vbiscreen_set_current_cell): - fix use of isprint and use g_ascii_isprint instead - (#133316, Stefan Kost) - -2004-02-11 David Schleef <ds@schleef.org> - - Convert a few inner loops to use liboil. This is currently - optional, and is only enabled if liboil is present (duh!). - * configure.ac: Check for liboil-0.1 - * gst/intfloat/Makefile.am: - * gst/intfloat/gstint2float.c: (conv_f32_s16), (scalarmult_f32), - (gst_int2float_chain_gint16): - * gst/videofilter/Makefile.am: - * gst/videofilter/gstvideobalance.c: (gst_videobalance_class_init), - (tablelookup_u8), (gst_videobalance_planar411): - * gst/videotestsrc/Makefile.am: - * gst/videotestsrc/gstvideotestsrc.c: (plugin_init): - * gst/videotestsrc/videotestsrc.c: (splat_u8), (paint_hline_YUY2), - (paint_hline_IYU2), (paint_hline_str4), (paint_hline_str3), - (paint_hline_RGB565), (paint_hline_xRGB1555): - -2004-02-11 David Schleef <ds@schleef.org> - - * ext/lcs/gstcolorspace.c: (colorspace_find_lcs_format), - (gst_colorspace_caps_get_fourcc), (colorspace_setup_converter), - (gst_colorspace_getcaps), (gst_colorspace_link), - (gst_colorspace_base_init), (gst_colorspace_init), - (gst_colorspace_chain), (gst_colorspace_change_state), - (plugin_init): Merge Ronald's patch (bug #117897) and update - for new caps and negotiation. Seems to work, although it - shows off bugs in lcs. - -2004-02-11 David Schleef <ds@schleef.org> - - * ext/alsa/Makefile.am: Fix linking against libgstinterfaces. - (bug #133886) Noticed by bugs@leroutier.net (Stephane LOEUILLET) - -2004-02-11 David Schleef <ds@schleef.org> - - * ext/librfb/gstrfbsrc.c: (gst_rfbsrc_class_init), - (gst_rfbsrc_change_state), (gst_rfbsrc_init), - (gst_rfbsrc_set_property), (gst_rfbsrc_get_property): - Add server and port properties - -2004-02-11 Thomas Vander Stichele <thomas at apestaart dot org> - - * m4/a52.m4: - * m4/aalib.m4: - * m4/as-ffmpeg.m4: - * m4/as-liblame.m4: - * m4/as-slurp-ffmpeg.m4: - * m4/check-libheader.m4: - * m4/esd.m4: - * m4/freetype2.m4: - * m4/gconf-2.m4: - * m4/glib.m4: - * m4/gst-alsa.m4: - * m4/gst-artsc.m4: - * m4/gst-ivorbis.m4: - * m4/gst-matroska.m4: - * m4/gst-sdl.m4: - * m4/gst-shout2.m4: - * m4/gst-sid.m4: - * m4/gtk.m4: - * m4/libdv.m4: - * m4/libfame.m4: - * m4/libmikmod.m4: - * m4/ogg.m4: - * m4/vorbis.m4: - fix underquotedness of macros (#133800) - * m4/as-avifile.m4: - * m4/xmms.m4: - removed because no longer used - -2004-02-11 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - require gettext 0.11.5 so ulonglong.m4 gets checked out and copied - by autopoint (fixes #132996) - -2004-02-11 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_base_init): - * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_base_init): - * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_base_init): - * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_base_init): - fix memleaks - -2004-02-11 David Schleef <ds@schleef.org> - - * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link), - (gst_gdk_pixbuf_chain): Fix logic bug causing spurious errors. - * ext/jpeg/gstjpegdec.c: (gst_jpegdec_base_init), - (gst_jpegdec_init), (gst_jpegdec_chain): Fix negotiation. - * ext/jpeg/gstjpegenc.c: (gst_jpegenc_base_init), - (gst_jpegenc_class_init), (gst_jpegenc_init), - (gst_jpegenc_getcaps), (gst_jpegenc_link), (gst_jpegenc_resync), - (gst_jpegenc_chain), (gst_jpegenc_set_property), - (gst_jpegenc_get_property): Fix negotiation. Add some properties. - * ext/jpeg/gstjpegenc.h: Fix negotiation. - -2004-02-10 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/mikmod/gstmikmod.c: (gst_mikmod_init), - (gst_mikmod_srcfixate), (gst_mikmod_srclink), (gst_mikmod_loop): - * ext/mikmod/gstmikmod.h: - fix caps negotiation in mikmod - * ext/ogg/gstoggdemux.c: (gst_ogg_print): - output debug information - -2004-02-08 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst-libs/gst/colorbalance/Makefile.am: - * gst-libs/gst/navigation/Makefile.am: - * gst-libs/gst/xoverlay/Makefile.am: - remove unused GST_OPT_CFLAGS from Makefiles - include X_CFLAGS and X_LIBS in xoverlay. (#131948) - -2004-02-07 David Schleef <ds@schleef.org> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_handle_event): Don't - push events to pads that haven't been created (#133508) - -2004-02-07 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_src_convert), - (gst_dvdec_sink_convert), (gst_dvdec_handle_sink_event), - (gst_dvdec_video_getcaps), (gst_dvdec_video_link), - (gst_dvdec_loop), (gst_dvdec_change_state): - Second attempt at committing a working dvdec element. - -2004-02-06 David Schleef <ds@schleef.org> - - Build fixes for OS X: (see #129600) - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_strh), - (gst_riff_read_strf_vids), (gst_riff_read_strf_auds), - (gst_riff_read_strf_iavs): - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_avih), - (gst_avi_demux_stream_odml): - * gst/playondemand/Makefile.am: - * gst/rtp/rtp-packet.c: - -2004-02-05 David Schleef <ds@schleef.org> - - * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_loop): Revert - last change, because it Just Doesn't Compile. - -2004-02-05 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/mad/gstid3tag.c: (gst_id3_tag_chain): - skip undecodable id3v2 tag instead of keeping it - -2004-02-05 David Schleef <ds@schleef.org> - - * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): - Unref leaked buffer. (Noticed by Ronald) - -2004-02-05 David I. Lehn <dlehn@users.sourceforge.net> - - * pkgconfig/gstreamer-libs-uninstalled.pc.in: - Sync requires with other checks. >= vs =. - -2004-02-06 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_video_getcaps), - (gst_dvdec_video_link), (gst_dvdec_loop): - * ext/dv/gstdvdec.h: - rework the caps negotiation so that dvdec works again instead - of just segfaulting. - -=== release 0.7.4 === - -2004-02-06 Thomas Vander Stichele <thomas at apestaart dot org> - - * NEWS: GStreamer Plugins 0.7.4 "For Great Justice" released - * configure.ac: changed for release - -2004-02-05 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/gconf/gstreamer-gconf-uninstalled.pc.in: - * pkgconfig/gstreamer-interfaces-uninstalled.pc.in: - * pkgconfig/gstreamer-libs-uninstalled.pc.in: - * pkgconfig/gstreamer-play-uninstalled.pc.in: - reworked patch by David Lehn to fix libdir and includedir for - uninstalled libraries - removed play and gconf from gstreamer-libs since they have their - own pkgconfig files - -2004-02-04 David Schleef <ds@schleef.org> - - * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt): Fix a caps - memleak. - -2004-02-05 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): - use correct GST_TAG_ENCODER tag - -2004-02-05 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/alsa/gstalsa.c: (gst_alsa_change_state): - be sure to stop the clock when going to paused - * sys/oss/gstosssink.c: (gst_osssink_change_state): - reset number of transmitted when going to ready. - fixes #132935 - -2004-02-05 Charles Schmidt <cschmidt2@emich.edu> - - reviewed by Benjamin Otte - - * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): - extract track count (fixes #133410) - -2004-02-04 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/mad/gstid3tag.c: (gst_id3_tag_do_caps_nego): - that should be !=, not == (fixes #132519) - -2004-02-04 David Schleef <ds@schleef.org> - - Make sure set_explicit_caps() is called before adding pad. - * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): - * gst/id3/gstid3types.c: (gst_id3types_loop): - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead): - * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): - -2004-02-04 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - bump nano to 2, first prerelease - put back AM_PROG_LIBTOOL - -2004-02-04 Thomas Vander Stichele <thomas at apestaart dot org> - - * testsuite/alsa/Makefile.am: - these are user test apps, not automatic testsuite tests - -2004-02-04 David Schleef <ds@schleef.org> - - Convert GST_DEBUG_CAPS() to GST_DEBUG(): - * gst/mpeg1videoparse/gstmp1videoparse.c: - (mp1videoparse_parse_seq): - * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): - * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps): - * sys/xvideo/gstxwindow.c: (_gst_xwindow_new): - * sys/xvideo/xvideosink.c: (gst_xvideosink_sinkconnect), - (gst_xvideosink_getcaps): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): - * testsuite/gst-lint: more tests - -2004-02-04 David Schleef <ds@schleef.org> - - Replace use of GST_PAD_FORMATS_FUNCTION() and similar macros - with the code that they would expand to. - * ext/flac/gstflacdec.c: (gst_flacdec_get_src_formats), - (gst_flacdec_get_src_query_types), - (gst_flacdec_get_src_event_masks): - * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get_formats), - (gst_gnomevfssrc_get_query_types), - (gst_gnomevfssrc_get_event_mask): - -2004-02-04 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/sine/gstsinesrc.c: (gst_sinesrc_class_init), - (gst_sinesrc_dispose): - fix memleak by properly disposing sinesrc - -2004-02-04 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_expose): - * gst-libs/gst/xoverlay/xoverlay.h: Adding the _expose method to tell - an overlay to redraw the image because it has been exposed. - * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_destroy), - (gst_ximagesink_ximage_put), (gst_ximagesink_expose), - (gst_ximagesink_xoverlay_init), (gst_ximagesink_init): - * sys/ximage/ximagesink.h: Implement expose method from XOverlay - interface - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_destroy), - (gst_xvimagesink_xvimage_put), (gst_xvimagesink_expose), - (gst_xvimagesink_xoverlay_init), (gst_xvimagesink_init): - * sys/xvimage/xvimagesink.h: Implement expose method from XOverlay - interface - -2004-02-03 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_type_find): - more memleak fixage - -2004-02-03 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): - * gst/typefind/gsttypefindfunctions.c: - fix memleaks shown by gst-typefind - -2004-02-03 Thomas Vander Stichele <thomas at apestaart dot org> - - * common/glib-gen.mak: - add hack rule to touch .Plo files - * gst-libs/gst/colorbalance/Makefile.am: - * gst-libs/gst/mixer/Makefile.am: - * gst-libs/gst/play/Makefile.am: - * gst-libs/gst/tuner/Makefile.am: - remove glib_root variable - -2004-02-03 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream): - set explicit caps before adding the element, so the autopluggers can - plug correctly. - * gst/typefind/gsttypefindfunctions.c: (mp3_type_find), - (mpeg2_sys_type_find), (mpeg1_sys_type_find), - (mpeg_video_type_find), (mpeg_video_stream_type_find), - (dv_type_find): - fix memleaks in typefind functions. gst_type_find_suggest takes a const - argument. - -2004-02-03 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/colorbalance/Makefile.am: - * gst-libs/gst/colorbalance/colorbalance-marshal.list: - * gst-libs/gst/colorbalance/colorbalance.c: - * gst-libs/gst/colorbalance/colorbalance.h: - * gst-libs/gst/colorbalance/colorbalancemarshal.list: - * gst-libs/gst/mixer/Makefile.am: - * gst-libs/gst/mixer/mixer-marshal.list: - * gst-libs/gst/mixer/mixer.c: - * gst-libs/gst/mixer/mixer.h: - * gst-libs/gst/mixer/mixermarshal.list: - * gst-libs/gst/play/Makefile.am: - * gst-libs/gst/play/play.h: - * gst-libs/gst/tuner/Makefile.am: - * gst-libs/gst/tuner/tuner-marshal.list: - * gst-libs/gst/tuner/tuner.c: - * gst-libs/gst/tuner/tuner.h: - * gst-libs/gst/tuner/tunermarshal.list: - use new glib-gen.mak snippet to clean up Makefile.am - fix various bugs in Makefile.am's - -2004-02-03 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain): - handle chain parsing correctly in the multichain case - * ext/theora/theoradec.c: (gst_theora_dec_init), (_theora_ilog), - (theora_dec_from_granulepos), (theora_dec_to_granulepos), - (theora_dec_src_query), (theora_dec_src_event), (theora_dec_event), - (theora_dec_chain): - handle events and queries correctly - -2004-02-03 David I. Lehn <dlehn@users.sourceforge.net> - - * .cvsignore: - Ignore generated file _stdint.h. - -2004-02-03 David I. Lehn <dlehn@users.sourceforge.net> - - * gst-libs/gst/colorbalance/Makefile.am: - * gst-libs/gst/colorbalance/colorbalance.h: - * gst-libs/gst/mixer/Makefile.am: - * gst-libs/gst/mixer/mixer.h: - * gst-libs/gst/play/Makefile.am: - * gst-libs/gst/play/play.h: - * gst-libs/gst/tuner/Makefile.am: - * gst-libs/gst/tuner/tuner.h: - Generate enum type code with glib-mkenums. - * gst-libs/gst/colorbalance/.cvsignore: - * gst-libs/gst/mixer/.cvsignore: - * gst-libs/gst/play/.cvsignore: - * gst-libs/gst/tuner/.cvsignore: - Ignore generated files. - -2004-02-03 David I. Lehn <dlehn@users.sourceforge.net> - - * gst-libs/gst/audio/.cvsignore: - Ignore generated file. - * gst-libs/gst/audio/Makefile.am: - Do not install example filter. - -2004-02-03 David I. Lehn <dlehn@users.sourceforge.net> - - * examples/switch/.cvsignore: - Ignore generated file. - -2004-02-03 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * common/m4/ax_create_stdint_h.m4: - * configure.ac: - add AX_CREATE_STDINT_H to get correct type definitions for a52dec in - _stdint.h. - * Makefile.am: - remove generated _stdint.h in DISTCLEANFILES - * ext/a52dec/gsta52dec.c: - include _stdint.h for a52dec. (should fix #133064) - -2004-02-02 Jeremy Simon <jesimon@libertysurf.fr> - - * gst/tags/gstvorbistag.c: (gst_vorbis_tag_add), - (gst_tag_to_vorbis_comments): - Add replaygain support to vorbistag - -2004-02-02 Jeremy Simon <jesimon@libertysurf.fr> - * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), - (gst_ffmpeg_caps_to_extradata): - Fix SVQ3 caps flag properties - Use glib macro for bytes swap - -2004-02-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/audiofile/gstafsink.c: (gst_afsink_plugin_init): - * ext/audiofile/gstafsrc.c: (gst_afsrc_plugin_init): - * ext/gnomevfs/gstgnomevfs.c: (plugin_init): - * ext/sndfile/gstsf.c: (plugin_init): - * gst/avi/gstavi.c: (plugin_init): - * sys/dxr3/dxr3init.c: (plugin_init): - * sys/oss/gstossaudio.c: (plugin_init): - * sys/v4l/gstv4l.c: (plugin_init): - * sys/v4l2/gstv4l2.c: (plugin_init): - remove textdomain calls - * po/nl.po: - update Dutch translation - -2004-02-02 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/play/play.c: (gst_play_pipeline_setup), - (gst_play_set_audio_sink): Moving volume in the audio thread for - instantaneous volume change. Maybe i will add another volume in front - of visualization later, not sure yet though. - -2004-02-02 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_renegotiate_size), - (gst_ximagesink_handle_xevents): Better X events handling, only take - the latest events for configure and motion. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents): same. - -2004-02-02 Jon Trowbridge <trow@gnu.org> - - reviewed by: David Schleef <ds@schleef.org> - - Fix memory leaks: - * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_register): - * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_register): - -2004-02-02 David Schleef <ds@schleef.org> - - code cleanup. Change bzero() to memset(). Remove duplicate ; at ends - of lines. - * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_event): - * ext/flac/gstflactag.c: (gst_flac_tag_chain): - * ext/xvid/gstxviddec.c: (gst_xviddec_src_link): - * gst-libs/gst/play/play.c: (gst_play_get_sink_element): - * gst/ac3parse/gstac3parse.c: (gst_ac3parse_chain): - * gst/effectv/gstedge.c: (gst_edgetv_sinkconnect): - * gst/effectv/gstvertigo.c: (gst_vertigotv_sinkconnect): - * gst/intfloat/float22int.c: (gst_float2_2_int_getcaps), - (gst_float2_2_int_link): - * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_chain_subtitle): - * gst/rtjpeg/RTjpeg.c: (RTjpeg_init_mcompress): - * gst/tcp/gsttcpsink.c: (gst_tcpsink_init_send): - * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_init_receive): - * gst/udp/gstudpsink.c: (gst_udpsink_init_send): - * gst/udp/gstudpsrc.c: (gst_udpsrc_init_receive): - * sys/v4l/gstv4lelement.c: (gst_v4lelement_init): - * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_set_capture): - * testsuite/gst-lint: Add tests for bzero and ;; - -2004-02-02 David Schleef <ds@schleef.org> - - * gst/debug/efence.c: Add fallback if MAP_ANONYMOUS isn't defined. - -2004-02-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/aalib/gstaasink.c: (gst_aasink_open): - * ext/alsa/gstalsa.c: (gst_alsa_link), (gst_alsa_xrun_recovery): - * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): - * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): - * ext/audiofile/gstafsink.c: (gst_afsink_open_file), - (gst_afsink_close_file): - * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), - (gst_afsrc_close_file): - * ext/divx/gstdivxdec.c: (gst_divxdec_setup), (gst_divxdec_chain): - * ext/divx/gstdivxenc.c: (gst_divxenc_setup), (gst_divxenc_chain): - * ext/dv/gstdvdec.c: (gst_dvdec_loop): - * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_user_op), (dvdnavsrc_get): - * ext/esd/esdmon.c: (gst_esdmon_get): - * ext/esd/esdsink.c: (gst_esdsink_chain), (gst_esdsink_open_audio): - * ext/faac/gstfaac.c: (gst_faac_chain): - * ext/faad/gstfaad.c: (gst_faad_chain): - * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): - * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): - * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_loop): - * ext/flac/gstflacdec.c: (gst_flacdec_error_callback), - (gst_flacdec_loop): - * ext/flac/gstflacenc.c: (gst_flacenc_chain): - * ext/flac/gstflactag.c: (gst_flac_tag_chain): - * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): - * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file), - (gst_gnomevfssink_close_file): - * ext/gnomevfs/gstgnomevfssrc.c: (audiocast_init), - (gst_gnomevfssrc_open_file): - * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_loop): - * ext/lame/gstlame.c: (gst_lame_sink_link), (gst_lame_chain): - * ext/lcs/gstcolorspace.c: (gst_colorspace_srcconnect_func): - * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event), - (gst_id3_tag_do_typefind), (gst_id3_tag_chain): - * ext/mad/gstmad.c: (gst_mad_chain): - * ext/mikmod/gstmikmod.c: (gst_mikmod_loop): - * ext/mpeg2dec/gstmpeg2dec.c: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mplex/gstmplex.cc: - * ext/mplex/gstmplexibitstream.cc: - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain), - (gst_ogg_demux_push): - * ext/raw1394/gstdv1394src.c: - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_lock), - (gst_sdlvideosink_initsdl), (gst_sdlvideosink_create): - * ext/sndfile/gstsf.c: (gst_sf_open_file), (gst_sf_close_file), - (gst_sf_loop): - * ext/speex/gstspeexenc.c: (gst_speexenc_chain): - * ext/swfdec/gstswfdec.c: (gst_swfdec_loop): - * ext/tarkin/gsttarkindec.c: (gst_tarkindec_chain): - * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_chain): - * ext/vorbis/vorbisenc.c: (gst_vorbisenc_chain): - * ext/vorbis/vorbisfile.c: (gst_vorbisfile_loop): - * ext/xvid/gstxviddec.c: (gst_xviddec_setup), (gst_xviddec_chain): - * ext/xvid/gstxvidenc.c: (gst_xvidenc_setup), (gst_xvidenc_chain): - * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), - (gst_riff_read_element_data), (gst_riff_read_seek), - (gst_riff_peek_list), (gst_riff_read_list), (gst_riff_read_header): - * gst/adder/gstadder.c: (gst_adder_loop): - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_segment), - (gst_asf_demux_process_stream), (gst_asf_demux_get_stream): - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_init), - (gst_avi_demux_add_stream), (gst_avi_demux_stream_header): - * gst/avi/gstavimux.c: (gst_avimux_stop_file): - * gst/flx/gstflxdec.c: (gst_flxdec_loop): - * gst/goom/gstgoom.c: (gst_goom_chain): - * gst/id3/gstid3types.c: (gst_id3types_loop): - * gst/intfloat/float22int.c: (gst_float2_2_int_chain): - * gst/intfloat/gstfloat2int.c: (gst_float2int_loop): - * gst/intfloat/gstint2float.c: (gst_int2float_chain_gint16): - * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), - (gst_ebml_read_element_length), (gst_ebml_read_element_data), - (gst_ebml_read_seek), (gst_ebml_read_uint), (gst_ebml_read_sint), - (gst_ebml_read_float), (gst_ebml_read_header): - * gst/matroska/matroska-demux.c: (gst_matroska_demux_init_stream), - (gst_matroska_demux_parse_blockgroup): - * gst/monoscope/gstmonoscope.c: (gst_monoscope_chain): - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop): - * gst/oneton/gstoneton.c: (gst_oneton_chain): - * gst/silence/gstsilence.c: (gst_silence_get): - * gst/sine/gstsinesrc.c: (gst_sinesrc_get): - * gst/smpte/gstsmpte.c: (gst_smpte_loop): - * gst/speed/gstspeed.c: (speed_loop): - * gst/tags/gstvorbistag.c: (gst_vorbis_tag_chain): - * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): - * gst/volenv/gstvolenv.c: (gst_volenv_chain): - * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): - * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), - (gst_wavparse_loop): - * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_open), - (dxr3audiosink_set_mode_pcm), (dxr3audiosink_set_mode_ac3), - (dxr3audiosink_close): - * sys/dxr3/dxr3spusink.c: (dxr3spusink_open), (dxr3spusink_close): - * sys/dxr3/dxr3videosink.c: (dxr3videosink_open), - (dxr3videosink_close), (dxr3videosink_write_data): - * sys/oss/gstosselement.c: (gst_osselement_open_audio): - * sys/oss/gstosssink.c: (gst_osssink_chain): - * sys/oss/gstosssrc.c: (gst_osssrc_get): - * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_chain): - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_buffer_free): - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_buffer_free): - * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay), - (gst_v4l_set_window), (gst_v4l_enable_overlay): - * sys/v4l/v4l_calls.c: (gst_v4l_get_capabilities), (gst_v4l_open), - (gst_v4l_set_chan_norm), (gst_v4l_get_signal), - (gst_v4l_get_frequency), (gst_v4l_set_frequency), - (gst_v4l_get_picture), (gst_v4l_set_picture), (gst_v4l_get_audio), - (gst_v4l_set_audio): - * sys/v4l/v4l_calls.h: - * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_sync_thread), - (gst_v4lmjpegsink_queue_frame), (gst_v4lmjpegsink_set_playback), - (gst_v4lmjpegsink_playback_init), - (gst_v4lmjpegsink_playback_start): - * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_queue_frame): - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), - (gst_v4lsrc_sync_frame), (gst_v4lsrc_capture_init), - (gst_v4lsrc_requeue_frame), (gst_v4lsrc_try_palette): - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get): - * sys/v4l2/v4l2-overlay_calls.c: (gst_v4l2_set_display), - (gst_v4l2_set_window), (gst_v4l2_enable_overlay): - * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), - (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_get_norm), - (gst_v4l2_set_norm), (gst_v4l2_get_input), (gst_v4l2_set_input), - (gst_v4l2_get_output), (gst_v4l2_set_output), - (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), - (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), - (gst_v4l2_set_attribute): - * sys/v4l2/v4l2_calls.h: - * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), - (gst_v4l2src_queue_frame), (gst_v4l2src_grab_frame), - (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), - (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), - (gst_v4l2src_capture_stop): - * sys/vcd/vcdsrc.c: (vcdsrc_open_file): - * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), - (gst_ximagesink_chain): - * sys/xvideo/xvideosink.c: (gst_xvideosink_buffer_new), - (gst_xvideosink_sinkconnect), (gst_xvideosink_chain), - (gst_xvideosink_xwindow_new): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), - (gst_xvimagesink_chain): - -2004-02-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/volume/gstvolume.c: (gst_volume_set_volume), - (gst_volume_get_volume), (volume_class_init), (volume_init), - (volume_chain_int16), (volume_update_volume): - * gst/volume/gstvolume.h: - make code more readable by removing magic numbers - make mixer interface export 0-100 range - make it internally map to 0.0-1.0 range so users don't distort - output by putting the sliders at full volume - -2004-02-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/play/play.c: (gst_play_tick_callback), - (gst_play_state_change), (gst_play_seek_to_time): - block the tick callback for 0.5 secs after doing a seek - -2004-02-02 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/play/play.c: (gst_play_new): - check for GError - -2004-02-01 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/play/play.c: (gst_play_seek_to_time), - (gst_play_new): Accepting NULL GError, blocking time tick while seeking. - * sys/ximage/ximagesink.c: (gst_ximagesink_sink_link), - (gst_ximagesink_chain), (gst_ximagesink_init): s/sinkconnect/sink_link - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sink_link), - (gst_xvimagesink_chain), (gst_xvimagesink_init): s/sinkconnect/sink_link - -2004-02-01 Thomas Vander Stichele <thomas at apestaart dot org> - - * configure.ac: - * ext/vorbis/vorbisdec.c: (vorbis_dec_event): - check for a function added in vorbis 1.1 - -2004-01-31 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/alsa/gstalsa.c: (gst_alsa_change_state), (gst_alsa_start), - (gst_alsa_drain_audio), (gst_alsa_stop_audio): - really start/stop clock only on PLAYING <=> PAUSED - * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): - remove \n from debugging lines - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain): - make it work when seeking does not - * ext/vorbis/vorbisdec.c: (vorbis_dec_event): - reset on DISCONT - -2004-01-31 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/alsa/gstalsa.c: (gst_alsa_change_state), (gst_alsa_start): - start clock on PAUSED=>PLAYING, not later - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): - extract correct time for different discont formats - (gst_alsa_sink_get_time): - don't segfault when no format is negotiated yet, just return 0 - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), - (gst_ogg_demux_handle_event), (gst_ogg_demux_push), - (gst_ogg_pad_push): - handle flush and discont events correctly - * ext/vorbis/vorbisdec.c: (vorbis_dec_event), (vorbis_dec_chain): - handle discont events correctly - -2004-01-31 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/play/play.c: (gst_play_error_quark), - (gst_play_error_create), (gst_play_error_plugin), - (gst_play_pipeline_setup), (gst_play_init), (gst_play_new): - * gst-libs/gst/play/play.h: - add error handling during creation - * examples/gstplay/player.c: (main): - use new gst_play_new - - -2004-01-31 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/theora/theoradec.c: (theora_dec_chain): - make comments work - * ext/vorbis/vorbisdec.c: (vorbis_dec_src_query), - (vorbis_dec_src_event), (vorbis_dec_chain): - add encoder tag, fix tag reading to be more error tolerant, change - BITRATE to NOMINAL_BITRATE, add debugging, don't unref events after - gst_pad_event_default. - * gst/tags/gstvorbistag.c: - (gst_tag_list_from_vorbiscomment_buffer): - undefine function specific define at end of function - -2004-01-31 Jeremy Simon <jesimon@libertysurf.fr> - - * ext/flac/gstflac.c: (plugin_init): - * ext/flac/gstflacdec.c: (gst_flacdec_class_init): - * ext/flac/gstflacdec.h: - * ext/flac/gstflacenc.h: - Fix typos - -2004-01-30 David I. Lehn <dlehn@users.sourceforge.net> - - * examples/gstplay/player.c: s/gstplay.h/play.h/ - -2004-01-30 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/play/Makefile.am: - * gst-libs/gst/play/gstplay.c: - * gst-libs/gst/play/gstplay.h: - * gst-libs/gst/play/play.c: - more surgery, operation complete - -2004-01-30 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/play/play.old.c: - * gst-libs/gst/play/play.old.h: - after CVS surgery by moving, remove - * gst-libs/gst/play/playpipelines.c: - remove - - * gst/intfloat/float22int.c: (gst_float2_2_int_chain): - add negotiation error - -2004-01-30 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_event), - (gst_ogg_demux_push): - add some seeking debug info - send a flush when seeking - -2004-01-30 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * configure.ac: - use AC_C_INLINE - * configure.ac: - * ext/Makefile.am: - * ext/theora/Makefile.am: - * ext/theora/theoradec.c: - add theora video decoder. Does just do simple decoding for now and - has been tested against Theora cvs only. It only works when theora - is compiled with --enable-static. - * ext/vorbis/vorbisdec.c: (vorbis_dec_event): - always reset packetno on DISCONT - -2004-01-30 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead): - Fix audio. - -2004-01-30 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpegaudioparse/gstmpegaudioparse.c: - (mp3_type_frame_length_from_header): - Fix header parsing - stolen from ffmpeg (thank you! :) ). - -2004-01-30 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/esd/esdsink.c: (gst_esdsink_init): - Since we have static pad template caps, we don't need to negotiate; - either the core errors out or we know the format. - -2004-01-30 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), - (gst_riff_read_seek): - * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), - (gst_ebml_read_seek): - Fix event handling. - -2004-01-30 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps): - removee video/x-theora from vp3 decoder, it doesn't handle raw - theora streams - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_init): - fix bug with finalizing element that never went to PAUSED - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_src_query): - length and position queries were swapped - * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_init), - (vorbis_dec_from_granulepos), (vorbis_dec_src_query), - (vorbis_dec_src_event): - implement querying time and bytes - -2004-01-30 Thomas Vander Stichele <thomas at apestaart dot org> - - * just about every source file: - gst_element_error -> GST_ELEMENT_ERROR - -2004-01-29 Julien MOUTTE <julien@moutte.net> - - * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get): Fixing seeking - emiting FLUSH and even before DISCONT. - * gst-libs/gst/play/gstplay.c: (gst_play_seek_to_time): Fix seeking to - get the best instant seeking as possible yay! - -2004-01-29 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpeg1videoparse/gstmp1videoparse.c: - (gst_mp1videoparse_real_chain): - Committed wrong version last week... Grr... Didn't notice until now. - -2004-01-29 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_new): Emit the - have_xwindow_id signal in xwindow_create. - -2004-01-29 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/ogg/gstoggdemux.c: - lots of changes - mainly support for chained bitstreams, seeking, - querying and bugfixes of course - * ext/vorbis/Makefile.am: - * ext/vorbis/vorbisdec.c: - * ext/vorbis/vorbisdec.h: - add vorbisdec raw vorbis decoder - * ext/vorbis/vorbis.c: (plugin_init): - register vorbisdec as PRIMARY, vorbisfile as SECONDARY - * gst/intfloat/Makefile.am: - * gst/intfloat/float22int.c: - * gst/intfloat/float22int.h: - * gst/intfloat/gstintfloatconvert.c: (plugin_init): - add float2intnew plugin. It converts multichannel interleaved float to - multichannel interleaved int. The name should probably be changed. - * gst/typefind/gsttypefindfunctions.c: (theora_type_find), - (plugin_init): - add typefinding for raw theora video so oggdemux can detect it. - -2004-01-28 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/play/gstplay.c: (gst_play_seek_to_time): seek on video - sink element first. - * gst/videoscale/gstvideoscale.c: - (gst_videoscale_handle_src_event): Fixing src event handler. - -2004-01-28 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init), (gst_v4lsrc_init), - (gst_v4lsrc_open), (gst_v4lsrc_close), - (gst_v4lsrc_palette_to_caps), (gst_v4lsrc_srcconnect), - (gst_v4lsrc_getcaps), (gst_v4lsrc_set_clock): - * sys/v4l/gstv4lsrc.h: - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_start), - (gst_v4lsrc_grab_frame), (gst_v4lsrc_capture_stop): - Implement resizing... Hack. But that's why v4l is b0rked... - -2004-01-28 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), - (gst_ximagesink_ximage_new), (gst_ximagesink_ximage_destroy), - (gst_ximagesink_ximage_put), (gst_ximagesink_xwindow_new), - (gst_ximagesink_xwindow_destroy): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), - (gst_xvimagesink_xvimage_new), (gst_xvimagesink_xvimage_destroy), - (gst_xvimagesink_xwindow_new), (gst_xvimagesink_xwindow_destroy), - (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_get_xv_support), - (gst_xvimagesink_xcontext_get): Removing some useless debugs messages, - correctly cleaning the image created to check xshm calls on succes, - added a lot of XSync calls in X11 functions, and fixed a segfault when - no image format was defined before negotiation happened. - -2004-01-28 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/alsa/gstalsa.c: (gst_alsa_query_func): - use gst_element_get_time to get correct time - -2004-01-28 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xerror), - (gst_ximagesink_check_xshm_calls), (gst_ximagesink_ximage_destroy), - (gst_ximagesink_xcontext_get), (gst_ximagesink_class_init): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xerror), - (gst_xvimagesink_check_xshm_calls), - (gst_xvimagesink_xvimage_destroy), (gst_xvimagesink_xcontext_get): Our - X plugins are now able to detect that XShm calls will fail even if the - server claims that it has XShm support (remote displays most of the - time). We then log the error as a GST_DEBUG and set use_shm to FALSE - so that we use non XShm functions. This feature is almost useless for - xvimagesink as Xv is not supported on remote displays anyway, but - it might happen than even on the local display XShm calls fail. - -2004-01-27 David Schleef <ds@schleef.org> - - * ext/esd/esdsink.c: (gst_esdsink_class_init), (gst_esdsink_init), - (gst_esdsink_link), (gst_esdsink_get_time), (gst_esdsink_chain), - (gst_esdsink_change_state): Fix sync issues in esdsink. Also - changed esdsink to only use 44100,16,2, since esd sucks at rate - conversion and esdsink has had difficulty negotiating. - -2004-01-27 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/play/gstplay.c: (gst_play_tick_callback), - (gst_play_seek_to_time): Fixing the way to get current position. - -2004-01-27 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * sys/oss/gstosssink.c: (gst_osssink_sink_query): - use gst_element_get_time to get correct time - -2004-01-27 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/play/gstplay.c: (gst_play_set_location): The easiest - fix ever... Inverting 2 lines of code make spider autoplug correctly - tagged mp3 ! - -2004-01-27 David Schleef <ds@schleef.org> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): - Use gst_pad_try_set_caps_nonfixed(). - -2004-01-27 David Schleef <ds@schleef.org> - - * gst/ac3parse/gstac3parse.c: update to checklist 5 - * gst/adder/gstadder.c: rewrite negotiation. update to checklist 5 - * gst/audioconvert/gstaudioconvert.c: update to checklist 5 - * gst/audioscale/gstaudioscale.c: same - * gst/auparse/gstauparse.c: same - * gst/avi/gstavidemux.c: same - -2004-01-27 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_handle_sink_event): - stop processing after EOS - -2004-01-27 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/asfdemux/asfheaders.h: - * gst/asfdemux/gstasfdemux.c: - * gst/asfdemux/gstasfmux.c: (gst_asfmux_put_guid), - (gst_asfmux_put_string), (gst_asfmux_put_wav_header), - (gst_asfmux_put_vid_header), (gst_asfmux_put_bmp_header): - lot's of fixes to make data extraction simpler and get the code - architecture and compiler independant. Add debugging category - * gst/goom/gstgoom.c: (gst_goom_change_state): - reset channel count on PAUSED=>READY, not READY=>PAUSED - -2004-01-26 Colin Walters <walters@verbum.org> - - * ext/gnomevfs/gstgnomevfssrc.c (gst_gnomevfssrc_get): Remove ugly - code to pull a bigger buffer in iradio mode. This as a side effect - makes typefinding work. - -2004-01-26 Jeremy Simon <jesimon@libertysurf.fr> - - * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_caps_to_extradata): - Fix SVQ3 decoding on PPC - -2004-01-26 Julien MOUTTE <julien@moutte.net> - - * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): Dunno how - that one managed to stay there... Fixed. - -2004-01-26 Jeremy Simon <jesimon@libertysurf.fr> - - * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), - (gst_ffmpeg_caps_to_extradata), (gst_ffmpeg_caps_to_pixfmt): - * gst/qtdemux/qtdemux.c: (plugin_init), (qtdemux_parse_trak), - (qtdemux_video_caps): - * gst/qtdemux/qtdemux.h: - Add SVQ3 specific flags to qtdemux and ffmpeg - -2004-01-26 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst-libs/gst/audio/audio.h: - remove buffer-frames from audio caps - * gst/audioconvert/gstaudioconvert.c: - fix plugin to really work. - -2004-01-25 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/mixer/mixer.c: - * gst-libs/gst/propertyprobe/propertyprobe.c: - * gst-libs/gst/tuner/tuner.c: (gst_tuner_find_norm_by_name), - (gst_tuner_find_channel_by_name): - * gst-libs/gst/tuner/tuner.h: - Add gtk-doc style comments. Also fix a function name. - -2004-01-25 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/divx/gstdivxdec.c: (gst_divxdec_init), - (gst_divxdec_negotiate): - Fix for new capsnego - also fixes gst-player with divxdec. - -2004-01-25 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup), - (gst_play_identity_handoff), (gst_play_set_location), - (gst_play_set_visualization), (gst_play_connect_visualization): Another - try in visualization implementation. Still have an issue with switch - blocking when pulling from video_queue and only audio comes out of - spider. - * gst/switch/gstswitch.c: (gst_switch_release_pad), - (gst_switch_poll_sinkpads), (gst_switch_class_init): Implementing pad - release method. And check if the pad is usable before pulling. - -2004-01-25 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/videofilter/gstvideobalance.c: (gst_videobalance_dispose), - (gst_videobalance_init), - (gst_videobalance_colorbalance_list_channels), - (gst_videobalance_colorbalance_set_value), - (gst_videobalance_colorbalance_get_value), - (gst_videobalance_update_properties), - (gst_videobalance_update_tables_planar411), - (gst_videobalance_planar411): - * gst/videofilter/gstvideobalance.h: - Implement lookup-tables. +/- 10x faster. - -2004-01-25 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_avih), - (gst_avi_demux_stream_odml), (gst_avi_demux_stream_index): - The index reading was broken. The rest worked fine, but the whole - goal of my rewrite was to make avidemux readable, and this was - not at all readable. Please use typed variables. - -2004-01-25 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): - Additional pad usability check. - * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_init), - (mp1videoparse_find_next_gop), (gst_mp1videoparse_time_code), - (gst_mp1videoparse_real_chain): - Fix MPEG video stream parsing. The original plugin had several - issues, including not timestamping streams where the source was - not timestamped (this happens with PTS values in mpeg system - streams, but MPEG video is also a valid stream on its own so - that needs timestamps too). We use the display time code for that - for now. Also, if one incoming buffer contains multiple valid - frames, we push them all on correctly now, including proper EOS - handling. Lastly, several potential segfaults were fixed, and we - properly sync on new sequence/gop headers to include them in next, - not previous frames (since they're header for the next frame, not - the previous). Also see #119206. - * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain), - (bpf_from_header): - Move caps setting so we only do it after finding several valid - MPEG-1 fraes sequentially, not right after the first one (which - might be coincidental). - * gst/typefind/gsttypefindfunctions.c: (mpeg1_sys_type_find), - (mpeg_video_type_find), (mpeg_video_stream_type_find), - (plugin_init): - Add unsynced MPEG video stream typefinding, and change some - probability values so we detect streams rightly. The idea is as - follows: I can have an unsynced system stream which contains - video. In the current code, I would randomly get a type for either - system or video stream type found, because the probabilities are - being calculated rather randomly. I now use fixed values, so we - always prefer system stream if that was found (and that is how it - should be). If no system stream was found, we can still identity the stream as video-only. - -2004-01-23 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_avih), - (gst_avi_demux_stream_odml), (gst_avi_demux_stream_index): - don't write to buffer. Extract data without the need of - __attribute__ ((packed)) - -2004-01-23 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/typefind/gsttypefindfunctions.c: (mpeg1_parse_header), - (mpeg1_sys_type_find): - Fix MPEG-1 stream typefinding. - -2004-01-23 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/typefind/gsttypefindfunctions.c: (mpeg2_sys_type_find): - Fix typefinding for MPEG-1 system streams, similar to MPEG-2. - -2004-01-23 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/esd/esdsink.c: (gst_esdsink_open_audio): - * ext/esd/gstesd.c: (plugin_init): - private debugging, better error reporting - -2004-01-23 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_class_init), - (gst_riff_read_init), (gst_riff_read_change_state): - * gst-libs/gst/riff/riff-read.h: - Remove stuff fromold metadata system. - -2004-01-23 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/ogg/gstoggdemux.c: - Fix wrong file comment. - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_info): - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_header): - Add metadata reading properly. - -2004-01-23 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/Makefile.am: - Fix nas DIST_SUBDIRS - Uraeus: - Fix bug where make distcheck doesn't get run on adding stuff to - the build. - -2004-01-23 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/divx/gstdivxdec.c: (gst_divxdec_init), (gst_divxdec_setup): - * ext/divx/gstdivxdec.h: - Fix divx3 ("msmpeg4") playback using divxdec. - -2004-01-23 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/typefind/gsttypefindfunctions.c: - (mp3_type_frame_length_from_header): fix bug in length computation - (mp3_type_find): improve debugging output - -2004-01-23 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup), - (gst_play_set_location), (gst_play_seek_to_time), - (gst_play_set_audio_sink), (gst_play_set_visualization), - (gst_play_connect_visualization), (gst_play_get_sink_element): Reworked - the pipeline from scratch. Visualization is back and switch went out as - i realized it was not possible to use the way i wanted. - * sys/ximage/ximagesink.c: (gst_ximagesink_imagepool_clear), - (gst_ximagesink_change_state), (gst_ximagesink_dispose): Move xcontext - clearing in state change from READY to NULL. So that one can clean the - X ressources keeping the element. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), - (gst_xvimagesink_imagepool_clear), (gst_xvimagesink_change_state), - (gst_xvimagesink_colorbalance_set_value), - (gst_xvimagesink_colorbalance_get_value), - (gst_xvimagesink_set_property), (gst_xvimagesink_dispose), - (gst_xvimagesink_init): Same xcontext cleaning than ximagesink in state - change from READY to NULL and fixed some stupid bugs in colorbalance - get/set values. Also added the following feature : when nobody tries to - set some values to the colorbalance levels before the xcontext is - grabbed, then when creating channels list from Xv attributes we set the - internal values to the Xv defaults. This way we handle buggy Xv drivers - that set default hue values far from the middle of the range (Thanks - to Jon Trowbridge for pointing that issue). - * sys/xvimage/xvimagesink.h: Adding a cb_changed boolean to know if - colorbalance levels have been set before xcontext is grabbed. - -2004-01-22 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * sys/oss/gstosselement.c: (gst_osselement_class_probe_devices): - Fix the ossmixer case where we shouldn't open /dev/dsp* because - it might block operations (which is bad for a mixer). - -2004-01-22 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/media-info/media-info-priv.c: (have_type_callback), - (deep_notify_callback), (gmi_set_decoder), (gmi_clear_decoder), - (gmip_find_type_pre): - * gst-libs/gst/media-info/media-info-priv.h: - * gst-libs/gst/media-info/media-info.c: - (gst_media_info_instance_init), (gst_media_info_read_idler): - add fakesink to get caps on decoder src pad again - fix callback prototype to match new have_type signal signature - -2004-01-22 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/adder/gstadder.c: (gst_adder_link): - fix non-compile and cut-n-paste code - -2004-01-21 David Schleef <ds@schleef.org> - - * ext/swfdec/gstswfdec.c: (gst_swfdec_video_getcaps), - (gst_swfdec_video_link), (copy_image), (gst_swfdec_loop), - (gst_swfdec_init), (gst_swfdec_change_state): - * ext/swfdec/gstswfdec.h: - Fix negotiation. - * gst/adder/gstadder.c: (gst_adder_link), (gst_adder_init), - (gst_adder_request_new_pad): Fix negotiation. - * gst/goom/gstgoom.c: (gst_goom_init), (gst_goom_src_fixate): - Add a fixate function. - * gst/intfloat/gstfloat2int.c: - * gst/intfloat/gstfloat2int.h: - * gst/intfloat/gstint2float.c: - * gst/intfloat/gstint2float.h: - Completely rewrite the negotiation. Doesn't quite work yet, - due to some buffer-frames problem. - -2004-01-21 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/gnomevfs/gstgnomevfssrc.c: - * sys/v4l2/v4l2_calls.h: - fix includes for distcheck - -2004-01-21 Christian Schaller <uraeus@gnome.org> - - * ext/nas/ - Add libnas (network audio system) plugin, patch from Arwed von Merkatz - based on earlier patch from Laurent Vivier - -2004-01-20 Jeremy Simon <jesimon@libertysurf.fr> - - * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_caps_to_extradata): - Fix wma caps property - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_audio_caps): - Fix typo (flags1 and flags2) - -2004-01-20 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/media-info/media-info-priv.c: - (deep_notify_callback), (gmi_seek_to_track), (gmi_get_decoder), - (gmip_find_type_pre), (gmip_find_type), (gmip_find_stream_post), - (gmip_find_stream), (gmip_find_track_metadata), - (gmip_find_track_streaminfo_post), (gmip_find_track_streaminfo), - (gmip_find_track_format): - * gst-libs/gst/media-info/media-info-priv.h: - * gst-libs/gst/media-info/media-info-test.c: (main): - * gst-libs/gst/media-info/media-info.c: (gst_media_info_init), - (gst_media_info_read_idler), (gst_media_info_read): - * gst-libs/gst/media-info/media-info.h: - register debugging category and use it for debugging - -2004-01-20 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/vorbis/vorbisfile.c: (gst_vorbisfile_update_streaminfo), - (gst_vorbisfile_new_link): - signal streaminfo through tags - -2004-01-20 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/mplex/gstmplex.cc: - * ext/mplex/gstmplexibitstream.cc: - g++ doesn't like NULL in our i18n/error macros, should be - either (NULL) or (""). - -2004-01-20 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * sys/dxr3/dxr3audiosink.c: - * sys/dxr3/dxr3init.c: - * sys/dxr3/dxr3spusink.c: (dxr3spusink_close): - * sys/dxr3/dxr3videosink.c: (dxr3videosink_close): - Fix more error error error errors (missing includes here). - -2004-01-20 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - fix thomas' error errors. - -2004-01-20 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/mpeg2enc/gstmpeg2enc.cc: - fix error errors. - -2004-01-20 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/divx/gstdivxdec.c: (gst_divxdec_setup), (gst_divxdec_chain): - * ext/divx/gstdivxenc.c: (gst_divxenc_setup), (gst_divxenc_chain): - Fix for new error system. - -2004-01-20 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/divx/gstdivxenc.c: (gst_divxenc_setup), (gst_divxenc_chain): - fix for new error reporting - -2004-01-20 David Schleef <ds@schleef.org> - - * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents), - (gst_ximagesink_xcontext_get), (gst_ximagesink_getcaps), - (gst_ximagesink_set_xwindow_id): Change to using a framerate - of 1,100 instead of 0,MAX, since 0 isn't handled correctly, - and neither is 100+, most likely. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support), - (gst_xvimagesink_getcaps): same - -2004-01-19 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * configure.ac: - Up version requirement to 2.0.3 (not yet released) to avoid symbol - clashes with ffmpeg. - -2004-01-20 Julien MOUTTE <julien@moutte.net> - - * gst/switch/gstswitch.c: (gst_switch_request_new_pad), - (gst_switch_init): Fixed switch element : proxying link and setting - caps from src to sink on request. - -2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_overlay): - * sys/v4l2/v4l2-overlay_calls.c: (gst_v4l2_set_display), - (gst_v4l2_set_window), (gst_v4l2_enable_overlay): - fix element_error - -2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/v4l/v4l_calls.h: - * sys/v4l2/v4l2_calls.h: - element_error fixes - -2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/gst-i18n-plugin.h: - add locale.h - remove config.h inclusion - -2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org> - - * autogen.sh: - adding autopoint invocation - * Makefile.am: - * configure.ac: - * gst-libs/gst/gettext.h: - adding gettext bits - * ext/audiofile/gstafsink.c: (gst_afsink_plugin_init): - * ext/audiofile/gstafsrc.c: (gst_afsrc_plugin_init): - * ext/gnomevfs/gstgnomevfs.c: (plugin_init): - * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file), - (gst_gnomevfssink_close_file): - * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_open_file): - * ext/sndfile/gstsf.c: (gst_sf_loop), (plugin_init): - * gst-libs/gst/gst-i18n-plugin.h: - * gst/avi/gstavi.c: (plugin_init): - * sys/dxr3/dxr3init.c: (plugin_init): - * sys/dxr3/dxr3videosink.c: (dxr3videosink_write_data): - * sys/oss/gstossaudio.c: (plugin_init): - * sys/oss/gstosselement.c: (gst_osselement_open_audio): - * sys/v4l/gstv4l.c: (plugin_init): - * sys/v4l/v4l_calls.c: (gst_v4l_open): - * sys/v4l2/gstv4l2.c: (plugin_init): - * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), - (gst_v4l2_fill_lists), (gst_v4l2_get_norm), (gst_v4l2_set_norm), - (gst_v4l2_get_input), (gst_v4l2_set_input), (gst_v4l2_get_output), - (gst_v4l2_set_output), (gst_v4l2_get_frequency), - (gst_v4l2_set_frequency), (gst_v4l2_signal_strength), - (gst_v4l2_get_attribute), (gst_v4l2_set_attribute): - make sure locale and translation domain are set - fix translated strings - * po/.cvsignore: - * po/LINGUAS: - * po/Makevars: - * po/POTFILES.in: - * po/nl.po: - put translation files into place - * sys/xvideo/imagetest.c: (main): - * ext/dv/demo-play.c: (main): - fix unnecessary translations - -2004-01-19 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * ext/sndfile/gstsf.c: - * gst/avi/gstavimux.c: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsrc.c: - * ext/gnomevfs/gstgnomevfssink.c: - * ext/gnomevfs/gstgnomevfssrc.c: - * sys/oss/gstosselement.c: - * sys/v4l/v4l_calls.h: - fix i18n include - -2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), - (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_get_norm), - (gst_v4l2_set_norm), (gst_v4l2_get_input), (gst_v4l2_set_input), - (gst_v4l2_get_output), (gst_v4l2_set_output), - (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), - (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), - (gst_v4l2_set_attribute): - update to new error handling - -2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org> - - * ext/sidplay/gstsiddec.cc: - * gst/modplug/gstmodplug.cc: - parenthese NULL because C++ seems angry about it - -2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/gst-i18n-plugin.h: - add skeleton i18n stuff, but needs to be further implemented - -2004-01-18 Thomas Vander Stichele <thomas at apestaart dot org> - - * examples/gstplay/player.c: (main): - * ext/aalib/gstaasink.c: (gst_aasink_open): - * ext/alsa/gstalsa.c: (gst_alsa_link), (gst_alsa_xrun_recovery): - * ext/alsa/gstalsasink.c: (gst_alsa_sink_loop): - * ext/alsa/gstalsasrc.c: (gst_alsa_src_loop): - * ext/audiofile/gstafsink.c: (gst_afsink_open_file), - (gst_afsink_close_file): - * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), - (gst_afsrc_close_file): - * ext/divx/gstdivxdec.c: (gst_divxdec_setup), (gst_divxdec_chain): - * ext/dv/gstdvdec.c: (gst_dvdec_loop): - * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_user_op), (dvdnavsrc_get): - * ext/esd/esdmon.c: (gst_esdmon_get): - * ext/esd/esdsink.c: (gst_esdsink_chain): - * ext/faac/gstfaac.c: (gst_faac_chain): - * ext/faad/gstfaad.c: (gst_faad_chain): - * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): - * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): - * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_loop): - * ext/flac/gstflacdec.c: (gst_flacdec_error_callback), - (gst_flacdec_loop): - * ext/flac/gstflacenc.c: (gst_flacenc_chain): - * ext/flac/gstflactag.c: (gst_flac_tag_chain): - * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): - * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_open_file), - (gst_gnomevfssink_close_file): - * ext/gnomevfs/gstgnomevfssrc.c: (audiocast_init), - (gst_gnomevfssrc_open_file): - * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_loop): - * ext/lame/gstlame.c: (gst_lame_sink_link), (gst_lame_chain): - * ext/lcs/gstcolorspace.c: (gst_colorspace_srcconnect_func): - * ext/mad/gstid3tag.c: (gst_id3_tag_handle_event), - (gst_id3_tag_do_typefind), (gst_id3_tag_chain): - * ext/mad/gstmad.c: (gst_mad_chain): - * ext/mikmod/gstmikmod.c: (gst_mikmod_loop): - * ext/mpeg2dec/gstmpeg2dec.c: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - * ext/mplex/gstmplex.cc: - * ext/mplex/gstmplexibitstream.cc: - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain), - (gst_ogg_demux_push), (gst_ogg_pad_push): - * ext/raw1394/gstdv1394src.c: - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_lock), - (gst_sdlvideosink_initsdl), (gst_sdlvideosink_create): - * ext/sidplay/gstsiddec.cc: - * ext/sndfile/gstsf.c: (gst_sf_open_file), (gst_sf_close_file), - (gst_sf_loop): - * ext/speex/gstspeexenc.c: (gst_speexenc_chain): - * ext/tarkin/gsttarkindec.c: (gst_tarkindec_chain): - * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_chain): - * ext/vorbis/vorbisenc.c: (gst_vorbisenc_chain): - * ext/vorbis/vorbisfile.c: (gst_vorbisfile_loop): - * ext/xvid/gstxviddec.c: (gst_xviddec_setup), (gst_xviddec_chain): - * ext/xvid/gstxvidenc.c: (gst_xvidenc_setup), (gst_xvidenc_chain): - * gst-libs/gst/Makefile.am: - * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head), - (gst_riff_read_element_data), (gst_riff_read_seek), - (gst_riff_peek_list), (gst_riff_read_list), (gst_riff_read_header): - * gst/adder/gstadder.c: (gst_adder_parse_caps), (gst_adder_loop): - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_process_segment), - (gst_asf_demux_process_stream), (gst_asf_demux_get_stream): - * gst/avi/gstavidemux.c: (gst_avi_demux_stream_init), - (gst_avi_demux_add_stream), (gst_avi_demux_stream_header): - * gst/avi/gstavimux.c: (gst_avimux_stop_file): - * gst/flx/gstflxdec.c: (gst_flxdec_loop): - * gst/goom/gstgoom.c: (gst_goom_chain): - * gst/id3/gstid3types.c: (gst_id3types_loop): - * gst/intfloat/gstfloat2int.c: (gst_float2int_loop): - * gst/intfloat/gstint2float.c: (gst_int2float_chain_gint16): - * gst/matroska/ebml-read.c: (gst_ebml_read_element_id), - (gst_ebml_read_element_length), (gst_ebml_read_element_data), - (gst_ebml_read_seek), (gst_ebml_read_uint), (gst_ebml_read_sint), - (gst_ebml_read_float), (gst_ebml_read_header): - * gst/matroska/matroska-demux.c: (gst_matroska_demux_init_stream), - (gst_matroska_demux_parse_blockgroup): - * gst/modplug/gstmodplug.cc: - * gst/monoscope/gstmonoscope.c: (gst_monoscope_chain): - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop): - * gst/oneton/gstoneton.c: (gst_oneton_chain): - * gst/silence/gstsilence.c: (gst_silence_get): - * gst/sine/gstsinesrc.c: (gst_sinesrc_get): - * gst/smpte/gstsmpte.c: (gst_smpte_loop): - * gst/speed/gstspeed.c: (speed_loop): - * gst/tags/gstvorbistag.c: (gst_vorbis_tag_chain): - * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): - * gst/volenv/gstvolenv.c: (gst_volenv_chain): - * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): - * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt), - (gst_wavparse_loop): - * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_open), - (dxr3audiosink_set_mode_pcm), (dxr3audiosink_set_mode_ac3), - (dxr3audiosink_close): - * sys/dxr3/dxr3spusink.c: (dxr3spusink_open), (dxr3spusink_close): - * sys/dxr3/dxr3videosink.c: (dxr3videosink_open), - (dxr3videosink_close), (dxr3videosink_write_data): - * sys/oss/gstosselement.c: (gst_osselement_open_audio): - * sys/oss/gstosselement.h: - * sys/oss/gstosssink.c: (gst_osssink_get_type), (gst_osssink_init), - (gst_osssink_chain): - * sys/oss/gstosssrc.c: (gst_osssrc_get): - * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_chain): - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_buffer_free): - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_buffer_free): - * sys/v4l/v4l-overlay_calls.c: (gst_v4l_set_window), - (gst_v4l_enable_overlay): - * sys/v4l/v4l_calls.c: (gst_v4l_get_capabilities), (gst_v4l_open), - (gst_v4l_set_chan_norm), (gst_v4l_get_signal), - (gst_v4l_get_frequency), (gst_v4l_set_frequency), - (gst_v4l_get_picture), (gst_v4l_set_picture), (gst_v4l_get_audio), - (gst_v4l_set_audio): - * sys/v4l/v4l_calls.h: - * sys/v4l/v4lmjpegsink_calls.c: (gst_v4lmjpegsink_sync_thread), - (gst_v4lmjpegsink_queue_frame), (gst_v4lmjpegsink_set_playback), - (gst_v4lmjpegsink_playback_init), - (gst_v4lmjpegsink_playback_start): - * sys/v4l/v4lmjpegsrc_calls.c: (gst_v4lmjpegsrc_queue_frame), - (gst_v4lmjpegsrc_sync_next_frame), (gst_v4lmjpegsrc_set_capture), - (gst_v4lmjpegsrc_set_capture_m), (gst_v4lmjpegsrc_capture_init), - (gst_v4lmjpegsrc_requeue_frame): - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_queue_frame), - (gst_v4lsrc_sync_frame), (gst_v4lsrc_capture_init), - (gst_v4lsrc_requeue_frame), (gst_v4lsrc_try_palette): - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get): - * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), - (gst_v4l2src_queue_frame), (gst_v4l2src_grab_frame), - (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), - (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), - (gst_v4l2src_capture_stop): - * sys/vcd/vcdsrc.c: (vcdsrc_open_file): - * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), - (gst_ximagesink_chain): - * sys/xvideo/xvideosink.c: (gst_xvideosink_buffer_new), - (gst_xvideosink_sinkconnect), (gst_xvideosink_chain), - (gst_xvideosink_xwindow_new): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), - (gst_xvimagesink_chain): - use new error signal, function and categories - -2004-01-18 Jeremy Simon <jesimon@libertysurf.fr> - - * configure.ac: - * ext/Makefile.am: - * ext/musicbrainz/gsttrm.c: - * ext/musicbrainz/gsttrm.h: - * ext/musicbrainz/Makefile.am: - Add a trm plugin - -2004-01-18 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_set_property), - (gst_ximagesink_get_property), (gst_ximagesink_class_init): Adding - synchronous property for debugging. - * sys/ximage/ximagesink.h: Adding the synchronous boolean flag. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), - (gst_xvimagesink_set_property): Moving a pointer declaration to a - smaller block, fixing indent. - -2004-01-16 David Schleef <ds@schleef.org> - - * gst/videofilter/gstvideobalance.c: Fix regression; changing a - property affects the video stream. - * sys/xvimage/xvimagesink.c: - * sys/xvimage/xvimagesink.h: - Add synchronous property for debugging. Should probably be - disabled in non-CVS builds. Make sure that the Xv attribute - exists before we set it (crash!). Fix a silly float bug that - caused colorbalance to just not work. - -2004-01-17 Christian Schaller <Uraeus@gnome.org> - - * tools/gst-launch-ext.in - update for new plugins - -2004-01-16 David Schleef <ds@schleef.org> - - * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): Fix use of - already-freed caps. - -2994-01-16 Christian Schaller <Uraeus@gnome.org> - - * Update spec for new colorspace plugin and libcaca plugin - * Fix compilation of libcaca plugin (clock -> id) - -2004-01-16 Julien MOUTTE <julien@moutte.net> - - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_update_colorbalance), - (gst_xvimagesink_xcontext_get), (gst_xvimagesink_change_state), - (gst_xvimagesink_set_xwindow_id), - (gst_xvimagesink_colorbalance_set_value), - (gst_xvimagesink_colorbalance_get_value), - (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), - (gst_xvimagesink_init), (gst_xvimagesink_class_init): Implementing - correct colorbalance properties. They can now be set when the element - is still in NULL state. The values will be committed to the Xv Port - when xcontext is initialized. - * sys/xvimage/xvimagesink.h: Added hue, saturation, contrast, - brightness int values in the GstXvImagesink structure. - -2004-01-16 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst-libs/gst/Makefile.am: - restructure so having local patches works easier. - -2004-01-16 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/mpeg2enc/Makefile.am: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - Bugfix with respect to EOS handling. - -2004-01-16 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): - Link with right caps (else, it segfaults). - * ext/mplex/gstmplexjob.cc: - Fix for slight API change in 1.6.1.93 release of mjpegtools. - -2004-01-15 David Schleef <ds@schleef.org> - - * gst-libs/gst/audio/Makefile.am: - Add gstaudiofiltertemplate.c and building of gstaudiofilterexample.c - from the template. - * gst-libs/gst/audio/gstaudiofilter.c: - * gst-libs/gst/audio/gstaudiofilter.h: - Add bytes_per_sample and size and n_samples calculation. - * gst-libs/gst/audio/gstaudiofilterexample.c: - Remove, now autogenerated. - * gst-libs/gst/audio/gstaudiofiltertemplate.c: - Moved from gstaudiofilterexample, object name changed, code added - so that it actually works. - * gst-libs/gst/audio/make_filter: - Script to build an audiofilter subclass from the template. - * gst/colorspace/Makefile.am: - * gst/colorspace/yuv2yuv.c: - Remove file, since it's GPL, and we don't use it. - -2004-01-15 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_chain): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): Making both of - them use the buffer free function to test how the buffer was allocated. - -2004-01-15 David Schleef <ds@schleef.org> - - * ext/esd/esdsink.c: (gst_esdsink_class_init): Remove property - that handles osssink fallback. - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_init), - (gst_audio_convert_getcaps): - * gst/qtdemux/qtdemux.c: (qtdemux_audio_caps): - Add audio/x-qdm2 for QDM2 audio. - * gst/sine/gstsinesrc.c: (gst_sinesrc_get): - * gst/sine/gstsinesrc.h: Add example of how to implement tags. - * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps): - Decrease minimum size to 16x16. - * gst/wavparse/gstwavparse.c: - Convert disabled pad template caps to new caps. - * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), - (gst_xvimagesink_chain): Throw element error when display cannot - be opened. Increase minimum framerate to 1.0. Check the data - free function on a buffer to make sure it is the type we expect - before manipulating it. - -2004-01-15 Julien MOUTTE <julien@moutte.net> - - * gst/videofilter/gstvideobalance.c: (gst_videobalance_init), - (gst_videobalance_colorbalance_set_value): Implement passthru if - settings are in the middle. - * tools/gst-launch-ext.in: Stop using xvideosink, use ximagesink. - -2004-01-15 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/videofilter/Makefile.am: - * gst/volume/Makefile.am: - Since we use videofilter symbols, link to it. - -2004-01-15 Julien MOUTTE <julien@moutte.net> - - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_interface_init): Setting - mixer interface type to HARDWARE. - * gst-libs/gst/mixer/mixer.c: (gst_mixer_class_init): Adding a default - type to SOFTWARE. - * gst-libs/gst/mixer/mixer.h: Adding mixer interface type and macro. - * gst-libs/gst/mixer/mixertrack.h: Adding mixertrack flag SOFTWARE. - * gst/volume/gstvolume.c: (gst_volume_interface_supported), - (gst_volume_interface_init), (gst_volume_list_tracks), - (gst_volume_set_volume), (gst_volume_get_volume), - (gst_volume_set_mute), (gst_volume_mixer_init), - (gst_volume_dispose), (gst_volume_get_type), (volume_class_init), - (volume_init): Implementing mixer interface. - * gst/volume/gstvolume.h: Adding tracklist for mixer interface. - * sys/oss/gstosselement.c: (gst_osselement_get_type), - (gst_osselement_change_state): Removing some trailing commas in - structures. - * sys/oss/gstossmixer.c: (gst_ossmixer_interface_init): Setting mixer - interface type to HARDWARE. - * sys/v4l/gstv4lcolorbalance.c: - (gst_v4l_color_balance_interface_init): Setting colorbalance interface - type to HARDWARE. - * sys/v4l2/gstv4l2colorbalance.c: - (gst_v4l2_color_balance_interface_init): Setting colorbalance - interface type to HARDWARE. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): use exactly the - same code than ximagesink for event handling. - -2004-01-15 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/snapshot/Makefile.am: - * ext/snapshot/gstsnapshot.c: (gst_snapshot_sinkconnect), - (gst_snapshot_chain): - * ext/snapshot/gstsnapshot.h: - This has to be a joke... Snapshot should be connected to a tee, - colorspace element before it and EOS after that, where the other - src of the tee receives normal data. - The current way is *wrong*. - -2004-01-15 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/hermes/gsthermescolorspace.c: - Fix another compile error. Same as below. - -2004-01-15 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/colorspace/gstcolorspace.c: - * gst/colorspace/yuv2yuv.c: (gst_colorspace_yuy2_to_i420), - (gst_colorspace_i420_to_yv12): - Fix compiling... Didn't test if it actually works. - -2004-01-15 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/colorspace/Makefile.am: - * gst/colorspace/gstcolorspace.c: - * gst/colorspace/gstcolorspace.h: - * gst/colorspace/yuv2rgb.c: - * gst/colorspace/yuv2rgb.h: - Duplicate the ext/hermes colorspace plugin, and remove Hermes - code and GPL code. Fix for new caps negotiation. Rewrite - much of the format handling code, and some of the conversion - code. Basically, rewrote almost everything. This element - handles I420, YV12 to RGB conversions. - * ext/hermes/Makefile.am: - * ext/hermes/gsthermescolorspace.c: - Rename colorspace to hermescolorspace. Fix negotiation issues. - Remove non-Hermes related code. This element handles lots of - RGB to RGB conversions, but no YUV. - * ext/hermes/gstcolorspace.c: - * ext/hermes/gstcolorspace.h: - * ext/hermes/rgb2yuv.c: - * ext/hermes/yuv2rgb.c: - * ext/hermes/yuv2rgb.h: - * ext/hermes/yuv2rgb_mmx16.s: - * ext/hermes/yuv2yuv.c: - * ext/hermes/yuv2yuv.h: - Remove old code. - -2004-01-14 Colin Walters <walters@verbum.org> - - * ext/mad/gstid3tag.c (gst_id3_tag_chain): Don't nego caps if - they've already been. - -2004-01-15 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/mad/gstid3tag.c: (gst_id3_tag_do_caps_nego): - assume tag mode when pad is not connected - -2004-01-15 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): - Don't update the time of the clock - (gst_alsa_sink_loop): - sync to the clock given to alsasink, not the own clock - * sys/oss/gstosssink.c: (gst_osssink_chain): - sync to the clock - (gst_osssink_change_state): - activate the clock - * sys/ximage/ximagesink.c: (gst_ximagesink_chain): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): - remove bogus code that made DISCONT events unhandled - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_video_caps): - explicitly case to double in _set_simple. (fixes 2nd warning in bug - #131502) - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_read_object_header), - (gst_asf_demux_handle_sink_event), (gst_asf_demux_audio_caps), - (gst_asf_demux_add_audio_stream), (gst_asf_demux_video_caps): - convert g_warning because of wrong asf data to GST_WARNINGs (fixes - 2nd warning in bug #131502) - -2004-01-14 Julien MOUTTE <julien@moutte.net> - - * gst/videofilter/gstvideobalance.c: (gst_videobalance_init), - (gst_videobalance_colorbalance_set_value), - (gst_videobalance_colorbalance_get_value): Fixing videobalance ranges - for colorbalance interface implementation. - * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get), - (gst_ximagesink_set_property), (gst_ximagesink_get_property), - (gst_ximagesink_dispose), (gst_ximagesink_init), - (gst_ximagesink_class_init): Adding DISPLAY property. - * sys/ximage/ximagesink.h: Adding display_name to store display. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), - (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), - (gst_xvimagesink_dispose), (gst_xvimagesink_init), - (gst_xvimagesink_class_init): Adding DISPLAY property and colorbalance - properties (they still need polishing though for gst-launch use : no - xcontext yet, i ll do that tomorrow). - * sys/xvimage/xvimagesink.h: Adding display_name to store display. - -2004-01-14 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup), - (gst_play_set_location), (gst_play_set_visualization): Preparing - switch integration, adding videobalance in the pipeline. - -2004-01-14 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/colorbalance/colorbalance.c: - (gst_color_balance_class_init): Adding a default type. - * gst-libs/gst/colorbalance/colorbalance.h: Adding a macro to access - the type. - * gst/videofilter/gstvideobalance.c: (gst_videobalance_get_type), - (gst_videobalance_dispose), (gst_videobalance_class_init), - (gst_videobalance_init), (gst_videobalance_interface_supported), - (gst_videobalance_interface_init), - (gst_videobalance_colorbalance_list_channels), - (gst_videobalance_colorbalance_set_value), - (gst_videobalance_colorbalance_get_value), - (gst_videobalance_colorbalance_init): Implementing colorbalance - interface. - * gst/videofilter/gstvideobalance.h: Adding colorbalance channels - list. - * sys/ximage/ximagesink.c: (gst_ximagesink_set_xwindow_id): Fixing a - bug which was triggering a BadAccess X error when setting an overlay - before pad was really negotiated. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_colorbalance_init): - Using the colorbalance type macro. - -2004-01-14 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/flac/gstflacenc.c: (gst_flacenc_set_metadata), - (gst_flacenc_chain): - handle tags correctly - * gst/tags/gstid3tag.c: (gst_tag_list_new_from_id3v1): - extract ID3v1 tags correctly - -2004-01-14 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/typefind/gsttypefindfunctions.c: (matroska_type_find), - (plugin_init): - Improve matroska typefinding for odd-typed headers... - -2004-01-14 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): - Fix for using incremental number on padnames. - -2004-01-14 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/divx/gstdivxdec.c: - * ext/divx/gstdivxenc.c: - Set category to divx4linux instead of divx (too generic). - * gst/wavparse/gstwavparse.c: (gst_wavparse_init), - (gst_wavparse_parse_fmt), (gst_wavparse_handle_sink_event), - (gst_wavparse_loop), (gst_wavparse_change_state): - * gst/wavparse/gstwavparse.h: - fix parsing of WAV files with non-standard fmt-tag size and fix - skipping of unrecognized chunks... Someone please fix this thing - to use rifflib so all this is automated. - * sys/v4l/Makefile.am: - * sys/v4l2/Makefile.am: - Add X_CFLAGS because we depend on X (for overlay). - -2004-01-14 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/mpeg2dec/gstmpeg2dec.c: - Don't issue a timestamp unless we tagged the frame - with a PTS. - -2004-01-14 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst-libs/gst/play/gstplay.c: (gst_play_tick_callback): - Query the audio element to get the time, not the clock. We're - interested in the element's time here. - -2004-01-14 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/aalib/gstaasink.c: (gst_aasink_chain): - * ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event): - * ext/esd/esdsink.c: (gst_esdsink_chain): - * ext/libcaca/gstcacasink.c: (gst_cacasink_chain): - * ext/mas/massink.c: (gst_massink_chain): - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_chain): - * gst/matroska/matroska-demux.c: (gst_matroska_demux_parse_index), - (gst_matroska_demux_parse_metadata): - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop), - (gst_mpeg_parse_release_locks): - * gst/tcp/gsttcpsink.c: (gst_tcpsink_chain): - * gst/udp/gstudpsink.c: (gst_udpsink_chain): - * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): - * sys/oss/gstosssink.c: (gst_osssink_init), (gst_osssink_chain), - (gst_osssink_change_state): - * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_chain): - * sys/ximage/ximagesink.c: (gst_ximagesink_chain): - * sys/xvideo/xvideosink.c: (gst_xvideosink_chain), - (gst_xvideosink_release_locks): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): - use element time. - * ext/alsa/gstalsaclock.c: (gst_alsa_clock_start), - (gst_alsa_clock_stop): - * gst-libs/gst/audio/audioclock.c: (gst_audio_clock_set_active), - (gst_audio_clock_get_internal_time): - simplify for use with new clocking code. - * testsuite/alsa/Makefile.am: - * testsuite/alsa/sinesrc.c: (sinesrc_init), (sinesrc_force_caps): - fix testsuite for new caps system - -2004-01-14 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/flac/gstflacdec.c: (gst_flacdec_update_metadata): - * ext/flac/gstflacenc.c: (add_one_tag): - length is already host endian, no need to convert. Fixes playback of - tagged files on PPC. (bug #128384) - -2004-01-13 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/colorbalance/colorbalance.h: Adding a type to the - colorbalance interface stating if it is hardware based or software - based. - * gst/videofilter/gstvideobalance.c: (gst_videobalance_planar411): - Removing a trailing comma. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), - (gst_xvimagesink_colorbalance_init): Integrating a patch from Jon - Trowbridge <trow@ximian.com> querying Xv adaptor for min/max value as - the documentation seems to be wrong on the -1000 to 1000 interval. - -2004-01-12 David Schleef <ds@schleef.org> - - * gst/debug/efence.c: (gst_efence_init), (gst_efence_chain), - (gst_efence_buffer_alloc), (gst_fenced_buffer_new), - (gst_fenced_buffer_default_free), (gst_fenced_buffer_default_copy): - Fix negotiation. Add a bufferalloc function for the sink pad, - and generally clean up some of the code. - -2004-01-12 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/colorbalance/colorbalancechannel.c: - (gst_color_balance_channel_dispose): Adding safety check in dispose - method. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), - (gst_xvimagesink_xcontext_clear), - (gst_xvimagesink_interface_supported), - (gst_xvimagesink_colorbalance_list_channels), - (gst_xvimagesink_colorbalance_set_value), - (gst_xvimagesink_colorbalance_get_value), - (gst_xvimagesink_colorbalance_init), (gst_xvimagesink_get_type): - Adding colorbalance interface support to set XV parameters such as - HUE, BRIGHTNESS, CONTRAST, SATURATION. - * sys/xvimage/xvimagesink.h: Adding the channels list for colorbalance - interface. - -2004-01-12 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_get_type), - (gst_audio_convert_class_init), (gst_audioconvert_getcaps), - (gst_audio_convert_init), (gst_audio_convert_set_property), - (gst_audio_convert_get_property), (gst_audio_convert_chain), - (gst_audio_convert_link), - (gst_audio_convert_buffer_to_default_format), - (gst_audio_convert_buffer_from_default_format), (plugin_init): - - implement _getcaps and use it - - improve linking - - remove float caps since no float conversion is actually done - - remove properties and arguments that were to be used for rate - conversion - -2004-01-12 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst-libs/gst/audio/audio.c: (_gst_audio_structure_set_list), - (gst_audio_structure_set_int): - * gst-libs/gst/audio/audio.h: - add helper functions for _getcaps matching the standard audio - templates - -2004-01-12 David Schleef <ds@schleef.org> - - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_link): - Test that pad is negotiated before getting its caps. - -2004-01-12 Julien MOUTTE <julien@moutte.net> - - * gst-libs/gst/play/gstplay.c: (gst_play_get_sink_element): When - analyzing the pads of an element the bin is mostly in READY state so - no caps were negotiated. This helper function needs to work with - _get_caps directly then. I was not freeing them though, added that to - fix the mem leak. - -2004-01-12 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_chain): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain): Fixing the - direct put buffers detection. I prefer checking GST_BUFFER_PRIVATE - than the free_func. - -2004-01-12 Thomas Vander Stichele <thomas at apestaart dot org> - - * sys/oss/gstossaudio.c: (plugin_init): - * sys/oss/gstosselement.c: (gst_osselement_sync_parms): - * sys/oss/gstosselement.h: - make an oss debugging category - make failure more descriptive - -2004-01-11 David Schleef <ds@schleef.org> - - * ext/ffmpeg/gstffmpeg.c: - * ext/ffmpeg/gstffmpegcodecmap.c: - * ext/ffmpeg/gstffmpegdec.c: - * ext/ffmpeg/gstffmpegenc.c: - * ext/ffmpeg/gstffmpegprotocol.c: - * ext/gdk_pixbuf/gstgdkanimation.c: - * ext/jpeg/gstjpeg.c: - * ext/libpng/gstpng.c: - * ext/mpeg2dec/perftest.c: - * ext/speex/gstspeex.c: - * gst-libs/gst/resample/dtos.c: - * gst/intfloat/gstintfloatconvert.c: - * gst/oneton/gstoneton.c: - * gst/rtjpeg/RTjpeg.c: - * gst/rtp/gstrtp.c: - * sys/dxr3/dxr3init.c: - * sys/glsink/gstgl_nvimage.c: - * sys/glsink/gstgl_pdrimage.c: - * sys/glsink/gstglsink.c: - * testsuite/gst-lint: - Make sure everybody wraps #include "config.h" in #ifdef HAVE_CONFIG_H - -2004-01-11 David Schleef <ds@schleef.org> - - * ext/alsa/gstalsasrc.c: (gst_alsa_src_set_caps): - * ext/faac/gstfaac.c: (gst_faac_sinkconnect): - * ext/gdk_pixbuf/gstgdkanimation.c: - (gst_gdk_animation_iter_create_pixbuf): - * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link), - (gst_gdk_pixbuf_chain): - * ext/gdk_pixbuf/gstgdkpixbuf.h: - * ext/jack/gstjack.c: (gst_jack_change_state): - * ext/xvid/gstxviddec.c: (gst_xviddec_sink_link): - * gst-libs/gst/play/gstplay.c: (gst_play_get_sink_element): - * gst-libs/gst/play/play.c: (gst_play_get_sink_element): - * gst/videofilter/gstvideofilter.c: - (gst_videofilter_set_output_size): - Remove all usage of gst_pad_get_caps(), and replace it with - gst_pad_get_allowed_caps() or gst_pad_get_negotiated_cap(). - -2004-01-11 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/Makefile.am: Fixes to make ext/libcaca compile. - * ext/divx/gstdivxdec.c: - * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_sink_link), - (gst_gdk_pixbuf_init), (gst_gdk_pixbuf_chain): Make gdkpixbufdec - handle images that span multiple buffers. Now work with both - filesrc ! gdkpixbufdec and qtdemux ! gdkpixbufdec. - * ext/gdk_pixbuf/gstgdkpixbuf.h: - * ext/libcaca/gstcacasink.h: Fixes needed due to recent - video/video.h changes - * ext/xvid/gstxvid.c: (gst_xvid_csp_to_caps): same - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get), - (gst_v4lmjpegsrc_buffer_free): Use buffer free function instead - of GstData free function. - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get), (gst_v4lsrc_buffer_free): - same. - -2004-01-12 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * sys/v4l2/gstv4l2element.c: (gst_v4l2element_class_init), - (gst_v4l2element_dispose), (gst_v4l2element_set_property), - (gst_v4l2element_get_property): - * sys/v4l2/v4l2_calls.c: (gst_v4l2_set_defaults), (gst_v4l2_open): - add norm, channel and frequency properties. - * sys/v4l2/gstv4l2tuner.c: - fixes for tuner interface changes - * sys/v4l2/gstv4l2element.h: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/v4l2src_calls.c: - * sys/v4l2/v4l2src_calls.h: - rework v4l2src to work with saa1734 cards and allow mmaped buffers. - -2004-01-12 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst-libs/gst/tuner/tuner.c: (gst_tuner_class_init), - (gst_tuner_find_norm_by_name), (gst_v4l2_find_channel_by_name), - (gst_tuner_channel_changed), (gst_tuner_norm_changed), - (gst_tuner_frequency_changed), (gst_tuner_signal_changed): - * gst-libs/gst/tuner/tuner.h: - GObjects aren't const. - Add find_by_name functions. - Add checks to _changed functions. - * sys/v4l/gstv4ltuner.c: (gst_v4l_tuner_get_channel), - (gst_v4l_tuner_get_norm): - Fixes for above. - -2004-01-12 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst-libs/gst/video/video.h: - Fix caps template names to be understandable. - Prefix everything with GST_VIDEO. - * ext/aalib/gstaasink.c: - * ext/divx/gstdivxdec.c: - * ext/divx/gstdivxenc.c: - * ext/gdk_pixbuf/gstgdkpixbuf.c: - * ext/hermes/gstcolorspace.c: (gst_colorspace_base_init): - * ext/jpeg/gstjpegdec.c: (raw_caps_factory): - * ext/jpeg/gstjpegenc.c: (raw_caps_factory): - * ext/libcaca/gstcacasink.c: - * ext/libpng/gstpngenc.c: (raw_caps_factory): - * ext/snapshot/gstsnapshot.c: - * ext/swfdec/gstswfdec.c: - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxvidenc.c: - * gst/chart/gstchart.c: - * gst/deinterlace/gstdeinterlace.c: - * gst/effectv/gsteffectv.c: - * gst/flx/gstflxdec.c: (gst_flxdec_loop): - * gst/goom/gstgoom.c: - * gst/median/gstmedian.c: - * gst/monoscope/gstmonoscope.c: (gst_monoscope_init), - (gst_monoscope_srcconnect), (gst_monoscope_chain): - * gst/overlay/gstoverlay.c: - * gst/smooth/gstsmooth.c: - * gst/smpte/gstsmpte.c: - * gst/synaesthesia/gstsynaesthesia.c: - * gst/videocrop/gstvideocrop.c: - * gst/videodrop/gstvideodrop.c: - * gst/y4m/gsty4mencode.c: - * sys/qcam/gstqcamsrc.c: - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps): - Make them work with new video.h file. - * sys/ximage/ximagesink.c: (gst_ximagesink_chain), - (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), - (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc): - Make it work with new buffer allocation system. - -2004-01-11 Julien MOUTTE <julien@moutte.net> - - * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): Fixing the - pad_alloc_buffer implementation to use ->srcpad - * ext/hermes/gstcolorspace.c: (gst_colorspace_chain): Fixing the - pad_alloc_buffer implementation to use ->srcpad - * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): Fixing the - pad_alloc_buffer implementation to use ->srcpad - * sys/ximage/ximagesink.c: (gst_ximagesink_ximage_new), - (gst_ximagesink_chain), (gst_ximagesink_buffer_free), - (gst_ximagesink_buffer_alloc): Now only use GST_BUFFER_PRIVATE to keep - a reference to everything we need. - * sys/ximage/ximagesink.h: adding a reference to the sink in the image. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new), - (gst_xvimagesink_chain), (gst_xvimagesink_buffer_free), - (gst_xvimagesink_buffer_alloc): Now only use GST_BUFFER_PRIVATE to keep - a reference to everything we need. - * sys/xvimage/xvimagesink.h: adding a reference to the sink in the image - -2004-01-11 David Schleef <ds@schleef.org> - - * ext/divx/gstdivxenc.c: remove bogus gst_caps_is_fixed() test - * gst/debug/efence.c: (gst_efence_chain), (gst_fenced_buffer_new), - (gst_fenced_buffer_default_copy): Fix for rename of buffer private - structure members. - * gst/effectv/gstwarp.c: (gst_warptv_setup): Don't reset the time - value during a resize/renegotiation. - * gst/videofilter/gstvideofilter.c: (gst_videofilter_chain): use - gst_pad_alloc_buffer(); - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get), - (gst_v4lmjpegsrc_buffer_free): Fix for rename of buffer private - structure members. - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get), (gst_v4lsrc_buffer_free): - Fix for rename of buffer private structure members. - * sys/ximage/ximagesink.c: (gst_ximagesink_chain), - (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc): - Fix for rename of buffer private structure members. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), - (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc): - Fix for rename of buffer private structure members. - -2004-01-11 Arwed v. Merkatz <v.merkatz@gmx.net> - - reviewed by: David Schleef <ds@schleef.org> - - * gst/videofilter/Makefile.am: - * gst/videofilter/gstgamma.c: Gamma correction filter. Modified - from the patch by ds to fit in with recent make_filter changes. - -2004-01-11 Julien MOUTTE <julien@moutte.net> - - * configure.ac: Adding examples/switch/Makefile - * examples/Makefile.am: Adding examples/switch - * examples/switch/Makefile.am: Adding switcher example. - * examples/switch/switcher.c: (got_eos), (idle_iterate), - (switch_timer), (main): Adding an example demonstrating switch usage - with 2 videotestsrc showing different patterns. - * gst/switch/gstswitch.c: (gst_switch_request_new_pad), - (gst_switch_init): Fixing switch with the new caps system. - -2004-01-11 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst-libs/gst/video/video.h: - Fix 32bit caps. Issue remaining: The macro names are chosen poorly. - They should probably be like - GST_VIDEO_PAD_TEMPLATE_CAPS_{RGB,BGR,RGBx,BGRx}. - -2004-01-11 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (qtdemux_parse_trak): - fix audio chunk size/timestamp calculation - -2004-01-11 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps): - fix SVQ3 caps - -2004-01-11 Steve Baker <steve@stevebaker.org> - - * gst/effectv/gstaging.c: (gst_agingtv_get_type), - (gst_agingtv_base_init), (gst_agingtv_class_init), - (gst_agingtv_init), (gst_agingtv_setup), (gst_agingtv_rgb32), - (gst_agingtv_set_property), (gst_agingtv_get_property): - Port agingTV to videofilter - -2004-01-09 Julien MOUTTE <julien@moutte.net> - - * ext/hermes/gstcolorspace.c: (gst_colorspace_chain): - Implementing gst_pad_alloc_buffer to use optimized buffer allocation. - -2004-01-09 Julien MOUTTE <julien@moutte.net> - - * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): - Implementing gst_pad_alloc_buffer to use optimized buffer allocation. - * gst-libs/gst/xoverlay/xoverlay.c: - (gst_x_overlay_got_desired_size): Updating doc for the xid being 0. - * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): - Implementing gst_pad_alloc_buffer to use optimized buffer allocation. - * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): - Implementing gst_pad_alloc_buffer to use optimized buffer allocation. - * sys/ximage/ximagesink.c: (gst_ximagesink_chain), - (gst_ximagesink_buffer_free), (gst_ximagesink_buffer_alloc), - (gst_ximagesink_set_xwindow_id), (gst_ximagesink_init): Implementing - the bufferalloc_function to replace bufferpools, fixing the XOverlay - interface implementation to handle xid being 0 and fix some bugs - triggered by Benjamin's testcase. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_chain), - (gst_xvimagesink_buffer_free), (gst_xvimagesink_buffer_alloc), - (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_init): Implementing - the bufferalloc_function to replace bufferpools, fixing the XOverlay - interface implementation to handle xid being 0 and fix some bugs - triggered by Benjamin's testcase. - -2004-01-09 David Schleef <ds@schleef.org> - - * ext/librfb/gstrfbsrc.c: Hacking. Added actual decoding and - mouse pointer events. It works. - -2004-01-09 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/divx/gstdivxenc.c: (gst_divxenc_init): - Use explicit caps - fix capsnego. - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxvidenc.c: - Remove macro-inside-macro which caused compile errors. - * gst-libs/gst/riff/riff-read.c: (gst_riff_read_header): - Error out if it's not a RIFF file. Else we error out without - gst_element_error() which is not good... - -2004-01-08 David Schleef <ds@schleef.org> - - * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): - Fix pad_link function to handle formats that ffmpeg returns - as multiple caps structures. - * gst/videofilter/gstvideofilter.c: (gst_videofilter_chain): - Only complain if source buffer is _smaller_ than expected. - * gst/videoscale/gstvideoscale.c: (gst_videoscale_init), - (gst_videoscale_handle_src_event): Resize navigation events - when passing them upstream. - * gst/videotestsrc/gstvideotestsrc.c: - * gst/videotestsrc/gstvideotestsrc.h: - * gst/videotestsrc/videotestsrc.c: - * gst/videotestsrc/videotestsrc.h: - Rewrite many of the buffer painting functions to handle odd - sizes (for many formats, size%4!=0 or size%8!=0). Most have - been verified to work with my video card. - * testsuite/gst-lint: Add check for elements calling - gst_pad_get_caps() instead of gst_pad_get_allowed_caps(). - -2004-01-08 David Schleef <ds@schleef.org> - - * gst/videodrop/gstvideodrop.c: (gst_videodrop_getcaps), - (gst_videodrop_link), (gst_videodrop_init): Fix negotiation. - -2004-01-08 Julien MOUTTE <julien@moutte.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents): A - configure event is not emiting the desired size signal. That fixes - aspect ratio issues with gst-player. - -2004-01-08 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/median/gstmedian.c: (gst_median_link), (gst_median_init): - Fix capsnego. - -2004-01-08 Julien MOUTTE <julien@moutte.net> - - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_create): Using XOverlay - public method to fire size signal. - -2004-01-07 Julien MOUTTE <julien@moutte.net> - - * examples/gstplay/Makefile.am: Adding the interface library. - * gst-libs/gst/play/Makefile.am: Adding the interface library. - * gst-libs/gst/play/gstplay.c: (gst_play_set_video_sink): Connecting to the XOverlay size signal instead of GstVideoSink. - * gst-libs/gst/play/gstplay.h: Including the XOverlay interface to check - GST_IS_X_OVERLAY before signal connect. - * gst-libs/gst/video/gstvideosink.c: (gst_videosink_class_init): - Removing the have_video_size signal. - * gst-libs/gst/video/gstvideosink.h: Removing the have_video_size signal - and associated public method. - * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents), - (gst_ximagesink_sinkconnect): Using XOverlay public method to fire size - signal. - * sys/xvideo/xvideosink.c: (gst_xvideosink_sinkconnect), - (gst_xvideosink_xwindow_new): Using XOverlay public method to fire size - signal. - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_sinkconnect): - Using XOverlay public method to fire size signal. - -2004-01-07 David Schleef <ds@schleef.org> - - * gst/videofilter/Makefile.am: - * gst/videofilter/gstvideotemplate.c: - * gst/videofilter/make_filter: - Create gstvideoexample.c in a srcdir!=builddir friendly way. - Convert make_filter to /bin/sh script. - -2004-01-07 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/modplug/gstmodplug.cc: fix element description - -2004-01-07 Julien MOUTTE <julien@moutte.net> - - * examples/gstplay/player.c: (got_time_tick), (got_stream_length), - (got_video_size): Adding some new lines in g_print calls. - * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), - (gst_ximagesink_xwindow_destroy), (gst_ximagesink_xwindow_resize), - (gst_ximagesink_handle_xevents), (gst_ximagesink_fixate), - (gst_ximagesink_sinkconnect), (gst_ximagesink_change_state), - (gst_ximagesink_chain), (gst_ximagesink_buffer_new), - (gst_ximagesink_set_xwindow_id), (gst_ximagesink_get_desired_size): - Complete code review, reverting some stuff i disagree with, adding - some fixes : time synchronization on invalid timestamps, renegotiation - of private window. - * sys/ximage/ximagesink.h: - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_destroy), - (gst_xvimagesink_xwindow_resize), (gst_xvimagesink_handle_xevents), - (gst_xvimagesink_get_xv_support), (gst_xvimagesink_xcontext_get), - (gst_xvimagesink_fixate), (gst_xvimagesink_sinkconnect), - (gst_xvimagesink_change_state), (gst_xvimagesink_chain), - (gst_xvimagesink_buffer_new), - (gst_xvimagesink_navigation_send_event), - (gst_xvimagesink_set_xwindow_id), - (gst_xvimagesink_get_desired_size), - (gst_xvimagesink_xoverlay_init): Complete code review, reverting some - stuff i disagree with, adding some fixes : Renegotiation of private - window, implementing get_desired_size. - -2004-01-07 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/audiofile/gstafsink.c: (gst_afsink_init), (gst_afsink_chain), - (gst_afsink_handle_event): - * ext/jpeg/gstjpegenc.c: (gst_jpegenc_init): - * gst/avi/gstavimux.c: (gst_avimux_request_new_pad): - * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_init): - * sys/dxr3/dxr3spusink.c: (dxr3spusink_init): - * sys/dxr3/dxr3videosink.c: (dxr3videosink_init): - Fix for instantiate-test (see core). Also remove dead code from - jpegenc (which still needs fixing, but that's lower on my TODO - list...). - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_getcaps): - Never return NULL as caps. - -2004-01-07 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/Makefile.am: - * ext/librfb/Makefile.am: - * ext/librfb/gstrfbsrc.c: - New source plugin based on librfb-0.1. RFB (remote framebuffer) - is the protocol used by VNC. - -2004-01-07 David Schleef <ds@schleef.org> - - * gst/videofilter/gstvideotemplate.c: - * gst/videofilter/gstvideotemplate.h: - * gst/videofilter/make_filter: - Merge videotemplate header into source file. - * gst/effectv/Makefile.am: - * gst/effectv/gsteffectv.c: (plugin_init): - * gst/effectv/gstwarp.c: - Make warpTV a subclass of videofilter. - -2004-01-07 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/mad/gstid3tag.c: (gst_mad_id3_to_tag_list): - Add guard against invalid utf-8 conversions in mad. Just in case. - -2004-01-07 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * sys/oss/gstosssink.c: (gst_osssink_sink_fixate): - Fix for bug shown by poisoning - -2004-01-06 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get), - (gst_v4lmjpegsrc_buffer_free): - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_palette_to_caps), - (gst_v4lsrc_srcconnect), (gst_v4lsrc_getcaps), (gst_v4lsrc_get), - (gst_v4lsrc_buffer_free): - Fix for removed bufferpools. - -2004-01-07 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/dv/gstdvdec.c: (gst_dvdec_loop): - Fix caps negotiation. - - * ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_class_init), - (dvdnavsrc_update_buttoninfo), (dvdnavsrc_get), - (dvdnavsrc_get_event_mask), (dvdnav_handle_navigation_event), - (dvdnavsrc_event): - * ext/mpeg2dec/gstmpeg2dec.c: - * gst-libs/gst/navigation/navigation.c: - (gst_navigation_send_key_event), (gst_navigation_send_mouse_event): - * gst-libs/gst/navigation/navigation.h: - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_handle_src_event): - * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_handle_xevents): - Super-simple first version of mouse and keyboard events. Clicking - on a DVD menu now works, although it may not take you where you - expected. - - * gst/sine/gstsinesrc.c: (gst_sinesrc_src_fixate): - * gst/videotestsrc/gstvideotestsrc.c: - (gst_videotestsrc_src_fixate): - These fixate functions were broken - they never actually - fixated :) - -2004-01-06 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/shout/gstshout.c: (gst_icecastsend_base_init), - (gst_icecastsend_init): - fix for new caps system. - * gst-libs/gst/mixer/mixertrack.h: - * sys/oss/gstossmixer.c: (gst_ossmixer_build_list): - Add 'master track' flag (for tools like ACME that only want to - change the main volume). - -2004-01-07 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/xvid/gstxvid.c: (gst_xvid_structure_to_csp), - (gst_xvid_csp_to_caps): - * ext/xvid/gstxviddec.c: (gst_xviddec_src_getcaps): - * ext/xvid/gstxvidenc.c: - ifdef out ARGB type when it isn't available - in xvidcore 1.0.0beta2 - -2004-01-06 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_loop): - When we have received a new SCR right in the first buffer after - a seek (so in the same cycle that handles the discont), we should - handle the buffer instead of unreffing it, else we lose data. - -2004-01-06 Iain <iain@prettypeople.org> - - * gst/intfloat/gstint2float.c (gst_int2float_link): Set the - buffer-frames caps too. - - * gst/oneton/gstoneton.c (gst_oneton_sink_connect): Only create the new - caps that we need, don't destroy them all and rebuild them. And when - creating src pads, use the src pad template rather than the sink... - -2004-01-05 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead): - Add pad to element *after* setting functions such as event handler. - Without this, the scheduler (opt) will link pads, set the event - handler from the default event function (dispatcher in gstpad.c) - and *after* that, we will set our own event function, which will - thus never be used (and thus mpegdemux doesn't handle events). - -2004-01-04 David Schleef <ds@schleef.org> - - Fix the fixate functions to handle new prototype: - * gst/sine/gstsinesrc.c: (gst_sinesrc_src_fixate): - * gst/videotestsrc/gstvideotestsrc.c: - (gst_videotestsrc_src_fixate): - * sys/oss/gstosssink.c: (gst_osssink_sink_fixate): - * sys/ximage/ximagesink.c: (gst_ximagesink_fixate): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_fixate): - -2004-01-04 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * sys/ximage/ximagesink.h: - * sys/ximage/ximagesink.c: (gst_ximagesink_xwindow_new), - (gst_ximagesink_xwindow_destroy), (gst_ximagesink_sinkconnect), - (gst_ximagesink_change_state), (gst_ximagesink_set_xwindow_id), - (gst_ximagesink_xoverlay_init): - assorted fixes to make (re)embedding work - * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect), - (gst_ximagesink_get_desired_size): - implement desired size additions to XOverlay - -2004-01-04 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst-libs/gst/xoverlay/xoverlay.c: (gst_x_overlay_base_init), - (gst_x_overlay_got_xwindow_id), (gst_x_overlay_get_desired_size), - (gst_x_overlay_got_desired_size): - * gst-libs/gst/xoverlay/xoverlay.h: - Add optional "desired size" signal and querying. - -2004-01-04 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_parse_blockgroup): - Fix EBML-laced block parsing. Diffs are relative to previous - lace, not the first lace. Thanks to Mosu from the Matroska - team for detecting this. - * gst/wavparse/gstwavparse.c: (gst_wavparse_init), - (gst_wavparse_parse_fmt), (gst_wavparse_getcaps), - (gst_wavparse_handle_sink_event), (gst_wavparse_loop), - (gst_wavparse_change_state): - * gst/wavparse/gstwavparse.h: - Quickfix for capsnego. - -2004-01-04 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/wavenc/gstwavenc.c: (set_property), (gst_wavenc_init): - Fix indenting, fix pad creation. - -2004-01-04 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/xvid/gstxviddec.c: (gst_xviddec_init), - (gst_xviddec_src_getcaps), (gst_xviddec_src_link), - (gst_xviddec_sink_link): - Implement src_getcaps() so proper size caps is negotiated. - -2004-01-04 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/flac/gstflacdec.c: (gst_flacdec_loop): - Finish flac decoder on EOS. See #116178. - -2004-01-04 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/matroska-demux.c: (gst_matroska_demux_src_getcaps), - (gst_matroska_demux_add_stream): - * gst/matroska/matroska-ids.h: - Add getcaps() function to fix capsnego... - -2004-01-04 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), - (gst_mpeg_demux_parse_packet), (gst_mpeg_demux_parse_pes): - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_parse_packhead): - Fix more integer overflows. Again, see #126967. - -2004-01-03 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/mpeg2dec/gstmpeg2dec.c: - Add support for mpeg2dec-0.4.0 (released two weeks ago). See - #130416. - -2004-01-03 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - * ext/xvid/gstxvid.c: (gst_xvid_init), (gst_xvid_error), - (gst_xvid_structure_to_csp), (gst_xvid_csp_to_caps): - * ext/xvid/gstxvid.h: - * ext/xvid/gstxviddec.c: (gst_xviddec_class_init), - (gst_xviddec_init), (gst_xviddec_setup), (gst_xviddec_chain), - (gst_xviddec_src_link), (gst_xviddec_sink_link), - (gst_xviddec_change_state): - * ext/xvid/gstxviddec.h: - * ext/xvid/gstxvidenc.c: (gst_xvidenc_profile_get_type), - (gst_xvidenc_base_init), (gst_xvidenc_class_init), - (gst_xvidenc_init), (gst_xvidenc_setup), (gst_xvidenc_chain), - (gst_xvidenc_link), (gst_xvidenc_set_property), - (gst_xvidenc_get_property), (gst_xvidenc_change_state): - * ext/xvid/gstxvidenc.h: - Update xvid plugin to latest xvid (1.0.0-beta3) API. - -2004-01-03 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/rtp/rtp-packet.c: - Add sys/types.h include, since OS X doesn't define in_addr_t - in netinet/in.h, like it does on Linux (see #129600). - -2004-01-03 Thomas Canty <tommydal@optushome.com.au> - - reviewed by: Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/alsa/gstalsamixer.c: (gst_alsa_mixer_dispose): - Correct logic of dispose function (see #129306). - -2004-01-03 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_pes): - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_class_init), - (gst_mpeg_parse_init): - * gst/mpegstream/gstmpegparse.h: - Remove clock (which was never provided, i.e. dead code), and - also fix integer overflows at high PTS values (see #126967). - -2004-01-03 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/flac/gstflacdec.c: - * ext/libpng/gstpngenc.h: - * ext/mikmod/gstmikmod.h: - OS X fixes (see #126628). - -2004-01-02 David Schleef <ds@schleef.org> - - * ext/alsa/gstalsasrc.c: (gst_alsa_src_pad_factory), - (gst_alsa_src_base_init): Remove bogus "src" request pad. - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_base_init), - (gst_mpeg_parse_class_init): Move pad template registration - to class_init, since the derived class (mpegdemux) doesn't - want them. - -2004-01-03 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * sys/ximage/Makefile.am: - * sys/xvideo/Makefile.am: - * sys/xvimage/Makefile.am: - Move interface libs from LDFLAGS to LIBADD, fix relocation errors - after installation (see #127664). - -2004-01-02 David Schleef <ds@schleef.org> - - * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_init), - (gst_ffmpegenc_connect): Negotiation fixes. - * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_negotiate_format): - Remove inappropriate gst_caps_free(). - * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect): - Reenable Ronald's internal resize code, since the core handles - it correctly now. - -2004-01-02 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_init): - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_init): - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_base_init), (gst_v4lsrc_init): - Fix pad template stuff. - -2004-01-02 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * gst/matroska/ebml-read.c: (gst_ebml_read_sint): - * gst/matroska/ebml-write.c: (gst_ebml_write_sint): - fix signed integer reading/writing. - -2004-01-02 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/alsa/README: - Remove outdated document - -2004-01-03 Jan Schmidt <thaytan@mad.scientist.com> - - * gst/cutter/gstcutter.c: (gst_cutter_init): - src pad was being created twice - oops. - -2004-01-02 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect): - Comment out internal resize. It doesn't handle the resulting - XEvent internally, does another try_set_caps() which leads to - a really nice loop. - Real fix will come when Julien and Dave are awake. ;). - -2004-01-02 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/mpeg2enc/gstmpeg2enc.cc: - fix const/nonconst compile issue. - -2004-01-02 David Schleef <ds@schleef.org> - - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_fixate), - (gst_xvimagesink_sinkconnect), (gst_xvimagesink_init): - Add fixate function and a check for bad formats. - -2004-01-01 David Schleef <ds@schleef.org> - - Negotiation fixes: - * gst-libs/gst/audio/gstaudiofilter.c: (gst_audiofilter_link), - (gst_audiofilter_init): - * gst/debug/efence.c: (gst_efence_init): - * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_link), - (gst_deinterlace_init): - * gst/volume/gstvolume.c: (volume_connect): - -2004-01-01 David Schleef <ds@schleef.org> - - Convert elements to use gst_pad_use_explicit_caps() where - appropriate: - * ext/a52dec/gsta52dec.c: (gst_a52dec_init), (gst_a52dec_reneg): - * ext/audiofile/gstafparse.c: (gst_afparse_init), - (gst_afparse_open_file): - * ext/audiofile/gstafsrc.c: (gst_afsrc_init), - (gst_afsrc_open_file): - * ext/esd/esdmon.c: (gst_esdmon_init), (gst_esdmon_get): - * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_init), - (gst_ffmpegdec_chain): - * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): - * ext/flac/gstflacdec.c: (gst_flacdec_init), (gst_flacdec_write): - * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_init), - (gst_gdk_pixbuf_chain): - * ext/jpeg/gstjpegdec.c: (gst_jpegdec_init), (gst_jpegdec_link), - (gst_jpegdec_chain): - * ext/mad/gstmad.c: (gst_mad_init), (gst_mad_chain): - * ext/mikmod/gstmikmod.c: (gst_mikmod_init), - (gst_mikmod_negotiate): - * ext/mpeg2dec/gstmpeg2dec.c: (gst_mpeg2dec_init), - (gst_mpeg2dec_negotiate_format): - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/ogg/gstoggdemux.c: (gst_ogg_pad_push): - * ext/speex/gstspeexdec.c: (gst_speexdec_init), - (gst_speexdec_sinkconnect): - * ext/swfdec/gstswfdec.c: (gst_swfdec_loop), (gst_swfdec_init): - * ext/vorbis/vorbisfile.c: (gst_vorbisfile_init), - (gst_vorbisfile_new_link): - * gst/ac3parse/gstac3parse.c: (gst_ac3parse_init), - (gst_ac3parse_chain): - * gst/asfdemux/gstasfdemux.c: (gst_asf_demux_add_audio_stream), - (gst_asf_demux_setup_pad): - * gst/auparse/gstauparse.c: (gst_auparse_init), - (gst_auparse_chain): - * gst/id3/gstid3types.c: (gst_id3types_loop): - * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream): - * gst/mpeg1videoparse/gstmp1videoparse.c: (gst_mp1videoparse_init), - (mp1videoparse_parse_seq): - * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_init), - (bpf_from_header): - * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_parse_syshead), - (gst_mpeg_demux_parse_pes), (gst_mpeg_demux_lpcm_set_caps): - * gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init), - (gst_mpeg_parse_send_data): - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (gst_qtdemux_add_stream): - * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream): - * gst/wavparse/gstwavparse.c: (gst_wavparse_init), - (gst_wavparse_parse_fmt): - -2004-01-01 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - Fix configure check for mpeg2enc. We need 1.6.1.93 instead of - 1.6.1.92, since the pkg-config file of 1.6.1.92 is borked and - it therefore uses the wrong include paths. Too bad... Note - that 1.6.1.93 is not release yet. ;). - Also add a check for mplex, which is now using the lib'ified - mplex from mjpegtools, too. - * ext/ffmpeg/gstffmpegcodecmap.c: - Add codec_tag for 3ivx/xvid. For xvid, this should fix playback - issues. I don't think ffmpeg handles 3ivx correctly, so this - probably won't work. But it won't hurt either. - * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_connect), - (gst_ffmpegdec_chain): - * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect), - (gst_ffmpegenc_chain_audio): - Fix memleak in audio encoding. Close codec if open fails, this - calls the cleanup routines so we can re-use the context. - * ext/mpeg2enc/gstmpeg2enc.cc: - Fix pad template names/types, fix memory issue with getcaps(). - * ext/mpeg2enc/gstmpeg2encoder.cc: - * ext/mpeg2enc/gstmpeg2encoder.hh: - Fix compile issue with new caps system (const thingy). - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.hh: - We read a first frame right on initing, so that we have a caps - when we init the output. This caps is cached in padprivate and - read as first frame. - * ext/mplex/Makefile.am: - * ext/mplex/gstmplex.cc: - * ext/mplex/gstmplex.h: - * ext/mplex/gstmplex.hh: - * ext/mplex/gstmplexibitstream.cc: - * ext/mplex/gstmplexibitstream.hh: - * ext/mplex/gstmplexjob.cc: - * ext/mplex/gstmplexjob.hh: - * ext/mplex/gstmplexoutputstream.cc: - * ext/mplex/gstmplexoutputstream.hh: - We wrap mjpegtools mplex. So I rewrote the plugin. The old plugin - had issues, didn't do capsnego, supported only a subset of the - mplex features and required a mplex fork in our local CVS. Plus - that it worked agaist a very old mplex version. Rewriting was - faster than updating it. - * gst-libs/ext/Makefile.am: - * gst-libs/ext/mplex/INSTRUCT: - * gst-libs/ext/mplex/Makefile.am: - * gst-libs/ext/mplex/README: - * gst-libs/ext/mplex/TODO: - * gst-libs/ext/mplex/ac3strm_in.cc: - * gst-libs/ext/mplex/audiostrm.hh: - * gst-libs/ext/mplex/audiostrm_out.cc: - * gst-libs/ext/mplex/aunit.hh: - * gst-libs/ext/mplex/bits.cc: - * gst-libs/ext/mplex/bits.hh: - * gst-libs/ext/mplex/buffer.cc: - * gst-libs/ext/mplex/buffer.hh: - * gst-libs/ext/mplex/fastintfns.h: - * gst-libs/ext/mplex/format_codes.h: - * gst-libs/ext/mplex/inputstrm.cc: - * gst-libs/ext/mplex/inputstrm.hh: - * gst-libs/ext/mplex/lpcmstrm_in.cc: - * gst-libs/ext/mplex/mjpeg_logging.cc: - * gst-libs/ext/mplex/mjpeg_logging.h: - * gst-libs/ext/mplex/mjpeg_types.h: - * gst-libs/ext/mplex/mpastrm_in.cc: - * gst-libs/ext/mplex/mpegconsts.cc: - * gst-libs/ext/mplex/mpegconsts.h: - * gst-libs/ext/mplex/mplexconsts.hh: - * gst-libs/ext/mplex/multplex.cc: - * gst-libs/ext/mplex/outputstream.hh: - * gst-libs/ext/mplex/padstrm.cc: - * gst-libs/ext/mplex/padstrm.hh: - * gst-libs/ext/mplex/stillsstream.cc: - * gst-libs/ext/mplex/stillsstream.hh: - * gst-libs/ext/mplex/systems.cc: - * gst-libs/ext/mplex/systems.hh: - * gst-libs/ext/mplex/vector.cc: - * gst-libs/ext/mplex/vector.hh: - * gst-libs/ext/mplex/videostrm.hh: - * gst-libs/ext/mplex/videostrm_in.cc: - * gst-libs/ext/mplex/videostrm_out.cc: - * gst-libs/ext/mplex/yuv4mpeg.cc: - * gst-libs/ext/mplex/yuv4mpeg.h: - * gst-libs/ext/mplex/yuv4mpeg_intern.h: - * gst-libs/ext/mplex/yuv4mpeg_ratio.cc: - We don't fork mjpegtools' mplex in our CVS anymore. - * gst/avi/gstavidemux.c: (gst_avi_demux_src_getcaps), - (gst_avi_demux_add_stream): - * gst/avi/gstavidemux.h: - Add getcaps() function for proper caps nego. This makes some - parts of AVI playback/reading work. - * sys/ximage/ximagesink.c: (gst_ximagesink_sinkconnect): - Resize window on new capsnego. This is probably wrong, but - I'm still committing it because with current capsnego, the - first successfull capsnego is auto-fixated, therefore rounded - down to the lowest values in the caps. this results in a 16x16 - XWindow that is not reized when real capsnego finishes. - Dave, I see more cases of this, do you know a proper solution? - * tools/gst-launch-ext.in: - Fix MPEG-4 AAC (Apple iPod/iTunes) file commandline. - -2003-12-31 David Schleef <ds@schleef.org> - - * gst/tcp/gsttcpsrc.c: (gst_tcpsrc_get): - * gst/udp/gstudpsrc.c: (gst_udpsrc_get): - Change gst_pad_proxy_link() to gst_pad_try_set_caps() - -2003-12-30 David Schleef <ds@schleef.org> - - * ext/ffmpeg/gstffmpegcolorspace.c: - (gst_ffmpegcsp_caps_remove_format_info), (gst_ffmpegcsp_getcaps), - (gst_ffmpegcsp_pad_link), (gst_ffmpegcsp_init), - (gst_ffmpegcsp_chain): Negotiation fixes - * ext/mad/gstmad.c: (gst_mad_chain): Negotiation fixes - * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain), - (gst_audio_convert_link), (gst_audio_convert_channels): - * gst/audioscale/gstaudioscale.c: (gst_audioscale_getcaps), - (gst_audioscale_link), (gst_audioscale_get_buffer), - (gst_audioscale_chain): Negotiation fixes - * gst/audioscale/gstaudioscale.h: - * gst/videofilter/gstvideofilter.c: - (gst_videofilter_format_get_structure), (gst_videofilter_getcaps), - (gst_videofilter_link), (gst_videofilter_init), - (gst_videofilter_set_output_size), (gst_videofilter_setup), - (gst_videofilter_find_format_by_structure): - * gst/videofilter/gstvideofilter.h: Negotiation fixes - * gst/videoscale/gstvideoscale.c: (gst_videoscale_getcaps), - (gst_videoscale_link): - * gst/videoscale/videoscale.c: (videoscale_get_structure), - (videoscale_find_by_structure), (gst_videoscale_setup): - * gst/videoscale/videoscale.h: Negotiation fixes - * sys/ximage/ximagesink.c: (gst_ximagesink_handle_xevents), - (gst_ximagesink_fixate), (gst_ximagesink_init): Add a fixate - function, restrict resizing to a multiple of 4 (hack until - everyone supports odd sizes correctly). - -2003-12-29 Colin Walters <walters@verbum.org> - - * ext/esd/esdsink.c (gst_esdsink_link): Fix typo; get depth instead of - signed. - -2003-12-30 Jan Schmidt <thaytan@mad.scientist.com> - - * ext/sndfile/gstsf.c: (gst_sf_loop): - Fix warning about discarding const qualifier - -2003-12-27 Jeremy Simon <jesimon@libertysurf.fr> - - * gst/cutter/gstcutter.c: - * gst/videoscale/gstvideoscale.c: - * gst/volenv/gstvolenv.c: - * gst-libs/gst/audio/audio.c: - * gst-libs/gst/video/video.c: - Fix warnings - -2003-12-27 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/alsa/gstalsa.c: (gst_alsa_open_audio): - Don't send ALSA debugging to stderr. - * ext/alsa/gstalsa.h: - Use GST_WARNING instead of g_warning when ALSA functions fail. - -2003-12-27 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_get_xv_support): - Free XVAdapterInfo correctly. - -2003-12-27 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/mad/gstid3tag.c: (gst_id3_tag_add_src_pad), - (gst_id3_tag_do_caps_nego), (gst_id3_tag_src_link): - Make id3tag use correct caps nego. - -2003-12-27 Amaury Jacquot <sxpert@esitcom.org> - - * ext/ivorbis/vorbis.c: - * ext/ivorbis/vorbisenc.h: - * ext/ivorbis/vorbisfile.c: - Modify so that it uses the new caps things - -2003-12-27 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * testsuite/spider/spider1.c: (main): - * testsuite/spider/spider2.c: (main): - * testsuite/spider/spider3.c: (main): - Make tests compile again. They probably don't work. - -2003-12-24 Colin Walters <walters@verbum.org> - - * sys/oss/gstosssink.c (gst_osssink_sink_fixate): Return NULL if - we can't fixate the caps anymore. - -2003-12-23 David Schleef <ds@schleef.org> - - * gst/volume/gstvolume.c: (volume_init): Proxy getcaps. - * sys/oss/gstosssink.c: (gst_osssink_init), - (gst_osssink_sink_fixate): Add fixate function. - -2003-12-24 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/ffmpeg/gstffmpegcodecmap.c: - * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_getcaps), - (gst_ffmpegcsp_srcconnect_func), (gst_ffmpegcsp_sinkconnect), - (gst_ffmpegcsp_srcconnect), (gst_ffmpegcsp_get_type), - (gst_ffmpegcsp_base_init), (gst_ffmpegcsp_class_init), - (gst_ffmpegcsp_init), (gst_ffmpegcsp_chain), - (gst_ffmpegcsp_change_state), (gst_ffmpegcsp_set_property), - (gst_ffmpegcsp_get_property), (gst_ffmpegcsp_register): - fix typo in RGB masks, and move back to "old" colorspace - capsnego code until whoever wrote this new crap has actually - tested it so that it works. - And yes, this works, keep it that way please. - -2003-12-23 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * ext/divx/gstdivxdec.c: (gst_divxdec_base_init), - (gst_divxdec_init), (gst_divxdec_negotiate): - * ext/divx/gstdivxdec.h: - * ext/divx/gstdivxenc.c: (gst_divxenc_base_init), - (gst_divxenc_init): - * ext/faac/gstfaac.c: (gst_faac_base_init), (gst_faac_init), - (gst_faac_sinkconnect), (gst_faac_srcconnect): - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mpeg2enc/gstmpeg2encoder.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_base_init), - (dxr3audiosink_init), (dxr3audiosink_pcm_sinklink): - * sys/dxr3/dxr3spusink.c: (dxr3spusink_base_init), - (dxr3spusink_init): - * sys/dxr3/dxr3videosink.c: (dxr3videosink_base_init), - (dxr3videosink_init): - Fix caps breakage after Dave's caps branch merge. - -2003-12-23 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * sys/ximage/ximagesink.c: (gst_ximagesink_xcontext_get): - Fix for 24bpp display. - -2003-12-23 Colin Walters <walters@verbum.org> - - * ext/gnomevfs/gstgnomevfssink.c: Add ARG_HANDLE property that takes - a GnomeVFSHandle directly. - -2003-12-22 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/volume/Makefile.am: - * gst/volume/gstvolume.c: (volume_connect), (volume_parse_caps), - (volume_base_init), (volume_init): - Reenable volume element and fix to work with new caps stuff. - Rhythmbox needs this. - -2003-12-22 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * gst/qtdemux/qtdemux.c: (plugin_init): - qtdemux requires bytestream - -2003-12-22 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/alsa/gstalsa.c: (gst_alsa_get_caps), (gst_alsa_link): - Fix remaining caps handling errors due to CAPS merge. - -2003-12-22 Benjamin Otte <in7y118@public.uni-hamburg.de> - - * ext/faad/gstfaad.c: (gst_faad_base_init), (gst_faad_init), - (gst_faad_sinkconnect), (gst_faad_srcgetcaps), - (gst_faad_srcconnect): - Port to new caps system. - -2003-12-21 Julien MOUTTE <julien@moutte.net> - - * examples/gstplay/player.c: (got_time_tick), (got_stream_length), - (got_video_size), (main): using g_print instead of g_message. - * gst-libs/gst/play/gstplay.c: (gst_play_pipeline_setup): Fixing EOS - signal which was not emitted because of "switch" element added to the - bin but not connected. (Removing from the bin temporarily) - -2003-12-21 Julien MOUTTE <julien@moutte.net> - - * configure.ac: X_DISPLAY_MISSING is set to 1 if AC_PATH_XTRA fails to - find X development files. I don't understand the previous tests and - they fail on my debian/ppc unstable. This one works. - * examples/gstplay/player.c: (main): Set the pipeline to READY before - exiting. - * gst-libs/gst/play/gstplay.c: (gst_play_get_length_callback), - (gst_play_set_video_sink), (gst_play_set_audio_sink), - (gst_play_set_visualization): Add some safety checks in set_ methods - and state_change. This was throwing some ugly CRITICAL messages when - pipeline was getting disposed and casts were failing. - -2003-12-21 Ronald Bultje <rbultje@ronald.bitfreak.net> - - * configure.ac: - Improve mpeg2enc detection. This is for distributions that do - ship mjpegtools, but without mpeg2enc. Also does object check - for might there ever be ABI incompatibility. - * ext/mpeg2enc/gstmpeg2enc.cc: - Add Andrew as second maintainer (he's helping me), and also add - an error if no caps was set. This happens if I pull before capsnego - and that's something I should solve sometime else. - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_parse_blockgroup): - Fix time parsing. - * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_link), - (gst_matroska_mux_track_header): - Add caps to templates. - * gst/mpegaudioparse/gstmpegaudioparse.c: (mp3_sink_factory): - Add mpegversion=1 to prevent confusion with MPEG/AAC. - * gst/mpegstream/gstmpegdemux.c: - Remove layer since it causes warnings about unfixed caps. - * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): - Fix obvious typo (we error out if caps were set, we should of - course error out if *no* caps were set). - * sys/oss/gstosselement.c: (gst_osselement_convert): - Fix format conversion, we confused bits/bytes. - * sys/oss/gstosselement.h: - Improve documentation for 'bps'. - * sys/v4l/TODO: - Remove stuff about plugins that need removing - this was done - ages ago. - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_init), - (gst_v4lmjpegsrc_src_convert), (gst_v4lmjpegsrc_src_query): - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_init), (gst_v4lsrc_src_convert), - (gst_v4lsrc_src_query): - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init), - (gst_v4l2src_src_convert), (gst_v4l2src_src_query): - Add get_query_types(), get_formats() and query() functions. - -2003-12-21 Thomas Vander Stichele <thomas at apestaart dot org> - - * ChangeLog: moved to gstreamer/docs/random/old/ChangeLog.gst-plugins - * moved CVS to freedesktop.org -
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/wlbuffer.c
Deleted
@@ -1,250 +0,0 @@ -/* GStreamer Wayland video sink - * - * Copyright (C) 2014 Collabora Ltd. - * - * 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., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -/* GstWlBuffer wraps wl_buffer and provides a mechanism for preventing - * buffers from being re-used while the compositor is using them. This - * is achieved by adding a reference to the GstBuffer as soon as its - * associated wl_buffer is sent to the compositor and by removing this - * reference as soon as the compositor sends a wl_buffer::release message. - * - * This mechanism is a bit complicated, though, because it adds cyclic - * references that can be dangerous. The reference cycles looks like: - * - * ---------------- - * | GstWlDisplay | ----------------------------> - * ---------------- | - * | - * V - * ----------------- ------------- --------------- - * | GstBufferPool | --> | GstBuffer | ==> | GstWlBuffer | - * | | <-- | | <-- | | - * ----------------- ------------- --------------- - * - * A GstBufferPool normally holds references to its GstBuffers and each buffer - * holds a reference to a GstWlBuffer (saved in the GstMiniObject weak ref data). - * When a GstBuffer is in use, it holds a reference back to the pool and the - * pool doesn't hold a reference to the GstBuffer. When the GstBuffer is unrefed - * externally, it returns back to the pool and the pool holds again a reference - * to the buffer. - * - * Now when the compositor is using a buffer, the GstWlBuffer also holds a ref - * to the GstBuffer, which prevents it from returning to the pool. When the - * last GstWlBuffer receives a release event and unrefs the last GstBuffer, - * the GstBufferPool will be able to stop and if no-one is holding a strong - * ref to it, it will be destroyed. This will destroy the pool's GstBuffers and - * also the GstWlBuffers. This will all happen in the same context of the last - * gst_buffer_unref, which will be called from the buffer_release() callback. - * - * The problem here lies in the fact that buffer_release() will be called - * from the event loop thread of GstWlDisplay, so it's as if the display - * holds a reference to the GstWlBuffer, but without having an actual reference. - * When we kill the display, there is no way for the GstWlBuffer, the associated - * GstBuffer and the GstBufferPool to get destroyed, so we are going to leak a - * fair amount of memory. - * - * Normally, this rarely happens, because the compositor releases buffers - * almost immediately and when waylandsink stops, they are already released. - * - * However, we want to be absolutely certain, so a solution is introduced - * by registering all the GstWlBuffers with the display and explicitly - * releasing all the buffer references as soon as the display is destroyed. - * - * When the GstWlDisplay is finalized, it takes a reference to all the - * registered GstWlBuffers and then calls gst_wl_buffer_force_release_and_unref, - * which releases the potential reference to the GstBuffer, destroys the - * underlying wl_buffer and removes the reference that GstWlDisplay is holding. - * At that point, either the GstBuffer is alive somewhere and still holds a ref - * to the GstWlBuffer, which it will release when it gets destroyed, or the - * GstBuffer was destroyed in the meantime and the GstWlBuffer gets destroyed - * as soon as we remove the reference that GstWlDisplay holds. - */ - -#include "wlbuffer.h" - -GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug); -#define GST_CAT_DEFAULT gstwayland_debug - -G_DEFINE_TYPE (GstWlBuffer, gst_wl_buffer, G_TYPE_OBJECT); - -static void -gst_wl_buffer_dispose (GObject * gobject) -{ - GstWlBuffer *self = GST_WL_BUFFER (gobject); - - GST_TRACE_OBJECT (self, "dispose"); - - /* if the display is shutting down and we are trying to dipose - * the GstWlBuffer from another thread, unregister_buffer() will - * block and in the end the display will increase the refcount - * of this GstWlBuffer, so it will not be finalized */ - if (self->display) { - gst_wl_display_unregister_buffer (self->display, self->gstmem); - } - - G_OBJECT_CLASS (gst_wl_buffer_parent_class)->dispose (gobject); -} - -static void -gst_wl_buffer_finalize (GObject * gobject) -{ - GstWlBuffer *self = GST_WL_BUFFER (gobject); - - GST_TRACE_OBJECT (self, "finalize"); - - if (self->wlbuffer) - wl_buffer_destroy (self->wlbuffer); - - G_OBJECT_CLASS (gst_wl_buffer_parent_class)->finalize (gobject); -} - -static void -gst_wl_buffer_class_init (GstWlBufferClass * klass) -{ - GObjectClass *object_class = (GObjectClass *) klass; - - object_class->dispose = gst_wl_buffer_dispose; - object_class->finalize = gst_wl_buffer_finalize; -} - -static void -gst_wl_buffer_init (GstWlBuffer * self) -{ -} - -static void -buffer_release (void *data, struct wl_buffer *wl_buffer) -{ - GstWlBuffer *self = data; - GstBuffer *buf = self->current_gstbuffer; - - GST_LOG_OBJECT (self, "wl_buffer::release (GstBuffer: %p)", buf); - - self->used_by_compositor = FALSE; - self->current_gstbuffer = NULL; - - /* unref should be last, because it may end up destroying the GstWlBuffer */ - gst_buffer_unref (buf); -} - -static const struct wl_buffer_listener buffer_listener = { - buffer_release -}; - -static void -gstmemory_disposed (GstWlBuffer * self) -{ - g_assert (!self->used_by_compositor); - - GST_TRACE_OBJECT (self, "owning GstMemory was finalized"); - - /* this will normally destroy the GstWlBuffer, unless the display is - * finalizing and it has taken an additional reference to it */ - g_object_unref (self); -} - -GstWlBuffer * -gst_buffer_add_wl_buffer (GstBuffer * gstbuffer, struct wl_buffer *wlbuffer, - GstWlDisplay * display) -{ - GstWlBuffer *self; - - self = g_object_new (GST_TYPE_WL_BUFFER, NULL); - self->current_gstbuffer = gstbuffer; - self->wlbuffer = wlbuffer; - self->display = display; - self->gstmem = gst_buffer_peek_memory (gstbuffer, 0); - - gst_wl_display_register_buffer (self->display, self->gstmem, self); - - wl_buffer_add_listener (self->wlbuffer, &buffer_listener, self); - - gst_mini_object_weak_ref (GST_MINI_OBJECT (self->gstmem), - (GstMiniObjectNotify) gstmemory_disposed, self); - - - return self; -} - -GstWlBuffer * -gst_buffer_get_wl_buffer (GstWlDisplay * display, GstBuffer * gstbuffer) -{ - GstMemory *mem0; - GstWlBuffer *wlbuf; - - if (!gstbuffer) - return NULL; - - mem0 = gst_buffer_peek_memory (gstbuffer, 0); - - wlbuf = gst_wl_display_lookup_buffer (display, mem0); - if (wlbuf) - wlbuf->current_gstbuffer = gstbuffer; - - return wlbuf; -} - -void -gst_wl_buffer_force_release_and_unref (GstBuffer * buf, GstWlBuffer * self) -{ - /* Force a buffer release. - * At this point, the GstWlDisplay has killed its event loop, - * so we don't need to worry about buffer_release() being called - * at the same time from the event loop thread */ - if (self->used_by_compositor) { - GST_DEBUG_OBJECT (self, "forcing wl_buffer::release (GstBuffer: %p)", - self->current_gstbuffer); - self->used_by_compositor = FALSE; - gst_buffer_unref (self->current_gstbuffer); - } - - /* Finalize this GstWlBuffer early. - * This method has been called as a result of the display shutting down, - * so we need to stop using any wayland resources and disconnect from - * the display. The GstWlBuffer stays alive, though, to avoid race - * conditions with the GstBuffer being destroyed from another thread. - * The last reference is either owned by the GstBuffer or by us and - * it will be released at the end of this function. */ - GST_TRACE_OBJECT (self, "finalizing early"); - wl_buffer_destroy (self->wlbuffer); - self->wlbuffer = NULL; - self->display = NULL; - self->current_gstbuffer = NULL; - - /* remove the reference that the caller (GstWlDisplay) owns */ - g_object_unref (self); -} - -void -gst_wl_buffer_attach (GstWlBuffer * self, struct wl_surface *surface) -{ - if (self->used_by_compositor) { - GST_DEBUG_OBJECT (self, "buffer used by compositor %p", - self->current_gstbuffer); - return; - } - - wl_surface_attach (surface, self->wlbuffer, 0, 0); - - /* Add a reference to the buffer. This represents the fact that - * the compositor is using the buffer and it should not return - * back to the pool and be re-used until the compositor releases it. */ - gst_buffer_ref (self->current_gstbuffer); - self->used_by_compositor = TRUE; -}
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/wlbuffer.h
Deleted
@@ -1,68 +0,0 @@ -/* GStreamer Wayland video sink - * - * Copyright (C) 2014 Collabora Ltd. - * - * 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., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -#ifndef __GST_WL_BUFFER_H__ -#define __GST_WL_BUFFER_H__ - -#include "wldisplay.h" - -G_BEGIN_DECLS - -#define GST_TYPE_WL_BUFFER (gst_wl_buffer_get_type ()) -#define GST_WL_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WL_BUFFER, GstWlBuffer)) -#define GST_IS_WL_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WL_BUFFER)) -#define GST_WL_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_WL_BUFFER, GstWlBufferClass)) -#define GST_IS_WL_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_WL_BUFFER)) -#define GST_WL_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_WL_BUFFER, GstWlBufferClass)) - -typedef struct _GstWlBuffer GstWlBuffer; -typedef struct _GstWlBufferClass GstWlBufferClass; - -struct _GstWlBuffer -{ - GObject parent_instance; - - struct wl_buffer * wlbuffer; - GstBuffer *current_gstbuffer; - GstMemory *gstmem; - - GstWlDisplay *display; - - gboolean used_by_compositor; -}; - -struct _GstWlBufferClass -{ - GObjectClass parent_class; -}; - -GType gst_wl_buffer_get_type (void); - -GstWlBuffer * gst_buffer_add_wl_buffer (GstBuffer * gstbuffer, - struct wl_buffer * wlbuffer, GstWlDisplay * display); -GstWlBuffer * gst_buffer_get_wl_buffer (GstWlDisplay * display, GstBuffer * gstbuffer); - -void gst_wl_buffer_force_release_and_unref (GstBuffer *buf, GstWlBuffer * self); - -void gst_wl_buffer_attach (GstWlBuffer * self, struct wl_surface *surface); - -G_END_DECLS - -#endif /* __GST_WL_BUFFER_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/wldisplay.c
Deleted
@@ -1,420 +0,0 @@ -/* GStreamer Wayland video sink - * - * Copyright (C) 2014 Collabora Ltd. - * - * 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., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "wldisplay.h" -#include "wlbuffer.h" -#include "wlvideoformat.h" - -#include <errno.h> - -GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug); -#define GST_CAT_DEFAULT gstwayland_debug - -G_DEFINE_TYPE (GstWlDisplay, gst_wl_display, G_TYPE_OBJECT); - -static void gst_wl_display_finalize (GObject * gobject); - -static void -gst_wl_display_class_init (GstWlDisplayClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - gobject_class->finalize = gst_wl_display_finalize; -} - -static void -gst_wl_display_init (GstWlDisplay * self) -{ - self->shm_formats = g_array_new (FALSE, FALSE, sizeof (uint32_t)); - self->dmabuf_formats = g_array_new (FALSE, FALSE, sizeof (uint32_t)); - self->wl_fd_poll = gst_poll_new (TRUE); - self->buffers = g_hash_table_new (g_direct_hash, g_direct_equal); - g_mutex_init (&self->buffers_mutex); -} - -static void -gst_wl_ref_wl_buffer (gpointer key, gpointer value, gpointer user_data) -{ - g_object_ref (value); -} - -static void -gst_wl_display_finalize (GObject * gobject) -{ - GstWlDisplay *self = GST_WL_DISPLAY (gobject); - - gst_poll_set_flushing (self->wl_fd_poll, TRUE); - if (self->thread) - g_thread_join (self->thread); - - /* to avoid buffers being unregistered from another thread - * at the same time, take their ownership */ - g_mutex_lock (&self->buffers_mutex); - self->shutting_down = TRUE; - g_hash_table_foreach (self->buffers, gst_wl_ref_wl_buffer, NULL); - g_mutex_unlock (&self->buffers_mutex); - - g_hash_table_foreach (self->buffers, - (GHFunc) gst_wl_buffer_force_release_and_unref, NULL); - g_hash_table_remove_all (self->buffers); - - g_array_unref (self->shm_formats); - g_array_unref (self->dmabuf_formats); - gst_poll_free (self->wl_fd_poll); - g_hash_table_unref (self->buffers); - g_mutex_clear (&self->buffers_mutex); - - if (self->viewporter) - wp_viewporter_destroy (self->viewporter); - - if (self->shm) - wl_shm_destroy (self->shm); - - if (self->dmabuf) - zwp_linux_dmabuf_v1_destroy (self->dmabuf); - - if (self->wl_shell) - wl_shell_destroy (self->wl_shell); - - if (self->xdg_wm_base) - xdg_wm_base_destroy (self->xdg_wm_base); - - if (self->fullscreen_shell) - zwp_fullscreen_shell_v1_release (self->fullscreen_shell); - - if (self->compositor) - wl_compositor_destroy (self->compositor); - - if (self->subcompositor) - wl_subcompositor_destroy (self->subcompositor); - - if (self->registry) - wl_registry_destroy (self->registry); - - if (self->display_wrapper) - wl_proxy_wrapper_destroy (self->display_wrapper); - - if (self->queue) - wl_event_queue_destroy (self->queue); - - if (self->own_display) { - wl_display_flush (self->display); - wl_display_disconnect (self->display); - } - - G_OBJECT_CLASS (gst_wl_display_parent_class)->finalize (gobject); -} - -static void -shm_format (void *data, struct wl_shm *wl_shm, uint32_t format) -{ - GstWlDisplay *self = data; - - g_array_append_val (self->shm_formats, format); -} - -static const struct wl_shm_listener shm_listener = { - shm_format -}; - -static void -dmabuf_format (void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf, - uint32_t format) -{ - GstWlDisplay *self = data; - - if (gst_wl_dmabuf_format_to_video_format (format) != GST_VIDEO_FORMAT_UNKNOWN) - g_array_append_val (self->dmabuf_formats, format); -} - -static const struct zwp_linux_dmabuf_v1_listener dmabuf_listener = { - dmabuf_format, -}; - -gboolean -gst_wl_display_check_format_for_shm (GstWlDisplay * display, - GstVideoFormat format) -{ - enum wl_shm_format shm_fmt; - GArray *formats; - guint i; - - shm_fmt = gst_video_format_to_wl_shm_format (format); - if (shm_fmt == (enum wl_shm_format) -1) - return FALSE; - - formats = display->shm_formats; - for (i = 0; i < formats->len; i++) { - if (g_array_index (formats, uint32_t, i) == shm_fmt) - return TRUE; - } - - return FALSE; -} - -gboolean -gst_wl_display_check_format_for_dmabuf (GstWlDisplay * display, - GstVideoFormat format) -{ - GArray *formats; - guint i, dmabuf_fmt; - - if (!display->dmabuf) - return FALSE; - - dmabuf_fmt = gst_video_format_to_wl_dmabuf_format (format); - if (dmabuf_fmt == (guint) - 1) - return FALSE; - - formats = display->dmabuf_formats; - for (i = 0; i < formats->len; i++) { - if (g_array_index (formats, uint32_t, i) == dmabuf_fmt) - return TRUE; - } - - return FALSE; -} - -static void -handle_xdg_wm_base_ping (void *user_data, struct xdg_wm_base *xdg_wm_base, - uint32_t serial) -{ - xdg_wm_base_pong (xdg_wm_base, serial); -} - -static const struct xdg_wm_base_listener xdg_wm_base_listener = { - handle_xdg_wm_base_ping -}; - -static void -registry_handle_global (void *data, struct wl_registry *registry, - uint32_t id, const char *interface, uint32_t version) -{ - GstWlDisplay *self = data; - - if (g_strcmp0 (interface, "wl_compositor") == 0) { - self->compositor = wl_registry_bind (registry, id, &wl_compositor_interface, - MIN (version, 4)); - } else if (g_strcmp0 (interface, "wl_subcompositor") == 0) { - self->subcompositor = - wl_registry_bind (registry, id, &wl_subcompositor_interface, 1); - } else if (g_strcmp0 (interface, "wl_shell") == 0) { - self->wl_shell = wl_registry_bind (registry, id, &wl_shell_interface, 1); - } else if (g_strcmp0 (interface, "xdg_wm_base") == 0) { - self->xdg_wm_base = - wl_registry_bind (registry, id, &xdg_wm_base_interface, 1); - xdg_wm_base_add_listener (self->xdg_wm_base, &xdg_wm_base_listener, self); - } else if (g_strcmp0 (interface, "zwp_fullscreen_shell_v1") == 0) { - self->fullscreen_shell = wl_registry_bind (registry, id, - &zwp_fullscreen_shell_v1_interface, 1); - } else if (g_strcmp0 (interface, "wl_shm") == 0) { - self->shm = wl_registry_bind (registry, id, &wl_shm_interface, 1); - wl_shm_add_listener (self->shm, &shm_listener, self); - } else if (g_strcmp0 (interface, "wp_viewporter") == 0) { - self->viewporter = - wl_registry_bind (registry, id, &wp_viewporter_interface, 1); - } else if (g_strcmp0 (interface, "zwp_linux_dmabuf_v1") == 0) { - self->dmabuf = - wl_registry_bind (registry, id, &zwp_linux_dmabuf_v1_interface, 1); - zwp_linux_dmabuf_v1_add_listener (self->dmabuf, &dmabuf_listener, self); - } -} - -static void -registry_handle_global_remove (void *data, struct wl_registry *registry, - uint32_t name) -{ - /* temporarily do nothing */ -} - -static const struct wl_registry_listener registry_listener = { - registry_handle_global, - registry_handle_global_remove -}; - -static gpointer -gst_wl_display_thread_run (gpointer data) -{ - GstWlDisplay *self = data; - GstPollFD pollfd = GST_POLL_FD_INIT; - - pollfd.fd = wl_display_get_fd (self->display); - gst_poll_add_fd (self->wl_fd_poll, &pollfd); - gst_poll_fd_ctl_read (self->wl_fd_poll, &pollfd, TRUE); - - /* main loop */ - while (1) { - while (wl_display_prepare_read_queue (self->display, self->queue) != 0) - wl_display_dispatch_queue_pending (self->display, self->queue); - wl_display_flush (self->display); - - if (gst_poll_wait (self->wl_fd_poll, GST_CLOCK_TIME_NONE) < 0) { - gboolean normal = (errno == EBUSY); - wl_display_cancel_read (self->display); - if (normal) - break; - else - goto error; - } - if (wl_display_read_events (self->display) == -1) - goto error; - wl_display_dispatch_queue_pending (self->display, self->queue); - } - - return NULL; - -error: - GST_ERROR ("Error communicating with the wayland server"); - return NULL; -} - -GstWlDisplay * -gst_wl_display_new (const gchar * name, GError ** error) -{ - struct wl_display *display; - - display = wl_display_connect (name); - - if (!display) { - *error = g_error_new (g_quark_from_static_string ("GstWlDisplay"), 0, - "Failed to connect to the wayland display '%s'", - name ? name : "(default)"); - return NULL; - } else { - return gst_wl_display_new_existing (display, TRUE, error); - } -} - -GstWlDisplay * -gst_wl_display_new_existing (struct wl_display * display, - gboolean take_ownership, GError ** error) -{ - GstWlDisplay *self; - GError *err = NULL; - gint i; - - g_return_val_if_fail (display != NULL, NULL); - - self = g_object_new (GST_TYPE_WL_DISPLAY, NULL); - self->display = display; - self->display_wrapper = wl_proxy_create_wrapper (display); - self->own_display = take_ownership; - - self->queue = wl_display_create_queue (self->display); - wl_proxy_set_queue ((struct wl_proxy *) self->display_wrapper, self->queue); - self->registry = wl_display_get_registry (self->display_wrapper); - wl_registry_add_listener (self->registry, ®istry_listener, self); - - /* we need exactly 2 roundtrips to discover global objects and their state */ - for (i = 0; i < 2; i++) { - if (wl_display_roundtrip_queue (self->display, self->queue) < 0) { - *error = g_error_new (g_quark_from_static_string ("GstWlDisplay"), 0, - "Error communicating with the wayland display"); - g_object_unref (self); - return NULL; - } - } - - /* verify we got all the required interfaces */ -#define VERIFY_INTERFACE_EXISTS(var, interface) \ - if (!self->var) { \ - g_set_error (error, g_quark_from_static_string ("GstWlDisplay"), 0, \ - "Could not bind to " interface ". Either it is not implemented in " \ - "the compositor, or the implemented version doesn't match"); \ - g_object_unref (self); \ - return NULL; \ - } - - VERIFY_INTERFACE_EXISTS (compositor, "wl_compositor"); - VERIFY_INTERFACE_EXISTS (subcompositor, "wl_subcompositor"); - VERIFY_INTERFACE_EXISTS (shm, "wl_shm"); - -#undef VERIFY_INTERFACE_EXISTS - - /* We make the viewporter optional even though it may cause bad display. - * This is so one can test wayland display on older compositor or on - * compositor that don't implement this extension. */ - if (!self->viewporter) { - g_warning ("Wayland compositor is missing the ability to scale, video " - "display may not work properly."); - } - - if (!self->dmabuf) { - g_warning ("Could not bind to zwp_linux_dmabuf_v1"); - } - - if (!self->wl_shell && !self->xdg_wm_base && !self->fullscreen_shell) { - /* If wl_surface and wl_display are passed via GstContext - * wl_shell, xdg_shell and zwp_fullscreen_shell are not used. - * In this case is correct to continue. - */ - g_warning ("Could not bind to either wl_shell, xdg_wm_base or " - "zwp_fullscreen_shell, video display may not work properly."); - } - - self->thread = g_thread_try_new ("GstWlDisplay", gst_wl_display_thread_run, - self, &err); - if (err) { - g_propagate_prefixed_error (error, err, - "Failed to start thread for the display's events"); - g_object_unref (self); - return NULL; - } - - return self; -} - -void -gst_wl_display_register_buffer (GstWlDisplay * self, gpointer gstmem, - gpointer wlbuffer) -{ - g_assert (!self->shutting_down); - - GST_TRACE_OBJECT (self, "registering GstWlBuffer %p to GstMem %p", - wlbuffer, gstmem); - - g_mutex_lock (&self->buffers_mutex); - g_hash_table_replace (self->buffers, gstmem, wlbuffer); - g_mutex_unlock (&self->buffers_mutex); -} - -gpointer -gst_wl_display_lookup_buffer (GstWlDisplay * self, gpointer gstmem) -{ - gpointer wlbuffer; - g_mutex_lock (&self->buffers_mutex); - wlbuffer = g_hash_table_lookup (self->buffers, gstmem); - g_mutex_unlock (&self->buffers_mutex); - return wlbuffer; -} - -void -gst_wl_display_unregister_buffer (GstWlDisplay * self, gpointer gstmem) -{ - GST_TRACE_OBJECT (self, "unregistering GstWlBuffer owned by %p", gstmem); - - g_mutex_lock (&self->buffers_mutex); - if (G_LIKELY (!self->shutting_down)) - g_hash_table_remove (self->buffers, gstmem); - g_mutex_unlock (&self->buffers_mutex); -}
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/wldisplay.h
Deleted
@@ -1,100 +0,0 @@ -/* GStreamer Wayland video sink - * - * Copyright (C) 2014 Collabora Ltd. - * - * 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., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -#ifndef __GST_WL_DISPLAY_H__ -#define __GST_WL_DISPLAY_H__ - -#include <gst/gst.h> -#include <gst/video/video.h> -#include <wayland-client.h> -#include "xdg-shell-client-protocol.h" -#include "viewporter-client-protocol.h" -#include "linux-dmabuf-unstable-v1-client-protocol.h" -#include "fullscreen-shell-unstable-v1-client-protocol.h" - -G_BEGIN_DECLS - -#define GST_TYPE_WL_DISPLAY (gst_wl_display_get_type ()) -#define GST_WL_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WL_DISPLAY, GstWlDisplay)) -#define GST_IS_WL_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WL_DISPLAY)) -#define GST_WL_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_WL_DISPLAY, GstWlDisplayClass)) -#define GST_IS_WL_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_WL_DISPLAY)) -#define GST_WL_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_WL_DISPLAY, GstWlDisplayClass)) - -typedef struct _GstWlDisplay GstWlDisplay; -typedef struct _GstWlDisplayClass GstWlDisplayClass; - -struct _GstWlDisplay -{ - GObject parent_instance; - - /* public objects */ - struct wl_display *display; - struct wl_display *display_wrapper; - struct wl_event_queue *queue; - - /* globals */ - struct wl_registry *registry; - struct wl_compositor *compositor; - struct wl_subcompositor *subcompositor; - struct wl_shell *wl_shell; - struct xdg_wm_base *xdg_wm_base; - struct zwp_fullscreen_shell_v1 *fullscreen_shell; - struct wl_shm *shm; - struct wp_viewporter *viewporter; - struct zwp_linux_dmabuf_v1 *dmabuf; - GArray *shm_formats; - GArray *dmabuf_formats; - - /* private */ - gboolean own_display; - GThread *thread; - GstPoll *wl_fd_poll; - - GMutex buffers_mutex; - GHashTable *buffers; - gboolean shutting_down; -}; - -struct _GstWlDisplayClass -{ - GObjectClass parent_class; -}; - -GType gst_wl_display_get_type (void); - -GstWlDisplay *gst_wl_display_new (const gchar * name, GError ** error); -GstWlDisplay *gst_wl_display_new_existing (struct wl_display * display, - gboolean take_ownership, GError ** error); - -/* see wlbuffer.c for explanation */ -void gst_wl_display_register_buffer (GstWlDisplay * self, gpointer gstmem, - gpointer wlbuffer); -void gst_wl_display_unregister_buffer (GstWlDisplay * self, gpointer gstmem); -gpointer gst_wl_display_lookup_buffer (GstWlDisplay * self, gpointer gstmem); - -gboolean gst_wl_display_check_format_for_shm (GstWlDisplay * display, - GstVideoFormat format); -gboolean gst_wl_display_check_format_for_dmabuf (GstWlDisplay * display, - GstVideoFormat format); - -G_END_DECLS - -#endif /* __GST_WL_DISPLAY_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/wllinuxdmabuf.c
Deleted
@@ -1,164 +0,0 @@ -/* GStreamer Wayland video sink - * - * Copyright (C) 2016 STMicroelectronics SA - * Copyright (C) 2016 Fabien Dessenne <fabien.dessenne@st.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gst/allocators/gstdmabuf.h> - -#include "wllinuxdmabuf.h" -#include "wlvideoformat.h" - -GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug); -#define GST_CAT_DEFAULT gstwayland_debug - -typedef struct -{ - GMutex lock; - GCond cond; - struct wl_buffer *wbuf; -} ConstructBufferData; - -static void -create_succeeded (void *data, struct zwp_linux_buffer_params_v1 *params, - struct wl_buffer *new_buffer) -{ - ConstructBufferData *d = data; - - g_mutex_lock (&d->lock); - d->wbuf = new_buffer; - zwp_linux_buffer_params_v1_destroy (params); - g_cond_signal (&d->cond); - g_mutex_unlock (&d->lock); -} - -static void -create_failed (void *data, struct zwp_linux_buffer_params_v1 *params) -{ - ConstructBufferData *d = data; - - g_mutex_lock (&d->lock); - d->wbuf = NULL; - zwp_linux_buffer_params_v1_destroy (params); - g_cond_signal (&d->cond); - g_mutex_unlock (&d->lock); -} - -static const struct zwp_linux_buffer_params_v1_listener params_listener = { - create_succeeded, - create_failed -}; - -struct wl_buffer * -gst_wl_linux_dmabuf_construct_wl_buffer (GstBuffer * buf, - GstWlDisplay * display, const GstVideoInfo * info) -{ - GstMemory *mem; - int format; - guint i, width, height; - guint nplanes, flags = 0; - struct zwp_linux_buffer_params_v1 *params; - gint64 timeout; - ConstructBufferData data; - - g_return_val_if_fail (gst_wl_display_check_format_for_dmabuf (display, - GST_VIDEO_INFO_FORMAT (info)), NULL); - - mem = gst_buffer_peek_memory (buf, 0); - format = gst_video_format_to_wl_dmabuf_format (GST_VIDEO_INFO_FORMAT (info)); - - g_cond_init (&data.cond); - g_mutex_init (&data.lock); - g_mutex_lock (&data.lock); - - width = GST_VIDEO_INFO_WIDTH (info); - height = GST_VIDEO_INFO_HEIGHT (info); - nplanes = GST_VIDEO_INFO_N_PLANES (info); - - GST_DEBUG_OBJECT (display, "Creating wl_buffer from DMABuf of size %" - G_GSSIZE_FORMAT " (%d x %d), format %s", info->size, width, height, - gst_wl_dmabuf_format_to_string (format)); - - /* Creation and configuration of planes */ - params = zwp_linux_dmabuf_v1_create_params (display->dmabuf); - - for (i = 0; i < nplanes; i++) { - guint offset, stride, mem_idx, length; - gsize skip; - - offset = GST_VIDEO_INFO_PLANE_OFFSET (info, i); - stride = GST_VIDEO_INFO_PLANE_STRIDE (info, i); - if (gst_buffer_find_memory (buf, offset, 1, &mem_idx, &length, &skip)) { - GstMemory *m = gst_buffer_peek_memory (buf, mem_idx); - gint fd = gst_dmabuf_memory_get_fd (m); - zwp_linux_buffer_params_v1_add (params, fd, i, m->offset + skip, - stride, 0, 0); - } else { - GST_ERROR_OBJECT (mem->allocator, "memory does not seem to contain " - "enough data for the specified format"); - zwp_linux_buffer_params_v1_destroy (params); - data.wbuf = NULL; - goto out; - } - } - - if (GST_BUFFER_FLAG_IS_SET (buf, GST_VIDEO_BUFFER_FLAG_INTERLACED)) { - GST_DEBUG_OBJECT (mem->allocator, "interlaced buffer"); - flags = ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_INTERLACED; - - if (!GST_BUFFER_FLAG_IS_SET (buf, GST_VIDEO_BUFFER_FLAG_TFF)) { - GST_DEBUG_OBJECT (mem->allocator, "with bottom field first"); - flags |= ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_BOTTOM_FIRST; - } - } - - /* Request buffer creation */ - zwp_linux_buffer_params_v1_add_listener (params, ¶ms_listener, &data); - zwp_linux_buffer_params_v1_create (params, width, height, format, flags); - - /* Wait for the request answer */ - wl_display_flush (display->display); - data.wbuf = (gpointer) 0x1; - timeout = g_get_monotonic_time () + G_TIME_SPAN_SECOND; - while (data.wbuf == (gpointer) 0x1) { - if (!g_cond_wait_until (&data.cond, &data.lock, timeout)) { - GST_ERROR_OBJECT (mem->allocator, "zwp_linux_buffer_params_v1 time out"); - zwp_linux_buffer_params_v1_destroy (params); - data.wbuf = NULL; - } - } - -out: - if (!data.wbuf) { - GST_ERROR_OBJECT (mem->allocator, "can't create linux-dmabuf buffer"); - } else { - GST_DEBUG_OBJECT (mem->allocator, "created linux_dmabuf wl_buffer (%p):" - "%dx%d, fmt=%.4s, %d planes", - data.wbuf, width, height, (char *) &format, nplanes); - } - - g_mutex_unlock (&data.lock); - g_mutex_clear (&data.lock); - g_cond_clear (&data.cond); - - return data.wbuf; -}
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/wllinuxdmabuf.h
Deleted
@@ -1,38 +0,0 @@ -/* GStreamer Wayland video sink - * - * Copyright (C) 2016 STMicroelectronics SA - * Copyright (C) 2016 Fabien Dessenne <fabien.dessenne@st.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -#ifndef __GST_WL_LINUX_DMABUF_H__ -#define __GST_WL_LINUX_DMABUF_H__ - -#include "gstwaylandsink.h" - -G_BEGIN_DECLS - -#ifndef GST_CAPS_FEATURE_MEMORY_DMABUF -#define GST_CAPS_FEATURE_MEMORY_DMABUF "memory:DMABuf" -#endif - -struct wl_buffer * gst_wl_linux_dmabuf_construct_wl_buffer (GstBuffer * buf, - GstWlDisplay * display, const GstVideoInfo * info); - -G_END_DECLS - -#endif /* __GST_WL_LINUX_DMABUF_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/wlshmallocator.c
Deleted
@@ -1,246 +0,0 @@ -/* GStreamer Wayland video sink - * - * Copyright (C) 2012 Intel Corporation - * Copyright (C) 2012 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - * Copyright (C) 2014 Collabora Ltd. - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "wlshmallocator.h" -#include "wlvideoformat.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/types.h> - -GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug); -#define GST_CAT_DEFAULT gstwayland_debug - -G_DEFINE_TYPE (GstWlShmAllocator, gst_wl_shm_allocator, GST_TYPE_FD_ALLOCATOR); - -static GstMemory * -gst_wl_shm_allocator_alloc (GstAllocator * allocator, gsize size, - GstAllocationParams * params) -{ - GstWlShmAllocator *self = GST_WL_SHM_ALLOCATOR (allocator); - char filename1024; - static int init = 0; - int fd; - GstMemory *mem; - GstMapInfo info; - - /* TODO: make use of the allocation params, if necessary */ - -#ifdef HAVE_MEMFD_CREATE - fd = memfd_create ("gst-wayland-shm", MFD_CLOEXEC | MFD_ALLOW_SEALING); - if (fd >= 0) { - /* We can add this seal before calling posix_fallocate(), as - * the file is currently zero-sized anyway. - * - * There is also no need to check for the return value, we - * couldn't do anything with it anyway. - */ - fcntl (fd, F_ADD_SEALS, F_SEAL_SHRINK); - } else -#endif - { - /* allocate shm pool */ - snprintf (filename, 1024, "%s/%s-%d-%s", g_get_user_runtime_dir (), - "wayland-shm", init++, "XXXXXX"); - - fd = g_mkstemp (filename); - if (fd < 0) { - GST_ERROR_OBJECT (self, "opening temp file %s failed: %s", filename, - strerror (errno)); - return NULL; - } - - unlink (filename); - } - - if (ftruncate (fd, size) < 0) { - GST_ERROR_OBJECT (self, "ftruncate failed: %s", strerror (errno)); - close (fd); - return NULL; - } - - mem = gst_fd_allocator_alloc (allocator, fd, size, - GST_FD_MEMORY_FLAG_KEEP_MAPPED); - if (G_UNLIKELY (!mem)) { - GST_ERROR_OBJECT (self, "GstFdMemory allocation failed"); - close (fd); - return NULL; - } - - /* we need to map the memory in order to unlink the file without losing it */ - if (!gst_memory_map (mem, &info, GST_MAP_READWRITE)) { - GST_ERROR_OBJECT (self, "GstFdMemory map failed"); - close (fd); - return NULL; - } - - /* unmap will not really munmap(), we just - * need it to release the miniobject lock */ - gst_memory_unmap (mem, &info); - - return mem; -} - -static void -gst_wl_shm_allocator_class_init (GstWlShmAllocatorClass * klass) -{ - GstAllocatorClass *alloc_class = (GstAllocatorClass *) klass; - - alloc_class->alloc = GST_DEBUG_FUNCPTR (gst_wl_shm_allocator_alloc); -} - -static void -gst_wl_shm_allocator_init (GstWlShmAllocator * self) -{ - GstAllocator *alloc = GST_ALLOCATOR_CAST (self); - - alloc->mem_type = GST_ALLOCATOR_WL_SHM; - - GST_OBJECT_FLAG_UNSET (self, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC); -} - -void -gst_wl_shm_allocator_register (void) -{ - GstAllocator *alloc; - - alloc = g_object_new (GST_TYPE_WL_SHM_ALLOCATOR, NULL); - gst_object_ref_sink (alloc); - gst_allocator_register (GST_ALLOCATOR_WL_SHM, alloc); -} - -GstAllocator * -gst_wl_shm_allocator_get (void) -{ - return gst_allocator_find (GST_ALLOCATOR_WL_SHM); -} - -gboolean -gst_is_wl_shm_memory (GstMemory * mem) -{ - return gst_memory_is_type (mem, GST_ALLOCATOR_WL_SHM); -} - -/* Copied from gst_v4l2_object_extrapolate_stride() */ -static gint -gst_wl_shm_extrapolate_stride (const GstVideoFormatInfo * finfo, gint plane, - gint stride) -{ - gint estride; - - switch (finfo->format) { - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV12_64Z32: - case GST_VIDEO_FORMAT_NV21: - case GST_VIDEO_FORMAT_NV16: - case GST_VIDEO_FORMAT_NV61: - case GST_VIDEO_FORMAT_NV24: - estride = (plane == 0 ? 1 : 2) * - GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (finfo, plane, stride); - break; - default: - estride = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (finfo, plane, stride); - break; - } - - return estride; -} - -static gboolean -gst_wl_shm_validate_video_info (const GstVideoInfo * vinfo) -{ - gint height = GST_VIDEO_INFO_HEIGHT (vinfo); - gint base_stride = GST_VIDEO_INFO_PLANE_STRIDE (vinfo, 0); - gsize base_offs = GST_VIDEO_INFO_PLANE_OFFSET (vinfo, 0); - gint i; - gsize offs = 0; - - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (vinfo); i++) { - guint32 estride; - - /* Overwrite the video info's stride and offset using the pitch calculcated - * by the kms driver. */ - estride = gst_wl_shm_extrapolate_stride (vinfo->finfo, i, base_stride); - - if (estride != GST_VIDEO_INFO_PLANE_STRIDE (vinfo, i)) - return FALSE; - - if (GST_VIDEO_INFO_PLANE_OFFSET (vinfo, i) - base_offs != offs) - return FALSE; - - /* Note that we cannot negotiate special padding betweem each planes, - * hence using the display height here. */ - offs += - estride * GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (vinfo->finfo, i, height); - } - - if (vinfo->size < offs) - return FALSE; - - return TRUE; -} - -struct wl_buffer * -gst_wl_shm_memory_construct_wl_buffer (GstMemory * mem, GstWlDisplay * display, - const GstVideoInfo * info) -{ - gint width, height, stride; - gsize offset, size, memsize, maxsize; - enum wl_shm_format format; - struct wl_shm_pool *wl_pool; - struct wl_buffer *wbuffer; - - if (!gst_wl_shm_validate_video_info (info)) { - GST_DEBUG_OBJECT (display, "Unsupported strides and offsets."); - return NULL; - } - - width = GST_VIDEO_INFO_WIDTH (info); - height = GST_VIDEO_INFO_HEIGHT (info); - stride = GST_VIDEO_INFO_PLANE_STRIDE (info, 0); - size = GST_VIDEO_INFO_SIZE (info); - format = gst_video_format_to_wl_shm_format (GST_VIDEO_INFO_FORMAT (info)); - - memsize = gst_memory_get_sizes (mem, &offset, &maxsize); - offset += GST_VIDEO_INFO_PLANE_OFFSET (info, 0); - - g_return_val_if_fail (gst_is_fd_memory (mem), NULL); - g_return_val_if_fail (size <= memsize, NULL); - g_return_val_if_fail (gst_wl_display_check_format_for_shm (display, - GST_VIDEO_INFO_FORMAT (info)), NULL); - - GST_DEBUG_OBJECT (display, "Creating wl_buffer from SHM of size %" - G_GSSIZE_FORMAT " (%d x %d, stride %d), format %s", size, width, height, - stride, gst_wl_shm_format_to_string (format)); - - wl_pool = wl_shm_create_pool (display->shm, gst_fd_memory_get_fd (mem), - memsize); - wbuffer = wl_shm_pool_create_buffer (wl_pool, offset, width, height, stride, - format); - wl_shm_pool_destroy (wl_pool); - - return wbuffer; -}
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/wlshmallocator.h
Deleted
@@ -1,66 +0,0 @@ -/* GStreamer Wayland video sink - * - * Copyright (C) 2012 Intel Corporation - * Copyright (C) 2012 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - * Copyright (C) 2014 Collabora Ltd. - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_WL_SHM_ALLOCATOR_H__ -#define __GST_WL_SHM_ALLOCATOR_H__ - -#include <gst/video/video.h> -#include <gst/allocators/allocators.h> -#include <wayland-client-protocol.h> -#include "wldisplay.h" - -G_BEGIN_DECLS - -#define GST_TYPE_WL_SHM_ALLOCATOR (gst_wl_shm_allocator_get_type ()) -#define GST_WL_SHM_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WL_SHM_ALLOCATOR, GstWlShmAllocator)) -#define GST_IS_WL_SHM_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WL_SHM_ALLOCATOR)) -#define GST_WL_SHM_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_WL_SHM_ALLOCATOR, GstWlShmAllocatorClass)) -#define GST_IS_WL_SHM_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_WL_SHM_ALLOCATOR)) -#define GST_WL_SHM_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_WL_SHM_ALLOCATOR, GstWlShmAllocatorClass)) - -#define GST_ALLOCATOR_WL_SHM "wl_shm" - -typedef struct _GstWlShmAllocator GstWlShmAllocator; -typedef struct _GstWlShmAllocatorClass GstWlShmAllocatorClass; - -struct _GstWlShmAllocator -{ - GstFdAllocator parent_instance; -}; - -struct _GstWlShmAllocatorClass -{ - GstFdAllocatorClass parent_class; -}; - -GType gst_wl_shm_allocator_get_type (void); - -void gst_wl_shm_allocator_register (void); -GstAllocator * gst_wl_shm_allocator_get (void); - -gboolean gst_is_wl_shm_memory (GstMemory * mem); -struct wl_buffer * gst_wl_shm_memory_construct_wl_buffer (GstMemory * mem, - GstWlDisplay * display, const GstVideoInfo * info); - -G_END_DECLS - -#endif /* __GST_WL_SHM_ALLOCATOR_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/wlvideoformat.c
Deleted
@@ -1,133 +0,0 @@ -/* GStreamer Wayland video sink - * - * Copyright (C) 2011 Intel Corporation - * Copyright (C) 2011 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - * Copyright (C) 2012 Wim Taymans <wim.taymans@gmail.com> - * Copyright (C) 2014 Collabora Ltd. - * - * 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., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "wlvideoformat.h" - -GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug); -#define GST_CAT_DEFAULT gstwayland_debug - -typedef struct -{ - enum wl_shm_format wl_shm_format; - guint dma_format; - GstVideoFormat gst_format; -} wl_VideoFormat; - -static const wl_VideoFormat wl_formats = { - {WL_SHM_FORMAT_XRGB8888, DRM_FORMAT_XRGB8888, GST_VIDEO_FORMAT_BGRx}, - {WL_SHM_FORMAT_ARGB8888, DRM_FORMAT_ARGB8888, GST_VIDEO_FORMAT_BGRA}, - {WL_SHM_FORMAT_XBGR8888, DRM_FORMAT_XBGR8888, GST_VIDEO_FORMAT_RGBx}, - {WL_SHM_FORMAT_RGBX8888, DRM_FORMAT_RGBX8888, GST_VIDEO_FORMAT_xBGR}, - {WL_SHM_FORMAT_BGRX8888, DRM_FORMAT_BGRX8888, GST_VIDEO_FORMAT_xRGB}, - {WL_SHM_FORMAT_ABGR8888, DRM_FORMAT_ABGR8888, GST_VIDEO_FORMAT_RGBA}, - {WL_SHM_FORMAT_RGBA8888, DRM_FORMAT_RGBA8888, GST_VIDEO_FORMAT_ABGR}, - {WL_SHM_FORMAT_BGRA8888, DRM_FORMAT_BGRA8888, GST_VIDEO_FORMAT_ARGB}, - {WL_SHM_FORMAT_RGB888, DRM_FORMAT_RGB888, GST_VIDEO_FORMAT_RGB}, - {WL_SHM_FORMAT_BGR888, DRM_FORMAT_BGR888, GST_VIDEO_FORMAT_BGR}, - {WL_SHM_FORMAT_RGB565, DRM_FORMAT_RGB565, GST_VIDEO_FORMAT_RGB16}, - {WL_SHM_FORMAT_BGR565, DRM_FORMAT_BGR565, GST_VIDEO_FORMAT_BGR16}, - - {WL_SHM_FORMAT_YUYV, DRM_FORMAT_YUYV, GST_VIDEO_FORMAT_YUY2}, - {WL_SHM_FORMAT_YVYU, DRM_FORMAT_YVYU, GST_VIDEO_FORMAT_YVYU}, - {WL_SHM_FORMAT_UYVY, DRM_FORMAT_UYVY, GST_VIDEO_FORMAT_UYVY}, - {WL_SHM_FORMAT_AYUV, DRM_FORMAT_AYUV, GST_VIDEO_FORMAT_AYUV}, - {WL_SHM_FORMAT_NV12, DRM_FORMAT_NV12, GST_VIDEO_FORMAT_NV12}, - {WL_SHM_FORMAT_NV21, DRM_FORMAT_NV21, GST_VIDEO_FORMAT_NV21}, - {WL_SHM_FORMAT_NV16, DRM_FORMAT_NV16, GST_VIDEO_FORMAT_NV16}, - {WL_SHM_FORMAT_NV61, DRM_FORMAT_NV61, GST_VIDEO_FORMAT_NV61}, - {WL_SHM_FORMAT_YUV410, DRM_FORMAT_YUV410, GST_VIDEO_FORMAT_YUV9}, - {WL_SHM_FORMAT_YVU410, DRM_FORMAT_YVU410, GST_VIDEO_FORMAT_YVU9}, - {WL_SHM_FORMAT_YUV411, DRM_FORMAT_YUV411, GST_VIDEO_FORMAT_Y41B}, - {WL_SHM_FORMAT_YUV420, DRM_FORMAT_YUV420, GST_VIDEO_FORMAT_I420}, - {WL_SHM_FORMAT_YVU420, DRM_FORMAT_YVU420, GST_VIDEO_FORMAT_YV12}, - {WL_SHM_FORMAT_YUV422, DRM_FORMAT_YUV422, GST_VIDEO_FORMAT_Y42B}, - {WL_SHM_FORMAT_YUV444, DRM_FORMAT_YUV444, GST_VIDEO_FORMAT_v308}, -}; - -enum wl_shm_format -gst_video_format_to_wl_shm_format (GstVideoFormat format) -{ - guint i; - - for (i = 0; i < G_N_ELEMENTS (wl_formats); i++) - if (wl_formatsi.gst_format == format) - return wl_formatsi.wl_shm_format; - - GST_WARNING ("wayland shm video format not found"); - return -1; -} - -gint -gst_video_format_to_wl_dmabuf_format (GstVideoFormat format) -{ - guint i; - - for (i = 0; i < G_N_ELEMENTS (wl_formats); i++) - if (wl_formatsi.gst_format == format) - return wl_formatsi.dma_format; - - GST_WARNING ("wayland dmabuf video format not found"); - return -1; -} - -GstVideoFormat -gst_wl_shm_format_to_video_format (enum wl_shm_format wl_format) -{ - guint i; - - for (i = 0; i < G_N_ELEMENTS (wl_formats); i++) - if (wl_formatsi.wl_shm_format == wl_format) - return wl_formatsi.gst_format; - - return GST_VIDEO_FORMAT_UNKNOWN; -} - -GstVideoFormat -gst_wl_dmabuf_format_to_video_format (guint wl_format) -{ - guint i; - - for (i = 0; i < G_N_ELEMENTS (wl_formats); i++) - if (wl_formatsi.dma_format == wl_format) - return wl_formatsi.gst_format; - - return GST_VIDEO_FORMAT_UNKNOWN; -} - -const gchar * -gst_wl_shm_format_to_string (enum wl_shm_format wl_format) -{ - return gst_video_format_to_string - (gst_wl_shm_format_to_video_format (wl_format)); -} - -const gchar * -gst_wl_dmabuf_format_to_string (guint wl_format) -{ - return gst_video_format_to_string - (gst_wl_dmabuf_format_to_video_format (wl_format)); -}
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/wlvideoformat.h
Deleted
@@ -1,42 +0,0 @@ -/* GStreamer Wayland video sink - * - * Copyright (C) 2011 Intel Corporation - * Copyright (C) 2011 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - * Copyright (C) 2012 Wim Taymans <wim.taymans@gmail.com> - * Copyright (C) 2014 Collabora Ltd. - * - * 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., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -#ifndef __GST_WL_VIDEO_FORMAT_H__ -#define __GST_WL_VIDEO_FORMAT_H__ - -#include <wayland-client-protocol.h> -#include <gst/video/video.h> -#include <drm_fourcc.h> - -G_BEGIN_DECLS - -enum wl_shm_format gst_video_format_to_wl_shm_format (GstVideoFormat format); -gint gst_video_format_to_wl_dmabuf_format (GstVideoFormat format); -GstVideoFormat gst_wl_shm_format_to_video_format (enum wl_shm_format wl_format); -GstVideoFormat gst_wl_dmabuf_format_to_video_format (guint wl_format); -const gchar *gst_wl_shm_format_to_string (enum wl_shm_format wl_format); -const gchar *gst_wl_dmabuf_format_to_string (guint wl_format); - -G_END_DECLS - -#endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/wlwindow.c
Deleted
@@ -1,574 +0,0 @@ -/* GStreamer Wayland video sink - * - * Copyright (C) 2011 Intel Corporation - * Copyright (C) 2011 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - * Copyright (C) 2014 Collabora Ltd. - * - * 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., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "wlwindow.h" -#include "wlshmallocator.h" -#include "wlbuffer.h" - -GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug); -#define GST_CAT_DEFAULT gstwayland_debug - -enum -{ - CLOSED, - LAST_SIGNAL -}; - -static guint signalsLAST_SIGNAL = { 0 }; - -G_DEFINE_TYPE (GstWlWindow, gst_wl_window, G_TYPE_OBJECT); - -static void gst_wl_window_finalize (GObject * gobject); - -static void gst_wl_window_update_borders (GstWlWindow * window); - -static void -handle_xdg_toplevel_close (void *data, struct xdg_toplevel *xdg_toplevel) -{ - GstWlWindow *window = data; - - GST_DEBUG ("XDG toplevel got a \"close\" event."); - g_signal_emit (window, signalsCLOSED, 0); -} - -static void -handle_xdg_toplevel_configure (void *data, struct xdg_toplevel *xdg_toplevel, - int32_t width, int32_t height, struct wl_array *states) -{ - GstWlWindow *window = data; - const uint32_t *state; - - GST_DEBUG ("XDG toplevel got a \"configure\" event, %d, %d .", - width, height); - - wl_array_for_each (state, states) { - switch (*state) { - case XDG_TOPLEVEL_STATE_FULLSCREEN: - case XDG_TOPLEVEL_STATE_MAXIMIZED: - case XDG_TOPLEVEL_STATE_RESIZING: - case XDG_TOPLEVEL_STATE_ACTIVATED: - break; - } - } - - if (width <= 0 || height <= 0) - return; - - gst_wl_window_set_render_rectangle (window, 0, 0, width, height); -} - -static const struct xdg_toplevel_listener xdg_toplevel_listener = { - handle_xdg_toplevel_configure, - handle_xdg_toplevel_close, -}; - -static void -handle_xdg_surface_configure (void *data, struct xdg_surface *xdg_surface, - uint32_t serial) -{ - GstWlWindow *window = data; - xdg_surface_ack_configure (xdg_surface, serial); - - g_mutex_lock (&window->configure_mutex); - window->configured = TRUE; - g_cond_signal (&window->configure_cond); - g_mutex_unlock (&window->configure_mutex); -} - -static const struct xdg_surface_listener xdg_surface_listener = { - handle_xdg_surface_configure, -}; - -static void -handle_ping (void *data, struct wl_shell_surface *wl_shell_surface, - uint32_t serial) -{ - wl_shell_surface_pong (wl_shell_surface, serial); -} - -static void -handle_configure (void *data, struct wl_shell_surface *wl_shell_surface, - uint32_t edges, int32_t width, int32_t height) -{ - GstWlWindow *window = data; - - GST_DEBUG ("Windows configure: edges %x, width = %i, height %i", edges, - width, height); - - if (width == 0 || height == 0) - return; - - gst_wl_window_set_render_rectangle (window, 0, 0, width, height); -} - -static void -handle_popup_done (void *data, struct wl_shell_surface *wl_shell_surface) -{ - GST_DEBUG ("Window popup done."); -} - -static const struct wl_shell_surface_listener wl_shell_surface_listener = { - handle_ping, - handle_configure, - handle_popup_done -}; - -static void -gst_wl_window_class_init (GstWlWindowClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - gobject_class->finalize = gst_wl_window_finalize; - - signalsCLOSED = g_signal_new ("closed", G_TYPE_FROM_CLASS (gobject_class), - G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0); -} - -static void -gst_wl_window_init (GstWlWindow * self) -{ - self->configured = TRUE; - g_cond_init (&self->configure_cond); - g_mutex_init (&self->configure_mutex); -} - -static void -gst_wl_window_finalize (GObject * gobject) -{ - GstWlWindow *self = GST_WL_WINDOW (gobject); - - if (self->wl_shell_surface) - wl_shell_surface_destroy (self->wl_shell_surface); - - if (self->xdg_toplevel) - xdg_toplevel_destroy (self->xdg_toplevel); - if (self->xdg_surface) - xdg_surface_destroy (self->xdg_surface); - - if (self->video_viewport) - wp_viewport_destroy (self->video_viewport); - - wl_proxy_wrapper_destroy (self->video_surface_wrapper); - wl_subsurface_destroy (self->video_subsurface); - wl_surface_destroy (self->video_surface); - - if (self->area_subsurface) - wl_subsurface_destroy (self->area_subsurface); - - if (self->area_viewport) - wp_viewport_destroy (self->area_viewport); - - wl_proxy_wrapper_destroy (self->area_surface_wrapper); - wl_surface_destroy (self->area_surface); - - g_clear_object (&self->display); - - G_OBJECT_CLASS (gst_wl_window_parent_class)->finalize (gobject); -} - -static GstWlWindow * -gst_wl_window_new_internal (GstWlDisplay * display, GMutex * render_lock) -{ - GstWlWindow *window; - struct wl_region *region; - - window = g_object_new (GST_TYPE_WL_WINDOW, NULL); - window->display = g_object_ref (display); - window->render_lock = render_lock; - g_cond_init (&window->configure_cond); - - window->area_surface = wl_compositor_create_surface (display->compositor); - window->video_surface = wl_compositor_create_surface (display->compositor); - - window->area_surface_wrapper = wl_proxy_create_wrapper (window->area_surface); - window->video_surface_wrapper = - wl_proxy_create_wrapper (window->video_surface); - - wl_proxy_set_queue ((struct wl_proxy *) window->area_surface_wrapper, - display->queue); - wl_proxy_set_queue ((struct wl_proxy *) window->video_surface_wrapper, - display->queue); - - /* embed video_surface in area_surface */ - window->video_subsurface = - wl_subcompositor_get_subsurface (display->subcompositor, - window->video_surface, window->area_surface); - wl_subsurface_set_desync (window->video_subsurface); - - if (display->viewporter) { - window->area_viewport = wp_viewporter_get_viewport (display->viewporter, - window->area_surface); - window->video_viewport = wp_viewporter_get_viewport (display->viewporter, - window->video_surface); - } - - /* never accept input events on the video surface */ - region = wl_compositor_create_region (display->compositor); - wl_surface_set_input_region (window->video_surface, region); - wl_region_destroy (region); - - return window; -} - -void -gst_wl_window_ensure_fullscreen (GstWlWindow * window, gboolean fullscreen) -{ - if (!window) - return; - - if (window->display->xdg_wm_base) { - if (fullscreen) - xdg_toplevel_set_fullscreen (window->xdg_toplevel, NULL); - else - xdg_toplevel_unset_fullscreen (window->xdg_toplevel); - } else { - if (fullscreen) - wl_shell_surface_set_fullscreen (window->wl_shell_surface, - WL_SHELL_SURFACE_FULLSCREEN_METHOD_SCALE, 0, NULL); - else - wl_shell_surface_set_toplevel (window->wl_shell_surface); - } -} - -GstWlWindow * -gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info, - gboolean fullscreen, GMutex * render_lock) -{ - GstWlWindow *window; - - window = gst_wl_window_new_internal (display, render_lock); - - /* Check which protocol we will use (in order of preference) */ - if (display->xdg_wm_base) { - gint64 timeout; - - /* First create the XDG surface */ - window->xdg_surface = xdg_wm_base_get_xdg_surface (display->xdg_wm_base, - window->area_surface); - if (!window->xdg_surface) { - GST_ERROR ("Unable to get xdg_surface"); - goto error; - } - xdg_surface_add_listener (window->xdg_surface, &xdg_surface_listener, - window); - - /* Then the toplevel */ - window->xdg_toplevel = xdg_surface_get_toplevel (window->xdg_surface); - if (!window->xdg_toplevel) { - GST_ERROR ("Unable to get xdg_toplevel"); - goto error; - } - xdg_toplevel_add_listener (window->xdg_toplevel, - &xdg_toplevel_listener, window); - - gst_wl_window_ensure_fullscreen (window, fullscreen); - - /* Finally, commit the xdg_surface state as toplevel */ - window->configured = FALSE; - wl_surface_commit (window->area_surface); - wl_display_flush (display->display); - - g_mutex_lock (&window->configure_mutex); - timeout = g_get_monotonic_time () + 100 * G_TIME_SPAN_MILLISECOND; - while (!window->configured) { - if (!g_cond_wait_until (&window->configure_cond, &window->configure_mutex, - timeout)) { - GST_WARNING ("The compositor did not send configure event."); - break; - } - } - g_mutex_unlock (&window->configure_mutex); - } else if (display->wl_shell) { - /* go toplevel */ - window->wl_shell_surface = wl_shell_get_shell_surface (display->wl_shell, - window->area_surface); - if (!window->wl_shell_surface) { - GST_ERROR ("Unable to get wl_shell_surface"); - goto error; - } - - wl_shell_surface_add_listener (window->wl_shell_surface, - &wl_shell_surface_listener, window); - gst_wl_window_ensure_fullscreen (window, fullscreen); - } else if (display->fullscreen_shell) { - zwp_fullscreen_shell_v1_present_surface (display->fullscreen_shell, - window->area_surface, ZWP_FULLSCREEN_SHELL_V1_PRESENT_METHOD_ZOOM, - NULL); - } else { - GST_ERROR ("Unable to use either wl_shell, xdg_wm_base or " - "zwp_fullscreen_shell."); - goto error; - } - - /* render_rectangle is already set via toplevel_configure in - * xdg_shell fullscreen mode */ - if (!(display->xdg_wm_base && fullscreen)) { - /* set the initial size to be the same as the reported video size */ - gint width = - gst_util_uint64_scale_int_round (info->width, info->par_n, info->par_d); - gst_wl_window_set_render_rectangle (window, 0, 0, width, info->height); - } - - return window; - -error: - g_object_unref (window); - return NULL; -} - -GstWlWindow * -gst_wl_window_new_in_surface (GstWlDisplay * display, - struct wl_surface * parent, GMutex * render_lock) -{ - GstWlWindow *window; - struct wl_region *region; - window = gst_wl_window_new_internal (display, render_lock); - - /* do not accept input events on the area surface when embedded */ - region = wl_compositor_create_region (display->compositor); - wl_surface_set_input_region (window->area_surface, region); - wl_region_destroy (region); - - /* embed in parent */ - window->area_subsurface = - wl_subcompositor_get_subsurface (display->subcompositor, - window->area_surface, parent); - wl_subsurface_set_desync (window->area_subsurface); - - wl_surface_commit (parent); - - return window; -} - -GstWlDisplay * -gst_wl_window_get_display (GstWlWindow * window) -{ - g_return_val_if_fail (window != NULL, NULL); - - return g_object_ref (window->display); -} - -struct wl_surface * -gst_wl_window_get_wl_surface (GstWlWindow * window) -{ - g_return_val_if_fail (window != NULL, NULL); - - return window->video_surface_wrapper; -} - -gboolean -gst_wl_window_is_toplevel (GstWlWindow * window) -{ - g_return_val_if_fail (window != NULL, FALSE); - - if (window->display->xdg_wm_base) - return (window->xdg_toplevel != NULL); - else - return (window->wl_shell_surface != NULL); -} - -static void -gst_wl_window_resize_video_surface (GstWlWindow * window, gboolean commit) -{ - GstVideoRectangle src = { 0, }; - GstVideoRectangle dst = { 0, }; - GstVideoRectangle res; - - /* center the video_subsurface inside area_subsurface */ - src.w = window->video_width; - src.h = window->video_height; - dst.w = window->render_rectangle.w; - dst.h = window->render_rectangle.h; - - if (window->video_viewport) { - gst_video_sink_center_rect (src, dst, &res, TRUE); - wp_viewport_set_destination (window->video_viewport, res.w, res.h); - } else { - gst_video_sink_center_rect (src, dst, &res, FALSE); - } - - wl_subsurface_set_position (window->video_subsurface, res.x, res.y); - - if (commit) - wl_surface_commit (window->video_surface_wrapper); - - window->video_rectangle = res; -} - -static void -gst_wl_window_set_opaque (GstWlWindow * window, const GstVideoInfo * info) -{ - struct wl_region *region; - - /* Set area opaque */ - region = wl_compositor_create_region (window->display->compositor); - wl_region_add (region, 0, 0, G_MAXINT32, G_MAXINT32); - wl_surface_set_opaque_region (window->area_surface, region); - wl_region_destroy (region); - - if (!GST_VIDEO_INFO_HAS_ALPHA (info)) { - /* Set video opaque */ - region = wl_compositor_create_region (window->display->compositor); - wl_region_add (region, 0, 0, G_MAXINT32, G_MAXINT32); - wl_surface_set_opaque_region (window->video_surface, region); - wl_region_destroy (region); - } -} - -void -gst_wl_window_render (GstWlWindow * window, GstWlBuffer * buffer, - const GstVideoInfo * info) -{ - if (G_UNLIKELY (info)) { - window->video_width = - gst_util_uint64_scale_int_round (info->width, info->par_n, info->par_d); - window->video_height = info->height; - - wl_subsurface_set_sync (window->video_subsurface); - gst_wl_window_resize_video_surface (window, FALSE); - gst_wl_window_set_opaque (window, info); - } - - if (G_LIKELY (buffer)) { - gst_wl_buffer_attach (buffer, window->video_surface_wrapper); - wl_surface_damage_buffer (window->video_surface_wrapper, 0, 0, G_MAXINT32, - G_MAXINT32); - wl_surface_commit (window->video_surface_wrapper); - - if (!window->is_area_surface_mapped) { - gst_wl_window_update_borders (window); - wl_surface_commit (window->area_surface_wrapper); - window->is_area_surface_mapped = TRUE; - } - } else { - /* clear both video and parent surfaces */ - wl_surface_attach (window->video_surface_wrapper, NULL, 0, 0); - wl_surface_commit (window->video_surface_wrapper); - wl_surface_attach (window->area_surface_wrapper, NULL, 0, 0); - wl_surface_commit (window->area_surface_wrapper); - window->is_area_surface_mapped = FALSE; - } - - if (G_UNLIKELY (info)) { - /* commit also the parent (area_surface) in order to change - * the position of the video_subsurface */ - wl_surface_commit (window->area_surface_wrapper); - wl_subsurface_set_desync (window->video_subsurface); - } - - wl_display_flush (window->display->display); -} - -/* Update the buffer used to draw black borders. When we have viewporter - * support, this is a scaled up 1x1 image, and without we need an black image - * the size of the rendering areay. */ -static void -gst_wl_window_update_borders (GstWlWindow * window) -{ - GstVideoFormat format; - GstVideoInfo info; - gint width, height; - GstBuffer *buf; - struct wl_buffer *wlbuf; - GstWlBuffer *gwlbuf; - GstAllocator *alloc; - - if (window->display->viewporter) { - wp_viewport_set_destination (window->area_viewport, - window->render_rectangle.w, window->render_rectangle.h); - - if (window->is_area_surface_mapped) { - /* The area_surface is already visible and only needed to get resized. - * We don't need to attach a new buffer and are done here. */ - return; - } - } - - if (window->display->viewporter) { - width = height = 1; - } else { - width = window->render_rectangle.w; - height = window->render_rectangle.h; - } - - /* we want WL_SHM_FORMAT_XRGB8888 */ - format = GST_VIDEO_FORMAT_BGRx; - - /* draw the area_subsurface */ - gst_video_info_set_format (&info, format, width, height); - - alloc = gst_wl_shm_allocator_get (); - - buf = gst_buffer_new_allocate (alloc, info.size, NULL); - gst_buffer_memset (buf, 0, 0, info.size); - wlbuf = - gst_wl_shm_memory_construct_wl_buffer (gst_buffer_peek_memory (buf, 0), - window->display, &info); - gwlbuf = gst_buffer_add_wl_buffer (buf, wlbuf, window->display); - gst_wl_buffer_attach (gwlbuf, window->area_surface_wrapper); - wl_surface_damage_buffer (window->area_surface_wrapper, 0, 0, G_MAXINT32, - G_MAXINT32); - - /* at this point, the GstWlBuffer keeps the buffer - * alive and will free it on wl_buffer::release */ - gst_buffer_unref (buf); - g_object_unref (alloc); -} - -void -gst_wl_window_set_render_rectangle (GstWlWindow * window, gint x, gint y, - gint w, gint h) -{ - g_return_if_fail (window != NULL); - - if (window->render_rectangle.x == x && window->render_rectangle.y == y && - window->render_rectangle.w == w && window->render_rectangle.h == h) - return; - - window->render_rectangle.x = x; - window->render_rectangle.y = y; - window->render_rectangle.w = w; - window->render_rectangle.h = h; - - /* position the area inside the parent - needs a parent commit to apply */ - if (window->area_subsurface) - wl_subsurface_set_position (window->area_subsurface, x, y); - - if (window->is_area_surface_mapped) - gst_wl_window_update_borders (window); - - if (!window->configured) - return; - - if (window->video_width != 0) { - wl_subsurface_set_sync (window->video_subsurface); - gst_wl_window_resize_video_surface (window, TRUE); - } - - wl_surface_commit (window->area_surface_wrapper); - - if (window->video_width != 0) - wl_subsurface_set_desync (window->video_subsurface); -}
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/wlwindow.h
Deleted
@@ -1,101 +0,0 @@ -/* GStreamer Wayland video sink - * - * Copyright (C) 2014 Collabora Ltd. - * - * 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., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - */ - -#ifndef __GST_WL_WINDOW_H__ -#define __GST_WL_WINDOW_H__ - -#include "wldisplay.h" -#include "wlbuffer.h" -#include <gst/video/video.h> - -G_BEGIN_DECLS - -#define GST_TYPE_WL_WINDOW (gst_wl_window_get_type ()) -#define GST_WL_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WL_WINDOW, GstWlWindow)) -#define GST_IS_WL_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WL_WINDOW)) -#define GST_WL_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_WL_WINDOW, GstWlWindowClass)) -#define GST_IS_WL_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_WL_WINDOW)) -#define GST_WL_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_WL_WINDOW, GstWlWindowClass)) - -typedef struct _GstWlWindow GstWlWindow; -typedef struct _GstWlWindowClass GstWlWindowClass; - -struct _GstWlWindow -{ - GObject parent_instance; - - GMutex *render_lock; - - GstWlDisplay *display; - struct wl_surface *area_surface; - struct wl_surface *area_surface_wrapper; - struct wl_subsurface *area_subsurface; - struct wp_viewport *area_viewport; - struct wl_surface *video_surface; - struct wl_surface *video_surface_wrapper; - struct wl_subsurface *video_subsurface; - struct wp_viewport *video_viewport; - struct wl_shell_surface *wl_shell_surface; - struct xdg_surface *xdg_surface; - struct xdg_toplevel *xdg_toplevel; - gboolean configured; - GCond configure_cond; - GMutex configure_mutex; - - /* the size and position of the area_(sub)surface */ - GstVideoRectangle render_rectangle; - - /* the size and position of the video_subsurface */ - GstVideoRectangle video_rectangle; - - /* the size of the video in the buffers */ - gint video_width, video_height; - - /* when this is not set both the area_surface and the video_surface are not - * visible and certain steps should be skipped */ - gboolean is_area_surface_mapped; -}; - -struct _GstWlWindowClass -{ - GObjectClass parent_class; -}; - -GType gst_wl_window_get_type (void); - -void gst_wl_window_ensure_fullscreen (GstWlWindow * window, - gboolean fullscreen); -GstWlWindow *gst_wl_window_new_toplevel (GstWlDisplay * display, - const GstVideoInfo * info, gboolean fullscreen, GMutex * render_lock); -GstWlWindow *gst_wl_window_new_in_surface (GstWlDisplay * display, - struct wl_surface * parent, GMutex * render_lock); - -GstWlDisplay *gst_wl_window_get_display (GstWlWindow * window); -struct wl_surface *gst_wl_window_get_wl_surface (GstWlWindow * window); -gboolean gst_wl_window_is_toplevel (GstWlWindow *window); - -void gst_wl_window_render (GstWlWindow * window, GstWlBuffer * buffer, - const GstVideoInfo * info); -void gst_wl_window_set_render_rectangle (GstWlWindow * window, gint x, gint y, - gint w, gint h); - -G_END_DECLS - -#endif /* __GST_WL_WINDOW_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/gstwebrtcice.c
Deleted
@@ -1,1219 +0,0 @@ -/* GStreamer - * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include "gstwebrtcice.h" -/* libnice */ -#include <agent.h> -#include "icestream.h" -#include "nicetransport.h" - -/* XXX: - * - * - are locally generated remote candidates meant to be readded to libnice? - */ - -static GstUri *_validate_turn_server (GstWebRTCICE * ice, const gchar * s); - -#define GST_CAT_DEFAULT gst_webrtc_ice_debug -GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); - -GQuark -gst_webrtc_ice_error_quark (void) -{ - return g_quark_from_static_string ("gst-webrtc-ice-error-quark"); -} - -enum -{ - SIGNAL_0, - ADD_LOCAL_IP_ADDRESS_SIGNAL, - LAST_SIGNAL, -}; - -enum -{ - PROP_0, - PROP_AGENT, - PROP_ICE_TCP, - PROP_ICE_UDP, - PROP_MIN_RTP_PORT, - PROP_MAX_RTP_PORT, -}; - -static guint gst_webrtc_ice_signalsLAST_SIGNAL = { 0 }; - -struct _GstWebRTCICEPrivate -{ - NiceAgent *nice_agent; - - GArray *nice_stream_map; - - GThread *thread; - GMainContext *main_context; - GMainLoop *loop; - GMutex lock; - GCond cond; - - GstWebRTCIceOnCandidateFunc on_candidate; - gpointer on_candidate_data; - GDestroyNotify on_candidate_notify; -}; - -#define gst_webrtc_ice_parent_class parent_class -G_DEFINE_TYPE_WITH_CODE (GstWebRTCICE, gst_webrtc_ice, - GST_TYPE_OBJECT, G_ADD_PRIVATE (GstWebRTCICE) - GST_DEBUG_CATEGORY_INIT (gst_webrtc_ice_debug, "webrtcice", 0, - "webrtcice");); - -static gboolean -_unlock_pc_thread (GMutex * lock) -{ - g_mutex_unlock (lock); - return G_SOURCE_REMOVE; -} - -static gpointer -_gst_nice_thread (GstWebRTCICE * ice) -{ - g_mutex_lock (&ice->priv->lock); - ice->priv->main_context = g_main_context_new (); - ice->priv->loop = g_main_loop_new (ice->priv->main_context, FALSE); - - g_cond_broadcast (&ice->priv->cond); - g_main_context_invoke (ice->priv->main_context, - (GSourceFunc) _unlock_pc_thread, &ice->priv->lock); - - g_main_loop_run (ice->priv->loop); - - g_mutex_lock (&ice->priv->lock); - g_main_context_unref (ice->priv->main_context); - ice->priv->main_context = NULL; - g_main_loop_unref (ice->priv->loop); - ice->priv->loop = NULL; - g_cond_broadcast (&ice->priv->cond); - g_mutex_unlock (&ice->priv->lock); - - return NULL; -} - -static void -_start_thread (GstWebRTCICE * ice) -{ - g_mutex_lock (&ice->priv->lock); - ice->priv->thread = g_thread_new (GST_OBJECT_NAME (ice), - (GThreadFunc) _gst_nice_thread, ice); - - while (!ice->priv->loop) - g_cond_wait (&ice->priv->cond, &ice->priv->lock); - g_mutex_unlock (&ice->priv->lock); -} - -static void -_stop_thread (GstWebRTCICE * ice) -{ - g_mutex_lock (&ice->priv->lock); - g_main_loop_quit (ice->priv->loop); - while (ice->priv->loop) - g_cond_wait (&ice->priv->cond, &ice->priv->lock); - g_mutex_unlock (&ice->priv->lock); - - g_thread_unref (ice->priv->thread); -} - -struct NiceStreamItem -{ - guint session_id; - guint nice_stream_id; - GstWebRTCICEStream *stream; -}; - -/* TRUE to continue, FALSE to stop */ -typedef gboolean (*NiceStreamItemForeachFunc) (struct NiceStreamItem * item, - gpointer user_data); - -static void -_nice_stream_item_foreach (GstWebRTCICE * ice, NiceStreamItemForeachFunc func, - gpointer data) -{ - int i, len; - - len = ice->priv->nice_stream_map->len; - for (i = 0; i < len; i++) { - struct NiceStreamItem *item = - &g_array_index (ice->priv->nice_stream_map, struct NiceStreamItem, - i); - - if (!func (item, data)) - break; - } -} - -/* TRUE for match, FALSE otherwise */ -typedef gboolean (*NiceStreamItemFindFunc) (struct NiceStreamItem * item, - gpointer user_data); - -struct nice_find -{ - NiceStreamItemFindFunc func; - gpointer data; - struct NiceStreamItem *ret; -}; - -static gboolean -_find_nice_item (struct NiceStreamItem *item, gpointer user_data) -{ - struct nice_find *f = user_data; - if (f->func (item, f->data)) { - f->ret = item; - return FALSE; - } - return TRUE; -} - -static struct NiceStreamItem * -_nice_stream_item_find (GstWebRTCICE * ice, NiceStreamItemFindFunc func, - gpointer data) -{ - struct nice_find f; - - f.func = func; - f.data = data; - f.ret = NULL; - - _nice_stream_item_foreach (ice, _find_nice_item, &f); - - return f.ret; -} - -#define NICE_MATCH_INIT { -1, -1, NULL } - -static gboolean -_match (struct NiceStreamItem *item, struct NiceStreamItem *m) -{ - if (m->session_id != -1 && m->session_id != item->session_id) - return FALSE; - if (m->nice_stream_id != -1 && m->nice_stream_id != item->nice_stream_id) - return FALSE; - if (m->stream != NULL && m->stream != item->stream) - return FALSE; - - return TRUE; -} - -static struct NiceStreamItem * -_find_item (GstWebRTCICE * ice, guint session_id, guint nice_stream_id, - GstWebRTCICEStream * stream) -{ - struct NiceStreamItem m = NICE_MATCH_INIT; - - m.session_id = session_id; - m.nice_stream_id = nice_stream_id; - m.stream = stream; - - return _nice_stream_item_find (ice, (NiceStreamItemFindFunc) _match, &m); -} - -static struct NiceStreamItem * -_create_nice_stream_item (GstWebRTCICE * ice, guint session_id) -{ - struct NiceStreamItem item; - - item.session_id = session_id; - item.nice_stream_id = nice_agent_add_stream (ice->priv->nice_agent, 1); - item.stream = gst_webrtc_ice_stream_new (ice, item.nice_stream_id); - g_array_append_val (ice->priv->nice_stream_map, item); - - return _find_item (ice, item.session_id, item.nice_stream_id, item.stream); -} - -static void -_parse_userinfo (const gchar * userinfo, gchar ** user, gchar ** pass) -{ - const gchar *colon; - - if (!userinfo) { - *user = NULL; - *pass = NULL; - return; - } - - colon = g_strstr_len (userinfo, -1, ":"); - if (!colon) { - *user = g_uri_unescape_string (userinfo, NULL); - *pass = NULL; - return; - } - - /* Check that the first occurence is also the last occurence */ - if (colon != g_strrstr (userinfo, ":")) - GST_WARNING ("userinfo %s contains more than one ':', will assume that the " - "first ':' delineates user:pass. You should escape the user and pass " - "before adding to the URI.", userinfo); - - *user = g_uri_unescape_segment (userinfo, colon, NULL); - *pass = g_uri_unescape_string (&colon1, NULL); -} - -static gchar * -_resolve_host (GstWebRTCICE * ice, const gchar * host) -{ - GResolver *resolver = g_resolver_get_default (); - GError *error = NULL; - GInetAddress *addr; - GList *addresses; - gchar *address; - - GST_DEBUG_OBJECT (ice, "Resolving host %s", host); - - if (!(addresses = g_resolver_lookup_by_name (resolver, host, NULL, &error))) { - GST_ERROR ("%s", error->message); - g_clear_error (&error); - return NULL; - } - - GST_DEBUG_OBJECT (ice, "Resolved %d addresses for host %s", - g_list_length (addresses), host); - - /* XXX: only the first address is used */ - addr = addresses->data; - address = g_inet_address_to_string (addr); - g_resolver_free_addresses (addresses); - - return address; -} - -static void -_add_turn_server (GstWebRTCICE * ice, struct NiceStreamItem *item, - GstUri * turn_server) -{ - gboolean ret; - gchar *user, *pass; - const gchar *host, *userinfo, *transport, *scheme; - NiceRelayType relays4 = { 0, }; - int i, relay_n = 0; - gchar *ip = NULL; - - host = gst_uri_get_host (turn_server); - if (!host) { - GST_ERROR_OBJECT (ice, "Turn server has no host"); - goto out; - } - ip = _resolve_host (ice, host); - if (!ip) { - GST_ERROR_OBJECT (ice, "Failed to resolve turn server '%s'", host); - goto out; - } - - /* Set the resolved IP as the host since that's what libnice wants */ - gst_uri_set_host (turn_server, ip); - - scheme = gst_uri_get_scheme (turn_server); - transport = gst_uri_get_query_value (turn_server, "transport"); - userinfo = gst_uri_get_userinfo (turn_server); - _parse_userinfo (userinfo, &user, &pass); - - if (g_strcmp0 (scheme, "turns") == 0) { - relaysrelay_n++ = NICE_RELAY_TYPE_TURN_TLS; - } else if (g_strcmp0 (scheme, "turn") == 0) { - if (!transport || g_strcmp0 (transport, "udp") == 0) - relaysrelay_n++ = NICE_RELAY_TYPE_TURN_UDP; - if (!transport || g_strcmp0 (transport, "tcp") == 0) - relaysrelay_n++ = NICE_RELAY_TYPE_TURN_TCP; - } - g_assert (relay_n < G_N_ELEMENTS (relays)); - - for (i = 0; i < relay_n; i++) { - ret = nice_agent_set_relay_info (ice->priv->nice_agent, - item->nice_stream_id, NICE_COMPONENT_TYPE_RTP, - gst_uri_get_host (turn_server), gst_uri_get_port (turn_server), - user, pass, relaysi); - if (!ret) { - gchar *uri = gst_uri_to_string (turn_server); - GST_ERROR_OBJECT (ice, "Failed to set TURN server '%s'", uri); - g_free (uri); - break; - } - } - g_free (user); - g_free (pass); - -out: - g_free (ip); -} - -typedef struct -{ - GstWebRTCICE *ice; - struct NiceStreamItem *item; -} AddTurnServerData; - -static void -_add_turn_server_func (const gchar * uri, GstUri * turn_server, - AddTurnServerData * data) -{ - _add_turn_server (data->ice, data->item, turn_server); -} - -static void -_add_stun_server (GstWebRTCICE * ice, GstUri * stun_server) -{ - const gchar *msg = "must be of the form stun://<host>:<port>"; - const gchar *host; - gchar *s = NULL; - gchar *ip = NULL; - guint port; - - s = gst_uri_to_string (stun_server); - GST_DEBUG_OBJECT (ice, "adding stun server, %s", s); - - host = gst_uri_get_host (stun_server); - if (!host) { - GST_ERROR_OBJECT (ice, "Stun server '%s' has no host, %s", s, msg); - goto out; - } - - port = gst_uri_get_port (stun_server); - if (port == GST_URI_NO_PORT) { - GST_INFO_OBJECT (ice, "Stun server '%s' has no port, assuming 3478", s); - port = 3478; - gst_uri_set_port (stun_server, port); - } - - ip = _resolve_host (ice, host); - if (!ip) { - GST_ERROR_OBJECT (ice, "Failed to resolve stun server '%s'", host); - goto out; - } - - g_object_set (ice->priv->nice_agent, "stun-server", ip, - "stun-server-port", port, NULL); - -out: - g_free (s); - g_free (ip); -} - -GstWebRTCICEStream * -gst_webrtc_ice_add_stream (GstWebRTCICE * ice, guint session_id) -{ - struct NiceStreamItem m = NICE_MATCH_INIT; - struct NiceStreamItem *item; - AddTurnServerData add_data; - - m.session_id = session_id; - item = _nice_stream_item_find (ice, (NiceStreamItemFindFunc) _match, &m); - if (item) { - GST_ERROR_OBJECT (ice, "stream already added with session_id=%u", - session_id); - return 0; - } - - if (ice->stun_server) { - _add_stun_server (ice, ice->stun_server); - } - - item = _create_nice_stream_item (ice, session_id); - - if (ice->turn_server) { - _add_turn_server (ice, item, ice->turn_server); - } - - add_data.ice = ice; - add_data.item = item; - - g_hash_table_foreach (ice->turn_servers, (GHFunc) _add_turn_server_func, - &add_data); - - return item->stream; -} - -static void -_on_new_candidate (NiceAgent * agent, NiceCandidate * candidate, - GstWebRTCICE * ice) -{ - struct NiceStreamItem *item; - gchar *attr; - - item = _find_item (ice, -1, candidate->stream_id, NULL); - if (!item) { - GST_WARNING_OBJECT (ice, "received signal for non-existent stream %u", - candidate->stream_id); - return; - } - - if (!candidate->username || !candidate->password) { - gboolean got_credentials; - gchar *ufrag, *password; - - got_credentials = nice_agent_get_local_credentials (ice->priv->nice_agent, - candidate->stream_id, &ufrag, &password); - g_warn_if_fail (got_credentials); - - if (!candidate->username) - candidate->username = ufrag; - else - g_free (ufrag); - - if (!candidate->password) - candidate->password = password; - else - g_free (password); - } - - attr = nice_agent_generate_local_candidate_sdp (agent, candidate); - - if (ice->priv->on_candidate) - ice->priv->on_candidate (ice, item->session_id, attr, - ice->priv->on_candidate_data); - - g_free (attr); -} - -GstWebRTCICETransport * -gst_webrtc_ice_find_transport (GstWebRTCICE * ice, GstWebRTCICEStream * stream, - GstWebRTCICEComponent component) -{ - struct NiceStreamItem *item; - - item = _find_item (ice, -1, -1, stream); - g_return_val_if_fail (item != NULL, NULL); - - return gst_webrtc_ice_stream_find_transport (item->stream, component); -} - -#if 0 -/* TODO don't rely on libnice to (de)serialize candidates */ -static NiceCandidateType -_candidate_type_from_string (const gchar * s) -{ - if (g_strcmp0 (s, "host") == 0) { - return NICE_CANDIDATE_TYPE_HOST; - } else if (g_strcmp0 (s, "srflx") == 0) { - return NICE_CANDIDATE_TYPE_SERVER_REFLEXIVE; - } else if (g_strcmp0 (s, "prflx") == 0) { /* FIXME: is the right string? */ - return NICE_CANDIDATE_TYPE_PEER_REFLEXIVE; - } else if (g_strcmp0 (s, "relay") == 0) { - return NICE_CANDIDATE_TYPE_RELAY; - } else { - g_assert_not_reached (); - return 0; - } -} - -static const gchar * -_candidate_type_to_string (NiceCandidateType type) -{ - switch (type) { - case NICE_CANDIDATE_TYPE_HOST: - return "host"; - case NICE_CANDIDATE_TYPE_SERVER_REFLEXIVE: - return "srflx"; - case NICE_CANDIDATE_TYPE_PEER_REFLEXIVE: - return "prflx"; - case NICE_CANDIDATE_TYPE_RELAY: - return "relay"; - default: - g_assert_not_reached (); - return NULL; - } -} - -static NiceCandidateTransport -_candidate_transport_from_string (const gchar * s) -{ - if (g_strcmp0 (s, "UDP") == 0) { - return NICE_CANDIDATE_TRANSPORT_UDP; - } else if (g_strcmp0 (s, "TCP tcptype") == 0) { - return NICE_CANDIDATE_TRANSPORT_TCP_ACTIVE; - } else if (g_strcmp0 (s, "tcp-passive") == 0) { /* FIXME: is the right string? */ - return NICE_CANDIDATE_TRANSPORT_TCP_PASSIVE; - } else if (g_strcmp0 (s, "tcp-so") == 0) { - return NICE_CANDIDATE_TRANSPORT_TCP_SO; - } else { - g_assert_not_reached (); - return 0; - } -} - -static const gchar * -_candidate_type_to_string (NiceCandidateType type) -{ - switch (type) { - case NICE_CANDIDATE_TYPE_HOST: - return "host"; - case NICE_CANDIDATE_TYPE_SERVER_REFLEXIVE: - return "srflx"; - case NICE_CANDIDATE_TYPE_PEER_REFLEXIVE: - return "prflx"; - case NICE_CANDIDATE_TYPE_RELAY: - return "relay"; - default: - g_assert_not_reached (); - return NULL; - } -} -#endif - -/* parse the address for possible resolution */ -static gboolean -get_candidate_address (const gchar * candidate, gchar ** prefix, - gchar ** address, gchar ** postfix) -{ - char **tokens = NULL; - char *tmp_address = NULL; - - if (!g_str_has_prefix (candidate, "a=candidate:")) { - GST_ERROR ("candidate \"%s\" does not start with \"a=candidate:\"", - candidate); - goto failure; - } - - if (!(tokens = g_strsplit (candidate, " ", 6))) { - GST_ERROR ("candidate \"%s\" could not be tokenized", candidate); - goto failure; - } - - if (g_strv_length (tokens) < 6) { - GST_ERROR ("candidate \"%s\" tokenization resulted in not enough tokens", - candidate); - goto failure; - } - - tmp_address = tokens4; - if (address) - *address = g_strdup (tmp_address); - tokens4 = NULL; - - if (prefix) - *prefix = g_strjoinv (" ", tokens); - if (postfix) - *postfix = g_strdup (tokens5); - - tokens4 = tmp_address; - - g_strfreev (tokens); - return TRUE; - -failure: - if (tokens) - g_strfreev (tokens); - return FALSE; -} - -/* candidate must start with "a=candidate:" or be NULL*/ -void -gst_webrtc_ice_add_candidate (GstWebRTCICE * ice, GstWebRTCICEStream * stream, - const gchar * candidate) -{ - struct NiceStreamItem *item; - NiceCandidate *cand; - GSList *candidates = NULL; - - item = _find_item (ice, -1, -1, stream); - g_return_if_fail (item != NULL); - - if (candidate == NULL) { - nice_agent_peer_candidate_gathering_done (ice->priv->nice_agent, - item->nice_stream_id); - return; - } - - cand = - nice_agent_parse_remote_candidate_sdp (ice->priv->nice_agent, - item->nice_stream_id, candidate); - if (!cand) { - /* might be a .local candidate */ - char *prefix = NULL, *address = NULL, *postfix = NULL; - char *new_addr = NULL, *new_candidate = NULL; - char *new_candv4 = { NULL, }; - gboolean failure = TRUE; - - if (!get_candidate_address (candidate, &prefix, &address, &postfix)) { - GST_WARNING_OBJECT (ice, "Failed to retrieve address from candidate %s", - candidate); - goto done; - } - - if (!g_str_has_suffix (address, ".local")) { - GST_WARNING_OBJECT (ice, "candidate address \'%s\' does not end " - "with \'.local\'", address); - goto done; - } - - /* FIXME: async */ - if (!(new_addr = _resolve_host (ice, address))) { - GST_WARNING_OBJECT (ice, "Failed to resolve %s", address); - goto done; - } - - new_candv0 = prefix; - new_candv1 = new_addr; - new_candv2 = postfix; - new_candv3 = NULL; - new_candidate = g_strjoinv (" ", new_candv); - - GST_DEBUG_OBJECT (ice, "resolved to candidate %s", new_candidate); - - cand = - nice_agent_parse_remote_candidate_sdp (ice->priv->nice_agent, - item->nice_stream_id, new_candidate); - if (!cand) { - GST_WARNING_OBJECT (ice, "Could not parse candidate \'%s\'", - new_candidate); - goto done; - } - - failure = FALSE; - - done: - g_free (prefix); - g_free (address); - g_free (postfix); - g_free (new_addr); - g_free (new_candidate); - if (failure) - return; - } - - if (cand->component_id == 2) { - /* we only support rtcp-mux so rtcp candidates are useless for us */ - GST_INFO_OBJECT (ice, "Dropping RTCP candidate %s", candidate); - nice_candidate_free (cand); - return; - } - - candidates = g_slist_append (candidates, cand); - - nice_agent_set_remote_candidates (ice->priv->nice_agent, item->nice_stream_id, - cand->component_id, candidates); - - g_slist_free (candidates); - nice_candidate_free (cand); -} - -gboolean -gst_webrtc_ice_set_remote_credentials (GstWebRTCICE * ice, - GstWebRTCICEStream * stream, gchar * ufrag, gchar * pwd) -{ - struct NiceStreamItem *item; - - g_return_val_if_fail (ufrag != NULL, FALSE); - g_return_val_if_fail (pwd != NULL, FALSE); - item = _find_item (ice, -1, -1, stream); - g_return_val_if_fail (item != NULL, FALSE); - - GST_DEBUG_OBJECT (ice, "Setting remote ICE credentials on " - "ICE stream %u ufrag:%s pwd:%s", item->nice_stream_id, ufrag, pwd); - - nice_agent_set_remote_credentials (ice->priv->nice_agent, - item->nice_stream_id, ufrag, pwd); - - return TRUE; -} - -gboolean -gst_webrtc_ice_add_turn_server (GstWebRTCICE * ice, const gchar * uri) -{ - gboolean ret = FALSE; - GstUri *valid_uri; - - if (!(valid_uri = _validate_turn_server (ice, uri))) - goto done; - - g_hash_table_insert (ice->turn_servers, g_strdup (uri), valid_uri); - - ret = TRUE; - -done: - return ret; -} - -static gboolean -gst_webrtc_ice_add_local_ip_address (GstWebRTCICE * ice, const gchar * address) -{ - gboolean ret = FALSE; - NiceAddress nice_addr; - - nice_address_init (&nice_addr); - - ret = nice_address_set_from_string (&nice_addr, address); - - if (ret) { - ret = nice_agent_add_local_address (ice->priv->nice_agent, &nice_addr); - if (!ret) { - GST_ERROR_OBJECT (ice, "Failed to add local address to NiceAgent"); - } - } else { - GST_ERROR_OBJECT (ice, "Failed to initialize NiceAddress %s", address); - } - - return ret; -} - -gboolean -gst_webrtc_ice_set_local_credentials (GstWebRTCICE * ice, - GstWebRTCICEStream * stream, gchar * ufrag, gchar * pwd) -{ - struct NiceStreamItem *item; - - g_return_val_if_fail (ufrag != NULL, FALSE); - g_return_val_if_fail (pwd != NULL, FALSE); - item = _find_item (ice, -1, -1, stream); - g_return_val_if_fail (item != NULL, FALSE); - - GST_DEBUG_OBJECT (ice, "Setting local ICE credentials on " - "ICE stream %u ufrag:%s pwd:%s", item->nice_stream_id, ufrag, pwd); - - nice_agent_set_local_credentials (ice->priv->nice_agent, item->nice_stream_id, - ufrag, pwd); - - return TRUE; -} - -gboolean -gst_webrtc_ice_gather_candidates (GstWebRTCICE * ice, - GstWebRTCICEStream * stream) -{ - struct NiceStreamItem *item; - - item = _find_item (ice, -1, -1, stream); - g_return_val_if_fail (item != NULL, FALSE); - - GST_DEBUG_OBJECT (ice, "gather candidates for stream %u", - item->nice_stream_id); - - return gst_webrtc_ice_stream_gather_candidates (stream); -} - -void -gst_webrtc_ice_set_is_controller (GstWebRTCICE * ice, gboolean controller) -{ - g_object_set (G_OBJECT (ice->priv->nice_agent), "controlling-mode", - controller, NULL); -} - -gboolean -gst_webrtc_ice_get_is_controller (GstWebRTCICE * ice) -{ - gboolean ret; - g_object_get (G_OBJECT (ice->priv->nice_agent), "controlling-mode", - &ret, NULL); - return ret; -} - -void -gst_webrtc_ice_set_force_relay (GstWebRTCICE * ice, gboolean force_relay) -{ - g_object_set (G_OBJECT (ice->priv->nice_agent), "force-relay", force_relay, - NULL); -} - -void -gst_webrtc_ice_set_on_ice_candidate (GstWebRTCICE * ice, - GstWebRTCIceOnCandidateFunc func, gpointer user_data, GDestroyNotify notify) -{ - if (ice->priv->on_candidate_notify) - ice->priv->on_candidate_notify (ice->priv->on_candidate_data); - ice->priv->on_candidate = NULL; - - ice->priv->on_candidate = func; - ice->priv->on_candidate_data = user_data; - ice->priv->on_candidate_notify = notify; -} - -void -gst_webrtc_ice_set_tos (GstWebRTCICE * ice, GstWebRTCICEStream * stream, - guint tos) -{ - struct NiceStreamItem *item; - - item = _find_item (ice, -1, -1, stream); - g_return_if_fail (item != NULL); - - nice_agent_set_stream_tos (ice->priv->nice_agent, item->nice_stream_id, tos); -} - -static void -_clear_ice_stream (struct NiceStreamItem *item) -{ - if (!item) - return; - - if (item->stream) { - g_signal_handlers_disconnect_by_data (item->stream->ice->priv->nice_agent, - item->stream); - gst_object_unref (item->stream); - } -} - -static GstUri * -_validate_turn_server (GstWebRTCICE * ice, const gchar * s) -{ - GstUri *uri = gst_uri_from_string_escaped (s); - const gchar *userinfo, *scheme; - GList *keys = NULL, *l; - gchar *user = NULL, *pass = NULL; - gboolean turn_tls = FALSE; - guint port; - - GST_DEBUG_OBJECT (ice, "validating turn server, %s", s); - - if (!uri) { - GST_ERROR_OBJECT (ice, "Could not parse turn server '%s'", s); - return NULL; - } - - scheme = gst_uri_get_scheme (uri); - if (g_strcmp0 (scheme, "turn") == 0) { - } else if (g_strcmp0 (scheme, "turns") == 0) { - turn_tls = TRUE; - } else { - GST_ERROR_OBJECT (ice, "unknown scheme '%s'", scheme); - goto out; - } - - keys = gst_uri_get_query_keys (uri); - for (l = keys; l; l = l->next) { - gchar *key = l->data; - - if (g_strcmp0 (key, "transport") == 0) { - const gchar *transport = gst_uri_get_query_value (uri, "transport"); - if (!transport) { - } else if (g_strcmp0 (transport, "udp") == 0) { - } else if (g_strcmp0 (transport, "tcp") == 0) { - } else { - GST_ERROR_OBJECT (ice, "unknown transport value, '%s'", transport); - goto out; - } - } else { - GST_ERROR_OBJECT (ice, "unknown query key, '%s'", key); - goto out; - } - } - - /* TODO: Implement error checking similar to the stun server below */ - userinfo = gst_uri_get_userinfo (uri); - _parse_userinfo (userinfo, &user, &pass); - if (!user) { - GST_ERROR_OBJECT (ice, "No username specified in '%s'", s); - goto out; - } - if (!pass) { - GST_ERROR_OBJECT (ice, "No password specified in '%s'", s); - goto out; - } - - port = gst_uri_get_port (uri); - - if (port == GST_URI_NO_PORT) { - if (turn_tls) { - gst_uri_set_port (uri, 5349); - } else { - gst_uri_set_port (uri, 3478); - } - } - - g_list_free (keys); - g_free (user); - g_free (pass); - - return uri; - -out: - g_list_free (keys); - g_free (user); - g_free (pass); - gst_uri_unref (uri); - - return NULL; -} - -void -gst_webrtc_ice_set_stun_server (GstWebRTCICE * ice, const gchar * uri_s) -{ - GstUri *uri = gst_uri_from_string_escaped (uri_s); - const gchar *msg = "must be of the form stun://<host>:<port>"; - - GST_DEBUG_OBJECT (ice, "setting stun server, %s", uri_s); - - if (!uri) { - GST_ERROR_OBJECT (ice, "Couldn't parse stun server '%s', %s", uri_s, msg); - return; - } - - if (ice->stun_server) - gst_uri_unref (ice->stun_server); - ice->stun_server = uri; -} - -gchar * -gst_webrtc_ice_get_stun_server (GstWebRTCICE * ice) -{ - if (ice->stun_server) - return gst_uri_to_string (ice->stun_server); - else - return NULL; -} - -void -gst_webrtc_ice_set_turn_server (GstWebRTCICE * ice, const gchar * uri_s) -{ - GstUri *uri = _validate_turn_server (ice, uri_s); - - if (uri) { - if (ice->turn_server) - gst_uri_unref (ice->turn_server); - ice->turn_server = uri; - } -} - -gchar * -gst_webrtc_ice_get_turn_server (GstWebRTCICE * ice) -{ - if (ice->turn_server) - return gst_uri_to_string (ice->turn_server); - else - return NULL; -} - -static void -gst_webrtc_ice_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstWebRTCICE *ice = GST_WEBRTC_ICE (object); - - switch (prop_id) { - case PROP_ICE_TCP: - g_object_set_property (G_OBJECT (ice->priv->nice_agent), - "ice-tcp", value); - break; - case PROP_ICE_UDP: - g_object_set_property (G_OBJECT (ice->priv->nice_agent), - "ice-udp", value); - break; - - case PROP_MIN_RTP_PORT: - ice->min_rtp_port = g_value_get_uint (value); - if (ice->min_rtp_port > ice->max_rtp_port) - g_warning ("Set min-rtp-port to %u which is larger than" - " max-rtp-port %u", ice->min_rtp_port, ice->max_rtp_port); - break; - - case PROP_MAX_RTP_PORT: - ice->max_rtp_port = g_value_get_uint (value); - if (ice->min_rtp_port > ice->max_rtp_port) - g_warning ("Set max-rtp-port to %u which is smaller than" - " min-rtp-port %u", ice->max_rtp_port, ice->min_rtp_port); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_webrtc_ice_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstWebRTCICE *ice = GST_WEBRTC_ICE (object); - - switch (prop_id) { - case PROP_AGENT: - g_value_set_object (value, ice->priv->nice_agent); - break; - case PROP_ICE_TCP: - g_object_get_property (G_OBJECT (ice->priv->nice_agent), - "ice-tcp", value); - break; - case PROP_ICE_UDP: - g_object_get_property (G_OBJECT (ice->priv->nice_agent), - "ice-udp", value); - break; - - case PROP_MIN_RTP_PORT: - g_value_set_uint (value, ice->min_rtp_port); - break; - - case PROP_MAX_RTP_PORT: - g_value_set_uint (value, ice->max_rtp_port); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_webrtc_ice_finalize (GObject * object) -{ - GstWebRTCICE *ice = GST_WEBRTC_ICE (object); - - g_signal_handlers_disconnect_by_data (ice->priv->nice_agent, ice); - - _stop_thread (ice); - - if (ice->priv->on_candidate_notify) - ice->priv->on_candidate_notify (ice->priv->on_candidate_data); - ice->priv->on_candidate = NULL; - ice->priv->on_candidate_notify = NULL; - - if (ice->turn_server) - gst_uri_unref (ice->turn_server); - if (ice->stun_server) - gst_uri_unref (ice->stun_server); - - g_mutex_clear (&ice->priv->lock); - g_cond_clear (&ice->priv->cond); - - g_array_free (ice->priv->nice_stream_map, TRUE); - - g_object_unref (ice->priv->nice_agent); - - g_hash_table_unref (ice->turn_servers); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -gst_webrtc_ice_constructed (GObject * object) -{ - GstWebRTCICE *ice = GST_WEBRTC_ICE (object); - NiceAgentOption options = 0; - - _start_thread (ice); - - options |= NICE_AGENT_OPTION_ICE_TRICKLE; - options |= NICE_AGENT_OPTION_REGULAR_NOMINATION; - - ice->priv->nice_agent = nice_agent_new_full (ice->priv->main_context, - NICE_COMPATIBILITY_RFC5245, options); - g_signal_connect (ice->priv->nice_agent, "new-candidate-full", - G_CALLBACK (_on_new_candidate), ice); - - G_OBJECT_CLASS (parent_class)->constructed (object); -} - -static void -gst_webrtc_ice_class_init (GstWebRTCICEClass * klass) -{ - GObjectClass *gobject_class = (GObjectClass *) klass; - - gobject_class->constructed = gst_webrtc_ice_constructed; - gobject_class->get_property = gst_webrtc_ice_get_property; - gobject_class->set_property = gst_webrtc_ice_set_property; - gobject_class->finalize = gst_webrtc_ice_finalize; - - g_object_class_install_property (gobject_class, - PROP_AGENT, - g_param_spec_object ("agent", "ICE agent", - "ICE agent in use by this object. WARNING! Accessing this property " - "may have disastrous consequences for the operation of webrtcbin. " - "Other ICE implementations may not have the same interface.", - NICE_TYPE_AGENT, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, - PROP_ICE_TCP, - g_param_spec_boolean ("ice-tcp", "ICE TCP", - "Whether the agent should use ICE-TCP when gathering candidates", - TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, - PROP_ICE_UDP, - g_param_spec_boolean ("ice-udp", "ICE UDP", - "Whether the agent should use ICE-UDP when gathering candidates", - TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /** - * GstWebRTCICE:min-rtp-port: - * - * Minimum port for local rtp port range. - * min-rtp-port must be <= max-rtp-port - * - * Since: 1.20 - */ - g_object_class_install_property (gobject_class, - PROP_MIN_RTP_PORT, - g_param_spec_uint ("min-rtp-port", "ICE RTP candidate min port", - "Minimum port for local rtp port range. " - "min-rtp-port must be <= max-rtp-port", - 0, 65535, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /** - * GstWebRTCICE:max-rtp-port: - * - * Maximum port for local rtp port range. - * min-rtp-port must be <= max-rtp-port - * - * Since: 1.20 - */ - g_object_class_install_property (gobject_class, - PROP_MAX_RTP_PORT, - g_param_spec_uint ("max-rtp-port", "ICE RTP candidate max port", - "Maximum port for local rtp port range. " - "max-rtp-port must be >= min-rtp-port", - 0, 65535, 65535, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); - - /** - * GstWebRTCICE::add-local-ip-address: - * @object: the #GstWebRTCICE - * @address: The local IP address - * - * Add a local IP address to use for ICE candidate gathering. If none - * are supplied, they will be discovered automatically. Calling this signal - * stops automatic ICE gathering. - * - * Returns: whether the address could be added. - */ - gst_webrtc_ice_signalsADD_LOCAL_IP_ADDRESS_SIGNAL = - g_signal_new_class_handler ("add-local-ip-address", - G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_CALLBACK (gst_webrtc_ice_add_local_ip_address), NULL, NULL, - g_cclosure_marshal_generic, G_TYPE_BOOLEAN, 1, G_TYPE_STRING); -} - -static void -gst_webrtc_ice_init (GstWebRTCICE * ice) -{ - ice->priv = gst_webrtc_ice_get_instance_private (ice); - - g_mutex_init (&ice->priv->lock); - g_cond_init (&ice->priv->cond); - - ice->turn_servers = - g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - (GDestroyNotify) gst_uri_unref); - - ice->priv->nice_stream_map = - g_array_new (FALSE, TRUE, sizeof (struct NiceStreamItem)); - g_array_set_clear_func (ice->priv->nice_stream_map, - (GDestroyNotify) _clear_ice_stream); -} - -GstWebRTCICE * -gst_webrtc_ice_new (const gchar * name) -{ - return g_object_new (GST_TYPE_WEBRTC_ICE, "name", name, NULL); -}
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/gstwebrtcice.h
Deleted
@@ -1,112 +0,0 @@ -/* GStreamer - * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_WEBRTC_ICE_H__ -#define __GST_WEBRTC_ICE_H__ - -#include <gst/gst.h> -#include <gst/sdp/sdp.h> -#include <gst/webrtc/webrtc.h> -#include "fwd.h" - -G_BEGIN_DECLS - -#define GST_WEBRTC_ICE_ERROR gst_webrtc_ice_error_quark () -GQuark gst_webrtc_ice_error_quark (void); - -GType gst_webrtc_ice_get_type(void); -#define GST_TYPE_WEBRTC_ICE (gst_webrtc_ice_get_type()) -#define GST_WEBRTC_ICE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WEBRTC_ICE,GstWebRTCICE)) -#define GST_IS_WEBRTC_ICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WEBRTC_ICE)) -#define GST_WEBRTC_ICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_WEBRTC_ICE,GstWebRTCICEClass)) -#define GST_IS_WEBRTC_ICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_WEBRTC_ICE)) -#define GST_WEBRTC_ICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_ICE,GstWebRTCICEClass)) - -struct _GstWebRTCICE -{ - GstObject parent; - - GstWebRTCICEGatheringState ice_gathering_state; - GstWebRTCICEConnectionState ice_connection_state; - - GstUri *stun_server; - GstUri *turn_server; - - GHashTable *turn_servers; - - GstWebRTCICEPrivate *priv; - - guint min_rtp_port; - guint max_rtp_port; -}; - -struct _GstWebRTCICEClass -{ - GstObjectClass parent_class; -}; - -GstWebRTCICE * gst_webrtc_ice_new (const gchar * name); -GstWebRTCICEStream * gst_webrtc_ice_add_stream (GstWebRTCICE * ice, - guint session_id); -GstWebRTCICETransport * gst_webrtc_ice_find_transport (GstWebRTCICE * ice, - GstWebRTCICEStream * stream, - GstWebRTCICEComponent component); - -gboolean gst_webrtc_ice_gather_candidates (GstWebRTCICE * ice, - GstWebRTCICEStream * stream); -/* FIXME: GstStructure-ize the candidate */ -void gst_webrtc_ice_add_candidate (GstWebRTCICE * ice, - GstWebRTCICEStream * stream, - const gchar * candidate); -gboolean gst_webrtc_ice_set_local_credentials (GstWebRTCICE * ice, - GstWebRTCICEStream * stream, - gchar * ufrag, - gchar * pwd); -gboolean gst_webrtc_ice_set_remote_credentials (GstWebRTCICE * ice, - GstWebRTCICEStream * stream, - gchar * ufrag, - gchar * pwd); -gboolean gst_webrtc_ice_add_turn_server (GstWebRTCICE * ice, - const gchar * uri); - -void gst_webrtc_ice_set_is_controller (GstWebRTCICE * ice, - gboolean controller); -gboolean gst_webrtc_ice_get_is_controller (GstWebRTCICE * ice); -void gst_webrtc_ice_set_force_relay (GstWebRTCICE * ice, - gboolean force_relay); -void gst_webrtc_ice_set_stun_server (GstWebRTCICE * ice, - const gchar * uri); -gchar * gst_webrtc_ice_get_stun_server (GstWebRTCICE * ice); -void gst_webrtc_ice_set_turn_server (GstWebRTCICE * ice, - const gchar * uri); -gchar * gst_webrtc_ice_get_turn_server (GstWebRTCICE * ice); - -typedef void (*GstWebRTCIceOnCandidateFunc) (GstWebRTCICE * ice, guint stream_id, gchar * candidate, gpointer user_data); - -void gst_webrtc_ice_set_on_ice_candidate (GstWebRTCICE * ice, - GstWebRTCIceOnCandidateFunc func, - gpointer user_data, - GDestroyNotify notify); - -void gst_webrtc_ice_set_tos (GstWebRTCICE * ice, - GstWebRTCICEStream * stream, - guint tos); -G_END_DECLS - -#endif /* __GST_WEBRTC_ICE_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/icestream.c
Deleted
@@ -1,260 +0,0 @@ -/* GStreamer - * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include "icestream.h" -#include "nicetransport.h" - -#define GST_CAT_DEFAULT gst_webrtc_ice_stream_debug -GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); - -enum -{ - SIGNAL_0, - LAST_SIGNAL, -}; - -enum -{ - PROP_0, - PROP_ICE, - PROP_STREAM_ID, -}; - -//static guint gst_webrtc_ice_stream_signalsLAST_SIGNAL = { 0 }; - -struct _GstWebRTCICEStreamPrivate -{ - gboolean gathered; - GList *transports; - gboolean gathering_started; -}; - -#define gst_webrtc_ice_stream_parent_class parent_class -G_DEFINE_TYPE_WITH_CODE (GstWebRTCICEStream, gst_webrtc_ice_stream, - GST_TYPE_OBJECT, G_ADD_PRIVATE (GstWebRTCICEStream) - GST_DEBUG_CATEGORY_INIT (gst_webrtc_ice_stream_debug, - "webrtcicestream", 0, "webrtcicestream");); - -static void -gst_webrtc_ice_stream_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstWebRTCICEStream *stream = GST_WEBRTC_ICE_STREAM (object); - - switch (prop_id) { - case PROP_ICE: - /* XXX: weak-ref this? */ - stream->ice = g_value_get_object (value); - break; - case PROP_STREAM_ID: - stream->stream_id = g_value_get_uint (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_webrtc_ice_stream_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstWebRTCICEStream *stream = GST_WEBRTC_ICE_STREAM (object); - - switch (prop_id) { - case PROP_ICE: - g_value_set_object (value, stream->ice); - break; - case PROP_STREAM_ID: - g_value_set_uint (value, stream->stream_id); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_webrtc_ice_stream_finalize (GObject * object) -{ - GstWebRTCICEStream *stream = GST_WEBRTC_ICE_STREAM (object); - - g_list_free (stream->priv->transports); - stream->priv->transports = NULL; - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -_on_candidate_gathering_done (NiceAgent * agent, guint stream_id, - GstWebRTCICEStream * ice) -{ - GList *l; - - if (stream_id != ice->stream_id) - return; - - GST_DEBUG_OBJECT (ice, "%u gathering done", stream_id); - - ice->priv->gathered = TRUE; - - for (l = ice->priv->transports; l; l = l->next) { - GstWebRTCICETransport *ice = l->data; - - gst_webrtc_ice_transport_gathering_state_change (ice, - GST_WEBRTC_ICE_GATHERING_STATE_COMPLETE); - } -} - -GstWebRTCICETransport * -gst_webrtc_ice_stream_find_transport (GstWebRTCICEStream * stream, - GstWebRTCICEComponent component) -{ - GstWebRTCICEComponent trans_comp; - GstWebRTCICETransport *ret; - GList *l; - - g_return_val_if_fail (GST_IS_WEBRTC_ICE_STREAM (stream), NULL); - - for (l = stream->priv->transports; l; l = l->next) { - GstWebRTCICETransport *trans = l->data; - g_object_get (trans, "component", &trans_comp, NULL); - - if (component == trans_comp) - return gst_object_ref (trans); - } - - ret = - GST_WEBRTC_ICE_TRANSPORT (gst_webrtc_nice_transport_new (stream, - component)); - stream->priv->transports = g_list_prepend (stream->priv->transports, ret); - - return ret; -} - -static void -gst_webrtc_ice_stream_constructed (GObject * object) -{ - GstWebRTCICEStream *stream = GST_WEBRTC_ICE_STREAM (object); - NiceAgent *agent; - - g_object_get (stream->ice, "agent", &agent, NULL); - g_signal_connect (agent, "candidate-gathering-done", - G_CALLBACK (_on_candidate_gathering_done), stream); - - g_object_unref (agent); - - G_OBJECT_CLASS (parent_class)->constructed (object); -} - -gboolean -gst_webrtc_ice_stream_gather_candidates (GstWebRTCICEStream * stream) -{ - NiceAgent *agent; - GList *l; - - g_return_val_if_fail (GST_IS_WEBRTC_ICE_STREAM (stream), FALSE); - - GST_DEBUG_OBJECT (stream, "start gathering candidates"); - - if (stream->priv->gathered) - return TRUE; - - for (l = stream->priv->transports; l; l = l->next) { - GstWebRTCICETransport *trans = l->data; - - gst_webrtc_ice_transport_gathering_state_change (trans, - GST_WEBRTC_ICE_GATHERING_STATE_GATHERING); - } - - g_object_get (stream->ice, "agent", &agent, NULL); - - if (!stream->priv->gathering_started) { - if (stream->ice->min_rtp_port != 0 || stream->ice->max_rtp_port != 65535) { - if (stream->ice->min_rtp_port > stream->ice->max_rtp_port) { - GST_ERROR_OBJECT (stream->ice, - "invalid port range: min-rtp-port %d must be <= max-rtp-port %d", - stream->ice->min_rtp_port, stream->ice->max_rtp_port); - return FALSE; - } - - nice_agent_set_port_range (agent, stream->stream_id, - NICE_COMPONENT_TYPE_RTP, stream->ice->min_rtp_port, - stream->ice->max_rtp_port); - } - /* mark as gathering started to prevent changing ports again */ - stream->priv->gathering_started = TRUE; - } - - if (!nice_agent_gather_candidates (agent, stream->stream_id)) { - g_object_unref (agent); - return FALSE; - } - - for (l = stream->priv->transports; l; l = l->next) { - GstWebRTCNiceTransport *trans = l->data; - - gst_webrtc_nice_transport_update_buffer_size (trans); - } - - g_object_unref (agent); - return TRUE; -} - -static void -gst_webrtc_ice_stream_class_init (GstWebRTCICEStreamClass * klass) -{ - GObjectClass *gobject_class = (GObjectClass *) klass; - - gobject_class->constructed = gst_webrtc_ice_stream_constructed; - gobject_class->get_property = gst_webrtc_ice_stream_get_property; - gobject_class->set_property = gst_webrtc_ice_stream_set_property; - gobject_class->finalize = gst_webrtc_ice_stream_finalize; - - g_object_class_install_property (gobject_class, - PROP_ICE, - g_param_spec_object ("ice", - "ICE", "ICE agent associated with this stream", - GST_TYPE_WEBRTC_ICE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, - PROP_STREAM_ID, - g_param_spec_uint ("stream-id", - "ICE stream id", "ICE stream id associated with this stream", - 0, G_MAXUINT, 0, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); -} - -static void -gst_webrtc_ice_stream_init (GstWebRTCICEStream * ice) -{ - ice->priv = gst_webrtc_ice_stream_get_instance_private (ice); -} - -GstWebRTCICEStream * -gst_webrtc_ice_stream_new (GstWebRTCICE * ice, guint stream_id) -{ - return g_object_new (GST_TYPE_WEBRTC_ICE_STREAM, "ice", ice, - "stream-id", stream_id, NULL); -}
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/icestream.h
Deleted
@@ -1,63 +0,0 @@ -/* GStreamer - * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_WEBRTC_ICE_STREAM_H__ -#define __GST_WEBRTC_ICE_STREAM_H__ - -#include <gst/gst.h> -/* libice */ -#include <agent.h> -#include <gst/webrtc/webrtc.h> -#include "gstwebrtcice.h" - -G_BEGIN_DECLS - -GType gst_webrtc_ice_stream_get_type(void); -#define GST_TYPE_WEBRTC_ICE_STREAM (gst_webrtc_ice_stream_get_type()) -#define GST_WEBRTC_ICE_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WEBRTC_ICE_STREAM,GstWebRTCICEStream)) -#define GST_IS_WEBRTC_ICE_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WEBRTC_ICE_STREAM)) -#define GST_WEBRTC_ICE_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_WEBRTC_ICE_STREAM,GstWebRTCICEStreamClass)) -#define GST_IS_WEBRTC_ICE_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_WEBRTC_ICE_STREAM)) -#define GST_WEBRTC_ICE_STREAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_ICE_STREAM,GstWebRTCICEStreamClass)) - -struct _GstWebRTCICEStream -{ - GstObject parent; - - GstWebRTCICE *ice; - - guint stream_id; - - GstWebRTCICEStreamPrivate *priv; -}; - -struct _GstWebRTCICEStreamClass -{ - GstObjectClass parent_class; -}; - -GstWebRTCICEStream * gst_webrtc_ice_stream_new (GstWebRTCICE * ice, - guint stream_id); -GstWebRTCICETransport * gst_webrtc_ice_stream_find_transport (GstWebRTCICEStream * stream, - GstWebRTCICEComponent component); -gboolean gst_webrtc_ice_stream_gather_candidates (GstWebRTCICEStream * ice); - -G_END_DECLS - -#endif /* __GST_WEBRTC_ICE_STREAM_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/nicetransport.c
Deleted
@@ -1,355 +0,0 @@ -/* GStreamer - * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include "nicetransport.h" -#include "icestream.h" - -#include <gio/gnetworking.h> - -#define GST_CAT_DEFAULT gst_webrtc_nice_transport_debug -GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); - -enum -{ - SIGNAL_0, - LAST_SIGNAL, -}; - -enum -{ - PROP_0, - PROP_STREAM, - PROP_SEND_BUFFER_SIZE, - PROP_RECEIVE_BUFFER_SIZE -}; - -//static guint gst_webrtc_nice_transport_signalsLAST_SIGNAL = { 0 }; - -struct _GstWebRTCNiceTransportPrivate -{ - gboolean running; - - gint send_buffer_size; - gint receive_buffer_size; -}; - -#define gst_webrtc_nice_transport_parent_class parent_class -G_DEFINE_TYPE_WITH_CODE (GstWebRTCNiceTransport, gst_webrtc_nice_transport, - GST_TYPE_WEBRTC_ICE_TRANSPORT, G_ADD_PRIVATE (GstWebRTCNiceTransport) - GST_DEBUG_CATEGORY_INIT (gst_webrtc_nice_transport_debug, - "webrtcnicetransport", 0, "webrtcnicetransport"); - ); - -static NiceComponentType -_gst_component_to_nice (GstWebRTCICEComponent component) -{ - switch (component) { - case GST_WEBRTC_ICE_COMPONENT_RTP: - return NICE_COMPONENT_TYPE_RTP; - case GST_WEBRTC_ICE_COMPONENT_RTCP: - return NICE_COMPONENT_TYPE_RTCP; - default: - g_assert_not_reached (); - return 0; - } -} - -static GstWebRTCICEComponent -_nice_component_to_gst (NiceComponentType component) -{ - switch (component) { - case NICE_COMPONENT_TYPE_RTP: - return GST_WEBRTC_ICE_COMPONENT_RTP; - case NICE_COMPONENT_TYPE_RTCP: - return GST_WEBRTC_ICE_COMPONENT_RTCP; - default: - g_assert_not_reached (); - return 0; - } -} - -static GstWebRTCICEConnectionState -_nice_component_state_to_gst (NiceComponentState state) -{ - switch (state) { - case NICE_COMPONENT_STATE_DISCONNECTED: - return GST_WEBRTC_ICE_CONNECTION_STATE_DISCONNECTED; - case NICE_COMPONENT_STATE_GATHERING: - return GST_WEBRTC_ICE_CONNECTION_STATE_NEW; - case NICE_COMPONENT_STATE_CONNECTING: - return GST_WEBRTC_ICE_CONNECTION_STATE_CHECKING; - case NICE_COMPONENT_STATE_CONNECTED: - return GST_WEBRTC_ICE_CONNECTION_STATE_CONNECTED; - case NICE_COMPONENT_STATE_READY: - return GST_WEBRTC_ICE_CONNECTION_STATE_COMPLETED; - case NICE_COMPONENT_STATE_FAILED: - return GST_WEBRTC_ICE_CONNECTION_STATE_FAILED; - default: - g_assert_not_reached (); - return 0; - } -} - -static void -gst_webrtc_nice_transport_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstWebRTCNiceTransport *nice = GST_WEBRTC_NICE_TRANSPORT (object); - - switch (prop_id) { - case PROP_STREAM: - if (nice->stream) - gst_object_unref (nice->stream); - nice->stream = g_value_dup_object (value); - break; - case PROP_SEND_BUFFER_SIZE: - nice->priv->send_buffer_size = g_value_get_int (value); - gst_webrtc_nice_transport_update_buffer_size (nice); - break; - case PROP_RECEIVE_BUFFER_SIZE: - nice->priv->receive_buffer_size = g_value_get_int (value); - gst_webrtc_nice_transport_update_buffer_size (nice); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_webrtc_nice_transport_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstWebRTCNiceTransport *nice = GST_WEBRTC_NICE_TRANSPORT (object); - - switch (prop_id) { - case PROP_STREAM: - g_value_set_object (value, nice->stream); - break; - case PROP_SEND_BUFFER_SIZE: - g_value_set_int (value, nice->priv->send_buffer_size); - break; - case PROP_RECEIVE_BUFFER_SIZE: - g_value_set_int (value, nice->priv->receive_buffer_size); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_webrtc_nice_transport_finalize (GObject * object) -{ - GstWebRTCNiceTransport *nice = GST_WEBRTC_NICE_TRANSPORT (object); - - gst_object_unref (nice->stream); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -void -gst_webrtc_nice_transport_update_buffer_size (GstWebRTCNiceTransport * nice) -{ - NiceAgent *agent = NULL; - GPtrArray *sockets; - guint i; - - g_object_get (nice->stream->ice, "agent", &agent, NULL); - g_assert (agent != NULL); - - sockets = nice_agent_get_sockets (agent, nice->stream->stream_id, 1); - if (sockets == NULL) { - g_object_unref (agent); - return; - } - - for (i = 0; i < sockets->len; i++) { - GSocket *gsocket = g_ptr_array_index (sockets, i); -#ifdef SO_SNDBUF - if (nice->priv->send_buffer_size != 0) { - GError *gerror = NULL; - if (!g_socket_set_option (gsocket, SOL_SOCKET, SO_SNDBUF, - nice->priv->send_buffer_size, &gerror)) - GST_WARNING_OBJECT (nice, "Could not set send buffer size : %s", - gerror->message); - g_clear_error (&gerror); - } -#endif -#ifdef SO_RCVBUF - if (nice->priv->receive_buffer_size != 0) { - GError *gerror = NULL; - if (!g_socket_set_option (gsocket, SOL_SOCKET, SO_RCVBUF, - nice->priv->receive_buffer_size, &gerror)) - GST_WARNING_OBJECT (nice, "Could not set send receive size : %s", - gerror->message); - g_clear_error (&gerror); - } -#endif - } - g_ptr_array_unref (sockets); - g_object_unref (agent); -} - - -static void -_on_new_selected_pair (NiceAgent * agent, guint stream_id, - NiceComponentType component, NiceCandidate * lcandidate, - NiceCandidate * rcandidate, GstWebRTCNiceTransport * nice) -{ - GstWebRTCICETransport *ice = GST_WEBRTC_ICE_TRANSPORT (nice); - GstWebRTCICEComponent comp = _nice_component_to_gst (component); - guint our_stream_id; - - g_object_get (nice->stream, "stream-id", &our_stream_id, NULL); - - if (stream_id != our_stream_id) - return; - if (comp != ice->component) - return; - - gst_webrtc_ice_transport_selected_pair_change (ice); -} - -static void -_on_component_state_changed (NiceAgent * agent, guint stream_id, - NiceComponentType component, NiceComponentState state, - GstWebRTCNiceTransport * nice) -{ - GstWebRTCICETransport *ice = GST_WEBRTC_ICE_TRANSPORT (nice); - GstWebRTCICEComponent comp = _nice_component_to_gst (component); - guint our_stream_id; - - g_object_get (nice->stream, "stream-id", &our_stream_id, NULL); - - if (stream_id != our_stream_id) - return; - if (comp != ice->component) - return; - - GST_DEBUG_OBJECT (ice, "%u %u %s", stream_id, component, - nice_component_state_to_string (state)); - - gst_webrtc_ice_transport_connection_state_change (ice, - _nice_component_state_to_gst (state)); -} - -static void -gst_webrtc_nice_transport_constructed (GObject * object) -{ - GstWebRTCNiceTransport *nice = GST_WEBRTC_NICE_TRANSPORT (object); - GstWebRTCICETransport *ice = GST_WEBRTC_ICE_TRANSPORT (object); - NiceComponentType component = _gst_component_to_nice (ice->component); - gboolean controlling_mode; - guint our_stream_id; - NiceAgent *agent; - - g_object_get (nice->stream, "stream-id", &our_stream_id, NULL); - g_object_get (nice->stream->ice, "agent", &agent, NULL); - - g_object_get (agent, "controlling-mode", &controlling_mode, NULL); - ice->role = - controlling_mode ? GST_WEBRTC_ICE_ROLE_CONTROLLING : - GST_WEBRTC_ICE_ROLE_CONTROLLED; - - g_signal_connect (agent, "component-state-changed", - G_CALLBACK (_on_component_state_changed), nice); - g_signal_connect (agent, "new-selected-pair-full", - G_CALLBACK (_on_new_selected_pair), nice); - - ice->src = gst_element_factory_make ("nicesrc", NULL); - if (ice->src) { - g_object_set (ice->src, "agent", agent, "stream", our_stream_id, - "component", component, NULL); - } - ice->sink = gst_element_factory_make ("nicesink", NULL); - if (ice->sink) { - g_object_set (ice->sink, "agent", agent, "stream", our_stream_id, - "component", component, "async", FALSE, "enable-last-sample", FALSE, - "sync", FALSE, NULL); - } - - g_object_unref (agent); - - G_OBJECT_CLASS (parent_class)->constructed (object); -} - -static void -gst_webrtc_nice_transport_class_init (GstWebRTCNiceTransportClass * klass) -{ - GObjectClass *gobject_class = (GObjectClass *) klass; - - gobject_class->constructed = gst_webrtc_nice_transport_constructed; - gobject_class->get_property = gst_webrtc_nice_transport_get_property; - gobject_class->set_property = gst_webrtc_nice_transport_set_property; - gobject_class->finalize = gst_webrtc_nice_transport_finalize; - - g_object_class_install_property (gobject_class, - PROP_STREAM, - g_param_spec_object ("stream", - "WebRTC ICE Stream", "ICE stream associated with this transport", - GST_TYPE_WEBRTC_ICE_STREAM, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); - - /** - * GstWebRTCNiceTransport:send-buffer-size: - * - * Size of the kernel send buffer in bytes, 0=default - * - * Since: 1.20 - */ - - g_object_class_install_property (G_OBJECT_CLASS (klass), - PROP_SEND_BUFFER_SIZE, g_param_spec_int ("send-buffer-size", - "Send Buffer Size", - "Size of the kernel send buffer in bytes, 0=default", 0, G_MAXINT, 0, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /** - * GstWebRTCNiceTransport:receive-buffer-size: - * - * Size of the kernel receive buffer in bytes, 0=default - * - * Since: 1.20 - */ - - g_object_class_install_property (G_OBJECT_CLASS (klass), - PROP_RECEIVE_BUFFER_SIZE, g_param_spec_int ("receive-buffer-size", - "Receive Buffer Size", - "Size of the kernel receive buffer in bytes, 0=default", 0, G_MAXINT, - 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); -} - -static void -gst_webrtc_nice_transport_init (GstWebRTCNiceTransport * nice) -{ - nice->priv = gst_webrtc_nice_transport_get_instance_private (nice); -} - -GstWebRTCNiceTransport * -gst_webrtc_nice_transport_new (GstWebRTCICEStream * stream, - GstWebRTCICEComponent component) -{ - return g_object_new (GST_TYPE_WEBRTC_NICE_TRANSPORT, "stream", stream, - "component", component, NULL); -}
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/nicetransport.h
Deleted
@@ -1,63 +0,0 @@ -/* GStreamer - * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_WEBRTC_NICE_TRANSPORT_H__ -#define __GST_WEBRTC_NICE_TRANSPORT_H__ - -#include <gst/gst.h> -/* libnice */ -#include <agent.h> -#include <gst/webrtc/webrtc.h> -#include "gstwebrtcice.h" - -#include "gst/webrtc/webrtc-priv.h" - -G_BEGIN_DECLS - -GType gst_webrtc_nice_transport_get_type(void); -#define GST_TYPE_WEBRTC_NICE_TRANSPORT (gst_webrtc_nice_transport_get_type()) -#define GST_WEBRTC_NICE_TRANSPORT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WEBRTC_NICE_TRANSPORT,GstWebRTCNiceTransport)) -#define GST_IS_WEBRTC_NICE_TRANSPORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WEBRTC_NICE_TRANSPORT)) -#define GST_WEBRTC_NICE_TRANSPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_WEBRTC_NICE_TRANSPORT,GstWebRTCNiceTransportClass)) -#define GST_IS_WEBRTC_NICE_TRANSPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_WEBRTC_NICE_TRANSPORT)) -#define GST_WEBRTC_NICE_TRANSPORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_NICE_TRANSPORT,GstWebRTCNiceTransportClass)) - -struct _GstWebRTCNiceTransport -{ - GstWebRTCICETransport parent; - - GstWebRTCICEStream *stream; - - GstWebRTCNiceTransportPrivate *priv; -}; - -struct _GstWebRTCNiceTransportClass -{ - GstWebRTCICETransportClass parent_class; -}; - -GstWebRTCNiceTransport * gst_webrtc_nice_transport_new (GstWebRTCICEStream * stream, - GstWebRTCICEComponent component); - -void gst_webrtc_nice_transport_update_buffer_size (GstWebRTCNiceTransport * nice); - - -G_END_DECLS - -#endif /* __GST_WEBRTC_NICE_TRANSPORT_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11_private.h
Deleted
@@ -1,48 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_D3D11_PRIVATE_H__ -#define __GST_D3D11_PRIVATE_H__ - -#include <gst/gst.h> -#include <gst/video/video.h> -#include <gst/d3d11/gstd3d11_fwd.h> - -G_BEGIN_DECLS - -void gst_d3d11_device_d3d11_debug (GstD3D11Device * device, - const gchar * file, - const gchar * function, - gint line); - -void gst_d3d11_device_dxgi_debug (GstD3D11Device * device, - const gchar * file, - const gchar * function, - gint line); - -#define GST_D3D11_CLEAR_COM(obj) G_STMT_START { \ - if (obj) { \ - (obj)->Release (); \ - (obj) = NULL; \ - } \ - } G_STMT_END - -G_END_DECLS - -#endif /* __GST_D3D11_PRIVATE_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/gettext.h
Deleted
@@ -1,69 +0,0 @@ -/* Convenience header for conditional use of GNU <libintl.h>. - Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. - - This program 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, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, - USA. */ - -#ifndef _LIBGETTEXT_H -#define _LIBGETTEXT_H 1 - -/* NLS can be disabled through the configure --disable-nls option. */ -#ifdef ENABLE_NLS - -/* Get declarations of GNU message catalog functions. */ -# include <libintl.h> - -#else - -/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which - chokes if dcgettext is defined as a macro. So include it now, to make - later inclusions of <locale.h> a NOP. We don't include <libintl.h> - as well because people using "gettext.h" will not include <libintl.h>, - and also including <libintl.h> would fail on SunOS 4, whereas <locale.h> - is OK. */ -#if defined(__sun) -# include <locale.h> -#endif - -/* Disabled NLS. - The casts to 'const char *' serve the purpose of producing warnings - for invalid uses of the value returned from these functions. - On pre-ANSI systems without 'const', the config.h file is supposed to - contain "#define const". */ -# define gettext(Msgid) ((const char *) (Msgid)) -# define dgettext(Domainname, Msgid) ((const char *) (Msgid)) -# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) -# define ngettext(Msgid1, Msgid2, N) \ - ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) -# define dngettext(Domainname, Msgid1, Msgid2, N) \ - ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) -# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ - ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) -# define textdomain(Domainname) ((const char *) (Domainname)) -# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) -# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) - -#endif - -/* A pseudo function call that serves as a marker for the automated - extraction of messages, but does not call gettext(). The run-time - translation is done at a different place in the code. - The argument, String, should be a literal string. Concatenated strings - and other string expressions won't work. - The macro's expansion is not parenthesized, so that it is suitable as - initializer for static 'char' or 'const char' variables. */ -#define gettext_noop(String) String - -#endif /* _LIBGETTEXT_H */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/gst-i18n-plugin.h
Deleted
@@ -1,45 +0,0 @@ -/* GStreamer - * Copyright (C) 2004 Thomas Vander Stichele <thomas@apestaart.org> - * - * gst-i18n-plugins.h: internationalization macros for the GStreamer plugins - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_I18N_PLUGIN_H__ -#define __GST_I18N_PLUGIN_H__ - -#ifndef GETTEXT_PACKAGE -#error You must define GETTEXT_PACKAGE before including this header. -#endif - -#ifdef ENABLE_NLS - -#include "gettext.h" /* included with gettext distribution and copied */ - -/* we want to use shorthand _() for translating and N_() for marking */ -#define _(String) dgettext (GETTEXT_PACKAGE, String) -#define N_(String) gettext_noop (String) -/* FIXME: if we need it, we can add Q_ as well, like in glib */ - -#else -#define _(String) String -#define N_(String) String -#define ngettext(Singular,Plural,Count) ((Count>1)?Plural:Singular) - -#endif - -#endif /* __GST_I18N_PLUGIN_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/wayland/wayland.c
Deleted
@@ -1,132 +0,0 @@ -/* - * GStreamer Wayland Library - * Copyright (C) 2014 Collabora Ltd. - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <gst/wayland/wayland.h> -#include <gst/video/videooverlay.h> - -gboolean -gst_is_wayland_display_handle_need_context_message (GstMessage * msg) -{ - const gchar *type = NULL; - - g_return_val_if_fail (GST_IS_MESSAGE (msg), FALSE); - - if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_NEED_CONTEXT && - gst_message_parse_context_type (msg, &type)) { - return !g_strcmp0 (type, GST_WAYLAND_DISPLAY_HANDLE_CONTEXT_TYPE); - } - - return FALSE; -} - -GstContext * -gst_wayland_display_handle_context_new (struct wl_display * display) -{ - GstContext *context = - gst_context_new (GST_WAYLAND_DISPLAY_HANDLE_CONTEXT_TYPE, TRUE); - gst_structure_set (gst_context_writable_structure (context), - "display", G_TYPE_POINTER, display, NULL); - return context; -} - -struct wl_display * -gst_wayland_display_handle_context_get_handle (GstContext * context) -{ - const GstStructure *s; - struct wl_display *display; - - g_return_val_if_fail (GST_IS_CONTEXT (context), NULL); - - s = gst_context_get_structure (context); - if (gst_structure_get (s, "display", G_TYPE_POINTER, &display, NULL)) - return display; - if (gst_structure_get (s, "handle", G_TYPE_POINTER, &display, NULL)) - return display; - return NULL; -} - - -G_DEFINE_INTERFACE (GstWaylandVideo, gst_wayland_video, GST_TYPE_VIDEO_OVERLAY); - -static void -gst_wayland_video_default_init (GstWaylandVideoInterface * klass) -{ - (void) klass; -} - -/** - * gst_wayland_video_begin_geometry_change: - * - * Notifies the video sink that we are about to change its - * geometry (probably using set_render_rectangle()). This is useful - * in order to allow the sink to synchronize resizing/moving of the - * video area with the parent surface and avoid glitches, in cases - * where the video area is being painted asynchronously from another - * thread, like in waylandsink. - * - * Please note that any calls to this method MUST be matched by - * calls to end_geometry_change() and AFTER the parent surface has - * committed its geometry changes. - */ -void -gst_wayland_video_begin_geometry_change (GstWaylandVideo * video) -{ - GstWaylandVideoInterface *iface; - - g_return_if_fail (video != NULL); - g_return_if_fail (GST_IS_WAYLAND_VIDEO (video)); - - iface = GST_WAYLAND_VIDEO_GET_INTERFACE (video); - - if (iface->begin_geometry_change) { - iface->begin_geometry_change (video); - } -} - -/** - * gst_wayland_video_end_geometry_change: - * - * Notifies the video sink that we just finished changing the - * geometry of both itself and its parent surface. This should - * have been earlier preceded by a call to begin_geometry_change() - * which notified the sink before any of these changes had happened. - * - * It is important to call this method only AFTER the parent surface - * has committed its geometry changes, otherwise no synchronization - * is actually achieved. - */ -void -gst_wayland_video_end_geometry_change (GstWaylandVideo * video) -{ - GstWaylandVideoInterface *iface; - - g_return_if_fail (video != NULL); - g_return_if_fail (GST_IS_WAYLAND_VIDEO (video)); - - iface = GST_WAYLAND_VIDEO_GET_INTERFACE (video); - - if (iface->end_geometry_change) { - iface->end_geometry_change (video); - } -}
View file
gst-plugins-bad-1.20.5.tar.xz/gst/jpegformat/gstjpegformat.h
Deleted
@@ -1,92 +0,0 @@ -/* GStreamer - * - * jpegformat: a plugin for JPEG Interchange Format - * - * Copyright (C) <2010> Stefan Kost <ensonic@users.sf.net> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - - -#ifndef __GST_JPEG_FORMAT_H__ -#define __GST_JPEG_FORMAT_H__ - -G_BEGIN_DECLS - -/* - * JPEG Markers - */ - -/* Start Of Frame markers, non-differential, Huffman coding */ -#define SOF0 0xc0 /* Baseline DCT */ -#define SOF1 0xc1 /* Extended sequential DCT */ -#define SOF2 0xc2 /* Progressive DCT */ -#define SOF3 0xc3 /* Lossless */ - -/* Start Of Frame markers, differential, Huffman coding */ -#define SOF5 0xc5 -#define SOF6 0xc6 -#define SOF7 0xc7 - -/* Start Of Frame markers, non-differential, arithmetic coding */ -#define JPG 0xc8 /* Reserved */ -#define SOF9 0xc9 -#define SOF10 0xca -#define SOF11 0xcb - -/* Start Of Frame markers, differential, arithmetic coding */ -#define SOF13 0xcd -#define SOF14 0xce -#define SOF15 0xcf - -/* Restart interval termination */ -#define RST0 0xd0 /* Restart ... */ -#define RST1 0xd1 -#define RST2 0xd2 -#define RST3 0xd3 -#define RST4 0xd4 -#define RST5 0xd5 -#define RST6 0xd6 -#define RST7 0xd7 - -#define SOI 0xd8 /* Start of image */ -#define EOI 0xd9 /* End Of Image */ -#define SOS 0xda /* Start Of Scan */ - -#define DHT 0xc4 /* Huffman Table(s) */ -#define DAC 0xcc /* Algorithmic Coding Table */ -#define DQT 0xdb /* Quantisation Table(s) */ -#define DNL 0xdc /* Number of lines */ -#define DRI 0xdd /* Restart Interval */ -#define DHP 0xde /* Hierarchical progression */ -#define EXP 0xdf - -#define APP0 0xe0 /* Application marker */ -#define APP1 0xe1 -#define APP2 0xe2 -#define APP13 0xed -#define APP14 0xee -#define APP15 0xef - -#define JPG0 0xf0 /* Reserved ... */ -#define JPG13 0xfd -#define COM 0xfe /* Comment */ - -#define TEM 0x01 - -G_END_DECLS - -#endif /* __GST_JPEG_FORMAT_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11compositorbin.cpp
Deleted
@@ -1,1011 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2015 Matthew Waters <matthew@centricular.com> - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * SECTION:element-d3d11compositor - * @title: d3d11compositor - * - * A convenient bin which wraps #d3d11compositorelement for video composition - * with other helper elements to handle color conversion and memory transfer - * between Direct3D11 and system memory space. - * - * ## Example launch line - * ``` - * gst-launch-1.0 d3d11compositor name=c ! d3d11videosink \ - * videotestsrc ! video/x-raw,width=320,height=240 ! c. \ - * videotestsrc pattern=ball ! video/x-raw,width=100,height=100 ! c. - * ``` - * - * Since: 1.20 - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <gst/controller/gstproxycontrolbinding.h> -#include "gstd3d11compositorbin.h" -#include "gstd3d11compositor.h" -#include "gstd3d11pluginutils.h" - -GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_compositor_debug); -#define GST_CAT_DEFAULT gst_d3d11_compositor_debug - -/**************************** - * GstD3D11CompositorBinPad * - ****************************/ - -enum -{ - PROP_PAD_0, - /* GstAggregatorPad */ - PROP_PAD_EMIT_SIGNALS, -}; - -/* GstAggregatorPad */ -#define DEFAULT_PAD_EMIT_SIGNALS FALSE - -enum -{ - /* GstAggregatorPad */ - SIGNAL_PAD_BUFFER_CONSUMED = 0, - SIGNAL_PAD_LAST, -}; - -static guint gst_d3d11_compositor_bin_pad_signalsSIGNAL_PAD_LAST = { 0 }; - -/** - * GstD3D11CompositorBinPad: - * - * Since: 1.20 - */ -struct _GstD3D11CompositorBinPad -{ - GstGhostPad parent; - - /* Holds ref */ - GstPad *target; - gulong sig_id; -}; - -static void gst_d3d11_compositor_bin_pad_dispose (GObject * object); -static void gst_d3d11_compositor_bin_pad_set_property (GObject * object, - guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_d3d11_compositor_bin_pad_get_property (GObject * object, - guint prop_id, GValue * value, GParamSpec * pspec); -static void -gst_d3d11_compositor_bin_pad_set_target_default (GstD3D11CompositorBinPad * pad, - GstPad * target); - -G_DEFINE_TYPE (GstD3D11CompositorBinPad, gst_d3d11_compositor_bin_pad, - GST_TYPE_GHOST_PAD); - -static void -gst_d3d11_compositor_bin_pad_class_init (GstD3D11CompositorBinPadClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->dispose = gst_d3d11_compositor_bin_pad_dispose; - gobject_class->set_property = gst_d3d11_compositor_bin_pad_set_property; - gobject_class->get_property = gst_d3d11_compositor_bin_pad_get_property; - - /* GstAggregatorPad */ - g_object_class_install_property (gobject_class, PROP_PAD_EMIT_SIGNALS, - g_param_spec_boolean ("emit-signals", "Emit signals", - "Send signals to signal data consumption", - DEFAULT_PAD_EMIT_SIGNALS, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); - - gst_d3d11_compositor_bin_pad_signalsSIGNAL_PAD_BUFFER_CONSUMED = - g_signal_new ("buffer-consumed", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, GST_TYPE_BUFFER); - - klass->set_target = - GST_DEBUG_FUNCPTR (gst_d3d11_compositor_bin_pad_set_target_default); -} - -static void -gst_d3d11_compositor_bin_pad_init (GstD3D11CompositorBinPad * self) -{ -} - -static void -gst_d3d11_compositor_bin_pad_dispose (GObject * object) -{ - GstD3D11CompositorBinPad *self = GST_D3D11_COMPOSITOR_BIN_PAD (object); - - gst_clear_object (&self->target); - - G_OBJECT_CLASS (gst_d3d11_compositor_bin_pad_parent_class)->dispose (object); -} - -static void -gst_d3d11_compositor_bin_pad_set_property (GObject * object, - guint prop_id, const GValue * value, GParamSpec * pspec) -{ - GstD3D11CompositorBinPad *self = GST_D3D11_COMPOSITOR_BIN_PAD (object); - - if (self->target) - g_object_set_property (G_OBJECT (self->target), pspec->name, value); -} - -static void -gst_d3d11_compositor_bin_pad_get_property (GObject * object, - guint prop_id, GValue * value, GParamSpec * pspec) -{ - GstD3D11CompositorBinPad *self = GST_D3D11_COMPOSITOR_BIN_PAD (object); - - if (self->target) - g_object_get_property (G_OBJECT (self->target), pspec->name, value); -} - -static void -gst_d3d11_compositor_bin_pad_on_buffer_consumed (GstAggregatorPad * pad, - GstBuffer * buffer, GstD3D11CompositorBinPad * self) -{ - g_signal_emit (self, - gst_d3d11_compositor_bin_pad_signalsSIGNAL_PAD_BUFFER_CONSUMED, - 0, buffer); -} - -/** - * gst_d3d11_compositor_bin_pad_set_target: - * @self: a #GstD3D11CompositorBinPad - * @target: (transfer full): a #GstAggregatorPad - */ -static void -gst_d3d11_compositor_bin_pad_set_target (GstD3D11CompositorBinPad * pad, - GstPad * target) -{ - GstD3D11CompositorBinPadClass *klass = - GST_D3D11_COMPOSITOR_BIN_PAD_GET_CLASS (pad); - - klass->set_target (pad, target); -} - -static void -gst_d3d11_compositor_bin_pad_set_target_default (GstD3D11CompositorBinPad * pad, - GstPad * target) -{ - pad->target = target; - pad->sig_id = g_signal_connect (target, "buffer-consumed", - G_CALLBACK (gst_d3d11_compositor_bin_pad_on_buffer_consumed), pad); -} - -static void -gst_d3d11_compositor_bin_pad_unset_target (GstD3D11CompositorBinPad * self) -{ - if (!self->target) - return; - - if (self->sig_id) - g_signal_handler_disconnect (self->target, self->sig_id); - self->sig_id = 0; - gst_clear_object (&self->target); -} - -/****************************** - * GstD3D11CompositorBinInput * - ******************************/ - -enum -{ - PROP_INPUT_0, - /* GstVideoAggregatorPad */ - PROP_INPUT_ZORDER, - PROP_INPUT_REPEAT_AFTER_EOS, - PROP_INPUT_MAX_LAST_BUFFER_REPEAT, - /* GstD3D11CompositorPad */ - PROP_INPUT_XPOS, - PROP_INPUT_YPOS, - PROP_INPUT_WIDTH, - PROP_INPUT_HEIGHT, - PROP_INPUT_ALPHA, - PROP_INPUT_BLEND_OP_RGB, - PROP_INPUT_BLEND_OP_ALPHA, - PROP_INPUT_BLEND_SRC_RGB, - PROP_INPUT_BLEND_SRC_ALPHA, - PROP_INPUT_BLEND_DEST_RGB, - PROP_INPUT_BLEND_DEST_ALPHA, - PROP_INPUT_BLEND_FACTOR_RED, - PROP_INPUT_BLEND_FACTOR_GREEN, - PROP_INPUT_BLEND_FACTOR_BLUE, - PROP_INPUT_BLEND_FACTOR_ALPHA, - PROP_INPUT_SIZING_POLICY, -}; - -/* GstVideoAggregatorPad */ -#define DEFAULT_INPUT_ZORDER 0 -#define DEFAULT_INPUT_REPEAT_AFTER_EOS FALSE -#define DEFAULT_INPUT_MAX_LAST_BUFFER_REPEAT GST_CLOCK_TIME_NONE -/* GstD3D11CompositorPad */ -#define DEFAULT_INPUT_XPOS 0 -#define DEFAULT_INPUT_YPOS 0 -#define DEFAULT_INPUT_WIDTH 0 -#define DEFAULT_INPUT_HEIGHT 0 -#define DEFAULT_INPUT_ALPHA 1.0 -#define DEFAULT_INPUT_BLEND_OP_RGB GST_D3D11_COMPOSITOR_BLEND_OP_ADD -#define DEFAULT_INPUT_BLEND_OP_ALPHA GST_D3D11_COMPOSITOR_BLEND_OP_ADD -#define DEFAULT_INPUT_BLEND_SRC_RGB GST_D3D11_COMPOSITOR_BLEND_SRC_ALPHA -#define DEFAULT_INPUT_BLEND_SRC_ALPHA GST_D3D11_COMPOSITOR_BLEND_ONE -#define DEFAULT_INPUT_BLEND_DEST_RGB GST_D3D11_COMPOSITOR_BLEND_INV_SRC_ALPHA -#define DEFAULT_INPUT_BLEND_DEST_ALPHA GST_D3D11_COMPOSITOR_BLEND_INV_SRC_ALPHA -#define DEFAULT_INPUT_SIZING_POLICY GST_D3D11_COMPOSITOR_SIZING_POLICY_NONE - -/** - * GstD3D11CompositorBinInput: - * - * Since: 1.20 - */ -struct _GstD3D11CompositorBinInput -{ - GstD3D11CompositorBinPad parent; -}; - -static void gst_d3d11_compositor_bin_input_set_property (GObject * object, - guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_d3d11_compositor_bin_input_get_property (GObject * object, - guint prop_id, GValue * value, GParamSpec * pspec); -static void -gst_d3d11_compositor_bin_input_set_target (GstD3D11CompositorBinPad * pad, - GstPad * target); - -#define gst_d3d11_compositor_bin_input_parent_class input_parent_class -G_DEFINE_TYPE (GstD3D11CompositorBinInput, gst_d3d11_compositor_bin_input, - GST_TYPE_D3D11_COMPOSITOR_BIN_PAD); - -static void -gst_d3d11_compositor_bin_input_class_init (GstD3D11CompositorBinInputClass * - klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstD3D11CompositorBinPadClass *pad_class = - GST_D3D11_COMPOSITOR_BIN_PAD_CLASS (klass); - - gobject_class->set_property = gst_d3d11_compositor_bin_input_set_property; - gobject_class->get_property = gst_d3d11_compositor_bin_input_get_property; - - /* GstVideoAggregatorPad */ - g_object_class_install_property (gobject_class, PROP_INPUT_ZORDER, - g_param_spec_uint ("zorder", "Z-Order", "Z Order of the picture", - 0, G_MAXUINT, DEFAULT_INPUT_ZORDER, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_INPUT_REPEAT_AFTER_EOS, - g_param_spec_boolean ("repeat-after-eos", "Repeat After EOS", - "Repeat the " "last frame after EOS until all pads are EOS", - DEFAULT_INPUT_REPEAT_AFTER_EOS, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, - PROP_INPUT_MAX_LAST_BUFFER_REPEAT, - g_param_spec_uint64 ("max-last-buffer-repeat", "Max Last Buffer Repeat", - "Repeat last buffer for time (in ns, -1=until EOS), " - "behaviour on EOS is not affected", 0, G_MAXUINT64, - DEFAULT_INPUT_MAX_LAST_BUFFER_REPEAT, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | - G_PARAM_STATIC_STRINGS))); - - /* GstD3D11CompositorPad */ - g_object_class_install_property (gobject_class, PROP_INPUT_XPOS, - g_param_spec_int ("xpos", "X Position", "X position of the picture", - G_MININT, G_MAXINT, DEFAULT_INPUT_XPOS, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_INPUT_YPOS, - g_param_spec_int ("ypos", "Y Position", "Y position of the picture", - G_MININT, G_MAXINT, DEFAULT_INPUT_YPOS, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_INPUT_WIDTH, - g_param_spec_int ("width", "Width", "Width of the picture", - G_MININT, G_MAXINT, DEFAULT_INPUT_WIDTH, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_INPUT_HEIGHT, - g_param_spec_int ("height", "Height", "Height of the picture", - G_MININT, G_MAXINT, DEFAULT_INPUT_HEIGHT, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_INPUT_ALPHA, - g_param_spec_double ("alpha", "Alpha", "Alpha of the picture", 0.0, 1.0, - DEFAULT_INPUT_ALPHA, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_INPUT_BLEND_OP_RGB, - g_param_spec_enum ("blend-op-rgb", "Blend Operation RGB", - "Blend equation for RGB", GST_TYPE_D3D11_COMPOSITOR_BLEND_OPERATION, - DEFAULT_INPUT_BLEND_OP_RGB, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_INPUT_BLEND_OP_ALPHA, - g_param_spec_enum ("blend-op-alpha", "Blend Operation Alpha", - "Blend equation for alpha", GST_TYPE_D3D11_COMPOSITOR_BLEND_OPERATION, - DEFAULT_INPUT_BLEND_OP_ALPHA, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, - PROP_INPUT_BLEND_SRC_RGB, - g_param_spec_enum ("blend-src-rgb", "Blend Source RGB", - "Blend factor for source RGB", - GST_TYPE_D3D11_COMPOSITOR_BLEND, - DEFAULT_INPUT_BLEND_SRC_RGB, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, - PROP_INPUT_BLEND_SRC_ALPHA, - g_param_spec_enum ("blend-src-alpha", - "Blend Source Alpha", - "Blend factor for source alpha, \"*-color\" values are not allowed", - GST_TYPE_D3D11_COMPOSITOR_BLEND, - DEFAULT_INPUT_BLEND_SRC_ALPHA, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, - PROP_INPUT_BLEND_DEST_RGB, - g_param_spec_enum ("blend-dest-rgb", - "Blend Destination RGB", - "Blend factor for destination RGB", - GST_TYPE_D3D11_COMPOSITOR_BLEND, - DEFAULT_INPUT_BLEND_DEST_RGB, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, - PROP_INPUT_BLEND_DEST_ALPHA, - g_param_spec_enum ("blend-dest-alpha", - "Blend Destination Alpha", - "Blend factor for destination alpha, " - "\"*-color\" values are not allowed", - GST_TYPE_D3D11_COMPOSITOR_BLEND, - DEFAULT_INPUT_BLEND_DEST_ALPHA, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_INPUT_BLEND_FACTOR_RED, - g_param_spec_float ("blend-factor-red", "Blend Factor Red", - "Blend factor for red component " - "when blend type is \"blend-factor\" or \"inv-blend-factor\"", - 0.0, 1.0, 1.0, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_INPUT_BLEND_FACTOR_GREEN, - g_param_spec_float ("blend-factor-green", "Blend Factor Green", - "Blend factor for green component " - "when blend type is \"blend-factor\" or \"inv-blend-factor\"", - 0.0, 1.0, 1.0, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_INPUT_BLEND_FACTOR_BLUE, - g_param_spec_float ("blend-factor-blue", "Blend Factor Blue", - "Blend factor for blue component " - "when blend type is \"blend-factor\" or \"inv-blend-factor\"", - 0.0, 1.0, 1.0, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_INPUT_BLEND_FACTOR_ALPHA, - g_param_spec_float ("blend-factor-alpha", "Blend Factor Alpha", - "Blend factor for alpha component " - "when blend type is \"blend-factor\" or \"inv-blend-factor\"", - 0.0, 1.0, 1.0, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_INPUT_SIZING_POLICY, - g_param_spec_enum ("sizing-policy", "Sizing policy", - "Sizing policy to use for image scaling", - GST_TYPE_D3D11_COMPOSITOR_SIZING_POLICY, DEFAULT_INPUT_SIZING_POLICY, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - pad_class->set_target = - GST_DEBUG_FUNCPTR (gst_d3d11_compositor_bin_input_set_target); -} - -static void -gst_d3d11_compositor_bin_input_init (GstD3D11CompositorBinInput * self) -{ -} - -static void -gst_d3d11_compositor_bin_input_set_property (GObject * object, - guint prop_id, const GValue * value, GParamSpec * pspec) -{ - GstD3D11CompositorBinPad *pad = GST_D3D11_COMPOSITOR_BIN_PAD (object); - - if (pad->target) - g_object_set_property (G_OBJECT (pad->target), pspec->name, value); -} - -static void -gst_d3d11_compositor_bin_input_get_property (GObject * object, - guint prop_id, GValue * value, GParamSpec * pspec) -{ - GstD3D11CompositorBinPad *pad = GST_D3D11_COMPOSITOR_BIN_PAD (object); - - if (pad->target) - g_object_get_property (G_OBJECT (pad->target), pspec->name, value); -} - -static void -gst_d3d11_compositor_bin_input_set_target (GstD3D11CompositorBinPad * pad, - GstPad * target) -{ - GST_D3D11_COMPOSITOR_BIN_PAD_CLASS (input_parent_class)->set_target (pad, - target); - -#define ADD_BINDING(obj,ref,prop) \ - gst_object_add_control_binding (GST_OBJECT (obj), \ - gst_proxy_control_binding_new (GST_OBJECT (obj), prop, \ - GST_OBJECT (ref), prop)); - /* GstVideoAggregatorPad */ - ADD_BINDING (target, pad, "zorder"); - ADD_BINDING (target, pad, "repeat-after-eos"); - /* GstD3D11CompositorPad */ - ADD_BINDING (target, pad, "xpos"); - ADD_BINDING (target, pad, "ypos"); - ADD_BINDING (target, pad, "width"); - ADD_BINDING (target, pad, "height"); - ADD_BINDING (target, pad, "alpha"); - ADD_BINDING (target, pad, "blend-op-rgb"); - ADD_BINDING (target, pad, "blend-op-alpha"); - ADD_BINDING (target, pad, "blend-src-rgb"); - ADD_BINDING (target, pad, "blend-src-alpha"); - ADD_BINDING (target, pad, "blend-dest-rgb"); - ADD_BINDING (target, pad, "blend-dest-alpha"); - ADD_BINDING (target, pad, "blend-factor-red"); - ADD_BINDING (target, pad, "blend-factor-green"); - ADD_BINDING (target, pad, "blend-factor-blue"); - ADD_BINDING (target, pad, "blend-factor-alpha"); - ADD_BINDING (target, pad, "sizing-policy"); -#undef ADD_BINDING -} - -/************************* - * GstD3D11CompositorBin * - *************************/ - -static GstStaticCaps sink_template_caps = - GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES - (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, GST_D3D11_SINK_FORMATS) ";" - GST_VIDEO_CAPS_MAKE (GST_D3D11_SINK_FORMATS)); - -static GstStaticCaps src_template_caps = - GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES - (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, GST_D3D11_SRC_FORMATS) ";" - GST_VIDEO_CAPS_MAKE (GST_D3D11_SRC_FORMATS)); - -enum -{ - PROP_0, - PROP_MIXER, - /* GstAggregator */ - PROP_LATENCY, - PROP_MIN_UPSTREAM_LATENCY, - PROP_START_TIME_SELECTION, - PROP_START_TIME, - PROP_EMIT_SIGNALS, - /* GstD3D11Compositor */ - PROP_ADAPTER, - PROP_BACKGROUND, - PROP_LAST -}; - -/* GstAggregator */ -#define DEFAULT_LATENCY 0 -#define DEFAULT_MIN_UPSTREAM_LATENCY 0 -#define DEFAULT_START_TIME_SELECTION GST_AGGREGATOR_START_TIME_SELECTION_ZERO -#define DEFAULT_START_TIME (-1) -#define DEFAULT_EMIT_SIGNALS FALSE - -/* GstD3D11Compositor */ -#define DEFAULT_ADAPTER -1 -#define DEFAULT_BACKGROUND GST_D3D11_COMPOSITOR_BACKGROUND_CHECKER - -typedef struct _GstD3D11CompositorBinChain -{ - /* without ref */ - GstD3D11CompositorBin *self; - GstD3D11CompositorBinPad *ghost_pad; - GstElement *upload; - GstElement *convert; - - gulong probe_id; -} GstD3D11CompositorBinChain; - -struct _GstD3D11CompositorBin -{ - GstBin parent; - - GstElement *compositor; - - GList *input_chains; - gboolean running; - - gint adapter; -}; - -static void gst_d3d11_compositor_bin_child_proxy_init (gpointer g_iface, - gpointer iface_data); -static void gst_d3d11_compositor_bin_dispose (GObject * object); -static void gst_d3d11_compositor_bin_set_property (GObject * object, - guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_d3d11_compositor_bin_get_property (GObject * object, - guint prop_id, GValue * value, GParamSpec * pspec); - -static GstStateChangeReturn -gst_d3d11_compositor_bin_change_state (GstElement * element, - GstStateChange transition); -static GstPad *gst_d3d11_compositor_bin_request_new_pad (GstElement * element, - GstPadTemplate * templ, const gchar * name, const GstCaps * caps); -static void gst_d3d11_compositor_bin_release_pad (GstElement * element, - GstPad * pad); - -#define gst_d3d11_compositor_bin_parent_class parent_class -G_DEFINE_TYPE_WITH_CODE (GstD3D11CompositorBin, gst_d3d11_compositor_bin, - GST_TYPE_BIN, G_IMPLEMENT_INTERFACE (GST_TYPE_CHILD_PROXY, - gst_d3d11_compositor_bin_child_proxy_init)); - -static void -gst_d3d11_compositor_bin_class_init (GstD3D11CompositorBinClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstCaps *caps; - - gobject_class->dispose = gst_d3d11_compositor_bin_dispose; - gobject_class->set_property = gst_d3d11_compositor_bin_set_property; - gobject_class->get_property = gst_d3d11_compositor_bin_get_property; - - element_class->change_state = - GST_DEBUG_FUNCPTR (gst_d3d11_compositor_bin_change_state); - element_class->request_new_pad = - GST_DEBUG_FUNCPTR (gst_d3d11_compositor_bin_request_new_pad); - element_class->release_pad = - GST_DEBUG_FUNCPTR (gst_d3d11_compositor_bin_release_pad); - - gst_element_class_set_static_metadata (element_class, - "Direct3D11 Compositor Bin", - "Filter/Editor/Video/Compositor", - "A Direct3D11 compositor bin", "Seungha Yang <seungha@centricular.com>"); - - caps = gst_d3d11_get_updated_template_caps (&sink_template_caps); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new_with_gtype ("sink_%u", GST_PAD_SINK, GST_PAD_REQUEST, - caps, GST_TYPE_D3D11_COMPOSITOR_BIN_INPUT)); - gst_caps_unref (caps); - - caps = gst_d3d11_get_updated_template_caps (&src_template_caps); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new_with_gtype ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - caps, GST_TYPE_D3D11_COMPOSITOR_BIN_PAD)); - gst_caps_unref (caps); - - g_object_class_install_property (gobject_class, PROP_MIXER, - g_param_spec_object ("mixer", "D3D11 mixer element", - "The d3d11 mixer chain to use", - GST_TYPE_ELEMENT, - (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); - - /*GstAggregator */ - g_object_class_install_property (gobject_class, PROP_LATENCY, - g_param_spec_uint64 ("latency", "Buffer latency", - "Additional latency in live mode to allow upstream " - "to take longer to produce buffers for the current " - "position (in nanoseconds)", 0, G_MAXUINT64, - DEFAULT_LATENCY, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_MIN_UPSTREAM_LATENCY, - g_param_spec_uint64 ("min-upstream-latency", "Buffer latency", - "When sources with a higher latency are expected to be plugged " - "in dynamically after the aggregator has started playing, " - "this allows overriding the minimum latency reported by the " - "initial source(s). This is only taken into account when larger " - "than the actually reported minimum latency. (nanoseconds)", - 0, G_MAXUINT64, - DEFAULT_LATENCY, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_START_TIME_SELECTION, - g_param_spec_enum ("start-time-selection", "Start Time Selection", - "Decides which start time is output", - gst_aggregator_start_time_selection_get_type (), - DEFAULT_START_TIME_SELECTION, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_START_TIME, - g_param_spec_uint64 ("start-time", "Start Time", - "Start time to use if start-time-selection=set", 0, - G_MAXUINT64, - DEFAULT_START_TIME, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_EMIT_SIGNALS, - g_param_spec_boolean ("emit-signals", "Emit signals", - "Send signals", DEFAULT_EMIT_SIGNALS, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); - - /* GstD3D11Compositor */ - g_object_class_install_property (gobject_class, PROP_ADAPTER, - g_param_spec_int ("adapter", "Adapter", - "Adapter index for creating device (-1 for default)", - -1, G_MAXINT32, DEFAULT_ADAPTER, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_BACKGROUND, - g_param_spec_enum ("background", "Background", "Background type", - GST_TYPE_D3D11_COMPOSITOR_BACKGROUND, - DEFAULT_BACKGROUND, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); - - gst_type_mark_as_plugin_api (GST_TYPE_D3D11_COMPOSITOR_BIN_PAD, - (GstPluginAPIFlags) 0); - gst_type_mark_as_plugin_api (GST_TYPE_D3D11_COMPOSITOR_BIN_INPUT, - (GstPluginAPIFlags) 0); -} - -static void -gst_d3d11_compositor_bin_init (GstD3D11CompositorBin * self) -{ - GstPad *pad; - GstPad *gpad; - GstElement *out_convert, *download; - - self->compositor = gst_element_factory_make ("d3d11compositorelement", NULL); - out_convert = gst_element_factory_make ("d3d11colorconvert", NULL); - download = gst_element_factory_make ("d3d11download", NULL); - - gst_bin_add_many (GST_BIN (self), - self->compositor, out_convert, download, NULL); - gst_element_link_many (self->compositor, out_convert, download, NULL); - - gpad = (GstPad *) g_object_new (GST_TYPE_D3D11_COMPOSITOR_BIN_PAD, - "name", "src", "direction", GST_PAD_SRC, NULL); - pad = gst_element_get_static_pad (self->compositor, "src"); - /* GstD3D11CompositorBinPad will hold reference of this compositor srcpad */ - gst_d3d11_compositor_bin_pad_set_target ((GstD3D11CompositorBinPad *) gpad, - pad); - - pad = gst_element_get_static_pad (download, "src"); - gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (gpad), pad); - gst_object_unref (pad); - - gst_element_add_pad (GST_ELEMENT_CAST (self), gpad); -} - -static void -gst_d3d11_compositor_bin_dispose (GObject * object) -{ - GstD3D11CompositorBin *self = GST_D3D11_COMPOSITOR_BIN (object); - GList *iter; - - for (iter = self->input_chains; iter; iter = g_list_next (iter)) { - GstD3D11CompositorBinChain *chain = - (GstD3D11CompositorBinChain *) iter->data; - - if (self->compositor && chain->ghost_pad && chain->ghost_pad->target) { - gst_element_release_request_pad (GST_ELEMENT_CAST (self->compositor), - chain->ghost_pad->target); - gst_d3d11_compositor_bin_pad_unset_target (chain->ghost_pad); - } - } - - if (self->input_chains) - g_list_free_full (self->input_chains, (GDestroyNotify) g_free); - self->input_chains = NULL; - - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -static void -gst_d3d11_compositor_bin_set_property (GObject * object, - guint prop_id, const GValue * value, GParamSpec * pspec) -{ - GstD3D11CompositorBin *self = GST_D3D11_COMPOSITOR_BIN (object); - - switch (prop_id) { - case PROP_ADAPTER: - self->adapter = g_value_get_int (value); - /* fallthrough */ - default: - g_object_set_property (G_OBJECT (self->compositor), pspec->name, value); - break; - } -} - -static void -gst_d3d11_compositor_bin_get_property (GObject * object, - guint prop_id, GValue * value, GParamSpec * pspec) -{ - GstD3D11CompositorBin *self = GST_D3D11_COMPOSITOR_BIN (object); - - switch (prop_id) { - case PROP_MIXER: - g_value_set_object (value, self->compositor); - break; - case PROP_ADAPTER: - g_value_set_int (value, self->adapter); - break; - default: - g_object_get_property (G_OBJECT (self->compositor), pspec->name, value); - break; - } -} - -static GstStateChangeReturn -gst_d3d11_compositor_bin_change_state (GstElement * element, - GstStateChange transition) -{ - GstD3D11CompositorBin *self = GST_D3D11_COMPOSITOR_BIN (element); - GstStateChangeReturn ret; - - switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY: - GST_OBJECT_LOCK (element); - self->running = TRUE; - GST_OBJECT_UNLOCK (element); - break; - default: - break; - } - - ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - if (ret == GST_STATE_CHANGE_FAILURE) - return ret; - - switch (transition) { - case GST_STATE_CHANGE_READY_TO_NULL: - GST_OBJECT_LOCK (self); - self->running = FALSE; - GST_OBJECT_UNLOCK (self); - default: - break; - } - - return ret; -} - -static GstD3D11CompositorBinChain * -gst_d3d11_compositor_bin_input_chain_new (GstD3D11CompositorBin * self, - GstPad * compositor_pad) -{ - GstD3D11CompositorBinChain *chain; - GstPad *pad; - - chain = g_new0 (GstD3D11CompositorBinChain, 1); - - chain->self = self; - - chain->upload = gst_element_factory_make ("d3d11upload", NULL); - chain->convert = gst_element_factory_make ("d3d11colorconvert", NULL); - - /* 1. Create child elements and like */ - gst_bin_add_many (GST_BIN (self), chain->upload, chain->convert, NULL); - - gst_element_link (chain->upload, chain->convert); - pad = gst_element_get_static_pad (chain->convert, "src"); - gst_pad_link (pad, compositor_pad); - gst_object_unref (pad); - - chain->ghost_pad = (GstD3D11CompositorBinPad *) - g_object_new (GST_TYPE_D3D11_COMPOSITOR_BIN_INPUT, "name", - GST_OBJECT_NAME (compositor_pad), "direction", GST_PAD_SINK, NULL); - - /* transfer ownership of compositor pad */ - gst_d3d11_compositor_bin_pad_set_target (chain->ghost_pad, compositor_pad); - - pad = gst_element_get_static_pad (chain->upload, "sink"); - gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (chain->ghost_pad), pad); - gst_object_unref (pad); - - GST_OBJECT_LOCK (self); - if (self->running) - gst_pad_set_active (GST_PAD (chain->ghost_pad), TRUE); - GST_OBJECT_UNLOCK (self); - - gst_element_add_pad (GST_ELEMENT_CAST (self), - GST_PAD_CAST (chain->ghost_pad)); - - gst_element_sync_state_with_parent (chain->upload); - gst_element_sync_state_with_parent (chain->convert); - - return chain; -} - -static void -gst_d3d11_compositor_bin_input_chain_free (GstD3D11CompositorBinChain * chain) -{ - if (!chain) - return; - - if (chain->ghost_pad && chain->probe_id) { - gst_pad_remove_probe (GST_PAD_CAST (chain->ghost_pad), chain->probe_id); - chain->probe_id = 0; - } - - if (chain->upload) { - gst_element_set_state (chain->upload, GST_STATE_NULL); - gst_bin_remove (GST_BIN_CAST (chain->self), chain->upload); - } - - if (chain->convert) { - gst_element_set_state (chain->convert, GST_STATE_NULL); - gst_bin_remove (GST_BIN_CAST (chain->self), chain->convert); - } - - if (chain->ghost_pad && chain->ghost_pad->target) { - gst_element_release_request_pad (chain->self->compositor, - chain->ghost_pad->target); - gst_d3d11_compositor_bin_pad_unset_target (chain->ghost_pad); - } - - g_free (chain); -} - -static GstPad * -gst_d3d11_compositor_bin_request_new_pad (GstElement * element, - GstPadTemplate * templ, const gchar * name, const GstCaps * caps) -{ - GstD3D11CompositorBin *self = GST_D3D11_COMPOSITOR_BIN (element); - GstElementClass *compositor_class = GST_ELEMENT_GET_CLASS (self->compositor); - GstPad *compositor_pad; - GstD3D11CompositorBinChain *chain; - GstPadTemplate *compositor_templ = NULL; - GList *templ_list; - GList *iter; - - templ_list = gst_element_class_get_pad_template_list (compositor_class); - for (iter = templ_list; iter; iter = g_list_next (iter)) { - GstPadTemplate *t = (GstPadTemplate *) iter->data; - if (GST_PAD_TEMPLATE_DIRECTION (t) != GST_PAD_SINK || - GST_PAD_TEMPLATE_PRESENCE (t) != GST_PAD_REQUEST) - continue; - - compositor_templ = t; - break; - } - - g_assert (compositor_templ); - - compositor_pad = - gst_element_request_pad (self->compositor, compositor_templ, name, caps); - if (!compositor_pad) { - GST_WARNING_OBJECT (self, "Failed to request pad"); - return NULL; - } - - chain = gst_d3d11_compositor_bin_input_chain_new (self, compositor_pad); - g_assert (chain); - - GST_OBJECT_LOCK (self); - self->input_chains = g_list_append (self->input_chains, chain); - GST_OBJECT_UNLOCK (self); - - gst_child_proxy_child_added (GST_CHILD_PROXY (self), - G_OBJECT (chain->ghost_pad), GST_OBJECT_NAME (chain->ghost_pad)); - - GST_DEBUG_OBJECT (element, "Created new pad %s:%s", - GST_DEBUG_PAD_NAME (chain->ghost_pad)); - - return GST_PAD_CAST (chain->ghost_pad); -} - -static void -gst_d3d11_compositor_bin_release_pad (GstElement * element, GstPad * pad) -{ - GstD3D11CompositorBin *self = GST_D3D11_COMPOSITOR_BIN (element); - GList *iter; - gboolean found = FALSE; - - GST_DEBUG_OBJECT (self, "Releasing pad %s:%s", GST_DEBUG_PAD_NAME (pad)); - - GST_OBJECT_LOCK (self); - for (iter = self->input_chains; iter; iter = g_list_next (iter)) { - GstD3D11CompositorBinChain *chain = - (GstD3D11CompositorBinChain *) iter->data; - - if (pad == GST_PAD_CAST (chain->ghost_pad)) { - self->input_chains = g_list_delete_link (self->input_chains, iter); - GST_OBJECT_UNLOCK (self); - - gst_d3d11_compositor_bin_input_chain_free (chain); - found = TRUE; - break; - } - } - - if (!found) { - GST_OBJECT_UNLOCK (self); - GST_WARNING_OBJECT (self, "Unknown pad to release %s:%s", - GST_DEBUG_PAD_NAME (pad)); - } - - gst_element_remove_pad (element, pad); -} - -static GObject * -gst_d3d11_compositor_bin_child_proxy_get_child_by_index (GstChildProxy * proxy, - guint index) -{ - GstD3D11CompositorBin *self = GST_D3D11_COMPOSITOR_BIN (proxy); - GstBin *bin = GST_BIN_CAST (proxy); - GObject *res = NULL; - - GST_OBJECT_LOCK (self); - /* XXX: not exactly thread safe with ordering */ - if (index < (guint) bin->numchildren) { - if ((res = (GObject *) g_list_nth_data (bin->children, index))) - gst_object_ref (res); - } else { - GstD3D11CompositorBinChain *chain; - if ((chain = - (GstD3D11CompositorBinChain *) g_list_nth_data (self->input_chains, - index - bin->numchildren))) { - res = (GObject *) gst_object_ref (chain->ghost_pad); - } - } - GST_OBJECT_UNLOCK (self); - - return res; -} - -static guint -gst_d3d11_compositor_bin_child_proxy_get_children_count (GstChildProxy * proxy) -{ - GstD3D11CompositorBin *self = GST_D3D11_COMPOSITOR_BIN (proxy); - guint count = 0; - - GST_OBJECT_LOCK (self); - count = GST_BIN_CAST (self)->numchildren + g_list_length (self->input_chains); - GST_OBJECT_UNLOCK (self); - GST_INFO_OBJECT (self, "Children Count: %d", count); - - return count; -} - -static void -gst_d3d11_compositor_bin_child_proxy_init (gpointer g_iface, - gpointer iface_data) -{ - GstChildProxyInterface *iface = (GstChildProxyInterface *) g_iface; - - iface->get_child_by_index = - gst_d3d11_compositor_bin_child_proxy_get_child_by_index; - iface->get_children_count = - gst_d3d11_compositor_bin_child_proxy_get_children_count; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11compositorbin.h
Deleted
@@ -1,66 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_D3D11_COMPOSITOR_BIN_H__ -#define __GST_D3D11_COMPOSITOR_BIN_H__ - -#include <gst/gst.h> -#include <gst/video/video.h> -#include <gst/video/gstvideoaggregator.h> -#include <gst/d3d11/gstd3d11.h> - -G_BEGIN_DECLS - -#define GST_TYPE_D3D11_COMPOSITOR_BIN_PAD (gst_d3d11_compositor_bin_pad_get_type()) -#define GST_D3D11_COMPOSITOR_BIN_PAD(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_D3D11_COMPOSITOR_BIN_PAD, GstD3D11CompositorBinPad)) -#define GST_D3D11_COMPOSITOR_BIN_PAD_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_D3D11_COMPOSITOR_BIN_PAD, GstD3D11CompositorBinPadClass)) -#define GST_IS_D3D11_COMPOSITOR_BIN_PAD(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_D3D11_COMPOSITOR_BIN_PAD)) -#define GST_IS_D3D11_COMPOSITOR_BIN_PAD_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_D3D11_COMPOSITOR_BIN_PAD)) -#define GST_D3D11_COMPOSITOR_BIN_PAD_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_D3D11_COMPOSITOR_BIN_PAD,GstD3D11CompositorBinPadClass)) - -typedef struct _GstD3D11CompositorBinPad GstD3D11CompositorBinPad; -typedef struct _GstD3D11CompositorBinPadClass GstD3D11CompositorBinPadClass; - -struct _GstD3D11CompositorBinPadClass -{ - GstGhostPadClass parent_class; - - void (*set_target) (GstD3D11CompositorBinPad * pad, GstPad * target); -}; - -GType gst_d3d11_compositor_bin_pad_get_type (void); -G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstD3D11CompositorBinPad, gst_object_unref) - -#define GST_TYPE_D3D11_COMPOSITOR_BIN_INPUT (gst_d3d11_compositor_bin_input_get_type()) -G_DECLARE_FINAL_TYPE (GstD3D11CompositorBinInput, gst_d3d11_compositor_bin_input, - GST, D3D11_COMPOSITOR_BIN_INPUT, GstD3D11CompositorBinPad); - -#define GST_TYPE_D3D11_COMPOSITOR_BIN (gst_d3d11_compositor_bin_get_type()) -G_DECLARE_FINAL_TYPE (GstD3D11CompositorBin, gst_d3d11_compositor_bin, - GST, D3D11_COMPOSITOR_BIN, GstBin) - -G_END_DECLS - -#endif /* __GST_D3D11_COMPOSITOR_BIN_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11converter.cpp
Deleted
@@ -1,2301 +0,0 @@ -/* GStreamer - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * Copyright (C) <2019> Jeongki Kim <jeongki.kim@jeongki.kim> - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include "gstd3d11converter.h" -#include "gstd3d11shader.h" -#include "gstd3d11pluginutils.h" -#include <wrl.h> -#include <string.h> - -GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_converter_debug); -#define GST_CAT_DEFAULT gst_d3d11_converter_debug - -/* *INDENT-OFF* */ -using namespace Microsoft::WRL; -/* *INDENT-ON* */ - -#define CONVERTER_MAX_QUADS 2 - -/* *INDENT-OFF* */ -typedef struct -{ - FLOAT trans_matrix12; - FLOAT padding4; -} PixelShaderColorTransform; - -typedef struct -{ - FLOAT alpha_mul; - FLOAT padding3; -} AlphaConstBuffer; - -typedef struct -{ - struct { - FLOAT x; - FLOAT y; - FLOAT z; - } position; - struct { - FLOAT x; - FLOAT y; - } texture; -} VertexData; - -typedef struct -{ - gboolean has_transform; - gboolean has_alpha; - const gchar *func; -} PixelShaderTemplate; - -static const gchar templ_color_transform_const_buffer = - "cbuffer PixelShaderColorTransform : register(b%u)\n" - "{\n" - " float3x4 trans_matrix;\n" - " float3 padding;\n" - "};"; - -static const gchar templ_alpha_const_buffer = - "cbuffer AlphaConstBuffer : register(b%u)\n" - "{\n" - " float alpha_mul;\n" - " float3 padding;\n" - "};"; - -#define HLSL_FUNC_YUV_TO_RGB \ - "float3 yuv_to_rgb (float3 yuv)\n" \ - "{\n" \ - " yuv += float3(-0.062745f, -0.501960f, -0.501960f);\n" \ - " yuv = mul(yuv, trans_matrix);\n" \ - " return saturate(yuv);\n" \ - "}\n" - -#define HLSL_FUNC_RGB_TO_YUV \ - "float3 rgb_to_yuv (float3 rgb)\n" \ - "{\n" \ - " float3 yuv;\n" \ - " yuv = mul(rgb, trans_matrix);\n" \ - " yuv += float3(0.062745f, 0.501960f, 0.501960f);\n" \ - " return saturate(yuv);\n" \ - "}\n" - -#define HLSL_PS_OUTPUT_ONE_PLANE_BODY \ - " float4 Plane_0: SV_TARGET0;" - -#define HLSL_PS_OUTPUT_TWO_PLANES_BODY \ - " float4 Plane_0: SV_TARGET0;\n" \ - " float4 Plane_1: SV_TARGET1;" - -static const PixelShaderTemplate templ_REORDER = - { FALSE, TRUE, NULL }; - -static const PixelShaderTemplate templ_REORDER_NO_ALPHA = - { FALSE, FALSE, NULL }; - -static const PixelShaderTemplate templ_YUV_to_RGB = - { TRUE, FALSE, HLSL_FUNC_YUV_TO_RGB }; - -static const PixelShaderTemplate templ_RGB_to_YUV = - { TRUE, FALSE, HLSL_FUNC_RGB_TO_YUV }; - -static const gchar templ_REORDER_BODY = - " float4 xyza;\n" - " xyza.xyz = shaderTexture0.Sample(samplerState, input.Texture).xyz;\n" - " xyza.a = shaderTexture0.Sample(samplerState, input.Texture).a * alpha_mul;\n" - " output.Plane_0 = xyza;\n"; - -static const gchar templ_VUYA_to_RGB_BODY = - " float4 sample, rgba;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).z;\n" - " sample.y = shaderTexture0.Sample(samplerState, input.Texture).y;\n" - " sample.z = shaderTexture0.Sample(samplerState, input.Texture).x;\n" - " sample.a = shaderTexture0.Sample(samplerState, input.Texture).a;\n" - " rgba.rgb = yuv_to_rgb (sample.xyz);\n" - " rgba.a = sample.a;\n" - " output.Plane_0 = rgba;\n"; - -static const gchar templ_RGB_to_VUYA_BODY = - " float4 sample, vuya;\n" - " sample = shaderTexture0.Sample(samplerState, input.Texture);\n" - " vuya.zyx = rgb_to_yuv (sample.rgb);\n" - " vuya.a = sample.a;\n" - " output.Plane_0 = vuya;\n"; - -static const gchar templ_PACKED_YUV_to_RGB_BODY = - " float4 sample, rgba;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).%c;\n" - " sample.y = shaderTexture0.Sample(samplerState, input.Texture).%c;\n" - " sample.z = shaderTexture0.Sample(samplerState, input.Texture).%c;\n" - " rgba.rgb = yuv_to_rgb (sample.xyz);\n" - " rgba.a = 1;\n" - " output.Plane_0 = rgba;\n"; - -/* YUV to RGB conversion */ -static const gchar templ_PLANAR_YUV_to_RGB_BODY = - " float4 sample, rgba;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).x * %u;\n" - " sample.%c = shaderTexture1.Sample(samplerState, input.Texture).x * %u;\n" - " sample.%c = shaderTexture2.Sample(samplerState, input.Texture).x * %u;\n" - " rgba.rgb = yuv_to_rgb (sample.xyz);\n" - " rgba.a = 1.0;\n" - " output.Plane_0 = rgba;\n"; - -static const gchar templ_SEMI_PLANAR_to_RGB_BODY = - " float4 sample, rgba;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).x;\n" - " sample.yz = shaderTexture1.Sample(samplerState, input.Texture).%c%c;\n" - " rgba.rgb = yuv_to_rgb (sample.xyz);\n" - " rgba.a = 1.0;\n" - " output.Plane_0 = rgba;\n"; - -/* RGB to YUV conversion */ -static const gchar templ_RGB_to_LUMA_BODY = - " float4 sample, rgba;\n" - " rgba.rgb = shaderTexture0.Sample(samplerState, input.Texture).rgb;\n" - " sample.xyz = rgb_to_yuv (rgba.rgb);\n" - " sample.y = 0.0;\n" - " sample.z = 0.0;\n" - " sample.a = 0.0;\n" - " sample.x = sample.x / %d;\n" - " output.Plane_0 = sample;\n"; - -static const gchar templ_RGB_to_SEMI_PLANAR_CHROMA_BODY = - " float4 sample, rgba;\n" - " rgba.rgb = shaderTexture0.Sample(samplerState, input.Texture).rgb;\n" - " sample.xyz = rgb_to_yuv (rgba.rgb);\n" - " sample.%c = sample.y;\n" - " sample.%c = sample.z;\n" - " sample.z = 0.0;\n" - " sample.a = 0.0;\n" - " output.Plane_0 = sample;\n"; - -static const gchar templ_RGB_to_PLANAR_CHROMA_BODY = - " float4 sample, rgba;\n" - " rgba.rgb = shaderTexture0.Sample(samplerState, input.Texture).rgb;\n" - " sample.xyz = rgb_to_yuv (rgba.rgb);\n" - " output.Plane_0 = float4(sample.%c / %u, 0.0, 0.0, 0.0);\n" - " output.Plane_1 = float4(sample.%c / %u, 0.0, 0.0, 0.0);\n"; - -/* YUV to YUV conversion */ -static const gchar templ_LUMA_to_LUMA_BODY = - " float4 sample;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).x * %u;\n" - " output.Plane_0 = float4(sample.x / %u, 0.0, 0.0, 0.0);\n"; - -static const gchar templ_PLANAR_TO_SEMI_PLANAR_CHROMA_BODY = - " float4 in_sample;\n" - " float4 out_sample;\n" - " in_sample.%c = shaderTexture1.Sample(samplerState, input.Texture).x * %u;\n" - " in_sample.%c = shaderTexture2.Sample(samplerState, input.Texture).x * %u;\n" - " out_sample.xy = in_sample.yz;\n" - " output.Plane_0 = float4(out_sample.%c%c, 0.0, 0.0);\n"; - -static const gchar templ_SEMI_PLANAR_TO_PLANAR_CHROMA_BODY = - " float4 sample;\n" - " sample.yz = shaderTexture1.Sample(samplerState, input.Texture).%c%c;\n" - " output.Plane_0 = float4(sample.%c / %d, 0.0, 0.0, 0.0);\n" - " output.Plane_1 = float4(sample.%c / %d, 0.0, 0.0, 0.0);\n"; - -static const gchar templ_SEMI_PLANAR_TO_SEMI_PLANAR_CHROMA_BODY = - " float4 sample;\n" - " sample.xy = shaderTexture1.Sample(samplerState, input.Texture).%c%c;\n" - " output.Plane_0 = float4(sample.%c%c, 0.0, 0.0);\n"; - -static const gchar templ_PLANAR_TO_PLANAR_CHROMA_BODY = - " float4 sample;\n" - " sample.%c = shaderTexture1.Sample(samplerState, input.Texture).x * %u;\n" - " sample.%c = shaderTexture2.Sample(samplerState, input.Texture).x * %u;\n" - " output.Plane_0 = float4(sample.%c / %u, 0.0, 0.0, 0.0);\n" - " output.Plane_1 = float4(sample.%c / %u, 0.0, 0.0, 0.0);\n"; - -/* VUYA to YUV */ -static const gchar templ_VUYA_to_LUMA_BODY = - " float4 sample;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).z;\n" - " output.Plane_0 = float4(sample.x / %u, 0.0, 0.0, 0.0);\n"; - -static const gchar templ_VUYA_TO_PLANAR_CHROMA_BODY = - " float4 sample;\n" - " sample.yz = shaderTexture0.Sample(samplerState, input.Texture).yx;\n" - " output.Plane_0 = float4(sample.%c / %d, 0.0, 0.0, 0.0);\n" - " output.Plane_1 = float4(sample.%c / %d, 0.0, 0.0, 0.0);\n"; - -static const gchar templ_VUYA_TO_SEMI_PLANAR_CHROMA_BODY = - " float2 sample;\n" - " sample.xy = shaderTexture0.Sample(samplerState, input.Texture).%c%c;\n" - " output.Plane_0 = float4(sample.xy, 0.0, 0.0);\n"; - -/* YUV to VUYA */ -static const gchar templ_PLANAR_to_VUYA_BODY = - " float4 sample;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).x * %u;\n" - " sample.%c = shaderTexture1.Sample(samplerState, input.Texture).x * %u;\n" - " sample.%c = shaderTexture2.Sample(samplerState, input.Texture).x * %u;\n" - " output.Plane_0 = float4(sample.zyx, 1.0f);\n"; - -static const gchar templ_SEMI_PLANAR_to_VUYA_BODY = - " float4 sample;\n" - " sample.z = shaderTexture0.Sample(samplerState, input.Texture).x;\n" - " sample.xy = shaderTexture1.Sample(samplerState, input.Texture).%c%c;\n" - " output.Plane_0 = float4(sample.xyz, 1.0f);\n"; - -static const gchar templ_PACKED_YUV_to_VUYA_BODY = - " float4 sample;\n" - " sample.z = shaderTexture0.Sample(samplerState, input.Texture).%c;\n" - " sample.y = shaderTexture0.Sample(samplerState, input.Texture).%c;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).%c;\n" - " output.Plane_0 = float4(sample.xyz, 1.0f);\n"; - -/* packed YUV to (semi) planar YUV */ -static const gchar templ_PACKED_YUV_to_LUMA_BODY = - " float4 sample;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).%c;\n" - " output.Plane_0 = float4(sample.x / %u, 0.0, 0.0, 0.0);\n"; - -static const gchar templ_PACKED_YUV_TO_PLANAR_CHROMA_BODY = - " float4 sample;\n" - " sample.y = shaderTexture0.Sample(samplerState, input.Texture).%c;\n" - " sample.z = shaderTexture0.Sample(samplerState, input.Texture).%c;\n" - " output.Plane_0 = float4(sample.%c / %u, 0.0, 0.0, 0.0);\n" - " output.Plane_1 = float4(sample.%c / %u, 0.0, 0.0, 0.0);\n"; - -static const gchar templ_PACKED_YUV_TO_SEMI_PLANAR_CHROMA_BODY = - " float4 sample;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).%c;\n" - " sample.y = shaderTexture0.Sample(samplerState, input.Texture).%c;\n" - " output.Plane_0 = float4(sample.%c%c, 0.0, 0.0);\n"; - -/* to GRAY */ -static const gchar templ_RGB_to_GRAY_BODY = - " float4 sample, rgba;\n" - " rgba.rgb = shaderTexture0.Sample(samplerState, input.Texture).rgb;\n" - " sample.x = rgb_to_yuv (rgba.rgb).x;\n" - " sample.y = 0.0;\n" - " sample.z = 0.0;\n" - " sample.a = 0.0;\n" - " output.Plane_0 = sample;\n"; - -static const gchar templ_VUYA_to_GRAY_BODY = - " float4 sample;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).z;\n" - " sample.y = 0.0;\n" - " sample.z = 0.0;\n" - " sample.a = 0.0;\n" - " output.Plane_0 = sample;\n"; - -static const gchar templ_YUV_to_GRAY_BODY = - " float4 sample;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).x * %u;\n" - " sample.y = 0.0;\n" - " sample.z = 0.0;\n" - " sample.a = 0.0;\n" - " output.Plane_0 = sample;\n"; - -static const gchar templ_PACKED_YUV_TO_GRAY = - " float4 sample;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).%c;\n" - " sample.y = 0.0;\n" - " sample.z = 0.0;\n" - " sample.a = 0.0;\n" - " output.Plane_0 = sample;\n"; - -static const gchar templ_GRAY_to_GRAY_BODY = - " float4 sample;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).x;\n" - " sample.y = 0.0;\n" - " sample.z = 0.0;\n" - " sample.a = 0.0;\n" - " output.Plane_0 = sample;\n"; - -/* from GRAY */ -static const gchar templ_GRAY_to_RGB_BODY = - " float4 sample, rgba;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).x;\n" - " sample.y = sample.x;\n" - " sample.z = sample.x;\n" - " sample.a = 1.0;\n" - " output.Plane_0 = sample;\n"; - -static const gchar templ_GRAY_to_VUYA_BODY = - " float4 sample;\n" - " sample.z = shaderTexture0.Sample(samplerState, input.Texture).x;\n" - " sample.x = 0.5;\n" - " sample.y = 0.5;\n" - " sample.a = 1.0;\n" - " output.Plane_0 = sample;\n"; - -static const gchar templ_GRAY_to_LUMA_BODY = - " float4 sample;\n" - " sample.x = shaderTexture0.Sample(samplerState, input.Texture).x / %u;\n" - " sample.y = 0.0;\n" - " sample.z = 0.0;\n" - " sample.a = 0.0;\n" - " output.Plane_0 = sample;\n"; - -static const gchar templ_GRAY_to_PLANAR_CHROMA_BODY = - " float val = 0.5 / %u;\n" - " output.Plane_0 = float4(val, 0.0, 0.0, 0.0);\n" - " output.Plane_1 = float4(val, 0.0, 0.0, 0.0);\n"; - -static const gchar templ_GRAY_to_SEMI_PLANAR_CHROMA_BODY = - " output.Plane_0 = float4(0.5, 0.5, 0.0, 0.0);\n"; - -static const gchar templ_pixel_shader = - /* constant buffer */ - "%s\n" - "%s\n" - "Texture2D shaderTexture4;\n" - "SamplerState samplerState;\n" - "\n" - "struct PS_INPUT\n" - "{\n" - " float4 Position: SV_POSITION;\n" - " float3 Texture: TEXCOORD0;\n" - "};\n" - "\n" - "struct PS_OUTPUT\n" - "{\n" - " %s\n" - "};\n" - "\n" - /* rgb <-> yuv function */ - "%s\n" - "PS_OUTPUT main(PS_INPUT input)\n" - "{\n" - " PS_OUTPUT output;\n" - "%s" - " return output;\n" - "}\n"; - -static const gchar templ_vertex_shader = - "struct VS_INPUT\n" - "{\n" - " float4 Position : POSITION;\n" - " float4 Texture : TEXCOORD0;\n" - "};\n" - "\n" - "struct VS_OUTPUT\n" - "{\n" - " float4 Position: SV_POSITION;\n" - " float4 Texture: TEXCOORD0;\n" - "};\n" - "\n" - "VS_OUTPUT main(VS_INPUT input)\n" - "{\n" - " return input;\n" - "}\n"; - -/* *INDENT-ON* */ - -typedef struct -{ - const PixelShaderTemplate *templ; - gchar *ps_bodyCONVERTER_MAX_QUADS; - const gchar *ps_outputCONVERTER_MAX_QUADS; - PixelShaderColorTransform transform; -} ConvertInfo; - -struct _GstD3D11Converter -{ - GstD3D11Device *device; - GstVideoInfo in_info; - GstVideoInfo out_info; - gdouble alpha; - - const GstD3D11Format *in_d3d11_format; - const GstD3D11Format *out_d3d11_format; - - guint num_input_view; - guint num_output_view; - - GstD3D11Quad *quadCONVERTER_MAX_QUADS; - - D3D11_VIEWPORT viewportGST_VIDEO_MAX_PLANES; - - RECT src_rect; - RECT dest_rect; - gint input_texture_width; - gint input_texture_height; - ID3D11Buffer *vertex_buffer; - ID3D11Buffer *alpha_const_buffer; - gboolean update_vertex; - gboolean update_alpha; - - ID3D11SamplerState *linear_sampler; - - ConvertInfo convert_info; - - GstStructure *config; -}; - -static gdouble -get_opt_double (GstD3D11Converter * self, const gchar * opt, gdouble def) -{ - gdouble res; - if (!gst_structure_get_double (self->config, opt, &res)) - res = def; - - return res; -} - -#define DEFAULT_OPT_ALPHA_VALUE 1.0 - -#define GET_OPT_ALPHA_VALUE(c) get_opt_double(c, \ - GST_D3D11_CONVERTER_OPT_ALPHA_VALUE, DEFAULT_OPT_ALPHA_VALUE); - -/* from video-converter.c */ -typedef struct -{ - gfloat dm44; -} MatrixData; - -static void -color_matrix_set_identity (MatrixData * m) -{ - gint i, j; - - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - m->dmij = (i == j); - } - } -} - -static void -color_matrix_copy (MatrixData * d, const MatrixData * s) -{ - gint i, j; - - for (i = 0; i < 4; i++) - for (j = 0; j < 4; j++) - d->dmij = s->dmij; -} - -/* Perform 4x4 matrix multiplication: - * - @dst@ = @a@ * @b@ - * - @dst@ may be a pointer to @a@ andor @b@ - */ -static void -color_matrix_multiply (MatrixData * dst, MatrixData * a, MatrixData * b) -{ - MatrixData tmp; - gint i, j, k; - - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - gfloat x = 0; - for (k = 0; k < 4; k++) { - x += a->dmik * b->dmkj; - } - tmp.dmij = x; - } - } - color_matrix_copy (dst, &tmp); -} - -static void -color_matrix_offset_components (MatrixData * m, gfloat a1, gfloat a2, gfloat a3) -{ - MatrixData a; - - color_matrix_set_identity (&a); - a.dm03 = a1; - a.dm13 = a2; - a.dm23 = a3; - color_matrix_multiply (m, &a, m); -} - -static void -color_matrix_scale_components (MatrixData * m, gfloat a1, gfloat a2, gfloat a3) -{ - MatrixData a; - - color_matrix_set_identity (&a); - a.dm00 = a1; - a.dm11 = a2; - a.dm22 = a3; - color_matrix_multiply (m, &a, m); -} - -static void -color_matrix_debug (GstD3D11Converter * self, const MatrixData * s) -{ - GST_DEBUG ("%f %f %f %f", - s->dm00, s->dm01, s->dm02, s->dm03); - GST_DEBUG ("%f %f %f %f", - s->dm10, s->dm11, s->dm12, s->dm13); - GST_DEBUG ("%f %f %f %f", - s->dm20, s->dm21, s->dm22, s->dm23); - GST_DEBUG ("%f %f %f %f", - s->dm30, s->dm31, s->dm32, s->dm33); -} - -static void -color_matrix_YCbCr_to_RGB (MatrixData * m, gfloat Kr, gfloat Kb) -{ - gfloat Kg = 1.0 - Kr - Kb; - MatrixData k = { - { - {1., 0., 2 * (1 - Kr), 0.}, - {1., -2 * Kb * (1 - Kb) / Kg, -2 * Kr * (1 - Kr) / Kg, 0.}, - {1., 2 * (1 - Kb), 0., 0.}, - {0., 0., 0., 1.}, - } - }; - - color_matrix_multiply (m, &k, m); -} - -static void -color_matrix_RGB_to_YCbCr (MatrixData * m, gfloat Kr, gfloat Kb) -{ - gfloat Kg = 1.0 - Kr - Kb; - MatrixData k; - gfloat x; - - k.dm00 = Kr; - k.dm01 = Kg; - k.dm02 = Kb; - k.dm03 = 0; - - x = 1 / (2 * (1 - Kb)); - k.dm10 = -x * Kr; - k.dm11 = -x * Kg; - k.dm12 = x * (1 - Kb); - k.dm13 = 0; - - x = 1 / (2 * (1 - Kr)); - k.dm20 = x * (1 - Kr); - k.dm21 = -x * Kg; - k.dm22 = -x * Kb; - k.dm23 = 0; - - k.dm30 = 0; - k.dm31 = 0; - k.dm32 = 0; - k.dm33 = 1; - - color_matrix_multiply (m, &k, m); -} - -static void -compute_matrix_to_RGB (GstD3D11Converter * self, MatrixData * data, - GstVideoInfo * info) -{ - gdouble Kr = 0, Kb = 0; - gint offset4, scale4; - - /* bring color components to 0..1.0 range */ - gst_video_color_range_offsets (info->colorimetry.range, info->finfo, offset, - scale); - - color_matrix_offset_components (data, -offset0, -offset1, -offset2); - color_matrix_scale_components (data, 1 / ((float) scale0), - 1 / ((float) scale1), 1 / ((float) scale2)); - - if (!GST_VIDEO_INFO_IS_RGB (info)) { - /* bring components to R'G'B' space */ - if (gst_video_color_matrix_get_Kr_Kb (info->colorimetry.matrix, &Kr, &Kb)) - color_matrix_YCbCr_to_RGB (data, Kr, Kb); - } - color_matrix_debug (self, data); -} - -static void -compute_matrix_to_YUV (GstD3D11Converter * self, MatrixData * data, - GstVideoInfo * info) -{ - gdouble Kr = 0, Kb = 0; - gint offset4, scale4; - - if (!GST_VIDEO_INFO_IS_RGB (info)) { - /* bring components to YCbCr space */ - if (gst_video_color_matrix_get_Kr_Kb (info->colorimetry.matrix, &Kr, &Kb)) - color_matrix_RGB_to_YCbCr (data, Kr, Kb); - } - - /* bring color components to nominal range */ - gst_video_color_range_offsets (info->colorimetry.range, info->finfo, offset, - scale); - - color_matrix_scale_components (data, (float) scale0, (float) scale1, - (float) scale2); - color_matrix_offset_components (data, offset0, offset1, offset2); - - color_matrix_debug (self, data); -} - -static gboolean -converter_get_matrix (GstD3D11Converter * self, MatrixData * matrix, - GstVideoInfo * in_info, GstVideoInfo * out_info) -{ - gboolean same_matrix; - guint in_bits, out_bits; - - in_bits = GST_VIDEO_INFO_COMP_DEPTH (in_info, 0); - out_bits = GST_VIDEO_INFO_COMP_DEPTH (out_info, 0); - - same_matrix = in_info->colorimetry.matrix == out_info->colorimetry.matrix; - - GST_DEBUG ("matrix %d -> %d (%d)", in_info->colorimetry.matrix, - out_info->colorimetry.matrix, same_matrix); - - color_matrix_set_identity (matrix); - - if (same_matrix) { - GST_DEBUG ("conversion matrix is not required"); - return FALSE; - } - - if (in_bits < out_bits) { - gint scale = 1 << (out_bits - in_bits); - color_matrix_scale_components (matrix, - 1 / (float) scale, 1 / (float) scale, 1 / (float) scale); - } - - GST_DEBUG ("to RGB matrix"); - compute_matrix_to_RGB (self, matrix, in_info); - GST_DEBUG ("current matrix"); - color_matrix_debug (self, matrix); - - GST_DEBUG ("to YUV matrix"); - compute_matrix_to_YUV (self, matrix, out_info); - GST_DEBUG ("current matrix"); - color_matrix_debug (self, matrix); - - if (in_bits > out_bits) { - gint scale = 1 << (in_bits - out_bits); - color_matrix_scale_components (matrix, - (float) scale, (float) scale, (float) scale); - } - - GST_DEBUG ("final matrix"); - color_matrix_debug (self, matrix); - - return TRUE; -} - -static gboolean -setup_convert_info_rgb_to_rgb (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *convert_info = &self->convert_info; - - convert_info->templ = &templ_REORDER; - convert_info->ps_body0 = g_strdup_printf (templ_REORDER_BODY); - convert_info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - return TRUE; -} - -static gboolean -get_packed_yuv_components (GstD3D11Converter * self, GstVideoFormat - format, gchar * y, gchar * u, gchar * v) -{ - switch (format) { - case GST_VIDEO_FORMAT_YUY2: - { - const GstD3D11Format *d3d11_format = - gst_d3d11_device_format_from_gst (self->device, - GST_VIDEO_FORMAT_YUY2); - - g_assert (d3d11_format != NULL); - - if (d3d11_format->resource_format0 == DXGI_FORMAT_R8G8B8A8_UNORM) { - *y = 'x'; - *u = 'y'; - *v = 'a'; - } else if (d3d11_format->resource_format0 == - DXGI_FORMAT_G8R8_G8B8_UNORM) { - *y = 'y'; - *u = 'x'; - *v = 'z'; - } else { - g_assert_not_reached (); - return FALSE; - } - break; - } - case GST_VIDEO_FORMAT_UYVY: - *y = 'y'; - *u = 'x'; - *v = 'z'; - break; - case GST_VIDEO_FORMAT_VYUY: - *y = 'y'; - *u = 'z'; - *v = 'x'; - break; - case GST_VIDEO_FORMAT_Y210: - *y = 'r'; - *u = 'g'; - *v = 'a'; - break; - case GST_VIDEO_FORMAT_Y410: - *y = 'g'; - *u = 'r'; - *v = 'b'; - break; - default: - g_assert_not_reached (); - return FALSE; - } - - return TRUE; -} - -static void -get_planar_component (const GstVideoInfo * info, gchar * u, gchar * v, - guint * scale) -{ - switch (GST_VIDEO_INFO_FORMAT (info)) { - case GST_VIDEO_FORMAT_I420_10LE: - case GST_VIDEO_FORMAT_I422_10LE: - case GST_VIDEO_FORMAT_Y444_10LE: - *scale = (1 << 6); - break; - case GST_VIDEO_FORMAT_I420_12LE: - case GST_VIDEO_FORMAT_I422_12LE: - case GST_VIDEO_FORMAT_Y444_12LE: - *scale = (1 << 4); - break; - default: - *scale = 1; - break; - } - - if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_YV12) { - *u = 'z'; - *v = 'y'; - } else { - *u = 'y'; - *v = 'z'; - } -} - -static void -get_semi_planar_component (const GstVideoInfo * info, gchar * u, gchar * v) -{ - if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_NV21) { - *u = 'y'; - *v = 'x'; - } else { - *u = 'x'; - *v = 'y'; - } -} - -static gboolean -setup_convert_info_yuv_to_rgb (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - - info->templ = &templ_YUV_to_RGB; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - switch (GST_VIDEO_INFO_FORMAT (in_info)) { - case GST_VIDEO_FORMAT_VUYA: - info->ps_body0 = g_strdup_printf (templ_VUYA_to_RGB_BODY); - break; - case GST_VIDEO_FORMAT_YUY2: - case GST_VIDEO_FORMAT_UYVY: - case GST_VIDEO_FORMAT_VYUY: - case GST_VIDEO_FORMAT_Y210: - case GST_VIDEO_FORMAT_Y410: - { - gchar y, u, v; - if (!get_packed_yuv_components (self, GST_VIDEO_INFO_FORMAT (in_info), - &y, &u, &v)) { - return FALSE; - } - - info->ps_body0 = - g_strdup_printf (templ_PACKED_YUV_to_RGB_BODY, y, u, v); - break; - } - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: - case GST_VIDEO_FORMAT_I420_10LE: - case GST_VIDEO_FORMAT_I420_12LE: - case GST_VIDEO_FORMAT_Y42B: - case GST_VIDEO_FORMAT_I422_10LE: - case GST_VIDEO_FORMAT_I422_12LE: - case GST_VIDEO_FORMAT_Y444: - case GST_VIDEO_FORMAT_Y444_10LE: - case GST_VIDEO_FORMAT_Y444_12LE: - case GST_VIDEO_FORMAT_Y444_16LE: - { - guint mul; - gchar u, v; - - get_planar_component (in_info, &u, &v, &mul); - - info->ps_body0 = - g_strdup_printf (templ_PLANAR_YUV_to_RGB_BODY, mul, u, mul, v, mul); - break; - } - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV21: - case GST_VIDEO_FORMAT_P010_10LE: - case GST_VIDEO_FORMAT_P012_LE: - case GST_VIDEO_FORMAT_P016_LE: - { - gchar u, v; - - get_semi_planar_component (in_info, &u, &v); - - info->ps_body0 = g_strdup_printf (templ_SEMI_PLANAR_to_RGB_BODY, u, v); - break; - } - default: - GST_ERROR ("Unhandled input format %s", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info))); - return FALSE; - } - - return TRUE; -} - -static gboolean -setup_convert_info_rgb_to_yuv (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - - info->templ = &templ_RGB_to_YUV; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - switch (GST_VIDEO_INFO_FORMAT (out_info)) { - case GST_VIDEO_FORMAT_VUYA: - info->ps_body0 = g_strdup_printf (templ_RGB_to_VUYA_BODY); - break; - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV21: - case GST_VIDEO_FORMAT_P010_10LE: - case GST_VIDEO_FORMAT_P012_LE: - case GST_VIDEO_FORMAT_P016_LE: - { - gchar u, v; - - get_semi_planar_component (out_info, &u, &v); - - info->ps_body0 = g_strdup_printf (templ_RGB_to_LUMA_BODY, 1); - info->ps_body1 = g_strdup_printf (templ_RGB_to_SEMI_PLANAR_CHROMA_BODY, - u, v); - info->ps_output1 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - break; - } - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: - case GST_VIDEO_FORMAT_I420_10LE: - case GST_VIDEO_FORMAT_I420_12LE: - case GST_VIDEO_FORMAT_Y42B: - case GST_VIDEO_FORMAT_I422_10LE: - case GST_VIDEO_FORMAT_I422_12LE: - case GST_VIDEO_FORMAT_Y444: - case GST_VIDEO_FORMAT_Y444_10LE: - case GST_VIDEO_FORMAT_Y444_12LE: - case GST_VIDEO_FORMAT_Y444_16LE: - { - guint div; - gchar u, v; - - get_planar_component (out_info, &u, &v, &div); - - info->ps_body0 = g_strdup_printf (templ_RGB_to_LUMA_BODY, div); - info->ps_body1 = - g_strdup_printf (templ_RGB_to_PLANAR_CHROMA_BODY, u, div, v, div); - info->ps_output1 = HLSL_PS_OUTPUT_TWO_PLANES_BODY; - break; - } - default: - GST_ERROR ("Unhandled output format %s", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info))); - return FALSE; - } - - return TRUE; -} - -static gboolean -setup_convert_info_planar_to_planar (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - guint in_scale, out_scale; - gchar in_u, in_v, out_u, out_v; - - info->templ = &templ_REORDER; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - info->ps_output1 = HLSL_PS_OUTPUT_TWO_PLANES_BODY; - - get_planar_component (in_info, &in_u, &in_v, &in_scale); - get_planar_component (out_info, &out_u, &out_v, &out_scale); - - info->ps_body0 = g_strdup_printf (templ_LUMA_to_LUMA_BODY, - in_scale, out_scale); - info->ps_body1 = - g_strdup_printf (templ_PLANAR_TO_PLANAR_CHROMA_BODY, - in_u, in_scale, in_v, in_scale, out_u, out_scale, out_v, out_scale); - - return TRUE; -} - -static gboolean -setup_convert_info_planar_to_semi_planar (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - guint in_scale; - gchar in_u, in_v, out_u, out_v; - - info->templ = &templ_REORDER; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - info->ps_output1 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - get_planar_component (in_info, &in_u, &in_v, &in_scale); - get_semi_planar_component (out_info, &out_u, &out_v); - - info->ps_body0 = g_strdup_printf (templ_LUMA_to_LUMA_BODY, in_scale, 1); - info->ps_body1 = - g_strdup_printf (templ_PLANAR_TO_SEMI_PLANAR_CHROMA_BODY, - in_u, in_scale, in_v, in_scale, out_u, out_v); - - return TRUE; -} - -static gboolean -setup_convert_info_semi_planar_to_planar (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - gchar in_u, in_v, out_u, out_v; - guint div = 1; - - info->templ = &templ_REORDER; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - info->ps_output1 = HLSL_PS_OUTPUT_TWO_PLANES_BODY; - - get_semi_planar_component (in_info, &in_u, &in_v); - get_planar_component (out_info, &out_u, &out_v, &div); - - info->ps_body0 = g_strdup_printf (templ_LUMA_to_LUMA_BODY, 1, div); - info->ps_body1 = - g_strdup_printf (templ_SEMI_PLANAR_TO_PLANAR_CHROMA_BODY, - in_u, in_v, out_u, div, out_v, div); - - return TRUE; -} - -static gboolean -setup_convert_info_semi_planar_to_semi_planar (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - gchar in_u, in_v, out_u, out_v; - - info->templ = &templ_REORDER; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - info->ps_output1 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - get_semi_planar_component (in_info, &in_u, &in_v); - get_semi_planar_component (out_info, &out_u, &out_v); - - info->ps_body0 = g_strdup_printf (templ_LUMA_to_LUMA_BODY, 1, 1); - info->ps_body1 = - g_strdup_printf (templ_SEMI_PLANAR_TO_SEMI_PLANAR_CHROMA_BODY, - in_u, in_v, out_u, out_v); - - return TRUE; -} - -static gboolean -setup_convert_info_vuya_to_vuya (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - - info->templ = &templ_REORDER; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - info->ps_body0 = g_strdup_printf (templ_REORDER_BODY); - - return TRUE; -} - -static gboolean -setup_convert_info_vuya_to_planar (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - guint div; - gchar u, v; - - info->templ = &templ_REORDER; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - info->ps_output1 = HLSL_PS_OUTPUT_TWO_PLANES_BODY; - - get_planar_component (out_info, &u, &v, &div); - - info->ps_body0 = g_strdup_printf (templ_VUYA_to_LUMA_BODY, div); - info->ps_body1 = - g_strdup_printf (templ_VUYA_TO_PLANAR_CHROMA_BODY, u, div, v, div); - - return TRUE; -} - -static gboolean -setup_convert_info_vuya_to_semi_planar (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - guint div = 1; - gchar u, v; - - info->templ = &templ_REORDER; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - info->ps_output1 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - get_semi_planar_component (out_info, &u, &v); - - info->ps_body0 = g_strdup_printf (templ_VUYA_to_LUMA_BODY, div); - info->ps_body1 = - g_strdup_printf (templ_VUYA_TO_SEMI_PLANAR_CHROMA_BODY, v, u); - - return TRUE; -} - -static gboolean -setup_convert_info_planar_to_vuya (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - guint mul; - gchar u, v; - - get_planar_component (in_info, &u, &v, &mul); - - info->templ = &templ_REORDER; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - info->ps_body0 = - g_strdup_printf (templ_PLANAR_to_VUYA_BODY, mul, u, mul, v, mul); - - return TRUE; -} - -static gboolean -setup_convert_info_packed_yuv_to_vuya (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - gchar y, u, v; - - info->templ = &templ_REORDER; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - if (!get_packed_yuv_components (self, GST_VIDEO_INFO_FORMAT (in_info), - &y, &u, &v)) { - return FALSE; - } - - info->ps_body0 = g_strdup_printf (templ_PACKED_YUV_to_VUYA_BODY, y, u, v); - - return TRUE; -} - -static gboolean -setup_convert_info_semi_planar_to_vuya (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - gchar u, v; - - get_semi_planar_component (in_info, &u, &v); - - info->templ = &templ_REORDER; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - info->ps_body0 = g_strdup_printf (templ_SEMI_PLANAR_to_VUYA_BODY, v, u); - - return TRUE; -} - -static gboolean -setup_convert_info_packed_yuv_to_planar (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - gchar in_y, in_u, in_v; - gchar out_u, out_v; - guint out_scale; - - info->templ = &templ_REORDER; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - info->ps_output1 = HLSL_PS_OUTPUT_TWO_PLANES_BODY; - - if (!get_packed_yuv_components (self, GST_VIDEO_INFO_FORMAT (in_info), - &in_y, &in_u, &in_v)) { - return FALSE; - } - - get_planar_component (out_info, &out_u, &out_v, &out_scale); - - info->ps_body0 = - g_strdup_printf (templ_PACKED_YUV_to_LUMA_BODY, in_y, out_scale); - info->ps_body1 = - g_strdup_printf (templ_PACKED_YUV_TO_PLANAR_CHROMA_BODY, in_u, in_v, - out_u, out_scale, out_v, out_scale); - - return TRUE; -} - -static gboolean -setup_convert_info_packed_yuv_to_semi_planar (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - gchar in_y, in_u, in_v; - gchar out_u, out_v; - - info->templ = &templ_REORDER; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - info->ps_output1 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - if (!get_packed_yuv_components (self, GST_VIDEO_INFO_FORMAT (in_info), - &in_y, &in_u, &in_v)) { - return FALSE; - } - - get_semi_planar_component (out_info, &out_u, &out_v); - - info->ps_body0 = g_strdup_printf (templ_PACKED_YUV_to_LUMA_BODY, in_y, 1); - info->ps_body1 = - g_strdup_printf (templ_PACKED_YUV_TO_SEMI_PLANAR_CHROMA_BODY, - in_u, in_v, out_u, out_v); - - return TRUE; -} - -static gboolean -is_planar_format (const GstVideoInfo * info) -{ - switch (GST_VIDEO_INFO_FORMAT (info)) { - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: - case GST_VIDEO_FORMAT_I420_10LE: - case GST_VIDEO_FORMAT_I420_12LE: - case GST_VIDEO_FORMAT_Y42B: - case GST_VIDEO_FORMAT_I422_10LE: - case GST_VIDEO_FORMAT_I422_12LE: - case GST_VIDEO_FORMAT_Y444: - case GST_VIDEO_FORMAT_Y444_10LE: - case GST_VIDEO_FORMAT_Y444_12LE: - case GST_VIDEO_FORMAT_Y444_16LE: - return TRUE; - default: - break; - } - - return FALSE; -} - -static gboolean -setup_convert_info_yuv_to_yuv (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - gboolean in_planar, out_planar; - gboolean in_vuya, out_vuya; - gboolean in_packed; - - in_vuya = GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_FORMAT_VUYA; - out_vuya = GST_VIDEO_INFO_FORMAT (out_info) == GST_VIDEO_FORMAT_VUYA; - in_planar = is_planar_format (in_info); - in_packed = (GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_FORMAT_YUY2 || - GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_FORMAT_UYVY || - GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_FORMAT_VYUY || - GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_FORMAT_Y210 || - GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_FORMAT_Y410); - out_planar = is_planar_format (out_info); - - /* From/to VUYA */ - if (in_vuya && out_vuya) { - return setup_convert_info_vuya_to_vuya (self, in_info, out_info); - } else if (in_vuya) { - if (out_planar) - return setup_convert_info_vuya_to_planar (self, in_info, out_info); - else - return setup_convert_info_vuya_to_semi_planar (self, in_info, out_info); - } else if (out_vuya) { - if (in_planar) - return setup_convert_info_planar_to_vuya (self, in_info, out_info); - else if (in_packed) - return setup_convert_info_packed_yuv_to_vuya (self, in_info, out_info); - else - return setup_convert_info_semi_planar_to_vuya (self, in_info, out_info); - } - - if (in_planar) { - if (out_planar) - return setup_convert_info_planar_to_planar (self, in_info, out_info); - else - return setup_convert_info_planar_to_semi_planar (self, in_info, out_info); - } else if (in_packed) { - if (out_planar) - return setup_convert_info_packed_yuv_to_planar (self, in_info, out_info); - else - return setup_convert_info_packed_yuv_to_semi_planar (self, in_info, - out_info); - } else { - if (out_planar) - return setup_convert_info_semi_planar_to_planar (self, in_info, out_info); - else - return setup_convert_info_semi_planar_to_semi_planar (self, in_info, - out_info); - } - - return FALSE; -} - -static gboolean -setup_convert_info_rgb_to_gray (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - - info->templ = &templ_RGB_to_YUV; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - switch (GST_VIDEO_INFO_FORMAT (out_info)) { - case GST_VIDEO_FORMAT_GRAY8: - case GST_VIDEO_FORMAT_GRAY16_LE: - info->ps_body0 = g_strdup_printf (templ_RGB_to_GRAY_BODY); - break; - default: - GST_ERROR ("Unhandled output format %s", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info))); - return FALSE; - } - - return TRUE; -} - -static gboolean -setup_convert_info_yuv_to_gray (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - - info->templ = &templ_REORDER_NO_ALPHA; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - if (GST_VIDEO_INFO_FORMAT (out_info) != GST_VIDEO_FORMAT_GRAY8 && - GST_VIDEO_INFO_FORMAT (out_info) != GST_VIDEO_FORMAT_GRAY16_LE) - return FALSE; - - switch (GST_VIDEO_INFO_FORMAT (in_info)) { - case GST_VIDEO_FORMAT_VUYA: - info->ps_body0 = g_strdup_printf (templ_VUYA_to_GRAY_BODY); - break; - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: - case GST_VIDEO_FORMAT_I420_10LE: - case GST_VIDEO_FORMAT_I420_12LE: - case GST_VIDEO_FORMAT_Y42B: - case GST_VIDEO_FORMAT_I422_10LE: - case GST_VIDEO_FORMAT_I422_12LE: - case GST_VIDEO_FORMAT_Y444: - case GST_VIDEO_FORMAT_Y444_10LE: - case GST_VIDEO_FORMAT_Y444_12LE: - case GST_VIDEO_FORMAT_Y444_16LE: - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV21: - case GST_VIDEO_FORMAT_P010_10LE: - case GST_VIDEO_FORMAT_P012_LE: - case GST_VIDEO_FORMAT_P016_LE: - { - gchar u, v; - guint scale; - - get_planar_component (in_info, &u, &v, &scale); - - info->ps_body0 = g_strdup_printf (templ_YUV_to_GRAY_BODY, scale); - break; - } - case GST_VIDEO_FORMAT_Y410: - { - gchar y, u, v; - get_packed_yuv_components (self, GST_VIDEO_FORMAT_Y410, &y, &u, &v); - - info->ps_body0 = g_strdup_printf (templ_PACKED_YUV_TO_GRAY, y); - break; - } - default: - GST_ERROR ("Unhandled input format %s", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info))); - return FALSE; - } - - return TRUE; -} - -static gboolean -setup_convert_info_gray_to_gray (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - - info->templ = &templ_REORDER_NO_ALPHA; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - if (GST_VIDEO_INFO_FORMAT (in_info) != GST_VIDEO_FORMAT_GRAY8 && - GST_VIDEO_INFO_FORMAT (in_info) != GST_VIDEO_FORMAT_GRAY16_LE) - return FALSE; - - if (GST_VIDEO_INFO_FORMAT (out_info) != GST_VIDEO_FORMAT_GRAY8 && - GST_VIDEO_INFO_FORMAT (out_info) != GST_VIDEO_FORMAT_GRAY16_LE) - return FALSE; - - info->ps_body0 = g_strdup_printf (templ_GRAY_to_GRAY_BODY); - - return TRUE; -} - -static gboolean -setup_convert_info_gray_to_rgb (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - - info->templ = &templ_REORDER_NO_ALPHA; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - if (GST_VIDEO_INFO_FORMAT (in_info) != GST_VIDEO_FORMAT_GRAY8 && - GST_VIDEO_INFO_FORMAT (in_info) != GST_VIDEO_FORMAT_GRAY16_LE) - return FALSE; - - info->ps_body0 = g_strdup_printf (templ_GRAY_to_RGB_BODY); - - return TRUE; -} - -static gboolean -setup_convert_info_gray_to_yuv (GstD3D11Converter * self, - const GstVideoInfo * in_info, const GstVideoInfo * out_info) -{ - ConvertInfo *info = &self->convert_info; - - info->templ = &templ_REORDER_NO_ALPHA; - info->ps_output0 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - - if (GST_VIDEO_INFO_FORMAT (in_info) != GST_VIDEO_FORMAT_GRAY8 && - GST_VIDEO_INFO_FORMAT (in_info) != GST_VIDEO_FORMAT_GRAY16_LE) - return FALSE; - - switch (GST_VIDEO_INFO_FORMAT (out_info)) { - case GST_VIDEO_FORMAT_VUYA: - info->ps_body0 = g_strdup_printf (templ_GRAY_to_VUYA_BODY); - break; - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: - case GST_VIDEO_FORMAT_I420_10LE: - case GST_VIDEO_FORMAT_I420_12LE: - case GST_VIDEO_FORMAT_Y42B: - case GST_VIDEO_FORMAT_I422_10LE: - case GST_VIDEO_FORMAT_I422_12LE: - case GST_VIDEO_FORMAT_Y444: - case GST_VIDEO_FORMAT_Y444_10LE: - case GST_VIDEO_FORMAT_Y444_12LE: - case GST_VIDEO_FORMAT_Y444_16LE: - { - gchar u, v; - guint div; - - get_planar_component (out_info, &u, &v, &div); - info->ps_body0 = g_strdup_printf (templ_GRAY_to_LUMA_BODY, div); - info->ps_body1 = - g_strdup_printf (templ_GRAY_to_PLANAR_CHROMA_BODY, div); - info->ps_output1 = HLSL_PS_OUTPUT_TWO_PLANES_BODY; - break; - } - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV21: - case GST_VIDEO_FORMAT_P010_10LE: - case GST_VIDEO_FORMAT_P012_LE: - case GST_VIDEO_FORMAT_P016_LE: - info->ps_body0 = g_strdup_printf (templ_GRAY_to_LUMA_BODY, 1); - info->ps_body1 = - g_strdup_printf (templ_GRAY_to_SEMI_PLANAR_CHROMA_BODY); - info->ps_output1 = HLSL_PS_OUTPUT_ONE_PLANE_BODY; - break; - default: - GST_ERROR ("Unhandled output format %s", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info))); - return FALSE; - } - - return TRUE; -} - -static gboolean -gst_d3d11_color_convert_setup_shader (GstD3D11Converter * self, - GstD3D11Device * device, GstVideoInfo * in_info, GstVideoInfo * out_info) -{ - HRESULT hr; - D3D11_SAMPLER_DESC sampler_desc; - D3D11_INPUT_ELEMENT_DESC input_desc2; - D3D11_BUFFER_DESC buffer_desc; - D3D11_MAPPED_SUBRESOURCE map; - VertexData *vertex_data; - WORD *indices; - ID3D11Device *device_handle; - ID3D11DeviceContext *context_handle; - ConvertInfo *convert_info = &self->convert_info; - /* *INDENT-OFF* */ - ComPtr<ID3D11PixelShader> psCONVERTER_MAX_QUADS; - ComPtr<ID3D11VertexShader> vs; - ComPtr<ID3D11InputLayout> layout; - ComPtr<ID3D11SamplerState> linear_sampler; - ComPtr<ID3D11Buffer> transform_const_buffer; - ComPtr<ID3D11Buffer> alpha_const_buffer; - ComPtr<ID3D11Buffer> vertex_buffer; - ComPtr<ID3D11Buffer> index_buffer; - /* *INDENT-ON* */ - const guint index_count = 2 * 3; - gint i; - gboolean ret; - ID3D11Buffer *const_buffers2 = { nullptr, nullptr }; - guint num_const_buffers = 0; - - memset (&sampler_desc, 0, sizeof (sampler_desc)); - memset (input_desc, 0, sizeof (input_desc)); - memset (&buffer_desc, 0, sizeof (buffer_desc)); - - device_handle = gst_d3d11_device_get_device_handle (device); - context_handle = gst_d3d11_device_get_device_context_handle (device); - - /* bilinear filtering */ - sampler_desc.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT; - sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; - sampler_desc.MinLOD = 0; - sampler_desc.MaxLOD = D3D11_FLOAT32_MAX; - - hr = device_handle->CreateSamplerState (&sampler_desc, &linear_sampler); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't create sampler state, hr: 0x%x", (guint) hr); - return FALSE; - } - - for (i = 0; i < CONVERTER_MAX_QUADS; i++) { - gchar *shader_code = NULL; - - if (convert_info->ps_bodyi) { - gchar *transform_const_buffer = nullptr; - gchar *alpha_const_buffer = nullptr; - guint register_idx = 0; - - g_assert (convert_info->ps_outputi != NULL); - - if (convert_info->templ->has_transform) { - transform_const_buffer = - g_strdup_printf (templ_color_transform_const_buffer, register_idx); - register_idx++; - } - - if (convert_info->templ->has_alpha) { - alpha_const_buffer = - g_strdup_printf (templ_alpha_const_buffer, register_idx); - register_idx++; - } - - shader_code = g_strdup_printf (templ_pixel_shader, - transform_const_buffer ? transform_const_buffer : "", - alpha_const_buffer ? alpha_const_buffer : "", - convert_info->ps_outputi, - convert_info->templ->func ? convert_info->templ->func : "", - convert_info->ps_bodyi); - g_free (transform_const_buffer); - g_free (alpha_const_buffer); - - ret = gst_d3d11_create_pixel_shader (device, shader_code, &psi); - g_free (shader_code); - if (!ret) { - return FALSE; - } - } - } - - if (convert_info->templ->has_transform) { - D3D11_BUFFER_DESC const_buffer_desc = { 0, }; - - G_STATIC_ASSERT (sizeof (PixelShaderColorTransform) % 16 == 0); - - const_buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - const_buffer_desc.ByteWidth = sizeof (PixelShaderColorTransform); - const_buffer_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - const_buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - const_buffer_desc.MiscFlags = 0; - const_buffer_desc.StructureByteStride = 0; - - hr = device_handle->CreateBuffer (&const_buffer_desc, nullptr, - &transform_const_buffer); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't create constant buffer, hr: 0x%x", (guint) hr); - return FALSE; - } - - gst_d3d11_device_lock (device); - hr = context_handle->Map (transform_const_buffer.Get (), - 0, D3D11_MAP_WRITE_DISCARD, 0, &map); - - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't map constant buffer, hr: 0x%x", (guint) hr); - gst_d3d11_device_unlock (device); - return FALSE; - } - - memcpy (map.pData, &convert_info->transform, - sizeof (PixelShaderColorTransform)); - - context_handle->Unmap (transform_const_buffer.Get (), 0); - gst_d3d11_device_unlock (device); - - const_buffersnum_const_buffers = transform_const_buffer.Get (); - num_const_buffers++; - } - - if (convert_info->templ->has_alpha) { - D3D11_BUFFER_DESC const_buffer_desc = { 0, }; - AlphaConstBuffer *alpha_const; - - G_STATIC_ASSERT (sizeof (AlphaConstBuffer) % 16 == 0); - - const_buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - const_buffer_desc.ByteWidth = sizeof (AlphaConstBuffer); - const_buffer_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - const_buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - const_buffer_desc.MiscFlags = 0; - const_buffer_desc.StructureByteStride = 0; - - hr = device_handle->CreateBuffer (&const_buffer_desc, - nullptr, &alpha_const_buffer); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't create constant buffer, hr: 0x%x", (guint) hr); - return FALSE; - } - - gst_d3d11_device_lock (device); - hr = context_handle->Map (alpha_const_buffer.Get (), - 0, D3D11_MAP_WRITE_DISCARD, 0, &map); - - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't map constant buffer, hr: 0x%x", (guint) hr); - gst_d3d11_device_unlock (device); - return FALSE; - } - - alpha_const = (AlphaConstBuffer *) map.pData; - memset (alpha_const, 0, sizeof (AlphaConstBuffer)); - alpha_const->alpha_mul = (FLOAT) self->alpha; - - context_handle->Unmap (alpha_const_buffer.Get (), 0); - gst_d3d11_device_unlock (device); - - self->alpha_const_buffer = alpha_const_buffer.Get (); - /* We will hold this buffer and update later */ - self->alpha_const_buffer->AddRef (); - const_buffersnum_const_buffers = alpha_const_buffer.Get (); - num_const_buffers++; - } - - input_desc0.SemanticName = "POSITION"; - input_desc0.SemanticIndex = 0; - input_desc0.Format = DXGI_FORMAT_R32G32B32_FLOAT; - input_desc0.InputSlot = 0; - input_desc0.AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; - input_desc0.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; - input_desc0.InstanceDataStepRate = 0; - - input_desc1.SemanticName = "TEXCOORD"; - input_desc1.SemanticIndex = 0; - input_desc1.Format = DXGI_FORMAT_R32G32_FLOAT; - input_desc1.InputSlot = 0; - input_desc1.AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; - input_desc1.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; - input_desc1.InstanceDataStepRate = 0; - - if (!gst_d3d11_create_vertex_shader (device, templ_vertex_shader, - input_desc, G_N_ELEMENTS (input_desc), &vs, &layout)) { - GST_ERROR ("Couldn't vertex pixel shader"); - return FALSE; - } - - /* setup vertext buffer and index buffer */ - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = sizeof (VertexData) * 4; - buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - hr = device_handle->CreateBuffer (&buffer_desc, NULL, &vertex_buffer); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't create vertex buffer, hr: 0x%x", (guint) hr); - return FALSE; - } - - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = sizeof (WORD) * index_count; - buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - hr = device_handle->CreateBuffer (&buffer_desc, NULL, &index_buffer); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't create index buffer, hr: 0x%x", (guint) hr); - return FALSE; - } - - gst_d3d11_device_lock (device); - hr = context_handle->Map (vertex_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, - &map); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't map vertex buffer, hr: 0x%x", (guint) hr); - gst_d3d11_device_unlock (device); - return FALSE; - } - - vertex_data = (VertexData *) map.pData; - - hr = context_handle->Map (index_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, - &map); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't map index buffer, hr: 0x%x", (guint) hr); - context_handle->Unmap (vertex_buffer.Get (), 0); - gst_d3d11_device_unlock (device); - return FALSE; - } - - indices = (WORD *) map.pData; - - /* bottom left */ - vertex_data0.position.x = -1.0f; - vertex_data0.position.y = -1.0f; - vertex_data0.position.z = 0.0f; - vertex_data0.texture.x = 0.0f; - vertex_data0.texture.y = 1.0f; - - /* top left */ - vertex_data1.position.x = -1.0f; - vertex_data1.position.y = 1.0f; - vertex_data1.position.z = 0.0f; - vertex_data1.texture.x = 0.0f; - vertex_data1.texture.y = 0.0f; - - /* top right */ - vertex_data2.position.x = 1.0f; - vertex_data2.position.y = 1.0f; - vertex_data2.position.z = 0.0f; - vertex_data2.texture.x = 1.0f; - vertex_data2.texture.y = 0.0f; - - /* bottom right */ - vertex_data3.position.x = 1.0f; - vertex_data3.position.y = -1.0f; - vertex_data3.position.z = 0.0f; - vertex_data3.texture.x = 1.0f; - vertex_data3.texture.y = 1.0f; - - /* clockwise indexing */ - indices0 = 0; /* bottom left */ - indices1 = 1; /* top left */ - indices2 = 2; /* top right */ - - indices3 = 3; /* bottom right */ - indices4 = 0; /* bottom left */ - indices5 = 2; /* top right */ - - context_handle->Unmap (vertex_buffer.Get (), 0); - context_handle->Unmap (index_buffer.Get (), 0); - gst_d3d11_device_unlock (device); - - self->quad0 = gst_d3d11_quad_new (device, - ps0.Get (), vs.Get (), layout.Get (), - const_buffers, num_const_buffers, - vertex_buffer.Get (), sizeof (VertexData), - index_buffer.Get (), DXGI_FORMAT_R16_UINT, index_count); - - if (ps1) { - self->quad1 = gst_d3d11_quad_new (device, - ps1.Get (), vs.Get (), layout.Get (), - const_buffers, num_const_buffers, - vertex_buffer.Get (), sizeof (VertexData), - index_buffer.Get (), DXGI_FORMAT_R16_UINT, index_count); - } - - self->num_input_view = GST_VIDEO_INFO_N_PLANES (in_info); - self->num_output_view = GST_VIDEO_INFO_N_PLANES (out_info); - - /* holds vertex buffer for crop rect update */ - self->vertex_buffer = vertex_buffer.Detach (); - - self->src_rect.left = 0; - self->src_rect.top = 0; - self->src_rect.right = GST_VIDEO_INFO_WIDTH (in_info); - self->src_rect.bottom = GST_VIDEO_INFO_HEIGHT (in_info); - - self->dest_rect.left = 0; - self->dest_rect.top = 0; - self->dest_rect.right = GST_VIDEO_INFO_WIDTH (out_info); - self->dest_rect.bottom = GST_VIDEO_INFO_HEIGHT (out_info); - - self->input_texture_width = GST_VIDEO_INFO_WIDTH (in_info); - self->input_texture_height = GST_VIDEO_INFO_HEIGHT (in_info); - - self->linear_sampler = linear_sampler.Detach (); - - return TRUE; -} - -static gboolean -copy_config (GQuark field_id, const GValue * value, GstD3D11Converter * self) -{ - gst_structure_id_set_value (self->config, field_id, value); - - return TRUE; -} - -static gboolean -gst_d3d11_converter_set_config (GstD3D11Converter * converter, - GstStructure * config) -{ - gst_structure_foreach (config, (GstStructureForeachFunc) copy_config, - converter); - gst_structure_free (config); - - return TRUE; -} - -GstD3D11Converter * -gst_d3d11_converter_new (GstD3D11Device * device, - GstVideoInfo * in_info, GstVideoInfo * out_info, GstStructure * config) -{ - const GstVideoInfo *unknown_info; - const GstD3D11Format *in_d3d11_format; - const GstD3D11Format *out_d3d11_format; - gboolean is_supported = FALSE; - MatrixData matrix; - GstD3D11Converter *converter = NULL; - gboolean ret; - guint i; - - g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL); - g_return_val_if_fail (in_info != NULL, NULL); - g_return_val_if_fail (out_info != NULL, NULL); - - GST_DEBUG ("Setup convert with format %s -> %s", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info)), - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info))); - - in_d3d11_format = - gst_d3d11_device_format_from_gst (device, - GST_VIDEO_INFO_FORMAT (in_info)); - if (!in_d3d11_format) { - unknown_info = in_info; - goto format_unknown; - } - - out_d3d11_format = - gst_d3d11_device_format_from_gst (device, - GST_VIDEO_INFO_FORMAT (out_info)); - if (!out_d3d11_format) { - unknown_info = out_info; - goto format_unknown; - } - - converter = g_new0 (GstD3D11Converter, 1); - converter->device = (GstD3D11Device *) gst_object_ref (device); - converter->config = gst_structure_new_empty ("GstD3D11Converter-Config"); - if (config) - gst_d3d11_converter_set_config (converter, config); - - converter->alpha = GET_OPT_ALPHA_VALUE (converter); - - if (GST_VIDEO_INFO_IS_RGB (in_info)) { - if (GST_VIDEO_INFO_IS_RGB (out_info)) { - is_supported = - setup_convert_info_rgb_to_rgb (converter, in_info, out_info); - } else if (GST_VIDEO_INFO_IS_YUV (out_info)) { - is_supported = - setup_convert_info_rgb_to_yuv (converter, in_info, out_info); - } else if (GST_VIDEO_INFO_IS_GRAY (out_info)) { - is_supported = - setup_convert_info_rgb_to_gray (converter, in_info, out_info); - } - } else if (GST_VIDEO_INFO_IS_YUV (in_info)) { - if (GST_VIDEO_INFO_IS_RGB (out_info)) { - is_supported = - setup_convert_info_yuv_to_rgb (converter, in_info, out_info); - } else if (GST_VIDEO_INFO_IS_YUV (out_info)) { - is_supported = - setup_convert_info_yuv_to_yuv (converter, in_info, out_info); - } else if (GST_VIDEO_INFO_IS_GRAY (out_info)) { - is_supported = - setup_convert_info_yuv_to_gray (converter, in_info, out_info); - } - } else if (GST_VIDEO_INFO_IS_GRAY (in_info)) { - if (GST_VIDEO_INFO_IS_RGB (out_info)) { - is_supported = - setup_convert_info_gray_to_rgb (converter, in_info, out_info); - } else if (GST_VIDEO_INFO_IS_YUV (out_info)) { - is_supported = - setup_convert_info_gray_to_yuv (converter, in_info, out_info); - } else if (GST_VIDEO_INFO_IS_GRAY (out_info)) { - is_supported = - setup_convert_info_gray_to_gray (converter, in_info, out_info); - } - } - - if (!is_supported) { - goto conversion_not_supported; - } - - if (converter_get_matrix (converter, &matrix, in_info, out_info)) { - PixelShaderColorTransform *transform = &converter->convert_info.transform; - - /* padding the last column for 16bytes alignment */ - transform->trans_matrix0 = matrix.dm00; - transform->trans_matrix1 = matrix.dm01; - transform->trans_matrix2 = matrix.dm02; - transform->trans_matrix3 = 0; - transform->trans_matrix4 = matrix.dm10; - transform->trans_matrix5 = matrix.dm11; - transform->trans_matrix6 = matrix.dm12; - transform->trans_matrix7 = 0; - transform->trans_matrix8 = matrix.dm20; - transform->trans_matrix9 = matrix.dm21; - transform->trans_matrix10 = matrix.dm22; - transform->trans_matrix11 = 0; - } - - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (out_info); i++) { - converter->viewporti.TopLeftX = 0; - converter->viewporti.TopLeftY = 0; - converter->viewporti.Width = GST_VIDEO_INFO_COMP_WIDTH (out_info, i); - converter->viewporti.Height = GST_VIDEO_INFO_COMP_HEIGHT (out_info, i); - converter->viewporti.MinDepth = 0.0f; - converter->viewporti.MaxDepth = 1.0f; - } - - ret = gst_d3d11_color_convert_setup_shader (converter, - device, in_info, out_info); - - if (!ret) { - GST_ERROR ("Couldn't setup shader"); - gst_d3d11_converter_free (converter); - converter = NULL; - } else { - converter->in_info = *in_info; - converter->out_info = *out_info; - } - - return converter; - - /* ERRORS */ -format_unknown: - { - GST_ERROR ("%s couldn't be converted to d3d11 format", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (unknown_info))); - if (config) - gst_structure_free (config); - - return NULL; - } -conversion_not_supported: - { - GST_ERROR ("Conversion %s to %s not supported", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info)), - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info))); - gst_d3d11_converter_free (converter); - return NULL; - } -} - -void -gst_d3d11_converter_free (GstD3D11Converter * converter) -{ - gint i; - - g_return_if_fail (converter != NULL); - - for (i = 0; i < CONVERTER_MAX_QUADS; i++) { - if (converter->quadi) - gst_d3d11_quad_free (converter->quadi); - - g_free (converter->convert_info.ps_bodyi); - } - - GST_D3D11_CLEAR_COM (converter->vertex_buffer); - GST_D3D11_CLEAR_COM (converter->linear_sampler); - GST_D3D11_CLEAR_COM (converter->alpha_const_buffer); - - gst_clear_object (&converter->device); - - if (converter->config) - gst_structure_free (converter->config); - - g_free (converter); -} - -/* must be called with gst_d3d11_device_lock since ID3D11DeviceContext is not - * thread-safe */ -static gboolean -gst_d3d11_converter_update_vertex_buffer (GstD3D11Converter * self) -{ - D3D11_MAPPED_SUBRESOURCE map; - VertexData *vertex_data; - ID3D11DeviceContext *context_handle; - HRESULT hr; - FLOAT x1, y1, x2, y2; - FLOAT u, v; - const RECT *src_rect = &self->src_rect; - const RECT *dest_rect = &self->dest_rect; - gint texture_width = self->input_texture_width; - gint texture_height = self->input_texture_height; - gdouble val; - - context_handle = gst_d3d11_device_get_device_context_handle (self->device); - - hr = context_handle->Map (self->vertex_buffer, 0, D3D11_MAP_WRITE_DISCARD, - 0, &map); - - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR ("Couldn't map vertex buffer, hr: 0x%x", (guint) hr); - return FALSE; - } - - vertex_data = (VertexData *) map.pData; - /* bottom left */ - gst_util_fraction_to_double (dest_rect->left, - GST_VIDEO_INFO_WIDTH (&self->out_info), &val); - x1 = (val * 2.0f) - 1.0f; - - gst_util_fraction_to_double (dest_rect->bottom, - GST_VIDEO_INFO_HEIGHT (&self->out_info), &val); - y1 = (val * -2.0f) + 1.0f; - - /* top right */ - gst_util_fraction_to_double (dest_rect->right, - GST_VIDEO_INFO_WIDTH (&self->out_info), &val); - x2 = (val * 2.0f) - 1.0f; - - gst_util_fraction_to_double (dest_rect->top, - GST_VIDEO_INFO_HEIGHT (&self->out_info), &val); - y2 = (val * -2.0f) + 1.0f; - - /* bottom left */ - u = (src_rect->left / (gfloat) texture_width) - 0.5f / texture_width; - v = (src_rect->bottom / (gfloat) texture_height) - 0.5f / texture_height; - - vertex_data0.position.x = x1; - vertex_data0.position.y = y1; - vertex_data0.position.z = 0.0f; - vertex_data0.texture.x = u; - vertex_data0.texture.y = v; - - /* top left */ - u = (src_rect->left / (gfloat) texture_width) - 0.5f / texture_width; - v = (src_rect->top / (gfloat) texture_height) - 0.5f / texture_height; - - vertex_data1.position.x = x1; - vertex_data1.position.y = y2; - vertex_data1.position.z = 0.0f; - vertex_data1.texture.x = u; - vertex_data1.texture.y = v; - - /* top right */ - u = (src_rect->right / (gfloat) texture_width) - 0.5f / texture_width; - v = (src_rect->top / (gfloat) texture_height) - 0.5f / texture_height; - - vertex_data2.position.x = x2; - vertex_data2.position.y = y2; - vertex_data2.position.z = 0.0f; - vertex_data2.texture.x = u; - vertex_data2.texture.y = v; - - /* bottom right */ - u = (src_rect->right / (gfloat) texture_width) - 0.5f / texture_width; - v = (src_rect->bottom / (gfloat) texture_height) - 0.5f / texture_height; - - vertex_data3.position.x = x2; - vertex_data3.position.y = y1; - vertex_data3.position.z = 0.0f; - vertex_data3.texture.x = u; - vertex_data3.texture.y = v; - - context_handle->Unmap (self->vertex_buffer, 0); - - self->update_vertex = FALSE; - - return TRUE; -} - -gboolean -gst_d3d11_converter_convert (GstD3D11Converter * converter, - ID3D11ShaderResourceView * srvGST_VIDEO_MAX_PLANES, - ID3D11RenderTargetView * rtvGST_VIDEO_MAX_PLANES, - ID3D11BlendState * blend, gfloat blend_factor4) -{ - gboolean ret; - - g_return_val_if_fail (converter != NULL, FALSE); - g_return_val_if_fail (srv != NULL, FALSE); - g_return_val_if_fail (rtv != NULL, FALSE); - - gst_d3d11_device_lock (converter->device); - ret = gst_d3d11_converter_convert_unlocked (converter, - srv, rtv, blend, blend_factor); - gst_d3d11_device_unlock (converter->device); - - return ret; -} - -gboolean -gst_d3d11_converter_convert_unlocked (GstD3D11Converter * converter, - ID3D11ShaderResourceView * srvGST_VIDEO_MAX_PLANES, - ID3D11RenderTargetView * rtvGST_VIDEO_MAX_PLANES, - ID3D11BlendState * blend, gfloat blend_factor4) -{ - gboolean ret; - /* *INDENT-OFF* */ - ComPtr<ID3D11Resource> resource; - ComPtr<ID3D11Texture2D> texture; - /* *INDENT-ON* */ - D3D11_TEXTURE2D_DESC desc; - - g_return_val_if_fail (converter != NULL, FALSE); - g_return_val_if_fail (srv != NULL, FALSE); - g_return_val_if_fail (rtv != NULL, FALSE); - - /* check texture resolution and update crop area */ - srv0->GetResource (&resource); - resource.As (&texture); - texture->GetDesc (&desc); - - if (converter->update_vertex || - desc.Width != (guint) converter->input_texture_width || - desc.Height != (guint) converter->input_texture_height) { - GST_DEBUG ("Update vertext buffer, texture resolution: %dx%d", - desc.Width, desc.Height); - - converter->input_texture_width = desc.Width; - converter->input_texture_height = desc.Height; - - if (!gst_d3d11_converter_update_vertex_buffer (converter)) { - GST_ERROR ("Cannot update vertex buffer"); - return FALSE; - } - } - - if (converter->update_alpha) { - D3D11_MAPPED_SUBRESOURCE map; - ID3D11DeviceContext *context_handle; - AlphaConstBuffer *alpha_const; - HRESULT hr; - - g_assert (converter->alpha_const_buffer != nullptr); - - context_handle = - gst_d3d11_device_get_device_context_handle (converter->device); - - hr = context_handle->Map (converter->alpha_const_buffer, - 0, D3D11_MAP_WRITE_DISCARD, 0, &map); - - if (!gst_d3d11_result (hr, converter->device)) { - GST_ERROR ("Couldn't map constant buffer, hr: 0x%x", (guint) hr); - return FALSE; - } - - alpha_const = (AlphaConstBuffer *) map.pData; - alpha_const->alpha_mul = (FLOAT) converter->alpha; - - context_handle->Unmap (converter->alpha_const_buffer, 0); - converter->update_alpha = FALSE; - } - - ret = gst_d3d11_draw_quad_unlocked (converter->quad0, converter->viewport, - 1, srv, converter->num_input_view, rtv, 1, blend, blend_factor, - &converter->linear_sampler, 1); - - if (!ret) - return FALSE; - - if (converter->quad1) { - ret = gst_d3d11_draw_quad_unlocked (converter->quad1, - &converter->viewport1, converter->num_output_view - 1, - srv, converter->num_input_view, &rtv1, converter->num_output_view - 1, - blend, blend_factor, &converter->linear_sampler, 1); - - if (!ret) - return FALSE; - } - - return TRUE; -} - -gboolean -gst_d3d11_converter_update_viewport (GstD3D11Converter * converter, - D3D11_VIEWPORT * viewport) -{ - g_return_val_if_fail (converter != NULL, FALSE); - g_return_val_if_fail (viewport != NULL, FALSE); - - converter->viewport0 = *viewport; - - switch (GST_VIDEO_INFO_FORMAT (&converter->out_info)) { - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV21: - case GST_VIDEO_FORMAT_P010_10LE: - case GST_VIDEO_FORMAT_P012_LE: - case GST_VIDEO_FORMAT_P016_LE: - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: - case GST_VIDEO_FORMAT_I420_10LE: - case GST_VIDEO_FORMAT_I420_12LE: - { - guint i; - converter->viewport1.TopLeftX = converter->viewport0.TopLeftX / 2; - converter->viewport1.TopLeftY = converter->viewport0.TopLeftY / 2; - converter->viewport1.Width = converter->viewport0.Width / 2; - converter->viewport1.Height = converter->viewport0.Height / 2; - - for (i = 2; i < GST_VIDEO_INFO_N_PLANES (&converter->out_info); i++) - converter->viewporti = converter->viewport1; - - break; - } - case GST_VIDEO_FORMAT_Y42B: - case GST_VIDEO_FORMAT_I422_10LE: - case GST_VIDEO_FORMAT_I422_12LE: - { - guint i; - converter->viewport1.TopLeftX = converter->viewport0.TopLeftX / 2; - converter->viewport1.TopLeftY = converter->viewport0.TopLeftY; - converter->viewport1.Width = converter->viewport0.Width / 2; - converter->viewport1.Height = converter->viewport0.Height; - - for (i = 2; i < GST_VIDEO_INFO_N_PLANES (&converter->out_info); i++) - converter->viewporti = converter->viewport1; - - break; - } - case GST_VIDEO_FORMAT_Y444: - case GST_VIDEO_FORMAT_Y444_10LE: - case GST_VIDEO_FORMAT_Y444_12LE: - case GST_VIDEO_FORMAT_Y444_16LE: - { - guint i; - for (i = 1; i < GST_VIDEO_INFO_N_PLANES (&converter->out_info); i++) - converter->viewporti = converter->viewport1; - break; - } - default: - if (converter->num_output_view > 1) - g_assert_not_reached (); - break; - } - - return TRUE; -} - -gboolean -gst_d3d11_converter_update_src_rect (GstD3D11Converter * converter, - RECT * src_rect) -{ - g_return_val_if_fail (converter != NULL, FALSE); - g_return_val_if_fail (src_rect != NULL, FALSE); - - gst_d3d11_device_lock (converter->device); - if (converter->src_rect.left != src_rect->left || - converter->src_rect.top != src_rect->top || - converter->src_rect.right != src_rect->right || - converter->src_rect.bottom != src_rect->bottom) { - converter->src_rect = *src_rect; - - /* vertex buffer will be updated on next convert() call */ - converter->update_vertex = TRUE; - } - gst_d3d11_device_unlock (converter->device); - - return TRUE; -} - -gboolean -gst_d3d11_converter_update_dest_rect (GstD3D11Converter * converter, - RECT * dest_rect) -{ - g_return_val_if_fail (converter != NULL, FALSE); - g_return_val_if_fail (dest_rect != NULL, FALSE); - - gst_d3d11_device_lock (converter->device); - if (converter->dest_rect.left != dest_rect->left || - converter->dest_rect.top != dest_rect->top || - converter->dest_rect.right != dest_rect->right || - converter->dest_rect.bottom != dest_rect->bottom) { - converter->dest_rect = *dest_rect; - - /* vertex buffer will be updated on next convert() call */ - converter->update_vertex = TRUE; - } - gst_d3d11_device_unlock (converter->device); - - return TRUE; -} - -gboolean -gst_d3d11_converter_update_config (GstD3D11Converter * converter, - GstStructure * config) -{ - g_return_val_if_fail (converter != nullptr, FALSE); - g_return_val_if_fail (config != nullptr, FALSE); - - gst_d3d11_device_lock (converter->device); - gst_d3d11_converter_set_config (converter, config); - - /* Check whether options are updated or not */ - if (converter->alpha_const_buffer) { - gdouble alpha = GET_OPT_ALPHA_VALUE (converter); - - if (alpha != converter->alpha) { - GST_DEBUG ("Updating alpha %lf -> %lf", converter->alpha, alpha); - converter->alpha = alpha; - converter->update_alpha = TRUE; - } - } - gst_d3d11_device_unlock (converter->device); - - return TRUE; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11converter.h
Deleted
@@ -1,72 +0,0 @@ -/* GStreamer - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_D3D11_COLOR_CONVERTER_H__ -#define __GST_D3D11_COLOR_CONVERTER_H__ - -#include <gst/gst.h> -#include <gst/video/video.h> -#include <gst/d3d11/gstd3d11.h> - -G_BEGIN_DECLS - -typedef struct _GstD3D11Converter GstD3D11Converter; - -/** - * GST_D3D11_CONVERTER_OPT_ALPHA_VALUE - * - * #G_TYPE_FLOAT, the alpha value color value to use. - * Default is 1.0 - */ -#define GST_D3D11_CONVERTER_OPT_ALPHA_VALUE "GstD3D11Converter.alpha-value" - -GstD3D11Converter * gst_d3d11_converter_new (GstD3D11Device * device, - GstVideoInfo * in_info, - GstVideoInfo * out_info, - GstStructure * config); - -void gst_d3d11_converter_free (GstD3D11Converter * converter); - -gboolean gst_d3d11_converter_convert (GstD3D11Converter * converter, - ID3D11ShaderResourceView *srvGST_VIDEO_MAX_PLANES, - ID3D11RenderTargetView *rtvGST_VIDEO_MAX_PLANES, - ID3D11BlendState *blend, - gfloat blend_factor4); - -gboolean gst_d3d11_converter_convert_unlocked (GstD3D11Converter * converter, - ID3D11ShaderResourceView *srvGST_VIDEO_MAX_PLANES, - ID3D11RenderTargetView *rtvGST_VIDEO_MAX_PLANES, - ID3D11BlendState *blend, - gfloat blend_factor4); - -gboolean gst_d3d11_converter_update_viewport (GstD3D11Converter * converter, - D3D11_VIEWPORT * viewport); - -gboolean gst_d3d11_converter_update_src_rect (GstD3D11Converter * converter, - RECT * src_rect); - -gboolean gst_d3d11_converter_update_dest_rect (GstD3D11Converter * converter, - RECT * dest_rect); - -gboolean gst_d3d11_converter_update_config (GstD3D11Converter * converter, - GstStructure * config); - -G_END_DECLS - -#endif /* __GST_D3D11_COLOR_CONVERTER_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11shader.cpp
Deleted
@@ -1,396 +0,0 @@ -/* GStreamer - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstd3d11shader.h" -#include "gstd3d11pluginutils.h" -#include <gmodule.h> -#include <wrl.h> - -/* *INDENT-OFF* */ -using namespace Microsoft::WRL; -/* *INDENT-ON* */ - -GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_shader_debug); -#define GST_CAT_DEFAULT gst_d3d11_shader_debug - -/* too many const buffers doesn't make sense */ -#define MAX_CONST_BUFFERS 16 - -static GModule *d3d_compiler_module = NULL; -static pD3DCompile GstD3DCompileFunc = NULL; - -gboolean -gst_d3d11_shader_init (void) -{ - static gsize _init = 0; - - if (g_once_init_enter (&_init)) { -#if GST_D3D11_WINAPI_ONLY_APP - /* Assuming that d3d compiler library is available */ - GstD3DCompileFunc = D3DCompile; -#else - static const gchar *d3d_compiler_names = { - "d3dcompiler_47.dll", - "d3dcompiler_46.dll", - "d3dcompiler_45.dll", - "d3dcompiler_44.dll", - "d3dcompiler_43.dll", - }; - guint i; - for (i = 0; i < G_N_ELEMENTS (d3d_compiler_names); i++) { - d3d_compiler_module = - g_module_open (d3d_compiler_namesi, G_MODULE_BIND_LAZY); - - if (d3d_compiler_module) { - GST_INFO ("D3D compiler %s is available", d3d_compiler_namesi); - if (!g_module_symbol (d3d_compiler_module, "D3DCompile", - (gpointer *) & GstD3DCompileFunc)) { - GST_ERROR ("Cannot load D3DCompile symbol from %s", - d3d_compiler_namesi); - g_module_close (d3d_compiler_module); - d3d_compiler_module = NULL; - GstD3DCompileFunc = NULL; - } else { - break; - } - } - } - - if (!GstD3DCompileFunc) - GST_WARNING ("D3D11 compiler library is unavailable"); -#endif - - g_once_init_leave (&_init, 1); - } - - return !!GstD3DCompileFunc; -} - -static gboolean -compile_shader (GstD3D11Device * device, const gchar * shader_source, - gboolean is_pixel_shader, ID3DBlob ** blob) -{ - const gchar *shader_target; - D3D_FEATURE_LEVEL feature_level; - HRESULT hr; - ID3D11Device *device_handle; - /* *INDENT-OFF* */ - ComPtr<ID3DBlob> ret; - ComPtr<ID3DBlob> error; - /* *INDENT-ON* */ - - if (!gst_d3d11_shader_init ()) { - GST_ERROR ("D3DCompiler is unavailable"); - return FALSE; - } - - device_handle = gst_d3d11_device_get_device_handle (device); - feature_level = device_handle->GetFeatureLevel (); - - if (is_pixel_shader) { - if (feature_level >= D3D_FEATURE_LEVEL_10_0) - shader_target = "ps_4_0"; - else if (feature_level >= D3D_FEATURE_LEVEL_9_3) - shader_target = "ps_4_0_level_9_3"; - else - shader_target = "ps_4_0_level_9_1"; - } else { - if (feature_level >= D3D_FEATURE_LEVEL_10_0) - shader_target = "vs_4_0"; - else if (feature_level >= D3D_FEATURE_LEVEL_9_3) - shader_target = "vs_4_0_level_9_3"; - else - shader_target = "vs_4_0_level_9_1"; - } - - g_assert (GstD3DCompileFunc); - - GST_TRACE ("Compile code \n%s", shader_source); - - hr = GstD3DCompileFunc (shader_source, strlen (shader_source), NULL, NULL, - NULL, "main", shader_target, 0, 0, &ret, &error); - - if (!gst_d3d11_result (hr, device)) { - const gchar *err = NULL; - - if (error) - err = (const gchar *) error->GetBufferPointer (); - - GST_ERROR ("could not compile source, hr: 0x%x, error detail %s", - (guint) hr, GST_STR_NULL (err)); - return FALSE; - } - - if (error) { - const gchar *err = (const gchar *) error->GetBufferPointer (); - - GST_DEBUG ("HLSL compiler warnings:\n%s\nShader code:\n%s", - GST_STR_NULL (err), GST_STR_NULL (shader_source)); - } - - *blob = ret.Detach (); - - return TRUE; -} - -gboolean -gst_d3d11_create_pixel_shader (GstD3D11Device * device, - const gchar * source, ID3D11PixelShader ** shader) -{ - ID3D11Device *device_handle; - HRESULT hr; - /* *INDENT-OFF* */ - ComPtr<ID3DBlob> ps_blob; - /* *INDENT-ON* */ - - g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), FALSE); - g_return_val_if_fail (source != NULL, FALSE); - g_return_val_if_fail (shader != NULL, FALSE); - - if (!compile_shader (device, source, TRUE, &ps_blob)) { - GST_ERROR ("Failed to compile pixel shader"); - return FALSE; - } - - device_handle = gst_d3d11_device_get_device_handle (device); - hr = device_handle->CreatePixelShader (ps_blob->GetBufferPointer (), - ps_blob->GetBufferSize (), NULL, shader); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("could not create pixel shader, hr: 0x%x", (guint) hr); - return FALSE; - } - - return TRUE; -} - -gboolean -gst_d3d11_create_vertex_shader (GstD3D11Device * device, const gchar * source, - const D3D11_INPUT_ELEMENT_DESC * input_desc, guint desc_len, - ID3D11VertexShader ** shader, ID3D11InputLayout ** layout) -{ - ID3D11Device *device_handle; - HRESULT hr; - /* *INDENT-OFF* */ - ComPtr<ID3DBlob> vs_blob; - ComPtr<ID3D11VertexShader> vs; - ComPtr<ID3D11InputLayout> in_layout; - /* *INDENT-ON* */ - - g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), FALSE); - g_return_val_if_fail (source != NULL, FALSE); - g_return_val_if_fail (input_desc != NULL, FALSE); - g_return_val_if_fail (desc_len > 0, FALSE); - g_return_val_if_fail (shader != NULL, FALSE); - g_return_val_if_fail (layout != NULL, FALSE); - - if (!compile_shader (device, source, FALSE, &vs_blob)) { - GST_ERROR ("Failed to compile shader code"); - return FALSE; - } - - device_handle = gst_d3d11_device_get_device_handle (device); - hr = device_handle->CreateVertexShader (vs_blob->GetBufferPointer (), - vs_blob->GetBufferSize (), NULL, &vs); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("could not create vertex shader, hr: 0x%x", (guint) hr); - return FALSE; - } - - hr = device_handle->CreateInputLayout (input_desc, - desc_len, vs_blob->GetBufferPointer (), - vs_blob->GetBufferSize (), &in_layout); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("could not create input layout shader, hr: 0x%x", (guint) hr); - return FALSE; - } - - *shader = vs.Detach (); - *layout = in_layout.Detach (); - - return TRUE; -} - -struct _GstD3D11Quad -{ - GstD3D11Device *device; - ID3D11PixelShader *ps; - ID3D11VertexShader *vs; - ID3D11InputLayout *layout; - ID3D11Buffer *const_bufferMAX_CONST_BUFFERS; - guint num_const_buffers; - ID3D11Buffer *vertex_buffer; - guint vertex_stride; - ID3D11Buffer *index_buffer; - DXGI_FORMAT index_format; - guint index_count; - D3D11_VIEWPORT viewportGST_VIDEO_MAX_PLANES; - ID3D11ShaderResourceView *srvGST_VIDEO_MAX_PLANES; - guint num_srv; - ID3D11RenderTargetView *rtvGST_VIDEO_MAX_PLANES; - guint num_rtv; -}; - -GstD3D11Quad * -gst_d3d11_quad_new (GstD3D11Device * device, ID3D11PixelShader * pixel_shader, - ID3D11VertexShader * vertex_shader, ID3D11InputLayout * layout, - ID3D11Buffer ** const_buffers, guint num_const_buffers, - ID3D11Buffer * vertex_buffer, guint vertex_stride, - ID3D11Buffer * index_buffer, DXGI_FORMAT index_format, guint index_count) -{ - GstD3D11Quad *quad; - - g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL); - g_return_val_if_fail (pixel_shader != NULL, NULL); - g_return_val_if_fail (vertex_shader != NULL, NULL); - g_return_val_if_fail (layout != NULL, NULL); - g_return_val_if_fail (num_const_buffers <= MAX_CONST_BUFFERS, NULL); - g_return_val_if_fail (vertex_buffer != NULL, NULL); - g_return_val_if_fail (vertex_stride > 0, NULL); - g_return_val_if_fail (index_buffer != NULL, NULL); - g_return_val_if_fail (index_format != DXGI_FORMAT_UNKNOWN, NULL); - - quad = g_new0 (GstD3D11Quad, 1); - - quad->device = (GstD3D11Device *) gst_object_ref (device); - quad->ps = pixel_shader; - quad->vs = vertex_shader; - quad->layout = layout; - quad->vertex_buffer = vertex_buffer; - quad->vertex_stride = vertex_stride; - quad->index_buffer = index_buffer; - quad->index_format = index_format; - quad->index_count = index_count; - - pixel_shader->AddRef (); - vertex_shader->AddRef (); - layout->AddRef (); - vertex_buffer->AddRef (); - index_buffer->AddRef (); - - if (num_const_buffers > 0) { - guint i; - - g_assert (const_buffers); - - for (i = 0; i < num_const_buffers; i++) { - quad->const_bufferi = const_buffersi; - quad->const_bufferi->AddRef (); - } - - quad->num_const_buffers = num_const_buffers; - } - - return quad; -} - -void -gst_d3d11_quad_free (GstD3D11Quad * quad) -{ - guint i; - - g_return_if_fail (quad != NULL); - - GST_D3D11_CLEAR_COM (quad->ps); - GST_D3D11_CLEAR_COM (quad->vs); - GST_D3D11_CLEAR_COM (quad->layout); - for (i = 0; i < quad->num_const_buffers; i++) - quad->const_bufferi->Release (); - GST_D3D11_CLEAR_COM (quad->vertex_buffer); - GST_D3D11_CLEAR_COM (quad->index_buffer); - - gst_clear_object (&quad->device); - g_free (quad); -} - -gboolean -gst_d3d11_draw_quad (GstD3D11Quad * quad, - D3D11_VIEWPORT viewportGST_VIDEO_MAX_PLANES, guint num_viewport, - ID3D11ShaderResourceView * srvGST_VIDEO_MAX_PLANES, guint num_srv, - ID3D11RenderTargetView * rtvGST_VIDEO_MAX_PLANES, guint num_rtv, - ID3D11BlendState * blend, gfloat blend_factor4, - ID3D11SamplerState ** sampler, guint num_sampler) -{ - gboolean ret; - - g_return_val_if_fail (quad != NULL, FALSE); - - gst_d3d11_device_lock (quad->device); - ret = gst_d3d11_draw_quad_unlocked (quad, viewport, num_viewport, - srv, num_srv, rtv, num_viewport, blend, blend_factor, sampler, - num_sampler); - gst_d3d11_device_unlock (quad->device); - - return ret; -} - -gboolean -gst_d3d11_draw_quad_unlocked (GstD3D11Quad * quad, - D3D11_VIEWPORT viewportGST_VIDEO_MAX_PLANES, guint num_viewport, - ID3D11ShaderResourceView * srvGST_VIDEO_MAX_PLANES, guint num_srv, - ID3D11RenderTargetView * rtvGST_VIDEO_MAX_PLANES, guint num_rtv, - ID3D11BlendState * blend, gfloat blend_factor4, - ID3D11SamplerState ** sampler, guint num_sampler) -{ - ID3D11DeviceContext *context; - UINT offsets = 0; - ID3D11ShaderResourceView *clear_viewGST_VIDEO_MAX_PLANES = { NULL, }; - ID3D11BlendState *blend_state = blend; - - g_return_val_if_fail (quad != NULL, FALSE); - g_return_val_if_fail (viewport != NULL, FALSE); - g_return_val_if_fail (num_viewport <= GST_VIDEO_MAX_PLANES, FALSE); - g_return_val_if_fail (rtv != NULL, FALSE); - g_return_val_if_fail (num_rtv <= GST_VIDEO_MAX_PLANES, FALSE); - - context = gst_d3d11_device_get_device_context_handle (quad->device); - - context->IASetPrimitiveTopology (D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - context->IASetInputLayout (quad->layout); - context->IASetVertexBuffers (0, 1, &quad->vertex_buffer, &quad->vertex_stride, - &offsets); - context->IASetIndexBuffer (quad->index_buffer, quad->index_format, 0); - - if (sampler) - context->PSSetSamplers (0, num_sampler, sampler); - context->VSSetShader (quad->vs, NULL, 0); - context->PSSetShader (quad->ps, NULL, 0); - context->RSSetViewports (num_viewport, viewport); - - if (quad->num_const_buffers) { - context->PSSetConstantBuffers (0, quad->num_const_buffers, - quad->const_buffer); - } - - if (srv) - context->PSSetShaderResources (0, num_srv, srv); - context->OMSetRenderTargets (num_rtv, rtv, NULL); - context->OMSetBlendState (blend_state, blend_factor, 0xffffffff); - - context->DrawIndexed (quad->index_count, 0, 0); - - if (srv) - context->PSSetShaderResources (0, num_srv, clear_view); - context->OMSetRenderTargets (0, NULL, NULL); - - return TRUE; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11shader.h
Deleted
@@ -1,86 +0,0 @@ -/* GStreamer - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_D3D11_SHADER_H__ -#define __GST_D3D11_SHADER_H__ - -#include <gst/gst.h> -#include <gst/video/video.h> -#include <gst/d3d11/gstd3d11.h> - -#include <d3dcompiler.h> - -G_BEGIN_DECLS - -typedef struct _GstD3D11Quad GstD3D11Quad; - -gboolean gst_d3d11_shader_init (void); - -gboolean gst_d3d11_create_pixel_shader (GstD3D11Device * device, - const gchar * source, - ID3D11PixelShader ** shader); - -gboolean gst_d3d11_create_vertex_shader (GstD3D11Device * device, - const gchar * source, - const D3D11_INPUT_ELEMENT_DESC * input_desc, - guint desc_len, - ID3D11VertexShader ** shader, - ID3D11InputLayout ** layout); - -GstD3D11Quad * gst_d3d11_quad_new (GstD3D11Device * device, - ID3D11PixelShader * pixel_shader, - ID3D11VertexShader * vertex_shader, - ID3D11InputLayout * layout, - ID3D11Buffer ** const_buffers, - guint num_const_buffers, - ID3D11Buffer * vertex_buffer, - guint vertex_stride, - ID3D11Buffer * index_buffer, - DXGI_FORMAT index_format, - guint index_count); - -void gst_d3d11_quad_free (GstD3D11Quad * quad); - -gboolean gst_d3d11_draw_quad (GstD3D11Quad * quad, - D3D11_VIEWPORT viewportGST_VIDEO_MAX_PLANES, - guint num_viewport, - ID3D11ShaderResourceView *srvGST_VIDEO_MAX_PLANES, - guint num_srv, - ID3D11RenderTargetView *rtvGST_VIDEO_MAX_PLANES, - guint num_rtv, - ID3D11BlendState *blend, - gfloat blend_factor4, - ID3D11SamplerState ** sampler, - guint num_sampler); - -gboolean gst_d3d11_draw_quad_unlocked (GstD3D11Quad * quad, - D3D11_VIEWPORT viewportGST_VIDEO_MAX_PLANES, - guint num_viewport, - ID3D11ShaderResourceView *srvGST_VIDEO_MAX_PLANES, - guint num_srv, - ID3D11RenderTargetView *rtvGST_VIDEO_MAX_PLANES, - guint num_rtv, - ID3D11BlendState *blend, - gfloat blend_factor4, - ID3D11SamplerState ** sampler, - guint num_sampler); - -G_END_DECLS - -#endif /* __GST_D3D11_SHADER_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11videoprocessor.cpp
Deleted
@@ -1,563 +0,0 @@ -/* GStreamer - * Copyright (C) <2020> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include "gstd3d11videoprocessor.h" -#include "gstd3d11pluginutils.h" - -#include <string.h> - -GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_video_processor_debug); -#define GST_CAT_DEFAULT gst_d3d11_video_processor_debug - -#if (GST_D3D11_HEADER_VERSION >= 1 && GST_D3D11_DXGI_HEADER_VERSION >= 4) -#define HAVE_VIDEO_CONTEXT_ONE -#endif - -#if (GST_D3D11_HEADER_VERSION >= 4) && (GST_D3D11_DXGI_HEADER_VERSION >= 5) -#define HAVE_VIDEO_CONTEXT_TWO -#endif - -struct _GstD3D11VideoProcessor -{ - GstD3D11Device *device; - - ID3D11VideoDevice *video_device; - ID3D11VideoContext *video_context; -#ifdef HAVE_VIDEO_CONTEXT_ONE - ID3D11VideoContext1 *video_context1; -#endif -#ifdef HAVE_VIDEO_CONTEXT_TWO - ID3D11VideoContext2 *video_context2; -#endif - ID3D11VideoProcessor *processor; - ID3D11VideoProcessorEnumerator *enumerator; -#ifdef HAVE_VIDEO_CONTEXT_ONE - ID3D11VideoProcessorEnumerator1 *enumerator1; -#endif - D3D11_VIDEO_PROCESSOR_CAPS processor_caps; -}; - -GstD3D11VideoProcessor * -gst_d3d11_video_processor_new (GstD3D11Device * device, guint in_width, - guint in_height, guint out_width, guint out_height) -{ - GstD3D11VideoProcessor *self; - ID3D11VideoDevice *video_device; - ID3D11VideoContext *video_context; - HRESULT hr; - D3D11_VIDEO_PROCESSOR_CONTENT_DESC desc; - - g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL); - - video_device = gst_d3d11_device_get_video_device_handle (device); - if (!video_device) { - GST_WARNING_OBJECT (device, "ID3D11VideoDevice is not available"); - return NULL; - } - - video_context = gst_d3d11_device_get_video_context_handle (device); - if (!video_context) { - GST_WARNING_OBJECT (device, "ID3D11VideoContext is not availale"); - return NULL; - } - - memset (&desc, 0, sizeof (desc)); - - self = g_new0 (GstD3D11VideoProcessor, 1); - self->device = (GstD3D11Device *) gst_object_ref (device); - - self->video_device = video_device; - video_device->AddRef (); - - self->video_context = video_context; - video_context->AddRef (); - - /* FIXME: Add support intelace */ - desc.InputFrameFormat = D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE; - desc.InputWidth = in_width; - desc.InputHeight = in_height; - desc.OutputWidth = out_width; - desc.OutputHeight = out_height; - /* TODO: make option for this */ - desc.Usage = D3D11_VIDEO_USAGE_PLAYBACK_NORMAL; - - hr = self->video_device->CreateVideoProcessorEnumerator (&desc, - &self->enumerator); - if (!gst_d3d11_result (hr, device)) - goto fail; -#ifdef HAVE_VIDEO_CONTEXT_ONE - hr = self->enumerator->QueryInterface (IID_PPV_ARGS (&self->enumerator1)); - if (gst_d3d11_result (hr, device)) { - GST_DEBUG ("ID3D11VideoProcessorEnumerator1 interface available"); - } -#endif - - hr = self->enumerator->GetVideoProcessorCaps (&self->processor_caps); - if (!gst_d3d11_result (hr, device)) - goto fail; - - hr = self->video_device->CreateVideoProcessor (self->enumerator, 0, - &self->processor); - if (!gst_d3d11_result (hr, device)) - goto fail; - -#ifdef HAVE_VIDEO_CONTEXT_ONE - hr = self->video_context-> - QueryInterface (IID_PPV_ARGS (&self->video_context1)); - if (gst_d3d11_result (hr, device)) { - GST_DEBUG ("ID3D11VideoContext1 interface available"); - } -#endif -#ifdef HAVE_VIDEO_CONTEXT_TWO - hr = self->video_context-> - QueryInterface (IID_PPV_ARGS (&self->video_context2)); - if (gst_d3d11_result (hr, device)) { - GST_DEBUG ("ID3D11VideoContext2 interface available"); - } -#endif - - /* Setting up default options */ - gst_d3d11_device_lock (self->device); - /* We don't want auto processing by driver */ - self->video_context->VideoProcessorSetStreamAutoProcessingMode - (self->processor, 0, FALSE); - gst_d3d11_device_unlock (self->device); - - return self; - -fail: - gst_d3d11_video_processor_free (self); - - return NULL; -} - -void -gst_d3d11_video_processor_free (GstD3D11VideoProcessor * processor) -{ - g_return_if_fail (processor != NULL); - - GST_D3D11_CLEAR_COM (processor->video_device); - GST_D3D11_CLEAR_COM (processor->video_context); -#ifdef HAVE_VIDEO_CONTEXT_ONE - GST_D3D11_CLEAR_COM (processor->video_context1); -#endif -#ifdef HAVE_VIDEO_CONTEXT_TWO - GST_D3D11_CLEAR_COM (processor->video_context2); -#endif - GST_D3D11_CLEAR_COM (processor->processor); - GST_D3D11_CLEAR_COM (processor->enumerator); -#ifdef HAVE_VIDEO_CONTEXT_ONE - GST_D3D11_CLEAR_COM (processor->enumerator1); -#endif - - gst_clear_object (&processor->device); - g_free (processor); -} - -static gboolean -gst_d3d11_video_processor_supports_format (GstD3D11VideoProcessor * - self, DXGI_FORMAT format, gboolean is_input) -{ - HRESULT hr; - UINT flag = 0; - - hr = self->enumerator->CheckVideoProcessorFormat (format, &flag); - - if (!gst_d3d11_result (hr, self->device)) - return FALSE; - - if (is_input) { - /* D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_INPUT, missing in mingw header */ - if ((flag & 0x1) != 0) - return TRUE; - } else { - /* D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_OUTPUT, missing in mingw header */ - if ((flag & 0x2) != 0) - return TRUE; - } - - return FALSE; -} - -gboolean -gst_d3d11_video_processor_supports_input_format (GstD3D11VideoProcessor * - processor, DXGI_FORMAT format) -{ - g_return_val_if_fail (processor != NULL, FALSE); - - if (format == DXGI_FORMAT_UNKNOWN) - return FALSE; - - return gst_d3d11_video_processor_supports_format (processor, format, TRUE); -} - -gboolean -gst_d3d11_video_processor_supports_output_format (GstD3D11VideoProcessor * - processor, DXGI_FORMAT format) -{ - g_return_val_if_fail (processor != NULL, FALSE); - - if (format == DXGI_FORMAT_UNKNOWN) - return FALSE; - - return gst_d3d11_video_processor_supports_format (processor, format, FALSE); -} - -gboolean -gst_d3d11_video_processor_get_caps (GstD3D11VideoProcessor * processor, - D3D11_VIDEO_PROCESSOR_CAPS * caps) -{ - g_return_val_if_fail (processor != NULL, FALSE); - g_return_val_if_fail (caps != NULL, FALSE); - - *caps = processor->processor_caps; - - return TRUE; -} - -static void -video_processor_color_space_from_gst (GstD3D11VideoProcessor * self, - GstVideoColorimetry * color, D3D11_VIDEO_PROCESSOR_COLOR_SPACE * colorspace) -{ - /* D3D11_VIDEO_PROCESSOR_DEVICE_CAPS_xvYCC */ - UINT can_xvYCC = 2; - - /* 0: playback, 1: video processing */ - colorspace->Usage = 0; - - if (color->range == GST_VIDEO_COLOR_RANGE_0_255) { - colorspace->RGB_Range = 0; - colorspace->Nominal_Range = D3D11_VIDEO_PROCESSOR_NOMINAL_RANGE_0_255; - } else { - /* 16-235 */ - colorspace->RGB_Range = 1; - colorspace->Nominal_Range = D3D11_VIDEO_PROCESSOR_NOMINAL_RANGE_16_235; - } - - if (color->matrix == GST_VIDEO_COLOR_MATRIX_BT601) { - colorspace->YCbCr_Matrix = 0; - } else { - /* BT.709, no other options (such as BT2020) */ - colorspace->YCbCr_Matrix = 1; - } - - if ((self->processor_caps.DeviceCaps & can_xvYCC) == can_xvYCC) { - colorspace->YCbCr_xvYCC = 1; - } else { - colorspace->YCbCr_xvYCC = 0; - } -} - -gboolean -gst_d3d11_video_processor_set_input_color_space (GstD3D11VideoProcessor * - processor, GstVideoColorimetry * color) -{ - D3D11_VIDEO_PROCESSOR_COLOR_SPACE color_space; - - g_return_val_if_fail (processor != NULL, FALSE); - g_return_val_if_fail (color != NULL, FALSE); - - video_processor_color_space_from_gst (processor, color, &color_space); - - processor->video_context->VideoProcessorSetStreamColorSpace - (processor->processor, 0, &color_space); - - return TRUE; -} - -gboolean -gst_d3d11_video_processor_set_output_color_space (GstD3D11VideoProcessor * - processor, GstVideoColorimetry * color) -{ - D3D11_VIDEO_PROCESSOR_COLOR_SPACE color_space; - - g_return_val_if_fail (processor != NULL, FALSE); - g_return_val_if_fail (color != NULL, FALSE); - - video_processor_color_space_from_gst (processor, color, &color_space); - - processor->video_context->VideoProcessorSetOutputColorSpace - (processor->processor, &color_space); - - return TRUE; -} - -#if (GST_D3D11_DXGI_HEADER_VERSION >= 4) -gboolean -gst_d3d11_video_processor_check_format_conversion (GstD3D11VideoProcessor * - processor, DXGI_FORMAT in_format, DXGI_COLOR_SPACE_TYPE in_color_space, - DXGI_FORMAT out_format, DXGI_COLOR_SPACE_TYPE out_color_space) -{ -#ifdef HAVE_VIDEO_CONTEXT_ONE - HRESULT hr; - BOOL supported = TRUE; - - g_return_val_if_fail (processor != NULL, FALSE); - - if (!processor->enumerator1) - return FALSE; - - hr = processor->enumerator1->CheckVideoProcessorFormatConversion - (in_format, in_color_space, out_format, out_color_space, &supported); - if (!gst_d3d11_result (hr, processor->device)) { - GST_WARNING ("Failed to check conversion support"); - return FALSE; - } - - return supported; -#endif - - return FALSE; -} - -gboolean -gst_d3d11_video_processor_set_input_dxgi_color_space (GstD3D11VideoProcessor * - processor, DXGI_COLOR_SPACE_TYPE color_space) -{ - g_return_val_if_fail (processor != NULL, FALSE); - -#ifdef HAVE_VIDEO_CONTEXT_ONE - if (processor->video_context1) { - processor->video_context1->VideoProcessorSetStreamColorSpace1 - (processor->processor, 0, color_space); - return TRUE; - } -#endif - - return FALSE; -} - -gboolean -gst_d3d11_video_processor_set_output_dxgi_color_space (GstD3D11VideoProcessor * - processor, DXGI_COLOR_SPACE_TYPE color_space) -{ - g_return_val_if_fail (processor != NULL, FALSE); - -#ifdef HAVE_VIDEO_CONTEXT_ONE - if (processor->video_context1) { - processor->video_context1->VideoProcessorSetOutputColorSpace1 - (processor->processor, color_space); - return TRUE; - } -#endif - - return FALSE; -} -#endif - -#if (GST_D3D11_DXGI_HEADER_VERSION >= 5) -/* D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_METADATA_HDR10 - * missing in mingw header */ -#define FEATURE_CAPS_METADATA_HDR10 (0x800) - -gboolean -gst_d3d11_video_processor_set_input_hdr10_metadata (GstD3D11VideoProcessor * - processor, DXGI_HDR_METADATA_HDR10 * hdr10_meta) -{ - g_return_val_if_fail (processor != NULL, FALSE); - -#ifdef HAVE_VIDEO_CONTEXT_TWO - if (processor->video_context2 && (processor->processor_caps.FeatureCaps & - FEATURE_CAPS_METADATA_HDR10)) { - if (hdr10_meta) { - processor->video_context2->VideoProcessorSetStreamHDRMetaData - (processor->processor, 0, - DXGI_HDR_METADATA_TYPE_HDR10, sizeof (DXGI_HDR_METADATA_HDR10), - hdr10_meta); - } else { - processor->video_context2->VideoProcessorSetStreamHDRMetaData - (processor->processor, 0, DXGI_HDR_METADATA_TYPE_NONE, 0, NULL); - } - - return TRUE; - } -#endif - - return FALSE; -} - -gboolean -gst_d3d11_video_processor_set_output_hdr10_metadata (GstD3D11VideoProcessor * - processor, DXGI_HDR_METADATA_HDR10 * hdr10_meta) -{ - g_return_val_if_fail (processor != NULL, FALSE); - -#ifdef HAVE_VIDEO_CONTEXT_TWO - if (processor->video_context2 && (processor->processor_caps.FeatureCaps & - FEATURE_CAPS_METADATA_HDR10)) { - if (hdr10_meta) { - processor->video_context2->VideoProcessorSetOutputHDRMetaData - (processor->processor, DXGI_HDR_METADATA_TYPE_HDR10, - sizeof (DXGI_HDR_METADATA_HDR10), hdr10_meta); - } else { - processor->video_context2->VideoProcessorSetOutputHDRMetaData - (processor->processor, DXGI_HDR_METADATA_TYPE_NONE, 0, NULL); - } - - return TRUE; - } -#endif - - return FALSE; -} -#endif - -gboolean -gst_d3d11_video_processor_create_input_view (GstD3D11VideoProcessor * processor, - D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC * desc, ID3D11Resource * resource, - ID3D11VideoProcessorInputView ** view) -{ - HRESULT hr; - - g_return_val_if_fail (processor != NULL, FALSE); - g_return_val_if_fail (desc != NULL, FALSE); - g_return_val_if_fail (resource != NULL, FALSE); - g_return_val_if_fail (view != NULL, FALSE); - - hr = processor->video_device->CreateVideoProcessorInputView (resource, - processor->enumerator, desc, view); - if (!gst_d3d11_result (hr, processor->device)) - return FALSE; - - return TRUE; -} - -ID3D11VideoProcessorInputView * -gst_d3d11_video_processor_get_input_view (GstD3D11VideoProcessor * processor, - GstD3D11Memory * mem) -{ - return gst_d3d11_memory_get_processor_input_view (mem, - processor->video_device, processor->enumerator); -} - -gboolean -gst_d3d11_video_processor_create_output_view (GstD3D11VideoProcessor * - processor, D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC * desc, - ID3D11Resource * resource, ID3D11VideoProcessorOutputView ** view) -{ - HRESULT hr; - - g_return_val_if_fail (processor != NULL, FALSE); - g_return_val_if_fail (desc != NULL, FALSE); - g_return_val_if_fail (resource != NULL, FALSE); - g_return_val_if_fail (view != NULL, FALSE); - - hr = processor->video_device->CreateVideoProcessorOutputView - (resource, processor->enumerator, desc, view); - if (!gst_d3d11_result (hr, processor->device)) - return FALSE; - - return TRUE; -} - -ID3D11VideoProcessorOutputView * -gst_d3d11_video_processor_get_output_view (GstD3D11VideoProcessor * - processor, GstD3D11Memory * mem) -{ - return gst_d3d11_memory_get_processor_output_view (mem, - processor->video_device, processor->enumerator); -} - -gboolean -gst_d3d11_video_processor_render (GstD3D11VideoProcessor * processor, - RECT * in_rect, ID3D11VideoProcessorInputView * in_view, - RECT * out_rect, ID3D11VideoProcessorOutputView * out_view) -{ - gboolean ret; - - g_return_val_if_fail (processor != NULL, FALSE); - g_return_val_if_fail (in_view != NULL, FALSE); - g_return_val_if_fail (out_view != NULL, FALSE); - - gst_d3d11_device_lock (processor->device); - ret = gst_d3d11_video_processor_render_unlocked (processor, in_rect, in_view, - out_rect, out_view); - gst_d3d11_device_unlock (processor->device); - - return ret; -} - -gboolean -gst_d3d11_video_processor_render_unlocked (GstD3D11VideoProcessor * processor, - RECT * in_rect, ID3D11VideoProcessorInputView * in_view, - RECT * out_rect, ID3D11VideoProcessorOutputView * out_view) -{ - HRESULT hr; - D3D11_VIDEO_PROCESSOR_STREAM stream = { 0, }; - ID3D11VideoContext *context; - ID3D11VideoProcessor *proc; - - g_return_val_if_fail (processor != NULL, FALSE); - g_return_val_if_fail (in_view != NULL, FALSE); - g_return_val_if_fail (out_view != NULL, FALSE); - - stream.Enable = TRUE; - stream.pInputSurface = in_view; - context = processor->video_context; - proc = processor->processor; - - if (in_rect) { - context->VideoProcessorSetStreamSourceRect (proc, 0, TRUE, in_rect); - } else { - context->VideoProcessorSetStreamSourceRect (proc, 0, FALSE, NULL); - } - - if (out_rect) { - context->VideoProcessorSetStreamDestRect (proc, 0, TRUE, out_rect); - context->VideoProcessorSetOutputTargetRect (proc, TRUE, out_rect); - } else { - context->VideoProcessorSetStreamDestRect (proc, 0, FALSE, NULL); - context->VideoProcessorSetOutputTargetRect (proc, FALSE, NULL); - } - - hr = context->VideoProcessorBlt (proc, out_view, 0, 1, &stream); - if (!gst_d3d11_result (hr, processor->device)) - return FALSE; - - return TRUE; -} - -gboolean -gst_d3d11_video_processor_check_bind_flags_for_input_view (guint bind_flags) -{ - static const guint compatible_flags = (D3D11_BIND_DECODER | - D3D11_BIND_VIDEO_ENCODER | D3D11_BIND_RENDER_TARGET | - D3D11_BIND_UNORDERED_ACCESS); - - if (bind_flags == 0) - return TRUE; - - if ((bind_flags & compatible_flags) != 0) - return TRUE; - - return FALSE; -} - -gboolean -gst_d3d11_video_processor_check_bind_flags_for_output_view (guint bind_flags) -{ - if ((bind_flags & D3D11_BIND_RENDER_TARGET) == D3D11_BIND_RENDER_TARGET) - return TRUE; - - return FALSE; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11videoprocessor.h
Deleted
@@ -1,111 +0,0 @@ -/* GStreamer - * Copyright (C) <2020> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_D3D11_VIDEO_PROCESSOR_H__ -#define __GST_D3D11_VIDEO_PROCESSOR_H__ - -#include <gst/gst.h> -#include <gst/video/video.h> -#include <gst/d3d11/gstd3d11.h> - -G_BEGIN_DECLS - -typedef struct _GstD3D11VideoProcessor GstD3D11VideoProcessor; - -GstD3D11VideoProcessor * gst_d3d11_video_processor_new (GstD3D11Device * device, - guint in_width, - guint in_height, - guint out_width, - guint out_height); - -void gst_d3d11_video_processor_free (GstD3D11VideoProcessor * processor); - -gboolean gst_d3d11_video_processor_supports_input_format (GstD3D11VideoProcessor * processor, - DXGI_FORMAT format); - -gboolean gst_d3d11_video_processor_supports_output_format (GstD3D11VideoProcessor * processor, - DXGI_FORMAT format); - -gboolean gst_d3d11_video_processor_get_caps (GstD3D11VideoProcessor * processor, - D3D11_VIDEO_PROCESSOR_CAPS * caps); - -gboolean gst_d3d11_video_processor_set_input_color_space (GstD3D11VideoProcessor * processor, - GstVideoColorimetry * color); - -gboolean gst_d3d11_video_processor_set_output_color_space (GstD3D11VideoProcessor * processor, - GstVideoColorimetry * color); - -#if (GST_D3D11_DXGI_HEADER_VERSION >= 4) -gboolean gst_d3d11_video_processor_check_format_conversion (GstD3D11VideoProcessor * processor, - DXGI_FORMAT in_format, - DXGI_COLOR_SPACE_TYPE in_color_space, - DXGI_FORMAT out_format, - DXGI_COLOR_SPACE_TYPE out_color_space); - -gboolean gst_d3d11_video_processor_set_input_dxgi_color_space (GstD3D11VideoProcessor * processor, - DXGI_COLOR_SPACE_TYPE color_space); - -gboolean gst_d3d11_video_processor_set_output_dxgi_color_space (GstD3D11VideoProcessor * processor, - DXGI_COLOR_SPACE_TYPE color_space); -#endif - -#if (GST_D3D11_DXGI_HEADER_VERSION >= 5) -gboolean gst_d3d11_video_processor_set_input_hdr10_metadata (GstD3D11VideoProcessor * processor, - DXGI_HDR_METADATA_HDR10 * hdr10_meta); - -gboolean gst_d3d11_video_processor_set_output_hdr10_metadata (GstD3D11VideoProcessor * processor, - DXGI_HDR_METADATA_HDR10 * hdr10_meta); -#endif - -gboolean gst_d3d11_video_processor_create_input_view (GstD3D11VideoProcessor * processor, - D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC * desc, - ID3D11Resource *resource, - ID3D11VideoProcessorInputView ** view); - -ID3D11VideoProcessorInputView * gst_d3d11_video_processor_get_input_view (GstD3D11VideoProcessor * processor, - GstD3D11Memory *mem); - -gboolean gst_d3d11_video_processor_create_output_view (GstD3D11VideoProcessor * processor, - D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC * desc, - ID3D11Resource *resource, - ID3D11VideoProcessorOutputView ** view); - -ID3D11VideoProcessorOutputView * gst_d3d11_video_processor_get_output_view (GstD3D11VideoProcessor * processor, - GstD3D11Memory *mem); - -gboolean gst_d3d11_video_processor_render (GstD3D11VideoProcessor * processor, - RECT *in_rect, - ID3D11VideoProcessorInputView * in_view, - RECT *out_rect, - ID3D11VideoProcessorOutputView * out_view); - -gboolean gst_d3d11_video_processor_render_unlocked (GstD3D11VideoProcessor * processor, - RECT *in_rect, - ID3D11VideoProcessorInputView * in_view, - RECT *out_rect, - ID3D11VideoProcessorOutputView * out_view); - -/* utils */ -gboolean gst_d3d11_video_processor_check_bind_flags_for_input_view (guint bind_flags); - -gboolean gst_d3d11_video_processor_check_bind_flags_for_output_view (guint bind_flags); - -G_END_DECLS - -#endif /* __GST_D3D11_VIDEO_PROCESSOR_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowdecwrapper
Deleted
-(directory)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowdecwrapper/CMakeLists.txt
Deleted
@@ -1,58 +0,0 @@ - -CMAKE_MINIMUM_REQUIRED (VERSION 2.8) - -PROJECT(dshowsdecwrapper) - -SET(GST_INSTALL_BASE "C:\\gstreamer\\1.0\\x86" CACHE PATH "Path to the GStreamer install base") -SET(SDK_INSTALL_BASE "C:\\Program Files\\Microsoft SDKs\\Windows\\v7.0" CACHE PATH "Path to the Windows SDK root") - -SET_PROPERTY( - DIRECTORY - APPEND PROPERTY COMPILE_DEFINITIONS - HAVE_CONFIG_H -) - -INCLUDE_DIRECTORIES( - ${GST_INSTALL_BASE}/include - ${GST_INSTALL_BASE}/include/gstreamer-1.0 - ${GST_INSTALL_BASE}/include/glib-2.0 - ${GST_INSTALL_BASE}/lib/glib-2.0/include - ${SDK_INSTALL_BASE}/Samples/multimedia/directshow/baseclasses - ${PROJECT_SOURCE_DIR}/../../win32/common -) - -LINK_DIRECTORIES( - ${GST_INSTALL_BASE}/lib - ${SDK_INSTALL_BASE}/Samples/multimedia/directshow/baseclasses/Release_MBCS - ${SDK_INSTALL_BASE}/Samples/multimedia/directshow/baseclasses/Debug_MBCS -) - -ADD_LIBRARY(libgstdshowdecwrapper SHARED - gstdshowaudiodec.cpp - gstdshowaudiodec.h - gstdshowvideodec.cpp - gstdshowvideodec.h - gstdshowdecwrapper.cpp - gstdshowdecwrapper.h - gstdshowfakesrc.cpp - gstdshowfakesrc.h - gstdshowutil.cpp - gstdshowutil.h -) - -TARGET_LINK_LIBRARIES(libgstdshowdecwrapper - gstreamer-1.0 - gstaudio-1.0 - gstvideo-1.0 - gstbase-1.0 - glib-2.0 - gobject-2.0 - debug strmbasd - optimized strmbase - rpcrt4 - uuid - winmm - dmoguids - wmcodecdspuuid - msdmo -)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowdecwrapper/gstdshowaudiodec.cpp
Deleted
@@ -1,1206 +0,0 @@ -/* - * GStreamer DirectShow codecs wrapper - * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com> - * Copyright <2006, 2007, 2008> Pioneers of the Inevitable <songbird@songbirdnest.com> - * Copyright <2007,2008> Sebastien Moutte <sebastien@moutte.net> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Alternatively, the contents of this file may be used under the - * GNU Lesser General Public License Version 2.1 (the "LGPL"), in - * which case the following provisions apply instead of the ones - * mentioned above: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstdshowaudiodec.h" -#include <mmreg.h> -#include <dmoreg.h> -#include <wmcodecdsp.h> -#include <gst/audio/audio.h> - -GST_DEBUG_CATEGORY_STATIC (dshowaudiodec_debug); -#define GST_CAT_DEFAULT dshowaudiodec_debug - -#define gst_dshowaudiodec_parent_class parent_class -G_DEFINE_TYPE(GstDshowAudioDec, gst_dshowaudiodec, GST_TYPE_ELEMENT) - -static void gst_dshowaudiodec_finalize (GObject * object); -static GstStateChangeReturn gst_dshowaudiodec_change_state - (GstElement * element, GstStateChange transition); - -/* sink pad overwrites */ -static gboolean gst_dshowaudiodec_sink_setcaps (GstPad * pad, GstCaps * caps); -static GstFlowReturn gst_dshowaudiodec_chain (GstPad * pad, GstObject *parent, GstBuffer * buffer); -static gboolean gst_dshowaudiodec_sink_event (GstPad * pad, GstObject *parent, GstEvent * event); - -/* utils */ -static gboolean gst_dshowaudiodec_create_graph_and_filters (GstDshowAudioDec * - adec); -static gboolean gst_dshowaudiodec_destroy_graph_and_filters (GstDshowAudioDec * - adec); -static gboolean gst_dshowaudiodec_flush (GstDshowAudioDec * adec); -static gboolean gst_dshowaudiodec_get_filter_settings (GstDshowAudioDec * adec); -static gboolean gst_dshowaudiodec_setup_graph (GstDshowAudioDec * adec, GstCaps *caps); - -/* All the GUIDs we want are generated from the FOURCC like this */ -#define GUID_MEDIASUBTYPE_FROM_FOURCC(fourcc) \ - { fourcc , 0x0000, 0x0010, \ - { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} - -/* WMA we should always use the DMO */ -static PreferredFilter preferred_wma_filters = { - {&CLSID_CWMADecMediaObject, &DMOCATEGORY_AUDIO_DECODER}, - {0} -}; - -/* Prefer the Vista (DMO) decoder if present, otherwise the XP - * decoder (not a DMO), otherwise fallback to highest-merit */ -static const GUID CLSID_XP_MP3_DECODER = {0x38BE3000, 0xDBF4, 0x11D0, - {0x86,0x0E,0x00,0xA0,0x24,0xCF,0xEF,0x6D}}; -static PreferredFilter preferred_mp3_filters = { - {&CLSID_CMP3DecMediaObject, &DMOCATEGORY_AUDIO_DECODER}, - {&CLSID_XP_MP3_DECODER}, - {0} -}; - -/* MPEG 1/2: use the MPEG Audio Decoder filter */ -static const GUID CLSID_WINDOWS_MPEG_AUDIO_DECODER = - {0x4A2286E0, 0x7BEF, 0x11CE, - {0x9B, 0xD9, 0x00, 0x00, 0xE2, 0x02, 0x59, 0x9C}}; -static PreferredFilter preferred_mpegaudio_filters = { - {&CLSID_WINDOWS_MPEG_AUDIO_DECODER}, - {0} -}; - -static const AudioCodecEntry audio_dec_codecs = { - {"dshowadec_wma1", "Windows Media Audio 7", - WAVE_FORMAT_MSAUDIO1, - "audio/x-wma, wmaversion = (int) 1", - preferred_wma_filters}, - - {"dshowadec_wma2", "Windows Media Audio 8", - WAVE_FORMAT_WMAUDIO2, - "audio/x-wma, wmaversion = (int) 2", - preferred_wma_filters}, - - {"dshowadec_wma3", "Windows Media Audio 9 Professional", - WAVE_FORMAT_WMAUDIO3, - "audio/x-wma, wmaversion = (int) 3", - preferred_wma_filters}, - - {"dshowadec_wma4", "Windows Media Audio 9 Lossless", - WAVE_FORMAT_WMAUDIO_LOSSLESS, - "audio/x-wma, wmaversion = (int) 4", - preferred_wma_filters}, - - {"dshowadec_wms", "Windows Media Audio Voice v9", - WAVE_FORMAT_WMAVOICE9, - "audio/x-wms", - preferred_wma_filters}, - - {"dshowadec_mp3", "MPEG Layer 3 Audio", - WAVE_FORMAT_MPEGLAYER3, - "audio/mpeg, " - "mpegversion = (int) 1, " - "layer = (int)3, " - "rate = (int) 8000, 48000 , " - "channels = (int) 1, 2 , " - "parsed= (boolean) true", - preferred_mp3_filters}, - - {"dshowadec_mpeg_1_2", "MPEG Layer 1,2 Audio", - WAVE_FORMAT_MPEG, - "audio/mpeg, " - "mpegversion = (int) 1, " - "layer = (int) 1, 2 , " - "rate = (int) 8000, 48000 , " - "channels = (int) 1, 2 , " - "parsed= (boolean) true", - preferred_mpegaudio_filters}, -}; - -HRESULT AudioFakeSink::DoRenderSample(IMediaSample *pMediaSample) -{ - GstBuffer *out_buf = NULL; - gboolean in_seg = FALSE; - GstClockTime buf_start, buf_stop; - guint64 clip_start = 0, clip_stop = 0; - guint start_offset = 0, stop_offset; - GstClockTime duration; - - if(pMediaSample) - { - BYTE *pBuffer = NULL; - LONGLONG lStart = 0, lStop = 0; - long size = pMediaSample->GetActualDataLength(); - - pMediaSample->GetPointer(&pBuffer); - pMediaSample->GetTime(&lStart, &lStop); - - if (!GST_CLOCK_TIME_IS_VALID (mDec->timestamp)) { - // Convert REFERENCE_TIME to GST_CLOCK_TIME - mDec->timestamp = (GstClockTime)lStart * 100; - } - duration = (lStop - lStart) * 100; - - buf_start = mDec->timestamp; - buf_stop = mDec->timestamp + duration; - - /* save stop position to start next buffer with it */ - mDec->timestamp = buf_stop; - - /* check if this buffer is in our current segment */ - in_seg = gst_segment_clip (mDec->segment, GST_FORMAT_TIME, - buf_start, buf_stop, &clip_start, &clip_stop); - - /* if the buffer is out of segment do not push it downstream */ - if (!in_seg) { - GST_DEBUG_OBJECT (mDec, - "buffer is out of segment, start %" GST_TIME_FORMAT " stop %" - GST_TIME_FORMAT, GST_TIME_ARGS (buf_start), GST_TIME_ARGS (buf_stop)); - goto done; - } - - /* buffer is entirely or partially in-segment, so allocate a - * GstBuffer for output, and clip if required */ - - /* allocate a new buffer for raw audio */ - out_buf = gst_buffer_new_and_alloc(size); - if (!out_buf) { - GST_WARNING_OBJECT (mDec, "cannot allocate a new GstBuffer"); - goto done; - } - - /* set buffer properties */ - GST_BUFFER_TIMESTAMP (out_buf) = buf_start; - GST_BUFFER_DURATION (out_buf) = duration; - - if (gst_buffer_fill(out_buf, 0, pBuffer, size) != size) { - gst_buffer_unref (out_buf); - GST_WARNING_OBJECT (mDec, "unable to fill output buffer"); - goto done; - } - - /* we have to remove some heading samples */ - if ((GstClockTime) clip_start > buf_start) { - start_offset = (guint)gst_util_uint64_scale_int (clip_start - buf_start, - mDec->rate, GST_SECOND) * mDec->depth / 8 * mDec->channels; - } - else - start_offset = 0; - /* we have to remove some trailing samples */ - if ((GstClockTime) clip_stop < buf_stop) { - stop_offset = (guint)gst_util_uint64_scale_int (buf_stop - clip_stop, - mDec->rate, GST_SECOND) * mDec->depth / 8 * mDec->channels; - } - else - stop_offset = size; - - /* truncating */ - if ((start_offset != 0) || (stop_offset != (size_t) size)) { - - GstBuffer *subbuf = gst_buffer_copy_region (out_buf, GST_BUFFER_COPY_ALL, - start_offset, stop_offset - start_offset); - - if (subbuf) { - gst_buffer_unref (out_buf); - out_buf = subbuf; - } - } - - GST_BUFFER_TIMESTAMP (out_buf) = clip_start; - GST_BUFFER_DURATION (out_buf) = clip_stop - clip_start; - - /* replace the saved stop position by the clipped one */ - mDec->timestamp = clip_stop; - - GST_DEBUG_OBJECT (mDec, - "push_buffer (size %d)=> pts %" GST_TIME_FORMAT " stop %" GST_TIME_FORMAT - " duration %" GST_TIME_FORMAT, size, - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (out_buf)), - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (out_buf) + - GST_BUFFER_DURATION (out_buf)), - GST_TIME_ARGS (GST_BUFFER_DURATION (out_buf))); - - mDec->last_ret = gst_pad_push (mDec->srcpad, out_buf); - } - -done: - return S_OK; -} - -HRESULT AudioFakeSink::CheckMediaType(const CMediaType *pmt) -{ - if(pmt != NULL) - { - /* The Vista MP3 decoder (and possibly others?) outputs an - * AM_MEDIA_TYPE with the wrong cbFormat. So, rather than using - * CMediaType.operator==, we implement a sufficient check ourselves. - * I think this is a bug in the MP3 decoder. - */ - if (IsEqualGUID (pmt->majortype, m_MediaType.majortype) && - IsEqualGUID (pmt->subtype, m_MediaType.subtype) && - IsEqualGUID (pmt->formattype, m_MediaType.formattype)) - { - /* Types are the same at the top-level. Now, we need to compare - * the format blocks. - * We special case WAVEFORMATEX to not check that - * pmt->cbFormat == m_MediaType.cbFormat, though the actual format - * blocks must still be the same. - */ - if (pmt->formattype == FORMAT_WaveFormatEx) { - if (pmt->cbFormat >= sizeof (WAVEFORMATEX) && - m_MediaType.cbFormat >= sizeof (WAVEFORMATEX)) - { - WAVEFORMATEX *wf1 = (WAVEFORMATEX *)pmt->pbFormat; - WAVEFORMATEX *wf2 = (WAVEFORMATEX *)m_MediaType.pbFormat; - if (wf1->cbSize == wf2->cbSize && - memcmp (wf1, wf2, sizeof(WAVEFORMATEX) + wf1->cbSize) == 0) - return S_OK; - } - } - else { - if (pmt->cbFormat == m_MediaType.cbFormat && - pmt->cbFormat == 0 || - (pmt->pbFormat != NULL && m_MediaType.pbFormat != NULL && - memcmp (pmt->pbFormat, m_MediaType.pbFormat, pmt->cbFormat) == 0)) - return S_OK; - } - } - } - - return S_FALSE; -} - -int AudioFakeSink::GetBufferSize() -{ - IMemAllocator *allocator = NULL; - if (m_pInputPin) { - allocator = m_pInputPin->Allocator(); - if(allocator) { - ALLOCATOR_PROPERTIES props; - allocator->GetProperties(&props); - return props.cbBuffer; - } - } - - return 0; -} - -static void -gst_dshowaudiodec_base_init (gpointer klass) -{ - GstDshowAudioDecClass *audiodec_class = (GstDshowAudioDecClass *) klass; - GstPadTemplate *src, *sink; - GstCaps *srccaps, *sinkcaps; - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - const AudioCodecEntry *tmp; - gpointer qdata; - gchar *longname, *description; - - qdata = g_type_get_qdata (G_OBJECT_CLASS_TYPE (klass), DSHOW_CODEC_QDATA); - - /* element details */ - tmp = audiodec_class->entry = (AudioCodecEntry *) qdata; - - longname = g_strdup_printf ("DirectShow %s Decoder Wrapper", - tmp->element_longname); - description = g_strdup_printf ("DirectShow %s Decoder Wrapper", - tmp->element_longname); - - gst_element_class_set_metadata(element_class, longname, "Codec/Decoder/Audio", description, - "Sebastien Moutte <sebastien@moutte.net>"); - - g_free (longname); - g_free (description); - - sinkcaps = gst_caps_from_string (tmp->sinkcaps); - - srccaps = gst_caps_from_string ( - "audio/x-raw," - "format = (string)" GST_AUDIO_FORMATS_ALL "," - "rate = (int)1, MAX," - "channels = (int)1, MAX," - "layout = (string)interleaved"); - - sink = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, sinkcaps); - src = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, srccaps); - - /* register */ - gst_element_class_add_pad_template (element_class, src); - gst_element_class_add_pad_template (element_class, sink); - - if (sinkcaps) - gst_caps_unref(sinkcaps); - - if (srccaps) - gst_caps_unref(srccaps); -} - -static void -gst_dshowaudiodec_class_init (GstDshowAudioDecClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); - - gobject_class->finalize = gst_dshowaudiodec_finalize; - - gstelement_class->change_state = - GST_DEBUG_FUNCPTR (gst_dshowaudiodec_change_state); - - parent_class = (GstElementClass *) g_type_class_peek_parent (klass); -} - -static void -gst_dshowaudiodec_com_thread (GstDshowAudioDec * adec) -{ - HRESULT res; - - g_mutex_lock (&adec->com_init_lock); - - /* Initialize COM with a MTA for this process. This thread will - * be the first one to enter the apartement and the last one to leave - * it, unitializing COM properly */ - - res = CoInitializeEx (0, COINIT_MULTITHREADED); - if (res == S_FALSE) - GST_WARNING_OBJECT (adec, "COM has been already initialized in the same process"); - else if (res == RPC_E_CHANGED_MODE) - GST_WARNING_OBJECT (adec, "The concurrency model of COM has changed."); - else - GST_INFO_OBJECT (adec, "COM initialized successfully"); - - adec->comInitialized = TRUE; - - /* Signal other threads waiting on this condition that COM was initialized */ - g_cond_signal (&adec->com_initialized); - - g_mutex_unlock (&adec->com_init_lock); - - /* Wait until the uninitialize condition is met to leave the COM apartement */ - g_mutex_lock (&adec->com_deinit_lock); - g_cond_wait (&adec->com_uninitialize, &adec->com_deinit_lock); - - CoUninitialize (); - GST_INFO_OBJECT (adec, "COM uninitialized successfully"); - adec->comInitialized = FALSE; - g_cond_signal (&adec->com_uninitialized); - g_mutex_unlock (&adec->com_deinit_lock); -} - -static void -gst_dshowaudiodec_init (GstDshowAudioDec * adec) -{ - GstElementClass *element_class = GST_ELEMENT_GET_CLASS (adec); - - /* setup pads */ - adec->sinkpad = - gst_pad_new_from_template (gst_element_class_get_pad_template - (element_class, "sink"), "sink"); - - gst_pad_set_event_function (adec->sinkpad, gst_dshowaudiodec_sink_event); - gst_pad_set_chain_function (adec->sinkpad, gst_dshowaudiodec_chain); - gst_element_add_pad (GST_ELEMENT (adec), adec->sinkpad); - - adec->srcpad = - gst_pad_new_from_template (gst_element_class_get_pad_template - (element_class, "src"), "src"); - gst_element_add_pad (GST_ELEMENT (adec), adec->srcpad); - - adec->fakesrc = NULL; - adec->fakesink = NULL; - - adec->decfilter = 0; - adec->filtergraph = 0; - adec->mediafilter = 0; - - adec->timestamp = GST_CLOCK_TIME_NONE; - adec->segment = gst_segment_new (); - adec->setup = FALSE; - adec->depth = 0; - adec->bitrate = 0; - adec->block_align = 0; - adec->channels = 0; - adec->rate = 0; - adec->layer = 0; - adec->codec_data = NULL; - - adec->last_ret = GST_FLOW_OK; - - g_mutex_init(&adec->com_init_lock); - g_mutex_init(&adec->com_deinit_lock); - g_cond_init(&adec->com_initialized); - g_cond_init(&adec->com_uninitialize); - g_cond_init(&adec->com_uninitialized); - - g_mutex_lock (&adec->com_init_lock); - - /* create the COM initialization thread */ - g_thread_new ("COM init thread", (GThreadFunc)gst_dshowaudiodec_com_thread, - adec); - - /* wait until the COM thread signals that COM has been initialized */ - g_cond_wait (&adec->com_initialized, &adec->com_init_lock); - g_mutex_unlock (&adec->com_init_lock); -} - -static void -gst_dshowaudiodec_finalize (GObject * object) -{ - GstDshowAudioDec *adec = (GstDshowAudioDec *) (object); - - if (adec->segment) { - gst_segment_free (adec->segment); - adec->segment = NULL; - } - - if (adec->codec_data) { - gst_buffer_unref (adec->codec_data); - adec->codec_data = NULL; - } - - /* signal the COM thread that it sould uninitialize COM */ - if (adec->comInitialized) { - g_mutex_lock (&adec->com_deinit_lock); - g_cond_signal (&adec->com_uninitialize); - g_cond_wait (&adec->com_uninitialized, &adec->com_deinit_lock); - g_mutex_unlock (&adec->com_deinit_lock); - } - - g_mutex_clear (&adec->com_init_lock); - g_mutex_clear (&adec->com_deinit_lock); - g_cond_clear (&adec->com_initialized); - g_cond_clear (&adec->com_uninitialize); - g_cond_clear (&adec->com_uninitialized); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - - -static GstStateChangeReturn -gst_dshowaudiodec_change_state (GstElement * element, GstStateChange transition) -{ - GstDshowAudioDec *adec = (GstDshowAudioDec *) (element); - - switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY: - if (!gst_dshowaudiodec_create_graph_and_filters (adec)) - return GST_STATE_CHANGE_FAILURE; - break; - case GST_STATE_CHANGE_READY_TO_PAUSED: - break; - case GST_STATE_CHANGE_PAUSED_TO_PLAYING: - break; - case GST_STATE_CHANGE_PLAYING_TO_PAUSED: - break; - case GST_STATE_CHANGE_PAUSED_TO_READY: - adec->depth = 0; - adec->bitrate = 0; - adec->block_align = 0; - adec->channels = 0; - adec->rate = 0; - adec->layer = 0; - if (adec->codec_data) { - gst_buffer_unref (adec->codec_data); - adec->codec_data = NULL; - } - break; - case GST_STATE_CHANGE_READY_TO_NULL: - if (!gst_dshowaudiodec_destroy_graph_and_filters (adec)) - return GST_STATE_CHANGE_FAILURE; - break; - default: - break; - } - - return GST_ELEMENT_CLASS(parent_class)->change_state (element, transition); -} - -static gboolean -gst_dshowaudiodec_sink_setcaps (GstPad * pad, GstCaps * caps) -{ - gboolean ret = FALSE; - GstDshowAudioDec *adec = (GstDshowAudioDec *) gst_pad_get_parent (pad); - GstStructure *s = gst_caps_get_structure (caps, 0); - const GValue *v = NULL; - - adec->timestamp = GST_CLOCK_TIME_NONE; - - /* read data, only rate and channels are needed */ - if (!gst_structure_get_int (s, "rate", &adec->rate) || - !gst_structure_get_int (s, "channels", &adec->channels)) { - GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, - ("error getting audio specs from caps"), (NULL)); - goto end; - } - - gst_structure_get_int (s, "depth", &adec->depth); - gst_structure_get_int (s, "bitrate", &adec->bitrate); - gst_structure_get_int (s, "block_align", &adec->block_align); - gst_structure_get_int (s, "layer", &adec->layer); - - if (adec->codec_data) { - gst_buffer_unref (adec->codec_data); - adec->codec_data = NULL; - } - - if ((v = gst_structure_get_value (s, "codec_data"))) - adec->codec_data = gst_buffer_ref (gst_value_get_buffer (v)); - - ret = gst_dshowaudiodec_setup_graph (adec, caps); -end: - gst_object_unref (adec); - - return ret; -} - -static GstFlowReturn -gst_dshowaudiodec_chain (GstPad *pad, GstObject *parent, GstBuffer *buffer) -{ - GstDshowAudioDec *adec = (GstDshowAudioDec *) gst_pad_get_parent (pad); - GstMapInfo map; - bool discont = FALSE; - - if (!adec->setup) { - /* we are not set up */ - GST_WARNING_OBJECT (adec, "Decoder not set up, failing"); - adec->last_ret = GST_FLOW_FLUSHING; - goto beach; - } - - if (adec->last_ret != GST_FLOW_OK) { - GST_DEBUG_OBJECT (adec, "last decoding iteration generated a fatal error " - "%s", gst_flow_get_name (adec->last_ret)); - goto beach; - } - - GST_CAT_DEBUG_OBJECT (dshowaudiodec_debug, adec, "chain (size %d)=> pts %" - GST_TIME_FORMAT " stop %" GST_TIME_FORMAT, - gst_buffer_get_size(buffer), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer) + - GST_BUFFER_DURATION (buffer))); - - /* if the incoming buffer has discont flag set => flush decoder data */ - if (buffer && GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) { - GST_CAT_DEBUG_OBJECT (dshowaudiodec_debug, adec, - "this buffer has a DISCONT flag (%" GST_TIME_FORMAT "), flushing", - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); - gst_dshowaudiodec_flush (adec); - discont = TRUE; - } - - /* push the buffer to the directshow decoder */ - gst_buffer_map(buffer, &map, GST_MAP_READ); - adec->fakesrc->GetOutputPin()->PushBuffer ( - map.data, GST_BUFFER_TIMESTAMP (buffer), - GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer), - map.size, (bool)discont); - gst_buffer_unmap(buffer, &map); - -beach: - gst_buffer_unref (buffer); - gst_object_unref (adec); - return adec->last_ret; -} - -static gboolean -gst_dshowaudiodec_sink_event (GstPad * pad, GstObject *parent, GstEvent * event) -{ - gboolean ret = TRUE; - GstDshowAudioDec *adec = (GstDshowAudioDec *) parent; - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_CAPS:{ - GstCaps *caps; - gst_event_parse_caps(event, &caps); - ret = gst_dshowaudiodec_sink_setcaps(pad, caps); - break; - } - - case GST_EVENT_FLUSH_STOP:{ - gst_dshowaudiodec_flush (adec); - ret = gst_pad_event_default (pad, parent, event); - break; - } - - case GST_EVENT_SEGMENT:{ - const GstSegment *segment; - gst_event_parse_segment (event, &segment); - - GST_CAT_DEBUG_OBJECT (dshowaudiodec_debug, adec, - "received new segment from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, - GST_TIME_ARGS (segment->start), GST_TIME_ARGS (segment->stop)); - - /* save the new segment in our local current segment */ - gst_segment_copy_into(segment, adec->segment); - - ret = gst_pad_event_default (pad, parent, event); - break; - } - - default: - ret = gst_pad_event_default (pad, parent, event); - break; - } - - return ret; -} - -static gboolean -gst_dshowaudiodec_flush (GstDshowAudioDec * adec) -{ - if (!adec->fakesrc) - return FALSE; - - /* flush dshow decoder and reset timestamp */ - adec->fakesrc->GetOutputPin()->Flush(); - - adec->timestamp = GST_CLOCK_TIME_NONE; - adec->last_ret = GST_FLOW_OK; - - return TRUE; -} - -static AM_MEDIA_TYPE * -dshowaudiodec_set_input_format (GstDshowAudioDec *adec, GstCaps *caps) -{ - AM_MEDIA_TYPE *mediatype; - WAVEFORMATEX *format; - GstDshowAudioDecClass *klass = - (GstDshowAudioDecClass *) G_OBJECT_GET_CLASS (adec); - const AudioCodecEntry *codec_entry = klass->entry; - int size; - - mediatype = (AM_MEDIA_TYPE *)g_malloc0 (sizeof(AM_MEDIA_TYPE)); - mediatype->majortype = MEDIATYPE_Audio; - GUID subtype = GUID_MEDIASUBTYPE_FROM_FOURCC (0x00000000); - subtype.Data1 = codec_entry->format; - mediatype->subtype = subtype; - mediatype->bFixedSizeSamples = TRUE; - mediatype->bTemporalCompression = FALSE; - if (adec->block_align) - mediatype->lSampleSize = adec->block_align; - else - mediatype->lSampleSize = 8192; /* need to evaluate it dynamically */ - mediatype->formattype = FORMAT_WaveFormatEx; - - /* We need this special behaviour for layers 1 and 2 (layer 3 uses a different - * decoder which doesn't need this */ - if (adec->layer == 1 || adec->layer == 2) { - MPEG1WAVEFORMAT *mpeg1_format; - int samples, version; - GstStructure *structure = gst_caps_get_structure (caps, 0); - - size = sizeof (MPEG1WAVEFORMAT); - format = (WAVEFORMATEX *)g_malloc0 (size); - format->cbSize = sizeof (MPEG1WAVEFORMAT) - sizeof (WAVEFORMATEX); - format->wFormatTag = WAVE_FORMAT_MPEG; - - mpeg1_format = (MPEG1WAVEFORMAT *) format; - - mpeg1_format->wfx.nChannels = adec->channels; - if (adec->channels == 2) - mpeg1_format->fwHeadMode = ACM_MPEG_STEREO; - else - mpeg1_format->fwHeadMode = ACM_MPEG_SINGLECHANNEL; - - mpeg1_format->fwHeadModeExt = 0; - mpeg1_format->wHeadEmphasis = 0; - mpeg1_format->fwHeadFlags = 0; - - switch (adec->layer) { - case 1: - mpeg1_format->fwHeadLayer = ACM_MPEG_LAYER3; - break; - case 2: - mpeg1_format->fwHeadLayer = ACM_MPEG_LAYER2; - break; - case 3: - mpeg1_format->fwHeadLayer = ACM_MPEG_LAYER1; - break; - }; - - gst_structure_get_int (structure, "mpegaudioversion", &version); - if (adec->layer == 1) { - samples = 384; - } else { - if (version == 1) { - samples = 576; - } else { - samples = 1152; - } - } - mpeg1_format->wfx.nBlockAlign = (WORD) samples; - mpeg1_format->wfx.nSamplesPerSec = adec->rate; - mpeg1_format->dwHeadBitrate = 128000; /* This doesn't seem to matter */ - mpeg1_format->wfx.nAvgBytesPerSec = mpeg1_format->dwHeadBitrate / 8; - } - else - { - size = sizeof (WAVEFORMATEX) + - (adec->codec_data ? gst_buffer_get_size(adec->codec_data) : 0); - - if (adec->layer == 3) { - MPEGLAYER3WAVEFORMAT *mp3format; - - /* The WinXP mp3 decoder doesn't actually check the size of this structure, - * but requires that this be allocated and filled out (or we get obscure - * random crashes) - */ - size = sizeof (MPEGLAYER3WAVEFORMAT); - mp3format = (MPEGLAYER3WAVEFORMAT *)g_malloc0 (size); - format = (WAVEFORMATEX *)mp3format; - format->cbSize = MPEGLAYER3_WFX_EXTRA_BYTES; - - mp3format->wID = MPEGLAYER3_ID_MPEG; - mp3format->fdwFlags = MPEGLAYER3_FLAG_PADDING_ISO; /* No idea what this means for a decoder */ - - /* The XP decoder divides by nBlockSize, so we must set this to a - non-zero value, but it doesn't matter what - this is meaningless - for VBR mp3 anyway */ - mp3format->nBlockSize = 1; - mp3format->nFramesPerBlock = 1; - mp3format->nCodecDelay = 0; - } - else { - format = (WAVEFORMATEX *)g_malloc0 (size); - - if (adec->codec_data) { /* Codec data is appended after our header */ - gsize codec_size = gst_buffer_get_size(adec->codec_data); - gst_buffer_extract(adec->codec_data, 0, ((guchar *) format) + sizeof (WAVEFORMATEX), - codec_size); - format->cbSize = codec_size; - } - } - - format->wFormatTag = codec_entry->format; - format->nChannels = adec->channels; - format->nSamplesPerSec = adec->rate; - format->nAvgBytesPerSec = adec->bitrate / 8; - format->nBlockAlign = adec->block_align; - format->wBitsPerSample = adec->depth; - } - - mediatype->cbFormat = size; - mediatype->pbFormat = (BYTE *) format; - - return mediatype; -} - -static AM_MEDIA_TYPE * -dshowaudiodec_set_output_format (GstDshowAudioDec *adec) -{ - AM_MEDIA_TYPE *mediatype; - WAVEFORMATEX *format; - GstDshowAudioDecClass *klass = - (GstDshowAudioDecClass *) G_OBJECT_GET_CLASS (adec); - const AudioCodecEntry *codec_entry = klass->entry; - - if (!gst_dshowaudiodec_get_filter_settings (adec)) { - return NULL; - } - - format = (WAVEFORMATEX *)g_malloc0(sizeof (WAVEFORMATEX)); - format->wFormatTag = WAVE_FORMAT_PCM; - format->wBitsPerSample = adec->depth; - format->nChannels = adec->channels; - format->nBlockAlign = adec->channels * (adec->depth / 8); - format->nSamplesPerSec = adec->rate; - format->nAvgBytesPerSec = format->nBlockAlign * adec->rate; - - mediatype = (AM_MEDIA_TYPE *)g_malloc0(sizeof (AM_MEDIA_TYPE)); - mediatype->majortype = MEDIATYPE_Audio; - GUID subtype = GUID_MEDIASUBTYPE_FROM_FOURCC (WAVE_FORMAT_PCM); - mediatype->subtype = subtype; - mediatype->bFixedSizeSamples = TRUE; - mediatype->bTemporalCompression = FALSE; - mediatype->lSampleSize = format->nBlockAlign; - mediatype->formattype = FORMAT_WaveFormatEx; - mediatype->cbFormat = sizeof (WAVEFORMATEX); - mediatype->pbFormat = (BYTE *)format; - - return mediatype; -} - -static void -dshowadec_free_mediatype (AM_MEDIA_TYPE *mediatype) -{ - g_free (mediatype->pbFormat); - g_free (mediatype); -} - -static gboolean -gst_dshowaudiodec_setup_graph (GstDshowAudioDec * adec, GstCaps *caps) -{ - gboolean ret = FALSE; - GstDshowAudioDecClass *klass = - (GstDshowAudioDecClass *) G_OBJECT_GET_CLASS (adec); - HRESULT hres; - GstCaps *outcaps = NULL; - AM_MEDIA_TYPE *output_mediatype = NULL; - AM_MEDIA_TYPE *input_mediatype = NULL; - IPinPtr output_pin = NULL; - IPinPtr input_pin = NULL; - const AudioCodecEntry *codec_entry = klass->entry; - IBaseFilterPtr srcfilter; - IBaseFilterPtr sinkfilter; - GstAudioInfo audio_info; - - input_mediatype = dshowaudiodec_set_input_format (adec, caps); - - adec->fakesrc->GetOutputPin()->SetMediaType (input_mediatype); - - srcfilter = adec->fakesrc; - - /* connect our fake source to decoder */ - output_pin = gst_dshow_get_pin_from_filter (srcfilter, PINDIR_OUTPUT); - if (!output_pin) { - GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, - ("Can't get output pin from our directshow fakesrc filter"), (NULL)); - goto end; - } - input_pin = gst_dshow_get_pin_from_filter (adec->decfilter, PINDIR_INPUT); - if (!input_pin) { - GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, - ("Can't get input pin from decoder filter"), (NULL)); - goto end; - } - - hres = adec->filtergraph->ConnectDirect (output_pin, input_pin, - NULL); - if (hres != S_OK) { - GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, - ("Can't connect fakesrc with decoder (error=%x)", hres), (NULL)); - goto end; - } - - output_mediatype = dshowaudiodec_set_output_format (adec); - if (!output_mediatype) { - GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, - ("Can't get audio output format from decoder"), (NULL)); - goto end; - } - - adec->fakesink->SetMediaType(output_mediatype); - - gst_audio_info_init(&audio_info); - gst_audio_info_set_format(&audio_info, - gst_audio_format_build_integer(TRUE, G_BYTE_ORDER, adec->depth, adec->depth), - adec->rate, adec->channels, NULL); - - outcaps = gst_audio_info_to_caps(&audio_info); - - if (!gst_pad_set_caps (adec->srcpad, outcaps)) { - GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, - ("Failed to negotiate output"), (NULL)); - goto end; - } - - /* connect the decoder to our fake sink */ - output_pin = gst_dshow_get_pin_from_filter (adec->decfilter, PINDIR_OUTPUT); - if (!output_pin) { - GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, - ("Can't get output pin from our decoder filter"), (NULL)); - goto end; - } - - sinkfilter = adec->fakesink; - input_pin = gst_dshow_get_pin_from_filter (sinkfilter, PINDIR_INPUT); - if (!input_pin) { - GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, - ("Can't get input pin from our directshow fakesink filter"), (NULL)); - goto end; - } - - hres = adec->filtergraph->ConnectDirect(output_pin, input_pin, NULL); - if (hres != S_OK) { - GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, - ("Can't connect decoder with fakesink (error=%x)", hres), (NULL)); - goto end; - } - - hres = adec->mediafilter->Run (-1); - if (hres != S_OK) { - GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, - ("Can't run the directshow graph (error=%x)", hres), (NULL)); - goto end; - } - - ret = TRUE; - adec->setup = TRUE; -end: - if (outcaps) - gst_caps_unref(outcaps); - if (input_mediatype) - dshowadec_free_mediatype (input_mediatype); - if (output_mediatype) - dshowadec_free_mediatype (output_mediatype); - - return ret; -} - -static gboolean -gst_dshowaudiodec_get_filter_settings (GstDshowAudioDec * adec) -{ - IPinPtr output_pin; - IEnumMediaTypesPtr enum_mediatypes; - HRESULT hres; - ULONG fetched; - BOOL ret = FALSE; - - if (adec->decfilter == 0) - return FALSE; - - output_pin = gst_dshow_get_pin_from_filter (adec->decfilter, PINDIR_OUTPUT); - if (!output_pin) { - GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, - ("failed getting output pin from the decoder"), (NULL)); - return FALSE; - } - - hres = output_pin->EnumMediaTypes (&enum_mediatypes); - if (hres == S_OK && enum_mediatypes) { - AM_MEDIA_TYPE *mediatype = NULL; - - enum_mediatypes->Reset(); - while (!ret && enum_mediatypes->Next(1, &mediatype, &fetched) == S_OK) - { - if (IsEqualGUID (mediatype->subtype, MEDIASUBTYPE_PCM) && - IsEqualGUID (mediatype->formattype, FORMAT_WaveFormatEx)) - { - WAVEFORMATEX *audio_info = (WAVEFORMATEX *) mediatype->pbFormat; - - adec->channels = audio_info->nChannels; - adec->depth = audio_info->wBitsPerSample; - adec->rate = audio_info->nSamplesPerSec; - ret = TRUE; - } - DeleteMediaType (mediatype); - } - } - - return ret; -} - -static gboolean -gst_dshowaudiodec_create_graph_and_filters (GstDshowAudioDec * adec) -{ - HRESULT hres; - GstDshowAudioDecClass *klass = - (GstDshowAudioDecClass *) G_OBJECT_GET_CLASS (adec); - IBaseFilterPtr srcfilter; - IBaseFilterPtr sinkfilter; - GUID insubtype = GUID_MEDIASUBTYPE_FROM_FOURCC (klass->entry->format); - GUID outsubtype = GUID_MEDIASUBTYPE_FROM_FOURCC (WAVE_FORMAT_PCM); - - /* create the filter graph manager object */ - hres = adec->filtergraph.CreateInstance ( - CLSID_FilterGraph, NULL, CLSCTX_INPROC); - if (FAILED (hres)) { - GST_ELEMENT_ERROR (adec, STREAM, FAILED, - ("Can't create an instance of the directshow graph manager (error=%d)", - hres), (NULL)); - goto error; - } - - hres = adec->filtergraph->QueryInterface (&adec->mediafilter); - if (FAILED (hres)) { - GST_WARNING_OBJECT (adec, "Can't QI filtergraph to mediafilter"); - goto error; - } - - /* create fake src filter */ - adec->fakesrc = new FakeSrc(); - /* Created with a refcount of zero, so increment that */ - adec->fakesrc->AddRef(); - - /* create decoder filter */ - adec->decfilter = gst_dshow_find_filter (MEDIATYPE_Audio, - insubtype, - MEDIATYPE_Audio, - outsubtype, - klass->entry->preferred_filters); - if (adec->decfilter == NULL) { - GST_ELEMENT_ERROR (adec, STREAM, FAILED, - ("Can't create an instance of the decoder filter"), (NULL)); - goto error; - } - - /* create fake sink filter */ - adec->fakesink = new AudioFakeSink(adec); - /* Created with a refcount of zero, so increment that */ - adec->fakesink->AddRef(); - - /* add filters to the graph */ - srcfilter = adec->fakesrc; - hres = adec->filtergraph->AddFilter (srcfilter, L"src"); - if (hres != S_OK) { - GST_ELEMENT_ERROR (adec, STREAM, FAILED, - ("Can't add fakesrc filter to the graph (error=%d)", hres), (NULL)); - goto error; - } - - hres = adec->filtergraph->AddFilter(adec->decfilter, L"decoder"); - if (hres != S_OK) { - GST_ELEMENT_ERROR (adec, STREAM, FAILED, - ("Can't add decoder filter to the graph (error=%d)", hres), (NULL)); - goto error; - } - - sinkfilter = adec->fakesink; - hres = adec->filtergraph->AddFilter(sinkfilter, L"sink"); - if (hres != S_OK) { - GST_ELEMENT_ERROR (adec, STREAM, FAILED, - ("Can't add fakesink filter to the graph (error=%d)", hres), (NULL)); - goto error; - } - - return TRUE; - -error: - if (adec->fakesrc) { - adec->fakesrc->Release(); - adec->fakesrc = NULL; - } - if (adec->fakesink) { - adec->fakesink->Release(); - adec->fakesink = NULL; - } - adec->decfilter = 0; - adec->mediafilter = 0; - adec->filtergraph = 0; - - return FALSE; -} - -static gboolean -gst_dshowaudiodec_destroy_graph_and_filters (GstDshowAudioDec * adec) -{ - if (adec->mediafilter) { - adec->mediafilter->Stop(); - } - - if (adec->fakesrc) { - if (adec->filtergraph) { - IBaseFilterPtr filter = adec->fakesrc; - adec->filtergraph->RemoveFilter(filter); - } - adec->fakesrc->Release(); - adec->fakesrc = NULL; - } - if (adec->decfilter) { - if (adec->filtergraph) - adec->filtergraph->RemoveFilter(adec->decfilter); - adec->decfilter = 0; - } - if (adec->fakesink) { - if (adec->filtergraph) { - IBaseFilterPtr filter = adec->fakesink; - adec->filtergraph->RemoveFilter(filter); - } - - adec->fakesink->Release(); - adec->fakesink = NULL; - } - adec->mediafilter = 0; - adec->filtergraph = 0; - - adec->setup = FALSE; - - return TRUE; -} - -gboolean -dshow_adec_register (GstPlugin * plugin) -{ - GTypeInfo info = { - sizeof (GstDshowAudioDecClass), - (GBaseInitFunc) gst_dshowaudiodec_base_init, - NULL, - (GClassInitFunc) gst_dshowaudiodec_class_init, - NULL, - NULL, - sizeof (GstDshowAudioDec), - 0, - (GInstanceInitFunc) gst_dshowaudiodec_init, - }; - gint i; - HRESULT hr; - - GST_DEBUG_CATEGORY_INIT (dshowaudiodec_debug, "dshowaudiodec", 0, - "Directshow filter audio decoder"); - - hr = CoInitialize(0); - for (i = 0; i < sizeof (audio_dec_codecs) / sizeof (AudioCodecEntry); i++) { - GType type; - IBaseFilterPtr filter; - GUID insubtype = GUID_MEDIASUBTYPE_FROM_FOURCC (audio_dec_codecsi.format); - GUID outsubtype = GUID_MEDIASUBTYPE_FROM_FOURCC (WAVE_FORMAT_PCM); - - filter = gst_dshow_find_filter (MEDIATYPE_Audio, - insubtype, - MEDIATYPE_Audio, - outsubtype, - audio_dec_codecsi.preferred_filters); - - if (filter) - { - GST_DEBUG ("Registering %s", audio_dec_codecsi.element_name); - - type = g_type_register_static (GST_TYPE_ELEMENT, - audio_dec_codecsi.element_name, &info, (GTypeFlags)0); - g_type_set_qdata (type, DSHOW_CODEC_QDATA, (gpointer) (audio_dec_codecs + i)); - if (!gst_element_register (plugin, audio_dec_codecsi.element_name, - GST_RANK_MARGINAL, type)) { - return FALSE; - } - GST_CAT_DEBUG (dshowaudiodec_debug, "Registered %s", - audio_dec_codecsi.element_name); - } - else { - GST_DEBUG ("Element %s not registered " - "(the format is not supported by the system)", - audio_dec_codecsi.element_name); - } - } - - if (SUCCEEDED(hr)) - CoUninitialize (); - - return TRUE; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowdecwrapper/gstdshowaudiodec.h
Deleted
@@ -1,160 +0,0 @@ -/* - * GStreamer DirectShow codecs wrapper - * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com> - * Copyright <2006, 2007, 2008> Pioneers of the Inevitable <songbird@songbirdnest.com> - * Copyright <2007,2008> Sebastien Moutte <sebastien@moutte.net> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Alternatively, the contents of this file may be used under the - * GNU Lesser General Public License Version 2.1 (the "LGPL"), in - * which case the following provisions apply instead of the ones - * mentioned above: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - - -#ifndef __GST_DSHOWAUDIODEC_H__ -#define __GST_DSHOWAUDIODEC_H__ - -#include <gst/gst.h> -#include "gstdshowutil.h" -#include "gstdshowfakesrc.h" - -G_BEGIN_DECLS - -typedef struct { - gchar *element_name; /* The gst element factory name */ - gchar *element_longname; /* Description string for element */ - gint32 format; /* WAVEFORMATEX format */ - gchar *sinkcaps; /* GStreamer caps of input format */ - PreferredFilter *preferred_filters; /* NULL-terminated list of preferred filters */ -} AudioCodecEntry; - -#define GST_TYPE_DSHOWAUDIODEC (gst_dshowaudiodec_get_type()) -#define GST_DSHOWAUDIODEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DSHOWAUDIODEC,GstDshowAudioDec)) -#define GST_DSHOWAUDIODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DSHOWAUDIODEC,GstDshowAudioDecClass)) -#define GST_IS_DSHOWAUDIODEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DSHOWAUDIODEC)) -#define GST_IS_DSHOWAUDIODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DSHOWAUDIODEC)) - -typedef struct _GstDshowAudioDec GstDshowAudioDec; -typedef struct _GstDshowAudioDecClass GstDshowAudioDecClass; - -class AudioFakeSink; - -struct _GstDshowAudioDec -{ - GstElement element; - - /* element pads */ - GstPad *sinkpad; - GstPad *srcpad; - - GstFlowReturn last_ret; - - /* filters interfaces*/ - FakeSrc *fakesrc; - AudioFakeSink *fakesink; - - IBaseFilterPtr decfilter; - - /* graph manager interfaces */ - IMediaFilterPtr mediafilter; - IFilterGraphPtr filtergraph; - - /* true when dshow graph is setup */ - gboolean setup; - - /* audio settings */ - gint bitrate; - gint block_align; - gint depth; - gint channels; - gint rate; - gint layer; - GstBuffer *codec_data; - - /* current segment */ - GstSegment * segment; - - /* timestamp of the next buffer */ - GstClockTime timestamp; - - gboolean comInitialized; - GMutex com_init_lock; - GMutex com_deinit_lock; - GCond com_initialized; - GCond com_uninitialize; - GCond com_uninitialized; -}; - -struct _GstDshowAudioDecClass -{ - GstElementClass parent_class; - const AudioCodecEntry *entry; -}; - -gboolean dshow_adec_register (GstPlugin * plugin); - -const GUID CLSID_AudioFakeSink = -{ 0x3867f537, 0x3e3d, 0x44da, - { 0xbb, 0xf2, 0x02, 0x48, 0x7b, 0xb0, 0xbc, 0xc4} }; - -class AudioFakeSink : public CBaseRenderer -{ -public: - AudioFakeSink(GstDshowAudioDec *dec) : - m_hres(S_OK), - CBaseRenderer(CLSID_AudioFakeSink, _T("AudioFakeSink"), NULL, &m_hres), - mDec(dec) - {}; - virtual ~AudioFakeSink() {}; - - HRESULT DoRenderSample(IMediaSample *pMediaSample); - HRESULT CheckMediaType(const CMediaType *pmt); - HRESULT SetMediaType (AM_MEDIA_TYPE *pmt) - { - m_MediaType.Set (*pmt); - return S_OK; - } - int GetBufferSize(); - -protected: - HRESULT m_hres; - CMediaType m_MediaType; - GstDshowAudioDec *mDec; -}; - -G_END_DECLS - -#endif /* __GST_DSHOWAUDIODEC_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowdecwrapper/gstdshowdecwrapper.cpp
Deleted
@@ -1,79 +0,0 @@ -/* - * GStreamer DirectShow codecs wrapper - * Copyright <2006, 2007, 2008> Fluendo <gstreamer@fluendo.com> - * Copyright <2006, 2007, 2008> Pioneers of the Inevitable <songbird@songbirdnest.com> - * Copyright <2007,2008> Sebastien Moutte <sebastien@moutte.net> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Alternatively, the contents of this file may be used under the - * GNU Lesser General Public License Version 2.1 (the "LGPL"), in - * which case the following provisions apply instead of the ones - * mentioned above: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstdshowaudiodec.h" -#include "gstdshowvideodec.h" - -GST_DEBUG_CATEGORY (dshowdec_debug); -#define GST_CAT_DEFAULT dshowdec_debug - -static gboolean -plugin_init (GstPlugin * plugin) -{ - if (!dshow_adec_register (plugin)) - return FALSE; - - if (!dshow_vdec_register (plugin)) - return FALSE; - - GST_DEBUG_CATEGORY_INIT (dshowdec_debug, "dshowdec", 0, \ - "DirectShow decoder"); - - return TRUE; -} - -extern "C" { - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - dshowdecwrapper, - "DirectShow decoder wrapper plugin", - plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) - -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowdecwrapper/gstdshowdecwrapper.h
Deleted
@@ -1,72 +0,0 @@ -/* - * GStreamer DirectShow codecs wrapper - * Copyright <2006, 2007, 2008> Fluendo <gstreamer@fluendo.com> - * Copyright <2006, 2007, 2008> Pioneers of the Inevitable <songbird@songbirdnest.com> - * Copyright <2007,2008> Sebastien Moutte <sebastien@moutte.net> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Alternatively, the contents of this file may be used under the - * GNU Lesser General Public License Version 2.1 (the "LGPL"), in - * which case the following provisions apply instead of the ones - * mentioned above: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_DSHOW_H__ -#define __GST_DSHOW_H__ - -#include <windows.h> -#include <objbase.h> -#include <dshow.h> -#include <Rpc.h> -#include <glib.h> - -#pragma warning( disable : 4090 4024) - -typedef struct _CodecEntry { - gchar *element_name; - gchar *element_longname; - gchar *preferred_filter_substring; - gint32 format; - GUID input_majortype; - GUID input_subtype; - gchar *sinkcaps; - GUID output_majortype; - GUID output_subtype; - gchar *srccaps; -} CodecEntry; - -#define GUID_TYPE_ANY {0x00000000, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }} - -#endif /* __GST_DSHOW_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowdecwrapper/gstdshowfakesrc.cpp
Deleted
@@ -1,179 +0,0 @@ -/* GStreamer - * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com> - * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> - * - * gstdshowfakesrc.cpp: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "gstdshowfakesrc.h" - -GST_DEBUG_CATEGORY_EXTERN (dshowdec_debug); -#define GST_CAT_DEFAULT dshowdec_debug - -const GUID CLSID_DecodeFakeSrc = -{ 0x039527db, 0x6b48, 0x45a7, { 0xab, 0xcf, 0x21, 0xab, 0xc5, 0x44, 0xbb, 0xb6} }; - -static CCritSec g_pCriticSec; - -/* output pin*/ -FakeOutputPin::FakeOutputPin (CBaseFilter *pFilter, CCritSec *sec): - CBaseOutputPin("FakeOutputPin", pFilter, sec, &m_hres, L"output") -{ -} - -FakeOutputPin::~FakeOutputPin() -{ -} - -HRESULT FakeOutputPin::GetMediaType(int iPosition, - CMediaType *pMediaType) -{ - if(iPosition == 0) { - *pMediaType = m_MediaType; - return S_OK; - } - - return VFW_S_NO_MORE_ITEMS; -} -#if 0 -#define GUID_FORMAT "0x%.8x 0x%.4x 0x%.4x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x" -#define GUID_ARGS(g) g.Data1, g.Data2, g.Data3, \ - g.Data40, g.Data41, g.Data42, g.Data43, \ - g.Data44, g.Data45, g.Data46, g.Data47 - -static void printMediaType (AM_MEDIA_TYPE *mt) -{ - GST_DEBUG (":: majortype: "GUID_FORMAT, GUID_ARGS(mt->majortype)); - GST_DEBUG (":: subtype: "GUID_FORMAT, GUID_ARGS(mt->subtype)); - - GST_DEBUG (":: bFixedSizeSamples: %d", mt->bFixedSizeSamples); - GST_DEBUG (":: bTemporalCompression: %d", mt->bTemporalCompression); - GST_DEBUG (":: cbFormat: %d", mt->cbFormat); - GST_DEBUG (":: formattype: %x", mt->formattype); - GST_DEBUG (":: lSampleSize: %lu", mt->lSampleSize); - GST_DEBUG (":: pbFormat: %p", mt->pbFormat); -} -#endif - -HRESULT FakeOutputPin::CheckMediaType(const CMediaType *pmt) -{ - if (m_MediaType == *pmt) { - return S_OK; - } - - return S_FALSE; -} - -HRESULT FakeOutputPin::DecideBufferSize (IMemAllocator *pAlloc, - ALLOCATOR_PROPERTIES *ppropInputRequest) -{ - ALLOCATOR_PROPERTIES properties; - ppropInputRequest->cbBuffer = m_SampleSize; - ppropInputRequest->cBuffers = 1; - HRESULT hres = pAlloc->SetProperties(ppropInputRequest, &properties); - pAlloc->Commit(); - - return S_OK; -} - -STDMETHODIMP FakeOutputPin::SetMediaType (AM_MEDIA_TYPE *pmt) -{ - m_MediaType.Set (*pmt); - m_SampleSize = m_MediaType.GetSampleSize(); - return S_OK; -} - -STDMETHODIMP FakeOutputPin::PushBuffer(byte *buffer, - __int64 start, __int64 stop, - unsigned int size, bool discont) -{ - IMediaSample *pSample = NULL; - - if (start != -1) { - start /= 100; - stop /= 100; - } - - HRESULT hres = GetDeliveryBuffer(&pSample, NULL, NULL, 0); - if (hres == S_OK && pSample) - { - BYTE *sample_buffer; - pSample->GetPointer(&sample_buffer); - if(sample_buffer) - { - memcpy (sample_buffer, buffer, size); - pSample->SetActualDataLength(size); - } - pSample->SetDiscontinuity(discont); - - pSample->SetSyncPoint(TRUE); - pSample->SetPreroll(FALSE); - - if (start != -1) - pSample->SetTime(&start, &stop); - - hres = Deliver(pSample); - pSample->Release(); - } - else { - GST_WARNING ("unable to obtain a delivery buffer"); - } - - return S_OK; -} - -STDMETHODIMP FakeOutputPin::Flush () -{ - DeliverBeginFlush(); - DeliverEndFlush(); - return S_OK; -} - -STDMETHODIMP FakeOutputPin::SetSampleSize (unsigned int size) -{ - m_SampleSize = size; - return S_OK; -} - -/* filter */ -FakeSrc::FakeSrc() : - CBaseFilter("DshowFakeSink", NULL, &g_pCriticSec, CLSID_DecodeFakeSrc) -{ - m_pOutputPin = new FakeOutputPin((CSource *)this, m_pLock); -} - -FakeSrc::~FakeSrc() -{ - if (m_pOutputPin) - delete m_pOutputPin; -} - -int FakeSrc::GetPinCount() -{ - return 1; -} - -CBasePin *FakeSrc::GetPin(int n) -{ - return (CBasePin *)m_pOutputPin; -} - -FakeOutputPin *FakeSrc::GetOutputPin() -{ - return m_pOutputPin; -} \ No newline at end of file
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowdecwrapper/gstdshowfakesrc.h
Deleted
@@ -1,65 +0,0 @@ -/* GStreamer - * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> - * - * gstdshowfakesrc.h: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef _DSHOWDECWRAPPER_FAKESRC_H_ -#define _DSHOWDECWRAPPER_FAKESRC_H_ - -#include <gst/gst.h> -#include "gstdshowutil.h" - -class FakeOutputPin : public CBaseOutputPin -{ -protected: -/* members */ - HRESULT m_hres; - CMediaType m_MediaType; - unsigned int m_SampleSize; - -public: -/* methods */ - FakeOutputPin (CBaseFilter *pFilter, CCritSec *sec); - ~FakeOutputPin (); - - virtual HRESULT CheckMediaType(const CMediaType *pmt); - HRESULT GetMediaType(int iPosition, CMediaType *pMediaType); - virtual HRESULT DecideBufferSize (IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest); - STDMETHOD (SetMediaType) (AM_MEDIA_TYPE *pmt); - STDMETHOD (PushBuffer) (byte *buffer, __int64 start, __int64 stop, unsigned int size, bool discont); - STDMETHOD (Flush) (); - STDMETHOD (SetSampleSize) (unsigned int size); -}; - -class FakeSrc : public CBaseFilter -{ -public: -/* members */ - FakeOutputPin *m_pOutputPin; - -/* methods */ - FakeSrc (); - virtual ~FakeSrc (); - - virtual int GetPinCount(); - virtual CBasePin *GetPin(int n); - - FakeOutputPin *GetOutputPin(); -}; - -#endif // _DSHOWDECWRAPPER_FAKESRC_H_ \ No newline at end of file
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowdecwrapper/gstdshowutil.cpp
Deleted
@@ -1,138 +0,0 @@ -/* GStreamer - * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> - * - * gstdshow.cpp: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include <dmodshow.h> -#include <dmoreg.h> - -#include "gstdshowutil.h" -#include "gstdshowfakesrc.h" - -_COM_SMARTPTR_TYPEDEF(IDMOWrapperFilter, __uuidof(IDMOWrapperFilter)); - -IPin * -gst_dshow_get_pin_from_filter (IBaseFilter *filter, PIN_DIRECTION pindir) -{ - IEnumPinsPtr enumpins; - IPinPtr pin; - HRESULT hres; - - hres = filter->EnumPins (&enumpins); - if (FAILED(hres)) { - return NULL; - } - - while (enumpins->Next (1, &pin, NULL) == S_OK) - { - PIN_DIRECTION pindirtmp; - hres = pin->QueryDirection (&pindirtmp); - if (hres == S_OK && pindir == pindirtmp) { - return pin; - } - pin.Release(); - } - - return NULL; -} - -IBaseFilter * -gst_dshow_find_filter(CLSID input_majortype, CLSID input_subtype, - CLSID output_majortype, CLSID output_subtype, - PreferredFilter *preferred_filters) -{ - HRESULT hres; - GUID inTypes2; - GUID outTypes2; - IFilterMapper2Ptr mapper; - IEnumMonikerPtr enum_moniker; - IMonikerPtr moniker; - ULONG fetched; - IBaseFilter *filter; - - /* First, see if any of our preferred filters is available. - * If not, we fall back to the highest-ranked installed filter */ - if (preferred_filters) { - while (preferred_filters->filter_guid) - { - /* If the filter is a DMO, we need to do this a bit differently */ - if (preferred_filters->dmo_category) - { - IDMOWrapperFilterPtr wrapper; - - hres = CoCreateInstance (CLSID_DMOWrapperFilter, NULL, - CLSCTX_INPROC, - IID_IBaseFilter, (void **)&filter); - if (SUCCEEDED(hres)) { - hres = filter->QueryInterface (&wrapper); - if (SUCCEEDED(hres)) { - hres = wrapper->Init (*preferred_filters->filter_guid, - *preferred_filters->dmo_category); - if (SUCCEEDED(hres)) - return filter; - } - filter->Release(); - } - } - else - { - hres = CoCreateInstance (*preferred_filters->filter_guid, - NULL, CLSCTX_INPROC, - IID_IBaseFilter, (void **)&filter); - if (SUCCEEDED(hres)) - return filter; - } - - /* Continue to the next filter */ - preferred_filters++; - } - } - - hres = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC, - IID_IFilterMapper2, (void **) &mapper); - if (FAILED(hres)) - return NULL; - - inTypes0 = input_majortype; - inTypes1 = input_subtype; - outTypes0 = output_majortype; - outTypes1 = output_subtype; - - hres = mapper->EnumMatchingFilters (&enum_moniker, 0, - FALSE, MERIT_DO_NOT_USE+1, - TRUE, 1, inTypes, NULL, NULL, FALSE, - TRUE, 1, outTypes, NULL, NULL); - if (FAILED(hres)) - return NULL; - - enum_moniker->Reset (); - - while(enum_moniker->Next (1, &moniker, &fetched) == S_OK) - { - hres = moniker->BindToObject(NULL, NULL, - IID_IBaseFilter, (void**)&filter); - if(SUCCEEDED(hres)) { - return filter; - } - moniker.Release (); - } - - return NULL; -} -
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowdecwrapper/gstdshowutil.h
Deleted
@@ -1,64 +0,0 @@ -/* GStreamer - * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com> - * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> - * - * gstdshow.h: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef _GST_DSHOW_UTIL_H_ -#define _GST_DSHOW_UTIL_H_ - -#include <windows.h> -#include <tchar.h> -#include <comdef.h> -#include <objbase.h> -#include <dshow.h> -#include <Rpc.h> -#include <streams.h> -#include <strmif.h> - -#include <glib.h> - -_COM_SMARTPTR_TYPEDEF(IBaseFilter, __uuidof(IBaseFilter)); -_COM_SMARTPTR_TYPEDEF(IFilterGraph, __uuidof(IFilterGraph)); -_COM_SMARTPTR_TYPEDEF(IFilterMapper2, __uuidof(IFilterMapper2)); -_COM_SMARTPTR_TYPEDEF(IEnumMediaTypes, __uuidof(IEnumMediaTypes)); -_COM_SMARTPTR_TYPEDEF(IEnumMoniker, __uuidof(IEnumMoniker)); -_COM_SMARTPTR_TYPEDEF(IEnumPins, __uuidof(IEnumPins)); -_COM_SMARTPTR_TYPEDEF(IMediaFilter, __uuidof(IMediaFilter)); -_COM_SMARTPTR_TYPEDEF(IMoniker, __uuidof(IMoniker)); -_COM_SMARTPTR_TYPEDEF(IPin, __uuidof(IPin)); - -typedef struct { - const GUID *filter_guid; /* The filter GUID, or DMO GUID */ - const GUID *dmo_category; /* If non-NULL, the filter is a DMO of this - category */ -} PreferredFilter; - -/* get a pin from directshow filter */ -IPin *gst_dshow_get_pin_from_filter (IBaseFilter *filter, PIN_DIRECTION pindir); - -/* find and return a filter according to the input and output types */ -IBaseFilter * -gst_dshow_find_filter(CLSID input_majortype, CLSID input_subtype, - CLSID output_majortype, CLSID output_subtype, - PreferredFilter *preferred_filters); - -#define DSHOW_CODEC_QDATA g_quark_from_string ("dshow-codec") - -#endif /* _GST_DSHOW_UTIL_H_ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowdecwrapper/gstdshowvideodec.cpp
Deleted
@@ -1,1346 +0,0 @@ -/* - * GStreamer DirectShow codecs wrapper - * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com> - * Copyright <2006, 2007, 2008> Pioneers of the Inevitable <songbird@songbirdnest.com> - * Copyright <2007,2008> Sebastien Moutte <sebastien@moutte.net> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Alternatively, the contents of this file may be used under the - * GNU Lesser General Public License Version 2.1 (the "LGPL"), in - * which case the following provisions apply instead of the ones - * mentioned above: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <dmoreg.h> -#include <wmcodecdsp.h> - -#include "gstdshowvideodec.h" -#include <gst/video/video.h> - -GST_DEBUG_CATEGORY_STATIC (dshowvideodec_debug); -#define GST_CAT_DEFAULT dshowvideodec_debug - -#define gst_dshowvideodec_parent_class parent_class -G_DEFINE_TYPE(GstDshowVideoDec, gst_dshowvideodec, GST_TYPE_ELEMENT) - -static void gst_dshowvideodec_finalize (GObject * object); -static GstStateChangeReturn gst_dshowvideodec_change_state - (GstElement * element, GstStateChange transition); - -/* sink pad overwrites */ -static gboolean gst_dshowvideodec_sink_setcaps (GstPad * pad, GstCaps * caps); -static gboolean gst_dshowvideodec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event); -static GstFlowReturn gst_dshowvideodec_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer); - -/* src pad overwrites */ -static GstCaps *gst_dshowvideodec_src_getcaps (GstPad * pad); -static gboolean gst_dshowvideodec_src_setcaps (GstPad * pad, GstCaps * caps); - -/* utils */ -static gboolean gst_dshowvideodec_create_graph_and_filters (GstDshowVideoDec * - vdec); -static gboolean gst_dshowvideodec_destroy_graph_and_filters (GstDshowVideoDec * - vdec); -static gboolean gst_dshowvideodec_flush (GstDshowVideoDec * adec); -static gboolean gst_dshowvideodec_get_filter_output_format (GstDshowVideoDec * - vdec, const GUID subtype, VIDEOINFOHEADER ** format, guint * size); - - -#define GUID_MEDIATYPE_VIDEO {0x73646976, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_WMVV1 {0x31564d57, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_WMVV2 {0x32564d57, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_WMVV3 {0x33564d57, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_WMVP {0x50564d57, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_WMVA {0x41564d57, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_WVC1 {0x31435657, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_CVID {0x64697663, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_MP4S {0x5334504d, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_MP42 {0x3234504d, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_MP43 {0x3334504d, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_M4S2 {0x3253344d, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_XVID {0x44495658, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_DX50 {0x30355844, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_DIVX {0x58564944, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_DIV3 {0x33564944, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} - -#define GUID_MEDIASUBTYPE_MPG4 {0x3447504d, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_MPEG1Payload {0xe436eb81, 0x524f, 0x11ce, {0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}} - - -/* output types */ -#define GUID_MEDIASUBTYPE_YUY2 {0x32595559, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_YV12 {0x32315659, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} -#define GUID_MEDIASUBTYPE_RGB32 {0xe436eb7e, 0x524f, 0x11ce, { 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 }} -#define GUID_MEDIASUBTYPE_RGB565 {0xe436eb7b, 0x524f, 0x11ce, { 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 }} - -/* WMV always uses the WMV DMO */ -static PreferredFilter preferred_wmv_filters = { - {&CLSID_CWMVDecMediaObject, &DMOCATEGORY_VIDEO_DECODER}, {0} -}; - -static const GUID CLSID_AVI_DECOMPRESSOR = - {0xCF49D4E0, 0x1115, 0x11CE, - {0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}}; -static PreferredFilter preferred_cinepack_filters = { - {&CLSID_AVI_DECOMPRESSOR}, {0} -}; - -/* Various MPEG-4 video variants */ -// MPG4, mpg4, MP42, mp42 -static PreferredFilter preferred_mpeg4_filters = { - {&CLSID_CMpeg4DecMediaObject, &DMOCATEGORY_VIDEO_DECODER}, {0}}; -// MP4S, mp4s, M4S2, m4s2 -static PreferredFilter preferred_mp4s_filters = { - {&CLSID_CMpeg4sDecMediaObject, &DMOCATEGORY_VIDEO_DECODER}, {0}}; -// MP43, mp43 -static PreferredFilter preferred_mp43_filters = { - {&CLSID_CMpeg43DecMediaObject, &DMOCATEGORY_VIDEO_DECODER}, {0}}; - -static const GUID CLSID_MPEG_VIDEO_DECODER = - {0xFEB50740, 0x7BEF, 0x11CE, - {0x9B, 0xD9, 0x00, 0x00, 0xE2, 0x02, 0x59, 0x9C}}; -static PreferredFilter preferred_mpeg1_filters = { - {&CLSID_MPEG_VIDEO_DECODER}, {0} -}; - -/* video codecs array */ -static const VideoCodecEntry video_dec_codecs = { - {"dshowvdec_wmv1", "Windows Media Video 7", - GST_MAKE_FOURCC ('W', 'M', 'V', '1'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WMVV1, - "video/x-wmv, wmvversion = (int) 1", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2"), - preferred_wmv_filters}, - - {"dshowvdec_wmv2", "Windows Media Video 8", - GST_MAKE_FOURCC ('W', 'M', 'V', '2'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WMVV2, - "video/x-wmv, wmvversion = (int) 2", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2"), - preferred_wmv_filters}, - - {"dshowvdec_wmv3", "Windows Media Video 9", - GST_MAKE_FOURCC ('W', 'M', 'V', '3'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WMVV3, - "video/x-wmv, wmvversion = (int) 3, " "format = (string) WMV3", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2"), - preferred_wmv_filters}, - - {"dshowvdec_wmvp", "Windows Media Video 9 Image", - GST_MAKE_FOURCC ('W', 'M', 'V', 'P'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WMVP, - "video/x-wmv, wmvversion = (int) 3, " "format = (string) { WMVP, MSS1 }", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2"), - preferred_wmv_filters}, - - {"dshowvdec_wmva", "Windows Media Video 9 Advanced", - GST_MAKE_FOURCC ('W', 'M', 'V', 'A'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WMVA, - "video/x-wmv, wmvversion = (int) 3, " "format = (string) WMVA", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2"), - preferred_wmv_filters}, - - {"dshowvdec_wvc1", "Windows Media VC1 video", - GST_MAKE_FOURCC ('W', 'V', 'C', '1'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WVC1, - "video/x-wmv, wmvversion = (int) 3, " "format = (string) WVC1", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2"), - preferred_wmv_filters}, - - {"dshowvdec_cinepak", "Cinepack", - 0x64697663, - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_CVID, - "video/x-cinepak", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_RGB32, - "video/x-raw, format=(string)RGB, bpp=(int)32, depth=(int)24, " - "endianness=(int)4321, red_mask=(int)65280, " - "green_mask=(int)16711680, blue_mask=(int)-16777216", - preferred_cinepack_filters}, - - {"dshowvdec_msmpeg41", "Microsoft ISO MPEG-4 version 1", - GST_MAKE_FOURCC ('M', 'P', '4', 'S'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_MP4S, - "video/x-msmpeg, msmpegversion=(int)41", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2"), - preferred_mp4s_filters}, - - {"dshowvdec_msmpeg42", "Microsoft ISO MPEG-4 version 2", - GST_MAKE_FOURCC ('M', 'P', '4', '2'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_MP42, - "video/x-msmpeg, msmpegversion=(int)42", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2"), - preferred_mpeg4_filters}, - - {"dshowvdec_msmpeg43", "Microsoft ISO MPEG-4 version 3", - GST_MAKE_FOURCC ('M', 'P', '4', '3'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_MP43, - "video/x-msmpeg, msmpegversion=(int)43", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2"), - preferred_mp43_filters}, - - {"dshowvdec_msmpeg4", "Microsoft ISO MPEG-4 version 1.1", - GST_MAKE_FOURCC ('M', '4', 'S', '2'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_M4S2, - "video/x-msmpeg, msmpegversion=(int)4", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2"), - preferred_mp4s_filters}, - - {"dshowvdec_mpeg1", - "MPEG-1 Video", - GST_MAKE_FOURCC ('M', 'P', 'E', 'G'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_MPEG1Payload, - "video/mpeg, mpegversion= (int) 1, " - "parsed= (boolean) true, " "systemstream= (boolean) false", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2"), - preferred_mpeg1_filters}, - - {"dshowvdec_mpeg4", "MPEG-4 Video", - GST_MAKE_FOURCC ('M', 'P', 'G', '4'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_MPG4, - "video/mpeg, msmpegversion=(int)4", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2"), - preferred_mpeg4_filters}, - - /* The rest of these have no preferred filter; windows doesn't come - * with anything appropriate */ - {"dshowvdec_xvid", "XVID Video", - GST_MAKE_FOURCC ('X', 'V', 'I', 'D'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_XVID, - "video/x-xvid", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2")}, - - {"dshowvdec_divx5", "DIVX 5.0 Video", - GST_MAKE_FOURCC ('D', 'X', '5', '0'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_DX50, - "video/x-divx, divxversion=(int)5", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2")}, - - {"dshowvdec_divx4", "DIVX 4.0 Video", - GST_MAKE_FOURCC ('D', 'I', 'V', 'X'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_DIVX, - "video/x-divx, divxversion=(int)4", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2")}, - - {"dshowvdec_divx3", "DIVX 3.0 Video", - GST_MAKE_FOURCC ('D', 'I', 'V', '3'), - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_MP43, - "video/x-divx, divxversion=(int)3", - GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, - GST_VIDEO_CAPS_MAKE("YUY2")} -}; - -HRESULT VideoFakeSink::DoRenderSample(IMediaSample *pMediaSample) -{ - gboolean in_seg = FALSE; - guint64 clip_start = 0, clip_stop = 0; - GstDshowVideoDecClass *klass = - (GstDshowVideoDecClass *) G_OBJECT_GET_CLASS (mDec); - GstBuffer *buf = NULL; - GstClockTime start, stop; - GstMapInfo map; - - if(pMediaSample) - { - BYTE *pBuffer = NULL; - LONGLONG lStart = 0, lStop = 0; - long size = pMediaSample->GetActualDataLength(); - - pMediaSample->GetPointer(&pBuffer); - pMediaSample->GetTime(&lStart, &lStop); - - start = lStart * 100; - stop = lStop * 100; - /* check if this buffer is in our current segment */ - in_seg = gst_segment_clip (mDec->segment, GST_FORMAT_TIME, - start, stop, &clip_start, &clip_stop); - - /* if the buffer is out of segment do not push it downstream */ - if (!in_seg) { - GST_DEBUG_OBJECT (mDec, - "buffer is out of segment, start %" GST_TIME_FORMAT " stop %" - GST_TIME_FORMAT, GST_TIME_ARGS (start), GST_TIME_ARGS (stop)); - goto done; - } - - /* buffer is in our segment, allocate a new out buffer and clip its - * timestamps */ - gst_buffer_pool_acquire_buffer(mDec->buffer_pool, &buf, NULL); - if (!buf) { - GST_WARNING_OBJECT (mDec, - "cannot allocate a new GstBuffer"); - goto done; - } - - /* set buffer properties */ - GST_BUFFER_TIMESTAMP (buf) = clip_start; - GST_BUFFER_DURATION (buf) = clip_stop - clip_start; - - gst_buffer_map(buf, &map, GST_MAP_WRITE); - if (strstr (klass->entry->srccaps, "rgb")) { - /* FOR RGB directshow decoder will return bottom-up BITMAP - * There is probably a way to get top-bottom video frames from - * the decoder... - */ - gint line = 0; - guint stride = mDec->width * 4; - - for (; line < mDec->height; line++) { - memcpy (map.data + (line * stride), - pBuffer + (size - ((line + 1) * (stride))), stride); - } - } else { - memcpy (map.data, pBuffer, MIN ((unsigned int)size, map.size)); - } - gst_buffer_unmap(buf, &map); - - GST_LOG_OBJECT (mDec, - "push_buffer (size %d)=> pts %" GST_TIME_FORMAT " stop %" GST_TIME_FORMAT - " duration %" GST_TIME_FORMAT, size, - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf)), - GST_TIME_ARGS (GST_BUFFER_DURATION (buf))); - - /* push the buffer downstream */ - mDec->last_ret = gst_pad_push (mDec->srcpad, buf); - } -done: - - return S_OK; -} - -HRESULT VideoFakeSink::CheckMediaType(const CMediaType *pmt) -{ - if (pmt != NULL) { - if (*pmt == m_MediaType) - return S_OK; - } - - return S_FALSE; -} - -static void -gst_dshowvideodec_base_init (gpointer klass) -{ - GstDshowVideoDecClass *videodec_class = (GstDshowVideoDecClass *) klass; - GstPadTemplate *src, *sink; - GstCaps *srccaps, *sinkcaps; - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - const VideoCodecEntry *tmp; - gpointer qdata; - gchar *longname, *description; - - qdata = g_type_get_qdata (G_OBJECT_CLASS_TYPE (klass), DSHOW_CODEC_QDATA); - - /* element details */ - tmp = videodec_class->entry = (VideoCodecEntry *) qdata; - - longname = g_strdup_printf ("DirectShow %s Decoder Wrapper", - tmp->element_longname); - description = g_strdup_printf ("DirectShow %s Decoder Wrapper", - tmp->element_longname); - - gst_element_class_set_metadata(element_class, longname, "Codec/Decoder/Video", description, - "Sebastien Moutte <sebastien@moutte.net>"); - - g_free (longname); - g_free (description); - - sinkcaps = gst_caps_from_string (tmp->sinkcaps); - gst_caps_set_simple (sinkcaps, - "width", GST_TYPE_INT_RANGE, 16, 4096, - "height", GST_TYPE_INT_RANGE, 16, 4096, - "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); - - srccaps = gst_caps_from_string (tmp->srccaps); - - sink = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, sinkcaps); - src = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, srccaps); - - gst_element_class_add_pad_template (element_class, src); - gst_element_class_add_pad_template (element_class, sink); - - if (sinkcaps) - gst_caps_unref(sinkcaps); - - if (srccaps) - gst_caps_unref(srccaps); -} - -static void -gst_dshowvideodec_class_init (GstDshowVideoDecClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); - - gobject_class->finalize = gst_dshowvideodec_finalize; - - gstelement_class->change_state = - GST_DEBUG_FUNCPTR (gst_dshowvideodec_change_state); - - parent_class = (GstElementClass *) g_type_class_peek_parent (klass); -} - -static void -gst_dshowvideodec_com_thread (GstDshowVideoDec * vdec) -{ - HRESULT res; - - g_mutex_lock (&vdec->com_init_lock); - - /* Initialize COM with a MTA for this process. This thread will - * be the first one to enter the apartement and the last one to leave - * it, unitializing COM properly */ - - res = CoInitializeEx (0, COINIT_MULTITHREADED); - if (res == S_FALSE) - GST_WARNING_OBJECT (vdec, "COM has been already initialized in the same process"); - else if (res == RPC_E_CHANGED_MODE) - GST_WARNING_OBJECT (vdec, "The concurrency model of COM has changed."); - else - GST_INFO_OBJECT (vdec, "COM initialized successfully"); - - vdec->comInitialized = TRUE; - - /* Signal other threads waiting on this condition that COM was initialized */ - g_cond_signal (&vdec->com_initialized); - - g_mutex_unlock (&vdec->com_init_lock); - - /* Wait until the uninitialize condition is met to leave the COM apartement */ - g_mutex_lock (&vdec->com_deinit_lock); - g_cond_wait (&vdec->com_uninitialize, &vdec->com_deinit_lock); - - CoUninitialize (); - GST_INFO_OBJECT (vdec, "COM uninitialized successfully"); - vdec->comInitialized = FALSE; - g_cond_signal (&vdec->com_uninitialized); - g_mutex_unlock (&vdec->com_deinit_lock); -} - -static void -gst_dshowvideodec_init (GstDshowVideoDec * vdec) -{ - GstElementClass *element_class = GST_ELEMENT_GET_CLASS (vdec); - - /* setup pads */ - vdec->sinkpad = - gst_pad_new_from_template (gst_element_class_get_pad_template - (element_class, "sink"), "sink"); - - gst_pad_set_event_function (vdec->sinkpad, gst_dshowvideodec_sink_event); - gst_pad_set_chain_function (vdec->sinkpad, gst_dshowvideodec_chain); - gst_element_add_pad (GST_ELEMENT (vdec), vdec->sinkpad); - - vdec->srcpad = - gst_pad_new_from_template (gst_element_class_get_pad_template - (element_class, "src"), "src"); -/* needed to implement caps negotiation on our src pad */ -/* gst_pad_set_getcaps_function (vdec->srcpad, gst_dshowvideodec_src_getcaps); - gst_pad_set_setcaps_function (vdec->srcpad, gst_dshowvideodec_src_setcaps);*/ - gst_element_add_pad (GST_ELEMENT (vdec), vdec->srcpad); - - vdec->fakesrc = NULL; - vdec->fakesink = NULL; - vdec->decfilter = NULL; - - vdec->last_ret = GST_FLOW_OK; - - vdec->filtergraph = NULL; - vdec->mediafilter = NULL; - vdec->srccaps = NULL; - vdec->segment = gst_segment_new (); - - vdec->setup = FALSE; - vdec->buffer_pool = NULL; - - g_mutex_init (&vdec->com_init_lock); - g_mutex_init (&vdec->com_deinit_lock); - g_cond_init (&vdec->com_initialized); - g_cond_init (&vdec->com_uninitialize); - g_cond_init (&vdec->com_uninitialized); - - g_mutex_lock (&vdec->com_init_lock); - - /* create the COM initialization thread */ - g_thread_new ("COM Init Thread", (GThreadFunc)gst_dshowvideodec_com_thread, - vdec); - - /* wait until the COM thread signals that COM has been initialized */ - g_cond_wait (&vdec->com_initialized, &vdec->com_init_lock); - g_mutex_unlock (&vdec->com_init_lock); -} - -static void -gst_dshowvideodec_finalize (GObject * object) -{ - GstDshowVideoDec *vdec = (GstDshowVideoDec *) (object); - - if (vdec->segment) { - gst_segment_free (vdec->segment); - vdec->segment = NULL; - } - - if(vdec->buffer_pool) { - gst_object_unref(vdec->buffer_pool); - vdec->buffer_pool = NULL; - } - - /* signal the COM thread that it sould uninitialize COM */ - if (vdec->comInitialized) { - g_mutex_lock (&vdec->com_deinit_lock); - g_cond_signal (&vdec->com_uninitialize); - g_cond_wait (&vdec->com_uninitialized, &vdec->com_deinit_lock); - g_mutex_unlock (&vdec->com_deinit_lock); - } - - g_mutex_clear (&vdec->com_init_lock); - g_mutex_clear (&vdec->com_deinit_lock); - g_cond_clear (&vdec->com_initialized); - g_cond_clear (&vdec->com_uninitialize); - g_cond_clear (&vdec->com_uninitialized); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static GstStateChangeReturn -gst_dshowvideodec_change_state (GstElement * element, GstStateChange transition) -{ - GstDshowVideoDec *vdec = (GstDshowVideoDec *) (element); - - switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY: - if (!gst_dshowvideodec_create_graph_and_filters (vdec)) - return GST_STATE_CHANGE_FAILURE; - break; - case GST_STATE_CHANGE_READY_TO_PAUSED: - break; - case GST_STATE_CHANGE_PAUSED_TO_PLAYING: - break; - case GST_STATE_CHANGE_PLAYING_TO_PAUSED: - break; - case GST_STATE_CHANGE_PAUSED_TO_READY: - break; - case GST_STATE_CHANGE_READY_TO_NULL: - if (!gst_dshowvideodec_destroy_graph_and_filters (vdec)) - return GST_STATE_CHANGE_FAILURE; - break; - default: - break; - } - - return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); -} - -static gboolean -gst_dshowvideodec_sink_setcaps (GstPad * pad, GstCaps * caps) -{ - gboolean ret = FALSE; - HRESULT hres; - GstStructure *s = gst_caps_get_structure (caps, 0); - GstDshowVideoDec *vdec = (GstDshowVideoDec *) gst_pad_get_parent (pad); - GstDshowVideoDecClass *klass = - (GstDshowVideoDecClass *) G_OBJECT_GET_CLASS (vdec); - GstBuffer *extradata = NULL; - gsize extra_size; - const GValue *v = NULL; - guint size = 0; - GstCaps *caps_out = NULL; - AM_MEDIA_TYPE output_mediatype, input_mediatype; - VIDEOINFOHEADER *input_vheader = NULL, *output_vheader = NULL; - IPinPtr output_pin; - IPinPtr input_pin; - IBaseFilter *srcfilter = NULL; - IBaseFilter *sinkfilter = NULL; - const GValue *fps, *par; - GstQuery *query = NULL; - GstBufferPool *pool = NULL; - GstStructure *pool_config = NULL; - guint pool_size, pool_min, pool_max; - GstVideoInfo video_info; - - /* read data */ - if (!gst_structure_get_int (s, "width", &vdec->width) || - !gst_structure_get_int (s, "height", &vdec->height)) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("error getting video width or height from caps"), (NULL)); - goto end; - } - fps = gst_structure_get_value (s, "framerate"); - if (fps) { - vdec->fps_n = gst_value_get_fraction_numerator (fps); - vdec->fps_d = gst_value_get_fraction_denominator (fps); - } - else { - /* Invent a sane default framerate; the timestamps matter - * more anyway. */ - vdec->fps_n = 25; - vdec->fps_d = 1; - } - - par = gst_structure_get_value (s, "pixel-aspect-ratio"); - if (par) { - vdec->par_n = gst_value_get_fraction_numerator (par); - vdec->par_d = gst_value_get_fraction_denominator (par); - } - else { - vdec->par_n = vdec->par_d = 1; - } - - if ((v = gst_structure_get_value (s, "codec_data"))) { - extradata = gst_value_get_buffer (v); - extra_size = gst_buffer_get_size(extradata); - } - - /* define the input type format */ - memset (&input_mediatype, 0, sizeof (AM_MEDIA_TYPE)); - input_mediatype.majortype = klass->entry->input_majortype; - input_mediatype.subtype = klass->entry->input_subtype; - input_mediatype.bFixedSizeSamples = FALSE; - input_mediatype.bTemporalCompression = TRUE; - - if (strstr (klass->entry->sinkcaps, "video/mpeg, mpegversion= (int) 1")) { - size = - sizeof (MPEG1VIDEOINFO) + (extradata ? extra_size - 1 : 0); - input_vheader = (VIDEOINFOHEADER *)g_malloc0 (size); - - input_vheader->bmiHeader.biSize = sizeof (BITMAPINFOHEADER); - if (extradata) { - MPEG1VIDEOINFO *mpeg_info = (MPEG1VIDEOINFO *) input_vheader; - - gst_buffer_extract(extradata, 0, mpeg_info->bSequenceHeader, extra_size); - mpeg_info->cbSequenceHeader = extra_size; - } - input_mediatype.formattype = FORMAT_MPEGVideo; - } else { - size = - sizeof (VIDEOINFOHEADER) + (extradata ? extra_size : 0); - input_vheader = (VIDEOINFOHEADER *)g_malloc0 (size); - input_vheader->bmiHeader.biSize = sizeof (BITMAPINFOHEADER); - - if (extradata) { /* Codec data is appended after our header */ - gst_buffer_extract(extradata, 0, - ((guchar *) input_vheader) + sizeof (VIDEOINFOHEADER), extra_size); - input_vheader->bmiHeader.biSize += extra_size; - } - input_mediatype.formattype = FORMAT_VideoInfo; - } - - input_vheader->rcSource.top = input_vheader->rcSource.left = 0; - input_vheader->rcSource.right = vdec->width; - input_vheader->rcSource.bottom = vdec->height; - input_vheader->rcTarget = input_vheader->rcSource; - input_vheader->bmiHeader.biWidth = vdec->width; - input_vheader->bmiHeader.biHeight = vdec->height; - input_vheader->bmiHeader.biPlanes = 1; - input_vheader->bmiHeader.biBitCount = 16; - input_vheader->bmiHeader.biCompression = klass->entry->format; - input_vheader->bmiHeader.biSizeImage = - (vdec->width * vdec->height) * (input_vheader->bmiHeader.biBitCount / 8); - - input_mediatype.cbFormat = size; - input_mediatype.pbFormat = (BYTE *) input_vheader; - input_mediatype.lSampleSize = input_vheader->bmiHeader.biSizeImage; - - vdec->fakesrc->GetOutputPin()->SetMediaType(&input_mediatype); - - /* set the sample size for fakesrc filter to the output buffer size */ - vdec->fakesrc->GetOutputPin()->SetSampleSize(input_mediatype.lSampleSize); - - /* connect our fake src to decoder */ - hres = vdec->fakesrc->QueryInterface(IID_IBaseFilter, - (void **) &srcfilter); - if (FAILED (hres)) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("Can't QT fakesrc to IBaseFilter: %x", hres), (NULL)); - goto end; - } - - output_pin = gst_dshow_get_pin_from_filter (srcfilter, PINDIR_OUTPUT); - if (!output_pin) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("Can't get output pin from our directshow fakesrc filter"), (NULL)); - goto end; - } - input_pin = gst_dshow_get_pin_from_filter (vdec->decfilter, PINDIR_INPUT); - if (!input_pin) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("Can't get input pin from decoder filter"), (NULL)); - goto end; - } - - hres = vdec->filtergraph->ConnectDirect (output_pin, input_pin, NULL); - if (hres != S_OK) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("Can't connect fakesrc with decoder (error=%x)", hres), (NULL)); - goto end; - } - - /* get decoder output video format */ - if (!gst_dshowvideodec_get_filter_output_format (vdec, - klass->entry->output_subtype, &output_vheader, &size)) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("Can't get decoder output video format"), (NULL)); - goto end; - } - - memset (&output_mediatype, 0, sizeof (AM_MEDIA_TYPE)); - output_mediatype.majortype = klass->entry->output_majortype; - output_mediatype.subtype = klass->entry->output_subtype; - output_mediatype.bFixedSizeSamples = TRUE; - output_mediatype.bTemporalCompression = FALSE; - output_mediatype.lSampleSize = output_vheader->bmiHeader.biSizeImage; - output_mediatype.formattype = FORMAT_VideoInfo; - output_mediatype.cbFormat = size; - output_mediatype.pbFormat = (BYTE *) output_vheader; - - vdec->fakesink->SetMediaType (&output_mediatype); - - /* connect decoder to our fake sink */ - output_pin = gst_dshow_get_pin_from_filter (vdec->decfilter, PINDIR_OUTPUT); - if (!output_pin) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("Can't get output pin from our decoder filter"), (NULL)); - goto end; - } - - hres = vdec->fakesink->QueryInterface(IID_IBaseFilter, - (void **) &sinkfilter); - if (FAILED (hres)) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("Can't QT fakesink to IBaseFilter: %x", hres), (NULL)); - goto end; - } - - input_pin = gst_dshow_get_pin_from_filter (sinkfilter, PINDIR_INPUT); - if (!input_pin) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("Can't get input pin from our directshow fakesink filter"), (NULL)); - goto end; - } - - hres = vdec->filtergraph->ConnectDirect(output_pin, input_pin, - &output_mediatype); - if (hres != S_OK) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("Can't connect decoder with fakesink (error=%x)", hres), (NULL)); - goto end; - } - - /* negotiate output */ - caps_out = gst_caps_from_string (klass->entry->srccaps); - gst_caps_set_simple (caps_out, - "width", G_TYPE_INT, vdec->width, - "height", G_TYPE_INT, vdec->height, NULL); - - if (vdec->fps_n && vdec->fps_d) { - gst_caps_set_simple (caps_out, - "framerate", GST_TYPE_FRACTION, vdec->fps_n, vdec->fps_d, NULL); - } - - gst_caps_set_simple (caps_out, - "pixel-aspect-ratio", GST_TYPE_FRACTION, vdec->par_n, vdec->par_d, NULL); - - if (!gst_pad_set_caps (vdec->srcpad, caps_out)) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("Failed to negotiate output"), (NULL)); - goto end; - } - - /* request or create a buffer pool */ - if (vdec->buffer_pool) { - gst_object_unref (vdec->buffer_pool); - } - - query = gst_query_new_allocation(caps_out, TRUE); - gst_pad_peer_query(vdec->srcpad, query); - - if (gst_query_get_n_allocation_pools (query) > 0) { - gst_query_parse_nth_allocation_pool (query, 0, &pool, &pool_size, &pool_min, - &pool_max); - } - else { - pool = NULL; - pool_size = output_mediatype.lSampleSize; - pool_min = 1; - pool_max = 0; - } - - if (pool == NULL) { - pool = gst_video_buffer_pool_new (); - } - - if (!pool) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("Could not create buffer bool"), (NULL)); - goto end; - } - - pool_config = gst_buffer_pool_get_config (pool); - gst_buffer_pool_config_set_params (pool_config, caps_out, pool_size, - pool_min, pool_max); - gst_buffer_pool_set_config (pool, pool_config); - - if (!gst_buffer_pool_set_active (pool, TRUE)) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("Failed set buffer pool active"), (NULL)); - goto end; - } - - vdec->buffer_pool = pool; - - hres = vdec->mediafilter->Run (-1); - if (hres != S_OK) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("Can't run the directshow graph (error=%d)", hres), (NULL)); - goto end; - } - - ret = TRUE; -end: - if (caps_out) - gst_caps_unref (caps_out); - gst_object_unref (vdec); - g_free (input_vheader); - if (srcfilter) - srcfilter->Release(); - if (sinkfilter) - sinkfilter->Release(); - if (query) - gst_query_unref(query); - return ret; -} - -static gboolean -gst_dshowvideodec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) -{ - gboolean ret = TRUE; - GstDshowVideoDec *vdec = (GstDshowVideoDec *) gst_pad_get_parent (pad); - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_CAPS: - GstCaps *caps; - gst_event_parse_caps(event, &caps); - ret = gst_dshowvideodec_sink_setcaps(pad, caps); - break; - - case GST_EVENT_FLUSH_STOP: - gst_dshowvideodec_flush (vdec); - ret = gst_pad_event_default (pad, parent, event); - break; - case GST_EVENT_SEGMENT: - { - const GstSegment *segment; - - gst_event_parse_segment (event, &segment); - - /* save the new segment in our local current segment */ - gst_segment_copy_into(segment, vdec->segment); - - GST_CAT_DEBUG_OBJECT (dshowvideodec_debug, vdec, - "new segment received => start=%" GST_TIME_FORMAT " stop=%" - GST_TIME_FORMAT, GST_TIME_ARGS (vdec->segment->start), - GST_TIME_ARGS (vdec->segment->stop)); - - ret = gst_pad_event_default (pad, parent, event); - break; - } - default: - ret = gst_pad_event_default (pad, parent, event); - break; - } - - gst_object_unref (vdec); - - return ret; -} - -static GstFlowReturn -gst_dshowvideodec_chain (GstPad * pad, GstObject *parent, GstBuffer * buffer) -{ - GstDshowVideoDec *vdec = (GstDshowVideoDec *) gst_pad_get_parent (pad); - bool discont = FALSE; - GstClockTime stop; - GstMapInfo map; - - if (!vdec->setup) { - /* we are not setup */ - GST_WARNING_OBJECT (vdec, "Decoder not set up, failing"); - vdec->last_ret = GST_FLOW_FLUSHING; - goto beach; - } - - if (vdec->last_ret != GST_FLOW_OK) { - GST_DEBUG_OBJECT (vdec, "last decoding iteration generated a fatal error " - "%s", gst_flow_get_name (vdec->last_ret)); - goto beach; - } - - /* check if duration is valid and use duration only when it's valid - /* because dshow is not decoding frames having stop smaller than start */ - if (GST_BUFFER_DURATION_IS_VALID (buffer)) { - stop = GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer); - } else { - stop = GST_BUFFER_TIMESTAMP (buffer); - } - - GST_CAT_LOG_OBJECT (dshowvideodec_debug, vdec, - "chain (size %d)=> pts %" GST_TIME_FORMAT " stop %" GST_TIME_FORMAT, - gst_buffer_get_size (buffer), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), - GST_TIME_ARGS (stop)); - - /* if the incoming buffer has discont flag set => flush decoder data */ - if (buffer && GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) { - GST_CAT_DEBUG_OBJECT (dshowvideodec_debug, vdec, - "this buffer has a DISCONT flag (%" GST_TIME_FORMAT "), flushing", - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); - gst_dshowvideodec_flush (vdec); - discont = TRUE; - } - - gst_buffer_map(buffer, &map, GST_MAP_READ); - /* push the buffer to the directshow decoder */ - vdec->fakesrc->GetOutputPin()->PushBuffer( - map.data, GST_BUFFER_TIMESTAMP (buffer), stop, - map.size, discont); - gst_buffer_unmap(buffer, &map); - -beach: - gst_buffer_unref (buffer); - gst_object_unref (vdec); - - return vdec->last_ret; -} - -static GstCaps * -gst_dshowvideodec_src_getcaps (GstPad * pad) -{ - GstDshowVideoDec *vdec = (GstDshowVideoDec *) gst_pad_get_parent (pad); - GstCaps *caps = NULL; - - if (!vdec->srccaps) - vdec->srccaps = gst_caps_new_empty (); - - if (vdec->decfilter) { - IPinPtr output_pin; - IEnumMediaTypesPtr enum_mediatypes; - HRESULT hres; - ULONG fetched; - - output_pin = gst_dshow_get_pin_from_filter (vdec->decfilter, PINDIR_OUTPUT); - if (!output_pin) { - GST_ELEMENT_ERROR (vdec, STREAM, FAILED, - ("failed getting output pin from the decoder"), (NULL)); - goto beach; - } - - hres = output_pin->EnumMediaTypes (&enum_mediatypes); - if (hres == S_OK && enum_mediatypes) { - AM_MEDIA_TYPE *mediatype = NULL; - - enum_mediatypes->Reset(); - while (hres = - enum_mediatypes->Next(1, &mediatype, &fetched), - hres == S_OK) - { - VIDEOINFOHEADER *video_info; - GstCaps *mediacaps = NULL; - - /* RGB24 */ - if (IsEqualGUID (mediatype->subtype, MEDIASUBTYPE_RGB24) && - IsEqualGUID (mediatype->formattype, FORMAT_VideoInfo)) - { - video_info = (VIDEOINFOHEADER *) mediatype->pbFormat; - - /* ffmpegcolorspace handles RGB24 in BIG_ENDIAN */ - mediacaps = gst_caps_new_simple ("video/x-raw-rgb", - "bpp", G_TYPE_INT, 24, - "depth", G_TYPE_INT, 24, - "width", G_TYPE_INT, video_info->bmiHeader.biWidth, - "height", G_TYPE_INT, video_info->bmiHeader.biHeight, - "framerate", GST_TYPE_FRACTION, - (int) (10000000 / video_info->AvgTimePerFrame), 1, "endianness", - G_TYPE_INT, G_BIG_ENDIAN, "red_mask", G_TYPE_INT, 255, - "green_mask", G_TYPE_INT, 65280, "blue_mask", G_TYPE_INT, - 16711680, NULL); - - if (mediacaps) { - vdec->mediatypes = g_list_append (vdec->mediatypes, mediatype); - gst_caps_append (vdec->srccaps, mediacaps); - } else { - DeleteMediaType (mediatype); - } - } else { - DeleteMediaType (mediatype); - } - - } - } - } - - if (vdec->srccaps) - caps = gst_caps_ref (vdec->srccaps); - -beach: - gst_object_unref (vdec); - - return caps; -} - -static gboolean -gst_dshowvideodec_src_setcaps (GstPad * pad, GstCaps * caps) -{ - gboolean ret = FALSE; - - return ret; -} - -static gboolean -gst_dshowvideodec_flush (GstDshowVideoDec * vdec) -{ - if (!vdec->fakesrc) - return FALSE; - - /* flush dshow decoder and reset timestamp */ - vdec->fakesrc->GetOutputPin()->Flush(); - vdec->last_ret = GST_FLOW_OK; - - return TRUE; -} - -static gboolean -gst_dshowvideodec_get_filter_output_format (GstDshowVideoDec * vdec, - const GUID subtype, VIDEOINFOHEADER ** format, guint * size) -{ - IPinPtr output_pin; - IEnumMediaTypesPtr enum_mediatypes; - HRESULT hres; - ULONG fetched; - BOOL ret = FALSE; - - if (!vdec->decfilter) - return FALSE; - - output_pin = gst_dshow_get_pin_from_filter (vdec->decfilter, PINDIR_OUTPUT); - if (!output_pin) { - GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, - ("failed getting output pin from the decoder"), (NULL)); - return FALSE; - } - - hres = output_pin->EnumMediaTypes (&enum_mediatypes); - if (hres == S_OK && enum_mediatypes) { - AM_MEDIA_TYPE *mediatype = NULL; - - enum_mediatypes->Reset(); - while (hres = - enum_mediatypes->Next(1, &mediatype, &fetched), - hres == S_OK) - { - if (IsEqualGUID (mediatype->subtype, subtype) && - IsEqualGUID (mediatype->formattype, FORMAT_VideoInfo)) - { - *size = mediatype->cbFormat; - *format = (VIDEOINFOHEADER *)g_malloc0 (*size); - memcpy (*format, mediatype->pbFormat, *size); - ret = TRUE; - } - DeleteMediaType (mediatype); - if (ret) - break; - } - } - - return ret; -} - -static gboolean -gst_dshowvideodec_create_graph_and_filters (GstDshowVideoDec * vdec) -{ - HRESULT hres = S_FALSE; - GstDshowVideoDecClass *klass = - (GstDshowVideoDecClass *) G_OBJECT_GET_CLASS (vdec); - IBaseFilter *srcfilter = NULL; - IBaseFilter *sinkfilter = NULL; - gboolean ret = FALSE; - - /* create the filter graph manager object */ - hres = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC, - IID_IFilterGraph, (LPVOID *) & vdec->filtergraph); - if (hres != S_OK || !vdec->filtergraph) { - GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't create an instance " - "of the directshow graph manager (error=%d)", hres), (NULL)); - goto error; - } - - hres = vdec->filtergraph->QueryInterface(IID_IMediaFilter, - (void **) &vdec->mediafilter); - if (hres != S_OK || !vdec->mediafilter) { - GST_ELEMENT_ERROR (vdec, STREAM, FAILED, - ("Can't get IMediacontrol interface " - "from the graph manager (error=%d)", hres), (NULL)); - goto error; - } - - /* create fake src filter */ - vdec->fakesrc = new FakeSrc(); - /* Created with a refcount of zero, so increment that */ - vdec->fakesrc->AddRef(); - - hres = vdec->fakesrc->QueryInterface(IID_IBaseFilter, - (void **) &srcfilter); - if (FAILED (hres)) { - GST_WARNING_OBJECT (vdec, "Failed to QI fakesrc to IBaseFilter"); - goto error; - } - - /* search a decoder filter and create it */ - vdec->decfilter = gst_dshow_find_filter ( - klass->entry->input_majortype, - klass->entry->input_subtype, - klass->entry->output_majortype, - klass->entry->output_subtype, - klass->entry->preferred_filters); - if (vdec->decfilter == NULL) { - GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't create an instance " - "of the decoder filter"), (NULL)); - goto error; - } - - /* create fake sink filter */ - vdec->fakesink = new VideoFakeSink(vdec); - /* Created with a refcount of zero, so increment that */ - vdec->fakesink->AddRef(); - - hres = vdec->fakesink->QueryInterface(IID_IBaseFilter, - (void **) &sinkfilter); - if (FAILED (hres)) { - GST_WARNING_OBJECT (vdec, "Failed to QI fakesink to IBaseFilter"); - goto error; - } - - /* add filters to the graph */ - hres = vdec->filtergraph->AddFilter (srcfilter, L"src"); - if (hres != S_OK) { - GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't add fakesrc filter " - "to the graph (error=%d)", hres), (NULL)); - goto error; - } - - hres = vdec->filtergraph->AddFilter(vdec->decfilter, L"decoder"); - if (hres != S_OK) { - GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't add decoder filter " - "to the graph (error=%d)", hres), (NULL)); - goto error; - } - - hres = vdec->filtergraph->AddFilter(sinkfilter, L"sink"); - if (hres != S_OK) { - GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't add fakesink filter " - "to the graph (error=%d)", hres), (NULL)); - goto error; - } - - vdec->setup = TRUE; - - ret = TRUE; - -done: - if (srcfilter) - srcfilter->Release(); - if (sinkfilter) - sinkfilter->Release(); - return ret; - -error: - if (vdec->fakesrc) { - vdec->fakesrc->Release(); - vdec->fakesrc = NULL; - } - if (vdec->decfilter) { - vdec->decfilter->Release(); - vdec->decfilter = NULL; - } - if (vdec->fakesink) { - vdec->fakesink->Release(); - vdec->fakesink = NULL; - } - if (vdec->mediafilter) { - vdec->mediafilter->Release(); - vdec->mediafilter = NULL; - } - if (vdec->filtergraph) { - vdec->filtergraph->Release(); - vdec->filtergraph = NULL; - } - - goto done; -} - -static gboolean -gst_dshowvideodec_destroy_graph_and_filters (GstDshowVideoDec * vdec) -{ - HRESULT hres; - - if (vdec->mediafilter) { - vdec->mediafilter->Stop(); - } - - if (vdec->fakesrc) { - if (vdec->filtergraph) { - IBaseFilter *filter; - hres = vdec->fakesrc->QueryInterface(IID_IBaseFilter, - (void **) &filter); - if (SUCCEEDED (hres)) { - vdec->filtergraph->RemoveFilter(filter); - filter->Release(); - } - } - - vdec->fakesrc->Release(); - vdec->fakesrc = NULL; - } - if (vdec->decfilter) { - if (vdec->filtergraph) - vdec->filtergraph->RemoveFilter(vdec->decfilter); - vdec->decfilter->Release(); - vdec->decfilter = NULL; - } - if (vdec->fakesink) { - if (vdec->filtergraph) { - IBaseFilter *filter; - hres = vdec->fakesink->QueryInterface(IID_IBaseFilter, - (void **) &filter); - if (SUCCEEDED (hres)) { - vdec->filtergraph->RemoveFilter(filter); - filter->Release(); - } - } - - vdec->fakesink->Release(); - vdec->fakesink = NULL; - } - if (vdec->mediafilter) { - vdec->mediafilter->Release(); - vdec->mediafilter = NULL; - } - if (vdec->filtergraph) { - vdec->filtergraph->Release(); - vdec->filtergraph = NULL; - } - - vdec->setup = FALSE; - - return TRUE; -} - -gboolean -dshow_vdec_register (GstPlugin * plugin) -{ - GTypeInfo info = { - sizeof (GstDshowVideoDecClass), - (GBaseInitFunc) gst_dshowvideodec_base_init, - NULL, - (GClassInitFunc) gst_dshowvideodec_class_init, - NULL, - NULL, - sizeof (GstDshowVideoDec), - 0, - (GInstanceInitFunc) gst_dshowvideodec_init, - }; - gint i; - HRESULT hr; - - GST_DEBUG_CATEGORY_INIT (dshowvideodec_debug, "dshowvideodec", 0, - "Directshow filter video decoder"); - - hr = CoInitialize (0); - - for (i = 0; i < sizeof (video_dec_codecs) / sizeof (VideoCodecEntry); i++) { - GType type; - IBaseFilterPtr filter; - guint rank = GST_RANK_MARGINAL; - - filter = gst_dshow_find_filter ( - video_dec_codecsi.input_majortype, - video_dec_codecsi.input_subtype, - video_dec_codecsi.output_majortype, - video_dec_codecsi.output_subtype, - video_dec_codecsi.preferred_filters); - if (filter != NULL) { - - if (video_dec_codecsi.format == GST_MAKE_FOURCC ('W', 'V', 'C', '1')) { - /* FFMPEG WVC1 decoder sucks, get higher priority for ours */ - rank = GST_RANK_MARGINAL + 2; - } - GST_DEBUG ("Registering %s with rank %u", video_dec_codecsi.element_name, rank); - - type = g_type_register_static (GST_TYPE_ELEMENT, - video_dec_codecsi.element_name, &info, (GTypeFlags)0); - g_type_set_qdata (type, DSHOW_CODEC_QDATA, (gpointer) (video_dec_codecs + i)); - if (!gst_element_register (plugin, video_dec_codecsi.element_name, rank, type)) { - return FALSE; - } - GST_DEBUG ("Registered %s", video_dec_codecsi.element_name); - } else { - GST_DEBUG ("Element %s not registered " - "(the format is not supported by the system)", - video_dec_codecsi.element_name); - } - } - - if (SUCCEEDED(hr)) - CoUninitialize (); - - return TRUE; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowdecwrapper/gstdshowvideodec.h
Deleted
@@ -1,163 +0,0 @@ -/* - * GStreamer DirectShow codecs wrapper - * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com> - * Copyright <2006, 2007, 2008> Pioneers of the Inevitable <songbird@songbirdnest.com> - * Copyright <2007,2008> Sebastien Moutte <sebastien@moutte.net> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Alternatively, the contents of this file may be used under the - * GNU Lesser General Public License Version 2.1 (the "LGPL"), in - * which case the following provisions apply instead of the ones - * mentioned above: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_DSHOWVIDEODEC_H__ -#define __GST_DSHOWVIDEODEC_H__ - -#include <gst/gst.h> -#include "gstdshowutil.h" -#include "gstdshowfakesrc.h" - -G_BEGIN_DECLS - -typedef struct { - gchar *element_name; /* The gst element factory name */ - gchar *element_longname; /* Description string for element */ - gint32 format; /* ??? */ - GUID input_majortype; - GUID input_subtype; - gchar *sinkcaps; /* GStreamer caps of input format */ - GUID output_majortype; - GUID output_subtype; - gchar *srccaps; - PreferredFilter *preferred_filters; -} VideoCodecEntry; - -#define GST_TYPE_DSHOWVIDEODEC (gst_dshowvideodec_get_type()) -#define GST_DSHOWVIDEODEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DSHOWVIDEODEC,GstDshowVideoDec)) -#define GST_DSHOWVIDEODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DSHOWVIDEODEC,GstDshowVideoDecClass)) -#define GST_IS_DSHOWVIDEODEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DSHOWVIDEODEC)) -#define GST_IS_DSHOWVIDEODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DSHOWVIDEODEC)) - -typedef struct _GstDshowVideoDec GstDshowVideoDec; -typedef struct _GstDshowVideoDecClass GstDshowVideoDecClass; - -class VideoFakeSink; - -struct _GstDshowVideoDec -{ - GstElement element; - - /* element pads */ - GstPad *sinkpad; - GstPad *srcpad; - - /* caps of our src pad */ - GstCaps *srccaps; - - GstFlowReturn last_ret; - - /* list of dshow mediatypes corresponding to the caps list */ - GList *mediatypes; - - /* filters interfaces */ - FakeSrc *fakesrc; - VideoFakeSink *fakesink; - - IBaseFilter *decfilter; - - /* graph manager interfaces */ - IMediaFilter *mediafilter; - IFilterGraph *filtergraph; - - /* settings */ - gint width, height; - gint fps_n, fps_d; - gint par_n, par_d; - - /* current segment */ - GstSegment *segment; - - gboolean setup; - - gboolean comInitialized; - GMutex com_init_lock; - GMutex com_deinit_lock; - GCond com_initialized; - GCond com_uninitialize; - GCond com_uninitialized; - - GstBufferPool *buffer_pool; -}; - -struct _GstDshowVideoDecClass -{ - GstElementClass parent_class; - const VideoCodecEntry *entry; -}; - -gboolean dshow_vdec_register (GstPlugin * plugin); - -const GUID CLSID_VideoFakeSink = -{ 0xff8f0c8e, 0x64f9, 0x4471, - { 0x96, 0x0e, 0xd2, 0xd3, 0x18, 0x87, 0x78, 0x9a} }; - -class VideoFakeSink : public CBaseRenderer -{ -public: - VideoFakeSink(GstDshowVideoDec *dec) : - m_hres(S_OK), - CBaseRenderer(CLSID_VideoFakeSink, _T("VideoFakeSink"), NULL, &m_hres), - mDec(dec) - {}; - virtual ~VideoFakeSink() {}; - - HRESULT DoRenderSample(IMediaSample *pMediaSample); - HRESULT CheckMediaType(const CMediaType *pmt); - HRESULT SetMediaType (AM_MEDIA_TYPE *pmt) - { - m_MediaType.Set (*pmt); - return S_OK; - } - -protected: - HRESULT m_hres; - CMediaType m_MediaType; - GstDshowVideoDec *mDec; -}; - -G_END_DECLS - -#endif /* __GST_DSHOWVIDEODEC_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowsrcwrapper
Deleted
-(directory)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowsrcwrapper/BUILD.txt
Deleted
@@ -1,41 +0,0 @@ - -== Dependencies == - - * CMake (tested with 3.9, likely >=3.0 will work) - - * GStreamer (1.8 or newer) - - * Microsoft SDK - (http://www.microsoft.com/en-us/download/details.aspx?id=8279). Don't - use any after 7.1, they don't include the samples. You can uncheck - the .NET stuff. - - * Visual Studio, in theory any version will do; tested with 2013 - Express - (http://www.visualstudio.com/en-us/products/visual-studio-express-vs.aspx). - -== Build == - -First build the SDK "baseclasses" sample; they should have been -installed in <SDK>/Samples/multimedia/directshow/baseclasses. Just -open the SLN and build both Debug_MBCS and Release_MBCS. - -If you get a build error "ctype.h: no such file or directory", try -retargetting the solution from the Project menu. - -Then go to sys/dshowsrcwrapper and use CMake to generate the project -file for your chosen version of Visual Studio. There are two influential -variables: - - * GST_INSTALL_BASE: your GStreamer installation directory - (default C:\gstreamer\1.0\x86 or C:\gstreamer\1.0\x86_64) - - * SDK_INSTALL_BASE: the Windows SDK installation path (default - C:\Program Files\Microsoft SDKs\Windows\v7.0). - -mkdir build -cd build -cmake -G "Visual Studio 12" .. - -Open the SLN and build the project. Copy the DLL to the GStreamer -plugins directory.
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowsrcwrapper/CMakeLists.txt
Deleted
@@ -1,72 +0,0 @@ - -CMAKE_MINIMUM_REQUIRED (VERSION 2.8) - -PROJECT(dshowsrcwrapper) - -IF ("${CMAKE_GENERATOR}" MATCHES "Win64") - SET(ARCH_ "x86_64") -ELSE () - SET(ARCH_ "x86") -ENDIF () -SET(GST_INSTALL_BASE "C:\\gstreamer\\1.0\\${ARCH_}" CACHE PATH "Path to the GStreamer install base") -SET(SDK_INSTALL_BASE "C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1" CACHE PATH "Path to the Windows SDK root") - -SET_PROPERTY( - DIRECTORY - APPEND PROPERTY COMPILE_DEFINITIONS - HAVE_CONFIG_H -) - -INCLUDE_DIRECTORIES( - ${GST_INSTALL_BASE}/include - ${GST_INSTALL_BASE}/include/gstreamer-1.0 - ${GST_INSTALL_BASE}/include/glib-2.0 - ${GST_INSTALL_BASE}/lib/glib-2.0/include - ${GST_INSTALL_BASE}/lib/gstreamer-1.0/include - ${SDK_INSTALL_BASE}/Samples/multimedia/directshow/baseclasses - - # When building from the Cerbero build dir, this is where config.h is. - ${PROJECT_SOURCE_DIR}/../../_builddir -) - -IF ("${CMAKE_GENERATOR}" MATCHES "Win64") - SET(ARCH_ "x64/") -ELSE () - SET(ARCH_ "") -ENDIF () - -LINK_DIRECTORIES( - ${GST_INSTALL_BASE}/lib - ${SDK_INSTALL_BASE}/Samples/multimedia/directshow/baseclasses/${ARCH_}Release_MBCS - ${SDK_INSTALL_BASE}/Samples/multimedia/directshow/baseclasses/${ARCH_}Debug_MBCS -) - -SET(CMAKE_SHARED_LINKER_FLAGS "${CMALE_SHARED_LINKER_FLAGS} /SAFESEH:NO") - -ADD_LIBRARY(libgstdshowsrcwrapper SHARED - dshowdeviceprovider.cpp - dshowdeviceprovider.h - gstdshow.cpp - gstdshow.h - gstdshowfakesink.cpp - gstdshowfakesink.h - gstdshowaudiosrc.cpp - gstdshowaudiosrc.h - gstdshowvideosrc.cpp - gstdshowvideosrc.h - gstdshowsrcwrapper.cpp -) - -TARGET_LINK_LIBRARIES(libgstdshowsrcwrapper - gstreamer-1.0 - gstaudio-1.0 - gstvideo-1.0 - gstbase-1.0 - glib-2.0 - gobject-2.0 - debug strmbasd - optimized strmbase - rpcrt4 - uuid - winmm -)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowsrcwrapper/gstdshow.cpp
Deleted
@@ -1,761 +0,0 @@ -/* GStreamer - * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> - * - * gstdshow.cpp: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include <gst/video/video-format.h> - -#include "gstdshow.h" -#include "gstdshowfakesink.h" -#include "gstdshowvideosrc.h" - -GST_DEBUG_CATEGORY_EXTERN (dshowsrcwrapper_debug); -#define GST_CAT_DEFAULT dshowsrcwrapper_debug - -gchar * -wchar_to_gchar (WCHAR * w) -{ - return g_utf16_to_utf8 ((const gunichar2 *) w, wcslen (w), NULL, NULL, NULL); -} - -const GUID MEDIASUBTYPE_I420 - = { 0x30323449, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, - 0x71} -}; - -void -gst_dshow_free_mediatype (AM_MEDIA_TYPE * pmt) -{ - if (pmt != NULL) { - if (pmt->cbFormat != 0) { - CoTaskMemFree ((PVOID) pmt->pbFormat); - pmt->cbFormat = 0; - pmt->pbFormat = NULL; - } - if (pmt->pUnk != NULL) { - /* Unnecessary because pUnk should not be used, but safest. */ - pmt->pUnk->Release (); - pmt->pUnk = NULL; - } - - CoTaskMemFree (pmt); - } -} - -void -gst_dshow_free_pin_mediatype (gpointer pt) -{ - GstCapturePinMediaType *pin_mediatype = (GstCapturePinMediaType *) pt; - if (pin_mediatype) { - if (pin_mediatype->capture_pin) { - pin_mediatype->capture_pin->Release (); - pin_mediatype->capture_pin = NULL; - } - if (pin_mediatype->mediatype) { - gst_dshow_free_mediatype (pin_mediatype->mediatype); - pin_mediatype->mediatype = NULL; - } - } -} - -GstCapturePinMediaType * -gst_dshow_new_pin_mediatype (IPin * pin) -{ - GstCapturePinMediaType *pin_mediatype = g_new0 (GstCapturePinMediaType, 1); - - pin->AddRef (); - pin_mediatype->capture_pin = pin; - - return pin_mediatype; -} - -GstCapturePinMediaType * -gst_dshow_new_pin_mediatype_from_enum_mediatypes (IPin * pin, IEnumMediaTypes *enum_mediatypes) -{ - GstCapturePinMediaType *pin_mediatype = gst_dshow_new_pin_mediatype (pin); - VIDEOINFOHEADER *video_info = NULL; - - HRESULT hres = enum_mediatypes->Next (1, &pin_mediatype->mediatype, NULL); - if (hres != S_OK || !pin_mediatype->mediatype) { - gst_dshow_free_pin_mediatype (pin_mediatype); - return NULL; - } - - video_info = (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat; - - pin_mediatype->defaultWidth = video_info->bmiHeader.biWidth; - pin_mediatype->defaultHeight = video_info->bmiHeader.biHeight; - pin_mediatype->defaultFPS = (gint) (10000000 / video_info->AvgTimePerFrame); - pin_mediatype->granularityWidth = 1; - pin_mediatype->granularityHeight = 1; - - return pin_mediatype; -} - -GstCapturePinMediaType * -gst_dshow_new_pin_mediatype_from_streamcaps (IPin * pin, gint id, IAMStreamConfig * streamcaps) -{ - GstCapturePinMediaType *pin_mediatype = gst_dshow_new_pin_mediatype (pin); - VIDEOINFOHEADER *video_info = NULL; - - HRESULT hres = streamcaps->GetStreamCaps (id, &pin_mediatype->mediatype, - (BYTE *) & pin_mediatype->vscc); - if (FAILED (hres) || !pin_mediatype->mediatype) { - gst_dshow_free_pin_mediatype (pin_mediatype); - return NULL; - } - - video_info = (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat; - - pin_mediatype->defaultWidth = video_info->bmiHeader.biWidth; - pin_mediatype->defaultHeight = video_info->bmiHeader.biHeight; - pin_mediatype->defaultFPS = (gint) (10000000 / video_info->AvgTimePerFrame); - pin_mediatype->granularityWidth = pin_mediatype->vscc.OutputGranularityX; - pin_mediatype->granularityHeight = pin_mediatype->vscc.OutputGranularityY; - - return pin_mediatype; -} - -void -gst_dshow_free_pins_mediatypes (GList * pins_mediatypes) -{ - g_list_free_full (pins_mediatypes, - (GDestroyNotify) gst_dshow_free_pin_mediatype); -} - -gboolean -gst_dshow_check_mediatype (AM_MEDIA_TYPE * media_type, const GUID sub_type, - const GUID format_type) -{ - RPC_STATUS rpcstatus; - - g_return_val_if_fail (media_type != NULL, FALSE); - - return - UuidCompare (&media_type->subtype, (UUID *) & sub_type, - &rpcstatus) == 0 && rpcstatus == RPC_S_OK && - //IsEqualGUID (&media_type->subtype, &sub_type) - UuidCompare (&media_type->formattype, (UUID *) & format_type, - &rpcstatus) == 0 && rpcstatus == RPC_S_OK; -} - -gboolean -gst_dshow_get_pin_from_filter (IBaseFilter * filter, PIN_DIRECTION pindir, - IPin ** pin) -{ - gboolean ret = FALSE; - IEnumPins *enumpins = NULL; - IPin *pintmp = NULL; - HRESULT hres; - *pin = NULL; - - hres = filter->EnumPins (&enumpins); - if (FAILED (hres)) { - return ret; - } - - while (enumpins->Next (1, &pintmp, NULL) == S_OK) { - PIN_DIRECTION pindirtmp; - hres = pintmp->QueryDirection (&pindirtmp); - if (hres == S_OK && pindir == pindirtmp) { - *pin = pintmp; - ret = TRUE; - break; - } - pintmp->Release (); - } - enumpins->Release (); - - return ret; -} - -gboolean -gst_dshow_find_filter (CLSID input_majortype, CLSID input_subtype, - CLSID output_majortype, CLSID output_subtype, - gchar * prefered_filter_name, IBaseFilter ** filter) -{ - gboolean ret = FALSE; - HRESULT hres; - GUID arrayInTypes2; - GUID arrayOutTypes2; - IFilterMapper2 *mapper = NULL; - IEnumMoniker *enum_moniker = NULL; - IMoniker *moniker = NULL; - ULONG fetched; - gchar *prefered_filter_upper = NULL; - gboolean exit = FALSE; - - /* initialize output parameter */ - if (filter) - *filter = NULL; - - /* create a private copy of preferred filter substring in upper case */ - if (prefered_filter_name) { - prefered_filter_upper = g_strdup (prefered_filter_name); - _strupr (prefered_filter_upper); - } - - hres = CoCreateInstance (CLSID_FilterMapper2, NULL, CLSCTX_INPROC, - IID_IFilterMapper2, (void **) &mapper); - if (FAILED (hres)) - goto clean; - - memcpy (&arrayInTypes0, &input_majortype, sizeof (CLSID)); - memcpy (&arrayInTypes1, &input_subtype, sizeof (CLSID)); - memcpy (&arrayOutTypes0, &output_majortype, sizeof (CLSID)); - memcpy (&arrayOutTypes1, &output_subtype, sizeof (CLSID)); - - hres = - mapper->EnumMatchingFilters (&enum_moniker, 0, FALSE, - MERIT_DO_NOT_USE + 1, TRUE, 1, arrayInTypes, NULL, NULL, FALSE, TRUE, 1, - arrayOutTypes, NULL, NULL); - if (FAILED (hres)) - goto clean; - - enum_moniker->Reset (); - - while (hres = enum_moniker->Next (1, &moniker, &fetched), hres == S_OK - && !exit) { - IBaseFilter *filter_temp = NULL; - IPropertyBag *property_bag = NULL; - gchar *friendly_name = NULL; - - hres = - moniker->BindToStorage (NULL, NULL, IID_IPropertyBag, - (void **) &property_bag); - if (SUCCEEDED (hres) && property_bag) { - VARIANT varFriendlyName; - VariantInit (&varFriendlyName); - - hres = property_bag->Read (L"FriendlyName", &varFriendlyName, NULL); - if (hres == S_OK && varFriendlyName.bstrVal) { - friendly_name = wchar_to_gchar (varFriendlyName.bstrVal); - if (friendly_name) - _strupr (friendly_name); - SysFreeString (varFriendlyName.bstrVal); - } - property_bag->Release (); - } - - hres = - moniker->BindToObject (NULL, NULL, IID_IBaseFilter, - (void **) &filter_temp); - if (SUCCEEDED (hres) && filter_temp) { - ret = TRUE; - if (filter) { - if (*filter) - (*filter)->Release (); - - *filter = filter_temp; - (*filter)->AddRef (); - - if (prefered_filter_upper && friendly_name && - strstr (friendly_name, prefered_filter_upper)) - exit = TRUE; - } - - /* if we just want to know if the formats are supported OR - if we don't care about what will be the filter used - => we can stop enumeration */ - if (!filter || !prefered_filter_upper) - exit = TRUE; - - filter_temp->Release (); - } - - g_free (friendly_name); - moniker->Release (); - } - -clean: - g_free (prefered_filter_upper); - if (enum_moniker) - enum_moniker->Release (); - if (mapper) - mapper->Release (); - - return ret; -} - -void -gst_dshow_device_entry_free (DshowDeviceEntry * entry) -{ - if (entry) { - g_free (entry->device); - entry->device = NULL; - g_free (entry->device_name); - entry->device_name = NULL; - if (entry->caps) { - gst_caps_unref (entry->caps); - entry->caps = NULL; - } - if (entry->moniker) { - entry->moniker->Release (); - entry->moniker = NULL; - } - } -} - -void -gst_dshow_device_list_free (GList * devices) -{ - GList *cur; - - for (cur = devices; cur != NULL; cur = cur->next) - gst_dshow_device_entry_free ((DshowDeviceEntry *) cur->data); - - g_list_free (devices); -} - -GList * -gst_dshow_enumerate_devices (const GUID * device_category, gboolean getcaps) -{ - GList *result = NULL; - ICreateDevEnum *devices_enum = NULL; - IEnumMoniker *enum_moniker = NULL; - IMoniker *moniker = NULL; - HRESULT hres = S_FALSE; - ULONG fetched; - gint devidx = -1; - - hres = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, - IID_ICreateDevEnum, (void **) &devices_enum); - if (hres != S_OK) { - GST_ERROR ("Failed to create System Device Enumerator"); - goto clean; - } - - hres = devices_enum->CreateClassEnumerator (*device_category, - &enum_moniker, 0); - if (hres != S_OK || !enum_moniker) { - GST_ERROR ("Failed to create audio/video class device enumerator"); - goto clean; - } - - enum_moniker->Reset (); - - while (enum_moniker->Next (1, &moniker, &fetched) == S_OK) { - IPropertyBag *property_bag = NULL; - hres = moniker->BindToStorage (NULL, NULL, IID_IPropertyBag, - (void **) &property_bag); - if (SUCCEEDED (hres) && property_bag) { - VARIANT varFriendlyName; - VariantInit (&varFriendlyName); - - hres = property_bag->Read (L"FriendlyName", &varFriendlyName, NULL); - if (hres == S_OK && varFriendlyName.bstrVal) { - gchar *friendly_name = wchar_to_gchar (varFriendlyName.bstrVal); - - devidx++; - GST_DEBUG ("Found device idx=%d: device-name='%s'", - devidx, friendly_name); - - WCHAR *wszDisplayName = NULL; - hres = moniker->GetDisplayName (NULL, NULL, &wszDisplayName); - if (hres == S_OK && wszDisplayName) { - DshowDeviceEntry *entry = g_new0 (DshowDeviceEntry, 1); - gchar *device_path = NULL; - GstCaps *caps = NULL; - - device_path = wchar_to_gchar (wszDisplayName); - CoTaskMemFree (wszDisplayName); - - /* getting caps can be slow, so make it optional when enumerating */ - if (getcaps) { - IBindCtx *lpbc = NULL; - hres = CreateBindCtx (0, &lpbc); - if (SUCCEEDED (hres)) { - IBaseFilter *video_cap_filter = NULL; - hres = moniker->BindToObject (lpbc, NULL, IID_IBaseFilter, - (LPVOID *) & video_cap_filter); - if (video_cap_filter) { - caps = gst_dshowvideosrc_getcaps_from_capture_filter (video_cap_filter, NULL); - video_cap_filter->Release (); - } - lpbc->Release (); - } - } - - entry->device = device_path; - entry->device_name = friendly_name; - entry->device_index = devidx; - entry->caps = caps; - entry->moniker = moniker; - moniker = NULL; - result = g_list_append (result, entry); - } else { - g_free (friendly_name); - } - SysFreeString (varFriendlyName.bstrVal); - } - property_bag->Release (); - } - if (moniker) { - moniker->Release (); - } - } - -clean: - if (enum_moniker) { - enum_moniker->Release (); - } - - if (devices_enum) { - devices_enum->Release (); - } - - return result; -} - -DshowDeviceEntry * -gst_dshow_select_device (const GUID * device_category, - const gchar * device, const gchar * device_name, const gint device_index) -{ - GList *devices = NULL; - GList *item = NULL; - DshowDeviceEntry *selected = NULL; - - GST_DEBUG ("Trying to select device-index=%d, device-name='%s', device='%s'", - device_index, device_name, device); - - devices = gst_dshow_enumerate_devices (&CLSID_VideoInputDeviceCategory, FALSE); - - for (item = devices; item != NULL; item = item->next) { - DshowDeviceEntry *entry = (DshowDeviceEntry *) item->data; - - /* device will be used first, then device-name, then device-index */ - if (device && g_strcmp0 (device, entry->device) == 0) { - selected = entry; - break; - } else if (!device && device_name && g_strcmp0 (device_name, entry->device_name) == 0) { - selected = entry; - break; - } else if (!device && !device_name && device_index == entry->device_index) { - selected = entry; - break; - } - } - - if (selected) { - devices = g_list_remove (devices, selected); - GST_DEBUG ("Selected device-index=%d, device-name='%s', device='%s'", - selected->device_index, selected->device_name, selected->device); - } else { - GST_DEBUG ("No matching device found"); - } - - gst_dshow_device_list_free (devices); - - return selected; -} - -IBaseFilter * -gst_dshow_create_capture_filter (IMoniker *moniker) -{ - HRESULT hres = S_OK; - IBindCtx *lpbc = NULL; - IBaseFilter *video_cap_filter = NULL; - - g_assert (moniker != NULL); - - hres = CreateBindCtx (0, &lpbc); - if (SUCCEEDED (hres)) { - hres = moniker->BindToObject (lpbc, NULL, IID_IBaseFilter, - (LPVOID *) & video_cap_filter); - lpbc->Release (); - } - - return video_cap_filter; -} - -gchar * -gst_dshow_getdevice_from_devicename (const GUID * device_category, - gchar ** device_name, gint * device_index) -{ - gchar *ret = NULL; - ICreateDevEnum *devices_enum = NULL; - IEnumMoniker *enum_moniker = NULL; - IMoniker *moniker = NULL; - HRESULT hres = S_FALSE; - ULONG fetched; - gboolean bfound = FALSE; - gint devidx = -1; - - hres = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, - IID_ICreateDevEnum, (void **) &devices_enum); - if (hres != S_OK) { - GST_ERROR ("Failed to create System Device Enumerator"); - goto clean; - } - - hres = devices_enum->CreateClassEnumerator (*device_category, - &enum_moniker, 0); - if (hres != S_OK || !enum_moniker) { - GST_ERROR ("Failed to create audio/video class device enumerator"); - goto clean; - } - - enum_moniker->Reset (); - - while (hres = enum_moniker->Next (1, &moniker, &fetched), hres == S_OK - && !bfound) { - IPropertyBag *property_bag = NULL; - hres = - moniker->BindToStorage (NULL, NULL, IID_IPropertyBag, - (void **) &property_bag); - if (SUCCEEDED (hres) && property_bag) { - VARIANT varFriendlyName; - VariantInit (&varFriendlyName); - - hres = property_bag->Read (L"FriendlyName", &varFriendlyName, NULL); - if (hres == S_OK && varFriendlyName.bstrVal) { - gchar *friendly_name = wchar_to_gchar (varFriendlyName.bstrVal); - - devidx++; - GST_DEBUG ("Found device idx=%d: device-name='%s'", - devidx, friendly_name); - - if ((!*device_name || !**device_name) && devidx == *device_index) { - g_free (*device_name); - *device_name = g_strdup (friendly_name); - } - - if ((*device_name && **device_name) - && _stricmp (*device_name, friendly_name) == 0) { - WCHAR *wszDisplayName = NULL; - hres = moniker->GetDisplayName (NULL, NULL, &wszDisplayName); - if (hres == S_OK && wszDisplayName) { - *device_index = devidx; - ret = wchar_to_gchar (wszDisplayName); - CoTaskMemFree (wszDisplayName); - } - bfound = TRUE; - } - SysFreeString (varFriendlyName.bstrVal); - } - property_bag->Release (); - } - moniker->Release (); - } - -clean: - if (enum_moniker) { - enum_moniker->Release (); - } - - if (devices_enum) { - devices_enum->Release (); - } - - return ret; -} - -gboolean -gst_dshow_show_propertypage (IBaseFilter * base_filter) -{ - gboolean ret = FALSE; - ISpecifyPropertyPages *pProp = NULL; - HRESULT hres = - base_filter->QueryInterface (IID_ISpecifyPropertyPages, (void **) &pProp); - if (SUCCEEDED (hres)) { - /* Get the filter's name and IUnknown pointer. */ - FILTER_INFO FilterInfo; - CAUUID caGUID; - IUnknown *pFilterUnk = NULL; - hres = base_filter->QueryFilterInfo (&FilterInfo); - base_filter->QueryInterface (IID_IUnknown, (void **) &pFilterUnk); - - /* Show the page. */ - pProp->GetPages (&caGUID); - pProp->Release (); - OleCreatePropertyFrame (GetDesktopWindow (), 0, 0, FilterInfo.achName, - 1, &pFilterUnk, caGUID.cElems, caGUID.pElems, 0, 0, NULL); - - pFilterUnk->Release (); - FilterInfo.pGraph->Release (); - CoTaskMemFree (caGUID.pElems); - } - return ret; -} - -GstVideoFormat -gst_dshow_guid_to_gst_video_format (AM_MEDIA_TYPE *mediatype) -{ - if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_I420, FORMAT_VideoInfo)) - return GST_VIDEO_FORMAT_I420; - - if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB24, FORMAT_VideoInfo)) - return GST_VIDEO_FORMAT_BGR; - - if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_YUY2, FORMAT_VideoInfo)) - return GST_VIDEO_FORMAT_YUY2; - - if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_UYVY, FORMAT_VideoInfo)) - return GST_VIDEO_FORMAT_UYVY; - - if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB32, FORMAT_VideoInfo)) - return GST_VIDEO_FORMAT_BGRx; - - if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB565, FORMAT_VideoInfo)) - return GST_VIDEO_FORMAT_BGR16; - - if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB555, FORMAT_VideoInfo)) - return GST_VIDEO_FORMAT_BGR15; - - if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB8, FORMAT_VideoInfo)) - return GST_VIDEO_FORMAT_GRAY8; - - return GST_VIDEO_FORMAT_UNKNOWN; -} - -gboolean -gst_dshow_is_pin_connected (IPin * pin) -{ - IPin *tmp_pin = NULL; - gboolean res; - HRESULT hres; - - g_assert (pin); - hres = pin->ConnectedTo (&tmp_pin); - res = (hres != VFW_E_NOT_CONNECTED); - if (tmp_pin) - tmp_pin->Release (); - - return res; -} - -GstCaps * -gst_dshow_new_video_caps (GstVideoFormat video_format, const gchar * name, - GstCapturePinMediaType * pin_mediatype) -{ - GstCaps *video_caps = NULL; - GstStructure *video_structure = NULL; - gint min_w, max_w; - gint min_h, max_h; - gint min_fr, max_fr; - - /* raw video format */ - switch (video_format) { - case GST_VIDEO_FORMAT_BGR: - video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGR")); - break; - case GST_VIDEO_FORMAT_I420: - video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("I420")); - break; - case GST_VIDEO_FORMAT_YUY2: - video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("YUY2")); - break; - case GST_VIDEO_FORMAT_UYVY: - video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("UYVY")); - break; - case GST_VIDEO_FORMAT_BGRx: - video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGRx")); - break; - case GST_VIDEO_FORMAT_BGR16: - video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGR16")); - break; - case GST_VIDEO_FORMAT_BGR15: - video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGR15")); - break; - case GST_VIDEO_FORMAT_GRAY8: - video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("GRAY8")); - break; - default: - break; - } - - /* other video format */ - if (!video_caps) { - if (g_ascii_strncasecmp (name, "video/x-dv, systemstream=FALSE", 31) == 0) { - video_caps = gst_caps_new_simple ("video/x-dv", - "systemstream", G_TYPE_BOOLEAN, FALSE, - "format", G_TYPE_STRING, "dvsd", - NULL); - } else if (g_ascii_strncasecmp (name, "video/x-dv, systemstream=TRUE", 31) == 0) { - video_caps = gst_caps_new_simple ("video/x-dv", - "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); - return video_caps; - } else if (g_ascii_strncasecmp (name, "image/jpeg", 10) == 0) { - video_caps = gst_caps_new_simple ("image/jpeg", NULL); - } else if (g_ascii_strncasecmp (name, "video/x-h264", 12) == 0) { - video_caps = gst_caps_new_simple ("video/x-h264", NULL); - } - } - - if (!video_caps) - return NULL; - - video_structure = gst_caps_get_structure (video_caps, 0); - - /* Hope GST_TYPE_INT_RANGE_STEP will exits in future gstreamer releases */ - /* because we could use : */ - /* "width", GST_TYPE_INT_RANGE_STEP, video_default->minWidth, video_default->maxWidth, video_default->granularityWidth */ - /* instead of : */ - /* "width", GST_TYPE_INT_RANGE, video_default->minWidth, video_default->maxWidth */ - - /* For framerate we do not need a step (granularity) because */ - /* "The IAMStreamConfig::SetFormat method will set the frame rate to the closest */ - /* value that the filter supports" as it said in the VIDEO_STREAM_CONFIG_CAPS dshwo doc */ - - min_w = pin_mediatype->vscc.MinOutputSize.cx; - max_w = pin_mediatype->vscc.MaxOutputSize.cx; - min_h = pin_mediatype->vscc.MinOutputSize.cy; - max_h = pin_mediatype->vscc.MaxOutputSize.cy; - min_fr = (gint) (10000000 / pin_mediatype->vscc.MaxFrameInterval); - max_fr = (gint)(10000000 / pin_mediatype->vscc.MinFrameInterval); - - if (min_w == max_w) - gst_structure_set (video_structure, "width", G_TYPE_INT, min_w, NULL); - else - gst_structure_set (video_structure, - "width", GST_TYPE_INT_RANGE, min_w, max_w, NULL); - - if (min_h == max_h) - gst_structure_set (video_structure, "height", G_TYPE_INT, min_h, NULL); - else - gst_structure_set (video_structure, - "height", GST_TYPE_INT_RANGE, min_h, max_h, NULL); - - if (min_fr == max_fr) - gst_structure_set (video_structure, "framerate", - GST_TYPE_FRACTION, min_fr, 1, NULL); - else - gst_structure_set (video_structure, "framerate", - GST_TYPE_FRACTION_RANGE, min_fr, 1, max_fr, 1, NULL); - - return video_caps; -} - -bool gst_dshow_configure_latency (IPin *pCapturePin, guint bufSizeMS) -{ - HRESULT hr; - ALLOCATOR_PROPERTIES alloc_prop; - IAMBufferNegotiation * pNeg = NULL; - hr = pCapturePin->QueryInterface(IID_IAMBufferNegotiation, (void **)&pNeg); - - if(!SUCCEEDED (hr)) - return FALSE; - - alloc_prop.cbAlign = -1; // -1 means no preference. - alloc_prop.cbBuffer = bufSizeMS; - alloc_prop.cbPrefix = -1; - alloc_prop.cBuffers = -1; - hr = pNeg->SuggestAllocatorProperties (&alloc_prop); - return SUCCEEDED (hr); -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowsrcwrapper/gstdshow.h
Deleted
@@ -1,127 +0,0 @@ -/* GStreamer - * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> - * - * gstdshow.h: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef _GSTDSHOW_ -#define _GSTDSHOW_ - -#include <streams.h> -#include <windows.h> -#include <tchar.h> -#include <objbase.h> -#include <dshow.h> -#include <Rpc.h> - -#include <gst/gst.h> -#include <gst/video/video.h> - -typedef struct _DshowDeviceEntry DshowDeviceEntry; - -struct _DshowDeviceEntry -{ - gchar *device; - gchar *device_name; - gint device_index; - GstCaps *caps; - IMoniker *moniker; -}; - -typedef struct _GstCapturePinMediaType -{ - AM_MEDIA_TYPE *mediatype; - IPin *capture_pin; - - VIDEO_STREAM_CONFIG_CAPS vscc; - - //default caps - gint defaultWidth; - gint defaultHeight; - gint defaultFPS; - - gint granularityWidth; //will be removed when GST_TYPE_INT_RANGE_STEP exits - gint granularityHeight; //will be removed when GST_TYPE_INT_RANGE_STEP exits -} GstCapturePinMediaType; - -/* free memory of the input pin mediatype */ -void gst_dshow_free_pin_mediatype (gpointer pt); - -/* free memory of the input dshow mediatype */ -void gst_dshow_free_mediatype (AM_MEDIA_TYPE * pmt); - -/* create a new capture media type that handles dshow video caps of a capture pin */ -GstCapturePinMediaType *gst_dshow_new_pin_mediatype (IPin * pin); - -/* create a new capture media type from enum mediatype */ -GstCapturePinMediaType * gst_dshow_new_pin_mediatype_from_enum_mediatypes (IPin * pin, - IEnumMediaTypes *enum_mediatypes); - -/* create a new capture media type from streamcaps */ -GstCapturePinMediaType *gst_dshow_new_pin_mediatype_from_streamcaps (IPin * pin, - gint id, IAMStreamConfig * streamcaps); - -/* free the memory of all mediatypes of the input list if pin mediatype */ -void gst_dshow_free_pins_mediatypes (GList * mediatypes); - -/* allow to know what kind of media type we have */ -gboolean gst_dshow_check_mediatype (AM_MEDIA_TYPE * media_type, - const GUID sub_type, const GUID format_type); - -/* get a pin from directshow filter */ -gboolean gst_dshow_get_pin_from_filter (IBaseFilter * filter, - PIN_DIRECTION pindir, IPin ** pin); - -/* find and return a filter according to the input and output types */ -gboolean gst_dshow_find_filter (CLSID input_majortype, CLSID input_subtype, - CLSID output_majortype, CLSID output_subtype, - gchar * prefered_filter_name, IBaseFilter ** filter); - -/* get the dshow device path from device friendly name. -If friendly name is not set, it will return the first available device */ -gchar *gst_dshow_getdevice_from_devicename (const GUID * device_category, - gchar ** device_name, gint * device_index); - -/* show the capture filter property page (generally used to setup the device). the page is modal*/ -gboolean gst_dshow_show_propertypage (IBaseFilter * base_filter); - -/* translate GUID format to gsteamer video format */ -GstVideoFormat gst_dshow_guid_to_gst_video_format (AM_MEDIA_TYPE *mediatype); - -/* check if IPin is connected */ -gboolean gst_dshow_is_pin_connected (IPin *pin); - -/* transform a dshow video caps to a gstreamer video caps */ -GstCaps *gst_dshow_new_video_caps (GstVideoFormat video_format, - const gchar * name, GstCapturePinMediaType * pin_mediatype); - -/* configure the latency of the capture source */ -bool gst_dshow_configure_latency (IPin *pCapturePin, guint bufSizeMS); - -/* enumerate devices of a given category (i.e., audio or video) */ -void gst_dshow_device_entry_free (DshowDeviceEntry *entry); -void gst_dshow_device_list_free (GList * devices); -GList * gst_dshow_enumerate_devices (const GUID * device_category, gboolean getcaps); - -DshowDeviceEntry * gst_dshow_select_device (const GUID * device_category, - const gchar *device, const gchar *device_name, const gint device_index); - -/* create capture filter from moniker */ -IBaseFilter *gst_dshow_create_capture_filter (IMoniker *moniker); - -#endif /* _GSTDSHOW_ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowsrcwrapper/gstdshowaudiosrc.h
Deleted
@@ -1,85 +0,0 @@ -/* GStreamer - * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> - * - * gstdshowaudiosrc.h: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - - -#ifndef __GST_DSHOWAUDIOSRC_H__ -#define __GST_DSHOWAUDIOSRC_H__ - -#include <gst/gst.h> -#include <gst/audio/gstaudiosrc.h> - -#include "gstdshow.h" -#include "gstdshowfakesink.h" - -G_BEGIN_DECLS -#define GST_TYPE_DSHOWAUDIOSRC (gst_dshowaudiosrc_get_type()) -#define GST_DSHOWAUDIOSRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DSHOWAUDIOSRC,GstDshowAudioSrc)) -#define GST_DSHOWAUDIOSRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DSHOWAUDIOSRC,GstDshowAudioSrcClass)) -#define GST_IS_DSHOWAUDIOSRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DSHOWAUDIOSRC)) -#define GST_IS_DSHOWAUDIOSRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DSHOWAUDIOSRC)) -typedef struct _GstDshowAudioSrc GstDshowAudioSrc; -typedef struct _GstDshowAudioSrcClass GstDshowAudioSrcClass; - -struct _GstDshowAudioSrc -{ - GstAudioSrc src; - - /* device dshow reference (generally classid/name) */ - gchar *device; - - /* device friendly name */ - gchar *device_name; - - /* device index */ - gint device_index; - - /* list of caps created from the list of supported media types of the dshow capture filter */ - GstCaps *caps; - - /* list of dshow media types filter's pins mediatypes */ - GList *pins_mediatypes; - - /* dshow audio capture filter */ - IBaseFilter *audio_cap_filter; - - /* dshow fakesink filter */ - CDshowFakeSink *dshow_fakesink; - - /* graph manager interfaces */ - IMediaFilter *media_filter; - IFilterGraph *filter_graph; - - /* bytes array */ - GByteArray *gbarray; - GMutex gbarray_lock; - - gboolean is_running; -}; - -struct _GstDshowAudioSrcClass -{ - GstAudioSrcClass parent_class; -}; - -GType gst_dshowaudiosrc_get_type (void); - -G_END_DECLS -#endif /* __GST_DSHOWAUDIOSRC_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp
Deleted
@@ -1,61 +0,0 @@ -/* GStreamer - * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> - * - * gstdshowsrcwrapper.c: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstdshowaudiosrc.h" -#include "gstdshowvideosrc.h" -#include "dshowdeviceprovider.h" - -GST_DEBUG_CATEGORY (dshowsrcwrapper_debug); -#define GST_CAT_DEFAULT dshowsrcwrapper_debug - -static gboolean -plugin_init (GstPlugin * plugin) -{ - GST_DEBUG_CATEGORY_INIT (dshowsrcwrapper_debug, "dshowsrcwrapper", 0, - "DirectShow source wrapper"); - - if (!gst_element_register (plugin, "dshowaudiosrc", - GST_RANK_NONE, GST_TYPE_DSHOWAUDIOSRC) || - !gst_element_register (plugin, "dshowvideosrc", - GST_RANK_NONE, GST_TYPE_DSHOWVIDEOSRC)) - return FALSE; - - if (!gst_device_provider_register (plugin, "dshowdeviceprovider", - GST_RANK_PRIMARY, GST_TYPE_DSHOW_DEVICE_PROVIDER)) - return FALSE; - - return TRUE; -} - -extern "C" -{ - - GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - dshowsrcwrapper, - "DirectShow sources wrapper plugin", - plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) - -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowsrcwrapper/gstdshowvideosrc.cpp
Deleted
@@ -1,1120 +0,0 @@ -/* GStreamer - * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> - * Copyright (C) 2009 Julien Isorce <julien.isorce@gmail.com> - * - * gstdshowvideosrc.c: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstdshowvideosrc.h" - -#include <gst/video/video.h> - -GST_DEBUG_CATEGORY_STATIC (dshowvideosrc_debug); -#define GST_CAT_DEFAULT dshowvideosrc_debug - -static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - GST_VIDEO_CAPS_MAKE ("{ I420, BGR, YUY2, UYVY, BGRx, BGR16, BGR15, " - "GRAY8 }") "; " - - "video/x-dv, " - "format= (string) DVSD, " - "width = " GST_VIDEO_SIZE_RANGE ", " - "height = " GST_VIDEO_SIZE_RANGE ", " - "framerate = " GST_VIDEO_FPS_RANGE ", " - "systemstream = (boolean) { TRUE, FALSE }; " - - "image/jpeg, " - "width = " GST_VIDEO_SIZE_RANGE ", " - "height = " GST_VIDEO_SIZE_RANGE ", " - "framerate = " GST_VIDEO_FPS_RANGE "; " - - "video/x-h264, " - "width = " GST_VIDEO_SIZE_RANGE ", " - "height = " GST_VIDEO_SIZE_RANGE ", " - "framerate = " GST_VIDEO_FPS_RANGE - ) - ); - -G_DEFINE_TYPE (GstDshowVideoSrc, gst_dshowvideosrc, GST_TYPE_PUSH_SRC) - -enum -{ - PROP_0, - PROP_DEVICE, - PROP_DEVICE_NAME, - PROP_DEVICE_INDEX -}; - -#define DEFAULT_PROP_DEVICE_INDEX 0 - - -static void gst_dshowvideosrc_dispose (GObject * gobject); -static void gst_dshowvideosrc_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_dshowvideosrc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static GstStateChangeReturn gst_dshowvideosrc_change_state (GstElement * - element, GstStateChange transition); - - -static gboolean gst_dshowvideosrc_start (GstBaseSrc * bsrc); -static gboolean gst_dshowvideosrc_stop (GstBaseSrc * bsrc); -static gboolean gst_dshowvideosrc_unlock (GstBaseSrc * bsrc); -static gboolean gst_dshowvideosrc_unlock_stop (GstBaseSrc * bsrc); -static gboolean gst_dshowvideosrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps); -static GstCaps *gst_dshowvideosrc_get_caps (GstBaseSrc * bsrc, GstCaps * filter); -static GstCaps *gst_dshowvideosrc_src_fixate (GstBaseSrc * bsrc, GstCaps * caps); -static GstFlowReturn gst_dshowvideosrc_create (GstPushSrc * psrc, - GstBuffer ** buf); - -/*utils*/ -GstCaps *gst_dshowvideosrc_getcaps_from_streamcaps (IPin * pin, - GList ** pins_mediatypes); -GstCaps *gst_dshowvideosrc_getcaps_from_enum_mediatypes (IPin * pin, - GList ** pins_mediatypes); - -static gboolean gst_dshowvideosrc_push_buffer (guint8 * buffer, guint size, - gpointer src_object, GstClockTime duration); - -static void -gst_dshowvideosrc_class_init (GstDshowVideoSrcClass * klass) -{ - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - GstBaseSrcClass *gstbasesrc_class; - GstPushSrcClass *gstpushsrc_class; - - gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; - gstbasesrc_class = (GstBaseSrcClass *) klass; - gstpushsrc_class = (GstPushSrcClass *) klass; - - gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_dispose); - gobject_class->set_property = - GST_DEBUG_FUNCPTR (gst_dshowvideosrc_set_property); - gobject_class->get_property = - GST_DEBUG_FUNCPTR (gst_dshowvideosrc_get_property); - - gstelement_class->change_state = - GST_DEBUG_FUNCPTR (gst_dshowvideosrc_change_state); - - gstbasesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_set_caps); - gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_get_caps); - gstbasesrc_class->fixate = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_src_fixate); - gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_start); - gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_stop); - gstbasesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_unlock); - gstbasesrc_class->unlock_stop = - GST_DEBUG_FUNCPTR (gst_dshowvideosrc_unlock_stop); - - gstpushsrc_class->create = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_create); - - g_object_class_install_property - (gobject_class, PROP_DEVICE, - g_param_spec_string ("device", "Device", - "Directshow device path (@..classID/name)", NULL, - static_cast < GParamFlags > (G_PARAM_READWRITE))); - - g_object_class_install_property - (gobject_class, PROP_DEVICE_NAME, - g_param_spec_string ("device-name", "Device name", - "Human-readable name of the video device", NULL, - static_cast < GParamFlags > (G_PARAM_READWRITE))); - - g_object_class_install_property - (gobject_class, PROP_DEVICE_INDEX, - g_param_spec_int ("device-index", "Device index", - "Index of the enumerated video device", 0, G_MAXINT, - DEFAULT_PROP_DEVICE_INDEX, - static_cast < GParamFlags > (G_PARAM_READWRITE))); - - gst_element_class_add_static_pad_template (gstelement_class, &src_template); - - gst_element_class_set_static_metadata (gstelement_class, - "DirectShow video capture source", "Source/Video", - "Receive data from a directshow video capture graph", - "Sebastien Moutte <sebastien@moutte.net>"); - - GST_DEBUG_CATEGORY_INIT (dshowvideosrc_debug, "dshowvideosrc", 0, - "Directshow video source"); - -} - -static void -gst_dshowvideosrc_init (GstDshowVideoSrc * src) -{ - src->device = NULL; - src->device_name = NULL; - src->device_index = DEFAULT_PROP_DEVICE_INDEX; - src->video_cap_filter = NULL; - src->dshow_fakesink = NULL; - src->media_filter = NULL; - src->filter_graph = NULL; - src->caps = NULL; - src->pins_mediatypes = NULL; - src->is_rgb = FALSE; - src->is_running = FALSE; - - /*added for analog input*/ - src->graph_builder = NULL; - src->capture_builder = NULL; - src->pVC = NULL; - src->pVSC = NULL; - - g_cond_init(&src->buffer_cond); - g_mutex_init(&src->buffer_mutex); - src->buffer = NULL; - src->stop_requested = FALSE; - - CoInitializeEx (NULL, COINIT_MULTITHREADED); - - gst_base_src_set_live (GST_BASE_SRC (src), TRUE); -} - -static GstCaps * -gst_dshowvideosrc_src_fixate (GstBaseSrc * bsrc, GstCaps * caps) -{ - /* If there is no desired video size, set default video size to device preferred video size */ - - GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (bsrc); - GstStructure *structure = gst_caps_get_structure (caps, 0); - guint i = 0; - gint res = -1; - - for (; i < gst_caps_get_size (src->caps) && res == -1; i++) { - GstCaps *capstmp = gst_caps_copy_nth (src->caps, i); - - if (gst_caps_is_subset (caps, capstmp)) { - res = i; - } - gst_caps_unref (capstmp); - } - - if (res != -1) { - GList *type_pin_mediatype = g_list_nth (src->pins_mediatypes, res); - if (type_pin_mediatype) { - GstCapturePinMediaType *pin_mediatype = - (GstCapturePinMediaType *) type_pin_mediatype->data; - gst_structure_fixate_field_nearest_int (structure, "width", - pin_mediatype->defaultWidth); - gst_structure_fixate_field_nearest_int (structure, "height", - pin_mediatype->defaultHeight); - gst_structure_fixate_field_nearest_fraction (structure, "framerate", - pin_mediatype->defaultFPS, 1); - } - } - - caps = GST_BASE_SRC_CLASS (gst_dshowvideosrc_parent_class)->fixate(bsrc, caps); - - return caps; -} - -static void -gst_dshowvideosrc_dispose (GObject * gobject) -{ - GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (gobject); - - if (src->device) { - g_free (src->device); - src->device = NULL; - } - - if (src->device_name) { - g_free (src->device_name); - src->device_name = NULL; - } - - if (src->caps) { - gst_caps_unref (src->caps); - src->caps = NULL; - } - - if (src->pins_mediatypes) { - gst_dshow_free_pins_mediatypes (src->pins_mediatypes); - src->pins_mediatypes = NULL; - } - - /* clean dshow */ - if (src->video_cap_filter) { - src->video_cap_filter->Release (); - src->video_cap_filter = NULL; - } - - g_cond_clear(&src->buffer_cond); - g_mutex_clear(&src->buffer_mutex); - - CoUninitialize (); - - G_OBJECT_CLASS (gst_dshowvideosrc_parent_class)->dispose (gobject); -} - -static void -gst_dshowvideosrc_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (object); - - switch (prop_id) { - case PROP_DEVICE: - { - const gchar *device = g_value_get_string (value); - g_free (src->device); - src->device = NULL; - if (device && strlen (device) != 0) { - src->device = g_value_dup_string (value); - } - break; - } - case PROP_DEVICE_NAME: - { - const gchar *device_name = g_value_get_string (value); - g_free (src->device_name); - src->device_name = NULL; - if (device_name && strlen (device_name) != 0) { - src->device_name = g_value_dup_string (value); - } - break; - } - case PROP_DEVICE_INDEX: - { - src->device_index = g_value_get_int (value); - break; - } - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_dshowvideosrc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstDshowVideoSrc *src; - - g_return_if_fail (GST_IS_DSHOWVIDEOSRC (object)); - src = GST_DSHOWVIDEOSRC (object); - - switch (prop_id) { - case PROP_DEVICE: - g_value_set_string (value, src->device); - break; - case PROP_DEVICE_NAME: - g_value_set_string (value, src->device_name); - break; - case PROP_DEVICE_INDEX: - g_value_set_int (value, src->device_index); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static GstCaps * -gst_dshowvideosrc_get_caps (GstBaseSrc * basesrc, GstCaps * filter) -{ - GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (basesrc); - GstCaps *caps; - - if (src->caps) { - caps = gst_caps_ref (src->caps); - } else { - caps = gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD (src)); - } - - if (caps) { - GstCaps *filtcaps; - - if (filter) { - filtcaps = gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); - } else { - filtcaps = gst_caps_ref (caps); - } - gst_caps_unref (caps); - - return filtcaps; - } - - return NULL; -} - -GstCaps * -gst_dshowvideosrc_getcaps_from_capture_filter (IBaseFilter * filter, - GList ** pins_mediatypes) -{ - IPin *capture_pin = NULL; - IEnumPins *enumpins = NULL; - HRESULT hres; - GstCaps *caps; - - g_assert (filter); - - caps = gst_caps_new_empty (); - - /* get the capture pins supported types */ - hres = filter->EnumPins (&enumpins); - if (SUCCEEDED (hres)) { - while (enumpins->Next (1, &capture_pin, NULL) == S_OK) { - IKsPropertySet *pKs = NULL; - hres = - capture_pin->QueryInterface (IID_IKsPropertySet, (LPVOID *) & pKs); - if (SUCCEEDED (hres) && pKs) { - DWORD cbReturned; - GUID pin_category; - RPC_STATUS rpcstatus; - - hres = - pKs->Get (AMPROPSETID_Pin, - AMPROPERTY_PIN_CATEGORY, NULL, 0, &pin_category, sizeof (GUID), - &cbReturned); - - /* we only want capture pins */ - if (UuidCompare (&pin_category, (UUID *) & PIN_CATEGORY_CAPTURE, - &rpcstatus) == 0) { - GstCaps *caps2; - caps2 = gst_dshowvideosrc_getcaps_from_streamcaps (capture_pin, - pins_mediatypes); - if (caps2) { - gst_caps_append (caps, caps2); - } else { - caps2 = gst_dshowvideosrc_getcaps_from_enum_mediatypes ( - capture_pin, pins_mediatypes); - if (caps2) { - gst_caps_append (caps, caps2); - } - } - } - pKs->Release (); - } - capture_pin->Release (); - } - enumpins->Release (); - } - - GST_DEBUG ("Device supports these caps: %" GST_PTR_FORMAT, caps); - - return caps; -} - -static GstStateChangeReturn -gst_dshowvideosrc_change_state (GstElement * element, GstStateChange transition) -{ - HRESULT hres = S_FALSE; - GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (element); - - switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY: - break; - case GST_STATE_CHANGE_READY_TO_PAUSED: - break; - case GST_STATE_CHANGE_PAUSED_TO_PLAYING: - if (src->media_filter) { - /* Setting this to TRUE because set_caps may be invoked before - Run() returns. */ - src->is_running = TRUE; - hres = src->media_filter->Run (0); - } - if (hres != S_OK) { - GST_ERROR ("Can't RUN the directshow capture graph (error=0x%x)", hres); - src->is_running = FALSE; - return GST_STATE_CHANGE_FAILURE; - } - break; - case GST_STATE_CHANGE_PLAYING_TO_PAUSED: - if (src->media_filter) - hres = src->media_filter->Stop (); - if (hres != S_OK) { - GST_ERROR ("Can't STOP the directshow capture graph (error=%d)", hres); - return GST_STATE_CHANGE_FAILURE; - } - src->is_running = FALSE; - break; - case GST_STATE_CHANGE_PAUSED_TO_READY: - break; - case GST_STATE_CHANGE_READY_TO_NULL: - break; - } - - return GST_ELEMENT_CLASS(gst_dshowvideosrc_parent_class)->change_state(element, transition); -} - -static gboolean -gst_dshowvideosrc_start (GstBaseSrc * bsrc) -{ - HRESULT hres = S_FALSE; - GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (bsrc); - DshowDeviceEntry *device_entry; - IMoniker *moniker = NULL; - - device_entry = gst_dshow_select_device (&CLSID_VideoInputDeviceCategory, - src->device, src->device_name, src->device_index); - if (device_entry == NULL) { - GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Failed to find device"), (NULL)); - return FALSE; - } - - g_free (src->device); - g_free (src->device_name); - src->device = g_strdup (device_entry->device); - src->device_name = g_strdup (device_entry->device_name); - src->device_index = device_entry->device_index; - moniker = device_entry->moniker; - device_entry->moniker = NULL; - gst_dshow_device_entry_free (device_entry); - - src->video_cap_filter = gst_dshow_create_capture_filter (moniker); - moniker->Release (); - if (src->video_cap_filter == NULL) { - GST_ELEMENT_ERROR (src, RESOURCE, FAILED, - ("Failed to create capture filter for device"), (NULL)); - return FALSE; - } - - src->caps = gst_dshowvideosrc_getcaps_from_capture_filter ( - src->video_cap_filter, (GList**)&src->pins_mediatypes); - if (gst_caps_is_empty (src->caps)) { - GST_ELEMENT_ERROR (src, RESOURCE, FAILED, - ("Failed to get any caps from device"), (NULL)); - return FALSE; - } - - /* - The filter graph now is created via the IGraphBuilder Interface - Code added to build upstream filters, needed for USB Analog TV Tuners / DVD Maker, based on AMCap code. - by Fabrice Costa <fabricio.costa@moldeointeractive.com.ar> - */ - - hres = CoCreateInstance(CLSID_FilterGraph, NULL, - CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (LPVOID *) & src->graph_builder ); - if (hres != S_OK || !src->graph_builder ) { - GST_ERROR - ("Can't create an instance of the dshow graph builder (error=0x%x)", - hres); - goto error; - } else { - /*graph builder is derived from IFilterGraph so we can assign it to the old src->filter_graph*/ - src->filter_graph = (IFilterGraph*) src->graph_builder; - } - - /*adding capture graph builder to correctly create upstream filters, Analog TV, TV Tuner */ - - hres = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, - CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, - (LPVOID *) & src->capture_builder); - if ( hres != S_OK || !src->capture_builder ) { - GST_ERROR - ("Can't create an instance of the dshow capture graph builder manager (error=0x%x)", - hres); - goto error; - } else { - src->capture_builder->SetFiltergraph(src->graph_builder); - } - - hres = src->filter_graph->QueryInterface (IID_IMediaFilter, - (LPVOID *) & src->media_filter); - if (hres != S_OK || !src->media_filter) { - GST_ERROR - ("Can't get IMediacontrol interface from the graph manager (error=0x%x)", - hres); - goto error; - } - - src->dshow_fakesink = new CDshowFakeSink; - src->dshow_fakesink->AddRef (); - - hres = src->filter_graph->AddFilter (src->video_cap_filter, L"capture"); - if (hres != S_OK) { - GST_ERROR ("Can't add video capture filter to the graph (error=0x%x)", - hres); - goto error; - } - - /* Finding interfaces really creates the upstream filters */ - - hres = src->capture_builder->FindInterface(&PIN_CATEGORY_CAPTURE, - &MEDIATYPE_Interleaved, src->video_cap_filter, - IID_IAMVideoCompression, (LPVOID *)&src->pVC); - - if(hres != S_OK) - { - hres = src->capture_builder->FindInterface(&PIN_CATEGORY_CAPTURE, - &MEDIATYPE_Video, src->video_cap_filter, - IID_IAMVideoCompression, (LPVOID *)&src->pVC); - } - - hres = src->capture_builder->FindInterface(&PIN_CATEGORY_CAPTURE, - &MEDIATYPE_Interleaved, - src->video_cap_filter, IID_IAMStreamConfig, (LPVOID *)&src->pVSC); - if(hres != S_OK) - { - hres = src->capture_builder->FindInterface(&PIN_CATEGORY_CAPTURE, - &MEDIATYPE_Video, src->video_cap_filter, - IID_IAMStreamConfig, (LPVOID *)&src->pVSC); - if (hres != S_OK) { - /* this means we can't set frame rate (non-DV only) */ - GST_ERROR ("Error %x: Cannot find VCapture:IAMStreamConfig", hres); - goto error; - } - } - - hres = src->filter_graph->AddFilter (src->dshow_fakesink, L"sink"); - if (hres != S_OK) { - GST_ERROR ("Can't add our fakesink filter to the graph (error=0x%x)", hres); - goto error; - } - - return TRUE; - -error: - GST_ELEMENT_ERROR (src, RESOURCE, FAILED, - ("Failed to build filter graph"), (NULL)); - - if (src->dshow_fakesink) { - src->dshow_fakesink->Release (); - src->dshow_fakesink = NULL; - } - - if (src->media_filter) { - src->media_filter->Release (); - src->media_filter = NULL; - } - if (src->graph_builder) { - src->graph_builder->Release (); - src->graph_builder = NULL; - } - if (src->capture_builder) { - src->capture_builder->Release (); - src->capture_builder = NULL; - } - if (src->pVC) { - src->pVC->Release (); - src->pVC = NULL; - } - if (src->pVSC) { - src->pVSC->Release (); - src->pVSC = NULL; - } - - return FALSE; -} - -static gboolean -gst_dshowvideosrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps) -{ - HRESULT hres; - IPin *input_pin = NULL; - GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (bsrc); - GstStructure *s = gst_caps_get_structure (caps, 0); - GstCaps *current_caps = gst_pad_get_current_caps (GST_BASE_SRC_PAD (bsrc)); - - if (current_caps) { - if (gst_caps_is_equal (caps, current_caps)) { - gst_caps_unref (current_caps); - return TRUE; - } - gst_caps_unref (current_caps); - } - - /* Same remark as in gstdshowaudiosrc. */ - gboolean was_running = src->is_running; - if (was_running) { - HRESULT hres = src->media_filter->Stop (); - if (hres != S_OK) { - GST_ERROR ("Can't STOP the directshow capture graph (error=0x%x)", hres); - return FALSE; - } - src->is_running = FALSE; - } - - /* search the negotiated caps in our caps list to get its index and the corresponding mediatype */ - if (gst_caps_is_subset (caps, src->caps)) { - guint i = 0; - gint res = -1; - - for (; i < gst_caps_get_size (src->caps) && res == -1; i++) { - GstCaps *capstmp = gst_caps_copy_nth (src->caps, i); - - if (gst_caps_is_subset (caps, capstmp)) { - res = i; - } - gst_caps_unref (capstmp); - } - - if (res != -1 && src->pins_mediatypes) { - /* get the corresponding media type and build the dshow graph */ - GList *type_pin_mediatype = g_list_nth (src->pins_mediatypes, res); - - if (type_pin_mediatype) { - GstCapturePinMediaType *pin_mediatype = - (GstCapturePinMediaType *) type_pin_mediatype->data; - gchar *caps_string = NULL; - gchar *src_caps_string = NULL; - - GST_DEBUG_OBJECT (src, "Default: %dx%d@%d", pin_mediatype->defaultWidth, pin_mediatype->defaultHeight, pin_mediatype->defaultFPS); - - /* retrieve the desired video size */ - VIDEOINFOHEADER *video_info = NULL; - gint width = 0; - gint height = 0; - gint numerator = 0; - gint denominator = 0; - gst_structure_get_int (s, "width", &width); - gst_structure_get_int (s, "height", &height); - gst_structure_get_fraction (s, "framerate", &numerator, &denominator); - - /* check if the desired video size is valid about granularity */ - /* This check will be removed when GST_TYPE_INT_RANGE_STEP exits */ - /* See remarks in gst_dshow_new_video_caps function */ - if (pin_mediatype->granularityWidth != 0 - && width % pin_mediatype->granularityWidth != 0) - g_warning ("your desired video size is not valid : %d mod %d !=0\n", - width, pin_mediatype->granularityWidth); - if (pin_mediatype->granularityHeight != 0 - && height % pin_mediatype->granularityHeight != 0) - g_warning ("your desired video size is not valid : %d mod %d !=0\n", - height, pin_mediatype->granularityHeight); - - /* update mediatype */ - video_info = (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat; - video_info->bmiHeader.biWidth = width; - video_info->bmiHeader.biHeight = height; - video_info->AvgTimePerFrame = - (LONGLONG) (10000000 * denominator / (double) numerator); - video_info->bmiHeader.biSizeImage = DIBSIZE (video_info->bmiHeader); - pin_mediatype->mediatype->lSampleSize = DIBSIZE (video_info->bmiHeader); - - src->dshow_fakesink->gst_set_media_type (pin_mediatype->mediatype); - src->dshow_fakesink->gst_set_buffer_callback ( - (push_buffer_func) gst_dshowvideosrc_push_buffer, src); - - gst_dshow_get_pin_from_filter (src->dshow_fakesink, PINDIR_INPUT, - &input_pin); - if (!input_pin) { - GST_ERROR ("Can't get input pin from our dshow fakesink"); - goto error; - } - - if (gst_dshow_is_pin_connected (pin_mediatype->capture_pin)) { - GST_DEBUG_OBJECT (src, - "capture_pin already connected, disconnecting"); - src->filter_graph->Disconnect (pin_mediatype->capture_pin); - } - - if (gst_dshow_is_pin_connected (input_pin)) { - GST_DEBUG_OBJECT (src, "input_pin already connected, disconnecting"); - src->filter_graph->Disconnect (input_pin); - } - - hres = src->pVSC->SetFormat(pin_mediatype->mediatype); - if (FAILED (hres)) { - GST_ERROR ("Failed to set capture pin format (error=0x%x)", hres); - goto error; - } - - hres = src->filter_graph->ConnectDirect (pin_mediatype->capture_pin, - input_pin, pin_mediatype->mediatype); - input_pin->Release (); - - if (hres != S_OK) { - GST_ERROR - ("Can't connect capture filter with fakesink filter (error=0x%x)", - hres); - goto error; - } - - /* save width and height negotiated */ - gst_structure_get_int (s, "width", &src->width); - gst_structure_get_int (s, "height", &src->height); - - GstVideoInfo info; - gst_video_info_from_caps(&info, caps); - switch (GST_VIDEO_INFO_FORMAT(&info)) { - case GST_VIDEO_FORMAT_RGB: - case GST_VIDEO_FORMAT_BGR: - src->is_rgb = TRUE; - break; - default: - src->is_rgb = FALSE; - break; - } - } - } - } - - if (was_running) { - HRESULT hres = src->media_filter->Run (0); - if (hres != S_OK) { - GST_ERROR ("Can't RUN the directshow capture graph (error=0x%x)", hres); - return FALSE; - } - src->is_running = TRUE; - } - - return TRUE; - -error: - return FALSE; -} - -static gboolean -gst_dshowvideosrc_stop (GstBaseSrc * bsrc) -{ - IPin *input_pin = NULL, *output_pin = NULL; - HRESULT hres = S_FALSE; - GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (bsrc); - - if (!src->filter_graph) - return TRUE; - - /* disconnect filters */ - gst_dshow_get_pin_from_filter (src->video_cap_filter, PINDIR_OUTPUT, - &output_pin); - if (output_pin) { - hres = src->filter_graph->Disconnect (output_pin); - output_pin->Release (); - } - - gst_dshow_get_pin_from_filter (src->dshow_fakesink, PINDIR_INPUT, &input_pin); - if (input_pin) { - hres = src->filter_graph->Disconnect (input_pin); - input_pin->Release (); - } - - /* remove filters from the graph */ - src->filter_graph->RemoveFilter (src->video_cap_filter); - src->filter_graph->RemoveFilter (src->dshow_fakesink); - - /* release our gstreamer dshow sink */ - src->dshow_fakesink->Release (); - src->dshow_fakesink = NULL; - - /* release media filter interface */ - src->media_filter->Release (); - src->media_filter = NULL; - - /* release any upstream filter */ - if (src->pVC) { - src->pVC->Release (); - src->pVC = NULL; - } - - if (src->pVSC) { - src->pVSC->Release (); - src->pVSC = NULL; - } - -/* release the graph builder */ - if (src->graph_builder) { - src->graph_builder->Release (); - src->graph_builder = NULL; - src->filter_graph = NULL; - } - -/* release the capture builder */ - if (src->capture_builder) { - src->capture_builder->Release (); - src->capture_builder = NULL; - } - - /* reset caps */ - if (src->caps) { - gst_caps_unref (src->caps); - src->caps = NULL; - } - - /* reset device id */ - if (src->device) { - g_free (src->device); - src->device = NULL; - } - - if (src->video_cap_filter) { - src->video_cap_filter->Release (); - src->video_cap_filter = NULL; - } - - return TRUE; -} - -static gboolean -gst_dshowvideosrc_unlock (GstBaseSrc * bsrc) -{ - GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (bsrc); - - g_mutex_lock (&src->buffer_mutex); - src->stop_requested = TRUE; - g_cond_signal (&src->buffer_cond); - g_mutex_unlock (&src->buffer_mutex); - - return TRUE; -} - -static gboolean -gst_dshowvideosrc_unlock_stop (GstBaseSrc * bsrc) -{ - GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (bsrc); - - src->stop_requested = FALSE; - - return TRUE; -} - -static GstFlowReturn -gst_dshowvideosrc_create (GstPushSrc * psrc, GstBuffer ** buf) -{ - GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (psrc); - - g_mutex_lock (&src->buffer_mutex); - while (src->buffer == NULL && !src->stop_requested) - g_cond_wait (&src->buffer_cond, &src->buffer_mutex); - *buf = src->buffer; - src->buffer = NULL; - g_mutex_unlock (&src->buffer_mutex); - - if (src->stop_requested) { - if (*buf != NULL) { - gst_buffer_unref (*buf); - *buf = NULL; - } - return GST_FLOW_FLUSHING; - } - - GST_DEBUG ("dshowvideosrc_create => pts %" GST_TIME_FORMAT " duration %" - GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (*buf)), - GST_TIME_ARGS (GST_BUFFER_DURATION (*buf))); - - return GST_FLOW_OK; -} - -GstCaps * -gst_dshowvideosrc_getcaps_from_streamcaps (IPin * pin, GList ** pins_mediatypes) -{ - GstCaps *caps = NULL; - HRESULT hres = S_OK; - int icount = 0; - int isize = 0; - int i = 0; - IAMStreamConfig *streamcaps = NULL; - - hres = pin->QueryInterface (IID_IAMStreamConfig, (LPVOID *) & streamcaps); - if (FAILED (hres)) { - GST_ERROR ("Failed to retrieve IAMStreamConfig (error=0x%x)", hres); - return NULL; - } - - streamcaps->GetNumberOfCapabilities (&icount, &isize); - - if (isize != sizeof (VIDEO_STREAM_CONFIG_CAPS)) { - streamcaps->Release (); - return NULL; - } - - caps = gst_caps_new_empty (); - - for (i = 0; i < icount; i++) { - - GstCapturePinMediaType *pin_mediatype = - gst_dshow_new_pin_mediatype_from_streamcaps (pin, i, streamcaps); - - if (pin_mediatype) { - - GstCaps *mediacaps = NULL; - GstVideoFormat video_format = - gst_dshow_guid_to_gst_video_format (pin_mediatype->mediatype); - - if (video_format != GST_VIDEO_FORMAT_UNKNOWN) { - mediacaps = gst_dshow_new_video_caps (video_format, NULL, - pin_mediatype); - - } else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, - MEDIASUBTYPE_dvsd, FORMAT_VideoInfo)) { - mediacaps = - gst_dshow_new_video_caps (GST_VIDEO_FORMAT_UNKNOWN, - "video/x-dv, systemstream=FALSE", pin_mediatype); - - } else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, - MEDIASUBTYPE_dvsd, FORMAT_DvInfo)) { - mediacaps = - gst_dshow_new_video_caps (GST_VIDEO_FORMAT_UNKNOWN, - "video/x-dv, systemstream=TRUE", pin_mediatype); - - pin_mediatype->granularityWidth = 0; - pin_mediatype->granularityHeight = 0; - - } else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, - MEDIASUBTYPE_MJPG, FORMAT_VideoInfo)) { - mediacaps = - gst_dshow_new_video_caps (GST_VIDEO_FORMAT_ENCODED, - "image/jpeg", pin_mediatype); - - } else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, - MEDIASUBTYPE_H264, FORMAT_VideoInfo)) { - mediacaps = - gst_dshow_new_video_caps (GST_VIDEO_FORMAT_ENCODED, - "video/x-h264", pin_mediatype); - } - - if (mediacaps) { - if (pins_mediatypes != NULL) { - *pins_mediatypes = g_list_append (*pins_mediatypes, pin_mediatype); - } - gst_caps_append (caps, mediacaps); - } else { - /* failed to convert dshow caps */ - gst_dshow_free_pin_mediatype (pin_mediatype); - } - } - } - - streamcaps->Release (); - - if (caps && gst_caps_is_empty (caps)) { - gst_caps_unref (caps); - caps = NULL; - } - - return caps; -} - -GstCaps * -gst_dshowvideosrc_getcaps_from_enum_mediatypes (IPin * pin, GList ** pins_mediatypes) -{ - GstCaps *caps = NULL; - IEnumMediaTypes *enum_mediatypes = NULL; - HRESULT hres = S_OK; - GstCapturePinMediaType *pin_mediatype = NULL; - - hres = pin->EnumMediaTypes (&enum_mediatypes); - if (FAILED (hres)) { - GST_ERROR ("Failed to retrieve IEnumMediaTypes (error=0x%x)", hres); - return NULL; - } - - caps = gst_caps_new_empty (); - - while ((pin_mediatype = gst_dshow_new_pin_mediatype_from_enum_mediatypes (pin, enum_mediatypes)) != NULL) { - - GstCaps *mediacaps = NULL; - GstVideoFormat video_format = gst_dshow_guid_to_gst_video_format (pin_mediatype->mediatype); - - if (video_format != GST_VIDEO_FORMAT_UNKNOWN) { - GstVideoInfo info; - - gst_video_info_init(&info); - gst_video_info_set_format(&info, video_format, pin_mediatype->defaultWidth, pin_mediatype->defaultHeight); - info.fps_n = pin_mediatype->defaultFPS; - info.fps_d = 1; - info.par_n = 1; - info.par_d = 1; - info.interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE; /* XXX is this correct ? */ - mediacaps = gst_video_info_to_caps(&info); - } - - if (mediacaps) { - if (pins_mediatypes != NULL) { - *pins_mediatypes = g_list_append (*pins_mediatypes, pin_mediatype); - } - gst_caps_append (caps, mediacaps); - } else { - /* failed to convert dshow caps */ - gst_dshow_free_pin_mediatype (pin_mediatype); - } - } - - enum_mediatypes->Release (); - - if (caps && gst_caps_is_empty (caps)) { - gst_caps_unref (caps); - caps = NULL; - } - - return caps; -} - -static gboolean -gst_dshowvideosrc_push_buffer (guint8 * buffer, guint size, gpointer src_object, - GstClockTime duration) -{ - GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (src_object); - GstBuffer *buf = NULL; - IPin *pPin = NULL; - HRESULT hres = S_FALSE; - AM_MEDIA_TYPE *pMediaType = NULL; - GstMapInfo info; - - if (!buffer || size == 0 || !src) { - return FALSE; - } - - /* create a new buffer assign to it the clock time as timestamp */ - buf = gst_buffer_new_and_alloc (size); - - gst_buffer_set_size(buf, size); - - GstClock *clock = gst_element_get_clock (GST_ELEMENT (src)); - GST_BUFFER_TIMESTAMP (buf) = - GST_CLOCK_DIFF (gst_element_get_base_time (GST_ELEMENT (src)), gst_clock_get_time (clock)); - gst_object_unref (clock); - - GST_BUFFER_DURATION (buf) = duration; - - if (!gst_buffer_map(buf, &info, GST_MAP_WRITE)) { - gst_buffer_unref(buf); - GST_ERROR("Failed to map buffer"); - return FALSE; - } - - if (src->is_rgb) { - /* FOR RGB directshow decoder will return bottom-up BITMAP - * There is probably a way to get top-bottom video frames from - * the decoder... - */ - gint line = 0; - gint stride = size / src->height; - - for (; line < src->height; line++) { - memcpy (info.data + (line * stride), - buffer + (size - ((line + 1) * (stride))), stride); - } - } else { - memcpy (info.data, buffer, size); - } - - gst_buffer_unmap(buf, &info); - - GST_DEBUG ("push_buffer => pts %" GST_TIME_FORMAT "duration %" - GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), - GST_TIME_ARGS (duration)); - - g_mutex_lock (&src->buffer_mutex); - if (src->buffer != NULL) - gst_buffer_unref (src->buffer); - src->buffer = buf; - g_cond_signal (&src->buffer_cond); - g_mutex_unlock (&src->buffer_mutex); - - return TRUE; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowsrcwrapper/gstdshowvideosrc.h
Deleted
@@ -1,109 +0,0 @@ -/* GStreamer - * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> - * - * gstdshowvideosrc.h: - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_DSHOWVIDEOSRC_H__ -#define __GST_DSHOWVIDEOSRC_H__ - -#include <glib.h> -#include <gst/gst.h> -#include <gst/base/gstpushsrc.h> - -#include "gstdshow.h" -#include "gstdshowfakesink.h" - -// 30323449-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_I420 -DEFINE_GUID (MEDIASUBTYPE_I420, 0x30323449, 0x0000, 0x0010, 0x80, 0x00, 0x00, - 0xAA, 0x00, 0x38, 0x9B, 0x71); -DEFINE_GUID (MEDIASUBTYPE_UYVY, 0x59565955, 0x0000, 0x0010, 0x80, 0x00, 0x00, - 0xAA, 0x00, 0x38, 0x9B, 0x71); - -G_BEGIN_DECLS -#define GST_TYPE_DSHOWVIDEOSRC (gst_dshowvideosrc_get_type()) -#define GST_DSHOWVIDEOSRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DSHOWVIDEOSRC,GstDshowVideoSrc)) -#define GST_DSHOWVIDEOSRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DSHOWVIDEOSRC,GstDshowVideoSrcClass)) -#define GST_IS_DSHOWVIDEOSRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DSHOWVIDEOSRC)) -#define GST_IS_DSHOWVIDEOSRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DSHOWVIDEOSRC)) -typedef struct _GstDshowVideoSrc GstDshowVideoSrc; -typedef struct _GstDshowVideoSrcClass GstDshowVideoSrcClass; - - -struct _GstDshowVideoSrc -{ - GstPushSrc src; - - /* device dshow reference (generally classid/name) */ - gchar *device; - - /* device friendly name */ - gchar *device_name; - - /* device index */ - gint device_index; - - /* list of caps created from the list of supported media types of the dshow capture filter */ - GstCaps *caps; - - /* list of dshow media types from the filter's capture pins */ - GList *pins_mediatypes; - - /* dshow video capture filter */ - IBaseFilter *video_cap_filter; - - /* dshow sink filter */ - CDshowFakeSink *dshow_fakesink; - - /* graph manager interfaces */ - IMediaFilter *media_filter; - IFilterGraph *filter_graph; - - IGraphBuilder *graph_builder; - ICaptureGraphBuilder2 *capture_builder; - IAMVideoCompression *pVC; - //IAMVfwCaptureDialogs *pDlg; - //IAMStreamConfig *pASC; // for audio cap - IAMStreamConfig *pVSC; // for video cap - - /* the last buffer from DirectShow */ - GCond buffer_cond; - GMutex buffer_mutex; - GstBuffer *buffer; - gboolean stop_requested; - - gboolean is_rgb; - gboolean is_running; - gint width; - gint height; -}; - -struct _GstDshowVideoSrcClass -{ - GstPushSrcClass parent_class; -}; - -GType gst_dshowvideosrc_get_type (void); - - -GstCaps * gst_dshowvideosrc_getcaps_from_capture_filter (IBaseFilter * filter, - GList ** pins_mediatypes); - - -G_END_DECLS -#endif /* __GST_DSHOWVIDEOSRC_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowvideosink
Deleted
-(directory)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowvideosink/README
Deleted
@@ -1,5 +0,0 @@ -To build this, you'll require the DirectShow base classes. These are supplied -in the Windows SDK, but under Samples\Multimedia\DirectShow\BaseClasses - -Once you've built that, you should be able to figure out the rest... -
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowvideosink/dshowvideofakesrc.cpp
Deleted
@@ -1,415 +0,0 @@ -/* GStreamer - * Copyright (C) 2008 Pioneers of the Inevitable <songbird@songbirdnest.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "dshowvideofakesrc.h" - -GST_DEBUG_CATEGORY_EXTERN (dshowvideosink_debug); -#define GST_CAT_DEFAULT dshowvideosink_debug - -// {A0A5CF33-BD0C-4158-9A56-3011DEE3AF6B} -const GUID CLSID_VideoFakeSrc = -{ 0xa0a5cf33, 0xbd0c, 0x4158, { 0x9a, 0x56, 0x30, 0x11, 0xde, 0xe3, 0xaf, 0x6b } }; - -/* output pin*/ -VideoFakeSrcPin::VideoFakeSrcPin (CBaseFilter *pFilter, CCritSec *sec, HRESULT *hres): - CDynamicOutputPin("VideoFakeSrcPin", pFilter, sec, hres, L"output") -{ -} - -VideoFakeSrcPin::~VideoFakeSrcPin() -{ -} - -HRESULT VideoFakeSrcPin::GetMediaType(int iPosition, CMediaType *pMediaType) -{ - GST_DEBUG ("GetMediaType(%d) called", iPosition); - if(iPosition == 0) { - *pMediaType = m_MediaType; - return S_OK; - } - - return VFW_S_NO_MORE_ITEMS; -} - -/* This seems to be called to notify us of the actual media type being used, - * even though SetMediaType isn't called. How bizarre! */ -HRESULT VideoFakeSrcPin::CheckMediaType(const CMediaType *pmt) -{ - GST_DEBUG ("CheckMediaType called: %p", pmt); - - /* The video renderer will request a different stride, which we must accept. - * So, we accept arbitrary strides (and do memcpy() to convert if needed), - * and require the rest of the media type to match - */ - if (IsEqualGUID(pmt->majortype,m_MediaType.majortype) && - IsEqualGUID(pmt->subtype,m_MediaType.subtype) && - IsEqualGUID(pmt->formattype,m_MediaType.formattype) && - pmt->cbFormat >= m_MediaType.cbFormat) - { - if (IsEqualGUID(pmt->formattype, FORMAT_VideoInfo)) { - VIDEOINFOHEADER *newvh = (VIDEOINFOHEADER *)pmt->pbFormat; - VIDEOINFOHEADER *curvh = (VIDEOINFOHEADER *)m_MediaType.pbFormat; - - if ((memcmp ((void *)&newvh->rcSource, (void *)&curvh->rcSource, sizeof (RECT)) == 0) && - (memcmp ((void *)&newvh->rcTarget, (void *)&curvh->rcTarget, sizeof (RECT)) == 0) && - (newvh->bmiHeader.biCompression == curvh->bmiHeader.biCompression) && - (newvh->bmiHeader.biHeight == curvh->bmiHeader.biHeight) && - (newvh->bmiHeader.biWidth >= curvh->bmiHeader.biWidth)) - { - GST_DEBUG ("CheckMediaType has same media type, width %d (%d image)", newvh->bmiHeader.biWidth, curvh->bmiHeader.biWidth); - - /* OK, compatible! */ - return S_OK; - } - else { - GST_WARNING ("Looked similar, but aren't..."); - } - } - - } - GST_WARNING ("Different media types, FAILING!"); - return S_FALSE; -} - -HRESULT VideoFakeSrcPin::DecideBufferSize (IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest) -{ - ALLOCATOR_PROPERTIES properties; - GST_DEBUG ("Required allocator properties: %d, %d, %d, %d", - ppropInputRequest->cbAlign, ppropInputRequest->cbBuffer, - ppropInputRequest->cbPrefix, ppropInputRequest->cBuffers); - - ppropInputRequest->cbBuffer = m_SampleSize; - ppropInputRequest->cBuffers = 1; - - /* First set the buffer descriptions we're interested in */ - HRESULT hres = pAlloc->SetProperties(ppropInputRequest, &properties); - GST_DEBUG ("Actual Allocator properties: %d, %d, %d, %d", - properties.cbAlign, properties.cbBuffer, - properties.cbPrefix, properties.cBuffers); - - return S_OK; -} - -STDMETHODIMP -VideoFakeSrcPin::Notify(IBaseFilter * pSender, Quality q) -{ - /* Implementing this usefully is not required, but the base class - * has an assertion here... */ - /* TODO: Map this to GStreamer QOS events? */ - return E_NOTIMPL; -} - -STDMETHODIMP VideoFakeSrcPin::SetMediaType (AM_MEDIA_TYPE *pmt) -{ - m_MediaType.Set (*pmt); - m_SampleSize = m_MediaType.GetSampleSize(); - - GST_DEBUG ("SetMediaType called. SampleSize is %d", m_SampleSize); - - return S_OK; -} - -/* If the destination buffer is a different shape (strides, etc.) from the source - * buffer, we have to copy. Do that here, for supported video formats. - * - * TODO: When possible (when these things DON'T differ), we should buffer-alloc the - * final output buffer, and not do this copy */ -STDMETHODIMP VideoFakeSrcPin::CopyToDestinationBuffer (byte *srcbuf, byte *dstbuf) -{ - VIDEOINFOHEADER *vh = (VIDEOINFOHEADER *)m_MediaType.pbFormat; - GST_DEBUG ("Rendering a frame"); - - byte *src, *dst; - int dststride, srcstride, rows; - guint32 fourcc = vh->bmiHeader.biCompression; - - /* biHeight is always negative; we don't want that. */ - int height = ABS (vh->bmiHeader.biHeight); - int width = vh->bmiHeader.biWidth; - - /* YUY2 is the preferred layout for DirectShow, so we will probably get this - * most of the time */ - if ((fourcc == GST_MAKE_FOURCC ('Y', 'U', 'Y', '2')) || - (fourcc == GST_MAKE_FOURCC ('Y', 'U', 'Y', 'V')) || - (fourcc == GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'))) - { - /* Nice and simple */ - int srcstride = GST_ROUND_UP_4 (vh->rcSource.right * 2); - int dststride = width * 2; - - for (int i = 0; i < height; i++) { - memcpy (dstbuf + dststride * i, srcbuf + srcstride * i, srcstride); - } - } - else if (fourcc == GST_MAKE_FOURCC ('Y', 'V', '1', '2')) { - for (int component = 0; component < 3; component++) { - // TODO: Get format properly rather than hard-coding it. Use gst_video_* APIs *? - if (component == 0) { - srcstride = GST_ROUND_UP_4 (vh->rcSource.right); - src = srcbuf; - } - else { - srcstride = GST_ROUND_UP_4 ( GST_ROUND_UP_2 (vh->rcSource.right) / 2); - if (component == 1) - src = srcbuf + GST_ROUND_UP_4 (vh->rcSource.right) * GST_ROUND_UP_2 (vh->rcSource.bottom); - else - src = srcbuf + GST_ROUND_UP_4 (vh->rcSource.right) * GST_ROUND_UP_2 (vh->rcSource.bottom) + - srcstride * (GST_ROUND_UP_2 (vh->rcSource.bottom) / 2); - } - - /* Is there a better way to do this? This is ICK! */ - if (component == 0) { - dststride = width; - dst = dstbuf; - rows = height; - } else if (component == 1) { - dststride = width / 2; - dst = dstbuf + width * height; - rows = height/2; - } - else { - dststride = width / 2; - dst = dstbuf + width * height + - width/2 * height/2; - rows = height/2; - } - - for (int i = 0; i < rows; i++) { - memcpy (dst + i * dststride, src + i * srcstride, srcstride); - } - } - } - - return S_OK; -} - -STDMETHODIMP VideoFakeSrcPin::Disconnect () -{ - GST_DEBUG_OBJECT (this, "Disconnecting pin"); - HRESULT hr = CDynamicOutputPin::Disconnect(); - GST_DEBUG_OBJECT (this, "Pin disconnected"); - return hr; -} - -HRESULT VideoFakeSrcPin::Inactive () -{ - GST_DEBUG_OBJECT (this, "Pin going inactive"); - HRESULT hr = CDynamicOutputPin::Inactive(); - GST_DEBUG_OBJECT (this, "Pin inactivated"); - return hr; -} - -HRESULT VideoFakeSrcPin::BreakConnect () -{ - GST_DEBUG_OBJECT (this, "Breaking connection"); - HRESULT hr = CDynamicOutputPin::BreakConnect(); - GST_DEBUG_OBJECT (this, "Connection broken"); - return hr; -} - -HRESULT VideoFakeSrcPin::CompleteConnect (IPin *pReceivePin) -{ - GST_DEBUG_OBJECT (this, "Completing connection"); - HRESULT hr = CDynamicOutputPin::CompleteConnect(pReceivePin); - GST_DEBUG_OBJECT (this, "Completed connection: %x", hr); - return hr; -} - -STDMETHODIMP VideoFakeSrcPin::Block(DWORD dwBlockFlags, HANDLE hEvent) -{ - GST_DEBUG_OBJECT (this, "Calling Block()"); - HRESULT hr = CDynamicOutputPin::Block (dwBlockFlags, hEvent); - GST_DEBUG_OBJECT (this, "Called Block()"); - return hr; -} - -/* When moving the video to a different monitor, directshow stops and restarts the playback pipeline. - * Unfortunately, it doesn't properly block pins or do anything special, so we racily just fail - * at this point. - * So, we try multiple times in a loop, hoping that it'll have finished (we get no notifications at all!) - * at some point. - */ -#define MAX_ATTEMPTS 10 - -GstFlowReturn VideoFakeSrcPin::PushBuffer(GstBuffer *buffer) -{ - IMediaSample *pSample = NULL; - byte *data; - GstMapInfo map; - int attempts = 0; - HRESULT hres; - BYTE *sample_buffer; - AM_MEDIA_TYPE *mediatype; - - /* FIXME: check return value. */ - gst_buffer_map (buffer, &map, GST_MAP_READ); - data = map.data; - StartUsingOutputPin(); - - while (attempts < MAX_ATTEMPTS) - { - hres = GetDeliveryBuffer(&pSample, NULL, NULL, 0); - if (SUCCEEDED (hres)) - break; - attempts++; - Sleep(100); - } - - if (FAILED (hres)) - { - StopUsingOutputPin(); - GST_WARNING ("Could not get sample for delivery to sink: %x", hres); - return GST_FLOW_ERROR; - } - - pSample->GetPointer(&sample_buffer); - pSample->GetMediaType(&mediatype); - if (mediatype) - SetMediaType (mediatype); - - if(sample_buffer) - { - /* Copy to the destination stride. - * This is not just a simple memcpy because of the different strides. - * TODO: optimise for the same-stride case and avoid the copy entirely. - */ - CopyToDestinationBuffer (data, sample_buffer); - } - gst_buffer_unmap (buffer, &map); - - pSample->SetDiscontinuity(FALSE); /* Decoded frame; unimportant */ - pSample->SetSyncPoint(TRUE); /* Decoded frame; always a valid syncpoint */ - pSample->SetPreroll(FALSE); /* For non-displayed frames. - Not used in GStreamer */ - - /* Disable synchronising on this sample. We instead let GStreamer handle - * this at a higher level, inside BaseSink. */ - pSample->SetTime(NULL, NULL); - - while (attempts < MAX_ATTEMPTS) - { - hres = Deliver(pSample); - if (SUCCEEDED (hres)) - break; - attempts++; - Sleep(100); - } - - pSample->Release(); - - StopUsingOutputPin(); - - if (SUCCEEDED (hres)) - return GST_FLOW_OK; - else { - GST_WARNING_OBJECT (this, "Failed to deliver sample: %x", hres); - if (hres == VFW_E_NOT_CONNECTED) - return GST_FLOW_NOT_LINKED; - else - return GST_FLOW_ERROR; - } -} - -STDMETHODIMP VideoFakeSrcPin::Flush () -{ - DeliverBeginFlush(); - DeliverEndFlush(); - return S_OK; -} - -VideoFakeSrc::VideoFakeSrc() : CBaseFilter("VideoFakeSrc", NULL, &m_critsec, CLSID_VideoFakeSrc), - m_evFilterStoppingEvent(TRUE) -{ - HRESULT hr = S_OK; - m_pOutputPin = new VideoFakeSrcPin ((CSource *)this, &m_critsec, &hr); -} - -int VideoFakeSrc::GetPinCount() -{ - return 1; -} - -CBasePin *VideoFakeSrc::GetPin(int n) -{ - return (CBasePin *)m_pOutputPin; -} - -VideoFakeSrcPin *VideoFakeSrc::GetOutputPin() -{ - return m_pOutputPin; -} - -STDMETHODIMP VideoFakeSrc::Stop(void) -{ - GST_DEBUG_OBJECT (this, "Stop()"); - m_evFilterStoppingEvent.Set(); - - return CBaseFilter::Stop(); -} - -STDMETHODIMP VideoFakeSrc::Pause(void) -{ - GST_DEBUG_OBJECT (this, "Pause()"); - - m_evFilterStoppingEvent.Reset(); - - return CBaseFilter::Pause(); -} - -STDMETHODIMP VideoFakeSrc::Run(REFERENCE_TIME tStart) -{ - GST_DEBUG_OBJECT (this, "Run()"); - - return CBaseFilter::Run(tStart); -} - -STDMETHODIMP VideoFakeSrc::JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR pName) -{ - HRESULT hr; - - // The filter is joining the filter graph. - if(NULL != pGraph) - { - IGraphConfig* pGraphConfig = NULL; - hr = pGraph->QueryInterface(IID_IGraphConfig, (void**)&pGraphConfig); - if(FAILED(hr)) - return hr; - - hr = CBaseFilter::JoinFilterGraph(pGraph, pName); - if(FAILED(hr)) - { - pGraphConfig->Release(); - return hr; - } - - m_pOutputPin->SetConfigInfo(pGraphConfig, m_evFilterStoppingEvent); - pGraphConfig->Release(); - } - else - { - hr = CBaseFilter::JoinFilterGraph(pGraph, pName); - if(FAILED(hr)) - return hr; - - m_pOutputPin->SetConfigInfo(NULL, NULL); - } - - return S_OK; -} -
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowvideosink/dshowvideosink.cpp
Deleted
@@ -1,1894 +0,0 @@ -/* GStreamer - * Copyright (C) 2008 Pioneers of the Inevitable <songbird@songbirdnest.com> - * 2010 FLUENDO S.A. <support@fluendo.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "dshowvideosink.h" -#include "dshowvideofakesrc.h" - -#include <gst/video/video.h> -#include <gst/video/videooverlay.h> -#include <gst/video/navigation.h> - -#include "windows.h" - -#define WM_GRAPH_NOTIFY WM_APP + 1 /* Private message */ - -GST_DEBUG_CATEGORY (dshowvideosink_debug); -#define GST_CAT_DEFAULT dshowvideosink_debug - -static GstCaps * gst_directshow_media_type_to_caps (AM_MEDIA_TYPE *mediatype); -static gboolean gst_caps_to_directshow_media_type (GstDshowVideoSink * sink, - GstCaps *caps, AM_MEDIA_TYPE *mediatype); - -/* TODO: Support RGB! */ -static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( - "video/x-raw," - "width = (int) 1, MAX ," - "height = (int) 1, MAX ," - "framerate = (fraction) 0, MAX ," - "format = {(string)YUY2, (string)UYVY, (string)YV12 }") - ); - -static void gst_dshowvideosink_init_interfaces (GType type); - -static void gst_dshowvideosink_videooverlay_init (GstVideoOverlayInterface *iface); -static void -gst_dshowvideosink_navigation_interface_init (GstNavigationInterface * iface); - -#define gst_dshowvideosink_parent_class parent_class -G_DEFINE_TYPE_WITH_CODE (GstDshowVideoSink, gst_dshowvideosink, - GST_TYPE_VIDEO_SINK, - G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_OVERLAY, gst_dshowvideosink_videooverlay_init); - G_IMPLEMENT_INTERFACE (GST_TYPE_NAVIGATION, gst_dshowvideosink_navigation_interface_init)) - -enum -{ - PROP_0, - PROP_KEEP_ASPECT_RATIO, - PROP_FULL_SCREEN, - PROP_RENDERER -}; - -/* GObject methods */ -static void gst_dshowvideosink_finalize (GObject * gobject); -static void gst_dshowvideosink_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_dshowvideosink_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); - -/* GstElement methods */ -static GstStateChangeReturn gst_dshowvideosink_change_state (GstElement * element, GstStateChange transition); - -/* GstBaseSink methods */ -static gboolean gst_dshowvideosink_start (GstBaseSink * bsink); -static gboolean gst_dshowvideosink_stop (GstBaseSink * bsink); -static gboolean gst_dshowvideosink_unlock (GstBaseSink * bsink); -static gboolean gst_dshowvideosink_unlock_stop (GstBaseSink * bsink); -static gboolean gst_dshowvideosink_set_caps (GstBaseSink * bsink, GstCaps * caps); -static GstCaps *gst_dshowvideosink_get_caps (GstBaseSink * bsink, GstCaps * filter); -static GstFlowReturn gst_dshowvideosink_show_frame (GstVideoSink *sink, GstBuffer *buffer); -static void gst_dshowvideosink_set_window_for_renderer (GstDshowVideoSink *sink); - -/* COM initialization/uninitialization thread */ -static void gst_dshowvideosink_com_thread (GstDshowVideoSink * sink); -/* TODO: event, preroll, buffer_alloc? - * buffer_alloc won't generally be all that useful because the renderers require a - * different stride to GStreamer's implicit values. - */ - -static void -gst_dshowvideosink_set_window_handle (GstVideoOverlay * overlay, guintptr window_id) - -{ - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (overlay); - HWND previous_window = sink->window_id; - HWND videowindow = (HWND)window_id; - - if (videowindow == sink->window_id) { - GST_DEBUG_OBJECT (sink, "Window already set"); - return; - } - - sink->window_id = videowindow; - - /* Update window if we're already playing. */ - if (sink->connected && sink->filter_media_event) { - HRESULT hres; - - if (sink->is_new_window) { - /* If we created a new window */ - SendMessage (previous_window, WM_CLOSE, 0, 0); - sink->is_new_window = FALSE; - sink->window_closed = FALSE; - } else { - /* Return control of application window */ - SetWindowLongPtr (previous_window, GWLP_WNDPROC, (LONG_PTR)sink->prevWndProc); - SetWindowPos (previous_window, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - } - - gst_dshowvideosink_set_window_for_renderer (sink); - - hres = sink->filter_media_event->SetNotifyWindow ((OAHWND)sink->window_id, WM_GRAPH_NOTIFY, 0); - GST_DEBUG_OBJECT (sink, "SetNotifyWindow(%p) returned %x", sink->window_id, hres); - } -} - -static void -gst_dshowvideosink_expose (GstVideoOverlay * overlay) -{ - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (overlay); - - if (sink->renderersupport) { - sink->renderersupport->PaintWindow (); - } -} - -static void -gst_dshowvideosink_videooverlay_init (GstVideoOverlayInterface * iface) -{ - iface->set_window_handle = gst_dshowvideosink_set_window_handle; - iface->expose = gst_dshowvideosink_expose; -} - -static void -gst_dshowvideosink_navigation_send_event (GstNavigation * navigation, - GstStructure * structure) -{ - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (navigation); - GstEvent *event = NULL; - GstPad *pad = NULL; - - event = gst_event_new_navigation (structure); - - /* FXIME: handle aspect ratio. */ - - pad = gst_pad_get_peer (GST_VIDEO_SINK_PAD (sink)); - - if (GST_IS_PAD (pad) && GST_IS_EVENT (event)) { - gst_pad_send_event (pad, event); - - gst_object_unref (pad); - } -} - -static void -gst_dshowvideosink_navigation_interface_init (GstNavigationInterface * iface) -{ - /* FIXME: navigation interface partially implemented. - * Need to call gst_navigation_send_mouse_event and - * gst_navigation_send_key_event like in directdrawsink. - */ - iface->send_event = gst_dshowvideosink_navigation_send_event; -} - -static void -gst_dshowvideosink_class_init (GstDshowVideoSinkClass * klass) -{ - GObjectClass *o_class; - GstElementClass *e_class; - GstBaseSinkClass *bs_class; - GstVideoSinkClass *vs_class; - - o_class = (GObjectClass *) klass; - e_class = (GstElementClass *) klass; - bs_class = (GstBaseSinkClass *) klass; - vs_class = (GstVideoSinkClass *) klass; - - o_class->finalize = gst_dshowvideosink_finalize; - o_class->set_property = gst_dshowvideosink_set_property; - o_class->get_property = gst_dshowvideosink_get_property; - - gst_element_class_set_static_metadata (e_class, "DirectShow video sink", - "Sink/Video", "Display data using a DirectShow video renderer", - "Pioneers of the Inevitable <songbird@songbirdnest.com>, " \ - "FLUENDO S.A. <support@fluendo.com>"); - - gst_element_class_add_static_pad_template (e_class, &sink_template); - - e_class->change_state = GST_DEBUG_FUNCPTR (gst_dshowvideosink_change_state); - - bs_class->get_caps = GST_DEBUG_FUNCPTR (gst_dshowvideosink_get_caps); - bs_class->set_caps = GST_DEBUG_FUNCPTR (gst_dshowvideosink_set_caps); - bs_class->start = GST_DEBUG_FUNCPTR (gst_dshowvideosink_start); - bs_class->stop = GST_DEBUG_FUNCPTR (gst_dshowvideosink_stop); - bs_class->unlock = GST_DEBUG_FUNCPTR (gst_dshowvideosink_unlock); - bs_class->unlock_stop = - GST_DEBUG_FUNCPTR (gst_dshowvideosink_unlock_stop); - - vs_class->show_frame = GST_DEBUG_FUNCPTR (gst_dshowvideosink_show_frame); - - /* Add properties */ - g_object_class_install_property (G_OBJECT_CLASS (klass), - PROP_KEEP_ASPECT_RATIO, g_param_spec_boolean ("force-aspect-ratio", - "Force aspect ratio", - "When enabled, scaling will respect original aspect ratio", TRUE, - (GParamFlags)G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), - PROP_FULL_SCREEN, g_param_spec_boolean ("fullscreen", - "Full screen mode", - "Use full-screen mode (not available when using XOverlay)", FALSE, - (GParamFlags)G_PARAM_READWRITE)); - - g_object_class_install_property (G_OBJECT_CLASS (klass), - PROP_RENDERER, g_param_spec_string ("renderer", "Renderer", - "Force usage of specific DirectShow renderer (EVR, VMR9 or VMR7)", - NULL, (GParamFlags)G_PARAM_READWRITE)); -} - -static void -gst_dshowvideosink_clear (GstDshowVideoSink *sink) -{ - sink->renderersupport = NULL; - sink->fakesrc = NULL; - sink->filter_graph = NULL; - sink->filter_media_event = NULL; - - sink->keep_aspect_ratio = FALSE; - sink->full_screen = FALSE; - - sink->window_closed = FALSE; - sink->window_id = NULL; - sink->is_new_window = FALSE; - - sink->connected = FALSE; - sink->graph_running = FALSE; -} - -static void -gst_dshowvideosink_init (GstDshowVideoSink * sink) -{ - gst_dshowvideosink_clear (sink); - - g_mutex_init (&sink->graph_lock); - g_mutex_init (&sink->com_init_lock); - g_mutex_init (&sink->com_deinit_lock); - g_cond_init (&sink->com_initialized); - g_cond_init (&sink->com_uninitialize); - g_cond_init (&sink->com_uninitialized); - - g_mutex_lock (&sink->com_init_lock); - - /* create the COM initialization thread */ - g_thread_new ("gstdshowvideosinkcomthread", (GThreadFunc)gst_dshowvideosink_com_thread, sink); - - /* wait until the COM thread signals that COM has been initialized */ - g_cond_wait (&sink->com_initialized, &sink->com_init_lock); - g_mutex_unlock (&sink->com_init_lock); -} - -static void -gst_dshowvideosink_finalize (GObject * gobject) -{ - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (gobject); - - g_free (sink->preferredrenderer); - - /* signal the COM thread that it sould uninitialize COM */ - if (sink->comInitialized) { - g_mutex_lock (&sink->com_deinit_lock); - g_cond_signal (&sink->com_uninitialize); - g_cond_wait (&sink->com_uninitialized, &sink->com_deinit_lock); - g_mutex_unlock (&sink->com_deinit_lock); - } - - g_mutex_clear (&sink->com_init_lock); - g_mutex_clear (&sink->com_deinit_lock); - g_cond_clear (&sink->com_initialized); - g_cond_clear (&sink->com_uninitialize); - g_cond_clear (&sink->com_uninitialized); - - g_mutex_clear (&sink->graph_lock); - - G_OBJECT_CLASS (parent_class)->finalize (gobject); -} - -static void -gst_dshowvideosink_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (object); - - switch (prop_id) { - case PROP_RENDERER: - g_free (sink->preferredrenderer); - sink->preferredrenderer = g_value_dup_string (value); - break; - case PROP_KEEP_ASPECT_RATIO: - sink->keep_aspect_ratio = g_value_get_boolean (value); - if (sink->renderersupport) - sink->renderersupport->SetAspectRatioMode(); - break; - case PROP_FULL_SCREEN: - sink->full_screen = g_value_get_boolean (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_dshowvideosink_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (object); - - switch (prop_id) { - case PROP_RENDERER: - g_value_take_string (value, sink->preferredrenderer); - break; - case PROP_KEEP_ASPECT_RATIO: - g_value_set_boolean (value, sink->keep_aspect_ratio); - break; - case PROP_FULL_SCREEN: - g_value_set_boolean (value, sink->full_screen); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_dshowvideosink_com_thread (GstDshowVideoSink * sink) -{ - HRESULT res; - - g_mutex_lock (&sink->com_init_lock); - - /* Initialize COM with a MTA for this process. This thread will - * be the first one to enter the apartement and the last one to leave - * it, unitializing COM properly */ - - res = CoInitializeEx (0, COINIT_MULTITHREADED); - if (res == S_FALSE) - GST_WARNING_OBJECT (sink, "COM has been already initialized in the same process"); - else if (res == RPC_E_CHANGED_MODE) - GST_WARNING_OBJECT (sink, "The concurrency model of COM has changed."); - else - GST_INFO_OBJECT (sink, "COM initialized successfully"); - - sink->comInitialized = TRUE; - - /* Signal other threads waiting on this condition that COM was initialized */ - g_cond_signal (&sink->com_initialized); - - g_mutex_unlock (&sink->com_init_lock); - - /* Wait until the uninitialize condition is met to leave the COM apartement */ - g_mutex_lock (&sink->com_deinit_lock); - g_cond_wait (&sink->com_uninitialize, &sink->com_deinit_lock); - - CoUninitialize (); - GST_INFO_OBJECT (sink, "COM uninitialized successfully"); - sink->comInitialized = FALSE; - g_cond_signal (&sink->com_uninitialized); - g_mutex_unlock (&sink->com_deinit_lock); -} - -static GstCaps * -gst_dshowvideosink_get_caps (GstBaseSink * basesink, GstCaps * filter) -{ - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (basesink); - GstCaps *ret = NULL; - - return ret; -} - -static void dump_available_media_types (IPin *pin) -{ - /* Enumerate all media types on this pin, output info about them */ - IEnumMediaTypes *enumerator = NULL; - AM_MEDIA_TYPE *type; - GstCaps *caps; - int i = 0; - - GST_INFO ("Enumerating media types on pin %p", pin); - - pin->EnumMediaTypes (&enumerator); - - while (enumerator->Next (1, &type, NULL) == S_OK) { - i++; - caps = gst_directshow_media_type_to_caps (type); - - if (caps) { - gchar *str = gst_caps_to_string (caps); - GST_INFO ("Type %d: converted to caps \"%s\"", i, str); - g_free (str); - - gst_caps_unref (caps); - } - else - GST_INFO ("Failed to convert type to GstCaps"); - - DeleteMediaType (type); - } - GST_INFO ("Enumeration complete"); - - enumerator->Release(); -} - -static void -dump_all_pin_media_types (IBaseFilter *filter) -{ - IEnumPins *enumpins = NULL; - IPin *pin = NULL; - HRESULT hres; - - hres = filter->EnumPins (&enumpins); - if (FAILED(hres)) { - GST_WARNING ("Cannot enumerate pins on filter"); - return; - } - - GST_INFO ("Enumerating pins on filter %p", filter); - while (enumpins->Next (1, &pin, NULL) == S_OK) - { - IMemInputPin *meminputpin; - PIN_DIRECTION pindir; - hres = pin->QueryDirection (&pindir); - - GST_INFO ("Found a pin with direction: %s", (pindir == PINDIR_INPUT)? "input": "output"); - dump_available_media_types (pin); - - hres = pin->QueryInterface ( - IID_IMemInputPin, (void **) &meminputpin); - if (hres == S_OK) { - GST_INFO ("Pin is a MemInputPin (push mode): %p", meminputpin); - meminputpin->Release(); - } - else - GST_INFO ("Pin is not a MemInputPin (pull mode?): %p", pin); - - pin->Release(); - } - enumpins->Release(); -} - -gboolean -gst_dshow_get_pin_from_filter (IBaseFilter *filter, PIN_DIRECTION pindir, IPin **pin) -{ - gboolean ret = FALSE; - IEnumPins *enumpins = NULL; - IPin *pintmp = NULL; - HRESULT hres; - *pin = NULL; - - hres = filter->EnumPins (&enumpins); - if (FAILED(hres)) { - return ret; - } - - while (enumpins->Next (1, &pintmp, NULL) == S_OK) - { - PIN_DIRECTION pindirtmp; - hres = pintmp->QueryDirection (&pindirtmp); - if (hres == S_OK && pindir == pindirtmp) { - *pin = pintmp; - ret = TRUE; - break; - } - pintmp->Release (); - } - enumpins->Release (); - - return ret; -} - -static void -gst_dshowvideosink_handle_event (GstDshowVideoSink *sink) -{ - if (sink->filter_media_event) { - long evCode; - LONG_PTR param1, param2; - while (SUCCEEDED (sink->filter_media_event->GetEvent(&evCode, ¶m1, ¶m2, 0))) - { - GST_INFO_OBJECT (sink, "Received DirectShow graph event code 0x%x", evCode); - sink->filter_media_event->FreeEventParams(evCode, param1, param2); - } - } -} - -/* WNDPROC for application-supplied windows */ -LRESULT APIENTRY WndProcHook (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - /* Handle certain actions specially on the window passed to us. - * Then forward back to the original window. - */ - GstDshowVideoSink *sink = (GstDshowVideoSink *)GetProp (hWnd, (LPCSTR)"GstDShowVideoSink"); - g_assert (sink != NULL); - - switch (message) { - case WM_GRAPH_NOTIFY: - gst_dshowvideosink_handle_event (sink); - return 0; - case WM_PAINT: - sink->renderersupport->PaintWindow (); - break; - case WM_MOVE: - case WM_SIZE: - sink->renderersupport->MoveWindow (); - break; - case WM_DISPLAYCHANGE: - sink->renderersupport->DisplayModeChanged(); - break; - case WM_ERASEBKGND: - /* DirectShow docs recommend ignoring this message to avoid flicker */ - return TRUE; - case WM_CLOSE: - sink->window_closed = TRUE; - } - return CallWindowProc (sink->prevWndProc, hWnd, message, wParam, lParam); -} - -/* WndProc for our default window, if the application didn't supply one */ -LRESULT APIENTRY -WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - GstDshowVideoSink *sink = (GstDshowVideoSink *)GetWindowLongPtr (hWnd, GWLP_USERDATA); - - if (!sink) { - /* I think these happen before we have a chance to set our userdata pointer */ - GST_DEBUG ("No sink!"); - return DefWindowProc (hWnd, message, wParam, lParam); - } - - //GST_DEBUG_OBJECT (sink, "Got a window message for %x, %x", hWnd, message); - - switch (message) { - case WM_GRAPH_NOTIFY: - GST_LOG_OBJECT (sink, "GRAPH_NOTIFY WINDOW MESSAGE"); - gst_dshowvideosink_handle_event (sink); - return 0; - case WM_PAINT: - sink->renderersupport->PaintWindow (); - break; - case WM_MOVE: - case WM_SIZE: - sink->renderersupport->MoveWindow (); - break; - case WM_DISPLAYCHANGE: - sink->renderersupport->DisplayModeChanged(); - break; - case WM_ERASEBKGND: - /* DirectShow docs recommend ignoring this message */ - return TRUE; - case WM_CLOSE: - sink->renderersupport->DestroyWindow (); - sink->window_closed = TRUE; - PostQuitMessage (WM_QUIT); - return 0; - } - - return DefWindowProc (hWnd, message, wParam, lParam); -} - -static gpointer -gst_dshowvideosink_window_thread (GstDshowVideoSink * sink) -{ - WNDCLASS WndClass; - int width, height; - int offx, offy; - DWORD exstyle, style; - - memset (&WndClass, 0, sizeof (WNDCLASS)); - WndClass.style = CS_HREDRAW | CS_VREDRAW; - WndClass.hInstance = GetModuleHandle (NULL); - WndClass.lpszClassName = (LPCSTR)"GST-DShowSink"; - WndClass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); - WndClass.cbClsExtra = 0; - WndClass.cbWndExtra = 0; - WndClass.lpfnWndProc = WndProc; - WndClass.hCursor = LoadCursor (NULL, IDC_ARROW); - RegisterClass (&WndClass); - - if (sink->full_screen) { - /* This doesn't seem to work, it returns the wrong values! But when we - * later use ShowWindow to show it maximized, it goes to full-screen - * anyway. TODO: Figure out why. */ - width = GetSystemMetrics (SM_CXFULLSCREEN); - height = GetSystemMetrics (SM_CYFULLSCREEN); - offx = 0; - offy = 0; - - style = WS_POPUP; /* No window decorations */ - exstyle = 0; - } - else { - /* By default, create a normal top-level window, the size - * of the video. - */ - RECT rect; - AM_MEDIA_TYPE pmt = (AM_MEDIA_TYPE)sink->mediatype; - VIDEOINFOHEADER *vi = (VIDEOINFOHEADER *)pmt.pbFormat; - - if (vi == NULL) - { - GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, ("Unknown media format"), (NULL)); - return NULL; - } - - /* rcTarget is the aspect-ratio-corrected size of the video. */ - width = vi->rcTarget.right + GetSystemMetrics (SM_CXSIZEFRAME) * 2; - height = vi->rcTarget.bottom + GetSystemMetrics (SM_CYCAPTION) + - (GetSystemMetrics (SM_CYSIZEFRAME) * 2); - - SystemParametersInfo (SPI_GETWORKAREA, 0, &rect, 0); - int screenwidth = rect.right - rect.left; - int screenheight = rect.bottom - rect.top; - offx = rect.left; - offy = rect.top; - - /* Make it fit into the screen without changing the - * aspect ratio. */ - if (width > screenwidth) { - double ratio = (double)screenwidth/(double)width; - width = screenwidth; - height = (int)(height * ratio); - } - if (height > screenheight) { - double ratio = (double)screenheight/(double)height; - height = screenheight; - width = (int)(width * ratio); - } - - style = WS_OVERLAPPEDWINDOW; /* Normal top-level window */ - exstyle = 0; - } - - HWND video_window = CreateWindowEx (exstyle, (LPCSTR)"GST-DShowSink", - (LPCSTR)"GStreamer DirectShow sink default window", - style, offx, offy, width, height, NULL, NULL, - WndClass.hInstance, NULL); - if (video_window == NULL) { - GST_ERROR_OBJECT (sink, "Failed to create window!"); - return NULL; - } - - sink->is_new_window = TRUE; - - SetWindowLongPtr (video_window, GWLP_USERDATA, (LONG_PTR)sink); - - sink->window_id = video_window; - - /* signal application we created a window */ - gst_video_overlay_got_window_handle (GST_VIDEO_OVERLAY (sink), - (gulong)video_window); - - /* Set the renderer's clipping window */ - if (!sink->renderersupport->SetRendererWindow (video_window)) { - GST_WARNING_OBJECT (sink, "Failed to set video clipping window on filter %p", sink->renderersupport); - } - - /* Now show the window, as appropriate */ - if (sink->full_screen) { - ShowWindow (video_window, SW_SHOWMAXIMIZED); - ShowCursor (FALSE); - } - else - ShowWindow (video_window, SW_SHOWNORMAL); - - /* Trigger the initial paint of the window */ - UpdateWindow (video_window); - - ReleaseSemaphore (sink->window_created_signal, 1, NULL); - - /* start message loop processing our default window messages */ - while (1) { - MSG msg; - - if (GetMessage (&msg, video_window, 0, 0) <= 0) { - GST_LOG_OBJECT (sink, "our window received WM_QUIT or error."); - break; - } - DispatchMessage (&msg); - } - - return NULL; -} - -static gboolean -gst_dshowvideosink_create_default_window (GstDshowVideoSink * sink) -{ - sink->window_created_signal = CreateSemaphore (NULL, 0, 1, NULL); - if (sink->window_created_signal == NULL) - goto failed; - - sink -> window_thread = g_thread_new ("windowthread", - (GThreadFunc) gst_dshowvideosink_window_thread, - sink); - - /* wait maximum 10 seconds for window to be created */ - if (WaitForSingleObject (sink->window_created_signal, - 10000) != WAIT_OBJECT_0) - goto failed; - - CloseHandle (sink->window_created_signal); - return TRUE; - -failed: - CloseHandle (sink->window_created_signal); - GST_ELEMENT_ERROR (sink, RESOURCE, WRITE, - ("Error creating our default window"), (NULL)); - - return FALSE; -} - -static void gst_dshowvideosink_set_window_for_renderer (GstDshowVideoSink *sink) -{ - WNDPROC prevWndProc = (WNDPROC)GetWindowLongPtr (sink->window_id, GWLP_WNDPROC); - if (prevWndProc == WndProcHook) { - /* The WndProc already points to our hook. Something has gone wrong - * somewhere else and this safety net prevents an infinite recursion */ - return; - } - - /* Application has requested a specific window ID */ - sink->prevWndProc = (WNDPROC) SetWindowLongPtr (sink->window_id, GWLP_WNDPROC, (LONG_PTR)WndProcHook); - GST_DEBUG_OBJECT (sink, "Set wndproc to %p from %p", WndProcHook, sink->prevWndProc); - SetProp (sink->window_id, (LPCSTR)"GstDShowVideoSink", sink); - /* This causes the new WNDPROC to become active */ - SetWindowPos (sink->window_id, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - - if (!sink->renderersupport->SetRendererWindow (sink->window_id)) { - GST_WARNING_OBJECT (sink, "Failed to set HWND %x on renderer", sink->window_id); - return; - } - sink->is_new_window = FALSE; - - /* This tells the renderer where the window is located, needed to - * start drawing in the right place. */ - sink->renderersupport->MoveWindow(); - GST_INFO_OBJECT (sink, "Set renderer window to %x", sink->window_id); -} - -static void -gst_dshowvideosink_prepare_window (GstDshowVideoSink *sink) -{ - HRESULT hres; - - /* Give the app a last chance to supply a window id */ - if (!sink->window_id) { - gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (sink)); - } - - /* If the app supplied one, use it. Otherwise, go ahead - * and create (and use) our own window */ - if (sink->window_id) { - gst_dshowvideosink_set_window_for_renderer (sink); - } - else { - gst_dshowvideosink_create_default_window (sink); - } - - if (sink->filter_media_event) { - sink->filter_media_event->Release(); - sink->filter_media_event = NULL; - } - - hres = sink->filter_graph->QueryInterface( - IID_IMediaEventEx, (void **) &sink->filter_media_event); - - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "Failed to get IMediaEventEx"); - } - else { - hres = sink->filter_media_event->SetNotifyWindow ((OAHWND)sink->window_id, - WM_GRAPH_NOTIFY, 0); - GST_DEBUG_OBJECT (sink, "SetNotifyWindow(%p) returned %x", sink->window_id, hres); - } -} - -static gboolean -gst_dshowvideosink_connect_graph (GstDshowVideoSink *sink) -{ - HRESULT hres; - IPin *srcpin; - IPin *sinkpin; - - GST_INFO_OBJECT (sink, "Connecting DirectShow pins"); - - srcpin = sink->fakesrc->GetOutputPin(); - - gst_dshow_get_pin_from_filter (sink->renderersupport->GetFilter(), PINDIR_INPUT, - &sinkpin); - if (!sinkpin) { - GST_WARNING_OBJECT (sink, "Cannot get input pin from Renderer"); - return FALSE; - } - - /* Be warned that this call WILL deadlock unless you call it from - * the main thread. Thus, we call this from the state change, not from - * setcaps (which happens in a streaming thread). - */ - hres = sink->filter_graph->ConnectDirect ( - srcpin, sinkpin, NULL); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "Could not connect pins: %x", hres); - sinkpin->Release(); - return FALSE; - } - sinkpin->Release(); - return TRUE; -} - -static GstStateChangeReturn -gst_dshowvideosink_start_graph (GstDshowVideoSink *sink) -{ - IMediaControl *control = NULL; - HRESULT hres; - GstStateChangeReturn ret; - - GST_DEBUG_OBJECT (sink, "Connecting and starting DirectShow graph"); - - hres = sink->filter_graph->QueryInterface( - IID_IMediaControl, (void **) &control); - - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "Failed to get IMediaControl interface"); - ret = GST_STATE_CHANGE_FAILURE; - goto done; - } - - GST_INFO_OBJECT (sink, "Running DirectShow graph"); - hres = control->Run(); - if (FAILED (hres)) { - GST_ERROR_OBJECT (sink, - "Failed to run the directshow graph (error=%x)", hres); - ret = GST_STATE_CHANGE_FAILURE; - goto done; - } - - GST_DEBUG_OBJECT (sink, "DirectShow graph is now running"); - ret = GST_STATE_CHANGE_SUCCESS; - -done: - if (control) - control->Release(); - - return ret; -} -static GstStateChangeReturn -gst_dshowvideosink_pause_graph (GstDshowVideoSink *sink) -{ - IMediaControl *control = NULL; - GstStateChangeReturn ret; - HRESULT hres; - - hres = sink->filter_graph->QueryInterface( - IID_IMediaControl, (void **) &control); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "Failed to get IMediaControl interface"); - ret = GST_STATE_CHANGE_FAILURE; - goto done; - } - - GST_INFO_OBJECT (sink, "Pausing DirectShow graph"); - hres = control->Pause(); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, - "Can't pause the directshow graph (error=%x)", hres); - ret = GST_STATE_CHANGE_FAILURE; - goto done; - } - - ret = GST_STATE_CHANGE_SUCCESS; - -done: - if (control) - control->Release(); - - return ret; -} - -static GstStateChangeReturn -gst_dshowvideosink_stop_graph (GstDshowVideoSink *sink) -{ - IMediaControl *control = NULL; - GstStateChangeReturn ret; - HRESULT hres; - IPin *sinkpin; - - hres = sink->filter_graph->QueryInterface( - IID_IMediaControl, (void **) &control); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "Failed to get IMediaControl interface"); - ret = GST_STATE_CHANGE_FAILURE; - goto done; - } - - GST_INFO_OBJECT (sink, "Stopping DirectShow graph"); - hres = control->Stop(); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, - "Can't stop the directshow graph (error=%x)", hres); - ret = GST_STATE_CHANGE_FAILURE; - goto done; - } - - sink->filter_graph->Disconnect(sink->fakesrc->GetOutputPin()); - - gst_dshow_get_pin_from_filter (sink->renderersupport->GetFilter(), PINDIR_INPUT, - &sinkpin); - sink->filter_graph->Disconnect(sinkpin); - sinkpin->Release(); - - GST_DEBUG_OBJECT (sink, "DirectShow graph has stopped"); - - if (sink->window_id) { - /* Return control of application window */ - SetWindowLongPtr (sink->window_id, GWLP_WNDPROC, (LONG_PTR)sink->prevWndProc); - RemoveProp (sink->window_id, (LPCSTR)"GstDShowVideoSink"); - SetWindowPos (sink->window_id, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - sink->prevWndProc = NULL; - } - sink->connected = FALSE; - - ret = GST_STATE_CHANGE_SUCCESS; - -done: - if (control) - control->Release(); - - return ret; -} - -static GstStateChangeReturn -gst_dshowvideosink_change_state (GstElement * element, GstStateChange transition) -{ - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (element); - GstStateChangeReturn ret, rettmp; - - switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY: - break; - case GST_STATE_CHANGE_READY_TO_PAUSED: - break; - case GST_STATE_CHANGE_PAUSED_TO_PLAYING: - ret = gst_dshowvideosink_start_graph (sink); - if (ret == GST_STATE_CHANGE_FAILURE) - return ret; - sink->graph_running = TRUE; - break; - } - - ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - - switch (transition) { - case GST_STATE_CHANGE_PLAYING_TO_PAUSED: - GST_DSHOWVIDEOSINK_GRAPH_LOCK(sink); - rettmp = gst_dshowvideosink_pause_graph (sink); - if (rettmp == GST_STATE_CHANGE_FAILURE) - ret = rettmp; - sink->graph_running = FALSE; - GST_DSHOWVIDEOSINK_GRAPH_UNLOCK(sink); - break; - case GST_STATE_CHANGE_PAUSED_TO_READY: - GST_DSHOWVIDEOSINK_GRAPH_LOCK(sink); - rettmp = gst_dshowvideosink_stop_graph (sink); - if (rettmp == GST_STATE_CHANGE_FAILURE) - ret = rettmp; - sink->graph_running = FALSE; - GST_DSHOWVIDEOSINK_GRAPH_UNLOCK(sink); - break; - case GST_STATE_CHANGE_READY_TO_NULL: - gst_dshowvideosink_clear (sink); - break; - } - - return ret; -} - -class EVRSupport : public RendererSupport -{ -private: - GstDshowVideoSink *sink; - IBaseFilter *filter; - IMFGetService *service; - IMFVideoDisplayControl *control; - HWND video_window; - -public: - EVRSupport (GstDshowVideoSink *sink) : - sink(sink), - filter(NULL), - service(NULL), - control(NULL) - { - } - - ~EVRSupport() { - if (control) - control->Release(); - if (service) - service->Release(); - if (filter) - filter->Release(); - } - - const char *GetName() { - return "EnhancedVideoRenderer"; - } - - IBaseFilter *GetFilter() { - return filter; - } - - gboolean CheckOS () { - OSVERSIONINFO info; - info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); - GetVersionEx (&info); - - if (info.dwMajorVersion < 6) { - return false; - } - else { - return true; - } - } - - gboolean Configure() { - HRESULT hres; - - if (!this->CheckOS ()) { - GST_DEBUG_OBJECT (sink, "Windows Vista is required at least for EVR to work"); - return FALSE; - } - - hres = CoCreateInstance (CLSID_EnhancedVideoRenderer, NULL, CLSCTX_INPROC, - IID_IBaseFilter, (LPVOID *) &filter); - GST_DEBUG_OBJECT (sink, "cocreateinstance returned %d", hres); - if (FAILED (hres)) { - GST_ERROR_OBJECT (sink, - "Can't create an instance of renderer (error=%x)", - hres); - return FALSE; - } - - hres = filter->QueryInterface (IID_IMFGetService, - (void **) &service); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "EVR service interface missing: %x", hres); - return FALSE; - } - - hres = service->GetService (MR_VIDEO_RENDER_SERVICE, - IID_IMFVideoDisplayControl, (void **) &control); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "EVR control service missing: %x", hres); - return FALSE; - } - - SetAspectRatioMode(); - return TRUE; - } - - void SetAspectRatioMode() { - if (sink->keep_aspect_ratio) { - control->SetAspectRatioMode(MFVideoARMode_PreservePicture); - } - else { - control->SetAspectRatioMode(MFVideoARMode_None); - } - } - - gboolean SetRendererWindow(HWND window) { - video_window = window; - HRESULT hres = control->SetVideoWindow (video_window); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "Failed to set video clipping window on filter %p: %x", filter, hres); - return FALSE; - } - return TRUE; - } - - void PaintWindow() - { - HRESULT hr; - PAINTSTRUCT ps; - HDC hdc; - RECT rcClient; - - GetClientRect(video_window, &rcClient); - hdc = BeginPaint(video_window, &ps); - - hr = control->RepaintVideo(); - - EndPaint(video_window, &ps); - } - - void MoveWindow() - { - HRESULT hr; - RECT rect; - - // Track the movement of the container window and resize as needed - GetClientRect(video_window, &rect); - hr = control->SetVideoPosition(NULL, &rect); - } - - void DisplayModeChanged() { - } - - void DestroyWindow() { - ::DestroyWindow (video_window); - } -}; - -class VMR9Support : public RendererSupport -{ -private: - GstDshowVideoSink *sink; - IBaseFilter *filter; - IVMRWindowlessControl9 *control; - IVMRFilterConfig9 *config; - HWND video_window; - -public: - VMR9Support (GstDshowVideoSink *sink) : - sink(sink), - filter(NULL), - control(NULL), - config(NULL) - { - } - - ~VMR9Support() { - if (control) - control->Release(); - if (config) - config->Release(); - if (filter) - filter->Release(); - } - - const char *GetName() { - return "VideoMixingRenderer9"; - } - - IBaseFilter *GetFilter() { - return filter; - } - - gboolean Configure() { - HRESULT hres; - - hres = CoCreateInstance (CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC, - IID_IBaseFilter, (LPVOID *) &filter); - if (FAILED (hres)) { - GST_ERROR_OBJECT (sink, - "Can't create an instance of renderer (error=%x)", - hres); - return FALSE; - } - - hres = filter->QueryInterface ( - IID_IVMRFilterConfig9, (void **) &config); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "VMR9 filter config interface missing: %x", hres); - return FALSE; - } - - hres = config->SetRenderingMode (VMR9Mode_Windowless); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "VMR9 couldn't be set to windowless mode: %x", hres); - return FALSE; - } - else { - GST_DEBUG_OBJECT (sink, "Set VMR9 (%p) to windowless mode!", filter); - } - - /* We can't QI to this until _after_ we've been set to windowless mode. - * Apparently this is against the rules in COM, but that's how it is... */ - hres = filter->QueryInterface ( - IID_IVMRWindowlessControl9, (void **) &control); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "VMR9 windowless control interface missing: %x", hres); - return FALSE; - } - - SetAspectRatioMode(); - return TRUE; - } - - void SetAspectRatioMode() { - if (sink->keep_aspect_ratio) { - control->SetAspectRatioMode(VMR9ARMode_LetterBox); - } - else { - control->SetAspectRatioMode(VMR9ARMode_None); - } - } - - gboolean SetRendererWindow(HWND window) { - video_window = window; - HRESULT hres = control->SetVideoClippingWindow (video_window); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "Failed to set video clipping window on filter %p: %x", filter, hres); - return FALSE; - } - return TRUE; - } - - void PaintWindow() - { - HRESULT hr; - PAINTSTRUCT ps; - HDC hdc; - RECT rcClient; - - GetClientRect(video_window, &rcClient); - hdc = BeginPaint(video_window, &ps); - - hr = control->RepaintVideo(video_window, hdc); - - EndPaint(video_window, &ps); - } - - void MoveWindow() - { - HRESULT hr; - RECT rect; - - // Track the movement of the container window and resize as needed - GetClientRect(video_window, &rect); - hr = control->SetVideoPosition(NULL, &rect); - } - - void DisplayModeChanged() { - control->DisplayModeChanged(); - } - - void DestroyWindow() { - ::DestroyWindow (video_window); - } -}; - -class VMR7Support : public RendererSupport -{ -private: - GstDshowVideoSink *sink; - IBaseFilter *filter; - IVMRWindowlessControl *control; - IVMRFilterConfig *config; - HWND video_window; - -public: - VMR7Support (GstDshowVideoSink *sink) : - sink(sink), - filter(NULL), - control(NULL), - config(NULL) - { - } - - ~VMR7Support() { - if (control) - control->Release(); - if (config) - config->Release(); - if (filter) - filter->Release(); - } - - const char *GetName() { - return "VideoMixingRenderer"; - } - - IBaseFilter *GetFilter() { - return filter; - } - - gboolean Configure() { - HRESULT hres; - - hres = CoCreateInstance (CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC, - IID_IBaseFilter, (LPVOID *) &filter); - if (FAILED (hres)) { - GST_ERROR_OBJECT (sink, - "Can't create an instance of renderer (error=%x)", - hres); - return FALSE; - } - - hres = filter->QueryInterface ( - IID_IVMRFilterConfig, (void **) &config); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "VMR filter config interface missing: %x", hres); - return FALSE; - } - - hres = config->SetRenderingMode (VMRMode_Windowless); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "VMR couldn't be set to windowless mode: %x", hres); - return FALSE; - } - else { - GST_DEBUG_OBJECT (sink, "Set VMR (%p) to windowless mode!", filter); - } - - hres = filter->QueryInterface ( - IID_IVMRWindowlessControl, (void **) &control); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "VMR windowless control interface missing: %x", hres); - return FALSE; - } - - SetAspectRatioMode(); - return TRUE; - } - - void SetAspectRatioMode() { - if (sink->keep_aspect_ratio) { - control->SetAspectRatioMode(VMR_ARMODE_LETTER_BOX); - } - else { - control->SetAspectRatioMode(VMR_ARMODE_NONE); - } - } - - gboolean SetRendererWindow(HWND window) { - video_window = window; - HRESULT hres = control->SetVideoClippingWindow (video_window); - if (FAILED (hres)) { - GST_WARNING_OBJECT (sink, "Failed to set video clipping window on filter %p: %x", filter, hres); - return FALSE; - } - return TRUE; - } - - void PaintWindow() - { - HRESULT hr; - PAINTSTRUCT ps; - HDC hdc; - RECT rcClient; - - GetClientRect(video_window, &rcClient); - hdc = BeginPaint(video_window, &ps); - - hr = control->RepaintVideo(video_window, hdc); - - EndPaint(video_window, &ps); - } - - void MoveWindow() - { - HRESULT hr; - RECT rect; - - // Track the movement of the container window and resize as needed - GetClientRect(video_window, &rect); - hr = control->SetVideoPosition(NULL, &rect); - } - - void DisplayModeChanged() { - control->DisplayModeChanged(); - } - - void DestroyWindow() { - ::DestroyWindow (video_window); - } -}; - -static gboolean -gst_dshowvideosink_create_renderer (GstDshowVideoSink *sink) -{ - GST_DEBUG_OBJECT (sink, "Trying to create renderer '%s'", "EVR"); - - RendererSupport *support = NULL; - - if (sink->preferredrenderer) { - if (!strcmp (sink->preferredrenderer, "EVR")) { - GST_INFO_OBJECT (sink, "Forcing use of EVR"); - support = new EVRSupport (sink); - } - else if (!strcmp (sink->preferredrenderer, "VMR9")) { - GST_INFO_OBJECT (sink, "Forcing use of VMR9"); - support = new VMR9Support (sink); - } - else if (!strcmp (sink->preferredrenderer, "VMR")) { - GST_INFO_OBJECT (sink, "Forcing use of VMR"); - support = new VMR7Support (sink); - } - else { - GST_ERROR_OBJECT (sink, "Unknown sink type '%s'", sink->preferredrenderer); - return FALSE; - } - - if (!support->Configure()) { - GST_ERROR_OBJECT (sink, "Couldn't configure selected renderer"); - delete support; - return FALSE; - } - goto done; - } - - support = new EVRSupport (sink); - if (!support->Configure ()) { - GST_INFO_OBJECT (sink, "Failed to configure EVR, trying VMR9"); - delete support; - support = new VMR9Support (sink); - if (!support->Configure()) { - GST_INFO_OBJECT (sink, "Failed to configure VMR9, trying VMR7"); - delete support; - support = new VMR7Support (sink); - if (!support->Configure()) { - GST_ERROR_OBJECT (sink, "Failed to configure VMR9 or VMR7"); - delete support; - return FALSE; - } - } - } - -done: - sink->renderersupport = support; - return TRUE; -} - -static gboolean -gst_dshowvideosink_build_filtergraph (GstDshowVideoSink *sink) -{ - HRESULT hres; - - /* Build our DirectShow FilterGraph, looking like: - * - * fakesrc -> sink filter - * - * so we can feed data in through the fakesrc. - * - * The sink filter can be one of our supported filters: VMR9 (VMR7?, EMR?) - */ - - hres = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC, - IID_IFilterGraph, (LPVOID *) & sink->filter_graph); - if (FAILED (hres)) { - GST_ERROR_OBJECT (sink, - "Can't create an instance of the dshow graph manager (error=%x)", hres); - goto error; - } - - sink->fakesrc = new VideoFakeSrc(); - - IBaseFilter *filter; - hres = sink->fakesrc->QueryInterface ( - IID_IBaseFilter, (void **) &filter); - if (FAILED (hres)) { - GST_ERROR_OBJECT (sink, "Could not QI fakesrc to IBaseFilter"); - goto error; - } - - hres = sink->filter_graph->AddFilter (filter, L"fakesrc"); - if (FAILED (hres)) { - GST_ERROR_OBJECT (sink, - "Can't add our fakesrc filter to the graph (error=%x)", hres); - goto error; - } - - if (!gst_dshowvideosink_create_renderer (sink)) { - GST_ERROR_OBJECT (sink, "Could not create a video renderer"); - goto error; - } - - /* dump_all_pin_media_types (sink->renderer); */ - - hres = - sink->filter_graph->AddFilter (sink->renderersupport->GetFilter(), - L"renderer"); - if (FAILED (hres)) { - GST_ERROR_OBJECT (sink, - "Can't add renderer to the graph (error=%x)", hres); - goto error; - } - - return TRUE; - -error: - if (sink->fakesrc) { - sink->fakesrc->Release(); - sink->fakesrc = NULL; - } - - if (sink->filter_graph) { - sink->filter_graph->Release(); - sink->filter_graph = NULL; - } - - if (sink->filter_media_event) { - sink->filter_media_event->Release(); - sink->filter_media_event = NULL; - } - - return FALSE; -} - -static gboolean -gst_dshowvideosink_start (GstBaseSink * bsink) -{ - HRESULT hres = S_FALSE; - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (bsink); - - /* Just build the filtergraph; we don't link or otherwise configure it yet */ - return gst_dshowvideosink_build_filtergraph (sink); -} - -static gboolean -gst_dshowvideosink_set_caps (GstBaseSink * bsink, GstCaps * caps) -{ - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (bsink); - - if (sink->connected) { - IPin *sinkpin; - sink->filter_graph->Disconnect(sink->fakesrc->GetOutputPin()); - gst_dshow_get_pin_from_filter (sink->renderersupport->GetFilter(), PINDIR_INPUT, - &sinkpin); - sink->filter_graph->Disconnect(sinkpin); - sinkpin->Release(); - } - - if (!gst_caps_to_directshow_media_type (sink, caps, &sink->mediatype)) { - GST_WARNING_OBJECT (sink, "Cannot convert caps to AM_MEDIA_TYPE, rejecting"); - return FALSE; - } - - GST_DEBUG_OBJECT (sink, "Configuring output pin media type"); - /* Now we have an AM_MEDIA_TYPE describing what we're going to send. - * We set this on our DirectShow fakesrc's output pin. - */ - sink->fakesrc->GetOutputPin()->SetMediaType (&sink->mediatype); - GST_DEBUG_OBJECT (sink, "Configured output pin media type"); - - /* We have configured the output pin media type. - * So, create a window (or start using an application-supplied - * one, then connect the graph */ - gst_dshowvideosink_prepare_window (sink); - if (!gst_dshowvideosink_connect_graph (sink)) { - GST_ELEMENT_ERROR (sink, CORE, NEGOTIATION, - ("Failed to initialize DirectShow graph with the input caps"), (NULL)); - return FALSE; - } - sink->connected = TRUE; - - return TRUE; -} - -static gboolean -gst_dshowvideosink_stop (GstBaseSink * bsink) -{ - IPin *input_pin = NULL, *output_pin = NULL; - HRESULT hres = S_FALSE; - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (bsink); - - if (!sink->filter_graph) { - GST_WARNING_OBJECT (sink, "Cannot destroy filter graph; it doesn't exist"); - return TRUE; - } - - /* If we created a new window, send the close message and wait until - * it's closed in the window thread */ - if (sink->is_new_window) { - SendMessage (sink->window_id, WM_CLOSE, 0, 0); - while (!sink->window_closed); - sink->is_new_window = FALSE; - } - - /* Release the renderer */ - if (sink->renderersupport) { - delete sink->renderersupport; - sink->renderersupport = NULL; - } - - /* Release our dshow fakesrc */ - if (sink->fakesrc) { - sink->fakesrc->Release(); - sink->fakesrc = NULL; - } - - /* Release the filter graph manager */ - if (sink->filter_graph) { - sink->filter_graph->Release(); - sink->filter_graph = NULL; - } - - if (sink->filter_media_event) { - sink->filter_media_event->Release(); - sink->filter_media_event = NULL; - } - - return TRUE; -} - -static GstFlowReturn -gst_dshowvideosink_show_frame (GstVideoSink *vsink, GstBuffer *buffer) -{ - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (vsink); - GstFlowReturn ret; - GstStateChangeReturn retst; - - if (sink->window_closed) { - GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, ("Output window was closed"), (NULL)); - return GST_FLOW_ERROR; - } - - GST_DEBUG_OBJECT (sink, "Pushing buffer through fakesrc->renderer"); - GST_DSHOWVIDEOSINK_GRAPH_LOCK(sink); - if (!sink->graph_running){ - retst = gst_dshowvideosink_start_graph(sink); - if (retst == GST_STATE_CHANGE_FAILURE) - return GST_FLOW_FLUSHING; - } - ret = sink->fakesrc->GetOutputPin()->PushBuffer (buffer); - if (!sink->graph_running){ - retst = gst_dshowvideosink_pause_graph(sink); - if (retst == GST_STATE_CHANGE_FAILURE) - return GST_FLOW_FLUSHING; - } - GST_DSHOWVIDEOSINK_GRAPH_UNLOCK(sink); - GST_DEBUG_OBJECT (sink, "Done pushing buffer through fakesrc->renderer: %s", gst_flow_get_name(ret)); - - return ret; -} - -/* TODO: How can we implement these? Figure that out... */ -static gboolean -gst_dshowvideosink_unlock (GstBaseSink * bsink) -{ - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (bsink); - - return TRUE; -} - -static gboolean -gst_dshowvideosink_unlock_stop (GstBaseSink * bsink) -{ - GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (bsink); - - return TRUE; -} - -/* TODO: Move all of this into generic code? */ - -/* Helpers to format GUIDs the same way we find them in the source */ -#define GUID_FORMAT "{%.8x, %.4x, %.4x, { %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x }}" -#define GUID_ARGS(guid) \ - guid.Data1, guid.Data2, guid.Data3, \ - guid.Data40, guid.Data41, guid.Data43, guid.Data44, \ - guid.Data45, guid.Data46, guid.Data47, guid.Data48 - -static GstCaps * -audio_media_type_to_caps (AM_MEDIA_TYPE *mediatype) -{ - return NULL; -} - -static GstCaps * -video_media_type_to_caps (AM_MEDIA_TYPE *mediatype) -{ - GstCaps *caps = NULL; - - /* TODO: Add RGB types. */ - if (IsEqualGUID (mediatype->subtype, MEDIASUBTYPE_YUY2)) - caps = gst_caps_new_simple ("video/x-raw", - "format", GST_TYPE_VIDEO_FORMAT, GST_VIDEO_FORMAT_YUY2, NULL); - else if (IsEqualGUID (mediatype->subtype, MEDIASUBTYPE_UYVY)) - caps = gst_caps_new_simple ("video/x-raw", - "format", GST_TYPE_VIDEO_FORMAT, GST_VIDEO_FORMAT_UYVY, NULL); - else if (IsEqualGUID (mediatype->subtype, MEDIASUBTYPE_YV12)) - caps = gst_caps_new_simple ("video/x-raw", - "format", GST_TYPE_VIDEO_FORMAT, GST_VIDEO_FORMAT_YV12, NULL); - - if (!caps) { - GST_DEBUG ("No subtype known; cannot continue"); - return NULL; - } - - if (IsEqualGUID (mediatype->formattype, FORMAT_VideoInfo) && - mediatype->cbFormat >= sizeof(VIDEOINFOHEADER)) - { - VIDEOINFOHEADER *vh = (VIDEOINFOHEADER *)mediatype->pbFormat; - - /* TODO: Set PAR here. Based on difference between source and target RECTs? - * Do we want framerate? Based on AvgTimePerFrame? */ - gst_caps_set_simple (caps, - "width", G_TYPE_INT, vh->bmiHeader.biWidth, - "height", G_TYPE_INT, vh->bmiHeader.biHeight, - NULL); - } - - return caps; -} - - -/* Create a GstCaps object representing the same media type as - * this AM_MEDIA_TYPE. - * - * Returns NULL if no corresponding GStreamer type is known. - * - * May modify mediatype. - */ -static GstCaps * -gst_directshow_media_type_to_caps (AM_MEDIA_TYPE *mediatype) -{ - GstCaps *caps = NULL; - - if (IsEqualGUID (mediatype->majortype, MEDIATYPE_Video)) - caps = video_media_type_to_caps (mediatype); - else if (IsEqualGUID (mediatype->majortype, MEDIATYPE_Audio)) - caps = audio_media_type_to_caps (mediatype); - else { - GST_DEBUG ("Non audio/video media types not yet " \ - "recognised, please add me: " GUID_FORMAT, - GUID_ARGS(mediatype->majortype)); - } - - if (caps) { - gchar *capsstring = gst_caps_to_string (caps); - GST_DEBUG ("Converted AM_MEDIA_TYPE to \"%s\"", capsstring); - g_free (capsstring); - } - else { - GST_WARNING ("Failed to convert AM_MEDIA_TYPE to caps"); - } - - return caps; -} - -/* Fill in a DirectShow AM_MEDIA_TYPE structure representing the same media - * type as this GstCaps object. - * - * Returns FALSE if no corresponding type is known. - * - * Only operates on simple (single structure) caps. - */ -static gboolean -gst_caps_to_directshow_media_type (GstDshowVideoSink * sink, GstCaps *caps, - AM_MEDIA_TYPE *mediatype) -{ - GstVideoInfo info; - int width, height; - int bpp; - - gst_video_info_init (&info); - if (!gst_video_info_from_caps (&info, caps)) - { - GST_WARNING_OBJECT (sink, "Couldn't parse caps"); - return FALSE; - } - memset (mediatype, 0, sizeof (AM_MEDIA_TYPE)); - - if (GST_VIDEO_FORMAT_INFO_IS_YUV (info.finfo)) - { - guint32 fourcc; - GST_VIDEO_SINK_WIDTH (sink) = info.width; - GST_VIDEO_SINK_HEIGHT (sink) = info.height; - width = info.width; - height = info.height; - mediatype->majortype = MEDIATYPE_Video; - - switch (GST_VIDEO_INFO_FORMAT (&info)) - { - case GST_VIDEO_FORMAT_YUY2: - mediatype->subtype = MEDIASUBTYPE_YUY2; - fourcc = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'); - bpp = 16; - break; - case GST_VIDEO_FORMAT_UYVY: - mediatype->subtype = MEDIASUBTYPE_UYVY; - fourcc = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); - bpp = 16; - break; - case GST_VIDEO_FORMAT_YV12: - mediatype->subtype = MEDIASUBTYPE_YV12; - fourcc = GST_MAKE_FOURCC ('Y', 'V', '1', '2'); - bpp = 12; - break; - default: - GST_WARNING_OBJECT (sink, "Couldn't parse caps"); - return FALSE; - } - - mediatype->bFixedSizeSamples = TRUE; /* Always true for raw video */ - mediatype->bTemporalCompression = FALSE; /* Likewise, always false */ - - { - int par_n, par_d; - VIDEOINFOHEADER *vi = (VIDEOINFOHEADER *)CoTaskMemAlloc (sizeof (VIDEOINFOHEADER)); - memset (vi, 0, sizeof (VIDEOINFOHEADER)); - - mediatype->formattype = FORMAT_VideoInfo; - mediatype->cbFormat = sizeof (VIDEOINFOHEADER); - mediatype->pbFormat = (BYTE *)vi; - - mediatype->lSampleSize = width * height * bpp / 8; - - GST_INFO_OBJECT (sink, "Set mediatype format: size %d, sample size %d", - mediatype->cbFormat, mediatype->lSampleSize); - - vi->rcSource.top = 0; - vi->rcSource.left = 0; - vi->rcSource.bottom = height; - vi->rcSource.right = width; - - vi->rcTarget.top = 0; - vi->rcTarget.left = 0; - if (sink->keep_aspect_ratio) { - par_n = GST_VIDEO_INFO_PAR_N (&info); - par_d = GST_VIDEO_INFO_PAR_D (&info); - /* To handle non-square pixels, we set the target rectangle to a - * different size than the source rectangle. - * There might be a better way, but this seems to work. */ - vi->rcTarget.bottom = height; - vi->rcTarget.right = width * par_n / par_d; - GST_DEBUG_OBJECT (sink, "Got PAR: set target right to %d from width %d", - vi->rcTarget.right, width); - } - else { - vi->rcTarget.bottom = height; - vi->rcTarget.right = width; - } - - vi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER); - vi->bmiHeader.biWidth = width; - vi->bmiHeader.biHeight = -height; /* Required to be negative. */ - vi->bmiHeader.biPlanes = 1; /* Required to be 1 */ - vi->bmiHeader.biBitCount = bpp; - vi->bmiHeader.biCompression = fourcc; - vi->bmiHeader.biSizeImage = width * height * bpp / 8; - - /* We can safely zero these; they don't matter for our uses */ - vi->bmiHeader.biXPelsPerMeter = 0; - vi->bmiHeader.biYPelsPerMeter = 0; - vi->bmiHeader.biClrUsed = 0; - vi->bmiHeader.biClrImportant = 0; - } - - GST_DEBUG_OBJECT (sink, "Successfully built AM_MEDIA_TYPE from caps"); - return TRUE; - } - - GST_WARNING_OBJECT (sink, "Failed to convert caps, not a known caps type"); - /* Only YUV supported so far */ - - return FALSE; -} - -/* Plugin entry point */ -extern "C" static gboolean -plugin_init (GstPlugin * plugin) -{ - /* PRIMARY: this is the best videosink to use on windows */ - if (!gst_element_register (plugin, "dshowvideosink", - GST_RANK_SECONDARY, GST_TYPE_DSHOWVIDEOSINK)) - return FALSE; - - return TRUE; -} - -extern "C" GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - dshowsinkwrapper, - "DirectShow sink wrapper plugin", - plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dshowvideosink/dshowvideosink.h
Deleted
@@ -1,128 +0,0 @@ -/* GStreamer - * Copyright (C) 2008 Pioneers of the Inevitable <songbird@songbirdnest.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __DSHOWVIDEOSINK_H__ -#define __DSHOWVIDEOSINK_H__ - -#include <gst/gst.h> -#include <gst/video/video.h> -#include <gst/video/gstvideosink.h> - -#include "dshowvideofakesrc.h" - -#include <dshow.h> - -#include "d3d9.h" -#include "vmr9.h" -#include "evr.h" -#include "mfidl.h" - -#pragma warning( disable : 4090 4024) - -G_BEGIN_DECLS -#define GST_TYPE_DSHOWVIDEOSINK (gst_dshowvideosink_get_type()) -#define GST_DSHOWVIDEOSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DSHOWVIDEOSINK,GstDshowVideoSink)) -#define GST_DSHOWVIDEOSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DSHOWVIDEOSINK,GstDshowVideoSinkClass)) -#define GST_IS_DSHOWVIDEOSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DSHOWVIDEOSINK)) -#define GST_IS_DSHOWVIDEOSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DSHOWVIDEOSINK)) -typedef struct _GstDshowVideoSink GstDshowVideoSink; -typedef struct _GstDshowVideoSinkClass GstDshowVideoSinkClass; - -#define GST_DSHOWVIDEOSINK_GRAPH_LOCK(sink) g_mutex_lock (&GST_DSHOWVIDEOSINK (sink)->graph_lock) -#define GST_DSHOWVIDEOSINK_GRAPH_UNLOCK(clock) g_mutex_unlock (&GST_DSHOWVIDEOSINK (sink)->graph_lock) - -/* Renderer-specific support classes */ -class RendererSupport -{ -public: - virtual ~RendererSupport() {}; - virtual const char *GetName() = 0; - virtual IBaseFilter *GetFilter() = 0; - virtual gboolean Configure() = 0; - virtual gboolean SetRendererWindow(HWND window) = 0; - virtual void PaintWindow() = 0; - virtual void MoveWindow() = 0; - virtual void DestroyWindow() = 0; - virtual void DisplayModeChanged() = 0; - virtual void SetAspectRatioMode() = 0; -}; - -struct _GstDshowVideoSink -{ - GstVideoSink sink; - - /* Preferred renderer to use: VM9 or VMR */ - char *preferredrenderer; - - /* The filter graph (DirectShow equivalent to pipeline */ - IFilterGraph *filter_graph; - - IMediaEventEx *filter_media_event; - - /* Renderer wrapper (EVR, VMR9, or VMR) and support code */ - RendererSupport *renderersupport; - - /* Our fakesrc filter */ - VideoFakeSrc *fakesrc; - - /* DirectShow description of media type (equivalent of GstCaps) */ - AM_MEDIA_TYPE mediatype; - - gboolean keep_aspect_ratio; - gboolean full_screen; - - /* If the window is closed, we set this and error out */ - gboolean window_closed; - - /* The video window set through GstXOverlay */ - HWND window_id; - - /* If we created the window, it needs to be closed in ::stop() */ - gboolean is_new_window; - - gboolean connected; - gboolean graph_running; - - /* If we create our own window, we run it from another thread */ - GThread *window_thread; - HANDLE window_created_signal; - - /* If we use an app-supplied window, we need to hook its WNDPROC */ - WNDPROC prevWndProc; - - /* Lock for transitions */ - GMutex graph_lock; - - gboolean comInitialized; - GMutex com_init_lock; - GMutex com_deinit_lock; - GCond com_initialized; - GCond com_uninitialize; - GCond com_uninitialized; -}; - -struct _GstDshowVideoSinkClass -{ - GstVideoSinkClass parent_class; -}; - -GType gst_dshowvideosink_get_type (void); - -G_END_DECLS -#endif /* __DSHOWVIDEOSINK_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfaudioenc.cpp
Deleted
@@ -1,337 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <gst/gst.h> -#include "gstmfaudioenc.h" -#include <wrl.h> -#include <string.h> - -/* *INDENT-OFF* */ -using namespace Microsoft::WRL; -/* *INDENT-ON* */ - -GST_DEBUG_CATEGORY (gst_mf_audio_enc_debug); -#define GST_CAT_DEFAULT gst_mf_audio_enc_debug - -#define gst_mf_audio_enc_parent_class parent_class -G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstMFAudioEnc, gst_mf_audio_enc, - GST_TYPE_AUDIO_ENCODER, - GST_DEBUG_CATEGORY_INIT (gst_mf_audio_enc_debug, "mfaudioenc", 0, - "mfaudioenc")); - -static gboolean gst_mf_audio_enc_open (GstAudioEncoder * enc); -static gboolean gst_mf_audio_enc_close (GstAudioEncoder * enc); -static gboolean gst_mf_audio_enc_set_format (GstAudioEncoder * enc, - GstAudioInfo * info); -static GstFlowReturn gst_mf_audio_enc_handle_frame (GstAudioEncoder * enc, - GstBuffer * buffer); -static GstFlowReturn gst_mf_audio_enc_drain (GstAudioEncoder * enc); -static void gst_mf_audio_enc_flush (GstAudioEncoder * enc); - -static void -gst_mf_audio_enc_class_init (GstMFAudioEncClass * klass) -{ - GstAudioEncoderClass *audioenc_class = GST_AUDIO_ENCODER_CLASS (klass); - - audioenc_class->open = GST_DEBUG_FUNCPTR (gst_mf_audio_enc_open); - audioenc_class->close = GST_DEBUG_FUNCPTR (gst_mf_audio_enc_close); - audioenc_class->set_format = GST_DEBUG_FUNCPTR (gst_mf_audio_enc_set_format); - audioenc_class->handle_frame = - GST_DEBUG_FUNCPTR (gst_mf_audio_enc_handle_frame); - audioenc_class->flush = GST_DEBUG_FUNCPTR (gst_mf_audio_enc_flush); - - gst_type_mark_as_plugin_api (GST_TYPE_MF_AUDIO_ENC, (GstPluginAPIFlags) 0); -} - -static void -gst_mf_audio_enc_init (GstMFAudioEnc * self) -{ - gst_audio_encoder_set_drainable (GST_AUDIO_ENCODER (self), TRUE); -} - -static gboolean -gst_mf_audio_enc_open (GstAudioEncoder * enc) -{ - GstMFAudioEnc *self = GST_MF_AUDIO_ENC (enc); - GstMFAudioEncClass *klass = GST_MF_AUDIO_ENC_GET_CLASS (enc); - GstMFTransformEnumParams enum_params = { 0, }; - MFT_REGISTER_TYPE_INFO output_type; - gboolean ret; - - output_type.guidMajorType = MFMediaType_Audio; - output_type.guidSubtype = klass->codec_id; - - enum_params.category = MFT_CATEGORY_AUDIO_ENCODER; - enum_params.enum_flags = klass->enum_flags; - enum_params.output_typeinfo = &output_type; - enum_params.device_index = klass->device_index; - - GST_DEBUG_OBJECT (self, "Create MFT with enum flags 0x%x, device index %d", - klass->enum_flags, klass->device_index); - - self->transform = gst_mf_transform_new (&enum_params); - ret = !!self->transform; - - if (!ret) - GST_ERROR_OBJECT (self, "Cannot create MFT object"); - - return ret; -} - -static gboolean -gst_mf_audio_enc_close (GstAudioEncoder * enc) -{ - GstMFAudioEnc *self = GST_MF_AUDIO_ENC (enc); - - gst_clear_object (&self->transform); - - return TRUE; -} - -static gboolean -gst_mf_audio_enc_set_format (GstAudioEncoder * enc, GstAudioInfo * info) -{ - GstMFAudioEnc *self = GST_MF_AUDIO_ENC (enc); - GstMFAudioEncClass *klass = GST_MF_AUDIO_ENC_GET_CLASS (enc); - ComPtr < IMFMediaType > in_type; - ComPtr < IMFMediaType > out_type; - - GST_DEBUG_OBJECT (self, "Set format"); - - gst_mf_audio_enc_drain (enc); - - if (!gst_mf_transform_open (self->transform)) { - GST_ERROR_OBJECT (self, "Failed to open MFT"); - return FALSE; - } - - g_assert (klass->get_output_type != NULL); - if (!klass->get_output_type (self, info, &out_type)) { - GST_ERROR_OBJECT (self, "subclass failed to set output type"); - return FALSE; - } - - gst_mf_dump_attributes (out_type.Get (), "Set output type", GST_LEVEL_DEBUG); - - if (!gst_mf_transform_set_output_type (self->transform, out_type.Get ())) { - GST_ERROR_OBJECT (self, "Couldn't set output type"); - return FALSE; - } - - g_assert (klass->get_input_type != NULL); - if (!klass->get_input_type (self, info, &in_type)) { - GST_ERROR_OBJECT (self, "subclass didn't provide input type"); - return FALSE; - } - - gst_mf_dump_attributes (in_type.Get (), "Set input type", GST_LEVEL_DEBUG); - - if (!gst_mf_transform_set_input_type (self->transform, in_type.Get ())) { - GST_ERROR_OBJECT (self, "Couldn't set input media type"); - return FALSE; - } - - g_assert (klass->set_src_caps != NULL); - if (!klass->set_src_caps (self, info)) - return FALSE; - - g_assert (klass->frame_samples > 0); - gst_audio_encoder_set_frame_samples_min (enc, klass->frame_samples); - gst_audio_encoder_set_frame_samples_max (enc, klass->frame_samples); - gst_audio_encoder_set_frame_max (enc, 1); - - /* mediafoundation encoder needs timestamp and duration */ - self->sample_count = 0; - self->sample_duration_in_mf = gst_util_uint64_scale (klass->frame_samples, - 10000000, GST_AUDIO_INFO_RATE (info)); - - GST_DEBUG_OBJECT (self, - "Calculated sample duration %" GST_TIME_FORMAT, - GST_TIME_ARGS (self->sample_duration_in_mf * 100)); - - return TRUE; -} - -static gboolean -gst_mf_audio_enc_process_input (GstMFAudioEnc * self, GstBuffer * buffer) -{ - HRESULT hr; - ComPtr < IMFSample > sample; - ComPtr < IMFMediaBuffer > media_buffer; - BYTE *data; - gboolean res = FALSE; - GstMapInfo info; - guint64 timestamp; - - if (!gst_buffer_map (buffer, &info, GST_MAP_READ)) { - GST_ELEMENT_ERROR (self, - RESOURCE, READ, ("Couldn't map input buffer"), (NULL)); - return FALSE; - } - - GST_TRACE_OBJECT (self, "Process buffer %" GST_PTR_FORMAT, buffer); - - timestamp = self->sample_count * self->sample_duration_in_mf; - - hr = MFCreateSample (sample.GetAddressOf ()); - if (!gst_mf_result (hr)) - goto done; - - hr = MFCreateMemoryBuffer (info.size, media_buffer.GetAddressOf ()); - if (!gst_mf_result (hr)) - goto done; - - hr = media_buffer->Lock (&data, NULL, NULL); - if (!gst_mf_result (hr)) - goto done; - - memcpy (data, info.data, info.size); - media_buffer->Unlock (); - - hr = media_buffer->SetCurrentLength (info.size); - if (!gst_mf_result (hr)) - goto done; - - hr = sample->AddBuffer (media_buffer.Get ()); - if (!gst_mf_result (hr)) - goto done; - - hr = sample->SetSampleTime (timestamp); - if (!gst_mf_result (hr)) - goto done; - - hr = sample->SetSampleDuration (self->sample_duration_in_mf); - if (!gst_mf_result (hr)) - goto done; - - if (!gst_mf_transform_process_input (self->transform, sample.Get ())) { - GST_ERROR_OBJECT (self, "Failed to process input"); - goto done; - } - - self->sample_count++; - - res = TRUE; - -done: - gst_buffer_unmap (buffer, &info); - - return res; -} - -static GstFlowReturn -gst_mf_audio_enc_process_output (GstMFAudioEnc * self) -{ - GstMFAudioEncClass *klass = GST_MF_AUDIO_ENC_GET_CLASS (self); - HRESULT hr; - BYTE *data = nullptr; - ComPtr < IMFMediaBuffer > media_buffer; - ComPtr < IMFSample > sample; - GstBuffer *buffer; - GstFlowReturn res = GST_FLOW_ERROR; - DWORD buffer_len = 0; - - res = gst_mf_transform_get_output (self->transform, sample.GetAddressOf ()); - - if (res != GST_FLOW_OK) - return res; - - hr = sample->GetBufferByIndex (0, media_buffer.GetAddressOf ()); - if (!gst_mf_result (hr)) - return GST_FLOW_ERROR; - - hr = media_buffer->Lock (&data, NULL, &buffer_len); - if (!gst_mf_result (hr)) - return GST_FLOW_ERROR; - - /* Can happen while draining */ - if (buffer_len == 0 || !data) { - GST_DEBUG_OBJECT (self, "Empty media buffer"); - media_buffer->Unlock (); - return GST_FLOW_OK; - } - - buffer = gst_audio_encoder_allocate_output_buffer (GST_AUDIO_ENCODER (self), - buffer_len); - gst_buffer_fill (buffer, 0, data, buffer_len); - media_buffer->Unlock (); - - return gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (self), buffer, - klass->frame_samples); -} - -static GstFlowReturn -gst_mf_audio_enc_handle_frame (GstAudioEncoder * enc, GstBuffer * buffer) -{ - GstMFAudioEnc *self = GST_MF_AUDIO_ENC (enc); - GstFlowReturn ret; - - if (!buffer) - return gst_mf_audio_enc_drain (enc); - - if (!gst_mf_audio_enc_process_input (self, buffer)) { - GST_ERROR_OBJECT (self, "Failed to process input"); - return GST_FLOW_ERROR; - } - - do { - ret = gst_mf_audio_enc_process_output (self); - } while (ret == GST_FLOW_OK); - - if (ret == GST_MF_TRANSFORM_FLOW_NEED_DATA) - ret = GST_FLOW_OK; - - return ret; -} - -static GstFlowReturn -gst_mf_audio_enc_drain (GstAudioEncoder * enc) -{ - GstMFAudioEnc *self = GST_MF_AUDIO_ENC (enc); - GstFlowReturn ret = GST_FLOW_OK; - - if (!self->transform) - return GST_FLOW_OK; - - gst_mf_transform_drain (self->transform); - - do { - ret = gst_mf_audio_enc_process_output (self); - } while (ret == GST_FLOW_OK); - - if (ret == GST_MF_TRANSFORM_FLOW_NEED_DATA) - ret = GST_FLOW_OK; - - return ret; -} - -static void -gst_mf_audio_enc_flush (GstAudioEncoder * enc) -{ - GstMFAudioEnc *self = GST_MF_AUDIO_ENC (enc); - - if (!self->transform) - return; - - gst_mf_transform_flush (self->transform); -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfaudioenc.h
Deleted
@@ -1,74 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_MF_AUDIO_ENC_H__ -#define __GST_MF_AUDIO_ENC_H__ - -#include <gst/gst.h> -#include <gst/audio/audio.h> -#include "gstmfutils.h" -#include "gstmftransform.h" - -G_BEGIN_DECLS - -#define GST_TYPE_MF_AUDIO_ENC (gst_mf_audio_enc_get_type()) -#define GST_MF_AUDIO_ENC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MF_AUDIO_ENC,GstMFAudioEnc)) -#define GST_MF_AUDIO_ENC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_MF_AUDIO_ENC,GstMFAudioEncClass)) -#define GST_MF_AUDIO_ENC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_MF_AUDIO_ENC,GstMFAudioEncClass)) -#define GST_IS_MF_AUDIO_ENC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MF_AUDIO_ENC)) -#define GST_IS_MF_AUDIO_ENC_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_MF_AUDIO_ENC)) - -typedef struct _GstMFAudioEnc GstMFAudioEnc; -typedef struct _GstMFAudioEncClass GstMFAudioEncClass; - -struct _GstMFAudioEnc -{ - GstAudioEncoder parent; - - GstMFTransform *transform; - guint64 sample_duration_in_mf; - guint64 sample_count; -}; - -struct _GstMFAudioEncClass -{ - GstAudioEncoderClass parent_class; - - GUID codec_id; - guint32 enum_flags; - guint device_index; - gint frame_samples; - - gboolean (*get_output_type) (GstMFAudioEnc * mfenc, - GstAudioInfo * info, - IMFMediaType ** output_type); - - gboolean (*get_input_type) (GstMFAudioEnc * mfenc, - GstAudioInfo * info, - IMFMediaType ** input_type); - - gboolean (*set_src_caps) (GstMFAudioEnc * mfenc, - GstAudioInfo * info); -}; - -GType gst_mf_audio_enc_get_type (void); - -G_END_DECLS - -#endif /* __GST_MF_AUDIO_ENC_H__ */ \ No newline at end of file
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfdevice.c
Deleted
@@ -1,590 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstmfconfig.h" - -#include "gstmfvideosrc.h" -#include "gstmfutils.h" -#include "gstmfsourceobject.h" - -#include "gstmfdevice.h" - -#if GST_MF_WINAPI_DESKTOP -#include "gstwin32devicewatcher.h" - -#ifndef INITGUID -#include <initguid.h> -#endif - -#include <dbt.h> -DEFINE_GUID (GST_KSCATEGORY_CAPTURE, 0x65E8773DL, 0x8F56, - 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96); -#endif - -#if GST_MF_WINAPI_APP -#include <gst/winrt/gstwinrt.h> -#endif - -GST_DEBUG_CATEGORY_EXTERN (gst_mf_debug); -#define GST_CAT_DEFAULT gst_mf_debug - -enum -{ - PROP_0, - PROP_DEVICE_PATH, -}; - -struct _GstMFDevice -{ - GstDevice parent; - - gchar *device_path; -}; - -G_DEFINE_TYPE (GstMFDevice, gst_mf_device, GST_TYPE_DEVICE); - -static void gst_mf_device_get_property (GObject * object, - guint prop_id, GValue * value, GParamSpec * pspec); -static void gst_mf_device_set_property (GObject * object, - guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_mf_device_finalize (GObject * object); -static GstElement *gst_mf_device_create_element (GstDevice * device, - const gchar * name); - -static void -gst_mf_device_class_init (GstMFDeviceClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstDeviceClass *dev_class = GST_DEVICE_CLASS (klass); - - dev_class->create_element = gst_mf_device_create_element; - - gobject_class->get_property = gst_mf_device_get_property; - gobject_class->set_property = gst_mf_device_set_property; - gobject_class->finalize = gst_mf_device_finalize; - - g_object_class_install_property (gobject_class, PROP_DEVICE_PATH, - g_param_spec_string ("device-path", "Device Path", - "The device path", NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); -} - -static void -gst_mf_device_init (GstMFDevice * self) -{ -} - -static void -gst_mf_device_finalize (GObject * object) -{ - GstMFDevice *self = GST_MF_DEVICE (object); - - g_free (self->device_path); - - G_OBJECT_CLASS (gst_mf_device_parent_class)->finalize (object); -} - -static GstElement * -gst_mf_device_create_element (GstDevice * device, const gchar * name) -{ - GstMFDevice *self = GST_MF_DEVICE (device); - GstElement *elem; - - elem = gst_element_factory_make ("mfvideosrc", name); - - g_object_set (elem, "device-path", self->device_path, NULL); - - return elem; -} - -static void -gst_mf_device_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstMFDevice *self = GST_MF_DEVICE (object); - - switch (prop_id) { - case PROP_DEVICE_PATH: - g_value_set_string (value, self->device_path); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_mf_device_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstMFDevice *self = GST_MF_DEVICE (object); - - switch (prop_id) { - case PROP_DEVICE_PATH: - self->device_path = g_value_dup_string (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -struct _GstMFDeviceProvider -{ - GstDeviceProvider parent; - - GstObject *watcher; - - GMutex lock; - GCond cond; - - gboolean enum_completed; -}; - -G_DEFINE_TYPE (GstMFDeviceProvider, gst_mf_device_provider, - GST_TYPE_DEVICE_PROVIDER); - -static void gst_mf_device_provider_dispose (GObject * object); -static void gst_mf_device_provider_finalize (GObject * object); - -static GList *gst_mf_device_provider_probe (GstDeviceProvider * provider); -static gboolean gst_mf_device_provider_start (GstDeviceProvider * provider); -static void gst_mf_device_provider_stop (GstDeviceProvider * provider); - -#if GST_MF_WINAPI_DESKTOP -static gboolean gst_mf_device_provider_start_win32 (GstDeviceProvider * self); -static void gst_mf_device_provider_device_changed (GstWin32DeviceWatcher * - watcher, WPARAM wparam, LPARAM lparam, gpointer user_data); -#endif - -#if GST_MF_WINAPI_APP -static gboolean gst_mf_device_provider_start_winrt (GstDeviceProvider * self); -static void -gst_mf_device_provider_device_added (GstWinRTDeviceWatcher * watcher, - __x_ABI_CWindows_CDevices_CEnumeration_CIDeviceInformation * info, - gpointer user_data); -static void -gst_mf_device_provider_device_updated (GstWinRTDeviceWatcher * watcher, - __x_ABI_CWindows_CDevices_CEnumeration_CIDeviceInformationUpdate * - info_update, gpointer user_data); -static void gst_mf_device_provider_device_removed (GstWinRTDeviceWatcher * - watcher, - __x_ABI_CWindows_CDevices_CEnumeration_CIDeviceInformationUpdate * - info_update, gpointer user_data); -static void -gst_mf_device_provider_device_enum_completed (GstWinRTDeviceWatcher * - watcher, gpointer user_data); -#endif - -static void -gst_mf_device_provider_on_device_updated (GstMFDeviceProvider * self); - -static void -gst_mf_device_provider_class_init (GstMFDeviceProviderClass * klass) -{ - GstDeviceProviderClass *provider_class = GST_DEVICE_PROVIDER_CLASS (klass); - - provider_class->probe = GST_DEBUG_FUNCPTR (gst_mf_device_provider_probe); - provider_class->start = GST_DEBUG_FUNCPTR (gst_mf_device_provider_start); - provider_class->stop = GST_DEBUG_FUNCPTR (gst_mf_device_provider_stop); - - gst_device_provider_class_set_static_metadata (provider_class, - "Media Foundation Device Provider", - "Source/Video", "List Media Foundation source devices", - "Seungha Yang <seungha@centricular.com>"); -} - -static void -gst_mf_device_provider_init (GstMFDeviceProvider * self) -{ -#if GST_MF_WINAPI_DESKTOP - GstWin32DeviceWatcherCallbacks win32_callbacks; - - win32_callbacks.device_changed = gst_mf_device_provider_device_changed; - self->watcher = (GstObject *) - gst_win32_device_watcher_new (DBT_DEVTYP_DEVICEINTERFACE, - &GST_KSCATEGORY_CAPTURE, &win32_callbacks, self); -#endif -#if GST_MF_WINAPI_APP - if (!self->watcher) { - GstWinRTDeviceWatcherCallbacks winrt_callbacks; - winrt_callbacks.added = gst_mf_device_provider_device_added; - winrt_callbacks.updated = gst_mf_device_provider_device_updated; - winrt_callbacks.removed = gst_mf_device_provider_device_removed; - winrt_callbacks.enumeration_completed = - gst_mf_device_provider_device_enum_completed; - - self->watcher = (GstObject *) - gst_winrt_device_watcher_new (GST_WINRT_DEVICE_CLASS_VIDEO_CAPTURE, - &winrt_callbacks, self); - } -#endif - - g_mutex_init (&self->lock); - g_cond_init (&self->cond); -} - -static void -gst_mf_device_provider_dispose (GObject * object) -{ - GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (object); - - gst_clear_object (&self->watcher); - - G_OBJECT_CLASS (gst_mf_device_provider_parent_class)->dispose (object); -} - -static void -gst_mf_device_provider_finalize (GObject * object) -{ - GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (object); - - g_mutex_clear (&self->lock); - g_cond_clear (&self->cond); - - G_OBJECT_CLASS (gst_mf_device_provider_parent_class)->finalize (object); -} - -static GList * -gst_mf_device_provider_probe (GstDeviceProvider * provider) -{ - GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (provider); - GList *list = NULL; - gint i; - - for (i = 0;; i++) { - GstMFSourceObject *obj = NULL; - GstDevice *device; - GstStructure *props = NULL; - GstCaps *caps = NULL; - gchar *device_name = NULL; - gchar *device_path = NULL; - - obj = gst_mf_source_object_new (GST_MF_SOURCE_TYPE_VIDEO, - i, NULL, NULL, NULL); - if (!obj) - break; - - caps = gst_mf_source_object_get_caps (obj); - if (!caps) { - GST_WARNING_OBJECT (self, "Empty caps for device index %d", i); - goto next; - } - - g_object_get (obj, - "device-path", &device_path, "device-name", &device_name, NULL); - - if (!device_path) { - GST_WARNING_OBJECT (self, "Device path is unavailable"); - goto next; - } - - if (!device_name) { - GST_WARNING_OBJECT (self, "Device name is unavailable"); - goto next; - } - - props = gst_structure_new ("mf-proplist", - "device.api", G_TYPE_STRING, "mediafoundation", - "device.path", G_TYPE_STRING, device_path, - "device.name", G_TYPE_STRING, device_name, NULL); - - device = g_object_new (GST_TYPE_MF_DEVICE, "device-path", device_path, - "display-name", device_name, "caps", caps, - "device-class", "Source/Video", "properties", props, NULL); - - list = g_list_append (list, device); - - next: - if (caps) - gst_caps_unref (caps); - if (props) - gst_structure_free (props); - g_free (device_path); - g_free (device_name); - gst_object_unref (obj); - } - - return list; -} - -#if GST_MF_WINAPI_DESKTOP -static gboolean -gst_mf_device_provider_start_win32 (GstDeviceProvider * provider) -{ - GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (provider); - GstWin32DeviceWatcher *watcher; - GList *devices = NULL; - GList *iter; - - if (!GST_IS_WIN32_DEVICE_WATCHER (self->watcher)) - return FALSE; - - GST_DEBUG_OBJECT (self, "Starting Win32 watcher"); - - watcher = GST_WIN32_DEVICE_WATCHER (self->watcher); - - devices = gst_mf_device_provider_probe (provider); - if (devices) { - for (iter = devices; iter; iter = g_list_next (iter)) { - gst_device_provider_device_add (provider, GST_DEVICE (iter->data)); - } - - g_list_free (devices); - } - - return gst_win32_device_watcher_start (watcher); -} -#endif - -#if GST_MF_WINAPI_APP -static gboolean -gst_mf_device_provider_start_winrt (GstDeviceProvider * provider) -{ - GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (provider); - GstWinRTDeviceWatcher *watcher; - GList *devices = NULL; - GList *iter; - - if (!GST_IS_WINRT_DEVICE_WATCHER (self->watcher)) - return FALSE; - - GST_DEBUG_OBJECT (self, "Starting WinRT watcher"); - watcher = GST_WINRT_DEVICE_WATCHER (self->watcher); - - self->enum_completed = FALSE; - - if (!gst_winrt_device_watcher_start (watcher)) - return FALSE; - - /* Wait for initial enumeration to be completed */ - g_mutex_lock (&self->lock); - while (!self->enum_completed) - g_cond_wait (&self->cond, &self->lock); - - devices = gst_mf_device_provider_probe (provider); - if (devices) { - for (iter = devices; iter; iter = g_list_next (iter)) { - gst_device_provider_device_add (provider, GST_DEVICE (iter->data)); - } - - g_list_free (devices); - } - g_mutex_unlock (&self->lock); - - return TRUE; -} -#endif - -static gboolean -gst_mf_device_provider_start (GstDeviceProvider * provider) -{ - GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (provider); - gboolean ret = FALSE; - - if (!self->watcher) { - GST_ERROR_OBJECT (self, "DeviceWatcher object wasn't configured"); - return FALSE; - } -#if GST_MF_WINAPI_DESKTOP - ret = gst_mf_device_provider_start_win32 (provider); -#endif - -#if GST_MF_WINAPI_APP - if (!ret) - ret = gst_mf_device_provider_start_winrt (provider); -#endif - - return ret; -} - -static void -gst_mf_device_provider_stop (GstDeviceProvider * provider) -{ - GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (provider); - - if (self->watcher) { -#if GST_MF_WINAPI_DESKTOP - if (GST_IS_WIN32_DEVICE_WATCHER (self->watcher)) { - gst_win32_device_watcher_stop (GST_WIN32_DEVICE_WATCHER (self->watcher)); - } -#endif -#if GST_MF_WINAPI_APP - if (GST_IS_WINRT_DEVICE_WATCHER (self->watcher)) { - gst_winrt_device_watcher_stop (GST_WINRT_DEVICE_WATCHER (self->watcher)); - } -#endif - } -} - -static gboolean -gst_mf_device_is_in_list (GList * list, GstDevice * device) -{ - GList *iter; - GstStructure *s; - const gchar *device_id; - gboolean found = FALSE; - - s = gst_device_get_properties (device); - g_assert (s); - - device_id = gst_structure_get_string (s, "device.path"); - g_assert (device_id); - - for (iter = list; iter; iter = g_list_next (iter)) { - GstStructure *other_s; - const gchar *other_id; - - other_s = gst_device_get_properties (GST_DEVICE (iter->data)); - g_assert (other_s); - - other_id = gst_structure_get_string (other_s, "device.path"); - g_assert (other_id); - - if (g_ascii_strcasecmp (device_id, other_id) == 0) { - found = TRUE; - } - - gst_structure_free (other_s); - if (found) - break; - } - - gst_structure_free (s); - - return found; -} - -static void -gst_mf_device_provider_update_devices (GstMFDeviceProvider * self) -{ - GstDeviceProvider *provider = GST_DEVICE_PROVIDER_CAST (self); - GList *prev_devices = NULL; - GList *new_devices = NULL; - GList *to_add = NULL; - GList *to_remove = NULL; - GList *iter; - - GST_OBJECT_LOCK (self); - prev_devices = g_list_copy_deep (provider->devices, - (GCopyFunc) gst_object_ref, NULL); - GST_OBJECT_UNLOCK (self); - - new_devices = gst_mf_device_provider_probe (provider); - - /* Ownership of GstDevice for gst_device_provider_device_add() - * and gst_device_provider_device_remove() is a bit complicated. - * Remove floating reference here for things to be clear */ - for (iter = new_devices; iter; iter = g_list_next (iter)) - gst_object_ref_sink (iter->data); - - /* Check newly added devices */ - for (iter = new_devices; iter; iter = g_list_next (iter)) { - if (!gst_mf_device_is_in_list (prev_devices, GST_DEVICE (iter->data))) { - to_add = g_list_prepend (to_add, gst_object_ref (iter->data)); - } - } - - /* Check removed device */ - for (iter = prev_devices; iter; iter = g_list_next (iter)) { - if (!gst_mf_device_is_in_list (new_devices, GST_DEVICE (iter->data))) { - to_remove = g_list_prepend (to_remove, gst_object_ref (iter->data)); - } - } - - for (iter = to_remove; iter; iter = g_list_next (iter)) - gst_device_provider_device_remove (provider, GST_DEVICE (iter->data)); - - for (iter = to_add; iter; iter = g_list_next (iter)) - gst_device_provider_device_add (provider, GST_DEVICE (iter->data)); - - if (prev_devices) - g_list_free_full (prev_devices, (GDestroyNotify) gst_object_unref); - - if (to_add) - g_list_free_full (to_add, (GDestroyNotify) gst_object_unref); - - if (to_remove) - g_list_free_full (to_remove, (GDestroyNotify) gst_object_unref); -} - -#if GST_MF_WINAPI_DESKTOP -static void -gst_mf_device_provider_device_changed (GstWin32DeviceWatcher * watcher, - WPARAM wparam, LPARAM lparam, gpointer user_data) -{ - GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (user_data); - - if (wparam == DBT_DEVICEARRIVAL || wparam == DBT_DEVICEREMOVECOMPLETE) { - gst_mf_device_provider_update_devices (self); - } -} -#endif - -#if GST_MF_WINAPI_APP -static void -gst_mf_device_provider_device_added (GstWinRTDeviceWatcher * watcher, - __x_ABI_CWindows_CDevices_CEnumeration_CIDeviceInformation * info, - gpointer user_data) -{ - GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (user_data); - - if (self->enum_completed) - gst_mf_device_provider_update_devices (self); -} - -static void -gst_mf_device_provider_device_removed (GstWinRTDeviceWatcher * watcher, - __x_ABI_CWindows_CDevices_CEnumeration_CIDeviceInformationUpdate * - info_update, gpointer user_data) -{ - GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (user_data); - - if (self->enum_completed) - gst_mf_device_provider_update_devices (self); -} - - -static void -gst_mf_device_provider_device_updated (GstWinRTDeviceWatcher * watcher, - __x_ABI_CWindows_CDevices_CEnumeration_CIDeviceInformationUpdate * - info_update, gpointer user_data) -{ - GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (user_data); - - gst_mf_device_provider_update_devices (self); -} - -static void -gst_mf_device_provider_device_enum_completed (GstWinRTDeviceWatcher * - watcher, gpointer user_data) -{ - GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (user_data); - - g_mutex_lock (&self->lock); - GST_DEBUG_OBJECT (self, "Enumeration completed"); - self->enum_completed = TRUE; - g_cond_signal (&self->cond); - g_mutex_unlock (&self->lock); -} -#endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfplatloader.c
Deleted
@@ -1,129 +0,0 @@ -/* GStreamer - * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstmfplatloader.h" -#include "gstmfconfig.h" -#include <gmodule.h> - -/* *INDENT-OFF* */ -G_BEGIN_DECLS - -GST_DEBUG_CATEGORY_EXTERN (gst_mf_debug); -#define GST_CAT_DEFAULT gst_mf_debug - -G_END_DECLS - -#define LOAD_SYMBOL(name,func) G_STMT_START { \ - if (!g_module_symbol (module, G_STRINGIFY (name), (gpointer *) &vtable->func)) { \ - GST_WARNING ("Failed to load '%s', %s", G_STRINGIFY (name), g_module_error()); \ - goto out; \ - } \ -} G_STMT_END; - -typedef struct _GstMFPlatVTable -{ - gboolean loaded; - - HRESULT (__stdcall * GstMFTEnum2) (GUID guidCategory, - UINT32 Flags, - const MFT_REGISTER_TYPE_INFO * pInputType, - const MFT_REGISTER_TYPE_INFO * pOutputType, - IMFAttributes * pAttributes, - IMFActivate *** pppMFTActivate, - UINT32 * pnumMFTActivate); - - HRESULT (__stdcall * GstMFCreateDXGIDeviceManager) (UINT * resetToken, - IMFDXGIDeviceManager ** ppDeviceManager); - - HRESULT (__stdcall * GstMFCreateVideoSampleAllocatorEx) (REFIID riid, - void** ppSampleAllocator); -} GstMFPlatVTable; -/* *INDENT-ON* */ - -static GstMFPlatVTable gst_mf_plat_vtable = { 0, }; - -static gboolean -load_library_once (void) -{ - static gsize load_once = 0; - if (g_once_init_enter (&load_once)) { -#if GST_MF_HAVE_D3D11 - GModule *module; - GstMFPlatVTable *vtable = &gst_mf_plat_vtable; - - module = g_module_open ("mfplat.dll", G_MODULE_BIND_LAZY); - if (!module) - goto out; - - LOAD_SYMBOL (MFTEnum2, GstMFTEnum2); - LOAD_SYMBOL (MFCreateDXGIDeviceManager, GstMFCreateDXGIDeviceManager); - LOAD_SYMBOL (MFCreateVideoSampleAllocatorEx, - GstMFCreateVideoSampleAllocatorEx); - - vtable->loaded = TRUE; -#endif - - out: - g_once_init_leave (&load_once, 1); - } - - return gst_mf_plat_vtable.loaded; -} - -gboolean -gst_mf_plat_load_library (void) -{ - return load_library_once (); -} - -HRESULT __stdcall -GstMFTEnum2 (GUID guidCategory, UINT32 Flags, - const MFT_REGISTER_TYPE_INFO * pInputType, - const MFT_REGISTER_TYPE_INFO * pOutputType, - IMFAttributes * pAttributes, IMFActivate *** pppMFTActivate, - UINT32 * pnumMFTActivate) -{ - g_assert (gst_mf_plat_vtable.GstMFTEnum2 != NULL); - - return gst_mf_plat_vtable.GstMFTEnum2 (guidCategory, Flags, pInputType, - pOutputType, pAttributes, pppMFTActivate, pnumMFTActivate); -} - -HRESULT __stdcall -GstMFCreateDXGIDeviceManager (UINT * resetToken, - IMFDXGIDeviceManager ** ppDeviceManager) -{ - g_assert (gst_mf_plat_vtable.GstMFCreateDXGIDeviceManager != NULL); - - return gst_mf_plat_vtable.GstMFCreateDXGIDeviceManager (resetToken, - ppDeviceManager); -} - -HRESULT __stdcall -GstMFCreateVideoSampleAllocatorEx (REFIID riid, void **ppSampleAllocator) -{ - g_assert (gst_mf_plat_vtable.GstMFCreateVideoSampleAllocatorEx != NULL); - - return gst_mf_plat_vtable.GstMFCreateVideoSampleAllocatorEx (riid, - ppSampleAllocator); -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfsourceobject.c
Deleted
@@ -1,444 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstmfconfig.h" - -#include "gstmfsourceobject.h" - -#if GST_MF_WINAPI_APP -#include "gstmfcapturewinrt.h" -#endif -#if GST_MF_WINAPI_DESKTOP -#include "gstmfsourcereader.h" -#endif - -GST_DEBUG_CATEGORY_EXTERN (gst_mf_source_object_debug); -#define GST_CAT_DEFAULT gst_mf_source_object_debug - -enum -{ - PROP_0, - PROP_DEVICE_PATH, - PROP_DEVICE_NAME, - PROP_DEVICE_INDEX, - PROP_SOURCE_TYPE, -}; - -#define DEFAULT_DEVICE_PATH NULL -#define DEFAULT_DEVICE_NAME NULL -#define DEFAULT_DEVICE_INDEX -1 -#define DEFAULT_SOURCE_TYPE GST_MF_SOURCE_TYPE_VIDEO - -GType -gst_mf_source_type_get_type (void) -{ - static GType source_type = 0; - - static const GEnumValue source_types = { - {GST_MF_SOURCE_TYPE_VIDEO, "Video", "video"}, - {0, NULL, NULL} - }; - - if (!source_type) { - source_type = g_enum_register_static ("GstMFSourceMode", source_types); - } - - return source_type; -} - -static void gst_mf_source_object_finalize (GObject * object); -static void gst_mf_source_object_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static void gst_mf_source_object_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); - -#define gst_mf_source_object_parent_class parent_class -G_DEFINE_ABSTRACT_TYPE (GstMFSourceObject, gst_mf_source_object, - GST_TYPE_OBJECT); - -static void -gst_mf_source_object_class_init (GstMFSourceObjectClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->finalize = gst_mf_source_object_finalize; - gobject_class->get_property = gst_mf_source_object_get_property; - gobject_class->set_property = gst_mf_source_object_set_property; - - g_object_class_install_property (gobject_class, PROP_DEVICE_PATH, - g_param_spec_string ("device-path", "Device Path", - "The device path", DEFAULT_DEVICE_PATH, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, - g_param_spec_string ("device-name", "Device Name", - "The human-readable device name", DEFAULT_DEVICE_NAME, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, PROP_DEVICE_INDEX, - g_param_spec_int ("device-index", "Device Index", - "The zero-based device index", -1, G_MAXINT, DEFAULT_DEVICE_INDEX, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, PROP_SOURCE_TYPE, - g_param_spec_enum ("source-type", "Source Type", - "Source Type", GST_TYPE_MF_SOURCE_TYPE, - DEFAULT_SOURCE_TYPE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); -} - -static void -gst_mf_source_object_init (GstMFSourceObject * self) -{ - self->device_index = DEFAULT_DEVICE_INDEX; - self->source_type = DEFAULT_SOURCE_TYPE; - - g_weak_ref_init (&self->client, NULL); -} - -static void -gst_mf_source_object_finalize (GObject * object) -{ - GstMFSourceObject *self = GST_MF_SOURCE_OBJECT (object); - - g_free (self->device_path); - g_free (self->device_name); - - g_weak_ref_clear (&self->client); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -gst_mf_source_object_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstMFSourceObject *self = GST_MF_SOURCE_OBJECT (object); - - switch (prop_id) { - case PROP_DEVICE_PATH: - g_value_set_string (value, self->device_path); - break; - case PROP_DEVICE_NAME: - g_value_set_string (value, self->device_name); - break; - case PROP_DEVICE_INDEX: - g_value_set_int (value, self->device_index); - break; - case PROP_SOURCE_TYPE: - g_value_set_enum (value, self->source_type); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_mf_source_object_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstMFSourceObject *self = GST_MF_SOURCE_OBJECT (object); - - switch (prop_id) { - case PROP_DEVICE_PATH: - g_free (self->device_path); - self->device_path = g_value_dup_string (value); - break; - case PROP_DEVICE_NAME: - g_free (self->device_name); - self->device_name = g_value_dup_string (value); - break; - case PROP_DEVICE_INDEX: - self->device_index = g_value_get_int (value); - break; - case PROP_SOURCE_TYPE: - self->source_type = g_value_get_enum (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -gboolean -gst_mf_source_object_start (GstMFSourceObject * object) -{ - GstMFSourceObjectClass *klass; - - g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), FALSE); - - klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); - g_assert (klass->start != NULL); - - return klass->start (object); -} - -gboolean -gst_mf_source_object_stop (GstMFSourceObject * object) -{ - GstMFSourceObjectClass *klass; - - g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), FALSE); - - klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); - g_assert (klass->stop != NULL); - - return klass->stop (object); -} - -GstFlowReturn -gst_mf_source_object_fill (GstMFSourceObject * object, GstBuffer * buffer) -{ - GstMFSourceObjectClass *klass; - - g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), GST_FLOW_ERROR); - g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR); - - klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); - g_assert (klass->fill != NULL); - - return klass->fill (object, buffer); -} - -GstFlowReturn -gst_mf_source_object_create (GstMFSourceObject * object, GstBuffer ** buffer) -{ - GstMFSourceObjectClass *klass; - - g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), GST_FLOW_ERROR); - g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR); - - klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); - g_assert (klass->create != NULL); - - return klass->create (object, buffer); -} - -void -gst_mf_source_object_set_flushing (GstMFSourceObject * object, - gboolean flushing) -{ - GstMFSourceObjectClass *klass; - - g_return_if_fail (GST_IS_MF_SOURCE_OBJECT (object)); - - klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); - - if (flushing) { - if (klass->unlock) - klass->unlock (object); - } else { - if (klass->unlock_stop) - klass->unlock_stop (object); - } -} - -gboolean -gst_mf_source_object_set_caps (GstMFSourceObject * object, GstCaps * caps) -{ - GstMFSourceObjectClass *klass; - - g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), FALSE); - - klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); - g_assert (klass->set_caps != NULL); - - return klass->set_caps (object, caps); -} - -GstCaps * -gst_mf_source_object_get_caps (GstMFSourceObject * object) -{ - GstMFSourceObjectClass *klass; - - g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), NULL); - - klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); - g_assert (klass->get_caps != NULL); - - return klass->get_caps (object); -} - -gboolean -gst_mf_source_object_set_client (GstMFSourceObject * object, - GstElement * client) -{ - g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), FALSE); - - g_weak_ref_set (&object->client, client); - - return TRUE; -} - -GstClockTime -gst_mf_source_object_get_running_time (GstMFSourceObject * object) -{ - GstElement *client = NULL; - GstClockTime timestamp = GST_CLOCK_TIME_NONE; - - g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), GST_CLOCK_TIME_NONE); - - client = (GstElement *) g_weak_ref_get (&object->client); - if (client) { - GstClockTime basetime = client->base_time; - GstClock *clock; - - clock = gst_element_get_clock (client); - if (clock) { - GstClockTime now; - - now = gst_clock_get_time (clock); - timestamp = now - basetime; - gst_object_unref (clock); - } - - gst_object_unref (client); - } - - return timestamp; -} - -static gboolean -gst_mf_source_object_use_winrt_api (void) -{ - static gsize check_once = 0; - static gboolean ret = FALSE; - - if (g_once_init_enter (&check_once)) { -#if (!GST_MF_WINAPI_APP) - /* WinRT is not supported, always false */ - ret = FALSE; -#else -#if (!GST_MF_WINAPI_DESKTOP) - /* WinRT is supported but desktop API was disabled, - * always true */ - ret = TRUE; -#else - /* Both app and desktop APIs were enabled, check user choice */ - { - const gchar *env; - - env = g_getenv ("GST_USE_MF_WINRT_CAPTURE"); - if (env && g_str_has_prefix (env, "1")) - ret = TRUE; - else - ret = FALSE; - } -#endif -#endif - g_once_init_leave (&check_once, 1); - } - - return ret; -} - -GstMFSourceObject * -gst_mf_source_object_new (GstMFSourceType type, gint device_index, - const gchar * device_name, const gchar * device_path, gpointer dispatcher) -{ -#if (!GST_MF_WINAPI_APP) - GST_INFO ("Try IMFSourceReader implementation"); - return gst_mf_source_reader_new (type, - device_index, device_name, device_path); -#else -#if (!GST_MF_WINAPI_DESKTOP) - GST_INFO ("Try WinRT implementation"); - return gst_mf_capture_winrt_new (type, - device_index, device_name, device_path, dispatcher); -#else - if (gst_mf_source_object_use_winrt_api ()) { - GST_INFO ("Both Desktop and WinRT APIs were enabled, user choice: WinRT"); - return gst_mf_capture_winrt_new (type, - device_index, device_name, device_path, dispatcher); - } else { - GST_INFO - ("Both Desktop and WinRT APIs were enabled, default: IMFSourceReader"); - return gst_mf_source_reader_new (type, - device_index, device_name, device_path); - } -#endif -#endif - g_assert_not_reached (); - - return NULL; -} - -gint -gst_mf_source_object_caps_compare (GstCaps * caps1, GstCaps * caps2) -{ - GstStructure *s1, *s2; - const gchar *n1, *n2; - gboolean m1_is_raw, m2_is_raw; - gint w1 = 0, h1 = 0, w2 = 0, h2 = 0; - gint r1, r2; - gint num1 = 0, den1 = 1, num2 = 0, den2 = 1; - gint fraction_cmp; - - /* sorting priority - * - raw video > comprssed - * - raw video format - * - higher resolution - * - higher framerate - */ - s1 = gst_caps_get_structure (caps1, 0); - n1 = gst_structure_get_name (s1); - - s2 = gst_caps_get_structure (caps2, 0); - n2 = gst_structure_get_name (s2); - - m1_is_raw = g_strcmp0 (n1, "video/x-raw") == 0; - m2_is_raw = g_strcmp0 (n2, "video/x-raw") == 0; - - if (m1_is_raw && !m2_is_raw) - return -1; - else if (!m1_is_raw && m2_is_raw) - return 1; - - /* if both are raw formats */ - if (m1_is_raw) { - gint format_cmp = g_strcmp0 (gst_structure_get_string (s1, "format"), - gst_structure_get_string (s2, "format")); - if (format_cmp) - return format_cmp; - } - - /* resolution */ - gst_structure_get_int (s1, "width", &w1); - gst_structure_get_int (s1, "height", &h1); - gst_structure_get_int (s2, "width", &w2); - gst_structure_get_int (s2, "height", &h2); - - r1 = w1 * h1; - r2 = w2 * h2; - - /* higher resolution first */ - if (r1 != r2) - return r2 - r1; - - gst_structure_get_fraction (s1, "framerate", &num1, &den1); - gst_structure_get_fraction (s2, "framerate", &num2, &den2); - - fraction_cmp = gst_util_fraction_compare (num1, den1, num2, den2); - - /* higher framerate first */ - return fraction_cmp * -1; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfvideoenc.cpp
Deleted
@@ -1,2007 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Seungha Yang <seungha.yang@navercorp.com> - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <gst/gst.h> -#include "gstmfvideoenc.h" -#include "gstmfvideobuffer.h" -#include "gstmfplatloader.h" -#include <wrl.h> -#include <string.h> -#include <cmath> - -#if GST_MF_HAVE_D3D11 -#include <d3d10.h> -#endif - -/* *INDENT-OFF* */ -using namespace Microsoft::WRL; - -G_BEGIN_DECLS - -GST_DEBUG_CATEGORY_EXTERN (gst_mf_video_enc_debug); -#define GST_CAT_DEFAULT gst_mf_video_enc_debug - -G_END_DECLS -/* *INDENT-ON* */ - -#define gst_mf_video_enc_parent_class parent_class -G_DEFINE_ABSTRACT_TYPE (GstMFVideoEnc, gst_mf_video_enc, - GST_TYPE_VIDEO_ENCODER); - -static void gst_mf_video_enc_dispose (GObject * object); -static void gst_mf_video_enc_set_context (GstElement * element, - GstContext * context); -static gboolean gst_mf_video_enc_open (GstVideoEncoder * enc); -static gboolean gst_mf_video_enc_close (GstVideoEncoder * enc); -static gboolean gst_mf_video_enc_start (GstVideoEncoder * enc); -static gboolean gst_mf_video_enc_set_format (GstVideoEncoder * enc, - GstVideoCodecState * state); -static GstFlowReturn gst_mf_video_enc_handle_frame (GstVideoEncoder * enc, - GstVideoCodecFrame * frame); -static GstFlowReturn gst_mf_video_enc_finish (GstVideoEncoder * enc); -static gboolean gst_mf_video_enc_flush (GstVideoEncoder * enc); -static gboolean gst_mf_video_enc_propose_allocation (GstVideoEncoder * enc, - GstQuery * query); -static gboolean gst_mf_video_enc_sink_query (GstVideoEncoder * enc, - GstQuery * query); -static gboolean gst_mf_video_enc_src_query (GstVideoEncoder * enc, - GstQuery * query); - -static HRESULT gst_mf_video_on_new_sample (GstMFTransform * object, - IMFSample * sample, GstMFVideoEnc * self); - -static void -gst_mf_video_enc_class_init (GstMFVideoEncClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstVideoEncoderClass *videoenc_class = GST_VIDEO_ENCODER_CLASS (klass); - - gobject_class->dispose = gst_mf_video_enc_dispose; - - element_class->set_context = GST_DEBUG_FUNCPTR (gst_mf_video_enc_set_context); - - videoenc_class->open = GST_DEBUG_FUNCPTR (gst_mf_video_enc_open); - videoenc_class->close = GST_DEBUG_FUNCPTR (gst_mf_video_enc_close); - videoenc_class->start = GST_DEBUG_FUNCPTR (gst_mf_video_enc_start); - videoenc_class->set_format = GST_DEBUG_FUNCPTR (gst_mf_video_enc_set_format); - videoenc_class->handle_frame = - GST_DEBUG_FUNCPTR (gst_mf_video_enc_handle_frame); - videoenc_class->finish = GST_DEBUG_FUNCPTR (gst_mf_video_enc_finish); - videoenc_class->flush = GST_DEBUG_FUNCPTR (gst_mf_video_enc_flush); - videoenc_class->propose_allocation = - GST_DEBUG_FUNCPTR (gst_mf_video_enc_propose_allocation); - videoenc_class->sink_query = GST_DEBUG_FUNCPTR (gst_mf_video_enc_sink_query); - videoenc_class->src_query = GST_DEBUG_FUNCPTR (gst_mf_video_enc_src_query); - - gst_type_mark_as_plugin_api (GST_TYPE_MF_VIDEO_ENC, (GstPluginAPIFlags) 0); -} - -static void -gst_mf_video_enc_init (GstMFVideoEnc * self) -{ -} - -static void -gst_mf_video_enc_dispose (GObject * object) -{ -#if GST_MF_HAVE_D3D11 - GstMFVideoEnc *self = GST_MF_VIDEO_ENC (object); - - gst_clear_object (&self->d3d11_device); - gst_clear_object (&self->other_d3d11_device); -#endif - - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -static void -gst_mf_video_enc_set_context (GstElement * element, GstContext * context) -{ -#if GST_MF_HAVE_D3D11 - GstMFVideoEnc *self = GST_MF_VIDEO_ENC (element); - GstMFVideoEncClass *klass = GST_MF_VIDEO_ENC_GET_CLASS (self); - GstMFVideoEncDeviceCaps *device_caps = &klass->device_caps; - - if (device_caps->d3d11_aware) { - gst_d3d11_handle_set_context_for_adapter_luid (element, context, - device_caps->adapter_luid, &self->other_d3d11_device); - } -#endif - - GST_ELEMENT_CLASS (parent_class)->set_context (element, context); -} - -static gboolean -gst_mf_video_enc_open (GstVideoEncoder * enc) -{ - GstMFVideoEnc *self = GST_MF_VIDEO_ENC (enc); - GstMFVideoEncClass *klass = GST_MF_VIDEO_ENC_GET_CLASS (enc); - GstMFVideoEncDeviceCaps *device_caps = &klass->device_caps; - GstMFTransformEnumParams enum_params = { 0, }; - MFT_REGISTER_TYPE_INFO output_type; - gboolean ret; - -#if GST_MF_HAVE_D3D11 - if (device_caps->d3d11_aware) { - HRESULT hr; - ID3D11Device *device_handle; - ComPtr < ID3D10Multithread > multi_thread; - GstD3D11Device *device; - - if (!gst_d3d11_ensure_element_data_for_adapter_luid (GST_ELEMENT (self), - device_caps->adapter_luid, &self->other_d3d11_device)) { - GST_ERROR_OBJECT (self, "Other d3d11 device is unavailable"); - return FALSE; - } - - /* Create our own device with D3D11_CREATE_DEVICE_VIDEO_SUPPORT */ - self->d3d11_device = - gst_d3d11_device_new_for_adapter_luid (device_caps->adapter_luid, - D3D11_CREATE_DEVICE_VIDEO_SUPPORT); - if (!self->d3d11_device) { - GST_ERROR_OBJECT (self, "Couldn't create internal d3d11 device"); - gst_clear_object (&self->other_d3d11_device); - return FALSE; - } - - device = self->d3d11_device; - - hr = GstMFCreateDXGIDeviceManager (&self->reset_token, &self->device_manager); - if (!gst_mf_result (hr)) { - GST_ERROR_OBJECT (self, "Couldn't create DXGI device manager"); - gst_clear_object (&self->other_d3d11_device); - gst_clear_object (&self->d3d11_device); - return FALSE; - } - - device_handle = gst_d3d11_device_get_device_handle (device); - /* Enable multi thread protection as this device will be shared with - * MFT */ - hr = device_handle->QueryInterface (IID_PPV_ARGS (&multi_thread)); - if (!gst_d3d11_result (hr, device)) { - GST_WARNING_OBJECT (self, - "device doesn't suport ID3D10Multithread interface"); - gst_clear_object (&self->other_d3d11_device); - gst_clear_object (&self->d3d11_device); - } - - multi_thread->SetMultithreadProtected (TRUE); - - hr = self->device_manager->ResetDevice ((IUnknown *) device_handle, - self->reset_token); - if (!gst_mf_result (hr)) { - GST_ERROR_OBJECT (self, "Couldn't reset device with given d3d11 device"); - gst_clear_object (&self->other_d3d11_device); - gst_clear_object (&self->d3d11_device); - return FALSE; - } - } -#endif - - output_type.guidMajorType = MFMediaType_Video; - output_type.guidSubtype = klass->codec_id; - - enum_params.category = MFT_CATEGORY_VIDEO_ENCODER; - enum_params.enum_flags = klass->enum_flags; - enum_params.output_typeinfo = &output_type; - enum_params.device_index = klass->device_index; - - if (device_caps->d3d11_aware) - enum_params.adapter_luid = device_caps->adapter_luid; - - GST_DEBUG_OBJECT (self, - "Create MFT with enum flags: 0x%x, device index: %d, d3d11 aware: %d, " - "adapter-luid %" G_GINT64_FORMAT, klass->enum_flags, klass->device_index, - device_caps->d3d11_aware, device_caps->adapter_luid); - - self->transform = gst_mf_transform_new (&enum_params); - ret = !!self->transform; - - if (!ret) { - GST_ERROR_OBJECT (self, "Cannot create MFT object"); - return FALSE; - } - - /* In case of hardware MFT, it will be running on async mode. - * And new output sample callback will be called from Media Foundation's - * internal worker queue thread */ - if (self->transform && - (enum_params.enum_flags & MFT_ENUM_FLAG_HARDWARE) == - MFT_ENUM_FLAG_HARDWARE) { - self->async_mft = TRUE; - gst_mf_transform_set_new_sample_callback (self->transform, - (GstMFTransformNewSampleCallback) gst_mf_video_on_new_sample, self); - } else { - self->async_mft = FALSE; - } - - return ret; -} - -static gboolean -gst_mf_video_enc_close (GstVideoEncoder * enc) -{ - GstMFVideoEnc *self = GST_MF_VIDEO_ENC (enc); - - gst_clear_object (&self->transform); - - if (self->input_state) { - gst_video_codec_state_unref (self->input_state); - self->input_state = NULL; - } -#if GST_MF_HAVE_D3D11 - if (self->device_manager) { - self->device_manager->Release (); - self->device_manager = nullptr; - } - - if (self->mf_allocator) { - self->mf_allocator->UninitializeSampleAllocator (); - self->mf_allocator->Release (); - self->mf_allocator = NULL; - } - - gst_clear_object (&self->other_d3d11_device); - gst_clear_object (&self->d3d11_device); -#endif - - return TRUE; -} - -static gboolean -gst_mf_video_enc_start (GstVideoEncoder * enc) -{ - /* Media Foundation Transform will shift PTS in case that B-frame is enabled. - * We need to adjust DTS correspondingly */ - gst_video_encoder_set_min_pts (enc, GST_SECOND * 60 * 60 * 1000); - - return TRUE; -} - -static gboolean -gst_mf_video_enc_set_format (GstVideoEncoder * enc, GstVideoCodecState * state) -{ - GstMFVideoEnc *self = GST_MF_VIDEO_ENC (enc); - GstMFVideoEncClass *klass = GST_MF_VIDEO_ENC_GET_CLASS (enc); - GstVideoInfo *info = &state->info; - ComPtr < IMFMediaType > in_type; - ComPtr < IMFMediaType > out_type; - GList *input_types = NULL; - GList *iter; - HRESULT hr; - gint fps_n, fps_d; - - GST_DEBUG_OBJECT (self, "Set format"); - - gst_mf_video_enc_finish (enc); - - self->mf_pts_offset = 0; - self->has_reorder_frame = FALSE; - self->last_ret = GST_FLOW_OK; - - if (self->input_state) - gst_video_codec_state_unref (self->input_state); - self->input_state = gst_video_codec_state_ref (state); - - if (!gst_mf_transform_open (self->transform)) { - GST_ERROR_OBJECT (self, "Failed to open MFT"); - return FALSE; - } -#if GST_MF_HAVE_D3D11 - if (self->device_manager) { - if (!gst_mf_transform_set_device_manager (self->transform, - self->device_manager)) { - GST_ERROR_OBJECT (self, "Couldn't set device manager"); - return FALSE; - } else { - GST_DEBUG_OBJECT (self, "set device manager done"); - } - } -#endif - - hr = MFCreateMediaType (out_type.GetAddressOf ()); - if (!gst_mf_result (hr)) - return FALSE; - - hr = out_type->SetGUID (MF_MT_MAJOR_TYPE, MFMediaType_Video); - if (!gst_mf_result (hr)) - return FALSE; - - if (klass->set_option) { - if (!klass->set_option (self, self->input_state, out_type.Get ())) { - GST_ERROR_OBJECT (self, "subclass failed to set option"); - return FALSE; - } - } - - fps_n = GST_VIDEO_INFO_FPS_N (info); - fps_d = GST_VIDEO_INFO_FPS_D (info); - if (fps_n <= 0 || fps_d <= 0) { - /* XXX: not sure why. NVIDIA MFT accepts 0/1 framerate, but Intel or - * Microsoft's software MFT doesn't accept 0/1 framerate. - * Need to set something meaningful value here therefore */ - fps_n = 25; - fps_d = 1; - } - - hr = MFSetAttributeRatio (out_type.Get (), MF_MT_FRAME_RATE, fps_n, fps_d); - if (!gst_mf_result (hr)) { - GST_ERROR_OBJECT (self, - "Couldn't set framerate %d/%d, hr: 0x%x", (guint) hr); - return FALSE; - } - - hr = MFSetAttributeSize (out_type.Get (), MF_MT_FRAME_SIZE, - GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info)); - if (!gst_mf_result (hr)) { - GST_ERROR_OBJECT (self, - "Couldn't set resolution %dx%d, hr: 0x%x", GST_VIDEO_INFO_WIDTH (info), - GST_VIDEO_INFO_HEIGHT (info), (guint) hr); - return FALSE; - } - - hr = MFSetAttributeRatio (out_type.Get (), MF_MT_PIXEL_ASPECT_RATIO, - GST_VIDEO_INFO_PAR_N (info), GST_VIDEO_INFO_PAR_D (info)); - if (!gst_mf_result (hr)) { - GST_ERROR_OBJECT (self, "Couldn't set par %d/%d", - GST_VIDEO_INFO_PAR_N (info), GST_VIDEO_INFO_PAR_D (info)); - return FALSE; - } - - hr = out_type->SetUINT32 (MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive); - if (!gst_mf_result (hr)) { - GST_ERROR_OBJECT (self, - "Couldn't set interlace mode, hr: 0x%x", (guint) hr); - return FALSE; - } - - if (!gst_mf_transform_set_output_type (self->transform, out_type.Get ())) { - GST_ERROR_OBJECT (self, "Couldn't set output type"); - return FALSE; - } - - if (!gst_mf_transform_get_input_available_types (self->transform, - &input_types)) { - GST_ERROR_OBJECT (self, "Couldn't get available input types"); - return FALSE; - } - - for (iter = input_types; iter; iter = g_list_next (iter)) { - GstVideoFormat format; - GUID subtype; - IMFMediaType *type = (IMFMediaType *) iter->data; - - hr = type->GetGUID (MF_MT_SUBTYPE, &subtype); - if (!gst_mf_result (hr)) - continue; - - format = gst_mf_video_subtype_to_video_format (&subtype); - if (format != GST_VIDEO_INFO_FORMAT (info)) - continue; - - in_type = type; - } - - g_list_free_full (input_types, (GDestroyNotify) gst_mf_media_type_release); - - if (!in_type) { - GST_ERROR_OBJECT (self, - "Couldn't convert input caps %" GST_PTR_FORMAT " to media type", - state->caps); - return FALSE; - } - - hr = MFSetAttributeSize (in_type.Get (), MF_MT_FRAME_SIZE, - GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info)); - if (!gst_mf_result (hr)) { - GST_ERROR_OBJECT (self, "Couldn't set frame size %dx%d", - GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info)); - return FALSE; - } - - hr = in_type->SetUINT32 (MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive); - if (!gst_mf_result (hr)) { - GST_ERROR_OBJECT (self, - "Couldn't set interlace mode, hr: 0x%x", (guint) hr); - return FALSE; - } - - hr = MFSetAttributeRatio (in_type.Get (), MF_MT_PIXEL_ASPECT_RATIO, - GST_VIDEO_INFO_PAR_N (info), GST_VIDEO_INFO_PAR_D (info)); - if (!gst_mf_result (hr)) { - GST_ERROR_OBJECT (self, "Couldn't set par %d/%d", - GST_VIDEO_INFO_PAR_N (info), GST_VIDEO_INFO_PAR_D (info)); - return FALSE; - } - - hr = MFSetAttributeRatio (in_type.Get (), MF_MT_FRAME_RATE, fps_n, fps_d); - if (!gst_mf_result (hr)) { - GST_ERROR_OBJECT (self, "Couldn't set framerate ratio %d/%d", fps_n, fps_d); - return FALSE; - } - - hr = in_type->SetUINT32 (MF_MT_DEFAULT_STRIDE, - GST_VIDEO_INFO_PLANE_STRIDE (info, 0)); - if (!gst_mf_result (hr)) { - GST_ERROR_OBJECT (self, "Couldn't set default stride"); - return FALSE; - } - - if (!gst_mf_transform_set_input_type (self->transform, in_type.Get ())) { - GST_ERROR_OBJECT (self, "Couldn't set input media type"); - return FALSE; - } - - g_assert (klass->set_src_caps != NULL); - if (!klass->set_src_caps (self, self->input_state, out_type.Get ())) { - GST_ERROR_OBJECT (self, "subclass couldn't set src caps"); - return FALSE; - } -#if GST_MF_HAVE_D3D11 - if (self->mf_allocator) { - self->mf_allocator->UninitializeSampleAllocator (); - self->mf_allocator->Release (); - self->mf_allocator = NULL; - } - - /* Check whether upstream is d3d11 element */ - if (state->caps) { - GstCapsFeatures *features; - ComPtr < IMFVideoSampleAllocatorEx > allocator; - - features = gst_caps_get_features (state->caps, 0); - - if (features && - gst_caps_features_contains (features, - GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { - GST_DEBUG_OBJECT (self, "found D3D11 memory feature"); - - hr = GstMFCreateVideoSampleAllocatorEx (IID_PPV_ARGS (&allocator)); - if (!gst_mf_result (hr)) - GST_WARNING_OBJECT (self, - "IMFVideoSampleAllocatorEx interface is unavailable"); - } - - if (allocator) { - do { - ComPtr < IMFAttributes > attr; - - hr = MFCreateAttributes (&attr, 4); - if (!gst_mf_result (hr)) - break; - - /* Only one buffer per sample - * (multiple sample is usually for multi-view things) */ - hr = attr->SetUINT32 (GST_GUID_MF_SA_BUFFERS_PER_SAMPLE, 1); - if (!gst_mf_result (hr)) - break; - - hr = attr->SetUINT32 (GST_GUID_MF_SA_D3D11_USAGE, D3D11_USAGE_DEFAULT); - if (!gst_mf_result (hr)) - break; - - /* TODO: Check if we need to use keyed-mutex */ - hr = attr->SetUINT32 (GST_GUID_MF_SA_D3D11_SHARED_WITHOUT_MUTEX, TRUE); - if (!gst_mf_result (hr)) - break; - - hr = attr->SetUINT32 (GST_GUID_MF_SA_D3D11_BINDFLAGS, - D3D11_BIND_VIDEO_ENCODER); - if (!gst_mf_result (hr)) - break; - - hr = allocator->SetDirectXManager (self->device_manager); - if (!gst_mf_result (hr)) - break; - - hr = allocator->InitializeSampleAllocatorEx ( - /* min samples, since we are running on async mode, - * at least 2 samples would be required */ - 2, - /* max samples, why 16 + 2? it's just magic number - * (H264 max dpb size 16 + our min sample size 2) */ - 16 + 2, attr.Get (), in_type.Get () - ); - - if (!gst_mf_result (hr)) - break; - - GST_DEBUG_OBJECT (self, "IMFVideoSampleAllocatorEx is initialized"); - - self->mf_allocator = allocator.Detach (); - } while (0); - } - } -#endif - - return TRUE; -} - -static void -gst_mf_video_buffer_free (GstVideoFrame * frame) -{ - if (!frame) - return; - - gst_video_frame_unmap (frame); - g_free (frame); -} - -static gboolean -gst_mf_video_enc_frame_needs_copy (GstVideoFrame * vframe) -{ - /* Single plane data can be used without copy */ - if (GST_VIDEO_FRAME_N_PLANES (vframe) == 1) - return FALSE; - - switch (GST_VIDEO_FRAME_FORMAT (vframe)) { - case GST_VIDEO_FORMAT_I420: - { - guint8 *data, *other_data; - guint size; - - /* Unexpected stride size, Media Foundation doesn't provide API for - * per plane stride information */ - if (GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 0) != - 2 * GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 1) || - GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 1) != - GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 2)) { - return TRUE; - } - - size = GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 0) * - GST_VIDEO_FRAME_HEIGHT (vframe); - if (size + GST_VIDEO_FRAME_PLANE_OFFSET (vframe, 0) != - GST_VIDEO_FRAME_PLANE_OFFSET (vframe, 1)) - return TRUE; - - data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 0); - other_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 1); - if (data + size != other_data) - return TRUE; - - size = GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 1) * - GST_VIDEO_FRAME_COMP_HEIGHT (vframe, 1); - if (size + GST_VIDEO_FRAME_PLANE_OFFSET (vframe, 1) != - GST_VIDEO_FRAME_PLANE_OFFSET (vframe, 2)) - return TRUE; - - data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 1); - other_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 2); - if (data + size != other_data) - return TRUE; - - return FALSE; - } - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_P010_10LE: - case GST_VIDEO_FORMAT_P016_LE: - { - guint8 *data, *other_data; - guint size; - - /* Unexpected stride size, Media Foundation doesn't provide API for - * per plane stride information */ - if (GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 0) != - GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 1)) { - return TRUE; - } - - size = GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 0) * - GST_VIDEO_FRAME_HEIGHT (vframe); - - /* Unexpected padding */ - if (size + GST_VIDEO_FRAME_PLANE_OFFSET (vframe, 0) != - GST_VIDEO_FRAME_PLANE_OFFSET (vframe, 1)) - return TRUE; - - data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 0); - other_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 1); - if (data + size != other_data) - return TRUE; - - return FALSE; - } - default: - g_assert_not_reached (); - return TRUE; - } - - return TRUE; -} - -typedef struct -{ - LONGLONG mf_pts; -} GstMFVideoEncFrameData; - -static gboolean -gst_mf_video_enc_process_input (GstMFVideoEnc * self, - GstVideoCodecFrame * frame, IMFSample * sample) -{ - GstMFVideoEncClass *klass = GST_MF_VIDEO_ENC_GET_CLASS (self); - HRESULT hr; - gboolean unset_force_keyframe = FALSE; - GstMFVideoEncFrameData *frame_data = NULL; - gboolean res; - - frame_data = g_new0 (GstMFVideoEncFrameData, 1); - frame_data->mf_pts = frame->pts / 100; - - gst_video_codec_frame_set_user_data (frame, - frame_data, (GDestroyNotify) g_free); - - hr = sample->SetSampleTime (frame_data->mf_pts); - if (!gst_mf_result (hr)) - return FALSE; - - hr = sample-> - SetSampleDuration (GST_CLOCK_TIME_IS_VALID (frame->duration) ? frame-> - duration / 100 : 0); - if (!gst_mf_result (hr)) - return FALSE; - - if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame)) { - if (klass->device_caps.force_keyframe) { - unset_force_keyframe = - gst_mf_transform_set_codec_api_uint32 (self->transform, - &CODECAPI_AVEncVideoForceKeyFrame, TRUE); - } else { - GST_WARNING_OBJECT (self, "encoder does not support force keyframe"); - } - } - - /* Unlock temporary so that we can output frame from Media Foundation's - * worker thread. - * While we are processing input, MFT might notify - * METransformHaveOutput event from Media Foundation's internal worker queue - * thread. Then we will output encoded data from the thread synchroniously, - * not from streaming (this) thread */ - if (self->async_mft) - GST_VIDEO_ENCODER_STREAM_UNLOCK (self); - res = gst_mf_transform_process_input (self->transform, sample); - if (self->async_mft) - GST_VIDEO_ENCODER_STREAM_LOCK (self); - - if (unset_force_keyframe) { - gst_mf_transform_set_codec_api_uint32 (self->transform, - &CODECAPI_AVEncVideoForceKeyFrame, FALSE); - } - - if (!res) { - GST_ERROR_OBJECT (self, "Failed to process input"); - return FALSE; - } - - return TRUE; -} - -static GstVideoCodecFrame * -gst_mf_video_enc_find_output_frame (GstMFVideoEnc * self, LONGLONG mf_pts) -{ - GList *l, *walk = gst_video_encoder_get_frames (GST_VIDEO_ENCODER (self)); - GstVideoCodecFrame *ret = NULL; - GstVideoCodecFrame *closest = NULL; - LONGLONG min_pts_abs_diff = 0; - - for (l = walk; l; l = l->next) { - GstVideoCodecFrame *frame = (GstVideoCodecFrame *) l->data; - GstMFVideoEncFrameData *data = (GstMFVideoEncFrameData *) - gst_video_codec_frame_get_user_data (frame); - LONGLONG abs_diff; - - if (!data) - continue; - - if (mf_pts == data->mf_pts) { - ret = frame; - break; - } - - abs_diff = std::abs (mf_pts - data->mf_pts); - - if (!closest || abs_diff < min_pts_abs_diff) { - closest = frame; - min_pts_abs_diff = abs_diff; - } - } - - if (!ret && closest) - ret = closest; - - if (ret) { - gst_video_codec_frame_ref (ret); - } else { - /* XXX: Shouldn't happen, but possible if no GstVideoCodecFrame holds - * user data for some reasons */ - GST_WARNING_OBJECT (self, - "Failed to find closest GstVideoCodecFrame with MF pts %" - G_GINT64_FORMAT, mf_pts); - ret = gst_video_encoder_get_oldest_frame (GST_VIDEO_ENCODER (self)); - } - - if (walk) - g_list_free_full (walk, (GDestroyNotify) gst_video_codec_frame_unref); - - return ret; -} - -static HRESULT -gst_mf_video_enc_finish_sample (GstMFVideoEnc * self, IMFSample * sample) -{ - HRESULT hr = S_OK; - BYTE *data; - ComPtr < IMFMediaBuffer > media_buffer; - GstBuffer *buffer; - GstFlowReturn res = GST_FLOW_ERROR; - GstVideoCodecFrame *frame; - LONGLONG sample_timestamp; - LONGLONG sample_duration; - LONGLONG target_mf_pts; - UINT64 mf_dts; - UINT32 keyframe = FALSE; - DWORD buffer_len; - GstClockTime pts, dts, duration; - - hr = sample->GetBufferByIndex (0, media_buffer.GetAddressOf ()); - if (!gst_mf_result (hr)) - goto done; - - hr = media_buffer->Lock (&data, NULL, &buffer_len); - if (!gst_mf_result (hr)) - goto done; - - buffer = gst_buffer_new_allocate (NULL, buffer_len, NULL); - gst_buffer_fill (buffer, 0, data, buffer_len); - media_buffer->Unlock (); - - sample->GetSampleTime (&sample_timestamp); - target_mf_pts = sample_timestamp; - sample->GetSampleDuration (&sample_duration); - sample->GetUINT32 (MFSampleExtension_CleanPoint, &keyframe); - - hr = sample->GetUINT64 (MFSampleExtension_DecodeTimestamp, &mf_dts); - if (FAILED (hr)) { - mf_dts = sample_timestamp; - hr = S_OK; - } - - pts = sample_timestamp * 100; - dts = mf_dts * 100; - duration = sample_duration * 100; - - GST_LOG_OBJECT (self, "Finish sample, MF pts %" GST_TIME_FORMAT " MF dts %" - GST_TIME_FORMAT ", MF duration %" GST_TIME_FORMAT, - GST_TIME_ARGS (pts), GST_TIME_ARGS (dts), GST_TIME_ARGS (duration)); - - /* NOTE: When B-frame is enabled, MFT shows following pattern - * (input timestamp starts from 1000:00:00.000000000, and 30fps) - * - * Frame-1: MF pts 0:00.033333300 MF dts 0:00.000000000 - * Frame-2: MF pts 0:00.133333300 MF dts 0:00.033333300 - * Frame-3: MF pts 0:00.066666600 MF dts 0:00.066666600 - * Frame-4: MF pts 0:00.099999900 MF dts 0:00.100000000 - * - * - Sounds MFT doesn't support negative timestamp, so PTS of each frame seems - * to be shifthed - * - DTS is likely based on timestamp we've set to input sample, - * but some frames has (especially Frame-4 case) unexpected PTS and - * even PTS < DTS. That would be the result of PTS shifting - * - * To handle this case, - * - Calculate timestamp offset "Frame-1 PTS" - "Frame-1 DTS" (== duration), - * and compensate PTS/DTS of each frame - * - Needs additional offset for DTS to compenstate GST/MF timescale difference - * (MF uses 100ns timescale). So DTS offset should be "PTS offset + 100ns" - * - Find corresponding GstVideoCodecFrame by using compensated PTS. - * Note that MFT doesn't support user-data for tracing input/output sample - * pair. So, timestamp based lookup is the only way to map MF sample - * and our GstVideoCodecFrame - */ - if (self->has_reorder_frame) { - /* This would be the first frame */ - if (self->mf_pts_offset == 0) { - LONGLONG mf_pts_offset = -1; - if (sample_timestamp > mf_dts) { - mf_pts_offset = sample_timestamp - mf_dts; - GST_DEBUG_OBJECT (self, "Calculates PTS offset using \"PTS - DTS\": %" - G_GINT64_FORMAT, mf_pts_offset); - } else if (sample_duration > 0) { - mf_pts_offset = sample_duration; - GST_DEBUG_OBJECT (self, "Calculates PTS offset using duration: %" - G_GINT64_FORMAT, mf_pts_offset); - } else { - GST_WARNING_OBJECT (self, "Cannot calculate PTS offset"); - } - - self->mf_pts_offset = mf_pts_offset; - } - - if (self->mf_pts_offset > 0) { - target_mf_pts -= self->mf_pts_offset; - - pts -= (self->mf_pts_offset * 100); - /* +1 to compensate timescale difference */ - dts -= ((self->mf_pts_offset + 1) * 100); - } - } - - frame = gst_mf_video_enc_find_output_frame (self, target_mf_pts); - - if (frame) { - if (keyframe) { - GST_DEBUG_OBJECT (self, "Keyframe pts %" GST_TIME_FORMAT, - GST_TIME_ARGS (frame->pts)); - GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); - } - - frame->output_buffer = buffer; - - /* Update DTS only if B-frame was enabled, but use input frame pts as-is. - * Otherwise we will lost at most 100ns precision */ - if (self->has_reorder_frame) { - frame->dts = dts; - } else { - frame->dts = frame->pts; - } - - /* make sure PTS > DTS */ - if (GST_CLOCK_TIME_IS_VALID (frame->pts) && - GST_CLOCK_TIME_IS_VALID (frame->dts) && frame->pts < frame->dts) { - GST_WARNING_OBJECT (self, "Calculated DTS %" GST_TIME_FORMAT - " is larger than PTS %" GST_TIME_FORMAT, GST_TIME_ARGS (frame->pts), - GST_TIME_ARGS (frame->dts)); - - /* XXX: just set clock-time-none? */ - frame->dts = frame->pts; - } - - GST_LOG_OBJECT (self, "Frame pts %" GST_TIME_FORMAT ", Frame DTS %" - GST_TIME_FORMAT, GST_TIME_ARGS (frame->pts), - GST_TIME_ARGS (frame->dts)); - - res = gst_video_encoder_finish_frame (GST_VIDEO_ENCODER (self), frame); - } else { - GST_BUFFER_PTS (buffer) = pts; - GST_BUFFER_DTS (buffer) = dts; - GST_BUFFER_DURATION (buffer) = duration; - - if (keyframe) { - GST_DEBUG_OBJECT (self, "Keyframe pts %" GST_TIME_FORMAT, - GST_BUFFER_PTS (buffer)); - GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); - } else { - GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); - } - - GST_LOG_OBJECT (self, "Buffer pts %" GST_TIME_FORMAT ", Buffer DTS %" - GST_TIME_FORMAT, GST_TIME_ARGS (pts), GST_TIME_ARGS (dts)); - - res = gst_pad_push (GST_VIDEO_ENCODER_SRC_PAD (self), buffer); - } - -done: - self->last_ret = res; - - return hr; -} - -static GstFlowReturn -gst_mf_video_enc_process_output (GstMFVideoEnc * self) -{ - ComPtr < IMFSample > sample; - GstFlowReturn res = GST_FLOW_ERROR; - - res = gst_mf_transform_get_output (self->transform, &sample); - - if (res != GST_FLOW_OK) - return res; - - gst_mf_video_enc_finish_sample (self, sample.Get ()); - - return self->last_ret; -} - -static gboolean -gst_mf_video_enc_create_input_sample (GstMFVideoEnc * self, - GstVideoCodecFrame * frame, IMFSample ** sample) -{ - HRESULT hr; - ComPtr < IMFSample > new_sample; - ComPtr < IMFMediaBuffer > media_buffer; - ComPtr < IGstMFVideoBuffer > video_buffer; - GstVideoInfo *info = &self->input_state->info; - gint i, j; - GstVideoFrame *vframe = NULL; - BYTE *data = NULL; - gboolean need_copy; - - vframe = g_new0 (GstVideoFrame, 1); - - if (!gst_video_frame_map (vframe, info, frame->input_buffer, GST_MAP_READ)) { - GST_ERROR_OBJECT (self, "Couldn't map input frame"); - g_free (vframe); - return FALSE; - } - - hr = MFCreateSample (&new_sample); - if (!gst_mf_result (hr)) - goto error; - - /* Check if we can forward this memory to Media Foundation without copy */ - need_copy = gst_mf_video_enc_frame_needs_copy (vframe); - if (need_copy) { - GST_TRACE_OBJECT (self, "Copy input buffer into Media Foundation memory"); - hr = MFCreateMemoryBuffer (GST_VIDEO_INFO_SIZE (info), &media_buffer); - } else { - GST_TRACE_OBJECT (self, "Can use input buffer without copy"); - hr = IGstMFVideoBuffer::CreateInstanceWrapped (&vframe->info, - (BYTE *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 0), - GST_VIDEO_INFO_SIZE (&vframe->info), &media_buffer); - } - - if (!gst_mf_result (hr)) - goto error; - - if (!need_copy) { - hr = media_buffer.As (&video_buffer); - if (!gst_mf_result (hr)) - goto error; - } else { - hr = media_buffer->Lock (&data, NULL, NULL); - if (!gst_mf_result (hr)) - goto error; - - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) { - guint8 *src, *dst; - gint src_stride, dst_stride; - gint width; - - src = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, i); - dst = data + GST_VIDEO_INFO_PLANE_OFFSET (info, i); - - src_stride = GST_VIDEO_FRAME_PLANE_STRIDE (vframe, i); - dst_stride = GST_VIDEO_INFO_PLANE_STRIDE (info, i); - - width = GST_VIDEO_INFO_COMP_WIDTH (info, i) - * GST_VIDEO_INFO_COMP_PSTRIDE (info, i); - - for (j = 0; j < GST_VIDEO_INFO_COMP_HEIGHT (info, i); j++) { - memcpy (dst, src, width); - src += src_stride; - dst += dst_stride; - } - } - - media_buffer->Unlock (); - } - - hr = media_buffer->SetCurrentLength (GST_VIDEO_INFO_SIZE (info)); - if (!gst_mf_result (hr)) - goto error; - - hr = new_sample->AddBuffer (media_buffer.Get ()); - if (!gst_mf_result (hr)) - goto error; - - if (!need_copy) { - /* IGstMFVideoBuffer will hold GstVideoFrame (+ GstBuffer), then it will be - * cleared when it's no more referenced by Media Foundation internals */ - hr = video_buffer->SetUserData ((gpointer) vframe, - (GDestroyNotify) gst_mf_video_buffer_free); - if (!gst_mf_result (hr)) - goto error; - } else { - gst_video_frame_unmap (vframe); - g_free (vframe); - vframe = NULL; - } - - *sample = new_sample.Detach (); - - return TRUE; - -error: - if (vframe) { - gst_video_frame_unmap (vframe); - g_free (vframe); - } - - return FALSE; -} - -#if GST_MF_HAVE_D3D11 -static gboolean -gst_mf_video_enc_create_input_sample_d3d11 (GstMFVideoEnc * self, - GstVideoCodecFrame * frame, IMFSample ** sample) -{ - HRESULT hr; - ComPtr < IMFSample > new_sample; - ComPtr < IMFMediaBuffer > mf_buffer; - ComPtr < IMFDXGIBuffer > dxgi_buffer; - ComPtr < ID3D11Texture2D > mf_texture; - ComPtr < IDXGIResource > dxgi_resource; - ComPtr < ID3D11Texture2D > shared_texture; - ComPtr < ID3D11Query > query; - D3D11_QUERY_DESC query_desc; - BOOL sync_done = FALSE; - HANDLE shared_handle; - GstMemory *mem; - GstD3D11Memory *dmem; - ID3D11Texture2D *texture; - ID3D11Device *device_handle; - ID3D11DeviceContext *context_handle; - GstMapInfo info; - D3D11_BOX src_box = { 0, }; - D3D11_TEXTURE2D_DESC dst_desc, src_desc; - guint subidx; - - if (!self->mf_allocator) { - GST_WARNING_OBJECT (self, "IMFVideoSampleAllocatorEx was configured"); - return FALSE; - } - - mem = gst_buffer_peek_memory (frame->input_buffer, 0); - if (!gst_is_d3d11_memory (mem)) { - GST_WARNING_OBJECT (self, "Non-d3d11 memory"); - return FALSE; - } - - dmem = (GstD3D11Memory *) mem; - device_handle = gst_d3d11_device_get_device_handle (dmem->device); - context_handle = gst_d3d11_device_get_device_context_handle (dmem->device); - - /* 1) Allocate new encoding surface */ - hr = self->mf_allocator->AllocateSample (&new_sample); - if (!gst_mf_result (hr)) { - GST_WARNING_OBJECT (self, - "Couldn't allocate new sample via IMFVideoSampleAllocatorEx"); - return FALSE; - } - - hr = new_sample->GetBufferByIndex (0, &mf_buffer); - if (!gst_mf_result (hr)) { - GST_WARNING_OBJECT (self, "Couldn't get IMFMediaBuffer from sample"); - return FALSE; - } - - hr = mf_buffer.As (&dxgi_buffer); - if (!gst_mf_result (hr)) { - GST_WARNING_OBJECT (self, "Couldn't get IMFDXGIBuffer from IMFMediaBuffer"); - return FALSE; - } - - hr = dxgi_buffer->GetResource (IID_PPV_ARGS (&mf_texture)); - if (!gst_mf_result (hr)) { - GST_WARNING_OBJECT (self, - "Couldn't get ID3D11Texture2D from IMFDXGIBuffer"); - return FALSE; - } - - hr = mf_texture.As (&dxgi_resource); - if (!gst_mf_result (hr)) { - GST_WARNING_OBJECT (self, - "Couldn't get IDXGIResource from ID3D11Texture2D"); - return FALSE; - } - - hr = dxgi_resource->GetSharedHandle (&shared_handle); - if (!gst_mf_result (hr)) { - GST_WARNING_OBJECT (self, "Couldn't get shared handle from IDXGIResource"); - return FALSE; - } - - /* Allocation succeeded. Now open shared texture to access it from - * other device */ - hr = device_handle->OpenSharedResource (shared_handle, - IID_PPV_ARGS (&shared_texture)); - if (!gst_mf_result (hr)) { - GST_WARNING_OBJECT (self, "Couldn't open shared resource"); - return FALSE; - } - - /* 2) Copy upstream texture to mf's texture */ - /* Map memory so that ensure pending upload from staging texture */ - if (!gst_memory_map (mem, &info, - (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { - GST_ERROR_OBJECT (self, "Couldn't map d3d11 memory"); - return FALSE; - } - - texture = (ID3D11Texture2D *) info.data; - texture->GetDesc (&src_desc); - shared_texture->GetDesc (&dst_desc); - subidx = gst_d3d11_memory_get_subresource_index (dmem); - - /* src/dst texture size might be different if padding was used. - * select smaller size */ - src_box.left = 0; - src_box.top = 0; - src_box.front = 0; - src_box.back = 1; - src_box.right = MIN (src_desc.Width, dst_desc.Width); - src_box.bottom = MIN (src_desc.Height, dst_desc.Height); - - /* CopySubresourceRegion() might not be able to guarantee - * copying. To ensure it, we will make use of d3d11 query */ - query_desc.Query = D3D11_QUERY_EVENT; - query_desc.MiscFlags = 0; - - hr = device_handle->CreateQuery (&query_desc, &query); - if (!gst_d3d11_result (hr, dmem->device)) { - GST_ERROR_OBJECT (self, "Couldn't Create event query"); - return FALSE; - } - - gst_d3d11_device_lock (dmem->device); - context_handle->CopySubresourceRegion (shared_texture.Get (), 0, 0, 0, 0, - texture, subidx, &src_box); - context_handle->End (query.Get ()); - - /* Wait until all issued GPU commands are finished */ - do { - context_handle->GetData (query.Get (), &sync_done, sizeof (BOOL), 0); - } while (!sync_done && (hr == S_OK || hr == S_FALSE)); - - if (!gst_d3d11_result (hr, dmem->device)) { - GST_ERROR_OBJECT (self, "Couldn't sync GPU operation"); - gst_d3d11_device_unlock (dmem->device); - gst_memory_unmap (mem, &info); - - return FALSE; - } - - gst_d3d11_device_unlock (dmem->device); - gst_memory_unmap (mem, &info); - - *sample = new_sample.Detach (); - - return TRUE; -} -#endif - -static GstFlowReturn -gst_mf_video_enc_handle_frame (GstVideoEncoder * enc, - GstVideoCodecFrame * frame) -{ - GstMFVideoEnc *self = GST_MF_VIDEO_ENC (enc); - GstFlowReturn ret = GST_FLOW_OK; - ComPtr < IMFSample > sample; - - if (self->last_ret != GST_FLOW_OK) { - GST_DEBUG_OBJECT (self, "Last return was %s", gst_flow_get_name (ret)); - ret = self->last_ret; - goto done; - } -#if GST_MF_HAVE_D3D11 - if (self->mf_allocator && - !gst_mf_video_enc_create_input_sample_d3d11 (self, frame, &sample)) { - GST_WARNING_OBJECT (self, "Failed to create IMFSample for D3D11"); - sample = nullptr; - } -#endif - - if (!sample && !gst_mf_video_enc_create_input_sample (self, frame, &sample)) { - GST_ERROR_OBJECT (self, "Failed to create IMFSample"); - ret = GST_FLOW_ERROR; - goto done; - } - - if (!gst_mf_video_enc_process_input (self, frame, sample.Get ())) { - GST_ERROR_OBJECT (self, "Failed to process input"); - ret = GST_FLOW_ERROR; - goto done; - } - - /* Don't call process_output for async (hardware) MFT. We will output - * encoded data from gst_mf_video_on_new_sample() callback which is called - * from Media Foundation's internal worker queue thread */ - if (!self->async_mft) { - do { - ret = gst_mf_video_enc_process_output (self); - } while (ret == GST_FLOW_OK); - } - - if (ret == GST_MF_TRANSFORM_FLOW_NEED_DATA) - ret = GST_FLOW_OK; - -done: - gst_video_codec_frame_unref (frame); - - return ret; -} - -static GstFlowReturn -gst_mf_video_enc_finish (GstVideoEncoder * enc) -{ - GstMFVideoEnc *self = GST_MF_VIDEO_ENC (enc); - GstFlowReturn ret = GST_FLOW_OK; - - if (!self->transform) - return GST_FLOW_OK; - - /* Unlock temporary so that we can output frame from Media Foundation's - * worker thread */ - if (self->async_mft) - GST_VIDEO_ENCODER_STREAM_UNLOCK (enc); - - gst_mf_transform_drain (self->transform); - - if (self->async_mft) - GST_VIDEO_ENCODER_STREAM_LOCK (enc); - - if (!self->async_mft) { - do { - ret = gst_mf_video_enc_process_output (self); - } while (ret == GST_FLOW_OK); - } - - if (ret == GST_MF_TRANSFORM_FLOW_NEED_DATA) - ret = GST_FLOW_OK; - - return ret; -} - -static gboolean -gst_mf_video_enc_flush (GstVideoEncoder * enc) -{ - GstMFVideoEnc *self = GST_MF_VIDEO_ENC (enc); - - if (!self->transform) - goto out; - - /* Unlock while flushing, while flushing, new sample callback might happen */ - if (self->async_mft) - GST_VIDEO_ENCODER_STREAM_UNLOCK (enc); - - gst_mf_transform_flush (self->transform); - - if (self->async_mft) - GST_VIDEO_ENCODER_STREAM_LOCK (enc); - -out: - self->last_ret = GST_FLOW_OK; - - return TRUE; -} - -static gboolean -gst_mf_video_enc_propose_allocation (GstVideoEncoder * enc, GstQuery * query) -{ -#if GST_MF_HAVE_D3D11 - GstMFVideoEnc *self = GST_MF_VIDEO_ENC (enc); - GstVideoInfo info; - GstBufferPool *pool = NULL; - GstCaps *caps; - guint size; - GstD3D11Device *device = self->other_d3d11_device; - - gst_query_parse_allocation (query, &caps, NULL); - - if (caps == NULL) - return FALSE; - - if (!gst_video_info_from_caps (&info, caps)) - return FALSE; - - if (gst_query_get_n_allocation_pools (query) == 0) { - GstCapsFeatures *features; - GstStructure *config; - gboolean is_d3d11 = FALSE; - - features = gst_caps_get_features (caps, 0); - - if (features && gst_caps_features_contains (features, - GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { - GST_DEBUG_OBJECT (self, "Allocation caps supports d3d11 memory"); - pool = gst_d3d11_buffer_pool_new (device); - is_d3d11 = TRUE; - } else { - pool = gst_video_buffer_pool_new (); - } - - config = gst_buffer_pool_get_config (pool); - - gst_buffer_pool_config_add_option (config, - GST_BUFFER_POOL_OPTION_VIDEO_META); - - /* d3d11 pool does not support video alignment */ - if (!is_d3d11) { - gst_buffer_pool_config_add_option (config, - GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); - } else { - GstD3D11AllocationParams *d3d11_params; - guint misc_flags = 0; - gboolean is_hardware = FALSE; - gint i; - - g_object_get (device, "hardware", &is_hardware, NULL); - - /* In case of hardware, set D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX flag - * so that it can be shared with other d3d11 devices */ - if (is_hardware) - misc_flags = D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX; - - d3d11_params = - gst_buffer_pool_config_get_d3d11_allocation_params (config); - if (!d3d11_params) { - d3d11_params = gst_d3d11_allocation_params_new (device, &info, - (GstD3D11AllocationFlags) 0, 0); - } else { - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&info); i++) - d3d11_params->desci.MiscFlags |= misc_flags; - } - - gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params); - gst_d3d11_allocation_params_free (d3d11_params); - } - - size = GST_VIDEO_INFO_SIZE (&info); - gst_buffer_pool_config_set_params (config, caps, size, 0, 0); - - if (!gst_buffer_pool_set_config (pool, config)) - goto config_failed; - - /* d3d11 buffer pool will update buffer size based on allocated texture, - * get size from config again */ - if (is_d3d11) { - config = gst_buffer_pool_get_config (pool); - gst_buffer_pool_config_get_params (config, - nullptr, &size, nullptr, nullptr); - gst_structure_free (config); - } - - gst_query_add_allocation_pool (query, pool, size, 0, 0); - gst_object_unref (pool); - } - - gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); - - return TRUE; - - /* ERRORS */ -config_failed: - { - GST_ERROR_OBJECT (self, "failed to set config"); - gst_object_unref (pool); - return FALSE; - } - -#else - return GST_VIDEO_ENCODER_CLASS (parent_class)->propose_allocation (enc, - query); -#endif -} - -static gboolean -gst_mf_video_enc_sink_query (GstVideoEncoder * enc, GstQuery * query) -{ -#if GST_MF_HAVE_D3D11 - GstMFVideoEnc *self = GST_MF_VIDEO_ENC (enc); - - switch (GST_QUERY_TYPE (query)) { - case GST_QUERY_CONTEXT: - if (gst_d3d11_handle_context_query (GST_ELEMENT (self), - query, self->other_d3d11_device)) { - return TRUE; - } - break; - default: - break; - } -#endif - - return GST_VIDEO_ENCODER_CLASS (parent_class)->sink_query (enc, query); -} - -static gboolean -gst_mf_video_enc_src_query (GstVideoEncoder * enc, GstQuery * query) -{ -#if GST_MF_HAVE_D3D11 - GstMFVideoEnc *self = GST_MF_VIDEO_ENC (enc); - - switch (GST_QUERY_TYPE (query)) { - case GST_QUERY_CONTEXT: - if (gst_d3d11_handle_context_query (GST_ELEMENT (self), - query, self->other_d3d11_device)) { - return TRUE; - } - break; - default: - break; - } -#endif - - return GST_VIDEO_ENCODER_CLASS (parent_class)->src_query (enc, query); -} - -static HRESULT -gst_mf_video_on_new_sample (GstMFTransform * object, - IMFSample * sample, GstMFVideoEnc * self) -{ - GST_LOG_OBJECT (self, "New Sample callback"); - - /* NOTE: this callback will be called from Media Foundation's internal - * worker queue thread */ - GST_VIDEO_ENCODER_STREAM_LOCK (self); - gst_mf_video_enc_finish_sample (self, sample); - GST_VIDEO_ENCODER_STREAM_UNLOCK (self); - - return S_OK; -} - -typedef struct -{ - guint profile; - const gchar *profile_str; -} GstMFVideoEncProfileMap; - -static void -gst_mf_video_enc_enum_internal (GstMFTransform * transform, GUID & subtype, - GstObject * d3d11_device, GstMFVideoEncDeviceCaps * device_caps, - GstCaps ** sink_template, GstCaps ** src_template) -{ - HRESULT hr; - MFT_REGISTER_TYPE_INFO *infos; - UINT32 info_size; - gint i; - GstCaps *src_caps = NULL; - GstCaps *sink_caps = NULL; - GstCaps *d3d11_caps = NULL; - GValue *supported_formats = NULL; - GValue *profiles = NULL; - gboolean have_I420 = FALSE; - gboolean have_NV12 = FALSE; - gboolean have_P010 = FALSE; - gboolean d3d11_aware = FALSE; - gchar *device_name = NULL; - IMFActivate *activate; - IMFTransform *encoder; - ICodecAPI *codec_api; - ComPtr < IMFMediaType > out_type; - GstMFVideoEncProfileMap h264_profile_map = { - {eAVEncH264VProfile_High, "high"}, - {eAVEncH264VProfile_Main, "main"}, - {eAVEncH264VProfile_Base, "baseline"}, - {0, NULL}, - }; - GstMFVideoEncProfileMap hevc_profile_map = { - {eAVEncH265VProfile_Main_420_8, "main"}, - {eAVEncH265VProfile_Main_420_10, "main-10"}, - {0, NULL}, - }; - GstMFVideoEncProfileMap *profile_to_check = NULL; - static const gchar *h264_caps_str = - "video/x-h264, stream-format=(string) byte-stream, alignment=(string) au"; - static const gchar *hevc_caps_str = - "video/x-h265, stream-format=(string) byte-stream, alignment=(string) au"; - static const gchar *vp9_caps_str = "video/x-vp9"; - const gchar *codec_caps_str = NULL; - - /* NOTE: depending on environment, - * some enumerated h/w MFT might not be usable (e.g., multiple GPU case) */ - if (!gst_mf_transform_open (transform)) - return; - - activate = gst_mf_transform_get_activate_handle (transform); - if (!activate) { - GST_WARNING_OBJECT (transform, "No IMFActivate interface available"); - return; - } - - encoder = gst_mf_transform_get_transform_handle (transform); - if (!encoder) { - GST_WARNING_OBJECT (transform, "No IMFTransform interface available"); - return; - } - - codec_api = gst_mf_transform_get_codec_api_handle (transform); - if (!codec_api) { - GST_WARNING_OBJECT (transform, "No ICodecAPI interface available"); - return; - } - - g_object_get (transform, "device-name", &device_name, NULL); - if (!device_name) { - GST_WARNING_OBJECT (transform, "Unknown device name"); - return; - } - g_free (device_name); - - hr = activate->GetAllocatedBlob (MFT_INPUT_TYPES_Attributes, - (UINT8 **) & infos, &info_size); - if (!gst_mf_result (hr)) - return; - - for (i = 0; i < info_size / sizeof (MFT_REGISTER_TYPE_INFO); i++) { - GstVideoFormat format; - const GstVideoFormatInfo *format_info; - GValue val = G_VALUE_INIT; - - format = gst_mf_video_subtype_to_video_format (&infosi.guidSubtype); - if (format == GST_VIDEO_FORMAT_UNKNOWN) - continue; - - format_info = gst_video_format_get_info (format); - if (GST_VIDEO_FORMAT_INFO_IS_RGB (format_info)) { - GST_DEBUG_OBJECT (transform, "Skip %s format", - GST_VIDEO_FORMAT_INFO_NAME (format_info)); - continue; - } - - if (!supported_formats) { - supported_formats = g_new0 (GValue, 1); - g_value_init (supported_formats, GST_TYPE_LIST); - } - - switch (format) { - /* media foundation has duplicated formats IYUV and I420 */ - case GST_VIDEO_FORMAT_I420: - if (have_I420) - continue; - - have_I420 = TRUE; - break; - case GST_VIDEO_FORMAT_NV12: - have_NV12 = TRUE; - break; - case GST_VIDEO_FORMAT_P010_10LE: - have_P010 = TRUE; - break; - default: - break; - } - - g_value_init (&val, G_TYPE_STRING); - g_value_set_static_string (&val, gst_video_format_to_string (format)); - gst_value_list_append_and_take_value (supported_formats, &val); - } - CoTaskMemFree (infos); - - if (!supported_formats) { - GST_WARNING_OBJECT (transform, "Couldn't figure out supported format"); - return; - } - - if (IsEqualGUID (MFVideoFormat_H264, subtype)) { - profile_to_check = h264_profile_map; - codec_caps_str = h264_caps_str; - } else if (IsEqualGUID (MFVideoFormat_HEVC, subtype)) { - profile_to_check = hevc_profile_map; - codec_caps_str = hevc_caps_str; - } else if (IsEqualGUID (MFVideoFormat_VP90, subtype)) { - codec_caps_str = vp9_caps_str; - } else { - g_assert_not_reached (); - return; - } - - if (profile_to_check) { - hr = MFCreateMediaType (&out_type); - if (!gst_mf_result (hr)) - return; - - hr = out_type->SetGUID (MF_MT_MAJOR_TYPE, MFMediaType_Video); - if (!gst_mf_result (hr)) - return; - - hr = out_type->SetGUID (MF_MT_SUBTYPE, subtype); - if (!gst_mf_result (hr)) - return; - - hr = out_type->SetUINT32 (MF_MT_AVG_BITRATE, 2048000); - if (!gst_mf_result (hr)) - return; - - hr = MFSetAttributeRatio (out_type.Get (), MF_MT_FRAME_RATE, 30, 1); - if (!gst_mf_result (hr)) - return; - - hr = out_type->SetUINT32 (MF_MT_INTERLACE_MODE, - MFVideoInterlace_Progressive); - if (!gst_mf_result (hr)) - return; - - hr = MFSetAttributeSize (out_type.Get (), MF_MT_FRAME_SIZE, 1920, 1080); - if (!gst_mf_result (hr)) - return; - - i = 0; - do { - GValue profile_val = G_VALUE_INIT; - guint mf_profile = profile_to_checki.profile; - const gchar *profile_str = profile_to_checki.profile_str; - - i++; - - if (mf_profile == 0) - break; - - g_assert (profile_str != NULL); - - hr = out_type->SetUINT32 (MF_MT_MPEG2_PROFILE, mf_profile); - if (!gst_mf_result (hr)) - return; - - if (!gst_mf_transform_set_output_type (transform, out_type.Get ())) - continue; - - if (!profiles) { - profiles = g_new0 (GValue, 1); - g_value_init (profiles, GST_TYPE_LIST); - } - - /* Add "constrained-baseline" in addition to "baseline" */ - if (profile_str == "baseline") { - g_value_init (&profile_val, G_TYPE_STRING); - g_value_set_static_string (&profile_val, "constrained-baseline"); - gst_value_list_append_and_take_value (profiles, &profile_val); - } - - g_value_init (&profile_val, G_TYPE_STRING); - g_value_set_static_string (&profile_val, profile_str); - gst_value_list_append_and_take_value (profiles, &profile_val); - } while (1); - - if (!profiles) { - GST_WARNING_OBJECT (transform, "Couldn't query supported profile"); - return; - } - } - - src_caps = gst_caps_from_string (codec_caps_str); - if (profiles) { - gst_caps_set_value (src_caps, "profile", profiles); - g_value_unset (profiles); - g_free (profiles); - } - - sink_caps = gst_caps_new_empty_simple ("video/x-raw"); - /* FIXME: don't hardcode max resolution, but MF doesn't provide - * API for querying supported max resolution... */ - gst_caps_set_simple (sink_caps, - "width", GST_TYPE_INT_RANGE, 64, 8192, - "height", GST_TYPE_INT_RANGE, 64, 8192, NULL); - gst_caps_set_simple (src_caps, - "width", GST_TYPE_INT_RANGE, 64, 8192, - "height", GST_TYPE_INT_RANGE, 64, 8192, NULL); - -#if GST_MF_HAVE_D3D11 - /* Check whether this MFT can support D3D11 */ - if (d3d11_device && (have_NV12 || have_P010)) { - g_object_get (transform, "d3d11-aware", &d3d11_aware, NULL); - GST_DEBUG_OBJECT (transform, "d3d11 aware %d", d3d11_aware); - } - - if (d3d11_device && (have_NV12 || have_P010) && d3d11_aware) { - gint64 adapter_luid = 0; - GValue d3d11_formats = G_VALUE_INIT; - - g_object_get (d3d11_device, "adapter-luid", &adapter_luid, NULL); - - d3d11_caps = gst_caps_copy (sink_caps); - - g_value_init (&d3d11_formats, GST_TYPE_LIST); - if (have_NV12) { - GValue val = G_VALUE_INIT; - g_value_init (&val, G_TYPE_STRING); - g_value_set_static_string (&val, "NV12"); - gst_value_list_append_and_take_value (&d3d11_formats, &val); - } - - if (have_P010) { - GValue val = G_VALUE_INIT; - g_value_init (&val, G_TYPE_STRING); - g_value_set_static_string (&val, "P010_10LE"); - gst_value_list_append_and_take_value (&d3d11_formats, &val); - } - - gst_caps_set_value (d3d11_caps, "format", &d3d11_formats); - g_value_unset (&d3d11_formats); - gst_caps_set_features_simple (d3d11_caps, - gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)); - device_caps->d3d11_aware = TRUE; - device_caps->adapter_luid = adapter_luid; - } -#endif - - gst_caps_set_value (sink_caps, "format", supported_formats); - g_value_unset (supported_formats); - g_free (supported_formats); - - if (d3d11_caps) - gst_caps_append (sink_caps, d3d11_caps); - - *sink_template = sink_caps; - *src_template = src_caps; - -#define CHECK_DEVICE_CAPS(codec_obj,api,val) \ - if (SUCCEEDED((codec_obj)->IsSupported(&(api)))) {\ - (device_caps)->val = TRUE; \ - } - - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncCommonRateControlMode, rc_mode); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncCommonQuality, quality); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncAdaptiveMode, adaptive_mode); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncCommonBufferSize, buffer_size); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncCommonMaxBitRate, max_bitrate); - CHECK_DEVICE_CAPS (codec_api, - CODECAPI_AVEncCommonQualityVsSpeed, quality_vs_speed); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncH264CABACEnable, cabac); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncH264SPSID, sps_id); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncH264PPSID, pps_id); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncMPVDefaultBPictureCount, bframes); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncMPVGOPSize, gop_size); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncNumWorkerThreads, threads); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncVideoContentType, content_type); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncVideoEncodeQP, qp); - CHECK_DEVICE_CAPS (codec_api, - CODECAPI_AVEncVideoForceKeyFrame, force_keyframe); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVLowLatencyMode, low_latency); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncVideoMinQP, min_qp); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncVideoMaxQP, max_qp); - CHECK_DEVICE_CAPS (codec_api, - CODECAPI_AVEncVideoEncodeFrameTypeQP, frame_type_qp); - CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncVideoMaxNumRefFrame, max_num_ref); - if (device_caps->max_num_ref) { - VARIANT min; - VARIANT max; - VARIANT step; - - hr = codec_api->GetParameterRange (&CODECAPI_AVEncVideoMaxNumRefFrame, - &min, &max, &step); - if (SUCCEEDED (hr)) { - device_caps->max_num_ref_high = max.uiVal; - device_caps->max_num_ref_low = min.uiVal; - VariantClear (&min); - VariantClear (&max); - VariantClear (&step); - } else { - device_caps->max_num_ref = FALSE; - } - } -#undef CHECK_DEVICE_CAPS - - return; -} - -static GstMFTransform * -gst_mf_video_enc_enum (guint enum_flags, GUID * subtype, guint device_index, - GstMFVideoEncDeviceCaps * device_caps, GstObject * d3d11_device, - GstCaps ** sink_template, GstCaps ** src_template) -{ - GstMFTransformEnumParams enum_params = { 0, }; - MFT_REGISTER_TYPE_INFO output_type; - GstMFTransform *transform; - gint64 adapter_luid = 0; - - *sink_template = NULL; - *src_template = NULL; - memset (device_caps, 0, sizeof (GstMFVideoEncDeviceCaps)); - - if (!IsEqualGUID (MFVideoFormat_H264, *subtype) && - !IsEqualGUID (MFVideoFormat_HEVC, *subtype) && - !IsEqualGUID (MFVideoFormat_VP90, *subtype)) { - GST_ERROR ("Unknown subtype GUID"); - - return NULL; - } - - if (d3d11_device) { - g_object_get (d3d11_device, "adapter-luid", &adapter_luid, NULL); - if (!adapter_luid) { - GST_ERROR ("Couldn't get adapter LUID"); - return NULL; - } - } - - output_type.guidMajorType = MFMediaType_Video; - output_type.guidSubtype = *subtype; - - enum_params.category = MFT_CATEGORY_VIDEO_ENCODER; - enum_params.output_typeinfo = &output_type; - enum_params.device_index = device_index; - enum_params.enum_flags = enum_flags; - enum_params.adapter_luid = adapter_luid; - - transform = gst_mf_transform_new (&enum_params); - if (!transform) - return NULL; - - gst_mf_video_enc_enum_internal (transform, output_type.guidSubtype, - d3d11_device, device_caps, sink_template, src_template); - - return transform; -} - -static void -gst_mf_video_enc_register_internal (GstPlugin * plugin, guint rank, - GUID * subtype, GTypeInfo * type_info, - const GstMFVideoEncDeviceCaps * device_caps, - guint32 enum_flags, guint device_index, GstMFTransform * transform, - GstCaps * sink_caps, GstCaps * src_caps) -{ - GType type; - GTypeInfo local_type_info; - gchar *type_name; - gchar *feature_name; - gint i; - GstMFVideoEncClassData *cdata; - gboolean is_default = TRUE; - gchar *device_name = NULL; - const gchar *type_name_prefix = NULL; - const gchar *feature_name_prefix = NULL; - - if (IsEqualGUID (MFVideoFormat_H264, *subtype)) { - type_name_prefix = "H264"; - feature_name_prefix = "h264"; - } else if (IsEqualGUID (MFVideoFormat_HEVC, *subtype)) { - type_name_prefix = "H265"; - feature_name_prefix = "h265"; - } else if (IsEqualGUID (MFVideoFormat_VP90, *subtype)) { - type_name_prefix = "VP9"; - feature_name_prefix = "vp9"; - } else { - g_assert_not_reached (); - return; - } - - /* Must be checked already */ - g_object_get (transform, "device-name", &device_name, NULL); - g_assert (device_name != NULL); - - cdata = g_new0 (GstMFVideoEncClassData, 1); - cdata->sink_caps = gst_caps_copy (sink_caps); - cdata->src_caps = gst_caps_copy (src_caps); - cdata->device_name = device_name; - cdata->device_caps = *device_caps; - cdata->enum_flags = enum_flags; - cdata->device_index = device_index; - - local_type_info = *type_info; - local_type_info.class_data = cdata; - - GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, - GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); - GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, - GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); - - type_name = g_strdup_printf ("GstMF%sEnc", type_name_prefix); - feature_name = g_strdup_printf ("mf%senc", feature_name_prefix); - - i = 1; - while (g_type_from_name (type_name) != 0) { - g_free (type_name); - g_free (feature_name); - type_name = g_strdup_printf ("GstMF%sDevice%dEnc", type_name_prefix, i); - feature_name = g_strdup_printf ("mf%sdevice%denc", feature_name_prefix, i); - is_default = FALSE; - i++; - } - - cdata->is_default = is_default; - - type = - g_type_register_static (GST_TYPE_MF_VIDEO_ENC, type_name, - &local_type_info, (GTypeFlags) 0); - - /* make lower rank than default device */ - if (rank > 0 && !is_default) - rank--; - - if (!is_default) - gst_element_type_set_skip_documentation (type); - - if (!gst_element_register (plugin, feature_name, rank, type)) - GST_WARNING ("Failed to register plugin '%s'", type_name); - - g_free (type_name); - g_free (feature_name); -} - -void -gst_mf_video_enc_register (GstPlugin * plugin, guint rank, GUID * subtype, - GTypeInfo * type_info, GList * d3d11_device) -{ - GstMFTransform *transform = NULL; - GstCaps *sink_template = NULL; - GstCaps *src_template = NULL; - guint enum_flags; - GstMFVideoEncDeviceCaps device_caps; - guint i; - - /* register hardware encoders first */ - enum_flags = (MFT_ENUM_FLAG_HARDWARE | MFT_ENUM_FLAG_ASYNCMFT | - MFT_ENUM_FLAG_SORTANDFILTER | MFT_ENUM_FLAG_SORTANDFILTER_APPROVED_ONLY); - - if (d3d11_device) { - GList *iter; - for (iter = d3d11_device; iter; iter = g_list_next (iter)) { - GstObject *device = (GstObject *) iter->data; - - transform = gst_mf_video_enc_enum (enum_flags, subtype, 0, &device_caps, - device, &sink_template, &src_template); - - /* No more MFT to enumerate */ - if (!transform) - break; - - /* Failed to open MFT */ - if (!sink_template) { - gst_clear_object (&transform); - continue; - } - - gst_mf_video_enc_register_internal (plugin, rank, subtype, type_info, - &device_caps, enum_flags, 0, transform, sink_template, src_template); - gst_clear_object (&transform); - gst_clear_caps (&sink_template); - gst_clear_caps (&src_template); - } - } else { - /* AMD seems to be able to support up to 12 GPUs */ - for (i = 0; i < 12; i++) { - transform = gst_mf_video_enc_enum (enum_flags, subtype, i, &device_caps, - NULL, &sink_template, &src_template); - - /* No more MFT to enumerate */ - if (!transform) - break; - - /* Failed to open MFT */ - if (!sink_template) { - gst_clear_object (&transform); - continue; - } - - gst_mf_video_enc_register_internal (plugin, rank, subtype, type_info, - &device_caps, enum_flags, i, transform, sink_template, src_template); - gst_clear_object (&transform); - gst_clear_caps (&sink_template); - gst_clear_caps (&src_template); - } - } - - /* register software encoders */ - enum_flags = (MFT_ENUM_FLAG_SYNCMFT | - MFT_ENUM_FLAG_SORTANDFILTER | MFT_ENUM_FLAG_SORTANDFILTER_APPROVED_ONLY); - - transform = gst_mf_video_enc_enum (enum_flags, subtype, 0, &device_caps, - NULL, &sink_template, &src_template); - - if (!transform) - goto done; - - if (!sink_template) - goto done; - - gst_mf_video_enc_register_internal (plugin, rank, subtype, type_info, - &device_caps, enum_flags, 0, transform, sink_template, src_template); - -done: - gst_clear_object (&transform); - gst_clear_caps (&sink_template); - gst_clear_caps (&src_template); -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfvideoenc.h
Deleted
@@ -1,149 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Seungha Yang <seungha.yang@navercorp.com> - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_MF_VIDEO_ENC_H__ -#define __GST_MF_VIDEO_ENC_H__ - -#include "gstmfconfig.h" - -#include <gst/gst.h> -#include <gst/video/video.h> -#include "gstmfutils.h" -#include "gstmftransform.h" - -#if GST_MF_HAVE_D3D11 -#include <gst/d3d11/gstd3d11.h> -#endif - -G_BEGIN_DECLS - -#define GST_TYPE_MF_VIDEO_ENC (gst_mf_video_enc_get_type()) -#define GST_MF_VIDEO_ENC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MF_VIDEO_ENC,GstMFVideoEnc)) -#define GST_MF_VIDEO_ENC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_MF_VIDEO_ENC,GstMFVideoEncClass)) -#define GST_MF_VIDEO_ENC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_MF_VIDEO_ENC,GstMFVideoEncClass)) -#define GST_IS_MF_VIDEO_ENC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MF_VIDEO_ENC)) -#define GST_IS_MF_VIDEO_ENC_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_MF_VIDEO_ENC)) - -typedef struct _GstMFVideoEnc GstMFVideoEnc; -typedef struct _GstMFVideoEncClass GstMFVideoEncClass; -typedef struct _GstMFVideoEncDeviceCaps GstMFVideoEncDeviceCaps; -typedef struct _GstMFVideoEncClassData GstMFVideoEncClassData; - -struct _GstMFVideoEncDeviceCaps -{ - gboolean rc_mode; /* AVEncCommonRateControlMode */ - gboolean quality; /* AVEncCommonQuality */ - - gboolean adaptive_mode; /* AVEncAdaptiveMode */ - gboolean buffer_size; /* AVEncCommonBufferSize */ - gboolean max_bitrate; /* AVEncCommonMaxBitRate */ - gboolean quality_vs_speed; /* AVEncCommonQualityVsSpeed */ - gboolean cabac; /* AVEncH264CABACEnable */ - gboolean sps_id; /* AVEncH264SPSID */ - gboolean pps_id; /* AVEncH264PPSID */ - gboolean bframes; /* AVEncMPVDefaultBPictureCount */ - gboolean gop_size; /* AVEncMPVGOPSize */ - gboolean threads; /* AVEncNumWorkerThreads */ - gboolean content_type; /* AVEncVideoContentType */ - gboolean qp; /* AVEncVideoEncodeQP */ - gboolean force_keyframe; /* AVEncVideoForceKeyFrame */ - gboolean low_latency; /* AVLowLatencyMode */ - - gboolean min_qp; /* AVEncVideoMinQP */ - gboolean max_qp; /* AVEncVideoMaxQP */ - gboolean frame_type_qp; /* AVEncVideoEncodeFrameTypeQP */ - gboolean max_num_ref; /* AVEncVideoMaxNumRefFrame */ - guint max_num_ref_high; - guint max_num_ref_low; - - /* TRUE if MFT support d3d11 and also we can use d3d11 interop */ - gboolean d3d11_aware; - /* DXGI adapter LUID, valid only when d3d11_aware == TRUE */ - gint64 adapter_luid; -}; - -struct _GstMFVideoEncClassData -{ - GstCaps *sink_caps; - GstCaps *src_caps; - gchar *device_name; - guint32 enum_flags; - guint device_index; - GstMFVideoEncDeviceCaps device_caps; - gboolean is_default; -}; - -struct _GstMFVideoEnc -{ - GstVideoEncoder parent; - - GstMFTransform *transform; - gboolean async_mft; - GstFlowReturn last_ret; - - GstVideoCodecState *input_state; - - /* Set by subclass */ - gboolean has_reorder_frame; - - /* Calculated timestamp offset in MF timescale (100ns scale) - * when B-frame is enabled. */ - LONGLONG mf_pts_offset; - -#if GST_MF_HAVE_D3D11 - /* For D3D11 interop. */ - GstD3D11Device *other_d3d11_device; - GstD3D11Device *d3d11_device; - IMFDXGIDeviceManager *device_manager; - UINT reset_token; - IMFVideoSampleAllocatorEx *mf_allocator; -#endif -}; - -struct _GstMFVideoEncClass -{ - GstVideoEncoderClass parent_class; - - /* Set by subclass */ - GUID codec_id; /* Output subtype of MFT */ - guint32 enum_flags; /* MFT_ENUM_FLAG */ - guint device_index; /* Index of enumerated IMFActivate via MFTEnum */ - GstMFVideoEncDeviceCaps device_caps; - - gboolean (*set_option) (GstMFVideoEnc * mfenc, - GstVideoCodecState * state, - IMFMediaType * output_type); - - gboolean (*set_src_caps) (GstMFVideoEnc * mfenc, - GstVideoCodecState * state, - IMFMediaType * output_type); -}; - -GType gst_mf_video_enc_get_type (void); - -void gst_mf_video_enc_register (GstPlugin * plugin, - guint rank, - GUID * subtype, - GTypeInfo * type_info, - GList * d3d11_device); - -G_END_DECLS - -#endif /* __GST_MF_VIDEO_ENC_H__ */ \ No newline at end of file
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfvideosrc.c
Deleted
@@ -1,482 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * SECTION:element-mfvideosrc - * @title: mfvideosrc - * - * Provides video capture from the Microsoft Media Foundation API. - * - * ## Example pipelines - * | - * gst-launch-1.0 -v mfvideosrc ! fakesink - * | Capture from the default video capture device and render to fakesink. - * - * | - * gst-launch-1.0 -v mfvideosrc device-index=1 ! fakesink - * | Capture from the second video device (if available) and render to fakesink. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstmfconfig.h" - -#include "gstmfvideosrc.h" -#include "gstmfutils.h" -#include "gstmfsourceobject.h" -#include <string.h> - -GST_DEBUG_CATEGORY (gst_mf_video_src_debug); -#define GST_CAT_DEFAULT gst_mf_video_src_debug - -#if (GST_MF_WINAPI_APP && !GST_MF_WINAPI_DESKTOP) -/* FIXME: need support JPEG for UWP */ -#define SRC_TEMPLATE_CAPS \ - GST_VIDEO_CAPS_MAKE (GST_MF_VIDEO_FORMATS) -#else -#define SRC_TEMPLATE_CAPS \ - GST_VIDEO_CAPS_MAKE (GST_MF_VIDEO_FORMATS) "; " \ - "image/jpeg, width = " GST_VIDEO_SIZE_RANGE ", " \ - "height = " GST_VIDEO_SIZE_RANGE ", " \ - "framerate = " GST_VIDEO_FPS_RANGE -#endif - -static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (SRC_TEMPLATE_CAPS)); - -struct _GstMFVideoSrc -{ - GstPushSrc parent; - - GstMFSourceObject *source; - gboolean started; - GstVideoInfo info; - - guint64 n_frames; - GstClockTime latency; - - /* properties */ - gchar *device_path; - gchar *device_name; - gint device_index; - gpointer dispatcher; -}; - -enum -{ - PROP_0, - PROP_DEVICE_PATH, - PROP_DEVICE_NAME, - PROP_DEVICE_INDEX, - PROP_DISPATCHER, -}; - -#define DEFAULT_DEVICE_PATH NULL -#define DEFAULT_DEVICE_NAME NULL -#define DEFAULT_DEVICE_INDEX -1 - -static void gst_mf_video_src_finalize (GObject * object); -static void gst_mf_video_src_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static void gst_mf_video_src_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); - -static gboolean gst_mf_video_src_start (GstBaseSrc * src); -static gboolean gst_mf_video_src_stop (GstBaseSrc * src); -static gboolean gst_mf_video_src_set_caps (GstBaseSrc * src, GstCaps * caps); -static GstCaps *gst_mf_video_src_get_caps (GstBaseSrc * src, GstCaps * filter); -static GstCaps *gst_mf_video_src_fixate (GstBaseSrc * src, GstCaps * caps); -static gboolean gst_mf_video_src_unlock (GstBaseSrc * src); -static gboolean gst_mf_video_src_unlock_stop (GstBaseSrc * src); -static gboolean gst_mf_video_src_query (GstBaseSrc * src, GstQuery * query); - -static GstFlowReturn gst_mf_video_src_create (GstPushSrc * pushsrc, - GstBuffer ** buffer); - -#define gst_mf_video_src_parent_class parent_class -G_DEFINE_TYPE (GstMFVideoSrc, gst_mf_video_src, GST_TYPE_PUSH_SRC); - -static void -gst_mf_video_src_class_init (GstMFVideoSrcClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstBaseSrcClass *basesrc_class = GST_BASE_SRC_CLASS (klass); - GstPushSrcClass *pushsrc_class = GST_PUSH_SRC_CLASS (klass); - - gobject_class->finalize = gst_mf_video_src_finalize; - gobject_class->get_property = gst_mf_video_src_get_property; - gobject_class->set_property = gst_mf_video_src_set_property; - - g_object_class_install_property (gobject_class, PROP_DEVICE_PATH, - g_param_spec_string ("device-path", "Device Path", - "The device path", DEFAULT_DEVICE_PATH, - G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | - G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, - g_param_spec_string ("device-name", "Device Name", - "The human-readable device name", DEFAULT_DEVICE_NAME, - G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | - G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, PROP_DEVICE_INDEX, - g_param_spec_int ("device-index", "Device Index", - "The zero-based device index", -1, G_MAXINT, DEFAULT_DEVICE_INDEX, - G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | - G_PARAM_STATIC_STRINGS)); -#if GST_MF_WINAPI_APP - /** - * GstMFVideoSrc:dispatcher: - * - * ICoreDispatcher COM object used for activating device from UI thread. - * - * Since: 1.18 - */ - g_object_class_install_property (gobject_class, PROP_DISPATCHER, - g_param_spec_pointer ("dispatcher", "Dispatcher", - "ICoreDispatcher COM object to use. In order for application to ask " - "permission of capture device, device activation should be running " - "on UI thread via ICoreDispatcher. This element will increase " - "the reference count of given ICoreDispatcher and release it after " - "use. Therefore, caller does not need to consider additional " - "reference count management", - GST_PARAM_CONDITIONALLY_AVAILABLE | GST_PARAM_MUTABLE_READY | - G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); -#endif - - gst_element_class_set_static_metadata (element_class, - "Media Foundation Video Source", - "Source/Video/Hardware", - "Capture video stream through Windows Media Foundation", - "Seungha Yang <seungha.yang@navercorp.com>"); - - gst_element_class_add_static_pad_template (element_class, &src_template); - - basesrc_class->start = GST_DEBUG_FUNCPTR (gst_mf_video_src_start); - basesrc_class->stop = GST_DEBUG_FUNCPTR (gst_mf_video_src_stop); - basesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_mf_video_src_set_caps); - basesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_mf_video_src_get_caps); - basesrc_class->fixate = GST_DEBUG_FUNCPTR (gst_mf_video_src_fixate); - basesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_mf_video_src_unlock); - basesrc_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_mf_video_src_unlock_stop); - basesrc_class->query = GST_DEBUG_FUNCPTR (gst_mf_video_src_query); - - pushsrc_class->create = GST_DEBUG_FUNCPTR (gst_mf_video_src_create); - - GST_DEBUG_CATEGORY_INIT (gst_mf_video_src_debug, "mfvideosrc", 0, - "mfvideosrc"); -} - -static void -gst_mf_video_src_init (GstMFVideoSrc * self) -{ - gst_base_src_set_format (GST_BASE_SRC (self), GST_FORMAT_TIME); - gst_base_src_set_live (GST_BASE_SRC (self), TRUE); - - self->device_index = DEFAULT_DEVICE_INDEX; -} - -static void -gst_mf_video_src_finalize (GObject * object) -{ - GstMFVideoSrc *self = GST_MF_VIDEO_SRC (object); - - g_free (self->device_name); - g_free (self->device_path); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -gst_mf_video_src_get_property (GObject * object, guint prop_id, GValue * value, - GParamSpec * pspec) -{ - GstMFVideoSrc *self = GST_MF_VIDEO_SRC (object); - - switch (prop_id) { - case PROP_DEVICE_PATH: - g_value_set_string (value, self->device_path); - break; - case PROP_DEVICE_NAME: - g_value_set_string (value, self->device_name); - break; - case PROP_DEVICE_INDEX: - g_value_set_int (value, self->device_index); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_mf_video_src_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstMFVideoSrc *self = GST_MF_VIDEO_SRC (object); - - switch (prop_id) { - case PROP_DEVICE_PATH: - g_free (self->device_path); - self->device_path = g_value_dup_string (value); - break; - case PROP_DEVICE_NAME: - g_free (self->device_name); - self->device_name = g_value_dup_string (value); - break; - case PROP_DEVICE_INDEX: - self->device_index = g_value_get_int (value); - break; -#if GST_MF_WINAPI_APP - case PROP_DISPATCHER: - self->dispatcher = g_value_get_pointer (value); - break; -#endif - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static gboolean -gst_mf_video_src_start (GstBaseSrc * src) -{ - GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); - - GST_DEBUG_OBJECT (self, "Start"); - - self->source = gst_mf_source_object_new (GST_MF_SOURCE_TYPE_VIDEO, - self->device_index, self->device_name, self->device_path, NULL); - - self->n_frames = 0; - self->latency = 0; - - if (!self->source) { - GST_ERROR_OBJECT (self, "Couldn't create capture object"); - return FALSE; - } - - gst_mf_source_object_set_client (self->source, GST_ELEMENT (self)); - - return TRUE; -} - -static gboolean -gst_mf_video_src_stop (GstBaseSrc * src) -{ - GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); - - GST_DEBUG_OBJECT (self, "Stop"); - - if (self->source) { - gst_mf_source_object_stop (self->source); - gst_object_unref (self->source); - self->source = NULL; - } - - self->started = FALSE; - - return TRUE; -} - -static gboolean -gst_mf_video_src_set_caps (GstBaseSrc * src, GstCaps * caps) -{ - GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); - - GST_DEBUG_OBJECT (self, "Set caps %" GST_PTR_FORMAT, caps); - - if (!self->source) { - GST_ERROR_OBJECT (self, "No capture engine yet"); - return FALSE; - } - - if (!gst_mf_source_object_set_caps (self->source, caps)) { - GST_ERROR_OBJECT (self, "CaptureEngine couldn't accept caps"); - return FALSE; - } - - gst_video_info_from_caps (&self->info, caps); - if (GST_VIDEO_INFO_FORMAT (&self->info) != GST_VIDEO_FORMAT_ENCODED) - gst_base_src_set_blocksize (src, GST_VIDEO_INFO_SIZE (&self->info)); - - return TRUE; -} - -static GstCaps * -gst_mf_video_src_get_caps (GstBaseSrc * src, GstCaps * filter) -{ - GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); - GstCaps *caps = NULL; - - if (self->source) - caps = gst_mf_source_object_get_caps (self->source); - - if (!caps) - caps = gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD (src)); - - if (filter) { - GstCaps *filtered = - gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); - gst_caps_unref (caps); - caps = filtered; - } - - GST_DEBUG_OBJECT (self, "Returning caps %" GST_PTR_FORMAT, caps); - - return caps; -} - -static GstCaps * -gst_mf_video_src_fixate (GstBaseSrc * src, GstCaps * caps) -{ - GstStructure *structure; - GstCaps *fixated_caps; - gint i; - - fixated_caps = gst_caps_make_writable (caps); - - for (i = 0; i < gst_caps_get_size (fixated_caps); ++i) { - structure = gst_caps_get_structure (fixated_caps, i); - gst_structure_fixate_field_nearest_int (structure, "width", G_MAXINT); - gst_structure_fixate_field_nearest_int (structure, "height", G_MAXINT); - gst_structure_fixate_field_nearest_fraction (structure, "framerate", - G_MAXINT, 1); - } - - fixated_caps = gst_caps_fixate (fixated_caps); - - return fixated_caps; -} - -static gboolean -gst_mf_video_src_unlock (GstBaseSrc * src) -{ - GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); - - if (self->source) - gst_mf_source_object_set_flushing (self->source, TRUE); - - return TRUE; -} - -static gboolean -gst_mf_video_src_unlock_stop (GstBaseSrc * src) -{ - GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); - - if (self->source) - gst_mf_source_object_set_flushing (self->source, FALSE); - - return TRUE; -} - -static gboolean -gst_mf_video_src_query (GstBaseSrc * src, GstQuery * query) -{ - GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); - - switch (GST_QUERY_TYPE (query)) { - case GST_QUERY_LATENCY: - if (self->started) { - gst_query_set_latency (query, TRUE, 0, self->latency); - - return TRUE; - } - break; - default: - break; - } - - return GST_BASE_SRC_CLASS (parent_class)->query (src, query); -} - -static GstFlowReturn -gst_mf_video_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer) -{ - GstMFVideoSrc *self = GST_MF_VIDEO_SRC (pushsrc); - GstFlowReturn ret = GST_FLOW_OK; - GstBuffer *buf = NULL; - GstClock *clock; - GstClockTime running_time = GST_CLOCK_TIME_NONE; - GstClockTimeDiff diff; - - if (!self->started) { - if (!gst_mf_source_object_start (self->source)) { - GST_ERROR_OBJECT (self, "Failed to start capture object"); - - return GST_FLOW_ERROR; - } - - self->started = TRUE; - } - - if (GST_VIDEO_INFO_FORMAT (&self->info) != GST_VIDEO_FORMAT_ENCODED) { - ret = GST_BASE_SRC_CLASS (parent_class)->alloc (GST_BASE_SRC (self), 0, - GST_VIDEO_INFO_SIZE (&self->info), &buf); - - if (ret != GST_FLOW_OK) { - gst_clear_buffer (&buf); - return ret; - } - - ret = gst_mf_source_object_fill (self->source, buf); - } else { - ret = gst_mf_source_object_create (self->source, &buf); - } - - if (ret != GST_FLOW_OK) { - gst_clear_buffer (&buf); - return ret; - } - - GST_BUFFER_OFFSET (buf) = self->n_frames; - GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET (buf) + 1; - self->n_frames++; - - GST_LOG_OBJECT (self, - "Captured buffer timestamp %" GST_TIME_FORMAT ", duration %" - GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), - GST_TIME_ARGS (GST_BUFFER_DURATION (buf))); - - /* Update latency */ - clock = gst_element_get_clock (GST_ELEMENT_CAST (self)); - if (clock) { - GstClockTime now; - - now = gst_clock_get_time (clock); - running_time = now - GST_ELEMENT_CAST (self)->base_time; - gst_object_unref (clock); - } - - diff = GST_CLOCK_DIFF (GST_BUFFER_PTS (buf), running_time); - if (diff > self->latency) { - self->latency = (GstClockTime) diff; - GST_DEBUG_OBJECT (self, "Updated latency value %" GST_TIME_FORMAT, - GST_TIME_ARGS (self->latency)); - } - - *buffer = buf; - - return GST_FLOW_OK; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/plugin.c
Deleted
@@ -1,257 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * SECTION:plugin-mediafoundation - * - * Microsoft MediaFoundation plugin. - * - * This plugin consists of various hardware/software video encoders - * software audio encoders, and video capture (from webcam) elements. - * - * GstMediaFoundation plugin supports H.264/AVC, H.265/HEVC, VP9, codecs for - * hardware-accelerate encoding. - * - * However, depending on the hardware it runs on, some elements might not be - * registered in case that underlying hardware doesn't support the feature. - * - * Moreover, depending on hardware vendor's MediaFoundation implementation, - * secendary GPU may not be usable. In that case, user could use vendor - * specific plugins, Intel Media SDK and NVCODEC plugins for example. - * - * For a system with multiple MediaFoundation compatible hardwares (i.e., GPU), - * there can be multiple plugin features having the same role. - * Also, there would be additional software video encoder element the system - * meets requirement. - * - * The naming rule for the non-primary encoder is `mf{codec}device{index}enc` - * where `index` is an arbitrary index number of hardware starting from 1. - * - * To get a list of all available elements, user can run - * ```sh - * gst-inspect-1.0.exe mediafoundation - * ``` - * - * Since: 1.18 - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstmfconfig.h" - -#include <winapifamily.h> - -#include <gst/gst.h> -#include <gst/video/video.h> -#include "gstmfvideosrc.h" -#include "gstmfdevice.h" -#include "gstmfutils.h" -#include "gstmfh264enc.h" -#include "gstmfh265enc.h" -#include "gstmfvp9enc.h" -#include "gstmfaacenc.h" -#include "gstmfmp3enc.h" - -#if GST_MF_HAVE_D3D11 -#include <gst/d3d11/gstd3d11.h> -#include <gstmfplatloader.h> -#endif - -GST_DEBUG_CATEGORY (gst_mf_debug); -GST_DEBUG_CATEGORY (gst_mf_utils_debug); -GST_DEBUG_CATEGORY (gst_mf_source_object_debug); -GST_DEBUG_CATEGORY (gst_mf_transform_debug); -GST_DEBUG_CATEGORY (gst_mf_video_buffer_debug); -GST_DEBUG_CATEGORY (gst_mf_video_enc_debug); - -#define GST_CAT_DEFAULT gst_mf_debug - -static void -plugin_deinit (gpointer data) -{ - MFShutdown (); -} - -#if GST_MF_HAVE_D3D11 -static GList * -get_d3d11_devices (void) -{ - GList *ret = NULL; - guint i; - HRESULT hr; - IMFVideoSampleAllocatorEx *allocator = NULL; - - /* Check whether we can use IMFVideoSampleAllocatorEx interface */ - hr = GstMFCreateVideoSampleAllocatorEx (&IID_IMFVideoSampleAllocatorEx, - &allocator); - if (!gst_mf_result (hr)) { - GST_DEBUG ("IMFVideoSampleAllocatorEx interface is unavailable"); - return NULL; - } else { - IMFVideoSampleAllocatorEx_Release (allocator); - } - - /* AMD seems supporting up to 12 cards, and 8 for NVIDIA */ - for (i = 0; i < 12; i++) { - GstD3D11Device *device; - gboolean is_hardware = FALSE; - const GstD3D11Format *d3d11_format; - ID3D11Device *device_handle; - D3D11_FEATURE_DATA_D3D11_OPTIONS4 options = { 0, }; - UINT supported = 0; - - device = gst_d3d11_device_new (i, D3D11_CREATE_DEVICE_VIDEO_SUPPORT); - - if (!device) - break; - - g_object_get (device, "hardware", &is_hardware, NULL); - - if (!is_hardware) { - GST_DEBUG_OBJECT (device, "Given d3d11 device is not for hardware"); - gst_object_unref (device); - continue; - } - - /* device can support NV12 format? */ - d3d11_format = - gst_d3d11_device_format_from_gst (device, GST_VIDEO_FORMAT_NV12); - if (!d3d11_format || d3d11_format->dxgi_format != DXGI_FORMAT_NV12) { - GST_DEBUG_OBJECT (device, - "Given d3d11 device cannot support NV12 format"); - gst_object_unref (device); - continue; - } - - /* device can support ExtendedNV12SharedTextureSupported? - * - * NOTE: we will make use of per encoder object d3d11 device without - * sharing it in a pipeline because MF needs D3D11_CREATE_DEVICE_VIDEO_SUPPORT - * but the flag doesn't used for the other our use cases. - * So we need texture sharing feature so that we can copy d3d11 texture into - * MF specific texture pool without download texture */ - - device_handle = gst_d3d11_device_get_device_handle (device); - hr = ID3D11Device_CheckFeatureSupport (device_handle, - D3D11_FEATURE_D3D11_OPTIONS4, &options, sizeof (options)); - if (!gst_d3d11_result (hr, device) || - !options.ExtendedNV12SharedTextureSupported) { - GST_DEBUG_OBJECT (device, - "Given d3d11 device cannot support NV12 format for shared texture"); - gst_object_unref (device); - continue; - } - - /* can we bind NV12 texture for encoder? */ - hr = ID3D11Device_CheckFormatSupport (device_handle, - DXGI_FORMAT_NV12, &supported); - - if (!gst_d3d11_result (hr, device)) { - GST_DEBUG_OBJECT (device, "Couldn't query format support"); - gst_object_unref (device); - continue; - } else if ((supported & D3D11_FORMAT_SUPPORT_VIDEO_ENCODER) == 0) { - GST_DEBUG_OBJECT (device, "We cannot bind NV12 format for encoding"); - gst_object_unref (device); - continue; - } - - ret = g_list_append (ret, device); - } - - return ret; -} -#endif - -static gboolean -plugin_init (GstPlugin * plugin) -{ - HRESULT hr; - GstRank rank = GST_RANK_SECONDARY; - GList *device_list = NULL; - - GST_DEBUG_CATEGORY_INIT (gst_mf_debug, "mf", 0, "media foundation"); - GST_DEBUG_CATEGORY_INIT (gst_mf_utils_debug, - "mfutils", 0, "media foundation utility functions"); - GST_DEBUG_CATEGORY_INIT (gst_mf_source_object_debug, - "mfsourceobject", 0, "mfsourceobject"); - GST_DEBUG_CATEGORY_INIT (gst_mf_transform_debug, - "mftransform", 0, "mftransform"); - GST_DEBUG_CATEGORY_INIT (gst_mf_video_buffer_debug, - "mfvideobuffer", 0, "mfvideobuffer"); - GST_DEBUG_CATEGORY_INIT (gst_mf_video_enc_debug, - "mfvideoenc", 0, "mfvideoenc"); - - hr = MFStartup (MF_VERSION, MFSTARTUP_NOSOCKET); - if (!gst_mf_result (hr)) { - GST_WARNING ("MFStartup failure, hr: 0x%x", hr); - return TRUE; - } - - /* mfvideosrc should be primary rank for UWP */ -#if (GST_MF_WINAPI_APP && !GST_MF_WINAPI_DESKTOP) - rank = GST_RANK_PRIMARY + 1; -#endif - - /* FIXME: In order to create MFT for a specific GPU, MFTEnum2() API is - * required API but it's desktop only. - * So, resulting MFT and D3D11 might not be compatible in case of multi-GPU - * environment on UWP. */ -#if GST_MF_HAVE_D3D11 - if (gst_mf_plat_load_library ()) - device_list = get_d3d11_devices (); -#endif - - gst_element_register (plugin, "mfvideosrc", rank, GST_TYPE_MF_VIDEO_SRC); - gst_device_provider_register (plugin, "mfdeviceprovider", - rank, GST_TYPE_MF_DEVICE_PROVIDER); - - gst_mf_h264_enc_plugin_init (plugin, GST_RANK_SECONDARY, device_list); - gst_mf_h265_enc_plugin_init (plugin, GST_RANK_SECONDARY, device_list); - gst_mf_vp9_enc_plugin_init (plugin, GST_RANK_SECONDARY, device_list); - - if (device_list) - g_list_free_full (device_list, gst_object_unref); - - gst_mf_aac_enc_plugin_init (plugin, GST_RANK_SECONDARY); - gst_mf_mp3_enc_plugin_init (plugin, GST_RANK_SECONDARY); - - /* So that call MFShutdown() when this plugin is no more used - * (i.e., gst_deinit). Otherwise valgrind-like tools would complain - * about un-released media foundation resources. - * - * NOTE: MFStartup and MFShutdown can be called multiple times, but the number - * of each MFStartup and MFShutdown call should be identical. This rule is - * simliar to that of CoInitialize/CoUninitialize pair */ - g_object_set_data_full (G_OBJECT (plugin), - "plugin-mediafoundation-shutdown", "shutdown-data", - (GDestroyNotify) plugin_deinit); - - return TRUE; -} - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - mediafoundation, - "Microsoft Media Foundation plugin", - plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/cuda-converter.c
Deleted
@@ -1,2131 +0,0 @@ -/* GStreamer - * Copyright (C) 2010 David Schleef <ds@schleef.org> - * Copyright (C) 2010 Sebastian Dröge <sebastian.droege@collabora.co.uk> - * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * SECTION:cudaconverter - * @title: GstCudaConverter - * @short_description: Generic video conversion using CUDA - * - * This object is used to convert video frames from one format to another. - * The object can perform conversion of: - * - * * video format - * * video colorspace - * * video size - */ - -/** - * TODO: - * * Add more interpolation method and make it selectable, - * currently default bi-linear interpolation only - * * Add fast-path for conversion like videoconvert - * * Full colorimetry and chroma-siting support - * * cropping, and x, y position support - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "cuda-converter.h" -#include "gstcudautils.h" -#include "gstcudaloader.h" -#include "gstcudanvrtc.h" -#include <string.h> - -#define CUDA_BLOCK_X 16 -#define CUDA_BLOCK_Y 16 -#define DIV_UP(size,block) (((size) + ((block) - 1)) / (block)) - -static gboolean cuda_converter_lookup_path (GstCudaConverter * convert); - -#ifndef GST_DISABLE_GST_DEBUG -#define GST_CAT_DEFAULT ensure_debug_category() -static GstDebugCategory * -ensure_debug_category (void) -{ - static gsize cat_gonce = 0; - - if (g_once_init_enter (&cat_gonce)) { - gsize cat_done; - - cat_done = (gsize) _gst_debug_category_new ("cuda-converter", 0, - "cuda-converter object"); - - g_once_init_leave (&cat_gonce, cat_done); - } - - return (GstDebugCategory *) cat_gonce; -} -#else -#define ensure_debug_category() -#endif - -#define GST_CUDA_KERNEL_FUNC "gst_cuda_kernel_func" - -#define GST_CUDA_KERNEL_FUNC_TO_Y444 "gst_cuda_kernel_func_to_y444" - -#define GST_CUDA_KERNEL_FUNC_Y444_TO_YUV "gst_cuda_kernel_func_y444_to_yuv" - -#define GST_CUDA_KERNEL_FUNC_TO_ARGB "gst_cuda_kernel_func_to_argb" - -#define GST_CUDA_KERNEL_FUNC_SCALE_RGB "gst_cuda_kernel_func_scale_rgb" - -/* *INDENT-OFF* */ -/** - * read_chroma: - * @tex1: a CUDA texture object representing a semi-planar chroma plane - * @tex2: dummy object - * @x: the x coordinate to read data from @tex1 - * @y: the y coordinate to read data from @tex1 - * - * Returns: a #ushort2 vector representing both chroma pixel values - */ -static const gchar READ_CHROMA_FROM_SEMI_PLANAR = -"__device__ ushort2\n" -"read_chroma (cudaTextureObject_t tex1, cudaTextureObject_t tex2, \n" -" float x, float y)\n" -"{\n" -" return tex2D<ushort2>(tex1, x, y);\n" -"}"; - -/** - * read_chroma: - * @tex1: a CUDA texture object representing a chroma planar plane - * @tex2: a CUDA texture object representing the other planar plane - * @x: the x coordinate to read data from @tex1 and @tex2 - * @y: the y coordinate to read data from @tex1 and @tex2 - * - * Returns: a #ushort2 vector representing both chroma pixel values - */ -static const gchar READ_CHROMA_FROM_PLANAR = -"__device__ ushort2\n" -"read_chroma (cudaTextureObject_t tex1, cudaTextureObject_t tex2, \n" -" float x, float y)\n" -"{\n" -" unsigned short u, v;\n" -" u = tex2D<unsigned short>(tex1, x, y);\n" -" v = tex2D<unsigned short>(tex2, x, y);\n" -" return make_ushort2(u, v);\n" -"}"; - -/** - * write_chroma: - * @dst1: a CUDA global memory pointing to a semi-planar chroma plane - * @dst2: dummy - * @u: a pixel value to write @dst1 - * @v: a pixel value to write @dst1 - * @x: the x coordinate to write data into @tex1 - * @x: the y coordinate to write data into @tex1 - * @pstride: the pixel stride of @dst1 - * @mask: bitmask to be applied to high bitdepth plane - * - * Write @u and @v pixel value to @dst1 semi-planar plane - */ -static const gchar WRITE_CHROMA_TO_SEMI_PLANAR = -"__device__ void\n" -"write_chroma (unsigned char *dst1, unsigned char *dst2, unsigned short u,\n" -" unsigned short v, int x, int y, int pstride, int stride, int mask)\n" -"{\n" -" if (OUT_DEPTH > 8) {\n" -" *(unsigned short *)&dst1x * pstride + y * stride = (u & mask);\n" -" *(unsigned short *)&dst1x * pstride + 2 + y * stride = (v & mask);\n" -" } else {\n" -" dst1x * pstride + y * stride = u;\n" -" dst1x * pstride + 1 + y * stride = v;\n" -" }\n" -"}"; - -/** - * write_chroma: - * @dst1: a CUDA global memory pointing to a planar chroma plane - * @dst2: a CUDA global memory pointing to a the other planar chroma plane - * @u: a pixel value to write @dst1 - * @v: a pixel value to write @dst1 - * @x: the x coordinate to write data into @tex1 - * @x: the y coordinate to write data into @tex1 - * @pstride: the pixel stride of @dst1 - * @mask: bitmask to be applied to high bitdepth plane - * - * Write @u and @v pixel value into @dst1 and @dst2 planar planes - */ -static const gchar WRITE_CHROMA_TO_PLANAR = -"__device__ void\n" -"write_chroma (unsigned char *dst1, unsigned char *dst2, unsigned short u,\n" -" unsigned short v, int x, int y, int pstride, int stride, int mask)\n" -"{\n" -" if (OUT_DEPTH > 8) {\n" -" *(unsigned short *)&dst1x * pstride + y * stride = (u & mask);\n" -" *(unsigned short *)&dst2x * pstride + y * stride = (v & mask);\n" -" } else {\n" -" dst1x * pstride + y * stride = u;\n" -" dst2x * pstride + y * stride = v;\n" -" }\n" -"}"; - -/* CUDA kernel source for from YUV to YUV conversion and scale */ -static const gchar templ_YUV_TO_YUV = -"extern \"C\"{\n" -"__constant__ float SCALE_H = %s;\n" -"__constant__ float SCALE_V = %s;\n" -"__constant__ float CHROMA_SCALE_H = %s;\n" -"__constant__ float CHROMA_SCALE_V = %s;\n" -"__constant__ int WIDTH = %d;\n" -"__constant__ int HEIGHT = %d;\n" -"__constant__ int CHROMA_WIDTH = %d;\n" -"__constant__ int CHROMA_HEIGHT = %d;\n" -"__constant__ int IN_DEPTH = %d;\n" -"__constant__ int OUT_DEPTH = %d;\n" -"__constant__ int PSTRIDE = %d;\n" -"__constant__ int CHROMA_PSTRIDE = %d;\n" -"__constant__ int IN_SHIFT = %d;\n" -"__constant__ int OUT_SHIFT = %d;\n" -"__constant__ int MASK = %d;\n" -"__constant__ int SWAP_UV = %d;\n" -"\n" -"__device__ unsigned short\n" -"do_scale_pixel (unsigned short val) \n" -"{\n" -" unsigned int diff;\n" -" if (OUT_DEPTH > IN_DEPTH) {\n" -" diff = OUT_DEPTH - IN_DEPTH;\n" -" return (val << diff) | (val >> (IN_DEPTH - diff));\n" -" } else if (IN_DEPTH > OUT_DEPTH) {\n" -" return val >> (IN_DEPTH - OUT_DEPTH);\n" -" }\n" -" return val;\n" -"}\n" -"\n" -/* __device__ ushort2 - * read_chroma (cudaTextureObject_t tex1, cudaTextureObject_t tex2, float x, float y); - */ -"%s\n" -"\n" -/* __device__ void - * write_chroma (unsigned char *dst1, unsigned char *dst2, unsigned short u, - * unsigned short v, int x, int y, int pstride, int stride, int mask); - */ -"%s\n" -"\n" -"__global__ void\n" -GST_CUDA_KERNEL_FUNC -"(cudaTextureObject_t tex0, cudaTextureObject_t tex1, cudaTextureObject_t tex2,\n" -" unsigned char *dst0, unsigned char *dst1, unsigned char *dst2,\n" -" int stride)\n" -"{\n" -" int x_pos = blockIdx.x * blockDim.x + threadIdx.x;\n" -" int y_pos = blockIdx.y * blockDim.y + threadIdx.y;\n" -" if (x_pos < WIDTH && y_pos < HEIGHT) {\n" -" float src_xpos = SCALE_H * x_pos;\n" -" float src_ypos = SCALE_V * y_pos;\n" -" unsigned short y = tex2D<unsigned short>(tex0, src_xpos, src_ypos);\n" -" y = y >> IN_SHIFT;\n" -" y = do_scale_pixel (y);\n" -" y = y << OUT_SHIFT;\n" -" if (OUT_DEPTH > 8) {\n" -" *(unsigned short *)&dst0x_pos * PSTRIDE + y_pos * stride = (y & MASK);\n" -" } else {\n" -" dst0x_pos * PSTRIDE + y_pos * stride = y;\n" -" }\n" -" }\n" -" if (x_pos < CHROMA_WIDTH && y_pos < CHROMA_HEIGHT) {\n" -" float src_xpos = CHROMA_SCALE_H * x_pos;\n" -" float src_ypos = CHROMA_SCALE_V * y_pos;\n" -" unsigned short u, v;\n" -" ushort2 uv = read_chroma (tex1, tex2, src_xpos, src_ypos);\n" -" u = uv.x;\n" -" v = uv.y;\n" -" u = u >> IN_SHIFT;\n" -" v = v >> IN_SHIFT;\n" -" u = do_scale_pixel (u);\n" -" v = do_scale_pixel (v);\n" -" u = u << OUT_SHIFT;\n" -" v = v << OUT_SHIFT;\n" -" if (SWAP_UV) {\n" -" unsigned short tmp = u;\n" -" u = v;\n" -" v = tmp;\n" -" }\n" -" write_chroma (dst1,\n" -" dst2, u, v, x_pos, y_pos, CHROMA_PSTRIDE, stride, MASK);\n" -" }\n" -"}\n" -"\n" -"}"; - -/* CUDA kernel source for from YUV to RGB conversion and scale */ -static const gchar templ_YUV_TO_RGB = -"extern \"C\"{\n" -"__constant__ float offset3 = {%s, %s, %s};\n" -"__constant__ float rcoeff3 = {%s, %s, %s};\n" -"__constant__ float gcoeff3 = {%s, %s, %s};\n" -"__constant__ float bcoeff3 = {%s, %s, %s};\n" -"\n" -"__constant__ float SCALE_H = %s;\n" -"__constant__ float SCALE_V = %s;\n" -"__constant__ float CHROMA_SCALE_H = %s;\n" -"__constant__ float CHROMA_SCALE_V = %s;\n" -"__constant__ int WIDTH = %d;\n" -"__constant__ int HEIGHT = %d;\n" -"__constant__ int CHROMA_WIDTH = %d;\n" -"__constant__ int CHROMA_HEIGHT = %d;\n" -"__constant__ int IN_DEPTH = %d;\n" -"__constant__ int OUT_DEPTH = %d;\n" -"__constant__ int PSTRIDE = %d;\n" -"__constant__ int CHROMA_PSTRIDE = %d;\n" -"__constant__ int IN_SHIFT = %d;\n" -"__constant__ int OUT_SHIFT = %d;\n" -"__constant__ int MASK = %d;\n" -"__constant__ int SWAP_UV = %d;\n" -"__constant__ int MAX_IN_VAL = %d;\n" -"__constant__ int R_IDX = %d;\n" -"__constant__ int G_IDX = %d;\n" -"__constant__ int B_IDX = %d;\n" -"__constant__ int A_IDX = %d;\n" -"__constant__ int X_IDX = %d;\n" -"\n" -"__device__ unsigned short\n" -"do_scale_pixel (unsigned short val) \n" -"{\n" -" unsigned int diff;\n" -" if (OUT_DEPTH > IN_DEPTH) {\n" -" diff = OUT_DEPTH - IN_DEPTH;\n" -" return (val << diff) | (val >> (IN_DEPTH - diff));\n" -" } else if (IN_DEPTH > OUT_DEPTH) {\n" -" return val >> (IN_DEPTH - OUT_DEPTH);\n" -" }\n" -" return val;\n" -"}\n" -"\n" -"__device__ float\n" -"dot(float3 val, float *coeff)\n" -"{\n" -" return val.x * coeff0 + val.y * coeff1 + val.z * coeff2;\n" -"}\n" -"\n" -"__device__ uint3\n" -"yuv_to_rgb (unsigned short y, unsigned short u, unsigned short v, unsigned int max_val)\n" -"{\n" -" float3 yuv = make_float3 (y, u, v);\n" -" uint3 rgb;\n" -" rgb.x = max ((unsigned int)(dot (yuv, rcoeff) + offset0), 0);\n" -" rgb.y = max ((unsigned int)(dot (yuv, gcoeff) + offset1), 0);\n" -" rgb.z = max ((unsigned int)(dot (yuv, bcoeff) + offset2), 0);\n" -" rgb.x = min (rgb.x, max_val);\n" -" rgb.y = min (rgb.y, max_val);\n" -" rgb.z = min (rgb.z, max_val);\n" -" return rgb;\n" -"}\n" -"\n" -/* __device__ ushort2 - * read_chroma (cudaTextureObject_t tex1, cudaTextureObject_t tex2, float x, float y); - */ -"%s\n" -"\n" -"__global__ void\n" -GST_CUDA_KERNEL_FUNC -"(cudaTextureObject_t tex0, cudaTextureObject_t tex1, cudaTextureObject_t tex2,\n" -" unsigned char *dstRGB, int stride)\n" -"{\n" -" int x_pos = blockIdx.x * blockDim.x + threadIdx.x;\n" -" int y_pos = blockIdx.y * blockDim.y + threadIdx.y;\n" -" if (x_pos < WIDTH && y_pos < HEIGHT) {\n" -" float src_xpos = SCALE_H * x_pos;\n" -" float src_ypos = SCALE_V * y_pos;\n" -" unsigned short y = tex2D<unsigned short>(tex0, src_xpos, src_ypos);\n" -" ushort2 uv;\n" -" unsigned short u, v;\n" -" uint3 rgb;\n" -" unsigned int clip_max = MAX_IN_VAL;\n" -" src_xpos = CHROMA_SCALE_H * x_pos;\n" -" src_ypos = CHROMA_SCALE_V * y_pos;\n" -" uv = read_chroma (tex1, tex2, src_xpos, src_ypos);\n" -" u = uv.x;\n" -" v = uv.y;\n" -" y = y >> IN_SHIFT;\n" -" u = u >> IN_SHIFT;\n" -" v = v >> IN_SHIFT;\n" -" if (SWAP_UV) {\n" -" unsigned short tmp = u;\n" -" u = v;\n" -" v = tmp;\n" -" }\n" - /* conversion matrix is scaled to higher bitdepth between in/out formats */ -" if (OUT_DEPTH > IN_DEPTH) {\n" -" y = do_scale_pixel (y);\n" -" u = do_scale_pixel (u);\n" -" v = do_scale_pixel (v);\n" -" clip_max = MASK;\n" -" }" -" rgb = yuv_to_rgb (y, u, v, clip_max);\n" -" if (OUT_DEPTH < IN_DEPTH) {\n" -" rgb.x = do_scale_pixel (rgb.x);\n" -" rgb.y = do_scale_pixel (rgb.y);\n" -" rgb.z = do_scale_pixel (rgb.z);\n" -" }" -" if (OUT_DEPTH > 8) {\n" -" unsigned int packed_rgb = 0;\n" - /* A is always MSB, we support only little endian system */ -" packed_rgb = 0xc000 << 16;\n" -" packed_rgb |= (rgb.x << (30 - (R_IDX * 10)));\n" -" packed_rgb |= (rgb.y << (30 - (G_IDX * 10)));\n" -" packed_rgb |= (rgb.z << (30 - (B_IDX * 10)));\n" -" *(unsigned int *)&dstRGBx_pos * PSTRIDE + y_pos * stride = packed_rgb;\n" -" } else {\n" -" dstRGBx_pos * PSTRIDE + R_IDX + y_pos * stride = (unsigned char) rgb.x;\n" -" dstRGBx_pos * PSTRIDE + G_IDX + y_pos * stride = (unsigned char) rgb.y;\n" -" dstRGBx_pos * PSTRIDE + B_IDX + y_pos * stride = (unsigned char) rgb.z;\n" -" if (A_IDX >= 0 || X_IDX >= 0)\n" -" dstRGBx_pos * PSTRIDE + A_IDX + y_pos * stride = 0xff;\n" -" }\n" -" }\n" -"}\n" -"\n" -"}"; - -/** - * GST_CUDA_KERNEL_FUNC_TO_ARGB: - * @srcRGB: a CUDA global memory containing a RGB image - * @dstRGB: a CUDA global memory to store unpacked ARGB image - * @width: the width of @srcRGB and @dstRGB - * @height: the height of @srcRGB and @dstRGB - * @src_stride: the stride of @srcRGB - * @src_pstride: the pixel stride of @srcRGB - * @dst_stride: the stride of @dstRGB - * @r_idx: the index of red component of @srcRGB - * @g_idx: the index of green component of @srcRGB - * @b_idx: the index of blue component of @srcRGB - * @a_idx: the index of alpha component of @srcRGB - * - * Unpack a RGB image from @srcRGB and write the unpacked data into @dstRGB - */ -static const gchar unpack_to_ARGB = -"__global__ void\n" -GST_CUDA_KERNEL_FUNC_TO_ARGB -"(unsigned char *srcRGB, unsigned char *dstRGB, int width, int height,\n" -" int src_stride, int src_pstride, int dst_stride,\n" -" int r_idx, int g_idx, int b_idx, int a_idx)\n" -"{\n" -" int x_pos = blockIdx.x * blockDim.x + threadIdx.x;\n" -" int y_pos = blockIdx.y * blockDim.y + threadIdx.y;\n" -" if (x_pos < width && y_pos < height) {\n" -" if (a_idx >= 0) {\n" -" dstRGBx_pos * 4 + y_pos * dst_stride =\n" -" srcRGBx_pos * src_pstride + a_idx + y_pos * src_stride;\n" -" } else {\n" -" dstRGBx_pos * 4 + y_pos * dst_stride = 0xff;\n" -" }\n" -" dstRGBx_pos * 4 + 1 + y_pos * dst_stride =\n" -" srcRGBx_pos * src_pstride + r_idx + y_pos * src_stride;\n" -" dstRGBx_pos * 4 + 2 + y_pos * dst_stride =\n" -" srcRGBx_pos * src_pstride + g_idx + y_pos * src_stride;\n" -" dstRGBx_pos * 4 + 3 + y_pos * dst_stride =\n" -" srcRGBx_pos * src_pstride + b_idx + y_pos * src_stride;\n" -" }\n" -"}\n"; - -/** - * GST_CUDA_KERNEL_FUNC_TO_ARGB: - * @srcRGB: a CUDA global memory containing a RGB image - * @dstRGB: a CUDA global memory to store unpacked ARGB64 image - * @width: the width of @srcRGB and @dstRGB - * @height: the height of @srcRGB and @dstRGB - * @src_stride: the stride of @srcRGB - * @src_pstride: the pixel stride of @srcRGB - * @dst_stride: the stride of @dstRGB - * @r_idx: the index of red component of @srcRGB - * @g_idx: the index of green component of @srcRGB - * @b_idx: the index of blue component of @srcRGB - * @a_idx: the index of alpha component of @srcRGB - * - * Unpack a RGB image from @srcRGB and write the unpacked data into @dstRGB - */ -static const gchar unpack_to_ARGB64 = -"__global__ void\n" -GST_CUDA_KERNEL_FUNC_TO_ARGB -"(unsigned char *srcRGB, unsigned char *dstRGB, int width, int height,\n" -" int src_stride, int src_pstride, int dst_stride,\n" -" int r_idx, int g_idx, int b_idx, int a_idx)\n" -"{\n" -" int x_pos = blockIdx.x * blockDim.x + threadIdx.x;\n" -" int y_pos = blockIdx.y * blockDim.y + threadIdx.y;\n" -" if (x_pos < width && y_pos < height) {\n" -" unsigned short a, r, g, b;\n" -" unsigned int read_val;\n" -" read_val = *(unsigned int *)&srcRGBx_pos * src_pstride + y_pos * src_stride;\n" -" a = (read_val >> 30) & 0x03;\n" -" a = (a << 14) | (a << 12) | (a << 10) | (a << 8) | (a << 6) | (a << 4) | (a << 2) | (a << 0);\n" -" r = ((read_val >> (30 - (r_idx * 10))) & 0x3ff);\n" -" r = (r << 6) | (r >> 4);\n" -" g = ((read_val >> (30 - (g_idx * 10))) & 0x3ff);\n" -" g = (g << 6) | (g >> 4);\n" -" b = ((read_val >> (30 - (b_idx * 10))) & 0x3ff);\n" -" b = (b << 6) | (b >> 4);\n" -" *(unsigned short *)&dstRGBx_pos * 8 + y_pos * dst_stride = 0xffff;\n" -" *(unsigned short *)&dstRGBx_pos * 8 + 2 + y_pos * dst_stride = r;\n" -" *(unsigned short *)&dstRGBx_pos * 8 + 4 + y_pos * dst_stride = g;\n" -" *(unsigned short *)&dstRGBx_pos * 8 + 6 + y_pos * dst_stride = b;\n" -" }\n" -"}\n"; - -/* CUDA kernel source for from RGB to YUV conversion and scale */ -static const gchar templ_RGB_TO_YUV = -"extern \"C\"{\n" -"__constant__ float offset3 = {%s, %s, %s};\n" -"__constant__ float ycoeff3 = {%s, %s, %s};\n" -"__constant__ float ucoeff3 = {%s, %s, %s};\n" -"__constant__ float vcoeff3 = {%s, %s, %s};\n" -"\n" -"__constant__ float SCALE_H = %s;\n" -"__constant__ float SCALE_V = %s;\n" -"__constant__ float CHROMA_SCALE_H = %s;\n" -"__constant__ float CHROMA_SCALE_V = %s;\n" -"__constant__ int WIDTH = %d;\n" -"__constant__ int HEIGHT = %d;\n" -"__constant__ int CHROMA_WIDTH = %d;\n" -"__constant__ int CHROMA_HEIGHT = %d;\n" -"__constant__ int IN_DEPTH = %d;\n" -"__constant__ int OUT_DEPTH = %d;\n" -"__constant__ int PSTRIDE = %d;\n" -"__constant__ int CHROMA_PSTRIDE = %d;\n" -"__constant__ int IN_SHIFT = %d;\n" -"__constant__ int OUT_SHIFT = %d;\n" -"__constant__ int MASK = %d;\n" -"__constant__ int SWAP_UV = %d;\n" -"\n" -"__device__ unsigned short\n" -"do_scale_pixel (unsigned short val) \n" -"{\n" -" unsigned int diff;\n" -" if (OUT_DEPTH > IN_DEPTH) {\n" -" diff = OUT_DEPTH - IN_DEPTH;\n" -" return (val << diff) | (val >> (IN_DEPTH - diff));\n" -" } else if (IN_DEPTH > OUT_DEPTH) {\n" -" return val >> (IN_DEPTH - OUT_DEPTH);\n" -" }\n" -" return val;\n" -"}\n" -"\n" -"__device__ float\n" -"dot(float3 val, float *coeff)\n" -"{\n" -" return val.x * coeff0 + val.y * coeff1 + val.z * coeff2;\n" -"}\n" -"\n" -"__device__ uint3\n" -"rgb_to_yuv (unsigned short r, unsigned short g, unsigned short b,\n" -" unsigned int max_val)\n" -"{\n" -" float3 rgb = make_float3 (r, g, b);\n" -" uint3 yuv;\n" -" yuv.x = max ((unsigned int)(dot (rgb, ycoeff) + offset0), 0);\n" -" yuv.y = max ((unsigned int)(dot (rgb, ucoeff) + offset1), 0);\n" -" yuv.z = max ((unsigned int)(dot (rgb, vcoeff) + offset2), 0);\n" -" yuv.x = min (yuv.x, max_val);\n" -" yuv.y = min (yuv.y, max_val);\n" -" yuv.z = min (yuv.z, max_val);\n" -" return yuv;\n" -"}\n" -"\n" -/* __global__ void - * GST_CUDA_KERNEL_FUNC_TO_ARGB - */ -"%s\n" -"\n" -/* __device__ ushort2 - * read_chroma (cudaTextureObject_t tex1, cudaTextureObject_t tex2, float x, float y); - */ -"%s\n" -"\n" -/* __device__ void - * write_chroma (unsigned char *dst1, unsigned char *dst2, unsigned short u, - * unsigned short v, int x, int y, int pstride, int stride, int mask); - */ -"%s\n" -"\n" -"__global__ void\n" -GST_CUDA_KERNEL_FUNC_TO_Y444 -"(cudaTextureObject_t srcRGB, unsigned char *dstY, int y_stride,\n" -" unsigned char *dstU, int u_stride, unsigned char *dstV, int v_stride,\n" -" int width, int height, int dst_pstride, int in_depth)\n" -"{\n" -" int x_pos = blockIdx.x * blockDim.x + threadIdx.x;\n" -" int y_pos = blockIdx.y * blockDim.y + threadIdx.y;\n" -" if (x_pos < width && y_pos < height) {\n" -" ushort4 argb = tex2D<ushort4>(srcRGB, x_pos, y_pos);\n" -" uint3 yuv;\n" -" yuv = rgb_to_yuv (argb.y, argb.z, argb.w, (1 << in_depth) - 1);\n" -" if (in_depth > 8) {\n" -" *(unsigned short *)&dstYx_pos * dst_pstride + y_pos * y_stride = yuv.x;\n" -" *(unsigned short *)&dstUx_pos * dst_pstride + y_pos * u_stride = yuv.y;\n" -" *(unsigned short *)&dstVx_pos * dst_pstride + y_pos * v_stride = yuv.z;\n" -" } else {\n" -" dstYx_pos * dst_pstride + y_pos * y_stride = yuv.x;\n" -" dstUx_pos * dst_pstride + y_pos * u_stride = yuv.y;\n" -" dstVx_pos * dst_pstride + y_pos * v_stride = yuv.z;\n" -" }\n" -" }\n" -"}\n" -"\n" -"__global__ void\n" -GST_CUDA_KERNEL_FUNC_Y444_TO_YUV -"(cudaTextureObject_t tex0, cudaTextureObject_t tex1, cudaTextureObject_t tex2,\n" -" unsigned char *dst0, unsigned char *dst1, unsigned char *dst2,\n" -" int stride)\n" -"{\n" -" int x_pos = blockIdx.x * blockDim.x + threadIdx.x;\n" -" int y_pos = blockIdx.y * blockDim.y + threadIdx.y;\n" -" if (x_pos < WIDTH && y_pos < HEIGHT) {\n" -" float src_xpos = SCALE_H * x_pos;\n" -" float src_ypos = SCALE_V * y_pos;\n" -" unsigned short y = tex2D<unsigned short>(tex0, src_xpos, src_ypos);\n" -" y = y >> IN_SHIFT;\n" -" y = do_scale_pixel (y);\n" -" y = y << OUT_SHIFT;\n" -" if (OUT_DEPTH > 8) {\n" -" *(unsigned short *)&dst0x_pos * PSTRIDE + y_pos * stride = (y & MASK);\n" -" } else {\n" -" dst0x_pos * PSTRIDE + y_pos * stride = y;\n" -" }\n" -" }\n" -" if (x_pos < CHROMA_WIDTH && y_pos < CHROMA_HEIGHT) {\n" -" float src_xpos = CHROMA_SCALE_H * x_pos;\n" -" float src_ypos = CHROMA_SCALE_V * y_pos;\n" -" unsigned short u, v;\n" -" ushort2 uv;\n" -" uv = read_chroma (tex1, tex2, src_xpos, src_ypos);\n" -" u = uv.x;\n" -" v = uv.y;\n" -" u = u >> IN_SHIFT;\n" -" v = v >> IN_SHIFT;\n" -" u = do_scale_pixel (u);\n" -" v = do_scale_pixel (v);\n" -" u = u << OUT_SHIFT;\n" -" v = v << OUT_SHIFT;\n" -" if (SWAP_UV) {\n" -" unsigned short tmp = u;\n" -" u = v;\n" -" v = tmp;\n" -" }\n" -" write_chroma (dst1,\n" -" dst2, u, v, x_pos, y_pos, CHROMA_PSTRIDE, stride, MASK);\n" -" }\n" -"}\n" -"\n" -"}"; - -/* CUDA kernel source for from RGB to RGB conversion and scale */ -static const gchar templ_RGB_to_RGB = -"extern \"C\"{\n" -"__constant__ float SCALE_H = %s;\n" -"__constant__ float SCALE_V = %s;\n" -"__constant__ int WIDTH = %d;\n" -"__constant__ int HEIGHT = %d;\n" -"__constant__ int IN_DEPTH = %d;\n" -"__constant__ int OUT_DEPTH = %d;\n" -"__constant__ int PSTRIDE = %d;\n" -"__constant__ int R_IDX = %d;\n" -"__constant__ int G_IDX = %d;\n" -"__constant__ int B_IDX = %d;\n" -"__constant__ int A_IDX = %d;\n" -"__constant__ int X_IDX = %d;\n" -"\n" -"__device__ unsigned short\n" -"do_scale_pixel (unsigned short val) \n" -"{\n" -" unsigned int diff;\n" -" if (OUT_DEPTH > IN_DEPTH) {\n" -" diff = OUT_DEPTH - IN_DEPTH;\n" -" return (val << diff) | (val >> (IN_DEPTH - diff));\n" -" } else if (IN_DEPTH > OUT_DEPTH) {\n" -" return val >> (IN_DEPTH - OUT_DEPTH);\n" -" }\n" -" return val;\n" -"}\n" -"\n" -/* __global__ void - * GST_CUDA_KERNEL_FUNC_TO_ARGB - */ -"%s\n" -"\n" -/* convert ARGB or ARGB64 to other RGB formats with scale */ -"__global__ void\n" -GST_CUDA_KERNEL_FUNC_SCALE_RGB -"(cudaTextureObject_t srcRGB, unsigned char *dstRGB, int dst_stride)\n" -"{\n" -" int x_pos = blockIdx.x * blockDim.x + threadIdx.x;\n" -" int y_pos = blockIdx.y * blockDim.y + threadIdx.y;\n" -" if (x_pos < WIDTH && y_pos < HEIGHT) {\n" -" float src_xpos = SCALE_H * x_pos;\n" -" float src_ypos = SCALE_V * y_pos;\n" -" ushort4 argb = tex2D<ushort4>(srcRGB, src_xpos, src_ypos);\n" -" argb.x = do_scale_pixel(argb.x);\n" -" argb.y = do_scale_pixel(argb.y);\n" -" argb.z = do_scale_pixel(argb.z);\n" -" argb.w = do_scale_pixel(argb.w);\n" - /* FIXME: RGB10A2_LE or BGR10A2_LE only */ -" if (OUT_DEPTH > 8) {\n" -" unsigned int packed_rgb = 0;\n" -" unsigned int a, r, g, b;" -" a = (argb.x >> 8) & 0x3;\n" -" r = argb.y & 0x3ff;\n" -" g = argb.z & 0x3ff;\n" -" b = argb.w & 0x3ff;\n" - /* A is always MSB, we support only little endian system */ -" packed_rgb = a << 30;\n" -" packed_rgb |= (r << (30 - (R_IDX * 10)));\n" -" packed_rgb |= (g << (30 - (G_IDX * 10)));\n" -" packed_rgb |= (b << (30 - (B_IDX * 10)));\n" -" *(unsigned int *)&dstRGBx_pos * 4 + y_pos * dst_stride = packed_rgb;\n" -" } else {\n" -" if (A_IDX >= 0) {\n" -" argb.x = do_scale_pixel(argb.x);\n" -" dstRGBx_pos * PSTRIDE + A_IDX + y_pos * dst_stride = argb.x;\n" -" } else if (X_IDX >= 0) {\n" -" dstRGBx_pos * PSTRIDE + X_IDX + y_pos * dst_stride = 0xff;\n" -" }\n" -" dstRGBx_pos * PSTRIDE + R_IDX + y_pos * dst_stride = argb.y;\n" -" dstRGBx_pos * PSTRIDE + G_IDX + y_pos * dst_stride = argb.z;\n" -" dstRGBx_pos * PSTRIDE + B_IDX + y_pos * dst_stride = argb.w;\n" -" }\n" -" }\n" -"}\n" -"\n" -"}"; -/* *INDENT-ON* */ - -typedef struct -{ - gint R; - gint G; - gint B; - gint A; - gint X; -} GstCudaRGBOrder; - -typedef struct -{ - CUdeviceptr device_ptr; - gsize cuda_stride; -} GstCudaStageBuffer; - -#define CONVERTER_MAX_NUM_FUNC 4 - -struct _GstCudaConverter -{ - GstVideoInfo in_info; - GstVideoInfo out_info; - gboolean keep_size; - - gint texture_alignment; - - GstCudaContext *cuda_ctx; - CUmodule cuda_module; - CUfunction kernel_funcCONVERTER_MAX_NUM_FUNC; - const gchar *func_namesCONVERTER_MAX_NUM_FUNC; - gchar *kernel_source; - gchar *ptx; - GstCudaStageBuffer fallback_bufferGST_VIDEO_MAX_PLANES; - - gboolean (*convert) (GstCudaConverter * convert, const GstCudaMemory * src, - GstVideoInfo * in_info, GstCudaMemory * dst, GstVideoInfo * out_info, - CUstream cuda_stream); - - const CUdeviceptr src; - GstVideoInfo *cur_in_info; - - CUdeviceptr dest; - GstVideoInfo *cur_out_info; - - /* rgb to {rgb, yuv} only */ - GstCudaRGBOrder in_rgb_order; - GstCudaStageBuffer unpack_surface; - GstCudaStageBuffer y444_surfaceGST_VIDEO_MAX_PLANES; -}; - -#define LOAD_CUDA_FUNC(module,func,name) G_STMT_START { \ - if (!gst_cuda_result (CuModuleGetFunction (&(func), (module), name))) { \ - GST_ERROR ("failed to get %s function", (name)); \ - goto error; \ - } \ -} G_STMT_END - -/** - * gst_cuda_converter_new: - * @in_info: a #GstVideoInfo - * @out_info: a #GstVideoInfo - * @cuda_ctx: (transfer none): a #GstCudaContext - * - * Create a new converter object to convert between @in_info and @out_info - * with @config. - * - * Returns: a #GstCudaConverter or %NULL if conversion is not possible. - */ -GstCudaConverter * -gst_cuda_converter_new (GstVideoInfo * in_info, GstVideoInfo * out_info, - GstCudaContext * cuda_ctx) -{ - GstCudaConverter *convert; - gint i; - - g_return_val_if_fail (in_info != NULL, NULL); - g_return_val_if_fail (out_info != NULL, NULL); - g_return_val_if_fail (cuda_ctx != NULL, NULL); - /* we won't ever do framerate conversion */ - g_return_val_if_fail (in_info->fps_n == out_info->fps_n, NULL); - g_return_val_if_fail (in_info->fps_d == out_info->fps_d, NULL); - /* we won't ever do deinterlace */ - g_return_val_if_fail (in_info->interlace_mode == out_info->interlace_mode, - NULL); - - convert = g_new0 (GstCudaConverter, 1); - - convert->in_info = *in_info; - convert->out_info = *out_info; - - /* FIXME: should return kernel source */ - if (!gst_cuda_context_push (cuda_ctx)) { - GST_ERROR ("cannot push context"); - goto error; - } - - if (!cuda_converter_lookup_path (convert)) - goto error; - - convert->ptx = gst_cuda_nvrtc_compile (convert->kernel_source); - if (!convert->ptx) { - GST_ERROR ("no PTX data to load"); - goto error; - } - - GST_TRACE ("compiled convert ptx \n%s", convert->ptx); - - if (!gst_cuda_result (CuModuleLoadData (&convert->cuda_module, convert->ptx))) { - gst_cuda_context_pop (NULL); - GST_ERROR ("failed to load cuda module data"); - - goto error; - } - - for (i = 0; i < CONVERTER_MAX_NUM_FUNC; i++) { - if (!convert->func_namesi) - break; - - LOAD_CUDA_FUNC (convert->cuda_module, convert->kernel_funci, - convert->func_namesi); - GST_DEBUG ("kernel function \"%s\" loaded", convert->func_namesi); - } - - gst_cuda_context_pop (NULL); - convert->cuda_ctx = gst_object_ref (cuda_ctx); - convert->texture_alignment = - gst_cuda_context_get_texture_alignment (cuda_ctx); - - g_free (convert->kernel_source); - g_free (convert->ptx); - convert->kernel_source = NULL; - convert->ptx = NULL; - - return convert; - -error: - gst_cuda_context_pop (NULL); - gst_cuda_converter_free (convert); - - return NULL; -} - -/** - * gst_video_converter_free: - * @convert: a #GstCudaConverter - * - * Free @convert - */ -void -gst_cuda_converter_free (GstCudaConverter * convert) -{ - g_return_if_fail (convert != NULL); - - if (convert->cuda_ctx) { - if (gst_cuda_context_push (convert->cuda_ctx)) { - gint i; - - if (convert->cuda_module) { - gst_cuda_result (CuModuleUnload (convert->cuda_module)); - } - - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - if (convert->fallback_bufferi.device_ptr) - gst_cuda_result (CuMemFree (convert->fallback_bufferi.device_ptr)); - if (convert->y444_surfacei.device_ptr) - gst_cuda_result (CuMemFree (convert->y444_surfacei.device_ptr)); - } - - if (convert->unpack_surface.device_ptr) - gst_cuda_result (CuMemFree (convert->unpack_surface.device_ptr)); - - gst_cuda_context_pop (NULL); - } - - gst_object_unref (convert->cuda_ctx); - } - - g_free (convert->kernel_source); - g_free (convert->ptx); - g_free (convert); -} - -/** - * gst_cuda_converter_frame: - * @convert: a #GstCudaConverter - * @src: a #GstCudaMemory - * @in_info: a #GstVideoInfo representing @src - * @dst: a #GstCudaMemory - * @out_info: a #GstVideoInfo representing @dst - * @cuda_stream: a #CUstream - * - * Convert the pixels of @src into @dest using @convert. - * Called without gst_cuda_context_push() and gst_cuda_context_pop() by caller - */ -gboolean -gst_cuda_converter_frame (GstCudaConverter * convert, const GstCudaMemory * src, - GstVideoInfo * in_info, GstCudaMemory * dst, GstVideoInfo * out_info, - CUstream cuda_stream) -{ - gboolean ret; - - g_return_val_if_fail (convert, FALSE); - g_return_val_if_fail (src, FALSE); - g_return_val_if_fail (in_info, FALSE); - g_return_val_if_fail (dst, FALSE); - g_return_val_if_fail (out_info, FALSE); - - gst_cuda_context_push (convert->cuda_ctx); - - ret = gst_cuda_converter_frame_unlocked (convert, - src, in_info, dst, out_info, cuda_stream); - - gst_cuda_context_pop (NULL); - - return ret; -} - -/** - * gst_cuda_converter_frame_unlocked: - * @convert: a #GstCudaConverter - * @src: a #GstCudaMemory - * @in_info: a #GstVideoInfo representing @src - * @dst: a #GstCudaMemory - * @out_info: a #GstVideoInfo representing @dest - * @cuda_stream: a #CUstream - * - * Convert the pixels of @src into @dest using @convert. - * Caller should call this method after gst_cuda_context_push() - */ -gboolean -gst_cuda_converter_frame_unlocked (GstCudaConverter * convert, - const GstCudaMemory * src, GstVideoInfo * in_info, GstCudaMemory * dst, - GstVideoInfo * out_info, CUstream cuda_stream) -{ - g_return_val_if_fail (convert, FALSE); - g_return_val_if_fail (src, FALSE); - g_return_val_if_fail (in_info, FALSE); - g_return_val_if_fail (dst, FALSE); - g_return_val_if_fail (out_info, FALSE); - - return convert->convert (convert, src, in_info, dst, out_info, cuda_stream); -} - -/* allocate fallback memory for texture alignment requirement */ -static gboolean -convert_ensure_fallback_memory (GstCudaConverter * convert, - GstVideoInfo * info, guint plane) -{ - CUresult ret; - guint element_size = 8; - - if (convert->fallback_bufferplane.device_ptr) - return TRUE; - - if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) > 8) - element_size = 16; - - ret = CuMemAllocPitch (&convert->fallback_bufferplane.device_ptr, - &convert->fallback_bufferplane.cuda_stride, - GST_VIDEO_INFO_COMP_WIDTH (info, plane) * - GST_VIDEO_INFO_COMP_PSTRIDE (info, plane), - GST_VIDEO_INFO_COMP_HEIGHT (info, plane), element_size); - - if (!gst_cuda_result (ret)) { - GST_ERROR ("failed to allocated fallback memory"); - return FALSE; - } - - return TRUE; -} - -/* create a 2D CUDA texture without alignment check */ -static CUtexObject -convert_create_texture_unchecked (const CUdeviceptr src, gint width, - gint height, gint channels, gint stride, CUarray_format format, - CUfilter_mode mode, CUstream cuda_stream) -{ - CUDA_TEXTURE_DESC texture_desc; - CUDA_RESOURCE_DESC resource_desc; - CUtexObject texture = 0; - CUresult cuda_ret; - - memset (&texture_desc, 0, sizeof (CUDA_TEXTURE_DESC)); - memset (&resource_desc, 0, sizeof (CUDA_RESOURCE_DESC)); - - resource_desc.resType = CU_RESOURCE_TYPE_PITCH2D; - resource_desc.res.pitch2D.format = format; - resource_desc.res.pitch2D.numChannels = channels; - resource_desc.res.pitch2D.width = width; - resource_desc.res.pitch2D.height = height; - resource_desc.res.pitch2D.pitchInBytes = stride; - resource_desc.res.pitch2D.devPtr = src; - - texture_desc.filterMode = mode; - texture_desc.flags = CU_TRSF_READ_AS_INTEGER; - - gst_cuda_result (CuStreamSynchronize (cuda_stream)); - cuda_ret = CuTexObjectCreate (&texture, &resource_desc, &texture_desc, NULL); - - if (!gst_cuda_result (cuda_ret)) { - GST_ERROR ("couldn't create texture"); - - return 0; - } - - return texture; -} - -static CUtexObject -convert_create_texture (GstCudaConverter * convert, const GstCudaMemory * src, - GstVideoInfo * info, guint plane, CUstream cuda_stream) -{ - CUarray_format format = CU_AD_FORMAT_UNSIGNED_INT8; - guint channels = 1; - CUdeviceptr src_ptr; - gsize stride; - CUresult cuda_ret; - CUfilter_mode mode; - - if (GST_VIDEO_INFO_COMP_DEPTH (info, plane) > 8) - format = CU_AD_FORMAT_UNSIGNED_INT16; - - /* FIXME: more graceful method ? */ - if (plane != 0 && - GST_VIDEO_INFO_N_PLANES (info) != GST_VIDEO_INFO_N_COMPONENTS (info)) { - channels = 2; - } - - src_ptr = src->data + src->offsetplane; - stride = src->stride; - - if (convert->texture_alignment && (src_ptr % convert->texture_alignment)) { - CUDA_MEMCPY2D copy_params = { 0, }; - - if (!convert_ensure_fallback_memory (convert, info, plane)) - return 0; - - GST_LOG ("device memory was not aligned, copy to fallback memory"); - - copy_params.srcMemoryType = CU_MEMORYTYPE_DEVICE; - copy_params.srcPitch = stride; - copy_params.srcDevice = (CUdeviceptr) src_ptr; - - copy_params.dstMemoryType = CU_MEMORYTYPE_DEVICE; - copy_params.dstPitch = convert->fallback_bufferplane.cuda_stride; - copy_params.dstDevice = convert->fallback_bufferplane.device_ptr; - copy_params.WidthInBytes = GST_VIDEO_INFO_COMP_WIDTH (info, plane) - * GST_VIDEO_INFO_COMP_PSTRIDE (info, plane); - copy_params.Height = GST_VIDEO_INFO_COMP_HEIGHT (info, plane); - - cuda_ret = CuMemcpy2DAsync (©_params, cuda_stream); - if (!gst_cuda_result (cuda_ret)) { - GST_ERROR ("failed to copy to fallback buffer"); - return 0; - } - - src_ptr = convert->fallback_bufferplane.device_ptr; - stride = convert->fallback_bufferplane.cuda_stride; - } - - /* Use h/w linear interpolation only when resize is required. - * Otherwise the image might be blurred */ - if (convert->keep_size) - mode = CU_TR_FILTER_MODE_POINT; - else - mode = CU_TR_FILTER_MODE_LINEAR; - - return convert_create_texture_unchecked (src_ptr, - GST_VIDEO_INFO_COMP_WIDTH (info, plane), - GST_VIDEO_INFO_COMP_HEIGHT (info, plane), channels, stride, format, mode, - cuda_stream); -} - -/* main conversion function for YUV to YUV conversion */ -static gboolean -convert_YUV_TO_YUV (GstCudaConverter * convert, - const GstCudaMemory * src, GstVideoInfo * in_info, GstCudaMemory * dst, - GstVideoInfo * out_info, CUstream cuda_stream) -{ - CUtexObject textureGST_VIDEO_MAX_PLANES = { 0, }; - CUresult cuda_ret; - gboolean ret = FALSE; - CUdeviceptr dst_ptrGST_VIDEO_MAX_PLANES = { 0, }; - gint dst_stride; - gint width, height; - gint i; - - gpointer kernel_args = { &texture0, &texture1, &texture2, - &dst_ptr0, &dst_ptr1, &dst_ptr2, &dst_stride - }; - - /* conversion step - * STEP 1: create CUtexObject per plane - * STEP 2: call YUV to YUV conversion kernel function. - * resize, uv reordering and bitdepth conversion will be performed in - * the CUDA kernel function - */ - - /* map CUDA device memory to CUDA texture object */ - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (in_info); i++) { - texturei = convert_create_texture (convert, src, in_info, i, cuda_stream); - if (!texturei) { - GST_ERROR ("couldn't create texture for %d th plane", i); - goto done; - } - } - - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (out_info); i++) - dst_ptri = dst->data + dst->offseti; - - dst_stride = dst->stride; - - width = GST_VIDEO_INFO_WIDTH (out_info); - height = GST_VIDEO_INFO_HEIGHT (out_info); - - cuda_ret = - CuLaunchKernel (convert->kernel_func0, DIV_UP (width, CUDA_BLOCK_X), - DIV_UP (height, CUDA_BLOCK_Y), 1, CUDA_BLOCK_X, CUDA_BLOCK_Y, 1, 0, - cuda_stream, kernel_args, NULL); - - if (!gst_cuda_result (cuda_ret)) { - GST_ERROR ("could not rescale plane"); - goto done; - } - - ret = TRUE; - gst_cuda_result (CuStreamSynchronize (cuda_stream)); - -done: - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (in_info); i++) { - if (texturei) - gst_cuda_result (CuTexObjectDestroy (texturei)); - } - - return ret; -} - -/* main conversion function for YUV to RGB conversion */ -static gboolean -convert_YUV_TO_RGB (GstCudaConverter * convert, - const GstCudaMemory * src, GstVideoInfo * in_info, GstCudaMemory * dst, - GstVideoInfo * out_info, CUstream cuda_stream) -{ - CUtexObject textureGST_VIDEO_MAX_PLANES = { 0, }; - CUresult cuda_ret; - gboolean ret = FALSE; - CUdeviceptr dstRGB = 0; - gint dst_stride; - gint width, height; - gint i; - - gpointer kernel_args = { &texture0, &texture1, &texture2, - &dstRGB, &dst_stride - }; - - /* conversion step - * STEP 1: create CUtexObject per plane - * STEP 2: call YUV to RGB conversion kernel function. - * resizing, argb ordering and bitdepth conversion will be performed in - * the CUDA kernel function - */ - - /* map CUDA device memory to CUDA texture object */ - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (in_info); i++) { - texturei = convert_create_texture (convert, src, in_info, i, cuda_stream); - if (!texturei) { - GST_ERROR ("couldn't create texture for %d th plane", i); - goto done; - } - } - - dstRGB = dst->data; - dst_stride = dst->stride; - - width = GST_VIDEO_INFO_WIDTH (out_info); - height = GST_VIDEO_INFO_HEIGHT (out_info); - - cuda_ret = - CuLaunchKernel (convert->kernel_func0, DIV_UP (width, CUDA_BLOCK_X), - DIV_UP (height, CUDA_BLOCK_Y), 1, CUDA_BLOCK_X, CUDA_BLOCK_Y, 1, 0, - cuda_stream, kernel_args, NULL); - - if (!gst_cuda_result (cuda_ret)) { - GST_ERROR ("could not rescale plane"); - goto done; - } - - ret = TRUE; - gst_cuda_result (CuStreamSynchronize (cuda_stream)); - -done: - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (in_info); i++) { - if (texturei) - gst_cuda_result (CuTexObjectDestroy (texturei)); - } - - return ret; -} - -static gboolean -convert_UNPACK_RGB (GstCudaConverter * convert, CUfunction kernel_func, - CUstream cuda_stream, const GstCudaMemory * src, GstVideoInfo * in_info, - CUdeviceptr dst, gint dst_stride, GstCudaRGBOrder * rgb_order) -{ - CUdeviceptr srcRGB = 0; - gint width, height; - gint src_stride, src_pstride; - CUresult cuda_ret; - - gpointer unpack_kernel_args = { &srcRGB, &dst, - &width, &height, - &src_stride, &src_pstride, &dst_stride, - &convert->in_rgb_order.R, &convert->in_rgb_order.G, - &convert->in_rgb_order.B, &convert->in_rgb_order.A, - }; - - srcRGB = src->data; - src_stride = src->stride; - - width = GST_VIDEO_INFO_WIDTH (in_info); - height = GST_VIDEO_INFO_HEIGHT (in_info); - src_pstride = GST_VIDEO_INFO_COMP_PSTRIDE (in_info, 0); - - cuda_ret = - CuLaunchKernel (kernel_func, DIV_UP (width, CUDA_BLOCK_X), - DIV_UP (height, CUDA_BLOCK_Y), 1, CUDA_BLOCK_X, CUDA_BLOCK_Y, 1, 0, - cuda_stream, unpack_kernel_args, NULL); - - if (!gst_cuda_result (cuda_ret)) { - GST_ERROR ("could not unpack rgb"); - return FALSE; - } - - return TRUE; -} - -static gboolean -convert_TO_Y444 (GstCudaConverter * convert, CUfunction kernel_func, - CUstream cuda_stream, CUtexObject srcRGB, CUdeviceptr dstY, gint y_stride, - CUdeviceptr dstU, gint u_stride, CUdeviceptr dstV, gint v_stride, - gint width, gint height, gint pstride, gint bitdepth) -{ - CUresult cuda_ret; - - gpointer kernel_args = { &srcRGB, &dstY, &y_stride, &dstU, &u_stride, &dstV, - &v_stride, &width, &height, &pstride, &bitdepth, - }; - - cuda_ret = - CuLaunchKernel (kernel_func, DIV_UP (width, CUDA_BLOCK_X), - DIV_UP (height, CUDA_BLOCK_Y), 1, CUDA_BLOCK_X, CUDA_BLOCK_Y, 1, 0, - cuda_stream, kernel_args, NULL); - - if (!gst_cuda_result (cuda_ret)) { - GST_ERROR ("could not unpack rgb"); - return FALSE; - } - - return TRUE; -} - -/* main conversion function for RGB to YUV conversion */ -static gboolean -convert_RGB_TO_YUV (GstCudaConverter * convert, - const GstCudaMemory * src, GstVideoInfo * in_info, GstCudaMemory * dst, - GstVideoInfo * out_info, CUstream cuda_stream) -{ - CUtexObject texture = 0; - CUtexObject yuv_texture3 = { 0, }; - CUdeviceptr dst_ptrGST_VIDEO_MAX_PLANES = { 0, }; - CUresult cuda_ret; - gboolean ret = FALSE; - gint in_width, in_height; - gint out_width, out_height; - gint dst_stride; - CUarray_format format = CU_AD_FORMAT_UNSIGNED_INT8; - CUfilter_mode mode = CU_TR_FILTER_MODE_POINT; - gint pstride = 1; - gint bitdepth = 8; - gint i; - - gpointer kernel_args = { &yuv_texture0, &yuv_texture1, &yuv_texture2, - &dst_ptr0, &dst_ptr1, &dst_ptr2, &dst_stride - }; - - /* conversion step - * STEP 1: unpack src RGB into ARGB or ARGB64 format - * STEP 2: convert unpacked ARGB (or ARGB64) to Y444 (or Y444_16LE) - * STEP 3: convert Y444 (or Y444_16LE) to final YUV format. - * resizing, bitdepth conversion, uv reordering will be performed in - * the CUDA kernel function - */ - if (!convert_UNPACK_RGB (convert, convert->kernel_func0, cuda_stream, - src, in_info, convert->unpack_surface.device_ptr, - convert->unpack_surface.cuda_stride, &convert->in_rgb_order)) { - GST_ERROR ("could not unpack input rgb"); - - goto done; - } - - in_width = GST_VIDEO_INFO_WIDTH (in_info); - in_height = GST_VIDEO_INFO_HEIGHT (in_info); - - out_width = GST_VIDEO_INFO_WIDTH (out_info); - out_height = GST_VIDEO_INFO_HEIGHT (out_info); - dst_stride = dst->stride; - - if (GST_VIDEO_INFO_COMP_DEPTH (in_info, 0) > 8) { - pstride = 2; - bitdepth = 16; - format = CU_AD_FORMAT_UNSIGNED_INT16; - } - - texture = - convert_create_texture_unchecked (convert->unpack_surface.device_ptr, - in_width, in_height, 4, convert->unpack_surface.cuda_stride, format, - mode, cuda_stream); - - if (!texture) { - GST_ERROR ("could not create texture"); - goto done; - } - - if (!convert_TO_Y444 (convert, convert->kernel_func1, cuda_stream, texture, - convert->y444_surface0.device_ptr, - convert->y444_surface0.cuda_stride, - convert->y444_surface1.device_ptr, - convert->y444_surface1.cuda_stride, - convert->y444_surface2.device_ptr, - convert->y444_surface2.cuda_stride, in_width, in_height, pstride, - bitdepth)) { - GST_ERROR ("could not convert to Y444 or Y444_16LE"); - goto done; - } - - /* Use h/w linear interpolation only when resize is required. - * Otherwise the image might be blurred */ - if (convert->keep_size) - mode = CU_TR_FILTER_MODE_POINT; - else - mode = CU_TR_FILTER_MODE_LINEAR; - - for (i = 0; i < 3; i++) { - yuv_texturei = - convert_create_texture_unchecked (convert->y444_surfacei.device_ptr, - in_width, in_height, 1, convert->y444_surfacei.cuda_stride, format, - mode, cuda_stream); - - if (!yuv_texturei) { - GST_ERROR ("could not create %dth yuv texture", i); - goto done; - } - } - - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (out_info); i++) - dst_ptri = dst->data + dst->offseti; - - cuda_ret = - CuLaunchKernel (convert->kernel_func2, DIV_UP (out_width, CUDA_BLOCK_X), - DIV_UP (out_height, CUDA_BLOCK_Y), 1, CUDA_BLOCK_X, CUDA_BLOCK_Y, 1, 0, - cuda_stream, kernel_args, NULL); - - if (!gst_cuda_result (cuda_ret)) { - GST_ERROR ("could not rescale plane"); - goto done; - } - - ret = TRUE; - gst_cuda_result (CuStreamSynchronize (cuda_stream)); - -done: - if (texture) - gst_cuda_result (CuTexObjectDestroy (texture)); - for (i = 0; i < 3; i++) { - if (yuv_texturei) - gst_cuda_result (CuTexObjectDestroy (yuv_texturei)); - } - - return ret; -} - -/* main conversion function for RGB to RGB conversion */ -static gboolean -convert_RGB_TO_RGB (GstCudaConverter * convert, - const GstCudaMemory * src, GstVideoInfo * in_info, GstCudaMemory * dst, - GstVideoInfo * out_info, CUstream cuda_stream) -{ - CUtexObject texture = 0; - CUresult cuda_ret; - gboolean ret = FALSE; - CUdeviceptr dstRGB = 0; - gint in_width, in_height; - gint out_width, out_height; - gint dst_stride; - CUfilter_mode mode; - CUarray_format format = CU_AD_FORMAT_UNSIGNED_INT8; - - gpointer rescale_kernel_args = { &texture, &dstRGB, &dst_stride }; - - /* conversion step - * STEP 1: unpack src RGB into ARGB or ARGB64 format - * STEP 2: convert ARGB (or ARGB64) to final RGB format. - * resizing, bitdepth conversion, argb reordering will be performed in - * the CUDA kernel function - */ - - if (!convert_UNPACK_RGB (convert, convert->kernel_func0, cuda_stream, - src, in_info, convert->unpack_surface.device_ptr, - convert->unpack_surface.cuda_stride, &convert->in_rgb_order)) { - GST_ERROR ("could not unpack input rgb"); - - goto done; - } - - in_width = GST_VIDEO_INFO_WIDTH (in_info); - in_height = GST_VIDEO_INFO_HEIGHT (in_info); - - out_width = GST_VIDEO_INFO_WIDTH (out_info); - out_height = GST_VIDEO_INFO_HEIGHT (out_info); - - dstRGB = dst->data; - dst_stride = dst->stride; - - if (GST_VIDEO_INFO_COMP_DEPTH (in_info, 0) > 8) - format = CU_AD_FORMAT_UNSIGNED_INT16; - - /* Use h/w linear interpolation only when resize is required. - * Otherwise the image might be blurred */ - if (convert->keep_size) - mode = CU_TR_FILTER_MODE_POINT; - else - mode = CU_TR_FILTER_MODE_LINEAR; - - texture = - convert_create_texture_unchecked (convert->unpack_surface.device_ptr, - in_width, in_height, 4, convert->unpack_surface.cuda_stride, format, - mode, cuda_stream); - - if (!texture) { - GST_ERROR ("could not create texture"); - goto done; - } - - cuda_ret = - CuLaunchKernel (convert->kernel_func1, DIV_UP (out_width, CUDA_BLOCK_X), - DIV_UP (out_height, CUDA_BLOCK_Y), 1, CUDA_BLOCK_X, CUDA_BLOCK_Y, 1, 0, - cuda_stream, rescale_kernel_args, NULL); - - if (!gst_cuda_result (cuda_ret)) { - GST_ERROR ("could not rescale plane"); - goto done; - } - - ret = TRUE; - gst_cuda_result (CuStreamSynchronize (cuda_stream)); - -done: - if (texture) - gst_cuda_result (CuTexObjectDestroy (texture)); - - return ret; -} - -/* from video-converter.c */ -typedef struct -{ - gdouble dm44; -} MatrixData; - -static void -color_matrix_set_identity (MatrixData * m) -{ - gint i, j; - - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - m->dmij = (i == j); - } - } -} - -static void -color_matrix_copy (MatrixData * d, const MatrixData * s) -{ - gint i, j; - - for (i = 0; i < 4; i++) - for (j = 0; j < 4; j++) - d->dmij = s->dmij; -} - -/* Perform 4x4 matrix multiplication: - * - @dst@ = @a@ * @b@ - * - @dst@ may be a pointer to @a@ andor @b@ - */ -static void -color_matrix_multiply (MatrixData * dst, MatrixData * a, MatrixData * b) -{ - MatrixData tmp; - gint i, j, k; - - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - gdouble x = 0; - for (k = 0; k < 4; k++) { - x += a->dmik * b->dmkj; - } - tmp.dmij = x; - } - } - color_matrix_copy (dst, &tmp); -} - -static void -color_matrix_offset_components (MatrixData * m, gdouble a1, gdouble a2, - gdouble a3) -{ - MatrixData a; - - color_matrix_set_identity (&a); - a.dm03 = a1; - a.dm13 = a2; - a.dm23 = a3; - color_matrix_multiply (m, &a, m); -} - -static void -color_matrix_scale_components (MatrixData * m, gdouble a1, gdouble a2, - gdouble a3) -{ - MatrixData a; - - color_matrix_set_identity (&a); - a.dm00 = a1; - a.dm11 = a2; - a.dm22 = a3; - color_matrix_multiply (m, &a, m); -} - -static void -color_matrix_debug (const MatrixData * s) -{ - GST_DEBUG ("%f %f %f %f", s->dm00, s->dm01, s->dm02, - s->dm03); - GST_DEBUG ("%f %f %f %f", s->dm10, s->dm11, s->dm12, - s->dm13); - GST_DEBUG ("%f %f %f %f", s->dm20, s->dm21, s->dm22, - s->dm23); - GST_DEBUG ("%f %f %f %f", s->dm30, s->dm31, s->dm32, - s->dm33); -} - -static void -color_matrix_YCbCr_to_RGB (MatrixData * m, gdouble Kr, gdouble Kb) -{ - gdouble Kg = 1.0 - Kr - Kb; - MatrixData k = { - { - {1., 0., 2 * (1 - Kr), 0.}, - {1., -2 * Kb * (1 - Kb) / Kg, -2 * Kr * (1 - Kr) / Kg, 0.}, - {1., 2 * (1 - Kb), 0., 0.}, - {0., 0., 0., 1.}, - } - }; - - color_matrix_multiply (m, &k, m); -} - -static void -color_matrix_RGB_to_YCbCr (MatrixData * m, gdouble Kr, gdouble Kb) -{ - gdouble Kg = 1.0 - Kr - Kb; - MatrixData k; - gdouble x; - - k.dm00 = Kr; - k.dm01 = Kg; - k.dm02 = Kb; - k.dm03 = 0; - - x = 1 / (2 * (1 - Kb)); - k.dm10 = -x * Kr; - k.dm11 = -x * Kg; - k.dm12 = x * (1 - Kb); - k.dm13 = 0; - - x = 1 / (2 * (1 - Kr)); - k.dm20 = x * (1 - Kr); - k.dm21 = -x * Kg; - k.dm22 = -x * Kb; - k.dm23 = 0; - - k.dm30 = 0; - k.dm31 = 0; - k.dm32 = 0; - k.dm33 = 1; - - color_matrix_multiply (m, &k, m); -} - -static void -compute_matrix_to_RGB (GstCudaConverter * convert, MatrixData * data, - GstVideoInfo * info) -{ - gdouble Kr = 0, Kb = 0; - gint offset4, scale4; - - /* bring color components to 0..1.0 range */ - gst_video_color_range_offsets (info->colorimetry.range, info->finfo, offset, - scale); - - color_matrix_offset_components (data, -offset0, -offset1, -offset2); - color_matrix_scale_components (data, 1 / ((float) scale0), - 1 / ((float) scale1), 1 / ((float) scale2)); - - if (!GST_VIDEO_INFO_IS_RGB (info)) { - /* bring components to R'G'B' space */ - if (gst_video_color_matrix_get_Kr_Kb (info->colorimetry.matrix, &Kr, &Kb)) - color_matrix_YCbCr_to_RGB (data, Kr, Kb); - } - color_matrix_debug (data); -} - -static void -compute_matrix_to_YUV (GstCudaConverter * convert, MatrixData * data, - GstVideoInfo * info) -{ - gdouble Kr = 0, Kb = 0; - gint offset4, scale4; - - if (!GST_VIDEO_INFO_IS_RGB (info)) { - /* bring components to YCbCr space */ - if (gst_video_color_matrix_get_Kr_Kb (info->colorimetry.matrix, &Kr, &Kb)) - color_matrix_RGB_to_YCbCr (data, Kr, Kb); - } - - /* bring color components to nominal range */ - gst_video_color_range_offsets (info->colorimetry.range, info->finfo, offset, - scale); - - color_matrix_scale_components (data, (float) scale0, (float) scale1, - (float) scale2); - color_matrix_offset_components (data, offset0, offset1, offset2); - - color_matrix_debug (data); -} - -static gboolean -cuda_converter_get_matrix (GstCudaConverter * convert, MatrixData * matrix, - GstVideoInfo * in_info, GstVideoInfo * out_info) -{ - gboolean same_matrix, same_bits; - guint in_bits, out_bits; - - in_bits = GST_VIDEO_INFO_COMP_DEPTH (in_info, 0); - out_bits = GST_VIDEO_INFO_COMP_DEPTH (out_info, 0); - - same_bits = in_bits == out_bits; - same_matrix = in_info->colorimetry.matrix == out_info->colorimetry.matrix; - - GST_DEBUG ("matrix %d -> %d (%d)", in_info->colorimetry.matrix, - out_info->colorimetry.matrix, same_matrix); - GST_DEBUG ("bits %d -> %d (%d)", in_bits, out_bits, same_bits); - - color_matrix_set_identity (matrix); - - if (same_bits && same_matrix) { - GST_DEBUG ("conversion matrix is not required"); - - return FALSE; - } - - if (in_bits < out_bits) { - gint scale = 1 << (out_bits - in_bits); - color_matrix_scale_components (matrix, - 1 / (float) scale, 1 / (float) scale, 1 / (float) scale); - } - - GST_DEBUG ("to RGB matrix"); - compute_matrix_to_RGB (convert, matrix, in_info); - GST_DEBUG ("current matrix"); - color_matrix_debug (matrix); - - GST_DEBUG ("to YUV matrix"); - compute_matrix_to_YUV (convert, matrix, out_info); - GST_DEBUG ("current matrix"); - color_matrix_debug (matrix); - - if (in_bits > out_bits) { - gint scale = 1 << (in_bits - out_bits); - color_matrix_scale_components (matrix, - (float) scale, (float) scale, (float) scale); - } - - GST_DEBUG ("final matrix"); - color_matrix_debug (matrix); - - return TRUE; -} - -static gboolean -is_uv_swapped (GstVideoFormat format) -{ - static GstVideoFormat swapped_formats = { - GST_VIDEO_FORMAT_YV12, - GST_VIDEO_FORMAT_NV21, - }; - gint i; - - for (i = 0; i < G_N_ELEMENTS (swapped_formats); i++) { - if (format == swapped_formatsi) - return TRUE; - } - - return FALSE; -} - -typedef struct -{ - const gchar *read_chroma; - const gchar *write_chroma; - const gchar *unpack_function; - gfloat scale_h, scale_v; - gfloat chroma_scale_h, chroma_scale_v; - gint width, height; - gint chroma_width, chroma_height; - gint in_depth; - gint out_depth; - gint pstride, chroma_pstride; - gint in_shift, out_shift; - gint mask; - gint swap_uv; - /* RGBA specific variables */ - gint max_in_val; - GstCudaRGBOrder rgb_order; -} GstCudaKernelTempl; - -static gchar * -cuda_converter_generate_yuv_to_yuv_kernel_code (GstCudaConverter * convert, - GstCudaKernelTempl * templ) -{ - gchar scale_h_strG_ASCII_DTOSTR_BUF_SIZE; - gchar scale_v_strG_ASCII_DTOSTR_BUF_SIZE; - gchar chroma_scale_h_strG_ASCII_DTOSTR_BUF_SIZE; - gchar chroma_scale_v_strG_ASCII_DTOSTR_BUF_SIZE; - g_ascii_formatd (scale_h_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", templ->scale_h); - g_ascii_formatd (scale_v_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", templ->scale_v); - g_ascii_formatd (chroma_scale_h_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", - templ->chroma_scale_h); - g_ascii_formatd (chroma_scale_v_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", - templ->chroma_scale_v); - return g_strdup_printf (templ_YUV_TO_YUV, scale_h_str, scale_v_str, - chroma_scale_h_str, chroma_scale_v_str, templ->width, templ->height, - templ->chroma_width, templ->chroma_height, templ->in_depth, - templ->out_depth, templ->pstride, templ->chroma_pstride, templ->in_shift, - templ->out_shift, templ->mask, templ->swap_uv, templ->read_chroma, - templ->write_chroma); -} - -static gchar * -cuda_converter_generate_yuv_to_rgb_kernel_code (GstCudaConverter * convert, - GstCudaKernelTempl * templ, MatrixData * matrix) -{ - gchar matrix_dm44G_ASCII_DTOSTR_BUF_SIZE; - gchar scale_h_strG_ASCII_DTOSTR_BUF_SIZE; - gchar scale_v_strG_ASCII_DTOSTR_BUF_SIZE; - gchar chroma_scale_h_strG_ASCII_DTOSTR_BUF_SIZE; - gchar chroma_scale_v_strG_ASCII_DTOSTR_BUF_SIZE; - gint i, j; - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - g_ascii_formatd (matrix_dmij, G_ASCII_DTOSTR_BUF_SIZE, "%f", - matrix->dmij); - } - } - g_ascii_formatd (scale_h_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", templ->scale_h); - g_ascii_formatd (scale_v_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", templ->scale_v); - g_ascii_formatd (chroma_scale_h_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", - templ->chroma_scale_h); - g_ascii_formatd (chroma_scale_v_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", - templ->chroma_scale_v); - return g_strdup_printf (templ_YUV_TO_RGB, matrix_dm03, matrix_dm13, - matrix_dm23, matrix_dm00, matrix_dm01, matrix_dm02, - matrix_dm10, matrix_dm11, matrix_dm12, matrix_dm20, - matrix_dm21, matrix_dm22, scale_h_str, scale_v_str, - chroma_scale_h_str, chroma_scale_v_str, templ->width, templ->height, - templ->chroma_width, templ->chroma_height, templ->in_depth, - templ->out_depth, templ->pstride, templ->chroma_pstride, templ->in_shift, - templ->out_shift, templ->mask, templ->swap_uv, templ->max_in_val, - templ->rgb_order.R, templ->rgb_order.G, templ->rgb_order.B, - templ->rgb_order.A, templ->rgb_order.X, templ->read_chroma); -} - -static gchar * -cuda_converter_generate_rgb_to_yuv_kernel_code (GstCudaConverter * convert, - GstCudaKernelTempl * templ, MatrixData * matrix) -{ - gchar matrix_dm44G_ASCII_DTOSTR_BUF_SIZE; - gchar scale_h_strG_ASCII_DTOSTR_BUF_SIZE; - gchar scale_v_strG_ASCII_DTOSTR_BUF_SIZE; - gchar chroma_scale_h_strG_ASCII_DTOSTR_BUF_SIZE; - gchar chroma_scale_v_strG_ASCII_DTOSTR_BUF_SIZE; - gint i, j; - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - g_ascii_formatd (matrix_dmij, G_ASCII_DTOSTR_BUF_SIZE, "%f", - matrix->dmij); - } - } - g_ascii_formatd (scale_h_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", templ->scale_h); - g_ascii_formatd (scale_v_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", templ->scale_v); - g_ascii_formatd (chroma_scale_h_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", - templ->chroma_scale_h); - g_ascii_formatd (chroma_scale_v_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", - templ->chroma_scale_v); - return g_strdup_printf (templ_RGB_TO_YUV, matrix_dm03, matrix_dm13, - matrix_dm23, matrix_dm00, matrix_dm01, matrix_dm02, - matrix_dm10, matrix_dm11, matrix_dm12, matrix_dm20, - matrix_dm21, matrix_dm22, scale_h_str, scale_v_str, - chroma_scale_h_str, chroma_scale_v_str, templ->width, templ->height, - templ->chroma_width, templ->chroma_height, templ->in_depth, - templ->out_depth, templ->pstride, templ->chroma_pstride, templ->in_shift, - templ->out_shift, templ->mask, templ->swap_uv, templ->unpack_function, - templ->read_chroma, templ->write_chroma); -} - -static gchar * -cuda_converter_generate_rgb_to_rgb_kernel_code (GstCudaConverter * convert, - GstCudaKernelTempl * templ) -{ - gchar scale_h_strG_ASCII_DTOSTR_BUF_SIZE; - gchar scale_v_strG_ASCII_DTOSTR_BUF_SIZE; - g_ascii_formatd (scale_h_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", templ->scale_h); - g_ascii_formatd (scale_v_str, G_ASCII_DTOSTR_BUF_SIZE, "%f", templ->scale_v); - return g_strdup_printf (templ_RGB_to_RGB, - scale_h_str, scale_v_str, - templ->width, templ->height, - templ->in_depth, templ->out_depth, templ->pstride, - templ->rgb_order.R, templ->rgb_order.G, - templ->rgb_order.B, templ->rgb_order.A, templ->rgb_order.X, - templ->unpack_function); -} - -#define SET_ORDER(o,r,g,b,a,x) G_STMT_START { \ - (o)->R = (r); \ - (o)->G = (g); \ - (o)->B = (b); \ - (o)->A = (a); \ - (o)->X = (x); \ -} G_STMT_END - -static void -cuda_converter_get_rgb_order (GstVideoFormat format, GstCudaRGBOrder * order) -{ - switch (format) { - case GST_VIDEO_FORMAT_RGBA: - SET_ORDER (order, 0, 1, 2, 3, -1); - break; - case GST_VIDEO_FORMAT_RGBx: - SET_ORDER (order, 0, 1, 2, -1, 3); - break; - case GST_VIDEO_FORMAT_BGRA: - SET_ORDER (order, 2, 1, 0, 3, -1); - break; - case GST_VIDEO_FORMAT_BGRx: - SET_ORDER (order, 2, 1, 0, -1, 3); - break; - case GST_VIDEO_FORMAT_ARGB: - SET_ORDER (order, 1, 2, 3, 0, -1); - break; - case GST_VIDEO_FORMAT_ABGR: - SET_ORDER (order, 3, 2, 1, 0, -1); - break; - case GST_VIDEO_FORMAT_RGB: - SET_ORDER (order, 0, 1, 2, -1, -1); - break; - case GST_VIDEO_FORMAT_BGR: - SET_ORDER (order, 2, 1, 0, -1, -1); - break; - case GST_VIDEO_FORMAT_BGR10A2_LE: - SET_ORDER (order, 1, 2, 3, 0, -1); - break; - case GST_VIDEO_FORMAT_RGB10A2_LE: - SET_ORDER (order, 3, 2, 1, 0, -1); - break; - default: - g_assert_not_reached (); - break; - } -} - -static gboolean -cuda_converter_lookup_path (GstCudaConverter * convert) -{ - GstVideoFormat in_format, out_format; - gboolean src_yuv, dst_yuv; - gboolean src_planar, dst_planar; - GstCudaKernelTempl templ = { 0, }; - GstVideoInfo *in_info, *out_info; - gboolean ret = FALSE; - CUresult cuda_ret; - - in_info = &convert->in_info; - out_info = &convert->out_info; - - in_format = GST_VIDEO_INFO_FORMAT (in_info); - out_format = GST_VIDEO_INFO_FORMAT (out_info); - - src_yuv = GST_VIDEO_INFO_IS_YUV (in_info); - dst_yuv = GST_VIDEO_INFO_IS_YUV (out_info); - - src_planar = GST_VIDEO_INFO_N_PLANES (in_info) == - GST_VIDEO_INFO_N_COMPONENTS (in_info); - dst_planar = GST_VIDEO_INFO_N_PLANES (out_info) == - GST_VIDEO_INFO_N_COMPONENTS (out_info); - - convert->keep_size = (GST_VIDEO_INFO_WIDTH (&convert->in_info) == - GST_VIDEO_INFO_WIDTH (&convert->out_info) && - GST_VIDEO_INFO_HEIGHT (&convert->in_info) == - GST_VIDEO_INFO_HEIGHT (&convert->out_info)); - - templ.scale_h = (gfloat) GST_VIDEO_INFO_COMP_WIDTH (in_info, 0) / - (gfloat) GST_VIDEO_INFO_COMP_WIDTH (out_info, 0); - templ.scale_v = (gfloat) GST_VIDEO_INFO_COMP_HEIGHT (in_info, 0) / - (gfloat) GST_VIDEO_INFO_COMP_HEIGHT (out_info, 0); - templ.chroma_scale_h = (gfloat) GST_VIDEO_INFO_COMP_WIDTH (in_info, 1) / - (gfloat) GST_VIDEO_INFO_COMP_WIDTH (out_info, 1); - templ.chroma_scale_v = (gfloat) GST_VIDEO_INFO_COMP_HEIGHT (in_info, 1) / - (gfloat) GST_VIDEO_INFO_COMP_HEIGHT (out_info, 1); - templ.width = GST_VIDEO_INFO_COMP_WIDTH (out_info, 0); - templ.height = GST_VIDEO_INFO_COMP_HEIGHT (out_info, 0); - templ.chroma_width = GST_VIDEO_INFO_COMP_WIDTH (out_info, 1); - templ.chroma_height = GST_VIDEO_INFO_COMP_HEIGHT (out_info, 1); - - templ.in_depth = GST_VIDEO_INFO_COMP_DEPTH (in_info, 0); - templ.out_depth = GST_VIDEO_INFO_COMP_DEPTH (out_info, 0); - templ.pstride = GST_VIDEO_INFO_COMP_PSTRIDE (out_info, 0); - templ.chroma_pstride = GST_VIDEO_INFO_COMP_PSTRIDE (out_info, 1); - templ.in_shift = in_info->finfo->shift0; - templ.out_shift = out_info->finfo->shift0; - templ.mask = ((1 << templ.out_depth) - 1) << templ.out_shift; - templ.swap_uv = (is_uv_swapped (in_format) != is_uv_swapped (out_format)); - - if (src_yuv && dst_yuv) { - convert->convert = convert_YUV_TO_YUV; - - if (src_planar && dst_planar) { - templ.read_chroma = READ_CHROMA_FROM_PLANAR; - templ.write_chroma = WRITE_CHROMA_TO_PLANAR; - } else if (!src_planar && dst_planar) { - templ.read_chroma = READ_CHROMA_FROM_SEMI_PLANAR; - templ.write_chroma = WRITE_CHROMA_TO_PLANAR; - } else if (src_planar && !dst_planar) { - templ.read_chroma = READ_CHROMA_FROM_PLANAR; - templ.write_chroma = WRITE_CHROMA_TO_SEMI_PLANAR; - } else { - templ.read_chroma = READ_CHROMA_FROM_SEMI_PLANAR; - templ.write_chroma = WRITE_CHROMA_TO_SEMI_PLANAR; - } - - convert->kernel_source = - cuda_converter_generate_yuv_to_yuv_kernel_code (convert, &templ); - convert->func_names0 = GST_CUDA_KERNEL_FUNC; - - ret = TRUE; - } else if (src_yuv && !dst_yuv) { - MatrixData matrix; - - if (src_planar) { - templ.read_chroma = READ_CHROMA_FROM_PLANAR; - } else { - templ.read_chroma = READ_CHROMA_FROM_SEMI_PLANAR; - } - - templ.max_in_val = (1 << templ.in_depth) - 1; - cuda_converter_get_rgb_order (out_format, &templ.rgb_order); - - cuda_converter_get_matrix (convert, &matrix, in_info, out_info); - convert->kernel_source = - cuda_converter_generate_yuv_to_rgb_kernel_code (convert, - &templ, &matrix); - convert->func_names0 = GST_CUDA_KERNEL_FUNC; - - convert->convert = convert_YUV_TO_RGB; - - ret = TRUE; - } else if (!src_yuv && dst_yuv) { - MatrixData matrix; - gsize element_size = 8; - GstVideoFormat unpack_format; - GstVideoFormat y444_format; - GstVideoInfo unpack_info; - GstVideoInfo y444_info; - gint i; - - if (dst_planar) { - templ.write_chroma = WRITE_CHROMA_TO_PLANAR; - } else { - templ.write_chroma = WRITE_CHROMA_TO_SEMI_PLANAR; - } - templ.read_chroma = READ_CHROMA_FROM_PLANAR; - - cuda_converter_get_rgb_order (in_format, &convert->in_rgb_order); - - if (templ.in_depth > 8) { - /* FIXME: RGB10A2_LE and BGR10A2_LE only */ - element_size = 16; - unpack_format = GST_VIDEO_FORMAT_ARGB64; - y444_format = GST_VIDEO_FORMAT_Y444_16LE; - templ.unpack_function = unpack_to_ARGB64; - } else { - unpack_format = GST_VIDEO_FORMAT_ARGB; - y444_format = GST_VIDEO_FORMAT_Y444; - templ.unpack_function = unpack_to_ARGB; - } - - gst_video_info_set_format (&unpack_info, - unpack_format, GST_VIDEO_INFO_WIDTH (in_info), - GST_VIDEO_INFO_HEIGHT (in_info)); - gst_video_info_set_format (&y444_info, - y444_format, GST_VIDEO_INFO_WIDTH (in_info), - GST_VIDEO_INFO_HEIGHT (in_info)); - - templ.in_depth = GST_VIDEO_INFO_COMP_DEPTH (&unpack_info, 0); - - cuda_ret = CuMemAllocPitch (&convert->unpack_surface.device_ptr, - &convert->unpack_surface.cuda_stride, - GST_VIDEO_INFO_COMP_WIDTH (&unpack_info, 0) * - GST_VIDEO_INFO_COMP_PSTRIDE (&unpack_info, 0), - GST_VIDEO_INFO_HEIGHT (&unpack_info), element_size); - - if (!gst_cuda_result (cuda_ret)) { - GST_ERROR ("couldn't alloc unpack surface"); - return FALSE; - } - - for (i = 0; i < 3; i++) { - cuda_ret = CuMemAllocPitch (&convert->y444_surfacei.device_ptr, - &convert->y444_surfacei.cuda_stride, - GST_VIDEO_INFO_COMP_WIDTH (&y444_info, i) * - GST_VIDEO_INFO_COMP_PSTRIDE (&y444_info, i), - GST_VIDEO_INFO_COMP_HEIGHT (&y444_info, i), element_size); - - if (!gst_cuda_result (cuda_ret)) { - GST_ERROR ("couldn't alloc %dth y444 surface", i); - return FALSE; - } - } - - cuda_converter_get_matrix (convert, &matrix, &unpack_info, &y444_info); - - convert->kernel_source = - cuda_converter_generate_rgb_to_yuv_kernel_code (convert, - &templ, &matrix); - - convert->func_names0 = GST_CUDA_KERNEL_FUNC_TO_ARGB; - convert->func_names1 = GST_CUDA_KERNEL_FUNC_TO_Y444; - convert->func_names2 = GST_CUDA_KERNEL_FUNC_Y444_TO_YUV; - - convert->convert = convert_RGB_TO_YUV; - - ret = TRUE; - } else { - gsize element_size = 8; - GstVideoFormat unpack_format; - GstVideoInfo unpack_info; - - cuda_converter_get_rgb_order (in_format, &convert->in_rgb_order); - cuda_converter_get_rgb_order (out_format, &templ.rgb_order); - - if (templ.in_depth > 8) { - /* FIXME: RGB10A2_LE and BGR10A2_LE only */ - element_size = 16; - unpack_format = GST_VIDEO_FORMAT_ARGB64; - templ.unpack_function = unpack_to_ARGB64; - } else { - unpack_format = GST_VIDEO_FORMAT_ARGB; - templ.unpack_function = unpack_to_ARGB; - } - - gst_video_info_set_format (&unpack_info, - unpack_format, GST_VIDEO_INFO_WIDTH (in_info), - GST_VIDEO_INFO_HEIGHT (in_info)); - - templ.in_depth = GST_VIDEO_INFO_COMP_DEPTH (&unpack_info, 0); - - cuda_ret = CuMemAllocPitch (&convert->unpack_surface.device_ptr, - &convert->unpack_surface.cuda_stride, - GST_VIDEO_INFO_COMP_WIDTH (&unpack_info, 0) * - GST_VIDEO_INFO_COMP_PSTRIDE (&unpack_info, 0), - GST_VIDEO_INFO_HEIGHT (&unpack_info), element_size); - - if (!gst_cuda_result (cuda_ret)) { - GST_ERROR ("couldn't alloc unpack surface"); - return FALSE; - } - - convert->kernel_source = - cuda_converter_generate_rgb_to_rgb_kernel_code (convert, &templ); - - convert->func_names0 = GST_CUDA_KERNEL_FUNC_TO_ARGB; - convert->func_names1 = GST_CUDA_KERNEL_FUNC_SCALE_RGB; - - convert->convert = convert_RGB_TO_RGB; - - ret = TRUE; - } - - if (!ret) { - GST_DEBUG ("no path found"); - - return FALSE; - } - - GST_TRACE ("configured CUDA kernel source\n%s", convert->kernel_source); - - return TRUE; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/cuda-converter.h
Deleted
@@ -1,58 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_CUDA_CONVERTER_H__ -#define __GST_CUDA_CONVERTER_H__ - -#include <gst/video/video.h> -#include "gstcudacontext.h" -#include "gstcudamemory.h" - -G_BEGIN_DECLS - -typedef struct _GstCudaConverter GstCudaConverter; - -#define GST_CUDA_CONVERTER_FORMATS \ - "{ I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, " \ - "BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE }" - -GstCudaConverter * gst_cuda_converter_new (GstVideoInfo * in_info, - GstVideoInfo * out_info, - GstCudaContext * cuda_ctx); - -void gst_cuda_converter_free (GstCudaConverter * convert); - -gboolean gst_cuda_converter_frame (GstCudaConverter * convert, - const GstCudaMemory * src, - GstVideoInfo * in_info, - GstCudaMemory * dst, - GstVideoInfo * out_info, - CUstream cuda_stream); - -gboolean gst_cuda_converter_frame_unlocked (GstCudaConverter * convert, - const GstCudaMemory * src, - GstVideoInfo * in_info, - GstCudaMemory * dst, - GstVideoInfo * out_info, - CUstream cuda_stream); - - -G_END_DECLS - -#endif /* __GST_CUDA_CONVERTER_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudabasefilter.c
Deleted
@@ -1,321 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> - * Copyright (C) 2005-2012 David Schleef <ds@schleef.org> - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * GstCudaBaseFilter: - * - * Base class for CUDA filters - * - * Since: 1.20 - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include "gstcudabasefilter.h" -#include "gstcudautils.h" -#include <string.h> - -GST_DEBUG_CATEGORY_STATIC (gst_cuda_base_filter_debug); -#define GST_CAT_DEFAULT gst_cuda_base_filter_debug - -static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES - (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY, GST_CUDA_CONVERTER_FORMATS)) - ); - -static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES - (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY, GST_CUDA_CONVERTER_FORMATS)) - ); - -#define gst_cuda_base_filter_parent_class parent_class -G_DEFINE_ABSTRACT_TYPE (GstCudaBaseFilter, - gst_cuda_base_filter, GST_TYPE_CUDA_BASE_TRANSFORM); - -static void gst_cuda_base_filter_dispose (GObject * object); -static GstFlowReturn -gst_cuda_base_filter_transform_frame (GstCudaBaseTransform * btrans, - GstVideoFrame * in_frame, GstCudaMemory * in_cuda_mem, - GstVideoFrame * out_frame, GstCudaMemory * out_cuda_mem); -static gboolean gst_cuda_base_filter_set_info (GstCudaBaseTransform * btrans, - GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, - GstVideoInfo * out_info); - -static void -gst_cuda_base_filter_class_init (GstCudaBaseFilterClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); - GstCudaBaseTransformClass *btrans_class = - GST_CUDA_BASE_TRANSFORM_CLASS (klass); - - gobject_class->dispose = gst_cuda_base_filter_dispose; - - gst_element_class_add_static_pad_template (element_class, &sink_template); - gst_element_class_add_static_pad_template (element_class, &src_template); - - trans_class->passthrough_on_same_caps = TRUE; - - btrans_class->set_info = GST_DEBUG_FUNCPTR (gst_cuda_base_filter_set_info); - btrans_class->transform_frame = - GST_DEBUG_FUNCPTR (gst_cuda_base_filter_transform_frame); - - GST_DEBUG_CATEGORY_INIT (gst_cuda_base_filter_debug, - "cudabasefilter", 0, "CUDA Base Filter"); -} - -static void -gst_cuda_base_filter_init (GstCudaBaseFilter * convert) -{ -} - -static void -gst_cuda_base_filter_dispose (GObject * object) -{ - GstCudaBaseFilter *filter = GST_CUDA_BASE_FILTER (object); - - if (filter->converter) { - gst_cuda_converter_free (filter->converter); - filter->converter = NULL; - } - - if (filter->in_fallback) { - gst_memory_unref (GST_MEMORY_CAST (filter->in_fallback)); - filter->in_fallback = NULL; - } - - if (filter->out_fallback) { - gst_memory_unref (GST_MEMORY_CAST (filter->out_fallback)); - filter->out_fallback = NULL; - } - - gst_clear_object (&filter->allocator); - - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -static gboolean -gst_cuda_base_filter_configure (GstCudaBaseFilter * filter, - GstVideoInfo * in_info, GstVideoInfo * out_info) -{ - GstCudaBaseTransform *btrans = GST_CUDA_BASE_TRANSFORM (filter); - - /* cleanup internal pool */ - if (filter->in_fallback) { - gst_memory_unref (GST_MEMORY_CAST (filter->in_fallback)); - filter->in_fallback = NULL; - } - - if (filter->out_fallback) { - gst_memory_unref (GST_MEMORY_CAST (filter->out_fallback)); - filter->out_fallback = NULL; - } - - if (!filter->allocator) - filter->allocator = gst_cuda_allocator_new (btrans->context); - - if (!filter->allocator) { - GST_ERROR_OBJECT (filter, "Failed to create CUDA allocator"); - return FALSE; - } - - return TRUE; -} - -static gboolean -gst_cuda_base_filter_set_info (GstCudaBaseTransform * btrans, GstCaps * incaps, - GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info) -{ - GstCudaBaseFilter *filter = GST_CUDA_BASE_FILTER (btrans); - - if (!gst_cuda_base_filter_configure (filter, in_info, out_info)) { - return FALSE; - } - - if (filter->converter) - gst_cuda_converter_free (filter->converter); - - filter->converter = - gst_cuda_converter_new (in_info, out_info, btrans->context); - - if (filter->converter == NULL) - goto no_converter; - - GST_DEBUG_OBJECT (filter, "reconfigured %d %d", - GST_VIDEO_INFO_FORMAT (in_info), GST_VIDEO_INFO_FORMAT (out_info)); - - return TRUE; - -no_converter: - { - GST_ERROR_OBJECT (filter, "could not create converter"); - return FALSE; - } -} - -static GstFlowReturn -gst_cuda_base_filter_transform_frame (GstCudaBaseTransform * btrans, - GstVideoFrame * in_frame, GstCudaMemory * in_cuda_mem, - GstVideoFrame * out_frame, GstCudaMemory * out_cuda_mem) -{ - GstCudaBaseFilter *filter = GST_CUDA_BASE_FILTER (btrans); - gboolean conv_ret; - GstCudaMemory *in_mem; - GstCudaMemory *out_mem; - gint i; - - if (in_cuda_mem) { - in_mem = in_cuda_mem; - } else { - if (!filter->in_fallback) { - GstCudaAllocationParams params; - - memset (¶ms, 0, sizeof (GstCudaAllocationParams)); - params.info = btrans->in_info; - - filter->in_fallback = - (GstCudaMemory *) gst_cuda_allocator_alloc (filter->allocator, - GST_VIDEO_INFO_SIZE (¶ms.info), ¶ms); - } - - if (!filter->in_fallback) { - GST_ERROR_OBJECT (filter, "Couldn't allocate fallback memory"); - return GST_FLOW_ERROR; - } - - GST_TRACE_OBJECT (filter, "use CUDA fallback memory input"); - - if (!gst_cuda_context_push (btrans->context)) { - GST_ELEMENT_ERROR (filter, LIBRARY, FAILED, (NULL), - ("Cannot push CUDA context")); - return FALSE; - } - - /* upload frame to device memory */ - for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (in_frame); i++) { - CUDA_MEMCPY2D param = { 0, }; - guint width, height; - - width = GST_VIDEO_FRAME_COMP_WIDTH (in_frame, i) * - GST_VIDEO_FRAME_COMP_PSTRIDE (in_frame, i); - height = GST_VIDEO_FRAME_COMP_HEIGHT (in_frame, i); - - param.srcMemoryType = CU_MEMORYTYPE_HOST; - param.srcPitch = GST_VIDEO_FRAME_PLANE_STRIDE (in_frame, i); - param.srcHost = GST_VIDEO_FRAME_PLANE_DATA (in_frame, i); - param.dstMemoryType = CU_MEMORYTYPE_DEVICE; - param.dstPitch = filter->in_fallback->stride; - param.dstDevice = - filter->in_fallback->data + filter->in_fallback->offseti; - param.WidthInBytes = width; - param.Height = height; - - if (!gst_cuda_result (CuMemcpy2DAsync (¶m, btrans->cuda_stream))) { - gst_cuda_context_pop (NULL); - GST_ELEMENT_ERROR (filter, LIBRARY, FAILED, (NULL), - ("Cannot upload input video frame")); - return GST_FLOW_ERROR; - } - } - - gst_cuda_result (CuStreamSynchronize (btrans->cuda_stream)); - gst_cuda_context_pop (NULL); - - in_mem = filter->in_fallback; - } - - if (out_cuda_mem) { - out_mem = out_cuda_mem; - } else { - if (!filter->out_fallback) { - GstCudaAllocationParams params; - - memset (¶ms, 0, sizeof (GstCudaAllocationParams)); - params.info = btrans->out_info; - - filter->out_fallback = - (GstCudaMemory *) gst_cuda_allocator_alloc (filter->allocator, - GST_VIDEO_INFO_SIZE (¶ms.info), ¶ms); - } - - if (!filter->out_fallback) { - GST_ERROR_OBJECT (filter, "Couldn't allocate fallback memory"); - return GST_FLOW_ERROR; - } - - out_mem = filter->out_fallback; - } - - conv_ret = - gst_cuda_converter_frame (filter->converter, in_mem, &btrans->in_info, - out_mem, &btrans->out_info, btrans->cuda_stream); - - if (!conv_ret) { - GST_ERROR_OBJECT (filter, "Failed to convert frame"); - return GST_FLOW_ERROR; - } - - if (!out_cuda_mem) { - if (!gst_cuda_context_push (btrans->context)) { - GST_ELEMENT_ERROR (filter, LIBRARY, FAILED, (NULL), - ("Cannot push CUDA context")); - return FALSE; - } - - for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (out_frame); i++) { - CUDA_MEMCPY2D param = { 0, }; - guint width, height; - - width = GST_VIDEO_FRAME_COMP_WIDTH (out_frame, i) * - GST_VIDEO_FRAME_COMP_PSTRIDE (out_frame, i); - height = GST_VIDEO_FRAME_COMP_HEIGHT (out_frame, i); - - param.srcMemoryType = CU_MEMORYTYPE_DEVICE; - param.srcPitch = out_mem->stride; - param.srcDevice = - filter->out_fallback->data + filter->out_fallback->offseti; - param.dstMemoryType = CU_MEMORYTYPE_HOST; - param.dstPitch = GST_VIDEO_FRAME_PLANE_STRIDE (out_frame, i); - param.dstHost = GST_VIDEO_FRAME_PLANE_DATA (out_frame, i); - param.WidthInBytes = width; - param.Height = height; - - if (!gst_cuda_result (CuMemcpy2DAsync (¶m, btrans->cuda_stream))) { - gst_cuda_context_pop (NULL); - GST_ELEMENT_ERROR (filter, LIBRARY, FAILED, (NULL), - ("Cannot upload input video frame")); - return GST_FLOW_ERROR; - } - } - - gst_cuda_result (CuStreamSynchronize (btrans->cuda_stream)); - gst_cuda_context_pop (NULL); - } - - return GST_FLOW_OK; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudabasefilter.h
Deleted
@@ -1,61 +0,0 @@ -/* GStreamer - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_CUDA_BASE_FILTER_H__ -#define __GST_CUDA_BASE_FILTER_H__ - -#include <gst/gst.h> - -#include "gstcudabasetransform.h" -#include "cuda-converter.h" - -G_BEGIN_DECLS - -#define GST_TYPE_CUDA_BASE_FILTER (gst_cuda_base_filter_get_type()) -#define GST_CUDA_BASE_FILTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CUDA_BASE_FILTER,GstCudaBaseFilter)) -#define GST_CUDA_BASE_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CUDA_BASE_FILTER,GstCudaBaseFilterClass)) -#define GST_CUDA_BASE_FILTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CUDA_BASE_FILTER,GstCudaBaseFilterClass)) -#define GST_IS_CUDA_BASE_FILTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CUDA_BASE_FILTER)) -#define GST_IS_CUDA_BASE_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CUDA_BASE_FILTER)) - -typedef struct _GstCudaBaseFilter GstCudaBaseFilter; -typedef struct _GstCudaBaseFilterClass GstCudaBaseFilterClass; - -struct _GstCudaBaseFilter -{ - GstCudaBaseTransform parent; - - GstCudaConverter *converter; - - /* fallback CUDA memory */ - GstAllocator *allocator; - GstCudaMemory *in_fallback; - GstCudaMemory *out_fallback; -}; - -struct _GstCudaBaseFilterClass -{ - GstCudaBaseTransformClass parent_class; -}; - -GType gst_cuda_base_filter_get_type (void); - -G_END_DECLS - -#endif /* __GST_CUDA_BASE_FILTER_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudabufferpool.c
Deleted
@@ -1,259 +0,0 @@ -/* GStreamer - * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstcudabufferpool.h" -#include "gstcudacontext.h" -#include "gstcudamemory.h" - -GST_DEBUG_CATEGORY_STATIC (gst_cuda_buffer_pool_debug); -#define GST_CAT_DEFAULT gst_cuda_buffer_pool_debug - -struct _GstCudaBufferPoolPrivate -{ - GstCudaContext *context; - GstAllocator *allocator; - GstVideoInfo info; - gboolean add_videometa; - gboolean need_alignment; - GstCudaAllocationParams params; -}; - -#define gst_cuda_buffer_pool_parent_class parent_class -G_DEFINE_TYPE_WITH_PRIVATE (GstCudaBufferPool, gst_cuda_buffer_pool, - GST_TYPE_BUFFER_POOL); - -static const gchar ** -gst_cuda_buffer_pool_get_options (GstBufferPool * pool) -{ - static const gchar *options = { GST_BUFFER_POOL_OPTION_VIDEO_META, - GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT, NULL - }; - - return options; -} - -static gboolean -gst_cuda_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config) -{ - GstCudaBufferPool *cuda_pool = GST_CUDA_BUFFER_POOL_CAST (pool); - GstCudaBufferPoolPrivate *priv = cuda_pool->priv; - GstCaps *caps = NULL; - guint size, min_buffers, max_buffers; - guint max_align, n; - GstAllocator *allocator = NULL; - GstAllocationParams *params = (GstAllocationParams *) & priv->params; - GstVideoInfo *info = &priv->params.info; - - if (!gst_buffer_pool_config_get_params (config, &caps, &size, &min_buffers, - &max_buffers)) - goto wrong_config; - - if (caps == NULL) - goto no_caps; - - if (!gst_buffer_pool_config_get_allocator (config, &allocator, params)) - goto wrong_config; - - /* now parse the caps from the config */ - if (!gst_video_info_from_caps (info, caps)) - goto wrong_caps; - - GST_LOG_OBJECT (pool, "%dx%d, caps %" GST_PTR_FORMAT, - GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info), caps); - - gst_clear_object (&priv->allocator); - - if (allocator) { - if (!GST_IS_CUDA_ALLOCATOR (allocator)) { - goto wrong_allocator; - } else { - priv->allocator = gst_object_ref (allocator); - } - } else { - allocator = priv->allocator = gst_cuda_allocator_new (priv->context); - if (G_UNLIKELY (priv->allocator == NULL)) - goto no_allocator; - } - - priv->add_videometa = gst_buffer_pool_config_has_option (config, - GST_BUFFER_POOL_OPTION_VIDEO_META); - - priv->need_alignment = gst_buffer_pool_config_has_option (config, - GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); - - max_align = params->align; - - /* do memory align */ - if (priv->need_alignment && priv->add_videometa) { - GstVideoAlignment valign; - - gst_buffer_pool_config_get_video_alignment (config, &valign); - - for (n = 0; n < GST_VIDEO_MAX_PLANES; ++n) - max_align |= valign.stride_alignn; - - for (n = 0; n < GST_VIDEO_MAX_PLANES; ++n) - valign.stride_alignn = max_align; - - if (!gst_video_info_align (info, &valign)) - goto failed_to_align; - - gst_buffer_pool_config_set_video_alignment (config, &valign); - } - - if (params->align < max_align) { - GST_WARNING_OBJECT (pool, "allocation params alignment %u is smaller " - "than the max specified video stride alignment %u, fixing", - (guint) params->align, max_align); - - params->align = max_align; - gst_buffer_pool_config_set_allocator (config, allocator, params); - } - - gst_buffer_pool_config_set_params (config, caps, GST_VIDEO_INFO_SIZE (info), - min_buffers, max_buffers); - - return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config); - - /* ERRORS */ -wrong_config: - { - GST_WARNING_OBJECT (pool, "invalid config"); - return FALSE; - } -no_caps: - { - GST_WARNING_OBJECT (pool, "no caps in config"); - return FALSE; - } -wrong_caps: - { - GST_WARNING_OBJECT (pool, - "failed getting geometry from caps %" GST_PTR_FORMAT, caps); - return FALSE; - } -no_allocator: - { - GST_WARNING_OBJECT (pool, "Could not create new CUDA allocator"); - return FALSE; - } -wrong_allocator: - { - GST_WARNING_OBJECT (pool, "Incorrect allocator type for this pool"); - return FALSE; - } -failed_to_align: - { - GST_WARNING_OBJECT (pool, "Failed to align"); - return FALSE; - } -} - -static GstFlowReturn -gst_cuda_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer, - GstBufferPoolAcquireParams * params) -{ - GstCudaBufferPool *cuda_pool = GST_CUDA_BUFFER_POOL_CAST (pool); - GstCudaBufferPoolPrivate *priv = cuda_pool->priv; - GstVideoInfo *info; - GstBuffer *cuda; - GstMemory *mem; - - info = &priv->params.info; - - cuda = gst_buffer_new (); - - mem = gst_cuda_allocator_alloc (GST_ALLOCATOR_CAST (priv->allocator), - GST_VIDEO_INFO_SIZE (info), &priv->params); - - if (mem == NULL) { - gst_buffer_unref (cuda); - GST_WARNING_OBJECT (pool, "Cannot create CUDA memory"); - return GST_FLOW_ERROR; - } - gst_buffer_append_memory (cuda, mem); - - if (priv->add_videometa) { - GST_DEBUG_OBJECT (pool, "adding GstVideoMeta"); - gst_buffer_add_video_meta_full (cuda, GST_VIDEO_FRAME_FLAG_NONE, - GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_WIDTH (info), - GST_VIDEO_INFO_HEIGHT (info), GST_VIDEO_INFO_N_PLANES (info), - info->offset, info->stride); - } - - *buffer = cuda; - - return GST_FLOW_OK; -} - -GstBufferPool * -gst_cuda_buffer_pool_new (GstCudaContext * context) -{ - GstCudaBufferPool *pool; - - pool = g_object_new (GST_TYPE_CUDA_BUFFER_POOL, NULL); - gst_object_ref_sink (pool); - - pool->priv->context = gst_object_ref (context); - - GST_LOG_OBJECT (pool, "new CUDA buffer pool %p", pool); - - return GST_BUFFER_POOL_CAST (pool); -} - -static void -gst_cuda_buffer_pool_dispose (GObject * object) -{ - GstCudaBufferPool *pool = GST_CUDA_BUFFER_POOL_CAST (object); - GstCudaBufferPoolPrivate *priv = pool->priv; - - GST_LOG_OBJECT (pool, "finalize CUDA buffer pool %p", pool); - - gst_clear_object (&priv->allocator); - gst_clear_object (&priv->context); - - G_OBJECT_CLASS (parent_class)->dispose (object); -} - - -static void -gst_cuda_buffer_pool_class_init (GstCudaBufferPoolClass * klass) -{ - GObjectClass *gobject_class = (GObjectClass *) klass; - GstBufferPoolClass *gstbufferpool_class = (GstBufferPoolClass *) klass; - - gobject_class->dispose = gst_cuda_buffer_pool_dispose; - - gstbufferpool_class->get_options = gst_cuda_buffer_pool_get_options; - gstbufferpool_class->set_config = gst_cuda_buffer_pool_set_config; - gstbufferpool_class->alloc_buffer = gst_cuda_buffer_pool_alloc; - - GST_DEBUG_CATEGORY_INIT (gst_cuda_buffer_pool_debug, "cudabufferpool", 0, - "CUDA Buffer Pool"); -} - -static void -gst_cuda_buffer_pool_init (GstCudaBufferPool * pool) -{ - pool->priv = gst_cuda_buffer_pool_get_instance_private (pool); -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudabufferpool.h
Deleted
@@ -1,66 +0,0 @@ -/* GStreamer - * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_CUDA_BUFFER_POOL_H__ -#define __GST_CUDA_BUFFER_POOL_H__ - -#include <gst/video/gstvideometa.h> -#include <gst/video/gstvideopool.h> - -#include "gstcudamemory.h" - -G_BEGIN_DECLS - -#define GST_TYPE_CUDA_BUFFER_POOL (gst_cuda_buffer_pool_get_type ()) -#define GST_CUDA_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),GST_TYPE_CUDA_BUFFER_POOL,GstCudaBufferPool)) -#define GST_CUDA_BUFFER_POOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_CUDA_BUFFER_POOL,GstCudaBufferPoolClass)) -#define GST_CUDA_BUFFER_POOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CUDA_BUFFER_POOL,GstCudaBufferPoolClass)) -#define GST_IS_CUDA_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),GST_TYPE_CUDA_BUFFER_POOL)) -#define GST_IS_CUDA_BUFFER_POOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CUDA_BUFFER_POOL)) -#define GST_CUDA_BUFFER_POOL_CAST(obj) ((GstCudaBufferPool*)(obj)) - -typedef struct _GstCudaBufferPool GstCudaBufferPool; -typedef struct _GstCudaBufferPoolClass GstCudaBufferPoolClass; -typedef struct _GstCudaBufferPoolPrivate GstCudaBufferPoolPrivate; - -/* - * GstCudaBufferPool: - */ -struct _GstCudaBufferPool -{ - GstBufferPool parent; - - GstCudaBufferPoolPrivate *priv; -}; - -/* - * GstCudaBufferPoolClass: - */ -struct _GstCudaBufferPoolClass -{ - GstBufferPoolClass parent_class; -}; - -GType gst_cuda_buffer_pool_get_type (void); - -GstBufferPool * gst_cuda_buffer_pool_new (GstCudaContext * context); - -G_END_DECLS - -#endif /* __GST_CUDA_BUFFER_POOL_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudacontext.c
Deleted
@@ -1,434 +0,0 @@ -/* GStreamer - * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstcudaloader.h" -#include "gstcudacontext.h" -#include "gstcudautils.h" - -GST_DEBUG_CATEGORY_STATIC (gst_cuda_context_debug); -#define GST_CAT_DEFAULT gst_cuda_context_debug - -/* store all context object with weak ref */ -static GList *context_list = NULL; -G_LOCK_DEFINE_STATIC (list_lock); - -enum -{ - PROP_0, - PROP_DEVICE_ID -}; - -#define DEFAULT_DEVICE_ID -1 - -struct _GstCudaContextPrivate -{ - CUcontext context; - CUdevice device; - gint device_id; - - gint tex_align; - - GHashTable *accessible_peer; -}; - -#define gst_cuda_context_parent_class parent_class -G_DEFINE_TYPE_WITH_PRIVATE (GstCudaContext, gst_cuda_context, GST_TYPE_OBJECT); - -static void gst_cuda_context_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_cuda_context_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static void gst_cuda_context_constructed (GObject * object); -static void gst_cuda_context_finalize (GObject * object); -static void gst_cuda_context_weak_ref_notify (gpointer data, - GstCudaContext * context); -static void gst_cuda_context_enable_peer_access (GstCudaContext * context, - GstCudaContext * peer); - -static void -gst_cuda_context_class_init (GstCudaContextClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->set_property = gst_cuda_context_set_property; - gobject_class->get_property = gst_cuda_context_get_property; - gobject_class->constructed = gst_cuda_context_constructed; - gobject_class->finalize = gst_cuda_context_finalize; - - g_object_class_install_property (gobject_class, PROP_DEVICE_ID, - g_param_spec_int ("cuda-device-id", "Cuda Device ID", - "Set the GPU device to use for operations (-1 = auto)", - -1, G_MAXINT, DEFAULT_DEVICE_ID, - G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - GST_DEBUG_CATEGORY_INIT (gst_cuda_context_debug, - "cudacontext", 0, "CUDA Context"); -} - -static void -gst_cuda_context_init (GstCudaContext * context) -{ - GstCudaContextPrivate *priv = gst_cuda_context_get_instance_private (context); - - priv->context = NULL; - priv->device_id = DEFAULT_DEVICE_ID; - priv->accessible_peer = g_hash_table_new (g_direct_hash, g_direct_equal); - - context->priv = priv; -} - -static void -gst_cuda_context_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstCudaContext *context = GST_CUDA_CONTEXT (object); - GstCudaContextPrivate *priv = context->priv; - - switch (prop_id) { - case PROP_DEVICE_ID: - priv->device_id = g_value_get_int (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_cuda_context_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstCudaContext *context = GST_CUDA_CONTEXT (object); - GstCudaContextPrivate *priv = context->priv; - - switch (prop_id) { - case PROP_DEVICE_ID: - g_value_set_int (value, priv->device_id); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_cuda_context_constructed (GObject * object) -{ - static gsize once = 0; - GstCudaContext *context = GST_CUDA_CONTEXT (object); - GstCudaContextPrivate *priv = context->priv; - CUcontext cuda_ctx, old_ctx; - gboolean ret = TRUE; - CUdevice cdev = 0, cuda_dev = -1; - gint dev_count = 0; - gchar name256; - gint min = 0, maj = 0; - gint i; - gint tex_align = 0; - GList *iter; - - if (g_once_init_enter (&once)) { - if (CuInit (0) != CUDA_SUCCESS) { - GST_ERROR_OBJECT (context, "Failed to cuInit"); - ret = FALSE; - } - g_once_init_leave (&once, ret); - - if (!ret) - return; - } - - if (!gst_cuda_result (CuDeviceGetCount (&dev_count)) || dev_count == 0) { - GST_WARNING ("No CUDA devices detected"); - return; - } - - for (i = 0; i < dev_count; ++i) { - if (gst_cuda_result (CuDeviceGet (&cdev, i)) && - gst_cuda_result (CuDeviceGetName (name, sizeof (name), cdev)) && - gst_cuda_result (CuDeviceGetAttribute (&maj, - CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, cdev)) && - gst_cuda_result (CuDeviceGetAttribute (&min, - CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, cdev)) && - gst_cuda_result (CuDeviceGetAttribute (&tex_align, - CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT, cdev))) { - GST_INFO ("GPU #%d supports NVENC: %s (%s) (Compute SM %d.%d)", i, - (((maj << 4) + min) >= 0x30) ? "yes" : "no", name, maj, min); - if (priv->device_id == -1 || priv->device_id == cdev) { - priv->device_id = cuda_dev = cdev; - priv->tex_align = tex_align; - break; - } - } - } - - if (cuda_dev == -1) { - GST_WARNING ("Device with id %d does not exist", priv->device_id); - return; - } - - GST_DEBUG ("Creating cuda context for device index %d", cuda_dev); - - if (!gst_cuda_result (CuCtxCreate (&cuda_ctx, 0, cuda_dev))) { - GST_WARNING ("Failed to create CUDA context for cuda device %d", cuda_dev); - return; - } - - if (!gst_cuda_result (CuCtxPopCurrent (&old_ctx))) { - return; - } - - GST_INFO ("Created CUDA context %p with device-id %d", cuda_ctx, cuda_dev); - - priv->context = cuda_ctx; - priv->device = cuda_dev; - - G_LOCK (list_lock); - g_object_weak_ref (G_OBJECT (object), - (GWeakNotify) gst_cuda_context_weak_ref_notify, NULL); - for (iter = context_list; iter; iter = g_list_next (iter)) { - GstCudaContext *peer = (GstCudaContext *) iter->data; - - /* EnablePeerAccess is unidirectional */ - gst_cuda_context_enable_peer_access (context, peer); - gst_cuda_context_enable_peer_access (peer, context); - } - - context_list = g_list_append (context_list, context); - G_UNLOCK (list_lock); -} - -/* must be called with list_lock taken */ -static void -gst_cuda_context_enable_peer_access (GstCudaContext * context, - GstCudaContext * peer) -{ - GstCudaContextPrivate *priv = context->priv; - GstCudaContextPrivate *peer_priv = peer->priv; - CUdevice device = priv->device; - CUdevice other_dev = peer_priv->device; - CUresult cuda_ret; - gint can_access = 0; - - cuda_ret = CuDeviceCanAccessPeer (&can_access, device, other_dev); - - if (!gst_cuda_result (cuda_ret) || !can_access) { - GST_DEBUG_OBJECT (context, - "Peer access to %" GST_PTR_FORMAT " is not allowed", peer); - return; - } - - gst_cuda_context_push (context); - if (gst_cuda_result (CuCtxEnablePeerAccess (peer_priv->context, 0))) { - GST_DEBUG_OBJECT (context, "Enable peer access to %" GST_PTR_FORMAT, peer); - g_hash_table_add (priv->accessible_peer, peer); - } - - gst_cuda_context_pop (NULL); -} - -static void -gst_cuda_context_weak_ref_notify (gpointer data, GstCudaContext * context) -{ - GList *iter; - - G_LOCK (list_lock); - context_list = g_list_remove (context_list, context); - - /* disable self -> peer access */ - if (context->priv->accessible_peer) { - GHashTableIter iter; - gpointer key; - g_hash_table_iter_init (&iter, context->priv->accessible_peer); - if (gst_cuda_context_push (context)) { - while (g_hash_table_iter_next (&iter, &key, NULL)) { - GstCudaContext *peer = GST_CUDA_CONTEXT (key); - CUcontext peer_handle = gst_cuda_context_get_handle (peer); - GST_DEBUG_OBJECT (context, - "Disable peer access to %" GST_PTR_FORMAT, peer); - gst_cuda_result (CuCtxDisablePeerAccess (peer_handle)); - } - gst_cuda_context_pop (NULL); - } - - g_hash_table_destroy (context->priv->accessible_peer); - context->priv->accessible_peer = NULL; - } - - /* disable peer -> self access */ - for (iter = context_list; iter; iter = g_list_next (iter)) { - GstCudaContext *other = (GstCudaContext *) iter->data; - GstCudaContextPrivate *other_priv = other->priv; - CUcontext self_handle; - - if (!other_priv->accessible_peer) - continue; - - if (g_hash_table_lookup (other_priv->accessible_peer, context)) { - if (gst_cuda_context_push (other)) { - self_handle = gst_cuda_context_get_handle (context); - GST_DEBUG_OBJECT (other, - "Disable peer access to %" GST_PTR_FORMAT, context); - gst_cuda_result (CuCtxDisablePeerAccess (self_handle)); - gst_cuda_context_pop (NULL); - } - - g_hash_table_remove (other_priv->accessible_peer, context); - } - } - G_UNLOCK (list_lock); -} - -static void -gst_cuda_context_finalize (GObject * object) -{ - GstCudaContext *context = GST_CUDA_CONTEXT_CAST (object); - GstCudaContextPrivate *priv = context->priv; - - if (priv->context) { - GST_DEBUG_OBJECT (context, "Destroying CUDA context %p", priv->context); - gst_cuda_result (CuCtxDestroy (priv->context)); - } - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -/** - * gst_cuda_context_new: - * @device_id: device-id for creating #GstCudaContext or -1 for auto selection - * - * Create #GstCudaContext with given device_id. If the @device_id was not -1 - * but was out of range (e.g., exceed the number of device), - * #GstCudaContext will not be created. - * - * Returns: a new #GstCudaContext or %NULL on failure - */ -GstCudaContext * -gst_cuda_context_new (gint device_id) -{ - GstCudaContext *self = - g_object_new (GST_TYPE_CUDA_CONTEXT, "cuda-device-id", device_id, NULL); - - gst_object_ref_sink (self); - - if (!self->priv->context) { - GST_ERROR ("Failed to create CUDA context"); - gst_clear_object (&self); - } - - return self; -} - -/** - * gst_cuda_context_push: - * @ctx: a #GstCudaContext to push current thread - * - * Pushes the given @ctx onto the CPU thread's stack of current contexts. - * The specified context becomes the CPU thread's current context, - * so all CUDA functions that operate on the current context are affected. - * - * Returns: %TRUE if @ctx was pushed without error. - */ -gboolean -gst_cuda_context_push (GstCudaContext * ctx) -{ - g_return_val_if_fail (ctx, FALSE); - g_return_val_if_fail (GST_IS_CUDA_CONTEXT (ctx), FALSE); - - return gst_cuda_result (CuCtxPushCurrent (ctx->priv->context)); -} - -/** - * gst_cuda_context_pop: - * - * Pops the current CUDA context from CPU thread - * - * Returns: %TRUE if @ctx was pushed without error. - */ -gboolean -gst_cuda_context_pop (CUcontext * cuda_ctx) -{ - return gst_cuda_result (CuCtxPopCurrent (cuda_ctx)); -} - -/** - * gst_cuda_context_get_handle: - * @ctx: a #GstCudaContext - * - * Get CUDA device context. Caller must not modify and/or destroy - * returned device context. - * - * Returns: the #CUcontext of @ctx - */ -gpointer -gst_cuda_context_get_handle (GstCudaContext * ctx) -{ - g_return_val_if_fail (ctx, NULL); - g_return_val_if_fail (GST_IS_CUDA_CONTEXT (ctx), NULL); - - return ctx->priv->context; -} - -/** - * gst_cuda_context_get_texture_alignment: - * @ctx: a #GstCudaContext - * - * Get required texture alignment by device - * - * Returns: the #CUcontext of @ctx - */ -gint -gst_cuda_context_get_texture_alignment (GstCudaContext * ctx) -{ - g_return_val_if_fail (ctx, 0); - g_return_val_if_fail (GST_IS_CUDA_CONTEXT (ctx), 0); - - return ctx->priv->tex_align; -} - -/** - * gst_cuda_context_can_access_peer: - * @ctx: a #GstCudaContext - * @peer: a #GstCudaContext - * - * Query whether @ctx can access any memory which belongs to @peer directly. - - * Returns: %TRUE if @ctx can access @peer directly - */ -gboolean -gst_cuda_context_can_access_peer (GstCudaContext * ctx, GstCudaContext * peer) -{ - gboolean ret = FALSE; - - g_return_val_if_fail (GST_IS_CUDA_CONTEXT (ctx), FALSE); - g_return_val_if_fail (GST_IS_CUDA_CONTEXT (peer), FALSE); - - G_LOCK (list_lock); - if (ctx->priv->accessible_peer && - g_hash_table_lookup (ctx->priv->accessible_peer, peer)) { - ret = TRUE; - } - G_UNLOCK (list_lock); - - return ret; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudacontext.h
Deleted
@@ -1,78 +0,0 @@ -/* GStreamer - * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_CUDA_CONTEXT_H__ -#define __GST_CUDA_CONTEXT_H__ - -#include <gst/gst.h> -#include <cuda.h> - -G_BEGIN_DECLS - -#define GST_TYPE_CUDA_CONTEXT (gst_cuda_context_get_type()) -#define GST_CUDA_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_CUDA_CONTEXT,GstCudaContext)) -#define GST_CUDA_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CUDA_CONTEXT,GstCudaContextClass)) -#define GST_CUDA_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CUDA_CONTEXT,GstCudaContextClass)) -#define GST_IS_CUDA_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),GST_TYPE_CUDA_CONTEXT)) -#define GST_IS_CUDA_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CUDA_CONTEXT)) -#define GST_CUDA_CONTEXT_CAST(obj) ((GstCudaContext*)(obj)) - -#define GST_CUDA_CONTEXT_TYPE "gst.cuda.context" - -typedef struct _GstCudaContext GstCudaContext; -typedef struct _GstCudaContextClass GstCudaContextClass; -typedef struct _GstCudaContextPrivate GstCudaContextPrivate; - -/* - * GstCudaContext: - */ -struct _GstCudaContext -{ - GstObject object; - - /*< private >*/ - GstCudaContextPrivate *priv; -}; - -/* - * GstCudaContextClass: - */ -struct _GstCudaContextClass -{ - GstObjectClass parent_class; -}; - -GType gst_cuda_context_get_type (void); - -GstCudaContext * gst_cuda_context_new (gint device_id); - -gboolean gst_cuda_context_push (GstCudaContext * ctx); - -gboolean gst_cuda_context_pop (CUcontext * cuda_ctx); - -gpointer gst_cuda_context_get_handle (GstCudaContext * ctx); - -gint gst_cuda_context_get_texture_alignment (GstCudaContext * ctx); - -gboolean gst_cuda_context_can_access_peer (GstCudaContext * ctx, - GstCudaContext * peer); - -G_END_DECLS - -#endif /* __GST_CUDA_CONTEXT_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudaconvert.c
Deleted
@@ -1,417 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> - * Copyright (C) 2005-2012 David Schleef <ds@schleef.org> - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * SECTION:element-cudaconvert - * @title: cudaconvert - * - * Convert video frames between supported video formats. - * - * ## Example launch line - * | - * gst-launch-1.0 -v videotestsrc ! video/x-raw,format=Y444_16LE ! cudaupload ! cudaconvert ! cudadownload ! autovideosink - * | - * This will output a test video (generated in Y444_16LE format) in a video - * window. If the video sink selected does not support Y444_16LE - * cudaconvert will automatically convert the video to a format understood - * by the video sink. - * - * Since: 1.20 - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include "gstcudaconvert.h" -#include "gstcudautils.h" - -GST_DEBUG_CATEGORY_STATIC (gst_cuda_convert_debug); -#define GST_CAT_DEFAULT gst_cuda_convert_debug - -#define gst_cuda_convert_parent_class parent_class -G_DEFINE_TYPE (GstCudaConvert, gst_cuda_convert, GST_TYPE_CUDA_BASE_FILTER); - -static GstCaps *gst_cuda_convert_transform_caps (GstBaseTransform * trans, - GstPadDirection direction, GstCaps * caps, GstCaps * filter); -static GstCaps *gst_cuda_convert_fixate_caps (GstBaseTransform * base, - GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); -static gboolean gst_cuda_convert_filter_meta (GstBaseTransform * trans, - GstQuery * query, GType api, const GstStructure * params); -static gboolean -gst_cuda_convert_set_info (GstCudaBaseTransform * btrans, GstCaps * incaps, - GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info); - -/* copies the given caps */ -static GstCaps * -gst_cuda_convert_caps_remove_format_info (GstCaps * caps) -{ - GstStructure *st; - GstCapsFeatures *f; - gint i, n; - GstCaps *res; - GstCapsFeatures *feature = - gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY); - - res = gst_caps_new_empty (); - - n = gst_caps_get_size (caps); - for (i = 0; i < n; i++) { - st = gst_caps_get_structure (caps, i); - f = gst_caps_get_features (caps, i); - - /* If this is already expressed by the existing caps - * skip this structure */ - if (i > 0 && gst_caps_is_subset_structure_full (res, st, f)) - continue; - - st = gst_structure_copy (st); - /* Only remove format info for the cases when we can actually convert */ - if (!gst_caps_features_is_any (f) - && gst_caps_features_is_equal (f, feature)) - gst_structure_remove_fields (st, "format", "colorimetry", "chroma-site", - NULL); - - gst_caps_append_structure_full (res, st, gst_caps_features_copy (f)); - } - gst_caps_features_free (feature); - - return res; -} - -/* - * This is an incomplete matrix of in formats and a score for the prefered output - * format. - * - * out: RGB24 RGB16 ARGB AYUV YUV444 YUV422 YUV420 YUV411 YUV410 PAL GRAY - * in - * RGB24 0 2 1 2 2 3 4 5 6 7 8 - * RGB16 1 0 1 2 2 3 4 5 6 7 8 - * ARGB 2 3 0 1 4 5 6 7 8 9 10 - * AYUV 3 4 1 0 2 5 6 7 8 9 10 - * YUV444 2 4 3 1 0 5 6 7 8 9 10 - * YUV422 3 5 4 2 1 0 6 7 8 9 10 - * YUV420 4 6 5 3 2 1 0 7 8 9 10 - * YUV411 4 6 5 3 2 1 7 0 8 9 10 - * YUV410 6 8 7 5 4 3 2 1 0 9 10 - * PAL 1 3 2 6 4 6 7 8 9 0 10 - * GRAY 1 4 3 2 1 5 6 7 8 9 0 - * - * PAL or GRAY are never preferred, if we can we would convert to PAL instead - * of GRAY, though - * less subsampling is preferred and if any, preferably horizontal - * We would like to keep the alpha, even if we would need to to colorspace conversion - * or lose depth. - */ -#define SCORE_FORMAT_CHANGE 1 -#define SCORE_DEPTH_CHANGE 1 -#define SCORE_ALPHA_CHANGE 1 -#define SCORE_CHROMA_W_CHANGE 1 -#define SCORE_CHROMA_H_CHANGE 1 -#define SCORE_PALETTE_CHANGE 1 - -#define SCORE_COLORSPACE_LOSS 2 /* RGB <-> YUV */ -#define SCORE_DEPTH_LOSS 4 /* change bit depth */ -#define SCORE_ALPHA_LOSS 8 /* lose the alpha channel */ -#define SCORE_CHROMA_W_LOSS 16 /* vertical subsample */ -#define SCORE_CHROMA_H_LOSS 32 /* horizontal subsample */ -#define SCORE_PALETTE_LOSS 64 /* convert to palette format */ -#define SCORE_COLOR_LOSS 128 /* convert to GRAY */ - -#define COLORSPACE_MASK (GST_VIDEO_FORMAT_FLAG_YUV | \ - GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_GRAY) -#define ALPHA_MASK (GST_VIDEO_FORMAT_FLAG_ALPHA) -#define PALETTE_MASK (GST_VIDEO_FORMAT_FLAG_PALETTE) - -/* calculate how much loss a conversion would be */ -static void -score_value (GstBaseTransform * base, const GstVideoFormatInfo * in_info, - const GValue * val, gint * min_loss, const GstVideoFormatInfo ** out_info) -{ - const gchar *fname; - const GstVideoFormatInfo *t_info; - GstVideoFormatFlags in_flags, t_flags; - gint loss; - - fname = g_value_get_string (val); - t_info = gst_video_format_get_info (gst_video_format_from_string (fname)); - if (!t_info) - return; - - /* accept input format immediately without loss */ - if (in_info == t_info) { - *min_loss = 0; - *out_info = t_info; - return; - } - - loss = SCORE_FORMAT_CHANGE; - - in_flags = GST_VIDEO_FORMAT_INFO_FLAGS (in_info); - in_flags &= ~GST_VIDEO_FORMAT_FLAG_LE; - in_flags &= ~GST_VIDEO_FORMAT_FLAG_COMPLEX; - in_flags &= ~GST_VIDEO_FORMAT_FLAG_UNPACK; - - t_flags = GST_VIDEO_FORMAT_INFO_FLAGS (t_info); - t_flags &= ~GST_VIDEO_FORMAT_FLAG_LE; - t_flags &= ~GST_VIDEO_FORMAT_FLAG_COMPLEX; - t_flags &= ~GST_VIDEO_FORMAT_FLAG_UNPACK; - - if ((t_flags & PALETTE_MASK) != (in_flags & PALETTE_MASK)) { - loss += SCORE_PALETTE_CHANGE; - if (t_flags & PALETTE_MASK) - loss += SCORE_PALETTE_LOSS; - } - - if ((t_flags & COLORSPACE_MASK) != (in_flags & COLORSPACE_MASK)) { - loss += SCORE_COLORSPACE_LOSS; - if (t_flags & GST_VIDEO_FORMAT_FLAG_GRAY) - loss += SCORE_COLOR_LOSS; - } - - if ((t_flags & ALPHA_MASK) != (in_flags & ALPHA_MASK)) { - loss += SCORE_ALPHA_CHANGE; - if (in_flags & ALPHA_MASK) - loss += SCORE_ALPHA_LOSS; - } - - if ((in_info->h_sub1) != (t_info->h_sub1)) { - loss += SCORE_CHROMA_H_CHANGE; - if ((in_info->h_sub1) < (t_info->h_sub1)) - loss += SCORE_CHROMA_H_LOSS; - } - if ((in_info->w_sub1) != (t_info->w_sub1)) { - loss += SCORE_CHROMA_W_CHANGE; - if ((in_info->w_sub1) < (t_info->w_sub1)) - loss += SCORE_CHROMA_W_LOSS; - } - - if ((in_info->bits) != (t_info->bits)) { - loss += SCORE_DEPTH_CHANGE; - if ((in_info->bits) > (t_info->bits)) - loss += SCORE_DEPTH_LOSS; - } - - GST_DEBUG_OBJECT (base, "score %s -> %s = %d", - GST_VIDEO_FORMAT_INFO_NAME (in_info), - GST_VIDEO_FORMAT_INFO_NAME (t_info), loss); - - if (loss < *min_loss) { - GST_DEBUG_OBJECT (base, "found new best %d", loss); - *out_info = t_info; - *min_loss = loss; - } -} - -static void -gst_cuda_convert_class_init (GstCudaConvertClass * klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); - GstCudaBaseTransformClass *btrans_class = - GST_CUDA_BASE_TRANSFORM_CLASS (klass); - - gst_element_class_set_static_metadata (element_class, - "CUDA Colorspace converter", - "Filter/Converter/Video/Hardware", - "Converts video from one colorspace to another using CUDA", - "Seungha Yang <seungha.yang@navercorp.com>"); - - trans_class->passthrough_on_same_caps = TRUE; - - trans_class->transform_caps = - GST_DEBUG_FUNCPTR (gst_cuda_convert_transform_caps); - trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_cuda_convert_fixate_caps); - trans_class->filter_meta = GST_DEBUG_FUNCPTR (gst_cuda_convert_filter_meta); - - btrans_class->set_info = GST_DEBUG_FUNCPTR (gst_cuda_convert_set_info); - - GST_DEBUG_CATEGORY_INIT (gst_cuda_convert_debug, - "cudaconvert", 0, "Video ColorSpace convert using CUDA"); - - gst_type_mark_as_plugin_api (GST_TYPE_CUDA_BASE_FILTER, 0); -} - -static void -gst_cuda_convert_init (GstCudaConvert * convert) -{ -} - -static GstCaps * -gst_cuda_convert_transform_caps (GstBaseTransform * trans, - GstPadDirection direction, GstCaps * caps, GstCaps * filter) -{ - GstCaps *tmp, *tmp2; - GstCaps *result; - - /* Get all possible caps that we can transform to */ - tmp = gst_cuda_convert_caps_remove_format_info (caps); - - if (filter) { - tmp2 = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST); - gst_caps_unref (tmp); - tmp = tmp2; - } - - result = tmp; - - GST_DEBUG_OBJECT (trans, "transformed %" GST_PTR_FORMAT " into %" - GST_PTR_FORMAT, caps, result); - - return result; -} - -/* fork of gstvideoconvert */ -static void -gst_cuda_convert_fixate_format (GstBaseTransform * base, GstCaps * caps, - GstCaps * result) -{ - GstStructure *ins, *outs; - const gchar *in_format; - const GstVideoFormatInfo *in_info, *out_info = NULL; - gint min_loss = G_MAXINT; - guint i, capslen; - - ins = gst_caps_get_structure (caps, 0); - in_format = gst_structure_get_string (ins, "format"); - if (!in_format) - return; - - GST_DEBUG_OBJECT (base, "source format %s", in_format); - - in_info = - gst_video_format_get_info (gst_video_format_from_string (in_format)); - if (!in_info) - return; - - outs = gst_caps_get_structure (result, 0); - - capslen = gst_caps_get_size (result); - GST_DEBUG_OBJECT (base, "iterate %d structures", capslen); - for (i = 0; i < capslen; i++) { - GstStructure *tests; - const GValue *format; - - tests = gst_caps_get_structure (result, i); - format = gst_structure_get_value (tests, "format"); - /* should not happen */ - if (format == NULL) - continue; - - if (GST_VALUE_HOLDS_LIST (format)) { - gint j, len; - - len = gst_value_list_get_size (format); - GST_DEBUG_OBJECT (base, "have %d formats", len); - for (j = 0; j < len; j++) { - const GValue *val; - - val = gst_value_list_get_value (format, j); - if (G_VALUE_HOLDS_STRING (val)) { - score_value (base, in_info, val, &min_loss, &out_info); - if (min_loss == 0) - break; - } - } - } else if (G_VALUE_HOLDS_STRING (format)) { - score_value (base, in_info, format, &min_loss, &out_info); - } - } - if (out_info) - gst_structure_set (outs, "format", G_TYPE_STRING, - GST_VIDEO_FORMAT_INFO_NAME (out_info), NULL); -} - -static GstCaps * -gst_cuda_convert_fixate_caps (GstBaseTransform * trans, - GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) -{ - GstCaps *result; - - GST_DEBUG_OBJECT (trans, "trying to fixate othercaps %" GST_PTR_FORMAT - " based on caps %" GST_PTR_FORMAT, othercaps, caps); - - result = gst_caps_intersect (othercaps, caps); - if (gst_caps_is_empty (result)) { - gst_caps_unref (result); - result = othercaps; - } else { - gst_caps_unref (othercaps); - } - - GST_DEBUG_OBJECT (trans, "now fixating %" GST_PTR_FORMAT, result); - - result = gst_caps_make_writable (result); - gst_cuda_convert_fixate_format (trans, caps, result); - - /* fixate remaining fields */ - result = gst_caps_fixate (result); - - if (direction == GST_PAD_SINK) { - if (gst_caps_is_subset (caps, result)) { - gst_caps_replace (&result, caps); - } - } - - return result; -} - -static gboolean -gst_cuda_convert_filter_meta (GstBaseTransform * trans, GstQuery * query, - GType api, const GstStructure * params) -{ - /* This element cannot passthrough the crop meta, because it would convert the - * wrong sub-region of the image, and worst, our output image may not be large - * enough for the crop to be applied later */ - if (api == GST_VIDEO_CROP_META_API_TYPE) - return FALSE; - - /* propose all other metadata upstream */ - return TRUE; -} - -static gboolean -gst_cuda_convert_set_info (GstCudaBaseTransform * btrans, GstCaps * incaps, - GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info) -{ - /* these must match */ - if (in_info->width != out_info->width || in_info->height != out_info->height - || in_info->fps_n != out_info->fps_n || in_info->fps_d != out_info->fps_d) - goto format_mismatch; - - /* if present, these must match too */ - if (in_info->par_n != out_info->par_n || in_info->par_d != out_info->par_d) - goto format_mismatch; - - /* if present, these must match too */ - if (in_info->interlace_mode != out_info->interlace_mode) - goto format_mismatch; - - return GST_CUDA_BASE_TRANSFORM_CLASS (parent_class)->set_info (btrans, incaps, - in_info, outcaps, out_info); - - /* ERRORS */ -format_mismatch: - { - GST_ERROR_OBJECT (btrans, "input and output formats do not match"); - return FALSE; - } -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudaconvert.h
Deleted
@@ -1,53 +0,0 @@ -/* GStreamer - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_CUDA_CONVERT_H__ -#define __GST_CUDA_CONVERT_H__ - -#include <gst/gst.h> - -#include "gstcudabasefilter.h" - -G_BEGIN_DECLS - -#define GST_TYPE_CUDA_CONVERT (gst_cuda_convert_get_type()) -#define GST_CUDA_CONVERT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CUDA_CONVERT,GstCudaConvert)) -#define GST_CUDA_CONVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CUDA_CONVERT,GstCudaConvertClass)) -#define GST_CUDA_CONVERT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CUDA_CONVERT,GstCudaConvertClass)) -#define GST_IS_CUDA_CONVERT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CUDA_CONVERT)) -#define GST_IS_CUDA_CONVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CUDA_CONVERT)) - -typedef struct _GstCudaConvert GstCudaConvert; -typedef struct _GstCudaConvertClass GstCudaConvertClass; - -struct _GstCudaConvert -{ - GstCudaBaseFilter parent; -}; - -struct _GstCudaConvertClass -{ - GstCudaBaseFilterClass parent_class; -}; - -GType gst_cuda_convert_get_type (void); - -G_END_DECLS - -#endif /* __GST_CUDA_CONVERT_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudadownload.c
Deleted
@@ -1,131 +0,0 @@ - -/* GStreamer - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * element-cudadownload: - * - * Downloads data from NVIDA GPU via CUDA APIs - * - * Since: 1.20 - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include "gstcudadownload.h" - -GST_DEBUG_CATEGORY_STATIC (gst_cuda_download_debug); -#define GST_CAT_DEFAULT gst_cuda_download_debug - -static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-raw(" GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY - "); video/x-raw")); - -static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-raw")); - -G_DEFINE_TYPE (GstCudaDownload, gst_cuda_download, - GST_TYPE_CUDA_BASE_TRANSFORM); - -static GstCaps *gst_cuda_download_transform_caps (GstBaseTransform * trans, - GstPadDirection direction, GstCaps * caps, GstCaps * filter); - -static void -gst_cuda_download_class_init (GstCudaDownloadClass * klass) -{ - GstElementClass *element_class; - GstBaseTransformClass *trans_class; - - element_class = GST_ELEMENT_CLASS (klass); - trans_class = GST_BASE_TRANSFORM_CLASS (klass); - - gst_element_class_add_static_pad_template (element_class, &sink_template); - gst_element_class_add_static_pad_template (element_class, &src_template); - - gst_element_class_set_static_metadata (element_class, - "CUDA downloader", "Filter/Video", - "Downloads data from NVIDA GPU via CUDA APIs", - "Seungha Yang <seungha.yang@navercorp.com>"); - - trans_class->passthrough_on_same_caps = TRUE; - - trans_class->transform_caps = - GST_DEBUG_FUNCPTR (gst_cuda_download_transform_caps); - - GST_DEBUG_CATEGORY_INIT (gst_cuda_download_debug, - "cudadownload", 0, "cudadownload Element"); -} - -static void -gst_cuda_download_init (GstCudaDownload * download) -{ -} - -static GstCaps * -_set_caps_features (const GstCaps * caps, const gchar * feature_name) -{ - GstCaps *tmp = gst_caps_copy (caps); - guint n = gst_caps_get_size (tmp); - guint i = 0; - - for (i = 0; i < n; i++) - gst_caps_set_features (tmp, i, - gst_caps_features_from_string (feature_name)); - - return tmp; -} - -static GstCaps * -gst_cuda_download_transform_caps (GstBaseTransform * trans, - GstPadDirection direction, GstCaps * caps, GstCaps * filter) -{ - GstCaps *result, *tmp; - - GST_DEBUG_OBJECT (trans, - "Transforming caps %" GST_PTR_FORMAT " in direction %s", caps, - (direction == GST_PAD_SINK) ? "sink" : "src"); - - if (direction == GST_PAD_SINK) { - tmp = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY); - tmp = gst_caps_merge (gst_caps_ref (caps), tmp); - } else { - GstCaps *newcaps; - tmp = gst_caps_ref (caps); - - newcaps = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY); - tmp = gst_caps_merge (tmp, newcaps); - } - - if (filter) { - result = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST); - gst_caps_unref (tmp); - } else { - result = tmp; - } - - GST_DEBUG_OBJECT (trans, "returning caps: %" GST_PTR_FORMAT, result); - - return result; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudadownload.h
Deleted
@@ -1,51 +0,0 @@ -/* GStreamer - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_CUDA_DOWNLOAD_H__ -#define __GST_CUDA_DOWNLOAD_H__ - -#include "gstcudabasetransform.h" - -G_BEGIN_DECLS - -#define GST_TYPE_CUDA_DOWNLOAD (gst_cuda_download_get_type()) -#define GST_CUDA_DOWNLOAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CUDA_DOWNLOAD,GstCudaDownload)) -#define GST_CUDA_DOWNLOAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CUDA_DOWNLOAD,GstCudaDownloadClass)) -#define GST_CUDA_DOWNLOAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CUDA_DOWNLOAD,GstCudaDownloadClass)) -#define GST_IS_CUDA_DOWNLOAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CUDA_DOWNLOAD)) -#define GST_IS_CUDA_DOWNLOAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CUDA_DOWNLOAD)) - -typedef struct _GstCudaDownload GstCudaDownload; -typedef struct _GstCudaDownloadClass GstCudaDownloadClass; - -struct _GstCudaDownload -{ - GstCudaBaseTransform parent; -}; - -struct _GstCudaDownloadClass -{ - GstCudaBaseTransformClass parent_class; -}; - -GType gst_cuda_download_get_type (void); - -G_END_DECLS - -#endif /* __GST_CUDA_DOWNLOAD_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudaloader.c
Deleted
@@ -1,550 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstcudaloader.h" -#include <gmodule.h> - -GST_DEBUG_CATEGORY_EXTERN (gst_nvcodec_debug); -#define GST_CAT_DEFAULT gst_nvcodec_debug - -#ifndef G_OS_WIN32 -#define CUDA_LIBNAME "libcuda.so.1" -#else -#define CUDA_LIBNAME "nvcuda.dll" -#endif - -#define LOAD_SYMBOL(name,func) G_STMT_START { \ - if (!g_module_symbol (module, G_STRINGIFY (name), (gpointer *) &vtable->func)) { \ - GST_ERROR ("Failed to load '%s' from %s, %s", G_STRINGIFY (name), filename, g_module_error()); \ - goto error; \ - } \ -} G_STMT_END; - -typedef struct _GstNvCodecCudaVTable -{ - gboolean loaded; - - CUresult (CUDAAPI * CuInit) (unsigned int Flags); - CUresult (CUDAAPI * CuGetErrorName) (CUresult error, const char **pStr); - CUresult (CUDAAPI * CuGetErrorString) (CUresult error, const char **pStr); - - CUresult (CUDAAPI * CuCtxCreate) (CUcontext * pctx, unsigned int flags, - CUdevice dev); - CUresult (CUDAAPI * CuCtxDestroy) (CUcontext ctx); - CUresult (CUDAAPI * CuCtxPopCurrent) (CUcontext * pctx); - CUresult (CUDAAPI * CuCtxPushCurrent) (CUcontext ctx); - - CUresult (CUDAAPI * CuCtxEnablePeerAccess) (CUcontext peerContext, - unsigned int Flags); - CUresult (CUDAAPI * CuCtxDisablePeerAccess) (CUcontext peerContext); - CUresult (CUDAAPI * CuGraphicsMapResources) (unsigned int count, - CUgraphicsResource * resources, CUstream hStream); - CUresult (CUDAAPI * CuGraphicsUnmapResources) (unsigned int count, - CUgraphicsResource * resources, CUstream hStream); - CUresult (CUDAAPI * CuGraphicsSubResourceGetMappedArray) (CUarray * pArray, - CUgraphicsResource resource, unsigned int arrayIndex, - unsigned int mipLevel); - CUresult (CUDAAPI * CuGraphicsResourceGetMappedPointer) (CUdeviceptr * - pDevPtr, size_t * pSize, CUgraphicsResource resource); - CUresult (CUDAAPI * - CuGraphicsUnregisterResource) (CUgraphicsResource resource); - - CUresult (CUDAAPI * CuMemAlloc) (CUdeviceptr * dptr, unsigned int bytesize); - CUresult (CUDAAPI * CuMemAllocPitch) (CUdeviceptr * dptr, size_t * pPitch, - size_t WidthInBytes, size_t Height, unsigned int ElementSizeBytes); - CUresult (CUDAAPI * CuMemAllocHost) (void **pp, unsigned int bytesize); - CUresult (CUDAAPI * CuMemcpy2D) (const CUDA_MEMCPY2D * pCopy); - CUresult (CUDAAPI * CuMemcpy2DAsync) (const CUDA_MEMCPY2D * pCopy, - CUstream hStream); - - CUresult (CUDAAPI * CuMemFree) (CUdeviceptr dptr); - CUresult (CUDAAPI * CuMemFreeHost) (void *p); - - CUresult (CUDAAPI * CuStreamCreate) (CUstream * phStream, - unsigned int Flags); - CUresult (CUDAAPI * CuStreamDestroy) (CUstream hStream); - CUresult (CUDAAPI * CuStreamSynchronize) (CUstream hStream); - - CUresult (CUDAAPI * CuDeviceGet) (CUdevice * device, int ordinal); - CUresult (CUDAAPI * CuDeviceGetCount) (int *count); - CUresult (CUDAAPI * CuDeviceGetName) (char *name, int len, CUdevice dev); - CUresult (CUDAAPI * CuDeviceGetAttribute) (int *pi, - CUdevice_attribute attrib, CUdevice dev); - CUresult (CUDAAPI * CuDeviceCanAccessPeer) (int *canAccessPeer, - CUdevice dev, CUdevice peerDev); - CUresult (CUDAAPI * CuDriverGetVersion) (int *driverVersion); - - CUresult (CUDAAPI * CuModuleLoadData) (CUmodule * module, - const void *image); - CUresult (CUDAAPI * CuModuleUnload) (CUmodule module); - CUresult (CUDAAPI * CuModuleGetFunction) (CUfunction * hfunc, - CUmodule hmod, const char *name); - CUresult (CUDAAPI * CuTexObjectCreate) (CUtexObject * pTexObject, - const CUDA_RESOURCE_DESC * pResDesc, const CUDA_TEXTURE_DESC * pTexDesc, - const CUDA_RESOURCE_VIEW_DESC * pResViewDesc); - CUresult (CUDAAPI * CuTexObjectDestroy) (CUtexObject texObject); - CUresult (CUDAAPI * CuLaunchKernel) (CUfunction f, unsigned int gridDimX, - unsigned int gridDimY, unsigned int gridDimZ, - unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ, - unsigned int sharedMemBytes, CUstream hStream, void **kernelParams, - void **extra); - - CUresult (CUDAAPI * CuGraphicsGLRegisterImage) (CUgraphicsResource * - pCudaResource, unsigned int image, unsigned int target, - unsigned int Flags); - CUresult (CUDAAPI * CuGraphicsGLRegisterBuffer) (CUgraphicsResource * - pCudaResource, unsigned int buffer, unsigned int Flags); - CUresult (CUDAAPI * - CuGraphicsResourceSetMapFlags) (CUgraphicsResource resource, - unsigned int flags); - CUresult (CUDAAPI * CuGLGetDevices) (unsigned int *pCudaDeviceCount, - CUdevice * pCudaDevices, unsigned int cudaDeviceCount, - CUGLDeviceList deviceList); -} GstNvCodecCudaVTable; - -static GstNvCodecCudaVTable gst_cuda_vtable = { 0, }; - -gboolean -gst_cuda_load_library (void) -{ - GModule *module; - const gchar *filename = CUDA_LIBNAME; - GstNvCodecCudaVTable *vtable; - - if (gst_cuda_vtable.loaded) - return TRUE; - - module = g_module_open (filename, G_MODULE_BIND_LAZY); - if (module == NULL) { - GST_WARNING ("Could not open library %s, %s", filename, g_module_error ()); - return FALSE; - } - - vtable = &gst_cuda_vtable; - - /* cuda.h */ - LOAD_SYMBOL (cuInit, CuInit); - LOAD_SYMBOL (cuGetErrorName, CuGetErrorName); - LOAD_SYMBOL (cuGetErrorString, CuGetErrorString); - LOAD_SYMBOL (cuCtxCreate, CuCtxCreate); - LOAD_SYMBOL (cuCtxDestroy, CuCtxDestroy); - LOAD_SYMBOL (cuCtxPopCurrent, CuCtxPopCurrent); - LOAD_SYMBOL (cuCtxPushCurrent, CuCtxPushCurrent); - LOAD_SYMBOL (cuCtxEnablePeerAccess, CuCtxEnablePeerAccess); - LOAD_SYMBOL (cuCtxDisablePeerAccess, CuCtxDisablePeerAccess); - - LOAD_SYMBOL (cuGraphicsMapResources, CuGraphicsMapResources); - LOAD_SYMBOL (cuGraphicsUnmapResources, CuGraphicsUnmapResources); - LOAD_SYMBOL (cuGraphicsSubResourceGetMappedArray, - CuGraphicsSubResourceGetMappedArray); - LOAD_SYMBOL (cuGraphicsResourceGetMappedPointer, - CuGraphicsResourceGetMappedPointer); - LOAD_SYMBOL (cuGraphicsUnregisterResource, CuGraphicsUnregisterResource); - - LOAD_SYMBOL (cuMemAlloc, CuMemAlloc); - LOAD_SYMBOL (cuMemAllocPitch, CuMemAllocPitch); - LOAD_SYMBOL (cuMemAllocHost, CuMemAllocHost); - LOAD_SYMBOL (cuMemcpy2D, CuMemcpy2D); - LOAD_SYMBOL (cuMemcpy2DAsync, CuMemcpy2DAsync); - - LOAD_SYMBOL (cuMemFree, CuMemFree); - LOAD_SYMBOL (cuMemFreeHost, CuMemFreeHost); - - LOAD_SYMBOL (cuStreamCreate, CuStreamCreate); - LOAD_SYMBOL (cuStreamDestroy, CuStreamDestroy); - LOAD_SYMBOL (cuStreamSynchronize, CuStreamSynchronize); - - LOAD_SYMBOL (cuDeviceGet, CuDeviceGet); - LOAD_SYMBOL (cuDeviceGetCount, CuDeviceGetCount); - LOAD_SYMBOL (cuDeviceGetName, CuDeviceGetName); - LOAD_SYMBOL (cuDeviceGetAttribute, CuDeviceGetAttribute); - LOAD_SYMBOL (cuDeviceCanAccessPeer, CuDeviceCanAccessPeer); - - LOAD_SYMBOL (cuDriverGetVersion, CuDriverGetVersion); - - LOAD_SYMBOL (cuModuleLoadData, CuModuleLoadData); - LOAD_SYMBOL (cuModuleUnload, CuModuleUnload); - LOAD_SYMBOL (cuModuleGetFunction, CuModuleGetFunction); - LOAD_SYMBOL (cuTexObjectCreate, CuTexObjectCreate); - LOAD_SYMBOL (cuTexObjectDestroy, CuTexObjectDestroy); - LOAD_SYMBOL (cuLaunchKernel, CuLaunchKernel); - - /* cudaGL.h */ - LOAD_SYMBOL (cuGraphicsGLRegisterImage, CuGraphicsGLRegisterImage); - LOAD_SYMBOL (cuGraphicsGLRegisterBuffer, CuGraphicsGLRegisterBuffer); - LOAD_SYMBOL (cuGraphicsResourceSetMapFlags, CuGraphicsResourceSetMapFlags); - LOAD_SYMBOL (cuGLGetDevices, CuGLGetDevices); - - vtable->loaded = TRUE; - - return TRUE; - -error: - g_module_close (module); - - return FALSE; -} - -CUresult CUDAAPI -CuInit (unsigned int Flags) -{ - g_assert (gst_cuda_vtable.CuInit != NULL); - - return gst_cuda_vtable.CuInit (Flags); -} - -CUresult CUDAAPI -CuGetErrorName (CUresult error, const char **pStr) -{ - g_assert (gst_cuda_vtable.CuGetErrorName != NULL); - - return gst_cuda_vtable.CuGetErrorName (error, pStr); -} - -CUresult CUDAAPI -CuGetErrorString (CUresult error, const char **pStr) -{ - g_assert (gst_cuda_vtable.CuGetErrorString != NULL); - - return gst_cuda_vtable.CuGetErrorString (error, pStr); -} - -CUresult CUDAAPI -CuCtxCreate (CUcontext * pctx, unsigned int flags, CUdevice dev) -{ - g_assert (gst_cuda_vtable.CuCtxCreate != NULL); - - return gst_cuda_vtable.CuCtxCreate (pctx, flags, dev); -} - -CUresult CUDAAPI -CuCtxDestroy (CUcontext ctx) -{ - g_assert (gst_cuda_vtable.CuCtxDestroy != NULL); - - return gst_cuda_vtable.CuCtxDestroy (ctx); -} - -CUresult CUDAAPI -CuCtxPopCurrent (CUcontext * pctx) -{ - g_assert (gst_cuda_vtable.CuCtxPopCurrent != NULL); - - return gst_cuda_vtable.CuCtxPopCurrent (pctx); -} - -CUresult CUDAAPI -CuCtxPushCurrent (CUcontext ctx) -{ - g_assert (gst_cuda_vtable.CuCtxPushCurrent != NULL); - - return gst_cuda_vtable.CuCtxPushCurrent (ctx); -} - -CUresult CUDAAPI -CuCtxEnablePeerAccess (CUcontext peerContext, unsigned int Flags) -{ - g_assert (gst_cuda_vtable.CuCtxEnablePeerAccess != NULL); - - return gst_cuda_vtable.CuCtxEnablePeerAccess (peerContext, Flags); -} - -CUresult CUDAAPI -CuCtxDisablePeerAccess (CUcontext peerContext) -{ - g_assert (gst_cuda_vtable.CuCtxDisablePeerAccess != NULL); - - return gst_cuda_vtable.CuCtxDisablePeerAccess (peerContext); -} - -CUresult CUDAAPI -CuGraphicsMapResources (unsigned int count, CUgraphicsResource * resources, - CUstream hStream) -{ - g_assert (gst_cuda_vtable.CuGraphicsMapResources != NULL); - - return gst_cuda_vtable.CuGraphicsMapResources (count, resources, hStream); -} - -CUresult CUDAAPI -CuGraphicsUnmapResources (unsigned int count, CUgraphicsResource * resources, - CUstream hStream) -{ - g_assert (gst_cuda_vtable.CuGraphicsUnmapResources != NULL); - - return gst_cuda_vtable.CuGraphicsUnmapResources (count, resources, hStream); -} - -CUresult CUDAAPI -CuGraphicsSubResourceGetMappedArray (CUarray * pArray, - CUgraphicsResource resource, unsigned int arrayIndex, unsigned int mipLevel) -{ - g_assert (gst_cuda_vtable.CuGraphicsSubResourceGetMappedArray != NULL); - - return gst_cuda_vtable.CuGraphicsSubResourceGetMappedArray (pArray, resource, - arrayIndex, mipLevel); -} - -CUresult CUDAAPI -CuGraphicsResourceGetMappedPointer (CUdeviceptr * pDevPtr, size_t * pSize, - CUgraphicsResource resource) -{ - g_assert (gst_cuda_vtable.CuGraphicsResourceGetMappedPointer != NULL); - - return gst_cuda_vtable.CuGraphicsResourceGetMappedPointer (pDevPtr, pSize, - resource); -} - -CUresult CUDAAPI -CuGraphicsUnregisterResource (CUgraphicsResource resource) -{ - g_assert (gst_cuda_vtable.CuGraphicsUnregisterResource != NULL); - - return gst_cuda_vtable.CuGraphicsUnregisterResource (resource); -} - -CUresult CUDAAPI -CuMemAlloc (CUdeviceptr * dptr, unsigned int bytesize) -{ - g_assert (gst_cuda_vtable.CuMemAlloc != NULL); - - return gst_cuda_vtable.CuMemAlloc (dptr, bytesize); -} - -CUresult CUDAAPI -CuMemAllocPitch (CUdeviceptr * dptr, size_t * pPitch, size_t WidthInBytes, - size_t Height, unsigned int ElementSizeBytes) -{ - g_assert (gst_cuda_vtable.CuMemAllocPitch != NULL); - - return gst_cuda_vtable.CuMemAllocPitch (dptr, pPitch, WidthInBytes, Height, - ElementSizeBytes); -} - -CUresult CUDAAPI -CuMemAllocHost (void **pp, unsigned int bytesize) -{ - g_assert (gst_cuda_vtable.CuMemAllocHost != NULL); - - return gst_cuda_vtable.CuMemAllocHost (pp, bytesize); -} - -CUresult CUDAAPI -CuMemcpy2D (const CUDA_MEMCPY2D * pCopy) -{ - g_assert (gst_cuda_vtable.CuMemcpy2D != NULL); - - return gst_cuda_vtable.CuMemcpy2D (pCopy); -} - -CUresult CUDAAPI -CuMemcpy2DAsync (const CUDA_MEMCPY2D * pCopy, CUstream hStream) -{ - g_assert (gst_cuda_vtable.CuMemcpy2DAsync != NULL); - - return gst_cuda_vtable.CuMemcpy2DAsync (pCopy, hStream); -} - -CUresult CUDAAPI -CuMemFree (CUdeviceptr dptr) -{ - g_assert (gst_cuda_vtable.CuMemFree != NULL); - - return gst_cuda_vtable.CuMemFree (dptr); -} - -CUresult CUDAAPI -CuMemFreeHost (void *p) -{ - g_assert (gst_cuda_vtable.CuMemFreeHost != NULL); - - return gst_cuda_vtable.CuMemFreeHost (p); -} - -CUresult CUDAAPI -CuStreamCreate (CUstream * phStream, unsigned int Flags) -{ - g_assert (gst_cuda_vtable.CuStreamCreate != NULL); - - return gst_cuda_vtable.CuStreamCreate (phStream, Flags); -} - -CUresult CUDAAPI -CuStreamDestroy (CUstream hStream) -{ - g_assert (gst_cuda_vtable.CuStreamDestroy != NULL); - - return gst_cuda_vtable.CuStreamDestroy (hStream); -} - -CUresult CUDAAPI -CuStreamSynchronize (CUstream hStream) -{ - g_assert (gst_cuda_vtable.CuStreamSynchronize != NULL); - - return gst_cuda_vtable.CuStreamSynchronize (hStream); -} - -CUresult CUDAAPI -CuDeviceGet (CUdevice * device, int ordinal) -{ - g_assert (gst_cuda_vtable.CuDeviceGet != NULL); - - return gst_cuda_vtable.CuDeviceGet (device, ordinal); -} - -CUresult CUDAAPI -CuDeviceGetCount (int *count) -{ - g_assert (gst_cuda_vtable.CuDeviceGetCount != NULL); - - return gst_cuda_vtable.CuDeviceGetCount (count); -} - -CUresult CUDAAPI -CuDeviceGetName (char *name, int len, CUdevice dev) -{ - g_assert (gst_cuda_vtable.CuDeviceGetName != NULL); - - return gst_cuda_vtable.CuDeviceGetName (name, len, dev); -} - -CUresult CUDAAPI -CuDeviceGetAttribute (int *pi, CUdevice_attribute attrib, CUdevice dev) -{ - g_assert (gst_cuda_vtable.CuDeviceGetAttribute != NULL); - - return gst_cuda_vtable.CuDeviceGetAttribute (pi, attrib, dev); -} - -CUresult CUDAAPI -CuDeviceCanAccessPeer (int *canAccessPeer, CUdevice dev, CUdevice peerDev) -{ - g_assert (gst_cuda_vtable.CuDeviceCanAccessPeer != NULL); - - return gst_cuda_vtable.CuDeviceCanAccessPeer (canAccessPeer, dev, peerDev); -} - -CUresult CUDAAPI -CuDriverGetVersion (int *driverVersion) -{ - g_assert (gst_cuda_vtable.CuDriverGetVersion != NULL); - - return gst_cuda_vtable.CuDriverGetVersion (driverVersion); -} - -CUresult CUDAAPI -CuModuleLoadData (CUmodule * module, const void *image) -{ - g_assert (gst_cuda_vtable.CuModuleLoadData != NULL); - - return gst_cuda_vtable.CuModuleLoadData (module, image); -} - -CUresult CUDAAPI -CuModuleUnload (CUmodule module) -{ - g_assert (gst_cuda_vtable.CuModuleUnload != NULL); - - return gst_cuda_vtable.CuModuleUnload (module); -} - -CUresult CUDAAPI -CuModuleGetFunction (CUfunction * hfunc, CUmodule hmod, const char *name) -{ - g_assert (gst_cuda_vtable.CuModuleGetFunction != NULL); - - return gst_cuda_vtable.CuModuleGetFunction (hfunc, hmod, name); -} - -CUresult CUDAAPI -CuTexObjectCreate (CUtexObject * pTexObject, - const CUDA_RESOURCE_DESC * pResDesc, const CUDA_TEXTURE_DESC * pTexDesc, - const CUDA_RESOURCE_VIEW_DESC * pResViewDesc) -{ - g_assert (gst_cuda_vtable.CuTexObjectCreate != NULL); - - return gst_cuda_vtable.CuTexObjectCreate (pTexObject, pResDesc, pTexDesc, - pResViewDesc); -} - -CUresult CUDAAPI -CuTexObjectDestroy (CUtexObject texObject) -{ - g_assert (gst_cuda_vtable.CuTexObjectDestroy != NULL); - - return gst_cuda_vtable.CuTexObjectDestroy (texObject); -} - -CUresult CUDAAPI -CuLaunchKernel (CUfunction f, unsigned int gridDimX, - unsigned int gridDimY, unsigned int gridDimZ, - unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ, - unsigned int sharedMemBytes, CUstream hStream, void **kernelParams, - void **extra) -{ - g_assert (gst_cuda_vtable.CuLaunchKernel != NULL); - - return gst_cuda_vtable.CuLaunchKernel (f, gridDimX, gridDimY, gridDimZ, - blockDimX, blockDimY, blockDimZ, sharedMemBytes, hStream, kernelParams, - extra); -} - -/* cudaGL.h */ -CUresult CUDAAPI -CuGraphicsGLRegisterImage (CUgraphicsResource * pCudaResource, - unsigned int image, unsigned int target, unsigned int Flags) -{ - g_assert (gst_cuda_vtable.CuGraphicsGLRegisterImage != NULL); - - return gst_cuda_vtable.CuGraphicsGLRegisterImage (pCudaResource, image, - target, Flags); -} - -CUresult CUDAAPI -CuGraphicsGLRegisterBuffer (CUgraphicsResource * pCudaResource, - unsigned int buffer, unsigned int Flags) -{ - g_assert (gst_cuda_vtable.CuGraphicsGLRegisterBuffer != NULL); - - return gst_cuda_vtable.CuGraphicsGLRegisterBuffer (pCudaResource, buffer, - Flags); -} - -CUresult CUDAAPI -CuGraphicsResourceSetMapFlags (CUgraphicsResource resource, unsigned int flags) -{ - g_assert (gst_cuda_vtable.CuGraphicsResourceSetMapFlags != NULL); - - return gst_cuda_vtable.CuGraphicsResourceSetMapFlags (resource, flags); -} - -CUresult CUDAAPI -CuGLGetDevices (unsigned int *pCudaDeviceCount, CUdevice * pCudaDevices, - unsigned int cudaDeviceCount, CUGLDeviceList deviceList) -{ - g_assert (gst_cuda_vtable.CuGLGetDevices != NULL); - - return gst_cuda_vtable.CuGLGetDevices (pCudaDeviceCount, pCudaDevices, - cudaDeviceCount, deviceList); -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudaloader.h
Deleted
@@ -1,167 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_CUDA_LOADER_H__ -#define __GST_CUDA_LOADER_H__ - -#include "stub/cuda.h" - -#include <gst/gst.h> - -G_BEGIN_DECLS - -gboolean gst_cuda_load_library (void); - -/* cuda.h */ -CUresult CUDAAPI CuInit (unsigned int Flags); - -CUresult CUDAAPI CuGetErrorName (CUresult error, - const char **pStr); - -CUresult CUDAAPI CuGetErrorString (CUresult error, - const char **pStr); - -CUresult CUDAAPI CuCtxCreate (CUcontext * pctx, - unsigned int flags, - CUdevice dev); - -CUresult CUDAAPI CuCtxDestroy (CUcontext ctx); - -CUresult CUDAAPI CuCtxPopCurrent (CUcontext * pctx); - -CUresult CUDAAPI CuCtxPushCurrent (CUcontext ctx); - -CUresult CUDAAPI CuCtxEnablePeerAccess (CUcontext peerContext, - unsigned int Flags); - -CUresult CUDAAPI CuCtxDisablePeerAccess (CUcontext peerContext); - -CUresult CUDAAPI CuGraphicsMapResources (unsigned int count, - CUgraphicsResource * resources, - CUstream hStream); - -CUresult CUDAAPI CuGraphicsUnmapResources (unsigned int count, - CUgraphicsResource * resources, - CUstream hStream); - -CUresult CUDAAPI CuGraphicsSubResourceGetMappedArray (CUarray * pArray, - CUgraphicsResource resource, - unsigned int arrayIndex, - unsigned int mipLevel); - -CUresult CUDAAPI CuGraphicsResourceGetMappedPointer (CUdeviceptr * pDevPtr, - size_t * pSize, - CUgraphicsResource resource); - -CUresult CUDAAPI CuGraphicsUnregisterResource (CUgraphicsResource resource); - -CUresult CUDAAPI CuMemAlloc (CUdeviceptr * dptr, - unsigned int bytesize); - -CUresult CUDAAPI CuMemAllocPitch (CUdeviceptr * dptr, - size_t * pPitch, - size_t WidthInBytes, - size_t Height, - unsigned int ElementSizeBytes); - -CUresult CUDAAPI CuMemAllocHost (void **pp, - unsigned int bytesize); - -CUresult CUDAAPI CuMemcpy2D (const CUDA_MEMCPY2D * pCopy); - -CUresult CUDAAPI CuMemcpy2DAsync (const CUDA_MEMCPY2D *pCopy, CUstream hStream); - -CUresult CUDAAPI CuMemFree (CUdeviceptr dptr); - -CUresult CUDAAPI CuMemFreeHost (void *p); - -CUresult CUDAAPI CuStreamCreate (CUstream *phStream, - unsigned int Flags); - -CUresult CUDAAPI CuStreamDestroy (CUstream hStream); - -CUresult CUDAAPI CuStreamSynchronize (CUstream hStream); - -CUresult CUDAAPI CuDeviceGet (CUdevice * device, - int ordinal); - -CUresult CUDAAPI CuDeviceGetCount (int *count); - -CUresult CUDAAPI CuDeviceGetName (char *name, - int len, - CUdevice dev); - -CUresult CUDAAPI CuDeviceGetAttribute (int *pi, - CUdevice_attribute attrib, - CUdevice dev); - -CUresult CUDAAPI CuDeviceCanAccessPeer (int *canAccessPeer, - CUdevice dev, - CUdevice peerDev); - -CUresult CUDAAPI CuDriverGetVersion (int * driverVersion); - -CUresult CUDAAPI CuModuleLoadData (CUmodule* module, - const void *image); - -CUresult CUDAAPI CuModuleUnload (CUmodule module); - -CUresult CUDAAPI CuModuleGetFunction (CUfunction* hfunc, - CUmodule hmod, - const char* name); - -CUresult CUDAAPI CuTexObjectCreate (CUtexObject *pTexObject, - const CUDA_RESOURCE_DESC *pResDesc, - const CUDA_TEXTURE_DESC *pTexDesc, - const CUDA_RESOURCE_VIEW_DESC *pResViewDesc); - -CUresult CUDAAPI CuTexObjectDestroy (CUtexObject texObject); - -CUresult CUDAAPI CuLaunchKernel (CUfunction f, - unsigned int gridDimX, - unsigned int gridDimY, - unsigned int gridDimZ, - unsigned int blockDimX, - unsigned int blockDimY, - unsigned int blockDimZ, - unsigned int sharedMemBytes, - CUstream hStream, - void **kernelParams, - void **extra); - -/* cudaGL.h */ -CUresult CUDAAPI CuGraphicsGLRegisterImage (CUgraphicsResource * pCudaResource, - unsigned int image, - unsigned int target, - unsigned int Flags); - -CUresult CUDAAPI CuGraphicsGLRegisterBuffer (CUgraphicsResource * pCudaResource, - unsigned int buffer, - unsigned int Flags); - -CUresult CUDAAPI CuGraphicsResourceSetMapFlags (CUgraphicsResource resource, - unsigned int flags); - -CUresult CUDAAPI CuGLGetDevices (unsigned int * pCudaDeviceCount, - CUdevice * pCudaDevices, - unsigned int cudaDeviceCount, - CUGLDeviceList deviceList); - -G_END_DECLS -#endif /* __GST_CUDA_LOADER_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudamemory.c
Deleted
@@ -1,485 +0,0 @@ -/* GStreamer - * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstcudamemory.h" -#include "gstcudautils.h" - -#include <string.h> - -GST_DEBUG_CATEGORY_STATIC (cudaallocator_debug); -#define GST_CAT_DEFAULT cudaallocator_debug -GST_DEBUG_CATEGORY_STATIC (GST_CAT_MEMORY); - -#define gst_cuda_allocator_parent_class parent_class -G_DEFINE_TYPE (GstCudaAllocator, gst_cuda_allocator, GST_TYPE_ALLOCATOR); - -static void gst_cuda_allocator_dispose (GObject * object); -static void gst_cuda_allocator_free (GstAllocator * allocator, - GstMemory * memory); - -static gpointer cuda_mem_map (GstCudaMemory * mem, gsize maxsize, - GstMapFlags flags); -static void cuda_mem_unmap_full (GstCudaMemory * mem, GstMapInfo * info); -static GstMemory *cuda_mem_copy (GstMemory * mem, gssize offset, gssize size); - -static GstMemory * -gst_cuda_allocator_dummy_alloc (GstAllocator * allocator, gsize size, - GstAllocationParams * params) -{ - g_return_val_if_reached (NULL); -} - -static void -gst_cuda_allocator_class_init (GstCudaAllocatorClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstAllocatorClass *allocator_class = GST_ALLOCATOR_CLASS (klass); - - gobject_class->dispose = gst_cuda_allocator_dispose; - - allocator_class->alloc = GST_DEBUG_FUNCPTR (gst_cuda_allocator_dummy_alloc); - allocator_class->free = GST_DEBUG_FUNCPTR (gst_cuda_allocator_free); - - GST_DEBUG_CATEGORY_INIT (cudaallocator_debug, "cudaallocator", 0, - "CUDA Allocator"); - GST_DEBUG_CATEGORY_GET (GST_CAT_MEMORY, "GST_MEMORY"); -} - -static void -gst_cuda_allocator_init (GstCudaAllocator * allocator) -{ - GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator); - - GST_DEBUG_OBJECT (allocator, "init"); - - alloc->mem_type = GST_CUDA_MEMORY_TYPE_NAME; - - alloc->mem_map = (GstMemoryMapFunction) cuda_mem_map; - alloc->mem_unmap_full = (GstMemoryUnmapFullFunction) cuda_mem_unmap_full; - alloc->mem_copy = (GstMemoryCopyFunction) cuda_mem_copy; - - GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC); -} - -static void -gst_cuda_allocator_dispose (GObject * object) -{ - GstCudaAllocator *self = GST_CUDA_ALLOCATOR_CAST (object); - - GST_DEBUG_OBJECT (self, "dispose"); - - gst_clear_object (&self->context); - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -GstMemory * -gst_cuda_allocator_alloc (GstAllocator * allocator, gsize size, - GstCudaAllocationParams * params) -{ - GstCudaAllocator *self = GST_CUDA_ALLOCATOR_CAST (allocator); - gsize maxsize = size + params->parent.prefix + params->parent.padding; - gsize align = params->parent.align; - gsize offset = params->parent.prefix; - GstMemoryFlags flags = params->parent.flags; - CUdeviceptr data; - gboolean ret = FALSE; - GstCudaMemory *mem; - GstVideoInfo *info = ¶ms->info; - gint i; - guint width, height; - gsize stride, plane_offset; - - if (!gst_cuda_context_push (self->context)) - return NULL; - - /* ensure configured alignment */ - align |= gst_memory_alignment; - /* allocate more to compensate for alignment */ - maxsize += align; - - GST_CAT_DEBUG_OBJECT (GST_CAT_MEMORY, self, "allocate new cuda memory"); - - width = GST_VIDEO_INFO_COMP_WIDTH (info, 0) * - GST_VIDEO_INFO_COMP_PSTRIDE (info, 0); - height = 0; - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) - height += GST_VIDEO_INFO_COMP_HEIGHT (info, i); - - ret = gst_cuda_result (CuMemAllocPitch (&data, &stride, width, height, 16)); - gst_cuda_context_pop (NULL); - - if (G_UNLIKELY (!ret)) { - GST_CAT_ERROR_OBJECT (GST_CAT_MEMORY, self, "CUDA allocation failure"); - return NULL; - } - - mem = g_new0 (GstCudaMemory, 1); - g_mutex_init (&mem->lock); - mem->data = data; - mem->alloc_params = *params; - mem->stride = stride; - - plane_offset = 0; - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) { - mem->offseti = plane_offset; - plane_offset += stride * GST_VIDEO_INFO_COMP_HEIGHT (info, i); - } - - mem->context = gst_object_ref (self->context); - - gst_memory_init (GST_MEMORY_CAST (mem), - flags, GST_ALLOCATOR_CAST (self), NULL, maxsize, align, offset, size); - - return GST_MEMORY_CAST (mem); -} - -static void -gst_cuda_allocator_free (GstAllocator * allocator, GstMemory * memory) -{ - GstCudaAllocator *self = GST_CUDA_ALLOCATOR_CAST (allocator); - GstCudaMemory *mem = GST_CUDA_MEMORY_CAST (memory); - - GST_CAT_DEBUG_OBJECT (GST_CAT_MEMORY, allocator, "free cuda memory"); - - g_mutex_clear (&mem->lock); - - gst_cuda_context_push (self->context); - if (mem->data) - gst_cuda_result (CuMemFree (mem->data)); - - if (mem->map_alloc_data) - gst_cuda_result (CuMemFreeHost (mem->map_alloc_data)); - - gst_cuda_context_pop (NULL); - gst_object_unref (mem->context); - - g_free (mem); -} - -/* called with lock */ -static gboolean -gst_cuda_memory_upload_transfer (GstCudaMemory * mem) -{ - gint i; - GstVideoInfo *info = &mem->alloc_params.info; - gboolean ret = TRUE; - - if (!mem->map_data) { - GST_CAT_ERROR (GST_CAT_MEMORY, "no staging memory to upload"); - return FALSE; - } - - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) { - CUDA_MEMCPY2D param = { 0, }; - - param.srcMemoryType = CU_MEMORYTYPE_HOST; - param.srcHost = - (guint8 *) mem->map_data + GST_VIDEO_INFO_PLANE_OFFSET (info, i); - param.srcPitch = GST_VIDEO_INFO_PLANE_STRIDE (info, i); - - param.dstMemoryType = CU_MEMORYTYPE_DEVICE; - param.dstDevice = mem->data + mem->offseti; - param.dstPitch = mem->stride; - param.WidthInBytes = GST_VIDEO_INFO_COMP_WIDTH (info, i) * - GST_VIDEO_INFO_COMP_PSTRIDE (info, i); - param.Height = GST_VIDEO_INFO_COMP_HEIGHT (info, i); - - if (!gst_cuda_result (CuMemcpy2DAsync (¶m, NULL))) { - GST_CAT_ERROR (GST_CAT_MEMORY, "Failed to copy %dth plane", i); - ret = FALSE; - break; - } - } - gst_cuda_result (CuStreamSynchronize (NULL)); - - return ret; -} - -/* called with lock */ -static gboolean -gst_cuda_memory_download_transfer (GstCudaMemory * mem) -{ - gint i; - GstVideoInfo *info = &mem->alloc_params.info; - - if (!mem->map_data) { - GST_CAT_ERROR (GST_CAT_MEMORY, "no staging memory to upload"); - return FALSE; - } - - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) { - CUDA_MEMCPY2D param = { 0, }; - - param.srcMemoryType = CU_MEMORYTYPE_DEVICE; - param.srcDevice = mem->data + mem->offseti; - param.srcPitch = mem->stride; - - param.dstMemoryType = CU_MEMORYTYPE_HOST; - param.dstHost = - (guint8 *) mem->map_data + GST_VIDEO_INFO_PLANE_OFFSET (info, i); - param.dstPitch = GST_VIDEO_INFO_PLANE_STRIDE (info, i); - param.WidthInBytes = GST_VIDEO_INFO_COMP_WIDTH (info, i) * - GST_VIDEO_INFO_COMP_PSTRIDE (info, i); - param.Height = GST_VIDEO_INFO_COMP_HEIGHT (info, i); - - if (!gst_cuda_result (CuMemcpy2DAsync (¶m, NULL))) { - GST_CAT_ERROR (GST_CAT_MEMORY, "Failed to copy %dth plane", i); - CuMemFreeHost (mem->map_alloc_data); - mem->map_alloc_data = mem->map_data = mem->align_data = NULL; - break; - } - } - gst_cuda_result (CuStreamSynchronize (NULL)); - - return ! !mem->map_data; -} - -static gpointer -gst_cuda_memory_device_memory_map (GstCudaMemory * mem) -{ - GstMemory *memory = GST_MEMORY_CAST (mem); - gpointer data; - gsize aoffset; - gsize align = memory->align; - - if (mem->map_data) { - return mem->map_data; - } - - GST_CAT_DEBUG (GST_CAT_MEMORY, "alloc host memory for map"); - - if (!mem->map_alloc_data) { - gsize maxsize; - guint8 *align_data; - - maxsize = memory->maxsize + align; - if (!gst_cuda_context_push (mem->context)) { - GST_CAT_ERROR (GST_CAT_MEMORY, "cannot push cuda context"); - - return NULL; - } - - if (!gst_cuda_result (CuMemAllocHost (&data, maxsize))) { - GST_CAT_ERROR (GST_CAT_MEMORY, "cannot alloc host memory"); - gst_cuda_context_pop (NULL); - - return NULL; - } - - if (!gst_cuda_context_pop (NULL)) { - GST_CAT_WARNING (GST_CAT_MEMORY, "cannot pop cuda context"); - } - - mem->map_alloc_data = data; - align_data = data; - - /* do align */ - if ((aoffset = ((guintptr) align_data & align))) { - aoffset = (align + 1) - aoffset; - align_data += aoffset; - } - mem->align_data = align_data; - - /* first memory, always need download to staging */ - GST_MINI_OBJECT_FLAG_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD); - } - - mem->map_data = mem->align_data; - - if (GST_MEMORY_FLAG_IS_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD)) { - if (!gst_cuda_context_push (mem->context)) { - GST_CAT_ERROR (GST_CAT_MEMORY, "cannot push cuda context"); - - return NULL; - } - - gst_cuda_memory_download_transfer (mem); - - if (!gst_cuda_context_pop (NULL)) { - GST_CAT_WARNING (GST_CAT_MEMORY, "cannot pop cuda context"); - } - } - - return mem->map_data; -} - -static gpointer -cuda_mem_map (GstCudaMemory * mem, gsize maxsize, GstMapFlags flags) -{ - gpointer ret = NULL; - - g_mutex_lock (&mem->lock); - mem->map_count++; - - if ((flags & GST_MAP_CUDA) == GST_MAP_CUDA) { - /* upload from staging to device memory if necessary */ - if (GST_MEMORY_FLAG_IS_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_UPLOAD)) { - if (!gst_cuda_context_push (mem->context)) { - GST_CAT_ERROR (GST_CAT_MEMORY, "cannot push cuda context"); - g_mutex_unlock (&mem->lock); - - return NULL; - } - - if (!gst_cuda_memory_upload_transfer (mem)) { - g_mutex_unlock (&mem->lock); - return NULL; - } - - gst_cuda_context_pop (NULL); - } - - GST_MEMORY_FLAG_UNSET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_UPLOAD); - - if ((flags & GST_MAP_WRITE) == GST_MAP_WRITE) - GST_MINI_OBJECT_FLAG_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD); - - g_mutex_unlock (&mem->lock); - return (gpointer) mem->data; - } - - ret = gst_cuda_memory_device_memory_map (mem); - if (ret == NULL) { - mem->map_count--; - g_mutex_unlock (&mem->lock); - return NULL; - } - - if ((flags & GST_MAP_WRITE) == GST_MAP_WRITE) - GST_MINI_OBJECT_FLAG_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_UPLOAD); - - GST_MEMORY_FLAG_UNSET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD); - - g_mutex_unlock (&mem->lock); - - return ret; -} - -static void -cuda_mem_unmap_full (GstCudaMemory * mem, GstMapInfo * info) -{ - g_mutex_lock (&mem->lock); - mem->map_count--; - GST_CAT_TRACE (GST_CAT_MEMORY, - "unmap CUDA memory %p, map count %d, have map_data %s", - mem, mem->map_count, mem->map_data ? "true" : "false"); - - if ((info->flags & GST_MAP_CUDA) == GST_MAP_CUDA) { - if ((info->flags & GST_MAP_WRITE) == GST_MAP_WRITE) - GST_MINI_OBJECT_FLAG_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD); - - g_mutex_unlock (&mem->lock); - return; - } - - if ((info->flags & GST_MAP_WRITE)) - GST_MINI_OBJECT_FLAG_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_UPLOAD); - - if (mem->map_count > 0 || !mem->map_data) { - g_mutex_unlock (&mem->lock); - return; - } - - mem->map_data = NULL; - g_mutex_unlock (&mem->lock); - - return; -} - -static GstMemory * -cuda_mem_copy (GstMemory * mem, gssize offset, gssize size) -{ - GstMemory *copy; - GstCudaMemory *src_mem = GST_CUDA_MEMORY_CAST (mem); - GstCudaMemory *dst_mem; - GstCudaContext *ctx = GST_CUDA_ALLOCATOR_CAST (mem->allocator)->context; - gint i; - GstVideoInfo *info; - - /* offset and size are ignored */ - copy = gst_cuda_allocator_alloc (mem->allocator, mem->size, - &src_mem->alloc_params); - - dst_mem = GST_CUDA_MEMORY_CAST (copy); - - info = &src_mem->alloc_params.info; - - if (!gst_cuda_context_push (ctx)) { - GST_CAT_ERROR (GST_CAT_MEMORY, "cannot push cuda context"); - gst_cuda_allocator_free (mem->allocator, copy); - - return NULL; - } - - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) { - CUDA_MEMCPY2D param = { 0, }; - - param.srcMemoryType = CU_MEMORYTYPE_DEVICE; - param.srcDevice = src_mem->data + src_mem->offseti; - param.srcPitch = src_mem->stride; - - param.dstMemoryType = CU_MEMORYTYPE_DEVICE; - param.dstDevice = dst_mem->data + dst_mem->offseti; - param.dstPitch = dst_mem->stride; - param.WidthInBytes = GST_VIDEO_INFO_COMP_WIDTH (info, i) * - GST_VIDEO_INFO_COMP_PSTRIDE (info, i); - param.Height = GST_VIDEO_INFO_COMP_HEIGHT (info, i); - - if (!gst_cuda_result (CuMemcpy2DAsync (¶m, NULL))) { - GST_CAT_ERROR_OBJECT (GST_CAT_MEMORY, - mem->allocator, "Failed to copy %dth plane", i); - gst_cuda_context_pop (NULL); - gst_cuda_allocator_free (mem->allocator, copy); - - return NULL; - } - } - - gst_cuda_result (CuStreamSynchronize (NULL)); - - if (!gst_cuda_context_pop (NULL)) { - GST_CAT_WARNING (GST_CAT_MEMORY, "cannot pop cuda context"); - } - - return copy; -} - -GstAllocator * -gst_cuda_allocator_new (GstCudaContext * context) -{ - GstCudaAllocator *allocator; - - g_return_val_if_fail (GST_IS_CUDA_CONTEXT (context), NULL); - - allocator = g_object_new (GST_TYPE_CUDA_ALLOCATOR, NULL); - allocator->context = gst_object_ref (context); - - return GST_ALLOCATOR_CAST (allocator); -} - -gboolean -gst_is_cuda_memory (GstMemory * mem) -{ - return mem != NULL && mem->allocator != NULL && - GST_IS_CUDA_ALLOCATOR (mem->allocator); -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudamemory.h
Deleted
@@ -1,138 +0,0 @@ -/* GStreamer - * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_CUDA_MEMORY_H__ -#define __GST_CUDA_MEMORY_H__ - -#include <gst/gst.h> -#include <gst/gstallocator.h> -#include <gst/video/video.h> -#include "gstcudaloader.h" -#include "gstcudacontext.h" - -G_BEGIN_DECLS - -#define GST_TYPE_CUDA_ALLOCATOR (gst_cuda_allocator_get_type()) -#define GST_CUDA_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CUDA_ALLOCATOR,GstCudaAllocator)) -#define GST_CUDA_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CUDA_ALLOCATOR,GstCudaAllocatorClass)) -#define GST_CUDA_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CUDA_ALLOCATOR,GstCudaAllocatorClass)) -#define GST_IS_CUDA_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CUDA_ALLOCATOR)) -#define GST_IS_CUDA_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CUDA_ALLOCATOR)) -#define GST_CUDA_ALLOCATOR_CAST(obj) ((GstCudaAllocator *)(obj)) -#define GST_CUDA_MEMORY_CAST(mem) ((GstCudaMemory *) (mem)) - -typedef struct _GstCudaAllocationParams GstCudaAllocationParams; -typedef struct _GstCudaAllocator GstCudaAllocator; -typedef struct _GstCudaAllocatorClass GstCudaAllocatorClass; -typedef struct _GstCudaMemory GstCudaMemory; - -/** - * GST_MAP_CUDA: - * - * Flag indicating that we should map the CUDA device memory - * instead of to system memory. - * - * Combining #GST_MAP_CUDA with #GST_MAP_WRITE has the same semantics as though - * you are writing to CUDA device/host memory. - * Conversely, combining #GST_MAP_CUDA with - * #GST_MAP_READ has the same semantics as though you are reading from - * CUDA device/host memory - */ -#define GST_MAP_CUDA (GST_MAP_FLAG_LAST << 1) - -#define GST_CUDA_MEMORY_TYPE_NAME "gst.cuda.memory" - -/** - * GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY: - * - * Name of the caps feature for indicating the use of #GstCudaMemory - */ -#define GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY "memory:CUDAMemory" - -struct _GstCudaAllocationParams -{ - GstAllocationParams parent; - - GstVideoInfo info; -}; - -struct _GstCudaAllocator -{ - GstAllocator parent; - GstCudaContext *context; -}; - -struct _GstCudaAllocatorClass -{ - GstAllocatorClass parent_class; -}; - -GType gst_cuda_allocator_get_type (void); - -GstAllocator * gst_cuda_allocator_new (GstCudaContext * context); - -GstMemory * gst_cuda_allocator_alloc (GstAllocator * allocator, - gsize size, - GstCudaAllocationParams * params); - -/** - * GstCudaMemoryTransfer: - * @GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD: the device memory needs downloading - * to the staging memory - * @GST_CUDA_MEMORY_TRANSFER_NEED_UPLOAD: the staging memory needs uploading - * to the device memory - */ -typedef enum -{ - GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD = (GST_MEMORY_FLAG_LAST << 0), - GST_CUDA_MEMORY_TRANSFER_NEED_UPLOAD = (GST_MEMORY_FLAG_LAST << 1) -} GstCudaMemoryTransfer; - -struct _GstCudaMemory -{ - GstMemory mem; - - GstCudaContext *context; - CUdeviceptr data; - - GstCudaAllocationParams alloc_params; - - /* offset and stride of CUDA device memory */ - gsize offsetGST_VIDEO_MAX_PLANES; - gint stride; - - /* allocated CUDA Host memory */ - gpointer map_alloc_data; - - /* aligned CUDA Host memory */ - guint8 *align_data; - - /* pointing align_data if the memory is mapped */ - gpointer map_data; - - gint map_count; - - GMutex lock; -}; - -gboolean gst_is_cuda_memory (GstMemory * mem); - -G_END_DECLS - -#endif /* __GST_CUDA_MEMORY_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudanvrtc.c
Deleted
@@ -1,120 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstcudanvrtc.h" - -GST_DEBUG_CATEGORY_STATIC (gst_cuda_nvrtc_debug); -#define GST_CAT_DEFAULT gst_cuda_nvrtc_debug - -static void -_init_debug (void) -{ - static gsize once_init = 0; - - if (g_once_init_enter (&once_init)) { - - GST_DEBUG_CATEGORY_INIT (gst_cuda_nvrtc_debug, "cudanvrtc", 0, - "CUDA runtime compiler"); - g_once_init_leave (&once_init, 1); - } -} - -gchar * -gst_cuda_nvrtc_compile (const gchar * source) -{ - nvrtcProgram prog; - nvrtcResult ret; - CUresult curet; - const gchar *opts = { "--gpu-architecture=compute_30" }; - gsize ptx_size; - gchar *ptx = NULL; - int driverVersion; - - g_return_val_if_fail (source != NULL, FALSE); - - _init_debug (); - - GST_TRACE ("CUDA kernel source \n%s", source); - - curet = CuDriverGetVersion (&driverVersion); - if (curet != CUDA_SUCCESS) { - GST_ERROR ("Failed to query CUDA Driver version, ret %d", curet); - return NULL; - } - - GST_DEBUG ("CUDA Driver Version %d.%d", driverVersion / 1000, - (driverVersion % 1000) / 10); - - ret = NvrtcCreateProgram (&prog, source, NULL, 0, NULL, NULL); - if (ret != NVRTC_SUCCESS) { - GST_ERROR ("couldn't create nvrtc program, ret %d", ret); - return NULL; - } - - /* Starting from CUDA 11, the lowest supported architecture is 5.2 */ - if (driverVersion >= 11000) - opts0 = "--gpu-architecture=compute_52"; - - ret = NvrtcCompileProgram (prog, 1, opts); - if (ret != NVRTC_SUCCESS) { - gsize log_size; - - GST_ERROR ("couldn't compile nvrtc program, ret %d", ret); - if (NvrtcGetProgramLogSize (prog, &log_size) == NVRTC_SUCCESS && - log_size > 0) { - gchar *compile_log = g_alloca (log_size); - if (NvrtcGetProgramLog (prog, compile_log) == NVRTC_SUCCESS) { - GST_ERROR ("nvrtc compile log %s", compile_log); - } - } - - goto error; - } - - ret = NvrtcGetPTXSize (prog, &ptx_size); - if (ret != NVRTC_SUCCESS) { - GST_ERROR ("unknown ptx size, ret %d", ret); - - goto error; - } - - ptx = g_malloc0 (ptx_size); - ret = NvrtcGetPTX (prog, ptx); - if (ret != NVRTC_SUCCESS) { - GST_ERROR ("couldn't get ptx, ret %d", ret); - g_free (ptx); - - goto error; - } - - NvrtcDestroyProgram (&prog); - - GST_TRACE ("compiled CUDA PTX %s\n", ptx); - - return ptx; - -error: - NvrtcDestroyProgram (&prog); - - return NULL; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudanvrtc.h
Deleted
@@ -1,33 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_CUDA_NVRTC_H__ -#define __GST_CUDA_NVRTC_H__ - -#include <gst/gst.h> -#include "gstcudaloader.h" -#include "gstnvrtcloader.h" - -G_BEGIN_DECLS - -gchar * gst_cuda_nvrtc_compile (const gchar * source); - -G_END_DECLS - -#endif /* __GST_CUDA_NVRTC_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudascale.c
Deleted
@@ -1,607 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> - * Copyright (C) 2005-2012 David Schleef <ds@schleef.org> - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * SECTION:element-cudascale - * @title: cudascale - * @see_also: cudaconvert - * - * This element resizes video frames. By default the element will try to - * negotiate to the same size on the source and sinkpad so that no scaling - * is needed. It is therefore safe to insert this element in a pipeline to - * get more robust behaviour without any cost if no scaling is needed. - * - * This element supports some YUV formats which are are also supported by - * nvidia encoders and decoders. - * - * ## Example pipelines - * | - * gst-launch-1.0 -v filesrc location=videotestsrc.mp4 ! qtdemux ! h264parse ! nvh264dec ! cudaconvert ! cudascale ! cudaconvert ! cudadownload ! autovideosink - * | - * Decode a mp4/h264 and display the video. If the video sink chosen - * cannot perform scaling, the video scaling will be performed by cudascale - * | - * gst-launch-1.0 -v filesrc location=videotestsrc.mp4 ! qtdemux ! h264parse ! nvh264dec ! cudaconvert ! cudascale ! cudaconvert ! cudadownload ! video/x-raw,width=100 ! autovideosink - * | - * Decode an mp4/h264 and display the video with a width of 100. - * - * Since: 1.20 - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include "gstcudascale.h" -#include "gstcudautils.h" - -GST_DEBUG_CATEGORY_STATIC (gst_cuda_scale_debug); -#define GST_CAT_DEFAULT gst_cuda_scale_debug - -#define gst_cuda_scale_parent_class parent_class -G_DEFINE_TYPE (GstCudaScale, gst_cuda_scale, GST_TYPE_CUDA_BASE_FILTER); - -static GstCaps *gst_cuda_scale_transform_caps (GstBaseTransform * trans, - GstPadDirection direction, GstCaps * caps, GstCaps * filter); -static GstCaps *gst_cuda_scale_fixate_caps (GstBaseTransform * base, - GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); -static gboolean gst_cuda_scale_set_info (GstCudaBaseTransform * filter, - GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, - GstVideoInfo * out_info); - -static void -gst_cuda_scale_class_init (GstCudaScaleClass * klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); - GstCudaBaseTransformClass *btrans_class = - GST_CUDA_BASE_TRANSFORM_CLASS (klass); - - gst_element_class_set_static_metadata (element_class, - "CUDA Video scaler", - "Filter/Converter/Video/Scaler/Hardware", - "Resizes Video using CUDA", "Seungha Yang <seungha.yang@navercorp.com>"); - - trans_class->transform_caps = - GST_DEBUG_FUNCPTR (gst_cuda_scale_transform_caps); - trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_cuda_scale_fixate_caps); - - btrans_class->set_info = GST_DEBUG_FUNCPTR (gst_cuda_scale_set_info); - - GST_DEBUG_CATEGORY_INIT (gst_cuda_scale_debug, - "cudascale", 0, "Video Resize using CUDA"); -} - -static void -gst_cuda_scale_init (GstCudaScale * cuda) -{ -} - -static GstCaps * -gst_cuda_scale_transform_caps (GstBaseTransform * trans, - GstPadDirection direction, GstCaps * caps, GstCaps * filter) -{ - GstCaps *ret; - GstStructure *structure; - GstCapsFeatures *features; - gint i, n; - - GST_DEBUG_OBJECT (trans, - "Transforming caps %" GST_PTR_FORMAT " in direction %s", caps, - (direction == GST_PAD_SINK) ? "sink" : "src"); - - ret = gst_caps_new_empty (); - n = gst_caps_get_size (caps); - for (i = 0; i < n; i++) { - structure = gst_caps_get_structure (caps, i); - features = gst_caps_get_features (caps, i); - - /* If this is already expressed by the existing caps - * skip this structure */ - if (i > 0 && gst_caps_is_subset_structure_full (ret, structure, features)) - continue; - - /* make copy */ - structure = gst_structure_copy (structure); - - gst_structure_set (structure, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, - "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); - - /* if pixel aspect ratio, make a range of it */ - if (gst_structure_has_field (structure, "pixel-aspect-ratio")) { - gst_structure_set (structure, "pixel-aspect-ratio", - GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1, NULL); - } - - gst_caps_append_structure_full (ret, structure, - gst_caps_features_copy (features)); - } - - if (filter) { - GstCaps *intersection; - - intersection = - gst_caps_intersect_full (filter, ret, GST_CAPS_INTERSECT_FIRST); - gst_caps_unref (ret); - ret = intersection; - } - - GST_DEBUG_OBJECT (trans, "returning caps: %" GST_PTR_FORMAT, ret); - - return ret; -} - -/* fork of gstvideoscale */ -static GstCaps * -gst_cuda_scale_fixate_caps (GstBaseTransform * base, GstPadDirection direction, - GstCaps * caps, GstCaps * othercaps) -{ - GstStructure *ins, *outs; - const GValue *from_par, *to_par; - GValue fpar = { 0, }, tpar = { - 0,}; - - othercaps = gst_caps_truncate (othercaps); - othercaps = gst_caps_make_writable (othercaps); - - GST_DEBUG_OBJECT (base, "trying to fixate othercaps %" GST_PTR_FORMAT - " based on caps %" GST_PTR_FORMAT, othercaps, caps); - - ins = gst_caps_get_structure (caps, 0); - outs = gst_caps_get_structure (othercaps, 0); - - from_par = gst_structure_get_value (ins, "pixel-aspect-ratio"); - to_par = gst_structure_get_value (outs, "pixel-aspect-ratio"); - - /* If we're fixating from the sinkpad we always set the PAR and - * assume that missing PAR on the sinkpad means 1/1 and - * missing PAR on the srcpad means undefined - */ - if (direction == GST_PAD_SINK) { - if (!from_par) { - g_value_init (&fpar, GST_TYPE_FRACTION); - gst_value_set_fraction (&fpar, 1, 1); - from_par = &fpar; - } - if (!to_par) { - g_value_init (&tpar, GST_TYPE_FRACTION_RANGE); - gst_value_set_fraction_range_full (&tpar, 1, G_MAXINT, G_MAXINT, 1); - to_par = &tpar; - } - } else { - if (!to_par) { - g_value_init (&tpar, GST_TYPE_FRACTION); - gst_value_set_fraction (&tpar, 1, 1); - to_par = &tpar; - - gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, - NULL); - } - if (!from_par) { - g_value_init (&fpar, GST_TYPE_FRACTION); - gst_value_set_fraction (&fpar, 1, 1); - from_par = &fpar; - } - } - - /* we have both PAR but they might not be fixated */ - { - gint from_w, from_h, from_par_n, from_par_d, to_par_n, to_par_d; - gint w = 0, h = 0; - gint from_dar_n, from_dar_d; - gint num, den; - - /* from_par should be fixed */ - g_return_val_if_fail (gst_value_is_fixed (from_par), othercaps); - - from_par_n = gst_value_get_fraction_numerator (from_par); - from_par_d = gst_value_get_fraction_denominator (from_par); - - gst_structure_get_int (ins, "width", &from_w); - gst_structure_get_int (ins, "height", &from_h); - - gst_structure_get_int (outs, "width", &w); - gst_structure_get_int (outs, "height", &h); - - /* if both width and height are already fixed, we can't do anything - * about it anymore */ - if (w && h) { - guint n, d; - - GST_DEBUG_OBJECT (base, "dimensions already set to %dx%d, not fixating", - w, h); - if (!gst_value_is_fixed (to_par)) { - if (gst_video_calculate_display_ratio (&n, &d, from_w, from_h, - from_par_n, from_par_d, w, h)) { - GST_DEBUG_OBJECT (base, "fixating to_par to %dx%d", n, d); - if (gst_structure_has_field (outs, "pixel-aspect-ratio")) - gst_structure_fixate_field_nearest_fraction (outs, - "pixel-aspect-ratio", n, d); - else if (n != d) - gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, - n, d, NULL); - } - } - goto done; - } - - /* Calculate input DAR */ - if (!gst_util_fraction_multiply (from_w, from_h, from_par_n, from_par_d, - &from_dar_n, &from_dar_d)) { - GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), - ("Error calculating the output scaled size - integer overflow")); - goto done; - } - - GST_DEBUG_OBJECT (base, "Input DAR is %d/%d", from_dar_n, from_dar_d); - - /* If either width or height are fixed there's not much we - * can do either except choosing a height or width and PAR - * that matches the DAR as good as possible - */ - if (h) { - GstStructure *tmp; - gint set_w, set_par_n, set_par_d; - - GST_DEBUG_OBJECT (base, "height is fixed (%d)", h); - - /* If the PAR is fixed too, there's not much to do - * except choosing the width that is nearest to the - * width with the same DAR */ - if (gst_value_is_fixed (to_par)) { - to_par_n = gst_value_get_fraction_numerator (to_par); - to_par_d = gst_value_get_fraction_denominator (to_par); - - GST_DEBUG_OBJECT (base, "PAR is fixed %d/%d", to_par_n, to_par_d); - - if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, to_par_d, - to_par_n, &num, &den)) { - GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), - ("Error calculating the output scaled size - integer overflow")); - goto done; - } - - w = (guint) gst_util_uint64_scale_int_round (h, num, den); - gst_structure_fixate_field_nearest_int (outs, "width", w); - - goto done; - } - - /* The PAR is not fixed and it's quite likely that we can set - * an arbitrary PAR. */ - - /* Check if we can keep the input width */ - tmp = gst_structure_copy (outs); - gst_structure_fixate_field_nearest_int (tmp, "width", from_w); - gst_structure_get_int (tmp, "width", &set_w); - - /* Might have failed but try to keep the DAR nonetheless by - * adjusting the PAR */ - if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, h, set_w, - &to_par_n, &to_par_d)) { - GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), - ("Error calculating the output scaled size - integer overflow")); - gst_structure_free (tmp); - goto done; - } - - if (!gst_structure_has_field (tmp, "pixel-aspect-ratio")) - gst_structure_set_value (tmp, "pixel-aspect-ratio", to_par); - gst_structure_fixate_field_nearest_fraction (tmp, "pixel-aspect-ratio", - to_par_n, to_par_d); - gst_structure_get_fraction (tmp, "pixel-aspect-ratio", &set_par_n, - &set_par_d); - gst_structure_free (tmp); - - /* Check if the adjusted PAR is accepted */ - if (set_par_n == to_par_n && set_par_d == to_par_d) { - if (gst_structure_has_field (outs, "pixel-aspect-ratio") || - set_par_n != set_par_d) - gst_structure_set (outs, "width", G_TYPE_INT, set_w, - "pixel-aspect-ratio", GST_TYPE_FRACTION, set_par_n, set_par_d, - NULL); - goto done; - } - - /* Otherwise scale the width to the new PAR and check if the - * adjusted with is accepted. If all that fails we can't keep - * the DAR */ - if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_par_d, - set_par_n, &num, &den)) { - GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), - ("Error calculating the output scaled size - integer overflow")); - goto done; - } - - w = (guint) gst_util_uint64_scale_int_round (h, num, den); - gst_structure_fixate_field_nearest_int (outs, "width", w); - if (gst_structure_has_field (outs, "pixel-aspect-ratio") || - set_par_n != set_par_d) - gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, - set_par_n, set_par_d, NULL); - - goto done; - } else if (w) { - GstStructure *tmp; - gint set_h, set_par_n, set_par_d; - - GST_DEBUG_OBJECT (base, "width is fixed (%d)", w); - - /* If the PAR is fixed too, there's not much to do - * except choosing the height that is nearest to the - * height with the same DAR */ - if (gst_value_is_fixed (to_par)) { - to_par_n = gst_value_get_fraction_numerator (to_par); - to_par_d = gst_value_get_fraction_denominator (to_par); - - GST_DEBUG_OBJECT (base, "PAR is fixed %d/%d", to_par_n, to_par_d); - - if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, to_par_d, - to_par_n, &num, &den)) { - GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), - ("Error calculating the output scaled size - integer overflow")); - goto done; - } - - h = (guint) gst_util_uint64_scale_int_round (w, den, num); - gst_structure_fixate_field_nearest_int (outs, "height", h); - - goto done; - } - - /* The PAR is not fixed and it's quite likely that we can set - * an arbitrary PAR. */ - - /* Check if we can keep the input height */ - tmp = gst_structure_copy (outs); - gst_structure_fixate_field_nearest_int (tmp, "height", from_h); - gst_structure_get_int (tmp, "height", &set_h); - - /* Might have failed but try to keep the DAR nonetheless by - * adjusting the PAR */ - if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_h, w, - &to_par_n, &to_par_d)) { - GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), - ("Error calculating the output scaled size - integer overflow")); - gst_structure_free (tmp); - goto done; - } - if (!gst_structure_has_field (tmp, "pixel-aspect-ratio")) - gst_structure_set_value (tmp, "pixel-aspect-ratio", to_par); - gst_structure_fixate_field_nearest_fraction (tmp, "pixel-aspect-ratio", - to_par_n, to_par_d); - gst_structure_get_fraction (tmp, "pixel-aspect-ratio", &set_par_n, - &set_par_d); - gst_structure_free (tmp); - - /* Check if the adjusted PAR is accepted */ - if (set_par_n == to_par_n && set_par_d == to_par_d) { - if (gst_structure_has_field (outs, "pixel-aspect-ratio") || - set_par_n != set_par_d) - gst_structure_set (outs, "height", G_TYPE_INT, set_h, - "pixel-aspect-ratio", GST_TYPE_FRACTION, set_par_n, set_par_d, - NULL); - goto done; - } - - /* Otherwise scale the height to the new PAR and check if the - * adjusted with is accepted. If all that fails we can't keep - * the DAR */ - if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_par_d, - set_par_n, &num, &den)) { - GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), - ("Error calculating the output scaled size - integer overflow")); - goto done; - } - - h = (guint) gst_util_uint64_scale_int_round (w, den, num); - gst_structure_fixate_field_nearest_int (outs, "height", h); - if (gst_structure_has_field (outs, "pixel-aspect-ratio") || - set_par_n != set_par_d) - gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, - set_par_n, set_par_d, NULL); - - goto done; - } else if (gst_value_is_fixed (to_par)) { - GstStructure *tmp; - gint set_h, set_w, f_h, f_w; - - to_par_n = gst_value_get_fraction_numerator (to_par); - to_par_d = gst_value_get_fraction_denominator (to_par); - - /* Calculate scale factor for the PAR change */ - if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, to_par_n, - to_par_d, &num, &den)) { - GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), - ("Error calculating the output scaled size - integer overflow")); - goto done; - } - - /* Try to keep the input height (because of interlacing) */ - tmp = gst_structure_copy (outs); - gst_structure_fixate_field_nearest_int (tmp, "height", from_h); - gst_structure_get_int (tmp, "height", &set_h); - - /* This might have failed but try to scale the width - * to keep the DAR nonetheless */ - w = (guint) gst_util_uint64_scale_int_round (set_h, num, den); - gst_structure_fixate_field_nearest_int (tmp, "width", w); - gst_structure_get_int (tmp, "width", &set_w); - gst_structure_free (tmp); - - /* We kept the DAR and the height is nearest to the original height */ - if (set_w == w) { - gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height", - G_TYPE_INT, set_h, NULL); - goto done; - } - - f_h = set_h; - f_w = set_w; - - /* If the former failed, try to keep the input width at least */ - tmp = gst_structure_copy (outs); - gst_structure_fixate_field_nearest_int (tmp, "width", from_w); - gst_structure_get_int (tmp, "width", &set_w); - - /* This might have failed but try to scale the width - * to keep the DAR nonetheless */ - h = (guint) gst_util_uint64_scale_int_round (set_w, den, num); - gst_structure_fixate_field_nearest_int (tmp, "height", h); - gst_structure_get_int (tmp, "height", &set_h); - gst_structure_free (tmp); - - /* We kept the DAR and the width is nearest to the original width */ - if (set_h == h) { - gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height", - G_TYPE_INT, set_h, NULL); - goto done; - } - - /* If all this failed, keep the dimensions with the DAR that was closest - * to the correct DAR. This changes the DAR but there's not much else to - * do here. - */ - if (set_w * ABS (set_h - h) < ABS (f_w - w) * f_h) { - f_h = set_h; - f_w = set_w; - } - gst_structure_set (outs, "width", G_TYPE_INT, f_w, "height", G_TYPE_INT, - f_h, NULL); - goto done; - } else { - GstStructure *tmp; - gint set_h, set_w, set_par_n, set_par_d, tmp2; - - /* width, height and PAR are not fixed but passthrough is not possible */ - - /* First try to keep the height and width as good as possible - * and scale PAR */ - tmp = gst_structure_copy (outs); - gst_structure_fixate_field_nearest_int (tmp, "height", from_h); - gst_structure_get_int (tmp, "height", &set_h); - gst_structure_fixate_field_nearest_int (tmp, "width", from_w); - gst_structure_get_int (tmp, "width", &set_w); - - if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_h, set_w, - &to_par_n, &to_par_d)) { - GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), - ("Error calculating the output scaled size - integer overflow")); - gst_structure_free (tmp); - goto done; - } - - if (!gst_structure_has_field (tmp, "pixel-aspect-ratio")) - gst_structure_set_value (tmp, "pixel-aspect-ratio", to_par); - gst_structure_fixate_field_nearest_fraction (tmp, "pixel-aspect-ratio", - to_par_n, to_par_d); - gst_structure_get_fraction (tmp, "pixel-aspect-ratio", &set_par_n, - &set_par_d); - gst_structure_free (tmp); - - if (set_par_n == to_par_n && set_par_d == to_par_d) { - gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height", - G_TYPE_INT, set_h, NULL); - - if (gst_structure_has_field (outs, "pixel-aspect-ratio") || - set_par_n != set_par_d) - gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, - set_par_n, set_par_d, NULL); - goto done; - } - - /* Otherwise try to scale width to keep the DAR with the set - * PAR and height */ - if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_par_d, - set_par_n, &num, &den)) { - GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), - ("Error calculating the output scaled size - integer overflow")); - goto done; - } - - w = (guint) gst_util_uint64_scale_int_round (set_h, num, den); - tmp = gst_structure_copy (outs); - gst_structure_fixate_field_nearest_int (tmp, "width", w); - gst_structure_get_int (tmp, "width", &tmp2); - gst_structure_free (tmp); - - if (tmp2 == w) { - gst_structure_set (outs, "width", G_TYPE_INT, tmp2, "height", - G_TYPE_INT, set_h, NULL); - if (gst_structure_has_field (outs, "pixel-aspect-ratio") || - set_par_n != set_par_d) - gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, - set_par_n, set_par_d, NULL); - goto done; - } - - /* ... or try the same with the height */ - h = (guint) gst_util_uint64_scale_int_round (set_w, den, num); - tmp = gst_structure_copy (outs); - gst_structure_fixate_field_nearest_int (tmp, "height", h); - gst_structure_get_int (tmp, "height", &tmp2); - gst_structure_free (tmp); - - if (tmp2 == h) { - gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height", - G_TYPE_INT, tmp2, NULL); - if (gst_structure_has_field (outs, "pixel-aspect-ratio") || - set_par_n != set_par_d) - gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, - set_par_n, set_par_d, NULL); - goto done; - } - - /* If all fails we can't keep the DAR and take the nearest values - * for everything from the first try */ - gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height", - G_TYPE_INT, set_h, NULL); - if (gst_structure_has_field (outs, "pixel-aspect-ratio") || - set_par_n != set_par_d) - gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, - set_par_n, set_par_d, NULL); - } - } - -done: - GST_DEBUG_OBJECT (base, "fixated othercaps to %" GST_PTR_FORMAT, othercaps); - - if (from_par == &fpar) - g_value_unset (&fpar); - if (to_par == &tpar) - g_value_unset (&tpar); - - return othercaps; -} - -static gboolean -gst_cuda_scale_set_info (GstCudaBaseTransform * btrans, GstCaps * incaps, - GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info) -{ - if (GST_VIDEO_INFO_WIDTH (in_info) == GST_VIDEO_INFO_WIDTH (out_info) && - GST_VIDEO_INFO_HEIGHT (in_info) == GST_VIDEO_INFO_HEIGHT (out_info) && - GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_INFO_FORMAT (out_info)) { - gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (btrans), TRUE); - } - - return GST_CUDA_BASE_TRANSFORM_CLASS (parent_class)->set_info (btrans, - incaps, in_info, outcaps, out_info); -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudascale.h
Deleted
@@ -1,59 +0,0 @@ -/* GStreamer - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_CUDA_SCALE_H__ -#define __GST_CUDA_SCALE_H__ - -#include <gst/gst.h> - -#include "gstcudabasefilter.h" -#include "cuda-converter.h" - -G_BEGIN_DECLS - -#define GST_TYPE_CUDA_SCALE (gst_cuda_scale_get_type()) -#define GST_CUDA_SCALE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CUDA_SCALE,GstCudaScale)) -#define GST_CUDA_SCALE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CUDA_SCALE,GstCudaScaleClass)) -#define GST_CUDA_SCALE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CUDA_SCALE,GstCudaScaleClass)) -#define GST_IS_CUDA_SCALE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CUDA_SCALE)) -#define GST_IS_CUDA_SCALE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CUDA_SCALE)) - -typedef struct _GstCudaScale GstCudaScale; -typedef struct _GstCudaScaleClass GstCudaScaleClass; - -struct _GstCudaScale -{ - GstCudaBaseFilter parent; - - GstCudaConverter *converter; - - CUdeviceptr in_fallback; - CUdeviceptr out_fallback; -}; - -struct _GstCudaScaleClass -{ - GstCudaBaseFilterClass parent_class; -}; - -GType gst_cuda_scale_get_type (void); - -G_END_DECLS - -#endif /* __GST_CUDA_SCALE_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudaupload.c
Deleted
@@ -1,130 +0,0 @@ -/* GStreamer - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * element-cudaupload: - * - * Uploads data to NVIDA GPU via CUDA APIs - * - * Since: 1.20 - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include "gstcudaupload.h" - -GST_DEBUG_CATEGORY_STATIC (gst_cuda_upload_debug); -#define GST_CAT_DEFAULT gst_cuda_upload_debug - -static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-raw; video/x-raw(" - GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY ")")); - -static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-raw(" GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY ")")); - -G_DEFINE_TYPE (GstCudaUpload, gst_cuda_upload, GST_TYPE_CUDA_BASE_TRANSFORM); - -static GstCaps *gst_cuda_upload_transform_caps (GstBaseTransform * trans, - GstPadDirection direction, GstCaps * caps, GstCaps * filter); - -static void -gst_cuda_upload_class_init (GstCudaUploadClass * klass) -{ - GstElementClass *element_class; - GstBaseTransformClass *trans_class; - - element_class = GST_ELEMENT_CLASS (klass); - trans_class = GST_BASE_TRANSFORM_CLASS (klass); - - gst_element_class_add_static_pad_template (element_class, &sink_template); - gst_element_class_add_static_pad_template (element_class, &src_template); - - gst_element_class_set_static_metadata (element_class, - "CUDA uploader", "Filter/Video", - "Uploads data into NVIDA GPU via CUDA APIs", - "Seungha Yang <seungha.yang@navercorp.com>"); - - trans_class->passthrough_on_same_caps = TRUE; - - trans_class->transform_caps = - GST_DEBUG_FUNCPTR (gst_cuda_upload_transform_caps); - - gst_type_mark_as_plugin_api (GST_TYPE_CUDA_BASE_TRANSFORM, 0); - GST_DEBUG_CATEGORY_INIT (gst_cuda_upload_debug, - "cudaupload", 0, "cudaupload Element"); -} - -static void -gst_cuda_upload_init (GstCudaUpload * upload) -{ -} - -static GstCaps * -_set_caps_features (const GstCaps * caps, const gchar * feature_name) -{ - GstCaps *tmp = gst_caps_copy (caps); - guint n = gst_caps_get_size (tmp); - guint i = 0; - - for (i = 0; i < n; i++) - gst_caps_set_features (tmp, i, - gst_caps_features_from_string (feature_name)); - - return tmp; -} - -static GstCaps * -gst_cuda_upload_transform_caps (GstBaseTransform * trans, - GstPadDirection direction, GstCaps * caps, GstCaps * filter) -{ - GstCaps *result, *tmp; - - GST_DEBUG_OBJECT (trans, - "Transforming caps %" GST_PTR_FORMAT " in direction %s", caps, - (direction == GST_PAD_SINK) ? "sink" : "src"); - - if (direction == GST_PAD_SINK) { - tmp = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY); - tmp = gst_caps_merge (gst_caps_ref (caps), tmp); - } else { - GstCaps *newcaps; - tmp = gst_caps_ref (caps); - - newcaps = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY); - tmp = gst_caps_merge (tmp, newcaps); - } - - if (filter) { - result = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST); - gst_caps_unref (tmp); - } else { - result = tmp; - } - - GST_DEBUG_OBJECT (trans, "returning caps: %" GST_PTR_FORMAT, result); - - return result; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudaupload.h
Deleted
@@ -1,51 +0,0 @@ -/* GStreamer - * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_CUDA_UPLOAD_H__ -#define __GST_CUDA_UPLOAD_H__ - -#include "gstcudabasetransform.h" - -G_BEGIN_DECLS - -#define GST_TYPE_CUDA_UPLOAD (gst_cuda_upload_get_type()) -#define GST_CUDA_UPLOAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CUDA_UPLOAD,GstCudaUpload)) -#define GST_CUDA_UPLOAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CUDA_UPLOAD,GstCudaUploadClass)) -#define GST_CUDA_UPLOAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CUDA_UPLOAD,GstCudaUploadClass)) -#define GST_IS_CUDA_UPLOAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CUDA_UPLOAD)) -#define GST_IS_CUDA_UPLOAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CUDA_UPLOAD)) - -typedef struct _GstCudaUpload GstCudaUpload; -typedef struct _GstCudaUploadClass GstCudaUploadClass; - -struct _GstCudaUpload -{ - GstCudaBaseTransform parent; -}; - -struct _GstCudaUploadClass -{ - GstCudaBaseTransformClass parent_class; -}; - -GType gst_cuda_upload_get_type (void); - -G_END_DECLS - -#endif /* __GST_CUDA_UPLOAD_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudautils.c
Deleted
@@ -1,584 +0,0 @@ -/* GStreamer - * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstcudautils.h" -#include "gstcudacontext.h" - -#ifdef HAVE_NVCODEC_GST_GL -#include <gst/gl/gl.h> -#include <gst/gl/gstglfuncs.h> -#endif - -GST_DEBUG_CATEGORY_STATIC (gst_cuda_utils_debug); -#define GST_CAT_DEFAULT gst_cuda_utils_debug -GST_DEBUG_CATEGORY_STATIC (GST_CAT_CONTEXT); - -static void -_init_debug (void) -{ - static gsize once_init = 0; - - if (g_once_init_enter (&once_init)) { - - GST_DEBUG_CATEGORY_INIT (gst_cuda_utils_debug, "cudautils", 0, - "CUDA utils"); - GST_DEBUG_CATEGORY_GET (GST_CAT_CONTEXT, "GST_CONTEXT"); - g_once_init_leave (&once_init, 1); - } -} - -static gboolean -pad_query (const GValue * item, GValue * value, gpointer user_data) -{ - GstPad *pad = g_value_get_object (item); - GstQuery *query = user_data; - gboolean res; - - res = gst_pad_peer_query (pad, query); - - if (res) { - g_value_set_boolean (value, TRUE); - return FALSE; - } - - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, pad, "pad peer query failed"); - return TRUE; -} - -static gboolean -run_query (GstElement * element, GstQuery * query, GstPadDirection direction) -{ - GstIterator *it; - GstIteratorFoldFunction func = pad_query; - GValue res = { 0 }; - - g_value_init (&res, G_TYPE_BOOLEAN); - g_value_set_boolean (&res, FALSE); - - /* Ask neighbor */ - if (direction == GST_PAD_SRC) - it = gst_element_iterate_src_pads (element); - else - it = gst_element_iterate_sink_pads (element); - - while (gst_iterator_fold (it, func, &res, query) == GST_ITERATOR_RESYNC) - gst_iterator_resync (it); - - gst_iterator_free (it); - - return g_value_get_boolean (&res); -} - -static void -find_cuda_context (GstElement * element, GstCudaContext ** cuda_ctx) -{ - GstQuery *query; - GstContext *ctxt; - - /* 1) Query downstream with GST_QUERY_CONTEXT for the context and - * check if upstream already has a context of the specific type - * 2) Query upstream as above. - */ - query = gst_query_new_context (GST_CUDA_CONTEXT_TYPE); - if (run_query (element, query, GST_PAD_SRC)) { - gst_query_parse_context (query, &ctxt); - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, - "found context (%p) in downstream query", ctxt); - gst_element_set_context (element, ctxt); - } - - /* although we found cuda context above, the element does not want - * to use the context. Then try to find from the other direction */ - if (*cuda_ctx == NULL && run_query (element, query, GST_PAD_SINK)) { - gst_query_parse_context (query, &ctxt); - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, - "found context (%p) in upstream query", ctxt); - gst_element_set_context (element, ctxt); - } - - if (*cuda_ctx == NULL) { - /* 3) Post a GST_MESSAGE_NEED_CONTEXT message on the bus with - * the required context type and afterwards check if a - * usable context was set now. The message could - * be handled by the parent bins of the element and the - * application. - */ - GstMessage *msg; - - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, - "posting need context message"); - msg = gst_message_new_need_context (GST_OBJECT_CAST (element), - GST_CUDA_CONTEXT_TYPE); - gst_element_post_message (element, msg); - } - - /* - * Whomever responds to the need-context message performs a - * GstElement::set_context() with the required context in which the element - * is required to update the cuda_ctx or call gst_cuda_handle_set_context(). - */ - - gst_query_unref (query); -} - -static void -context_set_cuda_context (GstContext * context, GstCudaContext * cuda_ctx) -{ - GstStructure *s; - gint device_id; - - g_return_if_fail (context != NULL); - - g_object_get (G_OBJECT (cuda_ctx), "cuda-device-id", &device_id, NULL); - - GST_CAT_LOG (GST_CAT_CONTEXT, - "setting GstCudaContext(%" GST_PTR_FORMAT - ") with cuda-device-id %d on context(%" GST_PTR_FORMAT ")", - cuda_ctx, device_id, context); - - s = gst_context_writable_structure (context); - gst_structure_set (s, GST_CUDA_CONTEXT_TYPE, GST_TYPE_CUDA_CONTEXT, - cuda_ctx, "cuda-device-id", G_TYPE_INT, device_id, NULL); -} - -/** - * gst_cuda_ensure_element_context: - * @element: the #GstElement running the query - * @device_id: preferred device-id, pass device_id >=0 when - * the device_id explicitly required. Otherwise, set -1. - * @cuda_ctx: (inout): the resulting #GstCudaContext - * - * Perform the steps necessary for retrieving a #GstCudaContext from the - * surrounding elements or from the application using the #GstContext mechanism. - * - * If the content of @cuda_ctx is not %NULL, then no #GstContext query is - * necessary for #GstCudaContext. - * - * Returns: whether a #GstCudaContext exists in @cuda_ctx - */ -gboolean -gst_cuda_ensure_element_context (GstElement * element, gint device_id, - GstCudaContext ** cuda_ctx) -{ - g_return_val_if_fail (element != NULL, FALSE); - g_return_val_if_fail (cuda_ctx != NULL, FALSE); - - _init_debug (); - - if (*cuda_ctx) - return TRUE; - - find_cuda_context (element, cuda_ctx); - if (*cuda_ctx) - return TRUE; - - /* No available CUDA context in pipeline, create new one here */ - *cuda_ctx = gst_cuda_context_new (device_id); - - if (*cuda_ctx == NULL) { - GST_CAT_ERROR_OBJECT (GST_CAT_CONTEXT, element, - "Failed to create CUDA context with device-id %d", device_id); - return FALSE; - } else { - GstContext *context; - GstMessage *msg; - - /* Propagate new CUDA context */ - - context = gst_context_new (GST_CUDA_CONTEXT_TYPE, TRUE); - context_set_cuda_context (context, *cuda_ctx); - - gst_element_set_context (element, context); - - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, - "posting have context (%p) message with CUDA context (%p)", - context, *cuda_ctx); - msg = gst_message_new_have_context (GST_OBJECT_CAST (element), context); - gst_element_post_message (GST_ELEMENT_CAST (element), msg); - } - - return TRUE; -} - -/** - * gst_cuda_handle_set_context: - * @element: a #GstElement - * @context: a #GstContext - * @device_id: preferred device-id, pass device_id >=0 when - * the device_id explicitly required. Otherwise, set -1. - * @cuda_ctx: (inout) (transfer full): location of a #GstCudaContext - * - * Helper function for implementing #GstElementClass.set_context() in - * CUDA capable elements. - * - * Retrieves the #GstCudaContext in @context and places the result in @cuda_ctx. - * - * Returns: whether the @cuda_ctx could be set successfully - */ -gboolean -gst_cuda_handle_set_context (GstElement * element, - GstContext * context, gint device_id, GstCudaContext ** cuda_ctx) -{ - const gchar *context_type; - - g_return_val_if_fail (element != NULL, FALSE); - g_return_val_if_fail (cuda_ctx != NULL, FALSE); - - _init_debug (); - - if (!context) - return FALSE; - - context_type = gst_context_get_context_type (context); - if (g_strcmp0 (context_type, GST_CUDA_CONTEXT_TYPE) == 0) { - const GstStructure *str; - GstCudaContext *other_ctx = NULL; - gint other_device_id = 0; - - /* If we had context already, will not replace it */ - if (*cuda_ctx) - return TRUE; - - str = gst_context_get_structure (context); - if (gst_structure_get (str, GST_CUDA_CONTEXT_TYPE, GST_TYPE_CUDA_CONTEXT, - &other_ctx, NULL)) { - g_object_get (other_ctx, "cuda-device-id", &other_device_id, NULL); - - if (device_id == -1 || other_device_id == device_id) { - GST_CAT_DEBUG_OBJECT (GST_CAT_CONTEXT, element, "Found CUDA context"); - *cuda_ctx = other_ctx; - - return TRUE; - } - - gst_object_unref (other_ctx); - } - } - - return FALSE; -} - -/** - * gst_cuda_handle_context_query: - * @element: a #GstElement - * @query: a #GstQuery of type %GST_QUERY_CONTEXT - * @cuda_ctx: (transfer none) (nullable): a #GstCudaContext - * - * Returns: Whether the @query was successfully responded to from the passed - * @context. - */ -gboolean -gst_cuda_handle_context_query (GstElement * element, - GstQuery * query, GstCudaContext * cuda_ctx) -{ - const gchar *context_type; - GstContext *context, *old_context; - - g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE); - g_return_val_if_fail (GST_IS_QUERY (query), FALSE); - g_return_val_if_fail (cuda_ctx == NULL - || GST_IS_CUDA_CONTEXT (cuda_ctx), FALSE); - - _init_debug (); - - GST_CAT_LOG_OBJECT (GST_CAT_CONTEXT, element, - "handle context query %" GST_PTR_FORMAT, query); - gst_query_parse_context_type (query, &context_type); - - if (cuda_ctx && g_strcmp0 (context_type, GST_CUDA_CONTEXT_TYPE) == 0) { - gst_query_parse_context (query, &old_context); - - if (old_context) - context = gst_context_copy (old_context); - else - context = gst_context_new (GST_CUDA_CONTEXT_TYPE, TRUE); - - context_set_cuda_context (context, cuda_ctx); - gst_query_set_context (query, context); - gst_context_unref (context); - GST_CAT_DEBUG_OBJECT (GST_CAT_CONTEXT, element, - "successfully set %" GST_PTR_FORMAT " on %" GST_PTR_FORMAT, cuda_ctx, - query); - - return TRUE; - } - - return FALSE; -} - -/** - * gst_context_new_cuda_context: - * @cuda_ctx: (transfer none) a #GstCudaContext - * - * Returns: (transfer full) (nullable): a new #GstContext embedding the @cuda_ctx - * or %NULL - */ -GstContext * -gst_context_new_cuda_context (GstCudaContext * cuda_ctx) -{ - GstContext *context; - - g_return_val_if_fail (GST_IS_CUDA_CONTEXT (cuda_ctx), NULL); - - context = gst_context_new (GST_CUDA_CONTEXT_TYPE, TRUE); - context_set_cuda_context (context, cuda_ctx); - - return context; -} - -static const gchar *gst_cuda_quark_strings = - { "GstCudaQuarkGraphicsResource" }; - -static GQuark gst_cuda_quark_tableGST_CUDA_QUARK_MAX; - -static void -init_cuda_quark_once (void) -{ - static gsize once_init = 0; - - if (g_once_init_enter (&once_init)) { - gint i; - - for (i = 0; i < GST_CUDA_QUARK_MAX; i++) - gst_cuda_quark_tablei = - g_quark_from_static_string (gst_cuda_quark_stringsi); - - g_once_init_leave (&once_init, 1); - } -} - -/** - * gst_cuda_quark_from_id: (skip) - * @id: a #GstCudaQuarkId - * - * Returns: the GQuark for given @id or 0 if @id is unknown value - */ -GQuark -gst_cuda_quark_from_id (GstCudaQuarkId id) -{ - g_return_val_if_fail (id < GST_CUDA_QUARK_MAX, 0); - - init_cuda_quark_once (); - _init_debug (); - - return gst_cuda_quark_tableid; -} - -/** - * gst_cuda_graphics_resource_new: (skip) - * @context: (transfer none): a #GstCudaContext - * @graphics_context: (transfer none) (nullable): a graphics API specific context object - * @type: a #GstCudaGraphicsResourceType of resource registration - * - * Create new #GstCudaGraphicsResource with given @context and @type - * - * Returns: a new #GstCudaGraphicsResource. - * Free with gst_cuda_graphics_resource_free - */ -GstCudaGraphicsResource * -gst_cuda_graphics_resource_new (GstCudaContext * - context, GstObject * graphics_context, GstCudaGraphicsResourceType type) -{ - GstCudaGraphicsResource *resource; - - g_return_val_if_fail (GST_IS_CUDA_CONTEXT (context), NULL); - - _init_debug (); - - resource = g_new0 (GstCudaGraphicsResource, 1); - resource->cuda_context = gst_object_ref (context); - if (graphics_context) - resource->graphics_context = gst_object_ref (graphics_context); - - return resource; -} - -/** - * gst_cuda_graphics_resource_register_gl_buffer: (skip) - * @resource a #GstCudaGraphicsResource - * @buffer: a GL buffer object - * @flags: a #CUgraphicsRegisterFlags - * - * Register the @buffer for access by CUDA. - * Must be called from the gl context thread with current cuda context was - * pushed on the current thread - * - * Returns: whether @buffer was registered or not - */ -gboolean -gst_cuda_graphics_resource_register_gl_buffer (GstCudaGraphicsResource * - resource, guint buffer, CUgraphicsRegisterFlags flags) -{ - CUresult cuda_ret; - - g_return_val_if_fail (resource != NULL, FALSE); - g_return_val_if_fail (resource->registered == FALSE, FALSE); - - _init_debug (); - - cuda_ret = CuGraphicsGLRegisterBuffer (&resource->resource, buffer, flags); - - if (!gst_cuda_result (cuda_ret)) - return FALSE; - - resource->registered = TRUE; - resource->type = GST_CUDA_GRAPHICS_RESOURCE_GL_BUFFER; - resource->flags = flags; - - return TRUE; -} - -/** - * gst_cuda_graphics_resource_unregister: (skip) - * @resource: a #GstCudaGraphicsResource - * - * Unregister previously registered resource. - * For GL resource, this method must be called from gl context thread. - * Also, current cuda context should be pushed on the current thread - * before calling this method. - */ -void -gst_cuda_graphics_resource_unregister (GstCudaGraphicsResource * resource) -{ - g_return_if_fail (resource != NULL); - - _init_debug (); - - if (!resource->registered) - return; - - gst_cuda_result (CuGraphicsUnregisterResource (resource->resource)); - resource->resource = NULL; - resource->registered = FALSE; - - return; -} - -/** - * gst_cuda_graphics_resource_map: (skip) - * @resource: a #GstCudaGraphicsResource - * @stream: a #CUstream - * @flags: a #CUgraphicsMapResourceFlags - * - * Map previously registered resource with map flags - * - * Returns: the #CUgraphicsResource if successful or %NULL when failed - */ -CUgraphicsResource -gst_cuda_graphics_resource_map (GstCudaGraphicsResource * resource, - CUstream stream, CUgraphicsMapResourceFlags flags) -{ - CUresult cuda_ret; - - g_return_val_if_fail (resource != NULL, NULL); - g_return_val_if_fail (resource->registered != FALSE, NULL); - - _init_debug (); - - cuda_ret = CuGraphicsResourceSetMapFlags (resource->resource, flags); - if (!gst_cuda_result (cuda_ret)) - return NULL; - - cuda_ret = CuGraphicsMapResources (1, &resource->resource, stream); - if (!gst_cuda_result (cuda_ret)) - return NULL; - - resource->mapped = TRUE; - - return resource->resource; -} - -/** - * gst_cuda_graphics_resource_unmap: (skip) - * @resource: a #GstCudaGraphicsResource - * @stream: a #CUstream - * - * Unmap previously mapped resource - */ -void -gst_cuda_graphics_resource_unmap (GstCudaGraphicsResource * resource, - CUstream stream) -{ - g_return_if_fail (resource != NULL); - g_return_if_fail (resource->registered != FALSE); - - _init_debug (); - - if (!resource->mapped) - return; - - gst_cuda_result (CuGraphicsUnmapResources (1, &resource->resource, stream)); - - resource->mapped = FALSE; -} - -#ifdef HAVE_NVCODEC_GST_GL -static void -unregister_resource_from_gl_thread (GstGLContext * gl_context, - GstCudaGraphicsResource * resource) -{ - GstCudaContext *cuda_context = resource->cuda_context; - - if (!gst_cuda_context_push (cuda_context)) { - GST_WARNING_OBJECT (cuda_context, "failed to push CUDA context"); - return; - } - - gst_cuda_graphics_resource_unregister (resource); - - if (!gst_cuda_context_pop (NULL)) { - GST_WARNING_OBJECT (cuda_context, "failed to pop CUDA context"); - } -} -#endif - -/** - * gst_cuda_graphics_resource_free: (skip) - * @resource: a #GstCudaGraphicsResource - * - * Free @resource - */ -void -gst_cuda_graphics_resource_free (GstCudaGraphicsResource * resource) -{ - g_return_if_fail (resource != NULL); - - if (resource->registered) { -#ifdef HAVE_NVCODEC_GST_GL - if (resource->type == GST_CUDA_GRAPHICS_RESOURCE_GL_BUFFER) { - gst_gl_context_thread_add ((GstGLContext *) resource->graphics_context, - (GstGLContextThreadFunc) unregister_resource_from_gl_thread, - resource); - } else -#endif - { - /* FIXME: currently opengl only */ - g_assert_not_reached (); - } - } - - gst_object_unref (resource->cuda_context); - if (resource->graphics_context) - gst_object_unref (resource->graphics_context); - g_free (resource); -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudautils.h
Deleted
@@ -1,140 +0,0 @@ -/* GStreamer - * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_CUDA_UTILS_H__ -#define __GST_CUDA_UTILS_H__ - -#include <gst/gst.h> -#include "gstcudaloader.h" -#include "gstcudacontext.h" - -G_BEGIN_DECLS - -#ifndef GST_DISABLE_GST_DEBUG -static inline gboolean -_gst_cuda_debug(CUresult result, GstDebugCategory * category, - const gchar * file, const gchar * function, gint line) -{ - const gchar *_error_name, *_error_text; - if (result != CUDA_SUCCESS) { - CuGetErrorName (result, &_error_name); - CuGetErrorString (result, &_error_text); - gst_debug_log (category, GST_LEVEL_WARNING, file, function, line, - NULL, "CUDA call failed: %s, %s", _error_name, _error_text); - - return FALSE; - } - - return TRUE; -} - -/** - * gst_cuda_result: - * @result: CUDA device API return code #CUresult - * - * Returns: %TRUE if CUDA device API call result is CUDA_SUCCESS - */ -#define gst_cuda_result(result) \ - _gst_cuda_debug(result, GST_CAT_DEFAULT, __FILE__, GST_FUNCTION, __LINE__) -#else - -static inline gboolean -_gst_cuda_debug(CUresult result, GstDebugCategory * category, - const gchar * file, const gchar * function, gint line) -{ - return result == CUDA_SUCCESS; -} - -/** - * gst_cuda_result: - * @result: CUDA device API return code #CUresult - * - * Returns: %TRUE if CUDA device API call result is CUDA_SUCCESS - */ -#define gst_cuda_result(result) \ - _gst_cuda_debug(result, NULL, __FILE__, GST_FUNCTION, __LINE__) -#endif - -typedef enum -{ - GST_CUDA_QUARK_GRAPHICS_RESOURCE = 0, - - /* end of quark list */ - GST_CUDA_QUARK_MAX = 1 -} GstCudaQuarkId; - -typedef enum -{ - GST_CUDA_GRAPHICS_RESOURCE_NONE = 0, - GST_CUDA_GRAPHICS_RESOURCE_GL_BUFFER = 1, -} GstCudaGraphicsResourceType; - -typedef struct _GstCudaGraphicsResource -{ - GstCudaContext *cuda_context; - /* GL context (or d3d11 context in the future) */ - GstObject *graphics_context; - - GstCudaGraphicsResourceType type; - CUgraphicsResource resource; - CUgraphicsRegisterFlags flags; - - gboolean registered; - gboolean mapped; -} GstCudaGraphicsResource; - -gboolean gst_cuda_ensure_element_context (GstElement * element, - gint device_id, - GstCudaContext ** cuda_ctx); - -gboolean gst_cuda_handle_set_context (GstElement * element, - GstContext * context, - gint device_id, - GstCudaContext ** cuda_ctx); - -gboolean gst_cuda_handle_context_query (GstElement * element, - GstQuery * query, - GstCudaContext * cuda_ctx); - -GstContext * gst_context_new_cuda_context (GstCudaContext * context); - -GQuark gst_cuda_quark_from_id (GstCudaQuarkId id); - -GstCudaGraphicsResource * gst_cuda_graphics_resource_new (GstCudaContext * context, - GstObject * graphics_context, - GstCudaGraphicsResourceType type); - -gboolean gst_cuda_graphics_resource_register_gl_buffer (GstCudaGraphicsResource * resource, - guint buffer, - CUgraphicsRegisterFlags flags); - -void gst_cuda_graphics_resource_unregister (GstCudaGraphicsResource * resource); - -CUgraphicsResource gst_cuda_graphics_resource_map (GstCudaGraphicsResource * resource, - CUstream stream, - CUgraphicsMapResourceFlags flags); - -void gst_cuda_graphics_resource_unmap (GstCudaGraphicsResource * resource, - CUstream stream); - -void gst_cuda_graphics_resource_free (GstCudaGraphicsResource * resource); - -G_END_DECLS - -#endif /* __GST_CUDA_UTILS_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvrtcloader.c
Deleted
@@ -1,199 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstnvrtcloader.h" -#include "gstcudaloader.h" - -#include <gmodule.h> - -GST_DEBUG_CATEGORY_EXTERN (gst_nvcodec_debug); -#define GST_CAT_DEFAULT gst_nvcodec_debug - -#ifndef G_OS_WIN32 -#define NVRTC_LIBNAME "libnvrtc.so" -#else -#define NVRTC_LIBNAME "nvrtc64_%d%d_0.dll" -#endif - -#define LOAD_SYMBOL(name,func) G_STMT_START { \ - if (!g_module_symbol (module, G_STRINGIFY (name), (gpointer *) &vtable->func)) { \ - GST_ERROR ("Failed to load '%s' from %s, %s", G_STRINGIFY (name), fname, g_module_error()); \ - goto error; \ - } \ -} G_STMT_END; - -typedef struct _GstNvCodecNvrtcVtahle -{ - gboolean loaded; - - nvrtcResult (*NvrtcCompileProgram) (nvrtcProgram prog, int numOptions, - const char **options); - nvrtcResult (*NvrtcCreateProgram) (nvrtcProgram * prog, const char *src, - const char *name, int numHeaders, const char **headers, - const char **includeNames); - nvrtcResult (*NvrtcDestroyProgram) (nvrtcProgram * prog); - nvrtcResult (*NvrtcGetPTX) (nvrtcProgram prog, char *ptx); - nvrtcResult (*NvrtcGetPTXSize) (nvrtcProgram prog, size_t * ptxSizeRet); - nvrtcResult (*NvrtcGetProgramLog) (nvrtcProgram prog, char *log); - nvrtcResult (*NvrtcGetProgramLogSize) (nvrtcProgram prog, - size_t * logSizeRet); -} GstNvCodecNvrtcVtahle; - -static GstNvCodecNvrtcVtahle gst_nvrtc_vtable = { 0, }; - -gboolean -gst_nvrtc_load_library (void) -{ - GModule *module = NULL; - gchar *filename = NULL; - const gchar *filename_env; - const gchar *fname; - gint cuda_version; - GstNvCodecNvrtcVtahle *vtable; - - if (gst_nvrtc_vtable.loaded) - return TRUE; - - CuDriverGetVersion (&cuda_version); - - fname = filename_env = g_getenv ("GST_NVCODEC_NVRTC_LIBNAME"); - if (filename_env) - module = g_module_open (filename_env, G_MODULE_BIND_LAZY); - - if (!module) { -#ifndef G_OS_WIN32 - filename = g_strdup (NVRTC_LIBNAME); - fname = filename; - module = g_module_open (filename, G_MODULE_BIND_LAZY); -#else - /* XXX: On Windows, minor version of nvrtc library might not be exactly - * same as CUDA library */ - { - gint cuda_major_version = cuda_version / 1000; - gint cuda_minor_version = (cuda_version % 1000) / 10; - gint minor_version; - - for (minor_version = cuda_minor_version; minor_version >= 0; - minor_version--) { - g_free (filename); - filename = g_strdup_printf (NVRTC_LIBNAME, cuda_major_version, - minor_version); - fname = filename; - - module = g_module_open (filename, G_MODULE_BIND_LAZY); - if (module) { - GST_INFO ("%s is available", filename); - break; - } - - GST_DEBUG ("Couldn't open library %s", filename); - } - } -#endif - } - - if (module == NULL) { - GST_WARNING ("Could not open library %s, %s", filename, g_module_error ()); - g_free (filename); - return FALSE; - } - - vtable = &gst_nvrtc_vtable; - - LOAD_SYMBOL (nvrtcCompileProgram, NvrtcCompileProgram); - LOAD_SYMBOL (nvrtcCreateProgram, NvrtcCreateProgram); - LOAD_SYMBOL (nvrtcDestroyProgram, NvrtcDestroyProgram); - LOAD_SYMBOL (nvrtcGetPTX, NvrtcGetPTX); - LOAD_SYMBOL (nvrtcGetPTXSize, NvrtcGetPTXSize); - LOAD_SYMBOL (nvrtcGetProgramLog, NvrtcGetProgramLog); - LOAD_SYMBOL (nvrtcGetProgramLogSize, NvrtcGetProgramLogSize); - - vtable->loaded = TRUE; - g_free (filename); - - return TRUE; - -error: - g_module_close (module); - g_free (filename); - - return FALSE; -} - -nvrtcResult -NvrtcCompileProgram (nvrtcProgram prog, int numOptions, const char **options) -{ - g_assert (gst_nvrtc_vtable.NvrtcCompileProgram != NULL); - - return gst_nvrtc_vtable.NvrtcCompileProgram (prog, numOptions, options); -} - -nvrtcResult -NvrtcCreateProgram (nvrtcProgram * prog, const char *src, const char *name, - int numHeaders, const char **headers, const char **includeNames) -{ - g_assert (gst_nvrtc_vtable.NvrtcCreateProgram != NULL); - - return gst_nvrtc_vtable.NvrtcCreateProgram (prog, src, name, numHeaders, - headers, includeNames); -} - -nvrtcResult -NvrtcDestroyProgram (nvrtcProgram * prog) -{ - g_assert (gst_nvrtc_vtable.NvrtcDestroyProgram != NULL); - - return gst_nvrtc_vtable.NvrtcDestroyProgram (prog); -} - -nvrtcResult -NvrtcGetPTX (nvrtcProgram prog, char *ptx) -{ - g_assert (gst_nvrtc_vtable.NvrtcGetPTX != NULL); - - return gst_nvrtc_vtable.NvrtcGetPTX (prog, ptx); -} - -nvrtcResult -NvrtcGetPTXSize (nvrtcProgram prog, size_t * ptxSizeRet) -{ - g_assert (gst_nvrtc_vtable.NvrtcGetPTXSize != NULL); - - return gst_nvrtc_vtable.NvrtcGetPTXSize (prog, ptxSizeRet); -} - -nvrtcResult -NvrtcGetProgramLog (nvrtcProgram prog, char *log) -{ - g_assert (gst_nvrtc_vtable.NvrtcGetProgramLog != NULL); - - return gst_nvrtc_vtable.NvrtcGetProgramLog (prog, log); -} - -nvrtcResult -NvrtcGetProgramLogSize (nvrtcProgram prog, size_t * logSizeRet) -{ - g_assert (gst_nvrtc_vtable.NvrtcGetProgramLogSize != NULL); - - return gst_nvrtc_vtable.NvrtcGetProgramLogSize (prog, logSizeRet); -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvrtcloader.h
Deleted
@@ -1,56 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_NVRTC_LOADER_H__ -#define __GST_NVRTC_LOADER_H__ - -#include <gst/gst.h> -#include <nvrtc.h> - -G_BEGIN_DECLS - -gboolean gst_nvrtc_load_library (void); - -nvrtcResult NvrtcCompileProgram (nvrtcProgram prog, - int numOptions, - const char** options); - -nvrtcResult NvrtcCreateProgram (nvrtcProgram* prog, - const char* src, - const char* name, - int numHeaders, - const char** headers, - const char** includeNames); - -nvrtcResult NvrtcDestroyProgram (nvrtcProgram* prog); - -nvrtcResult NvrtcGetPTX (nvrtcProgram prog, - char* ptx); - -nvrtcResult NvrtcGetPTXSize (nvrtcProgram prog, - size_t* ptxSizeRet); - -nvrtcResult NvrtcGetProgramLog (nvrtcProgram prog, - char* log); - -nvrtcResult NvrtcGetProgramLogSize (nvrtcProgram prog, - size_t* logSizeRet); - -G_END_DECLS -#endif /* __GST_NVRTC_LOADER_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/stub
Deleted
-(directory)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/stub/cuda.h
Deleted
@@ -1,225 +0,0 @@ -/* CUDA stub header - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_CUDA_STUB_H__ -#define __GST_CUDA_STUB_H__ - -#include <glib.h> - -G_BEGIN_DECLS - -typedef gpointer CUcontext; -typedef gpointer CUgraphicsResource; -typedef gpointer CUstream; -typedef gpointer CUarray; -typedef gpointer CUmodule; -typedef gpointer CUfunction; -typedef gpointer CUmipmappedArray; - -typedef guint64 CUtexObject; -typedef guintptr CUdeviceptr; -typedef gint CUdevice; - -typedef enum -{ - CUDA_SUCCESS = 0, -} CUresult; - -typedef enum -{ - CU_MEMORYTYPE_HOST = 1, - CU_MEMORYTYPE_DEVICE = 2, - CU_MEMORYTYPE_ARRAY = 3, - CU_MEMORYTYPE_UNIFIED = 4, -} CUmemorytype; - -typedef enum -{ - CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT = 14, - CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR = 75, - CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR = 76, -} CUdevice_attribute; - -typedef enum -{ - CU_GRAPHICS_REGISTER_FLAGS_NONE = 0x00, - CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY = 0x01, - CU_GRAPHICS_REGISTER_FLAGS_WRITE_DISCARD = 0x02, -} CUgraphicsRegisterFlags; - -typedef enum -{ - CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE = 0x00, - CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY = 0x01, - CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD = 0x02, -} CUgraphicsMapResourceFlags; - -typedef enum -{ - CU_STREAM_DEFAULT = 0x0, - CU_STREAM_NON_BLOCKING = 0x1 -} CUstream_flags; - -typedef enum -{ - CU_TR_FILTER_MODE_POINT = 0, - CU_TR_FILTER_MODE_LINEAR = 1 -} CUfilter_mode; - -typedef enum -{ - CU_TR_ADDRESS_MODE_WRAP = 0, - CU_TR_ADDRESS_MODE_CLAMP = 1, - CU_TR_ADDRESS_MODE_MIRROR = 2, - CU_TR_ADDRESS_MODE_BORDER = 3 -} CUaddress_mode; - -typedef enum -{ - CU_RESOURCE_TYPE_ARRAY = 0, - CU_RESOURCE_TYPE_MIPMAPPED_ARRAY = 1, - CU_RESOURCE_TYPE_LINEAR = 2, - CU_RESOURCE_TYPE_PITCH2D = 3 -} CUresourcetype; - -typedef enum -{ - CU_AD_FORMAT_UNSIGNED_INT8 = 1, - CU_AD_FORMAT_UNSIGNED_INT16 = 2, -} CUarray_format; - -typedef enum -{ - CU_RES_VIEW_FORMAT_NONE = 0, -} CUresourceViewFormat; - -typedef struct -{ - gsize srcXInBytes; - gsize srcY; - CUmemorytype srcMemoryType; - gconstpointer srcHost; - CUdeviceptr srcDevice; - CUarray srcArray; - gsize srcPitch; - - gsize dstXInBytes; - gsize dstY; - CUmemorytype dstMemoryType; - gpointer dstHost; - CUdeviceptr dstDevice; - CUarray dstArray; - gsize dstPitch; - - gsize WidthInBytes; - gsize Height; -} CUDA_MEMCPY2D; - -typedef enum -{ - CU_GL_DEVICE_LIST_ALL = 0x01, -} CUGLDeviceList; - -typedef struct -{ - CUaddress_mode addressMode3; - CUfilter_mode filterMode; - guint flags; - guint maxAnisotropy; - CUfilter_mode mipmapFilterMode; - gfloat mipmapLevelBias; - gfloat minMipmapLevelClamp; - gfloat maxMipmapLevelClamp; - gfloat borderColor4; - gint reserved12; -} CUDA_TEXTURE_DESC; - -typedef struct -{ - CUresourcetype resType; - - union { - struct { - CUarray hArray; - } array; - struct { - CUmipmappedArray hMipmappedArray; - } mipmap; - struct { - CUdeviceptr devPtr; - CUarray_format format; - guint numChannels; - gsize sizeInBytes; - } linear; - struct { - CUdeviceptr devPtr; - CUarray_format format; - guint numChannels; - gsize width; - gsize height; - gsize pitchInBytes; - } pitch2D; - struct { - gint reserved32; - } reserved; - } res; - - guint flags; -} CUDA_RESOURCE_DESC; - -typedef struct -{ - CUresourceViewFormat format; - gsize width; - gsize height; - gsize depth; - guint firstMipmapLevel; - guint lastMipmapLevel; - guint firstLayer; - guint lastLayer; - guint reserved16; -} CUDA_RESOURCE_VIEW_DESC; - -#define CUDA_VERSION 10000 - -#ifdef _WIN32 -#define CUDAAPI __stdcall -#else -#define CUDAAPI -#endif - -#define cuCtxCreate cuCtxCreate_v2 -#define cuCtxDestroy cuCtxDestroy_v2 -#define cuCtxPopCurrent cuCtxPopCurrent_v2 -#define cuCtxPushCurrent cuCtxPushCurrent_v2 -#define cuGraphicsResourceGetMappedPointer cuGraphicsResourceGetMappedPointer_v2 -#define cuGraphicsResourceSetMapFlags cuGraphicsResourceSetMapFlags_v2 - -#define cuMemAlloc cuMemAlloc_v2 -#define cuMemAllocPitch cuMemAllocPitch_v2 -#define cuMemAllocHost cuMemAllocHost_v2 -#define cuMemcpy2D cuMemcpy2D_v2 -#define cuMemcpy2DAsync cuMemcpy2DAsync_v2 -#define cuMemFree cuMemFree_v2 -#define cuGLGetDevices cuGLGetDevices_v2 - -#define CU_TRSF_READ_AS_INTEGER 1 - -G_END_DECLS - -#endif /* __GST_CUDA_STUB_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvaallocator.c
Deleted
@@ -1,1718 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Igalia, S.L. - * Author: Víctor Jáquez <vjaquez@igalia.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstvaallocator.h" - -#include <sys/types.h> -#include <unistd.h> - -#include "gstvacaps.h" -#include "gstvasurfacecopy.h" -#include "gstvavideoformat.h" -#include "vasurfaceimage.h" - -#define GST_CAT_DEFAULT gst_va_memory_debug -GST_DEBUG_CATEGORY (gst_va_memory_debug); - -static void -_init_debug_category (void) -{ -#ifndef GST_DISABLE_GST_DEBUG - static gsize _init = 0; - - if (g_once_init_enter (&_init)) { - GST_DEBUG_CATEGORY_INIT (gst_va_memory_debug, "vamemory", 0, "VA memory"); - g_once_init_leave (&_init, 1); - } -#endif -} - -/*=========================== Quarks for GstMemory ===========================*/ - -static GQuark -gst_va_buffer_surface_quark (void) -{ - static gsize surface_quark = 0; - - if (g_once_init_enter (&surface_quark)) { - GQuark quark = g_quark_from_string ("GstVaBufferSurface"); - g_once_init_leave (&surface_quark, quark); - } - - return surface_quark; -} - -static GQuark -gst_va_drm_mod_quark (void) -{ - static gsize drm_mod_quark = 0; - - if (g_once_init_enter (&drm_mod_quark)) { - GQuark quark = g_quark_from_string ("DRMModifier"); - g_once_init_leave (&drm_mod_quark, quark); - } - - return drm_mod_quark; -} - -static GQuark -gst_va_buffer_aux_surface_quark (void) -{ - static gsize surface_quark = 0; - - if (g_once_init_enter (&surface_quark)) { - GQuark quark = g_quark_from_string ("GstVaBufferAuxSurface"); - g_once_init_leave (&surface_quark, quark); - } - - return surface_quark; -} - -/*========================= GstVaBufferSurface ===============================*/ - -typedef struct _GstVaBufferSurface GstVaBufferSurface; -struct _GstVaBufferSurface -{ - GstVaDisplay *display; - VASurfaceID surface; - guint n_mems; - GstMemory *memsGST_VIDEO_MAX_PLANES; - gint ref_count; - gint ref_mems_count; -}; - -static void -gst_va_buffer_surface_unref (gpointer data) -{ - GstVaBufferSurface *buf = data; - - g_return_if_fail (buf && GST_IS_VA_DISPLAY (buf->display)); - - if (g_atomic_int_dec_and_test (&buf->ref_count)) { - GST_LOG_OBJECT (buf->display, "Destroying surface %#x", buf->surface); - va_destroy_surfaces (buf->display, &buf->surface, 1); - gst_clear_object (&buf->display); - g_slice_free (GstVaBufferSurface, buf); - } -} - -static GstVaBufferSurface * -gst_va_buffer_surface_new (VASurfaceID surface, GstVideoFormat format, - gint width, gint height) -{ - GstVaBufferSurface *buf = g_slice_new (GstVaBufferSurface); - - g_atomic_int_set (&buf->ref_count, 0); - g_atomic_int_set (&buf->ref_mems_count, 0); - buf->surface = surface; - buf->display = NULL; - buf->n_mems = 0; - - return buf; -} - -/*=========================== GstVaMemoryPool ================================*/ - -/* queue for disposed surfaces */ -typedef struct _GstVaMemoryPool GstVaMemoryPool; -struct _GstVaMemoryPool -{ - GstAtomicQueue *queue; - gint surface_count; - - GMutex lock; -}; - -#define GST_VA_MEMORY_POOL_CAST(obj) ((GstVaMemoryPool *)obj) -#define GST_VA_MEMORY_POOL_LOCK(obj) g_mutex_lock (&GST_VA_MEMORY_POOL_CAST(obj)->lock) -#define GST_VA_MEMORY_POOL_UNLOCK(obj) g_mutex_unlock (&GST_VA_MEMORY_POOL_CAST(obj)->lock) - -static void -gst_va_memory_pool_init (GstVaMemoryPool * self) -{ - self->queue = gst_atomic_queue_new (2); - - g_mutex_init (&self->lock); - - self->surface_count = 0; -} - -static void -gst_va_memory_pool_finalize (GstVaMemoryPool * self) -{ - g_mutex_clear (&self->lock); - - gst_atomic_queue_unref (self->queue); -} - -static void -gst_va_memory_pool_flush_unlocked (GstVaMemoryPool * self, - GstVaDisplay * display) -{ - GstMemory *mem; - GstVaBufferSurface *buf; - - while ((mem = gst_atomic_queue_pop (self->queue))) { - /* destroy the surface */ - buf = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), - gst_va_buffer_surface_quark ()); - if (buf) { - if (g_atomic_int_dec_and_test (&buf->ref_count)) { - GST_LOG ("Destroying surface %#x", buf->surface); - va_destroy_surfaces (display, &buf->surface, 1); - self->surface_count -= 1; /* GstVaDmabufAllocator */ - g_slice_free (GstVaBufferSurface, buf); - } - } else { - self->surface_count -= 1; /* GstVaAllocator */ - } - - GST_MINI_OBJECT_CAST (mem)->dispose = NULL; - /* when mem are pushed available queue its allocator is unref, - * then now it is required to ref the allocator here because - * memory's finalize will unref it again */ - gst_object_ref (mem->allocator); - gst_memory_unref (mem); - } -} - -static void -gst_va_memory_pool_flush (GstVaMemoryPool * self, GstVaDisplay * display) -{ - GST_VA_MEMORY_POOL_LOCK (self); - gst_va_memory_pool_flush_unlocked (self, display); - GST_VA_MEMORY_POOL_UNLOCK (self); -} - -static inline void -gst_va_memory_pool_push (GstVaMemoryPool * self, GstMemory * mem) -{ - gst_atomic_queue_push (self->queue, gst_memory_ref (mem)); -} - -static inline GstMemory * -gst_va_memory_pool_pop (GstVaMemoryPool * self) -{ - return gst_atomic_queue_pop (self->queue); -} - -static inline GstMemory * -gst_va_memory_pool_peek (GstVaMemoryPool * self) -{ - return gst_atomic_queue_peek (self->queue); -} - -static inline guint -gst_va_memory_pool_surface_count (GstVaMemoryPool * self) -{ - return g_atomic_int_get (&self->surface_count); -} - -static inline void -gst_va_memory_pool_surface_inc (GstVaMemoryPool * self) -{ - g_atomic_int_inc (&self->surface_count); -} - -/*=========================== GstVaDmabufAllocator ===========================*/ - -struct _GstVaDmabufAllocator -{ - GstDmaBufAllocator parent; - - GstVaDisplay *display; - - GstMemoryMapFunction parent_map; - GstMemoryCopyFunction parent_copy; - - GstVideoInfo info; - guint usage_hint; - - GstVaSurfaceCopy *copy; - - GstVaMemoryPool pool; -}; - -#define gst_va_dmabuf_allocator_parent_class dmabuf_parent_class -G_DEFINE_TYPE_WITH_CODE (GstVaDmabufAllocator, gst_va_dmabuf_allocator, - GST_TYPE_DMABUF_ALLOCATOR, _init_debug_category ()); - -static GstVaSurfaceCopy * -_ensure_surface_copy (GstVaSurfaceCopy ** old, GstVaDisplay * display, - GstVideoInfo * info) -{ - GstVaSurfaceCopy *surface_copy; - - surface_copy = g_atomic_pointer_get (old); - if (!surface_copy) { - surface_copy = gst_va_surface_copy_new (display, info); - - /* others create a new one and set it before us */ - if (surface_copy && - !g_atomic_pointer_compare_and_exchange (old, NULL, surface_copy)) { - gst_va_surface_copy_free (surface_copy); - surface_copy = g_atomic_pointer_get (old); - } - } - - return surface_copy; -} - -/* If a buffer contains multiple memories (dmabuf objects) its very - * difficult to provide a realiable way to fast-copy single memories: - * While VA API sees surfaces with dependant dmabufs, GStreamer only - * copies dmabufs in isolation; trying to solve it while keeping a - * reference of the copied buffer and dmabuf index is very fragile. */ -static GstMemory * -gst_va_dmabuf_mem_copy (GstMemory * gmem, gssize offset, gssize size) -{ - GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (gmem->allocator); - GstVaBufferSurface *buf; - guint64 *drm_mod; - gsize mem_size; - - buf = gst_mini_object_get_qdata (GST_MINI_OBJECT (gmem), - gst_va_buffer_surface_quark ()); - - drm_mod = gst_mini_object_get_qdata (GST_MINI_OBJECT (gmem), - gst_va_drm_mod_quark ()); - - /* 0 is DRM_FORMAT_MOD_LINEAR, we do not include its header now. */ - if (buf->n_mems > 1 && *drm_mod != 0) { - GST_ERROR_OBJECT (self, "Failed to copy multi-dmabuf because non-linear " - "modifier: %#lx.", *drm_mod); - return NULL; - } - - /* check if it's full memory copy */ - mem_size = gst_memory_get_sizes (gmem, NULL, NULL); - - if (size == -1) - size = mem_size > offset ? mem_size - offset : 0; - - /* @XXX: if one-memory buffer it's possible to copy */ - if (offset == 0 && size == mem_size && buf->n_mems == 1) { - GstVaBufferSurface *buf_copy = NULL; - GstMemory *copy; - GstVaSurfaceCopy *copy_func; - - GST_VA_MEMORY_POOL_LOCK (&self->pool); - copy = gst_va_memory_pool_pop (&self->pool); - GST_VA_MEMORY_POOL_UNLOCK (&self->pool); - - if (copy) { - gst_object_ref (copy->allocator); - - buf_copy = gst_mini_object_get_qdata (GST_MINI_OBJECT (copy), - gst_va_buffer_surface_quark ()); - - g_assert (g_atomic_int_get (&buf_copy->ref_mems_count) == 0); - - g_atomic_int_add (&buf_copy->ref_mems_count, 1); - } else { - GstBuffer *buffer = gst_buffer_new (); - - if (!gst_va_dmabuf_allocator_setup_buffer (gmem->allocator, buffer)) { - GST_WARNING_OBJECT (self, "Failed to create a new dmabuf memory"); - return NULL; - } - - copy = gst_buffer_get_memory (buffer, 0); - gst_buffer_unref (buffer); - - buf_copy = gst_mini_object_get_qdata (GST_MINI_OBJECT (copy), - gst_va_buffer_surface_quark ()); - } - - g_assert (buf_copy->n_mems == 1); - - copy_func = _ensure_surface_copy (&self->copy, self->display, &self->info); - if (copy_func && gst_va_surface_copy (copy_func, buf_copy->surface, - buf->surface)) - return copy; - - gst_memory_unref (copy); - - /* try system memory */ - } - - if (*drm_mod != 0) { - GST_ERROR_OBJECT (self, "Failed to copy dmabuf because non-linear " - "modifier: %#lx.", *drm_mod); - return NULL; - } - - /* fallback to system memory */ - return self->parent_copy (gmem, offset, size); - -} - -static gpointer -gst_va_dmabuf_mem_map (GstMemory * gmem, gsize maxsize, GstMapFlags flags) -{ - GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (gmem->allocator); - VASurfaceID surface = gst_va_memory_get_surface (gmem); - guint64 *drm_mod; - - drm_mod = gst_mini_object_get_qdata (GST_MINI_OBJECT (gmem), - gst_va_drm_mod_quark ()); - - /* 0 is DRM_FORMAT_MOD_LINEAR, we do not include its header now. */ - if (*drm_mod != 0) { - GST_ERROR_OBJECT (self, "Failed to map the dmabuf because the modifier " - "is: %#lx, which is not linear.", *drm_mod); - return NULL; - } - - va_sync_surface (self->display, surface); - - return self->parent_map (gmem, maxsize, flags); -} - -static void -gst_va_dmabuf_allocator_finalize (GObject * object) -{ - GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (object); - - g_clear_pointer (&self->copy, gst_va_surface_copy_free); - gst_va_memory_pool_finalize (&self->pool); - gst_clear_object (&self->display); - - G_OBJECT_CLASS (dmabuf_parent_class)->finalize (object); -} - -static void -gst_va_dmabuf_allocator_dispose (GObject * object) -{ - GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (object); - - gst_va_memory_pool_flush_unlocked (&self->pool, self->display); - if (gst_va_memory_pool_surface_count (&self->pool) != 0) { - GST_WARNING_OBJECT (self, "Surfaces leaked: %d", - gst_va_memory_pool_surface_count (&self->pool)); - } - - G_OBJECT_CLASS (dmabuf_parent_class)->dispose (object); -} - -static void -gst_va_dmabuf_allocator_class_init (GstVaDmabufAllocatorClass * klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->dispose = gst_va_dmabuf_allocator_dispose; - object_class->finalize = gst_va_dmabuf_allocator_finalize; -} - -static void -gst_va_dmabuf_allocator_init (GstVaDmabufAllocator * self) -{ - GstAllocator *allocator = GST_ALLOCATOR (self); - - self->parent_map = allocator->mem_map; - allocator->mem_map = gst_va_dmabuf_mem_map; - self->parent_copy = allocator->mem_copy; - allocator->mem_copy = gst_va_dmabuf_mem_copy; - - gst_va_memory_pool_init (&self->pool); -} - -GstAllocator * -gst_va_dmabuf_allocator_new (GstVaDisplay * display) -{ - GstVaDmabufAllocator *self; - - g_return_val_if_fail (GST_IS_VA_DISPLAY (display), NULL); - - self = g_object_new (GST_TYPE_VA_DMABUF_ALLOCATOR, NULL); - self->display = gst_object_ref (display); - gst_object_ref_sink (self); - - return GST_ALLOCATOR (self); -} - -static inline goffset -_get_fd_size (gint fd) -{ - return lseek (fd, 0, SEEK_END); -} - -static gboolean -gst_va_dmabuf_memory_release (GstMiniObject * mini_object) -{ - GstMemory *mem = GST_MEMORY_CAST (mini_object); - GstVaBufferSurface *buf; - GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (mem->allocator); - guint i; - - buf = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), - gst_va_buffer_surface_quark ()); - if (!buf) - return TRUE; /* free this unknown buffer */ - - /* if this is the last reference to the GstVaBufferSurface, iterates - * its array of memories to push them into the queue with thread - * safetly. */ - GST_VA_MEMORY_POOL_LOCK (&self->pool); - if (g_atomic_int_dec_and_test (&buf->ref_mems_count)) { - for (i = 0; i < buf->n_mems; i++) { - GST_LOG_OBJECT (self, "releasing %p: dmabuf %d, va surface %#x", - buf->memsi, gst_dmabuf_memory_get_fd (buf->memsi), buf->surface); - gst_va_memory_pool_push (&self->pool, buf->memsi); - } - } - GST_VA_MEMORY_POOL_UNLOCK (&self->pool); - - /* note: if ref_mem_count doesn't reach zero, that memory will - * "float" until it's pushed back into the pool by the last va - * buffer surface ref */ - - /* Keep last in case we are holding on the last allocator ref */ - gst_object_unref (mem->allocator); - - /* don't call mini_object's free */ - return FALSE; -} - -/* Creates an exported VASurface and adds it as @buffer's memories - * qdata - * - * If @info is not NULL, a dummy (non-pooled) buffer is created to - * update offsets and strides, and it has to be unrefed immediately. - */ -static gboolean -gst_va_dmabuf_allocator_setup_buffer_full (GstAllocator * allocator, - GstBuffer * buffer, GstVideoInfo * info) -{ - GstVaBufferSurface *buf; - GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (allocator); - GstVideoFormat format; - VADRMPRIMESurfaceDescriptor desc = { 0, }; - VASurfaceAttribExternalBuffers *extbuf = NULL, ext_buf; - VASurfaceID surface; - guint32 i, fourcc, rt_format, export_flags; - GDestroyNotify buffer_destroy = NULL; - gsize object_offset4; - - g_return_val_if_fail (GST_IS_VA_DMABUF_ALLOCATOR (allocator), FALSE); - - format = GST_VIDEO_INFO_FORMAT (&self->info); - fourcc = gst_va_fourcc_from_video_format (format); - rt_format = gst_va_chroma_from_video_format (format); - if (fourcc == 0 || rt_format == 0) { - GST_ERROR_OBJECT (allocator, "Unsupported format: %s", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&self->info))); - return FALSE; - } - - /* HACK(victor): disable tiling for i965 driver for RGB formats */ - if (gst_va_display_is_implementation (self->display, - GST_VA_IMPLEMENTATION_INTEL_I965) - && GST_VIDEO_INFO_IS_RGB (&self->info)) { - /* *INDENT-OFF* */ - ext_buf = (VASurfaceAttribExternalBuffers) { - .width = GST_VIDEO_INFO_WIDTH (&self->info), - .height = GST_VIDEO_INFO_HEIGHT (&self->info), - .num_planes = GST_VIDEO_INFO_N_PLANES (&self->info), - .pixel_format = fourcc, - }; - /* *INDENT-ON* */ - - extbuf = &ext_buf; - } - - if (!va_create_surfaces (self->display, rt_format, fourcc, - GST_VIDEO_INFO_WIDTH (&self->info), - GST_VIDEO_INFO_HEIGHT (&self->info), self->usage_hint, extbuf, - &surface, 1)) - return FALSE; - - /* workaround for missing layered dmabuf formats in i965 */ - if (gst_va_display_is_implementation (self->display, - GST_VA_IMPLEMENTATION_INTEL_I965) - && (fourcc == VA_FOURCC_YUY2 || fourcc == VA_FOURCC_UYVY)) { - /* These are not representable as separate planes */ - export_flags = VA_EXPORT_SURFACE_COMPOSED_LAYERS; - } else { - /* Each layer will contain exactly one plane. For example, an NV12 - * surface will be exported as two layers */ - export_flags = VA_EXPORT_SURFACE_SEPARATE_LAYERS; - } - - export_flags |= VA_EXPORT_SURFACE_READ_WRITE; - - if (!va_export_surface_to_dmabuf (self->display, surface, export_flags, - &desc)) - goto failed; - - g_assert (GST_VIDEO_INFO_N_PLANES (&self->info) == desc.num_layers); - - if (fourcc != desc.fourcc) { - GST_ERROR ("Unsupported fourcc: %" GST_FOURCC_FORMAT, - GST_FOURCC_ARGS (desc.fourcc)); - goto failed; - } - - if (desc.num_objects == 0) { - GST_ERROR ("Failed to export surface to dmabuf"); - goto failed; - } - - buf = gst_va_buffer_surface_new (surface, format, desc.width, desc.height); - if (G_UNLIKELY (info)) { - *info = self->info; - GST_VIDEO_INFO_SIZE (info) = 0; - } - - buf->n_mems = desc.num_objects; - - for (i = 0; i < desc.num_objects; i++) { - gint fd = desc.objectsi.fd; - /* don't rely on prime descriptor reported size since gallium drivers report - * different values */ - gsize size = _get_fd_size (fd); - GstMemory *mem = gst_dmabuf_allocator_alloc (allocator, fd, size); - guint64 *drm_mod = g_new (guint64, 1); - - if (size != desc.objectsi.size) { - GST_WARNING_OBJECT (self, "driver bug: fd size (%" G_GSIZE_FORMAT - ") differs from object descriptor size (%" G_GUINT32_FORMAT ")", - size, desc.objectsi.size); - } - - object_offseti = gst_buffer_get_size (buffer); - gst_buffer_append_memory (buffer, mem); - buf->memsi = mem; - - if (G_LIKELY (!info)) { - GST_MINI_OBJECT (mem)->dispose = gst_va_dmabuf_memory_release; - g_atomic_int_add (&buf->ref_mems_count, 1); - } else { - /* if no @info, surface will be destroyed as soon as buffer is - * destroyed (e.g. gst_va_dmabuf_allocator_try()) */ - buf->display = gst_object_ref (self->display); - buffer_destroy = gst_va_buffer_surface_unref; - } - - g_atomic_int_add (&buf->ref_count, 1); - gst_mini_object_set_qdata (GST_MINI_OBJECT (mem), - gst_va_buffer_surface_quark (), buf, buffer_destroy); - - *drm_mod = desc.objectsi.drm_format_modifier; - gst_mini_object_set_qdata (GST_MINI_OBJECT (mem), gst_va_drm_mod_quark (), - drm_mod, g_free); - - if (G_UNLIKELY (info)) - GST_VIDEO_INFO_PLANE_OFFSET (info, i) = GST_VIDEO_INFO_SIZE (info); - - GST_LOG_OBJECT (self, "buffer %p: new dmabuf %d / surface %#x %dx%d " - "size %" G_GSIZE_FORMAT " drm mod %#lx", buffer, fd, surface, - GST_VIDEO_INFO_WIDTH (&self->info), GST_VIDEO_INFO_HEIGHT (&self->info), - size, *drm_mod); - } - - if (G_UNLIKELY (info)) { - GST_VIDEO_INFO_SIZE (info) = gst_buffer_get_size (buffer); - - for (i = 0; i < desc.num_layers; i++) { - g_assert (desc.layersi.num_planes == 1); - GST_VIDEO_INFO_PLANE_OFFSET (info, i) = - object_offsetdesc.layersi.object_index0 + - desc.layersi.offset0; - GST_VIDEO_INFO_PLANE_STRIDE (info, i) = desc.layersi.pitch0; - } - } else { - gst_va_memory_pool_surface_inc (&self->pool); - } - - return TRUE; - -failed: - { - va_destroy_surfaces (self->display, &surface, 1); - return FALSE; - } -} - -gboolean -gst_va_dmabuf_allocator_setup_buffer (GstAllocator * allocator, - GstBuffer * buffer) -{ - return gst_va_dmabuf_allocator_setup_buffer_full (allocator, buffer, NULL); -} - -static VASurfaceID -gst_va_dmabuf_allocator_prepare_buffer_unlocked (GstVaDmabufAllocator * self, - GstBuffer * buffer) -{ - GstMemory *memsGST_VIDEO_MAX_PLANES = { 0, }; - GstVaBufferSurface *buf; - gint i, j, idx; - - mems0 = gst_va_memory_pool_pop (&self->pool); - if (!mems0) - return VA_INVALID_ID; - - buf = gst_mini_object_get_qdata (GST_MINI_OBJECT (mems0), - gst_va_buffer_surface_quark ()); - if (!buf) - return VA_INVALID_ID; - - if (buf->surface == VA_INVALID_ID) - return VA_INVALID_ID; - - for (idx = 1; idx < buf->n_mems; idx++) { - /* grab next memory from queue */ - { - GstMemory *mem; - GstVaBufferSurface *pbuf; - - mem = gst_va_memory_pool_peek (&self->pool); - if (!mem) - return VA_INVALID_ID; - - pbuf = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), - gst_va_buffer_surface_quark ()); - if (!pbuf) - return VA_INVALID_ID; - - if (pbuf->surface != buf->surface) { - GST_WARNING_OBJECT (self, - "expecting memory with surface %#x but got %#x: " - "possible memory interweaving", buf->surface, pbuf->surface); - return VA_INVALID_ID; - } - } - - memsidx = gst_va_memory_pool_pop (&self->pool); - }; - - /* append memories */ - for (i = 0; i < buf->n_mems; i++) { - gboolean found = FALSE; - - /* find next memory to append */ - for (j = 0; j < idx; j++) { - if (buf->memsi == memsj) { - found = TRUE; - break; - } - } - - /* if not found, free all the popped memories and bail */ - if (!found) { - if (!buf->display) - buf->display = gst_object_ref (self->display); - for (j = 0; j < idx; j++) { - gst_object_ref (buf->memsj->allocator); - GST_MINI_OBJECT (memsj)->dispose = NULL; - gst_memory_unref (memsj); - } - return VA_INVALID_ID; - } - - g_atomic_int_add (&buf->ref_mems_count, 1); - gst_object_ref (buf->memsi->allocator); - gst_buffer_append_memory (buffer, buf->memsi); - - GST_LOG ("bufer %p: memory %p - dmabuf %d / surface %#x", buffer, - buf->memsi, gst_dmabuf_memory_get_fd (buf->memsi), - gst_va_memory_get_surface (buf->memsi)); - } - - return buf->surface; -} - -gboolean -gst_va_dmabuf_allocator_prepare_buffer (GstAllocator * allocator, - GstBuffer * buffer) -{ - GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (allocator); - VASurfaceID surface; - - GST_VA_MEMORY_POOL_LOCK (&self->pool); - surface = gst_va_dmabuf_allocator_prepare_buffer_unlocked (self, buffer); - GST_VA_MEMORY_POOL_UNLOCK (&self->pool); - - return (surface != VA_INVALID_ID); -} - -void -gst_va_dmabuf_allocator_flush (GstAllocator * allocator) -{ - GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (allocator); - - gst_va_memory_pool_flush (&self->pool, self->display); -} - -static gboolean -gst_va_dmabuf_allocator_try (GstAllocator * allocator) -{ - GstBuffer *buffer; - GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (allocator); - GstVideoInfo info = self->info; - gboolean ret; - - buffer = gst_buffer_new (); - ret = gst_va_dmabuf_allocator_setup_buffer_full (allocator, buffer, &info); - gst_buffer_unref (buffer); - - if (ret) - self->info = info; - - return ret; -} - -gboolean -gst_va_dmabuf_allocator_set_format (GstAllocator * allocator, - GstVideoInfo * info, guint usage_hint) -{ - GstVaDmabufAllocator *self; - gboolean ret; - - g_return_val_if_fail (GST_IS_VA_DMABUF_ALLOCATOR (allocator), FALSE); - g_return_val_if_fail (info, FALSE); - - self = GST_VA_DMABUF_ALLOCATOR (allocator); - - if (gst_va_memory_pool_surface_count (&self->pool) != 0) { - if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_INFO_FORMAT (&self->info) - && GST_VIDEO_INFO_WIDTH (info) == GST_VIDEO_INFO_WIDTH (&self->info) - && GST_VIDEO_INFO_HEIGHT (info) == GST_VIDEO_INFO_HEIGHT (&self->info) - && usage_hint == self->usage_hint) { - *info = self->info; /* update callee info (offset & stride) */ - return TRUE; - } - return FALSE; - } - - self->usage_hint = usage_hint; - self->info = *info; - - g_clear_pointer (&self->copy, gst_va_surface_copy_free); - - ret = gst_va_dmabuf_allocator_try (allocator); - - if (ret) - *info = self->info; - - return ret; -} - -gboolean -gst_va_dmabuf_allocator_get_format (GstAllocator * allocator, - GstVideoInfo * info, guint * usage_hint) -{ - GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (allocator); - - if (GST_VIDEO_INFO_FORMAT (&self->info) == GST_VIDEO_FORMAT_UNKNOWN) - return FALSE; - - if (info) - *info = self->info; - if (usage_hint) - *usage_hint = self->usage_hint; - - return TRUE; -} - -/* XXX: use a surface pool to control the created surfaces */ -gboolean -gst_va_dmabuf_memories_setup (GstVaDisplay * display, GstVideoInfo * info, - guint n_planes, GstMemory * memGST_VIDEO_MAX_PLANES, - uintptr_t * fds, gsize offsetGST_VIDEO_MAX_PLANES, guint usage_hint) -{ - GstVideoFormat format; - GstVaBufferSurface *buf; - /* *INDENT-OFF* */ - VASurfaceAttribExternalBuffers ext_buf = { - .width = GST_VIDEO_INFO_WIDTH (info), - .height = GST_VIDEO_INFO_HEIGHT (info), - .data_size = GST_VIDEO_INFO_SIZE (info), - .num_planes = GST_VIDEO_INFO_N_PLANES (info), - .buffers = fds, - .num_buffers = GST_VIDEO_INFO_N_PLANES (info), - }; - /* *INDENT-ON* */ - VASurfaceID surface; - guint32 fourcc, rt_format; - guint i; - gboolean ret; - - g_return_val_if_fail (GST_IS_VA_DISPLAY (display), FALSE); - g_return_val_if_fail (n_planes > 0 - && n_planes <= GST_VIDEO_MAX_PLANES, FALSE); - - format = GST_VIDEO_INFO_FORMAT (info); - if (format == GST_VIDEO_FORMAT_UNKNOWN) - return FALSE; - - rt_format = gst_va_chroma_from_video_format (format); - if (rt_format == 0) - return FALSE; - - fourcc = gst_va_fourcc_from_video_format (format); - if (fourcc == 0) - return FALSE; - - ext_buf.pixel_format = fourcc; - - for (i = 0; i < n_planes; i++) { - ext_buf.pitchesi = GST_VIDEO_INFO_PLANE_STRIDE (info, i); - ext_buf.offsetsi = offseti; - } - - ret = va_create_surfaces (display, rt_format, ext_buf.pixel_format, - ext_buf.width, ext_buf.height, usage_hint, &ext_buf, &surface, 1); - if (!ret) - return FALSE; - - GST_LOG_OBJECT (display, "Created surface %#x %dx%d", surface, - ext_buf.width, ext_buf.height); - - buf = gst_va_buffer_surface_new (surface, rt_format, ext_buf.width, - ext_buf.height); - buf->display = gst_object_ref (display); - buf->n_mems = n_planes; - memcpy (buf->mems, mem, sizeof (buf->mems)); - - for (i = 0; i < n_planes; i++) { - g_atomic_int_add (&buf->ref_count, 1); - gst_mini_object_set_qdata (GST_MINI_OBJECT (memi), - gst_va_buffer_surface_quark (), buf, gst_va_buffer_surface_unref); - GST_INFO_OBJECT (display, "setting surface %#x to dmabuf fd %d", - buf->surface, gst_dmabuf_memory_get_fd (memi)); - } - - return TRUE; -} - -/*===================== GstVaAllocator / GstVaMemory =========================*/ - -struct _GstVaAllocator -{ - GstAllocator parent; - - GstVaDisplay *display; - - gboolean use_derived; - GArray *surface_formats; - - GstVideoFormat surface_format; - GstVideoFormat img_format; - guint32 fourcc; - guint32 rt_format; - - GstVideoInfo derived_info; - GstVideoInfo info; - guint usage_hint; - - GstVaSurfaceCopy *copy; - - GstVaMemoryPool pool; -}; - -typedef struct _GstVaMemory GstVaMemory; -struct _GstVaMemory -{ - GstMemory mem; - - VASurfaceID surface; - GstVideoFormat surface_format; - VAImage image; - gpointer mapped_data; - - GstMapFlags prev_mapflags; - gint map_count; - - gboolean is_derived; - gboolean is_dirty; - GMutex lock; -}; - -G_DEFINE_TYPE_WITH_CODE (GstVaAllocator, gst_va_allocator, GST_TYPE_ALLOCATOR, - _init_debug_category ()); - -static gboolean _va_unmap (GstVaMemory * mem); - -static void -gst_va_allocator_finalize (GObject * object) -{ - GstVaAllocator *self = GST_VA_ALLOCATOR (object); - - g_clear_pointer (&self->copy, gst_va_surface_copy_free); - gst_va_memory_pool_finalize (&self->pool); - g_clear_pointer (&self->surface_formats, g_array_unref); - gst_clear_object (&self->display); - - G_OBJECT_CLASS (gst_va_allocator_parent_class)->finalize (object); -} - -static void -gst_va_allocator_dispose (GObject * object) -{ - GstVaAllocator *self = GST_VA_ALLOCATOR (object); - - gst_va_memory_pool_flush_unlocked (&self->pool, self->display); - if (gst_va_memory_pool_surface_count (&self->pool) != 0) { - GST_WARNING_OBJECT (self, "Surfaces leaked: %d", - gst_va_memory_pool_surface_count (&self->pool)); - } - - G_OBJECT_CLASS (gst_va_allocator_parent_class)->dispose (object); -} - -static void -_va_free (GstAllocator * allocator, GstMemory * mem) -{ - GstVaAllocator *self = GST_VA_ALLOCATOR (allocator); - GstVaMemory *va_mem = (GstVaMemory *) mem; - - if (va_mem->mapped_data) { - g_warning (G_STRLOC ":%s: Freeing memory %p still mapped", G_STRFUNC, - va_mem); - _va_unmap (va_mem); - } - - if (va_mem->surface != VA_INVALID_ID && mem->parent == NULL) { - GST_LOG_OBJECT (self, "Destroying surface %#x", va_mem->surface); - va_destroy_surfaces (self->display, &va_mem->surface, 1); - } - - g_mutex_clear (&va_mem->lock); - - g_slice_free (GstVaMemory, va_mem); -} - -static void -gst_va_allocator_class_init (GstVaAllocatorClass * klass) -{ - GstAllocatorClass *allocator_class = GST_ALLOCATOR_CLASS (klass); - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->dispose = gst_va_allocator_dispose; - object_class->finalize = gst_va_allocator_finalize; - allocator_class->free = _va_free; -} - -static inline void -_clean_mem (GstVaMemory * mem) -{ - memset (&mem->image, 0, sizeof (mem->image)); - mem->image.image_id = VA_INVALID_ID; - mem->image.buf = VA_INVALID_ID; - - mem->is_derived = TRUE; - mem->is_dirty = FALSE; - mem->prev_mapflags = 0; - mem->mapped_data = NULL; -} - -static void -_reset_mem (GstVaMemory * mem, GstAllocator * allocator, gsize size) -{ - _clean_mem (mem); - g_atomic_int_set (&mem->map_count, 0); - g_mutex_init (&mem->lock); - - gst_memory_init (GST_MEMORY_CAST (mem), 0, allocator, NULL, size, - 0 /* align */ , 0 /* offset */ , size); -} - -static inline void -_update_info (GstVideoInfo * info, const VAImage * image) -{ - guint i; - - for (i = 0; i < image->num_planes; i++) { - GST_VIDEO_INFO_PLANE_OFFSET (info, i) = image->offsetsi; - GST_VIDEO_INFO_PLANE_STRIDE (info, i) = image->pitchesi; - } - - GST_VIDEO_INFO_SIZE (info) = image->data_size; -} - -static inline gboolean -_update_image_info (GstVaAllocator * va_allocator) -{ - VASurfaceID surface; - VAImage image = {.image_id = VA_INVALID_ID, }; - - /* Create a test surface first */ - if (!va_create_surfaces (va_allocator->display, va_allocator->rt_format, - va_allocator->fourcc, GST_VIDEO_INFO_WIDTH (&va_allocator->info), - GST_VIDEO_INFO_HEIGHT (&va_allocator->info), va_allocator->usage_hint, - NULL, &surface, 1)) { - GST_ERROR_OBJECT (va_allocator, "Failed to create a test surface"); - return FALSE; - } - - GST_DEBUG_OBJECT (va_allocator, "Created surface %#x %dx%d", surface, - GST_VIDEO_INFO_WIDTH (&va_allocator->info), - GST_VIDEO_INFO_HEIGHT (&va_allocator->info)); - - /* Try derived first, but different formats can never derive */ - if (va_allocator->surface_format == va_allocator->img_format) { - if (va_get_derive_image (va_allocator->display, surface, &image)) { - va_allocator->use_derived = TRUE; - va_allocator->derived_info = va_allocator->info; - _update_info (&va_allocator->derived_info, &image); - va_destroy_image (va_allocator->display, image.image_id); - } - image.image_id = VA_INVALID_ID; /* reset it */ - } - - /* Then we try to create a image. */ - if (!va_create_image (va_allocator->display, va_allocator->img_format, - GST_VIDEO_INFO_WIDTH (&va_allocator->info), - GST_VIDEO_INFO_HEIGHT (&va_allocator->info), &image)) { - va_destroy_surfaces (va_allocator->display, &surface, 1); - return FALSE; - } - - _update_info (&va_allocator->info, &image); - va_destroy_image (va_allocator->display, image.image_id); - va_destroy_surfaces (va_allocator->display, &surface, 1); - - return TRUE; -} - -static gpointer -_va_map_unlocked (GstVaMemory * mem, GstMapFlags flags) -{ - GstAllocator *allocator = GST_MEMORY_CAST (mem)->allocator; - GstVideoInfo *info; - GstVaAllocator *va_allocator; - GstVaDisplay *display; - gboolean use_derived; - - g_return_val_if_fail (mem->surface != VA_INVALID_ID, NULL); - g_return_val_if_fail (GST_IS_VA_ALLOCATOR (allocator), NULL); - - if (g_atomic_int_get (&mem->map_count) > 0) { - if (!(mem->prev_mapflags & flags) || !mem->mapped_data) - return NULL; - else - goto success; - } - - va_allocator = GST_VA_ALLOCATOR (allocator); - display = va_allocator->display; - - if (flags & GST_MAP_WRITE) { - mem->is_dirty = TRUE; - } else { /* GST_MAP_READ only */ - mem->is_dirty = FALSE; - } - - if (flags & GST_MAP_VA) { - mem->mapped_data = &mem->surface; - goto success; - } - - switch (gst_va_display_get_implementation (display)) { - case GST_VA_IMPLEMENTATION_INTEL_IHD: - /* On Gen7+ Intel graphics the memory is mappable but not - * cached, so normal memcpy() access is very slow to read, but - * it's ok for writing. So let's assume that users won't prefer - * direct-mapped memory if they request read access. */ - use_derived = va_allocator->use_derived && !(flags & GST_MAP_READ); - break; - case GST_VA_IMPLEMENTATION_INTEL_I965: - /* YUV derived images are tiled, so writing them is also - * problematic */ - use_derived = va_allocator->use_derived && !((flags & GST_MAP_READ) - || ((flags & GST_MAP_WRITE) - && GST_VIDEO_INFO_IS_YUV (&va_allocator->derived_info))); - break; - case GST_VA_IMPLEMENTATION_MESA_GALLIUM: - /* Reading RGB derived images, with non-standard resolutions, - * looks like tiled too. TODO(victor): fill a bug in Mesa. */ - use_derived = va_allocator->use_derived && !((flags & GST_MAP_READ) - && GST_VIDEO_INFO_IS_RGB (&va_allocator->derived_info)); - break; - default: - use_derived = va_allocator->use_derived; - break; - } - if (use_derived) - info = &va_allocator->derived_info; - else - info = &va_allocator->info; - - if (!va_ensure_image (display, mem->surface, info, &mem->image, use_derived)) - return NULL; - - mem->is_derived = use_derived; - - if (!mem->is_derived) { - if (!va_get_image (display, mem->surface, &mem->image)) - goto fail; - } - - if (!va_map_buffer (display, mem->image.buf, &mem->mapped_data)) - goto fail; - -success: - { - mem->prev_mapflags = flags; - g_atomic_int_add (&mem->map_count, 1); - return mem->mapped_data; - } - -fail: - { - va_destroy_image (display, mem->image.image_id); - _clean_mem (mem); - return NULL; - } -} - -static gpointer -_va_map (GstVaMemory * mem, gsize maxsize, GstMapFlags flags) -{ - gpointer data; - - g_mutex_lock (&mem->lock); - data = _va_map_unlocked (mem, flags); - g_mutex_unlock (&mem->lock); - - return data; -} - -static gboolean -_va_unmap_unlocked (GstVaMemory * mem) -{ - GstAllocator *allocator = GST_MEMORY_CAST (mem)->allocator; - GstVaDisplay *display; - gboolean ret = TRUE; - - if (!g_atomic_int_dec_and_test (&mem->map_count)) - return TRUE; - - if (mem->prev_mapflags & GST_MAP_VA) - goto bail; - - display = GST_VA_ALLOCATOR (allocator)->display; - - if (mem->image.image_id != VA_INVALID_ID) { - if (mem->is_dirty && !mem->is_derived) { - ret = va_put_image (display, mem->surface, &mem->image); - mem->is_dirty = FALSE; - } - /* XXX(victor): if is derived and is dirty, create another surface - * an replace it in mem */ - } - - ret &= va_unmap_buffer (display, mem->image.buf); - ret &= va_destroy_image (display, mem->image.image_id); - -bail: - _clean_mem (mem); - - return ret; -} - -static gboolean -_va_unmap (GstVaMemory * mem) -{ - gboolean ret; - - g_mutex_lock (&mem->lock); - ret = _va_unmap_unlocked (mem); - g_mutex_unlock (&mem->lock); - - return ret; -} - -static GstMemory * -_va_share (GstMemory * mem, gssize offset, gssize size) -{ - GstVaMemory *vamem = (GstVaMemory *) mem; - GstVaMemory *sub; - GstMemory *parent; - - GST_DEBUG ("%p: share %" G_GSSIZE_FORMAT ", %" G_GSIZE_FORMAT, mem, offset, - size); - - /* find real parent */ - if ((parent = vamem->mem.parent) == NULL) - parent = (GstMemory *) vamem; - - if (size == -1) - size = mem->maxsize - offset; - - sub = g_slice_new (GstVaMemory); - - /* the shared memory is alwyas readonly */ - gst_memory_init (GST_MEMORY_CAST (sub), GST_MINI_OBJECT_FLAGS (parent) | - GST_MINI_OBJECT_FLAG_LOCK_READONLY, vamem->mem.allocator, parent, - vamem->mem.maxsize, vamem->mem.align, vamem->mem.offset + offset, size); - - sub->surface = vamem->surface; - sub->surface_format = vamem->surface_format; - - _clean_mem (sub); - - g_atomic_int_set (&sub->map_count, 0); - g_mutex_init (&sub->lock); - - return GST_MEMORY_CAST (sub); -} - -/* XXX(victor): deep copy implementation. */ -static GstMemory * -_va_copy (GstMemory * mem, gssize offset, gssize size) -{ - GstMemory *copy; - GstMapInfo sinfo, dinfo; - GstVaAllocator *va_allocator = GST_VA_ALLOCATOR (mem->allocator); - GstVaMemory *va_copy, *va_mem = (GstVaMemory *) mem; - gsize mem_size; - - GST_DEBUG ("%p: copy %" G_GSSIZE_FORMAT ", %" G_GSIZE_FORMAT, mem, offset, - size); - - { - GST_VA_MEMORY_POOL_LOCK (&va_allocator->pool); - copy = gst_va_memory_pool_pop (&va_allocator->pool); - GST_VA_MEMORY_POOL_UNLOCK (&va_allocator->pool); - - if (!copy) { - copy = gst_va_allocator_alloc (mem->allocator); - if (!copy) { - GST_WARNING ("failed to allocate new memory"); - return NULL; - } - } else { - gst_object_ref (mem->allocator); - } - } - - va_copy = (GstVaMemory *) copy; - mem_size = gst_memory_get_sizes (mem, NULL, NULL); - - if (size == -1) - size = mem_size > offset ? mem_size - offset : 0; - - if (offset == 0 && size == mem_size) { - GstVaSurfaceCopy *copy_func; - - copy_func = _ensure_surface_copy (&va_allocator->copy, - va_allocator->display, &va_allocator->info); - if (copy_func - && gst_va_surface_copy (copy_func, va_copy->surface, va_mem->surface)) - return copy; - } - - if (!gst_memory_map (mem, &sinfo, GST_MAP_READ)) { - GST_WARNING ("failed to map memory to copy"); - return NULL; - } - - if (!gst_memory_map (copy, &dinfo, GST_MAP_WRITE)) { - GST_WARNING ("could not write map memory %p", copy); - gst_allocator_free (mem->allocator, copy); - gst_memory_unmap (mem, &sinfo); - return NULL; - } - - memcpy (dinfo.data, sinfo.data + offset, size); - gst_memory_unmap (copy, &dinfo); - gst_memory_unmap (mem, &sinfo); - - return copy; -} - -static void -gst_va_allocator_init (GstVaAllocator * self) -{ - GstAllocator *allocator = GST_ALLOCATOR (self); - - allocator->mem_type = GST_ALLOCATOR_VASURFACE; - allocator->mem_map = (GstMemoryMapFunction) _va_map; - allocator->mem_unmap = (GstMemoryUnmapFunction) _va_unmap; - allocator->mem_share = _va_share; - allocator->mem_copy = _va_copy; - - gst_va_memory_pool_init (&self->pool); - - GST_OBJECT_FLAG_SET (self, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC); -} - -static gboolean -gst_va_memory_release (GstMiniObject * mini_object) -{ - GstMemory *mem = GST_MEMORY_CAST (mini_object); - GstVaAllocator *self = GST_VA_ALLOCATOR (mem->allocator); - - GST_LOG ("releasing %p: surface %#x", mem, gst_va_memory_get_surface (mem)); - - gst_va_memory_pool_push (&self->pool, mem); - - /* Keep last in case we are holding on the last allocator ref */ - gst_object_unref (mem->allocator); - - /* don't call mini_object's free */ - return FALSE; -} - -GstMemory * -gst_va_allocator_alloc (GstAllocator * allocator) -{ - GstVaAllocator *self; - GstVaMemory *mem; - VASurfaceID surface; - - g_return_val_if_fail (GST_IS_VA_ALLOCATOR (allocator), NULL); - - self = GST_VA_ALLOCATOR (allocator); - - if (self->rt_format == 0) { - GST_ERROR_OBJECT (self, "Unknown fourcc or chroma format"); - return NULL; - } - - if (!va_create_surfaces (self->display, self->rt_format, self->fourcc, - GST_VIDEO_INFO_WIDTH (&self->info), - GST_VIDEO_INFO_HEIGHT (&self->info), self->usage_hint, NULL, - &surface, 1)) - return NULL; - - mem = g_slice_new (GstVaMemory); - - mem->surface = surface; - mem->surface_format = self->surface_format; - - _reset_mem (mem, allocator, GST_VIDEO_INFO_SIZE (&self->info)); - - GST_MINI_OBJECT (mem)->dispose = gst_va_memory_release; - gst_va_memory_pool_surface_inc (&self->pool); - - GST_LOG_OBJECT (self, "Created surface %#x %dx%d", mem->surface, - GST_VIDEO_INFO_WIDTH (&self->info), GST_VIDEO_INFO_HEIGHT (&self->info)); - - return GST_MEMORY_CAST (mem); -} - -GstAllocator * -gst_va_allocator_new (GstVaDisplay * display, GArray * surface_formats) -{ - GstVaAllocator *self; - - g_return_val_if_fail (GST_IS_VA_DISPLAY (display), NULL); - - self = g_object_new (GST_TYPE_VA_ALLOCATOR, NULL); - self->display = gst_object_ref (display); - self->surface_formats = surface_formats; - gst_object_ref_sink (self); - - return GST_ALLOCATOR (self); -} - -gboolean -gst_va_allocator_setup_buffer (GstAllocator * allocator, GstBuffer * buffer) -{ - GstMemory *mem = gst_va_allocator_alloc (allocator); - if (!mem) - return FALSE; - - gst_buffer_append_memory (buffer, mem); - return TRUE; -} - -static VASurfaceID -gst_va_allocator_prepare_buffer_unlocked (GstVaAllocator * self, - GstBuffer * buffer) -{ - GstMemory *mem; - VASurfaceID surface; - - mem = gst_va_memory_pool_pop (&self->pool); - if (!mem) - return VA_INVALID_ID; - - gst_object_ref (mem->allocator); - surface = gst_va_memory_get_surface (mem); - gst_buffer_append_memory (buffer, mem); - - GST_LOG ("buffer %p: memory %p - surface %#x", buffer, mem, surface); - - return surface; -} - -gboolean -gst_va_allocator_prepare_buffer (GstAllocator * allocator, GstBuffer * buffer) -{ - GstVaAllocator *self = GST_VA_ALLOCATOR (allocator); - VASurfaceID surface; - - GST_VA_MEMORY_POOL_LOCK (&self->pool); - surface = gst_va_allocator_prepare_buffer_unlocked (self, buffer); - GST_VA_MEMORY_POOL_UNLOCK (&self->pool); - - return (surface != VA_INVALID_ID); -} - -void -gst_va_allocator_flush (GstAllocator * allocator) -{ - GstVaAllocator *self = GST_VA_ALLOCATOR (allocator); - - gst_va_memory_pool_flush (&self->pool, self->display); -} - -static gboolean -gst_va_allocator_try (GstAllocator * allocator) -{ - GstVaAllocator *self = GST_VA_ALLOCATOR (allocator); - - self->fourcc = 0; - self->rt_format = 0; - self->use_derived = FALSE; - self->img_format = GST_VIDEO_INFO_FORMAT (&self->info); - - self->surface_format = - gst_va_video_surface_format_from_image_format (self->img_format, - self->surface_formats); - if (self->surface_format == GST_VIDEO_FORMAT_UNKNOWN) { - /* try a surface without fourcc but rt_format only */ - self->fourcc = 0; - self->rt_format = gst_va_chroma_from_video_format (self->img_format); - } else { - self->fourcc = gst_va_fourcc_from_video_format (self->surface_format); - self->rt_format = gst_va_chroma_from_video_format (self->surface_format); - } - - if (self->rt_format == 0) { - GST_ERROR_OBJECT (allocator, "Unsupported image format: %s", - gst_video_format_to_string (self->img_format)); - return FALSE; - } - - if (!_update_image_info (self)) { - GST_ERROR_OBJECT (allocator, "Failed to update allocator info"); - return FALSE; - } - - GST_INFO_OBJECT (self, - "va allocator info, surface format: %s, image format: %s, " - "use derived: %s, rt format: 0x%x, fourcc: %" GST_FOURCC_FORMAT, - (self->surface_format == GST_VIDEO_FORMAT_UNKNOWN) ? "unknown" - : gst_video_format_to_string (self->surface_format), - gst_video_format_to_string (self->img_format), - self->use_derived ? "true" : "false", self->rt_format, - GST_FOURCC_ARGS (self->fourcc)); - return TRUE; -} - -gboolean -gst_va_allocator_set_format (GstAllocator * allocator, GstVideoInfo * info, - guint usage_hint) -{ - GstVaAllocator *self; - gboolean ret; - - g_return_val_if_fail (GST_IS_VA_ALLOCATOR (allocator), FALSE); - g_return_val_if_fail (info, FALSE); - - self = GST_VA_ALLOCATOR (allocator); - - if (gst_va_memory_pool_surface_count (&self->pool) != 0) { - if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_INFO_FORMAT (&self->info) - && GST_VIDEO_INFO_WIDTH (info) == GST_VIDEO_INFO_WIDTH (&self->info) - && GST_VIDEO_INFO_HEIGHT (info) == GST_VIDEO_INFO_HEIGHT (&self->info) - && usage_hint == self->usage_hint) { - *info = self->info; /* update callee info (offset & stride) */ - return TRUE; - } - return FALSE; - } - - self->usage_hint = usage_hint; - self->info = *info; - - g_clear_pointer (&self->copy, gst_va_surface_copy_free); - - ret = gst_va_allocator_try (allocator); - if (ret) - *info = self->info; - - return ret; -} - -gboolean -gst_va_allocator_get_format (GstAllocator * allocator, GstVideoInfo * info, - guint * usage_hint) -{ - GstVaAllocator *self = GST_VA_ALLOCATOR (allocator); - - if (GST_VIDEO_INFO_FORMAT (&self->info) == GST_VIDEO_FORMAT_UNKNOWN) - return FALSE; - - if (info) - *info = self->info; - if (usage_hint) - *usage_hint = self->usage_hint; - - return TRUE; -} - -/*============ Utilities =====================================================*/ - -VASurfaceID -gst_va_memory_get_surface (GstMemory * mem) -{ - VASurfaceID surface = VA_INVALID_ID; - - if (!mem->allocator) - return VA_INVALID_ID; - - if (GST_IS_DMABUF_ALLOCATOR (mem->allocator)) { - GstVaBufferSurface *buf; - - buf = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), - gst_va_buffer_surface_quark ()); - if (buf) - surface = buf->surface; - } else if (GST_IS_VA_ALLOCATOR (mem->allocator)) { - GstVaMemory *va_mem = (GstVaMemory *) mem; - surface = va_mem->surface; - } - - return surface; -} - -VASurfaceID -gst_va_buffer_get_surface (GstBuffer * buffer) -{ - GstMemory *mem; - - mem = gst_buffer_peek_memory (buffer, 0); - if (!mem) - return VA_INVALID_ID; - - return gst_va_memory_get_surface (mem); -} - -gboolean -gst_va_buffer_create_aux_surface (GstBuffer * buffer) -{ - GstMemory *mem; - VASurfaceID surface = VA_INVALID_ID; - GstVaDisplay *display = NULL; - GstVideoFormat format; - gint width, height; - GstVaBufferSurface *surface_buffer; - - mem = gst_buffer_peek_memory (buffer, 0); - if (!mem) - return FALSE; - - /* Already created it. */ - surface_buffer = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), - gst_va_buffer_aux_surface_quark ()); - if (surface_buffer) - return TRUE; - - if (!mem->allocator) - return FALSE; - - if (GST_IS_VA_DMABUF_ALLOCATOR (mem->allocator)) { - GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (mem->allocator); - guint32 fourcc, rt_format; - - format = GST_VIDEO_INFO_FORMAT (&self->info); - fourcc = gst_va_fourcc_from_video_format (format); - rt_format = gst_va_chroma_from_video_format (format); - if (fourcc == 0 || rt_format == 0) { - GST_ERROR_OBJECT (self, "Unsupported format: %s", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&self->info))); - return FALSE; - } - - display = self->display; - width = GST_VIDEO_INFO_WIDTH (&self->info); - height = GST_VIDEO_INFO_HEIGHT (&self->info); - if (!va_create_surfaces (self->display, rt_format, fourcc, - GST_VIDEO_INFO_WIDTH (&self->info), - GST_VIDEO_INFO_HEIGHT (&self->info), self->usage_hint, NULL, - &surface, 1)) - return FALSE; - } else if (GST_IS_VA_ALLOCATOR (mem->allocator)) { - GstVaAllocator *self = GST_VA_ALLOCATOR (mem->allocator); - - if (self->rt_format == 0) { - GST_ERROR_OBJECT (self, "Unknown fourcc or chroma format"); - return FALSE; - } - - display = self->display; - width = GST_VIDEO_INFO_WIDTH (&self->info); - height = GST_VIDEO_INFO_HEIGHT (&self->info); - format = GST_VIDEO_INFO_FORMAT (&self->info); - if (!va_create_surfaces (self->display, self->rt_format, self->fourcc, - GST_VIDEO_INFO_WIDTH (&self->info), - GST_VIDEO_INFO_HEIGHT (&self->info), self->usage_hint, NULL, - &surface, 1)) - return FALSE; - } else { - g_assert_not_reached (); - } - - if (!display || surface == VA_INVALID_ID) - return FALSE; - - surface_buffer = gst_va_buffer_surface_new (surface, format, width, height); - surface_buffer->display = gst_object_ref (display); - g_atomic_int_add (&surface_buffer->ref_count, 1); - - gst_mini_object_set_qdata (GST_MINI_OBJECT (mem), - gst_va_buffer_aux_surface_quark (), surface_buffer, - gst_va_buffer_surface_unref); - - return TRUE; -} - -VASurfaceID -gst_va_buffer_get_aux_surface (GstBuffer * buffer) -{ - GstVaBufferSurface *surface_buffer; - GstMemory *mem; - - mem = gst_buffer_peek_memory (buffer, 0); - if (!mem) - return VA_INVALID_ID; - - surface_buffer = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), - gst_va_buffer_aux_surface_quark ()); - if (!surface_buffer) - return VA_INVALID_ID; - - /* No one increments it, and its lifetime is the same with the - gstmemory itself */ - g_assert (g_atomic_int_get (&surface_buffer->ref_count) == 1); - - return surface_buffer->surface; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvaallocator.h
Deleted
@@ -1,84 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Igalia, S.L. - * Author: Víctor Jáquez <vjaquez@igalia.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#pragma once - -#include <gst/allocators/allocators.h> -#include <gst/va/gstvadisplay.h> -#include <gst/video/video.h> -#include <stdint.h> -#include <va/va.h> - -G_BEGIN_DECLS - -#define GST_TYPE_VA_DMABUF_ALLOCATOR (gst_va_dmabuf_allocator_get_type()) -G_DECLARE_FINAL_TYPE (GstVaDmabufAllocator, gst_va_dmabuf_allocator, GST, - VA_DMABUF_ALLOCATOR, GstDmaBufAllocator); - -GstAllocator * gst_va_dmabuf_allocator_new (GstVaDisplay * display); -gboolean gst_va_dmabuf_allocator_setup_buffer (GstAllocator * allocator, - GstBuffer * buffer); -gboolean gst_va_dmabuf_allocator_prepare_buffer (GstAllocator * allocator, - GstBuffer * buffer); -void gst_va_dmabuf_allocator_flush (GstAllocator * allocator); -gboolean gst_va_dmabuf_allocator_set_format (GstAllocator * allocator, - GstVideoInfo * info, - guint usage_hint); -gboolean gst_va_dmabuf_allocator_get_format (GstAllocator * allocator, - GstVideoInfo * info, - guint * usage_hint); - -gboolean gst_va_dmabuf_memories_setup (GstVaDisplay * display, - GstVideoInfo * info, - guint n_planes, - GstMemory * memGST_VIDEO_MAX_PLANES, - uintptr_t * fds, - gsize offsetGST_VIDEO_MAX_PLANES, - guint usage_hint); - -#define GST_TYPE_VA_ALLOCATOR (gst_va_allocator_get_type()) -G_DECLARE_FINAL_TYPE (GstVaAllocator, gst_va_allocator, GST, VA_ALLOCATOR, GstAllocator); - -#define GST_ALLOCATOR_VASURFACE "VAMemory" - -#define GST_MAP_VA (GST_MAP_FLAG_LAST << 1) - -GstAllocator * gst_va_allocator_new (GstVaDisplay * display, - GArray * surface_formats); -GstMemory * gst_va_allocator_alloc (GstAllocator * allocator); -gboolean gst_va_allocator_setup_buffer (GstAllocator * allocator, - GstBuffer * buffer); -gboolean gst_va_allocator_prepare_buffer (GstAllocator * allocator, - GstBuffer * buffer); -void gst_va_allocator_flush (GstAllocator * allocator); -gboolean gst_va_allocator_set_format (GstAllocator * allocator, - GstVideoInfo * info, - guint usage_hint); -gboolean gst_va_allocator_get_format (GstAllocator * allocator, - GstVideoInfo * info, - guint * usage_hint); - -VASurfaceID gst_va_memory_get_surface (GstMemory * mem); -VASurfaceID gst_va_buffer_get_surface (GstBuffer * buffer); - -gboolean gst_va_buffer_create_aux_surface (GstBuffer * buffer); -VASurfaceID gst_va_buffer_get_aux_surface (GstBuffer * buffer); - -G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvapool.c
Deleted
@@ -1,386 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Igalia, S.L. - * Author: Víctor Jáquez <vjaquez@igalia.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstvapool.h" - -#include "gstvaallocator.h" -#include "gstvacaps.h" - -GST_DEBUG_CATEGORY_STATIC (gst_va_pool_debug); -#define GST_CAT_DEFAULT gst_va_pool_debug - -struct _GstVaPool -{ - GstBufferPool parent; - - GstVideoInfo alloc_info; - GstVideoInfo caps_info; - GstAllocator *allocator; - gboolean force_videometa; - gboolean add_videometa; - gint crop_left; - gint crop_top; - - gboolean starting; -}; - -#define gst_va_pool_parent_class parent_class -G_DEFINE_TYPE_WITH_CODE (GstVaPool, gst_va_pool, GST_TYPE_BUFFER_POOL, - GST_DEBUG_CATEGORY_INIT (gst_va_pool_debug, "vapool", 0, "VA Pool")); - -static const gchar ** -gst_va_pool_get_options (GstBufferPool * pool) -{ - static const gchar *options = { GST_BUFFER_POOL_OPTION_VIDEO_META, NULL }; - return options; -} - -static inline gboolean -gst_buffer_pool_config_get_va_allocation_params (GstStructure * config, - guint32 * usage_hint) -{ - if (!gst_structure_get (config, "usage-hint", G_TYPE_UINT, usage_hint, NULL)) - *usage_hint = VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC; - - return TRUE; -} - -static inline gboolean -gst_buffer_pool_config_get_va_alignment (GstStructure * config, - GstVideoAlignment * align) -{ - return gst_structure_get (config, - "va-padding-top", G_TYPE_UINT, &align->padding_top, - "va-padding-bottom", G_TYPE_UINT, &align->padding_bottom, - "va-padding-left", G_TYPE_UINT, &align->padding_left, - "va-padding-right", G_TYPE_UINT, &align->padding_right, NULL); -} - -static gboolean -gst_va_pool_set_config (GstBufferPool * pool, GstStructure * config) -{ - GstAllocator *allocator; - GstCaps *caps; - GstVaPool *vpool = GST_VA_POOL (pool); - GstVideoAlignment video_align = { 0, }; - GstVideoInfo caps_info, alloc_info; - gint width, height; - guint i, min_buffers, max_buffers; - guint32 usage_hint; - gboolean has_alignment; - - if (!gst_buffer_pool_config_get_params (config, &caps, NULL, &min_buffers, - &max_buffers)) - goto wrong_config; - - if (!caps) - goto no_caps; - - if (!gst_video_info_from_caps (&caps_info, caps)) - goto wrong_caps; - - if (!gst_buffer_pool_config_get_allocator (config, &allocator, NULL)) - goto wrong_config; - - if (!(allocator && (GST_IS_VA_DMABUF_ALLOCATOR (allocator) - || GST_IS_VA_ALLOCATOR (allocator)))) - goto wrong_config; - - if (!gst_buffer_pool_config_get_va_allocation_params (config, &usage_hint)) - goto wrong_config; - - width = GST_VIDEO_INFO_WIDTH (&caps_info); - height = GST_VIDEO_INFO_HEIGHT (&caps_info); - - GST_LOG_OBJECT (vpool, "%dx%d | %" GST_PTR_FORMAT, width, height, caps); - - /* enable metadata based on config of the pool */ - vpool->add_videometa = gst_buffer_pool_config_has_option (config, - GST_BUFFER_POOL_OPTION_VIDEO_META); - - /* parse extra alignment info */ - has_alignment = gst_buffer_pool_config_get_va_alignment (config, - &video_align); - - if (has_alignment) { - width += video_align.padding_left + video_align.padding_right; - height += video_align.padding_bottom + video_align.padding_top; - - if (video_align.padding_left > 0) - vpool->crop_left = video_align.padding_left; - if (video_align.padding_top > 0) - vpool->crop_top = video_align.padding_top; - } - - /* update allocation info with aligned size */ - alloc_info = caps_info; - GST_VIDEO_INFO_WIDTH (&alloc_info) = width; - GST_VIDEO_INFO_HEIGHT (&alloc_info) = height; - - if (GST_IS_VA_DMABUF_ALLOCATOR (allocator)) { - if (!gst_va_dmabuf_allocator_set_format (allocator, &alloc_info, - usage_hint)) - goto failed_allocator; - } else if (GST_IS_VA_ALLOCATOR (allocator)) { - if (!gst_va_allocator_set_format (allocator, &alloc_info, usage_hint)) - goto failed_allocator; - } - - gst_object_replace ((GstObject **) & vpool->allocator, - GST_OBJECT (allocator)); - - vpool->caps_info = caps_info; - vpool->alloc_info = alloc_info; - - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&caps_info); i++) { - if (GST_VIDEO_INFO_PLANE_STRIDE (&caps_info, i) != - GST_VIDEO_INFO_PLANE_STRIDE (&alloc_info, i) || - GST_VIDEO_INFO_PLANE_OFFSET (&caps_info, i) != - GST_VIDEO_INFO_PLANE_OFFSET (&alloc_info, i)) { - GST_INFO_OBJECT (vpool, "Video meta is required in buffer."); - vpool->force_videometa = TRUE; - break; - } - } - - gst_buffer_pool_config_set_params (config, caps, - GST_VIDEO_INFO_SIZE (&alloc_info), min_buffers, max_buffers); - - return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config); - - /* ERRORS */ -wrong_config: - { - GST_WARNING_OBJECT (vpool, "invalid config"); - return FALSE; - } -no_caps: - { - GST_WARNING_OBJECT (vpool, "no caps in config"); - return FALSE; - } -wrong_caps: - { - GST_WARNING_OBJECT (vpool, - "failed getting geometry from caps %" GST_PTR_FORMAT, caps); - return FALSE; - } -failed_allocator: - { - GST_WARNING_OBJECT (vpool, "Failed to set format to allocator"); - return FALSE; - } -} - -static GstFlowReturn -gst_va_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer, - GstBufferPoolAcquireParams * params) -{ - GstBuffer *buf; - GstVaPool *vpool = GST_VA_POOL (pool); - - buf = gst_buffer_new (); - - if (GST_IS_VA_DMABUF_ALLOCATOR (vpool->allocator)) { - if (vpool->starting) { - if (!gst_va_dmabuf_allocator_setup_buffer (vpool->allocator, buf)) - goto no_memory; - } else if (!gst_va_dmabuf_allocator_prepare_buffer (vpool->allocator, buf)) { - if (!gst_va_dmabuf_allocator_setup_buffer (vpool->allocator, buf)) - goto no_memory; - } - } else if (GST_IS_VA_ALLOCATOR (vpool->allocator)) { - if (vpool->starting) { - if (!gst_va_allocator_setup_buffer (vpool->allocator, buf)) - goto no_memory; - } else if (!gst_va_allocator_prepare_buffer (vpool->allocator, buf)) { - if (!gst_va_allocator_setup_buffer (vpool->allocator, buf)) - goto no_memory; - } - } else - goto no_memory; - - if (vpool->add_videometa) { - if (vpool->crop_left > 0 || vpool->crop_top > 0) { - GstVideoCropMeta *crop_meta; - - /* For video crop, its video meta's width and height should be - the full size of uncropped resolution. */ - gst_buffer_add_video_meta_full (buf, GST_VIDEO_FRAME_FLAG_NONE, - GST_VIDEO_INFO_FORMAT (&vpool->alloc_info), - GST_VIDEO_INFO_WIDTH (&vpool->alloc_info), - GST_VIDEO_INFO_HEIGHT (&vpool->alloc_info), - GST_VIDEO_INFO_N_PLANES (&vpool->alloc_info), - vpool->alloc_info.offset, vpool->alloc_info.stride); - - crop_meta = gst_buffer_add_video_crop_meta (buf); - crop_meta->x = vpool->crop_left; - crop_meta->y = vpool->crop_top; - crop_meta->width = GST_VIDEO_INFO_WIDTH (&vpool->caps_info); - crop_meta->height = GST_VIDEO_INFO_HEIGHT (&vpool->caps_info); - } else { - /* GstVaAllocator may update offset/stride given the physical - * memory */ - gst_buffer_add_video_meta_full (buf, GST_VIDEO_FRAME_FLAG_NONE, - GST_VIDEO_INFO_FORMAT (&vpool->caps_info), - GST_VIDEO_INFO_WIDTH (&vpool->caps_info), - GST_VIDEO_INFO_HEIGHT (&vpool->caps_info), - GST_VIDEO_INFO_N_PLANES (&vpool->caps_info), - vpool->alloc_info.offset, vpool->alloc_info.stride); - } - } - - *buffer = buf; - - return GST_FLOW_OK; - - /* ERROR */ -no_memory: - { - gst_buffer_unref (buf); - GST_WARNING_OBJECT (vpool, "can't create memory"); - return GST_FLOW_ERROR; - } -} - -static gboolean -gst_va_pool_start (GstBufferPool * pool) -{ - GstVaPool *vpool = GST_VA_POOL (pool); - gboolean ret; - - vpool->starting = TRUE; - ret = GST_BUFFER_POOL_CLASS (parent_class)->start (pool); - vpool->starting = FALSE; - - return ret; -} - -static gboolean -gst_va_pool_stop (GstBufferPool * pool) -{ - GstVaPool *vpool = GST_VA_POOL (pool); - gboolean ret; - - ret = GST_BUFFER_POOL_CLASS (parent_class)->stop (pool); - - if (GST_IS_VA_DMABUF_ALLOCATOR (vpool->allocator)) - gst_va_dmabuf_allocator_flush (vpool->allocator); - else if (GST_IS_VA_ALLOCATOR (vpool->allocator)) - gst_va_allocator_flush (vpool->allocator); - - return ret; -} - -static void -gst_va_pool_dispose (GObject * object) -{ - GstVaPool *pool = GST_VA_POOL (object); - - GST_LOG_OBJECT (pool, "finalize video buffer pool %p", pool); - - gst_clear_object (&pool->allocator); - - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -static void -gst_va_pool_class_init (GstVaPoolClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstBufferPoolClass *gstbufferpool_class = GST_BUFFER_POOL_CLASS (klass); - - gobject_class->dispose = gst_va_pool_dispose; - - gstbufferpool_class->get_options = gst_va_pool_get_options; - gstbufferpool_class->set_config = gst_va_pool_set_config; - gstbufferpool_class->alloc_buffer = gst_va_pool_alloc; - gstbufferpool_class->start = gst_va_pool_start; - gstbufferpool_class->stop = gst_va_pool_stop; -} - -static void -gst_va_pool_init (GstVaPool * self) -{ -} - -GstBufferPool * -gst_va_pool_new (void) -{ - GstVaPool *pool; - - pool = g_object_new (GST_TYPE_VA_POOL, NULL); - gst_object_ref_sink (pool); - - GST_LOG_OBJECT (pool, "new va video buffer pool %p", pool); - - return GST_BUFFER_POOL_CAST (pool); -} - -void -gst_buffer_pool_config_set_va_allocation_params (GstStructure * config, - guint usage_hint) -{ - gst_structure_set (config, "usage-hint", G_TYPE_UINT, usage_hint, NULL); -} - -void -gst_buffer_pool_config_set_va_alignment (GstStructure * config, - const GstVideoAlignment * align) -{ - gst_structure_set (config, - "va-padding-top", G_TYPE_UINT, align->padding_top, - "va-padding-bottom", G_TYPE_UINT, align->padding_bottom, - "va-padding-left", G_TYPE_UINT, align->padding_left, - "va-padding-right", G_TYPE_UINT, align->padding_right, NULL); -} - -gboolean -gst_va_pool_requires_video_meta (GstBufferPool * pool) -{ - return GST_VA_POOL (pool)->force_videometa; -} - -GstBufferPool * -gst_va_pool_new_with_config (GstCaps * caps, guint size, guint min_buffers, - guint max_buffers, guint usage_hint, GstAllocator * allocator, - GstAllocationParams * alloc_params) -{ - GstBufferPool *pool; - GstStructure *config; - - pool = gst_va_pool_new (); - - config = gst_buffer_pool_get_config (pool); - gst_buffer_pool_config_set_params (config, caps, size, min_buffers, - max_buffers); - gst_buffer_pool_config_set_va_allocation_params (config, usage_hint); - gst_buffer_pool_config_set_allocator (config, allocator, alloc_params); - gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); - - if (!gst_buffer_pool_set_config (pool, config)) - gst_clear_object (&pool); - - return pool; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvapool.h
Deleted
@@ -1,47 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Igalia, S.L. - * Author: Víctor Jáquez <vjaquez@igalia.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#pragma once - -#include <gst/gst.h> -#include <gst/video/video.h> - -G_BEGIN_DECLS - -#define GST_TYPE_VA_POOL (gst_va_pool_get_type()) -G_DECLARE_FINAL_TYPE (GstVaPool, gst_va_pool, GST, VA_POOL, GstBufferPool) - -GstBufferPool * gst_va_pool_new (void); -gboolean gst_va_pool_requires_video_meta (GstBufferPool * pool); -void gst_buffer_pool_config_set_va_allocation_params (GstStructure * config, - guint usage_hint); - -void gst_buffer_pool_config_set_va_alignment (GstStructure * config, - const GstVideoAlignment * align); - -GstBufferPool * gst_va_pool_new_with_config (GstCaps * caps, - guint size, - guint min_buffers, - guint max_buffers, - guint usage_hint, - GstAllocator * allocator, - GstAllocationParams * alloc_params); - -G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvasurfacecopy.c
Deleted
@@ -1,157 +0,0 @@ -/* GStreamer - * Copyright (C) 2021 Igalia, S.L. - * Author: Víctor Jáquez <vjaquez@igalia.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "gstvasurfacecopy.h" - -#include "gstvaallocator.h" -#include "gstvadisplay_priv.h" -#include "gstvafilter.h" -#include "vasurfaceimage.h" - -#define GST_CAT_DEFAULT gst_va_memory_debug -GST_DEBUG_CATEGORY_EXTERN (gst_va_memory_debug); - -struct _GstVaSurfaceCopy -{ - GstVaDisplay *display; - - GstVideoInfo info; - gboolean has_copy; - - GRecMutex lock; - GstVaFilter *filter; -}; - -static gboolean -_has_copy (GstVaDisplay * display) -{ -#if VA_CHECK_VERSION (1, 12, 0) - VADisplay dpy; - VADisplayAttribute attr = { - .type = VADisplayAttribCopy, - .flags = VA_DISPLAY_ATTRIB_GETTABLE, - }; - VAStatus status; - - dpy = gst_va_display_get_va_dpy (display); - - gst_va_display_lock (display); - status = vaGetDisplayAttributes (dpy, &attr, 1); - gst_va_display_unlock (display); - if (status != VA_STATUS_SUCCESS) { - GST_INFO ("vaGetDisplayAttribures: %s", vaErrorStr (status)); - return FALSE; - } - - return TRUE; -#else - return FALSE; -#endif -} - -GstVaSurfaceCopy * -gst_va_surface_copy_new (GstVaDisplay * display, GstVideoInfo * vinfo) -{ - GstVaSurfaceCopy *self; - - g_return_val_if_fail (GST_IS_VA_DISPLAY (display), NULL); - g_return_val_if_fail (vinfo != NULL, NULL); - - self = g_slice_new (GstVaSurfaceCopy); - self->display = gst_object_ref (display); - self->has_copy = _has_copy (display); - self->info = *vinfo; - self->filter = NULL; - g_rec_mutex_init (&self->lock); - - if (gst_va_display_has_vpp (display)) { - self->filter = gst_va_filter_new (display); - if (!(gst_va_filter_open (self->filter) - && gst_va_filter_set_video_info (self->filter, vinfo, vinfo))) - gst_clear_object (&self->filter); - } - - return self; -} - -void -gst_va_surface_copy_free (GstVaSurfaceCopy * self) -{ - g_return_if_fail (self && GST_IS_VA_DISPLAY (self->display)); - - gst_clear_object (&self->display); - if (self->filter) { - gst_va_filter_close (self->filter); - gst_clear_object (&self->filter); - } - - g_rec_mutex_clear (&self->lock); - - g_slice_free (GstVaSurfaceCopy, self); -} - -static gboolean -_vpp_copy_surface (GstVaSurfaceCopy * self, VASurfaceID dst, VASurfaceID src) -{ - gboolean ret; - - GstVaSample gst_src = { - .surface = src, - }; - GstVaSample gst_dst = { - .surface = dst, - }; - - g_rec_mutex_lock (&self->lock); - ret = gst_va_filter_process (self->filter, &gst_src, &gst_dst); - g_rec_mutex_unlock (&self->lock); - - return ret; -} - -gboolean -gst_va_surface_copy (GstVaSurfaceCopy * self, VASurfaceID dst, VASurfaceID src) -{ - VAImage image = {.image_id = VA_INVALID_ID, }; - gboolean ret; - - g_return_val_if_fail (self && GST_IS_VA_DISPLAY (self->display), FALSE); - - if (self->has_copy && va_copy_surface (self->display, dst, src)) { - GST_LOG ("GPU copy of %#x to %#x", src, dst); - return TRUE; - } - - if (self->filter && _vpp_copy_surface (self, dst, src)) { - GST_LOG ("VPP copy of %#x to %#x", src, dst); - return TRUE; - } - - if (!va_ensure_image (self->display, src, &self->info, &image, FALSE)) - return FALSE; - - if ((ret = va_put_image (self->display, dst, &image))) - GST_LOG ("shallow copy of %#x to %#x", src, dst); - - va_unmap_buffer (self->display, image.buf); - va_destroy_image (self->display, image.image_id); - - return ret; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvasurfacecopy.h
Deleted
@@ -1,43 +0,0 @@ -/* GStreamer - * Copyright (C) 2021 Igalia, S.L. - * Author: Víctor Jáquez <vjaquez@igalia.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#pragma once - -#include <gst/va/gstvadisplay.h> -#include <gst/video/video.h> -#include <va/va.h> - -G_BEGIN_DECLS - -/** - * Opaque object helper for copying surfaces. - * - * It's purpose is to avoid circular dependencies. - */ -typedef struct _GstVaSurfaceCopy GstVaSurfaceCopy; - -GstVaSurfaceCopy * gst_va_surface_copy_new (GstVaDisplay * display, - GstVideoInfo * vinfo); -void gst_va_surface_copy_free (GstVaSurfaceCopy * self); -gboolean gst_va_surface_copy (GstVaSurfaceCopy * self, - VASurfaceID dst, - VASurfaceID src); - -G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvautils.c
Deleted
@@ -1,351 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Igalia, S.L. - * Author: Víctor Jáquez <vjaquez@igalia.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstvautils.h" -#include <gst/va/gstvadisplay_drm.h> -#include <gst/va/gstvadisplay_wrapped.h> - -GST_DEBUG_CATEGORY_STATIC (GST_CAT_CONTEXT); - -static void -_init_context_debug (void) -{ -#ifndef GST_DISABLE_GST_DEBUG - static gsize _init = 0; - - if (g_once_init_enter (&_init)) { - GST_DEBUG_CATEGORY_GET (GST_CAT_CONTEXT, "GST_CONTEXT"); - g_once_init_leave (&_init, 1); - } -#endif -} - -static gboolean -gst_va_display_found (GstElement * element, GstVaDisplay * display) -{ - _init_context_debug (); - - if (display) { - GST_CAT_LOG_OBJECT (GST_CAT_CONTEXT, element, "already have a display (%p)", - display); - return TRUE; - } - - return FALSE; -} - -static gboolean -pad_query (const GValue * item, GValue * value, gpointer user_data) -{ - GstPad *pad = g_value_get_object (item); - GstQuery *query = user_data; - gboolean res; - - _init_context_debug (); - - res = gst_pad_peer_query (pad, query); - - if (res) { - g_value_set_boolean (value, TRUE); - return FALSE; - } - - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, pad, "pad peer query failed"); - return TRUE; -} - -static gboolean -_gst_va_run_query (GstElement * element, GstQuery * query, - GstPadDirection direction) -{ - GstIterator *it; - GstIteratorFoldFunction func = pad_query; - GValue res = G_VALUE_INIT; - - g_value_init (&res, G_TYPE_BOOLEAN); - g_value_set_boolean (&res, FALSE); - - if (direction == GST_PAD_SRC) - it = gst_element_iterate_src_pads (element); - else - it = gst_element_iterate_sink_pads (element); - - while (gst_iterator_fold (it, func, &res, query) == GST_ITERATOR_RESYNC) - gst_iterator_resync (it); - - gst_iterator_free (it); - - return g_value_get_boolean (&res); -} - -static void -_gst_context_query (GstElement * element, const gchar * context_type) -{ - GstQuery *query; - GstContext *ctxt = NULL; - - _init_context_debug (); - - /* 2a) Query downstream with GST_QUERY_CONTEXT for the context and - * check if downstream already has a context of the specific type - * 2b) Query upstream as above. - */ - query = gst_query_new_context (context_type); - if (_gst_va_run_query (element, query, GST_PAD_SRC)) { - gst_query_parse_context (query, &ctxt); - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, - "found context (%p) in downstream query", ctxt); - gst_element_set_context (element, ctxt); - } else if (_gst_va_run_query (element, query, GST_PAD_SINK)) { - gst_query_parse_context (query, &ctxt); - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, - "found context (%p) in upstream query", ctxt); - gst_element_set_context (element, ctxt); - } else { - /* 3) Post a GST_MESSAGE_NEED_CONTEXT message on the bus with - * the required context type and afterwards check if a - * usable context was set now as in 1). The message could - * be handled by the parent bins of the element and the - * application. - */ - GstMessage *msg; - - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, - "posting need context message"); - msg = gst_message_new_need_context (GST_OBJECT_CAST (element), - context_type); - gst_element_post_message (element, msg); - } - - /* - * Whomever responds to the need-context message performs a - * GstElement::set_context() with the required context in which the element - * is required to update the display_ptr or call gst_va_handle_set_context(). - */ - - gst_query_unref (query); -} - -/* 4) Create a context by itself and post a GST_MESSAGE_HAVE_CONTEXT - * message. - */ -void -gst_va_element_propagate_display_context (GstElement * element, - GstVaDisplay * display) -{ - GstContext *ctxt; - GstMessage *msg; - - if (!display) { - GST_ERROR_OBJECT (element, "Could not get VA display connection"); - return; - } - - _init_context_debug (); - - ctxt = gst_context_new (GST_VA_DISPLAY_HANDLE_CONTEXT_TYPE_STR, TRUE); - gst_context_set_va_display (ctxt, display); - - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, - "post have context (%p) message with display (%p)", ctxt, display); - msg = gst_message_new_have_context (GST_OBJECT_CAST (element), ctxt); - gst_element_post_message (element, msg); -} - -gboolean -gst_va_ensure_element_data (gpointer element, const gchar * render_device_path, - GstVaDisplay ** display_ptr) -{ - GstVaDisplay *display; - - g_return_val_if_fail (element, FALSE); - g_return_val_if_fail (render_device_path, FALSE); - g_return_val_if_fail (display_ptr, FALSE); - - /* 1) Check if the element already has a context of the specific - * type. - */ - if (gst_va_display_found (element, g_atomic_pointer_get (display_ptr))) - goto done; - - _gst_context_query (element, GST_VA_DISPLAY_HANDLE_CONTEXT_TYPE_STR); - - /* Neighbour found and it updated the display */ - if (gst_va_display_found (element, g_atomic_pointer_get (display_ptr))) - goto done; - - /* If no neighbor, or application not interested, use drm */ - display = gst_va_display_drm_new_from_path (render_device_path); - - gst_object_replace ((GstObject **) display_ptr, (GstObject *) display); - - gst_va_element_propagate_display_context (element, display); - - gst_clear_object (&display); - -done: - return g_atomic_pointer_get (display_ptr) != NULL; -} - -gboolean -gst_va_handle_set_context (GstElement * element, GstContext * context, - const gchar * render_device_path, GstVaDisplay ** display_ptr) -{ - GstVaDisplay *display_replacement = NULL; - const gchar *context_type, *type_name; - - g_return_val_if_fail (display_ptr, FALSE); - - if (!context) - return FALSE; - - context_type = gst_context_get_context_type (context); - - if (g_strcmp0 (context_type, GST_VA_DISPLAY_HANDLE_CONTEXT_TYPE_STR) == 0) { - type_name = G_OBJECT_TYPE_NAME (element); - if (!gst_context_get_va_display (context, type_name, render_device_path, - &display_replacement)) { - GST_CAT_WARNING_OBJECT (GST_CAT_CONTEXT, element, - "Failed to get display from context"); - return FALSE; - } - } - - if (display_replacement) { - gst_object_replace ((GstObject **) display_ptr, - (GstObject *) display_replacement); - gst_object_unref (display_replacement); - } - - return TRUE; -} - -gboolean -gst_va_handle_context_query (GstElement * element, GstQuery * query, - GstVaDisplay * display) -{ - const gchar *context_type; - GstContext *ctxt, *old_ctxt; - - g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE); - g_return_val_if_fail (GST_IS_QUERY (query), FALSE); - g_return_val_if_fail (!display || GST_IS_VA_DISPLAY (display), FALSE); - - _init_context_debug (); - - GST_CAT_LOG_OBJECT (GST_CAT_CONTEXT, element, - "handle context query %" GST_PTR_FORMAT, query); - gst_query_parse_context_type (query, &context_type); - - if (!display - || g_strcmp0 (context_type, GST_VA_DISPLAY_HANDLE_CONTEXT_TYPE_STR) != 0) - return FALSE; - - gst_query_parse_context (query, &old_ctxt); - - if (old_ctxt) - ctxt = gst_context_copy (old_ctxt); - else - ctxt = gst_context_new (GST_VA_DISPLAY_HANDLE_CONTEXT_TYPE_STR, TRUE); - - gst_context_set_va_display (ctxt, display); - gst_query_set_context (query, ctxt); - gst_context_unref (ctxt); - GST_CAT_DEBUG_OBJECT (GST_CAT_CONTEXT, element, - "successuflly %" GST_PTR_FORMAT " on %" GST_PTR_FORMAT, display, query); - - return TRUE; -} - -gboolean -gst_context_get_va_display (GstContext * context, const gchar * type_name, - const gchar * render_device_path, GstVaDisplay ** display_ptr) -{ - const GstStructure *s; - GstVaDisplay *display = NULL; - gpointer dpy; - gboolean is_devnode; - - g_return_val_if_fail (display_ptr, FALSE); - g_return_val_if_fail (context, FALSE); - - is_devnode = (g_strstr_len (type_name, -1, "renderD") != NULL); - - s = gst_context_get_structure (context); - if (gst_structure_get (s, "gst-display", GST_TYPE_OBJECT, &display, NULL)) { - gchar *device_path = NULL; - gboolean ret; - - if (GST_IS_VA_DISPLAY_DRM (display)) { - g_object_get (display, "path", &device_path, NULL); - ret = (g_strcmp0 (device_path, render_device_path) == 0); - g_free (device_path); - if (ret) - goto accept; - } else if (GST_IS_VA_DISPLAY (display) && !is_devnode) { - goto accept; - } - - /* let's try other fields */ - gst_clear_object (&display); - } - - /* if element is render device node specific, it doesn't accept - * VADisplay from users */ - if (!is_devnode - && gst_structure_get (s, "va-display", G_TYPE_POINTER, &dpy, NULL)) { - if ((display = gst_va_display_wrapped_new (dpy))) - goto accept; - } - - GST_CAT_DEBUG (GST_CAT_CONTEXT, "No valid GstVaDisplay from context (%p)", - context); - return FALSE; - -accept: - { - *display_ptr = display; - - GST_CAT_LOG (GST_CAT_CONTEXT, "got GstVaDisplay (%p) from context (%p)", - *display_ptr, context); - return TRUE; - } -} - -void -gst_context_set_va_display (GstContext * context, GstVaDisplay * display) -{ - GstStructure *s; - - g_return_if_fail (context != NULL); - - if (display) { - GST_CAT_LOG (GST_CAT_CONTEXT, - "setting GstVaDisplay (%" GST_PTR_FORMAT ") on context (%" - GST_PTR_FORMAT ")", display, context); - } - - s = gst_context_writable_structure (context); - gst_structure_set (s, "gst-display", GST_TYPE_OBJECT, display, NULL); -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvautils.h
Deleted
@@ -1,47 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Igalia, S.L. - * Author: Víctor Jáquez <vjaquez@igalia.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#pragma once - -#include <gst/va/gstvadisplay.h> - -G_BEGIN_DECLS - -gboolean gst_va_ensure_element_data (gpointer element, - const gchar *render_device_path, - GstVaDisplay ** display_ptr); -gboolean gst_va_handle_set_context (GstElement * element, - GstContext * context, - const gchar *render_device_path, - GstVaDisplay ** display_ptr); -gboolean gst_va_handle_context_query (GstElement * element, - GstQuery * query, - GstVaDisplay * display); -void gst_va_element_propagate_display_context (GstElement * element, - GstVaDisplay * display); - -gboolean gst_context_get_va_display (GstContext * context, - const gchar * type_name, - const gchar * render_device_path, - GstVaDisplay ** display_ptr); -void gst_context_set_va_display (GstContext * context, - GstVaDisplay * display); - -G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvavideoformat.c
Deleted
@@ -1,390 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Igalia, S.L. - * Author: Víctor Jáquez <vjaquez@igalia.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstvavideoformat.h" - -GST_DEBUG_CATEGORY_STATIC (gstva_debug); - -#define VA_NSB_FIRST 0 /* No Significant Bit */ - -/* *INDENT-OFF* */ -static struct FormatMap -{ - GstVideoFormat format; - guint va_rtformat; - VAImageFormat va_format; -} format_map = { -#define F(format, fourcc, rtformat, order, bpp, depth, r, g, b, a) { \ - G_PASTE (GST_VIDEO_FORMAT_, format), \ - G_PASTE (VA_RT_FORMAT_, rtformat), \ - { VA_FOURCC fourcc, G_PASTE (G_PASTE (VA_, order), _FIRST), \ - bpp, depth, r, g, b, a } } -#define G(format, fourcc, rtformat, order, bpp) \ - F (format, fourcc, rtformat, order, bpp, 0, 0, 0 ,0, 0) - G (NV12, ('N', 'V', '1', '2'), YUV420, NSB, 12), - G (NV21, ('N', 'V', '2', '1'), YUV420, NSB, 21), - G (VUYA, ('A', 'Y', 'U', 'V'), YUV444, LSB, 32), - F (RGBA, ('R', 'G', 'B', 'A'), RGB32, LSB, 32, 32, 0x000000ff, - 0x0000ff00, 0x00ff0000, 0xff000000), - F (RGBx, ('R', 'G', 'B', 'X'), RGB32, LSB, 32, 24, 0x000000ff, - 0x0000ff00, 0x00ff0000, 0x00000000), - F (BGRA, ('B', 'G', 'R', 'A'), RGB32, LSB, 32, 32, 0x00ff0000, - 0x0000ff00, 0x000000ff, 0xff000000), - F (ARGB, ('A', 'R', 'G', 'B'), RGB32, LSB, 32, 32, 0x0000ff00, - 0x00ff0000, 0xff000000, 0x000000ff), - F (xRGB, ('X', 'R', 'G', 'B'), RGB32, LSB, 32, 24, 0x0000ff00, - 0x00ff0000, 0xff000000, 0x00000000), - F (ABGR, ('A', 'B', 'G', 'R'), RGB32, LSB, 32, 32, 0xff000000, - 0x00ff0000, 0x0000ff00, 0x000000ff), - F (xBGR, ('X', 'B', 'G', 'R'), RGB32, LSB, 32, 24, 0xff000000, - 0x00ff0000, 0x0000ff00, 0x00000000), - F (BGRx, ('B', 'G', 'R', 'X'), RGB32, LSB, 32, 24, 0x00ff0000, - 0x0000ff00, 0x000000ff, 0x00000000), - G (UYVY, ('U', 'Y', 'V', 'Y'), YUV422, NSB, 16), - G (YUY2, ('Y', 'U', 'Y', '2'), YUV422, NSB, 16), - G (AYUV, ('A', 'Y', 'U', 'V'), YUV444, LSB, 32), - /* F (????, NV11), */ - G (YV12, ('Y', 'V', '1', '2'), YUV420, NSB, 12), - /* F (????, P208), */ - G (I420, ('I', '4', '2', '0'), YUV420, NSB, 12), - /* F (????, YV24), */ - /* F (????, YV32), */ - /* F (????, Y800), */ - /* F (????, IMC3), */ - /* F (????, 411P), */ - /* F (????, 411R), */ - /* F (????, 422H), */ - /* F (????, 422V), */ - /* F (????, 444P), */ - /* F (????, RGBP), */ - /* F (????, BGRP), */ - /* F (????, RGB565), */ - /* F (????, BGR565), */ - G (Y210, ('Y', '2', '1', '0'), YUV422_10, NSB, 32), - /* F (????, Y216), */ - G (Y410, ('Y', '4', '1', '0'), YUV444_10, NSB, 32), - G (Y212_LE, ('Y', '2', '1', '2'), YUV422_12, NSB, 32), - G (Y412_LE, ('Y', '4', '1', '2'), YUV444_12, NSB, 32), - /* F (????, Y416), */ - /* F (????, YV16), */ - G (P010_10LE, ('P', '0', '1', '0'), YUV420_10, NSB, 24), - G (P012_LE, ('P', '0', '1', '2'), YUV420_12, NSB, 24), - /* F (P016_LE, P016, ????), */ - /* F (????, I010), */ - /* F (????, IYUV), */ - /* F (????, A2R10G10B10), */ - /* F (????, A2B10G10R10), */ - /* F (????, X2R10G10B10), */ - /* F (????, X2B10G10R10), */ - G (GRAY8, ('Y', '8', '0', '0'), YUV400, NSB, 8), - G (Y444, ('4', '4', '4', 'P'), YUV444, NSB, 24), - /* F (????, Y16), */ - /* G (VYUY, VYUY, YUV422), */ - /* G (YVYU, YVYU, YUV422), */ - /* F (ARGB64, ARGB64, ????), */ - /* F (????, ABGR64), */ - F (RGB16, ('R', 'G', '1', '6'), RGB16, NSB, 16, 16, 0x0000f800, - 0x000007e0, 0x0000001f, 0x00000000), - F (RGB, ('R', 'G', '2', '4'), RGB32, NSB, 32, 24, 0x00ff0000, - 0x0000ff00, 0x000000ff, 0x00000000), - F (BGR10A2_LE, ('A', 'R', '3', '0'), RGB32, LSB, 32, 30, 0x3ff00000, - 0x000ffc00, 0x000003ff, 0x30000000), -#undef F -#undef G -}; - -static const struct RBG32FormatMap -{ - GstVideoFormat format; - VAImageFormat va_format2; -} rgb32_format_map = { -#define F(fourcc, order, bpp, depth, r, g, b, a) \ - { VA_FOURCC fourcc, G_PASTE (G_PASTE (VA_, order), _FIRST), bpp, depth, r, g, b, a } -#define A(fourcc, order, r, g, b, a) F (fourcc, order, 32, 32, r, g, b, a) -#define X(fourcc, order, r, g, b) F (fourcc, order, 32, 24, r, g, b, 0x0) - { GST_VIDEO_FORMAT_ARGB, { - A (('B', 'G', 'R', 'A'), LSB, 0x0000ff00, 0x00ff0000, 0xff000000, 0x000000ff), - A (('A', 'R', 'G', 'B'), MSB, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000), - } }, - { GST_VIDEO_FORMAT_RGBA, { - A (('A', 'B', 'G', 'R'), LSB, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000), - A (('R', 'G', 'B', 'A'), MSB, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff), - } }, - { GST_VIDEO_FORMAT_ABGR, { - A (('R', 'G', 'B', 'A'), LSB, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff), - A (('A', 'B', 'G', 'R'), MSB, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000), - } }, - { GST_VIDEO_FORMAT_BGRA, { - A (('A', 'R', 'G', 'B'), LSB, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000), - A (('B', 'G', 'R', 'A'), MSB, 0x0000ff00, 0x00ff0000, 0xff000000, 0x000000ff), - } }, - { GST_VIDEO_FORMAT_xRGB, { - X (('B', 'G', 'R', 'X'), LSB, 0x0000ff00, 0x00ff0000, 0xff000000), - X (('X', 'R', 'G', 'B'), MSB, 0x00ff0000, 0x0000ff00, 0x000000ff), - } }, - { GST_VIDEO_FORMAT_RGBx, { - X (('X', 'B', 'G', 'R'), LSB, 0x000000ff, 0x0000ff00, 0x00ff0000), - X (('R', 'G', 'B', 'X'), MSB, 0xff000000, 0x00ff0000, 0x0000ff00), - } }, - { GST_VIDEO_FORMAT_xBGR, { - X (('R', 'G', 'B', 'X'), LSB, 0xff000000, 0x00ff0000, 0x0000ff00), - X (('X', 'B', 'G', 'R'), MSB, 0x000000ff, 0x0000ff00, 0x00ff0000), - } }, - { GST_VIDEO_FORMAT_BGRx, { - X (('X', 'R', 'G', 'B'), LSB, 0x00ff0000, 0x0000ff00, 0x000000ff), - X (('B', 'G', 'R', 'X'), MSB, 0x0000ff00, 0x00ff0000, 0xff000000), - } }, -#undef X -#undef A -#undef F -}; -/* *INDENT-ON* */ - -static const struct FormatMap * -get_format_map_from_va_fourcc (guint va_fourcc) -{ - int i; - - for (i = 0; i < G_N_ELEMENTS (format_map); i++) { - if (format_mapi.va_format.fourcc == va_fourcc) - return &format_mapi; - } - - return NULL; -} - -static struct FormatMap * -get_format_map_from_video_format (GstVideoFormat format) -{ - int i; - - for (i = 0; i < G_N_ELEMENTS (format_map); i++) { - if (format_mapi.format == format) - return &format_mapi; - } - - return NULL; -} - -static inline gboolean -va_format_is_rgb (const VAImageFormat * va_format) -{ - return va_format->depth != 0; -} - -static inline gboolean -va_format_is_same_rgb (const VAImageFormat * fmt1, const VAImageFormat * fmt2) -{ - return (fmt1->red_mask == fmt2->red_mask - && fmt1->green_mask == fmt2->green_mask - && fmt1->blue_mask == fmt2->blue_mask - && fmt1->alpha_mask == fmt2->alpha_mask); -} - -static inline gboolean -va_format_is_same (const VAImageFormat * fmt1, const VAImageFormat * fmt2) -{ - if (fmt1->fourcc != fmt2->fourcc) - return FALSE; - if (fmt1->byte_order != VA_NSB_FIRST - && fmt2->byte_order != VA_NSB_FIRST - && fmt1->byte_order != fmt2->byte_order) - return FALSE; - return va_format_is_rgb (fmt1) ? va_format_is_same_rgb (fmt1, fmt2) : TRUE; -} - -static const struct FormatMap * -get_format_map_from_va_image_format (const VAImageFormat * va_format) -{ - int i; - - for (i = 0; i < G_N_ELEMENTS (format_map); i++) { - if (va_format_is_same (&format_mapi.va_format, va_format)) - return &format_mapi; - } - - return NULL; -} - -GstVideoFormat -gst_va_video_format_from_va_fourcc (guint va_fourcc) -{ - const struct FormatMap *map = get_format_map_from_va_fourcc (va_fourcc); - - return map ? map->format : GST_VIDEO_FORMAT_UNKNOWN; -} - -guint -gst_va_fourcc_from_video_format (GstVideoFormat format) -{ - const struct FormatMap *map = get_format_map_from_video_format (format); - - return map ? map->va_format.fourcc : 0; -} - -guint -gst_va_chroma_from_video_format (GstVideoFormat format) -{ - const struct FormatMap *map = get_format_map_from_video_format (format); - - return map ? map->va_rtformat : 0; -} - -const VAImageFormat * -gst_va_image_format_from_video_format (GstVideoFormat format) -{ - const struct FormatMap *map = get_format_map_from_video_format (format); - - return map ? &map->va_format : NULL; -} - -GstVideoFormat -gst_va_video_format_from_va_image_format (const VAImageFormat * va_format) -{ - const struct FormatMap *map = get_format_map_from_va_image_format (va_format); - - return map ? map->format : GST_VIDEO_FORMAT_UNKNOWN; -} - -GstVideoFormat -gst_va_video_surface_format_from_image_format (GstVideoFormat image_format, - GArray * surface_formats) -{ - GstVideoFormat surface_format; - guint i, image_chroma; - - if (image_format == GST_VIDEO_FORMAT_UNKNOWN) - return GST_VIDEO_FORMAT_UNKNOWN; - - if (!surface_formats || surface_formats->len == 0) - return GST_VIDEO_FORMAT_UNKNOWN; - - image_chroma = gst_va_chroma_from_video_format (image_format); - if (image_chroma == 0) - return GST_VIDEO_FORMAT_UNKNOWN; - - for (i = 0; i < surface_formats->len; i++) { - surface_format = g_array_index (surface_formats, GstVideoFormat, i); - - if (surface_format == image_format) - return surface_format; - } - - return GST_VIDEO_FORMAT_UNKNOWN; -} - -static GstVideoFormat -find_gst_video_format_in_rgb32_map (VAImageFormat * image_format) -{ - guint i, j; - - for (i = 0; i < G_N_ELEMENTS (rgb32_format_map); i++) { - for (j = 0; j < G_N_ELEMENTS (rgb32_format_mapi.va_format); j++) { - if (va_format_is_same (&rgb32_format_mapi.va_formatj, image_format)) - return rgb32_format_mapi.format; - } - } - - return GST_VIDEO_FORMAT_UNKNOWN; -} - -struct ImageFormatArray -{ - VAImageFormat *image_formats; - gint len; -}; - -static gpointer -fix_map (gpointer data) -{ - struct ImageFormatArray *args = data; - GstVideoFormat format; - VAImageFormat *image_format; - struct FormatMap *map; - guint i; - - GST_DEBUG_CATEGORY_GET (gstva_debug, "va"); - - for (i = 0; i < args->len; i++) { - image_format = &args->image_formatsi; - if (!va_format_is_rgb (image_format)) - continue; - format = find_gst_video_format_in_rgb32_map (image_format); - if (format == GST_VIDEO_FORMAT_UNKNOWN) - continue; - map = get_format_map_from_video_format (format); - if (!map) - continue; - if (va_format_is_same (&map->va_format, image_format)) - continue; - - map->va_format = *image_format; - - GST_CAT_INFO (gstva_debug, "GST_VIDEO_FORMAT_%s => { fourcc %" - GST_FOURCC_FORMAT ", %s, bpp %d, depth %d, R %#010x, G %#010x, " - "B %#010x, A %#010x }", gst_video_format_to_string (map->format), - GST_FOURCC_ARGS (map->va_format.fourcc), - (map->va_format.byte_order == 1) ? "LSB" : "MSB", - map->va_format.bits_per_pixel, map->va_format.depth, - map->va_format.red_mask, map->va_format.green_mask, - map->va_format.blue_mask, map->va_format.alpha_mask); - } - - return NULL; -} - -/* XXX: RGB32 LSB VAImageFormats don't map statically with GStreamer - * color formats. Each driver does what they want. - * - * For MSB, there is no ambiguity: same order in define, memory and - * CPU. For example, - * - * RGBA is RGBA in memory and RGBA with channel mask R:0xFF0000 - * G:0x00FF0000 B:0x0000FF00 A:0x000000FF in CPU. - * - * For LSB, CPU's perspective and memory's perspective are - * different. For example, - * - * From CPU's perspective, it's RGBA order in memory, but when it is - * stored in memory, because CPU's little endianness, it will be - * re-ordered, with mask R:0x000000FF G:0x0000FF00 B:0x00FF0000 - * A:0xFF000000. - * - * In other words, from memory's perspective, RGBA LSB is equal as - * ABGR MSB. - * - * These definitions are mixed used all over the media system and we - * need to correct the mapping form VA video format to GStreamer - * video format in both manners. - * - * https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/123 - */ -void -gst_va_video_format_fix_map (VAImageFormat * image_formats, gint num) -{ - static GOnce once = G_ONCE_INIT; - struct ImageFormatArray args = { image_formats, num }; - - g_once (&once, fix_map, &args); -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvavideoformat.h
Deleted
@@ -1,38 +0,0 @@ -/* GStreamer - * Copyright (C) 2020 Igalia, S.L. - * Author: Víctor Jáquez <vjaquez@igalia.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#pragma once - -#include <gst/video/video.h> -#include <va/va.h> - -G_BEGIN_DECLS - -GstVideoFormat gst_va_video_format_from_va_fourcc (guint fourcc); -guint gst_va_fourcc_from_video_format (GstVideoFormat format); -guint gst_va_chroma_from_video_format (GstVideoFormat format); -const VAImageFormat * gst_va_image_format_from_video_format (GstVideoFormat format); -GstVideoFormat gst_va_video_format_from_va_image_format (const VAImageFormat * va_format); -GstVideoFormat gst_va_video_surface_format_from_image_format (GstVideoFormat image_format, - GArray * surface_formats); -void gst_va_video_format_fix_map (VAImageFormat * image_formats, - gint num); - -G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/vasurfaceimage.c
Deleted
@@ -1,352 +0,0 @@ -/* GStreamer - * Copyright (C) 2021 Igalia, S.L. - * Author: Víctor Jáquez <vjaquez@igalia.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "vasurfaceimage.h" - -#include "gstvavideoformat.h" -#include <va/va.h> - -gboolean -va_destroy_surfaces (GstVaDisplay * display, VASurfaceID * surfaces, - gint num_surfaces) -{ - VADisplay dpy = gst_va_display_get_va_dpy (display); - VAStatus status; - - g_return_val_if_fail (num_surfaces > 0, FALSE); - - gst_va_display_lock (display); - status = vaDestroySurfaces (dpy, surfaces, num_surfaces); - gst_va_display_unlock (display); - if (status != VA_STATUS_SUCCESS) { - GST_ERROR ("vaDestroySurfaces: %s", vaErrorStr (status)); - return FALSE; - } - - return TRUE; - -} - -gboolean -va_create_surfaces (GstVaDisplay * display, guint rt_format, guint fourcc, - guint width, guint height, gint usage_hint, - VASurfaceAttribExternalBuffers * ext_buf, VASurfaceID * surfaces, - guint num_surfaces) -{ - VADisplay dpy = gst_va_display_get_va_dpy (display); - /* *INDENT-OFF* */ - VASurfaceAttrib attrs5 = { - { - .type = VASurfaceAttribUsageHint, - .flags = VA_SURFACE_ATTRIB_SETTABLE, - .value.type = VAGenericValueTypeInteger, - .value.value.i = usage_hint, - }, - { - .type = VASurfaceAttribMemoryType, - .flags = VA_SURFACE_ATTRIB_SETTABLE, - .value.type = VAGenericValueTypeInteger, - .value.value.i = (ext_buf && ext_buf->num_buffers > 0) - ? VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME - : VA_SURFACE_ATTRIB_MEM_TYPE_VA, - }, - }; - /* *INDENT-ON* */ - VAStatus status; - guint num_attrs = 2; - - g_return_val_if_fail (num_surfaces > 0, FALSE); - - if (fourcc > 0) { - /* *INDENT-OFF* */ - attrsnum_attrs++ = (VASurfaceAttrib) { - .type = VASurfaceAttribPixelFormat, - .flags = VA_SURFACE_ATTRIB_SETTABLE, - .value.type = VAGenericValueTypeInteger, - .value.value.i = fourcc, - }; - /* *INDENT-ON* */ - } - - if (ext_buf) { - /* *INDENT-OFF* */ - attrsnum_attrs++ = (VASurfaceAttrib) { - .type = VASurfaceAttribExternalBufferDescriptor, - .flags = VA_SURFACE_ATTRIB_SETTABLE, - .value.type = VAGenericValueTypePointer, - .value.value.p = ext_buf, - }; - /* *INDENT-ON* */ - } - - gst_va_display_lock (display); - status = vaCreateSurfaces (dpy, rt_format, width, height, surfaces, - num_surfaces, attrs, num_attrs); - gst_va_display_unlock (display); - if (status != VA_STATUS_SUCCESS) { - GST_ERROR ("vaCreateSurfaces: %s", vaErrorStr (status)); - return FALSE; - } - - return TRUE; -} - -gboolean -va_export_surface_to_dmabuf (GstVaDisplay * display, VASurfaceID surface, - guint32 flags, VADRMPRIMESurfaceDescriptor * desc) -{ - VADisplay dpy = gst_va_display_get_va_dpy (display); - VAStatus status; - - gst_va_display_lock (display); - status = vaExportSurfaceHandle (dpy, surface, - VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2, flags, desc); - gst_va_display_unlock (display); - if (status != VA_STATUS_SUCCESS) { - GST_ERROR ("vaExportSurfaceHandle: %s", vaErrorStr (status)); - return FALSE; - } - - return TRUE; -} - -gboolean -va_destroy_image (GstVaDisplay * display, VAImageID image_id) -{ - VADisplay dpy = gst_va_display_get_va_dpy (display); - VAStatus status; - - gst_va_display_lock (display); - status = vaDestroyImage (dpy, image_id); - gst_va_display_unlock (display); - if (status != VA_STATUS_SUCCESS) { - GST_ERROR ("vaDestroyImage: %s", vaErrorStr (status)); - return FALSE; - } - return TRUE; -} - -gboolean -va_get_derive_image (GstVaDisplay * display, VASurfaceID surface, - VAImage * image) -{ - VADisplay dpy = gst_va_display_get_va_dpy (display); - VAStatus status; - - gst_va_display_lock (display); - status = vaDeriveImage (dpy, surface, image); - gst_va_display_unlock (display); - if (status != VA_STATUS_SUCCESS) { - GST_WARNING ("vaDeriveImage: %s", vaErrorStr (status)); - return FALSE; - } - - return TRUE; -} - -gboolean -va_create_image (GstVaDisplay * display, GstVideoFormat format, gint width, - gint height, VAImage * image) -{ - VADisplay dpy = gst_va_display_get_va_dpy (display); - const VAImageFormat *va_format; - VAStatus status; - - va_format = gst_va_image_format_from_video_format (format); - if (!va_format) - return FALSE; - - gst_va_display_lock (display); - status = - vaCreateImage (dpy, (VAImageFormat *) va_format, width, height, image); - gst_va_display_unlock (display); - if (status != VA_STATUS_SUCCESS) { - GST_ERROR ("vaCreateImage: %s", vaErrorStr (status)); - return FALSE; - } - return TRUE; -} - -gboolean -va_get_image (GstVaDisplay * display, VASurfaceID surface, VAImage * image) -{ - VADisplay dpy = gst_va_display_get_va_dpy (display); - VAStatus status; - - gst_va_display_lock (display); - status = vaGetImage (dpy, surface, 0, 0, image->width, image->height, - image->image_id); - gst_va_display_unlock (display); - if (status != VA_STATUS_SUCCESS) { - GST_ERROR ("vaGetImage: %s", vaErrorStr (status)); - return FALSE; - } - - return TRUE; -} - -gboolean -va_sync_surface (GstVaDisplay * display, VASurfaceID surface) -{ - VADisplay dpy = gst_va_display_get_va_dpy (display); - VAStatus status; - - gst_va_display_lock (display); - status = vaSyncSurface (dpy, surface); - gst_va_display_unlock (display); - if (status != VA_STATUS_SUCCESS) { - GST_WARNING ("vaSyncSurface: %s", vaErrorStr (status)); - return FALSE; - } - return TRUE; -} - -gboolean -va_map_buffer (GstVaDisplay * display, VABufferID buffer, gpointer * data) -{ - VADisplay dpy = gst_va_display_get_va_dpy (display); - VAStatus status; - - gst_va_display_lock (display); - status = vaMapBuffer (dpy, buffer, data); - gst_va_display_unlock (display); - if (status != VA_STATUS_SUCCESS) { - GST_WARNING ("vaMapBuffer: %s", vaErrorStr (status)); - return FALSE; - } - return TRUE; -} - -gboolean -va_unmap_buffer (GstVaDisplay * display, VABufferID buffer) -{ - VADisplay dpy = gst_va_display_get_va_dpy (display); - VAStatus status; - - gst_va_display_lock (display); - status = vaUnmapBuffer (dpy, buffer); - gst_va_display_unlock (display); - if (status != VA_STATUS_SUCCESS) { - GST_WARNING ("vaUnmapBuffer: %s", vaErrorStr (status)); - return FALSE; - } - return TRUE; -} - -gboolean -va_put_image (GstVaDisplay * display, VASurfaceID surface, VAImage * image) -{ - VADisplay dpy = gst_va_display_get_va_dpy (display); - VAStatus status; - - if (!va_sync_surface (display, surface)) - return FALSE; - - gst_va_display_lock (display); - status = vaPutImage (dpy, surface, image->image_id, 0, 0, image->width, - image->height, 0, 0, image->width, image->height); - gst_va_display_unlock (display); - if (status != VA_STATUS_SUCCESS) { - GST_ERROR ("vaPutImage: %s", vaErrorStr (status)); - return FALSE; - } - return TRUE; -} - -gboolean -va_ensure_image (GstVaDisplay * display, VASurfaceID surface, - GstVideoInfo * info, VAImage * image, gboolean derived) -{ - gboolean ret = TRUE; - - if (image->image_id != VA_INVALID_ID) - return TRUE; - - if (!va_sync_surface (display, surface)) - return FALSE; - - if (derived) { - ret = va_get_derive_image (display, surface, image); - } else { - ret = va_create_image (display, GST_VIDEO_INFO_FORMAT (info), - GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info), image); - } - - return ret; -} - -gboolean -va_check_surface (GstVaDisplay * display, VASurfaceID surface) -{ - VADisplay dpy = gst_va_display_get_va_dpy (display); - VAStatus status; - VASurfaceStatus state; - - gst_va_display_lock (display); - status = vaQuerySurfaceStatus (dpy, surface, &state); - gst_va_display_unlock (display); - - if (status != VA_STATUS_SUCCESS) - GST_ERROR ("vaQuerySurfaceStatus: %s", vaErrorStr (status)); - - GST_LOG ("surface %#x status %d", surface, state); - - return (status == VA_STATUS_SUCCESS); -} - -gboolean -va_copy_surface (GstVaDisplay * display, VASurfaceID dst, VASurfaceID src) -{ -#if VA_CHECK_VERSION (1, 12, 0) - VADisplay dpy = gst_va_display_get_va_dpy (display); - /* *INDENT-OFF* */ - VACopyObject obj_src = { - .obj_type = VACopyObjectSurface, - .object = { - .surface_id = src, - }, - }; - VACopyObject obj_dst = { - .obj_type = VACopyObjectSurface, - .object = { - .surface_id = dst, - }, - }; - VACopyOption option = { - .bits = { - .va_copy_sync = VA_EXEC_SYNC, - .va_copy_mode = VA_EXEC_MODE_DEFAULT, - }, - }; - /* *INDENT-ON* */ - VAStatus status; - - gst_va_display_lock (display); - status = vaCopy (dpy, &obj_dst, &obj_src, option); - gst_va_display_unlock (display); - if (status != VA_STATUS_SUCCESS) { - GST_INFO ("vaCopy: %s", vaErrorStr (status)); - return FALSE; - } - return TRUE; -#else - return FALSE; -#endif -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/vasurfaceimage.h
Deleted
@@ -1,82 +0,0 @@ -/* GStreamer - * Copyright (C) 2021 Igalia, S.L. - * Author: Víctor Jáquez <vjaquez@igalia.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#pragma once - -#include <gst/va/gstvadisplay.h> -#include <gst/video/video.h> -#include <va/va.h> -#include <va/va_drmcommon.h> - -G_BEGIN_DECLS - -/* surfaces */ -gboolean va_create_surfaces (GstVaDisplay * display, - guint rt_format, guint fourcc, - guint width, guint height, - gint usage_hint, - VASurfaceAttribExternalBuffers * ext_buf, - VASurfaceID * surfaces, - guint num_surfaces); -gboolean va_destroy_surfaces (GstVaDisplay * display, - VASurfaceID * surfaces, - gint num_surfaces); -gboolean va_export_surface_to_dmabuf (GstVaDisplay * display, - VASurfaceID surface, - guint32 flags, - VADRMPRIMESurfaceDescriptor * desc); -gboolean va_sync_surface (GstVaDisplay * display, - VASurfaceID surface); -gboolean va_check_surface (GstVaDisplay * display, - VASurfaceID surface); -gboolean va_copy_surface (GstVaDisplay * display, - VASurfaceID dst, - VASurfaceID src); - -/* images */ -gboolean va_create_image (GstVaDisplay * display, - GstVideoFormat format, - gint width, gint height, - VAImage * image); -gboolean va_destroy_image (GstVaDisplay * display, - VAImageID image_id); -gboolean va_get_image (GstVaDisplay * display, - VASurfaceID surface, - VAImage * image); -gboolean va_get_derive_image (GstVaDisplay * display, - VASurfaceID surface, - VAImage * image); -gboolean va_put_image (GstVaDisplay * display, - VASurfaceID surface, - VAImage * image); -gboolean va_ensure_image (GstVaDisplay * display, - VASurfaceID surface, - GstVideoInfo * info, - VAImage * image, - gboolean derived); - -/* mapping */ -gboolean va_map_buffer (GstVaDisplay * display, - VABufferID buffer, - gpointer * data); -gboolean va_unmap_buffer (GstVaDisplay * display, - VABufferID buffer); - -G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/winscreencap/dxgicapture.c
Deleted
@@ -1,1421 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 OKADA Jun-ichi <okada@abt.jp> - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/* This code captures the screen using "Desktop Duplication API". - * For more information - * https://docs.microsoft.com/en-us/windows/win32/direct3ddxgi/desktop-dup-api */ - -#include "dxgicapture.h" - -#include <d3dcompiler.h> -#include <gmodule.h> - -GST_DEBUG_CATEGORY_EXTERN (gst_dxgi_screen_cap_src_debug); -#define GST_CAT_DEFAULT gst_dxgi_screen_cap_src_debug - -#define PTR_RELEASE(p) {if(NULL!=(p)){IUnknown_Release((IUnknown *)(p)); (p) = NULL;}} -#define BYTE_PER_PIXEL (4) - -/* vertex structures */ -typedef struct _vector3d -{ - float x; - float y; - float z; -} vector3d; - -typedef struct _vector2d -{ - float x; - float y; -} vector2d; - -typedef struct _vertex -{ - vector3d pos; - vector2d texcoord; -} vertex; -#define VERTEX_NUM (6); - -typedef struct _DxgiCapture -{ - GstDXGIScreenCapSrc *src; - - /*Direct3D pointers */ - ID3D11Device *d3d11_device; - ID3D11DeviceContext *d3d11_context; - IDXGIOutput1 *dxgi_output1; - IDXGIOutputDuplication *dxgi_dupl; - - /* Texture that has been rotated and combined fragments. */ - ID3D11Texture2D *work_texture; - D3D11_TEXTURE2D_DESC work_texture_desc; - D3D11_VIEWPORT view_port; - /* Textures that can be read by the CPU. - * CPU-accessible textures are required separately from work_texture - * because shaders cannot be executed. */ - ID3D11Texture2D *readable_texture; - ID3D11VertexShader *vertex_shader; - ID3D11PixelShader *pixel_shader; - ID3D11SamplerState *sampler_state; - ID3D11RenderTargetView *target_view; - /* Screen output dimensions and rotation status. - * The texture acquired by AcquireNextFrame has a non-rotated region. */ - DXGI_OUTDUPL_DESC dupl_desc; - - /* mouse pointer image */ - guint8 *pointer_buffer; - gsize pointer_buffer_capacity; - - /* The movement rectangular regions and the movement - * destination position from the previous frame. */ - DXGI_OUTDUPL_MOVE_RECT *move_rects; - gsize move_rects_capacity; - - /* Array of dirty rectangular region for the desktop frame. */ - RECT *dirty_rects; - gsize dirty_rects_capacity; - - /* Vertex buffer created from array of dirty rectangular region. */ - vertex *dirty_verteces; - gsize verteces_capacity; - - /* Array of rectangular region to copy to readable_texture. */ - RECT *copy_rects; - gsize copy_rects_capacity; - - /* latest mouse pointer info */ - DXGI_OUTDUPL_POINTER_SHAPE_INFO pointer_shape_info; - DXGI_OUTDUPL_POINTER_POSITION last_pointer_position; - -} DxgiCapture; - -/* Vertex shader for texture rotation by HLSL. */ -static const char STR_VERTEX_SHADER = - "struct vs_input { float4 pos : POSITION; float2 tex : TEXCOORD; }; " - "struct vs_output { float4 pos : SV_POSITION; float2 tex : TEXCOORD; }; " - "vs_output vs_main(vs_input input){return input;}"; - -/* Pixel shader for texture rotation by HLSL. */ -static const char STR_PIXEL_SHADER = - "Texture2D tx : register( t0 ); " - "SamplerState samp : register( s0 ); " - "struct ps_input { float4 pos : SV_POSITION; float2 tex : TEXCOORD;}; " - "float4 ps_main(ps_input input) : " - "SV_Target{ return tx.Sample( samp, input.tex ); }"; - -/* initial buffer size */ -const int INITIAL_POINTER_BUFFER_CAPACITY = 64 * 64 * BYTE_PER_PIXEL; -const int INITIAL_MOVE_RECTS_CAPACITY = 100; -const int INITIAL_DIRTY_RECTS_CAPACITY = 100; -const int INITIAL_VERTICES_CAPACITY = 100 * VERTEX_NUM; -const int INITIAL_COPY_RECTS_CAPACITY = 100; - -static D3D_FEATURE_LEVEL feature_levels = { - D3D_FEATURE_LEVEL_11_0, - D3D_FEATURE_LEVEL_10_1, - D3D_FEATURE_LEVEL_10_0, - D3D_FEATURE_LEVEL_9_3, - D3D_FEATURE_LEVEL_9_2, - D3D_FEATURE_LEVEL_9_1, -}; - -static D3D11_INPUT_ELEMENT_DESC vertex_layout = { - {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, - D3D11_INPUT_PER_VERTEX_DATA, 0}, - {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, - 0} -}; - -static void _draw_pointer (DxgiCapture * self, LPBYTE buffer, LPRECT dst_rect, - int stride); -static ID3D11Texture2D *_create_texture (DxgiCapture * self, - enum D3D11_USAGE usage, UINT bindFlags, UINT cpuAccessFlags); - -static gboolean _setup_texture (DxgiCapture * self); - -static HRESULT _update_work_texture (DxgiCapture * self, - IDXGIResource * desktop_resource); - -static HRESULT _copy_dirty_fragment (DxgiCapture * self, - ID3D11Texture2D * src_texture, const D3D11_TEXTURE2D_DESC * src_desc, - guint move_count, guint dirty_count, RECT ** dst_rect); - -static void _set_verteces (DxgiCapture * self, vertex * verteces, - RECT * dest_rect, const D3D11_TEXTURE2D_DESC * dst_desc, RECT * rect, - const D3D11_TEXTURE2D_DESC * src_desc); - -static GModule *d3d_compiler_module = NULL; -static pD3DCompile GstD3DCompileFunc = NULL; - -gboolean -gst_dxgicap_shader_init (void) -{ - static gsize _init = 0; - static const gchar *d3d_compiler_names = { - "d3dcompiler_47.dll", - "d3dcompiler_46.dll", - "d3dcompiler_45.dll", - "d3dcompiler_44.dll", - "d3dcompiler_43.dll", - }; - - if (g_once_init_enter (&_init)) { - gint i; - for (i = 0; i < G_N_ELEMENTS (d3d_compiler_names); i++) { - d3d_compiler_module = - g_module_open (d3d_compiler_namesi, G_MODULE_BIND_LAZY); - - if (d3d_compiler_module) { - GST_INFO ("D3D compiler %s is available", d3d_compiler_namesi); - if (!g_module_symbol (d3d_compiler_module, "D3DCompile", - (gpointer *) & GstD3DCompileFunc)) { - GST_ERROR ("Cannot load D3DCompile symbol from %s", - d3d_compiler_namesi); - g_module_close (d3d_compiler_module); - d3d_compiler_module = NULL; - GstD3DCompileFunc = NULL; - } else { - break; - } - } - } - - if (!GstD3DCompileFunc) - GST_WARNING ("D3D11 compiler library is unavailable"); - - g_once_init_leave (&_init, 1); - } - - return ! !GstD3DCompileFunc; -} - -static GstFlowReturn -initialize_output_duplication (DxgiCapture * self) -{ - HDESK hdesk; - HRESULT hr; - DXGI_OUTDUPL_DESC old_dupl_desc; - GstDXGIScreenCapSrc *src = self->src; - - PTR_RELEASE (self->dxgi_dupl); - - hdesk = OpenInputDesktop (0, FALSE, GENERIC_ALL); - if (hdesk) { - if (!SetThreadDesktop (hdesk)) { - GST_WARNING_OBJECT (src, "SetThreadDesktop() failed. Error code: %lu", - GetLastError ()); - } - - CloseDesktop (hdesk); - } else { - GST_WARNING_OBJECT (src, "OpenInputDesktop() failed. Error code: %lu", - GetLastError ()); - } - - hr = IDXGIOutput1_DuplicateOutput (self->dxgi_output1, - (IUnknown *) (self->d3d11_device), &self->dxgi_dupl); - if (hr != S_OK) { - gchar *msg = get_hresult_to_string (hr); - GST_WARNING_OBJECT (src, "IDXGIOutput1::DuplicateOutput() failed (%x): %s", - (guint) hr, msg); - g_free (msg); - if (hr == E_ACCESSDENIED) { - /* Happens temporarily during resolution changes. */ - return GST_FLOW_OK; - } - return GST_FLOW_ERROR; - } - - old_dupl_desc = self->dupl_desc; - IDXGIOutputDuplication_GetDesc (self->dxgi_dupl, &self->dupl_desc); - - if (self->readable_texture && - (self->dupl_desc.ModeDesc.Width != old_dupl_desc.ModeDesc.Width || - self->dupl_desc.ModeDesc.Height != old_dupl_desc.ModeDesc.Height || - self->dupl_desc.Rotation != old_dupl_desc.Rotation)) { - PTR_RELEASE (self->readable_texture); - PTR_RELEASE (self->work_texture); - - _setup_texture (self); - - return GST_DXGICAP_FLOW_RESOLUTION_CHANGE; - } - - return GST_FLOW_OK; -} - -DxgiCapture * -dxgicap_new (HMONITOR monitor, GstDXGIScreenCapSrc * src) -{ - int i, j; - HRESULT hr; - IDXGIFactory1 *dxgi_factory1 = NULL; - IDXGIAdapter1 *dxgi_adapter1 = NULL; - ID3D11InputLayout *vertex_input_layout = NULL; - ID3DBlob *vertex_shader_blob = NULL; - ID3DBlob *pixel_shader_blob = NULL; - D3D11_SAMPLER_DESC sampler_desc; - - DxgiCapture *self = g_new0 (DxgiCapture, 1); - if (NULL == self) { - return NULL; - } - - self->src = src; - hr = CreateDXGIFactory1 (&IID_IDXGIFactory1, (void **) &dxgi_factory1); - HR_FAILED_GOTO (hr, CreateDXGIFactory1, new_error); - - for (i = 0; - IDXGIFactory1_EnumAdapters1 (dxgi_factory1, i, - &dxgi_adapter1) != DXGI_ERROR_NOT_FOUND; ++i) { - IDXGIOutput *dxgi_output = NULL; - D3D_FEATURE_LEVEL feature_level; - - hr = D3D11CreateDevice ((IDXGIAdapter *) dxgi_adapter1, - D3D_DRIVER_TYPE_UNKNOWN, NULL, 0, - feature_levels, G_N_ELEMENTS (feature_levels), - D3D11_SDK_VERSION, &self->d3d11_device, &feature_level, - &self->d3d11_context); - if (FAILED (hr)) { - HR_FAILED_INFO (hr, D3D11CreateDevice); - PTR_RELEASE (dxgi_adapter1); - continue; - } - - for (j = 0; IDXGIAdapter1_EnumOutputs (dxgi_adapter1, j, &dxgi_output) != - DXGI_ERROR_NOT_FOUND; ++j) { - DXGI_OUTPUT_DESC output_desc; - hr = IDXGIOutput_QueryInterface (dxgi_output, &IID_IDXGIOutput1, - (void **) &self->dxgi_output1); - PTR_RELEASE (dxgi_output); - HR_FAILED_GOTO (hr, IDXGIOutput::QueryInterface, new_error); - - hr = IDXGIOutput1_GetDesc (self->dxgi_output1, &output_desc); - HR_FAILED_GOTO (hr, IDXGIOutput1::GetDesc, new_error); - - if (output_desc.Monitor == monitor) { - GST_DEBUG_OBJECT (src, "found monitor"); - break; - } - - PTR_RELEASE (self->dxgi_output1); - } - - PTR_RELEASE (dxgi_adapter1); - - if (NULL != self->dxgi_output1) { - break; - } - - PTR_RELEASE (self->d3d11_device); - PTR_RELEASE (self->d3d11_context); - } - - if (NULL == self->dxgi_output1) { - goto new_error; - } - - PTR_RELEASE (dxgi_factory1); - - if (initialize_output_duplication (self) == GST_FLOW_ERROR) { - goto new_error; - } - - self->pointer_buffer_capacity = INITIAL_POINTER_BUFFER_CAPACITY; - self->pointer_buffer = g_malloc (self->pointer_buffer_capacity); - if (NULL == self->pointer_buffer) { - goto new_error; - } - - self->move_rects_capacity = INITIAL_MOVE_RECTS_CAPACITY; - self->move_rects = g_new0 (DXGI_OUTDUPL_MOVE_RECT, self->move_rects_capacity); - if (NULL == self->move_rects) { - goto new_error; - } - - self->dirty_rects_capacity = INITIAL_DIRTY_RECTS_CAPACITY; - self->dirty_rects = g_new0 (RECT, self->dirty_rects_capacity); - if (NULL == self->dirty_rects) { - goto new_error; - } - - self->verteces_capacity = INITIAL_VERTICES_CAPACITY; - self->dirty_verteces = g_new0 (vertex, self->verteces_capacity); - if (NULL == self->dirty_verteces) { - goto new_error; - } - - self->copy_rects_capacity = INITIAL_COPY_RECTS_CAPACITY; - self->copy_rects = g_new0 (RECT, self->copy_rects_capacity); - if (NULL == self->copy_rects) { - goto new_error; - } - - if (DXGI_MODE_ROTATION_IDENTITY != self->dupl_desc.Rotation) { - g_assert (GstD3DCompileFunc); - - /* For a rotated display, create a shader. */ - hr = GstD3DCompileFunc (STR_VERTEX_SHADER, sizeof (STR_VERTEX_SHADER), - NULL, NULL, NULL, "vs_main", "vs_4_0_level_9_1", - 0, 0, &vertex_shader_blob, NULL); - HR_FAILED_GOTO (hr, D3DCompile, new_error); - - hr = GstD3DCompileFunc (STR_PIXEL_SHADER, sizeof (STR_PIXEL_SHADER), - NULL, NULL, NULL, "ps_main", "ps_4_0_level_9_1", - 0, 0, &pixel_shader_blob, NULL); - HR_FAILED_GOTO (hr, D3DCompile, new_error); - - hr = ID3D11Device_CreateVertexShader (self->d3d11_device, - ID3D10Blob_GetBufferPointer (vertex_shader_blob), - ID3D10Blob_GetBufferSize (vertex_shader_blob), NULL, - &self->vertex_shader); - HR_FAILED_GOTO (hr, ID3D11Device::CreateVertexShader, new_error); - - hr = ID3D11Device_CreateInputLayout (self->d3d11_device, vertex_layout, - G_N_ELEMENTS (vertex_layout), - ID3D10Blob_GetBufferPointer (vertex_shader_blob), - ID3D10Blob_GetBufferSize (vertex_shader_blob), &vertex_input_layout); - PTR_RELEASE (vertex_shader_blob) - HR_FAILED_GOTO (hr, ID3D11Device::CreateInputLayout, new_error); - - ID3D11DeviceContext_IASetInputLayout (self->d3d11_context, - vertex_input_layout); - PTR_RELEASE (vertex_input_layout); - - hr = ID3D11Device_CreatePixelShader (self->d3d11_device, - ID3D10Blob_GetBufferPointer (pixel_shader_blob), - ID3D10Blob_GetBufferSize (pixel_shader_blob), NULL, - &self->pixel_shader); - PTR_RELEASE (pixel_shader_blob); - HR_FAILED_GOTO (hr, ID3D11Device::CreatePixelShader, new_error); - - memset (&sampler_desc, 0, sizeof (sampler_desc)); - sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.ComparisonFunc = D3D11_COMPARISON_NEVER; - sampler_desc.MinLOD = 0; - sampler_desc.MaxLOD = D3D11_FLOAT32_MAX; - - hr = ID3D11Device_CreateSamplerState (self->d3d11_device, &sampler_desc, - &self->sampler_state); - HR_FAILED_GOTO (hr, ID3D11Device::CreateSamplerState, new_error); - } - - return self; - -new_error: - PTR_RELEASE (vertex_input_layout); - PTR_RELEASE (vertex_shader_blob); - PTR_RELEASE (pixel_shader_blob); - - dxgicap_destory (self); - return NULL; -} - -void -dxgicap_destory (DxgiCapture * self) -{ - if (!self) - return; - PTR_RELEASE (self->target_view); - PTR_RELEASE (self->readable_texture); - PTR_RELEASE (self->work_texture); - PTR_RELEASE (self->dxgi_output1); - PTR_RELEASE (self->dxgi_dupl); - PTR_RELEASE (self->d3d11_context); - PTR_RELEASE (self->d3d11_device); - PTR_RELEASE (self->vertex_shader); - PTR_RELEASE (self->pixel_shader); - PTR_RELEASE (self->sampler_state); - - g_free (self->pointer_buffer); - g_free (self->move_rects); - g_free (self->dirty_rects); - g_free (self->dirty_verteces); - g_free (self->copy_rects); - - g_free (self); -} - -gboolean -dxgicap_start (DxgiCapture * self) -{ - return _setup_texture (self); -} - -void -dxgicap_stop (DxgiCapture * self) -{ - PTR_RELEASE (self->target_view); - PTR_RELEASE (self->readable_texture); - PTR_RELEASE (self->work_texture); -} - -GstFlowReturn -dxgicap_acquire_next_frame (DxgiCapture * self, gboolean show_cursor, - guint timeout) -{ - GstFlowReturn ret = GST_FLOW_ERROR; - HRESULT hr; - GstDXGIScreenCapSrc *src = self->src; - - DXGI_OUTDUPL_FRAME_INFO frame_info; - IDXGIResource *desktop_resource = NULL; - - if (!self->dxgi_dupl) { - /* Desktop duplication interface became invalid due to desktop switch, - * UAC prompt popping up, or similar event. Try to reinitialize. */ - ret = initialize_output_duplication (self); - goto end; - } - - /* Get the latest desktop frames. */ - hr = IDXGIOutputDuplication_AcquireNextFrame (self->dxgi_dupl, - timeout, &frame_info, &desktop_resource); - if (hr == DXGI_ERROR_WAIT_TIMEOUT) { - /* In case of DXGI_ERROR_WAIT_TIMEOUT, - * it has not changed from the last time. */ - GST_LOG_OBJECT (src, "DXGI_ERROR_WAIT_TIMEOUT"); - ret = GST_FLOW_OK; - goto end; - } else if (hr == DXGI_ERROR_ACCESS_LOST) { - GST_LOG_OBJECT (src, "DXGI_ERROR_ACCESS_LOST; reinitializing output " - "duplication..."); - PTR_RELEASE (self->dxgi_dupl); - ret = GST_FLOW_OK; - goto end; - } - HR_FAILED_GOTO (hr, IDXGIOutputDuplication::AcquireNextFrame, end); - - if (0 != frame_info.LastPresentTime.QuadPart) { - /* The desktop frame has changed since last time. */ - hr = _update_work_texture (self, desktop_resource); - if (FAILED (hr)) { - GST_DEBUG_OBJECT (src, "failed to _update_work_texture"); - goto end; - } - } - - if (show_cursor && 0 != frame_info.LastMouseUpdateTime.QuadPart) { - /* The mouse pointer has changed since last time. */ - self->last_pointer_position = frame_info.PointerPosition; - - if (0 < frame_info.PointerShapeBufferSize) { - /* A valid mouse cursor shape exists. */ - DXGI_OUTDUPL_POINTER_SHAPE_INFO pointer_shape_info; - guint pointer_shape_size_required; - /* Get the mouse cursor shape. */ - hr = IDXGIOutputDuplication_GetFramePointerShape (self->dxgi_dupl, - self->pointer_buffer_capacity, - self->pointer_buffer, - &pointer_shape_size_required, &pointer_shape_info); - if (DXGI_ERROR_MORE_DATA == hr) { - /* not enough buffers */ - self->pointer_buffer_capacity = pointer_shape_size_required * 2; - self->pointer_buffer = - g_realloc (self->pointer_buffer, self->pointer_buffer_capacity); - - hr = IDXGIOutputDuplication_GetFramePointerShape (self->dxgi_dupl, - self->pointer_buffer_capacity, - self->pointer_buffer, - &pointer_shape_size_required, &pointer_shape_info); - } - HR_FAILED_GOTO (hr, IDXGIOutputDuplication::GetFramePointerShape, end); - self->pointer_shape_info = pointer_shape_info; - ret = GST_FLOW_OK; - } else { - ret = GST_FLOW_OK; - } - } else { - ret = GST_FLOW_OK; - } -end: - if (self->dxgi_dupl) { - IDXGIOutputDuplication_ReleaseFrame (self->dxgi_dupl); - } - PTR_RELEASE (desktop_resource); - return ret; -} - -gboolean -dxgicap_copy_buffer (DxgiCapture * self, gboolean show_cursor, LPRECT dst_rect, - GstVideoInfo * video_info, GstBuffer * buf) -{ - HRESULT hr; - int i; - GstDXGIScreenCapSrc *src = self->src; - D3D11_MAPPED_SUBRESOURCE readable_map; - GstVideoFrame vframe; - gint height = RECT_HEIGHT ((*dst_rect)); - gint width = RECT_WIDTH ((*dst_rect)); - - if (NULL == self->readable_texture) { - GST_DEBUG_OBJECT (src, "readable_texture is null"); - goto flow_error; - } - - hr = ID3D11DeviceContext_Map (self->d3d11_context, - (ID3D11Resource *) self->readable_texture, 0, - D3D11_MAP_READ, 0, &readable_map); - HR_FAILED_GOTO (hr, IDXGISurface1::Map, flow_error); - GST_DEBUG_OBJECT (src, "copy size width:%d height:%d", width, height); - - /* Copy from readable_texture to GstVideFrame. */ - if (gst_video_frame_map (&vframe, video_info, buf, GST_MAP_WRITE)) { - gint line_size; - gint stride_dst; - PBYTE frame_buffer; - PBYTE p_dst; - PBYTE p_src; - - frame_buffer = GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0); - p_src = (PBYTE) readable_map.pData + - (dst_rect->top * readable_map.RowPitch) + - (dst_rect->left * BYTE_PER_PIXEL); - p_dst = frame_buffer; - - line_size = width * BYTE_PER_PIXEL; - stride_dst = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0); - - if (line_size > stride_dst) { - GST_ERROR_OBJECT (src, "not enough stride in video frame"); - ID3D11DeviceContext_Unmap (self->d3d11_context, - (ID3D11Resource *) self->readable_texture, 0); - gst_video_frame_unmap (&vframe); - goto flow_error; - } - - for (i = 0; i < height; ++i) { - memcpy (p_dst, p_src, line_size); - p_dst += stride_dst; - p_src += readable_map.RowPitch; - } - ID3D11DeviceContext_Unmap (self->d3d11_context, - (ID3D11Resource *) self->readable_texture, 0); - HR_FAILED_GOTO (hr, IDXGISurface1::Unmap, flow_error); - - if (show_cursor && self->last_pointer_position.Visible) { - _draw_pointer (self, frame_buffer, dst_rect, stride_dst); - } - gst_video_frame_unmap (&vframe); - return TRUE; - } - -flow_error: - return FALSE; -} - -static void -_draw_pointer (DxgiCapture * self, PBYTE buffer, LPRECT dst_rect, int stride) -{ - RECT pointer_rect; - RECT clip_pointer_rect; - int offset_x; - int offset_y; - PBYTE p_dst; - /* For DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MONOCHROME, halve the height. */ - int pointer_height = - (DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MONOCHROME == - self->pointer_shape_info.Type) - ? self->pointer_shape_info.Height / 2 : self->pointer_shape_info.Height; - - /* A rectangular area containing the mouse pointer shape */ - SetRect (&pointer_rect, - self->last_pointer_position.Position.x, - self->last_pointer_position.Position.y, - self->last_pointer_position.Position.x + - self->pointer_shape_info.Width, - self->last_pointer_position.Position.y + pointer_height); - - if (!IntersectRect (&clip_pointer_rect, dst_rect, &pointer_rect)) { - return; - } - - /* Draw a pointer if it overlaps the destination rectangle range. - * There are three ways to draw the mouse cursor. - * see https://docs.microsoft.com/ja-jp/windows/win32/api/dxgi1_2/ne-dxgi1_2-dxgi_outdupl_pointer_shape_type */ - offset_x = clip_pointer_rect.left - pointer_rect.left; - offset_y = clip_pointer_rect.top - pointer_rect.top; - p_dst = - ((PBYTE) buffer) + ((clip_pointer_rect.top - - dst_rect->top) * stride) + - ((clip_pointer_rect.left - dst_rect->left) * BYTE_PER_PIXEL); - - if (DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR == - self->pointer_shape_info.Type - || DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR == - self->pointer_shape_info.Type) { - gboolean mask_mode = - DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR == - self->pointer_shape_info.Type; - PBYTE p_src = - (PBYTE) self->pointer_buffer + - (offset_y * self->pointer_shape_info.Pitch) + - (offset_x * BYTE_PER_PIXEL); - - int y, x; - for (y = 0; y < RECT_HEIGHT (clip_pointer_rect); ++y) { - for (x = 0; x < RECT_WIDTH (clip_pointer_rect); ++x) { - PBYTE p1 = p_dst + (x * BYTE_PER_PIXEL); - PBYTE p2 = p_src + (x * BYTE_PER_PIXEL); - int alpha = *(p2 + 3); - int i; - for (i = 0; i < 3; ++i) { - if (mask_mode) { - /* case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR: - * If the alpha channel of a pixel in the mouse image is 0, copy it. - * Otherwise, xor each pixel. */ - if (0 == alpha) { - *p1 = *p2; - } else { - *p1 = *p2 ^ *p1; - } - } else { - /* case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR: - * Copies the mouse cursor image with alpha channel composition. */ - *p1 = min (255, max (0, *p1 + ((*p2 - *p1) * alpha / 255))); - } - ++p1; - ++p2; - } - } - p_dst += stride; - p_src += self->pointer_shape_info.Pitch; - } - } else if (DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MONOCHROME == - self->pointer_shape_info.Type) { - guint mask_bit = 0x80; - /* AND MASK pointer - * It is stored in 1 bit per pixel from the beginning. */ - PBYTE p_src_and = - (PBYTE) self->pointer_buffer + - (offset_y * self->pointer_shape_info.Pitch); - /* XOR MASK pointer - * The XOR MASK is stored after the AND mask. */ - PBYTE p_src_xor = - (PBYTE) self->pointer_buffer + - ((offset_y + pointer_height) * self->pointer_shape_info.Pitch); - - int y, x; - for (y = 0; y < RECT_HEIGHT (clip_pointer_rect); ++y) { - guint32 *p_dst_32 = ((guint32 *) (p_dst)); - for (x = offset_x; x < RECT_WIDTH (clip_pointer_rect); ++x) { - int bit_pos = x % 8; - gboolean and_bit = - 0 != (*(p_src_and + (x / 8)) & (mask_bit >> bit_pos)); - gboolean xor_bit = - 0 != (*(p_src_xor + (x / 8)) & (mask_bit >> bit_pos)); - - if (and_bit) { - if (xor_bit) { - *p_dst_32 = *p_dst_32 ^ 0x00ffffff; - } - } else { - if (xor_bit) { - *p_dst_32 = 0xffffffff; - } else { - *p_dst_32 = 0xff000000; - } - } - ++p_dst_32; - } - p_dst += stride; - p_src_and += self->pointer_shape_info.Pitch; - p_src_xor += self->pointer_shape_info.Pitch; - } - } -} - -static ID3D11Texture2D * -_create_texture (DxgiCapture * self, - enum D3D11_USAGE usage, UINT bindFlags, UINT cpuAccessFlags) -{ - HRESULT hr; - GstDXGIScreenCapSrc *src = self->src; - D3D11_TEXTURE2D_DESC new_desc; - ID3D11Texture2D *new_texture = NULL; - - ZeroMemory (&new_desc, sizeof (new_desc)); - new_desc.Width = self->dupl_desc.ModeDesc.Width; - new_desc.Height = self->dupl_desc.ModeDesc.Height; - new_desc.MipLevels = 1; - new_desc.ArraySize = 1; - new_desc.SampleDesc.Count = 1; - new_desc.SampleDesc.Quality = 0; - new_desc.Usage = usage; - new_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - new_desc.BindFlags = bindFlags; - new_desc.CPUAccessFlags = cpuAccessFlags; - new_desc.MiscFlags = 0; - - hr = ID3D11Device_CreateTexture2D (self->d3d11_device, &new_desc, NULL, - &new_texture); - HR_FAILED_RET (hr, ID3D11Device::CreateTexture2D, NULL); - - return new_texture; -} - -static gboolean -_setup_texture (DxgiCapture * self) -{ - HRESULT hr; - ID3D11Texture2D *new_texture = NULL; - GstDXGIScreenCapSrc *src = self->src; - - if (NULL == self->readable_texture) { - new_texture = _create_texture (self, D3D11_USAGE_STAGING, 0, - D3D11_CPU_ACCESS_READ); - if (NULL == new_texture) { - return FALSE; - } - self->readable_texture = new_texture; - } - - if (DXGI_MODE_ROTATION_IDENTITY != self->dupl_desc.Rotation) { - /* For rotated displays, create work_texture. */ - if (NULL == self->work_texture) { - new_texture = - _create_texture (self, D3D11_USAGE_DEFAULT, - D3D11_BIND_RENDER_TARGET, 0); - if (NULL == new_texture) { - return FALSE; - } - - self->work_texture = new_texture; - ID3D11Texture2D_GetDesc (self->work_texture, &self->work_texture_desc); - hr = ID3D11Device_CreateRenderTargetView (self->d3d11_device, - (ID3D11Resource *) self->work_texture, NULL, &self->target_view); - HR_FAILED_RET (hr, ID3D11Device::CreateRenderTargetView, FALSE); - - self->view_port.Width = (float) self->work_texture_desc.Width; - self->view_port.Height = (float) self->work_texture_desc.Height; - self->view_port.MinDepth = 0.0f; - self->view_port.MaxDepth = 1.0f; - self->view_port.TopLeftX = 0.0f; - self->view_port.TopLeftY = 0.0f; - } - } - - return TRUE; -} - -/* Update work_texture to the latest desktop frame from the update information - * that can be obtained from IDXGIOutputDuplication. - * Then copy to readable_texture. - */ -static HRESULT -_update_work_texture (DxgiCapture * self, IDXGIResource * desktop_resource) -{ - HRESULT hr = S_OK; - GstDXGIScreenCapSrc *src = self->src; - int i; - ID3D11Texture2D *desktop_texture = NULL; - guint required_size; - guint move_count; - guint dirty_rects_capacity_size; - guint dirty_count; - guint copy_count; - D3D11_TEXTURE2D_DESC src_desc; - RECT *dst_rect; - ID3D11Texture2D *work_src; - guint move_rects_capacity_size = - sizeof (DXGI_OUTDUPL_MOVE_RECT) * self->move_rects_capacity; - - hr = IDXGIResource_QueryInterface (desktop_resource, &IID_ID3D11Texture2D, - (void **) &desktop_texture); - HR_FAILED_GOTO (hr, IDXGIResource::QueryInterface, end); - - /* Get the rectangular regions that was moved from the last time. - * However, I have never obtained a valid value in GetFrameMoveRects. - * It seems to depend on the implementation of the GPU driver. - * see https://docs.microsoft.com/en-us/windows/win32/api/dxgi1_2/nf-dxgi1_2-idxgioutputduplication-getframemoverects - */ - hr = IDXGIOutputDuplication_GetFrameMoveRects (self->dxgi_dupl, - move_rects_capacity_size, self->move_rects, &required_size); - if (DXGI_ERROR_MORE_DATA == hr) { - /* not enough buffers */ - self->move_rects_capacity = - (required_size / sizeof (DXGI_OUTDUPL_MOVE_RECT)) * 2; - self->move_rects = - g_renew (DXGI_OUTDUPL_MOVE_RECT, self->move_rects, - self->move_rects_capacity); - - hr = IDXGIOutputDuplication_GetFrameMoveRects (self->dxgi_dupl, - required_size, self->move_rects, &required_size); - } - HR_FAILED_GOTO (hr, IDXGIOutputDuplication::GetFrameMoveRects, end); - move_count = required_size / sizeof (DXGI_OUTDUPL_MOVE_RECT); - - dirty_rects_capacity_size = sizeof (RECT) * self->dirty_rects_capacity; - /* Gets the rectangular regions that has changed since the last time. - see https://docs.microsoft.com/en-us/windows/win32/api/dxgi1_2/nf-dxgi1_2-idxgioutputduplication-getframedirtyrects - */ - hr = IDXGIOutputDuplication_GetFrameDirtyRects (self->dxgi_dupl, - dirty_rects_capacity_size, self->dirty_rects, &required_size); - - if (DXGI_ERROR_MORE_DATA == hr) { - /* not enough buffers */ - self->dirty_rects_capacity = (required_size / sizeof (RECT)) * 2; - self->dirty_rects = - g_renew (RECT, self->dirty_rects, self->dirty_rects_capacity); - - hr = IDXGIOutputDuplication_GetFrameDirtyRects (self->dxgi_dupl, - required_size, self->dirty_rects, &required_size); - } - HR_FAILED_GOTO (hr, IDXGIOutputDuplication::GetFrameDirtyRects, end); - - dirty_count = required_size / sizeof (RECT); - - /* The number of rectangular regions to copy to the readable_texture. */ - copy_count = move_count + dirty_count; - - if (self->copy_rects_capacity < copy_count) { - /* not enough buffers */ - self->copy_rects_capacity = copy_count * 2; - self->copy_rects = - g_renew (RECT, self->copy_rects, self->copy_rects_capacity); - } - - if (DXGI_MODE_ROTATION_IDENTITY == self->dupl_desc.Rotation) { - /* For a non-rotating display, copy it directly into readable_texture. */ - RECT *p = self->copy_rects; - for (i = 0; i < move_count; ++i) { - *p = self->move_rectsi.DestinationRect; - ++p; - } - for (i = 0; i < dirty_count; ++i) { - *p = self->dirty_rectsi; - ++p; - } - work_src = desktop_texture; - } else { - /* For rotated displays, rotate to work_texture and copy. */ - ID3D11Texture2D_GetDesc (desktop_texture, &src_desc); - dst_rect = self->copy_rects; - /* Copy the dirty rectangular and moved rectangular regions from desktop frame to work_texture. */ - hr = _copy_dirty_fragment (self, desktop_texture, &src_desc, move_count, - dirty_count, &dst_rect); - work_src = self->work_texture; - if (FAILED (hr)) { - goto end; - } - } - - /* Copy the updated rectangular regions to readable_texture. */ - for (i = 0; i < copy_count; ++i) { - RECT *p = (self->copy_rects + i); - D3D11_BOX box; - box.left = p->left; - box.top = p->top; - box.front = 0; - box.right = p->right; - box.bottom = p->bottom; - box.back = 1; - - ID3D11DeviceContext_CopySubresourceRegion (self->d3d11_context, - (ID3D11Resource *) self->readable_texture, - 0, p->left, p->top, 0, (ID3D11Resource *) work_src, 0, &box); - } - -end: - PTR_RELEASE (desktop_texture); - return hr; -} - -static void -_rotate_rect (DXGI_MODE_ROTATION rotation, RECT * dst, const RECT * src, - gint dst_width, gint dst_height) -{ - switch (rotation) { - case DXGI_MODE_ROTATION_ROTATE90: - dst->left = dst_width - src->bottom; - dst->top = src->left; - dst->right = dst_width - src->top; - dst->bottom = src->right; - break; - case DXGI_MODE_ROTATION_ROTATE180: - dst->left = dst_width - src->right; - dst->top = dst_height - src->bottom; - dst->right = dst_width - src->left; - dst->bottom = dst_height - src->top; - break; - case DXGI_MODE_ROTATION_ROTATE270: - dst->left = src->top; - dst->top = dst_height - src->right; - dst->right = src->bottom; - dst->bottom = dst_height - src->left; - break; - default: - *dst = *src; - break; - } -} - -/* Copy the rectangular area specified by dirty_rects and move_rects from src_texture to work_texture. */ -static HRESULT -_copy_dirty_fragment (DxgiCapture * self, ID3D11Texture2D * src_texture, - const D3D11_TEXTURE2D_DESC * src_desc, guint move_count, guint dirty_count, - RECT ** dst_rect) -{ - HRESULT hr = S_OK; - GstDXGIScreenCapSrc *src = self->src; - int i; - RECT *dst_rect_p; - vertex *vp; - UINT stride; - UINT offset; - guint verteces_count; - ID3D11Buffer *verteces_buffer = NULL; - ID3D11ShaderResourceView *shader_resource = NULL; - D3D11_SUBRESOURCE_DATA subresource_data; - D3D11_BUFFER_DESC buffer_desc; - D3D11_SHADER_RESOURCE_VIEW_DESC shader_desc; - - shader_desc.Format = src_desc->Format; - shader_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - shader_desc.Texture2D.MostDetailedMip = src_desc->MipLevels - 1; - shader_desc.Texture2D.MipLevels = src_desc->MipLevels; - hr = ID3D11Device_CreateShaderResourceView (self->d3d11_device, - (ID3D11Resource *) src_texture, &shader_desc, &shader_resource); - HR_FAILED_GOTO (hr, ID3D11Device::CreateShaderResourceView, end); - - ID3D11DeviceContext_OMSetRenderTargets (self->d3d11_context, 1, - &self->target_view, NULL); - - ID3D11DeviceContext_VSSetShader (self->d3d11_context, self->vertex_shader, - NULL, 0); - - ID3D11DeviceContext_PSSetShader (self->d3d11_context, self->pixel_shader, - NULL, 0); - - ID3D11DeviceContext_PSSetShaderResources (self->d3d11_context, 0, 1, - &shader_resource); - - ID3D11DeviceContext_PSSetSamplers (self->d3d11_context, 0, 1, - &self->sampler_state); - - ID3D11DeviceContext_IASetPrimitiveTopology (self->d3d11_context, - D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - - verteces_count = (move_count + dirty_count) * VERTEX_NUM; - if (verteces_count > self->verteces_capacity) { - /* not enough buffers */ - self->verteces_capacity = verteces_count * 2; - self->dirty_verteces = - g_renew (vertex, self->dirty_verteces, self->verteces_capacity); - if (NULL == self->dirty_verteces) { - hr = S_FALSE; - goto end; - } - } - - dst_rect_p = *dst_rect; - vp = self->dirty_verteces; - /* Create a vertex buffer to move and rotate from the move_rects. - * And set the rectangular region to be copied to readable_texture. */ - for (i = 0; i < move_count; ++i) { - /* Copy the area to be moved. - * The source of the move is included in dirty_rects. */ - _set_verteces (self, vp, dst_rect_p, &self->work_texture_desc, - &(self->move_rectsi.DestinationRect), src_desc); - vp += VERTEX_NUM; - ++dst_rect_p; - } - /* Create a vertex buffer to move and rotate from the dirty_rects. - * And set the rectangular region to be copied to readable_texture. */ - for (i = 0; i < dirty_count; ++i) { - _set_verteces (self, vp, dst_rect_p, &self->work_texture_desc, - &(self->dirty_rectsi), src_desc); - vp += VERTEX_NUM; - ++dst_rect_p; - } - *dst_rect = dst_rect_p; - - memset (&buffer_desc, 0, sizeof (buffer_desc)); - buffer_desc.Usage = D3D11_USAGE_IMMUTABLE; - buffer_desc.ByteWidth = verteces_count * sizeof (vertex); - buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - buffer_desc.CPUAccessFlags = 0; - - memset (&subresource_data, 0, sizeof (subresource_data)); - subresource_data.pSysMem = self->dirty_verteces; - - hr = ID3D11Device_CreateBuffer (self->d3d11_device, &buffer_desc, - &subresource_data, &verteces_buffer); - HR_FAILED_GOTO (hr, ID3D11Device::CreateBuffer, end); - - stride = sizeof (vertex); - offset = 0; - ID3D11DeviceContext_IASetVertexBuffers (self->d3d11_context, 0, 1, - &verteces_buffer, &stride, &offset); - - ID3D11DeviceContext_RSSetViewports (self->d3d11_context, 1, &self->view_port); - - /* Copy the rectangular region indicated by dirty_rects from the desktop frame to work_texture. */ - ID3D11DeviceContext_Draw (self->d3d11_context, verteces_count, 0); - -end: - PTR_RELEASE (verteces_buffer); - PTR_RELEASE (shader_resource); - - return hr; -} - -static void -_set_verteces (DxgiCapture * self, vertex * verteces, RECT * dst_rect, - const D3D11_TEXTURE2D_DESC * dst_desc, RECT * rect, - const D3D11_TEXTURE2D_DESC * src_desc) -{ - int center_x; - int center_y; - - /* Rectangular area is moved according to the rotation of the display. */ - _rotate_rect (self->dupl_desc.Rotation, dst_rect, rect, dst_desc->Width, - dst_desc->Height); - - /* Set the vertex buffer from the rotation of the display. */ - switch (self->dupl_desc.Rotation) { - case DXGI_MODE_ROTATION_ROTATE90: - verteces0.texcoord = (vector2d) { - (float) rect->right / (float) src_desc->Width, - (float) rect->bottom / (float) src_desc->Height}; - verteces1.texcoord = (vector2d) { - (float) rect->left / (float) src_desc->Width, - (float) rect->bottom / (float) src_desc->Height}; - verteces2.texcoord = (vector2d) { - (float) rect->right / (float) src_desc->Width, - (float) rect->top / (float) src_desc->Height}; - verteces5.texcoord = (vector2d) { - (float) rect->left / (float) src_desc->Width, - (float) rect->top / (float) src_desc->Height}; - break; - case DXGI_MODE_ROTATION_ROTATE180: - verteces0.texcoord = (vector2d) { - (float) rect->right / (float) src_desc->Width, - (float) rect->top / (float) src_desc->Height}; - verteces1.texcoord = (vector2d) { - (float) rect->right / (float) src_desc->Width, - (float) rect->bottom / (float) src_desc->Height}; - verteces2.texcoord = (vector2d) { - (float) rect->left / (float) src_desc->Width, - (float) rect->top / (float) src_desc->Height}; - verteces5.texcoord = (vector2d) { - (float) rect->left / (float) src_desc->Width, - (float) rect->bottom / (float) src_desc->Height}; - break; - case DXGI_MODE_ROTATION_ROTATE270: - verteces0.texcoord = (vector2d) { - (float) rect->left / (float) src_desc->Width, - (float) rect->top / (float) src_desc->Height}; - verteces1.texcoord = (vector2d) { - (float) rect->right / (float) src_desc->Width, - (float) rect->top / (float) src_desc->Height}; - verteces2.texcoord = (vector2d) { - (float) rect->left / (float) src_desc->Width, - (float) rect->bottom / (float) src_desc->Height}; - verteces5.texcoord = (vector2d) { - (float) rect->right / (float) src_desc->Width, - (float) rect->bottom / (float) src_desc->Height}; - break; - default: - verteces0.texcoord = (vector2d) { - (float) rect->left / (float) src_desc->Width, - (float) rect->bottom / (float) src_desc->Height}; - verteces1.texcoord = (vector2d) { - (float) rect->left / (float) src_desc->Width, - (float) rect->top / (float) src_desc->Height}; - verteces2.texcoord = (vector2d) { - (float) rect->right / (float) src_desc->Width, - (float) rect->bottom / (float) src_desc->Height}; - verteces5.texcoord = (vector2d) { - (float) rect->right / (float) src_desc->Width, - (float) rect->top / (float) src_desc->Height}; - break; - } - verteces3.texcoord = verteces2.texcoord; - verteces4.texcoord = verteces1.texcoord; - - center_x = (int) dst_desc->Width / 2; - center_y = (int) dst_desc->Height / 2; - - verteces0.pos = (vector3d) { - (float) (dst_rect->left - center_x) / (float) center_x, - (float) (dst_rect->bottom - center_y) / (float) center_y *-1.0f, 0.0f}; - verteces1.pos = (vector3d) { - (float) (dst_rect->left - center_x) / (float) center_x, - (float) (dst_rect->top - center_y) / (float) center_y *-1.0f, 0.0f}; - verteces2.pos = (vector3d) { - (float) (dst_rect->right - center_x) / (float) center_x, - (float) (dst_rect->bottom - center_y) / (float) center_y *-1.0f, 0.0f}; - verteces3.pos = verteces2.pos; - verteces4.pos = verteces1.pos; - verteces5.pos = (vector3d) { - (float) (dst_rect->right - center_x) / (float) center_x, - (float) (dst_rect->top - center_y) / (float) center_y *-1.0f, 0.0f}; -} - -typedef struct _monitor_param_by_name -{ - const gchar *device_name; - HMONITOR hmonitor; -} monitor_param_by_name; - -static BOOL CALLBACK -monitor_enum_proc_by_name (HMONITOR hmonitor, HDC hdc, LPRECT rect, - LPARAM lparam) -{ - MONITORINFOEXA monitor_info; - monitor_param_by_name *param = (monitor_param_by_name *) lparam; - - monitor_info.cbSize = sizeof (monitor_info); - if (GetMonitorInfoA (hmonitor, (MONITORINFO *) & monitor_info)) { - if (0 == g_strcmp0 (monitor_info.szDevice, param->device_name)) { - param->hmonitor = hmonitor; - return FALSE; - } - } - return TRUE; -} - -HMONITOR -get_hmonitor_by_device_name (const gchar * device_name) -{ - monitor_param_by_name monitor = { device_name, NULL, }; - EnumDisplayMonitors (NULL, NULL, monitor_enum_proc_by_name, - (LPARAM) & monitor); - return monitor.hmonitor; -} - -static BOOL CALLBACK -monitor_enum_proc_primary (HMONITOR hmonitor, HDC hdc, LPRECT rect, - LPARAM lparam) -{ - MONITORINFOEXA monitor_info; - monitor_param_by_name *param = (monitor_param_by_name *) lparam; - - monitor_info.cbSize = sizeof (monitor_info); - if (GetMonitorInfoA (hmonitor, (MONITORINFO *) & monitor_info)) { - if (MONITORINFOF_PRIMARY == monitor_info.dwFlags) { - param->hmonitor = hmonitor; - return FALSE; - } - } - return TRUE; -} - -HMONITOR -get_hmonitor_primary (void) -{ - monitor_param_by_name monitor = { NULL, NULL, }; - EnumDisplayMonitors (NULL, NULL, monitor_enum_proc_primary, - (LPARAM) & monitor); - return monitor.hmonitor; -} - -typedef struct _monitor_param_by_index -{ - int target; - int counter; - HMONITOR hmonitor; -} monitor_param_by_index; - -static BOOL CALLBACK -monitor_enum_proc_by_index (HMONITOR hmonitor, HDC hdc, LPRECT rect, - LPARAM lparam) -{ - MONITORINFOEXA monitor_info; - monitor_param_by_index *param = (monitor_param_by_index *) lparam; - - monitor_info.cbSize = sizeof (monitor_info); - if (GetMonitorInfoA (hmonitor, (MONITORINFO *) & monitor_info)) { - if (param->target == param->counter) { - param->hmonitor = hmonitor; - return FALSE; - } - } - ++param->counter; - return TRUE; -} - -HMONITOR -get_hmonitor_by_index (int index) -{ - monitor_param_by_index monitor = { index, 0, NULL, }; - EnumDisplayMonitors (NULL, NULL, monitor_enum_proc_by_index, - (LPARAM) & monitor); - return monitor.hmonitor; -} - - -gboolean -get_monitor_physical_size (HMONITOR hmonitor, LPRECT rect) -{ - MONITORINFOEXW monitor_info; - DEVMODEW dev_mode; - - monitor_info.cbSize = sizeof (monitor_info); - if (!GetMonitorInfoW (hmonitor, (LPMONITORINFO) & monitor_info)) { - return FALSE; - } - - dev_mode.dmSize = sizeof (dev_mode); - dev_mode.dmDriverExtra = sizeof (POINTL); - dev_mode.dmFields = DM_POSITION; - if (!EnumDisplaySettingsW - (monitor_info.szDevice, ENUM_CURRENT_SETTINGS, &dev_mode)) { - return FALSE; - } - - SetRect (rect, 0, 0, dev_mode.dmPelsWidth, dev_mode.dmPelsHeight); - return TRUE; -} - -static const gchar * -_hresult_to_string_fallback (HRESULT hr) -{ - const gchar *s = "unknown error"; - - switch (hr) { - case DXGI_ERROR_ACCESS_DENIED: - s = "DXGI_ERROR_ACCESS_DENIED"; - break; - case DXGI_ERROR_ACCESS_LOST: - s = "DXGI_ERROR_ACCESS_LOST"; - break; - case DXGI_ERROR_CANNOT_PROTECT_CONTENT: - s = "DXGI_ERROR_CANNOT_PROTECT_CONTENT"; - break; - case DXGI_ERROR_DEVICE_HUNG: - s = "DXGI_ERROR_DEVICE_HUNG"; - break; - case DXGI_ERROR_DEVICE_REMOVED: - s = "DXGI_ERROR_DEVICE_REMOVED"; - break; - case DXGI_ERROR_DEVICE_RESET: - s = "DXGI_ERROR_DEVICE_RESET"; - break; - case DXGI_ERROR_DRIVER_INTERNAL_ERROR: - s = "DXGI_ERROR_DRIVER_INTERNAL_ERROR"; - break; - case DXGI_ERROR_FRAME_STATISTICS_DISJOINT: - s = "DXGI_ERROR_FRAME_STATISTICS_DISJOINT"; - break; - case DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE: - s = "DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE"; - break; - case DXGI_ERROR_INVALID_CALL: - s = "DXGI_ERROR_INVALID_CALL"; - break; - case DXGI_ERROR_MORE_DATA: - s = "DXGI_ERROR_MORE_DATA"; - break; - case DXGI_ERROR_NAME_ALREADY_EXISTS: - s = "DXGI_ERROR_NAME_ALREADY_EXISTS"; - break; - case DXGI_ERROR_NONEXCLUSIVE: - s = "DXGI_ERROR_NONEXCLUSIVE"; - break; - case DXGI_ERROR_NOT_CURRENTLY_AVAILABLE: - s = "DXGI_ERROR_NOT_CURRENTLY_AVAILABLE"; - break; - case DXGI_ERROR_NOT_FOUND: - s = "DXGI_ERROR_NOT_FOUND"; - break; - case DXGI_ERROR_REMOTE_CLIENT_DISCONNECTED: - s = "DXGI_ERROR_REMOTE_CLIENT_DISCONNECTED"; - break; - case DXGI_ERROR_REMOTE_OUTOFMEMORY: - s = "DXGI_ERROR_REMOTE_OUTOFMEMORY"; - break; - case DXGI_ERROR_RESTRICT_TO_OUTPUT_STALE: - s = "DXGI_ERROR_RESTRICT_TO_OUTPUT_STALE"; - break; - case DXGI_ERROR_SDK_COMPONENT_MISSING: - s = "DXGI_ERROR_SDK_COMPONENT_MISSING"; - break; - case DXGI_ERROR_SESSION_DISCONNECTED: - s = "DXGI_ERROR_SESSION_DISCONNECTED"; - break; - case DXGI_ERROR_UNSUPPORTED: - s = "DXGI_ERROR_UNSUPPORTED"; - break; - case DXGI_ERROR_WAIT_TIMEOUT: - s = "DXGI_ERROR_WAIT_TIMEOUT"; - break; - case DXGI_ERROR_WAS_STILL_DRAWING: - s = "DXGI_ERROR_WAS_STILL_DRAWING"; - break; - case E_FAIL: - s = "E_FAIL"; - break; - case E_OUTOFMEMORY: - s = "E_OUTOFMEMORY"; - break; - case E_NOTIMPL: - s = "E_NOTIMPL"; - break; - case E_ACCESSDENIED: - s = "E_ACCESSDENIED"; - break; - case E_POINTER: - s = "E_POINTER"; - break; - case E_INVALIDARG: - s = "E_INVALIDARG"; - break; -#if defined(_MSC_VER) && (_MSC_VER >= 1800) - case DXGI_ERROR_ALREADY_EXISTS: - s = "DXGI_ERROR_ALREADY_EXISTS"; - break; - case D3D11_ERROR_FILE_NOT_FOUND: - s = "D3D11_ERROR_FILE_NOT_FOUND"; - break; - case D3D11_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS: - s = "D3D11_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS"; - break; - case D3D11_ERROR_TOO_MANY_UNIQUE_VIEW_OBJECTS: - s = "D3D11_ERROR_TOO_MANY_UNIQUE_VIEW_OBJECTS"; - break; - case D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD: - s = "D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD"; - break; -#endif - } - return s; -} - -gchar * -get_hresult_to_string (HRESULT hr) -{ - gchar *error_text = NULL; - - error_text = g_win32_error_message ((gint) hr); - /* g_win32_error_message() doesn't cover all HERESULT return code, - * so it could be empty string, or null if there was an error - * in g_utf16_to_utf8() */ - if (!error_text || strlen (error_text) == 0) { - g_free (error_text); - error_text = g_strdup (_hresult_to_string_fallback (hr)); - } - - return error_text; -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/winscreencap/dxgicapture.h
Deleted
@@ -1,86 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 OKADA Jun-ichi <okada@abt.jp> - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __DXGICAP_H__ -#define __DXGICAP_H__ - -#define COBJMACROS -#include <d3d11.h> -#include <dxgi.h> -#include <dxgi1_2.h> -#undef COBJMACROS - -#include <gst/gst.h> -#include <gst/base/gstpushsrc.h> -#include <gst/video/video.h> - -#define RECT_WIDTH(r) (r.right - r.left) -#define RECT_HEIGHT(r) (r.bottom - r.top) - -#define HR_FAILED_AND(hr,func,and) \ - G_STMT_START { \ - if (FAILED (hr)) { \ - gchar *msg = get_hresult_to_string (hr); \ - GST_ERROR_OBJECT (src, #func " failed (%x): %s", (guint) hr, msg); \ - g_free (msg); \ - and; \ - } \ - } G_STMT_END - -#define HR_FAILED_RET(hr,func,ret) HR_FAILED_AND(hr,func,return ret) - -#define HR_FAILED_GOTO(hr,func,where) HR_FAILED_AND(hr,func,goto where) - -#define HR_FAILED_INFO(hr, func) \ - G_STMT_START { \ - if (FAILED (hr)) { \ - gchar *msg = get_hresult_to_string (hr); \ - GST_INFO_OBJECT (src, #func " failed (%x): %s", (guint) hr, msg); \ - g_free (msg); \ - } \ - } G_STMT_END - -#define GST_DXGICAP_FLOW_RESOLUTION_CHANGE GST_FLOW_CUSTOM_SUCCESS_1 - -typedef struct _GstDXGIScreenCapSrc GstDXGIScreenCapSrc; - -typedef struct _DxgiCapture DxgiCapture; - -gboolean gst_dxgicap_shader_init (void); - -DxgiCapture *dxgicap_new (HMONITOR monitor, GstDXGIScreenCapSrc * src); -void dxgicap_destory (DxgiCapture * _this); - -gboolean dxgicap_start (DxgiCapture * _this); -void dxgicap_stop (DxgiCapture * _this); - -GstFlowReturn dxgicap_acquire_next_frame (DxgiCapture * _this, gboolean show_cursor, - guint timeout); -gboolean dxgicap_copy_buffer (DxgiCapture * _this, gboolean show_cursor, - LPRECT src_rect, GstVideoInfo * video_info, GstBuffer * buf); - -HMONITOR get_hmonitor_by_device_name (const gchar * device_name); -HMONITOR get_hmonitor_primary (void); -HMONITOR get_hmonitor_by_index (int index); - -gboolean get_monitor_physical_size (HMONITOR hmonitor, LPRECT rect); - -gchar *get_hresult_to_string (HRESULT hr); - -#endif /* __DXGICAP_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/winscreencap/gstdxgiscreencapsrc.c
Deleted
@@ -1,611 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 OKADA Jun-ichi <okada@abt.jp> - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * SECTION:element-dxgiscreencapsrc - * @title: dxgiscreencapsrc - * - * This element uses DXGI Desktop Duplication API. - * The default is capturing the whole desktop, but #GstDXGIScreenCapSrc:x, - * #GstDXGIScreenCapSrc:y, #GstDXGIScreenCapSrc:width and - * #GstDXGIScreenCapSrc:height can be used to select a particular region. - * Use #GstDXGIScreenCapSrc:monitor for changing which monitor to capture - * from. - * - * ## Example pipelines - * | - * gst-launch-1.0 dxgiscreencapsrc ! videoconvert ! dshowvideosink - * | Capture the desktop and display it. - * | - * gst-launch-1.0 dxgiscreencapsrc x=100 y=100 width=320 height=240 ! - * videoconvert ! dshowvideosink - * | Capture a portion of the desktop and display it. - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <windows.h> -#include <versionhelpers.h> -#include <gst/video/video.h> -#include "gstdxgiscreencapsrc.h" -#include "dxgicapture.h" - -GST_DEBUG_CATEGORY_EXTERN (gst_dxgi_screen_cap_src_debug); -#define GST_CAT_DEFAULT gst_dxgi_screen_cap_src_debug - -struct _GstDXGIScreenCapSrc -{ - /* Parent */ - GstPushSrc src; - - /* Properties */ - gint capture_x; - gint capture_y; - gint capture_w; - gint capture_h; - guint monitor; - gchar *device_name; - gboolean show_cursor; - - /* Source pad frame rate */ - gint rate_numerator; - gint rate_denominator; - - /* Runtime variables */ - RECT screen_rect; - RECT src_rect; - guint64 frame_number; - GstClockID clock_id; - GstVideoInfo video_info; - - /*DXGI capture */ - DxgiCapture *dxgi_capture; -}; - -static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("BGRA"))); - -#define gst_dxgi_screen_cap_src_parent_class parent_class -G_DEFINE_TYPE (GstDXGIScreenCapSrc, gst_dxgi_screen_cap_src, GST_TYPE_PUSH_SRC); - -#define DEFAULT_MONITOR (-1) -#define DEFAULT_DEVICE_NAME (NULL) -#define DEFAULT_SHOW_CURSOR (FALSE) -#define DEFAULT_X_POS (0) -#define DEFAULT_Y_POS (0) -#define DEFAULT_WIDTH (0) -#define DEFAULT_HEIGHT (0) - -enum -{ - PROP_0, - PROP_MONITOR, - PROP_DEVICE_NAME, - PROP_SHOW_CURSOR, - PROP_X_POS, - PROP_Y_POS, - PROP_WIDTH, - PROP_HEIGHT -}; - -static void gst_dxgi_screen_cap_src_dispose (GObject * object); -static void gst_dxgi_screen_cap_src_set_property (GObject * object, - guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_dxgi_screen_cap_src_get_property (GObject * object, - guint prop_id, GValue * value, GParamSpec * pspec); - -static GstCaps *gst_dxgi_screen_cap_src_fixate (GstBaseSrc * bsrc, - GstCaps * caps); -static gboolean gst_dxgi_screen_cap_src_set_caps (GstBaseSrc * bsrc, - GstCaps * caps); -static GstCaps *gst_dxgi_screen_cap_src_get_caps (GstBaseSrc * bsrc, - GstCaps * filter); -static gboolean gst_dxgi_screen_cap_src_start (GstBaseSrc * bsrc); -static gboolean gst_dxgi_screen_cap_src_stop (GstBaseSrc * bsrc); - -static gboolean gst_dxgi_screen_cap_src_unlock (GstBaseSrc * bsrc); - -static GstFlowReturn gst_dxgi_screen_cap_src_create (GstBaseSrc * pushsrc, - guint64 offset, guint length, GstBuffer ** buffer); - -static HMONITOR _get_hmonitor (GstDXGIScreenCapSrc * src); - -/* Implementation. */ -static void -gst_dxgi_screen_cap_src_class_init (GstDXGIScreenCapSrcClass * klass) -{ - GObjectClass *go_class; - GstElementClass *e_class; - GstBaseSrcClass *bs_class; - - go_class = G_OBJECT_CLASS (klass); - e_class = GST_ELEMENT_CLASS (klass); - bs_class = GST_BASE_SRC_CLASS (klass); - - go_class->set_property = gst_dxgi_screen_cap_src_set_property; - go_class->get_property = gst_dxgi_screen_cap_src_get_property; - - go_class->dispose = GST_DEBUG_FUNCPTR (gst_dxgi_screen_cap_src_dispose); - bs_class->get_caps = GST_DEBUG_FUNCPTR (gst_dxgi_screen_cap_src_get_caps); - bs_class->set_caps = GST_DEBUG_FUNCPTR (gst_dxgi_screen_cap_src_set_caps); - bs_class->start = GST_DEBUG_FUNCPTR (gst_dxgi_screen_cap_src_start); - bs_class->stop = GST_DEBUG_FUNCPTR (gst_dxgi_screen_cap_src_stop); - bs_class->unlock = GST_DEBUG_FUNCPTR (gst_dxgi_screen_cap_src_unlock); - bs_class->fixate = GST_DEBUG_FUNCPTR (gst_dxgi_screen_cap_src_fixate); - bs_class->create = GST_DEBUG_FUNCPTR (gst_dxgi_screen_cap_src_create); - - g_object_class_install_property (go_class, PROP_MONITOR, - g_param_spec_int ("monitor", "Monitor", - "Which monitor to use (-1 = primary monitor and default)", - DEFAULT_MONITOR, G_MAXINT, DEFAULT_MONITOR, G_PARAM_READWRITE)); - g_object_class_install_property (go_class, PROP_DEVICE_NAME, - g_param_spec_string ("device-name", "Monitor device name", - "Which monitor to use by device name (e.g. \"\\\\\\\\.\\\\DISPLAY1\")", - DEFAULT_DEVICE_NAME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (go_class, PROP_SHOW_CURSOR, - g_param_spec_boolean ("cursor", - "Show mouse cursor", - "Whether to show mouse cursor (default off)", - DEFAULT_SHOW_CURSOR, G_PARAM_READWRITE)); - g_object_class_install_property (go_class, PROP_X_POS, - g_param_spec_int ("x", "X", - "Horizontal coordinate of top left corner for the screen capture " - "area", 0, G_MAXINT, DEFAULT_X_POS, G_PARAM_READWRITE)); - g_object_class_install_property (go_class, PROP_Y_POS, - g_param_spec_int ("y", "Y", - "Vertical coordinate of top left corner for the screen capture " - "area", 0, G_MAXINT, DEFAULT_Y_POS, G_PARAM_READWRITE)); - g_object_class_install_property (go_class, PROP_WIDTH, - g_param_spec_int ("width", "Width", - "Width of screen capture area (0 = maximum)", - 0, G_MAXINT, DEFAULT_WIDTH, G_PARAM_READWRITE)); - g_object_class_install_property (go_class, PROP_HEIGHT, - g_param_spec_int ("height", "Height", - "Height of screen capture area (0 = maximum)", - 0, G_MAXINT, DEFAULT_HEIGHT, G_PARAM_READWRITE)); - - gst_element_class_add_static_pad_template (e_class, &src_template); - - gst_element_class_set_static_metadata (e_class, - "DirectX DXGI screen capture source", - "Source/Video", "Captures screen", "OKADA Jun-ichi <okada@abt.jp>"); -} - -static void -gst_dxgi_screen_cap_src_init (GstDXGIScreenCapSrc * src) -{ - /* Set src element inital values... */ - src->capture_x = DEFAULT_X_POS; - src->capture_y = DEFAULT_Y_POS; - src->capture_w = DEFAULT_WIDTH; - src->capture_h = DEFAULT_HEIGHT; - - src->monitor = DEFAULT_MONITOR; - src->device_name = DEFAULT_DEVICE_NAME; - src->show_cursor = DEFAULT_SHOW_CURSOR; - - src->dxgi_capture = NULL; - - gst_base_src_set_live (GST_BASE_SRC (src), TRUE); - gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME); -} - -static void -gst_dxgi_screen_cap_src_dispose (GObject * object) -{ - GstDXGIScreenCapSrc *src = GST_DXGI_SCREEN_CAP_SRC (object); - - g_free (src->device_name); - src->device_name = NULL; - - dxgicap_destory (src->dxgi_capture); - src->dxgi_capture = NULL; - - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -static void -gst_dxgi_screen_cap_src_set_property (GObject * object, - guint prop_id, const GValue * value, GParamSpec * pspec) -{ - GstDXGIScreenCapSrc *src = GST_DXGI_SCREEN_CAP_SRC (object); - - switch (prop_id) { - case PROP_MONITOR: - src->monitor = g_value_get_int (value); - break; - case PROP_DEVICE_NAME: - g_free (src->device_name); - src->device_name = g_value_dup_string (value); - break; - case PROP_SHOW_CURSOR: - src->show_cursor = g_value_get_boolean (value); - break; - case PROP_X_POS: - src->capture_x = g_value_get_int (value); - break; - case PROP_Y_POS: - src->capture_y = g_value_get_int (value); - break; - case PROP_WIDTH: - src->capture_w = g_value_get_int (value); - break; - case PROP_HEIGHT: - src->capture_h = g_value_get_int (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - }; -} - -static void -gst_dxgi_screen_cap_src_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstDXGIScreenCapSrc *src = GST_DXGI_SCREEN_CAP_SRC (object); - - switch (prop_id) { - case PROP_MONITOR: - g_value_set_int (value, src->monitor); - break; - case PROP_DEVICE_NAME: - g_value_set_string (value, src->device_name); - break; - case PROP_SHOW_CURSOR: - g_value_set_boolean (value, src->show_cursor); - break; - case PROP_X_POS: - g_value_set_int (value, src->capture_x); - break; - case PROP_Y_POS: - g_value_set_int (value, src->capture_y); - break; - case PROP_WIDTH: - g_value_set_int (value, src->capture_w); - break; - case PROP_HEIGHT: - g_value_set_int (value, src->capture_h); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - }; -} - -static GstCaps * -gst_dxgi_screen_cap_src_fixate (GstBaseSrc * bsrc, GstCaps * caps) -{ - GstStructure *structure; - - caps = gst_caps_make_writable (caps); - - structure = gst_caps_get_structure (caps, 0); - - gst_structure_fixate_field_nearest_int (structure, "width", 640); - gst_structure_fixate_field_nearest_int (structure, "height", 480); - gst_structure_fixate_field_nearest_fraction (structure, "framerate", 30, 1); - - caps = GST_BASE_SRC_CLASS (parent_class)->fixate (bsrc, caps); - - return caps; -} - -static gboolean -gst_dxgi_screen_cap_src_set_caps (GstBaseSrc * bsrc, GstCaps * caps) -{ - GstDXGIScreenCapSrc *src = GST_DXGI_SCREEN_CAP_SRC (bsrc); - GstStructure *structure; - - structure = gst_caps_get_structure (caps, 0); - - src->src_rect = src->screen_rect; - if (src->capture_w && src->capture_h) { - src->src_rect.left += src->capture_x; - src->src_rect.top += src->capture_y; - src->src_rect.right = src->src_rect.left + src->capture_w; - src->src_rect.bottom = src->src_rect.top + src->capture_h; - } - - gst_structure_get_fraction (structure, "framerate", - &src->rate_numerator, &src->rate_denominator); - - GST_DEBUG_OBJECT (src, "set_caps size %dx%d, %d/%d fps", - (gint) RECT_WIDTH (src->src_rect), - (gint) RECT_HEIGHT (src->src_rect), - src->rate_numerator, src->rate_denominator); - - gst_video_info_from_caps (&src->video_info, caps); - gst_base_src_set_blocksize (bsrc, GST_VIDEO_INFO_SIZE (&src->video_info)); - return TRUE; -} - -static GstCaps * -gst_dxgi_screen_cap_src_get_caps (GstBaseSrc * bsrc, GstCaps * filter) -{ - GstDXGIScreenCapSrc *src = GST_DXGI_SCREEN_CAP_SRC (bsrc); - RECT rect_dst; - GstCaps *caps = NULL; - - HMONITOR hmonitor = _get_hmonitor (src); - if (!get_monitor_physical_size (hmonitor, &rect_dst)) { - GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, - ("Specified monitor with index %d not found", src->monitor), (NULL)); - return NULL; - } - - src->screen_rect = rect_dst; - if (src->capture_w && src->capture_h && - src->capture_x + src->capture_w <= RECT_WIDTH (rect_dst) && - src->capture_y + src->capture_h <= RECT_HEIGHT (rect_dst)) { - rect_dst.left = src->capture_x; - rect_dst.top = src->capture_y; - rect_dst.right = src->capture_x + src->capture_w; - rect_dst.bottom = src->capture_y + src->capture_h; - } else { - /* Default values */ - src->capture_x = src->capture_y = 0; - src->capture_w = src->capture_h = 0; - } - - /* The desktop image is always in the DXGI_FORMAT_B8G8R8A8_UNORM format. */ - GST_DEBUG_OBJECT (src, "get_cap rect: %ld, %ld, %ld, %ld", rect_dst.left, - rect_dst.top, rect_dst.right, rect_dst.bottom); - - caps = - gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, "BGRA", - "width", G_TYPE_INT, RECT_WIDTH (rect_dst), - "height", G_TYPE_INT, RECT_HEIGHT (rect_dst), - "framerate", GST_TYPE_FRACTION_RANGE, 1, 1, G_MAXINT, - 1, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, NULL); - - if (filter) { - GstCaps *tmp = - gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); - gst_caps_unref (caps); - caps = tmp; - } - return caps; -} - -static gboolean -gst_dxgi_screen_cap_src_start (GstBaseSrc * bsrc) -{ - GstDXGIScreenCapSrc *src = GST_DXGI_SCREEN_CAP_SRC (bsrc); - HMONITOR hmonitor = _get_hmonitor (src); - if (NULL == hmonitor) { - GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, - ("Specified monitor with index %d not found", src->monitor), (NULL)); - return FALSE; - } - src->dxgi_capture = dxgicap_new (hmonitor, src); - - if (NULL == src->dxgi_capture) { - GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, - ("Specified monitor with index %d not found", src->monitor), (NULL)); - return FALSE; - } - dxgicap_start (src->dxgi_capture); - - src->frame_number = -1; - return TRUE; -} - -static gboolean -gst_dxgi_screen_cap_src_stop (GstBaseSrc * bsrc) -{ - GstDXGIScreenCapSrc *src = GST_DXGI_SCREEN_CAP_SRC (bsrc); - dxgicap_stop (src->dxgi_capture); - dxgicap_destory (src->dxgi_capture); - src->dxgi_capture = NULL; - - return TRUE; -} - -static gboolean -gst_dxgi_screen_cap_src_unlock (GstBaseSrc * bsrc) -{ - GstDXGIScreenCapSrc *src = GST_DXGI_SCREEN_CAP_SRC (bsrc); - - GST_OBJECT_LOCK (src); - if (src->clock_id) { - GST_DEBUG_OBJECT (src, "Waking up waiting clock"); - gst_clock_id_unschedule (src->clock_id); - } - GST_OBJECT_UNLOCK (src); - - return TRUE; -} - -static GstFlowReturn -gst_dxgi_screen_cap_src_create (GstBaseSrc * base_src, guint64 offset, - guint length, GstBuffer ** buf) -{ - GstDXGIScreenCapSrc *src = GST_DXGI_SCREEN_CAP_SRC (base_src); - GstClock *clock; - GstClockTime buf_time, buf_dur; - guint64 frame_number; - GstFlowReturn ret; - GstBuffer *buffer = NULL; - - if (G_UNLIKELY (!src->dxgi_capture)) { - GST_DEBUG_OBJECT (src, "format wasn't negotiated before create function"); - return GST_FLOW_NOT_NEGOTIATED; - } - - clock = gst_element_get_clock (GST_ELEMENT (src)); - if (clock != NULL) { - GstClockTime time, base_time; - - /* Calculate sync time. */ - - time = gst_clock_get_time (clock); - base_time = gst_element_get_base_time (GST_ELEMENT (src)); - buf_time = time - base_time; - - if (src->rate_numerator) { - frame_number = gst_util_uint64_scale (buf_time, - src->rate_numerator, GST_SECOND * src->rate_denominator); - } else { - frame_number = -1; - } - } else { - buf_time = GST_CLOCK_TIME_NONE; - frame_number = -1; - } - - if (frame_number != -1 && frame_number == src->frame_number) { - GstClockID id; - GstClockReturn ret; - - /* Need to wait for the next frame */ - frame_number += 1; - - /* Figure out what the next frame time is */ - buf_time = gst_util_uint64_scale (frame_number, - src->rate_denominator * GST_SECOND, src->rate_numerator); - - id = gst_clock_new_single_shot_id (clock, - buf_time + gst_element_get_base_time (GST_ELEMENT (src))); - GST_OBJECT_LOCK (src); - src->clock_id = id; - GST_OBJECT_UNLOCK (src); - - GST_DEBUG_OBJECT (src, "Waiting for next frame time %" G_GUINT64_FORMAT, - buf_time); - ret = gst_clock_id_wait (id, NULL); - - GST_OBJECT_LOCK (src); - gst_clock_id_unref (id); - src->clock_id = NULL; - GST_OBJECT_UNLOCK (src); - - if (ret == GST_CLOCK_UNSCHEDULED) { - /* Got woken up by the unlock function */ - if (clock) { - gst_object_unref (clock); - } - return GST_FLOW_FLUSHING; - } - - /* Duration is a complete 1/fps frame duration */ - buf_dur = - gst_util_uint64_scale_int (GST_SECOND, src->rate_denominator, - src->rate_numerator); - } else if (frame_number != -1) { - GstClockTime next_buf_time; - - GST_DEBUG_OBJECT (src, "No need to wait for next frame time %" - G_GUINT64_FORMAT " next frame = %" G_GINT64_FORMAT - " prev = %" G_GINT64_FORMAT, buf_time, frame_number, src->frame_number); - next_buf_time = - gst_util_uint64_scale (frame_number + 1, - src->rate_denominator * GST_SECOND, src->rate_numerator); - /* Frame duration is from now until the next expected capture time */ - buf_dur = next_buf_time - buf_time; - } else { - buf_dur = GST_CLOCK_TIME_NONE; - } - src->frame_number = frame_number; - - if (clock) { - gst_object_unref (clock); - } - - /* Get the latest desktop frame. */ - do { - ret = dxgicap_acquire_next_frame (src->dxgi_capture, src->show_cursor, 0); - if (ret == GST_DXGICAP_FLOW_RESOLUTION_CHANGE) { - GST_DEBUG_OBJECT (src, "Resolution change detected."); - - if (!gst_base_src_negotiate (GST_BASE_SRC (src))) { - return GST_FLOW_NOT_NEGOTIATED; - } - } - } while (ret == GST_DXGICAP_FLOW_RESOLUTION_CHANGE); - - if (ret != GST_FLOW_OK) { - return ret; - } - - ret = - GST_BASE_SRC_CLASS (g_type_class_peek_parent (parent_class))->alloc - (base_src, offset, length, &buffer); - if (ret != GST_FLOW_OK) { - return ret; - } - - /* Copy the latest desktop frame to the video frame. */ - if (dxgicap_copy_buffer (src->dxgi_capture, src->show_cursor, - &src->src_rect, &src->video_info, buffer)) { - GST_BUFFER_TIMESTAMP (buffer) = buf_time; - GST_BUFFER_DURATION (buffer) = buf_dur; - *buf = buffer; - - return GST_FLOW_OK; - } - - gst_clear_buffer (&buffer); - - return GST_FLOW_ERROR; -} - -static HMONITOR -_get_hmonitor (GstDXGIScreenCapSrc * src) -{ - HMONITOR hmonitor = NULL; - GST_DEBUG_OBJECT (src, "device_name:%s", GST_STR_NULL (src->device_name)); - if (NULL != src->device_name) { - hmonitor = get_hmonitor_by_device_name (src->device_name); - } - if (NULL == hmonitor && DEFAULT_MONITOR != src->monitor) { - hmonitor = get_hmonitor_by_index (src->monitor); - } - if (NULL == hmonitor) { - hmonitor = get_hmonitor_primary (); - } - return hmonitor; -} - -void -gst_dxgi_screen_cap_src_register (GstPlugin * plugin, GstRank rank) -{ - if (!IsWindows8OrGreater ()) { - GST_WARNING ("OS version is too old"); - return; - } - - if (!gst_dxgicap_shader_init ()) { - GST_WARNING ("Couldn't load HLS compiler"); - return; - } - - /** - * element-dxgiscreencapsrc: - * - * Since: 1.18 - */ - gst_element_register (plugin, "dxgiscreencapsrc", - rank, GST_TYPE_DXGI_SCREEN_CAP_SRC); -}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/winscreencap/gstdxgiscreencapsrc.h
Deleted
@@ -1,35 +0,0 @@ -/* GStreamer - * Copyright (C) 2019 OKADA Jun-ichi <okada@abt.jp> - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef __GST_DXGI_SCREEN_CAP_SRC_H__ -#define __GST_DXGI_SCREEN_CAP_SRC_H__ - -#include <windows.h> -#include <gst/gst.h> -#include <gst/base/gstpushsrc.h> - -G_BEGIN_DECLS -#define GST_TYPE_DXGI_SCREEN_CAP_SRC (gst_dxgi_screen_cap_src_get_type()) -G_DECLARE_FINAL_TYPE (GstDXGIScreenCapSrc, gst_dxgi_screen_cap_src, GST, - DXGI_SCREEN_CAP_SRC, GstPushSrc); - -void gst_dxgi_screen_cap_src_register (GstPlugin * plugin, - GstRank rank); - -G_END_DECLS -#endif /* __GST_DXGI_SCREEN_CAP_SRC_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/d3d11/d3d11videosink-kb.c
Deleted
@@ -1,172 +0,0 @@ -/* GStreamer command line playback testing utility - keyboard handling helpers - * - * Copyright (C) 2013 Tim-Philipp Müller <tim centricular net> - * Copyright (C) 2013 Centricular Ltd - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "d3d11videosink-kb.h" - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <windows.h> -#include <io.h> - -#include <gst/gst.h> - -/* This is all not thread-safe, but doesn't have to be really */ -static GstD3D11VideoSinkKbFunc kb_callback; -static gpointer kb_callback_data; - -typedef struct -{ - GThread *thread; - HANDLE event_handle; - HANDLE console_handle; - gboolean closing; - GMutex lock; -} Win32KeyHandler; - -static Win32KeyHandler *win32_handler = NULL; - -static gboolean -gst_d3d11_video_sink_source_cb (Win32KeyHandler * handler) -{ - HANDLE h_input = handler->console_handle; - INPUT_RECORD buffer; - DWORD n; - - if (PeekConsoleInput (h_input, &buffer, 1, &n) && n == 1) { - ReadConsoleInput (h_input, &buffer, 1, &n); - - if (buffer.EventType == KEY_EVENT && buffer.Event.KeyEvent.bKeyDown) { - if (buffer.Event.KeyEvent.wVirtualKeyCode == VK_SPACE) { - kb_callback (' ', kb_callback_data); - } else { - kb_callback (buffer.Event.KeyEvent.uChar.AsciiChar, kb_callback_data); - } - } - } - - return G_SOURCE_REMOVE; -} - -static gpointer -gst_d3d11_video_sink_kb_thread (gpointer user_data) -{ - Win32KeyHandler *handler = (Win32KeyHandler *) user_data; - HANDLE handles2; - - handles0 = handler->event_handle; - handles1 = handler->console_handle; - - if (!kb_callback) - return NULL; - - while (TRUE) { - DWORD ret = WaitForMultipleObjects (2, handles, FALSE, INFINITE); - - if (ret == WAIT_FAILED) { - GST_WARNING ("WaitForMultipleObject Failed"); - return NULL; - } - - g_mutex_lock (&handler->lock); - if (handler->closing) { - g_mutex_unlock (&handler->lock); - - return NULL; - } - g_mutex_unlock (&handler->lock); - - g_idle_add ((GSourceFunc) gst_d3d11_video_sink_source_cb, handler); - } - - return NULL; -} - -gboolean -gst_d3d11_video_sink_kb_set_key_handler (GstD3D11VideoSinkKbFunc kb_func, - gpointer user_data) -{ - gint fd = _fileno (stdin); - - if (!_isatty (fd)) { - GST_INFO ("stdin is not connected to a terminal"); - return FALSE; - } - - if (win32_handler) { - g_mutex_lock (&win32_handler->lock); - win32_handler->closing = TRUE; - g_mutex_unlock (&win32_handler->lock); - - SetEvent (win32_handler->event_handle); - g_thread_join (win32_handler->thread); - CloseHandle (win32_handler->event_handle); - - g_mutex_clear (&win32_handler->lock); - g_free (win32_handler); - win32_handler = NULL; - } - - if (kb_func) { - SECURITY_ATTRIBUTES sec_attrs; - - sec_attrs.nLength = sizeof (SECURITY_ATTRIBUTES); - sec_attrs.lpSecurityDescriptor = NULL; - sec_attrs.bInheritHandle = FALSE; - - win32_handler = g_new0 (Win32KeyHandler, 1); - - /* create cancellable event handle */ - win32_handler->event_handle = CreateEvent (&sec_attrs, TRUE, FALSE, NULL); - - if (!win32_handler->event_handle) { - g_warning ("Couldn't create event handle\n"); - g_free (win32_handler); - win32_handler = NULL; - - return FALSE; - } - - win32_handler->console_handle = GetStdHandle (STD_INPUT_HANDLE); - if (!win32_handler->console_handle) { - g_warning ("Couldn't get console handle\n"); - CloseHandle (win32_handler->event_handle); - g_free (win32_handler); - win32_handler = NULL; - - return FALSE; - } - - g_mutex_init (&win32_handler->lock); - win32_handler->thread = - g_thread_new ("gst-play-kb", gst_d3d11_video_sink_kb_thread, - win32_handler); - } - - kb_callback = kb_func; - kb_callback_data = user_data; - - return TRUE; -}
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/d3d11/d3d11videosink-kb.h
Deleted
@@ -1,30 +0,0 @@ -/* GStreamer command line playback testing utility - keyboard handling helpers - * - * Copyright (C) 2013 Tim-Philipp Müller <tim centricular net> - * Copyright (C) 2013 Centricular Ltd - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef __GST_D3D11_VIDEO_SINK_KB_H__ -#define __GST_D3D11_VIDEO_SINK_KB_H__ - -#include <glib.h> - -typedef void (*GstD3D11VideoSinkKbFunc) (gchar kb_input, gpointer user_data); - -gboolean gst_d3d11_video_sink_kb_set_key_handler (GstD3D11VideoSinkKbFunc kb_func, gpointer user_data); - -#endif /* __GST_D3D11_VIDEO_SINK_KB_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/nvcodec/nvcodec-kb.c
Deleted
@@ -1,142 +0,0 @@ -/* GStreamer command line playback testing utility - keyboard handling helpers - * - * Copyright (C) 2013 Tim-Philipp Müller <tim centricular net> - * Copyright (C) 2013 Centricular Ltd - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "nvcodec.h" - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#ifdef G_OS_UNIX -#include <unistd.h> -#include <termios.h> -#endif - -#include <gst/gst.h> - -/* This is all not thread-safe, but doesn't have to be really */ - -#ifdef G_OS_UNIX - -static struct termios term_settings; -static gboolean term_settings_saved = FALSE; -static GstNvCodecPlayKbFunc kb_callback; -static gpointer kb_callback_data; -static gulong io_watch_id; - -static gboolean -gst_nvcodec_kb_io_cb (GIOChannel * ioc, GIOCondition cond, gpointer user_data) -{ - GIOStatus status; - - if (cond & G_IO_IN) { - gchar buf16 = { 0, }; - gsize read; - - status = g_io_channel_read_chars (ioc, buf, sizeof (buf) - 1, &read, NULL); - if (status == G_IO_STATUS_ERROR) - return G_SOURCE_REMOVE; - if (status == G_IO_STATUS_NORMAL) { - if (kb_callback) - kb_callback (buf, kb_callback_data); - } - } - - return G_SOURCE_CONTINUE; -} - -gboolean -gst_nvcodec_kb_set_key_handler (GstNvCodecPlayKbFunc kb_func, - gpointer user_data) -{ - GIOChannel *ioc; - - if (!isatty (STDIN_FILENO)) { - GST_INFO ("stdin is not connected to a terminal"); - return FALSE; - } - - if (io_watch_id > 0) { - g_source_remove (io_watch_id); - io_watch_id = 0; - } - - if (kb_func == NULL && term_settings_saved) { - /* restore terminal settings */ - if (tcsetattr (STDIN_FILENO, TCSAFLUSH, &term_settings) == 0) - term_settings_saved = FALSE; - else - g_warning ("could not restore terminal attributes"); - - setvbuf (stdin, NULL, _IOLBF, 0); - } - - if (kb_func != NULL) { - struct termios new_settings; - - if (!term_settings_saved) { - if (tcgetattr (STDIN_FILENO, &term_settings) != 0) { - g_warning ("could not save terminal attributes"); - return FALSE; - } - term_settings_saved = TRUE; - - /* Echo off, canonical mode off, extended input processing off */ - new_settings = term_settings; - new_settings.c_lflag &= ~(ECHO | ICANON | IEXTEN); - new_settings.c_ccVMIN = 0; - new_settings.c_ccVTIME = 0; - - if (tcsetattr (STDIN_FILENO, TCSAFLUSH, &new_settings) != 0) { - g_warning ("Could not set terminal state"); - return FALSE; - } - setvbuf (stdin, NULL, _IONBF, 0); - } - } - - ioc = g_io_channel_unix_new (STDIN_FILENO); - - io_watch_id = g_io_add_watch_full (ioc, G_PRIORITY_DEFAULT, G_IO_IN, - (GIOFunc) gst_nvcodec_kb_io_cb, user_data, NULL); - g_io_channel_unref (ioc); - - kb_callback = kb_func; - kb_callback_data = user_data; - - return TRUE; -} - -#else /* !G_OS_UNIX */ - -gboolean -gst_nvcodec_kb_set_key_handler (GstNvCodecPlayKbFunc key_func, - gpointer user_data) -{ - GST_FIXME ("Keyboard handling for this OS needs to be implemented"); - return FALSE; -} - -#endif /* !G_OS_UNIX */
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/nvcodec/nvcodec.h
Deleted
@@ -1,35 +0,0 @@ -/* GStreamer command line playback testing utility - keyboard handling helpers - * - * Copyright (C) 2013 Tim-Philipp Müller <tim centricular net> - * Copyright (C) 2013 Centricular Ltd - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#ifndef __GST_NV_CODEC_KB_H__ -#define __GST_NV_CODEC_KB_H__ - -#include <glib.h> - -#define GST_NVCODEC_KB_ARROW_UP "\033A" -#define GST_NVCODEC_KB_ARROW_DOWN "\033B" -#define GST_NVCODEC_KB_ARROW_RIGHT "\033C" -#define GST_NVCODEC_KB_ARROW_LEFT "\033D" - -typedef void (*GstNvCodecPlayKbFunc) (const gchar * kb_input, gpointer user_data); - -gboolean gst_nvcodec_kb_set_key_handler (GstNvCodecPlayKbFunc kb_func, gpointer user_data); - -#endif /* __GST_NV_CODEC_EXAMPLE_KB_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/tests/icles
Deleted
-(directory)
View file
gst-plugins-bad-1.20.5.tar.xz/tests/icles/meson.build
Deleted
@@ -1,6 +0,0 @@ -if not get_option('soundtouch').disabled() and soundtouch_dep.found() - executable('pitch-test', 'pitch-test.c', - include_directories: configinc, - dependencies: glib_dep, gst_dep, gstcontroller_dep, - install: false) -endif
View file
gst-plugins-bad-1.20.5.tar.xz/tests/icles/pitch-test.c
Deleted
@@ -1,100 +0,0 @@ -/* GStreamer - * - * Copyright (C) 2006 Thomas Vander Stichele <thomas at apestaart dot org> - * - * 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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/* compile with : - * gcc -Wall $(pkg-config --cflags --libs gstreamer-0.10 gstreamer-controller-0.10) pitch.c -o pitch - */ - -#include <string.h> -#include <unistd.h> -#include <gst/gst.h> -#include <gst/controller/gsttimedvaluecontrolsource.h> -#include <gst/controller/gstinterpolationcontrolsource.h> -#include <gst/controller/gstdirectcontrolbinding.h> - -int -main (int argc, char **argv) -{ - GMainLoop *loop; - gint i; - - GstElement *audiotestsrc; - GstElement *audioconvert1, *audioconvert2; - GstElement *pitch; - GstElement *sink; - GstElement *pipeline; - GstControlSource *cs; - GstTimedValueControlSource *tvcs; - - if (argc != 2) { - g_printerr ("Usage: %s <audiosink>\n", argv0); - return 1; - } - - /* initialize GStreamer */ - gst_init (&argc, &argv); - - loop = g_main_loop_new (NULL, FALSE); - - pipeline = gst_pipeline_new ("audio-player"); - audiotestsrc = gst_element_factory_make ("audiotestsrc", "audiotestsrc"); - g_assert (audiotestsrc != NULL); - audioconvert1 = gst_element_factory_make ("audioconvert", "audioconvert1"); - g_assert (audioconvert1 != NULL); - audioconvert2 = gst_element_factory_make ("audioconvert", "audioconvert2"); - g_assert (audioconvert2 != NULL); - pitch = gst_element_factory_make ("pitch", "pitch"); - g_assert (pitch != NULL); - sink = gst_element_factory_make (argv1, "sink"); - g_assert (sink != NULL); - - gst_bin_add_many (GST_BIN (pipeline), - audiotestsrc, audioconvert1, pitch, audioconvert2, sink, NULL); - gst_element_link_many (audiotestsrc, audioconvert1, pitch, audioconvert2, - sink, NULL); - - /* set up a controller */ - cs = gst_interpolation_control_source_new (); - g_object_set (cs, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); - - gst_object_add_control_binding (GST_OBJECT (pitch), - gst_direct_control_binding_new (GST_OBJECT (pitch), "pitch", cs)); - tvcs = (GstTimedValueControlSource *) cs; - - for (i = 0; i < 100; ++i) { - if (i % 2) - gst_timed_value_control_source_set (tvcs, i * GST_SECOND, 0.5); - else - gst_timed_value_control_source_set (tvcs, i * GST_SECOND, 1.5); - } - - gst_element_set_state (pipeline, GST_STATE_PLAYING); - g_print ("Running\n"); - g_main_loop_run (loop); - - /* clean up nicely */ - gst_object_unref (cs); - 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)); - - return 0; -}
View file
gst-plugins-bad-1.20.5.tar.xz/ChangeLog -> gst-plugins-bad-1.22.0.tar.xz/ChangeLog
Changed
@@ -1,235221 +1,12401 @@ -=== release 1.20.5 === +=== release 1.22.0 === -2022-12-19 23:34:42 +0000 Tim-Philipp Müller <tim@centricular.com> +2023-01-23 19:29:34 +0000 Tim-Philipp Müller <tim@centricular.com> * NEWS: * RELEASE: * gst-plugins-bad.doap: * meson.build: - Release 1.20.5 + Release 1.22.0 -2022-12-19 23:34:34 +0000 Tim-Philipp Müller <tim@centricular.com> +2023-01-23 16:28:08 +0000 Tim-Philipp Müller <tim@centricular.com> - * ChangeLog: - Update ChangeLogs for 1.20.5 - -2022-12-16 15:03:12 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegts: Always clear packetizer on DISCONT push mode - If a discontinuity is detected in push mode, we need to clear the cached section - observations since they might have potentially changed. - This was only done properly when operating with TIME segments (dvb, udp, - adaptive demuxers, ...) but not with BYTE segments (such as with custom app/fd - sources). - We still don't want to flush out the PCR observations, since this might be - needed for seeking in push-based BYTE sources. - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1650 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3600> - -2022-12-17 20:04:01 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11videosink: Fixing focus lost on desktop layout change - Watch all message on the window thread, instead of internal window only. - Otherwise, some global window messages, such as desktop layout change, - wouldn't be handled by our window. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3594> - -2022-12-17 01:01:00 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: Report latency when doing screen capture - There is no `device` when doing screen capture, but there is always an - `input`, so use that to decide when we can reply to a latency query. - Without this, the latency query just fails. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3591> - -2022-12-16 21:42:50 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11videosink: Call ShowWindow() from window thread - ... when rendering on external HWND. ShowWindow() will cause - synchronous message passing to window thread and then can be blocked. - At the same time, window thread can wait for GStreamer thread. - Instead of the synchronous call, queue the task to window message - and performs from the window thread. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3588> - -2022-12-15 01:15:10 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - * sys/d3d11/gstd3d11window_dummy.cpp: - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11videosink: Fix deadlock when parent window is busy - Deadlock sequence: - * From a streaming thread, d3d11videosink sends synchronous message - to the parent window, so that internal (child) window can be - constructed on the parent window's thread - * App thread (parent window thread) is waiting for pipeline's - state change (to GST_STATE_NULL) but streaming thread is - blocked and waiting for app thread - To avoid the deadlock, GstD3D11WindowWin32 should send message - to the parent window asynchronously. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3573> - -2022-12-15 20:11:30 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11videosink: Error out if RTV is unavailable - Add RTV pointer validation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3573> - -2022-07-03 01:18:19 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - * sys/d3d11/gstd3d11videosink.h: - d3d11videosink: Protect window with lock at every place - Access to the object should be thread safe to support runtime - property update - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3573> - -2022-10-21 22:46:16 -0500 A. Wilcox <AWilcox@Wilcox-Tech.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * tests/check/libs/mpegts.c: - mpegts: Handle when iconv doesn't support ISO 6937 - Systems like musl libc don't support ISO 6937 in iconv. This ensures - that the MPEG-TS plugin can cope with that. There is existing support - in the plugin for other methods, so it seems to have been the original - intent anyway. - Fixes: #1314 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3563> - -2022-12-06 11:30:47 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegts: Check continuity counter on section streams - This wasn't really done, and is needed in order to detect potential section - changes for sections that have got identical information (such as when switching - between streams that have the same PAT/PMT pid and subtable information). - Other checks exist in tsbase to detect if the "new" PAT/PMT really is an update or not. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3556> - -2022-12-01 19:35:07 +0200 Marek Olejnik <molejnik@fluendo.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - h265decoder: Do not abort when failed to prepare ref pic set - Currently the element calls abort when failed to prepare reference - picture set. This can happent when the input stream is somehow - corrupted, like a rtsp strem with lost packets. Now it will only - return with GST_FLOW_ERROR instead of terminating whole process. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3542> - -2022-12-07 10:21:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/dvbsubenc/gstdvbsubenc.c: - dvbsubenc: Forward GAP events as-is if we wouldn't produce an end packet and are not in the middle of an existing subtitle - An end packet is only produced once for the last subtitle, so multiple - GAP events between subtitles would result only in a single end packet - and nothing else otherwise. This would potentially starve downstream - then, so instead forward the GAP events in that case. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3536> - -2022-12-05 19:30:43 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/dshowvideosink/dshowvideosink.cpp: - directshow: Fix build error with glib 2.75 and newer - Starting with glib 2.75, `NULL` is `nullptr`, which cannot be - implicitly coerced to `0`, unlike `NULL`. So explicitly pass `0`. - ``` - 3206/4524 Compiling C++ object subprojects/gst-plugins-bad/sys/directshow/gstdirectshow.dll.p/dshowvideosink.cpp.obj - FAILED: subprojects/gst-plugins-bad/sys/directshow/gstdirectshow.dll.p/dshowvideosink.cpp.obj - "cl" "-Isubprojects\gst-plugins-bad\sys\directshow\gstdirectshow.dll.p" "-Isubprojects\gst-plugins-bad\sys\directshow" "-I..\subprojects\gst-plugins-bad\sys\directshow" "-Isubprojects\gst-plugins-bad" "-I..\subprojects\gst-plugins-bad" "-Isubprojects\gst-plugins-base\gst-libs" "-I..\subprojects\gst-plugins-base\gst-libs" "-Isubprojects\gstreamer\libs" "-I..\subprojects\gstreamer\libs" "-Isubprojects\gstreamer" "-I..\subprojects\gstreamer" "-Isubprojects\orc" "-I..\subprojects\orc" "-I..\subprojects\gst-plugins-bad\sys\directshow\strmbase\baseclasses" "-Isubprojects\gst-plugins-base\gst-libs\gst\video" "-Isubprojects\gstreamer\gst" "-Isubprojects\gst-plugins-base\gst-libs\gst\audio" "-Isubprojects\gst-plugins-base\gst-libs\gst\tag" "-IC:/gst-install/include/glib-2.0" "-IC:/gst-install/lib/glib-2.0/include" "-IC:/gst-install/include" "/MD" "/nologo" "/showIncludes" "/utf-8" "/W2" "/EHsc" "/O2" "/Zi" "/wd4018" "/wd4146" "/wd4244" "/wd4305" "/utf-8" "/we4002" "/we4003" "/we4013" "/we4020" "/we4027" "/we4029" "/we4033" "/we4045" "/we4047" "/we4053" "/we4062" "/we4098" "/we4101" "/we4189" "/utf-8" "-D_MBCS" "/wd4189" "/wd4456" "/wd4701" "/wd4703" "/wd4706" "/wd4996" "-DHAVE_CONFIG_H" "/Fdsubprojects\gst-plugins-bad\sys\directshow\gstdirectshow.dll.p\dshowvideosink.cpp.pdb" /Fosubprojects/gst-plugins-bad/sys/directshow/gstdirectshow.dll.p/dshowvideosink.cpp.obj "/c" ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp - ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(62): warning C5051: attribute 'noinline' requires at least '/std:c++20'; ignored - ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(123): error C2664: 'LRESULT SendMessageA(HWND,UINT,WPARAM,LPARAM)': cannot convert argument 3 from 'nullptr' to 'WPARAM' - ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(123): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type - C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\winuser.h(3690): note: see declaration of 'SendMessageA' - ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(635): error C2664: 'BOOL SystemParametersInfoA(UINT,UINT,PVOID,UINT)': cannot convert argument 2 from 'nullptr' to 'UINT' - ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(635): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type - C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\winuser.h(13153): note: see declaration of 'SystemParametersInfoA' - ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(1593): error C2664: 'LRESULT SendMessageA(HWND,UINT,WPARAM,LPARAM)': cannot convert argument 3 from 'nullptr' to 'WPARAM' - ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(1593): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type - C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\winuser.h(3690): note: see declaration of 'SendMessageA' - ``` - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3533> - -2022-11-29 02:22:50 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvideosrc.c: - mfvideosrc: Fix buffer leak - The allocated buffer should be released - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3496> - -2022-11-29 02:10:42 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfsourcereader.cpp: - * sys/mediafoundation/gstwin32devicewatcher.cpp: - mediafoundation: Chain up from GObject::constructed - ... so that GstTracer can trace it - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3496> - -2022-11-29 02:06:11 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - * sys/d3d11/gstd3d11window_corewindow.cpp: - * sys/d3d11/gstd3d11window_dummy.cpp: - * sys/d3d11/gstd3d11window_swapchainpanel.cpp: - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11: Use correct ref/unref methods - Those objects are GstObject subclasses - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3496> - -2022-11-25 18:38:27 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: Fix a typo in pred_weight_table parsing. - When setting default values, the reference list number of l1 is wrong. - Fix: https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/issues/336 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3468> - -2022-11-21 19:40:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/dvbsubenc/gstdvbsubenc-util.c: - * gst/dvbsubenc/gstdvbsubenc.c: - * gst/dvbsubenc/gstdvbsubenc.h: - dvbsubenc: Write Display Definition Segment if a non-default width/height is used - Otherwise it can't be rendered by dvbsuboverlay or ffmpeg at least. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3459> - -2022-11-16 09:42:08 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - Revert "mpegtspacketizer: memcmp potentially seen_before data" - This reverts commit fcad4cc646a23e4e621ec5e8485958ab78d98090. - This was wrong is so many ways. - * The memcmp was badly used (it should use == 0 to check the data is identical, - and not != 0) - * There was no boundary checks on the present stream section_data when passing - it to memcmp. - * The return value should have been TRUE (i.e. we have done all checks, none of - them failed, therefore the section has been seen before) - * stream->section_data would *always* be NULL if the section had already been - processed - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1559 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3427> - -2022-11-16 09:29:59 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegts: Check is program is identical before updating - There is no need to update the program if it's identical :) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3427> - -2022-11-08 19:26:39 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11screencapturedevice.cpp: - * sys/d3d11/gstd3d11screencapturesrc.cpp: - d3d11screencapturesrc: Specify PAR 1/1 to template caps - ... otherwise PAR can be wrongly signalled during the negotiation - Fixing below pipeline when desktop resolution is not 640x480 - gst-launch-1.0.exe \ - d3d11screencapturesrc ! videoscale ! - video/x-raw,width=640,height=480,pixel-aspect-ratio=1/1 ! d3d11videosink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3372> - -2022-11-15 00:11:15 +1100 Jan Schmidt <jan@centricular.com> - - * ext/aes/gstaesdec.c: - aesdec: Fix padding removal for per-buffer-padding=FALSE - When per-buffer-padding is FALSE, the OpenSSL context needs - to be told to remove any padding at the end of the ciphertext - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1243 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3411> - -2021-12-01 16:23:41 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/gstrtmp2src.c: - * gst/rtmp2/rtmp/rtmpclient.c: - rtmp2: Improve error messages - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3368> - -2021-12-01 16:04:24 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/gstrtmp2src.c: - * gst/rtmp2/rtmp/rtmpclient.c: - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2/connection: Pass triggering GError in 'error' signal - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3368> - -2021-12-01 16:02:53 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2/connection: Pass triggering GError to _emit_error - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3368> - -2021-12-01 16:01:10 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2/connection: Discern reasons for cancelling all commands - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3368> - -2021-12-01 15:53:13 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2/connection: Handle EOF like error - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3368> - -2021-12-01 15:49:22 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/rtmp/rtmpclient.c: - rtmp2/client: Make sure 'salt' is not NULL - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3368> - -2021-12-01 15:46:42 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/rtmp/rtmpclient.c: - rtmp2/client: Make sure 'reason' is not NULL - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3368> - -2021-12-01 16:13:42 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/rtmp/rtmpclient.c: - rtmp2/client: Make sure 'desc' is not NULL - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3368> - -2021-12-01 16:11:31 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/rtmp/rtmpclient.c: - rtmp2/client: Make sure 'code' is not NULL - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3368> - -2022-11-06 03:26:31 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11videosink: Always clear back buffer on resize - Swapchain may not need to be resized if the size of backbuffer - is equal to the previous size. Then previously rendered frame will be stay - on the screen. Do clear back buffer whenever resize() is called - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3342> - -2022-07-27 15:59:35 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srt: Remove callers for which srt_bstats fails - This keeps them from accumulating in the element and in the stats while - the sink is not being fed, as long as we at least periodically grab - stats. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3329> - -2022-07-29 11:53:18 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srt: Use simpler list operations for callers - Avoid `g_list_append` and `g_list_remove` (which have to scan the list) - and replace them with `g_list_prepend` and `g_list_delete_link`. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3329> - -2020-11-10 10:06:37 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srt: Clean up poll/sock lifecycle - Make sure `srtobject->poll_id` is never invalid as long as `srtobject` - exists. Only remove our caller socket from it when the socket becomes - invalid. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3329> - -2022-06-08 16:35:54 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srt: Clean up error handling - - Make the srt_epoll_wait loops more uniform. - - Error only via GError when possible; let the element send the error - message. Avoids a second error message. - - Return 0 when cancelled. Avoids an error message from the element. - - Don't send an error message from send_headers when we're a server - sink. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3329> - -2022-10-11 11:14:59 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srt: Simplify socket stats - Don't hide stats depending on whether we're a sending or receiving - socket. While we're here, add some more debug logs. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3329> - -2020-10-05 19:50:13 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - srt: Replace stats accumulation with naive byte counting - srt_bstats cannot be used to get the stats of closed connections, so the - best we can do is keep the running count ourselves. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3329> - -2022-10-25 08:14:18 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstalphacombine.c: - alphacombine: Add missing query handler for gaps - The gap handling was in place, but there was no event handler to trigger it. - Implement the alpha sink event handler for the gaps. This fixes handling of - valid streams which may not refresh the alpha frames for every video frames. - It will also allow a clean error if the stream was missing the initial - alpha frame, at least until we find a better way to handle these - invalid frames. - Related to #1518 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3279> - -2022-10-26 11:47:43 +0200 Ignacio Casal Quinteiro <qignacio@amazon.com> - - * sys/applemedia/avfdeviceprovider.m: - avfdeviceprovider: do not leak the properties - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3278> - -2022-10-21 21:50:01 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/vulkan/cocoa/gstvkcocoa_utils.h: - * gst-libs/gst/vulkan/cocoa/gstvkwindow_cocoa.m: - * gst-libs/gst/vulkan/ios/gstvkios_utils.h: - * gst-libs/gst/vulkan/ios/gstvkwindow_ios.m: - gl/vulkan: Fix static linking on macOS - duplicate symbol '__invoke_on_main' in: - /Library/Frameworks/GStreamer.framework/Versions/1.0/lib/libgstvulkan-1.0.a(cocoa_gstvkwindow_cocoa.m.o) - /Library/Frameworks/GStreamer.framework/Versions/1.0/lib/libgstgl-1.0.a(cocoa_gstglwindow_cocoa.m.o) - ld: 1 duplicate symbol for architecture x86_64 - clang: error: linker command failed with exit code 1 (use -v to see invocation) - Also make the same change in iOS for consistency. - Continuation of https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1132 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3263> - -2022-10-21 10:50:36 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: also add rtcp-fb ccm fir for video mlines by default - In addition to the 'nack pli' already added. Both are supported by - rtpbin/rtpsession by default already. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3247> - -2022-10-14 18:51:43 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcice.c: - webrtc/nice: fix small leak of split strings - g_strfreev previously stopped at our manual NULL-termination. Fix by - restoring the pointer after joining. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3190> - -2022-10-14 16:21:07 -0400 Arun Raghavan <arun@asymptotic.io> - - * gst/rtmp2/gstrtmp2sink.c: - rtmp2sink: Correctly return GST_FLOW_ERROR on error - If there is an error while connecting, the streaming task will be stopped, and - is_running() will be false, causing a GST_FLOW_FLUSHING to be returned. Instead, - we perform the error check (!self->connection) first, to return an error if - that's what occured. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3192> - -2022-10-07 08:30:05 +0200 Wojciech Kapsa <wojciech.kapsa@medvc.eu> - - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink: reset calculation of gst_decklink_video_src_update_time_mapping on no_signal. When the HDMI cable was disconnected for a long time, the calculation took too much time. SDI cable works fine. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3168> - -2022-10-12 18:40:25 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - Back to development - -=== release 1.20.4 === - -2022-10-12 16:39:47 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * gst-plugins-bad.doap: - * meson.build: - Release 1.20.4 - -2022-10-12 16:39:40 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - Update ChangeLogs for 1.20.4 - -2022-08-08 23:37:11 +0900 Seungha Yang <seungha@centricular.com> - - * gst/mxf/mxfaes-bwf.c: - mxfdemux: Always calculate BlockAlign of raw audio - Workaround for nBlockAlign and nBitsPerSample mismatch. Always - use the formula described in the specification for BlockAlign value - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3149> - -2022-09-14 00:58:37 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Fix for HEVC decoding when coded resolution is larger than display resolution - As documented in the SDK header, we should set coded width/height - values to the corresponding decoder configuration option, - instead of display resolution - Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1438 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3143> - -2022-09-22 22:39:31 +0900 Sangchul Lee <sc11.lee@samsung.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Fix pointer dereference before null check - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3133> - -2022-10-05 15:59:03 +0900 Sangchul Lee <sc11.lee@samsung.com> - - * ext/webrtc/gstwebrtcice.c: - webrtc/nice: Make sure to return NULL when validating turn server fails - It affects 'add-turn-server' signal action and 'turn-server' property - of webrtcbin. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3124> - -2022-09-20 23:31:45 +0300 Mart Raudsepp <mart@leio.tech> - - * gst/mpegtsdemux/mpegtsbase.c: - tsdemux: Don't trigger a program change when falling back to ignore-pcr behaviour - Since commit a79a756b79aa1675e we could change to ignore-pcr automatically at 500ms - into a live stream when no PCR is seen by then. However the stream counting in - program change detection was wrongly considering ignore-pcr programs to have a - separate PCR PID, even though we are actually ignoring the PCR PID completely, - resulting in an erroneous program switch getting triggered from the different - stream count. This in turn would send an EOS and switch out the pads for what - actually is still the same program, while we intended to simply apply a - workaround for broken encoders. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3089> - -2022-03-25 14:25:02 +1100 Andrew Pritchard <andrew@vivi.io> - - * sys/androidmedia/jni/gstamcsurfacetexture-jni.c: - Fix GstAmcSurfaceTexture segfault Check that `self` and `self->callback` are defined. `self` can be set to `NULL` in `remove_listener`, and `self->callback` can be set to `NULL` inside `gst_amc_surface_texture_jni_set_on_frame_available_callback`. This can cause a segfault since the Java object can outlive the C object, and call the callback after `remove_listener` is called. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3056> - -2022-08-25 14:24:25 +0200 Piotr Brzeziński <piotr@centricular.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: Fix wrong default framerate value - Current default G_MAXINT is not a correct value under any circumstances. - This creates an issue with screen capture, during which we currently do - not get any framerate info causing G_MAXINT to show up, where elements - downstream can possibly misbehave - for example, `vtenc` causes - a kernel panic. - Replace with 30/1 to avoid such scenarios. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2946> - -2022-08-20 16:15:15 +0100 Philippe Normand <philn@igalia.com> - - * ext/openh264/gstopenh264dec.cpp: - * ext/openh264/gstopenh264enc.cpp: - openh264: Register debug categories earlier - Otherwise the GST_ERROR message logged in case of ABI mismatch would be done on - an uninitialized category. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2924> - -2022-08-20 16:57:27 +0100 Philippe Normand <philn@igalia.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Fix constrained-high encoding - constrained-high is high without B-frames, there is no EProfileIdc for this, so - assume high instead of hitting an assert down the line. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2921> - -2022-08-14 22:31:29 -0400 Daniel Morin <daniel.morin@collabora.com> - - * gst-libs/gst/play/gstplay-media-info.h: - * gst-libs/gst/play/gstplay-signal-adapter.h: - * gst-libs/gst/play/gstplay-video-overlay-video-renderer.h: - * gst-libs/gst/play/gstplay-video-renderer.h: - * gst-libs/gst/play/gstplay-visualization.h: - gst-play: missing cleanup for g_autoptr - Without this change cleanup function for g_autoptr is not defined for - GstPlayMediaInfo, GstPlaySignalAdapter, GstPlayVideoRenderer, - GstPlayVideoOverlayVideoRenderer and GstPlayVisualization. Cleanup - function was defined in gstplay.h, but missing in other header files. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2904> - -2022-08-13 12:24:37 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer-media-info.c: - player: Don't leak wrapped video info - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1373 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2881> - -2022-08-13 11:50:20 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/play/gstplay.c: - play: Make ownership of video-sink clearer in combination with floating references - And correctly handle the case of VideoRenderer::create_video_sink() not - actually returning a floating reference, which might be tricky for some - bindings. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2881> - -2022-08-13 11:49:08 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/play/gstplay.c: - play: Fix object construction - Ideally new() functions should simply call g_object_new() and not much - else, so let's do that here and handle all the construction properly in - a GObject way. - Now a play object created via g_object_new() is actually usable. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2881> - -2022-08-13 11:39:59 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Fix object construction - Ideally new() functions should simply call g_object_new() and not much - else, so let's do that here and handle all the construction properly in - a GObject way. - Now a player object created via g_object_new() is actually usable. - In addition, also fix the video-renderer property so that reading it - returns an object of the correct type. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2881> - -2022-08-13 11:30:35 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Release signal adapter on finalize - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2881> - -2022-08-12 18:24:41 +0300 Matthias Clasen <mclasen@redhat.com> - - * gst-libs/gst/player/gstplayer.c: - gstplayer: Plug a memory leak - This was showing up as a memory leak in GTK's - gstreamer media backend: - 40 bytes in 1 blocks are definitely lost in loss record 18,487 of 40,868 - at 0x484586F: malloc (vg_replace_malloc.c:381) - by 0x50D5278: g_malloc (gmem.c:125) - by 0x50EDBA5: g_slice_alloc (gslice.c:1072) - by 0x50EFBCC: g_slice_alloc0 (gslice.c:1098) - by 0x51F2F45: g_type_create_instance (gtype.c:1911) - by 0x51DAE37: g_object_new_internal (gobject.c:2011) - by 0x51DC080: g_object_new_with_properties (gobject.c:2181) - by 0x51DCB20: g_object_new (gobject.c:1821) - by 0x9855F86: UnknownInlinedFun (gstplayer-wrapped-video-renderer.c:109) - by 0x9855F86: gst_player_new (gstplayer.c:579) - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1374 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2876> - -2022-07-30 02:29:49 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/sctp/usrsctp/meson.build: - meson: Don't pass -Werror to vendored code - Do it the correct way with libusrsctp -- override the option so that - it's done in a compiler-agnostic and future-proof way. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2818> - -2022-05-25 18:40:30 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/rtmp2/gstrtmp2locationhandler.c: - * gst/rtmp2/rtmp/rtmpclient.c: - rtsp+rtmp: Forward warning added to tls-validation-flags to our users - With the 2.72 release, glib-networking developers have decided that - TLS certificate validation cannot be implemented correctly by them, so - they've deprecated it. - In a nutshell: a cert can have several validation errors, but there - are no guarantees that the TLS backend will return all those errors, - and things are made even more complicated by the fact that the list of - errors might refer to certs that are added for backwards-compat and - won't actually be used by the TLS library. - Our best option is to ignore the deprecation and pass the warning onto - users so they can make an appropriate security decision regarding - this. - We can't deprecate the tls-validation-flags property because it is - very useful when connecting to RTSP cameras that will never get - updates to fix certificate errors. - Relevant upstream merge requests / issues: - https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2214 - https://gitlab.gnome.org/GNOME/glib-networking/-/issues/179 - https://gitlab.gnome.org/GNOME/glib-networking/-/merge_requests/193 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2818> - -2022-05-25 16:03:22 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/dtls/gstdtlscertificate.c: - dtls: Disable OpenSSL 3.0 deprecation warnings for now - Fedora 36 ships with OpenSSL 3.0, which deprecates all low-level APIs, - so this code needs to be rewritten. There is no easy fix in the - porting guide, and it recommends disabling the warnings if you can't - use the high-level API. - https://wiki.openssl.org/index.php/OpenSSL_3.0#Upgrading_to_OpenSSL_3.0_from_OpenSSL_1.1.1 - Here's the replacement API: - https://www.openssl.org/docs/man3.0/man7/migration_guide.html#Deprecated-low-level-object-creation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2818> - -2022-07-29 02:36:40 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2ringbuffer.cpp: - wasapi2: Fix initial mute/volume setting - Fix up volume/mute change flag setting - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2817> - -2022-07-21 16:11:03 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Actually store number of samples to drop in gapless mode - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2783> - -2022-07-21 16:10:18 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Use input running time for comparison instead of the currently tracked running time - Otherwise gapless mode would do completely wrong calculations on - discontinuities and cause input/output to drift slowly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2783> - -2022-07-21 13:38:22 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Combine two if expressions to reduce indentation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2783> - -2022-07-06 16:14:13 +0300 Jordan Petridis <jordan@centricular.com> - - * ext/openmpt/gstopenmptdec.c: - openmpt: update from now deprecated api - https://lib.openmpt.org/doc/classopenmpt_1_1module.html#ab2695af0baa274054f5687741fa7c05b - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2779> - -2022-06-30 11:04:29 +0200 Ignazio Pillai <ignazp@amazon.com> - - * sys/wasapi/gstwasapiutil.c: - wasapi: Implement default audio channel mask - Some multichannel capture devices does not provide a channel mask value - which will result in a pipeline failure due to the empty channel mask. - Implemented the same fix used for wasapi2 - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1204 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2714> - -2022-07-07 02:17:56 +0900 Seungha Yang <seungha@centricular.com> - - * gst/proxy/gstproxysink.c: - proxysink: Fix GstProxySrc leak - Clear weak pointer to peer src when disposing. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2774> - -2022-07-06 03:14:25 +0900 Seungha Yang <seungha@centricular.com> - - * gst/proxy/gstproxysink.c: - * gst/proxy/gstproxysink.h: - * tests/check/elements/proxysink.c: - * tests/check/meson.build: - proxysink: Make sure stream-start and caps events are forwarded - There might be a sequence of event and buffer flow: - - Got stream-start/caps/segment events - - Got flush events - - And then buffers with a new segment event - In the above case, stream-start and caps event might not be reached to - peer proxysrc if peer proxysrc is not ready to receive them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2774> - -2022-06-30 09:09:02 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Reject caps that are not valid for creating an SDP media. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2705> - -2022-06-29 10:55:13 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - coding style: allow declarations after statement - See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1243/ - and https://gitlab.freedesktop.org/gstreamer/gstreamer-project/-/issues/78 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2702> - -2022-06-28 17:40:56 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - d3d11videosink: Fix for force-aspect-ratio setting when rendering on shared texture - Set specified force-aspect-ratio value on window object - in case of shared texture rendering as well - Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1304 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2701> - -2022-06-25 19:50:10 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/meson.build: - tests: skip unit tests for dependency-less elements that have been disabled - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1136 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2672> - -2022-06-28 01:29:06 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/opus/gstopusheader.h: - dv, opusparse: fix duplicate symbols in static build - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1262 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2673> - -2022-06-23 14:31:10 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: Use always lseek to get dmabuf size. - Gallium drivers historically have reported strange dmabuf sizes, from always - zero to the whole frame (multiple fds). The simplest solution is to use lseek - SEEK_END to get the prime descriptor size. - Also the allocator raises a warning if both values differ in order to report - it to driver. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2657> - -2022-06-08 09:02:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/va/gstvaallocator.c: - va: allocator: Fix translation of VADRMPRIMESurfaceDescriptor - VADRMPRIMESurfaceDescriptor structure describes the offsets from the - point of view of the specific handle (DMABuf). While GstVideoInfo - (and the meta) describes offsets from the point of the view of the - GstBuffer, an aggregate of all the GstMemory (1 per handle). - This changes combined with Mesa Fix(https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16813) - fixes decoding failure with AMD driver. - Fixes #1223 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2657> - -2022-03-24 21:39:30 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah265dec.c: - va: h265dec: Fix a crash because of missing reference frame. - Some problematic H265 stream may miss the reference frame in the DPB, - and get some message like: "No short term reference picture for xxx". - So there may be empty entries in ref_pic_list0/1 when passing to - decode_slice() function of sub class. We need to check the NULL pointer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2647> - -2022-06-18 04:05:53 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.h: - d3d11decoder: Check 16K resolution support - 16K decoding is supported by some GPUs - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2633> - -2022-06-15 15:06:20 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Limit sink query to sink pads - This allows the reception of streams that don't exactly match - the codec preferences. In particular, the ssrc in the codec preferences - is local sender SSRC, the other side is expected to send a different SSRC. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2632> - -2022-06-16 00:59:00 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - Back to development - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2619> - -=== release 1.20.3 === - -2022-06-15 23:36:18 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * gst-plugins-bad.doap: - * meson.build: - Release 1.20.3 - -2022-06-15 23:36:10 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - Update ChangeLogs for 1.20.3 - -2022-06-09 23:19:24 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - d3d11decoder: Fix for alternate interlacing signalling - Don't set d3d11+interlace caps feature. None of d3d11 elements - support it - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2584> - -2022-05-27 05:15:13 +1000 Jan Schmidt <jan@centricular.com> - - * sys/androidmedia/gstamc-constants.h: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcvideoenc.c: - * sys/androidmedia/gstamcvideoenc.h: - amc: Add H.265 encoder mapping. - Add mime type mapping to enable the use of Android H.265 encoders - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2572> - -2022-05-30 16:31:38 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * tests/check/elements/webrtcbin.c: - webrtcbin: Reject answers that don't contain the same number of m-line as offer - Otherwise, it segfaults later. Also add test to validate this. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2561> - -2022-06-04 17:23:00 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/rtmp/rtmpmessage.c: - rtmp2: Fix allocation of GstRtmpMeta - Use the right size. - On 64-bit platforms, `GstMetaInfo` is larger than `GstRtmpMeta`, which - masked this bug. On 32-bit platforms, it causes crashes. Thanks to - @maxatka for discovering this. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1721 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2564> - -2022-06-06 00:30:15 +0200 Jan Alexander Steffens (heftig) <heftig@archlinux.org> - - * ext/opencv/gstcvtracker.cpp: - * ext/opencv/gstcvtracker.h: - * ext/opencv/meson.build: - opencv: Allow building against 4.6.x - Replace the broken version checks with one modeled after - `GLIB_CHECK_VERSION`. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2558> - -2022-05-27 21:13:43 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11memory.cpp: - * gst-libs/gst/d3d11/gstd3d11memory.h: - * sys/d3d11/gstd3d11decoder.cpp: - d3d11decoder: Work around Intel DXVA driver crash - Intel DXVA driver crashes sometimes (from GPU thread) if - ID3D11VideoDecoder is released while there are outstanding view objects. - To make sure the object life cycle, holds an ID3D11VideoDecoder refcount - in GstD3D11Memory object. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2513> - -2022-05-24 11:06:39 +0200 Erwann Gouesbet <erwann.gouesbet@blacknut.com> - - * sys/d3d11/gstd3d11screencapture.cpp: - d3d11screencapture: Fix missing/outdated cursor shape - d3d11screencapture can miss a cursor shape to draw or draw an outdated cursor shape. - - AcquireNextFrame only provides cursor shape when there is one update - - current d3d11screencapture skips cursor shape when mouse is not drawn - So, if a gstreamer application uses d3d11screencapture with cursor initially not drawn - "show-cursor"=false and then switches this property to true, the cursor will not be - actually drawn until AcquireNextFrame provides a new cursor shape. - This commit makes d3d11screencapture always update the cursor shape information, even - if the mouse is not drawn. d3d11screencapture will always have the latest cursor shape - when requested to draw it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2488> - -2022-05-18 16:54:53 +0100 Philippe Normand <philn@igalia.com> - - * ext/webrtc/webrtcdatachannel.c: - datachannel: Notify low buffered amount according to spec - Quoting - https://www.w3.org/TR/webrtc/#dom-rtcdatachannel-bufferedamountlowthreshold - The bufferedAmountLowThreshold attribute sets the threshold at which the - bufferedAmount is considered to be low. When the bufferedAmount decreases from - above this threshold to **equal** or below it, the bufferedamountlow event fires. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2452> - -2022-05-17 14:15:40 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - tsmux: Make sure to set srcpad caps under all conditions before outputting the first buffer - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1218 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2446> - -2022-05-17 14:02:28 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: Release request pads from rtpbin when freeing a stream - Otherwise the pads of the rtpbin stay around forever and are leaked. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2445> - -2022-05-06 18:21:00 -0400 Olivier Crête <olivier.crete@ocrete.ca> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: Set timestamp in DTS, not PTS - This matches the behaviour of basesrc, in particular, it matches the - behaviour of udpsrc, so it's easier to use to as a replacement to test - rtpjitterbuffer and other similar elements. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2424> - -2022-04-28 16:02:26 +0100 Diogo Goncalves <diogo@diporg.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: fix wrong framerate selected for caps - This fix solves an issue where a format that doesn't support the - requested framerate would be selected. It ensures that we use the first - format and framerate pair that supports the requested caps. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2418> - -2022-05-12 07:23:29 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Handle files produced by legacy FFmpeg - Until March 2022, the FFmpeg MXF muxer would write the various index table - segments with the same instance ID, which should only be used if it is a - duplicate/repeated table. - In order to cope with those, we first compare the other index table segment - properties (body/index SID, start position) before comparing the instance - ID. This will ensure that we don't consider them as duplicate, but can still - detect "real" duplicates (which would have the same other properties). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2408> - -2022-05-06 17:53:51 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/va/gstvadisplay_drm.c: - libs: va: Add O_CLOEXEC flag at opening drm device. - So any other potential subprocess won't have access to it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2391> - -2022-05-05 20:35:57 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Disable aggregator's default negotiation - mxfmux can't negotiate caps with upstream/downstream and always outputs - specific caps based on the input streams. This will always happen before - it produces the first buffers. - By having the default aggregator negotiation enabled the same caps - would be pushed twice in the beginning, and again every time a - reconfigure event is received. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2381> - -2022-05-05 20:35:49 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - mpegtsmux: Disable aggregator's default negotiation - mpegtsmux can't negotiate caps with upstream/downstream and always outputs - specific caps based on the input streams. This will always happen before - it produces the first buffers. - By having the default aggregator negotiation enabled the same caps - would be pushed twice in the beginning, and again every time a - reconfigure event is received. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2381> - -2022-05-05 00:24:26 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - h264decoder: Fix for unhandled low-delay decoding case - Baseclass calls get_preferred_output_delay() in a chain of - sequence header parsing and then new_sequence() is called - with required DPB size (includes render-delay) information. - Thus latency query should happen before the sequence header - parsing for subclass to report required render-delay accordingly - via get_preferred_output_delay() method. - (e.g., zero delay in case of live pipeline) - This commit is to fix wrong liveness signalling in case of - upstream packetized format. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2380> - -2022-05-04 23:36:30 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh264dec.c: - * sys/nvcodec/gstnvh265dec.c: - nvh264dec,nvh265dec: Don't realloc bitstream buffer per slice - Allocated memory size has not been updated which results in - realloc per slice. Fixing it and also release bitstream buffer - on ::close(), not finalize. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2379> - -2022-05-05 02:16:54 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11screencapture.cpp: - * sys/d3d11/gstd3d11screencapture.h: - * sys/d3d11/gstd3d11screencapturesrc.cpp: - * tests/examples/d3d11/d3d11screencapturesrc.cpp: - d3d11screencapturesrc: Fix crash when d3d11 device is different from owned one - GstD3D11ScreenCapture object is pipeline-independent global object - and the object can be shared by multiple src elements, - in order to overcome a limitation of DXGI Desktop Duplication API. - Note that the API allows only single capture session in a process for - a monitor. - Therefore GstD3D11ScreenCapture object must be able to handle a case - where a src element holds different GstD3D11Device object. Which can - happen when GstD3D11Device context is not shared by pipelines. - What's changed: - * Allocates capture texture with D3D11_RESOURCE_MISC_SHARED for the - texture to be able to copied into other device's texture - * Holds additional shader objects per src element and use it when drawing - mouse - Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1197 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2378> - -2022-04-17 23:55:55 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - d3d11decoder: Do not preallocate texture using downstream d3d11 buffer pool - Our decoder implementation does not use downstream d3d11 pool for - decoding because of special requirement of D3D11/DXVA. So preallocation - using the downstream buffer pool will waste GPU memory in most cases. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2377> - -2022-04-16 21:27:57 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - d3d11decoder: Copy HDR10 related caps field manually - If negotiate() is called from the set_format() chain, sinkpad may not - hold caps yet, so baseclass cannot copy it over to srcpad caps. - Copy them manually. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2376> - -2022-04-29 20:28:53 +0200 Jakub Adam <jakub.adam@collabora.com> - - * sys/d3d11/gstd3d11screencapture.cpp: - d3d11screencapture: Set viewport when drawing mouse cursor - If there weren't any moved/dirty regions in the captured frame, the - viewport of the ID3D11DeviceContext would be left at whatever previous - value it had, which could lead to the cursor being drawn in a wrong - position and/or in an incorrect size. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2371> - -2022-04-22 12:29:29 +0200 Corentin Damman <c.damman@intopix.com> - - * sys/nvcodec/cuda-converter.c: - cuda-converter: fix nvrtc compilation on non-English locale systems - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2367> - -2022-03-07 08:46:57 -0500 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/vulkan/meson.build: - * sys/msdk/meson.build: - Meson: Fix deprecation warnings - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2358> - -2021-11-12 20:13:10 +0100 Ruben Gonzalez <rgonzalez@fluendo.com> - - * docs/plugins/gst_plugins_cache.json: - gst_plugin_load_file: force plugin reload if diff filename - If a file includes a new version of a plugin that exits in the - registry, the output of gst-inspect is incorrect. The output has the - correct version but incorrect filename, and element description. - This seems to have also fixed some documentation issues. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2357> - -2022-05-03 00:39:09 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - Back to development - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2347> - -=== release 1.20.2 === - -2022-05-02 23:29:25 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * gst-plugins-bad.doap: - * meson.build: - Release 1.20.2 - -2022-05-02 23:29:19 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - Update ChangeLogs for 1.20.2 - -2022-04-23 04:00:21 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11videosink: Fix for unhandled mouse double click events - Only window created with CS_DBLCLKS style can receive those mouse - double click events, so we need to use the style for internal/external - windows can get double click events. - Also, passthrough mouse events to parent window in the same message pumping - threads instead of manually forwarding each mouse event. - Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1172 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2286> - -2022-04-08 04:24:36 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11window: Use ANSI version WIN32 API explicitly - We were using ANSI version APIs implicitly because UNICODE is not - defined by ourselves. But potentially it can be broken if user - defines UNICODE. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2286> - -2022-04-29 19:08:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/interlace/gstinterlace.c: - interlace: Also handle a missing "interlace-mode" field as progressive - Otherwise caps negotiation will fail in situations that are supposed - to work, like: - "video/x-raw,framerate=(fraction)60/1" ! interlace field-pattern=0 ! "video/x-raw,framerate=(fraction)30/1" - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2337> - -2022-04-29 19:08:32 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/interlace/gstinterlace.c: - interlace: Add some more debug output to the getcaps function - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2337> - -2022-04-27 15:24:50 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegts: Handle "empty" PMT gracefully - Some streams have 2 PMT sections in a single TS packet. The first one is "valid" - but doesn't contain/define any streams. That causes an unrecoverable issue when - we try to activate the 2nd (valid) PMT. - Instead of doing that, pre-emptively refuse to process PMT without any streams - present within. We still do post that section on the bus to inform applications. - Fixes #1181 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2327> - -2022-04-28 00:31:49 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvvp9dec.c: - nvvp9sldec: Increase DPB size to cover render delay - This should've included in the previous MR - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/987 - already, but missed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2324> - -2022-04-24 00:02:18 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvabasedec.c: - va: dec: Use gst_buffer_pool_config_set_va_alignment() to set alignment. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2301> - -2022-04-23 23:59:08 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvapool.h: - va: pool: Replace all tabs with spaces in header file. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2301> - -2022-04-23 23:52:34 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvapool.c: - va: pool: Delete the GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT. - The va pool is used for GPU side surface/image, its alignment should - not be changed arbitrarily by others. So we decide not to expose the - GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT flag anymore. - Instead, user can call gst_buffer_pool_config_set_va_alignment() to - set its surface/image alignment. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2301> - -2022-04-23 23:40:14 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvapool.c: - * sys/va/gstvapool.h: - va: pool: Add set_va_alignment() API. - We want to use gst_buffer_pool_config_set_va_alignment() to replace - gst_buffer_pool_config_get_video_alignment(). The later one is specific - for GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT option. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2301> - -2022-04-26 01:16:06 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: Fix a latent memory leak in colorimetry setting. - Also delete the useless "have_cinfo" judgement. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2297> - -2022-04-24 22:54:58 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: Correct the meaning of color_range flag. - According to spec: - color range equal to 0 shall be referred to as the studio swing - representation and color range equal to 1 shall be referred to as - the full swing representation. - The current status is just the opposite. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2297> - -2022-04-22 17:44:06 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/rsvg/gstrsvgdec.h: - rvsg: fix cairo include - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2280> - -2022-04-21 00:38:37 +0900 Sangchul Lee <sc11.lee@samsung.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Avoid access of freed memory - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2258> - -2022-04-20 08:09:58 +0900 Wonchul Lee <wonchul.dev@gmail.com> - - * ext/dash/gstdashsink.c: - dashsink: Unlock when failed to get content - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2246> - -2022-04-18 17:50:22 +0900 Camilo Celis Guzman <camilo@pexip.com> - - * gst/videoparsers/gstav1parse.c: - gstav1parse: fixup various possible logical errors - Found via an analyzed build for Clang. Specifically we had: - gstav1parse.c1850,11 in gst_av1_parse_detect_stream_format: Logic error: The left operand of '==' is a garbage value - gstav1parse.c1606,11 in gst_av1_parse_handle_to_small_and_equal_align: Logic error: The left operand of '==' is a garbage value - Also a couple of false-positives: - gstav1parse.c1398,24 in gst_av1_parse_handle_one_obu: Logic error: Branch condition evaluates to a garbage value - gstav1parse.c1440,37 in gst_av1_parse_handle_one_obu: Logic error: The left operand of '-' is a garbage value - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2240> - -2022-04-12 01:01:23 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/meson.build: - win32: Enable high-resolution timer for MinGW build - timeapi.h is missing in our MinGW toolchain. Include mmsystem.h - header instead, which defines struct and APIs in case of our MinGW - toolchain. Note that in case of native Windows10 SDK (MSVC build), - mmsystem.h will include timeapi.h - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2167> - -2022-04-14 08:23:51 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Fix AC-4 detection - This regression was introduced by - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1102 - and has been present since 1.18 - * Stream Type 0x06 is defined in the base mpeg-ts specification as Private PES - Packets. Determining the content should be solely based on descriptors found - within the PMT. - * This was abused in that commit by defining a "bluray-only" stream type for AC4 - : `ST_BD_AUDIO_AC4` - * This should be entirely handled in the regular private pes handling further - down in the code - Fixes #1154 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2176> - -2022-04-11 10:32:40 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Fix issue with re-syncing - In case of re-syncing (i.e. moving to another partition to avoid too much of an - interleave), there was previously no checks to figure out whether a given - partition was already fully handled (i.e. when coming across it again after a - previous resync). - In order to handle this at least for single-track partitions, check whether we - have reached the essence track duration, and if so skip the partition. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2162> - -2022-04-11 10:31:15 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Don't double-increase track position - The essence track position should only be overriden if we sucesfully switched to - another position. In case of EOS we do not want to override it else we would - increase the track position *again* at the end of this function - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2162> - -2022-04-06 11:21:25 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfvanc.c: - mxfvanc: Handle empty VANC packets - Some XDCAM recorders store empty packets for VANC, and don't even include the - 2byte length. - Handle them in the same way as VANC packets with 0 packets. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2124> - -2022-04-01 15:00:01 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - bad: examples: fix unused res warning - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2116> - -2022-04-01 15:35:17 +0800 Tong Wu <tong1.wu@intel.com> - - * sys/msdk/msdk.c: - msdk: use mfxU32 instead of uint32_t - Msdk should use mfx variables defined in mfxdefs.h. Replace uint32_t - with mfxU32. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2113> - -2022-03-24 15:19:27 +0800 Chun-wei Fan <fanchunwei@src.gnome.org> - - * ext/openexr/meson.build: - openexr: Specify modules when finding OpenEXR. - Specify modules to look for OpenEXR when CMake is used, as we may have - CMake config files instead of pkg-config files that result from building - OpenEXR, which may be built with CMake which is typically the case on Visual - Studio builds. - In this case, Meson does seem to find the 'OpenEXR' package with CMake - after trying pkg-config, but does not consider it enough without the - 'modules:' argument. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2035> - -2022-03-28 20:51:35 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/videotexturecache.m: - applemeida/texturecache: remove unused variable - Fixes: - ../sys/applemedia/videotexturecache.m:71:20: error: variable 'features' set but not used -Werror,-Wunused-but-set-variable - GstCapsFeatures *features; - ^ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2068> - -2022-03-28 20:50:27 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/corevideobuffer.c: - applemedia/corevideobuffer: remove unused variable - Fixes: - ../sys/applemedia/corevideobuffer.c:209:19: error: variable 'video_meta' set but not used -Werror,-Wunused-but-set-variable - GstVideoMeta *video_meta; - ^ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2068> - -2022-03-28 20:49:01 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/iosurfaceglmemory.c: - applemedia/iosgl: remove unused variable - Fixes: - ../sys/applemedia/iosurfaceglmemory.c:219:41: error: variable 'texfmt' set but not used -Werror,-Wunused-but-set-variable - GLuint tex_id, tex_target, texifmt, texfmt; - ^ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2068> - -2022-03-28 20:37:54 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: remove unused variable - Fixes: - ../sys/applemedia/vtdec.c:611:35: error: variable 'output_flags' set but not used -Werror,-Wunused-but-set-variable - VTDecodeFrameFlags input_flags, output_flags; - ^ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2068> - -2022-03-28 20:24:59 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/avsamplevideosink.m: - avsamplevideosink: remove unused variable - Fixes - ../sys/applemedia/avsamplevideosink.m:80:20: error: variable 'gstelement_class' set but not used -Werror,-Wunused-but-set-variable - GstElementClass *gstelement_class; - ^ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2068> - -2022-03-28 20:11:29 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/avfassetsrc.m: - avfassetsrc: fix unused-but-set warning - ../sys/applemedia/avfassetsrc.m:1014:12: error: variable 'caps' set but not used -Werror,-Wunused-but-set-variable - GstCaps *caps; - ^ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2068> - -2022-03-28 19:42:04 +1100 Matthew Waters <matthew@centricular.com> - - * gst/speed/gstspeed.c: - speed: fix unused-but-set warning - ../gst/speed/gstspeed.c:523:39: error: variable 'base' set but not used -Werror,-Wunused-but-set-variable - gint64 start_value, stop_value, base; - ^ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2068> - -2022-03-28 18:38:23 +1100 Matthew Waters <matthew@centricular.com> - - * ext/resindvd/gstpesfilter.c: - resindvd: silence unused-but-set warning - ../ext/resindvd/gstpesfilter.c:117:11: error: variable 'STD_buffer_size_bound' set but not used -Werror,-Wunused-but-set-variable - guint16 STD_buffer_size_bound; - ^ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2068> - -2022-03-28 18:23:20 +1100 Matthew Waters <matthew@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - mpegts: don't shadow res variable - Fixes unused-but-set warning: - ../gst/mpegtsmux/gstbasetsmux.c:2115:43: error: variable 'res' set but not used -Werror,-Wunused-but-set-variable - gboolean all_headers, done = FALSE, res = FALSE; - ^ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2068> - -2022-03-28 18:12:43 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - mpeg: fix unused-but-set warning - ../gst-libs/gst/mpegts/gst-dvb-section.c:206:9: error: variable 'i' set but not used -Werror,-Wunused-but-set-variable - guint i = 0, allocated_events = 12; - ^ - ../gst-libs/gst/mpegts/gst-dvb-section.c:365:9: error: variable 'i' set but not used -Werror,-Wunused-but-set-variable - guint i = 0, allocated_streams = 12; - ^ - ../gst-libs/gst/mpegts/gst-dvb-section.c:543:9: error: variable 'i' set but not used -Werror,-Wunused-but-set-variable - guint i = 0, allocated_streams = 12; - ^ - ../gst-libs/gst/mpegts/gst-dvb-section.c:885:9: error: variable 'i' set but not used -Werror,-Wunused-but-set-variable - guint i = 0, allocated_services = 8; - ^ - ../gst-libs/gst/mpegts/gst-dvb-section.c:1316:9: error: variable 'i' set but not used -Werror,-Wunused-but-set-variable - guint i = 0, allocated_services = 8; - ^ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2068> - -2022-03-28 15:56:22 +1100 Matthew Waters <matthew@centricular.com> - - * gst/mpegdemux/gstpesfilter.c: - mpegdemux: silence unused-but-set werror - ../gst/mpegdemux/gstpesfilter.c:117:11: error: variable 'STD_buffer_size_bound' set but not used -Werror,-Wunused-but-set-variable - guint16 STD_buffer_size_bound; - ^ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2067> - -2022-03-22 00:30:28 +0900 Sangchul Lee <sc11.lee@samsung.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Update documentation of 'get-stats' action signal - Some stats fields are updated according to the current implementation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2034> - -2022-03-21 13:01:03 +0100 Benjamin Gaignard <benjamin.gaignard@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2codecs: Fix memory leak - Free pending_requests array when releasing decoder to avoid memory leak - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2002> - -2022-03-15 17:01:59 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Warn when offer didn't intersect with transceiver caps - We were silently falling back to creating a recvonly offer if the caps - didn't intersect. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1995> - -2022-03-11 17:02:55 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpe: Reintroduce persistent WebContext - A WebContext leak was introduced in MR - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2252. - If we wanted one WebContext per WebView we should also unref the - WebKitWebContext when destroying the WebView. - This patch reintroduces the persistent WebContext, initially part of - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1484. - Fixes #1084 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1982> - -2022-03-10 19:22:52 +0900 Sangchul Lee <sc11.lee@samsung.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Check data channel transport for notifying 'ice-gathering-state' - Previously, it did not care about data channel's. It is fixed by adding - some conditions. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1981> - -2022-03-10 02:28:11 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - nvh264dec,nvh265dec: Fix broken key-unit trick and reverse playback - On GstVideoDecoder::{drain,flush}, we send null packet with - CUVID_PKT_ENDOFSTREAM flag to drain out decoder. Which will - reset CUVID parser as well. - To continue decoding after the drain, the next input buffer - should include sequence headers otherwise CUVID parser will - not report any decodeable frame. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1923> - -2022-03-14 14:48:01 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - Back to development - -=== release 1.20.1 === - -2022-03-14 11:33:33 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * gst-plugins-bad.doap: - * meson.build: - Release 1.20.1 - -2022-03-14 11:33:25 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - Update ChangeLogs for 1.20.1 - -2022-03-04 10:02:56 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gstvp9parse.c: - vp9parse: Fix auto-plugging of HW frame decoder - Decoders that required frame aligmment and didn't have an associated - alpha decoder were skipped. This is because the parser was constructing - caps based on the software alpha decoder, which specify super-frame - alignment. - Iterate over the caps to filter the one that have a matching codec-alpha, with - the semantic the no codec-alpha field means codec-alpha=false. Then if - everything was removed, callback to the original, so that the first non-alpha - decoder will be picked. - Fixes #820 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1949> - -2022-01-14 23:42:27 -0600 Tim Mooney <Tim.Mooney@ndsu.edu> - - * sys/v4l2codecs/linux/types-compat.h: - v4l2: include <sys/ioccom.h> on Illumos - Needed for _IOR/_IORW - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1947> - -2022-03-13 00:17:48 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvbaseenc.c: - nvenc: Fix deadlock because of too strict buffer pool size - The pool size might need to be larger than encoding surface pool size. - Also, because we always copy input frame into internal CUDA memory, - there's no reason to restrict max size of buffer pool. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1942> - -2022-03-11 23:20:26 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh265dec.c: - nvh265sldec: Always fill SPS/PPS related parameters - Address compare was not a valid approach since it works - only if SPS/PPS id are changed. Otherwise it will always point to - the same address of member variables of h265parser. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1941> - -2022-03-11 19:32:59 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264picture.c: - h264decoder: Fix invalid memory access - gst_h264_dpb_needs_bump() can be called with null picture - in case of live - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1929> - -2022-03-10 18:40:12 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: add media attributes to caps to fix ptp clock handling - Those are needed by rtpjitterbuffer to do the right thing, e.g. - a=ts-refclk:ptp=IEEE1588-2008:00-**-**-**-**-**-**-**:0 - a=mediaclk:direct=1266592257 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1925> - -2022-03-10 10:33:56 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - mpegts: Handle glib < 2.58 - By using a workaround to the lack of g_ptr_array_steal_index. - Fixes #1078 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1919> - -2021-11-02 09:20:55 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - tsbase: Handle more program updates - There could be a case where the new program has the same program number as the - previous one ... but is actually located on a PID previously used for elementary - stream. In that case the program is guaranteed to not be an update of the - previous program but a completely new one. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1919> - -2021-11-02 09:18:57 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - mpegtsbase: Use an array to track programs - We need to be able to look for programs by their PID also. Using a hash table - was a bit sub-par (and overkill) for storing a range of programs. - This is needed because there could potentially be two programs with the same - program id but different PMT PID (while one is being deactivated the new one - would "exist"). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1919> - -2022-03-07 18:46:55 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/gstbasetsmux.c: - mpegtsmux: Start last_ts with GST_CLOCK_TIME_NONE - And use the output segment position for the outgoing timestamp while it - is. This is needed to delay the calculation of `output_ts_offset` until - we actually have a usable timestamp, as tsmux will output a few initial - packets while `last_ts` is still unset. - Without this, the calculation would use the initial `0` value, which did - not have the intended effect of making VBR mode behave like CBR mode, - but always calculated an offset equal to the selected start time. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1895> - -2022-03-07 18:46:08 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/gstbasetsmux.c: - mpegtsmux: Use GST_CLOCK_STIME_NONE for output_ts_offset - It's a GstClockTimeDiff, thus GST_CLOCK_TIME_NONE isn't appropriate. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1895> - -2022-03-07 10:19:53 +0000 Philippe Normand <philn@igalia.com> - - * tests/check/libs/play.c: - gstplay: tests: Keep track of errors/warnings - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1871> - -2022-03-07 10:16:36 +0000 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/play/gstplay.c: - gstplay: Do not error out on message parsing failures - Specially when parsing errors and warnings, the details field can be NULL and - the gst_structure_get() call would return FALSE in such cases, triggering false - positive errors. - Follow-up for #1063 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1871> - -2022-03-07 10:14:43 +0000 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/play/gstplay.c: - * gst-libs/gst/play/gstplay.h: - gstplay: Fix warning parsing API - The GError is an out parameter, so should be a ** parameter, like the details - parameter. - See also #1063 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1871> - -2022-03-04 14:17:47 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Handle PES headers bigger than a mpeg-ts packet - While the actual PES header parser could notify us that it needed more data, we - would never actually act on it. - This commit will accumulate incoming packets in such situation and re-attempt - the header parsing. - Fixes #1027 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1858> - -2022-03-04 09:57:02 +0000 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/play/gstplay.c: - * gst-libs/gst/play/gstplay.h: - play: Fix error parsing API - The GError is an out parameter, so should be a ** parameter, like the details - parameter. - Fixes #1063 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1850> - -2022-02-21 10:49:15 +0100 Sebastian Fricke <sebastian.fricke@collabora.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/gstwpe.cpp: - * ext/wpe/gstwpe.h: - Remove the uninstalled term - Remove the symbolic link `gst-uninstalled` which points to `gst-env`. - The `uninstalled` is the old name and the project should stick to a - single name for the procedure. - Remove the term from all the files, exceptions are variables from - dependencies like `uninstalled_variables` from pkgconfig and - `meson-uninstalled`. - Adjust mentions of the script in the documentation and README. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1829> - -2022-02-23 11:10:11 +0100 Sebastian Fricke <sebastian.fricke@collabora.com> - - * README.md: - Maintain build instructions at a single location - Do not maintain similar build instructions within each gst-plugins-* - subproject and the subproject/gstreamer subproject. Use the build - instructions from the mono-repository and link to them via hyperlink. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1829> - -2022-02-25 15:00:05 +0800 jinsl00000 <jinsl00000@msn.cn> - - * sys/ipcpipeline/gstipcpipelinecomm.c: - * sys/ipcpipeline/meson.build: - ipcpipeline: fix crash and error on windows with SOCKET or _pipe() - The fd was in different meanings on windows: - POSIX read and write use the fd as a file descriptor. - The gst_poll use the fd as a WSASocket. - This patch use WSASocket as default on windows. This is a temporary measure, because IPC has many different implement. There may be a better way in the future. - See #1044 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1822> - -2022-02-28 16:33:23 +0100 Guillaume Desmottes <guillaume.desmottes@onestream.live> - - * ext/gs/meson.build: - gs: look for google_cloud_cpp_storage.pc - storage_client.pc was legacy and has been removed: - https://github.com/googleapis/google-cloud-cpp/commit/df6fa3611cdfbc37d40e1451afa91fd7d2e7d5f7#diff-bc35ad7c2fe631fd5578a06092412dba81c7ddd27bb25df7e17bb13771799afcL743 - No need to keep looking for storage_client.pc as a fallback as 1.25.0, - our minimum version, already ships google_cloud_cpp_storage.pc - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1825> - -2022-02-24 20:26:46 +0530 Sanchayan Maity <sanchayan@asymptotic.io> - - * ext/ldac/gstldacenc.c: - ldac: Set eqmid in caps - We set the eqmid in caps to be usable downstream by rtpldacpay for - knowing the frame count. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1804> - -2022-01-31 16:13:32 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsmux/gstbasetsmux.c: - tsmux: Skip empty buffers - They can be created e.g. by aggregator when there is a gap. Such buffers - should not be muxed at all. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1801> - -2022-02-01 14:51:27 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/gstbasetsmux.h: - tsmux: Lock mux->tsmux, the programs hash table, and pad streams - They contain implementations that are not thread-safe (e.g. GList, GHashTable). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1800> - -2022-02-21 16:45:50 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * docs/plugins/gst_plugins_cache.json: - bad:docs: Add vaav1dec in documentation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1780> - -2022-02-18 16:23:09 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp9dec.c: - v4l2codecs: vp9: Fix reset_frame_context parameter - It was assumed that the kernel parameters would match with the bitstream value - but instead the author when with another set of value. Surprisingly, this - makes no difference with the resulting fluster score. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1754> - -2022-02-18 16:02:27 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp9dec.c: - v4l2codecs: vp9: Only fill compressed headers if needed - Fixes: 13944cf3ee871722 ("v4l2codecs: vp9: Make compressed hdr control optional") - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1754> - -2022-01-15 00:04:05 -0600 Tim Mooney <Tim.Mooney@ndsu.edu> - - * ext/curl/meson.build: - * gst/festival/meson.build: - * meson.build: - * sys/shm/meson.build: - meson: check for libsocket and libnsl - If present, add '-lsocket' and '-lnsl' to network_deps. - ext/curl/meson.build: add network_deps to dependencies - gst/festival/meson.build: same - sys/shm/meson.build: same - Fixes linking issues on Illumos distros. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1736> - -2022-02-14 16:18:54 +0300 Dmitry Osipenko <dmitry.osipenko@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264: Correct scaling matrix ABI check - Scaling matrix V4L UAPI control not presents on NVIDIA Tegra, the default - matrix should be used in this case. Mark scaling matrix presence optional. - Fixes: 47bfa71530c ("v4l2codecs: h264: Improve ABI check ") - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1735> - -2022-02-16 02:23:58 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11converter.cpp: - d3d11converter: Fix for missing GRAY conversion - Add missing Y410 -> GRAY and GRAY -> semi-planar conversion - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1733> - -2022-02-16 02:11:53 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11converter.cpp: - d3d11converter: Don't use FIXME_OBJECT for non-GstObject - ... and print ERROR messages for unexpected input/output formats - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1733> - -2022-02-14 12:57:44 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: unlock mutex on -1 start_offfset - Closing #1013 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1718> - -2022-02-08 15:22:39 +0100 Jan Alexander Steffens (heftig) <heftig@archlinux.org> - - * ext/openaptx/gstopenaptxdec.h: - * ext/openaptx/gstopenaptxenc.h: - * ext/openaptx/meson.build: - openaptx: Support libfreeaptx - libfreeaptx1 is a fork of libopenapt 0.2.0, used by pipewire. - 1: https://github.com/iamthehorker/libfreeaptx - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1642 - Closes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1589 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1721> - -2022-02-15 02:26:46 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11converter.cpp: - d3d11converter: Fix RGB to GRAY conversion - Fix typo in shader code - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1719> - -2022-02-12 10:05:11 +0000 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/webrtc/dtlstransport.c: - dtlstransport: Notify ICE transport property changes - The application might track the underlying ICE transport, so not notifying - changes might lead to use-after-free issues. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1717> - -2022-02-12 14:51:51 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvavpp.c: - vavpp: Fix the caps leak in the transform_caps() function. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1715> - -2022-02-10 12:52:30 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: Add temporal unit check when TD is absent. - The current manner for deciding the new temporal unit is based on - temporal delimiter(TD) OBU. We only start a new temporal unit when - the TD comes. - But some streams do not have TD at all, which makes the output "TU" - alignment fail to work. We now add check based on the relationship - between the different layers and it can successfully judge the TU edge. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1712> - -2022-02-04 17:12:15 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: let the parse continue when MISSING_OBU_REFERENCE error. - Some streams may have verbose OBUs before a valid sequence header. We - should let the parse continue rather than return a error. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1712> - -2022-02-04 11:40:18 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: Continue when we fail to detect the alignment. - Some streams may have problematic OBUs at the beginning, which causes - the parse fail to detect the alignment and return error. For example, - there may be verbose OBUs before a valid sequence, which should be - discarded until we meet a valid sequence. We should let the parse - continue when we meet such cases, rather than just return error. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1712> - -2021-03-30 19:23:12 +0900 Seungha Yang <seungha@centricular.com> - - * gst/ivfparse/gstivfparse.c: - ivfparse: Don't set zero resolution on caps - It could be zero if the information is not available at ivfparse - side, or not implemented. In that case, simply don't set - width/height on caps, otherwise downstream would be confused - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1709> - -2022-02-10 01:48:23 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfaudioenc.cpp: - mfaudioenc: Handle empty IMFMediaBuffer - IMFMediaBuffer may not hold encoded data, which seems to happen - while draining. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1705> - -2022-02-06 23:20:32 +0900 Sangchul Lee <sc11.lee@samsung.com> - - * ext/webrtc/gstwebrtcice.c: - webrtcice: Fix memory leaks in gst_webrtc_ice_add_candidate() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1704> - -2022-02-07 12:34:53 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/va/meson.build: - va: Fix and simplify build recipe. - 1. Use api_version variable rather than static string. - 2. Remove pkgconfig generation since currently the library - is not installed, only used internally. - 3. Rely on dependency "required" to abort compilation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1702> - -2022-02-07 11:27:57 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/va/meson.build: - * sys/va/meson.build: - va: Remove libgudev crumbs in library. - In commit e699aaeb we moved linking of libgudev to the plugin rather - the library, because it's only used in the plugin. But the dependency - check is still done in library. - This patch removes the dependency check in library, and updates the - dependency check in plugin. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1702> - -2022-02-01 00:50:53 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh265dec.c: - nvh265sldec: Fix for decoding 12bits stream - We've been exposing main-444-12 profile as a supported profile - in its sinkpad template but not actaully. Adding code to - covert 12 and 16 bits as well. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1660> - -2022-02-01 00:12:06 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvdecoder.c: - * sys/nvcodec/gstnvdecoder.h: - * sys/nvcodec/gstnvh264dec.c: - * sys/nvcodec/gstnvh265dec.c: - * sys/nvcodec/gstnvvp8dec.c: - * sys/nvcodec/gstnvvp9dec.c: - nvdecoder: Fix for HEVC 4:4:4 format decoding - Map chroma_format_idc == 3 (which means 4:4:4 subsampling) correctly, - also pass coded bitdepth for decoder initialization instead of - inferring it from output format since they can be different. - Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/949 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1660> - -2022-02-05 17:36:41 +0300 Igor V. Kovalenko <igor.v.kovalenko@gmail.com> - - * meson_options.txt: - qroverlay: move to plugins that need external deps - qroverlay requires libqrencode dependency, move it next to similar plugins. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1658> - -2022-02-07 16:17:28 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - Back to development - -=== release 1.20.0 === - -2022-02-03 19:53:25 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * README: - * RELEASE: - * gst-plugins-bad.doap: - * meson.build: - Release 1.20.0 - -2022-02-03 19:53:18 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - Update ChangeLogs for 1.20.0 - -2022-02-02 09:58:15 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dash/gstdashsink.c: - dashsink: doc cleanup - Remove max-files mention in the command line test - Fix some typos - Use mpegtsdemux instead of tsdemux in the pipeline description - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1624> - -2022-02-01 00:18:44 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvdecoder.c: - nvdecoder: Fix for display resolution setup - Display resolution should be cropped rect, not coded resolution. - Otherwise decoded output from NVDEC might be wrong. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1617> - -2022-02-01 03:00:41 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - * sys/applemedia/vtutil.c: - * sys/applemedia/vtutil.h: - applemedia: Disable 64RGBALE support on older macOS - The kCVPixelFormatType_64RGBALE enum is only available on macOS Big - Sur (11.3) and newer. We also cannot use that while configuring the - encoder or decoder on older macOS. - Define the symbol unconditionally, but only use it when we're running - on Big Sur with __builtin_available(). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1613> - -2022-02-01 03:04:32 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/vtenc.c: - applemedia: Remove some unnecessary variables - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1613> - -2022-02-01 05:07:04 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * docs/meson.build: - * sys/applemedia/avfassetsrc.m: - * sys/applemedia/iosassetsrc.m: - docs: Add objc and objcpp files to hotdoc gst_c_sources - Hotdoc should be able to extract and parse comments out of these. Just - need to be careful to only add the glob in directories that actually - contain *.m (objc) and *.mm (objcpp) files. - Also fix some doc comments and remove redundant ones. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1614> - -2022-01-14 11:26:42 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/wpe/meson.build: - wpe: Support wpe-webkit-1.1 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1522> - -2022-01-29 10:24:36 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/gstwpe.cpp: - * ext/wpe/gstwpe.h: - * ext/wpe/meson.build: - * ext/wpe/wpe-extension/meson.build: - wpe: Install WebExtension in pkglibdir - The uninstalled WebExtension takes precedence over the installed one, so that - audio support works in local developer builds as well. - Fixes #975 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1602> - -2022-01-30 19:06:29 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/plugin.m: - * sys/applemedia/vtenc.c: - docs: Rename "OS X" to "macOS" in some documentation - No one uses the term "Mac OS X" anymore, it's "macOS". "OS X" is even - worse, because people will usually start the search with "mac". - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1607> - -2022-01-28 23:15:28 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - applemedia: Document vtenc / vtdec elements - Also preserve-alpha property should only be exposed on the - vtenc_prores element since h264 does not support transparency. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-docs/-/issues/94 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1601> - -2022-01-28 14:39:35 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264: Improve ABI check - This moves the ABI check to the registration, so we don't expose - decoders with the wrong ABI or that are just broken somehow. It - also makes few enhancement: - - Handle missing, but required controls - - Prints the controls macro name instead of id - This should fix RK3399 support with a currently release minor - regression in the Hantro driver that cause errors. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1599> - -2022-01-28 17:11:41 +0000 Philippe Normand <philn@igalia.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/utils.c: - * ext/webrtc/utils.h: - * ext/webrtc/webrtcdatachannel.c: - * ext/webrtc/webrtcsdp.c: - * gst-libs/gst/webrtc/meson.build: - * gst-libs/gst/webrtc/webrtc.c: - * gst-libs/gst/webrtc/webrtc_fwd.h: - * tests/check/elements/webrtcbin.c: - webrtc: Expose RTCError enum - The error codes not complying with the spec are now notified with the - GST_WEBRTC_ERROR_INTERNAL_FAILURE code. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1485> - -2022-01-29 04:46:24 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11av1dec.cpp: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11decoder: Fix typo in doc - s/elemenet/element/g - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1598> - -=== release 1.19.90 === - -2022-01-28 14:28:35 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * gst-plugins-bad.doap: - * meson.build: - Release 1.19.90 - -2022-01-28 14:28:28 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - Update ChangeLogs for 1.19.90 - -2022-01-27 11:22:54 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Make cb max values symmetrical to their min values. - Intel drivers expose some colorbalance's maximum values much more - bigger than their minimum values, given their middle values (default - value). This means, in practice, that the real middle point between - the maximum and minimum values implies a major change in the color - balance, which is not expected by the GStreamer color balance logic. - This patch makes the given maximum value symmetrical to the minimum - value, given the middle one (default value). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1580> - -2022-01-27 11:49:53 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecmpeg2dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/gstv4l2codecvp9dec.c: - v4l2codecs: Fix debug assertion in register functions - As now, we warn if the decoder have no support src pixel format, but that - warning is called before the type (hence the debug category) is initialized. - Fix this by moving the debug category init out of the type initialization, - into the register funcitons. - This will fix an assertion that occures in the register function and allow - relevant log to be seen by the users. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1588> - -2022-01-27 17:56:29 +0100 Jakub Adam <jakub.adam@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Chain up to parent constructed method - Failing to do so makes GstWebRTCBin invisible to the leaks tracer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1587> - -2022-01-27 01:40:17 +0000 Tim-Philipp Müller <tim@centricular.com> - - * po/LINGUAS: - * po/ro.po: - gst-plugins-bad: update translations - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1579> - -2022-01-27 03:10:39 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11av1dec.cpp: - d3d11av1dec: Fix typo in debug message - Fixing copy and paste mistake, It's AV1 decoder not VP8 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1576> - -2022-01-25 12:32:50 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvabasetransform.c: - va: basetransform: Pass component index not plane index. - This is an issue detected and fixed in commit 3897b24f for other - libraries and elements. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1566> - -2022-01-24 11:14:14 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - * sys/va/gstvavpp.c: - va: filter & postproc: Match color with caps features. - When fixating color, there might be "other caps" with color spaces not - supported by the caps features exposed in the vapostproc's source pad - caps template (perhaps it's a bug somewhere else in GStreamer). - This solution checks if the proposed format exists in the filter - within the caps feature associated with the proposed format. - The check is done with the new filter's function - gst_va_filter_has_video_format(). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1559> - -2022-01-10 13:34:21 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - tsmux: Allow specifying PMT order via the prog-map - Look for an entry `PMT_<PID>` in the `prog-map`, which specifies the - relative index of the stream in the PMT. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1510> - -2022-01-10 14:16:28 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - tsmux: Deterministically order program streams by PID - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1510> - -2022-01-10 12:59:58 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - tsmux: Deterministically order PAT programs by number - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1510> - -2022-01-10 13:03:11 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - tsmux: Remove program_array_index - It's only used for removal. Let's just scan the array. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1510> - -2022-01-10 12:31:42 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - tsmux: Replace streams GArray with GPtrArray - This is more appropriate. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1510> - -2022-01-19 23:17:23 +0900 Sangchul Lee <sc11.lee@samsung.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/webrtcdatachannel.c: - * ext/webrtc/webrtcsdp.c: - webrtc: Fix memory leaks - Redundant condition and unreachable codes are also removed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1544> - -2020-07-14 11:11:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecmpeg2dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/gstv4l2codecvp9dec.c: - * sys/v4l2codecs/gstv4l2format.h: - v4l2codecs: Unify the src template caps format - Notably NV12_4L4 ended up being applied to only VP9 decoder. This fixes the - situation by using a central define for all static src pad templated formats. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/965> - -2022-01-21 14:13:39 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/linux/v4l2-controls.h: - * sys/v4l2codecs/linux/videodev2.h: - v4l2codecs: Sync kernel headers against 5.16.0 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/965> - -2022-01-21 11:13:55 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/msdk.c: - msdk: Avoid noisy registry when no MSDK device. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1550> - -2022-01-21 10:53:21 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/va/gstvadisplay.c: - va: libs: Avoid noisy registry when no VA device. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1550> - -2022-01-20 05:59:36 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - * sys/wasapi2/gstwasapi2util.c: - * sys/wasapi2/gstwasapi2util.h: - * sys/wasapi2/meson.build: - wasapi2: Fix for device open failure on old OS - To open automatic stream routing aware device, - at least Windows10 Anniversary Update is required. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1545> - -2022-01-18 03:03:30 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2ringbuffer.cpp: - wasapi2ringbuffer: Fix for desynced buffer-size and segsize - GstAudioRingBufferSpec::segsize has been configured by using - device period but GstWasapi2RingBuffer was referencing the - buffer size returned by IAudioClient::GetBufferSize() - which is most likely larger than device period. - Fixing to sync them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1533> - -2021-12-30 16:52:17 +0100 Robert Mader <robert.mader@collabora.com> - - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: Ensure correct mapping of area_surface - If the `area_surface` got unmapped when changing to the `READY` or - `NULL` state, we currently don't remap it when playback resumes and - `wp_viewporter` is supported. Without `wp_viewporter` we do remap - it, but rather unintentionally and also when not wanted. - On Weston this has not been a big problem as it so far wrongly maps - subsurfaces of unmapped surfaces anyway - i.e. only the black - background was missing on resume. On other compositors and future - Weston this prevents the `video_surface` to get remapped. - Shuffle things around to ensure `area_surface` is mapped in the - right situations and do some minor cleanup. - See also https://gitlab.freedesktop.org/wayland/weston/-/issues/426 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1483> - -2022-01-16 02:21:43 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11deinterlace.cpp: - d3d11deinterlace: Do not restrict minimum resolution to 64x64 - The value 64 was completely arbitrary one, and this element - will be able to support smaller resolutions - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1528> - -2022-01-06 22:00:11 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11compositor.cpp: - d3d11compositor: Don't try to read empty buffer - The queued buffer may not be readable buffer in case that - upstream sends GAP event or so. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1497> - -2022-01-13 14:17:09 +0100 Robert Mader <robert.mader@collabora.com> - - * tests/examples/waylandsink/main.c: - waylandsink: Fix alpha value for the test pattern in example - The background-color property is in big-endian ARGB, resulting in - a alpha value of `0`. This accidentally used to work on all common - compositors, but on Weston this now correctly results in a black - background. - See also https://gitlab.freedesktop.org/wayland/weston/-/issues/577 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1446> - -2021-12-13 13:16:06 +0100 Robert Mader <robert.mader@collabora.com> - - * ext/wayland/wldisplay.c: - * ext/wayland/wlwindow.c: - waylandsink: Use wl_surface_damage_buffer() instead of wl_surface_damage() - The later, doing damage in surface coordinates instead of buffer - coordinates, has been deprecated. The reason for that is that it - is more prone to bugs, both on the client and the compositor side, - especially when paired with buffer scale, `wp_viewporter` or - buffer transforms. - Unfortunately, on Weston this risks running into - https://gitlab.freedesktop.org/wayland/weston/-/issues/446 - (which causes trouble for several other projects as well). However, - that bug only affects cases where we run in sync mode, i.e. only - during resizes. In practise I haven't been able to observe the - issue. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1446> - -2021-12-13 12:21:06 +0100 Robert Mader <robert.mader@collabora.com> - - * ext/wayland/wlwindow.c: - waylandsink: Use G_MAXINT32 for surface damage - Each time we call `wl_surface_damage()` we want to do full surface - damage. Like Mesa, just use `G_MAXINT32` to ensure we always do - full damage, reducing the need to track the right dimensions. - `window->video_rectangle` is now unused, but we keep it around for - now as we may need it again in the future. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1446> - -2021-12-30 18:14:24 +0100 Robert Mader <robert.mader@collabora.com> - - * ext/wayland/wlwindow.c: - waylandsink: Only call wl_surface_damage() when buffer content changed - From the spec: - > This request is used to describe the regions where the pending - > buffer is different from the current surface contents - We currently also call `wl_surface_damage()` on surfaces without - new or still compositor-hold buffers, e.g. when resizing the window. - In that case we call it on `area_surface_wrapper`, even though it - gets resized via `wp_viewport_set_destination()`, in which case - the compositor is in charge of repainting the area on screen. - Doing so is currently not forbidden by the spec, however it might - be in the future, see - https://gitlab.freedesktop.org/wayland/wayland/-/issues/267 - Thus lets stay close to the spec and only call `wl_surface_damage()` - when we just attached a buffer. - Right now this prevents runtime assertions in Mutter. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1446> - -2021-12-13 14:31:06 +0100 Robert Mader <robert.mader@collabora.com> - - * ext/wayland/wlwindow.c: - waylandsink: Simplify input region handling - We only need to unset the input region for the area surface when - we don't have our own toplevel surface. By default, the input region - covers the whole surface, thus no need to change it on resize. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1446> - -2021-12-13 12:00:10 +0100 Robert Mader <robert.mader@collabora.com> - - * ext/wayland/wlwindow.c: - waylandsink: Use G_MAXINT32 for opaque regions - `gst_wl_window_set_opaque` does not get called on window resizes, - potentially leaving opaque regions too small. - According to the spec opaque regions can be bigger than the surface - size - parts that fall outside of the surface will get ignored. - Thus we can can simply use `G_MAXINT32` and be sure that the whole - surfaces will always be covered. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1446> - -2022-01-11 13:21:55 -0500 Dave Piché <dave.piche@motorolasolutions.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: fix log error message in function gst_webrtc_bin_set_local_description - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1511> - -2022-01-13 11:31:55 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/mxf/mxfvanc.c: - mxfdemux: don't error out if VANC track only contains packets we don't handle - If the VANC track does contain packets, but we skip over all packets, just - treat it the same as if there hadn't been any packets at all and send a - GAP event instead of erroring out with "Failed to handle essence element". - We would error out because when we reach the end of the loop without having - found a closed caption packet the flow return variable is still FLOW_ERROR - which is what it has been initialised to. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1518> - -2022-01-13 10:36:24 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparsers: h265parser: return invalid profile if len is 0. - Though the profiles0 is inited as GST_H265_PROFILE_INVALID in the - gst_h265_profile_tier_level_get_profile(), the profile detecting may - change its content later. So the return of profiles0 may not be an - invalid profile even the len is 0. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1517> - -2022-01-13 10:11:52 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparsers: h265parser: Fix the index incrementation error in append_profile(). - The current "*idx++" operation just refers the pointer and increment the pointer - itself, not the content of the pointer. This causes that the count of the profiles - is always 0. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1517> - -2022-01-04 04:56:55 +0300 Dmitry Osipenko <digetx@gmail.com> - - * sys/kms/gstkmssink.c: - kmssink: Support auto-detection of NVIDIA Tegra driver - NVIDIA Tegra SoCs have a separate (from GPU) display controller. It's - the primary display device on all Tegra SoCs. Add Tegra to the list - of primary DRM drivers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1514> - -2022-01-08 00:16:29 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - cccombiner: fix s334-1a scheduling - The previous code was mistakenly trying to compute a cc_type out - of the first byte in the byte triplet, whereas it is to be interpreted - as: - > Bit b7 of the LINE value is the field number (0 for field 2; 1 for field 1). - > Bits b6 and b5 are 0. Bits b4-b0 form a 5-bit unsigned integer which - > represents the offset - The same mistake was made when creating padding packets. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1496> - -2022-01-05 22:48:31 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - cccombiner: merge buffers for both fields with caption type s334-1a - Other elements such as line21encoder expect both fields to be present - in the same meta, not one meta per field. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1496> - -2022-01-10 15:24:13 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.h: - av1parser: Fix data type of film grain param - Fix cb_offset and cr_offset data type from guint8 to guint16. According - to spec, cb_offset and cr_offset are 9 bit long, while guint8 can cause - interger overflow, and thus change to guint16. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1508> - -2022-01-05 02:07:59 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * docs/meson.build: - * ext/opencv/meson.build: - * gst-libs/gst/vulkan/meson.build: - * meson.build: - * sys/msdk/meson.build: - meson: Add explicit check: kwarg to all run_command() calls - This is required since Meson 0.61.0, and causes a warning to be - emitted otherwise: - https://github.com/mesonbuild/meson/commit/2c079d855ed87488bdcc6c5c06f59abdb9b85b6c - https://github.com/mesonbuild/meson/issues/9300 - This exposed a bunch of places where we had broken run_command() - calls, unnecessary run_command() calls, and places where check: true - should be used. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1507> - -2022-01-05 10:53:55 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * gst/codecalpha/gstalphacombine.c: - alphacombine: update example launch line - Fix typos and missing videoconvert element to demonstrate - the alphacombine element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1494> - -2021-12-24 23:09:59 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: Set the "tu" as the default alignment. - The tu(temporal unit) is more widely used than the current alignment. - We now change the default alignment to tu. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1468> - -2021-12-24 21:50:01 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: Fix the wrong DELTA_UNIT flag setting for key frames. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1468> - -2021-12-22 12:36:15 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: Copy the PTS and DURATION when we create data. - We need to create header buffers for annex b format. This kind of - buffers should inherit the PTS and DURATION from the original buffers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1468> - -2022-01-03 21:02:47 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Signal ignored alpha component with ProRes - When the image is opaque but the output ProRes format has an alpha - component (4 component, 32 bits per pixel), Apple requires that we - signal that it should be ignored by setting the depth to 24 bits per - pixel. Not doing so causes the encoded files to fail validation. - So we set that in the caps and qtmux sets the depth value in the - container, which will be read by demuxers so that decoders can skip - those bytes entirely. qtdemux does this, but vtdec does not use this - information at present. - The sister change was made in qtmux and qtdemux in: - https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1061 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1489> - -2022-01-03 22:15:12 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparsers: h265parser: Correct the read of slice_sao_chroma_flag. - According to the SPEC, for parsing the slice header, we should read the - slice_sao_chroma_flag only when ChromaArrayType is not equal to 0. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1488> - -2021-12-29 21:29:02 +0100 Rafał Dzięgiel <rafostar.github@gmail.com> - - * ext/assrender/gstassrender.c: - assrender: Support RFC8081 mime types - Old "application/*" are now as per RFC8081 deprecated in favor of - new "font/*" mime types. Some new encoders are already using the - updated mime types. We need to also add them to the support list - in order for assrender to correctly identify them as fonts. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1481> - -2021-12-29 21:28:56 +0100 Rafał Dzięgiel <rafostar.github@gmail.com> - - * ext/assrender/gstassrender.c: - assrender: Handle ".ttc" attachment extension - TTC stands for "TrueType Collection" file. We can pass it - into libass as any other attachment. Add it to the supported - extensions list, so the fonts it contains will be used. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1481> - -2022-01-02 09:38:43 +0000 Philippe Normand <philn@igalia.com> - - * ext/webrtc/webrtcdatachannel.c: - webrtcdatachannel: Notify buffered-amount property updates - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1484> - -2021-12-27 03:15:10 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - d3d11decoder: Negotiate again on the first output buffer - ... unconditionally. There may be updated field in sinkpad caps - after the new_sequence() call (HDR related ones for example), - then we should signal the information to downstream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1474> - -2021-12-29 15:02:03 +0000 Philippe Normand <philn@igalia.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtcstats: Fix null pointer dereference - If there is no jitterbuffer stats we should not attempt to store them in the - global stats structure. - Also add a g_return_if_fail in _gst_structure_take_structure() about this - because it is a programmer error to pass an invalid pointer address there. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1479> - -2021-08-12 19:14:16 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - codecparsers: av1parse: Add the DECODE_ONLY flag to output buffer. - When the alignment is ALIGN_FRAME and the output buf contains a frame - which is not to be shown, the GST_BUFFER_FLAG_DECODE_ONLY flag should - be set. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1050> - -2021-12-14 12:38:25 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtcstats: Fall back to last packet ssrc if caps dont provide it - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1448> - -2021-12-14 11:28:42 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtcstats: Use our own caps instead of the sticky event - The sticky event seems to get cleared sometimes. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1448> - -2021-12-14 11:28:13 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - webrtcbin: Store the ssrc of the last received packet - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1448> - -2021-12-13 16:57:06 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtc stats: Remove duplicate structure get - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1448> - -2021-12-13 16:56:37 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtc stats: Add more details about codecs into the stats - This makes the output a little closer to what the upstream stats are. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1448> - -2021-12-23 10:06:58 +1100 Brad Hards <bradh@frogmouth.net> - - * ChangeLog: - * data/targets/file-extension/ts.gep: - doc: typo fix for streaming - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1463> - -2021-12-21 12:55:59 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaprofile.c: - va: av1dec: Use named profiles to replace the numeric ones. - Use named AV1 profiles (i.e., main, high, and professional) to replace - the old 0, 1, 2 profiles. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1456> - -2021-12-21 01:08:40 +0900 Seungha Yang <seungha@centricular.com> - - * ext/aom/gstav1enc.c: - av1enc: Update for newly designed AV1 profile signalling - Accept named AV1 profiles (i.e., main, high, and professional) - as well - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1456> - -2021-12-19 21:48:51 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11av1dec.cpp: - d3d11av1dec: Update sinkpad template for profile - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1456> - -2021-12-19 21:44:19 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gstav1parse.c: - * tests/check/elements/av1parse.c: - av1parse: Use descriptive profile name instead of numeric - As per AV1 specification Annex A, AV1 profiles have explicit and - descriptive names for each seq_profile. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1456> - -2021-12-19 21:47:18 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: Remove trailing white space - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1456> - -2021-12-17 22:24:57 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11av1dec.cpp: - d3d11av1dec: Fix for Cdef param - av1parser will increase the sec_strength values by 1 if parsed - values were equal to 3 as defined in spec. But DXVA wants unmodified - ones. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1455> - -2021-12-17 19:49:42 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11av1dec.cpp: - d3d11av1dec: Sync DXVA AV1 data structure with released header - Update AV1 data structure based on Windows 11 SDK header - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1455> - -2021-12-15 12:27:24 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * tests/check/libs/h265parser.c: - tests: h265parser: Add test for multiple compatibility profiles. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1440> - -2021-12-14 19:56:48 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/videoparsers/gsth265parse.c: - h265parser: Compare upstream profile with in SPS. - Compare if upstream profile in caps is the same as the one parsed in - the SPS. If they are different use the bigger for simplicity and - more chances to decode it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1440> - -2021-12-15 11:58:07 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparsers: h265parser: Use a table map to get profile. - Instead of a sequence of if statements, declare a table to map profile - idc with profiles and traverse it. - Also, first add the profile from the parsed profile idc and later add, - into the profile array, the profile from the compatibility flags. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1440> - -2021-12-14 19:36:56 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparsers: h265parser: Verify all possible profiles. - It's possible a HEVC stream to have multiple profiles given the - compatibility bits. Instead of returning a single profile, internal - gst_h265_profile_tier_level_get_profiles() returns an array with all - it possible profiles. - Profiles are appended into the array only if the generated profile - is not invalid. - gst_h265_profile_tier_level_get_profile() is rewritten in terms of - gst_h265_profile_tier_level_get_profiles(), returning the first - profile found the array. - And gst_h265_get_profile_from_sps() is also rewritten in terms of - gst_h265_profile_tier_level_get_profiles(), but traversing the array - verifying if the proposed profile is actually valid by Annex A.3.x of - the specification. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1440> - -2021-12-09 03:00:56 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: bind transceiver's fec-percentage to encoder percentage - Allows for dynamic control of the applied FEC overhead - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1429> - -2021-12-07 23:55:22 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/transportstream.c: - * ext/webrtc/transportstream.h: - webrtcbin: fix ulpfec / red for the BUNDLE case - * Add fec / red encoders as direct children of webrtcbin, instead - of providing them to rtpbin through the request-fec-encoder signal. - That is because they need to be placed before the rtpfunnel, which - is placed upstream of rtpbin. - * Update configuration of red decoders to set a list of RED payloads - on them, instead of setting the pt property. - That is because there may be one RED pt per media in the same session. - * Connect to request-fec-decoder-full instead of request-fec-decoder, - in order to instantiate FEC decoders according to the payload type - of the stream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1429> - -2021-12-10 21:58:33 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11pluginutils.cpp: - d3d11videosink: Use only tested color space for swapchain - We are querying supported swapchain colorspace via - CheckColorSpaceSupport() but it doesn't seem to be reliable. - Use only tested full-range RGB formats which are: - - sRGB - - BT709 primaries with linear RGB - - BT2020 primaries with PQ gamma - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1433> - -2021-12-11 11:33:39 -0300 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/soundtouch/gstpitch.cc: - pitch: Specify layout as required for negotiation - There are cases where it might negotiate 'non-interleaved' while it - is wrong. - ``` - gst-launch-1.0 audiotestsrc ! "audio/x-raw, format=(string)F32LE, layout=(string)non-interleaved" ! audioconvert ! audioresample ! pitch tempo=1.2 ! audioconvert ! "audio/x-raw,format=S16LE" ! fakesink - Setting pipeline to PAUSED ... - Pipeline is PREROLLING ... - (gst-launch-1.0:3029628): GStreamer-Audio-CRITICAL **: 11:42:22.477: gst_audio_buffer_map: assertion '(!meta && info->layout == GST_AUDIO_LAYOUT_INTERLEAVED) || (meta && info->layout == meta->info.layout)' failed - ERROR: from element /GstPipeline:pipeline0/GstAudioConvert:audioconvert1: The stream is in the wrong format. - Additional debug info: - ../subprojects/gst-plugins-base/gst/audioconvert/gstaudioconvert.c(876): gst_audio_convert_transform (): /GstPipeline:pipeline0/GstAudioConvert:audioconvert1: - failed to map input buffer - ERROR: pipeline doesn't want to preroll. - ERROR: from element /GstPipeline:pipeline0/GstAudioTestSrc:audiotestsrc0: Internal data stream error. - Setting pipeline to NULL ... - Additional debug info: - ../subprojects/gstreamer/libs/gst/base/gstbasesrc.c(3127): gst_base_src_loop (): /GstPipeline:pipeline0/GstAudioTestSrc:audiotestsrc0: - streaming stopped, reason error (-5) - ERROR: pipeline doesn't want to preroll. - Freeing pipeline ... - ``` - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1441> - -2021-12-10 15:46:41 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - doc: Update vp9alphadecodebin doc cache - A new field was added to the template cpas. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1439> - -2021-12-10 15:18:56 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstalphacombine.c: - alphacombine: Fix for early allocation queries - When using playbin3, it seems that the alpha decode is always first to - push caps and run an allocation query. As the format change from sink - and alpha were not synchronized, the allocation query could endup - being run before the caps are pushed. That may lead to failing query, - which makes the decoder thinks there is no GstVideoMeta downstream and - most likely CPU copy the frame. - This patch implements a format cookie to track and synchronize the - format changes on both pads fixing the racy performance issue. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1439> - -2021-12-10 14:09:44 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp9dec.c: - * sys/v4l2codecs/gstv4l2codecvp9dec.h: - * sys/v4l2codecs/plugin.c: - v4l2codecs: vp9: Add alpha decodebin wrapper - This will allow HW accelerated decoding of WebM alpha videos. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1439> - -2021-12-10 14:09:06 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/plugin.c: - v4l2codecs: plugin: Minor style fix - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1439> - -2021-12-10 14:08:32 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2codecs: decoder: Improve logging of timed out request - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1439> - -2021-12-10 14:07:18 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecmpeg2dec.c: - * sys/v4l2codecs/gstv4l2codecmpeg2dec.h: - * sys/v4l2codecs/plugin.c: - v4l2codecs: mpeg2: Check that the decoder output formats - This is to avoid exposing a decoder for which we don't support any - output format. This happens on platform using vendor formats or - not yet supported tiles formats. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1439> - -2021-12-10 14:04:40 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstvp9alphadecodebin.c: - vp9alphadecodebin: Fix auto-pluging v4l2slvp9dec - This adds the alignment field to the template caps. Without this field - set, the auto-plugger will see fixed caps and will use - gst_caps_is_subset() against the caps produced by the parser. This is a - challenge for all cases where a parser can do conversion. This is fixed - by adding alignment field, which makes the auto-pluggers do an - intersection of the caps as it gets unfixed caps after intersection now. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1439> - -2021-12-09 19:55:04 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11pluginutils.cpp: - * sys/d3d11/gstd3d11pluginutils.h: - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Remove hack related to color space selection - Use input GstVideoColorPrimaries without any special case handling - otherwise rendered image color would be very wrong. - The hack was added to work around an issue that some Intel driver - couldn't handle wide color gamut image without HDR10 metadata, specifically PQ image. - But device capability can be checked via a method added in - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1723 - so there's no issue now. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1175 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1430> - -2021-12-09 19:51:04 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Fix typo in debug message - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1430> - -2021-12-08 11:08:30 +0100 Benjamin Gaignard <benjamin.gaignard@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Fix return value type - Return value should be GstFlowReturn not gboolean - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1426> - -2021-12-07 17:09:11 +0100 Benjamin Gaignard <benjamin.gaignard@collabora.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - codecs: h265decoder: Fix return value if klass->new_picture isn't set - If klass->new_picture isn't set we need to initialize - ret with GST_FLOW_OK to avoid unwanted error case - Fixes: 5b405d15858b ("codecs: h265decoder: Use GstFlowReturn everywhere") - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1426> - -2021-12-06 16:47:14 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/gstwpevideosrc.cpp: - wpevideosrc: Use basesrc event vfunc - Allows for basic default handling from the base class. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1422> - -2021-12-03 13:24:25 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/teletextdec/gstteletextdec.c: - teletextdec: fix minor string leak - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1416> - -2021-12-02 15:52:06 +0100 Marc Leeman <m.leeman@televic.com> - - * gst/rist/gstristsink.c: - ristsink: set properties on children early - The properties on the udpsink/udpsrc elements need to be set before - there is any state change. If not, in a network without default gateway, - udpsink tries to bind an a NULL interface and fails. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1411> - -2021-12-03 07:53:54 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecmpeg2dec.c: - v4l2codecs: mpeg2: Fix selected sizeimage - Due to a copy paste bug, the bitdepth was never set and that was leading - to requesting sizeimage of 0. Previously that worked since the driver - would in that case pick a size for us. But now the we bumped the minimum - to 4KB, the driver happily allocate 4KB of bitstream which lead to - decoding error. - As MPEG2 have a fixed bitdeph of 8, use a define instead of the run-time - variable. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1415> - -2021-12-01 12:16:40 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp9dec.c: - v4l2codecs: vp9: Drop frames on non-keyframe format change - V4L2 does not yet support this feature, this will skip over the - transition portion up to the next keyframe. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1404> - -2021-12-01 09:51:57 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecmpeg2dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/gstv4l2codecvp9dec.c: - v4l2codecs: Fix renegotiation - If we hold the last reference to the allocator, leaving the device - streaming will cause an EBUSY error when trying to free the allocate - buffers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1404> - -2021-12-02 16:26:08 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11vp9dec: Drop frames on non-keyframe format change - ... in case of NVIDIA GPU - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1407> - -2021-12-02 16:04:21 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvvp9dec.c: - nvvp9sldec: Drop frames on non-keyframe format change - NVDEC doesn't seem to be able to handle the case - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1407> - -2021-12-02 16:03:14 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.h: - codecs: vp9: Drop frames on non-keyframe format change - ... if subclass does not support the case - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1407> - -2021-12-01 12:10:42 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - codecs: vp9: Also consider render_width/height - Also emits new_sequence if on keyframe and the render_width/height have - change. The subclass can always optimize this if the frame resolution - didn't change, the output caps needs to reflect this though. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1407> - -2021-11-30 10:24:37 +0100 Marc Leeman <m.leeman@televic.com> - - * gst/rtp/gstrtpsink.c: - rtpsink: set properties on children early - The properties on the udpsink/udpsrc elements need to be set before - there is any state change. If not, in a network without default gateway, - udpsink tries to bind an a NULL interface and fails. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1398> - -2021-11-30 14:48:03 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp9dec.c: - v4l2codecs: vp9: Remove uneeded picture data - The GstV4l2Request now holds a reference on the picture buffer and is - recounted already. This effectively removes usage of GRefCount which is only - available in GLib 2.58, while we support 2.56. - Fixes #910 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1402> - -2021-11-30 17:05:22 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2codecs: decoder: Add method to get the pic_buf - This helper will be needed for VP9 frame duplication. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1402> - -2021-11-30 16:08:18 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp9dec.c: - v4l2codecs: vp9: Add missing error checks in decide_allocation - This could otherwise lead to crash. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1402> - -2021-11-24 11:17:22 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264: Fix typo in comment - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1387> - -2021-11-24 11:17:40 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264: Properly set pic_num/frame_num - The V4L2 uAPI uses pic_num for both PicNum and ShortTermPicNum. It also - doe the same for both FrameNum and LongTermFrameIdx. This change does - not change the fluster score, but fixed a visual corruption noticed - with some third party streams. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1387> - -2021-11-23 16:35:16 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvasurfacecopy.c: - va: Use a lock to protect the surface copy by using vpp. - If we use vpp to do the surface copy, its operation is not atomic. - We need to maintain the filter's context unchanged during the whole - copy progress. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1373> - -2021-11-23 21:10:55 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaallocator.c: - va: Use the GstVaSurfaceCopy of the allocator atomically. - The mem_copy() of the allocator can be called simultaneously from - different threads. We should use atomic pointer operations to create - and use the GstVaSurfaceCopy of the allocator. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1373> - -2021-11-22 16:07:27 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaallocator.c: - va: DMA allocator: Set the copied memory properly when popped from pool. - The current code does not set the copied memory correctly when it is popped - from the surface cache pool. - 1. We forget to ref the allocator, which causes the allocator to be freed - unexpected, and we get a crash later because of the memory violation. - 2. We forget to add ref_mems_count, which causes the surface leak because - the surface can not be pushed back to the cache pool again. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1373> - -2021-04-22 16:29:20 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2codecs: gstv4l2decoder: set minimum sizeimage - Set minimum sizeimage such that there is enough space for any overhead - introduced by the codec. - Notably fix a vp9 issue in which a small image would not have a - bitstream buffer large enough to accomodate it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1012> - -2021-04-07 16:15:32 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp9dec.c: - v4l2codecs: gstv4l2codecsvp9dec: implement a render delay - The v4l2 backend support delayed output for performance reasons. - It is then possible to use render delays to queue multiple requests - simultaneously, thus increasing performance. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1012> - -2021-03-30 13:30:46 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp9dec.c: - * sys/v4l2codecs/gstv4l2codecvp9dec.h: - * sys/v4l2codecs/gstv4l2format.c: - * sys/v4l2codecs/linux/videodev2.h: - * sys/v4l2codecs/meson.build: - * sys/v4l2codecs/plugin.c: - v4l2codecs: vp9dec: Implement VP9 v4l2 decoder - Implement a v4l2 based vp9 decoder element based on the preexisting vp8 - v4l2 decoder. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1012> - -2021-07-14 16:21:59 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * sys/v4l2codecs/linux/v4l2-controls.h: - * sys/v4l2codecs/linux/videodev2.h: - v4l2codecs: update to the new uAPI - The new VP9 stateless API is in its way to be destaged. Update our - headers to match. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1012> - -2021-04-08 10:40:03 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - codecs: gstvp9decoder: copy frame->system_frame_number into picture - A comment in gstvp9picture.h states that picture->system_frame_number - should get its value from frame->system_frame_number, but in fact - it was never copied at all. - Fix it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1012> - -2021-04-08 10:38:55 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.h: - * gst-libs/gst/codecs/gstvp9statefulparser.c: - * gst-libs/gst/codecs/gstvp9statefulparser.h: - codecs: gstvp9{decoder|statefulparser}: optionally parse compressed headers - Rework gstvp9{decoder|statefulparser} to optionally parse compressed headers. - The information in these headers might be needed for accelerators - downstream, so optionally parse them if downstream requests it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1012> - -2021-11-23 20:12:06 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * tests/check/elements/webrtcbin.c: - webrtcbin: deduplicate extmaps - When an extmap is defined twice for the same ID, firefox complains and - errors out (chrome is smart enough to accept strict duplicates). - To work around this, we deduplicate extmap attributes, and also error - out when a different extmap is defined for the same ID. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1383> - -2021-11-23 13:30:17 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - codecs: mpeg2decoder: drain() only when significant sequence changes. - There are a lot of info in the mpeg2's sequence(also including ext - display_ext and scalable_ext). We need to notify the subclass about - its change, but not all the changes should trigger a drain(), which - may change the output picture order. For example, the matrix changes - in sequence header does not change the decoder context and so no need - to trigger a drain(). - Fixes: #899 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1375> - -2021-11-23 23:52:18 +0900 Seungha Yang <seungha@centricular.com> - - * ext/openjpeg/gstopenjpegenc.h: - openjpegenc: Fix build warning - Compiling C object subprojects/gst-plugins-bad/ext/openjpeg/gstopenjpeg.dll.p/gstopenjpegenc.c.obj - ../subprojects/gst-plugins-bad/ext/openjpeg/gstopenjpegenc.c(416): - warning C4133: '=': incompatible types - from 'GstFlowReturn (__cdecl *)(GstVideoEncoder *,GstVideoCodecFrame *)' to - 'gboolean (__cdecl *)(GstVideoEncoder *,GstVideoCodecFrame *)' - ../subprojects/gst-plugins-bad/ext/openjpeg/gstopenjpegenc.c(418): - warning C4133: '=': incompatible types - from 'GstFlowReturn (__cdecl *)(GstVideoEncoder *,GstVideoCodecFrame *)' to - 'gboolean (__cdecl *)(GstVideoEncoder *,GstVideoCodecFrame *)' - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1378> - -2021-11-23 09:28:57 +0100 Guillaume Desmottes <guillaume.desmottes@onestream.live> - - * ext/gs/gstgssink.cpp: - gssink: add metadata property - This property can be used to set metadata on the storage object. - Similar API has been added to the S3 sink already, see - https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/613 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1377> - -2021-11-23 00:25:07 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11bufferpool.cpp: - * gst-libs/gst/d3d11/gstd3d11utils.cpp: - d3d11: Update comments - Remove copy & paste mistake (this is not GstGL) and add more - description. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1374> - -2021-11-19 15:13:28 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvabasetransform.c: - * sys/va/gstvabasetransform.h: - * sys/va/gstvadeinterlace.c: - * sys/va/gstvavpp.c: - vapostproc, vadeinterlace: don't transform caps if no intersection. - If caps to transform don't intersect with those supported by the VA - filter (VAEntrypointVideoProc) then return them as is, because only - pass-through mode is the only possibility. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1369> - -2021-11-16 10:40:03 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Append featured caps rather than merge. - So it would be possible to honor upstream preference. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1369> - -2021-10-25 19:22:05 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Remove dead code. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1369> - -2021-10-25 19:22:19 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: Validate input parameter in internal function. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1369> - -2021-11-15 10:15:38 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: log drm modifier - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1369> - -2021-11-22 17:34:22 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvavpp.c: - va: vpp: Fix the memory leak in fixate_caps(). - For the BaseTransform class, the function of fixate_caps(), takes - the ownership of "othercaps". So we should clear it in our subclass. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1372> - -2021-11-13 12:22:36 +0000 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/player/gstplayer.c: - player: Ensure the GstPlay is created before the wrapped renderer - The GstPlayerWrappedVideoRenderer implicitely depends on GstPlay. - Fixes #878 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1345> - -2021-11-13 12:17:23 +0000 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/play/gstplay.c: - play: Allow runtime configuration of video-renderer - This is a requirement for GstPlayer when using the default overlay interface - provided by the pipeline. The GstPlayerWrappedVideoRenderer requires a valid - pipeline, but that's available only after the GstPlay thread has successfully - started. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1345> - -2021-11-19 19:02:20 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvadecoder.c: - va: decoder: Also ref the display when duplicating pictures. - The _destroy_buffers() will check the display handle using the - g_return_val_if_fail. we should not generate the invalid pointer - warning. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1368> - -2021-11-17 22:51:00 +0900 Seungha Yang <seungha@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - docs: Update doc cache for Windows specific plugins - Updating doc cache for d3d11, mediafoundation and wasapi2 plugins - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1360> - -2021-11-18 00:16:41 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2sink.c: - wasapi2: Fix typo in doc - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1360> - -2021-11-17 22:46:17 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfh264enc.cpp: - * sys/mediafoundation/gstmfh265enc.cpp: - * sys/mediafoundation/gstmfvideoenc.cpp: - * sys/mediafoundation/gstmfvp9enc.cpp: - * sys/mediafoundation/plugin.c: - mediafoundation: Skip doc for non-default encoder elements - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1360> - -2021-10-21 19:41:15 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11av1dec.cpp: - * sys/d3d11/gstd3d11deinterlace.cpp: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - * sys/d3d11/plugin.cpp: - d3d11: Stop doc for non-default decoder and deinterlacer elements - Just skip doc for non-default decoder/deinterlacer elements - since there are multiple element in case that system has - multiple GPUs. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1360> - -2021-11-19 13:27:54 +0900 Wonchul Lee <wonchul.dev@gmail.com> - - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11: Fix deadlock while doing unprepare - ShowWindow() could be blocked while doing gst_d3d11_window_win32_unprepare - when external window handle provided to d3d11videosink in multi-threaded - environment. - The condition that issue happened is, UI thread is waiting for a - background thread that changes d3d11videosink state to NULL, and the - background thread would try to send a window message to the queue. - The queue is already occupied by the UI thread, so the background - thread will be blocked. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1366> - -2021-11-16 12:56:38 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/gstwpevideosrc.cpp: - wpevideosrc: Fix frame stuttering in GL rendering path - Make sure the EGLImage we're rendering to the GL memory stays alive long enough, - until the the GL memory has been destroyed. - This change fixes tearing and black flashes artefacts that were happening - because the EGLImage was sometimes destroyed before the sink actually rendered - the associated texture. - Fixes #889 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1354> - -2021-11-16 12:53:35 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/gstwpevideosrc.cpp: - wpevideosrc: Run through gst-indent - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1354> - -2021-11-11 19:11:25 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/rsvg/gstrsvgoverlay.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - docs: fix unnecessary ampersand, < and > escaping in code blocks - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1340> - -2020-11-05 10:23:13 +0100 Timo Wischer <timo.wischer@de.bosch.com> - - * ext/avtp/gstavtpcrfbase.c: - avtp: crf: Process also local CRF streams - Without this patch locally generated CRF streams will be ignored. - Therefore the same network interface could not be CRF talker and - CRF listener. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1074> - -2021-11-09 15:10:21 +0100 Jean Felder <jean.felder@gmail.com> - - * gst/id3tag/id3tag.c: - id3tag: Map GST_TAG_MUSICBRAINZ_RELEASETRACKID - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1331> - -2021-11-09 15:04:59 +0100 Jean Felder <jean.felder@gmail.com> - - * gst/id3tag/id3tag.c: - id3tag: Map GST_TAG_MUSICBRAINZ_RELEASEGROUPID - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1331> - -2021-11-09 15:04:00 +0100 Jean Felder <jean.felder@gmail.com> - - * gst/id3tag/id3tag.c: - id3tag: Remove trailing whitespace - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1331> - -2021-10-06 15:54:09 +0200 Timo Wischer <timo.wischer@de.bosch.com> - - * ext/avtp/gstavtpsrc.c: - avtpsrc: Use correct size for provided buffers - Without this patch the following pipeline would send packets containing - garbage in the data section. - $ gst-launch-1.0 avtpsrc ! avtpsink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1077> - -2020-10-15 14:49:58 +0200 Timo Wischer <timo.wischer@de.bosch.com> - - * ext/avtp/gstavtpcrfsync.c: - avtp: crfsync: Warn when CRF package not yet received - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1075> - -2021-03-03 10:08:57 +0100 Timo Wischer <timo.wischer@de.bosch.com> - - * tests/check/elements/avtpcrfbase.c: - test: avtp: crf: Check for rounding errors - on average period calculation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1073> - -2020-11-11 16:50:28 +0100 Timo Wischer <timo.wischer@de.bosch.com> - - * ext/avtp/gstavtpcrfbase.c: - * ext/avtp/gstavtpcrfbase.h: - * tests/check/elements/avtpcrfbase.c: - avtp: crf: Use double for average period calculation - to also support CRF intervals like every 1,333,333ns 64 events - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1073> - -2021-01-12 10:03:32 +0100 Timo Wischer <timo.wischer@de.bosch.com> - - * tests/check/elements/avtpcrfbase.c: - tests: avtp: crf: Test for timestamp_interval > 1 - in case of CRF AVTPDUs with single CRF timestamp. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1076> - -2020-09-16 17:12:32 +0200 Timo Wischer <timo.wischer@de.bosch.com> - - * ext/avtp/gstavtpcrfbase.c: - * ext/avtp/gstavtpcrfbase.h: - avtp: crf: Properly handling one timestamp per PDU - The average_period should always represent the time between two - events. The specification defines the event time as the time - between audio samples, video frame sync, video line sync, etc. - In case of one timestamp per PDU the timestamp_interval identifies - the amount of events between the timestamp of one PDU and the - timestamp of the next PDU. - As described in IEEE 1722-2016 chapter - "10.4.12 timestamp_interval field" timestamp_interval shall be - nonzero. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1076> - -2021-11-08 20:18:51 +0100 Thomas Klausner <tk@giga.or.at> - - * sys/shm/meson.build: - shm: NetBSD build fix - shm_unlink() and friends live in librt on NetBSD. Adapt build system. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1323> - -2021-05-21 16:56:33 -0300 Martin Reboredo <yakoyoku@gmail.com> - - * ext/aom/gstav1enc.c: - aom: Set fixed_qp_offsets to a deactivated value - aom only uses fixed_qp_offsets with the - Constant Quality (Q) Rate Control mode, - previously this was locking any usage - with another Rate Control mode. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1198> - -2021-11-05 13:12:14 +0100 Antonio Ospite <antonio.ospite@collabora.com> - - * sys/magicleap/meson.build: - magicleap: update lumin_rt libraries names to the latest official version - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1314> - -2021-10-05 01:07:57 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264dec: Calculate the latency by its bump mode. - The current latency calculation just uses the num_reorder_frames, - which is not very precise. We should consider the bump mode of the - DPB, the faster it bumps, the lower latency we will have. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1046> - -2021-11-04 19:06:22 +0000 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/nvcodec/gstcudabasefilter.c: - * sys/nvcodec/gstcudabasetransform.c: - * sys/nvcodec/gstcudaconvert.c: - * sys/nvcodec/gstcudadownload.c: - * sys/nvcodec/gstcudascale.c: - * sys/nvcodec/gstcudaupload.c: - * sys/nvcodec/gstnvdec.c: - doc: Update nvdec documentation - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/870 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1309> - -2021-11-03 17:09:52 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: Don't insert extra AUD if exists in bitstream already - AUD nalu in packetized format is completely valid and therefore we should not - assume that we should insert AUD for packetized -> bytestream - conversion. - Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/862 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1296> - -2021-11-03 20:36:09 +0900 Seungha Yang <seungha@centricular.com> - - * tests/check/elements/h264parse.c: - tests: h264parse: Add test for AUD insertion - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1296> - -2021-11-04 16:36:05 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2ringbuffer.cpp: - wasapi2ringbuffer: Fix client object leak - Check whether ringbuffer is holding client object already since - open_device() may be called multiple times - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1307> - -2021-11-04 12:48:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Clear errors from finding codec preferences before the next iteration - The media is just skipped and the error is not propagated to the caller, - so keeping it around here would cause assertions a bit later when trying - to set a new error over the old one. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1291> - -2021-11-04 12:45:34 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Move addition of attributes to the caps after making sure they're not empty or any - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1291> - -2021-11-02 11:21:34 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Don't require fixed caps when querying caps for a transceiver pad to match it with a media - Upstream caps might for example be - application/x-rtp,media=audio,encoding-name={OPUS, X-GST-OPUS-DRAFT-SPITTKA-00, multiopus} - and while that is not fixed caps it is enough to match it with a media. - Only caps structures that have the correct structure name and that have - the media and encoding-name field are preserved, but if both are present - then these caps are used as "codec preferences". - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1291> - -2021-11-03 18:44:03 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - Back to development - -=== release 1.19.3 === - -2021-11-03 15:43:36 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * gst-plugins-bad.doap: - * meson.build: - Release 1.19.3 - -2021-11-03 15:43:32 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - Update ChangeLogs for 1.19.3 - -2021-11-02 09:40:43 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - codecs: mpeg2: Drain before a new_sequence get signalled - The decoder may need to re-allocate the output buffer, it is easier if all - pictured have been outputed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1013> - -2021-04-08 16:24:49 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * sys/v4l2codecs/gstv4l2codecmpeg2dec.c: - v4l2codecs: gstv4l2codecsmpeg2dec: implement a render delay - The v4l2 backend support delayed output for performance reasons. - It is then possible to use render delays to queue multiple requests - simultaneously, thus increasing performance. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1013> - -2021-04-08 16:07:23 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - * gst-libs/gst/codecs/gstmpeg2decoder.h: - codecs: gstmpeg2decoder: add support for render delay - Some decoding APIs support delayed output for performance reasons. - One example would be to request decoding for multiple frames and - then query for the oldest frame in the output queue. - This also increases throughput for transcoding and improves seek - performance when supported by the underlying backend. - Introduce support in the mpeg2 base class, so that backends that - support render delays can actually implement it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1013> - -2021-04-06 16:40:28 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * sys/v4l2codecs/gstv4l2codecmpeg2dec.c: - * sys/v4l2codecs/gstv4l2codecmpeg2dec.h: - * sys/v4l2codecs/meson.build: - * sys/v4l2codecs/plugin.c: - v4l2codecs: Implement a MPEG2 V4L2 decoder element - Implement a MPEG2 V4L2 decoder element based on the previous h264 - implementation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1013> - -2021-04-06 16:42:54 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * sys/v4l2codecs/linux/videodev2.h: - v4l2codecs: mpeg2: update to the new uAPI - The mpeg2 stateless api has undergone changes as it is being - destage. Update the v4l2-controls header to match. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1013> - -2021-03-26 15:52:21 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * sys/va/gstvampeg2dec.c: - sys: va: GstVaMpeg2Dec: use slice sc_offset and size - Seeing as how GstMpeg2Slice will now record the start code offset - as well as its size with the above field taken into account, the - manual computation in this class is not needed. - Remove it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1013> - -2021-03-26 15:31:51 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - * gst-libs/gst/codecs/gstmpeg2picture.h: - codecs: GstMpeg2Slice: add field for sc_offset and size - Downstream might need the start code offset when decoding. - Previously this computation would be scattered in multiple sites. This - is error prone, so move it to the base class. Subclasses can access - slice->sc_offset directly without computing the address themselves - knowing that the size will also take the start code into account. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1013> - -2021-10-20 12:11:49 +0100 James Cowgill <james.cowgill@blaize.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - v4l2codecs: Handle allocator creation failure - If `VIDIOC_REQBUFS` doesn't return enough buffers the allocator creation - function can fail and return `NULL`. Handle this by generating an error - and returning instead of segfaulting. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1220> - -2021-10-20 12:08:49 +0100 James Cowgill <james.cowgill@blaize.com> - - * sys/v4l2codecs/gstv4l2codecallocator.c: - v4l2codecs: Fix segfault when destroying non-detached allocator - The GstV4l2CodecAllocator dispose function clears `self->decoder` but - the finalize function then tries to use it if the allocator has no been - detached yet. - Fix by detaching in the dispose function before we clear - `self->decoder`. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1220> - -2021-10-29 16:08:20 -0400 Julian Bouzas <julian.bouzas@collabora.com> - - * gst/codecalpha/gstalphacombine.c: - alphacombine: use the same allocation query data for both decoders - This allows downstream elements to set allocation query parameters for both - decoders, which should be always the same. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1277> - -2021-10-31 13:43:40 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - applemedia: Add ARGB64_BE, RGBA64_LE support to vtenc/vtdec - We can add this now that ARGB64_BE videoconvert support was added in: - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1247 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1214> - -2021-10-20 02:19:33 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: Add FieldDetail properties for interlaced input - Standard interlace handling: - * If we have interlace-mode=interleaved and the field order, we just - set it when creating the session - * If we have interlace-mode=(interleaved|mixed) and no field order, we - set the field order on the first buffer - The encoder session does not support changing the FieldDetail after it - has started encoding frames, so we cannot support mixed streams - correctly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1214> - -2021-10-20 01:49:29 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: Add a property to forcibly ignore alpha values - This PropertyKey is not documented in any headers anywhere, so we need - to define it ourselves. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1214> - -2021-10-19 23:53:39 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Set colorimetry information - It looks like VideoToolbox doesn't support all our colorimetries. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1214> - -2021-10-17 18:54:10 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/coremediabuffer.h: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - * sys/applemedia/vtutil.c: - * sys/applemedia/vtutil.h: - applemedia: Add ProRes support to vtenc and vtdec - For vtdec, we continue to prefer NV12; else we pick whatever - downstream wants. In the special case where we're decoding 10-bit or - 12-bit ProRes formats, we will prefer AYUV64. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1214> - -2021-10-17 19:19:15 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Improve error reporting in chain function - Otherwise it is quite difficult to figure out why the chain function - failed. Also assert not reached for case statements that should not be - hit. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1214> - -2021-10-14 12:14:49 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: Remove dead code in switch statement - We never advertise these formats, so these cases will never be hit. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1214> - -2021-10-30 16:22:39 +0300 Sebastian Dröge <sebastian@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - video: Fix order of new video formats - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1282> - -2021-10-30 00:58:55 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsmux/gstatscmux.c: - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/gstmpegtsmux.c: - Couple more g_memdup() -> g_memdup2() fixes - Fixes deprecation warnings with newer GLib versions. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1279> - -2021-10-30 00:52:42 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/dtls/gstdtlssrtpenc.c: - dtls: don't use deprecated g_binding_get_source() with newer GLib versions - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1279> - -2021-10-30 01:41:51 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - codecs: h265decoder: Fix per-slice leak - As documented, slice header parsed via gst_h265_parser_parse_slice_hdr() - should be cleared, otherwise it would result in memory leak. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1274> - -2021-10-26 16:05:24 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - * sys/va/gstvah265dec.c: - * sys/va/gstvampeg2dec.c: - * sys/va/gstvavp8dec.c: - * sys/va/gstvavp9dec.c: - va: Delay decoders downstream negotiation. - Delay decoders downstream negotiation just before an output frame - needs to be allocated. - This is required, are least for H.264 and H.265 decoders, since - codec_data might trigger a new sequence before finishing upstream - negotiation, and sink pad caps need to set before setting source pad - caps, particularly to forward HDR fields. The other decoders are - changed too in order to keep the same structure among them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1257> - -2021-10-26 09:41:53 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvabasedec.c: - vabasedec: Move warning message to decoder's category. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1257> - -2021-10-26 09:28:10 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaav1dec.c: - * sys/va/gstvabasedec.h: - * sys/va/gstvah264dec.c: - * sys/va/gstvah265dec.c: - * sys/va/gstvampeg2dec.c: - * sys/va/gstvavp8dec.c: - * sys/va/gstvavp9dec.c: - va: Move common variable need_negotiation to GstBaseDec. - This is a common variable to all decoders, so it's sound to move it to - the base helper. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1257> - -2021-10-26 09:23:42 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaav1dec.c: - * sys/va/gstvabasedec.c: - * sys/va/gstvabasedec.h: - * sys/va/gstvah264dec.c: - * sys/va/gstvah265dec.c: - * sys/va/gstvampeg2dec.c: - * sys/va/gstvavp8dec.c: - * sys/va/gstvavp9dec.c: - va: Move back parent_object to each element. - Using GstBaseDec hack to access the parent_object of each element in - the element itself is a bit fragile. It would be better to keep its - own parent object as the usual global variable. It would make it - resistant to code changes. - The GstBaseDec macro to access the parent object now it's internal to - base decoder. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1257> - -2021-10-23 00:44:57 +0200 Piotrek Brzeziński <piotr@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - video-format: Add support for ARGB64 LE/BE and similar variants - Co-authored-by: Sebastian Dröge <sebastian@centricular.com> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1247> - -2021-09-26 21:34:30 +0200 Heiko Becker <heirecka@exherbo.org> - - * ext/neon/meson.build: - neon: Allow building against neon 0.32.x - No API/ABI changes: https://github.com/notroj/neon/blob/0.32.0/NEWS#L3 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1267> - -2021-10-25 11:37:45 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: require matching GStreamer dep versions for unstable development releases - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/929 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1244> - -2021-10-27 00:20:57 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/webrtctransceiver.c: - webrtcbin: fix check_negotiation computing on caps event - It seems logical that check_negotiation be true if received_caps - is *not* equal to the new caps. - Also clean up handling of transceivers' ssrc events, as this - patch triggered a leaky code path. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1233> - -2021-10-23 01:54:05 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: connect input stream when receiving caps - .. if a current direction has already been set - When `webrtcbin` has created an offer based on codec_preferences, - it might not have received caps on its sinkpads by the time a - remote description is set, in which case we want to connect the - input stream upon actual reception of the caps instead. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1233> - -2021-10-18 15:23:48 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: consider pads with trans->codec_preferences ready - .. when determining whether we can emit on-negotiation-needed - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1233> - -2021-10-28 17:41:54 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparse: fix criticals trying to insert configs that don't exist yet - With mpeg4videoparse drop=false config-interval=N|-1 we might be - trying to insert a config before we have actually received one, - in which case we'll try to map a NULL buffer which will generate - lots of criticals. - Fixes #855 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1265> - -2021-10-20 17:46:10 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - msdk: Insert hdr sei at hevc encoder - There are two HDR SEIs defined in spec: mastering display colour volume and - content light level. Add insertion of HDR SEIs when they are available - during encoding. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1242> - -2021-10-21 16:12:06 +0100 Rob Agar <rob@engineeredarts.co.uk> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Also check data channel transport when collating connection state - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/838 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1224> - -2021-10-27 11:54:09 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Color fixation will choose othercaps' structure. - gst_va_fixate_format() will iterate all othercaps' structures to find - the one with less information lost at color conversion. If a structure - with same color format is found, the iteration stops. It's like a - smart truncation. Then, this function also will choose the caps - feature. - Later this structure is used fixate its size and no further truncation - is needed. - Don't intersect at fixate, since it kills possible resizing. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1261> - -2021-10-27 11:53:28 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Ignore direction at orientation swapping. - It doesn't matter the direction of the negotiation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1261> - -2021-10-27 10:31:04 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Consider video orientation for border calculation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1261> - -2021-10-06 16:00:56 +0200 Timo Wischer <timo.wischer@de.bosch.com> - - * ext/avtp/gstavtpsrc.c: - avtpsrc: Retry receive with same buffer size - Without this patch in case of a retry recv() will be called with a - negative size argument. - Signed-off-by: Timo Wischer <timo.wischer@de.bosch.com> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1078> - -2021-10-26 16:00:36 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - cccombiner: fix default value when installing schedule property - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1252> - -2021-10-26 15:58:26 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - cccombiner: fix emission of selected-samples in one case - Detected while reading the code, cccombiner must set - self->current_video_buffer to NULL *after* emitting selected-samples - in order for the application to get a useful return when peeking - the next video sample. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1252> - -2021-10-26 01:09:58 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - * tests/check/elements/cccombiner.c: - cccombiner: stop attaching caption buffers when caption pad has gone EOS - When schedule is true (as is the case by default), we insert padding - when no caption data is present in the schedule queue, and previously - weren't checking whether the caption pad had gone EOS, leading to - infinite scheduling of padding after EOS on the caption pad. - Rectify that by adding a "drain" parameter to dequeue_caption() - In addition, update the captions_and_eos test to push valid cc_data - in: without this cccombiner was attaching padding buffers it had - generated itself, and with that patch would now stop attaching - said padding to the second buffer. By pushing valid, non-padding - cc_data we ensure a caption buffer is indeed attached to the first - and second video buffers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1252> - -2021-10-20 13:19:00 +0200 Mats Lindestam <matslm@axis.com> - - * ext/curl/gstcurlsshsink.c: - * ext/curl/gstcurlsshsink.h: - * tests/check/elements/curlsftpsink.c: - curlsftpsink: Add support for sha256 fingerprint - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1193> - -2021-10-21 11:09:07 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: Add 12bit formats - Add 12bit formats for different chroma samplings at sink pad and - src pad, including P012_LE, Y212_LE and Y412_LE. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1218> - -2021-10-25 18:52:24 +0200 Floris <weersproductions@gmail.com> - - * ext/gs/README.md: - gs: update README to use fixed versions - Use specific versions, instead of relying on 'master'. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1246> - -2021-10-25 18:47:46 +0200 Floris <weersproductions@gmail.com> - - * ext/gs/gstgssrc.cpp: - gssrc: use default blocksize - The blocksize is set to 3 * 1024 * 1024 / 2, which is the default download_size of Google-Cloud-CPP. - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/846 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1246> - -2021-10-25 16:53:14 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah265dec.c: - vah265dec: Fix end_picture() vmethod. - Since commit 88437a9c the signature of h265decoder's end_picture() - changed to return GstFlowReturn, but vah265dec was not updated. - This commit fixes this regression. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1248> - -2021-10-12 17:32:30 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * sys/va/gstvaallocator.c: - va: allocator: Fix possible memory leaks - At gst_va_dmabuf_allocator_setup_buffer_full, static code analysis tool - does not know number of objects in descriptor is always larger than 0 if - export_surface_to_dmabuf succeeds. Thus, the tool will assume buf is - allocated with mem but not released when desc.num_objects equals to 0 - and raise a mem leak issue. - For gst_va_dambuf_memories_setup, we should also inform the tool that - n_planes will be larger than 0 by checking the value at very beginning. - Then, the defect similar to above will not be raised during static analysis. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1241> - -2021-10-25 01:02:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * po/af.po: - * po/ast.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/fur.po: - * po/gl.po: * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: * po/zh_CN.po: - * po/zh_TW.po: gst-plugins-bad: update translations - Fixes #656 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1240> - -2021-10-23 19:26:06 +0200 Andoni Morales Alastruey <amorales@fluendo.com> - - * gst-libs/gst/d3d11/gstd3d11device.cpp: - d3d11: add support for new debug layer versions - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1237> - -2021-01-20 12:04:48 +0100 Rafał Dzięgiel <rafostar.github@gmail.com> - - * ext/assrender/gstassrender.c: - assrender: Add "application/vnd.ms-opentype" mimetype detection - The "application/vnd.ms-opentype" mimetype is commonly used in many fonts attached in the matroska videos. - Assrender should treat it as compatible without the need of parsing the file extension. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1207> - -2021-10-22 18:13:46 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/openjpeg/meson.build: - wrap: libopenjp2: use patch version 7 - Add support for win32 build - Disable the binary to avoid the thirdparty - dependency to be checked. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1229> - -2021-10-21 23:35:41 -0300 Martin Reboredo <yakoyoku@gmail.com> - - * gst-libs/gst/vulkan/gstvkutils.c: - * gst-libs/gst/vulkan/gstvkutils.h: - gstvulkan: Constify code in create_shader - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1226> - -2021-10-21 00:33:06 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson_options.txt: - meson: default to gpl=disabled for gst-plugins-bad and -ugly - This will only affect individual/tarball module builds, as the - options yield to the parent project which was set to gpl=disabled - by default already. We kept it as auto in the original commit - to accommodate the need to update cerbero as well, which had to - be done separately after the initial commit. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1217> - -2021-01-20 13:38:03 +0100 Rafał Dzięgiel <rafostar.github@gmail.com> - - * ext/assrender/gstassrender.c: - assrender: Do not iterate over mimetypes without filename - No point spending time on iterating and comparing strings if we - are going to reject the value due to missing filename anyway. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1206> - -2021-01-20 11:46:17 +0100 Rafał Dzięgiel <rafostar.github@gmail.com> - - * ext/assrender/gstassrender.c: - assrender: Fix mimetype detection - Previously gst_structure_has_name was used to get a string to compare with supported mimetypes. - This is incorrect as above function returns a user defined structure name which is - not the structure mimetype value. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1206> - -2021-10-21 19:17:18 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdebug.c: - * gst-libs/gst/vulkan/gstvkdebug.h: - * gst-libs/gst/vulkan/gstvkswapper.c: - vulkan/swapper: add some debug logging for surface size and present modes - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1219> - -2021-10-21 00:28:25 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/interlace/gstinterlace.c: - interlace: Replace custom lock with object lock - The object lock is sufficient for the task of protecting against - object property data races. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1039> - -2021-10-21 00:37:47 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/interlace/gstinterlace.c: - interlace: Protect all properties with the lock - Avoid blatant data races here. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1039> - -2021-10-21 00:36:47 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/interlace/gstinterlace.c: - interlace: Reset src_fps_d together with src_fps_n - These fields belong together. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1039> - -2021-10-21 00:35:00 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/interlace/gstinterlace.c: - interlace: Clear stored_fields together with stored_frame - These fields belong together. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1039> - -2021-10-21 00:31:24 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/interlace/gstinterlace.c: - interlace: Reset after changing state to READY - Trying to reset before the pads have been deactivated races with the - streaming thread. There was also a buggy buffer clear leaving a dangling - `stored_frame` pointer around. Use `gst_interlace_reset` so this happens - properly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1039> - -2021-10-20 14:34:42 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvh264enc.c: - nvh264enc: add constrained-baseline to the caps profiles - In practice, when baseline is requested from the encoder it - produces constrained baseline, and it is already reflected - in the profile-iop flags. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1213> - -2021-10-21 01:47:07 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfplatloader.c: - * sys/mediafoundation/meson.build: - mediafoundation: Fix for UWP build - We don't support D3D11 interop for UWP because some APIs - (specifically MFTEnum2) are desktop application only. - However, the code for symbol loading is commonly used by both UWP and WIN32. - Just link GModule unconditionally which is UWP compatible, and simply don't - try to load any library/symbol dynamically when D3D11 interop is unavailable. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1216> - -2021-10-20 00:54:26 +0100 Tim-Philipp Müller <tim@centricular.com> - - * REQUIREMENTS: - * docs/plugins/gst_plugins_cache.json: - * ext/libmms/gstmms.c: - * ext/libmms/gstmms.h: - * ext/libmms/meson.build: - * ext/meson.build: - * meson_options.txt: - mms: remove mmssrc plugin - Doubtful that anyone still needs that or there are even - any streams left out there. - MMS was deprecated in 2003 (in favour of RTSP) and support for - it was dropped with Microsoft Media Services 2008. - https://en.wikipedia.org/wiki/Microsoft_Media_Server - https://sdp.ppona.com/news2008.html - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/821 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1211> - -2021-10-19 18:18:25 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/msdk/meson.build: - * sys/va/meson.build: - meson: va, msdk: simplify dep.get_variable() use - With recent Meson versions we can just write dep.get_variable('foo') - instead of dep.get_variable(pkgconfig: 'driverdir', internal: 'driverdir'). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1183> - -2021-10-18 15:47:00 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/meson.build: - * tests/validate/meson.build: - meson: update for meson.build_root() and .build_source() deprecation - -> use meson.project_build_root() or .global_build_root() instead. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1183> - -2021-10-18 00:40:14 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/meson.build: - * ext/onnx/meson.build: - * ext/opencv/meson.build: - * ext/wayland/meson.build: - * meson.build: - * sys/msdk/meson.build: - * tests/check/meson.build: - meson: update for dep.get_pkgconfig_variable() deprecation - ... in favour of dep.get_variable('foo', ..) which in some - cases allows for further cleanups in future since we can - extract variables from pkg-config dependencies as well as - internal dependencies using this mechanism. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1183> - -2021-10-18 00:03:47 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: clean up conditional paths after version bump - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1183> - -2020-11-19 18:03:11 +0100 Rafał Dzięgiel <rafostar.github@gmail.com> - - * ext/assrender/gstassrender.c: - assrender: fix smooth scaling by disabling hinting - When ass hinting value is set to anything other than NONE, - subtitles cannot use smooth scaling, thus all animations will jitter. - The libass author warns about possibility of breaking some scripts when it is enabled, - so lets do what is recommended and disable it to get the smooth scaling working. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1201> - -2021-05-07 11:11:31 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtsink.c: - srt: Plug leak of headers - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1040> - -2020-08-31 17:17:56 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/gstbasetsmux.c: - mpegtsmux: Avoid crash when best pad gets flushed - The 'best' pad might receive a flush event between us picking it and us - popping the buffer. In this case, the buffer will be missing. - Similar to https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/711 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1042> - -2021-10-17 11:39:57 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tools/meson.build: - tools: Define G_LOG_DOMAIN for various tools as well - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1009> - -2021-10-01 15:31:18 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/adaptivedemux/meson.build: - * gst-libs/gst/audio/meson.build: - * gst-libs/gst/basecamerabinsrc/meson.build: - * gst-libs/gst/codecparsers/meson.build: - * gst-libs/gst/codecs/meson.build: - * gst-libs/gst/d3d11/meson.build: - * gst-libs/gst/insertbin/meson.build: - * gst-libs/gst/interfaces/meson.build: - * gst-libs/gst/isoff/meson.build: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/opencv/meson.build: - * gst-libs/gst/play/meson.build: - * gst-libs/gst/player/meson.build: - * gst-libs/gst/sctp/meson.build: - * gst-libs/gst/transcoder/meson.build: - * gst-libs/gst/uridownloader/meson.build: - * gst-libs/gst/va/meson.build: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/wayland/meson.build: - * gst-libs/gst/webrtc/meson.build: - * gst-libs/gst/winrt/meson.build: - gst-plugins-bad: define G_LOG_DOMAIN for all libraries - Fixes #634 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1009> - -2021-10-06 13:38:35 +0200 Antonio Ospite <antonio.ospite@collabora.com> - - * ext/aes/meson.build: - aes: specify the required OpenSSL version - The code in the aes elements assumes OpenSSL >= 1.1.0: - - implicit library initialization; - - version retrieved with OpenSSL_version(OPENSSL_VERSION); - and it fails to build with older versions. - Specify the required OpenSSL version explicitly in meson.build so that - the elements are excluded on older systems (e.g. Ubuntu 16.04) and the - rest of GStreamer can still build. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1067> - -2021-10-11 13:05:24 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadeinterlace.c: - vadeinterlace: Accept ANY feature. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1024> - -2021-10-11 13:04:19 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadeinterlace.c: - vadeinterlace: Fixate interlace-mode and framerate accordingly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1024> - -2021-10-14 07:03:26 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Accept ANY feature. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1024> - -2021-10-13 19:27:41 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Traverse caps features in gst_va_vpp_caps_remove_fields() - The previous code had a potential failure for multiple caps features. Now - each caps feature in each structure is reviewed, and if it has a supported - feature, the structure is processed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1024> - -2021-10-13 17:08:12 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Refactor gst_va_vpp_complete_caps_features() - gst_va_vpp_complete_caps_features() now receives the @feature_name to - add and return if @caps doesn't provide it. - So, instead of two nested loops, now the function is a single loop, - traversing @caps to find if each structure already contains the requested - @features_name. - It's important to add missing caps features with @caps, in order to - not lost information. - The function caller does the external loop by calling per each - available caps feature. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1024> - -2021-10-11 18:57:48 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Split caps transform in two phases. - In order to make more readable the caps transformation, the operation - was split in two phases: - 1. Rangify the supported caps structures. - 2. Add the missing (and supported) caps features. - Step 1 modified its logic, by copying any unrecognized structure. - It's a previous step required for allowing ANY caps feature as - passthrough. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1024> - -2021-10-08 12:38:04 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Change many GST_{DEBUG, LOG, etc} into _OBJECT - Log files with several demuxers running at once can otherwise get - confusing - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1096> - -2021-10-08 12:36:58 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Issue GST_ELEMENT_WARNING for continuity errors - The application might want to make use of these. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1096> - -2021-10-14 18:38:26 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: bump meson requirement to >= 0.59 - For monorepo build and ugly/bad, for advanced feature - option API like get_option('xyz').required(..) which - we use in combination with the 'gpl' option. - For rest of modules for consistency (people will likely - use newer features based on the top-level requirement). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1084> - -2021-09-19 00:55:34 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/dts/meson.build: - * ext/faad/meson.build: - * ext/iqa/iqa.c: - * ext/iqa/meson.build: - * ext/mpeg2enc/meson.build: - * ext/mplex/meson.build: - * ext/resindvd/meson.build: - * ext/x265/meson.build: - * meson.build: - * meson_options.txt: - meson: add 'gpl' option and only build plugins with (A)GPL deps if explicitly enabled - Require explicit opt-in to build plugins with (A)GPL dependencies. - Keep ugly/bad options on 'auto' for now so cerbero doesn't fail. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1084> - -2020-10-30 16:02:22 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsmux/gstbasetsmux.c: - basetsmux: Support for caps changes - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/981> - -2020-11-12 12:17:14 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/gstbasetsmux.c: - basetsmux: Clean up gst_base_ts_mux_create_stream - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/981> - -2021-08-31 16:35:06 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Search SCTE-35 DRF_ID_CUEI in multiple registration descriptors - There are streams in the wild that have to add a SCTE-35 trigger in - another e.g. GA94 stream. Most encoders would replace the GA94 - descriptor ID with the CUEI one temporarily, but there are some that - will add two registration ID descriptors, one with GA94 and one with - CUEI. - Failing to parse the CUEI registration ID in that case would return - FALSE in _stream_is_private_section , therefore setting it as known PES - and pushing packets downstream instead of calling handle_psi. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/979> - -2021-10-01 14:36:48 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Improve gap detection - We should also take into account whether data is currently pending when checking - for gap on streams. It could very well be that some streams have very low - bitrate (and spread out) data. For those we don't want to push out a gap event. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1179> - -2021-09-05 11:57:18 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Handle "negative" timestamps - This is only enabled in push time mode. Furthermore it's only enabled for now if - PCR is to be ignored. - The problem is dealing with streams where the initial PTS/DTS observation might - be greater than following ones (from other PID for example). Before this patch, - this would result in sending buffers without any timestamp which would cause a - wide variety of issues. - Instead, pad segment and buffer timestamps with an extra - value (packetizer->extra_shift, default to 2s), to ensure that we can get valid - timestamps on outgoing buffers (even if that means they are before the segment - start). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1179> - -2021-09-05 11:55:55 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Handle streams with bogus PTS vs DTS - PTS and DTS should be within a reasonable distance of each other. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1179> - -2021-09-05 11:53:05 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - tsdemux: Handle PTS->TS at wraparound - This has been a FIXME for ages. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1179> - -2021-10-14 14:07:07 +0100 Rob Agar <rob@engineeredarts.co.uk> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: fix prevention of webrtcbin deletion due to ref held by probe callback - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/810 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1150> - -2021-10-16 19:01:27 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11convert.cpp: - d3d11: d3d11{convert,scale}: Add add-borders property - Functionally identical to that of videoscale element. - When disabled, d3d11convert or d3d11scale element will scale - image without adding borders, meaning that display aspect ratio - will not be preserved. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1170> - -2021-10-16 10:58:53 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - * sys/va/gstvavpp.c: - vapostproc: Add add-borders property to keep dar - Just as videoscale, it enables add-borders property (FALSE by default) - in vapostproc to add border, if necessary, to keep the display aspect - ratio from the original image. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1169> - -2021-10-16 10:51:57 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Fix early fixation. - First copy missing fields and then fixate all remaining fields. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1169> - -2021-10-14 19:08:49 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/meson.build: - * ext/ofa/gstofa.c: - * ext/ofa/gstofa.h: - * ext/ofa/meson.build: - * meson_options.txt: - * tests/check/elements/ofa.c: - ofa: remove ofa audio fingerprinting plugin - I think the MusicIP database for this has been defunct for years, - so I can't imagine this plugin is particularly useful or still - used by anyone. - See https://musicbrainz.org/doc/Fingerprinting#PUID - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1153> - -2021-10-16 22:43:32 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/meson.build: - * sys/wasapi2/meson.build: - meson: wasapi2,mediafoundation: Work around Windows SDK header issue - Some SDK headers are not standard compliant, so MSVC will - complain when such headers are in use with "/permissive-" compile - option. Use "/Zc:twoPhase-" to work around the issue as documented in - https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=msvc-160#windows-header-issues - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1174> - -2021-10-16 09:29:28 -0300 Thibault Saunier <tsaunier@igalia.com> - - * ext/fdkaac/meson.build: - meson: Mark newly fdkaac/ogg/vorbis as allow fallback - This way when the dep is `auto` we will fallback if the system - dependency is not available. - And use https to get libvorbis - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1171> - -2021-10-16 01:15:06 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfplatloader.c: - * sys/mediafoundation/gstmfplatloader.h: - * sys/mediafoundation/gstmftransform.cpp: - * sys/mediafoundation/gstmftransform.h: - * sys/mediafoundation/gstmfvideoenc.cpp: - * sys/mediafoundation/meson.build: - * sys/mediafoundation/plugin.c: - mediafoundation: Use GetProcAddress() for OS version dependent symbols - We are using some symbols which are not available on Windows 7, - specifically D3D11 interop related ones - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1167> - -2021-10-06 03:26:25 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Transfer colorimetry at fixate if possible. - Taken from videoconvert element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1110> - -2021-10-12 15:52:48 -0300 Thibault Saunier <tsaunier@igalia.com> - - * docs/meson.build: - meson: Streamline the way we detect when to build documentation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1093> - -2020-06-27 00:39:00 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/meson.build: - * gst-libs/gst/adaptivedemux/meson.build: - * gst-libs/gst/audio/meson.build: - * gst-libs/gst/basecamerabinsrc/meson.build: - * gst-libs/gst/codecparsers/meson.build: - * gst-libs/gst/codecs/meson.build: - * gst-libs/gst/d3d11/meson.build: - * gst-libs/gst/insertbin/meson.build: - * gst-libs/gst/interfaces/meson.build: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/opencv/meson.build: - * gst-libs/gst/play/meson.build: - * gst-libs/gst/player/meson.build: - * gst-libs/gst/sctp/meson.build: - * gst-libs/gst/transcoder/meson.build: - * gst-libs/gst/uridownloader/meson.build: - * gst-libs/gst/va/meson.build: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/wayland/meson.build: - * gst-libs/gst/webrtc/meson.build: - * meson.build: - meson: List libraries and their corresponding gir definition - Introduces a `libraries` variable that contains all libraries in a - list with the following format: - ``` meson - libraries = - pkg_name, { - 'lib': library_object - 'gir': {full gir definition in a dict } - , - .... - - ``` - It therefore refactors the way we build the gir so that we can reuse the - same information to build them against 'gstreamer-full' in gst-build - when linking statically - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1093> - -2020-06-27 00:37:39 -0400 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/audio/meson.build: - * gst-libs/gst/basecamerabinsrc/meson.build: - * gst-libs/gst/codecs/meson.build: - * gst-libs/gst/insertbin/meson.build: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/play/meson.build: - * gst-libs/gst/player/meson.build: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/webrtc/meson.build: - meson: Mark files as files() - Making it more robust and future proof - And fix issues that it creates - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1093> - -2021-09-13 17:53:12 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/audio/meson.build: - bad:audio: Add generated files sources in declare_dependency - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1093> - -2021-10-15 23:18:41 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmftransform.cpp: - * sys/mediafoundation/gstmfutils.cpp: - * sys/mediafoundation/gstmfvideoenc.cpp: - mediafoundation: Fix various string constness handling - ... with fixing typo (g_strup -> g_strdup) - Constness needs to be explicit in C++ world otherwise compiler - would complain about that. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1164> - -2021-10-15 10:03:46 +0100 Rob Agar <rob@engineeredarts.co.uk> - - * tests/examples/webrtc/webrtcrenego.c: - missing transceiver unref in WebRTC renegotiation example - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1160> - -2021-10-13 17:17:44 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * tests/examples/va/multiple-vpp.c: - tests:va: Fix null ptr dereference in multi-vpp - Dereference the pointer err before null check, which raised a null - pointer dereference issue by Coverity. Modify it to do the null check - of err first, then dereference it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1143> - -2021-10-13 15:58:29 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * sys/va/gstvadecoder.c: - va: Fix null ptr dereference for vadeocder - Making a null check in gst_va_decode_picture_free () indicates pic->buffers or pic->slices - can be null, then in _destroy_buffers () the pointers are dereferenced, which is detected - as dereference after null check by Coverity. Thus, modify the code to do null check in - _detroy_buffers (). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1143> - -2021-04-05 10:29:37 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: Handle delayed seek events - Store the event in case it cannot be processed immediately and process - it after the first segment has been produced. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/980> - -2021-04-05 10:28:51 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: Protect demux->segment_event with a mutex - Would otherwise cause weird issues when processing a delayed seek event - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/980> - -2021-10-14 14:35:45 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264: Fix wrong type of ret variable - This ret is not a GstFlowReturn. This broke v4l2 decoder which does not - implement new_picture() virtual function. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1154> - -2021-10-13 21:45:34 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11desktopdup.h: - * sys/d3d11/gstd3d11screencapture.cpp: - * sys/d3d11/gstd3d11screencapture.h: - * sys/d3d11/gstd3d11screencapturedevice.cpp: - * sys/d3d11/gstd3d11screencapturedevice.h: - * sys/d3d11/gstd3d11screencapturesrc.cpp: - * sys/d3d11/gstd3d11screencapturesrc.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.cpp: - * tests/examples/d3d11/d3d11screencapturesrc.cpp: - * tests/examples/d3d11/meson.build: - d3d11: Rename screen capture element - Old name "desktopdup" may confuse users. Now it's renamed to - "screencapture" - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1136> - -2021-10-05 18:52:25 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder.c: - transcoder: Set state back to NULL after run() finishes - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1063> - -2021-09-13 18:02:03 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder.h: - transcoder: Use full path for includes in 'gsttranscoder.h' - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1063> - -2021-10-12 17:50:31 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * gst-libs/gst/va/gstvadisplay_drm.c: - va:display: Don't close an fd with negative value - Cannot pass negative parameter to close() and thus no need to apply - close() when fd < 0. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1131> - -2021-10-12 17:48:17 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * sys/va/gstvadecoder.c: - va: Fix error handling for decoder - Need to check if va decoder is closed successfully. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1131> - -2021-10-12 17:44:27 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * sys/va/gstvabasetransform.c: - va: Fix error handling for base transform - Need to check the returned value of gst_buffer_pool_set_active() when - setting the active status of buffer pool. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1131> - -2021-10-13 21:26:53 -0300 Thibault Saunier <tsaunier@igalia.com> - - * ext/avtp/meson.build: - meson:avtp: Error out if sock_txtime is not present and avtp is enabled - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1142> - -2021-10-10 01:56:32 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparsers: {h264,h265}parser: Fix typo around SEI nalu generator - Fix to create correct SEI nalu when the size of payloadType and/or - payloadType is larger than 255 (0xff) - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1601 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1106> - -2021-10-05 20:15:44 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvavpp.c: - vapostproc: Negotiate interlaced. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1109> - -2021-10-05 20:15:09 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Copy missing fields at fixate. - When caps negotiation implies a caps feature change, some fields might - get lost. This patch brings them back from input caps. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1109> - -2021-10-05 20:15:09 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Simplify size fixate. - gst_va_vpp_fixate_size() returned the fixated caps, but that is not - needed since `othercaps` are modified inline. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1109> - -2021-10-05 20:15:09 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Simplify fixate. - The first approach to fixate was simply a copy&paste of both - videoconvert and videoscale, trying to keep their logic as isolated - as possible. But that brought duplicated and sparse logic. - This patch merge both approaches simplifying the fixate operation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1109> - -2021-10-05 17:41:57 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadeinterlace.c: - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - * sys/va/gstvavpp.c: - va: filter, deinterlace, vpp: Add gst_va_buffer_get_surface_flags(). - Add a helper function to get, from GstVideoInfo and GstBuffers flags, - the VA interlace surface flags. This is used currently by vainterlace - element, but it will be used in vapostproc too if it can process - interlaced frames. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1109> - -2021-09-22 14:50:40 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: fix vp9enc initialization fail - MediaSDK does not support to handle extbuff with id - MFX_EXTBUFF_VIDEO_SIGNAL_INFO for mjpegenc and vp9enc. Hence, need to - exclude mjpeg and vp9 when passing color properties to MediaSDK during - msdkenc initialization. - Fix issue: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/764 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1101> - -2021-10-10 17:04:13 +0900 Seungha Yang <seungha@centricular.com> - - * tests/examples/d3d11/d3d11desktopdupsrc.cpp: - * tests/examples/d3d11/d3d11device.cpp: - * tests/examples/d3d11/d3d11device.h: - * tests/examples/d3d11/d3d11videosink-kb.c: - * tests/examples/d3d11/d3d11videosink-kb.h: - * tests/examples/d3d11/d3d11videosink-shared-texture-d3d9ex.cpp: - * tests/examples/d3d11/d3d11videosink-shared-texture.cpp: - * tests/examples/d3d11/d3d11videosink.c: - * tests/examples/d3d11/meson.build: - * tests/examples/meson.build: - examples: d3d11: Add a desktop capture example - ... with d3d11 desktop capture device provider - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1103> - -2021-10-05 21:49:38 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11desktopdup.cpp: - * sys/d3d11/gstd3d11desktopdup.h: - * sys/d3d11/gstd3d11desktopdupdevice.cpp: - * sys/d3d11/gstd3d11desktopdupdevice.h: - * sys/d3d11/gstd3d11desktopdupsrc.cpp: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.cpp: - d3d11: Add device provider for d3d11desktopdupsrc - ... and add support for multi-GPU/multi-monitor - By using newly added "monitor-handle" property, user can specify a - monitor to be captured via HMONITOR handle. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1673 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1103> - -2021-10-11 15:23:08 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/ttml/gstttmlparse.c: - * ext/ttml/gstttmlrender.c: - ttml: fix log init - The log system should be init before calling a log - Fix regression after: - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1112> - -2021-10-04 13:30:37 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * tests/check/elements/vapostproc.c: - * tests/check/meson.build: - tests: va: Add VA buffer copy tests. - It should only work for raw buffers, but fails on dmabuf since it - should have a drm modifier. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1023> - -2021-10-06 15:20:50 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: dmabuf: Use GstVaSurfaceCopy, if possible. - If dmabuf-based buffer to copy contains only one memory, and there are - memories available in the allocator's pool, it's possible a fast - memory copy using GstVaSurfaceCopy, regardless the drm modifier. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1023> - -2021-10-05 15:21:01 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: Use GstVaSurfaceCopy. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1023> - -2021-10-05 13:36:56 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvasurfacecopy.c: - * sys/va/gstvasurfacecopy.h: - * sys/va/meson.build: - * sys/va/vasurfaceimage.c: - * sys/va/vasurfaceimage.h: - va: Add GstVaSurfaceCopy class. - This new class is a helper for fast/tricky copy of surfaces. First it - tries to copy using the function vaCopy in libva 1.12. If it fails, or - it's not available, a GstVaFilter is tried to be instantiated with the - allocator's parameters, and if succeed, it's used for copying the - source surface. - This is required for dmabuf surfaces with drm modifier. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1023> - -2021-10-05 13:21:00 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/vasurfaceimage.c: - * sys/va/vasurfaceimage.h: - va: filter: Enable to pass VASurfaceID in GstVaSample. - Initially GstVaSample processed its GstBuffer member to get the - VASurfaceID. But it might cases where we already have the VASurfaceID - to process by the filter. - This patch enables the possibility to pass the surfaces rather than - the buffers. In order to validate the surfaces a function to check - surfaces were added. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1023> - -2021-10-07 21:51:55 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/meson.build: - * sys/va/vasurfaceimage.c: - * sys/va/vasurfaceimage.h: - va: Split VA memory handling in different files. - Take out the VA memory wrappers from gstvallocator.c to an external - file exposing the functions. - This is going to be needed for the copy helper object. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1023> - -2021-10-05 06:54:25 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.h: - va: allocator: Add missing header file. - Added stdint.h because uintptr_t is used. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1023> - -2021-10-04 21:31:53 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadisplay_priv.c: - * sys/va/gstvadisplay_priv.h: - va: display: Add gst_va_display_has_vpp() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1023> - -2021-09-30 14:59:31 +0200 Benjamin Gaignard <benjamin.gaignard@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/linux/v4l2-controls.h: - v4l2codecs: Align v4l2-controls header with kernel 5.15-rc3 - Update v4l2-controls to be aligned with kernel 5.15-rc3. - Fix VP8 decoder to use the correct field name. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1081> - -2021-10-08 23:07:32 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfh264enc.cpp: - * sys/mediafoundation/gstmfh265enc.cpp: - * sys/mediafoundation/gstmfvideoenc.cpp: - * sys/mediafoundation/gstmfvideoenc.h: - * sys/mediafoundation/gstmfvp9enc.cpp: - mediafoundation: mfvideoenc: Use DXGI adapter LUID - Make use of new DXGI adapter LUID based device context sharing. - Note that we were using DXGI adapter LUID to open MFT already. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1098> - -2021-10-08 22:37:20 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11av1dec.cpp: - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11: d3d11decoder: Use DXGI adapter LUID - ... instead of index of DXGI adapter. - The order of IDXGIAdapter1 enumerated via IDXGIFactory1::EnumAdapters1 - can be varying even there's no rebooting in case that GPU preference order - is updated by user (for example, it can be done by using NVIDIA Control Panel - in case of multi-GPU laptop system) and eGPU is another possible case. - So, for an element which requires fixed target GPU requirement, - index based device enumeration is unreliable. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1098> - -2021-10-08 21:39:44 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11utils.cpp: - * gst-libs/gst/d3d11/gstd3d11utils.h: - d3d11: d3d11utils: Add support for DXGI Adapter LUID based D3D11 device context sharing - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1098> - -2021-10-08 19:41:22 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11device.cpp: - * gst-libs/gst/d3d11/gstd3d11device.h: - * gst-libs/gst/d3d11/gstd3d11utils.cpp: - * gst-libs/gst/d3d11/gstd3d11utils.h: - * tests/check/libs/d3d11device.cpp: - * tests/check/meson.build: - d3d11: d3d11device: Add gst_d3d11_device_new_{for_adapter_luid,wrapped} - * gst_d3d11_device_new_for_adapter_luid() - Used for creating D3D11 device for a DXGI adapter (i.e., GPU) - corresponding to a LUID (Locally Unique Identifier). - This method can be useful for interop with other APIs such as - Direct3D12, MediaFoundation, CUDA, etc. - * gst_d3d11_device_new_wrapped() - Allows creating a new GstD3D11Device object by using already - configured ID3D11Device. This is conceptually equivalent to - gst_gl_context_new_wrapped() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1098> - -2021-10-08 17:16:02 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11device.cpp: - * sys/d3d11/gstd3d11window.cpp: - d3d11: d3d11device: Remove "allow-tearing" property - Plugin can query DXGI_FEATURE_PRESENT_ALLOW_TEARING without d3d11device - help - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1098> + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3773> -2021-10-08 21:14:52 +0300 Sebastian Dröge <sebastian@centricular.com> +2023-01-23 23:29:08 +0900 Seungha Yang <seungha@centricular.com> - * ext/webrtc/gstwebrtcbin.c: - * tests/check/elements/webrtcbin.c: - webrtcbin: Use the same promise reply structure name everywhere - This was an inconsistent mix of different names in the past. The name - has no meaning at all so let's set all to "application/x-gst-promise". - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1099> - -2021-10-08 15:44:37 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * docs/plugins/gst_plugins_cache.json: - * gst/debugutils/gstchopmydata.c: - chopmydata: Fix FIXMEs in gst_element_class_set_static_metadata - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1097> - -2021-10-06 03:19:30 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11desktopdupsrc.cpp: - d3d11: d3d11desktopdupsrc: Add support for non-D3D11 downstream element - By this commit, application doesn't need to configure d3d11download - element for software pipeline which will make things simpler - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1082> - -2021-10-06 22:06:44 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstav1decoder.c: - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gstmpeg2decoder.c: - * gst-libs/gst/codecs/gstvp8decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.c: - codecs: Use GST_VIDEO_DECODER_ERROR() only for decoding error case - The GST_VIDEO_DECODER_ERROR() should be used only for robust/error-resilient - decoding purpose. Any other error codes such as not-negotiated or flushing - should be returned without modified for upstream to be able to handle - it immediately. (for example, application might want to try other - decoder element on not-negotiated) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1070> - -2021-10-07 01:54:29 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Update for remaining gboolean to GstFlowReturn port - Fix for spurious/spammy warning and wrong function return type - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1085> - -2021-09-23 17:36:20 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/openjpeg/meson.build: - meson: Fix build with -Dopenjpeg=disabled - tests/check/meson.build uses the openjpeg_dep variable - unconditionally, and the subdir_done() is useless anyway, since the - plugin is only built if openjpeg_dep.found() is true. Fixes: - ..\tests\check\meson.build:23:0: ERROR: Unknown variable "openjpeg_dep". - In particular, this fixes the build on UWP since we disable openjpeg - explicitly in Cerbero when building for UWP. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1069> - -2021-10-01 14:35:06 +0200 Guillaume Desmottes <guillaume@desmottes.be> - - * ext/gs/README.md: - bad: gs: update README - - add one missing dep - - change install path to match monorepo - - fix current dirs - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1008> - -2021-09-17 13:02:38 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadeinterlace.c: - * sys/va/gstvavpp.c: - * tests/examples/va/main.c: - va: Use macro rather than VAMemory feature string. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1061> - -2021-09-24 11:53:56 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsdemux/mpegtsparse.c: - mpegtsparse: Don't assert the packet_size when filling for EOS - If the packetizer got reset for any reason (failure to find PCR?) then - the packet_size can be zero here even though we already enqueued some - packets. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1038> - -2021-09-22 00:05:43 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - * gst-libs/gst/codecs/gstmpeg2decoder.h: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/va/gstvampeg2dec.c: - codecs: mpeg2decoder: Use GstFlowReturn everywhere - boolean return value is not sufficient for representing the reason - of error in most cases. For instance, any errors around new_sequence() - would mean negotiation error, not just *ERROR*. - And some subclasses will allocate buffer/memory/surface on new_picture() - but it could be failed because of expected error, likely flushing - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1019> - -2021-09-21 22:21:51 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/nvcodec/gstnvh264dec.c: - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/va/gstvah264dec.c: - codecs: h264decoder: Use GstFlowReturn everywhere - boolean return value is not sufficient for representing the reason - of error in most cases. For instance, any errors around new_sequence() - would mean negotiation error, not just *ERROR*. - And some subclasses will allocate buffer/memory/surface on new_picture() - but it could be failed because of expected error, likely flushing - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1019> - -2021-09-21 00:23:13 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gsth265decoder.h: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/nvcodec/gstnvh265dec.c: - * sys/va/gstvah265dec.c: - codecs: h265decoder: Use GstFlowReturn everywhere - boolean return value is not sufficient for representing the reason - of error in most cases. For instance, any errors around new_sequence() - would mean negotiation error, not just *ERROR*. - And some subclasses will allocate buffer/memory/surface on new_picture() - but it could be failed because of expected error, likely flushing - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1019> - -2021-10-02 21:22:23 +0900 Seungha Yang <seungha@centricular.com> - - * ext/closedcaption/bit_slicer.c: - * ext/closedcaption/io-sim.c: - * ext/closedcaption/misc.h: - * ext/closedcaption/sampling_par.c: - closedcaption: Fix broken debug function macros with MSVC build - warning C4003: not enough arguments for function-like macro invocation 'warning' - G_STMT_END macro is extended to the below form with MSVC - __pragma(warning(push)) \ - __pragma(warning(disable:4127)) \ - while(0) \ - __pragma(warning(pop)) - So MSVC preprocessor will extend it further to - __pragma(VBI_CAT_LEVEL_LOG(push)) ... - Should rename warning() debug macro function therefore. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1018> - -2021-10-02 20:12:07 +0900 Seungha Yang <seungha@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - mpegtsmux: basetsmux: Don't try to return value from void function - gstbasetsmux.c(1508): warning C4098: 'free_splice': 'void' function returning a value - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1018> - -2021-10-03 16:53:54 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadevice.c: - * sys/va/meson.build: - va: Make libgudev dependency optional. - libgudev is a problematic dependency, particularly in sandboxed - environments, such as flatpak. - This patch implements a way to get the available VA devices using - brute-forced traverse of /dev/drm/renderD* directory. Thus usable in - those sandboxed environments. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1027> - -2021-10-03 15:45:58 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/va/meson.build: - * sys/va/meson.build: - va: meson: Move back libgudev dependency to plugin. - When move the libgstva, libgudev dependency was moved as part of the - library, though it's not use by the library but the plugin. This patch - moves back libgudev dependency to the plugin. - Also HAVE_LIBDRM is move to the library which is the one who use it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1027> - -2021-10-03 19:14:07 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvdecoder.c: - * sys/nvcodec/gstnvh264dec.c: - nvcodec: nvh264sldec: Add support for interlaced stream - Implement missing interlaced stream support - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1026> - -2021-10-03 17:41:40 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh264dec.c: - nvcodec: nvh264sldec: Consider additional render delay DPB pictures - At least additional 4 pictures are required - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1026> - -2021-10-03 17:37:02 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvvp9dec.c: - nvcodec: nvvp9sldec: Fix for VP9 profile2 decoding - Fix for output video format to be selected correctly - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1026> - -2021-10-03 02:14:17 +0900 Seungha Yang <seungha@centricular.com> - - * sys/msdk/meson.build: - msdk: meson: Fix build on Windows - subprojects\gst-plugins-bad\sys\msdk\meson.build:160:2: ERROR: Unknown variable "libva_dep". - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1022> - -2021-10-03 01:45:57 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11: d3d11vp9dec: Fix use_prev_in_find_mv_refs value setting - "last_show_frame" should be updated based on - GstVp9FrameHeader::show_frame, not show_existing_frame - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1021> - -2021-09-18 22:51:53 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp8decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.c: - codecs: {vp8,vp9}decoder: Drain on new_sequence() - Decoder should drain queued frame (if any) and empty DPB before - starting new sequence. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/987> - -2021-10-01 00:27:42 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvvp8dec.c: - * sys/nvcodec/gstnvvp9dec.c: - nvcodec: nv{vp8,vp9}sldec: Implement get_preferred_output_delay() - Equivalent to that of nvh264sldec. Use render delay in case of non-live - pipeline for the better throughput performance. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/987> - -2021-10-01 01:00:24 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp8decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.c: - codecs: {vp8,vp9}decoder: Cleanup drain code - Make them consistent with h26x decoder baseclass - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/987> - -2021-10-01 02:58:44 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp8decoder.c: - codecs: vp8decoder: Fix typo - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/987> - -2021-10-02 20:21:41 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.h: - codecs: vp9decoder: add support for render delay - Some decoding APIs support delayed output for performance reasons. - One example would be to request decoding for multiple frames and - then query for the oldest frame in the output queue. - This also increases throughput for transcoding and improves seek - performance when supported by the underlying backend. - Introduce support in the vp9 base class, so that backends that - support render delays can actually implement it. - Co-authored by Seungha Yang <seungha@centricular.com> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/987> - -2021-10-02 19:47:45 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.h: - codecs: vp9decoder: Fix class struct documentation - s/GstVp9Decoder/GstVp9DecoderClass - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/987> - -2021-09-30 17:38:33 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/meson.build: - va: meson: Update and enhance meson syntax usage. - This patch contains two updates: - 1. Instead of checking for dependency already checked just to verify a - version, we use the dependency version API. - 2. Update the deprecated function get_pkgconfig_variable. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/997> - -2021-09-30 17:43:09 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/meson.build: - msdk: meson: Don't get dependency variable before it's valid. - It's possible to have installed MediaSDK environment - package (libmfx-dev in Debian) without libva environment package. This - setup will lead to a breakage of meson configuration. - The fix is to get the libva's driver directory variable after the - dependency is validated as found. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/998> - -2021-09-30 13:32:44 +0200 Marc Leeman <m.leeman@televic.com> - - * gst/rist/gstristsink.c: - ristsink: set sync to FALSE on RTCP sink - See commit 921e9a54: rtpsink: set sync off on rtcp_sink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/993> - -2021-09-30 13:19:40 +0200 Marc Leeman <m.leeman@televic.com> - - * gst/rtp/gstrtpsink.c: - rtpsink: set sync off on rtcp_sink - When using the following setup (the error can be reproduced using - simpler sender pipelines), the receiver resynchronises the clock on RTCP - packets. The effect was that a couple seconds were cut out of the - playback because an initial RTCP packet was dropped. - When sending out all RTCP packets (setting sync=FALSE on the RTCP - updsink), the playback is fine. - This syncs rtpsink with rtpsrc (where this property was already set). - gst-launch-1.0 filesrc location=899-en.mp3 \ - ! mpegaudioparse \ - ! mpg123audiodec \ - ! audioconvert \ - ! audioresample \ - ! avenc_g722 \ - ! rtpg722pay - ! rtpsink uri=rtp://239.1.2.3:1234 - gst-launch-1.0 uridecodebin rtp://239.1.2.3:1234?encoding-name=G722 \ - ! autoaudiosink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/993> - -2020-09-17 15:06:38 +0200 Marc Leeman <m.leeman@televic.com> - - * gst/rtp/gstrtpsrc.c: - * tests/check/elements/rtpsrc.c: - rtpmanagerbad: do not set iface on sink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/994> - -2021-08-27 19:19:57 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfdevice.c: - * sys/mediafoundation/gstwin32devicewatcher.cpp: - * sys/mediafoundation/gstwin32devicewatcher.h: - * sys/mediafoundation/meson.build: - mfdeviceprovider: Add support for device update - Similar to the wasapi2 plugin, GstWinRT library will be used for UWP, - and adding new GstWin32DeviceWatcher object implementation for - Win32 desktop application. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/947> - -2021-08-26 22:38:37 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2device.c: - * sys/wasapi2/gstwasapi2device.h: - * sys/wasapi2/meson.build: - * sys/wasapi2/plugin.c: - wasapi2deviceprovider: Add support for device update - ... by using newly implemented GstWinRT library - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/947> - -2021-08-26 19:47:51 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/meson.build: - * gst-libs/gst/winrt/gstwinrt.h: - * gst-libs/gst/winrt/gstwinrtdevicewatcher.cpp: - * gst-libs/gst/winrt/gstwinrtdevicewatcher.h: - * gst-libs/gst/winrt/meson.build: - * gst-libs/gst/winrt/winrt-prelude.h: - libs: Introduce GstWinRT library - Adding a helper library for various WinRT specific implementations. - Currently this library supports only DeviceWatcher abstraction object - which can be used for dynamic device add/remove detection. - See also - https://docs.microsoft.com/en-us/uwp/api/windows.devices.enumeration.devicewatcher?view=winrt-20348 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/947> - -2021-09-28 10:11:15 +1000 Brad Hards <bradh@frogmouth.net> - - * README: - * RELEASE: - doc: update IRC links to OFTC - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/945> - -2021-09-18 23:37:20 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - * sys/d3d11/gstd3d11window.cpp: - d3d11videosink: Add support for crop meta - ... when upstream element is d3d11. - Note that, if upstream element is not d3d11, crop meta is almost - pointless since d3d11videosink will upload video frame to GPU memory - in any case. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/933> - -2021-09-18 23:37:59 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - d3d11videosink: Perform propose_allocation() even when we have no configured window - In order to support d3d11 device update, d3d11videosink will configure - window on the first buffer. So, there might not be configured - window when propose_allocation() is required. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/933> - -2021-09-27 15:30:25 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/gs/gstgscommon.cpp: - * ext/gs/gstgscommon.h: - * ext/gs/gstgssink.cpp: - * ext/gs/gstgssrc.cpp: - gs: Add support for authenticating via Service Account Credentials - This allows authenticating directly with Server Account credentials - instead of having it configured on host system separately, and thus - allows using arbitrary accounts configured/selected at runtime. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/934> - -2021-09-27 14:56:21 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/gs/gstgs.cpp: - * ext/gs/gstgscommon.cpp: - * ext/gs/gstgscommon.h: - * ext/gs/gstgssink.cpp: - * ext/gs/gstgssink.h: - * ext/gs/gstgssrc.cpp: - * ext/gs/gstgssrc.h: - gs: Fix indentation and make it consistent - Apparently this partially used clang-format's default settings, so let's - use that for everything now. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/934> - -2021-09-26 01:07:02 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - Back to development - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/925> - -2021-09-23 19:30:32 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Always set SINK/SRC flags - webrtcbin can act as a sink/source depending on the SDP later. Without - setting this here already, surrounding bins might not notice this and - the pipeline configuration might become inconsistent, e.g. with regards - to latency. - See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/737 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/900> - -2021-09-25 00:09:00 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gst-scte-section.c: - * gst-libs/gst/mpegts/gst-scte-section.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst/mpegtsdemux/tsdemux.c: - mpegts: add missing Since comments after SCTE 35 work - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-06-08 23:25:58 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - basetsmux: use private copy of g_ptr_array_copy - This function is only present since glib 2.62 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-05-04 14:38:28 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - basetsmux: fix SCTE pts_adjustment with offsets - When there are elements between the demuxer and the muxer that - introduce an offset to the running time, or when offsets are - set on pads by the application, this shift must be taken into - account when calculating the final pts_adjustement. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-23 01:22:32 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gst-scte-section.c: - * gst-libs/gst/mpegts/gst-scte-section.h: - * gst/mpegtsmux/gstbasetsmux.c: - basetsmux: rework SCTE section handling to handle passthrough - mpegtsmux can receive SCTE sections from two origins: events - created by the application, and events forwarded downstream by - mpegtsdemux, containing sections that may not have been fully - parsed, and additional data to help tsmux translate times to - the correct domain, both for requesting keyframes and calculating - an accurate pts_adjustment. - The complete approach is documented further in a comment above - the relevant function. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-23 01:19:21 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegtspacketizer: handle "packetizing" already packetized data - .. when the section didn't have a packetizer. This can happen - as a result of building a new section from a copy of the original - data of another section. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-23 01:15:08 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: switch SCTE 35 sections handling to a passthrough model - Instead of modifying the splice times in the incoming sections - to running time and expecting eg mpegtsmux to convert those back - to its local PES time domain, which might be impossible when - those splice times are encrypted or the specification is extended, - transmit the needed information to the muxer as separate fields in - the event: - * A pts offset field can be used by the muxer in order to calculate - a final pts_adjustment - * A rtime_map can be used by the muxer to determine the correct - running times at which it should request keyframes - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-14 00:27:16 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gst-scte-section.c: - scte-section: add support for packetizing splice_program_flag='0' - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-13 23:56:06 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gst-scte-section.c: - scte-section: add support for packetizing schedule events - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-13 23:42:54 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gst-scte-section.c: - scte-section: Add TODO for porting to gst_bit_* - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-13 23:38:16 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gst-scte-section.c: - * gst-libs/gst/mpegts/gst-scte-section.h: - scte-section: add support for parsing splice components - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-13 20:51:09 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gst-scte-section.c: - * gst-libs/gst/mpegts/gst-scte-section.h: - scte-section: add support for SCHEDULE commands - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-13 20:47:36 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gst-scte-section.c: - scte-section: fix typo - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-13 20:44:54 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gst-scte-section.c: - * gst-libs/gst/mpegts/gst-scte-section.h: - gst-scte-section: implement partial parsing - In cases where either the SIT is encrypted, or an unknown - command is encountered, we still want to send an event downstream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-06 17:57:42 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gst-scte-section.c: - * gst-libs/gst/mpegts/gst-scte-section.h: - * tests/examples/mpegts/ts-scte-writer.c: - scte35-section: semantic API break - Document that the constructors for the splice events expect - a running time, as users of the API can not be expected to - predict the appropriate local PTS. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-06 17:37:28 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gst-scte-section.c: - scte-section: add support for packetizing time_signal splices - time_signal splices are trivial, they only contain a splice_time() - and all the relevant information is carried in descriptors. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-06 00:58:33 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/gstbasetsmux.h: - basetsmux: extend SCTE 35 support - Makes it possible to support passing SCTE 35 cue points from - demuxer to muxer, while preserving correct timing. - This will also improve ex nihilo cue points injection, as splice - times and durations are now interpreted as running time values, - and may trigger key unit requests. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-06 00:36:43 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: Expose send-scte35-events property - When enabled, SCTE 35 sections (eg ad placement opportunities) - are forwarded as events donwstream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-06 00:26:50 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - mpegtsbase: expose vmethod to let subclass handle sections - This can be used by tsdemux to handle and forward SCTE 35 - sections. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-06 00:23:09 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - mpegtssection: expose event constructor - This allows the demuxer to forward sections of interest downstream, - for example SCTE 35 splice information. These can then be reinjected - appropriately by a muxer for example. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -2021-04-06 00:21:58 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gst-scte-section.h: - scte-section.h: fix type macros - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913> - -=== release 1.19.2 === - -2021-09-23 01:34:47 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * gst-plugins-bad.doap: - * meson.build: - Release 1.19.2 - -2021-09-22 14:17:35 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Remove unneeded buffer_clip wrapper - This is just a small cleanup noticed while reading. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2544> - -2020-07-10 19:31:13 +0530 Vivek R <123vivekr@gmail.com> - - * ext/opencv/gstcvtracker.cpp: - * ext/opencv/gstcvtracker.h: - opencv: cvtracker: add draw property - This property controls the drawing of rectangle around the tracked object. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2454> - -2020-05-24 23:37:25 +0530 Vivek R <123vivekr@gmail.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/opencv/gstcvtracker.cpp: - * ext/opencv/gstcvtracker.h: - * ext/opencv/gstopencv.cpp: - * ext/opencv/meson.build: - * tests/meson.build: - * tests/validate/meson.build: - * tests/validate/opencv/cvtracker.validatetest: - * tests/validate/opencv/cvtracker/flow-expectations/log-tracker-src-expected: - opencv: add cvtracker plugin - This adds an object tracker plugin. - Tracker implementations from https://docs.opencv.org/3.4/d0/d0a/classcv_1_1Tracker.html - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2454> - -2020-05-25 10:35:30 +0530 Vivek R <123vivekr@gmail.com> - - * ext/opencv/meson.build: - opencv: patch to ensure headers are detected - This patch is used to ensure opencv headers are detected. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2454> - -2021-09-19 01:18:00 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegpsmux/mpegpsmux_aac.c: - * gst/mpegpsmux/mpegpsmux_aac.h: - * gst/mpegpsmux/mpegpsmux_h264.c: - * gst/mpegpsmux/mpegpsmux_h264.h: - * gst/mpegtsmux/gstatscmux.c: - * gst/mpegtsmux/gstatscmux.h: - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/gstbasetsmux.h: - * gst/mpegtsmux/gstbasetsmuxaac.c: - * gst/mpegtsmux/gstbasetsmuxaac.h: - * gst/mpegtsmux/gstbasetsmuxjpeg2000.c: - * gst/mpegtsmux/gstbasetsmuxjpeg2000.h: - * gst/mpegtsmux/gstbasetsmuxopus.c: - * gst/mpegtsmux/gstbasetsmuxopus.h: - * gst/mpegtsmux/gstbasetsmuxttxt.c: - * gst/mpegtsmux/gstbasetsmuxttxt.h: - * gst/mpegtsmux/gstmpegtsmux.c: - * gst/mpegtsmux/gstmpegtsmux.h: - * gst/mpegtsmux/gstmpegtsmuxplugin.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - mpegtsmux, mpegpsmux: remove GPL from choice of licenses and add SPDX license identifiers - Some people need to avoid inclusion of GPL code for their use cases and thus - get easily spooked by GPL license headers. This code is actually licensed - under different licenses, only one of which is GPL, and it's already possible - to just upgrade from LGPL to GPL anyway so having the GPL listed explicitly - as one of the choices doesn't really add anything. So remove GPL from the list - and also add SPDX license identifiers while we're at it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2539> - -2021-08-24 03:54:27 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi/gstmmdeviceenumerator.cpp: - * sys/wasapi/gstmmdeviceenumerator.h: - * sys/wasapi/gstwasapidevice.c: - * sys/wasapi/gstwasapidevice.h: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - * sys/wasapi/meson.build: - * tests/check/elements/wasapi.c: - wasapideviceprovider: Add support for dynamic device add/remove - Adding IMMDeviceEnumerator::RegisterEndpointNotificationCallback - in order to support device monitoring. - On OnDeviceAdded(), OnDeviceRemoved(), and OnDefaultDeviceChanged() - callback, wasapi device provider implementation will enumerate - devices again and will notify newly added and removed device - via GstDeviceProvider API. - As a bonus point, this IMMDeviceEnumerator abstraction object - will spawn a dedicated internal COM thread, so various COM thread - related issues of WASAPI plugin can be resolved by this commit. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1649 - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1110 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2484> - -2021-02-01 16:21:59 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * tests/check/elements/openjpeg.c: - * tests/check/meson.build: - openjpeg: add unit test - Test various format supported with subframes. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/979> - -2021-01-22 10:39:56 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegenc.c: - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse + openjpeg: Switch striped mode to its own caps - It's not compatible with any other element that use the non-striped - mode. In addition, in this mode, we require that every frame have the - same number of stripes or that the MARKER bit be present, which is - different from the other - formats too. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/979> - -2020-12-23 11:03:34 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: Fix crash with AYUV64 in subframe mode - Remove useless generic fill_frame methods to use - the packed one for AYUV and AYUV64. - Fix gst-launch-1.0 -v videotestsrc ! - video/x-raw,width=640,height=480,format=AYUV64 ! openjpegenc - num-stripes=8 ! openjpegdec max-threads=8 ! videoconvert ! - autovideosink sync=false - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/979> - -2020-04-24 16:15:42 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/openjpeg/gstopenjpeg.h: - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegdec.h: - openjpegdec: support for a multithreaded decoding. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/979> - -2020-01-13 14:02:39 -0500 Aaron Boxer <aaron.boxer@collabora.com> - - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegdec.h: - openjpegdec: enable sub frame mode - Rebuild output frame from multiple stripes input. - Keep the first frame and fill it with the following stripes to finish - a complete frame only once. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/979> - -2020-12-22 18:19:40 -0500 Olivier Crête <olivier.crete@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/mpegtsmux/gstmpegtsmux.c: - mpegtsmux: Require frame alignment for JPEG 2000 - We have yet to implement stripe alignment with the required descriptor. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/979> - -2020-12-22 18:15:52 -0500 Olivier Crête <olivier.crete@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: Reject stripes for now - They're not implemented. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/979> - -2020-12-22 18:20:35 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/openjpeg/gstopenjpegenc.c: - openjpegenc: Only allow stripe with image/x-jpc format - It's the only format that our MPEG-TS muxer allows and the carriage of - JPEG 2000 stripes is only defined for MPEG-TS as far as I know. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/979> - -2020-04-21 20:56:03 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/openjpeg/gstopenjpeg.h: - * ext/openjpeg/gstopenjpegenc.c: - * ext/openjpeg/gstopenjpegenc.h: - openjpegenc: support for a multithreaded encoding. - This commit introduces a multithreaded encoder allowing - to encode mulitple stripes or subframes in separated threads. - This feature aims to enhance the overall latency of a codec - pipeline. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/979> - -2021-09-18 12:02:15 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpe: context thread dispatch fixes - Use dedicated mutex/cond/flag for jobs being dispatched in the context thread. - The previous code was signalling the thread startup condition, which is wrong. - When WPEContextThread::dispatch() is invoked it means the thread has already - correctly been started up. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2533> + * sys/d3d11/gstd3d11compositor.cpp: + d3d11compositor: Workaround blending artifacts on Intel platform + Disable vendor implemented converter in d3d11compositor to workaround + artifacts + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3770> -2021-09-18 12:01:39 +0100 Philippe Normand <philn@igalia.com> +2023-01-19 15:24:05 +0100 Jonas Danielsson <jonas.danielsson@spiideo.com> * ext/wpe/WPEThreadedView.cpp: * ext/wpe/WPEThreadedView.h: - wpe: Properly wait on context thread startup condition - Fixes #1661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2533> - -2021-09-20 09:41:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - doc: Update kmssink caps cache - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2530> - -2021-09-17 16:21:39 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsutils.c: - kmssink: Add RGB16/BGR16 support - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2530> - -2021-09-17 16:14:36 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsutils.c: - kmssink: Sort format according to GST_VIDEO_FORMATS_ALL - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2530> - -2021-09-17 15:42:25 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsutils.c: - kmssink: Remove big endian format inversion - This has been a bad interpretation of the DRM docuemntation. The formats are - fixed regardless the CPU, but for some formats, they expressed in the opposite - order as GStreamer. Same change was done in waylandsink 2 years ago. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/commit/b393b650ab9bfb9654fc116163ab331907216d74 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2530> - -2021-09-17 15:41:41 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsutils.c: - kmssink: Add NV61 support - This identically handled to NV16, so no reason not to inclue it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2530> - -2021-09-17 15:39:54 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsutils.c: - kmssink: Add NV24 support - This was tested on RK3566 platform, using vendor DRM driver. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2530> - -2021-09-18 00:33:12 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstav1decoder.c: - * gst-libs/gst/codecs/gstav1decoder.h: - * sys/d3d11/gstd3d11av1dec.cpp: - * sys/va/gstvaav1dec.c: - codecs: av1decoder: Use GstFlowReturn everywhere - The same modification as that of VP8 decoder - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2528> - -2021-09-18 00:09:24 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.h: - * sys/d3d11/gstd3d11vp9dec.cpp: - * sys/nvcodec/gstnvvp9dec.c: - * sys/va/gstvavp9dec.c: - codecs: vp9decoder: Use GstFlowReturn everywhere - The same modification as that of VP8 decoder - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2528> - -2021-09-17 23:23:06 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp8decoder.c: - * gst-libs/gst/codecs/gstvp8decoder.h: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/nvcodec/gstnvvp8dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/va/gstvavp8dec.c: - codecs: vp8decoder: Use GstFlowReturn everywhere - boolean return value is not sufficient for representing the reason - of error in most cases. For instance, any errors around new_sequence() - would mean negotiation error, not just *ERROR*. - And some subclasses will allocate buffer/memory/surface on new_picture() - but it could be failed because of expected error, likely flushing - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2528> - -2021-08-16 18:15:42 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: memcmp potentially seen_before data - Theoretically the version number is incremented every time there's a new - section, but in a world of streaming we can't easily make that - assumption. - An example of a broken use case is when we're cat-ing two mpeg-ts files - together, which is equivalent of capturing a DVB stream while switching - channels. A set-top box would know that we switched the channels and - reset the demuxer, but in practice this might not happen. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2468> - -2021-09-20 11:35:51 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/play/gstplay-media-info.c: - * gst-libs/gst/play/gstplay.c: - * gst-libs/gst/player/gstplayer-media-info.c: - * gst-libs/gst/player/gstplayer.c: - player: Fix/add various annotations - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2538> - -2021-09-18 18:07:43 +0900 Seungha Yang <seungha@centricular.com> - - * sys/va/meson.build: - meson: va: Make AV1 support always optional - Otherwise meson configure with -Dva=enabled will be failed - when installed libva version is < 1.8 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2532> - -2021-09-18 11:03:16 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvacaps.c: - va: caps: Don't use image formats for decoded frames. - Initially we tried to use the internal color conversion used in i965 - and Gallium drivers when decoding. But this approach has showed - limitations and problems. - This patch removes completely the possible color conversion at - decoding, since it show problems with deinterlacing, for example: - gst-launch-1.0 filesrc location=interlaced.mpg2 ! parsebin ! vampeg2dec ! vadeinterlace ! xvimagesink - Allowing only the surface formats when decoding is more stable. - For color conversion is better to do it explicitly with vapostproc. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2531> - -2021-04-27 11:59:15 +0200 Marijn Suijten <marijns95@gmail.com> - - * gst-libs/gst/player/gstplayer-media-info.c: - * gst-libs/gst/player/gstplayer.c: - player: Add missing nullable annotations - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2197> - -2021-04-27 11:58:58 +0200 Marijn Suijten <marijns95@gmail.com> - - * gst-libs/gst/play/gstplay-media-info.c: - * gst-libs/gst/play/gstplay.c: - play: Add missing nullable annotations - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2197> - -2021-09-18 14:29:25 +0200 Fabian Orccon <cfoch.fabian@gmail.com> - - * sys/shm/meson.build: - sys: shm: Define shm_enable and shm_deps before escape meson subdir - Fixes meson configure in tests if the shm plugin is disabled - Fixes #1664 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2534> - -2021-09-18 02:27:51 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11videosink: Display title of content if possible - Update title text of window (currently it's always "Direct3D11 renderer") - when we are rendering on internal HWND, not external HWND. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2529> - -2021-09-18 01:32:11 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - d3d11videosink: Remove unused enum value - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2529> - -2021-09-15 13:59:17 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: Pass color properties to MediaSDK for encoding - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2523> - -2021-09-15 16:32:02 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - msdkh265enc: Add profile main10 still picture for hevc - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2524> - -2021-09-16 17:12:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlbuffer.c: - waylandsink: Fix double render check - Our code does not support rendering twice the same wl_buffer in a row, so it - tries to skip that case, but for this it relied on the GstBuffer pointer, - while the cache actually works at the GstMemory level now. To avoid this - compare the GstWlBuffer instead. - This fixes crash when use in zero-copy with videorate element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2526> - -2021-09-07 09:45:54 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - codecs: mpeg2decoder: Use tsg framerate for latency. - Latency setting relies on src pad caps, but they aren't set when the - function is called, and latency is never updated. - In order to fix it, this patch uses TSG framerate first, and if it's - not set yet, sinkpad caps are used to get the framerate. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2514> - -2021-09-16 00:59:37 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11av1dec.cpp: - * sys/d3d11/gstd3d11av1dec.h: - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h264dec.h: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11h265dec.h: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.h: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp8dec.h: - * sys/d3d11/gstd3d11vp9dec.cpp: - * sys/d3d11/gstd3d11vp9dec.h: - * sys/d3d11/plugin.cpp: - d3d11decoder: Refactor for more unified decoding flow - ... and various code cleanup. - * Move spreaded decoding API calls into one method - Previously, decoding flow of most codecs are - - Call DecoderBeginFrame() on start_picture() - - Call {Get,Release}DecoderBuffer() on decode_slice() - - Call SubmitDecoderBuffers() and DecoderEndFrame() on end_picture() - Such spreaded API calls make it hard to keep track of status - of decoding. Now it will be done at once in a new method. - * Drop a code for non-zero wBadSliceChopping - When bitstream buffer provided by driver is not sufficient - to write compressed bitstream data, host decoder needs to make use - of wBadSliceChopping so that driver can understand there are - multiple bitstream buffer. But it's a bit unrealistic and - not tested. Since FFMpeg's DXVA implemetaion doesn't support it, - we might be able to ignore the case for now. - * Make code more portable - Consider common logic of GstCodecs -> DXVA translation for all D3D APIs - (i,e., D3D9, D3D11, and D3D12). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2525> - -2021-09-15 23:41:39 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11av1dec.cpp: - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11decoder: Remove duplicated class_init and property related code - Move them into the decoder helper code to remove duplication - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2525> - -2021-09-11 00:43:26 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11av1dec.cpp: - * sys/d3d11/gstd3d11compositor.cpp: - * sys/d3d11/gstd3d11compositorbin.cpp: - * sys/d3d11/gstd3d11converter.cpp: - * sys/d3d11/gstd3d11deinterlace.cpp: - * sys/d3d11/gstd3d11desktopdup.cpp: - * sys/d3d11/gstd3d11desktopdupsrc.cpp: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11overlaycompositor.cpp: - * sys/d3d11/gstd3d11pluginutils.cpp: - * sys/d3d11/gstd3d11shader.cpp: - * sys/d3d11/gstd3d11videoprocessor.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window_corewindow.cpp: - * sys/d3d11/gstd3d11window_dummy.cpp: - * sys/d3d11/gstd3d11window_swapchainpanel.cpp: - * sys/d3d11/gstd3d11window_win32.cpp: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.cpp: - d3d11: Get rid of "extern "C"" wrapping for GST_DEBUG_CATEGORY_EXTERN - Instead, change the file defining debug category to cpp - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2525> - -2020-06-30 11:15:43 -0700 U. Artie Eoff <ullysses.a.eoff@intel.com> - - * ext/closedcaption/meson.build: - * tests/check/meson.build: - tests: skip cc tests if plugin is disabled - Skip the closedcaption element tests if the - closedcaption option is disabled at compile - time (i.e. -Dclosedcaption=disabled). - v2: rename pangocairo_dep to avoid conflict - with later definition in ext/ttml/meson.build - as suggested by @tpm. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1388> - -2021-08-31 17:16:05 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264dec: Check bumping again after inserting current picture. - In order to get the lowest latency, we can add another bumping check after - inserting the current picture into the DPB immediately. That can avoid - waiting for another decoding circle of the next frame and so the latency - is lower. - Fix: #1628 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2501> - -2021-08-31 17:37:11 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264: Add protection to to_insert picture in bump check. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2501> - -2021-08-31 16:39:06 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264dec: Improve the policy to infer max_num_reorder_frames. - The max_num_reorder_frames number can change the way we bumping the - pictures in the DPB. The smaller it is, the lower latency we will - get. So it is important for live mode streams, but it is not given - in VUI parameters sometimes. We now improve the policy to infer it: - 1. Never guess it in the "strict" compliance. - 2. For baseline and constrained baseline profiles, which do not have - B frames, set it to 0. - 3. For -intra only profiles, set it to 0. - 4. Otherwise, not guess it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2501> - -2021-09-14 20:57:30 -0700 U. Artie Eoff <ullysses.a.eoff@intel.com> - - * ext/aes/meson.build: - * tests/check/meson.build: - tests: skip aes test if elements not built - In ext/aes/meson.build, the aes_dep will return - not-found if -Daes=disabled, regardless of whether - openssl is found or not. Thus, we don't need a - separate check for the option. This will also - ensure that aes_dep is always defined and we can - use it in the tests/check/meson.build unit. - Fixes #1660 - v2: handle -Daes=disabled, too. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2522> - -2021-08-31 17:33:02 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/gstwpesrcbin.cpp: - wpe: Add support for web:// URIs - The CEF source already supports this. No good reason for wpesrc not too ;) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2503> - -2021-07-23 23:38:22 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah264dec.c: - va: h264dec: Try to use ConstrainedBaseline or Main to decode BaseLine. - In the h264, the Baseline profile is widely misused. A lot of streams declare - that they are the Baseline, but in fact they just conform to ConstrainedBaseline. - The features such as FMO and ASO are not used at all. - If the decoder does not strictly conforms to the SPEC, we can just use Baseline - or Main profile to decode it to avoid lots of streams failure. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2428> - -2021-07-28 23:19:15 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264dec: Improve the fast bump for the live mode. - We control the policy of fast bump by the profile and the compliance - property. For baseline and constrained baseline profiles, we can use - more radical bump policy. User can also change the bump policy by - setting the compliance property in run time. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2432> - -2021-07-28 22:48:21 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264: Change the low_latency to an enum for dpb_needs_bump(). - The bool parameter of low_latency is not enough. We have multi policies for - low latency bumping, from the safest to something radical. So we need an enum - to represent the proper latency requirement. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2432> - -2021-07-26 16:09:19 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - codecs: h264dec: Add a compliance property to control behavior. - Some features such as the low-latency DPB bumping and mapping the - baseline profile as the constrained-baseline profile do not conform - to the H264 offical spec. But in practice, they are very useful and - are widely needed. We add this compliance property to control the - behavior of the decoder, make it fit more requirement. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2432> - -2021-09-12 12:23:36 +0100 Philippe Normand <philn@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - docs: Update cache - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2521> - -2021-09-07 10:55:10 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/va/gstvafilter.c: - va: Update vapostproc documentation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2021-09-07 10:16:05 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - * sys/va/gstvavpp.c: - va: Update todo lists, removing deinterlacing. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2021-08-23 11:24:40 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/va/gstvadeinterlace.c: - * sys/va/gstvadeinterlace.h: - * sys/va/meson.build: - * sys/va/plugin.c: - Add vadeinterlace element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2021-08-24 13:53:12 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - va: filter: Add past and future frames in GstVaSample. - And add them in the pipeline structure if they are provided. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2021-08-24 13:33:29 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - va: filter: Add gst_va_filter_add_deinterlace_buffer() - This function decorates gst_va_filter_add_filter_buffer() to get the - number of past and future frames to hold, given the method. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2020-12-21 18:17:24 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - va: filter: Add deinterlacing method parameter. - For exposing that gobject parameter a new helper function is added: - gst_va_filter_install_deinterlace_properties() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2021-08-23 16:29:36 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: Protect filters array of overwrite. - It's possible to modify the filters array from another GStremer - thread, and the post-processing operation is not atomic, so the filter - array is reffed while the VA pipeline is processed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2021-08-23 15:24:55 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: Add helper function to query pipeline caps. - This function is going to be shared for future deinterlace filter - processing. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2021-08-23 15:16:16 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: Shuffle _destroy_filters_unlocked(). - In order to put it near to its caller. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2021-08-10 17:55:43 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - * sys/va/gstvavpp.h: - * sys/va/plugin.c: - vapostproc: Move up color balance detection to plugin. - In order to install the color balance interface, a GstVaFilter is - instantiated and queried to know if it supports color balance - filter. It was done just after the GObject was registered. Now, it's - done before. - The reason of this change is that deinterlace element has to be - registered only if deinterlace filter is available, using only one - instantiate of GstVaFilter. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2021-09-07 11:35:09 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/va/gstvabasetransform.c: - va: basetransform: Update documentation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2021-09-09 18:26:56 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvabasetransform.h: - va: basetransform: Add autoptr clean up function. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2021-08-23 18:44:30 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvabasetransform.c: - va: basetransform: Use copy_metadata() at buffer import. - Instead of using only gst_buffer_copy_into() use copy_metadata() - vmethod to copy what's needed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2021-08-23 10:40:32 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: don't chain up transform_meta() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495> - -2021-07-29 12:20:30 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * gst-libs/gst/codecs/gstvp9statefulparser.c: - codecs: gstvp9statefulparser: feature_data should be 0 if feature_enable is 0 - The spec says in 6.2.11 that feature_dataij should be zero if - feature_enabledij is zero. Instead we retained the old value in the parser. - Fix it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2449> - -2021-09-08 05:28:22 +0200 Marek Vasut <marex@denx.de> - - * gst-libs/gst/codecparsers/gsth264parser.c: - gsth264parser: Fix handling of NALs with emulation byte set - In case a set of NALs with emulation_prevention_three_byte is decoded using - hardware decoder like Hantro G1, wrong struct v4l2_ctrl_h264_decode_params - .dec_ref_pic_marking_bit_size is passed into the kernel, which results in - decoding artifacts. Subtract the number of emulation three bytes from the - .dec_ref_pic_m->bit_size to get the correct bit size and avoid having these - artifacts. Apply the exact same fix to slice->pic_order_cnt_bit_size as well. - The following NALs (7, 8, 6, 5) decode with artifacts, - .dec_ref_pic_marking_bit_size is set to 10 without this patch. - 00000000 00 00 00 01 27 4d 00 20 89 8b 60 3c 04 bf 2e 02 |....'M. ..`<....| - 00000010 d4 18 04 18 c0 c0 01 77 00 00 5d c1 7b df 05 00 |.......w...{...| - 00000020 00 00 01 28 ee 1f 20 00 00 01 06 05 10 b9 ed b9 |...(.. .........| - 00000030 30 5d 21 4b 71 83 71 2c 10 a3 14 bb 29 80 00 00 |0!Kq.q,....)...| - 00000040 01 25 b8 00 05 00 00 03 03 7f fa 78 1e e7 fd fe |.%.........x....| - ^^^^^^^^^^^^--- emulation 3 byte - 00000050 b4 62 7a 31 ff 7d 81 fd 26 d8 62 b6 d6 25 46 ae |.bz1.}..&.b..%F.| - The following NALs (7, 8, 6, 5) decode fine, - .dec_ref_pic_marking_bit_size is set to 2 without this patch. - 00000000 00 00 00 01 27 4d 00 20 89 8b 60 3c 04 bf 2e 02 |....'M. ..`<....| - 00000010 d4 18 04 18 c0 c0 01 77 00 00 5d c1 7b df 05 00 |.......w...{...| - 00000020 00 00 01 28 ee 1f 20 00 00 01 06 05 10 b9 ed b9 |...(.. .........| - 00000030 30 5d 21 4b 71 83 71 2c 10 a3 14 bb 29 80 00 00 |0!Kq.q,....)...| - 00000040 01 25 b8 00 04 c0 00 03 7f fa 78 1e e7 fd fe b4 |.%........x.....| - 00000050 62 7a 31 ff 7d 81 fd 26 d8 62 b6 d6 25 46 ae ce |bz1.}..&.b..%F..| - Fixes: d0d65fa875 ("codecparsers: h264: record dec_ref_pic_marking() size") - Fixes: 0cc7d6f093 ("codecparsers: h264: record pic_order_cnt elements size") - Signed-off-by: Marek Vasut <marex@denx.de> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2517> - -2021-09-03 14:57:09 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - gsth264parser: reject memory management control op greater than 6 - This prevents assertion from being thrown in - gst_h264_dpb_perform_memory_management_control_operation - if corrupt NAL has a control op greater than 6 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2508> - -2021-08-24 09:59:59 +0000 Ung, Teng En <teng.en.ung@intel.com> - - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkav1dec.c: - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkh264dec.c: - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh265dec.c: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkmjpegdec.c: - * sys/msdk/gstmsdkmjpegenc.c: - * sys/msdk/gstmsdkmpeg2dec.c: - * sys/msdk/gstmsdkmpeg2enc.c: - * sys/msdk/gstmsdkvc1dec.c: - * sys/msdk/gstmsdkvp8dec.c: - * sys/msdk/gstmsdkvp9dec.c: - * sys/msdk/gstmsdkvp9enc.c: - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - msdk: Adjust the plugin and factories description based on MFX_VERSION. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2485> - -2021-09-08 17:32:30 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/vulkan/xcb/gstvkdisplay_xcb.c: - vulkan: don't link to XOpenDisplay in documentation - hotdoc doesn't know about that symbol - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2518> - -2021-08-30 23:26:39 +1000 Jan Schmidt <jan@centricular.com> - - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mpeg2enc/gstmpeg2enc.hh: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - mpeg2enc: Only allow 1 pending frame for encoding - Having an unlimited input queue is very bad if the - encoder can't run at real-time. Eventually it will - consume all RAM. I don't really see any reason to - have more than 1 outstanding encoded frame, so - remove the queue and limit things to 1 pending frame. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2499> - -2021-09-01 17:35:45 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/wpe-extension/gstwpeaudiosink.c: - wpe: Fix race condition on teardown - There was a race when going to PAUSED while pushing a buffer to the - pipeline process (where we weren't even cancelling anything). - This rework base all the cancellation around the GCancellable - "cancelled" signal trying to ensure that the streaming thread will not - block once a cancel operation happens. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2504> - -2021-09-01 17:26:04 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/gstwpesrcbin.cpp: - wpe: Use the new element.get_current_running_time API - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2504> - -2021-09-01 17:24:45 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/gstwpesrcbin.cpp: - wpe: Mark first buffer as starting at 0 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2504> - -2021-09-02 22:06:52 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gstvideoparseutils.c: - videoparseutils: Fix for wrong CEA708 minimum size check - The minimum possible size of valid CEA708 data is 3 bytes, not 7 bytes - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2505> - -2021-08-29 11:04:17 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/gstwpevideosrc.cpp: - wpevideosrc: Uniformise default value for draw-background property - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2498> - -2021-08-29 10:30:53 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/gstwpevideosrc.cpp: - wpevideosrc: Implement basic heuristic for raw caps negotiation - Before this patch raw caps could be negotiated already with a capsfilter, but in - cases where wpesrc is being auto-plugged this approach can't be used. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2498> - -2021-08-29 10:28:57 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/gstwpevideosrc.cpp: - wpevideosrc: Ensure debug category is set - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2498> - -2021-07-15 21:10:14 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - cccombiner: fix scheduling with interlaced video buffers - The initial code was written with the misunderstanding that - IS_TOP_FIELD indicated that an interlaced buffer contained - a top field, not that it contained only a top field - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2413> - -2021-08-27 15:41:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - Revert "kmssink: Fix fallback path for driver not able to scale scenario" - This reverts commit d2a7b763bef3ca51f0c84cdac52eeed85b0db8fb. - After this change, non-scaled rendered were not centred as expected. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2496> - -2021-08-20 13:28:51 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * gst-libs/gst/codecs/gstav1decoder.c: - codecs: av1dec: Fix to output frame with highest spatial layer - During the output process, if there are multiple frames in a TU (i.e. multi-spatial - layers case), only one frame with the highest spatial layer id should be selected - according to av1 spec. The highest spatial layer id is obtained from idc value of - the operating point. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2475> - -2021-08-24 14:33:42 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/dash/gstxmlhelper.c: - * tests/check/elements/dash_mpd.c: - dashdemux: copy ContentProtection element including xml namespaces - Commit bc09d8cc changed gstmpdparser to put the entire - <ContentProtection> element in the "value" field, so that DRMs - other than PlayReady could make use of the data inside this - element. - However, the data in the "value" field does not include any - XML namespace declarations that are used within the element. This - causes problems for a namespace aware XML parser that wants to - make use of this data. - This commit modifies the way the XML is converted to a string - so that XML namespaces are preserved in the output. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2487> - -2021-08-26 21:26:01 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * docs/plugins/gst_plugins_cache.json: - * gst/debugutils/gsterrorignore.c: - * gst/debugutils/gsterrorignore.h: - errorignore: Add ignore-eos mode - It's otherwise very complicated to ignore GST_FLOW_EOS without a - ghostpad's chain function to rewrite. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2492> - -2021-08-27 17:25:04 +1000 Brad Hards <bradh@frogmouth.net> - - * gst-libs/gst/codecparsers/gsth264parser.c: - gsth264parser: fix typo in debug message - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2493> - -2021-08-26 04:12:07 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: add support for closedcaption input - Some closedcaption elements like sccenc except input buffers - to have timecode metas. The original use case is to serialize - closed captions extracted from a video stream, in that case - ccextractor copies the video time code metas to the closed - caption buffers, but no such mechanism exists when creating - a CC stream ex nihilo. - Remedy that by having timecodestamper accept closedcaption - input caps, as long as they have a framerate. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2490> - -2021-07-06 12:31:42 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/aes/gstaes.c: - * ext/aes/gstaesdec.c: - * ext/aes/gstaesdec.h: - * ext/aes/gstaesenc.c: - * ext/aes/gstaesenc.h: - * ext/aes/gstaeshelper.c: - * ext/aes/gstaeshelper.h: - * ext/aes/meson.build: - * ext/meson.build: - * meson_options.txt: - * tests/check/elements/aesdec.c: - * tests/check/elements/aesenc.c: - * tests/check/meson.build: - aes: add aes encryption and decryption elements - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1505> - -2021-05-10 12:02:20 +0200 Johan Sternerup <johast@axis.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Return typed "sctp-transport" - With GstWebRTCSCTPTransport type exposed we can now define - "sctp-transport" property as being of this type. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2214> - -2021-05-07 08:12:25 +0200 Johan Sternerup <johast@axis.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/meson.build: - * ext/webrtc/webrtcdatachannel.c: - * ext/webrtc/webrtcdatachannel.h: - * ext/webrtc/webrtcsctptransport.c: - * ext/webrtc/webrtcsctptransport.h: - * gst-libs/gst/webrtc/meson.build: - * gst-libs/gst/webrtc/sctptransport.c: - * gst-libs/gst/webrtc/sctptransport.h: - * gst-libs/gst/webrtc/webrtc-priv.h: - * gst-libs/gst/webrtc/webrtc_fwd.h: - webrtc: Split sctptransport into lib and implementation parts - GstWebRTCSCTPTransport is now made into into an abstract base class - that only contains property specifications matching the - RTCSctpTransport interface of the W3C WebRTC specification, see - https://w3c.github.io/webrtc-pc/#rtcsctptransport-interface. This - class is put into the WebRTC library to expose it for applications and - to allow for generation of bindings for non-dynamic languages using - GObject introspection. - The actual implementation is moved to the subclass WebRTCSCTPTransport - located in the WebRTC plugin. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2214> - -2021-05-03 10:45:42 +0200 Johan Sternerup <johast@axis.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Expose SCTP Transport - Being able to access the SCTP Transport object from the application - means the application can access the associated DTLS Transport object - and its ICE Transport object. This means we can observe the ICE state - also for a data-channel-only session. The collated - ice-connection-state on webrtcbin only includes the ICE Transport - objects that resides on the RTP transceivers (which is exactly how it - is specified in - https://w3c.github.io/webrtc-pc/#rtciceconnectionstate-enum). - For the consent freshness functionality (RFC 7675) to work the ICE - state must be accessible and consequently the SCTP transport must be - accessible for enabling consent freshness checking for a - data-channel-only session. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2214> - -2021-04-20 20:04:33 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: fix broken header AU emission by base class - This encoder advertises alignment=au as output format, which means - each output frame should contain a full decodable access unit. - The video encoder base class is not aware of our output alignment - and will output spurious buffers with just the SPS/PPS inside when - we call gst_video_encoder_set_headers(), which is broken because - each buffer is supposed to contain a full decodable access unit - in our case. - Just don't tell the base class about our headers, they will be - sent at the beginning of each IDR frame anyway. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2178> - -2021-04-20 19:43:53 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: fix caps and header buffer leak - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2178> - -2021-04-20 19:11:12 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: fix broken sps/pps header generation - This was putting a truncated SPS into the initial header instead - of the PPS because it was always reading from the beginning of the - bitstream buffer (pBsBuf) and not from the offset where the current - NAL is at in the bitstream buffer (psBsBuf + nal_offset). - This was broken in commit 17113695. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1576 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2178> - -2021-08-22 00:33:58 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11bufferpool.cpp: - * gst-libs/gst/d3d11/gstd3d11bufferpool.h: - * sys/d3d11/gstd3d11compositor.cpp: - * sys/d3d11/gstd3d11convert.cpp: - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11deinterlace.cpp: - * sys/d3d11/gstd3d11desktopdupsrc.cpp: - * sys/d3d11/gstd3d11download.cpp: - * sys/d3d11/gstd3d11upload.cpp: - * sys/d3d11/gstd3d11videosink.cpp: - * sys/mediafoundation/gstmfvideoenc.cpp: - d3d11bufferpool: Hide buffer_size field from header - User can get the required buffer size by using buffer pool config. - Since d3d11 implementation is a candidate for public library in the future, - we need to hide everything from header as much as possible. - Note that the total size of allocated d3d11 texture memory by GPU is not - controllable factor. It depends on hardware specific alignment/padding - requirement. So, GstD3D11 implementation updates actual buffer size - by allocating D3D11 texture, since there's no way to get CPU accessible - memory size without allocating real D3D11 texture. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2482> - -2021-08-21 02:20:11 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/cuda-converter.c: - * sys/nvcodec/gstcudaconvert.c: - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdecoder.c: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvenc.h: - nvcodec: Fix various typos - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2481> - -2021-08-21 02:10:37 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/cuda-converter.h: - * sys/nvcodec/gstcudacontext.h: - * sys/nvcodec/gstcudafilter.h: - * sys/nvcodec/gstcudaloader.h: - * sys/nvcodec/gstcudanvrtc.h: - * sys/nvcodec/gstcudautils.h: - * sys/nvcodec/gstcuvidloader.h: - * sys/nvcodec/gstnvbaseenc.h: - * sys/nvcodec/gstnvenc.h: - * sys/nvcodec/gstnvh264dec.h: - * sys/nvcodec/gstnvh264enc.h: - * sys/nvcodec/gstnvh265dec.h: - * sys/nvcodec/gstnvh265enc.h: - * sys/nvcodec/gstnvrtcloader.h: - nvcodec: Get rid of G_GNUC_INTERNAL - Our default symbol visibility is hidden, so G_GNUC_INTERNAL - is pointless - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2481> - -2021-08-19 16:45:18 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264: Fix split field handling - Split fields ends up on multiple picture and requires accessing the - other_field to complete the information (POC). - This also cleanup the DPB from non-reference (was not useful) and skips - properly merge field instead of keeping them duplicated. This fixes most - of interlace decoding seen in fluster. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2474> - -2021-08-19 11:40:22 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codec: h264: Implement support for split fields - When a frame is composed of two fields, the base class now split the - picture in two. In order to support this, we need to ensure that picture - buffer is held in VB2 queue so that the second field get decoded into - it. This also implements the new_field_picture() virtual and sets the - previous request on the new picture. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2474> - -2021-08-20 11:23:57 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264: Fix filling weight factors - This was a typo, the wrong index was used to set l1 weight (b-frames). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2480> - -2021-08-20 14:34:53 +0200 Edward Hervey <edward@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Properly initalize GError - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2476> - -2021-08-19 21:56:05 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfsourcereader.cpp: - * sys/mediafoundation/gstmfutils.cpp: - * sys/mediafoundation/gstmfutils.h: - mfvideosrc: Fix for negative MF stride - Negative stride value can be used in MediaFoundation to inform - whether memory layout is top-down or bottom-up manner. Note that - negative stride is allowed only for RGB, system memory. - See also - https://docs.microsoft.com/en-us/windows/win32/medfound/image-stride - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1646 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2473> - -2021-08-18 11:14:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Fix slice header bit size calculation - The emulation bytes need to be removed as bytes, not bit. This fixes - decoding issues with files that have emulation bytes with the Cedrus - driver. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2471> - -2021-08-12 14:08:19 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * tests/examples/va/multiple-vpp.c: - example: va: Add skin tone enhancement. - If camera is used as input stream and skin tone parameter is available - in vapostproc, and no random changes are enabled, the skin tone will - be enabled. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2470> - -2021-08-17 14:04:41 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Use vapostproc as debug category name. - Otherwise is difficult to remember the different name. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2470> - -2021-08-12 13:54:34 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * tests/examples/va/multiple-vpp.c: - examples: va: Add random cropping. - And remove unused caps filter. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2443> - -2021-07-28 13:04:50 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Disable cropping in pass-through mode. - Originally, if a buffer arrives with crop meta but downstream doesn't - handle crop allocation meta, vapostproc tried to reconfigure itself to - non pass-through mode automatically. Sadly, this behavior was based on - the wrong assumption that propose_allocation() vmethod would bring - downstream allocation query, but it is not. - Now, if vapostproc is in pass-through mode, the cropping is passed to - downstream. Pass-through mode can be disabled via a parameter. - Finally, if pass-through mode isn't enabled, it's assumed the buffer - is going to be processed and, if cropping, downstream already - negotiated the cropped frame size, thus it's required to do the - cropping inside vapostproc to avoid artifacts because of the size of - downstream allocated buffers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2443> - -2021-08-17 14:54:21 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Update filters update_properties(). - Right after instantiating the VA filter and changing the element - state, rebuild the image filters. - This will fix a regression from f20b3b815, where properties in a - gst-launch pipeline are not applied. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2443> - -2021-08-18 09:13:45 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Fix PAL/NTSC widescreen autodetection when switching back to non-widescreen - Previously it would only switch to widescreen but never back. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2469> - -2021-07-20 18:15:11 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: Fix frc from lower fps to higher fps - There are three framerate conversion algorithms described in - <https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md>, - interpolation is not implemented so far and thus distributed timestamp algorihtm - is considered to be more practical which evenly distributes output timestamps - according to output framerate. In this case, newly generated frames are inserted - between current frame and previous one, timestamp is calculated by msdk API. - This implementation first pushes newly generated buffers(outbuf_new) forward and - the current buffer(outbuf) is handled at last round by base transform automatically. - A flag "create_new_surface" is used to indicate if new surfaces have been generated - and then push new outbuf forward accordingly. - Considering the upstream element may not be the msdk element, it is necessary to - always set the input surface timestamp as same as input buffer's timestamp and - convert it to msdk timestamp. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2418> - -2021-05-06 22:22:12 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: improve matching on the correct jitterbuffer - The mapping between an RTP session and the SDP m= line is not always the - same, especially when BUNDLEing is used. - This causes a failure in a specific case where if when bundling, - if mline 0 is a data channel, and mline 1 an audio/video section, - then retrieving the transceiver at mline 0 (rtp session used) will fail - and cause an assertion. - This fix is actually potentially a regression for cases where the remote - part does not provide the a=ssrc: media level SDP attributes as is now - becoming common, especially when simulcast is involved. - The correct fix actually requires reading out header extensions as used - with bundle for signalling in the actual data, what media and therefore - transceiver is being used. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2467> - -2021-08-16 13:45:39 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/va/gstvadisplay.h: - * sys/va/gstvaav1dec.c: - * sys/va/gstvabasedec.c: - * sys/va/gstvacaps.c: - * sys/va/gstvafilter.c: - * sys/va/gstvah264dec.c: - * sys/va/gstvah265dec.c: - * sys/va/gstvampeg2dec.c: - * sys/va/gstvavp8dec.c: - * sys/va/gstvavp9dec.c: - * sys/va/gstvavpp.c: - va: Use GST_CAPS_FEATURE_MEMORY_VA to replace "memory:VAMemory". - "memory:VAMemory" is a commonly used string which notates our VA-kind - memory type. We now used a definition in va lib to replace the simply - string usage. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2466> - -2021-08-16 13:32:51 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvacaps.c: - * sys/va/gstvafilter.c: - va: Use MEMORY_DMABUF definition to replace "memory:DMABuf" strings. - GST_CAPS_FEATURE_MEMORY_DMABUF is already a common definition, we should - just use it rather than use the "memory:DMABuf" strings by ourselves. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2466> - -2021-08-09 19:02:56 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/fdkaac/gstfdkaacenc.c: - fdkaacdec: Add Converter class to hint gst-validate - fdkaacdec have minimal conversion capability, adding the Converter class allow - gst-validate to behave properly and not spit an error when it notice that the - number of channels or rate miss-match in and out. - Same logic as with opusdec, see: https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1142> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2462> - -2021-06-09 23:29:43 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/plugin.c: - wasapi2: Increase rank to primary + 1 - wasapi2 plugin should be preferred than old wasapi plugin if available because: - * wasapi2 supports automatic stream routing, and it's highly recommended - feature for application by MS. See also - https://docs.microsoft.com/en-us/windows/win32/coreaudio/automatic-stream-routing - * This implementation must be various COM threading issue free by design - since wasapi2 plugin spawns a new dedicated COM thread and all COM objects' - life-cycles are managed correctly. - There are unsolved COM issues around old wasapi plugin. Such issues are - very tricky to be solved unless old wasapi plugin's threading model - is re-designed. - Note that, in case of UWP, wasapi2 plugin's rank is primary + 1 already - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2314> - -2021-08-12 20:39:24 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: fix overflow when not doing framerate conversion - When converting from one framerate to another, counters are - reset periodically, however when not converting they never are - and can_genearte_output ends up making overflow-prone calculations - with large values for input_frames and output_frames. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2465> - -2021-08-12 15:26:27 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Don't assume that non-audio medias are video medias when creating transceivers - And print the unknown media kind in the logs. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2464> - -2021-08-12 15:25:50 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Use the correct media for deciding the media kind when creating the transceiver from the SDP - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2464> - -2021-07-29 21:30:32 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264dec: Output the picture directly if already a frame. - We forget one case that is the frame and field pictures may be mixed - together. For this case, the dpb is interlaced while the last picture - may be a complete frame. We do not need to cache that complete picture - and should output it directly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2448> - -2021-08-06 17:11:55 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvacaps.c: - va: caps: Make the template raw video caps classified by features. - The current output of raw video caps is not good. When we have multi - profiles and each profile support different formats, the output of - gst-inspect may like: - SRC template: 'src' - Availability: Always - Capabilities: - video/x-raw(memory:VAMemory) - width: 1, 16384 - height: 1, 16384 - format: NV12 - video/x-raw - width: 1, 16384 - height: 1, 16384 - format: NV12 - video/x-raw(memory:VAMemory) - width: 1, 16384 - height: 1, 16384 - format: P010_10LE - video/x-raw - width: 1, 16384 - height: 1, 16384 - format: P010_10LE - video/x-raw(memory:VAMemory) - width: 1, 16384 - height: 1, 16384 - format: P012_LE - video/x-raw - width: 1, 16384 - height: 1, 16384 - format: P012_LE - The gst_caps_simplify does not classify the caps by same features, but - just leave them interweaved. We need to handle them manually here, the - result should be: - SRC template: 'src' - Availability: Always - Capabilities: - video/x-raw - width: 1, 16384 - height: 1, 16384 - format: { (string)P010_10LE, (string)P012_LE, (string)NV12 } - video/x-raw(memory:VAMemory) - width: 1, 16384 - height: 1, 16384 - format: { (string)P010_10LE, (string)P012_LE, (string)NV12 } - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2456> - -2021-07-27 13:22:02 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Inherit from GstVaBaseTransform. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2442> - -2021-02-17 17:15:22 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvabasetransform.c: - * sys/va/gstvabasetransform.h: - * sys/va/meson.build: - va: Add base transform class. - This base transform class is a derivable class for VA-based filters, - for example vapostproc right now, but it will be used also for - future elements such as vadeinterlace. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2442> - -2021-07-27 13:03:37 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvapool.c: - * sys/va/gstvapool.h: - va: pool: Add gst_va_pool_new_with_config(). - It is a function helper. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2442> - -2021-08-10 02:48:01 +0900 Seungha Yang <seungha@centricular.com> - - d3d11window: Misc code cleanup - * Remove unnecessary upcasting. We are now dealing with C++ class objects - and don't need explicit C-style casting in C++ world - * Use helper macro IID_PPV_ARGS() everywhere. It will make code - a little short. - * Use ComPtr smart pointer instead of calling manual IUnknown::Release() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2461> - -2021-08-10 02:48:45 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11compositor.cpp: - d3d11compositor: Fix indent - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2461> - -2021-05-28 17:36:15 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/openh264/gstopenh264enc.cpp: - * ext/openh264/meson.build: - openh264: Respect level set downstream - We were not specifying the requested level to openh264 meaning that - it was choosing anything and was not respecting what was specified\ - downstream - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2289> - -2021-08-04 15:02:01 +0800 He Junyan <junyan.he@intel.com> - - * ext/x265/gstx265enc.c: - x265: Fix a deadlock when failing to create the x265enc. - The GST_ELEMENT_ERROR will call the gst_object_get_path_string and - use gst_object_get_parent to get the full object path name, which - needs to lock the object. But we are already in a locked context and - so this will cause a deadlock, the pipeline can not exit normally. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2451> - -2021-07-22 20:58:02 +0000 R S Nikhil Krishna <rsnk96@gmail.com> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: mention setting librtmp flags in docs - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2424> - -2021-08-05 23:11:26 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - mpeg2enc: fix interlace-mode detection - Previously, the code was always assuming progressive input, - fix this by looking at the caps. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2455> - -2021-05-23 19:15:25 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlhttpsrc.c: - * ext/faad/gstfaad.c: - * ext/hls/gsthlsdemux.c: - * ext/teletextdec/gstteletextdec.c: - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxftypes.c: - * gst/rtmp2/rtmp/amf.c: - * meson.build: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/jni/gstamc-codeclist-jni.c: - * sys/androidmedia/jni/gstamc-format-jni.c: - * sys/androidmedia/magicleap/gstamc-format-ml.c: - * tests/check/libs/mpegts.c: - Use g_memdup2() where available and add fallback for older GLib versions - g_memdup() is deprecated since GLib 2.68 and we want to avoid - deprecation warnings with recent versions of GLib. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2280> - -2021-08-05 13:02:00 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Fix latency calculation - The LTC extra latency is in ms already and not in frames, so multiplying - with the framerate will end up with a wrong number. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2453> - -2021-07-18 00:51:04 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - msdk: make sure child context is destroyed first - The parent context shares some resources with child context, so the - child context should be destroyed first, otherwise the command below - will trigger a segmentation fault - $> gst-launch-1.0 videotestsrc num-buffers=100 ! msdkh264enc ! \ - msdkh264dec ! fakesink videotestsrc num-buffers=50 ! \ - msdkh264enc ! msdkh264dec ! fakesink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2435> - -2021-08-02 16:22:06 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - d3d11videosink: Fix warning around GstVideoOverlay::expose() - When expose() is called, d3d11videosink needs to redraw using - cached buffer, so gst_d3d11_window_render() should allow null buffer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2450> - -2021-07-31 01:05:47 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - d3d11videosink: Forward navigation event without modification - Current implementation for translating native coordinate and - video coordinate is very wrong because d3d11videosink doesn't - understand native HWND's coordinate. That should be handled - by GstD3D11Window implementation as an enhancement. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2450> - -2021-07-31 00:59:14 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11videosink: Add support for GstVideoOverlay::set_render_rectangle - Inspired by an MR https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2382 - The idea is that we can make use of MoveWindow() in WIN32 d3d11window - implementation safely because WIN32 d3d11window implementation creates - internal HWND even when external HWND is set and then subclassing is used to - draw on internal HWND in any case. So the coordinates passed to MoveWindow() - will be relative to parent HWND, and it meets well to the concept of - set_render_rectangle(). - On MoveWindow() event, WM_SIZE event will be generated by OS and then - GstD3D11WindowWin32 implementation will update render area including swapchain - correspondingly, as if it's normal window move/resize case. - But in case of UWP (CoreWindow or SwapChainPanel), we need more research to - meet expected behavior of set_render_rectangle() - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1416 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2450> - -2021-07-29 18:05:35 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvavp8dec.c: - va: vp8: fix the overflow in _fill_quant_matrix(). - The gint8 of qi and qi_base may overflow when calculation the matrix - parameters and change the decoding result. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2447> - -2021-06-21 00:19:17 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11device.cpp: - * gst-libs/gst/d3d11/gstd3d11format.h: - * tests/check/elements/d3d11colorconvert.c: - d3d11: Disable packed and subsampled YUV formats - Direct3D11 sampler doesn't support them very well, and conversion - outputs usually result in poor visual quality with our shader code. - Should disable support for such formats for now - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2344> - -2021-07-26 16:43:47 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Notify when ignore_pcr is set - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2437> - -2021-07-27 23:53:06 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - cccombiner: fix CDP padding detection - While a cc_data_pkt with cc_valid 0 should be considered padding, - it might be followed up by valid DTVCC packets, and should not - cause the whole CDP packet to get discarded. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2440> - -2021-07-27 12:51:08 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264dec: Improve the find_first_field_picture(). - We need to consider the first field of the last picture when the - last picture can not enter the DPB. - Another change is, when prev field's frame_num is not equal to the - current field's frame_num, we should also return FASLE because it - is also a case of losing some field. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2430> - -2021-07-27 12:16:13 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264dec: consider the last field when add picture to DPB. - There are cases that the first field of the last picture is not a - ref but the second field is a ref. We need to add both of them - because the bumping always needs a complete frame in the DPB. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2430> - -2021-07-27 10:51:03 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264dec: Consider the field case when directly output. - For interlaced streams, it is also possible that the last frame is - not able to be inserted into DPB when the DPB is full and the last - frame is a non ref. For this case, we need to hold a extra ref for - the first field of the last frame and wait for the complete frame - with both top and bottom fields. For the progressive stream, the - behaviour is unchanged. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2430> - -2021-07-26 01:16:34 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264dec: Fix a error print of dpb_add. - When the dpb is interlaced, the max size should be 2*dpb->max_num_frames, - correcting the error print info for that. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2430> - -2021-07-28 16:11:36 +0900 Seungha Yang <seungha@centricular.com> - - * sys/decklink/linux/DeckLinkAPIDispatch.cpp: - decklink: Don't print error for dlopen failure - This is not a fatal error on systems without decklink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2441> - -2021-07-27 12:21:41 +0200 Imanol Fernandez <ifernandez@igalia.com> - - * gst-libs/gst/play/gstplay.c: - * gst-libs/gst/player/gstplayer.c: - player: Add static keyword to _config_quark_table - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2439> - -2021-07-27 14:52:38 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/meson.build: - * sys/applemedia/videotexturecache-vulkan.mm: - applemedia: silence a couple of MoltenVK warnings - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2433> - -2021-07-27 11:49:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/debugutils/gstfakeaudiosink.c: - * gst/debugutils/gstfakevideosink.c: - debugutils: Only proxy the properties once - The needed once call was removed accidently during porting. This was catch by - the CI as memory leaks. - Related to !2426 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2438> - -2021-07-27 12:13:43 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfd10.c: - mxf: Handle D10 "picture only" variant - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/80 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2436> - -2021-07-24 13:19:39 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - * sys/va/gstvavpp.c: - va: filter: refactor convert_surface() to process() - The idea of this change is to add, in the future, - process_with_generator(), when multiple input surfaces are processed, - for blending. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2431> - -2021-07-18 12:46:08 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - * sys/va/gstvavpp.c: - va: filter: Refactor set_formats() to set_video_info(). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2431> - -2021-07-18 17:13:16 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - vapostproc: Don't add video alignment option in buffer pool. - vapostproc will not call gst_buffer_pool_config_set_video_alignment(), - thus this option is not required. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2431> - -2021-07-27 09:37:49 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfvc3.c: - mxfvc3: Also accept clip-wrapped vc-3 - We can now handle this fine - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2434> - -2021-07-27 07:59:52 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Handle EOS with non-frame wrapping - When reaching the end of non-frame wrapping track in pull mode, we want to force - the switch to the next non-eos pad. This is similar to when we exceed the - maximum drift. - Fixes issues on EOS where not everything would be drained out and stray errors - would pop out. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2434> - -2021-07-25 07:52:06 +0200 Edward Hervey <edward@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/mxf/mxfdemux.c: - mxfdemux: More granular interleaved content handling - An interleave of 500ms can be way too big for some downstream queueing - elements. Instead use a smaller 100ms interleave and silence the various - warnings about resyncing (it's normal) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2434> - -2021-07-23 09:36:10 +0100 Philippe Normand <philn@igalia.com> - - * gst/debugutils/gstfakeaudiosink.c: - * gst/debugutils/gstfakesinkutils.c: - * gst/debugutils/gstfakesinkutils.h: - * gst/debugutils/gstfakevideosink.c: - * gst/debugutils/meson.build: - debugutils: De-duplicate proxy_properties function to a new utils module - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2426> - -2021-06-08 01:40:34 +0900 Seungha Yang <seungha@centricular.com> - - * meson_options.txt: - * sys/asio/gstasiodeviceprovider.cpp: - * sys/asio/gstasiodeviceprovider.h: - * sys/asio/gstasioobject.cpp: - * sys/asio/gstasioobject.h: - * sys/asio/gstasioringbuffer.cpp: - * sys/asio/gstasioringbuffer.h: - * sys/asio/gstasiosink.cpp: - * sys/asio/gstasiosink.h: - * sys/asio/gstasiosrc.cpp: - * sys/asio/gstasiosrc.h: - * sys/asio/gstasioutils.cpp: - * sys/asio/gstasioutils.h: - * sys/asio/meson.build: - * sys/asio/plugin.c: - * sys/meson.build: - Introduce Steinberg ASIO (Audio Streaming Input/Output) plugin - Adds a new plugin for ASIO devices. - Although there is a standard low-level audio API, WASAPI, on Windows, - ASIO is still being broadly used for audio devices which are aiming to - professional use case. In case of such devices, ASIO API might be able - to show better quality and latency performance depending on manufacturer's - driver implementation. - In order to build this plugin, user should provide path to - ASIO SDK as a build option, "asio-sdk-path". - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2309> - -2021-06-06 22:32:08 +0900 Seungha Yang <seungha@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/audiolatency/gstaudiolatency.c: - * gst/audiolatency/gstaudiolatency.h: - audiolatency: Expose samplesperbuffer property - ... for user to be able to set the number of required samples. - For instance, our default value is 240 samples - (about 5ms latency in case that sample rate is 48000), which might - be larger than actual buffer size of audio capture device. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2307> - -2021-07-23 22:02:05 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: let print_ref_pic_list_b print the correct list name. - The print_ref_pic_list_b now not only needs to trace the ref_pic_list_b0/1, - but also need to trace the ref_frame_list_0_short_term. We need to pass the - name directly to it rather than an index to refer to ref_pic_list_b0/1. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2425> - -2021-07-23 12:31:17 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264dec: Fix a typo in construct_ref_field_pic_lists_b. - The array sort of ref_frame_list_0_short_term has some typo. The - typo makes this list not in the POC ascend order and generate wrong - decoding result for interlaced streams. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2425> - -2021-07-15 05:12:37 -0700 Devarsh Thakkar <devarsh.thakkar@xilinx.com> - - * sys/kms/gstkmssink.c: - kmssink: Fix fallback path for driver not able to scale scenario - When driver return error on update plane request, kmssink - disables the scaling and retries plane update. - While doing so kmssink was matching the source rectangle dimensions - to the target rectangle dimensions which were calculated - as per scaling but this is incorrect, instead what we want here is - that target rectangle dimensions should match the source rectangle - dimensions as scaling is disabled now and so we match result - rectangle dimensions with source rectangle dimensions. - While at it, also match the result rectangle coordinates for - horizontal and vertical offsets with source rectange coordinates, - as since there is no scaling being done so no recentering is - required. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2415> - -2021-07-23 16:49:49 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstvp9parse.c: - videoparsers: vp9: Need to process the first frame even not key. - Some cut VP9 streams begin with a non key frame. The current code - just bail out the parse_process_frame() if not a key frame. Because - of this, we do not set the valid caps before we push the data of the - first frame(even this first frame will be discarded by the downstream - decoder because it is not a key frame). - The pipeline such as: - gst-launch-1.0 filesrc location=some.ivf ! ivfparse ! vp9parse ! - vavp9dec ! fakesink - will get a negotiation error and the pipeline can not continue. The - correct behaviour should be: the decoder discard the first frame and - continue to decode later frames successfully. - So, when the parse does not have valid stream info(should be the first - frame case), we should continue and report caps. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2427> - -2021-07-21 19:40:17 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/audiolatency/gstaudiolatency.c: - audiolatency: Handle audio buffers with invalid duration - pipewiresrc outputs audio buffers without a valid duration, so we need - to calculate it manually in that case. - Upstream issue: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1438 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2419> - -2021-07-22 22:00:38 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah265dec.c: - va: h265dec: Do not assign the frame->output_buffer until output_picture. - We may need to drop the slices such as RASL pictures with the NoRaslOutputFlag, so - the current picture of h265decoder may be freed. We should not assign the frame-> - output_buffer too early until we really output it. Or, the later coming slices will - allocate another picture and trigger the assert of: - gst_video_decoder_allocate_output_frame_with_params: - assertion 'frame->output_buffer == NULL' failed - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2421> - -2021-07-22 15:14:26 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Handle PCR-less streams - Some programs specify a PCR PID but don't actually store any PCR values, or are - way too far apart. - In order to gracefully handle those situations, we will queue up to a certain - amount of pending buffers before deciding to give up on that PCR PID and not use - any (i.e. using DTS/PTS values as-is) - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1629 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2422> - -2021-07-22 10:44:27 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah265dec.c: - va: H265: Add odd bit depth and chroma depth in get_rtformat. - In H265, the stream may have odd bit depth such as 9 or 11. And - the bit depth of luma and chroma may differ. For example, the - stream with luma depth of 8 and chroma depth of 9 should use the - 10 bit rtformat as the decoded picture format. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2420> - -2021-07-21 00:04:18 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264dec: Improve the algorithm for low latency mode. - In low_latency mode, try to bump the picture as soon as possible - without the frames disorder: - 1. We can directly output the continuous non-reference frame. - 2. Consider max_num_reorder_frames, which is special useful for - I-P mode. - 3. Consider the leading pictures with negative POC. - 4 Output small POC pictures when non-reference frame comes. - 4. Output the POC increment<=2 pictures. This is not 100% safe, - but in practice this condition can be used. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2373> - -2021-07-20 23:49:12 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264dec: Add help function of dpb_set_max_num_reorder_frames. - The max_num_reorder_frames can be useful for bump check. We store it - in the DPB and no need for the decoder now. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2373> - -2021-07-20 23:36:38 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264dec: Add a flag to record whether picture is reference. - The picture->ref field will change from time to time according to decoder's - state and reference sliding window. We need another flag to record whether - the picture is a reference picture when it is created, and this can help - the bumping check. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2373> - -2021-07-12 00:31:54 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264dec: Change the order of dpb_add and dpb_bump. - The current behavior is different from the SPEC. We should check - and bump the DPB or drain the DPB before we insert the current - picture into it. This may cause the output picture disorder. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2373> - -2021-07-12 00:06:49 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264dec: Modify the DPB need bump check. - Accord to spec, we should not add the current picture into the DPB - when we check whether it needs to bump, so the checks of the IDR and - the "memory_management_control_operation equal to 5" are no needed. - And the spec also says that the DPB only needs to bump when there is - no empty frame buffer left(We handle the IDR cases in other places). - We need to follow that and the max_num_reorder_frames is useless. - We also minus 1 in has_empty_frame_buffer because the current frame - has not been added yet. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2373> - -2021-07-12 00:01:58 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264dec: Make dpb_has_empty_frame_buffer a codecs API. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2373> - -2021-07-05 23:53:25 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264dec: Set picture to a small poc when mem_mgmt_5. - When current frame memory_management_control_operation equal to 5, that - means we need to drain the dpb and the current picture act as an IDR frame. - So it should have smaller poc than the later pictures to ensure the output - order. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2373> - -2021-07-15 11:12:01 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Make gst-indent on the CI happy - grmbl - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2371> - -2021-07-15 10:59:39 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - mxfdemux: Handle non-frame wrapping - * If we have an index table for non-framed essence, we can handle it - * The demuxer has a state which indicates whether it will next fetch a KLV or - data contained *within* a KLV. - * The position on Essence Tracks always correspond to the next entry to fetch, - demuxer offset will be skipped accordingly whenever we switch between - partitions (in case of resyncs). A copy of the main clip/custom KLV for that - partition is kept to track the position within the essence of that partition. - * For clip/custom-wrapped raw audio, if the edit rate is too small (and would - cause plenty of tiny buffers to be outputted), specify a minimum number of edit - units per buffer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2371> - -2021-07-15 10:45:46 +0200 Edward Hervey <edward@centricular.com> - - mxfdemux: Use KLV for position/content tracking - * For pull-based, this avoids pulling content if it's not needed (ex: skipping filler - packet, not downloading the content if we only need to know if/where an essence - packet is, etc...). Allows reducing i/o usage to the minimum. - * This also allows doing sub-klv position tracking, and opens the way for - non-frame-wrapping handling - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2371> - -2021-07-15 10:28:31 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Output the topology of the file in debug logs - This provides a summary of the number/type of tracks in the Material and File - Packages - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2371> - -2021-07-15 10:16:34 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Refactor pull seek - In order to figure out the exact start position (backed by a keyframe) accross - all tracks, we first figure out the backing keyframe position, and *then* seek - to that position. - Avoids ending up in situations where we would properly seek to the backing - keyframe on video ... but not on the audio streams (they would have been set to - the original non-keyframe position). Fixes key-unit seeking. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2371> - -2021-07-14 07:58:01 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfessence.h: - mxfaes-bwf: Handle new custom-constant-sized variant - Defined by Amendment 2:2013 to SMPTE ST 382:2007 - Also define a new "UNKNOWN" wrapping type to make the difference with known - wrapping types - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2371> - -2021-07-14 07:54:38 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfmpeg.c: - mxfmpeg: Fix essence coding detection - The picture essence coding matching was wrong. Use the proper "base" MXFUL for - video mpeg compression for matching. - Also handle the case where some old files would put the essence container label - in the essence coding field - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2371> - -2021-07-01 08:35:01 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - * gst/mxf/mxftypes.c: - * gst/mxf/mxftypes.h: - mxfdemux: Refactor index table and offset handling - * Streamline offset <=> entry handling. Historically the demuxer didn't support - information from index tables and stored the discovered information in an array - per track. When index table support was added, a parallel system was setup for - that relationship. This commit unifies this into one system with the - `find_edit_entry()` and `find_entry_for_offset()` functions. - * By extension, per-track offset entry tables are only created/used if no index - table is present for those tracks. - * Use index table information as-is. The index table system from MXF is quite - complex and there are various ways to use the information contained - within. Instead of converting that information we store the data from the tables - as-is and extract the needed information when needed. - * Handle index tables without entries (i.e. all content package units are of the - same size). - * Allow collecting index table segments as we go instead of only once if a - random-index-pack is present. This also improves support of some files in - push-mode. - * When searching for keyframe entries, use the keyframe_offset if - present (speeds up searching). - * For interleaved content (i.e. several tracks in the sample essence container), - we use a system to be able to identify the position of each track in the delta - entries of index tables. - * Handle temporal offset only on tracks which *do* need it (as specified in the - delta entries of the index tables). If present, those offsets are stored in a - pre-processed table which allows computing PTS from DTS with a simple offset. - * Add a quirk for files which are known to be have wrongly stored temporal - offsets. - * Overall opens the way to handle more types of MXF files, especially those with - non-frame-wrapping. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2371> - -2021-06-29 15:29:36 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Drop duplicate seek events - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2371> - -2021-06-24 09:53:08 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxftypes.c: - mxf: Improve index entry debug log - By printing out the various known flag values - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2371> - -2021-06-23 09:08:33 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfmetadata.c: - mxf: Demote error message when resolving valid empty reference - A Source Clip can have zero'd SourcePackageID and SourceTrackID, this indicates - it terminates the source reference chain - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2371> - -2021-06-17 16:38:54 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - mxfdemux: Handle temporal reordering shift - This is similar to how the same issue was handled in qtdemux. - In order for the "DTS <= PTS" constraint to be respected, we calculate the - maximum temporal reordering that can happen (via index tables). - If there is a non-0 temporal reordering, we: - * Shift all outgoing PTS by that amount - * Shift segment for that stream by that amount - * Don't modify DTS (i.e. they might end up having negative running-time, before - the start of the segment) - Also ensure all entries have a valid PTS set, previously this wouldn't be set - for entries with a temporal offset of 0. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/584 - (and maybe a lot of other issues) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2371> - -2021-07-17 20:49:15 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavp9dec.c: - va: vp9dec: Minor cleanups. - Added a comment with a future to-do, enhanced another comment and - fixed a typo in an error log message. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2417> - -2021-07-17 20:48:21 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - va: decoder: Group decoder methods. - Move up gst_va_decoder_get_config() to group decoders function in the - same file area. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2417> - -2021-07-17 20:45:48 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaav1dec.c: - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - * sys/va/gstvah264dec.c: - * sys/va/gstvah265dec.c: - * sys/va/gstvampeg2dec.c: - * sys/va/gstvavp8dec.c: - * sys/va/gstvavp9dec.c: - va: Refactor _format_changed() to _config_is_equal(). - Change gst_va_decoder_format_changed() to - gst_va_decoder_config_is_equal(), which is more similar with other - GStreamer API. - The function call is replaced but it has to be negated because the - return value is the opposite. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2417> - -2021-07-17 20:37:52 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - * sys/va/gstvavp9dec.c: - va: Refactor _change_resolution() to _update_frame_size(). - Rename gst_va_decoder_change_resolution() to - gst_va_decoder_update_frame_size() which resembles - gst_va_decoder_set_frame_size(). - Also added a comment to clarify the function use and makes more - specific the error message. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2417> - -2021-07-17 20:29:45 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaav1dec.c: - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - * sys/va/gstvah264dec.c: - * sys/va/gstvah265dec.c: - * sys/va/gstvampeg2dec.c: - * sys/va/gstvavp8dec.c: - * sys/va/gstvavp9dec.c: - va: Refactor _set_format() to _set_frame_size(). - Renamed gst_va_decoder_set_format() to - gst_va_decoder_set_frame_size_with_surfaces() which resembles better - the passed parameters. Internally it creates the vaContext. - Added gst_va_decoder_set_frame_size() which is an alias of - gst_va_decoder_set_frame_size_with_surfaces() without surfaces. This - is the function which replaces gst_va_decoder_set_format() where - used. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2417> - -2021-07-16 15:24:11 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gsth265decoder.h: - * sys/nvcodec/gstnvh265dec.c: - codecs: h265decoder: Fix a typo of NumPocTotalCurr when process ref pic list. - We should use the NumPocTotalCurr value stored in decoder, which is a calculated - valid value, rather than use the invalid value in the slice header. Most of the - time, the NumPocTotalCurr is 0 and make the tmp_refs a very short length, and - causes the decoder's wrong result. - By the way, the NumPocTotalCurr is not the correct name specified in H265 spec, - its name should be NumPicTotalCurr. We change it to the correct name. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2414> - -2021-07-16 13:21:11 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah265dec.c: - va: h265dec: Do not add non reference frames into ref list. - The VA's ReferenceFrames should only contain the reference frame, we - should not add the non reference frames into this list. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2414> - -2021-07-15 19:44:21 +0900 Seungha Yang <seungha@centricular.com> - - * tests/check/meson.build: - tests: Enable closedcaption test on Windows - ... if closedcaption plugin is available - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2411> - -2021-07-15 16:44:18 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvideoenc.cpp: - mfvideoenc: Disable RGB format support - Some GPUs support BGRA format and it will be converted to subsampled - YUV format by GPU internally. Disable this implicit conversion - since the conversion parameters such as input/output colorimetry - are not exposed nor it's written in bitstream (e.g., VUI). - We prefer explicit conversion via our conversion elements. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2410> - -2021-07-15 21:32:54 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah265dec.c: - va: h265dec: Fix a temp var overflow bug when write pred weight table. - The temp guint8 var of delta_chroma_offset_l0 and delta_chroma_offset_l1 - can not cover the full range of delta_chroma_weight_l0/1 in the slice - header. When overflow happens, the decoder result is wrong. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2412> - -2021-07-12 12:08:20 +0100 Philippe Normand <philn@igalia.com> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dash: Store entire ContentProtection node in protection event data - Some manifests use the ContentProtection node to store additional information - such as the license server url. Our MPD parser used to process the - ContentProtection node, extracting Playready PSSH boxes. However for other DRM - systems, only the `value` attribute was passed down to the protection event, so - for example, Widevine data was not parsed at all and "Widevine" was passed to - the event, which is not very useful for decryptors that require a PSSH init - data. - Parsing should now be done by decryptors which will receive the entire - ContentProtection XML node as a string. This gives more "freedom" to the - decryptor which can then detect and parse custom nodes as well. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2400> - -2021-07-14 22:36:52 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvavp9dec.c: - va: vp9dec: We need to check the resolution changes for every frame. - The VP9 streams have the ability to change the resolution dynamically - at any time point. It does not send ad KEY frame before change the - resolution, even the INTER frame can change the resolution immediately. - So we need to check the resolution change for each frame and do the - re-negiotiation if needed. - Some insaned stream may play in resolution A first and then dynamically - changes to B, and after 1 or 2 frames, it use a show_existing_frame to - repeat the old frame of resolution A before. So, not only new_picture(), - but also duplicate_picture() need to check this. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2407> - -2021-07-14 14:43:51 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvavp9dec.c: - va: vp9dec: Do not re-create context for dynamical resolution change. - The driver for VP9 should have the ability to handle the dynamical resolution - changes. So if only the resolution changes, we should not re-create the config - and context in negotiation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2407> - -2021-07-14 14:27:34 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - va: decoder: Add helper functions to get and change the resolution. - Some codecs such as VP9, its config and context have the ability to - dynamically. When we only change the width and height, no need to - re-create the config and context. The helper function can just change - the resolution without re-creating config and context. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2407> - -2021-05-29 06:03:26 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - mpegtsmux: Quieten "missed PCR" warnings in VBR mode. - When the muxer is operating in VBR mode, it's kind of expected - for now that we might not put the PCR in exactly the right place, - because the muxer doesn't schedule packets that way. In that case - don't warn constantly about the PCR ending up a few ms off target. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2295> - -2021-07-13 21:38:10 +1000 Matthew Waters <matthew@centricular.com> - - * gst/rtmp2/gstrtmp2src.c: - rtmp2src: workaround a GLib race when destroying a GMainContext/GSource - https://gitlab.gnome.org/GNOME/glib/-/issues/803 - Basically, if destruction of a GSource and its associated GMainContext are - not synchronised, Then the GSource destruction can access freed - GMainContext resources and cause a crash. This is not super common but - can happen. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2405> - -2021-07-08 14:25:23 +0200 Mads Buvik Sandvei <madssandvei@protonmail.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - codecs: h265decoder: Always free messages while parsing SEI - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2390> - -2021-07-14 19:39:11 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gstvp9parse.c: - vp9parse: Skip parsing decode-only frame - Decode-only frame (i.e., show_existing_frame == 1) doesn't hold - any valid information apart from the index of frame to be duplicated. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2408> - -2021-07-13 16:55:30 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/gstwpesrcbin.cpp: - wpesrcbin: Use gst_buffer_new_memdup() - g_memdup() is deprecated. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2406> - -2021-07-12 23:25:02 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gstvp9statefulparser.c: - codecs: vp9statefulparser: not init segmentation_abs_or_delta_update. - The segmentation_abs_or_delta_update is a stateful var, it should not - be inited every time when parsing the segmentation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2403> - -2021-07-12 23:21:29 +0900 Seungha Yang <seungha@centricular.com> - - * tests/check/elements/wasapi2.c: - tests: wasapi2: Add more device reuse cases - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2402> - -2021-07-12 22:17:22 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2ringbuffer.cpp: - wasapi2ringbuffer: Close IAudioClient on GstAudioRingBuffer::release - IAudioClient interface is not reusable once it's initialized. - So we should close the handle and reopen it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2402> - -2021-07-13 03:35:22 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2ringbuffer.cpp: - wasapi2ringbuffer: Run gst-indent - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2402> - -2021-07-12 09:01:06 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * gst-libs/gst/codecparsers/gstav1parser.h: - codecparsers: av1: fix underflow in last_frame_idx - The spec mandates this field be parsed using unsigned arithmetic. Nevertheless, - av1parser will use -1 apparently as an uninitialized value in - gst_av1_parse_frame_header. This immediately underflows last_frame_idx - though, since its type was defined as guint8. Fix this by converting to gint8. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2401> - -2021-03-18 10:55:58 +0100 Jakub Janků <jjanku@redhat.com> - - * sys/wasapi/gstwasapisink.c: - wasapi: fix reinit of audioclient in prepare() - When the sink goes from PLAYING to READY and then back to PLAYING, - the initialization of the audioclient in prepare() fails with the - error AUDCLNT_E_ALREADY_INITIALIZED. As a result, the playback - stops. - To fix this, we need to drop the AudioClient in unprepare() and - grab a new one in prepare() to be able to initialize it again - with the new buffer spec. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2096> - -2021-03-17 22:45:57 +0100 Jakub Janků <jjanku@redhat.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: split gst_wasapi_util_get_device_client() - The functionality now resides in - gst_wasapi_util_get_device() and - gst_wasapi_util_get_audio_client(). - This is a preparatory patch. It will be used in the following - patch to init/deinit the AudioClient separately from the device. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2096> - -2021-07-11 18:14:46 +0200 Jakub Janků <janku.jakub.jj@gmail.com> - - * tests/check/elements/wasapi.c: - * tests/check/meson.build: - tests: wasapi: check PLAYING -> READY -> PLAYING - Such sequence of state changes is valid and no error should happen. - At the moment, the test fails. Following patches aim to fix it. - Partially based on the code in tests/check/elements/wasapi2.c - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2096> - -2021-07-09 14:55:43 +0200 Guido Günther <agx@sigxcpu.org> - - * gst-libs/gst/play/gstplay-signal-adapter.c: - play: Emit correct signal - SIGNAL_MEDIA_INFO_UPDATED should be emitted on media info changes, - not SIGNAL_VIDEO_DIMENSIONS_CHANGED. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2398> - -2021-03-05 09:18:15 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/vulkan/gstvkcommandpool.h: - * gst-libs/gst/vulkan/gstvkdescriptorcache.h: - * gst-libs/gst/vulkan/gstvkdevice.h: - * gst-libs/gst/vulkan/gstvkdisplay.h: - * gst-libs/gst/vulkan/gstvkfullscreenquad.h: - * gst-libs/gst/vulkan/gstvkhandlepool.h: - * gst-libs/gst/vulkan/gstvkinstance.h: - * gst-libs/gst/vulkan/gstvkphysicaldevice.h: - * gst-libs/gst/vulkan/gstvkqueue.h: - * gst-libs/gst/vulkan/gstvkswapper.h: - * gst-libs/gst/vulkan/gstvktrash.h: - * gst-libs/gst/vulkan/gstvkwindow.h: - vulkan: Declare missing auto-pointer cleanup functions. - Also removed a couple guards since, given the glib dependency, they - are set. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2396> - -2021-03-03 12:54:20 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/vulkan/gstvkvideofilter.c: - vulkan: filter: Use filter variable name for choosing queue. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2396> - -2021-03-03 08:50:13 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/vulkan/vksink.c: - vulkansink: Fix element metadata. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2396> - -2021-06-25 09:19:25 +0800 Yinhang Liu <yinhang.liu@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: use NV12 as default format on srcpad - By default, sinkpad is NV12 format and srcpad is BGRA format, the - different format will trigger an implicit format conversion in - msdkvpp, which will cause performance drop. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2394> - -2021-06-01 08:40:17 +0900 Dominique Martinet <dominique.martinet@atmark-techno.com> - - * gst-libs/gst/wayland/wayland.c: - gst-libs/gst/wayland: handle display passing better - failure to pass a display in 'handle' would result in uninitialized value - being returned, which would often segfault later down the road when trying - to initialize gstreamer context with it. - Check the return value of gst_structure_get() to make sure we return valid - data. - Furthermore, the gstglimagesink in gst-plugins-base also has a similar - mechanism but uses 'display' as field name to pass the value; instead of - requiring the application to behave differently depending on what sink - was automatically detected just try to read both values here, with display - being the new default. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2292> - -2021-07-08 14:46:11 +0100 Philippe Normand <philn@igalia.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Log protection events on corresponding pad - GstDashDemuxStream is not a GstObject, so use its pad as associated object when - emitting log messages. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2389> - -2021-07-08 16:49:27 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvafilter.c: - va: vpp: Improve the color properties setting. - The current setting of color properties are not very correct and - we will get some kind of "unknown Color Standard for YUV format" - warnings printed out by drivers. The video-color already provides - some standard APIs for us, and we can use them directly. - We also change the logic to: Finding the exactly match or explicit - standard first. If not found, we continue to find the most similar - one. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2385> - -2021-07-08 19:03:06 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfcapturewinrt.cpp: - * sys/mediafoundation/gstmfsourcereader.cpp: - mfvideosrc: Fix negotiation when interlace-mode is specified - Given caps does not need to be strictly subset of device caps. - Allow accept it if device caps and requested caps can intersect - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1619 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2384> - -2021-07-08 02:24:18 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - cccombiner: mark field 0 as valid when generating padding CDP - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2383> - -2021-07-06 17:14:21 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvideobuffer.cpp: - * sys/mediafoundation/gstmfvideobuffer.h: - mfvideobuffer: Don't error for unexpected Unlock/Unlock2D call - Some GPU vendor's MFT implementation calls IMFMediaBuffer::Unlock() - without previous IMFMediaBuffer::Lock() call. Which is obviously - driver bug but we can ignore the Unlock call. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2381> - -2021-06-30 10:30:43 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dash/gstdashsink.c: - dashsink: fix crash with no pad name for representation - if there is no pad name, the representation id - was NULL, causing a crash when writing the mpd file. - gst-launch-1.0 videotestsrc num-buffers=900 ! video/x-raw, width=800, - height=600, framerate=30/1 ! x264enc ! video/x-h264, profile=high ! - dashsink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2064> - -2021-03-09 11:40:43 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/dash/gstdashsink.c: - dashsink: Add signals for allowing custom playlist/fragment - Instead of always going through the file system API we allow the - application to modify the behaviour. For the playlist itself and - fragments, the application can provide a GOutputStream. In addition the - sink notifies the application whenever a fragment can be deleted. - Following the HLS change: - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/918 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2064> - -2021-07-06 14:06:24 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - codecs: h265dec: Disable the POC order warning for negative POC. - There may be leading frames after the IRAP frames, which has negative - POC. This kind of frames are allowed and they will be displayed before - the IRAP frame. So the warning should not be triggered for them. Init - the last_output_poc to G_MININT32 can avoid this. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2380> - -2021-07-06 13:38:16 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264dec: Disable the POC order warning for negative POC. - There may be leading frames after the IDR frame, which has negative - POC. This kind of frames are allowed and they will be displayed before - the IDR frame. So the warning should not be triggered for them. Init - the last_output_poc to G_MININT32 can avoid this. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2380> - -2021-06-25 15:57:03 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/interlace/gstinterlace.c: - interlace: Push the reconfigure event in the right direction - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2361> - -2021-07-05 15:44:34 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvabasedec.c: - va: basedec: Fix some artifact when do the crop copy. - The default video converter setting will add some artifact into - the picture for 10/12 bits conversion. This make the MD5 checksum - change from the original picture. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2379> - -2021-07-05 02:05:03 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - d3d11decoder: Enable zero-copy for Qualcomm - Qualcomm GPU works fine with current implementation now. - Noticeable difference between when it was disabled and current - d3d11 implementation is that we now support GstD3D11Memory - pool, so there will be no more frequent re-binding decoder surface anymore. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2377> - -2021-07-05 07:42:39 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - mxfdemux: Check validity of interleaved File Package - As specified by the S377 MXF core specification, if a file package has - interleaved content, then all tracks must be using the same Edit Rate - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2378> - -2021-07-05 01:54:02 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11vp9dec: Fix for incorrect use_prev_in_find_mv_refs setting - Set use_prev_in_find_mv_refs depending on context. The value seems - to be used by AMD and Qualcomm (Intel and NVIDIA doesn't make difference - as per test) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2376> - -2021-05-11 14:07:14 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/gstmsdkvideomemory.c: - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/msdk.c: - * sys/msdk/msdk_libva.c: - gstmsdkvpp: add RGBP and BGRP in src pad - It requires MFX version 2.4+ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2234> - -2021-07-04 00:36:27 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfsourcereader.cpp: - * sys/mediafoundation/gstmftransform.cpp: - mediafoundation: Port to IID_PPV_ARGS - Make code short where possible - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2375> - -2021-07-04 00:24:09 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfaacenc.cpp: - * sys/mediafoundation/gstmfmp3enc.cpp: - mfaudioenc: Remove pointless enumerating for hardware audio encoder - Hardware audio encoder can exist in theory, but it's untested - and we are not sure whether it can be preferred over software - implementation which is implemented by MS - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2375> - -2021-07-03 23:12:08 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfaacenc.cpp: - * sys/mediafoundation/gstmfh264enc.cpp: - * sys/mediafoundation/gstmfh265enc.cpp: - * sys/mediafoundation/gstmfmp3enc.cpp: - * sys/mediafoundation/gstmfvp9enc.cpp: - mediafoundation: Fix typos - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2375> - -2021-07-03 22:56:48 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfaacenc.cpp: - * sys/mediafoundation/gstmfaudioenc.cpp: - * sys/mediafoundation/gstmfcapturewinrt.cpp: - * sys/mediafoundation/gstmfh264enc.cpp: - * sys/mediafoundation/gstmfh265enc.cpp: - * sys/mediafoundation/gstmfmp3enc.cpp: - * sys/mediafoundation/gstmfsourcereader.cpp: - * sys/mediafoundation/gstmftransform.cpp: - * sys/mediafoundation/gstmfutils.cpp: - * sys/mediafoundation/gstmfvideobuffer.cpp: - * sys/mediafoundation/gstmfvideoenc.cpp: - * sys/mediafoundation/gstmfvp9enc.cpp: - * sys/mediafoundation/mediacapturewrapper.cpp: - mediafoundation: Run gst-indent - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2375> - -2021-06-26 21:42:37 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah265dec.c: - va: Consider the compatibility when we get_profile() for H265 decoder. - Adding the compatile profiles when we decide the final profile used for decoding. - The final profile candidates include: - 1. The profile directly specified by SPS, which is the exact one. - 2. The compatile profiles decided by the upstream element such as the h265parse. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2322> - -2021-06-27 15:34:28 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Add special profile case for profile_idc 0. - This is a work-around to identify some main profile streams having - wrong profile_idc. There are some wrongly encoded main profile streams - which doesn't have any of the profile_idc values mentioned in Annex-A, - instead, general_profile_idc has been set as zero and the - general_profile_compatibility_flaggeneral_profile_idc is TRUE. - Assuming them as MAIN profile for now. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2322> - -2021-06-26 15:11:47 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Map -intra profiles to non-intra compatible profiles. - All the -intra profiles can map to non-intra profiles as compatible - profiles, except the monochrome case for main and main-10. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2322> - -2021-07-01 19:27:28 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvavp9dec.c: - va: vp9dec: update segmentation and store the result. - The segmentation is stateful, its information may depend on the previous - segmentation setting. For example, if loop_filter_delta_enabled is TRUE, - the filter_levelGST_VP9_REF_FRAME_INTRA1 should inherit the previous - frame's value and can not be calculated by the current frame's segmentation - data only. So we need to maintain the segmentation state inside the vp9 - decoder and update it when the new frame header comes. - We also fix the CLAMP issue of lvl_seg and intra_lvl because of their wrong - uint type here. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2369> - -2021-06-30 15:23:15 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gstvp9statefulparser.c: - codecparsers: vp9statefulparser: Fix the gst_vp9_get_qindex clamp issue. - The alternate quantizer is a delta value and should be int type. - We mark it wrongly as uint, that will make CLAMP (data, 0, 255) - always choose 255 rather than 0 if the data < 0. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2369> - -2021-06-30 15:32:42 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstvp9parser.h: - codecparsers: vp9parser: Use macro to define the size of filter_level in Segmentation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2369> - -2021-06-30 12:15:42 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstvp9parser.h: - codecparsers: vp9parser: Delete the verbose redefine of MAX_LOOP_FILTER. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2369> - -2021-06-29 23:21:24 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaallocator.c: - va: allocator: dma: Fail when mapping the non-linear buffer. - The current way of DMA buffer mapping is simply forwarding the job - to parent's map function, which is a mmap(). That can not handle the - non-linear buffers, such as tiling, compressed, etc. The incorrect - mapping of such buffers causes broken images, which are recognized - as bugs. We should directly block this kind of mapping to avoid the - misunderstanding. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2353> - -2021-07-02 13:10:25 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - * tests/check/elements/ccconverter.c: - ccconverter: fix framerate caps negotiation from non-cdp to cdp - We can only convert from non-cdp to cdp within the confines of valid cdp - framerates. The existing caps negotiation code was allowing any - framerate to convert to a cdp output which is incorrect and would hit an - assertion later. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2372> - -2021-06-09 15:16:39 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - codecs: h265decoder: Consider the conformance window changes when new_sequence(). - The change of conformance_window_flag and crop windows size also has impact on the - output resolution and caps. So it deserves a trigger of new_sequence() to notify - the sub class to update caps and pool. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2312> - -2021-06-16 01:07:09 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - h265decoder: Don't hold reference to GstVideoCodecFrame for dropped picture - We are dropping RASL (Random Access Skipped Leading picture) which - is associated with an IRAP (Intra Random Access Picture) that has - NoRaslOutputFlag equal to 1, since the RASL picture will not be - outputted and also it should not be used for reference picture. - So, corresponding GstVideoCodecFrame should be released immediately. - Otherwise GstVideoDecoder baseclass will hold the unused frame. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2330> - -2021-06-21 13:23:13 +0200 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfvanc.c: - mxfvanc: Handle empty ANC essence - Not having any *actual* ANC is totally fine and common usage with several MXF - variants. - In order to properly advance the streams, the essence handler returns an empty - GAP buffer which gets converted to a GST_EVENT_GAP. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2345> - -2021-06-30 18:11:46 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvideoenc.cpp: - mfvideoenc: Don't ignore previous flow return value - In case of ASYNC MFT (hardware encoder), we were ignoring previous - finish_frame or pad_push return value. so, error wasn't propagated. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2370> - -2021-05-20 00:49:15 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11compositor.cpp: - * sys/d3d11/gstd3d11compositor.h: - * sys/d3d11/gstd3d11compositorbin.cpp: - d3d11compositor: Add scaling policy to support PAR-aware scaling - Identical to https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1156 - but for D3D11. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2263> - -2021-06-30 13:56:49 +0900 youngsoo.lee <youngsoo15.lee@gmail.com> - - * gst-libs/gst/opencv/meson.build: - opencv: Fix build error on macOS - The build fails on macos with the following error: - /usr/local/Cellar/opencv/4.5.0_5/include/opencv4/opencv2/core/mat.hpp:2226:15: error: no template named 'initializer_list' in namespace 'std' - Mat_(std::initializer_list<_Tp> values); - fatal error: too many errors emitted, stopping now -ferror-limit= - 35 warnings and 20 errors generated. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2368> - -2021-03-03 15:38:45 -0300 Ezequiel Garcia <ezequiel@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - v4l2codecs: vp8: Check kernel version - Print a warning if the kernel version is too old. - Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2075> - -2021-03-02 18:13:27 -0300 Ezequiel Garcia <ezequiel@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/linux/v4l2-controls.h: - * sys/v4l2codecs/linux/videodev2.h: - * sys/v4l2codecs/linux/vp8-ctrls.h: - * sys/v4l2codecs/plugin.c: - v4l2codecs: vp8: Update to the new uAPI - Starting from Linux v5.13, the V4L2 stateless VP8 uAPI - is updated and stable. - Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2075> - -2021-06-27 01:15:49 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvrtcloader.c: - nvcodec: Enhance CUDA runtime compiler library loading on Windows - The name of installed CUDA runtime compiler library is formed like - nvrtc64_{major-version}{minor-version}_0.dll on Windows - (which is differnt from documented in https://docs.nvidia.com/cuda/nvrtc/index.html) - And minor version might not be exactly same as that of CUDA. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2362> - -2021-06-14 18:49:20 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11av1dec.cpp: - * sys/d3d11/gstd3d11av1dec.h: - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Add AV1 decoder - Introduce Direct3D11/DXVA AV1 decoder element - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2365> - -2021-06-27 23:09:30 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstav1decoder.c: - av1decoder: Store display resolution for duplicated picture - Target display resolution might be required by subclass implementation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2365> - -2021-06-27 20:35:49 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstav1decoder.c: - av1decoder: Fix debug typo - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2365> - -2021-06-27 20:19:39 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - av1parser: Fix tile size calculation - Remaining size should exclude already read "tile size bits". - And see also "5.11.1. General tile group OBU syntax" - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2365> - -2021-06-28 21:13:56 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/transportreceivebin.c: - webrtc receivebin: Drop serialized queries before receive queue - If they're not dropped, they can be blocked in the queue even if it is - leaky in the case where there is a buffer being pushed downstream. Since - in webrtc, it's unlikely that there will be a special allocator to - receive RTP packets, there is almost no downside to just ignoring the - queries. - Also drop queries if they get caught in the pad probe after the queue. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2363> - -2021-06-26 14:31:01 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/transportreceivebin.c: - * ext/webrtc/transportreceivebin.h: - webrtc receivebin: Only set queue to leaky when the pad is blocked - When the pad is no longer blocked, remove the leakyness to make sure - everything gets into the jitterbuffer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2363> - -2021-06-26 14:25:39 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/transportreceivebin.c: - webrtc receivebin: Don't unblock pad until sender is unblocked - As ther OpenSSL session is created when the receiver goes into - playing, we have to wait for the ICE session to be connected before we - can start delivering packets to the DTLS element. - Fixes #1599 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2363> - -2021-06-24 13:17:09 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * gst-libs/gst/webrtc/dtlstransport.c: - webrtcbin: Sync to the clock per stream and not per bundle - By using the clocksync inside the dtlssrtpenc, all streams inside a - bundled are synchronized together. This will cause problems if their - buffers are not already arriving synchronized: clocksync would wait for - a buffer on one stream and then buffers from the other stream(s) with - lower timestamps would all be sent out too late. - Placing the clocksync before the rtpbin and rtpfunnel synchronizes each - stream individually and they will be send out more smoothly as a result. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2355> - -2021-06-24 14:58:12 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/transportreceivebin.c: - * ext/webrtc/transportsendbin.c: - * ext/webrtc/transportstream.c: - * gst-libs/gst/webrtc/rtpreceiver.c: - * gst-libs/gst/webrtc/rtpreceiver.h: - webrtc: Remove the webrtc-priv.h header from public headers - And this time for real, also import it in a couple more places - inside the webrtc element to make it build. - Fixes #1607 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2359> - -2021-06-09 17:29:19 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaav1dec.c: - va: change AV1 GstVideoAlignment setting to left-top corner. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2298> - -2021-06-18 10:37:06 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah264dec.c: - va: h264dec: Set the GstVideoAlignment correctly. - We should set GstVideoAlignment based on the sequence's crop information. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2298> - -2021-06-09 17:21:18 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah265dec.c: - va: h265dec: Set the GstVideoAlignment correctly. - We should set GstVideoAlignment based on the conformance window info. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2298> - -2021-06-09 17:19:04 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvapool.c: - va: pool: Add VideoCropMeta to the buffer if crop_top/left > 0. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2298> - -2021-06-09 17:14:42 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvabasedec.c: - * sys/va/gstvabasedec.h: - va: basedec: Copy the frames into other_pool if needed. - If decoder's crop_top/left value > 0 and the downstream does not - support the VideoCropMeta, we need to manually copy the frames - into the other_pool and output it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2298> - -2021-06-09 15:44:33 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvabasedec.c: - * sys/va/gstvabasedec.h: - va: basedec: Setup the other_pool to copy output if crop_left/top. - If the decoder has crop_top/left value > 0(e.g. the conformance - window in the H265). Which means that the real output picture - locates in the middle of the decoded buffer. If the downstream can - support VideoCropMeta, a VideoCropMeta is added to notify the - real picture's coordinate and size. But if not, we need to copy - it manually and the other_pool is needed. We always assume that - decoded picture starts from top-left corner, and so there is no - need to do this if crop_bottom/right value > 0. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2298> - -2021-06-07 00:49:49 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvapool.c: - va: No need to set the alignment for VideoMeta - The base va decoder's video_align is just used for calculation the - real decoded buffer's width and height. It does not have meaning - for the VideoMeta, because it does not align to the real picture - in the output buffer. We will use VideoCropMeta to replace it later. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2298> - -2021-06-03 00:07:05 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvapool.c: - va: Delete the useless align expand in va_pool_set_config(). - The base va decoder's video_align is just used for calculation the - real decoded buffer's width and height. While the gst_video_info_align - just calculate the offset and stride based on the video_align. But - all the offsets and strides are overwritten in gst_va_dmabuf_allocator_try - or gst_va_allocator_try, which make that calculation useless. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2298> - -2021-06-28 17:41:38 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/webrtc-priv.h: - * gst-libs/gst/webrtc/webrtc_fwd.h: - webrtc: Re-add WebRTC object docs to the public headers - So they end up in the generated documentation and the Since markers - appear in the .gir files too. - Also remove wrong "Since: 1.16" markers for some objects that were - available since 1.14.0 already. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1609 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2366> - -2021-06-25 10:20:06 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/utils.c: - webrtcbin: Set transceiver kind and codec preferences immediately when creating it - Otherwise the on-new-transceiver signal will always be emitted with kind - set to UNKNOWN and no codec preferences although both are often known at - this point already. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2360> - -2021-06-25 12:14:03 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/webrtcbin.c: - webrtcbin: Add a test for setting codec preferences as part of "on-new-transceiver" when setting the remote offer - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2310> - -2021-06-25 12:13:42 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/webrtcbin.c: - webrtc: Use fail_unless_equals_string() for string assertions - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2310> - -2021-06-08 11:40:14 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Store newly created transceivers when creating an answer also in the seen transceivers list - Otherwise it might be used a second time for another media afterwards. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2310> - -2021-06-08 11:39:27 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: When creating a new transceiver as part of creating the answer also take its codec preferences into account - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2310> - -2021-06-08 11:38:11 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Fix a couple of caps leaks of the offer caps - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2310> - -2021-06-24 12:28:11 +0100 Philippe Normand <philn@igalia.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Stop transceivers update after first SDP error on data channel - When invalid SDP is supplied, _update_data_channel_from_sdp_media() sets the - GError, so it is invalid to continue any further SDP processing, we have to exit - early when the first error is raised. - This change is similar to the one applied in - 064428cb34572fa1a018ebbaba6925967ba99dc0. - See also #1595 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2356> - -2021-06-21 16:50:46 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/webrtcbin.c: - webrtcbin test: Fix race in new test - Pull a buffer from a sink to make sure that the caps are already - set before trying to update them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2348> - -2021-06-22 16:12:57 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - * sys/msdk/gstmsdkvp9enc.c: - msdk: fix qp range for vp9enc - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2349> - -2021-06-10 11:46:35 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - avwait: Don't consider it a segment change if the segment is the same except for the position - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2319> - -2021-06-21 17:13:33 +0900 Seungha Yang <seungha@centricular.com> - - d3d11: Add support for GRAY and more YUV formats - By this commit, following formats will be newly supported by d3d11 elements - * Y444_{8, 12, 16}LE formats: - Similar to other planar formats. Such Y444 variants are not supported - by Direct3D11 natively, but we can simply map each plane by - using R8 and/or R16 texture. - * P012_LE: - It is not different from P016_LE, but defining P012 and P016 separately - for more explicit signalling. Note that DXVA uses P016 texture - for 12bits encoded bitstreams. - * GRAY: - This format is required for some codecs (e.g., AV1) if monochrome - is supported - * 4:2:0 planar 12bits (I420_12LE) and 4:2:2 planar 8, 10, 12bits - formats (Y42B, I422_10LE, and I422_12LE) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2346> - -2021-06-10 11:42:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - tsmux: When selecting random PIDs, name the pads according to those PIDs - Some elements will make use of the automatically generated names to - create new pads in future muxer instances, for example splitmuxsink. - Previously we would've created a pad with a random pid that would become - "sink_0", and then on a new muxer instance a pad "sink_0" and tsmux - would've then failed because 0 is not a valid PID. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2318> - -2021-06-23 01:43:08 +0900 Seungha Yang <seungha@centricular.com> - - mfvideoenc: Enhance B-frame timestamp handling - When B-frame is enabled, encoder seems to adjust PTS of encoded sample - by using frame duration. - For instance, one observed timestamp pattern by using B-frame enabled - and 30fps stream is: - * Frame-1: MF pts 0:00.033333300 MF dts 0:00.000000000 - * Frame-2: MF pts 0:00.133333300 MF dts 0:00.033333300 - * Frame-3: MF pts 0:00.066666600 MF dts 0:00.066666600 - * Frame-4: MF pts 0:00.099999900 MF dts 0:00.100000000 - We can notice that the amount of PTS shift is frame duration and - Frame-4 exhibits PTS < DTS. - To compensate shifted timestamp, we should - calculate the timestamp offset and re-calculate DTS correspondingly. - Otherwise, total timeline of output stream will be shifted, and that - can cause time sync issue. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2354> - -2021-06-10 11:36:43 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - tsmux: Recheck existing pad PIDs when requesting a new pad with a random pid - Previously pads might have been requested already (e.g. in NULL state), - then reset was called (e.g. because changing state) and then a new pad - was requested. Resetting is re-creating the internal muxer object and as - such resetting the pid counter, so the next requested pad would get the - same pid as the first requested pad which then leads to collisions. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2317> - -2021-06-22 02:34:18 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfh264enc.cpp: - * sys/mediafoundation/gstmfh265enc.cpp: - * sys/mediafoundation/gstmfvideoenc.cpp: - mfh264enc, mfh265enc: Set profile string to src caps - Set configured profile to src caps so that downstream can figure - out selected profile. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2347> - -2021-04-21 16:24:00 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/webrtcdatachannel.h: - * gst-libs/gst/webrtc/datachannel.c: - * gst-libs/gst/webrtc/datachannel.h: - * gst-libs/gst/webrtc/webrtc-priv.h: - webrtc lib: Make the datachannel struct private - This will prevent any unsafe access. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2241> - -2021-04-21 16:19:41 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/dtlstransport.c: - * gst-libs/gst/webrtc/dtlstransport.h: - * gst-libs/gst/webrtc/webrtc-priv.h: - webrtc lib: Make the DTLSTransport struct private - This will prevent any unsafe access. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2241> - -2021-04-21 16:17:23 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/nicetransport.h: - * gst-libs/gst/webrtc/icetransport.c: - * gst-libs/gst/webrtc/icetransport.h: - * gst-libs/gst/webrtc/webrtc-priv.h: - webrtc lib: Make the icetransport struct private - This will prevent any unsafe access. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2241> - -2021-04-21 16:04:26 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/rtpreceiver.h: - * gst-libs/gst/webrtc/webrtc-priv.h: - webrtc lib: Make the rtpreceiver struct private - This will prevent any unsafe access. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2241> - -2021-04-21 16:00:57 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * gst-libs/gst/webrtc/rtpsender.c: - * gst-libs/gst/webrtc/rtpsender.h: - * gst-libs/gst/webrtc/webrtc-priv.h: - webrtc lib: Make the rtpsender struct private - This will prevent any unsafe access. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2241> - -2021-04-21 16:00:34 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/webrtctransceiver.h: - * gst-libs/gst/webrtc/rtptransceiver.c: - * gst-libs/gst/webrtc/rtptransceiver.h: - * gst-libs/gst/webrtc/webrtc-priv.h: - webrtc lib: Make the transceiver struct private - This will prevent any unsafe access. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2241> - -2021-06-18 19:26:35 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/x265/gstx265enc.c: - x265enc: add negative DTS support - Use the same set_min_pts approach as x264enc. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/304 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2340> - -2021-06-17 20:10:35 +0900 Seungha Yang <seungha@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Don't assume that stream time is always valid - As per SDK doc, IDeckLinkInputCallback::VideoInputFrameArrived - method might not provide video frame and it can be null. - In that case, given stream_time can be invalid. - So, we should not try to convert GST_CLOCK_TIME_NONE - by using gst_clock_adjust_with_calibration() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2337> - -2021-06-14 13:16:30 -0400 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder.c: - transcoder: Fix usage of g_error_propagate - In the error callback we were propagating an error we were not owning - which is incorrect use of the API. - Also we were clearing a GError we already propagated which is wrong - as propagating gives ownership away. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2325> - -2021-06-14 13:13:24 -0400 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder.c: - transcoder: Add a missing object unlocking - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2325> - -2021-06-14 15:07:05 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/faad/gstfaad.c: - faad: fix typo in element documentation - seealso is now see_also - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2323> - -2021-06-17 20:17:14 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * tests/check/elements/msdkh264enc.c: - tests: msdkh264dec: Run test only if factory is available. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2336> - -2021-06-17 11:25:11 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/gstmsdkcontext.c: - msdk: Demote error log message to warning. - It is not an error that the available hardware doesn't support VA-API/MSDK. Just - none plugin features will be registered. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2336> - -2021-06-20 18:48:21 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11_private.h: - * gst-libs/gst/d3d11/gstd3d11bufferpool.cpp: - * gst-libs/gst/d3d11/gstd3d11device.cpp: - * gst-libs/gst/d3d11/gstd3d11format.cpp: - * gst-libs/gst/d3d11/gstd3d11memory.cpp: - * gst-libs/gst/d3d11/gstd3d11utils.cpp: - * gst-libs/gst/d3d11/meson.build: - libs: d3d11: Port to C++ - In general, C++ COM APIs are slightly less verbose and more readable - than C APIs. And C++ supports some helper methods - (smart pointer and C++ only macros for example) which are not allowed for C. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2343> - -2021-06-16 10:23:37 -0700 U. Artie Eoff <ullysses.a.eoff@intel.com> - - * sys/msdk/gstmsdk.c: - * sys/msdk/meson.build: - msdk: declare external dependencies - Track kernel and VA driver dependencies so gstreamer - will re-inspect the plugin if any of them change. - Also, do not blacklist the plugin if !msdk_is_available - since it could be a transient issue caused by one or - more external dependency issues (e.g. wrong/missing - driver specified, but corrected by user later on). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2335> - -2021-06-17 01:00:33 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - h264parse,h265parse: Push parameter set NAL units again per segment-done - Some decoder implementations might drain out internal buffers and - reset its status on segment-done event. So, in case that - upstream stream-format is packetized but downstream supports only - byte-format, required codec-data might not be forwarded toward - downstream if such parameter set NAL units don't exist in inband - bitstream. Therefore, parse elements should re-send parameter set NAL - units like the case of flush event. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2334> - -2021-06-16 10:31:13 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gstvp8decoder.c: - vp8decoder: Drain the output queue on EOS/finish - The finish() virtual method was flushing the queue, instead push the - remaining buffers. It is not required to reset in finish() unlike - drain(). This a regression causing last frame to always be lost. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2333> - -2021-06-16 10:30:18 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gstvp8decoder.c: - v4l2slvp8dec: Only ask for output delay once per negotiation - While it's technically possible to change it per frame, asking for - that every frame is not very useful. This mimic H264 decoder better. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2333> - -2021-06-16 16:56:14 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvabasedec.c: - va: Improve the default mapping between rt_format and video format. - We add 12 bits entries into this default mapping. And the old mapping - is not precise. For example, the NV12 should not be used as the default - mapping for VA_RT_FORMAT_YUV422 and VA_RT_FORMAT_YUV444, it is even not - a 422 or 444 format. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2332> - -2021-06-16 16:43:40 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah265dec.c: - va: Add 12 bits rt_format setting in H265. - In order to support 12 bits format decoding, we need to add the - support for 12 bits rt_format in H265. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2332> - -2021-06-16 16:32:30 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvavideoformat.c: - va: Fix a typo in video format mapping. - GST_VIDEO_FORMAT_Y412_LE is a 4:4:4 format and so should be mapped - to VA_RT_YUV444_12 rt format. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2332> - -2021-06-15 21:36:43 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix a typo in get_compatible_profile_caps(). - The GST_H265_PROFILE_MAIN_444_10 profile should be compatible with - GST_H265_PROFILE_SCREEN_EXTENDED_MAIN_444_10, not the current - GST_H265_PROFILE_SCREEN_EXTENDED_MAIN_10. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2328> - -2020-12-15 18:11:08 +0800 Randy Li (ayaka) <ayaka@soulik.info> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: prevent frame callback being released twice - For those using context from the application which - would be the embedded video case, if the frame callback - is entering at the same time as window is finalizing, - a wayland proxy object would be destroyed twice, leading - the refcout less than zero in the second time, it can - throw an abort() in wayland. - For those top window case, which as a directly connection - to the compositor, they can stop the message queue then - the frame callback won't happen at the same time as the - window is finalizing. It doesn't think it would bother - them about this. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1883> - -2021-06-14 16:04:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstalphadecodebin.c: - * sys/v4l2codecs/gstv4l2codecalphadecodebin.c: - alphadecodebin: Fix stall due to QoS - alphacombine element is a simple element that assumes buffers are always - paired, or at least that missing buffers are signalled with a GAP. The QoS - implementation in the GstVideoDecoder base class allow decoders dropping - frames independently and that could lead to stall in alphacombine. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2326> - -2021-02-02 11:02:02 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/openjpeg/gstopenjpegenc.c: - * gst-libs/gst/codecparsers/gstjpeg2000sampling.c: - * gst-libs/gst/codecparsers/gstjpeg2000sampling.h: - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse, openjpeg: add support for YCrCb 4:1:1 sampling - Add YCrCb 4:1:1 support in openjpeg elements - and fix in jpeg2000parse the YCrCb 4:1:0 support - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2321> - -2021-06-10 23:35:38 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11decoder: Don't print error log when no DPB texture is available - ... but we are flushing. The condition is quite expected situation - when pipeline is in the middle of seeking operation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2320> - -2021-05-23 18:17:38 +0800 Yinhang Liu <yinhang.liu@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: add extbrc support in ext-coding-props property - The SDK can support external bitrate control 1, so add extbrc - to enable this feature. - 1 https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#mfxextcodingoption2 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2139> - -2021-05-23 18:13:25 +0800 Yinhang Liu <yinhang.liu@intel.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - msdkenc: add ext-coding-props for external coding options - This property supports passing multiple parameters using GstStructure. - Example usage: - ext-coding-props="props,key0=value0,key1=value1,..." - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2139> - -2021-06-05 21:59:50 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - codecs: Fix the H265 poc out of order warning. - We always get a warning such as: - h265decoder gsth265decoder.c:1432:gst_h265_decoder_do_output_picture: \ - <vah265dec0> Outputting out of order 255 -> 0, likely a broken stream - in H265 decoder. - The problem is caused because we fail to reset the last_output_poc when - we get IDR and BLA. The incoming IDR and BLA frame already bump all the - frames in the DPB, but we forget to reset the last_output_poc, which - make the POC out of order and generate the warning all the time. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2294> - -2021-06-10 01:09:44 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2sink.c: - wasapi2sink: Fix ringbuffer object leak - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2315> - -2021-06-10 00:24:24 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2ringbuffer.cpp: - wasapi2ringbuffer: Implement GstAudioRingBuffer::pause() - WASAPI doesn't support PAUSE so it's not different from Stop(). - When pipeline is in paused state, we don't need to waste CPU resource - for feeding silent buffers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2315> - -2021-06-07 01:49:26 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11_fwd.h: - * gst-libs/gst/d3d11/gstd3d11memory.c: - * gst-libs/gst/d3d11/gstd3d11memory.h: - d3d11memory: Implement GstAllocator::mem_copy method - There are a few places which require deep copy - (basesink on drain for example). Also this implementation can be - useful for future use case. - One probable future use case is that copying DPB texture to - another texture for in-place transform since our DPB texture is never - writable, and therefore copying is unavoidable. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2308> - -2021-06-08 21:35:20 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - * sys/wasapi2/gstwasapi2client.h: - * sys/wasapi2/gstwasapi2device.c: - * sys/wasapi2/gstwasapi2ringbuffer.cpp: - * sys/wasapi2/gstwasapi2src.c: - * sys/wasapi2/gstwasapi2util.c: - * sys/wasapi2/gstwasapi2util.h: - wasapi2src: Add support for loopback recording - ... and add various device error handling. - This loopback implementation is functionally identical to that of wasapisrc. - When it's enabled, wasapi2src will read data from render device instead of - capture device. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2311> - -2021-05-10 20:45:28 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - * sys/wasapi2/gstwasapi2client.h: - * sys/wasapi2/gstwasapi2device.c: - * sys/wasapi2/gstwasapi2ringbuffer.cpp: - * sys/wasapi2/gstwasapi2ringbuffer.h: - * sys/wasapi2/gstwasapi2sink.c: - * sys/wasapi2/gstwasapi2sink.h: - * sys/wasapi2/gstwasapi2src.c: - * sys/wasapi2/gstwasapi2src.h: - * sys/wasapi2/gstwasapi2util.c: - * sys/wasapi2/gstwasapi2util.h: - * sys/wasapi2/meson.build: - * sys/wasapi2/plugin.c: - wasapi2: Rewrite plugin and implement audioringbuffer subclass - ... based on MediaFoundation work queue API. - By this commit, wasapi2 plugin will make use of pull mode scheduling - with audioringbuffer subclass. - There are several drawbacks of audiosrc/audiosink subclassing - (not audiobasesrc/audiobasesink) for WASAPI API, which are: - * audiosrc/audiosink classes try to set high priority to - read/write thread via MMCSS (Multimedia Class Scheduler Service) - but it's not allowed in case of UWP application. - In order to use MMCSS in UWP, application should use MediaFoundation - work queue indirectly. - Since audiosrc/audiosink scheduling model is not compatible with - MediaFoundation's work queue model, audioringbuffer subclassing - is required. - * WASAPI capture device might report larger packet size than expected - (i.e., larger frames we can read than expected frame size per period). - Meanwhile, in any case, application should drain all packets at that moment. - In order to handle the case, wasapi/wasapi2 plugins were making use of - GstAdapter which is obviously sub-optimal because it requires additional - memory allocation and copy. - By implementing audioringbuffer subclassing, we can avoid such inefficiency. - In this commit, all the device read/write operations will be moved - to newly implemented wasapi2ringbuffer class and - existing wasapi2client class will take care of device enumeration - and activation parts only. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2306> - -2021-06-06 17:32:59 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - wasapi2: Use AUDCLNT_STREAMFLAGS_NOPERSIST flag - ... so that we can disable persistence of our mute/volume status - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2306> - -2021-06-06 17:28:56 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2src.c: - wasapi2src: Fix doc typo - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2306> - -2021-05-26 00:12:59 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/wpe-extension/gstwpebusmsgforwarder.c: - wpe: Rename `undeserializable_type` to `not_deserializable_type` - Making it more readable. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2273> - -2021-05-25 23:58:27 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/gstwpesrcbin.cpp: - * ext/wpe/wpe-extension/gstwpebusmsgforwarder.c: - wpe: Make forwarded messages layout more like GstBinForwaded messages - Making it look more like how we do this kind of things in other places. - See: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2252#note_927653 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2273> - -2021-05-21 10:52:01 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/wpe/gstwpesrcbin.cpp: - * tests/examples/wpe/wpe.c: - wpe: Make wpesrc!video pad an always pad - There should always be a `video` pad no matter what. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2273> - -2021-05-21 10:31:53 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/wpe-extension/gstwpeextension.c: - wpe: Remove unused env var - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2273> - -2021-05-21 10:31:37 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/wpe-extension/gstwpeaudiosink.c: - wpe: Fix atomic usage - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2273> - -2021-05-21 10:29:11 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/gstwpesrcbin.cpp: - wpe: Add a note able requiring tracing subsystem for message forwarding - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2273> - -2021-05-21 10:18:21 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/wpe-extension/gstwpeaudiosink.c: - wpe: Fix check on whether MEMFD_CREATE is available - The ordering of the ifdef was wrong - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2273> - -2021-05-21 10:13:01 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/gstwpesrcbin.cpp: - * ext/wpe/wpe-extension/gstwpebusmsgforwarder.c: - wpe: Plug a leak - We were freeing after returning - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2273> - -2021-05-21 09:54:33 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - Revert "wpe: Properly respect LIBGL_ALWAYS_SOFTWARE" - This causes issues I didn't see: - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2252#note_927633 - Let's just tell people to use capsfilter to force software rendering in - `wpesrc` for now. - The intent was to allow forcing it easily in playbin2 for the CI, but - we will do it some other way and see when time comes. - This reverts commit 9415106b029e5469ca28d882dc46ecc38786d4c9. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2273> - -2021-05-28 15:18:53 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstdebugutilsbadelements.h: - * gst/debugutils/gstvideocodectestsink.c: - * gst/debugutils/gstvideocodectestsink.h: - * gst/debugutils/meson.build: - debugutils: Introduce videocodectestsink - This is a video specific sink used to test video CODEC conformance. This is similar - to a combination of filesink and testsink, but will skip over any type of - padding that GStreamer Video library introduces. This is needed in order to obtain the - correct checksum or raw yuv data. - This element currently support writing back non-padded raw I420 through the - location property and will calculate an MD5 and post it as an element message - of type conformance/checksum. More output format or checksum type could be - added in the future as needed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2287> - -2021-06-04 01:44:47 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/vulkan/gstvkinstance.c: - vkinstance: Don't abort in case that system has no available vulkan device - Specification doesn't have restriction that returned - pPhysicalDeviceCount value must be non-zero - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2304> - -2021-06-03 11:24:53 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Clear all streams when rewinding - This avoids sending out partial invalid data downstream which could cause - decoders (ex: `dvdlpmdec`) to error out. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2301> - -2021-05-29 01:48:15 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11device.c: - * gst-libs/gst/d3d11/gstd3d11format.h: - * sys/d3d11/gstd3d11converter.cpp: - * tests/check/elements/d3d11colorconvert.c: - d3d11: Add support for YV12 and NV21 formats - Handle UV swapped 4:2:0 8bits formats - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2290> - -2021-06-03 18:28:26 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11window_win32: Ensure closing internal HWND from window thread - Window handle must be closed from its own message thread - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2302> - -2021-06-03 10:31:39 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - doc: Update cache after pixel format reorder - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2303> - -2021-06-03 10:03:19 +0800 Yinhang Liu <yinhang.liu@intel.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkav1dec.c: - * sys/msdk/gstmsdkh264dec.c: - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh265dec.c: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkmjpegdec.c: - * sys/msdk/gstmsdkmjpegenc.c: - * sys/msdk/gstmsdkmpeg2dec.c: - * sys/msdk/gstmsdkmpeg2enc.c: - * sys/msdk/gstmsdkvc1dec.c: - * sys/msdk/gstmsdkvp8dec.c: - * sys/msdk/gstmsdkvp9dec.c: - * sys/msdk/gstmsdkvp9enc.c: - * sys/msdk/gstmsdkvpp.c: - doc: add the msdk elements - Supported elements: - msdkav1dec, msdkh264dec, msdkh264enc, msdkh265dec, msdkh265enc, - msdkmjpegdec, msdkmjpegenc, msdkmpeg2dec, msdkmpeg2enc, msdkvc1dec, - msdkvp8dec, msdkvp9dec, msdkvp9enc, msdkvpp. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2296> - -2021-06-02 14:17:13 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/wlwindow.c: - waylandsink: Fix for missing initial configure - We were doing our initial "empty" commit on the subsurface instead of the - toplevel surface. As an incidence, we should not have received a configure - event ever, not just on mutter. This fixes the following warning when using - mutter compositor (aka gnome-shell): - waylandsink wlwindow.c:304:gst_wl_window_new_toplevel: The compositor did not send configure event. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2299> - -2021-06-02 11:26:41 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/check/elements/camerabin.c: - test: camerabin: Fix buffer size calculation - We were assunming that GStreamer size for RGB (24bit packed) data was width x - height x 3, but GStreamer defaults to specific alignment. Use GstVideoInfo API - in order to obtain the buffer size. - This fixes failure seen when trying to merge: https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/998 - which make us negoaite 1x1 instead of 16x16 in this test. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2297> - -2021-05-31 17:51:58 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gsth265picture.c: - * gst-libs/gst/codecs/gsth265picture.h: - codecs: Integrate H265 DPB full check into need_bump(). - The current DPB check of H265 is not very correct. The current frame - is already in the DPB when we check whether the DPB is full. - For example, the DPB max size is 16 and we have 15 ref frames in the - DPB, so the gst_h265_dpb_delete_unused() cleans no one, and then plus - the current frame, the DPB is 16. This causes an error return, but in - fact, the stream is correct. - We now integrate the DPB full check into the need_bump() function. - We add the correct frame into to DPB and then check whether the picture - num is bigger than max_num_pics of DPB(which means there is no room for - the current picture). If true, we bump the DPB immediately. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2291> - -2021-06-01 15:28:57 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - Back to development - -=== release 1.19.1 === - -2021-06-01 00:14:22 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * README: - * RELEASE: - * gst-plugins-bad.doap: - * meson.build: - Release 1.19.1 - -2021-04-08 10:11:52 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - v4l2codecs: gstv4l2codecsvp8dec: implement a render delay - The v4l2 backend support delayed output for performance reasons. - It is then possible to use render delays to queue multiple requests - simultaneously, thus increasing performance. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2150> - -2021-04-07 18:24:27 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * gst-libs/gst/codecs/gstvp8decoder.c: - * gst-libs/gst/codecs/gstvp8decoder.h: - codecs: gstvp8decoder: add support for render delay - Some decoding APIs support delayed output for performance reasons. - One example would be to request decoding for multiple frames and - then query for the oldest frame in the output queue. - This also increases throughput for transcoding and improves seek - performance when supported by the underlying backend. - Introduce support in the vp8 base class, so that backends that - support render delays can actually implement it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2150> - -2021-05-17 10:49:41 +0100 Philippe Normand <philn@igalia.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Stop transceivers update after first SDP error - When invalid SDP is supplied, _update_transceiver_from_sdp_media() sets the - GError, so it is invalid to continue any further SDP processing, we have to exit - early when the first error is raised. - Fixes #1595 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2254> - -2021-05-28 23:21:19 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11decoder.cpp: - d3d11: Suppress some warning logs - We uses gst_d3d11_device_new() for enumerating device which can - fail for some reason. Don't print warning log for the case. - And decoding capability check is the same case as well. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2286> - -2021-05-28 17:05:02 -0400 Roman Sivriver <roman@rsiv.net> - - * ext/hls/gsthlssink2.c: - hlssink2: Initialize debug category to prevent an assert with `fatal-warnings` - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2288> - -2021-05-21 20:02:53 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11compositor.cpp: - d3d11compositor: Reuse converter on alpha update - ... instead of creating converter object - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2276> - -2021-05-18 01:24:29 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11compositor.cpp: - * sys/d3d11/gstd3d11convert.cpp: - * sys/d3d11/gstd3d11converter.cpp: - * sys/d3d11/gstd3d11converter.h: - * sys/d3d11/gstd3d11overlaycompositor.cpp: - * sys/d3d11/gstd3d11shader.cpp: - * sys/d3d11/gstd3d11shader.h: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window_dummy.cpp: - d3d11converter: Introduce config to be extensible - Add a config argument like that of GstVideoConverter so that - we can add more options without modifying existing methods - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2276> - -2021-05-21 21:30:42 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11compositor.cpp: - * sys/d3d11/gstd3d11converter.cpp: - * sys/d3d11/gstd3d11overlaycompositor.cpp: - * sys/d3d11/gstd3d11shader.cpp: - * sys/d3d11/gstd3d11shader.h: - d3d11shader: Don't hold state object in GstD3D11Quad - We might want to update state object - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2276> - -2021-05-27 16:22:42 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codech264dec.h: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.h: - * sys/v4l2codecs/plugin.c: - v4lcodecs: Validate src formats - This add src format validation, this avoid registering element for - drivers we don't support any of their src formats. This also special - case the AlphaDecodeBin wrapper, as we know that alphacombine element - only support I420 and NV12 for now. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2272> - -2021-05-22 16:29:09 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * sys/v4l2codecs/gstv4l2codecalphadecodebin.c: - * sys/v4l2codecs/gstv4l2codecalphadecodebin.h: - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - * sys/v4l2codecs/meson.build: - v4l2codecs: add wrappers for alpha decode - codecalpha is a new plugin introduced to support VP8/VP9 alpha as - defined in the WebM and Matroska specifications. It splits the stream - into two streams, one for the alpha and one for the actual content, - then it decodes them separately with vpxdec and finally combine the - results as A420 or AV12 (i.e. YUV + an extra alpha plane). - The workflow above is setup by means of a bin, gstcodecalphabin. - This patch simulates the same workflow into the v4l2codecs namespace, - thus using the new v4l2 stateless decoders for hardware acceleration. - This is so we can register the new alpha decode elements only if the - hardware produces formats we support, i.e. I420 or NV12 for now. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2272> - -2021-05-19 18:45:19 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/codecalpha/gstalphacombine.c: - codecalpha: alphacombine: add support for NV12/AV12 - Alpha combine works by appending the GstMemory for the alpha channel - to the GstBuffer containing I420, thereby pushing A420 on its src pad. - Add support for the same workflow for NV12, thereby producing the - recently introduced AV12 format (NV12 + Alpha). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2277> - -2021-05-25 20:21:34 +0900 Seungha Yang <seungha@centricular.com> - - * gst/interlace/gstinterlace.c: - interlace: Don't set field-order field for progressive caps - That would cause negotiation issue - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2282> - -2021-05-25 19:47:28 +0900 Seungha Yang <seungha@centricular.com> - - * gst/interlace/gstinterlace.c: - interlace: Drop framerate from query caps of sinkpad - Query caps should return caps which represent the element can accept, - not resulting format. - Fixing negotiation error with - gst-launch-1.0 videotestsrc ! video/x-raw,framerate=25/1 ! interlace field-pattern=0 ! fakesink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2282> - -2021-05-26 16:37:06 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11compositor.cpp: - d3d11compositor: Fix caps update handling - New caps is applied only when previous buffer is consumed if any. - So, the lastest given caps might not be corresponding to the current buffer - to be handled. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2284> - -2021-05-20 13:47:11 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/va/gstvadisplay.h: - * gst-libs/gst/va/gstvadisplay_drm.h: - * gst-libs/gst/va/gstvadisplay_wrapped.h: - libs: va: display: Handle auto clean up macros. - Add G_DEFINE_AUTOPTR_CLEANUP_FUNC macro for display classes, so auto - pointers are possible to users. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2269> - -2021-05-17 19:06:34 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah265dec.c: - va: h265dec: Add current picture into reference list for SCC. - The current picture is not in the DPB, so we need to add it manually - to the reference list when SCC is enabled. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2255> - -2021-05-21 23:47:14 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah265dec.c: - va: h265dec: Set Screen Content extension (SCC) for picture parameters. - We already declare the support of HEVC screen content extension profiles - in the profile mapping list, but we fail to generate the correct VA picture - parameters buffers. This may cause the GPU hang. - We need to fill the buffer of VAPictureParameterBufferHEVCExtension correctly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2255> - -2021-05-17 17:47:07 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah265dec.c: - va: h265dec: Use get_profile_from_sps() to recognize the profile. - The function of gst_h265_get_profile_from_sps() is better than the - function gst_h265_profile_tier_level_get_profile() when we recognize - the profile of the stream, becaue it considers the compatibility. - It is also used by h265parse to recognize the profile. So it is - better to keep the same behaviour with the parse and other decoders. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2255> - -2021-05-21 23:21:12 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah265dec.c: - va: h265dec: Set range extension for picture and slice parameters. - We already declare the support of HEVC range extension profiles in - the profile mapping list, but we fail to generate the correct VA - picture and slice parameters buffers. This may cause the GPU hang. - We need to fill the buffer of VAPictureParameterBufferHEVCExtension - and VASliceParameterBufferHEVCExtension correctly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2255> - -2021-05-24 18:18:52 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah265dec.c: - va: h265dec: Use picture and slide extension parameters. - This is transitional commit to later implement extended and screen - profiles. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2255> - -2021-05-24 18:34:25 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/aom/gstav1enc.c: - * ext/dash/gstdashdemux.c: - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlsenc.c: - * ext/fdkaac/gstfdkaacenc.c: - * ext/sctp/gstsctpenc.c: - * ext/sndfile/gstsfdec.c: - * gst/videoparsers/gstav1parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * tests/check/elements/kate.c: - * tests/check/elements/pcapparse.c: - Use gst_buffer_new_memdup() - Update for function rename in core. - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/827 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2281> - -2021-05-22 18:05:18 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - * ext/wpe/gstwpesrcbin.cpp: - * ext/wpe/gstwpevideosrc.cpp: - * ext/wpe/meson.build: - wpe: Bump wpebackend-fdo version requirement to 1.8 - Debian bullseye has this version already, and this allows us to get rid of many - ifdefs. The mouse scroll handling is actually functional now as well. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2278> - -2021-05-23 16:10:53 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/aom/gstav1enc.c: - * ext/dash/gstdashdemux.c: - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlsenc.c: - * ext/fdkaac/gstfdkaacenc.c: - * ext/sctp/gstsctpenc.c: - * ext/sndfile/gstsfdec.c: - * gst/videoparsers/gstav1parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * tests/check/elements/kate.c: - * tests/check/elements/pcapparse.c: - Use new gst_buffer_new_copy() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2279> - -2021-05-21 15:18:21 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - doc: update gst_plugins_cache.json - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1152> - -2021-05-14 20:22:26 +0200 Jakub Adam <jakub.adam@collabora.com> - - * sys/winscreencap/dxgicapture.c: - * sys/winscreencap/dxgicapture.h: - * sys/winscreencap/gstdxgiscreencapsrc.c: - dxgiscreencapsrc: renegotiate caps on resolution change - When desktop gets resized, recreate the textures and renegotiate the - source caps with the updated video dimensions. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2249> - -2021-05-18 14:09:01 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah265dec.c: - va: h265dec: Set LastSliceOfPic for multi sliced frames. - VA-API HEVC decoding needs to known which is the last slice of a - picture, but slices are processed sequencially, so we know the - last slice until all the slices are already pushed into the - VABuffer array. - In order to mark the last slice, they are pushed into the - VABuffer array with a delay of one slice: the first slice is - hold, and when the second slice come, the first one is pushed - while holding the second, and so on. Finally, at end_picture(), - the last slice is marked and pushed into the array. - Co-author: Victor Jaquez <vjaquez@igalia.com> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2246> - -2021-05-20 17:03:15 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11desktopdup.cpp: - * sys/d3d11/gstd3d11desktopdup.h: - * sys/d3d11/gstd3d11desktopdupsrc.cpp: - * sys/d3d11/gstd3d11desktopdupsrc.h: - d3d11desktopdupsrc: Add support for desktop size/rotation mode change - Re-negotiates with updated size on desktop size - (i.e., resolution, scaling factor), and rotation mode change - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2268> - -2021-05-20 10:09:57 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - mpegtsmux: Fixup program array indices after stream removal - Each stream stores the `program_array_index` of its position in its - program's `streams` array. When we remove a stream from this array, we - need to correct the `program_array_index` of all streams that were - backshifted by the removal. - Also extract the removal into a new function and add some more safety - checks. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2266> - -2021-05-20 18:49:01 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11memory.c: - d3d11memory: Protect map and unmap with device lock - We should lock memory object with gst_d3d11_device_lock() first - then GST_D3D11_MEMORY_LOCK() need to be used. - One observed deadlock case is that: - - Thread A takes d3d11 device lock - - At the same time, Thread B tries CPU map to d3d11memory which requires - d3d11 device lock as well, but it's already taken by Thread A. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2267> - -2021-05-20 18:38:17 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11memory.c: - d3d11memory: Add trace log for debugging locking thread - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2267> - -2021-05-20 15:39:39 +0900 Seungha Yang <seungha@centricular.com> - - * gst/audiolatency/gstaudiolatency.c: - audiolatency: Drop incoming downstream stick events - stream-start, caps, and segment events will be pushed by internal - audiotestsrc element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2265> - -2021-05-20 15:28:13 +0900 Seungha Yang <seungha@centricular.com> - - * gst/audiolatency/gstaudiolatency.c: - audiolatency: Use live mode audiotestsrc - Expected use case of audiolatency element is that mimic audio capture - device which is most likely live source. So audiolatency element - should use live mode as well. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2265> - -2021-05-19 18:48:29 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/gstwpesrcbin.cpp: - * ext/wpe/meson.build: - wpe: Bump WPE dependency to 2.28 - The new audio feature depends on WPE 2.28 so we should just bump our - requirement to that. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2264> - -2021-05-20 00:51:08 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11compositor.cpp: - * sys/d3d11/gstd3d11compositor.h: - * sys/d3d11/gstd3d11compositorbin.cpp: - d3d11compositor: Fix missing D3D11 prefix - Fix typo, no functional change - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2262> - -2021-05-18 17:49:23 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/wpe/gstwpe.cpp: - * ext/wpe/gstwpesrcbin.cpp: - wpe: Update doc cache - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2252> - -2021-04-21 23:14:13 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpe: Properly respect LIBGL_ALWAYS_SOFTWARE - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2252> - -2021-05-01 21:48:23 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/gstwpesrcbin.cpp: - * ext/wpe/wpe-extension/gstwpebusmsgforwarder.c: - * ext/wpe/wpe-extension/gstwpeextension.c: - * ext/wpe/wpe-extension/gstwpeextension.h: - * ext/wpe/wpe-extension/meson.build: - wpe: Relay messages from WPE internal pipelines - It is based on a tracer as it allows us to very easily get - every message that are posted on any bus inside the process. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2252> - -2021-04-19 20:46:46 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - * ext/wpe/gstwpe.cpp: - * ext/wpe/gstwpe.h: - * ext/wpe/gstwpesrcbin.cpp: - * ext/wpe/gstwpesrcbin.h: - * ext/wpe/gstwpevideosrc.cpp: - * ext/wpe/meson.build: - * ext/wpe/wpe-extension/gstwpeaudiosink.c: - * ext/wpe/wpe-extension/gstwpeextension.c: - * ext/wpe/wpe-extension/gstwpeextension.h: - * ext/wpe/wpe-extension/meson.build: - wpe: Base wpe audio implementation on a web extension - This makes the implementation simpler and enable us to map - webviews and audio stream much more easily - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2252> - -2019-12-08 13:16:38 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpe: Enable WebAudio - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2252> - -2019-12-08 11:49:20 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - * ext/wpe/gstwpe-private.h: - * ext/wpe/gstwpe.cpp: - * ext/wpe/gstwpesrcbin.cpp: - * ext/wpe/gstwpesrcbin.h: - * ext/wpe/gstwpevideosrc.cpp: - * ext/wpe/meson.build: - * tests/examples/meson.build: - * tests/examples/wpe/meson.build: - * tests/examples/wpe/wpe.c: - wpe: Implement audio support - The wpesrc bin now exposes "sometimes" audio src pads, one for every PCM audio - stream created by WPEWebKit. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2252> - -2021-03-10 17:27:52 -0300 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - * ext/wpe/gstwpe.cpp: - * ext/wpe/gstwpesrcbin.cpp: - * ext/wpe/gstwpesrcbin.h: - * ext/wpe/gstwpevideosrc.cpp: - * ext/wpe/gstwpevideosrc.h: - * ext/wpe/meson.build: - wpe: Move wpesrc to wpevideosrc and add a wrapper bin `wpesrc` - Currently the bin contains a single element but we are going - to implement audio support and expose extra pads for audio - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2252> - -2021-05-18 00:43:23 -0400 Doug Nazar <nazard@nazar.ca> - - * ext/sctp/gstsctpenc.c: - sctp: Ensure pad is still a child of element before removal - During pipeline shutdown there are several competing paths to remove - pads. Avoids tests failing due to: - Unexpected critical/warning: Padname '':sink_1 does not belong to element sctpenc1 when removing - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2256> - -2021-05-17 09:13:28 -0400 Doug Nazar <nazard@nazar.ca> - - * ext/sctp/gstsctpdec.c: - sctp: Fix race of pad removal during reset/stop - Both reset & stop remove existing pads. Can result in warning from - gst_element_remove_pad(). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2256> - -2021-05-17 09:11:54 -0400 Doug Nazar <nazard@nazar.ca> - - * ext/webrtc/webrtcdatachannel.c: - webrtcbin: Fix race bringing up sctp data channel - Notifying before pads are linked can cause the stream to fail to start. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2256> - -2021-05-13 21:11:30 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcice.c: - webrtcbin: advertise harder the rtcp-mux-only requirement - And ignore rtcp ICE candidates - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2239> - -2021-05-14 10:47:05 -0500 Sid Sethupathi <sid.sethupathi@gmail.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: update default jb latency docs - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2242> - -2021-05-18 16:38:04 -0400 Doug Nazar <nazard@nazar.ca> - - * ext/dtls/gstdtlsenc.c: - dtls: Let sender know when we are flushing - Prevents endless loop during shutdown where we end up sending 0 bytes. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2229> - -2021-05-18 16:31:47 -0400 Doug Nazar <nazard@nazar.ca> - - * ext/dtls/gstdtlsconnection.c: - * ext/dtls/gstdtlsconnection.h: - dtls: Add ability to set custom GstFlowReturn on callback error - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2229> - -2021-05-18 20:26:38 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/transportsendbin.c: - * ext/webrtc/transportsendbin.h: - webrtc: Remove reundundant context object in transportsendbin - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2260> - -2021-05-18 20:18:28 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/transportsendbin.c: - * ext/webrtc/transportsendbin.h: - webrtc: Wait until ICE is connected to start DTLS handshake process - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2260> - -2021-05-18 18:29:16 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/transportsendbin.c: - * ext/webrtc/transportsendbin.h: - webrtcbin: Remove pad probe on nicesink - This pad probe is no longer necessary, libnice now drops - all buffers before the stream is connected. This pad problem - also caused deadlocks in some situations. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2260> - -2021-05-17 20:59:19 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkatetiger.c: - kate: Initialize debug categories - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2258> - -2021-05-13 10:27:49 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/va/gstvadisplay.c: - * gst-libs/gst/va/gstvadisplay.h: - * gst-libs/gst/va/gstvadisplay_drm.c: - * gst-libs/gst/va/gstvadisplay_wrapped.c: - libs: va: Documentation and annotations. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2196> - -2021-05-07 17:05:38 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/va/meson.build: - * tests/examples/va/main.c: - * tests/examples/va/meson.build: - * tests/examples/va/multiple-vpp.c: - examples: va: Update the VA examples because of the new va lib. - Because we introduce the new va lib, the va examples need to include - new header files and add more library linkage. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2196> - -2021-05-13 18:46:21 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/va/gstvadisplay_wrapped.c: - * gst-libs/gst/va/gstvadisplay_wrapped.h: - * sys/va/gstvautils.c: - libs: va: display_wrapper: Use gpointer for VADisplay. - In order to be coherent along all the implementation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2196> - -2021-05-06 18:23:23 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/meson.build: - * gst-libs/gst/va/gstvadisplay.c: - * gst-libs/gst/va/gstvadisplay.h: - * gst-libs/gst/va/gstvadisplay_drm.c: - * gst-libs/gst/va/gstvadisplay_drm.h: - * gst-libs/gst/va/gstvadisplay_wrapped.c: - * gst-libs/gst/va/gstvadisplay_wrapped.h: - * gst-libs/gst/va/meson.build: - * gst-libs/gst/va/va-prelude.h: - * gst-libs/gst/va/va_fwd.h: - * sys/va/gstvaallocator.h: - * sys/va/gstvacaps.c: - * sys/va/gstvacaps.h: - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - * sys/va/gstvadevice.c: - * sys/va/gstvadevice.h: - * sys/va/gstvadisplay.h: - * sys/va/gstvadisplay_priv.c: - * sys/va/gstvadisplay_priv.h: - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - * sys/va/gstvautils.c: - * sys/va/gstvautils.h: - * sys/va/gstvavpp.c: - * sys/va/meson.build: - libs: va: Move the VA common logic as a lib. - The VA acceleration now has more usages in linux-like platforms, - such as the MSDK. The different plugins based on the VA acceleration - need to share some common logic and types. We now move the display - related functions and types into a common va lib. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2196> - -2021-05-17 11:42:07 +0800 mkba <mengker1031@outlook.com> - - * sys/msdk/gstmsdkh265enc.c: - msdk: add profile main-still-picture for hevc encoder - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2253> - -2021-05-15 00:39:57 +0900 Seungha Yang <seungha@centricular.com> - - * gst/interlace/gstinterlace.c: - interlace: Fix too small buffer size error - Even though input/output resolutions are identical there, default - buffer size of progressive and interleaved formats could be different - because we are rounding up height of all plane of interlaced frame - to be multiple of two. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2244> - -2021-03-01 12:09:43 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - msdk: use MFXJoinSession() to join the parent and child sessions - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1503> - -2021-02-04 15:27:13 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - msdk: use a new method to create mfx session when using oneVPL dispatcher - In oneVPL, MFXLoad() and MFXCreateSession() are required to create a - workable mfx session1 - 1 https://spec.oneapi.com/versions/latest/elements/oneVPL/source/programming_guide/VPL_prg_session.html#onevpl-dispatcher - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1503> - -2021-02-18 13:38:25 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * meson_options.txt: - * sys/msdk/meson.build: - msdk: allow user build this plugin against MFX version 2.2+ (oneVPL) - Intel oneVPL SDK (oneVPL) is a successor to Intel Media SDK (MSDK)1. - User may use -Dmfx_api=MSDK or -Dmfx_api=oneVPL to specify the required - SDK when building this plugin. If the SDK is not specified, meson will - try MSDK firstly, then oneVPL if MSDK is not available - Version 2.2+ is required in this patch because pkg-config file was not - provided officially before version 2.2 - 1https://spec.oneapi.com/versions/latest/elements/oneVPL/source/appendix/VPL_intel_media_sdk.html - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1503> - -2021-05-14 11:56:49 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvp9dec.c: - msdkvp9dec: do not include mfxvp9.h - The VP9 related definitions in mfxvp9.h are available under the - condition of 'MFX_VERSION >= MFX_VERSION_NEXT', which implies that these - definitions are never used in a public release. - This is in preparation for oneVPL support because mfxvp9.h was - removed from oneVPL - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1503> - -2020-08-04 12:53:35 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - msdk: don't load user plugins for MFX version 2.0+ - MFX version 2.0+ no longer supports user plugins, please refer to the - links for details - https://spec.oneapi.com/versions/latest/elements/oneVPL/source/appendix/VPL_intel_media_sdk.html#msdk-full-name-feature-removals - https://github.com/oneapi-src/oneVPL - This is in preparation for oneVPL support - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1503> - -2020-08-04 12:55:35 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: exclude the audio code for MFX version 2.0+ - MFX version 2.0+ no longer supports audio functions, please refer to the - links below for details - https://spec.oneapi.com/versions/latest/elements/oneVPL/source/appendix/VPL_intel_media_sdk.html#msdk-full-name-feature-removals - https://github.com/oneapi-src/oneVPL - This is in preparation for oneVPL support - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1503> - -2021-05-14 14:08:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstalphacombine.c: - alphacombine: Ignore all events coming from the alpha_pad - As per usage of this element, everything from this pad is a - duplicate. Instead of implemented needless aggregation, simply - drop all events from this pad and let the one from the main stream - passthrough. Also stop proxying some queries from the alpha pad_too. - This fixes racy test failure: - - validate.file.playback.scrub_forward_seeking.opus_vp9-alpha_webm - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2247> - -2021-05-14 14:05:59 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstcodecalphademux.c: - codecalphademux: Do not set a GstFlowReturn from a boolean - This was a small overlook, gst_pad_send_event() returns a boolean, - so setting it into ret could confuse the flow combiner. Though, - it didn't bug, since both 0 and 1 are success (though 1 being - undefined). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2247> - -2021-05-14 14:04:00 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstcodecalphademux.c: - codecalphademux: Remove eos flow return workaround - It turns out that downstream returning OK after EOS is a bug in - multiqueue. As we moved to queue, we no longer have this issue. - Let's keep the code clean and just assuming that downstream will - keep returning EOS and allow convergence of flow. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2247> - -2021-05-13 15:18:34 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/openh264/gstopenh264element.c: - openh264: Don't use GOnce for ABI check - It turns out the value used for g_once_* APIs can't be - zero. And this is a very cheap check, so let's just do it every time. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2240> - -2021-05-13 15:25:57 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/webrtcbin.c: - webrtc test: Print content of error GstMessage - Makes it easier to interpret the result of the CI! - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-05-06 13:52:32 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/webrtcbin.c: - webrtcbin tests: Add test for intersection src pad caps - This checks that the codec preferences are intersected also with what - the src pad can handle. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-04-14 19:46:56 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/webrtcbin.c: - webrtc test: Add explicit test clock - This way the test clock is not linked to the multiple harnesses - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-05-06 17:58:15 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Intersect answer with codec prefs & capabilities - In case the local capabilities changed since the last negotiaton, - we need to re-intersect and see if the result would be different. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-05-06 17:50:38 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Ignore current caps for codec negotiation - On the sink pad, we want the caps of the current stream, those - are the "received_caps" field. If we haven't received caps yet, then - we only care about the caps that the next element can accept, that is - the caps from the peer pad (and the preferences). Otherwise, we prevent - re-negotiation to a better codec when possible. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-05-05 19:21:18 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Remove dead code - The function is only called to create an offer, so no - need to pass the offer parameter and then check it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-05-05 19:18:02 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/webrtcbin.c: - webrtc test: Add test for codec preferences negotiation - Validate that it does the intersection with the caps from - the sink pad and rejects the offer creation otherwise. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-05-05 19:00:11 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/utils.h: - webrtcbin: Refactor codec preference retrieval - Now intersect against pads on both sides if they are available. - If the intersection fails, we now just reject the creation of the offer - or answer as it means that the codec_preferences are too restrictive or - that the caps on both sides the webrtcbin are not compatible. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-04-30 17:04:12 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Intersect codec preferences with caps from pads - When creating an offer or an answer, also take into account - the caps on the pads as well as the codec preferences when both are set. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-04-30 16:21:14 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * tests/check/elements/webrtcbin.c: - webrtcbin: Implement caps queries on sinkpad based on codec preferences - Also includes a unit test. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-04-30 15:04:33 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Hold transceiver lock when accessing codec_preferences - This is required to allow the applications to modify the preferences. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-04-30 14:55:41 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/rtptransceiver.c: - webrtcbin: Hold lock while accessing the codec preferences - They could be changed at runtime by the application, so take the lock - when modifying them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-04-21 15:55:00 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/webrtcbin.c: - webrtcbin tests: Use properties to access the inside of the transceiver object - This will allow hiding the insides from unsafe application access. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-04-21 15:54:14 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/rtptransceiver.c: - webrtc rtptransceiver: Implement "codec-preferences" property - This allows safer access to the internals of the codec-preferences - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-04-21 15:38:00 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/rtptransceiver.c: - webrtc rtptransceiver: Implement "kind" property - Implement the property as read-only to follow the WebRTC spec - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-04-21 15:34:07 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/rtptransceiver.c: - webrtc rtptransceiver: Implement "current-direction" property - Implement the property as read-only to follow the WebRTC spec - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-04-21 15:29:18 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/rtptransceiver.c: - webrtc rtptransceiver: Implement "mid" property - Implement the property as read-only to follow the WebRTC spec - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183> - -2021-05-12 17:32:20 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstalphadecodebin.c: - alphadecodebin: Use normal queues instead of multiqueue - The multiqueue was too flexible for our need, allowing to queue passed - the configured threshold. It also didn't work well when trying to - propagate EOS flow return. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2238> - -2021-05-12 17:29:02 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstalphacombine.c: - alphacombine: Implement flow return propagation - The EOS handling was not the problem way. Instead of this, implement - proper prorogation of the flow return for the alpha chain function. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2238> - -2021-05-12 15:13:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstcodecalphademux.c: - codecalphademux: Fix handling of flow combine - As the alphacombine is simplified to received matching pair of buffers, - we can't just stop streaming when we receive EOS from downstream. Due - to usage of queue, the moment we get this return value may differ. - Though, by continuing pushing, we override the last_flowret on the pad - which can make us miss that we effectively can combine all flow into - EOS. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2238> - -2021-04-29 17:14:43 -0400 Thibault Saunier <tsaunier@igalia.com> - - * gst/debugutils/gsttestsrcbin.c: - testbinsrc: Handle setting URI on the fly - Reusing existing streams when possible - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2210> - -2021-01-20 14:55:09 +0800 Bing Song <bing.song@nxp.com> - - * data/meson.build: - * data/targets/file-extension/ts.gep: - transcoding: add encoding target for TS. - Add encoding target for streamming. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1965> - -2021-04-29 16:51:27 +0200 Johan Sternerup <johast@axis.com> - - * tests/check/elements/webrtcbin.c: - webrtcbin: Add unit test for closing of data channels - Add test for verifying that the data channel "close" action signal - triggers an SCTP_RESET_STREAMS request that is propagated to the other - side and eventually leads to both sides closing properly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2186> - -2021-04-22 10:43:55 +0200 Johan Sternerup <johast@axis.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - webrtcbin: Fix deadlock when receiving new sctp stream - When receiving an sctp message for a stream that not yet has an - sctpdec pad associated with it means we end up in - _on_sctpdec_pad_added. At this point we're holding the sctpassocation - lock. Then it's not possible to take the pc_lock because then code - executing under the pc_lock (which means anything in the webrtc - thread) may not take the sctpassociation lock. For example, running - the data channel close procedure from the webrtc thread means we - eventually end up sending a SCTP_RESET_STREAMS packet which needs to - grab the sctpassociation lock. - This means _on_sctpdec_pad_added simply cannot take the pc_lock and - also it is not possible to postpone the channel creation as we need to - link the pads right there. The solution is to introduce a more - granular dc_lock that protects only the things that needs to be done - to create the datachannel. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2186> - -2021-04-20 10:45:46 +0200 Johan Sternerup <johast@axis.com> - - * ext/sctp/sctpassociation.c: - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/sctptransport.c: - * ext/webrtc/webrtcdatachannel.c: - * ext/webrtc/webrtcdatachannel.h: - webrtcbin: Support closing of data channels - Support for closing WebRTC data channels as described in RFC - 8831 (section 6.7) now fully supported. This means that we can now - reuse data channels that have been closed properly. Previously, an - application that created a lot of short-lived on-demand data channels - would quickly exhaust resources held by lingering non-closed data - channels. - We now use a one-to-one style socket interface to SCTP just like the - Google implementation (i.e. SOCK_STREAM instead of SOCK_SEQPACKET, see - RFC 6458). For some reason the socket interface to use was made - optional through a property "use-sock-stream" even though code wasn't - written to handle the SOCK_SEQPACKET style. Specifically the - SCTP_RESET_STREAMS command wouldn't work without passing the correct - assocation id. Changing the default interface to use from - SOCK_SEQPACKET to SOCK_STREAM now means we don't have to bother about - the association id as there is only one association per socket. For - the SCTP_RESET_STREAMS command we set it to SCTP_ALL_ASSOC just to - match the Google implementation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2186> - -2021-05-07 16:30:49 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gstvp9parse.c: - vp9parse: Manually fixate codec-alpha field - This is a newly introduced field, and we interpret it as false when missing in - the caps. Otherwise, a simple capsfilter will just add the missing field and - keep going, despite the upstream caps being a superset. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2199> - -2021-05-07 11:28:21 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstplugin.c: - doc: codecalpha: Add plugin documentation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2199> - -2021-05-06 09:12:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - doc: Add codecalpha plugin to the plugins cache - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2199> - -2021-04-22 16:50:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstalphadecodebin.c: - * gst/codecalpha/gstalphadecodebin.h: - * gst/codecalpha/gstplugin.c: - * gst/codecalpha/gstvp8alphadecodebin.c: - * gst/codecalpha/gstvp8alphadecodebin.h: - * gst/codecalpha/gstvp9alphadecodebin.c: - * gst/codecalpha/gstvp9alphadecodebin.h: - * gst/codecalpha/meson.build: - alphadecodebin: Add wrappers to decode VP8/VP9 alpha - This includes base class with wrappers bin that will create a static - pipeline capable of handling the VP8/VP9 alpha channel decoding - using two instances of vp8/vp9dec element each. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2199> - -2021-04-02 15:07:22 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstalphacombine.c: - * gst/codecalpha/gstalphacombine.h: - * gst/codecalpha/gstplugin.c: - * gst/codecalpha/meson.build: - codecalpha: Implement alphacombine element - This element will merge video buffers in order to use the alpha stream - luma plane as the alpha of the video stream. The implementation is zero-copy - and currently only support merging I420 stream with an I420, NV12 or GRAY8 - alpha stream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2199> - -2021-03-30 15:34:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstcodecalphademux.c: - alphacodecdemux: Implement meta demuxing - Produce two streams from a buffer that has GstVideoCodecAlphaMeta - attached. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2199> - -2021-03-24 16:48:35 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/codecalpha/gstcodecalphademux.c: - * gst/codecalpha/gstcodecalphademux.h: - * gst/codecalpha/gstplugin.c: - * gst/codecalpha/meson.build: - * gst/meson.build: - * meson_options.txt: - Introduce CODEC Alpha plugin - This plugin contains a set of utility elements allowing to extract, - decode and combine CODEC (typically VP8/VP9) alpha stream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2199> - -2021-05-11 13:57:59 +0100 Daniel Stone <daniel@fooishbar.org> - - * ext/openaptx/meson.build: - openaptx: Fix to v0.2.0 due to license change - openaptx has recently changed its license to explicitly exclude - 'Freedesktop projects' from using it, which would include GStreamer, as - well as shifting to base terms of GPLv3: - https://github.com/pali/libopenaptx/commit/811bc18586d634042618d633727ac0281d4170b8 - This unilateral license change is legally dubious in many ways. - The original work came from ffmpeg under the LGPL v2.1, to which third - parties may not add additional restrictions (per sections 2 and 7 of the - LGPL v2.1), so LGPLv2.1 + may-not-use restrictions are not permissible - without the explicit consent of the original copyright holder. - The upgrade to LGPL v3.0 without explicit consent from the original - copyright holder is in itself permissible through the upgrade terms of - the LGPL, however the additional restrictions imposed again conflict - with sections 7 and 10 of the GPLv3 (as the base of the LGPLv3, with - those sections not being invalidated by the additional LGPLv3 text). - Though it does not impact the legal validity of the redeclaration of - licensing, the claims that freedesktop.org has violated the terms of the - openaptx license in the past are false; the work was contributed to the - PulseAudio project with an explicit open license, with the original - contributor later attempting to revoke permission for its use, despite - the explicit terms of the license giving no ability to do so as they - lack a change-of-heart provision. - The claims that Collabora violated the license are even more baseless; - they are based on an assertion that when I (acting on behalf of - freedesktop.org rather than Collabora, in my own unpaid time) banned - users from freedesktop.org's GitLab instance due to sustained violations - of the Code of Conduct users agree to when creating an account on that - platform, this somehow constituted a violation of the license. Even if - Collabora were somehow involved in this - which they were not at all - - there is no requirement under open licenses that users be given - unlimited access under all terms to any platform on the internet. Such - terms would mean that open development could only be conducted on - completely unmoderated platforms, which does not stand up to any - scrutiny. - Regardless of the declared license having no legal validity, the LGPL's - explicit provision in both v2.1 and v3.0 for such additional - restrictions to be stripped, and the low likelihood of it ever being - used together with GStreamer as its licensing terms would not be - acceptable to any distribution, enforcing a version check seems like the - safest way to ensure complete legal clarity, not put users or - downstreams in any jeopardy, and comply with the author's stated wishes - for v0.2.1 and above to not be used by GStreamer. - Signed-off-by: Daniel Stone <daniel@fooishbar.org> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2235> - -2021-05-11 10:21:27 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - doc: Update cache after RGBP pixel format addition - Related to https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1141 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2236> - -2021-05-09 23:42:46 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaav1dec.c: - * sys/va/gstvabasedec.c: - * sys/va/gstvabasedec.h: - * sys/va/gstvah264dec.c: - * sys/va/gstvah265dec.c: - * sys/va/gstvampeg2dec.c: - * sys/va/gstvavp8dec.c: - * sys/va/gstvavp9dec.c: - va: Do not use a common parent_class in vabasedec. - We have only one copy of gst_va_base_dec_parent_class inside the - vabasedec, so it can not handle the case when there are multi va - decoders inside one pipeline. The pipeline: - gst-launch-1.0 filesrc location=xxx.h264 ! h264parse \ - ! vah264dec ! msdkh265enc ! vah265dec ! fakesink - generates a assertion of - "invalid cast from 'GstVaH264Dec' to 'GstH265Decoder" - and gets a crash. - We should keep the parent_class for each decoder type. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2231> - -2021-05-07 16:02:04 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - libs: codecs: h264decoder: Assert output_picture virtual method. - For new code it's nice to assert if the derived class implemented the - output_picture virtual method. Otherwise a segmentation fault - occurs. All other decoders assert this method. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2228> - -2021-05-06 18:37:45 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/gstwpesrc.cpp: - wpe: Properly free property fields - The set location (in two places) and loaded bytes were not freed when - the element is destroyed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2222> - -2021-05-06 19:17:29 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/wpe/gstwpesrc.cpp: - wpe: Properly lock property fields - Use the object lock for the following fields: - - `bytes`: Written by the `load-bytes` signal unless running; consumed - on start. - - `draw_background`: Read and written by the `draw-background` - property. - - `location`: Read and written by the `location` property and the URI - handler. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2222> - -2021-05-07 11:13:06 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtp/gstrtpsrc.c: - rtpsrc: Plug leak of rtcp_send_addr - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2226> - -2021-05-07 11:13:46 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtp/gstrtpsink.c: - rtpsink: Return proper pad from _request_new_pad - Bizarrely, it returned a pad from the child rtpbin. I noticed because - our application leaked the implicitly created ghost pad. Make an - explicit ghost pad so this works properly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2227> - -2021-05-07 11:12:39 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rist/gstristsrc.c: - rist: Plug leak of rtcp_send_addr - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2225> - -2021-05-07 11:10:17 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaav1dec.c: - va: av1dec: Avoid structure overwrite. - VADecPictureParameterBufferAV1.mode_control_fields.bits were filled - twice, overwriting to zeros the first assignation. This patch unifies - both assignations. - Also it makes explicit an enum casting between libva and gstreamer; it - removes the assignation to zero a deprecated parameter; and use an - appropriate assertion. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2223> - -2021-05-06 17:07:51 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/utils.c: - webrtc: only add nack pli by default if kind is video - Sending/receiving PLI's (Picture Loss Indication) for non-video doesn't - really make sense. This also matches what the browsers do. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2220> - -2021-05-06 17:06:44 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/utils.c: - * ext/webrtc/utils.h: - webrtc: move webrtc_kind_from_caps() to utils - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2220> - -2021-04-21 17:34:26 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - * sys/wasapi2/gstwasapi2client.h: - * sys/wasapi2/gstwasapi2sink.c: - * sys/wasapi2/gstwasapi2src.c: - * sys/wasapi2/gstwasapi2util.h: - wasapi2: Propagate HRESULT error code everywhere - ... instead of boolean value which cannot notify the reason - of the operation failure. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2219> - -2021-05-06 10:46:15 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlssink.c: - * ext/hls/gsthlssink2.c: - * ext/hls/gstm3u8playlist.c: - * ext/hls/gstm3u8playlist.h: - hlssink(2): Don't write deprecated EXT-X-ALLOW-CACHE metadata - It's deprecated since quite a few versions and various validators - complain about it. Instead of the in-manifest metadata this should be - handled by the normal HTTP caching headers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2221> - -2021-05-06 01:35:04 +0900 Seungha Yang <seungha@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklinkvideosrc: Fix crash when mode is not specified - In that case, we will get "VideoInputFrameArrived" callback - without "VideoInputFormatChanged" - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2218> - -2021-05-05 12:34:38 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: don't invalidate the last PPS when parsing a new SPS - This is a port of https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2019 - to h265parse. - When a SPS is received then any previous PPS remains valid. So don't clear - the PPS flag from the parser state. - This is important because there are encoders that don't generated a PPS after - every SPS. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2217> - -2021-04-20 22:18:09 +0200 François Laignel <fengalin@free.fr> - - * ext/dash/gstdashsink.c: - * ext/dtls/gstdtlssrtpdec.c: - * ext/dtls/gstdtlssrtpenc.c: - * ext/hls/gsthlssink2.c: - * ext/resindvd/resindvdbin.c: - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/transportreceivebin.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/rist/gstristsink.c: - * gst/rtp/gstrtpsink.c: - * gst/sdp/gstsdpdemux.c: - * gst/transcode/gsttranscodebin.c: - * gst/transcode/gsturitranscodebin.c: - * sys/dvb/dvbbasebin.c: - * sys/uvch264/gstuvch264_src.c: - * tests/check/elements/asfmux.c: - * tests/check/elements/cccombiner.c: - * tests/check/elements/dtls.c: - * tests/check/elements/mpegtsmux.c: - * tests/check/elements/mplex.c: - * tests/check/elements/webrtcbin.c: - * tests/examples/playout.c: - Use gst_element_request_pad_simple... - Instead of the deprecated gst_element_get_request_pad. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2180> - -2021-05-04 12:29:14 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * gst/mxf/mxfdemux.c: - mxf: check EOS cond with any segment's flag - The previous test was preventing the pad to be in EOS - when the segment position was greater than segment stop. - It ended up consuming all the data before getting in EOS. - Regarding GST_SEEK_FLAG_SEGMENT it seems to be - correctly handled later in the method. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2173> - -2021-04-19 18:25:06 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: fix keyframe detection in index - An index entry should be considered as a keyframe - if the flags allow a random access only. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2173> - -2021-04-24 10:43:47 +0000 Antonio Rojas <arojas@archlinux.org> - - * ext/openexr/gstopenexrdec.cpp: - Fix build with OpenEXR 3 - Add a header that is no longer transitively included - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2195> - -2021-04-22 19:21:01 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * gst-libs/gst/codecs/gstvp9statefulparser.c: - codecs: gstvp9statefulparser: do not carry over segmentation flags - Do not carry over segmentation flags from previous frames. The spec - says in 7.2.10 that the feature data carry over from previous frames - if not updated, but the flags do not. - Consider what would happen if a flag B is to depend on a flag A, and - B carries over as set from another frame. Further consider that A is - now not set in this particular frame. This leads to the invalid state - in which flag B is set but flag A isn't. - This might cause the bitstream to be rejected by accelerators down - the line. - Fix it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2203> - -2021-04-29 21:44:07 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11desktopdup.cpp: - * sys/d3d11/gstd3d11desktopdup.h: - * sys/d3d11/gstd3d11desktopdupsrc.cpp: - d3d11desktopdup: Don't ignore error DXGI_ERROR_UNSUPPORTED - Although Microsoft's DXGIDesktopDuplication example is considering - the DXGI_ERROR_UNSUPPORTED as an expected error - (See https://github.com/microsoft/Windows-classic-samples/tree/master/Samples/DXGIDesktopDuplication) - it might not be recoverable error if application is - run against a discrete GPU - (See https://docs.microsoft.com/en-US/troubleshoot/windows-client/shell-experience/error-when-dda-capable-app-is-against-gpu) - Do early error out if the error happens while opening device, - instead of retrying it forever. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2208> - -2021-04-29 22:10:15 +0200 Jakub Adam <jakub.adam@collabora.com> - - * sys/d3d11/gstd3d11desktopdup.cpp: - d3d11desktopdup: Support desktop switches - Before creating output duplication interface, call SetThreadDesktop() - with HDESK of the current input desktop in case a desktop switch has - occurred. - This allows d3d11desktopdupsrc to capture Windows User Account Control - (UAC) prompts, which appear on a separate secure desktop. Otherwise - IDXGIOutput1::DuplicateOutput() will return E_ACCESSDENIED and the - element won't produce any frames as long as the UAC screen is active. - Note that in order to access secure desktop the application still has to - run at LOCAL_SYSTEM privileges. For GStreamer applications running with - regular user privileges this change has no effect. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2209> - -2021-04-27 18:08:30 +0000 Jakub Adam <jakub.adam@collabora.com> - - * sys/winscreencap/dxgicapture.c: - dxgicapture: reinitialize duplication interface on ERROR_ACCESS_LOST - IDXGIOutputDuplication can become invalid for example when there's - desktop switch, resolution change or Windows User Account Control prompt - appears on screen. - When that happens, try to re-create the duplication interface for the - changed output. Note that in the case of UAC prompt this operation will - fail if the GStreamer process doesn't run at LOCAL_SYSTEM privileges. In - such situation the source element won't create any frames as long as the - output is occupied by UAC screen. - In order to enable UAC access to sufficiently privileged GStreamer - processes, call SetThreadDesktop() with the desktop handle that - currently receives user input before creating our output duplication. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2204> - -2021-04-29 09:35:51 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/gstmsdkvideomemory.c: - msdk: set correct parameters for BGRx frame - Otherwise when mapping BGRx frame onto CPU's memory, CPU will get wrong - data for B, G, R components - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2205> - -2021-04-29 21:12:42 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: advertise support for transport-cc rtcp-fb by default - Still requires explicit enabling by the application through the header - extension on all the relevant payloaders. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2207> - -2021-04-29 21:11:25 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtc/stats: provide the twcc stats when available - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2207> - -2021-04-28 10:52:29 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: Disable derived for Gallium if RGB and reading. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2127> - -2021-04-22 17:08:13 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: Disable derived for i965 if YUV and writing. - The problem is for uploading YUV frames using derived images, is that - derived images imply tiling, so frames are wrongly uploaded. - Though derived for reading might work we cannot know the Intel graphics - generation to validate the caching. Overall, it's safer to disable derived - images for i965. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2127> - -2021-04-22 17:07:28 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadisplay.c: - * sys/va/gstvadisplay.h: - va: display: Fix typo. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2127> - -2021-04-22 12:42:35 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: Hack for i965 to get linear RGB DMABufs. - i965 driver has a hack to provide linear dmabufs, which is required for RGB - formats, since they are directly uploaded by glupload, ignoring tiled modifiers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2127> - -2021-04-22 15:51:27 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: postproc: Remove unused parameter. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2127> - -2021-03-31 11:04:17 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: postproc: Set usage hint generic if DMABuf. - iHD driver sets a tiled DRM modifier if surface's usage hint is set to - VPP_WRITE. This result in a garbled rendering when using glimagesink. - This patch changes the usage hint to generic if the caps feature is - DMABuf. Either way only iHD driver, so far, uses the usage hint flag. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2127> - -2021-04-20 12:52:26 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: postproc: Get info from caps in decide_allocation() - decide_allocation() occurs before set_caps(), where out_info is set, - thus setting srcpad_info with zeros or old values. Instead of it, the - caps, from the allocation query, are converted and used. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2127> - -2021-04-23 13:56:43 +0200 Timo Wischer <timo.wischer@de.bosch.com> - - * ext/avtp/gstavtpcrfbase.h: - avtp: crf: Remove superfluous sink_event variable - This variable was introduced by commit 12ad2a4bcd6c ("avtp: Introduce - the CRF Sync Element") but it was never used: - $ git log -G "sink_event" -- ext/avtp - Signed-off-by: Timo Wischer <timo.wischer@de.bosch.com> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2201> - -2020-02-17 14:11:15 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - msdkh265dec: Add support for error report too - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/909> - -2019-12-06 12:48:37 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/gstmsdkdecproputil.c: - * sys/msdk/gstmsdkdecproputil.h: - * sys/msdk/gstmsdkh264dec.c: - msdkh264dec: report error to user - Sometimes user want to know what the error is when decoding a stream, - This commit adds a property of report-error to msdkh264dec. When - report-error is TRUE, msdkh264dec may catch bitstream error and frame - corruption, then report the error to application by using GST_ELEMENT_ERROR - Refer to the code in - https://github.com/Intel-Media-SDK/MediaSDK/tree/master/samples - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/909> - -2019-12-06 12:02:50 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - msdkdec: allow sub class to add extra parameters for additional configuration - MSDK allows user add extended buffers to a bitstream for additional - configuration. This commit is to support this feature in this plugin - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/909> - -2021-04-27 21:52:31 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11basefilter.cpp: - * sys/d3d11/gstd3d11compositor.cpp: - * sys/d3d11/gstd3d11deinterlace.cpp: - * sys/d3d11/gstd3d11videosink.cpp: - d3d11: Handle device change - If incoming buffer holds other d3d11 device, and user wants any device - (i.e., adapter index wasn't specified explicitly) update our device - with that of buffer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2191> - -2021-04-23 19:29:55 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - d3d11videosink: Delay window setup as much as possible - ... so that videosink can handle device update with - d3d11 device of the first buffer - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2191> - -2021-04-23 18:44:41 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11compositor.cpp: - * sys/d3d11/gstd3d11convert.cpp: - * sys/d3d11/gstd3d11deinterlace.cpp: - * sys/d3d11/gstd3d11desktopdupsrc.cpp: - * sys/d3d11/gstd3d11upload.cpp: - d3d11: Don't accept buffer pool which holds different device - At the moment, d3d11 plugin doesn't support texture sharing between - different device - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2191> - -2021-04-23 18:45:48 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - d3d11decoder: Run gst-indent - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2191> - -2021-02-23 11:56:53 -0500 Aaron Boxer <boxerab@gmail.com> - - * ext/meson.build: - * ext/onnx/gstonnx.c: - * ext/onnx/gstonnxclient.cpp: - * ext/onnx/gstonnxclient.h: - * ext/onnx/gstonnxelement.c: - * ext/onnx/gstonnxelement.h: - * ext/onnx/gstonnxobjectdetector.cpp: - * ext/onnx/gstonnxobjectdetector.h: - * ext/onnx/meson.build: - * meson_options.txt: - onnx: add plugin to apply ONNX neural network models to video - This MR provides a transform element that leverage ONNX runtime - to run AI inference on a broad range of neural network toolkits, running - on either CPU or GPU. ONNX supports 16 different providers at the - moment, so with ONNX we immediately get support for Nvidia, AMD, Xilinx - and many others. - For the first release, this plugin adds a gstonnxobjectdetector element to - detect objects in video frames. Meta data generated by the model is - attached to the video buffer as a custom GstObjectDetectorMeta meta. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1997> - -2021-04-26 18:00:27 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Fix AFD/Bar VANC size check - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2193> - -2021-04-23 18:05:06 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklinkvideosrc: Automatically detect widescreen vs. normal NTSC/PAL - Based on the AFD aspect ratio flag the source can detect (in mode=auto) - whether this NTSC/PAL mode is actually a normal or a widescreen one and - select the caps according to that. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2193> - -2021-03-30 12:39:21 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: Don't generate timestamp for 0/1 framerates - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2194> - -2021-04-23 23:20:54 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11decoder: Set flushing to internal pool on flush event - d3d11 decoders use internal pool for DPB texture and - Gst*Decoder::new_picture() will be blocked if internal pool is full. - We should be able to unblock in on flush-start event as expected. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2192> - -2021-04-23 16:53:16 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11compositor.cpp: - * sys/d3d11/gstd3d11decoder.cpp: - d3d11: Fix wrong GstD3D11BufferPool type check - Fix typos - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2190> - -2021-03-31 18:07:40 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/rtp/gstrtpsrc.c: - rtpsrc: Fix wrong/NULL URI handling - We can reset the URI to NULL and this fix a deadlock in that case or - when the URI was invalid. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2132> - -2021-04-22 16:45:27 +0000 Nazar Mokrynskyi <nazar@mokrynskyi.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: downgrade "dropping ICE candidates from SDP" from warning to debug level - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2187> - -2021-04-16 20:39:35 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Attach rtpbin even for data channels - This is required because the same transport may later be used for RTP. - In which case the RTCP needs to flow bi-directionnally already. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2172> - -2021-03-04 00:41:09 -0800 Frederich Munch <colsebas@hotmail.com> - - * ext/webrtc/nicetransport.c: - Fix missing unref of nice-agent causing sockets to never close. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1960> - -2021-04-22 16:09:40 -0400 Doug Nazar <nazard@nazar.ca> - - * ext/webrtc/sctptransport.c: - webrtc: Fix sctp task's return type. - GstWebRTCBinFunc expects a GstStructure* return type. - Fixes segfault on PowerPC. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2188> - -2021-04-22 15:50:15 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvideoenc.cpp: - mfvideoenc: Fix UWP build - Add missing GST_MF_HAVE_D3D11 define guard - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2185> - -2021-04-22 15:42:23 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - wasapi2: Fix UWP build - KSAUDIO_SPEAKER_* defines are WINAPI_PARTITION_DESKTOP only - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2185> - -2021-04-21 21:43:59 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: fix truncated output segment when seeking with a stop - In disabling the stop adjustment for negative rates in - 03031037fafd2d535bbefb1fdf6024b5d1159043 , two instructions - were inverted resulting in the stop always being adjusted by - 0 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2182> - -2021-04-20 23:51:49 -0400 Doug Nazar <nazard@nazar.ca> - - * tests/check/elements/netsim.c: - tests/netsim: Set src caps before creating buffers - GstHarness requires the source pad caps to be set before - buffer allocations. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2179> - -2021-04-20 02:00:18 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11device.c: - * gst-libs/gst/d3d11/gstd3d11format.h: - * tests/check/elements/d3d11colorconvert.c: - d3d11: Add support for BGRx and RGBx formats - For such formats, we can re-use existing BGRA/RGBA implementations - but ignoring alpha channel - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2174> - -2021-04-20 18:37:15 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - wasapi2: Implement default audio channel mask - Some capture devices might not provide channel mask value which will - result in capturing failure because of unknown channel mask in case - that device generates more than 2 channels. Although it might not - be correct, we can assume channel mask with the given number of channels. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2177> - -2021-04-20 18:40:40 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - wasapi2clinet: Simplify set caps - Don't need to iterate all structure to set identical values - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2177> - -2021-04-20 18:48:18 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - wasapi2client: Run gst-indent - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2177> - -2021-04-13 17:35:58 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/webrtcbin.c: - webrtcbin test: Don't fail if data channel is created - In tests that voluntarily create a data channel. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2168> - -2021-04-19 19:06:50 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Filter caps isn't fixed - Fix an assertion because the filter paramter passed to - gst_caps_is_equal_fixed() wasn't fixed. So use the regular - gst_caps_is_equal() instead. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2175> - -2021-04-20 02:04:03 +0900 Seungha Yang <seungha@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - d3d11: Update plugin doc cache - Updating for removed d3d11videosink wrapper bin and the change of - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2113 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2169> - -2021-04-17 20:37:13 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - * sys/d3d11/gstd3d11videosink.h: - * sys/d3d11/gstd3d11videosinkbin.cpp: - * sys/d3d11/gstd3d11videosinkbin.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Remove d3d11videosink wrapper bin - Drop d3d11videosink wrapper bin and handle texture upload - in d3d11videosink. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2169> - -2021-04-18 13:49:59 +0100 Philippe Normand <philn@igalia.com> - - * ext/webrtcdsp/gstwebrtcdsp.cpp: - webrtcdsp: Propagate VAD to audio level meta - Whenever the voice activity changed on the stream, update or create an - AudioLevelMeta and associate it to the corresponding buffer. - Fixes #1073 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2170> - -2021-04-19 13:06:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/closedcaption/gstcccombiner.c: - cccombiner: Use correct enum when registering the max-scheduled property - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2171> - -2021-04-15 14:06:59 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpe: Remove code targeting WebKit < 2.24 - We already depend on wk >= 2.24 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2165> - -2021-04-15 13:28:42 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpe: Make threaded view singleton creation thread safe - It was leading to interesting failures. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2165> - -2021-04-15 00:02:55 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11pluginutils.cpp: - d3d11: pluginutils: Fix wrong gst_memory_unmap() on _map() failure - It was obvious typo - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2164> - -2021-04-13 17:15:22 -0400 Doug Nazar <nazard@nazar.ca> - - * tests/check/elements/avtpcvfdepay.c: - tests/avtp: increase timeout of test_depayloader_fragmented_big - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2160> - -2021-04-14 01:59:23 -0400 Doug Nazar <nazard@nazar.ca> - - * tests/check/elements/dash_mpd.c: - check: fix dash_mpdparser_check_mpd_client_set_methods test. - Setting guint64 valist properties without type specifier fails - on 32bit archs. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2161> - -2021-04-13 16:34:15 -0400 Doug Nazar <nazard@nazar.ca> - - * tests/check/elements/line21.c: - line21enc: fix remove-caption-meta property test - It's possible for the same address to be allocated to the decoded - metadata. Switch test to actual detect if it was removed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2159> - -2021-04-13 06:40:43 -0400 Doug Nazar <nazard@nazar.ca> - - * tests/check/elements/shm.c: - tests: fix shm test deadlock - Stopping the consumer first would occasionally allow the producer - to fill the shm segment causing it to block in send() and unable - to be stopped. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2158> - -2021-04-13 05:54:37 -0400 Doug Nazar <nazard@nazar.ca> - - check: Fix test dash_mpdparser_xlink_period - Test used http://404/ERROR/XML.period as an invalid url. Curl now - interprets that as an 32bit int and tries an actual connect which - timesout. Use .invalid as an IANA reserved domain for invalid DNS. - curl -v http://404/ERROR/XML.period - * Trying 0.0.1.148:80... - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2157> - -2021-04-13 15:42:09 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaallocator.c: - va: allocator: Fix an unmap typo in _va_copy. - No need to unmap the the src memory when failing to allocate the - dst mem. It has not been mapped yet. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2156> - -2021-04-06 12:03:32 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - msdk: don't fall back to the default device - Ohterwise when user set a wrong device, the warning message doesn't get - printed if user doesn't set a right debug level in the environment, this - behavior might mislead user that the wrong device is being used. - This fixed https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1567 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2138> - -2021-04-12 17:54:31 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Simplify answer_caps intersection code a little - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-04-12 15:35:41 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/webrtcbin.c: - webrtcbin test: Wait for set-local-desc & set-remote-desc to continue - To avoid racing betwen the SDPs being set and the next step of the - test, let's wait for setting the SDP both locally and remotely to succeed. - of the test - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-04-01 14:51:30 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/webrtcdatachannel.c: - webrtcbin: Move GstPromise reply to operation framework - This makes it possible to reply to all promises in a consistent way - without having to do a unlock/relock that is always risky. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-04-01 14:41:11 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Make sure PC_LOCK is release when replying to promise - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-31 11:56:10 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Take PC lock around all entry points - All of those action signals change the internal state, so - protect it by using the PC_LOCK - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-31 11:49:36 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Take PC_LOCK when requesting new pad - This is needed to avoid having the state change under us. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-31 11:41:45 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/webrtcbin.c: - webrtcbin test: Add for the case where a second m-line is renegotiated - This is for the case where there answerer forces a specific media type - for a m-line, but he origin offer only has the other media type. In this - case, we will create a second transceiver on receiving the offer and add - the desired media type using renegotiation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-31 11:40:28 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Ensure that query caps method returns valid caps - This means rejecting any caps that aren't fixed. Also, use a filter - that will create unfixed caps if the other side just returns ANY. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-31 11:33:21 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Associate the stream with a new transceiver - Otherwise, this newly created transceiver has no stream and it - aborts later when it tries to connect the input pad. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-31 11:30:16 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Match unassociated transceiver by kind too - When a new m-line comes in that doesn't have a transceiver, only match - existing transceivers of the same kind. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-30 18:01:56 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Fix typoe in name of error GstStructure - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-30 16:16:50 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/webrtcbin.c: - webrtc test: Verify that forcing different kinds on peers fails - If the offer contains an audio kind and a video kind, forcing them both - at m-line zero will fail. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-30 16:04:33 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/webrtcbin.c: - webrtc tests: Verify that create-offer is rejected when needed - Verify that it gets rejected if a m-line at index 1 is requested but - there is no m-line 0. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-29 19:47:21 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/webrtcbin.c: - webrtcbin test: Add test for various cases where get_request_pad is meant to fail - This should ensure that the recently added code works. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-26 21:09:04 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Enforce direction on request sink pad with a specific name - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-26 20:55:36 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * tests/check/elements/webrtcbin.c: - webrtcbin: Try to match an existing transceiver on pad request - This should avoid creating extra transceivers that are duplicated. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-26 20:02:13 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Validate locked m-lines in set*Description - Verify that the remote description match the locked m-lines, otherwise - just reject the SDP. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-26 19:38:57 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - webrtcbin: Remove unused session_mid_map - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-26 18:15:50 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/utils.h: - webrtcbin: Enforce m-line restrictions when creating offer - First fail the offer creation if the mid of an existing offer doesn't - match a forced m-mline. - Then, for all newly added mlines, first look for a transceiver that - forces this m-line, then add a "floating" one, then the data channel. - And repeat this until we're out of transceivers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-26 15:57:15 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/webrtctransceiver.h: - webrtcbin: Remember if a transceiver had a forced m-line - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-26 15:54:35 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Enforce same-kind on request sink pad with a specific name - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-26 15:23:34 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Enforce compatible caps on pad request - If a pad is requested with certain caps and there is already a - transceiver, reject the pad request if the caps don't match. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-26 15:19:09 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Reject pad request for a specific m-line if it already exists - This way, the app developer is in control. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-26 15:02:50 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Make request-pad validation an early return - This reduces the indendation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-26 14:48:58 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Add document for webrtcbin itself to generated doc - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-23 20:18:24 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/webrtcbin.c: - webrtcbin test: Test adding a stream to a stream+datachannel - This use-case was previously broken by the expectation of having - a 1-1 match between the pad id and the m-line index - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-23 19:51:00 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: Reset received_caps when releasing pad - This is to work around a race where the pad is accessed in the - webrtc main thread while being released. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-03-23 17:51:16 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - webrtcbin: Split pad name from mline - The simple case where this breaks is if you add a - datachannel and want to add a new pad (a new media) after). Another - case where this is broken is if the order of the media is forced to - something different by the peer. - It's more simple to just split both things completely. In practice, the - pads will be named in the order in which they are allocated, so it - shouldn't change the current behaviour, just enable new ones. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2104> - -2021-02-25 05:04:00 +1100 Jan Schmidt <jan@centricular.com> - - * gst/switchbin/gstswitchbin.c: - switchbin: When collecting srcpad caps, don't intersect with path caps. - The path caps describe the input caps that will select each path, don't - intersect those with the srcpad caps, which could be completely - different. Instead, when querying allowed caps for the srcpad, just - construct the union of all possible output caps from all path srcpads. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2018> - -2021-02-16 15:00:07 +1100 Jan Schmidt <jan@centricular.com> - - * gst/switchbin/gstswitchbin.c: - switchbin: Don't report sink pad caps for src pad queries. - When handling a caps query on the src pad, don't return the union - of input caps. Even when not active, a path element can be queried - for srcpad template caps, or for dropping paths the allowed downstream - caps is anything - as data will be dropped anyway. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2018> - -2021-02-25 15:22:15 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * gst/accurip/gstaccurip.c: - * gst/accurip/gstaccurip.h: - * gst/adpcmdec/adpcmdec.c: - * gst/adpcmenc/adpcmenc.c: - * gst/aiff/aiff.c: - * gst/aiff/aiffelements.h: - * gst/aiff/aiffmux.c: - * gst/aiff/aiffparse.c: - * gst/aiff/gstaiffelement.c: - * gst/aiff/meson.build: - * gst/asfmux/gstasf.c: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfmux.h: - * gst/asfmux/gstasfparse.c: - * gst/asfmux/gstasfparse.h: - * gst/asfmux/gstrtpasfpay.c: - * gst/asfmux/gstrtpasfpay.h: - * gst/audiobuffersplit/gstaudiobuffersplit.c: - * gst/audiobuffersplit/gstaudiobuffersplit.h: - * gst/audiofxbad/gstaudiochannelmix.c: - * gst/audiofxbad/gstaudiochannelmix.h: - * gst/audiofxbad/gstaudiofxbad.c: - * gst/audiolatency/gstaudiolatency.c: - * gst/audiolatency/gstaudiolatency.h: - * gst/audiomixmatrix/gstaudiomixmatrix.c: - * gst/audiomixmatrix/gstaudiomixmatrix.h: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspacescope.h: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstspectrascope.h: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstsynaescope.h: - * gst/audiovisualizers/gstwavescope.c: - * gst/audiovisualizers/gstwavescope.h: - * gst/audiovisualizers/plugin.c: - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautoconvert.h: - * gst/autoconvert/gstautovideoconvert.c: - * gst/autoconvert/gstautovideoconvert.h: - * gst/autoconvert/plugin.c: - * gst/bayer/gstbayer.c: - * gst/bayer/gstbayer2rgb.c: - * gst/bayer/gstbayerelements.h: - * gst/bayer/gstrgb2bayer.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * gst/camerabin2/gstplugin.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstviewfinderbin.h: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - * gst/coloreffects/gstchromahold.c: - * gst/coloreffects/gstchromahold.h: - * gst/coloreffects/gstcoloreffects.c: - * gst/coloreffects/gstcoloreffects.h: - * gst/coloreffects/gstplugin.c: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/gstchecksumsink.c: - * gst/debugutils/gstchopmydata.c: - * gst/debugutils/gstclockselect.c: - * gst/debugutils/gstcompare.c: - * gst/debugutils/gstdebugspy.c: - * gst/debugutils/gstdebugutilsbadelements.h: - * gst/debugutils/gsterrorignore.c: - * gst/debugutils/gstfakeaudiosink.c: - * gst/debugutils/gstfakevideosink.c: - * gst/debugutils/gsttestsrcbin.c: - * gst/debugutils/gstwatchdog.c: - * gst/dvbsubenc/gstdvbsubenc.c: - * gst/dvbsubenc/gstdvbsubenc.h: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.h: - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - * gst/faceoverlay/gstfaceoverlay.c: - * gst/faceoverlay/gstfaceoverlay.h: - * gst/festival/gstfestival.c: - * gst/festival/gstfestival.h: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/fieldanalysis/gstfieldanalysis.h: - * gst/freeverb/gstfreeverb.c: - * gst/freeverb/gstfreeverb.h: - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstburn.h: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstchromium.h: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdilate.h: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstdodge.h: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstexclusion.h: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstgaussblur.h: - * gst/gaudieffects/gstplugin.c: - * gst/gaudieffects/gstplugin.h: - * gst/gaudieffects/gstsolarize.c: - * gst/gaudieffects/gstsolarize.h: - * gst/gdp/gstgdp.c: - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdpdepay.h: - * gst/gdp/gstgdpelement.c: - * gst/gdp/gstgdpelements.h: - * gst/gdp/gstgdppay.c: - * gst/gdp/gstgdppay.h: - * gst/gdp/meson.build: - * gst/geometrictransform/gstbulge.c: - * gst/geometrictransform/gstbulge.h: - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstcircle.h: - * gst/geometrictransform/gstdiffuse.c: - * gst/geometrictransform/gstdiffuse.h: - * gst/geometrictransform/gstfisheye.c: - * gst/geometrictransform/gstfisheye.h: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstkaleidoscope.h: - * gst/geometrictransform/gstmarble.c: - * gst/geometrictransform/gstmarble.h: - * gst/geometrictransform/gstmirror.c: - * gst/geometrictransform/gstmirror.h: - * gst/geometrictransform/gstperspective.c: - * gst/geometrictransform/gstperspective.h: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstpinch.h: - * gst/geometrictransform/gstrotate.c: - * gst/geometrictransform/gstrotate.h: - * gst/geometrictransform/gstsphere.c: - * gst/geometrictransform/gstsphere.h: - * gst/geometrictransform/gstsquare.c: - * gst/geometrictransform/gstsquare.h: - * gst/geometrictransform/gststretch.c: - * gst/geometrictransform/gststretch.h: - * gst/geometrictransform/gsttunnel.c: - * gst/geometrictransform/gsttunnel.h: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gsttwirl.h: - * gst/geometrictransform/gstwaterripple.c: - * gst/geometrictransform/gstwaterripple.h: - * gst/geometrictransform/plugin.c: - * gst/id3tag/gstid3mux.c: - * gst/id3tag/gstid3mux.h: - * gst/inter/gstinter.c: - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosink.h: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstinteraudiosrc.h: - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsink.h: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintersubsrc.h: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosink.h: - * gst/inter/gstintervideosrc.c: - * gst/inter/gstintervideosrc.h: - * gst/interlace/gstinterlace.c: - * gst/ivfparse/gstivfparse.c: - * gst/ivfparse/gstivfparse.h: - * gst/ivtc/gstcombdetect.c: - * gst/ivtc/gstcombdetect.h: - * gst/ivtc/gstivtc.c: - * gst/ivtc/gstivtc.h: - * gst/jp2kdecimator/gstjp2kdecimator.c: - * gst/jp2kdecimator/gstjp2kdecimator.h: - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjifmux.h: - * gst/jpegformat/gstjpegformat.c: - * gst/jpegformat/gstjpegparse.c: - * gst/jpegformat/gstjpegparse.h: - * gst/librfb/gstrfbsrc.c: - * gst/librfb/gstrfbsrc.h: - * gst/midi/midi.c: - * gst/midi/midiparse.c: - * gst/midi/midiparse.h: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - * gst/mpegdemux/plugin.c: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegpsmux/mpegpsmux.h: - * gst/mpegtsdemux/gsttsdemux.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/mpegtsparse.h: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - * gst/mpegtsmux/gstatscmux.c: - * gst/mpegtsmux/gstatscmux.h: - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/gstmpegtsmux.c: - * gst/mpegtsmux/gstmpegtsmux.h: - * gst/mpegtsmux/gstmpegtsmuxplugin.c: - * gst/mxf/gstmxfelement.c: - * gst/mxf/gstmxfelements.h: - * gst/mxf/meson.build: - * gst/mxf/mxf.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmux.c: - * gst/netsim/gstnetsim.c: - * gst/netsim/gstnetsim.h: - * gst/onvif/gstrtponvif.c: - * gst/onvif/gstrtponvifparse.c: - * gst/onvif/gstrtponvifparse.h: - * gst/onvif/gstrtponviftimestamp.c: - * gst/onvif/gstrtponviftimestamp.h: - * gst/pcapparse/gstirtspparse.c: - * gst/pcapparse/gstirtspparse.h: - * gst/pcapparse/gstpcapparse.c: - * gst/pcapparse/gstpcapparse.h: - * gst/pcapparse/plugin.c: - * gst/pnm/gstpnm.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmdec.h: - * gst/pnm/gstpnmenc.c: - * gst/pnm/gstpnmenc.h: - * gst/proxy/gstproxy.c: - * gst/proxy/gstproxysink.c: - * gst/proxy/gstproxysink.h: - * gst/proxy/gstproxysrc.c: - * gst/proxy/gstproxysrc.h: - * gst/rawparse/gstaudioparse.c: - * gst/rawparse/gstaudioparse.h: - * gst/rawparse/gstvideoparse.c: - * gst/rawparse/gstvideoparse.h: - * gst/rawparse/plugin.c: - * gst/removesilence/gstremovesilence.c: - * gst/removesilence/gstremovesilence.h: - * gst/rist/gstrist.c: - * gst/rist/gstrist.h: - * gst/rist/gstristplugin.c: - * gst/rist/gstristrtpdeext.c: - * gst/rist/gstristrtpext.c: - * gst/rist/gstristrtxreceive.c: - * gst/rist/gstristrtxsend.c: - * gst/rist/gstristsink.c: - * gst/rist/gstristsrc.c: - * gst/rist/gstroundrobin.c: - * gst/rist/gstroundrobin.h: - * gst/rist/meson.build: - * gst/rtmp2/gstrtmp2.c: - * gst/rtmp2/gstrtmp2element.c: - * gst/rtmp2/gstrtmp2elements.h: - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/gstrtmp2src.c: - * gst/rtmp2/meson.build: - * gst/rtp/gstrtpsink.c: - * gst/rtp/gstrtpsink.h: - * gst/rtp/gstrtpsrc.c: - * gst/rtp/gstrtpsrc.h: - * gst/rtp/plugin.c: - * gst/sdp/gstsdpdemux.c: - * gst/sdp/gstsdpdemux.h: - * gst/sdp/gstsdpelem.c: - * gst/sdp/gstsdpsrc.c: - * gst/sdp/gstsdpsrc.h: - * gst/segmentclip/gstaudiosegmentclip.c: - * gst/segmentclip/gstaudiosegmentclip.h: - * gst/segmentclip/gstvideosegmentclip.c: - * gst/segmentclip/gstvideosegmentclip.h: - * gst/segmentclip/plugin.c: - * gst/siren/gstsiren.c: - * gst/siren/gstsirendec.c: - * gst/siren/gstsirendec.h: - * gst/siren/gstsirenenc.c: - * gst/siren/gstsirenenc.h: - * gst/smooth/gstsmooth.c: - * gst/smooth/gstsmooth.h: - * gst/speed/gstspeed.c: - * gst/speed/gstspeed.h: - * gst/subenc/gstsrtenc.c: - * gst/subenc/gstsrtenc.h: - * gst/subenc/gstsubenc.c: - * gst/subenc/gstwebvttenc.c: - * gst/subenc/gstwebvttenc.h: - * gst/switchbin/gstswitchbin.c: - * gst/switchbin/gstswitchbin.h: - * gst/switchbin/plugin.c: - * gst/timecode/gstavwait.c: - * gst/timecode/gstavwait.h: - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - * gst/timecode/plugin.c: - * gst/transcode/gsttranscodebin.c: - * gst/transcode/gsttranscodeelement.c: - * gst/transcode/gsttranscodeelements.h: - * gst/transcode/gsttranscodeplugin.c: - * gst/transcode/gsturitranscodebin.c: - * gst/transcode/meson.build: - * gst/videofilters/gstscenechange.c: - * gst/videofilters/gstscenechange.h: - * gst/videofilters/gstvideodiff.c: - * gst/videofilters/gstvideodiff.h: - * gst/videofilters/gstvideofiltersbad.c: - * gst/videofilters/gstzebrastripe.c: - * gst/videofilters/gstzebrastripe.h: - * gst/videoframe_audiolevel/gstvideoframe-audiolevel.c: - * gst/videoframe_audiolevel/gstvideoframe-audiolevel.h: - * gst/videoparsers/gstav1parse.c: - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gstjpeg2000parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstpngparse.c: - * gst/videoparsers/gstvc1parse.c: - * gst/videoparsers/gstvideoparserselement.c: - * gst/videoparsers/gstvideoparserselements.h: - * gst/videoparsers/gstvp9parse.c: - * gst/videoparsers/meson.build: - * gst/videoparsers/plugin.c: - * gst/videosignal/gstsimplevideomark.c: - * gst/videosignal/gstsimplevideomark.h: - * gst/videosignal/gstsimplevideomarkdetect.c: - * gst/videosignal/gstsimplevideomarkdetect.h: - * gst/videosignal/gstvideoanalyse.c: - * gst/videosignal/gstvideoanalyse.h: - * gst/videosignal/gstvideosignal.c: - * gst/vmnc/vmncdec.c: - * gst/vmnc/vmncdec.h: - * gst/y4m/gsty4mdec.c: - * gst/y4m/gsty4mdec.h: - gst-plugins: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2110> - -2021-04-10 20:34:26 +0200 Helmut Januschka <helmut@januschka.com> - - * gst/rtmp2/rtmp/rtmpclient.c: - allow NetStream.Play.PublishNotify Message - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2154> - -2021-03-26 11:00:50 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * sys/bluez/bluez-plugin.c: - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsink.h: - * sys/bluez/gstavdtpsrc.c: - * sys/bluez/gstavdtpsrc.h: - * sys/bluez/gstbluezelement.c: - * sys/bluez/gstbluezelements.h: - * sys/bluez/meson.build: - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosink.h: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - * sys/decklink/gstdecklinkdeviceprovider.cpp: - * sys/decklink/gstdecklinkdeviceprovider.h: - * sys/decklink/gstdecklinkplugin.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - * sys/decklink/meson.build: - * sys/dvb/dvbbasebin.c: - * sys/dvb/dvbbasebin.h: - * sys/dvb/gstdvb.c: - * sys/dvb/gstdvbelement.c: - * sys/dvb/gstdvbelements.h: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - * sys/dvb/meson.build: - * sys/fbdev/gstfbdevsink.c: - * sys/fbdev/gstfbdevsink.h: - * sys/ipcpipeline/gstipcpipeline.c: - * sys/ipcpipeline/gstipcpipelineelement.c: - * sys/ipcpipeline/gstipcpipelineelements.h: - * sys/ipcpipeline/gstipcpipelinesink.c: - * sys/ipcpipeline/gstipcpipelinesrc.c: - * sys/ipcpipeline/gstipcslavepipeline.c: - * sys/ipcpipeline/meson.build: - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - * sys/magicleap/mlaudiosink.c: - * sys/magicleap/mlaudiosink.h: - * sys/magicleap/plugin.c: - * sys/opensles/meson.build: - * sys/opensles/opensles.c: - * sys/opensles/opensles.h: - * sys/opensles/openslesplugin.c: - * sys/opensles/openslessink.c: - * sys/opensles/openslessink.h: - * sys/opensles/openslessrc.c: - * sys/opensles/openslessrc.h: - * sys/shm/gstshm.c: - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsink.h: - * sys/shm/gstshmsrc.c: - * sys/shm/gstshmsrc.h: - * sys/uvch264/gstuvch264.c: - * sys/uvch264/gstuvch264_mjpgdemux.c: - * sys/uvch264/gstuvch264_mjpgdemux.h: - * sys/uvch264/gstuvch264_src.c: - * sys/uvch264/gstuvch264_src.h: - * sys/uvch264/gstuvch264deviceprovider.c: - * sys/uvch264/gstuvch264deviceprovider.h: - plugins-sys: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2116> - -2021-04-09 01:54:50 +0900 Seungha Yang <seungha@centricular.com> - - codecs: vp9decoder: Update docs - * Remove "FIXME 1.20": All the bits are addressed already by using - vp9parse element - * Fix copy & paste errors: Some comments were copied from h264decoder - blindly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2151> - -2021-04-09 12:45:46 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - codecs: vp9decoder: Make duplicate_picture() vfunc optional - The default implementation was required when superframe parsing - was handled by vp9decoder. For instance, if a superframe consists - of multiple frames with show_existing_frame header, it was vague - that which GstVp9Picture should consume GstVideoCodecFrame. - After 1.18 release, we introduced vp9parse element and - superframe should be handled by upstream vp9parse elemenet now. - So, we don't need to care about the superframe at vp9decoder class - level anymore. Simply, a frame corresponding to show_existing_frame - can be dropped if subclass doesn't implement duplicate_picture(). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2151> - -2021-03-30 14:40:53 +0100 Philippe Normand <philn@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstfakeaudiosink.c: - * gst/debugutils/gstfakeaudiosink.h: - * gst/debugutils/meson.build: - debugutils: Add fakeaudiosink element - This element can be useful for CI purposes on machines not running any system - audio daemon. The element implements the GstStreamVolume interface. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2125> - -2021-04-08 14:53:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecallocator.c: - v4l2codecs: allocator: Keep dmabuf mapped - DMABuf allocator already implements DMABuf Sync, meaning that doing - mmap/munmap (unless the mode have changed) is not required. In fact, on - systems with IOMMU it makes the kernel redo the mmu table which is visible - in the CPU usage. - This change reduces CPU usage when decoding - bbb_sunflower_2160p_60fps_normal.mp4 on RK3399 SoC from over 30% to - around 15%. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2152> - -2021-04-03 14:16:22 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: Implement mem_copy for VA memory. - Implementation of mem_copy() virtual method for GstVaAllocator. - It's a deep copy where a new VA memory is popped out from the pool or, - if pool is empty, a new memory is allocated. The original memory is - mapped to read, and if its VAImage is not derived and size to copy is - the whole surface, the mapped VAImage of the original memory is put in - the new memory. Otherwise a slow memcpy is done between both memories. - Fixes: #1568 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2136> - -2021-04-08 20:29:29 +0800 Zhao Zhili <zhilizhao@tencent.com> - - * ext/srt/gstsrtobject.c: - srtobject: fix optlen of srt_getsockflag - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2149> - -2021-01-14 14:24:06 +0800 Haihua Hu <jared.hu@nxp.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: fix critical log when play one gray colorspace video - Need guess color space based on number of components when cannot - got it from sink caps - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1955> - -2020-12-11 16:33:39 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/ldac/gstldacenc.c: - ldacenc: Emit message on errors - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1875> - -2020-12-11 16:26:00 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/sbc/gstsbcenc.c: - sbc: Return hard error on allocation or mapping error - Also post a message on the bus in these cases.wpe: Emit load-progress messages - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1875> - -2020-10-25 16:39:48 +0000 Matthieu De Beule <matthieu.de@beule.be> - - * gst-libs/gst/player/gstplayer.c: - Tell programmers that set_volume uses linear scale (fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1439) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1722> - -2020-12-11 14:52:20 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/ldac/gstldacenc.c: - * ext/sbc/gstsbcenc.c: - sbc/ldac: Don't use GST_CAPS_NONE to mean NULL - The GST_CAPS_NONE macro actually returns a instance of - a empty caps. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1874> - -2021-03-30 17:24:38 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - codecs: vp9decoder: Allow decoding start with intra-only frame - As per spec "7.2 Uncompressed header semantics" and - "8.2 Frame order constraints", decoding can start with intra-only - frame. This commit is for fixing vp90-2-16-intra-only.webm - bitstream test failure. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2112> - -2021-03-29 02:11:22 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.h: - * sys/d3d11/gstd3d11vp9dec.cpp: - * sys/nvcodec/gstnvvp9dec.c: - * sys/va/gstvavp9dec.c: - codecs: vp9decoder: Pass GstVideoCodecFrame to duplicate_picture() - ... and fix picture duplication logic for vavp9dec - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2112> - -2021-03-30 11:49:43 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.h: - * gst-libs/gst/codecs/gstvp9picture.h: - * sys/d3d11/gstd3d11vp9dec.cpp: - * sys/nvcodec/gstnvvp9dec.c: - * sys/va/gstvavp9dec.c: - codecs: vp9decoder: Port to GstVp9StatefulParser - Use newly implemented VP9 parser. Since new GstVp9FrameHeader - struct holds all the information of the stream, baseclass will not - pass parser object to new_sequence() method anymore. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2112> - -2021-03-27 15:32:59 +0900 Seungha Yang <seungha@centricular.com> - - codecparsers: Reimplement VP9 parser - Existing VP9 parser implementation doesn't provide information - required by other stateless decoding APIs (i.e., DXVA and NVDEC), - specifically loop filter and segmentation parameters might not exist - current frame. So parser needs to fill the information by using previously - parsed information. - We can update the gstvp9parser implementation so that it can provide - all information required by stateless decoding APIs with a huge API break, - or adding more ugly struct in it. - Instead doing as such, this commit introduce a new VP9 parser implementation. - What is different from existing one? - * All variables will follow the specification as much as possible: - VP9 Bitstream & Decoding Process Specification - v0.6 31st March 2016 - * Parser will fill all the required information for decoding frame - to GstVp9FrameHeader struct. In case of old VP9 parser, - user needs to read additional data from parser's member variables. - * GstVp9StatefulParser object struct is completely completely opaque - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2112> - -2021-03-28 16:11:23 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - codecs: vp9decoder: Don't check codec change with show_existing_frame - Show existing frame will zero frame_type value but it doesn't mean - it's keyframe. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2112> - -2021-04-06 16:24:39 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2codecs: Fix holding of reference picture buffer - The picture buffer (V4L2 CAPTURE buffer) was being released immediatly - when the request was done. This was problematic since even after the - request is done, the picture buffer might still be used as a reference - and should not be reused for further decoding yet. - This change effectively bind the picture buffer lifetime to the request. - So that if the picture is never showned (decode only frame) or the request - queue is full before the buffer is displayed, the picture buffer will - remain alive. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2142> - -2021-04-07 07:48:57 -0400 Doug Nazar <nazard@nazar.ca> - - * gst/rtmp2/rtmp/rtmpmessage.c: - rtmp2: Use correct size of write macro for param2. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2146> - -2021-04-01 07:59:45 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: remove unsupported formats because driver's bugs - Add a way to filter out video formats from caps because of unresolved - bugs in drivers. In this case for media-driver (iHD) where some RGB32 - formats are not handled correctly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2129> - -2021-03-31 09:59:21 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavideoformat.c: - va: videoformats: Map more color formats. - Added Y212_LE, Y412_LE, P012_LE, Y444, RGB16, RGB and BGR10A2_LE in - the static map betwen VA and GStreamer color formats. This synchronize - the map used in gstremaer-vaapi and this plugin. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2129> - -2021-03-31 09:50:46 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadisplay.c: - * sys/va/gstvavideoformat.c: - * sys/va/gstvavideoformat.h: - va: videoformats: Fix RGB32 mapping between VA and GStreamer. - Different VA drives might have different definitions for RGB32 color - formats because different bit interpretation. Sadly the specification - doesn't clarify these interpretations. So VA users have to figure out - what's the correct mapping with it's rendering color format - definition. - This patch aims to fix the static map structure after the - VAImageFormats are queried. There is another static map with the - different interpretations of the RGB32 formats, and compare them with - the given VAImageFormat, then with the GStreamer color format, update - the mapping table. - Finally, some RGB32 color formats were added. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2129> - -2021-04-07 01:03:15 -0400 Doug Nazar <nazard@nazar.ca> - - * ext/avtp/gstavtpcvfdepay.c: - * ext/avtp/gstavtpcvfpay.c: - * ext/avtp/gstavtpsrc.c: - avtp: Fix log format macros - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2145> - -2021-04-06 13:07:52 -0300 Daniel Almeida <daniel.almeida@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2codecs: gstv4l2decoder.c: Add missing include - Add missing include for sys/ioctl.h so that these warnings dissapear - when compiling: - ../subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2decoder.c:179:9: - warning: implicit declaration of function ‘ioctl’ - -Wimplicit-function-declaration - Signed-off-by: Daniel Almeida <daniel.almeida@collabora.com> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2140> - -2021-04-06 19:18:45 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/curl/gstcurlsftpsink.c: - curlsftpsink: Don't run GST_DEBUG_OBJECT() on a class struct - It's supposed to be a GObject. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2141> - -2021-03-29 15:29:30 +0800 Yinhang Liu <yinhang.liu@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkh265enc.c: - msdkh265enc: add support for RGB 10bit format - The SDK can support A2RGB10 format 1, A2RGB10 format corresponds - to BGR10A2_LE format in gstreamer. A2RGB10 format only supports - low-power mode. - Example: - gst-launch-1.0 videotestsrc ! video/x-raw,format=BGR10A2_LE \ - ! msdkh265enc low-power=1 ! fakesink - 1 https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#mfxframedata - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2126> - -2021-03-31 16:18:04 +0200 Wim Taymans <wtaymans@redhat.com> - - * gst-libs/gst/vulkan/android/gstvkwindow_android.c: - * gst-libs/gst/vulkan/cocoa/gstvkwindow_cocoa.m: - * gst-libs/gst/vulkan/gstvkapi.h: - * gst-libs/gst/vulkan/gstvkhandle.h: - * gst-libs/gst/vulkan/ios/gstvkwindow_ios.m: - * gst-libs/gst/vulkan/wayland/gstvkwindow_wayland.c: - * gst-libs/gst/vulkan/win32/gstvkwindow_win32.c: - * gst-libs/gst/vulkan/xcb/gstvkwindow_xcb.c: - * sys/applemedia/videotexturecache-vulkan.mm: - vulkan: provide a custom VK_DEFINE_NON_DISPATCHABLE_HANDLE - If the application did not define one yet, define our own - VK_DEFINE_NON_DISPATCHABLE_HANDLE that is independent of the - architecture. - Vulkan, by default, provides a define that depends on the architecture, - which causes the symbol type to be different. This causes an - architecture dependent .gir file, which then causes multilib - installation problems because the .gir files can't be shared. - Make it possible to override the format specifier and provide - a default one that is compatible with the default non dispatchable - handle. - Return VK_NULL_HANDLE from functions that return a non-dispatchable - handle. - Fixes #1566 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2130> - -2021-03-26 17:48:09 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - * sys/va/gstvavpp.c: - va: postproc, filter: add disable-passthrough property - vapostproc tries to be in passthrough mode as much as possible. But - they might be situations where the user might force to process the - frames. For example, when upstream sets the crop meta and the user - wants VA do that cropping, rather than downstream. - For those situations this property will disable the passthrough mode, - if it's enabled. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2058> - -2021-02-23 09:01:10 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: postproc: enable cropping by crop meta - If incoming buffers have crop meta it's done by vapostproc, iif - vapostproc is not in passthrough mode and downstream doesn't handle - it. - This patch announces the crop meta API in proposed bufferpool, while - it stops filtering meta APIs, since it was only filter crop api. - Also if downstream supports crop and video metas, vapostporoc - announces both meta APIs in upstream bufferpool. - Finally, the meta is removed from the buffer if the crop is enabled. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2058> - -2021-03-04 15:19:25 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - va: filter: add gst_va_filter_enable_cropping () - This will toggle the cropping operation in the filter - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2058> - -2021-01-23 12:53:25 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - * sys/va/gstvavpp.c: - va: filter, vpp: add and use GstVaSample struct - This new struct describes the input and output GstBuffers to - post-process, including VA flags. It also contains the VASurfaceID and - VARectangle, but those are private, completed inside GstVaFilter. - It is used for pass arguments to gst_va_filter_convert_surface() function. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2058> - -2021-02-28 08:38:36 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: postproc: Use allocation caps when creating sink pool. - When an input buffer needs to be copied into a VA memory, it's - required to create a buffer pool. This patch uses the - propose_allocation() caps to instantiate the allocator and pool, - instead of the negotiated caps, which rather represents the resolution - to display. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2058> - -2021-01-22 23:54:50 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/closedcaption/gstline21dec.c: - line21dec: relax caps requirements - Instead of requiring interlaced video, simply skip CC detection - when the input is progressive. - This allows placing line21decoder unconditionally in pipelines, - without having to worry about whether the input stream will be - interlaced, or even worse interlacing just in case! - + update doc cache - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1885> - -2020-12-16 01:02:53 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstline21dec.c: - * ext/closedcaption/gstline21dec.h: - line21dec: expose mode property - That new property can be used to control whether and how - detected CC meta should be inserted in the list of existing - CC meta on the input frame (if there was any). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1885> - -2020-12-15 22:01:33 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstline21dec.c: - * ext/closedcaption/gstline21dec.h: - line21dec: expose ntsc-only property - When this is set, the element only tries to detect CC when the - height is 525 or 486 (NTSC resolutions). The height is already - checked. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1885> - -2021-03-31 11:52:07 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: Use derived images only if not mapped for reading. - Derived images are direct maps to surfaces bits, but in Intel Gen7 to - Gen9, that memory is not cachable, thus reading can be very slow (it - might produce timeout is tests such as fluster). - This patch tries first to define if derived images are possible, and - later use them only if mapping is not for reading. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2128> - -2021-03-31 11:13:52 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvacaps.c: - va: caps: Add image formats in raw caps only for non-iHD. - This plugin, for decoders more concretely, assumes that a VA config - can do certain color conversions when mapping frames onto CPU's - memory. - This assumption was valid for i965 and Gallium drivers which generates - valid outputs in bitstreams testers (v.gr. fluster). Nonetheless, iHD, - even when it generates acceptable rendered frames, output's MD5 of - tests weren't valid. - This patch append the image formats, for color conversion when mapping - to memory, for non-iHD drivers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2128> - -2021-04-01 15:09:45 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11convert.cpp: - * sys/d3d11/gstd3d11upload.cpp: - d3d11: Fix for UYVY/VYUY format rendering - Don't assume that non-native DXGI formats support RTV and/or SRV. - We are mapping UYVY and VYUY formats to DXGI_FORMAT_R8G8_B8G8_UNORM - which doesn't support render target view - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2133> - -2021-03-25 03:16:05 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/gstbasetsmux.h: - mpegtsmux: Respect the start-time-selection property. - Use the start time provided by the aggregator base class for output - times. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2105> - -2021-03-29 15:24:38 +0800 Yinhang Liu <yinhang.liu@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - msdkh265enc: add dblk-idc property - The SDK can support deblocking reference structure 1, so add a new - property to enable this feature. - 1 https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#mfxextcodingoption2 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2122> - -2021-03-29 15:18:13 +0800 Yinhang Liu <yinhang.liu@intel.com> - - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - msdkh264enc: add dblk-idc property - The SDK can support deblocking reference structure 1, so add a new - property to enable this feature. - 1 https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#mfxextcodingoption2 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2122> - -2021-03-30 11:34:54 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/flite/gstflite.c: - * ext/flite/gstflitetestsrc.c: - flite: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2123> - -2021-03-30 11:27:11 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dtls/plugin.c: - dtls: hotfix: allow per feature registration - Use of GST_ELEMENT_REGISTER in plugin.c - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2123> - -2021-03-26 19:47:06 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/gs/meson.build: - gs: remove clang formatting - remove clang formatting during - the build. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2115> - -2021-03-26 11:41:50 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/gs/gstgs.cpp: - * ext/gs/gstgssink.cpp: - * ext/gs/gstgssink.h: - * ext/gs/gstgssrc.cpp: - * ext/gs/gstgssrc.h: - gs: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2115> - -2021-03-29 12:15:18 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - avwait: Don't reset time tracking when receiving the same segment again - This causes avwait to go back into "dropping" mode until audio and video - are synced again, which is unnecessary when the segment didn't actually - change. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2121> - -2021-03-17 14:30:09 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvdecoder.c: - * sys/nvcodec/gstnvdecoder.h: - * sys/nvcodec/gstnvh264dec.c: - * sys/nvcodec/gstnvh265dec.c: - * sys/nvcodec/gstnvvp8dec.c: - * sys/nvcodec/gstnvvp9dec.c: - nvcodec: nvsldec: Refactor graphics api resource handling - * Move GL context object to GstNVDecoder object, and remove - duplicated handling of each codec decoder element - * Don't create GL context too early. We can create it only if - we need to negotiate with downstream gl element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2089> - -2021-03-17 14:38:40 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - * sys/msdk/msdk-enums.c: - * sys/msdk/msdk-enums.h: - msdkenc{h264,h265}: add intra-refresh-type property - The SDK allows user to specify the intra refresh type which can improve - error resilience without significant impact on encoded bitstream size - caused by I frames 1 - 1 https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#mfxextcodingoption2 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2090> - -2021-03-28 12:03:09 +0200 Marijn Suijten <marijns95@gmail.com> - - * gst-libs/gst/d3d11/gstd3d11memory.h: - * gst-libs/gst/webrtc/webrtc_fwd.h: - Add @ prefix to enum-variant references in documentation - Found while working on GStreamer-rs documentation, some enums had this - bit of text pasted verbatim in the enum documentation rather than - attached to the enum-variant. Fortunately it seems these in WebRTC and - D3D11 are the only ones matching the non-@-prefixed pattern: - ^ \* GST_\w+:\s*\w+ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2118> - -2021-03-26 12:20:07 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2/connection: Separate inner from outer cancelling - The connection cancels itself when it is closed. To avoid the - cancellable passed to `gst_rtmp_connection_new` from being unexpectedly - cancelled, separate inner from outer cancellation by holding two - cancellables. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1558 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2111> - -2021-03-28 12:06:24 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11vp9dec: Remove debug dump functions - Existing debug messages are not quite useful - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2117> - -2021-03-28 16:06:55 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11decoder: Move zero-copy decision logic into decoder object - Get rid of all duplicated code for zero-copy decision and output buffer - allocation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2117> - -2021-03-26 22:40:34 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11vp9dec: Ignore show_frame flag in output_picture() - baseclass will not call output_picture() if it shouldn't be ouputted. - Note that the show_frame flag can be zero when show_existing_frame is set - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2114> - -2021-03-26 22:27:38 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - codecs: vp9decoder: Fix to output frame when show_existing_frame flag is set - When show_existing_frame flag is set, show_frame flag is zero - but we should output previously decoded frame as specified in frame header. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2114> - -2021-03-26 21:06:59 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11decoder: Do not hardcode the limit minimum resolution to 64 - Decoder should be able to support lower resolution than 64x64 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2113> - -2021-03-25 21:17:07 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - * sys/d3d11/gstd3d11videosinkbin.cpp: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - d3d11videosink: Remove DirectWrite related dead code - It's now not enabled since we moved core part to gst-libs - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2108> - -2021-03-25 03:24:11 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvideoenc.cpp: - mfvideoenc: Don't pass 0/1 framerate to MFT - Some MFT implementations do not accept 0/1 framerate and it will - result in encoder open failure. If framerate is unknown, - we will use arbitrary 25/1 framerate value. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2106> - -2021-03-23 13:48:09 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11memory.c: - * gst-libs/gst/d3d11/gstd3d11memory.h: - * sys/d3d11/gstd3d11decoder.cpp: - d3d11decoder: Resurrect zero-copy for fixed-size DPB pool - Enable zero-copy if downstream proposed pool and therefore decoder - can know the amount of buffer required by downstream. - Otherwise decoder will copy when our DPB pool has no sufficient - buffers for later decoding operation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2097> - -2021-03-20 19:52:16 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11decoder: Implement array-of-texture DPB again - Re-implementation of array-of-texture based on d3d11 memory pool. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2097> - -2021-03-18 22:31:55 +0900 Seungha Yang <seungha@centricular.com> - - d3d11: Implement memory pool - Major changes: - * GstD3D11Allocator: This allocator is now device-independent object - which can allocate GstD3D11Memory object for any GstD3D11Device. - User can get this object via gst_allocator_find(GST_D3D11_MEMORY_NAME) - * GstD3D11PoolAllocator: A new allocator implementation for texture pool. - From now on GstD3D11BufferPool will make use of this memory pool allocator - to avoid frequent texture reallocation. That usually happens because - of buffer copy (gst_buffer_make_writable for example) - In addition to that, GstD3D11BufferPool will provide GstBuffer with - GstVideoMeta, because CPU access to a GstD3D11Memory without GstVideoMeta - is almost impossible since GPU drivers needs padding for stride alignment. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2097> - -2021-03-20 22:11:49 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11memory.c: - * gst-libs/gst/d3d11/gstd3d11memory.h: - * sys/d3d11/gstd3d11decoder.cpp: - d3d11decoder: Temporarily remove zero-copy related code - We will re-implement it based on memory pool - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2097> - -2021-03-23 09:33:49 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: postproc: Set one buffer in pools as minimum. - Because some elements, such as videorate check that minimum are - different of maximum number of buffers in the proposed pool, since - they might hold one or more buffers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2102> - -2021-03-23 19:19:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth265parser.c: - * tests/check/libs/h264parser.c: - * tests/check/libs/h265parser.c: - h2645parser: Catch overflows in AVC/HEVC NAL unit length calculations - Offset and size are stored as 32 bit guint and might overflow when - adding the nal_length_size, so let's avoid that. - For the size this would happen if the AVC/HEVC NAL unit size happens to - be stored in 4 bytes and is 4294967292 or higher, which is likely - corrupted data anyway. - For the offset this is something for the caller of these functions to - take care of but is unlikely to happen as it would require parsing on a - >4GB buffer. - Allowing these overflows causes all kinds of follow-up bugs in the - h2645parse elements, ranging from infinite loops and memory leaks to - potential memory corruptions. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2103> - -2021-02-25 09:59:50 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/zxing/gstzxing.cpp: - * ext/zxing/gstzxing.h: - * ext/zxing/gstzxingplugin.c: - zxing: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-25 09:57:00 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/zbar/gstzbar.c: - * ext/zbar/gstzbar.h: - zbar: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-25 09:51:52 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/x265/gstx265enc.c: - * ext/x265/gstx265enc.h: - x265: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-25 09:45:10 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/wpe/gstwpesrc.cpp: - * ext/wpe/gstwpesrc.h: - wpe: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-25 09:27:19 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/wildmidi/gstwildmididec.c: - * ext/wildmidi/gstwildmididec.h: - wildmidi: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-25 08:18:54 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/webrtcdsp/gstwebrtcdsp.cpp: - * ext/webrtcdsp/gstwebrtcdsp.h: - * ext/webrtcdsp/gstwebrtcdspplugin.cpp: - * ext/webrtcdsp/gstwebrtcechoprobe.cpp: - * ext/webrtcdsp/gstwebrtcechoprobe.h: - * ext/webrtcdsp/meson.build: - webrtcdsp: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-25 08:04:42 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/webp/gstwebp.c: - * ext/webp/gstwebpdec.c: - * ext/webp/gstwebpdec.h: - * ext/webp/gstwebpenc.c: - * ext/webp/gstwebpenc.h: - webp: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-24 18:56:55 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - wayland: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-24 18:45:15 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/vulkan/gstvulkan.c: - * ext/vulkan/gstvulkanelement.c: - * ext/vulkan/gstvulkanelements.h: - * ext/vulkan/meson.build: - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkdeviceprovider.c: - * ext/vulkan/vkdownload.c: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vksink.c: - * ext/vulkan/vkupload.c: - * ext/vulkan/vkviewconvert.c: - vulkan: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-24 17:34:50 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/voamrwbenc/gstvoamrwb.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/voamrwbenc/gstvoamrwbenc.h: - voamrwbenc: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-24 17:32:34 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/voaacenc/gstvoaac.c: - * ext/voaacenc/gstvoaacenc.c: - * ext/voaacenc/gstvoaacenc.h: - voaacenc: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-24 13:07:30 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/ttml/gstttmlelement.c: - * ext/ttml/gstttmlelements.h: - * ext/ttml/gstttmlparse.c: - * ext/ttml/gstttmlplugin.c: - * ext/ttml/gstttmlrender.c: - * ext/ttml/meson.build: - ttml: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-24 12:52:08 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/srtp/gstsrtp.c: - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpdec.h: - * ext/srtp/gstsrtpelement.c: - * ext/srtp/gstsrtpelements.h: - * ext/srtp/gstsrtpenc.c: - * ext/srtp/gstsrtpenc.h: - * ext/srtp/gstsrtpplugin.c: - * ext/srtp/meson.build: - srtp: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-24 12:39:22 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/srt/gstsrt.c: - * ext/srt/gstsrtelement.c: - * ext/srt/gstsrtelements.h: - * ext/srt/gstsrtplugin.c: - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsrc.c: - * ext/srt/meson.build: - srt: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-19 12:54:56 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/spandsp/gstdtmfdetect.c: - * ext/spandsp/gstdtmfdetect.h: - * ext/spandsp/gstspandsp.c: - * ext/spandsp/gstspanplc.c: - * ext/spandsp/gstspanplc.h: - * ext/spandsp/gsttonegeneratesrc.c: - * ext/spandsp/gsttonegeneratesrc.h: - spandsp: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-19 12:41:41 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/soundtouch/gstbpmdetect.cc: - * ext/soundtouch/gstbpmdetect.hh: - * ext/soundtouch/gstpitch.cc: - * ext/soundtouch/gstpitch.hh: - * ext/soundtouch/plugin.c: - soundtouch: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-19 12:30:50 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/sndfile/gstsf.c: - * ext/sndfile/gstsfdec.c: - * ext/sndfile/gstsfdec.h: - * ext/sndfile/gstsfelement.c: - * ext/sndfile/gstsfelements.h: - * ext/sndfile/gstsfsink.h: - * ext/sndfile/meson.build: - sndfile: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-19 12:18:39 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - * ext/smoothstreaming/gstsmoothstreaming-plugin.c: - smoothstreaming: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-19 12:14:53 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/sctp/gstsctpdec.c: - * ext/sctp/gstsctpdec.h: - * ext/sctp/gstsctpenc.c: - * ext/sctp/gstsctpenc.h: - * ext/sctp/gstsctpplugin.c: - sctp: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-19 12:09:18 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - * ext/sbc/sbc-plugin.c: - sbc: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-19 12:00:13 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/rtmp/gstrtmp.c: - * ext/rtmp/gstrtmpelement.c: - * ext/rtmp/gstrtmpelements.h: - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsink.h: - * ext/rtmp/gstrtmpsrc.c: - * ext/rtmp/meson.build: - rtmp: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-19 11:53:12 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/rsvg/gstrsvg.c: - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgdec.h: - * ext/rsvg/gstrsvgoverlay.c: - * ext/rsvg/gstrsvgoverlay.h: - rsvg: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-19 11:40:40 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/resindvd/plugin.c: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdbin.h: - resindvd: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 16:23:42 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/qroverlay/gstdebugqroverlay.c: - * ext/qroverlay/gstqroverlay.c: - * ext/qroverlay/gstqroverlayelement.c: - * ext/qroverlay/gstqroverlayelements.h: - * ext/qroverlay/gstqroverlayplugin.c: - * ext/qroverlay/meson.build: - qroverlay: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 15:56:44 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/opus/gstopus.c: - * ext/opus/gstopusparse.c: - * ext/opus/gstopusparse.h: - opus: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 15:48:12 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/openni2/gstopenni2.cpp: - * ext/openni2/gstopenni2src.cpp: - * ext/openni2/gstopenni2src.h: - openni2: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 15:42:44 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/openmpt/gstopenmptdec.c: - * ext/openmpt/gstopenmptdec.h: - * ext/openmpt/plugin.c: - openmpt: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 15:30:06 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/openjpeg/gstopenjpeg.c: - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegdec.h: - * ext/openjpeg/gstopenjpegenc.c: - * ext/openjpeg/gstopenjpegenc.h: - openjpeg: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 15:21:40 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/openh264/gstopenh264dec.cpp: - * ext/openh264/gstopenh264element.c: - * ext/openh264/gstopenh264elements.h: - * ext/openh264/gstopenh264enc.cpp: - * ext/openh264/gstopenh264plugin.c: - * ext/openh264/meson.build: - openh264: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 14:08:34 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/openexr/gstopenexr.c: - * ext/openexr/gstopenexrdec.cpp: - * ext/openexr/gstopenexrdec.h: - openexr: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 13:34:54 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/opencv/gstcameracalibrate.cpp: - * ext/opencv/gstcameracalibrate.h: - * ext/opencv/gstcameraundistort.cpp: - * ext/opencv/gstcameraundistort.h: - * ext/opencv/gstcvdilate.cpp: - * ext/opencv/gstcvdilate.h: - * ext/opencv/gstcvequalizehist.cpp: - * ext/opencv/gstcvequalizehist.h: - * ext/opencv/gstcverode.cpp: - * ext/opencv/gstcverode.h: - * ext/opencv/gstcvlaplace.cpp: - * ext/opencv/gstcvlaplace.h: - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstcvsmooth.h: - * ext/opencv/gstcvsobel.cpp: - * ext/opencv/gstcvsobel.h: - * ext/opencv/gstdewarp.cpp: - * ext/opencv/gstdewarp.h: - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstdisparity.h: - * ext/opencv/gstedgedetect.cpp: - * ext/opencv/gstedgedetect.h: - * ext/opencv/gstfaceblur.cpp: - * ext/opencv/gstfaceblur.h: - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gstfacedetect.h: - * ext/opencv/gstgrabcut.cpp: - * ext/opencv/gstgrabcut.h: - * ext/opencv/gsthanddetect.cpp: - * ext/opencv/gsthanddetect.h: - * ext/opencv/gstmotioncells.cpp: - * ext/opencv/gstmotioncells.h: - * ext/opencv/gstopencv.cpp: - * ext/opencv/gstretinex.cpp: - * ext/opencv/gstretinex.h: - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstsegmentation.h: - * ext/opencv/gstskindetect.cpp: - * ext/opencv/gstskindetect.h: - * ext/opencv/gsttemplatematch.cpp: - * ext/opencv/gsttemplatematch.h: - * ext/opencv/gsttextoverlay.cpp: - * ext/opencv/gsttextoverlay.h: - opencv: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 10:58:28 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/openaptx/gstopenaptxdec.c: - * ext/openaptx/gstopenaptxdec.h: - * ext/openaptx/gstopenaptxenc.c: - * ext/openaptx/gstopenaptxenc.h: - * ext/openaptx/openaptx-plugin.c: - openaptx: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 10:52:51 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/openal/gstopenal.c: - * ext/openal/gstopenalelement.c: - * ext/openal/gstopenalelements.h: - * ext/openal/gstopenalsink.c: - * ext/openal/gstopenalsrc.c: - * ext/openal/meson.build: - openal: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 10:41:53 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/ofa/gstofa.c: - * ext/ofa/gstofa.h: - ofa: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 10:35:34 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - neon: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 10:24:18 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/musepack/gstmusepackdec.c: - * ext/musepack/gstmusepackdec.h: - musepack: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 10:17:20 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/mplex/gstmplex.cc: - * ext/mplex/gstmplex.hh: - mplex: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 10:14:38 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mpeg2enc/gstmpeg2enc.hh: - mpeg2enc: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 10:10:16 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/modplug/gstmodplug.cc: - * ext/modplug/gstmodplug.h: - modplug: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 09:56:08 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/mdns/gstmicrodns.c: - mdns: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 09:52:08 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/libmms/gstmms.c: - * ext/libmms/gstmms.h: - libmms: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 09:50:21 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/libde265/gstlibde265.c: - * ext/libde265/libde265-dec.c: - * ext/libde265/libde265-dec.h: - libde265: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-18 09:48:04 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/ldac/gstldacenc.c: - * ext/ldac/gstldacenc.h: - * ext/ldac/ldac-plugin.c: - ldac: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 18:38:16 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/kate/gstkate.c: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateelement.c: - * ext/kate/gstkateelements.h: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkatetiger.c: - * ext/kate/gstkateutil.c: - * ext/kate/meson.build: - kate: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 18:26:42 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/isac/gstisac.c: - * ext/isac/gstisacdec.c: - * ext/isac/gstisacdec.h: - * ext/isac/gstisacenc.c: - * ext/isac/gstisacenc.h: - isac: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 18:23:21 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/iqa/iqa.c: - * ext/iqa/iqa.h: - iqa: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 18:17:08 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/hls/gsthls.h: - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - * ext/hls/gsthlselement.c: - * ext/hls/gsthlselements.h: - * ext/hls/gsthlsplugin.c: - * ext/hls/gsthlssink.c: - * ext/hls/gsthlssink2.c: - * ext/hls/gstm3u8playlist.c: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - * ext/hls/meson.build: - hls: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 18:07:42 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/gsm/gstgsm.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmdec.h: - * ext/gsm/gstgsmenc.c: - * ext/gsm/gstgsmenc.h: - gsm: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 18:04:20 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/gme/gstgme.c: - * ext/gme/gstgme.h: - gme: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 18:01:05 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/fluidsynth/gstfluiddec.c: - * ext/fluidsynth/gstfluiddec.h: - fluidsynth: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 16:05:02 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/fdkaac/gstfdkaac.c: - * ext/fdkaac/gstfdkaacdec.c: - * ext/fdkaac/gstfdkaacdec.h: - * ext/fdkaac/gstfdkaacenc.c: - * ext/fdkaac/gstfdkaacenc.h: - * ext/fdkaac/gstfdkaacplugin.c: - * ext/fdkaac/meson.build: - fdkaac: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 15:59:49 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/faad/gstfaad.c: - * ext/faad/gstfaad.h: - faad: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 15:59:36 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/faac/gstfaac.c: - * ext/faac/gstfaac.h: - faac: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 15:35:10 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dts/gstdtsdec.c: - * ext/dts/gstdtsdec.h: - dts: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 12:22:07 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlselement.c: - * ext/dtls/gstdtlselements.h: - * ext/dtls/gstdtlsenc.c: - * ext/dtls/gstdtlssrtpdec.c: - * ext/dtls/gstdtlssrtpdemux.c: - * ext/dtls/gstdtlssrtpenc.c: - * ext/dtls/meson.build: - dtls: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 12:10:31 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/directfb/dfbvideosink.c: - * ext/directfb/dfbvideosink.h: - directfb: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 12:07:48 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dc1394/gstdc1394src.c: - * ext/dc1394/gstdc1394src.h: - dc1394: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 12:03:05 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstdashsink.c: - * ext/dash/gstdashsink.h: - * ext/dash/gstplugin.c: - dash: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 11:55:14 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/curl/gstcurl.c: - * ext/curl/gstcurlelement.c: - * ext/curl/gstcurlelements.h: - * ext/curl/gstcurlfilesink.c: - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlhttpsink.c: - * ext/curl/gstcurlhttpsrc.c: - * ext/curl/gstcurlsftpsink.c: - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/meson.build: - curl: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 11:43:33 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/colormanagement/gstcolormanagement.c: - * ext/colormanagement/gstlcms.c: - * ext/colormanagement/gstlcms.h: - colormanagement: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 11:31:35 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/closedcaption/gstcccombiner.c: - * ext/closedcaption/gstcccombiner.h: - * ext/closedcaption/gstccconverter.c: - * ext/closedcaption/gstccconverter.h: - * ext/closedcaption/gstccextractor.c: - * ext/closedcaption/gstccextractor.h: - * ext/closedcaption/gstceaccoverlay.c: - * ext/closedcaption/gstceaccoverlay.h: - * ext/closedcaption/gstclosedcaption.c: - * ext/closedcaption/gstline21dec.c: - * ext/closedcaption/gstline21dec.h: - * ext/closedcaption/gstline21enc.c: - * ext/closedcaption/gstline21enc.h: - closedcaption: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 10:23:15 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/chromaprint/gstchromaprint.c: - * ext/chromaprint/gstchromaprint.h: - chromaprint: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 10:13:45 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/bz2/gstbz2.c: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2dec.h: - * ext/bz2/gstbz2enc.c: - * ext/bz2/gstbz2enc.h: - bz2: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 10:10:39 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/bs2b/gstbs2b.c: - * ext/bs2b/gstbs2b.h: - bs2b: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 10:05:20 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/avtp/gstavtp.c: - * ext/avtp/gstavtpaafdepay.c: - * ext/avtp/gstavtpaafdepay.h: - * ext/avtp/gstavtpaafpay.c: - * ext/avtp/gstavtpaafpay.h: - * ext/avtp/gstavtpcrfcheck.c: - * ext/avtp/gstavtpcrfcheck.h: - * ext/avtp/gstavtpcrfsync.c: - * ext/avtp/gstavtpcrfsync.h: - * ext/avtp/gstavtpcvfdepay.c: - * ext/avtp/gstavtpcvfdepay.h: - * ext/avtp/gstavtpcvfpay.c: - * ext/avtp/gstavtpcvfpay.h: - * ext/avtp/gstavtpsink.c: - * ext/avtp/gstavtpsink.h: - * ext/avtp/gstavtpsrc.c: - * ext/avtp/gstavtpsrc.h: - avtp: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-02-17 09:45:04 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2020-08-17 09:52:11 -0400 Julian Bouzas <julian.bouzas@collabora.com> - - * ext/aom/gstaom.c: - * ext/aom/gstav1dec.c: - * ext/aom/gstav1dec.h: - * ext/aom/gstav1enc.c: - * ext/aom/gstav1enc.h: - aom: allow per feature registration - Split plugin into features including - dynamic types which can be indiviually - registered during a static build. - More details here: - https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2038> - -2021-03-23 16:26:13 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/meson.build: - d3d11decoder: Enable high precision clock if needed - We've been doing retry with 1ms sleep if DecoderBeginFrame() - returned E_PENDING which means application should call - DecoderBeginFrame() again because GPU is busy. - The 1ms sleep() during retry would result in usually about 15ms delay - in reality because of bad clock precision on Windows. - To improve throughput performance, this commit will enable - high precision clock only for NVIDIA platform since - DecoderBeginFrame() call on the other GPU vendors seems to - succeed without retry. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2099> - -2021-03-03 16:03:07 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegpsdemux: fix accurate seek - In an accurate seek, the segment start should be - the same as the one requested in the seek. - The start should be kept as the one from the - segment if its inferior. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2048> - -2021-03-03 14:11:21 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegpsdemux: Keep seqnum events - Keep the same seqnum of the new segment events for each - of the streams. - Keep the segment to send the EOS event. - Keep the seek seqnum for segment and flush event. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2048> - -2021-03-01 16:23:09 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: avoid early EOS - In a case of a scr different from 0, after a seek, - the src_segment.stop has been updated with the duration - not including the base_time (scr). The segment position - needs to be tested upon segment.stop + base_time (scr) - to check for an EOS. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2048> - -2021-03-19 16:17:41 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: postproc: disable passthrough as soon as possible - After the VA filter creation, when changing the element's state from NULL - to READY, immediatly checks for any filter operation requested by the user. - If any, the passthrough mode is disabled early, so there's no need for a - future renegotiation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2094> - -2021-03-19 16:14:08 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: postproc: rename function to gst_va_vpp_update_passthrough - Since it's widely used, a proper name will reflect its importance. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2094> - -2021-03-22 14:34:36 +1100 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - * ext/colormanagement/gstlcms.c: - * ext/curl/gstcurlqueue.h: - * ext/iqa/iqa.c: - * ext/opencv/gstcvdilateerode.cpp: - * ext/openjpeg/gstopenjpegenc.c: - * ext/resindvd/rsndec.c: - * ext/sctp/sctpassociation.c: - * ext/ttml/subtitlemeta.c: - * ext/wildmidi/gstwildmididec.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/audio/gstnonstreamaudiodecoder.c: - * gst-libs/gst/codecparsers/gstmpegvideometa.c: - * gst-libs/gst/d3d11/gstd3d11device.c: - * gst-libs/gst/d3d11/gstd3d11utils.c: - * gst-libs/gst/sctp/sctpreceivemeta.c: - * gst-libs/gst/sctp/sctpsendmeta.c: - * gst-libs/gst/vulkan/android/gstvkwindow_android.c: - * gst-libs/gst/vulkan/cocoa/gstvkwindow_cocoa.m: - * gst-libs/gst/vulkan/gstvkbuffermemory.c: - * gst-libs/gst/vulkan/gstvkcommandbuffer.c: - * gst-libs/gst/vulkan/gstvkdescriptorset.c: - * gst-libs/gst/vulkan/gstvkdevice.c: - * gst-libs/gst/vulkan/gstvkdisplay.c: - * gst-libs/gst/vulkan/gstvkfence.c: - * gst-libs/gst/vulkan/gstvkhandle.c: - * gst-libs/gst/vulkan/gstvkimagememory.c: - * gst-libs/gst/vulkan/gstvkimageview.c: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkmemory.c: - * gst-libs/gst/vulkan/gstvkphysicaldevice.c: - * gst-libs/gst/vulkan/gstvkqueue.c: - * gst-libs/gst/vulkan/gstvktrash.c: - * gst-libs/gst/vulkan/gstvkutils.c: - * gst-libs/gst/vulkan/gstvkwindow.c: - * gst-libs/gst/vulkan/ios/gstvkwindow_ios.m: - * gst-libs/gst/vulkan/vulkan_mkenum.py: - * gst-libs/gst/vulkan/wayland/gstvkwindow_wayland.c: - * gst-libs/gst/vulkan/xcb/gstvkwindow_xcb.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/debugutils/gstfakevideosink.c: - * gst/mxf/mxfmetadata.c: - * gst/netsim/gstnetsim.c: - * gst/rtmp2/rtmp/amf.c: - * gst/rtmp2/rtmp/rtmpchunkstream.c: - * gst/rtmp2/rtmp/rtmpclient.c: - * gst/rtmp2/rtmp/rtmphandshake.c: - * gst/rtmp2/rtmp/rtmpmessage.c: - * gst/segmentclip/gstsegmentclip.c: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/corevideomemory.c: - * sys/applemedia/iosglmemory.c: - * sys/applemedia/iosurfaceglmemory.c: - * sys/applemedia/iosurfacevulkanmemory.c: - * sys/bluez/gstavdtpsrc.h: - * sys/d3d11/gstd3d11deinterlace.cpp: - * sys/d3d11/gstd3d11shader.cpp: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window_win32.cpp: - * sys/ipcpipeline/gstipcpipelinecomm.c: - * sys/mediafoundation/gstmftransform.cpp: - * sys/mediafoundation/gstmfvideobuffer.h: - * sys/msdk/gstmsdkcontextutil.c: - * sys/nvcodec/gstcudacontext.c: - * sys/nvcodec/gstcudanvrtc.c: - * sys/nvcodec/gstcudautils.c: - * sys/nvcodec/gstnvbaseenc.h: - * sys/opensles/openslescommon.c: - * sys/va/gstvaallocator.c: - * sys/va/gstvautils.c: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi2/gstwasapi2client.cpp: - * sys/winscreencap/dxgicapture.c: - * tests/check/libs/vkimage.c: - gst: don't use volatile to mean atomic - volatile is not sufficient to provide atomic guarantees and real atomics - should be used instead. GCC 11 has started warning about using volatile - with atomic operations. - https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1719 - Discovered in https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/868 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2098> - -2021-03-20 16:26:21 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvideoenc.cpp: - * sys/mediafoundation/meson.build: - mfvideoenc: Enable Direct3D multi-thread protection - As documented by MS. See also - https://docs.microsoft.com/en-us/windows/win32/medfound/supporting-direct3d-11-video-decoding-in-media-foundation#open-a-device-handle - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2095> - -2021-03-20 16:15:35 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11device.c: - * gst-libs/gst/d3d11/gstd3d11memory.c: - * gst-libs/gst/d3d11/meson.build: - * sys/d3d11/gstd3d11compositor.cpp: - * sys/d3d11/gstd3d11convert.cpp: - * sys/d3d11/gstd3d11converter.cpp: - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11deinterlace.cpp: - * sys/d3d11/gstd3d11desktopdup.cpp: - * sys/d3d11/gstd3d11overlaycompositor.cpp: - * sys/d3d11/gstd3d11pluginutils.cpp: - * sys/d3d11/gstd3d11videoprocessor.cpp: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window_corewindow.cpp: - * sys/d3d11/gstd3d11window_dummy.cpp: - * sys/d3d11/gstd3d11window_swapchainpanel.cpp: - * sys/d3d11/gstd3d11window_win32.cpp: - * sys/mediafoundation/gstmfvideoenc.cpp: - Revert "d3d11: Enable native multi-thread protection layer and make use of it" - This reverts commit 872b7f503c49442e559f6a381416c6a84b76a3c6. - Native multi-thread protection layer seems to be consuming more CPU - resource than application side protection approach in some cases - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2095> - -2021-03-19 16:36:41 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: check for more sdp things across the board - e.g. - - test for a=setup:$val and direction attributes in all tests - - test number of media sections - - test number of formats in each m= section (for audio/video) - - test no duplicate formats - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2093> - -2020-06-23 12:41:27 -0700 Julien <jisorce@oblong.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/gs/.clang-format: - * ext/gs/README.md: - * ext/gs/gstgs.cpp: - * ext/gs/gstgscommon.cpp: - * ext/gs/gstgscommon.h: - * ext/gs/gstgssink.cpp: - * ext/gs/gstgssink.h: - * ext/gs/gstgssrc.cpp: - * ext/gs/gstgssrc.h: - * ext/gs/meson.build: - * ext/meson.build: - * meson_options.txt: - gs: add source and sink for Google Cloud Storage - Useful when having a service that runs a GStreamer pipeline - or application in Google Cloud to avoid storing the inputs - and outputs in the running container or service. For example - when analyzing a video from a Google Cloud Storage bucket - and extracting images or converting the video and then uploading - the results into another Google Cloud Storage bucket. - - gssrc allows to read from a file located in Google Cloud - Storage and it supports seeking. - - gssink allows to write to a file located in Google Cloud - Storage. There are 2 modes, one similar to multifilesink and - the other similar to filesink. - Example: - gst-launch-1.0 gssrc location=gs://mybucket/videos/sample.mp4 ! decodebin ! glimagesink - gst-launch-1.0 playbin uri=gs://mybucket/videos/sample.mp4 - gst-launch-1.0 videotestsrc num-buffers=5 ! pngenc ! gssink object-name="img/img%05d.png" bucket-name="mybucket" next-file=buffer - gst-launch-1.0 filesrc location=sample.mp4 ! gssink object-name="videos/video.mp4" bucket-name="mybucket" next-file=none - When running locally simply set GOOGLE_APPLICATION_CREDENTIALS. But - when running in Google Cloud Run or Google Cloud Engine, just set the - "service-account-email" property on each element. - Closes #1264 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1369> - -2021-03-17 23:53:04 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11device.c: - * gst-libs/gst/d3d11/gstd3d11memory.c: - * gst-libs/gst/d3d11/meson.build: - * sys/d3d11/gstd3d11compositor.cpp: - * sys/d3d11/gstd3d11convert.cpp: - * sys/d3d11/gstd3d11converter.cpp: - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11deinterlace.cpp: - * sys/d3d11/gstd3d11desktopdup.cpp: - * sys/d3d11/gstd3d11overlaycompositor.cpp: - * sys/d3d11/gstd3d11pluginutils.cpp: - * sys/d3d11/gstd3d11videoprocessor.cpp: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window_corewindow.cpp: - * sys/d3d11/gstd3d11window_dummy.cpp: - * sys/d3d11/gstd3d11window_swapchainpanel.cpp: - * sys/d3d11/gstd3d11window_win32.cpp: - * sys/mediafoundation/gstmfvideoenc.cpp: - d3d11: Enable native multi-thread protection layer and make use of it - ... instead of our own GRecMutex locking. In this way, any other - Direct3D11 client (MediaFoundation for example) can safely call - any Direct3D11 API even when we are sharing our Direct3D11 device - with others. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2092> - -2021-02-26 03:28:29 +1100 Jan Schmidt <jan@centricular.com> - - * tests/examples/mpegts/meson.build: - * tests/examples/mpegts/tsmux-prog-map.c: - examples: Add an mpegtsmux example of prog-map usage. - Add an example of how to construct the prog-map structure for - the MPEG-TS muxers and assign streams to programs, and set PCR - and PMT PIDs. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2039> - -2021-02-26 02:53:33 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - mpegtsmux: Add PMT_%d support to prog-map. - Support a PMT_%d field in the prog-map, that's optionally used - to set the PMT for each program in the mux. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2039> - -2021-03-12 18:10:18 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - mpegtsmux: Don't write PCR until PAT/PMT are output. - Make sure streams start cleanly with a PAT/PMT and defer the first PCR - output until after that. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2073> - -2021-03-11 18:21:11 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - tsmux: finalize PCR timing for complete accuracy - In order to always insert a PCR packet right on time, we need to - check whether one is needed when outputting any packet, not only - a packet for the PCR stream. Most of the PCR packets will remain - data-carrying packets, but as a last resort we may insert stuffing - packets on the PCR stream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2073> - -2021-03-11 18:05:25 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - mpegtsmux: Improve PCR/SI scheduling. - Change PCR / SI scheduling so that instead of checking if - the current PCR is larger than the next target time, instead - check if the PCR of the next packet would be too late, so PCR - and SI are always scheduled earlier than the target, not later. - There are still cases where PCR can be written too late though, - because we don't check before each output packet. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2073> - -2021-03-11 18:05:10 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - tsmuxstream: Fix comment typo - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2073> - -2021-03-09 13:22:10 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/closedcaption/gstcccombiner.c: - * ext/closedcaption/gstcccombiner.h: - * tests/check/elements/cccombiner.c: - cccombiner: implement scheduling - Prior to that, cccombiner's behaviour was essentially that of - a funnel: it strictly looked at input timestamps to associate - together video and caption buffers. - This patch instead exposes a "schedule" property, with a default - of TRUE, to control whether caption buffers should be smoothly - scheduled, in order to have exactly one per output video buffer. - This can involve rewriting input captions, for example when the - input is CDP sequence counters are rewritten, time codes are dropped - and potentially re-injected if the input video frame had a time code - meta. - Caption buffers may also get split up in order to assign captions to - the correct field when the input is interlaced. - This can also imply that the input will drift from synchronization, - when there isn't enough padding in the input stream to catch up. In - that case the element will start dropping old caption buffers once - the number of buffers in its internal queue reaches a certain limit - (configurable). - The property is exposed so that existing users of cccombiner can - revert back to the original behaviour, but should eventually be - removed, as that behaviour was simply inadequate. - This commit also disallows changing the input caption type, as - this would needlessly complicate implementation, and removes - the corresponding test. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2076> - -2021-03-17 19:26:12 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11convert.cpp: - * sys/d3d11/gstd3d11upload.cpp: - d3d11: Use render-target and shader-resource bind flags by default - Even if bind flags is not needed by an element, other element - might need such bind flags. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2091> - -2021-03-15 00:04:21 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvavpp.c: - va: vpp: Fix features lost in transform_caps(). - When we transform the caps from the sink to src, or vice versa, the - "caps" passed to us may only contain parts of the features. Which - makes our vpp lose some feature in caps and get a negotiation error. - The correct way should be: - Cleaning the format and resolution of that caps, but adding all VA, - DMA features to it, making it a full feature caps. Then, clipping it - with the pad template. - fixes: #1551 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2081> - -2021-03-15 16:25:36 -0300 Thibault Saunier <tsaunier@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpe: Ignore 'error-cancelled' 'failures' - This happens when the user use the 'load-bytes' signal and nothing is wrong there - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2085> - -2021-03-16 19:09:59 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - d3d11decoder: WARNING if ID3D11VideoDevice is unavailable, not ERROR - gst_d3d11_decoder_new() method is also used for device capability - checking during plugin init. Although we are checking hardware - flag prior to that, it doesn't guarantee ID3D11VideoDevice interface. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2088> - -2021-03-16 17:56:51 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfsourcereader.cpp: - * sys/mediafoundation/gstmftransform.cpp: - mediafoundation: Fix resource leak - IMFActivate would hold its internal objects unless user call ShutdownObject(), - even if we release the IMFActivate. Here internal objects may - include Direct3D objects, such as texture, device handle for example. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2087> - -2021-03-16 15:58:57 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11convert.cpp: - d3d11colorconvert: Fix caps leak - GstBaseTransform::fixate_caps() takes ownership of passed - othercaps argument. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2086> - -2021-03-13 19:00:18 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * tests/examples/va/meson.build: - * tests/examples/va/multiple-vpp.c: - va: example: multiple-vpp: test sharpen with dynamic controller - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2082> - -2021-03-13 18:57:37 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: postproc: synchronize segment with stream time - This is required to use dynamic controllable parameters. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2082> - -2021-03-15 18:26:03 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11decoder: Do negotiation again per forward/reverse playback mode change - For reverse playback, we are always copying decoded - frame to downstream buffer. So the pool size can be - and need to be large enough. - In case that forward playback, however, we need to restrict - the max pool size for performance reason. Otherwise decoder - will keep copying decoded texture to downstream buffer pool - if decoding is faster than downstream throughput - performance and also there are queue element between them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2083> - -2021-03-15 19:48:56 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.cpp: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - d3d11videosink: Avoid switching conversion tool during playback - Decoder might be able to copy decoded texture to the other buffer pool - during playback depending on context. In that case, copied one - has no D3D11_BIND_DECODER bind flag. - If we used ID3D11VideoProcessor previously for decoder texture, - and incoming texture supports ID3D11VideoProcessor as well even if it has no - D3D11_BIND_DECODER flag (having D3D11_BIND_RENDER_TARGET for example), - allow zero-copying instead of using our fallback texture. - Frequent conversion tool change (between ID3D11VideoProcessor and generic shader) - might result in inconsistent image quality. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2084> - -2021-03-12 13:50:59 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - * sys/va/gstvavpp.c: - va: postproc: only drop filters if they change - Currently, at every frame the filters array is recreated. This is not - optimal, since it should be only rebuilt if the VA filter's related - properties change. This patches does that by using a flag. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2078> - -2021-03-14 16:11:12 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11decoder: Refactor device open step and negotiation - * Remove redundant method arguments - * Don't allocate staging texture if downstream supports d3d11 memory - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2079> - -2021-03-14 15:08:01 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11decoder: Move profile GUID handling into decoder object - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2079> - -2021-03-14 14:26:17 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - d3d11decoder: Get rid of private struct - Completely hide member variables - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2079> - -2021-03-14 12:50:21 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - Revert "d3d11vp9dec: Add support for internal frame resizing" - This reverts commit 58a4c33a0e4f4e5415d8578166716e0d65c0c27e - We should use ID3D11VideoProcessor instead of shader - to avoid copy. We need to revisit this topic later - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2079> - -2021-03-13 22:47:55 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11device.c: - * gst-libs/gst/d3d11/gstd3d11device.h: - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11deinterlace.cpp: - * sys/d3d11/gstd3d11videoprocessor.cpp: - d3d11device: Hold ID3D11VideoDevice and ID3D11VideoContext object - ... instead of QueryInterface-ing per elements. Note that - ID3D11VideoDevice and ID3D11VideoContext objects might not be available - if device doesn't support video interface. - So GstD3D11Device object will create those objects only when requested. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2079> - -2021-03-14 13:01:37 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11desktopdup.cpp: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window_corewindow.cpp: - * sys/d3d11/gstd3d11window_dummy.cpp: - * sys/d3d11/gstd3d11window_swapchainpanel.cpp: - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11: Run gst-indent for all C++ code - Since all d3d11 plugin implementation code are C++, we need to - run gst-indent manually. This is preparation for later - "gst-indent sys/d3d11/*.cpp" run. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2077> - -2021-03-13 17:40:57 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11basefilter.cpp: - * sys/d3d11/gstd3d11colorconverter.h: - * sys/d3d11/gstd3d11compositor.cpp: - * sys/d3d11/gstd3d11compositorbin.cpp: - * sys/d3d11/gstd3d11convert.cpp: - * sys/d3d11/gstd3d11convert.h: - * sys/d3d11/gstd3d11converter.cpp: - * sys/d3d11/gstd3d11converter.h: - * sys/d3d11/gstd3d11decoder.cpp: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11deinterlace.cpp: - * sys/d3d11/gstd3d11desktopdup.cpp: - * sys/d3d11/gstd3d11desktopdupsrc.cpp: - * sys/d3d11/gstd3d11download.cpp: - * sys/d3d11/gstd3d11h264dec.cpp: - * sys/d3d11/gstd3d11h265dec.cpp: - * sys/d3d11/gstd3d11mpeg2dec.cpp: - * sys/d3d11/gstd3d11overlaycompositor.cpp: - * sys/d3d11/gstd3d11pluginutils.cpp: - * sys/d3d11/gstd3d11pluginutils.h: - * sys/d3d11/gstd3d11shader.cpp: - * sys/d3d11/gstd3d11upload.cpp: - * sys/d3d11/gstd3d11videoprocessor.cpp: - * sys/d3d11/gstd3d11videoprocessor.h: - * sys/d3d11/gstd3d11videosink.cpp: - * sys/d3d11/gstd3d11videosinkbin.cpp: - * sys/d3d11/gstd3d11vp8dec.cpp: - * sys/d3d11/gstd3d11vp9dec.cpp: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - * sys/d3d11/gstd3d11window_dummy.cpp: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Port to C++ - Direct3D11 objects are COM, and most COM C APIs are verbose - (C++ is a little better). So, by using C++ APIs, we can make code - shorter and more readable. - Moreover, "ComPtr" helper class (which is C++ only) can be - utilized, that is very helpful for avoiding error-prone COM refcounting - issue/leak. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2077> - -2021-03-12 12:36:52 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * tests/examples/va/multiple-vpp.c: - va: example: multiple-vpp: test direction change - If the driver supports it (iHD, so far) and the parameter -d is set, - the direction of the video will be changed randomly. - In the code you can select, at compilation time, if the direction - change is done by element's property or by pipeline events. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2074> - -2021-03-11 18:53:09 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: postproc: update passthrough and reconfigure pads - Added helper function _update_passthrough() which will define and set - the pass-through mode of the filter, and it'll either reconfigure both - pads or it will just mark the src pad for renegotiation or nothing at - all. - There are cases where both pads have to be reconfigured (direction - changed, for example), other when just src pad has to (filters - updated) or none (changing to ready state). - The requirement of renegotiation depends on the need to enable/disable - its VA buffer pools. - This patch sets pass-through mode by default, so the buffer pools - aren't allocated if no filtering/direction operations are defined, - which is the correct behavior. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2074> - -2021-02-25 14:09:50 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/zxing/gstzxing.cpp: - * ext/zxing/meson.build: - * tests/check/elements/zxing.c: - zxing: update to support version 1.1.1 - Support new API in 1.1.1 - Update the supported input video format. - Update tests to use parse_launch - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2037> - -2021-03-10 13:10:28 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: do not clip the frame - If the current buffer is delta unit such as P or B - frame, the buffer should not be clipped and need to - let the decoder handle the segment boundary situation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2070> - -2021-03-11 02:36:28 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11device.c: - d3d11device: Fix wrong printf formatting - Add missing '%' there - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2069> - -2021-02-20 11:36:42 +0000 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder-private.h: - * gst-libs/gst/transcoder/gsttranscoder-signal-adapter.c: - * gst-libs/gst/transcoder/gsttranscoder.c: - * gst-libs/gst/transcoder/gsttranscoder.h: - transcoder: Add state-changed signal - Similar to GstPlayer, a new signal for state tracking is now emitted at runtime, - as a commodity for applications which then don't need to monitor the pipeline - GstBus for state changes anymore. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2028> - -2020-12-07 10:47:30 +0000 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/play/gstplay-signal-adapter.c: - * gst-libs/gst/player/gstplayer-media-info-private.h: - * gst-libs/gst/player/gstplayer-media-info.c: - * gst-libs/gst/player/gstplayer-wrapped-video-renderer-private.h: - * gst-libs/gst/player/gstplayer-wrapped-video-renderer.c: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/meson.build: - player: Rewrite as GstPlay wrapper - For the time being the GstPlayer library remains as a wrapper for GstPlay, in - order to keep existing applications working and give them time to port to - GstPlay. GstPlayer will remain in -bad for a couple cycles and the plan for - GstPlay is to move it to -base before 1.20. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2061> - -2020-12-07 09:56:26 +0000 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/play/gstplay.c: - play: Flush API bus before exiting main loop - Otherwise the bus might attempt to dispatch queued messages after the thread - ended, causing runtime warnings. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2061> - -2020-11-29 18:55:48 +0000 Philippe Normand <philn@igalia.com> - - * tests/check/libs/play.c: - * tests/check/meson.build: - play: tests: Switch user-agent test to a real HTTP server - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2061> - -2020-11-14 10:56:51 +0000 Philippe Normand <philn@igalia.com> - - * meson_options.txt: - * tests/check/libs/play.c: - * tests/check/meson.build: - play: tests: Refactor to use new Message bus API - Instead of relying on an extra GMainLoop, the messages are poped from the player - bus and handled synchronously. This should avoid flaky behaviors. - Fixes #608 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2061> - -2020-11-14 10:47:53 +0000 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/play/gstplay.c: - play: Plug media_info leak - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2061> - -2020-04-28 21:09:40 +0200 Stephan Hesse <stephan@emliri.com> - - * gst-libs/gst/play/gstplay.c: - play: Rename internal buffering field to buffering_percent - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2061> - -2019-11-02 16:14:13 +0100 Stephan Hesse <stephan@emliri.com> - - * docs/libs/play/index.md: - * docs/libs/play/sitemap.txt: - * docs/meson.build: - * gst-libs/gst/meson.build: - * gst-libs/gst/play/gstplay-media-info-private.h: - * gst-libs/gst/play/gstplay-media-info.c: - * gst-libs/gst/play/gstplay-media-info.h: - * gst-libs/gst/play/gstplay-message-private.h: - * gst-libs/gst/play/gstplay-signal-adapter.c: - * gst-libs/gst/play/gstplay-signal-adapter.h: - * gst-libs/gst/play/gstplay-types.h: - * gst-libs/gst/play/gstplay-video-overlay-video-renderer.c: - * gst-libs/gst/play/gstplay-video-overlay-video-renderer.h: - * gst-libs/gst/play/gstplay-video-renderer-private.h: - * gst-libs/gst/play/gstplay-video-renderer.c: - * gst-libs/gst/play/gstplay-video-renderer.h: - * gst-libs/gst/play/gstplay-visualization.c: - * gst-libs/gst/play/gstplay-visualization.h: - * gst-libs/gst/play/gstplay.c: - * gst-libs/gst/play/gstplay.h: - * gst-libs/gst/play/meson.build: - * gst-libs/gst/play/play-prelude.h: - * gst-libs/gst/play/play.h: - play: Introducing the new playback library - This aims to be a replacement for the GstPlayer library. In GstPlay, notifications are - sent as application messages through a dedicated GstBus. The GMainContext-based - signal dispatcher was replaced by a GObject signal adapter, now relying on the - bus to emit its signals. The signal dispatcher is now optional and fully - decoupled from the GstPlay object. - Co-authored with: Philippe Normand <philn@igalia.com> - Fixes #394 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2061> - -2021-03-09 13:00:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - avwait: Don't post messages with the mutex locked - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2063> - -2021-03-01 20:53:53 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * tests/check/elements/webrtcbin.c: - webrtc: don't generate duplicate rtx payloads when bundle-policy is set - It was possible to generate a SDP that had an RTX payload type - that matched one of the media payload types when providing caps via - codec_preferences without any sink pads. - Fixes - m=video 9 UDP/TLS/RTP/SAVPF 96 - ... - a=rtpmap:96 VP8/90000 - a=rtcp-fb:96 nack pli - a=fmtp:96 apt=96 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2046> - -2021-03-08 14:30:52 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * tests/check/elements/interlace.c: - * tests/check/meson.build: - tests: Add negotiation tests for the interlace elements - Many complicated cases exist. Would be good to have some checks. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2062> - -2021-03-08 20:59:14 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/interlace/gstinterlace.c: - interlace: Discard stored_frame on EOS and PAUSED_TO_READY - Would otherwise leak it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2062> - -2021-03-08 16:16:25 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * docs/plugins/gst_plugins_cache.json: - * gst/interlace/gstinterlace.c: - interlace: Specify interlace-modes in the sink pad template - Especially specify the field-order in the interleaved mode. Otherwise it - might cause the negotiation to fail, because - GST_PAD_SET_ACCEPT_INTERSECT is not set on the sinkpad, and the - field-order is missing in the sink template but can be present in the - outside caps. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2062> - -2021-03-07 16:47:07 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh264dec.c: - nvh264sldec: Reopen decoder object if larger DPB size is required - Equivalent to the d3d11h264dec fix - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1839 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2059> - -2021-03-03 01:23:20 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconverter.c: - d3d11: Fix an HLSL compiler warning - warning X3578: Output value 'main' is not completely initialized - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2052> - -2021-01-27 10:55:13 +0800 Bing Song <bing.song@nxp.com> - - * tools/gst-transcoder.c: - transcoder: handle SIGINT and SIGHUP - Handle SIGINT and SIGHUP in transcoder. Or the output file maybe corrupt. - Fixes #1507 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1987> - -2021-03-04 17:42:28 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11h264dec.c: - d3d11h264dec: Keep track of actually configured DPB size - ... instead of the largest we ever seen. - Note that d3d11h264dec element holds previously configured DPB size - for later decoder object re-open decision. - This is to fix below case: - 1) Initial SPS, required DPB size is 6 - - decoder object is opened with DPB size 6 - - max_dpb_size is now 6 - 2) SPS update with resolution change, required DPB size is 1 - - decoder object is re-opened with DPB size 1 - - max_dpb_size should be updated to 1, but it didn't happen (BUG) - 3) SPS update without resolution change, only required DPB size is updated to 6 - - decoder object should be re-opened but didn't happen - because we didn't update max_dpb_size at 2). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2056> - -2021-03-03 16:19:39 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/interlace/gstinterlace.c: - interlace: add more formats, esp 10-bit, 12-bit and 16-bit ones - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2054> - -2021-02-16 11:23:17 +0100 Benjamin Gaignard <benjamin.gaignard@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264: retrieve interlaced information - Lets the decoder knows if the frames are interlaced or not. - Provide this information to the driver while filling reference - pictures fields in slice params structure - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1624> - -2020-11-27 16:00:03 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264: Reduce controls for subsequent slices - Only the SLICE_PARAMS and PRED_WEIGHTS are needed for the second and - following slices. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1624> - -2020-08-14 10:13:09 -0300 Ezequiel Garcia <ezequiel@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264: Implement optional scaling matrix - The new H.264 uAPI requires that all drivers support - scaling matrix only as an option, when a non-flat - scaling matrix is provided in the bitstream headers. - Take advantage of this and avoid passing the scaling - matrix if not needed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1624> - -2020-09-30 14:34:15 -0300 Ezequiel Garcia <ezequiel@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264: Only set SPS control if needed - Given V4L2 controls are cached in V4L2, there is no need - to set them if they don't change. Set the SPS control - only if a new sequence was received by the parser. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1624> - -2020-09-30 14:22:14 -0300 Ezequiel Garcia <ezequiel@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264: Only slice-based need SLICE_PARAMS and PRED_WEIGHTS - Frame-based decoding mode doesn't require SLICE_PARAMS and - PRED_WEIGHTS controls. - Moreover, if the driver doesn't support these two controls, trying - to set them will fail. Fix this by only setting these on - slice-based decoding mode. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1624> - -2020-09-30 14:14:41 -0300 Ezequiel Garcia <ezequiel@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2codecs: h264: Add API checks - Check that the V4L2 H264 controls' sizes match - our expectation. If not, then probably there's an API - mismatch which will cause errors or decoding corruption. - Also, print a warning if the kernel version is too old. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1624> - -2020-09-30 10:40:51 -0300 Ezequiel Garcia <ezequiel@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/linux/h264-ctrls.h: - * sys/v4l2codecs/linux/media.h: - * sys/v4l2codecs/linux/types-compat.h: - * sys/v4l2codecs/linux/v4l2-common.h: - * sys/v4l2codecs/linux/v4l2-controls.h: - * sys/v4l2codecs/linux/videodev2.h: - * sys/v4l2codecs/plugin.c: - v4l2codecs: h264: Update to the new uAPI - Starting from Linux v5.11, the V4L2 stateless H.264 uAPI - is updated and stable. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1624> - -2020-09-30 10:33:59 -0300 Ezequiel Garcia <ezequiel@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264: Set the scaling matrix present flag unconditionally - We are currently always setting and passing a scaling matrix, - so need to set this flag accordingly. Passing a scaling matrix - optionally will be implemented in follow-up commit. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1624> - -2021-03-02 12:46:24 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: postproc: mention the possibility of color balance - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2050> - -2021-03-02 12:46:06 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - docs: plugins update VA elements - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2050> - -2021-03-02 12:44:12 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavp8dec.c: - * sys/va/gstvavp9dec.c: - va: vp8dec, vp9dec: only set NV12 color format for documentation - Mention in documentation only the most used output format in VA-API. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2050> - -2021-03-02 22:01:26 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - d3d11convert: Forward colorimetry and chroma-site from upstream - Adopt the improvement of https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1033 - into d3d11. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2051> - -2021-03-02 17:47:03 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - d3d11convert: Add support for border drawing - ... and fix wrong resizing when downstream requested PAR value - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2051> - -2021-03-02 21:35:00 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - d3d11convert: Prefer video processor over shader - ... if video processor was used previously. Otherwise, switching - between video processor and shader would result in inconsistent - output image quality. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2051> - -2021-03-02 18:07:36 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videoprocessor.c: - d3d11videoprocessor: Disable auto processing mode explicitly - Don't allow auto processing (e.g., denoising), as it might result - in unexpected output. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2051> - -2021-03-02 21:10:24 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11memory.c: - d3d11memory: Fix for wrong texture_array_size returns - Fix mismatched return values - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2051> - -2021-03-02 21:13:18 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Add trace log for DPB pool size debugging - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2051> - -2021-03-02 20:45:22 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Always use render-target bind flag for downstream pool - To convert decoded texture into other format, downstream would use - video processor instead of shader. In order for downstream to - be able to use video processor even if we copied decoded texture - into downstream pool, we should set this bind flag. Otherwise, - downstream would keep switching video processor and shader - to convert format which would result in inconsistent image quality. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2051> - -2021-03-02 20:37:04 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11videoprocessor.c: - * sys/d3d11/gstd3d11videoprocessor.h: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window_dummy.cpp: - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11: Fix wrong preprocessing blocks - Missed in https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/464 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2051> - -2021-03-01 13:44:09 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvavpp.c: - va: vpp: fix a wrong caps logic in vpp_transform_caps(). - The current gst_va_vpp_transform_caps return such as: - video/x-raw(memory:VAMemory), width=(int) 16, 16384 , height=(int) 16, 16384 , - interlace-mode=(string)progressive, format=(string){ NV12, I420, YV12, YUY2, RGBA, - BGRA, P010_10LE, ARGB, ABGR, VUYA }; video/x-raw(memory:DMABuf), width=(int) 16, - 16384 , height=(int) 16, 16384 , interlace-mode=(string)progressive, format=(string) - { NV12, I420, YV12, YUY2, RGBA, BGRA, P010_10LE, ARGB, ABGR, VUYA }; video/x-raw, - width=(int) 16, 16384 , height=(int) 16, 16384 , interlace-mode=(string)progressive, - format=(string){ VUYA, GRAY8, NV12, NV21, YUY2, UYVY, YV12, I420, P010_10LE }; - video/x-raw(memory:VAMemory), width=(int) 1, 2147483647 , height=(int) 1, 2147483647 , - interlace-mode=(string)progressive; video/x-raw(memory:DMABuf), width=(int) 1, 2147483647 , - height=(int) 1, 2147483647 , interlace-mode=(string)progressive; video/x-raw, width=(int) - 1, 2147483647 , height=(int) 1, 2147483647 , interlace-mode=(string)progressive - Which is not correct. It mixes the template caps and the input query caps together. - The correct way should be: clip the template caps with the input caps(remove format - and rangify size). The correct answer should be: - video/x-raw(memory:VAMemory), width=(int) 16, 16384 , height=(int) 16, 16384 , interlace - -mode=(string)progressive, format=(string){ NV12, I420, YV12, YUY2, RGBA, BGRA, P010_10LE, - ARGB, ABGR, VUYA }; video/x-raw(memory:DMABuf), width=(int) 16, 16384 , height=(int) 16, - 16384 , interlace-mode=(string)progressive, format=(string){ NV12, I420, YV12, YUY2, RGBA, - BGRA, P010_10LE, ARGB, ABGR, VUYA }; video/x-raw, width=(int) 16, 16384 , height=(int) 16, - 16384 , interlace-mode=(string)progressive, format=(string){ VUYA, GRAY8, NV12, NV21, YUY2, - UYVY, YV12, I420, P010_10LE } - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2045> - -2021-03-01 16:23:37 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsdemux/mpegtsparse.c: - mpegtsparse: Fix switched DTS/PTS when set-timestamps=false - Fixes 30ee21eae36e7279f63b77167ba1dcf5f70b8e83. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2047> - -2019-08-15 08:25:26 -0700 Ilya Kreymer <ikreymer@gmail.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/gstwebrtcice.h: - * ext/webrtc/icestream.c: - * tests/check/elements/webrtcbin.c: - webrtc ice: Add 'min/max-rtp-port' props for setting RTP port range - default min port == 0, max port == 65535 -- if min port == 0, uses existing random port selection (range ignored) - add 'gathering_started' flag to avoid changing ports after gathering has started - validity checks: min port <= max port enforced, error thrown otherwise - include tests to ensure port range is being utilized (by @hhardy) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/119> - -2021-02-25 11:58:57 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcice.c: - webrtc ice: Only ever request one component, it's always rtcpmux - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/119> - -2021-02-26 15:40:01 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder.c: - transcoder: Add some missing API guards - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2044> - -2021-02-26 15:36:48 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder-signal-adapter.c: - transcoder: Fix potential use of uninitialized variables - gst_structure_get won't touch variables if the field is not present - leading to potential use of initialized vars - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2044> - -2021-02-26 15:31:29 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder-private.h: - * gst-libs/gst/transcoder/gsttranscoder-signal-adapter.c: - * gst-libs/gst/transcoder/gsttranscoder-signal-adapter.h: - * gst-libs/gst/transcoder/gsttranscoder.c: - * gst-libs/gst/transcoder/gsttranscoder.h: - * tools/gst-transcoder.c: - transcoder: Rework the API to create/get SignalAdapter - We can only have 1 single GstTranscoderSignalAdapter object for a - given GstTranscoder object, this enforces that by avoiding to expose - a constructor and instead add a method to GstTranscoder to get the - signal adapter (internally creating it when needed). We can still - cleanly ensure that the signal adapter is running for the requested - GMainContext and return NULL if it is not the case. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2044> - -2021-02-22 16:59:25 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcice.c: - webrtcbin: use regular ice nomination by default - 1. We don't currently deal with an a=ice-options in the SDP which means - we currently violate https://tools.ietf.org/html/rfc5245#section-8.1.1 - which states: "If its peer is using ICE options (present in - an ice-options attribute from the peer) that the agent does not - understand, the agent MUST use a regular nomination algorithm." - 2. The recommendation is default to regular nomination in both RFC5245 - and RFC8445. libnice change for this is - https://gitlab.freedesktop.org/libnice/libnice/-/merge_requests/125 - which requires an API break in libnice. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2031> - -2021-02-24 18:43:07 +0000 Philippe Normand <philn@igalia.com> - - * docs/meson.build: - * gst-libs/gst/transcoder/gsttranscoder.c: - transcoder: Remove un-needed gst_init call - We can safely assume GStreamer is already initialized from here. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1840> - -2020-11-25 22:25:28 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder-message-private.h: - * gst-libs/gst/transcoder/gsttranscoder-signal-adapter.c: - * gst-libs/gst/transcoder/gsttranscoder-signal-adapter.h: - * gst-libs/gst/transcoder/gsttranscoder.c: - * gst-libs/gst/transcoder/gsttranscoder.h: - * gst-libs/gst/transcoder/meson.build: - * tools/gst-transcoder.c: - transcoder: Port to a GstBus API instead - Following the move made by GstPlayer in: - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/35 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1840> - -2020-11-25 22:21:35 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder.c: - * gst-libs/gst/transcoder/gsttranscoder.h: - * gst-libs/gst/transcoder/meson.build: - * gst-libs/gst/transcoder/transcoder-prelude.h: - transcoder: Automatically generate enums GTypes - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1840> - -2020-11-25 22:01:30 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder.h: - transcoder: Port to G_DECLARE - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1840> - -2021-02-26 16:36:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Use correct numerator for 29.97fps - It's not 0.2997fps. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2042> - -2021-02-26 11:39:10 +0100 Edward Hervey <edward@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklinksrc: Use a more accurate capture time - Use the hardware reference clock time when the frame was finished being captured - instead of a time much further down the road. - This improves the stability/accuracy of buffer times. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2040> - -2021-02-24 19:14:42 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: No need of fourcc to create surface. - In commits 430aa327 and a119a940 there are a regression since it is - possible to create surfaces without fourcc, only chroma (rtformat) is - required. - This regression is shown on radeonsi driver with certain color - formats. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2035> - -2021-02-24 13:06:51 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - * sys/va/gstvavpp.c: - * tests/examples/va/meson.build: - * tests/examples/va/multiple-vpp.c: - va: vpp: implement GstColorBalance interface - And modify multiple-vpp example to use it with -r parameter. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2033> - -2021-02-23 17:22:40 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: add controllable and mutable playing to GParamFlags - Add controllable and mutable playgin to common GParamFlags. - Also use this common flags to video-direction - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2033> - -2021-02-24 16:57:06 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkviewconvert.c: - vulkan: Fix elements long name. - Fix vkcoloconvert and vkviewconvert long names. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2034> - -2021-01-12 15:33:49 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/meson.build: - msdk: allow user specify a drm device via an env variable - User may specify the required device via GST_MSDK_DRM_DEVICE - Example: - GST_MSDK_DRM_DEVICE=/dev/dri/card0 gst-launch-1.0 videotestsrc ! msdkh264enc - ! fakesink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1953> - -2021-01-19 15:36:29 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaav1dec.c: - * sys/va/gstvaav1dec.h: - * sys/va/gstvabasedec.h: - * sys/va/gstvaprofile.c: - * sys/va/meson.build: - * sys/va/plugin.c: - VA: Add the vaav1dec element as the av1 decoder. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1636> - -2021-01-19 15:17:58 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvaallocator.h: - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - VA: Add the aux surface for gst buffer used by decoder. - The AV1 codec needs to support the film grain feature. When the film - grain feature is enabled, we need two surfaces as the output of the - decoded picture, one without film grain effect and the other one with - it. The first one acts as the reference and is needed for later pictures' - reconstruction, and the second one is the real display output. - So we need to attach another aux surface to the gst buffer/mem and make - that aux surface as the target of vaBeginPicture. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1636> - -2021-01-19 15:07:38 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - VA: Add a helper function of decoder_add_slice_buffer_with_n_params. - Some codecs such as AV1 needs several parameters associated with one - slice. It may have multi tiles within one slice and each tile needs - its description parameter. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1636> - -2021-01-19 14:59:45 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gstav1decoder.c: - * gst-libs/gst/codecs/gstav1decoder.h: - * gst-libs/gst/codecs/gstav1picture.c: - * gst-libs/gst/codecs/gstav1picture.h: - * gst-libs/gst/codecs/meson.build: - codecs: AV1decoder: Add the AV1 decoder base class. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1636> - -2021-02-23 13:47:29 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaallocator.c: - va: allocator: replace assert with error log in va alloc. - We should print error log rather than assert when the forcc or - the rt_format of va allocator is unrecognized. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1636> - -2021-02-21 17:38:38 +0900 Seungha Yang <seungha@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/d3d11/gstd3d11compositor.c: - * sys/d3d11/gstd3d11compositorbin.c: - * sys/d3d11/gstd3d11deinterlace.cpp: - * sys/d3d11/gstd3d11desktopdupsrc.c: - * sys/d3d11/gstd3d11download.c: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11mpeg2dec.c: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosinkbin.c: - * sys/d3d11/gstd3d11vp8dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - * sys/d3d11/plugin.c: - d3d11: Documentation update - * Update class metadata - * for wrapper bin elements to be distinguishable from internal element. - * D3D11 -> Direct3D11 for consistency - * Add missing Since mark everywhere - * Update plugin cache - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2029> - -2021-02-21 20:38:37 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconvert.h: - d3d11: Reorganize class hierarchy of convert elements - AS-IS: - D3D11Convert class is baseclass of D3D11ColorConvert and D3D11Scale - * GstD3D11Convert - |_ GstD3D11ColorConvert - |_ GstD3D11Scale - TO-BE: - Introducing a new base class for color conversion and/or rescale elements - * GstD3D11BaseConvert - |_ GstD3D11Convert - |_ GstD3D11ColorConvert - |_ GstD3D11Scale - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2029> - -2021-02-21 17:35:40 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11deinterlace.cpp: - d3d11deinterlace: Add missing system memory caps features on templates - This element can support system memory - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2029> - -2021-02-18 09:53:09 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - * sys/va/gstvavpp.c: - va: filter, vpp: process colorimetry - A new filter method were added: gst_va_filter_set_formats(). In this - way the input & output GstVideoInfo are processed only once per stream - negotiation, and not per frame. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2023> - -2021-02-18 05:58:25 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: check if filter is open on set_orientation() - Because the method requires pipeline_caps is filled. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2023> - -2021-02-17 18:56:29 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: human readable background color - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2023> - -2021-02-17 18:55:14 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: fail immediately if vaBeginPicture() fails - There's no need to try vaRenderPicture() if vaBeginPicture() failed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2023> - -2021-02-17 18:30:10 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: destroy pipeline buffer after destroying filters - In 6ae24948 the pipeline buffer destroy were removing assuming it - wasn't required. Nonetheless, debugging the code it looks like a - buffer leak in iHD driver since the ID of the buffer kept increasing. - The difference now is that first the filter buffers are destroy first - and later the pipeline buffer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2023> - -2021-02-19 14:27:39 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvavpp.c: - va: vpp: Add raw buffer copy when needed. - Just like the decoder, the vapostproc also needs to copy the output - buffer to raw buffer if downstream elements only supports raw caps - and does not support the video meta. - The pipeline like: - gst-launch-1.0 filesrc location=xxxx ! h264parse ! vah264dec ! \ - vapostproc ! capsfilter caps=video/x-raw,width=55,height=128 ! \ - filesink location=xxx - needs this logic to dump the data correctly. - fixes: #1523 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2026> - -2021-02-19 00:03:00 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/sdp/gstsdpsrc.c: - sdpsrc: fix double free if sdp is provided as string via the property - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1532 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2025> - -2021-02-18 21:38:37 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2device.c: - wasapi2device: Make wasapi2 device distinguishable from wasapi device - Both wasapi2 and wasapi plugins use WASAPI API. So "device.api=wasapi" - would make sense for the wasapi2 plugin as well. But people would be - confused by the identical "device.api=wasapi" property if intended - plugin is wasapi, not wasapi2. This change will make them distinguishable - by using "device.api" device property. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2024> - -2021-01-13 00:27:40 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/meson.build: - wasapi2: Always build if Windows 10 SDK is available - Add support for building wasapi2 plugin if Windows 10 SDK is - available on system - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1951> - -2021-02-08 12:24:58 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dtls/gstdtlssrtpbin.c: - * ext/dtls/gstdtlssrtpdec.c: - * ext/dtls/gstdtlssrtpenc.c: - dtls: use GST_WARNING instead of g_warning - No need a g_warning which is failing always - with gst-inspect -a - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2010> - -2021-01-28 12:28:03 +0100 Michael Olbrich <m.olbrich@pengutronix.de> - - * gst/videoparsers/gsth264parse.c: - * tests/check/elements/h264parse.c: - h264parse: don't invalidate the last PPS when parsing a new SPS - When a SPS is received then any previous PPS remains valid. So don't clear - the PPS flag from the parser state. - This is important because there are encoders that don't generated a PPS after - every SPS. - Closes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/571 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2019> - -2021-02-17 15:15:09 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/videoparsers/gsth265parse.c: - h265parse: Detect height change on field-based interlaced files - The first time update_src_caps is called, there's no frame parsed yet, - therefore we don't know whether the file has alternate-field interlacing - mode. If we run it again after we have a frame, it might be that now we - have the SEI pic_struct parsed, and therefore we know that it's - field-based interlaced, and therefore the height must be multiplied by - two. Earlier on this was not detected as a change. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2022> - -2020-09-19 21:39:06 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * tests/examples/va/meson.build: - * tests/examples/va/multiple-vpp.c: - va: add multiple-vpp example - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2015> - -2021-02-15 15:54:11 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: set workaround only for i965 driver - In commit 117453b9 a i965 driver workaround was added for all drivers, because - at that time we didn't have a driver implementation API. - Now there's one. This patch set the workaround only for the i965 driver. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2021> - -2021-02-17 13:46:03 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix FPS/duration for interlaced files - There can be h265 files with frame-based, not field-based, interlacing. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2020> - -2021-02-12 18:43:00 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: MT-safe queue & dequeue dmabuf-based memories - One problem that va dmabuf allocator had is when preparing a buffer from - dmabuf memories in the allocator pool, specially when a buffer is composed by - several memories. This memories have to be by certain number and in certain - order. - This patch stores the number of memories and their address in order when a - dmabuf-based buffer is created and when preparing a buffer, it is reconstructed - with this info. - Finally, instead of pushing the memories as soon as they are unrefed, they are - hold until GstVaBufferSurface's ref_mems_count reaches zero (all the memories - related with that buffer/surface are unrefed). Until that happen, all the - memories are pushed back into the queue, locked, assuring that all the memories - related with a single buffer (with the same surface) remain contiguous, so the - buffer reconstruction is assured. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2013> - -2021-02-15 15:34:56 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvapool.c: - va: pool, allocator: free memories at bufferpool's stop() - This patch frees the memories in the allocator's pool after the bufferpool frees - all its buffers, sync'ing them at stop() vmethod. - By doing it, the current logic in flush_start() is not valid, so the vmethod is removed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2013> - -2021-02-12 15:40:33 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvaallocator.h: - va: allocator: remove unused public functions - Deleted the public functions: - gst_va_dmabuf_allocator_wait_for_memory() - gst_va_allocator_wait_for_memory() - And all the support for wait, cond in allocator's pool. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2013> - -2021-02-12 13:26:24 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvapool.c: - va: pool: simplify the logic - Instead of removing memories from buffers at reset_buffer()/release_buffer() the - bufferpool operation is kept as originally designed, still the allocator pool is - used too. Thus, this patch restores the buffer size configuration while removing - release_buffer(), reset_buffer() and acquire_buffer() vmethods overloads. - Then, when the bufferpool base class decides to discard a buffer, the VA - surface-based memory is returned to the allocator pool when its last reference - is freed, and later reused if a new buffer is allocated again. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2013> - -2021-02-07 16:12:56 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvaallocator.h: - * sys/va/gstvapool.c: - va: pool: use allocator pool at alloc() - Check if the allocator pool has memories available before creating a - new one, but only iif pool is not starting. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2013> - -2021-02-08 12:25:07 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: log buffer at dmabuf setup and prepare - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2013> - -2021-01-22 00:10:28 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11deinterlace.cpp: - * sys/d3d11/gstd3d11deinterlace.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Add support for deinterlacing by using ID3D11VideoProcessor interface - Add a new element d3d11deinterlace to support deinterlacing. - Similar to d3d11videosink and d3d11compositor, this element is - a wrapper bin of set of child elements including helpful - conversion elements (upload/download and color convert) - to make this element configurable between non-d3d11 elements. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2016> - -2021-02-14 06:23:55 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11format.c: - * gst-libs/gst/d3d11/gstd3d11format.h: - d3d11: Add a method for conversion from DXGI format to GstVideoFormat - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2016> - -2021-01-22 03:26:29 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix timestamping of interlaced fields in output - Instead of relying on GstBaseParse default behaviour of computing - the duration of a parsed buffer based on the framerate passed - to gst_base_parse_set_framerate(), we instead compute the duration - ourselves, as we have more information available. - In particular, this means we now output buffers with a duration - that matches that of raw interlaced buffers when each field is - output in a separate buffer. - This fixes DTS interpolation performed by GstBaseParse, as the - previous behaviour of outputting each field with the duration of - a full frame was messing up the base class calculations. - When not enough information is available, h264parse simply falls - back to calculating the duration based on the framerate and hope - for the best as was the case previously. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1973> - -2021-02-14 21:01:32 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11mpeg2dec.c: - * sys/d3d11/gstd3d11vp8dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Take account of min buffers of downstream buffer pool - Since our decoder DPB texture pool cannot be grown once it's - configured, we should pre-allocate sufficient number of textures - for zero-copy playback (but not too many). - The "min buffers" allocation query parameter can be a hint for - the number of required textures in addition to DPB size. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2017> - -2020-10-29 10:54:45 -0300 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Add support for main and high profiles - Those are supported (to a certain extent) so we should not limit - ourself to baseline - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1789> - -2021-02-11 16:04:12 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - codecs: mpeg2decoder: Move frame_unref to handle_frame. - In the current code, we call frame_unref only when the frame is - outputted. This is OK for normal playback, but when seek happens, - the frames stored in DPB is not outputted and causes some memory - leak. - The correct way is that we should call frame_unref every time we - finish the handle_frame(), which is also the behaviour of H264/H265 - decoder. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2014> - -2021-02-07 02:26:02 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11h265dec.c: - d3d11h265dec: Add support for interlaced stream - Note that we have no D3D11 deinterlace element yet. - If downstream is not support format:Interlaced caps feature including all - D3D11 the other elements, aspect-ratio will be adjusted as an - alternative approach. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2008> - -2021-02-07 00:21:06 +0900 Seungha Yang <seungha@centricular.com> - - codecs: h265decoder: Add support for interlaced stream - * Invoke GstH265DecoderClass::new_sequence() method per interlaced - stream status update so that subclass can update caps. - * Parse picture timing SEI and set buffer flags on GstH265Picture - object. Subclass can refer to it like that of our h264decoder - implementation. - * Remove pointless GstH265PictureField enum - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2008> - -2021-02-10 00:59:05 +0900 Seungha Yang <seungha@centricular.com> - - * sys/va/gstvah265dec.c: - vah265dec: Don't need to pass picture structure to VA - This code came from gstvaapidecoder_h265 implementation - but picture structure is always GST_VAAPI_PICTURE_STRUCTURE_FRAME. - Moreover, in theory, VA doesn't need to know picture structure for - decoding HEVC stream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2008> - -2021-02-06 22:02:59 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh265dec.c: - nvh265sldec: Remove pointless field picture parameter setup - HEVC has no decoding flow for interlaced, field picture referencing. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2008> - -2021-02-08 00:07:26 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvavpp.c: - va: vpp: Make the global lock only to DMA buffer's import. - The normal gst_va_buffer_get_surface does not need a global lock. - Too big lock may make the performance lower. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2009> - -2021-02-05 14:05:53 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: log dmabuf and surface at pool push or pop - In order to keep track of the dmabuf fds and surfaces numbers log messages are - added at memory_release() (queue push) and prepare_buffer() (queue pop). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1999> - -2021-02-02 06:43:27 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah265dec.c: - va: h265dec: fix HVC1 stream format name - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1999> - -2021-02-01 23:19:27 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvabasedec.c: - va: basedec: refactor context query - Context query is handled either by source and sink queries. This patch - factors-out its handling in a common utility function. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1999> - -2020-12-21 18:10:44 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: use a common GParamFlags definition - Instead of repeating the same code along gst_va_filter_install_properties() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1999> - -2021-01-22 16:54:05 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: h264dec: remove spurious if validation - The first if checks for caps, thus else doesn't need to recheck for the - opposite. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1999> - -2021-02-05 18:13:32 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: vpp: fix frame copy - There were two problems with frame copy: - 1. The input video info are from the format color, not form the allocated VA - surface, it's needed to update the sink video info according with the - allocator's data. - 2. The parameters of `gst_video_frame_copy()` were backwards. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2007> - -2021-02-02 18:05:46 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: vpp: request video and alignment metas for src pool - This is for the pool used when importing raw video frames to surfaces. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2007> - -2021-02-04 16:43:02 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: vpp: transform_size() must return FALSE - transform_size() basetransform vmethod is used when there's no output buffer - pool and allocates a system memory buffer. With VA this cannot be allowed, since - it needs VASurfaces to process. - Thus transform_size() is not required, but to play safe let's return FALSE. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2007> - -2021-02-02 16:22:34 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: vpp: copy input buffer flags and timestamps - Strictly speaking right now it's not required do this copy, but let's play safe - and assume in the future this metadata might be required while doing the - postprocessing. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2007> - -2021-02-01 23:55:11 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: vpp: handle context query - Previously vapostproc didn't communicate its context through query mechanism, - which is required for context sharing. This patch completes this missing bits. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2007> - -2021-02-01 23:50:12 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: vpp: don't copy color, size or orientation video metas - If they are processed by the element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2007> - -2021-02-05 16:46:00 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: vpp: don't break passthrough if no color balance required - The function `_add_filter_cb_buffer()` returned TRUE if no color balance filter - are required, but that's is wrong, since it will break the passthrough. This - patch return FALSE which is the correct value for the situation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2007> - -2021-01-15 14:07:19 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: vpp: use gst_clear_caps() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2007> - -2021-02-02 16:23:28 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: don't destroy pipeline buffer - This was only required by i915 driver before libva-2.0 because it didn't - conform. - Also changes the way _destroy_filters() is called, now inside a locked block, so - it must not lock in it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2006> - -2021-02-01 16:57:49 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: lock member variables access - While gst_va_filter_open() and gst_va_filter_close() remain non-thread-safe, the - other API calls that modify member variables are locked. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2005> - -2021-02-03 23:39:00 +0100 Jakub Adam <jakub.adam@collabora.com> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsrc.c: - srt: preserve ABI compatibility - Reintroduce socket descriptor parameter removed in 327ad84e to - "caller-added" and "caller-removed" signals, just set it always to zero. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2004> - -2021-02-04 03:42:05 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11mpeg2dec.c: - * sys/d3d11/gstd3d11vp8dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Fix deadlock when DPB texture pool is full - Unlike other stateless decoder implementations (e.g., VA), - our DPB pool cannot be grown since we are using - texture array (pre-allocated, fixed-size d3d11 texture pool). - So, if there's no more available texture to use, - there's no way other than copying it to downstream's - d3d11 buffer pool. Otherwise deadlock will happen. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2003> - -2021-02-02 19:10:13 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11memory.c: - * gst-libs/gst/d3d11/gstd3d11memory.h: - d3d11memory: Add a method for querying texture array size - ... and the number of textures in use. - Direct3D11 texture array is usually used for decoder DPB pool, - and d3d11 decoder elements might want to know - whether there's available texture resource or not. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2003> - -2020-12-14 20:34:15 +0100 Jakub Adam <jakub.adam@collabora.com> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsrc.c: - srt: don't pass SRT socket ID to "caller-added,removed" signals - The caller's IP and port is enough for unique identification. Don't leak - the socket handle since using it in unadvised libsrt calls from the - application could break the SRT element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1772> - -2020-11-04 17:14:03 +0100 Jakub Adam <jakub.adam@collabora.com> - - * ext/srt/gstsrtobject.c: - srtobject: add caller address to stats structure - In listener mode, gst_stats() returns an independent set of - statistics for every connected caller. Having the caller's IP and port - present in each structure allows to correlate the statistics with a - particular caller that has been announced by "caller-added" signal. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1772> - -2021-02-03 14:27:14 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: Support for alternate-field interlacing - Also don't set interlacing information on the caps, see #1313 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1996> - -2021-02-02 18:25:31 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - h264/h265parse: Add VideoTimeCodeMeta to the outgoing buffer - The parsers attempted to add the meta to the incoming buffer, which - might not be the outgoing buffer or may not have been writable yet. - To fix this, call `gst_buffer_make_writable` earlier and make sure to - use the `parse_buffer` to add the meta. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1521 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2002> - -2021-01-27 15:32:26 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/va/gstvadevice.c: - va: sort the device queue - If so, the elements will be registered per drm node in order of - renderD128, renderD129, ... etc, an element with constant name will be - registered on renderD128 on a hardware with multiple drm nodes. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1988> - -2021-02-02 04:33:09 +0900 Seungha Yang <seungha@centricular.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2decoder: Small documentation fix - Fixing documentation even though those methods are v4l2codecs plugin internals - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2000> - -2021-01-29 09:43:07 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2codecs: h264: Enable 1 frame delay on non-live - When doing non-live decoding, enable 1 frame of delay. This will ensure - that we queue the next decoding job before we actually wait for the previous - to complete. This improves throughput notably on RK3399. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1881> - -2021-01-29 09:41:22 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2codecs: Add support for render delay - This add support for render delay in the decoder helper. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1881> - -2021-01-27 15:55:43 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2codecs: Coding style fix - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1881> - -2021-01-27 15:53:49 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2codecs: Poll inside set_done() - This removes the need for the gst_v4l2_decoder_is_done() helper and - simplify slightly the subclass code. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1881> - -2020-12-18 16:36:16 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2codecs: Make request structure ref-counted - This adds a non-thread safe refcount to the GstV4l2Request. This will - allow holding on more then one request in order to implement render - delay. This is made non-thread safe for speed as we know this will all - happen on the same streaming thread. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1881> - -2020-12-14 17:07:01 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2codecs: Rework handling of queues and pending requests - Starting from this patch, all queue and dequeue operation happening - on V4L2 is now abstracted with the request. Buffers are dequeued - automatically when pending requests are marked done and only 1 in-flight - request is now used. - Along with fixing issues with request not being reused with slice - decoders, this change reduces the memory footprint by allocating only - two bitstream buffers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1881> - -2021-01-29 02:09:05 -0500 Staz M <staz@staz.io> - - * sys/decklink/gstdecklink.cpp: - decklink: Fixed decklinkvideosink auto format detection - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1994> - -2021-01-28 04:03:37 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh264dec.c: - nvh264sldec: Add support for output-delay to improve throughput performance - NVDEC API support delaying getting decoded output, and recommended - delay by API document is 4 frames. In case that throughput is - more critical factor than latency, we can prefer delayed output - as recommended by NVIDIA. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1925> - -2020-12-29 19:54:35 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - codecs: h264decoder: Add support for output delay - Some decoding APIs support delayed output or a command for decoding - a frame doesn't need to be sequential to corresponding command for - getting decoded frame. For instance, subclass might be able to - request decoding for multiple frames and then get for one (oldest) - decoded frame or so. - If aforementioned case is supported by specific decoding API, - delayed output might show better throughput performance. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1925> - -2021-01-27 17:09:07 -0500 Arun Raghavan <arun@asymptotic.io> - - * ext/ldac/gstldacenc.h: - * ext/ldac/meson.build: - ldac: Use pkg-config instead of raw lib/header search - The ldacBT library includes pkg-config files for the standard and ABR - libraries, so let's just use that instead of doing a header/library - search. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1990> - -2021-01-28 02:02:28 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Don't limit max buffers of buffer pool - In some case, especially reverse playback, we would need more than - two buffers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1989> - -2021-01-27 04:34:13 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11shader.c: - d3d11: Suppress some warning debug messages - * Don't warn for live object, since ID3D11Debug itself seems to be - holding refcount of ID3D11Device at the moment we called - ID3D11Debug::ReportLiveDeviceObjects(). It would report live object - always - * Device might not be able to support some formats (e.g., P010) - especially in case of WARP device. We don't need to warn about that. - * gst_d3d11_device_new() can be used for device enumeration. Don't warn - even if we cannot create D3D11 device with given adapter index therefore. - * Don't warn for HLSL compiler warning. It's just noise and - should not be critical thing at all - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1986> - -2020-12-11 05:23:20 +0900 Seungha Yang <seungha@centricular.com> - - * tests/examples/d3d11videosink/d3d11device.cpp: - * tests/examples/d3d11videosink/d3d11device.h: - * tests/examples/d3d11videosink/d3d11videosink-shared-texture-d3d9ex.cpp: - * tests/examples/d3d11videosink/d3d11videosink-shared-texture.cpp: - * tests/examples/d3d11videosink/meson.build: - examples: Add d3d11videosink examples for shared-texture use cases - Add two examples to demonstrate "draw-on-shared-texture" use cases. - d3d11videosink will draw application's own texture without copy - by using: - - Enable "draw-on-shared-texture" property - - make use of "begin-draw" and "draw" signals - And then, application will render the shared application's texture - to swapchain's backbuffer by using - 1) Direct3D11 APIs - 2) Or, Direct3D9Ex + interop APIs - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1873> - -2020-12-23 23:49:12 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosink.h: - * sys/d3d11/gstd3d11videosinkbin.c: - * sys/d3d11/gstd3d11videosinkbin.h: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - * sys/d3d11/gstd3d11window_dummy.cpp: - * sys/d3d11/gstd3d11window_dummy.h: - * sys/d3d11/meson.build: - d3d11videosink: Add support for drawing on application's own texture - Add a way to support drawing on application's texture instead of - usual window handle. - To make use of this new feature, application should follow below step. - 1) Enable this feature by using "draw-on-shared-texture" property - 2) Watch "begin-draw" signal - 3) On "begin-draw" signal handler, application can request drawing - by using "draw" signal action. Note that "draw" signal action - should be happen before "begin-draw" signal handler is returned - NOTE 1) For texture sharing, creating a texture with - D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX flag is strongly recommend - if possible because we cannot ensure sync a texture - which was created with D3D11_RESOURCE_MISC_SHARED - and it would cause glitch with ID3D11VideoProcessor use case. - NOTE 2) Direct9Ex doesn't support texture sharing which was - created with D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX. In other words, - D3D11_RESOURCE_MISC_SHARED is the only option for Direct3D11/Direct9Ex interop. - NOTE 3) Because of missing synchronization around ID3D11VideoProcessor, - If shared texture was created with D3D11_RESOURCE_MISC_SHARED, - d3d11videosink might use fallback texture to convert DXVA texture - to normal Direct3D texture. Then converted texture will be - copied to user-provided shared texture. - * Why not use generic appsink approach? - In order for application to be able to store video data - which was produced by GStreamer in application's own texture, - there would be two possible approaches, - one is copying our texture into application's own texture, - and the other is drawing on application's own texture directly. - The former (appsink way) cannot be a zero-copy by nature. - In order to support zero-copy processing, we need to draw on - application's own texture directly. - For example, assume that application wants RGBA texture. - Then we can imagine following case. - "d3d11h264dec ! d3d11convert ! video/x-raw(memory:D3D11Memory),format=RGBA ! appsink" - ^ - |_ allocate new Direct3D texture for RGBA format - In above case, d3d11convert will allocate new texture(s) for RGBA format - and then application will copy again the our RGBA texutre into - application's own texture. One texture allocation plus per frame GPU copy will hanppen - in that case therefore. - Moreover, in order for application to be able to access - our texture, we need to allocate texture with additional flags for - application's Direct3D11 device to be able to read texture data. - That would be another implementation burden on our side - But with this MR, we can configure pipeline in this way - "d3d11h264dec ! d3d11videosink". - In that way, we can save at least one texture allocation and - per frame texutre copy since d3d11videosink will convert incoming texture - into application's texture format directly without copy. - * What if we expose texture without conversion and application does - conversion by itself? - As mentioned above, for application to be able to access our texture - from application's Direct3D11 device, we need to allocate texture - in a special form. But in some case, that might not be possible. - Also, if a texture belongs to decoder DPB, exposing such texture - to application is unsafe and usual Direct3D11 shader cannot handle - such texture. To convert format, ID3D11VideoProcessor API needs to - be used but that would be a implementation burden for application. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1873> - -2021-01-20 20:04:20 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/dash/gstmpdhelper.c: - dashsink: add h265 codec support - Return hvc1 for video/x-h265 mime type in mpd helper function - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1966> - -2021-01-23 23:25:30 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: set the default alignment for input and output. - 1. Set the default output alignment to frame, rather than current - alignment of obu. This make it the same behaviour as h264/h265 - parse, which default align to AU. - 2. Set the default input alignment to byte. It can handle the "not - enough data" error while the OBU alignment can not. Also make it - conform to the comments. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1979> - -2021-01-23 19:26:59 +0800 He Junyan <junyan.he@intel.com> - - * tests/check/elements/av1parse.c: - * tests/check/elements/av1parse.h: - test: Add more test cases for the av1parse obu aligned output. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1979> - -2021-01-23 19:21:21 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: Reset the annex_b when meet TU inside a buffer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1979> - -2021-01-23 19:05:57 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: Output each OBU when output is aligned to obu. - The current behaviour for obu aligned output is not very precise. - Several OBUs will be output together within one gst buffer. We - should output each gst buffer just containing one OBU. This is - the same way as the h264/h265 parse do when NAL aligned. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1979> - -2021-01-23 17:38:12 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: Always copy the OBU to cache. - The current optimization when input align and out out align are - the same is not very correct. We simply copy the data from input - buffer to output buffer, but we failed to consider the dropping of - OBUs. When we need to drop some OBUs(such as filter out the OBUs - of some temporal ID), we can not do simple copy. So we need to - always copy the input OBUs into a cache. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1979> - -2021-01-23 17:26:25 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: Improve the logic when to drop the OBU. - When drop some OBU, we need to go on. The current manner will make - the data access out range of the buffer mapping. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1979> - -2021-01-26 11:12:28 +0100 Marijn Suijten <marijns95@gmail.com> - - * ext/ldac/gstldacenc.c: - ext/ldac: Move duplicate sampling rates into #define - Because there was a typo in one of the duplicates already (see previous - commit) it is much safer to specify these once and only once. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1985> - -2021-01-26 11:02:21 +0100 Marijn Suijten <marijns95@gmail.com> - - * ext/ldac/gstldacenc.c: - ext/ldac: Fix typo in 88200(0) stereo encoder sampling rate - Fixes: a57681455 ("ext: Add LDAC encoder") - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1985> - -2021-01-11 01:06:24 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11mpeg2dec.c: - * sys/d3d11/gstd3d11mpeg2dec.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Add support for MPEG-2 video decoding - Add DXVA/Direct3D11 API based MPEG-2 decoder element - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1969> - -2020-11-27 16:18:29 +1100 Matthew Waters <matthew@centricular.com> - - * ext/wpe/WPEThreadedView.cpp: - wpesrc: fix possible small deadlock on shutdown - Problem is that unreffing the EGLImage/SHM Buffer while holding the - images_mutex lock may deadlock when a new buffer is advertised and - an attempt is made to lock the images_mutex there. - The advertisement of the new image/buffer is performed in the - WPEContextThread and the blocking dispatch when unreffing wants to run - something on the WPEContextThread however images_mutex has already been - locked by the destructor. - Delay unreffing images/buffers outside of images_mutex and instead just - clear the relevant fields within the lock. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1843> - -2021-01-20 18:16:17 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/dash/gstmpdhelper.c: - dashsink: fix double unref of sinkpad caps - no need to unref caps in gst_mpd_helper_get_XXX_codec_from_mime - it will be unref in caller gst_dash_sink_get_stream_metadata() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1981> - -2021-01-22 16:56:24 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - codecparsers: av1: Fix a typo in frame_restoration_type setting. - Fixes: #1500 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1974> - -2021-01-22 14:01:01 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - av1parse: Fix some issues in the src caps. - 1. Add the mono_chrome to identify 4:0:0 chroma-format. - 2. Correct the mapping between subsampling_x/y and chroma-format. - There is no 4:4:0 format definition in AV1. And 4:4:4 should - let both subsampling_x/y be equal to 0. - 3. Send the chroma-format when the color space is not RGB. - Fixes: #1502 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1974> - -2021-01-22 13:25:50 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstvp9parse.c: - vp9parse: Fix the subsampling_x/y to chroma format mapping. - The chroma format 4:4:4 needs both subsampling_x and subsampling_y - equal to 0. - Fixes: #1502 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1974> - -2021-01-22 21:10:59 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkutils.c: - vulkan: remove duplicated check - Checking the same value twice is pointless - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1504 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1977> - -2021-01-22 19:26:18 +1100 Matthew Waters <matthew@centricular.com> - - * ext/ldac/meson.build: - ldac: also look for the ldac/ldacBT.h header. - Otherwise there will be a scenario where the library can be found but - not the header and a compilation build error will result - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1975> - -2021-01-22 09:35:30 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: fix assignation to proper variable - Fix the result of a wrong copy&paste - Fixes: #1501 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1976> - -2021-01-21 04:41:44 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvideoenc.cpp: - mfvideoenc: Add support for P010 d3d11 texture - Add P010 Direct3D11 texture format support - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1970> - -2021-01-20 02:29:43 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11compositor.c: - * sys/d3d11/gstd3d11compositorbin.c: - * sys/d3d11/gstd3d11desktopdupsrc.c: - * sys/d3d11/gstd3d11download.c: - * sys/d3d11/gstd3d11pluginutils.c: - * sys/d3d11/gstd3d11pluginutils.h: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosinkbin.c: - * sys/d3d11/plugin.c: - d3d11: Don't use hardcoded maximum resolution value - Maximum supported texture dimension is pre-defined based on - feature level and it couldn't be INT_MAX in any case. - See also https://docs.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-devices-downlevel-intro - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1964> - -2021-01-16 19:14:06 +0800 He Junyan <junyan.he@intel.com> - - * docs/plugins/gst_plugins_cache.json: - doc: Add the av1 parse element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1614> - -2021-01-16 16:48:38 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - codecparsers: Exclude the size of obu_size when identify OBU. - obu->obu_size does not contain the bytes of obu_size itself, we need - to exclude it when doing the saint check. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1614> - -2021-01-06 23:33:24 +0800 He Junyan <junyan.he@intel.com> - - * tests/check/elements/av1parse.c: - * tests/check/elements/av1parse.h: - * tests/check/meson.build: - test: Add test cases for av1parse element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1614> - -2020-09-22 14:54:19 +0800 He Junyan <junyan.he@intel.com> - - * gst/videoparsers/gstav1parse.c: - * gst/videoparsers/gstav1parse.h: - * gst/videoparsers/meson.build: - * gst/videoparsers/plugin.c: - videoparsers: av1: Add the AV1 parse. - This AV1 parse implements the conversion between alignment of obu, - tu and frame, and the conversion between stream-format of obu-stream - and annexb. - TODO: - 1. May need a property of operating_point to filter the OBUs - 2. May add a property to disable deep parse. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1614> - -2021-01-20 00:57:05 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.h: - codecs: mpeg2decoder: Fix a typo in header file's comment. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1963> - -2021-01-18 20:30:44 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11videosink: Fix ugly thread name for Win32 window impl. - Don't need to put Win32 twice - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1962> - -2021-01-18 20:28:14 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window_corewindow.cpp: - * sys/d3d11/gstd3d11window_swapchainpanel.cpp: - d3d11videosink: Fix MSVC build warnings around UWP code - gstd3d11window_corewindow.cpp(408): warning C4189: - 'storage': local variable is initialized but not referenced - gstd3d11window_corewindow.cpp(490): warning C4189: - 'self': local variable is initialized but not referenced - gstd3d11window_swapchainpanel.cpp(481): warning C4189: - 'self': local variable is initialized but not referenced - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1962> - -2021-01-18 19:17:14 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/gstd3d11config.h.meson: - * gst-libs/gst/d3d11/meson.build: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/meson.build: - d3d11: Allow building UWP features with Desktop features if possible - WINAPI_PARTITION_DESKTOP and WINAPI_PARTITION_APP can coexist. - Although UWP only binaries should be used for production stage, - this change will be useful for development stage - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1962> - -2020-12-28 02:35:38 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Do more retry for ID3D11VideoContext::DecoderBeginFrame failure - Some GPUs (especially NVIDIA) are complaining that GPU is still busy - even we did 50 times of retry with 1ms sleep per failure. - Because DXVA/D3D11 doesn't provide API for "GPU-IS-READY-TO-DECODE" - like signal, there seems to be still no better solution other than sleep. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1913> - -2021-01-18 19:23:30 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Fix build error on UWP - gstd3d11videosink.c(662): error C2065: 'sink': undeclared identifier - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1961> - -2021-01-17 01:16:17 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvabasedec.c: - * sys/va/gstvautils.c: - va: Fix some gst_object_unref error because the pointer is NULL. - !1957 introduces some error of gst_object_unref for NULL pointer. - Fixes all of them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1959> - -2021-01-15 16:05:06 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvadecoder.c: - va: Make the caps pointer operation atomic in vadecoder. - The vadecoder's srcpad_caps and sinkpad_caps pointers are outside of the - mutex protection. Just make all operation for them atomic. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1957> - -2021-01-15 15:22:07 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvabasedec.c: - * sys/va/gstvautils.c: - va: Fix a latent race condition in vabasedec. - The vabasedec's display and decoder are created/destroyed between - the gst_va_base_dec_open/close pair. All the data and event handling - functions are between this pair and so the accessing to these pointers - are safe. But the query function can be called anytime. So we need to: - 1. Make these pointers operation in open/close and query atomic. - 2. Hold an extra ref during query function to avoid it destroyed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1957> - -2021-01-14 14:37:32 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Allow disabling audio sample alignment code by setting the alignment-threshold to 0 - And handle setting it to GST_CLOCK_TIME_NONE as always aligning without - ever detecting a discont. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1956> - -2020-12-21 05:11:03 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfh264enc.cpp: - * sys/mediafoundation/gstmfh264enc.h: - * sys/mediafoundation/gstmfh265enc.cpp: - * sys/mediafoundation/gstmfh265enc.h: - * sys/mediafoundation/gstmftransform.cpp: - * sys/mediafoundation/gstmftransform.h: - * sys/mediafoundation/gstmfvideoenc.cpp: - * sys/mediafoundation/gstmfvideoenc.h: - * sys/mediafoundation/gstmfvp9enc.cpp: - * sys/mediafoundation/gstmfvp9enc.h: - * sys/mediafoundation/meson.build: - * sys/mediafoundation/plugin.c: - mfvideoenc: Add support for Direct3D11 texture - Initial support for d3d11 texture so that encoder can copy - upstream d3d11 texture into encoder's own texture pool without - downloading memory. - This implementation requires MFTEnum2() API for creating - MFT (Media Foundation Transform) object for specific GPU but - the API is Windows 10 desktop only. So UWP is not target - of this change. - See also https://docs.microsoft.com/en-us/windows/win32/api/mfapi/nf-mfapi-mftenum2 - Note that, for MF plugin to be able to support old OS versions - without breakage, this commit will load MFTEnum2() symbol - by using g_module_open() - Summary of required system environment: - - Needs Windows 10 (probably at least RS 1 update) - - GPU should support ExtendedNV12SharedTextureSupported feature - - Desktop application only (UWP is not supported yet) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1903> - -2021-01-12 19:12:42 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/webrtctransceiver.c: - * gst-libs/gst/webrtc/rtpreceiver.c: - * gst-libs/gst/webrtc/rtpsender.c: - webrtc: expose transport property on sender and receiver - As advised by !1366#note_629558 , the nice transport should be - accessed through: - > transceiver->sender/receiver->transport/rtcp_transport->icetransport - All the objects on the path can be accessed through properties - except sender/receiver->transport. This patch addresses that. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1952> - -2020-12-21 02:47:45 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/d3d11/d3d11-prelude.h: - * gst-libs/gst/d3d11/gstd3d11.h: - * gst-libs/gst/d3d11/gstd3d11_fwd.h: - * gst-libs/gst/d3d11/gstd3d11_private.h: - * gst-libs/gst/d3d11/gstd3d11bufferpool.c: - * gst-libs/gst/d3d11/gstd3d11bufferpool.h: - * gst-libs/gst/d3d11/gstd3d11config.h.meson: - * gst-libs/gst/d3d11/gstd3d11device.c: - * gst-libs/gst/d3d11/gstd3d11device.h: - * gst-libs/gst/d3d11/gstd3d11format.c: - * gst-libs/gst/d3d11/gstd3d11format.h: - * gst-libs/gst/d3d11/gstd3d11memory.c: - * gst-libs/gst/d3d11/gstd3d11memory.h: - * gst-libs/gst/d3d11/gstd3d11utils.c: - * gst-libs/gst/d3d11/gstd3d11utils.h: - * gst-libs/gst/d3d11/meson.build: - * gst-libs/gst/meson.build: - * sys/d3d11/gstd3d11basefilter.c: - * sys/d3d11/gstd3d11basefilter.h: - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11colorconverter.h: - * sys/d3d11/gstd3d11compositor.c: - * sys/d3d11/gstd3d11compositor.h: - * sys/d3d11/gstd3d11compositorbin.c: - * sys/d3d11/gstd3d11compositorbin.h: - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11desktopdup.cpp: - * sys/d3d11/gstd3d11desktopdup.h: - * sys/d3d11/gstd3d11desktopdupsrc.c: - * sys/d3d11/gstd3d11desktopdupsrc.h: - * sys/d3d11/gstd3d11download.c: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11overlaycompositor.c: - * sys/d3d11/gstd3d11overlaycompositor.h: - * sys/d3d11/gstd3d11pluginutils.c: - * sys/d3d11/gstd3d11pluginutils.h: - * sys/d3d11/gstd3d11shader.c: - * sys/d3d11/gstd3d11shader.h: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11videoprocessor.c: - * sys/d3d11/gstd3d11videoprocessor.h: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosink.h: - * sys/d3d11/gstd3d11videosinkbin.c: - * sys/d3d11/gstd3d11vp8dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - * sys/d3d11/gstd3d11window_corewindow.cpp: - * sys/d3d11/gstd3d11window_corewindow.h: - * sys/d3d11/gstd3d11window_swapchainpanel.cpp: - * sys/d3d11/gstd3d11window_swapchainpanel.h: - * sys/d3d11/gstd3d11window_win32.cpp: - * sys/d3d11/gstd3d11window_win32.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Move core methods to gst-libs - Move d3d11 device, memory, buffer pool and minimal method - to gst-libs so that other plugins can access d3d11 resource. - Since Direct3D is primary graphics API on Windows, we need - this infrastructure for various plugins can share GPU resource - without downloading GPU memory. - Note that this implementation is public only for -bad scope - for now. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/464> - -2021-01-12 00:13:22 +0900 Seungha Yang <seungha@centricular.com> - - * sys/va/gstvaallocator.c: - va: allocator: Fix deadlock caused by double lock - Trivial bug fix for deadlock - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1949> - -2021-01-04 19:34:40 +1100 Matthew Waters <matthew@centricular.com> - - * ext/wpe/gstwpesrc.cpp: - wpesrc: replace object lock usage with a new lock - Using the object lock is problematic for anything that can dispatch to - another thread which is what createWPEView() does inside - gst_wpe_src_start(). Using the object lock there can cause a deadlock. - One example of such a deadlock is when createWPEView is called, but - another (or the same) wpesrc is on the WPEContextThread and e.g. posts a - bus message. This message propagations takes and releases the object - lock of numerous elements in quick succession for determining various - information about the elements in the bin. If the object lock is - already held, then the message propagation will block and stall bin - processing (state changes, other messages) and wpe servicing any events. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1490 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1934> - -2021-01-10 23:16:55 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264picture: Count only complete complementary field pair for dpb fullness decision - Our DPB implementation was designed as such that allowing - temporary DPB overflow in the middle of field picture decoding - and incomplete field pair should not trigger DPB bumping. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1947> - -2021-01-10 23:11:01 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Add support for field-pair input frame - In case that upstream pushed buffer as a frame unit, not picture - unit for interlaced stream, baseclass should be able to detect - AU boundary (i.e., complementary field pair). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1947> - -2021-01-10 22:01:27 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Remove unused private variables - ... and reset() method to clear internal status at one place - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1947> - -2020-12-22 02:29:03 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: try harder not to pick duplicate media ids - On renegotiation, or when the user has specified a mid for - a transceiver, we need to avoid picking a duplicate mid for - a transceiver that doesn't yet have one. - Also assign the mid we created to the transceiver, that doesn't - fix a specific bug but seems to make sense to me. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1902> - -2021-01-07 23:47:35 +0900 Seungha Yang <seungha@centricular.com> - - * sys/va/meson.build: - * tests/examples/va/meson.build: - meson: va: Skip configuration on non-linux environment - VA plugin is linux-only plugin, so we can skip it earlier. - Note that this plugin is making use of libdrm meson fallback, - which is unusable on the other platforms such as Windows - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1946> - -2021-01-07 12:41:16 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: the unit for max-frame-size is kbyte - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1944> - -2021-01-07 09:21:47 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/srt/gstsrtobject.c: - srt: Define options added in later revisions - Allows compiling the plugin against old headers. - For SRTO_BINDTODEVICE there's nothing we can do, since the value depends on - configuration options of the library. Nice. - Fixes build with libsrt < 1.4.2 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1945> - -2020-10-16 19:30:59 +0200 Jakub Adam <jakub.adam@collabora.com> - - * ext/srt/gstsrtobject.c: - srtobject: distinguish authentication error messages - Use GST_RESOURCE_ERROR_NOT_AUTHORIZED code in posted error messages - related to SRT authentication (e.g. incorrect or missing password) so - that the application can recognize them more easily. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1943> - -2020-10-16 19:27:37 +0200 Jakub Adam <jakub.adam@collabora.com> - - * ext/srt/gstsrtobject.c: - srtobject: detect socket errors from srt_epoll_wait() - On an error event, epoll wait puts the failed socket in both readfds and - writefds. We can take advantage of this and avoid explicitly checking - socket state before every read or write attempt. - In addition, srt_getrejectreason() will give us more detailed - description of the connection failure. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1943> - -2020-12-30 13:51:21 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/transportsendbin.c: - * ext/webrtc/transportsendbin.h: - * ext/webrtc/transportstream.c: - * ext/webrtc/transportstream.h: - * ext/webrtc/webrtctransceiver.h: - webrtcbin: Remove remnant of non-rtcp-mux mode - There was some code left that wasn't used anymore. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1930> - -2020-11-24 22:25:15 +0100 Jakub Adam <jakub.adam@collabora.com> - - * ext/srt/gstsrtobject.c: - srtobject: make possible to specify more sockopts in SRT URI - Any socket option that can be passed to libsrt's srt-live-transmit - through SRT URI query string is now recognized. - Also make the code that applies options to SRT sockets more generic. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1842> - -2020-08-26 14:33:57 +0200 Jakub Adam <jakub.adam@collabora.com> - - * ext/srt/gstsrtsrc.c: - srtsrc: fix typos - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1541> - -2020-08-25 13:44:42 +0200 Jakub Adam <jakub.adam@collabora.com> - - * ext/srt/gstsrtsink.c: - srtsink: remove unused connection_mode variable - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1541> - -2020-11-23 16:12:39 +0100 Jakub Adam <jakub.adam@collabora.com> - - * ext/srt/gstsrtobject.c: - srtobject: obey "wait-for-connection" in caller mode - The pipeline now gets stuck in gst_srt_object_write_one() until the - receiver comes online, which may or may not be desired based on the use - case. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1836> - -2021-01-05 14:18:39 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvampeg2dec.c: - va: mpeg2dec: refactor the picture reference filling - Add the helper function _get_surface_id() which extracts the - VASurfaceID from the passed picture. This function gets the surface of - the next and previous reference picture. - Instead of if-statements, this refactor uses a switch-statement with a - fall-through, for P-type pictures, making the code a bit more readable. - Also it adds quirks for gallium driver, which cannot handle invalid - surfaces as forwarding nor backwarding references, so the function fails. - Also iHD cannot handle them, but to avoid failing, the current picture - is used as self-reference. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1939> - -2021-01-05 14:16:45 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvampeg2dec.c: - va: mpeg2dec: set first field either frame or has a first field - Add a helper function _is_frame_start() which check if picture has a - frame structure or if it has not an interlaced first field yet. This - function is used with filling is_first_field parameter. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1939> - -2021-01-06 16:38:14 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - codecs: mpeg2decoder: decode only if B and not closed gop - Mark as decode only if picture type is B, without previous picture in DBP and - closed_gop is 0 as might be understood in "6.3.8 Group of pictures header". - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1939> - -2021-01-06 12:48:14 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - codecs: mpeg2decoder: rename variables - Since prev_picture and next_picture are plain pointers, not pointer to pointers, - it's misleading to name them with _ptr suffix. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1939> - -2021-01-04 21:02:35 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadisplay.c: - * sys/va/gstvadisplay.h: - va: display: parse and set driver implementation - This enum can be used for quirk handling. It's not a property because - the driver enum list might change, it's not static, thus avoiding the - update of GType declaration. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1938> - -2021-01-04 20:56:26 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadisplay.c: - * sys/va/gstvadisplay.h: - va: display: add function precondition check - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1938> - -2020-08-25 19:12:13 +0200 Jakub Adam <jakub.adam@collabora.com> - - * ext/srt/gstsrtobject.c: - srtobject: post a message on the bus when broken socket is detected - So that the application gets notified may react to it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1935> - -2020-12-30 23:29:47 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvampeg2dec.c: - va: mpeg2dec: Using the current picture's surface when missing reference. - When missing the reference frames, we should not just discard the current - frame. Some streams have group of picture header. It is an optional header - that can be used immediately before a coded I-frame to indicate to the decoder - if the first consecutive B-pictures immediately following the coded I-frame can - be reconstructed properly in the case of a random access. - In that case, the B frames may miss the previous reference and can still be - correctly decoded. We also notice that the second field of the I frame may - be set to P type, and it only ref its first field. - We should not skip all those frames, and even the frame really misses the - reference frame, some manner such as inserting grey picture should be used - to handle these cases. - The driver crashes when it needs to access the reference picture while we set - forward_reference_picture or backward_reference_picture to VA_INVALID_ID. We - now set it to current picture to avoid this. This is just a temp manner. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1929> - -2020-12-30 23:14:01 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - codecs: mpeg2decoder: Creating the field based on its arriving time. - Spec says: - In a frame picture top_field_first being set to ‘1’ indicates that the - top field of the reconstructed frame is the first field output by the - decoding process. top_field_first being set to ‘0’ indicates that the - bottom field of the reconstructed frame is the first field output by - decoding process. - Here, the "output" should be interpreted just as the output order, not - including the decoding order. The field should be decoded as the order - they comes in the stream. Namely, no matter top_field_first is 0 or 1, - the first coming field is the first one to be decoded. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1929> - -2021-01-01 16:00:10 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvampeg2dec.c: - va: mpeg2dec: Apply buffer_flags to the output buffer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1929> - -2021-01-01 15:56:03 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - * gst-libs/gst/codecs/gstmpeg2picture.h: - codecs: Add buffer_flags for mpeg2 picture. - We need to store the buffer flags such as GST_VIDEO_BUFFER_FLAG_INTERLACED - and GST_VIDEO_BUFFER_FLAG_TFF for interlaced video. Without these flags, - the VPP and display elements can not apply filter correctly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1929> - -2020-12-30 23:00:51 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - codecs: Reset the quant matrices for each sequence in mpeg2 decoder. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1929> - -2020-10-27 11:52:09 +0530 Raghavendra <raghavendra.rao@collabora.com> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsink.h: - * ext/srt/gstsrtsrc.c: - * ext/srt/gstsrtsrc.h: - srt: Add authentication to srtsink and srtsrc elements - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1725> - -2020-12-30 22:52:01 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/dash/gstdashsink.c: - * ext/dash/gstmpdrootnode.c: - dashsink: fix critical log when exit dynamic pipeline - availability-start-time and publish-time shared the same - GstDateTime object, this object will be unref twice and - cause reference count issue. Should use g_value_dup_boxed() - to copy this object. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1928> - -2020-12-23 16:11:42 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - msdkenc{h264,h265}: add min-qp and max-qp properties - The SDK allows user to set a QP range 1, so add min-qp and max-qp to - sepecify QP range. By default, there is no limitations on QP. - 1 https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#mfxextcodingoption2 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1908> - -2020-12-23 13:36:02 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - msdkenc{h264,h265}: add p-pyramid property - The SDK can support P-Pyramid reference structure 1, so add a new - property to enable this feature in msdkenc{h264,h265}. - 1 https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#preftype - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1908> - -2020-12-22 16:17:18 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - msdkh265enc: add b-pyramid property - Like as msdkh264enc, b-pyramid is added to enable B-Pyramid reference - structure for H265 encoding - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1908> - -2020-12-22 14:54:59 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - * sys/msdk/msdk-enums.c: - * sys/msdk/msdk-enums.h: - msdkh265enc: add transform-skip property - Since the SDK API 1.26, TransformSkip was added to control - transform_skip_enabled_flag setting in PPS 1 - 1 https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#mfxextcodingoption3 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1908> - -2020-12-29 09:41:05 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - msdk: needn't close mfx session when failed - Otherwise we will get double free issue because mfx session is closed in - finalize. See - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1867#note_739346 - for the double free issue. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1916> - -2020-12-29 13:29:05 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtcstats: PLI/FIR/NACK direction are the opposite of the media - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1924> - -2020-12-29 13:15:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/assrender/gstassrender.c: - assrender: Don't try unlocking unlocked mutex - When flushing right at the beginning of the video chain function or - when failing negotiation at the top of the function, the assrender mutex - would be unlocked without being previously locked. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1918> - -2020-12-27 22:16:13 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11compositor.c: - d3d11compositor: Add support for resolution change - Not only for position update (e.g., xpos, ypos), - we need to configure shader again per resolution change of each - input stream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1912> - -2020-12-28 04:33:11 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11shader.c: - d3d11shader: Fix ID3DBlob object leak - Even if HLSL compiler was able to compile our shader code, D3DCompile() - might return ID3DBlob object for compile warnings and the object - should be released. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1914> - -2020-12-28 17:13:22 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - codecs: Fix a typo in mpeg2 stateless decoder base class. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1915> - -2020-12-24 20:07:09 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvampeg2dec.c: - va: mpeg2dec: cosmetic changes - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1798> - -2020-12-27 15:47:13 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - * gst-libs/gst/codecs/gstmpeg2decoder.h: - * gst-libs/gst/codecs/gstmpeg2picture.c: - * gst-libs/gst/codecs/gstmpeg2picture.h: - codecs: mpeg2decoder: fix documentation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1798> - -2020-12-24 16:20:31 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - codecs: mpeg2decoder: simplify macros - For constructors, instead of casting to pointers, cast to the structures. - For compare, use inlined functions. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1798> - -2020-12-18 22:28:41 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvabasedec.h: - * sys/va/gstvadecoder.c: - * sys/va/gstvampeg2dec.c: - * sys/va/gstvampeg2dec.h: - * sys/va/meson.build: - * sys/va/plugin.c: - va: Add mpeg2 VA decoder. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1798> - -2020-12-18 21:25:08 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gstmpeg2decoder.c: - * gst-libs/gst/codecs/gstmpeg2decoder.h: - * gst-libs/gst/codecs/gstmpeg2picture.c: - * gst-libs/gst/codecs/gstmpeg2picture.h: - * gst-libs/gst/codecs/meson.build: - codecs: Add mpeg2 stateless decoder base class. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1798> - -2020-12-27 03:16:28 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfh264enc.cpp: - * sys/mediafoundation/gstmfh265enc.cpp: - * sys/mediafoundation/gstmfvideoenc.cpp: - * sys/mediafoundation/gstmfvideoenc.h: - * sys/mediafoundation/gstmfvp9enc.cpp: - mfvideoenc: Re-define default GOP size value - The behavior for zero AVEncMPVGOPSize value would be - varying depending on GPU vendor implementation and some - GPU will produce keyframe only once at the beginning of encoding. - That's unlikely expected result for users. - To make this property behave consistently among various GPUs, - this commit will change default value of "gop-size" property to -1 - which means "auto". When "gop-size" is unspecified, then - mfvideoenc will calculate GOP size based on framerate - like that of our x264enc implementation. - See also - https://docs.microsoft.com/en-us/windows/win32/directshow/avencmpvgopsize-property - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1911> - -2020-12-27 03:43:11 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvideoenc.cpp: - mfvideoenc: Fix use of uninitialized value - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1911> - -2020-12-24 21:31:04 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11utils.c: - d3d11device: Add property for getting adapter LUID - LUID (Locally Unique Identifier) can used for identifying GPU - and that's required for some Windows APIs (e.g., MFTEnum2()) to setup device. - See also - https://docs.microsoft.com/en-us/windows/win32/api/mfapi/nf-mfapi-mftenum2 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1910> - -2020-12-26 20:39:07 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfh264enc.cpp: - * sys/mediafoundation/gstmfh265enc.cpp: - * sys/mediafoundation/gstmfvideoenc.cpp: - * sys/mediafoundation/gstmfvideoenc.h: - * sys/mediafoundation/gstmfvp9enc.cpp: - * sys/mediafoundation/plugin.c: - mfvideoenc: Remove duplicated class registration code - Each codec subclass has the same code for class/element registration, - so we can move the code into one helper methodm and that will make - future enhancement simple. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1909> - -2020-12-10 11:11:04 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/msdk.c: - msdk: check GstMsdkContext instead of mfxSession instance - When creating a GstMsdkContext instance, it also creates a mfxSession - instance, so we may check GstMsdkContext instead of mfxSession instance - to make sure MSDK is available. In addition, according to MSDK doc 1, - MFXVideoCORE_SetHandle function should be executed before any actual - usage of library including queries, otherwise the behavior is - unexpected, so we should call MFXVideoCORE_QueryPlatform after - MFXVideoCORE_SetHandle on Linux - 1 https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#working-with-va-api-applications - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1867> - -2020-12-23 21:21:55 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11device.h: - * sys/d3d11/gstd3d11shader.c: - * sys/d3d11/plugin.c: - d3d11: Remove unnecessary helper methods - We can query selected D3D_FEATURE_LEVEL and factory version - by using native D3D11 API - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1906> - -2020-11-21 03:20:36 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11desktopdup.cpp: - * sys/d3d11/gstd3d11desktopdup.h: - * sys/d3d11/gstd3d11desktopdupsrc.c: - * sys/d3d11/gstd3d11desktopdupsrc.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Re-implement Desktop Duplication source - Add a new video source element "d3d11desktopdupsrc" for capturing desktop image - via Desktop Duplication based on Microsoft's Desktop Duplication sample available at - https://github.com/microsoft/Windows-classic-samples/tree/master/Samples/DXGIDesktopDuplication - This element is expected to be a replacement of existing dxgiscreencapsrc - element in winscreencap plugin. - Currently this element can support (but dxgiscreencapsrc cannot) - - Copying captured D3D11 texture to output buffer without download - - Support desktop session transition - e.g., can capture desktop without error even in case that - "Lock desktop" and "Permission dialog" - - Multiple d3d11desktopdupsrc elements can capture the same monitor - Not yet implemented features - - Cropping rect is not implemented, but that can be handled by downstream - - Mult-monitor is not supported. But that is also can be implemented by - downstream element for example via multiple d3d11desktopdup elements - with d3d11compositor - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1855> - -2020-12-22 00:47:09 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11device.h: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/plugin.c: - d3d11device: Add an optional flags argument for creating device - Extend gst_d3d11_device_new() method so that caller can specify - D3D11_CREATE_DEVICE_FLAG value to use. - See https://docs.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_create_device_flag - for more detail about D3D11_CREATE_DEVICE_FLAG - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1901> - -2020-12-21 14:06:53 +0530 Raju Babannavar <raju.babannavar@gmail.com> - - * gst/dvbsuboverlay/dvb-sub.c: - dvbsuboverlay: Add support for dynamic resolution update. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1487 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1897> - -2020-12-21 02:56:55 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11device.h: - d3d11device: Remove dead code - We don't use this method since the commit of - 0788492461e1b559230cc5c3a354fe5f48f95f8b - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1892> - -2020-12-20 02:39:40 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11compositor.c: - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11download.c: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - * sys/d3d11/gstd3d11videoprocessor.c: - * sys/d3d11/gstd3d11videoprocessor.h: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11vp8dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - * sys/d3d11/gstd3d11window.cpp: - d3d11: Privatize d3d11memory implementation - Hide most of symbols of GstD3D11Memory object. - GstD3D11Memory is one of primary resource for imcoming d3d11 library - and it's expected to be a extensible feature. - Hiding implementation detail would be helpful for later use case. - Summary of this commit: - * Now all native Direct3D11 resources are private of GstD3D11Memory. - To access native resources, getter methods need to be used - or generic map (e.g., gst_memory_map) API should be called - apart from some exceptional case such as d3d11decoder case. - * Various helper methods are added for GstBuffer related operations - and in order to remove duplicated code. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1892> - -2020-12-20 01:06:24 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11compositor.c: - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - * sys/d3d11/gstd3d11videosink.c: - d3d11: Add a helper method for d3d11buffferpool setup - Remove duplicated code for d3d11buffferpool setup. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1892> - -2020-12-19 00:40:53 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11device.h: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11overlaycompositor.c: - * sys/d3d11/gstd3d11window_corewindow.cpp: - * sys/d3d11/gstd3d11window_swapchainpanel.cpp: - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11device: Remove optional helper methods - Most of Direct3D11 APIs can be called without GstD3D11Device - abstraction. This is a part of prework for public GstD3D11 library - to introduce minimal APIs - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1892> - -2020-12-20 22:12:44 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Prepare window once streaming started - ... instead of READY state. READY state is too early for setting - overlay window handle especially playbin/playsink scenario - since playsink will set given overlay handle on videosink once - READY state change of videosink is ensured. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1893> - -2020-08-19 03:19:26 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmftransform.cpp: - * sys/mediafoundation/gstmftransform.h: - * sys/mediafoundation/gstmfvideoenc.cpp: - * sys/mediafoundation/gstmfvideoenc.h: - mfvideoenc: Improve latency performance for hardware encoder - Unlike software MFT (Media Foundation Transform) which is synchronous - in terms of processing input and output data, hardware MFT works - in asynchronous mode. output data might not be available right after - we pushed one input data into MFT. - Note that async MFT will fire two events, one is "METransformNeedInput" - which happens when MFT can accept more input data, - and the other is "METransformHaveOutput", that's for signaling - there's pending data which can be outputted immediately. - To listen the events, we can wait synchronously via - IMFMediaEventGenerator::GetEvent() or make use of IMFAsyncCallback - object which is asynchronous way and the event will be notified - from Media Foundation's internal worker queue thread. - To handle such asynchronous operation, previous working flow was - as follows (IMFMediaEventGenerator::GetEvent() was used for now) - - Check if there is pending output data and push the data toward downstream. - - Pulling events (from streaming thread) until there's at least - one pending "METransformNeedInput" event - - Then, push one data into MFT from streaming thread - - Check if there is pending "METransformHaveOutput" again. - If there is, push new output data to downstream - (unlikely there is pending output data at this moment) - Above flow was processed from upstream streaming thread. That means - even if there's available output data, it could be outputted later - when the next buffer is pushed from upstream streaming thread. - It would introduce at least one frame latency in case of live stream. - To reduce such latency, this commit modifies the flow to be fully - asynchronous like hardware MFT was designed and to be able to - output encoded data whenever it's available. More specifically, - IMFAsyncCallback object will be used for handling - "METransformNeedInput" and "METransformHaveOutput" events from - Media Foundation's internal thread, and new output data will be - also outputted from the Media Foundation's thread. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1520> - -2020-12-16 18:32:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Fix duration of the first audio frame after each discont - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1886> - -2020-12-16 00:28:08 +0530 Biswapriyo Nath <nathbappai@gmail.com> - - * sys/mediafoundation/gstmfdevice.h: - mediafoundation: Fix redefinition of variables. - Remove duplicate GstMFDevice and GstMFDeviceProvider declaration. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1884> - -2020-12-17 04:41:18 +1100 Jan Schmidt <jan@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Calculate the correct size for fixed size buffers - Fix the output-buffer-size property to do what it says by calculating - the correct audio buffer size for that target size, rounded down to - the nearest whole number of samples. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1887> - -2020-12-10 12:35:07 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Implement GstBaseSrc::get_caps() to return more constrained caps - Instead of the template caps we can return a subset of them based on the - selected properties. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1868> - -2020-10-30 02:21:11 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - wasapi2: Ensure unmute when opening audio client - ISimpleAudioVolume::SetMute() status seems to be preserved even - after process is terminated. In order to start audio client with - unmuted state, always disable mute when opening audio client. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1731> - -2020-12-14 16:12:22 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsparse.c: - tsparse: Don't use non-object for debugging statement - Use the pad instead - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1880> - -2020-12-14 10:56:39 +0100 Edward Hervey <edward@centricular.com> - - * tests/examples/mpegts/ts-parser.c: - examples/ts-parser: Use the section type for descriptor identification - Some descriptors can only be present in some section - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1880> - -2020-12-14 10:56:02 +0100 Edward Hervey <edward@centricular.com> - - * tests/examples/mpegts/ts-parser.c: - examples/ts-parser: Try more descriptor/stream types - These were added recently - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1880> - -2020-12-09 09:14:12 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - mpegts: Don't add non-padded streams to collection on updates - When carrying over existing GstStream to a new GstStreamCollection we need to - check whether they *actually* were being used in the previous collection. - This avoids adding unknown streams (metadata, PSI, etc...) to the collection on - updates. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1880> - -2020-11-22 18:48:08 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gst-dvb-section.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * tests/examples/mpegts/ts-parser.c: - mpegts: Add support for SIT sections - Selection Information Tables (EN 300 468) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1852> - -2020-12-14 10:50:02 +0100 Edward Hervey <edward@centricular.com> - - * docs/libs/mpegts/index.md: - * gst-libs/gst/mpegts/gst-atsc-descriptor.h: - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gst-dvb-section.h: - * gst-libs/gst/mpegts/gst-hdmv-section.h: - * gst-libs/gst/mpegts/gst-isdb-descriptor.h: - * gst-libs/gst/mpegts/gst-scte-section.c: - * gst-libs/gst/mpegts/gst-scte-section.h: - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/mpegts/mpegts.c: - * gst-libs/gst/mpegts/mpegts.h: - mpegts: Update documentation - * Split up into appropriate individual header files - * Document more sections and structures - * Add well-known list of registration id - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1879> - -2020-12-10 16:29:31 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/transcoder/gsttranscoder.c: - player/transcoder: Use bus signal watch - Instead of implementing exactly the same thing ourself but making - `GstBus` not know that it is the case. - Since we are *sure* that the bus can't have been access at the point - where we add the watch we are guaranteed that the current thread - maincontext is going to be used. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1870> - -2020-12-10 15:37:14 +0800 Lim Siew Hoon <siew.hoon.lim@intel.com> - - * gst/inter/gstintervideosrc.c: - intervideosrc: fix negotiation of interlaced caps - In 1.0 the field in caps is called "interlace-mode", not "interlaced". - Fixes #1480 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1869> - -2020-12-11 21:45:25 -0500 Arun Raghavan <arun@asymptotic.io> - - * ext/openaptx/meson.build: - * meson_options.txt: - openaptx: Drop lib prefix from option name for consistency - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1876> - -2020-12-11 08:45:06 +0000 Igor Kovalenko <igor.v.kovalenko@gmail.com> - - * ext/meson.build: - * ext/openaptx/gstopenaptxdec.c: - * ext/openaptx/gstopenaptxdec.h: - * ext/openaptx/gstopenaptxenc.c: - * ext/openaptx/gstopenaptxenc.h: - * ext/openaptx/meson.build: - * ext/openaptx/openaptx-plugin.c: - * ext/openaptx/openaptx-plugin.h: - * meson_options.txt: - openaptx: add aptX and aptX-HD codecs using libopenaptx - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1871> - -2020-10-19 14:56:43 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/gstwpesrc.cpp: - wpe: Emit load-progress messages - The estimated-load-progress value can be used on application side to display a - progress bar for instance. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1710> - -2020-12-08 16:46:42 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsmux/gstbasetsmux.c: - basetsmux: Don't send the capsheader if src pad has no caps - That means we're shutting down, so there's no point in the streamheader - being sent - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1864> - -2020-12-04 17:02:00 +1100 Matthew Waters <matthew@centricular.com> - - * gst/rtmp2/rtmp/rtmpclient.c: - * gst/rtmp2/rtmp/rtmpconnection.c: - * gst/rtmp2/rtmp/rtmpconnection.h: - rtmp2/connection: pass the parent cancellable down to the connection - Otherwise, when rtpm2src cancels an inflight operation that has a queued - message stored, then the rtmp connection operation is not stopped. - If the cancellation occurs during rtmp connection start up, then - rtpm2src does not have any way of accessing the connection object as it - has not been returned yet. As a result, rtpm2src will cancel, the - connection will still be processing things and the - GMainContext/GMainLoop associated with the outstanding operation will be - destroyed. All outstanding operations and the rtmpconnection object will - therefore be leaked in this case. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1425 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1862> - -2020-12-07 14:54:28 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srt: Don't take object lock calling gst_srt_object_get_stats - This function takes the sock lock. This can result in a deadlock when - another thread holding the sock lock is trying to take the object lock. - Thread A (Holds object lock, wants sock lock): - #2 gst_srt_object_get_stats at gst-plugins-bad/ext/srt/gstsrtobject.c:1753 - #3 gst_srt_object_get_property_helper at gst-plugins-bad/ext/srt/gstsrtobject.c:409 - #4 gst_srt_sink_get_property at gst-plugins-bad/ext/srt/gstsrtsink.c:95 - #5 g_object_get_property from libgobject-2.0.so.0 - Thread B (Holds sock lock, wants object lock): - #2 gst_element_post_message_default at gstreamer/gst/gstelement.c:2069 - #3 gst_element_post_message at gstreamer/gst/gstelement.c:2123 - #4 gst_element_message_full_with_details at gstreamer/gst/gstelement.c:2259 - #5 gst_element_message_full at gstreamer/gst/gstelement.c:2298 - #6 gst_srt_object_send_headers at gst-plugins-bad/ext/srt/gstsrtobject.c:1407 - #7 gst_srt_object_send_headers at gst-plugins-bad/ext/srt/gstsrtobject.c:1444 - #8 gst_srt_object_write_to_callers at gst-plugins-bad/ext/srt/gstsrtobject.c:1444 - #9 gst_srt_object_write at gst-plugins-bad/ext/srt/gstsrtobject.c:1598 - #10 gst_srt_sink_render at gst-plugins-bad/ext/srt/gstsrtsink.c:179 - Fixes d2d00e07acc2b1ab1ae5a728ef5dc33c9dee7869. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1861> - -2020-11-25 16:24:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/closedcaption/gstccconverter.c: - * ext/closedcaption/gstccconverter.h: - ccconverter: Add property to specify which sections to include in CDP packets - Various software, including ffmpeg's Decklink support, fails parsing CDP - packets that contain anything but CC data in the CDP packets. - Based on this property, timecodes are not written into the CDP packets - even if they're present. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1833> - -2020-11-25 14:54:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: Refactor code to only retrieve the timecode meta once - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1833> - -2020-12-06 18:03:47 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadecoder.h: - va: decode: fix display type - Instead of a pointer to GstVaDisplay it was used a VADisplay type, which in - certain platforms is the same, and the compiler didn't complain. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1860> - -2020-07-03 12:25:31 +0200 Marc Leeman <m.leeman@televic.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/rtp/gstrtpsrc.c: - * gst/rtp/gstrtpsrc.h: - rtpmanagerbad: allow setting caps on rtpsrc - rtpsrc tries to do a lookup of the caps based on the encoding-name. For - not so standard encodings, the caps can be set, avoiding the lookup. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1406> - -2020-11-22 04:39:57 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosinkbin.c: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - * sys/d3d11/meson.build: - d3d11videosink: Add a property to support rendering statistics data on window - Add a new property "render-stats" to allow rendering statistics - data on window for debugging and/or development purpose. - Text rendering will be accelerated by GPU since this implementation - uses Direct2D/DirectWrite API and Direct3D inter-op for minimal overhead. - Specifically, text data will be rendered on swapchain backbuffer - directly without any copy/allocation of extra texture. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1830> - -2020-12-04 03:40:17 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11window.cpp: - d3d11: Protect ID3D11VideoContext with lock - Likewise d3d11 immediate context (i.e., ID3D11DeviceContext), - ID3D11VideoContext API is not thread safe. It must be protected therefore. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1856> - -2020-12-03 17:13:15 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/meson.build: - docs: don't exit the subdir when optional deps aren't found - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1854> - -2020-12-02 11:29:08 +0100 Edward Hervey <edward@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/opencv/gstretinex.cpp: - * ext/opencv/gstretinex.h: - opencv: Expose retinex parameters - Makes the plugin a tad more useful :) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1845> - -2020-10-12 14:12:07 +0300 Marius Vlad <marius.vlad@collabora.com> - - * gst-libs/gst/wayland/meson.build: - gst-libs/gst/wayland: Install "unstable" wayland header - Context creation and retrieval is required, the symbols are exported - with the header missing. Users most likely define GST_USE_UNSTABLE_API - so they're aware of the implications of using a header that might change - between releases. - Signed-off-by: Marius Vlad <marius.vlad@collabora.com> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1688> - -2020-12-03 14:12:06 +0100 Edward Hervey <edward@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Use actual object for logging - i.e. the pad of the stream - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1853> - -2020-12-03 06:55:00 -0500 Arun Raghavan <arun@asymptotic.io> - - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlfilesink.c: - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlhttpsink.c: - * ext/curl/gstcurlhttpsrc.c: - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/gstcurlsshsink.c: - * ext/curl/gstcurltlssink.c: - curl: Remove incorrect GST_DEBUG_OBJECT() calls - klass is not a GstObject, and these debugs print should likely not be - around anyway. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1851> - -2020-11-25 17:59:54 +0100 Edward Hervey <edward@centricular.com> - - * sys/nvcodec/gstcudanvrtc.c: - cuda: Fix lowest targetted architecture for CUDA >= 11.0 - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1469 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1835> - -2020-11-05 13:48:27 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/mpegtsparse.c: - tsparse: Forward incoming timestamps - Ensure we properly forward the upstream PTS/DTS on the regular and program - source pads. All packets being processed will carry over the latest PTS/DTS (as - a reconstructed GstBuffer). - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1419 - And properly forward PTS/DTS for program pads (which wasn't the case before) - Original patch by Vivia Nikolaidou <vivia@ahiru.eu> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1769> - -2020-12-02 09:39:45 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Don't log with non-GObject objects - Instead of using the streams, log with the pad of the streams. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1457 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1844> - -2020-11-20 11:29:46 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/transcode/gsttranscodebin.c: - * tools/gst-transcoder.c: - transcodebin: Minor error message enhancement - -2020-11-19 22:56:46 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: Unlock while setting decodebin caps - Otherwise it will deadlock recursing up to notify parent object property changes - -2020-11-19 18:31:34 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: Avoid plugin converter if filter handles ANY caps - For example identity or clocksync or this kind of elements can be - used with any data flow and we should not enforce decoding to row in - that case. - -2020-11-19 18:39:33 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: Add filter as soon as it is set - Instead of waiting so that we can simply use a clocksync element as - filter, otherwise we won't know the pipeline is live as it won't - return NO_PREROLL as one would expect in that case. - Adding it right away shouldn't create any issue, both ways are fine. - -2020-11-19 18:29:15 -0300 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/transcode/gsturitranscodebin.c: - uritranscodebin: Add `setup-source` and `element-setup` signals - The same way as playbinX does it as it is often quite useful - -2020-11-19 17:55:10 -0300 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/transcode/gsttranscodebin.c: - * gst/transcode/gsturitranscodebin.c: - transcode: Port to encodebin2 - This allows supporting muxing sinks like hlssink2 or splitmux - -2020-11-19 17:55:10 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder.c: - transcoder: Handle the case where several errors are posted - There were cases where the loop was already destroyed when we were - receiving the following message. - -2020-11-19 17:54:28 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder.c: - transcoder: Minor refactoring to output better debug logs - -2020-11-19 17:51:56 -0300 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/hls/gsthlssink2.c: - hlssink2: Mark as Muxer - The way it is usable by encodebin2. This is what splitmux does already. - -2020-11-30 17:12:14 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadecoder.c: - va: decoder: Picture dups only holds GstBuffer - Also removes the warning log message at destroying buffers when picture free() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1841> - -2020-11-30 15:01:01 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - * sys/va/gstvah264dec.c: - * sys/va/gstvah265dec.c: - * sys/va/gstvavp8dec.c: - * sys/va/gstvavp9dec.c: - va: Remove gst_va_decoder_destroy_buffers() - Since GstVaDecodePicture is destroyed completely with its free() function and - it's used as destroy notify by codecs picture, there's no need to call - gst_va_decoder_destroy_buffers() externally, since the codecs base classes - destroy the codec picture when it's required. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1841> - -2020-11-26 14:04:31 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - * sys/va/gstvah264dec.c: - * sys/va/gstvah265dec.c: - * sys/va/gstvavp8dec.c: - * sys/va/gstvavp9dec.c: - va: Destroy picture unreleased buffers when finalize. - The current way of GstVaDecodePicture's finalize will leak some - resource such as parameter buffers and slice data. - The current way deliberately leaves these resource releasing logic - to va decoder related function and trigger a warning if we free the - GstVaDecodePicture without releasing these resources. - But in practice, sometimes, you do not have the chance to release - these resource before picture is freed. For example, H264/Mpeg2 - support multi slice NALs/Packets for one frame. It is possible that - we already succeed to parse and generate the first several slices - data by _decode_slice(), but then we get a wrong slice NAL/packet - and fail to parse it. We decide to discard the whole frame in the - decoder's base class, it just free the current picture and does not - trigger sub class's function again. In this kind of cases, we do - not have the chance to cleanup the resource, and the resource will - be leaked. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1841> - -2020-11-21 19:00:02 -0300 Thibault Saunier <tsaunier@igalia.com> - - * ext/qroverlay/gstbaseqroverlay.c: - * ext/qroverlay/gstbaseqroverlay.h: - * ext/qroverlay/gstdebugqroverlay.c: - * ext/qroverlay/gstqroverlay.c: - qroverlay: Reuse the same OverlayComposition object when possible - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1829> - -2020-11-20 11:28:25 -0300 Thibault Saunier <tsaunier@igalia.com> - - * ext/qroverlay/gstbaseqroverlay.c: - * ext/qroverlay/gstbaseqroverlay.h: - * ext/qroverlay/gstdebugqroverlay.c: - * ext/qroverlay/gstqroverlay.c: - qroverlay: Rework basing it on overlaycomposition - The base class is now a bin which wraps the `overlaycomposition` - element and implements the `draw` signal. - This way we support all the video formats the GstVideoOverlayComposition - API supports and the blending code can be reused. It is also possible - to have the blending happen in the sinks now. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1829> - -2020-11-26 05:55:29 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11h264dec.c: - d3d11h264dec: Reconfigure decoder object on DPB size change - Even if resolution and/or bitdepth is not updated, required - DPB size can be changed per SPS update and it could be even - larger than previously configured size of DPB. If so, we need - to reconfigure DPB d3d11 texture pool again. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1839> - -2020-11-25 17:52:42 +0100 Marijn Suijten <marijns95@gmail.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - * gst/inter/gstinteraudiosrc.c: - audio: Use new AudioFormatInfo::fill_silence function - The function is renamed to be properly associated with AudioFormatInfo - (its instance) instead of AudioFormat (an unrelated enum), see 1 for - the rename itself. - 1: https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/940 - -2020-11-05 17:14:22 +0000 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/player/gstplayer.c: - player: Fix get_current_subtitle_track annotation - As the info returned is a new object, the annotation should be transfer-full, - similarly to the get_current_{audio,video}_track() implementations. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1775> - -2020-11-23 20:44:27 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: add a memory pool object helper - Since both allocators use a memory pool, with its mutex and cond, this patch - refactors it into a single internal object, implementing a generic GstMemory - pool. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1815> - -2020-11-17 14:53:05 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvaallocator.h: - * sys/va/gstvapool.c: - va: pool, allocator: honor GST_BUFFER_POOL_ACQUIRE_FLAG_DONTWAIT - In order to honor GST_BUFFER_POOL_ACQUIRE_FLAG_DONTWAIT in VA pool, allocators' - wait_for_memory() has to be decoupled from their prepare_buffer() so it could be - called in pools' acquire_buffer() if the flag is not set. - wait_for_memory() functions are blocking so the received memories are assigned - to the fist requested buffer, if multithreaded calls. For this a new mutex were - added. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1815> - -2020-11-17 13:18:37 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvapool.c: - va: allocator: broadcast when flushing - This patch handles when the bufferpool request a new buffer while - flushing. - Also fixes the usage of g_cond_wait(), which demands to be used - inside a loop to avoid spurious wakeups. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1815> - -2020-11-17 13:17:03 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: free allocator when a mem is held - An application, using for example appsink, can hold buffers from any - va allocator after setting the pipeline to NULL. We need to destroy - the allocator when that memory is unrefed. - This patch juggles a bit with the allocator reference count in - memories in order to achieve this: - 1. When memory is created no alloc ref is modified - 2. When memory is released, alloc ref is decreased - 3. When memory is reassiged to a buffer, alloc ref is increased - 4. When memory is flushed, alloc ref is increased becase it is going - to be decreased in gst_memory_unref() - Also this patch moves the deallocation of member variables to - finalize() rather than dispose() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1815> - -2020-11-23 17:01:52 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: dmabuf: initialize cond - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1815> - -2020-11-20 17:32:44 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcstats.c: - * ext/webrtc/transportstream.c: - * ext/webrtc/transportstream.h: - webrtc: Make ssrc map into separate data structures - They now contain a weak reference and that could be freed later - causing strange crashes as GWeakRef are not movable. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1766> - -2020-10-15 21:23:08 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtcstats: Get the remote-inbound stats from the right RTPSource - This also means that we need to get the clock-rate from the codec instead - of from the RTPSource, as the remote one doesn't include a clock rate. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1766> - -2020-10-15 19:36:45 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/gstwebrtcstats.c: - * ext/webrtc/gstwebrtcstats.h: - webrtcbin: Implement getting stats for a specific pad - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1766> - -2020-10-10 18:21:19 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtcstats: Also return the raw rtpsource stats for more information - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1766> - -2020-10-09 20:59:58 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtcstats: Avoid copy of GstStructure - Instead transfer the ownership to the new structure - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1766> - -2020-10-09 20:45:10 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtcstats: Remove receiver side when sending - Those are just invalid and just reflect what we sent. We'd need to parse the - RTCP XR packets from the other side to know more about those. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1766> - -2020-10-09 20:27:40 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtcstats: Extract statistics from the rtpjitterbuffer - And expose them as standardised webrtc statistics - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1766> - -2020-10-09 18:45:57 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/transportstream.c: - * ext/webrtc/transportstream.h: - webrtcbin: Store the rtpjitterbuffer instances to extract stats from them - Store them as web refs to avoid having to worry about freeing later and because - the new-jitterbuffer is on a different thread - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1766> - -2020-10-09 19:59:18 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtcstats: Document all RTP missing fields according to the latest spec - Just document all the missing fields and document which ones will never - be implemented because they depend on the codec or depayloader - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1766> - -2020-10-09 19:38:15 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtcstats: RTCP computed RTT is only available at sender - The receiver doesn't have the information to compute it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1766> - -2020-10-08 17:11:30 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtcstats: Remove redundant lines - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1766> - -2020-11-04 17:06:02 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/rtpreceiver.c: - * gst-libs/gst/webrtc/rtpreceiver.h: - * gst-libs/gst/webrtc/rtpsender.c: - * gst-libs/gst/webrtc/rtpsender.h: - webrtc: Also remove rtcp_transport from the structure - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1765> - -2020-11-02 19:55:46 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/rtpreceiver.c: - * gst-libs/gst/webrtc/rtpreceiver.h: - * gst-libs/gst/webrtc/rtpsender.c: - * gst-libs/gst/webrtc/rtpsender.h: - webrtc: Remove APIs to set transport on sender/receiver - They're not not used ever. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1765> - -2020-11-02 19:49:55 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/nicetransport.c: - * ext/webrtc/transportreceivebin.c: - * ext/webrtc/transportsendbin.c: - * ext/webrtc/transportsendbin.h: - * ext/webrtc/transportstream.c: - * ext/webrtc/transportstream.h: - * ext/webrtc/webrtctransceiver.c: - * gst-libs/gst/webrtc/dtlstransport.c: - * gst-libs/gst/webrtc/dtlstransport.h: - * gst-libs/gst/webrtc/rtpreceiver.c: - * gst-libs/gst/webrtc/rtpreceiver.h: - * gst-libs/gst/webrtc/rtpsender.c: - * gst-libs/gst/webrtc/rtpsender.h: - webrtc: Remove non rtcp-mux code - RTCP mux is now always required by the WebRTC spec - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1765> - -2020-11-20 15:01:03 +0000 Julian Bouzas <julian.bouzas@collabora.com> - - * sys/nvcodec/gstnvdec.c: - nvcodec: Assume 25fps if framerate is invalid when calculating latency - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1826> - -2020-11-20 22:26:14 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: fix memory leak - gst_h264_dbp_get_picture_all() returns a full transfer of the GArray, which - needs be unrefed. But it is not unrefed in - gst_h264_decoder_find_first_field_picture() leaking it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1827> - -2020-11-20 16:07:36 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - mpegts: Documentation fixes - gtk-doc was complaining :) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1825> - -2020-11-20 13:24:24 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/qroverlay/gstdebugqroverlay.c: - * ext/qroverlay/gstdebugqroverlay.h: - * ext/qroverlay/gstqroverlay.c: - * ext/qroverlay/gstqroverlay.h: - qroverlay: unset executable flag on source files - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1824> - -2020-11-20 13:22:48 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/qroverlay/meson.build: - qroverlay: fix auto detection of json-glib for plugin - Only want to check for json-glib when libqrencode was found, - but also it shouldn't be required but depend on the option. - Fixes #1465 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1824> - -2020-11-19 21:15:25 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11format.c: - * sys/d3d11/gstd3d11format.h: - * sys/d3d11/gstd3d11memory.c: - * tests/check/elements/d3d11colorconvert.c: - d3d11: Add support for packed 4:2:2 and 4:4:4 10bits formats - Add support for Y210 and Y410 formats which are commonly used format - for en/decoders on Windows. Note that those formats cannot be used for - render target (output) of shader. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1821> - -2020-10-02 18:47:16 -0400 Olivier Crête <olivier.crete@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Accept constrained-high and progressive-high profiles - They're just subsets of the high profile. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1634> - -2020-10-02 18:47:06 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/d3d11/gstd3d11h264dec.c: - d3d11h264dec: Accept constrained-high and progressive-high profiles - They're just subsets of the high profile. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1634> - -2020-10-02 18:46:56 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/msdk/gstmsdkh264dec.c: - msdkh264dec: Accept constrained-high and progressive-high profiles - They're just subsets of the high profile. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1634> - -2020-09-22 15:42:37 -0400 Olivier Crête <olivier.crete@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/nvcodec/gstnvdecoder.c: - * sys/nvcodec/gstnvh264dec.c: - nvdec: Accept progressive-high and contrained-high profiles - They're subsets of the high profiles with no interlacing and - no B-frames for constrained - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1634> - -2020-09-28 13:33:00 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - * gst-libs/gst/codecparsers/gstav1parser.h: - codecparsers: av1: add the set_operating_point() API. - The av1 can support multi layers when scalability is enabled. We - need an API to set the operating point and filter the OBUs just - belonging to some layers(the layers are specified by the operating - point). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-10-09 16:13:28 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - * gst-libs/gst/codecparsers/gstav1parser.h: - codecparsers: av1: Add an API to reset the annex_b state only. - In practice, we encounter streams that have one or more temporal units - error. When that kind of error temporal units is in annex b format, the - whole temporal unit should be discarded. - But the temporal units before it are correct and can be used. More - important, because of the error temporal unit, the parser is in a wrong - state and all later temporal unit are also parsed uncorrectly. - We need to add this API to reset the annex_b state only when we meet - some temporal unit error. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-10-09 16:01:35 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - codecparsers: av1: clean the seen_frame_header in parse_tile_group(). - The current seen_frame_header is not cleaned correctly. According - to the spec, it should be cleaned when tiles are parsed completely. - Also delete a verbose seen_frame_header init in reset_state(). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-09-29 13:15:37 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - codecparsers: av1: fix a typo in parse_metadata_scalability - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-09-28 18:22:08 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - codecparsers: av1: Do not assert in identify_one_obu when check annex b size. - Some buggy stream just writes the wrong temporal unit and frame size in - the stream. We should return failure rather than assert to abort. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-09-22 19:16:30 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.h: - codecparsers: av1: Add unknow AV1 profile define for saint check. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-07-24 14:54:37 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - * gst-libs/gst/codecparsers/gstav1parser.h: - codecparsers: av1: Improve the parse_tile_info. - 1. store more tile info when parse tile group. - The column, row, tile offset and tile data size are all useful for - decoder process, especially for HW kind decoder such as VAAPI dec. - Also fix the tile group skip size for each tile data. - 2. No min_inner_tile_width requirement in newest spec. - 3. Calculate the sbs of each tile for both uniform tile and non-uniformi - tile. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-07-28 17:25:44 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - codecparsers: av1: Fix a tile info read typo in frame header. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-08-25 19:44:48 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - codecparsers: av1: Fix a typo when get value of segmentation params. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-08-25 16:33:26 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - * gst-libs/gst/codecparsers/gstav1parser.h: - codecparsers: av1: add valid check for global motion params. - The global motion params and its matrix values need to be verified - before we use them. If it is invalid, we should notify the decoder - that it should not be used. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-08-25 15:25:56 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - codecparsers: av1: uint8 range is not enough for av1_bitstreamfn_ns - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-08-25 15:25:06 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.h: - codecparsers: av1: delete duplicated GST_AV1_GM_ABS_ALPHA_BITS define. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-08-27 21:33:14 +0800 He Junyan <junyan.he@intel.com> - - * tests/check/libs/av1parser.c: - test: av1parser: update the test result because of bug fixing. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-08-24 15:29:56 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - * gst-libs/gst/codecparsers/gstav1parser.h: - codecparsers: av1: Improve the loop filter setting. - 1. loop_filter_ref_deltas should be int because it needs to compare - with 0. - 2. Move the loop filter init logic to setup_past_independence() and - load_previous(), which make it more precise with the spec. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-08-14 14:40:49 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - codecparsers: av1: Fix a error report for metadata obu. - The metadata OBUs, for example, ITUT_T35 has an undefined payload such - as itu_t_t35_payload_bytes field in AV1 spec, which may cause the failure - of parsing the trailings bits. We can give a warning and ignore this kind - of errors. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-07-28 15:06:04 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - codecparsers: av1: Fix a level index bug in sequence. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-07-24 12:49:10 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstav1parser.c: - * gst-libs/gst/codecparsers/gstav1parser.h: - codecparsers: av1: all ref idx should be gint8. - All the ref index need to compare with 0 in reference index decision - algorithm. We also need to init them to -1. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1464> - -2020-11-14 18:48:05 +0900 Seungha Yang <seungha@centricular.com> - - * sys/va/gstvah264dec.c: - va: h264dec: Add support for interlaced stream - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1812> - -2020-11-16 16:29:04 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: h264dec: implement gst_va_h264_dec_new_field_picture() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1812> - -2020-11-14 20:46:30 +0900 Seungha Yang <seungha@centricular.com> - - * sys/va/gstvah264dec.c: - va: h264dec: Fix picture_height_in_mbs_minus1 - Fix for interlaced stream (when sps->frame_mbs_only_flag is equal to one) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1812> - -2020-11-16 16:29:46 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: h264dec: admit baseline if stream obeys A.2 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1812> - -2020-11-15 00:20:54 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - codecs: h264decoder: Add support for field ref picture list modification - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1812> - -2020-11-17 18:39:56 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - * sys/va/gstvah264dec.c: - codecs: h264decoder: Add more option arguments for reference picture getter - In case that "pic_order_cnt_type" is equal to zero, ref picture - list for B slice should not include non-existing picture - as per spec 8.2.4.2.3. And, the second field is not needed - for the process of frame picture reference list construction - since it needs to be frame unit, not field picture in that case. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1812> - -2020-11-17 18:59:35 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264decoder: Split gap picture as well if needed - field pair pictures might be required for reference list - depending on context. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1812> - -2020-11-05 18:09:06 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - h264dec: Fix POC calculation for type 0 - This is mostly for future use as it only fixes the caclulation for interlaced - cases, the case of frame seemed correct already. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1812> - -2020-11-17 03:11:46 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Don't try to construct RefPicList0 and RefPicList1 if not required - We were trying to construct reference picture list even for - I slice before this commit. Reference list is required only for - P, SP and B slices. Also, if all existing reference pictures - are gap pictures, we don't need to construct lists. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1812> - -2020-11-03 01:59:46 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvapool.c: - va: pool: Check the force_videometa for all memory types. - force_videometa should mean that the buffer must use video meta to - map correctly. When the stride or the offset of the alloc_info is - different from the src caps, the downstream must use video meta. - So this flag should not link with the RAW caps only. All kinds of - caps(memory:VAMemory, memory:DMABuf) should have this flag. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1711> - -2020-11-17 00:18:22 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvabasedec.c: - * sys/va/gstvabasedec.h: - va: basedec: Improve the decide_allocation(). - In decide_allocation(), we now just use the other_pool for frames - copy when the src caps is raw. This can make the logic a little - clear. There is no need for us to check the alignment and video - meta again. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1711> - -2020-11-16 23:53:39 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvabasedec.c: - va: basedec: fallback to system memory if downstream caps is any. - When the downstream element reports an ANY caps, and it also fails to - support VideoMeta, we should fallback to the system memory. - Note: the basetransform kind elements never return valid allocation - query before set_caps(). So, if a basetransform return an ANY sink - caps, we always fallback to system memory for it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1711> - -2020-11-16 04:38:28 +0900 Seungha Yang <seungha@centricular.com> - - * sys/va/gstvah264dec.c: - vah264dec: Fix for long term reference picture signalling - Allocate a GArray which is used to fill - VAPictureParameterBufferH264.ReferenceFrames (called per frame), - instead of alloc/free per frame. - Also this commit is to fix the condition where long-term reference - picture is needed for VAPictureParameterBufferH264.ReferenceFrames - entry. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1813> - -2020-11-15 03:41:27 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264decoder: Fix MMCO type 1 for interlaced stream - If field_pic_flag of current picture is equal to zero, - both field of reference field pair should be marked as - "unused for reference" - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1810> - -2020-11-15 02:59:24 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264decoder: Fix MMCO type 3 for interlaced stream - Depending on short-ref picture corresponding to picNumX value, - there's a condition that only one field should be updated to - be non-reference picture. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1810> - -2020-11-15 00:55:09 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Split frame picture into field pictures if needed - In case of interlaced stream, frame pictures need to be splitted - into field for reference marking process. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1810> - -2020-11-16 00:27:28 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264decoder: Add util macro for frame/field picture identification - Add a macro to check whether given GstH264Picture is for frame or field - decoding. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1810> - -2020-11-16 20:44:06 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Prefer full color range for display target colorspace - We don't need to preserve input color range for transformed target - color space. Also some GPUs doesn't seem to be happy with 16-235 - color range for RGB color space. - Also, since our default display target color space is - DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709, choosing full color range - would make more sense. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1814> - -2020-08-15 02:02:44 +1000 Jan Schmidt <jan@centricular.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - wpe: Don't crash when running on X11. - Don't assume the available EGL display is a wayland display - - instead, check the the GStreamer GL context is EGL, and then - use gst_gl_display_egl_from_gl_display to create a - GstGLDisplayEGL from that, which also adds refcounting - around the underlying EGLDisplay. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1385 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1752> - -2020-11-13 20:25:36 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: dmabuf: log unknown surface format - It is possible that surface format is not assigned, keeping its default - GStreamer value: unknown, but gst_video_format_to_string() doesn't print - unknown format, so this patch does it manually. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1811> - -2020-11-13 20:20:47 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: dmabuf: destroy VASurface if no pooled buffer - When gst_va_dmabuf_allocator_setup_buffer_full() receives info (not NULL) it is - supposed that this buffer is not part of the allocator pool, so it has to be - de-allocated as soon it is freed. - This patch sets the destroy notify of the assigned GstVaBufferSurface if info is - not NULL. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1811> - -2020-11-14 03:20:19 +0900 Seungha Yang <seungha@centricular.com> - - * sys/va/gstvah264dec.c: - vah264dec: Allow missing reference picture - baseclass might provide reference picture list with null picture. - Ensure picture before filling picture information. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1809> - -2020-11-14 03:16:07 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Don't give up to decode due to missing reference picture - Missing reference picture is very common thing for broken/malformed stream. - Decoder should be able to keep decoding if it's not a very critical error. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1809> - -2020-11-13 17:50:03 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtsdemux: Fix off by one error - Turns out timestamps of zero are valid :) Fixes issues with streams where the - PTS/DTS would be equal to the first PCR. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1807> - -2020-11-06 02:45:21 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp8dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11h264dec: Add support for interlaced stream - Add support for interlaced stream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1534> - -2020-11-10 01:28:03 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264decoder: Add support for interlaced stream - Initial support for interlaced stream. Subclass should implement - new_field_picture() vfunc. Otherwise, baseclass will assume that - subclass doesn't support interlaced stream. - Restrictions: - * Reference picture modification process for interlaced stream - is not implemented yet - * PAFF (Picture Adaptive Frame Field) is not properly implemented. - * Field display ordering (e.g., top-field-first) decision should - be enhanced via picture timing SEI parsing - * Gap in field picture should be handled - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1534> - -2020-11-05 04:16:54 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264decoder: Rename DPB methods - Clarify wheter it's for picture(field) or frame in order to - support interlaced stream, because DPB size is frame unit, not picture - in case of interlaced stream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1534> - -2020-11-05 03:47:35 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - codecs: h264decoder: Remove interlaced stream related constraints - ... and add new_field_picture() vfunc so that ensure interlaced - decoding support by subclass. - The method will be used later with interlaced stream support. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1534> - -2020-11-12 23:49:01 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.h: - codecs: h264decoder: Move to inline GstH264DecoderClass documentation - Don't duplicate documentation for class vfunc. Hotdoc doesn't seem - to be happy with duplicated documentation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1534> - -2020-11-06 01:45:36 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/nvcodec/gstnvh264dec.c: - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/va/gstvah264dec.c: - codecs: h264decoder: Store reference picture type using enum value - Managing reference picture type by using two variables - (ref and long_term) seems to be redundant and that can be - represented by using a single enum value. - This is to sync this implementation with gstreamer-vaapi so that - make comparison between this and gstreamer-vaapi easier and also - in order to minimize the change required for subclass to be able - to support interlaced. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1534> - -2020-11-11 01:56:52 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264decoder: Minor documentation fix - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1534> - -2020-11-13 23:18:20 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Remove DPB size related spammy debug message - It's not informative at all if SPS wasn't updated. Also we are printing - DPB size related debug message in another place already. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1806> - -2020-11-12 22:27:08 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: try harder to update timecode - NumClockTS is the maximum number of timecodes the pic_timing SEI - can carry, but it is perfectly OK for it to carry fewer, and have - one of the clock_timestamp_flags set to 0. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1804> - -2020-11-12 22:32:00 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix installing of update-timecode property - Simply fixes a typo that did not have any adverse effect, - and avoid hardcoding initializer - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1805> - -2020-11-12 19:43:22 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Don't fill gap picture if it's not allowed - We should fill gap picture only if sps->gaps_in_frame_num_value_allowed_flag - is set. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1801> - -2020-04-16 10:06:29 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * ext/openjpeg/gstopenjpegenc.c: - openjpegenc: store stripe offset when encoding image - The decoder can simply read this offset after decoding - to know where to blit the stripe to the full frame - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1800> - -2020-03-24 09:15:30 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * ext/openjpeg/gstopenjpegenc.c: - * ext/openjpeg/meson.build: - openjpegenc: take subsampling into account when calculating stripe height - We calculate minimum of (stripe height * sub sampling) across all components - to ensure that all component dimensions are consistent with sub-sampling. - The last stripe for each component is simply the remaining height. - limit wavelet resolutions for "thin" stripes - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1800> - -2020-03-12 13:41:40 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/openjpeg/gstopenjpegenc.c: - openjpegenc: fix memory leak from mstream - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1800> - -2020-01-13 14:00:38 -0500 Aaron Boxer <aaron.boxer@collabora.com> - - * ext/openjpeg/gstopenjpegenc.c: - openjpegenc: fail negotation in handle_frame if alignment mismatch - If encoder is in stripe mode, then downstream must also support stripe - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1800> - -2020-11-12 21:46:59 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvdecoder.c: - * sys/nvcodec/gstnvdecoder.h: - * sys/nvcodec/gstnvh264dec.c: - * sys/nvcodec/gstnvh265dec.c: - * sys/nvcodec/gstnvvp8dec.c: - * sys/nvcodec/gstnvvp9dec.c: - nvcodec: Fix various typo - Not sure where the DECOCER came from - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1803> - -2020-11-12 13:33:26 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvabasedec.c: - * sys/va/gstvapool.c: - va: comments to explain code - There are a couple part where code seems, at least to me, a bit oscure or - confusing. So let's better add an explanation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1802> - -2020-11-10 14:48:28 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Don't calculate bitrate for header/index fragments - They are generally substantially smaller than regular fragments, and therefore - we end up pushing totally wrong bitrates downstream. - Fixes erratic buffering issues with DASH introduced by - 66f5e874352016e29f555e3ce693b23474e476db - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1021> - -2020-11-09 11:41:10 +0100 Edward Hervey <edward@centricular.com> - - * ext/dash/gstdashdemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Store QoS values on the element - Storing it per-stream requires taking the manifest lock which can apparenly be - hold for aeons. And since the QoS event comes from the video rendering thread - we *really* do not want to do that. - Storing it as-is in the element is fine, the important part is knowing the - earliest time downstream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1021> - -2020-11-10 14:48:28 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Don't calculate bitrate for header/index fragments - They are generally substantially smaller than regular fragments, and therefore - we end up pushing totally wrong bitrates downstream. - Fixes erratic buffering issues with DASH introduced by - 66f5e874352016e29f555e3ce693b23474e476db - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1786> - -2020-11-11 18:07:57 +0100 Edward Hervey <edward@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Don't double-free variant streams on errors - If an error happened switching to a new variant, we switch back to the previous - one ... except it will be unreffed when settin git. - In order to avoid such issues, keep a reference to the old variant until we're - sure we don't need it anymore - Fixes cases of double-free on variants and its contents - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1799> - -2020-11-12 00:42:59 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gstvp8decoder.c: - * gst-libs/gst/codecs/gstvp8decoder.h: - codecs: vp8decoder: Fix two typo of struct name. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1797> - -2020-10-27 19:53:44 +0530 Sanchayan Maity <sanchayan@asymptotic.io> - - * sys/bluez/gsta2dpsink.c: - gsta2dpsink: Fix GstPad leak - The sinkpad returned by a call to gst_element_get_static_pad needs to be - unrefed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1621> - -2020-09-30 17:12:04 +0530 Arun Raghavan <arun@asymptotic.io> - - * docs/plugins/gst_plugins_cache.json: - * sys/bluez/gsta2dpsink.c: - bluez: a2dpsink: Add support for LDAC to a2dpsink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1621> - -2020-09-30 13:28:08 +0530 Arun Raghavan <arun@asymptotic.io> - - * docs/plugins/gst_plugins_cache.json: - * sys/bluez/a2dp-codecs.h: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtputil.c: - bluez: avdtpsink: Add support for LDAC to avdtpsink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1621> - -2020-09-18 17:35:24 +0530 Sanchayan Maity <sanchayan@asymptotic.io> - - * ext/ldac/gstldacenc.c: - * ext/ldac/gstldacenc.h: - * ext/ldac/ldac-plugin.c: - * ext/ldac/meson.build: - * ext/meson.build: - * meson_options.txt: - ext: Add LDAC encoder - LDAC is an audio coding technology developed by Sony that enables the - transmission of High-Resolution (Hi-Res) audio contents over Bluetooth. - Currently Adaptive Bit Rate (ABR) as supported by libldac encoder is not - implemented. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1621> - -2020-11-11 18:21:25 +0900 Seungha Yang <seungha@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Set duration on seeking query if possible - Set duration on seeking query in the same way as duration query handler. - Otherwise application might get confused as if the duration is unknown. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1791> - -2020-11-11 13:39:37 +0200 Raul Tambre <raul@tambre.ee> - - * ext/webrtc/meson.build: - webrtc: Update libnice version requirement to 0.1.17 - Since !1366 nice_agent_get_sockets() is used, which requires 0.1.17. - Update the version requirement accordingly. - Fixes #1459. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1792> - -2020-11-03 17:48:02 +0100 Edward Hervey <edward@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Re-use streams if possible - When switching variants, try to re-use existing streams/pads instead of creating - new ones. When dealing with urisourcebin and decodebin3 this is not only the - expected way but also avoids a lot of buffering/hang issues. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1757> - -2020-11-04 10:36:21 +0100 Edward Hervey <edward@centricular.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - m3u8: Make a debug function usable elsewhere - The rest of the code might want to use this - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1757> - -2020-07-12 00:18:38 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/qroverlay/gstdebugqroverlay.c: - qroverlay: Generate documentation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730> - -2020-07-12 00:03:04 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/qroverlay/gstdebugqroverlay.c: - * ext/qroverlay/gstdebugqroverlay.h: - * ext/qroverlay/gstqroverlay.c: - * ext/qroverlay/gstqroverlay.h: - * ext/qroverlay/meson.build: - qroverlay: Add a qroverlay element that allows overlaying any data - This moves `gstqroverlay.c` to `gstdebugqroverlay.c` and implements - a simple `gstqroverlay` element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730> - -2020-07-11 23:43:01 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/qroverlay/gstqroverlay.c: - * ext/qroverlay/gstqroverlay.h: - qroverlay: Rename qroverlay to debugqroverlay - The element is specially focus on debugging purposes and not a generique QR overlay - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730> - -2020-07-11 23:36:03 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/qroverlay/gstqroverlay.c: - * ext/qroverlay/gstqroverlay.h: - * ext/qroverlay/meson.build: - qroverlay: Factor out qroverlay logic to a base class - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730> - -2020-07-11 23:35:55 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/qroverlay/gstbaseqroverlay.c: - * ext/qroverlay/gstbaseqroverlay.h: - qroverlay: Factor out qroverlay logic to a base class - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730> - -2020-07-11 23:06:16 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/qroverlay/gstqroverlay.c: - * ext/qroverlay/gstqroverlay.h: - qroverlay: Make subclassable - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730> - -2020-07-11 20:42:51 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/qroverlay/gstqroverlay.c: - * ext/qroverlay/gstqroverlay.h: - * ext/qroverlay/meson.build: - qroverlay: Port to VideoFilter - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730> - -2020-07-11 15:04:57 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/qroverlay/gstqroverlay.c: - qroverlay: Make default pizel-size 3 - Otherwise zbar isn't able to read the produced qrcodes - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730> - -2020-07-09 14:14:45 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/qroverlay/gstqroverlay.c: - * ext/qroverlay/gstqroverlay.h: - * ext/qroverlay/meson.build: - qroverlay: Cleanup the way we build the json using json-glib - And reindent the .h file removing tabs - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730> - -2020-07-09 13:05:20 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/qroverlay/gstqroverlay.c: - * ext/qroverlay/gstqroverlay.h: - qroverlay: Fix copyright - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730> - -2020-07-09 12:51:23 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/qroverlay/gstqroverlay.c: - qroverlay: Fix some warnings - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730> - -2020-07-09 12:49:51 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/qroverlay/gstqroverlay.c: - * ext/qroverlay/gstqroverlay.h: - qroverlay: Minor renaming and documentation fixes - Matching usual namings - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730> - -2020-07-09 12:37:55 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/meson.build: - * ext/qroverlay/gstqroverlay.c: - * ext/qroverlay/gstqroverlay.h: - * ext/qroverlay/meson.build: - * meson_options.txt: - qroverlay: Import from gst-qroverlay - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730> - -2020-10-30 23:22:01 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvdecoder.c: - * sys/nvcodec/gstnvvp9dec.c: - * sys/nvcodec/gstnvvp9dec.h: - * sys/nvcodec/meson.build: - * sys/nvcodec/plugin.c: - nvcodec: Add VP9 stateless decoder element - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1738> - -2020-10-30 21:20:57 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvdecoder.c: - * sys/nvcodec/gstnvdecoder.h: - * sys/nvcodec/gstnvh264dec.c: - * sys/nvcodec/gstnvh265dec.c: - * sys/nvcodec/gstnvvp8dec.c: - nvcodec: nvdecoder: Move to refcount based GstNvDecoderFrame - This refcount based way would be helpful for sharing nvdec frame among - multiple codec pictures and later zero-copy use case. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1738> - -2020-10-30 23:38:15 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvdecoder.h: - nvcodec: nvdecoder: Get rid of G_GNUC_INTERNAL - default is visibility=hidden. Don't need to use G_GNUC_INTERNAL - for new code therefore. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1738> - -2020-10-30 20:37:44 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvvp8dec.c: - * sys/nvcodec/gstnvvp8dec.h: - * sys/nvcodec/meson.build: - * sys/nvcodec/plugin.c: - nvcodec: Add VP8 stateless decoder element - Like other nvcodec stateless decoders, the rank of this new nvvp8sldec - element will be secondary for now. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1738> - -2020-10-30 23:26:49 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/plugin.c: - nvcodec: nvsldec: Fix typo in debug message - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1738> - -2020-11-09 18:27:14 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Handle PCR issues with adaptive streams - A lot of content producers out there targetting "adaptive streaming" are riddled - with non-compliant PCR streams (essentially all the players out there just use - PTS/DTS and don't care about the PCR). - In order to gracefully cope with these, we detect them appropriately and any - small (< 15s) PCR resets get gracefully ignored. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1785> - -2020-10-30 14:07:02 +0000 Julian Bouzas <julian.bouzas@collabora.com> - - * sys/nvcodec/gstcudautils.c: - nvcodec: leave g_once_init when all quarks are initialized - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1782> - -2020-11-09 23:22:09 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264decoder: Fix missing drain handling in bumping - Should've included in the commit 5527cc4a2e7ce8eeee1d8a717f99252477d6015f - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1783> - -2020-11-09 23:04:32 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Try reference picture marking process in any case - ... even if there is some invalid conditions - (because of broken stream, our implementation fault or so). - Otherwise baseclass will keep such reference pictures and - it would result to DPB full. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1783> - -2020-11-09 11:44:36 +0100 Edward Hervey <edward@centricular.com> - - * tests/examples/mpegts/ts-parser.c: - examples: Properly handle extended descriptors - By checking the extended tag. Provides a bit more information (if extended tag - is known) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1781> - -2020-11-08 19:08:25 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11h264dec.c: - d3d11h264dec: Fix for MbaffFrameFlag and FrameNumList - As per spec 7.4.3 Slice header semantics, the flag value is derived as - MbaffFrameFlag = (mb_adaptive_frame_field_flag && !field_pic_flag) - and DXVA uses the value. - Regarding FrameNumList, in case of long-term ref, FrameNumListi - value should be long_term_frame_idx not long_term_pic_num. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1780> - -2020-11-05 19:30:35 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264decoder: Reset frame number per MMCO type 5 - It should be cleared so that avoid wrong frame gap detection - for following pictures. - Passing 4 more conformance bitstream tests - * MR2_TANDBERG_E - * MR3_TANDBERG_B - * MR4_TANDBERG_C - * MR5_TANDBERG_C - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1768> - -2020-11-05 18:42:37 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264decoder: Fix for MMCO type 2 - As per 8.2.5.4.2, we should mark a picture which has - LongTermPicNum == long_term_pic_num as "unused for reference", - not pic_num. - Passing conformance bitstream test with MR2_MW_A - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1768> - -2020-11-05 18:27:11 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264picture: Add more trace log - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1768> - -2020-11-05 13:30:49 +0000 Jason Pereira <mindriot88@users.noreply.github.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/decklink/gstdecklink.cpp: - decklink: correct framerate 2KDCI 23.98 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1771> - -2020-11-05 09:11:03 +0100 Rafostar <40623528+Rafostar@users.noreply.github.com> - - * gst-libs/gst/player/gstplayer.c: - doc: player: mention that get_pipeline method needs unref - All other methods in docs clearly mention that an unref is needed, so should `get_pipeline()`. #1450 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1764> - -2020-11-05 09:01:47 +0100 Rafostar <40623528+Rafostar@users.noreply.github.com> - - * gst-libs/gst/player/gstplayer.c: - player: call ref_sink on pipeline - Otherwise `gst_player_get_pipeline()` will return a floating reference which may confuse bindings and lead to crash. - Fixes #1450 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1763> - -2020-11-04 18:43:41 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson.build: - meson: Enable some MSVC warnings for parity with GCC/Clang - This makes it easier to do development with MSVC by making it warn - on common issues that GCC/Clang error out for in our CI configuration. - Continuation from https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/223 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1760> - -2020-10-21 09:01:31 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/va/gstvabasedec.h: - * sys/va/gstvah265dec.c: - * sys/va/gstvah265dec.h: - * sys/va/meson.build: - * sys/va/plugin.c: - va: Add HEVC decoding support - This add HEVC decoding support into the new VA plugin. This implementation has - been tested using the ITU comformance test (through fluster). It fails all - MAIN10 tests, as this is not implemented yet along with the following: - CONFWIN_A_Sony_1 (looks fine, but md5sum is incorrect) - PICSIZE_A_Bossen_1 (height too high) - PICSIZE_B_Bossen_1 (same) - VPSSPSPPS_A_MainConcept_1 (parser issue) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1714> - -2020-11-03 16:05:48 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: Fix wrong warning message - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1714> - -2020-11-03 11:23:15 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - h265decoder: Remove unsued WpOffsetHalfRangeC - This is only needed for VA implementation of weight tables and isn't used - within the base class. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1714> - -2020-11-02 00:08:04 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264decoder: Rework for DPB management - Sync with recent h265decoder DPB implementation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1761> - -2020-11-04 18:47:30 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264decoder: Remove unused pts variable - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1761> - -2020-11-03 14:12:45 +0900 youngh.lee <youngh.lee@lge.com> - - * gst/aiff/aiffparse.c: - aiffparse: Also set a channel mask for 2 channels - And only do add debug output at FIXME level when using the fallback - channel mask, not for those defined in the AIFF spec. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1756> - -2020-06-23 10:29:42 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/icestream.c: - * ext/webrtc/nicetransport.c: - * ext/webrtc/nicetransport.h: - webrtc: Add properties to change the socket buffer sizes to ice object - libnice doesn't touch the kernel buffer sizes. When dealing with RTP data, - it's generally advisable to increase them to avoid dropping packets locally. - This is especially important when running multiple higher bitrate streams at - the same time. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1366> - -2020-11-03 02:22:23 +1100 Jan Schmidt <jan@centricular.com> - - * ext/vulkan/vkdeviceprovider.c: - vkdeviceprovider: Avoid deadlock on physical device - Don't hold the object lock on the vk physical device while - constructing a GstVulkanDevice around it, as - GstVulkanDevice can make calls on the physical device that - require the object lock. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1754> - -2020-11-03 02:14:21 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth265picture.c: - codecs: h265picture: Minor update for coding style - It's GstH265Dpb, not GstH265Decoder - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1755> - -2020-11-03 01:53:15 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gsth265picture.c: - * gst-libs/gst/codecs/gsth265picture.h: - codecs: h265decoder: Make GstVideoCodecFrame hold the last reference of the buffer - The functionality of passing the last reference of GstH265Picture - was silently dropped by the commit eeffd91109a409063e866337452eedd392649775 - This commit will make it work again. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1755> - -2020-11-03 01:41:13 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - codecs: h265decoder: Clear GstVideoCodecFrame on DPB clear if needed - h265decoder might need to clear DPB depending on context even if - it's not flushing case. So associated GstVideoCodecFrame needs to be - released in case non-flushing case. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1755> - -2020-11-03 00:57:46 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - codecs: h265decoder: Don't drain DPB on EOB/EOS/IDR nalu - DPB bumping decision per end-of-bitstream, end-of-sequence or IDR nal - should done by spec. In short, draining on EOB/EOS/IDR is undefined - behavior as per spec. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1755> - -2020-11-01 18:32:56 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - h265decoder: Complete dependent slice header - This will save the last independent slice and fill in the missing - information for dependent slices. This was left over during the porting - from gstreamer-vaapi. The private variable prev_independent_slice was - already there. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1750> - -2020-11-01 18:30:34 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - h265decoder: Prevent possible infinite loop - Theoretically, one could produce a broken stream that would lead to - infinite in the specified algorithm to calculate l0/l1 reference lists. - This patch will pearly exit if this condition is met. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1750> - -2020-10-22 12:38:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - h265parse: Add missing const qualifier - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1750> - -2020-11-02 22:47:20 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - Revert "d3d11decoder: Use D3D11/DXGI standard colorimetry" - This reverts commit a52fc6deeda203add520cb59ae0026d109ecda95. - The change breaks H264/HEVC conformance bitstream tests - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1753> - -2020-11-02 08:46:25 +0000 Randy Li <ayaka@soulik.info> - - * ext/wayland/wlvideoformat.c: - wlvideoformat: fix DMA format convertor - In the most of case, this typo would work. But for - ARGB8888 and XRGB8888, which shm format is not based on fourcc, - which would never appear in format enumeration. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1751> - -2020-11-01 03:58:30 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Use D3D11/DXGI standard colorimetry - D3D11/DXGI supports smaller set of colorimetry than all possible - combination. This restriction would make more streams convertible - by using ID3D11VideoProcessor - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1743> - -2020-10-31 03:28:55 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Use ID3D11VideoProcessor only if device supports corresponding conversion - ... and drop support for ID3D11VideoProcessor if device doesn't - support ID3D11VideoContext1 interface and therefore we cannot - query conversion supportability. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1743> - -2020-11-01 20:52:11 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - d3d11h{264,265}dec: Submit picture level parameters only once - Submit PICTURE_PARAMETERS and INVERSE_QUANTIZATION_MATRIX - buffers only once per picture. Multiple submission is redundant. - Also this modification would fix broken hevc decoding with - dependent slice. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1749> - -2020-10-31 20:36:13 +0900 Seungha Yang <seungha@centricular.com> - - codecs: h265decocer: Rework for DPB management - * Move all DPB bumping process into GstH265Dpb internal - * Handle DPB add process in GstH265Dpb struct - * Make implementation to be 1:1 mappable with hevc specification - * Fix wrong DPB bumping implementation especially when no_output_of_prior_pics_flag - was specified. - With fixes from Nicolas Dufresne <nicolas.dufresne@collabora.com> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1748> - -2020-10-31 20:31:51 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp8dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Get rid of framerate field from pad template - Framerate is optional value and we don't have any framerate - related restriction for those elements. This commit is to fix - negotiation failure when upstream doesn't set framerate on caps. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1747> - -2020-10-31 21:46:16 +1100 Jan Schmidt <jan@centricular.com> - - * tests/check/elements/dtls.c: - tests: Don't set dtlsenc state before linking. - Link the dtlsenc in the testsuite before setting it to paused, as it - starts a pad task that can generate a not-linked error otherwise. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1744> - -2020-10-31 01:23:36 +1100 Jan Schmidt <jan@centricular.com> - - * tests/check/elements/dtls.c: - dtls: Catch bus errors and fail instead of hanging. - If the DTLS elements fail, they post a bus error and don't signal any - key negotiation. Catch the bus error and fail the test early instead - of letting it hang and time out. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1741> - -2020-10-30 22:52:18 +1100 Jan Schmidt <jan@centricular.com> - - * ext/sctp/gstsctpdec.c: - * ext/sctp/gstsctpenc.c: - sctp: Do downward state change logic after chaining up. - Call the parent state_change function first when changing state - downward, to make sure that the element has stopped before cleaning - it up. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1741> - -2020-10-30 22:49:22 +1100 Jan Schmidt <jan@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - dtls: Avoid bio_buffer assertion on shutdown. - On shutdown, a previous iteration of dtsl_connection_process() - might be incomplete and leave a partial bio_buffer behind. - If the DTLS connection is already marked closed, drop out - of dtls_connection_process early without asserting. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1741> - -2020-10-30 16:31:18 +1100 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: Fix a race on shutdown. - The main context can disappear in gst_webrtc_bin_enqueue_task() - between checking the is_closed flag and enqueueing a source on the - main context. Protect the main context with the object lock instead - of the PC lock, and hold a ref briefly to make sure it stays alive. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1741> - -2020-07-08 17:24:36 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/gstwebrtcice.h: - * ext/webrtc/meson.build: - * ext/webrtc/sctptransport.c: - * ext/webrtc/sctptransport.h: - * ext/webrtc/webrtctransceiver.c: - * ext/webrtc/webrtctransceiver.h: - webrtc: Set the DSCP markings based on the priority - This matches how the WebRTC javascript API works and the Chrome implementation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1707> - -2020-07-09 13:39:03 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/rtpsender.c: - * gst-libs/gst/webrtc/rtpsender.h: - rtpsender: Add API to set the priority - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1707> - -2020-07-09 13:42:35 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/webrtctransceiver.h: - rtptransceiver: Store the SSRC of the current stream - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1707> - -2020-07-08 19:13:33 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * gst-libs/gst/webrtc/rtptransceiver.h: - * gst-libs/gst/webrtc/webrtc_fwd.h: - webrtc: Save the media kind in the transceiver - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1707> - -2020-07-09 13:45:20 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Remove unused function - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1707> - -2020-10-02 21:38:00 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/rtpreceiver.h: - * gst-libs/gst/webrtc/rtpsender.h: - * gst-libs/gst/webrtc/rtptransceiver.h: - webrtc: Document more objects - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1707> - -2020-10-31 00:37:48 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Allow 10bits only profiles - HEVC_VLD_Main10 and VP9_VLD_10bit_Profile2 might not support - 8bit format (i.e., NV12) depending on GPU vendor. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1742> - -2020-10-25 13:33:21 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Remove \n from debug output - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1721> - -2020-10-25 13:32:26 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Correctly indent everything - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1721> - -2020-10-25 13:30:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink: Add a default profile id - This causes no changes to the profile but keeps the existing settings. - The profile can also be changed from e.g. the card's configuration - application and in that case probably should be left alone. - The default is the new value as it keeps the profile setting as it is, - which is consistent with the previous behaviour in 1.18. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1721> - -2020-10-25 13:14:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Mark internal function as static - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1721> - -2020-10-25 13:13:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Remove some dead code - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1721> - -2020-10-30 10:02:32 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Update enum value bounds check in gst_decklink_get_mode() - The widescreen modes moved after GST_DECKLINK_MODE_2160p60 and using - them now would cause an assertion. This is a regression from - 309f6187fef890c7ffa49305f38e89beac3b1423. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1737> - -2020-08-25 14:56:50 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/ttmlparse.c: - ttmlparse: Handle whitespace before XML declaration - When ttmlparse is in, e.g., an MPEG-DASH pipeline, there may be - whitespace between successive TTML documents in ttmlparse's accumulated - input. As libxml2 will fail to parse documents that have whitespace - before the opening XML declaration, ensure that any preceding whitespace - is not passed to libxml2. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1539> - -2020-08-25 14:54:31 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/ttmlparse.c: - ttmlparse: Ensure only single TTML doc parsed - The parser handles only one TTML file at a time, therefore if there are - multiple TTML documets in the input, parse only the first. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1539> - -2020-10-29 13:43:16 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gstamc.c: - amc: Fix crash when encoding AVC - gstamcvideoenc.c calls gst_amc_avc_profile_to_string() with alternatives - set to NULL which causes a crash. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1732> - -2020-03-19 15:07:47 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * ext/isac/gstisac.c: - * ext/isac/gstisacdec.c: - * ext/isac/gstisacdec.h: - * ext/isac/gstisacenc.c: - * ext/isac/gstisacenc.h: - * ext/isac/gstisacutils.c: - * ext/isac/gstisacutils.h: - * ext/isac/meson.build: - * ext/meson.build: - * meson_options.txt: - isac: add iSAC plugin - Wrapper on the iSAC reference encoder and decoder from webrtc, - see https://en.wikipedia.org/wiki/Internet_Speech_Audio_Codec - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1124> - -2020-10-28 11:49:54 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: Create the decodebin in _init - This way user can request pads right from the beginning - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1151> - -2020-10-25 18:04:05 +0000 Philippe Normand <philn@igalia.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: Accept more than one stream - Look-up the stream matching the given ID also after building the stream list - from the received collection. Without this change the transcoder would discard - the second incoming stream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1151> - -2020-03-20 09:27:48 -0300 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/transcode/gsttranscodebin.c: - * gst/transcode/gsturitranscodebin.c: - transcodebin: Port to decodebin3 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1151> - -2020-03-19 09:35:57 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder.c: - * gst/transcode/gsturitranscodebin.c: - uritranscodebin: Move to using a urisourcebin for our source. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1151> - -2020-03-19 09:34:54 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/transcoder/gsttranscoder.c: - transcoder: Base sync transcoding variant on a GMainLoop - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1151> - -2020-10-29 06:13:05 +0000 Randy Li <ayaka@soulik.info> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: release frame callback when destroyed - We would use a frame callback from the surface to indicate - that last buffer is rendered, but when we destroy the surface - and that callback is not back yet, it may cause the wayland event - queue crash. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1729> - -2020-10-28 19:00:43 +0900 Seungha Yang <seungha@centricular.com> - - * gst/rtmp2/gstrtmp2src.c: - rtmp2src: Set buffer timestamp on output buffer - This timestamp information would be useful for queue2 element - when calculating time level and also it makes buffering decision - more reliable. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1727> - -2020-10-28 00:47:49 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videoprocessor.c: - d3d11videoprocessor: Fix wrong input/output supportability check - The flag argument of ID3D11VideoProcessorEnumerator::CheckVideoProcessorFormat - method is output value, not input. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1726> - -2020-10-25 02:27:52 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvdecoder.c: - * sys/nvcodec/gstnvdecoder.h: - * sys/nvcodec/gstnvh264dec.c: - * sys/nvcodec/gstnvh265dec.c: - nvcodec: nvsldec: Add support for CUDA memory - Add CUDA memory support. Note that zero copying is not supported yet - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1720> - -2020-10-26 05:15:33 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11memory.c: - d3d11memory: Adjust log level for some spammy debug messages - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1723> - -2020-10-26 05:11:45 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - d3d11convert: Use ID3D11VideoProcessor only if device supports colorspace - Check whether conversion with given combination of input/output - format and dxgi colorspace is supported or not by driver. - If not, we should use shader. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1723> - -2020-10-26 05:09:40 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videoprocessor.c: - * sys/d3d11/gstd3d11videoprocessor.h: - d3d11videoprocessor: Add a method for device's conversion caps check - Add a wrapper method for - ID3D11VideoProcessorEnumerator1::CheckVideoProcessorFormatConversion. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1723> - -2020-10-26 05:04:55 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11format.c: - d3d11format: Map more colorimetry with dxgi colorspace - Map more logically identical set of GstVideoColorimetry formats - with dxgi color space. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1723> - -2020-10-25 23:13:46 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvapool.c: - va: pool: Set the video_alignment after we get image info. - The set_format() of the allocator may change the stride of the - alloc_info. We should update the video_align.stride_align based - on it. Or, we get a warning in gst_video_meta_validate_alignment(). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1698> - -2020-10-26 11:50:59 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah264dec.c: - va: h264dec: Set the padding to VideoAlignment's right. - In our va implemenation, we just use image's info to map the buffer. - The padding info just plays a role as a place holder to expand the - allocation size in caps when decoding size is bigger than display - size. So the padding_right or padding_left does not change the result. - But we find if using padding_left, it is hard to meet the requirement - of gst_video_meta_validate_alignment(), when the video meta's stride - is different from the allocation width. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1698> - -2020-10-26 01:22:12 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvabasedec.c: - va: basedec: No need to call base class' decide_allocation(). - We have already done the jobs in gst_va_base_dec_decide_allocation() - and no need to call base class' decide_allocation() again. The base - class' decide_allocation() will set_format() again and let use do the - image/surface testing again, which is low performance and no needed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1698> - -2020-10-20 14:31:22 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaallocator.c: - va: allocator: use _update_image_info() to set allocator parameters. - Use this standalone function to update the allocator info and make - all ensure_image() and mem_alloc() API clean. - We also change the default way of using image. We now set the non - derive manner as the default manner, and if it fails, then fallback - to the derived image manner. - On a lot of platforms, the derived image does not have caches, so the - read and write operations have very low performance. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1698> - -2020-10-20 14:09:35 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaallocator.c: - va: allocator: Add a helper function to update the image info. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1698> - -2020-10-19 23:32:44 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaallocator.c: - va: allocator: Decide the allocator's parameters when set_format(). - Moving the parameters testing and setting from the allocator_alloc_full() - to the allocator_try(). The allocator_alloc_full() will be called every - time when we need to allocate a new memory. But all these parameters such - as the surface and the image format, rt_format, etc, are unchanged during - the whole allocator lifetime. Just setting them in set_format() is enough. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1698> - -2020-10-18 17:59:44 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/meson.build: - opencv: allow compilation against 4.5.x - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1709> - -2020-03-24 09:18:28 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: sub-sampling parse should take component into account - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1653> - -2020-04-21 14:16:45 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: no pts interpolation with subframe. - The jpeg2000parser must not interpolate PTS with subframes. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1653> - -2020-01-13 14:01:19 -0500 Aaron Boxer <aaron.boxer@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: support frame and stripe alignment in caps - forward alignment and num-stripes caps properties - Use caps height when setting caps for subframe - We want downstream to use full frame height, not subframe height - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1653> - -2020-10-25 11:46:29 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Reset skip counters when starting the sources - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/378> - -2018-05-10 14:05:12 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink*src: Post a warning message on the bus about dropped frames - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/378> - -2017-11-28 13:44:18 +0100 Georg Lippitsch <glippitsch@toolsonair.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink*src: Aggregate dropped frame/packet logging - decklink*src currently prints a log entry for every dropped frame and - audio packet. That completely spams the logs. - This change aggregates information about dropped packets and only prints - a message once when dropping starts, and a summary when dropping ends. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/705 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/378> - -2020-10-24 20:59:55 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - d3d11memory: Protect view object with lock - Make resource allocation more thread-safe - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1718> - -2020-10-24 02:47:22 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11videoprocessor.c: - * sys/d3d11/gstd3d11videoprocessor.h: - d3d11convert: Add support for conversion using ID3D11VideoProcessor - Output texture of d3d11 decoder cannot have the bind flag - D3D11_BIND_SHADER_RESOURCE (meaning that it cannot be used for shader - input resource). So d3d11convert (and it's subclasses) was copying - texture into another internal texture to use d3d11 shader. - It's obviously overhead and we can avoid texture copy for - colorspace conversion or resizing via ID3D11VideoProcessor - as it supports decoder output texture. - This commit would be a visible optimization for d3d11 decoder with - d3d11compositor use case because we can avoid texture copy per frame. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1718> - -2020-10-24 02:33:29 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - d3d11memory: Store ID3D11VideoProcessorOutputView object - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1718> - -2020-10-23 22:29:57 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - codecs: h265decoder: Fix picture leaks because of reference set. - The last frame's reference set has no one to cleanup. We need to - clean all pictures in the stop() func. - We also add a helper function to cleanup all the pictures in the - reference picture set. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1717> - -2020-10-23 21:21:05 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - codecs: h265decoder: Fix 3 ref array leaks in finalize. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1717> - -2020-10-23 16:59:00 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videoprocessor.c: - * sys/d3d11/gstd3d11videoprocessor.h: - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Reuse ID3D11VideoProcessorInputView if possible - GstMemory object could be disposed if GstBuffer is not allocated - by GstD3D11BufferPool such as via gst_buffer_copy() and/or - gst_buffer_make_writable(). So attaching qdata on GstMemory - object would cause unnecessary view alloc/free. - By using view pool which is implemented in GstD3D11Allocator, - we can avoid redundant view alloc/free. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1716> - -2020-10-21 16:28:11 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - d3d11memory: Implement ID3D11VideoProcessorInputView pool - Similar to ID3D11VideoDecoderOutputView pool implementation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1716> - -2018-04-07 16:33:47 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/audio/meson.build: - * gst-libs/gst/codecparsers/meson.build: - * gst-libs/gst/insertbin/meson.build: - * gst-libs/gst/interfaces/meson.build: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/player/meson.build: - * gst-libs/gst/sctp/meson.build: - * gst-libs/gst/transcoder/meson.build: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/wayland/meson.build: - * gst-libs/gst/webrtc/meson.build: - * meson.build: - * pkgconfig/.gitignore: - * pkgconfig/gstreamer-bad-audio-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-audio.pc.in: - * pkgconfig/gstreamer-codecparsers-uninstalled.pc.in: - * pkgconfig/gstreamer-codecparsers.pc.in: - * pkgconfig/gstreamer-insertbin-uninstalled.pc.in: - * pkgconfig/gstreamer-insertbin.pc.in: - * pkgconfig/gstreamer-mpegts-uninstalled.pc.in: - * pkgconfig/gstreamer-mpegts.pc.in: - * pkgconfig/gstreamer-photography-uninstalled.pc.in: - * pkgconfig/gstreamer-photography.pc.in: - * pkgconfig/gstreamer-player-uninstalled.pc.in: - * pkgconfig/gstreamer-player.pc.in: - * pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in: - * pkgconfig/gstreamer-plugins-bad.pc.in: - * pkgconfig/gstreamer-sctp-uninstalled.pc.in: - * pkgconfig/gstreamer-sctp.pc.in: - * pkgconfig/gstreamer-transcoder-uninstalled.pc.in: - * pkgconfig/gstreamer-transcoder.pc.in: - * pkgconfig/gstreamer-vulkan-uninstalled.pc.in: - * pkgconfig/gstreamer-vulkan-wayland-uninstalled.pc.in: - * pkgconfig/gstreamer-vulkan-wayland.pc.in: - * pkgconfig/gstreamer-vulkan-xcb-uninstalled.pc.in: - * pkgconfig/gstreamer-vulkan-xcb.pc.in: - * pkgconfig/gstreamer-vulkan.pc.in: - * pkgconfig/gstreamer-wayland-uninstalled.pc.in: - * pkgconfig/gstreamer-wayland.pc.in: - * pkgconfig/gstreamer-webrtc-uninstalled.pc.in: - * pkgconfig/gstreamer-webrtc.pc.in: - * pkgconfig/meson.build: - Meson: Use pkg-config generator - -2020-07-30 20:23:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gsth265decoder.h: - * sys/d3d11/gstd3d11h265dec.c: - * sys/nvcodec/gstnvh265dec.c: - h265decoder: Add support for l0/l1 - Add support for reference list needed for VA-API and some V4L2 decoders. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1713> - -2020-07-28 18:37:38 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gsth265decoder.h: - * gst-libs/gst/codecs/gsth265picture.c: - * gst-libs/gst/codecs/gsth265picture.h: - * sys/d3d11/gstd3d11h265dec.c: - * sys/nvcodec/gstnvh265dec.c: - h265decoder: Sync with the H264 implementation - This ensures that we get the last reference to picture being outputed, - avoiding GstBuffer structure copies and simplifying the buffer management. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1713> - -2020-10-20 17:31:17 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp8dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Directly access ID3D11VideoDecoderOutputView for decoding - Decoder output view is stored in GstD3D11Memory object instead of - wrapper struct now. So qdata is no more required. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1712> - -2020-10-20 01:59:35 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - d3d11memory: Implement ID3D11VideoDecoderOutputView pool - Similar to texture-array pool, we can reuse decoder output view - since the life time of output view is identical to that of texture-array. - In this way, we can avoid frequent output view alloc/free. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1712> - -2020-10-04 23:39:05 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11memory.c: - d3d11memory: Move to GArray to store texture-array status - The size D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION is 2048 - which is too large in practice especially for a texture - of dpb - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1712> - -2020-10-12 19:20:10 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvabasedec.h: - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - * sys/va/gstvaprofile.c: - * sys/va/gstvavp9dec.c: - * sys/va/gstvavp9dec.h: - * sys/va/meson.build: - * sys/va/plugin.c: - va: Add VP9 decoder - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1702> - -2020-10-16 15:46:20 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/gstwpesrc.cpp: - wpe: Convert launch lines to markdown and move since tag - Seems like the examples don't appear in the generated docs because the Since tag - was badly positioned in the doc blurb. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1706> - -2020-10-16 10:35:36 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9picture.h: - codecs: vp9decoder: Add segmentation to picture. - VA-API needs AC and DC quant scales for both luma and chroma, and the loop - filter level for current frame, but these values are not available outside - the private GstVp9Parser structure. And these values may change from frame - to frame, so they are picture specific. - This patch add GstVp9Segmentation structure array to GstVp9Picture to expose - it to derived classes. This approach is safer than passing the parser at - picture handling flow. - Also, this patch, in order to solve Documentation CI, mark as private the - GstVp9Picture structure. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1700> - -2020-10-12 11:07:47 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.h: - * sys/d3d11/gstd3d11vp9dec.c: - codecs: vp9decoder: Pass parser as new_sequence() parameter. - In order to know the chroma format, besides profile, subsampling_x and - subsampling_y are needed (Spec 7.2.2 Color config semantics). These values are - in GstVp9Parser but not in GstVp9Framehdr. - Also, bit_depth is available in parser but not frame header. Evenmore, those - values are copied to picture structure later. - In case of VA-API, to configure the pipeline, it is require to know the chroma - format and depth. - It is possible to know chroma and depth through caps coming from vp9parser, but - it requires string parsing. It would be less error prone to get these values - through the parser structure at new_sequence() virtual method. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1700> - -2020-09-23 16:43:30 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rtp/gstrtpsrc.c: - rtpsrc: Cleanup on BYE, timeout or when pad is reused - In this patch, we enabled 'autoremove' feature of rtpbin and also call - 'clear-ssrc' on the rtpssrcdemux element when a pad is being reused. This - ensure that the jitterbuffer is removed and no threads accumulates. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1575> - -2020-09-04 14:18:13 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * gst/rtp/gstrtpsrc.c: - rtpsrc: re-use the same src pad for streams that have the same payload type - Also use payload type when naming pads, this will make it easier to identify - pads and simplify the code. - Fixes #1395 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1575> - -2020-06-03 01:26:12 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11compositor.c: - * sys/d3d11/gstd3d11compositor.h: - * sys/d3d11/gstd3d11compositorbin.c: - * sys/d3d11/gstd3d11compositorbin.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Introduce d3d11compositor element - Add new video composition element which is equivalent to compositor - and glvideomixer elements. When d3d11 decoder elements are used, - d3d11compositor can do efficient graphics memory handling - (zero copying or at least copying memory on GPU memory space). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1323> - -2020-08-05 17:27:30 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11shader.c: - d3d11shader: Allow drawing without shader resource view - ... for the case that we are rendering on target without input texture. - For example, we might want to draw arbitrary shape on render target view - without shader resource view. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1323> - -2020-08-03 03:19:34 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconvert.h: - * sys/d3d11/plugin.c: - d3d11convert: Add new subclasses for only color convert or resize - New d3d11colorconvert and d3d11scale elements will perform only - colorspace conversion and rescale, respectively. Those new elements - would be useful when only colorspace conversion or rescale is required - and the other part should be done by another elements. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1323> - -2020-08-01 20:16:52 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11colorconverter.h: - d3d11colorconverter: Allow setting alpha value to use - ... used for reordering case for now. In other words, non-alpha formats - such as NV12 is not supported case yet. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1323> - -2020-06-03 01:20:41 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11colorconverter.h: - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11overlaycompositor.c: - * sys/d3d11/gstd3d11shader.c: - * sys/d3d11/gstd3d11shader.h: - * sys/d3d11/gstd3d11window.cpp: - d3d11colorconverter: Add support conversion with blending - This is pre-work for d3d11compositor support - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1323> - -2020-06-03 00:59:15 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11colorconverter.h: - d3d11colorconverter: Add method to support updating destination rect - It's equivalent to GST_VIDEO_CONVERTER_OPT_DEST_* options of GstVideoConverter - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1323> - -2020-06-03 00:46:13 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11colorconverter.h: - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11overlaycompositor.c: - * sys/d3d11/gstd3d11overlaycompositor.h: - * sys/d3d11/gstd3d11window.cpp: - d3d11: Clarify target rect to be updated - Rename internal methods to clarify which rect (i.e., input or output) - should be updated - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1323> - -2020-10-02 10:02:38 -0400 Julian Bouzas <julian.bouzas@collabora.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - nvcodec: Report latency in decoder based on max-display-delay - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2020-10-02 09:22:34 -0400 Julian Bouzas <julian.bouzas@collabora.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - nvcodec: Add max-display-delay decoder property - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2020-09-24 11:25:33 -0400 Julian Bouzas <julian.bouzas@collabora.com> - - * sys/nvcodec/gstnvdec.c: - nvcodec: Fix compiler error if OpenGL is not enabled - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2020-09-24 10:33:58 -0400 Julian Bouzas <julian.bouzas@collabora.com> - - * sys/nvcodec/gstnvdecoder.c: - nvcodec: Add missing CUDAMemory src caps in h264 decoder - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2020-09-23 13:49:43 -0400 Julian Bouzas <julian.bouzas@collabora.com> - - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh265enc.c: - nvcodec: Add missing CUDAMemory sink caps in h264 and h265 encoders - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2020-09-22 13:07:19 -0400 Julian Bouzas <julian.bouzas@collabora.com> - - * sys/nvcodec/gstcudadownload.c: - nvcodec: Fix description of cudadownload element - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2019-08-11 15:02:04 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/elements/cudaconvert.c: - * tests/check/elements/cudafilter.c: - * tests/check/meson.build: - tests: Add CUDA filter unit tests - Adding a test for buffer meta and colorspace conversion - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2019-10-16 22:43:09 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstcudafilter.c: - * sys/nvcodec/gstcudascale.c: - * sys/nvcodec/gstcudascale.h: - * sys/nvcodec/meson.build: - nvcodec: Add CUDA video scale element - Add new element for video resizing using CUDA - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2019-10-16 22:42:55 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstcudabasefilter.c: - * sys/nvcodec/gstcudabasefilter.h: - * sys/nvcodec/gstcudaconvert.c: - * sys/nvcodec/gstcudaconvert.h: - * sys/nvcodec/gstcudafilter.c: - * sys/nvcodec/gstcudafilter.h: - * sys/nvcodec/meson.build: - * sys/nvcodec/plugin.c: - nvcodec: Add CUDA video convert element - Add new element for colorspace conversion using CUDA. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2019-10-16 22:42:39 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/cuda-converter.c: - * sys/nvcodec/cuda-converter.h: - * sys/nvcodec/gstcudacontext.c: - * sys/nvcodec/gstcudacontext.h: - * sys/nvcodec/gstcudaloader.c: - * sys/nvcodec/gstcudaloader.h: - * sys/nvcodec/meson.build: - * sys/nvcodec/stub/cuda.h: - nvcodec: Add generic CUDA video convert object - Introducing generic video convert object similar to video-converter - but using CUDA. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2019-10-16 22:42:24 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstcudanvrtc.c: - * sys/nvcodec/gstcudanvrtc.h: - * sys/nvcodec/gstnvrtcloader.c: - * sys/nvcodec/gstnvrtcloader.h: - * sys/nvcodec/meson.build: - * sys/nvcodec/stub/nvrtc.h: - nvcodec: Add support runtime CUDA kernel source compilation - Add util functions for runtime CUDA kernel source compilation - using NVRTC library. Like other nvcodec dependent libraries, - NVRTC library will be loaded via g_module_open. - Note that the NVRTC library naming is not g_module_open friendly - on Windows. - (i.e., nvrtc64_{CUDA major version}{CUDA minor version}.dll). - So users can specify the dll name using GST_NVCODEC_NVRTC_LIBNAME - environment. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2019-10-16 22:42:06 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstcudabasetransform.c: - * sys/nvcodec/gstcudabasetransform.h: - * sys/nvcodec/gstcudadownload.c: - * sys/nvcodec/gstcudadownload.h: - * sys/nvcodec/gstcudaupload.c: - * sys/nvcodec/gstcudaupload.h: - * sys/nvcodec/meson.build: - * sys/nvcodec/plugin.c: - nvcodec: Add CUDA upload/download elements with base class for CUDA filters - Similar to glupload/gldownload elements but for CUDA memory. - It will help transfer memory between system and nvidia GPU - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2019-10-16 22:21:05 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvdec.c: - nvcodec: Peer direct access support - If support direct access each other, use device to device memory copy - without staging host memory - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2019-08-30 17:19:44 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstcudacontext.c: - * sys/nvcodec/gstcudacontext.h: - * sys/nvcodec/gstcudaloader.c: - * sys/nvcodec/gstcudaloader.h: - cudacontext: Enable direct CUDA memory access over multiple GPUs - If each device context can access each other, enable peer access - for better interoperability. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2019-08-30 13:57:15 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - * sys/nvcodec/gstnvenc.c: - nvenc: Support CUDA buffer pool - When upstream support CUDA memory (only nvdec for now), we will create - CUDA buffer pool. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2019-08-30 13:55:25 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - nvdec: Support CUDA buffer pool - If downstream can accept CUDA memory caps feature (currently nvenc only), - always CUDA memory is preferred. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2019-08-19 18:02:56 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstcudabufferpool.c: - * sys/nvcodec/gstcudabufferpool.h: - * sys/nvcodec/gstcudaloader.c: - * sys/nvcodec/gstcudaloader.h: - * sys/nvcodec/gstcudamemory.c: - * sys/nvcodec/gstcudamemory.h: - * sys/nvcodec/meson.build: - * sys/nvcodec/stub/cuda.h: - nvcodec: Add CUDA specific memory and bufferpool - Introducing CUDA buffer pool with generic CUDA memory support. - Likewise GL memory, any elements which are able to access CUDA device - memory directly can map this CUDA memory without upload/download - overhead via the "GST_MAP_CUDA" map flag. - Also usual GstMemory map/unmap is also possible with internal staging memory. - For staging, CUDA Host allocated memory is used (see CuMemAllocHost API). - The memory is allowing system access but has lower overhead - during GPU upload/download than normal system memory. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1633> - -2020-10-16 12:29:02 +0100 Andrew Wesie <andrew@theori.io> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264parser: guard against ref_pic_markings overflow - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1703> - -2020-10-16 00:48:01 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gsthlssink2.c: - hlssink2: fix and flesh out docs - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1699> - -2020-10-15 18:26:48 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dash/gstxmlhelper.c: - * meson.build: - meson: update glib minimum version to 2.56 - In order to support the symbol g_enum_to_string in various - project using GStreamer ( gst-validate etc.), the glib minimum - version should be 2.56.0. - Remove compat code as glib requirement - is now > 2.56 - Version used by Ubuntu 18.04 LTS - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1695> - -2020-10-12 01:04:13 +0800 He Junyan <junyan.he@intel.com> - - * sys/d3d11/gstd3d11vp8dec.c: - d3d11: vp8dec: No need to check show_frame flag when output_picture. - The VP8 base class has already handled it for us. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1670> - -2020-10-12 00:57:24 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecs/gstvp8decoder.c: - codecs: vp8decoder: handle the show_frame check in base class. - Move the show_frame check from sub class to vp8 decoder's base class. - Calling the sub class' output_picture() function only when the frame - is displayed and marking the other automatically as decode only. - This is done to avoid logic and code repetition in subclasses. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1670> - -2020-10-16 02:06:49 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - * sys/d3d11/gstd3d11vp9dec.c: - codecs: vp9decoder: handle the show_frame check in base class - Same as vp8 decoder update https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1670 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1697> - -2020-10-15 12:08:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - v4l2codecs: vp8: Allow baseclass from skipping frames - In preparation for !1670, this will allow the base class from skipping frames - that should not be displayed. Previously it would complain about unordered - decoding taking place in the driver. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1696> - -2020-10-15 12:05:45 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2codecs: decoder: Unmark previously pending request - requests are executed in order, so while dequeuing sink buffers for previous - request, also mark these request as no longer pending. This will allow reusing - the request later. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1696> - -2020-10-15 11:35:04 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2codecs: decoder: Properly remove pending requests - Pass the pointer instead of NULL in order to find and remove properly any - pending request from the queue. This coding error was leading to use after - free in error and early exit cases. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1696> - -2020-10-14 19:04:44 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvabasedec.c: - va: basedec: Create the other pool anyway. - Fix a bug in _create_other_pool(). The old way of checking the - base->other_pool make that other_pool never be changed until the - gst_va_base_dec_stop() to stop the current decoding context. - But in some stream, the resolution may change during the decoding - process, and we need to re-negotiate the buffer pool. Then, the - old other_pool can not be clean correctly and the new correct one - can not be created. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1692> - -2020-10-14 16:54:54 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvabasedec.c: - va: basedec: Should unmap src frame when dst frame map failing. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1692> - -2020-10-13 15:28:24 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvapool.c: - va: bufferpool: use release_buffer to clean the mem. - The current bufferpool wastes all pre-allocate buffers when the - buffer pool is actived. - The pool->priv->size is 0 for va buffer pool. And every time, the - reset_buffer() will clean all mem and make the buffer size 0, that - can cache the gst_buffer in the buffer pool. - But when the buffer pool is activing, the default_start() just - allocate the buffer and release_buffer() immediately, all the pre - allocated buffers and surfaces are destroyed because of - gst_buffer_get_size (buffer) != pool->priv->size. - We need to use release_buffer() to do the clean job at the pool - start time. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1686> - -2020-10-04 02:02:16 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Don't enable passthrough by default - SEI messages contain various information which wouldn't be conveyed - by using upstream CAPS (HDR, timecode for example). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1639> - -2020-10-13 13:11:06 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * docs/plugins/gst_plugins_cache.json: - * ext/opencv/gstcameracalibrate.cpp: - cameracalibrate: Improve gst-inspect documentation - Thanks to @kazz_naka on Twitter - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1691> - -2020-10-07 21:13:09 +1100 Matthew Waters <matthew@centricular.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/gstwpesrc.cpp: - wpesrc: add some debug logging around WPEView creation/destruction - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1663> - -2020-10-07 21:14:55 +1100 Matthew Waters <matthew@centricular.com> - - * ext/wpe/gstwpesrc.cpp: - wpesrc: fix a memory leak of the bytes - free the previous GBytes if load-bytes is called multiple times - before view creation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1663> - -2020-10-06 22:19:21 +1100 Matthew Waters <matthew@centricular.com> - - * ext/wpe/gstwpesrc.cpp: - wpesrc: only create webview if not already created - e.g. _decide_allocation() can be called multiple times throughout the - element's lifetime and we only want to create the view once rather than - overwriting. - Fixes a leak of the WPEView under certain circumstances. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1663> - -2020-10-02 12:06:59 +1000 Matthew Waters <matthew@centricular.com> - - * ext/wpe/WPEThreadedView.cpp: - wpe: free a previous pending image/shm buffer - Don't blindly overwrite a possibly previously set buffer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1663> - -2020-10-12 14:15:49 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtsrc.c: - srtsrc: Prevent `delay` from being negative - `delay` should be a GstClockTimeDiff since SRT time is int64_t. - All values are in local time so we should never see a srctime that's in - the future. If we do, clamp the delay to 0 and warn about it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1674> - -2020-10-12 14:12:24 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtsrc.c: - srtsrc: Don't calculate a delay if the srctime is 0 - A zero srctime is a missing srctime. Apparently this can happen when - "the connection is not between SRT peers or if Timestamp-Based Packet - Delivery mode (TSBPDMODE) is not enabled"1 so it may not apply to us, - but it's best to be defensive. - 1: https://github.com/Haivision/srt/blob/v1.4.2/docs/API.md#sending-and-receiving - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1674> - -2020-10-12 14:09:28 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtsrc.c: - srtsrc: Defend against missing clock - If we don't have a clock, stop the source instead of asserting in - gst_clock_get_time. This can happen when the element is removed from the - pipeline while it's playing. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1674> - -2020-10-12 13:56:50 +0200 Marc Leeman <m.leeman@televic.com> - - * gst/rtp/gstrtpsink.h: - rtpmanagerbad: remove duplicate parent declaration - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1689> - -2020-10-12 11:55:46 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/rtmp2/gstrtmp2sink.c: - rtmp2sink: fix since marker on new "stop-commands" property - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1687> - -2020-10-09 16:00:18 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvabasedec.c: - * sys/va/gstvabasedec.h: - * sys/va/gstvah264dec.c: - * sys/va/gstvavp8dec.c: - va: basedec: copy frames logic to decide_allocation() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1673> - -2020-10-09 15:47:43 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvabasedec.c: - va: basedec: refactor the other video pool instantiation - Just a code clean up - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1673> - -2020-10-08 19:39:56 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvabasedec.c: - * sys/va/gstvabasedec.h: - * sys/va/gstvah264dec.c: - * sys/va/gstvavp8dec.c: - * sys/va/meson.build: - va: basedec: add gstvabasedec helper - This is a helper for all decoders. - It is not an abstract subclass, just merely a helper that avoids code - duplication among the decoders. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1673> - -2020-10-09 10:33:58 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavp8dec.c: - va: vp8dec: add element documentation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1673> - -2020-10-09 12:27:12 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: h264dec: set video alignment definition earlier - This patch renames need_cropping variable to need_videoalign which is clearer - with its function. And now GstVideoAlignment is part of GstVaH264Dec structure, - so it can be set earlier. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1673> - -2020-10-05 16:40:55 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/dtls/gstdtlsconnection.c: - dtlsconnection: Ignore OpenSSL system call errors - OpenSSL shouldn't be making real system calls, so we can safely - ignore syscall errors. System interactions should happen through - our BIO. So especially don't look at the system's errno, as it - should be meaningless. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1656> - -2020-09-12 02:48:43 +0200 Jan Alexander Steffens (heftig) <heftig@archlinux.org> - - * tests/check/elements/svthevcenc.c: - tests: svthevcenc: Fix test_encode_simple - Pick the same I420 format the other test use. Without this, the source - picks AYUV64, which fails. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1573> - -2020-10-07 18:03:20 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvaallocator.h: - * sys/va/gstvah264dec.c: - * sys/va/gstvapool.c: - * sys/va/gstvapool.h: - * sys/va/gstvavp8dec.c: - * sys/va/gstvavpp.c: - va: allocator: add _set_format() and _get_format() - Since allocators keep an available memory queue to reuse, video format and usage - hint are now persistant while allocator's memories are around. - This patch adds _set_format() and _get_format() for both VA allocators. - _set_format() validates if given format can be used or reused. If no allocated - surface previously it creates a dummy one to fetch its offsets and - strides. Updated info is returned to callee. - GstVaPool uses _set_format() at config to verify the allocator capacity and to - get the surfaces offsets and strides, which are going to be used by the video - meta. - Allocator extracted caps are compared with caps from config and if they have - different strides or offsets, force_videometa is set. - A new bufferpool method gst_va_pool_requires_video_meta() is added return the - value of force_videometa. This value is checked in order to know if decoders - need to copy the surface if downstream doesn't announce video meta support. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1667> - -2020-10-08 14:10:41 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvacaps.c: - * sys/va/gstvacaps.h: - va: caps: added gst_caps_is_raw() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1667> - -2020-10-08 10:26:54 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvapool.c: - va: pool: call parent's start() method - Without preallocating buffers and memories a deadlock in pool allocator is - highly probably since it might hit the case were buffer is returned to the pool - but their memories are still hold by a copy downstream, without other - preallocated buffers available. - This kind of a hack, where buffer_reset() follow the normal path if it's called - from start(). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1667> - -2020-10-07 16:18:30 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvapool.c: - va: pool: fix log's object - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1667> - -2020-10-08 10:30:28 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: remove noisy log message - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1667> - -2020-10-07 11:08:49 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: add a todo for dmabuf_memories_setup() - It would be nice to add a surface pool for this type of surface allocation in - order to have a better control of them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1667> - -2020-10-07 10:16:27 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: add a surface counter - Every time a new surface is created the counter increases by one, and when it is - destroyed (or will be destroyed in case of GstVaAllocator), the counter is - decreased. Then, at allocator dispose, it is warning if the counter is not zero. - This counter will be also used to check if the allocator can change its - configuration if the counter is zero or can not. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1667> - -2020-10-06 20:01:04 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: remove GstVideoInfo from GstVaBufferSurface - Don't store it them anymore since it is related with the negotiated stream and - not the concrete buffer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1667> - -2020-10-06 19:54:26 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvaallocator.h: - * sys/va/gstvadecoder.c: - * sys/va/gstvavpp.c: - va: remove GstVideoInfo parameter from _get_surface() functions - There shouldn't be need to retrieve GstVideoInfo per buffer or memory since it - is the same for all the negotiated stream. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1667> - -2020-10-06 19:40:16 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvavpp.c: - va: vpp: don't fetch video info from buffer - Instead of fetching video info from the buffer, use the already set ones. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1667> - -2020-10-07 12:49:44 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - * sys/va/gstvavp8dec.c: - * sys/va/gstvavpp.c: - va: dec, vpp: don't get buffer size from allocators - Since buffer size is now ignored by bufferpool there's no need to get tha value - from the allocator. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1667> - -2020-10-04 11:14:38 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvapool.c: - va: pool: ignore size in config - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1667> - -2020-10-05 11:07:25 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: set interlace-mode=interleaved on interlaced content - interlace-mode=alternate is a special case of interlace-mode=interleaved - where the fields are split using two different buffers. - We should use the latter instead of the former to no break compat with - elements supporting only 'interleaved'. - Decoders producing alternate, such as OMX on the Zynq, should change the - interlace-mode on their output caps. - Fix https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/issues/825 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1655> - -2020-10-09 10:24:50 +0200 Jacek Tomaszewski <lord.jacold@gmail.com> - - * COPYING: - * COPYING.LIB: - Replace LGPL v2 with LGPL v2.1 in COPYING and remove COPYING.LIB - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1631> - -2020-10-02 11:42:07 +0200 Jacek Tomaszewski <lord.jacold@gmail.com> - - * COPYING: - Replace GPL v2 with LGPL v2 in COPYING file - Fixes #1422 - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1422 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1631> - -2020-10-08 17:52:05 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtsink.c: - srt: Consume the error from gst_srt_object_write - Instead of leaking it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1668> - -2020-10-08 17:48:20 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srt: Check socket state before retrieving payload size - The connection might be broken, which we should detect instead of just - aborting the write. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1669> - -2020-10-08 18:25:59 +0200 Jakub Adam <jakub.adam@collabora.com> - - * ext/x265/gstx265enc.c: - x265enc: fix deadlock on reconfig - Don't attempt to obtain encoder lock that is already held by - gst_x265_enc_encode_frame(). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1671> - -2020-10-07 11:04:30 +0300 Sebastian Dröge <sebastian@centricular.com> - - * pkgconfig/gstreamer-webrtc-uninstalled.pc.in: - * pkgconfig/gstreamer-webrtc.pc.in: - webrtc: Require gstreamer-sdp in the pkg-config file - Some headers include API from it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1660> - -2020-10-06 11:45:36 +0200 Edward Hervey <edward@centricular.com> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - * ext/srt/gstsrtsrc.c: - * ext/srt/gstsrtsrc.h: - srtsrc: Fix timestamping - SRT provides the original timestamp of a packet (with drift/skew corrected for - local clock), which is what should be used for timestamping the outgoing - buffers. This ensures that we output the packets with the same timestamp (and by - extension rate) as the original feed. - Also detect if packets were dropped (by checking the sequence number) and - properly set DISCONT flag on the outgoing buffer. - Finally answer the latency queries - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1658> - -2020-10-07 05:05:25 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfsourcereader.cpp: - mfvideosrc: Use only the first video stream per device - Non-first video stream might not be working with current - implementation. It could be non-video (e.g., photo source) and then - ReadSample() might be blocked forever. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1661> - -2020-10-08 03:15:21 +0900 Seungha Yang <seungha@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Update doc - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1665> - -2020-10-08 01:39:42 +0900 Seungha Yang <seungha@centricular.com> - - * sys/decklink/win/DeckLinkAPI.h: - * sys/decklink/win/DeckLinkAPI_i.c: - decklink: Update Windows headers with SDK 11.2 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1665> - -2020-10-08 01:33:35 +0900 Seungha Yang <seungha@centricular.com> - - * sys/decklink/osx/DeckLinkAPI.h: - * sys/decklink/osx/DeckLinkAPIConfiguration.h: - * sys/decklink/osx/DeckLinkAPIDeckControl.h: - * sys/decklink/osx/DeckLinkAPIDiscovery.h: - * sys/decklink/osx/DeckLinkAPIDispatch.cpp: - * sys/decklink/osx/DeckLinkAPIModes.h: - * sys/decklink/osx/DeckLinkAPIStreaming.h: - * sys/decklink/osx/DeckLinkAPITypes.h: - * sys/decklink/osx/DeckLinkAPIVersion.h: - decklink: Update OSX headers with SDK 11.2 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1665> - -2019-06-25 11:51:32 +0200 Tim <Timothee.Autin@ifremer.fr> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - * sys/decklink/linux/DeckLinkAPI.h: - * sys/decklink/linux/DeckLinkAPIConfiguration.h: - * sys/decklink/linux/DeckLinkAPIDeckControl.h: - * sys/decklink/linux/DeckLinkAPIDiscovery.h: - * sys/decklink/linux/DeckLinkAPIDispatch.cpp: - * sys/decklink/linux/DeckLinkAPIModes.h: - * sys/decklink/linux/DeckLinkAPITypes.h: - * sys/decklink/linux/DeckLinkAPIVersion.h: - decklink: Updated DeckLink SDK to 11.2 to support DeckLink 8K Pro - Updated Decklink SDK to version 11.2 in order to support newer cards like the Decklink 8K Pro. - This required to replace the duplex property by a profile property. - Profile values can be the following: - - bmdProfileOneSubDeviceFullDuplex - - bmdProfileOneSubDeviceHalfDuplex - - bmdProfileTwoSubDevicesFullDuplex - - bmdProfileTwoSubDevicesHalfDuplex - - bmdProfileFourSubDevicesHalfDuplex - Fixes #987 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1665> - -2020-10-07 17:37:25 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfsourcereader.cpp: - mfvideosrc: Fix invalid memory access when outputting jpeg - Don't access unknown-dangerous-nonsense address - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1662> - -2020-10-08 18:50:12 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * gst-libs/gst/webrtc/rtptransceiver.h: - * gst-libs/gst/webrtc/webrtc_fwd.h: - Revert "webrtc: Save the media kind in the transceiver" - This reverts commit f54d8e99457996303b8477b1f3a710f0fabd1cc6. - It breaks the CI until the C# bindings are fixed. - -2020-10-08 18:49:57 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/rtpsender.c: - * gst-libs/gst/webrtc/rtpsender.h: - Revert "rtpsender: Add API to set the priority" - This reverts commit a8b287c76472c8d7fd38800807c482d020ff4a63. - It breaks the CI until the C# bindings are fixed. - -2020-10-08 18:49:56 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/webrtctransceiver.h: - Revert "rtptransceiver: Store the SSRC of the current stream" - This reverts commit d1da271f255101dbe95a426d9f5065d300b53e5a. - It breaks the CI until the C# bindings are fixed. - -2020-10-08 18:49:55 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - Revert "webrtcbin: Remove unused function" - This reverts commit 39723dbe934186c11f7b2a2b04c0af7932a1509c. - It breaks the CI until the C# bindings are fixed. - -2020-10-08 18:49:54 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/gstwebrtcice.h: - * ext/webrtc/meson.build: - * ext/webrtc/sctptransport.c: - * ext/webrtc/sctptransport.h: - * ext/webrtc/webrtctransceiver.c: - * ext/webrtc/webrtctransceiver.h: - Revert "webrtc: Set the DSCP markings based on the priority" - This reverts commit 8ba08598bbe51f3b1f063ae22605f9608865f16b. - It breaks the CI until the C# bindings are fixed. - -2020-10-08 18:49:53 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/rtpreceiver.h: - * gst-libs/gst/webrtc/rtpsender.h: - * gst-libs/gst/webrtc/rtptransceiver.h: - Revert "webrtc: Document more objects" - This reverts commit ad68c6b1eb7c73c66dc9d1dbf1a8cc47fd489c61. - It breaks the CI until the C# bindings are fixed. - -2020-10-08 18:49:50 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/rtpsender.h: - * gst-libs/gst/webrtc/rtptransceiver.h: - Revert "webrtc: Add hotdoc style since tags" - This reverts commit 63a5fa818c31ecbe43891c077a38b6b162d73c28. - It breaks the CI until the C# bindings are fixed. - -2020-10-06 16:52:48 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/rtpsender.h: - * gst-libs/gst/webrtc/rtptransceiver.h: - webrtc: Add hotdoc style since tags - We're stuck having to add a separate comment for now. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1425> - -2020-10-02 21:38:00 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/rtpreceiver.h: - * gst-libs/gst/webrtc/rtpsender.h: - * gst-libs/gst/webrtc/rtptransceiver.h: - webrtc: Document more objects - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1425> - -2020-07-08 17:24:36 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/gstwebrtcice.h: - * ext/webrtc/meson.build: - * ext/webrtc/sctptransport.c: - * ext/webrtc/sctptransport.h: - * ext/webrtc/webrtctransceiver.c: - * ext/webrtc/webrtctransceiver.h: - webrtc: Set the DSCP markings based on the priority - This matches how the WebRTC javascript API works and the Chrome implementation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1425> - -2020-07-09 13:45:20 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Remove unused function - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1425> - -2020-07-09 13:42:35 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/webrtctransceiver.h: - rtptransceiver: Store the SSRC of the current stream - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1425> - -2020-07-09 13:39:03 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/webrtc/rtpsender.c: - * gst-libs/gst/webrtc/rtpsender.h: - rtpsender: Add API to set the priority - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1425> - -2020-07-08 19:13:33 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * gst-libs/gst/webrtc/rtptransceiver.h: - * gst-libs/gst/webrtc/webrtc_fwd.h: - webrtc: Save the media kind in the transceiver - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1425> - -2020-10-06 13:39:23 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srt: Remove unused sa_family tracking - Now that SRT no longer needs the family when creating the socket, this - code has become useless. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1659> - -2020-10-02 03:39:40 +0200 Niklas Hambüchen <mail@nh2.me> - - * ext/srt/gstsrtobject.c: - * ext/srt/meson.build: - srt: Move off deprecated `srt_socket()`. - See https://github.com/Haivision/srt/blob/73ee1e1a3e3adc2702a9a5057d101ef80447b38c/docs/API-functions.md#srt_socket - `srt_create_socket()` was added in - https://github.com/Haivision/srt/commit/4b897ba92d34f1829a1c6e419eeab17f0763a0fc - and srt `v1.3.0` is the first release that has it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1659> - -2020-10-01 17:31:13 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrt.c: - srt: Register a log handler - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1659> - -2020-09-25 19:17:35 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srt: Avoid removing invalid sockets from the polls - This would provoke error messages from SRT. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1659> - -2020-09-25 19:08:17 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srt: Fix use of srt_startup - `srt_startup` can also return 1 if it was successful. Avoid warning in - this case. - Avoid a race when checking whether we need to call it at all. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1659> - -2020-10-06 12:35:12 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srt: Fix parameter types used for socket options - The SRT documentation1 specifies exact types for the socket options. - Make sure we match these. - This reverts the linger workaround in commit 84f8dbd932029220ee86154dd - and extends srt_constant_params to support other types than int. - 1: https://github.com/Haivision/srt/blob/master/docs/APISocketOptions.md - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1659> - -2020-09-29 18:52:43 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11upload.c: - d3d11upload: Allow passthrough for system memory - ... like how d3d11download and gl{upload,download} do. - This should've been part of the commit 9b72b04daddafb1c86cb6ab5923c593a70bc4166 - but I missed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1645> - -2020-10-04 10:01:31 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: refactor flush methods for both allocators - Since the logic is the same, it can be generalized in a single common - function. - Also the methods run the common function with a lock and signal the - buffers' conditional. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1626> - -2020-10-03 16:37:54 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: refactor GstVaDmabufAllocator - Move code down to group it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1626> - -2020-10-03 16:30:14 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: refactor GstVaBuffersurface - Move code up and add namespace to methods, and renaming - _creating_buffer_surface() to the canonical - gst_va_buffer_surface_new() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1626> - -2020-09-30 19:35:14 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvaallocator.h: - * sys/va/gstvapool.c: - va: implement pooled allocators - 1. Allocators don't implement memory free() methods since all the memories will - implement dispose() returning FALSE - 2. Memory/miniobject dispose() will act as memory release, enqueueing the - release memory - 3. A new allocator's method prepare_buffer() which queries the released memory - queue and will add the requiered memories to the buffer. - 4. Allocators added a GCond to synchronize dispose() and prepare_buffer() - 5. A new allocator's method flush() which will free for real the memories. - While the bufferpool will - 1. Remove all the memories at reset_buffer() - 2. Implement acquire_buffer() calling allocator's prepare_buffer() - 3. Implement flush_start() calling allocator's flush() - 4. start() is disabled since it pre-allocs buffers but also calls - our reset_buffer() which will drop the memories and later the - buffers are ditched, something we don't want. This approach avoids - buffer pre-allocation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1626> - -2020-09-30 15:54:18 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: user gst_clear_object() for _buffer_surface_unref() - Event if this function is only used by gst_va_dmabuf_memories_setup(), it might - get reused later by GstVaDmabufAllocator's functions. This change makes the - function less fragile. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1626> - -2020-09-30 15:53:39 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: renamed gst_va_dmabuf_memory_release() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1626> - -2020-09-30 15:48:12 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: renamed available_mems queue - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1626> - -2020-09-30 15:45:54 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvaallocator.h: - * sys/va/gstvapool.c: - va: allocator: rename gst_va_dmabuf_allocator_setup_buffer() - Since it's related with GstVaDmabufAllocator. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1626> - -2020-09-29 15:03:11 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: calculated surface frame internally - Instead of using gst_buffer_get_size() just add the memory sizes reported by - exported fd. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1626> - -2020-09-28 16:59:44 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: make GstVaMemory shareable - Renamed the first variable member of GstVaMemory from parent to mem in - order to avoid confusion with GstMemory's parent. - When freeing the structure, memory's parent is check in order to - decide if surfaces has to be destroyed or not, since only the parent - class have to destroy it. - Removed GST_MEMORY_FLAG_NO_SHARE in memory initialization, since it is - deprecated. - Implemented allocator's share virtual method which creates a new - shallow GstVaMemory structure based on the passed one which will be - it's parent. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1626> - -2020-09-28 16:50:16 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: remove copy method for GstVaMemory - Since the memory has to be shareable. That will be address in the next - commits. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1626> - -2020-09-24 17:32:47 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: remove va allocator mem_is_span() vmethod - Since it is the default by base class. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1626> - -2020-10-01 03:47:13 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11download.c: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - d3d11upload/d3d11download: Make use of staging buffer - ... instead of direct cpu map for d3d11memory object. In this way, - we don't need per GstD3D11Memory staging texture. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1627> - -2020-10-03 18:53:46 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11bufferpool.c: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - d3d11: Don't hold staging texture - Staging texture is used for memory transfer between system and - gpu memory. Apart from d3d11{upload,download} elements, however, - it should happen very rarely. - Before this commit, d3d11bufferpool was allocating at least one - staging texture in order to calculate cpu accessible memory size, - and it wasn't freed for later use of the texture unconditionally. - But it will increase system memory usage. Although GstD3D11memory - object is implemented so that support CPU access, most memory - transfer will happen in d3d11{upload,download} elements. - By this commit, the initial staging texture will be freed immediately - once cpu accessible memory size is calculated. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1627> - -2020-09-26 03:27:39 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11basefilter.h: - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconvert.h: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11download.c: - * sys/d3d11/gstd3d11download.h: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11upload.h: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosink.h: - * sys/d3d11/gstd3d11videosinkbin.c: - * sys/d3d11/gstd3d11videosinkbin.h: - d3d11: Move to G_DECLARE_FINAL_TYPE - ... and remove unnecessary forward declaration. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1627> - -2020-10-04 16:33:47 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvacaps.c: - * sys/va/gstvacaps.h: - * sys/va/gstvah264dec.c: - * sys/va/gstvavp8dec.c: - * sys/va/gstvavpp.c: - va: caps: centralize caps feature discovering - These function were repeated in the different implemented - elements. This patch centralize them. - The side effect is dmabuf memory type is no longer checked with the - current VAContext, but assuming that dmabuf is a consequence of caps - negotiation from dynamic generated caps templates, where the context's - memory types are validated, there's no need to validate them twice. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1644> - -2020-10-04 12:43:35 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - va: filter: fix counter variable reuse - There was a bug reusing the counter variable i in nested loops. Also - the patch makes the code cleaner. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1643> - -2019-10-02 11:17:09 +0200 Lars Lundqvist <larslu@axis.com> - - * ext/curl/gstcurlbasesink.c: - curlbasesink: Add curl seek callback - Adding functionality to handle SEEK_SET enables rewinding of sent data. - In the HTTP case, this happens after an HTTP 401 has been received from - the other end. This will result in the sent data being resent. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1616> - -2020-09-29 15:52:21 +0300 Sebastian Dröge <sebastian@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/decklink/gstdecklink.cpp: - decklink: Correctly order the different dependent mode tables - One was forgotten in 309f6187fef890c7ffa49305f38e89beac3b1423. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1617> - -2020-09-19 00:26:35 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - wasapisrc: Make sure that wasapisrc produces data in loopback mode - An oddness of wasapi loopback feature is that capture client will not - produce any data if there's no outputting sound to corresponding - render client. In other words, if there's no sound to render, - capture task will stall. As an option to solve such issue, we can - add timeout to wake up from capture thread if there's no incoming data - within given time interval. But it seems to be glitch prone. - Another approach is that we can keep pushing silence data into - render client so that capture client can keep capturing data - (even if it's just silence). - This patch will choose the latter one because it's more straightforward - way and it's likely produce glitchless sound than former approach. - A bonus point of this approach is that loopback capture on Windows7/8 - will work with this patch. Note that there's an OS bug prior to Windows10 - when loopback capture client is running with event-driven mode. - To work around the bug, event signalling should be handled manually - for read thread to wake up. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1588> - -2020-09-29 23:46:00 +1000 Matthew Waters <matthew@centricular.com> - - * ext/wpe/gstwpesrc.cpp: - wpesrc: fix some caps leaks using the non-GL output - Always chain up to the parent _stop() implementation as it unrefs some - caps (among other things). - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1409 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1618> - -2020-06-16 11:16:37 +0900 Hosang Lee <hosang10.lee@lge.com> - - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - smoothstreaming: clear live adapter on seek - In live streaming, buffers sent by souphttpsrc are pushed to the live - adapter. The buffers in the adapter are sent out of mssdemux when it - is greater than 4096 bytes. - Occasionally, when seeking in live streams, if seek occurs just - after the last data chunk was received, and if this data chunk is - smaller than 4096 bytes, it will be kept in the live adapter. - This remaining data in the live adapter will be erroneously prepended - to the new data that is downloaded after seek and pushed out. - When qtdemux receives this data, since it does not start with - a moof box, it is impossible to demux the fragment, and bogus - size error will occur. - Clear out the live adapter on seek so that no unnecessary remaining - data is pushed out together with the new fragment after seeking. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1345> - -2020-09-30 10:47:45 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/plugin.c: - va: simplify VPP detection - Also the previous code failed if VPP was not present blacklisting the - plugin. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1619> - -2020-06-15 15:24:07 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator.h: - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdkcontext.h: - * sys/msdk/gstmsdkvideomemory.c: - msdk: call vaExportSurfaceHandle() to get DMABuf FD - Compared to vaAcquireBufferHandle(), vaExportSurfaceHandle() may - provide the handle details, so we needn't call vaDeriveImage(). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1353> - -2020-07-01 09:03:21 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpcvfpay.c: - * tests/check/elements/avtpcrfcheck.c: - * tests/check/elements/avtpcrfsync.c: - * tests/check/elements/avtpcvfdepay.c: - tests/avtp: Fix coverity issues - Fixes sign extension issues, unchecked return values and some constant - expression results. - CID: 1465073, 1465074, 1465075, 1465076, 1465077 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1398> - -2020-07-08 09:08:31 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpcvfdepay.c: - * ext/avtp/gstavtpcvfpay.c: - * ext/avtp/gstavtpsrc.c: - avtp: Change "%lu" for G_GUINT64_FORMAT - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1398> - -2020-09-25 22:00:26 +0530 raghavendra <raghavendra.rao@collabora.com> - - * ext/srt/gstsrtobject.c: - srtobject: typecast SRTO_LINGER to linger - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1615> - -2020-09-24 01:24:40 +0800 He Junyan <junyan.he@intel.com> - - * gst-libs/gst/codecparsers/gstvp8parser.c: - codecparsers: vp8parser: clear the frame_hdr before parsing. - Uninited frame_hdr may have garbage and may contain some wrong - results after the parsing process. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1587> - -2020-09-20 23:29:00 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvah264dec.c: - * sys/va/gstvavp8dec.c: - * sys/va/gstvavp8dec.h: - * sys/va/meson.build: - * sys/va/plugin.c: - va: Implement the VA vp8 decoder. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1587> - -2020-09-21 23:08:05 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvaallocator.h: - * sys/va/gstvadecoder.h: - * sys/va/gstvautils.h: - va: codestyle: Clear all tabs in header files - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1587> - -2020-09-21 12:51:53 +0800 He Junyan <junyan.he@intel.com> - - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - * sys/va/gstvah264dec.c: - * sys/va/gstvautils.h: - va: util: make the _format_changed a common decoder function. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1587> - -2020-09-24 12:36:26 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: h264dec: allocate output buffers according DPB size - Instead of allocating the maximal number of references for output - buffers, this patch reduces the memory foot print in many cases by - just allocating the output buffers required for the DPB. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1595> - -2020-09-24 12:29:49 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - * sys/va/gstvah264dec.c: - va: decoder: store output buffer rather than surface - GstVaDecodePicture stored the processed VASurfaceID, under the - assumption that the bufferpool with keep the referenced buffers, but - this approach is fragil. - This patch changes GstVaDecodePicture to store the output buffer, - which already contains its VASurfaceID, and provides a new method to - retrieve the VASurfaceID directly from picture. - Based on He Junyan <junyan.he@intel.com> patches for - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1587 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1594> - -2020-09-23 20:08:46 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/videotexturecache-vulkan.mm: - vtdec/vulkan: use Shared storage mode for IOSurface textures - Fixes a debug assertion with i(Pad)OS 14: - 'IOSurface textures must use MTLStorageModeShared' - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1592> - -2020-09-23 17:04:55 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/gstbasetsmux.c: - mpegtsmux: Restore intervals when creating TsMux - Otherwise the settings from the properties would be overwritten with - the defaults. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1593> - -2020-09-19 14:26:42 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvavpp.c: - * sys/va/plugin.c: - va: vpp: global lock to handle shared buffers - Add a global mutex to exclusive access to shared stream buffers, such - as DMABufs or VASurfaces after a tee: - LIBVA_DRIVER_NAME=iHD \ - gst-launch-1.0 v4l2src ! tee name=t t. ! queue ! \ - vapostproc skin-tone=9 ! xvimagesink \ - t. ! queue ! vapostproc ! xvimagesink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1529> - -2020-08-16 09:18:11 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvafilter.c: - * sys/va/gstvafilter.h: - * sys/va/gstvavpp.c: - * sys/va/gstvavpp.h: - * sys/va/meson.build: - * sys/va/plugin.c: - va: add vapostproc element - Video postprocessor for VA-API - Funcionalities: resize frames, change format, import buffers, apply - filters (such as denoise, sharpen, orientation, if driver offers them). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1529> - -2020-08-20 13:49:33 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: export composed layer for YUY2 and UYVY - This is a result of an error reported by i965 driver which only can - export composed layer for these formats. This seems to work too with - iHD. These formats are not exposed as native surfaces in Gallium. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1529> - -2020-08-19 16:52:10 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvaallocator.h: - va: allocator: add gst_va_dmabuf_buffer_setup() - This function will take an array of DMABuf GstMemory and an array of - fd, and create a VASurfaceID with those fds. Later that VASurfaceID is - attached to each DMABuf through GstVaBufferSurface. - In order to free the surface GstVaBufferSurface now have GstVaDisplay - member, and _buffer_surface_unref() were added. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1529> - -2020-08-19 16:48:39 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: try to get VASurfaceID from every DMABuf allocator - Relax the check of the allocator type, because now the qdata can be - attached for other DMABuf allocators. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1529> - -2020-09-12 13:10:18 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvavideoformat.c: - va: allocator: try to create surface without fourcc but chroma only - There are, in VPP, surfaces that doesn't support 4:2:2 fourccs but it - supports the chroma. So this patch gives that opportunity to the - driver. - This patch also simplifiies - gst_va_video_surface_format_from_image_format() to just an iterator - for surfaces available formats. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1529> - -2020-08-19 16:45:49 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: create surfaces with VASurfaceAttribExternalBuffers - Add a new parameter to _create_surfaces(): a pointer to - VASurfaceAttribExternalBuffers. - If it's defined the memory type is changed to DRM_PRIME, also a new item is - added to the VASurfaceAttrib array with - VASurfaceAttribExternalBufferDescriptor. - Also, the VASurfaceAttrib for pixel format is not mandatory anymore. If fourcc - parameter is 0, is not added in the array, relying on the chroma. This is - useful when creating surfaces for uploading or downloading images. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1529> - -2020-08-20 13:46:12 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvapool.c: - va: pool: use gst_object_replace() for allocator - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1529> - -2020-09-16 19:14:30 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadevice.c: - va: device: use gst_clear_object() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1529> - -2020-08-18 19:12:46 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvacaps.c: - * sys/va/gstvacaps.h: - va: caps: expose gst_caps_set_format_array() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1529> - -2020-09-22 19:59:41 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: vah264dec: fix documentation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1591> - -2020-09-23 10:58:43 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264: unref leaked caps - Unref a leaked caps at set_latency(). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1590> - -2020-07-20 10:13:13 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkav1dec.c: - * sys/msdk/gstmsdkav1dec.h: - * sys/msdk/meson.build: - msdk: add support for AV1 decoding - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1448> - -2020-09-19 21:43:24 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvautils.c: - va: utils: use GstObject for GstVaDisplay in context - Thus application could fetch the GstVaDisplay through the sync bus - without knowning the specific implementation, and sharing it or - extract properties. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1586> - -2020-09-19 21:36:58 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvautils.c: - va: utils: fix code style and wrong log message - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1586> - -2020-09-14 09:48:48 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/gstwpesrc.cpp: - wpe: Plug event leak - Handled events don't go through the default pad event handler, so they need to - be unreffed in this case. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1568> - -2020-08-25 01:57:55 +1000 Jan Schmidt <jan@centricular.com> - - * ext/wpe/gstwpesrc.cpp: - wpesrc: Don't crash if WPE doesn't generate a buffer. - On creating a 2nd wpesrc in a new pipeline in an app that already - has a runnig wpesrc, WPE sometimes doesn't return a buffer on request, - leading to a crash. This commit fixes the crash, but not the underlying - failure - a 2nd wpesrc can still error out instead. - Partially fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1386 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1568> - -2020-09-11 12:51:56 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpe: Plug SHM buffer leaks - Fixes #1409 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1568> - -2020-09-10 14:39:58 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - wpe: Move webview load waiting to WPEView - As waiting for the load to be finished is specific to the WebView, it should be - done from our WPEView, not from the WPEContextThread. This fixes issues where - multiple wpesrc elements are created in sequence. Without this patch the first - view might receive erroneous buffer notifications. - Fixes #1386 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1568> - -2020-09-11 18:17:20 +0530 Sanchayan Maity <sanchayan@asymptotic.io> - - * docs/plugins/gst_plugins_cache.json: - * gst/audiobuffersplit/gstaudiobuffersplit.c: - * gst/audiobuffersplit/gstaudiobuffersplit.h: - audiobuffersplit: Add support for specifying output buffer size - Currently for buffer splitting only output duration can be specified. - Allow specifying a buffer size in bytes for splitting. - Consider a use case of the below pipeline - appsrc ! rptL16pay ! capsfilter ! rtpbin ! udpsink - Maintaining MTU for RTP transfer is desirable but in a scenario - where the buffers being pushed to appsrc do not adhere to this, - an audiobuffersplit element placed between appsrc and rtpL16pay - with output buffer size specified considering the MTU can help - mitigate this. - While rtpL16pay already has a MTU setting, in case of where an - incoming buffer has a size close to MTU, for eg. with a MTU of - 1280, a buffer of size 1276 bytes would be split into two buffers, - one of 1268 and other of 8 bytes considering RTP header size of - 12 bytes. Putting audiobuffersplit between appsrc and rtpL16pay - can take care of this. - While buffer duration could still be used being able to specify - the size in bytes is helpful here. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1578> - -2020-09-10 13:05:23 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpe: Use proper callback for TLS errors signal handling - The load-failed and load-failed-with-tls-errors signals expect distinct callback - signatures. - Fixes #1388 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1566> - -2020-09-20 08:31:23 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: h264dec: add documentation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1585> - -2019-12-10 19:54:43 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: enable GPUCopy - Note it works for system memory only - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/910> - -2019-12-10 19:47:03 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: call MFXInitEx instead of MFXInit - MFXInitEx has more control than MFXInit. The current setting in this - commit is identical to MFXInit - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/910> - -2020-09-19 14:08:46 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadecoder.c: - va: decoder: render picture only if data - Call vaRenderPicture() only if buffer or slice data is available. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1584> - -2020-09-17 19:54:28 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadecoder.c: - va: decoder: warn if decode fails on a surface - Instead of logging error if a step fails, it logs a warning message - reducing the noise and obeying the rule for errors since the program - doesn't end - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1584> - -2020-09-17 19:52:29 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: h264dec: check is pad has fixed caps at caps query - Otherwise it will always reply with the possible driver caps, which - generates problems with Web MSE players. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1583> - -2020-09-19 05:39:32 +0900 Seungha Yang <seungha@centricular.com> - - * sys/va/gstvah264dec.c: - va: h264dec: Don't need to set pts/dts/duration on outputting frame - It will be handled by videodecoder baseclass - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1582> - -2020-03-25 20:50:01 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/meson.build: - webrtcbin: Accept end-of-candidate pass it to libnice - libnice now supports the concept of end-of-candidate, so use the API - for it. This also means that if you don't do that, the webrtcbin will - never declared the connection as failed. - This requires bumping the dependency to libnice 0.1.16 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1139> - -2020-09-17 17:39:25 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Do not source using padded width/height - The width/height from the video meta can be padded width, height. But when - sourcing from padded buffer, we only want to use the valid pixels. This - rectangle is from the crop meta, orther it is deduces from the caps. The width - and height from the caps is save in the parent class, use these instead of the - GstVideoInfo when settting the src rectangle. - This fixes an issue with 1080p video displaying repeated or green at the - padded bottom 8 lines (seen with v4l2codecs). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1580> - -2020-09-18 01:41:35 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11download.c: - * sys/d3d11/gstd3d11format.c: - * sys/d3d11/gstd3d11format.h: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11shader.c: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosinkbin.c: - * tests/check/elements/d3d11colorconvert.c: - d3d11: Add support for packed 8bits 4:2:2 YUV formats - Note that newly added formats (YUY2, UYVY, and VYUY) are not supported - render target view formats. So such formats can be only input of d3d11convert - or d3d11videosink. Another note is that YUY2 format is a very common - format for hardware en/decoders on Windows. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1581> - -2020-08-26 17:48:06 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Merge the RTX SSRCs from all transceivers when bundling - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1545> - -2020-09-15 17:09:57 +0200 Marian Cichy <m.cichy@pengutronix.de> - - * ext/avtp/gstavtpaafdepay.c: - avtp: avtpaafdepay: fix crash when building caps - gst_caps_new_simple gets wrong types for rate and channel which - may lead to a crash. - As 64-bit values for rate, depth, format, channels does not - make much sense and since any other functionality in gstreamer - expects G_TYPE_INT for channels and rate, we should stick to that - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1576> - -2020-06-09 10:10:12 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst/videoparsers/gsth265parse.c: - * tests/check/libs/h265parser.c: - h265parse: recognize more HEVC extension streams - There are streams which have the right general_profile_idc and - general_profile_compatibility_flag, but don't have the right extension - flags. We may try to use chroma_format_idc and bit_depth to - recognize these streams. - e.g. - https://www.itu.int/wftp3/av-arch/jctvc-site/bitstream_exchange/draft_conformance/SCC/IBF_Disabled_A_MediaTek_2.zip - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1328> - -2020-06-05 13:01:06 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * tests/check/libs/h265parser.c: - h265parser: select the right profile for high throughput SCC stream - Currently screen-extended-high-throughput-444 is recognized as - screen-extended-main-444, screen-extended-high-throughput-444-10 is - recognized as screen-extended-main-444-10 because they have the same - extension flags, so without this patch, it is possible that a decoder - which supports SCC but doesn't support throughput SCC will try to decode - a throughput SCC stream. - e.g. - https://www.itu.int/wftp3/av-arch/jctvc-site/bitstream_exchange/draft_conformance/SCC/HT_A_SCC_Apple_2.zip - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1328> - -2020-09-08 14:43:49 +0800 Randy Li (ayaka) <ayaka@soulik.info> - - * sys/msdk/gstmsdkvpp.c: - msdk: vpp: fixup passthrough checking for DMA - I think it is just a typo from e1a90f1ec9 - msdkvpp: Disable passthrough if memory capsfeature changes - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1559> - -2020-09-15 17:51:51 +0200 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> - - * ext/wayland/wlshmallocator.c: - * meson.build: - waylandsink: Use memfd_create() when available - This (so-far) Linux- and FreeBSD-only API lets users create file - descriptors purely in memory, without any backing file on the filesystem - and the race condition which could ensue when unlink()ing it. - It also allows seals to be placed on the file, ensuring to every other - process that we won’t be allowed to shrink the contents, potentially - causing a SIGBUS when they try reading it. - This patch is best viewed with the -w option of git log -p. - It is an almost exact copy of Wayland commit - 6908c8c85a2e33e5654f64a55cd4f847bf385cae, see - https://gitlab.freedesktop.org/wayland/wayland/merge_requests/4 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1577> - -2020-09-10 21:19:43 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - codecs: vp9decoder: Relying on upstream vp9parse for super frame handling - By this way, we can simplify the decoding flow. Moreover, we don't - need to worry about the case where multiple visible-frames are - composed in one super-frame, since upstream vp9parse will split - them per frame unit. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1567> - -2020-09-10 21:42:49 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9picture.c: - * gst-libs/gst/codecs/gstvp9picture.h: - codecs: vp9decoder: Remove unused pts variable - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1567> - -2020-09-12 00:12:03 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11vp9dec.c: - d3d11vp9dec: Don't need to consider output_picture() call without GstVideoCodecFrame - Baseclass will be updated in order to ensure GstVideoCodecFrame. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1567> - -2020-09-10 20:32:13 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11vp9dec.c: - d3d11vp9dec: Specify profile and alignment on sink template - Set supported profile(s) on sink template caps, so that decodebin - can filter out this element if profile of given vp9 stream is not - supported by hardware decoder. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1567> - -2020-09-10 21:31:38 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp8dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Cleanup code - * Don't need to set pts/dts/duration on output buffer of frame. - it's handled by baseclass - * Remove meaningless debug output - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1567> - -2020-08-22 12:44:16 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Calculate and set latency - Add gst_h264_decoder_set_latency(), which calculates and sets - latency on base decoder class, after new_sequence is called. - This assumes that in new_sequence() vmethod, callee negotiates - downstream caps. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1531> - -2020-08-22 12:47:23 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - Revert "va: h264dec: set latency" - This reverts commit 3aedef4c8601dcafb065d8095a927f1cd528056f. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1531> - -2020-09-14 14:42:36 +0300 Jordan Petridis <jordan@centricular.com> - - * tests/check/gst-plugins-bad.supp: - validate: plug leak in gssdp - These are triggered by the webrtcbin tests - https://gitlab.gnome.org/GNOME/gssdp/-/issues/10 - -2020-09-04 23:34:16 +0800 yychao <yychao@realtek.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Parse Audio Preselection Descriptor - For Dolby AC4 audio experience, parsing PMTs/APD from transport stream layer for all available presentations. - Refer to ETSI EN 300 468 V1.16.1 (2019-05) - 1. 6.4.1 Audio preselection descriptor - 2. Table M.1: Mapping of codec specific values to the audio preselection descriptor - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1555> - -2020-09-04 23:28:58 +0800 yychao <yychao@realtek.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Add new API for fetching extended descriptors - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1555> - -2020-08-26 15:45:35 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/utils.h: - * ext/webrtc/webrtcsdp.c: - * ext/webrtc/webrtcsdp.h: - * tests/check/elements/webrtcbin.c: - webrtc: propagate more errors through the promise - Return errors on promises when things fail where available. - Things like parsing errors, invalid states, missing fields, unsupported - transitions, etc. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1565> - -2020-07-01 07:35:08 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/vulkan/meson.build: - meson: Do not warn when a windowing system is not found - Error out when the vulkan option is enabled, and just print - a message() otherwise. This is more correct and also allows us to pass - --fatal-meson-warnings more reliably. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1391> - -2020-09-10 10:35:11 -0700 Adam Williamson <awilliam@redhat.com> - - * ext/opencv/meson.build: - opencv: set opencv_dep when option is disabled (#1406) - The examples build file checks opencv_dep, so it still needs to - be set even if the option is disabled. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1406 - Signed-off-by: Adam Williamson <awilliam@redhat.com> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1570> - -2020-09-10 23:12:10 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: port to new request_sync_point() API - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1571> - -2020-07-28 18:32:03 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - h264decoder: Fix various typos - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1563> - -2020-07-28 18:39:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Minor cleanup - Move few variables in their respective scope. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1563> - -2020-07-22 15:40:14 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Fix B-Frame weight table - We where not setting the luma l1 weight table. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1563> - -2020-09-09 21:38:33 +0900 Seungha Yang <seungha@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/videoparsers/gstvp9parse.c: - * gst/videoparsers/gstvp9parse.h: - * gst/videoparsers/meson.build: - * gst/videoparsers/plugin.c: - * tests/check/elements/vp9parse.c: - * tests/check/elements/vp9parse.h: - * tests/check/meson.build: - videoparsers: Add vp9parse element - Adding vp9parse element to parse various stream information such as - resolution, profile, and so on. If upstream does not provide resolution and/or - profile, this would be useful for decodebin pipeline for autoplugging - suitable decoder element depending on template caps of each decoder element. - In addition, vp9parse element supports unpacking superframe into - single frame for decoders. The vp9 superframe is a frame which consists - of multiple frames (or superframe with one frame is allowed) followed by superframe - index block. Then unpacked each frame will be considered as normal frame - by decoder. The decision for unpacking will be done by downstream element's - "alignment" caps field, which can be "super-frame" or "frame". - If downstream specifies the "alignment" as "frame", - then vp9parse element will split an incoming superframe into single frames - and the superframe index (located at the end of the superframe) data - will be discarded by vp9parse element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1041> - -2020-06-16 21:09:36 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfcapturewinrt.cpp: - * sys/mediafoundation/gstmfsourceobject.c: - * sys/mediafoundation/gstmfsourceobject.h: - * sys/mediafoundation/gstmfsourcereader.cpp: - * sys/mediafoundation/gstmfvideosrc.c: - * sys/mediafoundation/mediacapturewrapper.cpp: - * sys/mediafoundation/mediacapturewrapper.h: - mfvideosrc: Set timestamp on buffer when it's captured - Capture the timestamp immediately when new frame is arrived, - instead of doing that on ::create() method. There would be - time gap between captured time and outputting time. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1351> - -2020-09-04 16:53:03 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/closedcaption/gstline21enc.c: - * ext/closedcaption/gstline21enc.h: - * tests/check/elements/line21.c: - line21enc: add remove-caption-meta property - Similar to #GstCCExtractor:remove-caption-meta - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1554> - -2020-09-04 02:38:58 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/closedcaption/gstline21enc.c: - * tests/check/elements/line21.c: - line21enc: heavily constrain video height - We can only determine a correct placement for the CC line - with: - * height == 525 (standard NTSC, line 21 / 22) - * height == 486 (NTSC usable lines + 6 lines for VBI, line 1 / 2) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1554> - -2020-09-04 02:33:52 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstline21enc.c: - line21enc: add support for CDP closed caption meta - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1554> - -2020-08-27 11:23:01 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Add another nominal bitrate fallback calculation - Some HTTP servers don't provide fragment sizes (with the Content-Length HTTP - header). In order to still figure out a nominal bitrate (for usage by queue2), - calculate on when we're done downloading a fragment. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1544> - -2020-08-27 11:18:56 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Handle invalid HTTP duration - The default BYTE DURATION basesrc query handler will return `-1` and TRUE. In - order to properly handle cases where upstream http servers didn't return a valid - Content-Length we also need to check whether it was valid when calculating - bitrates. - Avoids returning completely bogus bitrates with gogol's video streaming services - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1544> - -2020-08-12 20:31:32 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvideobuffer.cpp: - * sys/mediafoundation/gstmfvideobuffer.h: - * sys/mediafoundation/gstmfvideoenc.cpp: - * sys/mediafoundation/meson.build: - * sys/mediafoundation/plugin.c: - mfvideoenc: Add support for zero-copy encoding - Add custom IMFMediaBuffer and IMF2DBuffer implementation in order to - keep track of lifecycle of Media Foundation memory object. - By this new implementation, we can pass raw memory of upstream buffer - to Media Foundation without copy. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1518> - -2020-09-01 13:28:44 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/gstrtmp2src.c: - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: Replace stats queue with stats lock - Making the thread receiving the stats wait on the loop to respond was - not a good idea, as the latter can get blocked on the streaming thread. - Have get_stats read the values directly, adding a lock to ensure we - don't read garbage. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1550> - -2020-08-19 14:51:17 +0300 Nazar Mokrynskyi <nazar@mokrynskyi.com> - - * docs/meson.build: - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/rtmp/rtmpclient.h: - rtmp2sink: add docs section with since marker on new stop-commands property - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1256> - -2020-08-18 19:16:40 +0300 Nazar Mokrynskyi <nazar@mokrynskyi.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/rtmp2/gstrtmp2sink.c: - rtmp2: fix code style, update documentation cache - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1256> - -2020-08-18 14:05:26 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/gstrtmp2.c: - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/rtmp/rtmpclient.c: - * gst/rtmp2/rtmp/rtmpclient.h: - rtmp2: Clean up (improve) GstRtmpStopCommands type - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1256> - -2020-05-02 04:49:42 +0300 Nazar Mokrynskyi <nazar@mokrynskyi.com> - - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/rtmp/rtmpclient.c: - * gst/rtmp2/rtmp/rtmpclient.h: - rtmp2sink: handle EOS event and close stream - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1285 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1256> - -2020-09-02 15:29:49 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/gstbasetsmux.h: - mpegtsmux: Make handling of sinkpads thread-safe - Ensure we take the object lock while accessing `GstElement.sinkpads`. - Use an iterator when the code isn't simple to avoid deadlock. - When we find the best pad, take a reference so a concurrent pad - release doesn't destroy the pad before we're done with it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1553> - -2020-09-01 13:29:30 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/hls/gsthlssink2.c: - hlssink2: Actually release splitmuxsink's pads - It was looking at the "outer" peer of the ghost pad, not the "inner" - peer (the target). - It provided the wrong pad to gst_element_release_request_pad. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1551> - -2020-09-08 10:48:56 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - mpegtsmux: Don't create streams with reserved PID - There are quite a few reserved PID in the various MPEG-TS (and derivate) - specifications which we should definitely not use. Those PID have a certain - meaning and purpose. - Furthermore, a lot of the code in the muxer implementation also makes assumption - on the purpose of streams based on their PID. - Therefore, when requesting a pad with a specific PID, make sure it is not a - restricted PID. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1561> - -2020-09-08 17:30:42 +0100 Tim-Philipp Müller <tim@centricular.com> - - * .gitlab-ci.yml: - ci: include template from gst-ci master branch again - -2020-09-08 16:58:50 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - Back to development - -=== release 1.18.0 === - -2020-09-08 00:07:45 +0100 Tim-Philipp Müller <tim@centricular.com> - - * .gitlab-ci.yml: - * ChangeLog: - * NEWS: - * README: - * RELEASE: - * gst-plugins-bad.doap: - * meson.build: - Release 1.18.0 - -2020-09-07 22:48:27 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - * scripts/dist-translations.py: - * scripts/meson.build: - meson: dist pot file in tarball - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1558> - -2020-09-07 12:14:47 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/x265/gstx265enc.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh265enc.c: - gst: Update for gst_video_transfer_function_*() function renaming - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1557> - -2020-09-01 15:05:07 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * tests/check/elements/mpegtsmux.c: - tests: mpegtsmux: Test that we can manipulate pads after stop - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1552> - -2020-09-01 14:56:55 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/gstbasetsmux.c: - mpegtsmux: Keep mux usable after stop - Otherwise you cannot request new pads until after it is started again. - gst_base_ts_mux_reset with FALSE is still called in the dispose - implementation, so the muxer still gets deallocated when we actually - clean up. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1552> - -2020-09-01 13:32:44 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvp9dec.c: - msdkvp9dec: change the include header order - This fixes the compiler error when MFX_VERSION_USE_LATEST is defined in - the SDK. - /usr/include/mfx/mfxvp9.h:48:5: error: unknown type name ‘mfxExtBuffer’ - mfxExtBuffer Header; - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1549> - -2020-08-29 02:42:12 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/rtmp2/gstrtmp2locationhandler.c: - rtmp2: Need to unescape the userinfo before setting - This regressed in 827afa206d8c9675f2a7af402396552c2ed1df09. The same - fix was also committed to the webrtc element, but rtmp2 was missed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1547> - -2020-08-29 02:40:44 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/webrtc/gstwebrtcice.c: - webrtc: Clean up the userinfo unescaping code - Continuation from 04fd705906f4bd4cf1901001484e60c21e1b3139. This is - easier to understand and also avoids two copies. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1547> - -2020-08-25 10:04:53 +0200 Jérôme Laheurte <jerome@jeromelaheurte.net> - - * sys/dshowsrcwrapper/BUILD.txt: - * sys/dshowsrcwrapper/CMakeLists.txt: - dshowsrcwrapper: Update build instructions. Add _builddir to include search path. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1537> - -2020-08-28 07:53:26 +1000 Jonathan Matthew <jonathan@d14n.org> - - * ext/modplug/gstmodplug.cc: - modplug: avoid division by zero - Under some conditions, GetMaxPosition() returns zero, which should cause - position queries to fail rather than crash. - -2020-08-21 18:40:59 -0400 trilene <trilene@runbox.com> - - * ext/webrtc/gstwebrtcice.c: - webrtc: Unescape turnserver user and password - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1530> - -2020-08-22 23:33:48 +0200 Fabrice Fontaine <fontaine.fabrice@gmail.com> - - * gst-libs/gst/opencv/meson.build: - meson: allow the user to disable opencv - Allow the user to really disable opencv through meson (i.e. - -Dopencv=disabled). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1533> - -2020-08-25 23:46:16 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_constants.h: - sctp: usrsctp: increase DIAG_MSG_LEN to accomodate longer file path - Fixes "‘%s’ directive output truncated writing XX bytes into - a region of size NN -Wformat-truncation=" compiler warnings. - https://github.com/sctplab/usrsctp/pull/521 - Fixes #1389 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1540> - -2020-08-25 10:49:11 +0200 Jérôme Laheurte <jerome@jeromelaheurte.net> - - * sys/dshowsrcwrapper/gstdshow.cpp: - dshowsrcwrapper: fix typo in variable name - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1538> - -2020-08-21 16:28:42 +0200 Wim Taymans <wtaymans@redhat.com> - - * gst-libs/gst/vulkan/meson.build: - vulkan: fix the enumtypes install path - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1528> - -2020-08-22 14:38:38 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/gstwpesrc.cpp: - wpe: skip glbasesrc decide_allocation when non-GL caps are negotiated - Checking for GL caps features in gl_start() was done too late in case the parent - class fails to setup a working GL context. The element now determines if GL - support should be enabled during the decide-allocation query handling. - Additionally, when no GL context was found, we need to handle the element - cleanup because in that situation glbasesrc won't call gl_stop. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1376 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1532> - -2020-08-21 22:48:48 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Fix possible GstH264Picture leak and small cleanup - Don't leak pictures when dpb is full unexpectedly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1527> - -2020-08-21 02:36:13 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Fix crash caused by missing null termination - gst_caps_features_new() must be null terminated. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1524> - -2020-08-19 16:50:46 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - va: allocator: remove parameter from _create_buffer_surface() - Don't the allocator to _create_buffer_surface() since it's not used. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1516> - -2020-08-19 17:18:26 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvautils.c: - va: utils: free allocated string - and fix a memleak - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1516> - -2020-08-18 09:05:00 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvautils.c: - va: utils: fix log category initialization - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1516> - -2020-08-18 11:39:46 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - * sys/va/gstvah264dec.h: - va: h264dec: check va allocator at decide allocation - And some code cleanups - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1516> - -2020-08-18 11:38:46 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadecoder.c: - va: decoder: improve locks for member variable access - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1516> - -2020-08-24 17:01:59 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/webrtcdatachannel.c: - webrtc/datachannel: clear the error after use - Fixes a memory leak - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1535> - -2020-08-24 17:01:22 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/webrtcdatachannel.c: - * gst-libs/gst/webrtc/datachannel.c: - webrtc/datachannel: free previous protocol/label fields - Fixes a memory leak - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1535> - -2020-08-24 17:00:30 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: unref GBytes after use - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1535> - -2020-08-24 16:58:41 +1000 Matthew Waters <matthew@centricular.com> - - * ext/sctp/gstsctpdec.c: - sctpdec: unref after retrieving the static pad template - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1535> - -=== release 1.17.90 === - -2020-08-20 16:14:23 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * gst-plugins-bad.doap: - * meson.build: - Release 1.17.90 - -2020-08-20 12:58:30 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcice.c: - webrtc/ice: resolve .local candidates internally - Requires the system's DNS resolver to support mdns resolution. - Fixes interoperablity with recent versions of chrome/firefox that - produce .local address in for local candidates. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1139 - -2020-08-19 11:46:31 +0000 J. Kim <jeongseok.kim@sk.com> - - * ext/srt/gstsrtobject.c: - srtobject: set error when canceled waiting for a caller - To propagate error, this commit sets a reason. Otherwise, the function - caller should check if `error` is NULL when the return value is not normal. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1522> - -2020-08-19 11:30:47 +0000 J. Kim <jeongseok.kim@sk.com> - - * ext/srt/gstsrtobject.c: - srtobject: fix typo, s/errorj/error - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1522> - -2020-08-17 18:51:17 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/meson.build: - docs: fix gst-docs build if opencv is not being built - The disabler in opencv_dep (retrieved via libs_doc) will - cause a meson interpreter error if opencv is not being built: - ERROR: The += operator currently only works with arrays, dicts, strings or ints - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1519> - -2020-08-14 19:57:30 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * ext/fdkaac/gstfdkaacenc.c: - * ext/fdkaac/gstfdkaacenc.h: - fdkaacenc: Implement flush function - The internal fdk encoder always produces 1024 bytes even with no input, - so special care should be taken to not drain it twice. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1515> - -2020-08-17 21:39:13 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfutils.cpp: - mediafoundation: Correct wrong raw video format mapping - Was a shameful mistake - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1517> - -2020-08-08 19:59:33 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: h264dec: set latency - The min latency is calculated with the maximum number of frames that - precede any frame, if available, and it is lower than the maximum - number of frames in DBP. - The max latency is calculated with the maxium size of frames in DBP. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1500> - -2019-05-16 20:40:14 +0200 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/fdkaac/gstfdkaacenc.c: - fdkaacenc: Refactor layout selection code - No functional change. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1359> - -2020-06-18 11:33:49 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/fdkaac/gstfdkaac.c: - * ext/fdkaac/gstfdkaac.h: - * ext/fdkaac/gstfdkaacenc.c: - * ext/fdkaac/meson.build: - * ext/fdkaac/plugin.c: - fdkaacenc: Move channel layouts to gstfdkaac.c - In preparation of sharing them with the decoder. Iteration of the - channel layouts needs to be changed to use a sentinel element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1359> - -2020-08-12 15:59:01 +1000 Matthew Waters <matthew@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/vulkan/vksink.c: - * gst-libs/gst/vulkan/gstvkapi.h: - * gst-libs/gst/vulkan/gstvkbarrier.h: - * gst-libs/gst/vulkan/gstvkbuffermemory.c: - * gst-libs/gst/vulkan/gstvkbuffermemory.h: - * gst-libs/gst/vulkan/gstvkbufferpool.h: - * gst-libs/gst/vulkan/gstvkcommandbuffer.c: - * gst-libs/gst/vulkan/gstvkcommandbuffer.h: - * gst-libs/gst/vulkan/gstvkcommandpool.c: - * gst-libs/gst/vulkan/gstvkcommandpool.h: - * gst-libs/gst/vulkan/gstvkdebug.c: - * gst-libs/gst/vulkan/gstvkdebug.h: - * gst-libs/gst/vulkan/gstvkdescriptorcache.c: - * gst-libs/gst/vulkan/gstvkdescriptorcache.h: - * gst-libs/gst/vulkan/gstvkdescriptorpool.c: - * gst-libs/gst/vulkan/gstvkdescriptorpool.h: - * gst-libs/gst/vulkan/gstvkdescriptorset.c: - * gst-libs/gst/vulkan/gstvkdescriptorset.h: - * gst-libs/gst/vulkan/gstvkdevice.c: - * gst-libs/gst/vulkan/gstvkdevice.h: - * gst-libs/gst/vulkan/gstvkdisplay.c: - * gst-libs/gst/vulkan/gstvkdisplay.h: - * gst-libs/gst/vulkan/gstvkerror.c: - * gst-libs/gst/vulkan/gstvkerror.h: - * gst-libs/gst/vulkan/gstvkfence.c: - * gst-libs/gst/vulkan/gstvkfence.h: - * gst-libs/gst/vulkan/gstvkformat.c: - * gst-libs/gst/vulkan/gstvkformat.h: - * gst-libs/gst/vulkan/gstvkfullscreenquad.c: - * gst-libs/gst/vulkan/gstvkfullscreenquad.h: - * gst-libs/gst/vulkan/gstvkhandle.c: - * gst-libs/gst/vulkan/gstvkhandle.h: - * gst-libs/gst/vulkan/gstvkhandlepool.c: - * gst-libs/gst/vulkan/gstvkhandlepool.h: - * gst-libs/gst/vulkan/gstvkimagebufferpool.h: - * gst-libs/gst/vulkan/gstvkimagememory.c: - * gst-libs/gst/vulkan/gstvkimagememory.h: - * gst-libs/gst/vulkan/gstvkimageview.c: - * gst-libs/gst/vulkan/gstvkimageview.h: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkinstance.h: - * gst-libs/gst/vulkan/gstvkmemory.c: - * gst-libs/gst/vulkan/gstvkmemory.h: - * gst-libs/gst/vulkan/gstvkphysicaldevice.h: - * gst-libs/gst/vulkan/gstvkqueue.c: - * gst-libs/gst/vulkan/gstvkqueue.h: - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/gstvkswapper.h: - * gst-libs/gst/vulkan/gstvktrash.c: - * gst-libs/gst/vulkan/gstvktrash.h: - * gst-libs/gst/vulkan/gstvkutils.c: - * gst-libs/gst/vulkan/gstvkvideofilter.c: - * gst-libs/gst/vulkan/gstvkvideofilter.h: - * gst-libs/gst/vulkan/gstvkwindow.c: - * gst-libs/gst/vulkan/gstvkwindow.h: - * gst-libs/gst/vulkan/vulkan_fwd.h: - * gst-libs/gst/vulkan/wayland/gstvkdisplay_wayland.c: - * gst-libs/gst/vulkan/wayland/gstvkdisplay_wayland.h: - * gst-libs/gst/vulkan/xcb/gstvkdisplay_xcb.c: - * gst-libs/gst/vulkan/xcb/gstvkdisplay_xcb.h: - vulkan: docs annotation updates - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1506> - -2020-08-11 21:56:39 +1000 Matthew Waters <matthew@centricular.com> - - * docs/libs/vulkan-wayland/index.md: - * docs/libs/vulkan-wayland/sitemap.txt: - * docs/libs/vulkan-xcb/index.md: - * docs/libs/vulkan-xcb/sitemap.txt: - * docs/libs/vulkan/index.md: - * docs/libs/vulkan/sitemap.txt: - * docs/meson.build: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan_fwd.h: - * gst-libs/gst/vulkan/vulkan_mkenum.py: - * gst-libs/gst/vulkan/wayland/wayland.h: - * gst-libs/gst/vulkan/xcb/xcb.h: - * pkgconfig/gstreamer-vulkan-uninstalled.pc.in: - * pkgconfig/gstreamer-vulkan-wayland-uninstalled.pc.in: - * pkgconfig/gstreamer-vulkan-wayland.pc.in: - * pkgconfig/gstreamer-vulkan-xcb-uninstalled.pc.in: - * pkgconfig/gstreamer-vulkan-xcb.pc.in: - * pkgconfig/gstreamer-vulkan.pc.in: - * pkgconfig/meson.build: - build/vulkan: split vulkan gir - also add to docs - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1506> - -2020-08-05 18:41:45 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - * ext/wpe/gstwpesrc.cpp: - wpe: WebView and WebContext handling fixes - The WPEThreaded view is now split in 2 classes: - - WPEContextThread handles the persistent WebKit thread, where all WebKit API - calls should be handled. - - WPEView: is created from the WPEContextThread. It handles the WebView and - maintains the public interface on which wpesrc relies. This is the facade for - the WebView, basically. It takes care of dispatching API calls into the context - thread. - With these fixes it is now possible to create (and reuse) mutlple wpesrc - elements during the application lifetime. - Fixes #1372 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1484> - -2020-08-07 09:26:19 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/sctpassociation.c: - sctp: fix build with GST_DISABLE_GST_DEBUG - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1465> - -2020-07-25 17:56:43 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/sctp/meson.build: - * ext/sctp/usrsctp/meson.build: - * ext/sctp/usrsctp/usrsctplib/meson.build: - * meson_options.txt: - sctp: hook up internal copy of libusrsctp to build - Add option 'sctp-internal-usrsctp' so people can choose - to build againts the distro version instead. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/870 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1465> - -2020-07-24 19:23:19 +0100 Tim-Philipp Müller <tim@centricular.com> - - * .indentignore: - * ext/sctp/usrsctp/.gitignore: - * ext/sctp/usrsctp/LICENSE.md: - * ext/sctp/usrsctp/meson.build: - * ext/sctp/usrsctp/meson_options.txt: - * ext/sctp/usrsctp/usrsctplib/Makefile.am: - * ext/sctp/usrsctp/usrsctplib/meson.build: - * ext/sctp/usrsctp/usrsctplib/netinet/meson.build: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_asconf.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_asconf.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_auth.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_auth.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_bsd_addr.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_bsd_addr.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_callout.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_callout.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_cc_functions.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_constants.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_crc32.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_crc32.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_header.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_indata.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_indata.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_input.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_input.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_lock_userspace.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_os.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_os_userspace.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_output.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_output.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_pcb.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_pcb.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_peeloff.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_peeloff.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_process_lock.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_sha1.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_sha1.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_ss_functions.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_structs.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_sysctl.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_sysctl.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_timer.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_timer.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_uio.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_userspace.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_usrreq.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctp_var.h: - * ext/sctp/usrsctp/usrsctplib/netinet/sctputil.c: - * ext/sctp/usrsctp/usrsctplib/netinet/sctputil.h: - * ext/sctp/usrsctp/usrsctplib/netinet6/meson.build: - * ext/sctp/usrsctp/usrsctplib/netinet6/sctp6_usrreq.c: - * ext/sctp/usrsctp/usrsctplib/netinet6/sctp6_var.h: - * ext/sctp/usrsctp/usrsctplib/user_atomic.h: - * ext/sctp/usrsctp/usrsctplib/user_environment.c: - * ext/sctp/usrsctp/usrsctplib/user_environment.h: - * ext/sctp/usrsctp/usrsctplib/user_inpcb.h: - * ext/sctp/usrsctp/usrsctplib/user_ip6_var.h: - * ext/sctp/usrsctp/usrsctplib/user_ip_icmp.h: - * ext/sctp/usrsctp/usrsctplib/user_malloc.h: - * ext/sctp/usrsctp/usrsctplib/user_mbuf.c: - * ext/sctp/usrsctp/usrsctplib/user_mbuf.h: - * ext/sctp/usrsctp/usrsctplib/user_queue.h: - * ext/sctp/usrsctp/usrsctplib/user_recv_thread.c: - * ext/sctp/usrsctp/usrsctplib/user_recv_thread.h: - * ext/sctp/usrsctp/usrsctplib/user_route.h: - * ext/sctp/usrsctp/usrsctplib/user_socket.c: - * ext/sctp/usrsctp/usrsctplib/user_socketvar.h: - * ext/sctp/usrsctp/usrsctplib/user_uma.h: - * ext/sctp/usrsctp/usrsctplib/usrsctp.h: - sctp: import internal copy of usrsctp library - There are problems with global shared state and no API stability - guarantees, and we can't rely on distros shipping the fixes we - need. Both firefox and Chrome bundle their own copies too. - Imported from https://github.com/sctplab/usrsctp, - commit 547d3b46c64876c0336b9eef297fda58dbe1adaf - Date: Thu Jul 23 21:49:32 2020 +0200 - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/870 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1465> - -2020-08-12 11:57:10 +0100 Jose Quaresma <quaresma.jose@gmail.com> - - * gst/proxy/gstproxysink.c: - proxysink: event_function needs to handle the event when it is disconnecetd from proxysrc - without this a disconneted proxysink fail when goes to play with error: - Internal data stream error. - streaming stopped, reason error (-5) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1508> - -2020-08-13 20:19:21 +0900 Seungha Yang <seungha@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - cccombiner: Correct sink_query chain up and fix caps leaks - Don't chain up to src_query() from sink_query() method, and - returned caps by gst_static_pad_template_get_caps() needs to be - cleared. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1513> - -2020-08-13 02:24:52 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/plugin.c: - mediafoundation: Call MFShutdown when destroying plugin - MFStartup and MFShutdown should be paired as documented in - https://docs.microsoft.com/en-us/windows/win32/api/mfapi/nf-mfapi-mfstartup#remarks - Otherwise valgrind-like tools would report false positive memory leak. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1512> - -2020-08-04 17:14:44 +0800 Xu Guangxin <guangxin.xu@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: do not hold too many input buffers in locked list - If the surface is locked before vpp, upstream takes the reference. - We do not need to take a reference for msdk in vpp. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1490> - -2020-08-03 15:29:08 +0800 Xu Guangxin <guangxin.xu@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - msdkvpp: refact, put input and output surface in diffrent list - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1490> - -2020-08-12 17:03:00 +0000 Felix Yan <felixonmars@archlinux.org> - - * gst/videoparsers/gsth264parse.c: - Correct typos in gsth264parse.c - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1511> - -2020-07-07 04:31:50 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11format.c: - d3d11: Handle newly added GST_VIDEO_TRANSFER_BT601 - Use the value for mapping between DXGI_COLOR_SPACE_TYPE and GstVideoColorimetry. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1410> - -2020-08-12 17:11:57 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11utils.c: - d3d11: Store more device information in context structure - It would be more informative for debugging - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1507> - -2020-08-12 17:02:31 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11utils.c: - d3d11: Selected adapter index should be unsigned integer - If d3d11device was created successfully, the index of adapter - must not be negative value - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1507> - -2020-08-11 17:17:39 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Add new H.264 levels - The spec now list 6, 6.1 and 6.2. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1509> - -2020-08-08 19:59:49 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: h264dec: remove spurious comment - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1499> - -2020-08-08 19:59:11 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: h264dec: check return value of gst_va_handle_set_context() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1499> - -2020-06-16 12:42:16 +0900 Hosang Lee <hosang10.lee@lge.com> - - * ext/smoothstreaming/gstmssmanifest.c: - smoothstreaming: start closer to the edge in live streams - It is more appropriate to start closer to the live edge in - live streams. Some live streams maintain a large dvr window - (over few hours in some cases), so starting from the first - fragment will be too far away from the live edge. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1346> - -2020-08-07 09:37:20 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - * tests/check/elements/cccombiner.c: - cccombiner: Update for additional info parameter to the "samples-selected" signal - See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/590 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1498> - -2020-07-24 17:31:36 +1000 Matthew Waters <matthew@centricular.com> - - * meson.build: - * sys/applemedia/meson.build: - * sys/nvcodec/meson.build: - build: update for gl pkg-config file split - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1462> - -2020-08-06 19:11:34 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/meson.build: - docs: include *.cc and *.hh in gst-c-sources - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1491> - -2020-08-04 16:33:34 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/mpeg2enc/gstmpeg2encoder.cc: - * ext/mpeg2enc/gstmpeg2encoder.hh: - * ext/mpeg2enc/gstmpeg2encoptions.cc: - * ext/mpeg2enc/gstmpeg2encoptions.hh: - mpeg2enc: add disable-encode-retries property - MJPEG Tools may reencode pictures in a second pass to stick - closer to the target bitrate. This can result in slower than - real-time encoding for full HD content in certain situations, - as entire GOPs need reencoding when the reference picture is - reencoded. - See https://sourceforge.net/p/mjpeg/bugs/141/ for background - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1491> - -2020-08-04 16:05:55 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/mpeg2enc/gstmpeg2enc.cc: - mpeg2enc: report a latency - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1491> - -2020-08-04 16:05:33 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mpeg2enc/gstmpeg2encoptions.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - * ext/mpeg2enc/gstmpeg2encstreamwriter.cc: - mpeg2enc: finalize GstVideoEncoder port - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1491> - -2013-06-23 16:38:49 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/mpeg2enc/gstmpeg2encoder.cc: - * ext/mpeg2enc/gstmpeg2encstreamwriter.cc: - * ext/mpeg2enc/gstmpeg2encstreamwriter.hh: - mpeg2enc: store video encoder instance directly in stream writer class - Instead of storing the pad and then only using it to get the - element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1491> - -2013-06-23 16:33:59 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/mpeg2enc/gstmpeg2encstreamwriter.cc: - * ext/mpeg2enc/gstmpeg2encstreamwriter.hh: - mpeg2enc: remove unused streamwriter member 'buf' - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1491> - -2013-06-23 15:07:53 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/mpeg2enc/gstmpeg2enc.cc: - mpeg2enc: remove some unused code - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1491> - -2013-06-23 14:32:15 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/mpeg2enc/gstmpeg2encoder.cc: - * ext/mpeg2enc/gstmpeg2encoptions.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.hh: - * ext/mpeg2enc/gstmpeg2encstreamwriter.cc: - * ext/mpeg2enc/gstmpeg2encstreamwriter.hh: - mpeg2enc: remove code paths for older mjpegtools versions - Gets rid of lots of code paths that no one has built, - used or tested for ages, and makes code more maintainable. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1491> - -2012-10-01 13:11:29 +0200 Alban Browaeys <prahal@yahoo.com> - - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mpeg2enc/gstmpeg2enc.hh: - * ext/mpeg2enc/gstmpeg2encoder.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - * ext/mpeg2enc/gstmpeg2encstreamwriter.cc: - mpeg2enc: initial port to GstVideoEncoder base class - https://bugzilla.gnome.org/show_bug.cgi?id=685414 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1491> - -2020-08-05 10:52:08 +0300 Sebastian Dröge <sebastian@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosink.cpp: - decklink: Re-order modes enum for backwards compatibility with 1.16 - The PAL/NTSC widescreen modes were added after 1.16 but inserted before - the HD modes, which changed the integer values of the enums. - Move them to the very end instead to keep backwards compatibility. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1048 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1492> - -2020-08-05 11:21:48 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/srt/gstsrtobject.c: - srt: Add support for using hostnames instead of IP addresses - If an address can't be parsed as IP address, try resolving it via - GResolver instead. SRT URIs more often than not contain hostnames and - without trying to resolve them we won't be able to handle such URIs. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1493> - -2020-08-05 16:57:15 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - cccombiner: update to new samples selection API - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1497> - -2020-08-05 12:35:12 +0300 Jordan Petridis <jordan@centricular.com> - - * ext/opencv/meson.build: - * gst-libs/gst/opencv/meson.build: - opencv: compile with -Wno-format-nonliteral - opencv plugin is pulling a header which makses clang++ 10 - complain a lot and blocks -werror. - ``` - /usr/include/opencv4/opencv2/flann/logger.h:83:36: error: format string is not a string literal -Werror,-Wformat-nonliteral - int ret = vfprintf(stream, fmt, arglist); - ^~~ - ``` - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1494> - -2020-08-05 12:31:53 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst-libs/gst/player/gstplayer.h: - player: Add g_autoptr() support - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1495> - -2020-08-03 18:40:31 +0300 Jordan Petridis <jordan@centricular.com> - - * ext/lv2/gstlv2utils.c: - gstlv2utils.c: avoid implicit float to int conversion - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1487> - -2020-08-03 18:35:56 +0300 Jordan Petridis <jordan@centricular.com> - - * gst/autoconvert/gstautoconvert.c: - gstautoconvert.c: fix clang warnings - clang 10 is complaining about incompatible types due to the - glib typesystem. - ``` - gst-plugins-bad/gst/autoconvert/b5c3019@@gstautoconvert@sha/gstautoconvert.c.o' -c ../subprojects/gst-plugins-bad/gst/autoconvert/gstautoconvert.c - ../subprojects/gst-plugins-bad/gst/autoconvert/gstautoconvert.c:898:8: error: incompatible pointer types passing 'typeof ((((void *)0))) *' (aka 'void **') to parameter of type 'GList **' (aka 'struct _GList **') -Werror,-Wincompatible-pointer-types - if (!g_atomic_pointer_compare_and_exchange (&autoconvert->factories, NULL, - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - /usr/include/glib-2.0/glib/gatomic.h:192:44: note: expanded from macro 'g_atomic_pointer_compare_and_exchange' - __atomic_compare_exchange_n ((atomic), &gapcae_oldval, (newval), FALSE, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) ? TRUE : FALSE; \ - ^~~~~~~~~~~~~~ - 1 error generated. - ``` - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1487> - -2020-08-03 18:25:28 +0300 Jordan Petridis <jordan@centricular.com> - - * ext/ladspa/gstladspautils.c: - gstladspautils.c: avoid implicit float to int conversion - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1487> - -2020-07-27 15:45:49 +0200 Andrew Branson <andrew.branson@jolla.com> - - * sys/androidmedia/gst-android-hardware-camera.c: - * sys/androidmedia/gst-android-hardware-camera.h: - androidmedia: ignore additional camera effects if not present - Fixes https://gitlab.freedesktop.org/gstreamer/cerbero/-/issues/283 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1470> - -2020-08-04 05:34:23 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson.build: - meson: Only look for Obj-C/C++ compilers on macOS/iOS - On Windows, MinGW-GCC Objective-C/C++ compilers can be in PATH and - mess up the build since they may not match the CPU family of the C/C++ - compilers we are using. - Also require them on macOS/iOS, because they should always be present. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/88 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1488> - -2020-08-04 10:38:30 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: h264dec: log if upstream pool is kept - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1489> - -2020-08-04 10:24:49 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvautils.c: - va: utils: fix precondition check for handle_context_query() - display paramater can be NULL, but if it's not, it has to be a - GstVaDisplay. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1489> - -2020-08-04 10:20:46 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * tests/examples/va/main.c: - va: tests: example: Fix memory leaks - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1489> - -2020-07-30 18:26:34 +0200 Francisco Javier Velázquez-García <francisco.velazquez@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srtobject: Add support for IPv6 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1477> - -2020-07-30 18:26:34 +0200 Francisco Javier Velázquez-García <francisco.velazquez@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srtobject: Reset parameters before setting URI - This makes `gst_srt_object_validate_parameters` work properly since - `localaddress` and `localport` will be missing if the URL did not - provide them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1477> - -2020-07-30 18:26:33 +0200 Francisco Javier Velázquez-García <francisco.velazquez@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srtobject: Simplify gst_srt_object_set_*_value - This fixes `gst_srt_object_set_string_value` in particular because the - value might not be a static string. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1477> - -2020-07-30 18:26:33 +0200 Francisco Javier Velázquez-García <francisco.velazquez@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - srtobject: Store passphrase like other parameters - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1477> - -2020-08-01 02:18:39 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/webrtc/gstwebrtcice.c: - * gst/rtmp2/gstrtmp2locationhandler.c: - webrtc, rtmp2: Warn if the user or password aren't escaped - If the user/pass aren't escaped, the userinfo will be ambiguous and we - won't know where to split. We will accidentally get it right if the : - belongs in the password. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1481> - -2020-08-01 02:12:21 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/webrtc/gstwebrtcice.c: - * gst/rtmp2/gstrtmp2locationhandler.c: - webrtc, rtmp2: Fix parsing of userinfo in URI strings - While parsing the string, `gst_uri_from_string()` also unescapes the - userinfo. This is bad if your username contains a `:` character, since - we will then split the userinfo at the wrong location when parsing it. - To fix this, we can use the new `gst_uri_from_string_escaped()` API - that was added in - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/583 - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/831 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1481> - -2020-08-03 13:50:23 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * tests/examples/meson.build: - * tests/examples/va/main.c: - * tests/examples/va/meson.build: - tests: examples: add va-x11-render example - This a GTK+ example will share, through GstContext, a custom X11 - VADisplay to a pipeline using vah264dec and appsink. - When the frames are processed for rendering, the VASurfaceID is - fetched from the buffer and it is rendered using vaPutSurface in a X11 - widget. - -2020-08-03 13:45:49 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * tests/examples/meson.build: - tests: examples: Comply with compilation order - -2020-08-02 17:52:50 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvaallocator.h: - va: allocator: support for GST_MAP_VA map flag - This flag will return the VASurface value at mapping - -2020-08-02 15:51:08 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - * sys/va/gstvautils.c: - * sys/va/gstvautils.h: - * sys/va/meson.build: - va: context: instanciate VA display through GstContext - Add all the machinery to instanciate VA display through GstContext, - thus all va elements can share the same display and the user can set - a custom one. - -2020-08-03 13:44:23 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: h264dec: don't copy frames if VAMemory capsfeature is negotiated - Otherwise the VASurfaceID is lost. - -2020-08-03 13:42:54 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - va: h264dec: copy render_device_path in klass - It it's not copied both cdata and klass, the string is lost. Thus - also it's freed from cdata when freeing it. - -2020-08-03 13:42:00 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadisplay_wrapped.c: - va: display: wrapped: Fix property name - -2020-08-02 15:54:31 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - * sys/va/gstvah264dec.c: - va: decoder: remove unused argument - And that changes function's namespace - -2020-08-01 21:59:30 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvacaps.c: - va: caps: bail raw caps if driver doesn't report surface formats - This is a bug in Gallium RadeonSI driver for Polaris10, which doesn't - report sufrace formats for reported chroma. - If one chroma doesn't report surface formats, skip the generated caps. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1483> - -2020-08-01 15:47:19 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvaallocator.c: - * sys/va/gstvaallocator.h: - * sys/va/gstvacaps.c: - * sys/va/gstvacaps.h: - * sys/va/gstvadecoder.c: - * sys/va/gstvadecoder.h: - * sys/va/gstvah264dec.c: - * sys/va/gstvavideoformat.c: - * sys/va/gstvavideoformat.h: - va: allocator: get a surface format from a image format - For the allocator to create surfaces with the correct chroma an - fourcc, it should use a surface format, not necessarily the negotiated - format. - Instead of the previous arbitrary extra formats list, the decoder - extracts the valid pixel formats from the given VA config, and pass - that list to the allocator which stores it (full transfer). - Then, when the allocator allocates a new surface, it looks for a - surface color format chroma-compatible with the negotiated image color - format. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1483> - -2020-08-01 15:03:22 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvacaps.c: - va: caps: add raw caps image formats with same chroma of surfaces - Instead of adding a list of ad-hoc formats for raw caps (I420 and - YV12), the display queries the available image formats and we assume - that driver can download frames in that available format with same - chroma of the config surfaces chroma. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1483> - -2020-07-27 11:14:02 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadisplay.c: - * sys/va/gstvadisplay.h: - * sys/va/gstvavideoformat.c: - * sys/va/gstvavideoformat.h: - va: display: add gst_va_display_get_image_formats() - For this it was also added gst_va_video_format_from_va_image_format() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1483> - -2020-07-27 11:14:49 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvadecoder.c: - va: decoder: initialize rt_formas to zero - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1483> - -2020-08-03 19:49:15 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11download.c: - d3d11download: Allow linking with downstream d3d11 elements - It will make pipeline configuration easier since d3d11download - element can be placed unconditionally. This behavior is similar - to that of gldownload element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1485> - -2020-07-27 16:37:20 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlssink2.c: - hlssink2: Don't assert if we don't have a current location when receiving the fragment-closed message - This can happen if the application did not provide an output stream for - the fragment and didn't handle the error message before splitmuxsink - decided to consider the fragment closed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1469> - -2020-07-31 23:38:56 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/meson.build: - opencv: allow compilation against 4.4.x - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1482> - -2020-08-01 02:19:07 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfcapturewinrt.cpp: - * sys/mediafoundation/mediacapturewrapper.cpp: - * sys/mediafoundation/mediacapturewrapper.h: - mfvideosrc: Select common formats if both VideoPreview and VideoRecord are available - Some devices (e.g., Surface Book 2, Surface Pro X) will expose - both MediaStreamType_VideoPreview and MediaStreamType_VideoRecord types - for a logical device. And for some reason, MediaStreamType_VideoPreview - seems to be selected between them while initiailzing device. - But I cannot find any documentation for the decision rule. - To be safe, we will select common formats between them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1478> - -2020-08-01 00:53:46 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/mediacapturewrapper.cpp: - mfvideosrc: Check framerate for target IMediaFrameFormat selection - Not only resolution and format, but framerate needs to be checked - for proper target IMediaFrameFormat selection. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1478> - -2020-07-31 03:46:39 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/mediacapturewrapper.cpp: - mfvideosrc: Handle I420/IYUV subtypes for UWP cases - Microsoft defines two I420 formats, one is I420, and the other is - IYUV (but both are same, just names are different). - Since both will be converted to GST_VIDEO_FORMAT_I420, - we should check both I420 and IYUV subtypes during - GstVideoFormat to Microsoft's format conversion. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1478> - -2020-07-31 03:26:35 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/mediacapturewrapper.cpp: - * sys/mediafoundation/mediacapturewrapper.h: - mfvideosrc: Add more debug log - It would be useful for finding the error reason. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1478> - -2020-07-31 21:07:15 +0900 Seungha Yang <seungha@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - docs: Update wasapi2 and mfvideosrc doc - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1480> - -2020-07-31 20:57:29 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvideosrc.c: - * sys/wasapi2/gstwasapi2sink.c: - * sys/wasapi2/gstwasapi2src.c: - wasapi2, mfvideosrc: Update "dispatcher" property to be only writable - Disallow getting dispatcher pointer, since it doesn't seem to be useful - and might not be safe. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1480> - -2020-07-01 03:59:56 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - * tests/check/elements/cccombiner.c: - cccombiner: implement samples selection API - Call gst_aggregator_selected_samples() after identifying the - caption buffers that will be added as a meta on the next video - buffer. - Implement GstAggregator.peek_next_sample. - Add an example that demonstrates usage of the new API in - combination with the existing buffer-consumed signal. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1390> - -2020-07-29 00:04:40 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/wpe/gstwpesrc.cpp: - wpesrc: timestamp buffers when working with SHM buffers - GLBaseSrc::fill() will take care of that when dealing with - images, but as we don't chain up when dealing with SHM buffers - this needs to be done in order for GLBaseSrc::get_times() to - work appropriately. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1476> - -2020-07-28 23:28:12 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - wpe: fix ready signalling - Receiving the WEBKIT_LOAD_COMMITTED event doesn't actually - mean we have committed an SHM buffer / image yet. - As this is the condition we are interested in, check it - instead. - Also wrap g_cond_wait in a loop for extra correctness points. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1476> - -2020-07-28 11:43:47 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabin-enum.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.h: - basecamerabinsrc: silence g-ir-scanner warnings - They're legit, but there's lots of other stuff that needs - fixing up in this API, so just silence for now and add a - FIXME and leave it for some other day. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1475> - -2020-07-28 12:24:07 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * gst/rist/gstristsrc.c: - ristsrc: drop stream-start & eos messages posted from the internal udp sink(s) - See #1368 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1472> - -2020-07-28 12:16:10 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * gst/rtp/gstrtpsrc.c: - rtpsrc: drop stream-start & eos messages posted from the internal udp sink(s) - See #1368 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1472> - -2020-07-10 21:14:01 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - tsmux: Fix PCR calculation for CBR live streams - Take the first ever timestamp as an offset - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1431> - -2020-07-15 16:25:07 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - tsmux: Refactor get_current_pcr - No functional change. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1431> - -2020-07-28 11:27:37 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - camerabinpreview: fix potential crash on preview pipeline error - Post error message on actual element, not the allocated helper struct. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1474> - -2020-07-22 16:32:37 +0900 Damian Hobson-Garcia <dhobsong@igel.co.jp> - - * ext/wayland/wlbuffer.c: - * ext/wayland/wlbuffer.h: - waylandsink: Update stale GstBuffer references in wayland buffer cache - "waylandsink: use GstMemory instead of GstBuffer for cache lookup" - changes the cache key to GstMemory, but the cached data still needs - a pointer to the GstBuffer to control the buffer lifecycle. - If the GstMemory used as the cache key moves from one GstBuffer to - another, the pointer in the cached data will be out-of-date. - Update the current GstBuffer pointer for each frame so that it always - represents the currently in use (from attach to release) GstBuffer - for each wl_buffer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1473> - -2020-07-25 20:40:52 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2device.c: - wasapi2device: Allow empty caps for UWP use case - If the device has not been activated yet, caps might not be available. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1466> - -2020-07-25 00:17:29 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - * sys/wasapi2/gstwasapi2client.h: - * sys/wasapi2/gstwasapi2sink.c: - * sys/wasapi2/gstwasapi2src.c: - wasapi2: Activate device asynchronously if required - In case of UWP, documentation from MS is saying that - ActivateAudioInterfaceAsync() method should be called from UI thread. - And the resulting callback might not happen until user interaction - has been made. - So we cannot wait the activation result on constructed() method. - and therefore we should return gst_wasapi2_client_new() - immediately without waiting the result if wasapi2 elements are - running on UWP application. - In addition to async operation fix, this commit includes COM object - reference counting issue around ActivateAudioInterfaceAsync() call. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1466> - -2020-07-24 21:53:37 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - * sys/wasapi2/gstwasapi2client.h: - * sys/wasapi2/gstwasapi2device.c: - * sys/wasapi2/gstwasapi2sink.c: - * sys/wasapi2/gstwasapi2src.c: - wasapi2: Add a new property for ICoreDispatcher setting - ... so that ensure device activation on UI thread. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1466> - -2020-07-25 00:24:45 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/mediacapturewrapper.cpp: - * sys/mediafoundation/mediacapturewrapper.h: - mfvideosrc: Only device activation needs to be running on UI thread - ... and the other operations does not have the thread constraint. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1466> - -2020-07-24 20:48:20 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfcapturewinrt.cpp: - * sys/mediafoundation/gstmfcapturewinrt.h: - * sys/mediafoundation/gstmfdevice.c: - * sys/mediafoundation/gstmfsourceobject.c: - * sys/mediafoundation/gstmfsourceobject.h: - * sys/mediafoundation/gstmfvideosrc.c: - * sys/mediafoundation/mediacapturewrapper.cpp: - * sys/mediafoundation/mediacapturewrapper.h: - mfvideosrc: Add a new property for ICoreDispatcher setting - Since the commit c29c71ae9d46cc70e29e0cca2313917f319ef6f2, - device activation method will be called from an internal thread. - A problem is that, CoreApplication::GetCurrentView() - method will return nullptr if it was called from non-UI thread, - and as a result, currently implemented method for accessing ICoreDispatcher - will not work in any case. There seems to be no robust way for - accessing ICoreDispatcher other then setting it by user. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1466> - -2020-07-26 05:42:27 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/mediacapturewrapper.cpp: - mfvideosrc: Suppress more spammy debug messages - The failure on compressed format (e.g., MJPG, H264 subtypes) is expected. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1468> - -2020-07-25 19:36:10 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/directfb/meson.build: - * tests/examples/directfb/meson.build: - directfb: suppress compiler warning from directfb headers - On debian sid, directfb 1.7.7 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1467> - -2020-07-24 01:56:27 +0900 Seungha Yang <seungha@centricular.com> - - d3d11window: Remove timeout and wait a task if possible - If the run_async() method is expected to be called from streaming - thread and not from application thread, use INFINITE as timeout value - so that d3d11window can wait UI dispatcher thread in any case. - There is no way to get a robust timeout value from library side. - So the fixed timeout value might not be optimal and therefore - we should avoid it as much as possible. - Rule whether a timeout value can be INFINITE or not is, - * If the waiting can be cancelled by GstBaseSink:unlock(), use INFINITE. - GstD3D11Window:on_resize() is one case for example. - * Otherwise, use timeout value - Some details are, GstBaseSink:start() and GstBaseSink:stop() will be called - when NULL to READY or READY to NULL state change, so there will be no - chance for GstBaseSink:unlock() and GstBaseSink:unlock_stop() - to be called around them. So there is no other way then timeout way. - GstD3D11Window:consturcted() and GstD3D11Window:unprepare() are the case. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1461> - -2020-07-24 01:43:16 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window_corewindow.cpp: - * sys/d3d11/gstd3d11window_swapchainpanel.cpp: - d3d11window: Increase timeout to 10 sec for WinRT window implementations - No strong reason for this number, but we can follow other well known - UWP implementation ANGLE. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1461> - -2020-07-23 17:45:03 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp8decoder.c: - * gst-libs/gst/codecs/gstvp8decoder.h: - * sys/d3d11/gstd3d11vp8dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - codecs: vp8decoder: Sync up with h264decoder implementation - Pass GstVideoCodecFrame with GstVp8Picture to new_picture() and - output_picture() methods for subclass to be able to reference - it directly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1458> - -2020-07-23 17:26:37 +0900 Seungha Yang <seungha@centricular.com> - - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - v4l2codecs: vp8dec: Remove white space - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1458> - -2020-07-23 17:00:52 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * meson.build: - meson: add a plugin summary - This summary displays a list of plugins which - have been enabled. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1460> - -2020-06-29 17:31:15 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/iqa/iqa.c: - * ext/iqa/iqa.h: - iqa: Add a 'mode' property - This property currently only supports a 'strict' that checks that - all the input streams have the exact same number of frames. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1424> - -2020-06-29 17:28:30 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/iqa/iqa.c: - iqa: Implement child proxy - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1424> - -2020-07-21 23:08:15 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.h: - * sys/d3d11/gstd3d11vp9dec.c: - codecs: vp9decoder: Sync up with h264decoder implementation - * Pass GstVideoCodecFrame to new_picture() and output_picture() - * Pass the last reference of GstVp9Picture to subclass if possible - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1455> - -2020-07-23 23:01:03 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - wasapi2: Fix broken debug log - I hope that MSVC is smart enought to warn this at build time - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1459> - -2020-07-23 18:03:23 +0900 Seungha Yang <seungha@centricular.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264dec: Remove outdated comment - ... and unnecessary user data clear on GstVideoCodecFrame - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1457> - -2020-07-23 17:48:56 +0900 Seungha Yang <seungha@centricular.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264dec: Fix leak on decoding failure - Given GstVideoCodecFrame and GstH264Picture should be cleared, - and the return must be GST_FLOW_ERROR, not boolean value. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1457> - -2020-07-22 02:20:07 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Disable array-of-texture - Some 4K VP9 + super frame enabled streams would be broken with - array-of-texture configuration (i.e., allowing runtime texture registration - for DPB). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1456> - -2020-07-22 17:50:58 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfutils.cpp: - mfutils: Suppress spammy debug print - Remove FIXME debug print. It seems to be spammy. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1452> - -2020-07-21 16:52:33 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfcapturewinrt.cpp: - * sys/mediafoundation/gstmfsourceobject.c: - * sys/mediafoundation/gstmfsourceobject.h: - * sys/mediafoundation/gstmfsourcereader.cpp: - mfvideosrc: Expose sorted caps - Sort the list of supported caps for downstream to be able to select - the best image in terms of quality (resolution and framerate) by default. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1452> - -2020-07-21 15:48:08 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfsourcereader.cpp: - mfvideosrc: Don't expose unsupported formats - Some UVC cameras support H.264 stream but we don't support it yet. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1452> - -2020-07-14 13:18:25 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - docs: update plugins doc cache - Add va plugin - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1387> - -2020-07-20 16:37:35 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/plugin.c: - va: documentation since tag - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1387> - -2020-07-14 13:17:35 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/va/gstvah264dec.c: - vah264dec: add documentation caps for pad templates - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1387> - -2020-07-21 23:44:03 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Disable d3d11 video processor for HDR10 stream. - d3d11 video processor is showing buggy behaviors in various cases. - And this HDR10 is one case of them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1454> - -2020-07-21 22:36:14 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.h: - codecs: h264decoder: Fix wrong annotations - What intended was GstH264Decoder actually. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1453> - -2020-07-21 18:17:09 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264decoder: Update document with Since marks - To make documentation CI happy with the newly added APIs. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1449> - -2020-07-21 17:53:29 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - codecs: h264decoder: Rename API arguments - Although it's not public ones, make them consistent with vfunc - for them to be nicer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1449> - -2020-07-20 16:55:10 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264dec: Use the new picture lookup - This will avoid having to create a reference chain from CodecFrame - to GstH264Picture to GstV4l2Request. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1449> - -2020-07-20 16:48:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - h264decoder: Add ability to lookup by system_frame_number - This is to avoid having to create a reference chain in decoders from - GstVideoCodecFrame to GstH264PIcture to implementation wrapper. - So this change introduces: - - gst_h264_dpb_remove_outputed (dpb) - - gst_h264_dpb_get_picture(dpb, system_frame_num) - - gst_h264_decoder_get_picture (dec, system_frame_num) - In order to ensure that frames can be looked up during the draining - process, we now first remove all (including reference) frames that - have been outputed but are still in the DPB. Then for each remaining - buffers, we remove it from the DPB to reach reference 1 and output it. - Previously we could take all not outputed outside of the DPB which would - prevent lookup by the base class. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1449> - -2020-07-20 19:13:29 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Make GstVideoCodecFrame hold the last reference of the buffer - ... when gst_video_decoder_finish_frame() is called. - Some subclasses attach GstBuffer to GstH264Picture as an user data - which will increase reference count of the buffer. It would result - to buffer copy per every frame. - Background here is, GstVideoDecoder wants writable output buffer for - GstMeta handling, and if the output buffer is not writable - (i.e., reference count is not one), the buffer will be copied. - Even if underlying GstMemory wouldn't be copied, buffer copy operation - will introduce extra memory allocation overhead which is not optimal. - By this modification, subclass might be able to receive the last - reference to GstH264Picture - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1449> - -2020-07-20 18:24:09 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/nvcodec/gstnvh264dec.c: - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/va/gstvah264dec.c: - codecs: h264decoder: Pass GstVideoCodecFrame to output_picture() - All subclasses are retrieving list to get target output frame, which - can be done by baseclass. And pass the ownership of the GstH264Picture - to subclass so that subclass can clear implementation dependent resources - before finishing the frame. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1449> - -2020-07-20 17:45:12 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/nvcodec/gstnvh264dec.c: - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/va/gstvah264dec.c: - codecs: h264decoder: Don't attach extra ref of GstH264Picture to GstVideoCodecFrame - The lifecycle of GstH264Picture is being managed by our DPB - implementation. If it's still required, subclass can do that - by itself in the new_picture() method. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1449> - -2020-07-21 01:05:47 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/mediacapturewrapper.cpp: - mfvideosrc: Don't error out when if we've found supported format - While retrieving supported formats by device, the last return might - not be S_OK in case that it's not supported one by us (e.g., H264, JPEG or so). - But if we've found at least one supported raw video format, - we can keep going on. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1451> - -2020-07-20 20:54:26 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Drop non-decodable frames - Otherwise GstVideoDecoder baseclass will hold the corresponding broken frames - until new reset event happens such as FLUSH or downwards state change. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1450> - -2020-07-17 15:14:48 +1000 Matthew Waters <matthew@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/gstwebrtcice.h: - webrtc: remove private properties/signals from the now public ice object - We don't want to expose all of the webrtcbin internals to the world. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1444> - -2020-07-16 19:26:55 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11utils.c: - * sys/mediafoundation/gstmfutils.cpp: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi2/gstwasapi2util.c: - * sys/winscreencap/dxgicapture.c: - plugins: Use g_win32_error_message for HRESULT to string conversion - We don't need to duplicate a method for HRESULT error code to string - conversion. This patch is intended to - * Remove duplicated code - * Ensure FormatMessageW (Unicode version) and avoid FormatMessageA - (ANSI version), as the ANSI format is not portable at all. - Note that if "UNICODE" is not defined, FormatMessageA will be aliased - as FormatMessage by default. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1442> - -2020-07-17 15:58:16 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2util.c: - wasapi2util: Fix wrong use of debug category - Haven't noticed so far since there is no debug statement in the source file. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1445> - -2020-07-16 13:32:56 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtp.c: - avtp: Update documentation - - Mention that a new capability is required by "avtpsink" element; - - Use "clockselect" element to change pipeline clock, instead of a - gst-launch option that never saw the light of day. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1443> - -2020-07-15 10:39:33 +0200 Silvio Lazzeretti <silviola@amazon.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - wasapi: added missing lock release in case of error in gst_wasapi_xxx_reset - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1440> - -2020-07-15 13:30:48 +0900 Damian Hobson-Garcia <dhobsong@igel.co.jp> - - * ext/wayland/wlbuffer.c: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - waylandsink: use GstMemory instead of GstBuffer for cache lookup - The GstMemory objects contained in a GstBuffer could be replaced - by an upstream element, which would break the association beteen - the GstBuffer and the wayland wl_buffer, make the cache lookup - results incorrect. - This patch changes the cache lookup to use the first GstMemory - in a buffer instead. For multi-plane buffers, this assumes that - all of the GstMemory(s) will always be moved together as a set, - and that the same (first) GstMemory isn't used with different - combinations of other GstMemory(s). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1401> - -2020-07-08 19:06:38 +0900 Damian Hobson-Garcia <dhobsong@igel.co.jp> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlbuffer.c: - * ext/wayland/wlbuffer.h: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - waylandsink: Keep per display wayland buffer caches - Instead of attaching a single wayland wl_buffer to each GStBuffer as qdata, - keep a separate cache for each display. - A unique wl_buffer and associated metadata is created for each display. - This allows for sharing of GstBuffer objects between multiple - displays, such as when using tee elements. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1401> - -2020-07-14 21:49:33 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/gstv4l2format.c: - v4l2codecs: Enable 32x32 tiled NV12 support - This is used by Cedrus driver to support Allwinner VPU, also known as the - sunxi platforms. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1437> - -2020-07-15 12:43:20 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - docs: update for new pixel formats - https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/753 - https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/754 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1441> - -2020-07-10 21:58:23 +0300 Jordan Petridis <jordan@centricular.com> - - * gst-libs/gst/opencv/meson.build: - opencv: suppress another warning about non-existent include dirs - Ammend to 92456967d0fbdb57f7bf089b06d930b7d30bc417 !1427 - The .pc file of opencv4 seems to be broken - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1438> - -2020-07-15 08:37:39 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - msdkh265enc: add the missing comma - Otherwise main-444 and main-444-10 are concatenated - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1436> - -2020-07-14 17:06:59 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - doc: Updated cache file for the new pixel format - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1433> - -2020-07-11 15:41:51 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rtp/gstrtpsrc.c: - rtpsrc: Add domain name support - This add domain name resolution (similar to udpsrc does) to the rtpsrc - element. - Fixes 1352 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1433> - -2020-07-11 15:40:40 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rist/gstristsrc.c: - ristsrc: Add support for domain name - This add domain name resolution (similar to udpsrc does) to the ristsrc - element. - Fixes 1352 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1433> - -2020-07-11 15:16:53 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rtp/gstrtpsrc.c: - rtpsrc: Always set rtcp socket address - Regardless if it's multicast or not, set the address property to match - the element address. This is the address of the interface to listen to, - which is expected to be ANY in most cases, but should be honnored even - for RTCP non-multicast case. - This also fixes an assertion if the address is not a parsable IPv4 or - IPv6 string. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1433> - -2020-07-11 15:21:33 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rtp/gstrtpsink.c: - rtpsink: Fix error handling on bad DNS - This will properly print the DNS being attempted to resolved and avoid - trying to unref a NULL pointer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1433> - -2020-07-10 18:03:20 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rist/gstristsink.c: - ristsink: Fix error handling on bad DNS - This will properly print the DNS being attempted to resolved and avoid - trying to unref a NULL pointer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1433> - -2020-07-14 19:59:09 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfcapturewinrt.cpp: - * sys/mediafoundation/gstmfdevice.c: - * sys/mediafoundation/gstmfsourceobject.c: - * sys/mediafoundation/gstmfsourceobject.h: - * sys/mediafoundation/gstmfsourcereader.cpp: - * sys/mediafoundation/gstmfutils.cpp: - * sys/mediafoundation/gstmfvideosrc.c: - * sys/mediafoundation/meson.build: - * sys/mediafoundation/plugin.c: - mfvideosrc: Enable WinRT capture impl. for desktop target - ... if target OS version was specified as Windows 10. - When enabled, desktop application can select target capture - implementation between WinRT and Win32 - via GST_USE_MF_WINRT_CAPTURE environment - (e,g., GST_USE_MF_WINRT_CAPTURE=1 for WinRT impl.). - Default is Win32 implementation in case of desktop target. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1434> - -2020-06-25 17:51:11 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - h265parser: Fix possible invalid memory access - ... and do more strict validation for num_tile_columns_minus1 and - num_tile_rows_minus1. - As per specification Table A.8, allowed maximum number of tile rows - and tile columns are 22 and 20, respectively. So we should adjust the size - of each array. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1372> - -2020-07-12 01:22:55 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - * sys/d3d11/gstd3d11window.cpp: - d3d11decoder: Disable zero-copy for Qualcomm devices - Qualcomm driver looks buggy in zero-copy scenario. Even if we disable - zero-copy, device-to-device memory copy will be used with d3d11videosink - which should be fast enough. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1432> - -2020-06-29 15:12:47 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - msdkh265enc: add support for screen content coding extension - Because the valid input formats for screen content coding extension is - a subset of input formats for range extension, user must specify the - profile for screen content coding extension in the caps filter - Example: - gst-launch-1.0 videotestsrc ! video/x-raw,format=NV12 ! msdkh265enc - low-power=1 ! video/x-h265,profile=screen-extended-main ! fakesink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1389> - -2020-06-23 13:12:55 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - msdkh265enc: allow user to choose profile - Example: - gst-launch-1.0 videotestsrc ! video/x-raw,format=NV12 ! msdkh265enc ! - video/x-h265,profile=main-444 ! fakesink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1389> - -2020-07-09 14:46:58 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - * sys/msdk/msdk-enums.c: - * sys/msdk/msdk-enums.h: - msdkenc: support tune property in msdkh264enc and msdkh265enc - Introduce a new property for encoding mode selection, the default value - for this new property allows the SDK to decide what to do. In addition, - low-power is marked as deprecated since this fix - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1426> - -2020-07-09 09:01:23 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - Revert "msdkh265enc: let MSDK select the encoding mode by default" - This reverts commit 9e977832c1761e3ad002fdfe14a9c3881a60bd45. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1426> - -2020-07-01 18:42:18 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/avtp/gstavtp.c: - * ext/avtp/gstavtpaafpay.c: - * ext/avtp/gstavtpaafpay.h: - * tests/check/elements/avtpaafpay.c: - avtp: rename tstamp-mode to timestamp-mode - I thnk w cn spre the xtra lttrs. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1397> - -2020-07-10 17:13:47 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - basetsmux: make use of gst_aggregator_finish_buffer_list - Fixes #1276 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1429> - -2020-07-10 15:26:27 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiofxbad/gstaudiochannelmix.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/debugutils/gstchopmydata.c: - * gst/debugutils/gstclockselect.c: - * gst/debugutils/gstwatchdog.c: - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosrc.c: - * gst/ivtc/gstcombdetect.c: - * gst/ivtc/gstivtc.c: - * gst/jp2kdecimator/gstjp2kdecimator.c: - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/gstrtmp2src.c: - * gst/videofilters/gstscenechange.c: - * gst/videofilters/gstvideodiff.c: - * gst/videofilters/gstzebrastripe.c: - * gst/videoparsers/gstdiracparse.c: - * gst/y4m/gsty4mdec.c: - docs: fix element names in section headers - Hopefully that'll make hotdoc pick up the docs for these elements. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1428> - -2020-07-10 14:56:50 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/opencv/meson.build: - opencv: suppress warnings about non-existent include dirs - Looks like opencv4 ships with a broken .pc file. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1427> - -2020-07-08 19:56:13 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - docs: fix up for errorignore convert-error signal removal - The commit that added that was reverted. Need to remove this - from docs cache manually. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1422> - -2020-07-09 00:13:03 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/meson.build: - d3d11: Disable D3D11Debug and DXGIDebug layer for UWP build - WACK (Windows App Certification Kit) doesn't seem to be happy with - the DXGIGetDebugInterface1 symbol. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1421> - -2020-07-08 17:16:46 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - * scripts/extract-release-date-from-doap-file.py: - meson: set release date from .doap file for releases - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1420> - -2020-07-08 18:24:06 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * ext/closedcaption/gstcccombiner.c: - cccombiner: Update segment according to video sink pad - Otherwise the following pipeline would preroll after 1000 hours: - gst-launch-1.0 videotestsrc ! x264enc ! cccombiner ! fakesink silent=0 sync=1 -v - Fixes #1355 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1419> - -2020-06-30 13:40:28 +0200 Andreas Frisch <afrisch@make.tv> - - * gst/mpegtsmux/tsmux/tsmux.c: - mpegtsmux: Don't assume English for ISO-639 language descriptor - Previously, "en" (should have actually been "eng") was assumed - for the ISO-639 language descriptor if no language was explicitely given. - Neither ETSI EN 300 468 nor ATSC A/52 mandate for a language descriptor, - so we should simply not set it, if it's unknown. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1386> - -2020-06-18 04:03:59 +1000 Jan Schmidt <jan@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/gstbasetsmuxaac.c: - * gst/mpegtsmux/gstbasetsmuxaac.h: - * gst/mpegtsmux/gstmpegtsmux.c: - mpegtsmux: Fix handling of MPEG-2 AAC - The audio/mpeg,mpegversion=2 caps in GStreamer refer to - MPEG-2 AAC (ISO 13818-7), not to the extended MP3 (ISO 13818-3), - which is audio/mpeg,mpegversion=1,mpegaudioversion=2/3 - Fix the caps, and add handling for MPEG-2 AAC in both ADTS and raw - form, adding ADTS headers for the latter. - -2020-07-08 11:39:58 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: Fix up update-orc-dist target for the case where there are no orc targets - All those plugins might have been disabled, in which case meson - would complain about alias_target() needing at least two arguments. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1418> - -2020-07-08 10:54:49 +0100 Tim-Philipp Müller <tim@centricular.com> - - * pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in: - pkgconfig: fix meson warning about waylandlib not being in the config data - meson.build:58: WARNING: The variable(s) 'waylandlibdir' in the input file 'subprojects/gst-plugins-bad/pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in' are not present in the given configuration data. - We don't provide a .pc file for this lib nor install its headers, - so no need for this path to be in the uninstalled .pc file really. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1417> - -2020-07-07 19:55:00 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/rtmp/gstrtmpsrc.c: - * ext/rtmp/meson.build: - * gst/transcode/gsttranscodebin.c: - * gst/transcode/meson.build: - rtmp, transcodebin: fix i18n header includes - Fixes #1351 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1416> - -2020-07-07 10:03:42 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rist/gstristsink.c: - * gst/rist/gstristsrc.c: - rist: Use g_signal_connect_object() - rtpbin can still emit signals when it is being disposed, and while - rtpbin is inside ristsrc/ristsink it can still live longer. - So we either have disconnect all signals at some point, or let GObject - take care of that automatically. - Related to !1412 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1413> - -2020-02-04 09:23:03 -0800 Josep Torra <jtorra@oblong.com> - - * gst/videofilters/gstscenechange.c: - * gst/videofilters/gstscenechangeorc-dist.c: - * gst/videofilters/gstscenechangeorc-dist.h: - * gst/videofilters/gstscenechangeorc.orc: - * gst/videofilters/meson.build: - scenechange: use orc to compute score - Add an orc implementation for SAD operation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1024> - -2020-07-07 14:43:50 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/rtp/gstrtpsink.c: - * gst/rtp/gstrtpsrc.c: - rtpsrc/sink: Use g_signal_connect_object() - rtpbin can still emit signals when it is being disposed, and while - rtpbin is inside rtpsrc/rtpsink it can still live longer. - So we either have disconnect all signals at some point, or let GObject - take care of that automatically. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1412> - -2020-07-07 14:02:06 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * tests/check/elements/mpegtsmux.c: - tests: mpegtsmux: Test we don't crash releasing unused pad - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1411> - -2020-07-07 14:01:31 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * tests/check/elements/mpegtsmux.c: - tests: mpegtsmux: Avoid use-after-unref - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1411> - -2020-07-07 13:33:53 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsmux/gstbasetsmux.c: - mpegtsmux: Avoid crash releasing pad with NULL prog - If we release a pad while the muxer is running which has never been used - for aggregation (thus it does not have an assigned program), `prog` is - NULL. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1411> - -2020-07-01 10:18:24 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - msdkh265enc: let MSDK select the encoding mode by default - MSDK may support lowpower and non-lowpower modes, some features are - available only under one of the two modes, which is hard to know for - user, so let MSDK select the mode by default. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1405> - -2020-07-06 15:05:07 +1000 Matthew Waters <matthew@centricular.com> - - * pkgconfig/gstreamer-bad-transcoder-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-transcoder.pc.in: - * pkgconfig/meson.build: - build: remove obsolete 'bad-transcoder' pc file - Replaced by 'transcoder' pc files. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1409> - -2020-07-04 12:10:23 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/bayer/meson.build: - * gst/fieldanalysis/meson.build: - * gst/gaudieffects/meson.build: - * meson.build: - * scripts/update-orc-dist-files.py: - meson: add update-orc-dist target - Add target to update backup orc -dist.ch files. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1408> - -2020-07-01 20:27:14 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/videoparsers/gstvideoparseutils.c: - videoparseutils: Only add a single closed caption meta - Otherwise, having a stream go through a parser multiple times would - result in duplicate closed caption meta. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1396> - -2020-07-03 13:02:33 +1000 Matthew Waters <matthew@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: write the cdp timecode data correctly - We were mixing up the tens part with the unit parts all over the place. - e.g. 12 seconds would be encoded as 0x21 instead of the correct 0x12 - Aligns the code with the same change applied to ccconverter. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1400> - -2020-07-03 00:47:09 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - * tests/check/elements/ccconverter.c: - ccconverter: write the cdp timecode data correctly - We were mixing up the tens part with the unit parts all over the place. - e.g. 12 seconds would be encoded as 0x21 instead of the correct 0x12 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1400> - -2020-07-02 12:47:27 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: output warning log if parsing a cdp packet fails - Simplifies figuring out why there may be no output from ccconverter with - a cdp input. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1400> - -2020-07-02 12:45:44 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: fix cdp timecode parsing - The first reserved bits are in the most significant bit. - i.e. 0xc0 vs 0x0c - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1400> - -2020-07-02 16:17:01 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpcrfbase.c: - * ext/avtp/gstavtpsink.c: - * ext/avtp/gstavtpsrc.c: - avtp: Use g_strerror instead of strerror - It should avoid some implicit declaration errors (and be utf-8 friendly). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1404> - -2020-07-03 02:03:56 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - Back to development - -=== release 1.17.2 === - -2020-07-03 00:31:17 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * gst-plugins-bad.doap: - * meson.build: - Release 1.17.2 - -2020-07-02 12:37:47 +0100 Philippe Normand <philn@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - wpe: Update plugin's doc cache - This was forgotten in !1392. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1402> - -2020-07-01 12:28:05 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2decoder: Track pending request - With the asynchronous slice decoding, we only queue up to 2 slices - per frames. That side effect is that now we are dequeuing bitstream - buffers in both decoding and presentation order. This would lead to - a bitstream buffer from a previous frame being dequeued instead of - the expected last slice buffer and lead to us trying to queue an - already queued bitstream buffer. - We now fix this by tracking pending requests. As request are executed - in decoding order, we marking a request done, we can effectively - dequeue bitstream buffer from all previous request, as they have been - executed already. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395> - -2020-07-01 12:26:36 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2decoder: Improve debug tracing - Add some missing traces and move per-slice operation to TRACE level to - reduce the noise level. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395> - -2020-07-01 12:23:49 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2decoder: Convert request pool to GstQueueArray - The decoder is not being access from multiple threads, instead it is - always protected by the streaming lock. For this reason, a - GstAtomicQueue for the request pool is overkill and may even introduce - unneeded overhead. Use a GstQueueArray in replacement, the - GstQueueArray is a good fit since the number of item is predictable and - unlikely to vary at run-time. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395> - -2020-06-29 13:27:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Wait on previous pending request in slice mode - In slice mode, we'll do one request per slice. In order to recycle - bitstream buffer, and not run-out, wait for the last pending - request to complete and mark it done. - We only wait after having queued the current slice in order to reduce - that potential driver starvation and maintain performance (using dual - buffering). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395> - -2020-06-29 13:25:39 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Renew bitstream buffer after submitting slice - Submitting a slice actually clears the bitstream buffer. Ensure we - have a newly allocated bitstream buffer for the next slice. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395> - -2020-06-29 13:23:12 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Factor out bitstream allocation - No functional changes. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395> - -2020-06-29 13:04:56 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Add a helper to ensure output buffer - In preparation of multi-slice decoding, we will decode multiple - slices into the same buffer. This will ensure we have a buffer to - decode to, queued into the driver. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395> - -2020-06-29 12:39:08 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Factor out request wait - This will be reused to wait for previous slices to be complete - when dealing with following slices (in slice decoding mode). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395> - -2020-06-29 12:14:36 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Remove double return in submit_bitstream() - This is code cleanup, no functional changes. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395> - -2020-06-29 12:06:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Fix typo in debug trace - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1395> - -2020-07-02 18:10:21 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/avtp/gstavtp.c: - * sys/d3d11/plugin.c: - * sys/mediafoundation/plugin.c: - * sys/wasapi2/plugin.c: - docs: remove gst prefix from plugin titles - -2020-06-29 00:54:50 +0900 Seungha Yang <seungha@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - docs: Update plugin cache for Windows plugins - -2020-06-09 00:20:08 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11basefilter.c: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/plugin.c: - * sys/mediafoundation/gstmfaudioenc.cpp: - * sys/mediafoundation/gstmfh264enc.cpp: - * sys/mediafoundation/gstmfh265enc.cpp: - * sys/mediafoundation/gstmfvideoenc.cpp: - * sys/mediafoundation/gstmfvp9enc.cpp: - * sys/mediafoundation/plugin.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi2/plugin.c: - * sys/winscreencap/gstdxgiscreencapsrc.c: - plugins: Update for documentation of Windows plugins - * Add Since marks - * Make use of GST_PARAM_CONDITIONALLY_AVAILABLE flag - -2020-06-09 01:30:39 +0900 Seungha Yang <seungha@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * sys/nvcodec/gstnvh264dec.c: - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh265dec.c: - * sys/nvcodec/gstnvh265enc.c: - nvcodec: Update for documentation - * Add Since marks - * Make use of GST_PARAM_CONDITIONALLY_AVAILABLE flag - * Add documentation template caps - -2020-07-01 09:00:41 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/gstwpesrc.cpp: - wpe: Set documentation caps - As the caps template can vary depending on the WPEBackend-FDO version - found at build time, set a fixed template for the generate documentation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1392> - -2020-07-01 17:54:01 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/videoparsers/gstvideoparseutils.c: - videoparsers: Fix parsing ATSC bar data - It rejected the case of all bars being disabled. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1394> - -2020-07-01 17:52:39 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/videoparsers/gstvideoparseutils.c: - videoparsers: Fix parsing of ATSC AFD data - The test for 0x40 being set is repeated by - gst_video_parse_utils_parse_afd, which also extracts the low nibble - again, so we must not clear it here. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1394> - -2020-07-01 17:51:36 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/videoparsers/gstvideoparseutils.c: - * gst/videoparsers/plugin.c: - videoparsers: Give gstvideoparseutils.c a debug category - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1394> - -2020-07-01 20:28:01 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - * tests/check/elements/ccconverter.c: - ccconverter: fail negotiation when framerate conversion is not possible - Converting between anything but cdp will fail at converting - framerates and negotiation should reflect that. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1393> - -2020-07-01 19:41:33 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - * tests/check/elements/ccconverter.c: - ccconverter: fix missing output framerate on the caps - A pipeline like this: - closedcaption/x-cea-708,format=cdp,framerate=30000/1001 ! ccconverter ! closedcaption/x-cea-708,format=cc_data - would produce a critical/assert: - GStreamer-CRITICAL **: 14:21:11.509: gst_util_fraction_multiply: assertion 'a_d != 0' failed - because there would be no framerate field on ccconverter's output. - Fixed by always fixating a framerate if the input has a framerate. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1393> - -2020-06-29 20:25:27 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/rtmp/rtmpclient.c: - * gst/rtmp2/rtmp/rtmpclient.h: - rtmp2: Set connect args like libavformat does - To improve our compatibility. Critically, a server might elide data for - codecs we don't advertise. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1384> - -2020-06-29 19:47:16 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: Add support for AGGREGATE messages - They're multiple frames (tags) of FLV data wrapped into a message. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1384> - -2020-06-29 19:46:53 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/rtmp/rtmputils.c: - * gst/rtmp2/rtmp/rtmputils.h: - rtmp2: Move FLV tag header parsing into rtmputils.c - To be shared with the AGGREGATE handling. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1384> - -2020-06-29 20:57:06 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: Mark our memory singleton as leakable - So it doesn't appear in the leaks tracer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1384> - -2020-06-29 19:46:06 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/rtmp2/rtmp/rtmputils.c: - rtmp2: Remove GST_ERROR from rtmputils.c - This file does not have debug logging set up. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1384> - -2020-07-01 12:35:32 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/avtp/gstavtp.c: - * ext/avtp/gstavtpaafpay.c: - * ext/avtp/gstavtpbasedepayload.c: - * ext/avtp/gstavtpbasepayload.c: - * ext/avtp/gstavtpcrfbase.c: - avtp: documentation fixes - Unclear why hotdoc wants 'gstavtp' as the plugin name here, - that's just wrong. - Add since marker and mark private subclasses as plugin API - so hotdoc knows they belong to the plugin and aren't external. - Fix GstAvtpAafTstampMode get_type() function. - -2020-07-01 11:17:08 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - docs: update plugin cache with avtp plugin - CI picks this up now because the wrap was re-added in gst-build. - -2020-06-30 06:23:07 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Fix for DPB size calculation - Some bitstreams might require more DPB size than that of what we've - calculated. - This change should've been part of initial commit of h264 stateless - codec implementation but it was missed. - See also https://chromium-review.googlesource.com/c/chromium/src/+/760276/ - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1385> - -2020-06-25 16:38:30 +0200 Andreas Frisch <afrisch@make.tv> - - * gst/mpegtsmux/tsmux/tsmux.c: - mpegtsmux: Correctly set ISO-639 language descriptor - fixes #1340 - Only 2 of the necessary 3 letters were copied because the teminating '\0' - needs to be counted, too - cf. - https://developer.gnome.org/glib/stable/glib-String-Utility-Functions.html#g-strlcat - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1375> - -2020-06-23 15:35:06 -0400 Olivier Crête <olivier.crete@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - webrtcbin: Expose "latency" property - This property sets the latency both on the rtpbin/rtpjittbuffer, but - also on the RTPStorage elements currently used by the FEC decoder. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1367> - -2020-06-30 02:48:50 +0900 Seungha Yang <seungha@centricular.com> - - * sys/winscreencap/gstwinscreencap.c: - dxgiscreencapsrc: Add missing debug category init - This should've been addressed in the commit 90420620722d4490ecfb4ade046b95d214f993d9 - but I was missed it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1383> - -2020-06-14 20:47:46 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264picture: use g_array_remove_index_fast() - This algorithm is faster than the normal one. The problem is it - disorders the elements in the dpb, but it does not seem to mess - decoders. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1378> - -2020-06-28 18:54:54 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * ext/wayland/wlvideoformat.c: - wlvideoformat: fix typo in the format list - DRM_FORMAT_ARGB8888 was actually used twice in the list for different SHM / - Gstreamer formats. In this case DRM_FORMAT_ABGR8888 is the correct format. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1382> - -2020-03-22 19:00:50 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - va: VA-API H.264 decoder and infrastructure - New plugin with an element for H.264 decoding with VA-API. This novel - approach, different from gstreamer-vaapi, uses gstcodecs library for - state handling. - The code is expected to looks cleaner because it uses VA-API without - further layers or wrappers. - * It uses the first supported DRM device as default VA display (other - displays will be supported through user's GstContext) - * Requires libva >= 1.6 - * No multiview/stereo profiles neither interlaced streams because - gstcodecs doesn't handle them yet - * It is incompatible with gstreamer-vaapi - * Even if memory:VAMemory is exposed, it is not handled yet by any - other element - * Caps templates are generated dynamically querying VAAPI, but YV12 - and I420 are added for system memory caps because they seem to be - supported for all the drivers when downloading frames onto main - memory, as they are used by xvimagesink and others, avoiding color - conversion. - * Surfaces aren't bounded to context, so they can grow beyond the DBP - size, allowing smooth reverse playback. - * There isn't yet error handling and recovery. - * 10-bit H.264 streams aren't supported by libva. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1379> - -2020-06-27 13:18:34 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: update max_dpb_frames only if VUI is present - There are some streams, with HRD, where the the calculated - max_dpb_frames is zero (max_dpb_mbs is less than size mb). In order to - get the dbp size it is required to rely on the VUI parameters if they - are present. - According to the spec Annex E.2.1 - **max_dec_frame_buffering** specifies the required size of the HRD - decoded picture buffer (DPB) in units of frame buffers. It is a - requirement of bitstream conformance that the coded video sequence - shall not require a decoded picture buffer with size of more than - Max(1, max_dec_frame_buffering) frame buffers to enable the output of - decoded pictures at the output times specified by dpb_output_delay of - the picture timing SEI messages. The value of max_dec_frame_buffering - shall be greater than or equal to max_num_ref_frames. An upper bound - for the value of max_dec_frame_buffering is specified by the level - limits in clauses A.3.1, A.3.2, G.10.2.1, and H.10.2. - When the max_dec_frame_buffering syntax element is not present, the - value of max_dec_frame_buffering shall be inferred as follows: - – If profile_idc is equal to 44, 86, 100, 110, 122, or 244 and - constraint_set3_flag is equal to 1, the value of - max_dec_frame_buffering shall be inferred to be equal to 0. - – Otherwise (profile_idc is not equal to 44, 86, 100, 110, 122, or 244 - or constraint_set3_flag is equal to 0), the value of - max_dec_frame_buffering shall be inferred to be equal to MaxDpbFrames. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1381> - -2020-06-26 10:20:04 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - gstdtlsconnection: Propagate errors from key export to the caller - Otherwise the DTLS connection silently does nothing instead of reporting - an error via the elements. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1156> - -2020-04-01 18:08:45 +0200 Miguel Paris <mparisdiaz@gmail.com> - - * ext/dtls/gstdtlsconnection.c: - dtlsconnection: do not set keys_exported flag if actually not exported - keys_exported flag should be set only if keys are actually exported. - For that the next conditions are needed: - 1 - SSL_export_keying_material on success - 2 - SSL_get_selected_srtp_profile returns a valid profile - 3 - The profile ID is SRTP_AES128_CM_SHA1_80 or SRTP_AES128_CM_SHA1_32 - Also don't crash if NULL is returned as profile. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1156> - -2020-06-25 19:41:52 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11h265dec.c: - d3d11h265dec: Fix possible invalid memory access - The number of element to copy should be num_tile_columns_minus1 - and num_tile_rows_minus1. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1374> - -2020-06-25 19:26:45 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh265dec.c: - nvh265sldec: Fix possible invalid memory access - Fix Coverity issues. - CID 1464959, 1464960, 1464961, 1464962 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1374> - -2020-06-25 16:05:39 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/interlace/gstinterlace.c: - interlace: Make caps writable before modifying them - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1373> - -2020-06-24 16:34:20 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstccextractor.c: - ccextractor: Push a GAP event if we have a caption pad but a video buffer did not contain any captions - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1371> - -2020-06-24 13:33:39 +0300 Sebastian Dröge <sebastian@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/closedcaption/gstccextractor.c: - * ext/closedcaption/gstccextractor.h: - ccextractor: Add property to remove caption meta from the outgoing video buffers - This is disabled by default to keep backwards compatibility. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1371> - -2020-06-16 04:41:14 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/plugin.c: - d3d11videosink: Disable d3d11videosink depending on supported feature level - Current shader code is not compatible with HLSL profile "ps_4_0_level_9_3" - or lower. So d3dcompiler cannot compile our shader code in that case. - Note that VirtualBox is one known driver which doesn't support currently - implemented shader code. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1343> - -2020-06-24 19:18:15 +0000 Mathieu Duponchelle <mduponchelle1@gmail.com> - - * gst/mxf/mxfvanc.c: - mxfvanc: document new sink pad template - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1368> - -2020-06-23 23:40:38 +0300 Sebastian Dröge <sebastian@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/mxf/meson.build: - * gst/mxf/mxf.c: - * gst/mxf/mxfvanc.c: - * gst/mxf/mxfvanc.h: - mxfdemux/mux: Add support for CEA-708 CDP from S436 essence tracks - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1368> - -2020-06-23 15:31:51 -0700 Kevin King <4kevinking@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: wait for permissions request dialog callback - otherwise gstreamer gives up on transitioning the pipeline before the - user has accepted - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1370> - -2020-06-19 14:30:04 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * docs/plugins/gst_plugins_cache.json: - * gst/interlace/gstinterlace.c: - interlace: Switch field-pattern on the fly - The frame rate interlace uses changes when we change field-pattern, so - we need to issue a reconfigure event. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1364> - -2020-06-22 20:15:13 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh264dec.c: - nvh264sldec: Remove useless double space - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1357> - -2020-06-20 05:57:59 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh265dec.c: - * sys/nvcodec/gstnvh265dec.h: - * sys/nvcodec/meson.build: - * sys/nvcodec/plugin.c: - nvcodec: Add H265 stateless codec implementation - Add a new GstCodecs based H265 decoder element - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1357> - -2020-06-19 04:50:26 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvdecoder.c: - * sys/nvcodec/gstnvdecoder.h: - * sys/nvcodec/gstnvh264dec.c: - nvcodec: Move common methods to nvdecoder - ... and remove all #ifdef from nvh264sldec implementation. - New helper methods will take care of OpenGL specific ones. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1357> - -2020-06-19 04:36:15 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh264dec.c: - nvh264sldec: Declare OpenGL related objects unconditionally - GstGLDisplay and GstGLContext are subclass of GstObject so we can - remove #ifdef for such object. This is prework for nvh265sldec. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1357> - -2020-06-19 04:10:48 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh264dec.c: - nvh264sldec: Fix for possible wrong device selction - decoder should select assigned CUDA device id - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1357> - -2020-06-23 19:31:42 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * pkgconfig/gstreamer-photography-uninstalled.pc.in: - * pkgconfig/gstreamer-photography.pc.in: - * pkgconfig/meson.build: - meson: Add missing pc file for gstphotography - This is supposed to be used by apps like Cheese, and is a public - library. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1365> - -2020-06-23 19:03:12 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * pkgconfig/gstreamer-transcoder-uninstalled.pc.in: - * pkgconfig/gstreamer-transcoder.pc.in: - * pkgconfig/meson.build: - meson: Add missing pkgconfig files for gsttranscoder - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1365> - -2020-06-19 10:50:12 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/interlace/gstinterlace.c: - interlace: Re-indentation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1349> - -2020-06-18 23:52:01 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * docs/plugins/gst_plugins_cache.json: - * gst/interlace/gstinterlace.c: - interlace: Don't change field-pattern on PAUSED or PLAYING state - It would otherwise change the caps the element produces and cause the - element to misbehave - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1349> - -2020-06-18 22:56:57 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/interlace/gstinterlace.c: - interlace: Don't fail negotiation if capsfilters decide framerate - Try to negotiate if the framerates on either sides of the interlace are - decided using capsfilters and the framerates are correct. Otherwise the - following pipelines would fail to negotiate: - gst-launch-1.0 videotestsrc ! - video/x-raw,framerate=24/1,interlace-mode=progressive ! interlace - field-pattern=2 ! video/x-raw,framerate =30/1 ! fakesink - gst-launch-1.0 videotestsrc ! - video/x-raw,framerate=60/1,interlace-mode=progressive ! interlace - field-pattern=0 ! video/x-raw,framerate=30/1 ! fakesink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1349> - -2020-06-18 22:15:08 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/interlace/gstinterlace.c: - interlace: Restrict passthrough conditions - Don't do passthrough if interleave-mode=mixed or if we have one of the - telecine modes - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1349> - -2020-06-18 21:10:56 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/interlace/gstinterlace.c: - interlace: Add field switching mode for 2:2 field pattern - In the 2:2 field pattern, interlace can switch from bottom-field-first - to top-field-first. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1349> - -2020-06-18 21:11:17 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/interlace/gstinterlace.c: - interlace: Only half the framerate for 1:1 field pattern - Keep the framerate for 2:2 field pattern, and completely remove it from - the caps for all others. Otherwise, negotiation will fail if caps on - both sides of the element specify a framerate. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1349> - -2020-06-18 20:41:35 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/interlace/gstinterlace.c: - interlace: Add FIXME comment about false passthrough bug - If interlace-mode is missing from upstream caps, we can falsely do - passthrough when in fact we'd have to switch fields. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1349> - -2020-06-23 12:30:51 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - docs: Update plugins cache - -2020-06-23 11:36:15 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * gst-libs/gst/audio/gstnonstreamaudiodecoder.c: - openmpt: Namespace enum GType names - -2020-06-23 11:33:45 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * gst-libs/gst/audio/gstnonstreamaudiodecoder.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabin-enum.c: - docs: Unmark wrongly marked plugin API types - -2020-06-23 10:03:04 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/libs/basecamerabinsrc/index.md: - * docs/libs/basecamerabinsrc/sitemap.txt: - * docs/meson.build: - * docs/plugins/gst_plugins_cache.json: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - * gst-libs/gst/basecamerabinsrc/meson.build: - * gst/camerabin2/gstcamerabin2.c: - docs: Document basecamerabinsrc - -2020-06-23 02:51:48 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/opencv/gstcvdilateerode.cpp: - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvh264dec.c: - docs: mark more types as plugin API - -2020-06-23 00:12:59 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - plugins_cache: add base classes - -2020-06-23 00:05:36 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/meson.build: - meson: mark plugins cache target as always stale - -2020-06-21 01:32:50 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlsshsink.c: - * ext/curl/gstcurltlssink.c: - * ext/dtls/gstdtlssrtpbin.c: - * ext/ladspa/gstladspafilter.c: - * ext/ladspa/gstladspasource.c: - * ext/wayland/gstwaylandsink.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/vulkan/gstvkvideofilter.c: - * gst/geometrictransform/gstcirclegeometrictransform.c: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsmux/gstbasetsmux.c: - * gst/rtmp2/gstrtmp2sink.c: - * gst/segmentclip/gstsegmentclip.c: - docs: mark more types as plugin API - -2020-06-21 01:32:29 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/libs/opencv/index.md: - * docs/libs/opencv/sitemap.txt: - * docs/meson.build: - * gst-libs/gst/opencv/meson.build: - docs: generate documentation for libgstopencv - -2020-06-19 19:40:52 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - doc: Stop documenting properties from parents - -2020-06-23 09:50:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Specify in the template caps that only interleaved audio is supported - Needs special support for non-interleaved audio and e.g. use the - GstPlanarAudioAdapter. - See https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/issues/779 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1363> - -2020-06-22 12:32:50 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Don't call gst_ghost_pad_construct() anymore - It's deprecated, unneeded and doesn't do anything anymore. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1360> - -2020-06-18 21:21:26 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/videoparsers/gsth264parse.c: - Revert "h264parse: Include `interlace-mode` in caps" - This reverts commit b75a61342f4ea039d922a966f36b02cd9d9c3ad8. - The parser would only set the mode to progressive or mixed, missing the - cases where it should have been interleaved. Interleaved is more - difficult to detect because in h264 it happens per frame. On the other - hand, h264 decoders detect the interlacing information per-frame and set - the caps correctly. By giving potentially incorrect interlacing - information in the parser already, it's being enforced downstream even - after decoding, breaking some use cases (e.g. an encoder can't properly - mark the stream as TFF or BFF). On the other hand, there's no valid use - case for having interlacing information on the caps at the parsing - stage, so after a lot of discussion, it was decided to revert this. - Initial commit message: - ========================= - Those are the rules: - In the SPS: - * if frame_mbs_only_flag=1 => all frame progressive - * if frame_mbs_only_flag=0 => field_pic_flag defines if each frame is - progressive or interlaced, thus the mode is 'mixed' in GStreamer - terms. - https://bugzilla.gnome.org/show_bug.cgi?id=779309 - ========================= - Fixes #1313 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1335> - -2020-06-22 18:42:45 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11window_win32: Chain up mouse event to parent window - Unlike key event, mouse event will not be chained up to parent window - by DefWindowProc - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1361> - -2020-06-19 22:14:29 +0900 Seungha Yang <seungha@centricular.com> - - * sys/winscreencap/dxgicapture.c: - * sys/winscreencap/dxgicapture.h: - * sys/winscreencap/gstdxgiscreencapsrc.c: - * sys/winscreencap/gstdxgiscreencapsrc.h: - * sys/winscreencap/gstwinscreencap.c: - * sys/winscreencap/meson.build: - dxgiscreencapsrc: Load HLSL compiler library using g_module_open - Depending on OS version, available d3dcompiler library name is different. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1355> - -2020-06-19 23:02:45 +0900 Seungha Yang <seungha@centricular.com> - - * sys/winscreencap/dxgicapture.c: - * sys/winscreencap/gstdxgiscreencapsrc.c: - * sys/winscreencap/gstwinscreencap.c: - dxgiscreencapsrc: Reorganize debug category usage - Use the same debug category in all dxgiscreencap related source code - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1355> - -2020-06-19 21:43:15 +0900 Seungha Yang <seungha@centricular.com> - - * sys/winscreencap/dxgicapture.c: - * sys/winscreencap/meson.build: - winscreencap: Remove trailing whitespaces - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1355> - -2020-06-19 21:34:32 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11device.c: - d3d11device: Print supported DXGI format for debugging - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1355> - -2020-06-19 21:24:59 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11shader.c: - * sys/d3d11/gstd3d11shader.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Load HLSL compiler library using g_module_open - Depending on OS version, available d3dcompiler library name is different. - But for UWP, we can still use the current way - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1355> - -2020-06-19 20:40:24 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11shader.c: - d3d11shader: Add missing config.h include - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1355> - -2020-06-21 16:02:43 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: fix ice control mode when we offer initially - An initial offer means we have a local description not a remote - description. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1332 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1358> - -2020-05-25 00:15:14 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvp9enc.cpp: - * sys/mediafoundation/gstmfvp9enc.h: - * sys/mediafoundation/meson.build: - * sys/mediafoundation/plugin.c: - mediafoundation: Add VP9 encoder element - Some Intel GPUs support hardware accelerated VP9 encoding and - Microsoft provides software VP9 encoding implementation as well. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1295> - -2020-06-18 12:15:09 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * ext/fdkaac/gstfdkaacenc.c: - fdkaacenc: Add missing SURROUND mappings - SURROUND is more to spec according to the FIXME comments, so add this. - Also add SIDE for 5 and 5.1 because of ffmpeg compatibility, because the - following pipeline downmixes to mono otherwise: - gst-launch-1.0 audiotestsrc num-buffers=1 ! audio/x-raw, channels=6 ! - avenc_ac3 ! avdec_ac3 ! audioconvert ! fdkaacenc ! fakesink -v - Fixes #1327 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1352> - -2020-06-15 01:38:03 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdevice.c: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkphysicaldevice.c: - vulkan: log extension/layers available/enabled on instance/device creation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1341> - -2020-06-15 01:26:08 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdevice.c: - * gst-libs/gst/vulkan/gstvkdevice.h: - * gst-libs/gst/vulkan/gstvkphysicaldevice.c: - * gst-libs/gst/vulkan/gstvkphysicaldevice.h: - * gst-libs/gst/vulkan/gstvkswapper.c: - vulkan/device: expose extension/layer choices - Extensions and layers can be enabled before calling - gst_vulkan_device_open(). The available extensions are stored in - GstVulkanPhysicalDevice. - Defaults are still the same. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1341> - -2020-06-14 21:04:37 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkinstance.h: - vulkan/instance: privatise defult debug callback - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1341> - -2020-06-14 21:00:06 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdisplay.c: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkinstance.h: - * tests/check/libs/vkinstance.c: - vulkan/instance: expose extension/layer choices - Extensions and layers can be enabled before calling - gst_vulkan_instance_open() but after calling - gst_vulkan_instance_fill_info(). - Use the list of available extensions to better choose a default display - implementation to use based on the available Vulkan extensions for surface - output. - Defaults are still the same. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1341> - -2020-06-13 17:40:02 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkphysicaldevice.c: - vulkan/physical-device: dump some more information to logs - Also dump the Vulkan 1.1 and Vulkan 1.2 device properties/features - where supported. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1341> - -2020-06-13 17:31:07 +1000 Matthew Waters <matthew@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkinstance.h: - * tests/check/libs/vkinstance.c: - * tests/check/meson.build: - vulkan/instance: add vulkan API version selection and checking - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1341> - -2020-06-13 17:29:57 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/wayland/gstvkwindow_wayland.c: - vulkan/wayland: initialise debug category before debug logging - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1341> - -2020-06-19 12:15:53 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/nalutils.h: - nalutils: Improve slightly the error trace - Until now, bound check would simply trace the values and the range. This - enhances the trace by also tracing the name of the variable that was to be set - or read. This is not magically perfect in all cases, but greatly speed the - debugging work. Here's an example before and after this change: - Before: gst_h264_parser_parse_slice_hdr: value not in allowed range. value: 819183, range -87-77 - After: gst_h264_parser_parse_slice_hdr: value for 'slice->slice_qp_delta' not in allowed range. value: 819183, range -87-77 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1356> - -2019-12-12 12:58:24 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * docs/plugins/gst_plugins_cache.json: - * gst/debugutils/gsterrorignore.c: - Revert "errorignore: Added convert-error signal" - The introduced API has some problems1 and a better solution2 was - found that made the feature obsolete. - This reverts commit f7626c1f2ac14a34991723df6c28f54af38fcbc4. - 1: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/736#note_357702 - 2: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/736#note_238830 - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/916 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/916> - -2020-06-20 00:28:22 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - Back to development - -=== release 1.17.1 === - -2020-06-19 19:22:18 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * docs/plugins/gst_plugins_cache.json: - * gst-plugins-bad.doap: - * meson.build: - Release 1.17.1 - -2020-06-19 17:20:02 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/srt/gstsrt.c: - srt: add "empty" subclasses for deprecated srt{client,server}{src,sink} - The doc system gets confused when we register the exact same - class as multiple elements, so make a subclass for each. - Also wrap registration of deprecated elements with #ifndef GST_REMOVE_DEPRECATED. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1354> - -2020-06-19 15:31:04 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/x265/gstx265enc.c: - x265: ignore tune property when diffing generated docs - Unfortunately it means those tune enums don't show up in - the docs then, but if that's how it's gotta be.. - (Problem at hand is that on Tim's machine x265enc gets an - tune=animation and on the CI machine this doesn't show up.) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1354> - -2020-06-19 13:08:10 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - docs: update plugins cache - Add some more plugins, update for new markers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1354> - -2020-06-19 13:05:38 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/directfb/dfbvideosink.c: - * ext/openni2/gstopenni2src.cpp: - Mark more plugin GTypes as plugin API - To appease the CI gods. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1354> - -2020-06-17 09:31:09 +0200 Antonio Ospite <ao2@ao2.it> - - * tools/gst-project-maker: - gst-project-maker: use $0 for the program name in usage and help text - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/184> - -2020-01-17 17:49:47 +0100 Antonio Ospite <ao2@ao2.it> - - * tools/gst-project-maker: - gst-project-maker: set up a meson project instead of an autotools one - Now that autotools has been removed generate a meson project template in - gst-project-maker. - There are some differences with the autotools project - 1. gstreamer-controller-1.0 is not added to the default dependencies. - 2. The '-Wall' option is not set explicitly, meson can handle that. - 3. The flags in GST_PLUGIN_LDFLAGS have not been ported to meson as - they are not necessary anymore. - The generated project requires meson 0.53.0 for the 'fs' module. It's up - to the user to remove that part in case compatibility with older - versions of meson is desired. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/184> - -2019-02-01 17:05:23 +0100 Antonio Ospite <ao2@ao2.it> - - * tools/gst-project-maker: - gst-project-maker: fix comment referring to plug-in instead of program - Fix the comment in $basedir/tools/Makefile.am which wrongly refers to - plug-in while the file in tool/ is about the executable program. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/184> - -2019-02-01 17:04:19 +0100 Antonio Ospite <ao2@ao2.it> - - * tools/gst-app-maker: - gst-app-maker: fix program name and arguments in usage text and help text - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/184> - -2020-06-16 00:12:03 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfsourceobject.c: - * sys/mediafoundation/gstmfsourceobject.h: - * sys/mediafoundation/gstmfsourcereader.cpp: - * sys/mediafoundation/gstmfutils.cpp: - * sys/mediafoundation/gstmfvideosrc.c: - mfvideosrc: Add support for jpeg on Win32 application - Enable reading jpeg data from webcam if it's supported. - Note that this would be enabled only for Win32. - For UWP, we need to research more about how to support jpeg. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1342> - -2020-06-16 00:11:03 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfcapturewinrt.cpp: - mfvideosrc: Fix wrong casting - Don't cast ISoftwareBitmap to IMFMediaBuffer - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1342> - -2020-06-14 04:12:42 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/mediacapturewrapper.cpp: - mfvideosrc: Add support YUY2 format for UWP - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1342> - -2020-06-14 03:13:04 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfcaptureengine.cpp: - * sys/mediafoundation/gstmfcaptureengine.h: - * sys/mediafoundation/gstmfdevice.c: - * sys/mediafoundation/gstmfvideosrc.c: - * sys/mediafoundation/meson.build: - mediafoundation: Drop IMFCaptureEngine implementation - It was introduced for later use of its enhanced feature over IMFSourceReader - such as taking photo with video preview, audio/video capturing at - the same time, etc. But currently it's not our use case, and it would - be maintenance burden. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1342> - -2020-06-17 10:57:00 +0900 Hosang Lee <hosang10.lee@lge.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: ignore unrecognized stream - Only create pads for steams with caps that can be recognized - from the fourcc. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1348> - -2020-04-07 21:47:22 +1000 Jan Schmidt <jan@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/dvbsubenc/gstdvbsubenc-util.c: - * gst/dvbsubenc/gstdvbsubenc.c: - * gst/dvbsubenc/gstdvbsubenc.h: - * gst/dvbsubenc/libimagequant/CHANGELOG: - * gst/dvbsubenc/libimagequant/COPYRIGHT: - * gst/dvbsubenc/libimagequant/README.md: - * gst/dvbsubenc/libimagequant/blur.c: - * gst/dvbsubenc/libimagequant/blur.h: - * gst/dvbsubenc/libimagequant/libimagequant.c: - * gst/dvbsubenc/libimagequant/libimagequant.h: - * gst/dvbsubenc/libimagequant/mediancut.c: - * gst/dvbsubenc/libimagequant/mediancut.h: - * gst/dvbsubenc/libimagequant/mempool.c: - * gst/dvbsubenc/libimagequant/mempool.h: - * gst/dvbsubenc/libimagequant/nearest.c: - * gst/dvbsubenc/libimagequant/nearest.h: - * gst/dvbsubenc/libimagequant/pam.c: - * gst/dvbsubenc/libimagequant/pam.h: - * gst/dvbsubenc/libimagequant/viter.c: - * gst/dvbsubenc/libimagequant/viter.h: - * gst/dvbsubenc/meson.build: - * gst/meson.build: - * meson_options.txt: - dvbsubenc: Add DVB Subtitle encoder - Add an element that converts AYUV video frames to a DVB - subpicture stream. - It's fairly simple for now. Later it would be good to support - input via a stream that contains only GstVideoOverlayComposition - meta. - The element searches each input video frame for the largest - sub-region containing non-transparent pixels and encodes that - as a single DVB subpicture region. It can also do palette - reduction of the input frames using code taken from - libimagequant. - There are various FIXME for potential improvements for now, but - it works. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1227> - -2020-06-16 19:26:13 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11utils.c: - d3d11: Don't assume response of context query has valid d3d11 device context - Peer elements should return FALSE if d3d11 device context is unavailable - but it might happen for some reason (e.g., wrong implementation or so) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1347> - -2020-06-15 21:10:09 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp8dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Disable zero-copy for blacklisted device - Should enable it for verified devices. For now, Xbox is blacklisted - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1339> - -2020-06-12 20:34:49 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Adjust alignment constraint for Xbox device - XBox doesn't seem to support 128 bytes alignment for 4K HEVC - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1339> - -2020-06-12 20:18:53 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Do not configure video processor for Xbox device - Disable video processor for Xbox until it's verified - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1339> - -2020-06-12 19:07:07 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - d3d11utils: Add a helper method for checking Xbox device - Required for some cases to work around device specific issue - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1339> - -2020-06-12 20:11:29 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Use GPU memory copy if possible - Even if fallback buffer is required (e.g., shader resource view is unavailable), - use direct GPU memory copy if possible. It must be much faster than - system memory copy approach. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1339> - -2020-06-12 19:44:01 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Ensure shader resource view of fallback buffer - SRV must be configured for color conversion - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1339> - -2020-06-12 19:08:34 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Fix typo "configureed" - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1339> - -2019-11-21 13:50:21 +0900 Jun-ichi OKADA <okada@abt.jp> - - * sys/winscreencap/dxgicapture.c: - * sys/winscreencap/dxgicapture.h: - * sys/winscreencap/gstdxgiscreencapsrc.c: - * sys/winscreencap/gstdxgiscreencapsrc.h: - * sys/winscreencap/gstwinscreencap.c: - * sys/winscreencap/meson.build: - winscreencap: Add dxgiscreencapsrc element. - This element uses the Desktop Duplication API to capture the desktop screen at high speed. - It supports Windows 8 or later. - It has the following features compared to other elements: - * Runs faster. - * It works in High DPI environment. - * Draws an accurate mouse cursor. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/863> - -2020-05-14 11:03:49 +0800 Xu Guangxin <guangxin.xu@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/gstmsdkvc1dec.c: - msdkdec: hold a reference for the surfaces locked by msdk - previous code releases GstBuffer too earlier. so we will see - ERROR default gstmsdkvideomemory.c:77:gst_msdk_video_allocator_get_surface: failed to get surface available - ERROR msdkbufferpool gstmsdkbufferpool.c:270:gst_msdk_buffer_pool_alloc_buffer:<msdkbufferpool0> failed to create new MSDK memory - We need to hold GstBuffer reference for msdk if the surfaced locked by msdk. - step to reproduce. - 1. ffmpeg -f lavfi -i testsrc=duration=10:size=320x240:rate=30 -pix_fmt yuv420p -c:v libx265 test.265 - 2. GST_GL_PLATFORM=egl gst-launch-1.0 -v filesrc location=test.265 ! h265parse ! msdkh265dec ! queue ! glimagesink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1277> - -2020-06-12 15:48:14 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/shaders/ayuv_to_rgb.frag: - * ext/vulkan/shaders/bin2array.py: - * ext/vulkan/shaders/color_convert_generic.glsl: - * ext/vulkan/shaders/identity.frag: - * ext/vulkan/shaders/identity.vert: - * ext/vulkan/shaders/nv12_to_rgb.frag: - * ext/vulkan/shaders/rgb_to_ayuv.frag: - * ext/vulkan/shaders/rgb_to_nv12.frag: - * ext/vulkan/shaders/rgb_to_yuy2.frag: - * ext/vulkan/shaders/swizzle.frag: - * ext/vulkan/shaders/swizzle.glsl: - * ext/vulkan/shaders/swizzle_and_clobber_alpha.frag: - * ext/vulkan/shaders/upsample_ayuv.glsl: - * ext/vulkan/shaders/upsample_nv12.glsl: - * ext/vulkan/shaders/upsample_yuy2.glsl: - * ext/vulkan/shaders/view_convert.frag: - * ext/vulkan/shaders/view_defines.h: - * ext/vulkan/shaders/yuy2_to_rgb.frag: - vulkan/shaders: add explicit license headers - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1338> - -2020-06-12 15:47:01 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/shaders/bin2array.py: - vulkan/shaders: manually indent bin2array - Looks much nicer with some semblance of code formatting - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1338> - -2020-06-12 04:59:47 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth265picture.c: - codecs: h265picture: Don't leak pic_list GArray - Equivalent to the commit 7b8c071f9c4a675f6b53e373c346d9e1f866f818 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1337> - -2020-06-11 19:35:29 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/meson.build: - * gst/yadif/gstyadif.c: - * gst/yadif/gstyadif.h: - * gst/yadif/meson.build: - * gst/yadif/vf_yadif.c: - * gst/yadif/yadif.c: - * gst/yadif/yadif_template.c: - * meson_options.txt: - yadif: remove plugin, there's now deinterlace method=yadif - Plugin code was still the GPL version, and the - functionality has now been moved into the deinterlace - element in gst-plugins-good as method=yadif (and LGPL). - See https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/444 - and https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/621 - Closes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/216 - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/463 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1336> - -2020-06-11 01:47:14 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2client.cpp: - wasapi2: Fallback to IAudioClient interface if IAudioClient3 API is unavailable - When default device is selected, IAudioClient3 API doesn't look like - available. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1332> - -2020-06-11 13:50:38 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/interlace/gstinterlace.c: - interlace: Fix crash with empty caps in setcaps - If the src_peer_caps are EMPTY (e.g. negotiation failed somewhere), the - assertion inside gst_video_info_from_caps would fail and the whole - pipeline would crash. Check for gst_caps_is_empty before - gst_video_info_from_caps and gracefully fail if it's empty. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1333> - -2020-06-09 22:38:28 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - wasapi: Fix possible deadlock while downwards state change - IAudioClient::Stop() doesn't seem to wake up the event handle, - then read() or write() could be blocked forever by WaitForSingleObject. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1329> - -2020-06-09 15:31:56 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - docs: Update plugins cache - -2020-06-09 10:53:17 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/wayland/wldisplay.c: - waylandsink: add wl_registry.global_remove listener - when hotplug display, wayland client will call this listener - to notify client do clean up. Temporarily set a dummy function - here to avoid app abort - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1327> - -2020-06-08 14:56:31 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/srt/gstsrtobject.c: - srt: doc: Add missing gst_type_mark_as_plugin_api - -2020-06-08 13:03:09 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/lv2/gstlv2utils.c: - docs: Mark lv2 runtime generated enums as plugins API types - -2020-06-08 12:30:59 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/faac/gstfaac.c: - * ext/vulkan/vksink.c: - * gst-libs/gst/vulkan/gstvkphysicaldevice.c: - docs: Add some more plugin API types - And allow creating vulkan device object without specifying an instance - so it can be introspected. - -2020-06-08 09:52:30 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/vulkan/vkviewconvert.c: - docs: Update plugins cache - -2020-06-09 10:48:06 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Fix reading mode and start code type - These two controls are not pointer based, so we don't need to pass any size or - pointer and need to copy the values afterward. This fixes H264 decoding - regression with Hantro and RKVDEC drivers. - Fixes 037730a787c6cdeeee5779c1834315c1ca764505 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1330> - -2020-06-08 23:46:43 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmftransform.cpp: - mftransform: Fix deadlock when MFT requests processing output twice - This sequence of event/data flow might happen - 1) Initially we have one pending output event - 1-1) Then, process the pending output data - 2) No pending input event, then we should wait new pending input event - 2-1) Wakeup by new pending event (but it's pending output event) - In above case, MFT will not report new pending input event - if pending output is not processed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1325> - -2020-06-08 19:22:07 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmftransform.cpp: - mftransform: Add some debug log - Add some trace level log for debugging - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1325> - -2020-05-19 10:27:18 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Handle live duration queries - Handle it the same way live sources would, that it by handling the query and - return an unknown duration. - Fixes #566 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1279> - -2020-05-11 01:53:11 +0900 Seungha Yang <seungha@centricular.com> - - * tests/check/elements/wasapi2.c: - * tests/check/meson.build: - tests: wasapi2: Add unit test for reusing wasapisrc - Test state change between playing and null and playing again - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1264> - -2020-05-28 05:09:47 +0900 Seungha Yang <seungha@centricular.com> - - * sys/wasapi2/gstwasapi2device.c: - * sys/wasapi2/gstwasapi2device.h: - * sys/wasapi2/meson.build: - * sys/wasapi2/plugin.c: - wasapi2: Add device provider implementation - Similar to device provider implementation of wasapi plugin, - this implementation supports only static probing. - But we can implement runtime device add/remove/update - monitoring using DeviceWatcher interface later. - See https://docs.microsoft.com/en-us/uwp/api/windows.devices.enumeration.devicewatcher - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1264> - -2020-05-26 05:17:41 +0900 Seungha Yang <seungha@centricular.com> - - * meson_options.txt: - * sys/meson.build: - * sys/wasapi2/AsyncOperations.h: - * sys/wasapi2/gstwasapi2client.cpp: - * sys/wasapi2/gstwasapi2client.h: - * sys/wasapi2/gstwasapi2sink.c: - * sys/wasapi2/gstwasapi2sink.h: - * sys/wasapi2/gstwasapi2src.c: - * sys/wasapi2/gstwasapi2src.h: - * sys/wasapi2/gstwasapi2util.c: - * sys/wasapi2/gstwasapi2util.h: - * sys/wasapi2/meson.build: - * sys/wasapi2/plugin.c: - wasapi2: Introduce new WASAPI plugin - Add a new wasapi implementation mainly to support UWP application. - Basically the core logic of this plugin is almost identical to - existing wasapi plugin, but main target is Windows 10 (+ UWP). - Since this plugin uses WinRT APIs, this plugin most likely might not - work Windows 8 or lower. - Compared with existing wasapi plugin, additional features of this plugin are - * Fully compatible with both Windows 10 desktop and UWP application - * Supports automatic stream routing (auto fallback when device was removed) - * Support device level mute/volume control - But some features of existing wasapi plugin are not implemented - in this plugin yet - * Exclusive streaming mode is not supported - * Loopback feature is not implemented - * Cross-compile is not possible with current mingw toolchain - (meaning that MSVC and Windows 10 SDK are required to build this plugin) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1264> - -2020-06-06 21:15:34 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvideoenc.cpp: - mfvideoenc: Set PAR to output IMFMediaType - We've set it to input IMFMediaType but not for output. - So, if PAR is not 1:1, the input IMFMediaType will be accepted - by MFT (default is 1:1). - The PAR of input/output IMFMediaType must be identical - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1322> - -2020-06-06 21:01:24 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmftransform.cpp: - mftransform: Don't try to drain if MFT is not running - Otherwise MFT will be blocked forever as no event can be generated by - IMFMediaEventGenerator. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1322> - -2020-06-06 00:40:42 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/aom/gstav1enc.c: - * ext/closedcaption/gstceaccoverlay.c: - * ext/colormanagement/gstlcms.c: - * ext/curl/gstcurlhttpsrc.c: - * ext/curl/gstcurlsshsink.c: - * ext/dash/gstdashsink.c: - * ext/dc1394/gstdc1394src.c: - * ext/dtls/plugin.c: - * ext/mpeg2enc/gstmpeg2encoptions.cc: - * ext/mplex/gstmplexjob.cc: - * ext/opencv/gstcameracalibrate.cpp: - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstdewarp.cpp: - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstfaceblur.cpp: - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gstretinex.cpp: - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstskindetect.cpp: - * ext/openh264/gstopenh264enc.cpp: - * ext/openjpeg/gstopenjpegenc.c: - * ext/srtp/gstsrtp.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/webp/gstwebpenc.c: - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtcdsp/gstwebrtcdsp.cpp: - * ext/x265/gstx265enc.c: - * gst-libs/gst/audio/gstnonstreamaudiodecoder.c: - * gst/adpcmenc/adpcmenc.c: - * gst/audiomixmatrix/gstaudiomixmatrix.c: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstwavescope.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/coloreffects/gstcoloreffects.c: - * gst/debugutils/gstchecksumsink.c: - * gst/debugutils/gstclockselect.c: - * gst/debugutils/gstcompare.c: - * gst/debugutils/gstfakevideosink.c: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstmirror.c: - * gst/interlace/gstinterlace.c: - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mxf/mxfmux.c: - * gst/netsim/gstnetsim.c: - * gst/rawparse/gstaudioparse.c: - * gst/rist/gstristsink.c: - * gst/rtmp2/gstrtmp2.c: - * gst/timecode/gstavwait.c: - * gst/timecode/gsttimecodestamper.c: - * gst/yadif/gstyadif.c: - * sys/decklink/gstdecklink.cpp: - * sys/dvb/gstdvbsrc.c: - * sys/uvch264/gstuvch264_src.c: - plugins: uddate gst_type_mark_as_plugin_api() calls - -2020-06-05 22:39:54 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11overlaycompositor.c: - d3d11overlaycompositor: Fix wrong Y position calculation - The Y coordinate of vertex and screen/image are opposite - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1319> - -2020-06-04 13:33:59 +0200 cketti <ck@cketti.de> - - * ext/curl/gstcurlsmtpsink.c: - curlsmtpsink: Use correct email date format - See https://www.rfc-editor.org/rfc/rfc5322.html#section-3.3 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1317> - -2020-06-02 18:07:10 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: signal cea608 padding as invalid - Outputting a valid but null cea608 byte pair may cause some issues with - some checksum packets. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1318> - -2020-06-02 17:35:00 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: also copy buffer metadata when draining - Fixes buffers without PTS/DTS/meta/etc when receiving an EOS with data - still stored in the internal scratch buffer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1318> - -2020-06-02 17:33:07 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: Output the limit hit in debug lines - Fix two case of the input triplet limit not applying in cea608 -> cdp - conversion. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1318> - -2020-06-03 18:38:58 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/meson.build: - doc: Require hotdoc >= 0.11.0 - -2020-06-02 15:06:38 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/webrtc/gstwebrtcice.c: - doc: Fix spelling of GstWebRTCICE - -2020-05-27 16:01:42 +0300 Sebastian Dröge <sebastian@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - docs: Update gst_plugins_cache.json - -2020-06-02 12:51:35 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/debugutils/gstclockselect.c: - clockselect: Don't register GstClockSelectClockId multiple times - -2020-05-31 10:18:00 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/aom/gstav1enc.c: - * ext/closedcaption/gstceaccoverlay.c: - * ext/colormanagement/gstlcms.c: - * ext/curl/gstcurlhttpsrc.c: - * ext/curl/gstcurlsshsink.c: - * ext/dash/gstdashsink.c: - * ext/dc1394/gstdc1394src.c: - * ext/dtls/plugin.c: - * ext/mpeg2enc/gstmpeg2encoptions.cc: - * ext/mplex/gstmplexjob.cc: - * ext/opencv/gstcameracalibrate.cpp: - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstdewarp.cpp: - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstfaceblur.cpp: - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gstretinex.cpp: - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstskindetect.cpp: - * ext/openh264/gstopenh264enc.cpp: - * ext/openjpeg/gstopenjpegenc.c: - * ext/srtp/gstsrtp.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/webp/gstwebpenc.c: - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtcdsp/gstwebrtcdsp.cpp: - * ext/x265/gstx265enc.c: - * gst-libs/gst/audio/gstnonstreamaudiodecoder.c: - * gst/adpcmenc/adpcmenc.c: - * gst/audiomixmatrix/gstaudiomixmatrix.c: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstwavescope.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/coloreffects/gstcoloreffects.c: - * gst/debugutils/gstchecksumsink.c: - * gst/debugutils/gstclockselect.c: - * gst/debugutils/gstcompare.c: - * gst/debugutils/gstfakevideosink.c: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstmirror.c: - * gst/interlace/gstinterlace.c: - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mxf/mxfmux.c: - * gst/netsim/gstnetsim.c: - * gst/rawparse/gstaudioparse.c: - * gst/rist/gstristsink.c: - * gst/rtmp2/gstrtmp2.c: - * gst/timecode/gstavwait.c: - * gst/timecode/gsttimecodestamper.c: - * gst/yadif/gstyadif.c: - * sys/decklink/gstdecklink.cpp: - * sys/dvb/gstdvbsrc.c: - * sys/uvch264/gstuvch264_src.c: - plugins: Use gst_type_mark_as_plugin_api() for all non-element plugin types - -2020-06-02 18:29:16 -0300 Peter Workman <peter@onsetcommunication.com> - - * ext/srt/gstsrtobject.c: - srtobject: continue polling or report error on failed receive - fixes #1277 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1260> - -2020-06-03 17:49:41 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Use secondary rank - d3dvideosink will be replaced by d3d11videosink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1311> - -2020-05-30 04:56:58 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/plugin.c: - d3d11videosink: Assign primary rank - d3d11videosink has an advantage over d3dvideosink, such as - * Zero-copy playback with d3d11 decoders - * HDR rendering with 10-bit format/swapchain support - * UWP support - * Any system memory alignment/padding can be supported - * User can select target GPU device - And old d3dvideosink's functionality (e.g., navigation event, overlaycomposition) - can be covered by d3d11videosink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1311> - -2020-06-03 10:32:00 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/datachannel.c: - * gst-libs/gst/webrtc/datachannel.h: - webrtc: Add `Since: 1.18` markers to the new datachannel library API - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1315> - -2020-05-15 16:51:46 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * ext/srt/gstsrtobject.c: - srt: Make logging regarding callers more useful - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1273> - -2020-06-01 14:46:03 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/webrtcdatachannel.c: - * ext/webrtc/webrtcdatachannel.h: - * gst-libs/gst/webrtc/datachannel.c: - * gst-libs/gst/webrtc/datachannel.h: - * gst-libs/gst/webrtc/meson.build: - * gst-libs/gst/webrtc/webrtc.h: - * gst-libs/gst/webrtc/webrtc_fwd.h: - webrtc: Add GstWebRTCDataChannel to the library API - This makes it more discoverable for bindings and allows bindings to - generate static API for the signals and functions. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1168 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1313> - -2020-05-29 22:21:10 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkimagememory.c: - vulkanimagememory: fix use-after-free releasing a view - If the view has the last reference to the image, then - gst_clear_mini_object will destroy the image and the lock used in the - next line. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1314> - -2020-05-29 22:17:24 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkimagememory.c: - vkimagememory: actually check the length of a ptr array - Not it's value is > 0 which should always be true. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1314> - -2020-05-28 11:51:28 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/meson.build: - avtp: Ensure that the avtp plugin is only built on Linux - It uses some Linux only features. This also prevents gst-build trying to - get libavtp on non-Linux environments. - -2020-05-29 11:36:06 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * tests/check/elements/avtpcrfcheck.c: - * tests/check/elements/avtpcrfsync.c: - * tests/check/elements/avtpcrfutil.c: - * tests/check/elements/avtpcvfpay.c: - tests/avtp: Plug some (more) leaks - Some leaks were introduced in new tests - this patch fix them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1312> - -2020-04-08 14:40:56 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkh265enc.c: - msdkh265enc: add support 12-bit 420 encoding - P016 is used for 12-bit encoding in MediaSDK, so the Shift flag is set - in the mfx parameters - Sample pipeline: - gst-launch-1.0 videotestsrc ! video/x-raw,format=P012_LE ! msdkh265enc ! \ - fakesink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1174> - -2020-05-19 14:59:25 +0800 Xu Guangxin <guangxin.xu@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - msdkvpp: fix "failed to create new MSDK memory" - all msdk output surfaces come from out_alloc_resp, so the buffer count is not resizable. - we need set min_buffers, max_buffers to same size. - steps to reproduce - 1. ffmpeg -f lavfi -i testsrc=duration=10:size=320x240:rate=30:decimals=3 -pix_fmt yuv420p -c:v libx265 ~/bits/hevc/test.265 - 2. GST_GL_PLATFORM=egl gst-launch-1.0 -v filesrc location=~/bits/hevc/test.265 ! h265parse ! msdkh265dec ! msdkvpp ! queue ! glimagesink - you will see error like this: - ERROR default gstmsdkvideomemory.c:77:gst_msdk_video_allocator_get_surface: failed to get surface available - ERROR msdkbufferpool gstmsdkbufferpool.c:270:gst_msdk_buffer_pool_alloc_buffer:<msdkbufferpool2> failed to create new MSDK memory - ERROR msdkvpp gstmsdkvpp.c:297:create_output_buffer:<msdkvpp0> failed to create output video buffer - ERROR msdkdec gstmsdkdec.c:699:gst_msdkdec_finish_task:<msdkh265dec0> Failed to finish frame - ERROR msdkdec gstmsdkdec.c:1085:gst_msdkdec_handle_frame:<msdkh265dec0> Failed to finish a task - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1278> - -2020-05-19 15:14:34 +0800 Xu Guangxin <guangxin.xu@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - msdkvpp: hold GstBuffer ref count for locked surfaces - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1278> - -2020-05-29 22:55:56 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/mediacapturewrapper.cpp: - mediafoundation: Use core dispatcher of current view instead of main view - Main view might be hidden depending on application's view tree. - In that case, ICoreApplication object doesn't return get_MainView() method - Note that nothing about this behavior was documented by Microsoft - https://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.core.coreapplication.mainview - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1310> - -2020-05-28 22:48:15 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/vulkan/meson.build: - vulkan: fix use of assert() with older meson versions - Follow-up to !1307 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1308> - -2020-05-28 19:07:32 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/vulkan/meson.build: - * gst-libs/gst/vulkan/meson.build: - vulkan: don't run tests or build lib if plugin isn't actually built - The unit tests only checked for vulkan_dep.found(), which can - be true if the libs are there but glslc was not found, in which - case the plugin wouldn't be built and the unit tests would fail - because of missing vulkan plugins. - Doesn't really make much sense to build the vulkan integration lib - either if we're not going to build the vulkan plugin, so just disable - both for now if glslc is not available. - Fixes #1301 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1307> - -2020-05-27 14:44:01 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * tests/check/elements/mpegtsdemux.c: - mpegtsdemux: tests: Test that tsparse doesn't drop padding - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1300> - -2020-05-26 22:40:04 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtsparse.c: - mpegtsdemux: Deliver all packets to tsparse - 34af8ed66a7c63048ce0bdf59bbe61011d7c6292 changed the code to use the - packetizer's packets instead of the incoming buffers, but mpegtsbase - didn't actually push all packets to the subclass. As a result, padding - (PID 0x1FFF) packets got lost. - Add a new boolean to toggle pushing unknown packets to mpegtsbase and - have mpegtsparse make use of it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1300> - -2020-05-28 20:46:02 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfutils.cpp: - mediafoundation: Fix undeclared identifier error on UWP build - Some symbols are not available in case of UWP - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1306> - -2020-05-28 18:18:58 +1000 Jan Schmidt <jan@centricular.com> - - * tests/check/elements/avtpcrfutil.c: - avtp: Initialise strack structures to 0 in tests - Avoid valgrind warnings about accessing uninitialised memory - in the tests by initialisting structures to 0 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1305> - -2020-05-28 17:33:43 +1000 Jan Schmidt <jan@centricular.com> - - * tests/check/elements/avtpcrfbase.c: - * tests/check/elements/avtpcrfcheck.c: - * tests/check/elements/avtpcrfsync.c: - avtp: Fix some leaks in the tests - Fix valgrind errors that area showing on the CI now - that AVTP elements are built. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1305> - -2020-05-25 13:10:20 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/webrtcsdp.c: - * ext/webrtc/webrtcsdp.h: - webrtc: handle an ice-lite remote offer - When the remote peer offers an ice-lite SDP, we need to configure our - ICE negotiation to be in controlling mode as the peer will not be. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1304> - -2020-05-08 17:30:21 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * gst-libs/gst/codecparsers/gsth265parser.h: - codecparsers: fix typo in GstH265RegisteredUserData doc - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1303> - -2020-05-27 15:17:12 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/meson.build: - tests: fix meson test env setup to make sure we use the right gst-plugin-scanner - If core is built as a subproject (e.g. as in gst-build), make sure to use - the gst-plugin-scanner from the built subproject. Without this, gstreamer - might accidentally use the gst-plugin-scanner from the install prefix if - that exists, which in turn might drag in gst library versions we didn't - mean to drag in. Those gst library versions might then be older than - what our current build needs, and might cause our newly-built plugins - to get blacklisted in the test registry because they rely on a symbol - that the wrongly-pulled in gst lib doesn't have. - This should fix running of unit tests in gst-build when invoking - meson test or ninja test from outside the devenv for the case where - there is an older or different-version gst-plugin-scanner installed - in the install prefix. - In case no gst-plugin-scanner is installed in the install prefix, this - will fix "GStreamer-WARNING: External plugin loader failed. This most - likely means that the plugin loader helper binary was not found or - could not be run. You might need to set the GST_PLUGIN_SCANNER - environment variable if your setup is unusual." warnings when running - the unit tests. - In the case where we find GStreamer core via pkg-config we use - a newly-added pkg-config var "pluginscannerdir" to get the right - directory. This has the benefit of working transparently for both - installed and uninstalled pkg-config files/setups. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1302> - -2020-05-22 05:55:03 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfmp3enc.cpp: - * sys/mediafoundation/gstmfmp3enc.h: - * sys/mediafoundation/meson.build: - * sys/mediafoundation/plugin.c: - mediafoundation: Add support MP3 audio encoding - Add MediaFoundation MP3 encoder - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1280> - -2020-05-18 18:12:38 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfaacenc.cpp: - * sys/mediafoundation/gstmfaacenc.h: - * sys/mediafoundation/gstmfaudioenc.cpp: - * sys/mediafoundation/gstmfaudioenc.h: - * sys/mediafoundation/gstmftransform.cpp: - * sys/mediafoundation/gstmftransform.h: - * sys/mediafoundation/meson.build: - * sys/mediafoundation/plugin.c: - mediafoundation: Add support for AAC encoding - Add MediaFoundation AAC encoder element. - Before Windows 10, mono and stereo channels were supported audio channels - configuration by AAC encoder MFT. However, on Windows 10, - 5.1 channels support was introduced. - To expose correct range of support format by this element - whatever the OS version is, this element will enumerate - all the supported format by the AAC encoder MFT - and then will configure sink/src templates while plugin init. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1280> - -2020-05-24 00:46:38 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfutils.cpp: - * sys/mediafoundation/gstmfutils.h: - * sys/mediafoundation/gstmfvideoenc.cpp: - mfutils: Move IMediaType release function to common utility - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1280> - -2020-05-18 00:41:14 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfutils.cpp: - * sys/mediafoundation/gstmfutils.h: - * sys/mediafoundation/meson.build: - mediafoundation: Add util function to dump IMFAttributes values - It would be useful for debugging. - Reference: https://docs.microsoft.com/en-us/windows/win32/medfound/media-type-debugging-code - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1280> - -2020-05-27 03:50:57 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11window_win32: Create internal window on parent window's thread - If parent and child windows are running on different thread, - there is always a chance to cause deadlock as DefWindowProc() call - from child window thread might be blocked until the message - is handled by parent's window procedure. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1299> - -2020-05-27 01:52:59 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - * sys/d3d11/gstd3d11window_corewindow.cpp: - * sys/d3d11/gstd3d11window_swapchainpanel.cpp: - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11window: Add unprepare method to clear internal resource - GObject::dispose method can be called multiple times. As win32 d3d11window - has an internal thread and because GObject::dispose method could be called from the - thread, it might cause problems such as trying to join self-thread - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1299> - -2020-05-25 21:18:16 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfcaptureengine.cpp: - * sys/mediafoundation/gstmfsourceobject.c: - * sys/mediafoundation/gstmfsourcereader.cpp: - mfsourceobject: Remove useless null check for string - We can pass null for the value of string type property. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1241> - -2020-05-25 20:59:50 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfcaptureengine.cpp: - * sys/mediafoundation/gstmfcapturewinrt.cpp: - * sys/mediafoundation/gstmfsourcereader.cpp: - * sys/mediafoundation/gstmftransform.cpp: - * sys/mediafoundation/gstmfutils.cpp: - * sys/mediafoundation/mediacapturewrapper.cpp: - mediafoundation: Use G_BEGIN_DECLS/G_END_DECLS pair everywhere - ... instead of extern "c" {} block. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1241> - -2020-05-20 23:23:08 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/AsyncOperations.h: - * sys/mediafoundation/gstmfcapturewinrt.cpp: - * sys/mediafoundation/gstmfcapturewinrt.h: - * sys/mediafoundation/gstmfdevice.c: - * sys/mediafoundation/gstmfsourceobject.c: - * sys/mediafoundation/gstmfvideosrc.c: - * sys/mediafoundation/mediacapturewrapper.cpp: - * sys/mediafoundation/mediacapturewrapper.h: - * sys/mediafoundation/meson.build: - * sys/mediafoundation/plugin.c: - mediafoundation: Add support video capture on UWP app - New video capture implementation using WinRT Media APIs for UWP app. - Due to the strict permission policy of UWP, device enumeration and - open should be done via new WinRT APIs and to get permission from users, - it will invoke permission dialog on UI. - Strictly saying, this implementation is not a part of MediaFoundation - but structurally it's very similar to MediaFoundation API. - So we can avoid some code duplication by adding this implementation - into MediaFoundation plugin. - This implementation requires UniversalApiContract version >= 6.0 - which is part of Windows 10 version 1803 (Redstone 4) - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1241> - -2020-05-20 23:56:38 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfsourceobject.c: - * sys/mediafoundation/gstmfsourceobject.h: - mfsourceobject: Move device name, path, and index to public struct - ... so that subclass can access each value and update them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1241> - -2020-05-20 22:59:19 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfcaptureengine.cpp: - * sys/mediafoundation/gstmfsourceobject.c: - * sys/mediafoundation/gstmfsourceobject.h: - * sys/mediafoundation/gstmfsourcereader.cpp: - mediafoundation: Fix typo in source object impl. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1241> - -2020-05-25 15:36:38 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Unset DISCONT flag if not discontinuous - And also set/unset the RESYNC flag accordingly. - It can happen that the flag is preserved by GstAdapter from the input - buffer. For example if a big input buffer is split into many small ones, - each of the small ones would have the flag set. - All other buffer flags seem safe to keep here if they were set, - including the GAP flag. - Also ensure that the buffer is actually writable before changing any - flags or metadata on it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1298> - -2020-05-25 19:22:50 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmftransform.cpp: - mftransform: Clear unused output IMediaSample - If MFT doesn't produce encoded output, need to free allocated - output sample and buffer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1297> - -2020-05-25 01:49:00 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Handle old streams claiming to be HDMV with Opus - GStreamer 1.16 and earlier produced streams with HDMV registration id - but with Opus audio streams on the stream ID that AC-4 now uses. Make - sure those still play back by special casing the check for AC-4 in HDMV - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1295 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1296> - -2020-05-24 06:22:07 +1000 Jan Schmidt <jan@centricular.com> - - * ext/srt/gstsrtobject.c: - srt: Don't leak the connection_poll_id on close() - Attempting to reach an inactive SRT peer in caller mode - was leaking an fd every few seconds in the gst_srt_object_close()/open() - loop. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1293> - -2020-05-24 19:12:28 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfvideoenc.cpp: - mfvideoenc: Fix huge memory leak - Subclass must unref passed GstVideoCodecFrame on GstVideoEncoder::handle_frame() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1294> - -2020-05-19 10:47:25 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/soundtouch/gstpitch.cc: - pitch: Remove useless restriction on number of channel - It handles any number of channels just fine - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1292> - -2020-05-23 02:33:24 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - h264decoder: Disallow multiple slice group as we don't support FMO - Even though it might be supported by accelerator, baseclass is not - ready to support it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1291> - -2020-05-23 00:57:23 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh264dec.c: - nvh264sldec: Fix wrong scaling list matrix scan order - Quatization matrix of NVDEC should be raster scan order but - h264parser stores it in zig-zag scan order. We need to convert - the matrix. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1290> - -2020-05-21 11:20:39 +0000 Andrey Sazonov <andrey.sazonov@intel.com> - - * gst/asfmux/gstasfmux.c: - asfmux: consistent sscanf args usage - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1286> - -2020-05-20 07:35:28 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codecs: h264: Add missing break - There was a missing break for the 4:4:4 case which would break the sizeimage - calculation. We don't currently have hardware that supports 4:4:4, so this - code wasn't tested. This was detected by Coverity. - CID 1463592 1463591 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1283> - -2020-05-21 14:28:38 +0000 Andrey Sazonov <andrey.sazonov@intel.com> - - * gst-libs/gst/audio/gstplanaraudioadapter.c: - planaraudioadapter: fix possible NULL ptr dereference - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1288> - -2020-05-21 11:24:51 +0000 Andrey Sazonov <andrey.sazonov@intel.com> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: fix klocwork issues - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1287> - -2020-05-19 14:58:35 +1000 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amc/videodec: only retrieve the stride/slice-height for raw output - When outputting to a surface, these values may not exist. - As found on a Google Pixel 3. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1284> - -2020-05-14 17:13:00 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/openjpeg/meson.build: - meson: add libopenjp2 fallback for openjpeg - As a wrap is now available in gst-build, the fallback - can be used. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1270> - -2020-05-13 15:02:41 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/meson.build: - avtp: Add libavtp fallback dependence - So that libavtp can be found if added as subproject on gst-build. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1271> - -2020-05-01 15:58:09 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfdevice.c: - * sys/mediafoundation/gstmfdevice.h: - * sys/mediafoundation/meson.build: - * sys/mediafoundation/plugin.c: - mediafoundation: Add device provider implementation - Only static device probing is supported for now - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1236> - -2020-05-01 15:12:43 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfsourceobject.c: - mfsourceobject: Store selected device path, name and index - Update path, name and index with selected device so that checked by - get_property() after constructed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1236> - -2020-05-20 10:54:21 +0200 Edward Hervey <edward@centricular.com> - - * gst/rtmp2/gstrtmp2src.c: - rtmp2src: Answer scheduling query - Just like for rtmpsrc, we must inform downstream that we are a - sequential (i.e. don't do random access efficiently) and - bandwith-limited (i.e. might need buffering downstream) element - Fixes buffering issues with playbin3 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1282> - -2020-05-06 12:27:56 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2slh264dec: Request large enough bitstream buffer - The Cedrus driver would otherwise choose 1KB buffer, which is too small. - This follows what some drivers do, which is simply to use the size a - packed raw image would have. Specifications do not really guaranty any minimum - compression ratio. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1268> - -2020-05-05 17:55:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2slh264dec: Add slice based decoder support - This adds support for slice based decoder like the Allwinner/Cedrus driver. In - order to keep things efficient, we hold the sink buffer until we reach the end - of the picture. Note that as we don't know which one is last, we lazy queue the - slices. This effectively introduces one slice latency. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1268> - -2020-04-30 15:17:05 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - v4l2codecdec: Fix error handling - If none of the format the HW produce is supported, the fiter will be NULL, - which would lead to assertion when trying to release it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1268> - -2020-04-30 14:18:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2format.c: - v4l2decoder: Add legacy non-multiplanar support - The Cedrus driver uses the lagacy buffer type (non-mplane). This automatically - detect and use the right v4l2_buf_type. This also affect code using - v4l2_buffer and v4l2_format structures. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1268> - -2020-05-05 17:50:22 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/linux/h264-ctrls.h: - * sys/v4l2codecs/linux/types-compat.h: - * sys/v4l2codecs/linux/v4l2-common.h: - * sys/v4l2codecs/linux/v4l2-controls.h: - * sys/v4l2codecs/linux/videodev2.h: - v4l2codecs: Update kernel headers - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1268> - -2020-05-16 21:52:59 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconvert.h: - d3d11convert: Fix fallback texture setup when resolution is not even number - When texture format is semi-planar, resolution should be even number, - and add missing P016 format handling - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1275> - -2020-05-16 21:45:02 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - d3d11convert: Fix fallback texture copy - Fix texture copy when input texture has non-zero subresource index - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1275> - -2020-05-16 20:45:23 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/plugin.c: - d3d11: Add support for video rescale and rename element to d3d11convert - GstD3D11ColorConverter implementation is able to rescale video as well. - By doing colorspace conversion and rescale at once, we can save - one cycle of shader pipeline which will can save GPU resource. - Since this element can support color space conversion and rescale, - it's renamed as d3d11convert - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1275> - -2020-05-16 20:12:33 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - d3d11: Move scoring util method for colorspace conversion to colorconvert element - It's used only by colorconvert element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1275> - -2020-05-16 11:14:58 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: chain finalize vmethod - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1238> - -2020-05-13 17:23:12 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: Only set relevant default weight values - This is minor optimization to avoid setting values we don't need. It also - makes debugging easier since only relevant values a non-zero now. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1238> - -2020-05-13 15:32:44 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: Fix default ref list size - The default in PPS was not applied properly. The default does not apply for - I-Slice and l1 default only applies for B-Slice. This fixes the slice values - for num_ref_idx_l0_active_minus1 and num_ref_idx_l1_active_minus1. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1238> - -2020-05-12 12:23:15 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264decoder: Use calculated values for max_pic_num/frame_num - The parser pre-calculate these already, just use them. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1238> - -2020-05-03 17:30:34 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/nvcodec/gstnvh264dec.c: - * sys/v4l2codecs/gstv4l2codech264dec.c: - codecs: h264decoder: ref pic lists as decode_slice parameters - Pass reference picture lists to decode_slice() vmethods - Change gstv4l2codech264dec and gstnvh264dec accordingly. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1238> - -2020-04-27 16:53:45 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - codecs: h264decoder: handle reference picture lists - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1238> - -2020-05-15 14:56:27 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264decoder: Port from GList to GArray - Using glist requires a lot of small allocation at runtime and also - it comes with a slow sort algorithm. As we play with that for very - frame and slices, use GArray instead. Note that we cache some arrays - in the instance as there is no support for stack allocated arrays - in GArray. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1238> - -2020-05-08 17:56:48 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264decoder: Make get_long_ref_by_pic_num() transfer none - We don't use the extra reference, so let's just avoid the extra - ref/unref. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1238> - -2020-05-06 12:23:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264decoder: Make get_short_ref_by_pic_num() transfer none - We don't use the extra reference, so let's just avoid the extra - ref/unref. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1238> - -2020-05-19 15:39:50 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * tests/check/meson.build: - tests: fix nalutils file name - The filename was too long causing issues with ccache - Fix https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/97 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1281> - -2020-05-18 14:19:04 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * tests/check/elements/mpegtsdemux.c: - * tests/check/meson.build: - mpegtsdemux: tests: Add simple tests for tsparse and tsdemux - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1274> - -2020-05-15 17:05:59 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtsparse.c: - mpegtsdemux: Close a buffer leak and simplify input_done - tsparse leaked input buffers quite badly: - GST_TRACERS=leaks GST_DEBUG=GST_TRACER:9 gst-launch-1.0 audiotestsrc num-buffers=3 ! avenc_aac ! mpegtsmux ! tsparse ! fakesink - The input_done vfunc was passed the input buffer, which it had to - consume. For this reason, the base class takes a reference on the buffer - if and only if input_done is not NULL. - Before 34af8ed66a7c63048ce0bdf59bbe61011d7c6292, input_done was used in - tsparse to pass on the input buffer on the "src" pad. That commit - changed the code to packetize for that pad as well and removed the use - of input_done. - Afterwards, 0d2e9085236ed94622c327f73489e558cc95d05f set input_done - again in order to handle automatic alignment of the output buffers to - the input buffers. However, it ignored the provided buffer and did not - even unref it, causing a leak. - Since no code makes use of the buffer provided with input_done, just - remove the argument in order to simplify things a bit. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1274> - -2020-05-17 10:27:03 +0200 Mats Lindestam <matslm@axis.com> - - * ext/curl/gstcurlhttpsink.c: - gstcurlhttpsink: Set 'Expect: 100-continue'-header - In the upgrade of libcurl from 7.64.1 to 7.69.1 the - EXPECT_100_THRESHOLD has been increased from 1 Kb to 1 Mb - (see https://curl.haxx.se/mail/lib-2020-01/0050.html). - This caused the gstcurlhttpsink to not being able to rewind - and resend in the case, e.g. response '401 Unauthorized'. - Now the 'Expect: 100-continue'-header is explicitly set in - the gstcurlhttpsink. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1276> - -2020-04-29 16:43:06 -0400 Arun Raghavan <arun@asymptotic.io> - - * sys/opensles/openslessink.c: - * sys/opensles/openslessrc.c: - opensles: Remove hard-coded buffer-/latency-time values - These were originally required in early Android versions, but are no - longer needed. - -2020-05-14 20:47:06 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfcaptureengine.cpp: - * sys/mediafoundation/gstmfsourceobject.c: - * sys/mediafoundation/gstmfsourceobject.h: - * sys/mediafoundation/gstmfsourcereader.cpp: - mediafoundation: Refactor GstMFSourceObject implementation - * Move CoInitializeEx/CoUninitialize pair into thread function in order to - ensure MTA COM thread - * Move common code to baseclass - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1269> - -2020-05-14 20:17:33 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfh264enc.cpp: - * sys/mediafoundation/gstmfh265enc.cpp: - * sys/mediafoundation/gstmftransform.cpp: - * sys/mediafoundation/gstmftransform.h: - * sys/mediafoundation/plugin.c: - mediafoundation: Remove COM thread constraints from GstMFTransform object - Move CoInitializeEx/CoUninitialize pair into our dedicated thread so that - we can ensure COM thread is MTA. This will remove thread constraints - around plugin init. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1269> - -2020-05-15 13:52:06 +1000 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: fix sync meta copying not taking a reference - Fixup for - 9b9e39be248389370e80b429da5a528418733483: amc: Fix crash when a sync_meta survives its sink - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/603 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1272> - -2020-04-13 18:09:55 +0900 J. Kim <jeongseok.kim@sk.com> - - * ext/srt/gstsrtobject.c: - srtobject: add streamid property - The stream id starts with '#!::' according to SRT Access Control1, - but GstURI requires URI encoded string.This commit introduces additional - property to set the id by normal string. - 1 https://github.com/Haivision/srt/blob/master/docs/AccessControl.md - -2020-05-12 05:00:36 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/modplug/meson.build: - * ext/openni2/meson.build: - * meson.build: - meson: Pass native: false to add_languages() - This is needed for cross-compiling without a build machine compiler - available. The option was added in 0.54, but we only need this in - Cerbero and it doesn't affect older versions so it should be ok. - Will only cause a spurious warning. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1266> - -2020-05-12 10:55:45 -0400 Alex Hoenig <alexander.hoenig@progeny.net> - - * gst/mpegtsmux/gstbasetsmux.c: - mpegtsmux: detect and ignore gap buffers - Fixes #1291. Without this, when a stream has gaps and then resumes, the next buffer PTS that is written to the TS is given the PTS of the first gap. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1263> - -2020-05-12 16:05:01 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: check fraction multiply for overflow - It should not happen and if it does, something went very wrong earlier - CID 1463350 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1262> - -2020-05-12 16:01:42 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: tighten up a couple of NULL checks - CID 1463347 - CID 1463346 - CID 1463345 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1262> - -2020-05-12 16:00:58 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: fix unintialized read of mapped output info in error case - We only need to gst_buffer_unmap() if we have gst_buffer_map()ed. In - most cases we can shorten the lenght of time we need to map the output - buffer. Fix similar occurences elsewhere. - CID 1463349 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1262> - -2020-05-12 15:24:32 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: fix uninitialized read in error case - CID 1463351 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1262> - -2020-05-10 17:38:11 +0800 Ting-Wei Lan <lantw@src.gnome.org> - - * sys/v4l2codecs/gstv4l2codecdevice.c: - * sys/v4l2codecs/linux/media.h: - * sys/v4l2codecs/linux/types-compat.h: - * sys/v4l2codecs/meson.build: - v4l2codecs: Fix compilation error on FreeBSD - This commit does the following things to fix compilation on FreeBSD: - 1. Add required typedefs to linux/types-compat.h. - 2. Remove unnecessary include linux/ioctl.h and replace linux/types.h - with linux/types-compat.h. Both files do not exist on FreeBSD. - 3. Check the header including makedev macro. FreeBSD does not have - sys/sysmacros.h, and including it unconditionally causes error. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1259> - -2020-05-11 17:14:09 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: implement discont handling - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1116> - -2020-05-07 23:59:30 +1000 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - * tests/check/elements/ccconverter.c: - ccconverter: use a better padding byte sequence for writing cdp - 0xf8 can be interpreted as cea608 data at the beginning of a cdp packet - as the cc_valid bit is not checked when cc_valid in (0b00 or 0b01). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1116> - -2020-03-19 17:42:13 +1100 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - * ext/closedcaption/gstccconverter.h: - * tests/check/elements/ccconverter.c: - ccconverter: split temporary storage into 3 - Instead of storing the raw cc_data, store the 2 cea608 fields individually - as well as the ccp data. - Simply copying the input cc_data to the output cc_data violates a number of - requirements in the cea708 specification. The most prominent being, that - cea608 triples must be placed at the beginning of each cdp. - We also need to comply with the framerate-dpendent limits for both the - cea608 and the ccp data which may involve splitting or merging some - cea608 data but not ccp data or vice versa. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1116> - -2020-03-17 17:23:44 +1100 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - * tests/check/elements/ccconverter.c: - ccconvert: compact input cc_data where possible - Skip over padding cc_data triples. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1116> - -2020-03-13 10:54:02 +1100 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - * ext/closedcaption/gstccconverter.h: - * tests/check/elements/ccconverter.c: - ccconverter: implement support for CDP framerate conversions - - Any format involving CDP is supported. - - Time codes (if present) are scaled as well. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1116> - -2020-03-12 16:08:54 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/ccconverter.c: - * tests/check/meson.build: - tests/ccconverter: test the time codes are successfully passed through - Where time codes are not stored in the caption data themselves - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1116> - -2020-03-12 15:06:46 +1100 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - * ext/closedcaption/gstccconverter.h: - ccconverter: introduce define for max cdp packet length - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1116> - -2020-03-12 15:01:02 +1100 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: don't rely on external state in *_internal() - This allows using the _internal() variants for simply converting some - caption data without relying on any external state. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1116> - -2020-03-12 14:06:49 +1100 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - * ext/closedcaption/gstccconverter.h: - * tests/check/elements/ccconverter.c: - ccconverter: cc_count limits are per framerate - Enforce this and add a test for cdp input being too large. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1116> - -2020-03-12 12:54:41 +1100 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: refactor cdp id, fps, max_cc_count into a table - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1116> - -2020-03-12 09:55:40 +1100 Matthew Waters <matthew@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: pivot to implementing generate_output - Will make a n-n buffer element much easier to implement. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1116> - -2020-05-09 19:59:46 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - - * gst-libs/gst/vulkan/gstvkerror.c: - vulkan: Drop use of VK_RESULT_BEGIN_RANGE - This was removed in Vulkan 1.2.140. - > Shortly after 2020-04-24, we will be removing the automatically - > generated `VK_*_BEGIN_RANGE`, `VK_*_END_RANGE`, and `VK_*_RANGE_SIZE` - > tokens from the Vulkan headers. These tokens are currently defined for - > some enumerated types, but are explicitly not part of the Vulkan API. - > They existed only to support some Vulkan implementation internals, - > which no longer require them. We will be accepting comments on this - > topic in #1230, but we strongly suggest any external projects using - > these tokens immediately migrate away from them. - #1230: https://github.com/KhronosGroup/Vulkan-Docs/issues/1230 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1255> - -2020-05-08 22:36:01 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - * gst/audiobuffersplit/gstaudiobuffersplit.h: - audiobuffersplit: Perform discont tracking on running time - Otherwise we would have to drain on every segment event. Like this we - can handle segment events that don't cause a discontinuity in running - time to be handled without draining. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1254> - -2020-05-08 21:36:44 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - * gst/audiobuffersplit/gstaudiobuffersplit.h: - audiobuffersplit: Keep incoming and outgoing segments separate - We might have to drain already queued input based on the old segment - before forwarding the new segment event. The new segment is only - forwarded after a discont as otherwise we might cause unnecessary - timestamp jumps as we output buffers timestamped based on sample counts. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1254> - -2020-04-30 16:01:13 +0000 Chris Ayoup <ayochris@amazon.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/gstwebrtcice.h: - webrtc: move filtering properties to webrtcice - We want webrtcbin to only expose properties that are defined in JSEP, so - these additional properties should be moved out. In order to access - them, the webrtcice instance is exposed from webrtcbin. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1223> - -2020-04-17 18:00:59 +0000 Chris Ayoup <ayochris@amazon.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/gstwebrtcice.h: - webrtc: allow setting local IP addresses - If a local IP address is specified, ICE gathering can be much faster - in environments where there are multiple IP addreses but only some are - usable (for example, if you are running docker on the machine). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1223> - -2020-04-16 22:37:35 +0000 Chris Ayoup <ayochris@amazon.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcice.c: - webrtc: Allow toggling TCP and UDP candidates - Add some properties to allow TCP and UDP candidates to be toggled. This - is useful in cases where someone is using this element in an environment - where it is known in advance whether a given transport will work or not - and will prevent wasting time generating and checking candidate pairs - that will not succeed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1223> - -2020-04-02 10:44:31 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: clear the parameters after closing the session - Otherwise the stale values are used for the new process. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1159> - -2020-05-10 11:23:02 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/spandsp/gstspanplc.c: - spanplc: Don't segfault when retrieving the stats property without a spanplc context - For example when trying to get the property value in NULL state. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1258> - -2020-05-10 11:16:44 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/onvif/gstrtponviftimestamp.c: - onviftimestamp: Add missing `break` in set_property() - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1257> - -2020-05-07 14:05:16 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/check/elements/h265parse.c: - test: h265parse: Test parsing buffer the ends with half a NAL header - This test cover the case where we are parsing, but our current buffers ends - with half the NAL header (which is 2 bytes in HEVC). Previously we would - throw an error message on the bus. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1251> - -2020-05-07 13:59:33 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parse: Ensure parsing ends on start-code + full header - The parser is used all over the place assuming that after calling - gst_h265_parser_identify_nalu(), the start-code found is can also be - identified. In H264 this works, because scan_for_start_code rely on - gst_byte_reader_masked_scan_uint32() that ensures that 1 byte passed the 3 - bytes start code is found. But for HEVC, we need two bytes to identify the - following NAL. - This patch will return NO_NAL_END, even if a start code is found in the case - there was not enough bytes. This solution was chosen to maintain backward - compatibility, and reduce complexicity. - Fixes #1287 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1251> - -2020-05-07 11:09:23 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/check/elements/h264parse.c: - * tests/check/elements/h265parse.c: - test: h264/h265: Add test for four bytes start code initial skip - This test detects if the parser have skipped too much and dropped meaninful - NALs. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1251> - -2020-05-07 12:02:40 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/check/elements/h264parse.c: - * tests/check/elements/h265parse.c: - * tests/check/elements/parser.c: - * tests/check/elements/parser.h: - test: h264/h265: Constify all test buffers - This ensure that no test modify other tests data. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1251> - -2020-05-07 11:06:45 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - h264/h265parse: Fix initial skip - Account for start codes possibly be 4 bytes. For HEVC, also take into - account that we might be missing only one of the two identification - bytes. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1251> - -2020-05-07 08:29:28 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Ensure correct timestamps - If the input has a miss-placed filler zero byte (e.g. a filler without a 4 - bytes start code on the next NAL), we would endup using the same timestamp - twice. Ask the base class to read the timestamp from the buffer were the NAL - actually starts. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1251> - -2020-05-07 07:43:30 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: Removed impossible error case - Same as done for H264, this error was trying to catch the case where we had - a start code without any bytes afterward. This will never happen since the - start code scanner only returns a match if there is one byte after start - code (pattern 0x00000100 / mask 0xffffff00). In H264, once byte is sufficient - to identify the NALU. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1251> - -2020-05-06 22:28:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst/videoparsers/gsth264parse.c: - * tests/check/elements/h264parse.c: - h264parse: Properly handle 4 bytes start code - This will stop stripping four bytes start code. This was fixed and broken - again as it was causing the a timestamp shift. We now call - gst_base_parse_set_ts_at_offset() with the offset of the first NAL to ensure - that fixing a moderatly broken input stream won't affect the timestamps. We - also fixes the unit test, removing a comment about the stripping behaviour not - being correct. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1251> - -2020-05-06 22:18:12 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: Fix NAL size check for identification - Unlike H264, H265 requires 2 bytes after the start code to allow NAL - identification. This would otherwise report a broken NAL and skip - important data. - Fixes #1287 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1251> - -2020-05-06 22:13:45 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: Removed impossible error case - This error was trying to catch the case where we had a start code without any - bytes afterward. This will never happen since the start code scanner only returns - a match if there is one byte adter start code (pattern 0x00000100 / mask - 0xffffff00). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1251> - -2020-04-29 16:19:08 +0800 Xu Guangxin <guangxin.xu@intel.com> - - * sys/msdk/gstmsdkbufferpool.c: - msdk: bufferpool: set alignment to video meta - else gst_video_meta_validate_alignment will report error like - "videometa gstvideometa.c:416:gst_video_meta_validate_alignment: Stride of plane 0 defined in meta (384) is different from the one computed from the alignment (320)" - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1224> - -2020-05-06 20:04:17 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Unref latency query after usage - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1249> - -2020-05-06 11:47:56 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/musepack/gstmusepackdec.c: - musepackdec: Don't fail all queries if no sample rate is known yet - The sample rate is only needed for the POSITION/DURATION queries and we - would otherwise fail important queries like the CAPS query. - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/498 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1248> - -2020-05-01 07:46:56 +0200 Luka Blaskovic <lblasc@znode.net> - - * ext/opencv/meson.build: - opencv: allow compilation against 4.3.x - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1235> - -2020-05-06 15:36:19 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/webrtcdatachannel.c: - * tests/check/elements/webrtcbin.c: - webrtc: fix an off-by-one calculating low-threshold - We were not signalling low-threshold when the previous amount was at - exactly the low-threshold mark. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1247> - -2020-05-06 15:35:26 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - webrtc: fix a slightly racy test - There is no guarantee that the peer data channel has transitioned to - open when we do. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1247> - -2020-05-06 15:49:05 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: remove debugging leftover - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1247> - -2020-05-06 00:30:34 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/sctptransport.c: - * ext/webrtc/utils.h: - * ext/webrtc/webrtcdatachannel.c: - webrtc: always reply to a promise - Otherwise, we defeat the purpose of a promise. - We were not replying when the state was closed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1240> - -2020-05-06 00:25:45 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/gstwebrtcice.h: - webrtc: name threads based on the element name - Makes debugging a busy loop possibly easier - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1240> - -2020-05-05 17:15:51 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: fix a data channel leak in a test - test_data_channel_create_after_negotiate overrides the data_channel_data - without ever freeing it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1240> - -2020-05-05 17:14:46 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: correctly use the pad template - GstHarness uses this for releasing request pads correctly. Fixes - numerous leaks in the webrtc unit tests. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1240> - -2020-05-05 14:35:10 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: Fix a couple of renegotiation races - When negotiating the SDP we should only connect the streams that are - actually mentioned in the SDP. All other streams are not relevant at - this time and would likely be part of a future SDP update. Fixes a - couple of the renegotiation webrtc unit tests. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1240> - -2020-05-05 14:33:34 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: move bus thread creation earlier - Fixes a small deadlock race where the bus watch GSource could execute before - the unlock mutex GSource. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1240> - -2020-05-04 14:39:45 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/meson.build: - tests: add libnice to the plugin loading whitelist - Allows webrtcbin to actually unit test some negotiation scenarios. - Without this, only two of the possible 33 tests are being executed. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1240> - -2020-05-05 12:01:21 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - v4l2slvp8dec: Flip the meaning of segment_feature_mode - In section 9.3.4 a), segment_feature_mode have 0 for absolute and 1 for delta, - while in 19.2, it says the opposite. But the reference code, which usually - rules over the text state that 1 means absolute: - if (hdr->update_data) - { - hdr->abs = bool_get_bit(bool); - And uses it with that meaning to decide weither to override the existing value - or just add the detla. This fixes multiple decoding issues. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1245> - -2020-05-04 15:33:39 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - v4l2slvp8dec: Copy header version - This field was not copied. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1245> - -2020-05-04 14:54:23 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - v4l2slvp8dec: Add debugging for reference frames - This simply trace the frame number of the references used for decoding. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1245> - -2020-05-04 14:52:45 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - v4l2slvp8dec: Ensure width/height is always set - Our parser strictly read the bitstream. As it's known from DXVA that always - having a valid width/height might be needed, use the cached width/height - instead of the value from the parser. This didn't impact Hantro driver. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1245> - -2020-05-04 14:52:02 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - v4l2slvp8dec: Fix debug category name - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1245> - -2020-05-05 17:40:51 +0200 Edward Hervey <edward@centricular.com> - - * ext/iqa/iqa.c: - iqa: Fix all leaks in error path - CID #1456049 - CID #1456080 - CID #1456083 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1244> - -2020-03-29 00:45:47 +0800 He Junyan <junyan.he@hotmail.com> - - * tests/check/libs/h265parser.c: - test: h265parser: Add a test case for SCC extension. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1146> - -2020-03-28 14:46:13 +0800 He Junyan <junyan.he@hotmail.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - * tests/check/libs/h265parser.c: - libs: parser: h265: Add SCC extension support. - Add support for screen content coding extensions profiles. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1146> - -2020-05-06 01:25:04 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11vp8dec.c: - d3d11vp8dec: Remove useless assign operation - It's already been done in the line just above. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1246> - -2020-05-05 16:07:40 +0200 Edward Hervey <edward@centricular.com> - - * tests/check/elements/dash_mpd.c: - check: Fix dash mpd unit test - Unexpected critical/warning: g_object_set_is_valid_property: object class 'GstMPDBaseURLNode' has no property named 'service location' - Stack trace: - gst_debug_get_stack_trace (gstinfo.c:3021) - gst_check_log_critical_func (gstcheck.c:281) - g_logv (gmessages.c:1350) - g_log (gmessages.c:1415) - g_object_set_valist (gobject.c:2327) - gst_mpd_client_add_baseurl_node (gstmpdclient.c:3142) - dash_mpdparser_check_mpd_client_set_methods (dash_mpd.c:6192) - srunner_run_tagged (check_run.c:465) - gst_check_run_suite (gstcheck.c:1086) - main (dash_mpd.c:6521) - __libc_start_main (libc-start.c:308) - _start (/home/bilboed/work/devel/gst-build/build/subprojects/gst-plugins-bad/tests/check/elements_dash_mpd:0x40554a) - -2020-05-05 20:32:53 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Fix processor output view resource leak - Because this object holds reference to native d3d11 device handle internally, - related native d3d11 objects would be leaked as well. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1243> - -2020-05-01 14:19:56 +1000 Matthew Waters <matthew@centricular.com> - - * ext/sctp/sctpassociation.c: - sctp: enable usrsctp debug when supported - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1234> - -2020-05-03 10:05:32 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/curlhttpsrc.c: - tests: curlhttpsrc: fix compiler warning on raspbian - tests/check/elements/curlhttpsrc.c:142:14: warning: format ‘%lu’ - expects argument of type ‘long unsigned int’, but argument 8 has - type ‘gsize’ {aka ‘unsigned int’} - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1239> - -2020-05-03 09:59:45 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/nvcodec/gstnvh264dec.c: - nvcodec: fix compiler warning in certain setups - Fixes gstnvh264dec.c:648:12: warning: unused variable ‘ret’ - compiler warning on raspbian where HAVE_NVCODEC_GST_GL is - not defined. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1239> - -2020-04-03 10:41:44 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpsink.c: - avtpsink: Log that AVTPDU transmission failure is due lateness - As ENOBUFS is not really clear about what is going on, let's check - socket error queue to see if packets are being dropped due being late. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1004> - -2020-04-03 10:41:31 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpsink.c: - avtpsink: Accept buffers that fall out of segment - Proper calculate running time for buffers that are out of current - segment and try to honor them. - A typical case is for AVTP packets coming from avtpcvfpay element, as - those may have DTS that falls out of segment (which is about PTS). - By using gst_segment_to_running_time_full(), avtpsink can properly - calculate when to transmit those buffers. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1004> - -2020-04-03 10:41:04 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpcvfpay.c: - avtpcvfpay: Warn about timestamp issues on non-flushing seek - Seek events will cause new segments to be sent to avtpcvfpay, and for - flushing seeks, a pipeline running time reset. This running time - reset, which effectively changes pipeline base time, will cause - avtpcvfpay element to generate incorrect DTS for the initial set of - buffers sent after FLUSH_STOP. - This happens due the fact that base time change happens only when the - sink gets the first buffer after the FLUSH_STOP - so avtpcvfpay used - the wrong base time to do its calculations. - However, if the pipeline is paused before the seek, sink will update - base time when pipeline state goes to PLAYING again, before avtpcvfpay - gets the first buffers after the flush. Then avtpcvfpay element will be - able to normally calculate DTS for the outgoing packets. - This patch simply adds a warning message in case a flushing seek is - performed on a playing pipeline. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1004> - -2020-04-03 10:40:43 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpcvfpay.c: - * ext/avtp/gstavtpcvfpay.h: - * tests/check/elements/avtpcvfpay.c: - avtpcvfpay: Ensure NAL fragments are transmitted following stream specs - TSN streams are expected to send packets to the network in a well - defined "pace", which is arbitrarily defined for each stream. This pace - is defined by the "measurement interval" property of a stream. - When the AVTP CVF payloader element - avtpcvfpay - fragments a video - frame that is too big to be sent to the network, it currently defines - that all fragments should be transmitted at the same time (via DTS - property of GstBuffers generated, as sink will use those to time the - transmission of the AVTPDU). This doesn't comply with stream definition, - which also has a limit on how many packets can be sent on a given - measurement interval. - This patch solves that by spreading in time the DTS of the GstBuffers - containing the AVTPDUs. Two new properties, "measurement-interval" and - "max-interval-frames", added to avptcvfpay element so that it knows - stream measurement interval and how many AVTPDUs it can send on any of - them. More details on the method used to proper spread DTS/PTS according - to measurement interval can be found in a code commentary inside this patch. - Tests also added for the new property and behaviour. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1004> - -2020-02-24 22:38:39 +0800 Georg Ottinger <g.ottinger@gmx.at> - - * gst-libs/gst/codecparsers/gstav1parser.c: - * gst-libs/gst/codecparsers/gstav1parser.h: - * gst-libs/gst/codecparsers/meson.build: - * tests/check/libs/av1parser.c: - * tests/check/meson.build: - libs: parser: Adds AV1 parser. - This is the first version of AV1 parser implementation in GStreamer. - A test file is also provied with several test cases. It contains a - test sequence taken from the aom testdata set, with one key and one - inter-frame. The same test sequence has been reencoded to annexb. - testdata is taken from aom testdata (and reencoded for annexb) as well - as handcrafted testcases. Once reference testdata is available, the - testing could be imporved aswell. - Co-author: He Junyan <junyan.he@hotmail.com> - Co-author: Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/785> - -2020-05-01 14:43:55 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/autoconvert/gstautoconvert.h: - autoconvert: fix compiler warnings with g_atomic on recent GLib versions - The volatile is not needed here and causes compiler warnings - with newer GLib versions. - gstautoconvert.c: In function ‘gst_auto_convert_dispose’ (and elsewhere): - glib/gatomic.h:108:3: warning: initialization discards ‘volatile’ qualifier from pointer target type -Wdiscarded-qualifiers - gstautoconvert.c:224:24: note: in expansion of macro ‘g_atomic_pointer_get’ - 224 | GList *factories = g_atomic_pointer_get (&autoconvert->factories); - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1237> - -2020-05-01 01:17:08 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: also mark data channel transports as active - Fixes negotiation of a bundled sdp with only a data channel. - Without marking the transport as active, we would never unblock the - transportreceivebin and thus no data would ever reach us. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1231> - -2020-05-01 00:47:53 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/webrtcsdp.c: - * ext/webrtc/webrtcsdp.h: - webrtcbin: fix bundle none case with remote offer bundling - If the remote is bundling, but we are not and remote is offering. - we cannot put the remote media sections into a bundled transport as that - is not how we are going to respond. - This specific failure case was that the remote ICE credentials were - never set on the ice stream and so ice connectivity would fail. - Technically, this whole bunde-policy=none handling should be removed - eventually when we implement bundle-policy=balanced. Until such time, - we have this workaround. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1231> - -2019-09-26 18:12:36 -0700 Vedang Patel <vedang.patel@intel.com> - - * tests/check/elements/avtpcrfutil.c: - * tests/check/meson.build: - tests: add tests for functions in gstavtpcrfutil.c - This adds tests for the helper functions in ext/avtp/gstavtpcrfutils.c - -2019-09-26 18:11:42 -0700 Vedang Patel <vedang.patel@intel.com> - - * tests/check/elements/avtpcrfcheck.c: - * tests/check/meson.build: - tests: Add the tests for CRF Checker element - This adds tests to ensure the avtpcrfchecker element validates and drops the - packets which do not match the CRF Synchronization criteria. - -2019-10-14 13:56:49 -0700 Vedang Patel <vedang.patel@intel.com> - - * tests/check/elements/avtpcrfbase.c: - * tests/check/meson.build: - tests: Add tests for GstAvtpCrfBase base class. - This adds tests which test the functions which do not call any external - syscalls and the properties. - -2019-10-14 13:56:36 -0700 Vedang Patel <vedang.patel@intel.com> - - * tests/check/elements/avtpcrfsync.c: - * tests/check/meson.build: - tests: Add tests for CRF Synchronizer element - This adds tests to validate whether the avtpcrfsync element applies the - adjustment correctly. - Also, the infrastructure to include additional source files while compiling - is added. This change is exactly the same as the one in gst-plugins-good. - -2019-10-14 13:55:57 -0700 Vedang Patel <vedang.patel@intel.com> - - * ext/avtp/gstavtp.c: - * ext/avtp/gstavtpcrfcheck.c: - * ext/avtp/gstavtpcrfcheck.h: - * ext/avtp/meson.build: - avtp: Introduce the CRF Check element - This commit introduces the AVTP Clock Reference Format (CRF) Checker - element. This element re-uses the GstAvtpCrfBase class introduced along - with the CRF Synchronizer element. - This element will typically be used along with the avtpsrc element to - ensure that the AVTP timestamp (and H264 timestamp in case of CVF-H264 - packets) is "aligned" with the incoming CRF stream. Here, "aligned" means - that the timestamp value should be within 25% of the period of the media - clock recovered from the CRF stream. - The user can also set an option (drop-invalid) in order to drop any packet - whose timestamp is not within the thresholds of the incoming CRF stream. - -2020-02-05 16:17:39 -0800 Vedang Patel <vedang.patel@intel.com> - - * ext/avtp/gstavtp.c: - * ext/avtp/gstavtpcrfbase.c: - * ext/avtp/gstavtpcrfbase.h: - * ext/avtp/gstavtpcrfsync.c: - * ext/avtp/gstavtpcrfsync.h: - * ext/avtp/gstavtpcrfutil.c: - * ext/avtp/gstavtpcrfutil.h: - * ext/avtp/meson.build: - avtp: Introduce the CRF Sync Element - This commit introduces the AVTP Clock Reference Format (CRF) Synchronizer - element. This element implements the AVTP CRF Listener as described in IEEE - 1722-2016 Section 10. - CRF is useful in synchronizing events within different systems by - distributing a common clock. This is useful in a scenario where there are - multiple talkers who are sending data to a single listener which is - processing that data. E.g. CCTV cameras on a network sending AVTP video - streams to a base station to display on the same screen. - It is assumed that all the systems are already time-synchronized with each - other. So, the AVTP Talker essentially adjusts the AVTP Presentation Time - so it's phase-locked with the reference clock provided by the CRF stream. - There are 2 different roles of systems which participate in CRF data - exchange. A system can either be a CRF Talker, which samples it's own - clock and generates a stream of timestamps to transmit over the network, or - a CRF Listener, the system which receives the generated timestamps and - recovers the media clock from the timestamps. It then adjusts it's own - clock to align with recovered media clock. The timestamps generated by the - talker may not be continuous and the listener might have to interpolate - some timestamps to recover the media clock. The number of timestamps to - interpolate is mentioned in the CRF stream AVTPDU (Refer IEEE 1722-2016 - Section 10.4 for AVTPDU structure). Only CRF Listener has been implemented - in this commit. - The CRF Sync element will create a separate thread to listen for the CRF - stream. This thread will calculate and store the average period of the - recovered media clock. The pipeline thread will use this stored period - along with the first timestamp of the latest CRF AVTPDU received to - calculate adjustment for timestamps in the audio/video streams. In case of - CRF AVTPDUs with single timestamp, two consecutive CRF AVTPDUs will be used - to figure out the average period of the recovered media clock. - In case of H264 streams, both AVTP timestamp and H264 timestamp will be - adjusted. - In the future commits, another "CRF Checker" element will be introduced - which will validate the timestamps on the AVTP Listener side. Which is why - a lot of code has been implemented as part of the gstcrfbase class. - -2019-12-13 11:28:08 -0800 Ederson de Souza <ederson.desouza@intel.com> - - * gst/debugutils/gstclockselect.c: - * gst/debugutils/gstclockselect.h: - * tests/check/elements/clockselect.c: - clockselect: Add TAI clock support - Via new value for property clock-id, "tai", it's possible to use - GST_CLOCK_TYPE_TAI as pipeline clock. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1009> - -2020-01-27 15:16:12 -0800 Ederson de Souza <ederson.desouza@intel.com> - - * tests/check/elements/clockselect.c: - clockselect: Remove non-sense comment - Commentary appears to assume `gst_harness_find_element` return value was - "transfer none", but it is not the case. So, element must be unrefed - before the end. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1009> - -2020-01-23 15:57:34 +0000 krivoguzovVlad <u.kryvahuzau@setplex.com> - - * ext/srt/gstsrtobject.c: - Update gstsrtobject.c - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/999> - -2019-07-30 17:09:55 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristrtpdeext.c: - * tests/check/elements/ristrtpext.c: - ristrtpdeext: Expose the largest sequence number received - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2020-03-18 17:34:47 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristrtpdeext.c: - * tests/check/elements/ristrtpext.c: - ristrtpdeext: Update RTP header extension packet to latest spec - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2020-03-18 17:14:14 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristrtpext.c: - * tests/check/elements/ristrtpext.c: - ristrtpext: Update RTP header extension packet to latest spec - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2019-07-31 12:01:07 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristsink.c: - * gst/rist/gstristsrc.c: - rist: Document main profile support - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2019-07-29 17:53:21 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristsrc.c: - ristsrc: Add ristrtpdeext to the pipeline - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2019-07-29 13:58:37 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristsink.c: - ristsink: Add ristrtpext to sink - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2019-07-26 17:57:40 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristsink.c: - ristsink: Receive RIST seqnum ext and feed it to rtxsend - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2019-07-26 17:43:57 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristsink.c: - ristsink: Pass the session id to the on-app-rtcp callback - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2019-07-26 17:14:14 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstrist.h: - * gst/rist/gstristrtxsend.c: - ristrtxsend: Use externally given seqnum extension when available - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2019-07-26 16:50:21 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristrtxsend.c: - ristrtxsend: Store sent packets with extended seqnum - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2019-07-26 16:49:51 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstrist.h: - * gst/rist/gstristplugin.c: - * gst/rist/gstristrtpext.c: - rist: Factor our seqnum extension code - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2019-07-24 17:32:07 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/ristrtpext.c: - * tests/check/meson.build: - rist: Add test for rtp ext code - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2019-07-23 17:27:06 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristrtpdeext.c: - rist: Drop packets that are more than G_MAXINT16 seqnum late - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2019-07-23 17:26:16 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristrtpext.c: - rist: Insert RTP seqnum extension header - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2019-07-12 11:43:26 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstrist.h: - * gst/rist/gstristplugin.c: - * gst/rist/gstristrtpdeext.c: - * gst/rist/gstristrtpext.c: - * gst/rist/meson.build: - rist: Add element to remove the header extension - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2019-07-11 18:53:00 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstrist.h: - * gst/rist/gstristplugin.c: - * gst/rist/gstristrtpext.c: - * gst/rist/meson.build: - rist: Add element that inserts the RTP header extension - Currently can suppress the TS null packets, but can't insert - the seqnum extension yet. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1153> - -2020-05-01 01:51:10 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - h264decoder: Allow frame gap even if it's not allowed by SPS - It's most likely the case where some frames were dropped for some reason - (e.g., broken stream, network loss or so). However, decoder might be able to - decode following frames even if some frames are visually broken. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1232> - -2020-04-29 22:01:32 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: only start gathering on local descriptions - If we are in a state where we are answering, we would start gathering - when the offer is set which is incorrect for at least two reasons. - 1. Sending ICE candidates before sending an answer is a hard error in - all of the major browsers and will fail the negotiation. - 2. If libnice ever adds the username fragment to the candidate for - ice-restart hardening, the ice username and fragment would be - incorrect. - JSEP also hints that the right call flow is to only start gathering when - a local description is set in 4.1.9 setLocalDescription - "This API indirectly controls the candidate gathering process." - as well as hints throughout other sections. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1226> - -2020-04-29 19:42:05 +0900 Seungha Yang <seungha@centricular.com> - - * ext/webrtc/webrtcdatachannel.h: - webrtc: Correct symbol visibility to fix build warning on Windows - GstWebRTCDataChannel is fully internal of plugin - webrtcdatachannel.c(50): warning C4273: 'gst_webrtc_data_channel_get_type': inconsistent dll linkage - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1225> - -2020-04-29 15:12:36 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - * ext/lv2/gstlv2filter.c: - * ext/lv2/gstlv2utils.c: - lv2: Namespace global variables and explicitly make them private - And fix a LV2_PORT_GROUPS__rearLeft/LV2_PORT_GROUPS__rearRight typo - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1125> - -2020-03-20 15:49:06 +0100 Debarshi Ray <rishi@gnu.org> - - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - lv2: Make it build with -fno-common - GCC 10 defaults to -fno-common. This means that global variables shared - across multiple translation units should be declared as 'extern' in - header files and defined in exactly one C file. See: - https://gcc.gnu.org/gcc-10/porting_to.html - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1125 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1125> - -2020-04-30 02:41:07 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11h264dec.c: - d3d11h264dec: Rearrange the order of supported profiles in caps - constrained-baseline profile is much preferred than baseline. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1229> - -2020-04-30 02:25:35 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh264dec.c: - nvh264sldec: Allow constrained-baseline and baseline profiles - Like d3d11h264dec, we need to relax the condition for profiles of nvh264sldec - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1228> - -2020-04-23 23:25:21 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11h264dec.c: - d3d11h264dec: Add constrained-baseline and baseline profile - Both profiles are expected to be supported profile by DXVA hardware - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1212> - -2020-04-27 20:26:54 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - * sys/v4l2codecs/meson.build: - v4l2codecs: Factor out plugin registration - This introduce a common place for generic functions and factor out the plugin - registration code. This code is nearly identical between implementation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1216> - -2020-04-27 20:18:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2decoder: Relax width/height return value check - The driver adjust the width/height to coded size. This was not an issue for - H264, as the coded size is in the bitstream, but is an issue with VP8. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1216> - -2020-04-24 16:15:25 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecvp8dec.c: - * sys/v4l2codecs/gstv4l2codecvp8dec.h: - * sys/v4l2codecs/linux/vp8-ctrls.h: - * sys/v4l2codecs/meson.build: - * sys/v4l2codecs/plugin.c: - v4l2codecs: Add VP8 decoder - This is derived from the H264 decoder, some boiler plate will be factored out - in the following commits. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1216> - -2020-04-28 14:55:00 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/mediafoundation/gstmfutils.cpp: - * sys/mediafoundation/gstmfutils.h: - mfvideosrc: add GRAY16_LE format support - FOURCC "Y16 " is used by FLIR Boson USB Video Class (UVC) camera - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1222> - -2020-04-26 22:37:12 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11device.c: - d3d11device: Add fallback for device creation - D3D11_CREATE_DEVICE_DEBUG flag will be used while creating d3d11 device - to activate debug layer. However, if system doesn't support the - debug layer for some reason, we should try to create d3d11 device - without the flag. Debug layer should be optional for device creation. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1217> - -2020-04-28 19:58:53 +0900 Seungha Yang <seungha@centricular.com> - - * tests/check/elements/mfvideosrc.c: - * tests/check/meson.build: - tests: mfvideosrc: Add unit test - Simple test for reuse scenario - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/760> - -2020-04-21 20:49:38 +0900 Seungha Yang <seungha@centricular.com> - - * sys/mediafoundation/gstmfh264enc.cpp: - * sys/mediafoundation/gstmfh265enc.cpp: - mediafoundation: Disable querying supprted maximum resolution - Initializing MFT for checking supported maximum resolution is too - slow. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/760> - -2020-01-07 17:12:17 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/mediafoundation/gstmfh265enc.cpp: - * sys/mediafoundation/gstmfh265enc.h: - * sys/mediafoundation/meson.build: - * sys/mediafoundation/plugin.c: - mediafoundation: Add h265 encoder - Add Media Foundation HEVC encoder - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/760> - -2020-01-07 17:45:22 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/mediafoundation/gstmfh264enc.cpp: - * sys/mediafoundation/gstmfh264enc.h: - * sys/mediafoundation/gstmftransform.cpp: - * sys/mediafoundation/gstmftransform.h: - * sys/mediafoundation/gstmfvideoenc.cpp: - * sys/mediafoundation/gstmfvideoenc.h: - * sys/mediafoundation/gststrmif.h: - * sys/mediafoundation/meson.build: - * sys/mediafoundation/plugin.c: - mediafoundation: Add h264 encoder - Add Media Foundation h264 encoder. If hardware encoders are available - on system, they will have higher rank than software encoder. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/760> - -2019-10-07 21:49:26 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * meson_options.txt: - * sys/mediafoundation/gstmfcaptureengine.cpp: - * sys/mediafoundation/gstmfcaptureengine.h: - * sys/mediafoundation/gstmfsourceobject.c: - * sys/mediafoundation/gstmfsourceobject.h: - * sys/mediafoundation/gstmfsourcereader.cpp: - * sys/mediafoundation/gstmfsourcereader.h: - * sys/mediafoundation/gstmfutils.cpp: - * sys/mediafoundation/gstmfutils.h: - * sys/mediafoundation/gstmfvideosrc.c: - * sys/mediafoundation/gstmfvideosrc.h: - * sys/mediafoundation/meson.build: - * sys/mediafoundation/plugin.c: - * sys/meson.build: - mediafoundation: Introduce Microsoft Media Foundation plugin - The Microsoft Media Foundation (MF) is the successor of DirectShow. - This commit includes two kinds of video capture implementation, - one uses IMFSourceReader interface which is available since Windows Vista - and the other is based on IMFCaptureEngine interface which is available - since Windows 8. - Note that this new video source element cannot be used in UWP app - for now, since device activation using those APIs are not allowed by MS. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/760> - -2020-04-12 23:52:28 +0800 He Junyan <junyan.he@hotmail.com> - - * tests/check/libs/h265parser.c: - test: h265parser: Add check for high throughput scc. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1121> - -2020-04-12 23:39:07 +0800 He Junyan <junyan.he@hotmail.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - libs: h265parser: Add High throughput scc extensions profiles' IDC. - It is compitable with scc and we use scc's function to identify it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1121> - -2020-04-12 22:21:01 +0800 He Junyan <junyan.he@hotmail.com> - - * tests/check/libs/h265parser.c: - test: h265parser: Add more check or h265 extensions. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1121> - -2020-04-11 16:39:03 +0800 He Junyan <junyan.he@hotmail.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - libs: h265parser: select extension profile by profile idc. - the old manner does not consider the profile idc. The profile idc should - play an more important role in recognizing the profile than the other - information. And there is no need to mix profiles of different extensions - together to find the closest profile when the bits stream is not standard, - different extensions support different features and should not be mixed. - The correct way should be recognize the extension category by profile idc - firstly, and then find the closest profile. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1121> - -2020-03-19 23:50:39 +0800 He Junyan <junyan.he@hotmail.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - libs: h265parser: rename the FormatRangeExtensionProfile - FormatRangeExtensionProfile declares the common bits used for not - only format range extensions profiles, but also for several different - h265 extension profiles, such as high throughput, screen content - coding extensions, etc. And So the old name is not proper. - We also rename the get_h265_extension_profile function. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1121> - -2020-03-20 16:41:16 +0800 He Junyan <junyan.he@hotmail.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - libs: h265parser: Fix a bug for getting extension profile. - We should use the traget ExtensionProfile's IDC to check the - profile_compatibility_flag, rather than the profile_idc in the - stream. The old profile_compatibility_flag check always return - true. This causes that profiles with same constraint flags but - different profile_idc can't be recognized correctly. For example, - the screen-extended-main-444 profile is always be recognized as - the high-throughput-444 profile. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1121> - -2020-04-24 20:56:17 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - h264decoder: Perform low-latency outputting only for live pipeline - Frequent outputting might drop throughput-wise performance. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1211> - -2020-04-23 19:47:09 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - h264decoder: Output decoded pictures as soon as possible - In case of IDR, any previously decoded pictures must be drained - before the IDR and POC of IDR should be zero. So we can output - IDR immediately. Also, when POC of current picture is expected to be - the next output POC, decoder can output the picture as well - without waiting. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1211> - -2020-04-27 17:02:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/d3d11/gstd3d11vp8dec.c: - d3d11vp8dec: Remove unused parameters - Minor cleanup removing unused picture parameters in two internal functions. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1221> - -2020-04-28 00:29:52 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/codecparsers/gsth265parser.h: - gsth265parser.h: escape link-like syntax in doc - -2020-04-27 11:43:57 +0300 Seppo Yli-Olli <seppo.yli-olli@iki.fi> - - * ext/openh264/gstopenh264plugin.c: - openh264: memcmp return value 0 means match Commit e2aa76db79328b7f61536dd19d0373cf920395ad introduced version check guard for OpenH264 binary. There was a boolean error in memcmp so matching OpenH264 was erroneously rejected. Fixes #1278 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1219> - -2020-04-26 13:47:27 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth265picture.c: - * gst-libs/gst/codecs/gstvp9picture.c: - codecs: fix gir generation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1218> - -2020-04-22 14:57:12 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh264dec.c: - * sys/nvcodec/gstnvh264dec.h: - * sys/nvcodec/plugin.c: - nvcodec: Add suppport for environment based primary h264 decoder implementation - Introduce GST_USE_NV_STATELESS_CODEC environment to allow user to select - primary nvidia decoder implementation. In case the environment - GST_USE_NV_STATELESS_CODEC=h264 was set, old nvidia h264 decoder element - will not be registered. Instead, both nvh264dec and nvh264sldec - factory name will create gstcodecs based new nvidia h264 decoder element. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1198> - -2020-04-16 23:27:31 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - * sys/nvcodec/gstnvdecoder.c: - * sys/nvcodec/gstnvdecoder.h: - * sys/nvcodec/gstnvh264dec.c: - * sys/nvcodec/gstnvh264dec.h: - * sys/nvcodec/meson.build: - * sys/nvcodec/plugin.c: - nvcodec: Add H264 stateless codec implementation - Introduce GstH264Decoder based Nvidia H.264 decoder element. - Similar the element factory name of to v4l2 stateless codec, - this element can be configured with factory name "gstnvh264sldec". - Note that "sl" in the name stands for "stateless" - For now, existing nvh264dec covers more profile and formats - (e.g., interlaced stream) than this implementation. - However, this implementation allows us to control lower level - parameters such as decoded picture buffer management and therefore - we can get a chance to improve performance in terms of latency. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1198> - -2020-04-22 16:53:00 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - * ext/closedcaption/gstcccombiner.h: - cccombiner: don't drop buffers on video timestamp discontinuities - If we receive video buffers with non-perfect timestamps, the - caption buffers' timestamps might fall in the interval between - the end of one video buffer and the start of the next one. - Make our criteria for dropping that the caption buffer has - a timestamp older than the end of the previous video buffer, - not older than the start of the new one, unless of course - this is the first video buffer. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1207> - -2020-04-22 16:51:08 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - cccombiner: handle gap buffers adequately - - Don't try to map them as actual CC data, that was raising - a critical - - Consume video buffers up to the end of the gap - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1207> - -2020-04-24 01:56:57 +0900 Seungha Yang <seungha@centricular.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Support avc and avc3 formats - h264decoder baseclass provides parsed sps/pps (from codec data) for - subclass. Also, since current implementation is putting start code prefix - manually, the format of stream should not be matter for subclass. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1214> - -2020-04-23 12:28:41 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * ext/spandsp/gstspanplc.c: - * ext/spandsp/gstspanplc.h: - spanplc: add 'stats' property - Allow users to retrieve the number of samples, and their duration, - generated using PLC. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1210> - -2020-04-21 13:33:54 +0300 Seppo Yli-Olli <seppo.yli-olli@iki.fi> - - * ext/openh264/gstopenh264plugin.c: - Have strict version check for OpenH264 to avoid ABI issues This fixes #1274 and no longer trusts soname alone - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1206> - -2020-04-23 23:52:24 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp8dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Fix wrong return type from output_picture vfunc - Return type should be GstFlowReturn, not gboolean - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1213> - -2020-04-23 12:00:15 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth265decoder.c: - codecs: set sys frame num before new_picture() - Derive classes might need to operate on the current frame at their - new_picture() vmethod, so it would be needed to set system_frame_number - on picture before calling the vmethod. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1209> - -2020-04-22 17:53:39 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - h264/h265parse: Fix handling of very last frame - Baseparse will never call us back on draining, so going into more: label will - cause the current frame to be discarded. So if we have a complete NAL, but not - a complete AU, make sure to terminate the frame properly. - This is a gression introduce by commit e88d8480709581a2e54b7954c47193b729b23c79 and - a194a87b2600a21f1b47b8c89b1c930d5f30de42. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1275 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1208> - -2020-02-28 18:14:51 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11vp8dec.c: - * sys/d3d11/gstd3d11vp8dec.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11decoder: Add VP8 decoder element - New d3d11 VP8 decoder implementation - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1079> - -2020-04-23 01:02:58 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth265picture.c: - * gst-libs/gst/codecs/gstvp9picture.c: - codecs: Fix some documentation - Add missing "transfer full" annotation, etc - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1079> - -2020-03-29 22:23:23 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp8decoder.c: - * gst-libs/gst/codecs/gstvp8decoder.h: - * gst-libs/gst/codecs/gstvp8picture.c: - * gst-libs/gst/codecs/gstvp8picture.h: - * gst-libs/gst/codecs/meson.build: - codecs: Add new baseclass for VP8 decoder - This implemenation is similar to VP9 but much simpler than it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1079> - -2020-03-29 23:31:13 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Add helper methods for negotiation and decide_allocation - The implementation for all codecs is almost the same. - No need to duplicate code. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1079> - -2020-03-29 22:36:59 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gstvp9decoder.h: - vp9decoder: Fix small typo - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1079> - -2020-03-29 22:35:06 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.h: - * gst-libs/gst/codecs/gsth265decoder.h: - * gst-libs/gst/codecs/gstvp9decoder.h: - codecs: Reorganize the order of vfunc - ... to the order in which it is actually called - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1079> - -2020-04-11 03:11:35 +0900 Seungha Yang <seungha@centricular.com> - - * sys/kms/gstkmsallocator.c: - * sys/kms/gstkmsutils.c: - * sys/kms/meson.build: - kmssink: Add support for P010 and P016 formats - Support high bit-depth YUV formats - Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1188> - -2020-04-21 15:30:03 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Fix videoprocessor leak - Clear all objects in dispose function - -2020-04-21 15:27:56 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11device.c: - d3d11device: Drop floating reference count - ... and use gst_object_unref instead of g_object_unref for tracer - to be happy. - -2020-04-20 22:48:43 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - h264decoder: Don't handle gap frame num for the first picture - If the first picture is not IDR, it would have non-zero frame_num - but it's not gap. We should skip gap frame handling in that case - -2020-04-20 16:00:30 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.c: - h264decoder: Add some debug messages - -2020-04-16 22:15:37 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/v4l2codecs/gstv4l2codecallocator.c: - v4l2codecs: allocator: use gst_clear_object - So tracer can do its job. - -2020-04-19 19:18:14 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/mpegtsmux.c: - tsmux: Don't assert sinkpad reference counts in test - We can't be sure about the reference count if the muxer is currently - running, which can happen in the test_reappearing_pad test. An - additional reference might temporarily be owned by the srcpad task of - tsmux while iterating over the pads. - -2020-04-19 18:37:58 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264picture: typo in GstH264PictureField enum - -2020-04-16 16:17:56 +0000 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: fix caps NULL unref - gst_pad_get_current_caps() can return a NULL pointer which was raisin a CRITICAL. - -2020-04-16 15:35:44 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: fix memory leak on failing allowed caps - When drm does not find any format, the allowed_caps is - empty one and need to be unref by the caller. - Fix #1268 - -2020-04-14 17:10:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Save last metadata at the same time as the last buffer - The render width/height and the vinfo was only saved upon renegotiation. This - fixes the problem by saving this metadata at the same time the buffer is - saved. The saved copy of this is needed for expose() and drain() virtual functions. - This fixes various assertion that happens on drain query. - -2020-03-31 12:42:26 -0400 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * tests/check/elements/h265parse.c: - tests: h265parse: Add unit test for conversion and sliced data - testing only byte-stream for now - -2019-03-28 17:23:30 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * tests/check/elements/h264parse.c: - tests: h264parse: unit tests for sliced data processing - -2019-09-20 15:21:17 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Remove unused arguments - -2019-06-12 22:19:04 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Don't push NALs before we have HEADERS - Otherwise we may endup pushing incomplete caps, which cause a renegotiation. - Note that this has the effect that caps are no longer pushed twice in presence - of valid framerate in the headers. - -2018-10-10 15:27:30 +0000 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Don't push NALs before we have HEADERS - Otherwise we may endup pushing incomplete caps. Note that this has the side - effect that caps are no longer pushed twice in presence of VUI with valid - framerate. - -2018-10-09 16:42:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Differentiate PREFIX SEI from SUFFIX - There is some code to fixup broken stream that uses the SEI location, - this code is meant to locate SUFFIX SEI only. This should prevent - unwanted side effect if SUFFIX SEI is used. - -2018-10-03 16:43:14 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Don't add latency when not needed - We no longer add latency when doing AU->AU, AU->NAL and NAL->NAL - parsing. - -2018-10-03 16:35:39 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: Propagate MARKER flag - -2018-10-09 16:01:08 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: Don't wait for next NAL if input is aligned - Waiting for the next NAL increases the latency. If alignment=nal/au - has been negotiated, assumes the the buffer contains a complete - NAL and don't expect a second start-code. This way, nal -> nal, - au -> au and au -> nal no longer introduce latency. - As a side effect, the collect_pad() function was not able to poke at the - following NAL. This call is now moved before processing the NAL, so - it's looking at the current NAL before it's ingested into the parser - state in order to dermin if the end of an AU has been reached. The AUD - injection state as been adapted to support this. - This change will break pipelines if alignment=nal is used without respecting the - alignment. Effectively, the parser will no longer fix the broken aligment - which will result in parser error and the termination of the pipeline. Such - issue existed in tsdemux element and might exist in any forks of that code. - Related to https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1193 - -2018-10-03 15:53:23 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Set PTS/DTS and DISCONT on crafted NAL - When we inject a NAL in the bitstream before another one, make - sure to pass both DTS and PTS. Also make sure to transfer the - DISCONT flag properly. - -2018-09-27 22:10:14 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Don't add latency when not needed - We no longer add latency when doing AU->AU, AU->NAL and NAL->NAL - parsing. - -2018-09-28 16:49:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: Propagate MARKER flag - -2018-09-25 16:10:13 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Don't wait for next NAL if input is aligned - Waiting for the next NAL increases the latency. If alignment=nal/au - has been negotiated, assumes that the buffer contains a complete - NAL and don't expect a second start-code. This way, nal -> nal, - au -> au and au -> nal no longer introduce latency. - As a side effect, the collect_pad() function was not able to poke at the - following NAL. This call is now moved before processing the NAL, so - it's looking at the current NAL before it's ingested into the parser - state in order to dermin if the end of an AU has been reached. The AUD - injection state as been adapted to support this. - This change will break pipelines if alignment=nal is used without respecting the - alignment. Effectively, the parser will no longer fix the broken aligment - which will result in parser error and the termination of the pipeline. Such - issue existed in tsdemux element and might exist in any forks of that code. - Related to https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1193 - -2018-09-25 16:16:42 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Set PTS/DTS and DISCONT on crafted NAL - When we inject a NAL in the bitstream before another one, make - sure to pass both DTS and PTS. Also make sure to transfer the - DISCONT flag properly. - -2018-09-25 16:11:03 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Remove no-op assignment - upstream was set to *out_ts, setting *out_ts to upstream here will - have no effect. - -2020-04-13 18:18:45 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - mpegtsmux: Chain up pad dispose function to the one of the parent class - Otherwise we will leak various memory. - -2020-04-13 18:04:19 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - mpegtsmux: Properly release requests pads by chaining up to aggregators function - -2020-04-10 19:54:31 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - * tests/check/elements/mpegtsmux.c: - tsmux: Ability for streams to disappear and reappear - Until now, any streams in tsmux had to be present when the element - started its first buffer. Now they can appear at any point during the - stream, or even disappear and reappear later using the same PID. - -2020-03-18 17:58:52 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - srt: Accumulate total bytes sent/received over all connections/callers - So we don't lose them. Split gst_srt_object_open_internal for internal - reconnections that don't reset the accumulated bytes. - -2020-03-23 16:38:58 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/srt/gstsrtobject.c: - srt: Fix type of bytes-received-lost - The field is a uint64_t. - -2020-03-18 18:06:59 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsrc.c: - srt: Remove use of closures for signal emission - It seems overly complicated. - -2020-03-18 17:55:38 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsrc.c: - srt: Clean up locking - Use GST_OBJECT_LOCK (srtobject->element) to protect only the fields - involved in property access. - Introduce a new mutex srtobject->sock_lock to go with - srtobject->sock_cond and protect the list of callers from concurrent - access. - -2020-03-18 17:54:29 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsink.h: - * ext/srt/gstsrtsrc.c: - * ext/srt/gstsrtsrc.h: - srt: Remove trailing whitespace - -2018-10-10 18:36:57 +0000 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Don't pretend doing NAL alignment - Per specification in 2.14.2 "For PES packetization, no specific data - alignment constraints apply". So we should not advertise NAL - alignment. - This bug was introduced at the same moment the alignment field was introduced - 10 years ago. The plan was that alignment=none (or no alignment field) was to - be used for mpegtsdemux, but no one noticed the error. The reason is that at - the same moment, everything dealing with H264 started defaulting to AU - alignment. - https://bugzilla.gnome.org/show_bug.cgi?id=606662#c22 - This patch will have a side effect that a parser is now needed after the - tsdemux element. The following pipeline will not negotiate anymore as the - mpegtsmux element requires alignment={nal,au}. - ... ! tsdemux ! mpegtsmux ! ... - As a side effect, anyone that forked from tsdemux should updated their code to - fix this bug. - -2020-04-13 20:36:50 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Remove useless comparison - sei_pic_struct is unsigned and GST_H264_SEI_PIC_STRUCT_FRAME is zero. - CID: 1461467 - -2020-04-13 20:31:14 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: Fix some coverity issues - - Remove useless comparison - - Fix invalid memory access - CID: 1461477, 1461476, 1461475, 1461474, 1461279 - -2020-04-03 15:45:02 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - wpe: Add support for SHM without requiring EGLDisplay - The previous version of the SHM export support still required a valid - EGLDisplay. The upcoming WPEBackend-FDO 1.8.x aims to remove this requirement, - hence allowing wpesrc to be used without GPU. - -2020-04-13 15:21:48 +0900 J. Kim <jeongseok.kim@sk.com> - - * ext/srt/gstsrtobject.c: - srtobject: fix mutex lock target - GstSRTObject is a structure that has an actual GstElement - which is extended to srt{src,sink}. - -2020-04-10 21:03:04 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/v4l2codecs/gstv4l2codecdevice.c: - * sys/v4l2codecs/gstv4l2codecdevice.h: - v4l2codecs: fix v4l2codecdevice get type - Currently the GType of v4l2codecdevice is hardcoded to zero, but it - rather should be delivered by the GType system. - -2020-04-10 18:22:21 +0300 Jordan Petridis <jpetridis@gnome.org> - - * sys/msdk/gstmsdkdec.c: - gstmsdkdec: fix logical operation that misses parenthesis - in C, & is weaker than the ! operator and clang is giving the following - error about it. - ``` - ../subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c:731:7: error: logical not is only applied to the left hand side of this bitwise operator -Werror,-Wlogical-not-parentheses - if (!gst_msdk_context_get_job_type (thiz->context) & GST_MSDK_JOB_DECODER) { - ^ ~ - ../subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c:731:7: note: add parentheses after the '!' to evaluate the bitwise operator first - if (!gst_msdk_context_get_job_type (thiz->context) & GST_MSDK_JOB_DECODER) { - ^ - ( ) - ../subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c:731:7: note: add parentheses around left hand side expression to silence this warning - if (!gst_msdk_context_get_job_type (thiz->context) & GST_MSDK_JOB_DECODER) { - ^ - ( ) - 1 error generated. - ``` - -2020-03-23 14:40:52 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.c: - codecs: Add minimal state validation - ... to prevent requesting decoding before the preparation. - For instance, baseclass should not request decoding a picture if there - is no parsed valid headers, since subclass is most likely - not ready to decoding it. - -2020-03-30 15:42:35 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - h265parser: Add APIs to allow update VPS/SPS/PPS - gst_h265_parser_parse_{vps,sps,pps} APIs were used to parse VPS/SPS/PPS and - also in order to update parser's internal state at once. Meanwhile - gst_h265_parse_{vps,sps,pps} APIs are to parse VPS/SPS/PPS without state update. - This commit introduces new APIs so that only accepted VPS/SPS/PPS by user - can be updated to be used by parser. - -2020-03-30 15:27:40 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: Add APIs to allow update SPS/PPS - gst_h264_parser_parse_{sps,pps} APIs were used to parse SPS/PPS and - also in order to update parser's internal state at once. Meanwhile - gst_h264_parse_{sps,pps} APIs are to parse SPS/PPS without state update. - This commit introduces new APIs so that only accepted SPS/PPS by user - can be updated to be used by parser. - -2020-04-09 23:12:25 +0900 Seungha Yang <seungha@centricular.com> - - * sys/kms/meson.build: - meson: kmssink: Allow fallback only on linux - Otherwise fallback will waste meson configure time on non-linux - -2020-04-08 01:22:07 +0200 Zeid Bekli <zeidb@axis.com> - - * ext/srtp/gstsrtp.c: - srtp: Added support for BYE packet - SRTCP can't get SSRC from BYE packet, this will make srtpdec element - to drop the package. Adding support to get the SSRC from BYE packets. - -2020-04-09 16:12:58 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstcuvidloader.c: - * sys/nvcodec/gstcuvidloader.h: - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvenc.h: - * sys/nvcodec/plugin.c: - nvdec: Don't hardcode DPB size - Too many decode surface would waste GPU memory. Also it seems to be - introducing additional latency depending on stream. Since nvcodec - sdk version 9.0, CUVID parser API has been providing the minimum - required number of surface. By using it, we can save GPU memory - and reduce possible latency. - -2020-04-08 14:21:30 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecdevice.c: - v4l2codecs: Fix FD leak during device enumeration - This was revealed by Coverity. - CID 1461248 - -2020-04-07 19:28:27 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dash/gstmpdclient.c: - dash: fix VARARGS coverity error - va_end was not called in every code path due to - g_return_val_if_fail. - API usage errors (VARARGS) - va_end was not called for "myargs". - CID: 1461294 - -2020-04-08 12:10:21 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * meson.build: - * meson_options.txt: - Meson: Change extra-checks to feature option and make it yielding - -2020-04-08 14:00:48 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Fix content light level value changes - Same as for H265, was found by Coverity. - -2020-04-07 17:04:30 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix content light level value changes - The comparision was not testing anything meaninful. This fixes the comparision - so we now update the caps whenever the value differ. This was detected by - coverity. - CID 1461291 - -2020-04-08 18:39:06 +0200 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/gstrtmp2src.c: - rtmp2: Avoid a deadlock when getting stats - We need to do this without holding the lock as the `g_async_queue_pop` - waits on the loop thread to deliver the stats. The loop thread might - attempt to take the lock as well, leading to a deadlock. - Taking a reference to the connection should be enough to keep this - safe. - -2020-04-08 15:37:03 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: Add support for inband timecode update - Add new property "update-timecode" to allow updating timecode - in picture timing SEI depending on timecode meta. Since the picture - timing SEI message requires proper VUI setting but we don't support - re-writing SPS, this might not work for some streams - -2020-04-08 17:07:36 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Don't unconditionally append timecode meta - If upstream buffer has its own timecode metatdata, don't append - new timecode meta into the buffer. - -2020-04-08 16:24:06 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst/videoparsers/gsth264parse.c: - h264parser: Parse all SEI payload type even if it's not handled by parser - ... so that user can handle it from outside of parser API - -2020-04-07 20:26:23 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * tests/check/libs/h264parser.c: - h264parser: Add support for creating picture timing SEI - This new method can make it possible to inject timecode meta into - h264 bitstream - -2020-04-07 22:30:55 +0900 Seungha Yang <seungha@centricular.com> - - * tests/check/libs/h264parser.c: - tests: h264parser: Fix picture timing SEI - The payloadSize don't need to include rbsp_trailing_bits() - -2020-04-07 19:32:29 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: Make GstH264PicTiming self-containing all the syntax information - ... and store all parsed values. - We are storing pic_struct_present_flag although it's not part of - this SEI message but GstH264PicTiming includes it to clarify - following syntax values. - In addition to that, by adding CpbDpbDelaysPresentFlag, we don't need to - refer to VUI anymore. - -2020-04-07 21:17:30 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: Fix some misleading debug messages - -2020-04-07 09:17:15 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: Fix mismatched argument of declaration and definition - -2020-04-06 10:25:37 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * gst/sdp/gstsdpdemux.c: - * gst/sdp/gstsdpdemux.h: - sdpdemux: don't send EOS for unknown SSRC - The rtpbin sends signals for all SSRCs. Don't send an EOS when the SSRC - does not match the stream SSRC. - This avoids problems when an SSRC from another receiver times out. - -2020-04-08 08:47:37 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/libs/codecs/index.md: - * docs/libs/codecs/sitemap.txt: - * docs/meson.build: - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/meson.build: - codecs: Add basic documentation stubs - -2020-04-07 17:10:08 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2decoder: Fix file descriptor leak - A copy paste error was leading to file descriptor leak. This was detected by - Coverity. - CID 1461285 - -2020-04-06 16:40:38 +0100 Philippe Normand <philn@igalia.com> - - * gst/debugutils/gstfakevideosink.c: - * gst/debugutils/gstfakevideosink.h: - fakevideosink: Allow allocation meta flags fine-tuning - In some scenarios the fakevideosink shouldn't advertize the overlay-composition - meta for instance, so that overlay elements perform subtitles blending - themselves. - -2020-04-06 10:19:23 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: be more tolerant when parsing the adaptation field - According to the specification, the adaptation field length must be 183 if - there is no payload data and < 183 if the packet contains an adaptation - field and payload data. - Unfortunately some payloaders always set the flag for payload data, even if - the adaptation field length is 183. - Don't return with an error in this case. Clear the payload data flag - instead and parse the adaptation field as usual. This avoids visual - artefacts for such streams. - -2020-04-06 15:06:01 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.h: - codecs: h264: Fix DPB size calculation - As per specification in A.3.1 h) and A.3.2 f), the maximum size of the DPB is - 16. Fix the maximum in the fine and fix the formula to use MIN instead of MAX - so that we no longer always use the maximum for the profile/level. - -2020-04-01 12:33:38 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvp9dec.c: - msdkvp9dec: add support for VP9 12bit - The output formats are P012_LE for 12bit 420 and Y412_LE for 12bit 444. - -2020-04-03 18:50:16 -0400 worldofpeace <worldofpeace@protonmail.ch> - - * ext/neon/meson.build: - meson: build with neon 0.31 - No API/ABI changes https://github.com/notroj/neon/blob/0.31.0/NEWS#L3 - -2020-04-03 17:07:47 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/vulkan/shaders/meson.build: - * meson.build: - * sys/d3d11/meson.build: - meson: Don't use get_option('buildtype') - We should directly check the values of the `debug` and `optimization` - options instead. - `get_option('buildtype')` will return `'custom'` for most combinations - of `-Doptimization` and `-Ddebug`, but those two will always be set - correctly if only `-Dbuildtype` is set. So we should look at those - options directly. - For the two-way mapping between `buildtype` and `optimization` - + `debug`, see this table: - https://mesonbuild.com/Builtin-options.html#build-type-options - -2020-03-23 12:56:46 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * sys/kms/meson.build: - kms: add fallback on libdrm project if available. - -2020-03-12 13:28:59 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - msdkh265dec: add support for main-444-12, main-444-12-intra profiles - The video format is Y412_LE - -2020-03-12 13:21:02 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: map Y412_LE to VA_FOURCC_Y416 - In media driver, VA_FOURCC_Y416 is used for packed 12 bits 4:4:4:4 YUV - format, the corresponding RT format is VA_RT_FORMAT_YUV442_12 - -2020-03-12 13:12:33 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/msdk_libva.c: - msdk: map MFX_FOURCC_Y416 to VA_FOURCC_Y416 - Y416 is used for packed 12 bits 4:4:4:4 YUV format in media driver, the - RT format is VA_RT_FORMAT_YUV444_12 - -2020-03-12 12:58:40 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/gstmsdkvideomemory.c: - * sys/msdk/msdk.c: - msdk: map Y412_LE to MFX_FOURCC_Y416 - MFX_FOURCC_Y416 is used for packed 12 bits 4:4:4:4 YUV format in - MediaSDK - -2020-03-11 14:55:33 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - msdkh265dec: add support for main-422-12, main-422-12-intra profiles - The video format is Y212_LE - -2020-03-11 14:35:55 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: map Y212_LE to VA_FOURCC_Y216 - In media driver, VA_FOURCC_Y216 is used for packed 12 bits 4:2:2 YUV - format, the corresponding RT format is VA_RT_FORMAT_YUV422_12 - -2020-03-11 14:09:11 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/msdk_libva.c: - msdk: map MFX_FOURCC_Y216 to VA_FOURCC_Y216 - In media driver, Y216 is used for packed 12 bits 4:2:2 format YUV - format, so the RT format is VA_RT_FORMAT_YUV422_12. - -2020-03-11 13:54:42 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/msdk.c: - msdk: map Y212_LE to MFX_FOURCC_Y216 - MFX_FOURCC_Y216 is used for packed 12 bits 422 YUV format in MediaSDK - -2020-04-03 00:42:23 +0900 Seungha Yang <seungha@centricular.com> - - * sys/msdk/gstmsdkh265enc.c: - msdkh265enc: Fix for wrong parser free function - -2020-03-18 12:30:51 +1100 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Handle instant rate change requests directly - Downstream demuxers will first send seek events upstream to us. - Do the right thing with instant rate change requests by handling them - immediately. - -2020-03-17 19:31:22 +1100 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Don't ignore gst_segment_do_seek() return result - gst_segment_do_seek() can fail, so don't ignore the return result - -2018-11-30 05:18:42 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - tsdemux: Send instant-rate-change event if requested in the SEEK event - Convert instant-rate-change seek events into a downstream - instant-rate-change event and skip any further local seek handling. - -2020-03-31 20:51:15 +0900 Seungha Yang <seungha@centricular.com> - - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - msdkh264enc: Configure parser and SEI array only if it's required - -2020-03-31 15:25:47 +0900 Seungha Yang <seungha@centricular.com> - - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - msdkh265enc: Add support for CEA708 closed caption insertion - Functionally identical to that of msdkh264enc - -2020-03-19 18:25:18 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - * tests/check/libs/h265parser.c: - h265parser: Add a helper method to create SEI nal unit - Add an API to create raw SEI nal unit. This would be useful in case - an user want to create SEI nal data and inject the SEI nal data - into bitstream. - -2020-04-01 19:43:51 +0200 Miguel Paris <mparisdiaz@gmail.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: reduce log level for replay cases - These are normal cases, so DEBUG level is enough. - -2017-04-11 12:41:11 +0200 Miguel París Díaz <mparisdiaz@gmail.com> - - * ext/srtp/gstsrtp.h: - * ext/srtp/gstsrtpdec.c: - srtpdec: do not warning old replay errors - Reordered packets producing decrypting errors are very normal, - so we should filter which errors are warning and which not. - -2018-05-29 15:00:43 +0200 Miguel Paris <mparisdiaz@gmail.com> - - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpdec.h: - srtpdec: fix reseting RTP sequence number on ROC changes - Each srtp_stream_t is tied to an specific SSRC, so a - roc_changed flag should be kept per each SSRC in order to - properly reset RTP sequence number on ROC changes. - -2020-03-13 16:50:16 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11format.c: - d3d11: Update for video-hdr struct change - See the change of -base https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/594 - -2020-03-13 16:45:12 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstnvh265enc.c: - nvh265enc: Update for video-hdr struct change - See the change of -base https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/594 - -2020-03-13 16:34:01 +0900 Seungha Yang <seungha@centricular.com> - - * ext/x265/gstx265enc.c: - x265enc: Update for video-hdr struct change - See the change of -base https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/594 - -2020-03-13 16:17:07 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - * tests/check/elements/h264parse.c: - * tests/check/elements/h265parse.c: - h264parse,h265parse: Update for video-hdr struct change - See the change of -base https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/594 - -2018-07-28 14:54:42 +0200 Zeeshan Ali <zeenix@collabora.co.uk> - - * gst/videoparsers/gsth265parse.c: - h265parse: Set duration on buffers base on framerate - -2018-06-14 16:20:54 +0200 Zeeshan Ali <zeenix@collabora.co.uk> - - * gst/videoparsers/gsth265parse.c: - h265parse: Derive src fps from vui_time_scale & vui_num_units_in_tick - -2018-06-13 16:33:21 +0200 Zeeshan Ali <zeenix@collabora.co.uk> - - * gst/videoparsers/gsth265parse.c: - h265parse: Handle interlaced video - For interlaced video: - * set the interlace mode in the src caps - * double the height from SPS in the caps. - * set field latency, instead of frame latency. - Fix #778 - -2020-03-27 13:05:41 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264picture.c: - codecs: h264dpb: Don't leak pic_list GArray - The contents was cleared, but the array was never released. - -2020-03-26 15:57:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/meson.build: - v4l2codecs: Only build this plugin on Linux - This is not useful on any other OSs, it will also avoid potential build - failure as this code uses Linux specific calls. - -2020-03-26 15:38:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/plugin.c: - v4l2codecs: Add plugin dependency - This ensure that the registry cache get updated when a meaningful change is - made in /dev for files named media*. - -2020-03-20 12:37:41 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codecpool.c: - * sys/v4l2codecs/gstv4l2decoder.c: - v4l2codecs: Wait for buffers to come back - This code add required mechanism to try and allocate (not implemented yet) - otherwise wait for more buffers. This also comes with mechanism to terminate - the wait on flush or PAUSED_TO_READY transitions. - -2020-03-20 14:14:46 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2codecs: Implement flushing sequence - This simply consit of cycling through STREAMOFF/STREAMON with stateless - decoders. - -2020-03-20 12:35:03 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecallocator.c: - * sys/v4l2codecs/gstv4l2codecallocator.h: - v4l2codecs: allocator: Add method to wait for more buffers - This add function to wait for buffers to get back into the pool along with a - set_flushing() method to allow unblocking this wait. - -2020-03-18 17:03:51 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecpool.c: - v4l2codecs: pool: Create new buffer when pool is empty - This simply create an empty GstBuffer when the pool is empty. This way it's up - to the allocator to grow or wait if we ran out of memory. - -2020-03-18 17:00:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Improve end_picture() robustness - Use a goto to ensure that for all cases we cleanup the current picture state. - And move the src buffer allocation higher, so we don't queue a bitstream - buffer if we don't have a picture buffer to decode into. - -2020-03-18 16:51:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - codecs: h264: Do not ignore end_picture() return value - If decoding failed because end_picture() failed, set the picture to - nonexisting, this way output_picture() will be skipped. This avoids confusing - special cases in output_picture() implementation. - -2020-02-17 18:08:48 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - * sys/v4l2codecs/gstv4l2format.c: - v4l2slh264dec: Add output format negotiation - This allow negotiating the output format through caps. Some drivers can - pipeline the decoder buffer through an image processor. This only support - colorspace conversion for now. - -2020-03-13 16:51:27 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2format.c: - * sys/v4l2codecs/gstv4l2format.h: - v4l2format: Convert between V4L2 and GST video format - This will be needed in the output format negotiation. - -2020-03-13 14:23:39 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2format.c: - v4l2codecs: Read driver provided stride - This implements driver stride support but only for single allocation buffers. - This code is imported from the original v4l2 plugin and adapted to the new - helper context. - -2020-03-12 16:15:40 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2h264dec: Copy frames when GstVideoMeta is not supported - In some case, when downstream does not support GstVideoMeta, we need to - normalize the stride and offset of the buffer so that downstream can render - properly with a GstVideoMeta. This code is not called when GstVideoMeta is - supported downstream. - -2020-03-11 17:45:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecpool.c: - * sys/v4l2codecs/gstv4l2codecpool.h: - v4l2codec: Add initial GstVideoMeta support - In this patch we strictly set the GstVideoMeta width/height to the coded width - and height. Further patches will add stride support and frame copying when - downstream does not support GstVideoMeta. - -2020-03-09 16:44:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Prevent spurious renegotiation - Don't let downstream cause a renegotiation at random point in time. This would - lead to spurious renegotiation and the decoder state may not be recoverable. - -2020-03-03 21:22:52 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Hold on picture buffers - These buffers should not be reused for decoding until they are no longer - referenced. - -2020-02-16 17:48:12 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2codecs: Fix bytesused value - Pass the actual amount of bytes we have copied into the bitstream buffer. Also - unmap the memory before queuing. - -2020-02-16 14:53:08 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codech264dec: Implement finish frame - This enables the request to be processed by the HW (STREAMON) and to be pushed - downstream for further processing. - -2020-02-16 14:51:37 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2codecdecoder: Add support for dequeuing buffers - This includings polling of the request and streamon/streamoff. - -2020-02-14 22:13:05 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2codech264dec: Implement queuing - We now pass the controls, associated to a request, queue the bitstream, qeueue - a picture buffer to decode into and finally queue the request. This now runs - until the buffer pool is exhausted. The next step will be to dequeue. - -2020-02-14 22:03:17 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2decoder: Add helpers to queue buffer and requests - -2020-02-14 21:57:34 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecallocator.c: - * sys/v4l2codecs/gstv4l2codecallocator.h: - * sys/v4l2codecs/gstv4l2codecpool.c: - * sys/v4l2codecs/gstv4l2codecpool.h: - v4l2codec: Add getter for buffer index in allocator and pool - -2020-02-13 17:46:29 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecallocator.c: - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2h264codecdec: Copy bitstream parameter and data - In this patch we fill the control structure with the bitstream paramter and - copy the bitstream data into V4L2 memory. Slice paramters are only the subset - of what Hantro needs, without any support for interlaced content. - -2020-02-12 23:50:42 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - v4l2slh264dec: Use the newly introduced allocator / pool - We now allocate and free the memory needed for streaming. - -2020-02-12 23:45:14 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codecallocator.c: - * sys/v4l2codecs/gstv4l2codecallocator.h: - * sys/v4l2codecs/gstv4l2codecpool.c: - * sys/v4l2codecs/gstv4l2codecpool.h: - * sys/v4l2codecs/meson.build: - v4l2codec: Add allocator and pool implementation - This is a pooling allocator and the buffer pool does nothing other then - reusing the GstBuffer structure. Note that the pool is an internal pool, so - the start/stop/set_config virtual functions are not implemented. - -2020-02-12 23:39:25 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2codec: decoder: Add allocation helper - -2020-02-10 18:05:39 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - v4l2codecs: Implement H264 format negotiation - -2020-02-10 18:02:37 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2format.c: - * sys/v4l2codecs/gstv4l2format.h: - * sys/v4l2codecs/meson.build: - v4l2codecs: Add initial formats helpers - -2020-02-09 11:31:11 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2codech264dec.c: - * sys/v4l2codecs/gstv4l2codech264dec.h: - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - * sys/v4l2codecs/meson.build: - * sys/v4l2codecs/plugin.c: - v4l2codecs: Add skeleton of H264 decoder - This introduces the skeleton of the H264 decoder. The plugin will list the - devices and register a subclass of the GstV4L2CodecH264Dec base class. The - subclass will pick the required specific information from the GstV4L2Device - stored in the subclass structure. - -2020-02-05 21:42:56 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/gstv4l2decoder.c: - * sys/v4l2codecs/gstv4l2decoder.h: - * sys/v4l2codecs/meson.build: - v4l2codec: Add GstV4L2Deocder helper object - This is a GstObject which will be used to hold on media and video device file - descriptor and provide abstracted ioctl calls with these descriptor. At the - moment this helper contains just enough to enumerate the supported format. - This part will be used by the plugin to register the CODEC specific elements.. - -2020-02-05 21:18:57 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/v4l2codecs/linux/h264-ctrls.h: - * sys/v4l2codecs/linux/media.h: - * sys/v4l2codecs/linux/types-compat.h: - * sys/v4l2codecs/linux/v4l2-common.h: - * sys/v4l2codecs/linux/v4l2-controls.h: - * sys/v4l2codecs/linux/videodev2.h: - v4l2codecs: Copy all needed Linux kernel headers - Most of the features we need are very early or not expose yet in the uAPI. - Using an internal copy ensure that we everything we need is defined avoiding - to add load of checks and conditionnal code. - -2020-02-04 15:52:45 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * meson_options.txt: - * sys/v4l2codecs/gstv4l2codecdevice.c: - * sys/v4l2codecs/gstv4l2codecdevice.h: - * sys/v4l2codecs/meson.build: - * sys/v4l2codecs/plugin.c: - v4l2codecs: Add device enumeration - This introduces a GstV4L2CodecDevice structure and helper to retrieve a - list of CODEC device drivers. In order to find the device driver we - enumerate all media devices with UDEV. We then get the media controller - topology and locate a entity with function encoder or decoder and make - sure it is linked to two V4L2 IO entity pointing to the same device - node. - -2020-02-03 10:06:46 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/meson.build: - * sys/v4l2codecs/meson.build: - * sys/v4l2codecs/plugin.c: - v4l2codecs: Introdude a V4L2 CODECs Accelerator plugin - This plugin will support new CODECs uAPI in the Linux kernel. These - consist of an accelerator interface similar to DXVA, NVDEC, VDPAU and - VAAPI. - -2020-03-30 20:21:37 +0900 Seungha Yang <seungha@centricular.com> - - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - msdkh264enc: Port to h264parser API for frame packing SEI injection - Create frame packing SEI memory only once per set_format() and - reuse it if possible. - -2020-03-24 19:23:46 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Print all the syntax elements of frame packing for debugging - Other values might be useful for debugging - -2020-03-18 10:11:19 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - * sys/msdk/gstmsdkh265enc.c: - msdkh265enc: support 8-bit 422 encoding - The media driver can support HEVC 8-bit 422 encoding for non-lowpower - mode since ICL1, so VPP is not needed for this case. - Sample pipeline: - gst-launch-1.0 videotestsrc ! video/x-raw,format=YUY2 ! msdkh265enc ! \ - filesink location=output.h265 - 1 https://github.com/intel/media-driver#decodingencoding-features - -2020-03-17 15:18:37 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkh265enc.c: - msdkh265enc: add support for Y210 in sink pad - Sample pipeline: - gst-launch-1.0 videotestsrc ! video/x-raw,format=Y210 ! - msdkh265enc ! filesink location=output.h265 - -2020-03-20 09:53:28 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - msdk: add a helper function to get codename of the platform - The features supported in MSDK vary from platform to platform. We may - support some features based on the codename of the platform in future. - -2020-03-24 16:00:30 +0900 Seungha Yang <seungha@centricular.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: Try to find corresponding codec frame for encoded output buffer - The input and output buffers should be matched as much as possible - so that various metadata and its ordering to be preserved. - -2020-03-22 20:15:42 +0900 Seungha Yang <seungha@centricular.com> - - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - * sys/msdk/meson.build: - msdkh264enc: Add support for CEA708 closed caption insertion - Currently supported caption format is CEA708_RAW - -2020-03-25 17:20:13 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * tests/check/libs/h264parser.c: - h264parser: Add a helper method to create and inject raw SEI data - Add an API to create raw SEI nal unit. This would be useful in case - an user want to create SEI nal data and inject the SEI nal data - into bitstream. - -2020-03-19 18:25:18 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/nalutils.c: - * gst-libs/gst/codecparsers/nalutils.h: - * tests/check/libs/nalutils.c: - * tests/check/meson.build: - nalutils: Introduce NAL writer helper methods - Add helper methods for writing h264 and h265 NAL - -2020-03-22 13:59:52 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: Expose SEI clear function to public - gsth265parser does it already. Although corresponding API of h265parser is - gst_h265_sei_free, _clear suffix is more consistent naming for h264parser - since there are gst_h264_{sps,pps}_clear(). - -2020-03-29 17:34:48 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Add support for array of texture DPB - DXVA supports two kinds of texture structure for DPB, one is - "1) texture array" and the other is "2) array of texture". - 1) is a type of texture which is single ID3D11Texture2D object having - ArraySize greater than one. So the ID3D11Texture2D itself is a set of texture. - Each sub texture of this type mush have identical resolution, format and so on, - and the number of sub texture in a texture array is fixed. - 2) is an array of usual ID3D11Texture2D object. That means each - ID3D11Texture2D is independent each other and might have different resolution as well. - Moreover, we can modify the number of frames of the array dynamically. - This type is more flexible than "1) texture array" in terms of dynamic - behavior and also this type of texture can be used for shader resource view - but "1) texture array" couldn't be. - If "2) array of texture" is supported by driver, DXVA spec is saying that - it's preferred format over "1) texture array" in terms of performance. - -2019-11-26 15:42:03 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - msdkh265enc: slice size control - Add max-slice-size property to set the maximum slice size - -2020-03-27 18:05:55 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - Revert "d3d11decoder: Check decoder status report" - This reverts commit 418e6991c19ab5ae6bcf1890f9b947c748ca834d. - Not all drivers seem to be friendly to this API. - Revert to avoid incomprehensible crash with Nvidia. - -2020-03-26 21:20:20 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Always reuse swapchain - DXGI format can be updated via ResizeBuffers() - -2020-03-09 20:29:17 +0900 Seungha Yang <seungha@centricular.com> - - * sys/d3d11/gstd3d11format.c: - * sys/d3d11/gstd3d11format.h: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - d3d11window: Reorganize display colorspace selection - The set of supported color space by DXGI is not full combination of - our colorimetry. That means we should convert color space to one - of supported color space by DXGI. This commit modifies the color space - selection step so that d3d11window can find the best matching DXGI color space - first and then the selected input/output color space will be referenced - by shader and/or d3d11videoprocessor. - -2020-03-27 15:40:00 +0900 Seungha Yang <seungha@centricular.com> - - * gst/rtmp2/gstrtmp2src.c: - rtmp2src: Add idle-timeout property - Add new property to signalling that there is no incoming data - from peer. This can be useful if users want to stop the streaming - when the connection is alive but no packet is arriving. - -2020-03-27 10:34:25 +1100 Matthew Waters <matthew@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - dtls/connection: fix EOF handling with openssl 1.1.1e - openssl 1.1.1e does some stricker EOF handling and will throw an error - if the EOF is unexpected (like in the middle of a record). As we are - streaming data into openssl here, it is entirely possible that we push - data from multiple buffers/packets into openssl separately. - From the openssl changelog: - Changes between 1.1.1d and 1.1.1e 17 Mar 2020 - *) Properly detect EOF while reading in libssl. Previously if we hit an EOF - while reading in libssl then we would report an error back to the - application (SSL_ERROR_SYSCALL) but errno would be 0. We now add - an error to the stack (which means we instead return SSL_ERROR_SSL) and - therefore give a hint as to what went wrong. - Matt Caswell - We can relax the EOF signalling to only return TRUE when we have stopped - for any reason (EOS, error). - Will also remove a spurious EOF error from previous openssl version. - -2020-03-25 14:46:15 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: mark streams as active on renegotiation as well. - Otherwise when bundling, only the changed streams would be considered as - to whether the bundled transport needs to be blocked as all streams are - inactive. - Scenario is one transceiver changes direction to inactive and as that is - the only change in transciever direction, the entire bundled transport would - be blocked even if there are other active transceivers inside the same bundled - transport that are still active. - Fix by always checking the activeness of a stream regardless of if the - transceiverr has changed direction. - -2020-01-13 13:50:26 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/interlace/gstinterlace.c: - interlace: add alternate support - Allow downstream elements to negotiate the alternate interlace mode, - splitting each input buffer in two fields, each having their own buffer. - -2020-02-28 12:31:46 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/interlace/gstinterlace.c: - interlace: factor out interlace_mode_from_pattern() - -2020-01-23 15:17:45 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/interlace/gstinterlace.c: - interlace: factor out gst_interlace_push_buffer() - -2020-01-23 15:10:36 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/interlace/gstinterlace.c: - interlace: factor out gst_interlace_decorate_buffer_ts() - -2020-01-23 14:31:02 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/interlace/gstinterlace.c: - interlace: rename copy_field() - It is actually copying both fields (to a single frame/buffer). - -2020-03-21 20:16:04 +0900 Seungha Yang <seungha@centricular.com> - - * tests/check/libs/h265parser.c: - tests: h265parser: Add test for registered user data SEI - -2020-03-21 19:41:28 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: Fix registered user data SEI leak - ... and add fix for the SEI data in gst_h265_sei_copy() - -2020-03-21 18:25:25 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - h265parser: Do not allocate too large size of memory for registered user data SEI - Don't be confused by the unit of payload size (i.e., bits and bytes) - Also this need a documentation with Since mark - -2020-03-21 18:39:42 +0900 Seungha Yang <seungha@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: Do not allocate too large size of memory for registered user data SEI - Don't be confused by the unit of payload size (i.e., bits and bytes) - Also this need a documentation with Since mark - -2020-03-23 12:55:13 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.h: - wpe: Enable SHM support for new stable WPEBackend-FDO release - 1.5.0 was the development version. - -2020-02-10 18:28:05 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/gstwpesrc.cpp: - wpe: Mouse scroll events support - -2020-02-29 22:19:57 -0600 James Westman <james@flyingpimonster.net> - - * sys/applemedia/avfdeviceprovider.m: - applemedia: Add some properties to GstAvfDevice - Adds properties to the devices listed in GstDeviceMonitor by the - applemedia plugin. - These properties are: - - device.api (always set to "avf") - - avf.unique_id - - avf.model_id - - avf.manufacturer (except on iOS) - - avf.has_flash - - avf.has_torch - Everything except device.api is taken directly from the AVCaptureDevice object - provided by AVFoundation. - -2020-03-20 20:27:05 +0900 Seungha Yang <seungha@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Set mpegversion for AAC ADTS stream based on parsed ADTS header - Both 2 and 4 are supported version of AAC ADTS format stream. - So we need to set correct version to help negotiation - especially for non-autopluggable pipeline. - -2020-03-10 15:42:48 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - msdkh265dec: add support for main-12, main-12-intra profiles - The video format is P012_LE - -2020-03-10 16:03:55 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: map P012_LE to VA_FOURCC_P016 - In media driver, VA_FOURCC_P016 is used for semi-planar 12 bits YUV - format, the corresponding RT format is VA_RT_FORMAT_YUV420_12 - -2020-03-10 15:41:50 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/msdk_libva.c: - msdk: map MFX_FOURCC_P016 to VA_FOURCC_P016 - P016 is used for semi-planar 12 bits format in the media driver, so the - RT format is VA_RT_FORMAT_YUV420_12 - -2020-03-10 15:32:43 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/msdk.c: - msdk: map P012_LE to MFX_FOURCC_P016 - MFX_FOURCC_P016 is used for semi planar 12 bits YUV format in MediaSDK - -2020-03-20 14:53:40 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvp9enc.c: - msdkvp9enc: add support for 10 bits 444 input - The input format is Y410 in sink pad and the corresponding profile in - src pad is profile 3 - -2020-03-20 14:38:12 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvp9enc.c: - msdkvp9enc: add support for 8 bits 444 input - The input format is VUYA in sink pad and the corresponding profile in - src pad is profile 1 - -2020-03-22 22:30:15 +0900 Seungha Yang <seungha@centricular.com> - - * sys/msdk/gstmsdkbufferpool.c: - msdkbufferpool: Fix build warning on Windows - gstmsdkbufferpool.c(274): warning C4101: 'fd': unreferenced local variable - -2020-01-22 11:29:03 +0000 Guillermo Rodríguez <guille.rodriguez@gmail.com> - - * tests/examples/waylandsink/main.c: - * tests/examples/waylandsink/wayland-threads.c: - examples/wayland: unref GstContext after use - -2020-03-19 09:28:28 -0700 U. Artie Eoff <ullysses.a.eoff@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: add YV12 format to src pad - VPP YV12 output format support added since - MFX_VERSION 1032. - https://github.com/Intel-Media-SDK/MediaSDK/pull/2027 - -2020-03-15 19:20:47 +0900 Seungha Yang <seungha@centricular.com> - - * sys/nvcodec/gstcudaloader.c: - * sys/nvcodec/gstcudaloader.h: - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/stub/cuda.h: - nvdec: Add fallback for CUDA/OpenGL interop failure - It happens when local OpenGL context belongs to non-nvidia GPU. - -2020-03-16 17:19:04 +0100 Victor Manuel Jaquez Leal <vjaquez@noite.lan> - - * gst-libs/gst/codecparsers/gstmpeg4parser.h: - * gst-libs/gst/codecparsers/gstvp8parser.h: - libs: codecparser: add missing unstable api warning - mpeg4 and vp8 parsers didn't show that compilation warning as the - others parsers. - -2020-03-15 12:44:31 +0000 Philippe Normand <philn@igalia.com> - - * ext/webrtcdsp/gstwebrtcechoprobe.cpp: - webrtcdsp: Fix documentation markup - -2020-03-15 10:46:24 +0000 Philippe Normand <philn@igalia.com> - - * ext/openni2/gstopenni2src.cpp: - openni2: Remove spurious gtk-doc markers - -2020-03-15 10:45:25 +0000 Philippe Normand <philn@igalia.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Remove spurious gtk-doc marker - -2020-03-13 17:47:46 +0000 Philippe Normand <philn@igalia.com> - - * docs/meson.build: - docs: Scan C++ files too - -2020-02-12 11:23:18 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/meson.build: - msdk: meson: check whether mfxExtVP9Param is defined - User reported MFX_VERSION is 1026 however the build is broken1, so add - the check for mfxExtVP9Param to make sure it can be build without - compiler error. - In addtion, it fixes a stupid typo (#endif') introduced by me. - 1 https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/988#note_408093 - -2020-03-12 12:13:10 +0100 rubenrua <rgonzalez@fluendo.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfmux.h: - * sys/msdk/gstmsdkcontext.c: - asfmux: Fix typo in property description - s/milisecs/milliseconds/g - -2020-03-11 21:37:27 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Plug a leak - -2020-02-01 11:52:04 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - mpegts: Add a property to ignore broken PCR streams - Some mpeg-ts (HLS, DVB, ...) streams out there have completely broken - PCR streams on which we can't reliably recover correct timestamps. - For those, provide a property that will ignore the program PCR stream - (by faking that it's not present (0x1fff)). - -2020-03-11 17:18:56 +0900 Seungha Yang <seungha@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegdemux: Add ignore-scr property to ignore broken SCR - Some MPEG-PS streams might not be compliant but the SCR can be ignored - if PTS/DTS in PES header is consistently increased. - -2020-03-11 17:42:18 +0900 Seungha Yang <seungha@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Remove whitespace - -2020-03-10 11:52:23 +0800 yychao <yychao@realtek.com> - - * ext/smoothstreaming/gstmssmanifest.c: - smoothstreaming: fix H264 CodecPrivateData parsing - Do not pass SPS nal_unit_type (0x67) into gst_h264_parse_sps() - Fixes #648 - -2020-03-10 17:40:28 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: In-band sps/pps update if only codec_data differs in src caps - Apply in-band sps/pps resending implementation to h265parse. - -2020-03-10 13:20:17 +0900 Seungha Yang <seungha@centricular.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: In-band sps/pps update if only codec_data differs in src caps - Initially the case "only codec_data is different" was addressed in - https://bugzilla.gnome.org/show_bug.cgi?id=705333 in order for - unusual bitstreams to be handled. That's the case where sps and pps - are placed in bitstream. When sps/pps are signalled only via caps - by upstream, however, the updated codec_data is mandatory for decoder - and therefore we shouldn't ignore them. - -2020-03-10 16:32:59 +0900 Dong Il Park <dongil.park@lge.com> - - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Add format_identifier for AC4 codec - According to following spec document, add format_identifier for AC4 in tsdemux. - ETSI TS 103 190-2 V1.2.1 : Annex D : AC-4 in MPEG-2 transport stream - -2020-03-09 17:00:01 +0800 yychao <yychao@gmail.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Add support for AC4 - According to following two specs, add support for AC4 in tsdemux. - 1. ETSI TS 103 190-2 V1.2.1 (2018-02) : Annex D (normative): AC-4 in MPEG-2 transport streams - 2. ETSI EN 300 468 V1.16.1 (2019-08) : Annex D (normative):Service information implementation of AC-3, EnhancedAC-3, and AC-4 audio in DVB systems - -2020-03-09 21:21:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - webrtcbin: Use GPtrArrays or store items inline instead of using GArrays of pointers - -2020-03-10 05:18:40 +1100 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - webrtcbin: Prevent ICE gathering state reaching complete early - The ICE gathering state can transition to complete prematurely if the - underlying ICE components complete their gathering while the initial - ICE gathering state task is queued and still pending. - In that situation, the ice gathering state task will report complete - while there are still ICE candidates queued for emission. - Prevent that by storing ICE candidates in an array and checking if - there are any pending before reporting a completed ICE gathering - state. - -2020-03-10 04:22:57 +1100 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - webrtc: Protect the pending ICE candidates array - ICE candidates can be added to the array directly from the application - or from the webrtc main loop. Rename it to make it clear that it's - holding remote ICE candidates from the peer, and protect it with a - new mutex - -2020-03-07 19:41:53 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11vp9dec: Add support for internal frame resizing - VP9 codec allows resizing reference frame by spec. Handling this case - is a bit tricky especially when the resizing happens on non-keyframe, - because pre-allocated decoder textures (i.e., dpb) have negotiated - resolution and to change resolution meanwhile decoding on non-keyframe, - each texture might need to be re-created, copied to new dpb somehow, - and re-negotiated with downstream. - Due to the complicated requirement of negotiation driven - resizing handling, this commit adds shader into d3d11decoder object - to resize only corresponding frames. Note that if the resolution change - is detected on keyframe, decoder will re-negotiate with downstream. - -2020-03-07 19:38:30 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Set GstVideoAlignment to downstream d3d11 buffer pool - To copy decoder output texture to another d3d11 texture, the downstream - texture needs to be aligned too. - -2020-03-07 16:42:14 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Use aligned resolution for staging texture - Not only any textures for decoder output view, any destination texture - which would be copied from decoder output texture need to be aligned too. - Otherwise driver sometimes crashed/hung (not sure why). - -2020-03-07 18:29:20 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11colorconverter.h: - d3d11colorconverter: Add support cropping - Vertex buffer will be updated if input texture resolution is different - from GstVideoInfo or when an user requests specific crop area. - -2020-03-07 15:10:43 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11bufferpool.c: - d3d11bufferpool: Add padding space for semi-planar YUV formats - Resolution of NV12, P010, and P016 formats must be multiple of two. - Otherwise texture cannot be created. Instead of doing this alignment - per API consumer side, do this in buffer pool for simplicity. - -2020-03-08 16:10:41 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gsth265decoder.h: - * sys/d3d11/gstd3d11h265dec.c: - h265decoder: Pass max_dpb_size to new_sequence vfunc - same as we are doing in h264decoder - -2020-03-08 16:03:35 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11h264dec.c: - d3d11h264dec: Make use of max_dpb_size passed by baseclass - Most likely this modification can save GPU memory. - -2020-02-26 20:24:14 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11h265dec.c: - d3d11h265dec: Fix scaling list parsing - Scaling list can be signalled via sps or pps. Decoder should check - both of them. - -2020-02-26 17:44:52 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11h265dec.c: - d3d11h265dec: Properly signal the ucNumDeltaPocsOfRefRpsIdx - ucNumDeltaPocsOfRefRpsIdx should be the NumDeltaPocsRefRpsIdx. - -2020-02-26 17:33:59 +0900 Seungha Yang <seungha.yang@navercorp.com> - - h265parser: Store NumDeltaPocs of reference for hardware accelerators - That's the value of NumDeltaPocsRefRpsIdx and we might be able to derive - the value from given sps and slice header. - Because well known hardware implementations refer to the value, however, - storing the value makes things easier. - Following is the list of hardware implementations - * DXVA2: ucNumDeltaPocsOfRefRpsIdx - * NVDEC/VDPAU: NumDeltaPocsOfRefRpsIdx - -2020-02-24 20:53:49 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - h265decoder: Fix for output and removal picture from DPB - See C.5.2.2 Output and removal of pictures from the DPB. - If the number of pictures in the DPB is greater than or equal to - sps_max_dec_pic_buffering_minus1HighestTid + 1, then the picture - should be outputted. - -2020-03-06 16:40:50 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecs/meson.build: - meson: codecs: Don't install header - This library is not intended to be public. APIs are likely to - change over time and should not be disclosed to people yet. - -2020-03-05 14:40:28 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - h264decoder: Rename some internals - No more a part of d3d11 implementation - -2020-03-05 14:35:14 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.h: - vp9decoder: Update document - s/GstH264Picture/GstVp9Picture/g and minor update since this baseclass - is no more d3d11 specific one. - -2020-03-05 14:29:22 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gsth265decoder.h: - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.h: - codecs: Change output_picture() to mandatory implementation - GstVideoCodecFrame is expected to be consumed by subclass - per output_picture(). So the implementation cannot be optional. - -2020-03-05 17:23:34 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gsth265decoder.h: - * sys/d3d11/gstd3d11h265dec.c: - h265decoder: Port to nal type classification macro - ... and remove namespaceless macro methods from baseclass - -2020-03-05 15:18:35 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst/videoparsers/gsth265parse.c: - * tests/check/libs/h265parser.c: - h265parser: Add helper macro for nal type classification - Add some macros to remove code duplication and to make it more readable - -2020-03-05 09:17:49 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: Avoid elements name duplication - By just letting GStreamer choose a good name - -2020-03-03 15:21:07 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11: Use gst_video_decoder_get_frame() - Now that the system_frame_number is saved on the pictures we can use - gst_video_decoder_get_frame() helper instead of getting the full list - and looping over it. - -2020-02-14 21:50:15 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264picture.h: - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gsth265picture.h: - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9picture.h: - h264picture: Add system_frame_num - This allow cross-referencing GstH264Picture and GstVideoCodecFrame. - -2020-02-14 21:49:12 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: Add some fixmes - Some of the syntax element do not use the spec name, which makes them harder - to find in the spec. - -2020-02-12 23:48:16 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - codecs: Pass the max_dpb_size to new_segment virtual - On new_segment, the decoder is expected to negotiate. The decoder may want to - pre-allocate the needed buffers. Pass the max_dpb_size as this is needed to - determin how many buffers should be allocated. - -2020-02-09 11:20:16 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/gsth264decoder.h: - * gst-libs/gst/codecs/gsth264picture.h: - * gst-libs/gst/codecs/gsth265decoder.h: - * gst-libs/gst/codecs/gsth265picture.h: - * gst-libs/gst/codecs/gstvp9decoder.h: - * gst-libs/gst/codecs/gstvp9picture.h: - codecs: Add missing auto cleanup funcs - -2020-01-31 17:54:57 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecs/codecs-prelude.h: - * gst-libs/gst/codecs/gsth264decoder.c: - * gst-libs/gst/codecs/gsth264decoder.h: - * gst-libs/gst/codecs/gsth264picture.c: - * gst-libs/gst/codecs/gsth264picture.h: - * gst-libs/gst/codecs/gsth265decoder.c: - * gst-libs/gst/codecs/gsth265decoder.h: - * gst-libs/gst/codecs/gsth265picture.c: - * gst-libs/gst/codecs/gsth265picture.h: - * gst-libs/gst/codecs/gstvp9decoder.c: - * gst-libs/gst/codecs/gstvp9decoder.h: - * gst-libs/gst/codecs/gstvp9picture.c: - * gst-libs/gst/codecs/gstvp9picture.h: - * gst-libs/gst/codecs/meson.build: - * gst-libs/gst/meson.build: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - * sys/d3d11/meson.build: - Move CODEC base classes into it's own library - This introduce a library which contains a set of base classes which - handles the parsing and the state tracking for the purpose of decoding - different CODECs. Currently H264, H265 and VP9 are supported. These - bases classes are used to decode with low level decoding API like DXVA, - NVDEC, VDPAU, VAAPI and V4L2 State Less decoders. The new library is - named gstreamer-codecs-1.0 / libgstcodecs. - -2020-03-05 04:18:03 +1100 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: Don't crash in ICE gathering - Fix a crash collating ICE gathering states if there are - unassociated transceivers in the list with no TransportStream - -2020-03-03 14:56:47 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: add converters before filters - User doesn't have any guarantee about the actual raw format decodebin will - produce so their filters may or may not fit. - Fix #1228 - -2020-03-03 15:21:31 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: fix logs when failing to link filter - - Display caps of the pad we actually tried to link. - - Use the template caps as the filter is likely to not have any caps set - yet. - - Log pad name as well. - -2020-02-21 13:12:39 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: Add seeking support - The approach is quite simple and doesn't take all use cases into account, - it only implements support when we are using the internal timecode we - create ourself. - Also the way we compute the sought frame count is naive, but it works - for simple cases. - -2020-03-03 03:39:50 +1100 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/transportstream.h: - webrtc: Unblock transportreceivebin for send-only bundled streams - If there is any active mline in a bundle, we need to unblock - the transportreceivebin for DTLS setup and RTCP reception, - otherwise no data can ever start flowing. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1206 - -2020-02-29 01:47:52 +1100 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/transportreceivebin.c: - * ext/webrtc/transportreceivebin.h: - webrtc: Remove RECEIVE_STATE_DROP from transportreceivebin - As per discussion in the bug, remove the drop state from transportreceivebin. - Dropping data is necessary, but for bundled config, needs to happen - further downstream after mixed flows have been separated. - Also support switching back to BLOCK from PASS state. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1206 - -2020-02-27 14:54:13 +0100 Dominique Leuenberger <dimstar@opensuse.org> - - * gst-libs/gst/wayland/meson.build: - build: Fix build on systems with wayland-client headers in non-default location - Add a missing dependency to wl_client_dep for the wayland build. Some distros - have the wayland-client headers not installed in /usr/include (which is perfectly - valid, the pkg-config .pc file gives the right feedback). - -2020-03-02 15:22:49 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstvp9decoder.c: - d3d11vp9dec: Add support for reverse playback - This commit moves parsing code for superframe and frame header into - handle_frame() method, and removes parse() implementation from vp9decoder - baseclass. - The combination of - - multiple frames are packed in a given input buffer (i.e., superframe) - - reverse playback - seems to be complicated and also it doesn't work as intended in some case - -2020-03-03 10:49:08 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/gstrtmp2src.c: - rtmp2: Only grab stats on close when connection exists - If the connection attempt failed, self->connection is NULL. - -2020-02-29 12:49:06 +0000 Matthew Read <matthew@ekioh.com> - - * sys/opensles/openslessink.c: - openslessink: Allow openslessink to handle 48kHz streams. - The most common audio sample rate in AV streams is 48kHz, and the most - common device output sample rate is 48kHz. This allows handing of 48kHz - input streams without resampling. - Remove comments about avoiding the use of 48kHz. - -2020-02-27 14:10:16 +0000 Heinrich Kruger <heinrich.kruger@sohonet.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - decklink: Add support for 2K DCI video modes - Extend the video modes supported by the decklink plugin to include 2K - DCI video modes. - -2020-02-27 11:32:17 +0000 Heinrich Kruger <heinrich.kruger@sohonet.com> - - * sys/decklink/linux/DeckLinkAPI.h: - * sys/decklink/linux/DeckLinkAPIConfiguration.h: - * sys/decklink/linux/DeckLinkAPIDeckControl.h: - * sys/decklink/linux/DeckLinkAPIDiscovery.h: - * sys/decklink/linux/DeckLinkAPIDispatch.cpp: - * sys/decklink/linux/DeckLinkAPIModes.h: - * sys/decklink/linux/DeckLinkAPITypes.h: - * sys/decklink/linux/DeckLinkAPIVersion.h: - * sys/decklink/linux/LinuxCOM.h: - * sys/decklink/osx/DeckLinkAPI.h: - * sys/decklink/osx/DeckLinkAPIConfiguration.h: - * sys/decklink/osx/DeckLinkAPIDeckControl.h: - * sys/decklink/osx/DeckLinkAPIDiscovery.h: - * sys/decklink/osx/DeckLinkAPIDispatch.cpp: - * sys/decklink/osx/DeckLinkAPIModes.h: - * sys/decklink/osx/DeckLinkAPIStreaming.h: - * sys/decklink/osx/DeckLinkAPITypes.h: - * sys/decklink/osx/DeckLinkAPIVersion.h: - * sys/decklink/win/DeckLinkAPI.h: - * sys/decklink/win/DeckLinkAPI_i.c: - decklink: Update Decklink SDK to 10.11.4 - This change is needed to support 2K DCI video modes. - Version 10.8 of the Decklink SDK supported DCI video modes for output - only. This updated version drops that restriction. - The current latest version of the Decklink SDK is 11.5, however - the gstreamer decklink plugin is not compatible with API changes - introduced in version 11 of the SDK. Therefore I have opted to upgrade - to the latest 10.x version instead. - -2020-03-03 14:27:32 +1100 Matthew Waters <matthew@centricular.com> - - * ext/dash/meson.build: - dash: add build-dep on pbutils - Fixes dependency issues: - FAILED: subprojects/gst-plugins-bad/ext/dash/8bd0b95@@gstdash@sha/gstdashsink.c.obj - cl @subprojects/gst-plugins-bad/ext/dash/8bd0b95@@gstdash@sha/gstdashsink.c.obj.rsp - C:\builds\ystreet\gst-plugins-base\gst-build\subprojects\gst-plugins-base\gst-libs\gst/pbutils/pbutils.h(30): fatal error C1083: Cannot open include file: 'gst/pbutils/pbutils-enumtypes.h': No such file or directory - -2020-02-18 14:02:14 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/xcb/gstvkwindow_xcb.c: - vulkan/window/xcb: implement keyboard support - -2020-02-17 15:09:58 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/xcb/gstvkwindow_xcb.c: - * gst-libs/gst/vulkan/xcb/xcb_event_source.c: - vulkan/window/xcb: implement mouse event support - -2020-02-17 15:08:47 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vksink.c: - * ext/vulkan/vksink.h: - vulkan/sink: implement GstNavigation support - -2020-02-17 15:07:10 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/gstvkswapper.h: - vulkan/swapper: add get_surface_rectangles - Retrieve the input, output and covered rectangles. - -2020-02-17 15:05:49 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdisplay.c: - * gst-libs/gst/vulkan/gstvkdisplay.h: - vulkan/display: implement thread-safe find_window() - -2020-02-17 15:03:34 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkwindow.c: - * gst-libs/gst/vulkan/gstvkwindow.h: - vulkan/window: add support for mouse/keyboard events - -2020-03-02 20:55:29 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11videosink: Clarify the meaning of various width and height variables - * Remove redundant variables for width/height and par from GstD3D11Window. - GstVideoInfo holds all the values. - * Don't need to pass par to gst_d3d11_window_prepare(). - It will be parsed from caps again - * Remove duplicated math - Fixing regression of the commit 9dada901083fec3276cb2df58785db14b87e8f22 - -2020-02-28 03:08:23 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * sys/d3d11/gstvp9decoder.c: - d3d11vp9dec: Port to GstVP9SuperframeInfo - The vp9parser is now exposed new API for parsing superframe info. - -2020-03-02 00:43:45 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * tests/check/libs/vp9parser.c: - * tests/check/meson.build: - tests: vp9parser: Add test parsing superframe - -2020-02-28 03:06:47 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * gst-libs/gst/codecparsers/gstvp9parser.c: - * gst-libs/gst/codecparsers/gstvp9parser.h: - vp9parser: Add new API for parsing superframe info - Some elements are using their own implementations for superframe parsing. - To reduce redundant code, we need to add API to the parser. - -2020-02-27 18:31:19 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: mark properties as GST_PARAM_MUTABLE_READY - They are all used in the READY to PAUSED transition so should not be - changed after. - -2020-02-27 17:16:45 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: force decoding if a filter is defined - Filter operates on raw data so don't allow decodebin to produce - encoded data if one is defined. - My use case here is keeping the video stream untouched but apply a filter - on the audio one, while keeping the same audio format. - -2020-02-27 17:03:42 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: logs when inserting, or not, a filter - It's not easy atm to figure out from the logs if a filter has actually be - inserted or not. - -2020-02-26 16:13:21 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Do not print warning message if retry count is in expected range - gst_d3d11_result() will print warning message when HRESULT != S_OK. - However, since the retry is trivial stuff, check hr == E_PENDING first - and do not warn it. - -2020-02-26 15:55:23 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Check decoder status report - ... and if h/w decoder reports error, increase error count. - -2020-02-27 18:16:27 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/debugutils/gstfakevideosink.c: - fakevideosink: Align max-lateness/processing-deadline to GstVideoSink - To emulate correctly the timing video of a real sink, let's set those - properties just like a real video sink. - -2020-02-14 01:42:34 +1100 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/nicetransport.c: - * gst-libs/gst/webrtc/dtlstransport.c: - webrtc: Use the dtlssrtenc rtp-sync property - Instead of synchronising at the ICE transport, do clock sync for the - RTP stream at the DTLS transport via the dtlssrtpenc rtp-sync - property. This avoids delaying RTCP while waiting until it is time - to output an RTP packet when rtcp-mux is enabled. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1212 - -2020-02-14 01:38:14 +1100 Jan Schmidt <jan@centricular.com> - - * ext/dtls/gstdtlssrtpenc.c: - * ext/dtls/gstdtlssrtpenc.h: - gstdtlsrtpenc: Add rtp-sync property - Add an rtp-sync property which synchronises RTP streams - to the pipeline clock before passing them to funnel for - merging with RTCP. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1212 - -2020-02-27 11:39:08 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/dash/gstxmlhelper.c: - dash: Don't use sscanf + glib format modifiers - We do not have a way to know the format modifiers to use with string - functions provided by the system. `G_GUINT64_FORMAT` and other string - modifiers only work for glib string formatting functions. We cannot - use them for string functions provided by the stdlib. See: - https://developer.gnome.org/glib/stable/glib-Basic-Types.html#glib-Basic-Types.description - F.ex. - ``` - ../ext/dash/gstxmlhelper.c: In function 'gst_xml_helper_get_prop_unsigned_integer_64': - ../ext/dash/gstxmlhelper.c:473:40: error: unknown conversion type character 'l' in format -Werror=format= - if (sscanf ((gchar *) prop_string, "%" G_GUINT64_FORMAT, - ^~~ - In file included from /builds/nirbheek/cerbero/cerbero-build/dist/windows_x86/include/glib-2.0/glib/gtypes.h:32, - from /builds/nirbheek/cerbero/cerbero-build/dist/windows_x86/include/glib-2.0/glib/galloca.h:32, - from /builds/nirbheek/cerbero/cerbero-build/dist/windows_x86/include/glib-2.0/glib.h:30, - from /builds/nirbheek/cerbero/cerbero-build/dist/windows_x86/include/gstreamer-1.0/gst/gst.h:27, - from ../ext/dash/gstxmlhelper.h:26, - from ../ext/dash/gstxmlhelper.c:22: - /builds/nirbheek/cerbero/cerbero-build/dist/windows_x86/lib/glib-2.0/include/glibconfig.h:69:28: note: format string is defined here - #define G_GUINT64_FORMAT "llu" - ^ - ../ext/dash/gstxmlhelper.c:473:40: error: too many arguments for format -Werror=format-extra-args - if (sscanf ((gchar *) prop_string, "%" G_GUINT64_FORMAT, - ^~~ - ``` - In the process, we're also following the DASH MPD spec more closely - now, which specifies that ranges must follow RFC 2616 section 14.35.1: - https://tools.ietf.org/html/rfc2616#page-138 - -2020-02-26 21:11:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlscertificate.c: - dtls: Set a random serial number and issuer/subject in the self-signed certificates - This is also what Chrome and Firefox are doing, citing privacy concerns. - Also putting OpenWebRTC from Sweden as issuer/subject is rather - confusing. - -2020-02-26 09:08:03 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: consider 'any' as no restriction - gstreamer-rs set 'any' as default restriction which actually means 'no - restriction' so handle it as the absence of restriction. - -2020-02-26 13:11:30 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Set DXGI_PRESENT_ALLOW_TEARING only in fullscreen mode - The DXGI_PRESENT_ALLOW_TEARING flag might cause unexpected tearing - side effect. Setting it in fullscreen mode only seems to be - the correct usage as in the Microsoft's direct3d examples. - -2020-02-25 21:03:06 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/transcode/gsttranscodebin.c: - transcodebin: fix caps leak - encodecaps was leaked if the profile has restrictions. - -2020-02-25 14:58:23 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/gstrtmp2locationhandler.c: - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/gstrtmp2src.c: - * gst/rtmp2/rtmp/rtmpclient.c: - rtmp2: Allow setting flash-version - In case the application has to deal with fussy servers. User agent - sniffing is so last decade. - Adds a property to set the Flash version on both the sink and the src. - The default stays the same (IIRC, Flash plugin for Linux from 2009). - -2020-02-15 04:18:07 +1100 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: Skip unused bits in an SEI. - Alternative approach to 18b54f8d347030c73d8afbeaf55df57aa5acbb96 - that skips all bits in a broken SEI correctly. - -2020-02-12 17:37:46 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - Revert "h265parser: Skip unused SEI bits differently" - This reverts commit 18b54f8d347030c73d8afbeaf55df57aa5acbb96. - -2020-02-11 12:21:29 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * tests/check/libs/h265parser.c: - tests: add picture timing SEI parsing - -2020-02-07 00:13:49 -0800 Dylan Yip <dylan.yip@xilinx.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parse: Fix offset by one error in pic timing SEI - Offset by one error causes a free/malloc error when parsing pic timing - SEI messages. - -2020-02-21 21:02:47 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Ensure the written bitstream buffer size is 128 bytes aligned - DXVA spec is saying that the size of bitstream buffer provided by hardware decoder - should be 128 bytes aligned. And also the host software decoder should - align the size of written buffer to 128 bytes. That means if the slice - (or frame in case of VP9) size is not aligned with 128 bytes, - the rest of non 128 bytes aligned memory should be zero-padded. - In addition to aligning implementation, some variables are renamed - to be more intuitive by this commit. - -2020-02-12 10:24:55 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: libva: Don't set the hint if MFX_VERSION is lower than 1025 - MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET is defined since MFX_VERSION - 1025. - -2020-01-27 15:13:58 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/gstrtmp2src.c: - rtmp2: Expose connection stats as property - Save the stats before we destroy the connection, so we can still - retrieve them afterwards. - -2020-02-14 14:53:46 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpconnection.c: - * gst/rtmp2/rtmp/rtmpconnection.h: - rtmp2: Add gst_rtmp_connection_get_stats and _get_null_stats - The former uses a thread-safe way of getting statistics from the - connection without having to protect the fields with a lock. - The latter produces a zeroed statistics structure for use when no - connection exists. - -2020-02-14 12:34:44 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: Count outgoing bytes and acked bytes - For statistics. - -2020-01-27 16:30:20 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/gstrtmp2sink.c: - rtmp2sink: Add a property for the outgoing chunk size - -2020-02-14 12:34:19 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpconnection.c: - * gst/rtmp2/rtmp/rtmpconnection.h: - rtmp2: Add gst_rtmp_connection_set_chunk_size - -2020-01-27 16:22:20 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: Handle outgoing set chunk/window size properly - Apply outgoing sizes only after writing the chunk to the peer. This is - important particularly for the set chunk size and allows exposing it - without threading issues. - -2020-01-27 14:05:31 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpchunkstream.c: - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: Chunk messages as buffers in loop thread - Move output chunking from gst_rtmp_connection_queue_message into - gst_rtmp_connection_start_write, which effectively moves it from the - streaming thread into the loop thread. - This allows us to handle the outgoing chunk-size message (which is - generated by changing the future chunk-size property) properly, which - could come from any other thread. - -2020-02-12 16:55:15 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: Consistently use GstBuffer for RTMP chunks - -2020-02-12 16:47:30 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpchunkstream.c: - * gst/rtmp2/rtmp/rtmpchunkstream.h: - rtmp2: Add gst_rtmp_chunk_stream_serialize_all - Serializes an RTMP message into a series of chunks, all in one buffer. - Similar to what gst_rtmp_connection_queue_message does to serialize - into a GByteArray. - -2020-02-12 16:43:30 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmputils.c: - * gst/rtmp2/rtmp/rtmputils.h: - rtmp2: Add gst_rtmp_output_stream_write_all_buffer_async - Similar to gst_rtmp_output_stream_write_all_bytes_async, but takes a - GstBuffer instead of a GBytes. It can also return the number of bytes - written, which might be lower in case of an error. - -2020-02-14 12:28:43 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpchunkstream.c: - * gst/rtmp2/rtmp/rtmpchunkstream.h: - * gst/rtmp2/rtmp/rtmpclient.c: - * gst/rtmp2/rtmp/rtmpconnection.c: - * gst/rtmp2/rtmp/rtmpconnection.h: - rtmp2: Improve handling incoming set chunk/window size - Reject out-of-spec sizes and warn about suspiciously small sizes. - -2020-02-14 14:26:27 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/gstrtmp2src.c: - rtmp2: Lock self->lock before OBJECT_LOCK - OBJECT_LOCK is used to protect property access only. self->lock is - used to access the RtmpConnection, mostly between the streaming thread - and the loop thread. - To avoid deadlocks involving these two locks, we obey a lock order: - If both self->lock and OBJECT_LOCK are needed, self->lock must be locked - first. Clarify this. - -2020-02-14 12:20:32 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpchunkstream.c: - * gst/rtmp2/rtmp/rtmpmessage.h: - rtmp2: Reject oversized messages - We only have 24 bits for the size, so reject anything larger. - -2020-02-14 11:49:23 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: Count in_bytes_acked instead of in_bytes_unacked - This is nicer for statistics. - -2020-02-12 18:27:56 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: rtmpconnection: Use more appropriate size types - - guint32 for chunk size and window size - - guint64 for running counters - -2020-02-12 16:55:45 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: Add a g_return_val_if_fail - -2020-02-12 16:49:45 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: Replace explicit unref with g_main_context_invoke_full - -2020-01-27 15:27:28 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: rtmpconnection: Use GST_*_OBJECT logging - GstRtmpConnection isn't a GstObject with a name or path, but we still - get the GObject's type and address. - -2020-02-21 11:33:35 +0100 Marc Leeman <m.leeman@televic.com> - - * gst/rist/gstristsink.c: - rist: fix two minor memory leaks - -2020-02-19 17:07:35 +0100 Marc Leeman <m.leeman@televic.com> - - * gst/rtp/gstrtpsink.c: - rtpmanagerbad: fix two minor memory leaks - -2020-02-19 17:07:23 +0100 Marc Leeman <m.leeman@televic.com> - - * gst/rtp/gstrtpsink.c: - rtpmanagerbad: reduce lock in rtpsink - -2020-02-19 17:06:18 +0100 Marc Leeman <m.leeman@televic.com> - - * gst/rtp/gstrtpsrc.c: - rtpmanagerbad: documentation comment fix - -2020-02-21 03:39:14 +1100 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/transportsendbin.c: - webrtc: Configure transportsendbin latency internally - Add latency configuration logic to transportsendbin to - isolate it from the overall pipeline latency. That means that - it configures minimum latency internally based on the - latency query, and sends a latency event upstream that - matches. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1209 - -2020-02-20 16:19:09 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Add padding space on decoder output view when it's not aligned - Most H/W decoders have required alignment and dxva is also the case. - -2020-02-15 01:23:32 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h264dec.h: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11h265dec.h: - * sys/d3d11/gstd3d11vp9dec.c: - * sys/d3d11/gstd3d11vp9dec.h: - * sys/d3d11/plugin.c: - d3d11decoder: Register elements per GPU device with capability check - This implementation is similar to what we've done for nvcodec plugin. - Since supported resolution, profiles, and formats are device dependent ones, - single template caps cannot represent them, so this modification - will help autoplugging and fallback. - Note that the legacy gpu list and list of resolution to query were - taken from chromium's code. - -2020-02-17 15:04:28 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - d3d11device: Fix typo - s/vender/vendor - -2020-02-14 20:27:28 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - d3d11device: Adjust debug level for when _new() fails - gst_d3d11_device_new might be used to enumerate device. - -2020-02-06 16:39:06 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkswapper.c: - vkswapper: keep a reference on the input buffer until present is finished - Otherwise, there may be a very small period of time where the buffer can - be freed while being presented. - -2020-02-14 12:52:30 +1100 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: Merge ICE candidates to local descriptions - When emitting ICE candidates, also merge them to the local and - pending description so they show up in the SDP if those are - retrieved from the current-local-description and - pending-local-description properties. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/676 - -2020-02-16 17:11:29 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Ensure upload staging texture to fallback render texture - gst_video_frame_copy will copy input frame to stating texture - of fallback frame. Then, we need to map fallback texture with GST_MAP_D3D11 - flag to upload the staging texture to render texture. Otherwise - the render texture wouldn't be updated. - -2020-02-13 21:19:37 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Fix copying decoder view to staging - Source texture (decoder view) might be larger than destination (staging) texture. - In that case, D3D11_BOX structure should be passed to CopySubresourceRegion method - in order to specify the exact target area. - -2020-02-12 17:50:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/transportreceivebin.c: - webrtcbin: Block the source pads before dtlssrtpdec inside transportreceivebin - Otherwise dropped sticky events are not actually re-sent on the next - opportunity and we can end up with data-flow before stream-start/segment - events. - -2020-02-06 19:40:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/sctpassociation.c: - sctp: Take some socket configurations from Firefox's datachannel code - - Do not send ABORTs for unexpected packets are as response to INIT - - Enable interleaving of messages of different streams - - Configure 1MB send and receive buffer for the socket - - Enable SCTP_SEND_FAILED_EVENT and SCTP_PARTIAL_DELIVERY_EVENT events - - Set SCTP_REUSE_PORT configuration - - Set SCTP_EXPLICIT_EOR and the corresponding send flag. We probably - want to split packets to a maximum size later and only set the flag - on the last packet. Firefox uses 0x4000 as maximum size here. - - Enable SCTP_ENABLE_CHANGE_ASSOC_REQ - - Disable PMTUD and set an maximum initial MTU of 1200 - -2020-02-06 18:43:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/sctpassociation.c: - * ext/sctp/sctpassociation.h: - sctp: Start connection synchronously when starting the association - Calling bind() only sets up some data structures and calling connect() - only produces one packet before it returns. That packet is stored in a - queue that is asynchronously forwarded by the encoder's source pad loop, - so not much is happening there either. Especially no waiting is - happening here and no forwarding of data to other elements. - This fixes a race condition during connection setup: the connection - would immediately fail if we pass a packet from the peer to the socket - before bind() and connect() have returned. - This can't happen anymore as bind() and connect() have returned already - before both elements reach the PAUSED state, and in webrtcbin there is - an additional blocking pad probe before the decoder that does not let - any data pass through before that anyway. - -2020-02-06 16:42:01 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/sctpassociation.c: - * ext/sctp/sctpassociation.h: - sctp: Switch back to a non-recursive mutex and don't hold it while calling any usrsctp functions - The library is thread-safe by itself and potentially calls back into our - code, not only from the same thread but also from other threads. This - can easily lead to deadlocks if we try to hold our mutex on both sides. - -2020-02-12 22:29:31 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11window: Fix for broken dirty rect drawing on Windows 7 - DXGI_SWAP_EFFECT_DISCARD cannot be used with dirty rect drawing feature - of IDXGISwapChain1::Present(). - Note that IDXGISwapChain1 interface is available on Platform Update for Windows 7 - and DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL is also the case. - -2020-02-11 13:12:33 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Fix for dxva decoder output view rendering - Use resolution specified in caps for input_rect instead of - passed width and height value. The width and height might be modified - ones by d3d11videosink, then frame resolution might be different. - -2020-02-05 21:27:23 +0900 Seungha Yang <seungha.yang@navercorp.com> - - d3d11decoder: Refactor decoding process - * Move decoding process to handle_frame - * Remove GstVideoDecoder::parse implementation - * Clarify flush/drain/finish usage - In forward playback case, have_frame() call will be followed by - handle_frame() but reverse playback is not the case. - To ensure GstVideoCodecFrame, the decoding process should be placed inside - of handle_frame(), instead of parse(). - Since we don't support alignment=nal, the parse() implementation is not worth. - In order to fix broken reverse playback, let's remove the parse() - implementation and revisit it when adding alignment=nal support. - -2020-01-30 20:04:58 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h264dec.h: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11h265dec.h: - * sys/d3d11/gstd3d11vp9dec.c: - * sys/d3d11/gstd3d11vp9dec.h: - * sys/d3d11/gsth264decoder.c: - * sys/d3d11/gsth265decoder.c: - * sys/d3d11/gstvp9decoder.c: - d3d11decoder: Move handle_frame implementation to baseclass - ... and remove unused start, stop method from subclass. - Current implementation does not require subclass specific behavior - for the handle_frame() method. - -2020-02-05 18:20:57 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Remove max size condition from pool - Actually our buffer pool size and the number of backbuffer are - independent. In case of reverse playback, upstream might request - a lot of buffers (up to GOP size). - -2020-02-12 00:00:51 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh265enc.c: - nvcodec: Mark class data as may-be-leaked to quiet the leaks tracer - The class data with the caps in it will be leaked if the element is - registered but never instantiated. There is no way around this. Mark - the caps as such so that the leaks tracer does not warn about it. - This is the same as pad template caps getting leaked, which are also - marked as may-be-leaked. These objects are initialized exactly once, - and are 'global' data. - -2020-02-08 12:05:03 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - * ext/wpe/gstwpesrc.cpp: - * ext/wpe/meson.build: - wpe: Add software rendering support support - Starting from WPEBackend-FDO 1.6.x, software rendering support is available. - This features allows wpesrc to be used on machines without GPU, and/or for - testing purpose. To enable it, set the `LIBGL_ALWAYS_SOFTWARE=true` environment - variable and make sure `video/x-raw, format=BGRA` caps are negotiated by the - wpesrc element. - -2020-02-11 12:15:09 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/fluidsynth/gstfluiddec.c: - fluiddec: Move logging init into plugin_init - This is a nicer place to keep it. We also initialize it before touching - the drivers. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/1026 - -2020-02-05 11:17:33 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/fluidsynth/gstfluiddec.c: - fluiddec: Keep fluidsynth from probing audio drivers - It might cause problems and we don't need the drivers anyway. This also - avoids a bunch of stderr spam from the drivers. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/1026 - -2020-02-05 11:17:32 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/fluidsynth/gstfluiddec.c: - fluiddec: Avoid deprecated fluid_synth_set_sample_rate - This function is used to change the rate at runtime, which has issues: - https://github.com/FluidSynth/fluidsynth/issues/585 - Use the settings key instead (which already defaults to 44100, but I did - test other rates). - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/1026 - -2020-01-22 16:20:28 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/mpegtsparse.h: - tsparse: Add split-on-rai property - If set, buffers sized smaller than the alignment will be sent so that - RAI packets are at the start of a new buffer. - Fixes: #1190 - -2020-02-06 14:29:13 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/transportreceivebin.c: - * ext/webrtc/transportsendbin.c: - webrtc: In all blocking pad probes except for sink pads also handle serialized events - Otherwise it can happen that e.g. the stream-start event is tried to be - sent as part of pushing the first buffer. Downstream might not be in - PAUSED/PLAYING yet, so the event is rejected with GST_FLOW_FLUSHING and - because it's an event would not cause the blocking pad probe to trigger - first. This would then return GST_FLOW_FLUSHING for the buffer and shut - down all of upstream. - To solve this we return GST_PAD_PROBE_DROP for all events. In case of - sticky events they would be resent again later once we unblocked after - blocking on the buffer and everything works fine. - Don't handle events specifically in sink pad blocking pad probes as here - downstream is not linked yet and we are actually waiting for the - following CAPS event before unblocking can happen. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1172 - -2020-02-06 14:27:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/sctptransport.h: - webrtcbin: Add a blocking pad probe for the receivebin -> sctpdec connection - Without this it might happen that received data from the DTLS transport - is already passed to sctpdec before its state was set to PLAYING. This - would cause the data to be dropped, GST_FLOW_FLUSHING to be returned and - the whole DTLS transport to shut down. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1172 - among other things. - -2020-02-06 14:24:41 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/transportreceivebin.c: - * ext/webrtc/transportreceivebin.h: - webrtcbin/transportreceivebin: Use actual pad blocks instead of an additional GCond for blocking pads - Using a GCond can easily lead to deadlocks and only duplicates the - waiting code from gstpad.c in the best case. - In this case it actually could lead to a deadlock if both RTP and RTCP - were waiting. Only one of them would be woken up because g_cond_signal() - was used instead of g_cond_broadcast(). - -2020-02-06 14:22:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/transportsendbin.c: - webrtc/transportsendbin: Clean up pad probe removal - We already have a helper function for this so just use it instead of - duplicating it. - -2020-01-15 16:02:11 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkvp9enc.c: - * sys/msdk/gstmsdkvp9enc.h: - * sys/msdk/meson.build: - msdkvp9enc: output raw vp9 stream instead of IVF stream - video/x-vp9 is required in the src pad, however the output includes a - IVF header, which makes the pipeline below doesn't work - gst-launch-1.0 videotestsrc ! msdkvp9enc ! msdkvp9dec ! fakesink - Since mfx 1.26, the VP9 encoder supports bitstream without IVF header, - so in this patch, the mfx version is checked and msdkvp9enc is enabled - only if mfx 1.26+ is available - -2020-01-31 02:01:12 +1100 Jan Schmidt <jan@centricular.com> - - * sys/androidmedia/gstamcvideoenc.c: - * sys/androidmedia/gstamcvideoenc.h: - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - androidmedia: Support float i-frame-interval - Android 25 added support for i-frame-interval to be a floating - point value. Store the property as a float and use the newer - version when it's available. - -2020-01-31 01:33:51 +1100 Jan Schmidt <jan@centricular.com> - - * sys/androidmedia/gstamc-codec.h: - * sys/androidmedia/gstamcvideoenc.c: - * sys/androidmedia/gstamcvideoenc.h: - * sys/androidmedia/jni/gstamc-codec-jni.c: - * sys/androidmedia/magicleap/gstamc-codec-ml.c: - androidmedia: Allow dynamic bitrate changes on Android >= 19 - Android 19 added an API for dynamically changing the bitrate in a running - codec. - Also make it so that even when not update-able at runtime, parameters will at least - be stored so that they take effect the next the codec is restarted. - -2020-01-31 01:21:34 +1100 Jan Schmidt <jan@centricular.com> - - * sys/androidmedia/gstamc-codec.h: - * sys/androidmedia/gstamcvideoenc.c: - * sys/androidmedia/jni/gstamc-codec-jni.c: - * sys/androidmedia/magicleap/gstamc-codec-ml.c: - androidmedia: Handle force-keyunit requests - Use API from Android 19 to request a keyframe from the MediaCodec - when indicated by the base class. - -2020-02-05 21:13:49 +1100 Jan Schmidt <jan@centricular.com> - - * sys/androidmedia/jni/gstamc-codec-jni.c: - androidmedia: Permit Codec surface to be NULL - The AMC encoder wrapper doesn't support input surfaces yet, - and passes NULL when configuring the underlying codec. - This was broken in commit 7fcf3e - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1102 - -2020-01-24 10:58:32 -0800 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpaafdepay.c: - avtp: Build with clang - Minor non-conformity on AVTP code made it not compile with clang. - -2020-01-24 15:47:56 -0800 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpaafpay.c: - * ext/avtp/gstavtpcvfdepay.c: - * ext/avtp/gstavtpcvfpay.c: - * tests/check/elements/avtpaafdepay.c: - * tests/check/elements/avtpaafpay.c: - * tests/check/elements/avtpcvfdepay.c: - * tests/check/elements/avtpcvfpay.c: - avtp: Plug several leaks - After finally running tests with valgrind enabled, some leaks were found - - both on code and on tests themselves. This patch plugs them all! - -2020-02-07 13:24:53 +0000 Ludvig Rappe <ludvig.rappe@axis.com> - - * ext/curl/gstcurlhttpsink.c: - gstcurlhttpsink: Update HTTP header for curl 7.66 - Change how content-length is set for HTTP POST headers, letting curl set - the header (given the content-length) instead of manually writing it. - This enables curl to know the content-length of the data. - In curl 7.66, if curl does not know the content-length (e.g. when - manually writing the header) curl will use Transfer-Encoding: chunked, - which might not be desired. - -2020-01-20 15:22:26 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/nvcodec/gstnvdec.c: - nvcodec: Fix crash in decoder on 32-bit Windows - Same fix as 1a7ea45ffde40a4bea63562a2cc9892396d9f7eb, but I didn't - test the decoder so I missed that the function pointers here weren't - using the correct calling convention too. - -2020-02-05 16:12:28 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/ladspa/gstladspautils.c: - ladspa: only multiply bounded rate properties by sample rate - We don't want to accidentally multiply G_MAXFLOAT or -GMAXFLOAT - with the sample rate. - -2020-02-05 16:03:06 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/ladspa/gstladspautils.c: - ladspa: fix unbounded integer properties - Use a double instead of a plain float for intermediary - property values, so we have enough bits to store INT_MAX - and it doesn't get rounded and wrapped to -1 when cast - back to a 32-bit integer. - Fixes criticals like - g_param_spec_int: assertion 'default_value >= minimum && default_value <= maximum' failed - when loading LADSPA plugins from the Linux Studio Plugins - Project (http://lsp-plug.in) in GStreamer. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1194 - -2019-10-04 11:39:10 -0700 Andre Guedes <andre.guedes@intel.com> - - * ext/avtp/gstavtp.c: - * ext/avtp/gstavtpsink.c: - * ext/avtp/gstavtpsink.h: - * ext/avtp/meson.build: - avtpsink: Implement synchronization mechanism - The avtpsink element is expected to transmit AVTPDUs at specific times, - according to GstBuffer timestamps. Currently, the transmission time is - controlled in software via the rendering synchronization mechanism - provided by GstBaseSink class. However, that mechanism may not cope with - some AVB use-cases such as Class A streams, where AVTPDUs are expected - to be transmitted at every 125 us. Thus, this patch introduces avtpsink - own mechanism which leverages the socket transmission scheduling - infrastructure introduced in Linux kernel 4.19. When supported by the - NIC, the transmission scheduling is offloaded to the hardware, improving - transmission time accuracy considerably. - To illustrate that, a before-after experiment was carried out. The - experimental setup consisted in 2 PCs with Intel i210 card connected - back-to-back running an up-to-date Archlinux with kernel 5.3.1. In one - host gst-launch-1.0 was used to generate a 2-minute Class A stream while - the other host captured the packets. The metric under evaluation is the - transmission interval and it is measured by checking the 'time_delta' - information from ethernet frames captured at the receiving side. - The table below shows the outcome for a 48 kHz, 16-bit sample, stereo - audio stream. The unit is nanoseconds. - | Mean | Stdev | Min | Max | Range | - -------+--------+---------+---------+---------+---------+ - Before | 125000 │ 2401 │ 110056 │ 288432 │ 178376 | - After | 125000 │ 18 │ 124943 │ 125055 │ 112 | - Before this patch, the transmission interval mean is equal to the - optimal value (Class A stream -> 125 us interval), and it is kept the - same after the patch. The dispersion measurements, however, had - improved considerably, meaning the system is now consistently - transmitting AVTPDUs at the correct time. - Finally, the socket transmission scheduling infrastructure requires the - system clock to be synchronized with PTP clock so this patches modifies - the AVTP plugin documentation to cover how to achieve that. - -2019-10-04 11:17:22 -0700 Andre Guedes <andre.guedes@intel.com> - - * ext/avtp/gstavtpsink.c: - avtpsink: Prepare code to new synchronization mechanism - This patch refactors gst_avtp_sink_start() by moving all socket - initialization code to its own function. This change prepares the code - to the next patch which will introduce avtpsink's own rendering - synchronization mechanism. - -2019-10-04 11:11:23 -0700 Andre Guedes <andre.guedes@intel.com> - - * ext/avtp/gstavtpsink.c: - avtpsink: Remove SOCK_NONBLOCK from avtpsink - Current avtpsink code opens the AF_PACKET socket with SOCK_NONBLOCK - option. However, we actually want sendto() to block in case there isn't - available space in socket buffer. - -2019-10-04 10:56:30 -0700 Andre Guedes <andre.guedes@intel.com> - - * ext/avtp/gstavtpsink.c: - * ext/avtp/gstavtpsrc.c: - avtp: Refactor if_index code - This patch refactors both avtpsink and avtpsrc code so we use the - if_nametoindex() helper instead of building a request and issuing an - ioctl to get the if_index. - -2020-02-05 22:12:15 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.cpp: - d3d11window: Clear cached buffer per new caps - d3d11window holds one buffer to redraw client area per resize event. - When the input format is being changed, this buffer should be cleared - to avoid mismatch beween newly configured shader/videoprocessor and - the format of previously cached buffer. - -2020-02-04 11:31:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Don't leak template caps when registering elements with old NVIDIA driver - -2020-02-03 22:23:21 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Use consistent resolution between output caps and video meta - h264/h265 decoded buffer might have crop area then we need to - adjust video meta based on the padding space - -2020-02-03 21:55:55 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11bufferpool.c: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - d3d11memory: Add a method to specify padding space - -2020-02-01 17:38:29 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Add support for zero-copy playback - When downstream support d3d11 memory with forward playback case, - expose decoder output view memory objects without copying. - -2020-02-04 01:00:00 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Create decoder output view whenever it's required - Whatever the reason, buffer in pool might be freed then we need to - configure decoder output views again. - -2020-02-04 00:55:24 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Need to zero initilized for g_once - A vairable to be used for g_once, it should be zero initialized - -2020-01-30 18:11:52 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11bufferpool.c: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - d3d11allocator: Work as if buffer pool when running on texture array mode - Because the size of texture array cannot be updated dynamically, - allocator should block the allocation request. This cannot be - done at buffer pool side if this d3d11 memory is shared among - multiple buffer objects. Note that setting NO_SHARE flag to - d3d11 memory is very inefficient. It would cause most likey - copy of the d3d11 texture. - -2020-01-31 00:17:13 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Fix fallback buffer copy - Since we don't use dynamic texture now, cpu access to the fallback - texture should not happen. - -2020-01-30 21:12:31 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - d3d11window: Don't create swapchain again per caps change - Creating swapchain is relatively heavy operation. If output dxgi format - is not being chagned, we don't need to destroy and create swachain again. - -2020-01-10 21:45:43 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - * sys/d3d11/gstd3d11window_corewindow.cpp: - * sys/d3d11/gstd3d11window_swapchainpanel.cpp: - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11window: Invoke initial resize method from baseclass - ... instead of calling from subclass in order for baseclass to handle - more things between swapchain creation and resource creation. - -2020-01-29 21:10:00 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosink.h: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - d3d11videosink: Use ID3D11VideoProcessor interface - ...for color space conversion if available - ID3D11VideoProcessor is equivalent to DXVA-HD video processor - which might use specialized blocks for video processing - instead of general GPU resource. In addition to that feature, - we need to use this API for color space conversion of DXVA2 decoder - output memory, because any d3d11 texture arrays that were - created with D3D11_BIND_DECODER cannot be used for shader resource. - This is prework for d3d11decoder zero-copy rendering and also - for conditional HDR tone-map support. - Note that some Intel platform is known to support tone-mapping - at the driver level using this API on Windows 10. - -2020-01-10 23:54:43 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11videoprocessor.c: - * sys/d3d11/gstd3d11videoprocessor.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Add video processor object - ID3D11VideoProcessor interface provides various image conversion - methods. Note that it's analogous to VAAPI VPP. - -2020-01-29 17:29:04 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11format.c: - * sys/d3d11/gstd3d11format.h: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - d3d11format: Add util methods for mapping DXGI color space with ours - Move color space mapping and hdr10 metadata conversion methods to - d3d11format in order to reuse the code. - -2020-02-01 19:18:44 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/fdkaac/gstfdkaacdec.c: - fdkaacdec: add support for mpegversion=2 - Fix for #1199 - -2020-01-29 18:55:55 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvenc.c: - nvenc: Query maximum supported API version - We've been using NvEncodeAPICreateInstance method to find the supported API - version, but that seems to be insufficient since there is a case - where plugin failed in opening encoding session even if NvEncodeAPICreateInstance - succeeded. Asking driver about the version would be the most certain way. - -2020-01-31 17:25:08 -0800 Thiago Santos <thiago@mode.net> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: check if connections are available on media entry before get - Otherwise we trigger an assert. - -2020-02-01 01:37:08 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/transportreceivebin.c: - webrtcbin: fix blocking of receive bin - The receive bin should block buffers from reaching dtlsdec before - the dtls connection has started. - While there was code to block its sinkpads until receive_state - was different from BLOCK, nothing was ever setting it to BLOCK - in the first place. This commit corrects this by setting the - initial state to BLOCK, directly in the constructor. - In addition, now that blocking is effective, we want to only - block buffers and buffer lists, as that's what might trigger - errors, we want to still let events and queries go through, - not doing so causes immediate deadlocks when linking the - bin. - -2020-01-31 09:47:59 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Fix crash with force-modesetting=1 - This is a master regression, we would allocate a bo without having - created the allocator yet. As of now, we lazily create the allocator. - -2020-01-31 08:33:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/sctpassociation.c: - sctpassociation: Add missing return to prevent double unlock - -2020-01-30 17:29:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/gstsctpenc.c: - * ext/sctp/sctpassociation.c: - * ext/sctp/sctpassociation.h: - sctpenc: Report errors when sending out data and the association is in error or disconnected state - -2020-01-30 17:21:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/gstsctpenc.c: - * ext/sctp/sctpassociation.c: - sctp: Clean up association state handling and go into error/disconnected state in more circumstances - -2020-01-30 16:28:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/sctpassociation.c: - sctpassociation: Use GStreamer logging system instead of g_warning() and g_log() - -2020-01-30 16:13:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/gstsctpdec.c: - * ext/sctp/gstsctpenc.c: - sctp: Add more logging to the encoder/decoder elements on data processing - And convert g_warning()s into normal log output instead. - -2020-01-30 16:11:57 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/gstsctpenc.c: - * ext/sctp/sctpassociation.c: - sctpenc: Correctly log/handle errors and handle short writes - -2020-01-30 16:09:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/gstsctpdec.c: - * ext/sctp/sctpassociation.c: - * ext/sctp/sctpassociation.h: - sctp: Constify buffers in callbacks and functions - And free data with the correct free() function in the receive callback - by passing it to gst_buffer_new_wrapped_full() instead of - gst_buffer_new_wrapped(). - -2020-01-30 16:06:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/gstsctpdec.c: - * ext/sctp/gstsctpenc.c: - * ext/sctp/sctpassociation.c: - * ext/sctp/sctpassociation.h: - sctp: Make receive/packetout callbacks thread-safe - -2020-01-30 16:00:33 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/gstsctpdec.c: - * ext/sctp/gstsctpenc.c: - sctp: Add logging and missing cleanup on errors when creating pads - -2020-01-30 15:59:12 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/gstsctpenc.c: - sctpenc: Use g_signal_emit() instead of g_signal_emit_by_name() - We have all the required information around so make use of it. - -2020-01-30 15:58:30 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/gstsctpenc.c: - * ext/sctp/gstsctpenc.h: - sctpenc: Propagate downstream flow errors upstream - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1180 - -2020-01-30 15:56:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/gstsctpdec.c: - * ext/sctp/gstsctpdec.h: - sctpdec: Use a flow combiner for the source pad flow returns and propagate errors upstream - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1180 - -2020-01-17 17:44:34 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/mpegtsparse.c: - mpegtsparse: Moved dispose function into finalize - dispose can be called several times and would double-free the flow - combiner in that case. - -2020-01-22 13:55:58 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/mpegtsparse.h: - mpegtsparse: Added alignment property - alignment works like in mpegtsmux, joining several MpegTS packets into - one buffer. Default value of 0 joins as many as possible for each - incoming buffer, to optimise CPU usage. - -2020-01-10 18:00:07 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/mpegtsparse.c: - mpegtsparse: Set delta unit flag on non-random-access buffers - If they don't have the random access flag set, they cannot be decoded - independently. - -2020-01-10 17:58:34 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/mpegtsparse.c: - mpegtsparse: Packetize output on default srcpad - Align buffer boundaries with mpeg-ts packets, instead of keeping - whatever packetization we have from the source (network, file reading). - -2020-01-10 17:54:54 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/mpegtsparse.c: - mpegtsparse: Factor common code into mpegts_packet_to_buffer - The same code was used twice for turning an MpegTSPacketizerPacket into - a GstBuffer. - -2020-01-10 17:52:58 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtspacketizer: Fix typo in flag name - -2020-01-29 14:10:06 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: Fix GstMsdkContext leak - -2020-01-29 14:02:09 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvpp.c: - msdk: Clear reference counted object in dispose() method - Follow GObject's memory management model - -2020-01-28 13:06:59 +0100 Guillermo Rodríguez <guille.rodriguez@gmail.com> - - * ext/wayland/wlwindow.c: - waylandsink: Clear window when pipeline is stopped - When a pipeline is stopped (actually when the waylandsink element - state changes from PAUSED to READY) the video surface is cleared, but - the opaque black surface behind is not. Fix this by actually clearing - both surfaces. - -2020-01-09 22:23:17 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - msdk: use cached response for DMABuf when the frame size is same - User is seeing corrupted display when running `videotestsrc ! - video/x-raw,format=NV12,width=xxx,height=xxx ! msdkh265enc ! msdkh265dec - ! glimagesink` with changed frame size, e.g. from 1920x1080 to 1920x240 - The root cause is a same dmabuf fd is used for frames with - different size, which causes some unexpected result. This patch requires - cached response is used for frames with same size only for DMABuf, so a - dmabuf fd can't be used for frames with different size any more. - -2020-01-25 18:39:52 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window_win32.cpp: - d3d11window_win32: Let DXGI choose client area - Don't specify the resolution of backbuffer. Then dxgi will let us know the - actual client area. When upstream resolution is chagned, updating the size - of backbuffer without the consideration for client size would cause mismatch - between them. - -2020-01-23 11:01:33 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Do not map GStreamer discont to CUVid discont - Setting the CUVID_PKT_DISCONTINUITY implies clearing any past information - about the stream in the decoder. The GStreamer discont flag is used for - discontinuity caused by a seek, for first buffer and if a buffer was - dropped. In the first two cases, the parsers and demuxers should ensure we - start from a synchronization point, so it's unlikely that delta will be - matched against the wrong state. - For packet lost, the discontinuity flag will prevent the decoder from doing - any concealment, with a result that ca be much worst visually, or freeze the - playback until an IDR is met. It's better to let the decoder handle that for - us. - Removing this flag, also workaround a but in NVidia parser that makes it - ignore our ENDOFFRAME flag and increase the latency by one frame. - -2020-01-22 10:26:02 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - nvdec: Tell the parser we have complete pictures - This sets the CUVID_PKT_ENDOFPICTURE flag in order to inform the decoder that - we have a complete picture. This should remove one frame latency otherwise - introduce by NVidia parser. - -2020-01-23 18:08:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstccconverter.c: - * tests/check/elements/ccconverter.c: - ccconverter: Fill remainder of the cc_data in CDP packets with empty packets - Instead of filling it completely with zeroes. Filling with zeroes is - considered invalid by various CC implementations. - -2020-01-21 21:25:28 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window_corewindow.cpp: - d3d11window_corewindow: Always call methods of CoreWindow interface from UI thread - Like swapchain panel implementation, most methods of CoreWindow - should be called from UI thread. - -2020-01-21 16:50:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Update the last_ts correctly if we have no DTS - If we have no DTS but a PTS then this means both are the same, and we - should update the last_ts with the PTS. Only if both are unknown then we - don't know the current position and should not update it at all. - Previously we would always update the last_ts to GST_CLOCK_TIME_NONE if - the DTS is unknown, which caused the position to jump around and to - cause spurious gap events to be sent. - -2020-01-21 15:14:08 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvpp.c: - msdk: Fix compiler warning - This patch fixed compiler warning below: - 1/4 Compiling C object 'sys/msdk/dc44ea0@@gstmsdk@sha/gstmsdkvpp.c.o'. - ../../gst-plugins-bad/sys/msdk/gstmsdkvpp.c: In function - ‘gst_msdkvpp_context_prepare’: - ../../gst-plugins-bad/sys/msdk/gstmsdkvpp.c:214:7: warning: suggest - parentheses around operand of ‘!’ or change ‘&’ to ‘&&’ or ‘!’ to ‘~’ - -Wparentheses - -2020-01-21 12:14:49 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: connect rtp funnel after updating ptmaps - We need the streams' pt maps updated before requesting pads - on rtpbin, because this is what will trigger the requesting - of FEC encoders, and our handler for this request looks for - the payload types in the relevant stream's pt map. - Fixes #1187 - -2020-01-20 16:35:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: Send gap events for late streams whenever updating the SCR - Instead of doing it on each packet and doing it based on the distance to - the previous SCR instead of based on the DTS. - Previously we would send gap events for audio all the time if the SCR - distance was 400ms because the threshold for audio is 300ms and by only - ever updating the position when the SCR updates we would always be 100ms - above the threshold and send needless gap events. - This fixes audio glitches on various files caused by gap events. - -2020-01-16 13:00:33 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - nvenc: Do not access to broken encode session - If an encode session failed in initializing, the encode - session would be broken and the next nvenc API will cause crash. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1179 - -2020-01-17 11:07:47 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/msdk/gstmsdkcontextutil.c: - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - msdk: Fix increasing memory usage in dynamic pipelines - Our context is non-persistent, and we propagate it throughout the - pipeline. This means that if we try to reuse any gstmsdk element by - removing it from the pipeline and then re-adding it, we'll clone the - mfxSession and create a new gstmsdk context as a child of the old one - inside `gst_msdk_context_new_with_parent()`. - Normally this only allocates a few KB inside the driver, but on - Windows it seems to allocate tens of MBs which leads to linearly - increasing memory usage for each PLAYING->NULL->PLAYING state cycle - for the process. The contexts will only be freed when the pipeline - itself goes to `NULL`, which would defeat the purpose of dynamic - pipelines. - Essentially, we need to optimize the case in which the element is - removed from the pipeline and re-added and the same context is re-set - on it. To detect that case, we set the context on `old_context`, and - compare it to the new one when preparing the context. If they're the - same, we don't need to do anything. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/946 - -2020-01-17 10:43:11 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/msdk/gstmsdkcontextutil.c: - * sys/msdk/gstmsdkcontextutil.h: - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvpp.c: - msdk: Reorganize context preparation code - Split it out into a separate function with early exits to make the - flow clearer, and document what the function is doing clearly. - No functional changes. - -2020-01-17 10:13:49 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvpp.c: - msdk: Fix warning about unused variable on Windows - -2020-01-17 13:45:35 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvpp.c: - msdk: Use gst_clear_object() - `gst_object_replace()` is not supposed to be used for unreffing and - NULLing objects. - -2020-01-20 16:27:30 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/nvcodec/gstnvenc.c: - nvcodec: Print debug info when initializing nvenc - We weren't printing the return value. - -2020-01-20 15:22:26 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/nvcodec/gstcudaloader.c: - * sys/nvcodec/gstcudaloader.h: - * sys/nvcodec/gstcuvidloader.c: - * sys/nvcodec/gstcuvidloader.h: - * sys/nvcodec/stub/cuda.h: - nvcodec: Fix crash on 32-bit Windows - We weren't using the correct calling convention when calling CUDA and - CUVID APIs. `CUDAAPI` is `__stdcall` on Windows. This was working fine - on x64 because `__stdcall` is ignored and there's no special calling - convention. However, on x86, we need to use `__stdcall`. - -2020-01-20 15:10:51 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/nvcodec/gstcudaloader.h: - * sys/nvcodec/stub/cuda.h: - nvcodec: cuda.h only needs glib.h, not gst.h - Just a nitpick. Also, force the compiler to use our stub header - instead of searching for it in the include paths. - -2020-01-17 11:19:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Start datachannel SCTP elements only after the DTLS connection is established - Otherwise we would start sending data to the DTLS connection before, and - the DTLS elements consider this an error. - Also RFC 8261 mentions: - o A DTLS connection MUST be established before an SCTP association can - be set up. - -2020-01-12 17:04:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Add handling of unspecified peer-connection-state situation - For us it can happen that the DTLS transports are still in the process - of connecting while the ICE transport is already completed. This - situation is not specified in the spec but conceptually that means it is - still in the process of connecting. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/758 - -2020-01-12 16:32:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Return the old state if we ended up being in an unspecified situation - Previously we would've returned NEW, which is usually more wrong. - -2020-01-09 19:21:08 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Fix transitions for the peer connection state - They're now mapping exactly to what - https://www.w3.org/TR/webrtc/#rtcpeerconnectionstate-enum - actually specifies. - Related to https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/758 - -2020-01-09 18:55:56 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Fix transitions for the connection state - They're now mapping exactly to what - https://www.w3.org/TR/webrtc/#dom-rtciceconnectionstate - actually specifies. - Related to https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/758 - -2020-01-12 16:25:01 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/dtlstransport.c: - webrtc/dtlstransport: Proxy DTLS connection state from the DTLS elements to the transport - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/758 - -2020-01-12 16:18:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - * ext/dtls/gstdtlsconnection.h: - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlsenc.c: - * ext/dtls/gstdtlssrtpdec.c: - * ext/dtls/gstdtlssrtpenc.c: - dtls: Keep track of the connection state and signal it through all the layers - This allows the application to keep track of the underlying DTLS - connection state and act accordingly. - -2020-01-12 13:56:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - * ext/dtls/gstdtlsconnection.h: - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlsenc.c: - dtls: Handle errors/close_notify at all steps and propagate through the layers properly - Previously we simply logged errors but never reported them to elements - or even to the user. Fatal errors are now properly reported. - Additionally proper connection closing is implemented based on EOS: - - dtlsenc: EOS will cause close_notify to be sent to the peer and only - if the peer also sent back close_notify we will forward the - EOS event. - - dtlsdec: EOS will be forwarded normally, this only means that the - unterlying transport was closed. On receiving a DTLS packet - containing close_notify, return EOS and send EOS downstream. - -2020-01-12 12:48:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - * ext/dtls/gstdtlsconnection.h: - * ext/dtls/gstdtlsenc.c: - * ext/dtls/gstdtlsenc.h: - dtls: Propagate write errors backwards through dtlsenc/dtlsconnection - -2020-01-12 11:24:15 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - * ext/dtls/gstdtlsconnection.h: - * ext/dtls/gstdtlsenc.c: - dtls: Use a plain function pointer instead of a GClosure for the send callback - There's not point in using GClosure and going through all the - GValue/libffi infrastructure for each DTLS packet. - -2020-01-09 12:32:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Don't consider transceivers without mid as inactive during ICE gathering state updates - We don't have any mid before parsing the SDP, which happens after we - handled the SDP answer and that usually happens long after ICE candidate - gathering is finished. - Without this all transceivers are considered inactive and as such ICE - gathering is for active transceiver was considered complete from the - very beginning. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1126 - -2020-01-09 12:27:31 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Don't consider RTP receivers stopped - We don't support stopping RTP receivers currently so let's not consider - them all stopped all the time. This fixes some of the ICE/DTLS state - change handling and specifically fixes the ICE gathering state. - Previously the ICE gathering state was immediately going from NEW to - COMPLETE because it considered all transceivers stopped and as such all - activate transceivers were finished gathering ICE candidates. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1126 - -2020-01-09 12:26:41 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Improve logging related to ICE/DTLS state changes - -2019-12-31 02:41:40 +1100 Jan Schmidt <jan@centricular.com> - - * gst/yadif/meson.build: - yadif: Re-renable MMX asm on x86_64 with meson - The meson build doesn't automatically set HAVE_CPU_* defines - like autotools did, so the yadif plugin was being built without - the MMX assembler support - -2020-01-19 14:50:12 +1100 Jan Schmidt <jan@centricular.com> - - * gst/yadif/vf_yadif.c: - * gst/yadif/yadif.c: - yadif: Only build inline Asm with gcc/clang - -2019-11-06 04:45:09 -0800 Josep Torra <jtorra@oblong.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: align frame list using decoded timestamp - Before this change decoder used the oldest frame in the list to pair it - with the decoded surface. This only works when there's a perfect stream - like HEADERS,SYNCPOINT,DELTA... - When playing RTSP streams we can get imperfect streams like HEADERS, - DELTA,SYNCPOINT,DELTA... In this case decoder drops the frames - between HEADERS and SYNCPOINT which leads into using wrong PTS on - the output frames. - With this change we inject the input PTS into the bitstream and use it - to align the internal frame list with the actually decoded position. - Fixes playback with: - ``` - gst-launch-1.0 rtspsrc location=... latency=0 drop-on-latency=1 ! ... - ``` - -2019-11-28 21:30:18 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvenc.c: - nvenc: Query supported minimum resolution - Hard-coded 16x16 resolution is likely to differ from the device's support - in most cases. If we can use NV_ENC_CAPS_WIDTH_MIN and NV_ENC_CAPS_HEIGHT_MIN, - update pad template with returned value. - -2019-11-28 20:47:34 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/cuviddec.h: - * sys/nvcodec/nvEncodeAPI.h: - * sys/nvcodec/nvcuvid.h: - nvcodec: Bump SDK header to version 9.1 - Update header to query minimum resolution of encoder and to control - the number of reference frame if it's supported - -2019-12-18 18:01:30 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/mxf/meson.build: - * gst/mxf/mxf.c: - * gst/mxf/mxfprores.c: - * gst/mxf/mxfprores.h: - mxfdemux: add support for Apple ProRes - -2019-11-27 12:23:58 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * tests/examples/meson.build: - * tests/examples/msdk/meson.build: - * tests/examples/msdk/test-roi.c: - examples: add test-roi for gst-msdk - Copied and pasted from gstreamer-vaapi and did a few changes for gst-msdk. - -2019-11-27 15:16:17 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: support transform_meta virtual method - Allow the base class to copy GstVideoRegionOfInterestMeta data to the - output buffer when calling gst_video_decoder_finish_frame - -2019-11-27 16:00:59 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - msdkenc: set ROI region for msdk{h264, h265}enc - A reconfig is needed when ROI is changed, otherwise the ROI parameters won't - take effect - -2019-12-03 10:48:21 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - msdkenc: add set_extra_params virtual method - set_extra_params is added to allow sub class to add extra mfx parameters - for changed input frame or meta data - -2019-11-28 14:54:30 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - msdkenc: add need_reconfig virtual method - need_reconfig is added to allow sub class requires a reconfig when - the input frame or the MetaData (e.g. GstVideoRegionOfInterestMeta) - attached to the input frame is changed. - -2020-01-13 17:20:14 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gsth265decoder.c: - d3d11h265dec: Fix wrong NoRaslOutputFlag setting - ... and handle EOS and EOB nals. - Only the first CRA picture should be associated with NoRaslOutputFlag - as the comment in code. - -2020-01-12 08:07:23 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in: - pkgconfig: Remove unused substitution in uninstalled.pc.in - `@videolibdir@` isn't used anymore. - -2020-01-12 07:49:47 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * tests/check/meson.build: - * tests/examples/ipcpipeline/ipcpipeline1.c: - * tests/examples/mpegts/meson.build: - * tests/examples/opencv/meson.build: - * tests/examples/waylandsink/meson.build: - * tests/examples/webrtc/meson.build: - tests: Fix minor bugs in usage of config.h - -2020-01-12 07:41:34 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/ipcpipeline/gstipcpipelinecomm.c: - * sys/ipcpipeline/gstipcpipelinesrc.c: - ipcpipeline: Minimal fixes that allow building with MSVC - -2020-01-11 14:47:13 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/ipcpipeline/meson.build: - * tests/examples/ipcpipeline/meson.build: - ipcpipeline: Rework compiler checks - `pipe()` isn't used since 15927b6511bc8304ae144a45c9fbfca88e5dd641, - and `socketpair()` from `#include <sys/socket.h>` is used only in the - examples. In practice, you can use probably also use anything that - allows you to create fd pairs, such as named pipes or anonymous pipes. - We use the cross-platform GstPollFD API in the plugin. - -2020-01-13 17:10:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: Add property to set the extra latency to introduce for waiting for LTC timecodes - Default to 150ms instead of 8 frames, which seems to work in the - majority of cases. - -2020-01-13 12:54:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Add some more debug output - -2020-01-11 18:24:02 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11bufferpool.c: - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11device.h: - * sys/d3d11/gstd3d11format.c: - * sys/d3d11/gstd3d11format.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11vp9dec.c: - * sys/d3d11/gstd3d11window.cpp: - d3d11memory: Always use native DXGI format if device support it - Use consistent memory layout between dxva and other shader use case. - For example, use DXGI_FORMAT_NV12 texture format instead of - two textures with DXGI_FORMAT_R8_UNORM and DXGI_FORMAT_R8G8_UNORM. - -2020-01-10 20:44:19 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11bufferpool.c: - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11download.c: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11vp9dec.c: - Revert "d3d11: Add support for D3D11_USAGE_DYNAMIC" - This reverts commit ddd13fc7c061a9873b181d0de32aaf9546e7d0af - Dynamic usage can reduce the number of copy per frame but make - things complicated and the benefit seems to not significant. - Also since we don't provide _map() method for the dynamic usage, - application cannot read buffers which make "last-sample" property - unusable in case of d3d11videosink. - -2020-01-13 02:30:07 +1100 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - WebRTC: Support non-trickle ICE candidates in the SDP - Add any ICE candidates from the SDP before adding pending - trickle ICE candidates to support non-trickle peers - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/678 - -2020-01-11 00:01:55 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h264dec.h: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11h265dec.h: - * sys/d3d11/gstd3d11vp9dec.c: - * sys/d3d11/gstd3d11vp9dec.h: - * sys/d3d11/plugin.c: - d3d11: Don't register decoders if unavailable - DXVA requires a hardware interface but may not be available, - such as in the case of VMs or when the GPU vendor does not provide a decoder interface. - -2020-01-10 23:57:15 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11decoder.c: - d3d11decoder: Don't return not initialized object from _new() method - ... and change some debug levels since initialization failure might not be fatal. - -2019-08-22 16:04:37 +0900 Shinya Saito <ssaito@igel.co.jp> - - * ext/wayland/wlwindow.c: - waylandsink: Fix xdg_shell fullscreen mode - xdg_shell fullscreen mode doesn't work for committing - xdg_surface without configure acknowledgement. - In addition, we can't set different surface setting from - acknowledged config in this mode. - -2019-11-11 12:40:07 -0800 Josep Torra <jtorra@oblong.com> - - * gst/videoparsers/gsth264parse.c: - * tests/check/elements/h264parse.c: - h264parse: do not push wrong PTS with some raw files - Some raw h264 encoded files trigger the assignment of wrong PTS to buffers - when some SEI data is provided. This change prevents it to happen. - Also ensure this behavior is being tested. - -2020-01-10 13:08:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Skip over invalid LTC timecodes immediately - -2020-01-10 11:40:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Clean up old LTC timecodes on LTC discontinuity - We might have some old timecodes that are in the future now and have to - drop those to make sure that our queue is correctly ordered and we don't - have multiple timecodes for the same running time. - -2020-01-10 11:33:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Fix waiting for the first video frame in case of live video input - -2020-01-09 17:41:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: Fix up handling/queueing of LTC timecodes - Directly read them out of the decoder as soon as we passed audio and - then store them in a queue that we handle internally together with their - timestamps. This cleans up memory management and gives us proper control - over the queue instead of guessing how the queue inside the LTC decoder - actually works and when it overflows. - -2020-01-09 15:27:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Only allow requesting LTC audio pad in NULL/READY states - And don't introduce any latency at all if not LTC audio pad was - requested. - -2020-01-09 15:23:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: In live mode wait correctly for the latency to pass - And also introduce 6 instead of 2 frames of latency compared to the LTC - audio input as that seems to be an upper bound for how much the LTC - library is lagging behind. - -2020-01-09 15:16:02 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Use the internal LTC timecode tracker instead of the last one we retrieved - Otherwise we don't interpolate between LTC timecodes but only ever put - an LTC timecode on buffers once we actually received one. - -2020-01-09 14:23:08 -0500 Nicolas Dufresne <nicolas@nicolas-tpx395.localdomain> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/linux/DeckLinkAPIDispatch.cpp: - decklink: Silence no driver / no SO messages - This g_once() is called everywhere, even in provider. This cause - spurious error when device monitor is used. Just silence or remove - the spurious logs. - -2020-01-10 16:03:48 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/hls/meson.build: - hls: Check nettle version to ensure AES128 support - AES128 support was added since nettle version 3.0 - ../subprojects/gst-plugins-bad/ext/hls/gsthlsdemux.h:110:10: error: field ‘ctx’ has incomplete type - struct CBC_CTX (struct aes128_ctx, AES_BLOCK_SIZE) aes_ctx; - -2020-01-06 12:59:36 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - Revert "msdkdec: make sure to use video memory on Linux" - Commit a1584b6 caused big performance drop if the downstream element - is not a msdk element because it is very slow to read data from video - memory directly. - This reverts commit a1584b6f99caaf61812ac6a9654ec0e6da8240da. - -2020-01-09 21:00:47 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/elements/d3d11colorconvert.c: - tests: d3d11colorconvert: Add test cases for visual validation - By default new test cases are disabled since it might be timed out - or test environment might not have render device. - -2020-01-09 19:39:59 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11format.c: - * sys/d3d11/gstd3d11format.h: - d3d11colorconverter: Handle P016_LE format - P016 format is no different than P010. Not much things to add code. - -2020-01-09 19:32:38 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconverter.c: - d3d11colorconverter: Add support for YUV to YUV conversion - -2020-01-08 23:09:51 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconverter.c: - d3d11colorconverter: Add support for RGB to YUV conversion - ... and remove code for RGBx since it's not supported format - by our d3d11 implementation for now. - -2020-01-09 11:14:47 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11format.h: - d3d11format: Remove invalid format from supported format list - -2020-01-08 07:42:21 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Always configure 10 bit YUV for VANC frames - If 8 bit are required by the device/mode then it will be converted internally - by the SDK, but the SDK won't automatically convert from 8 to 10 bit. As - such, always use 10 bit VANC. - Some devices require configuring also a 10 bit video format when using - 10 bit VANC is required but those would fail regardless and the - application would have to configure the correct video format. - With newer versions of the SDK this information can be retrieved via the - BMDDeckLinkVANCRequires10BitYUVVideoFrames flag but we don't use a new - enough SDK version yet to extract this information. - -2020-01-07 20:17:12 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/webrtcdatachannel.c: - webrtc: Unmap all non-binary buffers received via the datachannel - Previously they were only unmapped in case of binary data, causing all - of them to be leaked. - -2020-01-07 10:05:33 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/zbar/gstzbar.c: - zbar: remove useless conditional on passthrough - seen that passthrough is never set for this element, no need - to allow to remove the 'transform' call - -2019-09-27 23:02:38 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/meson.build: - * ext/zxing/gstzxing.cpp: - * ext/zxing/gstzxing.h: - * ext/zxing/gstzxingplugin.c: - * ext/zxing/meson.build: - * meson_options.txt: - * tests/check/elements/zxing.c: - * tests/check/meson.build: - zxing: initial plugin revision - Status: - - scan QR code with low resolution - - Scan barcode with high resolution - -2020-01-03 18:14:48 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * tests/check/elements/h264parse.c: - * tests/check/elements/h265parse.c: - tests: add h26xparse HDR SEI test - Detect caps according to MDCV + CLLI SEI message - -2019-12-18 10:05:05 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * tests/check/elements/h265parse.c: - * tests/check/meson.build: - test: add h265parse test - -2019-12-17 12:08:34 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - h26xparse: Handle state change on IDR first slice - As the H265/H264 bitstream can support multiple slices, - mastering_display_info_state and content_light_level_state - should be changed only on first slice segment. - Fix #1152 - -2019-12-05 16:48:05 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: use same algo for MDCV and CLL SEI management - -2019-11-28 12:59:46 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parser: add MDCV and CLL SEI message parsing - Allow to parse SEI message for: - - mastering display colour volume - - Light level infomation - Set to caps if necessary. - Fix #958 - -2020-01-07 01:40:57 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/dash/gstplugin.c: - dash: Remove spurious condition check and remove unused debug category - Note that uppercase debug category names are used for - core modules and should be redefined in lowercase for plugins if necessary. - -2020-01-06 16:30:36 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/debugutils/gstfakevideosink.c: - fakevideosink: Use our pad template to create pad - -2019-12-30 18:58:59 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11device.h: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.cpp: - * sys/d3d11/gstd3d11window.h: - * sys/d3d11/gstd3d11window_corewindow.cpp: - * sys/d3d11/gstd3d11window_corewindow.h: - * sys/d3d11/gstd3d11window_swapchainpanel.cpp: - * sys/d3d11/gstd3d11window_swapchainpanel.h: - * sys/d3d11/gstd3d11window_win32.cpp: - * sys/d3d11/gstd3d11window_win32.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Add support for Universal Windows Platform - Initial UWP support via new window (CoreWindow and SwapChainPanel) implementation. - -2019-12-31 13:36:59 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h264dec.h: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11h265dec.h: - * sys/d3d11/gstd3d11vp9dec.c: - d3d11decoder: Fix build on non-desktop target - Although the target platform of D3D11 decoding API are both desktop and UWP app, - DXVA header is blocked by "WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)" - which is meaning that that's only for desktop app. - To workaround this inconsistent annoyingness, we need to define WINAPI_PARTITION_DESKTOP - regardless of target WinAPI partition. - -2019-12-25 13:21:11 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvp9enc.c: - msdkvp9enc: fix 10bit encoding - The codec profile should be consistent with the frame fourcc code, this - fixes pipeline below: - gst-launch-1.0 videotestsrc ! \ - video/x-raw,width=320,height=240,format=P010_10LE ! msdkvp9enc ! \ - fakesink - -2019-12-25 10:51:36 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvp9enc.c: - msdkvp9enc: fix width and height - The frame width and height is rounded up to 128 and 32 since commit - 8daac1c, so the width, height for initialization should be rounded up to - 128 and 32 too because the MSDK VP9 encoder will do some check on width - and height. - Sample pipeline: - gst-launch-1.0 videotestsrc ! \ - video/x-raw,width=320,height=240,format=NV12 ! msdkvp9enc ! fakesink - -2020-01-03 15:27:30 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - msdk: make sure the found response meets the request - Otherwise the re-used msdk response doesn't have enough frames so it is - possible the pipeline will be broken - -2019-12-26 13:31:50 -0800 Julien Isorce <jisorce@oblong.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: renegotiate when video info changes - Renegotiation was implemented for bitrate change. We can re-use - the same sequence when video info changes except that this can be - executed right away when receiving the new input format. I.e. no - need to wait for the next call to handle_frame. - -2020-01-05 16:20:18 +0000 Philippe Normand <philn@igalia.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Fix crash when probing without driver - If there is no decklink hardware/driver, the devices list is empty (NULL), so - this needs to be checked before iterating over the list. - -2019-05-16 19:42:37 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dash/gstdashsink.c: - * ext/dash/gstdashsink.h: - * ext/dash/gstmpdclient.c: - * ext/dash/gstmpdclient.h: - * ext/dash/gstmpdhelper.c: - * ext/dash/gstmpdhelper.h: - * ext/dash/gstplugin.c: - * ext/dash/meson.build: - * tests/check/elements/dash_mpd.c: - dashsink: Add new sink to produce DASH content - Add static or dynamic mpd with: - - baseURL - - period - - adaptation_set - - representaton - - SegmentList - - SegmentURL - - SegmentTemplate - Support multiple audio and video streams. - Pass conformance test with DashIF.org - -2019-12-09 15:10:00 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dash/gstxmlhelper.c: - gstxmlhelper: fix xmlOutputBufferFlush ignored ret - fix CID #1456553 - -2019-09-02 14:52:53 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dash/gstmpdadaptationsetnode.c: - * ext/dash/gstmpdbaseurlnode.c: - * ext/dash/gstmpdmultsegmentbasenode.c: - * ext/dash/gstmpdperiodnode.c: - * ext/dash/gstmpdrepresentationbasenode.c: - * ext/dash/gstmpdrepresentationnode.c: - * ext/dash/gstmpdrootnode.c: - * ext/dash/gstmpdrootnode.h: - * ext/dash/gstmpdsegmenttemplatenode.c: - * ext/dash/gstmpdsegmenturlnode.c: - * ext/dash/gstmpdutctimingnode.c: - dash: add set/get property for nodes - Add a way to set/get properties for given nodes: - - root - - baseurl - - representation - -2019-12-04 17:25:24 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdadaptationsetnode.c: - * ext/dash/gstmpdadaptationsetnode.h: - * ext/dash/gstmpdbaseurlnode.c: - * ext/dash/gstmpdbaseurlnode.h: - * ext/dash/gstmpdclient.c: - * ext/dash/gstmpdclient.h: - * ext/dash/gstmpdcontentcomponentnode.c: - * ext/dash/gstmpdcontentcomponentnode.h: - * ext/dash/gstmpddescriptortypenode.c: - * ext/dash/gstmpddescriptortypenode.h: - * ext/dash/gstmpdhelper.c: - * ext/dash/gstmpdhelper.h: - * ext/dash/gstmpdlocationnode.c: - * ext/dash/gstmpdlocationnode.h: - * ext/dash/gstmpdmetricsnode.c: - * ext/dash/gstmpdmetricsnode.h: - * ext/dash/gstmpdmetricsrangenode.c: - * ext/dash/gstmpdmetricsrangenode.h: - * ext/dash/gstmpdmultsegmentbasenode.c: - * ext/dash/gstmpdmultsegmentbasenode.h: - * ext/dash/gstmpdnode.c: - * ext/dash/gstmpdnode.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * ext/dash/gstmpdperiodnode.c: - * ext/dash/gstmpdperiodnode.h: - * ext/dash/gstmpdprograminformationnode.c: - * ext/dash/gstmpdprograminformationnode.h: - * ext/dash/gstmpdreportingnode.c: - * ext/dash/gstmpdreportingnode.h: - * ext/dash/gstmpdrepresentationbasenode.c: - * ext/dash/gstmpdrepresentationbasenode.h: - * ext/dash/gstmpdrepresentationnode.c: - * ext/dash/gstmpdrepresentationnode.h: - * ext/dash/gstmpdrootnode.c: - * ext/dash/gstmpdrootnode.h: - * ext/dash/gstmpdsegmentbasenode.c: - * ext/dash/gstmpdsegmentbasenode.h: - * ext/dash/gstmpdsegmentlistnode.c: - * ext/dash/gstmpdsegmentlistnode.h: - * ext/dash/gstmpdsegmenttemplatenode.c: - * ext/dash/gstmpdsegmenttemplatenode.h: - * ext/dash/gstmpdsegmenttimelinenode.c: - * ext/dash/gstmpdsegmenttimelinenode.h: - * ext/dash/gstmpdsegmenturlnode.c: - * ext/dash/gstmpdsegmenturlnode.h: - * ext/dash/gstmpdsnode.c: - * ext/dash/gstmpdsnode.h: - * ext/dash/gstmpdsubrepresentationnode.c: - * ext/dash/gstmpdsubrepresentationnode.h: - * ext/dash/gstmpdsubsetnode.c: - * ext/dash/gstmpdsubsetnode.h: - * ext/dash/gstmpdurltypenode.c: - * ext/dash/gstmpdurltypenode.h: - * ext/dash/gstmpdutctimingnode.c: - * ext/dash/gstmpdutctimingnode.h: - * ext/dash/gstxmlhelper.c: - * ext/dash/gstxmlhelper.h: - * ext/dash/meson.build: - * tests/check/elements/dash_mpd.c: - dash: Generate an XML content from object. - Add mpd node base class to provide - xml generation facilities for child - objects. - -2019-12-26 11:24:37 -0800 Julien Isorce <jisorce@oblong.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: trigger renegotiation if video info changes - Useful when framerate changes. Previously it was only checking - for resolution change but renego should happen if any video - info changes. - -2019-12-23 15:17:07 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/vulkan/vksink.c: - vulkansink: Fix null pointer exception - context query might happen before creating swapper. - -2019-12-17 16:10:53 -0800 Julien Isorce <jisorce@oblong.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: make sure to use video memory on Linux - The block that sets use_video_memory flag is after the - the condition `if gst_msdk_context_prepare` but it - always returns false when there is no other msdk elements. - So the decoder ends up with use_video_memory as FALSE. - Note that msdkvpp always set use_video_memory as TRUE. - When use_video_memory is FALSE then the msdkdec allocates - the output frames with posix_memalign (see gstmsdksystemmemory.c). - The result is then copied back to the GstVideoPool's buffers - (or to the downstream pool's buffers if any). - When use_video_memory is TRUE then the msdkdec uses vaCreateSurfaces - to create vaapi surfaces for the hw decoder to decode into - (see gstmsdkvideomemory.c). The result is then copied to either - the internal GstVideoPool and to the downstream pool if any. - (vaDeriveImage/vaMapBuffer is used in order to read the surfaces) - -2020-01-02 12:22:07 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: Correct return value of GstVideoDecoder::flush() - Use boolean instead of GstFlowReturn as declared. - Note that since base class does not check return value of GstVideoDecoder::flush(), - this would not cause any change of behavior. - -2019-12-23 14:09:25 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: free unlocked msdk surface before output buffer allocation - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/924 - is trying to use video memory for decoding on Linux, which reveals a - hidden bug in msdkdec. - For video memory, it is possible that a locked mfx surface is not used - indeed and it will be un-locked later in MSDK, so we have to check the - associated MSDK surface to find out and free un-used surfaces, otherwise - it is easy to exhaust all pre-allocated mfx surfaces and get errors below: - 0:00:00.777324879 27290 0x564b65a510a0 ERROR default - gstmsdkvideomemory.c:77:gst_msdk_video_allocator_get_surface: failed to - get surface available - 0:00:00.777429079 27290 0x564b65a510a0 ERROR msdkbufferpool - gstmsdkbufferpool.c:260:gst_msdk_buffer_pool_alloc_buffer:<msdkbufferpool0> - failed to create new MSDK memory - Note the sample code in MSDK does similar thing in - CBuffering::SyncFrameSurfaces() - -2019-12-12 19:02:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlssink2.c: - * ext/hls/gsthlssink2.h: - * ext/hls/meson.build: - hlssink2: Add signals for allowing custom playlist/fragment handling - Instead of always going through the file system API we allow the - application to modify the behaviour. For the playlist itself and - fragments, the application can provide a GOutputStream. In addition the - sink notifies the application whenever a fragment can be deleted. - -2019-12-31 12:41:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/examples/webrtc/webrtcbidirectional.c: - webrtc: Actually make use of promise created one line before - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1042 - -2019-12-30 19:50:29 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: resurrect actual and efficient seeking of all kinds - ... by seeking to target offset determined by new seek segment, - rather than that of the previous segment. The latter would typically - seek back to start for a non-accurate seek, and lead to a lot - of skipping in case of an accurate seek. - -2019-12-26 14:28:03 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h265dec.c: - * sys/d3d11/gstd3d11h265dec.h: - * sys/d3d11/gsth265decoder.c: - * sys/d3d11/gsth265decoder.h: - * sys/d3d11/gsth265picture.c: - * sys/d3d11/gsth265picture.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Add h265 decoder element - Some DPB management implementation is taken from gstreamer-vaapi - -2019-12-20 23:05:52 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11vp9dec.c: - * sys/d3d11/gstd3d11vp9dec.h: - * sys/d3d11/gstvp9decoder.c: - * sys/d3d11/gstvp9decoder.h: - * sys/d3d11/gstvp9picture.c: - * sys/d3d11/gstvp9picture.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Add vp9 decoder element - Based on gstreamer-vaapi and Chromium implemetation. - -2019-12-26 14:24:46 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11decoder.c: - * sys/d3d11/gstd3d11decoder.h: - * sys/d3d11/gstd3d11h264dec.c: - * sys/d3d11/gstd3d11h264dec.h: - * sys/d3d11/gsth264decoder.c: - * sys/d3d11/gsth264decoder.h: - * sys/d3d11/gsth264picture.c: - * sys/d3d11/gsth264picture.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Add h264 decoder element - New decoder implementation based on dxva2 on d3d11 APIs. The DPB - management implementation is taken from Chromium. - -2019-12-20 22:50:55 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11bufferpool.c: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - d3d11: Add support for Array typed texture memory - A ID3D11Texture2D memory can consist of multiple planes with array. - For array typed memory, GstD3D11Allocator will allocate new GstD3D11Memory - with increased reference count to the ID3D11Texture2D but different array index. - -2019-12-18 15:37:03 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/neon/gstneonhttpsrc.c: - * gst/librfb/gstrfbsrc.c: - * sys/directsound/gstdirectsoundsrc.c: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - bad: use of g_value_dup_string - Use helper method to get string from GValue. - -2019-12-30 12:52:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsenc.c: - dtlsenc: Don't warn on GST_FLOW_FLUSHING or GST_FLOW_EOS - Only warn if pushing a buffer returns an actual error to not pollute - logs with confusing warnings. - -2019-12-27 16:56:32 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: Refactor LTC audio waiting and properly handle live inputs - If one of the inputs is live, add a latency of 2 frames to the video - stream and wait on the clock for that much time to pass to allow for the - LTC audio to be ahead. - In case of live LTC, don't do any waiting but only ensure that we don't - overflow the LTC queue. - Also in non-live LTC audio mode, flush too old items from the LTC queue - if the video is actually ahead instead of potentially waiting forever. - This could've happened if there was a bigger gap in the video stream. - -2019-12-26 20:10:55 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/elements/d3d11colorconvert.c: - * tests/check/meson.build: - tests: Add simple d3d11colorconvert unit test - -2019-12-26 19:55:40 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11download.c: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - * sys/d3d11/gstd3d11videosink.c: - d3d11: Aggregate d3d11 memory usage query for dynamic-usage type decision - Even if one of downstream d3d11 elements can support dynamic-usage memory, - another one might not support it. Also, to support dynamic-usage, - both upstream and downstream d3d11device must be the same object. - -2019-12-26 17:00:52 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconvert.h: - d3d11colorconvert: Remove device type dependent behavior - If d3d11colorconvert element is configured, do color space conversion - regardless of the device type whether it's S/W emulation or real H/W. - Since d3d11colorconvert is no more a child of d3d11videosinkbin, - we don't need this behavior. Note that previous code was added to - avoid color space conversion from d3d11videosink if no hardware - device is available (S/W emulation of d3d11 is too slow). - -2019-12-26 16:43:35 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconverter.c: - d3d11colorconverter: Fix unmatched lock/unlock pair - -2019-12-26 16:03:31 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11upload.c: - d3d11upload: Don't hard overwrite caps features to support d3d11 memory passthrough - d3d11upload should be able to support upstream d3d11 memory, not only system memory. - Fix for following pipeline - d3d11upload ! "video/x-raw(memory:D3D11Memory)" ! d3d11videosink - -2019-12-26 22:43:35 +0100 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/meson.build: - opencv: allow compilation against 4.2.x - -2019-12-24 14:00:15 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - d3d11window: Make use of partial presentation with IDXGISwapChain1::Present1 - Since we might draw on partial area of backbuffer in case of force-aspect-ratio, - presenting only updated area is more efficient way. - See also https://docs.microsoft.com/ko-kr/windows/win32/direct3ddxgi/dxgi-1-2-presentation-improvements - -2019-12-24 15:54:57 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11colorconverter.h: - * sys/d3d11/gstd3d11download.c: - * sys/d3d11/gstd3d11overlaycompositor.c: - * sys/d3d11/gstd3d11overlaycompositor.h: - * sys/d3d11/gstd3d11shader.c: - * sys/d3d11/gstd3d11shader.h: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosinkbin.c: - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11videosink: Add support for overlay composition - Add d3d11overlaycompositor object to draw overlay image - on render target using Blend method. - -2019-12-20 18:56:08 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11device.h: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11shader.c: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Enable dxgi debug layer and always try to pop d3d11/dxgi debug message if possible - Note that dxgi and d3d11 sdk debug will be enabled on debug build - -2019-11-28 18:54:31 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstcudaloader.c: - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvenc.h: - * sys/nvcodec/plugin.c: - nvcodec: Refactor plugin initialization - Create CUDA context per device, instead of per codec and encoder/decoder. - Allocating CUDA context is heavy operation so we should reuse it - as much as possible. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1130 - -2019-12-20 12:37:51 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/vulkan/win32/gstvkwindow_win32.c: - vulkan/window/win32: Don't post any WinProc message to parent window - Posting any message to parent seems to be pointless. That might break - parent window. - Regardless of the posting, parent window can catch mouse event - and also any keyboard events will be handled by parent window by default. - -2019-11-11 09:47:00 -0500 Aaron Boxer <aaron.boxer@collabora.com> - - * ext/openjpeg/gstopenjpegenc.c: - * ext/openjpeg/gstopenjpegenc.h: - openjpegenc: add support for sub-frame encoding - Following the standard for low latency JPEG 2000 encoding - https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-H.222.0-200701-S!Amd1!PDF-E&type=items - we divide the image into stripes of a specified height, and encode - each stripe as a self-contained JPEG 2000 image. This MR is based on - https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/merge_requests/429 - -2019-03-23 21:01:51 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * ext/meson.build: - * ext/svthevcenc/gstsvthevcenc.c: - * ext/svthevcenc/gstsvthevcenc.h: - * ext/svthevcenc/meson.build: - * meson_options.txt: - * tests/check/elements/svthevcenc.c: - * tests/check/meson.build: - svthevcenc: Add new SVT-HEVC encoder element - The SVT-HEVC (Scalable Video Technology0 for HEVC) Encoder is an - open source video coding technology1 that is highly optimized for - Intel Xeon Scalable processors and Intel Xeon D processors. - 0 https://01.org/svt - 1 https://github.com/OpenVisualCloud/SVT-HEVC - -2019-09-30 16:29:50 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst/videoparsers/gsth265parse.c: - h265parser: Add simple GstH265Profile/string public utilites - It makes more simplifies the conversion between GstH265Profile and string. - -2019-12-20 00:01:26 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Use dynamic texture for fallback buffer - Upload CPU memory to texture directly by using dynamic usage texture. - This will reduce at least one step of staging copy per frame. - -2019-12-19 23:58:17 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconvert.c: - d3d11colorconvert: Set TRANSFER_NEED_DOWNLOAD flag to output memory for later cpu access - Otherwise CPU cannot access texture via gst_memory_map() - -2019-12-19 22:07:42 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconvert.c: - d3d11colorconvert: Use shader resource and render target bind flags together - The output of d3d11colorconvert would be used for rendering (i.e., shader resource) - -2019-12-19 21:47:57 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - d3d11window: Change aspect-ratio mode from window thread - Call DXGI API from window thread as much as possible - -2019-12-17 20:49:52 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/examples/d3d11videosink/d3d11videosink-kb.c: - * tests/examples/d3d11videosink/d3d11videosink-kb.h: - * tests/examples/d3d11videosink/d3d11videosink.c: - * tests/examples/d3d11videosink/meson.build: - * tests/examples/meson.build: - examples: Add example for d3d11videosink - This is fork of win32-videooverlay in -base but more d3d11videosink specific one. - -2019-12-15 19:29:10 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosink.h: - * sys/d3d11/gstd3d11videosinkbin.c: - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - d3d11videosink: Add support for full screen mode - borderless top-most style full screen mode support. - Basically fullscreen toggle mode is disabled by default. To enable it - use "fullscreen-toggle-mode" property to allow fullscreen mode change - by user input and/or property. - -2019-12-20 00:17:33 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11device.h: - * sys/d3d11/gstd3d11download.c: - * sys/d3d11/gstd3d11format.c: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11shader.c: - * sys/d3d11/gstd3d11shader.h: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - d3d11: Use GRecMutex to protect immediate context and dxgi API call - In some cases, rendering and dxgi (e.g., swapchain) APIs should be - called from window message pump thread, but current design (dedicated d3d11 thread) - make it impossible. To solve it, change concurrency model to locking based one - from single-thread model. - -2019-12-18 20:55:01 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - d3d11window: Prefer to use flip-sequential over discard - flip-sequential is more efficient than discard - -2019-12-18 20:36:32 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - d3d11window: Don't hold backbuffer interface - We don't need to hold it - -2019-12-18 14:23:03 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11device.h: - * sys/d3d11/gstd3d11window.c: - d3d11window: Use CreateSwapChainForHwnd if available - That's recommended way from MS and CreateSwapChainForHwnd supports - more options than CreateSwapChain - -2019-12-18 13:21:31 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/meson.build: - d3d11: Use configuration file for dxgi header version check - -2019-12-17 13:47:24 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - d3d11window: Use allow-tearing mode if device supports it - As the recommendation from MS. - -2019-12-15 18:30:22 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - d3d11window: Disable fullscreen mode change by alt + enter - Disable full screen mode change until proper handling is implemented - -2019-12-15 16:23:00 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosink.h: - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - d3d11videosink: Remove resizing window hack and unify resizing flow - In earlier implementation of d3d11videosink where no shader was implemented, - the aspect ratio and render size were adjusted by manipulating the backbuffer size - with unintuitive formula. Since now we do color conversion and resize using - shader, we can remove the hack. - -2019-12-15 15:50:19 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - * sys/d3d11/gstd3d11videosink.c: - d3d11: Pass GstD3D11Memory object to ensure_{shader_resource,render_target}_view methods - The method name indicates it should be d3d11memory, so passing - GstD3D11Memory seems to make more sense than GstMemory. - -2019-12-15 15:44:20 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Don't specify crop meta to allocation query - d3d11videosink could not handle it for now - -2019-12-19 15:19:29 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Fix lock-less exchange or free condition - Before this change, we would free the list we just have saved. - Fixes #1158 - -2019-11-12 12:27:51 +0100 Francisco Javier Velázquez-García (francisv) <fvelazquez@make.tv> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - gstsrtsink: Add `wait-for-connection` property to `srtsink` - Add `wait-for-connection` property to `srtsink` element. This - property allows the element to process packets even when no clients - are connected. - -2019-12-07 09:56:28 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: hold class lock for entire duration of class destruction - This avoids a race condition currently when temporarily releasing the - lock and then re-acquiring. - -2019-12-07 09:54:49 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dhelpers.h: - d3dvideosink: improve concurrency on hidden window create/destroy - -2019-12-07 14:51:28 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: use thread pool to handle events from hidden window event queue - window event queue now does not lock on the class lock, so we can now shut - it down without releasing the class lock, thus avoiding a potential race when - stopping the sink. - -2019-12-07 09:53:20 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: improve concurrency on internal window create/destroy - Remove timeout and rely on condition variable instead to indicate thread - start. - -2019-12-07 09:34:55 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: only warn about HWND already set if new HWND is not NULL - -2019-12-07 00:25:05 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: add more null checks - -2019-12-07 00:01:47 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: check ref count and device before resetting display - -2019-12-07 09:41:32 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dhelpers.h: - d3dvideosink: use class lock when checking d3d formats, and cache format list - -2019-12-06 23:50:50 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: destroy device just before final d3d release call - and free overlays after swap chain is released - -2019-12-06 23:26:34 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: add two forward declarations - -2019-12-06 23:24:57 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: use class lock when setting pool config - -2019-12-06 23:23:45 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: use class lock when allocating pool buffer - -2019-12-06 23:19:11 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/gstd3d9overlay.c: - d3dvideosink: use class lock when creating overlay textures - -2019-12-06 23:16:05 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/gstd3d9overlay.c: - d3dvideosinnk: check d3d device exists before creating overlay vertex buffer - -2019-12-06 23:14:06 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: pass hidden window hwnd to GST_DEBUG, rather than NULL - -2019-12-06 23:11:11 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: fix typo - -2019-12-18 03:03:40 +0000 Stéphane Cerveau <scerveau@collabora.com> - - * gst/videoparsers/gsth264parse.c: - * tests/check/elements/h264parse.c: - h264parse: Align GST_H264_PROFILE_HIGH_422 to H264 standards - According to H264 ITU standards from 06/19, GST_H264_PROFILE_HIGH_422 - (profile_idc = 122) with constraint_set1_flag = 0 and - constraint_set3_flag = 0 can be mapped to high-4:2:2 or high-4:4:4. - GST_H264_PROFILE_HIGH_422 with constraint_set1_flag = 0 and - constraint_set3_flag = 1 can be mapped to high-4:2:2, high-4:4:4, - high-4:2:2-intra or high-4:4:4-intra. - -2019-12-17 16:44:10 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/videoparsers/gstvideoparseutils.c: - * gst/videoparsers/gstvideoparseutils.h: - Revert "videoparseutils: support two new EIA 608 closed caption formats" - This reverts commit f5c1c90122840396f3a34f787bd66a672be21c3b. - -2019-12-17 16:43:54 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/closedcaption/gstccextractor.c: - Revert "ccextractor: support new CEA 608 formats" - This reverts commit 80dd7b2d3d871f1cf456bda249bc90e4eeeb53b1. - -2019-05-02 13:20:29 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * ext/closedcaption/gstccextractor.c: - ccextractor: support new CEA 608 formats - -2019-10-24 22:06:59 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstvideoparseutils.c: - * gst/videoparsers/gstvideoparseutils.h: - videoparseutils: support two new EIA 608 closed caption formats - -2019-11-09 19:37:10 +0900 Wonchul Lee <chul0812@gmail.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlvideoformat.c: - wlvideoformat: clean up video formats - It cleans up videoFormat by combining the wl_shm_formats and - drm_formats into a single table that represents the same format. - In addition, it adds NV61 format to the waylandsink. - -2019-12-16 16:59:07 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - d3d11window: Always draw to internal window - ... and use SetParent() WIN32 API when external window is used. - Depending on DXGI swap effect, the external window might not be - reusable by another backend. To preserve the external window's property - and setting, drawing to internal window seems to be safer way. - -2019-12-14 21:41:01 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - d3d11window: Always set error reason to GError object - -2019-12-13 15:33:06 -0800 Julien Isorce <jisorce@oblong.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: call finalize on the parent class - Otherwise GstVideoDecoder is not finalized and - resources are leaked. - Somehow GST_TRACERS="leaks" GST_DEBUG="GST_TRACER:7" did not catch it. - Valgrind output: - ==31645== 22,480 (1,400 direct, 21,080 indirect) bytes in 5 blocks are definitely lost in loss record 5,042 of 5,049 - ==31645== at 0x4C2FB0F: malloc - ==31645== by 0x51D9E88: g_malloc - ==31645== by 0x51FA7B5: g_slice_alloc - ==31645== by 0x51FAC68: g_slice_alloc0 - ==31645== by 0x58D9984: g_type_create_instance - ==31645== by 0x58BA344: g_object_new_with_properties - ==31645== by 0x58BADA0: g_object_new - ==31645== by 0x8ECA966: gst_video_decoder_init - ==31645== by 0x58D99E7: g_type_create_instance - ==31645== by 0x58BA344: g_object_new_with_properties - -2019-12-11 14:17:37 +0700 Roman Shpuntov <roman.shpuntov@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: element requests camera permissions even with capture-screen property is true - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1137 - macOS has different dialogs for camera capture and screen capture. - No need to request screen capture permissions, the system detect - screen capture automatically and create request dialog. - -2019-12-11 21:51:03 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - d3d11window: Initialize surface rect with given external window handle - Unlike internal window, resize event might not happen with external window. - -2019-12-11 20:21:42 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - d3d11device: Report alive d3d11 objects at the end - It would be useful for debugging d3d11 object leak. - -2019-12-11 20:19:45 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11shader.c: - d3d11: Fix ID3D11SamplerState leak - -2019-12-11 10:47:20 +0100 Stéphane Cerveau <scerveau@collabora.com> - - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlhttpsrc.c: - * ext/fdkaac/gstfdkaacenc.c: - * ext/kate/gstkatetiger.c: - * ext/neon/gstneonhttpsrc.c: - * ext/opencv/gsthanddetect.cpp: - * ext/openni2/gstopenni2src.cpp: - * ext/resindvd/gstpesfilter.c: - * ext/soundtouch/gstbpmdetect.cc: - * ext/teletextdec/gstteletextdec.c: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/transcoder/gsttranscoder.c: - * gst-libs/gst/uridownloader/gsturidownloader.c: - * gst-libs/gst/vulkan/cocoa/gstvkwindow_cocoa.m: - * gst/accurip/gstaccurip.c: - * gst/autoconvert/gstautovideoconvert.c: - * gst/mpegdemux/gstpesfilter.c: - * gst/vmnc/vmncdec.c: - * sys/msdk/gstmsdkdec.c: - * sys/uvch264/gstuvch264_mjpgdemux.c: - * tests/check/elements/curlhttpsrc.c: - * tests/check/elements/dash_demux.c: - * tests/check/elements/hls_demux.c: - * tests/check/elements/mssdemux.c: - * tests/check/elements/webrtcbin.c: - * tests/examples/playout.c: - remove various useless linefeed in logs - -2019-11-07 15:54:47 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkvp8dec.c: - * sys/msdk/gstmsdkvp9dec.c: - * sys/msdk/gstmsdkvp9enc.c: - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - msdk: ignore MFX_ERR_UNDEFINED_BEHAVIOR when loading a plugin - An issue can be seen when using msdkh265enc with bitrate change in - playing state. The root cause is the corresponding plugin is loaded - again. - Returning MFX_ERR_UNDEFINED_BEHAVIOR from MSDK just means the plugin has - been loaded, so we may ignore this error when doing configuation again - in the sub class, otherwise the pipeline will be interrupted - -2019-12-09 21:01:32 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Fix broken fallback rendering - Make fallback rendering work - -2019-12-09 19:54:30 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Add debug message for fallback reason - -2019-12-09 00:14:53 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosink.h: - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - d3d11window: Do not check shader resource view if not doing conversion - If d3d11window does not convert format internally, shader resource view - is not required. Note that shader resource view is used for - color conversion using shader but when conversion is not required, - we just copy input input texture to backbuffer. - -2019-12-05 21:19:13 -0800 Julien Isorce <jisorce@oblong.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: check mfx surface nullity for the input buffer - In theory it should not happen but it happened to me - in some cases where it failed to allocate some video - buffers so this was a consequence of a corner case. - Better to be safe than sorry. - -2019-12-08 16:39:16 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - d3d11window: Clear old swapchain per prepare - _prepare() might be called multiple times for given window, so clear - old swapchain if any. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1138 - -2019-12-09 15:35:03 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - srtp: Remove %z as it doesn't work on Windows - -2019-12-09 17:54:02 +0100 Alicia Boya García <aboya@igalia.com> - - * gst/debugutils/gsttestsrcbin.c: - gsttestsrcbin: Avoid not-linked errors when switching tracks - The previous implementation had a very high reproducibility race where - if after a track switch, the ex-active track pad completed a buffer - chain (now returning not-linked) the flow combiner had all their pads in - non-linked state, propagating it as an error and stopping the pipeline. - By resetting the flow combiner in response to RECONFIGURE events that - race is made impossible. - -2019-12-06 08:50:05 -0800 Julien Isorce <jisorce@oblong.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: fix assertion 'frame->ref_count > 0' failed - Can happen if the oldest frame is the current frame - and if gst_video_decoder_finish_frame failed in which - case the current is unref and then drop instead of - just drop. - This patch also removes some assumptions, it was strange - to call unref and finish_frame in gst_msdkdec_finish_task. - In principle when owning a frame, the code should either - unref, or drop or finish. - -2019-12-08 17:25:26 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - d3d11window: Always set dxgi colorspace if possible - Not only for the 10 bits RGB case with HDR metadata, set proper color space - to swapchain in order to make color representaion correct - -2019-09-03 13:56:22 +1000 Matthew Waters <matthew@centricular.com> - - * meson.build: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/iosurfacevulkanmemory.c: - * sys/applemedia/iosurfacevulkanmemory.h: - * sys/applemedia/meson.build: - * sys/applemedia/metal-helpers.h: - * sys/applemedia/videotexturecache-vulkan.h: - * sys/applemedia/videotexturecache-vulkan.mm: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - vtdec: add support for outputing vulkan images - -2019-09-03 13:42:43 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkimagememory.c: - * gst-libs/gst/vulkan/gstvkimagememory.h: - vulkan/image: expose initialization function for subclasses - -2019-09-03 00:30:31 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/meson.build: - vulkan/macos: link directly to MoltenVK - It's currently the only sane way we can use MoltenVK functions to - integrate with Metal API. - It also removes the need to specify the VK_ICD_FILENAMES environment - variable pointing to MoltenVK_icd.json. - -2019-09-02 15:00:27 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/iosurfaceglmemory.c: - * sys/applemedia/iosurfaceglmemory.h: - * sys/applemedia/iosurfacememory.h: - * sys/applemedia/meson.build: - * sys/applemedia/videotexturecache-gl.m: - applemedia: rename IOSurfaceMemory -> IOSurfaceGLMemory - -2019-08-28 18:59:35 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/meson.build: - * sys/applemedia/videotexturecache-gl.h: - * sys/applemedia/videotexturecache-gl.m: - * sys/applemedia/videotexturecache.h: - * sys/applemedia/videotexturecache.m: - * sys/applemedia/vtdec.c: - videotexturecache: implement GL specifics as a subclass - -2019-08-26 16:51:03 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/videotexturecache.h: - * sys/applemedia/videotexturecache.m: - * sys/applemedia/vtdec.c: - applemedia/videocache: make a GObject subclass - -2019-08-28 20:09:39 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: don't leak texture caches - If decide_allocation is called multiple times, then we would continually - overwrite the previous cache without freeing - -2019-12-05 22:06:41 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11shader.c: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11utils.h: - * sys/d3d11/gstd3d11window.c: - d3d11: translate windows error codes to human readable strings - This will help with debugging. - -2019-09-16 13:15:59 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/magicleap/mlaudiosink.c: - mlaudiosink: Fix crash when stopping pipeline - This is a bug in LuminOS 0.97.0. - -2019-04-09 15:22:19 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/magicleap/meson.build: - * sys/magicleap/mlaudiosink.c: - * sys/magicleap/mlaudiosink.h: - * sys/magicleap/mlaudiowrapper.cpp: - * sys/magicleap/mlaudiowrapper.h: - * sys/magicleap/plugin.c: - * sys/meson.build: - Add mlaudiosink element - -2019-09-05 16:48:19 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: keep the headers - be able to resend the headers on demand after a key-unit request - -2019-12-05 21:22:18 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Return new references to the devices from get_devices() - Otherwise the caller will free the devices we store internally. - -2019-05-24 16:24:00 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdadaptationsetnode.c: - * ext/dash/gstmpdadaptationsetnode.h: - * ext/dash/gstmpdbaseurlnode.c: - * ext/dash/gstmpdbaseurlnode.h: - * ext/dash/gstmpdclient.c: - * ext/dash/gstmpdclient.h: - * ext/dash/gstmpdcontentcomponentnode.c: - * ext/dash/gstmpdcontentcomponentnode.h: - * ext/dash/gstmpdhelper.c: - * ext/dash/gstmpdhelper.h: - * ext/dash/gstmpdmetricsnode.c: - * ext/dash/gstmpdmetricsnode.h: - * ext/dash/gstmpdmetricsrangenode.c: - * ext/dash/gstmpdmetricsrangenode.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * ext/dash/gstmpdperiodnode.c: - * ext/dash/gstmpdperiodnode.h: - * ext/dash/gstmpdprograminformationnode.c: - * ext/dash/gstmpdprograminformationnode.h: - * ext/dash/gstmpdrepresentationnode.c: - * ext/dash/gstmpdrepresentationnode.h: - * ext/dash/gstmpdrootnode.c: - * ext/dash/gstmpdrootnode.h: - * ext/dash/gstmpdsegmentlistnode.c: - * ext/dash/gstmpdsegmentlistnode.h: - * ext/dash/gstmpdsegmenttemplatenode.c: - * ext/dash/gstmpdsegmenttemplatenode.h: - * ext/dash/gstmpdsegmenttimelinenode.c: - * ext/dash/gstmpdsegmenttimelinenode.h: - * ext/dash/gstmpdsegmenturlnode.c: - * ext/dash/gstmpdsegmenturlnode.h: - * ext/dash/gstmpdsnode.c: - * ext/dash/gstmpdsnode.h: - * ext/dash/gstmpdsubrepresentationnode.c: - * ext/dash/gstmpdsubrepresentationnode.h: - * ext/dash/gstmpdsubsetnode.c: - * ext/dash/gstmpdsubsetnode.h: - * ext/dash/gstmpdutctimingnode.c: - * ext/dash/gstmpdutctimingnode.h: - * ext/dash/meson.build: - * tests/check/elements/dash_mpd.c: - dash: move parser nodes/types to separated files - Rename GstMpdClient to GstMPDClient and use GObject model. - Move nodes to file from gstmpdparser.c: - - GstMPDRootNode - - GstMPDBaseURLNode - - GstMPDUTCTimingNode - - GstMPDMetricsNode - - GstMPDMetricsRangeNode - - GstMPDSNode - - GstMPDSegmentTimelineNode - - GstSegmentTemplateNode - - GstMPDSegmentURLNode - - GstMPDSegmentListNode - - GstMPDPeriodNode - - GstMPDRepresentationNode - - GstMPDsubRepresentationNode - - GstMPDAdaptationSetNode - - GstMPDContentComponentNode - - GstMPDSubsetNode - - GstMPDProgramInformationNode - Move types to gstmpdhelper from gstmpdparser.c: - - GstURLType - - GstDescriptorType - - GstSegmentBaseType - - GstMPDMultSegmentBaseType - - GstMPDRepresentationBaseType - Cleanup naming when possible. - -2019-05-20 18:48:23 +0200 Stéphane Cerveau <scerveau@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdclient.c: - * ext/dash/gstmpdclient.h: - * ext/dash/gstmpdhelper.c: - * ext/dash/gstmpdhelper.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * ext/dash/gstxmlhelper.c: - * ext/dash/gstxmlhelper.h: - * ext/dash/meson.build: - * tests/check/elements/dash_mpd.c: - dash: split mpdparser, mpdclient and xmlhelper - provide a separate namespace for mpd helper - for xml parsing and the real mpd parsing. - -2019-12-04 15:33:42 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Fix warning for unhandled enum in switch - d3dhelpers.c:135:3: warning: enumeration value 'D3DFMT_D32_LOCKABLE' not handled in switch -Wswitch - -2019-12-04 19:29:38 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkviewconvert.c: - vulkanviewconvert: clear the cached uniforms on caps change - Caps changes can change the output/input layout which needs to be - reflected in the input uniforms to the shader. - -2019-12-05 00:53:40 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11format.c: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/plugin.c: - d3d11: Initialize debug categories of non-GstElement implementation in plugin init - That's the way to expose debug category to --gst-debug-help - -2019-12-04 23:23:09 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - d3d11window: Invoke resize task with high priority - On resize event, swapchain should be configured with higher priority - than the other tasks since it's directly related to visual artifacts. - -2019-12-04 23:20:39 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11device.h: - d3d11device: Add gst_d3d11_device_thread_add_full method - I would be used to invoke GPU task with specified priority. - -2019-12-04 14:15:19 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosinkbin.c: - * sys/d3d11/gstd3d11videosinkbin.h: - d3d11videosinkbin: Drop d3d11 color convert element - d3d11videosink can convert color space now, so the conversion element - seems to be redundant. - -2019-12-03 22:54:26 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11colorconverter.h: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosink.h: - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - d3d11videosink: Add color conversion support - Draw to back buffer texture directly. It would reduce the number of - copy at least once when color conversion is required. - -2019-12-03 22:29:27 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconvert.c: - d3d11converter: Skip setup converter if input and output formats are equal - -2019-12-03 20:35:06 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconvert.h: - * sys/d3d11/gstd3d11colorconverter.c: - * sys/d3d11/gstd3d11colorconverter.h: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11colorconvert: Split color space converter to reuse code - -2019-12-02 20:24:05 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconvert.h: - * sys/d3d11/gstd3d11shader.c: - * sys/d3d11/gstd3d11shader.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Split shader to reuse code - -2019-12-02 23:27:42 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosink.h: - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - d3d11videosink: Draw window with cached texture on resize - This would render nicer than presenting scene with broken aspect ratio, - especially in case of low framerate. - -2019-11-30 20:26:26 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11bufferpool.c: - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - * sys/d3d11/gstd3d11videosink.c: - d3d11: Add support for D3D11_USAGE_DYNAMIC - D3D11 dynamic texture is a special memory type, which is mainly used for - frequent CPU write access to the texture. For now, this texture type - does not support gst_memory_{map,unmap} - -2019-12-02 14:23:10 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - d3d11device: Add debug message for CreateTexture2D failure - -2019-12-02 14:03:04 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - d3d11device: Fix misreading debug message - -2019-12-01 16:13:38 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconvert.h: - d3d11colorconvert: Disable color conversion with software rasterizer - It's much slower than our CPU based color-converter in most case. - -2019-07-18 23:12:13 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Handle context query - Propagate d3d11device via context query. - -2019-10-06 21:59:54 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11colorconvert.c: - d3d11colorconvert: Avoid copy in/out texture if possible - When input and/or output d3d11memory has its own view, use them for - rendering to avoid texture copy - -2019-10-06 21:35:48 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - d3d11memory: Allocate texture with required views - Store required resource views with d3d11 texture when it requested. - -2019-11-06 19:39:09 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosinkbin.c: - * sys/d3d11/gstd3d11videosinkbin.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Add d3d11videosinkbin element - New wrapper element to support d3d11 memory upload, color conversion, and - rendering at once. - -2019-08-18 21:01:55 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11colorconvert.c: - * sys/d3d11/gstd3d11colorconvert.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Add color space conversion element using shader - Add d3d11colorconvert element for color space conversion. - Currently {RGB, YUV} to RGB conversion is supported. - -2019-10-06 20:59:51 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11memory.c: - d3d11memory: Register mininal compare function for GstD3D11AllocationParams - The d3d11 allocation param is stored in GstStructure so it should - provide compare function for later use such as gst_structure_is_equal() - -2019-10-03 21:24:07 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - d3d11window: Set render target whenever drawing - Device context's render target might be updated for offscreen rendering - -2019-08-24 17:43:43 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11format.c: - * sys/d3d11/gstd3d11videosink.c: - d3d11videosink: Specify d3d11 memory caps feature on sinkpad template - -2019-11-06 19:38:31 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11basefilter.c: - * sys/d3d11/gstd3d11basefilter.h: - * sys/d3d11/gstd3d11download.c: - * sys/d3d11/gstd3d11download.h: - * sys/d3d11/gstd3d11upload.c: - * sys/d3d11/gstd3d11upload.h: - * sys/d3d11/meson.build: - * sys/d3d11/plugin.c: - d3d11: Introduce d3d11 upload/download element - That's equivalent to glupload and gldownload elements but for d3d11 - -2019-11-06 19:37:33 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11_fwd.h: - * sys/d3d11/gstd3d11bufferpool.c: - * sys/d3d11/gstd3d11bufferpool.h: - * sys/d3d11/gstd3d11format.c: - * sys/d3d11/gstd3d11format.h: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/meson.build: - d3d11: Refactor d3d11 memory and dxgi format usage - * Create staging texture only when the CPU access is requested. - Note that we should avoid the CPU access to d3d11 memory as mush as possible. - Incoming d3d11upload and d3d11download will take this GPU memory upload/download. - * Upload/Download texture memory from/to staging only if it needed, similar to - GstGL PBO implementation. - * Define more dxgi formats for future usage (e.g., color conversion, dxva2 decoder). - Because I420_* formats are not supported formats by dxgi, each plane should - be handled likewise GstGL separately, but NV12/P10 formats might be supported ones. - So we decide the number of d3d11memory per GstBuffer for video memory depending on - OS version and dxgi format. For instance, if NV12 is supported by OS, - only one d3d11memory with DXGI_FORMAT_NV12 texture can be allocated by this commit. - One use case of such texture is DXVA. In case DXVA decoder, it might need to produce decoded data - to one DXGI_FORMAT_NV12 instead of seperate Y and UV planes. - Such behavior will be controlled via configuration of GstD3D11BufferPool and - default configuration is separate resources per plane. - -2019-08-24 17:14:09 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11memory.h: - d3d11: Add method for querying d3d11 memory type - ... and fix misreading "private" annotation. - -2019-09-25 20:34:10 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11device.h: - d3d11device: Store selected d3d feature level - Depending on selected feature level, d3d11 API usage can be different. - Instead of querying the selected feature level by user whenever required, - store it once by d3d11device. - -2019-08-23 21:41:39 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11device.h: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11utils.h: - * sys/d3d11/gstd3d11videosink.c: - d3d11: Don't share d3d11 device context unconditionally without checking adapter - Do not accept any GstD3D11Device context which has different adapter - index from the required one. For example, if a d3d11 element is expecting - d3d11 device with adapter 1 (i.e., the second GPU), any d3d11 device - context having different adapter could not be shared with - the d3d11 element. - -2019-09-24 20:32:47 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11device.h: - d3d11device: Don't allow auto adapter selection - Change to d3d11device to be created with explicit target adapter index, - and expose some readonly device properties - -2019-08-18 20:56:06 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/gstd3d11device.h: - * sys/d3d11/gstd3d11memory.c: - * sys/d3d11/gstd3d11utils.c: - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11window.c: - d3d11: Rename native handle getter and context utils functions - Make them consistent with cuda context utils functions. - Put in-only parameter before all in-out parameters, and add _handle() - suffix to native handle getter functions. - -2019-12-02 11:13:11 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: use parent buffer pool to release buffers - In certain cases, the sink's buffer pool will not call the parent's - release_buffer method, so the pool does not clean up properly - after the buffer is released. - -2019-11-29 13:45:42 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/meson.build: - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkcolorconvert.h: - * ext/vulkan/vkelementutils.c: - * ext/vulkan/vkelementutils.h: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkimageidentity.h: - * ext/vulkan/vkshader.c: - * ext/vulkan/vkshader.h: - * ext/vulkan/vkviewconvert.c: - * ext/vulkan/vkviewconvert.h: - * gst-libs/gst/vulkan/gstvkfullscreenquad.c: - * gst-libs/gst/vulkan/gstvkfullscreenquad.h: - * gst-libs/gst/vulkan/gstvkutils.c: - * gst-libs/gst/vulkan/gstvkutils.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - * gst-libs/gst/vulkan/vulkan_fwd.h: - * tests/check/libs/vkimage.c: - vulkan: move fullscreenquad object to library - It's useful and extensible enough to be used by us and other elements - -2019-11-29 11:05:50 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkimagememory.c: - * gst-libs/gst/vulkan/gstvkphysicaldevice.c: - * gst-libs/gst/vulkan/gstvktrash.c: - vulkan: fix up some gir annotations - -2019-12-03 15:45:26 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/interlace/gstinterlace.c: - interlace: Store unsigned integers in unsigned integer types - And add some assertions to guard against overflows and out of bounds - reads. - -2019-12-03 15:35:57 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/interlace/gstinterlace.c: - interlace: Increment phase_index before checking if we're at the end of the phase - Incrementing it afterwards will always have to phase_index >= 1 and we - will never be at the beginning (0) of the phase again, and thus never - reset timestamp tracking accordingly. - This was broken in bea13ef43b719aad96e28766cd4d23652a891a20 in 2010, and - causes interlace to run into integer overflows after 2^31 frames or - about 5 hours at 29.97fps. Due to usage of wrong types for the integers - this then causes negative numbers to be used in calculations and all - calculations spectacularly fail, leading to all following buffers to - have the timestamp of the first buffer minus one nanosecond. - -2019-11-27 15:38:50 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/gstrtmp2sink.c: - rtmp2sink: Only apply @setDataFrame to onMetaData messages - Only the metadata needs to be made "sticky". Custom data messages should - be passed on unmodified. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/878 - -2019-11-27 15:38:39 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpmessage.c: - * gst/rtmp2/rtmp/rtmpmessage.h: - rtmp2: Add gst_rtmp_message_is_metadata - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/878 - -2019-11-27 15:38:20 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpconnection.c: - * gst/rtmp2/rtmp/rtmpconnection.h: - rtmp2: Add gst_rtmp_connection_set_data_frame - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/878 - -2019-11-27 15:37:45 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/amf.c: - * gst/rtmp2/rtmp/amf.h: - rtmp2: Add single-value AMF0 parsing and serializing - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/878 - -2019-11-27 15:36:07 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/amf.c: - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: Minor changes - - Remove an unneeded initialization to zero from AmfParser - - Add missing initialization to gst_amf_serialize_command_valist - - Add a g_return_if_fail to gst_rtmp_connection_request_window_size - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/878 - -2019-12-03 14:19:05 +1100 Matthew Waters <matthew@centricular.com> - - * meson.build: - build: use -fvisibility=hidden for objc code - -2019-12-03 14:18:49 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/cocoa/gstvkcocoa_utils.h: - * gst-libs/gst/vulkan/ios/gstvkios_utils.h: - vulkan: priviatise _invoke_on_main() - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1132 - -2019-11-21 16:59:29 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkdeviceprovider.cpp: - * sys/decklink/gstdecklinkdeviceprovider.h: - * sys/decklink/meson.build: - decklink: Add simple device provider for Decklink devices - -2019-12-01 17:04:05 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/openexr/meson.build: - openexr: Fix check for when to pass -std=c++98 - commit 6adfb120ab0e1bb0b3439ad725a362cfe4fbe733 added this flag to fix - builds with `-Werror`, and afterwards it was changed to use a version - check when newer versions of openexr moved over to C++11. - However, some distros have backported patches to older openexr - versions which make it require C++11, which makes the version check - incorrect and causes an error because we passed `-Werror -std=c++98`. - Instead, directly check when usage of the header requires `-std=c++98` - with `-Werror` and override the `cpp_std` setting on the target. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1117 - -2019-11-30 14:08:06 +0100 o0Ignition0o <jeremy.lempereur@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: Explicitly request device video permissions for macOS 10.14+ - Since macOS Mojave (10.14), video permissions have to be explicitly - granted by a user in order to open a video device such as a camera. - This commit adds a check for the current permission status, and tries - to request for permission if applicable. - -2019-11-27 00:25:16 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkdownload.c: - * ext/vulkan/vkfullscreenquad.c: - * ext/vulkan/vkupload.c: - * ext/vulkan/vkviewconvert.c: - * gst-libs/gst/vulkan/gstvkdescriptorcache-private.h: - * gst-libs/gst/vulkan/gstvkdescriptorcache.c: - * gst-libs/gst/vulkan/gstvkdescriptorcache.h: - * gst-libs/gst/vulkan/gstvkdescriptorpool.h: - * gst-libs/gst/vulkan/gstvkdescriptorset.c: - * gst-libs/gst/vulkan/gstvkdevice.c: - * gst-libs/gst/vulkan/gstvkdevice.h: - * gst-libs/gst/vulkan/gstvkfence.c: - * gst-libs/gst/vulkan/gstvkfence.h: - * gst-libs/gst/vulkan/gstvkhandlepool.c: - * gst-libs/gst/vulkan/gstvkhandlepool.h: - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/gstvktrash.c: - * gst-libs/gst/vulkan/gstvktrash.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - * gst-libs/gst/vulkan/vulkan_fwd.h: - * meson.build: - * meson_options.txt: - vulkan: implement caching and reuse of a couple of vulkan resources - Includes a new GstVulkanHandlePool base class for pooling different - resources togther. The descriptor cache object is ported to - GstVulkanHandlePool with the exact same functionality. - A new GstVulkanFenceCache is also implemented for caching fences - which is used internally by GstVulkanDevice for creating or reusing - fences. - The existing GstVulkanTrashFenceList object now caches trash objects. - -2019-11-26 18:29:14 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvktrash.c: - * gst-libs/gst/vulkan/gstvktrash.h: - vulkan/trash: remove free functions covered by GstVulkanHandle - -2019-11-26 18:27:04 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkcolorconvert.c: - vulkancolorconvert: disable YUY2 conversion - It doesn't work and never seemed to - -2019-11-26 18:11:25 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/meson.build: - * ext/vulkan/shaders/ayuv_to_rgb.frag: - * ext/vulkan/shaders/identity.frag: - * ext/vulkan/shaders/nv12_to_rgb.frag: - * ext/vulkan/shaders/rgb_to_ayuv.frag: - * ext/vulkan/shaders/rgb_to_nv12.frag: - * ext/vulkan/shaders/rgb_to_yuy2.frag: - * ext/vulkan/shaders/swizzle.frag: - * ext/vulkan/shaders/swizzle_and_clobber_alpha.frag: - * ext/vulkan/shaders/uyvy_to_rgb.frag: - * ext/vulkan/shaders/view_convert.frag: - * ext/vulkan/shaders/yuy2_to_rgb.frag: - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkcolorconvert.h: - * ext/vulkan/vkfullscreenquad.c: - * ext/vulkan/vkfullscreenquad.h: - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vkfullscreenrender.h: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkimageidentity.h: - * ext/vulkan/vkshader.c: - * ext/vulkan/vkshader.h: - * ext/vulkan/vkviewconvert.c: - * ext/vulkan/vkviewconvert.h: - * gst-libs/gst/vulkan/gstvkvideofilter.c: - * gst-libs/gst/vulkan/gstvkvideofilter.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - vulkan: split vkfullscreenrender into two - Part 1 is a base class (vkvideofilter) that handles instance, device, - queue retrieval and holding that has been moved to the library - Part 2 is a fullscreenrenderquad that is still in the plugin that - performs all of the previous vulkan-specific functionality. - -2019-11-26 16:26:41 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkupload.c: - vulkan/upload: allocate from the correct pool - Only relevant when upstream does not use our provided pool. - -2019-11-26 16:25:43 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkhandle.c: - * gst-libs/gst/vulkan/gstvkhandle.h: - vulkan/handle: add some handle types - -2019-11-18 20:29:10 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkimagememory.c: - * gst-libs/gst/vulkan/gstvkimagememory.h: - * gst-libs/gst/vulkan/gstvkimageview.c: - * tests/check/libs/vkimage.c: - * tests/check/meson.build: - vulkan/image: don't rely on weak-ref notifies for views - Weak refs don't quite work here correctly as there is always a race with - taking the lock between find_view() and remove_view(). If find_view() - returns a view that is going to removed by remove_view() then we have an - interesting situation. - In theory, the number and type of views for an image are relatively - constant and should not change one they've been set up which means that - it is actually practical to perform pool-like reference counting here - where the image holds a pool of different views that it can give out - as necessary. - -2019-11-18 15:20:18 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkupload.c: - * gst-libs/gst/vulkan/gstvkswapper.c: - vulkan: add a couple of missing fence unrefs - -2019-10-04 16:05:05 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkcolorconvert.c: - vulkan/colorconvert: zero out sampler create struct - -2019-11-26 11:39:32 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisrc.c: - wasapisrc: Correctly handle BUFFERFLAGS_SILENT - We need to ignore the data we get from WASAPI in this case and write - out silence (zeroes). - Initially reported at https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/808 - -2019-11-25 21:25:43 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisrc.c: - wasapisrc: Try harder to avoid debug output in the hot loop - The whole `src_read()` function is a hot loop since the ringbuffer - thread is waiting on us, and printing to the console from inside it - can easily cause us to miss our deadline. - F.ex., if you had GST_DEBUG=3 and we accidentally missed a device - period, we'd trigger the "reported glitch" warning, which would cause - us to miss another device period, and so on. Let's reduce the log - level so that GST_DEBUG=3 is more usable, and only print buffer flag - info when it's actually relevant. - -2019-11-25 21:19:59 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - wasapisrc: Fix capturing from some buggy audio drivers - Some audio drivers return varying amounts of data per ::GetBuffer - call, instead of following the device period that they've told us - about in `src_prepare()`. - Previously, we would just drop those extra buffers hoping that the - extra buffers were temporary (f.ex., a startup 'burst' of audio data). - However, it seems that some audio drivers, particularly on older - Windows versions (such as Windows 10 1703 and older) consistently - return varying amounts of data. - Use GstAdapter to smooth that out, and hope that the audio driver is - locally varying but globally periodic. - Initially reported in https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/808 - -2019-11-25 21:16:05 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisrc.c: - wasapisrc: Clarify that nBlockAlign is actually bpf - bpf = bytes per frame. - -2019-11-25 21:00:14 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapiutil.c: - wasapisrc: Fix glitching and clock skew issues - We were miscalculating the device period, i.e. the number of frames - we'll get from WASAPI in each IAudioClient::GetBuffer call, due to - a calculation mistake (truncate instead of round). - For example, on my machine when the aux input is set to 44.1KHz, the - reported device period is 101587, which comes out to 447.998 frames - per ::GetBuffer call. In reality we will, of course, get 448 frames - per call, but we were truncating, so we expected 447 and were - discarding one frame every time. This led to glitching, and skew over - time. - Interestingly, I can only see this with 44.1Khz. 48Khz/96Khz are fine, - because the device period is a more 'even' number. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/806 - -2019-11-27 15:41:26 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsmux/gstatscmux.c: - atscmux: Add missing break in switch - CID: 1455515 - -2019-11-27 12:24:46 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/msdk/msdk.c: - msdk: Fix mixed declarations warning - msdk.c:194:3: warning: ISO C90 forbids mixed declarations and code -Wdeclaration-after-statement - -2019-11-26 13:05:38 -0500 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: buffer mismatch in map/unmap - -2019-11-19 15:35:20 -0800 Julien Isorce <jisorce@oblong.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: log an error if leaking surfaces in finalize - The for loop in gst_msdkdec_handle_frame is error prone - about how it manages surfaces. Because sometimes it sets - the surface variable to NULL and sometimes it needs to free - it right away. So better to print an error if surfaces are - leaked to help with any change around the loop. - -2019-11-25 19:08:48 +0800 Jeffy Chen <jeffy.chen@rock-chips.com> - - * ext/wayland/wlwindow.c: - waylandsink: Commit the parent after creating subsurface - We should commit the parent to activate new subsurface, this is - documented in the protocol. - Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> - -2018-07-20 21:33:24 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/ttml/gstttmlparse.c: - * ext/ttml/ttmlparse.c: - * ext/ttml/ttmlparse.h: - ttmlparse: Collect buffers until detecting complete xml document - Given buffer could be fragmented and we might need to - collect buffers until end tag is detected. And/or, a buffer - can consist of multiple ttml documents. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/494 - -2019-11-20 13:19:02 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/msdk/msdk.c: - msdk: query hardware when checking MFX availability - msdk plugin is not used for sofware encode/decode as there are better - solutions available. Also, with MFX_IMPL_AUTO_ANY, if software decode - is not supported, the plugin will still load, but will then fail when trying to - run the (autoplugged) pipeline. With MFX_IMPL_HARDWARE_ANY, - the plugin fails and a better software decoder is auto-plugged. - -2019-11-20 13:09:34 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/msdk/msdk.c: - msdk: query platform when opening session - -2019-11-14 19:00:51 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - nvenc: Fix crash when nvenc was reused then freed without encoding - GstNvBaseEnc::n_bufs was set from the previous encoding session - but it wasn't cleared after stop. That might result to invalid memory - access at the next start (no encoded data) and then stop sequence. - Instead of defining a variable for array length, use GArray::len - directly to avoid such confusion. - -2019-11-14 18:57:14 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - nvenc: Remove unused code path - refilling queue would not happen - -2019-11-21 16:38:35 +0100 Edward Hervey <edward@centricular.com> - - * ext/webrtc/webrtcdatachannel.c: - webrtcdatachannels: Don't leak strings - They would leak in error cases - CID: 1455480 - -2019-11-21 16:24:38 +0100 Edward Hervey <edward@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Fix memory leak - The structure is not used after this block - CID: 1455481 - -2019-11-19 19:29:26 -0800 Thiago Santos <thiagossantos@gmail.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix 'utc now' gdatetime creation - It broke after removal of usage of GTimeVal that was deprecated, - it requires seconds in this unix-based creation instead of microseconds. - The downside here is that it will create an extra object just to be - discarded in order to add the microsecond part to it. - It would end up segfaulting as it would return a NULL value - -2019-11-18 16:15:21 +0100 Jakub Adam <jakub.adam@collabora.com> - - * ext/srt/gstsrtobject.c: - srtobject: allow passing SRT Stream ID in stream URI - Based on Stream ID, the application can accept or reject the connection, - select the desired data stream, or set an appropriate passphrase for the - connection. Example usage: - srt://127.0.0.1:1234?streamid=mystream - -2019-11-20 11:34:15 +0100 Linus Svensson <linussn@axis.com> - - * ext/curl/meson.build: - curl: Require libcurl 7.55.0 - CURLINFO_CONTENT_LENGTH_DOWNLOAD_T is available from libcurl version - 7.55.0. - -2019-11-18 14:26:31 -0800 Julien Isorce <jisorce@oblong.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: fix surface leak in msdkdec_handle_frame - Can be reproduced with: - videotestsrc ! x264enc key-int-max=$N ! \ - h264parse ! msdkh264dec ! fakesink sync=1 - It happens with any gop size but the smaller is the distance N - between key frames, the quicker it is leaking. - Fixes #1023 - -2019-11-18 15:54:42 -0500 Xavier Claessens <xavier.claessens@collabora.com> - - * ext/dash/meson.build: - dash: Fix typo in meson.build - -2019-11-01 15:58:47 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpcvfdepay.c: - * tests/check/elements/avtpcvfdepay.c: - avtpcvfdepay: Don't hide gst_pad_push return - avtpcvfdepay was effectively hiding any return from gst_pad_push, so no - errors or GST_FLOW_EOS would be propagated upstream. - Tests also added. - -2019-11-01 15:39:25 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpcvfpay.c: - * tests/check/elements/avtpcvfpay.c: - avtpcvfpay: Do not hide or modify gst_pad_push errors - Current code would change any non-ok return from gst_pad_push to - GST_FLOW_ERROR, thus hiding meaningful returns such as GST_FLOW_EOS. - Tests also added. - -2019-10-30 15:24:40 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpcvfdepay.c: - avtpcvfdepay: Tone down some log messages - Most of avtpcvfdepay messages are currently logged as warnings, which can - make some scenarios - such as receiving two AVTP streams on the same - pipeline - too verbose. - This patch tones those message down to INFO or DEBUG level - more in - sync with avtpaafdepay logging. - -2019-11-18 15:42:35 +0100 Marc Leeman <m.leeman@televic.com> - - * gst/rtp/gstrtpsink.c: - * gst/rtp/gstrtpsink.h: - * gst/rtp/gstrtpsrc.c: - * gst/rtp/gstrtpsrc.h: - rtpmanagerbad: allow setting multicast-iface - Allowing the UDP elements to bind on an interface is needed in more - complex networks where there are mutiple networks interfaces without - default gateway - -2019-11-19 12:18:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Create LTC sink pad with the correct name according to the template - Should be "ltc_sink" and not just "ltc" - -2019-10-11 16:19:26 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstvc1parse.c: - videoparsers: Disable gst_base_parse_set_infer_ts - From the documentation of gst_base_parse_set_infer_ts, it should be - disabled for non-audio data. Currently just disabling for all video - parsers that have reordered data: h264, h265, mpeg, mpeg4, vc1. Was - already disabled in h263. - -2019-11-18 23:38:49 +0100 Andrew Branson <andrew.branson@jolla.com> - - * sys/androidmedia/gst-android-hardware-camera.c: - * sys/androidmedia/gst-android-hardware-camera.h: - androidmedia: Add new effects and scene modes to Camera parameters - -2019-10-10 18:18:26 +0200 Andrew Branson <andrew.branson@jollamobile.com> - - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - * tests/check/elements/camerabin.c: - photography: Add additional settings relevant to Android - Exposure mode property, extra colour tone values (aqua, emboss, sketch, neon), extra scene modes (backlight, flowers, AR, HDR). - Missing vmethods for exposure mode, analog gain, lens focus, colour temperature, min & max exposure time - Contribs by Mohammed Sameer <msameer@foolab.org>, Adam Pigg <adam@piggz.co.uk> - -2019-09-05 03:16:28 +0200 Kyrylo Polezhaiev <kirushyk@gmail.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - tsmux: Fix copying of buffer region - -2019-11-15 13:12:48 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/gstd3d9overlay.c: - d3dvideosink: use sink dimensions when calculating overlay scaling - -2019-11-14 22:06:09 -0500 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: use explicit system memory feature in overlay composition caps - -2019-11-05 13:46:59 +0100 Jochen Henneberg <jh@henneberg-systemdesign.com> - - * sys/msdk/meson.build: - msdk: Fixes for meson include directory setup - In case of pkg-config we need to create the include directories object - from the path using include_directories(). For INTELMEDIASDKROOT or - MFX_HOME we need to add the alternate include path ./include/mfx as - Intel MediaSDK now puts the headers there. - -2019-09-23 10:30:40 +0200 Marc Leeman <marc.leeman@gmail.com> - - * gst/rtp/gstrtpsink.c: - * gst/rtp/gstrtpsrc.c: - rtpmanagerbad: name the element children - As discussed with RIST, it is best to name the children of the elements - since these are now created at the element initialisation. - -2019-05-24 17:33:33 +0100 Alex Ashley <alex.ashley@youview.com> - - * ext/curl/gstcurlhttpsrc.c: - * ext/curl/gstcurlhttpsrc.h: - * tests/check/elements/curlhttpsrc.c: - curlhttpsrc: add support for range GET - To allow curlhttpsrc to support DASH streams that use the on-demand - profile, it needs to support HTTP Range GETs. In GStreamer, the RANGE - is specified by issuing a GST_FORMAT_BYTES seek to set the start and - end of the range. curlhttpsrc needs to implement seek and set the - appropriate curl options to make it add the Range header to the - request. - -2019-10-11 17:25:04 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Always issue a DTS even when it's equal to PTS - Currently tsdemux timestamps only the PTS, and only issues the DTS if - it's different. In that case, parsers tend to estimate the next DTS - based on the previous DTS and the duration, which can accumulate - rounding errors. - -2019-11-14 10:00:35 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdownload.c: - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vkupload.c: - * gst-libs/gst/vulkan/gstvkqueue.c: - * gst-libs/gst/vulkan/gstvkqueue.h: - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/vulkan_fwd.h: - vulkan/queue: be sure to take a lock around command submission - This ensures that only one thread is submitting commands at a time as - required by the Vulkan specification. - -2019-11-14 09:56:49 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkfullscreenrender.c: - vulkan/render: fix indent command comment typo - -2019-11-13 20:17:48 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - d3d11window: Fix subclass procedure recursion - subclass window precedure should be cleared if it's no more used. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1115 - -2019-11-13 12:14:02 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vkimageidentity.c: - vulkan: NULL check destruction of vulkan resources - If the element fails to start up, any number of vulkan resources could - have not been created. - -2019-11-13 12:07:45 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkdownload.c: - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkupload.c: - * ext/vulkan/vkviewconvert.c: - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/gstvktrash.c: - vulkan: make new trash objects ref the fence - Avoids gst_vulkan_fence_ref at each call site of the trash object - creation - -2019-11-13 12:05:52 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/wayland/gstvkwindow_wayland.c: - vulkan/wayland: advertise the current surface size - Avoids vkswapper from creating a 0x0 output VkSurface and failing - -2019-11-12 22:06:45 +1100 Jan Schmidt <jan@centricular.com> - - * gst/switchbin/gstswitchbin.c: - switchbin: Free path objects on finalize - Clean up path objects nicely when shutting down, - first by dropping pointers to elements during dispose, - and then by making sure to drop the ref to the path object - when finalizing the switch bin. - Fixes valgrind checks in the unit test. - -2018-07-03 00:30:12 +1000 Jan Schmidt <jan@centricular.com> - - * tests/check/elements/switchbin.c: - * tests/check/meson.build: - switchbin: Add a basic unit-test - Test the basic function of a switchbin - that it correctly - selects between 2 processing paths based on caps - -2018-07-03 00:25:51 +1000 Jan Schmidt <jan@centricular.com> - - * gst/switchbin/gstswitchbin.c: - * gst/switchbin/gstswitchbin.h: - switchbin: Add current-path property - Returns the index of the currently selected processing - path, or MAX-UINT if none - -2019-11-05 01:40:10 +1100 Jan Schmidt <jan@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/switchbin/gstswitchbin.c: - switchbin: Add docs - Add documentation clauses and enrol switchbin to generate - plugin docs - -2019-11-05 01:40:04 +1100 Jan Schmidt <jan@centricular.com> - - * gst/meson.build: - * gst/switchbin/gstswitchbin.c: - * gst/switchbin/gstswitchbin.h: - * gst/switchbin/meson.build: - * gst/switchbin/plugin.c: - * meson_options.txt: - switchbin: Initial checkin - Add code from Stream Unlimited implementing a bin - which switches between different internal decoding/processing - chains based on input caps - -2019-11-12 19:54:46 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3d11/gstd3d11window.c: - d3d11videosink: only destroy loop if external_win_id is false - Loop was created with this condition, so it should also be - destroyed under the same condition - -2019-09-06 19:13:46 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/opencv/meson.build: - * meson.build: - meson: Fix plugin symbol export for C++ sources/plugins - The symbol visibility=hidden flag was only being applied to C - compilation, so plugins implemented in C++ would leak extra symbols - than the 2 _get_desc() and _register(). - That also showed that the gst-libs opencv C++ lib was not marking - symbols for export correctly because the BUILDING_GST_OPENCV define - wasn't in the C++ args, so fix that too. - -2019-11-12 12:04:48 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpmessage.c: - rtmp2: Fix NULL check in gst_rtmp_meta_transform - Coverity rightly complains that checking a pointer for NULL after - dereferencing it is pointless. - Remove the check, and to be safe, assert that gst_buffer_add_meta - returns non-NULL. - CID 1455485 - -2019-11-12 11:46:21 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * gst/rtmp2/rtmp/rtmpchunkstream.c: - * gst/rtmp2/rtmp/rtmpconnection.c: - rtmp2: Check for missing GstRtmpMeta - The message buffers are created using `gst_rtmp_message_new` and thus - always contain a GstRtmpMeta. Add checks to appease Coverity's static - analysis. - CID 1455596 - CID 1455384 - -2019-11-12 12:31:48 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/rtmp2/gstrtmp2sink.c: - rtmp2sink: Add a check that meta isn't NULL before accessing - It really can't be NULL, this is just to convince coverity - CID 1455553 - -2019-11-08 18:00:46 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Do not drain if imported buffer are from KMS - This adds a check to avoid draining when the imported buffers are in - fact own by kmssink. This happens since we export our kms buffer as - DMABuf. They are not really imported back as we pre-fill the cache, - but uses the same format as if they were external. This fixes - performance issues seen with videocrop2-test (found in -good). - -2019-11-08 17:57:58 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: Avoid drain on caps changes - Draining systematically on caps changes was a hack. Instead, properly - save the render information used to render last_render, and use that - information to drain. This fixes performance issues met with video crop - meta and per frame caps changes. - -2019-11-08 17:48:40 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Ensure we have an allocator before importing - This fixes cases where the kms allocator API was called with a null - pointer. - -2019-07-12 20:39:45 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: Avoid division by zero assertion - A framerate of 0/1 is valid, but we cannot calculate the frame duration - in this context. Simply protect against this case. - Related to #660 - -2018-02-17 19:38:22 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parser: Relax ASF Binding Byte validation - According to the spec, the least significant bit is reserved and should - always we set to 1. Though, some wrong file has been found. Considering - how low important this reserved bit is, relax the validation. - Related to #660 - -2019-11-11 09:36:48 +0800 Fuwei Tang <fuweix.tang@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - vc1parser : fix a miswrite - -2019-11-11 10:50:58 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkhandle.h: - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/gstvktrash.c: - vkhandle: expose a printf format specifier for a vulkan handle - -2019-11-11 10:33:23 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdescriptorpool.c: - vkdescriptor: set the GError on the 'too many allocations' case - -2019-10-17 23:25:14 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkswapper.c: - vkswapper: add inherit support - Used on android - -2019-10-17 22:27:44 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkswapper.c: - vkswapper: output specific values when swapchain flags fail - -2019-10-16 17:17:51 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/android/gstvkdisplay_android.c: - * gst-libs/gst/vulkan/android/gstvkdisplay_android.h: - * gst-libs/gst/vulkan/android/gstvkwindow_android.c: - * gst-libs/gst/vulkan/android/gstvkwindow_android.h: - * gst-libs/gst/vulkan/gstvkconfig.h.meson: - * gst-libs/gst/vulkan/gstvkdisplay.c: - * gst-libs/gst/vulkan/gstvkdisplay.h: - * gst-libs/gst/vulkan/gstvkwindow.c: - * gst-libs/gst/vulkan/meson.build: - vulkan: add android WSI integration - -2019-11-10 18:31:49 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/vulkan/ios/gstvkwindow_ios.m: - vulkan: Fix build on ios - These little bits were missed during the refactor in - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/821 - -2019-10-24 15:27:42 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/meson.build: - amc: Change plugin name if it's built for Magic Leap - -2018-11-19 13:40:35 -0500 Xavier Claessens <xavier.claessens@collabora.com> - - * meson_options.txt: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/magicleap/gstamc-codec-ml.c: - * sys/androidmedia/magicleap/gstamc-codeclist-ml.c: - * sys/androidmedia/magicleap/gstamc-format-ml.c: - * sys/androidmedia/magicleap/gstamc-internal-ml.h: - * sys/androidmedia/magicleap/gstamc-surfacetexture-ml.c: - * sys/androidmedia/magicleap/gstamc-surfacetexture-ml.h: - * sys/androidmedia/meson.build: - amc: Add MLSDK implementation - -2019-11-08 23:42:08 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/vulkan/win32/gstvkwindow_win32.c: - vulkan: Fix build on Windows - gstvkwindow_win32.c(166): error C2065: 'msg_source': undeclared identifier - -2019-11-06 15:07:44 +0100 Edward Hervey <edward@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Don't use deprecated SSL methods - And instead use the fixed-size variants (which aren't deprecated) - -2019-11-06 14:36:11 +0100 Edward Hervey <edward@centricular.com> - - * ext/opencv/gstmotioncells.cpp: - * ext/opencv/gstmotioncells.h: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/uridownloader/gsturidownloader.c: - * gst/asfmux/gstasfobjects.c: - * gst/mxf/mxftypes.c: - bad: Avoid using deprecated API - GTimeval is deprecated - -2019-11-07 18:45:55 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkvp8enc.c: - * sys/msdk/gstmsdkvp8enc.h: - * sys/msdk/meson.build: - msdk: remove msdkvp8enc - MediaSDK doesn't support vp8 encode which is not going to be - implemented 1, so remove msdkvp8enc from this plugin - 1: https://github.com/Intel-Media-SDK/MediaSDK/issues/947 - -2019-11-07 02:41:10 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/cocoa/gstvkwindow_cocoa.h: - * gst-libs/gst/vulkan/cocoa/gstvkwindow_cocoa.m: - * gst-libs/gst/vulkan/gstvkbufferpool.c: - * gst-libs/gst/vulkan/gstvkbufferpool.h: - * gst-libs/gst/vulkan/gstvkcommandpool.c: - * gst-libs/gst/vulkan/gstvkdescriptorcache.c: - * gst-libs/gst/vulkan/gstvkdescriptorpool.c: - * gst-libs/gst/vulkan/gstvkdisplay.c: - * gst-libs/gst/vulkan/gstvkdisplay.h: - * gst-libs/gst/vulkan/gstvkimagebufferpool.c: - * gst-libs/gst/vulkan/gstvkimagebufferpool.h: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkinstance.h: - * gst-libs/gst/vulkan/gstvkphysicaldevice.c: - * gst-libs/gst/vulkan/gstvkphysicaldevice.h: - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/gstvkswapper.h: - * gst-libs/gst/vulkan/gstvkwindow.c: - * gst-libs/gst/vulkan/gstvkwindow.h: - * gst-libs/gst/vulkan/ios/gstvkwindow_ios.h: - * gst-libs/gst/vulkan/ios/gstvkwindow_ios.m: - * gst-libs/gst/vulkan/win32/gstvkwindow_win32.c: - * gst-libs/gst/vulkan/win32/gstvkwindow_win32.h: - * gst-libs/gst/vulkan/xcb/gstvkwindow_xcb.c: - * gst-libs/gst/vulkan/xcb/gstvkwindow_xcb.h: - vulkan: remove the private struct from the public struct - Remove any references to CamelTypePrivate from the public CamelType - struct. They can be accessed as needed using - camel_type_get_instance_private(). - -2019-11-06 22:19:42 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkcolorconvert.h: - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vkfullscreenrender.h: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkimageidentity.h: - * ext/vulkan/vkviewconvert.c: - * ext/vulkan/vkviewconvert.h: - * gst-libs/gst/vulkan/gstvkdescriptorcache-private.h: - * gst-libs/gst/vulkan/gstvkdescriptorcache.c: - * gst-libs/gst/vulkan/gstvkdescriptorcache.h: - * gst-libs/gst/vulkan/gstvkdescriptorpool.c: - * gst-libs/gst/vulkan/gstvkdescriptorpool.h: - * gst-libs/gst/vulkan/gstvkdescriptorset.c: - * gst-libs/gst/vulkan/gstvkdescriptorset.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - * gst-libs/gst/vulkan/vulkan_fwd.h: - vulkan: implement proper descriptor set handling - The major functionality gain this provides is proper reference counting - for a descriptor set. Overall this allows us to create descriptor sets - when they are needed (or reused from a cache) without violating any of - vulkan's object synchronisation requirements. - As there are a fixed number of sets available in a pool, the number of - descriptors in elements is currently hardcoded to 32. This can be extended - in a future change to create pools on the fly if that limit is ever overrun. - -2019-11-06 09:34:36 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkviewconvert.c: - * gst-libs/gst/vulkan/gstvkfence.c: - * gst-libs/gst/vulkan/gstvkfence.h: - vulkan/fence: add always-signalled fence type - Allows a cleaner control flow when there is no fence available for use - with the trash list. An always signalled fence type will always return - TRUE for gst_vulkan_fence_is_signalled. - -2019-11-06 09:29:51 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkhandle.c: - * gst-libs/gst/vulkan/gstvkhandle.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - * gst-libs/gst/vulkan/vulkan_fwd.h: - vulkan: add handle type for arbitrary vulkan handles - Serve two purposes: - 1. refcounting of vulkan handles with associated destruction. When - combined with the trash list, the user can ensure destruction at - the correct time according to the vulkan rules. - 2. avoids polluting our API with 32-bit vs 64-bit integer/pointers - differences as exposed through the vulkan API. on 32-bit, vulkan - non-dispatchable handles are 64-bit integers and on 64-bit, they - are pointers. - -2019-11-06 22:09:02 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkviewconvert.c: - vulkanviewconvert: fix typo of output image view name - -2019-10-16 17:47:33 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvktrash.c: - vulkan: fix non-dispatchable handles on 32-bit platforms - non-dispatchable handles are 64-bit integers on 32-bit platforms - -2019-10-16 17:42:33 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkshader.c: - * ext/vulkan/vkviewconvert.c: - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/gstvktrash.c: - vulkan: use VK_NULL_HANDLE in more places - Fixes compiler warnings on 32-bit platforms assigning a void * to a - 64-bit integer value. - -2019-10-16 17:27:16 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkinstance.c: - vulkan: use the provided VKAPI_ATTR for the debug callback - Ensures that we get the calling convention correct for the platform we - are using. - -2019-11-03 21:50:39 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdebug.h: - * gst-libs/gst/vulkan/gstvkswapper.c: - vulkan: dump surface information - -2019-10-30 19:33:25 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkinstance.c: - vulkan: print criticals/warnings for vulkan errors/warnings - Simplifies finding the erronous cases in using the Vulkan API - incorrectly. - -2019-10-30 00:57:55 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkupload.c: - * ext/vulkan/vkviewconvert.c: - * gst-libs/gst/vulkan/gstvkimagebufferpool.c: - * gst-libs/gst/vulkan/gstvkimagememory.c: - * gst-libs/gst/vulkan/gstvkimagememory.h: - * gst-libs/gst/vulkan/gstvkswapper.c: - vulkan/image: use the full video info for returning vulkan formats - We may need some colorspace information for returning sRGB vs no sRGB. - -2019-11-06 14:22:07 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Handle continuity mismatch in more cases - Packets of a given PID are meant to have sequential continuity counters - (modulo 16). If there are not sequential, this is the sign of a broken - stream, which we then consider as a discontinuity. - But if that new packet is a frame start (PUSI is true), then we can resume - from that packet without any damage. - -2019-11-01 14:22:46 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * ext/vulkan/meson.build: - vulkan: Fix build error when gstvulkan is not installed - The following build error occurs: - vkdeviceprovider.h:30:10: fatal error: gst/vulkan/vulkan.h: No such file or directory - #include <gst/vulkan/vulkan.h> - ^~~~~~~~~~~~~~~~~~~~~ - -2019-10-23 10:11:46 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstclockselect.c: - * gst/debugutils/gstclockselect.h: - * gst/debugutils/meson.build: - * tests/check/elements/clockselect.c: - * tests/check/meson.build: - debugutils: clockselect, a pipeline that enables clock selection - Sometimes, one wants to force a clock on some pipelines - for instance, - when testing TSN related pipelines, one usually uses GstPtpClock or - CLOCK_REALTIME (assuming system realtime clock is in sync with network - one). Until now, one needs to write an application for that - not - difficult, but quite boring if one just wants to test something. This - patch presents a new element to help that: clockselect. - clockselect is a pipeline with two properties to select a clock. One - property, "clock-id", enables one to choose between "monotonic", - "realtime", "ptp" or "default" clock - where default keeps pipeline - behaviour of choosing a clock based on its elements. The other property, - "ptp-domain" gives one the choice of which PTP domain should be used. - Some very simple tests also added for this new element. - -2019-08-27 07:59:27 +0200 Niels De Graef <nielsdegraef@gmail.com> - - * ext/dtls/gstdtlsconnection.c: - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlsenc.c: - * ext/dtls/gstdtlssrtpenc.c: - * ext/resindvd/rsninputselector.c: - * ext/sctp/gstsctpdec.c: - * ext/sctp/gstsctpenc.c: - * ext/sctp/sctpassociation.c: - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsrc.c: - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/sctptransport.c: - * ext/webrtc/webrtcdatachannel.c: - * ext/wpe/gstwpesrc.cpp: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/webrtc/icetransport.c: - * gst/camerabin2/gstcamerabin2.c: - * sys/d3d11/gstd3d11window.c: - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/ipcpipeline/gstipcpipelinesink.c: - * sys/ipcpipeline/gstipcpipelinesrc.c: - * sys/shm/gstshmsink.c: - Don't pass default GLib marshallers for signals - By passing NULL to `g_signal_new` instead of a marshaller, GLib will - actually internally optimize the signal (if the marshaller is available - in GLib itself) by also setting the valist marshaller. This makes the - signal emission a bit more performant than the regular marshalling, - which still needs to box into `GValue` and call libffi in case of a - generic marshaller. - Note that for custom marshallers, one would use - `g_signal_set_va_marshaller()` with the valist marshaller instead. - -2019-10-28 13:42:15 +0900 Justin Kim <jeongseok.kim@sk.com> - - * ext/srt/gstsrtobject.c: - srt: split incoming buffer up into srt chunk - -2019-11-02 16:29:02 +0100 Ignacio Casal Quinteiro <qignacio@amazon.com> - - * sys/wasapi/gstwasapisrc.c: - wasapi: minor cleanup - -2019-08-27 15:14:31 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * gst/sdp/gstsdpsrc.c: - sdp: don't leak the ghost pad - The peer is already gone when pad_removed_cb() called, so the ghost cannot - be removed. Use g_object_set_data() instead to remember the ghost pad. - Copied from similar code in GstRTPBin. - -2019-10-22 14:10:30 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dhelpers.h: - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/gstd3d9overlay.c: - * sys/d3dvideosink/gstd3d9overlay.h: - * sys/d3dvideosink/meson.build: - d3dvideosink: support OverlayComposition for GPU overlay compositing - -2019-11-04 20:42:19 -0500 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/mpegtsmux/gstbasetsmux.c: - basetsmux: allow null J2K profile - Since we are not requiring that profile equals GST_JPEG2000_PARSE_PROFILE_BC_SINGLE, - (as the standard requires) we can allow profile to be null. We relax this condition because - OpenJPEG can't create broadcast profiles. - -2019-11-03 05:56:12 -0500 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: fail caps negotiation if caps are NOT fixed - -2019-08-08 15:27:11 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: use pre_push_frame to reset parser - -2019-08-08 15:26:22 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: parse_event: call base class at end - derived class should do it's work first before calling base - -2019-08-05 21:53:54 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: do hard reset if gst_base_parse_finish_frame fails - -2019-08-05 17:15:57 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: initialize some variables to make valgrind happy - -2019-08-09 09:29:22 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * tests/check/elements/jpeg2000parse.c: - * tests/check/meson.build: - jpeg2000parse: add unit test - -2019-08-09 09:28:53 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: use GST_INT in caps for profile - Negotiation failed with GST_UINT - -2019-08-05 15:38:08 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - * gst/videoparsers/gstjpeg2000parse.h: - jpeg2000parse: make explicit that codec_format is for src caps - -2019-08-05 15:24:49 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: refactor - 1. only recalculate src codec format if sink caps change - 2. use correct value for "jp2c" magic in J2C box ID - 3. only parse J2K magic once, and store result - 4. more sanity checks comparing caps to parsed codec - -2019-08-05 15:34:08 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: set parsed to TRUE in src caps - -2019-08-05 15:33:33 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: only cache caps parameters when caps have in fact changed - -2019-08-05 15:23:24 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: fix typos in media format - -2019-08-05 15:19:12 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstjpeg2000parse.c: - * gst/videoparsers/gstjpeg2000parse.h: - jpeg2000parse: add reset method - Also add three new struct members, currently unused. - -2019-09-02 15:08:44 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * NEWS: - * docs/plugins/gst_plugins_cache.json: - * ext/aom/gstav1enc.c: - * ext/assrender/gstassrender.c: - * ext/closedcaption/gstcea708decoder.c: - * ext/closedcaption/gstceaccoverlay.c: - * ext/closedcaption/raw_decoder.c: - * ext/closedcaption/sliced.h: - * ext/colormanagement/gstlcms.c: - * ext/curl/gstcurlhttpsrc.h: - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/directfb/dfbvideosink.c: - * ext/dtls/gstdtlsconnection.h: - * ext/hls/gsthlsdemux.c: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/ladspa/gstladspa.c: - * ext/libmms/gstmms.c: - * ext/lv2/gstlv2filter.c: - * ext/lv2/gstlv2utils.c: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mpeg2enc/gstmpeg2encoptions.cc: - * ext/neon/gstneonhttpsrc.c: - * ext/opencv/MotionCells.cpp: - * ext/opencv/gstcvdilate.cpp: - * ext/opencv/gstcvdilateerode.cpp: - * ext/opencv/gstcverode.cpp: - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstdewarp.cpp: - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstedgedetect.cpp: - * ext/opencv/gstfaceblur.cpp: - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gstgrabcut.cpp: - * ext/opencv/gstretinex.cpp: - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstskindetect.cpp: - * ext/opencv/gsttextoverlay.cpp: - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/rsninputselector.c: - * ext/rtmp/gstrtmpsrc.c: - * ext/soundtouch/gstpitch.cc: - * ext/spandsp/gstdtmfdetect.c: - * ext/spandsp/gsttonegeneratesrc.c: - * ext/srt/gstsrtobject.c: - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpenc.c: - * ext/ttml/subtitle.h: - * ext/ttml/ttmlparse.c: - * ext/vulkan/vkdownload.c: - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vkshader.c: - * ext/vulkan/vkupload.c: - * ext/vulkan/vkviewconvert.c: - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlbuffer.c: - * ext/webp/gstwebpdec.c: - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/transportreceivebin.c: - * ext/webrtc/webrtcsdp.c: - * ext/webrtcdsp/gstwebrtcdsp.cpp: - * ext/webrtcdsp/gstwebrtcechoprobe.cpp: - * ext/webrtcdsp/gstwebrtcechoprobe.h: - * ext/wildmidi/gstwildmididec.c: - * ext/wpe/gstwpesrc.cpp: - * ext/x265/gstx265enc.c: - * ext/zbar/gstzbar.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/audio/gstnonstreamaudiodecoder.c: - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - * gst-libs/gst/codecparsers/gstmpeg4parser.h: - * gst-libs/gst/codecparsers/gstvc1parser.h: - * gst-libs/gst/codecparsers/gstvp9parser.c: - * gst-libs/gst/codecparsers/gstvp9parser.h: - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/player/gstplayer-media-info.h: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/uridownloader/gstfragment.c: - * gst-libs/gst/uridownloader/gsturidownloader.c: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/gstvkwindow.c: - * gst-libs/gst/vulkan/win32/gstvkwindow_win32.c: - * gst-libs/gst/wayland/wayland.c: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfobjects.c: - * gst/audiovisualizers/gstsynaescope.c: - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautovideoconvert.c: - * gst/autoconvert/plugin.c: - * gst/bayer/gstbayer2rgb.c: - * gst/camerabin2/camerabin2-src.txt: - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/gstdebugspy.c: - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/dvb-sub.h: - * gst/dvdspu/Notes.txt: - * gst/dvdspu/gstspu-vobsub-render.c: - * gst/festival/gstfestival.c: - * gst/frei0r/frei0r.h: - * gst/frei0r/gstfrei0r.c: - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstsolarize.c: - * gst/geometrictransform/gstbulge.c: - * gst/geometrictransform/gststretch.c: - * gst/geometrictransform/gsttunnel.c: - * gst/id3tag/id3tag.c: - * gst/ivfparse/gstivfparse.c: - * gst/jpegformat/gstjpegparse.c: - * gst/librfb/rfbdecoder.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegpsmux/psmux.c: - * gst/mpegpsmux/psmuxstream.c: - * gst/mpegpsmux/psmuxstream.h: - * gst/mpegtsdemux/TODO: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsmux/gstmpegtsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mxf/mxfdms1.c: - * gst/netsim/gstnetsim.c: - * gst/pcapparse/gstirtspparse.c: - * gst/pnm/gstpnmdec.c: - * gst/removesilence/gstremovesilence.c: - * gst/rist/gstristrtxsend.c: - * gst/rist/gstristsink.c: - * gst/rist/gstroundrobin.c: - * gst/rtp/gstrtpsrc.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/h263parse.c: - * gst/vmnc/vmncdec.c: - * hooks/pre-commit.hook: - * sys/androidmedia/gstahcsrc.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - * sys/androidmedia/gstjniutils.c: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/vtenc.c: - * sys/d3d11/gstd3d11device.c: - * sys/d3d11/meson.build: - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dvideosink.c: - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/directsound/gstdirectsoundsrc.c: - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.h: - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dvb/camtransport.c: - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/ipcpipeline/gstipcpipelinesink.c: - * sys/ipcpipeline/gstipcslavepipeline.c: - * sys/kms/gstkmssink.c: - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdkbufferpool.c: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/gstmsdkvc1dec.c: - * sys/msdk/gstmsdkvideomemory.c: - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpputil.c: - * sys/msdk/msdk.c: - * sys/nvcodec/gstcudautils.c: - * sys/nvcodec/gstnvbaseenc.c: - * sys/uvch264/gstuvch264_src.c: - * sys/uvch264/gstuvch264deviceprovider.c: - * sys/wasapi/gstwasapisink.c: - * sys/winks/gstksvideodevice.c: - * sys/winks/ksvideohelpers.c: - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.c: - * tests/check/elements/adaptive_demux_engine.h: - * tests/check/elements/avtpcvfpay.c: - * tests/check/elements/dash_mpd.c: - * tests/check/elements/hlsdemux_m3u8.c: - * tests/check/elements/jifmux.c: - * tests/check/elements/nvdec.c: - * tests/check/libs/insertbin.c: - * tests/check/libs/player.c: - * tests/check/pipelines/ipcpipeline.c: - * tests/examples/ipcpipeline/ipc-play.c: - * tests/examples/playout.c: - * tools/gst-transcoder.c: - * tools/utils.c: - documentation: fixed a heap o' typos - -2019-11-05 13:52:55 +0000 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/meson.build: - * gst/rtmp2/TODO: - * gst/rtmp2/gstrtmp2.c: - * gst/rtmp2/gstrtmp2locationhandler.c: - * gst/rtmp2/gstrtmp2locationhandler.h: - * gst/rtmp2/gstrtmp2sink.c: - * gst/rtmp2/gstrtmp2sink.h: - * gst/rtmp2/gstrtmp2src.c: - * gst/rtmp2/gstrtmp2src.h: - * gst/rtmp2/meson.build: - * gst/rtmp2/rtmp/amf.c: - * gst/rtmp2/rtmp/amf.h: - * gst/rtmp2/rtmp/rtmpchunkstream.c: - * gst/rtmp2/rtmp/rtmpchunkstream.h: - * gst/rtmp2/rtmp/rtmpclient.c: - * gst/rtmp2/rtmp/rtmpclient.h: - * gst/rtmp2/rtmp/rtmpconnection.c: - * gst/rtmp2/rtmp/rtmpconnection.h: - * gst/rtmp2/rtmp/rtmphandshake.c: - * gst/rtmp2/rtmp/rtmphandshake.h: - * gst/rtmp2/rtmp/rtmpmessage.c: - * gst/rtmp2/rtmp/rtmpmessage.h: - * gst/rtmp2/rtmp/rtmputils.c: - * gst/rtmp2/rtmp/rtmputils.h: - * meson_options.txt: - Add files from gst-rtmp - For master, without autotools. - -2019-10-06 22:46:52 +0900 Wonchul Lee <chul0812@gmail.com> - - * ext/aom/gstav1enc.c: - * ext/aom/gstav1enc.h: - av1enc: Add tile-{columns,rows} properties - It provides to set tile-columns and tile-rows configurations. The av1 - codec allows an input image frame be partitioned into separate vertical - or horizontal tile which can be encoded or decoded independently. It - helps to encode/decode parallel. - -2019-10-06 17:20:12 +0900 Wonchul Lee <chul0812@gmail.com> - - * ext/aom/gstav1enc.c: - av1enc: Enable row-mt by default - Enabling row-mt property can help to increase cpu utilization and reduce - encoding speed, so set it to on by default. - -2019-07-23 18:24:11 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * ext/curl/gstcurlhttpsrc.c: - curlhttpsrc: Hook up libcurl logging message to gstreamer - CURLOPT_DEBUGFUNCTION option replaces the standard debug function - used when CURLOPT_VERBOSE is in effect. This callback receives various debug information. - -2019-09-20 14:52:15 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristsrc.c: - ristsrc: Apply BINDTODEVICE to socket created by udpsrc too - -2019-11-03 09:54:40 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstccconverter.c: - * tests/check/elements/ccconverter.c: - ccconverter: Instead of erroring out on too big input drop additional data - -2019-10-30 14:56:41 +0700 Roman Shpuntov <roman.shpuntov@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: fix leak of CMFormatDescription - There was consideration for replacing the CMFormatDescription used - on format changes in `set_format()` however on shutdown, we were - leaking the CMFormatDescription at the end of processing. - 'https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1106' - -2019-10-12 04:04:59 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix wrong NALU minimum length check - Fixes a problem where an EOS/EOB NALU placed at the end of - an AU is detected as an other AU and create a buffer that - does not have valid pts. - -2019-10-12 03:49:33 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Fix wrong NALU minimum length check - Fixes a problem where an EOS/EOB NALU placed at the end of - an AU is detected as an other AU and create a buffer that - does not have valid pts. - -2019-11-02 16:51:09 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/openexr/meson.build: - openexr: Fix compilation with OpenEXR 2.4 - It uses modern C++; adding -std=c++98 breaks the build. - -2019-10-31 15:14:21 +0700 Roman Shpuntov <roman.shpuntov@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: memory leaks bugfix - release 'videoDecoderSpecification' variable in 'gst_vtdec_create_session' function. - release 'extensions' variable in 'create_format_description_from_codec_data' function. - -2019-10-11 14:48:11 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkmjpegenc.c: - msdkmjpegenc: convert UYVY to YUY2 instead of NV12 - Before this fix, the chroma subsampling of the output is 4:2:0. It is - 4:2:2 with this fix, which is better for UYVY input - -2019-10-11 13:05:33 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkmjpegenc.c: - msdkmjpegenc: don't need conversion for BGRA and YUY2 - jpeg encoder in MSDK can accept BGRA and YUY2 input. - -2019-10-11 12:50:02 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - msdkenc: add need_conversion method - In future, a sub class of GstMsdkEncClass may decide a native format by - using this method, e.g. JPEG encoder may accept YUY2 input, however the - current implemation needs a conversion from YUY2 to NV12 before encoding. - In addtion, a sub class may choose a format for encoding if the input - format is not supported by MSDK, e.g. the current implemation does - UYVY->NV12 if the input format is UYVY. We may do UYVY->YUY2 for JPEG - encoder in future - -2019-10-09 13:41:09 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/msdk_libva.c: - msdk: support for MFX_FOURCC_BGR4 frame allocation - MFX_FOURCC_BGR4 is mapped to VA_FOURCC_ABGR and JPEG encoder needs a - MFX_FOURCC_BGR4 frame for internal usage when the input format is - MFX_FOURCC_RGB4 - This is a preparation for supporting native formats of JPEG encoder - -2019-09-26 17:45:31 +0200 Edward Hervey <edward@centricular.com> - - mpegtsmux: Add SCTE-35 support - This adds two properties: - * scte-35-pid: If not 0, enables the SCTE-35 support for the current - program. This will write the proper PMT and send SCTE-35 NULL - commands (i.e. heartbeats) at a regular interval - * scte-35-null-interval: This specifies the interval at which the - NULL commands should be sent - Sending SCTE-35 commands is done by creating the appropriate SCTE-35 - GstMpegtsSection and then sending them on the muxer. See the - associated example - -2019-09-26 17:28:27 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/mpegts/gst-scte-section.c: - * gst-libs/gst/mpegts/gst-scte-section.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * gst-libs/gst/mpegts/meson.build: - * gst/mpegtsdemux/mpegtsbase.c: - * tests/check/libs/mpegts.c: - * tests/examples/mpegts/ts-parser.c: - mpegts: Add support for SCTE-35 sections - Not all commands are supported, but the most common ones are. - Both parsing and packetizing is supported - -2019-09-26 17:43:57 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - tsmux: Disable bluray-isms from PMT - We were unconditionally adding top-level descriptors in the PMT which - were only related to bluray support for PS3 (from 10 years ago). - These should be re-added conditionally - -2019-09-26 17:13:30 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Fix off-by-one error - This went un-noticed for 6 years :( The issue is that for short - sections (without subtables and CRC), we would always fail when - checking whether we had enough data or not and then default to the - long section checking. - Use the long section checking would then cause interesting side-effects - for short sections (such as believing they were already seen and therefore - would be dropped/ignored). - -2019-10-28 13:28:28 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/gstmsdkvc1dec.c: - msdkdec: use decoder base class packetized flag - Instead of using a proxy of `is_packetized` flag this patch - replaces it with the accessor to that flag in decoder base class, - avoiding probable mismatches. - -2019-09-27 10:50:18 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkvc1dec.c: - msdkdec: add parse callback for non-packetized input - commit 55c0d720 added the capability to handle non-packetized bitstream, - and there is a loop to handle multiple frames in a non-packetized buffer - in gst_msdkdec_handle_frame. However it is possible that a - non-packetized buffer still contains valid data but there is no long any - pending unfinished frame. Currently gst_video_decoder_decode_frame is - invoked to send a new frame with new input data, the situaltion is - repeated till an EOS is received. An application has to exit when - receiving an EOS, however there is still valid data in a - non-packetezied input buffer, hence some frames are dropped. - This fix adds a parse callback for non-packeteized input, a new frame - will be sent to the subclass as soon as the input buffer has valid data - This fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/665 - -2019-10-28 11:25:15 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstccextractor.c: - ccextractor: Remove unused set/get_property() functions - -2019-10-28 11:22:06 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstccextractor.c: - ccextractor: Always forward all sticky events to the caption pad - And only update the caps and stream-start event accordingly. This - ensures that we'll always forward sticky events that arrive after the - caption pad was created, and especially updates to existing sticky - events like the segment event. - Also create a proper stream id based on the upstream stream id for the - stream-start event, and make sure that all the sticky events we know are - already on the caption pad at the time it is added to the element. - -2019-10-28 02:27:04 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkimageidentity.c: - vulkanimage: move fence creation earlier - Fixes a critical: - GStreamer-CRITICAL **: 02:26:34.698: gst_mini_object_ref: assertion 'mini_object != NULL' failed - -2019-10-28 02:18:18 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkviewconvert.c: - vulkan: change to clamp to edge rather than clamp to border - clamp-to-border will return the border color which is typically black, - white or transparent. When linear filtering the edge pixels will - typeically be combined with the border color which is not typically what - we want. Especially when color converting, this removes a green box - around the edge when converting YUV->RGB. - -2019-10-24 15:26:33 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - msdkh265enc: Add support for tiled encoding - Add num-tile-rows and num-tile-cols properties to set the number of rows - and columns - -2019-10-24 16:42:23 -0700 Julien Isorce <jisorce@oblong.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: also insert ssrc(s) from rtp buffers - This fixes a regression from commit "srtp: Support libsrtp2" - e9aa11720071f8a1d22b336395e66dd8cbca0c00 where an internal - set of ssrc(s) was added because the libsrtp v2 keeps its - internal streams as private. But the change prevented that - ssrc(s) that not in the caps from being added to the stats. - This patch ensures that all ssrc(s) are inserted to this set - instead of only inserting those from the caps. - -2019-10-18 12:26:26 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkvp9enc.c: - msdk: support P010_10LE in DMABuf mode for VP9/HEVC encoding - -2019-10-24 19:10:30 +0800 Cheng-Chang Wu <ccwu660601@mapacode.tw> - - * sys/androidmedia/jni/gstamcsurfacetexture-jni.c: - androidmedia: Make sure that the first member of GstAmcSurfaceTextureJNI is correct - It's a subclass of GstAmcSurfaceTexture so should have that as first - struct member or otherwise it won't work. - Fixes #1105 - -2019-10-24 19:14:58 +0800 Cheng-Chang Wu <ccwu660601@mapacode.tw> - - * sys/androidmedia/jni/gstamc-codec-jni.c: - androidmedia: Call JNI method with the actual Java object instead of our wrapper struct - Fixes #1105 - -2019-10-24 15:40:25 +0200 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/opencv/meson.build: - opencv: Don't error when unable to detect OpenCV data dir - Instead, mark OpenCV as not found. We error out later if OpenCV was - explicitly enabled. - -2019-10-11 23:54:55 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: add support Y410 and Y210 formats - And clean up some macros - -2019-10-16 11:59:32 -0700 U. Artie Eoff <ullysses.a.eoff@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - * sys/msdk/gstmsdkvpputil.c: - msdkvpp: allow cropping via properties - Add crop-left, crop-right, crop-top and crop-bottom - properties to msdkvpp and apply to input surface at - vpp transform run-time. - Implements #1097 - -2019-10-22 18:33:18 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpe: Get rid of un-necessary frameComplete dispatchs - frameComplete() should be called only if there's a new commited frame. - -2019-10-19 12:48:55 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpe: Run frameComplete outside of images mutex scope - If the mutex is locked while running frameComplete there is a potential deadlock - bound to happen when we get a new exported images from the backend. - Fixes #1101 - -2019-10-23 16:47:43 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: Add properties to time out cached upstream/LTC timecodes after a while - By default we never time them out and simply continue couting up with - each frame forever. - -2019-10-23 15:03:09 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: Add new auto-resync boolean property - This allows selecting whether we continue updating our last known - upstream timecode whenever a new one arrives or instead only keep the - last known one and from there on count up. - -2019-10-23 14:31:16 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: Add last-known-or-zero mode - This uses the last known upstream timecode (counted up per frame), or - otherwise zero if none was known. - The normal last-known timestamp uses the internal timecode as fallback - if no upstream timecode was ever known. - -2019-10-23 14:29:06 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Don't initialize upstream timecode with zero if none was seen - Instead keep it unset and use the internal timecode wherever needed as - fallback. - -2019-10-23 14:28:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Update set-tc property documentation with latest version of reality - -2019-10-22 09:30:34 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/pnm/gstpnmdec.c: - pnmdec: Return early on ::finish() if we have no actual data to parse - Otherwise we'd be working with a NULL buffer and cause various critical - warnings along the way. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1104 - -2019-09-24 08:55:07 +0300 Jordan Petridis <jpetridis@gnome.org> - - * ext/lv2/gstlv2utils.c: - lv2: fix build without the debug system - ``` - FAILED: subprojects/gst-plugins-bad/ext/lv2/b8a2ebe@@gstlv2@sha/gstlv2utils.c.o - ../subprojects/gst-plugins-bad/ext/lv2/gstlv2utils.c: In function 'lv2_log_printf': - ../subprojects/gst-plugins-bad/ext/lv2/gstlv2utils.c:50:3: error: attempt to use poisoned "gst_debug_log_valist" - 50 | gst_debug_log_valist (lv2_debug, GST_LEVEL_INFO, "", "", 0, NULL, fmt, ap); - | ^ - ../subprojects/gst-plugins-bad/ext/lv2/gstlv2utils.c:50:25: error: 'lv2_debug' undeclared (first use in this function); did you mean 'g_debug'? - 50 | gst_debug_log_valist (lv2_debug, GST_LEVEL_INFO, "", "", 0, NULL, fmt, ap); - | ^~~~~~~~~ - | g_debug - ``` - -2019-08-29 21:20:37 +0700 Ratchanan Srirattanamet <peathot@hotmail.com> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - camerabin2: preview: remove redundant property setting on appsink - Commit 8a56a7de6d5f2cf70dbe6efbd7c8ed74600c8565 (camerabin2: preview: - Appsink doesn't need to sync) add a line that set the "sync" property on - the appsink. However, the author seems to forget that there's another - property setting on appsink a few lines below. - It's very likely that the added line is required because the original - line doesn't take effect (maybe because it's too late). But for whatever - reason, the original line is now redundant. So, I remove it in this - commit. - -2019-10-19 13:52:54 +0100 Alistair Buxton <a.j.buxton@gmail.com> - - * gst-libs/gst/transcoder/meson.build: - meson: use gir_init_section in GstTranscoder - GstTranscoder adds extra_args for gir which call gst_init() during - introspection. These extra arguments are the same as the standard - ones defined in the top level meson.build as "git_init_section", - However, the top level definition also ensures an empty plugin - repository is used. - Because GstTranscoder does not use the standard args, plugins get - loaded when it is introspected. Since some of the plugins fail - without specific hardware, this causes #1100. - This patch makes it use gir_init_section. - Fixes #1100. - -2019-10-18 00:39:12 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: build gir even when cross-compiling if introspection was enabled explicitly - This can be made to work in certain circumstances when - cross-compiling, so default to not building g-i stuff - when cross-compiling, but allow it if introspection was - enabled explicitly via -Dintrospection=enabled. - See gstreamer/gstreamer#454 and gstreamer/gstreamer#381. - -2019-09-24 16:57:54 -0700 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - * ext/wpe/gstwpesrc.cpp: - wpesrc: Implement load-bytes action signal - -2019-08-07 17:07:21 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - * ext/wpe/gstwpesrc.cpp: - * ext/wpe/gstwpesrc.h: - wpe: Rewrite wpesrc as a glbasesrc subclass - And since it no longer allocates memories itself, this fixes issues with - fakevideosink. A lot of code previously copied from gltestsrc is no longer - needed thanks to the glbasesrc super-class. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1046 - -2019-10-09 14:55:55 +0200 Javier Celaya <javier.celaya@flexvdi.com> - - * sys/androidmedia/jni/gstamc-codeclist-jni.c: - Fix get_supported_types function name - -2019-10-09 14:55:29 +0200 Javier Celaya <javier.celaya@flexvdi.com> - - * sys/androidmedia/jni/gstamc-codeclist-jni.c: - Fix releasing local refs - -2019-10-09 14:55:05 +0200 Javier Celaya <javier.celaya@flexvdi.com> - - * sys/androidmedia/jni/gstamc-codeclist-jni.c: - Fix names of MediaCodecInfo inner classes - -2019-10-09 14:54:24 +0200 Javier Celaya <javier.celaya@flexvdi.com> - - * sys/androidmedia/jni/gstamc-codeclist-jni.c: - Fix getting MediaCodecList static methods - -2019-10-11 09:51:24 -0700 Julien Isorce <jisorce@oblong.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: close encoder upon bitrate change - Upon bitrate change, make sure to close the encoder otherwise - the encoder is not re-initialized and the target bitrate is - never reached, and the encoder was flushed at each frame - from this moment. - Regression introduced in f2b35abcab which replaced the call - that was closing the encoder by an early return to avoid - re-initialization. - -2019-09-17 20:32:18 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/wasapi/gstwasapiutil.c: - wasapi: Fix build warnings - gstwasapiutil.c(173) : warning C4715: 'gst_wasapi_device_role_to_erole': not all control paths return a value - gstwasapiutil.c(188) : warning C4715: 'gst_wasapi_erole_to_device_role': not all control paths return a value - -2019-09-17 20:29:03 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/wasapi/gstwasapidevice.c: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: Don't cast GstDeviceProvider to GstElement - The GstDeviceProvider isn't subclass of GstElement. - (gst-device-monitor-1.0:49356): GLib-GObject-WARNING **: 20:21:18.651: - invalid cast from 'GstWasapiDeviceProvider' to 'GstElement' - -2019-10-13 14:22:50 +0100 Tim-Philipp Müller <tim@centricular.com> - - * .gitignore: - * .gitmodules: - * Makefile.am: - * README: - * autogen.sh: - * common: - * configure.ac: - * docs/.gitignore: - * ext/Makefile.am: - * ext/aom/Makefile.am: - * ext/assrender/Makefile.am: - * ext/avtp/Makefile.am: - * ext/bs2b/Makefile.am: - * ext/bz2/Makefile.am: - * ext/chromaprint/Makefile.am: - * ext/closedcaption/Makefile.am: - * ext/colormanagement/Makefile.am: - * ext/curl/Makefile.am: - * ext/dash/Makefile.am: - * ext/dc1394/Makefile.am: - * ext/directfb/.gitignore: - * ext/directfb/Makefile.am: - * ext/dtls/Makefile.am: - * ext/dts/Makefile.am: - * ext/faac/Makefile.am: - * ext/faad/Makefile.am: - * ext/fdkaac/Makefile.am: - * ext/flite/Makefile.am: - * ext/fluidsynth/Makefile.am: - * ext/gme/Makefile.am: - * ext/gsm/Makefile.am: - * ext/hls/Makefile.am: - * ext/iqa/Makefile.am: - * ext/kate/Makefile.am: - * ext/ladspa/Makefile.am: - * ext/libde265/Makefile.am: - * ext/libmms/Makefile.am: - * ext/lv2/Makefile.am: - * ext/modplug/Makefile.am: - * ext/mpeg2enc/Makefile.am: - * ext/mplex/.gitignore: - * ext/mplex/Makefile.am: - * ext/musepack/Makefile.am: - * ext/neon/Makefile.am: - * ext/ofa/Makefile.am: - * ext/openal/Makefile.am: - * ext/opencv/Makefile.am: - * ext/openexr/Makefile.am: - * ext/openh264/Makefile.am: - * ext/openjpeg/Makefile.am: - * ext/openmpt/Makefile.am: - * ext/openni2/Makefile.am: - * ext/opus/Makefile.am: - * ext/resindvd/Makefile.am: - * ext/rsvg/Makefile.am: - * ext/rtmp/Makefile.am: - * ext/sbc/Makefile.am: - * ext/sctp/Makefile.am: - * ext/smoothstreaming/Makefile.am: - * ext/sndfile/Makefile.am: - * ext/soundtouch/Makefile.am: - * ext/spandsp/Makefile.am: - * ext/srt/Makefile.am: - * ext/srtp/.gitignore: - * ext/srtp/Makefile.am: - * ext/teletextdec/Makefile.am: - * ext/ttml/Makefile.am: - * ext/voaacenc/Makefile.am: - * ext/voamrwbenc/Makefile.am: - * ext/wayland/.gitignore: - * ext/wayland/Makefile.am: - * ext/webp/Makefile.am: - * ext/webrtc/Makefile.am: - * ext/webrtcdsp/Makefile.am: - * ext/wildmidi/Makefile.am: - * ext/wpe/Makefile.am: - * ext/x265/Makefile.am: - * ext/zbar/Makefile.am: - * gst-libs/Makefile.am: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/adaptivedemux/Makefile.am: - * gst-libs/gst/audio/Makefile.am: - * gst-libs/gst/basecamerabinsrc/Makefile.am: - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/insertbin/Makefile.am: - * gst-libs/gst/interfaces/.gitignore: - * gst-libs/gst/interfaces/Makefile.am: - * gst-libs/gst/isoff/Makefile.am: - * gst-libs/gst/mpegts/.gitignore: - * gst-libs/gst/mpegts/Makefile.am: - * gst-libs/gst/opencv/Makefile.am: - * gst-libs/gst/player/Makefile.am: - * gst-libs/gst/sctp/Makefile.am: - * gst-libs/gst/uridownloader/Makefile.am: - * gst-libs/gst/vulkan/.gitignore: - * gst-libs/gst/wayland/Makefile.am: - * gst-libs/gst/webrtc/Makefile.am: - * gst/Makefile.am: - * gst/accurip/Makefile.am: - * gst/adpcmdec/Makefile.am: - * gst/adpcmenc/Makefile.am: - * gst/aiff/Makefile.am: - * gst/asfmux/Makefile.am: - * gst/audiobuffersplit/Makefile.am: - * gst/audiofxbad/Makefile.am: - * gst/audiolatency/Makefile.am: - * gst/audiomixmatrix/Makefile.am: - * gst/audiovisualizers/Makefile.am: - * gst/autoconvert/Makefile.am: - * gst/bayer/Makefile.am: - * gst/camerabin2/Makefile.am: - * gst/coloreffects/Makefile.am: - * gst/debugutils/Makefile.am: - * gst/dvbsuboverlay/Makefile.am: - * gst/dvdspu/.gitignore: - * gst/dvdspu/Makefile.am: - * gst/faceoverlay/Makefile.am: - * gst/festival/Makefile.am: - * gst/fieldanalysis/Makefile.am: - * gst/freeverb/Makefile.am: - * gst/frei0r/Makefile.am: - * gst/gaudieffects/Makefile.am: - * gst/gdp/Makefile.am: - * gst/geometrictransform/Makefile.am: - * gst/id3tag/Makefile.am: - * gst/inter/.gitignore: - * gst/inter/Makefile.am: - * gst/interlace/Makefile.am: - * gst/ivfparse/Makefile.am: - * gst/ivtc/Makefile.am: - * gst/jp2kdecimator/Makefile.am: - * gst/jpegformat/Makefile.am: - * gst/librfb/Makefile.am: - * gst/midi/Makefile.am: - * gst/mpegdemux/Makefile.am: - * gst/mpegpsmux/Makefile.am: - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsmux/Makefile.am: - * gst/mpegtsmux/tsmux/Makefile.am: - * gst/mxf/Makefile.am: - * gst/netsim/Makefile.am: - * gst/onvif/Makefile.am: - * gst/pcapparse/Makefile.am: - * gst/pnm/Makefile.am: - * gst/proxy/Makefile.am: - * gst/rawparse/Makefile.am: - * gst/removesilence/Makefile.am: - * gst/rist/Makefile.am: - * gst/rtp/Makefile.am: - * gst/sdp/Makefile.am: - * gst/segmentclip/Makefile.am: - * gst/siren/Makefile.am: - * gst/smooth/.gitignore: - * gst/smooth/Makefile.am: - * gst/speed/.gitignore: - * gst/speed/Makefile.am: - * gst/subenc/Makefile.am: - * gst/timecode/Makefile.am: - * gst/videofilters/Makefile.am: - * gst/videoframe_audiolevel/Makefile.am: - * gst/videoparsers/Makefile.am: - * gst/videosignal/Makefile.am: - * gst/vmnc/Makefile.am: - * gst/y4m/Makefile.am: - * gst/yadif/Makefile.am: - * m4/.gitignore: - * m4/Makefile.am: - * m4/README: - * m4/a52.m4: - * m4/aalib.m4: - * m4/as-ffmpeg.m4: - * m4/as-liblame.m4: - * m4/as-slurp-ffmpeg.m4: - * m4/check-libheader.m4: - * m4/freetype2.m4: - * m4/gconf-2.m4: - * m4/gst-fionread.m4: - * m4/gst-sdl.m4: - * m4/gst-sid.m4: - * m4/libgcrypt.m4: - * m4/libmikmod.m4: - * m4/lrint.m4: - * m4/lrintf.m4: - * pkgconfig/Makefile.am: - * po/.gitignore: - * po/Makevars: - * po/POTFILES: - * sys/Makefile.am: - * sys/androidmedia/Makefile.am: - * sys/applemedia/Makefile.am: - * sys/bluez/Makefile.am: - * sys/d3dvideosink/Makefile.am: - * sys/decklink/Makefile.am: - * sys/directsound/Makefile.am: - * sys/dshowdecwrapper/Makefile.am: - * sys/dshowsrcwrapper/Makefile.am: - * sys/dshowvideosink/Makefile.am: - * sys/dvb/Makefile.am: - * sys/fbdev/Makefile.am: - * sys/ipcpipeline/Makefile.am: - * sys/kms/Makefile.am: - * sys/msdk/Makefile.am: - * sys/nvcodec/Makefile.am: - * sys/opensles/Makefile.am: - * sys/shm/Makefile.am: - * sys/tinyalsa/Makefile.am: - * sys/uvch264/Makefile.am: - * sys/wasapi/Makefile.am: - * sys/winks/Makefile.am: - * sys/winscreencap/Makefile.am: - * tests/Makefile.am: - * tests/check/.gitignore: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/generic/.gitignore: - * tests/check/libs/.gitignore: - * tests/check/pipelines/.gitignore: - * tests/examples/Makefile.am: - * tests/examples/audiomixmatrix/Makefile.am: - * tests/examples/avsamplesink/.gitignore: - * tests/examples/avsamplesink/Makefile.am: - * tests/examples/camerabin2/.gitignore: - * tests/examples/camerabin2/Makefile.am: - * tests/examples/codecparsers/Makefile.am: - * tests/examples/directfb/.gitignore: - * tests/examples/directfb/Makefile.am: - * tests/examples/ipcpipeline/Makefile.am: - * tests/examples/mpegts/Makefile.am: - * tests/examples/mxf/.gitignore: - * tests/examples/mxf/Makefile.am: - * tests/examples/opencv/Makefile.am: - * tests/examples/uvch264/Makefile.am: - * tests/examples/waylandsink/Makefile.am: - * tests/examples/webrtc/Makefile.am: - * tests/files/Makefile.am: - * tests/icles/.gitignore: - * tests/icles/Makefile.am: - * tools/Makefile.am: - Remove autotools build system - -2019-10-14 02:22:18 -0500 Matthew Waters <matthew@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklink: fix timestamp tracking when pausing - play->pause->sleep()->play would result in late frames being scheduled - -2019-09-04 16:48:29 +0200 Philipp Zabel <p.zabel@pengutronix.de> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: record pic_order_cnt elements size - Some hardware decoders, for example Hantro G1, have to be told the - size of the pic_order_cnt related syntax elements pic_order_cnt_lsb, - delta_pic_order_cnt_bottom, delta_pic_order_cnt0, and - delta_pic_order_cnt1 in bits. - -2019-09-04 15:57:30 +0200 Philipp Zabel <p.zabel@pengutronix.de> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: record dec_ref_pic_marking() size - Some hardware decoders, for example Hantro G1, have to be told the size - of the dec_ref_pic_marking() syntax element in bits. Record the size so - it can be passed on to the hardware. - -2019-09-20 20:14:57 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - h265parser: Calculate short term RPS size in slice header - The calculated size of short_term_ref_pic_set is not a part of - HEVC syntax but the value is used by some stateless decoders - (e.g., vaapi, dxva, vdpau and nvdec) for the purpose of skipping - parsing the syntax by the accelerator. - -2019-10-07 10:36:37 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecparsers/gsth265parser.h: - h265parser: Add H265 slice segment header documentation - Adding brief description for each value. - -2019-09-11 17:59:37 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: Expose parsed GstH264PPS::pic_scaling_matrix_present_flag - -2019-08-27 20:34:48 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: Expose all parsed flags of slice header - Add num_ref_idx_active_override_flag and sp_for_switch_flag to - member of GstH264SliceHdr. No reason to hiding them and - some decoder implementations (e.g., DXVA) rely on externally parsed header - data which can be provided by h264parser. - -2019-10-09 14:00:01 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/gstmsdkvideomemory.c: - msdk: return the right pointer - The first channel in memory for MFX_FOURCC_RGB4 (VA_FOURCC_ARGB or - GST_VIDEO_FORMAT_BGRA) is B, not A. In MSDK, channle B is used to access - data for RGB4 surface. In addition, the returned pointers for - MFX_FOURCC_AYUV and MFX_FOURCC_Y410 in gst_msdk_video_memory_map_full - were wrong too before this fix. - -2019-10-07 08:39:06 -0700 Josep Torra <jtorra@oblong.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: handle bitrate changes in playing state - When the bitrate is changed in playing state the encoder issues a reconfig - that drains and recreates the underlaying hw encoder instance. - With this set of changes we ensure that all this work is only made when - the bitrate did actually change. It also tries to reuse the vpp buffer - pool and fixes the pool leak spotted when testing this feature. - -2019-09-17 01:52:54 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/mdns/gstmicrodns.c: - * ext/mdns/gstmicrodnsdevice.c: - * ext/mdns/gstmicrodnsdevice.h: - * ext/mdns/meson.build: - * ext/meson.build: - * meson_options.txt: - ext: add libmicrodns-based mdns device provider - The provider for now only detects and handles rtsp devices, but - more protocols should be easy to add. - -2019-10-08 09:40:06 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - msdkh265enc: add the missing profile string - -2019-10-07 14:21:58 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/hls/gsthlssink2.c: - hlssink2: Respect requested max-files property for decision on removing old fragments from disk - hlssink2 defined "max-files" property to decide the maximum number - of fragments which should be stored in disk. But we've not used - the property. Instead, the size has been maintained by "playlist-length". - Since "max-files" and "playlist-length" have different meaning, - the decision should be done by "max-files" property. - For example, an user might want expose only 3 fragments via playlist - but might want to keep more files than 3 in disk. - -2019-10-07 00:05:08 +1100 Matthew Waters <matthew@centricular.com> - - * ext/assrender/gstassrender.c: - ass: avoid infinite unref loop with bad data - A classic case of not updating the next item to iterate after deleting - it from the singly linked list. - Only ever hit with a text buffer with GST_CLOCK_TIME_NONE for either the - timestamp or duration. - -2019-09-17 19:56:23 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11window.c: - d3d11window: Protect registration/creation of WIN32 window - Querying existing window class info and creation of window object - should be protected since they are not thread safe. - -2019-10-04 21:15:15 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - d3d11videosink: Don't try to post error message by d3d11window self - The d3d11window isn't GstElement. To post error message, proxy it - to d3d11videosink instead. - -2019-10-04 01:32:34 +0200 Alexandru Băluț <alexandru.balut@gmail.com> - - * pkgconfig/meson.build: - pkgconfig: Fix gstreamer-bad-transcoder-1.0.pc generation - -2019-10-01 11:00:02 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkh265enc.c: - msdkenc: guard MFX_FOURCC_Y410 with MFX version 1027 - -2019-10-01 15:36:29 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/hls/gsthlssink.c: - * ext/hls/gsthlssink.h: - * ext/hls/gsthlssink2.c: - * ext/hls/gsthlssink2.h: - * ext/hls/gstm3u8playlist.h: - hlssink,hlssink2: Ensure writing ENDLIST tag at the end - hlssink* elements could be finalized without EOS event, and in that case - the final playlist might not include the EXT-X-ENDLIST tag. - Since missing ENDLIST tag means it's live stream, but we did't intend it, - hlssink* elements should put the tag at the end. - -2019-09-26 09:52:14 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: set lockable flag - When postpone_free_surface is TRUE, the output buffer is not writable, - however the base decoder needs a writable buffer as output buffer, - otherwise it will make a copy of the output buffer. As the underlying - memory is always lockable, so we may set the LOCKABLE flag for this buffer - to avoid buffer copy in the base class. - The refcount of the output buffer is 1 when postpone_free_surface is - FALSE, so needn't set the LOCKABLE flag for this case. - -2019-09-30 10:13:56 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkh265enc.c: - msdkh265enc: add support for Y410 in sink pad - Sample pipeline: - gst-launch-1.0 videotestsrc ! video/x-raw,format=Y410 ! - msdkh265enc low-power=1 ! filesink location=output.h265 - -2019-09-30 09:48:26 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkh265enc.c: - msdkh265enc: add support for VUYA in sink pad - sample pipelie: - gst-launch-1.0 videotestsrc ! video/x-raw,format=VUYA ! - msdkh265enc low-power=1 ! filesink location=output.h265 - -2019-09-30 08:57:42 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkh265enc.c: - msdkenc: clean up code by using switch - It is convenient for us to add support for new formats in future, there - is no change in functionality. - -2019-09-30 09:09:23 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvc1dec.c: - msdk: remove some dead code - -2019-08-06 21:08:12 +0100 olivier.crete@collabora.com <Olivier Crête> - - * ext/wayland/wlvideoformat.c: - wayland: Add more DRM formats - Add DRM format equivalents that we were missing compared - to our caps. - -2019-08-06 19:09:54 +0100 olivier.crete@collabora.com <Olivier Crête> - - * ext/wayland/wlvideoformat.c: - * ext/wayland/wlwindow.c: - wayland: Drop big-endian version of the DRM formats - They were a big in some big-endian implementations - -2019-08-23 13:41:54 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11window.c: - d3d11videosink: Use pixel aspect ratio to setup window draw area - ... instead of calculated display ratio from given PAR and DAR. - d3d11window calculates output display ratio - to decide padding area per window resize event. In the formula, - actual PAR is required to handle both 1:1 PAR and non-1:1 PAR. - -2019-09-24 20:29:21 +0200 Fabian Greffrath <fabian@greffrath.com> - - * ext/fluidsynth/gstfluiddec.c: - fluidsynth: add sf3 to soundfont search path - In Debian, soundfonts in SF3 format (i.e. the same as SF2 format but - with Ogg/Vorbis-compressed samples) are installed into - /usr/share/sounds/sf3. Soundfonts in SF3 format are supported since - FluidSynth 1.1.7 (released in Feb 2018). - -2019-09-25 21:36:58 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/vulkan/gstvkdisplay.c: - * gst-libs/gst/vulkan/meson.build: - vulkan: Fix build on Windows - * Fix meson build script for Windows. Since the Vulkan dependency - object was declared by us in case of Windows, the dependency object - shouldn't be used for finding header - * Fix build error by including Windows specific header - gstvkdisplay.c(563): error C2065: 'VK_KHR_WIN32_SURFACE_EXTENSION_NAME': undeclared identifier - -2019-09-24 17:24:38 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/meson.build: - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkcolorconvert.h: - * ext/vulkan/vkelementutils.c: - * ext/vulkan/vkelementutils.h: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkviewconvert.c: - * gst-libs/gst/vulkan/gstvkimagememory.c: - * gst-libs/gst/vulkan/gstvkimagememory.h: - * gst-libs/gst/vulkan/gstvkimageview.c: - * gst-libs/gst/vulkan/gstvkimageview.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - * gst-libs/gst/vulkan/vulkan_fwd.h: - vulkan: remove VkImageView from the memory - There can be multiple views per image for different subresource ranges - or planes in multi-planer images. - -2019-09-24 13:53:22 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vkviewconvert.c: - * gst-libs/gst/vulkan/gstvkbuffermemory.c: - * gst-libs/gst/vulkan/gstvkbuffermemory.h: - * gst-libs/gst/vulkan/gstvkbufferpool.c: - * tests/check/libs/vkmemory.c: - vkbuffer: remove buffer view from the memory - It's only really useful for texture buffers which we currently do not - use. - -2019-09-24 13:52:17 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkconfig.h.meson: - build/vulkan: fix copy-paste error in gstvkconfig.h - -2019-09-18 23:49:08 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/cocoa/gstvkdisplay_cocoa.h: - * gst-libs/gst/vulkan/cocoa/gstvkwindow_cocoa.h: - * gst-libs/gst/vulkan/gstvkapi.h: - * gst-libs/gst/vulkan/gstvkcommandpool-private.h: - * gst-libs/gst/vulkan/ios/gstvkdisplay_ios.h: - * gst-libs/gst/vulkan/ios/gstvkwindow_ios.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/wayland/gstvkdisplay_wayland.h: - * gst-libs/gst/vulkan/wayland/gstvkwindow_wayland.h: - * gst-libs/gst/vulkan/win32/gstvkwindow_win32.h: - * gst-libs/gst/vulkan/xcb/gstvkdisplay_xcb.h: - * gst-libs/gst/vulkan/xcb/gstvkwindow_xcb.h: - vulkan: remove the winsys-specific headers from gst/vulkan/vulkan.h - Allows not having wayland, xcb, Cocoa, UIKit, windows.h included in the - public GstVulkan API. - -2019-09-24 11:25:00 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/debugutils/gsterrorignore.c: - errorignore: Added convert-error signal - The convert-error signal is emitted whenever we get a GstFlowReturn - other than GST_FLOW_OK. The handler can then decide what to convert that - into - for instance, return the same GstFlowReturn to not convert it. - The default handler will act according to the ignore-error, - ignore-notlinked, ignore-notnegotiated and convert-to properties. If a - handler is connected, these properties are ignored. - -2019-09-24 10:29:44 +1000 Matthew Waters <matthew@centricular.com> - - * gst/rist/gstristsink.c: - * gst/rtp/gstrtpsink.c: - build: fix werror build with newer gcc - In file included from ../../../../dist/linux_x86_64/include/gstreamer-1.0/gst/gstbin.h:27, - from ../../../../dist/linux_x86_64/include/gstreamer-1.0/gst/gst.h:35, - from ../gst/rtp/gstrtpsink.h:23, - from ../gst/rtp/gstrtpsink.c:49: - In function ‘gst_rtp_sink_start’, - inlined from ‘gst_rtp_sink_change_state’ at ../gst/rtp/gstrtpsink.c:509:11: - ../../../../dist/linux_x86_64/include/gstreamer-1.0/gst/gstelement.h:422:18: error: ‘%s’ directive argument is null -Werror=format-overflow= - 422 | gchar *__txt = _gst_element_error_printf text; \ - ../gst/rtp/gstrtpsink.c:476:3: note: in expansion of macro ‘GST_ELEMENT_ERROR’ - 476 | GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, - | ^~~~~~~~~~~~~~~~~ - ../gst/rtp/gstrtpsink.c: In function ‘gst_rtp_sink_change_state’: - ../gst/rtp/gstrtpsink.c:477:37: note: format string is defined here - 477 | ("Could not resolve hostname '%s'", remote_addr), - | ^~ - In file included from ../../../../dist/linux_x86_64/include/gstreamer-1.0/gst/gstbin.h:27, - from ../../../../dist/linux_x86_64/include/gstreamer-1.0/gst/gst.h:35, - from ../../../../dist/linux_x86_64/include/gstreamer-1.0/gst/rtp/gstrtpdefs.h:27, - from ../../../../dist/linux_x86_64/include/gstreamer-1.0/gst/rtp/rtp.h:25, - from ../gst/rist/gstristsink.c:72: - In function ‘gst_rist_sink_setup_rtcp_socket’, - inlined from ‘gst_rist_sink_start’ at ../gst/rist/gstristsink.c:658:10, - inlined from ‘gst_rist_sink_change_state’ at ../gst/rist/gstristsink.c:801:13: - ../../../../dist/linux_x86_64/include/gstreamer-1.0/gst/gstelement.h:422:18: error: ‘%s’ directive argument is null -Werror=format-overflow= - 422 | gchar *__txt = _gst_element_error_printf text; \ - ../gst/rist/gstristsink.c:595:3: note: in expansion of macro ‘GST_ELEMENT_ERROR’ - 595 | GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, - | ^~~~~~~~~~~~~~~~~ - ../gst/rist/gstristsink.c: In function ‘gst_rist_sink_change_state’: - ../gst/rist/gstristsink.c:596:37: note: format string is defined here - 596 | ("Could not resolve hostname '%s'", remote_addr), - | ^~ - -2019-09-09 13:40:53 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdkcontext.h: - * sys/msdk/gstmsdkvideomemory.c: - * sys/msdk/gstmsdkvideomemory.h: - msdk: fix for mfx frame alloc response - Both MSDK and this plugin use mfxFrameAllocResponse for video and DMABuf - memory, it is possible that some GST buffers are still in use when calling - gst_msdk_frame_free, so add a reference count in the wrapper of - mfxFrameAllocResponse (GstMsdkAllocResponse) to make sure the underlying - mfx resources are still available if the corresponding buffer pool is in - use. - In addtion, currently all allocators for input or output share the same - mfxFrameAllocResponse pointer in an element, so it is possible that - the content of mfxFrameAllocResponse is updated for a new caps then all - GST buffers allocated from an old allocator will use this new content of - mfxFrameAllocResponse, which will result in unexpected behavior. In this - fix, we save the the content of mfxFrameAllocResponse in the corresponding - tructure to avoid such issue - Sample pipeline: - gst-launch-1.0 filesrc location=vp9_multi_resolutions.ivf ! ivfparse ! msdkvp9dec ! - msdkvpp ! video/x-raw\(memory:DMABuf\),format=NV12 ! glimagesink - -2019-09-11 10:49:10 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/gstmsdkcontext.h: - msdk: don't cache mfxFrameAllocResponse pointer - Otherwise it is possible that different wrappers share the same - mfxFrameAllocResponse pointer, so instead of caching the pointer, we may - cache the content of mfxFrameAllocResponse - -2019-07-02 15:21:24 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/gstmsdkvc1dec.c: - msdkdec: postpone surface free for VC1 - For a skipped frame in VC1, MSDK returns the mfx surface of the reference - frame, so we have to make sure the corresponding surface for the - reference frame is not freed. In this fix, we postpone surface free because - we don't know whether a surface is referenced - Before this fix, the error is like as below: - New clock: GstSystemClock - 0:00:00.181793130 23098 0x55f8a9d622d0 ERROR msdkdec - gstmsdkdec.c:622:gst_msdkdec_finish_task:<msdkvc1dec0> Couldn't find the - cached MSDK surface - Sample pipeline: - gst-launch-1.0 filesrc location=input_has_skipped_frame.wmv ! asfdemux ! - vc1parse ! msdkvc1dec ! glimagesink - -2019-09-17 14:42:51 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: release the surface if this surface is not in use - If the surface is not in use, we may release it even if GST_FLOW_OK is going - to be returned, which may avoid the issue of failing to get surface - available - This fixes the regression caused by commit c05acf4 - -2019-08-01 13:48:54 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: adjust the stride align - GstAllocationParams::align is set to 31 in msdkdec/msdken/msdkvpp, hence - the stride align should be greater than or equal to 31, otherwise it - will result in issue - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/861 - (msdk: "GStreamer-CRITICAL: gst_buffer_resize_range failed" SPAM), - In addition, the stride should match the pitch alignment in the media driver, - otherwise it will result in some issues when a buffer is shared between - different elements, e.g. the NV12 issue mentioned in commit 3f2314a, which - can be reproduced by `gst-launch-1.0 vidoetestsrc ! msdkvpp ! - video/x-raw\(memory:DMABuf\),format=NV12 ! glimagesink` - Fixed https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/861 - -2019-09-20 15:35:09 +0000 Marc Leeman <marc.leeman@gmail.com> - - * gst/rtp/gstrtpsink.c: - * gst/rtp/gstrtpsrc.c: - * gst/rtp/gstrtpsrc.h: - * tests/check/elements/rtpsink.c: - * tests/check/elements/rtpsrc.c: - rtpmanagerbad: allow creation of elements at initialisation - -2019-09-17 22:24:04 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkdownload.c: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkupload.c: - * ext/vulkan/vkviewconvert.c: - * gst-libs/gst/vulkan/gstvkcommandbuffer.c: - * gst-libs/gst/vulkan/gstvkcommandbuffer.h: - * gst-libs/gst/vulkan/gstvkcommandpool-private.h: - * gst-libs/gst/vulkan/gstvkcommandpool.c: - * gst-libs/gst/vulkan/gstvkcommandpool.h: - * gst-libs/gst/vulkan/gstvkqueue.c: - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/gstvktrash.c: - * gst-libs/gst/vulkan/gstvktrash.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - * gst-libs/gst/vulkan/vulkan_fwd.h: - * tests/check/libs/vkcommandpool.c: - * tests/check/meson.build: - vulkan: implement command buffer reuse - Using a similar design for reference counting as - GstBuffer/GstBufferPool. - -2019-09-18 16:27:35 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rist/gstristsrc.c: - ristsrc: Fix comment about odd/even ports - It is the RTP port that is even, and the RTCP port being +1 (hence odd). - -2019-09-18 18:43:41 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11device.c: - d3d11: Use g_cond_broadcast() to wake up waiting threads - gst_d3d11_device_thread_add() can be called concurrently from different - threads so the cond signal should reach to all waiting threads. - -2019-09-16 15:29:26 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/gstvulkan.c: - * ext/vulkan/meson.build: - * ext/vulkan/vkdeviceprovider.c: - * ext/vulkan/vkdeviceprovider.h: - * gst-libs/gst/vulkan/gstvkphysicaldevice.c: - * tests/check/elements/vkdeviceprovider.c: - * tests/check/meson.build: - vulkan: add device provider implementation - -2019-09-16 13:00:34 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vksink.c: - vulkansink: attempt a context query for a device - -2019-09-16 12:59:08 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdownload.c: - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vkupload.c: - * gst-libs/gst/vulkan/gstvkdebug.c: - * gst-libs/gst/vulkan/gstvkdebug.h: - * gst-libs/gst/vulkan/gstvkdevice.c: - * gst-libs/gst/vulkan/gstvkdevice.h: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkmemory.c: - * gst-libs/gst/vulkan/gstvkphysicaldevice.c: - * gst-libs/gst/vulkan/gstvkphysicaldevice.h: - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - * gst-libs/gst/vulkan/vulkan_fwd.h: - * tests/check/libs/vkdevice.c: - * tests/check/libs/vkmemory.c: - vulkan: split physical device from logical device - -2019-09-16 11:24:13 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdebug-private.h: - * gst-libs/gst/vulkan/gstvkdebug.c: - * gst-libs/gst/vulkan/gstvkdebug.h: - * gst-libs/gst/vulkan/gstvkdevice.c: - vulkan: expose various flags to string methods - -2019-09-16 11:21:55 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdownload.c: - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vksink.c: - * ext/vulkan/vkupload.c: - * gst-libs/gst/vulkan/gstvkdevice.c: - * gst-libs/gst/vulkan/gstvkdevice.h: - * gst-libs/gst/vulkan/gstvkdisplay.c: - * gst-libs/gst/vulkan/gstvkdisplay.h: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkinstance.h: - * gst-libs/gst/vulkan/gstvkqueue.c: - * gst-libs/gst/vulkan/gstvkqueue.h: - * gst-libs/gst/vulkan/gstvkutils.c: - * gst-libs/gst/vulkan/gstvkutils.h: - vulkan: only pass the device/instance/display in to *_handle_*() functions - We don't need to change the pointer value in these functions. - -2019-09-16 10:52:53 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: remove unneeded label - -2019-09-09 15:28:32 +0200 VaL Doroshchuk <valentyn.doroshchuk@qt.io> - - * gst/camerabin2/gstviewfinderbin.c: - GstViewfinderBin: Fix typo in videoscale's name element - If user's video sink has been changed, it is unable to fetch - videoscale element by name and link to the video sink. - -2019-08-26 16:48:13 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/videotexturecache.h: - applemedia/videocache: remove unimplemented/used upload function - -2019-09-11 23:09:35 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/ios/gstvkwindow_ios.m: - vulkan/window/ios: fix race on window startup - 1. The iOS create_surface implementation needs to call out to the main - thread to create the window (UIKit requirement) - 2. get_surface() can be called and will attempt to create the VkSurface - from an invalid view/layer. - Also pass the layer for MoltenVK so we don't get pesky 'UIView function - not called on main thread' warnings. - -2019-09-12 00:10:37 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdisplay.c: - vulkan: create the macos/ios-specific displays - -2019-09-12 15:29:05 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/meson.build: - vulkan: install public gstvkdebug.h header - -2019-09-11 15:06:58 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: set pointer to NULL to avoid freeing an used surface - The surface should be cached in the surface list when GST_FLOW_OK is - going to be returned - This fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1051 - -2019-08-21 12:45:37 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvpp.c: - msdk: free mfx frames to avoid memory leaks in encoder and vpp - -2019-09-10 14:44:19 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: unref the caps to avoid memory leaks - -2019-08-29 09:31:22 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: free msdk surfaces to avoid memory leak - -2019-08-21 12:27:57 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: unref buffer pools - Unref the pools first in caps re-negotiation to avoid memory leak - -2019-08-29 15:28:36 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/gstmsdkvideomemory.c: - msdk: fix memory leaks in msdk allocators - -2019-09-05 09:05:10 +0800 Fuwei Tang <fuweix.tang@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: work-around to avoid zero fps in MediaSDK structure - -2019-09-09 13:42:56 +0800 Fuwei Tang <fuweix.tang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - msdkenc: add an extra surface for hevc encoding - For some hevc 10bit 4K encoding cases, the encoding process may be - slow, and MediaSDK surface can't be released in time before one other - available surface is needed. So add an extra surface for hevc encoding - to avoid this issue. - -2019-08-12 19:42:12 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtc/stats: redo considering internal sources - Internal sources seem to be rtp streams we are sending whereas - non-internal sources are the rtp streams we are receiving. Redo the - statistics with that in mind. - -2019-09-12 09:33:44 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdebug.c: - vulkan: fix build with older API headers - The protected memory flags were only added later as was the - multi-instance flag. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1081 - -2019-09-06 12:52:37 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/examples/meson.build: - * tests/examples/nvcodec/meson.build: - * tests/examples/nvcodec/nvcodec-kb.c: - * tests/examples/nvcodec/nvcodec.c: - * tests/examples/nvcodec/nvcodec.h: - examples: nvcodec: Add example for runtime configuration change with nvcodec - Add new example for testing dynamic change of configuration suce as - resolution and properties. - -2019-08-30 21:35:44 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - nvenc: Early terminate handle_frame if the last flow was not GST_FLOW_OK - If the last flow was not GST_FLOW_OK, the encoding thread is not running - and there is nothing to pop from GAsyncQueue (this causes deadlock). - To prevent deadlock, just return the handle_frame without further encoding - process if the last flow was not GST_FLOW_OK. Note that the last flow - will be cleared per FLUSH_STOP and STREAM_START event. - -2019-08-20 22:07:30 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh265enc.c: - nvenc: Add support VUYA format - The addition is very simple. Map NV_ENC_BUFFER_FORMAT_AYUV format - to GST_VIDEO_FORMAT_VUYA and add a condition for the VUYA format. - -2019-08-28 23:46:44 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - nvdec: Add support for mpeg4 video decoding with codec_data - Decoder should handle codec_data of mpeg4 video which includes essential - config data. - -2019-09-11 14:56:00 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - nvenc: Reduce the number of pre-allocated device memory - The hard-coded upper bound 32 (or 48 depending on resolution) might waste - GPU memory and high resolution encoding causes OUT-OF-MEMORY allocation error - quite easily. This commit calculates the number of required pre-allocated - device memory based on encoding options and it can reduce the amount of device memory - used by nvenc. - -2019-09-11 19:24:50 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdebug-private.h: - * gst-libs/gst/vulkan/gstvkdebug.c: - * gst-libs/gst/vulkan/gstvkdebug.h: - * gst-libs/gst/vulkan/gstvkdevice.c: - * gst-libs/gst/vulkan/gstvkmemory.c: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - vulkan: dump most of the device information - Dump anything that can be queried using the physical device like features, - limits, queue properties, memory properties. - -2019-09-11 15:16:45 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Update plugin description and fix typo - Use consistent description with nvenc, and fix typo s/devide/device/g - -2019-08-18 17:31:53 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - nvenc: Adjust DTS when bframe is enabled - NVDEC driver always uses input timestamp without adjustment - even if bframe encoding was enabled. - So DTS can be larger than PTS when bframe was enabled. - To ensure PTS >= DTS, we should adjust the timestamp manually - based on the PTS difference between the first - encoded frame and the second one. That's also the maximum PTS/DTS - difference. - -2019-09-03 19:46:09 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - nvenc: Add qp-{min,max,const}-{i,p,b} properties - This new properties allows more detailed target QP value setting - -2019-09-03 21:22:08 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh265enc.c: - nvenc: Add properties to support bframe encoding if device supports it - Note that bframe encoding capability varies with GPU architecture - -2019-09-02 14:13:26 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - nvenc: Refactoring internal buffer pool structure - To support rc-lookahead and bframe encoding, nvenc needs one more - staging queue, because NvEncEncodePicture can return NV_ENC_ERR_NEED_MORE_INPUT - but which was not considered so far. - As documented by NVENC programming guide, pending buffers should wait - other inputs until NvEncEncodePicture returns success. - New encoding flow is - - Submit raw picture buffer to encoder with NvEncEncodePicture - - The submitted input/output buffer pair will be queued to pending_queue - - If NvEncEncodePicture returned success, then move all pair in pending_queue - to final stage - - Otherwise, wait more input raw pictures. - Another change is dropping NV_ENC_LOCK_INPUT_BUFFER usage. - So now nvenc always uses CUDA memory input buffer. As a result, - both opengl and system memory handling are unified. - -2019-07-28 15:41:07 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - nvenc: Remove pointless iteration and cleanup some code - * The number of iteration is always one so the iteration is useless - and that makes code complicated. - * Also defining named structure can code mroe readable. - * g_free is null safe - -2019-09-03 21:33:15 +0900 Seungha Yang <seungha.yang@navercorp.com> - - nvenc: Add more rate-control options - New rate-control modes are introduced (if device can support) - * cbr-ld-hr: CBR low-delay high quality - * cbr-hq: CBR high quality - * vbr-hq: VBR high quality - Also, various configurable rate-control related properties are added. - -2019-09-03 21:28:44 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh264enc.h: - * sys/nvcodec/gstnvh265enc.c: - * sys/nvcodec/gstnvh265enc.h: - nvenc: Add support for weighted prediction option - Note that this property will be exposed only if the device - supports the weighted prediction. - -2019-07-26 16:46:30 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh264enc.h: - * sys/nvcodec/gstnvh265enc.c: - * sys/nvcodec/gstnvh265enc.h: - nvenc: Add property for AUD insertion - Make AUD insertion configurable option - -2019-09-03 18:46:30 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh264enc.h: - * sys/nvcodec/gstnvh265enc.c: - * sys/nvcodec/gstnvh265enc.h: - nvenc: Refactor class hierarchy to handle device capability dependent options - Introducing new dynamic class between GstNvBaseEncClass and - each subclass to be able to access device specific properties and - capabilities from each subclass implementation side. - -2019-09-11 02:12:55 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * sys/msdk/meson.build: - msdk: actually use the include dir we compute - -2019-09-10 23:13:17 +0000 Marc Leeman <marc.leeman@gmail.com> - - * sys/nvcodec/gstnvdec.c: - nvcodec: minor spell corrects in log messages - -2019-08-26 14:54:13 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkh265dec.c: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkmjpegdec.c: - * sys/msdk/gstmsdkvp9dec.c: - * sys/msdk/gstmsdkvp9enc.c: - * sys/msdk/msdk.h: - msdk: Remove all DMABuf caps features on Windows - Add new macro for sink/src pad template to ensure no DMABuf caps - features are exposed on Windows. Some DMABuf caps features - were not handled by the commit 9ec62418c31cab4072bf173f279234e36eeec596 - -2019-09-04 13:30:37 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: Do not use video memory on Windows - Like msdkenc, do not use video memory by default on Windows. - -2019-09-04 13:18:38 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/gstmsdkvideomemory.c: - msdk: Allow video and system memory share among buffers - gst_buffer_make_writable() requires exclusive reference to the - GstMemory so the _make_writable() for the msdk buffer will result - to fallback system memory copy, because the msdk memory were initialized - with GST_MEMORY_FLAG_NO_SHARE flag. - Note that, disable sharing GstMemory brings high overhead but actually - the msdk memory objects can be shared over multiple buffers. - If the memory is not shareable, newly added GstAllocator::mem_copy will - create copied msdk memory. - -2019-08-08 11:27:19 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - msdkh265dec: remove the requirement on profile - Sometimes a HEVC/H265 stream doesn't have a valid profile but MSDK can - handle this stream. Like vaapih265dec, msdkh265dec may advertise the sink - caps without profile - -2019-09-08 21:25:44 +0200 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * ext/wayland/gstwaylandsink.c: - wayland: gracefully handle unknown formats - -2019-09-06 22:21:50 +0900 Wonchul Lee <chul0812@gmail.com> - - * ext/aom/gstav1enc.c: - av1enc: change cpu-used range upto 5 - The speed 6, 7 and 8 has been removed because it's not yet tuned - correctly. - https://aomedia.googlesource.com/aom/+/7ffbf92030baf6886c2486574cca16d60499bbb8 - -2019-09-04 12:54:17 +0300 Askar Safin <safinaskar@mail.ru> - - * gst-libs/gst/player/gstplayer.c: - gst-player: fix bug with changing playback direction - Fix gst_event_new_seek call in gst-libs/gst/player/gstplayer.c - If rate >= 0.0, then previous code doesn't set end of segment. So, the end of segment - will be in place where previous seek put it. This is not neccesary end of media file - (in case of reverse playback). So if we play video backward for some time and then - switched to forward playing, we will get EOS somewhere in the middle of media file. - This commit always sets end of segment, thus fixing this bug - -2019-05-24 16:48:45 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: output the decoded frame immediately if decoded order is required - DecodedOrder was deprecated in msdk-2017 version, but some customers - still use this for low-latency streaming of non-b-frame encoded streams, - which needs to output the frame at once - -2019-09-02 09:22:10 +0800 Jeffy Chen <jeffy.chen@rock-chips.com> - - * ext/wayland/wlwindow.c: - Revert "waylandsink: Don't create throwaway empty regions" - This reverts commit 68fa80e83118a7a2be037eb235e5d211912dee0e. - Some wayland servers, especially weston, only expect empty input - region as a request to disable input. - Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> - -2019-08-21 06:35:30 -0500 Matthew Waters <matthew@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - decklinkaudiosink: Drop late buffers - Asking decklink to render audio data seems to be based entirely on - the sample counts which completely disregards the timestamps - we pass to decklink. As a result, we need to explicitly check - for late buffers and drop them ourselves. - -2019-08-31 18:19:41 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/elements/nvenc.c: - tests: nvenc: Test runtime resolution change - -2019-08-31 17:34:13 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - nvenc: Add support runtime resolution change freely - Do not restrict allowed maximum resolution depending on the - initial resolution. If new resolution is larger than previous one, - just re-init encode session. - -2019-08-27 17:04:50 +0800 Wangfei <fei.w.wang@intel.com> - - * tests/check/libs/h265parser.c: - tests: h265parser: Add test parsing range extension in PPS - -2019-08-19 10:08:46 +0800 Wangfei <fei.w.wang@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parse lib: fix missing condition when parse PPS - Follow h265 spec(04/2015), log2_max_transform_skip_block_size_minus2 - should get with condition when transform_skip_enabled_flag is 1. - -2019-08-28 17:26:00 -0700 Sam Gigliotti <samgig@amazon.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtcbin: Fixed memory leak in gstwebrtcstats - The function _get_stats_from_ice_transport returns a string which must be - freed by the caller. However, _get_stats_from_dtls_transport was ignoring - the return value from this function, resulting in a leak. - Ran this with valgrind. Before this fix there was a leak of 40 bytes each - time this was called. After there was no leak. - -2019-08-30 14:15:43 +1000 Matthew Waters <matthew@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: fix macos werror build - ../sys/decklink/gstdecklink.cpp:1703:7: error: format specifies type 'long' but the argument has type 'int64_t' (aka 'long long') -Werror,-Wformat - persistent_id); - ^~~~~~~~~~~~~~ - /Library/Frameworks/GStreamer.framework/Versions/1.0/include/gstreamer-1.0/gst/gstinfo.h:1070:87: note: expanded from macro 'GST_DEBUG' - #define GST_DEBUG(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_DEBUG, NULL, __VA_ARGS__) - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~ - /Library/Frameworks/GStreamer.framework/Versions/1.0/include/gstreamer-1.0/gst/gstinfo.h:646:31: note: expanded from macro 'GST_CAT_LEVEL_LOG' - (GObject *) (object), __VA_ARGS__); \ - ^~~~~~~~~~~ - -2019-08-29 17:19:27 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Check flow return of the only current handle_frame() to fix seeking issue - Due to uncleared last flow, decoding after seek was never possible - (last_ret == GST_FLOW_FLUSHING). - nvdec dose not need to keep track of the previous flow return, - and actually the interest is data/even flow of the current handle_frame(). - -2019-08-29 20:20:14 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Fallback to system memory if OpenGL context could not support PBO memory - If the environment could not support OpenGL PBO memory, nvdec will do negotiation - with system memory as fallback. - -2019-08-09 20:19:38 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Add support dynamic output format change - Implementing ::negotiate() method to support runtime output format - change. If downstream was reconfigured, baseclass will invoke - ::negotiate() method, and nvdec should update output memory - type depending on downstream caps. - -2019-08-09 18:47:14 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - nvdec: Re-negotiate whenever output format is changed - Input stream might be silently changed without ::set_format() call. - Since nvdec has internal parser, nvdec element can figure out the format change - by itself. - -2019-08-09 15:27:54 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/elements/nvdec.c: - * tests/check/meson.build: - tests: nvdec: Add test runtime downstream reconfigure - Add test case for output format change - -2019-08-08 10:59:04 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Add support 4:4:4 and 4:2:0 12bit decoding - Depending on GPU architecture, HEVC decoder can support - 4:4:4 format up to 12 bitdepth. This commit covers VP9 4:2:0 12 bits - decoding also. - -2019-08-08 14:16:07 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvenc.h: - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh265enc.c: - nvenc: Add support for old drivers which could not understand SDK version 9.0 - Add helper functions to support old drivers - with our previous SDK version 8.1 - -2019-08-08 14:00:08 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvenc.h: - nvenc: Use consistent snake case convention - -2019-08-07 23:03:15 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/cuviddec.h: - * sys/nvcodec/nvEncodeAPI.h: - * sys/nvcodec/nvcuvid.h: - nvcodec: Bump SDK header to version 9.0 - The latest Turing architecture (e.g., RTX serise) can support - decoding HEVC 4:4:4 format up to 12bits. - -2019-08-02 01:37:22 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * gst-libs/gst/vulkan/xcb/gstvkdisplay_xcb.c: - * gst-libs/gst/vulkan/xcb/gstvkwindow_xcb.c: - vulkan: Fix some confusing typos - Seems to have been copy pasted from around gl element - -2019-08-09 20:13:59 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * ext/vulkan/vkdownload.c: - * ext/vulkan/vksink.c: - * ext/vulkan/vkupload.c: - vulkan: Don't dereference null pointer when printing error - When printing error message because the function failed, the GError variable - may not be used and it can be NULL. - -2019-08-09 18:43:06 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * gst-libs/gst/vulkan/xcb/gstvkwindow_xcb.c: - vulkan/xcb: Don't try to create xcb window with non-xcb display - Non-xcb display does not have a xcb_connection and trying - to create xcb window with wild pointer can cause segfault. - -2019-08-18 14:09:16 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - nvenc: Port to GstCudaGraphicsResource - Register openGL resource only once per memory. Also if upstream - provides the registered information, reuse the information - instead of doing it again. This can improve performance dramatically - depending on system since the resource registration might cause - high overhead. - -2019-08-18 13:27:38 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Port to GstCudaGraphicsResource - Make it possible to share registered graphics resource among nvidia encoders - and decoders. - -2019-08-17 17:45:44 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstcudaloader.c: - * sys/nvcodec/gstcudaloader.h: - * sys/nvcodec/gstcudautils.c: - * sys/nvcodec/gstcudautils.h: - * sys/nvcodec/stub/cuda.h: - cudautils: Add GstCudaGraphicsResource structure for better openGL interoperability - Introduce GstCudaGraphicsResource structure to represent registered - CUDA graphics resources and to enable sharing the information among - nvdec and nvenc. This structure can reduce the number of resource - registration which cause high overhead. - -2019-08-17 14:46:00 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Port to openGL PBO memory - For openGL interoperability, nvdec uses cuGraphicsGLRegisterImage API - which is to register openGL texture image. - Meanwhile nvenc uses cuGraphicsGLRegisterBuffer API to registure openGL buffer object. - That means two kinds of graphics resources are registered per memory - when nvdec/nvenc are configured at the same time. - The graphics resource registration brings possibly high overhead - so the registration should be performed only once per resource - from optimization point of view. - -2019-08-17 14:03:57 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Filter openGL API version to use - To ensure PBO buffer, openGL API >= 3 is required. - -2019-08-21 16:46:36 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkenc.c: - msdk: avoid reading data from freed memory - Both g_list_delete_link and g_list_remove remove an element and free it, - so l->next is invalid (catched by valgrind) after calling g_list_delete_link - or g_list_remove - -2019-08-22 10:46:12 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - doc: Update plugin cache - -2015-12-03 12:32:05 +0100 Saunier Thibault <saunierthibault@gmail.com> - - * data/meson.build: - * data/targets/device/dvd.gep: - * data/targets/file-extension/avi.gep: - * data/targets/file-extension/flv.gep: - * data/targets/file-extension/mkv.gep: - * data/targets/file-extension/mp3.gep: - * data/targets/file-extension/mp4.gep: - * data/targets/file-extension/oga.gep: - * data/targets/file-extension/ogv.gep: - * data/targets/file-extension/webm.gep: - * data/targets/online-service/youtube.gep: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/transcoder/index.md: - * docs/libs/transcoder/sitemap.txt: - * docs/meson.build: - * gst-libs/gst/meson.build: - * gst-libs/gst/transcoder/gsttranscoder.c: - * gst-libs/gst/transcoder/gsttranscoder.h: - * gst-libs/gst/transcoder/meson.build: - * gst-libs/gst/transcoder/transcoder-prelude.h: - * gst/meson.build: - * gst/transcode/gst-cpu-throttling-clock.c: - * gst/transcode/gst-cpu-throttling-clock.h: - * gst/transcode/gsttranscodebin.c: - * gst/transcode/gsttranscoding.h: - * gst/transcode/gsturitranscodebin.c: - * gst/transcode/meson.build: - * meson.build: - * meson_options.txt: - * pkgconfig/gstreamer-bad-transcoder-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-transcoder.pc.in: - * pkgconfig/meson.build: - * tools/gst-transcoder.c: - * tools/meson.build: - * tools/utils.c: - * tools/utils.h: - Import GstTranscoder - -2019-08-23 17:07:43 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkswapper.c: - vulkan/swapper: add a couple of missing g_clear_error()'s - -2019-08-23 17:04:42 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/meson.build: - vulkan/build: conditionally depend on Vulkan-1.0.gir - Vulkan-1.0.gir is new in gobject-introspection >= 1.61.1 - -2019-08-23 17:03:20 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdisplay.c: - vulkandisplay: silence an unused but set error with no enable winsys implementations - -2019-08-23 14:20:59 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkswapper.c: - vulkan/swapper: check queue present return later - During resizes, the VkQueuePresent can return OUT_OF_DATE and if a buffer - is displayed returning OUT_OF_DATE it would error out and stop the pipeline. - We already have a explicit check for OUT_OF_DATE and the same general - error check in the statements following so just use that code. - -2019-08-23 14:19:22 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/gstvkwindow.c: - vulkan/swapper: destroy the surface in finalize - Fixes a leak of the VkSurface object. - -2019-08-23 14:17:02 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkswapper.c: - vulkan/swapper: set some values to NULL in error conditions - So that they are not double free()-ed. - -2019-08-23 14:14:39 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkcolorconvert.c: - vulkancolorconvert: explicitly initalize swizzle arrays - Fixes uninitialized access of the indexed values larger than - the number of planes in the video format. - -2019-08-23 14:13:16 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkerror.c: - vulkan/error: add the error value in hex and decimal - Provides more information for what may be an 'Unknown' error. - -2019-08-23 14:11:16 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkswapper.c: - vulkanswapper: disconnect window signals before any internal resources - Otherwise, it's racy whether the necessary resources are available in - the signal callbacks on destruction. - -2019-08-19 12:30:30 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: don't return GST_FLOW_ERROR for MFX_WRN_INCOMPATIBLE_VIDEO_PARAM - Returning MFX_WRN_INCOMPATIBLE_VIDEO_PARAM means MSDK detects some - incompatible parameters but it is resolved, and we may not regard - MFX_WRN_INCOMPATIBLE_VIDEO_PARAM as a fatal error. In this fix, - GST_FLOW_OK is returned but with a warning message so that a pipeline - may run to the end. - -2019-08-28 16:11:12 +1000 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/gstahcsrc.c: - ahcsrc: #define GST_USE_UNSTABLE_API for phtography inteface - Fixes werror build: - In file included from ../sys/androidmedia/gstahcsrc.c:70: - ../gst-libs/gst/interfaces/photography.h:27:2: error: "The GstPhotography interface is unstable API and may change in future." -Werror,-W#warnings - #warning "The GstPhotography interface is unstable API and may change in future." - ^ - ../gst-libs/gst/interfaces/photography.h:28:2: error: "You can define GST_USE_UNSTABLE_API to avoid this warning." -Werror,-W#warnings - #warning "You can define GST_USE_UNSTABLE_API to avoid this warning." - ^ - -2019-08-27 12:05:10 +1000 Matthew Waters <matthew@centricular.com> - - * ext/mpeg2enc/meson.build: - mpeg2enc: fix werror build with clang - /usr/include/mjpegtools/mpeg2enc/ontheflyratectlpass1.hh:1:9: error: '_ONTHEFLYRATECTLPASS1_HH' is used as a header guard here, followed by #define of a different macro -Werror,-Wheader-guard - #ifndef _ONTHEFLYRATECTLPASS1_HH - ^~~~~~~~~~~~~~~~~~~~~~~~ - /usr/include/mjpegtools/mpeg2enc/ontheflyratectlpass1.hh:2:9: note: '_ONTHELFYRATECTLPASS1_HH' is defined here; did you mean '_ONTHEFLYRATECTLPASS1_HH'? - #define _ONTHELFYRATECTLPASS1_HH - ^~~~~~~~~~~~~~~~~~~~~~~~ - _ONTHEFLYRATECTLPASS1_HH - In file included from ../subprojects/gst-plugins-bad/ext/mpeg2enc/gstmpeg2encoder.cc:31: - /usr/include/mjpegtools/mpeg2enc/ontheflyratectlpass2.hh:1:9: error: '_ONTHEFLYRATECTLPASS2_HH' is used as a header guard here, followed by #define of a different macro -Werror,-Wheader-guard - #ifndef _ONTHEFLYRATECTLPASS2_HH - ^~~~~~~~~~~~~~~~~~~~~~~~ - /usr/include/mjpegtools/mpeg2enc/ontheflyratectlpass2.hh:2:9: note: '_ONTHELFYRATECTLPASS2_HH' is defined here; did you mean '_ONTHEFLYRATECTLPASS2_HH'? - #define _ONTHELFYRATECTLPASS2_HH - ^~~~~~~~~~~~~~~~~~~~~~~~ - _ONTHEFLYRATECTLPASS2_HH - /usr/include/mjpegtools/mpeg2enc/encoderparams.hh:82:1: error: struct 'RateCtl' was previously declared as a class; this is valid, but may result in linker errors under the Microsoft C++ ABI -Werror,-Wmismatched-tags - struct RateCtl; - ^ - /usr/include/mjpegtools/mpeg2enc/ratectl.hh:50:7: note: previous use is here - class RateCtl - ^ - /usr/include/mjpegtools/mpeg2enc/encoderparams.hh:82:1: note: did you mean class here? - struct RateCtl; - ^~~~~~ - class - -2019-08-26 22:19:13 +1000 Matthew Waters <matthew@centricular.com> - - * sys/uvch264/gstuvch264deviceprovider.c: - * sys/uvch264/gstuvch264deviceprovider.h: - uvch264: fix werror build with clang - ../subprojects/gst-plugins-bad/sys/uvch264/gstuvch264deviceprovider.c:48:1: warning: unused function 'GST__UVC_H264_DEVICE' -Wunused-function - G_DECLARE_FINAL_TYPE (GstUvcH264Device, gst_uvc_h264_device, GST_, - ^ - /usr/include/glib-2.0/gobject/gtype.h:1405:33: note: expanded from macro 'G_DECLARE_FINAL_TYPE' - static inline ModuleObjName * MODULE##_##OBJ_NAME (gpointer ptr) { \ - ^ - <scratch space>:75:1: note: expanded from here - GST__UVC_H264_DEVICE - ^ - ../subprojects/gst-plugins-bad/sys/uvch264/gstuvch264deviceprovider.c:48:1: warning: unused function 'GST__IS_UVC_H264_DEVICE' -Wunused-function - /usr/include/glib-2.0/gobject/gtype.h:1407:26: note: expanded from macro 'G_DECLARE_FINAL_TYPE' - static inline gboolean MODULE##_IS_##OBJ_NAME (gpointer ptr) { \ - ^ - <scratch space>:78:1: note: expanded from here - GST__IS_UVC_H264_DEVICE - ^ - ../subprojects/gst-plugins-bad/sys/uvch264/gstuvch264deviceprovider.c:139:1: warning: unused function 'GST_UVC_H264_DEVICE_PROVIDER' -Wunused-function - G_DECLARE_FINAL_TYPE (GstUvcH264DeviceProvider, gst_uvc_h264_device_provider, GST, UVC_H264_DEVICE_PROVIDER, GstDeviceProvider) - ^ - /usr/include/glib-2.0/gobject/gtype.h:1405:33: note: expanded from macro 'G_DECLARE_FINAL_TYPE' - static inline ModuleObjName * MODULE##_##OBJ_NAME (gpointer ptr) { \ - ^ - <scratch space>:137:1: note: expanded from here - GST_UVC_H264_DEVICE_PROVIDER - ^ - ../subprojects/gst-plugins-bad/sys/uvch264/gstuvch264deviceprovider.c:139:1: warning: unused function 'GST_IS_UVC_H264_DEVICE_PROVIDER' -Wunused-function - /usr/include/glib-2.0/gobject/gtype.h:1407:26: note: expanded from macro 'G_DECLARE_FINAL_TYPE' - static inline gboolean MODULE##_IS_##OBJ_NAME (gpointer ptr) { \ - ^ - <scratch space>:140:1: note: expanded from here - GST_IS_UVC_H264_DEVICE_PROVIDER - ^ - -2019-08-26 22:17:57 +1000 Matthew Waters <matthew@centricular.com> - - * ext/aom/gstav1enc.c: - av1enc: fix werror build with clang - ../subprojects/gst-plugins-bad/ext/aom/gstav1enc.c:415:34: warning: implicit conversion from enumeration type 'GstAV1EncEndUsageMode' to different enumeration type 'enum aom_rc_mode' -Wenum-conversion - av1enc->aom_cfg.rc_end_usage = DEFAULT_END_USAGE; - ~ ^~~~~~~~~~~~~~~~~ - ../subprojects/gst-plugins-bad/ext/aom/gstav1enc.c:162:41: note: expanded from macro 'DEFAULT_END_USAGE' - #define DEFAULT_END_USAGE GST_AV1_ENC_END_USAGE_VBR - ^~~~~~~~~~~~~~~~~~~~~~~~~ - -2019-08-23 18:40:49 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srt/gstsrtobject.c: - srt: Set latency property on SRT socket - -2019-08-23 17:54:49 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srt/gstsrtobject.c: - srt: Add sender side statistics - -2019-08-23 16:21:47 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - srtobject: Remove pointless GMainLoop - Just use srt's blocking epoll function and fix locking while we're at it. - -2019-08-13 22:54:42 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapidevice.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - wasapi: Move to CoInitializeEx for COM initialization - CoInitialize is not allowed when targeting UWP and causes a Windows - Application Certification Kit (WACK) error. - -2019-08-23 17:55:00 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: Make latency configurable - Allows for "low latency" mpeg-ts mode which is not standard, but somewhat common. - For this to work the sender has to put timestamps at a higher frequency than the spec requires. - -2019-08-26 14:36:35 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: fix colorimetry in src caps if sink caps has no structure - We do want to include the colorimetry in the src caps if the sink caps - doesn't have any structure associated. - -2019-08-26 14:36:35 +0530 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix colorimetry in src caps if sink caps has no structure - We do want to include the colorimetry in the src caps if the sink caps - doesn't have any structure associated. - -2019-08-26 14:53:39 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gstamc.c: - amc: Do not skip decoders that have no profile levels - -2019-05-08 11:06:40 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: add support for SEI registered user data - -2019-05-08 11:05:40 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: use gstvideoparseutils to handle user data - -2019-05-08 11:04:49 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstmpegvideoparse.h: - mpegvideoparse: use gstvideoparseutils to handle user data - -2019-05-08 11:02:35 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstvideoparseutils.c: - * gst/videoparsers/gstvideoparseutils.h: - * gst/videoparsers/meson.build: - videoparseutils: add new parser class - -2019-08-23 09:51:20 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - * sys/msdk/msdk-enums.c: - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - msdkvpp: support video-direction property - video-direction property is common property in gstreamer. In addition, - both mirroring & rotation properties are marked as deprecated, - video-direction will override mirroring & rotation properties when they - are set explicitly - Fix https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1058 - -2019-08-21 16:44:39 +0800 Yan Wang <yan.wang@linux.intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: Fix buffer allocation based on frame. - gst_msdkdec_finish_task() may release all frames in - GstVideoDecoder object. In this case, allocate_output_buffer() - cannot get the oldest frame to allocate buffer. - So gst_msdkdec_handle_frame() should return GST_FLOW_OK for - letting gst_video_decoder_decode_frame() to send a new frame - for decoding. - Fixes #664. - Fixes #665. - -2019-08-08 11:54:45 +0900 Shinya Saito <ssaito@igel.co.jp> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Fix return type of prototype of show_frame() - -2019-08-24 12:18:20 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: Don't use VA_RT_FORMAT_YUV420_10 if it's undefined - ../sys/msdk/gstmsdkallocator_libva.c:99:16: error: ‘VA_RT_FORMAT_YUV420_10’ - The minimum required version seems to VA_API_VERSION >= 1.2.0 - -2019-08-23 19:56:35 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/chromaprint/gstchromaprint.c: - * ext/directfb/dfbvideosink.c: - * ext/fluidsynth/gstfluiddec.c: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkatetiger.c: - * ext/ladspa/gstladspa.c: - * ext/lv2/gstlv2.c: - * ext/modplug/gstmodplug.cc: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mplex/gstmplex.cc: - * ext/openmpt/gstopenmptdec.c: - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsrc.c: - * ext/voaacenc/gstvoaacenc.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/wayland/gstwaylandsink.c: - * ext/webrtc/webrtcdatachannel.c: - * ext/wildmidi/gstwildmididec.c: - * gst-libs/gst/webrtc/dtlstransport.c: - * gst-libs/gst/webrtc/icetransport.c: - * gst-libs/gst/webrtc/rtcsessiondescription.c: - * gst-libs/gst/webrtc/rtcsessiondescription.h: - * gst-libs/gst/webrtc/rtpreceiver.c: - * gst-libs/gst/webrtc/rtpsender.c: - * gst-libs/gst/webrtc/rtptransceiver.c: - * gst-libs/gst/webrtc/webrtc_fwd.h: - * gst/accurip/gstaccurip.c: - * gst/festival/gstfestival.c: - * gst/pcapparse/gstpcapparse.c: - docstrings: port ulinks to markdown links - -2019-08-20 12:44:44 +0200 gla <gla@witbe.net> - - * sys/dshowsrcwrapper/gstdshow.cpp: - dshowsrcwrapper: fix regression on device selection - Do not take device_name if a device has been specified. Do not take device_index into account if a device or a device name has been specified. - -2019-08-23 17:08:20 +1000 Matthew Waters <matthew@centricular.com> - - * docs/meson.build: - meson: Don't generate doc cache when no plugins are enabled - Fixes gst-build with -Dauto-features=disabled -Dbad=enabled - -2019-08-21 10:46:43 -0700 U. Artie Eoff <ullysses.a.eoff@intel.com> - - * sys/msdk/gstmsdkvpputil.c: - msdk: vpp: rotate output frame - When vpp rotation is 90 or 270, the output frame - should be rotated, too. - Example: - gst-launch-1.0 -vf videotestsrc \ - ! video/x-raw,width=720,height=480 \ - ! msdkvpp rotation=90 ! vaapisink - -2019-08-22 17:23:39 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdisplay.c: - vulkandisplay: Also free the GSource - NULL checking the main_context does not help as we've just destroyed the - GMainContext and set that field to NULL, not to mention it's unnecessary. - Fixes a leak of display's GSource. - -2019-08-22 17:02:07 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdisplay.c: - vulkandisplay: free the list of windows on destruction - They may not have had an explicit removal from the subclass. - -2019-08-22 14:57:02 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkfullscreenrender.c: - vulkan/fullscreenrender: free the attachment descriptions - Fixes a memory leak of the attachment descriptions we receive from the - subclass. - -2019-08-22 14:55:40 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdisplay.c: - vulkandisplay: fix use-after-free with removal of window - g_list_delete_link() free()'s the list node so any access after that is - a use-after-free. - -2019-08-22 14:54:30 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/xcb/xcb_event_source.c: - vulkan/xcb: display->windows is a list of allocated GWeakRef - Don't access them as plain GstVulkanWindow objects. - -2019-08-22 11:48:11 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkviewconvert.c: - vulkanviewconvert: perform a renegotiation on multiview mode/flag property changes - Otherwise changing the output* properties have no effect until someone else - performs a renegotiation. - -2019-08-22 11:47:29 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/shaders/view_convert.frag: - shaders/view-convert: remove some debugging colours - Fixes left and right output modes. - -2019-06-28 15:04:29 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Limit the maximum PES payload size - PES packets with size 0 are unbounded, and - could therefore overflow the 32-bit size - accumulator. - Add a 32MB limit, which is larger than - any PES packet should ever get. If one does, - then output a 32MB chunk and continue. - -2019-08-21 23:47:45 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Post error message if hlsdemux could not start decryption - _decrypt_start() failure will lead to decryption failure eventually - but catching it earlier if possible. The decrpytion start failure means - that the hls plugin was built without crypto library or crypto library - does not want to accept given key and IV. - -2019-04-09 20:07:05 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * configure.ac: - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - * ext/hls/meson.build: - hls: Make crypto dependency optional when hls-crypto is auto - crypto libraries are not required for hlssink and hlssink2. - Also, hlsdemux with nonencrypted stream can work without crpyto. - Make an error only when users set "hls-crpyto" with non-auto option explicitly, - but no crpyto library was found. - -2019-08-17 13:58:33 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Always response QUERY_CONTEXT even if openGL is unavailable on the system - nvdec can response for the CUDA context type query regardless of openGL - availability. - -2019-08-14 11:24:19 +0100 Thomas Coldrick <othko97@gmail.com> - - * ext/wayland/meson.build: - ext/wayland: Define libdrm_dep in meson.build - -2019-08-16 11:07:44 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/jni/gstamcsurfacetexture-jni.c: - amc: Print error when failing to register listener - -2019-08-16 11:01:05 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/jni/gstamcsurface.c: - amc: Do not use g_log() for criticals - -2019-05-15 10:16:33 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gstamcvideodec.c: - amc: crop values are not mandatory in format - Android documentation has example code how to compute width and height - when crop values are present. - https://developer.android.com/reference/android/media/MediaCodec#accessing-raw-video-bytebuffers-on-older-devices - -2019-04-26 11:03:26 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gstamcsurfacetexture.c: - * sys/androidmedia/gstamcsurfacetexture.h: - * sys/androidmedia/jni/gstamcsurfacetexture-jni.c: - amc: Remove unused gst_amc_surface_texture_set_default_buffer_size() - -2019-04-25 14:50:43 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gstamcsurfacetexture.c: - * sys/androidmedia/gstamcsurfacetexture.h: - * sys/androidmedia/jni/gstamcsurfacetexture-jni.c: - amc: Fix matrix constness in _get_transform_matrix() - -2019-03-26 11:24:58 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gstamc-codec.h: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - * sys/androidmedia/jni/gstamc-codec-jni.c: - amc: Select between encoder/decoder at GstAmcCodec construct time - Magical 0/1 values where passed to gst_amc_codec_configure() flags - argument. It's more natural to have a boolean is gst_amc_codec_new(). - -2018-11-13 13:16:34 -0500 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gstamc-format.h: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/jni/gstamc-format-jni.c: - amc: Remove gst_amc_format_contains_key() - It is not needed, we can just try to get the key and ignore error. - NdkMediaFormat doesn't have that method. - -2018-11-12 14:02:37 -0500 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gst-android-hardware-camera.c: - * sys/androidmedia/gst-android-hardware-camera.h: - * sys/androidmedia/gstahcsrc.c: - * sys/androidmedia/gstahcsrc.h: - * sys/androidmedia/gstamc-codec.h: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcsurfacetexture.c: - * sys/androidmedia/gstamcsurfacetexture.h: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideodec.h: - * sys/androidmedia/gstjniutils.h: - * sys/androidmedia/jni/gstamc-codec-jni.c: - * sys/androidmedia/jni/gstamcsurface.c: - * sys/androidmedia/jni/gstamcsurface.h: - * sys/androidmedia/jni/gstamcsurfacetexture-jni.c: - * sys/androidmedia/jni/gstamcsurfacetexture-jni.h: - * sys/androidmedia/meson.build: - amc: Turn GstAmcSurfaceTexture into a base class with JNI implementation - -2018-11-11 08:51:04 -0500 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gstamc-codeclist.h: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - * sys/androidmedia/jni/gstamc-codeclist-jni.c: - * sys/androidmedia/meson.build: - amc: Create JNI wrapper for MediaCodecList - There is no NdkMediaCodecList API yet, but it is still better to isolate - JNI code. This will facilitate porting to a native API if Google ever - release one. - -2018-11-10 16:51:02 -0500 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gstamc-codec.h: - * sys/androidmedia/gstamc-format.h: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - * sys/androidmedia/jni/gstamc-codec-jni.c: - * sys/androidmedia/jni/gstamc-format-jni.c: - * sys/androidmedia/jni/gstamc-internal-jni.h: - * sys/androidmedia/meson.build: - amc: Move MediaCodec JNI wrapper into its own module - This will facilitate adding another implementation based on - NdkMediaCodec instead of JNI. - -2019-08-20 14:21:17 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/sctp/sctpassociation.c: - sctp: Fix crash on free() when using the MSVC binaries - On Windows, if libusrsctp and gstreamer are built with different - C runtimes (CRT), we cannot free memory allocated inside libusrsctp - with the `free()` function from gstreamer's CRT. - `usrsctp_freedumpbuffer()` simply calls `free()`, but because of the - way DLLs work on Windows, it will always call the free function from - the correct CRT. - -2019-08-14 22:08:34 +1000 Matthew Waters <matthew@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: don't critical on VUI parameters > 2^31 - A guint32 greater than 2^31 would be interpreted as negative by - gst_util_uint64_scale_int() and critical. Use the 64-bit integer version - of the function instead. - -2019-08-13 10:07:38 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Fix possible null object unref - gst_query_get_n_allocation_pools > 0 does not guarantee that - the N th internal array has GstBufferPool object. So users should - check the returned GstBufferPool object from - gst_query_parse_nth_allocation_pool. - -2019-08-19 13:22:20 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvdec.c: - nvcodec: Use default flag for CUDA stream creation - Since nvdec/nvenc engine is running on default stream, - non-default CUDA stream should be synchronized with default - stream eventually. - -2019-08-15 10:58:01 +0800 Wangfei <fei.w.wang@intel.com> - - * gst-libs/gst/codecparsers/nalutils.c: - * gst-libs/gst/codecparsers/nalutils.h: - h2645parser: Fix emulation prevention byte detection - Add a separate epb_cache variable to the codecparser NalReader to - detect Emulation Prevention Bytes separately from the main bit cache. - This fixes problems where the existing logic can mistakenly detect - multiple EPB with a sequence like: 0x00 0x00 0x03 0x00 0x03. In that - case, the 5th byte should not be regarded as an EPB. - -2019-08-18 22:51:18 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - nvenc: Use non default CUDA stream and async operation - Use CUDA async operation if possible with non default CUDA stream - -2019-08-18 22:07:38 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstcudaloader.c: - * sys/nvcodec/gstcudaloader.h: - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - * sys/nvcodec/stub/cuda.h: - nvdec: Don't use default CUDA stream - Async CUDA operation with default stream (NULL CUstream) is not much - beneficial than blocking operation since all CUDA operations which belong - to the CUDA context will be synchronized with the default stream's operation. - Note that CUDA stream will share all resources of the corresponding CUDA context - but which can help parallel operation similar to the relation between thread and process - -2019-08-18 22:14:37 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Push/Pop CUDA context around library API call - -2019-08-18 15:45:37 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Fix timestamp mismatch on draining frames - The internal decoding state must be GST_NVDEC_STATE_PARSE before - calling CuvidParseVideoData(). Otherwise, nvdec will be confused - on decode callback as if the frame is decoding only frame and - the input timestamp of corresponding frame will be ignored. - Eventually one decoded frame will have non-increased PTS. - -2019-08-08 16:54:32 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: do not error if buffer size is invalid due to DISCONT - Don't signal a pipeline error when processing incomplete - j2pk PES packets that are too small. That can happen normally - during a DISCONT and shouldn't shut down the whole pipeline - -2019-08-16 15:22:26 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/iqa/iqa.c: - iqa: fix leak of map_meta.data - -2019-08-16 19:32:39 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Do not access nvdec object from destroy function of qdata - The destroy callback can be called just before the fìnalization of - GstMiniObject. So the nvdec object might be destroyed already. - Instead, store the GstCudaContext with increased ref to safely - unregister the CUDA resource. - -2019-08-15 17:49:12 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Fix crash on WinProc handler - ... caused by null pointer dereference. The d3dvideosink object might - not available yet on the handler. - -2019-08-15 16:31:01 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/meson.build: - meson: d3d11: Remove unnecessary dependency - d3d11 never use any API of gstreamer-allocators-1.0 - -2019-08-15 16:20:26 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3d11/gstd3d11videosink.c: - * sys/d3d11/gstd3d11videosink.h: - * sys/d3d11/gstd3d11window.c: - * sys/d3d11/gstd3d11window.h: - d3d11videosink: Take into account pixel aspect ratio - Fix unexpected cropping with non 1:1 pixel aspect-ratio. - The actual buffer width/height should be passed to gst_d3d11_window_render(), - instead of the calculated resolution. The width/height - values are parameters for copying d3d11 video memory. - Also, aspect-ratio should be considered on resize callback - to decide render rectangle size. - -2019-08-14 10:13:52 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - * ext/closedcaption/gstcccombiner.h: - cccombiner: Make use of new GstAggregator::negotiate() - Simplifies the caps handling code considerably here and removes some - spurious negotiation. - -2019-08-14 11:21:30 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gstamcvideodec.c: - amc: Fix crash when a sync_meta survives its sink - _amc_gl_free() could be called after the GstAmcVideoDec has been - finalized, in the case downstream still has a ref to a buffer. - -2019-08-09 02:41:51 -0400 Doug Nazar <nazard@nazar.ca> - - * ext/soundtouch/gstpitch.cc: - pitch: Fix race between putSamples() and setting soundtouch parameters - The various soundtouch set*() functions may cause buffer (re)allocations - which interferes with inputting the audio data. - -2019-08-09 14:49:24 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/gstvkwindow.c: - * gst-libs/gst/vulkan/gstvkwindow.h: - * gst-libs/gst/vulkan/ios/gstvkios_utils.h: - * gst-libs/gst/vulkan/ios/gstvkwindow_ios.m: - vulkan/ios: keep track of surface changes - -2019-08-06 12:38:41 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/ios/gstvkwindow_ios.m: - vulkan/ios: initialize the frame to the parent's - -2019-08-13 23:24:41 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstatscmux.c: - atscmux: fix AC-3 stream id - According to ATSC A/52, Annex A, section 4.2: - The value of stream_id in the PES header shall be 0xBD - (indicating private_stream_1) - -2019-08-13 17:50:33 +0300 OleksandrKvl <oleksandrdvl@gmail.com> - - * gst/pcapparse/gstpcapparse.c: - * gst/pcapparse/gstpcapparse.h: - pcapparse: fix DISCONT flag setting - DISCONT flag should be set only for first packet. - Fixes #1047. - -2019-08-13 12:10:54 +0200 David Gunzinger <david.gunzinger@smoca.ch> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: fix type of max-retransmits, make it work - -2019-08-12 20:26:51 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfvc3.c: - mxfdemux: Also allow picture essence element type 0x05 for VC-3 - It's found like this in various files out there even if it does not - conform to SMPTE 2019-4. - -2019-08-06 17:42:15 +0200 Ignacio Casal Quinteiro <qignacio@amazon.com> - - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: fix symbol redefinition build error - -2019-07-31 11:49:55 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristsink.c: - * gst/rist/gstristsrc.c: - rist: Fix documentation - -2019-07-30 12:54:04 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristsink.c: - * gst/rist/gstristsrc.c: - rist: Document stats-internal unit - -2019-07-26 16:17:59 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristsink.c: - ristsink: Only accept RTCP APP packets with subtype==0 - -2019-07-09 16:50:43 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristsink.c: - * gst/rist/gstristsrc.c: - rist: Fix typo in the documentation - -2019-07-09 16:50:14 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristsink.c: - * gst/rist/gstristsrc.c: - rist: Use the right parameters the signal - -2019-08-09 12:52:31 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/x265/gstx265enc.c: - * ext/x265/gstx265enc.h: - x265enc: Enhance profile setting with fixing infinite loop condition - Don't fixate profile caps which will choose the first profile from list. - Instead, store all profiles allowed by peer and try them until x265 can - accept one of them. - -2019-08-09 12:03:34 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/x265/gstx265enc.c: - x265enc: Fix deadlock on profile setting failure - Don't miss unlock before returning - -2019-08-09 11:39:43 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - nvenc: Add support YV12 format - YV12 format is supported by Nvidia NVENC without manual conversion. - So nvenc is exposing YV12 format at sinkpad template but there is some - missing point around uploading the memory to GPU. - -2019-08-08 18:47:05 +0000 Marc Leeman <marc.leeman@gmail.com> - - * gst/rtp/gstrtpsrc.c: - rtp: do not overrule RtpInfo when non dynamic type - When looking up the Rtp information, do not overwrite information - already found with encoding-name by static information. - -2019-08-08 20:06:41 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvh265enc.c: - * sys/nvcodec/gstnvh265enc.h: - nvh265enc: Enable HDR related SEI nal insertion - If upstream provides the HDR related information, create SEI message - nals and pass them to NVENC. - -2019-08-08 20:01:41 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix mastering display info parsing - Fix mismatched Red Y coordinate value. - -2019-08-08 04:54:38 +0800 Fuwei Tang <fuweix.tang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: fix decoding issue for interlaced streams - Currently h264parser produces a field or a frame for - alignment=au for interlaced streams, but the flag - MFX_BITSTREAM_COMPLETE_FRAME needs a complete frame - or complementary field pair of data, this results in - broken images being output. - Some patches have been sent out to fix h264parser, - but they are pending on some unfinished work. In - order to make gstreamer-msdk decoding work properly - for interlaced streams before h264parser is fixed, - this flag will be removed temporarily and will be - added back once h264parser if fixed. - Related to: - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/399 - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/228 - -2019-08-06 21:54:49 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvh265enc.c: - nvh265enc: Add support YUV 444 10bits encoding - Note that h264 encoder does not support the YUV 444 10bits format - -2019-08-06 21:55:36 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvenc.c: - nvenc: Remove unnecessary constraint from YUV420 10bits capability decision - YUV444 capability shouldn't be applied to YUV420 10 bits format - -2019-08-07 12:58:40 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklinkvideosrc: Retrieve mode of the ancillary data from the frame - Instead of using the information we stored ourselves for the video frame - itself. Which was also the wrong one: it was the mode from the property, - not the autodetected one. - This fixes vanc extraction with mode=auto - -2019-08-07 12:58:03 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Also set the INTERLACED buffer flag on non-TFF buffers - -2019-07-22 12:52:53 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - msdkdec: no need to cache output state info - -2019-08-07 11:49:43 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - nvenc: Fix broken RGB format support - Add missing format check introduced by the commit 7de4dbdeb27561c00be94f8666b39dc661c59f7b - -2019-01-29 21:57:44 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: always take the seek segment stop into account - Even if an accurate seek was not requested, we should still - respect the seek stop. - -2018-09-20 01:05:52 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Use gst_segment_do_seek() - Remove some custom and incomplete seek calculation - logic in favour of gst_segment_do_seek(), and - short-circuit any actual seeking or recalculation - if the position didn't change and just send an updated - segment directly. - This removes the custom seeking logic in favour of - using standard core seek handling. - -2018-09-20 01:07:34 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Keep the position increasing. - Don't keep the segment position jumping back and forth - based on stream DTS/PTS, only increase the position - if the new value is larger than the old. - -2018-08-31 22:43:46 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - mpegts: Re-work segment tracking - Add an output segment into the base class for sub-classes - to use for their output segment, in a place where the base - class can see it. - -2019-08-06 13:50:28 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvdec.c: - nvcodec: Wrap CUDA API return check with gst_cuda_result - The gst_cuda_result macro function is more helpful for debugging - than previous cuda_OK because gst_cuda_result prints the function - and line number. If the CUDA API return was not CUDA_SUCCESS, - gst_cuda_result will print WARNING level debug message with - error name, error text strings. - -2019-08-06 13:44:20 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - nvdec: Port to GstCUDAContext - ... and drop CUvideoctxlock usage. The CUvideoctxlock basically - has the identical role of cuda context push/pop but nvdec specific - way. Since we can share the CUDA context among encoders and decoders, - use CUDA context directly for accessing GPU API. - -2019-07-25 19:33:54 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvenc.h: - nvenc: Port to GstCudaContext - ... and add support CUDA context sharing similar to glcontext sharing. - Multiple CUDA context per GPU is not the best practice. The context - sharing method is very similar to that of glcontext. The difference - is that there can be multiple context object on a pipeline since - the CUDA context is created per GPU id. For example, a pipeline - has nvh264dec (uses GPU #0) and nvh264device0dec (uses GPU #1), - then two CUDA context will propagated to all pipeline. - -2018-11-23 22:01:41 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/Makefile.am: - * sys/nvcodec/gstcudacontext.c: - * sys/nvcodec/gstcudacontext.h: - * sys/nvcodec/gstcudautils.c: - * sys/nvcodec/gstcudautils.h: - * sys/nvcodec/meson.build: - nvcodec: Introduce NVIDA CUDA helpers - New object and helper functions can remove duplicated code - from nvenc/nvdec. Also this is prework for CUDA device context sharing - among nvdec(s)/nvenc(s). - -2019-07-26 03:27:22 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/onvif/gstrtponvifparse.c: - * gst/onvif/gstrtponviftimestamp.c: - * gst/onvif/gstrtponviftimestamp.h: - rtponviftimestamp: add opt-out "drop-out-of-segment" property - The default behaviour of rtponviftimestamp is to drop buffers - outside the segment. This creates obvious problems for reverse - playback. - The ONVIF specification unfortunately doesn't describe how to handle - that specific use case, but we can expose a property to let the - user disable the dropping behaviour, and forward these buffers with - a G_MAXUINT64 ONVIF timestamp. - Also modify rtponvifparse to handle such timestamps appropriately. - -2019-07-26 03:26:25 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/onvif/gstrtponvifparse.c: - rtponvifparse: parse E flag and send EOS when needed - -2019-06-21 20:47:37 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/x265/gstx265enc.c: - * ext/x265/gstx265enc.h: - x265enc: Add support more 8/10/12 bits 4:2:0, 4:2:2 and 4:4:4 profiles - ... with multi-library interface support. Depending on bit depth support of - the linked library, run-time api switch can be made via multi-library interface. - See more detail about libx265 multi-library interface - https://x265.readthedocs.io/en/default/api.html#multi-library-interface - -2019-08-06 21:44:35 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkaudiosrc/decklinkvideosrc: Do nothing in BaseSrc::negotiate() and always set caps in ::create() - We don't support negotiation with downstream but simply set caps based - on the buffers we receive. This prevents renegotiation to other formats, - and negotiation to NTSC in mode=auto in the beginning until the first - buffer is received. - As side-effect of this, also remove various other caps handling code - that was working around the behaviour of the default - BaseSrc::negotiate(). - -2019-08-06 18:55:28 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/debugutils/gsterrorignore.c: - errorignore: Try pushing again after a caps event too - It might have reconfigured everything correctly so that pushing buffers - works again afterwards, e.g. if the previous caps event was just - rejected. - -2019-08-06 18:51:54 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Require a non-0/1 framerate on the pad templates - We reject caps with other framerates as it's impossible to generate - timecodes unless we actually know a constant framerate. Reflect this - also in the pad template caps. - -2019-08-06 16:38:08 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - avwait: Improve debug output a bit - -2019-07-29 13:52:04 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - nvenc: Return profile compatible input formats from GstVideoEncoder::getcaps - Do not accept any input formats which could not be supported - by downstream requested codec profiles. - -2019-07-27 00:52:59 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - nvenc: Fix caps negotiation failure on unspecified interlace-mode - During GstVideoInfo conversion from GstCaps, interlace-mode is - inferred to progressive so unspecified interlace-mode should not cause any - negotiation issue. Simly set GST_PAD_FLAG_ACCEPT_INTERSECT flag - on sinkpad to fix issue. - -2019-07-27 00:57:02 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.h: - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh264enc.h: - * sys/nvcodec/gstnvh265enc.c: - * sys/nvcodec/gstnvh265enc.h: - nvenc: Remove unused member variables - Supported interlace-mode and codec profiles are checked - during plugin init and those values are never used. - -2019-07-27 00:41:17 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/elements/nvenc.c: - tests: nvenc: Add test caps negotiation with interlace-mode field - -2019-08-05 19:45:05 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/webrtctransceiver.c: - * gst-libs/gst/webrtc/rtptransceiver.c: - * gst-libs/gst/webrtc/rtptransceiver.h: - * tests/check/elements/webrtcbin.c: - * tests/examples/webrtc/webrtcrenego.c: - rtptransceiver: Remove direction setter and vfunc and replace it by a property - It was changed from a function to a property in the latest WebRTC spec. - -2019-07-25 22:55:09 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - msdkdec: Update frame info from video parameters - A 10bit stream may have different depth values for Luma and Chroma, and - MSDK requires the frame info must match the corresponding video - parameters - -2019-08-02 16:31:59 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * gst-libs/gst/vulkan/gstvkbuffermemory.c: - * gst-libs/gst/vulkan/gstvkmemory.c: - vulkan: Fix GstMemory leaks - Allocated GstMemory should be freed with g_free() - -2019-08-03 11:31:21 +0800 Fuwei Tang <fuweix.tang@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix issue that caps "interlace-mode" can't be updated correctly - Upstream overrides the info "interlace-mode", otherwise update it with - SPS info. - -2019-07-30 23:49:09 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Respect upstream provided timestamp - Decoder sometimes reports nonincreasing timestamp. - Use input frame's timestamp like other decoder elements. - -2019-07-30 13:15:32 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvenc.c: - nvenc: Add support RGB 8/10bits formats - BGRA/RGBA/RGB10A2/BGR10A2 formats can be supported by nvenc. - Depending on device, supported format can be different. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1038 - -2019-07-31 00:02:59 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Use upstream framerate if possible - Encoded bitstream might not have valid framerate. If upstream - provided non-variable-framerate (i.e., fps_n > 0 and fps_d > 0) - use upstream framerate instead of parsed one. - -2019-07-30 23:54:48 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - nvenc: Fix crash with unspecified framerate - Nvidia driver seems to calculating floating point framerate - without validation. This causes crash both on linux and Windows. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1012 - -2019-08-03 05:28:33 -0400 Doug Nazar <nazard@nazar.ca> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Parse mpeg audio layer version and add to caps. - -2019-08-03 05:21:29 -0400 Doug Nazar <nazard@nazar.ca> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Finish setting up stream before adding pad. - -2019-07-26 07:45:46 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - msdkdec: no need to cache allocation_caps - -2019-08-05 11:31:48 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/meson.build: - vulkan: add a couple of headers to the install list - -2019-07-31 18:03:19 +0000 Marc Leeman <marc.leeman@gmail.com> - - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpeg4videoparse.h: - mpeg4videoparse: allow sending config at IDR - Based on h264parse, also allow to send the config at every IDR. - -2019-07-31 12:12:18 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * configure.ac: - * sys/nvcodec/Makefile.am: - configure: Update for nvcodec dependency change - nvcodec is compilable without external dependency - -2019-07-31 12:11:05 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Fix build warning error - gstnvdec.c:1222:3: error: implicit declaration of function ‘memset’ -Werror=implicit-function-declaration - memset (&type_info, 0, sizeof (type_info)); - ^~~~~~ - -2019-07-30 21:18:59 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/gstbasetsmux.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - basetsmux: expose pcr-interval property - Instead of using a static hardcoded PCR interval, allow the user - to configure it. - Also revert back the default to a 40 ms interval, that was changed - in recent patches for no good reason. - -2019-07-31 18:02:02 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * tests/check/elements/x265enc.c: - tests: x265enc: Add tiny resolution encoding check - Add the tiny picture encoding test case allowed in x265 - -2019-07-01 18:14:55 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * ext/x265/gstx265enc.c: - * tests/check/elements/x265enc.c: - x265enc: Specify max CU size depending on input resolution - x265 does not allow user to configure a picture size smaller than - at least one CU size, and maxCUSize must be 16, 32, or 64. - Therefore, the CU size must be set according to the input resolution, - and the input resolution can not be less than 16. - -2019-07-23 13:06:55 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpcvfpay.c: - avtp: CVF - fix error message - The error is about *not* being able to map a buffer. - -2019-07-08 14:19:07 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpcvfpay.c: - * tests/check/elements/avtpcvfpay.c: - avtp: CVF - Do not infinite loop trying to fragment zero sized NAL unit - Zero sized NAL-units should not happen, but if they do, do not infinite - loop. Added also a unit test for this case. - -2019-07-31 00:38:44 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: Skip unused SEI bits differently - 3-byte emulation bytes can confuse the current code that skips - bits at the end of an SEI. Use a simpler method that's also - quicker because it skips all remaining bits in one go instead - of 1 bit at a time. - -2019-07-20 22:38:46 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst/videoparsers/gsth265parse.c: - h265parse: Add support for compatible profiles of extensions - From decoder's capability point of view as defined by the h265 specification, - accept peer profile caps. - -2019-07-30 19:07:42 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvenc.c: - nvenc: Fix build error with x86 msvc - __stdcall is accepted or ignored by the compiler on x64 but x86 - is not the case. So the function definition should be consistent - with declaration. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1039 - -2019-07-30 17:49:25 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - nvenc: Fix deadlock when pad_push return was not GST_FLOW_OK - Encoding thread is terminated without any notification so - upstream streaming thread is locked because there is nothing - to pop from GAsyncQueue. If downstream returns error, - we need put SHUTDOWN_COOKIE to GAsyncQueue for chain function - can wakeup. - -2019-07-30 11:06:43 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/stub/cuda.h: - nvcodec: Fix broken ABI in cuda stub header to fix nvenc with opengl - Fix the broken ABI introduced by the commit 367e742e5dd53400d212ce07d0ac0745f3535ac3 - From CUDA Toolkit 3.2, size_t has been used in CUDA_MEMCPY2D structure - instead of unsigned int. - -2019-06-12 15:00:38 +0200 Jakub Adam <jakub.adam@collabora.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/webrtcsdp.c: - webrtcbin: Support data channel SDP offers from Chrome - When negotiating a data channel, Chrome as recent as 75 still uses SDP - based on version 05 of the SCTP SDP draft, for example: - m=application 9 DTLS/SCTP 5000 - a=sctpmap:5000 webrtc-datachannel 1024 - Implement support for parsing SCTP port out of SDP message with sctpmap - attribute. Fixes data channel negotiation with Chrome browser. - -2019-07-28 19:08:24 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegdec.h: - openjpegdec: enable multi-threaded decode - -2019-07-28 19:07:04 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: check return value when setting up decoder - -2019-07-02 12:27:40 +0100 Charlie Turner <cturner@igalia.com> - - * ext/hls/gsthlsdemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: remove some deadlocks using webkitwebsrc. - WebKit's websrc depends on the main-thread for download completion - rendezvous. This exposed a number of deadlocks in adaptivedemux due to - it holding the MANIFEST_LOCK during network requests, and also needing - to hold it to change_state and resolve queries, which frequently occur - during these download windows. - Make demux->running MT-safe so that it can be accessed without using the - MANIFEST_LOCK. In case a source is downloading and requires a MT-thread - notification for completion of the fragment download, a state change - during this download window will deadlock unless we cancel the downloads - and ensure they are not restarted before we finish the state-change. - Also make demux->priv->have_manifest MT-safe. A duration query happening - in the window described above can deadlock for the same reason. Other - src queries (like SEEKING) that happen in this window also could - deadlock, but I haven't hit this scenario. - Increase granularity of API_LOCK'ing in change_state as well. We need to - cancel downloads before trying to take this lock, since sink events - (EOS) will hold it before starting a fragment download. - -2019-07-29 14:56:16 +0700 Ilya Smelykh <ilya@videoexpertsgroup.com> - - * ext/webrtc/gstwebrtcice.c: - webrtcbin: fix GInetAddress leak - -2019-07-28 14:19:36 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * configure.ac: - * ext/openjpeg/gstopenjpeg.h: - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegenc.c: - * ext/openjpeg/meson.build: - openjpeg: remove support for OpenJPEG 1.5 - Also require OpenJPEG version >= 2.2 - -2019-07-23 22:26:19 +0900 Wonchul Lee <chul0812@gmail.com> - - * ext/aom/gstav1enc.c: - av1enc: enable row-mt property conditionally - The row based multi threading control was introduced after 1.0.0 version - of libaom released. It adds a guard to check the relevant control - definition declared. It fixes #1025 - -2019-07-24 12:44:21 -0600 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/msdk/meson.build: - msdk: enable 32 bit build on windows - -2019-07-26 06:35:53 +0000 Sebastian Dröge <slomo@coaxion.net> - - * ext/dtls/gstdtlsdec.c: - Revert "dtls: fix generated cert dtls agent leak" - This reverts commit e5585b1bde162bc038fd1265438edbcd94ccb5ed - -2019-07-19 22:46:01 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/Makefile.am: - * sys/nvcodec/gstcudaloader.c: - * sys/nvcodec/gstcudaloader.h: - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - * sys/nvcodec/meson.build: - * sys/nvcodec/plugin.c: - * sys/nvcodec/stub/cuda.h: - nvdec: Make OpenGL dependency optional - By adding system memory support for nvdec, both en/decoder - in the nvcodec plugin are able to be usable regardless of - OpenGL dependency. Besides, the direct use of system memory - might have less overhead than OpenGL memory depending on use cases. - (e.g., transcoding using S/W encoder) - -2019-07-25 18:27:30 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Validate LTC timestamps before trying to use them - There's no point in working with invalid LTC timestamps as all future - calculations will be wrong based on this, and invalid LTC timestamps can - sometimes be read via the audio input. - -2019-07-25 20:03:02 +0700 Ilya Smelykh <ilya@videoexpertsgroup.com> - - * ext/dtls/gstdtlsdec.c: - dtls: fix generated cert dtls agent leak - The generated certificate dtls agent was refed two times on the first call. - -2019-07-25 10:00:14 +0000 Ilya Smelykh <ilya.smelykh@gmail.com> - - * ext/dtls/gstdtlsconnection.c: - dtls: fix dtls connection object leak - -2019-07-22 19:10:15 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Make sure to return a value from all code paths - False warning from MSVC, or it does not understand that - g_assert_not_reached() does not return. - ...\gst-plugins-bad-1.0-1.17.0.1\sys\decklink\gstdecklink.cpp(1647) : warning C4715: 'gst_decklink_configure_duplex_mode': not all control paths return a value - -2019-07-22 17:57:01 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklinksrc: Reset timestamp observations on format change - We will usually get timestamps starting from 0 again and due to the - format change the clock of the input might also be different. - -2019-07-25 16:45:21 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvenc.h: - * sys/nvcodec/plugin.c: - nvcodec: Clean up pointless return values around plugin init - Any plugin which returned FALSE from plugin_init will be blacklisted - so the plugin will be unusable even if an user install required runtime - dependency next time. So that's the reason why nvcodec returns TRUE always. - This commit is to remove possible misreading code. - -2019-07-24 13:06:16 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstcudaloader.c: - * sys/nvcodec/gstcuvidloader.c: - * sys/nvcodec/gstnvenc.c: - nvcodec: Change log level for g_module_open failure - Since we build nvcodec plugin without external CUDA dependency, - CUDA and en/decoder library loading failure can be natural behavior. - Emit error only when the module was opend but required symbols are missing. - -2019-07-24 10:00:56 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - nvdec: Add support for 10bits 4:2:0 decoding - This commit includes h265 main-10 profile support if the device can - decode it. - Note that since h264 10bits decoding is not supported by nvidia GPU for now, - the additional code path for h264 high-10 profile is a preparation for - the future Nvidia's enhancement. - -2019-07-24 18:06:41 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Specify supported profiles of h264/h265 codec - See more details about supported formats at - nvidia codec sdk document "NVDEC_VideoDecoder_API_ProgGuide.pdf" - Table 1. Hardware Video Decoder Capabilities. - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/926 - -2019-07-24 20:38:58 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Skip draining before creating internal parser - GstVideoDecoder::drain/flush can be called at very initial state - with stream-start and flush-stop event, respectively. - Draning with NULL CUvideoparser seems to unsafe and that eventually - failed to handle it. - -2019-07-24 14:37:40 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * ext/dash/meson.build: - dash: Fallback to libxml2 subproject - -2019-07-23 13:47:44 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: improve spelling and grammar of comments - -2019-07-23 13:16:36 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkbufferpool.c: - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - msdkdec: make sure mfx frame width/height meets MSDK's requirement - It is possible that the output region size (e.g. 192x144) is different - from the coded picture size (e.g. 192x256). We may adjust the alignment - parameters so that the padding is respected in GstVideoInfo and use - GstVideoInfo to calculate mfx frame width and height - This fixes the error below when decoding a stream which has different - output region size and coded picture size - 0:00:00.057726900 28634 0x55df6c3220a0 ERROR msdkdec - gstmsdkdec.c:1065:gst_msdkdec_handle_frame:<msdkh265dec0> - DecodeFrameAsync failed (failed to allocate memory) - Sample pipeline: - gst-launch-1.0 filesrc location=output.h265 ! h265parse ! msdkh265dec ! - glimagesink - -2019-07-23 13:28:17 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: remove unneeded code - Before calling gst_msdkdec_create_buffer_pool, the alignment parameters - have been adjusted. - -2019-07-23 09:40:24 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/meson.build: - * sys/nvcodec/stub/cuda.h: - * tests/check/meson.build: - nvcodec: Drop system installed cuda.h dependency - ... and add our stub cuda header. - Newly introduced stub cuda.h file is defining minimal types in order to - build nvcodec plugin without system installed CUDA toolkit dependency. - This will make cross-compile possible. - -2019-07-23 10:24:10 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvdec.c: - nvcodec: Keep requested rank for default device - Fix for default encoder and decoder element factory to make them have - higher rank than the others. - -2019-07-09 13:31:27 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvenc.h: - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh265enc.c: - nvenc: Register elements per GPU device with capability check - * By this commit, if there are more than one device, - nvenc element factory will be created per - device like nvh264device{device-id}enc and nvh265device{device-id}enc - in addition to nvh264enc and nvh265enc, so that the element factory - can expose the exact capability of the device for the codec. - * Each element factory will have fixed cuda-device-id - which is determined during plugin initialization - depending on the capability of corresponding device. - (e.g., when only the second device can encode h265 among two GPU, - then nvh265enc will choose "1" (zero-based numbering) - as it's target cuda-device-id. As we have element factory - per GPU device, "cuda-device-id" property is changed to read-only. - * nvh265enc gains ability to encoding - 4:4:4 8bits, 4:2:0 10 bits formats and up to 8K resolution - depending on device capability. - Additionally, I420 GLMemory input is supported by nvenc. - -2019-07-21 21:23:30 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - nvdec: Create CUDA context with registered device id - Only the default device has been used by NVDEC so far. - This commit make it possible to use registered device id. - To simplify device id selection, GstNvDecCudaContext usage is removed. - -2019-07-11 21:53:46 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstcuvidloader.c: - * sys/nvcodec/gstcuvidloader.h: - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - * sys/nvcodec/plugin.c: - nvdec: Register elements per device/codec with capability check - By this commit, each codec has its own element factory so the - nvdec element factory is removed. Also, if there are more than one device, - additional nvdec element factory will be created per - device like nvh264device{device-id}dec, so that the element factory - can expose the exact capability of the device for the codec. - -2019-07-18 18:27:55 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvpp.c: - msdk: Do not expose DMA buffer caps feature on Windows - On Windows, DMA buffer is not supported. PadTemplate with actually - supported feature seems to more make sense. - -2019-07-22 23:01:43 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvdec.h: - * sys/nvcodec/meson.build: - nvcodec: Drop cudaGL.h dependency - nvcodec does not use any type/define/enum in cudaGL.h. - -2019-07-22 12:23:51 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/aom/gstav1enc.c: - av1enc: Also set AV1E_SET_ROW_MT from the property value when initializing the encoder - Previously it was only set if the property was changed after the encoder - was initialized. - -2018-12-02 22:49:19 +0900 Wonchul Lee <chul0812@gmail.com> - - * ext/aom/gstav1enc.c: - * ext/aom/gstav1enc.h: - av1enc: Add threads and row-mt properties - Add threads related property that setting a number of threads to encode - av1 codec and row-mt configuration. - -2018-12-02 21:45:50 +0900 Wonchul Lee <chul0812@gmail.com> - - * ext/aom/gstav1enc.c: - av1enc: Release lock when failing to initialize - Add to missing unlock when failing to initialize encoder. - -2019-07-22 11:23:22 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/aom/gstav1enc.c: - * ext/aom/gstav1enc.h: - Revert "av1enc: Release lock when failing to initialize" - This reverts commit 7de6b5d48161cb4982efe7fd04c8be408ca85424. - It was accidentally squashed together from the MR instead of keeping the - individual commits. - -2019-07-22 08:00:00 +0000 Fabrice Bellet <fabrice@bellet.info> - - * gst/siren/huffman.c: - siren: fix a global buffer overflow spotted by asan - This patch just enforces boudaries for the access to the - standard_deviation array (64 floats). Such case can be - seen with a corrupted stream, where there's no hope to - obtain a valid decoded frame anyway. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1002 - -2019-07-22 06:59:48 +0000 Wonchul Lee <chul0812@gmail.com> - - * ext/aom/gstav1enc.c: - * ext/aom/gstav1enc.h: - av1enc: Release lock when failing to initialize - Add to missing unlock when failing to initialize encoder. - -2019-07-19 01:07:38 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - nvdec: Fix video stuttering issue with VP9 - Address nvidia driver specific behavior to avoid unexpected frame mismatch - between GStreamer and NVDEC. - -2019-07-19 00:52:59 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - nvdec: Drop async queue and handle data on callback of CUvideoparser - Callbacks of CUvideoparser is called on the streaming thread. - So the use of async queue has no benefit. - Make control flow straightforward instead of long while/switch loop. - -2019-07-12 20:24:10 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/onvif/gstrtponviftimestamp.c: - rtponviftimestamp: fix setting of the discontinuity flag - The D bit is meant to be set whenever there is a discontinuity - in transmission, and directly maps to the DISCONT flag. - The E bit is not meant to be set on every buffer preceding a - discontinuity, but only on the last buffer of a contiguous section - of recording. This has to be signaled through the unfortunately-named - "discont" field of the custom NtpOffset event. - -2019-07-12 20:23:24 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/onvif/gstrtponvifparse.c: - rtponvifparse: set ONVIF timestamps as buffer PTS - -2019-07-10 23:40:36 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h26{4,5}parse: add support for forward predicted trick mode - Also stop assigning TRUE to fields with |= - -2019-07-17 22:42:10 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/x265/gstx265enc.c: - x265enc: Specify colorimetry related VUI parameters - Set the colorimetry config for the information to be embedded in encodec bitstream. - -2019-07-15 23:40:21 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Port to color_{primaries,transfer,matrix}_to_iso - ... and update the color information only when upstream was not provided - the information. - -2019-07-17 09:35:35 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh265enc.c: - nvenc: Specify colorimetry related VUI parameters - Set the colorimetry config for the information to be embedded in encodec bitstream. - -2019-07-16 23:30:07 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/webrtcdatachannel.c: - * ext/webrtc/webrtcdatachannel.h: - webrtcdatachannel: inherit directly from GObject - There's no reason for it to inherit from GstObject apart from - locking, which is easily replaced, and inheriting from - GInitiallyUnowned made introspection awkward and needlessly - complicated. - -2019-07-17 00:13:24 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Update caps per pixel aspect ratio change - Output caps should be updated per pixel aspect ratio change. - -2019-07-16 22:58:26 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: Expose parsed colorimetry when VUI provided it - ... and also if upstream did not specify the colorimetry. - -2019-07-16 09:40:01 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: Expose parsed colorimetry when VUI provided it - ... and also if upstream did not specify the colorimetry. - -2019-07-17 01:05:32 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/kms/gstkmssink.c: - kmssink: Fix implicit declaration build error - ffs() and strcmp() require string.h - gstkmssink.c:255:28: error: implicit declaration of function ‘ffs’ -Werror=implicit-function-declaration - crtc_id = res->crtcsffs (crtcs_for_connector) - 1; - ^~~ - gstkmssink.c:590:10: error: implicit declaration of function ‘strcmp’ -Werror=implicit-function-declaration - if (!strcmp (property->name, prop_name)) { - ^~~~~~ - -2019-07-15 16:05:05 +0200 Martin Liska <mliska@suse.cz> - - * configure.ac: - Fix -Werror=return-type error in configure. - -2019-07-15 15:48:08 -0400 Martin Theriault <mtheriault@espial.com> - - * gst/aiff/aiffparse.c: - aiff: Fix infinite loop in header parsing. - -2019-07-15 12:06:25 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklinkvideosrc: Don't report that we have signal until we know for sure - Previously we would've reported that there is signal unless we know for - sure that we don't have signal. For example signal would've been - reported before the device is even opened. - Now keep track whether the signal state is unknown or not and report no - signal if we don't know yet. As before, only send an INFO message about - signal recovery if we actually had a signal loss before. - -2019-07-12 12:53:09 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - avwait: In running-time mode, select start/end running time based on the actual video timestamps - Otherwise we would start/end at exactly the given times, which might be - up to 1 frame earlier/later than the video. - -2019-07-12 12:29:09 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - avwait: Add some more debug output - -2019-07-12 12:28:59 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - avwait: Fix clipping of audio buffers at the start of recording - -2019-07-10 00:34:18 +0800 Ting-Wei Lan <lantw@src.gnome.org> - - * docs/meson.build: - build: Fix error messages for missing hotdoc extensions - -2019-07-09 12:43:53 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - cccombiner: Proxy POSITION/DURATION/URI/CAPS/ALLOCATION queries between video sinkpad and source pad - We pass-through the video as is, only putting a GstMeta on it from the - caption sinkpad. - This fixes negotation problems caused by not passing through caps - queries in both directions. - Also handle CAPS/ACCEPT_CAPS queries directly for the caption pad - instead of proxying. - -2018-12-20 12:37:43 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvcodec/gstnvdec.c: - nvdec: Fix possible frame drop on EOS - On eos, baseclass videoencoder call finish() vfunc instead of drain() - -2019-07-08 16:43:10 -0400 Ray Tiley <ray.tiley@trms.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: remove g_print - Causes a lot of output :) - -2019-07-08 23:58:29 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkviewconvert.c: - vulkan: Fix incompatible type build warning - Make declare/define a function consistent. - Note that GstBaseTransform::set_caps should return gboolean - Compiling C object subprojects/gst-plugins-bad/ext/vulkan/f3f9d6b@@gstvulkan@sha/vkviewconvert.c.obj. - ../subprojects/gst-plugins-bad/ext/vulkan/vkviewconvert.c(644): - warning C4133: '=': incompatible types - from 'GstFlowReturn (__cdecl *)(GstBaseTransform *,GstCaps *,GstCaps *)' - to 'gboolean (__cdecl *)(GstBaseTransform *,GstCaps *,GstCaps *)' - -2019-07-08 15:51:43 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srt/gstsrtobject.c: - srt: Remove msg-size property - Remove the now unused property - -2019-07-08 15:50:59 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srt/gstsrtobject.c: - srtsrc: Receive one frame per gstbuffer - Don't aggregate the received data, just receive it one packet at a - time. So it keeps the packetization boundaries - -2019-07-06 16:15:40 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/srt/gstsrtobject.c: - srt: Fix listener crash if no URI is specified - -2019-07-06 15:53:26 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/srt/gstsrtobject.c: - srt: Use macro instead of duplicating a default value - -2019-07-06 15:45:20 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/srt/gstsrtobject.c: - srt: Fix confusing typo in FIXME comment - SRT does not support IPv6, but the comment said IPv4 which was the - opposite of the following code. - -2019-07-01 13:43:28 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - * gst/timecode/meson.build: - timecodestamper: Add support for linear timecode (LTC) from an audio stream - Based on a patch by - Georg Lippitsch <glippitsch@toolsonair.com> - Vivia Nikolaidou <vivia@toolsonair.com> - Using libltc from https://github.com/x42/libltc - -2019-07-01 13:42:16 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - * gst/timecode/meson.build: - timecodestamper: Rewrite element API and code flow - We now have a single property to select the timecode source that should - be applied, and for each timecode source the timecode is updated at - every frame. Then based on a set mode, the timecode is added to the - frame if none exists already or all existing timecodes are removed and - the timecode is added. - In addition the real-time clock is considered a proper timecode source - now instead of only allowing to initialize once in the beginning with - it, and also instead of just taking the current time we now take the - current time at the clock time of the video frame. - -2019-06-07 13:27:21 +0200 Marc Leeman <marc.leeman@gmail.com> - - * sys/nvcodec/meson.build: - nvcodec: do a generic cuda tests before going into version specifics - -2019-05-17 22:27:50 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * configure.ac: - * meson_options.txt: - * sys/Makefile.am: - * sys/meson.build: - * sys/nvcodec/Makefile.am: - * sys/nvcodec/cuviddec.h: - * sys/nvcodec/gstcudaloader.c: - * sys/nvcodec/gstcudaloader.h: - * sys/nvcodec/gstcuvidloader.c: - * sys/nvcodec/gstcuvidloader.h: - * sys/nvcodec/gstnvbaseenc.c: - * sys/nvcodec/gstnvbaseenc.h: - * sys/nvcodec/gstnvdec.c: - * sys/nvcodec/gstnvdec.h: - * sys/nvcodec/gstnvenc.c: - * sys/nvcodec/gstnvenc.h: - * sys/nvcodec/gstnvh264enc.c: - * sys/nvcodec/gstnvh264enc.h: - * sys/nvcodec/gstnvh265enc.c: - * sys/nvcodec/gstnvh265enc.h: - * sys/nvcodec/meson.build: - * sys/nvcodec/nvEncodeAPI.h: - * sys/nvcodec/nvcuvid.h: - * sys/nvcodec/plugin.c: - * sys/nvdec/Makefile.am: - * sys/nvdec/meson.build: - * sys/nvenc/Makefile.am: - * sys/nvenc/README: - * sys/nvenc/TODO: - * sys/nvenc/meson.build: - * tests/check/Makefile.am: - * tests/check/meson.build: - nvdec,nvenc: Port to dynamic library loading - ... and put them into new nvcodec plugin. - * nvcodec plugin - Now each nvenc and nvdec element is moved to be a part of nvcodec plugin - for better interoperability. - Additionally, cuda runtime API header dependencies - (i.e., cuda_runtime_api.h and cuda_gl_interop.h) are removed. - Note that cuda runtime APIs have prefix "cuda". Since 1.16 release with - Windows support, only "cuda.h" and "cudaGL.h" dependent symbols have - been used except for some defined types. However, those types could be - replaced with other types which were defined by "cuda.h". - * dynamic library loading - CUDA library will be opened with g_module_open() instead of build-time linking. - On Windows, nvcuda.dll is installed to system path by CUDA Toolkit - installer, and on *nix, user should ensure that libcuda.so.1 can be - loadable (i.e., via LD_LIBRARY_PATH or default dlopen path) - Therefore, NVIDIA_VIDEO_CODEC_SDK_PATH env build time dependency for Windows - is removed. - -2019-01-30 20:07:29 +0900 Seungha Yang <seungha.yang@navercorp.com> - - d3d11videosink: Add new Direct3D11 video render plugin - Direct3D11 was shipped as part of Windows7 and it's obviously - primary graphics API on Windows. - This plugin includes HDR10 rendering if following requirements are satisfied - * IDXGISwapChain4::SetHDRMetaData is available (decleared in dxgi1_5.h) - * Display can support DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 color space - * Upstream provides 10 bitdepth format with smpte-st 2084 static metadata - -2019-07-06 00:58:47 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/utils.c: - webrtcbin: Don't assert if an SDP media can't be converted to caps - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1008 - -2019-04-25 16:32:34 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkvp9enc.c: - * sys/msdk/gstmsdkvp9enc.h: - * sys/msdk/meson.build: - msdk: add msdkvp9enc element - -2019-04-28 16:10:13 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: workaround for MFX_FOURCC_VP9_SEGMAP surface - MFX_FOURCC_VP9_SEGMAP surface in MSDK is an internal surface however - MSDK still call the external allocator for this surface, so this plugin - has to return UNSUPPORTED and force MSDK allocates surface using the - internal allocator. - See https://github.com/Intel-Media-SDK/MediaSDK/issues/762 for details - -2019-05-08 16:05:07 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - msdkenc: allow encode element requires extra frames - The call of MFXVideoENCODE_EncodeFrameAsync may not generate output and - the function returns MFX_ERR_MORE_DATA with NULL sync point, the input - frame is cached in this case, so it is possible that all allocated - frames go into the surfaces_used list after calling - MFXVideoENCODE_EncodeFrameAsync a few times, then the encoder will fail - to get an available surface before releasing used frames - This patch adds a new field of num_extra_frames to GstMsdkEnc and allows - encode element requires extra frames, the default value is 0. - This patch is the preparation for msdkvp9enc element. - -2019-07-05 16:20:29 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/vkmemory.c: - tests/vulkan: fix copyright name - -2019-07-05 16:20:05 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkwindow.c: - * tests/check/libs/vkwindow.c: - * tests/check/meson.build: - vulkan/window: add property for the parent display - -2019-07-05 16:13:13 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdevice.c: - * tests/check/libs/vkdevice.c: - * tests/check/meson.build: - vulkan/device: add property for the parent instance - -2019-07-04 17:22:07 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/gstvulkan.c: - * ext/vulkan/meson.build: - * ext/vulkan/shaders/meson.build: - * ext/vulkan/shaders/view_convert.frag: - * ext/vulkan/shaders/view_defines.h: - * ext/vulkan/vkviewconvert.c: - * ext/vulkan/vkviewconvert.h: - vulkan: add view converter element - -2019-07-04 17:19:31 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkcolorconvert.c: - vulkan: fix output framebuffer creation size - We don't scale when color converting so there is no impact. - -2019-07-05 01:26:26 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - tsmux: output smoothly increasing PTS when in CBR mode - Thanks to that, when its output is plugged into eg a udp sink, the - outgoing data can be output in a smoother way, reducing burstiness - -2019-07-05 00:17:10 +1000 Jan Schmidt <jan@centricular.com> - - * tests/check/libs/h264parser.c: - tests: Add h264parser SEI checks - Add some tests around SEI parsing. - -2019-06-28 14:59:18 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser lib: Add more profile_idc to the recognised set - Update the list of profile_idc recognised during SPS parsing - based on H.264 201704 - -2019-06-28 14:50:00 +1000 Jan Schmidt <jan@centricular.com> - - * ext/smoothstreaming/gstmssmanifest.c: - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst/videoparsers/gsth264parse.c: - h264parse lib: Remove the SPS parse_vui_params flag - The SPS parsing functions take a parse_vui_param flag - to skip VUI parsing, but there's no indication in the output - SPS struct that the VUI was skipped. - The only caller that ever passed FALSE seems to be the - important gst_h264_parser_parse_nal() function, meaning - so the - cached SPS were always silently invalid. That needs changing - anyway, meaning noone ever passes FALSE. - I don't see any use for saving a few microseconds in - order to silently produce garbage, and since this is still - unstable API, let's remove the parse_vui_param. - -2019-06-28 14:46:36 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser lib: Warn on invalid pic_timing SEI - The spec calls for pic_timing SEI to be absent unless - there's either a CpbDpbDelaysPresentFlag or - pic_struct_present_flag in the SPS VUI data. If - both those flags are missing, warn. - -2019-06-28 14:42:19 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser lib: Always consume all SEI bits - If parsing an SEI errors out, it might not consume - all bits, leaving extra unparsed data in the reader - that the outer loop then tries to parse as a new - appended SEI. - Skip all the bits if any are left over to avoid - 'finding' extra garbage SEI in the parsing. - -2019-06-28 02:42:00 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: Return BROKEN_LINK for missing SPS - When parsing SEI that require an SPS, return - GST_H264_PARSER_BROKEN_LINK instead of a generic - parsing error to let callers distinguish - bitstream errors from (expected) missing packets - when resuming decode. - -2019-06-28 01:26:19 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: Improve documentation - Improve some docs around the NALU structure contents - -2019-06-28 00:27:12 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - gstmpegvideoparser: Documentation fixes - Fix some spelling mistakes and improve documentation in - the MPEG video parser - -2019-07-04 19:43:42 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - tsmuxstream: Do not try return from void function - ../subprojects/gst-plugins-bad/gst/mpegtsmux/tsmux/tsmuxstream.c(1082): warning C4098: - 'tsmux_stream_get_es_descrs': 'void' function returning a value - -2019-07-04 19:42:48 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/gstbasetsmux.h: - * gst/mpegtsmux/gstbasetsmuxaac.c: - * gst/mpegtsmux/gstbasetsmuxaac.h: - * gst/mpegtsmux/gstbasetsmuxjpeg2000.c: - * gst/mpegtsmux/gstbasetsmuxjpeg2000.h: - * gst/mpegtsmux/gstbasetsmuxopus.c: - * gst/mpegtsmux/gstbasetsmuxopus.h: - * gst/mpegtsmux/gstbasetsmuxttxt.c: - * gst/mpegtsmux/gstbasetsmuxttxt.h: - * gst/mpegtsmux/gstmpegtsmux.c: - * gst/mpegtsmux/gstmpegtsmux.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - mpegtsmux: Remove white space - -2019-07-04 14:16:17 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/meson.build: - * ext/vulkan/vksink.c: - * ext/vulkan/vksink.h: - * gst-libs/gst/vulkan/gstvkswapper.c: - * gst-libs/gst/vulkan/gstvkswapper.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - vulkan: move swapper object to the gstvulkan library - Allows other sinks and/or user code to display to a VkSurface - -2019-07-04 14:03:51 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/meson.build: - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkdownload.c: - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vkfullscreenrender.h: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkupload.c: - * gst-libs/gst/vulkan/gstvktrash.c: - * gst-libs/gst/vulkan/gstvktrash.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - * gst-libs/gst/vulkan/vulkan_fwd.h: - vulkan: move trash list to library - -2019-07-03 13:48:49 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/utils.c: - * ext/webrtc/utils.h: - webrtcbin: use the latest self-generated SDP as the basis for renegotiations - Fixes multiple errors when a webrtcbin renegotiation can switch between the - offerer and the answerer. - -2019-05-17 16:00:24 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtp.c: - avtp: Update documentation - -2019-03-26 14:25:56 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * tests/check/Makefile.am: - * tests/check/elements/avtpcvfdepay.c: - * tests/check/meson.build: - tests: Add AVTP CVF depayloader tests - In these tests, some specially crafted buffers are sent to the - depayloader, simulating some scenarios and checking what comes out from - it. - -2019-03-25 17:23:49 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * tests/check/Makefile.am: - * tests/check/elements/avtpcvfpay.c: - * tests/check/meson.build: - tests: Add AVTP CVF payloader tests - In these tests, some specially crafted buffers are sent to the - payloader, simulating some scenarios and checking what comes out from - it. - -2019-05-02 10:52:42 -0700 Andre Guedes <andre.guedes@intel.com> - - * tests/check/Makefile.am: - * tests/check/elements/avtpsrc.c: - * tests/check/meson.build: - tests: Add AVTP source tests - This patch adds test cases for the AVTP source element. For now, only - properties get() and set() are covered. - -2019-04-25 14:16:46 -0700 Andre Guedes <andre.guedes@intel.com> - - * tests/check/Makefile.am: - * tests/check/elements/avtpsink.c: - * tests/check/meson.build: - tests: Add AVTP sink tests - This patch adds test cases for the AVTP sink element. For now, only - properties get() and set() are covered. - -2019-04-09 14:10:36 -0700 Andre Guedes <andre.guedes@intel.com> - - * tests/check/Makefile.am: - * tests/check/elements/avtpaafdepay.c: - * tests/check/meson.build: - tests: Add AAF depayloader tests - This patch adds test cases for the AAF depayloader element covering the - basic functionalities. - -2019-03-22 15:54:23 -0700 Andre Guedes <andre.guedes@intel.com> - - * tests/check/Makefile.am: - * tests/check/elements/avtpaafpay.c: - * tests/check/meson.build: - tests: Add AAF payloader tests - This patch adds the infrastructure to test AVTP plugin elements. It also - adds a test case to check avtpaafpay element basic functionality. The - test consists in setting the element sink caps and properties, and - verifying if the output buffer is set as expected. - -2019-04-16 17:32:46 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * docs/plugins/gst_plugins_cache.json: - * ext/avtp/meson.build: - docs: Add AVTP elements documentation - -2019-03-20 16:40:13 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpcvfdepay.c: - * ext/avtp/gstavtpcvfdepay.h: - avtp: Add fragmented packets handling to CVF depayloader - This patch adds to the CVF depayloader the capability to regroup H.264 - fragmented FU-A packets. - After all packets are regrouped, they are added to the "stash" of H.264 - NAL units that will be sent as soon as an AVTP packet with M bit set is - found (usually, the last fragment). - Unrecognized fragments (such as first fragment seen, but with no Start - bit set) are discarded - and any NAL units on the "stash" are sent - downstream, as if a SEQNUM discontinuty happened. - -2019-03-12 15:46:16 -0700 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/Makefile.am: - * ext/avtp/gstavtp.c: - * ext/avtp/gstavtpcvfdepay.c: - * ext/avtp/gstavtpcvfdepay.h: - * ext/avtp/meson.build: - avtp: Introduce AVTP CVF depayloader element - This patch introduces the AVTP Compressed Video Format (CVF) depayloader - specified in IEEE 1722-2016 section 8. Currently, this depayloader only - supports H.264 encapsulation described in section 8.5. - Is also worth noting that only single NAL units are handled: aggregated - and fragmented payloads are not handled. - As stated in AVTP CVF payloader patch, AVTP timestamp is used to define - outgoing buffer DTS, while the H264_TIMESTAMP defines outgoing buffer - PTS. - When an AVTP packet is received, the extracted H.264 NAL unit is added to - a "stash" (the out_buffer) of H.264 NAL units. This "stash" is pushed - downstream as single buffer (with NAL units aggregated according to format - used on GStreamer, based on ISO/IEC 14496-15) as soon as we get the AVTP - packet with M bit set. - This patch groups NAL units using a fixed NAL size lenght, sent downstream - on the `codec_data` capability. - The "stash" of NAL units can be prematurely sent downstream if a - discontinuity (a missing SEQNUM) happens. - This patch reuses the infra provided by gstavtpbasedepayload.c. - -2019-03-05 18:09:13 -0800 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/gstavtpcvfpay.c: - avtp: Add fragmentation feature to CVF payloader - Based on `mtu` property, the CVF payloader is now capable of properly - fragmenting H.264 NAL units that are bigger than MTU in several AVTP - packets. - AVTP spec defines two methods for fragmenting H.264 packets, but this - patch only generates non-interleaved FU-A fragments. - Usually, only the last NAL unit from a group of NAL units in a single - buffer will be big enough to be fragmented. Nevertheless, only the last - AVTP packet sent for a group of NAL units will have the M bit set (this - means that the AVTP packet for the last fragment will only have the M - bit set if there's no more NAL units in the group). - -2019-02-28 15:49:02 -0800 Ederson de Souza <ederson.desouza@intel.com> - - * ext/avtp/Makefile.am: - * ext/avtp/gstavtp.c: - * ext/avtp/gstavtpcvfpay.c: - * ext/avtp/gstavtpcvfpay.h: - * ext/avtp/meson.build: - avtp: Introduce AVTP CVF payloader element - This patch introduces the AVTP Compressed Video Format (CVF) payloader - specified in IEEE 1722-2016 section 8. Currently, this payload only - supports H.264 encapsulation described in section 8.5. - Is also worth noting that only single NAL units are encapsulated: no - aggregation or fragmentation is performed by the payloader. - An interesting characteristic of CVF H.264 spec is that it defines an - H264_TIMESTAMP, in addition to the AVTP timestamp. The later is - translated to the GST_BUFFER_DTS while the former is translated to the - GST_BUFFER_PTS. From AVTP CVF H.264 spec, it is clear that the AVTP - timestamp is related to the decoding order, while the H264_TIMESTAMP is - an ancillary information to the H.264 decoder. - Upon receiving a buffer containing a group of NAL units, the avtpcvfpay - element will extract each NAL unit and payload them into individual AVTP - packets. The last AVTP packet generated for a group of NAL units will - have the M bit set, so the depayloader is able to properly regroup them. - The exact format of the buffer of NAL units is described on the - 'codec_data' capability, which is parsed by the avtpcvfpay, in the same - way done in rtph264pay. - This patch reuses the infra provided by gstavtpbasepayload.c. - -2019-01-23 15:17:48 -0800 Andre Guedes <andre.guedes@intel.com> - - * ext/avtp/Makefile.am: - * ext/avtp/gstavtp.c: - * ext/avtp/gstavtpsrc.c: - * ext/avtp/gstavtpsrc.h: - * ext/avtp/meson.build: - avtp: Introduce AVTP source element - This patch introduces the avtpsrc element which implements a typical - network source. The avtpsrc element receives AVTPDUs encapsulated into - Ethernet frames and push them downstream in the GStreamer pipeline. - Implementation if pretty straightforward since the burden is implemented - by GstPushSrc class. - Likewise the avtpsink element, applications that utilize this element - must have CAP_NET_RAW capability since it is required by Linux to open - sockets from AF_PACKET domain. - -2019-01-23 10:56:10 -0800 Andre Guedes <andre.guedes@intel.com> - - * ext/avtp/Makefile.am: - * ext/avtp/gstavtp.c: - * ext/avtp/gstavtpsink.c: - * ext/avtp/gstavtpsink.h: - * ext/avtp/meson.build: - avtp: Introduce AVTP sink element - This patch introduces the avtpsink elements which implements a typical - network sink. Implementation is pretty straightforward since the burden - is implemented by GstBaseSink class. - The avtpsink element defines three new properties: 1) network interface - from where AVTPDU should be transmitted, 2) destination MAC address - (usually a multicast address), and 3) socket priority (SO_PRIORITY). - Socket setup and teardown are done in start/stop virtual methods while - AVTPDU transmission is carried out by render(). AVTPDUs are encapsulated - into Ethernet frames and transmitted to the network via AF_PACKET socket - domain. Linux requires CAP_NET_RAW capability in order to open an - AF_PACKET socket so the application that utilize this element must have - it. For further info about AF_PACKET socket domain see packet(7). - Finally, AVTPDUs are expected to be transmitted at specific times - - according to the GstBuffer presentation timestamp - so the 'sync' - property from GstBaseSink is set to TRUE by default. - -2019-01-23 16:20:27 -0800 Andre Guedes <andre.guedes@intel.com> - - * ext/avtp/Makefile.am: - * ext/avtp/gstavtp.c: - * ext/avtp/gstavtpaafdepay.c: - * ext/avtp/gstavtpaafdepay.h: - * ext/avtp/gstavtpbasedepayload.c: - * ext/avtp/gstavtpbasedepayload.h: - * ext/avtp/meson.build: - avtp: Introduce AAF depayloader element - This patch introduces the AAF depayloader element, the counterpart from - the AAF payloader. As expected, this element inputs AVTPDUs and outputs - audio raw data and supports AAF PCM encapsulation only. - The AAF depayloader srcpad produces a fixed format that is encoded - within the AVTPDU. Once the first AVTPDU is received by the element, the - audio features e.g. sample format, rate, number of channels, are decoded - and the srcpad caps are set accordingly. Also, at this point, the - element pushes a SEGMENT event downstream defining the segment according - to the AVTP presentation time. - All AVTP depayloaders will share some common code. For that reason, this - patch introduces the GstAvtpBaseDepayload abstract class that implements - common depayloader functionalities. AAF-specific functionalities are - implemented in the derived class GstAvtpAafDepay. - -2019-01-16 17:16:59 -0800 Andre Guedes <andre.guedes@intel.com> - - * ext/avtp/Makefile.am: - * ext/avtp/gstavtp.c: - * ext/avtp/gstavtpaafpay.c: - * ext/avtp/gstavtpaafpay.h: - * ext/avtp/gstavtpbasepayload.c: - * ext/avtp/gstavtpbasepayload.h: - * ext/avtp/meson.build: - avtp: Introduce AAF payloader element - This patch introduces the AVTP Audio Format (AAF) payloader element from - the AVTP plugin. The element inputs audio raw data and outputs AVTP - packets (aka AVTPDUs), implementing a typical protocol payloader element - from GStreamer. - AAF is one of the available formats to transport audio data in an AVTP - system. AAF is specified in IEEE 1722-2016 section 7 and provides two - encapsulation mode: PCM and AES3. This patch implements PCM - encapsulation mode only. - The AAF payloader working mechanism consists of building the AAF header, - prepending it to the GstBuffer received on the sink pad, and pushing the - buffer downstream. Payloader parameters such as stream ID, maximum - transit time, time uncertainty, and timestamping mode are passed via - element properties. AAF doesn't support all possible sample format and - sampling rate values so the sink pad caps template from the payloader is - a subset of audio/x-raw. Additionally, this patch implements only - "normal" timestamping mode from AAF. "Sparse" mode should be implemented - in future. - Upcoming patches will introduce other AVTP payloader elements that will - have some common code. For that reason, this patch introduces the - GstAvtpBasePayload abstract class that implements common payloader - functionalities, and the GstAvtpAafPay class that extends the - GstAvtpBasePayload class, implementing AAF-specific functionalities. - The AAF payloader element is most likely to be used with the AVTP sink - element (to be introduced by a later patch) but it could also be used - with UDP sink element to implement AVTP over UDP as described in IEEE - 1722-2016 Annex J. - This element was inspired by RTP payloader elements. - -2019-01-14 10:18:42 -0800 Andre Guedes <andre.guedes@intel.com> - - * configure.ac: - * ext/Makefile.am: - * ext/avtp/Makefile.am: - * ext/avtp/gstavtp.c: - * ext/avtp/meson.build: - * ext/meson.build: - * meson_options.txt: - avtp: AVTP plugin bootstrap code - This patch introduces the bootstrap code from the AVTP plugin (plugin - definition and init) as well as the build system files. Upcoming patches - will introduce payloaders, source and sink elements provided by the AVTP - plugin. These elements can be utilized by a GStreamer pipeline to - implement TSN audio/video applications. - Regarding the plugin build system files, both autotools and meson files - are introduced. The AVTP plugin is landed in ext/ since it has an - external dependency on libavtp, an opensource AVTP packetization - library. For further information about libavtp check 1. - 1 https://github.com/AVnu/libavtp - -2019-07-04 01:12:06 +1000 Jan Schmidt <jan@centricular.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Don't segfault when SPS hasn't been seen yet. - Fix a recently introduced segfault. Don't de-reference a NULL - SPS pointer when attempting to update source caps before SPS - has been seen in the stream. - -2019-07-02 14:30:35 +0300 OleksandrKvl <oleksandrdvl@gmail.com> - - * gst/pcapparse/gstirtspparse.c: - * gst/pcapparse/gstirtspparse.h: - irtspparse: handle multiple and incomplete frames - Interleaved frames can be fragmented between - incoming frames. Thus, we can have multiple - frames within the single input frame, as well as - incomplete frame. Now it preserves parsing - state and handle both situations. - Fixes #991 - -2019-06-24 13:33:54 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvpp.c: - msdk: don't share context between msdkvpp and msdkenc - msdkenc supports CSC implicitly, so it is possible that two VPP - processes are required when a pipeline contains msdkvpp and msdkenc. - Before this fix, msdkvpp and msdkenc may share the same context, hence - the same mfx session, which results in MFX_ERR_UNDEFINED_BEHAVIOR - in MSDK because a mfx session has at most one VPP process only - This fixes the broken pipelines below: - gst-launch-1.0 videotestsrc ! video/x-raw,format=I420 ! msdkh264enc ! \ - msdkh264dec ! msdkvpp ! video/x-raw,format=YUY2 ! fakesink - gst-launch-1.0 videotestsrc ! msdkvpp ! video/x-raw,format=YUY2 ! \ - msdkh264enc ! fakesink - -2019-06-21 18:18:44 -0700 U. Artie Eoff <ullysses.a.eoff@intel.com> - - * sys/msdk/gstmsdkmjpegdec.c: - msdkmjpegdec: support 422 output - MSDK supports JPEG YUY2 (422 chroma) output color - format. The color format of input bitstream is - described by JPEGChromaFormat and JPEGColorFormat - fields in the mfxInfoMFX structure which is filled - in by the MFXVideoDECODE_DecodeHeader function. - To obtain lossless decoded output from 422 encoded - JPEGs, we must set the output color format in the - FourCC and ChromaFormat fields in the mfxFrameInfo - structure to the appropriate values at post_configure - so that they are propagated through to the srcpad - caps accordingly. - -2019-06-21 18:12:48 -0700 U. Artie Eoff <ullysses.a.eoff@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - msdkdec: add post_configure virtual method - A post_configure virtual method is added to allow - codec subclasses to adjust the initialized parameters - after MFXVideoDECODE_DecodeHeader is called from the - gstmsdkdec::gst_msdkdec_handle_frame function. - This is useful if codecs want to adjust the output - parameters based on the codec-specific decoding - options that are present in the mfxInfoMFX structure - after MFXVideoDECODE_DecodeHeader initializes them. - -2019-06-03 16:25:57 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvp9dec.c: - msdkvp9dec: add support for VP9 444 - The output formats are VUYA for 8bit 444 and Y410 for 10bit 444. - -2019-05-31 16:34:54 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - msdkh265dec: add support for main-444-10/main-444-10-intra profile - The output format is Y410 - -2019-05-31 16:22:08 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/gstmsdkvideomemory.c: - msdk: return a right pointer for Y410 when mapping a frame - -2019-06-03 14:05:07 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: set right BitDepth and Shift for Y410 mfx frame - BitDepth is 10 and Shitf must be set to 0 when creating Y410 mfx - frame in MSDK - -2019-05-31 15:37:51 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdksystemmemory.c: - msdk: set parameters in mfxFrameData for a MFX_FOURCC_Y410 frame - -2019-05-31 15:26:50 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/msdk_libva.c: - msdk: map MFX_FOURCC_Y410 to VA_FOURCC_Y410 - -2019-05-31 15:21:05 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: map GST_VIDEO_FORMAT_Y410 to VA_FOURCC_Y410 - -2019-05-31 15:13:47 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: map GST_VIDEO_FORMAT_Y410 to MFX_FOURCC_Y410 - -2019-05-31 12:48:15 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - msdkh265dec: add support for main-444 profile - The output format is VUYA - -2019-05-30 11:13:26 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - msdkh265dec: add support for main-422-10/main-422-10-intra 10bit - The ouput format is Y210 - -2019-05-30 12:20:54 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: set right BitDepth and Shift for Y210 mfx frame - BitDepth is 10 and Shitf must be set to 1 when creating Y210 mfx - frame in MSDK - -2019-05-30 11:10:58 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdksystemmemory.c: - msdk: set parameters in mfxFrameData for a MFX_FOURCC_Y210 frame - -2019-05-30 11:02:08 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/msdk_libva.c: - msdk: map MFX_FOURCC_Y210 to VA_FOURCC_Y210 - -2019-05-30 09:56:43 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: map GST_VIDEO_FORMAT_Y210 to VA_FOURCC_Y210 - -2019-05-30 09:49:22 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: map GST_VIDEO_FORMAT_Y210 to MFX_FOURCC_Y210 - -2019-05-28 16:50:59 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - msdkh265dec: add support for main-422-10/main-422-10-intra 8bit - The output format is YUY2 - -2019-06-28 15:46:22 +1000 Jan Schmidt <jan@centricular.com> - - * sys/uvch264/Makefile.am: - uvch264: Fix autotools build. - Add gstuvch264deviceprovider.c to the Makefile.am missed - in MR 387 - -2019-06-26 19:53:51 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/rtp/gstrtpsink.c: - * gst/rtp/gstrtpsrc.c: - rtp: Fix incompatible type build warning - Use GstURIType instead of guint - ../subprojects/gst-plugins-bad/gst/rtp/gstrtpsink.c(575): - warning C4133: '=': incompatible types ... - ../subprojects/gst-plugins-bad/gst/rtp/gstrtpsrc.c(725): - warning C4133: '=': incompatible types ... - -2019-06-25 20:37:57 +0200 Juan Navarro <juan.navarro@gmx.es> - - * ext/dtls/gstdtlsagent.c: - dtlsagent: Clear the certificate upon finalize - Cleaning this up was likely just forgotten - -2019-06-25 20:37:38 +0200 Juan Navarro <juan.navarro@gmx.es> - - * ext/dtls/gstdtlsdec.c: - dtlsdec: Avoid duplicate ref when passing certificate property - The agent itself will take a ref on the property setter, so we'll be - left with two references to the certificate object, when actually there - should be only one - -2019-05-20 23:19:19 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/bluez/meson.build: - meson: bluez: Early terminate configure on Windows - This plugin is for linux bluetooth stack. So the early termination can save - configure time on Windows (i.e., we can avoid glib subproject fallback) - -2019-06-12 11:12:37 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - wpe: Port for WPEWebKit 2.25.x - When WPEBackend-fdo >= 1.3.0 is detected, the threaded view now relies on the - wpe_fdo_egl_exported_image API instead of the EGLImageKHR-based API which is - going to be deprecated in 2.26. The GLib sources created by the view now use the - default priority as well, the custom priority is no longer required. - -2019-06-24 18:39:35 +0300 OleksandrKvl <oleksandrdvl@gmail.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: Fix handling of TCP payload length - The length of the TCP payload is the IP plus TCP header length - subtracted from the IP datagram length specified in the IP header. - Prior to this, the size was calculated incorrectly, considering - all data after TCP header as a payload till the end of a packet. - Fixes #995 - -2019-06-24 13:50:19 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - avwait: Make sure to never unref an input buffer we already unreffed before - -2019-06-20 19:59:16 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - * gst/timecode/gstavwait.h: - avwait: Add support for setting an end running time - It was possible to set a start running time and start/end timecode - before, but not an end running time. - -2019-06-20 17:50:43 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - avwait: Correctly stop recording and signal recording stop on EOS - If recording is set to FALSE after the last audio or video buffer and - before the EOS event then recording stop is never signalled. - Similarly, we should signal recording stop once both audio and video are - EOS, regardless of the recording property, as there's nothing to be - recorded anymore. - -2019-06-24 16:22:47 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vksink.c: - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkswapper.h: - vkswapper: support rescaling to the output size - -2019-06-24 15:32:25 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vksink.c: - * ext/vulkan/vkswapper.c: - vksink: Don't take vulkan buffer's as input - -2019-06-24 15:30:56 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/vkcolorconvert.c: - tests/vkcolorconvert: remove extra instance/device creation - It's unnecessary. - -2019-06-20 08:59:22 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Correctly ensure >=16 byte alignment for the buffers we allocate - We'll ensure at least 64 byte alignment for AVX2 but 16 byte alignment - is what is required by the decklink SDK. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/986 - -2019-06-23 17:03:32 +0100 Philippe Normand <philn@igalia.com> - - * ext/webrtc/webrtcdatachannel.c: - webrtc: Fix data-channel send-string doc - -2019-06-20 10:04:06 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Notify about signal loss even when dropping no-signal frames - Otherwise the application has no way of knowing that signal loss - happened other than noticing a gap between actual frames. - -2019-06-20 14:36:02 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/shaders/ayuv_to_rgb.frag: - * ext/vulkan/shaders/downsample_ayuv.glsl: - vulkan: remove unused downsample AYUV shader - -2019-06-19 19:43:14 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/transportreceivebin.c: - * ext/webrtc/transportreceivebin.h: - webrtcbin: fix DTLS when receivebin is set to DROP - Regression introduced by b4bdcf15b7237eb5c5943c4f746701a477333000 - This commit prevents the handshake from reaching dtlsdec when - the receive state of the receive bin is set to DROP (for example - when transceivers are sendonly). - This preserves the intent of the commit, by blocking the bin - at its sinks until the receive state is no longer BLOCK, but - makes sure the handshake still goes through, by only dropping - data at the src pads, as was the case before. - -2019-06-20 01:39:53 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/shaders/meson.build: - * ext/vulkan/shaders/nv12_to_rgb.frag: - * ext/vulkan/shaders/rgb_to_nv12.frag: - * ext/vulkan/shaders/upsample_nv12.glsl: - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkfullscreenrender.c: - vkcolorconvert: add support for RGB<->NV12 - -2019-06-20 01:36:55 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkupload.c: - * gst-libs/gst/vulkan/gstvkbuffermemory.c: - * gst-libs/gst/vulkan/gstvkbufferpool.c: - * tests/check/elements/vkcolorconvert.c: - vkbuffermemory: report requested size of the memory - Rather than using Vulkan's much larger aligned sizes. Fixes multi-planer - video with the GstVideoFrame API. - -2019-06-19 19:09:21 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/shaders/ayuv_to_rgb.frag: - * ext/vulkan/shaders/color_convert_generic.glsl: - * ext/vulkan/shaders/downsample_ayuv.glsl: - * ext/vulkan/shaders/meson.build: - * ext/vulkan/shaders/rgb_to_ayuv.frag: - * ext/vulkan/shaders/rgb_to_yuy2.frag: - * ext/vulkan/shaders/swizzle.glsl: - * ext/vulkan/shaders/upsample_ayuv.glsl: - * ext/vulkan/shaders/upsample_yuy2.glsl: - * ext/vulkan/shaders/uyvy_to_rgb.frag: - * ext/vulkan/shaders/yuy2_to_rgb.frag: - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkcolorconvert.h: - vulkancolorconvert: support RGB <-> AYUV/YUY2/UYVY - -2019-06-19 15:28:42 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vktrash.c: - * ext/vulkan/vktrash.h: - vktrash: add mini_object_unref destroy function - -2019-06-19 15:27:11 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vkimageidentity.c: - vkfullscreenrender: create descriptor sets later - The desciptor sets may be dependant on the caps - -2019-06-19 15:25:18 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/shaders/meson.build: - vulkan/shaders: change glslc compilation args based on configurations - Add depfile support so that modifying an #included glsl snippet - rebuilds all the dependant shaders. - -2019-06-13 18:05:40 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/gstvulkan.c: - * ext/vulkan/meson.build: - * ext/vulkan/shaders/meson.build: - * ext/vulkan/shaders/swizzle.frag: - * ext/vulkan/shaders/swizzle.glsl: - * ext/vulkan/shaders/swizzle_and_clobber_alpha.frag: - * ext/vulkan/vkcolorconvert.c: - * ext/vulkan/vkcolorconvert.h: - * tests/check/elements/vkcolorconvert.c: - * tests/check/meson.build: - vulkan: add a color conversion element - Currently converts between all 4-component RGBA/RGBx formats. - -2019-06-13 17:57:51 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkformat.c: - * gst-libs/gst/vulkan/gstvkformat.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - vulkan: add some information on vulkan formats - -2019-06-13 17:44:22 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkupload.c: - vkupload: Also implement copying non vulkan memory into vulkan buffers - The only way we can upload things is through our memory so any - non-vulkan memory that appears must be copied into our memory. - -2019-06-13 17:05:44 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/gstvulkan.c: - * ext/vulkan/meson.build: - * ext/vulkan/vkdownload.c: - * ext/vulkan/vkdownload.h: - vulkan: add download element - Currently only downloads images into a host-visible buffer and - synchronises immediately. - -2019-06-11 02:05:32 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/meson.build: - * ext/vulkan/shaders/identity.frag: - * ext/vulkan/shaders/identity.vert: - * ext/vulkan/vkfullscreenrender.c: - * ext/vulkan/vkfullscreenrender.h: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkimageidentity.h: - vulkan/identity: Split out most rendering code to a base class - A simple base class that renders a 2d fullscreen quad parallel to the - screen surface inside the view frustum. - -2019-06-12 18:25:00 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkupload.c: - vkupload: fix a structure sType - -2019-06-11 18:37:59 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkdevice.c: - * gst-libs/gst/vulkan/gstvkdisplay.c: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkqueue.c: - vulkan: ensure initialization of a couple of debug categories - Needed when some of the context querying functions can be called before - an instance has been created. - -2019-05-21 17:19:00 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vksink.c: - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkswapper.h: - vksink: Retrieve vulkan queue earlier - Allows using the swapper's queue over upstream's queue. The swapper - will check for the necessary presentation support that upstream may not - consider. - -2019-06-19 14:13:02 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Pass through interlace-mode field from upstream if available - We generally always prefer the information from upstream for other - metadata (pixel-aspect-ration, etc.) and should also do so here. - Other parsers (h264parse) already do the same. - -2019-06-19 13:31:39 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/zbar/gstzbar.c: - zbar: Include running-time, stream-time and duration in the messages - The timestamp/PTS alone is meaningless without the segment and usually - applications care about the running-time or stream-time. - This also keeps the messages in sync with the spectrum and level - elements. - -2017-11-04 20:40:18 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/elements/hlsdemux_m3u8.c: - tests: hls: Add a test case for EXT-X-MAP tag - https://bugzilla.gnome.org/show_bug.cgi?id=776928 - -2019-05-12 19:21:23 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/hls/meson.build: - * tests/check/elements/hlsdemux_m3u8.c: - * tests/check/meson.build: - tests: Enable hls m3u8 unit test with meson build - -2017-11-04 20:39:39 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Set fragment header uri if exists - To allow downloading fragment hearder, set its uri if there is - available "Media Initialization" parsed from EXT-X-MAP tag - https://bugzilla.gnome.org/show_bug.cgi?id=776928 - -2017-11-04 20:15:33 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hls: m3u8: Parsing EXT-X-MAP tag to store initialization data - EXT-X-MAP tag informs media initialization data, - such as moov box in ISOBMFF case and PAT/PMT for MPEG TS stream. - https://bugzilla.gnome.org/show_bug.cgi?id=776928 - -2017-01-30 14:13:06 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Do not clear/advance fragment by finished header downloading - Header data must be forwarded to downstream, but if demux does not finish - to finding type (e.g., ts, mp4 and etc), this header data can be cleared - by _stream_clear_pending_data(). Moreover, although demux finish downloading - header data, still it has fragment date to be downloaded, fragment sequence - shouldn't be advanced yet at that moment. - https://bugzilla.gnome.org/show_bug.cgi?id=776928 - -2019-02-19 21:46:43 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/libs/insertbin.c: - tests: insertbin: Don't use duplicated variable name - ../subprojects/gst-plugins-bad/tests/check/libs/insertbin.c(46): warning C4273: - 'mutex': ... - The "mutex" was declared in gstcheck.h already - -2019-06-17 14:58:50 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/meson.build: - applemedia: add the '-fobjc-arc' for darwin/ios - We use ARC so we need to signal that to the compiler. - -2019-06-03 12:18:13 -0400 Thibault Saunier <tsaunier@igalia.com> - - * sys/uvch264/gstuvch264.c: - * sys/uvch264/gstuvch264deviceprovider.c: - * sys/uvch264/meson.build: - uvch264: Implement device provider - -2019-06-03 12:17:22 -0400 Thibault Saunier <tsaunier@igalia.com> - - * sys/uvch264/gstuvch264_src.c: - * sys/uvch264/gstuvch264_src.h: - * sys/uvch264/uvc_h264.c: - * sys/uvch264/uvc_h264.h: - uvch264: Factor out checking if v4l2device is uvc compatible - -2019-04-08 19:24:00 +0200 Nicola Murino <nicola.murino@gmail.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: update parser state and header flag when using fallback sps - When sps parsing fails we use a fallback sps from the caps, since we - have got an sps we need to update parser state and header as in the case the - sps was successfully parsed - -2018-11-26 17:23:21 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: update parser state and header flag when using fallback sps - When sps parsing fails we use a fallback sps from the caps, since we - have got an sps we need to update parser state and header as in the case the - sps was successfully parsed - Closes #503 - -2019-05-31 10:12:54 -0400 Thibault Saunier <tsaunier@igalia.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Post a WARNING when data is broken - -2019-06-12 15:47:52 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Add more string representations of extension profiles - -2019-06-12 15:32:17 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - h265parser: Add more profiles to known type - "High Throughput", "Multiview", "Scalable", "3D", "Screen Content Coding", - and "Scalable format range extensions" profiles can be supported - via h265parser APIs now. - -2019-04-18 18:12:34 +0900 Dong Il Park <dongil.park@lge.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Update framerate when we found vps_timing_info - The timing_info was described at vps or vui parameter. - So we can update the framerate field of GstCaps when we could - parse vps_timing_info parameters. - -2019-04-18 16:54:51 +0900 Dong Il Park <dongil.park@lge.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: Use vps_timing_info when not present in vui - The same timing_info will be present at vps or vui. - When the timeing_info is present in the VPS, vui_timing_info - , when present, shall be equal to vps_timing_info, and when - not present, is inferred to be equal to vps_timing_info. - -2019-06-08 22:57:21 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/vulkan/gstvkapi.h: - * gst-libs/gst/vulkan/gstvkconfig.h.meson: - * gst-libs/gst/vulkan/gstvkdisplay.c: - * gst-libs/gst/vulkan/gstvkdisplay.h: - * gst-libs/gst/vulkan/gstvkwindow.c: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/win32/gstvkwindow_win32.c: - * gst-libs/gst/vulkan/win32/gstvkwindow_win32.h: - vulkan: Add support WIN32 for Windows - It's almost a fork of glwindow_win32 implementation. - To build on Windows, Vulkan SDK (at https://vulkan.lunarg.com/sdk/home) - and VK_SDK_PATH environment are required. Note that VK_SDK_PATH environment - setting is a part of the SDK installation. - -2019-06-12 10:12:14 +0200 Arun Raghavan <arun@arunraghavan.net> - - * sys/bluez/gstavdtputil.c: - avdtpsrc: Honour initial transport volume setting before connection - We make the binding go from the avdtpsrc to the transport, so that any - initial setting before a connection made is used. - -2019-06-11 12:10:13 -0400 Thibault Saunier <tsaunier@igalia.com> - - * sys/uvch264/gstuvch264_src.c: - uvch264src: Make sure we set our segment - We were not setting self->segment and we are using it - when notifying downstream that we handled a REQUEST_KEY_UNIT - event, leading to all sort of criticals. - -2019-06-11 14:28:22 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Don't miss constraint indicator flags in codec data - Set more unhandled flags to general_constraint_indicator_flags field. - The field is required for building "Codecs" parameter as defined - ISO/IEC 14496-15 Annex E. The resulting "Codecs" string might be used - in various places (e.g., HLS/DASH manifest, browser, player, etc) - -2019-06-07 14:12:25 +0000 Marc Leeman <marc.leeman@gmail.com> - - * gst/rtp/meson.build: - rtpmanagerbad: fix the plugin registration - After compilation, the compiled library needs to be added to the list - of plugin libraries. - . - Also, fix for static builds - -2019-06-06 18:22:43 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * docs/plugins/gst_plugins_cache.json: - * meson_options.txt: - * sys/Makefile.am: - * sys/meson.build: - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpau.c: - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpdecoder.h: - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdpoutputbuffer.c: - * sys/vdpau/gstvdpoutputbuffer.h: - * sys/vdpau/gstvdpoutputbufferpool.c: - * sys/vdpau/gstvdpoutputbufferpool.h: - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/gstvdpsink.h: - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdputils.h: - * sys/vdpau/gstvdpvideobufferpool.c: - * sys/vdpau/gstvdpvideobufferpool.h: - * sys/vdpau/gstvdpvideomemory.c: - * sys/vdpau/gstvdpvideomemory.h: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - * sys/vdpau/h264/gsth264dpb.c: - * sys/vdpau/h264/gsth264dpb.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/h264/gstvdph264dec.h: - * sys/vdpau/meson.build: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.h: - * sys/vdpau/mpeg4/gstmpeg4frame.c: - * sys/vdpau/mpeg4/gstmpeg4frame.h: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.c: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.h: - * sys/vdpau/mpeg4/mpeg4util.c: - * sys/vdpau/mpeg4/mpeg4util.h: - * tests/check/Makefile.am: - Remove VDPAU plugin - It's been replaced by NVENC/NVDEC and even NVIDIA doesn't - support VDPAU any longer and hasn't for quite some time. - The plugin has been unmaintained and unsupported for a very - long time, and given the track record over the last 10 years - it seems highly unlikely anyone is going to make it work well, - not to mention adding plumbing for proper zero-copy or - gst-gl integration. - Closes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/828 - -2019-06-06 18:36:00 +0100 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - autotools: fix distcheck - -2019-06-05 17:10:19 +0100 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - autotools: remove gst/rtp/ from cruft dir list - -2019-06-05 16:58:32 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/rtp/Makefile.am: - rtp: fix autotools build some more - -2019-06-05 12:47:16 +0100 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - * ext/wpe/gstwpesrc.cpp: - wpe: Fix build with -Werror enabled - Including gl.h from WPEThreadedView.h leads to GST_LEVEL_DEFAULT detected as - redefined. The proposed fix is to include config.h from the CPP implementation - file and disable gl.h inclusion in the header, by using forward declarations. - -2019-06-05 11:46:49 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - avwait: Allow start and end timecode to be set back to NULL - And check everywhere if they're NULL before accessing them. - -2019-06-05 08:12:10 +0200 Niels De Graef <niels.degraef@barco.com> - - * gst-libs/gst/audio/gstplanaraudioadapter.h: - * gst-libs/gst/insertbin/gstinsertbin.h: - * gst-libs/gst/webrtc/dtlstransport.h: - * gst-libs/gst/webrtc/icetransport.h: - * gst-libs/gst/webrtc/rtcsessiondescription.h: - * gst-libs/gst/webrtc/rtpreceiver.h: - * gst-libs/gst/webrtc/rtpsender.h: - * gst-libs/gst/webrtc/rtptransceiver.h: - Use G_DEFINE_AUTOPTR_CLEANUP_FUNC unconditionally - Since we started depending on GLib 2.44, we can be sure this macro is - defined (it will be a no-op on compilers that don't support it). - -2019-05-21 14:04:07 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/vkmemory.c: - tests/vulkan: allow instance creation failures - Usually means that there is no vulkan implementation available. - We skip tests in that case - -2019-05-20 13:54:56 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/vkmemory.c: - * tests/check/meson.build: - test/vulkan: add simple memory test - -2019-05-20 13:48:27 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkupload.c: - vkupload: remove debugging error log - -2019-05-20 13:46:56 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkupload.c: - * gst-libs/gst/vulkan/gstvkbarrier.h: - * gst-libs/gst/vulkan/gstvkbuffermemory.c: - * gst-libs/gst/vulkan/gstvkbuffermemory.h: - * gst-libs/gst/vulkan/gstvkimagememory.c: - * gst-libs/gst/vulkan/gstvkimagememory.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - * gst-libs/gst/vulkan/vulkan_fwd.h: - vulkan: implement the correct memory barriers necessary - Vulkan validation layers are finally silent! - -2019-05-16 22:39:51 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkupload.c: - vulkan: remove uneeded buffer inheritence information - buffer inheritence informationi is only required for secondary command - buffers which we are not creating - -2019-05-16 19:48:24 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/gstvulkan.c: - * ext/vulkan/meson.build: - * ext/vulkan/shaders/bin2array.py: - * ext/vulkan/shaders/identity.frag: - * ext/vulkan/shaders/identity.vert: - * ext/vulkan/shaders/meson.build: - * ext/vulkan/vkimageidentity.c: - * ext/vulkan/vkimageidentity.h: - * ext/vulkan/vkshader.c: - * ext/vulkan/vkshader.h: - vulkan: add a new image copying element - Copies using the graphics pipeline, an input image and renders to an - output image. - -2019-05-16 19:39:20 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkmemory.c: - vkmemory: fix allocation of sizes less than the alignment - Avoids allocating a 0-sized device memory which is invalid vulkan usage - -2019-05-16 19:38:35 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkbufferpool.c: - * gst-libs/gst/vulkan/gstvkimagebufferpool.c: - vk*pool: expand usage hints to cover use in a renderpass - -2019-05-16 19:36:18 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkimagememory.c: - vkformat: fix format conversion for matching vulkan formats - Other formats still need a swizzle or conversion. - -2019-05-16 19:35:11 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkbuffermemory.c: - vkbuffermemory: bufferview's are only for texture-like memory - -2019-05-16 19:34:41 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkupload.c: - vkupload: add raw->vulkanimage uploader - -2019-05-16 19:33:06 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vktrash.c: - * ext/vulkan/vktrash.h: - vktrash: add more destruction of vulkan types - -2019-05-09 21:50:47 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkupload.c: - * gst-libs/gst/vulkan/gstvkbuffermemory.c: - * gst-libs/gst/vulkan/gstvkimagememory.c: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkmacros.h: - * gst-libs/gst/vulkan/vulkan.h: - vulkan: use c99 designated initializers where possible - Makes the code much easier to read and allows removing our terrible - macros for structure initialization. - -2019-05-08 21:26:17 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vksink.c: - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkupload.c: - vkswapper: support displaying memory:VulkanImage - -2019-05-08 14:50:29 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/meson.build: - * ext/vulkan/vkupload.c: - * ext/vulkan/vkupload.h: - * gst-libs/gst/vulkan/gstvkbufferpool.c: - * gst-libs/gst/vulkan/gstvkimagebufferpool.c: - * gst-libs/gst/vulkan/gstvkimagebufferpool.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - * gst-libs/gst/vulkan/vulkan_fwd.h: - vkupload: implement buffer to image uploader - -2019-05-08 14:48:43 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkqueue.c: - vkqueue: unly unref the context query if it succeeds - -2019-05-08 14:47:43 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vksink.c: - vulkansink: Respond to queue queries - -2019-04-11 16:52:54 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/vulkan/gstvkbuffermemory.c: - * gst-libs/gst/vulkan/gstvkbuffermemory.h: - * gst-libs/gst/vulkan/gstvkbufferpool.c: - * gst-libs/gst/vulkan/gstvkcommandpool.c: - * gst-libs/gst/vulkan/gstvkcommandpool.h: - * gst-libs/gst/vulkan/gstvkdevice.c: - * gst-libs/gst/vulkan/gstvkdevice.h: - * gst-libs/gst/vulkan/gstvkdisplay.c: - * gst-libs/gst/vulkan/gstvkdisplay.h: - * gst-libs/gst/vulkan/gstvkerror.c: - * gst-libs/gst/vulkan/gstvkfence.c: - * gst-libs/gst/vulkan/gstvkfence.h: - * gst-libs/gst/vulkan/gstvkimagememory.c: - * gst-libs/gst/vulkan/gstvkimagememory.h: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkmemory.c: - * gst-libs/gst/vulkan/gstvkmemory.h: - * gst-libs/gst/vulkan/gstvkqueue.c: - * gst-libs/gst/vulkan/gstvkqueue.h: - * gst-libs/gst/vulkan/gstvkutils.c: - * gst-libs/gst/vulkan/gstvkutils.h: - * gst-libs/gst/vulkan/gstvkwindow.c: - * gst-libs/gst/vulkan/gstvkwindow.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan_fwd.h: - vulkan: large docs update - -2019-04-10 14:27:26 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkswapper.h: - * ext/vulkan/vktrash.c: - * ext/vulkan/vktrash.h: - * gst-libs/gst/vulkan/gstvkcommandpool.c: - * gst-libs/gst/vulkan/gstvkcommandpool.h: - * gst-libs/gst/vulkan/gstvkdevice.c: - * gst-libs/gst/vulkan/gstvkdevice.h: - * gst-libs/gst/vulkan/gstvkqueue.c: - * gst-libs/gst/vulkan/gstvkqueue.h: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan.h: - * gst-libs/gst/vulkan/vulkan_fwd.h: - vulkan: add a command pool object for tracking - -2019-04-10 11:56:59 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: don't output duplicate formats - -2019-04-08 21:35:22 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * ext/Makefile.am: - * ext/vulkan/.gitignore: - * ext/vulkan/Makefile.am: - * ext/vulkan/meson.build: - * ext/vulkan/vksink.c: - * ext/vulkan/vksink.h: - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkswapper.h: - * ext/vulkan/vktrash.c: - * ext/vulkan/vktrash.h: - * ext/vulkan/vkupload.h: - * ext/vulkan/vkutils.h: - * ext/vulkan/wayland/Makefile.am: - * ext/vulkan/xcb/Makefile.am: - * gst-libs/gst/meson.build: - * gst-libs/gst/vulkan/.gitignore: - * gst-libs/gst/vulkan/cocoa/gstvkcocoa_utils.h: - * gst-libs/gst/vulkan/cocoa/gstvkdisplay_cocoa.h: - * gst-libs/gst/vulkan/cocoa/gstvkdisplay_cocoa.m: - * gst-libs/gst/vulkan/cocoa/gstvkwindow_cocoa.h: - * gst-libs/gst/vulkan/cocoa/gstvkwindow_cocoa.m: - * gst-libs/gst/vulkan/gstvkapi.h: - * gst-libs/gst/vulkan/gstvkbuffermemory.c: - * gst-libs/gst/vulkan/gstvkbuffermemory.h: - * gst-libs/gst/vulkan/gstvkbufferpool.c: - * gst-libs/gst/vulkan/gstvkbufferpool.h: - * gst-libs/gst/vulkan/gstvkconfig.h.meson: - * gst-libs/gst/vulkan/gstvkdevice.c: - * gst-libs/gst/vulkan/gstvkdevice.h: - * gst-libs/gst/vulkan/gstvkdisplay.c: - * gst-libs/gst/vulkan/gstvkdisplay.h: - * gst-libs/gst/vulkan/gstvkerror.c: - * gst-libs/gst/vulkan/gstvkerror.h: - * gst-libs/gst/vulkan/gstvkfence.c: - * gst-libs/gst/vulkan/gstvkfence.h: - * gst-libs/gst/vulkan/gstvkimagememory.c: - * gst-libs/gst/vulkan/gstvkimagememory.h: - * gst-libs/gst/vulkan/gstvkinstance.c: - * gst-libs/gst/vulkan/gstvkinstance.h: - * gst-libs/gst/vulkan/gstvkmacros.h: - * gst-libs/gst/vulkan/gstvkmemory.c: - * gst-libs/gst/vulkan/gstvkmemory.h: - * gst-libs/gst/vulkan/gstvkqueue.c: - * gst-libs/gst/vulkan/gstvkqueue.h: - * gst-libs/gst/vulkan/gstvkutils.c: - * gst-libs/gst/vulkan/gstvkutils.h: - * gst-libs/gst/vulkan/gstvkwindow.c: - * gst-libs/gst/vulkan/gstvkwindow.h: - * gst-libs/gst/vulkan/ios/gstvkdisplay_ios.h: - * gst-libs/gst/vulkan/ios/gstvkdisplay_ios.m: - * gst-libs/gst/vulkan/ios/gstvkios_utils.h: - * gst-libs/gst/vulkan/ios/gstvkwindow_ios.h: - * gst-libs/gst/vulkan/ios/gstvkwindow_ios.m: - * gst-libs/gst/vulkan/meson.build: - * gst-libs/gst/vulkan/vulkan-prelude.h: - * gst-libs/gst/vulkan/vulkan.h: - * gst-libs/gst/vulkan/vulkan_fwd.h: - * gst-libs/gst/vulkan/wayland/gstvkdisplay_wayland.c: - * gst-libs/gst/vulkan/wayland/gstvkdisplay_wayland.h: - * gst-libs/gst/vulkan/wayland/gstvkwindow_wayland.c: - * gst-libs/gst/vulkan/wayland/gstvkwindow_wayland.h: - * gst-libs/gst/vulkan/wayland/wayland_event_source.c: - * gst-libs/gst/vulkan/wayland/wayland_event_source.h: - * gst-libs/gst/vulkan/xcb/gstvkdisplay_xcb.c: - * gst-libs/gst/vulkan/xcb/gstvkdisplay_xcb.h: - * gst-libs/gst/vulkan/xcb/gstvkwindow_xcb.c: - * gst-libs/gst/vulkan/xcb/gstvkwindow_xcb.h: - * gst-libs/gst/vulkan/xcb/xcb_event_source.c: - * gst-libs/gst/vulkan/xcb/xcb_event_source.h: - * pkgconfig/gstreamer-vulkan-uninstalled.pc.in: - * pkgconfig/gstreamer-vulkan.pc.in: - * pkgconfig/meson.build: - vulkan: make a gstvulkan library out of the existing API - -2019-04-08 18:43:50 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkbufferpool.c: - vkbufferpool: Fix multiplaner allocations - Use the plane width/height and the sizes required by vulkan - Fixes allocation of: - videotestsrc ! video/x-raw,format=I420 ! vulkanupload ! fakesink - -2019-04-08 18:42:12 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkbuffermemory.c: - * ext/vulkan/vkerror.h: - * ext/vulkan/vkimagememory.c: - vk*memory: explicitly error out for driver NPOT alignment - -2019-04-04 19:30:28 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkimagememory.c: - vulkan/image: initialize the requirements struct before using it - -2019-04-04 19:27:55 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkupload.c: - * ext/vulkan/vkupload.h: - * ext/vulkan/vkutils.c: - vulkan: don't require every element to have a display - Only sink elements really care about a valid display - -2019-04-04 18:38:13 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/gstvulkan.c: - * ext/vulkan/vkdisplay.c: - * ext/vulkan/vkdisplay.h: - * ext/vulkan/vkwindow.c: - vulkan: remove unused X11 window system references - We use XCB instead - -2019-04-04 17:33:34 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkutils.c: - * ext/vulkan/vkutils_private.h: - vulkan: remove unused layer enablement - This is possible now via the vulkan loader - -2019-05-20 16:34:55 +0500 Ali Yousuf <aly.yousuf7@gmail.com> - - * ext/webrtc/gstwebrtcice.c: - webrtc: Fix log when adding stun server - -2019-06-04 15:35:24 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: fix the location of signalling-state change notification - 1. The spec indicates that the notification should occur near the end of - 'setting the description' processing - 2. The current location with the drop of the lock could cause the 'check - if negotiation is needed' logic to execute and become confused about - the state of the webrtcbin's current local descriptions. - In the bad case, the following assertions could be hit: - g_assert (trans->mline < gst_sdp_message_medias_len (webrtc->current_local_description->sdp)); - g_assert (trans->mline < gst_sdp_message_medias_len (webrtc->current_remote_description->sdp)); - Moving the signalling state change later in the set description task - means that checking for a renegotiation will early abort as the - signalling state is not STABLE before the session description and - transceivers have been updated. - -2019-06-03 20:29:18 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rtp/Makefile.am: - make: rtp: Remove spurious header file - This header file no longer exist. - -2019-06-03 20:08:23 +0000 Marc Leeman <marc.leeman@gmail.com> - - * configure.ac: - * gst/meson.build: - * gst/rtp/Makefile.am: - * gst/rtp/gstrtp-utils.c: - * gst/rtp/gstrtp-utils.h: - * gst/rtp/gstrtpsink.c: - * gst/rtp/gstrtpsink.h: - * gst/rtp/gstrtpsrc.c: - * gst/rtp/gstrtpsrc.h: - * gst/rtp/meson.build: - * gst/rtp/plugin.c: - * meson_options.txt: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/rtpsink.c: - * tests/check/elements/rtpsrc.c: - * tests/check/meson.build: - rtpmanagerbad: add RTP streaming elements - This is a re-implementation of the RTP elements that are submitted in - 2013 to handle RTP streams. The elements handle a correct connection - for the bi-directional use of the RTCP sockets. - https://bugzilla.gnome.org/show_bug.cgi?id=703111 - The rtpsink and rtpsrc elements add an URI interface so that streams - can be decoded with decodebin using the rtp:// interface. - The code can be used as follows - ``` - gst-launch-1.0 videotestsrc ! x264enc ! rtph264pay config-interval=3 ! rtpsink uri=rtp://239.1.1.1:1234 - gst-launch-1.0 videotestsrc ! x264enc ! rtph264pay config-interval=1 ! rtpsink uri=rtp://239.1.2.3:5000 - gst-launch-1.0 rtpsrc uri=rtp://239.1.2.3:5000?encoding-name=H264 ! rtph264depay ! avdec_h264 ! videoconvert ! xvimagesink - gst-launch-1.0 videotestsrc ! avenc_mpeg4 ! rtpmp4vpay config-interval=1 ! rtpsink uri=rtp://239.1.2.3:5000 - gst-launch-1.0 rtpsrc uri=rtp://239.1.2.3:5000?encoding-name=MP4V-ES ! rtpmp4vdepay ! avdec_mpeg4 ! videoconvert ! xvimagesink - ``` - rtpmanagerbad: add pkg-config - rtpmanagerbad: Rtp should be uppercase - rtpmanagerbad: add G_OS_WIN32 for shielding unix headers - rtpmanagerbad: remove Since from documentation - rtpmanagerbad: rename lib name from nrtp to rtpmanagerbad - rtpmanagerbad: sync meson.build with other modules - rtpmanagerbad: add Makefile.am - rtpmanagerbad: use GstElement to count pads - rtpmanagerbad: use gst_bin_set_suppressed_flags - rtpmanagerbad: check element creation - rtpmanagerbad: post message when trying to access missing rtpbin - rtpmanagerbad: return FALSE with g_return tests - rtpmanagerbad: use gsocket multicast check - rtpmanagerbad: use gst_caps_new_empty_simple iso gst_caps_from_string - rtpmanagerbad: sync with gstrtppayloads.h - rtpmanagerbad: correct media type X-GST - rtpmanagerbad: test if a compatible pad was found - rtpmanagerbad: remove evil copy of GstRTPPayloadInfo - rtpmanagerbad: add gio_dep to meson - rtpmanagerbad: revert to old glib boilerplate - GStreamer 1.16 does not yet support the newer GLib templates, so revert. - rtpmanagerbad: return GST_STATE_CHANGE_NO_PREROLL for live sources - for live sources, NO_PREROLL should be returned for PLAYING->PAUSED and - READY->PAUSED transitions. - rtpmanagerbad: use GstElement pad counting - rtpmanagerbad: just use template name to request pad - rtpmanagerbad: remove commented code - rtpmanagerbad: use funnel to send multiple streams on one socket - rtpmanagerbad: avoid beaches - beaches should only be used during the summer, so rewrite the code to - return explicitly and avoid beaches during the winter. - rtpmanagerbad: add copyright to test code - rtpmanagerbad: g_free is NULL safe - rtpmanagerbad: do not trace rtpbin - rtpmanagerbad: return NULL explitly - rtpmanagerbad: warn when data port is not even - According to RFC 3550, RTP data should be sent on even ports, while RTCP - is sent on the following odd port. - rtpmanagerbad: document port allocation in rtpsink/src - rtpmanagerbad: improve uri description - rtpmanagerbad: add comment re-use socket - rtpmanagerbad: rename gst_object_set_properties_from_uri_query - rtpmanagerbad: loan prop/val setter from rist - rtpmanagerbad: rtpsrc: fix unitialised pointer - rtpmanagerbad: fix silly typo - rtpmanagerbad: test for empty key/value - rtpmanagerbad: rtpsrc: deprecate ssrc collision to INFO - rtpmanagerbad: sync debug with rist - rtpmanagerbad: small strings allocated on stack - rtpmanagerbad: correct rename - rtpmanagerbad: add locking on prop setters/getters - Locking is added because the URI allows to access the properties too. - rtpmanagerbad: allow for RTCP through NAT - rtpmanagerbad: move gio to header file - rtpmanagerbad: free small strings too - rtpmanagerbad: ttl_mc for ttl on dynudpsink - rtpmanagerbad: add comments on the URI registered - rtpmanagerbad: correct macro after file rename - rtpmanagerbad: code style - rtpmanagerbad: handle wrong URIs in setter - rtpmanagerbad: nit URI notation correction - In an URI, the first key/value pair should not have an ampersand, the - parser did not die though. - -2019-05-31 23:06:33 +0200 Niels De Graef <niels.degraef@barco.com> - - * configure.ac: - * meson.build: - meson: Bump minimal GLib version to 2.44 - This means we can use some newer features and get rid of some - boilerplate code using the G_DECLARE_* macros. - As discussed on IRC, 2.44 is old enough by now to start depending on it. - -2018-12-11 14:43:21 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * tests/check/elements/dash_mpd.c: - tests/dash_mpd: take account of Period start in expected timestamps - The start of each segment is relative to the Period start, minus - the presentation time offset. - As specified in section 5.3.9.6 of the MPEG DASH specification: - The value of the @t attribute minus the value of the - @presentationTimeOffset specifies the MPD start time of - the first Segment in the series. - Several tests use a Period@start value of 10 seconds, which either - needs to be taken into account when calculating expected timestamps - or have that attribute removed. - This commit uses a mix of updating the timestamps and removing the - start attribute, so that both the case of its presence and absence - is tested. - -2018-10-16 16:57:30 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: include both Period start and presentationTimeOffset in segment start - The start of each segment is relative to the Period start, minus - the presentation time offset. - As specified in section 5.3.9.6 of the MPEG DASH specification: - The value of the @t attribute minus the value of the - @presentationTimeOffset specifies the MPD start time of - the first Segment in the series. - dashdemux was not taking account of presentationTimeOffset and in - some methods was not taking into account the Period start time. - This commit modifies the segment->start value to always be - relative to the MPD start time (zero for VOD, - availabilityStartTime for live streams). This makes all uses of - the segment list consistent. - Fixes #841 - -2019-06-01 01:42:51 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/libs/audio/index.md: - * docs/libs/audio/sitemap.txt: - * docs/meson.build: - * gst-libs/gst/audio/gstnonstreamaudiodecoder.c: - docs: document gstreamer-bad-audio - And unprefix subproject paths, making a special case for - webrtc, to not conflict with the webrtc plugin - -2019-06-01 01:42:06 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/audio/meson.build: - libs: build a gir file for gstreamer-bad-audio - -2018-10-02 11:25:14 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gstavwait.c: - avwait: Don't print warnings for every buffer passed - -2019-05-31 14:09:40 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdksystemmemory.c: - msdk: return a right pointer for VUYA format - The first channel in memory is V for VUYA format, note - GST_VIDEO_FORMAT_VUYA is mapped to MFX_FOURCC_AYUV in this plugin - -2019-05-29 17:05:34 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - docs: update plugin doc cache and add more plugins - -2019-05-29 11:28:00 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/bs2b/meson.build: - * ext/closedcaption/meson.build: - * ext/colormanagement/meson.build: - * ext/dc1394/meson.build: - * ext/gme/meson.build: - * ext/ladspa/meson.build: - * ext/lv2/meson.build: - * ext/modplug/meson.build: - * ext/musepack/meson.build: - * ext/neon/meson.build: - * ext/ofa/meson.build: - * ext/openal/meson.build: - * ext/openexr/meson.build: - * ext/openmpt/meson.build: - * ext/openni2/meson.build: - * ext/sctp/meson.build: - * ext/sndfile/meson.build: - * ext/srt/meson.build: - * ext/teletextdec/meson.build: - * ext/voamrwbenc/meson.build: - * ext/wildmidi/meson.build: - * ext/wpe/meson.build: - * gst/audiolatency/meson.build: - * sys/androidmedia/meson.build: - * sys/applemedia/meson.build: - * sys/opensles/meson.build: - * sys/tinyalsa/meson.build: - * sys/vdpau/meson.build: - meson: add more plugins to plugins list - Makes sure their path gets added to the uninstalled environment - and makes sure they get included in the docs. - -2019-05-22 21:44:44 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - basetsmux: don't reset pad on flush_stop - This was mistakenly added when porting to aggregator, this - restores the old behaviour, by only resetting them when the - muxer itself is reset - -2019-05-22 21:44:22 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegtssection: events don't necessarily have a structure - -2019-05-22 21:44:02 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - basetsmux: fix send_event by chaining up - -2019-05-29 18:27:09 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/meson.build: - * gst/mpegtsmux/gstmpegtsmux.c: - mpegtsmux: add SECTION comment - We include an example for injecting sections in the transport - stream in the documentation - -2019-05-29 17:03:59 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * tests/examples/mpegts/meson.build: - * tests/examples/mpegts/ts-section-writer.c: - tests: add example for injecting MPEG-TS sections - -2019-05-29 17:01:40 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - basetsmux: preserve user-specified sections across resets - As sections can be provided by the user through send_event - when the element state is NULL, their lifetime is expected - to match that of the muxer, and they must be preserved when - the state changes - -2019-05-23 01:44:19 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstatscmux.c: - atscmux: send empty RRT / MGT / STT tables - These are mandated by A/65, their absence gets flagged by - stream analyzers. Users can of course provide filled up - versions through the send_event API. - -2019-05-23 00:03:18 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - tsmux: maintain packet counters in a global array - We can have multiple TsMuxPacketInfo objects for the same PID - with user-provided sections, for example ATSC requires multiple - tables with the same PID. - -2019-05-21 02:53:20 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - mpegts: extend support for ATSC tables - Adds constructors for the following sections: - STT: System Time Table - MGT: Master Guide Table - RRT: Rating Region Table - Also adds parsing code for RRT - -2019-05-25 00:02:05 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: only set sctp ports if they are different - SCTPassociation will complain if we do that while running and resetting - is not something we support at the moment - -2019-03-08 00:39:59 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: wait until the SDP has been set before continuing - If we renegotiate, then it is currently possible for an added stream to - be added to webrtcbin before the SDP is complete. This causes an - internal inconsistency as there is a 'pending sink transceiver' without - a corresponding media section in the sdp. It also does not have an - associated transport stream and will fail in _connect_input_stream(). - -2019-03-08 00:37:39 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/webrtcdatachannel.h: - * tests/check/elements/webrtcbin.c: - tests/webrtc: fix racy test with a prenegotiated data channel - If both data channels become ready simultaneously, then the two integer - read-add-update cycles can execute concurrently and only ever increment - once instead of the required twice. Use an atomic add instead. - -2019-03-08 00:32:53 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/webrtcdatachannel.c: - webrtc/dc: move some code from webrtcbin into the datachannel - -2019-03-04 21:44:33 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: hold onto any unknown ICE candidates until the next SDP set - It is very possible for badly behaving signalling or peers to send - us ICE candidates before we receive an SDP. While we had consideration - for that on the first set SDP, subsequent SDP's could result in - misconfigured ICE transports. Expand the previous code to also take - into account reconfigurations. - -2018-11-28 17:23:31 +1100 Matthew Waters <matthew@centricular.com> - - * .gitignore: - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/transportstream.c: - * ext/webrtc/transportstream.h: - * ext/webrtc/utils.c: - * ext/webrtc/utils.h: - * ext/webrtc/webrtcsdp.c: - * ext/webrtc/webrtcsdp.h: - * ext/webrtc/webrtctransceiver.c: - * ext/webrtc/webrtctransceiver.h: - * gst-libs/gst/webrtc/rtptransceiver.c: - * tests/check/elements/webrtcbin.c: - * tests/examples/webrtc/Makefile.am: - * tests/examples/webrtc/meson.build: - * tests/examples/webrtc/webrtcrenego.c: - webrtc: Initial support for stream addition/removal - Limitations: - - No transport changes at all (ICE, DTLS) - - Codec changes are untested and probably don't work - - Stream removal doesn't remove transports (i.e. non-bundled transports - will stay around until webrtcbin is shutdown) - - Unified Plan SDP only. No Plan-B support. - -2018-12-05 18:36:27 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: a couple of debug/error string fixes - -2018-12-04 22:49:05 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: rewrite bundle checks for separate validate_sdp passes - Improves reusability - -2018-12-04 20:38:19 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: add helper for getting the offer/answer element - -2018-12-04 20:32:56 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: only check audio/video for direction attributes - -2018-12-06 23:28:18 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: expose the transceiver as a pad property - -2018-12-06 23:25:54 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/webrtctransceiver.c: - * gst-libs/gst/webrtc/rtptransceiver.c: - * gst-libs/gst/webrtc/rtptransceiver.h: - webrtc/transceiver: add a set_direction function - Matches the setDirection() from the W3C spec and allows changing the - transceiver direction at the next negotiation cycle. - -2018-12-05 19:17:45 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: track and log more rtpbin state - like bye's timeouts, validation, activation, etc - -2018-12-06 16:59:52 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/webrtcsdp.c: - webrtc: add support for intersecting inactive transceiver directions - -2018-12-04 20:30:49 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: mark remote/local-description as readonly - -2018-11-27 19:27:27 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: don't reuse stopped transceivers at all - -2018-11-27 19:25:51 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: also check for a null mid to signify an unassociated transceiver - We always give our transceivers an mline on creation so that check is - not useful by itself - -2018-11-27 19:24:40 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: only check sink pads for a 'sink pads have caps' check - -2018-11-26 22:10:57 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * tests/check/elements/webrtcbin.c: - webrtc: fix answer creation with multiple streams and similar caps - -2018-11-26 20:41:29 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: factor out sdp validation into a single function - -2018-11-26 19:54:18 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: validate number of sdp media using validate_sdp - -2018-11-26 19:48:31 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: allow multiple validation functions - -2018-11-26 19:19:04 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: test that duplicate negotiations succeed - -2019-05-28 16:58:20 +0100 Philippe Normand <philn@igalia.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Expose current and pending local/remote description properties - They are already handled in the property getter and setter functions but were - not formally declared in the GObject class. - -2019-05-29 22:58:08 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/aom/gstav1dec.c: - * ext/aom/gstav1enc.c: - * ext/closedcaption/sliced.h: - * ext/colormanagement/gstlcms.c: - * ext/curl/gstcurlhttpsrc.c: - * ext/modplug/gstmodplug.cc: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mplex/gstmplex.cc: - * ext/opencv/gstcameracalibrate.cpp: - * ext/opencv/gstcameraundistort.cpp: - * ext/opencv/gstcvdilate.cpp: - * ext/opencv/gstcvequalizehist.cpp: - * ext/opencv/gstcverode.cpp: - * ext/opencv/gstcvlaplace.cpp: - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstcvsobel.cpp: - * ext/opencv/gstdewarp.cpp: - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstedgedetect.cpp: - * ext/opencv/gstfaceblur.cpp: - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gstgrabcut.cpp: - * ext/opencv/gsthanddetect.cpp: - * ext/opencv/gstmotioncells.cpp: - * ext/opencv/gstretinex.cpp: - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstskindetect.cpp: - * ext/opencv/gsttemplatematch.cpp: - * ext/opencv/gsttextoverlay.cpp: - * ext/openmpt/gstopenmptdec.c: - * ext/openni2/gstopenni2.cpp: - * ext/openni2/gstopenni2src.cpp: - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsrc.c: - * ext/wildmidi/gstwildmididec.c: - * gst-libs/gst/audio/gstnonstreamaudiodecoder.c: - * gst-libs/gst/audio/gstnonstreamaudiodecoder.h: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - * gst/faceoverlay/gstfaceoverlay.c: - * gst/festival/gstfestival.c: - * sys/applemedia/avfassetsrc.m: - * sys/applemedia/iosassetsrc.m: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.c: - doc: remove xml from comments - -2019-05-29 18:33:02 +0000 Adam Duskett <aduskett@gmail.com> - - * ext/hls/meson.build: - ext/hls/meson.build: fix dependency logic - Currently, if one was to set -Dhls-crypto to either libgcrypt or openssl - instead of auto, the following lines would fail because hls_crypto_dep is not - yet set: - if not hls_crypto_dep.found() and 'auto', 'libgcrypt'.contains(hls_crypto) - if not hls_crypto_dep.found() and 'auto', 'openssl'.contains(hls_crypto) - Instead, change "if not hls_crypto_dep.found()" to "if not have_hls_crypto" - which fixes the error. - -2019-05-29 12:48:06 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - docs: remove stale plugins from docs plugin cache - gtk plugin has moved to -good, schroedinger has been removed. - -2019-05-23 20:24:40 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/wlwindow.c: - waylandsink: Workaround gnome-shell bug - Use a timeout to limit that amount of time we wait after the compositor - for the initial configure event. Compositor are support to emit a - configure event before any wl_buffer can be attached. The problem is - that Weston strongly enforce this, while gnome-shell simply does not - emit such an event. - -2019-05-26 12:13:48 +0200 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsallocator.c: - * sys/kms/gstkmssink.c: - kmssink: Fixup all errno tracing - All DRM ioctl uses errno to report the error and simply returns -1 - when some error occured. This patch fixes all usage of the return - value instead of errno to trace the error type and moves to g_strerror - instead of string.h strerror in order to be consistent with the rest - of GStreamer. - -2019-05-25 19:48:25 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * docs/plugins/gst_plugins_cache.json: - doc: update plugin cache - -2019-05-25 17:35:26 +0200 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - docs: Updated plugins cache file - This was done so that the duplicated rist element would go way. - -2019-05-25 16:57:57 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/autoconvert/gstautoconvert.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/videosignal/gstsimplevideomark.c: - doc: fix element section documentations - Element sections were not rendered anymore after the hotdoc - port, fixing this revealed a few incorrect links. - -2014-11-15 22:58:49 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstvp8parser.c: - codecparsers: fix debug category initialisation - Make thread-safe. - -2019-05-20 16:15:08 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - avwait: Protect properties and some other code with the mutex - These variables are all accessed from multiple threads. - Also fix some minor leaks in error code paths. - -2019-05-20 15:45:50 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - avwait: Insert some empty lines to give the code some space to breath - -2019-05-20 15:30:28 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gstavwait.c: - avwait: Allow setting start timecode after end timecode and the other way around - This might be necessary temporarily for changing the previous settings. - Make it an actual error if the settings are like this while processing a - buffer. - -2018-10-18 13:35:04 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/wayland/wlbuffer.c: - wayland/wlbuffer: just return if used_by_compositor is true when attach - When buffer is used by compositor, we don't need attach it and hold one - more reference. Just check used_by_compositor, just return if it is true. - Assert error log is not need, this is normal behavior. - -2019-05-21 16:17:40 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/proxy/gstproxysink.c: - * gst/proxy/gstproxysrc.c: - proxy: Forward queries/events sent directly to the element correctly - -2019-05-21 16:03:21 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/proxy/gstproxysink.c: - * gst/proxy/gstproxysrc.c: - proxy: Set SOURCE flag on the source and SINK flag on the sink - So that they are properly recognized as such. - -2019-05-22 12:25:38 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * gst/ivfparse/gstivfparse.c: - ivfparse: Check the data size against IVF_FRAME_HEADER_SIZE - It is parsing frame data and so should check the data size against the - frame header size instead of the file header size. If don't, it is - possible to drop the last frame because IVF_FILE_HEADER_SIZE is greater - than IVF_FRAME_HEADER_SIZE - -2019-05-14 17:04:41 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/gst_plugins_cache.json: - doc: Add rist plugin to hotdoc - -2019-05-07 15:58:04 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rist/Makefile.am: - * gst/rist/gstristplugin.c: - * gst/rist/gstristsink.c: - * gst/rist/gstroundrobin.c: - * gst/rist/gstroundrobin.h: - * gst/rist/meson.build: - rist: Add combined bonding-method support - This patchs add support for configuring the bonding method used. There is - two method specified - - redundant: All the RTP packets are replicated - - combined: RTP packet are evenly distributed over each links - Additionally, an application can set the "dispatcher" property in order - to implement custom dispatching method. Whenever the "dispatcher" - property is set, "bonding-method" property will be ignored. - -2019-05-07 11:32:00 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rist/gstristsrc.c: - ristsrc: Implement per session stats - As we can now have multiple sessions, stats need to be implemented per - session. This follow RTPSession model with sources. The stats are now: - dropped: 0 - received: 0 - recovered: 0 - permanently-lost: 0 - duplicates: 0 - retransmission-requests-sent: 0 - rtx-roundtrip-time: 0 - session-stats: - session-id=0 - rtp-from="" - rtcp-from="" - dropped=0 - received=0 - session-id=1 - rtp-from="" - rtcp-from="" - dropped=0 - received=0 - . . . - session-stats is a GValueArray as there is no better alternatives. - -2019-05-03 22:28:56 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rist/gstristsrc.c: - ristsrc: Cleanup unused include - -2019-05-03 17:44:14 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rist/gstristsink.c: - ristsink: Implement per session stats - As we can now have multiple sessions, stats need to be implemented per - session. This follow RTPSession model with sources. The stats are now: - sent-original-packets: 0 - sent-retransmitted-packets: 0 - session-stats: - session-id=0 - sent-original-packets=0 - sent-retransmitted-packets=0 - round-trip-time=0 - session-id=1 - sent-original-packets=0 - sent-retransmitted-packets=0 - round-trip-time=0 - . . . - session-stats is a GValueArray as there is no better alternatives. - -2019-05-03 16:52:02 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rist/gstristsrc.c: - ristsrc: rtxbin may be null in finalize - -2019-02-28 17:21:25 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rist/gstristsrc.c: - ristsrc: Add bonding support - This add support for receiving and aggregating the same stream - over multiple addresses. - -2019-02-15 17:13:02 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rist/gstristsink.c: - ristsink: Implement bonding support - -2019-05-21 18:49:02 +0000 Marc Leeman <marc.leeman@gmail.com> - - * gst/rist/gstristsink.c: - * gst/rist/gstristsrc.c: - rist: spell and grammar corrects in top comments - -2019-05-20 10:26:14 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/rist/gstristsink.c: - * gst/rist/gstristsrc.c: - docs: Update cache and mark some rist prop as 'show-default' - -2019-05-20 10:16:02 -0400 Thibault Saunier <tsaunier@igalia.com> - - * gst/proxy/meson.build: - doc: Add proxysink/proxysrc - -2019-05-21 12:15:55 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/webrtc_fwd.h: - webrtc: Add various Since markers to new types after 1.14.0 - -2019-05-20 19:33:27 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/mpegtsmux/gstmpegtsmux.c: - mpegtsmux: Fix build warning error - gstmpegtsmux.c:291:3: error: implicit declaration of function ‘memmove’ -Werror=implicit-function-declaration - memmove (map.data + 4, map.data, map.size - 4); - ^ - gstmpegtsmux.c:291:3: error: incompatible implicit declaration of built-in function ‘memmove’ -Werror - gstmpegtsmux.c:291:3: note: include ‘<string.h>’ or provide a declaration of ‘memmove’ - -2019-05-17 01:21:53 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - basetsmux: improve bitrate property documentation - -2019-05-15 01:35:04 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - tsmux: refactor logic for when to (re)transmit tables - In order to output them at regular intervals in the bitstream - when a bitrate is specified. - -2019-05-15 01:34:51 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstbasetsmux.c: - basetsmux: fix PCR stream selection - -2019-05-10 01:33:17 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsmux/Makefile.am: - Fix compile after aggregator rewrite and base class refactor - -2019-05-08 16:56:29 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - tsmux: fix continuity counter for packets with no payload - -2019-05-01 01:09:19 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstatscmux.c: - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/gstbasetsmux.h: - * gst/mpegtsmux/gstbasetsmuxaac.c: - * gst/mpegtsmux/gstbasetsmuxaac.h: - * gst/mpegtsmux/gstbasetsmuxjpeg2000.c: - * gst/mpegtsmux/gstbasetsmuxjpeg2000.h: - * gst/mpegtsmux/gstbasetsmuxopus.c: - * gst/mpegtsmux/gstbasetsmuxopus.h: - * gst/mpegtsmux/gstbasetsmuxttxt.c: - * gst/mpegtsmux/gstbasetsmuxttxt.h: - * gst/mpegtsmux/gstmpegtsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * tests/check/elements/mpegtsmux.c: - mpegtsmux: aggregator port - -2019-04-30 01:42:59 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/gstatscmux.c: - * gst/mpegtsmux/gstatscmux.h: - * gst/mpegtsmux/gstbasetsmux.c: - * gst/mpegtsmux/gstbasetsmux.h: - * gst/mpegtsmux/gstbasetsmuxaac.c: - * gst/mpegtsmux/gstbasetsmuxaac.h: - * gst/mpegtsmux/gstbasetsmuxjpeg2000.c: - * gst/mpegtsmux/gstbasetsmuxjpeg2000.h: - * gst/mpegtsmux/gstbasetsmuxopus.c: - * gst/mpegtsmux/gstbasetsmuxopus.h: - * gst/mpegtsmux/gstbasetsmuxttxt.c: - * gst/mpegtsmux/gstbasetsmuxttxt.h: - * gst/mpegtsmux/gstmpegtsmux.c: - * gst/mpegtsmux/gstmpegtsmux.h: - * gst/mpegtsmux/gstmpegtsmuxplugin.c: - * gst/mpegtsmux/meson.build: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: spring cleanup, no functional change - -2019-04-30 00:50:06 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/basetsmux.c: - * gst/mpegtsmux/basetsmux.h: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - basetsmux: extract m2ts-mode to mpegtsmux - -2019-04-26 20:26:55 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/atscmux.c: - * gst/mpegtsmux/atscmux.h: - * gst/mpegtsmux/basetsmux.c: - * gst/mpegtsmux/basetsmux.h: - * gst/mpegtsmux/basetsmux_aac.c: - * gst/mpegtsmux/basetsmux_aac.h: - * gst/mpegtsmux/basetsmux_jpeg2000.c: - * gst/mpegtsmux/basetsmux_jpeg2000.h: - * gst/mpegtsmux/basetsmux_opus.c: - * gst/mpegtsmux/basetsmux_opus.h: - * gst/mpegtsmux/basetsmux_ttxt.c: - * gst/mpegtsmux/basetsmux_ttxt.h: - * gst/mpegtsmux/meson.build: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: extract an actual base class - -2019-04-26 00:01:31 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/atscmux.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - mpegtsmux: expose the vmethods necessary for ATSC E-AC-3 handling - -2019-04-25 20:23:03 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/atscmux.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - mpegtsmux: provide API for subclasses to override stream creation - -2019-04-25 18:26:27 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/atscmux.c: - * gst/mpegtsmux/atscmux.h: - * gst/mpegtsmux/meson.build: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmuxplugin.c: - mpegtsmux: add an ATSC subclass - -2019-04-22 22:50:07 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - tsmux: Calculate PCR from number of bytes written in CBR mode - -2019-04-22 22:11:29 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - mpegtsmux: Expose bitrate property - This allows outputting a Transport Stream with a constant bitrate, - by inserting null packets. - -2019-04-22 22:10:42 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - tsmux: actually respect the PCR frequency we target - -2019-04-22 18:23:39 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - tsmux: Use DTS over PTS - -2019-05-18 12:09:18 +0100 Philippe Normand <philn@igalia.com> - - * ext/aom/meson.build: - meson: Keep track of the aom plugin - Otherwise it doesn't appear in the GstPluginsPath.json and thus is not listed in - gst-build's uninstalled shell's $GST_PLUGIN_PATH. - -2019-05-16 13:08:19 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * docs/plugins/gst_plugins_cache.json: - docs: Update plugins cache for nvdec/nvenc - -2019-05-15 11:25:37 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvdec/meson.build: - * sys/nvenc/meson.build: - meson: Add nvenc and nvdec to plugin list when available - -2019-05-17 17:15:13 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rist/gstristsink.c: - * gst/rist/gstristsrc.c: - rist: Fix typo - -2019-05-17 15:28:54 +0200 Niels De Graef <niels.degraef@barco.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: Fix some signals' GIR annotations - This will lead to wrong bindings otherwise (and creates more correct - expectations for developers). - -2019-05-16 15:35:58 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - docs: Add infos about windows specific plugins - -2019-05-16 09:18:53 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/meson.build: - * docs/plugins/gst_plugins_cache.json: - docs: Stop building the doc cache by default - And update the cache - Fixes https://gitlab.freedesktop.org/gstreamer/gst-docs/issues/36 - -2019-05-15 16:18:01 -0400 Thibault Saunier <tsaunier@igalia.com> - - * gst/rist/meson.build: - docs: Add gstrist to the documentation - -2019-04-26 08:40:28 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdk.c: - msdk: fix the typo for gst_msdkvp9dec_debug - -2019-05-14 19:19:46 +0100 Tim-Philipp Müller <tim@centricular.com> - - * autogen.sh: - * configure.ac: - configure: fix autotools build after gtk-doc removal - Were using a gtk-doc specific file to check if we can - find the srcdir, so configure would fail. - -2019-05-14 10:45:21 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - * gst/frei0r/gstfrei0r.c: - docs: Make sure frei0r plugins properties default are stable - frei0r returns 'random' values as default and it makes the cache - often change for no good reason - -2019-05-14 10:28:17 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - docs: Remove stereo and openglmixer from the cache - Thus were moved, respectively, to -good and -base - -2019-05-14 07:36:15 +0000 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/dtls/gstdtlsagent.c: - dtlsagent: Do not overwrite openssl locking callbacks - -2019-05-13 22:56:47 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst_plugins_cache.json: - docs: Update plugins documentation cache - -2018-10-22 11:30:45 +0200 Thibault Saunier <tsaunier@igalia.com> - - * .gitignore: - * Makefile.am: - * configure.ac: - * docs/Makefile.am: - * docs/gst_api_version.in: - * docs/index.md: - * docs/libs/.gitignore: - * docs/libs/Makefile.am: - * docs/libs/adaptivedemux/index.md: - * docs/libs/adaptivedemux/sitemap.txt: - * docs/libs/base/index.md: - * docs/libs/base/sitemap.txt: - * docs/libs/codecparsers/index.md: - * docs/libs/codecparsers/sitemap.txt: - * docs/libs/compiling.sgml: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs.types: - * docs/libs/insertbin/index.md: - * docs/libs/insertbin/sitemap.txt: - * docs/libs/mpegts/index.md: - * docs/libs/mpegts/sitemap.txt: - * docs/libs/player/index.md: - * docs/libs/player/sitemap.txt: - * docs/libs/tools/index.md: - * docs/libs/tools/sitemap.txt: - * docs/libs/video/index.md: - * docs/libs/video/sitemap.txt: - * docs/libs/webrtc/index.md: - * docs/libs/webrtc/sitemap.txt: - * docs/meson.build: - * docs/plugins/.gitignore: - * docs/plugins/Makefile.am: - * docs/plugins/camerabin.dot: - * docs/plugins/camerabin.png: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-overrides.txt: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/gst-plugins-bad-plugins.types: - * docs/plugins/gst_plugins_cache.json: - * docs/plugins/index.md: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiobuffersplit.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiolatency.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-closedcaption.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ipcpipeline.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-openmpt.xml: - * docs/plugins/inspect/plugin-openni2.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-proxy.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srt.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-wasapi.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-webrtcdsp.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * docs/plugins/sitemap.txt: - * docs/sitemap.txt: - * docs/version.entities.in: - * ext/assrender/meson.build: - * ext/bz2/meson.build: - * ext/chromaprint/meson.build: - * ext/curl/meson.build: - * ext/dash/meson.build: - * ext/directfb/meson.build: - * ext/dtls/meson.build: - * ext/dts/meson.build: - * ext/faac/meson.build: - * ext/faad/meson.build: - * ext/fdkaac/meson.build: - * ext/flite/meson.build: - * ext/fluidsynth/meson.build: - * ext/gsm/meson.build: - * ext/hls/meson.build: - * ext/iqa/meson.build: - * ext/kate/meson.build: - * ext/libde265/meson.build: - * ext/libmms/meson.build: - * ext/mpeg2enc/meson.build: - * ext/mplex/meson.build: - * ext/opencv/meson.build: - * ext/openh264/meson.build: - * ext/openjpeg/meson.build: - * ext/opus/meson.build: - * ext/resindvd/meson.build: - * ext/rsvg/meson.build: - * ext/rtmp/meson.build: - * ext/sbc/meson.build: - * ext/smoothstreaming/meson.build: - * ext/soundtouch/meson.build: - * ext/spandsp/meson.build: - * ext/srtp/meson.build: - * ext/ttml/meson.build: - * ext/voaacenc/meson.build: - * ext/vulkan/meson.build: - * ext/wayland/meson.build: - * ext/webp/meson.build: - * ext/webrtc/meson.build: - * ext/webrtcdsp/meson.build: - * ext/x265/meson.build: - * ext/zbar/meson.build: - * gst-libs/gst/adaptivedemux/meson.build: - * gst-libs/gst/codecparsers/meson.build: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/player/gstplayer.c: - * gst/accurip/meson.build: - * gst/adpcmdec/meson.build: - * gst/adpcmenc/meson.build: - * gst/aiff/meson.build: - * gst/asfmux/meson.build: - * gst/audiobuffersplit/meson.build: - * gst/audiofxbad/meson.build: - * gst/audiomixmatrix/meson.build: - * gst/audiovisualizers/meson.build: - * gst/autoconvert/meson.build: - * gst/bayer/meson.build: - * gst/camerabin2/meson.build: - * gst/coloreffects/meson.build: - * gst/debugutils/meson.build: - * gst/dvbsuboverlay/meson.build: - * gst/dvdspu/meson.build: - * gst/faceoverlay/meson.build: - * gst/festival/meson.build: - * gst/fieldanalysis/meson.build: - * gst/freeverb/meson.build: - * gst/frei0r/meson.build: - * gst/gaudieffects/meson.build: - * gst/gdp/meson.build: - * gst/geometrictransform/meson.build: - * gst/id3tag/meson.build: - * gst/inter/meson.build: - * gst/interlace/meson.build: - * gst/ivfparse/meson.build: - * gst/ivtc/meson.build: - * gst/jp2kdecimator/meson.build: - * gst/jpegformat/meson.build: - * gst/librfb/meson.build: - * gst/midi/meson.build: - * gst/mpegdemux/meson.build: - * gst/mpegpsmux/meson.build: - * gst/mpegtsdemux/meson.build: - * gst/mpegtsmux/meson.build: - * gst/mxf/meson.build: - * gst/netsim/meson.build: - * gst/onvif/meson.build: - * gst/pcapparse/meson.build: - * gst/pnm/meson.build: - * gst/rawparse/meson.build: - * gst/removesilence/meson.build: - * gst/sdp/meson.build: - * gst/segmentclip/meson.build: - * gst/siren/meson.build: - * gst/smooth/meson.build: - * gst/speed/meson.build: - * gst/subenc/meson.build: - * gst/timecode/meson.build: - * gst/videofilters/meson.build: - * gst/videoframe_audiolevel/meson.build: - * gst/videoparsers/meson.build: - * gst/videosignal/meson.build: - * gst/vmnc/meson.build: - * gst/y4m/meson.build: - * gst/yadif/meson.build: - * meson.build: - * meson_options.txt: - * sys/bluez/meson.build: - * sys/d3dvideosink/meson.build: - * sys/decklink/meson.build: - * sys/directsound/meson.build: - * sys/dvb/meson.build: - * sys/fbdev/meson.build: - * sys/ipcpipeline/meson.build: - * sys/kms/meson.build: - * sys/msdk/meson.build: - * sys/shm/meson.build: - * sys/uvch264/meson.build: - * sys/wasapi/meson.build: - * sys/winks/meson.build: - * sys/winscreencap/meson.build: - docs: Build documentation with hotdoc - -2018-11-12 18:24:20 -0300 Thibault Saunier <tsaunier@igalia.com> - - * ext/curl/gstcurlhttpsrc.c: - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlssrtpdec.c: - Mark some properties as DOC_SHOW_DEFAULT - -2018-08-10 20:32:30 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/closedcaption/io-sim.c: - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlfilesink.c: - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlhttpsink.c: - * ext/curl/gstcurlsftpsink.c: - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/gstcurlsshsink.c: - * ext/curl/gstcurltlssink.c: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcice.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/nalutils.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.c: - * gst-libs/gst/player/gstplayer-media-info.c: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/webrtc/dtlstransport.h: - * gst-libs/gst/webrtc/icetransport.h: - * gst-libs/gst/webrtc/rtpreceiver.h: - * gst-libs/gst/webrtc/rtpsender.h: - * gst-libs/gst/webrtc/rtptransceiver.h: - * gst-libs/gst/webrtc/webrtc_fwd.h: - * gst/geometrictransform/geometricmath.c: - * sys/shm/shmpipe.c: - Minor documentation fixes - -2018-10-22 11:30:09 +0200 Thibault Saunier <tsaunier@igalia.com> - - * ext/directfb/dfbvideosink.c: - directfb: Fixup plugin name to match plugin filename - Has required by the new PLUGIN_DEFINE macro - -2019-05-01 19:40:03 +0200 Niklas Hambüchen <mail@nh2.me> - - * ext/gsm/meson.build: - meson: Fix missing GSM_HEADER_IN_SUBDIR logic - Until now, this hadn't been translated from autoconf yet. - -2019-05-01 19:16:58 +0200 Niklas Hambüchen <mail@nh2.me> - - * ext/gsm/meson.build: - meson: Fix typo in gsm header file name - This was wrong since commit c360ceea4deb5d56c94126e31b9614734e8c1a7e. - Also fix incorrect indentation (tab instead of spaces). - Found using hermetic builds with Nix: - https://github.com/NixOS/nixpkgs/pull/54398#discussion_r280125735 - -2019-05-01 19:22:17 +0200 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsrc.c: - srt: set cancellation in locked section - ... to avoid race with wait which uses it with 'flushing' flag state semantics. - -2019-05-01 19:01:03 +0200 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - srt: avoid srtsrc segfault upon downward state change - ... when it has not yet been connected to. - Also, a condition variable is not a semaphore, so a lock/wait/unlock - sequence is inherently racy without any state checking. So switch to - a different lock and check the intended state. - -2019-05-01 18:58:30 +0200 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * ext/srt/gstsrtobject.c: - srt: initialize list access within locked region - -2019-05-09 14:08:31 +0200 Niels De Graef <niels.degraef@barco.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: Fix signals documentation - Some GIR annotations were incorrect or even missing. The former isn't - good for bindings, while the latter is especially annoying for signal - handlers, as that means your arguments will get the wrong names in the - rendered documentation. - -2019-05-09 15:11:17 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: Respect display aspect ratio and set to encoding parameter - It should be written in VUI parameter for proper rendering - -2019-05-08 15:46:26 +0200 Niels De Graef <niels.degraef@barco.com> - - * gst-libs/gst/webrtc/dtlstransport.h: - * gst-libs/gst/webrtc/icetransport.h: - * gst-libs/gst/webrtc/rtcsessiondescription.h: - * gst-libs/gst/webrtc/rtpreceiver.h: - * gst-libs/gst/webrtc/rtpsender.h: - * gst-libs/gst/webrtc/rtptransceiver.h: - webrtc: Add g_autoptr() support for public types - -2019-05-08 13:35:25 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Fix compilation with openh264 v2.0 - As OpenH264 increased its version to 2.0 the guard for structure - member is not valid. - This patch will fix the compilation with gst-build and openh264. - -2019-05-08 19:26:03 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/meson.build: - * sys/nvenc/meson.build: - meson: Allow CUDA_PATH fallback on linux - That's what we've supported via autotools build - Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/966 - -2019-05-04 20:56:38 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvenc/gstnvbaseenc.c: - * sys/nvenc/gstnvh264enc.c: - nvh264enc: Fix broken Y444 format encoding with system memory Y444 support - separateColourPlaneFlag is mapped to separate_colour_plane_flag which - means Y, U and V planes are separately processed as monochrome sampled pictures. - So encoder shouldn't set that flag for normal 4:4:4 encoding. - Also for 4:4:4 encoding, NV_ENC_H264_PROFILE_HIGH_444_GUID profile must be - explicitly set. - -2019-05-05 22:11:16 +0200 Christoph Reiter <reiter.christoph@gmail.com> - - * gst-libs/gst/opencv/meson.build: - meson: fix build with opencv=enabled and opencv4. Fixes #964 - Having the opencv feature enabled would lead to the opencv3 dependency - being required which failed with only opencv4 being available. - Instead don't require anything and error out at the end if the feature was enabled - but no dependency was found. - -2019-05-05 19:27:15 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/colormanagement/meson.build: - * ext/meson.build: - * meson_options.txt: - meson: Add support for the colormanagement plugin - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/965 - -2019-05-05 12:34:23 +0200 Christoph Reiter <reiter.christoph@gmail.com> - - * gst-libs/gst/sctp/Makefile.am: - autotools: gstsctp: set LDFLAGS - This fixes the mingw build which failed because of "-no-undefined" missing. - -2019-05-04 00:15:32 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink: Add support for parsing/outputting AFD/Bar - -2019-04-22 15:42:12 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Allow VANC to be used for all modes - -2019-04-16 13:15:40 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - decklink: Add support for widescreen NTSC/PAL - Same as non-widescreen but with a different pixel-aspect-ratio. - -2019-05-01 21:24:49 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: Parse mastering display info and content light level from SEI - ... and set to caps if necessary. - Note 1) the mastering display info and content light level SEI meessages - are persistent in the corresponding codec video sequence (i.e., GOP). - So any bitstream containing those SEI messages - (and also all pictures are intended to be HDR rendered) should be ensured that - each first slice of codec video sequence follows those SEI messages. - Note 2) The codec video sequence is a group an IRAP + NoRaslOutputFlag == 1 - and following AUs which are not IRAP + NoRaslOutputFlag == 1 - The NoRaslOutputFlag is equal to 1 for each IDR AU, BLA AU and some CRA AU. - For a CRA AU to have NoRaslOutputFlag equal to 1, following condition should required. - * When the CRA AU is the first AU in the bitstream in decoding order - * or the CRA AU is the first AU that follows an end of sequence NAL in decoding order - * or the HandleCraAsBlaFlag equal to 1. - Due to the limited context in parse element, in this commint, CRA AU will not considered as - having the NoRaslOutputFlag equal to 1. Therefore, in the worst case, - mastering-display-info and content-light-level could be cleared one GOP after - when stream was chagned from HDR to SDR. - -2019-04-26 20:11:12 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - h265parser: Add parsing mastering display colour volume SEI message - ... and content light level SEI message. Those SEI messages are required - for HDR rendering. - -2019-05-03 19:10:22 +0700 Roman Shpuntov <roman.shpuntov@gmail.com> - - * sys/androidmedia/gstamc.c: - androidmedia: added path /system/vendor/etc to dependency - -2019-05-02 14:29:03 +0200 Niels De Graef <niels.degraef@barco.com> - - * sys/nvdec/Makefile.am: - * sys/nvenc/Makefile.am: - nvenc/nvdec: Add NVIDIA SDK headers to noinst_HEADERS - The tarballs that were being spun for 1.16 don't contain these headers - due to this small oversight, so let's add them. - -2019-04-05 17:01:08 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-rist.xml: - rist: Enable plugin doc creation - -2019-01-21 11:44:10 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - * gst/meson.build: - * gst/rist/Makefile.am: - * gst/rist/gstrist.h: - * gst/rist/gstristplugin.c: - * gst/rist/gstristrtxreceive.c: - * gst/rist/gstristrtxsend.c: - * gst/rist/gstristsink.c: - * gst/rist/gstristsrc.c: - * gst/rist/meson.build: - * meson_options.txt: - rist: Add a plugin implenting RIST TR-06-1 Simple Profile - RIST TR-06-1 is a specification for video streaming made by the VSF - group. It is using a subset of RTP specification to which some - modification has been made to improve RTX behaviour and avoid any need - for signaling. The plugin implement ristrtxsend / ristrtxreceive element - which are the RIST specific equivalent of rtprtxsend/rtprtxreceive and - ristsink / ristsrc which implement rist transmitter and receiver. The - RIST protocol is meant to be used in unidirectional way. Typically, MPEG - TS over RTP is used. - Currently we support unicast and multicast streaming according to the - specification. This patch does not include any bonding support yet. The - ristsrc element introduce rist:// URI handling in parallel to it's - property configuration interface. - -2019-05-01 15:31:34 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * ext/closedcaption/gstccextractor.c: - ccextractor: copy input buffer flags to output buffer - GST_VIDEO_BUFFER_FLAG_INTERLACED and GST_VIDEO_BUFFER_FLAG_TFF - flags are needed when processing SCTE 20 closed captions for an interlaced - stream, when we need to convert back to analog, in which case we need to match - the caption to the top or bottom field - -2019-05-01 19:29:16 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Fix typo when setting multiview mode and flags - -2019-05-02 13:20:30 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/x265/gstx265enc.c: - x265enc: Do not drop SEI nals from header - SEI message shouldn't be dropped since it contains various informal (or essential) - information. - -2019-05-02 12:21:38 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/x265/gstx265enc.c: - x265enc: Add support mastering display info and content light level encoding - ... if (x265 version >= 1.9) requirement is satisfied. - The SEI messages were supported since x265 version 1.8 - but there was API change from version 1.9 - (contentLightLevelInfo was renamed to maxCLL and maxFALL) - -2019-04-30 21:25:12 -0300 Marcos Kintschner <marcos.ktn@gmail.com> - - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - Fixed segtotal value being always 2 due to an unused variable - The 'MAX' expression used to set segtotal always returned 2 because the unused and unitialized variable buffer_frame_count was always 0 - -2019-04-26 09:52:43 +0800 Wangfei <fei.w.wang@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - h265parser: parse range extension message in SPS/PPS. - Range extension message may exist in some extension-profile clips. - -2019-04-26 16:25:17 +0200 Fabio D'Urso <fabio.durso@m2dtech.com> - - * ext/sctp/sctpassociation.c: - sctp: increase DEFAULT_NUMBER_OF_SCTP_STREAMS to 1024 - This change makes it possible to create more than just 5 webrtc - data channels. The maximum number of data channels is exactly - DEFAULT_NUMBER_OF_SCTP_STREAMS / 2, therefore the limit is now - 512. - -2019-04-23 15:09:17 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst-libs/gst/interfaces/photography.h: - libs: Fix various Since markers - -2019-04-23 14:33:05 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c: - * gst-libs/gst/player/gstplayer.c: - player: Fix various Since markers in the docs - -2019-04-23 09:06:13 +0200 Nicola Murino <nicola.murino@gmail.com> - - * configure.ac: - * ext/opencv/meson.build: - opencv: allow compilation against 4.1.x - -2019-04-21 17:17:14 +0200 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsrc.c: - srt: post error when failing to start - ... as appropriate for a subsequent state change failure - -2019-04-21 16:47:30 +0200 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * ext/srt/gstsrtobject.c: - srt: downgrade regular message to log level - -2019-04-19 10:33:49 +0100 Tim-Philipp Müller <tim@centricular.com> - - * README: - * RELEASE: - * configure.ac: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiobuffersplit.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiolatency.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-closedcaption.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ipcpipeline.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-openmpt.xml: - * docs/plugins/inspect/plugin-openni2.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-proxy.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-sctp.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srt.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-wasapi.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * meson.build: - Back to development - -=== release 1.16.0 === - -2019-04-19 00:28:55 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * README: - * RELEASE: - * configure.ac: - * gst-plugins-bad.doap: - * meson.build: - Release 1.16.0 - -2019-04-19 00:28:55 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiobuffersplit.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiolatency.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-closedcaption.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ipcpipeline.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-openmpt.xml: - * docs/plugins/inspect/plugin-openni2.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-proxy.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-sctp.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srt.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-wasapi.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - Update docs - -2019-04-19 00:28:52 +0100 Tim-Philipp Müller <tim@centricular.com> - - * po/ky.po: - * po/sv.po: - * po/zh_CN.po: - Update translations - -2019-04-17 09:12:52 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/msdk_libva.c: - msdk: fix the build error with libva 2.4.0 - This fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/949 - -2019-04-13 13:50:25 -0700 Dan Kegel <dank@oblong.com> - - * ext/webrtcdsp/meson.build: - webrtcdsp/meson.build: don't forget to set c++11 mode - -2019-04-13 11:34:22 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * tests/check/meson.build: - meson: Remove redundant env set operation - This is immediately overriden 4 lines later, and starting with Meso - 0.50.1 this will lead to a noisy warning. - -2019-04-12 10:22:56 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/sctp/Makefile.am: - sctp: Create plugin with $(GST_PLUGIN_LDFLAGS) - Otherwise we don't create a plugin but a proper shared library with - version information, i.e. libgstsctp.so.0.0.0. - -=== release 1.15.90 === - -2019-04-11 00:32:40 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * gst-plugins-bad.doap: - * meson.build: - Release 1.15.90 - -2019-04-11 00:32:40 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiobuffersplit.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiolatency.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-closedcaption.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ipcpipeline.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-openmpt.xml: - * docs/plugins/inspect/plugin-openni2.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-proxy.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-sctp.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srt.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-wasapi.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - Update docs - -2019-04-06 21:44:35 +0200 Peter Seiderer <ps.report@gmx.net> - - * sys/msdk/gstmsdkdec.c: - msdkdec: fix error handling in case of unsupported hardware - Check the return value of gst_msdk_context_ensure_context and - abort in case of failure. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/945 - -2019-04-06 21:29:58 +0200 Peter Seiderer <ps.report@gmx.net> - - * sys/msdk/gstmsdkenc.c: - msdkenc: fix error handling in case of unsupported hardware - Check the return value of gst_msdk_context_ensure_context and - abort in case of failure. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/945 - -2019-04-06 21:09:03 +0200 Peter Seiderer <ps.report@gmx.net> - - * sys/msdk/gstmsdkcontext.c: - msdk: fix error handling in case of unsupported hardware - Fix double gst_object_unref for GstMsdkContext. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/945 - -2019-04-09 21:32:36 +0300 Andrey Konovalov <andrey.konovalov@linaro.org> - - * ext/wayland/wlwindow.c: - waylandsink: make gst_wl_window_is_toplevel aware of XDG shell - -2019-04-09 11:26:28 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * ext/closedcaption/gstccextractor.c: - ccextractor: document importance of pipeline order for this element - -2019-03-21 16:22:23 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: add BGR10A2_LE format in the src pad - example pipeline: - gst-launch-1.0 videotestsrc ! video/x-raw,format=P010_10LE ! msdkvpp ! \ - video/x-raw,format=BGR10A2_LE ! fakesink - -2019-03-21 16:14:47 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdksystemmemory.c: - msdk: set some parameters in mfxFrameData for a MFX_FOURCC_A2RGB10 frame - -2019-03-21 15:34:36 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/msdk_libva.c: - msdk: map MFX_FOURCC_A2RGB10 to VA_FOURCC_A2R10G10B10 - -2019-03-21 15:29:15 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: map GST_VIDEO_FORMAT_BGR10A2_LE to VA_FOURCC_A2R10G10B10 - -2019-03-22 13:43:23 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: map GST_VIDEO_FORMAT_BGR10A2_LE to MFX_FOURCC_A2RGB10 - -2019-04-09 11:06:41 +0200 Peter Körner <peter@mazdermind.de> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: add missing break in set_property-code - -2019-03-26 09:43:46 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * ext/closedcaption/gstcea708decoder.c: - cea708decoder: use correct mask for font style - First three bits are used for font style, so mask - should be 0111 rather than 011 (in binary) - -2019-04-07 13:47:38 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/h264parse.c: - tests: h264parse: add minimal unit test for closed caption SEI parsing - -2019-03-29 21:02:44 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: extract CEA-708 closed captions - Expose SEI data in the H.264 bitstream parser API and - extract closed captions and other things that are not - specified in the H.264 spec itself in the videoparser. - Based on patch by: Mathieu Duponchelle <mathieu@centricular.com> - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/940 - -2019-03-27 17:56:28 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/ios/vkdisplay_ios.h: - * ext/vulkan/ios/vkdisplay_ios.m: - * ext/vulkan/ios/vkios_utils.h: - * ext/vulkan/ios/vkwindow_ios.h: - * ext/vulkan/ios/vkwindow_ios.m: - * ext/vulkan/meson.build: - * ext/vulkan/vkapi.h: - * ext/vulkan/vkconfig.h.meson: - * ext/vulkan/vkdisplay.c: - * ext/vulkan/vkdisplay.h: - * ext/vulkan/vksink.c: - * ext/vulkan/vksink.h: - * ext/vulkan/vkwindow.c: - * ext/vulkan/vkwindow.h: - vulkan: Add iOS window implementation - -2019-03-25 17:50:13 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/cocoa/vkcocoa_utils.h: - * ext/vulkan/cocoa/vkdisplay_cocoa.h: - * ext/vulkan/cocoa/vkdisplay_cocoa.m: - * ext/vulkan/cocoa/vkwindow_cocoa.h: - * ext/vulkan/cocoa/vkwindow_cocoa.m: - * ext/vulkan/meson.build: - * ext/vulkan/vkapi.h: - * ext/vulkan/vkconfig.h.meson: - * ext/vulkan/vkdisplay.c: - * ext/vulkan/vkdisplay.h: - * ext/vulkan/vkwindow.c: - vulkan: Add Cocoa window implementation - -2019-03-29 16:24:15 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkinstance.c: - vulkan: make the debug extension optional - i.e. don't fail if it's not available - -2019-04-06 14:39:22 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/assrender/gstassrender.c: - assrender: fix seeking backwards - Use proper API to flush libass events when we do - a flushing seek, and also do it in FLUSH_STOP - rather than FLUSH_START, so we can be sure - streaming has stopped. - Fixes seeking back in time. - Something seems to have changed in libass that - renders the old manual way of flushing events - ineffective and libass then seems to ignore - timestamps that are older than the ones last - seen then if we do it the old way. - Fixes #916 - -2019-04-06 14:33:45 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/assrender/gstassrender.c: - assrender: improve debug logging in video chain - Print video timestamps only once and enumerate text - buffers to make output more concise and nicer to read. - -2019-04-06 14:31:37 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/assrender/gstassrender.c: - assrender: use subtitle segment to calculate running time for text - Not the video segment. This just for correctness, shouldn't make - any difference in practice since we don't support external SSA yet. - -2018-12-12 15:25:45 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/onvif/gstrtponviftimestamp.c: - rtponviftimestamp: prioritize PTS over DTS for NTP timestamp - NTP timestamps are supposed to match the expected presentation - time, prefering the DTS to compute them was incorrect. - <https://www.onvif.org/specs/stream/ONVIF-Streaming-Spec.pdf> - Section 6.3.1: NTP Timestamps - -2018-11-13 21:17:41 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/onvif/gstrtponviftimestamp.c: - rtponviftimestamp: buffer without PTS or DTS is not an error. - For example, when plugged after rtpgstpay, serialized events will - have neither. - -2018-11-05 20:32:03 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/onvif/gstrtponviftimestamp.c: - * gst/onvif/gstrtponviftimestamp.h: - rtponviftimestamp: implement support for the T flag - https://www.onvif.org/specs/stream/ONVIF-Streaming-Spec.pdf - 6.3 RTP header extension - -2019-04-04 20:19:42 +0000 Shi Yan <billconan@gmail.com> - - * sys/nvenc/gstnvh264enc.c: - * sys/nvenc/gstnvh265enc.c: - Increase nvenc's encoding height to 4096 - According to https://developer.nvidia.com/nvidia-video-codec-sdk - the minimum resolution nvenc supports should be 4096x4096 - -2019-03-25 22:21:09 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: Wait for the surface to be configured - With latest XDG shell, we need to fait for the surface to have been - configured before we can attach a buffer to it. This is being enforce by - Weston with an error. - Fixes #933 - -2019-04-02 15:18:03 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - h264parse, h265parse: take unit_field_based_flag into account .. - when computing timecode metas. Depending on the value of that flag, - n_frames is to be interpreted as a number of fields or a number of - frames. As GstVideoTimeCodeMeta always deals with frames, we want - to scale that number when needed. - -2019-03-30 01:17:08 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: forward time codes - This transforms time code SEIs into GstVideoTimeCodeMeta - -2019-03-28 22:02:02 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: forward time codes - This transforms time codes from the timing SEI into - GstVideoTimeCodeMeta - -2019-03-30 14:02:50 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpesrc: Switch to WPEBackend-fdo 1.2.0 - -2019-03-29 12:09:02 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/srtp/meson.build: - srtp: bump libsrtp requirement to 1.6.0 - See !234 - -2019-03-29 13:22:55 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/gstmsdkvp8dec.c: - msdkdec: add postinit_decoder - The workaround for https://github.com/Intel-Media-SDK/MediaSDK/issues/1139 - is required for vp8 only, so move this workaround to the corresponding - postinit_decoder function - The pipeline below works with this change - gst-launch-1.0 filesrc location=SA10104.vc1 ! \ - 'video/x-wmv,profile=(string)advanced',width=720,height=480,framerate=14/1 ! \ - msdkvc1dec ! fakesink - -2019-03-29 12:53:38 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/gstmsdkvp8dec.c: - * sys/msdk/gstmsdkvp9dec.c: - msdkdec: don't set unknown picture struct to progressive for vc1 - MFXVideoDECODE_DecodeHeader only parses the sequence layer for VC1, so - the structure is unknown for a stream with interlace flag set in the - sequence layer. If forcing the struct to progressive in this plugin, - MediaSDK will fail to decode such streams. - -2019-03-29 12:57:10 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvc1dec.c: - msdkvc1dec: add the preinit_decoder function - -2019-03-28 18:27:28 +0000 Philippe Normand <philn@igalia.com> - - * configure.ac: - * ext/wpe/meson.build: - wpe: Bump required version to WPEWebKit 2.24 - Fixes #929 - -2019-03-27 13:22:47 -0400 Aaron Boxer <aaron.boxer@collabora.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: add debug code for closed captions - This debug code will help determine why certain instances of closed - captions that are present in the Picture User Data are not actually - processed by the pipeline - -2019-03-06 07:36:44 +0100 Ulf Olsson <ulfo@axis.com> - - * ext/srtp/gstsrtp.c: - * ext/srtp/gstsrtp.h: - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpenc.c: - * ext/srtp/gstsrtpenums.h: - srtp: Add support for GCM (RFC 7714) - The GCM support in libsrtp have been there for a while and - it can be useful for some applications. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/913 - -2019-03-26 20:43:22 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: Don't leak CUDA device memory - Allocated device memory should be freed with cuMemFree - -2019-03-26 20:24:22 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: Ensure unmap resources before finalizing them - Mapped resource via NvEncMapInputResource() will result to unregister fail. - It can happen when paused to ready state change without EOS event. - -2019-02-28 17:42:58 +0800 Haihua Hu <jared.hu@nxp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: ignore VUI parse fail when parse SPS - VUI is an optional for SPS parse, some HEVC file has incorrect VUI - parameters but still can be decoded - -2019-03-22 22:32:59 +0100 Josep Torra <jtorra@oblong.com> - - * ext/closedcaption/gstccconverter.c: - closedcaption: fix build error in OSX - Fixes the following error. - gstccconverter.c:677:7: error: variable 'len' is used uninitialized whenever 'if' condition is false - -Werror,-Wsometimes-uninitialized - if (flags & 0x40) { - ^~~~~~~~~~~~ - gstccconverter.c:698:10: note: uninitialized use occurs here - return len; - ^~~ - gstccconverter.c:677:3: note: remove the 'if' if its condition is always true - if (flags & 0x40) { - ^~~~~~~~~~~~~~~~~~ - gstccconverter.c:572:12: note: initialize the variable 'len' to silence this warning - guint len; - ^ - = 0 - -2019-03-22 22:25:20 +0100 Josep Torra <jtorra@oblong.com> - - * ext/closedcaption/misc.h: - closedcaption: fix build error in OSX - Fixes the following error by commenting an unused block. - ./misc.h:503:11: error: 'strlcpy' macro redefined -Werror,-Wmacro-redefined - -2019-03-25 22:24:17 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: Don't release stream lock on GstVideoEncoder::stop() - baseclass didn't take the stream lock during stop. It's valid only for - GstVideoEncoder::finish() - Closes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/912 - -2019-03-08 12:22:52 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: add VUYA format in the src and sink pads - -2019-03-14 12:05:58 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvideomemory.c: - msdk: return the right pointer for GST_VIDEO_FORMAT_VUYA frame - The first component for GST_VIDEO_FORMAT_VUYA in memory is V. - -2019-03-08 12:20:56 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdksystemmemory.c: - msdk: set some parameters in mfxFrameData for a MFX_FOURCC_AYUV frame - -2019-03-08 12:15:14 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk_libva.c: - msdk: map MFX_FOURCC_AYUV to VA_FOURCC_AYUV - -2019-03-08 12:26:37 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: map GST_VIDEO_FORMAT_VUYA to VA_FOURCC_AYUV - -2019-03-08 12:13:05 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: map GST_VIDEO_FORMAT_VUYA to MFX_FOURCC_AYUV - -2019-03-06 13:07:53 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: avoid infinite loop - It is possible MFXVideoDECODE_DecodeFrameAsync returns MFX_ERR_INCOMPATIBLE_VIDEO_PARAM - and this error can't be recovered by retrying MFXVideoDECODE_DecodeFrameAsync - in some cases, so we need to limit the number of retries to avoid infinite loop. - This fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/909 - -2019-03-23 18:58:06 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - g-i: pass --quiet to g-ir-scanner - This suppresses the annoying 'g-ir-scanner: link: cc ..' output - that we get even if everything works just fine. - We still get g-ir-scanner warnings and compiler warnings if - we pass this option. - -2019-03-23 18:57:24 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - g-i: silence 'nested extern' compiler warnings when building scanner binary - We need a nested extern in our init section for the scanner binary - so we can call gst_init to make sure GStreamer types are initialised - (they are not all lazy init via get_type functions, but some are in - exported variables). There doesn't seem to be any other mechanism to - achieve this, so just remove that warning, it's not important at all. - -2019-03-22 23:35:04 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/vulkan/vkswapper.c: - vulkan: fix some compiler warnings in gnu89 mode - for loop variable initialization and conflicting types for i. - -2019-03-10 19:28:24 +0000 Piotr Drąg <piotrdrag@gmail.com> - - * po/LINGUAS: - Update LINGUAS - -2019-03-21 11:14:37 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264: fix build with gstreamer debug system disabled - See https://gitlab.freedesktop.org/gstreamer/gst-ci/merge_requests/89 - -2019-03-21 11:13:38 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: add -Wno-unused also to C++ args when gst debug system is disabled - -2019-03-20 21:38:04 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Avoid possible NULL caps 'dereferencing' - -2019-03-20 19:45:12 +0700 Ilya Smelykh <ilya@videoexpertsgroup.com> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: fix buffer leak on read error or EOS - -2019-01-31 16:31:04 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpesrc: Register backend activity states - -2019-01-31 16:30:18 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpesrc: Always log loaded URI - -2019-01-18 13:28:45 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpesrc: Implement webview background configuration support - -2019-03-15 11:19:03 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/srtp/gstsrtp.h: - * ext/srtp/gstsrtpdec.c: - srtpdec: Lower severity of srtp_err_status_replay_fail - AFAIU this happens when encountering retransmissions. Don't print a - warning for these packets. - -2019-03-15 11:16:10 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Simplify code flow handling status_key_expired - Ensures a balanced UNLOCK -> LOCK. - -2019-03-15 11:13:14 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Simplify checking the unprotect error - Introduce an err label to jump to. Avoid logging two warnings per - failure. - -2019-03-15 11:03:52 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Simplify locking in gst_srtp_dec_decode_buffer - Don't drop the lock on filter just to unmap the buffer (or log a - message). - -2019-03-18 15:12:37 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/netsim/gstnetsim.c: - netsim: don't use G_INLINE_FUNC - It's deprecated. Just use 'inline'. - -2019-03-18 15:23:07 +0100 Xabier Rodriguez Calvar <calvaris@igalia.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: fix protection data double free - For not being duplicated here it was being freed when the manifest was - being destroyed and a second time when the buffer was being destroyed. - -2019-03-14 16:37:13 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/README: - * sys/msdk/gstmsdk.c: - msdk: relicense the plugin to LGPL - Some files licensed under LGPL were included, so relicense the plugin - from BSD to LPGL. In addition, this patch removes the README per the - discussion in https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/853 - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/853 - -2019-03-15 16:47:35 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: fix pt selection for FEC and RTX when BUNDLE - When we offer bundled media, payload types must be unique - across all bundled media, as they will be multiplexed in the - same session. - -2019-03-15 10:46:56 +0100 Andreas Frisch <afrisch@make.tv> - - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpenc.c: - srtp: Spell 'mechanisms' right - -2019-03-13 13:43:54 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - cccombiner: improve behaviour on timeout - Prior to this, cccombiner stopped consuming video buffers when - data wasn't arriving on its caption pad. In a live situation, - when aggregator is timing out we should still output whatever - video buffers are present, even if no caption buffers can be - aggregated with them. - -2019-03-12 21:37:53 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: add get-transceiver signal - get-transceivers is not introspectable, and a method to get a - transceiver by index is convenient. - -2019-03-07 14:13:14 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/webrtc/gstwebrtcstats.c: - webrtcbin: Filter transport stream stats by ssrc - Since the addition of BUNDLE support, the pads and the transceivers - share a single transport stream. When getting stats from the stream, - filter by the ssrc of the current pad to avoid merging the stats for - different pads. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/889 - -2019-03-07 14:12:47 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/webrtc/gstwebrtcstats.c: - webrtcbin: Syntax cleanup - -2019-03-11 15:00:59 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/closedcaption/io-sim.c: - closedcaption: Fix build with Visual Studio - ../ext/closedcaption/io-sim.c(440): error C2065: 'M_PI': undeclared identifier - ../ext/closedcaption/io-sim.c(442): error C2065: 'M_LN2': undeclared identifier - -2019-03-11 14:45:14 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/nvdec/meson.build: - * sys/nvenc/meson.build: - nvenc: Fix build when cuda is found but nvenc is disabled - tests\check\meson.build:21:5: ERROR: Unknown variable "use_nvenc_gl". - Also do the same change in nvdec, just to be defensive about future - issues. - -2019-03-08 13:43:15 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: More clean up on stop for encoder to be reusable - Encoder will not configure internal pool again if input_state exist - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/912 - -2018-12-13 22:03:36 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: Ensure drain all frames on finish - To drain all queued encoding items, encoder should gracefully - wait the encoding thread without stealing queued items. - Otherwise, some input frames can be dropped. - -2018-12-13 22:19:30 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/Makefile.am: - * tests/check/elements/nvenc.c: - * tests/check/meson.build: - tests: Add nvenc unit test - -2019-03-05 18:55:16 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * sys/nvenc/gstnvbaseenc.c: - * sys/nvenc/gstnvh264enc.c: - * sys/nvenc/gstnvh265enc.c: - nvenc: Fix GValue leaks - GValue should be freed with g_value_unset() - -2019-03-08 23:49:49 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/assrender/gstassrender.c: - assrender: fix some leaks - g_slist_remove_*() removes the list node without freeing it. - -2019-03-07 19:26:56 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/vulkan/vkupload.c: - * ext/vulkan/vkutils.c: - vulkan: fix some leaks - Fix vk_instance leak when state change fails like in - generic/states unit test. - -2019-03-07 18:20:40 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/teletextdec/gstteletextdec.c: - teletextdec: fix some string leaks - -2019-03-07 00:02:13 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/srt/gstsrtobject.c: - srt: fix uri and string leaks - And simplify property getter to avoid unnecessary copy. - -2019-03-06 23:45:27 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/closedcaption/gstcea708decoder.c: - * ext/closedcaption/gstcea708decoder.h: - * ext/closedcaption/gstceaccoverlay.c: - closedcaption: cea708decoder: fix some memory leaks - -2019-03-06 18:32:38 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/closedcaption/gstline21dec.c: - * tests/check/elements/line21.c: - closedcaption: fix leak in line21 decoder - Destroy old decoder instance when shutting down the - element, and also in case the input format changes. - Fix harness/pipeline leak in unit test. - -2019-03-06 21:32:50 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/adaptive_demux_common.c: - tests: fix bus leak in hls_demux testSeek unit test - We add the signal watch in testSeekPreTestCallback so - remove it in testSeekPostTestCallback and not deep inside - some if clause in some other callback somewhere. - -2019-03-06 18:35:46 +0000 Tim-Philipp Müller <tim@centricular.com> - - * .gitignore: - * tests/check/elements/.gitignore: - .gitignore more things - -2019-03-07 21:21:18 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * configure.ac: - * sys/meson.build: - nvdec/nvenc: Add CUDA Toolkit 10.1 support - Update to support the latest CUDA Toolkit version 10.1 - -2019-03-07 10:15:16 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/fluidsynth/gstfluiddec.c: - fluidsynth: Avoid Wincompatible-pointer-types with 2.0.4 - In 2.0.4, the message parameter has "const char*" type. Add a cast to - avoid a warning with older fluidsynth. - -2019-03-06 15:17:24 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * tests/check/Makefile.am: - line21: fix tests build with autotools - -2019-03-06 11:23:32 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstline21dec.c: - line21dec: general cleanup - This ports over the review comments made on line21enc in !217 - -2019-02-23 00:23:01 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/Makefile.am: - * ext/closedcaption/gstclosedcaption.c: - * ext/closedcaption/gstline21enc.c: - * ext/closedcaption/gstline21enc.h: - * ext/closedcaption/meson.build: - * tests/check/Makefile.am: - * tests/check/elements/line21.c: - * tests/check/meson.build: - closedcaption: add line21 encoder - This element acts as a counterpart of line21encoder. - Also adds a simple test validating each element using the - other. - -2019-02-21 19:05:03 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/hamm.h: - * ext/closedcaption/io-sim.c: - * ext/closedcaption/io-sim.h: - * ext/closedcaption/meson.build: - Check in vbi encoder - -2019-03-01 09:56:24 +0100 Niels De Graef <niels.degraef@barco.com> - - * configure.ac: - * ext/wayland/Makefile.am: - * ext/wayland/gstwaylandsink.c: - * ext/wayland/meson.build: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - * gst-libs/gst/wayland/meson.build: - waylandsink: Implement XDG-shell stable support - wl_shell is officially deprecated, so provide support for the - XDG-shell protocol should be provided by all desktop-like compositors. - (In case they don't, we can of course fall back to wl_shell). - Note that the XML spec is provided by the `wayland-protocols` - git repository, which is provided by the Wayland project. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/897 - wl_shell: https://people.freedesktop.org/~whot/wayland-doxygen/wayland/Client/group__iface__wl__shell.html - deprecated: https://github.com/wayland-project/wayland/commit/698dde195837f3d0844b2725ba4ea8ce9ee7518c - XML spec: https://github.com/wayland-project/wayland-protocols/blob/master/stable/xdg-shell/xdg-shell.xml - -2019-03-01 10:17:23 +0100 Niels De Graef <niels.degraef@barco.com> - - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: prefix wl_shell-specific variables with wl_ - -2019-03-03 19:34:11 +0100 Peter Körner <peter@mazdermind.de> - - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: document duplex and keyer behaviour - -2019-03-03 19:34:06 +0100 Peter Körner <peter@mazdermind.de> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink: implement duplex-mode property - -2019-03-04 09:11:55 +0000 Tim-Philipp Müller <tim@centricular.com> - - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiobuffersplit.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiolatency.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-closedcaption.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ipcpipeline.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-openmpt.xml: - * docs/plugins/inspect/plugin-openni2.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-proxy.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srt.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-wasapi.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * meson.build: - Back to development - -2019-03-01 21:47:14 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/Makefile.am: - build: Don't forget to dist applemedia/avfdeviceprovider.h - Closes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/908 - -2019-02-28 21:37:49 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/msdk.c: - * sys/msdk/msdk_libva.c: - mskd: Don't use MFX_FOURCC_RGB565 if it's undefined - ../subprojects/gst-plugins-bad/sys/msdk/msdk.c(61): error C2065: 'MFX_FOURCC_RGB565' - The minimum required version for the format seems to MFX_VERSION >= 1028 - -2019-02-28 17:24:56 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - * ext/closedcaption/gstcccombiner.h: - cccombiner: implement update_src_caps - It is necessary to implement this vmethod, as when the src pad - is marked as reconfigure, the base class will reset to src caps, - and the default update_src_caps simply queries the caps allowed - downstream without taking into account the caps set by - gst_aggregator_set_src_caps. - -2019-02-28 12:00:56 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkh265dec.c: - * sys/msdk/gstmsdkvp9dec.c: - msdkdec: fix for small resolution - -2019-02-27 08:07:29 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: fix for resolution change - Returning MFX_ERR_INCOMPATIBLE_VIDEO_PARAM from - MFXVideoDECODE_DecodeFrameAsync means the allocated mfx surface is not - suitable for the current frame, we need a new mfx surface and try - MFXVideoDECODE_DecodeFrameAsync again. - -2019-02-28 11:02:42 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/meson.build: - meson: don't build icles when tests are disabled - They are manual tests, so let them be controlled - via the tests option not the examples option, for - consistency with -good. - -2019-02-25 15:23:34 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlssink2.c: - * ext/hls/gsthlssink2.h: - hlssink2: Add property for disabling sending of force-keyunit events - -2019-02-27 18:47:09 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: restore stream creation order - In 7c767f3fcd5a7b40d205bb4d588dad6c6275c729 , stream creation was - refactored to occur before potential program creation. This created - issues with pipelines such as: - gst-launch-1.0 videotestsrc ! video/x-raw, format=I420, width=640, height=640, framerate=25/1 ! \ - x264enc ! hlssink2 target-duration=1 - eg.: gst_buffer_copy_into: assertion 'bufsize >= offset + size' failed - As this reordering was actually not needed for the purpose of allowing - to specify a PCR stream, this reverts the reordering part of the - initial commit. - -2019-02-22 16:20:16 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/gstmsdkvp8dec.c: - * sys/msdk/gstmsdkvp9dec.c: - msdkdec: force the alignment of width/height to 16 for vp8/vp9 - MSDK library requires 16 alignment for vp8/vp9, otherwise a pipeline - for vp8/vp9 decoding might fail. - example pipeline: - gst-launch-1.0 filesrc location=vp8_1280x720.webm ! matroskademux ! \ - msdkvp8dec ! fakesink - 0:00:00.150565444 10657 0x55c8484036d0 ERROR msdkdec - gstmsdkdec.c:1056:gst_msdkdec_handle_frame:<msdkvp8dec0> - DecodeFrameAsync failed (invalid video parameters) - -2019-02-25 12:43:19 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: add RGB16 format in the sink pad - Note: MSDK doesn't support RGB16 output, hence don't add RGB16 format in - the src pad - -2019-02-25 12:18:05 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdksystemmemory.c: - msdk: set some parameters in mfxFrameData for a RGB16 frame - -2019-02-25 13:24:46 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk_libva.c: - msdk: map MFX_FOURCC_RGB565 to VA_FOURCC_RGB565 - -2019-02-25 12:29:25 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: map GST_VIDEO_FORMAT_RGB16 to VA_FOURCC_RGB565 - -2019-02-25 13:23:49 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: map GST_VIDEO_FORMAT_RGB16 to MFX_FOURCC_RGB565 - -=== release 1.15.2 === - -2019-02-26 11:53:22 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * gst-plugins-bad.doap: - * meson.build: - Release 1.15.2 - -2019-02-26 11:53:22 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiobuffersplit.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiolatency.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-closedcaption.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ipcpipeline.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-openmpt.xml: - * docs/plugins/inspect/plugin-openni2.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-proxy.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srt.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-wasapi.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - Update docs - -2019-02-26 11:53:18 +0000 Tim-Philipp Müller <tim@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/fur.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update translations - -2019-02-11 16:49:32 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: release the occupied surface for MFX_WRN_DEVICE_BUSY - When MFXVideoDECODE_DecodeFrameAsync () returns MFX_WRN_DEVICE_BUSY with - an output surface, a new input surface is required when retrying - MFXVideoDECODE_DecodeFrameAsync (). - This fixes the out-of-surface issue mentioned in - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/890 - -2019-01-18 15:14:59 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: don't destroy an image twice - This gets rid of annoying message in the log, e.g. run the pipeline - below: - gst-launch-1.0 videotestsrc num-buffers=100 ! \ - video/x-raw,format=NV12,width=352,height=288 ! msdkh264enc ! filesink \ - location=test.h264 - LIBVA:CRITICAL - DdiMedia_DestroyImage:4357: Invalid image - -2019-01-17 16:05:05 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkbufferpool.c: - msdk: move the comment to the correct place - -2019-02-20 12:52:08 -0500 Aaron Boxer <aaron.boxer@collabora.com> - - * ext/srt/gstsrtobject.c: - srtobject: check for null local address to avoid SIGSEV - -2019-02-21 23:51:39 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: fix typo in framerate - -2019-02-21 15:16:37 +0000 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - * gst/audiobuffersplit/gstaudiobuffersplit.h: - audiobuffersplit: Added max-silence-time property - -2019-02-20 11:26:01 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: allow specifying the PID of the PCR stream - The structure passed through the prog-map can now contain a - PCR_<prog_id>=sink_<PID> key-value pair. - -2019-02-14 10:58:00 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: add Hardware tag to element metadata - -2019-02-14 10:54:25 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - wasapi: add Hardware tag to element metadata - -2019-02-14 10:44:00 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/winks/gstksvideosrc.c: - winks: add Hardware tag to element metadata - -2019-02-14 09:49:46 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/androidmedia/gstahcsrc.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - androidmedia: add Hardware tag to element metadata - -2019-02-14 09:49:03 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/avsamplevideosink.m: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - applemedia: add Hardware tag to element metadata - -2019-02-14 09:47:29 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/msdk/gstmsdkh264dec.c: - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh265dec.c: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkmjpegdec.c: - * sys/msdk/gstmsdkmjpegenc.c: - * sys/msdk/gstmsdkmpeg2dec.c: - * sys/msdk/gstmsdkmpeg2enc.c: - * sys/msdk/gstmsdkvc1dec.c: - * sys/msdk/gstmsdkvp8dec.c: - * sys/msdk/gstmsdkvp8enc.c: - * sys/msdk/gstmsdkvp9dec.c: - msdk: add Hardware tag to element metadata - -2019-02-14 09:43:54 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/nvdec/gstnvdec.c: - * sys/nvenc/gstnvh264enc.c: - * sys/nvenc/gstnvh265enc.c: - nvenc, nvdec: add Hardware tag to element metadata - -2019-02-05 17:10:03 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * ext/curl/gstcurlhttpsrc.c: - curlhttpsrc: set BUFFER_OFFSET when creating GstBuffer - To make curlhttpsrc behave more like souphttpsrc, set the - BUFFER_OFFSET in its output buffers to match the segment - start. This means that in a HTTP RANGE request, the BUFFER_OFFSET - will match the value in the RANGE request. - -2019-02-05 17:06:50 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * ext/curl/gstcurlhttpsrc.c: - * ext/curl/gstcurlhttpsrc.h: - curlhttpsrc: export same HTTP error status as souphttpsrc - To make it closer to a drop-in replacement for souphttpsrc, - expose the same gst_error_message_with_details as souphttpsrc, - so that applications can received the HTTP status code and reason - when an error occurs. - -2019-02-05 16:34:40 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * ext/curl/gstcurldefaults.h: - * ext/curl/gstcurlhttpsrc.c: - * ext/curl/gstcurlhttpsrc.h: - * ext/curl/gstcurlqueue.c: - * ext/curl/gstcurlqueue.h: - curlhttpsrc: fix various leaks and thread safety issues - curlhttpsrc uses a single thread running the - gst_curl_http_src_curl_multi_loop() function to handle receiving - data and messages from libcurl. Each instance of curlhttpsrc adds - an entry into a queue in GstCurlHttpSrcMultiTaskContext and waits - for the multi_loop to perform the HTTP request. - Valgrind has shown up race conditions and memory leaks: - 1. gst_curl_http_src_change_state() does not wait for the multi_loop - to complete before going to the NULL state, which means that - an instance of GstCurlHttpSrc can be released while - gst_curl_http_src_curl_multi_loop() still has a reference to it. - 2. if multiple elements try to be removed from the queue at once, - only the last one is deleted. - 3. source->caps is leaked - 4. curl multi_handle is leaked - 5. leak of curl_handle if URI not set - 6. leak of http_headers when reusing element - 7. null pointer dereference in negotiate caps - 8. double-free of the default user-agent string - 9. leak of multi_task_context.task - This commit changes the logic so that each element has a connection - status, which is used by the multi_loop to decide when to remove an - element from its queue. An instance of curlhttpsrc will not enter - the NULL state until its reference has been removed from the queue. - When shutting down the curl multi loop, the memory allocated from the - call to curl_multi_init() is now released. - When gstadaptivedemux uses a URI source element, it will re-use - it for multiple requests, moving it between READY and PLAYING - between each request. curlhttpsrc was leaking the http_headers - structure in this use case. - The gst_curl_http_src_negotiate_caps() function extracts the - "response-headers" field from the http_headers, but did not check - that this field might be NULL. - If the user-agent property is set, the global user-agent string - was freed. This caused a double-free error if the user-agent is - ever set a second time during the execution of the process. - There are situations within curlhttpsrc where the code needs - both the global multi_task_context mutex and the per-element - buffer_mutex. To avoid deadlocks, it is vital that the order in - which these are requested is always the same. This commit modifies - the locking order to always be in the order: - 1. multi_task_context.task_rec_mutex - 2. buffer_mutex - Fixes #876 - -2019-02-05 16:23:01 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * tests/check/Makefile.am: - * tests/check/elements/curlhttpsrc.c: - * tests/check/meson.build: - tests: curlhttpsrc: add unit tests - Based upon the souphttpsrc tests, add unit tests for the curlhttpsrc - element. The souphttpsrc tests are able to use an HTTP server that - is provided as part of the soup library. This does not exist in the - curl library, therefore these tests provide a very simple HTTP server - using the GIO library. - These curlhttpsrc tests contain one new test that does not come from - the souphttpsrc tests. The test_multiple_http_requests test tries to - reproduce the way in which GstAdaptiveDemux makes use of URI source - elements. GstAdaptiveDemux creates a bin with the httpsrc element - and a queue element and sets the locked state of that bin to TRUE, - so that it does not follow the state transitions of its parent. It - then moves this bin to the PLAYING state to start each download and - back to READY when the download completes. - -2019-02-14 14:48:12 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: allow UYVY in DMABuf mode in the sink pad - Tested with the pipeline below: - gst-launch-1.0 videotestsrc num-buffers=1 ! msdkvpp ! \ - video/x-raw\(memory:DMABuf\),format=UYVY ! msdkvpp ! video/x-raw, \ - format=YUY2 ! filesink location=a.yuv - -2019-02-14 13:56:52 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: allow UYVY in the src pad - This make the pipeline below works: - gst-launch-1.0 videotestsrc num-buffers=1 ! msdkvpp ! \ - video/x-raw,format=UYVY ! filesink location=a.yuv - Once https://github.com/intel/media-driver/pull/526 in the media-driver - is merged, the pipeline below also works: - gst-launch-1.0 videotestsrc num-buffers=1 ! msdkvpp ! \ - video/x-raw\(memory:DMABuf\),format=UYVY ! filesink location=a.yuv - -2019-01-02 19:48:34 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: map GST_VIDEO_FORMAT_UYVY to VA_FOURCC_UYVY - -2019-02-14 13:43:13 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: allow BGRx in DMABuf mode in the src pad - Tested with the pipeline below: - gst-launch-1.0 videotestsrc ! msdkvpp ! \ - video/x-raw\(memory:DMABuf\),format=BGRx ! glimagesink - -2019-02-18 15:15:44 +0100 Bastien Nocera <hadess@hadess.net> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * meson_options.txt: - * sys/Makefile.am: - * sys/meson.build: - * sys/vcd/Makefile.am: - * sys/vcd/meson.build: - * sys/vcd/vcdsrc.c: - * sys/vcd/vcdsrc.h: - * tests/check/Makefile.am: - vcdsrc: Remove unusable VCD source - The VCD source was ported in 2014 (commit 89eb1e9), but the necessary - "cdxaparse" plugin, which is used to "Parse a .dat file (VCD) into - raw mpeg1" was never ported. - This means that the probable main user for the feature, totem, hasn't - actually been able to play back VCDs, since 2012, when it switched to - using GStreamer 1.0. - Note that even if cdxaparse was finally ported, a lot of work would - still be necessary before it is considered usable. Notably, it is - missing disc image support 1 and some VCDs just cannot be opened for - reading 2. - 1: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/898 - 2: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/899 - -2019-02-15 22:51:21 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/closedcaption/misc.h: - closedcaption: Use portable variadic macro syntax - args... is not understood by MSVC: - error C2010: '.': unexpected in macro parameter list - -2019-02-15 22:52:30 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/closedcaption/decoder.c: - * ext/closedcaption/decoder.h: - closedcaption: Port plugin to MSVC - pthread is not portable, so we can't use a pthread mutex use GMutex - instead. - -2018-05-09 13:16:15 +0100 Daniel Stone <daniels@collabora.com> - - * ext/wayland/wlwindow.c: - waylandsink: Don't create throwaway empty regions - Instead of creating a region, adding nothing to it, setting that as the - input region and destroying the region, you can instead just pass NULL - to wl_surface_set_input_region for the same effect. - Fixes #702 - -2019-02-15 19:15:11 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: fix rtx + bundle - If bundle was used in combination with rtx, only the bundled transport - stream would have correctly configured rtx parameters. - Iterate over the payloads upfront in the bundled case to ensure the - correct payload mapping is set for the RTX elements. - -2019-02-13 17:24:50 +0100 Edward Hervey <edward@centricular.com> - - * ext/dtls/gstdtlsagent.c: - dtls: Don't abort on non-fatal issues - OpenSSL will take care of returning valid context if there are - only non-fatal issues. Don't abort in those cases and instead just - print out the issues - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/811 - -2019-02-13 16:09:45 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/fdkaac/gstfdkaacenc.c: - fdkaacenc: Fix draining with libfdk-aac v2.0.0 - This release requires all buffer descriptor pointers to be valid, even - when we provide zero input buffers. - -2019-02-13 00:54:50 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - tsdemux: Skew correction should use the upstream DTS - The MPEG-TS packetiser should use the upstream DTS for - skew correction when running in that mode, as the DTS - carries the upstream arrival time. The PTS (if it's - set at all) is less useful, and can be invalid. - -2019-02-12 14:31:13 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstccconverter.c: - ccconverter: Don't output empty buffers - -2019-02-12 14:30:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Use S334_EIA_608 instead of S334_EIA_708 for CEA608 output - -2019-02-12 14:30:13 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: S334 1A CEA608 closed captions have the first bit set for the first field - And not for the second field. The logic was inverted here. - -2019-02-11 13:53:19 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: set decode_only for output only - MSDK may return MFX_ERR_MORE_DATA but without output surface - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/887 - -2019-02-12 10:53:55 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - msdk: verify the driver name - We need to make sure the Intel graphics card is used in a dual GPU - system. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/895 - -2019-01-25 16:25:10 +0900 Justin Kim <jeongseok.kim@sk.com> - - * ext/srt/gstsrt-enums.h: - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - srt: re-enable passphrase - With refactoring, supporting passphrase was removed accidently. - This commit re-enables srt encryption and validates 'passphrase' - by checking the return value of 'srt_setsockopt'. - fix: #694 - -2019-02-11 21:21:52 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Fix build with msvc - Fix following build error - ../subprojects/gst-plugins-bad/ext/openh264/gstopenh264dec.cpp(76): error C2121: - Note that msvc usually complains #if inside macro - -2019-01-26 22:09:59 -0500 Josh Matthews <josh@joshmatthews.net> - - * sys/applemedia/Makefile.am: - * sys/applemedia/avfdeviceprovider.h: - * sys/applemedia/avfdeviceprovider.m: - * sys/applemedia/avfvideosrc.h: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/meson.build: - * sys/applemedia/plugin.m: - Add device provider for AVFoundation capture devices. - -2019-02-05 23:53:17 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/ladspa/gstladspa.c: - * gst/removesilence/vad_private.c: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/win/DeckLinkAPIDispatch.cpp: - * sys/decklink/win/DeckLinkAPI_i.c: - * sys/wasapi/gstwasapiutil.c: - * sys/winks/kshelpers.c: - misc: Fix warnings on Cerbero MinGW - gstladspa.c:360:5: error: zero-length ms_printf format string -Werror=format-zero-length - vad_private.c:108:3: error: this decimal constant is unsigned only in ISO C90 -Werror - gstdecklinkvideosink.cpp:478:32: error: comparison between 'BMDTimecodeFormat {aka enum _BMDTimecodeFormat}' and 'enum GstDecklinkTimecodeFormat' -Werror=enum-compare - win/DeckLinkAPI_i.c:72:8: error: extra tokens at end of #endif directive -Werror - win/DeckLinkAPIDispatch.cpp:35:10: error: unused variable 'res' -Werror=unused-variable - gstwasapiutil.c:733:3: error: format '%x' expects argument of type 'unsigned int', but argument 8 has type 'DWORD' -Werror=format - gstwasapiutil.c:733:3: error: format '%x' expects argument of type 'unsigned int', but argument 9 has type 'guint64' -Werror=format - kshelpers.c:446:3: error: missing braces around initializer -Werror=missing-braces - kshelpers.c:446:3: error: (near initialization for 'known_property_sets0.guid.Data4') -Werror=missing-braces - -2019-02-02 13:26:32 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - msdkdec: Release occupied surface for MFX_ERR_MORE_DATA - An output surface is returned but without sync point when when - MFXVideoDECODE_DecodeFrameAsync () returns MFX_ERR_MORE_DATA, this - surface should be released too, otherwise the surface is occupied - and it is easy to exhaust all pre-allocated mfx surfaces. - Example pipeline (input_vp8.webm contains lots of frame with show_frame - set to 0): - gst-launch-1.0 filesrc location=input_vp8.webm ! matroskademux ! - msdkvp8dec ! msdkvpp ! fakesink - 0:00:05.995959693 19866 0x563f30f14590 ERROR default - gstmsdkvideomemory.c:77:gst_msdk_video_allocator_get_surface: failed to - get surface available - ERROR: from element - /GstPipeline:pipeline0/GstMatroskaDemux:matroskademux0: Internal data - stream error. - -2019-02-02 16:54:23 +0100 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/gstcameraundistort.cpp: - opencv cameraundistort: use G_GNUC_UNUSED for better portability - -2018-12-17 23:32:26 +0100 Nicola Murino <nicola.murino@gmail.com> - - * configure.ac: - * ext/opencv/meson.build: - opencv: remove deprecated headers - are not needed anymore - -2018-12-01 22:48:53 +0100 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/MotionCells.cpp: - * ext/opencv/MotionCells.h: - * ext/opencv/cameraevent.cpp: - * ext/opencv/gstcameracalibrate.cpp: - * ext/opencv/gstcameraundistort.cpp: - * ext/opencv/gstcvdilate.cpp: - * ext/opencv/gstcvequalizehist.cpp: - * ext/opencv/gstcverode.cpp: - * ext/opencv/gstcvlaplace.cpp: - * ext/opencv/gstcvlaplace.h: - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstcvsobel.cpp: - * ext/opencv/gstcvsobel.h: - * ext/opencv/gstdewarp.cpp: - * ext/opencv/gstdewarp.h: - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstdisparity.h: - * ext/opencv/gstedgedetect.cpp: - * ext/opencv/gstedgedetect.h: - * ext/opencv/gstfaceblur.cpp: - * ext/opencv/gstfaceblur.h: - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gstfacedetect.h: - * ext/opencv/gstgrabcut.cpp: - * ext/opencv/gstgrabcut.h: - * ext/opencv/gsthanddetect.cpp: - * ext/opencv/gsthanddetect.h: - * ext/opencv/gstmotioncells.cpp: - * ext/opencv/gstmotioncells.h: - * ext/opencv/gstretinex.cpp: - * ext/opencv/gstretinex.h: - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstsegmentation.h: - * ext/opencv/gstskindetect.cpp: - * ext/opencv/gstskindetect.h: - * ext/opencv/gsttemplatematch.cpp: - * ext/opencv/gsttemplatematch.h: - * ext/opencv/gsttextoverlay.cpp: - * ext/opencv/gsttextoverlay.h: - * ext/opencv/motioncells_wrapper.cpp: - * ext/opencv/motioncells_wrapper.h: - * gst-libs/gst/opencv/gstopencvutils.cpp: - * gst-libs/gst/opencv/gstopencvutils.h: - * gst-libs/gst/opencv/gstopencvvideofilter.cpp: - * gst-libs/gst/opencv/gstopencvvideofilter.h: - opencv: port to c++ - -2019-02-02 17:51:35 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: explain the the extra ref of input buffer - -2019-01-11 16:18:11 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: avoid releasing the input buffer when it is still in use - The input buffer is released in gst_msdkdec_finish_task () when decoding - some special clips however this buffer is still in use, so ref the input - buffer before gst_msdkdec_finish_task () and unref it at the end of - gst_msdkdec_handle_frame (). - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/862 - -2019-01-31 15:24:06 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * tests/check/meson.build: - meson: orc-test is not required - This is especially never available on iOS. - -2019-01-16 15:15:13 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvp9dec.c: - msdkvp9dec: output P010_10LE buffer if possible - -2019-01-16 14:52:35 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvp9dec.c: - msdkvp9dec: use separate src caps - We will add more formats in the src caps of msdkvp9dec, so let - msdkvp9dec uses separate src caps. Note it doesn't change any - capability - -2019-01-30 22:16:39 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/debugutils/gsttestsrcbin.c: - testbin: Do not take FlowCombiner into account when flushing - The way FlowCombiner combines the FLUSH doesn't work in the case - we have several "sinkpads" since any flush return FLUSH. But in the - case we have a seek where on one branch flush is done, we should - just say OK otherwise we might return FLUSHING to a src that has already - been seeked and is ready to process new buffers - -2019-01-30 18:36:51 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/debugutils/gsttestsrcbin.c: - testbin: Forward seek to all sources - -2019-01-30 11:11:47 -0500 Aaron Boxer <aaron.boxer@collabora.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dhelpers.c: fix typo in debug output - -2019-01-30 19:54:33 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * meson.build: - * tests/check/meson.build: - meson: Add support orc fallback - Allow fallback to orc subproject if any, and add missing orc version check. - Additionally 'dependencies' keyword is removed from find_library, - because it's invalid keyword for find_library. - -2017-02-27 22:41:47 +1100 Jan Schmidt <jan@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264: Conditionally support the main and high profiles - openh264 added main/high profile support upstream after the 1.8.0 - release, so detect a version higher than that and support main/high - stream input - -2019-01-04 02:53:33 +1100 Jan Schmidt <jan@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264: Use DecodeFrameNoDelay() API instead of DecodeFrame2 - Replace legacy usage of DecodeFrame2 API in favour of the - recommended DecodeFrameNoDelay() - This fixes problems with DecodeFrame2() not (currently) returning - all frames in main/high streams with B-frames, and reduces latency - - previously openh264 would not return a decoded frame until the next - call to DecodeFrame2(). DecodeFrameNoDelay() returns them immediately. - -2019-01-30 14:46:37 +1100 Jan Schmidt <jan@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Hook up openh264 messages to GStreamer logging - Use the OpenH264 callback to pass Openh264 internal warning/error - messages through the GStreamer logging framework - -2017-04-05 15:36:06 +1000 Jan Schmidt <jan@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Handle B frame decoding - Support out-of-order decoding in OpenH264 by tracking - our internal frame reference in the OpenH264 timestamp - field. - Drain any pending frames at EOS. - -2019-01-30 14:38:20 +1100 Jan Schmidt <jan@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - Add OpenH264 version check macro - -2017-03-25 03:37:35 +1100 Jan Schmidt <jan@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Fix up EOS handling - If the last frame(s) produce errors, then we need to drop them - or else we spin forever failing to decode a frame and thinking - it'll get better if we wait for more data that's never coming. - -2019-01-20 01:23:39 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/nvdec/meson.build: - meson: Fix building of the nvdec plugin on Windows - Have to use the Nvidia Video Codec SDK when building with a newer CUDA - toolkit. - -2019-01-22 13:52:55 +0100 VaL Doroshchuk <valentyn.doroshchuk@qt.io> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: add device-name property - This property is readonly and should show the name of selected capture device. - -2019-01-22 01:54:24 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> - - * ext/fdkaac/gstfdkaacdec.c: - fdkaacdec: Fix build for fdkaac < 0.1.4 - The fdkaac decoder supports 6.1 / 7.1 channels with downmixer - since v0.1.4. Old versions can use AAC_PCM_OUTPUT_CHANNELS - instead of AAC_PCM_MAX_OUTPUT_CHANNELS. - Fixes #873 - -2019-01-21 12:25:36 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: set the mfx picture structure to MFX_PICSTRUCT_PROGRESSIVE if it is unknown - The picture structure in the output parameters from - MFXVideoDECODE_Query is set to MFX_PICSTRUCT_UNKNOWN for some codecs, so - the structure of the corresponding mfx surfaces created for decoding are - unknown. The pipeline will be broken when these surfaces are used as the - input for msdkvpp. - Example pipeline: - gst-launch-1.0 filesrc location=input_vp8.webm ! matroskademux ! - msdkvp8dec ! msdkvpp ! fakesink - Error message: - 0:00:00.031568911 14259 0x55b79dc684a0 ERROR msdkvpp - gstmsdkvpp.c:728:gst_msdkvpp_transform:<msdkvpp0> MSDK Failed to do VPP - ERROR: from element - /GstPipeline:pipeline0/GstMatroskaDemux:matroskademux0: Internal data - stream error. - This is a workaround for the above issue - -2019-01-24 22:51:39 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst/mpegpsmux/mpegpsmux.c: - mpegpsmux: add stream-format and alignment to H.264 caps - -2019-01-16 10:44:21 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - msdkh265enc: enable low power mode - Low power mode is disabled by default, set the value of low-power to - true to enable this mode. - -2019-01-24 10:32:46 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst/mpegdemux/gstmpegdefs.h: - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: add support for H.265 - -2019-01-24 10:32:14 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: add stream format to H.264 caps - -2019-01-21 18:18:46 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/gstmsdkbufferpool.c: - msdk: bufferpool: refactor memory type decision - The memory type was used as bitwise enum, but the enum was not - defined in that way. - Nonetheless, most of the usage of the memory type was as mutually - exclusive options, rather than option composition. - This patch refactor how the memory type is defined, so it is kept - the mutual exclusion among options. - -2019-01-21 12:46:32 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/gstmsdkdec.c: - msdk: fix some comments typos - -2019-01-21 16:43:11 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/gstmsdkdec.c: - msdk: decoder: fatal failure if negotiations fails - Otherwise it crashes when no parser is used placed upstream, v.gr. - gst-launch-1.0 filesrc location=file.264 ! msdkh264dec ! fakesink - -2019-01-21 16:11:59 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/gstmsdkdec.c: - msdk: decoder: comment to explain array reset - -2019-01-21 15:53:23 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/gstmsdkdec.c: - msdk: decoder: fix an usage-after-free pointer bug - -2019-01-17 15:06:06 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - webrtc: expose ice-transport-policy property - This is the equivalent of iceTransportPolicy in the RTCConfiguration - dictionary. - Only two values are implemented: - * all: default behaviour - * relay: only gather relay candidates - The third member of the iceTransportPolicy enum, "public", is - obsolete. - -2019-01-22 14:34:23 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsrc.c: - srt: Accepts URIs without host to go into listener mode - Just setting a URI without a hostname should directly go into listener mode. - -2019-01-22 14:33:32 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/srt/gstsrtobject.c: - srt: Fix GClosure usage - One needs to set a marshaller as well as use the object setter when - setting objects. - -2019-01-22 12:52:25 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: detect opengl api from -base .pc files correctly - There was a mismatch between the .pc files generated by - autotools and by meson that would lead to meson not detecting - that opengl api is available even though it is. This could - lead to build failures when building -bad with meson against - a -base that was built with autotools. The mismatch has now - been rectified but we will still check the old one for backwards - compatibility. - -2019-01-22 12:41:00 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: remove some cruft - -2019-01-18 13:28:26 +0000 Philippe Normand <philn@igalia.com> - - * ext/wpe/WPEThreadedView.cpp: - wpesrc: Plug WPE's exportable leak - -2019-01-21 10:57:57 +0000 Philippe Normand <philn@igalia.com> - - * configure.ac: - * ext/Makefile.am: - * ext/wpe/Makefile.am: - wpe: Add autotools build support - -2019-01-22 13:02:30 +0900 Justin Kim <jeongseok.kim@sk.com> - - * ext/srt/gstsrtobject.c: - srt: Use default host and port if uri doesn't provide - -2019-01-22 12:44:07 +0900 Justin Kim <jeongseok.kim@sk.com> - - * ext/srt/gstsrt.c: - * ext/srt/gstsrtobject.c: - srt: Enable logs for srtobject - -2019-01-22 12:42:47 +0900 Justin Kim <jeongseok.kim@sk.com> - - * ext/srt/gstsrtobject.c: - srt: Fix property names - Property name and its enum should match. - -2019-01-22 11:35:03 +0900 Justin Kim <jeongseok.kim@sk.com> - - * ext/srt/gstsrtobject.c: - srt: Fix a regression crash - Even in case that srt is working as a caller mode, uri can have no - hostname or ip address. - fix: #874 - -2019-01-15 13:59:05 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: add P010_10LE to sink and src caps - example pipelines: - gst-launch-1.0 videotestsrc num-buffers=100 ! \ - video/x-raw,format=P010_10LE,width=352,height=288 ! msdkvpp ! \ - video/x-raw,format=NV12! fakesink - gst-launch-1.0 videotestsrc num-buffers=100 ! \ - video/x-raw,format=NV12,width=352,height=288 ! msdkvpp ! \ - video/x-raw,format=P010_10LE ! fakesink - -2019-01-15 14:30:34 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - msdkh265dec: support P010_10LE in DMABuf mode - -2018-12-12 13:14:13 +0100 Jacek Tomaszewski <lord.jacold@gmail.com> - - * sys/wasapi/gstwasapiutil.c: - wasapi: Fixed corner-cases in mapping of channel mask - 'channel-mask' field should not be put in caps if channel mask is 0x0 - Mapping WASAPI channel mask to GST equivalent was going only over - first nChannels elements of wasapi_to_gst_pos array, translating, for - example, WASAPI's 0x63f to GST's 0x3f instead of 0xc3f. - When 'channel-mask' is specified as NULL, it signifies that there's - need to do downmix or upmix and it makes caps negotiation with - audioconvert element impossible. Just omit it. - Signed-off-by: Nirbheek Chauhan <nirbheek@centricular.com> - -2019-01-19 23:53:56 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/msdk/meson.build: - meson: Fix automagic build of msdk plugin - When building the msdk plugin even if libmfx is found, unless the - plugin is explicitly enabled we should not error out if msdk - dependencies are not found. - Also give an error message when we don't build the plugin on Windows - because we're not building with MSVC. - -2019-01-18 13:10:31 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/msdk/Makefile.am: - * sys/nvenc/Makefile.am: - build: Don't forget to add windows files to EXTRA_DIST - -2019-01-17 17:14:31 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/removesilence/Makefile.am: - removesilence: Add $(LIBM) to libraries - /usr/bin/ld: .libs/libgstremovesilence_la-vad_private.o: in function `vad_set_threshold': - ./gst/removesilence/vad_private.c:108: undefined reference to `pow' - /usr/bin/ld: .libs/libgstremovesilence_la-vad_private.o: in function `vad_get_threshold_as_db': - ./gst/removesilence/vad_private.c:114: undefined reference to `log10' - -=== release 1.15.1 === - -2019-01-17 02:16:53 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * gst-plugins-bad.doap: - * meson.build: - Release 1.15.1 - -2019-01-17 02:16:52 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiobuffersplit.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiolatency.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-closedcaption.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ipcpipeline.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-openmpt.xml: - * docs/plugins/inspect/plugin-openni2.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-proxy.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srt.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-wasapi.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - Update docs - -2019-01-17 02:16:38 +0000 Tim-Philipp Müller <tim@centricular.com> - - * po/af.po: - * po/ast.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/fur.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update translations - -2019-01-16 13:48:28 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/srt/Makefile.am: - srt: dist enums header - -2019-01-16 01:03:40 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/meson.build: - meson: enable tests for orc code - -2019-01-15 02:03:23 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: Fix infinite loop when the device disappears - When the audio device goes away during playback or capture, we were - going into an infinite loop of AUDCLNT_E_DEVICE_INVALIDATED. Return -1 - and post an error message so the ringbuffer thread exits with an error. - -2019-01-14 14:29:07 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/srt/Makefile.am: - srt: Fix autotools build - 0a350c610dab54dcdf55b45a0293fff048d24bb3 broke the build by only - building enum types with meson. It also removed gstsrt.c from the list - of sources, causing the plugin to fail to load. - squash! srt: Fix autotools build - -2019-01-14 14:37:23 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/srt/gstsrtobject.c: - srt: Fix GCC function type error - gstsrtobject.c: In function ‘gst_srt_object_close’: - gstsrtobject.c:1036:7: error: function called through a non-compatible type -Werror - (GDestroyNotify) g_closure_unref); - /usr/include/glib-2.0/glib/gmem.h:121:8: note: in definition of macro ‘g_clear_pointer’ - (destroy) (_ptr); \ - ^~~~~~~ - gstsrtobject.c:1038:7: error: function called through a non-compatible type -Werror - (GDestroyNotify) g_closure_unref); - /usr/include/glib-2.0/glib/gmem.h:121:8: note: in definition of macro ‘g_clear_pointer’ - (destroy) (_ptr); \ - ^~~~~~~ - Arch Linux - gcc 8.2.1 20181127 - glib 2.58.2 - -2019-01-10 14:28:52 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdk: set the right BRCParamMultiplier - BRCParamMultiplier in mfxInfoMFX is a parameter which specifies a - multiplier for bitrate control parameters 1, it impacts TargetKbps, - MaxKbps, BufferSizeInKB and InitialDelayInKB. - 1: https://software.intel.com/en-us/node/628473 - -2019-01-10 15:02:16 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdk: set the upper bound of max-vbv-bitrate to 2048000 kbps - The upper bound of bitrate is also 2048000 kbps which should be large - enough in practice. - Fix https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/863 - -2019-01-10 15:34:51 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/msdk/meson.build: - meson: Fix building of MSDK plugin on Windows - Variable name was typoed in 604c8d5232eba961ca34c9e98de8d5454cd5ab5f - -2018-11-07 14:47:44 +0900 Justin Kim <jeongseok.kim@sk.com> - - * ext/srt/Makefile.am: - * ext/srt/gstsrt-enums.h: - * ext/srt/gstsrt.c: - * ext/srt/gstsrt.h: - * ext/srt/gstsrtbasesink.c: - * ext/srt/gstsrtbasesink.h: - * ext/srt/gstsrtbasesrc.c: - * ext/srt/gstsrtbasesrc.h: - * ext/srt/gstsrtclientsink.c: - * ext/srt/gstsrtclientsink.h: - * ext/srt/gstsrtclientsrc.c: - * ext/srt/gstsrtclientsrc.h: - * ext/srt/gstsrtobject.c: - * ext/srt/gstsrtobject.h: - * ext/srt/gstsrtserversink.c: - * ext/srt/gstsrtserversink.h: - * ext/srt/gstsrtserversrc.c: - * ext/srt/gstsrtserversrc.h: - * ext/srt/gstsrtsink.c: - * ext/srt/gstsrtsink.h: - * ext/srt/gstsrtsrc.c: - * ext/srt/gstsrtsrc.h: - * ext/srt/meson.build: - srt: Integrate server and client element into one - We have srt{client,server}{src,sink} elements in accordance to the - norm of the connection oriented protocols. However, SRT connection - mode can be changed by uri parameters so it requires an integrated - element to handle the parameters. - fix: #740 - -2019-01-09 15:03:19 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - msdk: needn't call MFXJoinSession after MFXCloneSession - According to the MSDK documation1, MFXCloneSession is a light-weight - equivalent of MFXJoinSession after MFXInit, so MFXJoinSession call isn't - needed in the msdk plugin, otherwise the cloned session is joined to the - parent session twice, and we will get a MFX error when closing the - parent session - example pipeline: - gst-launch-1.0 videotestsrc num-buffers=100 ! \ - video/x-raw,format=NV12,width=352,height=288 ! msdkh264enc ! msdkh264dec ! \ - msdkh264enc ! fakesink - Error message: - 0:00:00.211948518 21733 0x5586ee741c60 ERROR msdk - msdk.c:148:msdk_close_session: Close failed (undefined behavior) - 1: https://software.intel.com/en-us/node/628429#MFXCloneSession - -2019-01-09 12:19:50 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvpp.c: - msdk: check whether mfx function call fails - And log the failures for debugging - -2019-01-09 09:49:16 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: return NULL instead of FALSE - The returned type is a pointer - -2019-01-09 08:58:00 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvpp.c: - msdk: release resources if failing to create the buffer pool - Needn't check the pointers against NULL because the pointers are - non-NULL - -2019-01-08 13:33:44 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/meson.build: - msdk: meson: compile vp9dec if available - based on the patches provided by Haihao Xiang <haihao.xiang@intel.com> - -2019-01-08 13:36:09 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * configure.ac: - * sys/msdk/gstmsdkh265dec.c: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkmjpegdec.c: - * sys/msdk/gstmsdkvp8dec.c: - * sys/msdk/gstmsdkvp8enc.c: - * sys/msdk/gstmsdkvp9dec.c: - * sys/msdk/meson.build: - * sys/msdk/msdk.h: - * sys/msdk/msdk_libva.h: - msdk: add mfx in include path - Thus removing the preprocessor's directives to included if found. - -2019-01-08 13:30:29 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/meson.build: - msdk: meson: use libmfx pkg-config if available - Refactoring to bail out early if MediaSDK is not found. - based on the patches provided by Haihao Xiang <haihao.xiang@intel.com> - -2019-01-08 13:18:13 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * configure.ac: - msdk: add in configure more directories to search for libraries - -2018-12-29 13:56:49 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_d3d.c: - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/gstmsdkcontext.h: - msdk: don't reset the external frame allocator - In gst-msdk, a mfx session may be shared between different gst - elements, each element tries to set the frame allocator. However, per - the MSDK documation1, the behavior is undefined if reset the frame - allocator while the previous allocator is in use. Fortunately all - elements use the same frame allocator, so we can avoid to call - MFXVideoCORE_SetFrameAllocator again. - 1: https://software.intel.com/en-us/node/628430#MFXVideoCORE3 - -2018-12-27 16:50:54 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: don't use NV12 as default output in normal mode - If so, BGRA is the preferred output format hence BGRA will be selected - as input format by default, e.g. in the pipleline below, BGRA instead of - NV12 is selected without renegotiation, so we can avoid the NV12 issue - (see commit 3f2314a) by default. - gst-launch-1.0 videotestsrc ! msdkvpp ! glimagesink - -2018-12-14 10:18:25 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: close the current VPP session if this session has been initialized - Otherwise MFXVideoVPP_Init will fail because it is called twice without - a close. - Example pipeline: - gst-launch-1.0 videotestsrc ! msdkvpp ! glimagesink - Sometimes glimagesink emits GST_EVENT_RECONFIGURE event which results - in that MFXVideoVPP_Init is called twice, then get the negotiation - failure below: - 0:00:00.093715518 21218 0x558ef56231e0 ERROR msdkvpp - gstmsdkvpp.c:995:gst_msdkvpp_initialize:<msdkvpp0> Init failed - (undefined behavior) - WARNING: from element /GstPipeline:pipeline0/GstMsdkVPP:msdkvpp0: not - negotiated - After applying this commit, the pipeline above may run without - negotiation failure, however NV12 layout in dmabuf mode is selected in - renegotiation, the display image is corrupted due to the NV12 issue which - was mentioned in commit 3f2314a. Some other fixes are needed to avoid - renegotiation by default - -2018-12-19 10:44:50 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdkvpp: don't update pads' info if nothing have changed - -2019-01-04 11:57:52 -0800 U. Artie Eoff <ullysses.a.eoff@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: break out of flush frames loop on error - In general, we should assume any unhandled error is - non-recoverable. - In the flush frames loop, some error states can cause us - to never increment the task and therefore we get stuck - in an infinite loop and generate GST_ELEMENT_ERROR - over and over again. This eventually consumes all - system memory and triggers OOM. Thus, assume the worst - and break out of the loop upon the first "unhandled" error. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/859 - -2019-01-04 18:36:43 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - wasapi: Fix double call to Start when resetting the element - When either the source or sink goes from PLAYING -> NULL -> PLAYING, - we call _reset() which sets client_needs_restart, and then we call - prepare() which calls IAudioClient_Start(), so we don't need to call - it again in src_read() or sink_write(). Unlike when we're just going - PLAYING -> PAUSED -> PLAYING. - -2019-01-03 15:49:26 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/wasapi/gstwasapisink.c: - wasapisink: Don't call CoUninitialize() twice in unprepare() - It has to be symmetric with CoInitialize(), otherwise everything else - will fail. - -2019-01-02 17:18:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Don't forget to unref clock after usage - And don't unref a clock that is potentially NULL. - -2018-12-31 12:09:42 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/webrtc/webrtcsdp.c: - webrtc: include stdlib.h for atoi() - Fixes #857 - -2018-12-30 22:31:39 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/meson.build: - tests: Enable more tests on Windows - -2018-12-30 22:33:03 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/elements/compositor.c: - tests: Remove compositor test - It's moved to -base and no more part of -bad - -2018-12-30 22:31:02 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/elements/asfmux.c: - * tests/check/elements/camerabin.c: - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - tests: Remove pointless unistd include - -2018-12-27 17:52:47 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-openglmixers.xml: - * ext/Makefile.am: - * ext/gl/Makefile.am: - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglbasemixer.h: - * ext/gl/gstglbumper.c: - * ext/gl/gstglbumper.h: - * ext/gl/gstglfilterreflectedscreen.c: - * ext/gl/gstglfilterreflectedscreen.h: - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - * ext/gl/gstglmixerbin.c: - * ext/gl/gstglmixerbin.h: - * ext/gl/gstglmosaic.c: - * ext/gl/gstglmosaic.h: - * ext/gl/gstglstereomix.c: - * ext/gl/gstglstereomix.h: - * ext/gl/gstglutils.c: - * ext/gl/gstglutils.h: - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - * ext/gl/gstopengl.c: - * ext/gl/meson.build: - * ext/meson.build: - * meson_options.txt: - Remove openglmixers plugin, moved to -base - Merged into the existing opengl plugin in -base. - -2018-12-27 13:41:05 +0100 Tim-Philipp Müller <tim@centricular.com> - - * .gitignore: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-compositor.xml: - * gst/compositor/.gitignore: - * gst/compositor/Makefile.am: - * gst/compositor/blend.c: - * gst/compositor/blend.h: - * gst/compositor/blendorc.h: - * gst/compositor/compositor.c: - * gst/compositor/compositor.h: - * gst/compositor/compositororc-dist.c: - * gst/compositor/compositororc-dist.h: - * gst/compositor/compositororc.orc: - * gst/compositor/meson.build: - * gst/meson.build: - * meson_options.txt: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/meson.build: - * tests/examples/Makefile.am: - * tests/examples/compositor/Makefile.am: - * tests/examples/compositor/crossfade.c: - * tests/examples/compositor/meson.build: - * tests/examples/meson.build: - Remove compositor plugin which was moved to -base - https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/issues/138 - -2018-12-26 17:54:21 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * docs/libs/Makefile.am: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * ext/gl/Makefile.am: - * ext/gl/meson.build: - * ext/iqa/Makefile.am: - * ext/iqa/meson.build: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/meson.build: - * gst-libs/gst/video/.gitignore: - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - * gst-libs/gst/video/meson.build: - * gst-libs/gst/video/video-bad-prelude.h: - * gst/compositor/Makefile.am: - * gst/compositor/meson.build: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-bad-video-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-video.pc.in: - * pkgconfig/meson.build: - Remove GstVideoAggregator, moved into libgstvideo in -base - https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/issues/137 - -2018-12-25 14:16:36 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/opencv/Makefile.am: - opencv: fix disting of new header files - Fixes distcheck. - -2018-10-08 23:45:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-stereo.xml: - * gst/meson.build: - * gst/stereo/.gitignore: - * gst/stereo/Makefile.am: - * gst/stereo/gststereo.c: - * gst/stereo/gststereo.h: - * gst/stereo/meson.build: - * meson_options.txt: - stereo: remove plugin which has been merged into audiofx in -good - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/457 - -2018-12-25 16:10:57 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/msdk/gstmsdkbufferpool.c: - msdk: Fix invalid return type build warning - void function cannot have return value - gst-plugins-bad/sys/msdk/gstmsdkbufferpool.c(332): warning C4098: - 'gst_msdk_buffer_pool_release_buffer': ... - -2018-12-24 23:05:55 +0900 Justin Kim <jeongseok.kim@sk.com> - - * ext/openal/gstopenalsink.h: - * ext/openal/gstopenalsrc.h: - * ext/openal/meson.build: - openal: Fix AL header path for Mac OS X - OpenAL.framework doesn't provide 'alext.h'. - Thus, openal is enabled only if the dependency - is set by pkg-config. - fixes: #852 - -2018-12-22 18:39:44 +0100 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/player/gstplayer.c: - player: Logging fix for updated audio info - Bitrate was logged a second time instead of the max_bitrate. - -2018-12-20 10:12:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Don't use deprecated API - -2018-12-18 13:50:43 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/transportreceivebin.c: - * ext/webrtc/transportreceivebin.h: - webrtc/receive-bin: block pads before dtlssrtpdec: - Fixes SSL errors in fast-start scenarios and whenever media stream may - be received before an answer is set. - -2018-12-18 13:32:02 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: only change the receive state after setting the dtls-client - Doing so before will cause SSL errors with fast-start implementations - like Chrome or if media data arrives before an answer. - -2018-12-18 13:31:00 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: A couple of documentation fixes - set-*-description only takes the combined GstWebRTCSessionDescription - object - -2018-12-16 11:02:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklinkvideosink: Fix support for raw CEA608 input and add support for raw CEA708 input - The former was only considering the first byte pair, for the latter we - have to convert raw CEA708 cc_data into CDP. - -2018-12-13 14:27:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/ccconverter.c: - * tests/check/meson.build: - ccconverter: Add unit test - -2018-12-12 14:59:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/Makefile.am: - * ext/closedcaption/gstccconverter.c: - * ext/closedcaption/gstccconverter.h: - * ext/closedcaption/gstclosedcaption.c: - * ext/closedcaption/meson.build: - closedcaption: Add ccconverter element that can convert between different types of Closed Caption formats - -2018-12-18 15:25:58 -0500 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/tinyalsa/meson.build: - Fix build when we have tinyalsa but not its header - -2018-12-18 22:07:48 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/meson.build: - tests: Re-enable isoff test on Windows - ... and drop libxml2 dependency since it never be used by - both test and gstisoff. - -2018-12-16 22:46:02 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/elements/parser.h: - tests: Fix build with MSVC - -2018-12-18 21:16:43 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * meson.build: - * tests/check/meson.build: - meson: Prefer to use join_paths() over '/' - ... to avoid mixing '/' and '\' in a path string on Windows. - -2018-12-07 23:22:08 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * meson.build: - * tests/check/meson.build: - * tests/meson.build: - tests: Enable unit test on Windows - Allow run some unit tests on Windows. - * Add dependency explicitly for some test cases, otherwise plugins couldn't be - loaded on uninstalled environment of Windows. - * Add missing GST_PLUGIN_LOADING_WHITELIST on meson build. - -2018-11-06 22:07:52 +0000 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Accept underscore in property - Otherwise sdi_mode and similar properties would be canonicalised to - sdi-mode. - -2018-12-18 15:41:09 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: fix tmp_kmsmem leaks - configure_mode_setting() keeps a ref on tmp_kmsmem which is released in - gst_kms_sink_show_frame(). - But if for some reason configure_mode_setting() is re-called before - showing a frame or if none is showed this memory was leaked. - -2018-12-18 00:34:44 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * meson.build: - * sys/Makefile.am: - * sys/acmenc/Makefile.am: - * sys/acmenc/acmenc.c: - * sys/acmmp3dec/Makefile.am: - * sys/acmmp3dec/acmmp3dec.c: - * sys/meson.build: - Remove acmmp3dec and acmenc plugins - ACM is an ancient legacy API, and there's no point in - keeping it around for a licensed mp3 decoder now that - mp3 patents have expired and we have a decoder in -good. - We didn't ship this in cerbero anyway. If there's a good - case for the AAC encoder (which is LC only anyway) someone - should write a new plugin based on current APIs, that can - actually be built out of the box. - Fixes #850 - -2018-12-17 18:58:52 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/opencv/meson.build: - meson: fix opencv=disabled case if opencv is available on the system - ext/opencv/meson.build:103:2: ERROR: Unknown variable "gstopencv_dep". - -2018-12-17 11:18:06 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/wildmidi/meson.build: - meson: wildmidi detection fixes - Need at least 0.4.2 apparently. - ext/wildmidi/meson.build:11:2: ERROR: String '' cannot be converted to int - -2018-12-17 08:43:57 +0100 Jonathan Karlsson <jonakn@axis.com> - - * ext/curl/gstcurlhttpsink.c: - curlhttpsink: free content type before assigning it - Not doing this would result in a memory leak. - -2018-12-17 08:07:26 +0100 Jonathan Karlsson <jonakn@axis.com> - - * ext/curl/gstcurlbasesink.c: - curlbasesink: cleanup transfer immediately when done - -2018-12-05 01:29:18 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/fdkaac/gstfdkaacdec.c: - * ext/fdkaac/gstfdkaacenc.c: - fdkaac: Syntax tweaks to increase readability - Mostly move some assignments out of conditionals that gst-indent - completely destroys. - -2018-12-04 18:33:09 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/fdkaac/gstfdkaacdec.c: - fdkaacdec: Enable 8-channel playback - The decoder seems to default to 6 channels max, downmixing 7.1 to 5.1. - Disable the channel limit to expose all channels to GStreamer. - In addition, none of the standard configurations use ACT_SIDE channels. - The rear channels of the 7.1 configuration have to be taken from - ACT_BACK. See the table in aacenc_lib.h, reproduced here: - ---------------------------------------------------------------------------------------- - ChannelMode | ChCfg | Height | front_El | side_El | back_El | lfe_El - -----------------------+-------+--------+---------------+----------+----------+--------- - MODE_1 | 1 | NORM | SCE | | | - MODE_2 | 2 | NORM | CPE | | | - MODE_1_2 | 3 | NORM | SCE, CPE | | | - MODE_1_2_1 | 4 | NORM | SCE, CPE | | SCE | - MODE_1_2_2 | 5 | NORM | SCE, CPE | | CPE | - MODE_1_2_2_1 | 6 | NORM | SCE, CPE | | CPE | LFE - MODE_1_2_2_2_1 | 7 | NORM | SCE, CPE, CPE | | CPE | LFE - MODE_6_1 | 11 | NORM | SCE, CPE | | CPE, SCE | LFE - MODE_7_1_BACK | 12 | NORM | SCE, CPE | | CPE, CPE | LFE - -----------------------+-------+--------+---------------+----------+----------+--------- - MODE_7_1_TOP_FRONT | 14 | NORM | SCE, CPE | | CPE | LFE - | | TOP | CPE | | | - -----------------------+-------+--------+---------------+----------+----------+--------- - MODE_7_1_REAR_SURROUND | 0 | NORM | SCE, CPE | | CPE, CPE | LFE - MODE_7_1_FRONT_CENTER | 0 | NORM | SCE, CPE, CPE | | CPE | LFE - ---------------------------------------------------------------------------------------- - - NORM: Normal Height Layer. - TOP: Top Height Layer. - BTM: Bottom Height Layer. - - SCE: Single Channel Element. - CPE: Channel Pair. - LFE: Low Frequency Element. - Restores 8 channels to - https://www2.iis.fraunhofer.de/AAC/7.1auditionOutLeader_v2_rtb.mp4 - -2018-12-04 18:06:26 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * configure.ac: - * ext/fdkaac/gstfdkaacenc.c: - * ext/fdkaac/meson.build: - fdkaacenc: Add support for v2.0.0 and its configurations - These are MPEG-standard configurations so should be checked first, - before the PCE clones added by v0.1.4. - -2018-12-04 18:04:28 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/fdkaac/gstfdkaacenc.c: - fdkaacenc: Add support for MPEG configuration 7 - -2018-12-04 18:04:06 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/fdkaac/gstfdkaacenc.c: - fdkaacenc: Add a description of each configuration - -2018-12-04 17:57:15 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/fdkaac/gstfdkaacenc.c: - fdkaacenc: Prefer REAR for surround channels - We (currently?) prefer to use the REAR positions for what MPEG calls - "surround" channels. - -2018-12-16 23:45:32 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * ext/Makefile.am: - * ext/daala/Makefile.am: - * ext/daala/gstdaala.c: - * ext/daala/gstdaaladec.c: - * ext/daala/gstdaaladec.h: - * ext/daala/gstdaalaenc.c: - * ext/daala/gstdaalaenc.h: - * ext/meson.build: - Remove daala plugin - Not so useful now that all effort is focused on AV1 instead. - Was only ever enabled with --enable-experimental anyway. - Fixes #848 - -2018-12-17 12:30:27 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openal/meson.build: - * ext/opencv/gsttemplatematch.cpp: - * ext/opencv/meson.build: - * ext/sndfile/meson.build: - meson: Add libsinc to the CFLAGS - Otherwise gst-i18n-plugin.h can't be found. - -2018-12-17 00:26:47 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/meson.build: - * ext/openni2/meson.build: - * meson_options.txt: - meson: build openni2 plugin - -2018-12-17 00:19:37 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/meson.build: - * ext/openmpt/meson.build: - * meson_options.txt: - meson: build openmpt plugin - -2018-12-17 00:11:16 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/meson.build: - * ext/openexr/meson.build: - * meson_options.txt: - meson: build openexr plugin - -2018-12-17 00:00:11 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/meson.build: - * ext/openal/meson.build: - * meson_options.txt: - meson: build openal plugin - -2018-12-16 20:27:56 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/meson.build: - * ext/sndfile/meson.build: - * meson_options.txt: - meson: build sndfile plugin - -2018-12-16 20:18:11 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/freeverb/meson.build: - meson: install freeverb preset file - -2018-12-16 20:13:08 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/meson.build: - * ext/voamrwbenc/meson.build: - * meson.build: - * meson_options.txt: - meson: build voamrwbenc plugin - -2018-12-16 20:02:07 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/meson.build: - * ext/teletextdec/meson.build: - * meson_options.txt: - meson: build teletext plugin - -2018-12-16 18:45:53 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/meson.build: - * ext/modplug/meson.build: - * meson_options.txt: - meson: build modplug plugin - -2018-12-16 18:07:48 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/meson.build: - * ext/wildmidi/meson.build: - * meson_options.txt: - meson: build wildmidi plugin - -2018-12-16 17:35:58 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/dc1394/meson.build: - * ext/meson.build: - * meson_options.txt: - meson: build dc1394 plugin - -2018-12-16 01:05:25 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/meson.build: - * ext/ofa/meson.build: - * meson_options.txt: - meson: build ofa plugin - -2018-12-16 00:56:50 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/gme/meson.build: - * ext/meson.build: - * meson_options.txt: - meson: build gme plugin - -2018-12-16 00:41:23 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson_options.txt: - * sys/meson.build: - * sys/vdpau/meson.build: - meson: build vdpau plugin - -2018-12-15 20:02:48 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson_options.txt: - * sys/meson.build: - * sys/tinyalsa/meson.build: - meson: build tinyalsa plugin - -2018-12-15 18:24:11 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson_options.txt: - * sys/meson.build: - * sys/vcd/meson.build: - meson: build vcdsrc plugin - -2018-12-16 23:35:58 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/Makefile.am: - * ext/meson.build: - * ext/spc/Makefile.am: - * ext/spc/gstspc.c: - * ext/spc/gstspc.h: - * ext/spc/tag.c: - * ext/spc/tag.h: - Remove spc plugin - Replaced by gme plugin. Fixes #467 - -2018-12-11 14:12:13 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - * ext/closedcaption/gstccextractor.c: - closedcaption: Use new API for converting GstVideoCaptionType from/to GstCaps - -2018-12-10 15:54:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstcccombiner.c: - * ext/closedcaption/gstccextractor.c: - * ext/closedcaption/gstline21dec.c: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - closedcaption: Replace GST_VIDEO_CAPTION_TYPE_CEA608_IN_CEA708_RAW with CEA608_S334_1A - As a side-effect we can now actually store the line offset in the - line21dec element, and have to perform fewer transformations in the - decklink elements (which were also buggy as they assumed a single byte - triplet per meta). - -2018-12-10 15:43:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstline21dec.c: - line21dec: If CCs are not found at the previous line, reset and search from the beginning again - -2018-12-10 15:42:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstline21dec.c: - line21dec: Don't read more lines than the height of the frame - -2018-12-14 19:55:32 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst/removesilence/meson.build: - removesilence: add libm to meson.build - -2018-12-14 17:09:01 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst/removesilence/gstremovesilence.c: - * gst/removesilence/gstremovesilence.h: - removesilence: reset filter on start and on segment events - -2018-12-14 15:48:09 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst/removesilence/gstremovesilence.c: - removesilence: improve documentation - -2018-11-26 16:40:01 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst/removesilence/gstremovesilence.c: - * gst/removesilence/vad_private.c: - * gst/removesilence/vad_private.h: - removesilence: add threshold property - silence thresold was hardcoded to -60 dB, now it is configurable - using this new property - Closes #63 - -2018-11-26 16:39:16 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst/removesilence/gstremovesilence.c: - * gst/removesilence/gstremovesilence.h: - removesilence: add properties to detect silence only after minimum silence time/buffers - Closes #63 - -2018-11-26 16:38:37 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst/removesilence/gstremovesilence.c: - * gst/removesilence/gstremovesilence.h: - removesilence: add silent property to control bus message notifications - Closes #63 - -2018-11-26 16:37:40 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst/removesilence/gstremovesilence.c: - * gst/removesilence/gstremovesilence.h: - removesilence: post bus messages when silence is detected/finished - Closes #63 - -2018-11-26 16:36:18 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst/removesilence/gstremovesilence.c: - * gst/removesilence/gstremovesilence.h: - removesilence: add squash property - allows to output buffers without timestamp gap when silence is removed - Closes #63 - -2018-12-14 12:22:51 +0900 Justin Kim <jeongseok.kim@sk.com> - - * sys/applemedia/meson.build: - sys: applemedia: meson: Add dependencies by using appleframeworks - gst-build#13 - -2018-12-03 16:18:32 +0900 Wonchul Lee <w.lee@lge.com> - - * configure.ac: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: Avoid race condition on multi-threaded client - When waylandsink is used on some other thread than the main wayland - client thread, the waylandsink implementation is vulnerable to a - condition related to registry and surface events which handled in - seperated event queue. - The race that may happen is that after a proxy is created, but - before the queue is set, events meant to be emitted via the yet to - set queue may already have been queued on the wrong queue. - Wayland 1.11 introduced new API that allows creating a proxy - wrappper which can help to avoid this race condition. - -2018-12-03 11:59:46 +0900 Wonchul Lee <w.lee@lge.com> - - * tests/examples/waylandsink/Makefile.am: - * tests/examples/waylandsink/meson.build: - * tests/examples/waylandsink/wayland-threads.c: - examples/wayland: Add wayland multi-thread client example - This is for testing race condition with multi-thread wayland client - environment. The race condition will be resolved with wayland proxy - wrapper API when handling event queue. - -2018-12-01 22:42:53 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - h26{4,5}parse: Don't confuse nal of codec_data with frame - vps/sps/pps in codec_data shouldn't be considered as inband data. - Otherwise, h26{4,5}parse never insert them to nal when transform - (packetized to byte-stream) use case - -2018-11-20 04:09:52 -0600 Matthew Waters <matthew@centricular.com> - - * sys/nvdec/gstnvdec.c: - nvdec: Rely on upstream's value for interlace-mode with hevc - The nvdec API doesn't seem to produce interlacing information with hevc - streams so rely on upstreams value for interlace-mode - -2018-12-12 15:24:18 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvpp.c: - msdk: change the wait time for encoder and vpp - In MSDK samples, the wait time for encoder, decoder and vpp is - 300000. Let's set the wait time to the same value in msdk plugin - -2018-12-12 13:45:34 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdk: correct the error message - It is VPP session instead of Encoder session - -2018-12-12 12:52:46 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkvpp.c: - msdk: check the created context against NULL pointer - gst_msdk_context_new_with_parent() may return NULL - -2018-12-11 15:54:51 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkcontext.c: - msdk: decrease the reference count of object - Otherwise there are reference leaks if failed to clone or join a - mfx session - -2018-12-11 15:04:12 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: assign the returned value to status variable - Othervise the subsequent check will use the stale value of status - variable - -2018-11-27 15:56:03 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - msdkh265enc: output main-10 bitstream if the input is P010_10LE - Tested on KBL using the following command: - gst-launch-1.0 videotestsrc num_buffers=100 ! video/x-raw,format=P010_10LE ! \ - msdkh265enc ! filesink location=a.hevc - This fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/829 - -2018-11-27 19:22:16 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - msdkh265enc: add P010_10LE to the sink pad template - -2018-11-27 15:55:51 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - msdkh265enc: re-add the sink pad template - We will add more profiles in the sink caps of msdkh265enc, so let - msdkh265enc re-add the sink pad template. Note this change doesn't - impact any capability - -2018-11-27 16:08:42 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: handle P010_10LE input format - Note it is up to each codec to support P010_10LE format - -2018-11-27 15:52:56 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: use macro GST_VIDEO_INFO_FORMAT if possible - -2018-11-27 22:28:15 -0600 Matthew Waters <matthew@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklink: calculate the decklink output time from the internal clock - Fixes the time calculations when dealing with a slaved clock (as - will occur with more than one decklink video sink), when performing - flushing seeks causing stalls in the output timeline, pausing. - Tighten up the calculations by relying solely on the internal time - (from the internal clock) for determining when to schedule display - frames instead attempting to track pause lengths from the external - clock and converting to internal time. This results in a much easier - offset calculation for choosing the output time and ensures that the - clock is always advancing when we need it to. - This is fixup to the 'monotonically increasing output timestamps' goal - in: bf849e9a69442f7a6f9d4f0a1ef30d5a8009f689 - -2018-11-29 19:22:51 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/mpegvideoparse.c: - * tests/files/Makefile.am: - * tests/files/mpeg2-es-with-cea708-cc.dat: - tests: mpegvideoparse: add unit test for CEA-708 closed captions extraction - -2018-11-28 17:05:33 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstmpegvideoparse.h: - mpegvideoparse: extract CEA-708 closed captions - -2018-12-10 16:14:07 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/mpegtsmux.c: - mpegtsmux: Change unit test to not generate zero-sized buffers ever - -2018-12-10 16:13:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: Handle zero-sized buffers correctly without going into an infinite loop - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/844 - -2018-11-29 13:49:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Don't crash if playbin is not available but kill the process cleanly - -2018-12-07 16:52:39 +1100 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/meson.build: - androidmedia: also install java sources - As needed by our ndk-build integration - -2018-12-05 19:01:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstccextractor.c: - * tests/check/elements/ccextractor.c: - ccextractor: Copy over timecode meta from the input buffers to the outgoing caption buffers - Formats like SCC and MCC work based on timecodes so ideally we pass - through the timecodes when writing them. - -2018-12-05 18:46:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstccextractor.c: - * ext/closedcaption/gstccextractor.h: - * tests/check/elements/ccextractor.c: - ccextractor: Include framerate in the closedcaption caps - It depends on the framerate how many cc_data byte pairs are allowed per - frame, and the framerate is also needed for converting into the CDP or - MCC format as the framerate is part of the header metadata. - -2018-12-05 17:55:14 +0100 Patricia Muscalu <patricia@axis.com> - - * ext/curl/gstcurlbasesink.c: - curlbasesink: Rename curl transfer thread - Some systems restrict the length of thread names to 16 bytes. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/838 - -2018-12-05 13:10:11 +0000 Philippe Normand <philn@igalia.com> - - * ext/meson.build: - * ext/wpe/WPEThreadedView.cpp: - * ext/wpe/WPEThreadedView.h: - * ext/wpe/gstwpesrc.cpp: - * ext/wpe/gstwpesrc.h: - * ext/wpe/meson.build: - * meson_options.txt: - wpe: Add a source element acting as a Web Browser based on WebKit WPE - The wpe element is used to produce a video texture representing a web page - rendered off-screen by WPE. This element can be used to overlay HTML on top of - another video stream for instance. - -2018-11-19 11:39:50 +0100 Jonathan Karlsson <jonakn@axis.com> - - * ext/curl/gstcurlhttpsink.c: - curlhttpsink: Enable content type changes - Makes it possible to change content type without having to - reinitialize the element, typically after reset. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/41 - -2018-12-05 10:10:39 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/fdkaac/gstfdkaacdec.c: - fdkaacdec: Use WAV channel mapping instead of interleave setting - The latter is going away in libfdk-aac 2.0.0. Instead, MPEG-style output - is always non-interleaved and WAV-style output is always interleaved. - Earlier libfdk-aac also defaults interleaving accordingly. - Since our reordering looks at the associated PCE indices instead of the - actual channel order, we're agnostic to the mapping. - For https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/825 - -2018-12-04 17:54:42 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/fdkaac/gstfdkaacenc.c: - fdkaacenc: Remove MODE_2_1 - This is not a standard mode and no longer supported by fdk-aac 2.0.0. - For https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/825 - -2018-12-05 17:24:20 -0300 Thibault Saunier <tsaunier@igalia.com> - - * common: - Automatic update of common submodule - From cd1dee0 to 59cb678 - -2018-12-05 19:58:44 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/webrtc/meson.build: - meson: Add missing gio dep to webrtcbin plugin - It's usually pulled in implicitly through gstsdp_dep, but it's - actually a private dependency there. Fixes a build failure on Windows - with newer Meson. - -2018-12-04 16:15:22 +0530 Naveen Cherukuri <naveen.cherukuri@xilinx.com> - - * sys/kms/gstkmssink.c: - kmssink: Avoiding get_property to take ownership of object members - Double free will happen if application frees string retuned by _get_property - -2018-11-28 12:39:58 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/msdk_libva.c: - msdk: add missing breaks - -2018-11-28 11:15:28 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkbufferpool.c: - msdk: fix the wrong operator - The condition is for video memory only, so the operator should be - & instead of | - -2018-09-27 15:33:32 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/videoparsers/gsth265parse.c: - h265parse: process SEI recovery point - Similar change as the on I did in h264parse. We want to process SEI - recovery point as keyframe so muxers will mark them as seek points and - decoders will be able to start decoding from them rather than waiting - for an IDR. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/790 - -2018-09-27 15:33:32 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - h265parser: parse SEI recovery point - Copied the implementation from h264parser and adapted it to the HEVC - syntax. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/790 - -2018-09-19 09:07:10 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/videoparsers/gsth265parse.c: - h265parse: parse SEI messages - Don't do anything with them yet. I just copied the parsing and - processing logic from h264parse. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/790 - -2018-09-19 10:06:15 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: mark SEI Recovery Point as keyframes - The spec states that "recovery point SEI message assists a decoder in - determining when the decoding process will produce acceptable - pictures for display after the decoder initiates random access or after the - encoder indicates a broken link in the coded video sequence." - Mark those as keyframes so muxers will mark them as seek points and - decoders will be able to start decoding from them rather than waiting - for an IDR. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/790 - -2018-11-23 11:51:04 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: Don't duplicate VPS/SPS/PPS per config-interval if exists - Don't need to manually insert VPS/SPS/PPS since inband data could be useable. - Also fixes #824 - -2018-11-23 11:28:44 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: Don't duplicate SPS/PPS per config-interval if exists - Don't need to manually insert SPS/PPS since inband data could be useable. - Fixes #824 - -2018-11-26 00:58:16 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/ipcpipeline/meson.build: - * tests/examples/ipcpipeline/meson.build: - * tests/examples/meson.build: - * tests/examples/opencv/meson.build: - meson: build opencv and ipcpipeline examples - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/576 - -2018-11-29 11:24:39 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/closedcaption/gstceaccoverlay.c: - cc708overlay: fix deadlock - We would forget to unlock when a caption data buffer is deemed - out of segment, which makes everything lock up next time buffers - are received. - -2018-11-28 13:35:35 +0200 Jordan Petridis <jordan@centricular.com> - - * ext/dtls/gstdtlsagent.c: - * ext/dtls/gstdtlscertificate.c: - * ext/dtls/gstdtlsconnection.c: - * ext/webrtc/gstwebrtcice.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/decklink/win/DeckLinkAPI_i.c: - * sys/winks/ksdeviceprovider.c: - * tests/check/libs/planaraudioadapter.c: - Run gst-indent through the files - This is required before we enabled an indent test in the CI. - https://gitlab.freedesktop.org/gstreamer/gstreamer-project/issues/33 - -2018-11-20 10:37:47 +0000 Maciej Wolny <maciej.wolny@codethink.co.uk> - - * gst-libs/gst/webrtc/rtpreceiver.h: - webrtc: Remove duplicate declarations - This causes 'redefinition of typedef ...' errors on GCC 4.5.3 - -2018-11-27 16:06:53 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/hls/gsthlssink2.c: - hlssink2: Fix string leak - Need to free allocated string memory on _finalize() - -2018-11-16 13:58:22 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - msdk: remove unnecessary assignment - CodecProfile will be set in MFXVideoDECODE_DecodeHeader() to match - the input stream. Setting the hard-coded profile here will mislead - user that msdkh265dec supports a special profile only. - -2018-11-16 08:56:34 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - msdk: update the sink and src caps of msdkh265dec - Now hevc 10bit video can be decoded correctly, so update the sink - and src caps accordingly. - This fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/720 - -2018-11-19 22:24:33 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: set right BitDepth and Shift for P010 mfx frame - BitDepth is 10 and Shitf must be set to 1 when creating P010 mfx - frame in MSDK - -2018-11-19 15:34:38 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - msdk: don't use hard-coded video format - Some codecs may support varied formats, e.g. HEVC may support NV12 - and P010_10LE etc - -2018-11-16 20:01:52 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: adjust the RT format for P010 surface - According to VA API, VA_RT_FORMAT_YUV420_10 is expected for P010 - surface - -2018-11-16 14:36:31 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: create VA_FOURCC_P010 surface from dmabuf - -2018-11-16 14:32:29 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: VA_FOURCC_P010 frame lock - P010 and NV12 have the same layout, so we may reuse the code in - gst_msdk_frame_lock() - -2018-11-16 16:42:43 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/msdk_libva.c: - msdk: map MFX_FOURCC_P010 to VA_FOURCC_P010 - -2018-11-16 14:18:36 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdksystemmemory.c: - msdk: make sure the surface data is set for GST_VIDEO_FORMAT_P010_10LE - P010_10LE and NV12 have the same layout, so we may reuse the code. - -2018-10-19 16:23:21 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/msdk.c: - msdk: map GST_VIDEO_FORMAT_P010_10LE to MFX_FOURCC_P010 - -2018-11-16 14:00:02 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: add an assert in gst_msdk_frame_lock() for unhandled formats - We will add support for more formats, e.g. P010, Adding an assert - here may catch the error early - -2018-10-19 16:23:34 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkh265dec.c: - msdk: use separate src caps for msdkh265dec - We will add more formats in the src caps of msdkh265dec, so let - msdkh265dec uses separate src caps. Note it doesn't change any - capability - -2018-11-20 15:17:44 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdk: Make sure a variable is initialized when it is used - Previously alloc_info is initialized when both thiz->initialized - and thiz->allocation_caps are true, but only thiz->initialized is - checked when alloc_info is used. - -2018-11-20 14:21:54 +0800 Xiang, Haihao <haihao.xiang@intel.com> - - * sys/msdk/gstmsdkvideomemory.c: - msdk: Close fd handle - Otherwise it will result in resource leak if mem == NULL - -2018-11-25 20:27:25 +0100 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/gsthanddetect.cpp: - opencv: define CASCADE_DO_CANNY_PRUNING for opencv < 4 - -2018-11-25 16:13:28 +0100 Nicola Murino <nicola.murino@gmail.com> - - * configure.ac: - * ext/opencv/MotionCells.cpp: - * ext/opencv/MotionCells.h: - * ext/opencv/camerautils.hpp: - * ext/opencv/gstcameracalibrate.cpp: - * ext/opencv/gstcameraundistort.cpp: - * ext/opencv/gstcvdilate.cpp: - * ext/opencv/gstcvequalizehist.cpp: - * ext/opencv/gstcverode.cpp: - * ext/opencv/gstcvlaplace.cpp: - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstcvsobel.cpp: - * ext/opencv/gstdewarp.h: - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstdisparity.h: - * ext/opencv/gstedgedetect.cpp: - * ext/opencv/gstfaceblur.cpp: - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gstgrabcut.cpp: - * ext/opencv/gstgrabcut.h: - * ext/opencv/gsthanddetect.cpp: - * ext/opencv/gsthanddetect.h: - * ext/opencv/gstretinex.cpp: - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstsegmentation.h: - * ext/opencv/gstskindetect.cpp: - * ext/opencv/gsttemplatematch.cpp: - * ext/opencv/gsttextoverlay.h: - * ext/opencv/meson.build: - * gst-libs/gst/opencv/gstopencvutils.cpp: - * gst-libs/gst/opencv/gstopencvvideofilter.cpp: - * gst-libs/gst/opencv/meson.build: - opencv: make compatible with opencv 4 - Closed #826 - -2018-11-25 16:12:40 +0100 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/MotionCells.cpp: - * ext/opencv/camerautils.cpp: - * ext/opencv/gstcameracalibrate.cpp: - * ext/opencv/gstcameraundistort.cpp: - * ext/opencv/gstcvlaplace.cpp: - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstcvsobel.cpp: - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstedgedetect.cpp: - * ext/opencv/gstfaceblur.cpp: - * ext/opencv/gstgrabcut.cpp: - * ext/opencv/gsthanddetect.cpp: - * ext/opencv/gstretinex.cpp: - * ext/opencv/gstsegmentation.cpp: - * gst-libs/gst/opencv/gstopencvutils.cpp: - * gst-libs/gst/opencv/gstopencvvideofilter.cpp: - opencv: fix indentation - -2018-11-27 16:22:04 +0800 Wangfei <fei.w.wang@intel.com> - - * configure.ac: - configure.ac: add gst-allocator check in msdk. - With out check gst-allocator, there will be a gst-allocator api - symbol link error when call for libgstmsdk.so. - -2018-11-21 08:43:56 -0600 Matthew Waters <matthew@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklink: fixup internal time tracking over buffering pauses - Instead of relying on buffers after a state change to PLAYING to always start - from 0, track the amount of time we have spent outside playing but not changed - state to PAUSED. - -2018-11-26 16:53:52 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtc: fix tests for no libnice - webrtcbin will fail the state change to READY when libnice elements are - not available. - -2018-11-26 16:50:17 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/utils.c: - * ext/webrtc/utils.h: - * ext/webrtc/webrtcdatachannel.c: - * ext/webrtc/webrtcsdp.c: - * ext/webrtc/webrtcsdp.h: - * tests/check/elements/webrtcbin.c: - tests/webrtc: use the existing functions in the plugin - Instead of redefining our own, use the function implementations in - webrtcsdp.c and utils.c - -2018-11-26 16:21:58 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: fix typo in RTCRemoteOutboundRTPStreamStats - -2018-11-26 16:21:19 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: add a few comments on bundle and src pad exposure - -2018-11-26 16:20:02 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: factor out dtls fingerprint setting - -2018-11-26 16:12:03 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: remove extra 'pad' from log line - -2018-11-26 16:07:57 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/transportstream.c: - * ext/webrtc/transportstream.h: - * ext/webrtc/webrtcsdp.c: - * ext/webrtc/webrtcsdp.h: - * ext/webrtc/webrtctransceiver.c: - * ext/webrtc/webrtctransceiver.h: - webrtc: move some functions to the appropriate files - -2018-11-26 11:26:52 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/meson.build: - meson: Fix Windows CUDA dependency check - Python returns 'None' string for unknown environment - -2018-11-22 17:18:18 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvenc/gstnvh265enc.c: - nvh265enc: Fix email address typo - -2018-11-22 16:14:12 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: Fix undefined reference build error on MSVC and CUDA 9.1 - -2018-11-22 14:01:28 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvenc/gstnvh264enc.c: - * sys/nvenc/gstnvh265enc.c: - nvenc: Fix MSVC build error C2121 - -2018-11-22 12:14:44 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * configure.ac: - * meson_options.txt: - * sys/meson.build: - * sys/nvenc/Makefile.am: - * sys/nvenc/gstnvenc.c: - * sys/nvenc/gstnvenc.h: - * sys/nvenc/meson.build: - nvenc: Add meson build with Windows support - Note that, since Nvidia does not provide nvEncodeAPI.lib file, - find_library() couldn't be used for build on Windows. - This patch changes to load nvEncodeAPI(64).dll or libnvidia-encode.so - in runtime - -2018-11-19 22:40:50 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * meson_options.txt: - * sys/meson.build: - * sys/nvdec/meson.build: - nvdec: Add meson build with Windows support - -2018-11-22 00:22:25 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * configure.ac: - * sys/nvdec/Makefile.am: - * sys/nvdec/dynlink_cuda.c: - * sys/nvdec/dynlink_nvcuvid.c: - * sys/nvdec/gstnvdec.c: - * sys/nvdec/gstnvdec.h: - nvdec: Drop dynlink interface and use NVIDIA CODEC SDK instead - dynlink_* was introduced since CUDA Toolkit 9.x but it's deprecated from 10.0. - Instead of using #ifdef hack, shipping nvidia headers of NVIDA CODEC SDK - can make build/code simple - -2018-11-22 10:57:00 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvdec/cuviddec.h: - * sys/nvdec/nvcuvid.h: - * sys/nvenc/nvEncodeAPI.h: - nvdec/nvenc: Shipping NVIDA Codec SDK headers - Add cuvidec.h, nvcuvid.h and nvEncodeAPI.h of NVIDIA Codec SDK 8.2.16 - -2018-11-15 21:52:27 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * configure.ac: - nvenc/nvdec: Add support CUDA Toolkit 10.0 - -2018-11-25 17:33:04 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/examples/codecparsers/meson.build: - examples: codecparser: fix compiler warnings for unstable API use - Breaks build bots and build with --werror - -2018-10-08 23:47:51 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/examples/camerabin2/gst-camera2.c: - * tests/examples/uvch264/test-uvch264.c: - examples: force gtk to x11 backend - Until someone makes it work with the wayland backend. - The code currenty assumes and hard-codes X11. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/49 - -2018-10-08 23:47:42 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/examples/audiomixmatrix/meson.build: - * tests/examples/avsamplesink/meson.build: - * tests/examples/camerabin2/meson.build: - * tests/examples/codecparsers/meson.build: - * tests/examples/directfb/meson.build: - * tests/examples/meson.build: - * tests/examples/mxf/meson.build: - * tests/examples/uvch264/meson.build: - * tests/icles/meson.build: - * tests/meson.build: - meson: build more examples - See https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/576 - -2018-11-24 19:26:30 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * meson.build: - meson: Specify encoding to UTF-8 when building with MSVC - Use build arguments consistent with core and -base. This can also - remove noisy "C4819" warning of non-us locale MSVC. - -2018-11-23 17:05:51 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/meson.build: - msdk: don't declare headers in meson - This partially reverts commit 0bae64835302574953c3e5e89fa0822eb4f6ca4b. - The compiler tells ninja the header dependency, then there is - no need to add them explicity. - -2018-11-23 13:41:57 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/meson.build: - msdk: declare headers in meson - -2018-11-20 14:36:30 +0800 Wangfei <fei.w.wang@intel.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/gstmsdkdecproputil.c: - * sys/msdk/gstmsdkdecproputil.h: - * sys/msdk/gstmsdkh264dec.c: - * sys/msdk/gstmsdkh264dec.h: - * sys/msdk/gstmsdkh265dec.c: - * sys/msdk/gstmsdkh265dec.h: - * sys/msdk/gstmsdkmpeg2dec.c: - * sys/msdk/gstmsdkmpeg2dec.h: - * sys/msdk/gstmsdkvc1dec.c: - * sys/msdk/gstmsdkvc1dec.h: - * sys/msdk/gstmsdkvp8dec.c: - * sys/msdk/gstmsdkvp8dec.h: - * sys/msdk/gstmsdkvp9dec.c: - * sys/msdk/gstmsdkvp9dec.h: - * sys/msdk/meson.build: - msdkdec: move output-order out of decode bass class. - Since output-order is a deprecated attribute, move it out of decode - bass class and configure it in each sub decoder class who need it. - https://bugzilla.gnome.org/show_bug.cgi?id=796853 - -2018-11-22 17:02:09 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/meson.build: - msdk: add support for open sourced MediaSDK - MediaSDK has been released as open source 1, but the directories - where it installs its files, are different from the binary only - distribution. - This patch adds to the libraries path the directory /lib. Also it - is defined in meson if the include directory has the mfx/ prefix, - something that is already handled in autotools. - 1. https://github.com/Intel-Media-SDK/MediaSDK - -2018-11-22 18:47:13 +0530 Harshad Khedkar <harshad@koperadev.com> - - * ext/webrtc/gstwebrtcice.c: - Webrtcbin : Need to use 'host' from gst_uri_get_host s libnice agent expects it - Currently master code of gst1-plugins-bad use plain-string host name while passing it to - libnice agent: nice_agent_set_relay_info() in gstwebrtcice.c while adding turn_server(_add_turn_server). - It is observered that if we don't convert the host parameter by using gst_uri_get_host, it fails in libnice agent(0.1.14-1). - Code does, actually, set the host correctly but while passing params to nice_agent_set_relay_info, it uses incorrect one. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/823 - -2018-11-12 12:03:53 +0100 Lars Petter Endresen <lars.petter.endresen@gmail.com> - - * gst/siren/common.c: - siren: Fix floating point invalid operation - Mix of single and double precision leads to zero-by-zero divide - for upper 64-bit of the xmm register, even though they are not - used. - -2018-11-14 14:55:37 -0800 Rosen Penev <rosenp@gmail.com> - - * ext/dtls/gstdtlsagent.c: - * ext/dtls/gstdtlscertificate.c: - dtls: Fix compilation without deprecated APIs on OpenSSL 1.1.x - -2018-11-13 18:20:15 +0900 Justin Kim <jeongseok.kim@sk.com> - - * ext/opencv/gstcameracalibrate.h: - cameracalibrate: Fix build error on Mac OSX - It fails to build only on Mac OSX with the following error. - In file included from ../subprojects/gst-plugins-bad/ext/opencv/gstopencv.cpp:45: - ../subprojects/gst-plugins-bad/ext/opencv/gstcameracalibrate.h:96:38: error: a space is required between consecutive right angle brackets (use '> >') - std::vector<std::vector<cv::Point2f>> imagePoints; - ^~ - > > - 1 error generated. - Fix: #817 - -2018-11-13 17:50:26 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/opensles/meson.build: - meson: Fix invalid keyword warning - "required" keyword is not a valid argument for has_header() - WARNING: Passed invalid keyword argument "required". - WARNING: This will become a hard error in the future. - -2018-11-13 10:02:57 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Cast result of bitwise-or of multiple enum values to the enum again - In C++ the bitwise-or results in an int, and ints are not implicitely - cast to enums. - See https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/merge_requests/25#note_78122 - -2018-11-13 09:55:56 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Remove unused variable - Fixes a compiler warning. - -2018-11-07 17:15:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklinkvideosink: Add support for outputting closed captions - -2018-11-12 13:23:45 +0200 Jordan Petridis <jordan@centricular.com> - - * .gitlab-ci.yml: - Add Gitlab CI configuration - This commit adds a .gitlab-ci.yml file, which uses a feature - to fetch the config from a centralized repository. The intent is - to have all the gstreamer modules use the same configuration. - The configuration is currently hosted at the gst-ci repository - under the gitlab/ci_template.yml path. - Part of https://gitlab.freedesktop.org/gstreamer/gstreamer-project/issues/29 - -2018-11-12 21:23:37 +1100 Matthew Waters <matthew@centricular.com> - - * ext/soundtouch/meson.build: - * ext/webrtcdsp/meson.build: - * meson.build: - build: link against the gnustl dependency on android for c++ plugins - -2018-11-09 15:20:09 +0000 Jochen Henneberg <jh@henneberg-systemdesign.com> - - * sys/bluez/gstavdtputil.c: - * sys/bluez/gstavdtputil.h: - avdtputil: Remove dead code - These function are not used at all, using them together with the - transport-volume property from avdtpsrc may end up in a binding loop so - we better remove the functions. - -2018-11-09 15:16:46 +0000 Jochen Henneberg <jh@henneberg-systemdesign.com> - - * sys/bluez/gstavdtpsrc.c: - * sys/bluez/gstavdtpsrc.h: - avdtpsrc: Fix transport-volume write - If properties are proxied through GBinding this can work only if the - proxied property keeps it's own value. The previous implementation will - read the original value if the proxied property signals a change and - thus nothing will happen. - -2018-10-18 14:49:50 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/srtp.c: - srtp: Add unit tests for MKI support - Both as a srtpenc ! srtpdec pipeline and as a test that uses - fake packets for multiple mixed MKIs. - https://bugzilla.gnome.org/show_bug.cgi?id=797305 - -2018-10-17 18:30:10 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpenc.c: - * ext/srtp/gstsrtpenc.h: - srtpenc: Add support for adding a MKI - https://bugzilla.gnome.org/show_bug.cgi?id=797305 - -2018-10-15 18:23:35 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Add support for MKI - Add support for MKIs which allow multiple keys to be used with a single SRTP stream. - https://bugzilla.gnome.org/show_bug.cgi?id=797305 - -2018-10-16 11:53:20 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/dshowsrcwrapper/CMakeLists.txt: - * sys/dshowsrcwrapper/dshowdeviceprovider.cpp: - * sys/dshowsrcwrapper/dshowdeviceprovider.h: - * sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp: - dshowsrcwrapper: add implementation of GstDeviceMonitor - Right now this only works for video. An attempt was made at adding - monitoring following the example winks, but it seems the only devices that - can be easily detected are KS sources, which winks already handles. - -2018-10-16 11:45:15 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - dshowsrcwrapper: refactor device selection, filter creation, and caps retrieval - This allows a future GstDeviceProvider to more easily query devices and caps. - -2018-10-12 10:12:14 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowsrcwrapper: add get_property implementation to sources - -2018-10-12 09:59:54 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowvideosrc: handle empty strings for device and device-name - The device and device-name properties should treat NULL and empty strings the same - -2018-10-12 08:57:07 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowvideosrc: delay selecting device until source is started - The previous behaviour had issues when setting one of the device properties - after _get_caps had been called. The device shouldn't be locked in until after - _start has been called. - -2018-10-12 08:49:06 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowvideosrc: fix template caps to reflect actual supported caps - -2018-10-11 12:58:35 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowsrcwrapper: add some helpful debug statements - -2018-10-15 12:49:55 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/winks/ksvideohelpers.c: - ksvideosrc: initialize pointer to satisfy MSVC - -2018-10-15 12:48:10 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/winks/ksvideohelpers.c: - ksvideosrc: support 'Y16 ' FOURCC as GRAY16_LE - The FLIR Boson USB provides 16-bit grayscale video using this FOURCC. - -2018-10-15 12:46:32 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/winks/gstksvideosrc.c: - ksvideosrc: gracefully handle device prop when empty string - -2018-11-08 08:15:41 +0000 Russel Winder <russel@winder.org.uk> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - mpegts: Register a number of new boxed types to support auto generation of bindings. - -2018-11-07 17:24:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Search from line 1 again if we didn't find closed captions at the same line as before - -2018-05-29 01:06:09 +1000 Matthew Waters <matthew@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: implement preliminary support for the bitrate query - Return the size / total duration as a ballpark estimate. - https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/issues/60 - -2018-10-14 16:36:33 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - h265parser: Various update of vps parsing - * Add FIXME for future correction of HRDParames parsing. - Spec. defines that the number of HRDParames could be up to - "vps_num_layer_sets_minus1 + 1" (i.e., 1024). - * Add parsing vps_base_layer_{internal,available}_flag. - * Fix possible invalid vps_extension parsing. - Fixes #798 - -2018-10-14 16:02:01 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * tests/check/libs/h265parser.c: - tests: h265parser: Add test parsing nonzero vps_max_layer_id in VPS - -2018-10-12 19:26:01 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: Fix wrong maximum range check in gst_h265_parse_vps() - Fix validation of some syntax. - Fixes #798 - -2018-10-29 21:51:14 +0200 Jordan Petridis <jordan@centricular.com> - - * sys/msdk/meson.build: - meson: avoid unkown variables in the msdk tests - -2018-11-06 18:47:43 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/dtls/Makefile.am: - * ext/dtls/meson.build: - dtls: Link against winsock2 on Windows - Should fix the Windows build after - b1509b1047bb76c9b2d8b14e9cecd0da72fd8e65. - -2018-11-06 11:06:01 -0600 admin <brad.reitmeyer@livingasone.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: fix segfault when audiosink is closed before videosink - -2018-11-06 16:50:29 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/dtls/gstdtlsconnection.c: - dtlsconnection: Print out errno info for syscall errors - As suggested in the SSL_get_error manpage1. Upgrade the message to a - warning if the errno isn't 0 (success). The latter apparently means the - transport encountered an EOF (shutdown) without the shut down handshake - on the (D)TLS level. This happens quite often for otherwise normal DTLS - connections. - 1: https://www.openssl.org/docs/man1.1.1/man3/SSL_get_error.html - -2018-03-29 13:33:10 +0200 Andreas Frisch <afrisch@make.tv> - - * ext/dtls/gstdtlsagent.c: - * ext/dtls/gstdtlsconnection.c: - dtls: Properly display all errors/warnings from ERR queue - Print out all errors from the OpenSSL error queue instead of just - looking at the topmost error. Using the callback interface also removes - the need for formatting using a buffer on the stack. - -2018-11-05 12:37:21 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/dtls/gstdtlsconnection.c: - dtlsconnection: Replace if-else chain with switch - A more idiomatic construct for testing a bunch of integers. - -2018-11-05 12:31:38 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/dtls/gstdtlsconnection.c: - dtlsconnection: Clear error queue before SSL_do_handshake - As documented on the SSL_get_error manpage1 we need to empty the - error queue before making any call that we check with SSL_get_error. - 1: https://www.openssl.org/docs/man1.1.1/man3/SSL_get_error.html - -2018-11-05 12:26:26 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/dtls/gstdtlsconnection.c: - dtlsconnection: Lower BIO error log level to DEBUG - Periodic SSL_ERROR_SYSCALL errors with errno == 0 seem to be normal - behavior for DTLS connections. - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/677 - -2018-11-06 17:08:35 +0100 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/dtls/gstdtlsconnection.c: - dtlsconnection: Run gst-indent - -2018-11-05 17:00:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/cccombiner.c: - * tests/check/meson.build: - cccombiner: Add unit test - -2018-11-05 16:24:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/Makefile.am: - * ext/closedcaption/gstcccombiner.c: - * ext/closedcaption/gstcccombiner.h: - * ext/closedcaption/gstclosedcaption.c: - * ext/closedcaption/meson.build: - cccombiner: Add new closed caption combiner element - This is the inverse of ccextractor: it takes a video and closed caption - stream and places the closed caption metas on the video output buffers. - -2018-11-05 17:07:32 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstccextractor.c: - ccextractor: Handle multiple caption metas per buffer - -2018-11-06 12:40:12 +0100 Florent Thiéry <florent.thiery@ubicast.eu> - - * sys/msdk/meson.build: - msdk: fix intel sdk libdir path - the 2018.3.1 intel sdk release places libraries into /lib64 instead of - /lib/lin_x64 or /lib/x64, this commit adds /lib64 to the libdir - locations list - Fixes #815 - -2018-11-06 20:14:32 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Fix calculating buffer size of packed format - The Pitch (i.e., stride) of D3DLOCKED_RECT structure is already - respecting required stride value. - -2018-11-04 22:41:50 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Set actual buffer size to buffer pool - If configured size of buffer pool and actual buffer size are mismatched, - pool will do unwanted buffer resize. - Fixes #801 - -2018-11-03 20:52:20 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Use lock/cond to wait internal window construction - We can save one (or possibly more) sleep time by using lock/cond - -2018-11-03 20:20:50 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: Don't leak GThread object - Need to call g_thread_join() to avoid leak - -2018-10-30 22:49:01 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: Print lock/unlock log with trace debug level - -2018-11-06 19:36:12 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Remove white space - -2018-11-02 15:53:56 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: Stop considering 6 bytes NAL complete - This is only TRUE for EOS / EOB NALs. Before this patch, passing - any valid 6 bytes of a NAL would make the parser pretend this NAL is - complete. - -2018-11-02 15:50:15 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/check/libs/h265parser.c: - h265parser: Add same parsing test as for H264 - This adds the same test as found in H264 test. - -2018-11-02 13:59:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/check/libs/h264parser.c: - h264parser: Add unit test parsing 5 valid bytes of a NAL - In the case 5 valid bytes of a slice NAL, the parser should return - NO_NAL_END. - -2018-11-02 14:18:54 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: Stop considering 5 bytes NAL complete - This is only TRUE for SEQ_END / STREAM_END. Before this patch, passing - any valid 5 bytes of a NAL would make the parser pretend this NAL is - complete. - -2018-11-06 14:35:20 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/meson.build: - applemedia: install plugin pkg-config file - -2018-11-05 15:21:35 +0000 Russel Winder <russel@winder.org.uk> - - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gst-dvb-section.h: - * gst-libs/gst/mpegts/gst-scte-section.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/gstmpegtssection.h: - mpegts: remove insignificant trailing whitespace from lines of files in the MPEG-TS library. - -2018-08-16 11:30:08 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: respect pixel format property even if mode is set to auto - Before this patch, if mode=auto and video-format!=auto, video-format would - always be ignored, and get set to 8bit-yuv, or if detected to be RGB444, then - it would be set to 8bit-argb. This change respects video-format if it is set - to 10bit-yuv (v210) or 8bit-bgra, even when mode=auto. - Closes #772 - -2018-11-05 05:39:12 +0000 Matthew Waters <matthew@centricular.com> - - * .gitmodules: - Update common submodule location - Remove the git directory - -2018-11-05 12:46:29 +0800 Haihao Xiang <haihao.xiang@intel.com> - - * .gitmodules: - * gst-plugins-bad.doap: - Clone the code from gitlab - This fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/814 - -2018-11-02 20:31:54 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/compositor/compositororc-dist.c: - * gst/compositor/compositororc-dist.h: - compositor: update disted orc backup files - -2018-11-02 20:31:11 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - docs: update for git master - -2018-11-02 20:16:56 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/webrtc/meson.build: - webrtc: update default libnice options - Uses feature options now. - -2018-11-02 12:21:45 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/ccextractor.c: - * tests/check/meson.build: - ccextractor: Add unit test - https://bugzilla.gnome.org/show_bug.cgi?id=797370 - -2018-11-02 12:21:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstccextractor.c: - ccextractor: Support changes of the caption type - https://bugzilla.gnome.org/show_bug.cgi?id=797370 - -2018-11-01 17:59:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Add support for extracing CEA608 according to S334-1 Annex A - https://bugzilla.gnome.org/show_bug.cgi?id=797363 - -2018-10-31 18:44:34 +0000 Russel Winder <russel@winder.org.uk> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: Register a boxed type for GstMpegtsContent - -2018-06-25 19:37:56 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/player/gstplayer.c: - player: don't change uri when setting subtitle uri - https://bugzilla.gnome.org/show_bug.cgi?id=797362 - -2018-11-01 10:44:44 +0000 Philippe Normand <philn@igalia.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - docs: Follow-up fix for GstPlayer new subtitle-video-offset API - These symbols were not renamed after the initial review in Bugzilla. - https://bugzilla.gnome.org/show_bug.cgi?id=797134 - -2018-10-28 14:48:35 +0000 Philippe Normand <philn@igalia.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - player: API additions for subtitle-video-offset property - This new property contols the synchronisation offset between subtitles and video - in nanoseconds. - https://bugzilla.gnome.org/show_bug.cgi?id=797134 - -2018-10-31 19:20:20 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/compositor/compositor.c: - compositor: Fix enum type mismatch - The variable blend_mode is GstCompositorBlendMode but it is - assigned to a GstCompositorOperator enum value. - -2018-10-30 10:05:03 +0100 Johan Bjäreholt <johanbj@axis.com> - - * gst/compositor/compositororc-dist.h: - compositor: fix undeclared functions - -2018-10-27 16:44:27 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/blend.c: - * gst/compositor/blend.h: - * gst/compositor/compositor.c: - * gst/compositor/compositor.h: - * gst/compositor/compositororc.orc: - * tests/examples/compositor/crossfade.c: - compositor: Implement different operators via per-pad property - This removes the crossfade-ratio property and replaces it with an - operator property. Currently this implements the following operators: - - SOURCE: Copy over the source and don't look at the destination - - OVER: Default blending of the source over the destination - - ADD: Like OVER but simply adding the alpha instead - See the example for how to implement crossfading with this. - https://bugzilla.gnome.org/show_bug.cgi?id=797169 - -2018-10-28 14:54:52 +0000 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson_options.txt: - * sys/msdk/meson.build: - meson: Add a feature option for the MSDK plugin - -2018-10-28 11:53:42 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/curl/meson.build: - * meson_options.txt: - meson: add 'curl-ssh2' option for curl libssh2 support - https://bugzilla.gnome.org/show_bug.cgi?id=797346 - -2018-10-28 06:47:38 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * ext/curl/meson.build: - meson: Use the 'curl' feature option - https://bugzilla.gnome.org/show_bug.cgi?id=797346 - -2018-10-28 11:07:47 +0000 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/mpegts/meson.build: - mpegts: Use gst and gst_mpegts as symbol prefix in the meson build - Just like we do in the autotools build. - -2018-10-11 12:45:21 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowaudiosrc.h: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - dshowsrcwrapper: add device-index property to sources - This allows users to more easily select different devices without having - to first get the device or device-name. - https://bugzilla.gnome.org/show_bug.cgi?id=797338 - -2018-10-24 14:16:38 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/dshowsrcwrapper/BUILD.txt: - dshowsrcwrapper: update CMake build instructions - GStreamer 1.8 is minimum version, and remove paragraph about 32 vs 64-bit build - https://bugzilla.gnome.org/show_bug.cgi?id=797338 - -2018-10-24 14:15:08 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/dshowsrcwrapper/CMakeLists.txt: - dshowsrcwrapper: support building 32- and 64-bit with CMake - https://bugzilla.gnome.org/show_bug.cgi?id=797338 - -2018-10-11 11:17:11 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp: - dshowsrcwrapper: add debug category for general dshowsrcwrapper - https://bugzilla.gnome.org/show_bug.cgi?id=797338 - -2018-10-27 17:55:54 +0200 Edward Hervey <edward@centricular.com> - - * tests/check/Makefile.am: - * tests/check/meson.build: - check: Disable mssdemux unit test for now - This is for the same reason as the dash tests. This should ideally - be converted to gst-validate tests. These tests randomly timeout also - due to the tests doing seeks from the streaming thread (sic). - -2018-10-27 13:57:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: Add boxed type for DVB CableDeliverySystem descriptor - -2018-10-27 12:37:07 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/Makefile.am: - * gst/compositor/compositor.c: - * gst/compositor/compositor.h: - * gst/compositor/compositorpad.h: - compositor: Remove extra header for the pad declaration - There's no reason for having this separate apart from making things less - discoverable. - -2018-10-27 13:37:38 +0200 Edward Hervey <edward@centricular.com> - - * tests/check/libs/player.c: - tests: Disable most gstplayer tests for now - https://bugzilla.gnome.org/show_bug.cgi?id=787374 - -2018-10-26 15:15:41 +0100 Luis de Bethencourt <luisbg@amazon.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: options is a placeholder argument - Make it clear this unused argument is there for planned future use. - -2018-10-26 14:36:37 +0100 Luis de Bethencourt <luisbg@amazon.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: ws-semantic is not supported - Don't offer something that isn't supported. - -2018-10-24 14:34:13 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Don't set state to READY if we're already stopped - Otherwise setting an URI after creation will already set the state - to READY/buffering and disallow setting the configuration. - See https://github.com/servo/servo/issues/22010 - -2018-10-22 09:59:24 +0200 Edward Hervey <edward@centricular.com> - - * ext/hls/gsthlsdemux-util.c: - hls: Remove stray '\n' from debug statement - -2018-10-17 18:33:12 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - Revert "srtpdec: also check for "roc" in caps" - This reverts commit 73ebdb888e047b14ceea19ce1a0bbbeff0cd7b2a. - This isn't needed and it breaks srtpenc ! srtpdec, specifying the - roll-over counter manually is an advanced feature. - Also revert "srtp: Add "roc" caps field to the gst-launch example" - This reverts commit 67ae35813bff9362065bbfec770f3fdbb89165a3. - https://bugzilla.gnome.org/show_bug.cgi?id=765079 - -2018-10-17 21:09:22 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/bayer/meson.build: - * gst/compositor/meson.build: - * gst/fieldanalysis/meson.build: - * gst/gaudieffects/meson.build: - meson: Replace empty configuration_data() with copy keyword - Use 'copy' keyword to avoid meson warning message. - Note that 'copy' keyword in configure_file() is available - since meson 0.47.0 - https://bugzilla.gnome.org/show_bug.cgi?id=797298 - -2018-10-17 21:04:51 +1100 Matthew Waters <matthew@centricular.com> - - * ext/sctp/meson.build: - sctp: link against ws2_32 on windows - ext/sctp/ext@sctp@@gstsctp@sha/sctpassociation.c.obj: In function `receive_cb': - /var/lib/jenkins/workspace/cerbero-cross-mingw32/workdir/sources/windows_x86/gst-plugins-bad-1.0-1.15.0.1/_builddir/../ext/sctp/sctpassociation.c:692: undefined reference to `_imp__ntohl@4' - -2018-09-14 00:08:34 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/transportstream.c: - * ext/webrtc/transportstream.h: - * ext/webrtc/webrtcsdp.c: - * gst-libs/gst/webrtc/webrtc_fwd.h: - * tests/check/elements/webrtcbin.c: - webrtcbin: implement support for group: BUNDLE - -2018-10-07 16:19:03 +0900 Wonchul Lee <chul0812@gmail.com> - - * ext/aom/gstav1enc.c: - * ext/aom/gstav1utils.c: - * ext/aom/gstav1utils.h: - av1enc: Add to configure image formats - Expanded to support image format to YV12/I422/I444. It's related to the - color bit-depth and profile of the codec. It can make configuring - appropriate profile according to bit-depth and format. - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2018-10-03 17:13:32 +0900 Wonchul Lee <chul0812@gmail.com> - - * ext/aom/gstav1enc.c: - av1enc: fix compliation with removed defines - AOM_FRAME_IS_INVISIBLE is unused and remove in aom_encoder.h - https://aomedia-review.googlesource.com/c/aom/+/70421 - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2018-07-30 23:31:00 +0900 Wonchul Lee <chul0812@gmail.com> - - * ext/aom/Makefile.am: - * ext/aom/gstav1enc.c: - * ext/aom/gstav1enc.h: - * ext/aom/gstav1utils.c: - * ext/aom/gstav1utils.h: - * ext/aom/meson.build: - av1enc: Add configurations - Added rate control and profile related configuration. The profile - configuration has been copied from vpx. - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2018-10-09 16:59:54 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/shm/gstshmsrc.c: - shmsrc: delay fd removal until there's no uses - This fixes the remaining race condition with the fd by delaying - the removal until last pipe ref. - Unexpected critical/warning: gst_poll_fd_has_error: assertion 'fd->fd - >= 0' failed - Stack trace: - gst_debug_get_stack_trace (gstinfo.c:2788) - gst_check_log_critical_func (gstcheck.c:281) - g_logv (/lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.2:0x7fdd4efa0a40) - g_log (/lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.2:0x7fdd4efa0c6b) - gst_poll_fd_has_error (gstpoll.c:1217) - gst_shm_src_create (gstshmsrc.c:364) - gst_push_src_create (gstpushsrc.c:131) - gst_base_src_get_range (gstbasesrc.c:2521) - gst_base_src_loop (gstbasesrc.c:2845) - gst_task_func (gsttask.c:328) - default_func (gsttaskpool.c:69) - https://bugzilla.gnome.org/show_bug.cgi?id=797203 - -2018-09-28 13:35:49 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/shm/gstshmsrc.c: - shmsrc: fixes a crash when is-live is true due a race condition - There's a race condition when is-live is set to true and the shmsrc - element releases the pipe in the transition from PLAYING to PAUSED. - To avoid it this change ensures that _create method takes the pipe - and increases the use_count in one operation protected by object lock. - Also perform apropriate protections when releasing the pipe. - https://bugzilla.gnome.org/show_bug.cgi?id=797203 - -2018-09-28 13:23:38 +0200 Josep Torra <n770galaxy@gmail.com> - - * tests/check/elements/shm.c: - tests: shm: add an end to end test for live reception - Add a unit test to exchange data between two pipelines with shmsrc - acting as a live source. - https://bugzilla.gnome.org/show_bug.cgi?id=797203 - -2018-10-10 13:07:50 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/gstshmsrc.c: - shmsrc: Remove commented out code - -2018-10-08 13:56:56 -0700 Aleix Conchillo Flaqué <aleix@oblong.com> - - * sys/shm/gstshmsink.c: - shmsink: do not keep locking if element is unlocked - https://bugzilla.gnome.org/show_bug.cgi?id=797260 - -2018-10-08 20:53:17 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: use new 'python' module instead of deprecated 'python3' one - https://github.com/mesonbuild/meson/pull/4169 - -2018-10-09 02:38:14 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/webrtcdatachannel.c: - * tests/check/elements/webrtcbin.c: - webrtc/datachannel: fix support for prenegotiated channels - With prenegotiated channels, the data-channel protocol is not used and - instead the channel's negotiation is intended to be performed out of band in - some application-specific manner. - Comes with test! - -2018-10-08 21:56:31 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * tests/check/elements/webrtcbin.c: - webrtc: start in the closed state - This means that we will reject all operations before we've transitioned - into READY. - This also fixes the tests using the default GMainContext in the NULL - state instead of the webrtcbin internal GMainContext and thread. Also - removes a potential ordering race where on the element transitioning to - READY, an operations could have been queued on two different threads and - removing a guarentee on operation ordering. - -2018-10-05 12:10:06 -0700 Aleix Conchillo Flaqué <aleix@oblong.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: start and stop thread when changing state - It might be possible that if we set webrtcbin to the NULL state some - tasks (idle sources) are still executed and they might even freeze. The freeze - is caused because the webrtcbin tasks don't hold a reference to webrtcbin and - if it's last unref inside the idle source itself this will not allow the main - loop to finish because the main loop is waiting on the idle source to finish. - We now start and stop webrtcbin thread when changing states. This will allow - the idle sources to finish properly. - https://bugzilla.gnome.org/show_bug.cgi?id=797251 - -2018-10-04 23:45:49 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: fix the default blend modes for unpremultipled alpha - Alpha in GStreamer is unpremultiplied - -2018-10-04 12:07:31 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gstavwait.c: - avwait: Fix sending of dropping=true messages - If the first audio buffer to be dropped started right between two video - buffers (after the end of the first but before the start of the second, - as is often the case with N/1001 video frame rates), we would miss - sending the dropping=true message. - https://bugzilla.gnome.org/show_bug.cgi?id=797248 - -2018-10-04 16:29:25 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/webrtcbin.c: - tests/webrtcbin: add a couple more dependant element checks - Without the sctp elements, all the data channel tests will fail - -2018-09-27 16:37:28 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixerbin.c: - glmixerbin: add gloverlaycompositor to each input stream - Flattens the overlay compositions into the stream before the mixer will - mix them. - https://bugzilla.gnome.org/show_bug.cgi?id=759867 - -2018-10-03 16:00:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglstereomix.c: - glstereomix: Fix build after deprecating misnamed GST_TYPE_GL_STEREO_DOWNMIX_MODE_TYPE - -2018-09-27 15:24:20 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/gstmsdkvideomemory.c: - * sys/msdk/gstmsdkvpp.c: - msdk: Fix building on MSVC - And add missing #ifdef _WIN32 for MSVC build - https://bugzilla.gnome.org/show_bug.cgi?id=797211 - -2018-09-27 14:42:44 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/msdk/meson.build: - msdk: Fix meson build - gst-plugins-bad\sys\msdk\meson.build:57:4: ERROR: File msdk-enum.c does not exist. - https://bugzilla.gnome.org/show_bug.cgi?id=797211 - -2018-09-27 17:15:20 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: add custom AC-3 descriptor - tsdemux expects a custom descriptor (GST_MTS_DESC_AC3_AUDIO_STREAM) - to detect a stream as AC3 and not EAC3. - Note that tsdemux expects this descriptor because mpegtsmux writes - a stream with a HDMV registration descriptor. - Fixes: - gst-launch-1.0 -v audiotestsrc ! avenc_ac3 ! ac3parse ! mpegtsmux ! \ - tsdemux ! ac3parse ! avdec_ac3 ! audioconvert ! autoaudiosink - https://bugzilla.gnome.org/show_bug.cgi?id=797220 - -2018-09-26 16:00:50 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/webrtcdatachannel.c: - webrtcdatachannel: take ref of data so it doesn't disappear - -2018-09-24 23:26:10 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglmixerbin.c: - glmixerbin: "latency" property on aggregator is uint64, not int64 - Also update the property description and range with aggregator's values. - -2018-09-24 14:40:31 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/player/gstplayer-media-info.h: - * gst-libs/gst/player/player-prelude.h: - player: fix deprecated api declaration - -2018-09-24 11:52:22 +0100 Tim-Philipp Müller <tim@centricular.com> - - * common: - * configure.ac: - * gst-libs/gst/adaptivedemux/Makefile.am: - * gst-libs/gst/adaptivedemux/adaptive-demux-prelude.h: - * gst-libs/gst/adaptivedemux/meson.build: - * gst-libs/gst/audio/Makefile.am: - * gst-libs/gst/audio/audio-bad-prelude.h: - * gst-libs/gst/audio/gstplanaraudioadapter.c: - * gst-libs/gst/audio/meson.build: - * gst-libs/gst/basecamerabinsrc/Makefile.am: - * gst-libs/gst/basecamerabinsrc/basecamerabinsrc-prelude.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabin-enum.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - * gst-libs/gst/basecamerabinsrc/meson.build: - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/codecparsers-prelude.h: - * gst-libs/gst/codecparsers/dboolhuff.c: - * gst-libs/gst/codecparsers/gstjpeg2000sampling.c: - * gst-libs/gst/codecparsers/gstjpegparser.c: - * gst-libs/gst/codecparsers/gstvp8rangedecoder.c: - * gst-libs/gst/codecparsers/meson.build: - * gst-libs/gst/codecparsers/parserutils.c: - * gst-libs/gst/codecparsers/vp8utils.c: - * gst-libs/gst/insertbin/Makefile.am: - * gst-libs/gst/insertbin/gstinsertbin.h: - * gst-libs/gst/insertbin/meson.build: - * gst-libs/gst/interfaces/Makefile.am: - * gst-libs/gst/interfaces/meson.build: - * gst-libs/gst/interfaces/photography-prelude.h: - * gst-libs/gst/isoff/Makefile.am: - * gst-libs/gst/isoff/gstisoff.c: - * gst-libs/gst/isoff/gstisoff.h: - * gst-libs/gst/isoff/meson.build: - * gst-libs/gst/mpegts/Makefile.am: - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/mpegts/mpegts-prelude.h: - * gst-libs/gst/opencv/Makefile.am: - * gst-libs/gst/opencv/meson.build: - * gst-libs/gst/opencv/opencv-prelude.h: - * gst-libs/gst/player/Makefile.am: - * gst-libs/gst/player/meson.build: - * gst-libs/gst/player/player-prelude.h: - * gst-libs/gst/sctp/Makefile.am: - * gst-libs/gst/sctp/meson.build: - * gst-libs/gst/sctp/sctp-prelude.h: - * gst-libs/gst/sctp/sctpreceivemeta.c: - * gst-libs/gst/sctp/sctpsendmeta.c: - * gst-libs/gst/uridownloader/Makefile.am: - * gst-libs/gst/uridownloader/gstfragment.c: - * gst-libs/gst/uridownloader/gsturidownloader.c: - * gst-libs/gst/uridownloader/meson.build: - * gst-libs/gst/uridownloader/uridownloader-prelude.h: - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/meson.build: - * gst-libs/gst/video/video-bad-prelude.h: - * gst-libs/gst/wayland/Makefile.am: - * gst-libs/gst/wayland/meson.build: - * gst-libs/gst/wayland/wayland.h: - * gst-libs/gst/webrtc/Makefile.am: - * gst-libs/gst/webrtc/meson.build: - * gst-libs/gst/webrtc/webrtc_fwd.h: - * meson.build: - libs: fix API export/import and 'inconsistent linkage' on MSVC - For each lib we build export its own API in headers when we're - building it, otherwise import the API from the headers. - This fixes linker warnings on Windows when building with MSVC. - The problem was that we had defined all GST_*_API decorators - unconditionally to GST_EXPORT. This was intentional and only - supposed to be temporary, but caused linker warnings because - we tell the linker that we want to export all symbols even - those from externall DLLs, and when the linker notices that - they were in external DLLS and not present locally it warns. - What we need to do when building each library is: export - the library's own symbols and import all other symbols. To - this end we define e.g. BUILDING_GST_FOO and then we define - the GST_FOO_API decorator either to export or to import - symbols depending on whether BUILDING_GST_FOO is set or not. - That way external users of each library API automatically - get the import. - While we're at it, add new GST_API_EXPORT in config.h and use - that for GST_*_API decorators instead of GST_EXPORT. - The right export define depends on the toolchain and whether - we're using -fvisibility=hidden or not, so it's better to set it - to the right thing directly than hard-coding a compiler whitelist - in the public header. - We put the export define into config.h instead of passing it via the - command line to the compiler because it might contain spaces and brackets - and in the autotools scenario we'd have to pass that through multiple - layers of plumbing and Makefile/shell escaping and we're just not going - to be *that* lucky. - The export define is only used if we're compiling our lib, not by external - users of the lib headers, so it's not a problem to put it into config.h - Also, this means all .c files of libs need to include config.h - to get the export marker defined, so fix up a few that didn't - include config.h. - This commit depends on a common submodule commit that makes gst-glib-gen.mak - add an #include "config.h" to generated enum/marshal .c files for the - autotools build. - https://bugzilla.gnome.org/show_bug.cgi?id=797185 - -2018-09-24 10:59:16 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openglmixers.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - docs: plugins: update for git master - -2018-09-22 19:49:13 +0100 Tim-Philipp Müller <tim@centricular.com> - - * pkgconfig/Makefile.am: - * pkgconfig/meson.build: - pkgconfig: generate sctp lib .pc file also with Meson build - and fix up autotools definition now that it's not conditional - any more. - -2018-09-22 17:37:42 +0100 Tim-Philipp Müller <tim@centricular.com> - - * pkgconfig/Makefile.am: - pkgconfig: sctp lib does not depend on external sctp library - So install .pc files unconditionally. - -2018-09-21 15:04:01 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/Makefile.am: - libs: dist new sctp lib - -2018-09-14 16:05:20 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gstavwait.c: - * gst/timecode/gstavwait.h: - avwait: Send dropping=true message after all streams stopped - Previously it was dispatched before the last video buffer, and audio - buffers would follow afterwards. It's misleading to send the - dropping=true message before both streams have really stopped, it can - lead to races when someone is e.g. waiting for that message to send EOS. - Also added some debug output. - https://bugzilla.gnome.org/show_bug.cgi?id=797145 - -2018-09-21 14:56:52 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/Makefile.am: - gst-libs: Always build sctp mini-library - It doesn't depend on any external library - -2018-09-19 18:01:26 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: fix constant alpha enum value for constant alpha - -2018-09-10 23:52:05 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/Makefile.am: - * ext/webrtc/fwd.h: - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/meson.build: - * ext/webrtc/sctptransport.c: - * ext/webrtc/sctptransport.h: - * ext/webrtc/transportreceivebin.c: - * ext/webrtc/transportsendbin.c: - * ext/webrtc/webrtcdatachannel.c: - * ext/webrtc/webrtcdatachannel.h: - * ext/webrtc/webrtcsdp.c: - * ext/webrtc/webrtcsdp.h: - * gst-libs/gst/webrtc/webrtc_fwd.h: - * tests/check/elements/webrtcbin.c: - webrtcbin: add support for data channels based on SCTP - Mostly follows the W3C specification - https://www.w3.org/TR/webrtc/#peer-to-peer-data-api - With contributions from: - Mathieu Duponchelle <mathieu@centricular.com> - https://bugzilla.gnome.org/show_bug.cgi?id=794351 - -2018-09-10 23:30:56 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: functionify dependent element checks - -2018-09-10 23:27:08 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcstats.c: - webrtc/stats: rename debug category not to be ice related - -2018-09-13 19:56:47 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/sctp/gstsctpdec.c: - * ext/sctp/gstsctpenc.c: - sctp elements: avoid assertions on shutdown - -2018-09-10 23:25:36 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/sctp/sctpreceivemeta.h: - * gst-libs/gst/sctp/sctpsendmeta.h: - sctp*meta: fix api define in gst_sctp_buffer_get_*_meta() - -2018-09-10 23:24:21 +1000 Matthew Waters <matthew@centricular.com> - - * ext/sctp/sctpassociation.c: - sctpassociation: don't join a NULL thread - Can occur if no connection is actually made and thus no connection - thread is created. - -2018-09-10 23:23:43 +1000 Matthew Waters <matthew@centricular.com> - - * ext/sctp/gstsctpenc.c: - sctpenc: don't require caps when requesting the pad - They can be set later - -2018-09-10 23:21:52 +1000 Matthew Waters <matthew@centricular.com> - - * ext/sctp/gstsctpenc.c: - sctpenc: start pad task after the parent has activated pads - Fixes a race where the task could attempt to set - stream-start/caps/segment before the pad was active and would be - dropped resulting in a 'data-flow before stream-start' warning. - -2018-09-06 17:27:27 +1000 Matthew Waters <matthew@centricular.com> - - * ext/meson.build: - * ext/sctp/meson.build: - * gst-libs/gst/meson.build: - * gst-libs/gst/sctp/Makefile.am: - * gst-libs/gst/sctp/meson.build: - * gst-libs/gst/sctp/sctp-prelude.h: - * gst-libs/gst/sctp/sctpreceivemeta.h: - * gst-libs/gst/sctp/sctpsendmeta.h: - * meson_options.txt: - Update sctp plugin for the current build system - - Add meson build definitions - - Add necessary API decorators - -2015-02-04 17:12:48 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * configure.ac: - * ext/Makefile.am: - * ext/sctp/Makefile.am: - * ext/sctp/gstsctpdec.c: - * ext/sctp/gstsctpdec.h: - * ext/sctp/gstsctpenc.c: - * ext/sctp/gstsctpenc.h: - * ext/sctp/gstsctpplugin.c: - * ext/sctp/sctpassociation.c: - * ext/sctp/sctpassociation.h: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/sctp/Makefile.am: - * gst-libs/gst/sctp/sctpreceivemeta.c: - * gst-libs/gst/sctp/sctpreceivemeta.h: - * gst-libs/gst/sctp/sctpsendmeta.c: - * gst-libs/gst/sctp/sctpsendmeta.h: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-sctp-uninstalled.pc.in: - * pkgconfig/gstreamer-sctp.pc.in: - Add new SCTP plugins (sctpenc/sctpdec) - https://bugzilla.gnome.org/show_bug.cgi?id=744863 - -2018-08-28 18:48:48 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcice.c: - webrtcice: do not run host resolution from applictation thread - g_resolver_lookup_by_name is a blocking call, and should not - be run when the user sets or adds a turn-server. - https://bugzilla.gnome.org/show_bug.cgi?id=797012 - -2018-08-22 19:05:02 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/gstwebrtcice.h: - webrtcbin: New add-turn-server API - It is possible and often desirable to pass multiple ICE relays - to libnice agents, the "turn-server" property, while convenient - to use from the command line, does not allow that. - This adds a new action signal, "add-turn-server" to address that. - https://bugzilla.gnome.org/show_bug.cgi?id=797012 - -2018-09-19 12:02:19 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - * meson_options.txt: - meson: add glib-checks option to disable API guards and such - We want this enabled by default, also in releases, but people - may want to disable this for performance-critical workloads or - on embedded devices. - -2018-09-19 12:01:47 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson_options.txt: - meson: fix missing closing bracket in option descriptions - -2018-09-19 10:28:56 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: Fix typo in property description - -2018-09-06 20:23:55 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstccextractor.c: - ccextractor: Use gst_caps_new_simple() instead of gst_caps_from_string() - -2018-09-12 22:38:56 +1000 Matthew Waters <matthew@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: fix build - ../sys/decklink/gstdecklinkvideosink.cpp:1006:11: error: ‘GstDecklinkVideoSink {aka struct _GstDecklinkVideoSink}’ has no member named ‘scheduled_stop_time’ - self->scheduled_stop_time = start_time; - ^ - -2018-09-12 05:29:09 -0500 Matthew Waters <matthew@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklink: wait for stop with a timeout - Decklink sometimes does not notify us through the callback that it has - stopped scheduled playback either because it was uncleanly shutdown - without an explicit stop or for unknown other reasons. - Wait on the cond for a short amount of time before checking if scheduled - playback has stopped without notification. - https://bugzilla.gnome.org/show_bug.cgi?id=797130 - -2018-07-08 09:54:04 -0500 Matthew Waters <matthew@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklink: start scheduled playback in paused - This is part of a much larger goal to always keep the frames we schedule to - decklink be always increasing. This also allows us to avoid using both the - sync and async frame display functions which aren't recomended to be used - together. - If the output timestatmsp is not always increasing decklink seems to hold - onto the latest frame and may cause a flash in the output if the played - sequence has a framerate less than the video output. - Scenario is play for N seconds, pause, flushing seek to some other position, - play again. Each of the play sequences would normally start at 0 with - the decklink time. As a result, the latest frame from the previous sequence - is kept alive waiting for it's timestamp to pass before either dropping - (if a subsequent frame in the new sequence overrides it) or displayed - causing the out of place frame to be displayed. - This is also supported by the debug logs from the decklink video sink - element where a ScheduledFrameCompleted() callback would not occur for - the frame until the above had happened. - It was timing related as to whether the frame was displayed based - on the decklink refresh cycle (which seems to be 16ms here), - when the frame was scheduled by the sink and the difference between - the 'time since vblank' of the two play requests (and thus start times - of scheduled playback). - https://bugzilla.gnome.org/show_bug.cgi?id=797130 - -2018-09-12 05:32:04 -0500 Matthew Waters <matthew@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - decklinkaudiosink: fix debug string copy-paste error - Stopping != Starting - -2018-08-13 22:44:51 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix periodic SPS/PPS sending work after a seek - Apply the commit ef71b61 - See also https://bugzilla.gnome.org/show_bug.cgi?id=742212 - https://bugzilla.gnome.org/show_bug.cgi?id=754124 - -2018-08-13 20:34:36 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: Add support insert parameter set per IDR - Apply commits 0c04e00, bf0d952 and a0876aa to h265parse. - See also https://bugzilla.gnome.org/show_bug.cgi?id=766803 - https://bugzilla.gnome.org/show_bug.cgi?id=754124 - -2018-08-14 00:46:26 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Don't discard first AU delimiter - Apply the commit 48a1f27 - https://bugzilla.gnome.org/show_bug.cgi?id=754124 - -2018-08-14 00:43:01 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Consider SEI NALU as "HEADER" packets - Apply the commit 69c09c3 - https://bugzilla.gnome.org/show_bug.cgi?id=754124 - -2018-08-13 22:45:54 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Don't unref buffer that was unreffed just a few lines before already - Apply the commit 9b50a12 - https://bugzilla.gnome.org/show_bug.cgi?id=754124 - -2018-08-14 01:11:27 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Reset the parser information when caps changes - Apply the commit 14f6fcd - https://bugzilla.gnome.org/show_bug.cgi?id=754124 - -2018-08-13 23:45:13 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix collection of access units to preserve config headers - Apply the commit 7d44a51 - See also https://bugzilla.gnome.org/show_bug.cgi?id=732203 - https://bugzilla.gnome.org/show_bug.cgi?id=754124 - -2018-08-13 23:36:33 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Improve conditions for skipping NAL units - See also https://bugzilla.gnome.org/show_bug.cgi?id=732203 - https://bugzilla.gnome.org/show_bug.cgi?id=754124 - -2018-08-13 22:23:22 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: Introduce new state tracking variables - Direct applying the commit 7bb6443. This could fix also unexpected - nal dropping when nonzero "config-interval" is set. - (e.g., gst-launch-1.0 videotestsrc ! x265enc key-int-max=30 ! - h265parse config-interval=30 ! avdec_h265 ! videoconvert ! autovideosink) - Similar to the h264parse, have_{vps,sps,pps} variables will be used - for deciding on when to submit updated caps or not, and rather mean - "have new SPS/PPS to be submitted?" - See also https://bugzilla.gnome.org/show_bug.cgi?id=732203 - https://bugzilla.gnome.org/show_bug.cgi?id=754124 - -2018-08-13 21:49:57 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix and optimize NAL collection function - Adopt h264parse's _collect_nal() behavior. - See also commit 5601c87 and https://bugzilla.gnome.org/show_bug.cgi?id=732154 - https://bugzilla.gnome.org/show_bug.cgi?id=754124 - -2018-08-14 00:29:56 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Unref/replace force_key_unit_event in gst_h265_parse_reset - Apply the commit 36a2aca - https://bugzilla.gnome.org/show_bug.cgi?id=754124 - -2018-08-14 00:27:12 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: Copy over DISCONT flag from input buffers - Apply the commit 10ffa08 - https://bugzilla.gnome.org/show_bug.cgi?id=754124 - -2018-08-16 16:58:31 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/debugutils/gstwatchdog.c: - watchdog: Add missing static keyword - get/set_property method should have been static. - -2018-09-11 01:00:21 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: Remove code that sets thread priority - This is now handled directly in gstaudiosrc/sink, and we were setting - it in the wrong thread anyway. prepare() is not the same thread as - sink_write() or src_read(). - -2018-09-05 21:31:22 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/dts/meson.build: - meson: Don't pass GNU-like compiler wargs on MSVC - cl : Command line error D8021 : invalid numeric argument '/Wno-missing-include-dirs' - -2018-09-05 20:47:05 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/meson.build: - meson: Don't skip plugins that don't build with MSVC - We now have options for all plugins, so we will just disable these in - the cerbero recipe instead. These require external deps, so they won't - affect gst-build either. - -2018-09-03 15:15:45 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Fix typo in set_drop_frame - Was checking if fps_d == 60000 (instead of fps_n), causing 60000/1001 to - be always falsely interpreted as non-drop-frame - -2018-09-01 11:23:33 +0100 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/player/gstplayer.c: - player: Set default position and duration value to GST_CLOCK_TIME_NONE - When the position query fails the returned value shall remain -1 instead of 0 to - avoid confusion on application side between error and beginning of media. - https://bugzilla.gnome.org/show_bug.cgi?id=797066 - -2018-09-01 21:48:31 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/applemedia/meson.build: - meson: Fix applemedia dependencies on iOS - These were accidentally not being found because they were incorrectly - specified. - -2018-08-31 14:37:46 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/adaptivedemux/meson.build: - * gst-libs/gst/audio/meson.build: - * gst-libs/gst/basecamerabinsrc/meson.build: - * gst-libs/gst/codecparsers/meson.build: - * gst-libs/gst/insertbin/meson.build: - * gst-libs/gst/interfaces/meson.build: - * gst-libs/gst/isoff/meson.build: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/opencv/meson.build: - * gst-libs/gst/player/meson.build: - * gst-libs/gst/uridownloader/meson.build: - * gst-libs/gst/video/meson.build: - * gst-libs/gst/wayland/meson.build: - * gst-libs/gst/webrtc/meson.build: - * meson.build: - meson: Maintain macOS ABI through dylib versioning - Requires Meson 0.48, but the feature will be ignored on older versions - so it's safe to add it without bumping the requirement. - Documentation: - https://github.com/mesonbuild/meson/blob/master/docs/markdown/Reference-manual.md#shared_library - -2018-08-31 17:19:02 +1000 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/meson.build: - meson: add pkg-config file for the webrtc plugin - -2018-08-31 00:37:17 +1000 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/meson.build: - androidmedia/meson: we also depend on gmodule and orc - -2018-08-31 14:55:05 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/rtmp/gstrtmpsink.c: - rtmpsink: Fix leak on connection failure - Although RTMP_ConnectStream() was failed, librtmp's internal memory - is not freed by RTMP_ConnectStream(), so RTMP_Close() should be called - before RTMP_Free() - https://bugzilla.gnome.org/show_bug.cgi?id=797058 - -2018-08-25 22:47:34 +0530 Devarsh Thakkar <devarsht@xilinx.com> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: Add "restore-crtc" property - This adds "restore-crtc" property using which one - can restore previous crtc mode. - By default it is enabled, if CRTC was already - active with a valid mode and kmssink set a new mode - on CRTC using force-modesetting. - This helps user restore previous crtc mode and get - the previous session back after running a kmssink - pipeline involving a force-modesetting. - For e.g. When running a kmssink pipeline on rpi - using force-modesetting on tty console, it was giving - a blank screen after pipeline, and now with help of restore-crtc - functionality, CRTC is set with previous crtc mode - previously active on tty console. - Edited-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> - https://bugzilla.gnome.org/show_bug.cgi?id=797025 - -2018-08-29 12:02:22 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Document possible advance usage - This adds a mention about modetest command line tool and adds an example - on how to use the connector/plane-properties. - https://bugzilla.gnome.org/show_bug.cgi?id=797027 - -2018-08-29 11:53:13 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Escape DRM property names - This allow setting properties that contains spaces. The spaces are - replaced with '-'. As an example, one can set the connector proper - "scaling mode" with the following: - ... ! kmssink connector-properties="s,scaling-mode=1" - https://bugzilla.gnome.org/show_bug.cgi?id=797027 - -2018-08-27 15:08:08 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: Add 'plane-properties' property - This is similar to 'connector-properties' but will change - selected plane properties instead. - https://bugzilla.gnome.org/show_bug.cgi?id=797027 - -2018-08-27 15:07:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Generalize setting DRM object properties - https://bugzilla.gnome.org/show_bug.cgi?id=797027 - -2018-08-23 14:29:37 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: add 'connector-properties' prop - Can be used to pass custom connector properties to DRM. Properties can - be enumerated using modetest tool. These properties can then be applied - with the following gst-launch-1.0 syntax. Note that the name of the - structure is ignored. - ... ! kmssink connector-properties="s,props1=value,props2=value" - https://bugzilla.gnome.org/show_bug.cgi?id=797027 - -2018-08-28 12:54:07 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson_options.txt: - * sys/androidmedia/meson.build: - * sys/meson.build: - * sys/opensles/meson.build: - meson: Add build files for androidmedia and opensles - Note that androidmedia requires Android gstgl - -2018-08-28 15:04:53 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Only use drop-frame flag for 29.97 and 59.94 FPS - Otherwise it can cause errors in gstvideotimecode.c because drop-frame - is not defined for any other frame rate (e.g. 24000/101) - https://blog.frame.io/2017/07/17/timecode-and-frame-rates/ - https://bugzilla.gnome.org/show_bug.cgi?id=797037 - -2018-08-28 09:11:32 +0200 Johan Bjäreholt <johanbj@axis.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Fix format string warning - We have a GST_DEBUG_OBJECT, which prints a guint64 with %lu which gave a - compiler warning. Used G_GUINT64_FORMAT instead. - https://bugzilla.gnome.org/show_bug.cgi?id=797036 - -2018-08-17 11:12:26 +0200 Philipp Zabel <p.zabel@pengutronix.de> - - * sys/kms/gstkmssink.c: - kmssink: configure mode setting from video info - drmModeGetFB returns -EINVAL for multi-planar framebuffers. Instead of - depending on the framebuffer dimensions to select the mode, use width - and height from GstVideoInfo, which was used to create the framebuffer - in the first place. This enables kmssink to display multi-planar - formats such as I420 or NV12 with modesetting enabled. - https://bugzilla.gnome.org/show_bug.cgi?id=796985 - -2018-08-16 12:35:50 +0200 Jerome Laheurte <jlaheurte@quividi.net> - - * sys/winks/ksdeviceprovider.c: - ksvideosrc: fix device enumeration when hotplugging a camera - Since both audio and video capture devices declare the KSCATEGORY_CAPTURE interface, - plugging a camera that supports both could result in an audio device being mistaken - for a video one. - https://bugzilla.gnome.org/show_bug.cgi?id=796958 - -2018-08-19 15:50:25 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/meson.build: - * ext/musepack/meson.build: - * meson_options.txt: - meson: build musepack plugin - -2018-08-19 15:44:16 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/musepack/gstmusepackdec.c: - * ext/musepack/gstmusepackdec.h: - * ext/musepack/gstmusepackreader.c: - * ext/musepack/gstmusepackreader.h: - musepack: remove support for the 'old' API - -2018-08-19 14:39:53 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/freeverb/gstfreeverb.c: - freeverb: update for g_type_class_add_private() deprecation - Not that the private struct is really needed here. - -2018-08-19 01:11:38 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/meson.build: - * ext/neon/meson.build: - * meson_options.txt: - meson: build neonhttpsrc - -2018-08-18 21:32:11 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - * meson_options.txt: - meson: add options to disable gobject cast checks and glib asserts - ... and define G_DISABLE_DEPRECATED for development versions, - like we do in autotools. - -2018-08-17 16:37:45 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - * gst/audiobuffersplit/gstaudiobuffersplit.h: - audiobuffersplit: Add a gapless mode which inserts silence/drops samples on disconts - The output is always a continguous stream without any gaps. - -2018-08-17 16:37:31 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Always set DISCONT flag after resyncs - -2018-08-17 16:33:52 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - * gst/audiobuffersplit/gstaudiobuffersplit.h: - audiobuffersplit: Keep track of resync time separately - If we drain after a discont, the discont time given by the stream - synchronizer is already the time after the discontinuity. But we need to - drain all pending data based on the previous discont time instead. - -2018-08-17 14:56:51 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Update output buffer size after each buffer to compensate for accumulated errors - https://bugzilla.gnome.org/show_bug.cgi?id=796981 - -2018-08-16 17:47:55 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gstavwait.c: - * gst/timecode/gstavwait.h: - * tests/check/elements/avwait.c: - * tests/check/meson.build: - avwait: Start video and audio together if audio starts late - Also add test to meson - https://bugzilla.gnome.org/show_bug.cgi?id=796977 - -2018-08-17 02:59:26 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson.build: - * sys/applemedia/meson.build: - * sys/decklink/meson.build: - * sys/shm/meson.build: - meson: host_system is 'ios' when building for iOS - The cross file sets this value, and we use 'ios' in Cerbero. - -2018-08-17 01:49:07 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson.build: - * meson_options.txt: - * tests/meson.build: - meson: Add an option for tests - This is needed because we don't always have gstreamer-check available, - for instance inside Cerbero on iOS. - -2018-08-16 15:21:00 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Always create the adapter - Worst case it will be empty. This fixes a crash when the base class - calls data_received() when the stream is neither is_isobmff or - has_isoff_ondemand_profile. - https://bugzilla.gnome.org/show_bug.cgi?id=796745 - -2018-08-16 17:07:06 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/compositor.c: - compositor: Define crossfade-ratio to have range 0.0,1.0 - Previously negative values had the same effect as 0.0, which was - confusing. - https://bugzilla.gnome.org/show_bug.cgi?id=796845 - -2018-08-16 11:42:25 +0200 Wim Taymans <wtaymans@redhat.com> - - * ext/curl/gstcurlhttpsrc.c: - curlhhtpsrc: avoid invalid memory references - gst_curl_http_src_remove_queue_item() can free qelement and then - we get an invalid memory reference when we do qelement->next a - couple of lines below. Take the next pointer earlier so that we can - safely free. - -2018-08-16 11:20:54 +0200 Wim Taymans <wtaymans@redhat.com> - - * gst/librfb/rfbdecoder.c: - rfbdecoder: don't free decoder data - The decoder data is freed when we read more data. - -2018-08-16 10:02:42 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Make sure to hold object lock while iterating sink pads - They might otherwise just change while we iterate. - -2018-08-15 19:44:17 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson.build: - meson: Define HAVE_OSX on macOS and iOS - Needed by the shm, ladspa, and lv2 plugins. Same as Autotools. - -2018-08-15 19:34:31 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/shm/meson.build: - meson: Fix shm librt dep check on macOS, iOS, and *BSD - -2018-08-14 15:59:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/Makefile.am: - makefile: opencv: Fix header names in noinst_HEADERS - This should fix missing gstcameracalibrate.h and gstcameraundistort.h - missing into generated tarballs. - -2018-08-14 19:48:28 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson_options.txt: - * sys/applemedia/meson.build: - meson: Add an option for the applemedia plugin - -2018-07-18 11:11:17 +0100 Michael Drake <michael.drake@codethink.co.uk> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: fix multiple subtitles on screen simultaneously - This fixes an issue with SSA/ASS subtitles, where subtitles - would fail to appear if there was already a subtitle on screen. - This was because `struct _GstAssRender` had a single - `GstBuffer *subtitle_pending` member. This meant that - the assrender context could only be aware of one subtitle - at a time. - This patch changes the subtitle_pending member to a - linked list of pending subtitles. - The `gst_ass_render_chain_text` function no longer needs - to care about whether there are already subtitles pending, - it simply appends new subtitles to the list. - The `gst_ass_render_chain_video` function has been modified - to handle the list of pending subtitles. - Finally, the `gst_ass_render_pop_text` function has been - modified to pop the entire list of pending subtitles. - https://bugzilla.gnome.org/show_bug.cgi?id=735944 - -2018-08-14 13:53:00 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * tests/check/elements/.gitignore: - * tests/check/libs/.gitignore: - check: update gitignore - -2018-08-14 12:42:02 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * ext/closedcaption/raw_decoder.c: - closedcaption: comment out unused function - When compiling with clang-6 this error raises: - raw_decoder.c:411:1: error: unused function 'cpr1204_crc' - -Werror,-Wunused-function - This patch only comments it out. - https://bugzilla.gnome.org/show_bug.cgi?id=796957 - -2018-08-14 12:36:53 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * ext/closedcaption/raw_decoder.c: - closedcaption: avoid implicit convertion of enums - When compiling with clang-6 this error pops out: - raw_decoder.c:1011:62: error: implicit conversion from enumeration - type 'const vbi_modulation' to different enumeration type - 'vbi3_modulation' -Werror,-Wenum-conversion - This is because function vbi3_bit_slicer_set_params() sets - vbi3_modulation as enum type parameter, nonetheless vbi_modulation - enum is passed. Both enums looks semantically equal, thus the fix is a - simple cast. - https://bugzilla.gnome.org/show_bug.cgi?id=796957 - -2018-08-11 04:12:46 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/webrtcdsp/meson.build: - meson: Add gnustl dep for webrtcdsp on Android - Needed for C++ headers. Without this, webrtcdsp can't find <algorithm> - -2018-08-10 12:57:47 +0100 Bastian Köcher <gnome@kchr.de> - - * gst-libs/gst/interfaces/meson.build: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/webrtc/meson.build: - meson: fix install dir for generated header files - Nixos installs into a non-standard includedir, so need - to take account of the 'includedir' option instead of - just hard-coding 'include' here. - https://bugzilla.gnome.org/show_bug.cgi?id=794856 - -2018-08-08 00:31:51 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstaudioclient3.h: - * sys/wasapi/meson.build: - wasapi: Fix build with Windows 8.1 SDK - With the Windows 8.1 SDK, the v1 of the AUDCLNT_STREAMOPTIONS enum is - defined which only has NONE and RAW, so it's not only defined when - AudioClient3 is available. - Add a meson check for the symbol. This is not needed for Autotools - because there we build against the MinGW audioclient.h which is still - at v1 of the AudioClient interface. - -2018-08-03 15:23:24 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * tests/check/Makefile.am: - tests/check/Makefile.am: add GST_AUDIO_CFLAGS also on the planar audio adapter unit test - -2018-08-03 08:16:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/audio/Makefile.am: - badaudio: Fix typo, ADUIO vs AUDIO - -2018-08-03 07:57:50 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/audio/Makefile.am: - GstPlanarAudioAdapter: Add audio library in Makefile.am - This fixes a build regression. - -2018-08-03 07:57:02 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/webrtcdsp/gstwebrtcdsp.h: - * ext/webrtcdsp/gstwebrtcechoprobe.h: - webrtcdsp: Avoid redefinition of GST_USE_UNSTABLE_API - -2018-02-19 18:30:13 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/webrtcdsp/Makefile.am: - * ext/webrtcdsp/gstwebrtcdsp.cpp: - * ext/webrtcdsp/gstwebrtcdsp.h: - * ext/webrtcdsp/gstwebrtcechoprobe.cpp: - * ext/webrtcdsp/gstwebrtcechoprobe.h: - * ext/webrtcdsp/meson.build: - webrtcdsp: add support for using F32/non-interleaved buffers - This is the native format that is in use by the webrtc audio processing - library internally, so this avoids internal {de,}interleaving and - format conversion (S16->F32 and back) - https://bugzilla.gnome.org/show_bug.cgi?id=793605 - -2018-02-19 11:48:01 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * gst-libs/gst/audio/gstplanaraudioadapter.c: - * gst-libs/gst/audio/gstplanaraudioadapter.h: - GstPlanarAudioAdapter: copy pts, dts and offset tracking from GstAdapter - https://bugzilla.gnome.org/show_bug.cgi?id=793605 - -2018-02-16 15:55:45 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * gst-libs/gst/audio/Makefile.am: - * gst-libs/gst/audio/gstplanaraudioadapter.c: - * gst-libs/gst/audio/gstplanaraudioadapter.h: - * gst-libs/gst/audio/meson.build: - * tests/check/Makefile.am: - * tests/check/libs/planaraudioadapter.c: - * tests/check/meson.build: - libs: audio: add new GstPlanarAudioAdapter class - This is a GstAdapter, but for planar audio buffers. - https://bugzilla.gnome.org/show_bug.cgi?id=793605 - -2017-07-21 17:53:11 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * meson.build: - * sys/applemedia/meson.build: - * sys/meson.build: - meson: enable applemedia - -2018-08-02 21:05:24 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/rsvg/gstrsvgdec.c: - rsvg: Also accept </svg:svg> as ending tag - Some SVG files created by inkscape use that, such as: - https://gitlab.gnome.org/GNOME/pitivi/uploads/8dd8d9d988b5eb6cc38f871196caac6f/Titel-Tafel3.2_anim.svg - This is a first patch for https://bugzilla.gnome.org/show_bug.cgi?id=796909 - but it is not enough to support animated gifs. - -2018-08-02 11:19:07 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - * ext/opencv/MotionCells.h: - * ext/opencv/gsthanddetect.h: - * ext/opencv/gsttemplatematch.cpp: - * ext/opencv/gsttemplatematch.h: - * ext/opencv/meson.build: - * meson.build: - opencv: Fixup include to follow new standard - This uses the new path for OpenCV headers. OpenCV now have - master headers files per modules, which reduce the amount of - required includes. Note that HIGHGUI was included to get the - imgcodecs includes, which I fixed, though the master header is - missing the C headers, so I included that directly. All the - image stuff should be ported to C++ eventually. Finally, this - patch also update the header checks to reflect the modules that - are really being used. - -2018-08-02 11:03:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/MotionCells.h: - * ext/opencv/gstcameracalibrate.h: - * ext/opencv/gstcameraundistort.h: - * ext/opencv/gstcvdilate.cpp: - * ext/opencv/gstcvdilateerode.cpp: - * ext/opencv/gstcvequalizehist.cpp: - * ext/opencv/gstcverode.cpp: - * ext/opencv/gstcvlaplace.cpp: - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstcvsobel.cpp: - * ext/opencv/gstdewarp.h: - * ext/opencv/gstedgedetect.cpp: - * ext/opencv/gstedgedetect.h: - * ext/opencv/gstfaceblur.cpp: - * ext/opencv/gstfaceblur.h: - * ext/opencv/gstfacedetect.h: - * ext/opencv/gstgrabcut.cpp: - * ext/opencv/gstgrabcut.h: - * ext/opencv/gsthanddetect.h: - * ext/opencv/gstmotioncells.h: - * ext/opencv/gstretinex.cpp: - * ext/opencv/gstretinex.h: - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstskindetect.cpp: - * ext/opencv/gsttemplatematch.h: - * gst-libs/gst/opencv/gstopencvutils.cpp: - * gst-libs/gst/opencv/gstopencvvideofilter.cpp: - opencv: Updated to use new header path - -2018-08-02 10:39:14 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - * ext/opencv/MotionCells.cpp: - * ext/opencv/gstcameracalibrate.cpp: - * ext/opencv/gstcameraundistort.cpp: - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstdisparity.h: - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gsthanddetect.cpp: - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstsegmentation.h: - * ext/opencv/gsttemplatematch.cpp: - * ext/opencv/gsttextoverlay.h: - * ext/opencv/meson.build: - * gst-libs/gst/opencv/meson.build: - opencv: Bump requirement to 3.0.0+ - And removes all the ifdef code to support the 2.X APIs. - -2018-08-02 16:18:12 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/closedcaption/gstceaccoverlay.c: - ceaccoverlay: Initialize debug category - -2018-08-02 18:24:02 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisrc.c: - wasapisrc: Correctly disable provide-clock - `#ifdef` will, of course, evaluate to 1 in this case. We want `#if`. - -2018-08-02 08:13:08 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/gstcameracalibrate.h: - * ext/opencv/gstcameraundistort.h: - cameracalibrtate: Fix opencv2 core.hpp path - This is to support older release of OpenCV2 - https://bugzilla.gnome.org/show_bug.cgi?id=789075 - -2018-05-27 14:31:55 +0200 Christoph Reiter <reiter.christoph@gmail.com> - - * sys/wasapi/gstwasapiutil.c: - wasapisink: fix regression in shared mode segment size - In commit fd806628a8 (839cc3926 in the stable branch) I changed the - segment size to match exactly the buffer size. I missed that this is - only valid in exclusive mode and in shared mode the buffer size is - a multiple of the device period. - Revert the logic for the shared mode. - https://bugzilla.gnome.org/show_bug.cgi?id=796354 - https://bugzilla.gnome.org/show_bug.cgi?id=796858 - -2017-10-16 22:29:01 +0200 Philippe Renon <philippe_renon@yahoo.fr> - - * ext/opencv/Makefile.am: - * ext/opencv/cameraevent.cpp: - * ext/opencv/cameraevent.hpp: - * ext/opencv/camerautils.cpp: - * ext/opencv/camerautils.hpp: - * ext/opencv/gstcameracalibrate.cpp: - * ext/opencv/gstcameracalibrate.h: - * ext/opencv/gstcameraundistort.cpp: - * ext/opencv/gstcameraundistort.h: - * ext/opencv/gstopencv.cpp: - * ext/opencv/meson.build: - opencv: new cameracalibrate and cameraundistort elements - https://bugzilla.gnome.org/show_bug.cgi?id=789075 - -2018-08-01 15:11:09 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gstavwait.c: - avwait: Don't wait if audio_running_time_to_wait_for is NONE - The case is properly handled a few lines below by dropping the buffer. - We shouldn't perpetually block the audio chain function until the - target-timecode is reached. - https://bugzilla.gnome.org/show_bug.cgi?id=796906 - -2018-08-01 03:43:31 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson_options.txt: - * sys/winks/meson.build: - meson: Add option for winks plugin - This was accidentally missed. - -2018-07-29 20:55:26 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/srt/gstsrt.c: - * ext/srt/gstsrt.h: - srt: Allow the host name "localhost" - Add support "srt://localhost:port" style uri, and change the - default host to "localhost" - https://bugzilla.gnome.org/show_bug.cgi?id=796842 - -2018-07-28 15:59:04 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/srt/gstsrt.c: - * ext/srt/gstsrtclientsink.c: - srtclientsink: Fix SRT socket option setting - SRTClientSink is sender - https://bugzilla.gnome.org/show_bug.cgi?id=796842 - -2018-07-27 15:04:29 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/srt/gstsrt.c: - * ext/srt/gstsrtclientsrc.c: - srt: Do not ignore SRT socket error event - ... and set SRT_EPOLL_IN flag if the client is not sender - (i.e., source element) since waiting readable event for - srt_recvmsg() makes more sense. - https://bugzilla.gnome.org/show_bug.cgi?id=796842 - -2018-07-27 13:23:43 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/srt/gstsrtbasesrc.c: - * ext/srt/gstsrtclientsrc.c: - * ext/srt/gstsrtserversrc.c: - srtbasesrc: Use GstBaseSrc's timestamp impl. - ... instead of doing it ourselves. Otherwise, we should add more - logic here (such as checking GstClock and etc) which was already provided by - GstBaseSrc. - https://bugzilla.gnome.org/show_bug.cgi?id=796842 - -2018-07-25 10:44:20 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/srt/gstsrt.c: - * ext/srt/gstsrt.h: - srt: Add "const" keyword to a function argument - Given "passphrase" shouldn't be modified - https://bugzilla.gnome.org/show_bug.cgi?id=796842 - -2018-07-20 16:02:26 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/srt/gstsrt.c: - * ext/srt/gstsrt.h: - * ext/srt/gstsrtserversink.c: - * ext/srt/gstsrtserversrc.c: - srt: Remove duplicated code for setting server socket - https://bugzilla.gnome.org/show_bug.cgi?id=796842 - -2018-07-28 18:06:08 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/srt/gstsrtserversink.h: - * ext/srt/gstsrtserversrc.h: - srt: Fix signal args mismatch - client-added and client-{removed,closed} signals were defined - to be emitted with two arguments (socket fd and address) - https://bugzilla.gnome.org/show_bug.cgi?id=796842 - -2018-07-25 17:36:03 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/srt/gstsrtserversrc.c: - srtserversrc: Emit client-closed signal in _stop() - ... instead of client-added - https://bugzilla.gnome.org/show_bug.cgi?id=796842 - -2018-07-25 15:16:32 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/srt/gstsrtclientsink.c: - srtclientsink: Do not leak string - https://bugzilla.gnome.org/show_bug.cgi?id=796842 - -2018-07-23 14:28:05 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/srt/gstsrtclientsink.c: - * ext/srt/gstsrtclientsrc.c: - srtclient: Fix bind-port and rendez-vous property getter - https://bugzilla.gnome.org/show_bug.cgi?id=796842 - -2018-07-20 14:05:32 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/srt/gstsrt.c: - * ext/srt/gstsrt.h: - * ext/srt/gstsrtclientsink.c: - * ext/srt/gstsrtclientsrc.c: - srt: Reduce useless call depth - Providing simplified _client_connect() is not required for now. - https://bugzilla.gnome.org/show_bug.cgi?id=796842 - -2018-07-20 12:10:21 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/srt/gstsrtbasesink.h: - * ext/srt/gstsrtbasesrc.c: - * ext/srt/gstsrtbasesrc.h: - * ext/srt/gstsrtclientsink.c: - * ext/srt/gstsrtclientsink.h: - * ext/srt/gstsrtclientsrc.c: - * ext/srt/gstsrtclientsrc.h: - * ext/srt/gstsrtserversink.c: - * ext/srt/gstsrtserversink.h: - * ext/srt/gstsrtserversrc.c: - * ext/srt/gstsrtserversrc.h: - srt: Remove white space - https://bugzilla.gnome.org/show_bug.cgi?id=796842 - -2018-07-27 23:00:53 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: Generate timestamp if framerate is known - This change allow setting timestamp on streams that would otherwise have - no timestamp. This is useful to make a video from bunch of JPEG files. An - example of such pipeline would be: - gst-launch-1.0 multifilesrc location=%05d.jpeg caps=image/jpeg,framerate=30/1 \ - ! jpegparse ! fakesink silent=0 -v - -2018-07-27 22:36:40 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/mplex/meson.build: - meson: mjpegtools_api should be 20K for mplex too - This error was duplicated. - -2018-07-27 22:33:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/mpeg2enc/meson.build: - meson: mjpegtools_api should have been 20K not 2K - This was miss-ported when the options got added. The requires version was - properly set to 2000 before. - -2018-07-27 22:17:56 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/bluez/meson.build: - meson: Generate bluez.h instead of bluez-interface.h - This is a recent regression, the meson code was ported to use the meson - gnome module helpers, but the generated file was changed to - bluez-interface.h. - -2018-07-27 18:59:23 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/aom/meson.build: - * ext/assrender/meson.build: - * ext/bs2b/meson.build: - * ext/bz2/meson.build: - * ext/chromaprint/meson.build: - * ext/closedcaption/meson.build: - * ext/dash/meson.build: - * ext/directfb/meson.build: - * ext/dtls/meson.build: - * ext/dts/meson.build: - * ext/faac/meson.build: - * ext/faad/meson.build: - * ext/fdkaac/meson.build: - * ext/flite/meson.build: - * ext/fluidsynth/meson.build: - * ext/gl/meson.build: - * ext/gsm/meson.build: - * ext/hls/meson.build: - * ext/iqa/meson.build: - * ext/kate/meson.build: - * ext/ladspa/meson.build: - * ext/libde265/meson.build: - * ext/libmms/meson.build: - * ext/lv2/meson.build: - * ext/meson.build: - * ext/mpeg2enc/meson.build: - * ext/mplex/meson.build: - * ext/openh264/meson.build: - * ext/openjpeg/meson.build: - * ext/opus/meson.build: - * ext/resindvd/meson.build: - * ext/rsvg/meson.build: - * ext/rtmp/meson.build: - * ext/sbc/meson.build: - * ext/smoothstreaming/meson.build: - * ext/soundtouch/meson.build: - * ext/spandsp/meson.build: - * ext/srt/meson.build: - * ext/srtp/meson.build: - * ext/ttml/meson.build: - * ext/voaacenc/meson.build: - * ext/vulkan/meson.build: - * ext/webp/meson.build: - * ext/webrtc/meson.build: - * ext/webrtcdsp/meson.build: - * ext/x265/meson.build: - * ext/zbar/meson.build: - * gst-libs/gst/opencv/meson.build: - * gst-libs/gst/wayland/meson.build: - * gst/mpegtsdemux/meson.build: - * meson.build: - * meson_options.txt: - * sys/bluez/meson.build: - * sys/d3dvideosink/meson.build: - * sys/decklink/meson.build: - * sys/directsound/meson.build: - * sys/dvb/meson.build: - * sys/fbdev/meson.build: - * sys/ipcpipeline/meson.build: - * sys/kms/meson.build: - * sys/msdk/meson.build: - * sys/shm/meson.build: - * sys/uvch264/meson.build: - * sys/wasapi/meson.build: - * sys/winks/meson.build: - * sys/winscreencap/meson.build: - * tests/check/meson.build: - Add feature options for almost all plugins - The only plugins remaining are those that haven't been ported to Meson - yet, and msdk. Also, the tests are still automagic. - https://bugzilla.gnome.org/show_bug.cgi?id=795107 - -2018-07-25 17:12:00 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/meson.build: - * gst/meson.build: - * meson.build: - * meson_options.txt: - * tests/examples/waylandsink/meson.build: - * tests/meson.build: - meson: Add feature options for many plugins - The rest will be converted later, these are necessary for gst-build to - set options correctly. - https://bugzilla.gnome.org/show_bug.cgi?id=795107 - -2018-07-26 11:19:41 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/aom/gstav1enc.c: - av1enc: Implement latency setting - -2018-07-26 10:48:34 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/aom/gstav1enc.c: - av1enc: Propagate flags from encoder to GstBuffer - -2018-07-26 09:55:48 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/aom/gstav1enc.c: - av1enc: Implement finish for EOS - Call the encode function repeatedly until nothing comes out. - https://bugzilla.gnome.org/show_bug.cgi?id=796727 - -2018-07-26 09:49:02 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/aom/gstav1enc.c: - av1enc: Return downstream error from push - -2018-07-26 00:20:02 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/compositor.c: - compositor: Don't leak all buffers while crossfading and not all pads are crossfading - -2018-07-25 13:44:48 +0200 Gary Bisson <gary.bisson@boundarydevices.com> - - * sys/kms/gstkmssink.c: - kmssink: Add support for mxsfb-drm driver - The mxsfb-drm driver has been added to the kernel long ago and will now - be the default display driver for NXP i.MX28, i.MX6SX and i.MX7D - processors so now is a good time to add it to kmssink. - Also, this is used in the upcoming i.MX8MQ and i.MX8MM processors. - https://bugzilla.gnome.org/show_bug.cgi?id=796873 - -2018-07-09 20:20:59 -0500 Matteo Valdina <matteo.valdina@gmail.com> - - * ext/wayland/Makefile.am: - * ext/wayland/meson.build: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - * ext/wayland/wlwindow.c: - waylandsink: relaxed wl_shell check and added zwp_fullscreen_shell. - Relaxed the wl_shell interface constrains, so application that - pass via GstContext the wl_surface can use waylandsink in a - compositor without wl_surface and zwp_fullscreen_shell. - Added support for zwp_fullscreen_shell. - https://bugzilla.gnome.org/show_bug.cgi?id=796772 - -2018-07-19 18:34:40 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gstavwait.c: - * gst/timecode/gstavwait.h: - * tests/check/Makefile.am: - * tests/check/elements/avwait.c: - avwait: Add recording property - It works like a valve in front of the actual avwait. When recording == - TRUE, other rules are then examined. When recording == FALSE, nothing is - passing through. - https://bugzilla.gnome.org/show_bug.cgi?id=796836 - -2018-07-20 16:25:02 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/blend.c: - compositor: Use 255 as maximum alpha instead of 256 - 255 will easily become 0 in the blending function as they expect - the maximum value to be 255. - Can be reproduce with - gst-launch-1.0 videotestsrc pattern=ball ! c.sink_0 \ - videotestsrc pattern=snow ! c.sink_1 \ - compositor name=c \ - sink_0::zorder=0 sink_1::zorder=1 sink_0::crossfade-ratio=0.5 \ - background=black ! \ - videoconvert ! xvimagesink - crossfade-ratio +/- 0.001 makes it work correctly and the same happens - at e.g. 0.25, 0.75, N*0.0625 - https://bugzilla.gnome.org/show_bug.cgi?id=796846 - -2018-07-22 10:34:06 +1000 Jan Schmidt <jan@centricular.com> - - * ext/ladspa/gstladspa.c: - ladspa: Only scan LADSPA subdir APPDATA and COMMONPROGRAMFILES - Don't scan the entire APPDATA and COMMONPROGRAMFILES - path tree, just the LADSPA sub-directory inside them, if any. - https://bugzilla.gnome.org/show_bug.cgi?id=796450 - -2018-07-22 09:52:23 +1000 Jan Schmidt <jan@centricular.com> - - * ext/ladspa/gstladspa.c: - ladspa: Don't try and load every file as a plugin - When scanning paths for LADSPA plugins, don't try and load - every random file as a module, as g_module_open ends up throwing - errors on Windows. - Use a G_MODULE_SUFFIX and GST_EXTRA_MODULE_SUFFIX suffix check as - we do for GStreamer plugins. - https://bugzilla.gnome.org/show_bug.cgi?id=796450 - -2018-07-18 14:26:17 +0100 Sam Gigliotti <samgig@amazon.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: fix memory leak - When it parses SDP, it doesn't free the error object. - https://bugzilla.gnome.org/show_bug.cgi?id=796830 - -2018-07-18 20:05:26 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst/compositor/compositor.c: - compositor: Update conversion info in property setter - ... not in getter. Otherwise, video-converter will not be updated - with new width/height - https://bugzilla.gnome.org/show_bug.cgi?id=796828 - -2018-06-18 13:01:50 +0200 Jonathan Karlsson <jonakn@axis.com> - - * ext/curl/gstcurlhttpsink.c: - curlhttpsink: Support for multipart/form-data Content-Type - Add support to set multipart/form-data as Content-Type by sending a - caps event to the curlhttpsink with a field named "boundary". - https://bugzilla.gnome.org/show_bug.cgi?id=796618 - -2018-07-15 23:05:26 +1000 Jan Schmidt <jan@centricular.com> - - * tests/check/elements/webrtcbin.c: - webrtc: Add some ssrc to caps in the unit test. - The unit test uses incomplete caps to test webrtcbin, - causing some weirdness generating RTX stream mappings. - https://bugzilla.gnome.org/show_bug.cgi?id=796810 - -2018-07-14 23:15:02 +1000 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: Add a warning in sdp_media_from_transceiver() - When generating caps with no ssrc, at least throw a - warning instead of using an uninitialised stack variable - https://bugzilla.gnome.org/show_bug.cgi?id=796810 - -2018-07-14 23:05:53 +1000 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: Fix memory leak - Fix a leaked string when building RTX info. - -2018-07-14 23:04:30 +1000 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/transportsendbin.c: - * ext/webrtc/transportsendbin.h: - webrtc: Clean up and fix transportsendbin - Refactor transportsendbin, and change the way - pads are blocked on dtlssrtpenc so that they - don't interfere with state changes. - As well as being easier to read, this fixes - spurious failures shutting down webrtcbin - if DTLS negotiation hasn't completed yet. - -2018-07-14 23:02:05 +1000 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/transportsendbin.c: - * gst-libs/gst/webrtc/dtlstransport.c: - webrtc: Move dtlssrtpenc state management - Move the errant piece of dtlssrtpenc state change - management from dtlstransport in the Webrtc libs, - into the transportsendbin that does the rest of - the element management so it's all in one place. - -2018-07-02 19:55:41 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/webrtc/dtlstransport.c: - webrtc/dtlstransport: Add more debug. Rename category - Rename the dtlstransport debug category to webrtcdtlstransport. - -2018-07-13 14:42:28 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/opencv/MotionCells.cpp: - * ext/opencv/gsthanddetect.cpp: - * ext/opencv/gsttemplatematch.cpp: - opencv: Fix build for opencv >= 3.4.2 - The `CV_RGB` macro is now in `imgproc.hpp`. - Fixes: - ../subprojects/gst-plugins-bad/ext/opencv/gsthanddetect.cpp:497:40: error: ‘CV_RGB’ was not declared in this scope - cvCircle (img, center, radius, CV_RGB (0, 0, 200), 1, 8, 0); - ^~~~~~ - -2018-07-07 03:40:49 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - find_codec_preferences: use received caps - When negotiation is triggered by receiving caps on our sink pad - probes, we could encounter a race condition where need-negotiation - is emitted and the application requires the creation of an offer - before the current caps were actually updated. - This led to retrieving incomplete caps when creating the offer, - using find_codec_preferences -> pad_get_current_caps. - Instead, as we save the caps in the probe callback anyway, it is better - and thread safe to use these if they were set. - https://bugzilla.gnome.org/show_bug.cgi?id=796801 - -2018-07-12 12:48:39 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: fix default placement when different sized output - i.e. when expanding from 320x240 to 800x600, the resulting frame should - appear in the top left corner, not the middle. - https://bugzilla.gnome.org/show_bug.cgi?id=794401 - -2018-04-25 16:36:21 +0200 Daniel Klamt <d.klamt@pengutronix.de> - - * ext/gl/gstglvideomixer.c: - glvideomixer: Moves the objects to zero on z axis - Matches the output from a similar glimagesink pipeline when - rotating from an upstream gltransformation passed through - the affine transformation meta with xpos/ypos being set. - https://bugzilla.gnome.org/show_bug.cgi?id=794401 - -2018-07-10 09:45:31 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: Fix coding style - -2018-07-10 09:42:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: Add missing string.h include - -2018-07-08 09:54:04 -0500 Matthew Waters <matthew@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklink: keep the internal time we send to decklink always increasing - Otherwise decklink seems to hold onto the latest frame and may cause a - flash in the output if the played sequence has a framerate less than the - video output. - Scenario is play for N seconds, pause, flushing seek to some other position, - play again. Each of the play sequences would normally start at 0 with - the decklink time. As a result, the latest frame from the previous sequence - is kept alive waiting for it's timestamp to pass before either dropping - (if a subsequent frame in the new sequence overrides it) or displayed - causing the out of place frame to be displayed. - This is also supported by the debug logs from the decklink video sink - element where a ScheduledFrameCompleted() callback would not occur for - the frame until the above had happened. - It was timing related as to whether the frame was displayed based - on the decklink refresh cycle (which seems to be 16ms here), - when the frame was scheduled by the sink and the difference between - the 'time since vblank' of the two play requests (and thus start times - of scheduled playback). - -2018-07-10 20:12:15 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglutils.c: - gl/utils: fix matrix conversion for column majorness - Companion to - https://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/?id=e4bf9ed8f060021151cd57e2b00493ed696cb47b - https://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/?id=16cba63d43f319ac33bc993eca2b1b51679727b3 - -2018-04-25 16:39:34 +0200 Daniel Klamt <d.klamt@pengutronix.de> - - * ext/gl/gstglvideomixer.c: - Moved the pad offset and aspect ratio to a matrix so it will be added in view space and not in world space - https://bugzilla.gnome.org/show_bug.cgi?id=794401 - -2018-07-09 06:40:29 +0530 Arun Raghavan <git@arunraghavan.net> - - * ext/closedcaption/gstceaccoverlay.c: - closedcaption: Fix compilation on older compilers - For when -std=c99 (or later) is not the default. - -2018-07-09 06:40:24 +0530 Arun Raghavan <git@arunraghavan.net> - - * sys/bluez/gstavdtpsrc.c: - * sys/bluez/gstavdtputil.c: - * sys/bluez/gstavdtputil.h: - bluez: Expose transport volume as a property on avdtpsrc - This can be handy if we want to track Bluetooth volume changes from the - device, or if we want to set it. - https://bugzilla.gnome.org/show_bug.cgi?id=787020 - -2018-07-03 18:38:04 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: Fix latency calculation - Use async_depth for latency calcuation instead of - the length of Tasks array which could be NULL since we - don't do the msdk decoder init in set_format(). - -2018-07-02 16:50:46 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/msdk.c: - msdk: Set 16 bit alignment for width - According to MediaSDK specification, - Width must be a multiple of 16 and Height must be a multiple - of 16 for progressive frame sequence and a multiple of 32 otherwise. - This patch sets a 16 bit alignment for width and 32 bit alignment - for height as default. - https://bugzilla.gnome.org/show_bug.cgi?id=796566 - -2018-07-02 16:50:02 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: avoid early destruction of frame in dynamic resolution change - In cases where we do hard resest, the current code destroys the frame - which has new resolution bit early and this causes buffer_unmap - warnings. Keep an extra ref to the frame internally to avoid this. - -2018-07-02 16:49:23 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvc1dec.c: - msdkdec: vc1: Fix handling of advanced profile elementary stream - Advanced profile elementary streams may not have codec_data - always. So make sure we don't do anything with null buffer. - -2018-07-02 16:48:11 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: Fix advanced profile vc1 decode when codec_data presents - The gst-msdk decoders only support packetized formats for - all codecs except VC1. For VC1, it supports codec_data for advanced - profiles and this codec_data wan't submitting to MSDK's DecodeHeader APIs. - Make sure the subclass deocders correctly configured so that - the codec_data buffers are in place in the internal adapter for - MediaSDK's DecoderHeader usage. - -2018-07-02 16:42:20 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: Fix the PTS of output frames - Currently we use the gst_video_decoder_get_oldest_frame() - to get the old pending frame to output. But this is not correct - if pts re-ordering required. This patch uses a custom made - get_old_frame() which accounts the PTS too similar to the - v4l2decoder. - https://bugzilla.gnome.org/show_bug.cgi?id=796699 - -2018-07-02 16:41:58 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - msdkdec: Remove dead code - We are not using any ExtendedParams for decoding. - -2018-07-02 16:17:49 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/gstmsdkvp9dec.c: - msdk: dec: Add dynamic-configuration change support - The patch adds a serios of changes to support dynamic resolution - change and efficient utilization of resources. - Major changes: - -- Use MSDK's apis to retrieve the headers instead of only relying - on upsteram notification. For eg: avc decoder requires SEI header - information for dpb count calculation which we don't get from caps. - -- For all codecs other than VP9, we force the reset of decoder - if resoultion changes to fit with gstreamer flow. VP9 enfource - the hard reset only if the new resolution is bigger. - -- delay the src caps setting till msdk api's invokation in - handle_frame to avoid caching multiple configuration values - -- ensure pool negotiation is based on decoder's allocation_caps. - --dynamic resoluttion change use an explicit allocation_query - to reclaim the buffers before closing the decoder (thanks to v4l2dec) - --In case if we don't get upstream notification of res change (for eg, - this can can happen for vp9 frames with ivfheader where ivfparse - is not able to notify the dynamic changes), we handle the the case - based on MFX_ERR_INCOMPATIBLE_VIDEO_PARAM which is the return value - of MFXVideoDECODE_DecodeFrameAsync - -- calculate the minimum surfaces to be preallocated based on - msdk suggestion, downstream requirement, async depth and scratch surface - count for smooth display. - https://bugzilla.gnome.org/show_bug.cgi?id=796566 - -2018-07-02 19:09:19 +0800 Roland Jon <rlandjon@gmail.com> - - * gst-libs/gst/player/gstplayer.c: - player: Avoid trying to join the player thread from itself - https://bugzilla.gnome.org/show_bug.cgi?id=796731 - -2018-07-01 10:44:45 +1000 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: Explicitly initialise mutex and condition - Fixes random crashes when an allocated webrtcbin isn't - given fresh 0-filled memory in its allocation. It works - mostly because GMutex and GCond are automatically initialised - in that case. - -2018-06-30 00:56:29 +1000 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/transportsendbin.c: - webrtc: Move the transportsendbin pad block removal - Move freeing of the pad blocks back to before we call the - GstBin state change function, as there's something racy - going on on the build server otherwise, where the pads don't - unblock during downward state changes. - This is a bit of a stab in the dark, since I can't recreate - the build server failure locally. - -2018-06-27 09:48:00 +0000 Sean-Der <sean@siobud.com> - - * ext/aom/gstav1dec.c: - aomenc: Handle 8 bit_depth images with AOM_IMG_FMT_HIGHBITDEPTH enabled - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2018-06-27 09:44:00 +0000 Sean-Der <sean@siobud.com> - - * ext/aom/gstav1dec.c: - aomenc: Add support for 10/12bit decoding - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2018-06-26 17:45:36 +0200 Georg Ottinger <g.ottinger@gmx.at> - - * gst/ivfparse/gstivfparse.c: - ivfparse: Add the AV01 FOURCC for parsing AV1 IVFs - Adds AV01 FOURCC to the list of allowed media files, in order to allow - parsing the IVF Container holding AV1 content. - At a later point dynamic resolution change can be supported - therefore - the sequence header OBU and frame header OBU of AV1 file must be parsed, - which can be done in future with the help of gst-lib gstav1parse. - https://bugzilla.gnome.org/show_bug.cgi?id=796677 - -2018-06-28 15:21:12 -0400 Thibault Saunier <tsaunier@igalia.com> - - * ext/openh264/meson.build: - meson: Add fallback for openh264 dependency - -2018-06-27 22:42:12 +1000 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/transportsendbin.c: - webrtc: Clean up pad block allocs on dispose. - Release references in pad blocks and release the memory in the - dispose function too, in case the state change doesn't get - run (because calling the parent state change fails). - -2018-06-27 03:05:55 +1000 Jan Schmidt <jan@centricular.com> - - * ext/webrtc/transportsendbin.c: - webrtc: Don't deadlock on block pads on shutdown - When changing state downward, we can't set pads - to inactive if they are blocked, it will deadlock - trying to acquire the streaming lock. - Just calling the parent state change function - will do the correct things to unblock probes and - set the pad inactive, so let it do that and - remove the probes after the parent state change - function has run - https://bugzilla.gnome.org/show_bug.cgi?id=796682 - -2018-06-24 00:17:26 +0200 Tim-Philipp Müller <tim@centricular.com> - - * sys/winks/gstksclock.c: - * sys/winks/gstksvideodevice.c: - * sys/winks/gstksvideosrc.c: - winks: Update for g_type_class_add_private() deprecation in recent GLib - Untested - -2018-06-24 00:17:26 +0200 Tim-Philipp Müller <tim@centricular.com> - - * sys/msdk/gstmsdkbufferpool.c: - * sys/msdk/gstmsdkcontext.c: - msdk: Update for g_type_class_add_private() deprecation in recent GLib - Untested. - -2018-06-24 00:17:26 +0200 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/insertbin/gstinsertbin.c: - * gst-libs/gst/uridownloader/gstfragment.c: - * gst-libs/gst/uridownloader/gsturidownloader.c: - libs: Update for g_type_class_add_private() deprecation in recent GLib - -2018-06-24 00:17:26 +0200 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Update for g_type_class_add_private() deprecation in recent GLib - -2018-06-24 00:17:26 +0200 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixerbin.c: - gl: Update for g_type_class_add_private() deprecation in recent GLib - -2018-06-24 00:17:26 +0200 Tim-Philipp Müller <tim@centricular.com> - - * ext/vulkan/vkbufferpool.c: - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkdisplay.c: - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkwindow.c: - * ext/vulkan/xcb/vkwindow_xcb.c: - vulkan: Update for g_type_class_add_private() deprecation in recent GLib - -2018-06-24 00:17:26 +0200 Tim-Philipp Müller <tim@centricular.com> - - * ext/soundtouch/gstbpmdetect.cc: - * ext/soundtouch/gstpitch.cc: - soundtouch: Update for g_type_class_add_private() deprecation in recent GLib - -2018-06-24 00:17:26 +0200 Tim-Philipp Müller <tim@centricular.com> - - * ext/dtls/gstdtlsagent.c: - * ext/dtls/gstdtlscertificate.c: - * ext/dtls/gstdtlsconnection.c: - dtls: Update for g_type_class_add_private() deprecation in recent GLib - -2018-06-24 00:17:26 +0200 Tim-Philipp Müller <tim@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/icestream.c: - * ext/webrtc/nicetransport.c: - webrtc: Update for g_type_class_add_private() deprecation in recent GLib - -2018-06-24 00:07:59 +0200 Tim-Philipp Müller <tim@centricular.com> - - * sys/uvch264/gstuvch264_mjpgdemux.c: - * sys/uvch264/gstuvch264_mjpgdemux.h: - uvch264src: get rid of unnecessary private struct - -2018-06-23 23:51:37 +0200 Tim-Philipp Müller <tim@centricular.com> - - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjifmux.h: - * gst/jpegformat/gstjpegparse.c: - * gst/jpegformat/gstjpegparse.h: - jpegformat: get rid of unnecessary private structs - -2018-06-21 08:49:01 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/closedcaption/misc.h: - ext/closedcaption/misc.h: Transform into UTF-8 - -2018-06-20 11:38:17 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - decklink: Fix warning about HRESULT not being unsigned int - -2018-06-18 23:06:18 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Don't set invalid seqnum on segment event - https://bugzilla.gnome.org/show_bug.cgi?id=796623 - -2018-06-18 23:42:04 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/soundtouch/gstpitch.cc: - pitch: remove trailing whitespaces from previous commit - -2018-06-18 07:39:10 +0530 Suhas Nayak <suhas2go@gmail.com> - - * ext/soundtouch/gstpitch.cc: - pitch: Flush only if there are unprocessed samples - Otherwise we end up trying to flush before - sample rate of SoundTouch is set - https://bugzilla.gnome.org/show_bug.cgi?id=796613 - -2018-06-18 12:18:07 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/dash_demux.c: - * tests/check/elements/dash_mpd.c: - * tests/check/elements/hls_demux.c: - * tests/check/elements/mssdemux.c: - tests: Make sure to provide the KEY_UNIT flag always together with the SNAP flags in seeks - SNAP flags alone make no sense and nowadays cause warnings. - -2018-06-16 18:23:41 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/soundtouch/gstpitch.cc: - pitch: preserve seek event seqnums - This was wreaking havoc when used with a downstream audiomixer. - https://bugzilla.gnome.org/show_bug.cgi?id=796603 - -2018-06-16 18:21:58 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/soundtouch/gstpitch.cc: - pitch: fix latency reporting - When max is GST_CLOCK_TIME_NONE in the query, it should not - be set in the query handler, this otherwise could lead to - impossible situations, where the minimum latency ended up - greater than the maximum. - https://bugzilla.gnome.org/show_bug.cgi?id=796603 - -2018-06-16 18:19:39 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/soundtouch/gstpitch.cc: - pitch: Fix single input buffer followed by EOS - The flush function immediately returned when pitch->next_buffer_offset - was 0. - This is clearly wrong, as next_buffer_offset can be 0 when a single - input buffer has been received, and no output buffer has been produced - before receiving EOS. - Simply remove that condition. - https://bugzilla.gnome.org/show_bug.cgi?id=796603 - -2018-06-15 22:48:42 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Fix string leak - gst_video_colorimetry_to_string() returns allocated memory which - must be freed. - https://bugzilla.gnome.org/show_bug.cgi?id=796596 - -2018-03-07 00:07:29 +1100 Jan Schmidt <jan@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Invert the transform matrix from the decoder - The transform from mediacodec applies to the texture coords, but - GStreamer affine meta applies to the video geometry, which is the - opposite - so invert it to get display correct for decoders - that require transforming - -2018-02-08 17:02:17 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkinstance.c: - vulkaninstance: add missing precondition to _open() - -2018-06-12 11:14:25 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Don't query duration if program isn't active - -2018-06-11 18:34:24 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/webrtc/rtcsessiondescription.c: - gst_webrtc_session_description_new: fix annotations - -2018-06-11 13:48:09 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: log an ERROR if we're going to return a flow error - -2018-06-07 15:31:54 -0800 Wang,Fei <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - msdk: vpp: remove mfxExtVPPDoUse from vpp filters. - According to msdk spec, there are two ways to enable filters: - 1: Filters can be enabled by adding a filter ID - to mfxExtVPPDoUse. In this case, default filter parameters are used - 2: Add filter configuration structures directly to mfxVideoParam. - Using 1 with 2 is optional but legal. Unfortunately it won't work - with some specific use cases like Detail/EdgeEnhancement. - Let's stick with option2 which works fine for all VPP operations. - https://bugzilla.gnome.org/show_bug.cgi?id=796468 - -2018-06-07 15:30:23 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdk: vpp: set passthrough from set_caps method for code clarity - Call passthrough setting method from set_caps so that - msdk initialize subroutine looks more clear. - -2018-06-07 15:29:29 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - mskd: vpp: error out gracefully instead of segfaulting if Init failed - Since we do the MSDK initializing in set_caps(), a FALSE - return may still cause the invokation of set_caps() again - and this will leads to buffer allocation and other mess-up. - So make sure the msdk initialized correctly before trying - to do any buffer allocation. - https://bugzilla.gnome.org/show_bug.cgi?id=796465 - -2018-06-07 15:28:44 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdk: vpp: Add filters to VideoParm before doing the Query - Make sure all the enabled filter structures are added in the - mfxVideoParm before doing the VPPQuery so that msdk - can do the input param validation - https://bugzilla.gnome.org/show_bug.cgi?id=796465 - -2018-06-06 14:32:56 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/examples/compositor/meson.build: - * tests/examples/mpegts/meson.build: - * tests/examples/webrtc/meson.build: - examples: Don't install non-prefixed examples - -2018-06-06 14:31:43 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/examples/meson.build: - * tests/examples/waylandsink/meson.build: - examples: Build waylandsink example - -2018-06-06 07:51:19 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Fix SEGMENT seqnum propagation - * If the seek was handled upstream, use that SEGMENT seqnum - * Use the proper invalid default value - -2018-06-06 07:50:21 +0200 Edward Hervey <edward@centricular.com> - - * sys/vdpau/gstvdpsink.c: - vdpau: Run gst-indent - -2018-06-05 17:01:13 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdk: vpp: fix the filter count in mfxExtVPPDoUse - Repostion the mfxExtVPPDoUse enabling code - so that it will get the filter algorithm count correctly. - -2018-06-05 14:11:13 -0400 Thibault Saunier <tsaunier@igalia.com> - - * gst-libs/gst/webrtc/dtlstransport.h: - * gst-libs/gst/webrtc/icetransport.h: - webrtc: Fix wrong parent classes for DTLSTransport and ICETransport - Those are GObjects not GstBins - -2018-06-04 16:35:41 +0800 Lyon Wang <lyon.wang@nxp.com> - - * gst-libs/gst/player/gstplayer.c: - player: Fix duration-changed CRITICAL warning if duration did not actually change - Check if duration is changed before emitting duration-changed signal - https://bugzilla.gnome.org/show_bug.cgi?id=796491 - -2018-06-01 17:07:19 +1000 Jan Schmidt <jan@centricular.com> - - * sys/dvb/camconditionalaccess.h: - dvb: Fix typo in comment termination - -2018-06-01 16:37:13 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/dvb/cam.c: - * sys/dvb/cam.h: - * sys/dvb/camapplication.c: - * sys/dvb/camapplication.h: - * sys/dvb/camapplicationinfo.c: - * sys/dvb/camapplicationinfo.h: - * sys/dvb/camconditionalaccess.c: - * sys/dvb/camconditionalaccess.h: - * sys/dvb/camdevice.c: - * sys/dvb/camdevice.h: - * sys/dvb/camresourcemanager.c: - * sys/dvb/camresourcemanager.h: - * sys/dvb/camsession.c: - * sys/dvb/camsession.h: - * sys/dvb/camswclient.c: - * sys/dvb/camswclient.h: - * sys/dvb/camtransport.c: - * sys/dvb/camtransport.h: - * sys/dvb/camutils.c: - * sys/dvb/camutils.h: - * sys/dvb/dvbbasebin.c: - * sys/dvb/dvbbasebin.h: - * sys/dvb/gstdvb.c: - dvb: update my email address - -2018-06-01 16:30:12 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/dvb/camconditionalaccess.c: - * sys/dvb/camconditionalaccess.h: - dvb: camconditionalaccess: fix wrong license headers - Update the license blurb in camconditionalaccess.hc from GPL to LGPL. - The plugin is LGPL and the GPL header in those two files was just a - copy/paste mistake. - -2018-06-01 08:20:21 +0200 Edward Hervey <edward@centricular.com> - - * tests/check/libs/.gitignore: - gitignore: Add h265parser test - -2018-05-31 18:21:58 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - codecparsers: mpeg2: don't mess the StartCode only packets - It is completely legal to have packets with zero sizes. - Zero-sized packet indicates header with only Start Code. - One eg: is user data packet. The patch allows having - GstMpegVideoPacket with zero sizes. - https://bugzilla.gnome.org/show_bug.cgi?id=796477 - -2018-05-30 16:27:37 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdk: vpp: don't use NV12 as vpp default output for DMABuf usecase - Using NV12 layout in dmabuf mode giving mis-aligned - VPP output with the media-driver. Keep the NV12 support - (so that we can file the bug agianst msdk or mediadriver), - but lower the ordering so that BGRA picks as default. - NV12 issue can be reproduced with explicit capfilter: - vidoetestsrc ! msdkvpp ! video/x-raw\(memory:DMABuf\),format=NV12 ! glimagesink - -2018-05-30 16:26:27 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdk: enc: Add supprot for dmabuf-import - MediaSDK requires all the input buffers to be - pre-allocated during init phase and this won't work with - current design of GStreamer or gst-msdk. But this can be - done in future once we have a solution for: - https://bugzilla.gnome.org/show_bug.cgi?id=795747 - There is a workaround possible as per - https://github.com/Intel-Media-SDK/MediaSDK/issues/155#issuecomment-381790504 - by faking the mem-id during MFXInit. - This patch enabling it in gst-msdk by replacing the MemID of mfxSurface - with dmabuf-backed vasurface dynamically. - Important: v4l2 ! msdkenc won't work without a copy because - of the GMMLib (https://github.com/intel/gmmlib) memory restrictions. - https://bugzilla.gnome.org/show_bug.cgi?id=794817 - -2018-05-30 16:24:24 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdk: vpp: Add supprot for dmabuf-import - MediaSDK requires all the input and output buffers to be - pre-allocated during init phase and this won't work with - current design of GStreamer or gst-msdk. But this can be - done with https://bugzilla.gnome.org/show_bug.cgi?id=795747 - There is a workaround possible as per - https://github.com/Intel-Media-SDK/MediaSDK/issues/155#issuecomment-381790504 - by faking the mem-id during MFXInit. - This patch do this in gst-msdk by replacing the MemID of mfxSurface - with dmabuf-backed vasurface dynamically. - Important: v4l2 ! msdkvpp won't work without a copy because - of the GMMLib (https://github.com/intel/gmmlib) memory restrictions. - https://bugzilla.gnome.org/show_bug.cgi?id=794817 - -2018-05-30 16:23:44 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdkallocator_libva.h: - msdk: Add method to replace internal VASurface of mfxFrameSurface - Added a utility method to replace the MemID (interanl VASurfaceID) - associated with the mfxFrameSurface. This is usefull for dmabuf-import - where we need to replace the memID dynamically - https://bugzilla.gnome.org/show_bug.cgi?id=794817 - -2018-05-30 16:22:49 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdkallocator_libva.h: - msdk: Add method to export dmabuf to VASurface - Exporting DRM_PRIME fd to VASurface requires direct - invocation of VA api VACreateSurface with - VASurfaceAttribExternalBufferDescriptor and other - necessary surface attributes. - https://bugzilla.gnome.org/show_bug.cgi?id=794817 - -2018-05-29 13:03:54 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: copy sticky events on our ghostpads - This lets users call gst_pad_get_current_caps on newly-added - pads to easily determine what to plug them into. - We cannot copy sticky events unconditionally in core, - see #719437 - https://bugzilla.gnome.org/show_bug.cgi?id=796387 - -2017-07-10 16:56:26 +0900 Hosang Lee <hosang10.lee@lge.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Set connection-speed value as current download rate if set - If connection-speed property is in use, this value should be used as the - current download rate since subclasses might read it to figure out - which playlist variant they will use. - https://bugzilla.gnome.org/show_bug.cgi?id=784592 - -2018-05-28 15:55:57 +0200 Edward Hervey <edward@centricular.com> - - * ext/closedcaption/gstcea708decoder.c: - * ext/closedcaption/gstceaccoverlay.c: - * ext/closedcaption/misc.h: - closedcaption: Fix compilation without debugging - -2015-03-11 18:00:08 +0800 Edward Hervey <edward@centricular.com> - - * ext/closedcaption/Makefile.am: - * ext/closedcaption/gstcea708decoder.c: - * ext/closedcaption/gstcea708decoder.h: - * ext/closedcaption/gstceaccoverlay.c: - * ext/closedcaption/gstceaccoverlay.h: - * ext/closedcaption/gstclosedcaption.c: - * ext/closedcaption/meson.build: - ceaccoverlay: New CEA-708 Closed Caption decoder and overlayer - This new element allows decoding and overlaying CEA-708 Closed Caption - streams over video. - * Supports CDP and cc_data closedcaption/x-cea-708 streams - * Uses pango to render CC stream - * Support GstVideoOverlayComposition meta if downstream supports is - Tested on various test files. - Remains to be fixed/improved: - * Switch to GstByteReader (for code safety) - * Switch to GString (instead of manual pango string construction) - * Move pango/rendering code outside of main 708 decoder file (so - that actual CC parser/decoder can be (re)used in other scenarios). - Initial patches and improvements by: - * CableLabs RUIH-RI Team <ruihri@cablelabs.com> - * Steve Maynard <steve@secondstryke.com> - * cjun.wang" <cjun.wang@samsung.com> - https://bugzilla.gnome.org/show_bug.cgi?id=704881 - -2018-05-28 14:16:48 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/closedcaption/meson.build: - closedcaption: fix meson build - -2018-03-19 10:56:31 +0100 Edward Hervey <edward@centricular.com> - - * ext/closedcaption/Makefile.am: - * ext/closedcaption/gstclosedcaption.c: - * ext/closedcaption/gstline21dec.c: - * ext/closedcaption/gstline21dec.h: - closedcaption: Add new "line 21 VBI" CC decoder - Allows detecting and extracting CEA608 closed caption present on - the VBI of analog NTSC SD signals. - -2018-03-19 10:55:06 +0100 Edward Hervey <edward@centricular.com> - - * ext/closedcaption/decoder.c: - * ext/closedcaption/decoder.h: - * ext/closedcaption/misc.h: - closedcaption: zvbi: Add gst-debug category to zvbi code - And adapt their logging system to go through it - -2018-03-19 10:53:52 +0100 Edward Hervey <edward@centricular.com> - - * ext/closedcaption/decoder.c: - * ext/closedcaption/decoder.h: - closedcaption: zvbi: Disable unused legacy bit slicer - The code only uses the new 'optimized' bit slicer - -2018-03-19 10:52:08 +0100 Edward Hervey <edward@centricular.com> - - * ext/closedcaption/raw_decoder.c: - closedcaption: zvbi: Enforce strict line21 CC detection - zvbi switched to a lot more flexible CC detection in VBI. - The problem is that it returns a *lot* of non-VBI lines as containing - CC which isn't the case. - -2018-03-22 15:35:45 +0100 Edward Hervey <edward@centricular.com> - - * ext/closedcaption/misc.h: - closedcaption: zvbi: Comment out bogus redefinition - All this code should be converted to glib eventually, but for now - just comment out a function which isn't even used - -2018-03-20 09:01:25 +0100 Edward Hervey <edward@centricular.com> - - * ext/closedcaption/bit_slicer.c: - closedcaption: zvbi: Remove dead code - * RGB8 is never used - * some inline functions were never used - -2018-03-15 07:07:16 +0100 Edward Hervey <edward@centricular.com> - - * ext/closedcaption/Makefile.am: - * ext/closedcaption/bcd.h: - * ext/closedcaption/bit_slicer.c: - * ext/closedcaption/bit_slicer.h: - * ext/closedcaption/decoder.c: - * ext/closedcaption/decoder.h: - * ext/closedcaption/macros.h: - * ext/closedcaption/misc.h: - * ext/closedcaption/raw_decoder.c: - * ext/closedcaption/raw_decoder.h: - * ext/closedcaption/sampling_par.c: - * ext/closedcaption/sampling_par.h: - * ext/closedcaption/sliced.h: - closedcaption: Include zvbi raw vbi decoder code - Current code from zapping/zvbi as of 2018-03-14. Files copied - are all LGPL v2+. - Changes from original zvbi code: - * Switch to gst-debug logging system - * Use glib for endianness detection - * Fix compilation warnings - -2018-05-28 11:09:45 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/closedcaption/meson.build: - * ext/meson.build: - closedcaption: add meson build files - -2018-03-08 15:22:47 +0100 Edward Hervey <edward@centricular.com> - - * configure.ac: - * ext/Makefile.am: - * ext/closedcaption/Makefile.am: - * ext/closedcaption/gstccextractor.c: - * ext/closedcaption/gstccextractor.h: - * ext/closedcaption/gstclosedcaption.c: - ext: New ccextractor element - Allows extracting GstVideoCaptionMeta from a stream and outputs - it to a standalone stream. - Part of a new 'ext' closedcaption plugin, since more features are - going to be added, which will depend on external dependencies such - as pango. - -2018-05-27 20:34:50 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: rtpstorage takes a 64-bit integer for "size-time" property - https://bugzilla.gnome.org/show_bug.cgi?id=796429 - -2018-05-25 19:49:34 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/directfb/Makefile.am: - * tests/examples/directfb/Makefile.am: - directfb: don't error out for warnings in system headers - On debian system headers trigger compiler warnings like these, - don't error out on them: - /usr/include/directfb/direct/os/linux/glibc/waitqueue.h:95:1: note: previous definition of ‘direct_waitqueue_signal’ was here - -2018-05-28 10:59:01 +0200 Edward Hervey <edward@centricular.com> - - * .gitignore: - gitignore: Add new webrtc example - -2018-05-23 21:15:09 +0200 Christoph Reiter <reiter.christoph@gmail.com> - - * sys/wasapi/gstwasapisink.c: - wasapisink: recover from low buffer levels in shared mode - In case the wasapi buffer levels got low in shared mode we would still wait until - more buffer is available until writing something in it, which means we could never - catch up and recover. - Instead only wait for a new buffer in case the existing one is full and always write - what we can. Also don't loop until all data is written since the base class can handle - that for us and under normal circumstances this doesn't happen anyway. - This only works in shared mode, as in exclusive mode we have to exactly - fill the buffer and always have to wait first. - This fixes noisy (buffer underrun) playback with the wasapisink under load. - https://bugzilla.gnome.org/show_bug.cgi?id=796354 - -2018-05-24 11:04:08 +0200 Christoph Reiter <reiter.christoph@gmail.com> - - * sys/wasapi/gstwasapiutil.c: - wasapisink: fix a rounding error when calculating the buffer frame count - The calculation for the frame count in the non-aligned case resulted in - a one too low buffer frame count. - This resulted in: - 1) exclusive mode not working as the frame count has to match - exactly there. - 2) Buffer underruns in shared mode as the current write() code doesn't - handle catching up to low buffer levels (fixed in the next commit) - To fix just use the wasapi API to get the buffer size which will always - be correct. - https://bugzilla.gnome.org/show_bug.cgi?id=796354 - -2018-05-23 21:10:00 +0200 Christoph Reiter <reiter.christoph@gmail.com> - - * sys/wasapi/gstwasapisink.c: - wasapisink: fix missing unlock in case IAudioClient_Start fails - https://bugzilla.gnome.org/show_bug.cgi?id=796354 - -2018-05-22 22:58:22 +0200 Christoph Reiter <reiter.christoph@gmail.com> - - * sys/wasapi/gstwasapiutil.h: - wasapi: use FAILED to detect errors - S_FALSE is a valid return value which does not indicate an error. - For example IAudioClient_Stop() returns S_FALSE when it is already stopped. - Use the FAILED macro instead which just checks if an error occured or not. - This fixes spurious warnings when using the wasapisink element. - https://bugzilla.gnome.org/show_bug.cgi?id=796280 - -2018-05-22 22:12:34 +0200 Christoph Reiter <reiter.christoph@gmail.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - wasapi: Don't pass CoTaskMemFree to g_clear_pointer - CoTaskMemFree has a different calling convention than GDestroyNotify - and things crash at least with MinGW. - https://bugzilla.gnome.org/show_bug.cgi?id=796280 - -2018-05-21 14:42:56 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/webrtc/meson.build: - meson: fix libnice fallback options - -2018-05-21 12:07:04 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - * meson_options.txt: - meson: add 'nls' option to disable translations - And enable by default. Was implicitly disabled because - ENABLE_NLS was not defined. - -2018-05-19 12:24:40 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/webrtc/meson.build: - webrtc: add some default options for libnice fallback - The tests are not very reliable, so disable for now. - -2018-05-18 18:42:43 +0100 Russel Winder <russel@winder.org.uk> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegts: Add GIR generation array anotations - For function parameters that are known to be arrays. - https://bugzilla.gnome.org/show_bug.cgi?id=796221 - -2018-05-19 11:03:08 +0200 Edward Hervey <edward@centricular.com> - - * sys/dvb/camswclient.c: - dvb: Fix string copy wiht strlen() argument - This is a new warning introduced by gcc 8 - We already check just before that we have enough space, just do a regular - memcpy with the full string size. - camswclient.c:87:3: error: ‘strncpy’ specified bound depends on the length of the source argument -Werror=stringop-overflow= - -2014-04-18 10:38:47 +0200 Antoine Jacoutot <ajacoutot@gnome.org> - - * gst-libs/gst/insertbin/Makefile.am: - * gst-libs/gst/mpegts/Makefile.am: - libs: g-ir-scanner: do not hardcode libtool path - https://bugzilla.gnome.org/show_bug.cgi?id=726571 - -2018-05-17 21:36:51 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * configure.ac: - nvdec/nvenc: Bump up supported CUDA Toolkit version - Add CUDA 9.2 to configure.ac - https://bugzilla.gnome.org/show_bug.cgi?id=796202 - -2018-05-17 21:49:25 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvenc/gstnvenc.c: - nvenc: Fix build warning error - 'cuDeviceComputeCapability' was deprecated as of CUDA 5.0 - gstnvenc.c: In function ‘gst_nvenc_create_cuda_context’: - gstnvenc.c:290:9: error: ‘cuDeviceComputeCapability’ is deprecated -Werror=deprecated-declarations - && cuDeviceComputeCapability (&maj, &min, cdev) == CUDA_SUCCESS) { - ^ - https://bugzilla.gnome.org/show_bug.cgi?id=796203 - -2018-04-23 13:30:38 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Remove custom get_next_time implementation - GstAggregator now has the same thing in the simple implementation. - https://bugzilla.gnome.org/show_bug.cgi?id=795486 - -2018-05-15 16:33:00 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkvp9dec.c: - msdk: Add conditional build for vp9 decoder - https://bugzilla.gnome.org/show_bug.cgi?id=796119 - -2018-05-15 16:32:22 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkvp9dec.c: - * sys/msdk/gstmsdkvp9dec.h: - msdk: dec: Add VP9 decoder - https://bugzilla.gnome.org/show_bug.cgi?id=796119 - -2018-05-15 16:31:02 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - * sys/msdk/gstmsdkh265dec.c: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkmjpegdec.c: - * sys/msdk/gstmsdkmjpegenc.c: - * sys/msdk/gstmsdkvp8dec.c: - * sys/msdk/gstmsdkvp8enc.c: - * sys/msdk/msdk.h: - * sys/msdk/msdk_libva.h: - msdk: allow building against open sourced msdk - Building against mfx_dispatcher is used to search for - headers in PREFIX/include/mfx/ only (commit: 62f04e801bd7e247102ac67df889bee33ab74ff7), - but it is just PREFIX/include with open source msdk version. - https://bugzilla.gnome.org/show_bug.cgi?id=796118 - -2018-05-11 15:49:05 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix sync of updated manifest from previous one - _get_next_fragment_timestamp() returns relative timestamp to period start. - But gst_mpd_client_stream_seek() uses absolute MPD timeline. - https://bugzilla.gnome.org/show_bug.cgi?id=781183 - -2018-05-10 23:08:10 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Support period change in live playlist - Regardless of LIVE or VOD, "a manifest has next period but - currently EOSed" state is meaning that it's time to advance period. - Previous behavior of adpativedemux, however, was able to period - advancing only for VOD case, since the adaptivedemux tried to - update and wait new manifest without respecting existence of the next period. - https://bugzilla.gnome.org/show_bug.cgi?id=781183 - -2018-05-11 20:54:35 +0200 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - srtp: Add "roc" caps field to the gst-launch example - The currrent example was broken since 1.8.3 it seems. - https://bugzilla.gnome.org/show_bug.cgi?id=786304 - -2018-05-11 17:39:35 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Fix crash with closed-captions signal and 10-bit input - Only free the parser if there is one. If the format hadn't changed but - had always been 10-bit, there might genuinely be no parser. - https://bugzilla.gnome.org/show_bug.cgi?id=796030 - -2018-05-11 12:30:35 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Don't check for closed captions when there's no signal - Otherwise the gst_decklink_video_format_from_type() call spams the logs - with one "Unknown pixel format 0x0" line per frame. - -2018-05-11 09:54:22 +0200 Edward Hervey <edward@centricular.com> - - * ext/opencv/gstgrabcut.cpp: - opencv: Fix memcpy within C++ - Explicitly cast to void* because GCC 8 is (rightfully) upset that this is - "writing to an object of type ‘...’ with no trivial copy-assignment". - Caused by the new "class-memaccess" warning - -2017-11-29 17:57:52 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/webrtctransceiver.c: - * ext/webrtc/webrtctransceiver.h: - * gst-libs/gst/webrtc/webrtc_fwd.h: - * tests/check/elements/webrtcbin.c: - * tests/examples/webrtc/Makefile.am: - * tests/examples/webrtc/meson.build: - * tests/examples/webrtc/webrtctransceiver.c: - webrtcbin: implement support for FEC and RTX - https://bugzilla.gnome.org/show_bug.cgi?id=795044 - -2018-05-07 14:12:10 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/msdk-enums.c: - * sys/msdk/msdk-enums.h: - msdk:dec: Add new propery to dump frames in decoded order - The new property "output-order" can be set to either "display" order - which is the default where frames will be outputting in display order, - or "decoded-order" which will be outputting the frames in decoded order. - The "decoded order" output is generally useful for debugging. But there - are few - customers who use it for low-latency streaming. For eg if the customer - already knows that the stream doesn't have b-frames (which means no - algorithm requires for display order calculation), then they can use - "decoded-order" - output to skip some of the DPB logic to avoid the frame accumulation at - start-up. - The root cause of the above issue is a bit of unclarity in h264 spec + - lazy implementation of many H264 encoders; This is well handled in - gstreamer-vaapi using "low-latency" property: - https://bugzilla.gnome.org/show_bug.cgi?id=762509 - https://bugzilla.gnome.org/show_bug.cgi?id=795783 - -2018-05-07 14:11:34 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdk: dec: inform msdk if the buffer contains a complete frame - For packetized input, inform the msdk that the buffer has - a complete frame or complementary field pairs. For decoding, - this means that the decoder can proceed with this buffer without - waiting for the start of the next frame, which effectively reduces - decoding latency. - https://bugzilla.gnome.org/show_bug.cgi?id=795783 - -2018-05-07 14:11:14 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdk: dec: reset async depth to one - Currently we use an async depth of 4 as default (based on - recommendations - in msdk apps), which indicates how many asynchronous operations an - application performs - before the application explicitly synchronizes the result. As a result, - we - queue four frames in decoder which might not be good approach for - live streaming. - This patch reset the async-depth to 1 as default so that we do sync for - each frame we decode without queuing. Customer can play with already - exposed "async-depth" property for other use cases - https://bugzilla.gnome.org/show_bug.cgi?id=795783 - -2018-05-07 17:53:32 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Set video-meta option on buffer pool configuration correctly - CID 1435451 - -2018-05-07 09:17:16 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: First override set/get_property vfuncs, then install properties - Gives assertions otherwise. - -2016-02-02 19:18:26 +0200 Kyrylo Polezhaiev <kirushyk@gmail.com> - - * gst/gdp/dataprotocol.c: - * gst/gdp/gstgdppay.c: - gdp: ignore timestamp of event - This field is not used and will be removed in 2.0 API. - https://bugzilla.gnome.org/show_bug.cgi?id=761462 - -2018-05-06 16:49:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.h: - videoaggregator: Some more documentation fixes - -2018-05-06 16:44:47 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: expose converter-config on convert pads - This in order to allow users control over the conversion - process, for example the scaling method. - -2018-05-06 16:43:32 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Fix up documentation some more - -2018-05-06 16:22:01 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - videoaggregator: Clean up header and update docs a bit - -2018-05-06 16:05:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglstereomix.c: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - videoaggregator: Rename get_output_buffer() to create_output_buffer() - For consistency with GstAudioAggregator. - -2018-05-06 15:49:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Validate pool configuration and create a new pool if it just does not work - Also pass the given allocator to the pool if one is set. - -2018-05-06 15:21:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglmixer.c: - * ext/iqa/iqa.c: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - * gst/compositor/compositor.c: - * gst/compositor/compositorpad.h: - videoaggregator: Switch to a GstVideoAggregatorConvertPad subclass - This moves all the conversion related code to a single place, allows - less code-duplication inside compositor and makes the glmixer code less - awkward. It's also the same pattern as used by GstAudioAggregator. - -2017-02-23 11:48:13 +0100 Fabien Dessenne <fabien.dessenne@st.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: support fullscreen - Add the fullscreen property that makes the sink displayed all across - the output. - https://bugzilla.gnome.org/show_bug.cgi?id=688190 - -2018-05-05 17:55:58 +0200 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-kms.xml: - docs: plugins: update - -2018-05-05 17:47:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: Include string.h for memset() - gstglmixer.c:143:5: error: implicit declaration of function ‘memset’ -Werror=implicit-function-declaration - memset (prepared_frame, 0, sizeof (GstVideoFrame)); - ^~~~~~ - gstglmixer.c:143:5: error: incompatible implicit declaration of built-in function ‘memset’ -Werror - -2018-05-05 19:30:42 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson.build: - * meson_options.txt: - * tests/check/meson.build: - meson: Update option names to omit disable_ and with- prefixes - Also yield common options to the outer project (gst-build in our case) - so that they don't have to be set manually. - -2018-05-05 14:32:59 +0000 Jan Schmidt <jan@centricular.com> - - * configure.ac: - * tests/examples/Makefile.am: - waylandsink: Only build if gtk-3.0 was built with wayland target - Check in configure if the gtk-3.0 has wayland support, and don't - build the waylandsink example if it doesn't. - -2018-05-05 16:31:13 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - videoaggregator: Remove sink_non_alpha_caps class field - This is only used for caching reasons and should never actually be in - the public API. If this is ever a bottleneck later, caching around a - class private struct could be implemented. - -2018-05-05 16:14:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - * gst/compositor/compositor.c: - videoaggregator: Move needs_alpha pad field to the private struct - And also trigger renegotiation if the value has changed. - https://bugzilla.gnome.org/show_bug.cgi?id=795836 - -2018-05-05 15:49:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstglstereomix.c: - * ext/gl/gstglvideomixer.c: - * ext/iqa/iqa.c: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - * gst/compositor/compositor.c: - videoaggregator: Move aggregated_frame and the pad buffer into the private struct - The aggregated_frame is now called prepared_frame and passed to the - prepare_frame and cleanup_frame virtual methods directly. For the - currently queued buffer there is a method on the video aggregator pad - now. - -2018-05-05 18:48:13 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/webrtc/meson.build: - meson: Add a subproject fallback for libnice in webrtc - -2018-05-05 12:16:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: Move frame/texture mapping/unmapping into prepare/clean_frame - Previously we assumed that the texture ID is going to be valid even - after unmapping the frame, as it was immediately unmapped before even - being used. Now we only unmap once we're done with the texture. - -2018-05-05 14:37:06 +0900 Seungha Yang <seungha.yang@navercorp.com> - - * sys/nvdec/gstnvdec.c: - nvdec: Add support VP8/VP9 decoding - NVIDIA video decoder supports VP8 and VP9 decoding - https://bugzilla.gnome.org/show_bug.cgi?id=795823 - -2018-05-05 01:59:53 +1000 Jan Schmidt <jan@centricular.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: Handle session object disappearing - During element shutdown, the srtp encryption session - object can be cleaned up. In that case, return GST_FLOW_FLUSHING - from the chain function. Also properly return GST_FLOW_ERROR - upstream during actual errors. - https://bugzilla.gnome.org/show_bug.cgi?id=790508 - -2018-05-04 17:18:12 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - videoaggregator: Move property storage to private pad struct - -2018-05-04 16:46:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - * tests/check/elements/compositor.c: - * tests/examples/playout.c: - videoaggregator: Rename ignore-eos pad property to repeat-after-eos - What it does is to repeat the last frame forever after EOS, it does not - literally ignore EOS. - -2018-05-04 16:13:16 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglmosaic.c: - * ext/gl/gstglstereomix.c: - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst/compositor/compositor.c: - videoaggregator: Move GstChildProxy implementations into leaf classes - Not every subclass will want to expose the pads via the interface. - https://bugzilla.gnome.org/show_bug.cgi?id=739011 - -2018-05-04 14:53:21 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - * gst-libs/gst/video/meson.build: - videoaggregator: Get rid of separate header for the aggregator pad - -2015-03-16 16:20:44 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: ignore sparse stream when checking for initial timestamp - Unless we only have sparse streams. In this case we will consider them. - It fixes a bug happening when first observed timestamp comes from a - sparse stream and other streams don't have a valid timestamp, yet. Thus - leading the timestamp from sparse stream to be the start of the - following segment. In this case, if the timestamp is really bigger than - non-sparse stream (audio/video), it will lead the pipeline to clip - samples from the non-parse stream. - https://bugzilla.gnome.org/show_bug.cgi?id=744469 - -2018-05-04 22:24:18 +1000 Jan Schmidt <jan@centricular.com> - - * ext/resindvd/resindvdsrc.c: - resindvsrc: Don't use the GST_EVENT_TIMESTAMP - Store a PTS of a highlight event directly into the event structure, - rather than the GST_EVENT_TIMESTAMP that will probably be removed - in GStreamer 2.0, and is hardly used. - https://bugzilla.gnome.org/show_bug.cgi?id=761477 - -2014-10-27 09:41:51 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst/videofilters/gstscenechange.c: - scenechange: improve detection algorithm - Scene detection determines, how many scenes have changed in a video. - It compared the previous frame with present frame to find out the score and a - threshold is calculated for the same. - I have added an intermediate condition which helps in improving the positive - detections. - https://bugzilla.gnome.org/show_bug.cgi?id=735094 - -2018-05-02 14:52:24 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - msdk: enc: Add dmabuf-export support - Current implementation is only supporting dmabuf-export - through DMABufCapsfeatures. - MSDK dmabuf fds are not mappable and dmabuf-import - is not yet supported too (#794817). - https://bugzilla.gnome.org/show_bug.cgi?id=795707 - -2018-04-30 12:40:32 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - msdkvpp: Disable passthrough if memory capsfeature changes - So far msdk produced dmabuf fds are non-mappable. - If user wants to download the content of underlined surfaces, - dmabufcapsfeature negotiated pipeline will fail. So if the input surface - is dmabuf and downstream doesn't have support for dmabuf capsfeatures, - we do the vpp (no passthrough) and produce the mappable videomemory - buffers. - https://bugzilla.gnome.org/show_bug.cgi?id=794946 - -2018-04-30 12:39:52 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - msdk: vpp: Add dmabuf-export support - Currenly, the dmabuf buffer pool can be negotiated - only through DMABuf capsfeatures. - This will not allow to negotiate dmabuf support with - v4l2src (v4l2src ! msdkvpp) where v4l2src always export - the dmabuf based memory with out using the DMABuf capsfeatures. - So it requires fix based on: - https://bugzilla.gnome.org/show_bug.cgi?id=794817 - https://bugzilla.gnome.org/show_bug.cgi?id=794946 - -2018-04-28 01:15:44 +1000 Jan Schmidt <jan@centricular.com> - - * sys/nvdec/gstnvdec.c: - nvdec: Add colorimetry info to the caps - Output any colorimetry information extracted from the stream - into the caps. - -2018-04-27 14:41:14 +1000 Jan Schmidt <jan@centricular.com> - - * sys/nvdec/gstnvdec.c: - nvdec: Use gst_video_info_to_caps to build caps. - Don't build caps directly, as that won't add any GstVideoInfo - newer fields (such as colorimetry) automatically. - -2018-03-08 20:23:05 +0000 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsutils.c: - kmssink: Add 24bit RGB support - https://bugzilla.gnome.org/show_bug.cgi?id=794186 - -2018-04-25 12:26:43 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdk: vpp: Add YV12, YUY2 and BGRx formats to template - -2018-04-24 16:46:20 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/msdk.c: - msdk: Add more video format mapping - BGRx format can be supported with Msdk's RGB4 - -2018-04-24 16:45:24 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - msdk: vpp: Allocation query fixes - prpose_allocation: - -- always instantiate a pool for for upstream - -- use async_depth + 1 as min buffer count - decide_allocation: - -- always create a new bufferpool for source pad. - Each of the msdk element has to create it's own mfxsurfacepool - which is an msdk contraint. For eg: Each Msdk component (vpp, dec and - enc) - will invoke the external Frame allocator for video-memory usage - So sharing the pool between gst-msdk elements might not be a good idea. - https://bugzilla.gnome.org/show_bug.cgi?id=793705 - -2018-04-25 15:05:38 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/gstrfbsrc.c: - rfbsrc: Fix decide_allocation to support NULL pool - We were assuming that NULL pool meant that downstream didn't reply. - Update the pool index 0 instead of adding at the end. Otherwise we ended - up letting basesrc decide, which would pick the blocksize as a size - (4096) instead of the image size. - https://bugzilla.gnome.org/show_bug.cgi?id=795327 - -2018-04-25 13:36:01 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/rfbdecoder.c: - rfbsrc: Fix support for applevncserver - This server uses an unknown 003.889 protocol version. This patch fixes - the version validation in order to simply fallback to 3.3 as suggested - by the spec. - -2018-04-24 14:05:30 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * ext/aom/meson.build: - * ext/assrender/meson.build: - * ext/bs2b/meson.build: - * ext/bz2/meson.build: - * ext/chromaprint/meson.build: - * ext/curl/meson.build: - * ext/dash/meson.build: - * ext/directfb/meson.build: - * ext/dtls/meson.build: - * ext/dts/meson.build: - * ext/faac/meson.build: - * ext/faad/meson.build: - * ext/fdkaac/meson.build: - * ext/flite/meson.build: - * ext/fluidsynth/meson.build: - * ext/gl/meson.build: - * ext/gsm/meson.build: - * ext/hls/meson.build: - * ext/iqa/meson.build: - * ext/kate/meson.build: - * ext/ladspa/meson.build: - * ext/libde265/meson.build: - * ext/libmms/meson.build: - * ext/lv2/meson.build: - * ext/mpeg2enc/meson.build: - * ext/mplex/meson.build: - * ext/opencv/meson.build: - * ext/openh264/meson.build: - * ext/openjpeg/meson.build: - * ext/opus/meson.build: - * ext/resindvd/meson.build: - * ext/rsvg/meson.build: - * ext/rtmp/meson.build: - * ext/sbc/meson.build: - * ext/smoothstreaming/meson.build: - * ext/soundtouch/meson.build: - * ext/spandsp/meson.build: - * ext/srt/meson.build: - * ext/srtp/meson.build: - * ext/ttml/meson.build: - * ext/voaacenc/meson.build: - * ext/vulkan/meson.build: - * ext/wayland/meson.build: - * ext/webp/meson.build: - * ext/webrtcdsp/meson.build: - * ext/x265/meson.build: - * ext/zbar/meson.build: - * gst/accurip/meson.build: - * gst/adpcmdec/meson.build: - * gst/adpcmenc/meson.build: - * gst/aiff/meson.build: - * gst/asfmux/meson.build: - * gst/audiobuffersplit/meson.build: - * gst/audiofxbad/meson.build: - * gst/audiolatency/meson.build: - * gst/audiomixmatrix/meson.build: - * gst/audiovisualizers/meson.build: - * gst/autoconvert/meson.build: - * gst/bayer/meson.build: - * gst/camerabin2/meson.build: - * gst/coloreffects/meson.build: - * gst/compositor/meson.build: - * gst/debugutils/meson.build: - * gst/dvbsuboverlay/meson.build: - * gst/dvdspu/meson.build: - * gst/faceoverlay/meson.build: - * gst/festival/meson.build: - * gst/fieldanalysis/meson.build: - * gst/freeverb/meson.build: - * gst/frei0r/meson.build: - * gst/gaudieffects/meson.build: - * gst/gdp/meson.build: - * gst/geometrictransform/meson.build: - * gst/id3tag/meson.build: - * gst/inter/meson.build: - * gst/interlace/meson.build: - * gst/ivfparse/meson.build: - * gst/ivtc/meson.build: - * gst/jp2kdecimator/meson.build: - * gst/jpegformat/meson.build: - * gst/librfb/meson.build: - * gst/midi/meson.build: - * gst/mpegdemux/meson.build: - * gst/mpegpsmux/meson.build: - * gst/mpegtsdemux/meson.build: - * gst/mpegtsmux/meson.build: - * gst/mxf/meson.build: - * gst/netsim/meson.build: - * gst/onvif/meson.build: - * gst/pcapparse/meson.build: - * gst/pnm/meson.build: - * gst/proxy/meson.build: - * gst/rawparse/meson.build: - * gst/removesilence/meson.build: - * gst/sdp/meson.build: - * gst/segmentclip/meson.build: - * gst/siren/meson.build: - * gst/smooth/meson.build: - * gst/speed/meson.build: - * gst/stereo/meson.build: - * gst/subenc/meson.build: - * gst/timecode/meson.build: - * gst/videofilters/meson.build: - * gst/videoframe_audiolevel/meson.build: - * gst/videoparsers/meson.build: - * gst/videosignal/meson.build: - * gst/vmnc/meson.build: - * gst/y4m/meson.build: - * gst/yadif/meson.build: - * meson.build: - * sys/bluez/meson.build: - * sys/d3dvideosink/meson.build: - * sys/decklink/meson.build: - * sys/directsound/meson.build: - * sys/dvb/meson.build: - * sys/fbdev/meson.build: - * sys/ipcpipeline/meson.build: - * sys/kms/meson.build: - * sys/msdk/meson.build: - * sys/shm/meson.build: - * sys/uvch264/meson.build: - * sys/wasapi/meson.build: - * sys/winks/meson.build: - * sys/winscreencap/meson.build: - Meson: Generate pc file for all plugins in bad - https://bugzilla.gnome.org/show_bug.cgi?id=794568 - -2018-04-25 11:00:00 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: use -Wl,-Bsymbolic-functions where supported - Just like the autotools build. - -2018-03-06 15:18:46 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst/videoparsers/gsth264parse.c: - h264parse: add constrained and progressive profiles - Those profiles have been added in the version 2012-01 - and 2011-06 of the AVC spec. - https://bugzilla.gnome.org/show_bug.cgi?id=794127 - -2018-02-27 10:51:07 +0800 Jun Xie <jun.xie@samsung.com> - - * ext/curl/gstcurlhttpsrc.c: - curlhttpsrc: deadlock in multi-instance scenario - Fixed queue iterator issue and set context state to - GSTCURL_MULTI_LOOP_STATE_RUNNING in case other - instance are in running state. - https://bugzilla.gnome.org/show_bug.cgi?id=793863 - -2018-04-25 02:43:26 +1000 Jan Schmidt <jan@centricular.com> - - * sys/nvenc/gstnvh264enc.c: - * sys/nvenc/gstnvh265enc.c: - nvenc: Remove GST_USE_UNSTABLE_API defines - GstGL is no longer unstable API since moving to -base - -2018-04-25 02:25:16 +1000 Jan Schmidt <jan@centricular.com> - - * configure.ac: - configure: Fix nvenc GL check - Make the nvenc OpenGL usage rely on the the same condition - that the automake USE_OPENGL conditional checks, as the - USE_OPENGL doesn't actually get set into the configure script, - so it can't check that - -2018-04-25 02:42:43 +1000 Jan Schmidt <jan@centricular.com> - - * sys/nvenc/gstnvh264enc.c: - * sys/nvenc/gstnvh265enc.c: - nvenc: Use the HAVE_NVENC_GST_GL define instead of HAVE_GST_GL - Fix compiling against the GL interop by gating includes - on the right header - -2018-04-06 23:22:26 +0900 Seungha Yang <pudding8757@gmail.com> - - * sys/nvenc/Makefile.am: - * sys/nvenc/gstnvenc.c: - * sys/nvenc/gstnvh265enc.c: - * sys/nvenc/gstnvh265enc.h: - nvh265enc: Add Nvidia GPU based HEVC encoder - https://bugzilla.gnome.org/show_bug.cgi?id=795037 - -2018-04-07 00:05:46 +0900 Seungha Yang <pudding8757@gmail.com> - - * sys/nvenc/gstnvbaseenc.c: - * sys/nvenc/gstnvh264enc.c: - nvencbase: Define sinkpad template in subclass - https://bugzilla.gnome.org/show_bug.cgi?id=795037 - -2018-04-06 23:49:12 +0900 Seungha Yang <pudding8757@gmail.com> - - * sys/nvenc/gstnvbaseenc.c: - * sys/nvenc/gstnvenc.c: - * sys/nvenc/gstnvenc.h: - * sys/nvenc/gstnvh264enc.c: - nvenc: Add debug catagory for nvh264enc - https://bugzilla.gnome.org/show_bug.cgi?id=795037 - -2014-05-29 16:54:59 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs.types: - * gst-libs/gst/mpegts/gst-atsc-section.h: - docs: mpegts: add atsc docs - https://bugzilla.gnome.org/show_bug.cgi?id=730940 - -2018-03-09 12:23:04 +0100 Edward Hervey <bilboed@bilboed.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklinkvideosrc: Add support for extracting Closed Caption - If the "output-cc" property is set to TRUE and there is CC present - in the VBI Ancillary Data, they will be extracted and set on the - outgoing buffer as GstVideoCaptionMeta. - Only CDP packets are supported. - https://bugzilla.gnome.org/show_bug.cgi?id=773863 - -2018-04-22 18:28:13 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: look for right version of plugins, not >= 0.11 - Well, just look for same version as we require for -base - which should be good enough. Also use plugins base req - for -base libs. - -2018-04-22 18:27:37 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/dash/gstmpdparser.c: - * ext/dts/gstdtsdec.c: - * ext/faad/gstfaad.c: - * gst/freeverb/gstfreeverb.c: - * sys/applemedia/vtdec.c: - * sys/winks/gstksvideodevice.c: - * sys/winscreencap/gstdx9screencapsrc.c: - Fix code indentation - -2018-04-22 18:25:34 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/winscreencap/gstdx9screencapsrc.c: - dx9screenscapsrc: consolidate UNLOCK - -2018-04-21 11:03:54 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/debugutils/gsttestsrcbin.c: - testsrcbin: typo fixes - -2018-04-21 11:00:58 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/debugutils/gsttestsrcbin.c: - testsrcbin: fix bug setting stream flags - We would mark all streams with FLAG_UNSELECT as we would check - the pointer for non-NULLness not the dereferenced stream number - (and the pointer is always non-NULL). The intention here was - presumably to mark the first stream of each type as SELECT and - the others as UNSELECT by default. - CID 1434970. - -2018-04-21 10:51:03 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/debugutils/gsttestsrcbin.c: - testsrcbin: fix memory leak - CID 1434971 - -2018-04-20 21:51:34 -0300 Thibault Saunier <tsaunier@igalia.com> - - * ext/iqa/iqa.c: - * ext/iqa/iqa.h: - dssim: Add a dssim-error-threshold property - If that threshold is reached, `iqa` will emit an ERROR message on the - bus, stopping any processing. - This way we can do a simpler comparison with gst-validate and the - process will error out if the specified threshold is reached. - https://bugzilla.gnome.org/show_bug.cgi?id=795428 - -2018-04-20 11:46:07 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/fbdev/meson.build: - meson: fbdev: fix 'invalid keyword argument' meson warnings - Required is not a valid kwarg for cc.has_header() - -2018-04-19 20:58:55 -0300 Thibault Saunier <tsaunier@igalia.com> - - * gst/debugutils/gsttestsrcbin.c: - testsrcbin: Do not use G_DECLARE_ as it requires GLib 2.44 - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=795382 - -2018-04-18 15:53:34 -0300 Thibault Saunier <tsaunier@igalia.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gsttestsrcbin.c: - * gst/debugutils/meson.build: - debugutils: Add a testsrcbin element - This is a simple Bin that will expose audiotestsrc or videotestsrc - based on what is asked by the user either through the GstURIHandler - API or through the "stream-types" property. - This element also provides GstStream and GstStreamCollection - so it is nicely usable from playbin3. - https://bugzilla.gnome.org/show_bug.cgi?id=795366 - -2018-04-18 03:43:57 -0700 Devarsh Thakkar <devarsht@xilinx.com> - - * sys/kms/gstkmssink.c: - kmssink: Add new entry for Xilinx DRM Driver - This adds entry for new DRM driver from xilinx - called "xlnx" which supports atomic modesetting. - We have kept entry for older DRM driver "xilinx_drm" - for backward compatility with a note describing - deprecation. - Signed-off-by: Devarsh Thakkar <devarsht@xilinx.com> - https://bugzilla.gnome.org/show_bug.cgi?id=795228 - -2018-04-18 15:03:19 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisrc.c: - wasapisrc: Don't provide a clock based on WASAPI's clock - The clock seems to have a lot of drift (or we're using it incorrectly) - which causes buffers to be late on the sink and get dropped. - Disable till someone can investigate whether our usage of the API is - incorrect (it looked correct to me) or if something is wrong. - -2018-03-22 10:18:57 +0200 Snir Sheriber <ssheribe@redhat.com> - - * configure.ac: - * sys/nvdec/Makefile.am: - * sys/nvdec/dynlink_cuda.c: - * sys/nvdec/dynlink_nvcuvid.c: - * sys/nvdec/gstnvdec.c: - * sys/nvdec/gstnvdec.h: - nvdec/nvenc: Support CUDA Toolkit 9 - Since cuda-tools 9.0, nvcuvid.h is replaced by dynlink_nvcuvid.h. - This patch changes nvdec to use run-time dynamic linking if - cuda-tools version >= 9. - nvenc does not require any change since its necessary headers are - still available. - https://bugzilla.gnome.org/show_bug.cgi?id=791724 - -2018-04-16 14:37:21 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkmjpegdec.c: - msdk: jpegdec: Fix non-interleaved sample decode - Using the default value (InterleavedDec == MFX_SCANTYPE_UNKNOWN) - causing issues with non-interleaved sample decode. Ideally the usage - of MFXVideoDECODE_DecodeHeader should fix these type of issue, but - it seems to be not. But hardcoding the InterleaveDec to - MFX_SCANTYPE_NONINTERLEAVED - is fixing the problem and fortunately msdk seems to be taking care of - Interleaved samples - too .So let's hardcode it for now. - https://bugzilla.gnome.org/show_bug.cgi?id=793787 - -2018-04-16 14:00:39 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: Fix APP1 marker segment parsing - Reposition the bytereader for proper skipping of - APP1 marker segment if it is not Exif. - https://bugzilla.gnome.org/show_bug.cgi?id=795117 - -2018-04-16 19:35:07 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapiutil.c: - wasapi: Call CoIn/Uninitialize() around prepare() - Seems to be required for exclusive mode and also for all - initialization on Windows 7 - https://bugzilla.gnome.org/show_bug.cgi?id=795274 - -2018-04-16 10:53:07 +0100 Tim-Philipp Müller <tim@centricular.com> - - * README: - * common: - Automatic update of common submodule - From f0c2dc9 to ed78bee - -2018-04-16 10:44:10 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/webrtc/rtcsessiondescription.h: - webrtc: fix gtk-doc annotations - -2018-04-15 10:06:46 +0200 Antonio Ospite <ao2@ao2.it> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: bail out in case of fragmented packets - pcapparse cannot parse fragmented IP packets correctly, in particular it - will get confused when trying to parsing fragments as standalone frames - in two ways: - 1. the first fragment will have the packet length greater than the - frame size and will always be discarded; - 2. fragments with non-zero offsets will be interpreted as full packets - and the first part of their raw payload data will be parsed as the - transport protocol header, resulting in bogus values for addresses - and ports, thus evading the properties filtering on those values. - This can make it difficult for users to see why the data does not get - downstream. - So be more explicit and just bail out when fragmented packets are - encountered. - https://bugzilla.gnome.org/show_bug.cgi?id=795284 - -2018-04-14 20:14:35 +0200 Antonio Ospite <ao2@ao2.it> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: add some comments about the pcap format headers - Since the code is full of magic add at least some guidance for newbies. - https://bugzilla.gnome.org/show_bug.cgi?id=795284 - -2016-12-27 11:14:00 +0530 Garima Gaur <garima.g@samsung.com> - - * ext/resindvd/rsninputselector.c: - * sys/uvch264/gstuvch264_src.c: - * sys/winscreencap/gstdx9screencapsrc.c: - resindvd, uvch264src, dx9screencapsrc: fix clock ref leaks in error paths - https://bugzilla.gnome.org/show_bug.cgi?id=776376 - -2016-12-27 13:45:49 +0530 Garima Gaur <garima.g@samsung.com> - - * sys/bluez/gstavdtpsrc.c: - bluez: avdtpsrc: fix caps leak in error code paths - https://bugzilla.gnome.org/show_bug.cgi?id=776085 - -2018-04-06 23:22:39 +0900 Seungha Yang <pudding8757@gmail.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Make caps writable before modifying them - Fix following assertion failure - GStreamer-CRITICAL **: gst_structure_remove_field: assertion 'IS_MUTABLE (structure)' failed - https://bugzilla.gnome.org/show_bug.cgi?id=795032 - -2018-04-10 10:20:52 +0100 Philippe Normand <philn@igalia.com> - - * gst/debugutils/gstfakevideosink.c: - fakevideosink: explicit type cast for max-lateness property setter - g_object_set() expects the parameters values to be the exact type of the - property being set. - -2018-04-10 05:13:17 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - wasapi: Handle return value of WaitForSingleObject - The wait could've failed for whatever reason, we should handle that. - -2018-04-10 05:09:42 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - wasapi: Call _Start if the client was _Reset - Otherwise we will wait forever in WaitForSingleObject because we forgot - to start the client again after _Stop is called in reset(). - https://bugzilla.gnome.org/show_bug.cgi?id=795114 - -2018-04-09 17:54:05 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/debugutils/gstfakevideosink.c: - fakevideosink: request an extra buffer if enable-last-sample is enabled - If the 'enable-last-sample' property is enabled, fakevideosink will keep - a reference on last rendered buffer which may lead to buffer starvation - in the pipeline. - Request one extra buffer in this case so we always have a buffer flying - in the pipeline. - https://bugzilla.gnome.org/show_bug.cgi?id=795109 - -2018-04-09 17:16:38 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - wasapi: Don't open the device in get_caps() - We can just return the template caps till the device is opened when - going from READY -> PAUSED. This fixes a CRITICAL when calling - ELEMENT_ERROR before the ringbuffer is allocated. - Also fixes a couple of leaks in error conditions. - https://bugzilla.gnome.org/show_bug.cgi?id=794611 - -2018-04-06 23:01:36 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - wasapi: Only use audioclient3 when low-latency - Causes glitches on very slow CPU machines or VMs, and our - out-of-the-box experience should be good. - https://bugzilla.gnome.org/show_bug.cgi?id=794497 - -2018-03-21 14:53:27 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapiutil.c: - wasapi: Don't derive device period from latency time - This seems to cause glitches on devices with low CPU availability, - such as virtual machines. Maybe even actual machines under high load. - https://bugzilla.gnome.org/show_bug.cgi?id=794497 - -2018-04-04 17:30:21 -0800 U. Artie Eoff <ullysses.a.eoff@intel.com> - - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - msdk: fix plugin load on implementations with only HW support - We can't assume that MSDK always supports SW implementation - on all platforms. Thus, msdk_is_available should check for - ANY implementation. - https://bugzilla.gnome.org/show_bug.cgi?id=794991 - -2018-04-04 18:32:19 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapiutil.h: - wasapi: Squelch warning about %x and HRESULT - HRESULT is always a 32-bit value, as is guint. - -2018-04-04 01:07:14 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapisrc: Implement loopback recording - Now, when you set loopback=true on wasapisrc, the `device` property - should refer to a sink (render) device for loopback recording. - If the `device` property is not set, the default sink device is used. - -2018-04-03 23:54:41 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/audiolatency/gstaudiolatency.c: - audiolatency: Fix wave detection in buffers - -1/1000 is 0, so we were *always* detecting a buffer. - -2018-04-03 23:53:24 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/audiolatency/gstaudiolatency.c: - audiolatency: Avoid bogus pts values while starting - -2018-04-03 19:21:46 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/msdk/meson.build: - msdk: fix meson syntax - -2018-03-22 16:04:02 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - * sys/msdk/gstmsdkvpputil.c: - * sys/msdk/msdk-enums.c: - * sys/msdk/msdk-enums.h: - msdk: vpp : Add frame rate control - https://bugzilla.gnome.org/show_bug.cgi?id=793705 - -2018-03-21 18:17:11 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - * sys/msdk/gstmsdkvpputil.c: - msdk: vpp : Add force-aspect-ratio property - https://bugzilla.gnome.org/show_bug.cgi?id=793705 - -2018-03-21 17:57:27 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - * sys/msdk/msdk-enums.c: - * sys/msdk/msdk-enums.h: - msdk: Add more scaling filter algorithms - https://bugzilla.gnome.org/show_bug.cgi?id=793705 - -2018-03-21 17:22:18 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - * sys/msdk/msdk-enums.c: - * sys/msdk/msdk-enums.h: - msdk: vpp: Add support for horizontal and vertical mirroring - https://bugzilla.gnome.org/show_bug.cgi?id=793705 - -2018-03-21 17:14:04 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - msdk: vpp: Add detail/edge enhancement tuning - https://bugzilla.gnome.org/show_bug.cgi?id=793705 - -2018-03-21 14:45:35 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - msdk: vpp: Add ProAmp(colorbalance) support - Added Hue, Saturation, Brightness and Contrast tuning support. - Fixme: Add GstColorBalanceInterface support - https://bugzilla.gnome.org/show_bug.cgi?id=793705 - -2018-03-06 13:52:04 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - * sys/msdk/gstmsdkvpputil.c: - * sys/msdk/gstmsdkvpputil.h: - * sys/msdk/msdk-enums.c: - * sys/msdk/msdk-enums.h: - * sys/msdk/msdk.c: - msdk: vpp: Add deinterlacing support - https://bugzilla.gnome.org/show_bug.cgi?id=793705 - -2018-03-06 13:51:32 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - * sys/msdk/msdk-enums.c: - * sys/msdk/msdk-enums.h: - msdk: vpp:Add more filters - -- Add Denoise - -- Add Rotation - https://bugzilla.gnome.org/show_bug.cgi?id=793705 - -2018-03-06 13:51:05 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkvpp.c: - * sys/msdk/gstmsdkvpp.h: - * sys/msdk/gstmsdkvpputil.c: - * sys/msdk/gstmsdkvpputil.h: - * sys/msdk/meson.build: - msdk: Add VPP element - https://bugzilla.gnome.org/show_bug.cgi?id=793705 - -2018-04-03 14:03:17 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/mpegts/meson.build: - meson: mpegts: make internal mpegts lib dep depend on the enumtypes header - -2018-03-29 19:18:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlssink2.c: - hlssink2: Use the new reset-muxer property on splitmuxsink - We don't want to reset the muxer, otherwise the continuity counter will - reset after each segment and some software gets confused. We want to - create a continuous stream. - https://bugzilla.gnome.org/show_bug.cgi?id=794816 - -2018-03-29 19:03:45 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Resend initial segments and header sections after FLUSH_STOP - https://bugzilla.gnome.org/show_bug.cgi?id=794816 - -2018-04-02 15:49:59 -0800 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkdec.c: - msdk: dec: rename the function to what it means more exactly. - https://bugzilla.gnome.org/show_bug.cgi?id=793707 - -2018-04-02 15:49:32 -0800 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkallocator_libva.c: - msdk: allocator: libva: check if it's already using dmabuf when mapping - As long as we negotiate the "DMABuf" capsfeatures for now, map can't be - working. So we need to confirm not to do it if using DMABuf memory. - https://bugzilla.gnome.org/show_bug.cgi?id=793707 - -2018-04-02 21:43:53 +0900 Daeseok Youn <daeseok.youn@gmail.com> - - * sys/nvenc/gstnvbaseenc.c: - nvbaseenc: fix build warnings with HAVE_NVENC_GST_GL - fix following error: - gstnvbaseenc.c: In function ‘gst_nv_base_enc_set_context’: - gstnvbaseenc.c:451:17: error: unused variable ‘nvenc’ -Werror=unused-variable - GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (element); - ^ - https://bugzilla.gnome.org/show_bug.cgi?id=794896 - -2018-03-31 10:41:32 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/decklink/win/DeckLinkAPI.h: - * sys/decklink/win/DeckLinkAPI_i.c: - decklink: Fix MinGW warnings due to MSVC-specific pragmas - https://bugzilla.gnome.org/show_bug.cgi?id=794652#c7 - -2018-03-30 11:06:40 -0800 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - msdkdec: use dmabuf if possible - https://bugzilla.gnome.org/show_bug.cgi?id=793707 - -2018-03-30 11:06:05 -0800 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdkbufferpool.c: - * sys/msdk/gstmsdkbufferpool.h: - * sys/msdk/gstmsdkvideomemory.c: - * sys/msdk/gstmsdkvideomemory.h: - * sys/msdk/meson.build: - * sys/msdk/msdk.c: - msdk: dmabuf support - This patch includes: - 1\ Implements MsdkDmaBufAllocator and allocation of msdk dmabuf memroy. - 2\ Each msdk dmabuf memory include its own msdk surface kept by GQuark. - 3\ Adds new option GST_BUFFER_POOL_OPTION_MSDK_USE_DMABUF - https://bugzilla.gnome.org/show_bug.cgi?id=793707 - -2018-03-30 11:05:16 -0800 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdkallocator_libva.h: - msdk: adds new function to get dmabuf information from surface. - https://bugzilla.gnome.org/show_bug.cgi?id=793707 - -2018-03-30 11:03:17 -0800 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkallocator.h: - * sys/msdk/gstmsdkallocator_libva.c: - msdk: allocator: get dmabuf handle during allocation if required - https://bugzilla.gnome.org/show_bug.cgi?id=793707 - -2018-03-30 11:03:00 -0800 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkbufferpool.c: - * sys/msdk/gstmsdkvideomemory.c: - * sys/msdk/gstmsdkvideomemory.h: - msdk: generalize the parameter of msdk video memory functions - There needs to be generalized for the parameter from - GstVideoMsdkVideoMemory to GstMemory. - Thus we can call these functions if using DMABuf memory. - https://bugzilla.gnome.org/show_bug.cgi?id=793707 - -2018-03-30 11:02:26 -0800 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdkcontext.c: - msdk: specify the way to find a proper cached response by request - The current way to find proper response by just comparing request's - value is wrong. We need to compare the size of a frame and the - number of suggested frames. - Refer to the sample in https://github.com/Intel-Media-SDK/samples. - https://bugzilla.gnome.org/show_bug.cgi?id=793707 - -2018-03-30 13:47:00 +0200 Paul Kocialkowski <paul.kocialkowski@bootlin.com> - - * sys/kms/gstkmssink.c: - kmssink: Add support for the Allwinner DRM driver (sun4i-drm) - This adds the sun4i DRM driver to the list of DRM drivers in kmssink. - The driver allows displaying video in either the main plane or an - overlay plane. - https://bugzilla.gnome.org/attachment.cgi?bugid=794839 - -2018-03-29 13:06:41 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkh264dec.c: - * sys/msdk/gstmsdkmjpegdec.c: - * sys/msdk/gstmsdkmpeg2dec.c: - msdk: dec: remove framerate field from sink caps template - Removes unessential field framerate for decoder so that negotiation - works even if framerate is not provided from upstream. - https://bugzilla.gnome.org/show_bug.cgi?id=789752 - -2018-03-29 12:41:48 -0800 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkdec.c: - msdk: dec: set framerate to the driver only if provided - For example, if framerate 0/1 is provided from upstream, the driver - fails to configure and complain about it. - We can let it go and make the driver assuming framerate itself. - https://bugzilla.gnome.org/show_bug.cgi?id=789752 - -2018-03-29 12:40:34 -0800 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkh265dec.c: - msdk: h265dec: remove framerate field from sink caps template - Removes unessential field framerate for decoder so that negotiation - works even if framerate is not provided from upstream. - https://bugzilla.gnome.org/show_bug.cgi?id=789752 - -2018-03-29 11:56:19 -0800 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkmpeg2enc.c: - * sys/msdk/gstmsdkvp8enc.c: - msdk: Don't set extended coding options for JPEG encode - MJPEG doesn't have support for extended coding options - https://bugzilla.gnome.org/show_bug.cgi?id=793873 - -2018-03-27 17:36:27 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - docs: plugins: remove stale xml data for moved or renamed plugins - rawparse plugin moved to -base, only legacyrawparse remains. - siren plugin was renamed and was listed twice. - https://bugzilla.gnome.org/show_bug.cgi?id=794069 - -2018-03-27 16:51:30 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/onvif/gstrtponviftimestamp.c: - rtponviftimestamp: fix state change function init/reset - When starting up we need to initialise things *before* - streaming starts, so before we chain up to the parent - class in the state change function. And when we shut - down the element, we need to reset things after streaming - has stopped, so after we chain up to the parent class - in the state change function. - Possibly related to memory leak in: - https://bugzilla.gnome.org/show_bug.cgi?id=794353 - -2018-03-27 14:25:24 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/ladspa/meson.build: - meson: Add missing optional lrdf dep to ladspa build - https://bugzilla.gnome.org/show_bug.cgi?id=794350 - -2018-03-27 12:47:13 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Use g_thread_new instead of g_thread_create - It's deprecated, and causes a build failure in Cerbero because we pass - -DG_DISABLE_DEPRECATED. - -2018-03-27 12:24:30 +0900 Takeshi Sato <t-sato@bx.jp.nec.co.jp> - - * sys/decklink/gstdecklink.cpp: - decklink: fix initialization fails in windows binary - There is no log of gst_decklink_com_thread () which initializes COM. - The initialization part is not valid with #ifdef MSC_VER. - Windows binaries are built with gcc. - As with other codes, it was avoidable by setting it to G_OS_WIN32 - instead of MSC_VER. - https://bugzilla.gnome.org/show_bug.cgi?id=794652 - -2018-03-25 18:08:58 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapiutil.h: - wasapi: Print the hresult hex value on error - This helps figure out precisely what error enum value was returned, - which can be necessary when the description is too generic - -2018-03-23 09:15:38 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/ladspa/gstladspa.c: - ladspa: Fix critical during plugin load on Windows - https://bugzilla.gnome.org/show_bug.cgi?id=794611 - -2018-03-26 19:52:50 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/x265/gstx265enc.c: - x265enc: no //-style comments - -2018-03-23 14:14:12 +0000 James Stevenson <james@stev.org> - - * ext/x265/gstx265enc.c: - * ext/x265/gstx265enc.h: - x265enc: Add "key-int-max" property - https://bugzilla.gnome.org/show_bug.cgi?id=794623 - -2018-03-25 12:53:06 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/Makefile.am: - gl: Rename gstglutils.h functions to prevent symbol conflicts with static linking - The gl plugin in -base has the same function. - -2018-03-25 12:52:32 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/Makefile.am: - opus: Rename opusheader functions to prevent symbol conflicts with static linking - The opus plugin in -base has the same functions. - -2018-03-23 13:42:05 +0000 James Stevenson <james@stev.org> - - * ext/x265/gstx265enc.c: - x265: Fix tagging of keyframes on output buffers - https://bugzilla.gnome.org/show_bug.cgi?id=794620 - -2018-03-22 14:07:53 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * gst-libs/gst/webrtc/meson.build: - * gst-libs/gst/webrtc/webrtc_mkenum.py: - * meson.build: - meson: webrtc: use gnome.mkenums_simple() to generate enumtypes files - -2018-03-22 13:43:52 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/webrtc/Makefile.am: - * gst-libs/gst/webrtc/webrtc_mkenum.py: - webrtc: use right export define in generated enumtypes file - -2018-03-22 13:42:31 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/webrtc/Makefile.am: - webrtc: fix g-ir-scanner complaining about unstable API - -2017-07-20 17:47:55 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * Makefile.am: - * ext/srtp/meson.build: - * ext/srtp/srtp_mkenum.py: - * gst-libs/gst/interfaces/build_mkenum.py: - * gst-libs/gst/interfaces/meson.build: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/mpegts/mpegts_enum.py: - * meson.build: - meson: use gnome.mkenums_simple() to generate enumtypes files - Means we no longer need our custom scripts, nor template files. - -2018-03-22 10:35:25 +0000 Tim-Philipp Müller <tim@centricular.com> - - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-gl-uninstalled.pc.in: - * pkgconfig/gstreamer-gl.pc.in: - pkgconfig: remove some cruft - gl has moved to -base, remove leftover files. - -2018-03-05 17:43:26 +0100 Patrik Nilsson <asavartzeth@gmail.com> - - * ext/ladspa/meson.build: - meson: fix ladspa dependencies - There are two issues, both related to dependency checking with the meson - support for the ladspa plugin. - With autotools, lrdf is handled like an optional dependency. But with - meson it is required. This makes the meson support less flexible and - inconsistent with autotools. - When autotools is used it properly checks if ladspa.h is available. - But with meson it does not, instead it treats lrdf as the main - dependency. This could cause a build failure if lrdf is installed, but - the ladspa sdk is not. - https://bugzilla.gnome.org/show_bug.cgi?id=794350 - -2018-03-05 18:23:09 +0100 Patrik Nilsson <asavartzeth@gmail.com> - - * ext/bs2b/meson.build: - * ext/meson.build: - meson: enable bs2b compilation - Add meson build system support to bs2b plugin. - https://bugzilla.gnome.org/show_bug.cgi?id=794346 - -2018-03-21 13:42:30 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - mpegtsmux: Explicitly resend PAT/SI/PMT on force-keyunit events - And don't randomly change the PCR stream, which would cause a new PMT - version to be generated instead and could confuse players. - -2018-03-21 13:34:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Deterministically set the PCR stream to the first stream of the program - Otherwise it would be randomly set to the first stream of the program - that receives a buffer. - -2018-03-21 11:05:23 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Reset a few more fields in mpegtsmux_reset() to their original values - -2018-03-21 10:59:29 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - tsmux: Don't use GST_DEBUG_OBJECT() with non-GObject types - -2018-03-20 11:49:19 -0700 Brendan Shanks <brendan.shanks@teradek.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: reset internal 'state' variable properly - Reset the internal 'state' variable when the parser is started, fixes - errors when parser is being re-used. - https://bugzilla.gnome.org/show_bug.cgi?id=794537 - -2018-03-20 16:16:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/shm/gstshmsink.c: - shmsink: Fix compilation with latest GLib - g_object_ref() forwards its arguments type. - gstshmsink.c: In function ‘gst_shm_sink_allocator_alloc_locked’: - /usr/include/glib-2.0/gobject/gobject.h:512:32: error: passing argument 3 of ‘gst_memory_init’ from incompatible pointer type -Werror=incompatible-pointer-types - #define g_object_ref(Obj) ((__typeof__(Obj)) (g_object_ref) (Obj)) - ^ - gstshmsink.c:292:45: note: in expansion of macro ‘g_object_ref’ - gst_memory_init (memory, params->flags, g_object_ref (self), NULL, - ^~~~~~~~~~~~ - -2018-03-20 09:39:17 +0000 Tim-Philipp Müller <tim@centricular.com> - - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiobuffersplit.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiolatency.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ipcpipeline.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-openglmixers.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-proxy.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-wasapi.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * meson.build: - Back to development - -=== release 1.14.0 === - -2018-03-19 20:24:05 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * gst-plugins-bad.doap: - * meson.build: - Release 1.14.0 - -2018-03-19 20:24:05 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiobuffersplit.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiolatency.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ipcpipeline.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-openglmixers.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-proxy.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-wasapi.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - Update docs - -2018-03-18 14:11:53 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: try to satisfy both mingw and msvc - Fix-up for previous commit, hopefully. - -2018-03-18 09:50:51 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Add Amlogic upstreamer DRM driver support - Amlogic Upstream driver is named meson, not to be confuse with the build - system. - -2018-03-17 23:52:31 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/wasapi/gstwasapiutil.c: - wasapi: fix indentation - -2018-03-17 23:48:13 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: fix unresolved symbol linker error with vs2017 on win10 - ERROR: unresolved external symbol PKEY_AudioEngine_DeviceFormat - Apparently the order of the header includes matters, and initguid.h - must be included first. Let's hope this doesn't break anything on - the other toolchains. - https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/ceff4e2d-8f63-4ab6-b09b-fdac65d62a80/pkeyaudioenginedeviceformat-link-error?forum=windowspro-audiodevelopment - -2018-03-16 19:21:31 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/Makefile.am: - webrtc: Fix make distcheck for g-i build - ERROR: ../../../../../gst-libs/gst/webrtc/webrtc-enumtypes.c: no such a file or directory - -2018-03-16 17:00:56 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/Makefile.am: - webrtc: Include webrtc-enumtypes in the g-i build - -2018-03-16 11:07:01 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtcbin: Remove parameter from gst_webrtc_rtp_sender_new() - -2018-03-15 17:32:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/rtpsender.c: - * gst-libs/gst/webrtc/rtpsender.h: - webrtc: Remove unused parameter from rtpsender constructor - https://bugzilla.gnome.org/show_bug.cgi?id=794363 - -2018-03-15 17:31:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/dtlstransport.c: - * gst-libs/gst/webrtc/icetransport.c: - * gst-libs/gst/webrtc/rtpreceiver.c: - * gst-libs/gst/webrtc/rtpreceiver.h: - * gst-libs/gst/webrtc/rtpsender.c: - * gst-libs/gst/webrtc/rtpsender.h: - * gst-libs/gst/webrtc/rtptransceiver.h: - webrtc: Add some locks to setters and remove non-existing functions from headers - https://bugzilla.gnome.org/show_bug.cgi?id=794363 - -2018-03-15 16:58:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/icetransport.h: - * gst-libs/gst/webrtc/webrtc_fwd.h: - webrtc: Rename GstWebRTCIceRole to GstWebRTCICERole for consistency - Everything else is ICE, not Ice. - https://bugzilla.gnome.org/show_bug.cgi?id=794362 - -2018-03-15 16:45:46 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/meson.build: - webrtc: Fix gobject-introspection build with meson - -2018-03-15 12:04:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/webrtc/Makefile.am: - * gst-libs/gst/webrtc/meson.build: - webrtc: Add gobject-introspection integration - https://bugzilla.gnome.org/show_bug.cgi?id=794347 - -2018-03-14 11:42:42 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/srt/Makefile.am: - srt: Add missing gstsrt.h to noinst_HEADERS - Reorder the list to match the SOURCES. - https://bugzilla.gnome.org/show_bug.cgi?id=794320 - -2018-03-13 14:21:40 -0800 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/msdk_libva.c: - msdk: libva: remove unnecessary code and comments - https://bugzilla.gnome.org/show_bug.cgi?id=794276 - -2018-03-13 14:20:50 -0800 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdk.c: - * sys/msdk/msdk.c: - msdk: adds new debug category - https://bugzilla.gnome.org/show_bug.cgi?id=794276 - -2018-03-13 14:18:23 -0800 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/gstmsdkvideomemory.c: - msdk: fix typo - https://bugzilla.gnome.org/show_bug.cgi?id=794276 - -2018-03-13 13:54:17 -0800 Wang,Fei <fei.w.wang@intel.com> - - * sys/msdk/gstmsdkvideomemory.c: - msdk: Fix the I420 video format support - Make sure I420 surface mapping works as expected by using - YV12 format and swap U/V plane's offset and pitches. - https://bugzilla.gnome.org/show_bug.cgi?id=793865 - -=== release 1.13.91 === - -2018-03-13 19:22:10 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * gst-plugins-bad.doap: - * meson.build: - Release 1.13.91 - -2018-03-13 19:22:10 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiobuffersplit.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiolatency.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ipcpipeline.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-openglmixers.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-proxy.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-wasapi.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - Update docs - -2018-03-13 13:14:58 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/libs/Makefile.am: - docs: update api decorators to ignore - -2018-03-13 13:11:17 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/webrtc/dtlstransport.h: - * gst-libs/gst/webrtc/icetransport.h: - * gst-libs/gst/webrtc/rtcsessiondescription.h: - * gst-libs/gst/webrtc/rtpreceiver.h: - * gst-libs/gst/webrtc/rtpsender.h: - * gst-libs/gst/webrtc/rtptransceiver.h: - * gst-libs/gst/webrtc/webrtc_fwd.h: - webrtc: GST_EXPORT -> GST_WEBRTC_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-13 13:09:28 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/wayland/wayland.h: - wayland: GST_EXPORT -> GST_WAYLAND_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-13 13:07:52 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstvideoaggregator.h: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - * gst-libs/gst/video/meson.build: - * gst-libs/gst/video/video-bad-prelude.h: - video: GST_EXPORT -> GST_URI_VIDEO_BAD_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-13 13:05:45 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/uridownloader/Makefile.am: - * gst-libs/gst/uridownloader/gstfragment.h: - * gst-libs/gst/uridownloader/gsturidownloader.h: - * gst-libs/gst/uridownloader/meson.build: - * gst-libs/gst/uridownloader/uridownloader-prelude.h: - uridownloader: GST_EXPORT -> GST_URI_DOWNLOADER_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-13 13:02:54 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/player/Makefile.am: - * gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.h: - * gst-libs/gst/player/gstplayer-media-info.h: - * gst-libs/gst/player/gstplayer-signal-dispatcher.h: - * gst-libs/gst/player/gstplayer-types.h: - * gst-libs/gst/player/gstplayer-video-overlay-video-renderer.h: - * gst-libs/gst/player/gstplayer-video-renderer.h: - * gst-libs/gst/player/gstplayer-visualization.h: - * gst-libs/gst/player/gstplayer.h: - * gst-libs/gst/player/meson.build: - * gst-libs/gst/player/player-prelude.h: - * gst-libs/gst/player/player.h: - player: GST_EXPORT -> GST_PLAYER_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-13 12:57:56 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/opencv/Makefile.am: - * gst-libs/gst/opencv/gstopencvutils.h: - * gst-libs/gst/opencv/gstopencvvideofilter.h: - * gst-libs/gst/opencv/meson.build: - * gst-libs/gst/opencv/opencv-prelude.h: - opencv: GST_EXPORT -> GST_OPENCV_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-13 12:47:03 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/mpegts/Makefile.am: - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gst-dvb-section.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/mpegts/mpegts-prelude.h: - * gst-libs/gst/mpegts/mpegts.h: - * gst-libs/gst/mpegts/mpegts_enum.py: - mpegts: GST_EXPORT -> GST_MPEGTS_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-13 12:43:00 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/isoff/gstisoff.h: - isoff: GST_EXPORT -> GST_ISOFF_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-13 12:41:42 +0000 Tim-Philipp Müller <tim@centricular.com> - - * common: - * gst-libs/gst/interfaces/Makefile.am: - * gst-libs/gst/interfaces/build_mkenum.py: - * gst-libs/gst/interfaces/meson.build: - * gst-libs/gst/interfaces/photography-prelude.h: - * gst-libs/gst/interfaces/photography.h: - photography: GST_EXPORT -> GST_PHOTOGRAPHY_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-13 12:36:26 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/insertbin/gstinsertbin.h: - insertbin: GST_EXPORT -> GST_INSERT_BIN_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-13 12:34:24 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/codecparsers-prelude.h: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst-libs/gst/codecparsers/gstjpeg2000sampling.h: - * gst-libs/gst/codecparsers/gstjpegparser.h: - * gst-libs/gst/codecparsers/gstmpeg4parser.h: - * gst-libs/gst/codecparsers/gstmpegvideometa.h: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - * gst-libs/gst/codecparsers/gstvc1parser.h: - * gst-libs/gst/codecparsers/gstvp8parser.h: - * gst-libs/gst/codecparsers/gstvp8rangedecoder.h: - * gst-libs/gst/codecparsers/gstvp9parser.h: - * gst-libs/gst/codecparsers/meson.build: - codecparsers: GST_EXPORT -> GST_CODEC_PARSERS_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-13 12:29:08 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/basecamerabinsrc/Makefile.am: - * gst-libs/gst/basecamerabinsrc/basecamerabinsrc-prelude.h: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabin-enum.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.h: - * gst-libs/gst/basecamerabinsrc/meson.build: - basecamerabinsrc: GST_EXPORT -> GST_BASE_CAMERA_BIN_SRC_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-13 12:21:39 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/audio/Makefile.am: - * gst-libs/gst/audio/audio-bad-prelude.h: - * gst-libs/gst/audio/gstnonstreamaudiodecoder.h: - * gst-libs/gst/audio/meson.build: - audio: GST_EXPORT -> GST_AUDIO_BAD_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-13 12:17:50 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/adaptivedemux/Makefile.am: - * gst-libs/gst/adaptivedemux/adaptive-demux-prelude.h: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: GST_EXPORT -> GST_ADAPTIVE_DEMUX_API - We need different export decorators for the different libs. - For now no actual change though, just rename before the release, - and add prelude headers to define the new decorator to GST_EXPORT. - -2018-03-12 20:10:02 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - docs: plugins: add some more elements and plugins - -2018-03-10 18:51:14 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapiutil.c: - wasapi: Minor fixes for debug logging - -2018-03-10 18:49:59 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/directsound/meson.build: - meson: Add deviceprovider changes to directsoundsrc - These were missed when they were added to Makefile.am - -2018-03-09 22:05:49 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstaudioclient3.h: - wasapi: Guard IAudioClient2 structs and enums - These are already defined in the audioclient.h provided by the latest - MinGW headers, and the existing #ifndef were obviously wrong. - https://bugzilla.gnome.org/show_bug.cgi?id=794197 - -2018-03-10 11:41:54 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-wasapi.xml: - docs: add wasapi elements - -2018-03-09 23:59:16 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/msdk/meson.build: - * tests/check/meson.build: - meson: fix build when msdk is not found - -2018-03-09 10:48:11 -0900 Wang,Fei <fei.w.wang@intel.com> - - * tests/check/Makefile.am: - * tests/check/elements/msdkh264enc.c: - * tests/check/meson.build: - tests: add msdkh264enc element unit test - https://bugzilla.gnome.org/show_bug.cgi?id=793236 - -2018-03-09 10:32:40 -0900 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/meson.build: - msdk: Fix the misspelled file name in meson build - -2018-03-09 11:11:40 +0100 Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk> - - * sys/wasapi/Makefile.am: - wasapi: ship audioclient3 header in tarballs - https://bugzilla.gnome.org/show_bug.cgi?id=794197 - -2018-03-08 11:39:25 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - msdk: enc: fix missing some frames to be encoded - There was not handling the end of encoding sequence in encoder. - This patch does drain any remaining internal streams while decoder - already does this. - Document says: - "To mark the end of the encoding sequence, call this function with a - NULL surface - pointer. Repeat the call to drain any remaining internally cached - bitstreams—one - frame at a time—until MFX_ERR_MORE_DATA is returned." - https://bugzilla.gnome.org/show_bug.cgi?id=793236 - -2018-03-08 11:38:52 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkdec.c: - msdk: dec: fix leaks when flushing - https://bugzilla.gnome.org/show_bug.cgi?id=793708 - -2018-03-08 11:38:30 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkcontext.c: - msdk: manage child sessions on parent GstMsdkContext - Sometimes parent context is released before its children get released. - In this case MFXClose of parent session fails. - To make sure that child sessions are closed before closing a parent - session, - Parent context needs to manage child sessions and close them first when - it's released. - https://bugzilla.gnome.org/show_bug.cgi?id=793412 - -2018-03-08 11:37:52 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - msdk: dec: remove code to manage buffers with locked surface - https://bugzilla.gnome.org/show_bug.cgi?id=793413 - -2018-03-08 11:37:12 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkbufferpool.c: - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/gstmsdkcontext.h: - * sys/msdk/gstmsdkvideomemory.c: - * sys/msdk/gstmsdkvideomemory.h: - msdk: manage MSDK surfaces seperately - Currently a gst buffer has one mfxFrameSurface when it's allocated and - can't be changed. - This is based on that the life of gst buffer and mfxFrameSurface would - be same. - But it's not true. Sometimes even if a gst buffer of a frame is finished - on downstream, - mfxFramesurface coupled with the gst buffer is still locked, which means - it's still being used in the driver. - So this patch does this. - Every time a gst buffer is acquired from the pool, it confirms if the - surface coupled with the buffer is unlocked. - If not, replace it with new unlocked one. - In this way, user(decoder or encoder) doesn't need to manage gst buffers - including locked surface. - To do that, this patch includes the following: - 1. GstMsdkContext - - Manages MSDK surfaces available, used, locked respectively as the - following: - 1\ surfaces_avail : surfaces which are free and unused anywhere - 2\ surfaces_used : surfaces coupled with a gst buffer and being used - now. - 3\ surfaces_locked : surfaces still locked even after the gst buffer - is released. - - Provide an api to get MSDK surface available. - - Provide an api to release MSDK surface. - 2. GstMsdkVideoMemory - - Gets a surface available when it's allocated. - - Provide an api to get an available surface with new unlocked one. - - Provide an api to release surface in the msdk video memory. - 3. GstMsdkBufferPool - - In acquire_buffer, every time a gst buffer is acquired, get new - available surface from the list. - - In release_buffer, it confirms if the buffer's surface is unlocked or - not. - - If unlocked, it is put to the available list. - - If still locked, it is put to the locked list. - This also fixes bug #793525. - https://bugzilla.gnome.org/show_bug.cgi?id=793413 - https://bugzilla.gnome.org/show_bug.cgi?id=793525 - -2018-03-08 10:12:16 +0100 Michael Tretter <m.tretter@pengutronix.de> - - * configure.ac: - configure.ac: enable largefile support if possible - https://bugzilla.gnome.org/show_bug.cgi?id=793103 - -2018-03-05 19:37:06 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/libs/player.c: - tests: player: disable broken test_play_media_info test - Until someone can be bothered to debug + fix it. - https://bugzilla.gnome.org/show_bug.cgi?id=787372 - https://bugzilla.gnome.org/show_bug.cgi?id=787374 - -2018-03-05 14:21:14 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * tests/check/libs/h265parser.c: - h265parser: allow partial matching on range extension profile - Best to return a valid profiles rather than no profile if bitstream uses - a not standard profile. - https://bugzilla.gnome.org/show_bug.cgi?id=793876 - -2018-02-26 17:26:07 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst/videoparsers/gsth265parse.c: - * tests/check/libs/h265parser.c: - h265parse: add support for 'Format range extensions profiles' - Those profiles have been introduced in version 2 of the HEVC spec - (A.3.5). - https://bugzilla.gnome.org/show_bug.cgi?id=793876 - -2018-02-27 11:30:15 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - h265parser: parse extra profile fields - Those fields have been introduced in version 2 and later to define new - profiles like the format range extensions profiles (A.3.5). - NOTE: This patch breaks the parser ABI, rebuild needed. - https://bugzilla.gnome.org/show_bug.cgi?id=793876 - -2018-03-01 11:08:44 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst/videoparsers/gsth265parse.c: - * tests/check/Makefile.am: - * tests/check/libs/h265parser.c: - * tests/check/meson.build: - h265parser: decouple GstH265Profile and GstH265ProfileIDC - We used to have the same enum to represent H265 profiles and idc values. - Those are no longer the same with extension profiles defined from - version 2 of the spec. - Split those enums so the semantic of each is clearer and we'll be able - to add extension profiles to GstH265Profile. - Also add gst_h265_profile_tier_level_get_profile() to retrieve the - GstH265Profile from the GstH265ProfileTierLevel. It will be used to - implement the detection of extension profiles. - https://bugzilla.gnome.org/show_bug.cgi?id=793876 - -=== release 1.13.90 === - -2018-03-03 22:39:27 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * gst-plugins-bad.doap: - * meson.build: - Release 1.13.90 - -2018-03-03 22:39:27 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiobuffersplit.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiolatency.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ipcpipeline.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-openglmixers.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-proxy.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - Update docs - -2018-03-02 21:53:47 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/iqa/iqa.c: - iqa: Fix build with latest aggregator API changes - -2018-03-02 10:37:53 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth265parse.c: - Revert "h265parse: early set src caps when input not byte-stream" - This reverts commit 93d29e80300f566b7a8e7d86beecb578fe03821c. - -2018-03-02 10:37:45 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/videoparsers/gsth264parse.c: - Revert "h264parse: early set src caps when input is avc" - This reverts commit 5ac886d85aab4b919f84fb80e2d1ef36dc8e647d. - -2018-03-01 18:44:13 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/dts/meson.build: - * meson.build: - meson: enable more warnings - -2018-03-01 15:24:39 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-schro.xml: - * ext/Makefile.am: - * ext/meson.build: - * ext/schroedinger/Makefile.am: - * ext/schroedinger/gstschro.c: - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroutils.c: - * ext/schroedinger/gstschroutils.h: - * ext/schroedinger/meson.build: - * meson.build: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/schroenc.c: - * tests/check/meson.build: - Remove schroedinger plugin - No upstream (website disappeared), no maintainer, and - pretty much a fringe format anyway. - https://bugzilla.gnome.org/show_bug.cgi?id=776215 - -2018-03-01 00:34:40 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstglstereomix.c: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst/compositor/compositor.c: - Port to latest GstAggregator segment API - The aggregator segment is now exposed on the src pad - https://bugzilla.gnome.org/show_bug.cgi?id=793946 - -2018-03-01 15:29:27 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/directsound/gstdirectsoundplugin.c: - * sys/wasapi/gstwasapi.c: - wasapi: Increase rank to prefer over directsoundsrc - Directsoundsrc/sink have multiple issues, most of which cannot be - fixed at all because the API is deprecated and is implemented as a - compatibility wrapper around WASAPI since Vista. - Users and developers should now use the wasapisrc/sink elements, and - future development efforts should go towards that. - -2018-02-28 23:46:32 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: instantiate adapter at the correct place - -2018-02-28 00:06:41 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiolatency.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-openglmixers.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-zbar.xml: - docs: add new audiolatency element to docs and update docs for git - -2018-02-28 00:56:38 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/audiolatency/gstaudiolatency.c: - audiolatency: Fix string format specifier and use microseconds everywhere - Should fix warnings or build errors on 32-bit platforms and on Windows. - Also clarify in logging that all timestamps are in microseconds. - -2018-02-28 00:40:21 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/audiolatency/gstaudiolatency.c: - audiolatency: Fix cerbero build failure - Average latency is a 64-bit integer. - https://ci.gstreamer.net/job/GStreamer-master/9962/ - -2018-02-27 15:47:40 +0100 Alicia Boya García <aboya@igalia.com> - - * ext/x265/gstx265enc.c: - x265enc: Add format example for option-string - https://bugzilla.gnome.org/show_bug.cgi?id=793881 - -2018-02-26 18:38:58 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * configure.ac: - * gst/audiolatency/Makefile.am: - * gst/audiolatency/gstaudiolatency.c: - * gst/audiolatency/gstaudiolatency.h: - * gst/audiolatency/meson.build: - * gst/meson.build: - audiolatency: New plugin for measuring audio latency - Measures the audio latency between the source pad and the sink pad by - outputting period ticks on the source pad and measuring how long they - take to arrive on the sink pad. - Very useful for quantifying latency improvements in audio pipelines. - This plugin was particularly useful during development of the - low-latency features of the wasapi plugin. - https://bugzilla.gnome.org/show_bug.cgi?id=793839 - -2018-02-27 10:07:18 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - * ext/ttml/subtitle.c: - * ext/ttml/subtitle.h: - * ext/ttml/ttmlparse.c: - ttml: Add support for IMSC 1.0.1 fillLineGap attribute - Strictly speaking, the TTML spec requires that text backgrounds extend - only to the font height of the related text, rather than to the vertical - distance between lines. The result of this is that there will typically - be vertical gaps between line backgrounds through which moving video can - be seen. Since this was unnacceptable to some content providers, v1.0.1 - of the IMSC spec (which profiles TTML) adds a new attribute, - itts:fillLineGap1, that allows content authors to specify that clients - should extend text backgrounds such that there are no gaps between - lines. This attribute is also going to be included in the next release - of EBU-TT-D. - This patch adds support for fillLineGap to ttmlparse and ttmlrender. - 1 https://www.w3.org/TR/ttml-imsc1.0.1/#itts-fillLineGap - https://bugzilla.gnome.org/show_bug.cgi?id=787071 - -2018-02-26 11:20:51 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - docs: plugins: add some more elements - Many will still be missing corresponding doc - sections in the source code though. - -2018-02-26 16:08:28 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - wasapi: Clarify usage of low-latency property, add myself as author - The low-latency property is *always* safe to enable, so applications - that do realtime communication should set it, and the elements will - automatically configure WASAPI to use the lowest possible device - period, and the audioringbuffer in audiobasesink will also be - configured accordingly. - Applications can also use exclusive mode during capture and playback - for the lowest possible latency if they know that the device will not - be used by any other application. - In this mode, the latency-time and buffer-time properties will be - completely ignored. - -2018-02-26 15:55:19 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - wasapi: Add a property for trying the AudioClient3 API - The AudioClient3 API is only available on Windows 10, and we will - automatically detect when it is available and use it. - However, using it for capturing audio with low latency and without - glitches seems to require setting the realtime priority of the entire - pipeline to "critical", which we cannot do from inside the element. - Hence, we can only enable that by default for wasapisink since - apps should be able to safely set the low-latency property to TRUE if - they need low-latency capture or playback. - -2018-02-14 20:12:07 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: Set realtime thread priority at runtime - Use LoadLibrary() to set the thread characteristics at runtime so it - works automagically regardless of where or how the plugin was built. - -2018-02-14 12:13:36 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstaudioclient3.h: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: Use IAudioClient3 interface when available - This allows us to request ultra-low-latency device periods even in - shared mode. However, this requires good drivers and Windows 10, so - we only enable this when we detect that we are running on Windows 10 - at runtime. - You can forcibly disable this feature on Windows 10 by setting - GST_WASAPI_DISABLE_AUDIOCLIENT3=1 in the environment. - -2018-02-14 11:56:45 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapiutil.c: - wasapi: __uuidof is simply not available in C - Fix comment, and don't try to use it at all. - -2018-02-14 11:47:14 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapi.c: - * sys/wasapi/gstwasapiutil.c: - wasapi: Set a default category for util functions - Without this, they all go to the default category where they can be - missed - -2018-02-14 09:27:31 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: Use a macro for HRESULT failure paths - Saves a lot of boilerplate across all files. - -2018-02-23 14:08:32 -0900 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/debugutils/gstchecksumsink.c: - checksumsink: remove src pad template from sink element - https://bugzilla.gnome.org/show_bug.cgi?id=793774 - -2018-02-23 14:30:56 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/msdk.c: - msdk: remove unused code - There's unused code remaining since MSDK bufferpool patches landed. - https://bugzilla.gnome.org/show_bug.cgi?id=793741 - -2018-02-16 09:17:40 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/srt/gstsrtbasesink.c: - * ext/srt/gstsrtbasesink.h: - * ext/srt/gstsrtclientsink.c: - * ext/srt/gstsrtserversink.c: - srt: Add support for streamheaders to sinks - https://bugzilla.gnome.org/show_bug.cgi?id=793503 - -2018-02-16 09:16:12 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/srt/gstsrtclientsink.c: - * ext/srt/gstsrtserversink.c: - srt: Refactor gst_srt_*_sink_send_buffer, extract send - https://bugzilla.gnome.org/show_bug.cgi?id=793503 - -2018-02-16 09:12:51 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/srt/gstsrtbasesink.c: - * ext/srt/gstsrtclientsink.c: - * ext/srt/gstsrtserversink.c: - srt: Add gst_srt_base_sink_stop - https://bugzilla.gnome.org/show_bug.cgi?id=793503 - -2018-02-15 12:07:32 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/srt/gstsrtbasesink.c: - * ext/srt/gstsrtbasesink.h: - srt: Remove unused queued_buffers field - https://bugzilla.gnome.org/show_bug.cgi?id=793503 - -2018-02-22 12:32:45 -0900 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdkenc: remove unnecessary memset - https://bugzilla.gnome.org/show_bug.cgi?id=791479 - -2018-02-22 12:32:20 -0900 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - msdk: enc: Support force-key-unit events - https://bugzilla.gnome.org/show_bug.cgi?id=791479 - -2018-02-07 16:29:59 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: Expose framerate even if fixed_frame_rate flag isn't set - There is nothing in the spec that state that framerate is not valid in - that case. This aligns GStreamer with FFMPEG behaviour for similar - streams. - https://bugzilla.gnome.org/show_bug.cgi?id=793284 - -2018-02-21 19:45:33 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: simplify GST_DISABLE_GST_DEBUG check and don't use add_global_* - add_global_arguments() can't be used in subprojects. It's - entirely possible that -bad is a subproject but gstreamer - is picked up from an installed location, so we should - really use add_project_arguments() in both cases. - -2018-02-21 11:41:40 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/debugutils/gstfakevideosink.c: - doc: Add section for fakevideosink - https://bugzilla.gnome.org/show_bug.cgi?id=793624 - -2018-02-19 22:02:14 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstfakevideosink.c: - * gst/debugutils/gstfakevideosink.h: - * gst/debugutils/meson.build: - Add fakevideosink element - This is a wrapper around fakesink that will advertise GstVideoMeta - and other meta API in order to achieve zero-copy whenever possible. - his new element is useful when doing performance testing with - video stream and don't want the sink capability to change the - upstream behaviour. - https://bugzilla.gnome.org/show_bug.cgi?id=793624 - -2018-02-19 21:52:43 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/debugutils/meson.build: - meson: Remove unused header list - https://bugzilla.gnome.org/show_bug.cgi?id=793624 - -2018-02-19 14:52:30 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/srt/meson.build: - Fix SRT Library package config name - -2018-02-19 15:45:36 +0900 Justin Kim <justin.kim@collabora.com> - - * meson.build: - meson: Use .dylib suffix if darwin - For Mac OS, GST_EXTRA_MODULE_SUFFIX should be set as '.dylib'. - https://bugzilla.gnome.org/show_bug.cgi?id=793585 - -2018-02-20 17:22:35 -0900 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdk: enc: Fix typo - -2018-02-15 19:00:04 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - msdk: h264_enc: Enable B-pyramid prediction support - Since there is already an "adaptive-B" option, just - use boolean property for B-pyramid enabling. - Fixme: Not sure whether this can be supported in vp8 and vp9. - It could be possible through GPB (b without backward ref) but - can't verify currently. We can move this as common property - once verified with vp8 and vp9 without breaking any backward - compatibility. - https://bugzilla.gnome.org/show_bug.cgi?id=791637 - -2018-02-15 17:29:13 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/msdk-enums.c: - * sys/msdk/msdk-enums.h: - msdk: Add more tuning options - Added tuning options for mb level bitrate control, - adaptive I-frame insertion, and adaptive B-frame insertion. - https://bugzilla.gnome.org/show_bug.cgi?id=791637 - -2018-02-15 16:31:56 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - msdk: h264_enc: Add slice size tuning option - According to spec, it is a general property. But based on - testing it only works for h264 encoder. - Let's keep it as h264 specific for now. - https://bugzilla.gnome.org/show_bug.cgi?id=791637 - -2018-02-15 15:59:08 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/meson.build: - * sys/msdk/msdk-enums.c: - * sys/msdk/msdk-enums.h: - msdk: move enum definitions to separte file - Move enum value defintions which are (or in future) supported - by more than one codec into a common file. - https://bugzilla.gnome.org/show_bug.cgi?id=791637 - -2018-02-15 15:05:10 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - msdk: encoder: h264: Enable trellis quantization tuning - Add a new property "trellis" to enable trellis quantization. - Keeping trellis as a flag value (which is boolean for gst x264 enc element) - since it is possible to enable/disable this seperately for - I,P and B frames through MediaSDK ext option headers. - The subclass implementations always need to inform base-encoder - if it requires the inclusion of Extend Header buffers (mfxExtCodingOption2 - and mfxExtCodingOption3). - https://bugzilla.gnome.org/show_bug.cgi?id=791637 - -2018-02-15 12:19:48 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - msdk: h264_enc: Add LookaheadDownsampling support - This option controls down sampling in look ahead bitrate - control mode. According to spec it is only supported in AVC. - Fixme: Probably HEVC also have support for this in recent - MSDK versions. We could move the enumeration types to common - header usable for multiple codecs. - https://bugzilla.gnome.org/show_bug.cgi?id=791637 - -2018-02-14 17:01:38 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - msdk: encode: Add more rate control options - MediaSDK has support for a number of rate control algorithms. - Adding all possible options to the property rate-control. - Fixme1: In case of failure, currently we don't have a proper method - to show which rate-control has been failed. It could be better - to add some extensive validation on EncQuery output in case of error. - Unfortunately, not all ratecontrol methods are supported by every codecs - and we don't have the dynamic detection of supported ratecontrol methods yet. - https://bugzilla.gnome.org/show_bug.cgi?id=791637 - -2018-02-14 16:27:47 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - msdk: encode: Add property to set slice/partitioning - Adding a new property num-slices to set the number of - slices/partitions per frame. Adding it as a general - property for all codecs (except jpeg). - https://bugzilla.gnome.org/show_bug.cgi?id=791637 - -2018-02-14 14:29:57 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - msdk: encoder: h265: generalize the behavior of "i-frames" property - We have the property "i-frames" to set the IDR interval in a - gop. Unfortunately MSDK HEVC encoder behaves bit differently - for IdrInterval field, IdrInteval == 1 indicate every - I-frame should be an IDR (which is IdrInterval == 0 for other codecs), - IdrInteval == 2 means every other I-frame is an IDR - (which is IdrInterval == 1 for other codecs) etc. - So we generalize the behaviour of property "i-frames" by - incrementing the value by one in each case (only for HEVC). - https://bugzilla.gnome.org/show_bug.cgi?id=791637 - -2018-02-14 11:42:55 +0000 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkmpeg2enc.c: - * sys/msdk/gstmsdkvp8enc.c: - msdk: encoder: register only the required properties - The base encoder common properties are not valid for - mjpeg encoder where there is no motion compensation or rate control. - Delaying the property installation on the base gobject - untill the subclass class_init get invoked. - https://bugzilla.gnome.org/show_bug.cgi?id=791637 - -2018-02-18 14:46:52 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/Makefile.am: - msdk: add missing files for dist target - https://bugzilla.gnome.org/show_bug.cgi?id=793563 - -2018-02-18 12:01:07 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/colormanagement/Makefile.am: - colormanagement: Link to libgstbase for basetransform - -2018-02-18 11:49:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/Makefile.am: - gl: GL_LIBS does not exist anymore but X11_LIBS does and is needed - In case of X11 we have to call XInitThreads(). - -2018-02-18 11:37:18 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - configure: Add configure check for gmodule-no-export-2.0 - This is needed for all code using the g_module_*() API. - -2018-02-16 17:36:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - webrtc: We need at least libnice 0.1.14 - meson.build already required that, let's do the same for configure.ac - -2018-02-15 19:44:23 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiobuffersplit.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ipcpipeline.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-openglmixers.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-proxy.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * meson.build: - Back to development - -=== release 1.13.1 === - -2018-02-15 17:13:06 +0000 Tim-Philipp Müller <tim@centricular.com> - - * NEWS: - * configure.ac: - * gst-plugins-bad.doap: - * meson.build: - Release 1.13.1 - -2018-02-15 18:50:51 +0000 Tim-Philipp Müller <tim@centricular.com> - - * .gitignore: - * Makefile.am: - * configure.ac: - * tests/examples/Makefile.am: - * tests/examples/compositor/Makefile.am: - * tests/examples/compositor/crossfade.c: - Dist compositor crossfade example and pythons script for meson build - And add to autotools build so it gets disted. - -2018-02-15 15:07:26 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: fix build with --disable-external - -2018-02-15 14:59:35 +0000 Tim-Philipp Müller <tim@centricular.com> - - * po/bg.po: - * po/cs.po: - * po/hr.po: - * po/it.po: - * po/ky.po: - * po/nl.po: - * po/sv.po: - * po/tr.po: - po: update translations - -2018-02-15 14:57:00 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiobuffersplit.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiomixmatrix.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colormanagement.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-de265.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fdkaac.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gme.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ipcpipeline.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyrawparse.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-neonhttpsrc.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-opengl.xml: - * docs/plugins/inspect/plugin-openglmixers.xml: - * docs/plugins/inspect/plugin-openh264.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-proxy.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-sbc.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-siren.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-timecode.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-vulkan.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - docs: update plugin docs - -2018-02-14 15:57:48 +0100 Edward Hervey <edward@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Fix array of devices usage - We need to allocate actual Device structures since we are going - to be setting callbacks with address to that structure - https://bugzilla.gnome.org/show_bug.cgi?id=777239 - -2018-02-14 14:36:00 +0100 Edward Hervey <edward@centricular.com> - - * gst/bayer/gstbayerorc-dist.c: - * gst/compositor/compositororc-dist.c: - * gst/fieldanalysis/gstfieldanalysisorc-dist.c: - * gst/gaudieffects/gstgaudieffectsorc-dist.c: - Update ORC fallback disted code - -2018-02-05 08:52:55 +0000 Sean DuBois <sean@siobud.com> - - * ext/aom/gstav1enc.c: - * ext/aom/gstav1enc.h: - aom: Implement cpu-used in av1enc - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2018-02-13 11:16:29 +0100 Dimitrios Katsaros <patcherwork@gmail.com> - - * gst/pnm/gstpnmenc.c: - pnm: Fixed segfault in pnmenc - The pnmenc was not mapping the input buffers as video buffers. Because - of this, the video frame stride was not being set based on frame but - based on the caps, which make the assumption that the strides are a - power of 4. For input that is not a power of 4, this would lead to a - SIGSEGV. - https://bugzilla.gnome.org/show_bug.cgi?id=793419 - -2018-02-13 17:39:26 -0900 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - build: check gudev dependency for msdk plugin - gudev is the dependecy for rendernode support in MediaSDK plugin. - https://bugzilla.gnome.org/show_bug.cgi?id=791599 - -2018-02-13 14:41:52 -0900 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkvc1dec.c: - msdk: vc1_dec: Add Advanced profile (WVC1) support - Only supporting asf header-format having BDUs with startcode. - It might be possible to support other formats too, but haven't tested. - https://bugzilla.gnome.org/show_bug.cgi?id=792589 - -2018-02-13 14:41:20 -0900 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - msdk: dec: Add non-packetized stream handling support - The gst-msdk decoders prefer packetized streams as input - and in this case we can avoid unnecessary input bitstream copy - to mfxBitstream. This works fine for codecs like h264 where - we only support byte-stream with au alignment. Other format - conversions should be done thorugh parsers. But this won't work - for codecs like vc1 where we don't have an autoplugged parser. - Even the parser is not capable to do format conversions. - Packetizing through base decoders parse() routine will bring a - lot of uncecessary of complexities and codecparser libraray dependency. - So we just use an interal gst_adaper to keep track of bitstream - which is not consumed by msdk durig AsynchronusDecoding. - This adapter will get used only if subclass implementations - set the "is_packetized" to FALSE for msdk base encoder. - https://bugzilla.gnome.org/show_bug.cgi?id=792589 - -2018-02-13 14:40:54 -0900 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkvc1dec.c: - * sys/msdk/gstmsdkvc1dec.h: - * sys/msdk/meson.build: - msdk: Add VC1 decoder (simple and main profiles) - Adding Simple and Main profiles decode support. - Currently msdkvc1dec is not capable to handle the codec_data, - only instream headers are supported. Also msdk vc1 decoder - expecting instream with Sequence header as per SMPTE 421M Annex L. - Most of the decdoebin/playbin pipeline won't work with the above - constraints - because vc1parse is still not an autoplug element. - Only way to make mskdvc1dec work is by connecting a vc1parse - as an upstream element. - https://bugzilla.gnome.org/show_bug.cgi?id=792589 - -2018-02-13 14:40:22 -0900 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/meson.build: - msdk : Add RenderNode support - Use drm render node as the first choice of device node file. - Fall backs to use drm primary (/dev/dri/card0-9) - if there is no render node available - Basic logic is inherited from gstreamer-vaapi, but using - gudev API rather than libudev directly. - Added gudev library as dependency for msdk. - https://bugzilla.gnome.org/show_bug.cgi?id=791599 - -2018-02-13 13:54:03 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkallocator.h: - * sys/msdk/gstmsdkallocator_d3d.c: - * sys/msdk/gstmsdkvideomemory.c: - * sys/msdk/meson.build: - msdk: Avoid build failures on Windows until d3d allocator is implemented - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 13:53:02 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: use video memory if there's another MSDK context in a pipeline - 1\ If downstream's pool is MSDK bufferpool, - 2\ If there's shared GstMsdkContext in the pipeline, - a decoder decides to use video memory. - This policy should be improved to handle more cases. - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 13:52:14 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/gstmsdkcontext.h: - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkenc.c: - msdk: add async depth from each msdk element to GstMsdkContext to be shared - In case that pipeline is like ".. ! decoder ! encoder ! ..." with using - video memory, - decoder needs to know the async depth of the following msdk element so - that it could - allocate the correct number of video memory. - Otherwise, decoder's memory is exhausted while processing. - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 13:51:18 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - msdkdec/enc: query GstContext to share GstMsdkContext - How to share/create GstMsdkcontext is the following: - - Search GstMsdkContext if there's in the pipeline. - - If found, check if it's decoder, encoder or vpp by job type. - - If it's same job type, it creates another instance of - GstMsdkContext - with joined-session. - - Otherwise just use the shared GstMsdkContext. - - If not found, just creates new instance of GstMsdkContext. - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 13:50:48 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/gstmsdkcontext.h: - * sys/msdk/gstmsdkcontextutil.c: - * sys/msdk/gstmsdkcontextutil.h: - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkenc.c: - msdk: context: add job type to figure out if joining session is necessary - According to the driver's instruction, if there are two or more encoders - or decoders in a process, the session should be joined by - MFXJoinSession. - To achieve this successfully by GstContext, this patch adds job type - specified if it's encoder, decoder or vpp. - If a msdk element gets to know if joining session is needed by the - shared context, - it should create another instance of GstContext with joined session, - which - is not shared. - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 13:50:08 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdkcontextutil.c: - * sys/msdk/gstmsdkcontextutil.h: - * sys/msdk/meson.build: - msdk: adds util functions to handle GstContext - To share GstMsdkContext with each msdk element, - it will be using GstContext. - Most common code is from gstreamer-vaapi. - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 13:49:28 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - msdkdec: use bufferpool - 1\ In decide_allocation, it makes its own msdk bufferpool. - - If downstream supports video meta, it just replace it with the msdk - bufferpool. - - If not, it uses the msdk bufferpool as a side pool, which will be - decoded into. - and will copy it to downstream's bufferpool. - 2\ Decide if using video memory or system memory. - - This is not completed in this patch. - - It might be decided in update_src_caps. - - But tested for both system memory and video memory cases. - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 13:48:32 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - msdkenc: use bufferpool - 1\ Proposes msdk bufferpool to upstream. - - If upstream has accepted the proposed msdk bufferpool, - encoder can get msdk surface from the buffer directly. - - If not, encoder get msdk surface its own msdk bufferpool - and copy from upstream's frame to the surface. - 2\ Replace arrays of surfaces with msdk bufferpool. - 3\ In case of using VPP, there should be another msdk bufferpool - with NV12 info so that it could convert first and encode. - Calls gst_msdk_set_frame_allocator and uses video memory only on linux. - and uses system memory on Windows until d3d allocator is implemented. - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 13:44:08 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdkbufferpool.c: - * sys/msdk/gstmsdkbufferpool.h: - * sys/msdk/gstmsdksystemmemory.c: - * sys/msdk/gstmsdksystemmemory.h: - * sys/msdk/gstmsdkvideomemory.c: - * sys/msdk/gstmsdkvideomemory.h: - * sys/msdk/meson.build: - msdk: supports bufferpool - Implements 2 memory allocators: - 1\ GstMsdkSystemAllocator: This will allocate system memory. - 2\ GstMsdkVideoAllocator: This will allocate device memory depending - on the platform. (eg. VASurface) - Currently GstMsdkBufferPool uses video allocator currently by default - only on linux. On Windows, we should use system memory until d3d - allocator - is implemented. - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 12:43:42 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdkallocator.h: - * sys/msdk/gstmsdkallocator_libva.c: - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/gstmsdkcontext.h: - * sys/msdk/meson.build: - msdk: adds frame allocator using libva - Implements msdk frame allocator which is required from the driver. - Also makes these functions global so that GstMsdkAllocator could use - the allocated video memory later and couple with GstMsdkMemory. - GstMsdkContext keeps allocation information such as mfxFrameAllocRequest - and mfxFrameAllocResponse after allocation. - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 12:43:00 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: fix typo - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 12:41:28 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdkcontext.c: - * sys/msdk/gstmsdkcontext.h: - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - * sys/msdk/gstmsdkh265dec.c: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkvp8dec.c: - * sys/msdk/gstmsdkvp8enc.c: - * sys/msdk/meson.build: - * sys/msdk/msdk.h: - * sys/msdk/msdk_d3d.c: - * sys/msdk/msdk_libva.c: - msdk: implements GstMsdkContext. - Makes GstMsdkContext to be a descendant of GstObject so that - we could track the life-cycle of the session of the driver. - Also replaces MsdkContext with this one. - Keeps msdk_d3d.c alive for the future. - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 12:39:44 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/msdk_libva.c: - * sys/msdk/msdk_libva.h: - msdk: libva: adds utility function between mfx and libva - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 12:37:47 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - msdk: adds new utility functions for conversion from gstreamer to libmfx - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 12:36:46 -0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkdec.c: - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - msdk: move and rename the function msdk_video_alignment - Move the msdk_video_alignment function from decoder - to msdk.c and rename so that others could call this function - without duplicated declaration. - https://bugzilla.gnome.org/show_bug.cgi?id=790752 - -2018-02-13 14:11:49 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/libs/gst-plugins-bad-libs.types: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * gst-libs/gst/audio/Makefile.am: - * gst-libs/gst/audio/gstaudioaggregator.c: - * gst-libs/gst/audio/gstaudioaggregator.h: - * gst-libs/gst/audio/meson.build: - audioaggregator: remove, moved to -base - https://bugzilla.gnome.org/show_bug.cgi?id=791218 - -2018-02-13 00:28:36 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-audiomixer.xml: - * gst/audiomixer/Makefile.am: - * gst/audiomixer/gstaudiointerleave.c: - * gst/audiomixer/gstaudiointerleave.h: - * gst/audiomixer/gstaudiomixer.c: - * gst/audiomixer/gstaudiomixer.h: - * gst/audiomixer/gstaudiomixerorc-dist.c: - * gst/audiomixer/gstaudiomixerorc-dist.h: - * gst/audiomixer/gstaudiomixerorc.orc: - * gst/audiomixer/meson.build: - * gst/meson.build: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/audiointerleave.c: - * tests/check/elements/audiomixer.c: - * tests/check/meson.build: - audiomixer: remove, moved to -base - https://bugzilla.gnome.org/show_bug.cgi?id=791218 - -2018-02-12 19:30:01 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/proxy/gstproxy-priv.h: - * gst/proxy/gstproxysink.c: - * gst/proxy/gstproxysink.h: - * gst/proxy/gstproxysrc.c: - * gst/proxy/gstproxysrc.h: - proxy: remove unneeded object private structs - Plugin headers are not installed. - Also mark internal funcs as internal. - -2018-02-12 18:48:32 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-qt.xml: - * ext/Makefile.am: - * ext/qt/.gitignore: - * ext/qt/Makefile.am: - * ext/qt/gstplugin.cc: - * ext/qt/gstqsgtexture.cc: - * ext/qt/gstqsgtexture.h: - * ext/qt/gstqtgl.h: - * ext/qt/gstqtglutility.cc: - * ext/qt/gstqtglutility.h: - * ext/qt/gstqtsink.cc: - * ext/qt/gstqtsink.h: - * ext/qt/gstqtsrc.cc: - * ext/qt/gstqtsrc.h: - * ext/qt/qtitem.cc: - * ext/qt/qtitem.h: - * ext/qt/qtplugin.pro: - * ext/qt/qtwindow.cc: - * ext/qt/qtwindow.h: - * tests/examples/meson.build: - * tests/examples/qt/qmlsink/.gitignore: - * tests/examples/qt/qmlsink/CMakeLists.txt: - * tests/examples/qt/qmlsink/main.cpp: - * tests/examples/qt/qmlsink/main.qml: - * tests/examples/qt/qmlsink/play.pro: - * tests/examples/qt/qmlsink/qml.qrc: - * tests/examples/qt/qmlsrc/.gitignore: - * tests/examples/qt/qmlsrc/grabqml.pro: - * tests/examples/qt/qmlsrc/main.cpp: - * tests/examples/qt/qmlsrc/main.qml: - * tests/examples/qt/qmlsrc/qml.qrc: - qt: remove plugin, moved to -good - https://bugzilla.gnome.org/show_bug.cgi?id=754094 - -2018-02-12 15:44:00 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: remove two more unneeded gtk conditionals - -2018-02-08 19:11:21 +0000 Tim-Philipp Müller <tim@centricular.com> - - * .gitignore: - * Makefile.am: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-gstgtk.xml: - * docs/plugins/inspect/plugin-gtk.xml: - * ext/Makefile.am: - * ext/gtk/Makefile.am: - * ext/gtk/gstgtkbasesink.c: - * ext/gtk/gstgtkbasesink.h: - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtkglsink.h: - * ext/gtk/gstgtksink.c: - * ext/gtk/gstgtksink.h: - * ext/gtk/gstgtkutils.c: - * ext/gtk/gstgtkutils.h: - * ext/gtk/gstplugin.c: - * ext/gtk/gtkgstbasewidget.c: - * ext/gtk/gtkgstbasewidget.h: - * ext/gtk/gtkgstglwidget.c: - * ext/gtk/gtkgstglwidget.h: - * ext/gtk/gtkgstwidget.c: - * ext/gtk/gtkgstwidget.h: - * ext/gtk/meson.build: - * ext/meson.build: - * tests/examples/Makefile.am: - * tests/examples/gtk/Makefile.am: - * tests/examples/gtk/glliveshader.c: - * tests/examples/gtk/gtkglsink.c: - * tests/examples/gtk/gtksink.c: - * tests/examples/meson.build: - gtk: remove, plugin has moved to -good - -2017-12-07 15:52:39 +0100 Carlos Rafael Giani <dv@pseudoterminal.org> - - * gst/inter/gstinteraudiosrc.c: - interaudio: Make sure both PTS and DTS values are defined - The inter plugin originated in 0.10, which had only one timestamp. As a - result, during the port to 1.0, the DTS were left undefined. This can cause - subtle bugs with basesrc, which can end up incorrectly picking DTS over PTS - and producing output buffers with incorrect timestamps. - https://bugzilla.gnome.org/show_bug.cgi?id=791347 - -2018-02-09 02:05:23 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - wasapisrc: Re-align device period if necessary - Same changes as done for wasapisink in cbe2fc40a. Turns out this is - sometimes also needed for capture. Reported by Mathieu_Du. - Also improve logging in that case for easier debugging. - -2018-02-08 19:09:45 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: make version numbers ints and fix int/string comparison - WARNING: Trying to compare values of different types (str, int). - The result of this is undefined and will become a hard error - in a future Meson release. - -2018-02-05 18:03:31 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/gdp/gstgdpdepay.c: - Revert "gdpdepay: don't use allocator if it has custom alloc" - This reverts commit f6cb16ab8cecfe683473b173732ad040e858abd5. - -2018-02-08 15:19:12 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/proxy/gstproxy.c: - proxy: Fix plugin definition - I'm not sure how this was missed in review... - -2018-02-08 14:45:28 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/proxy/Makefile.am: - proxy: Remove dead code from Makefile.am - There is no gstproxytest.c - -2018-02-08 14:41:05 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/meson.build: - meson: Fix wasapi build on Windows - Was missing device prober and avrt (on msvc) - -2018-02-08 14:27:43 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - wasapi: Unprepare when src/sink_prepare fails - unprepare() is not called automatically on failure. - https://bugzilla.gnome.org/show_bug.cgi?id=793289 - -2018-02-08 03:11:10 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - wasapisink: Re-align device period if necessary - Sometimes the minimum period advertised by a card results in an - unaligned buffer size error during initialization in exclusive mode. - In that case, we can fetch the actual buffer size in frames and - calculate the period from that. - We can't do this pre-emptively because we can't call GetBufferSize - till Initialize has been called at least once. - https://bugzilla.gnome.org/show_bug.cgi?id=793289 - -2018-02-08 03:09:26 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - wasapisink: pre-load the buffer with silence - This reduces the chances of startup glitches, and also reduces the - chances that we'll get garbled output due to driver bugs. - Recommended by the WASAPI documentation. - https://bugzilla.gnome.org/show_bug.cgi?id=793289 - -2018-02-07 04:48:58 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: Try to use latency-time and buffer-time - So far, we have been completely discarding the values of latency-time - and buffer-time and trying to always open the device in the lowest - latency mode possible. However, sometimes this is a bad idea: - 1. When we want to save power/CPU and don't want low latency - 2. When the lowest latency setting causes glitches - 3. Other audio-driver bugs - Now we will try to follow the user-set values of latency-time and - buffer-time in shared mode, and only latency-time in exclusive mode (we - have no control over the hardware buffer size, and there is no use in - setting GstAudioRingBuffer size to something larger). - The elements will still try to open the devices in the lowest latency - mode possible if you set the "low-latency" property to "true". - https://bugzilla.gnome.org/show_bug.cgi?id=793289 - -2018-02-06 23:56:41 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: Cover more HRESULT error messages - This requires using allocated strings, but it's the best option. For - instance, a call could fail because CoInitialize() wasn't called, or - because some other thing in the stack failed. - https://bugzilla.gnome.org/show_bug.cgi?id=793289 - -2018-02-06 23:45:02 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - wasapi: Increase thread priority to reduce glitches - This is particularly important when running in exclusive mode because - any delays will immediately cause glitching. - The MinGW version in Cerbero is too old, so we can only enable this when - building with MSVC or when people build GStreamer for MSYS2 or other - MinGW-based distributions. - To force-enable this code when building with MinGW, build with - CFLAGS="-DGST_FORCE_WIN_AVRT -lavrt". - https://bugzilla.gnome.org/show_bug.cgi?id=793289 - -2018-02-06 23:40:49 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: Allow opening devices in exclusive mode - This provides much lower latency compared to opening in shared mode, - but it also means that the device cannot be opened by any other - application. The advantage is that the achievable latency is much - lower. - In shared mode, WASAPI's engine period is 10ms, and so that is the - lowest latency achievable. - In exclusive mode, the limit is the device period itself, which in my - testing with USB DACs, on-board PCI sound-cards, and HDMI cards is - between 2ms and 3.33ms. - We set our audioringbuffer limits to match the device, so the - achievable sink latency is 6-9ms. Further improvements can be made if - needed. - https://bugzilla.gnome.org/show_bug.cgi?id=793289 - -2018-02-06 23:37:19 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - wasapi: Rename struct element for device name - We will use ->device for storing a pointer to the IMMDevice structure - which is needed for fetching the caps supported by devices in - exclusive mode. - https://bugzilla.gnome.org/show_bug.cgi?id=793289 - -2018-02-08 11:32:32 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapidevice.c: - * sys/wasapi/gstwasapidevice.h: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapiutil.c: - wasapi: Fix indentation issues missed by the commit hook - These were missed because the relevant commits were made on Windows - where `indent` wasn't installed. - -2018-02-08 16:55:43 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkupload.c: - vulkanupload: actually loop over possible uploaders - Fix some funky control that wasn't working - CID #1417219 - -2018-02-08 15:48:49 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: Fix ffeb09e4 conditional - Fixes ffeb09e4abe73d3b9e8909996816f0288e307e22 - if (sscanf(...)) { // != 0 - error; - } - Is not correct where != 0 indicates some kind of success. - Check instead that the correct number of elements were slurped. - -2018-02-08 15:47:33 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: change dead code to an assert - CID #1429140 - -2018-02-08 15:29:13 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/meson.build: - dtls: add meson definition for recently added test - -2018-02-08 15:25:22 +1100 Matthew Waters <matthew@centricular.com> - - * ext/webrtc/gstwebrtcbin.c: - webrtc: bail on invalid rtpbin names - If we fail parsing rtpbin pad names, someone has screwed up so critical - and return. - CID #1429142 - -2016-02-04 00:08:57 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * configure.ac: - * gst/meson.build: - * gst/proxy/Makefile.am: - * gst/proxy/gstproxy-priv.h: - * gst/proxy/gstproxy.c: - * gst/proxy/gstproxysink.c: - * gst/proxy/gstproxysink.h: - * gst/proxy/gstproxysrc.c: - * gst/proxy/gstproxysrc.h: - * gst/proxy/meson.build: - Add new 'proxy' element to stream data between pipelines - This keep-it-simple plugin is useful when you want to pipe arbitrary - data to a different pipeline within the same process. Some advantages - over appsink/appsrc, the inter elements, etc: - * Ease of use. Buffers, events, and caps are transmitted as-is without - copying or serialization. - * Enables zerocopy (especially DMABUF) transparently without any - special-casing. - * Enables usage with sinks or elements that are unreliable and may - throw errors and need re-initialization, such as a network sink, a - USB device sink (v4l2), etc. - * Transmits arbitrary data, not just audio/video/subs - * Can easily implement 1 producer pipeline -> N dynamic consumer - pipelines within a single process when combined with the `tee` - element. - All queries, events, buffers, and buffer lists are proxied. State - changes, clocks, and base times for the two pipelines are independent - since the upstream and downstreams continue to be different pipelines. - https://bugzilla.gnome.org/show_bug.cgi?id=788200 - -2018-02-07 20:15:00 +1100 Matthew Waters <matthew@centricular.com> - - * ext/qt/gstqtglutility.cc: - qt: don't #include platform specific gstglcontext_*.h headers - They aren't public headers - -2018-02-06 11:36:27 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * ext/opencv/meson.build: - opencv: fix OPENCV_PATH_NAME when using meson - Meson was checking for $prefix/OpenCV but was then defining - OPENCV_PATH_NAME with 'OpenCv' rather than 'OpenCV'. - https://bugzilla.gnome.org/show_bug.cgi?id=793212 - -2018-02-05 08:53:20 +0000 Sean DuBois <sean@siobud.com> - - * ext/aom/gstav1enc.c: - aom: Drop pointless cast from av1enc - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2018-02-02 06:56:17 +0000 Sean DuBois <sean@siobud.com> - - * ext/aom/gstav1enc.c: - * ext/aom/gstav1enc.h: - aom: Fix all definite leaks in av1enc - Track if the encoder has been inited, and cleanup if needed. Also unref - input_state if has been set - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2018-02-02 05:43:20 +0000 Sean DuBois <sean@siobud.com> - - * ext/aom/gstav1enc.c: - * ext/aom/gstav1enc.h: - aom: Consistent naming between av1dec and av1enc - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2018-01-31 07:34:32 +0000 Sean DuBois <sean@siobud.com> - - * ext/aom/gstav1dec.c: - aom: Implement flush for av1dec - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2018-02-04 12:18:06 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - autotools: use -fno-strict-aliasing where supported - https://bugzilla.gnome.org/show_bug.cgi?id=769183 - -2018-02-05 17:00:15 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/dtls.c: - tests: add a test for the dtls{enc,dec} elements - -2018-02-05 16:57:52 +1100 Matthew Waters <matthew@centricular.com> - - * ext/dtls/gstdtlsenc.c: - dtls: drop upstream segment and stream-start events - Fixes tests with GstHarness - We will push our own from the srcpad task. - -2018-02-05 17:41:25 +1100 Matthew Waters <matthew@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - dtls: don't leak the system clock - Obtain and release it as needed. - -2018-02-05 16:16:31 +1100 Matthew Waters <matthew@centricular.com> - - * ext/dtls/gstdtlsenc.c: - dtlsenc: fix typo in is-client property description - -2017-07-07 17:32:33 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: reject segment seeks - While #782140 can stay open for actually handling these, - the fact is currently adaptivedemux does not handle segment - seeks, and as such should not accept them. - https://bugzilla.gnome.org/show_bug.cgi?id=784655 - -2017-01-31 20:56:59 +1100 Matthew Waters <matthew@centricular.com> - - * .gitignore: - * configure.ac: - * docs/libs/Makefile.am: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * ext/Makefile.am: - * ext/meson.build: - * ext/webrtc/Makefile.am: - * ext/webrtc/fwd.h: - * ext/webrtc/gstwebrtc.c: - * ext/webrtc/gstwebrtcbin.c: - * ext/webrtc/gstwebrtcbin.h: - * ext/webrtc/gstwebrtcice.c: - * ext/webrtc/gstwebrtcice.h: - * ext/webrtc/gstwebrtcstats.c: - * ext/webrtc/gstwebrtcstats.h: - * ext/webrtc/icestream.c: - * ext/webrtc/icestream.h: - * ext/webrtc/meson.build: - * ext/webrtc/nicetransport.c: - * ext/webrtc/nicetransport.h: - * ext/webrtc/transportreceivebin.c: - * ext/webrtc/transportreceivebin.h: - * ext/webrtc/transportsendbin.c: - * ext/webrtc/transportsendbin.h: - * ext/webrtc/transportstream.c: - * ext/webrtc/transportstream.h: - * ext/webrtc/utils.c: - * ext/webrtc/utils.h: - * ext/webrtc/webrtcsdp.c: - * ext/webrtc/webrtcsdp.h: - * ext/webrtc/webrtctransceiver.c: - * ext/webrtc/webrtctransceiver.h: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/meson.build: - * gst-libs/gst/webrtc/Makefile.am: - * gst-libs/gst/webrtc/dtlstransport.c: - * gst-libs/gst/webrtc/dtlstransport.h: - * gst-libs/gst/webrtc/icetransport.c: - * gst-libs/gst/webrtc/icetransport.h: - * gst-libs/gst/webrtc/meson.build: - * gst-libs/gst/webrtc/rtcsessiondescription.c: - * gst-libs/gst/webrtc/rtcsessiondescription.h: - * gst-libs/gst/webrtc/rtpreceiver.c: - * gst-libs/gst/webrtc/rtpreceiver.h: - * gst-libs/gst/webrtc/rtpsender.c: - * gst-libs/gst/webrtc/rtpsender.h: - * gst-libs/gst/webrtc/rtptransceiver.c: - * gst-libs/gst/webrtc/rtptransceiver.h: - * gst-libs/gst/webrtc/webrtc.h: - * gst-libs/gst/webrtc/webrtc_fwd.h: - * gst-libs/gst/webrtc/webrtc_mkenum.py: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in: - * pkgconfig/gstreamer-webrtc-uninstalled.pc.in: - * pkgconfig/gstreamer-webrtc.pc.in: - * pkgconfig/meson.build: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/webrtcbin.c: - * tests/check/meson.build: - * tests/examples/Makefile.am: - * tests/examples/meson.build: - * tests/examples/webrtc/Makefile.am: - * tests/examples/webrtc/meson.build: - * tests/examples/webrtc/webrtc.c: - * tests/examples/webrtc/webrtcbidirectional.c: - * tests/examples/webrtc/webrtcswap.c: - webrtcbin: an element that handles the transport aspects of webrtc connections - SDP's are generated and consumed according to the W3C PeerConnection API - available from https://www.w3.org/TR/webrtc/ - The SDP is either created initially from the connected - sink pads/attached transceivers as in the case of generating an offer or - intersected with the connected sink pads/attached transceivers as in - the case for creating an answer. In both cases, the rtp payloaded streams - sent by the peer are exposed as separate src pads. - The implementation supports trickle ICE, RTCP muxing, reduced size RTCP. - With contributions from: - Nirbheek Chauhan <nirbheek@centricular.com> - Mathieu Duponchelle <mathieu@centricular.com> - Edward Hervey <edward@centricular.com> - https://bugzilla.gnome.org/show_bug.cgi?id=792523 - -2018-01-16 20:53:15 +1100 Matthew Waters <matthew@centricular.com> - - * ext/dtls/gstdtlsdec.c: - dtls: remove reliance on a default GMainContext/Loop - By removing the indirection to the main loop completely when receiving - the peer certificate. For reference, the on-decoder-key signal does not - have a redirection. - -2018-01-31 13:21:58 -0500 Omar Akkila <omar.akkila@collabora.co.uk> - - * gst/netsim/gstnetsim.c: - netsim: fix format errors for different platforms - https://bugzilla.gnome.org/show_bug.cgi?id=793073 - -2018-01-31 16:10:24 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: fix opengl api conditional - Fixes build of openglmixers plugin due to mismatch between - build system conditional USE_OPENGL and define in gstglconfig.h - -2018-01-31 13:03:28 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/gl/Makefile.am: - configure: fix OpenGL API detection - And don't build gl mosaic element unconditionally. - -2018-01-31 13:02:07 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - autotools: fix build if OpenGL support is not available - https://bugzilla.gnome.org/show_bug.cgi?id=793039 - -2018-01-29 12:53:51 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/gdp/gstgdpdepay.c: - gdpdepay: don't use allocator if it has custom alloc - gdpdepay element uses the decide_allocation to fetch the downstream - allocator. Nonetheless it is possible that allocate uses a custom - alloc function, which is not usable by gdpdepay, crashing later the - application when the allocater buffer is NULL. - This patch checks for the allocator flags and reset it if the - allocator has a custom alloc function. - https://bugzilla.gnome.org/show_bug.cgi?id=789476 - -2018-01-29 12:50:36 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/gdp/gstgdpdepay.c: - gdpdepay: don't allocation query if caps aren't fixed - When querying downstream for allocation, and the source caps hasn't - set its caps, using ANY by default, it raises a critical message in - console: - CRITICAL **: gst_video_info_from_caps: assertion 'gst_caps_is_fixed (caps)' failed - This patch bails out decide_allocation() if the caps aren't fixed. - https://bugzilla.gnome.org/show_bug.cgi?id=789476 - -2018-01-31 03:51:47 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - wasapi: Correctly set ringbuffer segsize/segtotal - This will set the actual-latency-time and actual-buffer-time of the sink - and source. - We completely ignore the latency-time/buffer-time values set - on the element because WASAPI is happiest when it is reading/writing at - the default period. Improving this will likely require the use of the - IAudioClient3 interfaces which are not available in MinGW yet. - https://bugzilla.gnome.org/show_bug.cgi?id=792897 - -2018-01-25 00:51:22 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/Makefile.am: - * sys/wasapi/gstwasapi.c: - * sys/wasapi/gstwasapidevice.c: - * sys/wasapi/gstwasapidevice.h: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: Implement a device provider for probing - Currently only does probing and does not handle messages from - endpoints/devices. In the future we want to do proper monitoring which - is well-supported in WASAPI. - https://bugzilla.gnome.org/show_bug.cgi?id=792897 - -2018-01-24 08:20:38 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: Implement support for >2 channels - We need to parse the WAVEFORMATEXTENSIBLE structure, figure out what - positions the channels have (if they are positional), and reorder them - as necessary. - https://bugzilla.gnome.org/show_bug.cgi?id=792897 - -2018-01-30 20:35:07 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: use -fno-strict-aliasing where supported - https://bugzilla.gnome.org/show_bug.cgi?id=769183 - -2018-01-30 11:34:58 -0900 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstvp8parser.c: - codecparser: vp8: Fix range decoder init - According to the vp8 spec, the first partition (size can be derived from - the frame header) should have all compressed header information and we - implemented gst codecparser based on that. But it doesn't seem to be the - case with some of the streams (#792773) and libvpx - works fine because it uses the whole frame size (not the first partition - size) to initialize the bool decoder. - https://bugzilla.gnome.org/show_bug.cgi?id=792773 - -2018-01-22 16:21:27 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Make render rectangle property controllable - https://bugzilla.gnome.org/show_bug.cgi?id=792798 - -2016-10-03 13:11:07 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/gl/gstglvideomixer.c: - glvideomixer: fix vertex_buffer leak - We call the base class first as this will remove the pad from - the aggregator, thus stopping misc callbacks from being called, - one of which (process_textures) will recreate the vertex_buffer - if it is destroyed - https://bugzilla.gnome.org/show_bug.cgi?id=760873 - -2018-01-26 16:25:33 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * configure.ac: - * ext/srtp/Makefile.am: - * ext/srtp/gstsrtp.c: - * ext/srtp/gstsrtp.h: - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpdec.h: - * ext/srtp/gstsrtpenc.c: - * ext/srtp/gstsrtpenc.h: - * ext/srtp/gstsrtpenums.h: - * ext/srtp/meson.build: - * ext/srtp/srtp_mkenum.py: - srtp: Support libsrtp2 - For libsrtp 1, add defines that translate the new namespaced identifiers - to the old unnamespaced ones. Also move the code for setting and getting - a stream's ROC into two compat functions that match libsrtp2's API. - It seems that libsrtp2 properly supports changing the ROC without having - to touch the sequence numbers afterwards, given that srtp_set_stream_roc - sets a pending_roc field, so the entire roc_changed dance should not be - needed anymore. The compat functions for libsrtp 1 just contain our - preexisting hacks, however, so it's still needed there. - libsrtp2 has no means of discovering the streams in the session, so to - create the stats structure we need to iterate over our own set of SSRCs. - For this we also need to re-add the previously removed ssrcs_set to the - encoder. - https://bugzilla.gnome.org/show_bug.cgi?id=776901 - -2018-01-28 14:28:33 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/rtmp/gstrtmpsink.c: - rtmpsink: don't crash if there's streamheader field in the caps - Fix regression when used in combination with new flvmux which was - ported to GstAggregator, and which sends plain video/x-flv caps - before sending full caps that include streamheaders. - -2017-12-13 13:43:30 +0900 Justin Kim <justin.kim@collabora.com> - - * sys/androidmedia/gst-android-hardware-camera.c: - ahc: enable autofocus callback - It should be enabled to set autofocus properly, but - it seems to be commented out mistakenly from the first commit. - https://bugzilla.gnome.org/show_bug.cgi?id=790945 - -2018-01-26 06:01:35 +0000 Sean DuBois <sean@siobud.com> - - * ext/aom/gstav1dec.c: - * ext/aom/gstav1dec.h: - * ext/aom/gstav1enc.c: - * ext/aom/gstav1enc.h: - aom: Add direct casts for GstAV1Enc and GstAV1Dec - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2018-01-26 05:20:55 +0000 Sean DuBois <sean@siobud.com> - - * ext/aom/gstav1dec.c: - * ext/aom/gstav1enc.c: - aom: Deadline was removed from AV1 - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2017-12-31 07:47:47 +0000 Sean DuBois <sean@siobud.com> - - * ext/aom/gstav1dec.c: - aom: Fix leak in av1dec - AOM Decoder wasn't being destroyed in stop - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2018-01-14 22:22:07 +0000 Sean DuBois <sean@siobud.com> - - * ext/aom/gstav1enc.c: - aom: Put av1enc config debugging under gst_av1_enc_debug namespace - https://bugzilla.gnome.org/show_bug.cgi?id=791674 - -2018-01-25 21:23:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/directsound/gstdirectsoundsrc.h: - directsoundsrc: Add missing \ in multi-line #define - -2018-01-22 14:06:31 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/directsound/Makefile.am: - * sys/directsound/gstdirectsounddevice.c: - * sys/directsound/gstdirectsounddevice.h: - * sys/directsound/gstdirectsoundplugin.c: - * sys/directsound/gstdirectsoundsrc.c: - * sys/directsound/gstdirectsoundsrc.h: - directsoundsrc: Add support for a DeviceProvider - https://bugzilla.gnome.org/show_bug.cgi?id=792782 - -2018-01-24 08:20:13 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapiutil.c: - wasapi: Fix some leaks, bugs, and compiler warnings - Also improve logging. - -2017-11-06 12:39:32 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - h26{4,5}parse: expose chroma format and bit depth in caps - This information could be used for example to pick a decoder supporting - a specific chroma and/or bit depth, like 4:2:2 10 bits. - It can also be used to inform earlier decoder about the format it is - about to decode. - https://bugzilla.gnome.org/show_bug.cgi?id=792039 - -2017-04-16 16:08:27 +0200 Tim-Philipp Müller <tim@centricular.com> - - * sys/nvenc/gstnvbaseenc.c: - * sys/nvenc/gstnvbaseenc.h: - * sys/nvenc/gstnvh264enc.c: - nvenc: add "gop-size" property - This also changes the default gop size from 30 to 75 frames. - https://bugzilla.gnome.org/show_bug.cgi?id=781410 - -2018-01-24 10:21:48 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: mark properties that can be changed at runtime accordingly - https://bugzilla.gnome.org/show_bug.cgi?id=781410 - -2017-04-17 13:58:53 +0200 Ole André Vadla Ravnås <oleavr@gmail.com> - - * sys/nvenc/gstnvbaseenc.c: - * sys/nvenc/gstnvbaseenc.h: - nvenc: Add support for dynamic bitrate/preset reconfiguration - Useful for dynamically updating bitrate in live scenarios. - https://bugzilla.gnome.org/show_bug.cgi?id=781410 - -2017-04-14 15:30:44 +0200 Ole André Vadla Ravnås <oleavr@gmail.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: Add support for I420 - https://bugzilla.gnome.org/show_bug.cgi?id=781410 - -2017-12-21 18:33:49 +0800 Jun Xie <jun.xie@samsung.com> - - * gst/netsim/gstnetsim.c: - netsim: fix misleading packet delay log - packet delay time shall be calculated by ready_time minus current time - https://bugzilla.gnome.org/show_bug.cgi?id=791838 - -2017-12-28 12:15:21 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregatorpad: implement skip_buffer - Skip buffers from sources with a framerate higher than the output - framerate. - https://bugzilla.gnome.org/show_bug.cgi?id=781928 - -2018-01-23 14:49:51 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: don't crash if there are no decklink devices - Fixes generic/states check. - -2018-01-23 10:27:57 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: don't limit number of devices to 16 - There is no fixed limitation for the number of devices on the - decklink API side according to BlackMagic. Many PC motherboards - are able support 6 decklink cards each with up to 8 inputs so - a limit of 16 might well be too low. - https://bugzilla.gnome.org/show_bug.cgi?id=777239 - -2018-01-23 09:01:00 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/audio/gstaudioaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst/mxf/mxfmux.c: - Update for renamed aggregator pad API - https://bugzilla.gnome.org/show_bug.cgi?id=791204 - -2018-01-22 18:53:22 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/curl/meson.build: - * meson.build: - meosn: curl: also check for and use libssh2 if available - -2018-01-22 13:44:29 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/directsound/gstdirectsoundsrc.c: - * sys/directsound/gstdirectsoundsrc.h: - directsoundsrc: Don't dynamically load one DirectSound symbol at runtime - Just link statically to it, like for all other DirectSound symbols. - -2018-01-21 09:02:30 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - wasapi: Rewrite most of the code to make it work - Both the source and the sink elements were broken in a number of ways: - * prepare() was assuming that the format was always S16LE 2ch 44.1KHz. - We now probe the preferred format with GetMixFormat(). - * Device initialization was done with the wrong buffer size - (buffer_time is in microseconds, not nanoseconds). - * sink_write() and src_read() were just plain wrong and would never - write or read anything useful. - * Some functions in prepare() were always returning FALSE which meant - trying to use the elements would *always* fail. - * get_caps() and delay() were not implemented at all. - TODO: support for >2 channels - TODO: pro-audio low-latency - TODO: SPDIF and other encoded passthroughs - Three new properties are now implemented: role, mute, and device. - * 'role' designates the stream role of the initialized device, see: - https://msdn.microsoft.com/en-us/library/windows/desktop/dd370842(v=vs.85).aspx - * 'device' is a system-wide GUIDesque string for a specific device. - * 'mute' is a sink property and simply mutes it. - On my Windows 8.1 system, the lowest latency that works is: - wasapisrc buffer-time=20000 - wasapisink buffer-time=10000 - aka, 20ms and 10ms respectively. These values are close to the lowest - possible with the IAudioClient interface. Further improvements require - porting to IAudioClient2 or IAudioClient3. - https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/low-latency-audio - -2018-01-20 15:49:35 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/camerabin.c: - tests: camerabin: skip checks if we don't have encoders for the default format - https://bugzilla.gnome.org/show_bug.cgi?id=767863 - -2018-01-17 12:06:28 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/pipelines/ipcpipeline.c: - tests: ipcpipeline: fix struct initialisation warnings with clang - Use init macros to avoid gst-indent making a mess of it. - https://bugzilla.gnome.org/show_bug.cgi?id=787980 - -2018-01-16 11:35:22 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/icles/Makefile.am: - * tests/icles/metadata_editor.c: - * tests/icles/metadata_editor.h: - * tests/icles/metadata_editor.ui: - tests: remove test that's never been ported to 1.x - -2018-01-03 10:26:49 +0800 Jun Xie <jun.xie@samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: fix memory leak while updating master playlist - new_master needs to be freed if current playlist is not a master playlist - https://bugzilla.gnome.org/show_bug.cgi?id=792146 - -2018-01-15 20:01:06 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/lv2/gstlv2utils.c: - lv2: fix inverted boolean properties - https://bugzilla.gnome.org/show_bug.cgi?id=791330 - -2018-01-11 11:49:06 +0100 Edward Hervey <edward@centricular.com> - - * tests/check/elements/.gitignore: - * tests/check/libs/.gitignore: - check: Update gitignore - -2018-01-11 11:41:33 +0100 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Remove useless check - Any modification of ret in that "while (ret == GST_FLOW_OK)" loop will - break (and cause it to stop the iteration). - CID #1427095 - -2018-01-11 11:33:22 +0100 Edward Hervey <edward@centricular.com> - - * ext/kate/gstkateenc.c: - kateenc: Refactoring for readability and leak fixing - Instead of a massive if/else/if/else/if/else/...: - * Use a common cleanup path for allocated items just before leaving - the function (which will be free-d only if we're not dealing with - a delayed SPU). - * "goto" that cleanup path wherever needed - CID #1427096 - CID #1427114 - -2018-01-11 11:29:38 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/msdk/gstmsdk.c: - msdk: change plugin's description - There are not only encoders nowadays, there are decoders too and a - postprocessor in the future. - -2018-01-10 18:24:07 -0900 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/gstmsdk.c: - msdk: init the debug category for mpeg2dec - https://bugzilla.gnome.org/show_bug.cgi?id=792260 - -2018-01-10 10:40:24 -0900 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkmpeg2dec.c: - * sys/msdk/gstmsdkmpeg2dec.h: - * sys/msdk/meson.build: - msdk: Add mpeg2 decoder - https://bugzilla.gnome.org/show_bug.cgi?id=792260 - -2018-01-09 18:11:52 -0500 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - srt: The pkgconfig is "srt", not "libsrt" - Also, always use the pkgconfig file instead of falling back - -2018-01-09 18:10:04 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/srt/gstsrtserversrc.c: - * ext/srt/gstsrtserversrc.h: - srt: Include srt.h inside object header - Otherwise, newer GCC complains about now having sockaddr defined in - the header. - -2018-01-07 14:45:37 +0000 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/player/gstplayer.c: - player: doc update for set_subtitle_uri() - A call to this function without enabling the subtitle track has no effect. - -2017-12-29 15:14:54 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - decklinkaudiosrc: Extrapolate stream/hw reference timestamps when video frame is missing - Sometimes we might get an audio packet without a corresponding video - frame. In these cases, the stream and hardware reference timestamps - would be missing, because they're called on the video frame. Instead of - potentially breaking stuff downstream that might depend on these, we now - extrapolate them. - https://bugzilla.gnome.org/show_bug.cgi?id=792042 - -2017-04-26 19:05:21 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink: Detect gaps on incoming stream times, issue warnings - When we receive a video or audio buffer, we calculate the next stream - time based on the current stream time + buffer duration. If the next - buffer's stream time is after that, we issue a warning. - This happens because the stream time incoming from Decklink should be - really constant and without gaps. If there is a gap, it means that - something went wrong, e.g. the internal buffer pool is empty (too many - buffers queued up downstream). - https://bugzilla.gnome.org/show_bug.cgi?id=781776 - -2018-01-04 15:41:51 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - Revert "WIP: Revert "Revert "decklink: Detect gaps on incoming stream times, issue warnings""" - This reverts commit 8dceeb5ccd6e46a61e3bbe79efa45275504fa500. - -2018-01-04 15:41:50 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstjitterer.c: - * gst/debugutils/gstjitterer.h: - * gst/debugutils/meson.build: - Revert "WIP: Revert "Revert "debugutils: Added new jitterer element""" - This reverts commit a401cb9a61f21c2fbc803eb3f098a9e2496edc06. - -2018-01-04 15:41:49 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * configure.ac: - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - Revert "WIP: Revert "Revert "timecodestamper: LTC from audio""" - This reverts commit e0be05dc7059cc97dceb70a48ca9cad4ee2edce6. - -2018-01-04 15:41:48 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - Revert "WIP: Revert "Revert "timecodestamper: Modify ltc-add to tc-add""" - This reverts commit 2f9da0ab59ef4231e9c850afb089d920e9d25609. - -2018-01-04 15:41:44 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - Revert "decklinkaudiosrc: Extrapolate stream/hw reference timestamps when video frame is missing" - This reverts commit 6af863916a7bf3bfe31970fdc2dd2d42ea3f9690. - -2017-12-29 15:14:54 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - decklinkaudiosrc: Extrapolate stream/hw reference timestamps when video frame is missing - Sometimes we might get an audio packet without a corresponding video - frame. In these cases, the stream and hardware reference timestamps - would be missing, because they're called on the video frame. Instead of - potentially breaking stuff downstream that might depend on these, we now - extrapolate them. - https://bugzilla.gnome.org/show_bug.cgi?id=792042 - -2017-11-07 21:14:18 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - WIP: Revert "Revert "timecodestamper: Modify ltc-add to tc-add"" - This reverts commit 05426d9298431c149807fb435cd1d632e9fd061f. - -2017-11-07 21:14:15 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * configure.ac: - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - WIP: Revert "Revert "timecodestamper: LTC from audio"" - This reverts commit 1998ccf1fbd586ef1dc4b1e7256bad7af8136f13. - -2017-11-07 21:14:01 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstjitterer.c: - * gst/debugutils/gstjitterer.h: - * gst/debugutils/meson.build: - WIP: Revert "Revert "debugutils: Added new jitterer element"" - This reverts commit ccc1624d097cbfdaf9f99526c033c642c863400c. - -2017-11-07 21:13:57 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - WIP: Revert "Revert "decklink: Detect gaps on incoming stream times, issue warnings"" - This reverts commit 07819afda461f5e4d77c9be9f484a7aae3c5ec8c. - -2018-01-03 16:07:24 +0100 Edward Hervey <edward@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Remove useless check - We are sure to have a frame at this point - CID #1427138 - -2018-01-03 15:15:25 +0100 Edward Hervey <edward@centricular.com> - - * ext/hls/gsthlssink2.c: - hlssink2: Remove useless if statement - message will always be present - CID #1409853 - -2018-01-03 12:15:01 +0100 Edward Hervey <edward@centricular.com> - - * ext/kate/gstkateenc.c: - kateenc: Fix memory leak in error cases - CID #1427096 - CID #1427114 - -2018-01-02 20:51:25 +0900 Justin Kim <justin.kim@collabora.com> - - * ext/srt/gstsrt.h: - * ext/srt/gstsrtbasesink.c: - * ext/srt/gstsrtbasesrc.c: - * ext/srt/gstsrtclientsrc.c: - * ext/srt/gstsrtserversink.h: - * ext/srt/gstsrtserversrc.h: - srt: Remove platform dependent socket headers - SRT modules entrust `gnetworking.h` with finding right headers - for the platforms. - https://bugzilla.gnome.org/show_bug.cgi?id=792123 - -2018-01-02 15:23:00 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/codecparsers/nalutils.c: - nalutils: Fix Exponential-Golomb 'ue' parsing - The algorithm we use only supports up to a maximum exponent of 31 - (for a maximum resulting of 2**32 -1) - CID #1427097 - -2018-01-02 11:43:39 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/opencv/meson.build: - opencv: allow all future 3.4.x versions - Fix-up for previous patch which I modified incorrectly. - https://bugzilla.gnome.org/show_bug.cgi?id=792114 - -2018-01-02 10:12:11 +0100 Nicola Murino <nicola.murino@gmail.com> - - * configure.ac: - * ext/opencv/meson.build: - opencv: allow compilation against 3.4.x - https://bugzilla.gnome.org/show_bug.cgi?id=792114 - -2017-12-27 13:08:18 +0000 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/player/gstplayer.c: - player: transfer ownership of info properties - The previous code would emit GObject critical warnings when the info properties - are NULL. - https://bugzilla.gnome.org/show_bug.cgi?id=791982 - -2017-12-26 09:54:18 +0900 Justin Kim <justin.kim@collabora.com> - - * ext/srtp/gstsrtp.c: - srtp: get ssrc for Application-Defined RTCP Packet - Application-defined RTCP(204) packets also have a ssrc in their header. - To find a valid stream from the packet, the ssrc should be used. - https://bugzilla.gnome.org/show_bug.cgi?id=791955 - -2017-12-26 13:52:18 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: skip translations if gettext is not available - -2017-12-24 11:36:01 +0100 Tim-Philipp Müller <tim@centricular.com> - - * pkgconfig/gstreamer-bad-audio.pc.in: - Fix typo in gstreamer-bad-audio-1.0.pc - https://bugzilla.gnome.org/show_bug.cgi?id=791910 - -2017-12-23 12:53:39 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/Makefile.am: - gl: local libs should come first in Makefile.am - And keep consistent order in CFLAGS and LIBS. - -2017-12-23 12:29:03 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * ext/gl/Makefile.am: - gl: arrange for finding headers and libs that have moved to -base - In file included from ../../../gst-plugins-bad/ext/gl/gstopengl.c:47:0: - ../../../gst-plugins-bad/ext/gl/gstglmixerbin.h:25:29: fatal error: gst/video/video.h: No such file or directory - -2017-12-19 23:13:34 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/festival/gstfestival.c: - festival: Don't forward all queries - This fixes issues where wavparse would query the file size upstream - and assert because the file size is way smaller then what the WAVE - header says. This patch disable or cane a handful of queries that - make no sense to forward. - https://bugzilla.gnome.org/show_bug.cgi?id=791811 - -2017-12-20 15:02:30 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: Don't leak pads - all audioaggregator subclasses were leaking the first sink pad :) - -2017-12-20 15:01:16 +0800 Jun Xie <jun.xie@samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix pending_segment log - pending_segment shall be logged as GST_PTR_FORMAT, it's an event - https://bugzilla.gnome.org/show_bug.cgi?id=791813 - -2017-12-19 17:35:39 -0500 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/gstshmsink.c: - shmsink: Block in preroll_wait on unlock - The correct behaviour of anything stuck in the ->render() function - between ->unlock() and ->unlock_stop() is to call - gst_base_sink_wait_preroll() and only return an error if this returns an - error, otherwise, it must continue where it left off! - https://bugzilla.gnome.org/show_bug.cgi?id=774950 - -2017-07-22 20:32:20 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/audio/gstaudioaggregator.c: - * gst-libs/gst/audio/gstaudioaggregator.h: - * gst/audiomixer/gstaudiointerleave.c: - * gst/audiomixer/gstaudiomixer.c: - * gst/audiomixer/gstaudiomixer.h: - * tests/check/elements/audiomixer.c: - audioaggregator: implement input conversion - https://bugzilla.gnome.org/show_bug.cgi?id=786344 - -2016-07-07 20:40:22 +0200 Marcin Lewandowski <marcin@radiokit.org> - - * sys/shm/gstshmsink.c: - smhsink: Check return values of functions working on memory - https://bugzilla.gnome.org/show_bug.cgi?id=768530 - -2017-12-19 21:35:08 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/applemedia/videotexturecache.m: - applemedia: don't include private cocoa gl header - -2017-12-19 16:22:52 -0500 Olivier Crête <olivier.crete@collabora.com> - - * tests/examples/gtk/Makefile.am: - gtk example: Fix cflags in Makefile.am - -2017-12-19 19:23:43 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/Makefile.am: - gl: enable openglmixers plugin in autotools again too - -2017-12-19 17:56:33 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/applemedia/Makefile.am: - applemedia: fix build after gl move to -base - -2017-12-19 17:34:50 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/meson.build: - * ext/meson.build: - * meson.build: - meson: gl: fix build of openglmixers plugin - -2017-12-19 15:14:07 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: fix dependency type name to check for - -2017-12-19 15:06:22 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: fix build with GstGL from gst-plugins-base as subproject - - use right fallback variable - - get platform/winsys variables from subproject instead of pkg-config - With contributions from Thibault Saunier. - -2017-12-19 13:03:28 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - gtk: don't include uninstalled header - -2017-12-13 01:05:32 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/allocators/Makefile.am: - * gst-libs/gst/allocators/badallocators.h: - * gst-libs/gst/allocators/gstphysmemory.c: - * gst-libs/gst/allocators/gstphysmemory.h: - * gst-libs/gst/allocators/meson.build: - * gst-libs/gst/meson.build: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-bad-allocators-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-allocators.pc.in: - allocatorsbad: physmem moved to -base - -2017-12-17 20:54:06 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/gl/Makefile.am: - * ext/gtk/Makefile.am: - * ext/gtk/meson.build: - * ext/qt/Makefile.am: - * meson.build: - * sys/androidmedia/Makefile.am: - * sys/applemedia/Makefile.am: - * sys/nvdec/Makefile.am: - * sys/nvenc/Makefile.am: - * tests/check/Makefile.am: - * tests/examples/gtk/Makefile.am: - gl: update plugins to use GstGL from -base - -2017-12-11 14:20:59 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/gl/Makefile.am: - * ext/gl/caopengllayersink.h: - * ext/gl/caopengllayersink.m: - * ext/gl/effects/gstgleffectblur.c: - * ext/gl/effects/gstgleffectbulge.c: - * ext/gl/effects/gstgleffectfisheye.c: - * ext/gl/effects/gstgleffectglow.c: - * ext/gl/effects/gstgleffectidentity.c: - * ext/gl/effects/gstgleffectlaplacian.c: - * ext/gl/effects/gstgleffectlumatocurve.c: - * ext/gl/effects/gstgleffectlumatocurve.h: - * ext/gl/effects/gstgleffectmirror.c: - * ext/gl/effects/gstgleffectrgbtocurve.c: - * ext/gl/effects/gstgleffectscurves.c: - * ext/gl/effects/gstgleffectscurves.h: - * ext/gl/effects/gstgleffectsin.c: - * ext/gl/effects/gstgleffectsobel.c: - * ext/gl/effects/gstgleffectsquare.c: - * ext/gl/effects/gstgleffectsqueeze.c: - * ext/gl/effects/gstgleffectssources.c: - * ext/gl/effects/gstgleffectssources.h: - * ext/gl/effects/gstgleffectstretch.c: - * ext/gl/effects/gstgleffecttunnel.c: - * ext/gl/effects/gstgleffecttwirl.c: - * ext/gl/effects/gstgleffectxray.c: - * ext/gl/gltestsrc.c: - * ext/gl/gltestsrc.h: - * ext/gl/gstglcolorbalance.c: - * ext/gl/gstglcolorbalance.h: - * ext/gl/gstglcolorconvertelement.c: - * ext/gl/gstglcolorconvertelement.h: - * ext/gl/gstglcolorscale.c: - * ext/gl/gstglcolorscale.h: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldeinterlace.h: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgldifferencematte.h: - * ext/gl/gstgldownloadelement.c: - * ext/gl/gstgldownloadelement.h: - * ext/gl/gstgleffects.c: - * ext/gl/gstgleffects.h: - * ext/gl/gstglfilterapp.c: - * ext/gl/gstglfilterapp.h: - * ext/gl/gstglfilterbin.c: - * ext/gl/gstglfilterbin.h: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfiltercube.h: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglfilterglass.h: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstglfiltershader.h: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * ext/gl/gstgloverlay.c: - * ext/gl/gstgloverlay.h: - * ext/gl/gstglsinkbin.c: - * ext/gl/gstglsinkbin.h: - * ext/gl/gstglsrcbin.c: - * ext/gl/gstglsrcbin.h: - * ext/gl/gstglstereosplit.c: - * ext/gl/gstglstereosplit.h: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstgltestsrc.h: - * ext/gl/gstgltransformation.c: - * ext/gl/gstgltransformation.h: - * ext/gl/gstgluploadelement.c: - * ext/gl/gstgluploadelement.h: - * ext/gl/gstglvideoflip.c: - * ext/gl/gstglvideoflip.h: - * ext/gl/gstglviewconvert.c: - * ext/gl/gstglviewconvert.h: - * ext/gl/gstopengl.c: - * ext/gl/meson.build: - gl: most of opengl plugin has moved to -base, keep mixer bits in -bad for now - Since they rely on GstVideoAggregator. - Fix detection of things again, and Meson - -2017-12-11 12:59:09 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * configure.ac: - * docs/libs/Makefile.am: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * ext/Makefile.am: - * ext/meson.build: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/gl/.gitignore: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/android/Makefile.am: - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/android/gstglwindow_android_egl.h: - * gst-libs/gst/gl/cocoa/Makefile.am: - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.h: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstgldisplay_cocoa.h: - * gst-libs/gst/gl/cocoa/gstgldisplay_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/dispmanx/Makefile.am: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h: - * gst-libs/gst/gl/eagl/Makefile.am: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.h: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.h: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - * gst-libs/gst/gl/egl/Makefile.am: - * gst-libs/gst/gl/egl/gstegl.c: - * gst-libs/gst/gl/egl/gstegl.h: - * gst-libs/gst/gl/egl/gsteglimage.c: - * gst-libs/gst/gl/egl/gsteglimage.h: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/egl/gstgldisplay_egl.c: - * gst-libs/gst/gl/egl/gstgldisplay_egl.h: - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - * gst-libs/gst/gl/egl/gstglmemoryegl.h: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/glprototypes/Makefile.am: - * gst-libs/gst/gl/glprototypes/README: - * gst-libs/gst/gl/glprototypes/all_functions.h: - * gst-libs/gst/gl/glprototypes/base.h: - * gst-libs/gst/gl/glprototypes/blending.h: - * gst-libs/gst/gl/glprototypes/buffers.h: - * gst-libs/gst/gl/glprototypes/debug.h: - * gst-libs/gst/gl/glprototypes/eglimage.h: - * gst-libs/gst/gl/glprototypes/fbo.h: - * gst-libs/gst/gl/glprototypes/fixedfunction.h: - * gst-libs/gst/gl/glprototypes/gles.h: - * gst-libs/gst/gl/glprototypes/gstgl_compat.h: - * gst-libs/gst/gl/glprototypes/gstgl_gles2compat.h: - * gst-libs/gst/gl/glprototypes/opengl.h: - * gst-libs/gst/gl/glprototypes/query.h: - * gst-libs/gst/gl/glprototypes/shaders.h: - * gst-libs/gst/gl/glprototypes/sync.h: - * gst-libs/gst/gl/glprototypes/vao.h: - * gst-libs/gst/gl/gstgl_enums.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglbasefilter.c: - * gst-libs/gst/gl/gstglbasefilter.h: - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbasememory.h: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstglconfig.h.meson: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstglcontext_private.h: - * gst-libs/gst/gl/gstgldebug.c: - * gst-libs/gst/gl/gstgldebug.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglfeature.h: - * gst-libs/gst/gl/gstglfeature_private.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglformat.c: - * gst-libs/gst/gl/gstglformat.h: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/gl/gstglfuncs.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/gl/gstglmemorypbo.h: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstgloverlaycompositor.h: - * gst-libs/gst/gl/gstglpixelformat.c: - * gst-libs/gst/gl/gstglquery.c: - * gst-libs/gst/gl/gstglquery.h: - * gst-libs/gst/gl/gstglrenderbuffer.c: - * gst-libs/gst/gl/gstglrenderbuffer.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglshaderstrings.c: - * gst-libs/gst/gl/gstglshaderstrings.h: - * gst-libs/gst/gl/gstglsl.c: - * gst-libs/gst/gl/gstglsl.h: - * gst-libs/gst/gl/gstglsl_private.h: - * gst-libs/gst/gl/gstglslstage.c: - * gst-libs/gst/gl/gstglslstage.h: - * gst-libs/gst/gl/gstglsyncmeta.c: - * gst-libs/gst/gl/gstglsyncmeta.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * gst-libs/gst/gl/gstglutils_private.h: - * gst-libs/gst/gl/gstglviewconvert.c: - * gst-libs/gst/gl/gstglviewconvert.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_private.h: - * gst-libs/gst/gl/meson.build: - * gst-libs/gst/gl/utils/gles_versions.h: - * gst-libs/gst/gl/utils/opengl_versions.h: - * gst-libs/gst/gl/viv-fb/Makefile.am: - * gst-libs/gst/gl/viv-fb/gstgldisplay_viv_fb.c: - * gst-libs/gst/gl/viv-fb/gstgldisplay_viv_fb.h: - * gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.c: - * gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.h: - * gst-libs/gst/gl/wayland/Makefile.am: - * gst-libs/gst/gl/wayland/gstgldisplay_wayland.c: - * gst-libs/gst/gl/wayland/gstgldisplay_wayland.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/wayland/wayland_event_source.c: - * gst-libs/gst/gl/wayland/wayland_event_source.h: - * gst-libs/gst/gl/win32/Makefile.am: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - * gst-libs/gst/gl/win32/win32_message_source.c: - * gst-libs/gst/gl/win32/win32_message_source.h: - * gst-libs/gst/gl/x11/Makefile.am: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.h: - * gst-libs/gst/gl/x11/gstgldisplay_x11.c: - * gst-libs/gst/gl/x11/gstgldisplay_x11.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - * gst-libs/gst/gl/x11/xcb_event_source.c: - * gst-libs/gst/gl/x11/xcb_event_source.h: - * gst-libs/gst/meson.build: - * meson_options.txt: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in: - * pkgconfig/meson.build: - * po/POTFILES.in: - * tests/check/Makefile.am: - * tests/check/elements/glimagesink.c: - * tests/check/libs/gstglcolorconvert.c: - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglheaders.c: - * tests/check/libs/gstglmatrix.c: - * tests/check/libs/gstglmemory.c: - * tests/check/libs/gstglquery.c: - * tests/check/libs/gstglshader.c: - * tests/check/libs/gstglsl.c: - * tests/check/libs/gstglslstage.c: - * tests/check/libs/gstglupload.c: - * tests/check/meson.build: - * tests/check/pipelines/simple-launch-lines.c: - * tests/examples/Makefile.am: - * tests/examples/gl/Makefile.am: - * tests/examples/gl/clutter/.gitignore: - * tests/examples/gl/clutter/Makefile.am: - * tests/examples/gl/clutter/clutteractor.c: - * tests/examples/gl/clutter/clutteractortee.c: - * tests/examples/gl/clutter/cluttershare.c: - * tests/examples/gl/clutter/cluttershare.cbp: - * tests/examples/gl/cocoa/.gitignore: - * tests/examples/gl/cocoa/Makefile.am: - * tests/examples/gl/cocoa/cocoa-videooverlay.m: - * tests/examples/gl/generic/Makefile.am: - * tests/examples/gl/generic/README: - * tests/examples/gl/generic/cube/.gitignore: - * tests/examples/gl/generic/cube/Makefile.am: - * tests/examples/gl/generic/cube/main.cpp: - * tests/examples/gl/generic/cubeyuv/.gitignore: - * tests/examples/gl/generic/cubeyuv/Makefile.am: - * tests/examples/gl/generic/cubeyuv/main.cpp: - * tests/examples/gl/generic/doublecube/.gitignore: - * tests/examples/gl/generic/doublecube/Makefile.am: - * tests/examples/gl/generic/doublecube/main.cpp: - * tests/examples/gl/generic/generic.sln: - * tests/examples/gl/generic/recordgraphic/.gitignore: - * tests/examples/gl/generic/recordgraphic/Makefile.am: - * tests/examples/gl/generic/recordgraphic/main.cpp: - * tests/examples/gl/gtk/3dvideo/.gitignore: - * tests/examples/gl/gtk/3dvideo/Makefile.am: - * tests/examples/gl/gtk/3dvideo/main.cpp: - * tests/examples/gl/gtk/3dvideo/mviewwidget.c: - * tests/examples/gl/gtk/3dvideo/mviewwidget.h: - * tests/examples/gl/gtk/Makefile.am: - * tests/examples/gl/gtk/README: - * tests/examples/gl/gtk/filternovideooverlay/.gitignore: - * tests/examples/gl/gtk/filternovideooverlay/Makefile.am: - * tests/examples/gl/gtk/filternovideooverlay/main.cpp: - * tests/examples/gl/gtk/filtervideooverlay/.gitignore: - * tests/examples/gl/gtk/filtervideooverlay/Makefile.am: - * tests/examples/gl/gtk/filtervideooverlay/main.cpp: - * tests/examples/gl/gtk/fxtest/.gitignore: - * tests/examples/gl/gtk/fxtest/Makefile.am: - * tests/examples/gl/gtk/fxtest/fxtest.c: - * tests/examples/gl/gtk/fxtest/pixbufdrop.c: - * tests/examples/gl/gtk/gstgtk.c: - * tests/examples/gl/gtk/gstgtk.h: - * tests/examples/gl/gtk/gtk.sln: - * tests/examples/gl/gtk/switchvideooverlay/.gitignore: - * tests/examples/gl/gtk/switchvideooverlay/Makefile.am: - * tests/examples/gl/gtk/switchvideooverlay/main.cpp: - * tests/examples/gl/meson.build: - * tests/examples/gl/qt/.gitignore: - * tests/examples/gl/qt/Makefile.am: - * tests/examples/gl/qt/README: - * tests/examples/gl/qt/mousevideooverlay/gstthread.cpp: - * tests/examples/gl/qt/mousevideooverlay/gstthread.h: - * tests/examples/gl/qt/mousevideooverlay/main.cpp: - * tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pri: - * tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pro: - * tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.sln: - * tests/examples/gl/qt/mousevideooverlay/pipeline.cpp: - * tests/examples/gl/qt/mousevideooverlay/pipeline.h: - * tests/examples/gl/qt/mousevideooverlay/qrenderer.cpp: - * tests/examples/gl/qt/mousevideooverlay/qrenderer.h: - * tests/examples/gl/qt/qglwidgetvideooverlay/gstthread.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/gstthread.h: - * tests/examples/gl/qt/qglwidgetvideooverlay/main.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.h: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglrenderer.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglrenderer.h: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pri: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pro: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.sln: - * tests/examples/gl/qt/qglwtextureshare/.gitignore: - * tests/examples/gl/qt/qglwtextureshare/AsyncQueue.h: - * tests/examples/gl/qt/qglwtextureshare/README: - * tests/examples/gl/qt/qglwtextureshare/cocoa_utils.mm: - * tests/examples/gl/qt/qglwtextureshare/gstthread.cpp: - * tests/examples/gl/qt/qglwtextureshare/gstthread.h: - * tests/examples/gl/qt/qglwtextureshare/main.cpp: - * tests/examples/gl/qt/qglwtextureshare/pipeline.cpp: - * tests/examples/gl/qt/qglwtextureshare/pipeline.h: - * tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp: - * tests/examples/gl/qt/qglwtextureshare/qglrenderer.h: - * tests/examples/gl/qt/qglwtextureshare/qglwtextureshare.pro: - * tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_gstthread.cpp: - * tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_pipeline.cpp: - * tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_qrenderer.cpp: - * tests/examples/gl/qt/videooverlay/videooverlay.cpp: - * tests/examples/gl/qt/videooverlay/videooverlay.pri: - * tests/examples/gl/qt/videooverlay/videooverlay.pro: - * tests/examples/gl/qt/videooverlay/videooverlay.sln: - * tests/examples/gl/sdl/.gitignore: - * tests/examples/gl/sdl/Makefile.am: - * tests/examples/gl/sdl/meson.build: - * tests/examples/gl/sdl/sdl.sln: - * tests/examples/gl/sdl/sdlshare.c: - * tests/examples/gl/sdl/sdlshare2.c: - * tests/examples/meson.build: - gl: remove GStreamer OpenGL integration library and move to -base - https://bugzilla.gnome.org/show_bug.cgi?id=754094 - -2017-12-18 16:54:15 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/ladspa/gstladspa.c: - ladspa: Add Windows/OSX path support - This is to mimic LV2 and what is commonly documented over the - web. We also completely track these directories when updating - the cache now. Unlike LV2, the plugins are flat in the plugin - directories, so no need for the recursive lookup. This also fixes - support for Fedora and other architecture using lib64 as a libdir. - -2017-12-18 16:09:53 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/ladspa/meson.build: - * ext/meson.build: - meson: Enable ladspa plugins compilation - -2017-12-18 14:42:21 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/lv2/gstlv2.c: - lv2: Try and reflect better lilv default path - While keeping it simple, this patch tries and mimic lilv default path. - It does not matter if some path are duplicated due to symlink because in - the end it's lilv that will walk these paths. The worst case is that we - update our cache more often then strictly needed. - https://bugzilla.gnome.org/show_bug.cgi?id=791717 - -2017-12-18 12:11:21 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/lv2/gstlv2.c: - lv2: Recursively monitor the lv2 plugin path - Otherwise we might not update the cache when needed. - https://bugzilla.gnome.org/show_bug.cgi?id=791717 - -2017-12-19 01:16:35 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * configure.ac: - * gst/meson.build: - * gst/proxy/Makefile.am: - * gst/proxy/gstproxy.c: - * gst/proxy/gstproxysink-priv.h: - * gst/proxy/gstproxysink.c: - * gst/proxy/gstproxysink.h: - * gst/proxy/gstproxysrc-priv.h: - * gst/proxy/gstproxysrc.c: - * gst/proxy/gstproxysrc.h: - * gst/proxy/meson.build: - Revert "New element 'proxy' to send data to in-process pipelines" - This reverts commit 8a056af05e23ad5b81cd1dc2699ae20abcf9b91a. - Accidentally pushed this element, oops! Progress on this element is - being tracked at: https://bugzilla.gnome.org/show_bug.cgi?id=788200 - -2017-12-19 01:14:03 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson.build: - meson: Use cdata.set_quoted and set LIBDIR correctly - LIBDIR must include the prefix. Also use set_quoted instead of - manually quoting because it's clearer what the intention is. - https://bugzilla.gnome.org/show_bug.cgi?id=791751 - -2017-09-26 20:12:24 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * configure.ac: - * gst/meson.build: - * gst/proxy/Makefile.am: - * gst/proxy/gstproxy.c: - * gst/proxy/gstproxysink-priv.h: - * gst/proxy/gstproxysink.c: - * gst/proxy/gstproxysink.h: - * gst/proxy/gstproxysrc-priv.h: - * gst/proxy/gstproxysrc.c: - * gst/proxy/gstproxysrc.h: - * gst/proxy/meson.build: - New element 'proxy' to send data to in-process pipelines - This plugin is useful when you want to pipe arbitrary data to - a different pipeline within the same process. Buffers, events, and caps - are transmitted as-is without copying or manipulation. - -2017-12-18 11:34:13 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/lv2/meson.build: - * ext/meson.build: - meson: Enable building LV2 - Note that I only support lilv 0.22+ for now, because it's simple and old - enough. If anyone needs to use the 0.16 support it will need to be - added. - -2017-12-18 20:39:07 +0800 Jun Xie <jun.xie@samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix log integer format - range_start/range_end shall be logged as G_GINT64_FORMAT - https://bugzilla.gnome.org/show_bug.cgi?id=791735 - -2017-12-14 15:18:38 +0800 Jun Xie <jun.xie@samsung.com> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: parse xs:dateTime's timezone indicator - The lexical form of xs:dateTime is YYYY-MM-DDThh:mm:ssZ|(+|-)hh:mm - timezone indicator (+|-)hh:mm needs to be parsed. - https://bugzilla.gnome.org/show_bug.cgi?id=791602 - -2017-12-16 10:44:26 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - player: Fix-up set_seek_accurate() configuration to take a player config instead of a player instance - -2017-12-16 10:22:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - player: Consistently use GstVideoMultiviewFramePacking instead of Mode - The latter needs additional metadata, and the former was already used - everywhere except for the functions: in properties in playbin itself. - -2017-12-15 17:38:12 +0100 Edward Hervey <edward@centricular.com> - - * ext/aom/gstav1enc.c: - av1enc: Add debugging of configuration settings - In preparation of making such properties configurable - via gobject properties. - -2017-12-15 17:37:08 +0100 Edward Hervey <edward@centricular.com> - - * ext/aom/gstav1enc.c: - av1enc: Remove g_print for errors - And use standard debugging system for it - -2017-06-27 22:50:41 +0000 Sean DuBois <sean@siobud.com> - - * configure.ac: - * ext/Makefile.am: - * ext/aom/Makefile.am: - * ext/aom/gstaom.c: - * ext/aom/gstaom.h: - * ext/aom/gstav1dec.c: - * ext/aom/gstav1dec.h: - * ext/aom/gstav1enc.c: - * ext/aom/gstav1enc.h: - * ext/aom/meson.build: - * ext/meson.build: - Add aom plugin with av1enc and av1dec element - https://bugzilla.gnome.org/show_bug.cgi?id=784160 - -2017-12-14 13:31:33 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/opencv/gsthanddetect.cpp: - opencv: handdetect: fix typo in example launch line - -2017-11-22 14:29:51 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - decklinkaudiosink: Start audio pre-rolling if the output is not started yet in render() - This seems to allow to schedule audio samples correctly at their right - times already. - https://bugzilla.gnome.org/show_bug.cgi?id=790114 - -2017-12-06 20:36:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Only start if both sinks are set to PLAYING already - Not only if the video sink is set to PLAYING so far. Also give more - useful debug output about why we don't start, and don't start if already - started. - Also refactor the function to early-return instead of having a huge - if-else block over the whole function. - https://bugzilla.gnome.org/show_bug.cgi?id=790114 - -2017-12-06 19:42:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - decklinkaudiosink: Include final flow return in debug output - https://bugzilla.gnome.org/show_bug.cgi?id=790114 - -2017-11-27 17:41:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - decklinkaudiosink: Check also against the clock if we run ahead of the clock too much - The buffer level as reported by the Decklink driver is completely - unreliable, and we could otherwise easily run ahead >1s if we're - unlucky. - https://bugzilla.gnome.org/show_bug.cgi?id=790114 - -2017-11-22 16:37:12 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosink.h: - decklinkaudiosink: Implement resampling/buffer reversing for trick-modes - https://bugzilla.gnome.org/show_bug.cgi?id=790114 - -2017-11-08 19:31:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosink.h: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklinkaudiosink: Re-implement around GstBaseSink instead of GstAudioBaseSink - The Decklink and GstAudioBaseSink APIs don't fit very well together, - which causes various problems due to inaccuracies in the clock - calculations and the actual ringbuffer and GStreamer's copy getting of - sync. - Problems are audio drop-outs and A/V sync getting wrong after - pausing/seeking. - https://bugzilla.gnome.org/show_bug.cgi?id=790114 - -2017-12-14 14:49:10 +1100 Matthew Waters <matthew@centricular.com> - - * common: - Automatic update of common submodule - From e8c7a71 to 3fa2c9e - -2017-12-12 08:40:33 +0100 Josep Torra <jtorra@oblong.com> - - * sys/applemedia/vtenc.c: - vtenc: fix a warning when building in MacOS 10.12 - vtenc.c:564:20: error: incompatible pointer types passing 'GstVTEnc *' (aka 'struct _GstVTEnc *') - to parameter of type 'GstVideoEncoder *' (aka 'struct _GstVideoEncoder *') - -2017-12-12 08:31:47 +0100 Josep Torra <jtorra@oblong.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - cocoa: fix a warning when building in MacOS 10.12 - gstglwindow_cocoa.m:186:60: error: incompatible pointer types sending 'GstGLContextCocoa *' - (aka 'struct _GstGLContextCocoa *') to parameter of type 'GstGLContext *' (aka 'struct _GstGLContext *') - -2017-12-08 14:46:35 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/gl/egl/gstgldisplay_egl.c: - * gst-libs/gst/gl/wayland/gstgldisplay_wayland.c: - * gst-libs/gst/gl/x11/gstgldisplay_x11.c: - gl: display: demote error level at display creation error - https://bugzilla.gnome.org/show_bug.cgi?id=791391 - -2017-11-10 15:56:40 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gstavwait.c: - * gst/timecode/gstavwait.h: - avwait: Added "avwait-status" element message - "avwait-status" is posted when avwait starts or stops passing through - data (e.g. because target-timecode and end-timecode respectively have - been reached). The attached structure includes a "dropping" boolean (set - to TRUE if we are currently dropping data, FALSE otherwise), and a - "running-time" GST_CLOCK_TIME which contains the running time of the - change. - https://bugzilla.gnome.org/show_bug.cgi?id=790170 - -2017-10-16 19:51:36 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * meson_options.txt: - * tests/check/media/download-media: - * tests/check/media/meson.build: - * tests/check/meson.build: - meson test: Enable libs tests - https://bugzilla.gnome.org/show_bug.cgi?id=789064 - -2017-12-08 13:54:27 +0100 Edward Hervey <edward@centricular.com> - - * pkgconfig/gstreamer-bad-audio-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-audio.pc.in: - * pkgconfig/gstreamer-bad-video-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-video.pc.in: - pkgconfig: Move fixes for move of aggregator to core - -2017-12-07 19:14:23 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: make caps writable before modifying them - https://bugzilla.gnome.org/show_bug.cgi?id=790628 - -2017-12-07 11:02:02 +0900 Seungha Yang <pudding8757@gmail.com> - - * ext/srt/gstsrt.c: - srt: Post error message for NULL host - ... instead of crash without any information - https://bugzilla.gnome.org/show_bug.cgi?id=791329 - -2017-12-06 20:50:31 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Fix memory leak of shm allocator - This fixes conflict resolution error introduced in commit: - 816d115317c522c87297109de781c63b16146493 - http://bugzilla.gnome.org/show_bug.cgi?id=790042 - -2017-11-01 18:05:26 +0900 Shinya Saito <ssaito@igel.co.jp> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlwindow.c: - waylandsink: Fix memory leak of shm allocator. - gst_allocator_find() needs gst_object_unref() after usage. - https://bugzilla.gnome.org/show_bug.cgi?id=790042 - -2017-11-25 15:35:05 +0800 Jun Xie <jun.xie@samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: fix coredump issue with external AdaptationSet - fix wrong AdaptationSet list iterator - https://bugzilla.gnome.org/show_bug.cgi?id=790812 - -2017-11-25 22:24:39 +0900 Hosang Lee <hosang10.lee@lge.com> - - * ext/hls/m3u8.c: - m3u8: Parse and use AVERAGE-BANDWIDTH attribute if available - The AVERAGE-BANDWIDTH attribute in the EXT-X-STREAM-INF tag represents - the average segment bit rate of the Variant Stream, while the BANDWIDTH - attribute represents the peak segment bit rate of the Variant Stream. - (https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-4.3.4.2) - Using the average bit rate instead of the peak bit rate for variant switching - is more efficient and appropriate. Sometimes due to VBR encoding, - the BANDWIDTH may represent a value way above the average bit rate, - which could result to players not switching to that variant stream - although network bandwidth is sufficiently available. - https://bugzilla.gnome.org/show_bug.cgi?id=790821 - -2017-11-26 11:46:06 +0900 Wonchul Lee <wonchul.lee@collabora.com> - - * tests/examples/audiomixmatrix/Makefile.am: - * tests/examples/audiomixmatrix/test-audiomixmatrix.c: - examples: audiomixmatrix: Remove unused part - matrix-value-array property is removed since - 18917de9562d0d33cf80ca68c071eee3572d4483 commit applied - https://bugzilla.gnome.org/show_bug.cgi?id=790836 - -2017-12-04 11:52:16 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Fix CropMeta support - We copy the meta's from the original buffer to the wrapper or copied - buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=790473 - -2017-12-01 16:53:34 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Enforce pixel aspect ratio when we cannot scale - When we cannot scale, we need to enforce the pixel aspect ratio. - This was partly implemented in the previous patch. Doing this - simplify some of the code. - https://bugzilla.gnome.org/show_bug.cgi?id=784599 - -2017-11-22 10:42:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Wait until scheduled playback is actually stopped before continuing - Otherwise we might "start" again, just to get finally stopped and then - getting errors all over the place. - https://bugzilla.gnome.org/show_bug.cgi?id=790114 - -2017-12-06 19:15:40 +0900 Seungha Yang <pudding8757@gmail.com> - - * ext/srt/gstsrt.c: - srt: Fix warning error - gstsrt.c: In function ‘gst_srt_client_connect_full’: - gstsrt.c:151:6: error: ‘sock’ may be used uninitialized in this function -Werror=maybe-uninitialized - if (sock != SRT_INVALID_SOCK) { - https://bugzilla.gnome.org/show_bug.cgi?id=791302 - -2017-12-01 13:02:12 +0000 Ursula Maplehurst <ursula@kangatronix.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - androidmedia: when flushing, better handle IllegalStateException received from getOutputBuffer - 1. Similar to 880f3d8, don't consider not getting an output buffer as - an error during flushing. I've seen the following sometimes when - encoding: - W GStreamer+amcvideoenc: java.lang.IllegalStateException - W GStreamer+amcvideoenc: at android.media.MediaCodec.getBuffer(Native Method) - W GStreamer+amcvideoenc: at android.media.MediaCodec.getOutputBuffer(MediaCodec.java:2886) - 2. For amcvideodec/enc, call _find_nearest_frame (which grabs a fresh - reference on a GstVideoCodecFrame) after we have an output buffer, - so as to not leak the reference, in case getting an output buffer - fails. - Otherwise, if we get an error grabbing the output buffer, we leak - the reference to the frame. This can cause issues with a - v4l2bufferpool feeding the encoder not being able to clean itself - up properly due to buffers still being marked as in-use. - https://bugzilla.gnome.org/show_bug.cgi?id=791258 - -2017-12-05 10:37:40 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * ext/gl/gstgldownloadelement.c: - gldownload: fix wrong enum - When compiling with clang, an enum conversion error is triggered - since GstVideoFrameFlags are not GstVideoFlags. - This patch sets GST_VIDEO_FRAME_FLAG_NONE to the added video meta. - https://bugzilla.gnome.org/show_bug.cgi?id=791251 - -2017-12-03 11:22:02 +0100 Edward Hervey <edward@centricular.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - docs: aggregator has moved to base - -2017-12-02 19:28:30 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstgldownloadelement.c: - gldownload: Add missing ifdef for dmabuf and egl - This fixes the build for platforms that don't support one or the other. - -2017-12-02 15:25:38 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: Prefer wayland over X11 - As most Wayland compositors supports XWayland, X11 backend get - selected. This also realign better GStreamer decision to what - happens with GTK and other stack out there. - -2017-12-02 15:25:16 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: Add missing GL API to the doc - -2017-01-10 19:23:58 -0600 Matt Fischer <matt.fischer@garmin.com> - - * ext/gl/gstgldownloadelement.c: - * ext/gl/gstgldownloadelement.h: - * gst-libs/gst/gl/egl/gsteglimage.c: - * gst-libs/gst/gl/egl/gsteglimage.h: - gldownload: Add dmabuf exporting - This patch adds code to gldownload to export the image as a - dmabuf if requested. The element now exposes memory:DMABuf as - a cap feature, and if it is selected, the element exports the - texture to an EGL image and then a dmabuf. It also implements a - fallback to system memory download in case the exportation failed. - https://bugzilla.gnome.org/show_bug.cgi?id=776927 - -2017-12-02 16:01:25 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * configure.ac: - * docs/libs/Makefile.am: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * ext/gl/Makefile.am: - * ext/gl/meson.build: - * ext/iqa/Makefile.am: - * ext/iqa/meson.build: - * ext/openmpt/Makefile.am: - * ext/wildmidi/Makefile.am: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/audio/Makefile.am: - * gst-libs/gst/audio/meson.build: - * gst-libs/gst/base/Makefile.am: - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * gst-libs/gst/base/meson.build: - * gst-libs/gst/meson.build: - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/meson.build: - * gst/audiomixer/Makefile.am: - * gst/audiomixer/meson.build: - * gst/compositor/Makefile.am: - * gst/compositor/meson.build: - * gst/mxf/Makefile.am: - * gst/mxf/meson.build: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-bad-base-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-base.pc.in: - * pkgconfig/meson.build: - * tests/check/Makefile.am: - * tests/check/libs/aggregator.c: - Remove GstAggregator from -bad, moved to core - https://bugzilla.gnome.org/show_bug.cgi?id=739010 - -2017-12-01 11:59:01 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Add display-width/height properties - This is to be used with gst_video_overlay_set_render_rectangle() - so the application can calculate a rectangle that fits inside - the display. The property changes are notify in a way that you - can watch either notify::display-width or notify::display-height - and both will be up-to-data when this is called back. Before the - element is started, the size will be 0x0. - https://bugzilla.gnome.org/show_bug.cgi?id=784599 - -2017-09-14 18:12:18 +0800 Haihua Hu <jared.hu@nxp.com> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: support videooverlay interface - Implement videooverlay interface in kmssink, divided into two cases: - when driver supports scale, then we do refresh in show_frame(); if - not, send a reconfigure event to upstream and re-negotiate, using the - new size. - https://bugzilla.gnome.org/show_bug.cgi?id=784599 - -2017-09-12 15:46:01 +0800 Haihua Hu <jared.hu@nxp.com> - - * sys/kms/gstkmssink.c: - kmssink: add can-scale property - https://bugzilla.gnome.org/show_bug.cgi?id=784599 - -2017-11-27 20:05:29 +0800 Jun Xie <jun.xie@samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: remove duplicated code - remove duplicated code - https://bugzilla.gnome.org/show_bug.cgi?id=790895 - -2017-11-27 21:27:23 +0800 Jun Xie <jun.xie@samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: fix memory leak - GPtrArray in GstActiveStream is leaked in some cases. - gst_mpdparser_free_active_stream shall be invoked to free GstActiveStream - https://bugzilla.gnome.org/show_bug.cgi?id=790899 - -2017-11-28 13:44:54 +0000 Tim-Philipp Müller <tim@centricular.com> - - * pkgconfig/meson.build: - meson: don't generate or install pkg-config file for gstreamer-wayland - which is not for public consumption currently (headers not installed). - https://bugzilla.gnome.org/show_bug.cgi?id=790912 - -2017-11-27 20:11:23 +1100 Matthew Waters <matthew@centricular.com> - - * common: - Automatic update of common submodule - From 3f4aa96 to e8c7a71 - -2017-11-27 14:44:58 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.m: - * ext/qt/gstqtglutility.cc: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.h: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - gl/caopengllayer: use public GstGLContext instead of Cocoa-specific one - Allows keeping the GstGLCAOpenGLLayer public but not the winsys-specific - context/display/window. - -2017-11-27 14:44:24 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstgldisplay_cocoa.h: - Revert "gl: cocoa: sprinkle some GST_EXPORT" - This reverts commit 94d798c3337013bd902c0fd0a66f7f6842243eeb. - cocoac headers don't need to be public as all the functionality can be - provided by the base class - -2017-11-26 22:36:35 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/cocoa/gstgldisplay_cocoa.h: - gl: cocoa: sprinkle some GST_EXPORT - Undefined symbols for architecture x86_64: - "_gst_gl_context_cocoa_get_type", referenced from: - __create_layer in libgstopengl_la-caopengllayersink.o - Might need some more in other headers, but first need to - clarify what exactly should be exported, there are some - inconsistencies (installed header files vs. funcs in docs). - -2017-11-26 18:35:13 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - autotools: remove check-exports target dep which no longer exists - -2017-11-26 16:32:01 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * win32/MANIFEST: - * win32/common/libgstadaptivedemux.def: - * win32/common/libgstbadaudio.def: - * win32/common/libgstbadbase.def: - * win32/common/libgstbadvideo.def: - * win32/common/libgstbasecamerabinsrc.def: - * win32/common/libgstcodecparsers.def: - * win32/common/libgstinsertbin.def: - * win32/common/libgstisoff.def: - * win32/common/libgstmpegts.def: - * win32/common/libgstphotography.def: - * win32/common/libgstplayer.def: - * win32/common/libgsturidownloader.def: - win32: remove .def file with exports - They're no longer needed, symbol exporting is now explicit - via GST_EXPORT in all cases (autotools, meson, incl. MSVC). - -2017-11-26 16:25:50 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - autotools: stop controlling symbol visibility with -export-symbols-regex - Instead, use -fvisibility=hidden and explicit exports via GST_EXPORT. - This should result in consistent behaviour for the autotools and - Meson builds. - -2017-11-26 16:07:13 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - * win32/common/libgstcodecparsers.def: - codecparsers: mpegvideoparser: remove API that was deprecated 5 years ago - Libraries in -bad are not covered by our API/ABI stability - guarantees, and to the best of our knowledge everyone using - this API has moved to the replacement APIs ages ago. - -2017-11-25 20:06:57 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Add prototype for gst_wayand_pool_get_type() - -2017-11-22 22:27:04 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Rollback video info changes when copying - We change the video info base on the received buffer. We need to - rollback these changes whenever we want to copy into our internal - pool of buffers. - https://bugzilla.gnome.org/show_bug.cgi?id=790057 - -2017-11-21 23:18:24 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlshmallocator.c: - waylandsink: Validate strides and offset when using FD as SHM - As SHM interface only support 1 stride, and 1 offset, we need to - make sure that there is no padding between planes for planar formats. - https://bugzilla.gnome.org/show_bug.cgi?id=790057 - -2017-11-21 23:17:14 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Update video info size to buffer size - We where setting the size to the first memory size, this may be - too small in case we received a buffer with multiple memory. - https://bugzilla.gnome.org/show_bug.cgi?id=790057 - -2017-11-21 23:12:12 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Allocate only what's needed when copying - There was this regression that we'd be using the updated video - info size instead of default size when initializing the pool. - https://bugzilla.gnome.org/show_bug.cgi?id=790057 - -2017-11-21 23:11:02 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Only try SHM for single memory buffer - https://bugzilla.gnome.org/show_bug.cgi?id=790057 - -2017-11-21 23:10:03 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - wlwindow: Only update video info on new render - The sink->video_info might not reflect the current buffer - when expose is being called. - https://bugzilla.gnome.org/show_bug.cgi?id=790057 - -2017-11-20 21:09:28 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Disable video-alignment from the pool - The SHM interface does not allow passing arbitrary strides and offsets, - for this reason, we simply disable this feature from the proposed pool. - This fixes video artifact seen when using the FFMPEG based video - decoder. - https://bugzilla.gnome.org/show_bug.cgi?id=790057 - -2016-10-24 23:02:38 +0200 Havard Graff <havard.graff@gmail.com> - - * ext/opus/gstopusparse.c: - opusparse: fix uninitialized-warning - -2016-01-29 11:46:52 +0100 Stian Selnes <stian@pexip.com> - - * gst/videoparsers/h263parse.c: - h263parse: Add debug log for more annexes when plustype - -2017-11-25 13:10:11 +0100 Edward Hervey <edward@centricular.com> - - * ext/hls/m3u8.c: - hls: Don't leak mutex - -2017-11-25 12:48:40 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Don't leak string - The result of gst_video_colorimetry_to_string () needs to be free'd - -2017-11-25 11:27:57 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/netsim/gstnetsim.c: - netsim: simplify getting buffer size in bits - -2017-10-10 15:45:47 +0200 Håvard Graff <havard.graff@gmail.com> - - * pkgconfig/meson.build: - meson.build: use join_paths() on prefix - So that "/" are correct on Windows and the paths in - the .pc files are like C:/some/where and not - C:\some\where. - -2017-11-25 11:16:28 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/Makefile.am: - tests: ignore waylandsink in state change test - "Unexpected critical/warning: Wayland compositor is missing - the ability to scale, video display may not work properly." - -2016-11-01 16:03:00 +0100 Havard Graff <havard.graff@gmail.com> - - * gst/netsim/gstnetsim.c: - * gst/netsim/gstnetsim.h: - netsim: add "allow-reordering" property - Reordering of packets is not very common in networks, and the delay - functions will always introduce reordering if delay > packet-spacing, - so by setting allow-reordering to FALSE you guarantee that the packets - are in order, while at the same time introducing delay/jitter to them. - -2016-10-03 18:43:24 +0200 Stian Selnes <stian@pexip.com> - - * gst/netsim/gstnetsim.c: - * gst/netsim/gstnetsim.h: - netsim: Add gamma distribution for delay - This simulates the delay on wifi networks better. - -2016-08-02 13:45:54 +0200 Stian Selnes <stian@pexip.com> - - * gst/netsim/gstnetsim.c: - netsim: Change max-delay to be inclusive - It is more intuitive for the user that in order to acheive a constant - delay min-delay and max-delay are equal. - -2016-08-01 20:27:03 +0200 Stian Selnes <stian@pexip.com> - - * gst/netsim/Makefile.am: - * gst/netsim/gstnetsim.c: - * gst/netsim/gstnetsim.h: - * gst/netsim/meson.build: - netsim: Add "delay-distribution" property plus normal distribution - By using the property "delay-distribution" the user can control how the - delay applied to delayed packets is distributed. This is either the - uniform distribution (as before) or the normal distribution. - "min-delay" and "max-delay" control both distributions. For the normal - distribution it defines the bounds of the 95% confidence interval. - -2017-11-23 13:47:48 +0100 Havard Graff <havard.graff@gmail.com> - - * gst/netsim/gstnetsim.c: - * gst/netsim/gstnetsim.h: - netsim: add token bucket algorithm for simulating network congestion - -2017-11-23 13:48:32 +0100 Havard Graff <havard.graff@gmail.com> - - * gst/netsim/gstnetsim.c: - netsim: change property enums to PROP_* and fix indentation - -2017-11-24 22:09:25 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/netsim/gstnetsim.c: - * gst/netsim/gstnetsim.h: - netsim: remove private struct and padding - There's no need for these things, since the plugin headers - are not public, and all the extra ->priv-> just clutter the - code. - -2017-11-25 09:41:00 +0100 Edward Hervey <edward@centricular.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: Handle bitrate > 2**31 - On very-high connection, we could quite well exceed that. Instead use - gint64 for max-bitrate. - -2017-11-24 17:06:22 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/examples/gl/sdl/sdlshare.c: - sdlshare: Destroy GL backend buffer before the GL Context - This was otherwise leading to a deadlock in the GL library. - -2017-11-24 16:58:21 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/examples/gl/sdl/sdlshare2.c: - sdlshare2: Fix race conditions - The client-draw callback is running on the GL Thread, which will - be required to map the buffer. Map early, and pass the mapped - frame instead. On top of that, make sure to signal any pending - draw before trying to push EOS, as some pad locks might be taken. - This is the cost of using the same thread to control GStreamer and - to render GL. - -2017-11-24 16:58:01 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/examples/gl/meson.build: - * tests/examples/gl/sdl/meson.build: - * tests/examples/meson.build: - meson: Build gl/sdl examples - -2017-11-24 15:48:19 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/examples/meson.build: - meson: Playout example has not GL deps - -2017-11-24 15:19:25 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/examples/meson.build: - meson: Add missing examples directory - This will make it more visible what is missing in meson. - -2017-11-24 15:17:02 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/examples/meson.build: - meson: Build playout example - -2017-11-22 14:35:31 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/videoparsers/gsth265parse.c: - h265parse: early set src caps when input not byte-stream - When input is not in byte-stream format there is no need to wait for the first - buffer before setting src caps. We already have all the information from the - input codec_data. - This allow us to already configure downstream elements allowing them, - for example, to already allocate their internal buffers as they know - the format of the input they are about to receive. - Same change as the one I just did in h264parse. - https://bugzilla.gnome.org/show_bug.cgi?id=790709 - -2017-11-22 14:35:31 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: early set src caps when input is avc - When input is in AVC format there is no need to wait for the first buffer - before setting src caps. We already have all the information from the - input codec_data. - This allow us to already configure downstream elements allowing them, - for example, to already allocate their internal buffers as they know - the format of the input they are about to receive. - https://bugzilla.gnome.org/show_bug.cgi?id=790709 - -2017-11-24 08:06:52 +0100 Edward Hervey <edward@centricular.com> - - * sys/uvch264/gstuvch264_src.c: - uvch264src: Check return values of all xu_query calls - And use warnings/returns like for other calls - CID #1373414 - CID #1373417 - -2017-11-24 08:00:21 +0100 Edward Hervey <edward@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - gtk: Fix possibility of NULL variable - It's quite unlikely since it's initialized in instance initialization. - CID #1417721 - -2017-11-24 07:57:49 +0100 Edward Hervey <edward@centricular.com> - - * ext/dc1394/gstdc1394src.c: - dc1394src: Remove logically dead code - buffer would always be NULL in the error case. Simplify and just - return GST_FLOW_ERROR - CID #1417216 - -2017-11-23 23:01:52 +1100 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/viv-fb/gstgldisplay_viv_fb.c: - viv-fb: Don't destroy the native FB display - It causes crashes in applications because the result of - fbGetDisplay() might be in use elsewhere in the application - and Vivante doesn't seem to do any refcounting - -2017-11-23 22:58:40 +1100 Jan Schmidt <jan@centricular.com> - - * ext/qt/gstqtglutility.cc: - * gst-libs/gst/gl/viv-fb/gstgldisplay_viv_fb.c: - * gst-libs/gst/gl/viv-fb/gstgldisplay_viv_fb.h: - * gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.c: - Revert "gl: Use GstGLDisplayEGL directly instead of creating a GstGLDisplayVIVFb subclass" - This reverts commit 47fd4d391e775c11f529705bb0f457a9d25ba5e7. - This patch is incorrect. It doesn't actually compile, and causes a crash - because the viv-fb window implementation needs a native EGL handle - to pass to fbCreateWindow, but the GstGLDisplayEGL handleis actually - an EGLDisplay now (and gets cast to the wrong type) - -2017-11-24 01:37:48 +1100 Jan Schmidt <jan@centricular.com> - - * tests/examples/gl/gtk/3dvideo/main.cpp: - 3dvideo example: Correct video overlay for HiDPI - Use the GTK scaling factor to scale the video allocation - so video displays correctly on hi-dpi screens - -2017-11-23 11:15:49 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/meson.build: - meson: remove outdated comment in build file - -2017-11-23 12:38:11 +0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: keep draining even if a finish_task fails - Should continue draining so that it could try to - discard the rest of pending frames even if a finish_task fails. - https://bugzilla.gnome.org/show_bug.cgi?id=790312 - -2017-11-10 13:32:17 -0600 Mario Alfredo Carrillo Arevalo <mario.alfredo.c.arevalo@intel.com> - - * configure.ac: - opencv: Update version for building plugins - This commit allows to build the OpenCV plugin with OpenCV >= 2.3.0 to < 3.4.0. - https://bugzilla.gnome.org/show_bug.cgi?id=790192 - -2017-11-23 08:14:06 +0100 Edward Hervey <edward@centricular.com> - - * sys/dvb/camswclient.c: - dvb: Fix previous commit - strlen on strings (and not sizeof) *sigh* - -2017-11-23 08:12:03 +0100 Edward Hervey <edward@centricular.com> - - * sys/dvb/camswclient.c: - dvb: Fix sock_addr usage (for real) - It was great checking that the string was not too big ... but - it's better if we actually copy the proper amount of bytes :) - CID #206004 - -2017-11-23 08:09:36 +0100 Edward Hervey <edward@centricular.com> - - * sys/ipcpipeline/gstipcpipelinecomm.c: - ipcpipeline: Don't leak structure - CID #1416131 - -2017-11-23 08:05:48 +0100 Edward Hervey <edward@centricular.com> - - * sys/ipcpipeline/gstipcpipelinecomm.c: - ipcpipeline: Simplify usage of g_cond_wait_until() - It will return FALSE if a timeout happened. So don't check if we - timed out afterwards, just use the return value. - CID #1416347 - -2017-11-23 08:02:58 +0100 Edward Hervey <edward@centricular.com> - - * sys/ipcpipeline/gstipcpipelinesink.c: - ipcpipeline: Check the proper value - The code is meant to check the *peer* state change return value - (and not the sink's one). - CID #1416128 - -2017-11-22 17:37:02 +0100 Piotr Drąg <piotrdrag@gmail.com> - - * po/POTFILES.in: - po: update POTFILES.in - https://bugzilla.gnome.org/show_bug.cgi?id=790716 - -2017-11-22 16:53:17 +0100 Edward Hervey <edward@centricular.com> - - * ext/curl/gstcurlhttpsrc.c: - curlhttpsrc: Don't leak structure - CID #1415716 - -2017-11-06 21:07:51 +0100 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstglstereomix.c: - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst/audiomixer/gstaudiointerleave.c: - * gst/audiomixer/gstaudiomixer.c: - * gst/compositor/compositor.c: - * gst/mxf/mxfmux.c: - aggregator: Remove klass->sinkpads_type - This posed problems for the python bindings (and possibly others). - Instead, subclasses now use add_pad_template_with_gtype. - https://bugzilla.gnome.org/show_bug.cgi?id=789986 - -2017-11-20 17:54:54 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/videoparsers/gsth265parse.c: - h265parse: put downstream caps first if possible on sink caps - Try prioritizing downstream's caps over upstream's if possible so the - parser can configured in "passthrough" if possible and save it from - doing useless conversions. - Exact same change as the one I just did in h264parse. - https://bugzilla.gnome.org/show_bug.cgi?id=790628 - -2017-11-20 17:54:54 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * tests/check/elements/h264parse.c: - h264parse: put downstream caps first if possible on sink caps - Try prioritizing downstream's caps over upstream's if possible so the - parser can configured in "passthrough" if possible and save it from - doing useless conversions. - https://bugzilla.gnome.org/show_bug.cgi?id=790628 - -2017-11-22 11:33:54 +0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkdec.c: - msdkdec: fix buffer leaks during drain and a leak of videobufferpool - https://bugzilla.gnome.org/show_bug.cgi?id=790312 - -2017-11-21 14:57:03 +0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - msdkenc: handle the MORE_DATA case - If the driver requires more data, just unref the frame at the moment - then retreive/finish the frame after encoding is finished. - This also fixes a memory leak. - https://bugzilla.gnome.org/show_bug.cgi?id=790312 - -2017-11-22 10:30:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Print "Starting" instead of "Stopping" when starting - -2017-11-17 17:09:22 +1100 Matthew Waters <matthew@centricular.com> - - * sys/nvdec/gstnvdec.c: - nvdec: implement flush/drain - Fixes outputted frame sequence when performing a seek - i.e. when seeking backwards, the first frame after the seek was a frame - from the future. This would result in GstVideoDecoder essentially - marking all the timestamps as essentially bogus and the base class would - attempt to compensate. A visible indication of this was 'decreasing timestamp' - warning after a seek. - https://bugzilla.gnome.org/show_bug.cgi?id=790478 - -2017-11-21 20:56:38 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/curl/meson.build: - curl: fix meson build - Include libsdir so our i18n header there is found. - -2017-11-21 12:03:38 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Add Raspberry Pi (vc4) support - -2017-11-21 16:43:03 +0100 Edward Hervey <edward@centricular.com> - - * ext/libde265/libde265-dec.c: - de265: Don't leak CodecState - Unref it in error case - CID #1417220 - -2017-11-21 16:39:14 +0100 Edward Hervey <edward@centricular.com> - - * ext/vulkan/vkupload.c: - vulkan: Fix out-of-bound read - G_N_ELEMENTS is the *number* of entries, not the maximum entry number - CID #1417215 - -2017-11-21 16:30:35 +0100 Edward Hervey <edward@centricular.com> - - * ext/curl/gstcurlhttpsrc.c: - curlhttpsrc: Post an error message if no URI was set - Like for other sources - -2017-11-21 16:30:17 +0100 Edward Hervey <edward@centricular.com> - - * ext/curl/gstcurl.c: - * ext/curl/gstcurlhttpsrc.c: - curl: Add i18n - -2017-11-21 15:48:06 +0100 Edward Hervey <edward@centricular.com> - - * tests/check/elements/srtp.c: - tests/srtp: Bump up timeout to 3mins for testcase - This involves generating and processing 65536 packets, let's give it - time to actually complete that. - And a bit of debug to track what's going on. - -2017-11-21 15:33:57 +0100 Edward Hervey <edward@centricular.com> - - * ext/smoothstreaming/gstmssmanifest.c: - smoothstreaming: Handle invalid XML - Nothing guarantees the manifest is valid and will return a root node - -2017-11-21 15:33:08 +0100 Edward Hervey <edward@centricular.com> - - * ext/curl/gstcurlhttpsrc.c: - curlhttpsrc: Fix return value - The function returns a gchar * (and not a boolean) - -2017-11-21 15:31:05 +0100 Edward Hervey <edward@centricular.com> - - * ext/curl/gstcurlhttpsrc.c: - curlhttpsrc: Don't switch to PAUSED if not URI was specified - Like for other sources - -2017-11-20 17:06:07 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst/dvbsuboverlay/dvb-sub.c: - * gst/mxf/mxftypes.c: - all: Fix left-shift undefined behaviour - Cast to the target type before shifting (or use macro if available) - -2017-10-31 10:09:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - msdkh264enc: Implement frame-packing SEI insertion for side-by-side and top-bottom - Ideally this would be supported directly in the Intel MediaSDK but - that's not the case nowadays. - https://bugzilla.gnome.org/show_bug.cgi?id=774920 - -2017-11-17 17:49:16 +0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/msdk.c: - msdkenc: Fix handling of YUY2, UYVY, BGRA surfaces - https://bugzilla.gnome.org/show_bug.cgi?id=789847 - -2017-11-16 11:32:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - * sys/msdk/msdk.c: - msdkenc: Add support for YV12, YUY2, UYVY and BGRA - By doing conversion with VPP to NV12 before the actual encoding. - https://bugzilla.gnome.org/show_bug.cgi?id=789847 - -2017-11-09 12:36:44 +0800 Jun Xie <jun.xie@samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Fix memory leak caused by double buffer map - https://bugzilla.gnome.org/show_bug.cgi?id=789999 - -2017-11-13 23:01:58 +0900 Justin Kim <justin.kim@collabora.com> - - * ext/srt/gstsrt.c: - * ext/srt/gstsrt.h: - * ext/srt/gstsrtbasesink.c: - * ext/srt/gstsrtbasesink.h: - * ext/srt/gstsrtbasesrc.c: - * ext/srt/gstsrtbasesrc.h: - * ext/srt/gstsrtclientsink.c: - * ext/srt/gstsrtclientsrc.c: - * ext/srt/gstsrtserversink.c: - * ext/srt/gstsrtserversrc.c: - srt: add passphrase and key length properties - For stream encryption, both `passphrase` and `key-length` - properties are required. - https://bugzilla.gnome.org/show_bug.cgi?id=790315 - -2017-11-14 18:13:54 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gstavwait.c: - avwait: Deserialised timecodes set after caps event now get correct framerate - A deserialised timecode has a framerate of 0/1 by default. That breaks - it when comparing the frames field with another timecode (incoming from - the frame). We were setting the framerate when receiving the caps event, - but not when setting the timecode in set_property, so it was broken for - timecodes set after the caps event. - Also checking if the fps_n we got from the caps event is != 0 before - setting it - also at the caps event. - https://bugzilla.gnome.org/show_bug.cgi?id=790334 - -2017-11-10 17:21:43 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gstavwait.c: - timecode: Fix incorrect wording in error message - -2017-11-10 17:18:45 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gstavwait.c: - * gst/timecode/gstavwait.h: - avwait: Better handling of deserialised timecode framerates - Now that timecodes support proper serialisation / deserialisation, a - timecode might have an invalid fps_n / fps_d even without using the - target-time-code-string property. Detect those cases and set fps_n/fps_d - properly. - -2017-11-09 12:08:35 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Remove unused "bflags" variable - We are ignoring all its flags anyway, so let's remove it altogether. - -2017-11-09 11:44:17 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Ignore some driver-set timecode flags - The "fields" flag is ignored because currently GStreamer doesn't support - having only top or only bottom fields inside a frame. The "drop frame" - flag is ignored because some occurrences have been spotted where it - wasn't set while it should have been. In practice, when we have 29.97 or - 59.94 FPS, it's always drop-frame. - https://bugzilla.gnome.org/show_bug.cgi?id=790112 - -2017-11-09 00:16:21 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklink.cpp: - decklink: Don't crash when getting hw serial number doesn't return OK - If the return value isn't OK, it means we might be getting data that - points to an invalid memory address. That shouldn't make us crash. - -2017-07-31 14:38:34 +0900 Justin Kim <justin.kim@collabora.com> - - * configure.ac: - * ext/Makefile.am: - * ext/meson.build: - * ext/srt/Makefile.am: - * ext/srt/gstsrt.c: - * ext/srt/gstsrt.h: - * ext/srt/gstsrtbasesink.c: - * ext/srt/gstsrtbasesink.h: - * ext/srt/gstsrtbasesrc.c: - * ext/srt/gstsrtbasesrc.h: - * ext/srt/gstsrtclientsink.c: - * ext/srt/gstsrtclientsink.h: - * ext/srt/gstsrtclientsrc.c: - * ext/srt/gstsrtclientsrc.h: - * ext/srt/gstsrtserversink.c: - * ext/srt/gstsrtserversink.h: - * ext/srt/gstsrtserversrc.c: - * ext/srt/gstsrtserversrc.h: - * ext/srt/meson.build: - srt: Introduce SRT source and sink - SRT0 is an open source transport technology1 that optimizes - streaming performance across unpredictable networks. - Although SRT is based on UDP, it works like connection-oriented - protocol. However, it doesn't mean that the SRT server or client - is necessarily to link to a receiver or a sender so, here, the - pairs of source and sink elements are introduced. - - srtserversink: SRT server to feed SRT stream - - srtclientsrc: SRT client to get SRT stream from srtserversink - - srtclientsink: SRT client to send SRT stream - - srtserversrc: SRT server to listen from srtclientsink - 0 https://github.com/Haivision/srt - 1 http://www.srtalliance.org/ - https://bugzilla.gnome.org/show_bug.cgi?id=785730 - -2017-11-07 21:12:42 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - Revert "decklink: Detect gaps on incoming stream times, issue warnings" - This reverts commit c1294e10f99adf04a104397da735904634400464. - Was not ready to be pushed yet. - -2017-11-07 21:12:36 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstjitterer.c: - * gst/debugutils/gstjitterer.h: - * gst/debugutils/meson.build: - Revert "debugutils: Added new jitterer element" - This reverts commit 595254f21b15702d95d5a7cf6e43d29f9c179f43. - Was not ready to be pushed yet. - -2017-11-07 21:12:32 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * configure.ac: - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - Revert "timecodestamper: LTC from audio" - This reverts commit c01afab9f7fa7e822dea38e358e92163e8d36282. - Was not ready to be pushed yet - -2017-11-07 21:12:25 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - Revert "timecodestamper: Modify ltc-add to tc-add" - This reverts commit 6552981b795a024d26bf509893d55970c2294c04. - Was not ready to be pushed yet - -2017-11-07 21:03:22 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gstavwait.c: - avwait: Fix crash when explicitly setting end_tc to NULL - If end_tc is NULL, it means that we don't want avwait to stop at any - timecode. When explicitly setting end_tc to NULL, there is no point in - comparing end_tc with start_tc (to see if we'll reject end_tc for being - before start_tc), so the check in question is completely disabled - instead of letting it crash. - -2017-10-02 18:39:49 +0200 Georg Lippitsch <glippitsch@toolsonair.com> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: Modify ltc-add to tc-add - It is more general now and also adds TC to internal counter - -2017-06-13 13:19:19 +0300 Georg Lippitsch <glippitsch@toolsonair.com> - - * configure.ac: - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: LTC from audio - Add support for parsing linear time code from - an audio source using libltc - https://github.com/x42/libltc - The user can now choose between 3 different and independently - running timecode sources. The old override-existing property - has been replaced by timecode-source. - https://bugzilla.gnome.org/show_bug.cgi?id=784295 - -2017-09-06 13:16:21 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstjitterer.c: - * gst/debugutils/gstjitterer.h: - * gst/debugutils/meson.build: - debugutils: Added new jitterer element - This element can be configured to add jitter and/or drift to incoming - buffers' PTS, DTS, or both. Amplitude and average of jitter and drift - are configurable. - https://bugzilla.gnome.org/show_bug.cgi?id=787358 - -2017-04-26 19:05:21 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink: Detect gaps on incoming stream times, issue warnings - When we receive a video or audio buffer, we calculate the next stream - time based on the current stream time + buffer duration. If the next - buffer's stream time is after that, we issue a warning. - This happens because the stream time incoming from Decklink should be - really constant and without gaps. If there is a gap, it means that - something went wrong, e.g. the internal buffer pool is empty (too many - buffers queued up downstream). - https://bugzilla.gnome.org/show_bug.cgi?id=781776 - -2017-11-07 15:21:43 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/Makefile.am: - * tests/check/libs/gstglshader.c: - * tests/check/libs/gstglslstage.c: - gl/tests: add some simple shader testing - Making sure that the default shaders compile and are usable - -2017-11-07 12:39:58 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltestsrc.c: - gltestsrc: guard stop in gl thread - So we don't result in a critical when we've never created the GL context: - gst_gl_context_thread_add: assertion 'GST_IS_GL_CONTEXT (context)' failed - -2017-11-07 00:07:42 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasefilter.c: - glbasefilter: actually indicate start internally - Otherwise when we stop, the necessary stop functions will not be called - and things may be leaked. - https://bugzilla.gnome.org/show_bug.cgi?id=788280 - -2017-11-06 23:19:15 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltestsrc.c: - gltestsrc: free in the GL thread on stop - Calling GL functions not on the GL thread may crash in some GL - implementations. - https://bugzilla.gnome.org/show_bug.cgi?id=789665 - -2017-11-03 10:55:28 +0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/gstmsdkvp8dec.c: - msdk: fix to build msdkvp8dec with mfx_dispatch - https://bugzilla.gnome.org/show_bug.cgi?id=789751 - -2017-11-04 07:49:24 +0100 Edward Hervey <edward@centricular.com> - - * sys/dvb/camswclient.c: - dvb: Fix sockaddr_un usage - The sun_path field needs to be NULL-terminated - CID #206004 - -2017-11-02 18:32:55 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: add doc blurb for gst_aggregator_pad_is_eos() - -2017-11-02 16:05:12 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.h: - aggregator: also remove now-unused PadForeachFunc declaration - https://bugzilla.gnome.org/show_bug.cgi?id=785679 - -2017-08-02 12:08:26 -0400 Olivier Crête <olivier.crete@collabora.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * win32/common/libgstbadbase.def: - aggregator: Remove pad iterator function - Use new gst_element_foreach_sink_pad() from core instead. - https://bugzilla.gnome.org/show_bug.cgi?id=785679 - -2017-11-02 12:46:26 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: use new gst_element_foreach_sink_pad() - Instead of gst_aggregator_iterate_sinkpads() which will - soon be removed. - https://bugzilla.gnome.org/show_bug.cgi?id=785679 - -2017-11-02 12:46:26 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: use new gst_element_foreach_sink_pad() - Instead of gst_aggregator_iterate_sinkpads() which will - soon be removed. - https://bugzilla.gnome.org/show_bug.cgi?id=785679 - -2017-11-02 12:56:57 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.h: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - videoaggregator: add CAST macros - -2017-11-02 12:46:26 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: use new gst_element_foreach_sink_pad() - Instead of gst_aggregator_iterate_sinkpads() which will - soon be removed. - https://bugzilla.gnome.org/show_bug.cgi?id=785679 - -2017-11-02 12:17:38 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstglvideomixer.c: - gl: use new gst_element_foreach_sink_pad() - Instead of gst_aggregator_iterate_sinkpads() which will - soon be removed. - https://bugzilla.gnome.org/show_bug.cgi?id=785679 - -2017-11-02 11:57:24 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - * gst/compositor/compositor.c: - videoaggregator: drop ABI compat in padding for new struct member - Don't really have to do that while it's in -bad and most users - are in-tree anyway. - -2017-10-23 22:03:22 +0200 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/audio/gstaudioaggregator.h: - audioaggregator: make class padding larger - -2017-11-01 15:18:08 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: add more comments - -2017-10-30 15:06:32 +0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkvp8dec.c: - * sys/msdk/gstmsdkvp8dec.h: - * sys/msdk/meson.build: - msdk: adds msdkvp8dec - https://bugzilla.gnome.org/show_bug.cgi?id=789751 - -2017-10-30 18:17:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdkh265dec.c: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkmjpegdec.c: - * sys/msdk/gstmsdkmjpegenc.c: - * sys/msdk/gstmsdkvp8enc.c: - * sys/msdk/msdk.h: - msdk: Allow building against mfx_dispatcher - E.g. from https://github.com/lu-zero/mfx_dispatch - -2017-09-22 14:27:51 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: destroy and create the GL context on start()/stop() - Removes a reference count loop - -2017-10-23 10:42:51 +0200 Nicola Murino <nicola.murino@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: flush decoder on stop - fix a memory leak if the decoder shut down before EOS - https://bugzilla.gnome.org/show_bug.cgi?id=787311 - -2017-10-23 10:40:43 +0200 Nicola Murino <nicola.murino@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: flush encoder on stop - https://bugzilla.gnome.org/show_bug.cgi?id=787311 - -2017-10-28 21:34:08 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - gl/shader: allow setting non-square matrices as uniforms on gles platforms - It is possible with GLES3 - -2017-10-28 18:33:44 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglquery.c: - * tests/check/libs/gstglquery.c: - gl/query: split tests and fix some corresponding issues in usage - -2017-10-14 13:22:18 -0700 Thiago Santos <thiagossantos@gmail.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: add replaced flag to not error out on bitrate change - When switching bitrates we set the old streams as cancelled, but it - could also be confused with a cancel due to other reasons (as an error) - and it would lead the element to stop the pipeline mistankely. This - would happen when the stream being replaced was waiting for a manifest - update on live. Ss make it sure that we are stopping for switching - bitrates to avoid erroring out. - https://bugzilla.gnome.org/show_bug.cgi?id=789457 - -2017-10-25 16:11:58 +0200 Florent Thiéry <florent.thiery@ubicast.eu> - - * configure.ac: - configure.ac: fix fdk-aac version check - https://bugzilla.gnome.org/show_bug.cgi?id=789471 - -2017-10-25 14:35:12 +0200 Mathieu Duponchelle <mathieu@centricular.com> - - * ext/fdkaac/meson.build: - fdkaacenc: check fdk-aac version in meson.build - configure.ac used to set -DHAVE_FDK_AAC_0_1_4 , which enables - 7.1 support. - https://bugzilla.gnome.org/show_bug.cgi?id=789471 - -2017-10-24 16:17:28 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/timecode/gstavwait.c: - * gst/timecode/gstavwait.h: - avwait: Added end-timecode property - avwait can now be configured to stop when a given timecode has been - reached. It will start at the timecode indicated with start-timecode and - end at the timecode indicated with end-timecode. If end-timecode is - NULL (default), the previous functionality is preserved: keep going and - not end. - https://bugzilla.gnome.org/show_bug.cgi?id=789403 - -2017-10-23 11:52:38 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/elements/audiomixer.c: - * tests/check/libs/aggregator.c: - tests: comment and logging cleanups for audiomixer and aggregator - Remove some references to 'collectpads'. Logs pads through the object variants. - Add some more comments. Remove a left over comment. - -2017-10-22 19:43:17 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - * gst/audiomixer/gstaudiomixer.c: - aggregator: fix type for latency property (int64 -> GStClockTime) - The value is used as GstClockTiem in the code. Adapt the hack^H^H^H^Hcode - in live-adder. - -2017-07-13 19:09:43 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: Accept buffer with no data, but duration and gap flag - These are produced from GAP events by the base class. - https://bugzilla.gnome.org/show_bug.cgi?id=784846 - -2017-07-13 19:03:19 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Don't take flush lock from output thread - Instead just take it in the chain function. - https://bugzilla.gnome.org/show_bug.cgi?id=784911 - -2017-07-13 18:38:34 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Don't block if adding to the tail of the queue - If we're adding to the tail of the queue, it's because we're converting - a gap event, so don't block there it means we're calling from the output - thread. - https://bugzilla.gnome.org/show_bug.cgi?id=784911 - -2017-10-20 11:44:50 +0200 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * configure.ac: - * ext/openjpeg/gstopenjpeg.h: - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegenc.c: - * ext/openjpeg/meson.build: - openjpeg: Remove compatibility with openjpeg 2.0 - Everyone seems to be shipping 2.1 as the oldest v2 version, even debian - oldstable (jessie). - Also remove an unneeded (debug?) #include <stdio.h>. - https://bugzilla.gnome.org/show_bug.cgi?id=788703 - -2017-10-19 16:36:17 +0200 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * configure.ac: - * ext/openjpeg/gstopenjpeg.h: - * ext/openjpeg/meson.build: - openjpeg: Support building with openjpeg 2.3, simpler - OpenJPEG 2.3 installs its headers to /usr/include/openjpeg-2.3. However, - since libopenjp2.pc seems to provide the right includedir CFLAGS at - least since version 2.1, instead of adding yet another version check, - just remove the subdir and the check for 2.2. - https://bugzilla.gnome.org/show_bug.cgi?id=788703 - -2017-10-19 16:26:45 +0200 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * configure.ac: - * ext/openjpeg/gstopenjpeg.h: - * ext/openjpeg/meson.build: - Revert "openjpeg: Support building with openjpeg 2.3" - This reverts commit ef4d6b93e6078b7056c51a928f5620b13e55e323. - A better fix follows. - https://bugzilla.gnome.org/show_bug.cgi?id=788703 - -2017-10-20 10:32:23 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/pipelines/ipcpipeline.c: - ipcpipeline: work around gcc bug in struct initializers - Unfortunately we need to use an extra set of parenthesis for each data level. - For details see: - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119 - Affected versions are e.g. - gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 - which is the default on ubuntu-trusty. I looks like the fix was never - backported. - -2017-09-27 11:37:26 +0200 Nicola Murino <nicola.murino@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: fix memory leak - finish encoding and clean buffers queue on flush. This avoid a memory leak - if the element shuts down before EOS - https://bugzilla.gnome.org/show_bug.cgi?id=787311 - -2017-10-01 19:04:15 +0200 Jérôme Laheurte <jerome@jeromelaheurte.net> - - * gst-libs/gst/gl/cocoa/gstgldisplay_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * tests/examples/avsamplesink/main.m: - * tests/examples/gl/cocoa/cocoa-videooverlay.m: - Use value instead of version macro when testing for mac OS version - https://bugzilla.gnome.org/show_bug.cgi?id=788404 - -2017-10-19 16:01:46 +0200 Andreas Frisch <fraxinas@dreambox.guru> - - * configure.ac: - * ext/Makefile.am: - * ext/colormanagement/Makefile.am: - * ext/colormanagement/gstcolormanagement.c: - * ext/colormanagement/gstlcms.c: - * ext/colormanagement/gstlcms.h: - lcms: Add LCMS ICC color correction element - https://bugzilla.gnome.org/show_bug.cgi?id=765927 - -2017-09-27 09:17:07 +0200 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/hls/m3u8.c: - m3u8: Refine sequence update debug messages - Actually give some details about why it failed. - https://bugzilla.gnome.org/show_bug.cgi?id=788417 - -2017-09-27 09:27:12 +0200 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/hls/m3u8.c: - m3u8: Don't try to match URIs when we have media sequences - It is legal for a stream to reuse segments (marking discontinuities as - needed). Uplynk delivers such playlists for their placeholder loops. - Leave the URI scanning in place for playlists which have no - EXT-X-MEDIA-SEQUENCE tag. This should be harmless since the spec - requires these playlists to not be missing segments (RFC8216 6.2.2), - so we should be always matching on the first segment. - https://bugzilla.gnome.org/show_bug.cgi?id=788417 - -2017-09-27 09:39:02 +0200 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/hls/m3u8.c: - m3u8: Ignore empty playlists in check_media_seqnums - Let these error in the immediately following check in gst_m3u8_update. - https://bugzilla.gnome.org/show_bug.cgi?id=788417 - -2017-09-15 08:57:03 +0200 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/hls/m3u8.c: - m3u8: Split gst_m3u8_update_check_consistent_media_seqnums - The function was basically one big if-else. Move the branch to the - one caller. - Currently, it's never called with previous_files == NULL. Assert that - this continues. - https://bugzilla.gnome.org/show_bug.cgi?id=788417 - -2017-09-15 08:42:49 +0200 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * ext/hls/m3u8.c: - m3u8: Simplify control flow for sequence update - Split the tail from the rest of the loop. - https://bugzilla.gnome.org/show_bug.cgi?id=788417 - -2017-10-04 13:53:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Add read-only property to read the device serial number - https://bugzilla.gnome.org/show_bug.cgi?id=788510 - -2017-10-17 08:03:02 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: review code related to time level - Add a comment for when the state matters. Use a local var for priv in - update_time_level() to improve readability. Move the our_latency local - var below the query results checks. - -2017-10-17 07:51:51 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: init latency values with 0 instead of FALSE - -2017-10-09 18:08:47 +0200 Michał Górny <mgorny@gentoo.org> - - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstcvsmooth.h: - opencv: Support smoothing only part of the image - https://bugzilla.gnome.org/show_bug.cgi?id=788567 - -2017-10-11 22:03:24 +0200 Michał Górny <mgorny@gentoo.org> - - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstcvsmooth.h: - opencv: Add 'kernel' prefix to width/height - Rename width to kernel-width, and height to kernel-height to avoid - ambiguity in the name. - https://bugzilla.gnome.org/show_bug.cgi?id=788567 - -2017-10-16 10:43:28 +0200 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * configure.ac: - * ext/openjpeg/gstopenjpeg.h: - * ext/openjpeg/meson.build: - openjpeg: Support building with openjpeg 2.3 - And avoid failling the build each time openjpeg releases a new version. - -2017-10-15 20:46:09 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: code cleanup for event and query func - Only look up klass for non serialized events/queries. For events remove - superfluous assignment for the return value in the flushing case. - -2017-10-15 17:46:45 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: simplify pad_event_func for FLUSH_STOP events - We want to skip serialization for FLUSH_STOP events (apparently). We can - simplify the code to add it to the top-level conditions. There was nothing - done in the first code path if the event was FLUSH_STOP. - -2017-10-15 16:57:13 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: drop special casing for eos - Just queue it like any other serialized event. This way we don't need to - check if there still are buffers in the queue. - Validated with the tests and gst-launch-1.0 pipelines. - -2017-10-15 16:51:21 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: add a doc-blob for the event_func - -2017-10-15 16:48:21 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: rename a local variable - The variable tracks wheter the queue is not empty, but num_buffers==0. That - means we have events or queries to process. Rename accordingly. - -2017-10-15 12:17:42 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: remove commented code - The SEGMENT_DONE event does not require any special treatment. This is - commented out in 6efc106a67. - -2017-10-15 12:14:28 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: move the comment for the locks to the lock macros - Looks like some code was inserted afterwards. - -2017-10-15 10:44:44 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: improve section docs - Mention how data ends up in the queues. Document the relation of the pad - functions and the class vmethods to get events and queries. - -2017-10-15 10:29:20 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: improve readability in offset calculation - Don't reuse the offset variables will contain a sample offset for an - intermediate time value. Instead add a segment_pos variable of type - GstClockTime for this. Use The clock-time macros to check if we got - a valid time. - -2017-10-14 18:18:44 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/libs/aggregator.c: - aggregator: add two more tests for a sequence of data - This verifies that we handle events and queries at the head of the queue and - then buffers. - -2017-10-14 13:26:02 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/libs/aggregator.c: - aggregator: refactor the test helper - Make the test helpers use a queue. This lets us also test sequences of events, - queries and data. - -2017-10-14 12:08:19 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/libs/aggregator.c: - aggregator: test cleanup - Remove gst_init() from a few tests. Use _OBJECT variants in logging. Remove - arbitrary extra blank lines. Make push_event() more like push_buffer() - set - the event to NULL and add cleanup to _chain_data_clear(). - -2017-10-05 20:48:59 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: move comment to the place it is meant to be - This probably got shifted after some changes. - -2017-10-07 14:57:44 +0530 Ponnam Srinivas <p.srinivas@samsung.com> - - * sys/nvenc/gstnvbaseenc.c: - nvbaseenc: Fix Memory leak in error case - https://bugzilla.gnome.org/show_bug.cgi?id=788243 - -2017-10-13 12:25:22 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/qt/qtplugin.pro: - qt: update qmake .pro file - Update for renaming of plugin file, and add some - missing source files. - -2017-10-13 11:46:09 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: use GstFlowReturn for flow returns - -2017-10-10 18:03:15 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Print one "dropped N old frames" message, not one per frame - If we drop many frames at once, printing one message per video frame and - one per audio packet would cause a lot of disk IO. Just print a total at - the end. - https://bugzilla.gnome.org/show_bug.cgi?id=788780 - -2017-10-06 15:07:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Fix crash on NULL dmabuf allocator pointer - Now that we are doing lazy allocation, we may endup calling _stop() - before the allocator was created. As a side effect, we need to nul-check - the pointer before calling it's method (_clear_cache()). - https://bugzilla.gnome.org/show_bug.cgi?id=787593 - -2017-10-04 16:29:52 +0530 Ponnam Srinivas <p.srinivas@samsung.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Fix memory leak in error case - https://bugzilla.gnome.org/show_bug.cgi?id=788508 - -2017-10-05 17:28:30 -0700 U. Artie Eoff <ullysses.a.eoff@intel.com> - - * sys/kms/gstkmsallocator.c: - kms: Fix compilation error when libdrm < 2.4.68 - DRM_RDWR was not defined until libdrm 2.4.68. However, - in configure.ac we only require libdrm >= 2.4.55. - Seems silly to to bump minimum libdrm version for a simple - define. Thus, define DRM_RDWR if it's not defined. - This fixes compilation error introduced in: - commit 922031b0f98bf5c7b01f4431d1c08617f65865f7 - Author: Nicolas Dufresne <nicolas.dufresne@collabora.com> - Date: Tue Sep 12 12:07:13 2017 -0400 - kms: Export DMABuf from Dumb buffer when possible - https://bugzilla.gnome.org/show_bug.cgi?id=787593 - Signed-off-by: U. Artie Eoff <ullysses.a.eoff@intel.com> - -2017-10-05 15:46:20 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsallocator.c: - kmsallocator: Update GstVideoInfo.size when extrapolating - When we guess the strides, we need to also update the GstVideoInfo.size - otherwise the memory size will be set to something smaller then needed. - This was causing crash with the DMABuf exportation, since we would not - mmap() a large enough buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=787593 - -2017-09-12 12:07:13 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsallocator.c: - * sys/kms/gstkmsallocator.h: - * sys/kms/gstkmsbufferpool.c: - * sys/kms/gstkmsbufferpool.h: - * sys/kms/gstkmssink.c: - kms: Export DMABuf from Dumb buffer when possible - https://bugzilla.gnome.org/show_bug.cgi?id=787593 - -2017-09-12 10:36:51 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsallocator.c: - * sys/kms/gstkmsallocator.h: - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: Move the mem cache into the allocator - No functional change, the cache will be later reused by the buffer - pool to keep track of the kmssink memory when exporting dmabuf. - https://bugzilla.gnome.org/show_bug.cgi?id=787593 - -2017-09-11 16:32:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsbufferpool.c: - kmsbufferpool: Don't check allocator pointer twice - https://bugzilla.gnome.org/show_bug.cgi?id=787593 - -2017-09-11 16:32:15 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsbufferpool.c: - kmsbufferpool: Removed unused member fd - https://bugzilla.gnome.org/show_bug.cgi?id=787593 - -2017-09-11 15:00:53 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: Check if we can prime export - This will be used later to decide if a DMABuf allocator should be - exposed. - https://bugzilla.gnome.org/show_bug.cgi?id=787593 - -2017-10-05 17:54:34 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: remove buffer!=NULL check - Acording to the logic this cannot happen (we already check this before). So - add a assert like we do above and remove the check. This make it clearer that - we check for the offset range. - Also remove a dead assignment since we reassign this a few lines below. - -2017-10-05 17:52:37 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggreator: update docs - Remove wrote references to collectpads. Document the units. - -2017-10-04 14:29:20 +0200 Havard Graff <havard.graff@gmail.com> - - * gst-libs/gst/adaptivedemux/meson.build: - * gst-libs/gst/audio/meson.build: - * gst-libs/gst/base/meson.build: - * gst-libs/gst/basecamerabinsrc/meson.build: - * gst-libs/gst/codecparsers/meson.build: - * gst-libs/gst/insertbin/meson.build: - * gst-libs/gst/interfaces/meson.build: - * gst-libs/gst/isoff/meson.build: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/player/meson.build: - * gst-libs/gst/uridownloader/meson.build: - * gst-libs/gst/video/meson.build: - * meson.build: - meson: remove vs_module_defs - The GST_EXPORT should handle it. - -2017-10-05 14:30:43 +0200 Rico Tzschichholz <ricotz@ubuntu.com> - - * gst-libs/gst/insertbin/meson.build: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/player/meson.build: - meson: Fix namespace and add some missing args in the gir generation - -2017-10-05 08:11:29 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: pass blocksize to mix_buffer() - No need to recalc the value twice per run. Establishes that it is the same - value. - -2017-10-05 08:12:45 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: rename _fill_buffer() to _queue_new_buffer() - It does not fill a buffer. Rename it and add a short comment. - -2017-10-03 12:36:10 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: cleanup event forwarding - Don't copy the whole event struct. Set the input params when we call the - forwarding helper. Initialize the internal fields and return values in the - helper. - -2017-10-03 12:08:42 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: simplify src_event - Avoid extra ref/unref, we have a ref and do_seek unrefs. Just return the result - as we have. This lets us remove the local var plus the label. - -2017-10-04 10:00:48 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/examples/mpegts/meson.build: - * tests/examples/mpegts/ts-parser.c: - meson: Define GST_USE_UNSTABLE_API in the build system - This way meson and autotools both do the same thing and we don't need to - modify the code after all. - -2017-10-03 15:26:34 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * tests/examples/mpegts/ts-parser.c: - Fix autotools build broken by 25dee2f2cb21d3fdd - Build fails on GST_USE_UNSTABLE_API being redefined - -2017-10-02 14:28:26 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/videosignal/gstsimplevideomarkdetect.c: - * gst/videosignal/gstvideoanalyse.c: - * tests/check/elements/adaptive_demux_engine.h: - Use proper GtkDoc notation for NULL/FALSE/TRUE - -2017-09-26 16:46:10 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: fix typos - -2017-10-03 17:16:15 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/examples/meson.build: - * tests/examples/mpegts/meson.build: - meson: Build tsparser example - -2017-10-03 17:14:53 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/examples/mpegts/ts-parser.c: - tsparses: Define GST_USE_UNSTABLE_API - This example is entirely based on unstable API, this avoids the expected - compilation warning. - -2017-10-02 12:35:48 -0700 Cassandra Rommel <cassandra.rommel@gmail.com> - - * ext/qt/gstqtglutility.cc: - * gst-libs/gst/gl/viv-fb/gstgldisplay_viv_fb.c: - * gst-libs/gst/gl/viv-fb/gstgldisplay_viv_fb.h: - * gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.c: - gl: Use GstGLDisplayEGL directly instead of creating a GstGLDisplayVIVFb subclass - This simplifies the code a lot without any functional changes apart from - not closing the display connection. Closing the display connection is - not safe to do as it is shared between all other code in the same - process and no reference counting or anything happens at the platform - layer. - -2017-10-02 16:57:21 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: reduce variable scope - This is a non-functional change that makes the code more alike to the previous - check. I should be more obvious when we drop a buffer. - -2017-10-02 09:40:50 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: update comment for aggregate - Replace collect-pads left-over. Remove first paragraph, we're not doing this. - Remove 3), 4) since this is not per pad. - -2017-10-02 16:22:26 +0900 Justin Kim <justin.kim@collabora.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - glcontext_egl: Add gstglwindow header - Otherwise, compiler complains implicit function declaration warning. - https://bugzilla.gnome.org/show_bug.cgi?id=788413 - -2017-09-12 16:43:26 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Drain pending samples if the caps are changing - https://bugzilla.gnome.org/show_bug.cgi?id=787560 - -2017-09-12 16:41:18 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - * gst/audiobuffersplit/gstaudiobuffersplit.h: - audiobuffersplit: Use new GstAudioStreamAlign API - https://bugzilla.gnome.org/show_bug.cgi?id=787560 - -2017-09-28 16:20:53 +0530 Ponnam Srinivas <p.srinivas@samsung.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: Unmap video frame in error case - https://bugzilla.gnome.org/show_bug.cgi?id=788194 - -2017-09-28 13:55:18 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkaudio/videosrc: Put hardware reference timestamp in a reference timestamp meta - This can be useful to know on multi-channel cards which frames from - different channels were captured at the same time. - -2017-09-25 17:20:58 +0530 Ponnam Srinivas <p.srinivas@samsung.com> - - * ext/gl/gstglmixer.c: - glmixer: Unmap video frame in error case - https://bugzilla.gnome.org/show_bug.cgi?id=788127 - -2017-09-21 18:13:19 +0530 Ponnam Srinivas <p.srinivas@samsung.com> - - * ext/webp/gstwebpenc.c: - webpenc: Unmap video frame in failed case - https://bugzilla.gnome.org/show_bug.cgi?id=787985 - -2017-09-22 08:10:44 +0100 James Stevenson <james@stev.org> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Fix two memory leaks on error conditions - Both the sink_chain and sink_chain_list will neither pass - or free the buffer if the internal src pad doesn't exist yet. - https://bugzilla.gnome.org/show_bug.cgi?id=788035 - -2017-09-21 14:40:06 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Free the correct memory in our own buffer pool - The buffer itself is 128 bytes into the allocated memory area, to be - able to store the size and other metadata before it. Freeing the buffer - directly will make malloc moderately unhappy. - -2017-09-21 11:46:22 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * tests/check/Makefile.am: - tests/check: disable all ipcpipeline tests until I find a way to make them run reliably - -2017-09-20 20:00:03 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - glvidemixer: need reconfigure output gemotry after caps renegotiated - -2017-09-21 11:59:22 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - Revert "glvideomixer: need update output geometry after src caps reconfigure" - This reverts commit d6e538dc5651fb03c85d7c7614bcf6c689f2db2f. - -2017-09-18 15:42:00 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - glvideomixer: need update output geometry after src caps reconfigure - Need update output geometry when sink caps changed and use - gst_structure_set to update caps if structure is fixed - https://bugzilla.gnome.org/show_bug.cgi?id=787820 - -2017-09-19 15:37:42 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/ttmlparse.c: - ttmlparse: Ensure default showBackground behaviour is enacted - Ensure that region backgrounds are always show when tts:showBackground - is not explicitly set, in accordance with the default behavour given in - the TTML spec. - https://bugzilla.gnome.org/show_bug.cgi?id=787942 - -2017-09-19 17:18:48 -0700 Per-Erik Brodin <per-erik.brodin@ericsson.com> - - * sys/nvdec/gstnvdec.c: - nvdec: Correctly set the discontinuity flag - Instead of clearing the "valid timestamp" flag, which would result in a - timestamp mismatch after a discontinuity. - https://bugzilla.gnome.org/show_bug.cgi?id=787926 - -2017-09-11 16:00:24 +0800 Haihua Hu <jared.hu@nxp.com> - - * gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.c: - gl/viv-fb: transform screen coordinate to viewport coordinate - In y direction, screen coordinate are opposite to viewport coordinate. - https://bugzilla.gnome.org/show_bug.cgi?id=787394 - -2017-09-11 15:12:53 +0800 Haihua Hu <jared.hu@nxp.com> - - * gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.c: - gl/viv-fb: fix wrong pos (x,y) calculate in queue_resize - queue_resize viewport coordinate calculate is wrong and - force queue_resize when do _set_render_rectangle in case - user input pos changed - https://bugzilla.gnome.org/show_bug.cgi?id=787394 - -2017-09-11 16:11:19 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/gl/gstglimagesink.c: - glimagesink: expose should do redisplay all the time - when using internal window, window resize should work - when pause state, but expose only do redisplay when - window_id is valid. So expose should do redisplay all - the time. - https://bugzilla.gnome.org/show_bug.cgi?id=787394 - -2017-09-17 21:05:03 -0700 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: fix typo in comment - -2017-09-17 12:37:03 -0700 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: register func for do_events_and_queries - This fixes logging the func ptr from _iterate_sinkpads(). - -2017-09-17 12:30:37 -0700 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: only set clipped_buffer to NULL if needed - -2017-09-17 12:25:37 -0700 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: rename check_events - This function also handles queries. Update the code to loop until all events and - queuries are handled. - -2017-09-17 12:24:54 -0700 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: add a few more comments to PadPrivate struct - -2017-09-17 11:39:12 -0700 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: rename buffers field to data - The queue stores buffers, events and queries. - -2017-09-17 10:18:56 -0700 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: documentaion fixes - Fix typos and remove params docs, where the param was moved. - -2017-09-10 20:55:07 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/elements/audiomixer.c: - tests: simplify audiomixer test - Use _link_many() and reuse a helper to reduce the test code. - -2017-09-15 20:34:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: fix caps leak in error code path - https://bugzilla.gnome.org/show_bug.cgi?id=787736 - -2017-09-15 15:04:02 +0200 Philippe Renon <philippe_renon@yahoo.fr> - - * gst-libs/gst/player/gstplayer.c: - player: introduce helper method to remove seek source - this incidentally fixes a missing g_source_destroy() call in _main() - https://bugzilla.gnome.org/show_bug.cgi?id=787727 - -2017-09-15 14:58:56 +0200 Philippe Renon <philippe_renon@yahoo.fr> - - * gst-libs/gst/player/gstplayer.c: - player: remove duplicate state_ret check in play internal - https://bugzilla.gnome.org/show_bug.cgi?id=787727 - -2017-09-06 07:59:56 +0000 Jochen Henneberg <jh@henneberg-systemdesign.com> - - * ext/qt/qtitem.cc: - * ext/qt/qtitem.h: - qmlglsink: Expose itemInitialized as property - Instead of just signalling when ready exposing the state - as a property allows us to bind at any time if player is - loaded async. - -2017-09-08 10:16:12 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Don't leak the dumb buffer on drain - -2017-09-08 09:28:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Don't assume buffer pool won't touch buf pointer - Just for extra safety, let's not assume that gst_buffer_pool_acquire() - won't ever touch the buf pointer. - -2017-09-08 14:57:06 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * sys/kms/gstkmsbufferpool.c: - kms: fix crash if bo allocation failed when copying to dumb buffer - If bo allocation failed we destroy the buffer and return GST_FLOW_ERROR, - but the @buffer pointer was still pointing to the address of the - destroyed buffer. gst_kms_sink_copy_to_dumb_buffer() was then trying to - unref it when bailing out causing a crash. - Leave @buffer untouched if allocation failed to fix the crash. - Also remove the check on *buffer being not NULL as gst_buffer_new() - will abort if it failed. - https://bugzilla.gnome.org/show_bug.cgi?id=787442 - -2017-09-07 09:39:13 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/qt/gstplugin.cc: - * ext/qt/qtplugin.pro: - qt: fix build with qmake - Move the package defines for GST_PLUGIN_DEFINE from the - command line into the source file to avoid quoting issues - (-DPACKAGE_NAME="foo" means the quotes won't actually make - it to the compiler and then it no longer gets a string constant). - -2017-09-06 16:04:49 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * ext/directfb/dfbvideosink.c: - dfbvideosink: Pass the VideoInfo to gst_video_info_from_caps - Fixing the build - -2017-09-05 16:20:44 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/directfb/dfbvideosink.c: - * ext/gl/caopengllayersink.m: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglmixer.c: - * ext/gtk/gstgtkglsink.c: - * ext/qt/gstqtsink.cc: - * ext/vulkan/vkupload.c: - * ext/wayland/gstwaylandsink.c: - * gst-libs/gst/gl/gstglfilter.c: - * sys/applemedia/avsamplevideosink.m: - * sys/d3dvideosink/d3dvideosink.c: - * sys/kms/gstkmssink.c: - Request minimum buffer even if need_pool is FALSE - When tee is used, it will not request a pool, but still it wants to - know how many buffers are required. - https://bugzilla.gnome.org/show_bug.cgi?id=730758 - -2017-09-05 15:07:03 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: fix compilation with OpenSSL 1.1.0 - OpenSSL 1.1.0 no longer allows stack-allocated structures; - it hides the implementation behind typedefs - https://bugzilla.gnome.org/show_bug.cgi?id=787309 - -2017-09-05 14:26:52 +0200 Edward Hervey <edward@centricular.com> - - * tests/check/libs/aggregator.c: - check: Fix usage of dual probes - Using two (or more) probes on the same pad where one of the probe - returns HANDLED or DROP is tricky since the other probes might - not be called. - Instead use regular probes and a proper pad (the sinkpad already existed, - it only required to be activated and have a dummy chain function for - the events/buffers to be received/handled properly) - -2017-08-31 18:56:37 +1000 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/gst-android-hardware-camera.c: - * sys/androidmedia/gst-android-hardware-sensor.c: - * sys/androidmedia/gstjniutils.c: - amc: actually use the provided application class loader - For the camera and sensor - Fixes a couple of ClassNotFound java exceptions when initializing GStreamer - off the main thread. - -2017-09-05 16:14:02 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/wayland/gstgldisplay_wayland.c: - gl/wayland: call eglTerminate() before wl_display_disconnect() - Calling these two functions in the wrong order will result in - use-after-free inside wayland. - https://bugzilla.gnome.org/show_bug.cgi?id=787293 - -2017-09-01 15:00:12 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gtkgstglwidget.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - gtkglsink: expose the created display and context correctly - 1. Propagate the GstGLDisplay we create - 2. Add the created GstGLContext to the propagated GstGLDisplay - Otherwise with multi-branch GL pipelines involving gtkglsink, things - will fall apart and errors will be genarated somewhere. - -2017-09-05 10:56:12 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/sbc/gstsbcenc.c: - sbcenc: Fix typo in docs - -2017-09-05 09:51:41 +0200 Edward Hervey <edward@centricular.com> - - * Makefile.am: - * ext/libde265/Makefile.am: - plugin: Rename libde265 to de265 for consistency - And avoids it being blacklisted - -2017-09-04 16:13:41 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * tests/examples/Makefile.am: - examples: Makefile.am: add ipcpipeline in SUBDIRS if enabled - -2017-09-04 16:00:02 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * sys/ipcpipeline/gstipcpipelinecomm.c: - * sys/ipcpipeline/gstipcpipelinecomm.h: - * sys/ipcpipeline/gstipcpipelinesink.c: - * sys/ipcpipeline/gstipcpipelinesrc.c: - ipcpipeline: cleanup header includes - We are only using read(), write(), memcpy(), strlen() and errno - in ipcpipelinecomm.c. Everything else is glib/gstreamer. - -2017-09-04 15:52:03 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * sys/ipcpipeline/gstipcpipelinecomm.c: - * sys/ipcpipeline/gstipcpipelinecomm.h: - ipcpipeline: use GstPoll instead of select() to watch for socket activity - ... and make that code more readable in the process - https://bugzilla.gnome.org/show_bug.cgi?id=787208 - -2017-09-04 10:39:58 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * tests/examples/ipcpipeline/ipc-play.c: - examples: ipcpipeline: get rid of yet another use of SOCK_NONBLOCK - https://bugzilla.gnome.org/show_bug.cgi?id=786763 - -2017-09-04 08:30:58 +0200 Nicola Murino <nicola.murino@gmail.com> - - * configure.ac: - * ext/opencv/meson.build: - opencv: allow compilation against 3.3.0 - https://bugzilla.gnome.org/show_bug.cgi?id=787234 - -2017-09-01 15:56:04 +0200 Edward Hervey <edward@centricular.com> - - * ext/qt/gstqtgl.h: - qt: Only include qtgui-config.h on qt >= 5.9.0 - The file does not exist in previous versions - -2017-08-30 08:37:04 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Make jp2k handling more robust and efficient - * Avoid copying the pending data and instead create a buffer directly from - that data with the appropriate offset. - * Locate the jp2k magic to determine the exact location of the (first) frame - data instead of assuming that the header is of an expected size - https://bugzilla.gnome.org/show_bug.cgi?id=786111 - -2017-08-29 11:14:59 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Handle quirk in jp2k es header handling - The jp2k specification (ITU-T T.800) specifies that the 'brat' box - has two fields and the second one (AUF2) can be set to 0 for progressive - streams. - The problem is that the mpeg-ts specification (ITU-T H.222.0 06/2012) - says that the AUF2 field is only present if the stream is interlaced - In order to cope with both situation, accept those next 32bit if the - stream is marked as progressive and those bits contain 0 - https://bugzilla.gnome.org/show_bug.cgi?id=786111 - -2017-08-31 15:07:45 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * tests/examples/ipcpipeline/ipc-play.c: - * tests/examples/ipcpipeline/ipcpipeline1.c: - examples: ipcpipeline: do not use the linux-specific SOCK_NONBLOCK flag - Use fcntl() instead to set O_NONBLOCK, which is portable. - https://bugzilla.gnome.org/show_bug.cgi?id=786763 - -2017-08-31 14:57:34 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * configure.ac: - * meson.build: - * tests/check/pipelines/ipcpipeline.c: - tests: ipcpipeline: provide pipe2() on systems that don't have it - https://bugzilla.gnome.org/show_bug.cgi?id=786763 - -2017-08-31 14:40:44 +1000 Matthew Waters <matthew@centricular.com> - - * ext/qt/gstqtgl.h: - qt: the defines for QT_OPENGL_ES_2 have moved - Update the includes to account for that - -2017-04-26 13:50:41 +0200 Jochen Henneberg <jh@henneberg-systemdesign.com> - - * ext/qt/qtwindow.cc: - qt: ensure GL_DRAW_FRAMEBUFFER - -2017-08-30 18:11:27 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * tests/check/pipelines/ipcpipeline.c: - tests: ipcpipeline: make the state_changes test more deterministic - Watching the STATE_CHANGED messages is way more deterministic than - polling the state. - https://bugzilla.gnome.org/show_bug.cgi?id=786006 - -2017-08-30 16:37:21 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * tests/check/pipelines/ipcpipeline.c: - tests: ipcpipeline: fix broken exclusivity checks - In most cases we want to stop the pipeline just once, but we have - to do this from code that runs in the streaming threads and in case - we have multiple streams, we need to make sure that we do this only - once. The previous checks were broken, this should fix it. - https://bugzilla.gnome.org/show_bug.cgi?id=786006 - -2017-08-30 14:37:32 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * tests/check/pipelines/ipcpipeline.c: - tests: ipcpipeline: attempt to make tags test more deterministic - Instead of using a timeout and pushing the tags from an outside - thread, use a pad probe and push them from the streaming thread. - https://bugzilla.gnome.org/show_bug.cgi?id=786006 - -2017-08-30 15:18:58 +0100 Philippe Normand <philn@igalia.com> - - * tests/examples/gl/gtk/3dvideo/main.cpp: - examples/gl/gtk: build fix for the 3dvideo example on macOS - -2017-08-30 15:16:39 +0100 Philippe Normand <philn@igalia.com> - - * tests/examples/gl/gtk/gstgtk.c: - examples/gl/gtk: fix overlay handling for macOS - The GTK+ window requires a NSView sub-view, not an NSWindow. - -2017-08-29 16:52:07 -0700 Per-Erik Brodin <per-erik.brodin@ericsson.com> - - * sys/nvdec/gstnvdec.c: - nvdec: fix build after GL/gl.h no longer included - GL headers are no longer included in public gstgl headers, except for - gstglfuncs.h so make sure to include that one. - https://bugzilla.gnome.org/show_bug.cgi?id=786993 - -2017-08-29 10:37:11 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Properly error out on jp2k parsing errors - Avoids crashes later on where we assume buffer exists - -2017-08-28 12:56:34 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * sys/applemedia/iosglmemory.h: - * sys/applemedia/videotexturecache.h: - * sys/applemedia/videotexturecache.m: - gl: fix build for ios/win32/android after 2fd84a6c - Some missing GL includes. - -2017-08-26 13:08:27 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/isoff/gstisoff.c: - isoff: make debug category private - Otherwise it shows up in .def file in autotools build. - -2017-08-26 12:03:06 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/smoothstreaming/meson.build: - * tests/check/meson.build: - meson: fix build for isoff lib addition - -2017-08-26 12:02:51 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/isoff/gstisoff.h: - isoff: export symbols - -2017-05-17 22:09:48 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/smoothstreaming/Makefile.am: - * ext/smoothstreaming/gstmssfragmentparser.c: - * ext/smoothstreaming/gstmssfragmentparser.h: - * ext/smoothstreaming/gstmssmanifest.c: - smoothstreaming: Use isoff to parse tfxd/tfrf - https://bugzilla.gnome.org/show_bug.cgi?id=777825 - -2017-07-02 14:27:33 +0900 Seungha Yang <sh.yang@lge.com> - - * gst-libs/gst/isoff/gstisoff.c: - * gst-libs/gst/isoff/gstisoff.h: - * tests/check/libs/isoff.c: - * tests/check/libs/isoff.h: - isoff: Add parsing mss specific tfrf and tfxd boxes - This code is imported from mssdemux's tfxd/tfrf parsing function - https://bugzilla.gnome.org/show_bug.cgi?id=777825 - -2017-06-02 23:19:36 +0900 Seungha Yang <sh.yang@lge.com> - - * gst-libs/gst/isoff/gstisoff.c: - * gst-libs/gst/isoff/gstisoff.h: - * tests/check/libs/isoff.c: - * tests/check/libs/isoff.h: - * win32/common/libgstisoff.def: - isoff: Add parsing moov and tfdt - To extract isobmff level timestamp, moov and tfdt parsing is required. - https://bugzilla.gnome.org/show_bug.cgi?id=777825 - -2017-05-25 18:14:09 +0900 Seungha Yang <sh.yang@lge.com> - - * configure.ac: - * ext/dash/Makefile.am: - * ext/dash/gstdashdemux.h: - * ext/dash/meson.build: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/isoff/Makefile.am: - * gst-libs/gst/isoff/gstisoff.c: - * gst-libs/gst/isoff/gstisoff.h: - * gst-libs/gst/isoff/meson.build: - * gst-libs/gst/meson.build: - * tests/check/Makefile.am: - * tests/check/libs/isoff.c: - * tests/check/libs/isoff.h: - * win32/common/libgstisoff.def: - isoff: Move isoff to gst-libs - Also rename unit test dash_isoff to isoff - https://bugzilla.gnome.org/show_bug.cgi?id=777825 - -2017-08-25 20:37:39 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/meson.build: - gl: install new glfuncs.h header - -2017-08-25 19:33:41 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/pipelines/ipcpipeline.c: - tests: ipcpipeline: skip broken tests - These fail on the build bots. Blacklist until someone - investigates. - https://bugzilla.gnome.org/show_bug.cgi?id=786006 - -2017-08-24 13:43:18 +0100 Philippe Normand <philn@igalia.com> - - * tests/check/libs/player.c: - tests/player: check for media-info-updated before duration-changed - The media-info-updated signal is now emitted before duration-changed since - commit 8a29da8023604a1419ac5f2cae7f165198d6fbbf. - https://bugzilla.gnome.org/show_bug.cgi?id=786201 - -2017-08-24 18:00:41 +1000 Matthew Waters <matthew@centricular.com> - - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpenc.c: - srtp: zero out session member on dealloc - Fixes a user-after-free retrieving stats from _get_property() - -2017-08-24 01:18:40 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglcolorconvert.c: - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglupload.c: - gl/checks: fix build - -2017-08-23 16:36:09 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/meson.build: - gl/meson: add build for the vivante fb backend - -2017-08-23 16:34:39 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/allocators/meson.build: - * gst-libs/gst/meson.build: - meson: build allocators library - -2017-08-23 16:32:57 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/meson.build: - gl/meson: detect valid configuration from enabled apis/platform/winsys - -2017-08-23 16:23:07 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/meson.build: - gl/build: also check for the GL/gl.h header - In order to successfully build against a detected libGL library we also need headers - -2017-08-17 13:46:04 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstgltransformation.c: - * ext/gl/gstglutils.c: - * ext/gl/gstglutils.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils_private.h: - * tests/check/Makefile.am: - * tests/check/libs/.gitignore: - * tests/check/libs/gstglmatrix.c: - glutils: fix matrix operations everywhere - - correct the matrix multiplication - - Use column-major matrices - - reverse order of matrix multiplications - https://bugzilla.gnome.org/show_bug.cgi?id=785980 - -2017-08-17 13:42:21 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltransformation.c: - gltransformation: draw with GL_TRIANGLES - Drawing 5 vertices with GL_TRIANGLE_STRIP will draw an extra unneeded - triangle. - -2017-08-22 16:16:44 +0100 Philippe Normand <philn@igalia.com> - - * sys/applemedia/iosurfacememory.h: - applemedia: fix build after commit 2fd84a6c - -2017-08-22 16:16:24 +0100 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - gl/cocoa: fix build after commit 2fd84a6c - -2017-08-22 12:39:43 +0100 Julien Isorce <jisorce@oblong.com> - - * ext/qt/gstqsgtexture.cc: - * ext/qt/gstqtglutility.cc: - * ext/qt/gstqtsink.cc: - * ext/qt/qtwindow.cc: - qt: fix broken build due to commit 2fd84a6c for gstgl - https://bugzilla.gnome.org/show_bug.cgi?id=784779 - -2017-08-22 12:39:43 +0100 Julien Isorce <jisorce@oblong.com> - - * ext/gl/caopengllayersink.h: - * ext/gl/gstgltransformation.h: - gl: fix broken build due to previous commit 2fd84a6c - Can reproduce after installing libgraphene-dev - Also fixes caopengllayersink.h to anticipate build error on osx. - https://bugzilla.gnome.org/show_bug.cgi?id=784779 - -2017-07-07 16:15:12 +0100 Julien Isorce <jisorce@oblong.com> - - * ext/gl/gltestsrc.c: - * ext/gl/gstglcolorbalance.c: - * ext/gl/gstglcolorscale.c: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstgleffects.h: - * ext/gl/gstglfiltercube.h: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstglimagesink.h: - * ext/gl/gstglmixer.h: - * ext/gl/gstgloverlay.h: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstglutils.c: - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglviewconvert.c: - * ext/gl/gstglviewconvert.h: - * ext/gtk/Makefile.am: - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gtkgstglwidget.c: - * gst-libs/gst/gl/egl/gsteglimage.c: - * gst-libs/gst/gl/egl/gsteglimage.h: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/egl/gstgldisplay_egl.c: - * gst-libs/gst/gl/egl/gstgldisplay_egl.h: - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - * gst-libs/gst/gl/egl/gstglmemoryegl.h: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglbasefilter.h: - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbasememory.h: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstgldebug.c: - * gst-libs/gst/gl/gstgldebug.h: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglformat.c: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/gl/gstglfuncs.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/gl/gstglmemorypbo.h: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstgloverlaycompositor.h: - * gst-libs/gst/gl/gstglquery.c: - * gst-libs/gst/gl/gstglquery.h: - * gst-libs/gst/gl/gstglrenderbuffer.c: - * gst-libs/gst/gl/gstglrenderbuffer.h: - * gst-libs/gst/gl/gstglshaderstrings.h: - * gst-libs/gst/gl/gstglsl_private.h: - * gst-libs/gst/gl/gstglslstage.c: - * gst-libs/gst/gl/gstglsyncmeta.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * gst-libs/gst/gl/gstglviewconvert.h: - * gst-libs/gst/gl/x11/gstgldisplay_x11.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - * tests/check/Makefile.am: - * tests/check/libs/.gitignore: - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglheaders.c: - * tests/check/libs/gstglupload.c: - * tests/examples/gl/generic/cube/main.cpp: - * tests/examples/gl/generic/cubeyuv/main.cpp: - * tests/examples/gl/generic/doublecube/main.cpp: - * tests/examples/gtk/glliveshader.c: - gl: do not include GL headers in public gstgl headers - Except for gst/gl/gstglfuncs.h - It is up to the client app to include these headers. - It is coherent with the fact that gstreamer-gl.pc does not - require any egl.pc/gles.pc. I.e. it is the responsability - of the app to search these headers within its build setup. - For example gstreamer-vaapi includes explicitly EGL/egl.h - and search for it in its configure.ac. - For example with this patch, if an app includes the headers - gst/gl/egl/gstglcontext_egl.h - gst/gl/egl/gstgldisplay_egl.h - gst/gl/egl/gstglmemoryegl.h - it will *no longer* automatically include EGL/egl.h and GLES2/gl2.h. - Which is good because the app might want to use the gstgl api only - without the need to bother about gl headers. - Also added a test: cd tests/check && make libs/gstglheaders.check - https://bugzilla.gnome.org/show_bug.cgi?id=784779 - -2017-08-21 06:49:02 -0700 Jan Schmidt <jan@centricular.com> - - * ext/gl/gstgldownloadelement.c: - * ext/gl/gstgldownloadelement.h: - gldownload: Micro-optimisation. Don't check output caps on every buffer - The output caps will only change on a set_caps() call, so check if - they contain the SystemMemory feature then and save some - per-buffer CPU. - -2017-08-17 12:23:37 +0100 Tim-Philipp Müller <tim@centricular.com> - - * README: - * common: - Automatic update of common submodule - From 29046b8 to 3f4aa96 - -2017-08-16 13:59:01 +0200 Jan Alexander Steffens (heftig) <jsteffens@make.tv> - - * sys/directsound/gstdirectsoundsrc.h: - * sys/winks/kshelpers.c: - * sys/winks/kshelpers.h: - * sys/winks/ksvideohelpers.c: - * sys/winks/ksvideohelpers.h: - sys: Convert source files to UTF-8 - Otherwise we have problems with the new gtk-doc - ported to python. But it's a good thing to do - anyway. - https://bugzilla.gnome.org/show_bug.cgi?id=786364 - -2017-08-14 14:09:33 +0100 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/player/gstplayer.c: - player: notify of media-info update after duration change - This is a follow-up of 98b0802a981eab05e610638bf5422a08a378a68a - https://bugzilla.gnome.org/show_bug.cgi?id=786201 - -2017-08-15 10:27:03 +0930 Dave Johnstone <dave@digits.tv> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklinkvideosink: Add support for Decklink hardware keying - Add two properties (keyer-mode and keyer-level) to control the built-in hardware keyer of Decklink cards. - https://bugzilla.gnome.org/show_bug.cgi?id=773660 - -2017-08-14 21:33:51 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: start/stop the manifest update loop on liveness or periodic update changes - Scenario: - A manifest starts out in live mode but then the recording is finalized - and a subsequent update changes the state to a non-live manifest when - the server has finished recording/transcoding/whatever with the full - list of fragments. - Without this patch, the manifest update task is never stopped on the - live->non-live transition and will busy loop, burning through one CPU - core. - https://bugzilla.gnome.org/show_bug.cgi?id=786275 - -2017-08-14 16:33:48 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * ext/openjpeg/meson.build: - meson: Fix build with openjpeg>=2.2 - 2.2 implies HAVE_2_1 - -2017-05-21 16:01:14 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * ext/qt/qtitem.cc: - * ext/qt/qtitem.h: - qmlglsink: Add itemInitialized signal to QML item - This is useful for autoplay for example. With autoplay, it is necessary to - wait until the scene graph is fully set up. This signal is emitted once the - QML item node is ready. So, inside a connected slot, the pipeline's state - can be set to PLAYING to automatically start playback as soon as the QML - script is loaded. - https://bugzilla.gnome.org/show_bug.cgi?id=786246 - -2017-08-14 12:12:34 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - * gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - gl: fix build - Include private headers for parent class debug categories. - -2017-08-14 10:11:00 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/gstglcontext_private.h: - * gst-libs/gst/gl/gstglwindow_private.h: - gl: add missing new header files - https://bugzilla.gnome.org/show_bug.cgi?id=786170 - -2017-08-14 09:33:38 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstgldebug.c: - * gst-libs/gst/gl/gstglsyncmeta.c: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl: make some debug categories private - They weren't supposed to be public. - https://bugzilla.gnome.org/show_bug.cgi?id=786170 - -2017-08-12 16:08:02 +0100 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/player/gstplayer.c: - player: propagate updated duration to media_info - https://bugzilla.gnome.org/show_bug.cgi?id=786201 - -2017-08-13 21:17:18 +0200 Clemens Lang <cal@macports.org> - - * configure.ac: - * ext/openjpeg/gstopenjpeg.h: - * ext/openjpeg/meson.build: - openjpeg: Fix build against openjpeg 2.2 - OpenJPEG 2.2 has some API changes and thus ships its headers in a new - include path. Add a configure check (to both meson and autoconf) to - detect the newer version of OpenJPEG and add conditional includes. - Fix the autoconf test for OpenJPEG 2.1, which checked for HAVE_OPENJPEG, - which was always set even for 2.0. - https://bugzilla.gnome.org/show_bug.cgi?id=786250 - -2017-08-11 18:38:41 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.h: - * gst-libs/gst/gl/x11/gstgldisplay_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - * gst-libs/gst/gl/x11/xcb_event_source.c: - gl: don't export symbols that are not supposed to be public - Make a bunch of symbols private that are currently leaked - accidentally because they have a gst_* prefix and are used - internally. We mark those we can't make static with - G_GNUC_INTERNAL so that they get hidden with the autotools - build as well (although we could just pass -fvisibility=hidden - there too). - -2017-08-11 14:55:48 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.h: - gl: sprinkle more GST_EXPORT - -2017-08-11 14:39:07 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * win32/common/libgstmpegts.def: - mpegts: make accidentally exported debug category symbol private - Was never in header files, was just exported by accident because - of the gst_ prefix of the variable name. - -2017-08-11 14:21:05 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gstmpegvideometa.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstvp8parser.c: - * gst-libs/gst/codecparsers/gstvp9parser.c: - * win32/common/libgstcodecparsers.def: - codecparsers: make debug categories static - They're only used internally. The VP9 parser's debug - category symbol was accidentally exported. - -2017-08-09 14:55:44 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: Add bus-id property - https://bugzilla.gnome.org/show_bug.cgi?id=786112 - -2017-08-11 13:59:04 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: hide symbols by default unless explicitly exported - -2017-08-10 23:25:13 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Drop current frame if passing it to the decoder caused an error - Otherwise we will get it again later for output, however this frame will - never actually be output so we will shift timestamps. - This is especially bad if we're handling a live stream where the first - frames are not keyframes. We would output the keyframe with the - timestamp of the first frame, and everything would be too late when - arriving in the sink. - -2017-08-10 23:21:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Don't unref NULL frame on EOS decoding error - -2017-08-10 17:00:37 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfvc3.c: - mxfvc3: Use correct wrapping byte value - -2017-08-10 01:48:18 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: use colorimetry from find_best_format. - This increases the chances that we won't need to do any conversion - for a given pad. - https://bugzilla.gnome.org/show_bug.cgi?id=786078 - -2017-08-10 01:45:53 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: improve find_best_format heuristic. - The goal here is to minimize the work needed to bring all images - to a common format. A better criteria than the number of pads - with a given format is the number of pixels with a given format. - https://bugzilla.gnome.org/show_bug.cgi?id=786078 - -2017-08-10 01:43:15 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst/compositor/compositor.c: - compositor: improve conversion debugging - https://bugzilla.gnome.org/show_bug.cgi?id=786078 - -2017-08-10 09:09:22 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimage.h: - * gst-libs/gst/gl/egl/gstgldisplay_egl.h: - * gst-libs/gst/gl/egl/gstglmemoryegl.h: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglrenderbuffer.h: - * gst-libs/gst/gl/wayland/gstgldisplay_wayland.h: - * gst-libs/gst/gl/x11/gstgldisplay_x11.h: - * gst-libs/gst/wayland/wayland.h: - gl, wayland: mark more declared functions with GST_EXPORT - -2017-08-10 09:07:17 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/parser.h: - * tests/check/meson.build: - tests: export symbols of parser tests helper lib and make it static - And only make the tests that use it link against the helper lib. - -2017-08-09 14:59:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Free devname before setting it - This avoids leaking the devname if the property is set twice. - -2017-07-05 20:55:11 +0200 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtsdemux: remove obsolete function declaration - -2017-08-09 15:10:56 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/curl/gstcurlhttpsrc.c: - * ext/curl/gstcurlhttpsrc.h: - curlhttpsrc: set http-version default if curl does not have HTTP2 feature present - If the version of the curl library is recent enough to allow support - for HTTP2 (i.e. CURL_VERSION_HTTP2 is defined) but does not actually - have that feature enabled, the call to - g_object_class_install_property() uses an incorrect default value for - the "http-version" property. The default should be 1.1 if HTTP2 is - not supported by libcurl or if not enabled by libcurl. - https://bugzilla.gnome.org/show_bug.cgi?id=786049 - -2017-08-09 11:26:37 +0200 Nicola Murino <nicola.murino@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: assume 25 fps for unknown framerate - This is better than reporting no latency at - all and then later failing in live pipelines. - https://bugzilla.gnome.org/show_bug.cgi?id=786036 - -2017-08-03 11:16:20 -0400 Aaron Boxer <boxerab@gmail.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: support vlan 802.1q - https://bugzilla.gnome.org/show_bug.cgi?id=785778 - -2017-08-03 08:42:14 -0400 Aaron Boxer <boxerab@gmail.com> - - * gst/pcapparse/gstpcapparse.c: - * gst/pcapparse/gstpcapparse.h: - pcapparse: Support pcap with nanosecond timestamps - https://bugzilla.gnome.org/show_bug.cgi?id=785770 - -2017-08-02 18:17:08 +0100 Tom Bailey <tom.bailey@youview.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Fix leak of pad probes in GstAdaptiveDemuxStream - This commit ensures that the idle probe which GstAdaptiveDemuxStream - adds to the upstream source pad is removed after use. Previously a new - probe was added to the pad whenever a fragment was downloaded, meaning - the number of pad probe callbacks being executed increased continually. - https://bugzilla.gnome.org/show_bug.cgi?id=785957 - -2017-08-07 14:25:26 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: fix flushing seek - Previously this was broken, because a flushing seek causes unlock() - to be called and in the implementation of unlock() we close the - socket, so the seek errors out. - This patch fixes it by re-connecting before the seek. - Unfortunately, a seek does not work properly right after - re-connecting, so a small hack is also in place: we read 1 buffer - before seeking to allow librtmp to do its processing in RTMP_Read() - https://bugzilla.gnome.org/show_bug.cgi?id=785941 - -2017-08-07 14:05:14 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: remove unused macro - -2017-08-08 09:20:00 +0000 davecraig@unbalancedaudio.com <davecraig@unbalancedaudio.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Stop prepared streams as well as running streams - There can be twice as many stream tasks running as there are output - pads for playback of variant HLS playlists. Half of them are the - current pads, and the other half are the pads that are about to be - switched to due to a bitrate change. - The old code only stopped the current streams which could result - in a deadlock on stopping the pipeline. The changes force stopping - and joining of any prepared streams too. - https://bugzilla.gnome.org/show_bug.cgi?id=785987 - -2017-08-07 16:41:27 +0100 Sam Hurst <Sam.Hurst@bbc.co.uk> - - * ext/curl/gstcurlhttpsrc.c: - curlhttpsrc: Does version set fail because of HTTP2 - Check to see if setting CURL_HTTP_VERSION_2_0 failed due to lack of HTTP/2 - support or some bigger underlying libcurl failure - https://bugzilla.gnome.org/show_bug.cgi?id=785878 - -2017-08-07 10:25:17 +0100 Philippe Normand <philn@igalia.com> - - * ext/curl/gstcurldefaults.h: - * ext/curl/gstcurlhttpsrc.c: - * ext/curl/gstcurlhttpsrc.h: - curlhttpsrc: set http-version class property as enum - This matches better with the preferred_http_version which was already declared - as enum. - https://bugzilla.gnome.org/show_bug.cgi?id=785878 - -2017-08-08 11:05:15 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - player: Constify the config argument to gst_player_get_video_snapshot() - This structure is only ever read from. - -2017-08-07 16:00:16 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - Revert "kmssink: support videooverlay interface" - This is causing hard failure for non-squared pixel. The fix isn't - trivial so taking offline by reverting. - This reverts commit db07f4507dad6561fc7e9320624aa7f0f0e10b36. - -2017-08-04 11:08:18 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Don't mix up width and height - CID 1416129 - -2017-08-03 20:21:17 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/examples/compositor/crossfade.c: - examples: fix compiler warning in compositor crossfade example - warning: control reaches end of non-void function - -2017-08-03 20:17:03 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gtk.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-opengl.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - docs: update for git master - -2017-08-03 20:14:20 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/compositor/compositororc-dist.c: - * gst/compositor/compositororc-dist.h: - compositor: update disted orc fallback files - -2017-07-11 22:04:55 -0400 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * tests/examples/compositor/crossfade.c: - * tests/examples/compositor/meson.build: - * tests/examples/meson.build: - * tests/meson.build: - tests: examples: Add a simple crossfade example - https://bugzilla.gnome.org/show_bug.cgi?id=784827 - -2017-07-06 14:26:21 -0400 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - * gst/compositor/blend.c: - * gst/compositor/blend.h: - * gst/compositor/compositor.c: - * gst/compositor/compositor.h: - * gst/compositor/compositororc.orc: - * gst/compositor/compositorpad.h: - compositor: Add support for crossfade blending - Crossfading is a bit more complex than just having two pads with the - right keyframes as the blending is not exactly the same. - The difference is in the way we compute the alpha channel, in the case - of crossfading, we have to compute an additive operation between - the destination and the source (factored by the alpha property of both - the input pad alpha property and the crossfading ratio) basically so - that the crossfade result of 2 opaque frames is also fully opaque at any - time in the crossfading process, avoid bleeding through the layer - blending. - Some rationnal can be found in https://phabricator.freedesktop.org/T7773. - https://bugzilla.gnome.org/show_bug.cgi?id=784827 - -2017-07-20 16:17:16 -0400 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * ext/libde265/gstlibde265.c: - de265: Fix plugin name to match new plugin naming convention - -2017-07-14 09:54:40 -0400 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * gst/mpegpsmux/mpegpsmux.c: - mpegpsmux: Do not dereference a NULL pointer - -2017-08-02 18:43:54 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - decklink: Fix indentation - -2017-08-02 10:46:46 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * sys/ipcpipeline/gstipcpipelinecomm.c: - ipcpipeline: don't use g_steal_pointer; it's not in the current required version of GLib - We depend on GLib 2.40, g_steal_pointer was introduced in 2.44. - https://bugzilla.gnome.org/show_bug.cgi?id=785698 - -2017-08-01 17:07:59 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * configure.ac: - * gst/ipcpipeline/meson.build: - * gst/meson.build: - * sys/Makefile.am: - * sys/ipcpipeline/Makefile.am: - * sys/ipcpipeline/gstipcpipeline.c: - * sys/ipcpipeline/gstipcpipelinecomm.c: - * sys/ipcpipeline/gstipcpipelinecomm.h: - * sys/ipcpipeline/gstipcpipelinesink.c: - * sys/ipcpipeline/gstipcpipelinesink.h: - * sys/ipcpipeline/gstipcpipelinesrc.c: - * sys/ipcpipeline/gstipcpipelinesrc.h: - * sys/ipcpipeline/gstipcslavepipeline.c: - * sys/ipcpipeline/gstipcslavepipeline.h: - * sys/ipcpipeline/meson.build: - * sys/ipcpipeline/protocol.txt: - * sys/meson.build: - * tests/check/Makefile.am: - ipcpipeline: move to sys/ and make it dependent on platform support for unix sockets - -2017-08-01 10:15:13 -0400 Georg Lippitsch <glippitsch@toolsonair.com> - - * sys/decklink/gstdecklink.cpp: - decklinksrc: Raise limit of devices to 16 - https://bugzilla.gnome.org/show_bug.cgi?id=785694 - -2017-08-01 13:26:38 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * gst/ipcpipeline/meson.build: - * gst/meson.build: - meson: enable building the ipcpipeline plugin - -2017-07-05 16:56:24 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * .gitignore: - * configure.ac: - * tests/examples/Makefile.am: - * tests/examples/ipcpipeline/Makefile.am: - * tests/examples/ipcpipeline/ipc-play.c: - * tests/examples/ipcpipeline/ipcpipeline1.c: - tests/examples: add manual tests/examples for the ipcpipeline elements - ipcpipeline1 is a very simple test that shows a short videotestsrc fragment. - ipc-play is a clone of gst-play that splits the pipeline in two - processes, running the source & demuxer on the master process - and the decoders & sinks on the slave. - -2017-07-05 16:53:48 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * .gitignore: - * tests/check/Makefile.am: - * tests/check/pipelines/ipcpipeline.c: - * tests/files/sine.wav: - * tests/files/test.ts: - tests/check: add automatic unit test suite for the ipcpipeline elements - All tests run within a common framework for splitting processes - and making them interract properly with the gst check system. - -2017-07-05 16:50:22 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * configure.ac: - * gst/ipcpipeline/Makefile.am: - * gst/ipcpipeline/gstipcpipeline.c: - * gst/ipcpipeline/gstipcpipelinecomm.c: - * gst/ipcpipeline/gstipcpipelinecomm.h: - * gst/ipcpipeline/gstipcpipelinesink.c: - * gst/ipcpipeline/gstipcpipelinesink.h: - * gst/ipcpipeline/gstipcpipelinesrc.c: - * gst/ipcpipeline/gstipcpipelinesrc.h: - * gst/ipcpipeline/gstipcslavepipeline.c: - * gst/ipcpipeline/gstipcslavepipeline.h: - * gst/ipcpipeline/protocol.txt: - ipcpipeline: introduce new plugin for inter-process pipelines - These elements allow splitting a pipeline across several processes, - with communication done by the ipcpipelinesink and ipcpipelinesrc - elements. The main use case is to split a playback pipeline into - a process that runs networking, parser & demuxer and another process - that runs the decoder & sink, for security reasons. - https://bugzilla.gnome.org/show_bug.cgi?id=752214 - -2017-08-01 10:21:51 +0100 Julien Isorce <jisorce@oblong.com> - - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - gl: return NULL mem if eglCreateImage failed - Found on rpi when gpu_mem is too low so there is not enough memory to - create the eglimage. But still gst_buffer_pool_acquire_buffer succeeded. - And it leads to a CRITICAL assert: - gst_egl_image_get_image: assertion 'GST_IS_EGL_IMAGE (image)' failed - https://bugzilla.gnome.org/show_bug.cgi?id=785518 - -2017-06-20 13:11:27 +0800 Haihua Hu <jared.hu@nxp.com> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: support videooverlay interface - Implement videooverlay interface in kmssink, divided into two cases: - when driver supports scale, then we do refresh in show_frame(); if - not, send a reconfigure event to upstream and re-negotiate, using the - new size. - https://bugzilla.gnome.org/show_bug.cgi?id=784599 - -2017-07-30 12:17:57 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: log all events - We already log a few events explicitly, just log them all with more detail. - -2017-07-29 16:54:38 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.h: - aggregator: fix header formatting - -2017-07-28 16:58:38 +0100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglshader.c: - gl: document missing GstGLShader functions - -2017-07-28 11:00:12 +0100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/egl/gsteglimage.h: - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbasememory.h: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmemorypbo.h: - * gst-libs/gst/gl/gstglsl.c: - * gst-libs/gst/gl/gstglsl.h: - * gst-libs/gst/gl/gstglupload.h: - * gst-libs/gst/gl/gstglwindow.h: - gl/docs: some documentation updates - Add some missing/incomplete docs - -2017-07-26 19:04:09 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglformat.c: - * gst-libs/gst/gl/gstglmemory.c: - gl/docs: correctly name our objects in the documentation GstGl -> GstGL - -2017-07-26 19:03:15 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglformat.h: - gl/docs: document GstGLFormat enum - -2017-07-26 17:22:31 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/curl/gstcurlqueue.c: - curl: curlqueue: add symbol name to avoid confusing gtkdoc - -2017-07-26 16:51:50 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/curl/gstcurlhttpsrc.c: - curlhttpsrc: do not check for NULL before g_free() - g_free() is NULL-safe. - -2017-07-26 17:06:17 +0100 Sam Hurst <Sam.Hurst@bbc.co.uk> - - * ext/curl/curltask.h: - * ext/curl/gstcurlhttpsrc.c: - * ext/curl/gstcurlqueue.c: - curlhttpsrc: Fix flagged Coverity errors - Fixes CIDs 1415707 - 1415717 - -2017-07-26 17:43:19 +0100 Sam Hurst <Sam.Hurst@bbc.co.uk> - - * ext/curl/curltask.h: - * ext/curl/gstcurldefaults.h: - * ext/curl/gstcurlhttpsrc.c: - * ext/curl/gstcurlhttpsrc.h: - curl: Reorganise header files to fix macOS builds - https://bugzilla.gnome.org/show_bug.cgi?id=744261 - -2017-07-23 13:26:23 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: use local var - Instead of the self->priv-> deref use the local var we created already. - -2017-07-26 09:19:42 +0200 Edward Hervey <edward@centricular.com> - - * ext/curl/gstcurlhttpsrc.c: - curlhttpsrc: Fix compilation without debugging system enabled - -2017-07-25 15:23:57 +0100 Sam Hurst <Sam.Hurst@bbc.co.uk> - - * ext/curl/Makefile.am: - * ext/curl/curltask.h: - * ext/curl/gstcurl.c: - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurldefaults.h: - * ext/curl/gstcurlhttpsrc.c: - * ext/curl/gstcurlhttpsrc.h: - * ext/curl/gstcurlqueue.c: - * ext/curl/gstcurlqueue.h: - * ext/curl/meson.build: - curl: Add curlhttpsrc element - Merged from https://github.com/bbc/gst-curlhttpsrc commit - f8aabcfc5c50a44f3362de831377d6e86dcd2d49 - https://bugzilla.gnome.org/show_bug.cgi?id=744261 - -2017-07-17 16:07:21 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * sys/kms/gstkmsallocator.c: - kmsallocator: add driver pitch support for planar formats - We used to to handle the driver pitch only for single plan video format. - Add support for multi planes format by re-using the extrapolate function - from the v4l2 element. - Also use this pitch to calculate the proper offsets. - Prevent DRM drivers to pick a slow path if the pitches/offsets don't - match the ones it reported. - https://bugzilla.gnome.org/show_bug.cgi?id=785029 - -2017-07-17 15:58:57 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * sys/kms/gstkmsallocator.c: - kmsallocator: inline gst_kms_allocator_alloc_empty() - No semantic change, just renamed the 'tmp' variable to a more meaningful - name and to use the same structure as in gst_kms_allocator_bo_alloc(). - Needed as I'm going to move the gst_memory_init() call after the - allocation of the DUMB buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=785029 - -2017-07-25 10:03:25 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Fix compilation with gcc 4.8.4 - https://bugzilla.gnome.org/show_bug.cgi?id=785367 - -2017-07-24 18:38:57 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Remove the GAP event from the queue before queueing up the GAP buffer - Otherwise check_events() will not remove the GAP event (as the queue - tail is not the event anymore but the GAP buffer), then the GAP buffer - is handled, then the GAP event is handled again, ... forever. - -2017-07-24 17:00:02 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Correctly consider frame reordering for timecode calculation - -2017-07-24 16:54:22 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Use material track edit rate for component PTS offsetting - -2017-07-24 16:49:19 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - mxfdemux: Output timecodes for video streams - -2017-07-24 16:21:31 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - mxfdemux: Keep track of component start positions and material track positions - This allows us to know exactly where in the material track we are, and - how to convert from a PTS for a source track to the actual PTS of the - material track (i.e. by adding the component start position). - https://bugzilla.gnome.org/show_bug.cgi?id=785119 - -2017-07-21 12:28:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/Makefile.am: - tsmux: Fix make distcheck - -2017-07-21 08:43:45 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/gstglframebuffer.c: - gl: fix g-i annotations for glframebuffer - gstglframebuffer.c:176: Error: GstGL: annotations not supported for tag "Since:". - -2017-07-21 09:33:54 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/meson.build: - tsmux: Add mpegtsmux_jpeg2000.c to meson.build - -2017-07-21 09:27:20 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/tsmux/tsmuxstream.h: - tsmux: Store PES payload size in a 32 bit integer - While the size in the packet is only 16 bits, we need to handle bigger - sizes without overflowing. For video streams this can happen, 0 is - written to the stream instead. - This fixes muxing of buffers >= 2**16. - -2017-07-19 10:14:21 -0400 Aaron Boxer <boxerab@gmail.com> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - * gst/mpegtsmux/Makefile.am: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux_jpeg2000.c: - * gst/mpegtsmux/mpegtsmux_jpeg2000.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - * gst/videoparsers/gstjpeg2000parse.c: - * gst/videoparsers/gstjpeg2000parse.h: - tsmux/tsdemux: Add support for JPEG2000 - Based on patches by Milos Seleceni. - https://bugzilla.gnome.org/show_bug.cgi?id=753323 - -2017-07-20 10:29:18 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * Makefile.am: - * sys/d3dvideosink/Makefile.am: - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/meson.build: - d3dsinkwrapper: Make the DLL name match the plugin name - Otherwise, since 1.12, the plugin gets blacklisted. - https://bugzilla.gnome.org/show_bug.cgi?id=785168 - -2017-07-20 18:09:15 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * configure.ac: - * sys/decklink/gstdecklink.h: - decklink: Fix building with MSYS2's MinGW - Reported and tested by Philippe Renon. - https://bugzilla.gnome.org/show_bug.cgi?id=784943 - -2017-07-20 18:51:53 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/shm/meson.build: - meson: fix potentially undefined shm_deps variable - -2017-07-20 18:43:11 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * ext/smoothstreaming/meson.build: - meson: make smoothstreaming depend on gio - -2017-07-20 17:49:59 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/meson.build: - meson: specify fallback for libgmodule_dep - Fixes build with glib built as a subproject. - -2017-07-19 04:19:34 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Fix format specifier warnings in logging v2 - HRESULT is unsigned long on Windows, but the Decklink headers define - it to 'int' on Linux. Confusingly, the defines that talk about the - possible return values for it use long constants. The easy fix would - be to change the linux/LinuxCOM.h header, but that's copied from the - decklink SDK. - Change the logging to always upcast to unsigned long while printing - HRESULT for consistency across platforms. - -2017-07-19 04:14:13 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/decklink/gstdecklink.h: - decklink: Fix CI failure due to missing WINAPI definition - WINAPI is for the windows calling convention to use, and should expand - to nothing on Linux. - https://build.gnome.org/continuous/buildmaster/builds/2017/07/18/76/build/log-gst-plugins-bad.txt - -2017-07-19 02:21:42 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Fix format specifier warnings in logging - gstdecklinkvideosrc.cpp:425:7: warning: format '%x' expects argument of type 'unsigned int', but argument 8 has type 'HRESULT {aka long int}' -Wformat - and so on - -2017-07-19 02:19:47 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - decklink: Fix build on mingw32 by adding missing WINAPI - gstdecklinkaudiosink.cpp:155:19: error: conflicting type attributes specified for 'virtual HRESULT GStreamerAudioOutputCallback::QueryInterface(const IID&, void**)' - In file included from /var/lib/jenkins/workspace/cerbero-cross-mingw32/workdir/mingw/w32/bin/../lib/gcc/i686-w64-mingw32/4.7.3/../../../../i686-w64-mingw32/include/objbase.h:153:0, - from /var/lib/jenkins/workspace/cerbero-cross-mingw32/workdir/mingw/w32/bin/../lib/gcc/i686-w64-mingw32/4.7.3/../../../../i686-w64-mingw32/include/ole2.h:16, - from /var/lib/jenkins/workspace/cerbero-cross-mingw32/workdir/mingw/w32/bin/../lib/gcc/i686-w64-mingw32/4.7.3/../../../../i686-w64-mingw32/include/windows.h:94, - from /var/lib/jenkins/workspace/cerbero-cross-mingw32/workdir/mingw/w32/bin/../lib/gcc/i686-w64-mingw32/4.7.3/../../../../i686-w64-mingw32/include/rpc.h:16, - from win/DeckLinkAPI.h:27, - from gstdecklink.h:35, - from gstdecklinkaudiosink.h:27, - from gstdecklinkaudiosink.cpp:25: - /var/lib/jenkins/workspace/cerbero-cross-mingw32/workdir/mingw/w32/bin/../lib/gcc/i686-w64-mingw32/4.7.3/../../../../i686-w64-mingw32/include/unknwn.h:67:25: error: overriding 'virtual HRESULT IUnknown::QueryInterface(const IID&, void**)' - (and many more) - https://ci.gstreamer.net/job/cerbero-cross-mingw32/6407/console - -2017-07-18 12:46:09 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.h: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - video: mark symbols explicitly for export with GST_EXPORT - -2017-07-18 12:45:14 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/uridownloader/gstfragment.h: - * gst-libs/gst/uridownloader/gsturidownloader.h: - uridownloader: mark symbols explicitly for export with GST_EXPORT - -2017-07-18 12:43:26 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.h: - * gst-libs/gst/player/gstplayer-media-info.c: - * gst-libs/gst/player/gstplayer-media-info.h: - * gst-libs/gst/player/gstplayer-signal-dispatcher.h: - * gst-libs/gst/player/gstplayer-video-overlay-video-renderer.h: - * gst-libs/gst/player/gstplayer-video-renderer.h: - * gst-libs/gst/player/gstplayer-visualization.h: - * gst-libs/gst/player/gstplayer.h: - player: mark symbols explicitly for export with GST_EXPORT - -2017-07-18 01:16:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/opencv/gstopencvutils.h: - * gst-libs/gst/opencv/gstopencvvideofilter.h: - opencv: mark symbols explicitly for export with GST_EXPORT - -2017-07-18 01:10:56 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/mpegts/Makefile.am: - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gst-dvb-section.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * gst-libs/gst/mpegts/mpegts.h: - * gst-libs/gst/mpegts/mpegts_enum.py: - mpegts: mark symbols explicitly for export with GST_EXPORT - -2017-07-18 00:49:41 +0100 Tim-Philipp Müller <tim@centricular.com> - - * common: - * gst-libs/gst/interfaces/Makefile.am: - * gst-libs/gst/interfaces/build_mkenum.py: - * gst-libs/gst/interfaces/photography.h: - photography: mark symbols explicitly for export with GST_EXPORT - -2017-07-18 00:23:09 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/insertbin/gstinsertbin.h: - insertbin: mark symbols explicitly for export with GST_EXPORT - -2017-05-20 13:19:07 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst-libs/gst/codecparsers/gstjpeg2000sampling.h: - * gst-libs/gst/codecparsers/gstjpegparser.h: - * gst-libs/gst/codecparsers/gstmpeg4parser.h: - * gst-libs/gst/codecparsers/gstmpegvideometa.h: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - * gst-libs/gst/codecparsers/gstvc1parser.h: - * gst-libs/gst/codecparsers/gstvp8parser.h: - * gst-libs/gst/codecparsers/gstvp8rangedecoder.h: - * gst-libs/gst/codecparsers/gstvp9parser.h: - codecparsers: mark symbols explicitly for export with GST_EXPORT - -2017-07-18 00:31:36 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabin-enum.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.h: - basecamerabinsrc: mark symbols explicitly for export with GST_EXPORT - -2017-07-18 00:30:51 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.h: - aggregator: mark symbols explicitly for export with GST_EXPORT - -2017-07-18 00:29:56 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/audio/gstaudioaggregator.h: - * gst-libs/gst/audio/gstnonstreamaudiodecoder.h: - audio: mark symbols explicitly for export with GST_EXPORT - -2017-07-18 00:27:54 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/allocators/gstphysmemory.h: - allocators: mark symbols explicitly for export with GST_EXPORT - -2017-07-18 00:26:23 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: mark symbols explicitly for export with GST_EXPORT - -2017-07-10 16:39:49 +0900 Seungha Yang <sh.yang@lge.com> - - * docs/plugins/inspect/plugin-subenc.xml: - * gst/subenc/gstwebvttenc.c: - webvttenc: Change src pad template to application/x-subtitle-vtt - Use consistent mime-type with subparse element for webvtt format - https://bugzilla.gnome.org/show_bug.cgi?id=784715 - -2017-07-09 14:34:21 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstmpdparser.c: - dashdemux: Add support webvtt subtitle stream - Enable exposing webvtt subtitle streams. - https://bugzilla.gnome.org/show_bug.cgi?id=784715 - -2017-07-18 00:52:03 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: set GST_PARAM_MUTABLE_PLAYING for bitrate/max-bitrate properties - This way is documented that these properties can be changed in any state - https://bugzilla.gnome.org/show_bug.cgi?id=784988 - -2017-07-18 00:49:12 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/openh264/gstopenh264enc.cpp: - * ext/openh264/gstopenh264enc.h: - openh264enc: allow to dynamically change bitrate - https://bugzilla.gnome.org/show_bug.cgi?id=784988 - -2017-07-18 00:36:27 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: fix indentation - https://bugzilla.gnome.org/show_bug.cgi?id=784988 - -2017-07-17 19:29:39 +0200 Stefan Sauer <ensonic@users.sf.net> - - * Makefile.am: - cruft: add ext/gsettings to the cruft list - -2017-07-11 10:09:02 -0400 Aaron Boxer <boxerab@gmail.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: support 2-component images - https://bugzilla.gnome.org/show_bug.cgi?id=784797 - -2017-06-24 11:18:06 -0400 Aaron Boxer <boxerab@gmail.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: initial support for JP2 format - This is a simple way of supporting JP2 : we treat is as JPC, and throw - away header info. - https://bugzilla.gnome.org/show_bug.cgi?id=767546 - -2017-07-06 15:14:57 -0400 Aaron Boxer <boxerab@gmail.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: Parse colorimetry, interlace-mode, field-order, multiview-mode and chroma-site - https://bugzilla.gnome.org/show_bug.cgi?id=753323 - -2017-07-13 13:17:57 +0530 Satya Prakash Gupta <sp.gupta@samsung.com> - - * ext/gsm/gstgsmenc.c: - gsm: unmap output buffer when done - https://bugzilla.gnome.org/show_bug.cgi?id=784887 - -2017-07-17 08:06:22 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/gl/meson.build: - meson: Fix GLES2 check - On systems without pkg-config, we have the the library present but - not the headers - https://bugzilla.gnome.org/show_bug.cgi?id=785010 - -2017-07-15 17:25:36 +0100 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - glwindow_cocoa: fix video overlay support - Make sure the window handle is configured after the NSWindow was created. - https://bugzilla.gnome.org/show_bug.cgi?id=767462 - -2017-07-16 01:17:04 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: keep refs over async operations - Avoids dereferencing dead objects - What happens in the autovideosink case is that context 1 is created and - destroyed before all the async operations hae executed on the associated - window. When the delayed operations execute, they then reference dead - objects and crash. - We fix this by keeping refs over all async operations so the object - cannot be deleted while async operations are in flight. - https://bugzilla.gnome.org/show_bug.cgi?id=782379 - -2017-07-15 01:24:52 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl/window/x11: implement set_render_rectangle support - https://bugzilla.gnome.org/show_bug.cgi?id=782959 - -2017-07-15 21:28:38 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/elements/audiomixer.c: - tests: audiomixer: set all properties at once - -2017-07-15 19:33:21 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/elements/audiomixer.c: - tests: audiomixer: use the buffer helper for other tests too - -2017-07-15 12:52:38 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - * po/meson.build: - meson: add translations - -2017-06-29 14:35:40 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvb: src: consolidate tuning stats gathering - Additionally: drop unneeded fe_fd variable. - -2017-07-14 13:54:31 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: document caps negotiation raciness - Until we land conversion support in audioaggregator (#773762). - https://bugzilla.gnome.org/show_bug.cgi?id=777915 - -2017-07-14 14:14:38 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * configure.ac: - * sys/decklink/Makefile.am: - decklink: Add autotools support on Windows - Also add a missing windows file to EXTRA_DIST - https://bugzilla.gnome.org/show_bug.cgi?id=784943 - -2017-07-07 16:33:42 +0100 Julien Isorce <jisorce@oblong.com> - - * pkgconfig/gstreamer-gl-uninstalled.pc.in: - pkgconfig: missing GL_CFLAGS in gstreamer-gl-uninstalled.pc.in - Already present in gstreamer-gl.pc.in - https://bugzilla.gnome.org/show_bug.cgi?id=784779 - -2017-07-14 08:09:25 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/elements/audiomixer.c: - audiomixer: add a helper for buffer creation - This makes the test setup easier to read. - -2017-07-13 22:00:58 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: remove duplicated code fragment - This code already runs above when (event || query). - -2017-07-13 21:55:55 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/audio/gstaudioaggregator.c: - * gst-libs/gst/base/gstaggregator.c: - aggregator: code cleanups - Fix comment typos, some copy'n'paste in logging. Add more doc comments. - -2017-07-13 21:54:55 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/elements/audiomixer.c: - audiomixer: use test helper once more - -2017-07-13 12:57:12 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Workaround for live seek ranges when advancing - This is a workaround for a regression introduced by - f4190a49c04f1d5d174cebba0bc9a03a7ec721c2 - ( adaptivedemux: Check live seeking range more often ) - The goal of the previous commit was to be able to cope with non-1.0 - rates on live streams which have a "seeking window" (i.e. the server - keeps around quite a bit of the live stream so you can seek back into - it). - Without that commit, two different kind of issues would happen: - * When doing reverse playback, you would never check whether you - are outside of the seekable region. And would then continuously - try to download fragments that are no longer present. - * When doing fast forward, you would end up requesting fragments - which are not present yet. - In order to determine whether one was *really* outside of the seekable - window, we check whether the current stream position is still - within the seekable region. - The *problem* though with that commit is that it assumes that subclasses - will return continuously updated seeking ranges (i.e. dependent on the - current time), which is *NOT* the case. - For example: - * dashdemux does use the current UTC to determine the seekable region - * hlsdemux uses the values from the last updated manifest - Therefore if one downloads fragments faster than realtime, for HLS - we would end up at the end of the last manifest seekable range, and - the previous commit would consider the stream as being ended... which - is not the case. - In the long run, we need to figure out a way to cope with non-1.0 - rates on live streams for all types of stream (including HLS). - https://bugzilla.gnome.org/show_bug.cgi?id=783075 - -2017-05-29 22:47:10 -0700 Thiago Santos <thiagossantos@gmail.com> - - * ext/dash/gstdashdemux.c: - dashdemux: update manifest streams correctly if pads aren't exposed - In some cases, it is possible that we need to update the manifest before - pads have been exposed at all. If there are no current pads, just expose - the next prepared streams. This doesn't handle the case where a manifest - update would happen while a live streams is changing periods, which is a - type of use case that we're unaware of real usages yet. - https://bugzilla.gnome.org/show_bug.cgi?id=783028 - -2017-05-13 15:17:57 -0700 Thiago Santos <thiagossantos@gmail.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: small refactor to avoid repeated code - Move segment event update to a function - https://bugzilla.gnome.org/show_bug.cgi?id=773159 - -2017-05-09 11:41:49 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Handle prepared streams on seeks - This is a race that was exposed by the {hls|dash}.scrub_forward_seeking - validate test. - The "race" is that a subclass might want to change format, causing - a new stream to be created (but not exposed/switched yet) and put on the - prepared_streams list. That stream will have values (including pending - segment) from the pre-seek state. - Before the stream is exposed/switched, a new seek comes in and the stream - values get updated ... but the ones that will be changed don't get updated - causing them to push out wrong segments once they are exposed. - https://bugzilla.gnome.org/show_bug.cgi?id=773159 - -2017-07-12 15:29:32 +1000 Jan Schmidt <jan@centricular.com> - - * ext/qt/gstqtsink.cc: - * ext/qt/gstqtsink.h: - * ext/qt/qtitem.cc: - * ext/qt/qtitem.h: - qt: Use a proxy object for access to the QML widget - QML can destroy the video widget at any time, leaving - us with a dangling pointer. Use a lock and a proxy - object to cope with that, and block in the widget - destructor if there are ongoing calls into the widget. - -2017-07-06 21:09:50 +1000 Jan Schmidt <jan@centricular.com> - - * ext/gl/gstglbumper.c: - * ext/gl/gstglcolorbalance.c: - * ext/gl/gstglcolorscale.c: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstglfilterapp.c: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglfilterreflectedscreen.c: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstgloverlay.c: - * ext/gl/gstgltransformation.c: - * ext/gl/gstglviewconvert.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - glfilter: Remove hard-coded pad templates - Add a function to install the default RGBA pad templates, - but don't make them required so that there can be - GstGLFilter sub-classes with different input/output - caps if they want. Remove the hard-coded RGBA restriction in - the set_caps_features call, as it will be taken care - of by intersecting with the pad templates. - Update all the sub-classes to match - -2017-07-07 14:41:17 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Don't throw assertions on invalid allocation query - basesrc can send an allocation query with no caps, in which - case we should just fail it without throwing assertions. - -2017-07-11 20:54:25 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Create index table arrays with a big enough size - -2017-07-11 20:53:22 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Initialize index table entries completely in all cases - When seeking backwards into a previously unseen location, we wouldn't - fully initialize them and playback would fail later. - -2017-07-11 12:43:46 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/openexr/Makefile.am: - openexr: Header are not C++11, force C++98 - -2017-05-12 14:39:54 +0200 Georg Lippitsch <glippitsch@toolsonair.com> - - * sys/decklink/gstdecklink.cpp: - decklinkvideosrc: Add custom memory allocator - The default memory allocator of the decklink library allocates - a fixed pool of buffers, and the number of buffers is unknown. - This makes it impossible do useful queuing downstream. The new - memory allocator can create an unlimited number of buffers, - giving all queuing features one would expect from a live source. - https://bugzilla.gnome.org/show_bug.cgi?id=782556 - -2017-07-10 17:35:32 +0200 Philippe Renon <philippe_renon@yahoo.fr> - - * sys/directsound/gstdirectsoundsrc.c: - directsoundsrc: Properly pass pLockedBuffer by reference when calling IDirectSoundCaptureBuffer_Lock - https://bugzilla.gnome.org/show_bug.cgi?id=784755 - -2017-07-10 21:08:09 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/elements/audiomixer.c: - audiomixer: more test cleanups - Port over the test helpers from the adder tests. - -2017-07-10 20:16:10 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/elements/audiomixer.c: - audiomixer: refactor test - Apply cleanups from the adder tests. Use a fixture for common code. - -2017-07-05 11:07:05 +0300 Jussi Kukkonen <jussi.kukkonen@intel.com> - - * ext/vulkan/vkapi.h: - * ext/vulkan/wayland/Makefile.am: - * ext/vulkan/xcb/Makefile.am: - vulkan: Use the generated version of vkconfig.h - Build fails in ext/vulkan/xcb and ext/vulkan/wayland when: - * building from tarball - * building out-of-tree - * Only one WSI integration (xcb or wayland) is enabled by configure.ac - This is because vkconfig.h from source directory gets used instead - of the generated one. - Add the correct build directory to "-I". Use angle bracket - include in vkapi.h so that it actually looks in the include search - path instead of defaulting to the same (source tree) directory. - https://bugzilla.gnome.org/show_bug.cgi?id=784539 - -2017-07-05 11:00:42 +0300 Jussi Kukkonen <jussi.kukkonen@intel.com> - - * ext/vulkan/vkdisplay.c: - vkdisplay: Use ifdef for platform specific defines - VK_KHR_*_SURFACE_EXTENSION_NAME are only available when corresponding - WSI is enabled. - https://bugzilla.gnome.org/show_bug.cgi?id=784539 - -2017-07-10 13:27:40 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/kms/gstkmssink.c: - kmssink: initialize variable - Otherwise clang complains: - gstkmssink.c:1192:7: warning: variable 'buf' is used uninitialized - whenever 'if' condition is true -Wsometimes-uninitialized - -2017-06-12 23:36:05 -0400 Aaron Boxer <boxerab@gmail.com> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: support grayscale with alpha channel - https://bugzilla.gnome.org/show_bug.cgi?id=783591 - -2017-06-12 09:47:49 -0400 Aaron Boxer <boxerab@gmail.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: allow parsing when current caps are null - In this case, we assume that the format is jpc, and we infer the color - space from the number of components. This allows the parser to process a - jpc disk file coming from a filesrc element. - https://bugzilla.gnome.org/show_bug.cgi?id=783291 - -2017-07-02 11:55:13 +0200 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: segment seek flag is not relevant when checking for EOS - It is only relevant in deciding whether or not send SEGMENT_DONE. - In this case, not detecting EOS leads to a busy loop when encountering - the originally recorded end-of-file of a file that is still growing. - -2017-07-07 17:20:38 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - Revert "adaptivedemux: Allow application to force EOS" - This reverts commit 8a070cf9aff8a122b1a52597441bab61c0476ef9. - -2017-07-07 12:13:27 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: Track cached kmsmem and clear them on drain - In this patch we keep track of the cached kmsmem in a way - that we can clear the cache during the drain process. This - release the framebuffer before waiting for the next vblank, - hence add support for DRM driver (like Intel one) that release - the associated DMABuf reference asynchronously. - https://bugzilla.gnome.org/show_bug.cgi?id=782774 - -2017-07-07 12:12:38 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Move kmsmem cache code higher - This will be needed as this API will be used elsewhere to clear - the cache. - https://bugzilla.gnome.org/show_bug.cgi?id=782774 - -2017-05-18 11:54:31 +0200 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: drop last rendered buffer on ALLOCATION and DRAIN queries - kmssink keeps a reference on the last rendered buffer. If this buffer - refers to an upstream buffer, it should be should be released on DRAIN - and ALLOCATION queries so all upstream buffers can be returned to the - pool if needed. As the buffer may be used for scanout, we copy this - buffer into a dumb buffer prior to let it go. - Based on patch from Guillaume Desmottes <guillaume.desmottes@collabora.com> - https://bugzilla.gnome.org/show_bug.cgi?id=782774 - -2017-07-06 17:20:56 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsallocator.c: - kmssink: Don't leak GEM primed from DMABuf - This otherwise breaks DMABuf reclaiming. This is not visible from - userspace, but inside the kernel, the DRM driver will hold a ref to the - DMABuf object. With a V4L2 driver allocating those DMABuf, it then - prevent changing the resolution and re-allocation new buffers. - https://bugzilla.gnome.org/show_bug.cgi?id=782774 - -2017-07-05 16:51:12 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Factor out copying to dump buffer - This will be used to copy any upstream memory in order to return it on - resolution change, allocation query or drain query. - https://bugzilla.gnome.org/show_bug.cgi?id=782774 - -2017-07-03 15:28:25 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Allow application to force EOS - Adaptive demuxers are special demuxers that runs their own sources - internally. In this patch we flag the demuxer as being a source in order - to receive the downstream events. We then handle the EOS event by - resetting the internal state and pushing EOS on all pads. This handling - is done asynchronously to avoid blocking user thread. - https://bugzilla.gnome.org/show_bug.cgi?id=723868 - -2017-07-07 17:07:31 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson.build: - meson: Set python3 before plugin subdir()s - It's used by the msdk plugin - -2017-07-07 20:20:35 +0900 Yasushi SHOJI <yashi@atmark-techno.com> - - * ext/gsm/meson.build: - * ext/meson.build: - meson: Added meson.build for gsm - https://bugzilla.gnome.org/show_bug.cgi?id=784646 - -2017-07-07 12:28:14 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/msdk/meson.build: - meson: msdk: use python3 from python3 module - -2017-07-07 11:59:03 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: find python3 via python3 module - https://bugzilla.gnome.org/show_bug.cgi?id=783198 - -2017-04-13 22:11:55 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Invalidate pad's tail position ... - when dequeuing a segment event. - https://bugzilla.gnome.org/show_bug.cgi?id=784593 - -2017-07-06 09:37:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/openjpeg/gstopenjpegdec.c: - Revert "openjpegdec: support grayscale with alpha channel" - This reverts commit 1883ac26b7d02724c11d4f4bad8698c4873b443d. - This breaks the build on older versions of openjpeg: - gstopenjpegdec.c:752:30: error: ‘opj_image_comp_t {aka struct opj_image_comp}’ has no member named ‘alpha’ - https://bugzilla.gnome.org/show_bug.cgi?id=783591 - -2017-06-12 23:36:05 -0400 Aaron Boxer <boxerab@gmail.com> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: support grayscale with alpha channel - https://bugzilla.gnome.org/show_bug.cgi?id=783591 - -2017-04-11 01:18:51 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: fix gaps at end of streams. - When the pad has received EOS, its buffer may still be mixed - any number of times, when the pad's framerate is inferior - to the output framerate. - This was introduced by my patch in - https://bugzilla.gnome.org/show_bug.cgi?id=782962, this patch - also correctly addresses the initial issue. - -2017-07-05 17:04:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: For intra-only streams, always output DTS=PTS - -2017-07-05 15:48:57 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Fix integer overflow in partition position comparison function - -2017-07-05 15:11:22 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Print PTS and DTS in debug output when pushing buffers - -2017-07-05 13:59:12 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmetadata.c: - mxfmetadata: Set field-order correctly for interlaced video - -2017-07-05 13:52:25 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmetadata.c: - mxfmetadata: Use display width/height instead of stored width/height - Stored values contain padding and alignment, and should only be used as - fallback if neither display values nor sampled values exist. - -2017-07-05 00:48:36 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Don't include any KLV packets between header metadata and index table segments in calculations - Minor fixup of last commit. - -2017-07-04 20:01:37 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Allow filler and other KLV packets between index table segments - While only filler packets should be allowed, for good measure also skip - any other KLV packets in the range where there could be index table - segments. - This fixes parsing of partitions with multiple index table segments, - which are separated by a filler packet, or other packets. - -2017-07-04 15:28:36 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: flesh out documentation for GST_H264_PARSER_NO_NAL_END - -2017-07-03 10:11:42 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/ttml/Makefile.am: - ttml: fix linking to libgstvideo - https://bugzilla.gnome.org/show_bug.cgi?id=784439 - -2017-07-01 20:23:25 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: fix "'aggclass' may be used uninitialized in this function" - -2016-03-09 22:01:12 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: add GST_CAPS_FEATURE_MEMORY_DMABUF - Insert before SystemMemory to advice upstream elements that it is - preferable for them to push dmabuf with the caps feature. - Examples: - /* Discard memory:DMABuf caps feature */ - GST_GL_PLATFORM=egl GST_GL_API=gles2 GST_GL_WINDOW=x11 gst-launch-1.0 \ - filesrc location=test.mp4 ! qtdemux ! h264parse ! vaapih264dec ! \ - capsfilter caps="video/x-raw(memory:SystemMemory)" ! glimagesink - /* Force memory:DMABuf caps feature. */ - GST_GL_PLATFORM=egl GST_GL_API=gles2 GST_GL_WINDOW=x11 gst-launch-1.0 \ - filesrc location=test.mp4 ! qtdemux ! h264parse ! vaapih264dec ! \ - capsfilter caps="video/x-raw(memory:DMABuf)" ! glimagesink - /* Auto select memory:DMABuf caps feature. */ - GST_GL_PLATFORM=egl GST_GL_API=gles2 GST_GL_WINDOW=x11 gst-launch-1.0 \ - filesrc location=test.mp4 ! qtdemux ! h264parse ! vaapih264dec ! \ - glimagesink - https://bugzilla.gnome.org/show_bug.cgi?id=774649 - -2017-06-28 14:45:18 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglviewconvert.c: - gl: reset gl->DrawBuffer to the necessary values - GL_COLOR_ATTACHMENT0 when a framebuffer is bound - GL_BACK if no framebuffer is bound - https://bugzilla.gnome.org/show_bug.cgi?id=784210 - -2017-06-28 12:17:37 +0900 Hyunjun Ko <zzoon@igalia.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: reset the draw buffer to GL_BACK - The draw buffer should be reset to GL_BACK since the framebuffer is already - unbound. - https://bugzilla.gnome.org/show_bug.cgi?id=784210 - -2017-06-28 16:17:41 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvb: src: use correct unit in tuning-timeout prop description - Milliseconds was wrong and made use of this timeout quite - confusing. The code uses the value as microsenconds so - any meaningful number was off by orders of magnitude. - -2017-06-23 16:18:49 -0400 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * meson.build: - meson: Allow using glib as a subproject - -2017-06-20 13:44:47 -0400 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * tests/check/meson.build: - meson: Do not use path separator in test names - Avoiding warnings like: - WARNING: Target "elements/audioamplify" has a path separator in its name. - -2017-06-27 18:47:37 -0700 Per-Erik Brodin <per-erik.brodin@ericsson.com> - - * sys/nvdec/gstnvdec.c: - nvdec: Use qdata on memory instead of buffer meta - Using a meta can be problematic since the memory contained in the buffer - can be transferred to a new buffer in which case the meta would be lost. - https://bugzilla.gnome.org/show_bug.cgi?id=784235 - -2017-06-27 15:41:48 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Include duration in response to SEEKING query - -2017-06-27 15:01:22 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - * gst/mxf/mxfmux.h: - mxfmux: Write temporal offset and correct keyframe offset into index table - https://bugzilla.gnome.org/show_bug.cgi?id=784027 - -2017-06-27 10:47:44 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfalaw.c: - * gst/mxf/mxfd10.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfdv-dif.c: - * gst/mxf/mxfessence.h: - * gst/mxf/mxfjpeg2000.c: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfup.c: - * gst/mxf/mxfvc3.c: - mxfdemux: Take temporal reordering from the index table into account - This is needed to know the PTS, without that we only know the DTS and - using that also for the PTS is wrong unless we have an intra-only codec. - If we can't get the temporal reordering from the index table, don't set - any PTS for non-intra-only codecs and let decoders figure out something. - https://bugzilla.gnome.org/show_bug.cgi?id=784027 - -2017-05-02 17:21:43 -0700 Per-Erik Brodin <per-erik.brodin@ericsson.com> - - * configure.ac: - * sys/Makefile.am: - * sys/nvdec/Makefile.am: - * sys/nvdec/gstnvdec.c: - * sys/nvdec/gstnvdec.h: - * sys/nvdec/plugin.c: - nvdec: New plugin for NVIDIA hardware video decode - https://bugzilla.gnome.org/show_bug.cgi?id=781537 - -2017-06-19 20:35:30 +0900 Eunhae Choi <eunhae1.choi@samsung.com> - - * gst/mpegpsmux/mpegpsmux.c: - mpegpsmux: remove unnecessary g_return_if_fail() - This should never happen, and should be a g_assert() - if it's a worry. Fixes warnings from source code - checkers about possible caps leaks here. - https://bugzilla.gnome.org/show_bug.cgi?id=783955 - -2017-06-26 09:52:24 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: fix with-package-name option - https://bugzilla.gnome.org/show_bug.cgi?id=784082 - -2017-06-22 16:40:07 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/check/meson.build: - meson: Enable netsim unit test - -2017-06-22 14:21:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/meson.build: - * gst/netsim/meson.build: - meson: Add netsim plugin - -2017-06-22 10:34:04 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/meson.build: - meson: Re-add pkg-config support for bcm_host - Now we just fallback to find_library for Rasbian jessy and older. - https://bugzilla.gnome.org/show_bug.cgi?id=784026 - -2017-06-21 15:15:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/shm/meson.build: - * tests/check/meson.build: - meson: Enable shm unit test - -2017-06-21 13:45:04 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/meson.build: - * sys/shm/meson.build: - meson: Enable building shm plugin - -2017-06-21 13:42:31 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/shm/shmpipe.c: - shmpipe: Should not use glib type without ifdef - The shmpipe should build without GLIB. - -2017-06-21 11:18:43 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/gl/meson.build: - gl: meson: use cc.find_library() to detect 'bcm_host' - On the raspberry pi no pkg-config file is provided for the bcm_host - library. We are using AC_CHECK_LIB to detect this lib with autotools, - cc.find_library() library is a closer meson equivalent. - https://bugzilla.gnome.org/show_bug.cgi?id=784026 - -2017-06-22 01:01:40 +1000 Jan Schmidt <jan@centricular.com> - - * configure.ac: - configure: Add --with-moc/uic/rcc options - For cross-compiling, it's easier to be able to specify the - actual paths to the tools - -2017-06-22 01:01:40 +1000 Jan Schmidt <jan@centricular.com> - - * tests/examples/qt/qmlsink/CMakeLists.txt: - qmlsink example: Add CMakeLists.txt - Make it possible to build using cmake instead of qmake - -2017-06-22 01:01:40 +1000 Jan Schmidt <jan@centricular.com> - - * ext/qt/qtitem.cc: - qt: Remove misleading reference to GTK in qtitem.cc - -2017-06-20 19:19:51 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/Makefile.am: - gl/cocoa: Put gstglwindow_cocoa.h into noinst_HEADERS again - And remove gstgldisplay_cocoa.h instead, which got moved to the - installed headers earlier. - -2017-06-19 21:59:29 +0900 Eunhae Choi <eunhae1.choi@samsung.com> - - * ext/directfb/dfbvideosink.c: - directfb: fix caps leak - add unref in case of error - https://bugzilla.gnome.org/show_bug.cgi?id=783961 - -2017-06-16 18:08:39 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/dash_mpd.c: - tests: dash & adaptivedemux: move iterator variable declaration out of `for` - This is a c99-ism that gcc 4.8.5 errors on unless -std=c99 is - specified. - https://bugzilla.gnome.org/show_bug.cgi?id=783868 - -2017-06-16 09:43:35 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvb: src: fix use of wrong array index for tune signal - Erroneous value made "TUNE" overwrite "TUNNING_FAIL" .... - -2017-06-15 17:08:19 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvb: src: issue warning on failed delsys-vs-parameter issues - Aids in understanding misses with the delsys auto-detection logic - -2017-06-15 14:13:14 -0400 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Do not try to serialize unresolved metadatas - When retrieving the `mxfdemux.structure` property, it leads to an - assertion as metadatas need to be resolved for the call to - mxf_metadata_base_to_structure to be valid. - -2017-06-12 22:29:01 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Fix DirectVIV uploader for formats with a single plane - We have to pass the "height" as height = vmeta->offset1 / width to the - API, which of course does not work well for formats with only a single - plane. Use the whole memory size instead of the offset in that case. - -2017-06-10 07:56:48 -0400 Aaron Boxer <boxerab@gmail.com> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: fix display artifacts for RGB 8-bit - https://bugzilla.gnome.org/show_bug.cgi?id=783626 - -2017-06-07 16:17:50 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/openjpeg/gstopenjpegdec.c: - openjpeg: guard against invalid memory access on crafted files - -2017-06-05 15:31:52 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/codecparsers/gstjpeg2000sampling.c: - jpeg2000sampling: fix critical when sampling is missing from caps - This can happen with real files - -2017-06-07 16:58:23 -0400 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * tests/check/meson.build: - meson: Fix building/running tests outside gst-build - -2017-05-18 22:02:38 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * meson.build: - * tests/check/meson.build: - * tests/meson.build: - tests: start porting to meson - Incomplete port, to get the ball rolling - https://bugzilla.gnome.org/show_bug.cgi?id=782962 - -2017-05-18 10:36:50 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdk: enc: set pts and dts, fix inverted sync_point flag - Set the pts and dts on the frame that we receive from the msdk. - Also fix the inverted logic in setting sync points, previously we - were marking all frames as sync points except IDRs. - https://bugzilla.gnome.org/show_bug.cgi?id=782801 - -2017-05-29 12:22:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/meson.build: - gl: Add dependency to gstallocators - -2017-06-07 17:50:09 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Make timestamp reference specifier driver specific - -2017-05-12 15:28:46 -0400 Aaron Boxer <boxerab@gmail.com> - - * gst/videoparsers/gstjpeg2000parse.c: - * gst/videoparsers/gstjpeg2000parse.h: - jpeg2000parse: parse RSIZ capabilities and put profile/level into the caps - The RSIZ capabilities tag stores the JPEG 2000 profile. In the case of - broadcast profiles, it also stores the broadcast main level, which - specifies the bit rate. - https://bugzilla.gnome.org/show_bug.cgi?id=782337 - -2017-06-04 20:23:36 +0900 Seungha Yang <sh.yang@lge.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Clear "cancelled" on uridownloader before processing manifest - Previous commit let demux call gst_uri_downloader_cancel() on _demux_reset(). - Note that, _demux_reset() called during PAUSED_TO_READY and READY_TO_PAUSED. - And, it will set "cancelled" on uridownloader which blocks the use of - uridownloader. The issue is that, subclass can use the uridownloader not only - live streaming for manifest update, but also for fetching another manifests - such as variant and rendition m3u8 of hls streaming. So to unblock it, - demux should clear "cancelled" before processing initial manifest. - https://bugzilla.gnome.org/show_bug.cgi?id=783401 - -2017-06-06 14:58:55 -0400 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * gst/rawparse/gstvideoparse.c: - videoparse: Fix property handling - Usage of GstValueArray was wrong and frame-stride does not exist in - rawvideoparse - -2017-05-25 15:10:32 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * sys/kms/gstkmssink.c: - kmssink: Add xilinx_drm to the list of drivers - This prevent having to set the driver-name explicitly when running on - Zynq UltraScale+ boards. - https://bugzilla.gnome.org/show_bug.cgi?id=783188 - -2017-06-01 16:00:50 +0200 Wim Taymans <wtaymans@redhat.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: endianness fix - Also swap the linktype after we detected that we need to do - byteswapping. Fixes a problem with reading pcap files generated - on a machine with different endianness. - -2017-05-31 02:46:01 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: release the manifest lock ... - before broadcasting preroll. - The deadlock was as follows: - -> The subclass pushes a buffer on a newly-created stream in T1 - -> We take the preroll lock in T1, to handle_preroll - -> The demuxer is stopped in T2, we take the MANIFEST_LOCK - -> T1 starts blocking because it received a reconfigure event - and needs to take the MANIFEST_LOCK - -> T2 deadlocks because it now wants the preroll_lock. - https://bugzilla.gnome.org/show_bug.cgi?id=783255 - -2017-05-30 15:27:37 +0200 Edward Hervey <edward@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Implement a default presentation delay - Have a fallback presentation delay is great (if not present in the - manifest), having an actual default value is better. - https://bugzilla.gnome.org/show_bug.cgi?id=783244 - -2017-05-29 22:28:21 -0700 Thiago Santos <thiagossantos@gmail.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: do not erase data while updates-loop is running - Make sure the manifest update loop is stopped before proceeding with the - resetting of the manifest data. Otherwise, the updates loop will try to - use it and it leads to a segfault - https://bugzilla.gnome.org/show_bug.cgi?id=783028 - -2017-05-29 22:26:09 -0700 Thiago Santos <thiagossantos@gmail.com> - - * ext/dash/gstmpdparser.c: - mpdparser: remove duplicate free of client data - https://bugzilla.gnome.org/show_bug.cgi?id=783028 - -2017-06-01 01:15:05 +0000 Jeremy Hiatt <jeremy@brilliant.tech> - - * gst-libs/gst/gl/gstglutils.c: - glutils: Fix GValue leak in gst_gl_value_set_texture_target_from_mask() - -2017-05-31 03:14:04 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: make sure to free all "old streams" - As we release the MANIFEST_LOCK in stop_tasks, - demux->priv->old_streams can be set, we need to free these - otherwise we may end up trying to dispose elements in the - READY state. - https://bugzilla.gnome.org/show_bug.cgi?id=783256 - -2017-05-16 17:29:35 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Don't be too aggressive with seek ranges - When an accurate seek is requested on a live stream, only requests the - exact value for the "starting position" (i.e. start in forward playback - and stop in reverse playback). - https://bugzilla.gnome.org/show_bug.cgi?id=782698 - -2017-05-31 10:58:39 +0200 Edward Hervey <edward@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Remove wrong assertion - This is wrong because: - * If the rate is negative we should check for the *previous* period - * adaptivedemux already does the proper checks before calling this - method - -2017-05-26 17:55:44 +0200 Edward Hervey <edward@centricular.com> - - * ext/ttml/ttmlparse.c: - ttml: Simplify code - n2 can never be NULL since: - * it's in a "while (n1 && n2)" block - * and it's not modified before - CID #1405868 - -2017-05-26 17:44:40 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/audio/gstnonstreamaudiodecoder.c: - nonstreamaudio: Avoid using wrong variable - And to make that 100% obvious, only use variables declared within the - switch cases instead of function-wide ones. - Also remove useless one-time-use-only variable. - CID #1409857 - -2017-05-26 17:41:39 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/audio/gstnonstreamaudiodecoder.c: - nonstreamaudio: Avoid using un-initialized value - We would end up with cur_position not set but proceed being at its - default value of TRUE. Instead, properly set proceed to FALSE - CID #1409855 - -2017-05-26 17:30:10 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Fix debugging message - GstSegment position is a guint64 and not a gint64 - CID #1409910 - -2017-05-25 09:48:53 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Check live seeking range more often - The live seeking range was only checked when doing actual seeks. This was - assuming that the rate would always be 1.0 (i.e. the playback would - advance in realtime, and therefore fragments would always be available - since the seeking window moves at the same rate). - With non-1.0 rates, this no longer becomes valid, and therefore we need - to check whether we are still within the live seeking range when advancing. - https://bugzilla.gnome.org/show_bug.cgi?id=783075 - -2017-05-25 16:42:03 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Don't create invalid event - tags could potentially be NULL - -2016-12-02 17:51:57 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: retry download MAX_DOWNLOAD_RETRY_COUNT times before erroring - What we want is to retry downloading the fragment on 4xx/5xx errors - however returning EOS will cause waiting for a manifest update for live - (which may be a really long time) or stop everything for non-live. - Change that to only return EOS/ERROR once we've reached the error limit. - https://bugzilla.gnome.org/show_bug.cgi?id=776609 - -2017-05-25 13:06:03 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglshader.c: - gl: Fix indentation - -2017-05-25 13:05:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglframebuffer.c: - glframebuffer: #define GL_READ_FRAMEBUFFER / GL_DRAW_FRAMEBUFFER if not defined yet - Just like we do elsewhere already. - -2017-05-25 11:05:47 +0800 Haihua Hu <jared.hu@nxp.com> - - * gst-libs/gst/gl/gstglformat.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/gl/gstglrenderbuffer.c: - glformat: fix the usage of GST_GL_RGB565 - GL_RGB565 is sized internal glformat, the corresponding glformat - should be GL_RGB and type is GL_UNSIGNED_SHORT_565. Otherwise will - return GL_INVALID_ENUM when creating texture. - https://bugzilla.gnome.org/show_bug.cgi?id=783066 - -2017-05-25 10:09:04 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/qt/qtwindow.cc: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/gl/gstglmemory.c: - glframebuffer: check frame buffer status need use specific fbo target - https://bugzilla.gnome.org/show_bug.cgi?id=783065 - -2017-05-24 11:47:47 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openmpt/gstopenmptdec.c: - openmpt: Fix compilation with 0.2.7386 as in Debian - The OPENMPT_API_VERSION_AT_LEAST macro does not exist. - -2017-05-22 23:06:01 +0200 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/audiomixer.c: - tests: Make audiomixer test_clip verify the resulting timestamps too - -2017-05-23 00:53:57 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Process serialized queries through the queue - This ensures that they really get processed in order with - buffers. Just waiting for the queue to be empty is sometimes not - enough as the buffers are dropped from the pad before the result is - pushed to the next element, sometimes resulting in surprising - re-ordering. - -2017-05-23 00:53:23 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Set flow to FLUSHING on pad stop - Fixes a rare race where the pad is being stopped while doing a query. - -2017-05-23 00:52:27 +0200 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/audiointerleave.c: - tests: audiointerleave: Remove drain with manual clock - Now that the queries go onto the queue, you may need to pull the crank - in order for them to be processed, making this test difficult. - -2017-05-23 09:57:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * meson.build: - Require wildmidi >= 0.4 - https://bugzilla.gnome.org/show_bug.cgi?id=768576 - -2017-05-23 09:17:08 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/wildmidi/gstwildmididec.c: - wildmidi: include stdint.h for int8_t - -2017-05-23 08:42:46 +0100 Tim-Philipp Müller <tim@centricular.com> - - * win32/common/libgstbadaudio.def: - win32: update .def file for new base class - https://bugzilla.gnome.org/show_bug.cgi?id=768576 - -2017-05-22 15:52:33 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/wildmidi/gstwildmididec.c: - wildmididec: explicitly cast buffer data to int8 in _decode() - Fixes compiler warning introduced in commit ff32a4297: - gstwildmididec.c:637:47: error: pointer targets in passing argument 2 of ‘WildMidi_GetOutput’ differ in signedness - WildMidi_GetOutput (wildmidi_dec->song, (char *) (info.data), info.size); - ^ - wildmidi_lib.h:106:15: note: expected ‘int8_t * {aka signed char *}’ but argument is of type ‘char *’ - WM_SYMBOL int WildMidi_GetOutput (midi *handle, int8_t *buffer, uint32_t size); - https://bugzilla.gnome.org/show_bug.cgi?id=768576 - -2016-07-27 02:22:26 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * configure.ac: - * ext/Makefile.am: - * ext/openmpt/Makefile.am: - * ext/openmpt/gstopenmptdec.c: - * ext/openmpt/gstopenmptdec.h: - * ext/openmpt/plugin.c: - openmpt: Add openmptdec element - https://bugzilla.gnome.org/show_bug.cgi?id=768576 - -2017-03-08 22:17:41 +0100 Carlos Rafael Giani <dv@pseudoterminal.org> - - * docs/plugins/Makefile.am: - * ext/wildmidi/Makefile.am: - * ext/wildmidi/gstwildmidi.c: - * ext/wildmidi/gstwildmidi.h: - * ext/wildmidi/gstwildmididec.c: - * ext/wildmidi/gstwildmididec.h: - wildmidi: Port to 1.0 on top of the nonstreamaudiodecoder base class - https://bugzilla.gnome.org/show_bug.cgi?id=768576 - -2016-07-27 01:41:20 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * gst-libs/gst/audio/Makefile.am: - * gst-libs/gst/audio/gstnonstreamaudiodecoder.c: - * gst-libs/gst/audio/gstnonstreamaudiodecoder.h: - * gst-libs/gst/audio/meson.build: - audio: Add nonstreamaudiodecoder base class - https://bugzilla.gnome.org/show_bug.cgi?id=768576 - -2017-05-22 13:46:36 +0200 Anders Jonsson <anders.jonsson@norsjovallen.se> - - * ext/gl/gstgltestsrc.c: - gltestsrc: Fix typo (occured->occurred) - https://bugzilla.gnome.org/show_bug.cgi?id=782947 - -2017-05-21 18:03:02 +0100 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * config.h.meson: - * meson.build: - meson: don't need config.h.meson any longer - -2017-05-20 19:00:23 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/audio/gstaudioaggregator.c: - * gst/audiomixer/gstaudiointerleave.c: - * gst/audiomixer/gstaudiomixer.c: - audioaggregate: Don't hold object locks across calls to aggregate_one - https://bugzilla.gnome.org/show_bug.cgi?id=782878 - -2016-11-18 14:44:16 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Request pad templates which are not request pad - https://bugzilla.gnome.org/show_bug.cgi?id=782920 - -2016-11-18 14:41:54 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Don't restrict sink pad names - Sink pads could have other names than sink_%u - https://bugzilla.gnome.org/show_bug.cgi?id=782920 - -2017-05-21 18:31:59 +0200 Olivier Crête <olivier.crete@collabora.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglbasemixer.h: - glbasemixer: Remove unused negotiated member - This is now all handled in GstAggregator, so this code is not - called anymore. - -2017-05-21 15:44:02 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Declare that it supports the video meta on input - https://bugzilla.gnome.org/show_bug.cgi?id=782918 - -2017-05-21 15:30:10 +0200 Olivier Crête <olivier.crete@collabora.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglbasemixer.h: - * ext/gl/gstglmixer.c: - * ext/gl/gstglvideomixer.c: - gl*mixer: Use propose_allocation from the GstAggregator base class - https://bugzilla.gnome.org/show_bug.cgi?id=782918 - -2017-05-21 15:19:17 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: Implement propose allocation - https://bugzilla.gnome.org/show_bug.cgi?id=782918 - -2017-05-21 14:34:13 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Check for the result of caps events - https://bugzilla.gnome.org/show_bug.cgi?id=782918 - -2017-05-21 14:28:00 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Caps event always goes to the aggregate thread - So no need to check it here. - https://bugzilla.gnome.org/show_bug.cgi?id=782918 - -2017-05-09 23:59:04 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglwindow.c: - gl/viv-fb: Fix user-choice string comparisons - https://bugzilla.gnome.org/show_bug.cgi?id=782921 - -2017-05-21 15:26:12 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * ext/qt/gstqsgtexture.cc: - * ext/qt/gstqsgtexture.h: - qmlglsink: Add dummy texture that is shown as placeholder for NULL buffers - https://bugzilla.gnome.org/show_bug.cgi?id=782917 - -2017-05-21 15:15:48 +0100 Tim-Philipp Müller <tim@centricular.com> - - * win32/common/libgstbadbase.def: - win32: update .def file for new exports - -2017-05-20 18:10:29 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Create normal video pool as a fallback - https://bugzilla.gnome.org/show_bug.cgi?id=746529 - -2017-05-20 17:59:19 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: Use downstream allocator and params if available - https://bugzilla.gnome.org/show_bug.cgi?id=746529 - -2017-05-20 17:35:43 +0200 Olivier Crête <olivier.crete@collabora.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglbasemixer.h: - * ext/gl/gstglmixer.c: - glbasemixer: Remove own decide_allocation, use GstAggregator's - https://bugzilla.gnome.org/show_bug.cgi?id=746529 - -2017-05-20 17:30:06 +0200 Olivier Crête <olivier.crete@collabora.com> - - * ext/gl/gstglbasemixer.c: - glbasemixer: Use aggregator for allocation handling - https://bugzilla.gnome.org/show_bug.cgi?id=746529 - -2017-05-20 17:25:16 +0200 Olivier Crête <olivier.crete@collabora.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglbasemixer.h: - * ext/gl/gstglmixer.c: - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Get the buffer from the pool if available - https://bugzilla.gnome.org/show_bug.cgi?id=746529 - -2017-05-20 16:58:54 +0200 Olivier Crête <olivier.crete@collabora.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: Add downstream allocation query - https://bugzilla.gnome.org/show_bug.cgi?id=746529 - -2017-05-21 12:41:53 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Return to parent on reconfigure - The caps negotiation is now in the parent, so need to return there - if a reconfiguration is needed, otherwise it will loops forever. - -2017-05-21 11:44:37 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl: x11: fix compiler warning - -2017-05-21 12:03:01 +0200 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - glcontext: add public swap_buffers function - That simply calls the implementation - -2017-05-21 10:57:18 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/examples/gl/generic/cube/cube.vcproj: - * tests/examples/gl/generic/cubeyuv/cubeyuv.vcproj: - * tests/examples/gl/generic/doublecube/doublecube.vcproj: - * tests/examples/gl/generic/recordgraphic/recordgraphic.vcproj: - * tests/examples/gl/gtk/3dvideo/3dvideo.vcproj: - * tests/examples/gl/gtk/filternovideooverlay/filternovideooverlay.vcproj: - * tests/examples/gl/gtk/filtervideooverlay/filtervideooverlay.vcproj: - * tests/examples/gl/gtk/fxtest/fxtest.vcproj: - * tests/examples/gl/gtk/pixbufdrop/pixbufdrop.vcproj: - * tests/examples/gl/gtk/switchvideooverlay/switchvideooverlay.vcproj: - * tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.vcproj: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.vcproj: - * tests/examples/gl/qt/videooverlay/videooverlay.vcproj: - * tests/examples/gl/sdl/sdlshare.vcproj: - examples: gl: remove ancient bitrotten .vcproj files - -2017-05-20 16:22:10 +0000 Graham Leggett <minfrin@sharp.fm> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix debug message printf format - Match gsize to G_GSIZE_FORMAT in the debug message. - https://bugzilla.gnome.org/show_bug.cgi?id=782873 - -2017-05-20 17:04:52 +0100 Tim-Philipp Müller <tim@centricular.com> - - * win32/common/libgstbadaudio.def: - win32: update .def file for API removal - -2017-05-20 17:47:04 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudiointerleave.c: - * gst/audiomixer/gstaudiointerleave.h: - audiointerleave: Take object lock while modifying channel count - -2017-05-20 15:56:16 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/audio/gstaudioaggregator.h: - * gst-libs/gst/base/gstaggregator.h: - aggregator: Remove unused GST_FLOW_NOT_HANDLED - -2017-05-20 14:24:57 +0200 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstglstereomix.c: - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/audio/gstaudioaggregator.c: - * gst-libs/gst/audio/gstaudioaggregator.h: - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - * gst/audiomixer/gstaudiointerleave.c: - * gst/audiomixer/gstaudiointerleave.h: - * gst/audiomixer/gstaudiomixer.c: - * gst/compositor/compositor.c: - * tests/check/elements/audiointerleave.c: - aggregator: add simple support for caps handling - Modelled off the videoaggregator caps handling as that seems the most - mature aggregtor-using implementation that has caps handling there is. - https://bugzilla.gnome.org/show_bug.cgi?id=776931 - -2017-05-20 13:10:53 +0200 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Reset upstream latency on first buffer - In the case an aggregator is created and pads are requested but only - linked later, we end up never updating the upstream latency. - This was because latency queries on pads that are not linked succeed, - so we never did a new query once a live source has been linked, so the - thread was never started. - https://bugzilla.gnome.org/show_bug.cgi?id=757548 - -2017-04-04 11:25:43 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - * gst/compositor/compositor.c: - videoaggregator: delay using new caps from a sink pad until the next buffer in the queue is taken - When caps changes while streaming, the new caps was getting processed - immediately in videoaggregator, but the next buffer in the queue that - corresponds to this new caps was not necessarily being used immediately, - which resulted sometimes in using an old buffer with new caps. Of course - there used to be a separate buffer_vinfo for mapping the buffer with its - own caps, but in compositor the GstVideoConverter was still using wrong - info and resulted in invalid reads and corrupt output. - This approach here is more safe. We delay using the new caps - until we actually select the next buffer in the queue for use. - This way we also eliminate the need for buffer_vinfo, since the - pad->info is always in sync with the format of the selected buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=780682 - -2016-05-14 15:52:37 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Always handle sync'ed events on output thread - Having all synchronized events always be handled on the output - thread should make synchronization easier. - https://bugzilla.gnome.org/show_bug.cgi?id=781673 - -2016-07-06 16:39:17 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/audio/gstaudioaggregator.c: - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: Delay clipping to output thread - This is required because the synchronized events like caps or segments - may only be processed on the output thread. - https://bugzilla.gnome.org/show_bug.cgi?id=781673 - -2016-07-07 16:13:57 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Make pad eos as soon as all buffers are processed, dont way for events - https://bugzilla.gnome.org/show_bug.cgi?id=781673 - -2016-07-07 11:47:40 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Only count buffers when declaring queue full - https://bugzilla.gnome.org/show_bug.cgi?id=781673 - -2016-07-06 17:28:11 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/compositor.c: - tests: Test caps using query - Sending an event can accepted event if the caps were rejected - because the event could be queued and processed later. - Also send a drain query in the caps test to make sure that the - event has been processed. - https://bugzilla.gnome.org/show_bug.cgi?id=781673 - -2016-07-06 16:41:44 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/audio/gstaudioaggregator.c: - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: Simplify clip function - The return value was ignored anyway - https://bugzilla.gnome.org/show_bug.cgi?id=781673 - -2016-05-15 16:04:58 +0300 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Only declare first buffer on actual buffer - The function needs to be unlocked if any data is received, but only - end the first buffer processing on an actual buffer, synchronized events - don't matter on the first buffer processing. - https://bugzilla.gnome.org/show_bug.cgi?id=781673 - -2017-05-09 20:20:07 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Set initial position on first buffer - Set the initial position on the first buffer, otherwise the queue - will grow without limits before the output thread is started. - https://bugzilla.gnome.org/show_bug.cgi?id=781673 - -2017-05-09 20:06:29 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Reset the pad's first buffer flag with the rest - There is not reason to have separate code to reset this one. - https://bugzilla.gnome.org/show_bug.cgi?id=781673 - -2017-05-09 20:05:55 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Reset pad on init - Factor out the pad reset code from the flushing and use it on init as well - https://bugzilla.gnome.org/show_bug.cgi?id=781673 - -2017-05-09 20:13:58 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Fix indentation - https://bugzilla.gnome.org/show_bug.cgi?id=781673 - -2017-02-23 15:42:08 -0800 fvanzile <frank@fvanzile.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: keep a ref to the active thread - With the macOS/iOS implementations, the active thread can change - multiple times over the life of a pipeline which would expose a race in - the thread tracking. - Fix by taking a ref on the active thread while the context is active. - https://bugzilla.gnome.org/show_bug.cgi?id=779202 - -2017-05-20 15:04:45 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - * meson_options.txt: - meson: add options to set package name and origin - https://bugzilla.gnome.org/show_bug.cgi?id=782172 - -2017-05-20 12:34:27 +0200 Josep Torra <jtorra@oblong.com> - - * tests/examples/avsamplesink/main.m: - * tests/examples/gl/cocoa/cocoa-videooverlay.m: - examples: fix macOS 9.12 deprecation warnings - Add #defines to allow older versions of macOS to use the new constant names. - -2017-05-20 12:19:08 +0200 Josep Torra <jtorra@oblong.com> - - * gst-libs/gst/gl/cocoa/gstgldisplay_cocoa.m: - cocoa: fix a recently introduced typo - Fixes gstgldisplay_cocoa.m:175:26: error: use of undeclared identifier 'singletone'. - -2017-05-20 12:16:50 +0200 Josep Torra <jtorra@oblong.com> - - * gst-libs/gst/gl/cocoa/gstgldisplay_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - cocoa: fix macOS 10.12 deprecation warnings - Add #defines to allow older versions of macOS to use the new constant names. - -2017-04-17 14:43:49 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Use correct (sub) fragment start when clipping chunk size - If we didn't download anything yet, we shouldn't use fragment.start but - the start position of the current sidx entry. - -2017-04-17 14:25:10 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Make sure to pass the next buffer after a seek with DISCONT flag - When we manually seek for skipping ahead in keyunit-only trickmode, we - have to enforce that ourselves as adaptivedemux does not know about the - seeks. - -2017-04-15 11:55:34 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Ensure that we never ever download over the current SIDX entry - Even if downloading more than needed to try to get the moof and first - keyframe both together. - -2017-04-13 22:49:29 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Take SIDX entry timestamp/duration into account for keyunit-only mode - And not the whole segment's timestamp/duration - -2017-04-13 17:12:26 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Reset parsing state correctly in various places - -2017-04-13 14:51:07 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Reset previous target_time when seeking - -2017-04-03 16:47:58 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Smooth out skip distances in keyframe-only trick modes - This ensures smoother playback. It looks weird if we first do a big - jump, then play a couple of consecutive frames, just to again skip ahead - quite a bit because we ran late again. - -2017-04-03 15:51:43 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Take configure max bitrate/framerate into account for keyframe skipping - And by default only produce up to 10 fps. - -2017-04-03 15:48:13 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Try harder to not run into a loop over the same fragment over and over - While still making sure to not jump ahead one fragment further than - needed. - -2017-03-15 17:47:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Add some debug output to the target time selection - -2017-03-28 14:12:12 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Use the current clock running time in addition to the QoS earliest time - -2017-03-27 17:52:36 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Download keyframes from the current position if we're far enough ahead - Far enough here means more than 500ms or 4 times the average keyframe - download time. There is no need to jump ahead by one average keyframe - download time in this case. - This makes playback smooth if the network is fast enough. - -2017-03-22 12:05:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix sync sample selection based on target time in reverse playback mode - -2017-03-22 11:21:47 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Snap-seek for skipping ahead and use actual keyframe distance in the current fragment if applicable - -2017-03-15 16:47:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Don't adjust for fragment duration twice when seeking ahead in KEYUNITS mode - -2017-03-15 16:46:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Add current fragment duration in reverse playback mode to the position - We play from the end of the fragment to the beginning, not from the - beginning backwards. - -2017-03-15 16:45:33 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Never take more than the current fragment duration for estimations inside the fragment - Taking the average might give us from results. - -2017-03-06 14:27:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Don't increase current position if we just downloaded the moof in KEYUNIT mode - -2017-01-12 15:54:37 +0100 Edward Hervey <edward@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Improve key-unit trick mode downloading - When dealing with key-unit trick mode downloads, the goal is to - provide the best "Quality of Experience". This is achieved by: - 1) maximizing the number of frames displayed per second - 2) avoiding "stalling" as much as possible (i.e. not downloading and - decoding frames fast enough) - This implementation achives this by: - 1) Knowing very precisely the current keyframe being download (i.e - more accurate than at the fragment level which might contain more - than one keyfram). This is the new "actual_position" variable - introduced by this commit - 2) Knowing the position of downstream (provided by QoS and stored - in the adaptivedemuxstream qos_earliest_time variable) - 3) Knowing how long it takes to request and fully download a keyframe - (the average_download_time variable) - Taking those 3 variables into account, whenever a keyframe has been - pushed downstream we calculate a "target time" (target_time variable) - which is the ideal next keyframe time to request so that: - 1) It will be requested/downloaded/demuxed/decoded in time to be - displayed without being too late - 2) It will not be too far ahead that it would cause too few frames - per second to be displayed. - How far ahead we will request is inversily proportional to how close - the actual position (actual_position) is from the downstream - position (qos_earliest_time). The more is buffered between the source - and the sink, the "closer" the target time will be, and therefore - the more frames per seconds will be displayed (up to the limit - of keyframes_per_second * absolute_rate). - -2017-01-11 17:11:27 +0100 Edward Hervey <edward@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Store average download time - This will be used to bound the download rate when working in - keyframe-only trick mode - -2017-01-11 17:08:36 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Add various comments to the code - -2016-11-15 08:13:27 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Store QoS time - Allows subclasses to know where downstream is and make decisions - based upon that - -2016-09-01 17:47:11 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Collect keyunit distance and size statistics - -2016-11-07 12:22:09 +0100 Edward Hervey <edward@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Disable bitrate switching in key-unit trick mode - This creates too much havoc for now - -2016-10-31 10:08:35 +0100 Edward Hervey <edward@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Use new adaptivedemux trickmode macro - Reduces the lines of code, and makes it a bit more readable - -2016-10-31 10:08:04 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Add a macro to know if we are in trickmode-keyunit - Reduces the amount of lines of code in subclasses - -2017-05-18 15:57:22 +0200 Jan Schmidt <jan@centricular.com> - - * sys/uvch264/gstuvch264_mjpgdemux.c: - uvch264src: Apply timestamps to outgoing aux buffers - When extracting an aux buffer from an MJPG carrier, at - *least* put the original timestamp on it, even if we - fail to apply any other timestamp (which we always do - at the moment, because the timestamp calculating code - was never finished). Apply a DTS using the camera - supplied delay value as well, assuming that there's - no re-ordering going on (there isn't in the C920, - which is really the only extant camera doing this - stuff) and a warning if that turns out not to be true. - -2017-05-18 15:23:14 +0300 Simon Himmelbauer <shimmelbauer@toolsonair.com> - - * ext/qt/gstqtglutility.cc: - qt: Use GST_GL_HAVE_PLATFORM_CGL instead of GST_GL_HAVE_PLATFORM_COCOA - The latter is not used/available anymore since years. Also fix a typo - in the include path for the Cocoa GL display header. - -2017-05-07 19:50:00 +0000 Dmitry Zhadinets <dzhadinets@gmail.com> - - * ext/opencv/gstmotioncells.cpp: - * ext/opencv/gstmotioncells.h: - motioncells: delay motionmaskcoords until caps arrive - motionmaskcoords is not applied on start because the information - about resolution isn't available until caps arrive. - https://bugzilla.gnome.org/show_bug.cgi?id=768666 - -2017-05-18 14:34:04 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Unref downstream caps after usage - https://bugzilla.gnome.org/show_bug.cgi?id=782771 - -2017-05-18 10:58:20 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/openh264/gstopenh264plugin.c: - * ext/resindvd/plugin.c: - * ext/srtp/gstsrtp.c: - * ext/teletextdec/gstteletextdec.c: - * ext/ttml/gstttmlplugin.c: - * ext/webrtcdsp/gstwebrtcdsp.cpp: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/gaudieffects/gstplugin.c: - * gst/pcapparse/plugin.c: - * sys/acmenc/acmenc.c: - * sys/applemedia/plugin.m: - * sys/msdk/gstmsdk.c: - * sys/vdpau/gstvdpau.c: - * sys/winks/gstksvideosrc.c: - Fix up package name and origin in some plugins - -2017-05-18 10:53:48 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/stereo/gststereo.c: - stereo: fix typo in plugin description - -2017-05-18 11:42:17 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix calculation of codec_data buffer size - -2017-05-17 16:26:38 +0800 Haihua Hu <jared.hu@nxp.com> - - * gst-libs/gst/gl/gstglformat.c: - glformat: Add missing GST_GL_RGB565 in some switch statement - https://bugzilla.gnome.org/show_bug.cgi?id=782736 - -2017-05-17 17:38:01 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/Makefile.am: - cocoa: Install gstgldisplay_cocoa.h - It's needed by e.g. qmlglsink. - -2017-05-15 20:31:31 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/directfb/dfbvideosink.c: - * ext/vulkan/vkbuffermemory.c: - * ext/vulkan/vkbufferpool.c: - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkdisplay.c: - * ext/vulkan/vkimagememory.c: - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkmemory.c: - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkwindow.c: - * ext/vulkan/wayland/vkdisplay_wayland.c: - * ext/vulkan/wayland/vkwindow_wayland.c: - * ext/vulkan/xcb/vkdisplay_xcb.c: - * ext/vulkan/xcb/vkwindow_xcb.c: - * ext/wayland/wlshmallocator.c: - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstgldisplay_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstgldisplay_egl.c: - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstglrenderbuffer.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglslstage.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/viv-fb/gstgldisplay_viv_fb.c: - * gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.c: - * gst-libs/gst/gl/wayland/gstgldisplay_wayland.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - * gst-libs/gst/gl/x11/gstgldisplay_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/uridownloader/gsturidownloader.c: - * sys/applemedia/corevideomemory.c: - * sys/applemedia/iosglmemory.c: - * sys/applemedia/iosurfacememory.c: - * sys/d3dvideosink/d3dhelpers.c: - * sys/kms/gstkmsallocator.c: - * sys/kms/gstkmsbufferpool.c: - * sys/shm/gstshmsink.c: - * sys/vdpau/gstvdpvideobufferpool.c: - * sys/vdpau/gstvdpvideomemory.c: - gst: Clear floating flag in constructor of all GstObject subclasses that are not owned by any parent - https://bugzilla.gnome.org/show_bug.cgi?id=743062 - -2017-05-15 14:23:44 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Sink the clock reference in the constructor - This is now needed as GstClock does not do that internally anymore, - because that broke bindings. - https://bugzilla.gnome.org/show_bug.cgi?id=743062 - -2017-05-17 10:58:05 +0800 Haihua Hu <jared.hu@nxp.com> - - * configure.ac: - * ext/qt/gstqtglutility.cc: - qml: Add EGL platform support for x11 backend - Add support for EGL platform when x11 is available. This can work - e.g. on imx6 platform. - https://bugzilla.gnome.org/show_bug.cgi?id=782718 - -2017-05-16 14:05:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * config.h.meson: - * configure.ac: - * ext/assrender/Makefile.am: - * ext/bs2b/Makefile.am: - * ext/bz2/Makefile.am: - * ext/chromaprint/Makefile.am: - * ext/curl/Makefile.am: - * ext/daala/Makefile.am: - * ext/dash/Makefile.am: - * ext/dc1394/Makefile.am: - * ext/directfb/Makefile.am: - * ext/dtls/Makefile.am: - * ext/dts/Makefile.am: - * ext/faac/Makefile.am: - * ext/faad/Makefile.am: - * ext/fdkaac/Makefile.am: - * ext/flite/Makefile.am: - * ext/fluidsynth/Makefile.am: - * ext/gl/Makefile.am: - * ext/gme/Makefile.am: - * ext/gsm/Makefile.am: - * ext/gtk/Makefile.am: - * ext/hls/Makefile.am: - * ext/iqa/Makefile.am: - * ext/kate/Makefile.am: - * ext/ladspa/Makefile.am: - * ext/libde265/Makefile.am: - * ext/libmms/Makefile.am: - * ext/lv2/Makefile.am: - * ext/modplug/Makefile.am: - * ext/mpeg2enc/Makefile.am: - * ext/mplex/Makefile.am: - * ext/musepack/Makefile.am: - * ext/neon/Makefile.am: - * ext/ofa/Makefile.am: - * ext/openal/Makefile.am: - * ext/opencv/Makefile.am: - * ext/openexr/Makefile.am: - * ext/openh264/Makefile.am: - * ext/openjpeg/Makefile.am: - * ext/openni2/Makefile.am: - * ext/opus/Makefile.am: - * ext/qt/Makefile.am: - * ext/resindvd/Makefile.am: - * ext/rsvg/Makefile.am: - * ext/rtmp/Makefile.am: - * ext/sbc/Makefile.am: - * ext/schroedinger/Makefile.am: - * ext/smoothstreaming/Makefile.am: - * ext/sndfile/Makefile.am: - * ext/soundtouch/Makefile.am: - * ext/spandsp/Makefile.am: - * ext/spc/Makefile.am: - * ext/srtp/Makefile.am: - * ext/teletextdec/Makefile.am: - * ext/ttml/Makefile.am: - * ext/voaacenc/Makefile.am: - * ext/voamrwbenc/Makefile.am: - * ext/vulkan/Makefile.am: - * ext/wayland/Makefile.am: - * ext/webp/Makefile.am: - * ext/wildmidi/Makefile.am: - * ext/x265/Makefile.am: - * ext/zbar/Makefile.am: - * gst-libs/gst/gl/cocoa/Makefile.am: - * gst-libs/gst/gl/eagl/Makefile.am: - * gst/accurip/Makefile.am: - * gst/adpcmdec/Makefile.am: - * gst/adpcmenc/Makefile.am: - * gst/aiff/Makefile.am: - * gst/asfmux/Makefile.am: - * gst/audiobuffersplit/Makefile.am: - * gst/audiofxbad/Makefile.am: - * gst/audiomixer/Makefile.am: - * gst/audiomixmatrix/Makefile.am: - * gst/audiovisualizers/Makefile.am: - * gst/autoconvert/Makefile.am: - * gst/bayer/Makefile.am: - * gst/camerabin2/Makefile.am: - * gst/coloreffects/Makefile.am: - * gst/compositor/Makefile.am: - * gst/debugutils/Makefile.am: - * gst/dvbsuboverlay/Makefile.am: - * gst/dvdspu/Makefile.am: - * gst/faceoverlay/Makefile.am: - * gst/festival/Makefile.am: - * gst/fieldanalysis/Makefile.am: - * gst/freeverb/Makefile.am: - * gst/frei0r/Makefile.am: - * gst/gaudieffects/Makefile.am: - * gst/gdp/Makefile.am: - * gst/geometrictransform/Makefile.am: - * gst/id3tag/Makefile.am: - * gst/inter/Makefile.am: - * gst/interlace/Makefile.am: - * gst/ivfparse/Makefile.am: - * gst/ivtc/Makefile.am: - * gst/jp2kdecimator/Makefile.am: - * gst/jpegformat/Makefile.am: - * gst/librfb/Makefile.am: - * gst/midi/Makefile.am: - * gst/mpegdemux/Makefile.am: - * gst/mpegpsmux/Makefile.am: - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsmux/Makefile.am: - * gst/mxf/Makefile.am: - * gst/netsim/Makefile.am: - * gst/onvif/Makefile.am: - * gst/pcapparse/Makefile.am: - * gst/pnm/Makefile.am: - * gst/rawparse/Makefile.am: - * gst/removesilence/Makefile.am: - * gst/sdp/Makefile.am: - * gst/segmentclip/Makefile.am: - * gst/siren/Makefile.am: - * gst/smooth/Makefile.am: - * gst/speed/Makefile.am: - * gst/stereo/Makefile.am: - * gst/subenc/Makefile.am: - * gst/timecode/Makefile.am: - * gst/videofilters/Makefile.am: - * gst/videoframe_audiolevel/Makefile.am: - * gst/videoparsers/Makefile.am: - * gst/videosignal/Makefile.am: - * gst/vmnc/Makefile.am: - * gst/y4m/Makefile.am: - * gst/yadif/Makefile.am: - * sys/acmenc/Makefile.am: - * sys/acmmp3dec/Makefile.am: - * sys/androidmedia/Makefile.am: - * sys/applemedia/Makefile.am: - * sys/bluez/Makefile.am: - * sys/d3dvideosink/Makefile.am: - * sys/decklink/Makefile.am: - * sys/directsound/Makefile.am: - * sys/dshowdecwrapper/Makefile.am: - * sys/dvb/Makefile.am: - * sys/fbdev/Makefile.am: - * sys/kms/Makefile.am: - * sys/msdk/Makefile.am: - * sys/nvenc/Makefile.am: - * sys/opensles/Makefile.am: - * sys/shm/Makefile.am: - * sys/tinyalsa/Makefile.am: - * sys/uvch264/Makefile.am: - * sys/vcd/Makefile.am: - * sys/vdpau/Makefile.am: - * sys/wasapi/Makefile.am: - * sys/winks/Makefile.am: - * sys/winscreencap/Makefile.am: - * tools/gst-project-maker: - Remove plugin specific static build option - Static and dynamic plugins now have the same interface. The standard - --enable-static/--enable-shared toggle are sufficient. - -2017-05-16 23:20:44 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Initialize sidx_position to GST_CLOCK_TIME_NONE - If a manifest has non-zero presentation time offset - (i.e., earliest presentation time specified by sidx box is not zero), - the initial sidx position shouldn't be zero. Since we cannot define - exact sidx position until parsing sidx box, set the value to unknown. - https://bugzilla.gnome.org/show_bug.cgi?id=782693 - -2017-05-15 18:10:11 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Handle stop_type:SET, stop:NONE - Seek values of type GST_SEEK_TYPE_SET with values of GST_CLOCK_TIME_NONE - are perfectly valid (we essentially don't modify the existing position) - -2017-05-15 16:37:14 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Copy min(gstreamer_stride, decklink_stride) per line - Instead of just bpp * width, which might be more than we can copy. - -2017-05-15 12:00:50 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglshader.c: - glshader: Make reference counting of attach() consistent - https://bugzilla.gnome.org/show_bug.cgi?id=747990 - https://bugzilla.gnome.org/show_bug.cgi?id=702960 - -2017-05-12 10:00:56 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/videoparsers/gsth265parse.c: - h265parse: fix caps leak in renegotiation - -2017-05-12 10:01:10 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix caps leak in renegotiation - -2017-05-09 10:32:05 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: fix negotiation with j2c and jpc both allowed upstream - If upstream supports both, but downstream supports only jpc, j2c - would have been selected as the first in the caps. - https://bugzilla.gnome.org/show_bug.cgi?id=782221 - -2017-04-19 13:47:57 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/Makefile.am: - * ext/hls/gsthlsplugin.c: - * ext/hls/gsthlssink2.c: - * ext/hls/gsthlssink2.h: - * ext/hls/meson.build: - hlssink2: New HLS sink element based on splitmuxsink - This embeds the muxer inside the sink and accepts elementary streams - while the old HLS sink required the muxer outside. Apart from that the - interface is the same as before. - Currently only mpegtsmux is supported, but support for other muxers is - just a matter of adding a property. - The advantage of the new sink is that it reduces complexity a lot and - properly handles pre-encoded streams with appropriately spaced - keyframes. - https://bugzilla.gnome.org/show_bug.cgi?id=781496 - -2017-02-25 12:37:46 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideo/audiosrc: Add GstReferenceTimestampMeta with the stream time to each buffer - This is basically a frame counter provided by the driver and it's - advancing at the speed of the HDMI/SDI input. Having this available on - each buffer allows to know what constant-framerate-based timestamp each - frame is corresponding to and can be used e.g. to write out files - accordingly without having the local pipeline clock timestamps used. - https://bugzilla.gnome.org/show_bug.cgi?id=779213 - -2017-05-12 11:35:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Consistently pass stream_time and stream_duration to audio/video src - It's the same value now, pass it consistently. - -2017-05-09 16:06:10 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/directsound/gstdirectsoundsrc.c: - * sys/directsound/gstdirectsoundsrc.h: - directsoundsrc: Use a GstClockID to wait instead of Sleep() - The main advantage is that our sleeps can be interrupted in case of - an src_reset(). Earlier, we would need to wait for a read to complete - before we could do a reset, which could take a long time. - https://bugzilla.gnome.org/show_bug.cgi?id=781249 - -2017-05-11 18:39:46 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Allow changing the output-buffer-duration at any time - Previously this was only allowed before the CAPS event arrived. - -2017-05-09 15:13:10 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/meson.build: - opencv/meson: Allow 3.2.0 - This was already added and tested in autoconf. - -2017-05-11 20:05:24 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglconfig.h.meson: - * gst-libs/gst/gl/meson.build: - build/gl/meson: check for GLES3/gl3ext.h existence - 791e7522ebcb75beb31fcace271dee1342d3505d for meson - https://bugzilla.gnome.org/show_bug.cgi?id=781885 - -2017-05-11 10:29:58 +0200 Jens Georg <mail@jensge.org> - - * configure.ac: - * gst-libs/gst/gl/gstglapi.h: - build: Check for GLES3/gl3ext.h existence - Some OpenGL drivers do not ship this but use GLES2/gl2ext.h instead. - This is also in line with Khronos's recommendations - https://bugzilla.gnome.org/show_bug.cgi?id=781885 - -2017-05-10 22:29:10 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/msdk/meson.build: - msdk: Declare libmfx.a as a C++ static library - This lets meson know that the overall plugin needs built with C++ - linking. - https://bugzilla.gnome.org/show_bug.cgi?id=781561 - -2017-05-10 15:59:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Always use the video stream time for audio too - The audio packet times can be completely unrelated to the video stream - time, depending on the card. While this looks like a bug in the driver, - just always using the video stream time (which is correct) works as a - workaround for now. - -2017-05-09 15:06:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/meson.build: - opencv/meson: Ensure variable opencv_found is set - If the required version is not satisfied, we need to make sure this - variable is set, otherwise build will fail. - -2017-05-09 13:16:50 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/meson.build: - * ext/webrtcdsp/meson.build: - * meson.build: - Bump and update for meson 0.40.1 - This patch bumps the required meson to 0.40.1 as gstreamer core just - did, and cleanup some code to use a feature from 0.37 that allow - specifying version range when checking dependency. - https://bugzilla.gnome.org/show_bug.cgi?id=780654 - -2017-05-05 11:05:40 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusparse.c: - opusparse: do not drop preskip and gain from OpusHead header - https://bugzilla.gnome.org/show_bug.cgi?id=753275 - -2017-05-09 09:47:10 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/qt/gstplugin.cc: - qmlgl: Make the plugin name match the pugin file name - -2017-05-09 09:43:01 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gme/gstgme.c: - gme: Make the plugin name match the plugin library name - -2017-05-09 09:41:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/neon/gstneonhttpsrc.c: - neon: Make the plugin name match the plugin library - -2017-05-09 11:25:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: Only use glDrawBuffer if available - Otherwise fall back to glDrawBuffers. Also check if glReadBuffer exists - before using it. - glDrawBuffer does not exist for GLES, only glDrawBuffers does. - https://bugzilla.gnome.org/show_bug.cgi?id=782376 - -2017-05-08 15:34:50 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Handle more live seeking use-cases - This commit fixes the following assumptions with live seeking: - 1) start was always valid and of type GST_SEEK_TYPE_SET - 2) direction was always forward - 3) stop should be offsetted when handling non-accurate seeks before - the range start position. - In order to handle more live seeking use-cases (including reverse playback), - only do non-accurate start/stop value clamping for GST_SEEK_TYPE_SET values. - Also add a bit more debugging lines for issues - https://bugzilla.gnome.org/show_bug.cgi?id=782330 - -2017-05-05 18:25:43 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Implement GST_SEEK_TYPE_END usage for live - When dealing with live streams, we can't rely on GstSegment calculation - since it uses the segment duration to calculate the absolute values. - But since we are dealing with live *and* we know the ranges, we can - compute the absolute seeking values using the range stop (i.e. "now") - as the END position. - Allows seeking back to "live" by using start_type:GST_SEEK_TYPE_END - and start:0 - https://bugzilla.gnome.org/show_bug.cgi?id=782228 - -2017-05-08 11:01:39 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * meson.build: - meson: Ignore msvc warnings in C++ as well - We were only ignoring the listed msvc warnings for C language - files and not C++. This was working by the coincidence that we did - not have any instances of these warnings in C++ files. Lately the - build of decklink has been fixed on windows, and it has an - instance of one of these warnings in a C++ file. - https://bugzilla.gnome.org/show_bug.cgi?id=782345 - -2017-05-03 22:50:27 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/directsound/gstdirectsoundsrc.c: - * sys/directsound/gstdirectsoundsrc.h: - directsoundsrc: Use latency-time and buffer-time settings - Earlier, the plugin was ignoring those settings and blindly setting - buffer-time to 2 seconds and latency-time to 200ms, which forced all - pipelines to have a minimum latency of 200ms + sink latency. - The values of segsize and segtotal were also not derived correctly. - Now we obey these values, and you can get close to the previous - behaviour by setting buffer-time and latency-time manually. Note that - they are set in microseconds. - As a consequence, when we haven't received enough data from the - device, we now sleep for a time proportional to the data remaining. - However, Directsound is a deprecated API so it maintains its own - software ringbuffer which updates at arbitrary intervals. Hence we - might have to wait a full segsize to get the last 10% of data. To - avoid tight loops, we clamp our sleep floor at 10ms. - In my testing, this keeps the wakeups not-too-high (proportional to - the latency-time set on the source). Further improvements should be - made by fixing the WASAPI audio source plugin instead of this. - Directsound is deprecated and as the comments explain, it is - impossible to get low latency, decent quality, or good performance - from it. - Based on a patch by Sebastian Dröge <sebastian@centricular.com> - https://bugzilla.gnome.org/show_bug.cgi?id=781249 - -2017-05-07 11:47:40 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: fix whole example launch line actually - -2017-05-07 11:41:06 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: remove extraneous \ from example launch line in docs - -2017-05-05 18:22:18 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Allow live seeking range to go back to "now" - The allowed live seek ranges returned by subclasses are "inclusive", that is - to say that the "range_stop" value they return is the highest acceptable position - one can seek to (i.e. "now"). - Allow seeking to exactly that value - -2017-05-05 18:52:24 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - Revert "decklink: Fix debug logging warnings on Windows" - This reverts commit 845832263ba6b9e135b23e9a29c9d109cb2ee9c4. - The commit broke cross-mingw CI: - https://ci.gstreamer.net/job/GStreamer-master/8659/console - It seems that cross-mingw on Autotools and native-mingw on Meson - disagree about the size of HRESULT. Revert for now till I can - investigate the Meson side of things some more. - -2017-05-05 04:30:59 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/meson.build: - decklink: Fix linking on MinGW - MinGW does not provide comsupp.lib, so there's no implementation of - _com_util::ConvertBSTRToString. Use a fallback implementation that - uses wcstombs() instead. - On MinGW we also truncate the name to 100 chars which should be fine. - -2017-05-05 04:02:29 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/decklink/gstdecklink.h: - decklink: Fix building on Windows - BSTR is already a pointer to a string - -2017-05-05 03:59:45 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Fix debug logging warnings on Windows - HRESULT is unsigned long int, not unsigned int - -2017-05-05 04:01:38 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/decklink/meson.build: - meson: Fix decklink building on Windows - Needs comsuppw, and does not need libdl or pthread. - -2017-05-04 18:59:14 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * meson.build: - Back to development - -=== release 1.12.0 === - -2017-05-04 15:39:05 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gtk.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-opengl.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qt.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtcdsp.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * meson.build: - Release 1.12.0 - -2017-05-04 15:10:52 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/fur.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2017-05-04 13:47:37 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/ky.po: - * po/sv.po: - po: Update translations - -2017-05-03 21:13:38 +0800 Ting-Wei Lan <lantw@src.gnome.org> - - * ext/hls/meson.build: - meson: hls: libm is required because m3u8.c uses math.h - https://bugzilla.gnome.org/show_bug.cgi?id=782119 - -2017-05-03 13:21:42 +0200 Josep Torra <jtorra@oblong.com> - - * configure.ac: - * sys/applemedia/Makefile.am: - * sys/applemedia/plugin.m: - * sys/applemedia/qtkitvideosrc.h: - * sys/applemedia/qtkitvideosrc.m: - qtkit: drop the qtkitvideosrc element - The QTKit framework had been deprecated for long in favour of AVFundation - framework and we already have avfvideosrc that provides the same - functionality. - https://bugzilla.gnome.org/show_bug.cgi?id=782078 - -2017-04-07 17:13:52 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/webrtcdsp/gstwebrtcdsp.cpp: - webrtcdsp: fix doc string of echo-cancel property - If the echo probe element is not found, initialization actually fails - instead of silently working with echo-cancel disabled. - https://bugzilla.gnome.org/show_bug.cgi?id=780976 - -2017-05-02 13:24:30 +0800 Haihua Hu <jared.hu@nxp.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: passthrough composition caps features in directviv upload - https://bugzilla.gnome.org/show_bug.cgi?id=782046 - -2017-04-27 21:21:44 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/adaptivedemux/Makefile.am: - * tests/check/Makefile.am: - tests: fix link problem on centos7 - And put LIBS before -lgstfoo in adaptivedemux Makefile.am - -=== release 1.11.91 === - -2017-04-27 17:30:38 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gtk.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-opengl.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qt.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtcdsp.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * meson.build: - Release 1.11.91 - -2017-04-27 16:03:28 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/fur.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2017-04-27 15:28:44 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/LINGUAS: - * po/fur.po: - * po/ky.po: - * po/sv.po: - po: Update translations - -2017-04-26 17:46:10 +0800 shakin chou <shakin@outlook.com> - - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - amcvideodec/enc: Correctly check for no PTS on input buffers - MediaCodec gives us a presentation timestamp of 0 if it does not know - anything, but GStreamer gives us GST_CLOCK_TIME_NONE. Don't mix up these - two. - https://bugzilla.gnome.org/show_bug.cgi?id=780190 - -2017-04-25 15:15:13 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/ttmlparse.c: - ttmlparse: Consolidate adjacent co-styled inline elements - A common subtitling use case is live-generated subtitles, in which each - new word is contained in its own span, and the spans are displayed - sequentially, with the effect that lines of displayed subtitles are - built up word-by-word. - This can, however, cause problems when the number of words in a block is - greater than the number of allowed GstMemorys in a GstBuffer. - Since in this use case each span will have the same styling as adjacent - spans, we can join adjacent spans (and other inline elements, such as - breaks) into a single element containing the concatenated text of each, - thus avoiding the limit of GstMemorys in a GstBuffer and also reducing - the amount of styling/layout metadata that is attached to each buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=781725 - -2017-04-25 15:33:38 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/ttmlparse.c: - ttmlparse: Don't add GstMemorys to a GstBuffer that is full - The parser stores the text from each inline element of a scene in its - own GstMemory, which is inserted in the GstBuffer containing the scene - data. However, GstBuffers can contain only a limited number of - GstMemorys. Therefore, don't add more than the maximum number of - GstMemorys to each buffer, and warn if this is attempted. - https://bugzilla.gnome.org/show_bug.cgi?id=781725 - -2017-04-25 15:10:22 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/ttmlparse.c: - ttmlparse: Store newline as text of br element - When parsing <br> elements, store an actual newline in the text field of - the created TtmlElement. They then don't need to be treated as a - separate case from anon-span elements when being processed. - https://bugzilla.gnome.org/show_bug.cgi?id=781725 - -2017-04-25 10:17:49 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/ttmlparse.c: - ttmlparse: Replace repeated warning code with a function. - Encapsulates in a function the code that warns of an illegally - positioned element, rather than repeating the same code multiple times. - Also frees a string allocated by ttml_get_element_type_string, which was - previously being leaked. - https://bugzilla.gnome.org/show_bug.cgi?id=781725 - -2017-04-24 11:34:41 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/ttmlparse.c: - ttmlparse: Remove redundant text_index field of TtmlElement - https://bugzilla.gnome.org/show_bug.cgi?id=781725 - -2017-04-25 10:04:50 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/ttmlparse.c: - ttmlparse: Don't leak TtmlElements when deleting GNodes/trees. - https://bugzilla.gnome.org/show_bug.cgi?id=781725 - -2017-04-25 13:22:33 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: Fix compiler warning - ../subprojects/gst-plugins-bad/ext/smoothstreaming/gstmssdemux.c: In function ‘gst_mss_demux_requires_periodical_playlist_update’: - ../subprojects/gst-plugins-bad/ext/smoothstreaming/gstmssdemux.c:729:16: error: unused variable ‘mssdemux’ -Werror=unused-variable - GstMssDemux *mssdemux = GST_MSS_DEMUX_CAST (demux); - ^~~~~~~~ - cc1: all warnings being treated as errors - -2017-04-07 16:33:21 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: separate manifest update task from download tasks - Rationale is to allow the manifest update task to continue running while - seeks are occurring. Otherwise, if the user reliably performs a seek - before the manifest is updated, then as the manifest task is reset on - seeks (and thus the time to wait between manifest updates), the manifest - would never be updated. - This fix makes the manifest update task free-running and continously - update even during seeks. - -2017-04-07 14:42:24 +1000 Matthew Waters <matthew@centricular.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - mss: always periodically update the manifest taking the new fragments - Without this, for streams where the content is stored indefinitely and - can be seeked on, the duration would never increase when in paused or, - until we reached near the end of the currently advertised stream (where - the internal fragment parser would see descriptions of new fragments). - -2017-04-24 20:28:06 +0100 Tim-Philipp Müller <tim@centricular.com> - - * common: - Automatic update of common submodule - From 60aeef6 to 48a5d85 - -2017-04-21 21:29:05 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Add msm to the list of drivers - This prevent having to set the driver-name explicitly when running on - Qualcomm/MSM boards. - -2017-04-20 14:43:45 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/ttmlparse.c: - ttmlparse: Convert tabs to spaces in input - The TTML spec has an issue in which tab (U+0009) characters that are - first in a sequence of whitespace characters are not suppressed at the - start and end of line areas. This issue was reported in 1 and the - editor of the TTML specs confirmed that this was not the intention - behind the spec. - The editor has created an issue to fix this in both the TTML1 and TTML2 - specs 2, giving a proposal of what the spec should say. This patch - updates ttmlparse to implement the intended behaviour as proposed, in - which tabs in the input are converted to spaces before processing. - 1 https://github.com/w3c/imsc/issues/224 - 2 https://github.com/w3c/ttml1/issues/235 - https://bugzilla.gnome.org/show_bug.cgi?id=781539 - -2017-04-20 10:24:30 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/ttmlparse.c: - ttmlparse: Fix potential resource leak identified by coverity. - If multiple styles/regions with the same ID are present in the input - (which is not allowed in TTML), use the last and give a warning. - Fixes CID #1405134. - -2017-04-20 10:22:49 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - ttmlrender: Fix potential resource leak identified by coverity - Fixes CID #1405133. - -2017-04-19 19:08:41 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - Revert "decklinkvideo/audiosrc: Add GstReferenceTimestampMeta with the stream time to each buffer" - This reverts commit d5684d5b145a3eb0e23476f18669d1ffa552c5de. - This shouldn't have been merged before 1.12. - -2017-02-25 12:37:46 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideo/audiosrc: Add GstReferenceTimestampMeta with the stream time to each buffer - This is basically a frame counter provided by the driver and it's - advancing at the speed of the HDMI/SDI input. Having this available on - each buffer allows to know what constant-framerate-based timestamp each - frame is corresponding to and can be used e.g. to write out files - accordingly without having the local pipeline clock timestamps used. - https://bugzilla.gnome.org/show_bug.cgi?id=779213 - -2017-04-19 16:06:52 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - ttmlrender: Fix potential problem identified by clang - Clang's static analyser found potential code paths in which variables - were being used in comparisons when uninitialised. Fix by properly - handling out-of-range value returned by gst_ttml_get_element_index. - -2017-04-19 14:07:06 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/ttmlparse.c: - ttmlparse: Fix potential NULL dereference identified by coverity - Hopefully fixes CID #1405131. - -2017-04-19 14:00:47 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - ttmlrender: Fix integer handling issue identified by coverity - Fixes CID #1405132. - -2017-04-19 12:36:03 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlssink.c: - * ext/hls/gsthlssink.h: - hlssink: Remove some unused struct fields - -2017-04-17 19:25:49 +0200 Ole André Vadla Ravnås <oleavr@gmail.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: Stop bitstream thread in ::stop() - Otherwise we are likely to crash if EOS didn't happen yet. - https://bugzilla.gnome.org/show_bug.cgi?id=781410 - -2017-04-14 13:58:21 +0200 Ole André Vadla Ravnås <oleavr@gmail.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: Update to the current gstreamer-gl API - https://bugzilla.gnome.org/show_bug.cgi?id=781410 - -2017-04-14 13:57:19 +0200 Ole André Vadla Ravnås <oleavr@gmail.com> - - * configure.ac: - nvenc: Add support for the Cuda 8.0 SDK - https://bugzilla.gnome.org/show_bug.cgi?id=781410 - -2017-04-12 20:01:40 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdparser.c: - dashdemux: Rewrite ISOBMFF & SIDX handling - The previous code was handling both as separate steps and then tried to - combine the results, but this resulted in all kinds of bugs which showed - themselves as failures during seeking and offset tracking getting wrong. - This also showed itself with gst-validate on the sample stream. - The rewritten code now parses everything in one go and tracks the - current offset only once, and as a side effect simplifies the code a - lot. - Also added is detection of SIDX that point to other SIDX instead of - actual media segments, e.g. with this stream: - http://dash.akamaized.net/dash264/TestCases/1a/sony/SNE_DASH_SD_CASE1A_REVISED.mpd - Support for this will have to be added at some point but that should - also be easier with the rewritten code. - https://bugzilla.gnome.org/show_bug.cgi?id=781233 - -2017-04-15 18:17:29 -0700 Thiago Santos <thiagossantos@gmail.com> - - * tests/check/elements/dash_mpd.c: - tests: dash_mpd: add some inheritance tests - Tests regarding inheritance of segment template attributes - -2017-04-12 16:58:10 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Do sanity check of Segment Base Information only at Repesentation level - Spec 5.3.9.2 is saying about the existence of duration and SegmentTimeline - only for Representation level. Other level such as Period or AdaptationSet - might not have the attributes. - https://bugzilla.gnome.org/show_bug.cgi?id=780570 - -2017-03-27 10:06:30 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Allow inherit Segment{Base,Template} from Period - Similar to SegmentList, Representation can inherit Segment{Base,Template} - from Period - https://bugzilla.gnome.org/show_bug.cgi?id=780570 - -2017-04-14 18:16:28 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Don't hold locks when pushing FLUSH_START - Some actions (Qos, reconfigure, ...) might take place before we finish pushing out flush_start. - One problem would be that: - 1) The QOS handling in adaptivedemux takes the MANIFEST LOCK - That QOS event comes from basesink with its PREROLL_LOCK taken - 2) FLUSH_START is sent from adaptivedemux with the MANIFEST_LOCK taken and the basesink flushing handler needs to take the PREROLL_LOCK - => deadlock - https://bugzilla.gnome.org/show_bug.cgi?id=781320 - -2017-04-13 13:27:57 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Fix segment creation/adaptation some more - Take into account the segment stop and the negative rates - https://bugzilla.gnome.org/show_bug.cgi?id=781267 - -2017-04-14 01:56:50 +1000 Jan Schmidt <jan@centricular.com> - - * ext/opencv/MotionCells.cpp: - motioncells: Fix cell string generation - Allow 1 extra char in the tmp buffer where the motion cell - snippets are generated, so that it doesn't leave off a comma - when dealing with cells that have 2 numerals in both indices - -2017-04-13 11:33:41 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/ttml/gstttmlplugin.c: - ttml: build, but don't autoplug unless GST_TTML_AUTOPLUG env var is set - Don't hide build behind --enable-experimental. Our goal is to not - autoplug it for now, so let's just always build it if the dependencies - are there and hide autoplugging enablement behind an env var. - -2016-10-19 14:56:06 +0200 Philipp Zabel <p.zabel@pengutronix.de> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: if the plane can not scale, retry without scaling and remember - Retry the drmModeSetPlane call without scaling if the first try fails, - and remember not to scale anymore. - https://bugzilla.gnome.org/show_bug.cgi?id=781188 - -2017-04-12 20:09:33 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - Revert "dashdemux: Fix issue when manifest update sets slow start without passing necessary header & caps changes downstream" - This reverts commit c9fbf3459a719b2c68ba69ddabd373ea9bf804a2. - The representation ID comparision here was wrong and triggering always - if the ID did *not* change, causing needless redownloading of the - header. The sample stream provided in the bug does not exist anymore. - -2017-03-08 15:01:13 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * ext/assrender/gstassrender.c: - * ext/bs2b/gstbs2b.c: - * ext/chromaprint/gstchromaprint.c: - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlfilesink.c: - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlhttpsink.c: - * ext/curl/gstcurlsftpsink.c: - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/gstcurlsshsink.c: - * ext/curl/gstcurltlssink.c: - * ext/daala/gstdaaladec.c: - * ext/daala/gstdaalaenc.c: - * ext/dash/gstdashdemux.c: - * ext/dc1394/gstdc1394src.c: - * ext/directfb/dfbvideosink.c: - * ext/dts/gstdtsdec.c: - * ext/faac/gstfaac.c: - * ext/faad/gstfaad.c: - * ext/fluidsynth/gstfluiddec.c: - * ext/gl/gstglbumper.c: - * ext/gl/gstglcolorbalance.c: - * ext/gl/gstglcolorscale.c: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstglfilterapp.c: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglfilterreflectedscreen.c: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglmosaic.c: - * ext/gl/gstgloverlay.c: - * ext/gl/gstglstereomix.c: - * ext/gl/gstglstereosplit.c: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstgltransformation.c: - * ext/gl/gstglvideoflip.c: - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglviewconvert.c: - * ext/gl/gstopengl.c: - * ext/gtk/gstgtkbasesink.c: - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtksink.c: - * ext/gtk/gtkgstglwidget.c: - * ext/gtk/gtkgstwidget.c: - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlssink.c: - * ext/iqa/iqa.c: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkatetiger.c: - * ext/ladspa/gstladspa.c: - * ext/libde265/libde265-dec.c: - * ext/lv2/gstlv2.c: - * ext/openal/gstopenalsink.c: - * ext/openal/gstopenalsrc.c: - * ext/opus/gstopusparse.c: - * ext/resindvd/rsndec.c: - * ext/resindvd/rsninputselector.c: - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgoverlay.c: - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsrc.c: - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcenc.c: - * ext/smoothstreaming/gstmssdemux.c: - * ext/spandsp/gstdtmfdetect.c: - * ext/spandsp/gstspanplc.c: - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpenc.c: - * ext/teletextdec/gstteletextdec.c: - * ext/ttml/gstttmlparse.c: - * ext/ttml/gstttmlrender.c: - * ext/ttml/subtitle.c: - * ext/ttml/subtitlemeta.c: - * ext/voaacenc/gstvoaacenc.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/vulkan/gstvulkan.c: - * ext/vulkan/vkbuffermemory.c: - * ext/vulkan/vkbufferpool.c: - * ext/vulkan/vkimagememory.c: - * ext/vulkan/vkmemory.c: - * ext/vulkan/vksink.c: - * ext/vulkan/vkupload.c: - * ext/vulkan/vkwindow.c: - * ext/wayland/gstwaylandsink.c: - * ext/wildmidi/gstwildmidi.c: - * ext/x265/gstx265enc.c: - * ext/zbar/gstzbar.c: - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gstjpeg2000sampling.c: - * gst-libs/gst/codecparsers/gstjpegparser.c: - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvp8parser.c: - * gst-libs/gst/codecparsers/gstvp8parser.h: - * gst-libs/gst/codecparsers/gstvp9parser.c: - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglformat.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstglquery.c: - * gst-libs/gst/gl/gstglrenderbuffer.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglsl.c: - * gst-libs/gst/gl/gstglsyncmeta.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gst-scte-section.h: - * gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.c: - * gst-libs/gst/player/gstplayer-media-info.c: - * gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c: - * gst-libs/gst/player/gstplayer-visualization.c: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst/accurip/gstaccurip.c: - * gst/aiff/aiffmux.c: - * gst/aiff/aiffparse.c: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfobjects.c: - * gst/audiofxbad/gstaudiochannelmix.c: - * gst/audiomixer/gstaudiointerleave.c: - * gst/audiomixer/gstaudiomixer.c: - * gst/audiomixmatrix/gstaudiomixmatrix.c: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstwavescope.c: - * gst/autoconvert/gstautoconvert.c: - * gst/bayer/gstbayer2rgb.c: - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstdigitalzoom.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/coloreffects/gstchromahold.c: - * gst/coloreffects/gstcoloreffects.c: - * gst/compositor/compositor.c: - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/gstchopmydata.c: - * gst/debugutils/gstdebugspy.c: - * gst/debugutils/gsterrorignore.c: - * gst/debugutils/gstwatchdog.c: - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/dvb-sub.h: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/festival/gstfestival.c: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/freeverb/gstfreeverb.c: - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstsolarize.c: - * gst/gdp/dataprotocol.c: - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - * gst/geometrictransform/gstbulge.c: - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstdiffuse.c: - * gst/geometrictransform/gstfisheye.c: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstmarble.c: - * gst/geometrictransform/gstmirror.c: - * gst/geometrictransform/gstperspective.c: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstrotate.c: - * gst/geometrictransform/gstsphere.c: - * gst/geometrictransform/gstsquare.c: - * gst/geometrictransform/gststretch.c: - * gst/geometrictransform/gsttunnel.c: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gstwaterripple.c: - * gst/id3tag/gstid3mux.c: - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosrc.c: - * gst/interlace/gstinterlace.c: - * gst/ivtc/gstcombdetect.c: - * gst/ivtc/gstivtc.c: - * gst/jp2kdecimator/gstjp2kdecimator.c: - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - * gst/midi/midiparse.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmux.c: - * gst/pcapparse/gstirtspparse.c: - * gst/pcapparse/gstpcapparse.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - * gst/rawparse/gstaudioparse.c: - * gst/rawparse/gstvideoparse.c: - * gst/removesilence/gstremovesilence.c: - * gst/sdp/gstsdpdemux.c: - * gst/siren/gstsirendec.c: - * gst/siren/gstsirenenc.c: - * gst/speed/gstspeed.c: - * gst/stereo/gststereo.c: - * gst/timecode/gstavwait.c: - * gst/timecode/gsttimecodestamper.c: - * gst/videofilters/gstscenechange.c: - * gst/videofilters/gstvideodiff.c: - * gst/videofilters/gstzebrastripe.c: - * gst/videoframe_audiolevel/gstvideoframe-audiolevel.c: - * gst/videoparsers/gstdiracparse.c: - * gst/videosignal/gstsimplevideomark.c: - * gst/videosignal/gstsimplevideomarkdetect.c: - * gst/videosignal/gstvideoanalyse.c: - * gst/y4m/gsty4mdec.c: - * gst/yadif/gstyadif.c: - * sys/androidmedia/gstahcsrc.c: - * sys/androidmedia/gstahssrc.c: - * sys/applemedia/atdec.c: - * sys/applemedia/vtdec.c: - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dvideosink.c: - * sys/directsound/gstdirectsoundsrc.c: - * sys/dvb/gstdvbsrc.c: - * sys/kms/gstkmssink.c: - * sys/opensles/openslessink.c: - * sys/opensles/openslessrc.c: - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsrc.c: - * sys/tinyalsa/tinyalsasink.c: - * sys/uvch264/gstuvch264_mjpgdemux.c: - * sys/uvch264/gstuvch264_src.c: - * sys/vdpau/gstvdpsink.h: - * sys/vdpau/gstvdpvideomemory.c: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/winks/gstksvideosrc.c: - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.c: - docs: Port all docstring to gtk-doc markdown - -2017-03-27 15:29:16 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * gst/rawparse/gstvideoparse.c: - rawvideoparse: videoparse now uses GstValueArray and not GValueArray - -2017-04-12 09:35:16 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * gst-libs/gst/gl/gstglsl.h: - docs: Stop linking to inexistant symbols - -2017-04-12 12:06:52 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * gst-libs/gst/base/gstaggregator.h: - aggregator: Make instance var name match between .c and .h - Making GI happy - -2017-04-12 13:17:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/directsound/gstdirectsoundsrc.c: - * sys/directsound/gstdirectsoundsrc.h: - Revert "directsoundsrc: Correctly calculate segsize and segtotal" - This reverts commit 6d256d9908e292f6c593bf45e69354f6b613cc8b. - It was configuring the period/buffer size in a way that often causes - drop-outs or complete underruns. Needs further investigation. - -2017-04-12 10:54:23 +0200 Edward Hervey <edward@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Fix leak - The error: location takes care of freeing new_representation - CID #1405027 - -2017-04-12 10:54:05 +0200 Edward Hervey <edward@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Run gst-indent - -2017-04-11 15:46:19 +0300 Claudio Saavedra <csaavedra@igalia.com> - - * gst-libs/gst/gl/meson.build: - meson: add missing gstglrenderbuffer.h header - https://bugzilla.gnome.org/show_bug.cgi?id=781179 - -2017-04-11 09:42:49 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/decklink/meson.build: - meson: decklink: fix meson configure error on macOS - "meson encountered an error in file - sys/decklink/meson.build, line 33, column 2: - Invalid use of addition: must be str, not list" - Also remove nonsensical linker flags on windows. - https://bugzilla.gnome.org/show_bug.cgi?id=781156 - -2016-12-30 14:05:30 -0500 Fabian Orccon <cfoch.fabian@gmail.com> - - * configure.ac: - * gst/faceoverlay/gstfaceoverlay.c: - * gst/meson.build: - faceoverlay: Port to GStreamer 1.x - https://bugzilla.gnome.org/show_bug.cgi?id=764011 - -2017-04-05 16:03:08 -0500 Fabian Orccon <cfoch.fabian@gmail.com> - - * configure.ac: - * gst/faceoverlay/Makefile.am: - * gst/faceoverlay/gstfaceoverlay.c: - * gst/faceoverlay/gstfaceoverlay.h: - * gst/faceoverlay/meson.build: - * gst/meson.build: - faceoverlay: Revert deletion - https://bugzilla.gnome.org/show_bug.cgi?id=764011 - -2017-03-03 09:08:06 +0100 Jürgen Sachs <juergen.sachs@metz-ce.de> - - * ext/dash/gstmpdparser.c: - dashdemux/mpdparser: Fix wrong false sanity check for manifests with nested SegmentTemplate nodes - https://bugzilla.gnome.org/show_bug.cgi?id=778237 - -2017-04-10 23:49:16 +0100 Tim-Philipp Müller <tim@centricular.com> - - * autogen.sh: - * common: - Automatic update of common submodule - From 39ac2f5 to 60aeef6 - -2017-04-10 18:46:01 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Handle current SIDX before current position in normal mode like in keyunit-only trick mode - Otherwise we'll get into an infinite loop here. Now this is still not - correct and will cause a clean error, but at least it won't hang forever - anymore. - -2017-04-07 12:19:27 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * gst-libs/gst/gl/gstglconfig.h.meson: - * gst-libs/gst/gl/meson.build: - meson: gl: set default value of 0 for glconf vars - meson's configure_file emits only a comment like /* #undef ... */ - for values which are unset in the configuration_data. For - gstglconfig.h, this differs from the autotools build where the - preprocessor definitions are always either 0 or 1. So loop over a - list of variables to set to zero as default. - Also sync up the gstglconfig.h.meson file with the additional - macros defined by the autotools build. - https://bugzilla.gnome.org/show_bug.cgi?id=781043 - -2017-04-07 10:19:43 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/base/gstaggregator.c: - gstaggregator: fix event use after free - https://bugzilla.gnome.org/show_bug.cgi?id=781017 - -2017-04-07 10:39:31 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mxf/mxfmux.c: - mxfmux: fix index entry leak - https://bugzilla.gnome.org/show_bug.cgi?id=781023 - -2017-04-07 10:36:34 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * tests/check/elements/videoframe-audiolevel.c: - tests: fix leak in videoframe-audiolevel test - also add braces for the else case - https://bugzilla.gnome.org/show_bug.cgi?id=781022 - -2017-04-07 10:30:09 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - glcontext: fix display leak - https://bugzilla.gnome.org/show_bug.cgi?id=781019 - -2017-04-07 10:24:19 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: fix list leak - Windows aren't always removed in time, and it turns out to be - very, very hard to remove a window in a way that's not racy and - not deadlocky. Since the window itself doesn't leak, freeing - the list on object destruction is enough. - https://bugzilla.gnome.org/show_bug.cgi?id=781018 - -2017-04-07 10:43:51 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegts: fix invalid memory access in language descriptor - Also add a couple sanity asserts/returns - https://bugzilla.gnome.org/show_bug.cgi?id=781024 - -2017-03-27 09:56:32 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - mpdparser: Report error if Representation is invalid - Spec "5.3.5 Representation" is saying that - id and bandwidth attributes are mandatory fields. - https://bugzilla.gnome.org/show_bug.cgi?id=780569 - -2017-03-24 15:04:21 +0900 Seungha Yang <sh.yang@lge.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Retry downloading a fragment immediately if any in live streaming - At the moment that demux is waiting manifest update, the target sequence - of fragment was advanced already. So, checking stream_has_next_fragment() - means looking for the next fragment of target fragment. - This might cause unexpected buffering if each fragment has - large duration and manifest is listing only limited number of fragments. - https://bugzilla.gnome.org/show_bug.cgi?id=780494 - -2017-03-24 08:16:35 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix SEEK of multi-period On-Demand profile - For each period, media presentation is the relative to the - period-start time. So SIDX seek position should be target seek - position minus period-start. Also, if presentationTimeOffset - is defined, the value should be compensated - https://bugzilla.gnome.org/show_bug.cgi?id=780397 - -2017-04-04 11:47:55 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlparse.c: - ttmlparse: push segment events downstream - Without this, subtitles will stop after seeking. - https://bugzilla.gnome.org/show_bug.cgi?id=780897 - -2017-04-07 10:16:46 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/ttmlparse.c: - ttmlparse: don't filter out untimed whitespace - Significant whitespace in elements that don't have begin/end values - should inherit timing from its parent, or if no its parents have no - timing, from the document's Root Temporal Extent. Currently, such - whitespace is removed, which is not spec-compliant. Fix this by - retaining whitespace in content nodes, and assigning a Root Temporal - Extent of 24 hours to any significant whitespace whose parents have no - associated timing. - https://bugzilla.gnome.org/show_bug.cgi?id=781027 - -2017-03-22 10:41:44 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlparse.c: - ttmlparse: don't leak caps. - https://bugzilla.gnome.org/show_bug.cgi?id=780402 - -2017-03-22 10:35:38 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - ttmlrender: improve function comments/descriptions - https://bugzilla.gnome.org/show_bug.cgi?id=780402 - -2017-03-22 10:30:47 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - ttmlrender: relocate type definitions to head of file - https://bugzilla.gnome.org/show_bug.cgi?id=780402 - -2017-03-22 10:21:28 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - * ext/ttml/subtitle.c: - * ext/ttml/ttmlparse.c: - ttml: correctly implement lineHeight behaviour - The specified behaviour in TTML when lineHeight is "normal" is different - from the behaviour when a percentage is given. In the former case, the - line height is a percentage (the TTML spec recommends 125%) of the largest - font size that is applied to the spans within the block; in the latter - case, the line height is the given percentage of the font size that is - applied to the block itself. - The code doesn't correctly implement this behaviour; this patch fixes - that. - https://bugzilla.gnome.org/show_bug.cgi?id=780402 - -2017-03-22 09:21:09 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - * ext/ttml/gstttmlrender.h: - ttmlrender: apply correct line height to blocks with multiple text sizes - In TTML, the height of every line in a block is determined by lineHeight - and fontSize style attributes, and should be the same for each line in - that block, regardless of whether different sized text appears on - different lines. Currently, a single PangoLayout is used to lay out all - the text in a block; however, pango will vary the line height in a - layout depending on the size of text used in each line, which is not - compliant with TTML. - This patch makes ttmlrender lay out the lines in a block itself, rather - than using a PangoLayout to do the work. The code still uses a - PangoLayout to render the text of each element, but the overall layout - of the text in a block is now controlled by ttmlrender itself. By doing - this, ttmlrender is able to ensure that the height of each line in a - block is correct. - https://bugzilla.gnome.org/show_bug.cgi?id=780402 - -2017-03-21 15:05:18 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - ttmlrender: add facility to stitch images in both directions - https://bugzilla.gnome.org/show_bug.cgi?id=780402 - -2017-03-21 14:39:39 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - ttmlrender: extend UnifiedElement type to include font metrics - https://bugzilla.gnome.org/show_bug.cgi?id=780402 - -2017-03-21 14:11:42 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - ttmlrender: extend UnifiedBlock type - Include a reference to the GstSubtitleStyleSet of the represented block - and a string containing the concatenated text from all elements. - https://bugzilla.gnome.org/show_bug.cgi?id=780402 - -2017-03-21 13:50:12 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - * ext/ttml/subtitle.c: - * ext/ttml/subtitle.h: - ttml: add refcounting to GstSubtitleStlyeSet type - https://bugzilla.gnome.org/show_bug.cgi?id=780402 - -2017-03-21 12:15:50 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - ttmlrender: rename TextRange type and its fields. - https://bugzilla.gnome.org/show_bug.cgi?id=780402 - -2017-03-21 12:12:28 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - * ext/ttml/gstttmlrender.h: - ttmlrender: store PangoLayout in object state - https://bugzilla.gnome.org/show_bug.cgi?id=780402 - -2017-03-21 11:28:31 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - ttmlrender: put all functions in gst_ttml_render namespace - https://bugzilla.gnome.org/show_bug.cgi?id=780402 - -2017-04-08 21:28:58 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglframebuffer.h: - gl: Remove duplicate typedef of GstGLFramebufferClass - The GstGLFramebufferClass struct is typedeffed in - gstgl_fwd.h, and having a duplicate elsewhere is - breaking the cerbero build on my OSX machine, - even though it seems to be working in CI. - -2017-04-08 10:08:04 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/dash_demux.c: - tests: dash: don't use deprecated g_object_newv() - -2017-04-07 18:49:52 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Do not mix the same buffer twice when EOS. - When entering this code path, we know that: - We received EOS on this pad. - We consumed all its buffers. - In any case, we want to replace vaggpad->buffer with NULL, - otherwise we will end up mixing the same buffer twice. - https://bugzilla.gnome.org/show_bug.cgi?id=781037 - -=== release 1.11.90 === - -2017-04-07 16:32:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gtk.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-opengl.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qt.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtcdsp.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * meson.build: - Release 1.11.90 - -2017-04-07 15:31:12 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2017-04-07 15:06:50 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/hu.po: - * po/ky.po: - * po/sv.po: - po: Update translations - -2017-04-07 14:44:54 +0300 Sebastian Dröge <sebastian@centricular.com> - - * win32/common/libgsturidownloader.def: - win32: Update libgsturidownloader.def - -2017-04-07 16:32:40 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: add some reasons on warning reporting - -2017-04-06 16:13:41 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/directsound/gstdirectsoundsrc.c: - * sys/directsound/gstdirectsoundsrc.h: - directsoundsrc: Correctly calculate segsize and segtotal - segsize should be based on latency-time, and must be a multiple of the - frame size. segtotal should be based on buffer-time and segsize. - This prevents errors caused by outputting buffers that are not a - multiple of the frame size, and actually makes the buffer-time and - latency-time properties do what they're supposed to do. - -2017-03-17 12:58:06 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Use a GWeakRef to the parent to prevent a reference cycle - https://bugzilla.gnome.org/show_bug.cgi?id=780140 - -2015-12-09 13:19:11 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: set uridownloader's parent - Allows internal http source to request contexts and share cookies - with the pipeline in case the server imposes any restriction based - on cookies. - -2015-12-09 13:12:42 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - * gst-libs/gst/uridownloader/gsturidownloader.h: - uridownloader: add new gst_uri_downloader_set_parent - If set, the parent is used to proxy need-context messages from - uridownloader's http source in order to get cookies/headers - from the pipeline. - Based on a patch from Philippe Normand - https://bugzilla.gnome.org/show_bug.cgi?id=726314 - -2017-04-01 17:00:47 +0200 Josep Torra <jtorra@oblong.com> - - * .gitignore: - examples: add audiomixmatrix test to .gitignore - -2017-04-01 16:49:15 +0200 Josep Torra <jtorra@oblong.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - glwindow/cocoa: fix warnings reported by XCode 8.1.0 - gstglwindow_cocoa.m:345:16: error: unused variable 'window' -Werror,-Wunused-variable - GstGLWindow *window = GST_GL_WINDOW (window_cocoa); - ^ - gstglwindow_cocoa.m:445:11: error: unused variable 'external_view' -Werror,-Wunused-variable - NSView *external_view = (__bridge NSView *)priv->external_view; - ^ - -2017-03-31 23:40:05 +1300 Douglas Bagnall <douglas@halo.gen.nz> - - * gst/audiomixer/gstaudiointerleave.c: - audiointerleave: don't overflow channel map with >64 channels - When there are more than 64 channels, we don't want to exceed the - bounds of the ordering_map buffer, and in these cases we don't want to - remap at all. Here we avoid doing that. - Based on a patch originally for plugins-good/interleave in - https://bugzilla.gnome.org/show_bug.cgi?id=780331 - -2017-03-29 23:45:21 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/wayland/gstgldisplay_wayland.c: - gldisplay: Fix assert caused by missing debug category - -2017-03-29 23:36:50 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/mplex/meson.build: - meson: Fix mplex plugin file name - Meson was creating libgstmplex2.so which didn't match the plugin name - 'mplex'. - -2017-03-27 18:14:54 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/webrtcdsp/gstwebrtcechoprobe.cpp: - webrtcechoprobe: return from _read() early if the probe is not configured yet - https://bugzilla.gnome.org/show_bug.cgi?id=780642 - -2017-03-28 16:04:15 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: fix typo in implementation notes - s/enveloppe/envelope - -2017-03-27 21:15:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/meson.build: - * ext/webrtcdsp/meson.build: - webrtcdsp: Add support to build with meson - -2017-02-23 16:12:38 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * ext/webrtcdsp/gstwebrtcdsp.cpp: - webrtcdsp: expose voice activity detection. - The element now exposes properties to enable and configure - voice activity detection, and posts "voice-activity" messages - when the return value of stream_has_voice () changes. - https://bugzilla.gnome.org/show_bug.cgi?id=779138 - -2017-03-27 15:10:45 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/audiomixmatrix/gstaudiomixmatrix.c: - audiomixmatrix: Don't crash if matrix is unset - Fix a crash ff one set in_channels/out_channels to non-zero, and then - get the matrix property. - -2017-03-27 13:34:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/audiomixmatrix/gstaudiomixmatrix.c: - audiomixmatrix: Remove property matrix-value-array - This duplicated property is no longer needed as there is now API to - allow bindings access GST_TYPE_ARRAY (see gst_util_get/set/object_array). - Additionnally, Python has proper overrides which will make this looks - like Python. A 2x2 matrix would be set this way: - element = matrix = Gst.ValueArray(Gst.ValueArray(1.0, -1.0), - Gst.ValueArray(1.0, -1.0)) - Notice that you need to "cast" each arrays to Gst.ValueArray, otherwise - there is an ambiguity between Gst.ValueArray and Gst.ValueList list type. - Fortunatly, Gst.ValueArray implements the Sequence interface, so it can - be indexed like normal python matrix. - -2017-03-01 20:51:43 +1100 Matthew Waters <matthew@centricular.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: only add live fragments after manifest fragments - A live manifest may have a set (> LookAheadFragmentCount) of fragments - that have already been served and are stored on the server, maybe - indefinitely. Adding the parsed live fragments after the manifest - fragments breaks duration reporting and the seekable range. - Fix by only adding parsed fragments outside the list of fragments which - assumes that the fragment list in the manifest is accurate enough to not - stray too far off what's in the retrieved data. - https://bugzilla.gnome.org/show_bug.cgi?id=779447 - -2017-03-24 15:43:07 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/kate/meson.build: - * ext/mpeg2enc/meson.build: - * ext/mplex/meson.build: - Add missing include path for gst/glib-compat-prive.h - This fixes build failure in mplex and mpeg2enc plugins and most likely - in kate plugin (untested). - -2017-03-24 14:25:48 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink: Use GstQueueArray instead of GQueue - Let's save two allocations and frees per frame. - -2017-03-23 02:48:10 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/meson.build: - * ext/mpeg2enc/meson.build: - * ext/mplex/meson.build: - * meson.build: - meson: Build mpeg2enc and mplex when available - -2017-03-22 17:38:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/kms/gstkmssink.c: - kmssink: Fix compiler warning with gcc 7 - gstkmssink.c: In function ‘gst_kms_sink_get_input_buffer’: - gstkmssink.c:1102:29: error: ‘mems0’ may be used uninitialized in this function -Werror=maybe-uninitialized - kmsmem = (GstKMSMemory *) get_cached_kmsmem (mems0); - ^~~~~~~~~~~~~~~~~~~~~~~~~~~ - cc1: all warnings being treated as errors - -2017-03-23 00:49:43 +1100 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Don't send EOS on pads when there's a pending switch - When there are new pads pending for a bitrate switch, don't allow - EOS through from the old streams. It will be sent when the new pads are - ready, just before the old streams are removed. - This fixes racy bitrate switching with hlsdemux in urisourcebin - where old pads EOS before new pads appear and the entire pipeline can - EOS if those propagate fast enough - -2017-03-22 20:10:57 +0900 Seungha Yang <sh.yang@lge.com> - - * gst-libs/gst/player/gstplayer-media-info-private.h: - * gst-libs/gst/player/gstplayer-media-info.c: - * gst-libs/gst/player/gstplayer.c: - player: Make use of GstStreams API with playbin3 - Allow use of playbin3 and GstStreams API by setting - the environment variable "GST_PLAYER_USE_PLAYBIN3" - https://bugzilla.gnome.org/show_bug.cgi?id=775487 - -2017-03-21 18:16:52 +0100 Georg Lippitsch <georg.lippitsch@gmx.at> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Add read-only "signal" property - https://bugzilla.gnome.org/show_bug.cgi?id=780367 - -2017-03-22 13:22:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Install srcpad query function on the srcpad, not the sinkpad - -2017-03-22 12:04:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - dashdemux: In reverse playback mode, if seeking to the beginning of a fragment, start with the previous one instead - There's no point to start downloading a fragment just to output 1ns. - -2017-03-21 20:37:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - dashdemux: Implement SNAP_NEAREST seeks - -2017-03-21 20:36:02 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Don't use ABS() for calculating differences - We know which number is bigger. - -2017-03-21 20:27:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - dashdemux: Only snap seeks forwards if the seek position does not happen to be the exact segment position - -2017-03-21 20:14:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - dashdemux: Use gst_mpdparser_get_segment_end_time() directly instead of calculating it again - It does the exact same calculations. - -2017-03-06 19:44:02 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Refactor to get rid of one level of indentation in seeking code - Also go out of the segment searching loop once segment->start > ts. - We're not going to find any earlier segment anymore. - -2017-03-21 16:18:15 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix snap SIDX seeking and report if we're going outside the index - Instead of just going to the first or last fragment, report if we're - going outside the index. This should never happen unless there's a bug - or the stream is broken. - Allow some possibility for inaccuracies here though. - -2017-03-21 10:20:49 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/camutils.c: - dvb: camutils: drop macro disabling glib deprecation warnings - No longer needed. - -2017-03-20 15:19:08 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * gst-libs/gst/Makefile.am: - build: declare dependency from gl on allocators - libgstgl has a dependency on libgstallocators starting with: - ed1e4c1 glupload: Add support for Vivante DirectTexture uploads - The dependency wasn't stated in the Makefile, so the build could - occasionally fail if you got unlucky with the ordering of build - steps. - https://bugzilla.gnome.org/show_bug.cgi?id=780330 - -2017-03-20 19:57:32 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/dvb/Makefile.am: - dvb: fix distcheck - Apparently automake automatically dists README files, - but can't handle when they disappear. - -2017-03-20 17:15:54 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/assrender/gstassrender.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/speed/Makefile.am: - * gst/speed/demo-mp3.c: - * scripts/autoplugins.sh: - * sys/dvb/README: - * sys/dvb/gstdvbsrc.c: - Update for 'mad' mp3 decoder removal - https://bugzilla.gnome.org/show_bug.cgi?id=776140 - -2017-03-17 15:34:33 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/hls/m3u8.c: - m3u8: Fix parsing EXT-X-DISCONTINUITY - EXT-X-DISCONTINUITY tag should have no trailing ":" character - https://bugzilla.gnome.org/show_bug.cgi?id=780179 - -2017-03-17 16:47:07 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/hls/m3u8.c: - m3u8: Release m3u8 lock if consistent checking failed - To fix deadlock during live m3u8 update - https://bugzilla.gnome.org/show_bug.cgi?id=780180 - -2017-03-16 12:35:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Just reset SIDX parser if the index is invalid for the current segment - https://bugzilla.gnome.org/show_bug.cgi?id=780108 - -2016-12-23 11:07:00 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/ttml/gstttmlrender.c: - * ext/ttml/ttmlparse.c: - ttml: Replace assertions - Remove assertions and replace, where necessary, with code that handles - the error cases. - https://bugzilla.gnome.org/show_bug.cgi?id=776436 - -2017-03-15 13:24:57 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: If a SIDX seek failed although we're in the correct segment, disable the SIDX usage for this segment - The SIDX apparently does not contain information about the current - segment, so better stop using it instead of using incorrect values. - -2017-03-15 13:24:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Keep track of the PTS, not the SIDX index position between representations - There is no guarantee that the index positions are the same between - representations, and assuming this easily causes us to get into invalid - index positions. - -2017-03-15 13:21:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstisoff.c: - dashdemux: When clearing the sidx parser, reset all state - And especially don't keep entry count and index around, we have no - entries anymore after clearing. - -2017-03-15 10:17:59 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Drain buffer at the end of subfragment - Some of streams such as below have tailing boxes at the end of subfragment. - http://dash.akamaized.net/dash264/TestCases/1a/netflix/exMPD_BIP_TC1.mpd - https://bugzilla.gnome.org/show_bug.cgi?id=776200 - -2017-03-15 09:24:39 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Do not advace subfragment after pending SIDX seek done - If a MPD is On-Demand profile and no index described, demux will terminate - download loop after parsing inband SIDX with flow return custom-success. - At this moment, SIDX index is excat target position, but finish_fragment() - might cause re-advancing subfragment depending on MPD structure. - https://bugzilla.gnome.org/show_bug.cgi?id=776200 - -2017-03-14 19:47:17 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Reset SIDX related variables per fragment - SIDX's base offset (i.e., byte offset of SIDX + sidx.first_offset) - mostly vary as per fragment. Also, target SIDX index must be zero for the - new fragment. - https://bugzilla.gnome.org/show_bug.cgi?id=776200 - -2017-03-14 20:15:31 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Two depth seeking for On-Demand profile - Try to find fragment using MPD first, then do refinement to find - target subframgnet using SIDX if possible. Note that, if target fragment - was moved from the previously activated one, we should assume that - the last SIDX is invalid for new fragment. - https://bugzilla.gnome.org/show_bug.cgi?id=776200 - -2017-03-14 19:41:56 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Exception handle in _sidx_seek() - If target seek position is outside of the range of sidx entries, - binary search returns NULL pointer. - https://bugzilla.gnome.org/show_bug.cgi?id=776200 - -2017-03-14 19:27:45 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Add assertion for preventing of access after the end of the sidx entries array - Better crash cleanly here than reading some random numbers from memory. - -2017-03-14 14:18:17 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * gst-libs/gst/gl/gstglformat.c: - gl/format: correct return enums in gst_gl_format_from_video_info - In commit - > 956c4d0 gl/format: use our own GL format enum's instead of gstvideo's - the name and return type of gst_gl_format_from_video_info changed, - but some returns of the old type were missed. Here they are - updated to the correct type. - https://bugzilla.gnome.org/show_bug.cgi?id=780064 - -2017-03-14 16:46:14 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/srtp.c: - srtp test: Remove deprecation disabling - No deprecated APIs are used. - -2017-03-07 21:56:03 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Advance subfragment only if any exist - SIDX based playback is not restricted to SegmentBase, but it possible - with SegmentList/SegmentTemplate. In the latter case, each fragment - has its own SIDX box and might be subdivided into subfragment. - So, demux should not assume that the end of subfragment is the end - of stream. Moreover, should try advance subfragment only if there - are remaining subfragments. - With additional fixes by Sebastian Dröge <sebastian@centricular.com> - https://bugzilla.gnome.org/show_bug.cgi?id=776200 - -2017-03-13 16:06:53 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: adjust memory offset calculation for dmabuf buffers - The data in the dmabuf fd may not start from byte 0, therefore - we need to inform DRM about this additional offset. - https://bugzilla.gnome.org/show_bug.cgi?id=779790 - -2017-03-13 15:48:33 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: adjust memory offset calculation for dmabuf buffers - The data in the dmabuf fd may not start from byte 0, therefore - we need to inform EGL about this additional offset. - https://bugzilla.gnome.org/show_bug.cgi?id=779790 - -2017-03-13 12:46:47 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/wllinuxdmabuf.c: - waylandsink: fix memory offset calculation for dmabuf buffers - https://bugzilla.gnome.org/show_bug.cgi?id=779790 - -2017-03-14 16:49:25 +1100 Matthew Waters <matthew@centricular.com> - - * ext/dash/gstmpdparser.c: - * ext/hls/m3u8.c: - * ext/smoothstreaming/gstmssmanifest.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - * tests/check/elements/hlsdemux_m3u8.c: - Revert "adaptivedemux: answer duration queries for live streams" - Completely disabling duration reporting with live streams is not cool. - This reverts commit e1b68d9a65ba512a52c3a2b298fa830a445eb451. - https://bugzilla.gnome.org/show_bug.cgi?id=753879 - -2017-03-14 14:15:00 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.m: - * ext/gl/gltestsrc.c: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstgloverlay.c: - * ext/gl/gstgltransformation.c: - * ext/gtk/gtkgstglwidget.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglupload.c: - gl: GL_ARRAY_BUFFER is not a part of VAO state - As a result we need to bind it on every draw in order to have the - correct state in the GL state machine. - -2017-03-14 11:39:23 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/iosurfacememory.c: - applemedia/iosurfacememory: Fix missing variable name change - 956c4d0bde4d6707ccae2b4ae6dfba8500e55217 missed a variable name change. - Fix that. - -2017-03-13 14:28:47 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstgloverlay.c: - * ext/qt/gstqtsrc.cc: - * gst-libs/gst/gl/egl/gsteglimage.c: - * gst-libs/gst/gl/egl/gsteglimage.h: - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglformat.c: - * gst-libs/gst/gl/gstglformat.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/gl/gstglmemorypbo.h: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstglrenderbuffer.c: - * gst-libs/gst/gl/gstglrenderbuffer.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/iosglmemory.c: - * sys/applemedia/iosglmemory.h: - * sys/applemedia/iosurfacememory.c: - * sys/applemedia/iosurfacememory.h: - * sys/applemedia/videotexturecache.m: - * tests/check/libs/gstglcolorconvert.c: - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglmemory.c: - * tests/check/libs/gstglupload.c: - gl/format: use our own GL format enum's instead of gstvideo's - They can describe in more detail (such as component sizes) the requested format. - -2017-03-10 16:57:51 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/gl/gstglupload.c: - glupload: fix GValue leak - https://bugzilla.gnome.org/show_bug.cgi?id=779869 - -2017-03-12 11:50:50 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * Makefile.am: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-teletext.xml: - Add old plugins names to cruft list - This helps fixing uninstalled setup. Also fixes some path in plugin xml - files. - https://bugzilla.gnome.org/show_bug.cgi?id=779344 - -2015-09-23 17:12:34 +0200 Samuel Maroy <samuel.maroy@barco.com> - - * sys/shm/gstshmsink.c: - shmsink: continue polling after EINTR - https://bugzilla.gnome.org/show_bug.cgi?id=779856 - -2017-03-02 14:36:56 +0800 Haihua Hu <jared.hu@nxp.com> - - * gst-libs/gst/player/gstplayer.c: - player: Fix setting of external subtitle URI - gst_player_set_uri_internal shouldn't free suburi which maybe set - by user to load external subtitle before start play. It just need - reset playbin's subutri property to NULL no matter if there was a - previous one or not. - https://bugzilla.gnome.org/show_bug.cgi?id=779453 - -2017-03-09 10:09:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: Use AVCaptureDeviceTypeBuiltInDuoCamera instead of DualCamera for now - The former is deprecated in 10.2 but we don't require that SDK yet. - -2017-03-08 22:28:15 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - Fix doc generation - This regression was caused by the renaming of plugin-sdp into - plugin-sdpelem. The doc reference needed an update. Also, add the old - xml to the cruft file list. - https://bugzilla.gnome.org/show_bug.cgi?id=779344 - -2017-03-05 15:27:11 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/dash/Makefile.am: - * ext/smoothstreaming/Makefile.am: - dash/smoothstreaming: Use GST_PLUGIN_LIBTOOLFLAGS - Use the flags defined by configure script instead of always disabling - static plugins. - -2017-03-04 11:03:53 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/inspect/plugin-gtk.xml: - * docs/plugins/inspect/plugin-sdpelem.xml: - * ext/fluidsynth/meson.build: - * ext/gtk/Makefile.am: - * ext/gtk/gstplugin.c: - * ext/teletextdec/Makefile.am: - * gst/camerabin2/Makefile.am: - * gst/camerabin2/meson.build: - * gst/onvif/meson.build: - * gst/sdp/gstsdpelem.c: - * gst/siren/gstsiren.c: - * sys/kms/Makefile.am: - * sys/kms/meson.build: - Rename plugin filesnames to match plugin names - - libgstgtksink.so -> libgstgtk.so - - libgstteletextdec.so -> libgstteletex.so - - libgstcamerabin2.so -> libgstcamerabin.so - - libgstonvif.so -> libgstrtponvif.so (meson only) - - sdp -> sdpelem (avoid clash with libgstsdp) - - gstsiren -> siren - - libgstkmssink.so -> libgstkms.so - https://bugzilla.gnome.org/show_bug.cgi?id=779344 - -2017-03-08 15:52:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Only unref daily jam if not NULL - -2017-03-08 15:48:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Unref daily jam after usage - -2017-03-08 14:16:43 +0100 Nick Kallen <nickkallen@me.com> - - * ext/gl/Makefile.am: - * sys/applemedia/avfvideosrc.m: - applemedia/gl: Fix compile issues for OSX - https://bugzilla.gnome.org/show_bug.cgi?id=778333 - -2017-03-08 15:13:45 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/eagl/Makefile.am: - gl/eagl: It's -fobjc-arc not -fobj-arc - -2017-03-08 14:22:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: frame->buffer can't be NULL in pre_push_frame() - CID 1402118 - -2017-03-08 17:11:17 +0900 Hyunjun Ko <zzoon@igalia.com> - - * tests/check/elements/h264parse.c: - * tests/check/elements/parser.c: - * tests/check/elements/parser.h: - tests: h264parse: fix failures due to insertion of au delimiter - Since insertion of aud landed, we need to change some testcases - accroding to the change. - Note that counting frames are changed in parser.c, - due to generated frames, AUD. - https://bugzilla.gnome.org/show_bug.cgi?id=736213 - -2017-03-08 17:09:28 +0900 Hyunjun Ko <zzoon@igalia.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix some failures in testcases - Move logic of judgement whether or not to insert AU Delimiter before - draining. - Besides, aud_needed flag is reset to TRUE when skip. - https://bugzilla.gnome.org/show_bug.cgi?id=736213 - -2017-02-08 12:23:09 +0100 Nick Kallen <nickkallen@me.com> - - * sys/applemedia/avfvideosrc.h: - * sys/applemedia/avfvideosrc.m: - applemedia: avfvideosrc supports position, device-type, and orientation - Avfvideosrc represents an iphone camera or, on mac, a screencapture session. - The old API allowed you to select an input device by device index only. The new - API adds the ability to select the position (front or back facing) and - device-type (wide angle, telephoto, etc.). Furthermore, you can now specify - the orientation (portrait, landscape, etc.) of the videostream. - https://bugzilla.gnome.org/show_bug.cgi?id=778333 - -2017-02-03 14:46:39 +0100 Nick Kallen <nickkallen@me.com> - - * ext/gl/caopengllayersink.h: - * ext/gl/caopengllayersink.m: - * gst-libs/gst/gl/cocoa/Makefile.am: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstgldisplay_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/eagl/Makefile.am: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.h: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.h: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - * sys/applemedia/Makefile.am: - * sys/applemedia/avfassetsrc.h: - * sys/applemedia/avfassetsrc.m: - * sys/applemedia/avfvideosrc.h: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/avsamplevideosink.h: - * sys/applemedia/avsamplevideosink.m: - * sys/applemedia/iosassetsrc.h: - * sys/applemedia/iosassetsrc.m: - * sys/applemedia/plugin.m: - * sys/applemedia/videotexturecache.m: - * tests/examples/gl/cocoa/Makefile.am: - * tests/examples/gl/cocoa/cocoa-videooverlay.m: - applemedia/gl: Update code to use ARC - All code interacting with Objective-C objects should now use Automated - Reference Counting rather than manual memory management or Garbage - Collection. Because ARC prohibits C-structs from containing - references to Objective-C objects, all such fields are now typed - 'gpointer'. Setting and gettings Objective-C fields on such a - struct now uses explicit __bridge_* calls to tell ARC about - object lifetimes. - https://bugzilla.gnome.org/show_bug.cgi?id=777847 - -2017-03-07 18:33:12 +0900 Hyunjun Ko <zzoon@igalia.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: insert AU delimiter only in case of byte-stream - Inserts AU delimeter by default if missing au delimeter from upstream. - This should be done only in case of byte-stream format. - Note that: - We have to compensate for the new bytes added for the AU, otherwise - insertion of PPS/SPS will use wrong offsets and overwrite wrong data. - Also mark the AU delimiter blob const, and use frame->out_buffer for - storing the output to keep baseparse assumptions valid. - Original-Patch-By: Michal Lazo <michal.lazo@mdragon.org> - Helped by Sebastian Dröge <sebastian@centricular.com> - https://bugzilla.gnome.org/show_bug.cgi?id=736213 - -2017-03-03 16:20:15 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: redo src caps negotiation if a sink pad's caps have changed in the meantime - https://bugzilla.gnome.org/show_bug.cgi?id=755782 - -2017-03-06 17:51:32 +0530 Arun Raghavan <arun@arunraghavan.net> - - * gst-libs/gst/gl/gstglcontext.h: - gl: Missed one backwards compat define in GST_GL_TYPE_CONTEXT - Continued from 296b4251e3042fe95a9cce1ad7674b708ba92599 - -2017-02-21 20:08:21 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Try to find type at the end of a fragment - hlsdemux tries to find type if given buffer size is large enought to - find type (currently the threshold is 2KB), or EOS in some cases. - However, since there can be small byte fragments such as WebVTT, - demux should try to find type at the end of a fragment - https://bugzilla.gnome.org/show_bug.cgi?id=779011 - -2017-03-06 00:30:41 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: limit bitrate property to 320 kbps - This appears to be the internal limit of voaacenc, higher - bitrates will be ignored and 128 kbps output will be produced - instead. Therefore, we might just as well limit the allowed - property values, so that people who try to set higher bitrates - get a big fat warning instead of silently a much lower bitrate. - -2017-03-04 12:12:52 +0100 Nick Kallen <nickkallen@me.com> - - * sys/applemedia/videotexturecache.m: - applemedia: Fix video texture cache build issue on MacOS - https://bugzilla.gnome.org/show_bug.cgi?id=779247 - -2017-02-26 10:24:46 +0100 Nick Kallen <nickkallen@me.com> - - * sys/applemedia/videotexturecache.m: - applemedia: ensure all textures are released before texturecache is released - It was previously possible for videotexturecache to be finalized before all of - its textures. Finalizing outstanding textures in this circumstance leads - to a crash. This patch ensure resources are freed in the proper order. - https://bugzilla.gnome.org/show_bug.cgi?id=779247 - -2017-03-04 11:47:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/x11/gstglcontext_glx.h: - gl: Fixup for last commit - -2017-03-04 11:15:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.h: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/x11/gstglcontext_glx.h: - gl: Fix backwards compat GST_GL_TYPE_* functions/macros - These have to be macros instead of inline function as they must behave - more or less like an integer literal, i.e. include the function call. - -2017-03-04 11:09:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.c: - * gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.h: - gl/viv-fb: Don't use deprecated symbols and make macros more consistent - https://bugzilla.gnome.org/show_bug.cgi?id=778825 - -2017-03-03 15:17:15 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixmatrix/gstaudiomixmatrix.c: - audiomixmatrix: Fix negotiation in first-channels mode if downstream does not allow the same number of channels - -2017-02-16 10:51:44 +0900 Dongil Park <dongil.park@lge.com> - - * ext/hls/gsthlsdemux-util.c: - hlsdemux: Fix checking adaptation_field_control field to parse pcr - The PCR_flag and PCR value is in adaptation_field, not in payload. - The MSB of adaptation_field_control is used as whether adaptation_ - field is exist or not. - For the case(PCR in only adaptation_field without payload), we modify - checking condition about adaptation_field_control field. - https://bugzilla.gnome.org/show_bug.cgi?id=778731 - -2017-02-02 21:06:20 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - hls: Fix various leak on hlsdemux and m3u8 - * default_variant should be freed, it holds ref. - * GstHLSMedia holds GstM3U8 ref. - * gst_m3u8_get_next_fragment() increases ref count. - https://bugzilla.gnome.org/show_bug.cgi?id=778073 - -2017-02-02 21:04:36 +0900 Seungha Yang <sh.yang@lge.com> - - * tests/check/elements/hlsdemux_m3u8.c: - tests: hls: Fix leak on test code - https://bugzilla.gnome.org/show_bug.cgi?id=778073 - -2016-04-01 17:42:32 +0100 Wojciech Przybyl <wojciech@visla.co.uk> - - * ext/dash/gstdashdemux.c: - dashdemux: fix default suggestedPresentationDelay - When MPD@suggestedPresentationDelay is not present in the MPD, - dashdemux can provide default suggestedPresentationDelay. However - when applying default value of suggestedPresentationDelay, the value - should be subtracted from current time, not added to it. When streams - setup is performed and live point is calculated, we have to go to the - wall clock (current time) minus suggestedPresentationDelay, if we tried - to start with current time plus suggestedPresentationDelay, we would - be asking for future stream, which has not yet been recorded. Also - the value needs to be converted from ms to us. - https://bugzilla.gnome.org/show_bug.cgi?id=764726 - -2016-02-05 12:44:23 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * ext/dash/gstmpdparser.c: - * ext/hls/m3u8.c: - * ext/smoothstreaming/gstmssmanifest.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - * tests/check/elements/hlsdemux_m3u8.c: - adaptivedemux: answer duration queries for live streams - For duration queries on live streams, adaptivedemux ignores the query. - The problem then is that the query is answered by the downstream - qtdemux element, with the duration of the currently passing fragment. - This commit changes the behaviour of adaptivedemux to answer the duration - queries for live streams, returning GST_CLOCK_TIME_NONE. - https://bugzilla.gnome.org/show_bug.cgi?id=753879 - -2017-02-01 19:55:22 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Implement adaptivedemux's _stream_seek() - _stream_seek() can be called by adaptivedemux when "restart download" condition. - It's mostly caused by track switching. - https://bugzilla.gnome.org/show_bug.cgi?id=776997 - -2017-02-01 19:15:31 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Simplify seeking code by using macro - Import an adaptivedemux's macro to minimize code. - Also, this patch considers KEY_UNIT and TRICKMODE_KEY_UNITS - as snap seek. - https://bugzilla.gnome.org/show_bug.cgi?id=776997 - -2017-02-01 17:44:25 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Early terminate seeking if we don't need to do - Some codes are imported from dashdemux - https://bugzilla.gnome.org/show_bug.cgi?id=776997 - -2016-10-10 16:41:15 -0600 Thomas Bluemel <tbluemel@control4.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: Add support for EXT-X-DISCONTINUITY-SEQUENCE - https://bugzilla.gnome.org/show_bug.cgi?id=772811 - -2017-02-27 14:54:43 -0700 Thomas Bluemel <tbluemel@control4.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivemutex: Fix double mutex unlock - https://bugzilla.gnome.org/show_bug.cgi?id=779480 - -2017-03-01 15:29:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openexr/gstopenexrdec.cpp: - openexrdec: Also catch other exceptions by reference instead of by value - It would have to be copied otherwise, and is quite big. - CID 1373419 - -2017-03-01 12:08:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Don't error out if displaying the preroll frame fails - This seems to happen sometimes on some hardware, and is not really - critical as long as the scheduling of the normal frames works fine. - Only post a warning message for this case. - -2017-02-28 15:56:02 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openexr/gstopenexrdec.cpp: - openexrdec: Catch exception by reference instead of by value - It would have to be copied otherwise, and is quite big. - CID 1373419 - -2017-02-28 15:53:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix potential NULL pointer dereference - CID 1399700 - -2017-02-28 15:31:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Compare media type of the correct variable that is actually set - CID 1364752 - -2017-02-28 15:22:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstgltestsrc.c: - gltestsrc: Fix potential NULL pointer dereference if we fail without GError - Which can happen here if we just propagate an error that happened - elsewhere, e.g. FBO failed. - CID 1364604 - -2017-02-28 13:06:41 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglvideomixer.c: - * gst/compositor/compositor.c: - glvideomixer/compositor: Correctly error out if calculating DAR fails - CID 1320700 - -2017-02-28 12:53:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/MotionCells.cpp: - motioncells: Initialize m_changed_datafile class field - CID 1197704 - -2017-02-28 12:46:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gme/gstgme.c: - gme: Remove useless comparison of unsigned integer with < 0 - CID 206187 - -2017-02-28 12:34:30 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: Check return value of gst_gl_context_check_framebuffer_status() - CID 1401588 - -2017-02-28 12:31:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - gl: Add viv-fb to DIST_SUBDIRS to fix "make distcheck" - -2017-02-28 10:53:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglutils.c: - * ext/gl/gstglutils.h: - * ext/gl/gstglvideomixer.c: - gl: Rename gst_gl_get_affine_transformation_meta_as_ndc_ext() to prevent symbol conflict - The same symbol also exists in libgstgl, although marked as private and - internal. This has no effect when doing static linking and there's a - symbol conflict. - -2017-02-28 10:50:23 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglutils_private.h: - glutils: Mark private functions as G_GNUC_INTERNAL - -2017-02-28 09:26:25 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/pesparse.c: - mpegtsdemux: Fix wrong usage of '<<' operator - Detected by GCC 7. - Add comments for clarity - https://bugzilla.gnome.org/show_bug.cgi?id=779333 - -2017-02-27 21:22:30 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/audiomixmatrix/meson.build: - audiomixmatric: Add missing libm deps for meson - -2017-02-27 10:32:45 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Include `interlace-mode` in caps - Those are the rules: - In the SPS: - * if frame_mbs_only_flag=1 => all frame progressive - * if frame_mbs_only_flag=0 => field_pic_flag defines if each frame is - progressive or interlaced, thus the mode is 'mixed' in GStreamer - terms. - https://bugzilla.gnome.org/show_bug.cgi?id=779309 - -2017-02-14 11:09:46 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * ext/iqa/iqa.c: - iqa: Plug a leak allocating twice the same data - -2017-02-27 19:13:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * pkgconfig/gstreamer-insertbin-uninstalled.pc.in: - * pkgconfig/gstreamer-player-uninstalled.pc.in: - * pkgconfig/gstreamer-wayland-uninstalled.pc.in: - pkg-config: Add both srcdir and builddir to the include path - Just the build dir is not going to work for srcdir!=builddir. - -2017-02-27 23:47:25 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/mpegtsparse.c: - tsparse: Convert PCR values immediately - Doing lazy conversion of PCR values doesn't work right - when a PCR discont is encountered. Instead, convert PCR - values to the continuous timestamp domain as soon as we - encounter them and store that instead. - -2017-02-22 14:55:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglupload.c: - glupload: Add support for Vivante DirectTexture uploads - Together with the upcoming gstreamer-imx patch, this allows zerocopy - between imxvpudec and other elements and glimagesink. - This is losely based on a patch by Haihua Hu <b55597@freescale.com> - from https://github.com/Freescale/meta-freescale/blob/master/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/ - https://bugzilla.gnome.org/show_bug.cgi?id=779067 - -2017-02-17 19:26:41 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/allocators/Makefile.am: - * gst-libs/gst/allocators/badallocators.h: - * gst-libs/gst/allocators/gstphysmemory.c: - * gst-libs/gst/allocators/gstphysmemory.h: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-bad-allocators-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-allocators.pc.in: - allocators: Add GstPhysMemoryAllocator abstraction - This can be used in a generic way as common interface by all platforms that, - in one way or another, pass around physical memory addresses. - https://bugzilla.gnome.org/show_bug.cgi?id=779067 - -2017-02-17 14:37:08 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * ext/qt/gstqtglutility.cc: - qml: Add support for Vivante EGL FS windowing system - https://bugzilla.gnome.org/show_bug.cgi?id=778825 - -2017-02-17 12:24:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/viv-fb/Makefile.am: - * gst-libs/gst/gl/viv-fb/gstgldisplay_viv_fb.c: - * gst-libs/gst/gl/viv-fb/gstgldisplay_viv_fb.h: - * gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.c: - * gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.h: - gl: Add support for Vivante EGL FB windowing system - This is very similar to how dispmanx on the Raspberry Pi works. - Based on a patch by Haihua Hu <b55597@freescale.com> from - https://github.com/Freescale/meta-freescale/tree/master/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad - https://bugzilla.gnome.org/show_bug.cgi?id=778825 - -2017-02-25 21:47:47 -0300 Edgard Lima <edgard.lima@gmail.com> - - * docs/plugins/inspect/plugin-neon.xml: - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - * ext/voamrwbenc/gstvoamrwb.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/voamrwbenc/gstvoamrwbenc.h: - * tests/examples/camerabin2/gst-camera2.c: - * tests/examples/camerabin2/gst-camera2.h: - * tests/icles/metadata_editor.c: - * tests/icles/metadata_editor.h: - Update Edgard Lima's email - https://bugzilla.gnome.org/show_bug.cgi?id=779230 - -2017-02-25 14:43:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * Makefile.am: - * gst/rawparse/Makefile.am: - * gst/rawparse/gstaudioparse.c: - * gst/rawparse/gstrawaudioparse.c: - * gst/rawparse/gstrawaudioparse.h: - * gst/rawparse/gstrawbaseparse.c: - * gst/rawparse/gstrawbaseparse.h: - * gst/rawparse/gstrawvideoparse.c: - * gst/rawparse/gstrawvideoparse.h: - * gst/rawparse/gstunalignedaudioparse.c: - * gst/rawparse/gstunalignedaudioparse.h: - * gst/rawparse/gstunalignedvideoparse.c: - * gst/rawparse/gstunalignedvideoparse.h: - * gst/rawparse/gstvideoparse.c: - * gst/rawparse/meson.build: - * gst/rawparse/plugin.c: - * gst/rawparse/unalignedaudio.h: - * gst/rawparse/unalignedvideo.h: - * tests/check/Makefile.am: - * tests/check/elements/rawaudioparse.c: - * tests/check/elements/rawvideoparse.c: - rawparse: Move to gst-plugins-base and keep legacy audioparse/videoparse here - https://bugzilla.gnome.org/show_bug.cgi?id=774544 - -2017-02-24 15:59:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * meson.build: - meson: Update version - -2017-02-24 15:37:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -=== release 1.11.2 === - -2017-02-24 15:07:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstgtk.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-opengl.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qt.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtcdsp.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - Release 1.11.2 - -2017-02-24 12:53:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2017-02-24 12:46:06 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/ky.po: - * po/sv.po: - po: Update translations - -2017-02-24 01:28:35 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/audiomixmatrix/meson.build: - * gst/meson.build: - * gst/timecode/meson.build: - meson: Added meson.build for audiomixmatrix and timecode - https://bugzilla.gnome.org/show_bug.cgi?id=779154 - -2017-02-22 14:09:45 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/glprototypes/fbo.h: - * gst-libs/gst/gl/gstglmemory.c: - glmemory: Use glBlitFramebuffer() instead of glCopyTexImage2D() if available - glBlitFramebuffer() is new GLES3/GL3 API. They are probably often - implemented in terms of each other, and glBlitFramebuffer() can - potentially be implemented more flexible. Let's use it if available. - Also it actually works on imx6 with DirectVIV textures. - Based on a patch by Haihua Hu <jared.hu@nxp.com> from - https://github.com/Freescale/meta-freescale/blob/master/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/ - https://bugzilla.gnome.org/show_bug.cgi?id=779070 - -2017-01-16 19:36:07 +0200 Vivia Nikolaidou <vivia@toolsonair.com> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/audiomixmatrix/Makefile.am: - * gst/audiomixmatrix/gstaudiomixmatrix.c: - * gst/audiomixmatrix/gstaudiomixmatrix.h: - * tests/examples/Makefile.am: - * tests/examples/audiomixmatrix/Makefile.am: - * tests/examples/audiomixmatrix/test-audiomixmatrix.c: - audiomixmatrix: New element that mixes audio channels - This element transforms a given number of input channels into a given number of - output channels according to a given transformation matrix. The matrix - coefficients must be between -1 and 1. In the auto mode, input/output channels - are automatically negotiated and the transformation matrix is a truncated or - zero-padded identity matrix. - https://bugzilla.gnome.org/show_bug.cgi?id=777376 - -2017-02-22 22:31:17 +0100 Georg Lippitsch <glippitsch@toolsonair.com> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: Remove clock-source property - Remove clock-source property, because the GST clock usually starts at - some random value and is thus uselsess for creating a timecode from it. - https://bugzilla.gnome.org/show_bug.cgi?id=778703 - -2017-02-22 22:30:17 +0100 Georg Lippitsch <glippitsch@toolsonair.com> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: First timecode from current system time - Add a new flag which automatically sets this first timecode to the - current system time in local time zone. - https://bugzilla.gnome.org/show_bug.cgi?id=778703 - -2017-02-22 22:26:57 +0100 Georg Lippitsch <glippitsch@toolsonair.com> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: First timecode property - Add an new property to start from a given timecode - instead of zero. - https://bugzilla.gnome.org/show_bug.cgi?id=778703 - -2017-02-22 02:17:35 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * ext/webrtcdsp/gstwebrtcdsp.cpp: - webrtcdsp: expose new properties. - This gives the user more control over the gain control - and experimental gain control behaviour. - https://bugzilla.gnome.org/show_bug.cgi?id=779103 - -2017-02-17 16:09:53 +0530 Arun Raghavan <arun@arunraghavan.net> - - * sys/bluez/gstavdtpsrc.c: - bluez: Chain up to basesrc query instead of override pad query function - Overriding the pad query function completely overrides all the default - query handling implemented in basesrc, including caps etc. The correct - thing to do is just override the basesrc query vfunc and then chain up - for the queries we don't handle. - -2017-02-20 18:58:11 +0200 Vivia Nikolaidou <vivia@toolsonair.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - * gst/audiobuffersplit/gstaudiobuffersplit.h: - audiobuffersplit: Add strict-buffer-size property - If set to TRUE, any last audio samples too small to fill a buffer will - be discarded. - https://bugzilla.gnome.org/show_bug.cgi?id=779064 - -2017-01-30 11:04:32 +0100 Fabien Dessenne <fabien.dessenne@st.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: consider buffer size when copying to wl shm pool - When the sink receives a buffer that is neither a wl_shm one nor a - dmabuf one, this buffer is copied to an internal wl_shm buffer before - being sent to the display. - In that case, the actual size of the received buffer (which may differ - from the one negotiated in the caps) must be used. - https://bugzilla.gnome.org/show_bug.cgi?id=777841 - -2017-02-17 21:25:21 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Fix GHashTable leak - https://bugzilla.gnome.org/show_bug.cgi?id=778828 - -2017-02-18 20:18:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/rawparse/gstrawbaseparse.c: - * tests/check/elements/rawvideoparse.c: - rawbaseparse: Drop incomplete frames at EOS - See https://bugzilla.gnome.org/show_bug.cgi?id=773666 - This would ideally be solved in baseparse but that requires further - thought at this point, and in the meantime it would be good to have - rawbaseparse not assert on this but handle it gracefully instead. - -2017-02-16 20:08:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/meson.build: - configure: Remove unused Mali EGL/fbdev_window support - This existed a long time ago but there's no actual code for this - anymore. - -2017-02-15 19:07:32 +0000 Tim-Philipp Müller <tim@centricular.com> - - * pkgconfig/gstreamer-codecparsers-uninstalled.pc.in: - * pkgconfig/gstreamer-mpegts-uninstalled.pc.in: - pkgconfig: fix uninstalled .pc files for codecparsers + mpegts - Really need to include the srcdir for codecparsers, and build dir - for mpegts. - -2017-02-14 23:00:06 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * win32/MANIFEST: - Fix distcheck - Don't use wildcards in Makefile.am, buildbot doesn't seem - to like them. - -2017-02-14 20:23:12 +0000 Tim-Philipp Müller <tim@centricular.com> - - * win32/common/photography-enumtypes.c: - * win32/common/photography-enumtypes.h: - win32: remove disted enumtypes files which are no longer used - -2017-02-14 20:19:44 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * gst/mxf/meson.build: - meson: dist meson build files - Ship meson build files in tarballs, so people who use tarballs - in their builds can start playing with meson already. - -2017-02-14 13:04:01 +0100 Nick Kallen <nickkallen@me.com> - - * sys/applemedia/iosglmemory.c: - * sys/applemedia/iosglmemory.h: - * sys/applemedia/videotexturecache.m: - Builds for MacOS - https://bugzilla.gnome.org/show_bug.cgi?id=778434 - -2017-02-10 11:32:23 +0100 Nick Kallen <nickkallen@me.com> - - * sys/applemedia/iosglmemory.c: - * sys/applemedia/iosglmemory.h: - * sys/applemedia/videotexturecache.m: - applemedia: free videotexturecache texture in gl thread - The cached texture was treated as user_data passed to GstGLBaseMemory - and freed with a GDestroyNotify function. However, this data must - be treated specially: it must be destroyed in the GL thread. - https://bugzilla.gnome.org/show_bug.cgi?id=778434 - -2017-02-10 10:29:49 -0300 Juan Pablo Ugarte <juanpablougarte@gmail.com> - - * ext/gl/gstglsinkbin.c: - GstGLSinkBin: fixed sink property leak - No need to keep an extra reference to sink since an indirect one is added by gst_bin_add() - https://bugzilla.gnome.org/show_bug.cgi?id=778452 - -2017-02-13 13:32:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsrc.c: - shm: Change example pipelines to something that actually works - Enforce exactly the same raw video format on both sides, include a - videoconvert and queue before the video sink and make the shm area a - little bit bigger so that things don't get stuck. - -2017-02-09 01:12:56 +1100 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Convert premature EOS on non-exposed pads to ERROR - If we need to send EOS on a pad that hasn't prerolled, generate - an error on the bus instead, otherwise the app will have no idea. - Fixes the HLS testFragmentNotFound test, which is waiting - for either EOS or an error. - -2017-02-09 00:54:07 +1100 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Handle errors from prepared_streams too - Check both active and prepared_streams when we receive an - error on the bus, so we post errors for streams that are - still pre-rolling - -2017-02-09 00:16:33 +1100 Jan Schmidt <jan@centricular.com> - - * tests/check/elements/adaptive_demux_engine.c: - adaptivedemux: Allow that - -2017-02-08 22:59:49 +1100 Jan Schmidt <jan@centricular.com> - - * tests/check/elements/adaptive_demux_engine.c: - * tests/check/elements/adaptive_demux_engine.h: - adaptivedemux: Fix tests for delayed pad exposure. - Make the unit tests handle the fact that pads don't appear - immediately. Before, the test assumed pads are exposed before the - internal source element is created, which is no longer true. - -2017-02-07 19:44:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcvideoenc.c: - amcvideoenc: Encoder output is generally not properly parsed - Don't claim it is and let h264parse and other parsers do their job. - https://bugzilla.gnome.org/show_bug.cgi?id=774772 - -2017-02-07 19:42:47 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcvideoenc.c: - amcvideoenc: Set timestamps on header buffers too - https://bugzilla.gnome.org/show_bug.cgi?id=774772 - -2017-02-07 19:42:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcvideoenc.c: - amcvideoenc: Encoded H264 is generally not AU aligned - Claiming that it is, can cause h264parse to skip some parsing steps and - the output stays unaligned. - https://bugzilla.gnome.org/show_bug.cgi?id=774772 - -2017-01-13 23:10:52 +1100 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Fix bitrate printed in debug - The download bitrate is already in bits per second, - no need to multiply it by 8 again when printing it - for debug. - -2017-01-11 12:34:58 +1100 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Redo typefind after stripping tags - When stripping the ID3 header, redo typefinding so - we set audio caps instead of still setting id3 - caps and plugging a useless id3demux - -2017-01-07 12:12:05 +0900 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Preroll streams before exposing them - To ensure that pads have caps when they are exposed, do - the exposing when all pending streams have prerolled an - output buffer, and only then EOS and remove any old pads. - Improves the switching sequence by making caps available - as soon as a pad appears. - With fixes from Seungha Yang <sh.yang@lge.com> - https://bugzilla.gnome.org/show_bug.cgi?id=758257 - -2017-02-03 15:35:15 +0100 Nicola Murino <nicola.murino@gmail.com> - - * configure.ac: - opencv: allow compilation against 3.2.0 - https://bugzilla.gnome.org/show_bug.cgi?id=778142 - -2017-02-02 16:47:52 +0100 Fabien Dessenne <fabien.dessenne@st.com> - - * ext/wayland/wlwindow.c: - waylandsink: set video surface opaque - Unless the video format has an alpha component (ARGB, ...), set the - video_surface opaque. - In the usual case where the black area_surface has the same size as the - video_surface (eg: run gst-play-1.0 video.mp4), this makes the black - surface totally occluded which makes weston compositor's life easier - since it can ignore that surface. - Also unconditionally set the black area_surface opaque. - https://bugzilla.gnome.org/show_bug.cgi?id=778078 - -2017-02-02 15:25:09 +0200 Vivia Nikolaidou <vivia@toolsonair.com> - - * gst/timecode/gstavwait.c: - avwait: Fix potential deadlock when flushing / shutting down audio - The mutex must be unlocked in the error case - https://bugzilla.gnome.org/show_bug.cgi?id=778076 - -2017-02-01 17:11:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Show video frames synchronously in PAUSED - Otherwise we will only show the preroll frame once PLAYING is reached, - which is rather suboptimal for e.g. seeking in PAUSED. - -2017-02-01 16:45:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Do nothing if set_caps() is called with basically the same caps again - and error out here already otherwise. We currently don't support - reconfiguration here and it can't happen really either unless the auto - mode is selected. - -2017-02-01 15:13:32 +0200 Vivia Nikolaidou <vivia@toolsonair.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Fix get_caps returning EMPTY - If get_caps is called before negotiation, channels_found will be 0 and - therefore won't intersect with the template caps. - https://bugzilla.gnome.org/show_bug.cgi?id=778028 - -2017-02-01 13:44:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/gstdewarp.cpp: - * ext/opencv/gstdewarp.h: - dewarp: Store C++ types as pointers in C structs - Otherwise the destructor will never be called, and we would have to call - the constructors manually at some point... which we never did, so - calling release() on it before it got otherwise initialized caused a - crash. For example when running gst-inspect-1.0. - -2017-02-01 16:05:23 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkwindow.c: - vkwindow: fix build error on i386 - Vulkan handles are either pointers (64-bit) or 64-bit integer - handles (32-bit). Cast the type in failure cases. - vkwindow.c:229:561: error: return makes integer from pointer without a cast -Werror=int-conversion - vkwindow.c:231:194: error: return makes integer from pointer without a cast -Werror=int-conversion - https://bugzilla.gnome.org/show_bug.cgi?id=777979 - -2017-02-01 14:44:32 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Add stream-format to the H.264 caps. - H.264 in MPEG-PS is always byte-stream - -2017-02-01 14:37:29 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Add extra length checks to TS scanning. - Add some missing size checks to the timestamp scanning - fast path. - -2017-02-01 14:25:32 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegdemux/Makefile.am: - * gst/mpegdemux/gstmpegdemux.c: - psdemux: Rewrite PSM parsing using GstByteReader - Avoid possible buffer overflows and ignore invalid PSM packets better - by using GstByteReader. - https://bugzilla.gnome.org/show_bug.cgi?id=777957 - -2017-01-27 19:26:06 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/meson.build: - decklink: Add to the meson Windows build - -2017-01-27 19:24:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Fix indentation - -2017-01-27 19:23:48 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Fix compilation on Windows by properly using COM strings there - -2017-01-27 19:15:28 +0200 Axel Menzel <AMenzel@xion-medical.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Fix compilation with MSVC - -2017-01-27 19:11:02 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.h: - decklink: Include stdint.h for int32_t, etc as needed by the Decklink headers - -2017-01-27 19:09:13 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/win/DeckLinkAPI.h: - decklink: Add "extern C" forward declaration for CreateDeckLinkIteratorInstance() - -2017-01-27 19:03:33 +0200 Axel Menzel <AMenzel@xion-medical.com> - - * sys/decklink/win/DeckLinkAPI.h: - * sys/decklink/win/DeckLinkAPIDispatch.cpp: - * sys/decklink/win/DeckLinkAPI_i.c: - decklink: Update Windows SDK to a newer version - -2017-01-01 14:06:28 +0900 Seungha Yang <sh.yang@lge.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Handle SEEK event only once - send_event() of parent class (i.e., GstBinClass) iterates srcpads - to send SEEK event. And performing it per srcpad is inefficient. - So, let's drop duplicated SEEK event by checking seqnum - https://bugzilla.gnome.org/show_bug.cgi?id=776612 - -2017-01-27 08:38:28 +0900 Seungha Yang <sh.yang@lge.com> - - * tests/check/elements/hlsdemux_m3u8.c: - tests: hlsdemux: Fix live startup sequence and seek range - To satisfy follwing restriction of HLS spec 6.3.3, - select startup fragment sequence to 4th from end of playlist. - Also, seek range should exclude last three fragment in playlist. - "the client SHOULD NOT choose a segment which starts less than - three target durations from the end of the Playlist file." - https://bugzilla.gnome.org/show_bug.cgi?id=777682 - -2017-01-27 08:50:10 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/hls/m3u8.c: - hls: m3u8: Set sequence position for live - hls live starts playback from the allowed latest fragment, - but its "sequence position" is set to zero, and so stream - time is also set to zero. - This does not make sense, because hls live allows seeking to past position, - and it's negative stream time from downstream element's point of view. - Note that, allowed seekable range (and seeking query) is - from the first fragment of playlist to the allowed latest fragment. - https://bugzilla.gnome.org/show_bug.cgi?id=777682 - -2017-01-24 21:32:13 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - hls: Exclusion of last three fragment in case of live playback - HLS spec 6.3.3 is saying that - "the client SHOULD NOT choose a segment which starts less than - three target durations from the end of the Playlist file." - To ensure above statement, the third fragment from the end of playlist - should be excluded from seekable range and also from available starting fragment. - (i.e., the fourth fragment from end of playlist is the starting fragment). - https://bugzilla.gnome.org/show_bug.cgi?id=777682 - -2017-01-24 20:21:19 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Consider timestamp of the first fragment in playlist when live seeking - During live playback, the first fragment in a updated - playlist can be advanced from that of startup playlist. - Meanwhile, since hlsdemux finds target seek position - by just accumulating fragment's duration, the base should - be adjusted to the updated first fragment's timestamp. - https://bugzilla.gnome.org/show_bug.cgi?id=777682 - -2017-01-30 11:17:53 +0100 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/gstmotioncells.cpp: - motioncells: fix mingw build - https://bugzilla.gnome.org/show_bug.cgi?id=777930 - -2017-01-27 18:11:15 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/plugin.m: - * sys/applemedia/vtenc.c: - applemedia: Fix some compiler warnings on iOS - -2017-01-27 17:24:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Fix compilation on OSX - 15:18:47 gstdecklinkaudiosrc.cpp:745:45: error: cannot initialize a parameter of type 'int64_t *' (aka 'long long *') with an rvalue of type 'gint64 *' (aka 'long *') - 15:18:47 (BMDDeckLinkMaximumAudioChannels, &self->channels_found); - 15:18:47 ^~~~~~~~~~~~~~~~~~~~~ - 15:18:47 ./linux/DeckLinkAPI.h:970:87: note: passing argument to parameter 'value' here - 15:18:47 virtual HRESULT GetInt (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ int64_t *value) = 0; - 15:18:47 ^ - -2017-01-25 13:06:28 +0200 Vivia Nikolaidou <vivia@toolsonair.com> - - * gst/timecode/Makefile.am: - * gst/timecode/gstavwait.c: - * gst/timecode/gstavwait.h: - * gst/timecode/plugin.c: - avwait: Rename timecodewait to avwait, add modes - Renamed timecodewait to avwait. Added running-time and video-first - modes. Default mode is timecode (the previous behaviour). - https://bugzilla.gnome.org/show_bug.cgi?id=777741 - -2017-01-18 17:53:00 +0200 Vivia Nikolaidou <vivia@toolsonair.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - decklinkaudiosrc: Option to use max channels supported by device - Query the device for the maximum number of channels supported and have - an option to use that. Default is still 2. - https://bugzilla.gnome.org/show_bug.cgi?id=777458 - -2017-01-26 15:35:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/glcontexthelper.c: - applemedia: Fail cleanly instead of crashing if obtaining a GL display failed - https://bugzilla.gnome.org/show_bug.cgi?id=777742 - -2017-01-26 19:52:07 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkimagememory.c: - vkimagememory: use the correct enum for RGB16/BGR16 formats - vkimagememory.c:64:14: warning: implicit conversion from enumeration type 'GstVideoGLTextureType' to different enumeration type 'VkFormat' (aka 'enum VkFormat') -Wenum-conversion - return GST_VIDEO_GL_TEXTURE_TYPE_RGB16; - https://bugzilla.gnome.org/show_bug.cgi?id=777760 - -2017-01-25 20:54:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/mpeg2enc/gstmpeg2enc.cc: - mpeg2enc: Fix compiler warning with clang - gstmpeg2enc.cc:224:5: warning: variable 'n' is incremented both in the loop header and in the loop body -Wfor-loop-analysis - n++; - ^ - gstmpeg2enc.cc:221:29: note: incremented here - for (n = 0; fpssn != 0; n++) { - ^ - -2017-01-25 20:48:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Fix compiler warning with clang - gstdecklink.cpp:821:11: warning: variable 'dtc' is used uninitialized whenever 'if' condition is false -Wsometimes-uninitialized - if (m_input->videosrc) { - ^~~~~~~~~~~~~~~~~ - gstdecklink.cpp:837:41: note: uninitialized use occurs here - stream_time, stream_duration, dtc, no_signal); - ^~~ - gstdecklink.cpp:821:7: note: remove the 'if' if its condition is always true - if (m_input->videosrc) { - ^~~~~~~~~~~~~~~~~~~~~~~ - gstdecklink.cpp:810:29: note: initialize the variable 'dtc' to silence this warning - IDeckLinkTimecode *dtc; - ^ - = NULL - -2017-01-25 19:21:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/qt/Makefile.am: - qt: The code requires at least C++11 - ... and clang requires this to be specified on the commandline while gcc - nowadays defaults to C++11 or even newer. - -2017-01-24 23:10:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Set caps/tags in the GstStream object before pushing the stream-start event - Otherwise downstream will get a more or less empty GstStream although we - already know a lot about it at this point. - -2017-01-24 14:39:35 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - * ext/openh264/gstopenh264enc.h: - openh264: add "qp-min" and "qp-max" properties - -2017-01-20 07:45:43 +0100 Lars Wendler <polynomial-c@gentoo.org> - - * configure.ac: - iqa: Move AM_CONDITIONAL(HAVE_DSSIM) outside of the iqa check block - or else configure fails with - error: conditional "HAVE_DSSIM" was never defined. - when iqa is not installed. - https://bugzilla.gnome.org/show_bug.cgi?id=777652 - -2017-01-23 12:12:06 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * gst-libs/gst/gl/meson.build: - * gst-libs/gst/insertbin/meson.build: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/player/meson.build: - * meson.build: - * meson_options.txt: - meson: Build GIR files - -2017-01-23 15:10:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * pkgconfig/gstreamer-bad-audio.pc.in: - * pkgconfig/gstreamer-bad-base.pc.in: - * pkgconfig/gstreamer-bad-video.pc.in: - pkg-config: Directly link the library with -l instead of the .la file - Which might not exist, like on most modern Linux distributions. - -2017-01-20 11:11:50 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/msdk/gstmsdkdec.c: - msdk: Propagate GstFlowReturn values - In some places a GST_FLOW_FLUSHING result was return as a FALSE - gboolean and then returned from a parent function as - GST_FLOW_ERROR. This prevented seeking from working. - https://bugzilla.gnome.org/show_bug.cgi?id=776360 - -2017-01-20 16:44:42 +0100 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - * docs/plugins/scanobj-build.stamp: - * ext/fdkaac/gstfdkaacenc.c: - fdk-aac: fix version number - As pointed out on irc, the version was menat to be 0.1.4. - -2017-01-20 14:34:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Don't leak pad name and template for Opus - It's set again (the same way) further below, overwriting the previously - allocated memory without freeing. - https://bugzilla.gnome.org/show_bug.cgi?id=777533 - -2017-01-20 07:51:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Set stream tags to NULL after unreffing - Otherwise we might try to unref them a second time a little bit later. - https://bugzilla.gnome.org/show_bug.cgi?id=777503 - -2017-01-05 19:10:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Detect media sequence number inconsistencies and fail - Without failing, we would play back random parts of the stream which is - arguably a worse user experience, and failing is also recommended by the - spec here. - And also handle live streams without any media sequence numbers at all - properly, that is, make sure the sequence numbers are increasing instead - of starting again at 0 every time. - https://bugzilla.gnome.org/show_bug.cgi?id=775665 - -2017-01-17 22:27:46 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Do pending seek when SIDX is found - Parsing SIDX box was allowed even if "indexRange" attribute does not appear - for On-Demand profile. However, actual seeking using SIDX index did not happen - since download loop keep working on. - To use SIDX index in that case, demux should try it in the next download loop. - https://bugzilla.gnome.org/show_bug.cgi?id=777394 - -2017-01-17 10:33:03 +0800 WeiChungChang <r97922153@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Fix issue when manifest update sets slow start without passing necessary header & caps changes downstream - https://bugzilla.gnome.org/show_bug.cgi?id=777206 - -2017-01-18 15:03:48 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: ensure caps are writable after intersection - gst_caps_intersect () may return an increased reference of one of the - input caps. - Fixes critical in the simple-launch-lines test: - Unexpected critical/warning: gst_caps_set_features: assertion 'IS_WRITABLE (caps)' failed - -2017-01-18 11:05:21 +1100 Jan Schmidt <jan@centricular.com> - - * gst/dvdspu/gstspu-vobsub-render.c: - dvdspu: Handle vob display rect starting on an odd line - DVDs always have subpictures that start on an even Y - coordinate, but gstspu does more generic vobsubs these - days, so handle ones that start on an odd vertical position. - https://bugzilla.gnome.org/show_bug.cgi?id=777400 - -2016-12-27 17:13:58 +0800 Lyon Wang <lyon.wang@nxp.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c: - * gst-libs/gst/player/gstplayer-video-overlay-video-renderer.h: - * win32/common/libgstplayer.def: - player: Add support for selecting a specific video sink - - Add overlay video renderer "video-sink" property, so that can be set - - In create_video_sink, it returns video sink instead of always NULL - - Add new renderer_new_with_sink() API to set video sink - https://bugzilla.gnome.org/show_bug.cgi?id=776490 - -2017-01-17 13:07:57 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer-media-info.c: - player: Add missing documentation for deprecated functions - -2017-01-10 16:38:21 +0800 Lyon Wang <lyon.wang@nxp.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - * win32/common/libgstplayer.def: - player: Add get video snapshot API - Add get video snapshot API: - gst_player_get_video_snapshot() - https://bugzilla.gnome.org/show_bug.cgi?id=773709 - -2017-01-12 16:14:57 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Fix compilation with GST_DISABLE_GST_DEBUG - -2017-01-13 14:46:12 +0100 Edward Hervey <edward@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Use proper instance name - -2017-01-13 12:39:21 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: bump version - -2017-01-13 21:17:33 +1100 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: fix build error from change in libgstgl - gstamcvideodec.c: In function 'gst_amc_video_dec_src_query': - gstamcvideodec.c:2412:55: error: 'self' undeclared (first use in this function) - if (gst_gl_handle_context_query ((GstElement *) self, query, - -2017-01-13 12:49:37 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.m: - * gst-libs/gst/gl/Makefile.am: - * sys/androidmedia/gstamcvideodec.c: - * sys/applemedia/glcontexthelper.c: - gl: update sys dependants for function removals - 4315a4b54d9 forgot to change the androidmedia/videotoolbox/caopengllayer - sources as required. - -2017-01-11 10:37:34 -0300 Juan Pablo Ugarte <ugarte@endlessm.com> - - * gst-libs/gst/gl/gstglslstage.c: - glslstage: define GL constants if needed instead of using #ifdef - https://bugzilla.gnome.org/show_bug.cgi?id=777144 - -2017-01-11 10:32:23 -0300 Juan Pablo Ugarte <ugarte@endlessm.com> - - * tests/examples/gtk/glliveshader.c: - gl/examples/gtk: fixed compilation on systems without GL_GEOMETRY_SHADER - https://bugzilla.gnome.org/show_bug.cgi?id=777143 - -2017-01-13 11:08:10 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglutils.c: - glutils: document functions - -2017-01-13 11:06:39 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * ext/gl/gstglutils.c: - * ext/gl/gstglutils.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * gst-libs/gst/gl/gstglutils_private.h: - * gst-libs/gst/gl/gstglviewconvert.c: - glutils: privatise matrix multiplication/videoaffinetransformation retrieval - -2017-01-12 21:35:25 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglstereosplit.c: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstglutils.h: - * ext/gtk/gstgtkglsink.c: - * ext/qt/gstqtsink.cc: - * ext/qt/gstqtsrc.cc: - * gst-libs/gst/gl/gstglbasefilter.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * gst-libs/gst/gl/gstglutils_private.h: - gl/utils: also take care of the local GL context in query functions - Simplifies a deduplicates a lot of code in elements retrieving/setting - the local OpenGL context. - -2017-01-12 01:57:29 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * ext/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - glutils: remove trivial helper function - gst_gl_caps_replace_all_caps_features() is only used in two places and can - be trivially reproduced. - -2017-01-11 16:09:31 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/egl/gstegl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - gl/docs: add symbols from -unused.txt - -2017-01-11 16:09:03 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglformat.h: - * gst-libs/gst/gl/gstglmemory.c: - gl/docs: some type fixes of type names - -2017-01-12 16:32:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -2017-01-12 15:55:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * ext/opencv/meson.build: - opencv: Fix build with OpenCV < 3 - We only need the opencv2/bgsegm.hpp header for OpenCV >= 3 and have - compat code for older versions. - -2017-01-12 15:38:18 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/ttml/Makefile.am: - ttml: Link with -lm for round() - -=== release 1.11.1 === - -2017-01-12 15:39:06 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstgtk.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-opengl.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qt.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtcdsp.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - Release 1.11.1 - -2017-01-12 14:42:29 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2017-01-12 14:36:46 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/da.po: - * po/de.po: - * po/fr.po: - * po/hr.po: - * po/id.po: - * po/ky.po: - * po/nb.po: - * po/pl.po: - * po/ru.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - po: Update translations - -2017-01-10 15:45:26 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/nalutils.c: - codecparsers: remove problematic 'extern inline' - 'extern inline' was added in 2fb76c89 for MSVC (it was just - 'inline' before), but all of this doesn't really make sense, - the functions are not going to be inlined anyway, and what - 'extern inline' means exactly also appears to depend on the - Cxx standard targetted. Let's just remove the 'extern inline' - entirely. At least gcc6 still emits the exact same code as - before anyway. Fixes compilation/linking with gcc 4.8 as - used on L4T on the TK1. - -2017-01-10 08:26:04 -0700 Matt Staples <staples255@gmail.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: Chain up to parent class' sink event handler - Call base class's sink_event handler after handling GST_EVENT_FLUSH_STOP - event, so that base class doesn't get stuck in a 'flushing' state - https://bugzilla.gnome.org/show_bug.cgi?id=777097 - -2017-01-10 16:27:28 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Use a simple queue instead of queue2 - The reason we previously used queue2 was to calculate the download rate, - but that wasn't entirely correct and we therefore calculate it before - queue2. We therefore now just need a simple queue. - -2016-11-11 08:44:59 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Remove unneeded variables - We now have properly non-blocking download time calculation - -2017-01-10 16:54:48 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/qt/qtwindow.cc: - * ext/qt/qtwindow.h: - qmlglsrc: use glBlitFramebuffer to copy texture for GLES3.0 - If support glBlitFrameBuffer, use it for texture copy instead - of glCopyTexImage2D - https://bugzilla.gnome.org/show_bug.cgi?id=777078 - -2017-01-10 20:07:09 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglwindow.h: - glwindow: use the same parameter names between vfuncs and functions of the same name - Silences GI warnings about symbol's not being used from source code - comment block - -2017-01-10 20:06:07 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.h: - glbasememory: type fix for GstGLBaseMemoryAllocatorAllocFunction - -2017-01-10 20:05:42 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: add missing transfer annotations - -2017-01-10 20:04:30 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldebug.c: - * gst-libs/gst/gl/gstglquery.c: - gl: add skip annotations to non-GI possible struct constructors - -2017-01-10 20:03:09 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.h: - glbasememory: remove unused and #if 0'ed function definitions - -2017-01-10 19:58:48 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs.types: - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbasememory.h: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglrenderbuffer.c: - * gst-libs/gst/gl/gstglrenderbuffer.h: - gl: add necessary get_type() functions for allocation params structures - All using the existing GstGLAllocationParams infrastructure - -2017-01-10 19:55:43 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - gl/docs/sections.txt: remove non-existant symbols - -2017-01-10 15:35:52 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - gldisplay: some annotation updates/typo fixes - -2017-01-10 14:29:46 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gl.h: - gl: remove reference to non-existant header - ../../../../gst-libs/gst/gl/gl.h:57:45: fatal error: gst/gl/gstglcontrolbindingproxy.h: No such file or directory - #include <gst/gl/gstglcontrolbindingproxy.h> - ^ - -2017-01-10 12:51:51 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstglsinkbin.c: - * ext/gl/gstglvideomixer.c: - * ext/gl/meson.build: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglcontrolbindingproxy.c: - * gst-libs/gst/gl/gstglcontrolbindingproxy.h: - * gst-libs/gst/gl/meson.build: - gl: remove custom control binding proxy - Use the existing GstProxyControlBinding instead. - -2016-11-17 17:15:55 +1100 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * pkgconfig/gstreamer-gl-uninstalled.pc.in: - * pkgconfig/gstreamer-gl.pc.in: - * pkgconfig/meson.build: - gl/pkg-config: add the configured platform/api/winsys - Allows users to query this from pkg-config instead of requiring them to - compile mini programs checking defines in gstglconfig.h - -2016-11-18 01:06:51 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbuffer.h: - gl: remove unneeded gst_gl_buffer_alloc from header file - There's no implementation anymore! - -2016-11-17 18:00:39 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimage.c: - * gst-libs/gst/gl/egl/gsteglimage.h: - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - * gst-libs/gst/gl/egl/gstglmemoryegl.h: - gl/egl: remove use of texture orientation - -2016-11-17 17:51:54 +1100 Matthew Waters <matthew@centricular.com> - - * pkgconfig/gstreamer-gl-uninstalled.pc.in: - * pkgconfig/gstreamer-gl.pc.in: - gl/pkg-config: don't advertise all our dependent libraries as deps - If an application/library explicitly needs a library, it needs to link - against it itself. - -2017-01-09 17:53:38 +0200 Vivia Nikolaidou <vivia@toolsonair.com> - - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - timecodestamper: Post element message with current timecode - timecodestamper will post an element message which contains the current - timecode it just stamped. If a timecode was already found and not - replaced, it will still post it in a message. - https://bugzilla.gnome.org/show_bug.cgi?id=777048 - -2017-01-05 15:41:06 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Do not append a zero timecode if none is found on the source - If the source doesn't give us timecode information, do not append a zero - timecode to the frames. - https://bugzilla.gnome.org/show_bug.cgi?id=776900 - -2017-01-10 01:00:12 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - glcontext/egl: don't overwrite set GError - Doing so is an error and will cause a glib warning to be printed. - https://bugzilla.gnome.org/show_bug.cgi?id=776722 - -2017-01-05 20:45:15 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/decklink/meson.build: - meson: decklink: fix plugin filename - -2017-01-05 20:34:14 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - * sys/decklink/meson.build: - * sys/meson.build: - meson: build decklink plugin - -2017-01-05 12:34:39 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * pkgconfig/meson.build: - meson: Do not use gstwayland variable when not set - -2017-01-05 12:31:14 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * pkgconfig/meson.build: - meson: Generate the wayland pc file when needed - -2017-01-05 11:25:13 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * pkgconfig/meson.build: - meson: Do not try to use unset gstgl if gstgl is not built - -2017-01-05 15:05:07 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcaudiodec.c: - androidmedia: Add support for Opus in the decoder - -2017-01-05 15:00:21 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Silently skip COLOR_FormatAndroidOpaque when converting to caps - This is special and handled in the decoder when doing rendering to a - surface. Printing a warning for this is just unnecessary noise - -2017-01-04 16:51:10 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-bad-audio-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-base-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-video-uninstalled.pc.in: - * pkgconfig/gstreamer-codecparsers-uninstalled.pc.in: - * pkgconfig/gstreamer-gl-uninstalled.pc.in: - * pkgconfig/gstreamer-insertbin-uninstalled.pc.in: - * pkgconfig/gstreamer-mpegts-uninstalled.pc.in: - * pkgconfig/gstreamer-player-uninstalled.pc.in: - * pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in: - * pkgconfig/gstreamer-wayland-uninstalled.pc.in: - * pkgconfig/meson.build: - meson: generate pkg-config -uninstalled pc files - Generating those files is useful for users building the GStreamer stack - using meson and having to link it to another project which is still - using the autotools. - While doing so, fix some -uninstalled pc files which were using a - suspicious 'pcfiledir' which was never replaced or defined. - https://bugzilla.gnome.org/show_bug.cgi?id=776810 - -2016-12-09 17:48:52 -0300 Thibault Saunier <tsaunier@gnome.org> - - * meson.build: - meson: Support building without Gst debug - -2017-01-04 20:59:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - androidmedia: Add support for VP9 - -2017-01-03 18:53:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstjniutils.c: - androidmedia: Actively request the Java VM from the application - This is more consistent with how we already request the application - class loader and other application resources elsewhere. - -2017-01-03 17:31:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Fix indentation - -2017-01-03 17:30:07 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - decklinkaudiosrc: Add support for 8/16 channels via property - These are unpositioned channel layouts. - -2017-01-03 09:02:36 +0530 Garima Gaur <garima.g@samsung.com> - - * ext/opencv/gstcvdilateerode.cpp: - * ext/opencv/gstcvsmooth.cpp: - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rsrc.c: - * sys/applemedia/vtenc.c: - * sys/vdpau/gstvdpvideopostprocess.c: - Fix some caps leaks in pad template creation code - gst_pad_template_new() does not take ownership of - the caps passed to it, so we need to unref the caps. - https://bugzilla.gnome.org/show_bug.cgi?id=776790 - https://bugzilla.gnome.org/show_bug.cgi?id=776787 - -2016-12-08 10:22:23 +0100 Fabien Dessenne <fabien.dessenne@st.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: fix display re-connection (redraw pending) - Reset redraw_pending at display disconnection, so we can re-connect - later from a clean state (avoid endless buffer drops). - Add a log to inform of dropped buffers. - https://bugzilla.gnome.org/show_bug.cgi?id=775791 - -2016-12-14 10:37:14 +0100 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstdewarp.cpp: - * ext/opencv/gstdewarp.h: - * ext/opencv/gstopencv.cpp: - * ext/opencv/meson.build: - opencv: add dewarp plugin - new plugin that dewarp fisheye images - https://bugzilla.gnome.org/show_bug.cgi?id=776047 - -2017-01-02 21:05:55 +0100 Fabrice Bellet <fabrice@bellet.info> - - * ext/x265/gstx265enc.c: - x265: fix a minor string leak - https://bugzilla.gnome.org/show_bug.cgi?id=776727 - -2016-12-31 20:57:54 +0100 Fabrice Bellet <fabrice@bellet.info> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: fix a reconfigure event leak - https://bugzilla.gnome.org/show_bug.cgi?id=776726 - -2017-01-02 19:56:40 +0530 Arun Raghavan <arun@arunraghavan.net> - - * config.h.meson: - * sys/meson.build: - * sys/uvch264/meson.build: - uvch264src: Add meson build support - -2017-01-02 19:55:34 +0530 Arun Raghavan <arun@arunraghavan.net> - - * sys/uvch264/gstuvch264_src.c: - uvch264src: Fix wrong argument order to force-key-unit event - CID 1373421 - -2017-01-02 14:52:29 +0100 Edward Hervey <edward@centricular.com> - - * tests/check/elements/h264parse.c: - * tests/check/elements/rtponvifparse.c: - * tests/check/libs/player.c: - check: Use gst_check_run_suite - Ensures that xunit reports get generated when requested - -2017-01-02 17:50:02 +0530 Arun Raghavan <arun@arunraghavan.net> - - * ext/smoothstreaming/gstmssmanifest.c: - smoothstreaming: Fix minor use after free reference - Just a matter of reordering a g_free() /after/ cleaning out all the - members. - CID 1396746 - -2015-03-11 21:54:01 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst/videosignal/gstvideoanalyse.c: - videoanalyse: update docs - https://bugzilla.gnome.org/show_bug.cgi?id=746018 - -2016-12-29 18:56:43 +0000 Ursula Maplehurst <ursula@kangatronix.co.uk> - - * sys/androidmedia/Makefile.am: - androidmedia: some files are missing in the release tarball - https://bugzilla.gnome.org/show_bug.cgi?id=776591 - -2016-12-28 13:52:50 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpeg4videoparse.h: - mpeg4videoparse: determine intra of frame at frame parse time - ... rather than when determining when to end the frame. - The opportunity to do so might not come when forced to drain, - and it seems nicer anyway to do so at parse wrapup time. - -2016-12-24 08:42:51 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/dash_isoff.c: - dash: Define debug category used in the isoff code for the test too now - -2016-12-24 14:31:12 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstisoff.c: - dash: Include debug of gstisoff on dashdemux category - Move debug category of gstisoff from default to dashdemux - https://bugzilla.gnome.org/show_bug.cgi?id=776461 - -2016-12-23 13:27:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiobuffersplit/gstaudiobuffersplit.c: - audiobuffersplit: Don't try to output anything if samples_per_buffer == 0 - This happens if we had no CAPS event yet but e.g. got an EOS event. We - would then try to output a 0-sized buffer, but getting that from the - adapter will give an assertion, return NULL and then crash. - -2016-12-23 15:41:57 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Add first_offset of sidx box to base offset - sidx has "first_offset" syntax which represents the distance in bytes - from anchor point to media fragment. If present, we should adjust - sidx_base_offset. - https://bugzilla.gnome.org/show_bug.cgi?id=776431 - -2016-12-23 15:31:34 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Ensure sidx parsing when updating fragment info - Fix seek fail with On-Demand profile mpd which has no indexRange attribute - https://bugzilla.gnome.org/show_bug.cgi?id=776431 - -2016-12-22 11:48:05 -0500 Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com> - - * configure.ac: - configure: improve QPA check for cross compilation - Prefix the $QPA_INCLUDE_PATH with $PKG_CONFIG_SYSROOT_DIR just - like when checking for opencv dir. - https://bugzilla.gnome.org/show_bug.cgi?id=776399 - -2016-12-22 16:08:30 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - * sys/dvb/parsechannels.c: - dvb: move adapter number set-up by way of environment to dvbsrc - This logic did not belong to the channel configuration - parser (only used by dvbbasebin) but to dvbsrc, which - is the element directly using this value and honoring - the "adapter" property. - Allows previously non-working cases like this to work: - GST_DVB_ADAPTER=1 gst-launch-1.0 dvbsrc delsys=11 modulation=7 frequency=689000000 ! fakesink - -2016-12-22 13:42:59 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb: parsechannels: replace missleadign error message - Possible failure cases also include not finding the - requested channel. - -2016-12-12 17:05:53 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add DTV_STREAM_ID to the >= v8 (minor) group - Drop redundant comment while at it. - -2016-12-21 23:24:48 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Drain remaining buffer in adapter - Previous patch allows sidx box parsing from incoming buffers. - Since the incoming buffer boundary might be over sidx box, - there can be remaining buffer in isobmff parser adapter. - https://bugzilla.gnome.org/show_bug.cgi?id=776352 - -2016-12-21 13:31:18 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - configure: Remove left-over file - -2016-12-21 12:05:35 +0100 Edward Hervey <bilboed@bilboed.com> - - * tests/check/libs/player.c: - check: Use non-deprecated API - -2016-12-21 11:38:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer-media-info.c: - * gst-libs/gst/player/gstplayer-media-info.h: - * win32/common/libgstplayer.def: - player: Add deprecated compatibility functions for the audio/video/subtitle stream getters - -2016-12-21 11:32:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/player/gstplayer-media-info.c: - * gst-libs/gst/player/gstplayer-media-info.h: - * gst-libs/gst/player/gstplayer.c: - * win32/common/libgstplayer.def: - player: Move audio/video/subtitle stream list getters into the correct namespace - -2016-12-20 18:20:02 +0800 Lyon Wang <lyon.wang@nxp.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/player/gstplayer-media-info.c: - * gst-libs/gst/player/gstplayer-media-info.h: - * win32/common/libgstplayer.def: - player: Add get track number media info API - https://bugzilla.gnome.org/show_bug.cgi?id=773570 - -2016-12-21 11:00:47 +0200 Sebastian Dröge <sebastian@centricular.com> - - * config.h.meson: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.signals: - * ext/Makefile.am: - * ext/apexsink/LGPL-3.0.txt: - * ext/apexsink/Makefile.am: - * ext/apexsink/gstapexplugin.c: - * ext/apexsink/gstapexraop.c: - * ext/apexsink/gstapexraop.h: - * ext/apexsink/gstapexsink.c: - * ext/apexsink/gstapexsink.h: - * ext/libvisual/Makefile.am: - * ext/libvisual/visual-gl.c: - * ext/meson.build: - * ext/nas/Makefile.am: - * ext/nas/nassink.c: - * ext/nas/nassink.h: - * ext/sdl/Makefile.am: - * ext/sdl/gstsdl.c: - * ext/sdl/sdlaudiosink.c: - * ext/sdl/sdlaudiosink.h: - * ext/sdl/sdlvideosink.c: - * ext/sdl/sdlvideosink.h: - * ext/sndio/Makefile.am: - * ext/sndio/gstsndio.c: - * ext/sndio/sndiosink.c: - * ext/sndio/sndiosink.h: - * ext/sndio/sndiosrc.c: - * ext/sndio/sndiosrc.h: - * ext/timidity/gsttimidity.c: - * ext/timidity/gsttimidity.h: - * ext/wildmidi/Makefile.am: - * ext/wildmidi/README: - * ext/wildmidi/gstwildmidi.c: - * ext/wildmidi/gstwildmidi.h: - * ext/xvid/Makefile.am: - * ext/xvid/gstxvid.c: - * ext/xvid/gstxvid.h: - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxviddec.h: - * ext/xvid/gstxvidenc.c: - * ext/xvid/gstxvidenc.h: - * gst/audiobuffer/Makefile.am: - * gst/audiobuffer/gstaudioringbuffer.c: - * gst/audiobuffer/meson.build: - * gst/cdxaparse/Makefile.am: - * gst/cdxaparse/gstcdxaparse.c: - * gst/cdxaparse/gstcdxaparse.h: - * gst/cdxaparse/gstvcdparse.c: - * gst/cdxaparse/gstvcdparse.h: - * gst/cdxaparse/meson.build: - * gst/dccp/Makefile.am: - * gst/dccp/gstdccp.c: - * gst/dccp/gstdccp.h: - * gst/dccp/gstdccp_common.h: - * gst/dccp/gstdccpclientsink.c: - * gst/dccp/gstdccpclientsink.h: - * gst/dccp/gstdccpclientsrc.c: - * gst/dccp/gstdccpclientsrc.h: - * gst/dccp/gstdccpplugin.c: - * gst/dccp/gstdccpserversink.c: - * gst/dccp/gstdccpserversink.h: - * gst/dccp/gstdccpserversrc.c: - * gst/dccp/gstdccpserversrc.h: - * gst/dccp/meson.build: - * gst/faceoverlay/Makefile.am: - * gst/faceoverlay/gstfaceoverlay.c: - * gst/faceoverlay/gstfaceoverlay.h: - * gst/faceoverlay/meson.build: - * gst/games/Makefile.am: - * gst/games/gstpuzzle.c: - * gst/games/gstvideoimage.c: - * gst/games/gstvideoimage.h: - * gst/games/meson.build: - * gst/hdvparse/Makefile.am: - * gst/hdvparse/gsthdvparse.c: - * gst/hdvparse/gsthdvparse.h: - * gst/hdvparse/meson.build: - * gst/meson.build: - * gst/mixmatrix/Makefile.am: - * gst/mixmatrix/meson.build: - * gst/mixmatrix/mixmatrix.c: - * gst/mve/Makefile.am: - * gst/mve/TODO: - * gst/mve/gstmve.c: - * gst/mve/gstmvedemux.c: - * gst/mve/gstmvedemux.h: - * gst/mve/gstmvemux.c: - * gst/mve/gstmvemux.h: - * gst/mve/meson.build: - * gst/mve/mve.h: - * gst/mve/mveaudiodec.c: - * gst/mve/mveaudioenc.c: - * gst/mve/mvevideodec16.c: - * gst/mve/mvevideodec8.c: - * gst/mve/mvevideoenc16.c: - * gst/mve/mvevideoenc8.c: - * gst/nuvdemux/Makefile.am: - * gst/nuvdemux/gstnuvdemux.c: - * gst/nuvdemux/gstnuvdemux.h: - * gst/nuvdemux/meson.build: - * gst/overlay/Makefile.am: - * gst/overlay/gstoverlay.c: - * gst/overlay/gstoverlay.h: - * gst/overlay/meson.build: - * gst/patchdetect/Makefile.am: - * gst/patchdetect/gstpatchdetect.c: - * gst/patchdetect/gstpatchdetect.h: - * gst/patchdetect/meson.build: - * gst/rtjpeg/.gitignore: - * gst/rtjpeg/Makefile.am: - * gst/rtjpeg/README: - * gst/rtjpeg/RTjpeg.c: - * gst/rtjpeg/RTjpeg.h: - * gst/rtjpeg/gstrtjpeg.c: - * gst/rtjpeg/gstrtjpegdec.c: - * gst/rtjpeg/gstrtjpegdec.h: - * gst/rtjpeg/gstrtjpegenc.c: - * gst/rtjpeg/gstrtjpegenc.h: - * gst/rtjpeg/meson.build: - * gst/sdi/Makefile.am: - * gst/sdi/gstsdi.c: - * gst/sdi/gstsdidemux.c: - * gst/sdi/gstsdidemux.h: - * gst/sdi/gstsdimux.c: - * gst/sdi/gstsdimux.h: - * gst/sdi/meson.build: - * gst/tta/Makefile.am: - * gst/tta/crc32.h: - * gst/tta/filters.h: - * gst/tta/gsttta.c: - * gst/tta/gstttadec.c: - * gst/tta/gstttadec.h: - * gst/tta/gstttaparse.c: - * gst/tta/gstttaparse.h: - * gst/tta/meson.build: - * gst/tta/ttadec.h: - * gst/vbidec/Makefile.am: - * gst/vbidec/gstvbidec.c: - * gst/vbidec/gstvbidec.h: - * gst/vbidec/meson.build: - * gst/vbidec/vbidata.c: - * gst/vbidec/vbidata.h: - * gst/vbidec/vbiscreen.c: - * gst/vbidec/vbiscreen.h: - * meson.build: - * po/POTFILES.in: - * po/POTFILES.skip: - * sys/Makefile.am: - * sys/avc/Makefile.am: - * sys/avc/gstavcplugin.cpp: - * sys/avc/gstavcsrc.cpp: - * sys/avc/gstavcsrc.h: - * sys/dxr3/.gitignore: - * sys/dxr3/Makefile.am: - * sys/dxr3/ac3_padder.c: - * sys/dxr3/ac3_padder.h: - * sys/dxr3/dxr3audiosink.c: - * sys/dxr3/dxr3audiosink.h: - * sys/dxr3/dxr3common.h: - * sys/dxr3/dxr3init.c: - * sys/dxr3/dxr3marshal.list: - * sys/dxr3/dxr3spusink.c: - * sys/dxr3/dxr3spusink.h: - * sys/dxr3/dxr3videosink.c: - * sys/dxr3/dxr3videosink.h: - * sys/linsys/Makefile.am: - * sys/linsys/gstlinsys.c: - * sys/linsys/gstlinsyssdisink.c: - * sys/linsys/gstlinsyssdisink.h: - * sys/linsys/gstlinsyssdisrc.c: - * sys/linsys/gstlinsyssdisrc.h: - * sys/linsys/include/asi.h: - * sys/linsys/include/master.h: - * sys/linsys/include/sdi.h: - * sys/linsys/include/sdiaudio.h: - * sys/linsys/include/sdivideo.h: - * sys/meson.build: - * sys/pvr2d/Makefile.am: - * sys/pvr2d/gstpvr.c: - * sys/pvr2d/gstpvr.h: - * sys/pvr2d/gstpvrbufferpool.c: - * sys/pvr2d/gstpvrbufferpool.h: - * sys/pvr2d/gstpvrvideosink.c: - * sys/pvr2d/gstpvrvideosink.h: - * sys/pvr2d/pvr_includes/dri2_ws.h: - * sys/pvr2d/pvr_includes/img_defs.h: - * sys/pvr2d/pvr_includes/img_types.h: - * sys/pvr2d/pvr_includes/pvr2d.h: - * sys/pvr2d/pvr_includes/services.h: - * sys/pvr2d/pvr_includes/servicesext.h: - * sys/pvr2d/pvr_includes/wsegl.h: - * sys/qcam/Makefile.am: - * sys/qcam/dark.c: - * sys/qcam/exposure.c: - * sys/qcam/gstqcamsrc.c: - * sys/qcam/gstqcamsrc.h: - * sys/qcam/qcam-Linux.c: - * sys/qcam/qcam-Linux.h: - * sys/qcam/qcam-lib.c: - * sys/qcam/qcam-os.c: - * sys/qcam/qcam-os.h: - * sys/qcam/qcam.h: - * sys/qcam/qcamip.h: - * sys/wininet/Makefile.am: - * sys/wininet/gstwininetsrc.c: - * sys/wininet/gstwininetsrc.h: - * tests/check/Makefile.am: - * tests/check/elements/timidity.c: - * tests/icles/dccp/README: - * tests/icles/dccp/call/DCCPClient.c: - * tests/icles/dccp/call/DCCPServer.c: - * tests/icles/dccp/call/README: - * tests/icles/dccp/file/DCCPClientSaveFile.c: - * tests/icles/dccp/file/DCCPServerSendFile.c: - * tests/icles/dccp/mic/DCCPClientPlayMic.c: - * tests/icles/dccp/mic/DCCPServerMic.c: - * tests/icles/dccp/mp3/DCCPClientPlayMP3.c: - * tests/icles/dccp/mp3/DCCPServerSendMP3.c: - * tests/icles/dccp/mp3Speex/DCCPClientPlaySpeexMP3.c: - * tests/icles/dccp/mp3Speex/DCCPServerSendSpeexMP3.c: - * tests/icles/dccp/mp3Stream/DCCPClientPlayMP3Stream.c: - * tests/icles/dccp/mp3Stream/DCCPServerSendMP3Stream.c: - Remove various unported plugins - If they were not ported after 4+ years it seems unlikely that anybody is - ever going to need them again. They're still in the GIT history if - needed. - https://bugzilla.gnome.org/show_bug.cgi?id=774530 - -2016-12-21 13:41:16 +0530 Garima Gaur <garima.g@samsung.com> - - * gst/sdp/gstsdpdemux.c: - * sys/dvb/dvbbasebin.c: - gst: Fix memory leaks in usage of gst_element_get_request_pad() API - The return value has to be unreffed at some point. - https://bugzilla.gnome.org/show_bug.cgi?id=776334 - -2016-12-20 15:45:12 -0600 Daniel Garbanzo <daniel.garbanzo@ridgerun.com> - - * tools/Makefile.am: - tools: dist gst-project-maker script - https://bugzilla.gnome.org/show_bug.cgi?id=776317 - -2016-12-20 11:16:11 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Always parsing sidx for On-Demand profile - The indexRange attribute is optional and if it's not present, we should - extract the sidx box from incoming buffers. - https://bugzilla.gnome.org/show_bug.cgi?id=776200 - -2016-12-17 15:56:07 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstisoff.c: - * ext/dash/gstisoff.h: - dash: Split gst_isoff_sidx_parser_add_buffer() function - To parsing sidx box itself with isobmff parser, - split gst_isoff_sidx_parser_add_buffer() into two parts. - https://bugzilla.gnome.org/show_bug.cgi?id=776200 - -2016-12-19 11:40:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux-util.c: - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Extract ID3 tags, strip them from the output and provide them as tags - They often don't only contain the PCR information but also other - metadata, like title. Give this information to the pipeline. - Also strip the tags from the stream as we a) already parsed them now and - b) decoders don't like these tags to happen in the middle of the stream - (i.e. the start of each fragment) and tagdemux only can strip them off - the beginning and end. - -2016-12-18 19:18:23 +0000 Graham Leggett <minfrin@sharp.fm> - - * gst/mpegtsdemux/mpegtsbase.c: - tsdemux: Don't leak a taglist if a taglist has already been created - https://bugzilla.gnome.org/show_bug.cgi?id=776244 - -2016-12-17 13:42:34 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/qt/gstqtsink.cc: - * ext/qt/gstqtsrc.cc: - qt: improve element and property descriptions a bit - -2016-12-16 22:45:06 +0000 Tim-Philipp Müller <tim@centricular.com> - - * win32/MANIFEST: - win32: fix distcheck - -2016-12-16 19:15:36 +0000 Tim-Philipp Müller <tim@centricular.com> - - * .gitignore: - * Makefile.am: - * configure.ac: - * win32/common/config.h: - win32: remove generation of pre-made config.h for msvc builds - This is no longer needed with the Meson build. - -2016-12-16 17:22:29 +0000 Tim-Philipp Müller <tim@centricular.com> - - * .gitignore: - * Makefile.am: - * configure.ac: - * gst-plugins-bad.spec.in: - Remove generated .spec file - Likely extremely bitrotten, and we should not ship this anyway. - -2016-12-17 01:00:00 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglformat.c: - gl/format: use the unsized format for RGB on GLES2 - In GLES2 GL_RGB8 doesn't exist so we cannot use it, use GL_RGB - instead. - https://bugzilla.gnome.org/show_bug.cgi?id=776141 - -2016-12-16 13:25:58 +0200 Daniel Shahaf <danielsh@apache.org> - - * gst/geometrictransform/gstmirror.h: - mirror: Fix documentation for the mirror mode - Using the wrong enum there causes it to be randomly mixed with the docs - of the other enums. - https://bugs.debian.org/848297 - -2016-12-16 00:22:41 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - gl/window: remove unused priv variable - https://ci.gstreamer.net/job/GStreamer-master/7989/console - -2016-12-15 00:59:45 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - gl/window: remove use of main_context_push/pop_thread_default() - No-one's using/depending on it (it would have criticalled and not worked) - and it's causing more problems than it's solving. Store the GMainContext - in the public struct instead for subclasses to optionally use instead of - relying on the push/pop state to be correct. - https://bugzilla.gnome.org/show_bug.cgi?id=775970 - -2016-12-07 16:51:27 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/gl/gstgleffects.c: - gl/effects: use non-PBO GLMemory for internal textures - middle textures in gleffects do not need to use GstGLMemoryPBO as they - aren't transfering data to/from the GPU. This will cost too much DMA - memory and cause performance issue. Change the allocator to use non-PBO - GstGLMemory. - https://bugzilla.gnome.org/show_bug.cgi?id=776072 - -2016-12-15 14:05:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcaudiodec.c: - amcaudiodec: Set "is-adts" to 1 for ADTS AAC - Otherwise it fails to decode. - https://bugzilla.gnome.org/show_bug.cgi?id=740101 - -2016-12-14 15:53:41 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: Reject multiview video - glvideomixer does not support it currently and it needs special support - for handling this correctly, and is rather non-trivial to implement for - all formats. - -2016-12-14 15:36:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/compositor.c: - compositor: Reject multiview video - Compositor does not support it currently and it needs special support - for handling this correctly, and is rather non-trivial to implement for - all formats. - -2016-12-14 15:35:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Remove unlock() if set_info() fails - There is not mutex locked here that needs to be unlocked. - -2016-12-14 13:10:18 +0530 Garima Gaur <garima.g@samsung.com> - - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - * sys/vdpau/gstvdpdecoder.c: - sys: Fix caps memory leak from pad template creation - https://bugzilla.gnome.org/show_bug.cgi?id=776076 - -2016-12-14 13:10:46 +1100 Jan Schmidt <jan@centricular.com> - - * ext/gme/gstgme.c: - gme: Forward other non-EOS events downstream - Allow most events through as-is so at least we don't - warn about missing stream-start. Drop segment and caps, - as those are sent internally. - -2016-12-13 22:39:01 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gltestsrc.c: - * ext/libde265/libde265-dec.c: - * ext/opencv/MotionCells.h: - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkinstance.c: - * gst-libs/gst/gl/egl/gsteglimage.c: - * gst-libs/gst/gl/gstglupload.c: - * sys/msdk/msdk.c: - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/adaptive_demux_engine.c: - * tests/check/elements/compositor.c: - * tests/check/elements/dash_demux.c: - * tests/check/elements/dash_mpd.c: - * tests/check/elements/hls_demux.c: - * tests/check/elements/mssdemux.c: - * tests/check/elements/test_http_src.c: - gst: Don't declare variables inside the for loop header - This is a C99 feature. - -2016-12-13 22:21:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - dashdemux: Don't declare variables inside the for loop header - This is a C99 feature. - -2016-12-13 20:42:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gme/gstgme.c: - gme: Free decoder instance when going from PAUSED to READY - We only ever cleaned it up before on errors. - -2016-11-22 13:55:00 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkmjpegdec.c: - * sys/msdk/gstmsdkmjpegdec.h: - * sys/msdk/meson.build: - msdk: add mjpeg decoder - https://bugzilla.gnome.org/show_bug.cgi?id=774793 - -2016-10-05 15:32:43 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkmjpegenc.c: - * sys/msdk/gstmsdkmjpegenc.h: - * sys/msdk/meson.build: - msdk: add mjpeg encoder - https://bugzilla.gnome.org/show_bug.cgi?id=774793 - -2016-11-28 19:14:20 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkh265dec.c: - * sys/msdk/gstmsdkh265dec.h: - * sys/msdk/meson.build: - msdk: Add H.265 decoder - https://bugzilla.gnome.org/show_bug.cgi?id=775726 - -2016-11-07 12:32:38 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkdec.c: - * sys/msdk/gstmsdkdec.h: - * sys/msdk/gstmsdkh264dec.c: - * sys/msdk/gstmsdkh264dec.h: - * sys/msdk/meson.build: - msdk: Add H.264 decoder - The decoder only supports system memory output presently. - https://bugzilla.gnome.org/show_bug.cgi?id=774587 - -2016-12-12 15:09:36 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Avoid using unset GError - gst_uri_handler_set_uri() doesn't guarantee the GError will be set - if it returns FALSE. - -2016-12-12 10:43:43 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/ttml/gstttmlrender.c: - ttmlrender: Fix segfault on _render_text_region() - Fix invalid memory access - https://bugzilla.gnome.org/show_bug.cgi?id=775965 - -2016-12-12 14:42:39 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/ttml/gstttmlparse.c: - ttmlparse: Transform caps event - For autoplugging, decodebin/parsebin refers to the caps event. - https://bugzilla.gnome.org/show_bug.cgi?id=775967 - -2016-12-08 12:37:25 +0300 Sergey Borovkov <sergey.borovkov@wireload.net> - - * ext/qt/gstqtglutility.cc: - qml: Fix egl being deinitialized on display cleanup - Use the with_egl_display() variant in order to not destroy the - EGLDisplay on destruction. - https://bugzilla.gnome.org/show_bug.cgi?id=775793 - -2016-12-08 12:07:31 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix unconditional use of FEC 2/5 - It is not defined for < v5 minor 7 - -2016-12-06 15:40:38 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add delivery system to missing modulation check message - A tuning operation can spawn multiple checks. Being - able to differentiate between them makes debugging - easier. - -2016-12-05 16:51:10 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - * sys/dvb/parsechannels.h: - dvb/parsechannels: drop trailing whitespace - -2016-12-08 11:22:38 +0530 Arun Raghavan <arun@osg.samsung.com> - - * gst-libs/gst/player/gstplayer.c: - player: Don't try to cache the GQuark for GST_PLAYER_ERROR - This is potentially racy (in the unlikely scenario that we get two - first-time calls to gst_player_error_quark() at the same time). This - should not impact anything in terms of performance since it's only on - the error path. - The call itself could just be inlined by making GST_PLAYER_ERROR be - defined to the g_quark_from_static_string() call, but this feels ugly - from an API perspective. - -2016-12-07 16:06:48 +0100 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - * ext/fdkaac/gstfdkaacenc.c: - fdkaac: fix the build for older fdkaac versions - Support for 7.1 was added in 0.1.14. - -2016-12-07 22:55:46 +1100 Matthew Waters <matthew@centricular.com> - - * ext/qt/qtitem.cc: - qml/item: also unref the display on destruction - Leaking objects (and a thread!) is never a good idea. - https://bugzilla.gnome.org/show_bug.cgi?id=775746 - -2016-12-07 22:58:29 +1100 Matthew Waters <matthew@centricular.com> - - * tests/examples/qt/qmlsink/main.cpp: - tests/examples/qmlsink: scope QApplication/Engine - So they are destroyed before gst_deinit() is run and the leaks tracer - doesn't show false-positives. - https://bugzilla.gnome.org/show_bug.cgi?id=775746 - -2016-12-07 10:26:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/chromaprint/gstchromaprint.c: - chromaprint: Fix compilation with chromaprint 1.4 - It takes const int16_t * as argument now, while before it was void *. To - make this work with both versions without #ifdef, we omit the const. - -2016-12-05 23:38:53 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: drop needless wrapper around DVB API's dvb_diseqc_master_cmd - Its only purpose was to hold a wait time that was always 0 - -2016-12-05 23:18:38 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: drop supperfluous wait in diseqc_send_msg() - It is always zero. - -2016-12-06 07:58:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/vmnc/vmncdec.c: - vmncdec: Sanity-check rectangle sizes a bit more thorough - The x/y coordinates could already be bigger than the configured - width/height, and adding the rectangle width/height could cause an - overflow. - -2016-12-05 15:56:36 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix unconditional use of SYS_DVBC_ANNEX_C - It is not defined for < v5 minor 6 - -2016-12-05 15:53:10 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix value for DVB-C annex B field in adapter structure - -2016-12-05 18:17:30 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/rawparse/gstrawvideoparse.c: - rawvideoparse: fix typos in property description - -2016-11-28 15:57:33 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * ext/dtls/gstdtlsagent.c: - dtls: Set openssl's threadid the 1.0.x way - For pre-1.1.x openssl, a callback to set the thread id needs to be - provided to openssl. In 0.9.x the thread id was an unsigned long. In - 1.0.x it was expanded to be able to hold a void*. Here we change to use - the 1.0.x API so that the thread id can always hold a GThread*, even on - platforms like msvc x64 where unsigned long is only 32 bits. - All of this is still #ifdef'd out of existence when building with - openssl 1.1.x or later which changed the thread API again, and does not - need a thread id callback. - https://bugzilla.gnome.org/show_bug.cgi?id=775292 - -2016-12-04 14:42:47 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstsegmentation.h: - segmentation: Port to GstOpencvVideoFilter base class - -2016-12-03 22:40:11 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/gstgrabcut.cpp: - * ext/opencv/gstgrabcut.h: - grabcut: Port to GstOpencvVideoFilter base class - -2016-12-03 22:02:23 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/gstretinex.cpp: - * ext/opencv/gstretinex.h: - retinex: Port to GstOpencvVideoFilter base class - This allow reducing slightly the code. It also fixes a bug caused by - in-place buffer being mapped and never unmapped. - -2016-12-03 08:19:37 +0100 Edward Hervey <bilboed@bilboed.com> - - * README: - * common: - Automatic update of common submodule - From d015674 to 39ac2f5 - -2016-12-01 22:02:51 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/meson.build: - opencv/meson: check presence of required opencv_contrib headers - https://bugzilla.gnome.org/show_bug.cgi?id=772822 - -2016-12-01 21:55:04 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/gstedgedetect.cpp: - * ext/opencv/gstedgedetect.h: - edgedetect: Avoid extra copy of the output image - Simply produce the result into the output image provided by the base - class. This avoid useless copy. This also removes unchecked buffer map - and ensure that GstVideoMeta is respected (for stride mostly). - https://bugzilla.gnome.org/show_bug.cgi?id=775377 - -2016-12-01 21:51:31 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/gstedgedetect.cpp: - edgedetect: Remove redundant CAPS event handler - There is already a cv_set_caps() implemented, so just do the - entire work there. - https://bugzilla.gnome.org/show_bug.cgi?id=775377 - -2016-12-01 21:45:53 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/gstcvlaplace.cpp: - * ext/opencv/gstcvlaplace.h: - cvlaplace: Avoid extra copy of the output image - Simply produce the result into the output image provided by the base - class. This avoid useless copy. This also removes unchecked buffer map - and ensure that GstVideoMeta is respected (for stride mostly). - https://bugzilla.gnome.org/show_bug.cgi?id=775377 - -2016-12-01 21:43:04 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/gstcvlaplace.cpp: - cvlaplace: Remove redundant CAPS event handler - There is already a cv_set_caps() implemented, so just do the - entire work there. - https://bugzilla.gnome.org/show_bug.cgi?id=775377 - -2016-12-01 21:36:13 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/gstcvsobel.cpp: - * ext/opencv/gstcvsobel.h: - cvsobel: Avoid extra copy of the output image - Simply produce the result into the output image provided by the base - class. This avoid useless copy. This also removes unchecked buffer map - and ensure that GstVideoMeta is respected (for stride mostly). - https://bugzilla.gnome.org/show_bug.cgi?id=775377 - -2016-12-01 21:28:31 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/gstcvsobel.cpp: - cvsobel: Remove redundant CAPS event handler - There is already a cv_set_caps() implemented, so just do the - entire work there. - https://bugzilla.gnome.org/show_bug.cgi?id=775377 - -2016-12-01 21:13:23 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gstmotioncells.cpp: - opencv: Remove uneeded buffer writability check - When set to in_place, the BaseTransform class will guaranty that buffers - passed to transform_ip() function are writable. - https://bugzilla.gnome.org/show_bug.cgi?id=775378 - -2016-12-01 09:24:18 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglupload.c: - gstglupload: relax EGL context check - Check for GST_GL_PLATFORM_EGL enum instead of type GstGLContextEGL. - https://bugzilla.gnome.org/show_bug.cgi?id=774518 - -2016-11-30 09:22:17 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglcontext.c: - gstglcontext: is_shared should return FALSE if no group - If a sub class of GstGLContext does not create a group - then it currently crashes: - 0 g_atomic_int_get (&share->refcount) - 1 _context_share_group_is_shared (context->priv->sharegroup) - 2 gst_gl_context_is_shared - 3 _default_set_sync_gl - https://bugzilla.gnome.org/show_bug.cgi?id=774518 - -2016-11-30 22:40:45 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/ttml/meson.build: - meson/ttml: Add missing math library dependency - This code call 'round' which may require linking against the math library - on some compilers. - -2016-11-30 19:53:30 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/kms/gstkmssink.c: - kmssink: post error message if start() fails - It is expected to post an error message in the bus if the device cannot - be started. - -2016-10-20 12:37:48 +0200 Michael Tretter <m.tretter@pengutronix.de> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: configure display mode during set_caps - Configure the display mode when setting the negotiated caps instead of - during showing the first frame. - A framebuffer is required to set the mode. Allocate a buffer object - according to the negotiated caps and use it to set the mode. This buffer - object cannot be freed until another page flip happened on the crtc - (i.e., until the first frame is rendered). - https://bugzilla.gnome.org/show_bug.cgi?id=773473 - Signed-off-by: Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - -2016-10-18 14:57:25 +0200 Michael Tretter <m.tretter@pengutronix.de> - - * sys/kms/gstkmssink.c: - kmssink: add parameter force-modesetting - The force-modesetting parameter forces the kmssink to ignore already - configured display modes, to configure the display mode itself and use - the base plane for output. - https://bugzilla.gnome.org/show_bug.cgi?id=773473 - -2016-11-08 15:27:51 +0100 Michael Tretter <m.tretter@pengutronix.de> - - * sys/kms/gstkmssink.c: - kmssink: allow only supported resolutions - If the input buffers have a different size than the display, the frames - would have to be scaled or positioned on the display. The kmssink cannot - decide which behaviour would be appropriate for which use case. - In order to avoid scaling or positioning of the input stream, allow only - the supported connector resolutions in the sink caps. - https://bugzilla.gnome.org/show_bug.cgi?id=773473 - Signed-off-by: Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - -2016-11-08 15:26:40 +0100 Michael Tretter <m.tretter@pengutronix.de> - - * sys/kms/gstkmssink.c: - kmssink: set mode based on framebuffer configuration - Displays usually support multiple modes. Therefore, the kmssink should - not only support the preferred mode, but any mode that is supported by - the display. - https://bugzilla.gnome.org/show_bug.cgi?id=773473 - -2016-10-14 16:03:08 +0200 Michael Tretter <m.tretter@pengutronix.de> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: add mode setting and base plane rendering - The kmssink assumed that the mode was already set by another application - and used an overlay plane for displaying the frames. - Use the preferred mode of the monitor and render to the base plane if - the crtc does not have a valid mode. - https://bugzilla.gnome.org/show_bug.cgi?id=773473 - Signed-off-by: Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - -2016-11-30 17:22:21 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/interlace/gstinterlace.c: - interlace: Writing field-order into the src caps - Writing top-field-first vs bottom-field-first into the src caps - https://bugzilla.gnome.org/show_bug.cgi?id=775409 - -2016-11-30 09:35:27 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/libs/Makefile.am: - * docs/libs/gst-plugins-bad-libs.types: - docs: add aggregator _get_type functions for signals + properties - https://bugzilla.gnome.org/show_bug.cgi?id=775379 - -2016-11-30 19:26:51 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimage.c: - glmemoryegl: remove spurious #if GST_GL_HAVE_DMABUF conditions - 8c2118823b3d42840cc6f48cbdc0e1b342f90b80 had some incorrect preprocessor - conditions that aren't actually needed. Remove them. - https://bugzilla.gnome.org/show_bug.cgi?id=775248 - -2016-11-30 10:40:42 +0530 Garima Gaur <garima.g@samsung.com> - - * gst/mpegpsmux/mpegpsmux.c: - * tests/examples/directfb/gstdfb.c: - gst: Fix caps leak - https://bugzilla.gnome.org/show_bug.cgi?id=775072 - -2016-11-23 18:30:40 +0100 Philippe Renon <philippe_renon@yahoo.fr> - - * configure.ac: - opencv: check presence of required opencv_contrib headers - https://bugzilla.gnome.org/show_bug.cgi?id=772822 - -2016-11-26 16:53:24 +0100 Philippe Renon <philippe_renon@yahoo.fr> - - * gst-libs/gst/opencv/gstopencvutils.cpp: - opencv: add opencv image format documentation - https://bugzilla.gnome.org/show_bug.cgi?id=774576 - -2016-11-26 13:34:26 +0100 Philippe Renon <philippe_renon@yahoo.fr> - - * gst-libs/gst/opencv/gstopencvutils.cpp: - * gst-libs/gst/opencv/gstopencvutils.h: - opencv: account for sparse/padded formats when converting caps to cv image type - https://bugzilla.gnome.org/show_bug.cgi?id=774576 - -2016-11-29 21:09:14 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/opencv/gstopencvutils.cpp: - * gst-libs/gst/opencv/gstopencvutils.h: - * gst-libs/gst/opencv/gstopencvvideofilter.cpp: - opencvvideofilter: Don't parse the caps twice - The GstVideoFilter already provide caps parsed into GstVideoInfo. Avoid - doing that twice by splitting the helper. - https://bugzilla.gnome.org/show_bug.cgi?id=775288 - -2016-11-28 21:54:57 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/opencv/gstopencvvideofilter.cpp: - opencvfilter: Properly port to GstVideoFilter - This is a subblass of VideoFilter but yet does not use any of it's - features. This also fixes issue in case the incoming images have custom - strides as the VideoMeta is no longer ignored. - https://bugzilla.gnome.org/show_bug.cgi?id=775288 - -2016-11-29 15:18:43 +0100 Philippe Normand <philn@igalia.com> - - * ext/smoothstreaming/meson.build: - mssdemux: fix meson build - Follow-up of 73721ad4e9e2d32e1c8b6a3b4aaa98401530e58a. - Forgot to add the fragment parser in the meson build file. - -2016-11-29 14:43:41 +0100 Philippe Normand <philn@igalia.com> - - * ext/smoothstreaming/Makefile.am: - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssfragmentparser.c: - * ext/smoothstreaming/gstmssfragmentparser.h: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - mssdemux: improved live playback support - When a MSS server hosts a live stream the fragments listed in the - manifest usually don't have accurate timestamps and duration, except - for the first fragment, which additionally stores timing information - for the few upcoming fragments. In this scenario it is useless to - periodically fetch and update the manifest and the fragments list can - be incrementally built by parsing the first/current fragment. - https://bugzilla.gnome.org/show_bug.cgi?id=755036 - -2016-11-29 15:35:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Fix compiler warning - gstdecklink.cpp: In member function ‘virtual HRESULT GStreamerDecklinkInputCallback::VideoInputFrameArrived(IDeckLinkVideoInputFrame*, IDeckLinkAudioInputPacket*)’: - gstdecklink.cpp:766:34: error: ‘base_time’ may be used uninitialized in this function -Werror=maybe-uninitialized - capture_time -= base_time; - ^ - -2016-11-29 11:08:14 +0100 Anton Eliasson <antone@axis.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264parse: improve documentation commentary - https://bugzilla.gnome.org/show_bug.cgi?id=775306 - -2016-11-29 11:06:43 +0100 Anton Eliasson <antone@axis.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264parse: docs spellcheck - Spell checks, correct capitalization and some rewording to - better fit the terms used in the H.264 spec. - https://bugzilla.gnome.org/show_bug.cgi?id=775306 - -2016-11-28 16:02:03 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroutils.c: - schro: #include math.h before schroedinger headers - The schroedinger headers unconditionally #define over C99's rint when - compiling with msvc which messes up the later inclusion of math.h. - Including math.h before schroedinger headers avoids getting syntax - errors in math.h - https://bugzilla.gnome.org/show_bug.cgi?id=775293 - -2016-11-29 01:41:28 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/opencv/meson.build: - * meson.build: - meson: Rework opencv plugin checks - a) Use get_pkgconfig_variable() to get the opencv prefix - b) Place an upper limit on the opencv version - c) Ensure that headers are available - (b) and (c) just copy what the configure.ac checks do. - -2016-11-28 20:05:02 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegtssection: Fix off-by-one in PMT parsing - -2016-11-28 19:52:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegtssection: Don't assert if the given section length is longer than the PMT actually is - Instead error out cleanly and just assert that we didn't read more than - the available data. - -2016-11-28 17:17:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Correctly set top-field-first/bottom-field-first - First of all, all the HD and UHD modes should be top-field-first, as - also returned by the Decklink mode iterator API. - Then we should include the caps field "field-order" in the caps of the - source (not the sink due to negotiation problems with optional fields). - And finally we should set the TFF flag on interlaced buffers that are - top-field-first. - -2016-11-25 15:03:08 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklinksrc: Add property to drop frames that are marked as having no input signal - https://bugzilla.gnome.org/show_bug.cgi?id=774850 - -2016-11-25 14:57:15 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklinksrc: Add property to skip the first N seconds of capture - On some hardware the first few frames are bogus and not very useful. - Their timestamps are off, they have no timecodes, or there are spurious - black frames / no-signal frames. After a few frames this stabilizes - though. - https://bugzilla.gnome.org/show_bug.cgi?id=774850 - -2016-11-25 14:36:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinksrc: Set GAP flag on buffers that are captured without signal - https://bugzilla.gnome.org/show_bug.cgi?id=774850 - -2016-11-24 19:19:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklinksrc: Keep track of a window of capture/stream time mappings and calculate relationship - Based on this we calculate the actual capture time, which should get us - rid of any capturing jitter by averaging it out. - Also add a output-stream-time property which forces the elements to - output the stream time directly instead of doing any conversion to the - pipeline clock. Use with care. - https://bugzilla.gnome.org/show_bug.cgi?id=774850 - -2016-11-22 19:30:27 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklinksrc: Stop using the "hardware" timestamps and directly use the pipeline clock - The hardware timestamps have no relation to when frames were produced, - only when frames arrived somewhere in the hardware. Especially there is - no guarantee that audio and video will have the same hardware timestamps - although they belong together, and even more important: the rate with - which the hardware timestamps increase is completely unrelated to the - rate with which the frames are captured! - As such we can as well use the pipeline clock directly and stop doing - complicated calculations. Also as a side effect this allows now running - without any pipeline clock, by directly making use of the stream times - as reported by the driver. - https://bugzilla.gnome.org/show_bug.cgi?id=774850 - -2016-11-28 14:25:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/rawparse/gstaudioparse.c: - * gst/rawparse/gstaudioparse.h: - * gst/rawparse/gstrawaudioparse.c: - * gst/rawparse/gstrawaudioparse.h: - * gst/rawparse/gstrawbaseparse.c: - * gst/rawparse/gstrawbaseparse.h: - * gst/rawparse/gstrawvideoparse.c: - * gst/rawparse/gstrawvideoparse.h: - * gst/rawparse/gstunalignedaudioparse.c: - * gst/rawparse/gstunalignedvideoparse.c: - * gst/rawparse/gstvideoparse.c: - * gst/rawparse/gstvideoparse.h: - rawparse: Whitespace cleanup - -2016-11-28 11:26:50 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * gst-plugins-bad.spec.in: - * gst/dataurisrc/Makefile.am: - * gst/dataurisrc/gstdataurisrc.c: - * gst/dataurisrc/gstdataurisrc.h: - * gst/dataurisrc/meson.build: - * gst/meson.build: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/dataurisrc.c: - dataurisrc: remove plugin, moved to core - https://bugzilla.gnome.org/show_bug.cgi?id=774527 - -2016-11-28 10:49:23 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - m3u8: Mark uri_join() function as static - We don't really want to export this, especially not without any - namespacing. This can cause problems for static builds. - -2016-11-28 10:27:56 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Post an error message on the bus if we activated a program without pads - Otherwise decodebin and applications are going to wait forever for pads - to appear, which is never going to happen. - Happens on this stream, which probably just need support for it added: - https://samples.mplayerhq.hu/3D/AVC_codec_in_m2ts_not_recognized/AVC_codec_not_recognized_right_video_sample.m2ts - -2016-11-28 14:22:05 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: move g_main_context_push/pop_thread_default() to run() - Calling g_main_context_push_thread and then g_main_context_invoke() - (used by gst_gl_window_send_message_async()) in the same thread will - cause the invoked function to run immediately instead of being delayed. - This had implications for the creation of the OpenGL context not waiting - until the main loop had completely started up and as a result would - sometimes deadlock in short create/destroy scenarios. - https://bugzilla.gnome.org/show_bug.cgi?id=775171 - -2016-11-28 14:19:18 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: fix race between creation/shutdown - 626bcccff96f624f59c5212b3e21e472240171fd removed some locks that - allowed the main loop quit to occur before the context was fully - created. - 2776cef25d2a98668b73272aecfe77e684e6627e attempted to readd them but - missed the scop of the quit() call. - Also remove the use of g_thread_join() as that's not safe to use when - it's possible to lose the last reference from the GL thread. - https://bugzilla.gnome.org/show_bug.cgi?id=775171 - -2016-11-27 12:40:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/rawparse/gstrawbaseparse.c: - rawbaseparse: Fix output buffer size trimming - For frame->buffer, baseparse is doing that automatically for us. For - frame->output_buffer it doesn't and assumes that the subclass is already - doing that. Consistency! - -2016-11-27 12:20:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - dash: Fix stripping of space at the beginning/end of durations - The way how strchr() was called here, it could easily read after the end - of the string. Use g_ascii_isspace() instead. - Detected by asan in the unit test. - -2016-11-27 11:56:18 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/meson.build: - opencv: Make the OpenCV plugin optional in the meson build - -2016-11-27 11:44:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/rawparse/gstrawaudioparse.c: - * gst/rawparse/gstrawbaseparse.c: - * gst/rawparse/gstrawbaseparse.h: - * gst/rawparse/gstrawvideoparse.c: - rawparse: Properly align raw audio/video output buffers - That is, aligned to the basic type for audio and to 32 bytes for video. - Fixes crashes if the raw buffers are passed to SIMD processing functions. - https://bugzilla.gnome.org/show_bug.cgi?id=774428 - -2016-11-15 16:57:20 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/meson.build: - * ext/opencv/meson.build: - * gst-libs/gst/meson.build: - * gst-libs/gst/opencv/meson.build: - opencv: Enable in meson build - https://bugzilla.gnome.org/show_bug.cgi?id=774223 - -2016-11-26 11:20:51 +0000 Tim-Philipp Müller <tim@centricular.com> - - * .gitmodules: - common: use https protocol for common submodule - https://bugzilla.gnome.org/show_bug.cgi?id=775110 - -2016-11-26 12:28:57 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Post an error message if we got EOS before having any source pads - Otherwise, sending an EOS event has no effect and the application waits - forever for something to happen. - -2016-11-26 12:16:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Fix indentation - -2016-11-26 12:16:18 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix assertion when encountering an invalid NALU - Error out properly instead. - https://bugzilla.gnome.org/show_bug.cgi?id=775130 - -2016-11-26 12:15:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Fix assertion when encountering an invalid NALU - Error out properly instead. - https://bugzilla.gnome.org/show_bug.cgi?id=775130 - -2016-11-26 10:44:43 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegtssection: Add more section size checks - The smallest section ever needs to be at least 3 bytes (i.e. just the short - header). - Non-short headers need to be at least 11 bytes long (3 for the minimum header, - 5 for the non-short header, and 4 for the CRC). - https://bugzilla.gnome.org/show_bug.cgi?id=775048 - -2016-11-26 10:23:01 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegtssection: Fix PAT parsing - Use the estimated number of programs for parsing. Avoids over-reading. - https://bugzilla.gnome.org/show_bug.cgi?id=775120 - -2016-11-26 09:26:36 +0100 Edward Hervey <edward@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Handle GST_SEEK_TYPE_NONE seek - When one is only updating the "stop" position (i.e. non-flushing seek, - with GST_SEEK_TYPE_NONE on the "start" (or stop in reverse) position), - we only need to store those values instead of moving the current position. - https://bugzilla.gnome.org/show_bug.cgi?id=775127 - -2016-11-25 23:47:15 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/gstsegmentation.cpp: - * ext/wayland/wldisplay.c: - ext: Fix various compiler warnings with clang - wldisplay.c:179:15: error: comparison of unsigned enum expression < 0 is always false -Werror,-Wtautological-compare - if (shm_fmt < 0) - ~~~~~~~ ^ ~ - gstsegmentation.cpp:419:40: error: implicit conversion from 'int' to 'char' changes value from 255 to -1 -Werror,-Wconstant-conversion - filter->cvFG->imageDataj = 255; - ~ ^~~ - https://bugzilla.gnome.org/show_bug.cgi?id=775112 - -2016-11-25 23:44:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl/x11: Remove unused static function - -2016-11-25 16:46:45 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxftypes.c: - mxfdemux: Fix up another size check and prevent allocating too much memory - -2016-11-25 15:59:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxftypes.c: - * gst/mxf/mxful.c: - mxfdemux: Handle zero-sized KLV items better and don't assert on them - -2016-11-25 15:53:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Fix various logic errors in error handling of footer partition parsing - -2016-11-25 15:53:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Don't try parsing empty metadata items - -2016-11-25 01:06:45 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmetadata.c: - mxfmetadata: Add missing NULL check - -2016-11-22 18:06:52 +0100 Florent Thiéry <florent.thiery@ubicast.eu> - - * ext/gl/gstgldownloadelement.c: - gldownload: fix element description (was "OpenGL uploader") - -2016-11-24 19:45:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/Makefile.am: - * gst/mxf/mxf.c: - mxf: Remove mxfdms1.ch from the build for now - It's completely unused currently but might be used in the future. - -2016-11-24 23:36:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxftypes.c: - * gst/mxf/mxful.c: - mxfdemux: Add various missing bounds checks, NULL checks and integer overflow protection for error cases - -2016-11-24 14:48:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Free timecodes when done with a frame - -2016-11-24 14:41:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/timecode/gsttimecodestamper.c: - timecodestamper: Remove all existing timecode metas if requested to override existing - -2016-11-24 11:12:23 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegtssection: Don't free empty streams - Also avoids a useless assertion - -2016-11-24 11:11:35 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Don't add existing values to group - If the last value is already identical, there is no need in adding it - yet-another-time - -2016-11-23 20:13:59 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/kms/gstkmsallocator.c: - kmssink: include drm.h after stdlib.h - As drm.h is internal to libdrm, it expects to have already included - stdlib.h. - -2016-11-23 19:41:43 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/kms/gstkmsallocator.c: - kms: include stdlib.h - drm.h does not include all what it needs to compile, in particular - stdlib.h which defines size_t - -2016-11-23 19:01:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Don't set variable just to overwrite it again later - We set it to TRUE here, but later we set it to TRUE again anyway if the - parsing actually succeeded at this point. Let's keep the second one. - CID 1374360. - -2016-11-23 18:45:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/wayland/wldisplay.c: - wldisplay: Don't compare a guint with < 0 - -1 is the "invalid" value, compare to it directly. - CID 1394490. - -2016-11-18 21:00:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * gst/audiobuffersplit/Makefile.am: - * gst/audiobuffersplit/gstaudiobuffersplit.c: - * gst/audiobuffersplit/gstaudiobuffersplit.h: - * gst/audiobuffersplit/meson.build: - * gst/meson.build: - audiobuffersplit: New element that splits raw audio buffers into equal-sized buffers - This is useful e.g. if audio buffers should be exactly the duration of a - video frame, or if a audio buffers should never be too large because of - latency constraints. - The element is taking a fractional buffer duration, to allow working - with e.g. 1001/30000 as output duration and it accumulates rounding - errors in the buffer durations and compensates for them by making some - buffers one sample larger than the others. - https://bugzilla.gnome.org/show_bug.cgi?id=774689 - -2016-10-19 12:39:36 +0200 Michael Tretter <m.tretter@pengutronix.de> - - * configure.ac: - * sys/kms/gstkmsallocator.c: - * sys/kms/gstkmsallocator.h: - * sys/kms/gstkmsutils.c: - * sys/kms/gstkmsutils.h: - * sys/kms/meson.build: - kmssink: remove dependency on libkms - libkms should not be used, because it imposes limitations on the DRM - API, especially regarding bpp and stride. Instead the DRM IOCTL should - be used directly. - Switch from libkms to the IOCTL interface. Set bpp and height for - framebuffer allocation to properly handle planar video formats. - https://bugzilla.gnome.org/show_bug.cgi?id=773473 - Signed-off-by: Víctor Jáquez <vjaquez@igalia.com> - -2016-11-23 10:31:29 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/inspect/plugin-mimic.xml: - * ext/Makefile.am: - * ext/meson.build: - * ext/mimic/Makefile.am: - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - * ext/mimic/gstmimic.c: - * gst-plugins-bad.spec.in: - * tests/check/Makefile.am: - * tests/check/pipelines/.gitignore: - * tests/check/pipelines/mimic.c: - mimic: remove ancient codec - This was used by MSN messenger in prehistoric times, it's safe - to say no one needs or wants this any more these days. For - decoding old recordings there's still a decoder in ffmpeg. - https://bugzilla.gnome.org/show_bug.cgi?id=597616 - -2016-11-23 10:52:05 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Ensure codec_data has the required size when reading number of NAL arrays - https://bugzilla.gnome.org/show_bug.cgi?id=774896 - -2016-11-23 10:51:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Ensure codec_data has the required size when reading number of SPS - https://bugzilla.gnome.org/show_bug.cgi?id=774896 - -2016-11-23 17:04:34 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - gl/contextglx: error out on more invalid display/window combinations - https://bugzilla.gnome.org/show_bug.cgi?id=774851 - -2016-11-23 15:57:05 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - * gst-libs/gst/gl/gstglupload.c: - gl: add necessary context_egl.h #includes to the source files - -2016-11-23 13:32:38 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gstglmemoryegl.h: - gl/memoryegl: remove access to private header gstglcontext_egl.h - It's been removed and thus compiling anything against GstGLMemoryEGL - would error with: - In file included from gstomxvideodec.c:41:0: - usr/include/gstreamer-1.0/gst/gl/egl/gstglmemoryegl.h:32:41: fatal error: gst/gl/egl/gstglcontext_egl.h: No such file or directory - #include <gst/gl/egl/gstglcontext_egl.h> - ^ - https://bugzilla.gnome.org/show_bug.cgi?id=774886 - -2016-11-22 12:58:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Reset values before parsing each section - -2016-11-22 12:42:45 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Make sure in all cases that we have enough data left for reading a section start - In some cases we ended up parsing sections without. - -2016-11-21 17:19:46 +0100 Philippe Renon <philippe_renon@yahoo.fr> - - * ext/opencv/gstcvdilateerode.cpp: - * gst-libs/gst/opencv/gstopencvvideofilter.cpp: - * gst-libs/gst/opencv/gstopencvvideofilter.h: - opencv: forward declare opencv types - Forward declare opencv types to avoid exposing them in the API. - https://bugzilla.gnome.org/show_bug.cgi?id=774223 - -2016-11-21 10:52:39 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/interfaces/photography.h: - interfaces: photography: clean up header indentation - -2016-11-20 15:10:42 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Modify return of the function for loading external resources to void - gst_mpd_client_fetch_on_load_external_resources() never ever return - FALSE due to modified external xml loading functions. - https://bugzilla.gnome.org/show_bug.cgi?id=774463 - -2016-11-19 23:04:04 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Handle invalid external xml link for SegmentList element - Ignore invalid xml link for SegmentList likewise external Period without error. - https://bugzilla.gnome.org/show_bug.cgi?id=774463 - -2016-11-19 22:38:20 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Handle invalid external xml link for AdaptationSet element - Ignore invalid xml link for AdaptationSet likewise external Period without error. - https://bugzilla.gnome.org/show_bug.cgi?id=774463 - -2016-11-19 18:37:54 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - mpdparser: Handle invalid external xml link for Period element - Section 5.3.3 in ISO/IEC 23009-1:2014 defines that invalid references - (e.g., invalide URI or cannot be resolved) specified by "@xlink:href" attribute - shall be removed. That means, we should play it without error, - and just ignore the corresponding element. - It's similar to "urn:mpeg:dash:resolve-to-zero:2013". - https://bugzilla.gnome.org/show_bug.cgi?id=774463 - -2016-11-17 15:41:00 +0000 David Evans <bbcrddave@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - gl: add gstreamer-video to pkg-config path - https://bugzilla.gnome.org/show_bug.cgi?id=774624 - -2016-11-20 12:40:07 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/Makefile.am: - tests: fix lib and cflags order in Makefile.am - pnm: add misssing continuation slash at end of line - vp8parser: no need to link codecparsers twice - dash_demux, mssdemux, hlsdemux: fix lib/flags ordering - local - libs and flags must come first, then base before core before rest - -2016-11-19 16:12:06 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix leak in gst_dash_demux_stream_free - Free parsed moof and sync samples with _stream_free(). - https://bugzilla.gnome.org/show_bug.cgi?id=774702 - -2016-11-17 11:19:54 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * configure.ac: - * ext/vulkan/wayland/Makefile.am: - * ext/wayland/Makefile.am: - wayland: avoid prefix clash in combined pkg-config check - Adittionally, remove leftover WAYLAND_DRM_ include flags var - Fixes building of ext/wayland/* broken by dfd86de67a8c04f6d1 - Related to: - https://bugzilla.gnome.org/show_bug.cgi?id=773927 - -2016-11-17 20:21:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: Mark pad as needing reconfiguration again if it failed - And return FLUSHING instead of NOT_NEGOTIATED on flushing pads. - https://bugzilla.gnome.org/show_bug.cgi?id=774623 - -2016-11-17 20:20:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: Mark pad as needing reconfiguration again if it failed - And return FLUSHING instead of NOT_NEGOTIATED on flushing pads. - https://bugzilla.gnome.org/show_bug.cgi?id=774623 - -2016-11-17 20:20:15 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Mark pad as needing reconfiguration again if it failed - And return FLUSHING instead of NOT_NEGOTIATED on flushing pads. - https://bugzilla.gnome.org/show_bug.cgi?id=774623 - -2016-11-17 20:19:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/ttml/gstttmlrender.c: - ttmlrender: Mark pad as needing reconfiguration again if it failed - And return FLUSHING instead of NOT_NEGOTIATED on flushing pads. - https://bugzilla.gnome.org/show_bug.cgi?id=774623 - -2016-11-17 20:16:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/assrender/gstassrender.c: - assrender: Mark pad as needing reconfiguration again if reconfiguration failed - Also return FLUSHING instead of NOT_NEGOTIATED on flushing pads. - https://bugzilla.gnome.org/show_bug.cgi?id=774623 - -2016-11-18 12:21:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/Makefile.am: - iqa: Add to DIST_SUBDIRS - -2016-11-17 17:17:22 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * meson.build: - meson: add_global_arguments -> add_project_arguments - https://bugzilla.gnome.org/show_bug.cgi?id=774656 - -2016-11-17 10:54:45 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * gst-libs/gst/wayland/meson.build: - meson: wayland: wl_scanner is required: false - https://bugzilla.gnome.org/show_bug.cgi?id=774637 - -2016-11-17 15:11:20 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * po/POTFILES.in: - po: Remove remaining reference to videomeasure - -2016-11-17 18:23:04 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklinkvideosrc: Issue "no signal" warnings - When a frame is found to not have an associated input source (cable - unplugged, wrong mode selected), an element warning will be issued. When - the next frame in the stream is found to have an input source selected - (e.g. cable replugged), an element info will be issued. - https://bugzilla.gnome.org/show_bug.cgi?id=774629 - -2016-11-16 18:01:19 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * configure.ac: - * gst/meson.build: - * gst/videomeasure/Makefile.am: - * gst/videomeasure/gstvideomeasure.c: - * gst/videomeasure/gstvideomeasure.h: - * gst/videomeasure/gstvideomeasure_collector.c: - * gst/videomeasure/gstvideomeasure_collector.h: - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/videomeasure/gstvideomeasure_ssim.h: - * gst/videomeasure/meson.build: - videomeasure: Remove old unported videomeasure plugin as it is now replaced by IQA - -2016-11-16 16:30:50 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * ext/iqa/iqa.c: - iqa: Error out when trying to compare video stream with different sizes - We do not handle it yet and we should let the user know. - -2016-11-16 14:46:24 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * ext/iqa/meson.build: - * ext/meson.build: - iqa: Add meson build support - -2016-11-16 13:18:53 -0300 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/Makefile.am: - * ext/iqa/Makefile.am: - * ext/iqa/iqa.c: - * ext/iqa/iqa.h: - Adds a new Image Quality Assessment plugin. - It only offers one metric for now, "dssim", available if - https://github.com/pornel/dssim was installed on the system - at the time the plugin was compiled. - The spearman correlation for dssim against the TID2008 dataset - is 0.81, against 0.70 for the old ssim implementation, and - it runs 15 times faster. - https://bugzilla.gnome.org/show_bug.cgi?id=751324 - -2016-11-17 14:35:26 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/elements/glimagesink.c: - gl/tests: fix glimagesink element test on OSX - It was suffering a race starting up the thread that could cause the main - loop to quit before the main loop had started. - -2016-11-17 14:21:23 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/avfassetsrc.m: - applemedia: error out if the uri property is not set - Fixes: - Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +NSString stringWithUTF8String:: NULL cString - in the state change test. - -2016-11-17 15:15:18 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/meson.build: - * gst-libs/gst/wayland/meson.build: - * meson.build: - meson: wayland: move dep checks to the lib - Moves them closer to where they are used. We don't want every check in - the main meson.build file. - -2016-11-17 14:32:10 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/meson.build: - meson: gl/egl: add missing source file - d42145e8c1ba3bc0445506b92bb7ac04ae98f4dd didn't add the necessary - meson build changes. - -2016-11-17 02:41:14 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimage.c: - * gst-libs/gst/gl/egl/gsteglimage.h: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - gl/egl: remove EGLImage functions from egl context - By adding the necessary GstEGLImage entry points to create a GstEGLImage - from a GstGLMemory. - https://bugzilla.gnome.org/show_bug.cgi?id=774518 - -2016-11-17 01:45:38 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - glcontext: add vfunc to retrieve the OpenGL platform version - i.e. the version of EGL, GLX, etc implemented. - https://bugzilla.gnome.org/show_bug.cgi?id=774518 - -2016-11-17 01:38:32 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/Makefile.am: - * gst-libs/gst/gl/egl/gstegl.c: - * gst-libs/gst/gl/egl/gstegl.h: - * gst-libs/gst/gl/egl/gsteglimage.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - gl/egl: move get_error_string() into gstegl - So others can use it without #include-ing a private header - https://bugzilla.gnome.org/show_bug.cgi?id=774518 - -2014-11-27 15:50:04 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/egl/gstgldisplay_egl.c: - * gst-libs/gst/gl/egl/gstgldisplay_egl.h: - display/egl: implement getting the EGLDisplay of a specific platform - https://bugzilla.gnome.org/show_bug.cgi?id=774518 - -2016-11-16 13:05:11 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - gl/egl: check the feature in the extensions list - https://bugzilla.gnome.org/show_bug.cgi?id=774518 - -2016-11-16 20:41:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/vmnc/vmncdec.c: - vmncdec: Sanity-check width/height before using it - We will allocate a screen area of width*height*bpp bytes, however this - calculation can easily overflow if too high width or height are given - inside the stream. Nonetheless we would just assume that enough memory - was allocated, try to fill it and overwrite as much memory as wanted. - Also allocate the screen area filled with zeroes to ensure that we start - with full-black and not any random (or not so random) data. - https://scarybeastsecurity.blogspot.gr/2016/11/0day-poc-risky-design-decisions-in.html - Ideally we should just remove this plugin in favour of the one in - gst-libav, which generally seems to be of better code quality. - https://bugzilla.gnome.org/show_bug.cgi?id=774533 - -2016-11-16 18:50:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - ttml: Hide behind --enable-experimental - The elements are autoplugged and currently assert on invalid streams. - -2016-11-16 16:45:27 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/smoothwave/.gitignore: - smoothwave: Remove empty directory - -2016-11-16 16:33:41 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/meson.build: - * gst/real/meson.build: - real: Remove empty directory - -2016-11-16 16:15:34 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/meson.build: - * gst/mpeg1sys/meson.build: - mpeg1sys: Remove obsolete, empty directory that only contains a meson.build - -2016-11-15 16:20:10 +0100 Imre Eörs <imree@axis.com> - - * ext/curl/gstcurlbasesink.c: - curl: transfer hangs in case connection was cut between client and server - https://bugzilla.gnome.org/show_bug.cgi?id=774485 - -2016-11-16 17:30:54 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglupload.c: - gl/tests: don't use the default framebuffer - Create our own instead as the default framebuffer may require special - fiddling (like having a visible window) to correctly display/be renderable. - Fixes the remaining GL library tests on OS X - -2016-11-16 13:39:32 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - glcontext/cocoa: implement empty swap_buffers - Fixes some GL tests on OS X. - -2016-11-16 16:41:59 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/BUGS: - gl: remove empty BUGS file - We use bugzilla for bug tracking - -2016-11-15 17:46:17 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * ext/meson.build: - * ext/wayland/meson.build: - * gst-libs/gst/meson.build: - * gst-libs/gst/wayland/meson.build: - * meson.build: - meson: Build waylandsink - https://bugzilla.gnome.org/show_bug.cgi?id=774493 - -2016-11-15 17:48:15 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * configure.ac: - configure: fix build if wayland-client is not available - Simplify the PKG_CHECK_MODULES related to Wayland to avoid the confusion - of NOT_FOUND cases when there are 3 nested checks. Group those 3 checks - together since there are no conditions specific to each one. - Thanks to https://ci.gstreamer.net/ for alerting of the problem. - https://bugzilla.gnome.org/show_bug.cgi?id=773927 - -2016-11-15 11:59:45 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * configure.ac: - configure: fix build if libdrm is not available - If the NOT_FOUND part of the check PKG_CHECK_MODULES is not written, it - defaults to error. Addind the else clause of this check as - HAVE_WAYLAND="no" - https://bugzilla.gnome.org/show_bug.cgi?id=773927 - -2016-11-16 00:01:00 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - glwindow/cocoa: remove unneeded window code in NSWindow - This is all taken care of by GstGLWindowCocoa/GstGLNSView now. - -2016-11-15 22:56:25 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - glwindow/cocoa: remove our view from the parent when closing - Otherwise, when the application reuses the same UIView, we were getting - draw notifications on the previous view/layer's which weren't valid anymore - and were referencing pointers that had been freed. - https://bugzilla.gnome.org/show_bug.cgi?id=753003 - -2016-11-15 21:43:59 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - gl/caopengllayer: add a debug category - -2016-11-15 14:36:11 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - glbufferpool: introduce check for GLMemory allocators - The last missing piece of EGLImage support has been pushed. - -2016-11-14 17:02:54 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * gst-libs/gst/codecparsers/gstjpegparser.c: - * gst/frei0r/gstfrei0r.c: - * gst/id3tag/id3tag.c: - Fix some MSVC warnings about const-ness - Some miscellaneous warnings about const-ness, either casting away const - where we know it's safe or removing const where it's not correct. - https://bugzilla.gnome.org/show_bug.cgi?id=774293 - -2016-11-14 16:59:48 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideometa.c: - Cast away const from GstMetaInfo in *_get_meta_info() functions - MSVC warns about the const in the implicit argument conversion in the - calls to g_once_init_{enter,leave}. It's OK so explicitly cast it. - https://bugzilla.gnome.org/show_bug.cgi?id=774293 - -2016-11-10 23:07:50 +0900 Seungha Yang <sh.yang@lge.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Fix startup SEGMENT seeking and setting for live - Because fragment.timestamp is relative value to period_start, - startup SEGMENT seeking should be pointed to "fragment.timestamp + period_start" - https://bugzilla.gnome.org/show_bug.cgi?id=774196 - -2016-11-14 12:23:37 +0100 Philippe Renon <philippe_renon@yahoo.fr> - - * sys/winscreencap/gstgdiscreencapsrc.c: - gdiscreencapsrc: remove empty gst_gdiscreencapsrc_stop vfunc - https://bugzilla.gnome.org/show_bug.cgi?id=774400 - -2016-11-10 18:42:29 +0100 Philippe Renon <philippe_renon@yahoo.fr> - - * configure.ac: - * ext/opencv/Makefile.am: - * ext/opencv/gstcvdilateerode.cpp: - * ext/opencv/gstcvdilateerode.h: - * ext/opencv/gstcvequalizehist.h: - * ext/opencv/gstcvlaplace.h: - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstcvsmooth.h: - * ext/opencv/gstcvsobel.h: - * ext/opencv/gstedgedetect.h: - * ext/opencv/gstfaceblur.h: - * ext/opencv/gstfacedetect.h: - * ext/opencv/gsthanddetect.h: - * ext/opencv/gstmotioncells.h: - * ext/opencv/gstretinex.h: - * ext/opencv/gstskindetect.h: - * ext/opencv/gsttemplatematch.h: - * ext/opencv/gsttextoverlay.h: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/opencv/Makefile.am: - * gst-libs/gst/opencv/gstopencvutils.cpp: - * gst-libs/gst/opencv/gstopencvutils.h: - * gst-libs/gst/opencv/gstopencvvideofilter.cpp: - * gst-libs/gst/opencv/gstopencvvideofilter.h: - opencv: move base opencv filter class and utilities to gst-libs - https://bugzilla.gnome.org/show_bug.cgi?id=774223 - -2016-11-14 23:15:05 +0530 Arun Raghavan <arun@osg.samsung.com> - - * sys/fbdev/meson.build: - * sys/meson.build: - fbdevsink: Add to meson build - -2016-11-14 23:11:11 +0530 Arun Raghavan <arun@osg.samsung.com> - - * sys/kms/meson.build: - kmssink: Trivial naming fix in meson for consistency - -2016-11-14 21:03:20 +0530 Arun Raghavan <arun@osg.samsung.com> - - * sys/kms/meson.build: - * sys/meson.build: - kmssink: Enable in meson build - -2016-11-14 17:00:21 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/dash_mpd.c: - dash: Fix breakage in unit test caused by gst-indent - -2016-11-14 23:31:37 +0900 Seungha Yang <sh.yang@lge.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * tests/check/Makefile.am: - * tests/check/elements/dash_mpd.c: - * tests/check/elements/dash_mpd_data/xlink_double_period.period: - * tests/check/elements/dash_mpd_data/xlink_single_period.period: - mpdparser: Support multiple Period elements in external xml - External xml could have empty, one or multiple top-level "Period" elements. - Because xml parser cannot parse the multiple top-level elements - (i.e., no root element), we need to wrap a xml in order to make root element. - See also ISO/IEC 23009-1:2014 5.3.2.2 - https://bugzilla.gnome.org/show_bug.cgi?id=774357 - -2016-11-03 10:47:00 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/msdk/Makefile.am: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/meson.build: - * sys/msdk/msdk.c: - * sys/msdk/msdk.h: - * sys/msdk/msdk_d3d.c: - * sys/msdk/msdk_libva.c: - msdk: Initial windows build support - https://bugzilla.gnome.org/show_bug.cgi?id=770990 - -2016-10-13 14:30:43 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/meson.build: - * sys/msdk/meson.build: - meson: add build files for msdk - https://bugzilla.gnome.org/show_bug.cgi?id=770990 - -2016-09-27 14:21:34 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkvp8enc.c: - msdk: load plugins in h265 and vp8 init - https://bugzilla.gnome.org/show_bug.cgi?id=770990 - -2016-09-27 14:17:49 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/msdk/gstmsdkenc.c: - msdk: Width and Height need to be integer multiples of 32 - https://bugzilla.gnome.org/show_bug.cgi?id=770990 - -2016-09-09 15:43:25 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * configure.ac: - * sys/Makefile.am: - * sys/msdk/Makefile.am: - msdk: add to build - https://bugzilla.gnome.org/show_bug.cgi?id=770990 - -2016-04-01 19:25:25 +0200 Josep Torra <jtorra@oblong.com> - - * sys/msdk/README: - * sys/msdk/gstmsdk.c: - * sys/msdk/gstmsdkenc.c: - * sys/msdk/gstmsdkenc.h: - * sys/msdk/gstmsdkh264enc.c: - * sys/msdk/gstmsdkh264enc.h: - * sys/msdk/gstmsdkh265enc.c: - * sys/msdk/gstmsdkh265enc.h: - * sys/msdk/gstmsdkmpeg2enc.c: - * sys/msdk/gstmsdkmpeg2enc.h: - * sys/msdk/gstmsdkvp8enc.c: - * sys/msdk/gstmsdkvp8enc.h: - * sys/msdk/msdk.h: - * sys/msdk/msdk_libva.c: - msdk: Create plugin for Intel's Media SDK - scott.d.phillips@intel.com: gst-indent *.c *.h - scott.d.phillips@intel.com: link with libva at build time - scott.d.phillips@intel.com: remove unused includes - scott.d.phillips@intel.com: Update README - https://bugzilla.gnome.org/show_bug.cgi?id=770990 - -2016-11-14 11:08:24 +0100 Philippe Normand <philn@igalia.com> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_demux.c: - mpdparser: wrap unmodified data in protection event - PlayReady being the one of the few DRM formats encoding its data with - base64 it was not consistent to have a special case for this. So the - base64 decoding operation now needs to be done by the protection event - consumer, if needed. - https://bugzilla.gnome.org/show_bug.cgi?id=774112 - -2016-11-14 11:06:00 +0100 Philippe Normand <philn@igalia.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: wrap unmodified data in protection event - PlayReady being the one of the few DRM formats encoding its data with - base64 it was not consistent to have a special case for this. So the - base64 decoding operation now needs to be done by the protection event - consumer, if needed. - https://bugzilla.gnome.org/show_bug.cgi?id=774112 - -2016-11-14 11:32:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlscertificate.c: - dtlscertificate: Fix error checking in RSA_generate_key_ex() usage - Was broken during the port for OpenSSL 1.1. - https://bugzilla.gnome.org/show_bug.cgi?id=774328 - -2016-11-11 10:55:57 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/winks/kshelpers.c: - winks: undef windows SDK macros before redefining them - Redefining an already defined macro causes a warning from the msvc - preprocessor - https://bugzilla.gnome.org/show_bug.cgi?id=774293 - -2016-11-11 10:54:52 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/d3dvideosink/d3dhelpers.c: - Remove 'return' from `void` functions - https://bugzilla.gnome.org/show_bug.cgi?id=774293 - -2016-11-11 10:51:49 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * gst/mpegtsdemux/gstmpegdefs.h: - mpegtsdemux: fix operator precedence in SAFE_FOURCC_ARGS - Type cast has higher precedence than bitwise shift, so the third - argument will truncate to 8 bits and then shift right by 8 bits - resulting in constant zero. - https://bugzilla.gnome.org/show_bug.cgi?id=774293 - -2016-11-12 10:38:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Fix NULL pointer dereference when checking if there is a next fragment - Thanks to Aleksandr <tumaleksandr@yandex.ua> for reporting and - suggesting the fix. - https://bugzilla.gnome.org/show_bug.cgi?id=774287 - -2016-10-26 22:36:17 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * meson.build: - meson: don't add_global_arguments when being built as a subproject - https://bugzilla.gnome.org/show_bug.cgi?id=773568 - -2016-11-11 01:05:55 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/meson.build: - gl: x11-xcb is not a required dependency - Don't fail if it's not found.. - -2016-10-19 14:54:44 +0200 Philipp Zabel <p.zabel@pengutronix.de> - - * sys/kms/gstkmsallocator.c: - kmssink: do not get kms bo pitch for planar formats - The API is ill defined for planar formats in case of dumb BOs, - do not use the reported stride in those cases. - https://bugzilla.gnome.org/show_bug.cgi?id=773473 - -2016-10-18 09:19:09 +0200 Michael Tretter <m.tretter@pengutronix.de> - - * sys/kms/gstkmssink.c: - kmssink: remove custom gst_kms_sink_get_times - The default get_times() function of the base sink is just fine. - Remove the custom get_times() function, because the default function - already reads the timestamps from the buffers. - Signed-off-by: Michael Tretter <m.tretter@pengutronix.de> - https://bugzilla.gnome.org/show_bug.cgi?id=773473 - -2016-11-10 17:20:27 +1100 Matthew Waters <matthew@centricular.com> - - * ext/smoothstreaming/gstmssmanifest.c: - smoothstreaming: use the duration from the list of fragments if not present in the manifest - Provides a more accurate duration for live streams that may be minutes - or hours in front of the earliest fragment. - https://bugzilla.gnome.org/show_bug.cgi?id=774178 - -2016-11-10 17:18:36 +1100 Matthew Waters <matthew@centricular.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - smoothstreaming: implement adaptivedemux's get_live_seek_range() - Allows seeking through the available fragments that are still available - on the server as specified by the DVRWindowLength attribute in the - manifest. - https://bugzilla.gnome.org/show_bug.cgi?id=774178 - -2016-11-09 21:20:21 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: reset the manifest failure count after a successful retrieval - This changes the failure case to require a consecutive number of - failures rather than being spread out over the entire stream. - Fixes the case where fetching the manifest was intermittent. - https://bugzilla.gnome.org/show_bug.cgi?id=774177 - -2016-11-09 21:18:06 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: call the subclass for duration queries for live sources - Otherwise, the duration query was failing for live sources - https://bugzilla.gnome.org/show_bug.cgi?id=774177 - -2016-11-09 21:15:29 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: restart the manifest update task after a seek - For formats that need to update the manifest to know about new - fragments as they're being written by the server would never receive an - updated fragment list after a seek event - https://bugzilla.gnome.org/show_bug.cgi?id=774177 - -2016-11-09 17:10:21 +0900 Dongil Park <dongil.park@lge.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - mpegts: fix typo in GstMpegtsDescriptor - https://bugzilla.gnome.org/show_bug.cgi?id=774132 - -2016-11-10 20:34:53 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglutils.c: - * ext/gl/gstglutils.h: - gl/build: add missing build files - 3f7b54988186de17ec4e5b5566074cfaa392819a was incomplete :( - -2016-11-10 19:14:24 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglmosaic.c: - * ext/gl/gstgloverlay.c: - * ext/gl/gstgltransformation.c: - * ext/gl/gstglvideomixer.c: - * ext/gl/meson.build: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * gst-libs/gst/gl/gstglviewconvert.c: - gl/utils: move gen_shader() to the plugin and remove del_shader() - gst_gl_context_del_shader() can be replaced by a g_object_unref(). - gst_gl_context_gen_shader() should be replaced by using GstGLSLStage. - -2016-10-26 16:53:27 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglwindow.h: - glwindow: remove unused field in public struct - -2016-10-26 16:30:43 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - glwindow: remove is_running() function - It isn't necessary in correctly written programs. - -2016-11-08 17:50:51 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/gl/meson.build: - meson/gl: XCB changes also need x11-xcb as a dependency - https://ci.gstreamer.net/job/GStreamer-master-meson/380/console - ... - gst-libs/gst/gl/x11/xcb_event_source.c:98: undefined reference to `xcb_get_file_descriptor' - -2016-11-07 12:30:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - amc: Allow registering codecs, camera or sensors if any of the others failed - https://bugzilla.gnome.org/show_bug.cgi?id=774048 - -2016-11-07 12:24:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gst-android-hardware-sensor.c: - ahs: Don't assert on deinit if initialization failed before - Initialization failure is handled correctly by just not registering the - ahssrc element. - https://bugzilla.gnome.org/show_bug.cgi?id=774048 - -2016-11-08 09:52:48 +0100 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/gl/meson.build: - gl/x11: fix meson build - The x11_event_source.ch files were renamed in - 4f6c226bd24ae3ef66bd8f4c17b001444c9b0bf1. - -2016-11-08 15:04:29 +1100 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/qt/mousevideooverlay/pipeline.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.cpp: - * tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp: - examples/gl/qt: fix the examples for the use of newer API - gstgl doesn't undo/overwrite what GL state the examples are changing - anymore. As such, the examples need to reset the GL state themselves - to be able to play nice with libgstgl - -2016-11-08 13:35:33 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfiltershader.c: - glfiltershader: expand the docs slightly - Add an example OpenGL shader - -2016-07-01 00:31:07 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - glwindow: remove the navigation thread - This functionality can now effectively be implemented with the display event - thread. - -2016-07-01 00:07:23 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/x11/Makefile.am: - * gst-libs/gst/gl/x11/gstgldisplay_x11.c: - * gst-libs/gst/gl/x11/gstgldisplay_x11.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/xcb_event_source.c: - * gst-libs/gst/gl/x11/xcb_event_source.h: - gl/x11: use xcb instead of libX11 - - xcb is supposedly thread-safe! - videotestsrc ! glimagesink now doesn't spuriously result in a - 'call XInitThreads()' error however if anybody else is using X11, - then XInitThreads() still needs to be called and multiple glimagesink's - still need XInitThreads(). - Everything still takes libX11 handles as they are compatible with the xcb - variants. Unfortunately we cannot move fully over to xcb due to GLX being - entirely based on Xlib. It's also impossible to transform a xcb_connection - to a Display which means we require X11 handles. - -2016-06-30 23:12:33 +1000 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - gldisplay: add a list of glwindow's - With the event thread on the display, for a particular winsys event - we need to be able to retreive the window that the event matches. - -2016-06-30 23:04:16 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - gldisplay: add a dedicated event thread - Will take the place of the navigation event thread for dealing with - winsys events. - -2016-11-08 12:44:45 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglapi.h: - gl: don't expose OpenGL prototypes - We roll our own to avoid depending a certain OpenGL header version - -2016-11-08 02:56:44 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/Makefile.am: - gl/cocoa: don't install the gstglcontext_cocoa.h header - It's not needed to be exposed - -2016-11-08 02:52:37 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/android/Makefile.am: - gl/android: don't install the android window header - It's not needed - -2016-11-08 02:50:41 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimage.h: - * gst-libs/gst/gl/egl/gstgldisplay_egl.h: - * gst-libs/gst/gl/egl/gstglmemoryegl.h: - * gst-libs/gst/gl/wayland/gstgldisplay_wayland.h: - * gst-libs/gst/gl/x11/gstgldisplay_x11.h: - gl: add padding to all exposed winsys/platform-specific structs - -2016-11-08 02:47:36 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/meson.build: - * gst-libs/gst/gl/wayland/Makefile.am: - gl/wayland: install the gstgldisplay_wayland.h header - As it is used by other OpenGL sinks (gtkglsink, qmlglsink) - -2016-11-08 02:44:30 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/Makefile.am: - * gst-libs/gst/gl/meson.build: - gl/egl: don't install the gstglcontext_egl.h header - It's not needed to be exposed and there are no users of the API. - -2016-11-08 02:21:20 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstgloverlay.c: - * ext/gl/gstgltransformation.c: - * gst-libs/gst/gl/gstglbasefilter.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - glfilter: remove display_init/reset - They are mirrors of GstGLBaseFilter's gl_start() and gl_stop() virtual methods - so use them instead. - -2016-11-07 14:47:22 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/qt/gstqtsrc.cc: - * ext/qt/gstqtsrc.h: - * ext/qt/qtwindow.cc: - * ext/qt/qtwindow.h: - qmlglsrc: some enhancements for qmlglsrc - 1. Need set use-default-fbo to qquickwindow during set property - to support change render target on the fly. - 2. Calculate qmlglsrc refresh frame rate in qtglwindow - https://bugzilla.gnome.org/show_bug.cgi?id=774035 - -2016-11-04 11:56:13 +0530 Gaurav Gupta <g.gupta@samsung.com> - - * sys/vdpau/gstvdpsink.c: - vdpsink: fix Memory leak due to Xlib API usage - https://bugzilla.gnome.org/show_bug.cgi?id=773932 - -2016-11-04 09:56:33 +0100 Philippe Normand <philn@igalia.com> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_demux.c: - * tests/check/elements/dash_mpd.c: - mpdparser: MS PlayReady ContentProtection parsing - The "pro" (PlayReady Object) element contents are now base64-decoded - and properly stored in Protection events. - https://bugzilla.gnome.org/show_bug.cgi?id=773936 - -2016-11-04 16:26:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/yadif/gstyadif.c: - * tests/check/elements/compositor.c: - gst: Fix more mentions of interlaced-mode to say interlace-mode - -2016-11-04 13:43:08 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/wayland/Makefile.am: - wayland: only use libdrm headers, don't link to the lib - https://bugzilla.gnome.org/show_bug.cgi?id=773927 - -2016-11-04 09:26:48 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * sys/kms/Makefile.am: - kms: rename variable used - Since this includes kms. - -2016-11-04 00:52:41 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/wayland/Makefile.am: - * ext/wayland/wlvideoformat.h: - wayland: include drm_fourcc.h properly and fix build - -2016-11-04 00:44:32 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/wayland/Makefile.am: - wayland: fix cflags/libs order - -2016-11-04 09:51:36 +0530 Arun Raghavan <arun@osg.samsung.com> - - * ext/vulkan/meson.build: - vulkan: Add missing files to meson build - -2016-09-29 16:30:33 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - * ext/wayland/wllinuxdmabuf.c: - * ext/wayland/wlshmallocator.c: - waylandsink: Rework dmabuf support - Simplify and fix some of the show_frame logic. - https://bugzilla.gnome.org/show_bug.cgi?id=711155 - -2016-09-22 11:10:47 +0200 Fabien Dessenne <fabien.dessenne@st.com> - - * ext/wayland/Makefile.am: - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - * ext/wayland/wllinuxdmabuf.c: - * ext/wayland/wllinuxdmabuf.h: - * ext/wayland/wlshmallocator.c: - * ext/wayland/wlvideoformat.c: - * ext/wayland/wlvideoformat.h: - waylandsink: support linux dmabuf protocol - Support the wayland zwp_linux_dmabuf_unstable_v1 protocol. - SHM formats and DMABuf formats are exposed differently in caps: the - DMABuf formats are flagged with GST_CAPS_FEATURE_MEMORY_DMABUF. - No buffer pool is proposed for DMABuf buffers, it is the upstream - element responsibility to provide with such buffers. - https://bugzilla.gnome.org/show_bug.cgi?id=711155 - -2016-09-29 14:34:18 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlshmallocator.c: - waylandsink: Allow any kind of FD for shm memory - https://bugzilla.gnome.org/show_bug.cgi?id=711155 - -2016-11-03 17:34:54 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * configure.ac: - * ext/ttml/meson.build: - ttml: bump needed libxml2 version - ttml was recently added but it won't compile unless libxml2 version 2.9.2 - or later is available. In that version the first parameter of xmlGetProp - switched to being a const. In previous versions the compiler complains - about passing a const value to a non const argument. - -2016-11-03 08:31:36 +0100 Edward Hervey <edward@centricular.com> - - * tests/check/elements/.gitignore: - check: Add new test to .gitignore - -2016-11-03 18:19:58 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: Fix inverted precondition - A GError argument must either be null or point to a NULL GError. - https://developer.gnome.org/glib/stable/glib-Error-Reporting.html - -2016-09-01 20:04:08 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: Use the trash list to free resources after they've been used - This allows further parallelism and removes a device wait from the end of - the render code. - -2016-09-01 19:52:40 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/Makefile.am: - * ext/vulkan/vk.h: - * ext/vulkan/vk_fwd.h: - * ext/vulkan/vktrash.c: - * ext/vulkan/vktrash.h: - vulkan: add a trash object - This allows pushing the destruction of vulkan resources after the signalling - of an vulkan event. The event facilitates knowing when a specific point in the - vulkan queue has been reached. Only after the event has been signaled can - vulkan resources be freed and/or reused. - -2016-09-01 19:51:11 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/Makefile.am: - * ext/vulkan/vk.h: - * ext/vulkan/vk_fwd.h: - * ext/vulkan/vkfence.c: - * ext/vulkan/vkfence.h: - vulkan: add a simple refcountable fence wrapper - -2016-11-03 16:14:37 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglwindow.c: - gl/gi: some annotation updates for called functions - With scope, closure, destroy annotations - -2016-11-03 16:12:32 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - gl/gi: also include GstVideo - Removes all the unknown type GstVideo* warnings while building the GIR - file. - -2016-10-27 16:19:04 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglfeature.h: - * gst-libs/gst/gl/gstglfeature_private.h: - glfeature: move internal functions into a private header - Don't expose them to the outside world - -2016-10-05 12:19:12 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * ext/gl/caopengllayersink.m: - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglstereosplit.c: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstglvideomixer.c: - * ext/gtk/gstgtkglsink.c: - * ext/qt/gstqtsink.cc: - * ext/qt/gstqtsrc.cc: - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/android/gstglwindow_android_egl.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.h: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.h: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/gstglbasefilter.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - * sys/androidmedia/gstamcvideodec.c: - * sys/applemedia/glcontexthelper.c: - * tests/examples/gl/qt/qglwtextureshare/pipeline.cpp: - * tests/examples/gl/sdl/sdlshare.c: - * tests/examples/gl/sdl/sdlshare2.c: - gl: GST_GL_TYPE -> GST_TYPE_GL - Some deprecated symbols are kept for backwards compatibility - -2016-11-03 12:03:24 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/egl/gstgldisplay_egl.c: - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglbasefilter.c: - * gst-libs/gst/gl/gstglbasememory.h: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstgldebug.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglformat.c: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/gl/gstglmemorypbo.h: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstglsl.h: - * gst-libs/gst/gl/gstglslstage.c: - * gst-libs/gst/gl/gstglslstage.h: - * gst-libs/gst/gl/gstglsyncmeta.c: - * gst-libs/gst/gl/gstglsyncmeta.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * gst-libs/gst/gl/gstglviewconvert.h: - * gst-libs/gst/gl/gstglwindow.h: - gl/docs: massive update - - add Since: markers where necessary. - - document structs - - add documentation headers for each module (short_description, - see_also, etc) - - reduce the number of warnings gtk-doc outputs - - fix spelling mistakes - -2016-11-02 21:21:33 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimage.c: - * gst-libs/gst/gl/egl/gsteglimage.h: - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - * gst-libs/gst/gl/egl/gstglmemoryegl.h: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/gl/gstglquery.c: - * gst-libs/gst/gl/gstglquery.h: - * gst-libs/gst/gl/gstglrenderbuffer.c: - gl/docs: document new API added in 1.10 - GstGLRenderbuffer - GstGLFramebuffer - GstGLQuery - GstEGLImage - GstGLMemoryEGL - -2016-11-01 16:13:21 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - gl/docs: update lists of included symbols - in the sections and types files. - Also remove some unneeded types from the documentation as they aren't - exposed as public API - -2016-11-01 17:30:03 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsl.c: - * tests/check/libs/gstglsl.c: - glsl: fix #version 150 not working with profiles - The spec allows the core/compatibility profiles to be used - with #version 150. - Also tighten up the tests to check for default profiles being chosen - correctly. - -2016-11-02 20:14:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/meson.build: - * ext/ttml/meson.build: - ttml: Add meson.build - -2016-11-02 20:14:23 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/fdkaac/meson.build: - * ext/meson.build: - fdkaac: Add meson.build - -2016-11-02 16:12:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Also stop scheduled playback when gst_element_lost_state() is called - Unfortunately this does not go through the normal state change - machinery, so we don't get notified about this in change_state(). - However we need to stop scheduled playback, so that once PLAYING is - reached again we can start scheduled playback with the correct time. - Without this, flushing seeks in PLAYING will not work correctly: - decklinkvideosink will wait before showing the new frames for the amount - of time the pipeline was in PLAYING before. - -2016-11-02 15:00:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Use gst_clock_adjust_with_calibration() and unadjust_with_calibration() - Instead of hand-crafted versions of the same calculation. These - calculations are still too complicated though. - -2016-11-02 14:04:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsagent.c: - * ext/dtls/gstdtlssrtpdec.c: - dtls: Fix compiler warnings with openssl 1.1 or newer - - DTLSv1_method() is deprecated, and since 1.0.2 replaced by - DTLS_method(). - - CRYPTO_set_locking_callback() and CRYPTO_set_id_callback() are - no-ops (empty macros) since 1.1 and are not supposed to be used - anymore. - gstdtlsagent.c: In function ‘gst_dtls_agent_init’: - gstdtlsagent.c:173:3: error: ‘DTLSv1_method’ is deprecated -Werror=deprecated-declarations - priv->ssl_context = SSL_CTX_new (DTLSv1_method ()); - ^~~~ - In file included from /usr/include/openssl/ct.h:13:0, - from /usr/include/openssl/ssl.h:61, - from gstdtlsagent.c:40: - /usr/include/openssl/ssl.h:1614:1: note: declared here - DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_method(void)) /* DTLSv1.0 */ - ^ - At top level: - gstdtlsagent.c:103:1: error: ‘ssl_thread_id_function’ defined but not used -Werror=unused-function - ssl_thread_id_function (void) - ^~~~~~~~~~~~~~~~~~~~~~ - gstdtlsagent.c:73:1: error: ‘ssl_locking_function’ defined but not used -Werror=unused-function - ssl_locking_function (gint mode, gint lock_num, const gchar * file, gint line) - ^~~~~~~~~~~~~~~~~~~~ - -2016-11-02 11:21:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * win32/common/libgstplayer.def: - win32: Update for new GstPlayer API - -2016-01-05 18:50:45 +0100 Florian Zwoch <fzwoch@gmail.com> - - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstdx9screencapsrc.h: - dx9screencapsrc: add "cursor" option to draw the cursor - Drawing is done via the GDI drawing functions. The cursor is - converted to a monochrome version before drawing. This is because - the GDI drawing functions seem to have undefined behavior with - cursor images including an alpha channel. - I could not find any other reliable way to draw these alpha - channel cursors without producing unwanted artifacts. These type - of cursors were introduced with Window Vista when run with it's - Aero theme. - Also adjust the cursor coordinates when capturing non-primary - screens via the "monitor" option. - https://bugzilla.gnome.org/show_bug.cgi?id=760172 - -2016-11-02 09:36:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/rawvideoparse.c: - Revert "tests: rawvideoparse: add test for flow error handling" - This reverts commit 280b4ac2ffc63908a74944f50589b2630be16232. - https://bugzilla.gnome.org/show_bug.cgi?id=773666 - -2016-10-28 16:39:13 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/dtls/gstdtlsagent.c: - dtls: Downgrade locking debug - -2016-06-29 09:58:38 +0100 Chris Bass <floobleflam@gmail.com> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-ttmlsubs.xml: - * ext/Makefile.am: - * ext/ttml/Makefile.am: - * ext/ttml/gstttmlparse.c: - * ext/ttml/gstttmlparse.h: - * ext/ttml/gstttmlplugin.c: - * ext/ttml/gstttmlrender.c: - * ext/ttml/gstttmlrender.h: - * ext/ttml/subtitle.c: - * ext/ttml/subtitle.h: - * ext/ttml/subtitlemeta.c: - * ext/ttml/subtitlemeta.h: - * ext/ttml/ttmlparse.c: - * ext/ttml/ttmlparse.h: - ttml: Add plugin that supports TTML subtitles - Add a parser (ttmlparse) and renderer (ttmlrender) element that handle - subtitles that use the EBU-TT-D profile of TTML1. - https://bugzilla.gnome.org/show_bug.cgi?id=758232 - -2016-10-29 11:33:18 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/rawvideoparse.c: - tests: rawvideoparse: add test for flow error handling - Also needs fixes in baseparse: - https://bugzilla.gnome.org/show_bug.cgi?id=773666 - -2016-11-01 18:10:23 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: update version - -2016-10-26 16:28:10 +0800 Lyon Wang <lyon.wang@nxp.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - * win32/common/libgstplayer.def: - player: Add configuration for enabling accurate seeks - https://bugzilla.gnome.org/show_bug.cgi?id=773521 - -2016-10-21 14:01:11 +0300 Vivia Nikolaidou <vivia@toolsonair.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Ignore channel-mask when checking set_caps compatibility - channel-mask doesn't matter in decklinkaudiosrc, and differences in it - can cause caps negotiations to fail without a real reason. - https://bugzilla.gnome.org/show_bug.cgi?id=773313 - -2016-10-04 16:59:09 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/srtp.c: - tests: add a test for srtp elements - https://bugzilla.gnome.org/show_bug.cgi?id=772357 - -2016-10-03 09:52:07 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/srtp/gstsrtpdec.c: - srtpdec: add stats readonly property, similar to srtpenc - https://bugzilla.gnome.org/show_bug.cgi?id=772357 - -2016-09-26 18:01:30 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Cache duration and return cached duration - https://bugzilla.gnome.org/show_bug.cgi?id=771992 - -2016-01-08 21:41:56 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/bayer/gstbayer2rgb.c: - * gst/bayer/gstrgb2bayer.c: - bayer: fix stride inconsistencies for odd widths - Consistently use GST_ROUND_UP_4(width) as stride for - bayer buffers. Bayer data will usually come in widths - that are multiples of 4 anyway, so hopefully this - should not have any adverse impact on anyone in - practice. - Before, bayer2rgb required input buffers to are sized - accordingly, but then didn't actually round up when - calculating row offsets. rgb2bayer didn't use a rounded - stride nor buffer size. - https://bugzilla.gnome.org/show_bug.cgi?id=752014 - -=== release 1.11.0 === - -2016-11-01 18:53:15 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -=== release 1.10.0 === - -2016-11-01 17:58:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstgtk.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-opengl.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qt.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtcdsp.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.10.0 - -2016-11-01 17:51:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2016-11-01 17:42:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/ky.po: - * po/sv.po: - po: Update translations - -2016-10-31 19:26:31 +0600 Artem Martynovich <artem.martynovich@gmail.com> - - * sys/directsound/gstdirectsoundsrc.c: - directsoundsrc: Correctly cast mixer to uintptr - https://bugzilla.gnome.org/show_bug.cgi?id=773720 - -2016-10-28 10:05:20 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * ext/hls/gsthlsdemux.c: - hlsdemux: don't try to access non-existant iframe variant - If the playlist does not contain any iframe variants then - demux->master->iframe_variants is NULL. If the previous variant is an - iframe variant then there is at least one iframe variant and - demux->master->iframe_variants->data can be safely used. - https://bugzilla.gnome.org/show_bug.cgi?id=773635 - -2016-10-23 12:02:00 +0300 sezero <sezero@users.sourceforge.net> - - * ext/timidity/gsttimidity.c: - timidity: add support for libtimidity-0.2.x - mid_istream_open_mem() doesn't accept an autofree argument as of - libtimidity >= 0.2.0 - https://bugzilla.gnome.org/show_bug.cgi?id=772503 - -2016-10-26 14:51:01 +0200 Daiki Ueno <dueno@redhat.com> - - * ext/dtls/gstdtlscertificate.c: - * ext/dtls/gstdtlsconnection.c: - dtls: port to OpenSSL 1.1.0 - Changes are: - - Use the wrapper functions to access opaque data types. To preserve - backward compatibility, define fallback definitions - - Remove the use of idiom "pqueue_size(ssl->d1->sent_messages)", since - there is no replacement - - Use RSA_generate_key_ex instead of the deprecated RSA_generate_key - https://bugzilla.gnome.org/show_bug.cgi?id=773540 - -2016-10-29 11:31:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/rawparse/gstrawbaseparse.c: - rawparse: pass flow returns upstream - rawvideoparse wouldn't error out on not-negotiated, - but would just keep on going, because it didn't pass - the flow return value back to the parent class and - thus upstream, so the source wouldnt' stop streaming. - -2016-10-28 07:17:56 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/win32/Makefile.am: - build: Also need to define GST_EXPORTS for Autotools - The change to use GST_EXPORT for symbols under Windows requires - GST_EXPORTS for internal use, and that is also needed under Autotools. - The same thing is done for gstreamer-1.0.dll in -core. - -2016-10-28 06:23:02 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglsl_private.h: - gstgl: Re-enable WINAPI on _MSC_VER - The calling convention may be deprecated, but we still need it for - OpenGL. The build issue was caused by an incorrect syntax being used for - the WINAPI (__stdcall) prototype in function pointers which was accepted - by GCC but is rejected by MSVC. - -2016-10-27 23:09:38 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * win32/common/libgstgl.def: - Just remove win32/common/libgstgl.def - It was always wrong since the symbols being exported in gstgl-1.0.dll - are platform-specific, and the check we do in dist checks it on all - platforms (which usually means Linux) and the list is instead - Linux-specific right now. - Even if we fix that, it can still never be right because it depends on - your configuration even on a specific platform. For instance, when we - start building EGL support on Windows using ANGLE, the symbol list will - change depending on whether that is enabled or not. - We also don't need this anymore since we use GST_EXPORT for all - functions exported on Windows now. - -2016-10-27 09:25:20 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/gl/gstglstereosplit.c: - * ext/openh264/gstopenh264enc.cpp: - * gst/videoparsers/gsth264parse.c: - plugins: Use explicit type conversion from enums - MSVC warns about this because it's a C++ compiler, and this actually - results in useful things such as the incorrect 'gboolean' return value - for functions that return GstFlowReturn, so let's do explicit - conversions to reduce the noise and increase its efficacy. - -2016-10-27 09:11:26 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/gl/gstgltransformation.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/freeverb/gstfreeverb.c: - * gst/gaudieffects/gstgaussblur.c: - * gst/speed/gstspeed.c: - * gst/stereo/gststereo.c: - Explicitly define float constants as float - With MSVC, this gives the following warning: - warning C4305: 'function': truncation from 'double' to 'gfloat' - Apparently, MSVC does not figure out what type to use for constants - based on the assignment. This warning is very spammy, so let's try to - fix it. - -2016-10-27 09:08:41 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/dts/gstdtsdec.c: - * ext/faad/gstfaad.c: - * ext/gl/gstglviewconvert.c: - * ext/schroedinger/gstschrodec.c: - * gst-libs/gst/audio/gstaudioaggregator.c: - Fix incorrect return type in several functions - All these should return GstFlowReturn, not gboolean - -2016-10-27 09:06:33 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson.build: - meson: Don't warn about C4146 with MSVC - The error is: - unary minus operator applied to unsigned type, result still unsigned - This is a commonly-done operation in gstreamer and it's done on purpose. - It's just noise. - -2016-10-27 08:17:58 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglbasefilter.h: - * gst-libs/gst/gl/gstglbasememory.h: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstglbufferpool.h: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstglcontrolbindingproxy.h: - * gst-libs/gst/gl/gstgldebug.h: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfeature.h: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglformat.h: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmemorypbo.h: - * gst-libs/gst/gl/gstgloverlaycompositor.h: - * gst-libs/gst/gl/gstglquery.h: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglshaderstrings.h: - * gst-libs/gst/gl/gstglsl.h: - * gst-libs/gst/gl/gstglslstage.h: - * gst-libs/gst/gl/gstglsyncmeta.h: - * gst-libs/gst/gl/gstglupload.h: - * gst-libs/gst/gl/gstglutils.h: - * gst-libs/gst/gl/gstglviewconvert.h: - * gst-libs/gst/gl/gstglwindow.h: - gstgl: Add GST_EXPORT to all symbols used on Windows - This is a requirement for those symbols to be exported in gstgl-1.0.dll - when building with the MSVC compiler - -2016-10-27 07:29:36 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/gl/meson.build: - meson: Add support for building WGL on Windows - Currently only tested with MSVC. - -2016-10-27 09:10:03 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/gl/gstgloverlay.c: - ext/gl: Don't define boolean on Windows with MSVC - The headers we include already define boolean on Windows with MSVC, and - it leads to a typedef redefinition error with jpeglib.h which tries to - redefine it in jmorecfg.h - -2016-10-27 07:30:19 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/gl/gstglapi.h: - gstgl: Porting fixes for MSVC with Meson - GL/gl.h needs windows.h on MSVC - WINAPI should not be used with MSVC. It also causes a build error. - -2016-10-23 22:13:33 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: collapse notes on channel_name encoding conflict - -2016-10-23 22:00:30 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: rename ZAP parser for clarity - This function only does ZAP parsing. Additionally, remove redundant - comment while at it. - -2016-10-23 21:37:46 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - * sys/dvb/parsechannels.c: - dvb: fix gtk-doc syntax for wrongly formatted comments - -2016-10-21 00:37:03 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * ext/hls/meson.build: - meson: hls: Only build when any crypto_dep is found - https://bugzilla.gnome.org/show_bug.cgi?id=773114 - -2016-10-21 00:39:32 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/directsound/meson.build: - meson: directsound: Add ole32 library dependency - https://bugzilla.gnome.org/show_bug.cgi?id=773114 - -2016-10-17 09:35:41 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * sys/winscreencap/meson.build: - meson: winscreencap depends on gstvideo - https://bugzilla.gnome.org/show_bug.cgi?id=773114 - -2016-10-21 00:35:09 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * meson.build: - meson: Remove gstreamer-check-1.0 dependency - It will later be added under tests/check - https://bugzilla.gnome.org/show_bug.cgi?id=773114 - -2016-10-21 13:10:47 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - glsyncmeta: don't glFinish() everytime a sync point is set - At minimum, we only need to glFlush() if we are in a shared GL context - environment. Move the glFinish() to when the actual wait is requested - which may be never. Improves the throughput on older GL systems without - GL3/GLES3 and/or fence sync objects. - -2016-07-16 15:29:42 -0300 Thiago Santos <thiagossantos@gmail.com> - - * ext/dash/gstmpdparser.c: - dash: do not use invalid stream duration - If it is is unknown, consider it infinite - https://bugzilla.gnome.org/show_bug.cgi?id=768460 - -2016-07-16 15:15:21 -0300 Thiago Santos <thiagossantos@gmail.com> - - * ext/dash/gstmpdparser.c: - dash: properly inherit segmentlist from period - Representation can inherit SegmentList from Period if none is available - from the AdaptationSet - https://bugzilla.gnome.org/show_bug.cgi?id=768460 - -2016-10-19 16:11:58 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstopengl.c: - * ext/gl/meson.build: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h: - * gst-libs/gst/gl/egl/gstegl.h: - * gst-libs/gst/gl/meson.build: - * meson_options.txt: - meson: gl: add support for building with dispmanx on the rpi - -2016-10-18 22:29:19 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimage.c: - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - gl/eglimage: Fix passing the destroy function to gst_egl_image_new_wrapped - The function pointer and the user data arguments were swapped in both - uses. - https://bugzilla.gnome.org/show_bug.cgi?id=769382 - -2016-10-18 13:01:04 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/segmentclip/meson.build: - meson: Add missing gstvideo dep to segmentclip - In file included from ../subprojects/gst-plugins-base/gst-libs/gst/video/video.h:27:0, - from ../subprojects/gst-plugins-bad/gst/segmentclip/gstvideosegmentclip.c:25: - ../subprojects/gst-plugins-base/gst-libs/gst/video/video-format.h:27:39: fatal error: gst/video/video-enumtypes.h: No such file or directory - #include <gst/video/video-enumtypes.h> - ^ - compilation terminated. - https://ci.gstreamer.net/job/GStreamer-master-meson/269/console - -2016-10-11 17:06:23 +0530 Munez <munezbn.dev@gmail.com> - - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h: - Implemented gst_video_overlay_set_window_handle() - https://bugzilla.gnome.org/show_bug.cgi?id=772608 - -2016-10-18 14:11:26 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/meson.build: - meson: gl: fix detection of glx without gl - We need to check for libGL if we may use desktop OpenGL *or* GLX. - -2016-10-18 14:10:32 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/meson.build: - meson: gl: fix incorrect error string - Use the winsys variable for an incorrect winsys provided - -2016-10-16 12:40:22 +0200 Sergey Borovkov <sergey.borovkov@wireload.net> - - * ext/qt/qtwindow.cc: - qt: Fix failing build on RPI - https://bugzilla.gnome.org/show_bug.cgi?id=773026 - -2016-10-11 16:58:48 +0530 Munez <munezbn.dev@gmail.com> - - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - gl/dispmanx: egl_show should resize the window only if there is no render rectangle set - https://bugzilla.gnome.org/show_bug.cgi?id=772699 - -2016-10-11 16:55:17 +0530 Munez <munezbn.dev@gmail.com> - - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - gl/dispmanx: Fix set_render_rectangle typo - https://bugzilla.gnome.org/show_bug.cgi?id=772698 - -2016-03-18 14:09:37 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsmux/tsmux/tsmux.c: - mpegtsmux: fix buffer size mismatch in M2TS mode - In M2TS mode, we need an extra 4 bytes in the buffer, so need - to ensure the buffer can contain these. The allocation site - does not know the mode, so this is done in all cases. - -2016-10-15 22:19:02 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * meson.build: - meson: Don't set c_std to gnu99 - Use the default for each compiler on every platform instead. This - improves our compatibility with compilers that don't have gnu99 as - a c_std. - -2016-10-14 14:41:42 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix 'delivery system'-related messages - * Rephrase tune error to be delsys-neutral - * Refer to the actual check in the 'missing sanity check' warnings - * Use "Delivery system" instead of 'delsys'. The - latter is OK as a shorthand in the code but not - even a real word - -2016-10-11 18:48:06 +0200 Joan Pau Beltran <joanpau.beltran@socib.cat> - - * gst/bayer/gstbayer2rgb.c: - * gst/bayer/gstrgb2bayer.c: - bayer: fix _transform_caps method to preserve fields in given caps - https://bugzilla.gnome.org/show_bug.cgi?id=758717 - -2016-09-29 12:49:39 -0400 Arun Raghavan <arun@arunraghavan.net> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Properly configure internal pool - There was a small omission in the code. It still worked, but the pool - configuration may not have been optimimal. - -2016-10-12 18:20:27 +0100 Tim-Philipp Müller <tim@centricular.com> - - * common: - common: sync to latest revision - Fixes accidental common change when commit patch. - -2016-10-11 11:11:16 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Implement efficient program updates - If the parent bin can handle it, only add/remove the new/gone stream - instead of re-adding/re-moving everything - https://bugzilla.gnome.org/show_bug.cgi?id=772742 - -2016-10-12 14:35:21 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsdemux: Ensure we always get an upstream stream-id - This was a regression. - We only have a upstream-id via STREAM_START if we were in push-mode. - In pull-mode we need to create one. - Note: It would be good to eventually have that method (copied from - gst_pad_get_stream_id_internal()) public in the future - -2016-10-11 16:47:37 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Fix issues with GST_DISABLE_GST_DEBUG - Some variables were hidden or unused - -2015-07-29 15:52:05 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Switch to using GstStream/GstStreamCollection - For each MpegTSBaseStream, we have a GstStream object which - subclasses can extend with information. - For each program a GstStreamCollection is created with all - GstStream from each stream. - -2016-10-11 10:50:17 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Remove duplicated code - Just have one function to check for private section streams - -2016-10-10 17:00:39 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix buffer size print format - https://bugzilla.gnome.org/show_bug.cgi?id=772706 - -2016-10-10 16:52:58 +0200 Arnaud Vrac <avrac@freebox.fr> - - * common: - * ext/hls/gsthlsdemux.h: - hlsdemux: fix hls demux stream type inheritance - GstHLSDemuxStream inherits GstAdaptiveDemuxStream, not - GstAdaptiveDemux. Fixes memory corruption issues. - https://bugzilla.gnome.org/show_bug.cgi?id=772704 - -2016-10-09 06:42:30 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: parse guard interval as a fraction - Fixes wrong default failover when parsing libdvbv5 formatted - channel configuration files. - -2016-10-09 03:23:19 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: add prototypes and reorganize for clarity - -2016-10-08 07:18:15 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - Update my email address - -2016-10-08 05:33:34 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/cam.h: - * sys/dvb/camapplication.h: - * sys/dvb/camapplicationinfo.h: - * sys/dvb/camconditionalaccess.h: - * sys/dvb/camdevice.h: - * sys/dvb/camresourcemanager.h: - * sys/dvb/camsession.h: - * sys/dvb/camswclient.h: - * sys/dvb/camtransport.h: - * sys/dvb/camutils.h: - dvb: drop trailing whitespace and c&p leftovers - -2016-10-08 05:20:47 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: parse DVB-T hierarchy from v5 config file - Avoids relying on the H/W default when the information - can be extracted from the configuration file. - -2016-10-08 04:55:20 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: parse DVB-T lp and hp code rates - -2016-10-08 14:08:06 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegts: Also clear packetizer on TIME DISCONT - When dealing with TIME-based input, the incoming stream could have - potentially changed completely. - In order to check whether it did or not, we need to re-check all sections - (PAT, PMT...). If it didn't, we will keep using the existing streams/pad, - and if it did we will act as if there was a program switch. - Fixes HLS streaming with decodebin3/playbin3 - -2016-10-02 09:34:51 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Calculate values before queue2 - In order to calculate the *actual* bitrate for downloading a fragment - we need to take into account the time since we requested the fragment. - Without this, the bitrate calculations (previously reported by queue2) - would be biased since they wouldn't take into account the request latency - (that is the time between the moment we request a specific URI and the - moment we receive the first byte of that request). - Such examples were it would be biased would be high-bandwith but high-latency - networks. If you download 5MB in 500ms, but it takes 200ms to get the first - byte, queue2 would report 80Mbit/s (5Mb in 500ms) , but taking the request - into account it is only 57Mbit/s (5Mb in 700ms). - While this would not cause too much issues if the above fragment represented - a much longer duration (5s of content), it would cause issues with short - ones (say 1s, or when doing keyframe-only requests which are even shorter) - where the code would expect to be able to download up to 80Mbit/s ... whereas - if we take the request time into account it's much lower (and we would - therefore end up doing late requests). - Also calculate the request latency for debugging purposes and further - usage (it could allow us to figure out the maximum request rate for - example). - https://bugzilla.gnome.org/show_bug.cgi?id=733959 - https://bugzilla.gnome.org/show_bug.cgi?id=772330 - -2016-10-06 15:54:00 +0900 Jimmy Ohn <yongjin.ohn@lge.com> - - * ext/opencv/gstopencvutils.cpp: - opencv: Fix memory leak by gst_caps_to_string - gst_caps_to_string function returned allocated memory. - So, It should be freed using g_free function. - https://bugzilla.gnome.org/show_bug.cgi?id=772499 - -2016-10-05 18:32:09 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: don't use g_thread_join() to join the navigation thread - Using g_thread_join() in _finalize() handlers may result in a deadlock - joining the current thread when the last reference is held by a signal - handler. - e.g.: - error 'Resource deadlock avoided' during 'pthread_join (pt->system_thread, NULL)' - The backtrace looks like this: - ... - g_thread_join () - gst_gl_window_finalize () - gst_gl_window_x11_finalize () - g_object_unref () - g_value_unset () - g_signal_emit_valist () - g_signal_emit () - gst_gl_window_send_mouse_event () - gst_gl_window_mouse_event_cb () - g_main_dispatch () - .. - g_main_loop_run () - gst_gl_window_navigation_thread () - g_thread_proxy () - start_thread () - clone () - -2016-10-05 18:28:48 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgluploadelement.c: - gluploadelement: fix leak of upload library object - When only linking the element, the upload object will be created from - _transform_caps() but will never be unreffed as the only case is in _stop(). - Add an unref if non-NULL to a new finalize handler for this case. - -2016-10-05 12:11:19 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdisplay.c: - vkdisplay: hold a weakref on the list of windows - It's possible that the window may have been destroyed when a winsys - event comes in for it. - Fixes an assertion in make -C tests/check generic/states.check - -2016-10-05 11:37:04 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - vkdevice: only unref the gstcontext query if non-NULL - Fixes an assertion in make -C tests/check generic/states.check - -2016-09-29 11:45:57 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglcolorconvert.c: - * tests/check/libs/gstglupload.c: - tests/gl: make sure all GL commands are executed on the GL thread - e.g. the final glGetError() must also be completed on the GL thread - -2016-09-28 18:04:21 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/win32/Makefile.am: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.h: - gl/win32: remove egl implementation - It hasn't been used in ages and is dead code. - -2016-09-13 22:07:05 +0900 Wonchul Lee <wonchul.lee@collabora.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Add conditions to identify ATSC EAC3 - https://bugzilla.gnome.org/show_bug.cgi?id=770528 - -2016-09-26 15:23:52 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: make parsing errors delsys-neutral - DVB is a group of delivery standards but we support - several others. While at this, make message formating - more congruent. - -2016-09-30 11:35:41 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * hooks/pre-commit.hook: - * meson.build: - meson: Setup pre-commit hooks when configuring - -2016-09-30 11:41:34 +0100 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - meson: update version - -2016-09-30 13:42:06 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Remove Return documentation for function returning void - -=== release 1.9.90 === - -2016-09-30 13:02:55 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstgtk.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-opengl.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qt.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtcdsp.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.9.90 - -2016-09-30 12:19:32 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2016-09-30 11:44:47 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/ky.po: - * po/sv.po: - po: Update translations - -2016-09-29 21:42:24 +0530 Arun Raghavan <arun@osg.samsung.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Actually use buffer pool config after setting it up - CID: 1373420 - -2016-09-29 13:36:11 +0300 Sergey Mamonov <samamonov@gmail.com> - - * ext/lv2/gstlv2filter.c: - fix for https://bugzilla.gnome.org/show_bug.cgi?id=771871 - -2016-09-29 21:45:50 +0530 Arun Raghavan <arun@osg.samsung.com> - - * sys/bluez/gsta2dpsink.c: - a2dpsink: Drop some dead-code - Left over from the last cleanup. - CID: 1373418 - -2016-09-29 14:32:15 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/fdkaac/gstfdkaacdec.c: - fdkaacenc: fix accessing freed memory - The buffer data is not always copied in _Fill, and will be - read in _DecodeFrame. We unmap at the end of the function, - whether we get there via failure or early out, and keep a - ref to the buffer to ensure we can use it to unmap the - memory even after _finish_frame is called, as it unrefs - the buffer. - Note that there is an access beyond the allocated buffer, - which is only apparent when playing from souphttpsrc (ie, - not from filesrc). This appears to be a bug in the bit - reading code in libfdkaac AFAICT. - https://bugzilla.gnome.org/show_bug.cgi?id=772186 - -2016-09-29 14:31:37 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/fdkaac/gstfdkaacdec.c: - * ext/fdkaac/gstfdkaacdec.h: - fdkaacdec: avoid memory corruption on decoding error - The buffer size is expected to be in multiples of the sample size, - not in bytes. - https://bugzilla.gnome.org/show_bug.cgi?id=772186 - -2016-09-29 14:29:46 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/fdkaac/gstfdkaacdec.c: - fdkaacenc: fix buffer leak - https://bugzilla.gnome.org/show_bug.cgi?id=772186 - -2016-09-28 09:44:58 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/fdkaac/gstfdkaacenc.c: - fdkaacenc: set framed=true on src caps - This fixes muxing in MPEG TS. - https://bugzilla.gnome.org/show_bug.cgi?id=772108 - -2016-05-05 15:53:57 +0900 Gwang Yoon Hwang <yoon@igalia.com> - - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h: - gl/dispmanx: Implements set_render_rectangle to adjust the position of window - We cannot set the x, y coordinate of the video frame at the dispmanx at - this point. We need to teach dispmanx backend to understand about - set_render_rectangle API to draw a video with other UI. - This patch keeps the current behavior which places video frame at the - center of the display if there is no set_render_rectangle call to the - dispmanx window. - https://bugzilla.gnome.org/show_bug.cgi?id=766018 - -2016-09-28 15:20:25 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasefilter.h: - * gst-libs/gst/gl/gstglbasememory.h: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstglbufferpool.h: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstgldebug.h: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfeature.h: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmemorypbo.h: - * gst-libs/gst/gl/gstgloverlaycompositor.h: - * gst-libs/gst/gl/gstglquery.h: - * gst-libs/gst/gl/gstglrenderbuffer.h: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglslstage.h: - * gst-libs/gst/gl/gstglupload.h: - * gst-libs/gst/gl/gstglviewconvert.h: - gl: add necessary padding bytes to all public structs - -2016-09-27 16:17:00 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/fdkaac/gstfdkaacenc.c: - fdkaacenc: set transmux on the fdkaac lib - Not doing so will fail to decode in a simple fdkaacenc ! fdkaacdec - pipeline, though would work if this goes through a file. - https://bugzilla.gnome.org/show_bug.cgi?id=772067 - -2016-09-27 16:15:44 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/fdkaac/gstfdkaacdec.c: - fdkaacdec: do not error out of out of sync return - The docs say we should continue feeding in data and decoding - https://bugzilla.gnome.org/show_bug.cgi?id=772067 - -2016-09-27 09:08:51 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/fdkaac/gstfdkaacenc.c: - fdkaac: fix error with AOT_MP2_AAC_LC removed from libfdkaac API - AOT_MP2_AAC_LC is a "pseudo AOT" which got removed after 0.1.4, - and maps to AOT_AAC_LC. - Remove mpegversion 2 from th caps to match. - https://bugzilla.gnome.org/show_bug.cgi?id=772067 - -2016-09-26 16:30:02 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/bluez/meson.build: - meson: bluez: fix build - -2016-09-26 16:38:04 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/linux/DeckLinkAPI.h: - * sys/decklink/linux/DeckLinkAPIConfiguration.h: - * sys/decklink/linux/DeckLinkAPIDeckControl.h: - * sys/decklink/linux/DeckLinkAPIDiscovery.h: - * sys/decklink/linux/DeckLinkAPIModes.h: - * sys/decklink/linux/DeckLinkAPITypes.h: - * sys/decklink/linux/DeckLinkAPIVersion.h: - * sys/decklink/osx/DeckLinkAPI.h: - * sys/decklink/osx/DeckLinkAPIConfiguration.h: - * sys/decklink/osx/DeckLinkAPIDeckControl.h: - * sys/decklink/osx/DeckLinkAPIDiscovery.h: - * sys/decklink/osx/DeckLinkAPIDispatch.cpp: - * sys/decklink/osx/DeckLinkAPIModes.h: - * sys/decklink/osx/DeckLinkAPIStreaming.h: - * sys/decklink/osx/DeckLinkAPITypes.h: - * sys/decklink/osx/DeckLinkAPIVersion.h: - decklink: Update to SDK 10.8 - OSX and Linux only, Windows needs someone on Windows to convert the .idl - files to C source code. - -2016-09-26 11:41:42 +0100 Olivier Crête <olivier.crete@ocrete.ca> - - * ext/fdkaac/gstfdkaacdec.c: - fdkaac: fix mixup setting interleaved output - https://bugzilla.gnome.org/show_bug.cgi?id=770455 - -2016-09-26 13:26:36 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Only report the initial duration if the query was successful - -2016-09-26 11:15:25 +0900 Kyungyong Kim <kyungyong.kim@lge.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix parsing of multiple NALs in the hvcC box - https://bugzilla.gnome.org/show_bug.cgi?id=771970 - -2016-09-25 17:38:15 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/bluez/Makefile.am: - bluez: dist new header file - Fixes distcheck. - -2016-09-24 22:39:38 +0530 Arun Raghavan <arun@arunraghavan.net> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsink.h: - a2dpsink: Don't try to set device caps on avdtpsink - We can't actually configure the transport, so we should only be working - with whatever we get. - -2016-09-23 16:31:50 +0530 Arun Raghavan <arun@arunraghavan.net> - - * sys/bluez/gstavdtpsink.c: - avdtpsink: Chain event handling up to basesink - -2016-09-23 16:04:43 +0530 Arun Raghavan <arun@arunraghavan.net> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - bluez: Clean up and make a2dpsink functional again - Was crashing, and had a lot of cruft (like a capsfilter and a fakesink) - that was no longer required. - -2016-09-15 17:49:15 +0530 Arun Raghavan <arun@arunraghavan.net> - - * sys/bluez/Makefile.am: - * sys/bluez/gstavdtpsrc.c: - * sys/bluez/gstavdtpsrc.h: - * sys/bluez/gstavrcputil.c: - * sys/bluez/gstavrcputil.h: - * sys/bluez/org.bluez.xml: - avdtpsrc: Add support for AVRCP metadata - Metadata from AVRCP is emitted as tags, and the duration from AVRCP is - used in queries by avdtpsrc. - -2016-09-24 10:49:10 -0400 Sebastian Dröge <sebastian@centricular.com> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: Properly offset and shift for all formats when converting - And while at it, also clean up some code. - -2016-09-24 10:05:16 -0400 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: Don't pass NULL strings to the colorspace / sampling parsing functions - They assert on NULL. - -2016-09-23 15:49:21 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Don't leak GValues in getcaps - -2016-09-22 18:55:23 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: Update our window size on configure event - This is specific to when the waylandsink is not being embedded. In - this patch we pass the render lock to the window so it can safely - call gst_wl_window_set_render_rectangle() with the new size. - https://bugzilla.gnome.org/show_bug.cgi?id=722343 - -2016-09-22 18:53:22 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Remove atomic operation - We already take the render lock from the wlqueue thread in some other - place which indicates that there is no use of this atomic instead of - a proper locking mechanism. - -2016-09-22 15:37:41 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Do not pre-configure proposed pool - Upstream must configure the pool before using it. Pre-configuring - the proposed pool could hide bugs in upstream elements. - -2016-09-22 15:35:44 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: Properly draw black border in absence of viewporter - When we don't have a viewporter (scaling support), we can't use the - 1x1 scaleup image trick. Instead, we need to allocate a buffer with - the same size as the area that need to have black background. - -2016-09-22 10:55:03 +0200 Florian Zwoch <fzwoch@gmail.com> - - * sys/winscreencap/gstdx9screencapsrc.c: - dx9screencapsrc: throw error for invalid screen index - Currently dx9screencapsrc prints a verbose warning in case the screen - index is out of range for the current number of detected monitors. This - value is then dropped. - However there is no initial indication (beside the console print) if it - worked or not. This may result in capturing an unwanted screen as it - would capture the last set index that was not rejected. - This patch sets the index regardless. Instead, the element throws an - error when it tries to run or getting caps for an invalid index. - https://bugzilla.gnome.org/show_bug.cgi?id=771817 - -2016-09-22 18:19:36 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: also free the GWeakRef when removing dead contexts - Otherwise we leak GWeakRef's. - Found with make -C tests/check libs/gstglcontext.valgrind - -2016-09-21 15:51:52 -0700 Martin Kelly <martin@surround.io> - - * gst-libs/gst/wayland/Makefile.am: - wayland/Makefile.am: add missing libs - libgstwayland is missing a dependency on $(GST_PLUGINS_BASE_LIBS), so add it. - https://bugzilla.gnome.org/show_bug.cgi?id=771794 - -2016-09-21 15:07:50 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/wldisplay.c: - waylandsink: Destroy viewporter when done - https://bugzilla.gnome.org/show_bug.cgi?id=738079 - -2016-09-21 11:33:18 -0700 Martin Kelly <martin@surround.io> - - * tests/check/Makefile.am: - build: add missing $(GST_PLUGINS_BASE_LIBS) - The linker flags for several plugins (dashdemux, mssdemux, hlsdemux) are missing - $(GST_PLUGINS_BASE_LIBS), so add them so they can find -lgsttag and -lgstapp. - https://bugzilla.gnome.org/show_bug.cgi?id=771780 - -2016-09-19 12:11:59 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Port to vmeta and GstVideoFrame - This add support for non-standard strides to be used. Note that - some extra work is needed for multi-plane format which may have - a different GstMemory object per plane. This is not currently a - problem since SHM interface is limited to 1 memory. - -2016-09-19 12:08:20 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Don't propose multiple time the same buffer pool - The buffer pool API does not allow multiple of owner. This otherwise - lead to error when renegotiation take place. Aso consider the - allocation query "need_pool" boolean. - -2016-09-19 12:06:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Promote debug trace into error trace - Otherwise those error may go unseen making debugging much - harder. - -2016-09-19 12:04:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Factor-out the pool creation - -2016-09-16 15:41:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylansink: Implement _show_frame() - This fixes the property show-preroll-frame expose by the VideoSink base - class and removes redundant code. - -2016-09-21 15:09:26 +0200 Joakim Johansson <joakimj@axis.com> - - * tests/check/elements/rtponviftimestamp.c: - rtponviftimestamp: Update unit tests after changing default value of D-bit - The D bit shall always be set to true for the first buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=770221 - -2016-09-21 09:31:23 -0400 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Print the Decklink API error return values in debug output in all places - -2016-09-20 18:28:29 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/wayland/Makefile.am: - wayland: fix distcheck some more - -2016-09-13 11:18:27 +0200 Joakim Johansson <joakimj@axis.com> - - * gst/onvif/gstrtponviftimestamp.c: - rtponviftimestamp: Change default value of D-bit - The default value of D-bit is changed to TRUE so discontinuity - is set for initial request and seek request as well. - Only set the e_bit flag for the CUSTOM_DOWNSTREAM event if - a cached buffer exists. - https://bugzilla.gnome.org/show_bug.cgi?id=770221 - -2016-09-19 10:18:22 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: fix --disable-external - conditional "USE_VULKAN" was never defined - -2016-09-19 16:54:43 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglcolorbalance.c: - glcolorbalance: reconfigure on passthrough changes - Fixes an assertion when moving from passthrough to non-passthrough - Without an explicit reconfigure, glfiter won't have created the GL - resources such as the FBO, GL bufferpool, etc and basetransform will - allocate sysmem buffers instead. - -2016-09-16 13:43:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Remove some leftovers from external GstPlayer - -2016-09-17 14:12:44 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/wayland/Makefile.am: - wayland: fix distcheck when wayland-scanner is not installed - -2016-09-15 14:10:02 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/wayland/wldisplay.c: - * ext/wayland/wlwindow.c: - waylandsink: Make wl_viewporter optional - This makes the viewporter interface optional. The end result is - obviously far from optimal, though it greatly helps testing on older - compostitors or gnome-wayland. We can make it strictly needed later when - this new interface get widely adopted. - -2016-06-14 16:34:35 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * configure.ac: - * ext/wayland/Makefile.am: - * ext/wayland/scaler.xml: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - wayland: Update from scaler to viewporter protocol - Signed-off-by: Scott D Phillips <scott.d.phillips@intel.com> - https://bugzilla.gnome.org/show_bug.cgi?id=767671 - -2016-09-15 14:58:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/libs/player.c: - player: Fix unit test for minor API change - -2016-09-15 13:15:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - player: Remove boolean return from set_subtitle_uri() - It can't fail synchronously and is inconsistent with set_uri(). - -2016-09-14 18:07:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Don't change state to PLAYING immediately if a seek is pending - We first have to finish the seek (in PAUSED) and move to PLAYING once - the seek is actually finished (unless a new one is pending then). - -2016-09-14 11:30:48 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - configure: Depend on gstreamer 1.9.2.1 - -2016-09-08 11:57:52 +0900 Hyunjun Ko <zzoon@igalia.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: map with READWRITE for overlay blend - Just as in basetextoverlay 1, the frame to blend with the subtitles overlay - should be mapped with flags GST_MAP_READWRITE, because - gst_video_overlay_composition_blend() does both operations. - 1. https://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/?id=1396f804 - Signed-off-by: Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - https://bugzilla.gnome.org/show_bug.cgi?id=771382 - -2016-09-13 20:08:19 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * configure.ac: - kmssink: update libdrm dependency to 2.4.55 - The latest libdrm feature supported by kmssink is the universal plane, which - was added in 2.4.55. Let's update the dependency to that version. - https://bugzilla.gnome.org/show_bug.cgi?id=770146 - -2016-09-11 00:06:52 +0000 Graham Leggett <minfrin@sharp.fm> - - * gst/mpegtsdemux/mpegtsbase.c: - tsdemux: handle a NULL name in DVB short event descriptor - Resolves the warning: - GStreamer-WARNING **: Trying to set NULL string on field 'title' on taglist. - https://bugzilla.gnome.org/show_bug.cgi?id=771198 - -2016-09-12 18:38:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Also never have the SINK flag set on adaptivedemux - -2016-09-12 12:19:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - Revert "decklinkvideosink: Scale down scheduled frame times to milliseconds" - This reverts commit 3b7e0d7de32f0728259d601daa13b9eeec3dd3ce. - It was a bug in the driver and is supposed to be fixed with 10.8 and newer. - -2016-09-10 16:41:28 -0300 Thiago Santos <thiagossantos@gmail.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix typo in new API - Fixes supressed -> suppressed typo in previous commit - https://bugzilla.gnome.org/show_bug.cgi?id=770627 - -2016-09-05 10:31:40 +0900 Wonchul Lee <wonchul.lee@collabora.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: prevent to propagate source flag to itself - https://bugzilla.gnome.org/show_bug.cgi?id=770627 - -2016-09-10 20:51:27 +1000 Jan Schmidt <jan@centricular.com> - - * autogen.sh: - * common: - Automatic update of common submodule - From b18d820 to f980fd9 - -2016-09-10 09:54:09 +1000 Jan Schmidt <jan@centricular.com> - - * autogen.sh: - * common: - Automatic update of common submodule - From 2c31690 to b18d820 - -2016-09-09 23:24:01 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/meson.build: - meson/gl: use separate deps for gl and glx - e.g. passing with_gl_api=gles2 would still build the glx code but not be - linking against the libGL library which is where the glX* functions are - located and would result in a linker error. - Solved by checking for the libGL library if either opengl or glx may be - needed and then disabling the corresponding deps as requested. - -2016-09-09 16:55:23 +1000 Matthew Waters <matthew@centricular.com> - - * ext/meson.build: - * ext/vulkan/meson.build: - * ext/vulkan/vkconfig.h.meson: - meson: add build files for vulkan - -2016-09-09 16:36:03 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gtk/meson.build: - * ext/meson.build: - meson: add build files for the gtk plugin - -2016-09-09 11:08:53 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/meson.build: - * ext/meson.build: - * gst-libs/gst/gl/gstglconfig.h.meson: - * gst-libs/gst/gl/meson.build: - * gst-libs/gst/meson.build: - * meson_options.txt: - * pkgconfig/meson.build: - meson: add some starting build files for GL - Currently only works on linux with egl/glx + wayland/x11 but the general - principals have been layed out for adding the other GL platforms/winsys'. - -2016-09-08 11:23:57 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Scale up to the screen dimension - In most display sink, the logic is to use as much as possible - of the given window. In this case, the window is the screen, - hence it's logical to scale up. - https://bugzilla.gnome.org/show_bug.cgi?id=767422 - -2016-09-08 11:21:09 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmssink.c: - kmssink: Fix selection of source region - The source region was scaled for display before being passed - to drmModeSetPlane, which resulted in a portion of the video - being cropped. While when crop meta was present, the rectangle - was not centered since we where using unscaled width/height. - https://bugzilla.gnome.org/show_bug.cgi?id=767422 - -2016-09-08 08:40:59 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/player/gstplayer.h: - gstplayer: remove leftover update_interval api - old: gst_player_set_position_update_interval - new: gst_player_config_set_position_update_interval - https://bugzilla.gnome.org/show_bug.cgi?id=769144 - -2016-09-01 19:46:31 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkupload.c: - vkupload: add video/x-raw to the VulkanBuffer uploader - Allows upstream elements that use our memory to passthrough without copying. - -2016-09-01 19:43:59 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkutils.c: - vkutils: set the last element of the layer array to NULL - g_strv* functions require this to not read off the end of the array. - -2016-09-07 20:11:55 +0100 Alistair Buxton <a.j.buxton@gmail.com> - - * tests/examples/gl/clutter/Makefile.am: - gl/examples: Really remove references to $(GST_PLUGINS_GL_*). - These seem to have been missed in the previous commit to this file. - https://bugzilla.gnome.org/show_bug.cgi?id=771023 - -2016-09-07 20:07:26 +0100 Alistair Buxton <a.j.buxton@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - gl: Remove duplicate GL_CFLAGS in Makefile.am. - https://bugzilla.gnome.org/show_bug.cgi?id=771021 - -2016-08-05 18:17:32 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/kms/gstkmsallocator.c: - kmssink: override stride if defined in driver - Some kms drivers demands specific pitches over the ones calculated by - GstVideoInfo. For example, intel driver demands strides round up 64. - This patch queries the driver for the prefered pitch and overwrites it - in the pool's GstVideoInfo structure. - https://bugzilla.gnome.org/show_bug.cgi?id=768446 - -2016-09-06 16:05:53 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Use the event_full function for GstAggregatorPads - Allowing us to tell GstPad why we are failing an event, which might - be because we are 'flushing' even if the sinkpad is not in flush state - at that point. - -2016-09-06 13:13:39 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/qt/gstqsgtexture.cc: - qmlglsink: check qt_context_ first in GstQSGTexture::bind() - When start qmlglsink app, it will set NULL buffer to GstQSGTexture - in which case that qt_context_ will be a random value and cause - gst_gl_context_activate() fail. - https://bugzilla.gnome.org/show_bug.cgi?id=770925 - -2016-09-06 20:00:07 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - build/vulkan: fix winsys detection based on the previously set variables - The X11/Wayland winsys checks weren't being used to enable the vulkan element. - Use them. - -2016-09-06 11:02:06 +0200 Philippe Normand <philn@igalia.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: prevent deadlock in create_session - Temporarily release the object lock which is needed to post error - messages on the bus. - https://bugzilla.gnome.org/show_bug.cgi?id=770933 - -2016-09-05 22:30:01 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * meson.build: - meson: Fix building with meson 0.34 when using subprojects - When using subproject meson.source_root() returns the root - directory of the toplevel project which break build. - Upstream meson bug: https://github.com/mesonbuild/meson/issues/722 - -2016-09-05 12:22:17 -0300 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * meson.build: - meson: Bump version to 1.9.2 - -2016-09-05 14:44:24 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * ext/gl/gstgluploadelement.c: - glupload: create the GstGLUpload object in ::transform_caps - Previously it was created in the init function and destroyed in ::stop, which - lead to segfaults when reusing the element. - Now the upload object is created in ::transform_caps if it is NULL, which is the - earliest we need it. The other vfuncs already bail out if the upload object is - NULL, which means that negotiation wasn't done. - -2016-08-29 11:40:54 +0900 Wonchul Lee <wonchul.lee@collabora.com> - - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Support ATSC EAC3 - EAC3 bit streams shall be identified with a stream_type value of 0x87 when - transmitted as PES streams conforming to ATSC-published standards. It is specified - in ATSC Standard A/52. - https://bugzilla.gnome.org/show_bug.cgi?id=770528 - -2016-09-01 14:25:58 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Fix-up last commit that was not meant to be pushed yet - -2016-09-01 14:18:33 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - decklink: Fix indentation - -2016-09-01 14:17:48 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Require a clock when going from PAUSED_TO_PLAYING and don't crash if there is none - Also when going from PLAYING_TO_PAUSED, the clock might've been unset in the - meantime, e.g. because the element was removed from its surrounding bin. - -2016-09-01 12:28:22 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -=== release 1.9.2 === - -2016-09-01 12:27:59 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstgtk.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-opengl.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qt.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtcdsp.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.9.2 - -2016-09-01 11:24:37 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - po: Update translations - -2016-08-30 16:21:25 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * sys/applemedia/Makefile.am: - * sys/applemedia/plugin.m: - applemedia: Conditionally compile qtkitvideosrc - The API was deprecated in 10.9 and apparently does not exist in the SDK for - macOS Sierra anymore. - https://bugzilla.gnome.org/show_bug.cgi?id=770587 - -2016-08-31 04:26:43 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglframebuffer.h: - gl: Remove extra duplicate typedef of GstGLFramebuffer - It's triggering a warning building git master on OSX - -2016-08-29 16:57:42 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglupload.c: - tests/glupload: support opengl3 properly instead of spewing GL errors - -2016-08-29 16:52:44 +1000 Matthew Waters <matthew@centricular.com> - - * pkgconfig/gstreamer-gl.pc.in: - gl/pkgconfig: add the lib include dir to the list of includes - 714d8aa in core removed this include dir from it's pkgconfig file. - https://bugzilla.gnome.org/show_bug.cgi?id=770523 - -2016-08-29 15:43:10 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - * tests/check/libs/gstglupload.c: - glupload: fix tests and check for the new RECONFIGURE behaviour - The tests were broken since 91fea30, which changed glupload to return - GST_GL_UPLOAD_RECONFIGURE if the texture target in the input buffers doesn't - match the texture-target configured in the output caps. - This commit fixes that and adds more checks for the new behaviour. - -2016-08-19 11:12:10 -0700 Thibault Saunier <thibault.saunier@osg.samsung.com> - - * ext/gme/gstgme.c: - * ext/sndfile/gstsfsink.c: - * ext/teletextdec/gstteletextdec.c: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst/aiff/aiffparse.c: - * gst/midi/midiparse.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mxf/mxfdemux.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/tta/gstttaparse.c: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - * sys/applemedia/avfassetsrc.m: - Use the new API to post flow ERROR messages on the bus - https://bugzilla.gnome.org/show_bug.cgi?id=770158 - -2016-08-26 20:12:21 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/dash_mpd.c: - dash: Fix build of unit test - -2016-08-25 20:50:11 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: Add properties to select maximum allowed width/height and framerate - https://bugzilla.gnome.org/show_bug.cgi?id=770408 - -2016-08-26 16:04:27 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - decklinkaudiosink: Fix compiler warning on OS X - While gint64 and int64_t are always the same, clang does not agree with that. - /Applications/Xcode.app/Contents/Developer/usr/bin/make -C decklink - CXX libgstdecklink_la-gstdecklinkaudiosink.lo - gstdecklinkaudiosink.cpp:675:79: error: cannot initialize a parameter of type 'int64_t *' (aka 'long long *') with an rvalue of type 'gint64 *' (aka 'long *') - ret = buf->output->attributes->GetInt (BMDDeckLinkMaximumAudioChannels, &max_channels); - ^~~~~~~~~~~~~ - ./linux/DeckLinkAPI.h:692:87: note: passing argument to parameter 'value' here - virtual HRESULT GetInt (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ int64_t *value) = 0; - ^ - -2016-08-26 22:51:48 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/corevideomemory.c: - applemedia: fix compiler warning - -2016-08-26 15:48:36 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Scale down scheduled frame times to milliseconds - Scale down to milliseconds, otherwise at least some hardware has problems - scheduling the frames (or schedules them too slow) and we run out of available - frames. - https://bugzilla.gnome.org/show_bug.cgi?id=770282 - -2016-08-26 14:08:11 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosink.cpp: - decklinkaudiosink: Add support for 8 and 16 channels - -2016-08-26 17:37:54 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/avfassetsrc.m: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/coremediabuffer.h: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/corevideobuffer.h: - * sys/applemedia/corevideomemory.c: - * sys/applemedia/corevideomemory.h: - * sys/applemedia/iosglmemory.c: - * sys/applemedia/iosglmemory.h: - * sys/applemedia/iosurfacememory.c: - * sys/applemedia/plugin.m: - * sys/applemedia/qtkitvideosrc.m: - * sys/applemedia/videotexturecache.h: - * sys/applemedia/videotexturecache.m: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - applemedia: changes to make GL memory mappable on CPU on iOS - This commit introduces IOSGLMemory which is a GLMemory that falls back to - GstAppleCoreVideoMemory for CPU access. This is a temporary solution until - IOSurface gets exposed as a public framework on iOS and so we can use - IOSurfaceMemory on both MacOS and iOS. - https://bugzilla.gnome.org/show_bug.cgi?id=769210 - -2016-08-22 17:18:27 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * ext/gl/gstgluploadelement.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - gstglupload: make the GLMemoryUpload method output the correct texture-target - Now when used with video/x-raw as input, the GLMemoryUpload method checks for - ->tex_target in input GLMemory(es) and sets the output texture-target - accordingly. - Fixes video corruption with a pipeline like avfvideosrc ! video/x-raw ! - glimagesink where on macos avfvideosrc pushes RECTANGLE textures but glupload - was configuring texture-target=2D as output. - -2016-08-24 09:41:08 -0300 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/mpegts/mpegts_enum.py: - * gst/mpegtsdemux/meson.build: - * meson.build: - meson: Make mpegts lib build when using subprojects - The headers passed as parametter are relative to the build dir - basically "../subproject/gst-plugins-bad/gst-libs/gst/mpegts/XXX.h" - but that does not match what is needed at build time when building as - subproject, also we always add current dir as include_dir so we are - safe including directly. - And link mpegtsdemux against the 'math' library as it is needed. - -2016-08-26 03:46:39 +1000 Jan Schmidt <jan@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - docs: Expose the opengl plugin and element docs - -2016-08-26 02:20:11 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Handle if update_caps() returns EMPTY - Don't assume the returned caps from update_caps() is - non-empty. - -2016-08-26 02:07:27 +1000 Jan Schmidt <jan@centricular.com> - - * ext/gl/gstglvideomixer.c: - gl: Update glvideomixer doc - -2016-08-26 02:06:00 +1000 Jan Schmidt <jan@centricular.com> - - * ext/gl/gstglstereomix.c: - * ext/gl/gstglviewconvert.c: - gl: Add/update docs for glviewconvert, glstereomix - Add some example pipelines for glstereomix, and fix up - the example pipelines for glviewconvert - -2016-08-26 00:29:34 +1000 Jan Schmidt <jan@centricular.com> - - * ext/gl/gstglstereomix.c: - * ext/gl/gstglstereomix.h: - glstereomix: Fix caps negotiation - The videoaggregator negotiation sequence changed some time - back and broke glstereomix. Instead of doing nego incorrectly - in the find_best_format() vfunc, do it directly in the - update_caps() method. - -2016-08-25 15:26:49 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglviewconvert.c: - glviewconvert: Fix texture target fixation - Don't set the chosen texture-target into the wrong structure. - The input caps may not be writable, and in any case - the - intention was to configure the othercaps. Also, remove an - extra unref - the othercaps ref is consumed by - gst_caps_make_writable already. - -2016-08-25 19:35:13 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/hls/gsthlsdemux.c: - * ext/smoothstreaming/gstmssdemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Enable bitrate selection for trick mode streaming again - And scale the bitrate with the absolute rate (if it's bigger than 1.0) to get - to the real bitrate due to faster playback. - This allowed in my tests to play a stream with 10x speed without buffering as - the lowest bitrate is chosen, instead of staying/selecting the highest bitrate - and then buffering all the time. - It was previously disabled for not very well specified reasons, which seem to - be not valid anymore nowadays. - -2016-08-25 16:33:17 +0200 Josep Torra <n770galaxy@gmail.com> - - * tests/check/elements/.gitignore: - gitignore: add missing dash_isoff file - -2016-08-25 12:45:33 +0200 Josep Torra <n770galaxy@gmail.com> - - * tests/check/Makefile.am: - build: fix gst-uninstalled build in osx - Fixes clang: error: argument unused during compilation: '-pthread' - when building the test programs. - -2016-08-25 14:35:59 +0200 Josep Torra <n770galaxy@gmail.com> - - * configure.ac: - * tests/check/Makefile.am: - build: unconditionally check for video, audio and pbutils modules - Check for modules in configure and use GST_*_LIBS vars to link with - the libraries instead of hardcoding them. - -2016-07-26 19:55:13 +0200 Xabier Rodriguez Calvar <calvaris@igalia.com> - - * ext/gl/gstglvideoflip.c: - * ext/gl/gstglvideoflip.h: - glvideoflip: implement GstVideoDirection interface - It implements now this interface with its video-direction - property. Values are changed to GstVideoOrientationMethod but they have - the same value than the originals. - https://bugzilla.gnome.org/show_bug.cgi?id=768687 - -2016-08-24 19:43:55 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/fdkaac/gstfdkaacenc.c: - fdkaacenc: Implement some automatic bitrate selection - Based on sample rate and channel count, see - http://wiki.hydrogenaud.io/index.php?title=Fraunhofer_FDK_AAC#Recommended_Sampling_Rate_and_Bitrate_Combinations - -2016-08-24 14:15:09 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: On redirects, remember the redirect URI separately and don't consider this an URI property change - The application does not know anything about the redirect, and changing its - URI internally will cause confusion. - Also don't reset the subtitle URI. - -2016-08-24 14:10:41 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Don't report spurious STOPPED state changes when doing transient changes there - -2016-08-24 13:01:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Ensure that rate is initialized to 1.0 - -2016-08-24 10:16:00 +0000 Fredrik Fornwall <fredrik@fornwall.net> - - * sys/opensles/Makefile.am: - opensles: Add opensles.h to noinst_HEADERS - https://bugzilla.gnome.org/show_bug.cgi?id=770326 - -2016-08-23 14:37:17 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: De-duplicate rate setting code and always use the property - -2016-08-23 14:33:11 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Protect setter/getter for the configuration with a mutex - -2016-08-23 14:32:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - player: Move subtitle URI setter next to the uri setter - It's confusing to have them a couple of hundred lines apart. - -2016-08-17 19:59:17 +0200 Matej Knopp <matej.knopp@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: fix MPEG-2 video caps - Add systemstream=false to caps, otherwise the decoder - may be picked for MPEG-PS files. Also parsed=true, - as video toolbox expects entire frame in - VTDecompressionSessionDecodeFrame. - https://bugzilla.gnome.org/show_bug.cgi?id=770049 - -2016-08-23 02:13:19 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c.rej: - * gst-libs/gst/adaptivedemux/set_state_keep.patch: - adaptivedemux: Fix the previous commit - Remove extra files that were not meant to be added to the commit - -2016-08-23 01:57:55 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c.rej: - * gst-libs/gst/adaptivedemux/set_state_keep.patch: - adaptivedemux: Fix broken updates loop on live streams - Prevent the manifest update loop from looping endlessly - after a seek event, by clearing the variable that tells - the task function not to immediately exit. - -2016-08-18 10:06:27 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix stream exposure condition - The new streams should not be exposed until all streams are done with the - current fragment. The old code is incorrect and actually only checked the - current stream. Fix this by properly checking all streams. - Also, ignore the current stream. The code is only reached when the current - stream finished downloading and since - 07f49f15b1196cc9fa0d45af91149a35fce123b9 ("adaptivedemux: On EOS, handle it - before waking download loop") download_finished is set after - gst_adaptive_demux_stream_advance_fragment_unlocked() is called. - Without this HLS playback with multiple streams is broken, because the new - streams are never exposed. - https://bugzilla.gnome.org/show_bug.cgi?id=770075 - -2016-08-21 16:21:07 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/mpg123/meson.build: - meson: remove unused mpg123 build file - mpg123 was moved to ugly. - -2016-08-12 21:21:45 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * .gitignore: - * config.h.meson: - * ext/assrender/meson.build: - * ext/bz2/meson.build: - * ext/chromaprint/meson.build: - * ext/curl/meson.build: - * ext/dash/meson.build: - * ext/directfb/meson.build: - * ext/dtls/meson.build: - * ext/dts/meson.build: - * ext/faac/meson.build: - * ext/faad/meson.build: - * ext/flite/meson.build: - * ext/fluidsynth/meson.build: - * ext/hls/meson.build: - * ext/kate/meson.build: - * ext/libde265/meson.build: - * ext/libmms/meson.build: - * ext/meson.build: - * ext/mpg123/meson.build: - * ext/openh264/meson.build: - * ext/openjpeg/meson.build: - * ext/opus/meson.build: - * ext/resindvd/meson.build: - * ext/rsvg/meson.build: - * ext/rtmp/meson.build: - * ext/sbc/meson.build: - * ext/schroedinger/meson.build: - * ext/smoothstreaming/meson.build: - * ext/soundtouch/meson.build: - * ext/spandsp/meson.build: - * ext/srtp/meson.build: - * ext/srtp/srtp_mkenum.py: - * ext/voaacenc/meson.build: - * ext/webp/meson.build: - * ext/x265/meson.build: - * ext/zbar/meson.build: - * gst-libs/gst/adaptivedemux/meson.build: - * gst-libs/gst/audio/meson.build: - * gst-libs/gst/base/meson.build: - * gst-libs/gst/basecamerabinsrc/meson.build: - * gst-libs/gst/codecparsers/meson.build: - * gst-libs/gst/gl/gstglconfig.h.meson: - * gst-libs/gst/gl/meson.build: - * gst-libs/gst/insertbin/meson.build: - * gst-libs/gst/interfaces/build_mkenum.py: - * gst-libs/gst/interfaces/meson.build: - * gst-libs/gst/meson.build: - * gst-libs/gst/mpegts/meson.build: - * gst-libs/gst/mpegts/mpegts_enum.py: - * gst-libs/gst/player/meson.build: - * gst-libs/gst/uridownloader/meson.build: - * gst-libs/gst/video/meson.build: - * gst-libs/meson.build: - * gst/accurip/meson.build: - * gst/adpcmdec/meson.build: - * gst/adpcmenc/meson.build: - * gst/aiff/meson.build: - * gst/asfmux/meson.build: - * gst/audiobuffer/meson.build: - * gst/audiofxbad/meson.build: - * gst/audiomixer/meson.build: - * gst/audiovisualizers/meson.build: - * gst/autoconvert/meson.build: - * gst/bayer/meson.build: - * gst/camerabin2/meson.build: - * gst/cdxaparse/meson.build: - * gst/coloreffects/meson.build: - * gst/compositor/meson.build: - * gst/dataurisrc/meson.build: - * gst/dccp/meson.build: - * gst/debugutils/meson.build: - * gst/dvbsuboverlay/meson.build: - * gst/dvdspu/meson.build: - * gst/faceoverlay/meson.build: - * gst/festival/meson.build: - * gst/fieldanalysis/meson.build: - * gst/freeverb/meson.build: - * gst/frei0r/meson.build: - * gst/games/meson.build: - * gst/gaudieffects/meson.build: - * gst/gdp/meson.build: - * gst/geometrictransform/meson.build: - * gst/hdvparse/meson.build: - * gst/id3tag/meson.build: - * gst/inter/meson.build: - * gst/interlace/meson.build: - * gst/ivfparse/meson.build: - * gst/ivtc/meson.build: - * gst/jp2kdecimator/meson.build: - * gst/jpegformat/meson.build: - * gst/librfb/meson.build: - * gst/meson.build: - * gst/midi/meson.build: - * gst/mixmatrix/meson.build: - * gst/mpeg1sys/meson.build: - * gst/mpegdemux/meson.build: - * gst/mpegpsmux/meson.build: - * gst/mpegtsdemux/meson.build: - * gst/mpegtsmux/meson.build: - * gst/mve/meson.build: - * gst/mxf/meson.build: - * gst/nuvdemux/meson.build: - * gst/onvif/meson.build: - * gst/overlay/meson.build: - * gst/patchdetect/meson.build: - * gst/pcapparse/meson.build: - * gst/pnm/meson.build: - * gst/rawparse/meson.build: - * gst/real/meson.build: - * gst/removesilence/meson.build: - * gst/rtjpeg/meson.build: - * gst/sdi/meson.build: - * gst/sdp/meson.build: - * gst/segmentclip/meson.build: - * gst/siren/meson.build: - * gst/smooth/meson.build: - * gst/speed/meson.build: - * gst/stereo/meson.build: - * gst/subenc/meson.build: - * gst/tta/meson.build: - * gst/vbidec/meson.build: - * gst/videofilters/meson.build: - * gst/videoframe_audiolevel/meson.build: - * gst/videomeasure/meson.build: - * gst/videoparsers/meson.build: - * gst/videosignal/meson.build: - * gst/vmnc/meson.build: - * gst/y4m/meson.build: - * gst/yadif/meson.build: - * meson.build: - * meson_options.txt: - * pkgconfig/meson.build: - * sys/bluez/meson.build: - * sys/d3dvideosink/meson.build: - * sys/directsound/meson.build: - * sys/dvb/meson.build: - * sys/meson.build: - * sys/wasapi/meson.build: - * sys/winks/meson.build: - * sys/winscreencap/meson.build: - Add support for Meson as alternative/parallel build system - https://github.com/mesonbuild/meson - With contributions from: - Tim-Philipp Müller <tim@centricular.com> - Matej Knopp <matej.knopp@gmail.com> - Jussi Pakkanen <jpakkane@gmail.com> (original port) - Highlights of the features provided are: - * Faster builds on Linux (~40-50% faster) - * The ability to build with MSVC on Windows - * Generate Visual Studio project files - * Generate XCode project files - * Much faster builds on Windows (on-par with Linux) - * Seriously fast configure and building on embedded - ... and many more. For more details see: - http://blog.nirbheek.in/2016/05/gstreamer-and-meson-new-hope.html - http://blog.nirbheek.in/2016/07/building-and-developing-gstreamer-using.html - Building with Meson should work on both Linux and Windows, but may - need a few more tweaks on other operating systems. - -2016-08-18 17:46:19 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/dts/gstdtsdec.c: - * ext/resindvd/resindvdsrc.h: - * gst/bayer/gstbayer2rgb.c: - * gst/dccp/gstdccp_common.h: - * gst/librfb/d3des.c: - * sys/fbdev/gstfbdevsink.c: - plugins: Use stdint.h instead of _stdint.h - _stdint.h is generated by Autotools and we don't really need it. All - supported platforms now ship with stdint.h. The only stickler was MSVC, - and since Visual Studio 2015 it also ships stdint.h now. - -2016-08-12 21:51:17 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * win32/common/libgstgl.def: - win32: Update libgstgl.def - -2016-03-02 00:53:44 +0530 Nirbheek Chauhan <nirbheek.chauhan@gmail.com> - - * gst-libs/gst/codecparsers/nalutils.c: - codecparsers: Explicitly export functions marked inline - On MSVC, inline functions are not available outside of a file unless - explicitly exported - -2016-08-19 12:24:58 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/rawparse/gstrawvideoparse.c: - rawvideoparse: fix typo in comment - Small typo in the comment explaining the code fixed by the previous commit. - Fixing it. - -2016-08-19 14:19:38 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/rawparse/gstrawvideoparse.c: - rawvideoparse: Revert last commit and actually remember the physically last plane - Instead of just always taking the last one as before. - -2016-08-19 11:57:33 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/rawparse/gstrawvideoparse.c: - rawvideoparse: remove unused assignment - Value in last_plane will be overwritten before used, remove unused - asignment. - Fixes commit 91cf5ac69f9c99fe41d60f42b4174915dd135e7b - CID 1371462 - -2016-08-18 18:55:41 +0200 Philippe Renon <philippe_renon@yahoo.fr> - - * ext/daala/gstdaaladec.c: - daala: fix typo related compilation error - https://bugzilla.gnome.org/show_bug.cgi?id=770102 - -2016-08-19 11:02:46 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * sys/Makefile.am: - * sys/applemedia-nonpublic/Makefile.am: - * sys/applemedia-nonpublic/bufferfactory.h: - * sys/applemedia-nonpublic/bufferfactory.m: - * sys/applemedia-nonpublic/celapi.c: - * sys/applemedia-nonpublic/celapi.h: - * sys/applemedia-nonpublic/celvideosrc.c: - * sys/applemedia-nonpublic/celvideosrc.h: - * sys/applemedia-nonpublic/cmapi.c: - * sys/applemedia-nonpublic/cmapi.h: - * sys/applemedia-nonpublic/coremediabuffer.c: - * sys/applemedia-nonpublic/coremediabuffer.h: - * sys/applemedia-nonpublic/coremediactx.c: - * sys/applemedia-nonpublic/coremediactx.h: - * sys/applemedia-nonpublic/corevideobuffer.c: - * sys/applemedia-nonpublic/corevideobuffer.h: - * sys/applemedia-nonpublic/cvapi.c: - * sys/applemedia-nonpublic/cvapi.h: - * sys/applemedia-nonpublic/dynapi-internal.h: - * sys/applemedia-nonpublic/dynapi.c: - * sys/applemedia-nonpublic/dynapi.h: - * sys/applemedia-nonpublic/mioapi.c: - * sys/applemedia-nonpublic/mioapi.h: - * sys/applemedia-nonpublic/miovideodevice.c: - * sys/applemedia-nonpublic/miovideodevice.h: - * sys/applemedia-nonpublic/miovideosrc.c: - * sys/applemedia-nonpublic/miovideosrc.h: - * sys/applemedia-nonpublic/mtapi.c: - * sys/applemedia-nonpublic/mtapi.h: - * sys/applemedia-nonpublic/plugin.m: - applemedia-nonpublic: remove bitrotten plugin that's no longer needed - -2016-08-19 19:46:24 +1000 Florian Zwoch <fzwoch@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: account for retina displays when capturing screens - Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=770030 - -2016-08-19 17:11:13 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - build: bump graphene requirement to 1.4 - -2016-08-19 15:35:49 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltransformation.c: - * ext/gl/gstgltransformation.h: - gltransformation: rewrite the inverse transformation logic - It now returns the correct values for both orthographic and perspective - projections and takes into account the aspect ratio of the video, handles - the Y-flipping in GL and by us and uses some more helpers from graphene. - -2016-07-01 16:18:55 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: marshal gst_gl_window_resize through the window loop - saves having every caller do it themselves. - -2016-06-30 23:06:43 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/wayland/wayland_event_source.c: - gl/wayland: use multi-threaded safe event wayland API - Multiple threads may be accessing the wayland fd at the same time which - requires the use of special wayland API to deal with to ensure nobody - will steal reads and cause a stall for anyone else. - -2016-07-01 00:15:55 +1000 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/gtk/fxtest/fxtest.c: - gl/examples/fxtest: fix up for wayland support - - Pass the wayland display to gst - - Redrawing on resize is no longer needed. - -2016-08-17 16:21:34 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: warn on ignored key/value pairs - Otherwise at runtine, users get the misleading - parsing-OK message with no info on, for example, - properties that failed to map because of a typo. - -2016-08-16 15:35:39 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: handle problems parsing dvbv5 config keys - -2016-08-18 15:28:33 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/mplex/gstmplex.cc: - mplex: Don't start task (yet/again) on pad release if we're in READY or NULL - Fixes spurious segfault in unit test, where the task was started again during - shutdown when all pads were removed... and was then still running while the - element was finalized. - -2016-08-18 13:21:54 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: In KEY_UNITS trick mode, download all I-frames and not only IDR - -2016-08-08 17:54:46 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * tests/check/elements/.gitignore: - * tests/check/elements/rawaudioparse.c: - * tests/check/elements/rawvideoparse.c: - rawparse: Fix and extend unit tests - * Add caps change test to unit tests - * Cleanup leftover buffers after each unit test - * Add missing rawvideoparse entry in .gitignore - https://bugzilla.gnome.org/show_bug.cgi?id=769637 - -2016-08-16 09:31:40 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * gst/rawparse/gstrawvideoparse.c: - * gst/rawparse/gstrawvideoparse.h: - * tests/check/elements/rawvideoparse.c: - rawvideoparse: Compute plane offsets & strides if no custom ones are set - This is useful to ensure that the offsets and strides are computed if - only width, height, format etc. in the property config are set. - https://bugzilla.gnome.org/show_bug.cgi?id=769797 - -2016-08-16 18:46:49 +0300 Sergei Saveliev <saveliev.sergei@gmail.com> - - * sys/applemedia/avfassetsrc.m: - avfassetsrc: Don't escape the URI another time in another location too - One location was forgotten in a913a0b9679dd58945ad105d240db45595fdaba6 - https://bugzilla.gnome.org/show_bug.cgi?id=767492 - -2016-08-16 20:33:21 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gstegl.h: - gl/egl: fix inverted typedef - 2b6841d had an inverted typedef defining ginptr and EGLAttrib. Fix that. - -2016-08-16 10:37:28 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/timidity/gstwildmidi.c: - wildmidi: Fix compilation with wildmidi 0.4 - Old versions used char* for the data, new versions use int8_t*. They're often - not the same and differ in signedness. - -2016-08-16 16:51:02 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/egl/gstegl.h: - gl/build: add configure check for possibly missing EGLAttrib - Fixes the build on older android targets. - -2016-07-13 17:15:44 +0800 Song Bing <bing.song@nxp.com> - - * gst-libs/gst/gl/egl/gsteglimage.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - gl/egl/dmabuf: Wrong attribute list type for EGL 1.5 - For EGL 1.5 spec, the attribute list type should be EGLAttrib. - https://bugzilla.gnome.org/show_bug.cgi?id=768602 - -2016-08-15 16:14:25 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: fix race joining thread on finalize - https://bugzilla.gnome.org/show_bug.cgi?id=769939 - -2016-08-16 00:40:53 +1000 Jan Schmidt <jan@centricular.com> - - * ext/qt/gstqtglutility.cc: - qt: Use wglShareLists() workaround unconditionally. - Sometimes wglCreateContextAttribsARB() exists, but - isn't functional (some Intel drivers), so it's - easiest to do the workaround unconditionally. - -2016-08-15 16:37:44 +1000 Jan Schmidt <jan@centricular.com> - - * sys/winks/gstksvideodevice.c: - * sys/winks/gstksvideodevice.h: - * sys/winks/gstksvideosrc.c: - * sys/winks/ksvideohelpers.c: - * sys/winks/ksvideohelpers.h: - winks: Fix RGB frame flipping and postprocessing - Uncompressed RGB frames can be (usually are) bottom-up - layout in DirectShow, and the code to flip them wasn't - properly ported from 0.10. Fix it. - Fix post-processing of RGB buffers. We need a writable - buffer, but the requests pool is holding an extra ref. - This could use more fixing to use a buffer pool - -2016-08-12 22:17:25 +1000 Jan Schmidt <jan@centricular.com> - - * sys/winks/gstksvideosrc.c: - winks: Give the ksvideosrc PRIMARY rank - It's the primary video source on Windows, so give it a - rank for autoplugging by camerabin and friends - -2016-08-12 22:16:33 +1000 Jan Schmidt <jan@centricular.com> - - * sys/winks/ksvideohelpers.c: - winks: Fix swapped RGBx/RGB caps mapping, and endianness. - The RGBx and RGB format mappings were reversed. - What Windows calls RGB are laid out as BGR in our parlance, so - switch that too - -2016-08-08 13:41:14 +1000 Jan Schmidt <jan@centricular.com> - - * ext/qt/gstqtglutility.cc: - qt: Move debug statement to after the category init - Don't output debug to an uninitialised debug category. - -2016-08-11 12:19:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/Makefile.am: - dashdemux: Disable unit test for the time being - It uses random data streams but dashdemux nowadays actually looks into the - streams and doesn't like randomness very much. The tests should probably just - become validate tests on real streams. - https://bugzilla.gnome.org/show_bug.cgi?id=769553 - -2016-08-11 12:11:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - Revert "Revert "dashdemux: When doing SIDX seeking, return instead of overriding the timestamp with 0 from the MPD seeking method"" - This reverts commit aea2c13fc1672a7260679d706d0a084a34ba7531. - -2016-08-04 14:47:41 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: When doing chunked downloading on SIDX, clip requests on the SIDX entry boundaries - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-08-02 08:47:55 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Collect average moof and first sync sample sizes - And always request those in the beginning so that ideally we get the moof and - the first sync sample all together with the first HTTP request. - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-08-02 08:35:26 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Download any sync-sample following the moof directly in key-units only mode - We don't have to do yet another additional request but can just download the - data directly. - Also unify the key-unit only mode buffer pushing and extract it into its own - function now that it became more complicated. - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-07-29 12:50:58 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: If a fragment contains no sync samples, disable key-unit mode - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-07-29 12:32:50 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Remember if for a stream we could do key-units only mode - This makes sure we don't even try going into that mode if we previously saw - that the stream does not have the suitable metadata. - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-07-29 11:54:21 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Also allow key-unit only mode if (some) sample flags are given by trex but we can still find sync frames - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-07-12 20:09:52 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Use chunked downloading for the moof in KEY_UNITS mode - Allows us to reuse the HTTP connection and reduce latencies a lot. - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-07-12 10:22:43 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Add API for allowing subclasses to download URLs in chunks - This allows to gradually download part of a fragment when the final size is - not known and only a part of it should be downloaded. For example when only - the moof should be parsed and/or a single keyframe should be downloaded. - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-06-01 14:02:11 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Mark every first buffer of moov, sidx, moof and mdat as DISCONT in keyframe-only mode - We need to mark every first buffer of a key unit as discont, and also every - first buffer of a moov and moof. This ensures that qtdemux takes note of our - buffer offsets for each of those buffers instead of keeping track of them - itself from the first buffer. We need offsets to be consistent between moof - and mdat - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-07-28 10:53:49 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Only enable key-unit trick mode for video streams - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-05-31 15:12:49 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Only do keyframe-only playback if the corresponding seek flag is given - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-05-30 12:09:34 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Implement downloading of only sync samples - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-05-30 11:15:03 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Store parsed moof and extract offsets of sync samples in it - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-05-02 17:11:31 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/dash_isoff.c: - * tests/check/elements/dash_isoff.h: - dash: Add test for parsing a moof box - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-05-02 16:03:56 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/dash_isoff.c: - dash: Add unit test for ISOBFF box header parsing - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-04-07 21:33:51 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstisoff.c: - * ext/dash/gstisoff.h: - dashdemux: Implement parsing of moof box - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-04-07 13:34:57 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstisoff.c: - dashdemux: Move code around to keep all sidx related functions together - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-04-07 12:57:13 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstisoff.c: - * ext/dash/gstisoff.h: - dashdemux: Store box fourccs in the header at a central place - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-03-28 13:45:36 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Implement parsing of ISOBMFF boxes - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-03-16 13:48:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstisoff.c: - * ext/dash/gstisoff.h: - dash: Add helper for parsing box headers - https://bugzilla.gnome.org/show_bug.cgi?id=741104 - -2016-08-10 22:50:12 +0000 xlazom00 <xlazom00@gmail.com> - - * ext/x265/gstx265enc.c: - x265enc: Enable aspect ratio - x265 encoder need aspectRatioIdc == X265_EXTENDED_SAR if we want to use - sarWidth/sarHeight - https://bugzilla.gnome.org/show_bug.cgi?id=769716 - -2016-08-08 13:10:12 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/openjpeg/gstopenjpegenc.c: - openjpegenc: use the corrent enumeration - Fixes the following error when building in osx. - error: implicit conversion from enumeration type - 'GstJPEG2000Colorspace' to different enumeration type - 'GstJPEG2000Sampling' - -2016-08-08 11:28:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - amc: Fix call to realloc() to allocate the correct size of items - -2016-08-07 20:53:30 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/Makefile.am: - fdkaac: actually build and dist - -2016-08-06 23:31:23 +0000 xlazom00 <xlazom00@gmail.com> - - * ext/hls/Makefile.am: - * gst/timecode/Makefile.am: - hls, timecode: fix linking - https://bugzilla.gnome.org//show_bug.cgi?id=769587 - -2016-08-07 12:20:16 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/fdkaac/Makefile.am: - * ext/fdkaac/gstfdkaacdec.c: - * ext/fdkaac/gstfdkaacdec.h: - * ext/fdkaac/plugin.c: - fdkaac: Add FDK AAC based decoder element - Missing is support for error concealment, etc. - -2016-08-07 11:39:07 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/fdkaac/Makefile.am: - * ext/fdkaac/gstfdkaacenc.c: - * ext/fdkaac/gstfdkaacenc.h: - * ext/fdkaac/plugin.c: - fdkaac: Add FDK AAC based encoder element - This currently only handles LC profile and exposes a bitrate property, but - handles up to 7.1 channels. See TODO list for missing features. - -2016-08-07 08:51:06 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * ext/fdkaac/Makefile.am: - * ext/fdkaac/plugin.c: - fdkaac: Initial plugin skeleton - -2016-08-01 11:45:30 +0200 Bernhard Miller <bernhard.miller@streamunlimited.com> - - * gst/aiff/aiffparse.c: - aiffparse: keep end_offset when seeking - After seeking in aiff files the information about the data end offset is - discarded, leading to audio artifacts with metadata chunks at the end of - a file. - This patch retains the end offset information after a seek event. - https://bugzilla.gnome.org//show_bug.cgi?id=769376 - -2016-08-06 16:15:33 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: don't crash if video frame could not be mapped - As might happen with e.g. vaapi and the test file from - https://bugzilla.gnome.org/show_bug.cgi?id=736227 - -2016-08-05 09:16:58 +0200 Edward Hervey <bilboed@bilboed.com> - - * ext/dash/gstdashdemux.c: - Revert "dashdemux: When doing SIDX seeking, return instead of overriding the timestamp with 0 from the MPD seeking method" - This reverts commit 947656cfd22b75f914d5abe0af82396787f67564. - This makes all dash seeking tests fail. Needs more testing to fully understand - what's going wrong. Revert ok'd by Sebastian - -2016-05-31 19:21:17 +0300 Vivia Nikolaidou <vivia@toolsonair.com> - - * gst/timecode/Makefile.am: - * gst/timecode/gsttimecodewait.c: - * gst/timecode/gsttimecodewait.h: - * gst/timecode/plugin.c: - timecodewait: New element to wait for a specific timecode - timecodewait receives a timecode as an argument (either as string or as - GstVideoTimeCode - one is gst-launch-friendly and the other is code-friendly), - and it will drop all audio and video buffers until that timecode has been - reached. - https://bugzilla.gnome.org/show_bug.cgi?id=766419 - -2016-05-20 18:17:52 +0300 Vivia Nikolaidou <vivia@toolsonair.com> - - * configure.ac: - * gst/timecode/Makefile.am: - * gst/timecode/gsttimecodestamper.c: - * gst/timecode/gsttimecodestamper.h: - * gst/timecode/plugin.c: - timecodestamper: New element to attach SMPTE timecode to buffers - The timecodestamper element attaches a SMPTE timecode to each video buffer. - This timecode corresponds to the current stream time. - https://bugzilla.gnome.org/show_bug.cgi?id=766419 - -2016-05-15 17:25:44 +0300 Vivia Nikolaidou <vivia@toolsonair.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklinkvideosink: Add support for GstVideoTimeCode - The timecode will be fetched from the video buffer and outputted on the - decklink video sink. - https://bugzilla.gnome.org/show_bug.cgi?id=766419 - -2016-05-15 16:04:14 +0300 Vivia Nikolaidou <vivia@toolsonair.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklinkvideosrc: Add support for GstVideoTimeCode - The timecode will be fetched from the decklink source and attached to the - video buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=766419 - -2016-08-04 23:14:41 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: add missing rgb16 and bgr16 video formats in switch - Fixes an assertion that code should not be reached - https://bugzilla.gnome.org/show_bug.cgi?id=769462 - -2016-08-04 22:28:13 +1000 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux.c: - hls: Avoid potential NULL pointer dereference. - Fixes CID 1364753 - -2016-08-04 22:21:16 +1000 Jan Schmidt <jan@centricular.com> - - * ext/hls/m3u8.c: - hls: Avoid coverity warning about access off the end of an array. - Fixes CID 1364755 - -2016-08-04 14:42:34 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: When doing SIDX seeking, return instead of overriding the timestamp with 0 from the MPD seeking method - We don't need to call the latter at all as we're definitely in this period and - the segment is selected via the SIDX. - This is especially important when doing SNAP seeks, as otherwise we would - always start from the beginning of the period (usually 0) again. - -2016-08-04 11:08:30 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/hls/m3u8.c: - hls: m3u8: remove impossible condition - After the check in line 1,111, media->uri can't be NULL. So the two checks - for GST_HLS_MEDIA_TYPE_CLOSED_CAPTIONS are the same, removing the redundant - one which goes to cc_unsupported. - CID 1364752 - -2016-08-04 04:53:50 +1000 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Don't output pending data after error - If the last_ret status is not OK, skip output - of any pending PCR scan buffer, similarly to how - the pending decryption buffer is handled above. - -2016-08-04 04:29:38 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: On EOS, handle it before waking download loop - Otherwise, if the download loop wakes too quickly, it - might miss the last_ret value update from the processing - thread and loop again. - -2016-08-04 01:51:37 +1000 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux-util.c: - hlsdemux: Include config.h and add header in utils - In gsthlsdemux-util.c, include config.h before any - other headers, and add a copyright / license header. - -2016-07-13 11:02:23 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Fix draining on wrong programs - When draining a program, we might send a newsegment event on the pads - that are going to be removed (and then the pending data). - In order to do that, calculate_and_push_newsegment() needs to know - what list of streams it should take into account (instead of blindly - using the current one). - All callers to calculate_and_push_newsegment() and push_pending_data() - can now specify the program on which to act (or NULL for the default - one). - -2016-07-12 15:58:40 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Fix GAP synchronization without a valid PCR PID - For streams that don't have a valid PCR PID, we just use the latest - PTS from any given stream. - https://bugzilla.gnome.org/show_bug.cgi?id=608148 - -2016-05-31 13:09:43 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * gst/mpegtsdemux/mpegtspacketizer.c: - tsdemux: handle pcr_pid == 0x1fff - Streams without PCR make senses in HLS, where the playlist timestamps - can be used to seek or calculate the duration. - https://bugzilla.gnome.org/show_bug.cgi?id=608148 - -2015-05-10 20:10:49 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsdemux: do not abort playback when no PCR were found during initial scan - Seeking will not be possible in those streams but at least the can be - played. Note scanning is only done when tsdemux is configured in pull mode. - https://bugzilla.gnome.org/show_bug.cgi?id=608148 - -2015-05-09 15:52:22 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: only wait for PCR when PCR pid is set - Streams without PCR make senses in HLS, where the playlist timestamps - can be used to seek or calculate the duration. - https://bugzilla.gnome.org/show_bug.cgi?id=608148 - -2016-08-03 04:18:18 +1000 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux.c: - hls: Fix compiler warning for possibly uninit variable - -2016-07-28 14:22:02 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * ext/hls/gsthlsdemux.c: - hlsdemux: seek all streams - -2016-05-25 11:23:59 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * ext/hls/gsthlsdemux.c: - hlsdemux: simplify gst_hls_demux_seek() - Don't initialize current_sequence. It is always overwritten in the walk - loop. - -2016-05-24 15:23:12 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * ext/hls/gsthlsdemux.c: - hlsdemux: don't download the last fragment when seeking beyond the end of the track - It's not used anyways. - -2016-07-12 23:05:55 +1000 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux-util.c: - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Add support for ID3 tag parsing - Parse start PTS out of the ID3 tags in - audio fragments. Informational only for now. - -2016-02-24 16:57:16 +1100 Jan Schmidt <jan@centricular.com> - - * ext/hls/Makefile.am: - * ext/hls/gsthlsdemux-util.c: - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Do some reading and dumping of PCRs - Read PCRs out of the MPEG-TS stream in a basic way - and (for now) just log them - -2016-03-05 03:08:55 +1100 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Only use the primary stream for bitrate selection. - When playing alternate rendition auxilliary streams, ignore - them in bitrate measurement (for now). - -2016-07-15 16:24:17 +1000 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Only select video and audio streams by default - Ignore subtitle streams for now, because the - different fragment duration causes problems - switching bitrates w/ decodebin2 group draining. - -2016-02-25 01:58:25 +1100 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Publish all media for alternate renditions. - Create an output stream for each media when alternate renditions - are present. Update the manifests for all those streams, and - make sure that typefinding is still done for files smaller than 2KB - such as small WebVTT files. - -2016-03-08 01:24:20 +1100 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Adjust downstream buffer offsets - When fetching a byte-region from a server resource, - adjust the downstream buffer offsets so that downstream - doesn't know. This is because id3demux insists on the - first offset being 0. Later we might strip ID3 headers - entirely and this will be unneeded. - -2016-03-09 03:07:22 +1100 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: Choose the default variant and track it when updating - Modify playlist updating to track information across updates - better, although still hackish. - When connection_speed == 0, choose the default variant - not the first one in the (now sorted) variant list, as that - will have the lowest bitrate. - -2015-12-05 11:12:33 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - * tests/check/elements/hlsdemux_m3u8.c: - hlsdemux: move variant list handling over to new master playlist code - Adapt hlsdemux for the m3u8 playlist changes. - -2015-11-27 19:26:02 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hls: m3u8: Rework m3u8 parsing and storage. - Make M3U8 and GstM3U8MediaFile refcounted. The contents - of it and GstM3U8MediaFile are pretty much immutable - already, but if we make it refcounted we can just - return a ref to the media file from _get_next_fragment() - instead of copying over all fields one-by-one, and then - copying them all into the adaptive stream structure fields again. - Move state from client into m3u8 structure. This will - be useful later when we'll have multiple media playlists - being streamed at the same time, as will be the case with - alternative renditions. - This has the downside that we need to copy over some - state when we switch between variant streams. - The GstM3U8Client structure is gone, and main/current - lists are not directly in hlsdemux. hlsdemux had as - many CLIENT_LOCK/UNLOCK as the m3u8 code anyway... - -2016-07-27 09:28:23 +0800 Haihua Hu <jared.hu@nxp.com> - - * tests/examples/qt/qmlsink/.gitignore: - * tests/examples/qt/qmlsink/main.cpp: - * tests/examples/qt/qmlsink/main.qml: - * tests/examples/qt/qmlsink/play.pro: - * tests/examples/qt/qmlsink/qml.qrc: - * tests/examples/qt/qmlsrc/.gitignore: - * tests/examples/qt/qmlsrc/grabqml.pro: - * tests/examples/qt/qmlsrc/main.cpp: - * tests/examples/qt/qmlsrc/main.qml: - * tests/examples/qt/qmlsrc/qml.qrc: - qmlglsrc: Add qmlglsrc unit test example - https://bugzilla.gnome.org/show_bug.cgi?id=768160 - -2016-07-27 08:16:47 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/qt/Makefile.am: - * ext/qt/gstplugin.cc: - * ext/qt/gstqtglutility.cc: - * ext/qt/gstqtglutility.h: - * ext/qt/gstqtsrc.cc: - * ext/qt/gstqtsrc.h: - * ext/qt/qtitem.cc: - * ext/qt/qtwindow.cc: - * ext/qt/qtwindow.h: - qt: implement qmlglsrc for qml view grab - Matthew Waters: gst-indent sources - https://bugzilla.gnome.org/show_bug.cgi?id=768160 - -2016-07-27 10:55:01 +0800 Haihua Hu <jared.hu@nxp.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - glwindow: Fix glimagesink cannot show frame when connect to qmlglsrc - When connect to qmlglsrc, x11 event loop will be replace by qt event loop - which will cause the window cannot receive event from xserver, such as resize - https://bugzilla.gnome.org/show_bug.cgi?id=768160 - -2016-08-02 17:21:20 +0900 Hyunjun Ko <zzoon@igalia.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Use bufferpool to allocate new buffer in GLTextureUploadMeta - To improve performace of upload with GLTextureUploadMeta, - use bufferpool instead of allocating new buffer every time. - https://bugzilla.gnome.org/show_bug.cgi?id=769293 - -2016-07-27 14:48:50 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: move unsetting queue_resize to _resize() instead of _draw() - Makes infinitely more sense and implementation were expecting that behaviour - anyway and would enter a resize, draw, resize, draw, ... cycle instead of only - resizing once. - -2016-08-03 09:14:07 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Never ever hold the manifest lock while changing the source element state - Otherwise we will deadlock in various situations that take the manifest lock - from the streaming thread or when shutting down or ... - -2016-08-02 17:07:37 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/aiffparse.c: - aiffparse: In PUSH mode we will never get the ID3 tags as they are at the end of the file - This previously did not fail as before we didn't get any tags at all in PUSH - mode, now we get the bitrates. - -2016-08-02 13:48:43 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * gst/aiff/Makefile.am: - * gst/aiff/aiffparse.c: - aiffparse: Add tags for container format and bitrate - The bitrate is added to help downstream elements (like uridecodebin) - figure out a proper network buffer size - https://bugzilla.gnome.org/show_bug.cgi?id=769389 - -2016-01-20 16:42:24 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * tests/check/elements/dash_mpd.c: - tests: dashdemux: add test for gst_mpd_client_get_maximum_segment_duration - Add a test of the gst_mpd_client_get_maximum_segment_duration() function - to check that it first checks the MPD@maxSegmentDuration and then falls - back to checking all of the segment durations. - https://bugzilla.gnome.org/show_bug.cgi?id=753751 - -2016-02-24 15:54:54 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: include segment duration when calculating seek range - The gst_dash_demux_get_live_seek_range () function returns a stop value - that is beyond the available range. The functions - gst_mpd_client_check_time_position() and - gst_mpd_client_get_next_segment_availability_end_time() in - gstmpdparser.c include the segment duration when checking if a segment - is available. The gst_dash_demux_get_live_seek_range() function - in gstdashdemux.c ignores the segment duration. - According to the DASH specification, if maxSegmentDuration is not present, - then the maximum Segment duration is the maximum duration of any Segment - documented in the MPD. - https://bugzilla.gnome.org/show_bug.cgi?id=753751 - -2016-02-24 15:52:41 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: retry once on 4xx/5xx in certain conditions - This helps catch those 404 server errors in live streams when - seeking to the very beginning, as the server will handle a - request with some delay, which can cause it to drop the fragment - before sending it. - https://bugzilla.gnome.org/show_bug.cgi?id=753751 - -2016-02-24 15:47:09 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: expose HTTP status - To allow adaptivedemux to make retry decisions, it needs to know what - sort of HTTP error has occurred. For example, the retry logic for a - 410 error is different from a 504 error. - https://bugzilla.gnome.org/show_bug.cgi?id=753751 - -2016-03-07 17:04:33 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: allow seeking before start in live streams - Some derived classes (at least dashdemux) expose a seeking range - based on wall clock. This means that a subsequent seek to the start - of this range will be before the allowed range. - To solve this, seeks without the ACCURATE flag are allowed to seek - before the start for live streams, in which case the segment is - shifted to start at the start of the new seek range. If there is - an end position, is is shifted too, to keep the duration constant. - https://bugzilla.gnome.org/show_bug.cgi?id=753751 - -2016-08-01 14:12:35 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Fix horizontal/vertical flip matrizes - They were swapped. - https://bugzilla.gnome.org/show_bug.cgi?id=769371 - -2016-07-29 16:32:22 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth264parse.c: - videoparsers: h264: Add more scalable profiles to the profile list - Adding Scalable Constrained High (G.10.1.2.1) and - Scalable High Intra(G.10.1.3) profiles to the profile list - https://bugzilla.gnome.org/show_bug.cgi?id=769303 - -2016-08-01 10:30:29 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gst-android-hardware-camera.c: - * sys/androidmedia/gst-android-hardware-sensor.c: - * sys/androidmedia/gstahssrc.c: - androidmedia: Run gst-indent over everything once again - -2016-08-01 10:28:26 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - amc: If we find multiple codecs with the same name, just merge them - On the ODroid C1+ the H265 and H264 have the same name but are listed as two - different codecs. We have to handle them as the same one that supports both, - as otherwise we will register the same GType name twice which fails and we - then only have H265 support and not H264 support. - -2016-08-01 10:15:04 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - amc: Use a GQueue for O(1) append instead of a GList - -2016-07-29 12:31:38 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Also call reset() in READY->PAUSED - This allows subclasses to have initialization code in a single place. - -2016-07-29 10:49:26 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/rawparse/gstrawaudioparse.c: - rawaudioparse: Use G_GINT64_MODIFIER for portability - https://bugzilla.gnome.org/show_bug.cgi?id=769295 - -2016-07-29 10:07:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/rawparse/gstunalignedaudioparse.c: - unalignedaudioparse: Fix element factory name of inner parser - -2016-07-29 08:54:00 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - amc: Print generated raw/encoded caps in debug logs - -2016-07-28 11:27:29 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Skip audio streams if TRICKMODE_NO_AUDIO is given in the seek event - We just don't expose pads for audio streams, or even download them. - -2016-07-28 11:16:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Reset number of subtitle streams counter on reset() too - Otherwise we will continue increasing forever the number of subtitle streams - when reusing the element for another DASH manifest. - -2016-07-26 17:01:55 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * tests/check/pipelines/simple-launch-lines.c: - tests: fix simple-launch-lines when jpeg lib isn't present - JPEG detection in configure.ac defines HAVE_JPEG to 0 if the - jpeg lib isn't found, rather then not defining it. - https://bugzilla.gnome.org/show_bug.cgi?id=769197 - -2016-07-25 17:55:24 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-rawparse.xml: - docs: Update rawparser documentation - Signed-off-by: Carlos Rafael Giani <dv@pseudoterminal.org> - https://bugzilla.gnome.org/show_bug.cgi?id=767011 - -2016-07-25 17:54:09 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * gst/rawparse/Makefile.am: - * gst/rawparse/gstaudioparse.c: - * gst/rawparse/gstaudioparse.h: - * gst/rawparse/gstrawparse.c: - * gst/rawparse/gstrawparse.h: - * gst/rawparse/gstvideoparse.c: - * gst/rawparse/gstvideoparse.h: - rawparse: Remove old parser code and wrap new parsers in old elements - https://bugzilla.gnome.org/show_bug.cgi?id=767011 - -2016-07-25 13:45:40 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * gst/rawparse/Makefile.am: - * gst/rawparse/gstrawaudioparse.c: - * gst/rawparse/gstrawaudioparse.h: - * gst/rawparse/gstrawbaseparse.c: - * gst/rawparse/gstrawbaseparse.h: - * gst/rawparse/gstrawvideoparse.c: - * gst/rawparse/gstrawvideoparse.h: - * gst/rawparse/gstunalignedaudioparse.c: - * gst/rawparse/gstunalignedvideoparse.c: - * gst/rawparse/gstunalignedvideoparse.h: - * gst/rawparse/plugin.c: - * gst/rawparse/unalignedvideo.h: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/rawaudioparse.c: - * tests/check/elements/rawvideoparse.c: - rawparse: Add new raw audio and video parser elements - The new rawaudioparse and rawvideoparse elements are based on GstBaseParse - and completely replace audioparse and videoparse - https://bugzilla.gnome.org/show_bug.cgi?id=767011 - -2016-07-26 16:01:19 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.h: - * ext/gl/caopengllayersink.m: - caopengllayersink: remove unused to_quit variable - It was always 0 and never set to anything meaningful. - -2016-07-26 15:57:54 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglframebuffer.c: - glframebuffer: add compatibility definition for GL_DEPTH_STENCIL_ATTACHMENT - GLES2 doesn't have it defined... - -2016-07-15 13:39:54 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/effects/gstgleffectblur.c: - * ext/gl/effects/gstgleffectbulge.c: - * ext/gl/effects/gstgleffectfisheye.c: - * ext/gl/effects/gstgleffectglow.c: - * ext/gl/effects/gstgleffectidentity.c: - * ext/gl/effects/gstgleffectlaplacian.c: - * ext/gl/effects/gstgleffectlumatocurve.c: - * ext/gl/effects/gstgleffectlumatocurve.h: - * ext/gl/effects/gstgleffectmirror.c: - * ext/gl/effects/gstgleffectrgbtocurve.c: - * ext/gl/effects/gstgleffectsin.c: - * ext/gl/effects/gstgleffectsobel.c: - * ext/gl/effects/gstgleffectsquare.c: - * ext/gl/effects/gstgleffectsqueeze.c: - * ext/gl/effects/gstgleffectstretch.c: - * ext/gl/effects/gstgleffecttunnel.c: - * ext/gl/effects/gstgleffecttwirl.c: - * ext/gl/effects/gstgleffectxray.c: - * ext/gl/gstglcolorbalance.c: - * ext/gl/gstglcolorscale.c: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldeinterlace.h: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstglfilterapp.c: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstgloverlay.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglpixelformat.c: - * gst-libs/gst/gl/gstglutils.h: - glfilter: rewrite subclasses for filter_texture() occuring on GL thread - There's no need for the jump to an extra thread in most cases, especially - when relying solely on a shader to render. We can use the provided - render_to_target() functions to simplify filter writing. - -2016-07-12 15:34:24 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglutils.h: - glutils: remove unused GstGLDisplayProjection - -2016-07-12 15:29:29 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * gst-libs/gst/gl/gstglviewconvert.c: - * tests/check/libs/gstglmemory.c: - * tests/check/libs/gstglupload.c: - glcontext: remove not thread-safe get/set_error() - Use GError's instead if necessary. - -2016-07-12 12:59:57 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfilterapp.c: - * ext/gl/gstglfilterapp.h: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - * ext/gl/gstglmosaic.c: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstgltestsrc.h: - * ext/gl/gstgltransformation.c: - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * gst-libs/gst/gl/gstglviewconvert.c: - * gst-libs/gst/gl/gstglviewconvert.h: - * tests/check/libs/gstglcontext.c: - glframebuffer: rewrite for a more consistent API - Facilities are given to create fbo's and attach GL memory (renderbuffers - or textures). It also keeps track of the renderable size for use with - effective use with glViewport(). - -2016-07-12 00:30:22 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglcolorbalance.c: - * ext/gl/gstglcolorscale.c: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgldifferencematte.h: - * ext/gl/gstgleffects.c: - * ext/gl/gstgleffects.h: - * ext/gl/gstglfilterapp.c: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfiltercube.h: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglfilterglass.h: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - * ext/gl/gstglmosaic.c: - * ext/gl/gstglmosaic.h: - * ext/gl/gstgloverlay.c: - * ext/gl/gstgltransformation.c: - * ext/gl/gstgltransformation.h: - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - gl: use GLMemory for accessing textures everywhere - This simplifies and consolidates a lot of duplicated code creating - and modifying textures. - -2016-07-11 22:44:16 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/effects/gstgleffectblur.c: - * ext/gl/effects/gstgleffectbulge.c: - * ext/gl/effects/gstgleffectfisheye.c: - * ext/gl/effects/gstgleffectglow.c: - * ext/gl/effects/gstgleffectidentity.c: - * ext/gl/effects/gstgleffectlaplacian.c: - * ext/gl/effects/gstgleffectlumatocurve.c: - * ext/gl/effects/gstgleffectmirror.c: - * ext/gl/effects/gstgleffectrgbtocurve.c: - * ext/gl/effects/gstgleffectsin.c: - * ext/gl/effects/gstgleffectsobel.c: - * ext/gl/effects/gstgleffectsquare.c: - * ext/gl/effects/gstgleffectsqueeze.c: - * ext/gl/effects/gstgleffectstretch.c: - * ext/gl/effects/gstgleffecttunnel.c: - * ext/gl/effects/gstgleffecttwirl.c: - * ext/gl/effects/gstgleffectxray.c: - * ext/gl/gstglcolorbalance.c: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstglfiltershader.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - glfilter: rename draw_texture to draw_fullscreen_quad - And remove unused arguments. - -2016-07-11 22:31:04 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglrenderbuffer.c: - * gst-libs/gst/gl/gstglrenderbuffer.h: - gl: add memory type for renderbuffer's - Soon to be used for framebuffers for e.g. depth buffers or throwaway color - buffers. - -2016-07-11 22:28:42 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglformat.c: - * gst-libs/gst/gl/gstglformat.h: - glformat: define our own set of formats from the GL defines - also add some depth/stencil formats - -2016-07-11 22:24:43 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgleffects.c: - gleffects: fix xray to use the correct function - Instead of duplicating the sin effect - -2016-07-11 21:29:10 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbasememory.h: - glbasememory: assert for a valid allocator instead of segfaulting - -2016-04-29 14:42:34 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: add support for LPCM with stream_type = 0x83 - https://bugzilla.gnome.org/show_bug.cgi?id=765807 - -2016-07-25 13:06:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - player: Add some 'const' to config getters - -2016-07-25 13:06:36 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: G-I annotation fixes - -2016-07-25 10:30:26 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - * tests/check/libs/player.c: - * win32/common/libgstplayer.def: - player: move 'position-update-interval' setting to the config struct - https://bugzilla.gnome.org/show_bug.cgi?id=769144 - -2016-07-19 14:36:25 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - * tests/check/libs/player.c: - * win32/common/libgstplayer.def: - player: add API to change http user agent - Introducing a new 'config' API similar to GstBufferPoolConfig. - https://bugzilla.gnome.org/show_bug.cgi?id=765314 - -2016-07-25 10:54:32 +0100 Tim-Philipp Müller <tim@centricular.com> - - * common: - Update common submodule - For 'make update-exports' changes - -2016-07-22 17:00:14 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/examples/qt/qml/main.cpp: - qml: Don't forget to unref the actual sink element after setting it on glsinkbin - -2016-07-22 16:57:45 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/examples/qt/qml/main.cpp: - qml: Use glsinkbin instead of glupload directly - -2016-07-18 18:36:42 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - * ext/openh264/gstopenh264enc.cpp: - * ext/openh264/gstopenh264enc.h: - openh264: fix up for API changes in v1.6.0 - Update for API changes in v1.6.0. - https://bugzilla.gnome.org/show_bug.cgi?id=768771 - -2016-07-18 17:43:23 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/wayland/gstgldisplay_wayland.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - gl: wayland: improve debug message when connecting to display - And another copy'n'paste-o. - https://bugzilla.gnome.org/show_bug.cgi?id=768929 - -2016-07-19 02:11:54 +1000 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Fix clearing of decryption state - Don't clear decryption state immediately after - initialising it in the start_fragment. Don't clear - the state of all streams when we want to only clear - the current stream. - https://bugzilla.gnome.org//show_bug.cgi?id=768757 - -2016-07-15 10:31:35 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/adaptive_demux_engine.c: - * tests/check/elements/audiomixer.c: - * tests/check/elements/autovideoconvert.c: - * tests/check/elements/camerabin.c: - tests: fix bus leak - gst_bus_remove_signal_watch() has to be called to release the ref - taken by gst_bus_add_signal_watch(). - https://bugzilla.gnome.org/show_bug.cgi?id=768843 - -2016-07-15 11:48:25 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - camerabinpreview: fix bus leak - We were never removing the watch introduced in - gst_camerabin_create_preview_pipeline() so its extra ref on the bus was - never released. - https://bugzilla.gnome.org/show_bug.cgi?id=768838 - -2016-07-13 23:02:10 +1000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: make decryption key handling per-stream - Add demuxer instance-wide decryption key cache. The current and - last key url are per-stream, so make a shared cache. Move the - decryption handling into the stream object, and use the shared - cache for the keys. - -2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: add hlsdemux-specific AdaptiveDemuxStream subclass - Prepare hlsdemux for more than one single stream. Currently hlsdemux - assumes there'll only ever be one stream and most of the stream-specific - state is actually in the hlsdemux structure. Add a stream subclass - instead and move some stream-specific members there instead. - -2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Add more safeguards around state changes. - Make state changes of internal elements more reliable by locking - their state, and ensuring that they aren't blocked pushing data - downstream before trying to set their state. - Add a boolean to avoid starting tasks when the main - thread is busy trying to shut the element down. - -2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Add debug code to change bitrate. - Add some disabled-by-default debugging code that forces - bitrate changes by modulating the measured bitrate every - few fragments - -2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: More locking/switching fixes - Try harder to make switching pads work better by - making sure concurrent downloads are finished before exposing - a new set of pads. - Release the manifest lock when signalling no-more-pads, as - that can call back into adaptivedemux again - -2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Don't switch streams and expose pads while downloading. - If other stream fragments are still downloading but new streams - have been scheduled, don't expose them yet - wait until the last - one finishes. Otherwise, we can cancel a partially downloaded - auxilliary stream and cause a gap. - -2016-07-13 23:02:10 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Drop the manifest lock during outbound actions - Drop the manifest lock when performing actions that might - call back into adaptivedemux and trigger deadlocks, such - as adding/removing pads or sending in-band events (EOS). - Unlock the manifest lock when changing the child bin state to - NULL, as it might call back to acquire the manifest lock when - shutting down pads. - Drop the manifest lock while pushing events. - -2016-07-12 14:51:47 -0700 Martin Kelly <martin@surround.io> - - * sys/androidmedia/Makefile.am: - * sys/androidmedia/gst-android-hardware-sensor.c: - * sys/androidmedia/gst-android-hardware-sensor.h: - * sys/androidmedia/gstahssrc.c: - * sys/androidmedia/gstahssrc.h: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstsensors.h: - * sys/androidmedia/org/freedesktop/gstreamer/androidmedia/GstAhsCallback.java: - new plugin: Android hardware sensor source - ahssrc is a new plugin that enables Gstreamer to read from the - android.hardware.Sensor Android sensors. These sensors are treated as - buffers and can be passed through and manipulated by the pipeline. - https://bugzilla.gnome.org/show_bug.cgi?id=768110 - -2016-07-14 19:38:26 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2utils.c: - lv2: make it build with older lilv - Implementing the removal of presets is unfortunately not feasibla with - versions < 0.22. - Fixes #768595 - -2016-07-13 23:00:51 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/webrtcdsp/gstwebrtcdsp.cpp: - * ext/webrtcdsp/gstwebrtcechoprobe.cpp: - webrtcdsp: Add delay-agnostic property - In this mode, we let WebRTC Audio Processing figure-out the delay. This - is useful when the latency reported by the stack cannot be trusted. Note - that in this mode, the leaking of echo during packet lost is much worst. - It is recommanded to use PLC (e.g. spanplc, or opus built-in plc). - In this mode, we don't do any synchronization. Instead, we simply process all - the available reverse stream data as it comes. - -2016-07-12 00:02:53 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gstjpeg2000parse.c: - jpeg2000parse: Use correct enum type - GST_JPEG2000_SAMPLING_RGB instead of GST_JPEG2000_COLORSPACE_RGB - https://bugzilla.gnome.org/show_bug.cgi?id=768696 - -2016-07-11 21:13:58 +0200 Stefan Sauer <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From f363b32 to f49c55e - -2016-07-11 11:58:12 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/kms/gstkmsallocator.c: - * sys/kms/gstkmsallocator.h: - * sys/kms/gstkmssink.c: - kmssink: Fix offsets handling - The calculation of the offset table was done base on a plane size - estimation. This does not always work. Instead, use memory offset the - same we as it's implement in GstVideoMeta map functions. - -2016-07-11 19:21:11 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst/siren/gstsirendec.c: - Fix various gboolean vs GstFlowReturn problems - Caught by building with MSVC which gave warnings for these - -2016-07-08 19:03:06 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - gl/build: fix configure when --enable-cocoa is passed on OS X - https://bugzilla.gnome.org/show_bug.cgi?id=768553 - -2016-07-10 20:43:17 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/README: - lv2: planning update - -2016-07-10 20:42:42 +0200 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - * ext/lv2/gstlv2utils.c: - lv2: keep working with older versions - Provide a fallback impl. for the only new function we were using from 0.22. - Fixes #768595 - -2016-07-08 14:42:18 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: update docs section - -2016-07-07 13:22:02 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - configure.ac: Cleanup unused variable - We only check for a header, no need for overriding LDFLAGS. - -2016-07-07 17:24:32 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/gaudieffects/gstgaussblur.h: - gaudi: fix documentation warning in GstGaussianBlur - Fixing the following warning when generating documentation: - xml/element-gaussianblur.xml:72: element refsect2: validity error : - ID GstGaussianBlur already defined - <refsect2 id="GstGaussianBlur" role="typedef"> - ^ - Warning: multiple "IDs" for constraint linkend: GstGaussianBlur. - DOC Fixing cross-references - -2016-07-07 17:16:47 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/gaudieffects/gstchromium.h: - gaudi: fix documentation warning in GstChromium - Fixing the following warning when generating documentation: - xml/element-chromium.xml:74: element refsect2: validity error : - ID GstChromium already defined - <refsect2 id="GstChromium" role="typedef"> - ^ - Warning: multiple "IDs" for constraint linkend: GstChromium. - DOC Fixing cross-references - -2016-07-07 12:31:20 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - webrtcdsp: Relax C++11 check - The library does not require any STL C++11 specific headers. - This fixes our OSX build as we target a SDK version that does not - support C++11 STL. - -2016-07-07 12:31:03 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - webrtcdsp: Add Android GNUSTL support - -2016-07-07 12:20:45 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - webrtcdsp: Set USE_WEBRTCDSP when disabled - -2016-07-07 17:20:58 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Also consider more seek flags as "snap" seeks - In the case of KEY_UNIT and TRICKMODE_KEY_UNITS seeks, we want to - "snap" to the closest fragment. - Without this, we end up pushing out a segment which does not match - the first fragment timestamp being pushed out, resulting in one or - more buffers being eventually dropped because they are out of segment. - -2016-07-06 14:29:04 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - webrtcdsp: Also allow webrtc-audio-processing 0.3 - It seems to work and is the version available in Debian. - -2016-07-06 12:12:41 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/musepack/gstmusepackdec.c: - musepackdeck: unsigned can't be less than zero - Less-than-zero comparison of an unsigned value, guint64, is never true - CID 1363334 - -2016-07-06 13:51:06 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -=== release 1.9.1 === - -2016-07-06 13:07:21 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstgtk.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-opengl.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qt.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.9.1 - -2016-07-06 11:52:11 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2016-07-06 10:19:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - po: Update translations - -2016-07-05 09:21:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/webrtcdsp/gstwebrtcdsp.cpp: - webrtcdsp: Workaround GCC/MingW 4.7 limitations - It refuses to initialize a classes using brackets notation. This is - to allow building using our mingw version. - -2016-07-04 14:57:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - configure.ac: Add missing double quotes - That affectation was ignored. This worked on recent GCC as C++11 is - enabled by default now. - -2016-07-02 10:24:51 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2filter.c: - * ext/lv2/gstlv2source.c: - * ext/lv2/gstlv2utils.c: - * ext/lv2/gstlv2utils.h: - lv2: add support for saving presets - Plugns supporting the state interface can now save their presets under '.lv2'. - -2016-06-15 22:22:58 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/README: - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - * ext/lv2/gstlv2filter.c: - * ext/lv2/gstlv2source.c: - * ext/lv2/gstlv2utils.c: - * ext/lv2/gstlv2utils.h: - lv2: support for loading presets - Detect if plugins can do presets. Lazily read a list of presets and add support - for loading. - -2016-07-04 16:54:53 +0200 Wim Taymans <wtaymans@redhat.com> - - * configure.ac: - * ext/musepack/gstmusepackdec.c: - * ext/musepack/gstmusepackreader.c: - musepackdec: port to 1.0 - -2016-07-04 12:19:36 +0200 Marcin Lewandowski <marcin@radiokit.org> - - * sys/shm/gstshmsrc.c: - shmsrc: Do not call gst_poll_remove_fd upon stop if reading was never started - https://bugzilla.gnome.org/show_bug.cgi?id=768365 - -2016-07-01 14:50:27 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: improve parsing-success message - * Fix typo - * Give information on what was actually parsed - -2016-07-01 14:37:37 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: don't use default conf filename for messages - The file name can be user-defined. - -2016-07-01 19:22:32 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/qt/Makefile.am: - qt: fix build some more when QPA is not available - Compiler would complain about include directory that didn't - exist because QPA_INCLUDE_PATH gets subst-ed regardless - (and if it didn't we'd have just an empty -I argument). - https://bugzilla.gnome.org/show_bug.cgi?id=767553 - -2016-07-01 14:05:49 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/videoparsers/gstjpeg2000parse.c: - gstjpeg2000parse: no need for else after a goto - else clause is redundant when the end of the if statement is a jump. - If we haven't gone to the beach, we are in the false branch. - -2016-06-30 07:47:50 -0400 Aaron Boxer <boxerab@gmail.com> - - * gst/videoparsers/gstjpeg2000parse.c: - gstjpeg2000parse: improved parsing of jpc magic and j2c box - https://bugzilla.gnome.org/show_bug.cgi?id=767512 - -2016-05-25 16:01:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Add custom flow return for allowing subclasses to specify when a fragment is finished - If it is finished before upstream going EOS. - https://bugzilla.gnome.org/show_bug.cgi?id=767365 - -2016-05-27 16:08:09 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Implement SIDX tracking based on buffer offset - This simplifies the code but also removes a bug with tracking of the remaining - size for the initial subfragment: we were not considering the size between the - index and the start of the first moof here. - https://bugzilla.gnome.org/show_bug.cgi?id=764684 - -2016-03-31 13:39:59 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Properly keep track of current offset - GstAdapter does not guarantee to pass through all the offsets, we have to keep - track of it ourselves. - https://bugzilla.gnome.org/show_bug.cgi?id=764684 - -2016-03-31 13:39:59 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Properly keep track of current offset - GstAdapter does not guarantee to pass through all the offsets, we have to keep - track of it ourselves. - https://bugzilla.gnome.org/show_bug.cgi?id=764684 - -2016-03-31 13:01:00 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Clear pending data when needed - When switching fragments we don't want to keep any data around from the last - one, and also forget about all data when doing flushing seeks or selecting new - bitrates. - https://bugzilla.gnome.org/show_bug.cgi?id=764684 - -2016-03-28 13:45:36 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Get rid of internal stream adapter and let subclasses handle this directly - This allows subclasses to have more control and especially ensure that they - push data downstream with the correct offsets. - https://bugzilla.gnome.org/show_bug.cgi?id=764684 - -2016-07-01 12:20:14 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gstjpeg2000sampling.c: - codecparsers: jpeg2000: don't allow 0 value for array access with i-1 - -2016-07-01 12:15:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gstjpeg2000sampling.c: - codecparsers: jpeg2000: fix possible out-of-bounds array access - sizeof(array) != G_N_ELEMENTS(array). - CID 1362900 - -2016-06-30 23:38:26 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Set frame timestamps before sending to the encoder - -2016-06-30 23:35:33 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Fix initial time-per-frame calculation - -2016-06-30 23:33:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - * ext/openh264/gstopenh264enc.h: - openh264enc: Remove meaningless drop bitrate handling - This doesn't even have a property. - -2016-06-30 23:29:13 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - * ext/openh264/gstopenh264enc.h: - openh264enc: Expose maximum bitrate setting - -2016-06-30 23:19:26 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Actually hook up the rate-control property - -2016-06-30 23:06:29 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Use a constant SPS/PPS ID no matter if openh264 older or newer than 1.4 is used - -2016-06-30 23:02:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Make slice settings more explicit and don't set any number if not a fixed number of slices is selected - -2016-06-29 15:56:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/webrtcdsp/gstwebrtcdsp.cpp: - * ext/webrtcdsp/gstwebrtcechoprobe.cpp: - * ext/webrtcdsp/gstwebrtcechoprobe.h: - webrtcdsp: Rewrite echo data synchronization - The previous code would run out of sync if there was packet lost - or clock skews. When that happened, the echo cancellation feature would - completely stop working. As this is crucial for audio calls, this patch - re-implement synchronization completely. - Instead of letting it drift until next discont, we now synchronize - against the record data at every iteration. This way we simply never - let the stream drift for longer then 10ms period. We also shorter the - delay by using the latency up the probe (basically excluding the sink - latency. This is a decent delay to avoid starving in the probe queue. - https://bugzilla.gnome.org/show_bug.cgi?id=768009 - -2016-06-29 15:55:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/webrtcdsp/gstwebrtcdsp.cpp: - webrtcdsp: We now fail if there is no echo probe - When echo cancel is enabled, we now fail the pipeline if there is - not echo probe. For this reason there is no need to check if probe - pointer is set anymore. - -2016-06-30 21:50:12 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglviewconvert.c: - glviewconvert: fix transformation matrix usage - Calling glUniformMatrix before the shader is bound is invalid and - would result in errors like: - GL_INVALID_OPERATION in glUniformMatrix(program not linked) - Move glUniformMatrix() to after the gst_gl_shader_use() call. - -2016-06-28 16:07:43 -0400 Javier Martinez Canillas <javier@osg.samsung.com> - - * sys/kms/gstkmssink.c: - kmssink: fallback to universal planes if no overlay plane is found - Without setting the DRM_CLIENT_CAP_UNIVERSAL_PLANES capability bit, only - overlay planes are made available for compatibility with legacy clients. - But if a CRTC doesn't have an overlay plane associated, then kmssink is - not able to find a plane for the CRTC and the pipeline will fail, i.e: - ERROR kmssink gstkmssink.c:482:gst_kms_sink_start:<kmssink0> Could not find a plane for crtc - If no overlay planes were found for a given CRTC, fallback to universal - planes so DRM will also return primary planes that can be used instead. - https://bugzilla.gnome.org/show_bug.cgi?id=768183 - Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com> - -2016-06-28 20:51:56 -0400 Javier Martinez Canillas <javier@osg.samsung.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * sys/kms/gstkmssink.c: - kmssink: add a plane-id property - Without setting the DRM_CLIENT_CAP_UNIVERSAL_PLANES capability bit, only - overlay planes are made available for compatibility with legacy clients. - But if a CRTC doesn't have an overlay plane associated, then kmssink is - not able to find a plane for the CRTC and the pipeline will fail, i.e: - ERROR kmssink gstkmssink.c:482:gst_kms_sink_start:<kmssink0> Could not find a plane for crtc - This patch adds a plane-id property to the kmssink element so a specific - plane can be used in case that a CRTC has only a primary plane associated. - https://bugzilla.gnome.org/show_bug.cgi?id=768183 - -2016-06-30 10:33:30 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Remove broken byte-stream to avc conversion and just output byte-stream as generated by the encoder - The byte-stream to avc conversion did not consider NAL sizes bigger than 2^16, - multiple layers, multiple NALs per layer, and various other things. This - caused corrupted streams in higher bitrates and other circumstances. - Let's just forward byte-stream as generated by the encoder and let h264parse - handle conversion to avc if needed. That way we only have to keep around one - version of the conversion and don't have to fix it in multiple places. - -2016-06-29 18:36:56 +0200 Edward Hervey <edward@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Drop filler data - When skipping data, check if they are filler bytes. If so, drop the - data instead of skipping. We don't want to output filler bytes, but they - shouldn't cause a discontinuity. - https://bugzilla.gnome.org/show_bug.cgi?id=768125 - -2016-06-30 08:31:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: Use a non-timer GstPoll - set_flushing() causes inconsistent states on timer polls and also signals a - g_critical() nowadays because of that. - -2016-06-30 14:04:36 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: fix raw data uploader with addition of GstVideoGLTextureType - Fixes regression from 989200820d43c78fb179d7984827800d83787390 - https://bugzilla.gnome.org/show_bug.cgi?id=768217 - -2016-06-29 23:55:18 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glvideoconvert: RG/LA is available in OpenGL ES 3, so let that through - -2016-06-29 18:35:17 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/videotexturecache.m: - vtdec: use L/LA textures on GLES2 as well - -2016-06-24 13:41:11 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - Revert "Revert "gl/eagl: try getting a gles3 context"" - This reverts commit eb142736318463e6e553c21707ba0d716f85a46f. - vtdec now successfully outputs textures that can be converted by - glcolorconvert in GLES3 contexts. - -2016-06-25 00:05:37 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/videotexturecache.m: - vtdec: add support for zerocopy decoding with GLES 3.x - It seems that Red/RG textures aren't supported anymore for zerocopy decoding - with GLES 3.x. Instead use Luminance/Luminance Alpha textures which are. - -2016-06-28 13:51:22 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgloverlay.c: - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/applemedia/iosurfacememory.c: - * sys/applemedia/iosurfacememory.h: - * sys/applemedia/videotexturecache.m: - * tests/check/libs/gstglcolorconvert.c: - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglmemory.c: - * tests/check/libs/gstglupload.c: - glmemory: add the texture type to allocate to parameters - Rather than assuming something. e.g. zerocopy on iOS with GLES3 requires - the use of Luminance/Luminance Alpha formats and does not work with - Red/RG textures. - -2016-06-28 13:09:51 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: don't assume Red/RG textures will be used - Take the used texture type from the memory instead. - Fixes conversion from multi-planar YUV formats with two components per plane - (NV12, NV21, YUY2, UYVY, GRAY16_*, etc) with Luminance Alpha input textures. - This is also needed for zerocopy decoding on iOS with GLES 3.x. - -2016-06-28 13:02:32 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: correct precondition for get_gl_version - The intention was to assert if both maj and min were NULL (as there would be no - point calling the function). Instead if either maj or min were NULL, the assert - would occur. - Fix that. - -2016-06-28 19:26:29 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Replace some more gst_caps_to_string() with GST_PTR_FORMAT - https://bugzilla.gnome.org/show_bug.cgi?id=768146 - -2016-06-28 11:50:59 -0400 Jonathan Roy <jroy@adetelgroup.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: leak on caps string - https://bugzilla.gnome.org/show_bug.cgi?id=768146 - -2016-06-28 11:08:22 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst-libs/gst/codecparsers/gstjpeg2000sampling.c: - jpeg2000parse: fix typo in sampling check - Fixing small typo that changes the value of the return. - -2016-06-27 21:36:50 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/Makefile.am: - tests: Ignore kmssink for state change test - It can only be put to READY if the DRM stuff is available. - -2016-06-27 18:15:08 +0800 Haihua Hu <jared.hu@nxp.com> - - * configure.ac: - * ext/qt/qtitem.cc: - qmlglsink: Fix build error when don't have QPA installed. - Check header file existance and wrap the header file include - in the necessary #ifdef to avoid build error. - https://bugzilla.gnome.org/show_bug.cgi?id=767553 - -2016-06-24 18:14:06 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: make sure we have an error in case of parsing failure - Drop a redundant comment and rellocate another one while at it. - -2016-06-22 16:14:33 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: implement channels.conf format autodetection - Simple autodetection avoids having to call the parsers - one after the other. - -2016-06-21 16:08:57 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: rename v5/zap parsers for congruency - Add function prototypes while at it. - -2016-04-12 21:04:25 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: fix modulation names - Some names were incorrect. Authoritative source for - the dvbv5 format taken from v4l-utils' lib/libdvbv5/dvb-v5.c - Aditionally, add the missing setter mapping for the - modulation param. - This change makes ATSC work. - https://bugzilla.gnome.org/show_bug.cgi?id=764957 - -2016-02-24 21:44:40 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvbbasebin: also accept DVBv5 channels.conf format - Confirmed working with ISDB-T & ATSC conf files. - https://bugzilla.gnome.org/show_bug.cgi?id=764957 - -2016-06-21 11:48:36 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix ISDB-T property descriptions - Drop some stale trailing whitespace while at it. - -2016-06-21 11:32:07 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix misplaced space on doc block - -2016-05-10 03:32:59 +1000 Jan Schmidt <jan@centricular.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: When input alignment=AU, always drain each packet. - If the input alignment claims AU alignment, each received - buffer should contain a complete video frame, so never hold over parts - of buffers for later processing. Also reduces latency, as packets - are parsed/converted and output immediately instead of 1 buffer - later. - Fixes a problem where an (arguably disallowed) padding byte on the - end of a buffer is detected as an extra byte in the following - start code, and messes up the timestamping that should apply to - that start code. - -2016-06-24 13:05:24 +0100 Tim-Philipp Müller <tim@centricular.com> - - * win32/common/libgstcodecparsers.def: - win32: update codecparsers .def file for new symbols - -2016-06-24 09:41:18 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/openjpeg/Makefile.am: - * ext/openjpeg/gstopenjpegdec.h: - * ext/openjpeg/gstopenjpegenc.c: - openjpeg: fix more broken includes - -2016-06-24 09:39:00 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/videoparsers/gstjpeg2000parse.h: - videoparsers: fix broken include - -2016-06-21 12:41:46 -0400 Aaron Boxer <boxerab@gmail.com> - - * ext/openjpeg/Makefile.am: - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegdec.h: - * ext/openjpeg/gstopenjpegenc.c: - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/gstjpeg2000sampling.c: - * gst-libs/gst/codecparsers/gstjpeg2000sampling.h: - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstjpeg2000parse.c: - * gst/videoparsers/gstjpeg2000parse.h: - * gst/videoparsers/gstjpeg2000sampling.h: - jpeg2000parse: use enums for colorspace and sampling, rather than strings - Also, move gstjpeg2000sampling to codecparsers project - https://bugzilla.gnome.org/show_bug.cgi?id=767908 - -2016-06-24 01:57:13 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * configure.ac: - configure: Need to add -DGST_STATIC_COMPILATION when building only statically - https://bugzilla.gnome.org/show_bug.cgi?id=767463 - -2016-06-23 15:57:58 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimage.c: - eglimage: Only register debug category if dmabuf support is enabled - It's not used otherwise currently and causes compiler warnings. - -2016-06-22 22:28:03 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/webrtcdsp/gstwebrtcdsp.cpp: - webrtcdsp: Offset timestamp with duration - The saved timestamp is used to compute the delay of the probe data. - As it's used at the following incoming buffer, it needs to be offset - with the duration of the buffer to represent the end position. Also, - properly initialize the saved timestamp and protect against TIME_NONE. - -2016-06-22 21:54:13 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/webrtcdsp/gstwebrtcdsp.cpp: - webrtcdsp: Synchronize with delays - Until now, we were synchronizing both DSP and Probe adapter by - waiting and clipping the probe adapter data. This increases the CPU - usage, can cause copies if the audio is not 10ms aligned and the worst - is that it prevents the processing from compensating for inaccurate - latency. This is also a step forward toward supporting playback - filters. - -2016-06-22 21:45:08 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/webrtcdsp/gstwebrtcdsp.cpp: - webrtdsp: Remove restriction on channels number - Unlike 0.1, in 0.2 the reverse stream can have different number of - channels. Remove the check that restrict it. - -2016-06-22 21:44:35 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/webrtcdsp/gstwebrtcdsp.cpp: - webrtcdsp: Style fix - -2016-06-16 14:18:18 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: minimize renegotiation to make hw decoding more reliable - The hardware decoder can become (temporarily) unavailable across - VTDecompressionSessionCreate/Destroy calls. During negotiation if the currently - configured caps are still accepted by downstream we keep using them so we don't - have to destroy and recreate the decoding session. - This indirectly fixes https://bugzilla.gnome.org/show_bug.cgi?id=767429, by - making vtdec stick to GLMemory. - -2016-06-16 15:13:02 +1000 Matthew Waters <matthew@centricular.com> - - * ext/qt/qtitem.cc: - * ext/qt/qtplugin.pro: - qmlglsink: add win32 support - The current state of c++ ABI's on Window's and Gst's/Qt's conflicting - mingw builds means that we cannot use mingw for building the qt plugin. - Instead, a qmake .pro file is provided that is expected to be used with the - msvc binaries provided by Qt like so: - (with the PATH environment variable containing the path to the qt biniaries - and PKG_CONFIG_PATH containing the path to GStreamer modules) - cd /path/to/sources/gst-plugins-bad/ext/qt - qmake -tp vc - Then open the resulting VS project and build the library. Then - cp debug/libgstqtsink.dll /path/to/prefix/lib/gstreamer-1.0/libgstqtsink.cll - https://bugzilla.gnome.org/show_bug.cgi?id=761260 - -2016-06-21 11:40:22 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * .gitignore: - Add missing file to gitignore - -2016-06-20 18:52:00 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-androidcamera.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiofxbad.xml: - * docs/plugins/inspect/plugin-bluez.xml: - * docs/plugins/inspect/plugin-bs2b.xml: - * docs/plugins/inspect/plugin-compositor.xml: - * docs/plugins/inspect/plugin-dashdemux.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dtls.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-fluidsynthmidi.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gstgtk.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-ivtc.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-kms.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-midi.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-netsim.xml: - * docs/plugins/inspect/plugin-openexr.xml: - * docs/plugins/inspect/plugin-opengl.xml: - * docs/plugins/inspect/plugin-openjpeg.xml: - * docs/plugins/inspect/plugin-opusparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qt.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtponvif.xml: - * docs/plugins/inspect/plugin-smoothstreaming.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-srtp.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-teletext.xml: - * docs/plugins/inspect/plugin-uvch264.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoframe_audiolevel.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-webp.xml: - * docs/plugins/inspect/plugin-webrtcdsp.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x265.xml: - * docs/plugins/inspect/plugin-yadif.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst/pnm/gstpnmenc.c: - doc: Automatic update - This is an automatic update with manual merges of running - "make update" in the doc/plugins directory. This should help - later maintenance of the plugins doc. A lot of plugin are - not referenced yet in the doc. Will come later. - -2016-06-20 16:30:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/plugins/Makefile.am: - doc: Add .cpp files to doc parser - Also, complete the list of directory that need to be visited. - -2016-06-06 15:10:05 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - * ext/Makefile.am: - * ext/webrtcdsp/Makefile.am: - * ext/webrtcdsp/gstwebrtcdsp.cpp: - * ext/webrtcdsp/gstwebrtcdsp.h: - * ext/webrtcdsp/gstwebrtcechoprobe.cpp: - * ext/webrtcdsp/gstwebrtcechoprobe.h: - webrtcdsp: Add WebRTC Audio Processing support - This DSP library can be used to enhance voice signal for real time - communication call. In implements multiple filters like noise reduction, - high pass filter, echo cancellation, automatic gain control, etc. - The webrtcdsp element can be used along, or with the help of the - webrtcechoprobe if echo cancellation is enabled. The echo probe should - be placed as close as possible to the audio sink, while the DSP is - generally place close to the audio capture. For local testing, one can - use an echo loop pipeline like the following: - autoaudiosrc ! webrtcdsp ! webrtcechoprobe ! autoaudiosink - This pipeline should produce a single echo rather then repeated echo. - Those elements works if they are placed in the same top level pipeline. - https://bugzilla.gnome.org/show_bug.cgi?id=767800 - -2016-06-21 11:46:44 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * common: - Automatic update of common submodule - From ac2f647 to f363b32 - -2016-03-22 16:51:53 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - glcontext/wgl: try wglCreateContextAttribsARB even not gl3 core profile - https://bugzilla.gnome.org/show_bug.cgi?id=764018 - -2016-06-21 18:28:46 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: fix get_current_gl_api() on win32 - Another case of incorrect calling conventions. - Using this function on win32 would corrupt the stack pointer and end in - massive hilarity. - -2016-06-15 12:47:05 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglsl.c: - * gst-libs/gst/gl/gstglsl_private.h: - * gst-libs/gst/gl/gstglviewconvert.c: - glsl: fixup external-oes shaders by mangling the required extension - Newer devices require using a different GLSL extension for accessing - external-oes textures in a shader using the texture() functions. - While the GL_OES_EGL_image_external_essl3 should supposedly be supported - on a any GLES3 android device, the extension was defined after a lot of the - older drivers were built so they will not know about it. Thus there are two - possible interpretations of which of texture2D() should be supported for - external-oes textures. Strict adherence to the GL_OES_EGL_image_external - extension spec which uses texture2D() or following GLES3's pattern, also - allowing texture() as a function for accessing external-oes textures - This adds another mangling pass to convert - #extension GL_OES_EGL_image_external : ... - into - #extension GL_OES_EGL_image_external_essl3 : ... - on GLES3 and when the GL_OES_EGL_image_external_essl3 extension is supported. - Only uses texture() when the GLES3 and the GL_OES_EGL_image_external_essl3 - extension is supported for external-oes textures. - Uses GLES2 + texture2D() + GL_OES_EGL_image_external in all other external-oes - cases. - https://bugzilla.gnome.org/show_bug.cgi?id=766993 - -2016-05-24 16:26:24 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/winks/ksdeviceprovider.c: - * sys/winks/kshelpers.c: - * sys/winks/kshelpers.h: - winks: Port to MSVC and pretend to be Windows XP - strcasecmp is not defined on MSVC, so just use the glib wrapper. Also pretend to - be Windows XP explicitly since the API we use was deprecated and removed - (ifdef-ed) from the SDK after this version of Windows. This will be especially - relevant once we stop supporting Windows XP soon: - https://bugzilla.gnome.org/show_bug.cgi?id=756866 - -2016-03-02 02:17:54 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * win32/common/libgstadaptivedemux.def: - * win32/common/libgstbadaudio.def: - * win32/common/libgstbadbase.def: - * win32/common/libgstbadvideo.def: - * win32/common/libgstbasecamerabinsrc.def: - * win32/common/libgstinsertbin.def: - * win32/common/libgstmpegts.def: - * win32/common/libgsturidownloader.def: - win32: Add missing def files for libraries - -2016-03-02 00:55:15 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstwavescope.c: - build: Factor out endian-order RGB formats - MSVC seems to ignore preprocessor conditionals inside static pad templates - -2016-06-13 22:29:39 -0400 Aaron Boxer <boxerab@gmail.com> - - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegdec.h: - openjpegdec: use sampling field to determine RGB channel - https://bugzilla.gnome.org/show_bug.cgi?id=767402 - -2016-06-02 13:53:38 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * tests/check/elements/templatematch.c: - templatematch: fix buffer leak in test - Need to call gst_check_drop_buffers() to unref the buffers exchanged - during the test. - https://bugzilla.gnome.org/show_bug.cgi?id=767159 - -2016-05-19 13:31:56 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * tests/check/elements/glimagesink.c: - glimagesink: fix query leak in test - https://bugzilla.gnome.org/show_bug.cgi?id=766663 - -2016-05-19 13:29:15 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * tests/check/elements/glimagesink.c: - glimagesink: properly setup/teardown tests - tcase_add_checked_fixture() is suppose to call the setup and teardown - functions so the tests don't have to do it manually. - https://bugzilla.gnome.org/show_bug.cgi?id=766663 - -2016-05-19 13:09:41 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * tests/check/libs/gstglupload.c: - glupload: fix shader leak in test - https://bugzilla.gnome.org/show_bug.cgi?id=766663 - -2016-05-19 12:51:17 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * tests/check/elements/uvch264demux.c: - uvch264demux: fix buffer leaks in test - The mock chain functions aren't unreffing the buffers so the caller - should do it. - https://bugzilla.gnome.org/show_bug.cgi?id=766663 - -2016-05-19 12:36:42 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * tests/check/elements/camerabin.c: - camerabin: fix element leak in test - https://bugzilla.gnome.org/show_bug.cgi?id=766663 - -2016-05-19 11:19:57 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * tests/check/elements/autoconvert.c: - fix buffer leaks in tests - gst_check_drop_buffers() release the buffers exchanged during the test. - https://bugzilla.gnome.org/show_bug.cgi?id=766663 - -2016-05-19 11:19:20 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * tests/check/elements/audiomixer.c: - * tests/check/elements/compositor.c: - fix event leaks in tests - The events are supposed to be unreffed when finishing the test, not - reffed. - https://bugzilla.gnome.org/show_bug.cgi?id=766663 - -2016-05-19 11:19:01 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * tests/check/elements/audiointerleave.c: - audiointerleave: fix message leaks by flushing the bus - https://bugzilla.gnome.org/show_bug.cgi?id=766663 - -2016-05-19 11:16:37 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/audio/gstaudioaggregator.c: - audioaggregator: fix buffer leak - If the pad was still owning a buffer when being destroyed it was leaked. - Fix a leak with the test_flush_start_flush_stop test. - https://bugzilla.gnome.org/show_bug.cgi?id=766663 - -2016-05-18 16:58:44 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * tests/check/elements/autoconvert.c: - autoconvert: fix factories leak in test - The factories returned by gst_registry_find_feature() have to be - unreffed. - https://bugzilla.gnome.org/show_bug.cgi?id=766663 - -2016-06-17 14:58:44 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parse: fix default time_offset_length - The default value for time_offset_length should be 24, see - section E2.2 of the H264 spec. - https://bugzilla.gnome.org/show_bug.cgi?id=767792 - -2016-06-17 14:31:42 +0200 Joan Pau Beltran <joanpau.beltran@socib.cat> - - * ext/dc1394/gstdc1394src.c: - dc1394src: check for disabled transmission in _stop_cam - For symetry with _start_cam, check that the transmission - is effectively disabled in _stop_cam. - https://bugzilla.gnome.org/show_bug.cgi?id=763026 - -2016-06-17 15:32:08 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: do not rely on temp var for fail detection - Use errno instead as local var might be overwritten - before the check. - -2016-06-14 15:29:08 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: rework set_pids() - - Reflow to avoid unneeded nesting - - Free aux pids array earlier - - Adjust debug output to deliver more meaningful information - -2016-06-14 14:24:35 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: drop pointless debug msg - -2016-06-09 16:05:39 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: drop all otherwizes - -2016-06-12 13:53:18 -0400 Aaron Boxer <boxerab@gmail.com> - - * gst/videoparsers/gstjpeg2000parse.c: - * gst/videoparsers/gstjpeg2000parse.h: - jpeg2000parse: support j2c format - https://bugzilla.gnome.org/show_bug.cgi?id=767512 - -2016-06-16 01:54:16 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/Makefile.am: - tests/glcontext: link against gstvideo for gst_video_info_* - fixes make distcheck complaining about it. - -2016-04-14 18:14:32 +0300 Sergey Borovkov <sergey.borovkov@wireload.net> - - * configure.ac: - * ext/qt/qtitem.cc: - * gst-libs/gst/gl/egl/gstegl.h: - qml: Enable qmlglsink for eglfs - https://bugzilla.gnome.org/show_bug.cgi?id=763044 - -2016-06-16 00:44:48 +1000 Matthew Waters <matthew@centricular.com> - - * ext/qt/qtitem.cc: - qmlglsink: propagate GL context creation failure upwards - Otherwise an application cannot know if the qmlglsink will be displaying frames - incorrectly/at all. - -2016-06-16 00:44:16 +1000 Matthew Waters <matthew@centricular.com> - - * ext/qt/qtitem.cc: - qmlglsink: also allow wayland-egl as a platform name - -2016-06-12 15:35:28 +0800 Haihua Hu <jared.hu@nxp.com> - - * configure.ac: - * ext/qt/Makefile.am: - * ext/qt/qtitem.cc: - qmlglsink: Add Wayland support - Don't use gstgldisplay to get wayland display. Should use QPA on wayland - to get wayland display for QT. - https://bugzilla.gnome.org/show_bug.cgi?id=767553 - -2016-06-16 00:46:57 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglcontext.c: - tests/glcontext: update test for gen,del_texture removal - -2016-06-14 22:12:18 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/ladspa/gstladspa.c: - ladspa: simplify registry cache structure creation - Create and fill structure in one go. - -2016-06-14 13:48:09 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/gl/effects/gstgleffectssources.c: - gleffects: fix little rectangle that appears at the center of squeeze and tunnel effects - These two shader will calculate the vector length and use it as denominator. - But length could be zero which will cause undefine behaviour. Add protection for - this condition - https://bugzilla.gnome.org/show_bug.cgi?id=767635 - -2016-06-15 18:10:59 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsl.c: - glsl: add some debugging - -2016-06-15 16:08:57 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - glutils: remove unused functions for texture creation/deletion - Everyone uses GstGLMemory now and any future code should as well. - -2016-06-15 15:47:47 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.h: - glfilter: remove unused class fields in/out_tex_id - The functionality is not used by any subclass nor are the values set anywhere. - -2016-06-15 15:08:39 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgldeinterlace.c: - gldeinterlace: remove dead code accessing filter->in_tex_id - It's not set by anyone or anything and gldeinterlace is the only user of it now. - -2016-06-15 14:40:40 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload/meta: remove unneeded texture deletion - The textures are managed by the GstGLMemory inside the output buffer. Freeing - them prematurely may result in a use-after-free. - -2016-05-30 14:10:23 +0200 Aleix Conchillo Flaqué <aleix@oblong.com> - - * ext/srtp/gstsrtpenc.c: - * ext/srtp/gstsrtpenc.h: - srtpenc: remove get-rollover-counter signal and add stats property - We remove get-rollover-counter signal in favor of the "stats" - property. The "stats" property is a GstStructure with caps - application/x-srtp-encoder-stats that contains an array of - structures with caps application/x-srtp-stream. - Each stream structure contains "ssrc" and "roc" fields. - https://bugzilla.gnome.org/show_bug.cgi?id=733265 - -2016-05-25 12:55:36 +0200 Mats Lindestam <matslm@axis.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: support for handling of config-interval = -1 - Added support for handling of config-interval = -1. - config-inteval = -1 represents resending SPS and PPS for each - I-/IDR-frame. - https://bugzilla.gnome.org/show_bug.cgi?id=766803 - -2016-05-25 12:45:17 +0200 Mats Lindestam <matslm@axis.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: refactored handling of SPS/PPS when pushing frames - https://bugzilla.gnome.org/show_bug.cgi?id=766803 - -2016-05-25 11:54:55 +0200 Mats Lindestam <matslm@axis.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: change "config-interval" property type from uint to int - So we can use -1 as special value like in rtph264pay. - https://bugzilla.gnome.org/show_bug.cgi?id=766803 - -2016-06-13 09:20:22 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/avfassetsrc.m: - avfassetsrc: Don't escape the URI before passing it to NSURL - The URI must already be escaped by the caller, we don't support passing around - invalid (unescaped) URIs via the GstURIHandler interface. - Also it will escape too much of the URI in this case, e.g. - ipod-library://item/item.m4a?id=3143338395173862951 - becomes - ipod-library://item/item.m4a%3Fid%3D3143338395173862951 - https://bugzilla.gnome.org/show_bug.cgi?id=767492 - -2016-06-13 09:20:02 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/iosassetsrc.m: - iosassetsrc: Print the correct URI if it was rejected - We were printing the previously set URI instead of the new one. - -2016-06-09 01:20:36 +0200 Sebastian Rasmussen <sebrn@axis.com> - - * ext/curl/gstcurlsmtpsink.c: - curlsmtpsink: Lock and don't send final boundary upon error - Previously GstCurlSmtpSink could cause the pipeline thread to end up - waiting for a stopped thread to perform work. - The scenario was that the sink could be rendering a buffer and waiting - for the curl transfer thread to have sent the data. As soon as the - transfer thread has copied all data to curl's data buffer in - gst_curl_base_sink_transfer_read_cb() then the render call would stop - waiting and return GST_FLOW_OK. While this takes place the transfer - thread may suffer from an error e.g. due gst_poll_wait() timing out. - This causes the transfer thread to record the error, claim (it is not - really true since there was an error) that the data has been sent and - that a response has been received by trying to signal the pipeline - thread (but this has already stopped waiting). Finally the transfer - thread stops itself. A short while later the pipeline thread may attempt - to push an EOS event into GstCurlSmtpSink. Since there is no check in - gst_curl_smtp_sink_event() to check if the sink has suffered from any - error it may attempt to add a final boundary and ask the, now deceased, - transfer thread to transfer the new data. Next the sink element would - have waited for the transfer to complete (using a different mechanism - than normal transfers through GstCurlBaseSink). In this case there was - an error check to avoid waiting if an error had already been seen. - Finally GstCurlSmtpSink would chain up to GstCurlBaseSink which would - then block waiting for a response (normally this would be prevented by - the transfer thread suffering the error claiming that it had been - received, but GstCurlSmtpSink clobbered this flag after the fact). - Now GstCurlSmtpSink avoids this by locking over the entire event handing - (preventing simultaneous changes to flags by the two threads) and also - by avoiding to initiate transfer of final boundary if an error has - already been seen. - Also add GST_FIXME() for remaining similar issue where the pipeline - thread may block indefinitely waiting for transfer thread to transfer - data but the transfer thread errors out and fails to notify the pipeline - thread that the transfer failed. - https://bugzilla.gnome.org/show_bug.cgi?id=767501 - -2016-06-08 11:32:28 -0400 Aaron Boxer <boxerab@gmail.com> - - * gst/videoparsers/gstjpeg2000parse.c: - * gst/videoparsers/gstjpeg2000parse.h: - * gst/videoparsers/gstjpeg2000sampling.h: - jpeg2000parse: Require either colorspace or sampling field in sink caps - And always set the sampling field on the src caps, if necessary guessing a - correct value for it from the colorspace field. - Also, did some cleanup: removed sampling enum - redundant. - https://bugzilla.gnome.org/show_bug.cgi?id=766236 - -2016-06-10 11:32:46 +0300 Heinrich Fink <hfink@toolsonair.com> - - * ext/opencv/gstfacedetect.cpp: - facedetect: Fix compiler warning with clang 3.8 - Use namespace only after it was actually defined by a header. - gstfacedetect.cpp:79:17: error: using directive refers to implicitly-defined namespace 'std' -Werror - using namespace std; - ^ - -2016-06-06 16:35:15 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: unify exit paths on _start() - -2016-06-06 15:31:31 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: use proper acronym for PID (Packet Identifier) - Drop formatting tab from message while at it. - -2016-06-06 12:25:22 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: set common PES filter params once and reuse - Avoid setting the same harcoded values over and over again. - -2016-06-09 22:01:45 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/dc1394/gstdc1394src.c: - dc1394src: minor clean-up - We always call _parse_caps() with non-NULL out vars. - -2016-06-09 22:01:13 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/dc1394/gstdc1394src.c: - dc1394src: fix some more c99-isms - -2016-06-09 21:47:05 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/Makefile.am: - docs: fix for renamed dc1394 source file - https://bugzilla.gnome.org/show_bug.cgi?id=763026 - -2016-06-07 15:50:50 +0200 Joan Pau Beltran <joanpau.beltran@socib.cat> - - * ext/dc1394/Makefile.am: - * ext/dc1394/gstdc1394src.c: - * ext/dc1394/gstdc1394src.h: - dc1394src: prefix and file names according to Gstreamer conventions - Replace the type and function prefix to follow the conventions: - - Use `GST_TYPE_DC1394_SRC` instead of `GST_TYPE_DC1394`. - - Use `GstDC1394Src` and `GstDC1394SrcClass` instead of - `GstDc1394` and `GstDc1394Class`. - - Use `gst_dc1394_src` instead of `gst_dc1394`. - https://bugzilla.gnome.org/show_bug.cgi?id=763026 - -2016-05-10 18:30:35 +0200 Joan Pau Beltran <joanpau.beltran@socib.cat> - - * configure.ac: - * ext/dc1394/Makefile.am: - * ext/dc1394/gstdc1394.c: - * ext/dc1394/gstdc1394.h: - dc1394src: port to 1.X - The dc1394src is a PushSrc element for IIDC cameras based on libdc1394. - The implementation from the 0.x series is deffective: - caps negotiation does not work, and some video formats - provided by the camera are not supported. - Refactor the code to port it to 1.X and enhance the support - for the full set of video options of IIDC cameras: - - The IIDC specification includes a set of camera video modes - (video format, frame size, and frame rates). - They do not map perfectly to Gstreamer formats, but those that - do not match are very rare (if used at all by any camera). - In addition, although the specification includes a raw format, - some cameras use mono video formats to capture in Bayer format. - Map corresponding video modes to Gstreamer formats in capabilities, - allowing both gray raw and Bayer video formats for mono video modes. - - The specification includes scalable video modes (Format7), - where the frame size and rate can be set to arbitrary values - (within the limits of the camera and the bus transport). - Allow the use of such mode, using the frame size and rate - from the negotiatied caps, and set the camera frame rate - adjusting the packet size as in: - <http://damien.douxchamps.net/ieee1394/libdc1394/faq/#How_do_I_set_the_frame_rate> - The scalable modes also allow for a custom ROI offset. - Support for it can be easily added later using properties. - - Camera operation using libdc1394 is as follows: - 1. Enumerate cameras on the system and open the camera - identified the enumeration index or by a GUID (64bit hex code). - 2. Query the video formats supported by the camera. - 3. Configure the camera for the desired video format. - 4. Setup the capture resources for the configured video format - and start the camera transmission. - 5. Capture frames from the camera and release them when not used. - 6. Stop the camera transmission and clear the capture resources. - 7. Close the camera freeing its resources. - Do steps 2 and 3 when getting and setting the caps respectively. - Ideally 4 and 6 would be done when going from PAUSED to PLAYING - and viceversa, but since caps might not be set yet, the video mode - is not properly configured leaving the camera in a broken state. - Hence, setup capture and start transmission in the set caps method, - and consequently clear the capture and stop the transmission - when going from PAUSED to READY (instead of PLAYING to PAUSED). - Symmetrycally, open the camera when going from READY to PAUSED, - allowing to probe the camera caps in the negotiation stage. - Implement that using the `start` and `stop` methods of `GstBaseSrc`, - instead of the `change-state` method of `GstElement`. - Stop the camera before setting new caps and restarting it again - to handle caps reconfiguration while in PLAYING (it has no effect - if the camera is not started). - - Create buffers copying the bytes of the captured frames. - Alternatively, the buffers could just wrap the bytes of the frames, - releasing the frame in the buffer's destroy notify function, - if all buffers were destroyed before going from PLAYING to PAUSED. - - No timestamp nor offset is set when creating buffers. - Timestamping is delegated to the parent class BaseSrc, - setting `gst_base_src_set_live` TRUE, `gst_base_src_set_format` - with GST_FORMAT_TIME and `gst_base_src_set_do_timestamp`. - Captured frames have a timestamp field with the system time - at the completion of the transmission of the frame, - but it is not sure that this comes from a monotonic clock, - and it seems to be left NULL in Windows. - - Use GUID and unit properties to select the camera to operate on. - The camera number used in version 0.X does not uniquely identify - the device (it depends on the set of cameras currently detected). - Since the GUID is 64bit identifier (same as MAC address), - handle it with a string property with its hexadecimal representation. - For practicality, operate on the first camera available if the GUID - is null (default) and match any camera unit number if unit is -1. - Alternatively, the GUID could be handed with an unsigned 64 bit - integer type property, using `0xffffffffffffffff` as default value - to select the first camera available (it is not a valid GUID value). - - Keep name `GstDc1394` and prefix `gst_dc1394` as in version 0.X, - although `GstDC1394Src` and `gst_dc1394_src` are more descriptive. - - Adjust build files to reenable the compilation of the plugin. - Remove dc1394 from the list of unported plugins in configure.ac. - Add the missing flags and libraries to Makefile. - Use `$()` for variable substitution, as many plugins do, - although other plugins use `@@` instead. - https://bugzilla.gnome.org/show_bug.cgi?id=763026 - -2016-06-08 18:02:32 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Move SEEK handling to a separate function - Just for code readability. Doesn't change behaviour - -2016-06-07 21:10:04 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/webp/gstwebpdec.c: - webpdec: Wait for segment event before checking it - The heuristic to choose between packetise or not was changed to use the - segment format. The problem is that this change is reading the segment - during the caps event handling. The segment event will only be sent - after. That prevented the decoder to go in packetize mode, and avoid - useless parsing. - https://bugzilla.gnome.org/show_bug.cgi?id=736252 - -2016-06-07 21:04:21 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/vmnc/vmncdec.c: - vmncdec: Wait for segment event before checking it - The heuristic to choose between packetise or not was changed to use the - segment format. The problem is that this change is reading the segment - during the caps event handling. The segment event will only be sent - after. That prevented the decoder to go in packetize mode, and avoid - useless parsing. - https://bugzilla.gnome.org/show_bug.cgi?id=736252 - -2016-06-07 14:15:41 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/openjpeg/gstopenjpegenc.c: - openjpeg: fix builddir != srcdir build, and distcheck - -2016-06-01 19:02:33 -0400 Aaron Boxer <boxerab@gmail.com> - - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstjpeg2000parse.c: - * gst/videoparsers/gstjpeg2000parse.h: - * gst/videoparsers/gstjpeg2000sampling.h: - * gst/videoparsers/plugin.c: - jpeg2000parse: Add JPEG2000 parser element - https://bugzilla.gnome.org/show_bug.cgi?id=766236 - -2016-06-01 19:01:44 -0400 Aaron Boxer <boxerab@gmail.com> - - * ext/openjpeg/gstopenjpegenc.c: - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstjpeg2000sampling.h: - openjpeg: set sampling in the caps - https://bugzilla.gnome.org/show_bug.cgi?id=766236 - -2016-05-02 17:38:50 +0200 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Set PTS on aligned buffers - This was broken in 09c05df (make "alignment" property more useful for - packetisation). - https://bugzilla.gnome.org/show_bug.cgi?id=765926 - -2016-06-07 17:22:01 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: always drain in ::negotiate - Move calling gst_vtdec_push_frames_if_needed from ::set_format to ::negotiate so - that we always drain even when renegotiation is triggered by downstream. - -2016-06-07 16:00:01 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: try to preserve downstream caps order - vtdec specifies sysmem; GLMemory as template caps. When negotiating, we used to - call gst_pad_peer_query_caps (..., filter) with our template caps as filter. The - query does gst_caps_intersect (filter, peercaps) internally which gives - precedence to the order of the filter caps. While we want to output sysmem by - default, when negotiating with glimagesink which returns GLMemory; sysmem; we - do want to do GL, so we now query using a NULL filter and intersect the result - with our template caps giving precedence to downstream's caps. - tl;dr: make sure we end up negotiating GLMemory with glimagesink - -2016-06-06 14:08:43 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gstahcsrc.c: - ahcsrc: Avoid a div by 0 warning - https://bugzilla.gnome.org/show_bug.cgi?id=767302 - -2016-06-06 12:38:45 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * sys/androidmedia/gstamcvideoenc.c: - amcvideoenc: Do not call gst_object_unref on GstCaps - https://bugzilla.gnome.org/show_bug.cgi?id=767298 - -2016-05-19 11:16:50 +0200 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Set DISCONT on startup, resume and after seeks - Initial buffers after STREAM_START and seeks should always have the - DISCONT flag set. - https://bugzilla.gnome.org/show_bug.cgi?id=766650 - -2015-09-23 02:51:57 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: Change the pad naming scheme to include a generation ID - A simple fix for the problem of creating new pads with duplicate - names when switching program, easier than the alternative of - trying to work out which pads might persist and manage that. - See https://bugzilla.gnome.org/show_bug.cgi?id=758454 - -2016-06-06 11:13:00 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: pause() should not inhibit signals but work exactly like play() - https://bugzilla.gnome.org/show_bug.cgi?id=766607#c23 - -2016-06-03 15:58:52 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: improve description of PIDs property - -2016-06-03 07:11:33 +0200 Edward Hervey <bilboed@bilboed.com> - - * sys/applemedia/Makefile.am: - applemedia: Only use the OpenGL framework on OSX - It's not available on ios (uses OpenGLES already) - https://bugzilla.gnome.org/show_bug.cgi?id=766973 - -2016-05-17 17:14:49 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/video/gstvideoaggregator.c: - gst-libs: gl, video: use MAY_BE_LEAKED flag - https://bugzilla.gnome.org/show_bug.cgi?id=767162 - -2016-05-18 12:48:48 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * sys/bluez/gsta2dpsink.c: - a2dpsink: unref avdtpsink if state transition failed - If for some reason the avdtpsink element can't go READY then the - gsta2dpsink can't either and so should release the ressources it - allocates when trying to do so. - Fix a leak with the generic/states test. - https://bugzilla.gnome.org/show_bug.cgi?id=767161 - -2016-05-28 21:34:52 +0200 Havard Graff <havard.graff@gmail.com> - - * sys/applemedia/Makefile.am: - applemedia: CGLTexImageIOSurface2D needs the OpenGL framework on OSX - https://bugzilla.gnome.org/show_bug.cgi?id=766973 - -2016-05-28 21:39:00 +0200 Havard Graff <havard.graff@gmail.com> - - * sys/applemedia/avsamplevideosink.m: - avsamplevideosink: check we are compiling for 10.1 up to 10.4 - This API was deprecated in 10.4, so don't use it for 10.5 and onwards. - https://bugzilla.gnome.org/show_bug.cgi?id=766973 - -2016-06-01 13:43:32 +0200 Heinrich Fink <hfink@toolsonair.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - applemedia: vtenc: Register a hardware-only vtenc_h264_hw element on OSX - Similar to vtdec_hw, this commit adds a vtenc_h264_hw element that fails - caps negotiation unless a hardware encoder could actually be acquired. - This is useful in situations where a fallback to a software encoder - other than the vtenc_h264 software encoder is desired (e.g. to x264enc). - https://bugzilla.gnome.org/show_bug.cgi?id=767104 - -2016-06-02 16:30:02 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: make vtdec_hw fallback to software on renegotiation - When renegotiating mid stream - for example with variable bitrate - streams - and therefore destroying and recreating VTSessions, the - hw decoder might become temporarily unavailable. - To deal with this and avoid erroring out on bitrate changes, - vtdec_hw now falls back to using the software decoder if the hw - one was available at some point but isn't anymore. At - renegotiation/bitrate change time, it will still retry to open - the hardware one. - -2016-06-02 13:10:51 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: fix switching from GLMemory to Sysmem - When renegotiating from GLMemory to Sysmem do teardown the texture_cache. - Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=766190 - -2016-06-02 11:36:57 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: optimize renegotiation - ::negotiate can be called several times before the CAPS event is sent downstream - so use the currently configured output state caps instead of the pad current - caps when deciding whether to recreate the VTSession or not. - This leads to creating/destroying less VTSessions which makes renegotiation more - reliable especially when using hw decoding. - -2016-06-01 13:52:10 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: remove comment on self-explanatory code - -2016-06-01 13:18:21 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: avoid out-bound write on PID filter array - There's no need for an end-of-list marker in the filter - PIDs array if full, as the absolute maximum number of - elements (MAX_FILTERS) is known. - CID #1362441 - -2016-05-31 20:41:14 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/androidmedia/gstahcsrc.c: - androidmedia: fix error debug message when camera doesn't exist - Makes no sense to include the system error here since errno - will likely not be set and then it says 'system error: success' - which is confusing. - https://bugzilla.gnome.org/show_bug.cgi?id=767087 - -2016-05-31 18:58:43 +0900 Justin Kim <justin.kim@collabora.com> - - * sys/androidmedia/gstahcsrc.c: - ahcsrc: release resources in 'finalize' function - In general, 'dispose' function is used for dropping all references - and 'finalize' is called for releasing instances. - https://bugzilla.gnome.org/show_bug.cgi?id=763309 - -2016-05-25 15:01:31 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/player/gstplayer.c: - * tests/check/libs/player.c: - player: inhibit signals after gst_player_stop() has been called - Also wait for the state change to STOP to have been announced before - destroying the player so it won't appear as leaked by leak detector - tools. - https://bugzilla.gnome.org/show_bug.cgi?id=766607 - -2016-05-25 12:48:13 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * tests/check/libs/player.c: - player: handle uri-loaded in test - Had to adapt the existing tests because of this new callback. - https://bugzilla.gnome.org/show_bug.cgi?id=766607 - -2016-05-25 16:57:49 -0700 Scott D Phillips <scott.d.phillips@intel.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Don't assume contiguous id's in make_codec_data - vps/sps/pps id's are not required to be used contiguously. - https://bugzilla.gnome.org/show_bug.cgi?id=766891 - -2016-05-28 01:22:32 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add sample ATSC launch line - -2016-05-28 21:36:04 +0200 Havard Graff <havard.graff@gmail.com> - - * gst-libs/gst/gl/gstglquery.c: - gl: glquery: cast to silence compiler warning - https://bugzilla.gnome.org/show_bug.cgi?id=766973 - -2016-05-28 21:35:37 +0200 Havard Graff <havard.graff@gmail.com> - - * ext/gl/gstgltestsrc.h: - gltestsrc: gltestsrc.h already defines GstGLTestSrc - And redefinition is not allowed. - https://bugzilla.gnome.org/show_bug.cgi?id=766973 - -2016-05-27 23:24:54 +0200 Havard Graff <havard.graff@gmail.com> - - * gst-libs/gst/player/gstplayer.c: - player: use correct _NONE enum - https://bugzilla.gnome.org/show_bug.cgi?id=766973 - -2016-05-28 10:44:04 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: maintain minimal ABI compat - Because we can. - https://bugzilla.gnome.org/show_bug.cgi?id=723352 - -2014-05-22 16:12:01 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: Remove unused fps_num/fps_den fields - Instead the newly added function should be used to calculate - the framerate properly. - https://bugzilla.gnome.org/show_bug.cgi?id=723352 - -2016-05-25 10:59:00 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/smoothstreaming/gstmssmanifest.c: - smoothstreaming: update fps calculation for h264 codec parser API changes - Use new gst_h264_video_calculate_framerate() API instead of fps_n/fps_d - fields in SPS struct which are to be removed. - Apparently H264 content in MSS is always non-interlaced/progressive, - so we can just pass 0 for field_pic_flag and don't need to parse any - slice headers first if there's no external signalling. But even if - that's not the case the new code is not worse than the existing code. - https://msdn.microsoft.com/en-us/library/cc189080%28VS.95%29.aspx - https://bugzilla.gnome.org/show_bug.cgi?id=723352 - -2016-05-26 10:28:14 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: use single marker at end of filtering PID list - Avoids at least ~100 unneeded assignment operations at runtime - -2016-05-23 16:31:05 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: simplify reporting of set polarity - -2016-05-23 14:41:40 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix bandwidth-hz property description - Bandwidth Hz is no longer a DVBT-only property - -2016-05-23 14:02:10 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix usage of PES & DVR acronyms everywhere - Additionally, improve message on gst_poll_new() failure - -2016-05-26 20:16:07 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: always unref the context on a collision - Otherwise we will leak GstGLContext's when adding the same context more than - once. - Fixes a regression caused by 5f9d10f6036068502ad23e1ec86a73e341801ae1 in the - gstglcontext unit test that failed with: - Assertion 'tmp == NULL' failed - -2016-05-25 13:38:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - Revert "aggregator: Start the task when linked" - This reverts commit 302580c3815136d29479c3a8cae611d6e2ff3709. - -2016-05-20 14:34:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/caopengllayersink.h: - * ext/gl/caopengllayersink.m: - caopengllayersink: Don't cache buffer pool - Pools cannot be used by the two elements at the same time. - https://bugzilla.gnome.org/show_bug.cgi?id=766611 - -2016-04-13 16:30:28 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Start the task when linked - Until now we would start the task when the pad is activated. Part of the - activiation concist of testing if the pipeline is live or not. - Unfortunatly, this is often too soon, as it's likely that the pad get - activated before it is fully linked in dynamic pipeline. - Instead, start the task when the first serialized event arrive. This is - a safe moment as we know that the upstream chain is complete and just - like the pad activation, the pads are locked, hence cannot change. - https://bugzilla.gnome.org/show_bug.cgi?id=757548 - -2016-05-25 09:09:01 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - gl: win32: Add debug category in gstglcontext_wgl.c - https://bugzilla.gnome.org/show_bug.cgi?id=766867 - -2016-05-16 20:02:28 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - glimagesink: support video rotation using transform matrix - Add "rotate-method" to glimagesink and apply transform matrix - to vertex coordinate to control rotation. - https://bugzilla.gnome.org/show_bug.cgi?id=765795 - -2016-05-24 23:39:27 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglbasemixer.c: - glvideomixer: fix race retrieving the GL context from the display - _get_gl_context() can be called concurrently from either propose_allocation() or - decide_allocation(). If it so happens that this happens at the same time, - the check for whether we already had a GL context was outside the lock. Inside - the lock and loop, the first thing that happens is that we unref the current GL - context (if valid) as if there was a conflict adding it to the display. If the - timing was unlucky, subsequent use of the GL context would be referencing an - already unreffed GL context object resulting in a critical: - g_object_ref: assertion 'object->ref_count > 0' failed - https://bugzilla.gnome.org/show_bug.cgi?id=766703 - -2016-05-24 23:38:22 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: add some debugging about retrieving GL contexts - -2016-05-25 10:01:38 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimage.c: - eglimage: Re-add accidentially removed GST_DEFINE_MINI_OBJECT_TYPE() - -2016-05-23 15:24:53 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/player/gstplayer.c: - player: fix suburi getter debug message - The property is a string, not a boolean. - https://bugzilla.gnome.org/show_bug.cgi?id=766607 - -2016-05-25 09:53:15 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Don't set subtitle URI directly but dispatch to the player thread - Otherwise we do state changes and everything in the application thread, which - might block and more important can cause reentrant signals. - https://bugzilla.gnome.org/show_bug.cgi?id=766607 - -2016-05-23 20:11:17 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimage.c: - eglimage: Ensure that the debug category is always initalized - Before the initializer was only run if dmabuf support was used. - https://bugzilla.gnome.org/show_bug.cgi?id=766794 - -2016-05-24 23:30:09 +1000 Arjen Veenhuizen <arjen.veenhuizen@tno.nl> - - * ext/gl/gstgltransformation.c: - gltransformation: make the pivot-z property READWRITE - Instead of just being READABLE. - https://bugzilla.gnome.org/show_bug.cgi?id=766818 - -2016-05-23 10:40:58 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * ext/gl/gstgltestsrc.c: - gltestsrc: fix src_impl leak - https://bugzilla.gnome.org/show_bug.cgi?id=766661 - -2016-05-24 00:55:11 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/insertbin/Makefile.am: - * gst-libs/gst/mpegts/Makefile.am: - * gst-libs/gst/player/Makefile.am: - g-i: pass compiler env to g-ir-scanner - It's what introspection.mak does as well. Should - fix spurious build failures on gnome-continuous. - -2016-05-24 07:17:22 +1000 Jan Schmidt <jan@centricular.com> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmdec.h: - pnmdec: Fix ASCII parsing - Parse gray16 properly in ascii mode, and fix - some bugs around reading data in chunks when - ascii values cross chunk boundaries - -2016-05-19 01:28:04 +1000 Jan Schmidt <jan@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/pnm.c: - pnm: Add a basic unit test - Test that we can run an encode / decode cycle in various - formats without errors - -2016-05-19 01:04:36 +1000 Jan Schmidt <jan@centricular.com> - - * gst/pnm/gstpnmenc.c: - pnmenc: Make output caps match the srcpad template - Don't output 'image/pnm', which isn't even in the template - caps. Instead, output a mime-type consistent with what we - are encoding. - -2016-05-18 17:19:40 +1000 Jan Schmidt <jan@centricular.com> - - * gst/pnm/gstpnmenc.c: - pnmenc: Tidy up code, support BE/LE GRAY16 properly - Remove code that dealt with odd strides separately - there's - not really any overhead to just using 1 codepath for both matched - and unmatched stride output. - Add separate codepaths for BE vs LE GRAY16 input so they're - handled properly - -2016-05-16 21:22:57 +1000 Jan Schmidt <jan@centricular.com> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmdec.h: - pnmdec: Actually output LE or BE GRAY16 as negotiated - Add codepaths to output GRAY16 in little or big endian - as negotiated. - Move all output format negotiation into a central - function and clean it up - -2015-10-22 17:06:01 +0200 Dimitrios Katsaros <patcherwork@gmail.com> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmdec.h: - * gst/pnm/gstpnmutils.c: - pnmdec: Implementation of GRAY16 handling - https://bugzilla.gnome.org/show_bug.cgi?id=757022 - -2015-10-19 17:15:30 +0200 Dimitrios Katsaros <patcherwork@gmail.com> - - * gst/pnm/gstpnmenc.c: - pnmenc: Implementation of GRAY16 handling - https://bugzilla.gnome.org/show_bug.cgi?id=757022 - -2016-05-20 19:25:57 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/kms/gstkmsbufferpool.c: - kmsbufferpool: error only if no allocator - Do not expect an allocator from the configuration, but expect to have already - one set. - -2016-05-15 11:52:55 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/kms/gstkmssink.c: - kmssink: frame copy log in performance category - Log the message when the frame is going to be copy (worse case) under the - performance log category. - https://bugzilla.gnome.org/show_bug.cgi?id=766466 - -2016-05-15 11:51:22 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/kms/gstkmssink.c: - kmssink: use trace level for buffer render log - Instead of using debug level for logging each buffer rendered, use trace - level. - https://bugzilla.gnome.org/show_bug.cgi?id=766466 - -2016-05-23 17:00:22 +0530 Arun Raghavan <arun@arunraghavan.net> - - * gst-libs/gst/player/gstplayer-media-info.c: - player: Fix documentation for gst_player_video_info_get_framerate() - Document out parameters and fix function name. - -2016-05-18 16:00:47 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * tests/check/libs/player.c: - player: use gst_check_init() in test - Calling GST_DEBUG() in test rely on the default category to be defined, - which is done in gst_check_init(). - https://bugzilla.gnome.org/show_bug.cgi?id=766607 - -2016-05-20 17:28:52 -0400 Aaron Boxer <boxerab@gmail.com> - - * ext/openjpeg/gstopenjpegenc.c: - openjpegenc: enable MCT for RGB video - https://bugzilla.gnome.org/show_bug.cgi?id=766732 - -2016-05-20 14:08:03 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: group DVB-T2 substream-id check with its corresponding set_prop() - -2016-05-20 13:57:45 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add DVB-S2 sub-stream ID check - Disable if invalid (> 255) instead of blindy setting this - property regardless of its actual value. - -2016-05-20 13:47:06 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: clarify consequence of passing a wrong ID to the substream filter - -2016-05-19 17:05:33 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * ext/gl/gltestsrc.c: - gltestsrc: fix shaders ref counting - The gltestsrc element uses two shaders: color_shader and snow_shader. - Those are alternatively assigned to the SrcShader->shader pointer and - their reference was transferred to it. Only the SrcShader->shader was - unreffed (in _src_shader_deinit()) so only one shader was properly - freed, the other one was leaked. - Fixed this by giving an extra ref to SrcShader->shader and unreffing the - 2 shaders in _src_smpte_free(). - https://bugzilla.gnome.org/show_bug.cgi?id=766661 - -2016-05-19 16:55:31 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * ext/gl/gstglmosaic.c: - glmosaic: fix shader leak - gst_gl_mosaic_init_shader() is called twice with test_glmosaic so the - first shader was leaked. - https://bugzilla.gnome.org/show_bug.cgi?id=766661 - -2016-05-16 17:11:53 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - gl: win32: Unparent internal window before destroying it - For some reason DestroyWindow() deadlock if it's called from - parent window's KeyPress event. - https://bugzilla.gnome.org/show_bug.cgi?id=766533 - -2016-05-16 15:26:53 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - gl: win32: Don't steal parent focus when creating internal window - This fix regression introduced by 0acc18c60f6f962cc6553f6047fdb64891bab544. - https://bugzilla.gnome.org/show_bug.cgi?id=766520 - -2016-05-14 11:56:59 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Don't wait if input buffer is after output - If the input buffer is after the end of the output buffer, then waiting - for more data won't help. We will never get an input buffer for this point. - This fixes compositing of streams from rtspsrc. - https://bugzilla.gnome.org/show_bug.cgi?id=766422 - -2016-05-19 09:25:57 -0700 Martin Kelly <martin@surround.io> - - * sys/androidmedia/gst-android-hardware-camera.c: - ahc: fix potential NULL deref - This bug was found via cppcheck static analysis. - If android.hardware.Camera.getParameters returns NULL, then object will - be NULL, and we won't allocate params. This means that the GST_DEBUG - statement referencing params->object will be invalid. Fix this by - exiting early if android.hardware.Camera.getParameters returns NULL. - https://bugzilla.gnome.org/show_bug.cgi?id=766638 - -2016-05-19 11:33:52 -0700 Martin Kelly <martin@surround.io> - - * sys/androidmedia/gstahcsrc.c: - ahc: fix typo in doc blurb - https://bugzilla.gnome.org/show_bug.cgi?id=766679 - -2016-05-18 16:55:38 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix pending tags leak - https://bugzilla.gnome.org/show_bug.cgi?id=766662 - -2016-05-18 12:30:05 +0300 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * sys/kms/gstkmssink.c: - kmssink: chain up finalize method - https://bugzilla.gnome.org/show_bug.cgi?id=766597 - -2016-05-18 12:33:51 -0700 Martin Kelly <martin@surround.io> - - * tests/examples/opencv/gstfacedetect_test.c: - * tests/examples/opencv/gsthanddetect_test.c: - examples: opencv: typo fix - https://bugzilla.gnome.org/show_bug.cgi?id=766639 - -2016-05-18 21:29:15 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/README: - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - * ext/lv2/gstlv2filter.c: - * ext/lv2/gstlv2source.c: - * ext/lv2/gstlv2utils.c: - * ext/lv2/gstlv2utils.h: - lv2: support CVPorts - CVPorts are ports that take a buffer. For now we just fill the buffers with - the control value. - -2016-05-18 21:26:50 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2filter.c: - * ext/lv2/gstlv2source.c: - lv2: use _OBJECT log variants and lower log level when processing - -2016-05-17 14:33:04 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: move ISDB-T bandwidth check to _is_valid_bandwidth() - Allows test to be used for delivery system auto-detection. - Additionally, add 0 (auto) as valid value. - -2016-05-17 14:19:30 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add '0' as a valid value for bandwidth - Underlying API considers this the BANDWIDTH_HZ equivalent - to the old BANDWIDTH_AUTO for BANDWIDTH. - -2016-05-17 13:53:54 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: factor out and reuse DVB-T/T2 bandwidth checks - Use new utility function as an additional check for delivery - system auto-detection. - -2016-05-17 12:06:45 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: recognize additional bandwidths at zap parsing - Previously ignored 1.712, 5 and 10 MHz values are also valid - -2016-05-16 12:27:50 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - videoaggregator: canonicalise function names - Had to be done at some point: - gst_videoaggregator_* -> gst_video_aggregator_* - Also fix up some function names with typos. - -2016-05-15 23:31:33 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - lv2: cleanup the predicates - Use the defines from the headers and get rid of our own namespace defines. - Replace the 'role' prop with 'designation'. - -2016-05-15 23:27:22 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2utils.c: - lv2: tweak enum logging - Log more details when we find a bad scalepoint and downgrade the logging of the - good enum valzes. - -2016-05-15 22:05:43 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/README: - * ext/lv2/gstlv2utils.c: - lv2: generate enums from scalepoints - Plugins can provide a set of named values for a control port. Ideally only those - values are set for the property. Check if all scalepoints are integers and if so - generate an enum type. - -2016-05-15 19:45:26 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2utils.c: - lv2: reduce log spam for property bounds - Only complain about bad bounds, if the plugin actually set those. Otherwise - silently adjust our defaults. - -2016-05-15 17:58:51 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - lv2: remove lv2_symbol_pred - We're not actually using it. - -2016-05-15 17:54:06 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2source.c: - lv2: remove leftover FIME - -2016-05-15 00:41:12 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: special case detection when DVB-T and T2 seem valid - There is no way to tell one over the other when parameters - seem valid for DVB-T and DVB-T2 and the adapter supports - both. Reason to go with the former here is that, from - experience, most DVB-T2 channels out there seem to use - parameters that are not valid for DVB-T, like QAM_256 - https://bugzilla.gnome.org/show_bug.cgi?id=765731 - -2016-05-14 23:32:49 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add transmission mode check for DTMB - -2016-05-13 01:54:56 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: use proper fe_spectral_inversion enum identifiers - -2016-05-13 01:25:08 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: explicitly disable stream filter for invalid ids - -2016-05-13 00:50:45 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: do not assume DVB-T from zap file alone - DVB-T/T2 have the same number of fields so we were - wrongly assuming DVB-T for DVB-T2 broadcasts. Not - setting the delivery system here allows for dvbsrc - to make an informed guess based on the channel - parameters. - -2016-05-13 00:12:33 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: consider transmission mode for delsys autodetection - -2016-05-13 00:04:08 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: factor out transmission mode check against delsys - -2016-05-12 16:43:09 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: improve delivery system autodetection - -2016-05-12 14:12:09 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add modulation checks for DVB-T and T2 - -2016-05-15 14:46:40 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/ladspa/gstladspa.c: - ladspa: use _OBJECT log variants for plugin_init - Also trim leading whitespae. - -2016-05-15 14:45:15 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/README: - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - * ext/lv2/gstlv2filter.c: - * ext/lv2/gstlv2source.c: - * ext/lv2/gstlv2utils.c: - * ext/lv2/gstlv2utils.h: - lv2: add registry caching - Use the plugin_cache extra data to avoid introspecting over and over again. - -2016-05-14 12:35:15 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/README: - * ext/lv2/gstlv2utils.c: - lv2: implemnt the map-extension - This is the most used one and at the same time easy to implement sing QGQuark. - -2016-05-14 12:34:10 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2utils.c: - * ext/lv2/gstlv2utils.h: - lvs: add require_feature checks - Plugins can report what host features they need. Since we start to implement host feature - check which plugins we can no suuport. - -2016-05-15 14:34:33 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/compositor/compositor.c: - compositor: Check if we get a valid display ratio - As is done everywhere else, and avoids setting bogus values - And remove useless *<val> checks (we always provide valid values and - it's an internal function). - CID #1320700 - -2016-05-15 14:16:55 +0200 Edward Hervey <bilboed@bilboed.com> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: Remove dead assignments - * read is only used within the while loop - * todo and bsize only need to be assigned once - -2016-05-15 15:11:10 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Add uri-loaded signal that is fired whenever a new URI is actually loaded - This allows knowing the "boundary" from which on all following signals are for - the new URI. - https://bugzilla.gnome.org/show_bug.cgi?id=766062 - -2016-05-14 17:05:45 +0100 Matthew Waters <matthew@centricular.com> - - * ext/opencv/gstfacedetect.cpp: - opencv/facedetect: fix the build with opencv 3.1.0 - - add using namespace std; for std::vector - - use the cpp header imgproc.hpp file for the cv::ellipse function instead of - the C header - - Mat no longer takes IplImage in it's constructors, use the cvarrtomat() - function instead. - Fixes a couple of build errors: - gstfacedetect.cpp:140:30: error: ‘vector’ does not name a type - structure_and_message (const vector < Rect > &rectangles, const gchar * name, - ^~~~~~ - gstfacedetect.cpp:140:37: error: expected ‘,’ or ‘...’ before ‘<’ token - structure_and_message (const vector < Rect > &rectangles, const gchar * name, - ^ - gstfacedetect.cpp: In function ‘void structure_and_message(int)’: - gstfacedetect.cpp:143:13: error: ‘rectangles’ was not declared in this scope - Rect sr = rectangles0; - ... - gstfacedetect.cpp: In function ‘void - gst_face_detect_run_detector(GstFaceDetect*, cv::CascadeClassifier*, gint, gint, - cv::Rect, std::vector<cv::Rect_<int> >&)’: - gstfacedetect.cpp:562:31: error: no matching function for call to - ‘cv::Mat::Mat(IplImage*&, cv::Rect&)’ - Mat roi (filter->cvGray, r); - ... - gstfacedetect.cpp: In function ‘GstFlowReturn - gst_face_detect_transform_ip(GstOpencvVideoFilter*, GstBuffer*, IplImage*)’: - gstfacedetect.cpp:594:44: error: no matching function for call to - ‘cv::Mat::Mat(cv::Mat, bool)’ - Mat mtxOrg (cv::cvarrToMat (img), false); - ... - gstfacedetect.cpp:734:79: error: ‘ellipse’ was not declared in this scope - ellipse (mtxOrg, center, axes, 0, 0, 360, Scalar (cr, cg, cb), 3, 8, - 0); - -2016-05-15 11:20:21 +0100 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - build: add removed example dir to CRUFT_DIRS - -2016-05-15 13:33:53 +0300 Sebastian Dröge <sebastian@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - docs: Update for git master - -2016-03-04 22:10:47 +0100 Carlos Rafael Giani <dv@pseudoterminal.org> - - * gst/rawparse/Makefile.am: - * gst/rawparse/gstaudioparse.c: - * gst/rawparse/gstunalignedaudioparse.c: - * gst/rawparse/gstunalignedaudioparse.h: - * gst/rawparse/plugin.c: - * gst/rawparse/unalignedaudio.h: - rawparse: Add unaligned raw audio parsing to audioparse and add new element - This helps in cases where raw audio data is being delivered, but the - buffers do not come in sample aligned sizes. The new unalignedaudioparse - bin can be autoplugged and configures an internal audioparse element to - align the data. audioparse itself gets support for audio/x-unaligned-raw - input caps; the output caps then contain the same information, except that - the name is changed to audio/x-raw (since audioparse aligns the data). - This ensures that souphttpsrc ! audioparse still works. - https://bugzilla.gnome.org/show_bug.cgi?id=689460 - -2016-05-15 13:14:41 +0300 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: demote no platform display debug to info - Avoids confusing everyone with a warning that's not always fatal. - https://bugzilla.gnome.org/show_bug.cgi?id=746933 - -2016-05-15 12:31:38 +0300 Matthew Waters <matthew@centricular.com> - - * .gitignore: - .gitignore: remove non-existent directory - Partially reverts cdf91c455d4057a9d234766510bd2e8a44e1ed05 - -2016-05-15 19:05:48 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Handle system header when scanning for timestamps. - When scanning for SCR / PTS / DTS, handle the case where - the pack header is followed by the optional system header, - so we can correctly collect timestamps in such cases. - https://bugzilla.gnome.org/show_bug.cgi?id=623860 - -2016-05-15 19:04:20 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Fix backward timestamp scan on small files. - When the file size is smaller than the configured 4MB scan - limit for timestamps, don't underflow the guard variable - when checking if it's time to stop. - Limit the backward SCR scan to the same 4MB as the PTS scan. - Add some comments. - -2016-05-13 13:27:37 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: don't do bogus adjustments on seek if we have no first_pts - Fixes bogus segment and gap events with start=GST_CLOCK_TIME_NONE if - we failed to find a first_pts. - https://bugzilla.gnome.org/show_bug.cgi?id=623860 - -2016-05-14 16:59:14 +0300 Alex-P. Natsios <drakevr@2f30.org> - - * configure.ac: - configure: check for shm_open() in OpenBSD - In OpenBSD there is no "actual" librt that programs can link with, - instead the system/base libc provides the functions one would - customarily find there. - https://bugzilla.gnome.org/show_bug.cgi?id=766441 - -2016-05-14 16:32:06 +0300 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltransformation.c: - * ext/gl/gstgltransformation.h: - gltransformation: use the affine transformation meta if available downstream - We can avoid a render pass if downstream supports the affine transformation meta - and increase the performance of some pipelines involving gltransformation. - Implemented by checking for the affine transformation in the allocation query - from downstream and combining our matrix with that of upstream's (or creating - our own). - -2016-05-14 16:27:26 +0300 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/gl/gstglshaderstrings.c: - * gst-libs/gst/gl/gstglshaderstrings.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * gst-libs/gst/gl/gstglviewconvert.c: - gl: take the affine transformation in NDC - Provide a function to get the affine matrix in the meta in terms of NDC - coordinates and use as a standard opengl matrix. - Also advertise support for the affine transformation meta in the allocation - query. - -2016-05-14 15:50:57 +0300 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglbasemixer.h: - glbasemixer: actually attempt to propose an allocation upstream - We were always failing the allocation query as a flag was never being set to - signal a successful negotiation. Fix by setting the required flag on a - successful caps event from upstream. - -2016-05-12 10:52:06 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/Makefile.am: - * ext/lv2/README: - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - * ext/lv2/gstlv2source.c: - lv2: add a source plugin - Update the readme with a working example and list what feature are supported. - -2016-05-11 23:12:07 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2utils.c: - lv2: add support for host features - Implement a log handler as the first one. - -2016-05-13 15:24:35 +0300 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: check the error of the presentation for out of date - allows us to resize the swapchain correctly. - -2016-05-12 19:44:26 +0100 Damian Ziobro <damian@xmementoit.com> - - * gst/mpegtsdemux/mpegtsbase.h: - mpegtsbase: remove unused variables: upstream_live and queried_latency - https://bugzilla.gnome.org/show_bug.cgi?id=766343 - -2016-05-11 15:45:47 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: improve debug output from _open_frontend() - * Clarify message on delsys info gathering - * Combine redundant INFO/DEBUG pair - -2016-05-11 15:26:24 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix invalid dereference of delsys data - Use GPOINTER_TO_INT to read GINT_TO_POINTER stored - data. - -2016-05-11 23:48:21 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - amcaudiodec: Set layout=interleaved in raw audio caps - Otherwise the GAP event fallback negotiation will fail to produce complete - srcpad caps, and thus fail. - https://bugzilla.gnome.org/show_bug.cgi?id=766289 - -2016-05-11 16:42:35 +0200 Edward Hervey <edward@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Fix previous commit - The frames queue might return nothing (be empty) if we're flushing. - Move the assertion to after the flushing check - -2016-05-10 22:04:48 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - lv2: skip plugins that need host features - We haven't implemented this yet and those plugin would fail when we instantiate - them. - -2016-05-10 21:11:41 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2utils.c: - lv2: add classification from metadata - This helps apps to structure the element collection. - -2016-04-08 07:53:44 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/Makefile.am: - * ext/lv2/gstlv2filter.c: - * ext/lv2/gstlv2utils.c: - * ext/lv2/gstlv2utils.h: - lv2: extract helper code into lv2utils - This is a preparaton for adding lv2-sources and -sinks. - -2016-05-10 12:24:03 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/ladspa/gstladspasource.c: - * ext/ladspa/gstladspautils.c: - ladspa: code cleanup - Whitespace cleanup and unify codeing style. - -2016-05-10 12:22:04 -0700 Stefan Sauer <ensonic@users.sf.net> - - * ext/ladspa/gstladspautils.c: - ladspa: simplify the code - Remove a local var and just use the parameter value. - -2016-05-10 18:14:36 +0200 Philippe Normand <philn@igalia.com> - - * sys/applemedia/corevideobuffer.c: - applemedia: fix core_video_meta init registration - -2016-05-10 16:46:43 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * .gitignore: - .gitignore: Ignore tests/examples/gl/gtk generated files - And another test binary. - -2016-05-10 16:24:08 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * configure.ac: - * ext/openjpeg/gstopenjpeg.h: - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegenc.c: - openjpeg: Port to 2.1 and require a pkg-config file for 2.0 and 2.1 - The port was trivial, and according to the NEWS file nothing else has changed, - but it is possible that other API was changed without proper notification. - OpenJPEG upstream has shipped a pkg-config file for the past 4 years, and all - distros should be shipping it by now. - https://bugzilla.gnome.org/show_bug.cgi?id=766213 - -2016-05-10 09:40:38 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: fix use-after-free in error code path - -2016-05-10 09:38:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: remove unnecessary checks for non-NULL frame - We can't get a NULL frame here. - CID 1359923 - -2016-05-09 15:23:32 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: abort at open frontend failure - -2016-05-09 12:50:47 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/Makefile.am: - applemedia: Ship all headers in tarballs - Some were missing from noinst_HEADERS. - https://bugzilla.gnome.org/show_bug.cgi?id=766163 - -2016-05-04 16:32:19 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - dvbsrc: smarten-up delsys autodetection logic - When there's no explicit delivery system information - for a channel in the channel configuration file and - the user hasn't selected one via setting the delsys - property, we *guessed* it by selecting the last - supported delsys reported by the driver. This change - provides the basis for smarter delsys auto detection - and implements a rule for DVB-T2. Rules for other - delivery systems can be added in _guess_delsys() in - a similar way. - Additionally: Store list of adapter-supported - delivery systems instead of querying the driver each - time this information is needed. - Related to: - https://bugzilla.gnome.org/show_bug.cgi?id=765731 - -2016-05-03 15:00:55 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: remove remaining polling logic from _tune_fe() - No need to do any polling here. - -2016-05-06 10:51:39 +0200 Carlos Garcia Campos <cgarcia@igalia.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Take the ownership of the src element - The URI downloader is creating the source element with - gst_element_factory_make() that returns a floating reference that nobody - is consuming. This is causing problems in WebKit, where the smart - pointers used to take references of the source elment get confused and - end up consuming the floating reference and then releasing the element, - which usually crashes because the URI downloader still tries to use its - src element. See https://bugs.webkit.org/show_bug.cgi?id=144040. - This commit adds two helper functions to ensure and destroy the source - element, to make the code simpler and less error prone. The ensure - method takes care of checking if we can reuse the existing one or we - need to create a new one, taking always its ownership. The destroy - method simply avoids duplicated code to set the source to NULL state and - then unref it. - https://bugzilla.gnome.org/show_bug.cgi?id=766053 - -2016-04-29 12:31:01 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix threading issues in gst_adaptive_demux_wait_until function - The gst_adaptive_demux_wait_until() function can be woken up either - by its end_time being reached, or from other threads that want to - interrupt the waiting thread. - If the thread is interrupted, it needs to cancel its async clock callback - by unscheduling the clock callback. However, the callback task might already - have been activated, but is waiting for the mutex to become available. In this - case, the call to unschedule does not stop the callback from executing. - The solution to this second issue is to use a reference counted object that - is decremented by both the gst_adaptive_demux_wait_until() function and the - call to gst_clock_id_wait_async (). In this way, the GstAdaptiveDemuxTimer - object is only deleted when both the gst_adaptive_demux_wait_until() function - and the async callback are finished with the object. - https://bugzilla.gnome.org/show_bug.cgi?id=765728 - -2016-03-03 15:50:49 +0900 Justin Kim <justin.kim@collabora.com> - - * sys/androidmedia/Makefile.am: - * sys/androidmedia/gst-android-graphics-surfacetexture.c: - * sys/androidmedia/gst-android-graphics-surfacetexture.h: - * sys/androidmedia/gst-android-hardware-camera.c: - * sys/androidmedia/gst-android-hardware-camera.h: - * sys/androidmedia/gstahcsrc.c: - * sys/androidmedia/gstahcsrc.h: - * sys/androidmedia/gstamc.c: - androidmeida: replace with new surfacetexture for ahcsrc - GstAmcSurfaceTexture is more clear and simple than GstAGSurfaceTexture. - https://bugzilla.gnome.org/show_bug.cgi?id=763099 - -2016-05-05 23:53:05 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/Makefile.am: - vulkan/build: add the build directory to the list of includes - Fixes out of tree builds from tarballs. - https://bugzilla.gnome.org/show_bug.cgi?id=764758 - -2016-05-05 23:18:11 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: fix up display synchronization - Use the semaphores in the correct place, before and after the submission for - acquiring and presenting the swapchain buffer. - Waiting on the fence that only signals the command buffer completion rather than - the completion of the presentation is racy with the destruction of the vulkan - buffers associated with that image. Wait on the device to be idle instead after - presenting. - -2016-05-05 18:00:25 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: use gst_video_sink_center_rect for positioning the video - Don't try to reimplement it badly. - -2016-05-05 10:44:22 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: fix description - -2016-05-05 10:41:53 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/videofilters/gstvideodiff.c: - videodiff: fix supported formats in template caps - -2016-05-05 10:40:37 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/videofilters/gstvideodiff.c: - * gst/videofilters/gstvideodiff.h: - videodiff: fill in FIXME metadata and docs with description - https://bugzilla.gnome.org/show_bug.cgi?id=765989 - -2016-05-04 12:17:59 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstglstereosplit.c: - * gst-libs/gst/gl/egl/Makefile.am: - * gst-libs/gst/gl/egl/gsteglimage.c: - * gst-libs/gst/gl/egl/gsteglimage.h: - * gst-libs/gst/gl/egl/gsteglimagememory.c: - * gst-libs/gst/gl/egl/gsteglimagememory.h: - * gst-libs/gst/gl/egl/gstgldisplay_egl.c: - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - * gst-libs/gst/gl/egl/gstglmemoryegl.h: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglupload.c: - gl/egl: replace gsteglimagememory with an EGLImage wrapper - That can be passed to GstGLMemoryEGL. - This also ports the dmabuf uploader to GstEGLImage and GstGLMemoryEGL. - -2016-01-21 22:18:17 +0900 Gwang Yoon Hwang <yoon@igalia.com> - - * gst-libs/gst/gl/egl/Makefile.am: - * gst-libs/gst/gl/egl/gstgldisplay_egl.c: - * gst-libs/gst/gl/egl/gstglmemoryegl.c: - * gst-libs/gst/gl/egl/gstglmemoryegl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglupload.c: - gl: implement GstGLMemoryEGL - Because current GstEGLImageMemory does not inherit GstGLMemory, GLUpload - allocates additional GLMemory and upload the decoded contents from the decoder - which uses EGLImage (e.g. gst-omx in RPi). - This work adds GstGLMemoryEGL to avoid this overhead. Decoders allocate - GstGLMemoryEGL and decode its contents to the EGLImage of GstGLMemoryEGL. And - GLUpload uses this memory without allocation of additional textures and blit - operations. - Matthew Waters: gst-indent the sources and fix a critical retreiving the egl - display from the memory. - https://bugzilla.gnome.org/show_bug.cgi?id=760916 - -2016-05-04 01:16:51 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglviewconvert.c: - glmemory: add wrapped data pointers to setup_buffer - Allows creating wrapped memories with GstGLAllocationParams. - The wrapped pointers will be set in the parameters before being passed - to the memory allocation function. - -2016-05-04 00:19:44 +1000 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbasememory.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmemorypbo.c: - glbasememory: take a pointer as the wrapped gpu handle - Allows passing arbitrary data to wrap the the specific memory implementation - which is required for some memory implementations. - -2016-05-04 11:30:11 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: output sysmem by default - -2016-05-02 11:30:43 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/directsound/gstdirectsoundsrc.c: - directsoundsrc: Convert Windows strings to UTF8 before comparing against UTF8 strings - The device name and descriptions returned are in the locale encoding, not - UTF8. Our device name property is in UTF8 though, so we need to convert. - https://bugzilla.gnome.org/show_bug.cgi?id=756948 - -2016-05-03 11:11:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/compositor.c: - compositor: Set blend functions in ::negotiated_caps() instead of ::fixate_caps() - The latter should not change any state but just fixate the caps, while the - former is always called when srcpads caps are decided. - https://bugzilla.gnome.org/show_bug.cgi?id=765324 - -2016-04-20 15:11:44 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklink.cpp: - decklink: Fix swapped name and nick in GEnumValues - https://bugzilla.gnome.org/show_bug.cgi?id=742878 - -2016-04-14 18:26:33 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink: Add initial 10bit support for YUV modes - https://bugzilla.gnome.org/show_bug.cgi?id=742878 - -2016-05-03 15:52:38 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklink: Fix indentation - -2016-05-03 19:58:00 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/gstglapi.h: - gl: fix gles3 header usage for older platforms - Some platforms provide an old version of GLES2/gl2.h and GLES2/gl2ext.h that - will fail when including GLES3/gl3.h due to missing typedef's. - Seen on the RPi. - -2016-04-29 23:32:03 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: avoid possible race on _output_frontend_stats() - Make sure we send out our info message before we give up ownership - of the structure. - -2016-04-29 14:53:06 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: var rename in _output_frontend_params() - Now it matches the rest of its status peers. Underscore - was a leftover from previous times. - -2016-04-29 14:45:22 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: always output known frontend status params - The only mandatory frontend information for our use case - is its status. Make sure we output what we know instead - of choking at the first error getting SNR, BER or any of - the other informational parameters. - -2016-04-29 12:06:52 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: refactor signal locking loop - Get rid of preliminar frontend status check. - -2016-04-29 11:18:53 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: drop unneeded polling step on _tune_fe() - Additional waiting was not needed. Specially considering - it came after a successful READ_STATUS ioctl and was - followed by an EINTR-resilent retry. - -2016-04-29 17:19:19 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: effectively check if there is a language - 'language' is an array and not a pointer. - CID 1358835 - -2016-04-29 13:54:01 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/Makefile.am: - player: Add required paths via pkg-config for gstreamer-base-1.0 and gstreamer-video-1.0 for gobject-introspection - The GstBase-1.0.gir and GstVideo-1.0.gir files are required by GstPlayer. - Uninstalled builds fail if these files cannot be found. - https://bugzilla.gnome.org/show_bug.cgi?id=765804 - -2016-04-08 16:47:15 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/gl/Makefile.am: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldeinterlace.h: - * ext/gl/gstopengl.c: - gl: enable gldeinterlace on OpenGL ES - 1.Porting the exist deinterlace shader and OpenGL callback - to be compatible with OpenGL ES. - 2.Add a our blur vertical shader to gldeinterlace. - 3.Add a property named “method” to let user choose which - deinterlace function to use. Default to choose blur vertical - method for better performance. - Matthew Waters: fix name of greedyh in method property (was greedhy) and port - to git master. - https://bugzilla.gnome.org/show_bug.cgi?id=764873 - -2016-04-28 15:19:17 +0530 Barun Kumar Singh <barun.singh@samsung.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - * win32/common/libgstplayer.def: - player: Add audio-video-offset property and setter/getter API - https://bugzilla.gnome.org/show_bug.cgi?id=765315 - -2016-04-19 19:43:03 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglsl.c: - * gst-libs/gst/gl/gstglsl_private.h: - * gst-libs/gst/gl/gstglviewconvert.c: - glviewconvert: Port more things to GLES/GL 3 compatibility - And move the shader mangling code into a single place instead of having a copy - in glcolorconvert and glviewconvert. - https://bugzilla.gnome.org/show_bug.cgi?id=765266 - -2016-04-19 19:27:33 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: GLES3 deprecates texture2D() and it does not work at all in newer versions than 3.3 - Use the newer texture() function instead. This fixes glimagesink and other - things on various Android devices. - https://bugzilla.gnome.org/show_bug.cgi?id=765266 - -2016-04-19 10:27:43 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - mpegtsmux: write language descriptor when language is available - Adds a new function to mpegts lib to create a iso639 language - descriptor from a language and use it in mpegtsmux to add - a language descriptor to audio streams that have a language set. - https://bugzilla.gnome.org/show_bug.cgi?id=763647 - -2016-04-26 16:48:58 +0800 Song Bing <bing.song@nxp.com> - - * sys/pvr2d/gstpvrbufferpool.c: - pvrbufferpool: fix gst_meta_register() parameters - https://bugzilla.gnome.org/show_bug.cgi?id=765581 - -2016-04-22 10:15:39 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Check all pads for data when live - When live, we still need to inspect all pads queue in order to determin - if we have received the first buffer or not. - https://bugzilla.gnome.org/show_bug.cgi?id=765431 - -2016-04-15 16:51:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Fix locking when using the clock - This fixes a race where we check if there is a clock, then it get - removed and we endup calling gst_clock_new_single_shot_id() with a NULL - pointer instead of a valid clock and also calling gst_object_unref() - with a NULL pointer later. - https://bugzilla.gnome.org/show_bug.cgi?id=757548 - -2016-04-25 16:50:55 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: H265 level idc 0 is not valid - Don't put level=0 into the caps, it confuses other elements. - https://bugzilla.gnome.org/show_bug.cgi?id=765538 - -2016-04-25 16:50:18 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: H264 level idc 0 is not valid - Don't put level=0 into the caps, it confuses other elements. - https://bugzilla.gnome.org/show_bug.cgi?id=765538 - -2016-04-22 14:51:31 +0200 Jerome Laheurte <jlaheurte@quividi.com> - - * sys/dshowsrcwrapper/gstdshowfakesink.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowsrcwrapper: fix DirectShow caps negotiation and set capture pin caps - Some cameras (IDS) have broken DirectShow drivers which incorrectly fill some - fields in the VIDEOINFOHEADER structure; comparison between suggested and - supported media types in CBaseRenderer should ignore deprecated and/or not - essential fields; additionaly explicitely setting the mediatype for the capture - pin before trying to connect it works around another IDS driver bug, and - should have been already done anyway. - https://bugzilla.gnome.org/show_bug.cgi?id=765428 - -2016-04-22 14:48:41 +0200 Jerome Laheurte <jlaheurte@quividi.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - dshowsrcwrapper: add support for RGB32, RGB555, RGB565 and RGB8 color spaces - Some cameras (IDS) only support those. - https://bugzilla.gnome.org//show_bug.cgi?id=765427 - -2016-04-22 14:44:57 +0200 Jerome Laheurte <jlaheurte@quividi.com> - - * sys/dshowsrcwrapper/CMakeLists.txt: - dshowsrcwrapper: fix include path and link error - Add include path so that the cmake-generated project - is able to find gstconfig.h - Add /SAFESEH:NO to MSVC linker options so it can link with - gstreamer libraries on Windows. - https://bugzilla.gnome.org//show_bug.cgi?id=765426 - -2016-04-22 15:02:01 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/adaptive_demux_common.h: - tests: adaptivedemux: only check for data length after seek - When the test involves doing a seek, only check for data size after - the seek. The final segment range after seek might be different/smaller - than the threshold for doing the seek and doing the check before - seeking would fail. - -2016-02-16 14:26:55 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/test_http_src.c: - * tests/check/elements/test_http_src.h: - adaptivedemux: tests: use macro to define names of request and response structs - Following the Don't Repeat Yourself principle, define macros - for the structures that contain the request and response headers, - so that the name is not repeated in multiple places in multiple files. - https://bugzilla.gnome.org/show_bug.cgi?id=762144 - -2016-02-16 14:26:42 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/hls_demux.c: - adaptivedemux: tests: improved checks for expected data - Check the size of received data for each buffer received by AppSink - https://bugzilla.gnome.org/show_bug.cgi?id=762144 - -2016-02-16 11:37:44 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/adaptive_demux_engine.c: - * tests/check/elements/adaptive_demux_engine.h: - * tests/check/elements/dash_demux.c: - dashdemux: tests: added content protection test - Test content protection - Configure 3 content protection sources: - - a uuid scheme/value pair - - a non uuid scheme/value pair (dash recognises only uuid schemes) - - a complex uuid scheme, with trailing spaces and capital letters in scheme uri - Only the uuid scheme should be recognised. We expect to receive 2 content protection events - https://bugzilla.gnome.org/show_bug.cgi?id=758064 - -2016-04-22 17:04:57 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - dash: strip lead/trailing whitespace from descriptortype attributes - The spec says it is xs:anyURI and leading and trailing whitespace - are to be ignored - https://bugzilla.gnome.org/show_bug.cgi?id=758064 - -2016-02-16 14:26:05 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_demux.c: - dashdemux: tests: added test for media download error for in stream fragment - Tested download error for a fragment that is not the last media fragment - in the stream. - https://bugzilla.gnome.org/show_bug.cgi?id=762144 - -2016-02-16 14:25:45 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_demux.c: - dashdemux: tests: added test for download errors during header download - Test header download error. - Let the adaptive demux download a few bytes, then instruct the - GstTestHTTPSrc element to generate an error while the fragment header - is still being downloaded. - https://bugzilla.gnome.org/show_bug.cgi?id=762144 - -2016-02-16 14:25:32 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/adaptive_demux_common.h: - * tests/check/elements/dash_demux.c: - dashdemux: tests: refactor testFragmentDownloadError - Renamed testFragmentDownloadError to testMediaDownloadErrorLastFragment. - Added gst_adaptive_demux_test_unexpected_eos function. - Remove unneeded testFragmentDownloadErrorCheckSizeOfDataReceived. - https://bugzilla.gnome.org/show_bug.cgi?id=762144 - -2016-02-16 14:25:04 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_demux.c: - dashdemux: tests: tested latency query - Updated query test to also check if dash responds correctly to a latency - query. - https://bugzilla.gnome.org/show_bug.cgi?id=762144 - -2016-02-16 14:24:49 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_demux.c: - dashdemux: tests: moved testQuery after testFragmentDownloadError - Moved testQuery after testFragmentDownloadError so that testDownloadError - and testFragmentDownloadError are grouped together. - The commit just moved the testQueryCheckDataReceived and - GST_START_TEST (testQuery) functions but git gets confused in matching the - lines and reports a lot of changes in the patch. - https://bugzilla.gnome.org/show_bug.cgi?id=762144 - -2016-02-16 14:24:26 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/adaptive_demux_common.h: - * tests/check/elements/dash_demux.c: - adaptivedemux: tests: create a GstDashDemuxTestCase class - Create a GstDashDemuxTestCase class that extends from GstAdaptiveDemuxTestCase. - This new class will contain all the DASH specific fields. - https://bugzilla.gnome.org/show_bug.cgi?id=762144 - -2016-02-16 14:24:09 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_demux.c: - dashdemux: tests: added support to pass various parameters to http src callbacks - Added support to pass various parameters to http src callbacks using GstStructure. - https://bugzilla.gnome.org/show_bug.cgi?id=762144 - -2016-03-01 14:54:01 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * gst/debugutils/gstchecksumsink.c: - * gst/debugutils/gstchecksumsink.h: - checksumsink: add "hash" property and allow more checksum types - Now any GChecksumType can be used by GstChecksumSink, adding - support for MD5, SHA-256 and SHA-512 in addition to SHA-1. - https://bugzilla.gnome.org/show_bug.cgi?id=763006 - -2016-04-22 08:20:14 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/check/Makefile.am: - check: Fix LDADD/CFLAGS for player unit test - It now requires libgstvideo - -2016-02-16 14:44:39 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/adaptive_demux_engine.c: - * tests/check/elements/adaptive_demux_engine.h: - adaptivedemux: tests: use a GstTestClock as the system clock - To allow the adaptivedemux live stream tests to run in non-realtime, use a - GstTestClock as the system clock. This allows the unit tests to complete - more quickly than if they had to complete in real time. - https://bugzilla.gnome.org/show_bug.cgi?id=762147 - -2016-02-16 14:44:27 +0000 Florin Apostol <florin.apostol@oregan.net> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: use realtime_clock for waiting for a condition - There are several places in adaptivedemux where it waits for - time to pass, for example to wait until it should next download - a fragment. The problem with this approach is that it means that - unit tests are forced to execute in realtime. - This commit replaces the use of g_cond_wait_until() with single - shot GstClockID that signals the condition variable. Under normal - usage, this behaves exactly as before. A unit test can replace the - system clock with a GstTestClock, allowing the test to control the - timing in adaptivedemux. - https://bugzilla.gnome.org/show_bug.cgi?id=762147 - -2016-02-16 14:44:10 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstdashdemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: use GstSystemClock to all real-time calculations - A realtime clock is used in many places, such as deciding which - fragment to select at start up and deciding how long to sleep - before a fragment becomes available. For example dashdemux needs - sample the client's estimate of UTC when selecting where to start - in a live DASH stream. - The problem with dashdemux calculating the client's idea of UTC is - that it makes it difficult to create unit tests, because the passage - of time is a factor in the test. - This commit changes dashdemux and adaptivedemux to use the - GstSystemClock, so that a unit test can replace the system clock when - it needs to be able to control the clock. - This commit makes no change to the behaviour under normal usage, as - GstSystemClock is based upon the system time. - https://bugzilla.gnome.org/show_bug.cgi?id=762147 - -2016-04-21 14:58:45 +0300 Sebastian Dröge <sebastian@centricular.com> - - * win32/common/libgstplayer.def: - win32: Add new API to .def file - -2016-04-19 10:59:46 +0530 Barun Kumar Singh <barun.singh@samsung.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/player/Makefile.am: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - * pkgconfig/gstreamer-player-uninstalled.pc.in: - * pkgconfig/gstreamer-player.pc.in: - player: Add support for multiview settings - https://bugzilla.gnome.org/show_bug.cgi?id=765302 - -2016-04-21 10:06:40 +0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/applemedia/vtenc.c: - applemedia: vtenc: fix build break on iOS - Fix 'conflicting types' error - https://bugzilla.gnome.org/show_bug.cgi?id=765292 - -2016-04-20 15:34:55 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add test for invalid DVB-T2 bandwidth - -2016-04-20 14:47:22 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: warn on wrong DVB-T2 stream ID value - Stream ID, used for DVB-T2/S2 and ISDB-S can - not exceed 255 for the former. Change makes this - explicit. - -2016-04-20 21:07:28 +0900 Hyunjun Ko <zzoon@igalia.com> - - * sys/applemedia/vtenc.c: - applemedia: vtenc: Fix a warning by weak-link symbol - Fix this warning - address of function 'VTCompressionSessionPrepareToEncodeFrames' will always evaluate to 'true' -Wpointer-bool-conversion - https://bugzilla.gnome.org/show_bug.cgi?id=765292 - -2016-04-20 16:19:55 +0900 Hyunjun Ko <zzoon@igalia.com> - - * ext/gl/caopengllayersink.m: - gl: caopengllayersink: fix a minor warning - Fix "unused variable" warning - https://bugzilla.gnome.org/show_bug.cgi?id=765292 - -2016-04-20 16:00:36 +0900 Hyunjun Ko <zzoon@igalia.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - gl/cocoa: Fix incompatible type warning - https://bugzilla.gnome.org/show_bug.cgi?id=765292 - -2016-04-19 14:57:22 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * sys/d3dvideosink/d3dhelpers.h: - d3dvideosink: Don't include deprecated and unavailable d3dx9tex.h - It's not needed, not on native Windows nor with mingw, and - we don't use anything from it anyway - https://bugzilla.gnome.org/show_bug.cgi?id=765250 - -2016-04-14 12:46:58 +0200 Philipp Zabel <p.zabel@pengutronix.de> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: add sync support for secondary pipes - The vblank event request must specify the crtc for which to request - the event. This fixes kmssink synchronisation for crtcs other than - the first. - https://bugzilla.gnome.org/show_bug.cgi?id=765064 - -2016-04-19 09:30:39 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Fix indentation - -2016-04-19 10:51:14 +0800 Haihua Hu <jared.hu@nxp.com> - - * ext/gl/gstglimagesink.c: - glimagesink: need to clean window_id when state change form READY to NULL - When application change pipeline state NULL->READY and then READY->NULL, - glimagesink will not clear glsink->window_id. After that, when application - change state NULL->READY, the new_window_id is equal to window_id, glimagesink - will not set window handle. It will use the internal window but not the window - create by application. - https://bugzilla.gnome.org/show_bug.cgi?id=765241 - -2016-04-18 13:46:55 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: plug caps leak - It was losing ref of the original 'ret' caps that would be returned - or returning it with 2 references to it. - -2016-03-28 15:44:27 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * tests/check/elements/compositor.c: - videoaggregator: properly handle interlace-mode restrictions - videoaggregator can't handle interlace-mode changes so it must - always restrict itself to the first interlacing mode it receives. - Tests included - https://bugzilla.gnome.org/show_bug.cgi?id=754495 - -2016-01-22 16:49:57 +0000 Raffaele Rossi <rarossi@cisco.com> - - * ext/dtls/README: - dtsl: add some documentation - https://bugzilla.gnome.org/show_bug.cgi?id=760994 - -2016-04-17 15:45:41 +0100 Heinrich Fink <hfink@toolsonair.com> - - * ext/gl/caopengllayersink.m: - gl/caopengllayersink: Actually unset caps_change flag after resize - Otherwise, the sink would execute "on_resize" for each frame. - https://bugzilla.gnome.org/show_bug.cgi?id=765194 - -2016-04-17 15:43:20 +0100 Heinrich Fink <hfink@toolsonair.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - gl/caopengllayer: Apply layer.contentsScale to viewport dims - Fixes blurry content on HiDPI screens - https://bugzilla.gnome.org/show_bug.cgi?id=765194 - -2016-04-16 22:33:48 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Remove an unnecessary check for NULL before g_free - -2016-04-15 13:22:51 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c: - * gst/compositor/compositor.c: - Drop usage of 'overlayed' to mean 'overlaid' - -2016-04-15 13:10:41 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: show invalid delsys/mod combination if found - -2016-04-15 11:29:48 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add modulation check for ATSC - -2016-04-11 23:45:22 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: do not autodetect delsys twice - The process is dealt with the first time the adapter is - opened, there is no need to do this again. - -2016-04-14 22:32:05 -0700 Aleix Conchillo Flaqué <aconchillo@gmail.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: also check for "roc" in caps - Currently, gst_srtp_dec_sink_setcaps is happy if the "roc" field is not - provided in the caps. If it is not provided the stream will be properly - inserted in the hash table with a default "roc". Then, when the first - buffer arrives validate_buffer will find an existing stream in the hash - table and will not signal request-key, not allowing the user to provide - a "roc". - This patch expects "roc" in gst_srtp_dec_sink_setcaps, if not found a - request-key will be signaled and the user will be able to provide all - the srtp fields, including "roc". - https://bugzilla.gnome.org/show_bug.cgi?id=765079 - -2014-07-28 12:14:02 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: mpegvideo: Parse more slice header fields - https://bugzilla.gnome.org/show_bug.cgi?id=733872 - -2014-07-28 11:17:05 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: mpegvideo: Add vbv_delay field to PictureHeader - https://bugzilla.gnome.org/show_bug.cgi?id=733872 - -2014-07-28 11:14:22 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: mpegvideo: Add more fields to the GstMpegVideoSequenceHdr - Added the fields load_non_intra_quantiser_matrix and - load_chroma_intra_quantiser_matrix to the sequence header structure. - https://bugzilla.gnome.org/show_bug.cgi?id=733872 - -2016-04-14 10:02:32 +0100 Julien Isorce <j.isorce@samsung.com> - - * README: - * common: - Automatic update of common submodule - From 6f2d209 to ac2f647 - -2016-04-13 18:12:25 +0100 Damian Ziobro <damian@xmementoit.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: free pad_data->language before g_strdup in order to avoid memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=765005 - -2016-04-13 13:10:12 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/corevideobuffer.c: - applemedia: GstCoreVideoMeta in the plugin using only public API has no ctx member - -2016-04-13 13:09:05 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/coremediabuffer.c: - applemedia: GstCoreMediaMeta in the plugin using only public API has no ctx member - -2016-04-13 10:25:32 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/directfb/dfbvideosink.c: - * sys/pvr2d/gstpvrbufferpool.c: - meta: Initialize all remaining metas in their init function - https://bugzilla.gnome.org/show_bug.cgi?id=764902 - -2016-04-13 10:17:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/codecparsers/gstmpegvideometa.c: - * sys/applemedia-nonpublic/coremediabuffer.c: - * sys/applemedia-nonpublic/corevideobuffer.c: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/corevideobuffer.c: - meta: Initialize all GstMeta fields - During allocation they are not initialized to all zeroes. - https://bugzilla.gnome.org/show_bug.cgi?id=764902 - -2016-04-11 22:08:03 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: avoid redundant delsys querying - There is no need to query the frontend for the list - of supported delivery systems if we are selecting - one from the list of autodetected ones. - -2016-04-10 18:58:33 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb/parsechannels: add information to file not found error - Adds useful failure info (like filename) comming from - g_file_get_contents() as done for every other error in - this block. - -2016-04-13 00:43:18 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - gl/cocoa/eagl: don't leak GThread's when dispatching messages - gst_gl_context_get_thread() returns a refed pointer, we need to unref it. - -2016-04-12 11:14:22 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/gl/gstgltestsrc.c: - gltestsrc: don't dereference null pointer - funcs can be NULL, it is one of the two conditions of the OR statement - above, so confirm it isn't before dereferencing with funcs->free. - CID 1358388 - -2016-04-12 04:16:55 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Fix when applying new PMT with same program number - When the sub-class is delaying deactivation of the old program, - but it has the same program number as the new program, don't - overwrite the old program in the hash table and then steal - the new program back out of it. Instead, add the new program to - the hash table after handling removal of the old one. - -2016-04-06 04:15:40 +0000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: keep the parent buffer around when converting EGLImage to 2D textures - e.g. receiving and releasing a buffer from OMX too early will potentially - cause textures to be overwritten while/before they are displayed. - -2016-04-11 16:43:45 +0000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglbasemixer.c: - glbasemixer: chain up to the parent implementation - -2016-04-11 18:06:25 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - vulkan: prettify the various versions in the debug output - output human readable numbers. - -2016-04-11 20:23:45 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: minor clean-ups - Remove unused property getters, setters; outdated comment. - -2016-04-11 20:11:53 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - * ext/openh264/gstopenh264dec.h: - * ext/openh264/gstopenh264enc.cpp: - * ext/openh264/gstopenh264enc.h: - openh264: remove unnecessary instance private structures - Element instance structures are not public API, so no need - for the extra indirection to hide the data. - -2016-04-11 20:04:00 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - * ext/openh264/gstopenh264enc.cpp: - openh264: fix indentation - -2016-02-12 14:21:27 +0100 Philipp Zabel <p.zabel@pengutronix.de> - - * sys/kms/gstkmsutils.c: - kmssink: enable UYVY, YUY2, and YVYU (interleaved YUV 4:2:2) formats - https://bugzilla.gnome.org/show_bug.cgi?id=761059 - -2016-02-12 14:17:32 +0100 Philipp Zabel <p.zabel@pengutronix.de> - - * sys/kms/gstkmsutils.c: - kmssink: enable NV16 (chroma-interleaved YUV 4:2:2) format - https://bugzilla.gnome.org/show_bug.cgi?id=761059 - -2016-02-12 14:17:13 +0100 Philipp Zabel <p.zabel@pengutronix.de> - - * sys/kms/gstkmsutils.c: - kmssink: enable Y42B (planar YUV 4:2:2) format - https://bugzilla.gnome.org/show_bug.cgi?id=761059 - -2016-03-04 16:53:58 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: keep last rendered buffer in memory - https://bugzilla.gnome.org/show_bug.cgi?id=761059 - -2016-02-20 23:13:54 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: wait for page flip or vblank - This patch requests for drmModePageFlip() for the used CRTC, if the kernel - module suppports async page flip. If it does not, the element requests for a - vblank event. A GstPoll waits for the event to happen. - https://bugzilla.gnome.org/show_bug.cgi?id=761059 - -2016-02-10 20:43:47 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * configure.ac: - * sys/kms/Makefile.am: - * sys/kms/gstkmsallocator.c: - * sys/kms/gstkmsallocator.h: - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - kmssink: add dmabuf support - This patch will enable the import of dmabufs into a KMS buffer using - the PRIME kernel interface. - If the driver does not support prime import, the method is skipped. - It has been tested with a Freescale I.MX6 board. - https://bugzilla.gnome.org/show_bug.cgi?id=761059 - -2016-01-31 13:12:34 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/kms/gstkmssink.c: - * sys/kms/gstkmsutils.c: - * sys/kms/gstkmsutils.h: - kmssink: calculate display ratio - Get the aspect ratio given the information provided by libdrm, and with it - calculate the display ratio. - https://bugzilla.gnome.org/show_bug.cgi?id=761059 - -2016-01-20 12:00:51 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * configure.ac: - * sys/Makefile.am: - * sys/kms/Makefile.am: - * sys/kms/gstkmsallocator.c: - * sys/kms/gstkmsallocator.h: - * sys/kms/gstkmsbufferpool.c: - * sys/kms/gstkmsbufferpool.h: - * sys/kms/gstkmssink.c: - * sys/kms/gstkmssink.h: - * sys/kms/gstkmsutils.c: - * sys/kms/gstkmsutils.h: - kmssink: add plugin and sink element - This is simple video sink that use libdrm/libkms API to render frames. - The element uses planes to render through drmModeSetPlane(). - It has been tested in an Exynos4412 board and in a Freescale I.MX6 board. - https://bugzilla.gnome.org/show_bug.cgi?id=761059 - -2016-04-10 17:46:15 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * ext/vulkan/Makefile.am: - * ext/vulkan/vkapi.h: - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkdisplay.c: - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkwindow.c: - * ext/vulkan/wayland/Makefile.am: - * ext/vulkan/wayland/vkdisplay_wayland.c: - * ext/vulkan/wayland/vkdisplay_wayland.h: - * ext/vulkan/wayland/vkwindow_wayland.c: - * ext/vulkan/wayland/vkwindow_wayland.h: - * ext/vulkan/wayland/wayland_event_source.c: - * ext/vulkan/wayland/wayland_event_source.h: - vulkan: add a wayland winsys implementation - -2016-04-10 17:43:39 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/xcb/vkwindow_xcb.c: - * ext/vulkan/xcb/vkwindow_xcb.h: - vulkan/xcb: getProcAddress winsys functions - There's no guarantee that they will always be exposed by the vulkan loader. - -2016-04-09 17:52:28 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkupload.c: - vkupload: copy necessary buffer metadata - timestamps, flags, etc - -2016-04-11 08:34:00 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - libgstgl: cocoa, eagl: use libdispatch to schedule GL calls - Use libdispatch instead of GMainLoop to dispatch GL calls. libdispatch is more - optimized and cuts a lot of poll()/pthread_* overhead. - -2016-04-11 08:02:45 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: reduce the number of GMutexes and GConds in send_message() - Don't create many short lived locks/conds in gst_gl_window_send_message. This is - a micro optimization to save a bunch of pthread_* calls which are expensive on - OSX/iOS and possibly other platforms. - -2016-04-10 22:18:38 +0100 Tim-Philipp Müller <tim@centricular.com> - - * win32/common/libgstgl.def: - win32: update .def file for new gl api - -2016-04-08 18:34:45 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: add necessary wait stages to the submission info - -2016-04-08 18:32:41 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: add srgb formats to our list of formats - intel returns them for their surface formats. - -2016-04-08 18:09:53 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkimagememory.c: - vulkan: silence a validation warning filling out the image barrier - -2016-04-08 18:09:06 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkinstance.c: - vulkan: use the correct validation layer name - The threading validation layer has changed names. - -2016-04-08 14:07:55 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Initialize capture_time to NONE so it can be used if no video frame is provided but audio is - CID 1358390 - -2016-04-08 17:56:50 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkutils.c: - * ext/vulkan/vkutils_private.h: - vulkan: only warn on not found layers - don't error out completely - https://bugzilla.gnome.org/show_bug.cgi?id=764545 - -2016-04-08 17:41:07 +1000 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkinstance.c: - vulkan: don't g_error when failing to find validation layers - Aborting the application is never a good thing to do for recoverable errors. - Just warn and error out instead. - https://bugzilla.gnome.org/show_bug.cgi?id=764545 - -2016-04-08 14:51:44 +1000 Matthew Waters <matthew@centricular.com> - - * sys/nvenc/gstnvbaseenc.c: - * sys/nvenc/gstnvbaseenc.h: - nvenc: add some rate control modes/properties - Supported modes are constant quantizer, cbr, vbr and vbr with a minimum quantizer. - -2016-04-07 23:24:47 +1000 Matthew Waters <matthew@centricular.com> - - * sys/nvenc/gstnvbaseenc.c: - * sys/nvenc/gstnvbaseenc.h: - * sys/nvenc/gstnvh264enc.c: - nvenc: move codec config initialization from the implementation to the base class - Supports a better separation of configuration parameters - -2016-04-07 22:46:08 +1000 Matthew Waters <matthew@centricular.com> - - * sys/nvenc/gstnvbaseenc.c: - * sys/nvenc/gstnvbaseenc.h: - * sys/nvenc/gstnvenc.c: - * sys/nvenc/gstnvh264enc.c: - nvenc: add preset selection - Some presets are not always supported on all devices and will cause an error if - used. Specifically, the LOSSLESS presets are known to not work everywhere. - -2014-07-16 02:44:42 +0200 Marcin Kolny <marcin.kolny@gmail.com> - - * ext/chromaprint/gstchromaprint.c: - chromaprint: emit notify::fingerprint signal when fingerprint is ready - In addition to adding the fingerprint to the tags. - https://bugzilla.gnome.org/show_bug.cgi?id=733233 - -2016-04-04 20:55:51 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: repect the result of find_best_format in the default update_caps - We weren't using the result of find_best_format at all. - Also, move the find_best_format usage to the default update_caps() to make - sure that it is also overridable. - https://bugzilla.gnome.org/show_bug.cgi?id=764363 - -2016-04-05 21:40:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/gstrfbsrc.c: - rfbsrc: Fix fallback to GstVideoBufferPool - The replacement pool need to be added to the query, otherwise the - baseclass won't see it. We also need to properly remove the rejected - pools. - https://bugzilla.gnome.org/show_bug.cgi?id=763441 - -2016-04-05 21:07:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/gstrfbsrc.c: - * gst/librfb/gstrfbsrc.h: - rfbsrc: Implement decide_allocation virtual - This way we can use the base class for buffer allocation, hence use - fill() instead of create() virtual. This also adds a strict check on the - select pool buffer size as we don't support strides and padding. - This is based on initial patch proposed by Sebastien Dröge, from which I - also fixed a buffer pool leak. - https://bugzilla.gnome.org/show_bug.cgi?id=763441 - -2016-04-05 15:31:49 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/gstrfbsrc.c: - rfbsrc: Fix caps negotiation - As we currently only use the server reported "natural" format, caps - negotiation should simply be limited to telling the base class which - format to use. Fix the negotiation by moving the associated code - into negotiate() virtual function. Also, use gst_base_src_set_caps() - rather then setting it on the pad directly. Also protect against this - method being called multiple time (we can't renegotiate for now). - This change also moves some network code that was being run during the - application state change call, to be run on the streaming thread. - https://bugzilla.gnome.org/show_bug.cgi?id=739598 - -2016-03-26 13:36:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/gstrfbsrc.c: - rfbsrc: Implement unlock() method - This prevent stalls when we try to stop the source while waiting - for the server to send more updates. - -2016-03-24 18:27:54 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/rfbdecoder.c: - rfbsrc: Check for connection being closed - Although it's not very well documented, g_input_stream_read_all() will - set the number of bytes read to 0 if the connection is closed rather - then returning an error. - -2016-03-24 18:26:46 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/rfbdecoder.c: - rfbsrc: Check for read/write error - Check for read/write error. This prevent undefined behaviour that rely - on unitialized buffer. - -2016-03-24 18:14:17 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/gstrfbsrc.c: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - rfbsrc: Add a internal method to disconnect - This also removes the disconnected boolean hack. - -2016-03-24 18:14:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/gstrfbsrc.c: - rfbsrc: Don't ignore errors - This prevents recursion on error. This used to happen as we - don't change the state when something fails. We end up running - and failing in the same state forever. - -2016-03-24 16:46:49 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - rfbsrc: Serialize write operations - Currently we send key events from seperate threads. IOStream does not - allow concurrent write operations, so protect this operation using a - mutex. - -2016-03-17 15:24:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/rfbdecoder.c: - rfbsrc: Add 3.7/3.8 security type negotiation - -2016-03-16 18:48:49 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/Makefile.am: - * gst/librfb/gstrfbsrc.c: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - rfbsrc: Port to GSocketClient - Using GSocketClient we can simplify a lot the read/write operation. - This also provide an GSocketConnection (a GIOStream) which can then - be used with the GTlsClientConnection for secure connections. Note - that we use _write_all() to ensure all bytes have been read. This is - to follow the fact the none of the _send() calls check the return - value. - -2016-03-16 16:49:29 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/Makefile.am: - * gst/librfb/gstrfbsrc.h: - * gst/librfb/rfb.h: - * gst/librfb/rfbdecoder.c: - rfbsrc: Remove useless library wrapping - We use a sinlge .c file, simplify everything by removing that - static library. - -2016-03-16 16:49:09 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/Makefile.am: - * gst/librfb/rfb.c: - * gst/librfb/rfb.h: - * gst/librfb/rfbbuffer.c: - * gst/librfb/rfbbuffer.h: - * gst/librfb/rfbcontext.h: - * gst/librfb/rfbdecoder.h: - * gst/librfb/rfbutil.h: - rfbsrc: Cleanup dead code - Remove all the unused stuff, the include header, definition and C code - that don't contribute anything to this element. - -2016-03-14 15:08:13 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/rfbdecoder.c: - rfbsrc: Properly fallback to 3.3 - If the major version is not 3, then the minor version provided - should be ignored, as it is meaningless for our fallback. - -2016-03-14 15:05:45 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/librfb/rfbdecoder.c: - rfbsrc: Cleanly handle security negotiation failure - When the security cannot be negotiated, the server returns - security type of 0 (failure). In that case, the next step is - to read the error reason string. - -2016-04-01 14:36:15 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstmpdparser.c: - mpdparser: clamp segment durations to each other and period end - 5.3.2.1 in the spec. - https://bugzilla.gnome.org/show_bug.cgi?id=751792 - -2015-09-10 13:22:58 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - dashdemux: unit testing reproducing segment duration overflow - unit test reproducing https://bugzilla.gnome.org/show_bug.cgi?id=751792 - With minor changes by Vincent Penquerc'h. - -2016-04-05 14:49:51 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Don't accept packets without timestamps after a discont - We have no idea which timestamps they are supposed to have so the only thing - we can do at this point is to drop them. Packets without timestamps happen if - audio was captured but no corresponding video, which shouldn't happen under - normal circumstances. - https://bugzilla.gnome.org/show_bug.cgi?id=747633 - -2016-04-04 22:21:30 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Don't crash when receiving video frames but no audio - And mark these events as disconts to reset time tracking in the audio source. - https://bugzilla.gnome.org/show_bug.cgi?id=747633 - -2015-08-08 15:17:54 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklinkvideosrc: don't crash if we get NULL video frames in the callback - For some reason we seem to sometimes get NULL video_frames in the - ::VideoInputFrameArrived() callback, observed on Intensity Pro cards. - https://bugzilla.gnome.org/show_bug.cgi?id=747633 - -2016-03-23 03:16:11 +0000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: add support for the affine transformation meta - -2016-03-23 03:14:40 +0000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: support the affine transformation meta for any texture target - -2016-04-05 16:22:49 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: set the current texture to 0 before mapping - If we fail mapping, we don't want to use undefined video data in the subclass. - -2015-09-08 14:37:57 +0200 Patricia Muscalu <patricia@axis.com> - - * ext/curl/gstcurlbasesink.c: - curlsink: catch an unknown error - In this case the socket callback has not been called - by libcurl and the curlsink has not been notified about any - connection problems by libcurl. - This indicates that it's a bug in libcurl so catch it as - an unknown error. - https://bugzilla.gnome.org/show_bug.cgi?id=754432 - -2016-04-04 13:43:30 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixerbin.c: - glmixerbin: proxy the start-time-* properties from aggregator - -2016-04-04 11:28:35 +0200 Santiago Carot-Nemesio <sancane@gmail.com> - - * ext/dtls/gstdtlssrtpdec.c: - * ext/dtls/gstdtlssrtpenc.c: - dtls: Use unique names for internal elements to ease debugging - https://bugzilla.gnome.org/show_bug.cgi?id=748651 - -2016-04-03 17:56:06 +0200 Aurélien Zanelli <aurelien.zanelli@darkosphere.fr> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: remove duplicated test of flow_return in pad_chain_internal - https://bugzilla.gnome.org/show_bug.cgi?id=764549 - -2016-04-03 18:06:20 +0900 Kouhei Sutou <kou@clear-code.com> - - * sys/directsound/Makefile.am: - directsoundsrc: add missing -lole32 - CLSIDFromString() requires ole32.dll. - See https://msdn.microsoft.com/en-us/library/windows/desktop/ms680589%28v=vs.85%29.aspx - CLSIDFromString() is introduced at - f9464ce3549c2b3948a582464631ba4f8dd0d5e7 . - https://bugzilla.gnome.org/show_bug.cgi?id=764523 - -2016-03-31 11:21:35 +0200 Christoffer Stengren <christsn.gs@gmail.com> - - * gst/gdp/dataprotocol.c: - * gst/gdp/dataprotocol.h: - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdpdepay.h: - gdpdepay: Query for buffer allocator before using default - https://bugzilla.gnome.org/show_bug.cgi?id=764361 - -2016-03-22 19:27:39 +0200 Vivia Nikolaidou <vivia@toolsonair.com> - - * gst/interlace/gstinterlace.c: - interlace: Allow interlaced sink caps, do passthrough - Allow interlace to receive already interlaced content, if compatible with its - configuration. In that case, it will just do passthrough. - https://bugzilla.gnome.org/show_bug.cgi?id=764036 - -2016-04-01 21:24:34 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/README: - README: update to 1.0 and lilv - -2016-04-01 18:33:13 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2filter.c: - lv2filter: remove the variable for the registry klass tag - Just pass the string when registering. - -2016-04-01 18:31:36 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/lv2/gstlv2filter.c: - lv2filter: remove copy and paste of doc blob - This doc block is already in gstlv2.c. - -2016-04-01 12:59:19 +0200 Vanessa Chipirras Navalon <vanechipi@qtec.com> - - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstsegmentation.h: - opencv: segmentation: Ported to OpenCV version 3.1 - Add namespace bgsegm, replacement functions and Template class for new - OpenCV versions because these functions have been removed. cvarrToMat() is - added because it is compatible with all versions of OpenCV and the use of - class Mat constructor is eliminated, it is also deprecated in 3.X versions. - Use the namespace cv because some functions are called many times. - This patch keeps compatibility with 2.4 - https://bugzilla.gnome.org/show_bug.cgi?id=760473 - -2016-04-01 14:12:08 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstvp9parser.c: - * gst-libs/gst/codecparsers/gstvp9parser.h: - codecparser: vp9: move persistent fields from GstVp9FrameHdr to GstVp9Parser - The subsampling_x, subsampling_y, bit_depth, color_space and color_range - fileds are moved from GstVp9FrameHdr to the global GstVp9Parser structure. - These fields are only present in keyframe or intra-only frame, no need to - duplicate them for inter-frames. This is an ABI change. - https://bugzilla.gnome.org/show_bug.cgi?id=764370 - -2016-04-01 12:08:53 +0200 Vanessa Chipirras Navalon <vanechipi@qtec.com> - - * ext/opencv/gsttextoverlay.h: - opencv: textoverlay: Ported to OpenCV version 3.1 - imgproc_c.h is added because CvFont struct needs it in any 3.x version. - We use this structure in GstOpencvTextOverlay. This keeps compatibility - with 2.4. - https://bugzilla.gnome.org/show_bug.cgi?id=760473 - -2016-04-01 11:56:20 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: constrained-baseline is a subset of baseline - We get into this code path if the profile is already constrained-baseline and - downstream does not support constrained-baseline. So we should try baseline - and the other compatible profiles. - https://bugzilla.gnome.org/show_bug.cgi?id=764448 - -2016-03-22 07:19:03 +0000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimagememory.c: - eglimage: perform eglCreateImage in the gl thread - while calling eglCreateImage without a GL context current in the executing - thread works on the RPi, some other implementations will return errors. - Marshall the eglCreateImage to the GL thread to appease these implementations. - -2016-04-01 14:58:56 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglviewconvert.c: - glviewconvert: support outputting to multiple draw buffers on GLES3 - A similar change that was done to glcolorconvert adding the necessary shader - mangling. - -2016-03-31 19:50:28 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: implement multiple render targets for GLES3 - There are numerous slight differences required between Desktop GL and GLES3 for - multiple render targets. - 1. gl_FragData doesn't exist at all and one is required to use - 'layout (location = ?) out ...' instead. - 2. gl_FragColor doesn't exist, same as 1 - 3. texture2D() has been deprecated - Fortunately most of these have been taken care of with GL3 and the shader - mangling already exists so just expand the conditions they are used in. The - gl_FragData issue requires a new mangle pass though. We also use this new - pass on desktop GL for consistency. - -2016-03-31 18:23:22 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/mssdemux.c: - tests: mssdemux: do not use gst_object_unref for pure GObject* - Deallocate GObject* with g_object_unref instead of gst_object_unref. - Even if it works now, it is confusing and in the future it might - not work if any GstObject specifics are added. - https://bugzilla.gnome.org/show_bug.cgi?id=762142 - -2016-02-16 13:55:54 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_demux.c: - dashdemux: tests: use g_object_unref for test data - The GstDashDemuxTestCase object is allocated using g_object_newv - but in many places was being deallocated using gst_object_unref. - This was caused by commit ae3ed25025e34ea9b09df59d22d7ebd7294560bc. - https://bugzilla.gnome.org/show_bug.cgi?id=762142 - -2016-03-31 16:08:12 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/MotionCells.cpp: - * ext/opencv/MotionCells.h: - motioncells: fully construct MotionCells - Some members of MotionCells were not being initialized in the constructor. - Protect from potential garbage memory usage by fully initializing it. - Moving m_frameSize out of the class because it is only used in - performDetectionMotionCells(). - CID 1197704 - -2016-04-01 00:23:25 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - gl/build: add missing '\' at the end of the line in MakeFile.am - Otherwise the following elements aren't included in the correct variable. - Fixes error in 'make distcheck' failing to find gstgltestsrc.h - -2016-03-31 23:07:17 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/Makefile.am: - gl/tests/pipelines: add custom _CFLAGS and LDADD - As is done everywhere else. - From what I can gather from make -C tests/check V=1 $(GST_PLUGINS_BAD_CFLAGS) is - required in order to find in-tree headers as well as srcdir != builddir - configurations. - -2016-03-31 22:20:01 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/Makefile.am: - gl/tests: only build the simple-launch-lines test if we have GL - -2016-03-31 20:00:37 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: don't use the predefined variable name sample - Using 'sample' as a variable name is an error in GLES3 - -2016-03-22 23:10:24 +1100 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/gtk/switchvideooverlay/Makefile.am: - * tests/examples/gl/gtk/switchvideooverlay/main.cpp: - gl/examples: fix switchvideooverlay for wayland - and call XInitThreads() for X11 - -2016-03-21 15:25:21 +1100 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * tests/examples/gl/gtk/Makefile.am: - * tests/examples/gl/gtk/gtkvideooverlay/.gitignore: - * tests/examples/gl/gtk/gtkvideooverlay/Makefile.am: - * tests/examples/gl/gtk/gtkvideooverlay/gtkvideooverlay.vcproj: - * tests/examples/gl/gtk/gtkvideooverlay/main.cpp: - gl/examples: remove duplicated videooverlay example - filtervideooverlay proved the exact same example (only with a extra glfiltercube). - -2016-03-21 15:23:41 +1100 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/gtk/3dvideo/main.cpp: - gl/examples/3d: additions for wayland support - -2016-03-17 23:51:44 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/Makefile.am: - * tests/check/pipelines/simple-launch-lines.c: - gl/tests: add missing test to the build system - Also update it for the current api - -2016-03-17 23:50:00 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/effects/gstgleffectssources.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgldifferencematte.h: - gldifferencematte: port to gl3/gles2 - -2016-02-26 20:55:47 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gltestsrc.c: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstopengl.c: - gltestsrc: port to gles2/gl3 - This makes gltestsrc work everywhere \o/ - - workaround RPi returning invalid values for positive coords in the - checker shader - - reduce the number of iterations in the mandelbrot shader for gles2 - https://bugzilla.gnome.org/show_bug.cgi?id=751540 - -2016-02-26 16:57:47 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gltestsrc.c: - gltestsrc: port smpte pattern to shaders - Loosely based on patch by - Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - https://bugzilla.gnome.org/show_bug.cgi?id=751540 - -2016-02-26 12:02:15 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gltestsrc.c: - gltestsrc: implement the circular method - https://bugzilla.gnome.org/show_bug.cgi?id=759801 - -2016-02-25 21:18:31 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gltestsrc.c: - * ext/gl/gltestsrc.h: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstgltestsrc.h: - gltestsrc: add a generic src framework - Any unsupported pattern (circular) results in an error - -2016-02-29 20:15:24 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglstereosplit.c: - * ext/gl/gstglstereosplit.h: - glsterosplit: remove internal glupload/glcolorconvert - They are provided separately as elements and no other element contains the - internal references to glupload/glcolorconvert. - -2016-03-31 19:43:04 +1100 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/glprototypes/gstgl_gles2compat.h: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglcontext.c: - gl: add support for building against GLES3 headers - with a fallback to GLES2 headers if available. - -2016-03-31 19:38:12 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: add checking the read implementation format/type on gles2 platforms - By default, reading GL_RED or GL_RG us unsupported by glReadPixels unless - exposed through GL_COLOR_READ_IMPLEMENTATION_FORMAT/TYPE. This allows - downloading multiple-planar video frames where possible. - -2016-03-31 19:35:09 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.c: - glbasememory: rollback map state when subclass map fails - Otherwise our state doesn't reflect reality. - -2016-03-31 19:31:00 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemorypbo.c: - glmemorypbo: unmap pbo memory on pbo read error - Otherwise we are returning failure with a dangling map! - Also only unset the NEED_DOWNLOAD flag in download_transfer() if the read actually - succeeds. - -2016-03-31 19:25:32 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/glprototypes/shaders.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - glshader: add glBindFragDataLocation - There are some cases where it's needed for binding in/out variables in shaders. - e.g. glsl 150 (gl 3.2) doesn't support the 'layout (location = ?)' specifiers in - the shader source so we have to bind them ourselves. - -2016-03-31 12:20:30 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Handle find_stream_for_pad() without g_assert_not_reached() if no pad is found - Happens e.g. if a RECONFIGURE event is sent from downstream while we're - switching pads at this very moment. The old pad is gone and the stream has a - new pad. - https://bugzilla.gnome.org/show_bug.cgi?id=764404 - -2016-03-31 01:21:42 +1100 Matthew Waters <matthew@centricular.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: add support for building against version 6 of the SDK - While mostly API compatible, the ABI has changed so binaries will not work - across header versions (and ultimately nvidia driver releases). - https://bugzilla.gnome.org/show_bug.cgi?id=763324 - -2016-03-30 22:34:59 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-opencv.xml: - * ext/opencv/Makefile.am: - * ext/opencv/gstopencv.cpp: - * ext/opencv/gstpyramidsegment.cpp: - * ext/opencv/gstpyramidsegment.h: - opencv: pyramidsegment: delete element - cvPyrSegmentation() has been deprecated in OpenCV 3.0, and there isn't any - function to replace it. Deleting this element so we can support OpenCV 3.1 - without build issues. - https://bugzilla.gnome.org/show_bug.cgi?id=760473 - -2016-01-26 16:52:37 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com> - - * ext/opencv/gstcvsmooth.cpp: - opencv: gstcvsmooth: Ported to OpenCV version 3.1 - cvarrToMat() is added because it is compatible with all versions of Opencv - and the use the class constructor Mat is eliminated because is deprecated - in 3.X versions. This keeps compatibility with 2.4. - https://bugzilla.gnome.org/show_bug.cgi?id=760473 - -2016-01-27 10:05:13 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com> - - * ext/opencv/gstgrabcut.cpp: - opencv: grabcut: Ported to OpenCV version 3.1 - cvarrToMat() is added because it is compatible with all versions of Opencv - and using the class Mat constructor is eliminated, because is deprecated - in 3.X versions. The use the using namespace cv because is called some - functions many times. This keeps compatibility with 2.4. - https://bugzilla.gnome.org/show_bug.cgi?id=760473 - -2016-01-27 15:37:39 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com> - - * ext/opencv/gstfaceblur.cpp: - opencv: faceblur: Ported to OpenCV version 3.1 - cvarrToMat() is added because it is compatible with all versions of Opencv - and the use of the class constructor Mat is eliminated because is deprecated - in 3.X versions. Included 'using namespace std' because it is needed for the - Vector class in 3.X versions. This keeps compatibility with 2.4. - https://bugzilla.gnome.org/show_bug.cgi?id=760473 - -2016-01-27 15:51:37 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com> - - * ext/opencv/gsthanddetect.cpp: - opencv: handdetect: Ported to OpenCV version 3.1 - cvarrToMat() is added because it is compatible with all versions of Opencv - and the use of the class constructor Mat is eliminated because is deprecated - in 3.X versions. Included 'using namespace std' because it is needed for the - vector class in 3.X versions. This keeps compatibility with 2.4. - https://bugzilla.gnome.org/show_bug.cgi?id=760473 - -2016-01-27 16:51:13 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com> - - * ext/opencv/gstretinex.cpp: - opencv: retinex: Ported to OpenCV version 3.1 - cvarrToMat() is added because it is compatible with all versions of Opencv - and using the class constructor Mat is eliminated because is deprecated - in 3.X versions. This keeps compatibility with 2.4. - https://bugzilla.gnome.org/show_bug.cgi?id=760473 - -2016-01-28 16:19:46 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com> - - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstdisparity.h: - opencv: disparity: Ported to OpenCV version 3.1 - 'METHOD_VAR', 'METHOD_GC' is removed because there aren't equivalent functions - in new OpenCV versions. 'img_right_as_cvMat_rgb', 'img_left_as_cvMat_rgb' and - 'depth_map_as_cvMat2' variables is removed because these aren't used. - cvarrToMat() is added because it is compatible with all versions of Opencv - and using the class Mat constructor is eliminated, because is deprecated - in 3.X versions. The use 'using namespace cv' because is called some - functions many times. This keeps compatibility with 2.4. - https://bugzilla.gnome.org/show_bug.cgi?id=760473 - -2016-02-01 13:58:49 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com> - - * ext/opencv/gstskindetect.cpp: - opencv: skindetect: Ported to OpenCV version 3.1 - cvCVPixToPlane() has been deprecated in OpenCV 3.0, and there is - function to replace it cvSplit(). The include compat.hpp is deleted because - in 3.X versions doen't exist and it isn't necessary for 2.4.X versions - in this element. This keeps compatibility with 2.4. - https://bugzilla.gnome.org/show_bug.cgi?id=760473 - -2016-01-28 17:40:51 +0100 Vanessa Chipirras Navalon <vanechipi@qtec.com> - - * configure.ac: - * ext/opencv/gstopencvutils.cpp: - opencv: Ported to OpenCV version 3.1 OpenCV - configure.ac was changed to work with new versions of OpenCV 3.X. - A new include is added gstopencvutils.cpp because it contains - the previous. This keeps compatibility with 2.4. - https://bugzilla.gnome.org/show_bug.cgi?id=760473 - -2016-03-30 10:34:07 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstahcsrc.c: - ahcsrc: There's no point in read-only CONSTRUCT properties - And creating one is causing assertions. Also get rid of the other CONSTRUCT - property as it's a) unneeded for default initialization and b) you're not - supposed to use constructor properties when creating element instances and the - GStreamer API doesn't provide direct ways for doing so. - https://bugzilla.gnome.org/show_bug.cgi?id=764339 - -2016-03-07 14:57:35 +0100 Edward Hervey <edward@centricular.com> - - * ext/teletextdec/gstteletextdec.c: - teletexdec: Simplify negotiation code - No need to use a while() loop if we're going only going to use - the first structure of the caps ... - CID #1341748 - -2016-03-28 13:52:07 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/libs/aggregator.c: - aggregator: Fix leak in unit test - GST_PAD_PROBE_HANDLED means that we should've unreffed the probe data, - it was handled by us in one way or another. - -2016-03-28 08:46:10 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * .gitignore: - .gitignore: Ignore some more test temporary files - -2016-03-28 08:45:45 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * tests/check/elements/compositor.c: - tests/compositor: Add test for aggregator pad numbering - Tests that the behaviour in 7a5cb5a473 is being conformed to. - -2016-03-27 19:06:50 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Fix strcmp test for sink template - -2016-03-27 18:41:30 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Don't try to be too smart while allocating pad names - Previously, while allocating the pad number for a new pad, aggregator was - maintaining an interesting relationship between the pad count and the pad - number. - If you requested a sink pad called "sink_6", padcount (which is badly named and - actually means number-of-pads-minus-one) would be set to 6. Which means that if - you then requested a sink pad called "sink_0", it would be assigned the name - "sink_6" again, which fails the non-uniqueness test inside gstelement.c. - This can be fixed by instead setting padcount to be 7 in that case, but this - breaks manual management of pad names by the application since it then becomes - impossible to request a pad called "sink_2". Instead, we fix this by always - directly using the requested name as the sink pad name. Uniqueness of the pad - name is tested separately inside gstreamer core. If no name is requested, we use - the next available pad number. - Note that this is important since the sinkpad numbering in aggregator is not - meaningless. Videoaggregator uses it to decide the Z-order of video frames. - -2016-02-23 15:11:36 +0100 Thibault Saunier <tsaunier@gnome.org> - - * configure.ac: - * ext/lv2/Makefile.am: - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - * ext/lv2/gstlv2filter.c: - lv2: Port filters to GStreamer 1.0 and use lilv instead of slv2 - Properly separate files as we will not have only one single base class - for all elements as we used to with 0.10, but the same way it is done - with ladspa, we subclass GstAudioFilter, GstBaseSource etc... - https://bugzilla.gnome.org/show_bug.cgi?id=678207 - -2016-03-27 14:29:58 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtksink.c: - * ext/gtk/gtkgstbasewidget.c: - gtk: Fix logging in base widget and fix desc of GL sink - Set a default category for gtkgstbasewidget lest the logging go to the 'default' - category where it can't be found easily - -2016-03-27 03:11:45 +0200 Yann Jouanin <yjo@witbe.net> - - * ext/rtmp/gstrtmpsrc.c: - * ext/rtmp/gstrtmpsrc.h: - rtmpsrc plugin : add timeout option - https://bugzilla.gnome.org/show_bug.cgi?id=764251 - -2016-03-18 13:35:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Instead of releasing request pads on stop(), clear them only - Request pads are requested by applications and as such should only be released - by them again. Instead of releasing them when stopping the muxer, just clear - their state so that they can be used again when starting the muxer again. - https://bugzilla.gnome.org/show_bug.cgi?id=763862 - -2016-03-05 09:47:27 +0200 Sebastian Dröge <sebastian@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/player/gstplayer-media-info-private.h: - * gst-libs/gst/player/gstplayer-media-info.c: - * gst-libs/gst/player/gstplayer-media-info.h: - * gst-libs/gst/player/gstplayer.c: - * win32/common/libgstplayer.def: - player: Add is_live flag to the GstPlayerMediaInfo - https://bugzilla.gnome.org/show_bug.cgi?id=763126 - -2016-02-29 11:39:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/sdp/Makefile.am: - * gst/sdp/gstsdpelem.c: - * gst/sdp/gstsdpsrc.c: - * gst/sdp/gstsdpsrc.h: - sdp: Add new sdpsrc element - This can read from an SDP file or get the SDP data via property. Works - around the problem that sdpdemux inside decodebin fails because the - GST_STATE_CHANGE_NO_PREROLL is not observed by the pipeline. - See https://bugzilla.gnome.org/show_bug.cgi?id=702495 - https://bugzilla.gnome.org/show_bug.cgi?id=762860 - -2016-03-25 17:49:14 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - gtk/gl: don't assert when gdk doesn't provide a GL context - Allows the application to check whether gtkglsink is supported by setting - the element to READY. - https://bugzilla.gnome.org/show_bug.cgi?id=764148 - -2016-03-07 19:41:19 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: plug EIT string leak - -2016-03-07 19:06:19 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: unref pat table after usage - Remember to unref the GPtrArray of the PAT table after - use - -2016-03-04 20:05:38 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: plug some leaks - Plug various leaks in dvbbasebin. - -2016-03-03 11:31:01 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: simplify variable reset - Just set it directly to 0, instead of checking and reseting - -2016-03-01 18:21:12 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: print time in same format - Makes it easier to compare - -2016-03-15 16:22:59 -0700 Martin Kelly <martin@surround.io> - - * sys/androidmedia/gst-android-hardware-camera.c: - * sys/androidmedia/gstahcsrc.c: - ahc: use g_slice_new instead of g_slice_new0 - In many cases, we use g_slice_new0 and then immediately overwrite the - allocated memory. This is inefficient. Since we're going to immediately - overwrite it, we might as well use plain g_slice_new. - https://bugzilla.gnome.org/show_bug.cgi?id=763998 - -2016-03-10 08:50:28 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: post message to application for unhandled keyboard/mouse events - https://bugzilla.gnome.org/show_bug.cgi?id=763403 - -2016-03-10 08:49:01 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * ext/directfb/dfbvideosink.c: - dfbvideosink: post message to application for unhandled keyboard/mouse events - https://bugzilla.gnome.org/show_bug.cgi?id=763403 - -2016-03-10 08:44:57 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * ext/gtk/gstgtkbasesink.c: - gtkbasesink: post message to application for unhandled keyboard/mouse events - https://bugzilla.gnome.org/show_bug.cgi?id=763403 - -2016-03-03 20:10:16 +0900 Justin Kim <justin.kim@collabora.com> - - * sys/androidmedia/gstahcsrc.c: - * sys/androidmedia/gstahcsrc.h: - ahcsrc: remove probe_properties - It's a residue of 0.10. - https://bugzilla.gnome.org/show_bug.cgi?id=763100 - -2016-03-04 15:50:26 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * ext/apexsink/gstapexsink.c: - * ext/assrender/gstassrender.c: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2enc.c: - * ext/curl/gstcurlbasesink.c: - * ext/daala/gstdaaladec.c: - * ext/daala/gstdaalaenc.c: - * ext/dash/gstdashdemux.c: - * ext/directfb/dfbvideosink.c: - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlsenc.c: - * ext/dtls/gstdtlssrtpdec.c: - * ext/dtls/gstdtlssrtpdemux.c: - * ext/dtls/gstdtlssrtpenc.c: - * ext/dts/gstdtsdec.c: - * ext/faac/gstfaac.c: - * ext/faad/gstfaad.c: - * ext/flite/gstflitetestsrc.c: - * ext/fluidsynth/gstfluiddec.c: - * ext/gl/caopengllayersink.m: - * ext/gl/gstglcolorconvertelement.c: - * ext/gl/gstgldownloadelement.c: - * ext/gl/gstglfilterbin.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixerbin.c: - * ext/gl/gstglsrcbin.c: - * ext/gl/gstglstereomix.c: - * ext/gl/gstglstereosplit.c: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstgluploadelement.c: - * ext/gl/gstglvideoflip.c: - * ext/gme/gstgme.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmenc.c: - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtksink.c: - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlssink.c: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatetiger.c: - * ext/libde265/libde265-dec.c: - * ext/libmms/gstmms.c: - * ext/libvisual/visual-gl.c: - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - * ext/modplug/gstmodplug.cc: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mplex/gstmplex.cc: - * ext/musepack/gstmusepackdec.c: - * ext/nas/nassink.c: - * ext/neon/gstneonhttpsrc.c: - * ext/openal/gstopenalsink.c: - * ext/openal/gstopenalsrc.c: - * ext/opencv/gstcvequalizehist.cpp: - * ext/opencv/gstcvlaplace.cpp: - * ext/opencv/gstcvsobel.cpp: - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstedgedetect.cpp: - * ext/opencv/gstfaceblur.cpp: - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gstgrabcut.cpp: - * ext/opencv/gsthanddetect.cpp: - * ext/opencv/gstmotioncells.cpp: - * ext/opencv/gstpyramidsegment.cpp: - * ext/opencv/gstretinex.cpp: - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstskindetect.cpp: - * ext/opencv/gsttemplatematch.cpp: - * ext/opencv/gsttextoverlay.cpp: - * ext/openexr/gstopenexrdec.cpp: - * ext/openh264/gstopenh264dec.cpp: - * ext/openh264/gstopenh264enc.cpp: - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegenc.c: - * ext/openni2/gstopenni2src.cpp: - * ext/opus/gstopusparse.c: - * ext/qt/gstqtsink.cc: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/rsndec.c: - * ext/resindvd/rsninputselector.c: - * ext/resindvd/rsnparsetter.c: - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgoverlay.c: - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsrc.c: - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcenc.c: - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/sdl/sdlaudiosink.c: - * ext/smoothstreaming/gstmssdemux.c: - * ext/sndfile/gstsfdec.c: - * ext/sndfile/gstsfsink.c: - * ext/sndfile/gstsfsrc.c: - * ext/sndio/sndiosink.c: - * ext/sndio/sndiosrc.c: - * ext/soundtouch/gstpitch.cc: - * ext/spandsp/gstdtmfdetect.c: - * ext/spandsp/gstspanplc.c: - * ext/spandsp/gsttonegeneratesrc.c: - * ext/spc/gstspc.c: - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpenc.c: - * ext/teletextdec/gstteletextdec.c: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * ext/voaacenc/gstvoaacenc.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/vulkan/vksink.c: - * ext/wayland/gstwaylandsink.c: - * ext/webp/gstwebpdec.c: - * ext/webp/gstwebpenc.c: - * ext/x265/gstx265enc.c: - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxvidenc.c: - * ext/zbar/gstzbar.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/insertbin/gstinsertbin.c: - * gst/adpcmdec/adpcmdec.c: - * gst/adpcmenc/adpcmenc.c: - * gst/aiff/aiffmux.c: - * gst/aiff/aiffparse.c: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfparse.c: - * gst/asfmux/gstrtpasfpay.c: - * gst/audiobuffer/gstaudioringbuffer.c: - * gst/audiofxbad/gstaudiochannelmix.c: - * gst/audiomixer/gstaudiointerleave.c: - * gst/audiomixer/gstaudiomixer.c: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstwavescope.c: - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautovideoconvert.c: - * gst/bayer/gstrgb2bayer.c: - * gst/camerabin2/gstdigitalzoom.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/cdxaparse/gstcdxaparse.c: - * gst/cdxaparse/gstvcdparse.c: - * gst/coloreffects/gstchromahold.c: - * gst/coloreffects/gstcoloreffects.c: - * gst/compositor/compositor.c: - * gst/dataurisrc/gstdataurisrc.c: - * gst/dccp/gstdccpclientsink.c: - * gst/dccp/gstdccpclientsrc.c: - * gst/dccp/gstdccpserversink.c: - * gst/dccp/gstdccpserversrc.c: - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/gstchecksumsink.c: - * gst/debugutils/gstchopmydata.c: - * gst/debugutils/gstcompare.c: - * gst/debugutils/gstdebugspy.c: - * gst/debugutils/gsterrorignore.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/faceoverlay/gstfaceoverlay.c: - * gst/festival/gstfestival.c: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/freeverb/gstfreeverb.c: - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstsolarize.c: - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/hdvparse/gsthdvparse.c: - * gst/id3tag/gstid3mux.c: - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosrc.c: - * gst/interlace/gstinterlace.c: - * gst/ivfparse/gstivfparse.c: - * gst/ivtc/gstcombdetect.c: - * gst/ivtc/gstivtc.c: - * gst/jp2kdecimator/gstjp2kdecimator.c: - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - * gst/librfb/gstrfbsrc.c: - * gst/midi/midiparse.c: - * gst/mixmatrix/mixmatrix.c: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mve/gstmvemux.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmux.c: - * gst/netsim/gstnetsim.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/onvif/gstrtponvifparse.c: - * gst/onvif/gstrtponviftimestamp.c: - * gst/overlay/gstoverlay.c: - * gst/patchdetect/gstpatchdetect.c: - * gst/pcapparse/gstirtspparse.c: - * gst/pcapparse/gstpcapparse.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - * gst/rawparse/gstrawparse.c: - * gst/removesilence/gstremovesilence.c: - * gst/sdi/gstsdidemux.c: - * gst/sdi/gstsdimux.c: - * gst/sdp/gstsdpdemux.c: - * gst/segmentclip/gstaudiosegmentclip.c: - * gst/segmentclip/gstvideosegmentclip.c: - * gst/siren/gstsirendec.c: - * gst/siren/gstsirenenc.c: - * gst/smooth/gstsmooth.c: - * gst/speed/gstspeed.c: - * gst/subenc/gstsrtenc.c: - * gst/subenc/gstwebvttenc.c: - * gst/tta/gstttadec.c: - * gst/tta/gstttaparse.c: - * gst/vbidec/gstvbidec.c: - * gst/videoframe_audiolevel/gstvideoframe-audiolevel.c: - * gst/videomeasure/gstvideomeasure_collector.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstpngparse.c: - * gst/videoparsers/gstvc1parse.c: - * gst/vmnc/vmncdec.c: - * gst/y4m/gsty4mdec.c: - * gst/yadif/gstyadif.c: - * sys/acmenc/acmenc.c: - * sys/acmmp3dec/acmmp3dec.c: - * sys/androidmedia/gstahcsrc.c: - * sys/applemedia-nonpublic/celvideosrc.c: - * sys/applemedia-nonpublic/miovideosrc.c: - * sys/applemedia/atdec.c: - * sys/applemedia/avfassetsrc.m: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/avsamplevideosink.m: - * sys/applemedia/iosassetsrc.m: - * sys/applemedia/qtkitvideosrc.m: - * sys/applemedia/vtdec.c: - * sys/avc/gstavcsrc.cpp: - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsrc.c: - * sys/d3dvideosink/d3dvideosink.c: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/directsound/gstdirectsoundsrc.c: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dxr3/dxr3audiosink.c: - * sys/dxr3/dxr3spusink.c: - * sys/dxr3/dxr3videosink.c: - * sys/fbdev/gstfbdevsink.c: - * sys/linsys/gstlinsyssdisink.c: - * sys/linsys/gstlinsyssdisrc.c: - * sys/nvenc/gstnvbaseenc.c: - * sys/nvenc/gstnvh264enc.c: - * sys/opensles/openslessink.c: - * sys/opensles/openslessrc.c: - * sys/pvr2d/gstpvrvideosink.c: - * sys/qcam/gstqcamsrc.c: - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsrc.c: - * sys/tinyalsa/tinyalsasink.c: - * sys/uvch264/gstuvch264_mjpgdemux.c: - * sys/uvch264/gstuvch264_src.c: - * sys/vcd/vcdsrc.c: - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wininet/gstwininetsrc.c: - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.c: - * tests/check/elements/autoconvert.c: - * tests/check/elements/camerabin.c: - * tests/check/elements/test_http_src.c: - * tests/check/libs/aggregator.c: - * tools/element-templates/sinkpad: - * tools/element-templates/sinkpad-audio: - * tools/element-templates/sinkpad-simple: - * tools/element-templates/sinkpad-template: - * tools/element-templates/srcpad: - * tools/element-templates/srcpad-audio: - * tools/element-templates/srcpad-simple: - * tools/element-templates/srcpad-template: - bad: use new gst_element_class_add_static_pad_template() - https://bugzilla.gnome.org/show_bug.cgi?id=763081 - -2016-03-07 17:23:23 -0800 Martin Kelly <martin@surround.io> - - * sys/androidmedia/gst-android-hardware-camera.c: - ahc: eliminate AHC*_CALL macros - Currently, we use AHC*_CALL macros to call many of the Camera functions. - However, we already have helper classes to call the Camera functions, so - eliminate the macros. - As a nice side-benefit, we also get improved error handling and - reporting when something goes wrong calling these functions, because a - GError gets populated, and we log a GST_ERROR when something fails. This - was harder to do using macros, as all error handling was hidden from the - caller. - https://bugzilla.gnome.org/show_bug.cgi?id=763065 - -2016-02-18 11:29:06 -0800 Martin Kelly <martin@surround.io> - - * sys/androidmedia/gst-android-hardware-camera.c: - ahc: use gst unref functions - https://bugzilla.gnome.org/show_bug.cgi?id=763065 - -2016-02-18 14:08:13 -0800 Martin Kelly <martin@surround.io> - - * sys/androidmedia/gst-android-hardware-camera.c: - ahc: use gst new object functions - https://bugzilla.gnome.org/show_bug.cgi?id=763065 - -2016-03-17 13:44:13 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlace: fix negotiation with fixed framerate downstream - https://bugzilla.gnome.org/show_bug.cgi?id=762924 - -2016-03-24 14:08:46 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/examples/gl/gtk/fxtest/fxtest.c: - gl/gtk: Fix compiler warning in example - fxtest.c: In function ‘main’: - fxtest.c:190:3: error: ISO C90 forbids mixed declarations and code -Werror=declaration-after-statement - GtkWidget *window; - ^~~~~~~~~ - -2016-03-24 13:33:12 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -=== release 1.8.0 === - -2016-03-24 12:33:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.8.0 - -2016-03-24 12:05:23 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2016-03-23 13:43:46 +0100 Thibault Saunier <tsaunier@gnome.org> - - * ext/vulkan/vkinstance.c: - vulkan: Minor string fix - -2016-03-23 22:13:47 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkinstance.c: - vulkan: VK_API_VERSION has been removed - In a stable release too, naughty. - Use VK_API_VERSION_1_0 instead - https://bugzilla.gnome.org/show_bug.cgi?id=764066 - -2016-03-22 07:20:59 +0000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/glprototypes/sync.h: - gl/proto: sync operations are available on GLES 3.0 - Without the GST_GL_API_GLES2 bit set, we will not even attempt to look - for the function pointers in the core library and will fallback to - glFlush/glFinish. - -2016-03-22 07:16:34 +0000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - gl/build: add GST_GL_HAVE_DMABUF to gstglconfig.h - it's exposed in public API so hiding it in an AC_DEFINE for config.h only - works when building libgstgl itself. Attempting to use libgstgl (especially - on egl platforms) will throw a compilation error. - -2016-03-21 15:22:15 +0900 Jimmy Ohn <yongjin.ohn@lge.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Fix query memory leak - Peer query isn't being freed in case of GST_QUERY_SEEKING. - https://bugzilla.gnome.org/show_bug.cgi?id=763974 - -2016-03-18 19:45:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/vulkan/Makefile.am: - vulkan: Ship missing headers with tarballs - https://bugzilla.gnome.org/show_bug.cgi?id=763877 - -2016-03-17 19:24:32 +0000 Aleksander Wabik <awabik@opera.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - h264parse, h265parse: fix handling of downstream force-key-unit events - The parser handles the downstream force-key-unit event incorrectly, - it tries to parse it as an upstream force-key-unit event, does not - check the return value, and then uses uninitialized memory in - "all_headers" boolean variable. - https://bugzilla.gnome.org/show_bug.cgi?id=763793 - -2016-03-17 22:43:12 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: unset GL_UNPACK_ROW_LENGTH in opengl3 - If the user uploads their own texture without setting the unpack length, then - then the result will have the appearance of stride mismanagement due to - an incorrect row length. - -2016-03-17 16:34:42 +1100 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/qt/mousevideooverlay/main.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/main.cpp: - * tests/examples/gl/qt/qglwtextureshare/main.cpp: - gl/examples/qt: restrict the GL API to opengl where needed - Until the examples are ported to opengl3/gles2, they will not work with any - other GL api. - -2016-03-17 16:31:52 +1100 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/gtk/filtervideooverlay/Makefile.am: - * tests/examples/gl/gtk/filtervideooverlay/main.cpp: - * tests/examples/gl/gtk/fxtest/Makefile.am: - * tests/examples/gl/gtk/fxtest/fxtest.c: - * tests/examples/gl/gtk/fxtest/pixbufdrop.c: - * tests/examples/gl/gtk/gtkvideooverlay/Makefile.am: - * tests/examples/gl/gtk/gtkvideooverlay/main.cpp: - gl/examples/gtk: call XInitThreads - Fixes some sporadic X11 threading assertions. - -2016-03-17 03:06:05 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglutils.c: - glutils: remove custom code for setting caps features - Just use gst_caps_set_features() instead. - -2016-03-17 01:52:00 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: only allow the same src/sink caps when we are in passthrough mode - If we are given caps with extra features (like the overlay composition - features), we can only deal with that when we are in passthrough mode. - Previously we were bailing entirely and not allowing passthrough filter elements - with things like textoverlay. - Fixes the following pipeline (assuming glfilter supports passthrough): - gl ! textoverlay ! glfilter ! ... ! glimagesinkelement - https://bugzilla.gnome.org/show_bug.cgi?id=763756 - -2016-03-16 22:48:00 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: deal with the ANY caps feature correctly - When transforming, xplode it out into the necessary caps features both - with and without the passthough features. - Fixes negotiation in the following class of pipelines: - gl ! textoverlay ! glupload ! glimagesinkelement - https://bugzilla.gnome.org/show_bug.cgi?id=763756 - -2016-03-16 22:19:25 +1100 Matthew Waters <matthew@centricular.com> - - * ext/wayland/wldisplay.c: - wayland: fix null pointer dereference on error - gnome-shell doesn't the support wl_scaler interface which makes creating a - wayland display fail creation. - Found in the generic state changes test - -2016-03-16 22:16:34 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglstereomix.c: - * ext/gl/gstglstereosplit.c: - glstereo{mix,split}: allow running on GLES 2/3 - It's mostly supported for GLES 2.x, fully supported on GLES 3.x - -2016-03-16 12:03:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/opensles/openslesringbuffer.c: - openslesringbuffer: Warn if the position reported by OpenSL is higher than what we queued up so far - This would hint at wrong position reporting, and apparently sometimes happens - after a seek. - -2016-03-16 11:34:46 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfjpeg2000.c: - mxfmux: Fix typo in JPEG2000 colorspace - sRGC -> sRGB - -=== release 1.7.91 === - -2016-03-15 12:13:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.7.91 - -2016-03-15 11:56:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2016-03-12 15:44:54 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: add video/x-h265 to template caps - -2016-03-12 03:00:14 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - mpegts: Don't leave freed programs in the hash table - When the sub-class claims a program for later freeing, make - sure it's not left in the hash table, or it can cause crashes on shutdown. - Make sure tsdemux frees any program it has kept around at shutdown - if it wasn't freed already. - https://bugzilla.gnome.org/show_bug.cgi?id=763503 - -2016-03-11 17:34:03 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth265parse.c: - videoparsers: h265: Fix segfault while transforming hevc to nal aligned bytestream - Create temporary ParseFrame and copy the nal size buffer region - for each nal unit like we did for h264. - https://bugzilla.gnome.org/show_bug.cgi?id=763494 - -2016-03-11 10:08:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - amc: Correctly handle NULL input buffers - https://bugzilla.gnome.org/show_bug.cgi?id=763401 - -2016-03-11 10:00:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstjniutils.c: - amcvideodec: getOutputBuffers() returns a NULL array when a surface was configured - So don't error out if it does. - https://bugzilla.gnome.org/show_bug.cgi?id=763401 - -2016-03-11 01:40:39 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgleffects.c: - * ext/gl/gstgleffects.h: - gleffects; give each effect a unique long name and description - Gives applications that scrape the factory details more detailed and unique - details on the exact element. - https://bugzilla.gnome.org/show_bug.cgi?id=760566 - -2016-03-10 17:46:05 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglslstage.c: - glshader: some compatibility changes for GL 1.4 - GL 1.4 (with GL_ARB_shader_objects) doesn't have glIsProgram or glIsShader - equivalents. As they are simply assertions, skip them when there isn't a - valid function pointer. - -2016-03-10 00:29:41 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfilterapp.c: - glfilterapp: update for the use of shaders - Fixes black output when placed in pipelines (using the default drawing). - https://bugzilla.gnome.org/show_bug.cgi?id=763365 - -2016-03-10 00:27:53 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - glfilter: retrieve the shader attributes from the GL thread - Otherwise we will receive bogus values - https://bugzilla.gnome.org/show_bug.cgi?id=763365 - -2016-03-10 00:24:48 +1100 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/generic/cube/main.cpp: - * tests/examples/gl/generic/cubeyuv/main.cpp: - gl/examples/cube*: choose opengl by default - The examples don't work with any other GL API. - Also fix the yuv example to not translate the cube out of the clipping area. - -2016-03-10 00:23:14 +1100 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/gtk/fxtest/fxtest.c: - gl/examples/fxtest: add needed glupload to the pipeline - Fixes a negotiation failure in the example - -2016-03-07 13:04:08 +0100 Edward Hervey <edward@centricular.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparser: Handle non-hierarchical profiles again - This is a regression from since mpegvideoparser was switched to - use the codecparsing library. - The problem is that the high bit of the profile_and_level is used - to specify non-hierarchical profiles and levels. Unfortunately we - were discarding that information. - Expose that escape bit, and use it in the element - https://bugzilla.gnome.org/show_bug.cgi?id=763220 - -2016-03-09 11:58:43 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Fix window memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=763356 - -2016-03-08 11:41:49 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Don't reset/recalculate segments with accurate seeks - When dealing with accurate seeks, we must send out a segment which - is exactly what is requested. - https://bugzilla.gnome.org/show_bug.cgi?id=763262 - -2016-03-08 02:06:46 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: signal continuation in reset - We want to iterate over all the pads, not just the first one. Fix by returning - TRUE in the GstAggregatorPadForeachFunc. - Removes a GST_IS_GL_CONTEXT() assertion on shutdown with >2 inputs - using gst-launch. - -2016-03-08 00:35:22 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * tests/check/libs/gstglcontext.c: - gldisplay: make readding the same context a no-op - With e38af2304427db908a16bbae0e60aa68be1ba5b5 returning the correct contexts, - gst_gl_display_add_context() was susceptible to causing infinte loops when - adding the same GstGLContext more than once. Fix and add a test for - gst_gl_display_add_context(). - Fixes glvideomixer gst-validate tests. - -2016-03-07 08:52:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.h: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - Revert "libgstgl: cocoa, eagl: don't marshal GL calls to the context thread" - This reverts commit 797d6415dfd6e111efb2cab544958a67cbf22b17. - We're frozen for 1.8.0 release and this change might have bigger impact. - -2016-03-07 16:03:25 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.h: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - libgstgl: cocoa, eagl: don't marshal GL calls to the context thread - Execute GL calls without marshalling them to the context thread. In the cocoa - and eagl backends calling gst_gl_context_activate is cheap and therefore calling - it on the current thread and serializing GL calls with a per-context lock is - more efficient (faster and has less overhead) than marshalling everything to the - context thread. - This optimization cuts a large overhead in g_poll (continuously waking up the - context thread) and in g_mutex_*/g_cond_* (waiting for results from the context - thread). - -2016-03-05 17:16:24 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: really retrieve glcontext for a specific thread - When requesting a glcontext (regardless of thread), the result was correct. - However, when requesting current glcontext on a specific thread, it could - come up with a glcontext active on another thread. - https://bugzilla.gnome.org/show_bug.cgi?id=763168 - -2016-03-06 19:35:38 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglbasefilter.c: - * gst-libs/gst/gl/gstglbasefilter.h: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstgldebug.c: - * gst-libs/gst/gl/gstgldebug.h: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglsl.c: - * gst-libs/gst/gl/gstglslstage.c: - * gst-libs/gst/gl/gstglslstage.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglviewconvert.c: - gl: misc docs fixes/additions - -2016-03-06 19:32:21 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgl_enums.h: - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbasememory.h: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstglformat.c: - * gst-libs/gst/gl/gstglformat.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmemorypbo.c: - gl*memory: document new functionality and objects - -2016-03-06 19:23:06 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs.types: - docs: add new GL api to .types file for type/signal introspection - -2016-03-06 19:22:31 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/Makefile.am: - docs: ignore some private GL headers - -2016-03-06 19:18:54 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - docs/gl: add gl functions/structs from -unused into the docs - -2016-03-05 19:48:45 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: handle some more unfixed fields when fixating caps - -2016-03-05 11:38:46 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/examples/gtk/Makefile.am: - gtk: examples: #define GST_USE_UNSTABLE_API and link with X11_LIBS - X11_LIBS is needed for XInitThreads() and without the #define we get - warnings about the GL API being still unstable. - -2016-03-02 19:32:13 +0900 Justin Kim <justin.kim@collabora.com> - - * sys/androidmedia/gst-androidcamera.c: - androidmedia: Remove unused file - ahcsrc is registered by gstamc.c - https://bugzilla.gnome.org/show_bug.cgi?id=763098 - -2016-02-17 09:36:15 -0800 Martin Kelly <martin@surround.io> - - * sys/androidmedia/gstamc.c: - amc: properly deinit when ahcsrc register fails - In the androidmedia plugin_init, we initialize various resources on the - Android device. If anything fails during this series of initializations, - we need to deinitialize any initializations that already occurred. - However, we don't do so if we fail to register the ahcsrc element. Fix - this. - https://bugzilla.gnome.org/show_bug.cgi?id=763065 - -2016-02-18 11:00:50 -0800 Martin Kelly <martin@surround.io> - - * sys/androidmedia/gst-android-hardware-camera.c: - ahc: correct error message - The error message is specific to only one of the failure cases and is - misleading in the others. Correct it to be more generic and cover all - the failure cases. - https://bugzilla.gnome.org/show_bug.cgi?id=763065 - -2016-02-16 11:45:01 -0800 Martin Kelly <martin@surround.io> - - * sys/androidmedia/gst-android-hardware-camera.c: - ahc: remove unneeded #include <stdio.h> - https://bugzilla.gnome.org/show_bug.cgi?id=763065 - -2016-02-18 16:00:18 -0800 Martin Kelly <martin@surround.io> - - * sys/androidmedia/gstahcsrc.c: - ahc: typo fix - https://bugzilla.gnome.org/show_bug.cgi?id=763065 - -2016-03-03 22:15:07 -0500 Joe Gorse <jhgorse@gmail.com> - - * ext/hls/Makefile.am: - hls: Add OPENSSL_CFLAGS to CFLAGS - https://bugzilla.gnome.org/show_bug.cgi?id=763079 - -2016-03-03 19:45:43 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglbasememory.c: - glbasememory: Don't change maxsize at run-time - Maxsize is initialized once and should never change. Allocating data - should have no impact on the selected max size for this memory. This - causing memory map failure as the maxsize would become smaller then - size. This happened when using direct rendering in avviddec on GL that - does not support PBO transfer. - https://bugzilla.gnome.org/show_bug.cgi?id=763045 - -2016-03-01 18:22:37 +0300 Sergey Borovkov <sergey.borovkov@wireload.net> - - * ext/qt/qtitem.cc: - qml: Fix leak of the OpenGL contexts - Matthew Waters: add NULL checks before unreffing - https://bugzilla.gnome.org/show_bug.cgi?id=762999 - -2016-02-29 14:24:46 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/vulkan/vksink.c: - vksink: fix spelling on failed _ensure_data() error message - -2016-03-02 21:46:44 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * ext/mpeg2enc/gstmpeg2enc.cc: - mpeg2enc: Provide format as a string instead of a char to gst_structure_new - The format was provided as 'I420' instead of "I420", causing a crash. - -2015-01-20 16:20:10 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: handle early PTS conversion when a group has been found - In some cases, the PTS might be smaller than the first observed PCR - value which causes element to apply wraparound leading to bogus - timestamp. To solve this, we only apply it if the PTS-PCR difference is - greater that 1 second to be sure that it's a real wraparound. - Moreover, using unsigned 32 bits values to handle wrapover could end up - with bogus value, so it use pts value to handle it. - Also, convert pcr time to gst time before comparing it to pts. - Since refpcr is expressed in PCR time base while pts is expressed in GStreamer - time. - https://bugzilla.gnome.org/show_bug.cgi?id=743259 - -2016-03-02 10:41:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Fix REMOVE_SNAP_FLAGS() macro - !(flag1 | flag2 | flag3) is always evaluation to 0. ~ was meant here - instead of !. - CID 1352032. - -=== release 1.7.90 === - -2016-03-01 18:23:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.7.90 - -2016-03-01 17:10:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2016-03-01 16:53:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/bg.po: - * po/fr.po: - * po/nl.po: - po: Update translations - -2016-02-29 12:35:58 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth264parse.c: - videoparsers: h264: Disable passthorugh mode enabling - Enabling passthorugh mode is causing multiple issue: - For nal aligned multiresoluton streams, passthrough mode - make h264parse unable to advertise the new resoultions. - Also causing issues while parsing MVC streams which have two - separate layers (base-view and non-base-view). - This fix is only a temporary workaround. - For MVC, proper fixes needed in many places: - (handle prefix nal unit, handle non-base-view slice nal extension, - fix the picture_start detection for multi-layer-mvc streams etc) - https://bugzilla.gnome.org/show_bug.cgi?id=758656 - -2016-02-29 11:53:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: Set caps to application/x-rtp instead of application/x-unknown as returned by the SDP helpers - The SDP helpers can't know if this is going to be RTP, SRTP, or .... - https://bugzilla.gnome.org/show_bug.cgi?id=762860 - -2016-02-29 11:51:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: Add pads with the correct names in case an rtpbin is used - They're supposed to be stream_%u and not recv_rtp_src_%u_%u_%u. - https://bugzilla.gnome.org/show_bug.cgi?id=762860 - -2016-02-29 10:38:32 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkutils.c: - vkswapper/vkutils: Fix gerror memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=762842 - -2016-02-29 10:37:11 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * ext/vulkan/vkdevice.c: - vkdevice: Fix duplicate assignment of queue variable - https://bugzilla.gnome.org/show_bug.cgi?id=762842 - -2016-02-29 10:33:45 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * ext/vulkan/vksink.c: - vksink: Fix GError memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=762842 - -2016-02-28 14:06:14 +0000 Tim-Philipp Müller <tim@centricular.com> - - * win32/common/libgstgl.def: - win32: update exports for new libgstgl function - -2016-02-28 10:12:01 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: When outputting on a surface, accept all color formats - We don't have to understand them, we handle them as a GL texture. - https://bugzilla.gnome.org/show_bug.cgi?id=762792 - -2016-02-26 18:17:37 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * tests/check/elements/dash_demux.c: - adaptivedemux: handle snap seeking without setting any position - When the start_type is GST_SEEK_TYPE_NONE for a forward seek - (or stop_type for a reverse) is not set on a snap seeking operation, - the element should use the current position and then snap as requested. - Also fixes uninitialized variable complaint by clang about - 'ts' variable. - -2016-02-26 17:31:44 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: sync index and the selected chunk when seeking - Otherwise the chunk selected isn't matched to the index and - the timing will be different, causing it to actually start - from a different position - -2016-02-26 12:41:13 +0200 Sebastian Dröge <sebastian@centricular.com> - - * common: - Automatic update of common submodule - From a253974 to 6f2d209 - -2016-02-17 20:13:21 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimagememory.c: - eglimagememory: add compatibility definitions for EGL dmabuf - e.g. the RPi doesn't have them defined - -2016-02-26 00:35:30 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * ext/opus/Makefile.am: - * ext/opus/gstopus.c: - opus: rename plugin to opusparse for the time being - Until we fix it up and get rid of the opus dependency and - move it elsewhere too. - -2016-02-19 00:38:33 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-opus.xml: - * ext/opus/Makefile.am: - * ext/opus/gstopus.c: - * ext/opus/gstopuscommon.c: - * ext/opus/gstopuscommon.h: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/opus.c: - opus: remove Opus encoder/decoder, moved to -base - https://bugzilla.gnome.org/show_bug.cgi?id=756282 - -2016-02-26 08:34:11 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - glcontext: add a method to add a context to another share group - Intended for use with wrapped contexts that are created shared with gst's - gl contexts in order to manage the internal sharegroup state correctly. - e.g. with caopengllayer (which is used in glimagesink and caopengllayersink - on OS X), we create a CGL context from the gst context and the sharing state - was not being correctly set on either GL context and gst_gl_context_is_shared() - was always returning FALSE. - With 11fb4fff80b63b9d67a731d4bb238b6c0a29d774 only flushing with multiple - shared contexts, the required flush was not occuring causing screen - corruption or stuttering. - Note: this didn't affect GST_GL_API=opengl pipelines - https://bugzilla.gnome.org/show_bug.cgi?id=762620 - -2016-02-17 15:20:47 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-opus.xml: - * ext/opus/Makefile.am: - * ext/opus/gstopus.c: - * ext/opus/gstrtpopusdepay.c: - * ext/opus/gstrtpopusdepay.h: - * ext/opus/gstrtpopuspay.c: - * ext/opus/gstrtpopuspay.h: - opus: remove Opus RTP elements, they have moved to -good - https://bugzilla.gnome.org/show_bug.cgi?id=756282 - -2016-01-18 08:50:34 +0000 Alex Ashley <alex.ashley@youview.com> - - * tests/check/elements/hls_demux.c: - hlsdemux: tests: pass test name into test setup function - All hlsdemux tests create a GstStructure called "state" that can be used - by test cases to store information during a test. The name of this - structure is arbitrary. When the code was written, the intention was - to use the name of the test, to aid debugging. However, during - development this was lost, so that the state GstStructure is always - given the name "setup_test_variables". - This commit changes this so that the name of the test is used. - https://bugzilla.gnome.org/show_bug.cgi?id=762684 - -2016-02-23 12:42:19 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/compositor.c: - tests: compositor: drop special case for valgrind timeout - The default one is 6 minutes, the test was using 5 minutes so just - resort to using the default. - For the non-valgrind test also use the default 20 secs instead of - reducing it to 6s. No real reason to set a custom value here. - -2016-02-23 12:17:59 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/compositor.c: - tests: compositor: add tests for caps queries - Verifies that proper caps are returned based on what downstream - restricts. - -2016-02-18 10:57:51 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * tests/check/elements/compositor.c: - videoaggregator: fix caps queries to allow proper renegotiation - When caps are already negotiated it should be possible to - select formats other than the one that was negotiated. If downstream - allows alpha video caps and it has already negotiated to a non-alpha - format, caps queries should still return the alpha caps as a possible - format as caps renegotiation can happen. - Includes tests (for compositor) to check that caps queries done after - a caps has been negotiated returns complete results - https://bugzilla.gnome.org/show_bug.cgi?id=757610 - -2016-02-24 17:07:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: Negotiate the decoder in set_format() already - Don't wait until later, we want to know here if the codec can be opened or not - for the requested format. This was removed (accidentially?) by - 119e09eac315f79ac2cf45b4441ad1d932130614 - Without this decodebin has no way to switch to a different decoder if this one - does not work. - https://bugzilla.gnome.org/show_bug.cgi?id=762613 - -2016-02-25 11:34:40 +0200 Joe Gorse <jhgorse@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: Frame durations as CTime to the API, not double - Newer iOS seems to automatically convert, older iOS/OSX just crashes. - https://bugzilla.gnome.org/show_bug.cgi?id=762575 - -2016-02-24 23:48:19 +1100 Matthew Waters <matthew@centricular.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: release the frames and list when searching for an output buffer - Fixes a massive leak in: - videotestsrc ! nvh264enc ! fakesink - -2016-02-23 23:10:20 +1100 Matthew Waters <matthew@centricular.com> - - * ext/qt/gstqtsink.cc: - * ext/qt/qtitem.cc: - qt: use a static_cast instead of dynamic one - The dynamic_cast is a little but of overkill as the app will still crash if it - fails in the later g_assert. - Allows compilation with -fno-rtti - https://bugzilla.gnome.org/show_bug.cgi?id=762526 - -2016-02-24 10:45:17 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * ext/gl/gstglmosaic.c: - * ext/gl/gstglstereomix.c: - * ext/gl/gstglvideomixer.c: - glmixer: iterator didn't advance in continue statement - Leading to a deadlock. - https://bugzilla.gnome.org/show_bug.cgi?id=760873 - -2016-02-23 18:17:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/dataurisrc/gstdataurisrc.c: - dataurisrc: Don't assume that get_current_caps() returns non-NULL caps after has_current_caps() - Remove calls to gst_pad_has_current_caps() which then go on to call - gst_pad_get_current_caps() as the caps can go to NULL in between. Instead just - use gst_pad_get_current_caps() and check for NULL. - https://bugzilla.gnome.org/show_bug.cgi?id=759539 - -2016-02-23 18:13:37 +0200 Dave Craig <dcraig@brightsign.biz> - - * ext/opencv/gstdisparity.cpp: - disparity: Don't assume that get_current_caps() returns non-NULL caps after has_current_caps() - Remove calls to gst_pad_has_current_caps() which then go on to call - gst_pad_get_current_caps() as the caps can go to NULL in between. Instead just - use gst_pad_get_current_caps() and check for NULL. - https://bugzilla.gnome.org/show_bug.cgi?id=759539 - -2016-02-23 10:49:40 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstdashdemux.c: - dashdemux: correctly handle an HTTP-XSDATE that is exactly the size of the date string - The code in the gst_dash_demux_parse_http_xsdate() was trying to - handle the case where the string is not null terminated by resizing - the buffer and appending a zero byte. This does not work if the buffer - is exactly the length of the string because the gst_buffer_resize() - function does not re-allocate the buffer, it just changes its size. - If a buffer is passed to gst_dash_demux_parse_http_xsdate() that is - exactly the length of the string, the function fails with an assert - failure in gst_buffer_resize(). - https://bugzilla.gnome.org/show_bug.cgi?id=762148 - -2016-02-23 11:59:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - docs: Add audiointerleave - -2016-02-22 10:21:47 +0100 Peter Seiderer <ps.report@gmx.net> - - * sys/fbdev/gstfbdevsink.c: - fbdevsink: fix bytes per pixel calculation - Simple pipeline - $ gst-launch-1.0 videotestsrc ! fbdevsink - crashes with SIGSEGV in case the frambuffer xres is smaller - than the virtual xres resolution, e.g.: - $ fbset - mode "800x480-0" - # D: 0.000 MHz, H: 0.000 kHz, V: 0.000 Hz - geometry 800 480 1920 1200 16 - timings 0 0 0 0 0 0 0 - accel true - rgba 5/11,6/5,5/0,0/0 - endmode - Debug: - $ gdb gst-launch-1.0 - (gdb) run videotestsrc ! fbdevsink - (gdb) where - #0 0xb6bd2d24 in __memcpy_neon () - at ../sysdeps/arm/armv7/multiarch/memcpy_impl.S:591 - #1 0xb69b04e8 in gst_fbdevsink_show_frame (videosink=0x10a3378, - buf=0xb5c08838) at gstfbdevsink.c:269 - #2 0xb69e88c4 in gst_base_sink_do_preroll (sink=sink@entry=0x10a3378, - obj=0xb5c08838, obj@entry=0xa0) at gstbasesink.c:2281 - #3 0xb69e92bc in gst_base_sink_do_sync (basesink=basesink@entry=0x10a3378, - obj=0xa0, obj@entry=0xb5c08838, late=0x0, late@entry=0xb6548ba0, - step_end=0x140, step_end@entry=0xb6548ba4) at gstbasesink.c:2500 - #4 0xb69ea67c in gst_base_sink_chain_unlocked ( - basesink=basesink@entry=0x10a3378, obj=0x0, obj@entry=0xb5c08838, - is_list=is_list@entry=0, pad=<optimized out>) at gstbasesink.c:3486 - #5 0xb69ec1c0 in gst_base_sink_chain_main (basesink=0x10a3378, - pad=<optimized out>, obj=0xb5c08838, is_list=0) at gstbasesink.c:3647 - #6 0xb6eb5b10 in gst_pad_chain_data_unchecked (pad=0x10a6170, - type=<optimized out>, data=0xb5c08838) at gstpad.c:4086 - #7 0xb6eb7a34 in gst_pad_push_data (pad=pad@entry=0x10a6020, - type=type@entry=4112, data=0xb5c08838) at gstpad.c:4338 - #8 0xb6ebf344 in gst_pad_push (pad=pad@entry=0x10a6020, - buffer=<optimized out>) at gstpad.c:4454 - #9 0xb69f22f0 in gst_base_src_loop (pad=0x10a6020) at gstbasesrc.c:2845 - #10 0xb6eeddfc in gst_task_func (task=0x10a8828) at gsttask.c:331 - #11 0xb6d485a0 in g_thread_pool_thread_proxy (data=<optimized out>) - at gthreadpoQuit - (gdb) frame 1 - #1 0xb69b04e8 in gst_fbdevsink_show_frame (videosink=0x10a3378, - buf=0xb5c08838) at gstfbdevsink.c:269 - 269 gstfbdevsink.c: No such file or directory. - (gdb) p fbdevsink - $1 = (GstFBDEVSink *) 0x10a3378 - (gdb) p *fbdevsink - $2 = {videosink = {element = {element = {object = {object = { - g_type_instance = {g_class = 0x10a2d60}, ref_count = 3, - qdata = 0x0}, lock = {p = 0x0, i = {0, 0}}, - name = 0x10a2f30 "fbdevsink0", parent = 0x10a70a0, flags = 32, - control_bindings = 0x0, control_rate = 100000000, - last_sync = 18446744073709551615, _gst_reserved = 0x0}, - state_lock = {p = 0x109f9a8, i = {0, 0}}, state_cond = {p = 0x0, i = { - 3, 0}}, state_cookie = 2, target_state = GST_STATE_PAUSED, - current_state = GST_STATE_READY, next_state = GST_STATE_PAUSED, - pending_state = GST_STATE_PAUSED, - last_return = GST_STATE_CHANGE_ASYNC, bus = 0x108bcb8, clock = 0x0, - base_time = 0, start_time = 0, numpads = 1, pads = 0x109cc20, - numsrcpads = 0, srcpads = 0x0, numsinkpads = 1, sinkpads = 0x109cc30, - pads_cookie = 1, _gst_reserved = {0x0, 0x0, 0x0, 0x0}}, - sinkpad = 0x10a6170, pad_mode = GST_PAD_MODE_PUSH, offset = 0, - can_activate_pull = 0, can_activate_push = 1, preroll_lock = {p = 0x1, - i = {1, 0}}, preroll_cond = {p = 0x0, i = {0, 0}}, eos = 0, - need_preroll = 1, have_preroll = 0, playing_async = 1, - have_newsegment = 1, segment = {flags = GST_SEGMENT_FLAG_NONE, rate = 1, - applied_rate = 1, format = GST_FORMAT_TIME, base = 0, offset = 0, - start = 0, stop = 18446744073709551615, time = 0, position = 33333333, - duration = 18446744073709551615, _gst_reserved = {0x0, 0x0, 0x0, - 0x0}}, clock_id = 0x0, sync = 1, flushing = 0, running = 0, - max_lateness = 20000000, priv = 0x10a3188, _gst_reserved = { - 0x0 <repeats 20 times>}}, width = 0, height = 0, priv = 0x10a3180, - _gst_reserved = {0x0, 0x0, 0x0, 0x0}}, fixinfo = { - id = '\000' <repeats 15 times>, smem_start = 1078984704, - smem_len = 4608000, type = 0, type_aux = 0, visual = 2, xpanstep = 1, - ypanstep = 1, ywrapstep = 0, line_length = 3840, mmio_start = 0, - mmio_len = 0, accel = 0, capabilities = 0, reserved = {0, 0}}, varinfo = { - xres = 800, yres = 480, xres_virtual = 1920, yres_virtual = 1200, - xoffset = 0, yoffset = 0, bits_per_pixel = 16, grayscale = 0, red = { - offset = 11, length = 5, msb_right = 0}, green = {offset = 5, - length = 6, msb_right = 0}, blue = {offset = 0, length = 5, - msb_right = 0}, transp = {offset = 0, length = 0, msb_right = 0}, - nonstd = 0, activate = 0, height = 4294967295, width = 4294967295, - accel_flags = 1, pixclock = 0, left_margin = 0, right_margin = 0, - upper_margin = 0, lower_margin = 0, hsync_len = 0, vsync_len = 0, - sync = 0, vmode = 0, rotate = 0, colorspace = 0, reserved = {0, 0, 0, 0}}, - fd = 5, - framebuffer = 0xb654a000 <error: Cannot access memory at address 0xb654a000>, device = 0x10a38d8 "/dev/fb0", width = 320, height = 240, cx = 240, cy = 120, - linelen = 1280, lines = 240, bytespp = 4, fps_n = 30, fps_d = 1} - (gdb) p map - $3 = {memory = 0xb5d24008, flags = GST_MAP_READ, - data = 0xb5d24058 '\377' <repeats 90 times>, "\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\340\377\377\a\377\a\377\a\377\a\377\a\377\a\377\a\377\a\377\a"..., - size = 153600, maxsize = 153603, user_data = {0x0, - 0xb69e3ba4 <gst_base_sink_set_last_buffer_unlocked+92>, 0x10a3378, 0x0}, - _gst_reserved = {0x1, 0x10a3378, 0xb6f50dd8 <_gst_debug_min>, 0xb5c08838}} - (gdb) p i - $4 = 121 - Fix this by changing the fbdevsink->bytespp calculation using - the frame buffer xres_virtual size instead of xres. - https://bugzilla.gnome.org/show_bug.cgi?id=762482 - -2016-02-22 12:53:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c: - * gst-libs/gst/player/gstplayer-video-overlay-video-renderer.h: - * win32/common/libgstplayer.def: - player: Expose more GstVideoOverlay API in the GstPlayerVideoOverlayVideoRenderer - Expose the expose() and set_render_rectangle() methods. These are useful for - proper functioning of the video overlay in various situations and toolkits. - -2016-02-22 21:03:14 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglstereosplit.c: - * gst-libs/gst/gl/gstglbasefilter.c: - gl: fix the build - 2d287812 was incomplete - -2016-02-22 20:49:52 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglstereosplit.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglbasefilter.c: - gl: error out if the configured GL API is unsupported by our element - https://bugzilla.gnome.org/show_bug.cgi?id=759801 - -2016-01-24 17:40:37 +0300 Sergey Borovkov <sergey.borovkov@wireload.net> - - * ext/qt/qtitem.cc: - * ext/qt/qtitem.h: - qmlglsink: Schedule onSceneGrpahInitialized to execute on render thread - onSceneGraphInitialized() is called from non render thread currently when - scene graph is already initialized. - https://bugzilla.gnome.org/show_bug.cgi?id=761003 - -2016-01-07 18:26:26 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/aiff/aiffparse.c: - aiffparse: fix negotiation errors with multi-channel files - Set fallback channel layout on files with more than two - channels. Not clear where to retrieve the real layout from - or what the default layout is for AIFF files, the spec - only seems to specify some layout for up to 6 channels - and the file in question doesn't have a CHAN chunk. - https://bugzilla.gnome.org/show_bug.cgi?id=676425 - -2016-02-21 10:34:56 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/cdxaparse/cdxaparse.vcproj: - * gst/mixmatrix/mixmatrix.vcproj: - * gst/overlay/overlay.vcproj: - * gst/rtjpeg/rtjpeg.vcproj: - * gst/smooth/smooth.vcproj: - * gst/speed/speed.vcproj: - * gst/stereo/stereo.vcproj: - * win32/MANIFEST: - * win32/gst.sln: - * win32/vs6/gst_plugins_bad.dsw: - * win32/vs6/libgstdshow.dsp: - * win32/vs6/libgstdshowdecwrapper.dsp: - * win32/vs6/libgstflv.dsp: - * win32/vs6/libgstmpegvideoparse.dsp: - * win32/vs6/libgstneon.dsp: - * win32/vs8/gst-plugins-bad.sln: - * win32/vs8/libgstdirectsound.vcproj: - * win32/vs9/gst-plugins-bad.sln: - * win32/vs9/libgstdshowsrcwrapper.vcproj: - win32: remove outdated build cruft - This hasn't been touched for generations, doesn't work, - and is just causing confusion. We also don't want to - maintain these files manually. - -2016-02-20 12:55:08 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/daala/gstdaaladec.c: - daala: don't use exported but undeclared core debug category symbols - It's not right and won't work on Windows with MSVC. - -2016-02-19 14:27:59 -0800 Scott D Phillips <scott.d.phillips@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparsers: h265: Fix initialization of slice_deblocking_filter_disabled_flag - H.265 7.4.7.1 says: - > When slice_deblocking_filter_disabled_flag is not present, it is - > inferred to be equal to pps_deblocking_filter_disabled_flag. - https://bugzilla.gnome.org/show_bug.cgi?id=762351 - -2016-02-19 16:40:54 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - mpeg4parser: prevent assertion when scanning for sync code - Only search if there is indeed enough data to be searched otherwise - an assertion is raised - -2016-02-19 17:48:55 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsparse.c: - tsparse: Fix per-program-pad pushing - This fixes a couple of issues regarding the output of (request) - per-program pads output: - We would never push out PAT sections (ok, that was one reallly stupid - mistake. I guess nobody ever uses this feature ...). - In the case where the PMT section of a program was bigger than one - packet, we would only end up pushing the last packet of that PMT. Which - obviously results in the resulting stream never containing the proper - (complete) PMT. - The problem was that the program is only started (in the base class) - after the PMT section is completely parsed. When dealing with single-program - pads, tsparse only wants to push the PMT corresponding to the requested - program (and not the other ones). tsparse did that check by looking - at the streams of the program... - ... but that program doesn't exist for the first packets of the initial - PMT. - The fix is to use the base class program information (if it parsed the - PAT it already has some information, like the PMT PID for a given program) - if the program hasn't started yet. - -2016-02-19 17:45:26 +0100 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/mpegtsparse.h: - tsparse: Use GstFlowCombiner - In addition to the fact that it's a sane thing to do for multi-source - pad elements, it also avoids the situation where just using a request - pad (and not the main static pad) would result in the processing - stopping. - -2016-02-19 12:38:31 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -=== release 1.7.2 === - -2016-02-19 11:50:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.7.2 - -2016-02-19 10:32:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - po: Update translations - -2016-02-18 14:32:23 +0000 Julien Isorce <j.isorce@samsung.com> - - * pkgconfig/gstreamer-bad-audio-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-base-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-video-uninstalled.pc.in: - * pkgconfig/gstreamer-codecparsers-uninstalled.pc.in: - * pkgconfig/gstreamer-gl-uninstalled.pc.in: - * pkgconfig/gstreamer-insertbin-uninstalled.pc.in: - * pkgconfig/gstreamer-mpegts-uninstalled.pc.in: - * pkgconfig/gstreamer-player-uninstalled.pc.in: - * pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in: - * pkgconfig/gstreamer-wayland-uninstalled.pc.in: - uninstalled.pc: add support for non libtool build systems - Currently the .la path is provided which requires to use libtool as - mentioned in the GStreamer manual section-helloworld-compilerun.html. - It is fine as long as the application is built using libtool. - So currently it is not possible to compile a GStreamer application - within gst-uninstalled with CMake or other build system different - than autotools. - This patch allows to do the following in gst-uninstalled env: - gcc test.c -o test $(pkg-config --cflags --libs gstreamer-1.0 \ - gstreamer-gl-1.0) - Previously it required to prepend libtool --mode=link - https://bugzilla.gnome.org/show_bug.cgi?id=720778 - -2016-02-18 16:21:38 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstgldebug.c: - gldebug: make sure debug is initialized when calling gst_gl_insert_debug_marker - Usually gl debug is initialized in gst_gl_context_create_thread. - But this function is not used when using the GstGLContextGPUProcess - from ChromiumGStreamerBackend. - Received signal 11 SEGV_MAPERR 000000000000 - gst_debug_category_get_threshold - gst_gl_insert_debug_marker - gst_gl_base_filter_gl_start - -2016-02-18 10:33:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/utils/gles_versions.h: - * gst-libs/gst/gl/utils/opengl_versions.h: - gl: Fix compiler warning about unused const variable with gcc 6 - CC libgstgl_x11_la-gstglcontext_glx.lo - In file included from gstglcontext_glx.c:39:0: - ../utils/opengl_versions.h:52:43: error: ‘gles2_versions’ defined but not used -Werror=unused-const-variable - static const struct { int major, minor; } gles2_versions = { - ^~~~~~~~~~~~~~ - -2016-02-18 10:29:21 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - gl: Move private headers from SOURCES to noinst_HEADERS - -2016-02-18 00:24:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/modplug/gstmodplug.cc: - modplug: Fix compiler warning about C++11 compatibility - gstmodplug.cc:94:17: error: invalid suffix on literal; C++11 requires a space between literal and string macro -Werror=literal-suffix - #define FORMATS "{ "GST_AUDIO_NE (S32)", "GST_AUDIO_NE (S16)", U8 }" - ^ - gstmodplug.cc:94:39: error: invalid suffix on literal; C++11 requires a space between literal and string macro -Werror=literal-suffix - #define FORMATS "{ "GST_AUDIO_NE (S32)", "GST_AUDIO_NE (S16)", U8 }" - ^ - -2016-02-16 15:10:34 +0100 David Fernandez <d.fernandezlop@gmail.com> - - * ext/curl/gstcurlbasesink.c: - curlbasesink: don't send empty buffers - Fixes problem in curlhttpsink when qtmux uses faststart. - https://bugzilla.gnome.org/show_bug.cgi?id=762013 - -2016-02-17 11:16:53 +0100 Thibault Saunier <tsaunier@gnome.org> - - * ext/ladspa/gstladspafilter.c: - ladspa: Fix some debugs - -2016-01-26 09:34:00 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * sys/uvch264/gstuvch264_src.c: - uvch264_src: Fix caps memory leak - v4l_caps and new_caps are being allocated new memory before freeing the - old allocation. - https://bugzilla.gnome.org/show_bug.cgi?id=761108 - -2015-12-24 15:36:54 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Refactor code to check for subclass seek handling - If subclass is not able to handle seek event, then there is no need to - stop streaming and send flush events. We should simply return FALSE - https://bugzilla.gnome.org/show_bug.cgi?id=758516 - -2015-12-24 15:10:16 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Add condition to check for non working negative rate - tsdemux is not able to handle negative playback rates. - But in mpegtsbase, the same check is not being done. - added a check to not handle negative rate while seeking unless - the same is handled upstream. - https://bugzilla.gnome.org/show_bug.cgi?id=758516 - -2016-02-17 13:00:46 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: insert the debug marker from the GL thread - https://bugzilla.gnome.org/show_bug.cgi?id=761538 - -2016-02-17 11:42:23 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: remove unsed reconfigure variable - -2016-01-13 13:17:56 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: don't push a reconfigure event from the GL thread - Doing so may cause deadlocks when other elements attempt destroy or created - GL resources. - https://bugzilla.gnome.org/show_bug.cgi?id=760559 - -2016-01-21 10:40:36 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: don't leak pad's vertex buffer on release_pad - https://bugzilla.gnome.org/show_bug.cgi?id=760873 - -2016-02-17 01:08:18 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - * ext/gl/gstglmosaic.c: - * ext/gl/gstglmosaic.h: - * ext/gl/gstglstereomix.c: - * ext/gl/gstglstereomix.h: - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - glmixer: Remove usage of GstGLMixerFrameData - Subclasses can just iterate over the list of pads themselves - https://bugzilla.gnome.org/show_bug.cgi?id=760873 - -2016-01-13 14:41:22 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: don't hold the object lock while calling into GL - Doing so can deadlock between the GL thread and the object lock e.g. - when performing reconfigure events in glimagesink on a resize event. - https://bugzilla.gnome.org/show_bug.cgi?id=760559 - -2016-02-16 22:34:43 +0000 Tim-Philipp Müller <tim@centricular.com> - - * common: - Update common: make check-exports not fail for libgstgl.def - Should fix distcheck on some build bots. - -2016-01-26 09:37:04 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * sys/acmenc/acmenc.c: - * sys/acmmp3dec/acmmp3dec.c: - acmenc/acmmp3dec: remove unnecessary break after return - https://bugzilla.gnome.org/show_bug.cgi?id=761109 - -2015-07-21 18:02:38 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * configure.ac: - configure: improve check for wayland-scanner binary - The plugin doesn't need the wayland-scanner package to be built - or run, it only needs the wayland-scanner program during compile time. - When cross-compiling, build systems might not have the wayland-scanner - package for the target system as it is a developer's tool, while it should - still be possible to use wayland-scanner from the host system. - This patch fixes it by not requiring the wayland-scanner package but - just the binary itself. - Note that the check is done outside of the PKG_CHECK_MODULES - as it doesn't work inside of it. - https://bugzilla.gnome.org/show_bug.cgi?id=752688 - -2016-01-21 11:53:33 +0100 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: restore bitrate averaging support - This was accidentally removed in commit ccff3be3. - https://bugzilla.gnome.org/show_bug.cgi?id=733959 - -2016-01-20 15:33:28 +0100 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: remove queue2 overrun notification - Due to performance impact concerns this is removed. An alternative - approach would be to rely on buffering messages monitoring. - https://bugzilla.gnome.org/show_bug.cgi?id=733959 - -2016-02-16 16:18:21 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - vkdevice: add the necessary but arbitrary queue priority - Silences an error in the validation layers. - -2016-02-16 16:12:07 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: add the necessary call to check if the physical device supports the surface - Silences an error in the validation layers. - -2016-02-16 15:53:56 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkapi.h: - * ext/vulkan/vkinstance.c: - vulkan: update to SDK 1.0.3.1 - -2016-02-16 15:36:41 +1100 Matthew Waters <matthew@centricular.com> - - * configure.ac: - vulkan/build: search for the correct library - SDK 1.0.1 used libvulkan-1.so, 1.0.2 uses libvulkan.so - -2016-02-16 11:51:28 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: iterate over the device queue's using the new iteration API - -2016-02-16 11:49:24 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkdevice.h: - vkdevice: add callback iteration over the device queue's - -2016-02-16 11:22:37 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkqueue.c: - * ext/vulkan/vkqueue.h: - vkqueue: add context helpers - -2016-02-11 01:31:14 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkdevice.h: - * ext/vulkan/vkdisplay.c: - * ext/vulkan/vkdisplay.h: - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkinstance.h: - * ext/vulkan/vksink.c: - * ext/vulkan/vkupload.c: - * ext/vulkan/vkutils.c: - * ext/vulkan/vkutils.h: - vkutils: move object-specific context queries to their respective files - vkutils now just contains some utility functions to further simplify retrieving - multiple objects. - -2016-02-11 00:50:53 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkdevice.h: - vkdevice: remove unneeded error parameter from get_queue() - -2016-02-10 18:06:46 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkupload.c: - * ext/vulkan/vkupload.h: - vkupload: implement an uploader abstraction - -2016-02-10 19:50:27 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdisplay.c: - vkdisplay: unref the instance - fixes memory leak - -2016-02-10 19:34:55 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkswapper.c: - vulkan: chain up in finalize - They were missing in some cases - -2016-02-10 18:58:32 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vksink.c: - vksink: only unref if the pointers are non-NULL - -2016-02-10 18:05:47 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkimagememory.c: - vkimagememory: free the managing struct on _free - fixes a memory leak - -2016-02-09 18:26:40 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - vkdevice: perform a waitIdle before destroying the device - -2016-02-09 17:46:53 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkbuffermemory.c: - * ext/vulkan/vkbuffermemory.h: - * ext/vulkan/vkimagememory.c: - * ext/vulkan/vkimagememory.h: - Revert "vulkan: remove views from the memory objects." - This reverts commit 1ea817298ee4d5ef9b00f888f8ebe16a888b1150. - -2016-02-09 17:31:26 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkbuffermemory.c: - * ext/vulkan/vkbuffermemory.h: - * ext/vulkan/vkbufferpool.c: - * ext/vulkan/vkimagememory.c: - * ext/vulkan/vkimagememory.h: - vulkanmemory: remove bind variants - -2016-02-09 16:21:00 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkbuffermemory.c: - * ext/vulkan/vkbuffermemory.h: - * ext/vulkan/vkimagememory.c: - * ext/vulkan/vkimagememory.h: - vulkan: remove views from the memory objects. - They are not used and it's not possible to create the view before binding the - VkDeviceMemory object to them. - -2016-02-09 11:34:57 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: alpha flags are now supported by LunarG's driver - -2016-02-09 00:07:38 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/Makefile.am: - * ext/vulkan/vk.h: - * ext/vulkan/vk_fwd.h: - * ext/vulkan/vkbufferpool.c: - * ext/vulkan/vkbufferpool.h: - * ext/vulkan/vkupload.c: - vulkan: add a vulkanbuffer bufferpool - -2016-02-08 22:49:15 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/Makefile.am: - * ext/vulkan/gstvulkan.c: - * ext/vulkan/vksink.c: - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkswapper.h: - * ext/vulkan/vkupload.c: - * ext/vulkan/vkupload.h: - vulkan: add upload element - -2016-02-08 18:28:29 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkutils.c: - vkutils: fix assert inversion - -2016-02-08 18:27:16 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkbuffermemory.h: - * ext/vulkan/vkimagememory.h: - vulkan: add caps feature names for the buffer and image memories - -2016-02-08 14:44:20 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vksink.c: - * ext/vulkan/vkutils.c: - * ext/vulkan/vkutils.h: - vulkan: add device to handle_context_query - -2016-02-08 14:32:10 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vksink.c: - * ext/vulkan/vkutils.c: - vulkan: move instance_open into the utility ensure_element_data - So callers don't have to perform it themselves. - -2016-02-08 14:25:49 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkinstance.h: - * ext/vulkan/vksink.c: - vkinstance: add signal for overriding device creation - -2016-02-08 12:22:11 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkbuffermemory.c: - * ext/vulkan/vkbuffermemory.h: - * ext/vulkan/vkimagememory.c: - * ext/vulkan/vkimagememory.h: - * ext/vulkan/vkmacros.h: - * ext/vulkan/vkmemory.c: - * ext/vulkan/vkmemory.h: - * ext/vulkan/vkswapper.c: - vulkan: separate allocation and binding of memory - -2016-02-08 12:14:44 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkbuffermemory.c: - vkbuffermemory: follow the rest of the struct macros - -2016-02-05 19:31:49 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: use buffer memory to upload video frames to the GPU - -2016-02-05 19:18:40 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/Makefile.am: - * ext/vulkan/vk.h: - * ext/vulkan/vk_fwd.h: - * ext/vulkan/vkbuffermemory.c: - * ext/vulkan/vkbuffermemory.h: - * ext/vulkan/vkinstance.c: - vulkan: add a buffer memory allocator - Wraps the VkBuffer in a GstMemory subclass. - -2016-02-05 19:11:51 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkmemory.h: - vkmemory: align struct members in the header - -2016-02-05 19:10:43 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkmacros.h: - vkmacros: use specific _INIT macros to initialize structures - -2016-02-05 19:09:41 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkimagememory.c: - * ext/vulkan/vkimagememory.h: - vkimagememory: add get_{width,height) functions - -2016-01-27 15:20:49 +1100 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * ext/vulkan/vkapi.h: - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkinstance.h: - * ext/vulkan/vkswapper.c: - * ext/vulkan/xcb/vkwindow_xcb.c: - vulkan: update to release 1.0.1.1 - -2016-01-22 14:34:06 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/xcb/vkwindow_xcb.c: - vulkan/xcb: flush after mapping the window - Otherwise the map may not reach the server and not appear. - -2016-01-04 16:51:26 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: fix semaphore usage - -2015-12-31 16:34:24 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkinstance.c: - vulkan: add some debugging about the supported extensions - -2015-12-31 15:58:37 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: get the function pointers from the correct object - GetPhysicalDevice* functions are instance functions rather than device - functions. - -2015-12-31 15:38:37 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkinstance.h: - vkinstance: add the necessary winsys extension - -2015-12-31 15:34:45 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vk_fwd.h: - * ext/vulkan/vkdisplay.h: - vkdisplay: forward declare GstVulkanDisplayType - -2015-12-31 15:32:15 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkapi.h: - vkapi: remove unneeded headers - vkapi is for accessing the vulkan headers with the correct defines applied so - doesn't need any interal headers. - -2015-12-30 15:15:40 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkimagememory.c: - vkimagememory: fix the memory barrier access masks - silences the following warnings from the validation layer - AccessMask xxx must have required access bit xxx and may have optional bits 0 - when layout is VK_IMAGE_LAYOUT_TRANSFER_{SRC,DST}_OPTIMAL - -2015-12-30 15:14:23 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: only wait on the semaphore once - It's invalid usage and we may deadlock - -2015-12-31 01:27:54 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkimagememory.c: - vkimagememory: initialize flags and don't crash on errors - -2015-12-30 14:06:01 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkerror.c: - * ext/vulkan/vkerror.h: - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkswapper.c: - vulkan: update error db for 0.10.2 - -2015-12-29 16:05:17 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vk.h: - * ext/vulkan/vkapi.h: - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkdevice.h: - * ext/vulkan/vkdisplay.c: - * ext/vulkan/vkdisplay.h: - * ext/vulkan/vkimagememory.c: - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkmacros.h: - * ext/vulkan/vkmemory.c: - * ext/vulkan/vkmemory.h: - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkswapper.h: - * ext/vulkan/vkutils.c: - * ext/vulkan/vkwindow.c: - * ext/vulkan/vkwindow.h: - * ext/vulkan/xcb/vkdisplay_xcb.c: - * ext/vulkan/xcb/vkdisplay_xcb.h: - * ext/vulkan/xcb/vkwindow_xcb.c: - * ext/vulkan/xcb/vkwindow_xcb.h: - vulkan: update to SDK 0.10.2 - -2015-12-07 17:33:43 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/Makefile.am: - * ext/vulkan/vk.h: - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkdisplay.c: - * ext/vulkan/vkdisplay.h: - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkinstance.h: - * ext/vulkan/vksink.c: - * ext/vulkan/vkutils.c: - * ext/vulkan/vkutils.h: - * ext/vulkan/vkutils_private.h: - vulkan: implement GstContext helpers - Based off libgstgl's implementation - -2015-12-07 17:21:12 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vk_fwd.h: - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkdevice.h: - * ext/vulkan/vksink.c: - vkdevice: remove gst_vulkan_device_close() - When sharing the device between multiple elements/application, we need - to use th erefcount to know when to close the device. - -2015-12-07 17:00:37 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vk_fwd.h: - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkinstance.h: - * ext/vulkan/vksink.c: - vkinstance: remove gst_vulkan_instance_close - Sharing the instance across multiple elements/application will require - using the refcount instead to know when to close and destroy the instance. - -2015-12-07 16:46:28 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: remove outdated comment - -2015-12-07 16:39:53 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkswapper.c: - vkswapper: always match lock/unlock of the render lock - If a draw event comes from the winsys before we've rendered a buffer we were - deadlocking. - -2015-12-02 17:54:30 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkimagememory.c: - * ext/vulkan/vkmemory.c: - vkmemory: debug output the memory properties requested - -2015-12-02 17:14:49 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkimagememory.c: - vkimagememory: don't leak GstMapInfo in failure cases on _map() - -2015-12-02 17:10:39 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkswapper.c: - vulkan: de-C99 struct declarations - -2015-12-01 18:37:34 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vk_fwd.h: - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkswapper.h: - * ext/vulkan/vkwindow.c: - * ext/vulkan/vkwindow.h: - * ext/vulkan/xcb/xcb_event_source.c: - vkwindow/swapper: implement redraw handling - only xcb has been implemented - -2015-12-01 16:28:28 +1100 Matthew Waters <matthew@centricular.com> - - * ext/vulkan/vkdisplay.c: - * ext/vulkan/vkdisplay.h: - * ext/vulkan/vksink.h: - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkswapper.h: - * ext/vulkan/vkwindow.c: - * ext/vulkan/vkwindow.h: - * ext/vulkan/xcb/vkdisplay_xcb.c: - * ext/vulkan/xcb/vkwindow_xcb.c: - * ext/vulkan/xcb/xcb_event_source.c: - vulkan: implement quitting and resizing the window - As before, only xcb has been implemented. - -2015-10-24 17:29:05 +1100 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * ext/Makefile.am: - * ext/vulkan/.gitignore: - * ext/vulkan/Makefile.am: - * ext/vulkan/gstvulkan.c: - * ext/vulkan/vk.h: - * ext/vulkan/vk_fwd.h: - * ext/vulkan/vkdevice.c: - * ext/vulkan/vkdevice.h: - * ext/vulkan/vkdisplay.c: - * ext/vulkan/vkdisplay.h: - * ext/vulkan/vkerror.c: - * ext/vulkan/vkerror.h: - * ext/vulkan/vkimagememory.c: - * ext/vulkan/vkimagememory.h: - * ext/vulkan/vkinstance.c: - * ext/vulkan/vkinstance.h: - * ext/vulkan/vkmemory.c: - * ext/vulkan/vkmemory.h: - * ext/vulkan/vkqueue.c: - * ext/vulkan/vkqueue.h: - * ext/vulkan/vksink.c: - * ext/vulkan/vksink.h: - * ext/vulkan/vkswapper.c: - * ext/vulkan/vkswapper.h: - * ext/vulkan/vkutils.c: - * ext/vulkan/vkutils.h: - * ext/vulkan/vkwindow.c: - * ext/vulkan/vkwindow.h: - * ext/vulkan/xcb/Makefile.am: - * ext/vulkan/xcb/vkdisplay_xcb.c: - * ext/vulkan/xcb/vkdisplay_xcb.h: - * ext/vulkan/xcb/vkwindow_xcb.c: - * ext/vulkan/xcb/vkwindow_xcb.h: - * ext/vulkan/xcb/xcb_event_source.c: - * ext/vulkan/xcb/xcb_event_source.h: - new vulkan based video sink - Currently xcb is the only winsys that is implemented and there's no redraws et - al - -2016-02-16 12:38:21 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/files/Makefile.am: - * tests/files/cbr_stream.mp3: - * tests/files/stream.mp2: - * tests/files/vbr_stream.mp3: - tests: remove test files no longer needed - -2016-02-16 10:44:33 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-mpg123.xml: - * ext/Makefile.am: - * ext/mpg123/Makefile.am: - * ext/mpg123/gstmpg123audiodec.c: - * ext/mpg123/gstmpg123audiodec.h: - * gst-plugins-bad.spec.in: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/mpg123audiodec.c: - mpg123: move plugin from -bad to -ugly - https://bugzilla.gnome.org/show_bug.cgi?id=719849 - -2016-02-16 19:59:13 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gstgtkbasesink.c: - * ext/gtk/gstgtkbasesink.h: - gtk(gl)sink: remove the signal handlers on finalize - It's possible that the sink element will be freed before the widget is - destroyed. When the widget was eventually destroyed, it was attempting to - access member variables of the freed sink struct which resulted in undefined - behaviour. - Fix by disconnecting our signal on finalize. - https://bugzilla.gnome.org/show_bug.cgi?id=762098 - -2016-02-16 08:48:23 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstgldebug.c: - * gst-libs/gst/gl/gstglviewconvert.c: - gl: Remove leftover g_prints - One was commented out, but we also don't use // comments :) - -2016-02-16 14:41:37 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldebug.c: - gldebug: use the correct spelling for behavior - The headers use the american spelling of behavior not the UK/AUS version with - the extra U. - -2016-02-16 13:58:42 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgldebug.c: - glcontext: don't enable GL debug for messages that won't be logged - This is an optimization to avoid pointless string processing. - -2016-02-16 13:01:20 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * ext/gl/gstglvideoflip.c: - glvideoflip: don't ignore method changes when caps aren't set (yet) - -2016-02-16 00:33:50 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * configure.ac: - * gst/rtp/Makefile.am: - * gst/rtp/gstrtp.c: - * gst/rtp/gstrtph265depay.c: - * gst/rtp/gstrtph265depay.h: - * gst/rtp/gstrtph265pay.c: - * gst/rtp/gstrtph265pay.h: - rtp: move RTP H.265 payloader/depayloader to -good - https://bugzilla.gnome.org/show_bug.cgi?id=761606 - -2015-10-07 23:49:58 +0200 Stian Selnes <stian@pexip.com> - - * configure.ac: - * gst/netsim/Makefile.am: - * gst/netsim/gstnetsim.c: - * gst/netsim/gstnetsim.h: - * tests/check/Makefile.am: - * tests/check/elements/netsim.c: - netsim: Add netsim element - Resurrected from the Farstream repository and given an - overhaul to fix races, deadlocks etc. - https://bugzilla.gnome.org/show_bug.cgi?id=756252 - -2015-11-20 19:38:03 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstdashdemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - dashdemux: gst_dash_demux_get_live_seek_range returns positive values - https://bugzilla.gnome.org/show_bug.cgi?id=752374 - -2016-02-10 10:31:19 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - gl: syncmeta: define GL_TIMEOUT_IGNORED in more portable way - -2016-02-10 16:37:22 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/gstglshader.c: - gstglshader: cache uniform locations - Avoid redundant calls to glGetUniformLocation. The results can be cached once - the shader has been linked. - -2016-02-10 15:40:02 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/videotexturecache.m: - applemedia: videotesturecache: let CVOpenGLESTextureCache flush every 1s - Leave kCVOpenGLESTextureCacheMaximumTextureAgeKey to the default (1s). We used - to set it to 0 and flush manually, but apparently (looking at the GLES profiler) - 0 means "disable the cache entirely". - -2016-02-10 13:08:43 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - gstglcontext: micro optimization to gst_gl_context_thread_add - Invoke the callback right away when called on the context thread. Removes - overhead when nesting libgstgl calls (for example when working with the sync - meta). - -2016-01-06 21:39:00 +0000 Julien MOUTTE <julien@moutte.net> - - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsink.h: - rtpmsink: Implement setcaps that uses streamheader - This allow adding rtmpsink after the flv streaming have started. Otherwise, - FLV streamheader is never sent to the server, which cannot figure-out - what is this stream about. It should also help in certain renegotiation - figures. The sink will no longer work without an streamheader in caps, - though there is no known implementation of flvdemux that does not - support this. - https://bugzilla.gnome.org/show_bug.cgi?id=760242 - -2016-02-09 21:35:19 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: remove unnecessary check - stream->current_fragment has the value of g_list_previous (iter) which has - just been checked. No need to check it again. - Just to be safe, use a g_assert() to check fragment before dereferencing. - CID #1352041 - -2016-02-09 17:24:50 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: plug mpd client leak - On parsing error, free the mpd client object - https://bugzilla.gnome.org/show_bug.cgi?id=760120 - -2016-01-04 12:12:45 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstdashdemux.c: - dashdemux: fix memory leak in gst_dash_demux_update_manifest_data - new_client local variable was not freed in case of errors. - Also, the buffer is not unmapped. - https://bugzilla.gnome.org/show_bug.cgi?id=760120 - -2015-11-10 22:01:38 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * tests/check/elements/dash_mpd.c: - mpdparser: renamed gst_mpd_client_get_next_segment_availability_end_time to gst_mpd_client_get_next_segment_availability_start_time - The function actually returns the segment availability start time (as defined by the standard). - That is at the end of the segment, but it is called availability start time. - Availability end time is something else (the time when the segment is no longer - available on the server). The function name was misleading. - https://bugzilla.gnome.org/show_bug.cgi?id=757655 - -2015-11-10 22:00:58 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - mpdparser: corrected getting segment availability - https://bugzilla.gnome.org/show_bug.cgi?id=757655 - -2015-11-19 15:30:34 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - mpdparser: tests: added unit test for getting segment availability when segment timeline is used - https://bugzilla.gnome.org/show_bug.cgi?id=757655 - -2016-01-07 12:50:06 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/adaptive_demux_engine.c: - adaptive_demux: tests: improved validation of pads - When removing a pad, the on_demuxPadRemoved function must find a stream - for that pad. - https://bugzilla.gnome.org/show_bug.cgi?id=760328 - -2016-01-07 12:48:12 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/adaptive_demux_engine.c: - adaptive_demux: tests: fix pad used for AppSink event - on_demuxNewPad registered the on_appsink_event callback on a wrong pad. - https://bugzilla.gnome.org/show_bug.cgi?id=760328 - -2016-01-08 16:25:12 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/adaptive_demux_engine.c: - * tests/check/elements/adaptive_demux_engine.h: - adaptivedemux: tests: remove unused demux_sent_eos callback - The demux_sent_eos callback is unused in tests. It was also registered on - a wrong pad, so it actually triggered when demux received eos from a - fragment download. - https://bugzilla.gnome.org/show_bug.cgi?id=760328 - -2016-01-08 18:17:21 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_demux.c: - adaptivedemux: tests: remove unneeded youtube xmlns from manifests - https://bugzilla.gnome.org/show_bug.cgi?id=760328 - -2016-02-09 14:07:54 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: implement GstElement::set_context - -2016-02-09 14:04:09 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: update copyright - -2016-02-09 13:42:48 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - applemedia: avfvideosrc: implement GstElement::set_context - Needed to properly handle gst.gl.app_context(s). - -2016-02-09 13:39:18 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - applemedia: avfvideosrc: add myself to the copyright holders - -2016-02-09 13:56:32 +1100 Matthew Waters <matthew@centricular.com> - - * win32/common/libgstgl.def: - gl: update win32 .def file - -2016-02-09 13:08:21 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - glsyncmeta: add compatibility definition for GL_TIMEOUT_IGNORED - -2016-02-09 12:14:04 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - * gst-libs/gst/gl/gstglsyncmeta.c: - * gst-libs/gst/gl/gstglsyncmeta.h: - * sys/androidmedia/gstamcvideodec.c: - glsyncmeta: separate out gpu/cpu waits. - CPU waits are more expensive and are only required if the CPU is ever going to - access the data. GPU waits perform inter-context synchronisation and are cheaper - as they don't require CPU intervention. - -2016-02-08 23:17:34 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: remove overwritten value - ret is overwitten before used with the return of the subclass seek. - CID #1352044 - -2016-02-08 15:00:35 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/resindvd/resindvdbin.c: - resindvd: remove commented out include - Commit 211828979b8c10abf3c74d964bc698dbda4d497d removed rsnaudiomunge, - no need for this commented out include for a file that doesn't exist - anymore. - -2016-02-08 14:26:46 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - Revert "resindvd: get rid of _stdint.h include" - This reverts commit 0eff6e1991cb24cb65f07c481742782acaa8ec62. - Breaks the build when linking with dvdnav.h - -2016-02-08 13:43:22 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/x265/gstx265enc.h: - x265enc: get rid of _stdint.h include - It was never needed since it doesn't use any standard integer fixed width - types. Only the Glib types. - -2016-02-08 13:32:46 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - resindvd: get rid of _stdint.h include - -2016-02-08 12:44:53 +0100 Piotr Drąg <piotrdrag@gmail.com> - - * po/POTFILES.skip: - po: update POTFILES - https://bugzilla.gnome.org/show_bug.cgi?id=761704 - -2016-02-08 12:23:12 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/effects/gstgleffectidentity.c: - gleffects: identity: add the shader to the hash table - So that we don't recreate it every frame and leak memory. - https://bugzilla.gnome.org/show_bug.cgi?id=761578 - -2016-02-05 20:02:22 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/Makefile.am: - tests: extend the AM_TESTS_ENVIRONMENT from check.mak - To get the CK_DEFAULT_TIMEOUT defined for all tests - https://bugzilla.gnome.org/show_bug.cgi?id=761472 - -2016-02-05 18:06:32 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * README: - * common: - Automatic update of common submodule - From e97c9bb to b64f03f - -2016-02-05 15:34:51 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/rtp/gstrtph265depay.c: - * gst/rtp/gstrtph265depay.h: - gstrtph265depay: keep consistency with rtph264depay - Use gst_rtp_drop_meta() and the same function prototype for - gst_rtp_copy_meta() to keep consistency with the RTP elements in - gst-plugins-good - -2016-02-05 21:33:38 +0530 Arun Raghavan <arun@centricular.com> - - * sys/tinyalsa/tinyalsasink.c: - tinyalsasink: Use glib CLAMP() instead of our own macro - -2016-02-05 13:56:34 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/rtp/gstrtph265depay.c: - rtph265depay: fix termination of access unit - Only consider the access unit complete when the next-occurring VCL NAL unit - has the first bit after its NAL unit header equal to 1. - -2016-02-02 13:50:25 +0000 David Waring <david.waring@rd.bbc.co.uk> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Update position in stream->segment for new stream segment message. - https://bugzilla.gnome.org/show_bug.cgi?id=761458 - -2016-02-05 15:43:22 +0530 Arun Raghavan <arun@centricular.com> - - * sys/tinyalsa/tinyalsasink.c: - tinyalsasink: Limit period size and count to what the h/w permits - -2016-02-05 10:43:49 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldebug.c: - * gst-libs/gst/gl/gstglfeature.h: - * gst-libs/gst/gl/gstglsl_private.h: - * gst-libs/gst/gl/wayland/wayland_event_source.h: - * win32/common/libgstgl.def: - gl: add .def file for msvc builds - Also internalize some API from being exported. - -2016-02-02 17:02:41 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/mssdemux.c: - tests: mssdemux: add unit tests - Adds unit tests similar to the ones that we have for DASH and HLS. - Tests: - * manifest parsing finishes successfully - * some queries (duration, seekable, latency) - * seeking with various values and flags - -2016-02-02 16:54:10 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: implement snap seeking - Implement snap seek flags handling in stream_seek to allow the - parent class to handle it for us - https://bugzilla.gnome.org/show_bug.cgi?id=759158 - -2016-02-02 16:51:22 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: use correct seek position on reverse seeks - Otherwise it was always using the 'start' value, leading to wrong - behavior - -2016-02-02 11:30:31 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: only update download position if the seek requests to - Some seeks are only updating the stop position, there is no need - to change the current downloading position. - -2016-02-02 09:52:17 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: do not assert on fragment reloads for non-live - It can be used as a resource to verify if the server has updated - something in the Manifest when downloads are failing - -2016-01-27 10:48:53 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/dash_demux.c: - tests: dashdemux: add tests for snap flags seeking - Similar to HLS but DASH has the extra issue that it can have - multiple streams so snapping can be tricky as streams usually - won't be aligned. - For now, those tests handle the case of only having a single - stream. - https://bugzilla.gnome.org/show_bug.cgi?id=759158 - -2016-02-01 10:49:23 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - dashdemux: implement snap seek handling - Handle snap seeking at the stream_seek method and let superclass - do the rest to support snap seeking - https://bugzilla.gnome.org/show_bug.cgi?id=759158 - -2016-01-27 13:31:10 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: handle snap seeks - Adaptive demuxers need to start downloading from specific positions - (fragments) for every stream, this means that all streams can snap-seek - to a different position when requested. Snap seeking in this case will - be done in 2 steps: - 1) do the snap seeking on the pad that received the seek event and - get the final position - 2) use this position to do a regular seek on the other streams to - make sure they all start from the same position - More arguments were added to the stream_seek function, allowing better control - of how seeking is done. Knowing the flags and the playback direction allows - subclasses to handle snap-seeking. - And also adds a new return parameter to inform of the final - selected seeking position that is used to align the other streams. - https://bugzilla.gnome.org/show_bug.cgi?id=759158 - -2016-01-26 23:43:24 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: add utility function to get stream from pad - Simplifies the code a bit and avoid repeating this - common operation - -2016-02-04 12:50:43 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: remove unused mview_mode value - Since commit b77f8e172a3f0be6be5cb4a72e654253404e694f the new value - assigned to mview_mode hasn't been used. That commit changed the following - "if" check to an "else if", which means the original value of mview_mode - is used. - -2016-02-04 12:17:31 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst-libs/gst/gl/gstglquery.c: - glquery: remove unnecessary pointer check - All uses of query->context in gstglquery.c assume it exists. We can assume - this as well before unrefing it. Furthermore, gst_object_unref() will just - silently return if it ever were to not exist. - -2016-02-04 18:15:56 +1100 Matthew Waters <matthew@centricular.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: avoid sending unnecessary downstream caps queries/events - h265 versions of the following commits: - f352691a04896d0de3381fe8ee85ada948bd6337 - try the current caps before querying downstream - 72bc7d7f736a10117fedb8e1d4013a4946cfefbc - increase caps equality check for no codec_data - https://bugzilla.gnome.org/show_bug.cgi?id=761014 - -2016-02-04 16:36:28 +1100 Matthew Waters <matthew@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: increase caps equality check for no codec_data - When converting from avc to byte-stream, there will not be any codec_data - in the src caps. Remove it before the equality check to avoid sending caps - events downstream on every SPS/PPS change. - https://bugzilla.gnome.org/show_bug.cgi?id=761014 - -2016-02-04 15:34:04 +1100 Matthew Waters <matthew@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: try the current caps before querying downstream - If we have a stream that contains an unchanging SPS/PPS for every video frame, - we don't need to to constantly query downstream for it's supported caps if the - current caps are compatible with the negotiated caps. - https://bugzilla.gnome.org/show_bug.cgi?id=761014 - -2016-02-04 17:31:03 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasefilter.c: - glbasefilter: enable qos by default - Improves the responsiveness of the pipeline when resources are close/above the - limitations of the hardware. - Any subclass that wishes not to enable qos can do so themselves. - https://bugzilla.gnome.org/show_bug.cgi?id=761519 - -2016-02-04 15:11:15 +1100 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: pass the correct time value to wait_for_sync - When we are not waiting, we need to pass -1 to signal that we just want to check - that the frame was/n't rendered. Avoids waiting for frames that will never be - rendered. - https://bugzilla.gnome.org/show_bug.cgi?id=761014 - -2016-02-04 15:07:44 +1100 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: advance the ready counter ourselves when render=FALSE - When not rendering the video frame, e.g. when freeing an unreleased sync frame, - we will not receive a frame listener callback. - Reduces the amount of 'on_frame_available miss detected' messages when dropping - frames. - https://bugzilla.gnome.org/show_bug.cgi?id=761014 - -2016-02-04 14:25:12 +1100 Jan Schmidt <jan@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Fix discont tracking - Don't reset the marker that's tracking disconts until - either the discont disappears or we resync. - -2016-02-03 21:22:28 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/Makefile.am: - * sys/cdrom/Makefile.am: - * sys/cdrom/gstcdplayer.c: - * sys/cdrom/gstcdplayer.h: - * sys/cdrom/gstcdplayer_ioctl.c: - * sys/cdrom/gstcdplayer_ioctl.h: - * sys/cdrom/gstcdplayer_ioctl_bsd.h: - * sys/cdrom/gstcdplayer_ioctl_irix.h: - * sys/cdrom/gstcdplayer_ioctl_solaris.h: - Remove ancient and dead cdrom control plugin - This was never even ported to 0.10, and I don't think - it's particularly useful, since it's just a control - interface really. Let's remove it. - -2016-02-03 21:16:18 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - * gst/coloreffects/gstcoloreffects.h: - * gst/debugutils/fpsdisplaysink.c: - docs: remove some leftover 'Since 0.10.x' markers - -2016-02-03 21:13:58 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/debugutils/.gitignore: - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutils-marshal.list: - * gst/debugutils/fpsdisplaysink.c: - debugutils: use generic marshaller - -2016-02-03 16:28:42 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opus: fix FEC - FEC may only be used when PLC is enabled on the audio decoder, - as it relies on empty buffers to generate audio from the next - buffer. Hooking to the gap events doesn't work as the audio - decoder does not like more buffers output than it sends. - The length of data to generate using FEC from the next packet - is determined by rounding the gap duration to nearest. This - ensures that duration imprecision does not cause quantization - to 2.5 milliseconds less than available. Doing so causes the - Opus API to fail decoding. Such duration imprecision is common - in live cases. - The buffer to consider when determining the length of audio - to be decoded is the previous buffer when using FEC, and the - new buffer otherwise. In the FEC case, this means we determine - the amount of audio from the previous buffer, whether it was - missing or not (and get the data either from this buffer, or - the current one if the previous one was missing). - -2016-02-03 10:59:23 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltransformation.c: - gltransformation: reconfigure the src when changing to/from passthrough - Otherwise it's very possible that any GL resources have not been created yet. - -2016-02-03 10:52:08 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideoflip.c: - * ext/gl/gstglvideoflip.h: - glvideoflip: correctly update the output caps on method changes - When changing methods we may need different output caps. - -2016-02-02 11:20:17 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/tinyalsa/tinyalsasink.c: - tinyalsasink: fix tinalsa typo - -2016-02-02 11:06:52 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/tinyalsa/tinyalsasink.c: - tinyalsasink: fix sample launch line - -2016-02-02 14:46:30 +0000 David Waring <david.waring@rd.bbc.co.uk> - - * gst-libs/gst/player/Makefile.am: - libs: player: use configured GST_PKG_CONFIG_PATH when invoking the introspection scanner - https://bugzilla.gnome.org/show_bug.cgi?id=761460 - -2016-02-02 15:20:48 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: fix wrong buffer being checked for missing data - This caused a decoding error if the resulting (wrong) buffer size - was passed to the Opus decoding API. - https://bugzilla.gnome.org/show_bug.cgi?id=758158 - -2016-02-02 16:26:09 +0530 Arun Raghavan <arun@centricular.com> - - * sys/tinyalsa/tinyalsasink.c: - tinyalsasink: Use int type if we support a single rate/channel count - Avoids using an int range if the field we're setting is not actually a - range. - -2016-02-02 18:36:34 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - Revert "gl/eagl: try getting a gles3 context" - This reverts commit 96b9666d596be115fd4b446ef846508b7fd05c24. - This reverts commit d11385d167d8843604ea23a05e2dea40b8bbac35. - This breaks the texture sharing with the applemedia elements as - CVOpenGLESTextureCache seems to have an arbitrary restriction on GLES2 only. - -2016-02-02 16:21:14 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: don't skip subset structures - We may need them to transform into a different set of formats. - Fixes YUV->YUV with two glcolorconverts, e.g: - format=I420 ! glcolorconvert ! glcolorconvert ! format=NV12 - -2016-02-02 16:19:54 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasefilter.c: - glbasefilter: always call gl_start when not called already - Fixes elements transitioning out of passthrough mode using GL resources that - hadn'e been allocated yet. - -2016-02-02 15:14:25 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: fix RGB,rectangle->planar YUV conversion - Converting to GRAY is no fun. Another case of normalized vs unnormalized - texture coordinates. - -2016-02-02 13:51:18 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: fix YUY2/UYVY,rectangle->RGB conversion - 1.0 / width does not offset by one pixel in rectangular textures (which use - unnormalized coordinates). - Provide the actual pixel offset as a uniform to the shader. - -2016-01-27 16:42:09 +0530 Arun Raghavan <arun@centricular.com> - - * configure.ac: - * sys/Makefile.am: - * sys/tinyalsa/Makefile.am: - * sys/tinyalsa/tinyalsa.c: - * sys/tinyalsa/tinyalsasink.c: - * sys/tinyalsa/tinyalsasink.h: - tinyalsa: Add a new sink plugin using tinyalsa - This uses the tinyalsa library to playback to an ALSA device. Future - work can include using the mmap interface. - https://bugzilla.gnome.org/show_bug.cgi?id=761230 - -2016-02-02 12:50:26 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: perform better negotiation - 1. Correctly describe what we can caps we can transform to/from. - i.e. no YUV->YUV or GRAY->YUV or YUV->GRAY (except for passthrough). - 2. Prefer similar formats and ignore incompatible formats on fixation. - -2016-01-26 23:15:10 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/dash_demux.c: - tests: dashdemux: add test for updating stop position - Test that a seek that only updates the stop position works - as expected - -2016-02-01 09:48:33 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: only update current reading position when needed - If the seek doesn't set the start/stop position, no need to - reposition the download index. - -2016-01-29 20:34:42 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: respect seeking parameter - Instead of using the segment values, use the parameter - requested in the seeking argument - -2016-02-01 14:25:42 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/dash_mpd.c: - tests: dash: fix dash tests after index fix - 8e788f284508612982e8e38336eed676c2eec35a broke one of the - dash mpd tests. This updates and fixes it. - -2016-02-01 12:23:32 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglwindow.c: - gstglwindow: initialize navigation_loop to NULL - Useful when gst_gl_window.c::gst_gl_window_new is not used. - This is the case when using a custom GstGLWindow. - (ex: GstGLWindowGPUProcess from Chromium) - -2016-02-01 09:26:37 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - gl: eagl: fix build - gstglcontext_eagl.m:238:45: error: too few arguments to function call, - expected at least 4, have 3 - -2016-02-01 15:13:03 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * ext/gl/gstgldownloadelement.c: - gldownload: allow video/x-raw as input - ...and just passthrough. This is useful for pipelines where downstream must be - non-GL but upstream can optionally be GL. - -2016-02-01 12:57:32 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - gl/eagl: try getting a gles3 context - Fallback to a gles2 context if that fails - -2016-01-21 16:10:48 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: fix checker vbo leak - https://bugzilla.gnome.org/show_bug.cgi?id=760925 - -2016-01-24 15:47:12 +0100 Holger Kaelberer <holger.k@elberer.de> - - * tests/examples/qt/qml/main.qml: - tests: fix warning in qml example - https://bugzilla.gnome.org/show_bug.cgi?id=756082 - -2016-01-24 15:42:32 +0100 Holger Kaelberer <holger.k@elberer.de> - - * configure.ac: - qt: Fix build for android - https://bugzilla.gnome.org/show_bug.cgi?id=756082 - -2016-02-01 01:01:10 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/snapshot/Makefile.am: - * ext/snapshot/gstsnapshot.c: - * ext/snapshot/gstsnapshot.h: - Remove dead snapshot plugin - Was never ported and doesn't look like - we want it or need it in this form, can - do the same with the libgstvideo sample - conversion utility API now, but better - and in a more flexible way. - -2016-02-01 00:49:48 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/rsvg/gstrsvgdec.h: - * ext/rsvg/gstrsvgoverlay.h: - rsvg: bump requirement to 2.36.2 - Which allows us to simplify the configure check and - some special-casing in the code, and is plenty old - in any case. - -2016-02-01 00:29:37 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/Makefile.am: - * ext/libfame/Makefile.am: - * ext/libfame/README: - * ext/libfame/gstlibfame.c: - * ext/libfame/gstlibfame.h: - * m4/Makefile.am: - * m4/libfame.m4: - Remove dead libfame plugin - Was never even ported to 0.10, and the lib - has been unmaintained for ever and doesn't - even seem to be packaged any more. - -2016-01-31 19:09:57 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/Makefile.am: - * ext/audiofile/Makefile.am: - * ext/audiofile/README: - * ext/audiofile/gstaf.c: - * ext/audiofile/gstafparse.c: - * ext/audiofile/gstafparse.h: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsink.h: - * ext/audiofile/gstafsrc.c: - * ext/audiofile/gstafsrc.h: - * po/POTFILES.skip: - Remove dead audiofile plugin - This was never even ported to 0.10. - -2016-01-31 19:04:20 +0000 Tim-Philipp Müller <tim@centricular.com> - - * .gitignore: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * ext/Makefile.am: - * ext/gsettings/Makefile.am: - * ext/gsettings/gstgsettings.h: - * ext/gsettings/gstgsettingsaudiosink.c: - * ext/gsettings/gstgsettingsaudiosink.h: - * ext/gsettings/gstgsettingsaudiosrc.c: - * ext/gsettings/gstgsettingsaudiosrc.h: - * ext/gsettings/gstgsettingsvideosink.c: - * ext/gsettings/gstgsettingsvideosink.h: - * ext/gsettings/gstgsettingsvideosrc.c: - * ext/gsettings/gstgsettingsvideosrc.h: - * ext/gsettings/gstswitchsink.c: - * ext/gsettings/gstswitchsink.h: - * ext/gsettings/gstswitchsrc.c: - * ext/gsettings/gstswitchsrc.h: - * ext/gsettings/org.freedesktop.gstreamer.default-elements.gschema.xml.in: - * ext/gsettings/plugin.c: - * m4/gsettings.m4: - * po/POTFILES.in: - * tests/check/Makefile.am: - Remove gsettings plugin which was never ported - Don't think we need this any longer or want to - support it, and clearly no one has been missing - it all these years either, so let's just get rid - of it. - -2016-01-31 16:02:33 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/smoothstreaming/Makefile.am: - * ext/smoothstreaming/gstmssdemux.h: - smoothstreaming: remove unused dependency on uridownloader - -2016-01-31 14:42:21 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/faad/Makefile.am: - * ext/faad/gstfaad.c: - * ext/faad/gstfaad.h: - faad: simplify configure check and require faad >= 2.7 - Just check whether LATM is defined which is only available - in 2.7 and later. Allows us to simplify the configure check - a little and we can get rid of some hackish workarounds for - problems with earlier version headers. - -2016-01-30 17:31:41 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: drop unnecessary use of _stdint.h - -2016-01-29 23:39:26 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxftypes.c: - mxftypes: Generate UUIDs according to RFC4122 version 4 (aka random) - Instead of fully random UUIDs, these should follow a scheme. - -2016-01-29 21:09:44 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmetadata.c: - mxfmetadata: Properly write video line map data as an array of 32 bit integers - -2016-01-29 20:58:27 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmetadata.c: - mxfmetadata: DMSchemes in the Preface is a required field - Even if it has 0 entries. - -2016-01-29 18:41:52 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxful.c: - mxful: Fix Content Storage UL - -2016-01-29 18:28:03 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmetadata.c: - mxfmetadata: Best effort values must be written and if unset must contain the distinguished value - It's invalid to not write them at all. - -2016-01-29 17:36:11 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxful.c: - mxful: Add missing OperationalPattern UL, which fixes an off-by-one with the others - -2016-01-29 17:07:08 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Our body partition is always complete and closed - We have no metadata in it. - -2016-01-29 17:02:01 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Use IndexSID of 2 instead of 1 - Some tools complain if essence and index have the same SID. - -2016-01-29 16:38:23 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Rewrite body partition pack on EOS and mark it as complete/closed - -2016-01-29 23:28:59 +1100 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: guard against not finding a valid frame in loop - Fixes sporadic crashes on finishing decoding a video. - https://bugzilla.gnome.org/show_bug.cgi?id=761014 - -2016-01-29 15:24:36 +1100 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideodec.h: - * sys/androidmedia/org/freedesktop/gstreamer/androidmedia/GstAmcOnFrameAvailableListener.java: - amcvideodec: set our data pointer in java to NULL on close - The frame available callback can be called after deconfiguring the amc codec. - Guard against this by setting the back pointer to NULL on close() and ignoring - any NULL data pointer. - https://bugzilla.gnome.org/show_bug.cgi?id=761014 - -2016-01-29 15:07:59 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/glcontexthelper.c: - * sys/applemedia/glcontexthelper.h: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - applemedia: refactor GL context code - Rework the GL context code. Now both avfvideosrc and vtdec can create an - internal GL context for pushing textures. Both elements will still try to - use/switch to a local context where available (including after RECONFIGURE - events). - -2016-01-29 10:35:15 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * gst-libs/gst/gl/glprototypes/base.h: - glprototypes: fix parameter type of glGenBuffers - The number of buffers should be GLsizei instead of GLuint. - https://bugzilla.gnome.org/show_bug.cgi?id=761272 - -2015-12-08 14:09:58 +0800 Haihua Hu <b55597@freescale.com> - - * ext/gl/effects/gstgleffectssources.c: - gleffects: fix gleffects fisheye shader compile error - On some embedded systems, sqrt() is not supported in the shader, - use the actual value of sqrt(2) instead. - Signed-off-by: Haihua Hu <b55597@freescale.com> - Bugzilla: https://bugzilla.gnome.org/show_bug.cgi?id=761271 - -2016-01-29 14:03:26 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: par may not exist in the caps - Fixes a critical in the gst-validate tests: - gst_structure_fixate_field_nearest_fraction: assertion 'gst_structure_has_field - (structure, field_name) - -2016-01-29 12:45:57 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglcontext.c: - glcontext: back out unintended lost_context changes - -2016-01-28 16:39:07 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/utils/opengl_versions.h: - egl: implement selecting opengl3 contexts - -2016-01-28 14:31:33 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimagememory.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - gl/egl: pass the error value to get_error_string() - -2016-01-28 18:20:44 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/rawparse/gstvideoparse.c: - videoparse: initialize update_size to FALSE when updating info - Otherwise, behavior will be undefined when no strides/offsets are set - and it will likely go wrong. - https://bugzilla.gnome.org/show_bug.cgi?id=760270 - -2016-01-28 11:56:36 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/rawparse/gstvideoparse.c: - videoparse: Fix framesize calculation - When the framesize is not specified, we try and calculate a size from - the strides and offset information. This was done with the sum of - offsets + the size of the last frame. That is just wrong method. We also - need to account for video meta that may be flipping two planes. An - example is if you convert I420 to YV12 by flipping the two last offsets. - https://bugzilla.gnome.org/show_bug.cgi?id=760270 - -2016-01-28 19:36:47 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdpdepay.h: - gdpdepay: Add ts-offset property to adjust buffer timestamps - -2016-01-29 04:50:42 +1100 Jan Schmidt <jan@centricular.com> - - * pkgconfig/gstreamer-bad-audio-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-audio.pc.in: - * pkgconfig/gstreamer-bad-base-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-base.pc.in: - * pkgconfig/gstreamer-bad-video-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-video.pc.in: - * pkgconfig/gstreamer-gl-uninstalled.pc.in: - * pkgconfig/gstreamer-gl.pc.in: - pkg-config: Don't generate and install pkg-config with relative paths - Don't put relative paths in pkg-config files, including uninstalled - ones. For those, use @abs_topbuilddir@ and @abs_topsrcdir@ as we - do elsewhere. - Remove libraries= directives, which doesn't seem to be a pkg-config - variable that actually exists, but has been in all our pkg-config - files for as long as they've existed. - -2016-01-28 16:49:53 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmpeg.c: - mxfmpeg: Write the correct essence container UL for all codecs - -2016-01-28 16:41:31 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmpeg.c: - mxfmpeg: Write version number into the picture essence coding UL - -2016-01-28 16:32:34 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Write a timecode track into the source package too - -2016-01-11 15:47:24 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/rawparse/gstvideoparse.c: - * gst/rawparse/gstvideoparse.h: - videoparse: use decide_allocation to check if downstream supports videometa - If yes, we add them to each output buffers and we avoid frame copy. - https://bugzilla.gnome.org/show_bug.cgi?id=760270 - -2016-01-11 15:46:16 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/rawparse/gstrawparse.c: - * gst/rawparse/gstrawparse.h: - rawparse: add 'decide_allocation' vfunc to let subclass parse an allocation query - And so send an allocation query. This could be used to check whether - downstream element supports some metas or not. - https://bugzilla.gnome.org/show_bug.cgi?id=760270 - -2016-01-08 17:17:01 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/rawparse/gstrawparse.c: - rawparse: use size of buffer we got from adapter - Otherwise position in stream could be wrong if subclass 'pre_push_frame' - method changes the buffer size. - https://bugzilla.gnome.org/show_bug.cgi?id=760270 - -2016-01-07 14:27:27 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/rawparse/gstvideoparse.c: - * gst/rawparse/gstvideoparse.h: - videoparse: add properties to set framesize, strides and planes offsets - To make parser work with image having non-standard strides, plane - offsets or with padding between images. - For now, since element doesn't check for videometa, we can't directly - push buffers when these properties are set so it convert the frame - in the pre_push_buffer method to remove any custom padding. - https://bugzilla.gnome.org/show_bug.cgi?id=760270 - -2016-01-08 15:21:28 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/rawparse/gstrawparse.c: - * gst/rawparse/gstrawparse.h: - * gst/rawparse/gstvideoparse.c: - rawparse: rename 'set_buffer_flags' vfunc to 'pre_push_buffer' - to allow subclass to change other fields of the buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=760270 - -2016-01-07 14:18:08 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/rawparse/gstvideoparse.c: - * gst/rawparse/gstvideoparse.h: - videoparse: cache video info in instance - To avoid initializing and filling video info each time we need it. - https://bugzilla.gnome.org/show_bug.cgi?id=760270 - -2016-01-28 15:38:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxful.c: - * gst/mxf/mxful.h: - mxfmux: Write This Generation UID into the Identification metadata - It's required according to the standard and we forgot to actually write it to - the file although we stored it in the data structures. - -2016-01-28 15:29:01 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmetadata.c: - mxfmetadata: Add workaround for ffmpeg only writing one Video Line Map value - https://ffmpeg.org/pipermail/ffmpeg-devel/2016-January/188202.html - -2015-10-14 21:13:57 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstglstereomix.c: - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - * gst/compositor/compositor.c: - videoaggregator: don't do caps processing that is not overridable - Allows the subclass to completely override the chosen src caps. - This is needed as videoaggregator generally has no idea exactly - what operation is being performed. - - Adds a fixate_caps vfunc for fixation - - Merges gst_video_aggregator_update_converters() into - gst_videoaggregator_update_src_caps() as we need some of its info - for proper caps handling. - - Pass the downstream caps to the update_caps vfunc - https://bugzilla.gnome.org/show_bug.cgi?id=756207 - -2016-01-27 20:23:21 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglcolorbalance.c: - glcolorbalance: return HARDWARE from get_balance_type - -2016-01-27 20:04:00 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglsinkbin.c: - * ext/gl/gstglsinkbin.h: - glsinkbin: add glcolorbalance element - This makes playbin not plug videobalance as glcolorbalance already exists and - implements the GstColorBalance interface. - -2016-01-27 19:56:36 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstglcontrolbindingproxy.c: - * gst-libs/gst/gl/gstglcontrolbindingproxy.h: - gl: move control binding proxy implementation from glvideomixer - Other elements may need to use it's functionality - -2016-01-27 18:17:06 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglcolorbalance.c: - glcolorbalance: create the shader if it doesn't exist in the render callback - Changing the properties may result in glcolorbalance moving from passthrough to - non-passthrough and we weren't creating the shader in that case. - -2016-01-25 16:29:46 +1100 Matthew Waters <matthew@centricular.com> - - * ext/qt/gstqtsink.cc: - qt: specify that we currently only take 2D textures - Fixes black screen video playback on android without a caps filter. - -2016-01-25 19:11:38 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideoflip.c: - * ext/gl/gstglvideoflip.h: - glvideoflip: incorporate the aspect ratio into the scale_x calculations - 1. Otherwise rotating the video will clip and show black bars due to - gltransformation's implementation. - 2. The other option of make gltransformation aspect-agnostic produces - incorrect output with perspective transformations. - -2016-01-27 14:36:36 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - applemedia: avfvideosrc: actually set the configured framerate - Actually set the configured framerate. Before we only used to set the first - matching framerate range. On iOS where the camera reports ranges 2, 60, we - used to configure the camera to output anything between 2 and 60fps. - -2016-01-25 22:30:29 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstcvlaplace.cpp: - * ext/opencv/gstcvlaplace.h: - opencv: add mask property to cvlaplace - Add a "mask" property that sets whether the edges by cvLaplace should be - used as a mask on the original input or not. The same way the original - image is copied to the edges in edgedetect. - -2016-01-25 21:42:52 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstcvsobel.cpp: - * ext/opencv/gstcvsobel.h: - opencv: add mask property to cvsobel - Add a "mask" property that sets whether the detected derivative edges - should be used as a mask on the original input or not. The same way - the original image is added to the edges in edgedetect. - -2016-01-25 15:19:37 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstskindetect.cpp: - opencv: update deprecated function in skindetect - cvCvtPixToPlane() has been deprecated in OpenCV 3.0, and cvSplit() is the - suggested replacement. Since cvSplit() is available in OpenCV 2.4, it is - safe and cautious to update the function usage before it becomes an issue. - -2016-01-25 11:43:59 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstcvlaplace.cpp: - * ext/opencv/gstcvlaplace.h: - opencv: fix cvlaplace - cvlaplace was also affected by the silent change in OpenCV API, same as - cvsobel. It hasn't been working for a while. It would return a plain black - image. This commit updates the usage of cvLaplace by using cvCvtColor to - create the grayscale intermediate image to process. This also means there - is no need anymore to use GstBaseTransform's transform_caps, since the pads - are RGB. - -2016-01-25 13:33:09 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix buffer leak when sps is not present - When sps data is NULL, the buffer allocated and mapped is not being freed. - In this scenario there is no need to allocate the buffer as we are supposed to return NULL. - https://bugzilla.gnome.org/show_bug.cgi?id=761070 - -2016-01-25 12:05:12 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix buffer memory leak. - While setting caps, codec_data buffer is mapped, but not being unmapped - leading to memory leaks. - https://bugzilla.gnome.org/show_bug.cgi?id=761070 - -2016-01-23 17:10:51 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstcvsobel.cpp: - * ext/opencv/gstcvsobel.h: - opencv: fix cvsobel - cvsobel han't been working for a while due to a silent change in OpenCV - API. It would return a plain black image. This commit updates the usage - of cvSobel by using cvCvtColor to create the grayscale image to process. - This also means there is no need to use GstBaseTransform's transform_caps - anymore, since the pads can be RGB. - -2016-01-23 05:30:05 +0200 Sebastian Dröge <sebastian@centricular.com> - - * pkgconfig/Makefile.am: - pkg-config: Properly version and install base/audio/video .pc files - https://bugzilla.gnome.org/show_bug.cgi?id=760733#c17 - -2016-01-22 16:43:03 +0000 Alex Ashley <alex.ashley@youview.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix leak of stream->internal_pad - The function gst_adaptive_demux_stream_update_source() function creates - a new GstPad called internal_pad. This pad is not freed when releasing - the stream. - The solution is to set GST_PAD_FLAG_NEED_PARENT so that the chain - functions do not get called when the pad has no parent and then - remove the parent in the gst_adaptive_demux_stream_free() function. This - causes the refcount of the pad to be set to zero. - https://bugzilla.gnome.org/show_bug.cgi?id=760982 - -2016-01-21 22:00:44 +0800 John Chang <r97922153@gmail.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Use RepresentationIndex instead of Initialization to get the URL of the RepresentationIndex - https://bugzilla.gnome.org/show_bug.cgi?id=760936 - -2016-01-22 17:25:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gst-android-hardware-camera.c: - ahc: Fail gracefully if our callback class can't be found - Instead of just ignoring that error and then calling JNI functions with NULL, - which will kill the virtual machine. - The error handling here needs some further improvements though, errors in more - places are just ignored. - -2016-01-22 17:22:47 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gst-android-hardware-camera.c: - ahc: Initialize GError pointer with NULL - Otherwise there will be assertions. - -2016-01-22 17:18:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Only free GstAmcBuffer if it's not NULL - And also free it on GL errors. - -2016-01-13 22:05:49 +0100 Julien Moutte <julien@ctondemand.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklinkvideosrc: implement RGB capture support - Combine mode and format to generate caps and support the flags from VideoChanged callback to support RGB capture. - https://bugzilla.gnome.org/show_bug.cgi?id=760594 - -2016-01-22 16:22:07 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.h: - amc: Add an assertion for NULL GErrors - Should never happen! But an assertion is better than a NULL pointer - dereference. - -2016-01-22 16:14:46 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gst-android-graphics-imageformat.c: - * sys/androidmedia/gst-android-hardware-camera.c: - ahc: Fix indentation - -2016-01-22 16:13:45 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - amc: MediaCodec::getOutputBuffer() can return NULL without exception - Happens when doing zerocopy rendering, or when passing a wrong index to it. - Handle this properly for zerocopy rendering, fail properly for the other - cases. - https://bugzilla.gnome.org/show_bug.cgi?id=760961 - -2016-01-16 18:59:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/audio/Makefile.am: - * gst-libs/gst/base/Makefile.am: - * gst-libs/gst/video/Makefile.am: - * pkgconfig/Makefile.am: - base/audio/video: Install headers and pkg-config files - They are still considered unstable API but it would be good to give them some - wider testing already to make sure the API is useful. - https://bugzilla.gnome.org/show_bug.cgi?id=760733 - -2016-01-16 18:56:26 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/audio/Makefile.am: - * gst-libs/gst/audio/gstaudioaggregator.c: - * gst-libs/gst/audio/gstaudioaggregator.h: - * gst/audiomixer/Makefile.am: - * gst/audiomixer/gstaudiointerleave.h: - * gst/audiomixer/gstaudiomixer.h: - * pkgconfig/gstreamer-bad-audio-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-audio.pc.in: - audio: Move audioaggregator base class to a library - It's useful enough already to be used in other elements for audio aggregation, - let's give people the opportunity to use it and give it some API testing. - https://bugzilla.gnome.org/show_bug.cgi?id=760733 - -2016-01-21 23:13:36 +0100 Holger Kaelberer <holger.k@elberer.de> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - glwindow: Fix android build - https://bugzilla.gnome.org/show_bug.cgi?id=760972 - -2016-01-22 13:51:49 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/videotexturecache.m: - applemedia: texture cache: copy the input metas - Copy the input metas so avfvideosrc and vtenc can fast path to using - CVPixelBuffer(s) even when using GLMemory. - -2016-01-21 13:50:44 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - Merge branch 'android-hardware-camera' - This branch adds support for Android Hardware Camera API through a new - element called ahcsrc. This is the "old" Android Camera API, then only - API available on Android 4.X. - https://bugzilla.gnome.org/show_buf.cgi?id=737786 - -2016-01-08 16:16:09 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/androidmedia/gstahcsrc.c: - ahcsrc: Fix latency reporting - Currently it was wrongly reporting min/max as being the shortest and - longest possible frame duration. This is not how latency works in - GStreamer. - Fix by reporting min latency as being the longest possible duration of - one frame. As we don't know how many buffers the stack can accumulate, we - simply assume that max latency is the same (the usual default behaviour). - -2015-12-07 14:31:40 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * sys/androidmedia/gstahcsrc.c: - ahcsrc: fix deadlock when flushing - _data_queue_item_free() calls gst_buffer_unref(), which - calls gst_ahc_src_buffer_free_func(), which calls - g_mutex_lock() on self->mutex and there you go... deadlock! - -2015-12-24 12:51:13 +0900 Justin Kim <justin.kim@collabora.com> - - * sys/androidmedia/Makefile.am: - * sys/androidmedia/gst-android-graphics-imageformat.c: - * sys/androidmedia/gst-android-graphics-imageformat.h: - * sys/androidmedia/gst-android-graphics-surfacetexture.c: - * sys/androidmedia/gst-android-graphics-surfacetexture.h: - * sys/androidmedia/gst-android-hardware-camera.c: - * sys/androidmedia/gst-android-hardware-camera.h: - * sys/androidmedia/gst-android-media-mediacodec.c: - * sys/androidmedia/gst-android-media-mediacodec.h: - * sys/androidmedia/gst-android-media-mediacodecinfo.c: - * sys/androidmedia/gst-android-media-mediacodecinfo.h: - * sys/androidmedia/gst-android-media-mediacodeclist.c: - * sys/androidmedia/gst-android-media-mediacodeclist.h: - * sys/androidmedia/gst-android-media-mediaformat.c: - * sys/androidmedia/gst-android-media-mediaformat.h: - * sys/androidmedia/gstahcsrc.c: - * sys/androidmedia/gstahcsrc.h: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/org/freedesktop/gstreamer/androidmedia/GstAhcCallback.java: - ahcsrc: porting from 0.10 to 1.0 - -2015-12-24 12:14:24 +0900 Justin Kim <justin.kim@collabora.com> - - * gst-libs/gst/dvm/Makefile.am: - * gst-libs/gst/dvm/gstdvm.c: - * gst-libs/gst/dvm/gstdvm.h: - * pkgconfig/gstreamer-dvm-uninstalled.pc.in: - * pkgconfig/gstreamer-dvm.pc.in: - * sys/androidcamera/Makefile.am: - * sys/androidcamera/com/gstreamer/GstAhcCallback.java: - * sys/androidcamera/gstahccallback.h: - * sys/androidmedia/gst-android-graphics-imageformat.c: - * sys/androidmedia/gst-android-graphics-imageformat.h: - * sys/androidmedia/gst-android-graphics-surfacetexture.c: - * sys/androidmedia/gst-android-graphics-surfacetexture.h: - * sys/androidmedia/gst-android-hardware-camera.c: - * sys/androidmedia/gst-android-hardware-camera.h: - * sys/androidmedia/gst-androidcamera.c: - * sys/androidmedia/gstahcsrc.c: - * sys/androidmedia/gstahcsrc.h: - move androidcamera into androidmedia - This commit is a part of portng android hardware camera from 0.10 implementation. - To preserve history and get diff clearly, the interesting files are moved to - deployment directory and the remaining files are removed. - -2013-01-07 18:27:40 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gst-android-graphics-surfacetexture.c: - * sys/androidcamera/gst-android-graphics-surfacetexture.h: - * sys/androidcamera/gst-android-hardware-camera.c: - * sys/androidcamera/gst-android-hardware-camera.h: - * sys/androidcamera/gstahcsrc.c: - androidcamera: Separate release and free APIs - -2013-01-07 18:20:47 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidmedia/gst-android-media-mediacodecinfo.c: - androidmedia: Fix get_level and get_profile exception checking by not using return - -2013-01-07 18:19:28 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidmedia/gst-android-media-mediacodec.c: - * sys/androidmedia/gst-android-media-mediacodec.h: - * sys/androidmedia/gst-android-media-mediacodecinfo.c: - androidmedia: Add extern gint declarations - -2013-01-07 18:18:18 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst-libs/gst/dvm/gstdvm.h: - gstdvm: Fix GST_DVM_GET_STATIC_FIELD - -2012-11-29 20:10:19 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gst-android-hardware-camera.c: - androidcamera: Small refactor in case open doesn't throw an exception but returns null - -2012-12-13 17:57:58 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidcamera/gst-android-hardware-camera.c: - androidcamera: Fix some compiler warnings - -2012-12-13 17:56:01 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/dvm/Makefile.am: - * gst-libs/gst/dvm/gstdvm.c: - * gst-libs/gst/dvm/gstdvm.h: - * sys/androidcamera/Makefile.am: - * sys/androidcamera/gst-android-graphics-imageformat.c: - * sys/androidcamera/gst-android-graphics-surfacetexture.c: - * sys/androidcamera/gst-android-hardware-camera.c: - * sys/androidcamera/gst-androidcamera.c: - * sys/androidcamera/gstahcsrc.c: - * sys/androidmedia/gst-android-media-mediacodec.c: - * sys/androidmedia/gst-android-media-mediacodecinfo.c: - * sys/androidmedia/gst-android-media-mediacodeclist.c: - * sys/androidmedia/gst-android-media-mediaformat.c: - dvm: Rename gst-dvm.ch to gstdvm.ch for consistency with other GStreamer code - -2012-12-13 17:40:22 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/dvm/gst-dvm.c: - * gst-libs/gst/dvm/gst-dvm.h: - dvm: Add new function to check if we started a VM or only used an existing one - -2012-12-13 17:40:04 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gst-android-media-mediacodec.c: - * sys/androidmedia/gst-android-media-mediacodec.h: - androidmedia: Make everything compile with the new wrappers - -2012-12-13 12:13:27 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gst-android-media-mediacodec.c: - * sys/androidmedia/gst-android-media-mediacodec.h: - * sys/androidmedia/gst-android-media-mediacodecinfo.c: - * sys/androidmedia/gst-android-media-mediacodecinfo.h: - * sys/androidmedia/gst-android-media-mediacodeclist.c: - * sys/androidmedia/gst-android-media-mediacodeclist.h: - * sys/androidmedia/gst-android-media-mediaformat.c: - * sys/androidmedia/gst-android-media-mediaformat.h: - androidmedia: Add remaining bits of the Java wrappers using libgstdvm - -2012-12-13 12:13:12 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/dvm/gst-dvm.h: - dvm: Add some more helper macros - -2012-12-12 18:10:13 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gst-android-media-mediacodec.c: - * sys/androidmedia/gst-android-media-mediaformat.c: - androidmedia: Remove g_return_if_fails() - This is not public API so it has no advantage to have them here. - -2012-11-28 20:53:51 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidmedia/gst-android-media-mediacodec.c: - * sys/androidmedia/gst-android-media-mediacodec.h: - * sys/androidmedia/gst-android-media-mediaformat.c: - * sys/androidmedia/gst-android-media-mediaformat.h: - androidmedia: Use gst-dvm and refactor java wrappers (WIP) - Moved the java wrapper API into its own files and made use of the - gst-dvm macros. Also renamed the API to have the proper naming - convention and coding style in order to match the one in androidcamera. - This is a work in progress! "android/media/MediaCodecList" is still missing - and the actual elements have not been ported to use the new function names. - -2012-11-28 15:26:49 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gst-android-graphics-imageformat.h: - * sys/androidcamera/gst-android-graphics-surfacetexture.h: - * sys/androidcamera/gst-android-hardware-camera.h: - androidcamera: Add G_BEGIN/END_DECLS to the .h - -2012-11-27 19:25:06 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst-libs/gst/dvm/Makefile.am: - * gst-libs/gst/dvm/gst-dvm.c: - * gst-libs/gst/dvm/gst-dvm.h: - * pkgconfig/gstreamer-dvm-uninstalled.pc.in: - * pkgconfig/gstreamer-dvm.pc.in: - * sys/androidcamera/Makefile.am: - * sys/androidcamera/gst-android-graphics-imageformat.c: - * sys/androidcamera/gst-android-graphics-surfacetexture.c: - * sys/androidcamera/gst-android-hardware-camera.c: - * sys/androidcamera/gst-androidcamera.c: - * sys/androidcamera/gstahcsrc.c: - gst-dvm: Create a gst-dvm library using part of androidcamera - -2012-11-27 17:24:35 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Adding a device-name property - -2012-11-20 19:56:22 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * docs/plugins/inspect/plugin-androidcamera.xml: - * sys/androidcamera/gstahcsrc.c: - * sys/androidcamera/gstahcsrc.h: - androidcamera: Add element documentation - -2012-11-19 18:25:12 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/Makefile.am: - androidcamera: Prettify the gstahccallback.c generation line in the makefile - -2012-11-15 12:33:26 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gst-android-hardware-camera.c: - androicamera: Make sure the TMP env var exists and check for DEX var too - -2012-11-14 11:38:51 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gst-android-hardware-camera.c: - androidcamera: Do not use gst_list_free_full since it requires glib 2.28 - -2012-11-12 18:59:57 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - * sys/androidcamera/gstahcsrc.h: - androidcamera: Add smooth-zoom property for smooth zooming feature - -2012-11-12 18:19:20 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Add focal-length, view-angle and video-stabilization properties - -2012-11-12 18:18:11 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gst-android-hardware-camera.c: - * sys/androidcamera/gst-android-hardware-camera.h: - androidcamera: Add video stabilization API - -2012-11-12 16:38:40 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Add property probe for the photography properties - -2012-11-09 18:21:21 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Small refactor - -2012-11-09 16:57:30 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Fix small memleak - -2012-11-09 16:55:57 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Store GParamSpec for properties and use that for the PropertyProbe comparison - -2012-11-09 12:23:37 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Handle zoom comparison better, and avoid float precision issue - -2012-11-09 12:22:12 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Fix EV compensation support - -2012-11-07 19:16:05 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Implement new GstPhotography enums - -2012-11-07 15:38:19 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Do not advertise zoom capabilities if camera doesn't support zoom - -2012-11-07 15:37:43 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gst-android-hardware-camera.c: - androidcamera: Be NULL-safe when a JNI list is returned - -2012-11-02 18:07:24 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Use strcmp on the GParamSpec property name - Use strcmp instead of using the property_id because it's overriden - -2012-11-02 18:00:55 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidmedia: Implement property probe for zoom and ev_compensation - -2012-11-02 17:00:45 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/com/gstreamer/GstAhcCallback.java: - * sys/androidcamera/gst-android-hardware-camera.c: - * sys/androidcamera/gst-android-hardware-camera.h: - * sys/androidcamera/gstahcsrc.c: - androidcamera: Add autofocus support - -2012-11-02 16:59:42 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Override properties - -2012-11-01 15:24:12 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - anroidcamera: Add support for the GstPhotography interface - -2012-11-01 11:58:33 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gst-android-hardware-camera.c: - * sys/androidcamera/gst-android-hardware-camera.h: - androidcamera: Add more wrappers for the Camera.Parameters class - -2012-10-31 14:21:47 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Send proper error when unable to open camera - -2012-10-30 12:13:12 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Adding device-orientation and device-facing properties - -2012-10-30 11:35:36 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - * sys/androidcamera/gstahcsrc.h: - androidcamera: Add device property and property probe it - -2012-10-30 10:12:06 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Fix memleak and lose of buffer if the data queue is flushing - -2012-10-30 09:49:39 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Calling set_preview_callback with NULL frees all the buffers in the queue. - We must not do it at the stop otherwise we lose all our buffers. It's best to do - it during the close, so we free up the resources. - -2012-10-30 09:49:03 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Drop frames if we don't have a clock and var rename - -2012-10-30 09:45:55 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androicamera: if buffer size increases, then readd new buffers to the queue and drop old ones - The on_preview callback gets called with NULL if the buffer in the queue is - too small, so we need to handle the case where the array is NULL. Also - there is a bug in the android source which makes it drop one of the buffers - so if we had 5 buffers, and we renegotiate to a higher resolution, then we'd - only get 4 calls to on_preview_frame with NULL, with one being dropped. - This means we can't reallocate the buffers in the if (data == NULL) case - because we might end up with 0 buffers in the end. - -2012-10-30 09:44:31 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gst-android-hardware-camera.c: - androidcamera: If callback is NULL then set it to NULL in jni - -2016-01-21 13:46:52 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Fix debug output - -2012-10-26 12:57:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Chose the smallest range that contains the target framerate - -2012-10-26 12:43:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Improve negotiation - And make sure we set an FPS range from the supported ones - now instead of a potentially unsupported range. - -2012-10-26 12:19:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Implement LATENCY query - -2012-10-26 11:57:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Make sure we always have a valid camera source instance in the buffer free function - -2012-10-26 11:46:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidcamera/gst-android-hardware-camera.c: - * sys/androidcamera/gstahcsrc.c: - androidcamera: Make sure to not call any callbacks after stopping the camera - Fixes segfaults when rotating the device for example. - -2012-10-24 15:25:54 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidcamera: Fix timestamping issue - -2012-10-24 13:59:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - * sys/androidcamera/gstahcsrc.h: - androidcamera: Add caps negotiation support - -2012-10-24 10:55:52 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - Add support for getcaps that probes the camera for capabilities - -2012-10-23 13:54:46 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidmedia: Drop the first buffer to have proper timestamping - -2012-10-23 11:14:00 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidmedia: Flush the queue when the source is stopped - -2012-10-23 11:13:37 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidmedia: Allocate/free texture when camera is open/closed - -2012-10-23 11:13:12 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidmedia: add a gst_ahc_src_close function - -2012-10-23 11:12:19 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - androidmedia: Fix small indentation issues - -2012-10-23 10:12:52 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/Makefile.am: - androidmedia: Disable plugin if android-sdk isn't found and dynamically search for platform version - -2012-10-23 09:01:50 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/Makefile.am: - * sys/androidcamera/com/gstreamer/GstAhcCallback.java: - * sys/androidcamera/gst-android-hardware-camera.c: - * sys/androidcamera/gstahccallback.h: - androidcamera: Add support for using DexLoader with Embeded GstAhcCallback.jar - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gst-android-graphics-imageformat.c: - * sys/androidcamera/gst-android-graphics-surfacetexture.c: - * sys/androidcamera/gst-android-hardware-camera.c: - androidcamera: Fix compilation issues - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/Makefile.am: - * sys/androidcamera/gst-androidcamera.c: - Remove previous cruft and create androidcamera plugin - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - Free the buffers and readd the arrays when the queue is cleared - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gst-android-graphics-imageformat.c: - * sys/androidcamera/gst-android-graphics-surfacetexture.c: - * sys/androidcamera/gst-android-hardware-camera.c: - * sys/androidcamera/gst-dvm.h: - Add a GST_DVM_CALL macro to ease function calling with exception check - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - * sys/androidcamera/gstahcsrc.h: - Calculate timestamp at reception of the buffer, not when pushing it out - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - Make the number of callback buffers configurable, and delete their local ref - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - * sys/androidcamera/gstahcsrc.h: - Use GstDataQueue instead of GAsyncQueue for storing buffers - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - Use the buffer's free_func to map byteArray data without making a copy - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - Remove open failure test code and debug log - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gstahcsrc.c: - Use YV12 as the default format - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gst-android-graphics-imageformat.c: - * sys/androidcamera/gst-android-graphics-imageformat.h: - * sys/androidcamera/gst-android-graphics-surfacetexture.c: - * sys/androidcamera/gst-android-graphics-surfacetexture.h: - * sys/androidcamera/gst-android-hardware-camera.c: - * sys/androidcamera/gst-android-hardware-camera.h: - * sys/androidcamera/gst-androidmedia.c: - Add a deinit function and remove jclass references in case of error - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/gst-android-graphics-surfacetexture.c: - SurfaceTexture constructure needs texture_id - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/Makefile.am: - * sys/androidcamera/gst-androidmedia.c: - * sys/androidcamera/gstahcsrc.c: - * sys/androidcamera/gstahcsrc.h: - Add ahcsrc Camera source element prototype - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/Makefile.am: - * sys/androidcamera/gst-android-graphics-imageformat.c: - * sys/androidcamera/gst-android-graphics-imageformat.h: - * sys/androidcamera/gst-android-graphics-surfacetexture.c: - * sys/androidcamera/gst-android-graphics-surfacetexture.h: - * sys/androidcamera/gst-android-hardware-camera.c: - * sys/androidcamera/gst-android-hardware-camera.h: - Add android.hardware.Camera (and deps) JNI wrappers - -2012-10-17 19:42:59 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/Makefile.am: - * sys/androidcamera/gst-dvm.c: - * sys/androidcamera/gst-dvm.h: - Adding Dalvik Virtual Machine routines and macros - -2012-10-17 17:56:33 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/androidcamera/Makefile.am: - * sys/androidcamera/gst-androidmedia.c: - androidmedia: Add androidmedia plugin - -2016-01-15 14:31:54 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/spandsp/Makefile.am: - * ext/spandsp/gstspandsp.c: - * ext/spandsp/gsttonegeneratesrc.c: - * ext/spandsp/gsttonegeneratesrc.h: - spandsp: Add tone generator - -2015-07-14 13:40:46 +0900 Hyunjun Ko <zzoon.ko@samsung.com> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: set non-0 payload length in PES header if video ES packet is small enough - https://bugzilla.gnome.org/show_bug.cgi?id=748507 - -2015-07-14 13:42:54 +0900 Hyunjun Ko <zzoon.ko@samsung.com> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: reset pes_bytes_written when starting to write new PES packet - In case of an unbounded packet (video usually), pes_bytes_written was - no reset. - https://bugzilla.gnome.org/show_bug.cgi?id=748507 - -2016-01-19 17:08:50 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - mpegtsmux: add support for H.265/HEVC video - https://bugzilla.gnome.org/show_bug.cgi?id=744367 - -2016-01-19 13:20:23 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/effects/gstgleffectscurves.c: - * ext/gl/effects/gstgleffectscurves.h: - gl: fix compiler warnings with gcc-6 - In file included from effects/gstgleffectrgbtocurve.c:25:0: - effects/gstgleffectscurves.h:174:32: error: 'xray_curve' defined but not used - static const GstGLEffectsCurve xray_curve = { - ... - -2016-01-19 08:39:58 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/insertbin/Makefile.am: - * gst-libs/gst/mpegts/Makefile.am: - * gst-libs/gst/player/Makefile.am: - libs: g-i: fix init section to avoid compiler warnings - ..GstPlayer-1.0.c: In function ‘main’: - ..GstPlayer-1.0.c:587:3: warning: implicit declaration of function ‘gst_init’ - https://bugzilla.gnome.org/show_bug.cgi?id=760090 - -2016-01-19 19:18:43 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtenc.c: - applemedia: vtenc: fix build on iOS - -2016-01-19 15:50:22 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfassetsrc.m: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/coremediabuffer.h: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/corevideobuffer.h: - * sys/applemedia/qtkitvideosrc.m: - * sys/applemedia/videotexturecache.m: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - applemedia: always fill GstBuffers with GstMemory - Always fill buffers with our custom memory. The custom memory will avoid - mapping CV/CM buffers unless necessary. - -2015-04-19 00:30:48 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/corevideobuffer.c: - applemedia: implement copying of meta - Before this, buffers would lose their Core Video / Core Media meta - over intervideo* boundary. - https://bugzilla.gnome.org/show_bug.cgi?id=747216 - -2015-04-02 20:04:18 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/corevideobuffer.h: - * sys/applemedia/corevideomemory.c: - * sys/applemedia/corevideomemory.h: - * sys/applemedia/plugin.m: - applemedia: implement GstAppleCoreVideoMemory - Implement a new memory type wrapping CVPixelBuffer. - There are two immediate advantages: - a) Make the GstMemory itself retain the CVPixelBuffer. Previously, - the containing GstBuffer was solely responsible for the lifetime of - the backing CVPixelBuffer. - With this change, we remove the GST_MEMORY_FLAG_NO_SHARE so that - GstMemory objects be referenced by multiple GstBuffers (doing away - with the need to copy.) - b) Delay locking CVPixelBuffer into CPU memory until it's actually - mapped -- possibly never. - The CVPixelBuffer object is shared among references, shares and - (in planar formats) planes, so a wrapper GstAppleCoreVideoPixelBuffer - structure was introduced to manage locking. - https://bugzilla.gnome.org/show_bug.cgi?id=747216 - -2016-01-19 12:56:40 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/iosurfacememory.c: - applemedia: iosurfacememory: alloc with g_new0 - ...since the base class doesn't use g_slice anymore - -2016-01-08 11:04:13 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstdashdemux.c: - dashdemux: added check that availabilityStartTime is present for live streams - https://bugzilla.gnome.org/show_bug.cgi?id=757602 - -2015-11-04 18:15:24 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - adaptivedemux: improved error message if availabilityStartTime is missing for a live stream - For a live mpd, if availabilityStartTime is missing, adaptive demux asserts - with: Unexpected critical/warning: gst_date_time_to_g_date_time: assertion - 'datetime != NULL' failed. - This patch improves the error message to: - Unexpected critical/warning: gst_mpd_client_seek_to_time: assertion - 'client->mpd_node->availabilityStartTime != NULL' failed - https://bugzilla.gnome.org/show_bug.cgi?id=757602 - -2016-01-14 18:27:50 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/test_http_src.c: - tests: adaptive-stremaing: fix memory leak in test_http_src - https://bugzilla.gnome.org/show_bug.cgi?id=760600 - -2016-01-15 10:49:12 -0500 Matt Crane <mattcrane@tycoint.com> - - * sys/shm/gstshmsink.c: - shmsink: fix possible deadlock in _render()/ _allocator_free() - Drop object lock before unrefing memory, otherwise the object - lock might be taken again from the allocator and then things - deadlock. - https://bugzilla.gnome.org/show_bug.cgi?id=760551 - -2016-01-16 17:14:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: First make caps writable in fixate_caps(), then truncate them - Truncating requires writable caps. - -2016-01-16 17:12:29 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: Caps passed to fixate_caps() are not owned by us and guaranteed to be fixed - So don't try to fixate them, which takes ownership and steals them from - basetransform. - https://bugzilla.gnome.org/show_bug.cgi?id=760696 - -2016-01-16 16:55:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - Revert "glpool: fix caps refcount issue" - This reverts commit 3bdcdedfa00b87f1db505218789178318a16c743. - gst_caps_replace() takes a new reference already, if there is a problem then - it is elsewhere. And there are a few problems, see - https://bugzilla.gnome.org/show_bug.cgi?id=760696 - -2016-01-15 16:10:02 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/rtp/gstrtph265depay.c: - rtph265depay: fix unneeded sub-buffer creation - We create a sub-buffer just to copy over its metas and then throw it - away immediately, just use the original input buffer directly. - -2016-01-15 15:56:59 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/rtp/gstrtph265pay.c: - rtph265pay: add "send VPS/SPS/PPS with every key frame" mode - It's not enough to have timeout or event based VPS/SPS/PPS information - sent in RTP packets. There are some scenarios when key frames may appear - more frequently than once a second, in which case the minimum timeout - for "config-interval" of 1 second for sending VPS/SPS/PPS isn't enough. - It might also be desirable in general to make sure the VPS/SPS/PPS is - available with every keyframe (packet loss aside), so receivers can - actually pick up decoding immediately from the first keyframe if - VPS/SPS/PPS is not signaled out of band. - This commit adds the possibility to send VPS/SPS/PPS with every key frame. - This mode can be enabled by setting "config-interval" property to -1. In - this case the payloader will add VPS, SPS and PPS before every key (IDR) - frame. - https://bugzilla.gnome.org/show_bug.cgi?id=757892 - -2016-01-15 15:19:41 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/rtp/gstrtph265pay.c: - * gst/rtp/gstrtph265pay.h: - rtph265pay: change config-interval property type from uint to int - This way we can use -1 as special value, which is nicer than MAXUINT. - https://bugzilla.gnome.org/show_bug.cgi?id=757892 - -2016-01-13 09:51:20 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/hls/gsthlsdemux.c: - * ext/smoothstreaming/gstmssdemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/adaptive_demux_engine.c: - * tests/check/elements/adaptive_demux_engine.h: - adaptivedemux: replace ghostpad with a standard pad - Handling the ghostpad and its internal pad was causing more issues - than helping because of their coupled activation/deactivation - actions. - As we have to install custom chain,event and query functions it is - better to use a floating sink pad internally in the demuxer and just - use those pad functions to push through a standard pad in the demuxer - https://bugzilla.gnome.org/show_bug.cgi?id=757951 - -2015-11-11 17:24:33 +0000 Florin Apostol <florin.apostol@oregan.net> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: do not flush the input pad - gst_adaptive_demux_stream_clear_eos_and_flush_state() function will do - all the necessary cleaning. - https://bugzilla.gnome.org/show_bug.cgi?id=757951 - -2016-01-15 11:44:52 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/segmentclip/gstvideosegmentclip.c: - videosegmentclip: fail to set_caps if problem in caps structure - gst_video_segment_clip_set_caps () should return FALSE if there was a - problem reading the framerate values from the caps structure. - -2016-01-15 17:00:55 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglquery.c: - glquery: provide compat definition for GL_QUERY_RESULT - e.g. android doesn't have it - While we're here move a state specific assertion after the supported check. - Removes an assertion on GLES - -2016-01-15 16:07:27 +1100 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/glprototypes/gstgl_compat.h: - gl: add compatibility definition of GLint64 - e.g. anrdoid doesn't have it - -2016-01-08 22:19:06 +0300 Sergey Borovkov <serge.borovkov@gmail.com> - - * ext/qt/qtitem.cc: - qml: Mark material dirty when texture buffer is updated - Qt might not redraw the scene otherwise. - https://bugzilla.gnome.org/show_bug.cgi?id=758286 - -2016-01-15 14:00:56 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - glpool: fix caps refcount issue - The caps are from an allocation query which are transfer none but were being - treated as transfer full. - -2016-01-11 13:30:05 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbasememory.h: - * gst-libs/gst/gl/gstglmemory.c: - glmemory: log the time for glTexSubImage/glReadPixels - -2016-01-08 18:36:54 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/glprototypes/Makefile.am: - * gst-libs/gst/gl/glprototypes/all_functions.h: - * gst-libs/gst/gl/glprototypes/query.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglquery.c: - * gst-libs/gst/gl/gstglquery.h: - * tests/check/Makefile.am: - * tests/check/libs/.gitignore: - * tests/check/libs/gstglquery.c: - gl: add a gstglquery object for arbitrary GL queries - Currently only GL_TIME_ELAPSED and GL_TIMESTAMP are supported - -2016-01-11 17:22:26 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldebug.c: - * gst-libs/gst/gl/gstgldebug.h: - gldebug: implement a delayed debug system - The messages are stored by gst_gl_async_debug_store_log_msg() and output later - by a corresponding store(), output() or an unset()/free(). - Some wrapper macros are provided to avoid callers explicitly using __FILE__, - GST_FUNCTION and __LINE__ - -2016-01-11 17:26:08 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldebug.c: - gldebug: use gst_info_vasprintf in insert_debug_marker() - Allows expansion of GST_PTR_FORMAT and GST_SEGMENT_FORMAT arguments. - -2016-01-15 11:22:40 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstglvideoflip.c: - * ext/gl/gstglvideoflip.h: - * ext/gl/gstopengl.c: - gl: add a videoflip element - Behaves exactly the same as the non-GL videoflip element - -2016-01-15 00:04:20 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: recreate the fbo on caps changes - The width/height may change which requires recreating the depth buffer. - -2016-01-15 00:02:43 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasefilter.c: - * gst-libs/gst/gl/gstglbasefilter.h: - glbasefilter: add a class function on set_caps (from GL) - This is simply a convenience to avoid duplicating the thread marshalling on - set_caps. - -2016-01-15 00:00:29 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltransformation.c: - gltransformation: always build a valid mvp matrix - The default case is to build an identity matrix. - -2016-01-14 19:03:04 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltransformation.c: - gltransformation: support negative scales - A scale of -1.0 means to flip the video. - -2016-01-14 18:42:05 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltransformation.c: - gltransformation: implement passthrough handling - -2016-01-14 17:45:03 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltransformation.c: - * ext/gl/gstgltransformation.h: - gltransformation: implement navigation events - Reverses the transformation applied through the properties and forwards the - event. - The process for finding the coordinates on the video are as follows: - 1. Convert the given pointer_x and pointer_y to model space at the near and far planes - 2. Get the equation of the video plane - 3. Find where the ray in 1 intersects the plane - 4. Profit! - -2016-01-14 16:59:12 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: remove reduntant glimagesink from debug logging - -2016-01-14 16:57:40 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl/x11/navigation: add button press to the selected event mask - Otherwise we won't get the button press events and GstNavigation fails. - -2016-01-14 16:00:00 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: try harder to passthrough - This makes a pipeline like: - ... ! video/x-raw(memory:GLMemory),format=UYVY ! glcolorconvert ! - video/x-raw(memory:GLMemory),format={UYVY, NV12} ! ... - passthrough instead of converting UYVY => NV12. The conversion would happen - before this change since the element (and basetransform) transform the src caps - to format={NV12, UYVY} (since NV12 comes first in the glcolorconvert:src - template) and then the default caps fixate func would fixate to NV12. Blah. - Also there's no need to intersect against the template caps in ::transform_caps - since basetransform does that right after calling the vfunc. - -2016-01-12 18:31:29 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstglcolorbalance.c: - * ext/gl/gstglcolorbalance.h: - * ext/gl/gstopengl.c: - gl: implement a colorbalance element - It performs the exact same operation as videobalance but with opengl shaders and - was tested with glvideomixer by comparing frames from videobalance and - glcolorbalance. - -2016-01-12 18:21:50 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - glvideomixer: implement glBlendFunc and glBlendEquation - Allows more blending options than just A over B - e.g. frame comparisons are now possible. - glvideomixer name=m - sink_0::zorder=0 - sink_1::zorder=1 - sink_1::blend-equation-rgb={subtract,reverse-subtract} - sink_1::blend-function-src-rgb=src-color - sink_1::blend-function-dst-rgb=dst-color - ! glimagesinkelement - videotestsrc pattern=checkers-4 ! m.sink_0 - videotestsrc pattern=checkers-8 ! m.sink_1 - -2016-01-08 18:38:46 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldebug.c: - gldebug: add a specific category for the debug spam from the driver - -2016-01-12 14:54:23 +0000 Tim Sheridan <tim.sheridan@imgtec.com> - - * ext/sbc/gstsbcdec.c: - sbc: sbcdec: Fix frame length calculation - SBC frame length calculation wasn't being rounded up to the nearest byte - (as specified in the A2DP 1.0 specification, section 12.9). This could - cause 'stereo' and 'joint stereo' mode SBC streams to have incorrectly - calculated frame lengths. - https://bugzilla.gnome.org/show_bug.cgi?id=742446 - -2016-01-12 23:34:31 +1100 Matthew Waters <matthew@centricular.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: update for recent GL api changes - Specifically the GstGLMemoryPBO addition (which was the unadorned GstGLMemory). - -2016-01-12 14:36:02 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - applemedia: avfvideosrc: optionally get the GL context from gst_element_set_context - Allow setting the GL context with gst_element_set_context. When available, the - local context obtained via the context query still has the precedence. - -2016-01-12 14:02:46 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/iosurfacememory.c: - applemedia: iosurfacememory: remove NO_SHARE flag - The full memory can be safely shared. Sharing a sub region can't be done and - will fail in the base allocator, triggering a copy. - -2016-01-11 13:33:46 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/frei0r/gstfrei0rmixer.c: - frei0rmixer: replace accept-caps with caps query - It wants to check if upstream can produce a certain format, - accept-caps might only check if the next element can produce it. - -2016-01-07 20:56:54 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglmemorypbo.c: - glbasememory: Free the actual memory object when requested - Otherwise we are leaking ~400B on each GstMemory allocation. - Freeing in the base class matches the GObject semantics. - -2016-01-07 20:54:41 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemorypbo.c: - glmemorypbo: don't double read pixels - The optimistic download_transfer was not setting the required flag to not - perform glReadPixels on subsequent map (READ). resulting in glReadPixels - happening twice. - -2016-01-07 18:47:37 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmemorypbo.c: - glmemory: expose gst_gl_memory_texsubimage - Removes extremely similar code from glmemorypbo. - -2016-01-07 18:05:23 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfeature.c: - glfeature add a specific debug category - Saves having to trawl through the 'default' category when function retrieval - goes wrong. - -2016-01-05 14:35:11 -0500 Bob Holcomb <bholcomb@mak.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - mpegtsmux: fix reserve bits so they are 1's - The MPEG standard (ISO-13880-1) says the reserve bits need to be set - to one (2.1.64). This is causing transport streams to fail validation - on some systems. - https://bugzilla.gnome.org/show_bug.cgi?id=760127 - -2016-01-08 17:11:09 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstpyramidsegment.h: - opencv: remove check for OpenCV version - After commit 64080e632, configure checks for all the header files that - should be available in OpenCV 2.3 and later. If any of these files isn't - there the OpenCV elements won't be part of the build. - No need to recheck for opencv2/legacy/legacy.hpp again in - gstpyramidsegment.h. Minimum supported OpenCV version must have this header - and configure already checks for it. Removing check. - -2016-01-08 15:01:47 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstcvsmooth.cpp: - opencv: always do cvsmooth in place - After the update to new OpenCV API the transform function using an out - buffer is not necessary. We can always do the transformation in place. - -2016-01-08 12:39:29 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstpyramidsegment.cpp: - * ext/opencv/gstpyramidsegment.h: - opencv: do pyramidsegment's transformation in place - Run the transform function of pyramidsegment in place, reusing the image - data as both source and destination in cvPyrSegmentation. This avoids - copying the image back and forth and the extra memory. - -2016-01-07 15:21:40 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/hls_demux.c: - tests: hlsdemux: add test for updating segment stop - Add a test for seeking that only updates stop position and verifies - that start is unmodified - -2016-01-07 15:21:22 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix seeking that just updates stop position - Fixed adaptivedemux seeking without flushing that just wants - to update stop position. This required protecting the segment - variables with a new mutex so that the seeking thread and the - download threads could safely manipulate the segment and - events related to it. - This contention is only locked/unlocked when starting a new - download, when the first fragment of a segment is received and - when seeking so, hopefully, it won't damage performance. - -2016-01-06 16:51:08 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix segment update on seeks - Fixes typo on reverse rate check and also only update the - position when the start/stop was actually changed. - -2016-01-07 18:10:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxftypes.c: - mxftypes: Don't store pointers in stack allocated guints - This works usually in this place, unless the compiler optimizes things in - interesting ways in which case it causes stack corruption and crashes later. - The compiler in question here is clang with -O1, which seems to pack the stack - a bit more and causes writing to the guint as pointer to overwrite map.memory, - which then later crashes during unmapping of the memory. - -2016-01-07 18:02:33 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmetadata.c: - mxfmetadata: Initialize boolean to FALSE to fix valgrind warning - Seems to be a false warning though. - -2016-01-07 14:08:39 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - glsyncmeta: only flush with a shared context - The wait code will flush for us for single context pipelines. - -2016-01-07 14:02:52 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * tests/check/libs/gstglcontext.c: - glcontext: implement checking whether a context has been shared - Some operations are unnecessary when running with only a single GL - context. - e.g. glFlush when setting a fence object as the flush happens on wait. - API: gst_gl_context_is_shared - -2016-01-06 14:54:30 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: put boolean values into gboolean variables - And remove superfluous assignments. - -2016-01-06 16:54:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/player/gstplayer.c: - player: Only set the pipeline to PLAYING in play() if buffering>=100% - Otherwise the application can break the buffering logic by setting the - pipeline to PLAYING before we buffered enough. - -2016-01-05 17:41:23 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/dash_demux.c: - tests: dashdemux: add tests for post-seek segment boundaries check - Checks if the post seek segment is what is expected. - Also makes it easy to add more tests with different seeking flags using the - same functions. - -2016-01-05 10:41:27 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/hls_demux.c: - tests: hlsdemux: add tests for seek with reverse rate and snap flags - Add tests to ensure snap flags work as expected for reverse - rates - -2016-01-05 10:39:11 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: stop reverse playback when we reach the limit - Avoids downloading and pushing a full segment just to get 1 nanosecond - of data. This happens frequently when seeking is done with flags - that adjust to boundaries or when the start is aligned with segment - starts. The later is common when segment durations is a multiple of - a second. - -2016-01-05 09:16:45 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: fix reverse playback seek with snap flags - Properly handle snap flags during reverse seeking. In this case - the before/after are also reversed, so handle those as such. - For example: with a sequence of 1s fragments: - |-- 0 --|-- 1 --|-- 2 --|-- 3 --| - If you seek to 1.5s it is inside fragment 1. With reverse and - snap-before: should play from the end of fragment 1 - snap-after: should play from the end of fragment 0 - -2016-01-05 09:01:10 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: correctly track segment.position in reverse playback - For reverse, set position to segment.stop when starting and also - don't set the position to fragment end timestamp when it finishes, - just leave it at the fragment start. - -2016-01-05 08:59:26 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: simplify snap flags checking - Replace: - if (boolean) var = true; - with: - var = (boolean); - -2015-12-28 02:18:06 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: respect keyunit flag for position - Set the segment start position when keyunit flag is active - -2015-12-24 18:49:39 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/hls_demux.c: - tests: hls_demux: add tests for seeking segment - Tests that check that the segment sent after a seek is correct. - Allows testing that multiple seeking flags work as expected - -2015-12-24 09:27:33 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/adaptive_demux_common.h: - * tests/check/elements/adaptive_demux_engine.c: - * tests/check/elements/adaptive_demux_engine.h: - tests: adaptive_demux: add function to be able to check demuxer events - Allows writing tests that verify that events are correct. - Useful to monitor and check segments after seeks, for example. - -2015-12-23 15:25:29 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/adaptive_demux_common.h: - * tests/check/elements/dash_demux.c: - * tests/check/elements/hls_demux.c: - tests: adaptive: update to allow more flexible seeking tests - Allows defining a seek event to be able to change seeking parameters - and create more seeking test scenarios - -2015-12-23 15:23:27 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/Makefile.am: - tests: hlsdemux: fix makefile variable typo - -2016-01-06 16:50:00 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - applemedia: avfvideosrc: enable renegotiation - We can actually renegotiate now, so remove old check which disabled it. - -2016-01-06 16:25:38 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglcolorconvertelement.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - glcolorconvert: implement usage of a buffer pool - Saves unnecessary glGenTextures and glDeleteTextures which may have a - non-trivial cost. - -2016-01-06 15:50:07 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.c: - glbasememory: fix copying GstGLAllocationParams - Fixes a GST_IS_GL_CONTEXT critical - -2016-01-06 15:44:52 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemorypbo.c: - glmemorypbo: remove unused code - https://bugzilla.gnome.org/show_bug.cgi?id=759679 - -2016-01-06 13:20:17 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - applemedia: avfvideosrc: small negotiation fix - Fix negotiation when GLMemory is requested but a context is not available - -2016-01-06 11:40:38 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtenc.c: - applemedia: vtenc: accept UYVY on Mac - When doing GLMemory avfvideosrc negotiates UYVY. This change allows avfvideosrc - ! tee name=t ! ... ! glimagesink t. ! ... ! gldownload ! vtenc_h264 ! ... - to do GLMemory and 0-copy with the encoder (with the CV meta). - -2016-01-06 11:29:15 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - applemedia: avfvideosrc: change texture format from BGRA to NV12 on iOS - Change texture format from BGRA to NV12. This allows a pipeline like avfvideosrc - ! tee name=t ! ... ! glimagesink t. ! ... ! gldownload ! vtenc_h264 ! ... to - negotiate GLMemory. This makes the glimagesink branch much faster (obviously) - and triggers the 0-copy path between avfvideosrc and vtenc (using the CV meta). - Combined this results in a huge perf improvement on iOS (25-30% of CPU time in a - pipeline like the one above). - Note that this doesn't introduce a new shader conversion in the sink, since BGRA - textures had to be copied/converted from format=BGRA,texture-target=RECTANGLE to - format=RGBA,texture-target=2D anyway. - -2016-01-04 20:26:09 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - glupload: always add texture-target field to GL caps - 1. Various elements/base classes only perform a subset check on accept-caps - 2. Some GL elements have texture-target in their pad template - 3. When checking subsets, only the caps to check are allowed to contain extra - fields. If the 'template' caps have extra fields, the subset fails. - Thus without texture-target on the caps, various accept-caps implementations - were failing. - Also, add some convenience functions for setting and retrieving - texture targets to/from GValue. - https://bugzilla.gnome.org/show_bug.cgi?id=759860 - -2015-12-29 18:16:04 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: passthrough composition caps features - Don't unconditionally add it to any and all caps transformations. - https://bugzilla.gnome.org/show_bug.cgi?id=759860 - -2016-01-04 09:52:47 +0200 Sebastian Dröge <sebastian@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - * tests/check/libs/player.c: - * win32/common/libgstplayer.def: - player: Remove gst_player_new() and make gst_player_new_full() the normal constructor - In very few cases the simple version was actually needed and having the - parameters hidden by a _full() version caused application that actually needed - it to not use it. - -2016-01-04 01:03:08 +1100 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglviewconvert.c: - * gst-libs/gst/gl/gstglviewconvert.h: - glviewconvert: Fix stereoscopic handling w/ texture-target - The addition of texture-target negotiation broke stereoscopic - handling when not in passthrough mode, so fix that. - -2015-10-07 18:53:43 +0900 Hyunjun Ko <zzoon.ko@samsung.com> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: replace duplicated codes to call new base sdp apis - https://bugzilla.gnome.org/show_bug.cgi?id=745880 - -2015-12-30 18:00:47 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/rtmp/README: - rtmp: refer to both elements in the README - -2015-12-29 14:35:14 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: check for failed RTMP context alloc - Avoids an unlikely crash. - Arguably, if allocation fails we have no chance of - recovering but nonetheless, RTMP_Alloc can fail and - librtmp's RTMP_init() (called next) assumes a non-NULL - pointer is passed without checking. - Additionally, unify exit path on error. - -2015-12-29 14:16:58 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/rtmp/gstrtmpsink.c: - rtmpsink: check for failed RTMP context alloc - Avoids an unlikely crash. - Arguably, if allocation fails we have no chance of - recovering but nonetheless, RTMP_Alloc can fail and - librtmp's RTMP_init() (called next) assumes a non-NULL - pointer is passed without checking. - Additionally, unify exit path on error. - -2015-12-29 11:58:31 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/rtmp/gstrtmp.c: - rtmp: correct librtmp log-level mappings - Additionally, move to a switch in _set_debug_level() - to make easier to follow and compare with the - mappings in _log_callback() - -2015-12-30 13:16:40 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gstvp9parser.c: - codecparsers: vp9: minor clean-up - Remove setting of parser variable to NULL after free, - that makes no sense (and coverity is no doubt going - to complain about it). - -2015-12-30 13:12:13 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gstvp9parser.c: - * gst-libs/gst/codecparsers/gstvp9parser.h: - codecparsers: vp9: fix macro namespacing and rename GstVp9InterpFilter - -2015-12-30 13:08:30 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gstvp9parser.c: - * gst-libs/gst/codecparsers/gstvp9parser.h: - codecparsers: vp9: fix doc typos and sprinkle some Since markers - -2015-12-30 11:03:04 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/vp9utils.AUTHORS: - * gst-libs/gst/codecparsers/vp9utils.LICENSE: - * gst-libs/gst/codecparsers/vp9utils.PATENTS: - * gst-libs/gst/codecparsers/vp9utils.c: - * gst-libs/gst/codecparsers/vp9utils.h: - codecparsers: vp9: move license blurb into header and remove aux files - This is just a bunch of lookup tables.. - -2015-12-30 11:54:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * win32/common/libgstcodecparsers.def: - win32: Update libgstcodecparsers.def with the new symbols - -2015-12-30 11:54:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/codecparsers/dboolhuff.h: - codecparsers: Add another G_GNUC_INTERNAL - -2015-12-30 11:40:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/codecparsers/dboolhuff.h: - * gst-libs/gst/codecparsers/nalutils.h: - * gst-libs/gst/codecparsers/parserutils.h: - * gst-libs/gst/codecparsers/vp8utils.h: - * gst-libs/gst/codecparsers/vp9utils.h: - codecparsers: Spread some G_GNUC_INTERNAL in various places - -2015-12-30 11:38:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/codecparsers/vp9utils.c: - vp9parser: Fix indentation to make gst-indent happier - -2015-12-30 11:36:45 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/gstvp9parser.c: - * gst-libs/gst/codecparsers/vp9utils.c: - * gst-libs/gst/codecparsers/vp9utils.h: - vp9parser: Rename symbols to prevent symbol conflicts - Also make clamp() a static function for the same reason and use CLAMP (as - defined by GLib) in the GStreamer code. - -2015-12-30 11:19:33 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/gstvp9parser.c: - * gst-libs/gst/codecparsers/gstvp9parser.h: - * gst-libs/gst/codecparsers/vp9utils.AUTHORS: - * gst-libs/gst/codecparsers/vp9utils.LICENSE: - * gst-libs/gst/codecparsers/vp9utils.PATENTS: - * gst-libs/gst/codecparsers/vp9utils.c: - * gst-libs/gst/codecparsers/vp9utils.h: - codecparsers: Add VP9 codec parser - https://bugzilla.gnome.org/show_bug.cgi?id=757597 - -2015-12-30 12:12:17 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemorypbo.c: - glmemorypbo: fix wrapping data on GL 2.1 - GL 2.1 only supports pbo upload. - The wrapped data pointer was only being set on the pbo memory and on the - glmemory so when a download was requested (in GL 2.1), glmemory was - allocating a new data pointer and thus not returning the wrapped data. - -2015-12-30 12:11:09 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemorypbo.c: - glmemorypbo: only create a pbo memory if the context actually supports it - e.g. GL <= 2.0 does not support pbo usage and GL 2.1 only supports pbo upload. - -2015-12-30 12:09:29 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemorypbo.c: - glmemory: small code reformat - makes the alloc_params selections fit on a single line. - -2015-12-30 12:06:17 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglmemory.c: - tests/glmemory: output data pointer values on failure - Allows quicker inspection of what failed. - -2015-12-29 17:04:57 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgleffects.c: - gleffects: fix shader compilation with legacy opengl - All the gleffects shaders can be run against a gles2 or a legacy opengl glsl - compiler but weren't being advertised as such. - Fixes gleffects under desktop opengl < 3.2. - -2015-12-29 18:01:30 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.c: - glbasememory: Remove bogus NULL check - CID 1346534 - -2015-12-29 10:57:36 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - applemedia: avfvideosrc: output at highest fps/resolution by default - Fixate to the highest possible resolution and fps. Otherwise by default we end - up fixating at 2fps and the lowest supported resolution, which is hardly what - someone who bought an overpriced smartphone wants. - -2015-12-28 15:53:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/glprototypes/sync.h: - gl: Add \0 terminators for the Apple sync extension - Otherwise GL initialization might check for extensions forever and never finishes. - -2015-12-28 14:41:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: Add some debug output when the GL thread is actually running - -2015-12-22 11:23:19 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstdashdemux.c: - dashdemux: removed unnecessary space trimming in gst_dash_demux_parse_http_head - sscanf has removed all spaces when it has constructed zone string. There is - no need to search for leading spaces. - https://bugzilla.gnome.org/show_bug.cgi?id=759743 - -2015-12-21 14:50:15 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstdashdemux.c: - dashdemux: accept 2 or 4 digit year when using HTTP HEAD for calculating clock compensation - Convert year from 2 digits to 4 digits in gst_dash_demux_parse_http_head - https://bugzilla.gnome.org/show_bug.cgi?id=759743 - Also updated references to Rfc822 to Rfc5322 - -2015-12-27 11:37:09 +0100 Florent Thiéry <florent.thiery@ubicast.eu> - - * ext/gl/gstglfiltershader.c: - glshader: fix usage doc - The property location has been changed in favor of vertex/fragment - string properties; the doc had not been updated and was still referring - to the previous property; also, now the #version header has become mandatory - https://bugzilla.gnome.org/show_bug.cgi?id=759902 - -2015-12-26 22:34:29 +0100 Florent Thiéry <florent.thiery@ubicast.eu> - - * ext/gl/gstglimagesink.c: - glimagesink: Post unhandled navigation events on the bus - Based off xvimagesink implementation - https://bugzilla.gnome.org/show_bug.cgi?id=759869 - -2015-12-27 22:32:22 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/opencv/gstmotioncells.cpp: - motioncells: fix splitting of RGB color string - No need to attempt splitting the RGB string in 255 tokens - if we only expect 3. - Left max_tokens at 4 to preserve the current logic (which - allows for extra stuff at the end) and added a warning on - parsing failure instead of silently discarding the value. - -2015-12-27 21:23:37 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/opencv/gstmotioncells.cpp: - motioncells: fix typo in header - -2015-12-27 21:19:19 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/opencv/gstmotioncells.cpp: - motioncells: fix misleading warning message - calculate_motion != FALSE means the motion computation - logic is disabled, not a mapping error. - -2015-12-27 21:11:18 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/opencv/gstmotioncells.cpp: - motioncells: rework property descriptions - -2015-12-27 01:11:42 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/opencv/gstmotioncells.cpp: - motioncells: use NULL instead of g_strdup(NULL) - -2015-12-28 09:04:12 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - glbufferpool: Fix build error - When GST_GL_HAVE_PLATFORM_EGL is not defined, then info variable - will not be used and this results in build error - https://bugzilla.gnome.org/show_bug.cgi?id=759913 - -2015-12-24 15:28:26 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -=== release 1.7.1 === - -2015-12-24 14:28:42 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-hls.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.7.1 - -2015-12-24 14:00:54 +0100 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2015-12-24 12:23:00 +0100 Sebastian Dröge <sebastian@centricular.com> - - * po/cs.po: - * po/da.po: - * po/de.po: - * po/hu.po: - * po/ky.po: - * po/nb.po: - * po/nl.po: - * po/pl.po: - * po/ru.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - po: Update translations - -2015-12-23 23:13:21 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/curlftpsink.c: - * tests/check/elements/curlhttpsink.c: - * tests/check/elements/curlsmtpsink.c: - * tests/check/elements/pcapparse.c: - * tests/check/elements/rtponviftimestamp.c: - tests: fix indentation - -2015-12-23 23:10:50 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/pcapparse.c: - tests: pcapparse: add check for 0-sized packets - https://bugzilla.gnome.org/show_bug.cgi?id=756573 - -2015-12-23 20:24:46 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: don't crash on 0-sized packets - https://bugzilla.gnome.org/show_bug.cgi?id=756573 - -2015-12-23 13:06:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * common: - Update common - -2015-12-23 13:04:23 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-player-uninstalled.pc.in: - * pkgconfig/gstreamer-player.pc.in: - player: Add pkg-config files - -2015-12-23 12:16:54 +0100 Sebastian Dröge <sebastian@centricular.com> - - * autogen.sh: - autogen.sh: Enable player tests by default - This will be automatically be updated together with the next common update - again. - -2015-12-23 09:55:26 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * tests/check/Makefile.am: - * tests/check/libs/player.c: - player: Add unit test that is disabled by default - The unit test is downloading a few small media files from the Internet, - which are then used during the test. "make clean" removes the files again. - -2015-12-22 14:44:28 +0100 Sebastian Dröge <sebastian@centricular.com> - - * docs/libs/Makefile.am: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - player: Integrate into the documentation build system - -2015-12-22 14:24:00 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/player/Makefile.am: - * gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.c: - * gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.h: - * gst-libs/gst/player/gstplayer-media-info-private.h: - * gst-libs/gst/player/gstplayer-media-info.c: - * gst-libs/gst/player/gstplayer-media-info.h: - * gst-libs/gst/player/gstplayer-signal-dispatcher-private.h: - * gst-libs/gst/player/gstplayer-signal-dispatcher.c: - * gst-libs/gst/player/gstplayer-signal-dispatcher.h: - * gst-libs/gst/player/gstplayer-types.h: - * gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c: - * gst-libs/gst/player/gstplayer-video-overlay-video-renderer.h: - * gst-libs/gst/player/gstplayer-video-renderer-private.h: - * gst-libs/gst/player/gstplayer-video-renderer.c: - * gst-libs/gst/player/gstplayer-video-renderer.h: - * gst-libs/gst/player/gstplayer-visualization.c: - * gst-libs/gst/player/gstplayer-visualization.h: - * gst-libs/gst/player/gstplayer.c: - * gst-libs/gst/player/gstplayer.h: - * gst-libs/gst/player/player.h: - * win32/common/libgstplayer.def: - player: Import GstPlayer playback convenience API - Based on https://github.com/sdroege/gst-player - commit 9ce6ae0dbb8eeeefaf794cfae80e279a03cc598d - -2015-12-23 09:50:13 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglmemorypbo.c: - glmemorypbo: Comment out unused functions to fix compilation with clang - It's not clear if these are intentionally unused or the code should be - changed, but this fixes compilation for the time being at least. - See https://bugzilla.gnome.org/show_bug.cgi?id=759679 - -2015-11-10 16:25:53 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * tests/check/elements/hlsdemux_m3u8.c: - hlsdemux: tests: check URL joining if media URL contains a '/' character - If the query parameter (for example - http://example.net/1054559_1500k.mp4/master.m3u8?acl=/*1054559_1500k.mp4), - check that m3u8.c correctly converts the relative URLs of the media - playlists in to absolute URLs. It must not use the last '/' it finds in - the URL, as according to RFC3986 the '/' character is allowed in - the query part of the URL. - https://bugzilla.gnome.org/show_bug.cgi?id=758384 - -2015-11-10 16:23:59 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * ext/hls/m3u8.c: - * tests/check/elements/hlsdemux_m3u8.c: - hlsdemux: unquote all the quoted-string attributes - The URI attribute from the EXT-X-KEY tag and the URI attribute from the - EXT-X-I-FRAMES-ONLY tag are both quoted-string attibutes that have their - quotation marks removed during parsing. The CODECS attribute of the - EXT-X-STREAM-INF is also a quoted-string attribute, but this attribute - was not being un-quoted. - This commit changes the parser to always unquote all quoted-string - attributes and adjusts the unit tests to this new bevahiour for the - CODECS attribute. - An additional test is added to check that parsing of all of the fields - in the EXT-X-STREAM tag is correct, including those that contain comma - characters. - https://bugzilla.gnome.org/show_bug.cgi?id=758384 - -2015-11-10 16:41:02 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/hls_demux.c: - hlsdemux: tests: add unit tests for hlsdemux - Using the new GstAdaptiveDemux test framework, add tests that - exercise hlsdemux. The following tests are added: - simpleTest - A simple playlist that contains some media URLs - testMediaPlaylist - A master playlist with a variant playlist that contains media URLs - testMediaPlaylistNotFound - A master playlist that points to a missing variant playlist - testFragmentNotFound - A master playlist with a variant playlist that contains media URLs - There is a missing media file referenced from the variant playlist. - testFragmentDownloadError - A master playlist with a variant playlist that contains media URLs - During the download of one media file, the test simulates the network - connection being dropped. - testSeek - A simple test of trying to perform a seek on an HLS stream. - -2015-11-10 13:13:35 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * tests/check/Makefile.am: - * tests/check/elements/adaptive_demux_common.c: - * tests/check/elements/adaptive_demux_common.h: - * tests/check/elements/adaptive_demux_engine.c: - * tests/check/elements/adaptive_demux_engine.h: - * tests/check/elements/dash_demux.c: - * tests/check/elements/fake_http_src.c: - * tests/check/elements/fake_http_src.h: - * tests/check/elements/test_http_src.c: - * tests/check/elements/test_http_src.h: - dashdemux: tests: Refactor into adaptive_engine components - To allow code from dash_demux.c to be used by other elements - that are based upon GstAdaptiveDemux, the code has been - refactored into four new files: - adaptive_demux_engine.ch - adaptive_demux_common.ch - The code in adaptive_demux_engine.c provides a generic - test engine for elements based upon GstAdaptiveDemux. - The code in adaptive_demux_common.c provides a set - of utility functions that are common between the tests - for hlsdemux and dashdemux. - As part of the refactoring, variables in structures were - renamed from using camelCase to underscore_case to match other - GStreamer source code. - The fake_http_src was renamed test_http_src and changed to use - callbacks to provide input data and error conditions. Rather than - using an array of input data that tries to encode all the - possible use cases for the GstTestHTTPSrc element, use a struct of - callbacks. - Users of this element are obliged to implement at least the src_start - callback, which provides a way to link from a URI to the settings - for that URI. - -2015-12-22 11:10:31 +0200 Matthew Marsh <matt@stonethree.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: fix high CPU use on initialization of multiple encoders at the same time - We need a static lock to protect various NVENC methods in _set_format(). Without - this the CPU use increases dramatically on initialisation of the element when - there are multiple elements being initialised at the same time. - https://bugzilla.gnome.org/show_bug.cgi?id=759742 - -2015-12-22 10:15:39 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: make sure every bad update_playlist return sets an error - Otherwise it segfaults when reporting the error in the bus - -2015-12-21 13:57:04 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/teletextdec/gstteletextdec.c: - teletextdec: Use NULL instead of g_strdup('\0') - Which is equivalent to g_strdup(NULL). - https://bugzilla.gnome.org/show_bug.cgi?id=759728 - -2015-12-21 12:33:25 +0100 Sebastian Dröge <sebastian@centricular.com> - - * common: - * configure.ac: - configure: Use -Bsymbolic-functions if available - While this is more useful for libraries, some of our plugins with multiple - files and some internal API can also benefit from this. - -2015-12-21 12:19:11 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/libs/gstglcolorconvert.c: - glcolorconvert: Fix name of testsuite - -2015-12-21 12:13:15 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: Signal context creation from inside the context loop and use g_thread_join() instead of a custom condition variable - Also protect against spurious condition variable wakeups during context - creation. - -2015-12-21 11:27:09 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - glwindow: Hide navigation specific internal API and add API to asynchronously send navigation events - Exposing the navigation thread's main context, GSourceFuncs and structs called - key_event and mouse_event is exposing a bit too much of the internals. Let's - just go with two functions to asynchronously send navigation events on the - window with the same API as the synchronous ones. - -2015-12-21 10:46:52 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - glwindow: Use g_thread_join() instead of a custom condition variable for waiting for the navigation thread to finish - Also hide some internal functions and fields while we're at it and fix - a race condition with the startup condition variable. - -2015-11-30 09:36:09 +0800 Haihua Hu <b55597@freescale.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: Fix memory leak of navigation thread - When stopping the navigation thread, call g_thread_join() to release - the resources hold by it. - https://bugzilla.gnome.org/show_bug.cgi?id=758820 - -2015-12-19 21:25:49 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/assrender/gstassrender.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - assrender, dvbsuboverlay: fix example pipelines in docs - -2015-12-19 21:10:56 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: reflow update_playlist a bit - Reduce indentation by erroring out directly on failure. - -2015-12-19 20:59:12 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: fix potential error leak - Clear error as soon as we determine that the download failed, - otherwise there are code paths where we might return without - clearing it ever, which would leak the GError then. Also, we - can pass a NULL GError pointer to _fetch_uri(), so just do that - instead of passing one that we're going to just free again - right away anyway. - -2015-12-19 12:05:59 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstpyramidsegment.cpp: - opencv: remove unneeded sink_event function in pyramidsegment - -2015-12-19 12:04:01 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gsttextoverlay.cpp: - opencv: remove unneeded sink_event function in textoverlay - -2015-12-18 18:51:49 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/opencv/gsttemplatematch.cpp: - templatematch: remove useless function - -2015-12-18 11:56:17 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: always set timestamp on reverse playback - Downstream needs to be able to restore the timestamps after a discont - to do reverse playback - https://bugzilla.gnome.org/show_bug.cgi?id=759592 - -2015-12-18 15:36:40 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glconvert: Fix compilation of GRAY16_LE/BE shader - -2015-11-13 17:24:30 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Add dmabuf upload method. - This upload method detect and optimize uploads of DMABuf memory. This is - done by creating and caching EGLImages wrapper around DMABuf. The - EGLImages are then binded to a texture which get converter using - standard shader. - Example pipeline: - GST_GL_PLATFORM=egl \ - gst-launch-1.0 v4l2src device=/dev/video1 io-mode=4 ! \ - video/x-raw,format=NV12 ! glimagesink - https://bugzilla.gnome.org/show_bug.cgi?id=743345 - -2015-12-18 15:52:46 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/egl/gsteglimagememory.c: - eglimagememory: Also import BGR16, ABGR, xBGR, AYUV, GRAY16_LE/BE and Y444 - https://bugzilla.gnome.org/show_bug.cgi?id=743345 - -2015-12-18 11:08:29 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/egl/gsteglimagememory.c: - eglimagememory: Add RGB/BGR DMABuf importation support - https://bugzilla.gnome.org/show_bug.cgi?id=743345 - -2015-11-13 17:40:08 +0100 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * gst-libs/gst/gl/egl/gsteglimagememory.c: - * gst-libs/gst/gl/egl/gsteglimagememory.h: - eglimagememory: Methods to create GstGLMemory from dmabufs - Maps GstVideoFormats to suitable DRM fourccs which work with - glcolorconvert, using gst_gl_memory_alloc(). We require mostly - only 4 formats to be supported by the driver. We require DRM - equivalent to RGB16, RGBA, R8 and RG88. This way it's compatible with - DesktopGL, since GL_TEXTURE_2D is used and limit driver requirements. - With this we can virtually support all formats the glcolorconvert - supports. - https://bugzilla.gnome.org/show_bug.cgi?id=743345 - -2015-10-02 13:31:39 +0200 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * configure.ac: - * gst-libs/gst/gl/Makefile.am: - build: Add dmabuf build condition. - configure.ac: Build dmabuf when EGL and drm_fourcc.h is available. - gl: Link gst-allocators. - https://bugzilla.gnome.org/show_bug.cgi?id=743345 - -2015-11-13 17:09:13 +0100 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - glimagesink: Show error when video frame is not mapped. - Adds more meaningful error than - "Failed to convert multiview video buffer", which is always used - when prepare_next_buffer() fails in gst_glimage_sink_prepare(). - https://bugzilla.gnome.org/show_bug.cgi?id=743345 - -2015-11-13 17:05:11 +0100 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - gstglcontext_egl: Expose gst_gl_context_egl_get_error_string. - https://bugzilla.gnome.org/show_bug.cgi?id=743345 - -2015-12-18 16:56:04 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gsttextoverlay.cpp: - * ext/opencv/gsttextoverlay.h: - opencv: update opencvtextoverlay to GstOpencvVideoFilter - Update opencvtextoverlay to inherit from GstOpencvVideoFilter instead of - from GstElement. This means less code and more uniformity with other OpenCV - elements. The chain/transform function is now a third of the size than - before. - -2015-12-18 16:18:52 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gsttemplatematch.cpp: - * ext/opencv/gsttemplatematch.h: - opencv: update templatematch to GstOpencvVideoFilter - Update pyramidsegment to inherit from GstOpencvVideoFilter instead of from - GstElement. This means less code and more uniformity with other OpenCV - elements. - -2015-12-18 15:48:16 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstpyramidsegment.cpp: - * ext/opencv/gstpyramidsegment.h: - opencv: update pyramidsegment to GstOpencvVideoFilter - Update pyramidsegment to inherit from GstOpencvVideoFilter instead of from - GstElement. This means less code and more uniformity with other OpenCV - elements. - -2015-12-17 17:26:29 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Made "auto" mode work according to caps - When the mode of decklinkvideosink is set to "auto", the sink claims to - support the full set of caps that it can support for all modes. Then, every - time new caps are set, the sink will automatically find the correct mode for - these caps and set it. - Caveat: We have no way to know whether a specific mode will actually work for - your hardware. Therefore, if you try sending 4K video to a 1080 screen, it - will silently fail, we have no way to know that in advance. Manually setting - that mode at least gave the user a way to double-check what they are doing. - https://bugzilla.gnome.org/show_bug.cgi?id=759600 - -2015-12-18 12:28:23 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstmotioncells.cpp: - * ext/opencv/gstmotioncells.h: - opencv: update motioncells to GstOpencvVideoFilter - Update motioncells to inherit from GstOpencvVideoFilter instead of from - GstElement. This means less code and more uniformity with other OpenCV - elements. - -2015-12-18 12:26:16 +0100 Thomas Roos <thomas.roos@industronic.de> - - * sys/directsound/gstdirectsoundsrc.c: - * sys/directsound/gstdirectsoundsrc.h: - directsoundsrc: add device property as it is done in directsoundsink - This allows selection of the device by GUID instead of the name. The name is - user-given and multiple devices can have the same name. - https://bugzilla.gnome.org/show_bug.cgi?id=759484 - -2015-12-18 12:36:26 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/directsound/gstdirectsoundsrc.h: - directsoundsrc: Convert header from (some) DOS line endings to UNIX - A mix between different line endings in the same file is not a good idea, - and the .c files are both with UNIX line endings so let's use that. - -2015-12-18 10:30:25 +0000 Julien Isorce <j.isorce@samsung.com> - - * sys/applemedia/Makefile.am: - applemedia: set -mmacosx-version-min to 10.8 - Otherwise qtkitvideosrc fails to build on OSX 10.10.4 - because QTKit has been deprecated since OS X 10.9. - Also set -mmacosx-version-min=10.8 in front to allow - the user or cerbero to override the version. - https://bugzilla.gnome.org/show_bug.cgi?id=745564 - -2015-12-18 13:17:34 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * ext/gl/gstgloverlay.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * sys/applemedia/videotexturecache.m: - glmemory: add gst_gl_memory_allocator_get_default - Add gst_gl_memory_allocator_get_default to get the default allocator based on - the opengl version. Allows us to stop hardcoding the PBO allocator which isn't - supported on gles2. - Fixes GL upload on iOS9 among other things. - -2015-12-18 11:49:25 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: don't deadlock on resize - Performing any GL function marshalling off the GL thread with glimagesink's - render lock is prone to deadlocks between the GL thread and the non-GL thread. - What can happen is this: - 1. non-GL thread attempts to function marshal to the GL thread. - 2. while 1 is happening, the winsys gives an event (say resize) - 3. This calls back into glimagesink which taks the render lock. - 4. As the GL function marshalling is attempting to run on the GL - and already has glimagesink's render lock locked. This deadlocks - as the threads are waiting for each other. - -2015-12-17 18:16:44 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstedgedetect.cpp: - * ext/opencv/gstedgedetect.h: - opencv: update edgedetect to GstOpencvVideoFilter - Update edgedetect to inherit from GstOpencvVideoFilter instead of from - GstElement. This means less code and more uniformity with other OpenCV - elements. - -2015-12-17 15:56:57 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: Don't crash when decoding returns NULL data for any component - https://bugzilla.gnome.org/show_bug.cgi?id=758943 - -2015-12-15 14:14:36 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbasememory.h: - glbasememory: don't unconditionally add the alignment bytes to the size - e.g when wrapping a data pointer we don't want to map/unmap off the end of - pointer with the alignment bytes. - Instead track that information separately as maxsize is used for mapping by - GstMemory and thus represents a size without any alignment padding bytes. - -2015-12-17 10:51:31 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstcvsmooth.h: - opencv: add blur and bilateral support in cvsmooth - Adding the support for the two other OpenCV linear filters to smooth - images. The new API does support spatial sigma in the bilateral filter, - hence bringing that property back. - Adding reference to new documentation. - -2015-12-17 08:51:48 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/pnm/gstpnmenc.c: - pnmenc: Fix wrong logic leading to memory mishandling - While encoding the frame in ASCII mode, per component four bytes are needed - and after every 20 bytes, a \n will be added. So the calculation should be - size = size * (4 + 1 / 20). This should exclude the header being written. - Since header is also being included in the calculations, memory mishandlings - are happening. - https://bugzilla.gnome.org/show_bug.cgi?id=759520 - -2015-12-17 15:50:40 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbuffer.c: - glbuffer: add a name to the allocator - -2015-12-17 15:23:13 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbasememory.h: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstglupload.c: - * sys/applemedia/iosurfacememory.c: - * sys/applemedia/videotexturecache.m: - * tests/check/libs/gstglcolorconvert.c: - gl*memory*: reverse the parameter order of user_data and destroy notify - The convention is to have the destroy notify last after any user data - -2015-12-17 15:07:33 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/videotexturecache.m: - applemedia: fix build on iOS - Fix build after 779dc3132c8f6dd560cb07cc2e2c3c72aeaa7845 - -2015-12-17 14:49:13 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - applemedia: avfvideosrc: do fixate - -2015-12-16 18:41:06 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgloverlay.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/gl/gstglmemorypbo.h: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * sys/applemedia/videotexturecache.m: - * tests/check/libs/gstglcolorconvert.c: - * tests/check/libs/gstglmemory.c: - * tests/check/libs/gstglupload.c: - glmemorypbo: remove our own alloc()/wrapped()/etc functions - replaced by equivalent functionality within gst_gl_base_memory_alloc() - -2015-12-16 18:39:32 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: document gst_gl_memory_init - -2015-12-16 18:38:19 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglmemorypbo.c: - glbuffer: remove unneeded gst_gl_buffer_alloc() - Replaced by gst_gl_base_memory_alloc() - -2015-12-16 18:37:11 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.c: - glbasememory: document some functions - -2015-12-16 18:36:13 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: add a default copy implementation - Subclasses still need to override this to copy into the correct memory type. - -2015-12-16 18:32:40 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - glbufferpool: use gst_gl_base_memory_alloc as a generic GL allocation framework - Requires the usage of GstGLVideoAllocationParams however any user can set their - own parameters along with an allocator which will be used to allocate the - correct memory type. - -2015-12-16 18:30:59 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/gl/gstglmemorypbo.h: - glmemorypbo: implement GstGLBaseMemory:alloc - Uses the GstGLVideoAllocationParams parameters - -2015-12-16 18:23:31 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - glbuffer: implements GstGLBaseMemory::alloc - Create GstGLBufferAllocationParams which is subclass of GstGLAllocationParams - -2015-12-16 18:20:17 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * sys/androidmedia/gstamcvideodec.c: - glmemory: implement GstGLBaseMemory::alloc - - Create GstGLVideoAllocationParams which is a GstGLAllocationParams subclass. - - Make it possible to allocate glmemory objects directly if no frills are - needed. - -2015-12-16 18:13:21 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbasememory.h: - glbasememory: add a generic interface for allocating GL memories - This is made possible by a subclassable GstGLAllocationParams that holds - the allocation parameters - Every allocation would now go through gst_gl_base_memory_alloc with the - allocation parameters now being specified in a single struct to allow - extension by different allocators. - -2015-12-17 12:30:05 +1100 Matthew Waters <matthew@centricular.com> - - * common: - revert common submodule change - 8ae003326157438c12c45589e050c5f446723f61 contained a erroneous common change - -2015-12-17 11:06:34 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbuffer.c: - Revert "glbuffer: Don't pass allocation params" - This reverts commit 052f41e5c293ec17c038467ed1e7b92b04d494b0. - This is incorrect and will affect any other glbuffer user that needs/wants to - perform data alignment. - -2015-12-16 19:21:24 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstcvsmooth.cpp: - opencv: add medianBlur support in cvsmooth - With the deprecation of cvSmooth we have to handle the other smoothing - functions manually. - -2015-12-16 18:37:37 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstcvsmooth.h: - opencv: switch deprecated cvSmooth for GaussianBlur - The OpenCV cvSmooth function is deprecated 0 and the documentation - recommends to use GaussianBlur (). This makes the spatial property go - unused. Marking it as deprecated, making it non-functional and will remove - in the next cycle. - 0 http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html - -2015-12-16 11:56:08 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglbuffer.c: - glbuffer: Don't pass allocation params - The imported memory has already been allocated, passing allocation - parameters with alignment confuses the memory which endup with a - size different from maxsize and lead to overrun when the memory - is being copied. - -2015-12-16 13:59:18 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: improve validation of UTCtiming element - gst_mpdparser_parse_utctiming_node does not validate the parsed values completely. The following scenarios are incorrectly accepted: - - elements with no schemeIdUri property should be rejected - - elements with unrecognized UTCTiming scheme should be rejected - - elements with empty values should be rejected - The last one triggers a division by 0 in gst_dash_demux_poll_clock_drift: - clock_drift->selected_url = clock_drift->selected_url % g_strv_length (urls); - because it urls is a valid pointer to an empty array. - https://bugzilla.gnome.org/show_bug.cgi?id=759547 - -2015-12-16 10:41:47 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstdashdemux.c: - dashdemux: clock_cond is not used and should be removed - There are no threads waiting on clock_cond. It is just initialised and - signalled. It should be removed. - https://bugzilla.gnome.org/show_bug.cgi?id=759537 - -2015-12-16 10:23:23 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstdashdemux.c: - adaptivedemux: fixed clock compensation in get_fragment_waiting_time - Clock compensation is calculated in usec but is added to a GstClockTime value. - https://bugzilla.gnome.org/show_bug.cgi?id=759534 - -2015-12-16 10:21:59 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/Makefile.am: - applemedia: Link to IOSurface.framework for the IOSurface API - -2015-12-15 17:10:00 +0000 Dave Craig <davecraig@unbalancedaudio.com> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstpngparse.c: - * gst/videoparsers/gstvc1parse.c: - videoparsers: Check for NULL return value of gst_pad_get_current_caps() - https://bugzilla.gnome.org/show_bug.cgi?id=759503 - -2015-12-16 14:32:20 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/ivtc/gstivtc.c: - ivtc: Fix value memory leak - gvalue variable should be unset instead of reset. - https://bugzilla.gnome.org/show_bug.cgi?id=759525 - -2015-12-16 14:29:20 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/ivtc/gstcombdetect.c: - combdetect: Fix value memory leak - gvalue variable should be unset instead of reset. - https://bugzilla.gnome.org/show_bug.cgi?id=759523 - -2015-12-16 13:08:22 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/pnm/gstpnmdec.c: - pnmdec: Fix scanner memory leak - For corrupted files, scanner memory is being leaked. - https://bugzilla.gnome.org/show_bug.cgi?id=759522 - -2015-12-16 13:06:45 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/pnm/gstpnmdec.c: - pnmdec: Fix buffer memory leak - In case of corrupted file, s->buf allocated is not being freed - https://bugzilla.gnome.org/show_bug.cgi?id=759522 - -2015-12-16 09:05:42 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/pnm/gstpnmenc.c: - pnmenc: Fix string memory leak - header being allocated is not freed resulting in leak - https://bugzilla.gnome.org/show_bug.cgi?id=759520 - -2015-12-16 08:52:12 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/gdp/gstgdppay.c: - gdppay: Fix buffer memory leak - outbuffer being allocated is not being pushed to queue for EOS event and hence - should be freed. - https://bugzilla.gnome.org/show_bug.cgi?id=759519 - -2015-12-16 09:39:03 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/Makefile.am: - applemedia: Link to IOKit.framework for IOSurface related functions - -2015-12-16 09:33:12 +0100 Sebastian Dröge <sebastian@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - docs: update to git - -2015-12-16 08:25:19 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/yadif/vf_yadif.c: - yadif: Fix illegal memory access - When applying the spatial prediction, there is an illegal access of -1 index of array. - Hence adding a condition to avoid this. - https://bugzilla.gnome.org/show_bug.cgi?id=759518 - -2015-12-16 08:22:00 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/yadif/gstyadif.c: - yadif: Fix gvalue memory leak - gvalue variable should be unset instead of reset. - https://bugzilla.gnome.org/show_bug.cgi?id=759518 - -2015-12-16 17:02:27 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: fix texture-target on iOS - -2015-12-16 15:20:30 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: remove obsolete FIXME - -2015-12-16 14:38:44 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - applemedia: avfvideosrc: rework GLMemory negotiation - Only do GLMemory when a GstGLContext is available AND GLMemory is actually - negotiated with downstream. - -2015-12-16 13:47:00 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - applemedia: avfvideosrc: update after IOSurface changes - Prefer GLMemory over sysmem. Also now when pushing GLMemory we push the - original formats (UYVY in OSX, BGRA in iOS) and leave it to downstream to - convert. - -2015-12-14 16:10:01 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/videotexturecache.h: - * sys/applemedia/videotexturecache.m: - * sys/applemedia/vtdec.c: - applemedia: vtdec: remove the internal GstGLColorConvert - It was added back in the day to make texture sharing work by default with - glimagesink inside playbin. These days glimagesink accepts (and converts) YUV - internally so it's no longer needed. - -2015-12-14 14:23:20 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: decouple outputting textures from outputting RGBA - We're going to be able to output NV12 textures soon. - -2015-12-11 13:20:05 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * common: - * sys/applemedia/Makefile.am: - * sys/applemedia/iosurfacememory.c: - * sys/applemedia/iosurfacememory.h: - * sys/applemedia/videotexturecache.h: - * sys/applemedia/videotexturecache.m: - * sys/applemedia/vtdec.c: - applemedia: vtdec: switch to IOSurface on Mac - Switch to using IOSurface instead of CVOpenGLTextureCache on OSX. The latter can't be - used anymore to do YUV => RGB with opengl3 on El Capitan as GL_YCBCR_422_APPLE - has been removed from the opengl3 driver. Also switch to NV12 from UYVY, which - was the only YUV format supported by CVOpenGLTextureCache. - -2015-12-10 16:22:08 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/videotexturecache.h: - * sys/applemedia/videotexturecache.m: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - applemedia: rename GstCoreVideoTextureCache to GstVideoTextureCache - First of a few commits to stop using CVOpenGLTextureCache on OSX and use - IOSurfaces directly instead. CVOpenGLTextureCache hasn't been updated for OpenGL - 3 which is why texture sharing is currently disabled on OSX. - -2015-11-17 19:31:53 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - Revert "vtdec: disable the texture cache on OSX" - This reverts commit f02425c4afcd85260a1b387aeddf863774257917. - -2015-12-15 14:17:16 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: fix allocator name after GLMemory API changes - -2015-12-15 19:28:05 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/qt/Makefile.am: - qtsink: Add configured GL cflags to the build - We don't directly link to GL in the element, though we use GL headers. - For this reason we need to include the proper GL headers path. This - prevent this element from using a different GL header then libgstgl. - -2015-12-15 19:25:16 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - * gst-libs/gst/gl/gstglapi.h: - gl: Allow using non-system mesa with both GL and GLES - GCC automatically disable redundance warnings for system headers. As - soon as we start using a non-system installed mesa, we would start - having issues. The test for both wasn't setting any flags, so it would - work but then fail at runtime. - This is being fixed by disabling in the code (where needed only) that - GCC warning. The test is also fixed to avoid the false positive we had. - -2015-12-15 15:59:30 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstpyramidsegment.cpp: - opencv: pyramidsegment: fix example launch line - Use videotestsrc and autovideosink in the example gst-launch-1.0 line and - not a useless fakesrc-fakesink example. - -2015-12-15 15:56:19 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstcvdilate.cpp: - * ext/opencv/gstcvequalizehist.cpp: - * ext/opencv/gstcverode.cpp: - * ext/opencv/gstcvlaplace.cpp: - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstcvsobel.cpp: - opencv: add headers with example launch lines - Add description headers for all the OpenCV plugins missing them, so we can - have gst-launch-1.0 example launch lines for all of them. - -2015-12-14 16:48:45 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - opengl: Use pkg-config if available - libMesa ships .pc files now for gl/egl/glesv2. This patch makes use - of it while keeping support for system without. - https://bugzilla.gnome.org/show_bug.cgi?id=751068 - -2015-12-15 11:59:00 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/geometrictransform/gstbulge.c: - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstdiffuse.c: - * gst/geometrictransform/gstfisheye.c: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstmarble.c: - * gst/geometrictransform/gstmirror.c: - * gst/geometrictransform/gstperspective.c: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstrotate.c: - * gst/geometrictransform/gstsphere.c: - * gst/geometrictransform/gstsquare.c: - * gst/geometrictransform/gststretch.c: - * gst/geometrictransform/gsttunnel.c: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gstwaterripple.c: - geometrictransform: add headers with example launch lines - Add description headers for all geometrictransform elements so we can have - gst-launch-1.0 example launch lines for all of them. - -2015-12-14 11:09:46 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * README: - * ext/assrender/gstassrender.c: - * ext/chromaprint/gstchromaprint.c: - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlfilesink.c: - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlhttpsink.c: - * ext/curl/gstcurlsftpsink.c: - * ext/curl/gstcurlsmtpsink.c: - * ext/daala/gstdaaladec.c: - * ext/daala/gstdaalaenc.c: - * ext/directfb/dfbvideosink.c: - * ext/dts/gstdtsdec.c: - * ext/faac/gstfaac.c: - * ext/faad/gstfaad.c: - * ext/gl/gstglbumper.c: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstglfilterreflectedscreen.c: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstglstereosplit.c: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstgltransformation.c: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkatetiger.c: - * ext/ladspa/gstladspa.c: - * ext/libvisual/visual-gl.c: - * ext/mpg123/gstmpg123audiodec.c: - * ext/mplex/gstmplex.cc: - * ext/openal/gstopenalsink.c: - * ext/openal/gstopenalsrc.c: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusparse.c: - * ext/resindvd/resin-play: - * ext/resindvd/resin-play2: - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgoverlay.c: - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsrc.c: - * ext/sndio/sndiosink.c: - * ext/sndio/sndiosrc.c: - * ext/teletextdec/gstteletextdec.c: - * ext/wayland/gstwaylandsink.c: - * ext/zbar/gstzbar.c: - * gst/aiff/aiffparse.c: - * gst/asfmux/gstasfmux.c: - * gst/audiofxbad/gstaudiochannelmix.c: - * gst/audiomixer/gstaudiomixer.c: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstwavescope.c: - * gst/autoconvert/gstautovideoconvert.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/coloreffects/gstchromahold.c: - * gst/coloreffects/gstcoloreffects.c: - * gst/dataurisrc/gstdataurisrc.c: - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/gstchopmydata.c: - * gst/debugutils/gstdebugspy.c: - * gst/debugutils/gstwatchdog.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/festival/gstfestival.c: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/freeverb/gstfreeverb.c: - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstsolarize.c: - * gst/gdp/README: - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - * gst/id3tag/gstid3mux.c: - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosrc.c: - * gst/interlace/gstinterlace.c: - * gst/ivtc/gstcombdetect.c: - * gst/ivtc/gstivtc.c: - * gst/jp2kdecimator/gstjp2kdecimator.c: - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmux.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - * gst/rawparse/README: - * gst/removesilence/gstremovesilence.c: - * gst/sdp/gstsdpdemux.c: - * gst/speed/gstspeed.c: - * gst/stereo/gststereo.c: - * gst/videofilters/gstscenechange.c: - * gst/videofilters/gstvideodiff.c: - * gst/videofilters/gstzebrastripe.c: - * gst/videoparsers/gstdiracparse.c: - * gst/videosignal/gstsimplevideomark.c: - * gst/videosignal/gstsimplevideomarkdetect.c: - * gst/videosignal/gstvideoanalyse.c: - * gst/y4m/gsty4mdec.c: - * gst/yadif/gstyadif.c: - * sys/applemedia/atdec.c: - * sys/applemedia/avfassetsrc.m: - * sys/applemedia/iosassetsrc.m: - * sys/applemedia/vtdec.c: - * sys/directsound/gstdirectsoundsrc.c: - * sys/dvb/README: - * sys/dvb/gstdvbsrc.c: - * sys/opensles/openslessink.c: - * sys/opensles/openslessrc.c: - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsrc.c: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.c: - * sys/winks/gstksvideosrc.c: - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.c: - * tools/gst-element-maker: - plugins-bad: Fix example pipelines - rename gst-launch --> gst-launch-1.0 - replace old elements with new elements(ffmpegcolorspace -> videoconvert, ffenc_** -> avenc_**) - fix caps in examples - https://bugzilla.gnome.org/show_bug.cgi?id=759432 - -2015-12-14 15:01:09 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * .gitignore: - ignore: videoframe-audiolevel test - -2015-12-14 14:44:31 -0500 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/insertbin/gstinsertbin.h: - bad: Add g_autoptr() support to all types - https://bugzilla.gnome.org/show_bug.cgi?id=754464 - -2015-12-14 12:31:52 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst-libs/gst/gl/gstglviewconvert.c: - glviewconvert: check pointer before dereferencing - priv->primary_out could be NULL, check before dereferencing it in - GST_BUFFER_FLAG_SET () - CID 1308945 - -2015-12-14 13:43:10 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - - * gst/videoframe_audiolevel/gstvideoframe-audiolevel.c: - videoframe-audiolevel: Fix possible division by zero - In update_rms_from_buffer(), division by "frames" wasn't checking whether - "frames" is zero. - CID 1341519. - https://bugzilla.gnome.org/show_bug.cgi?id=759443 - -2015-12-14 09:38:41 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/examples/gl/clutter/cluttershare.c: - clutter: Fix compilation error in GL examples - Include gst/gl.h instead of specific headers to prevent such problems also in - the future. - In file included from ../../../../gst-libs/gst/gl/gl.h:47:0, - from ../../../../gst-libs/gst/gl/gstglbasememory.h:137, - from ../../../../gst-libs/gst/gl/gstglmemory.h:29, - from cluttershare.c:39: - ../../../../gst-libs/gst/gl/gstglmemorypbo.h:51:20: error: field ‘mem’ has incomplete type - GstGLMemory mem; - ^ - ../../../../gst-libs/gst/gl/gstglmemorypbo.h:124:24: error: field ‘parent’ has incomplete type - GstGLMemoryAllocator parent; - ^ - ../../../../gst-libs/gst/gl/gstglmemorypbo.h:134:29: error: field ‘parent_class’ has incomplete type - GstGLMemoryAllocatorClass parent_class; - ^ - -2015-12-14 19:18:14 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/corevideotexturecache.m: - applemedia: update for GLMemory API changes - -2015-12-14 19:15:14 +1100 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: update for GLMemory API changes - -2015-12-14 18:41:30 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglcolorconvert.c: - * tests/check/libs/gstglupload.c: - tests: update for glmemory api changes - -2015-12-14 18:20:23 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbuffer.c: - glbuffer: bind/unbind on map/unmap for GL mappings - Bind the handle to the GL target on map/unmap to save the caller from - handling this themselves. - -2015-12-14 18:19:37 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - glbuffer: remove buffer specific transfer flags - Instead rely on GstGLBaseMemory's transfer handling - -2015-12-14 18:18:20 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemorypbo.c: - glmemorypbo: map/unmap pbo memory correctly for state tracking - Otherwise some downloads will fail to occur from the PBO. - -2015-12-14 18:15:42 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglmemory.c: - tests/glmemory: include the generic gl header - Including gstglmemory.h directly results in the compiler complaining - about incomplete types. - -2015-12-14 17:05:31 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglformat.c: - glformat: add compatibility definitions for OES/rectangle textures - -2015-12-14 13:49:18 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglbasebuffer.c: - * gst-libs/gst/gl/gstglbasebuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - glbasebuffer: remove unsed memory subclass - The functionality has been split into GstGLBaseMemory and GstGLBuffer. - -2015-12-14 13:43:59 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs.types: - * ext/gl/gstgldownloadelement.c: - * ext/gl/gstgloverlay.c: - * ext/qt/gstqsgtexture.cc: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglformat.c: - * gst-libs/gst/gl/gstglformat.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmemorypbo.c: - * gst-libs/gst/gl/gstglmemorypbo.h: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * tests/check/libs/gstglmemory.c: - glmemory: base classify and add the pbo memory on top - The base class is useful for having multiple backing memory types other - than the default. e.g. IOSurface, EGLImage, dmabuf? - The PBO transfer logic is now inside GstGLMemoryPBO which uses GstGLBuffer - to manage the PBO memory. - This also moves the format utility functions into their own file. - -2015-12-14 13:08:10 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs.types: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - gl: add a GL buffer based GstMemory - Heavily based on GstGLBaseBuffer that is a subclass of GstGLBaseMemory. - Provides GPU and CPU accessible GL buffer objects by GL handle or by - sysmem data pointer. - -2015-12-14 12:59:02 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglbasememory.c: - * gst-libs/gst/gl/gstglbasememory.h: - gl: add a base memory object - It handles the following - - GstAllocationParams -> gst_memory_init transformation - - Makes sure that map/unmap/create/destroy happen on the GL thread with - a GL context current. - - Holds a possible sysmem accessible data pointer with alignment. - - Holds the need upload/download transfer state - -2015-12-14 12:26:01 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - gl: add convenience function for the start of a video frame - Get's the start of the video frame based on a GstVideoInfo and - GstVideoAlignment. - -2015-12-11 16:07:36 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - * gst-libs/gst/gl/gstgluploadmeta.c: - * gst-libs/gst/gl/gstgluploadmeta.h: - * tests/check/libs/gstglupload.c: - gluploadmeta; remove convenience helper API - It was not really useful as if one knows about libgstgl, one can just use - GLMemory objects directly. - -2015-12-11 15:39:57 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * ext/gl/gstglstereomix.h: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - gldownload: remove helper api from the library - It was never used by anyone and is not needed anymore with the element - and GstGLMemory's transparent support for downloading textures. - -2015-12-12 20:07:32 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstcvdilate.cpp: - * ext/opencv/gstcvdilateerode.cpp: - * ext/opencv/gstcvdilateerode.h: - * ext/opencv/gstcvequalizehist.cpp: - * ext/opencv/gstcvequalizehist.h: - * ext/opencv/gstcverode.cpp: - * ext/opencv/gstcvlaplace.cpp: - * ext/opencv/gstcvlaplace.h: - * ext/opencv/gstcvsmooth.cpp: - * ext/opencv/gstcvsmooth.h: - * ext/opencv/gstcvsobel.cpp: - * ext/opencv/gstcvsobel.h: - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstdisparity.h: - * ext/opencv/gstedgedetect.cpp: - * ext/opencv/gstedgedetect.h: - * ext/opencv/gstfaceblur.cpp: - * ext/opencv/gstfaceblur.h: - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gstgrabcut.cpp: - * ext/opencv/gsthanddetect.cpp: - * ext/opencv/gsthanddetect.h: - * ext/opencv/gstmotioncells.cpp: - * ext/opencv/gstmotioncells.h: - * ext/opencv/gstopencvvideofilter.cpp: - * ext/opencv/gstpyramidsegment.cpp: - * ext/opencv/gstpyramidsegment.h: - * ext/opencv/gstretinex.cpp: - * ext/opencv/gstretinex.h: - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstskindetect.cpp: - * ext/opencv/gstskindetect.h: - * ext/opencv/gsttemplatematch.cpp: - * ext/opencv/gsttemplatematch.h: - * ext/opencv/gsttextoverlay.cpp: - * ext/opencv/gsttextoverlay.h: - opencv: clean includes - The opencv element includes were full of duplicates and uneeded headers. - For example a few elements that stopped using gstcvopencvutils still - included that header file. - -2015-12-12 19:31:55 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstopencvutils.cpp: - * ext/opencv/gstopencvutils.h: - opencv: remove unused functions in gstopencvutils - Since commit 45ca8876b2f5267f7edb842b6d56d7a6c271ccb3 nobody is using - gst_opencv_get_ipl_depth_and_channels() or - gst_opencv_parse_iplimage_params_from_structure(). Remove this dead - code. - -2015-12-12 19:13:42 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/MotionCells.cpp: - * ext/opencv/MotionCells.h: - motioncells: Remove unused includes - -2015-12-12 10:06:55 +1100 Matthew Waters <matthew@centricular.com> - - * common: - revert common submodule change - -2015-12-12 09:33:38 +1100 Matthew Waters <matthew@centricular.com> - - * common: - * ext/gl/gstgltransformation.c: - gltransformation: clear to transparent - Otherwise composition will result in a black frame outside the transformed - video. - -2015-12-11 11:39:08 +0100 Thomas Roos <thomas.roos@industronic.de> - - * sys/directsound/gstdirectsoundsrc.c: - directsoundsrc: Check return values of DirectSound functions in read loop - Otherwise we might end up in an infinite loop because of errors. - Also take the element's mutex in unprepare(). - https://bugzilla.gnome.org/show_bug.cgi?id=738292 - -2015-12-10 12:47:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Only pre-set position for exactly the same essence track - The edit rate is only supposed to be the same in a source package, but there - might be multiple source packages with the same essence container. As such - just comparing the body/index SID is not sufficient. - -2015-12-10 12:25:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Only pre-set the track position if it's for the same body/index SID - -2015-12-10 14:41:44 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - libgstgl: gstglcontext_cocoa: kCGLPFAStereo has been deprecated in 10.11 - Also since the version scheme has changed (to include the micro number) since - 10.10, use the MAC_OS_X_VERSION_* macro to avoid confusion. - -2015-12-10 12:41:00 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - glbufferpool: relax check for multiple texture targets - Only complain about multiple texture targets when _different_ texture targets - are configured. - -2015-12-10 12:33:52 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: take subsampling into account for rectangle textures - Rectangle textures don't use normalized coordinates so subsampling needs to be - factored in explicitly. - Fixes YUV => RGB conversion for rectangle textures. - -2015-12-09 16:55:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Only access the index table if it has enough elements - -2015-12-09 16:28:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Use keyframe information from index table segments if available - We don't implement keyframe detection for all codecs and this will allow us to - implement better seeking. - -2015-12-09 16:31:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Collect all index table segments after finding the random index pack - That way we always have the index table information available, especially the - keyframe-ness of all buffers. - -2015-12-08 18:15:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - * gst/mxf/mxftypes.h: - mxfdemux: Fix handling of IndexTableSegments - This was completely broken before and could only work on a very constrained - set of files. After these changes it should work except for situations where - PTS != DTS, which is not handled at all in mxfdemux currently. - https://bugzilla.gnome.org/show_bug.cgi?id=759118 - -2015-12-08 14:06:21 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: avoid pushing events with manifest lock - It can be an easy source of deadlocks. Reproducible with very - fast connections (local server). - -2015-12-08 20:24:45 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxftypes.c: - mxftypes: Fix parsing of index table segments - -2015-12-08 18:23:02 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Handle aggregation with NULL buffers without crashing - -2015-12-08 16:45:33 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Add FIXME about enforcing that all tracks in a source package have the same edit rate - The standard requires this and also the index table segments are not going to - work otherwise. - -2015-12-07 20:27:23 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - * gst/mxf/mxfmux.h: - mxfmux: Write index table segments - But only for the first essence track, and once for every keyframe every 2 - seconds. - -2015-12-07 20:26:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmetadata.c: - mxfmetadata: Fix static local tag for index sid - -2015-12-07 19:34:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxftypes.c: - * gst/mxf/mxftypes.h: - mxftypes: Add function to serialize an index table segment to a buffer - -2015-12-07 18:59:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxftypes.c: - * gst/mxf/mxftypes.h: - mxfmux: Index table segments must not use the primer pack - According to S377-1-2009c 9.2 the local tags must not be resolved from the - primer pack, which as a result means that there can't be any other tags than - statically assigned ones. - -2015-12-07 14:10:30 +1000 Duncan Palmer <dpalmer@digisoft.tv> - - * ext/hls/gsthlsdemux.c: - hlsdemux: add support for seeking to fragment boundaries - Setting the seek flags to GST_SEEK_FLAG_SNAP_* will change the seek - target time to a segment boundary. - Based on original work by Ben Willers <bwillers@digisoft.tv>. - https://bugzilla.gnome.org/show_bug.cgi?id=759108 - -2015-12-08 09:53:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/dash_mpd.c: - dash: Fix unit test after moving of framerates to RepresentationBaseType - -2015-12-08 09:33:39 +0900 suhwang.kim <suhwang.kim@lge.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: Suggestion for setting the framerate information. - Dashdemux has set the width and height information from MPD manifest. - Some embedded devices which are not insufficient H/W resources need more information such as framerate - to assign H/W resources. So I suggested that dashdemux also needs to set the framerate information from MDP manifest. - https://bugzilla.gnome.org/show_bug.cgi?id=758515 - -2015-12-08 09:23:22 +0900 suhwang.kim <suhwang.kim@lge.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: maxFrameRate & minFrameRate should be in RepresentationBase. - According to the spec, they can be in AdaptationSet, Representation and SubRepresentation. - So They should be in RepresentationBase. - https://bugzilla.gnome.org/show_bug.cgi?id=758515 - -2015-12-08 16:35:45 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/glprototypes/sync.h: - glproto: include function definitions for GL_APPLE_sync - Provides a performance improvement on iOS where we were falling back to glFinish - on settting sync points. - -2015-12-07 20:34:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openjpeg/gstopenjpegenc.c: - openjpegenc: All frames in JPEG2000 are keyframes, mark them as such - -2015-12-07 09:08:15 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * autogen.sh: - * common: - Automatic update of common submodule - From b319909 to 86e4663 - -2015-12-07 13:48:12 +0100 Edward Hervey <edward@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Remove more dead code - Coverity CID #1328818 - -2015-12-07 13:36:29 +0100 Edward Hervey <edward@centricular.com> - - * ext/teletextdec/gstteletextdec.c: - teletextdec: Fix leak and NULL pointer usage - Coverity CID #1341744 - -2015-12-07 11:56:09 +0100 Edward Hervey <edward@centricular.com> - - * ext/teletextdec/gstteletextdec.c: - teletextdec: Remove dead code - ++i in a for() loop results in the loop never being executed more than once - Coverity CID #1341748 - Coverity CID #1341743 - -2015-03-12 11:29:00 +0000 Frédéric Wang <fred.wang@free.fr> - - * configure.ac: - * sys/acmenc/acmenc.c: - * sys/acmmp3dec/acmmp3dec.c: - acm: Port ACM MP3 decoder and encoders to GStreamer 1.x - https://bugzilla.gnome.org/show_bug.cgi?id=744047 - -2015-09-24 17:40:02 +0200 Daniel Kamil Kozar <dkk089@gmail.com> - - * configure.ac: - * ext/teletextdec/Makefile.am: - * ext/teletextdec/gstteletextdec.c: - * ext/teletextdec/gstteletextdec.h: - * ext/teletextdec/teletext.c: - port teletextdec to 1.0 - https://bugzilla.gnome.org/show_bug.cgi?id=733819 - -2015-12-02 18:28:15 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - h26xparse: Resend PPS/SPS after seek - This is to support byte-stream decoder that does not remember the - PPS/SPS after a flush. This is not needed by all decoders, but is - harmless for those that do remember. - https://bugzilla.gnome.org/show_bug.cgi?id=758405 - -2015-12-01 18:09:25 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Only offer custom allocator with caps features - To use GLMemory and EGLImage allocators, one need to know the - libgstgl API. This is only expected if the associated caps features - have been negotiated. Generic element that otherwise receive those - allocators may fail, resulting in broken pieline. We don't want to - force all generic element to check if the allocator is a custom - allocator or a normal allocator (which implement the _alloc method). - https://bugzilla.gnome.org/show_bug.cgi?id=758877 - -2015-12-04 18:05:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Don't copy input buffers, just append them to the header - -2015-12-03 11:46:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Resync live playlists to the 3rd newest fragment if we fall off the playlist - As HLS does not provide any way of knowing the server's clock, and we do - buffering of "live" streams, at some point we will fall behind the server in - many cases and would have to advance to a fragment that is not in the playlist - anymore. - Previously we would've just resynced to the next oldest fragment that is still - there, but this causes problems as from this point onwards we would always - fall off the playlist again all the time. - Instead we now resync and move to the 3rd newest fragment like we would do - when starting playback of a live stream. - https://bugzilla.gnome.org/show_bug.cgi?id=758987 - -2015-12-03 18:21:50 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/m3u8.c: - hls: m3u8: remove superfluous gst_m3u8_copy() implementation - No need to implement _copy() when we just copy a list that - we're freeing three lines later anyway. Instead just steal - the new main list. - -2015-12-03 10:08:05 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Log PTS of buffers that are pushed downstream - -2015-10-20 09:49:16 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Expose DVB Subpicture as subpictures - For some reason we were considering them as private data. - -2015-10-20 17:22:23 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Push GAP events *after* deactivating old programs - The order in which program switch must happen is: - 1) drain all data on old pads (but don't push EOS) - 2) add new pads (but don't push any data on them) - 3) Push EOS and remove old pads - 4) Start pushing data on new pads - There was one caveat in this implementation, which is that when - we activate a sparse pad (step 2) we would push a GAP event. The problem - is that, while being an event, it is actually *data*. - We therefore need to make sure pushing those GAP event is done at the step - we start pushing data. - https://bugzilla.gnome.org/show_bug.cgi?id=750402 - -2015-09-15 18:20:38 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Make sure old streams are drained before switching - Before we add any streams, make sure we drain all streams. This ensures - there's consistency that only "new" data will be pushed on buffers once - the new pads are added - https://bugzilla.gnome.org/show_bug.cgi?id=750402 - -2015-09-10 14:55:05 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - mpegtsdemux: Allow deactivation of programs to be delayed - When changing programs, the order of events needs to be the following: - * add pads from new program - * send EOS on old pads - * remove old pads - * emit 'no-more-pads' - Previously tsdemux was not doing that, and was first deactivating and - removing old pads before adding new ones. - We fix this by allowing subclasses of mpegtsbase to be able to handle - themselves the deactivation of programs. In this case tsdemux will - properly deactivate it once it has activated the new program. - https://bugzilla.gnome.org/show_bug.cgi?id=750402 - -2015-12-02 11:01:53 +0100 Maroš Ondrášek <mx3ldev@gmail.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: update current variant if connection speed is set - If connection speed is set, playlist according - to connection speed is selected as current playlist. - Problem is that the current variant of main playlist still - points to previously set variant. - If previously set variant doesn't correspond to current - playlist, then it causes unnecessary change of playlist - to the same playlist after first fragment is downloaded, - because of not updated current variant. - To fix this, we need to make sure that current variant - of main playlist corresponds to the current playlist - https://bugzilla.gnome.org/show_bug.cgi?id=758946 - -2015-12-02 14:35:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoframe_audiolevel/gstvideoframe-audiolevel.c: - videoframe-audiolevel: Fix compilation of static plugin and some compiler warnings - Use G_GSIZE_FORMAT for gsize instead of %ld and make sure that the plugin name - is a valid C identifier, i.e. contains no spaces or dashes. - -2015-12-02 22:42:39 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: improve the YUY2/UYVY->RGBA conversion shader - Don't offset the y-axis. We only need to offset on the x-axis. - Removes a sawtooth pattern on horizontal and vertical edges. - https://bugzilla.gnome.org/show_bug.cgi?id=755486 - -2015-12-02 22:40:06 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: improve RGBA->YUY2/UYVY conversion shader - We should only average the chroma samples not the luma sample. - https://bugzilla.gnome.org/show_bug.cgi?id=758904 - -2015-11-11 03:55:27 +1100 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Tell the base class the fragment duration - adaptivedemux uses the fragment duration as a delay - in some cases, so make sure to set it. - -2015-11-11 03:54:51 +1100 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Send the bitrate of the stream as a tag - If we know or can measure the nominal bitrate of a stream, - send that info as a tag downstream - -2015-11-08 01:34:30 +1100 Jan Schmidt <jan@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: When switching bitrate variants, don't jump back - Don't jump backward to 3 files from the end of the playlist - when switching variants - it just means we downloaded - fragments fast and caught up to the end of the playlist. - Disable that by treating a variant switch as a playlist - update, not a restart due to a seek or so. - -2015-04-21 21:09:19 +0300 Vivia Nikolaidou <vivia@toolsonair.com> - - * configure.ac: - * gst/videoframe_audiolevel/Makefile.am: - * gst/videoframe_audiolevel/gstvideoframe-audiolevel.c: - * gst/videoframe_audiolevel/gstvideoframe-audiolevel.h: - * tests/check/Makefile.am: - * tests/check/elements/videoframe-audiolevel.c: - alevel: New audio/video level element - The videoframe-audiolevel element acts like a synchronized audio/video "level" - element. For each video frame, it posts a level-style message containing the - RMS value of the corresponding audio frames. This element needs both video and - audio to pass through it. Furthermore, it needs a queue after its video - source. - https://bugzilla.gnome.org/show_bug.cgi?id=748259 - -2015-12-01 23:20:45 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/insertbin/Makefile.am: - Drop usage of deprecated g-ir-scanner --strip-prefix flag - -2015-11-10 16:19:34 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * ext/hls/m3u8.c: - * tests/check/elements/hlsdemux_m3u8.c: - hlsdemux: correct the calculation of seek range of non-live streams - The seek range calculation for on-demand streams was incorrectly - excluding the last three segments of the stream. This three segment - rule should only be applied to live streams 1. - 1 https://tools.ietf.org/html/draft-pantos-http-live-streaming-17#section-6.3.3 - https://bugzilla.gnome.org/show_bug.cgi?id=758386 - -2015-12-01 17:52:03 +0000 Paolo Pettinato <ppettina@cisco.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: Forward FLUSH_STOP events downstream too - https://bugzilla.gnome.org/show_bug.cgi?id=758913 - -2015-11-29 01:02:15 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gsthlsdemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - hlsdemux: fix crash when decryption key can't be downloaded - Happened with - http://sslhls.m6tv.cdn.sfr.net/hls-live/livepkgr/_definst_/m6_hls_aes/m6_hls_aes_856.m3u8 - if glib-networking was not installed (since key has https uri). - -2015-11-30 11:05:38 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hls: m3u8: remove pointless client_has_main() function - We always have a main list. - -2015-11-28 00:12:04 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hls: m3u8: remove unused _get_current_fragment_duration() function - -2015-11-27 19:21:22 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hls: m3u8: remove unused m3u8 client update_failed_count field - -2015-11-15 17:31:05 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hls: m3u8: remove helper var that's only used during parsing from structure - Just keep that local to the parsing function. - -2015-11-01 13:21:45 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - * docs/plugins/inspect/plugin-hls.xml: - * ext/hls/Makefile.am: - * ext/hls/gstfragmented.h: - * ext/hls/gsthls.h: - * ext/hls/gsthlsdemux.h: - * ext/hls/gsthlsplugin.c: - * ext/hls/gstm3u8playlist.c: - * ext/hls/m3u8.c: - * gst-plugins-bad.spec.in: - * tests/check/elements/hlsdemux_m3u8.c: - hls: rename plugin from fragmented to hls - -2015-12-01 19:44:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Always give timestamps if we're discont and don't mark stream discont if a playlist change was not successful - If the stream is discont, we must provide a timestamp in any case. Elements - like tsdemux are not going to output anything if we give a NONE timestamp - after a discont. - Also marking a stream as discont if a playlist change was not successful would - lead to the above situation, but in that case we are not required at all to - mark the stream discont as we're still at the old playlist. - -2015-12-01 17:06:33 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - tsmux: fix wrong log message level - ERROR level is debugging left-over. - -2015-11-09 16:08:30 +0900 Hyunjun Ko <zzoon.ko@samsung.com> - - * tests/check/libs/aggregator.c: - tests:aggregator: fix tc failure and correct check value - Failure by this commit 2dfa548f3645844082c3db65d96d87255701b3ad, which is - to append hooks instead of prepend. - Because of this change, aggretated_cb is not called and leads to failure. - And correct to check flush stop value instead of flush start value - https://bugzilla.gnome.org/show_bug.cgi?id=757801 - -2015-11-30 19:53:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Don't try to recreate swapchain while the window is minimized - It will fail and cause the sink to crash. Instead wait until the window is - visible again before checking if the swapchain really has to be recreated. - https://bugzilla.gnome.org/show_bug.cgi?id=741608 - -2015-11-27 18:46:56 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opus/gstopusparse.c: - opusparse: remove unneeded statement - commit da5c41930c4083979b1745f4d8848d97fe03d8eb removed the two uses of the - new value of data: - channels = opus_packet_get_nb_channels (data); - bandwidth = opus_packet_get_bandwidth (data); - Since then, data isn't being used between incrementing it by packet_offset - and going out of scope. Removing this uneeded statement. - -2015-11-27 12:44:57 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/id3mux.c: - tests: id3mux: add unit test for GST_TAG_PRIVATE_DATA writing - https://bugzilla.gnome.org/show_bug.cgi?id=758728 - -2015-11-27 11:33:07 +0530 Ravi Kiran K N <ravi.kiran@samsung.com> - - * gst/id3tag/id3tag.c: - id3mux: write private data tag - Handle "PRIV" tag in id3mux. Write owner - identifier and private data and add to the - id3v2 frame. - https://bugzilla.gnome.org/show_bug.cgi?id=758728 - -2015-11-26 10:15:36 +0100 Mathias Hasselmann <mathias.hasselmann@kdab.com> - - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Don't add metadata to locked buffer - The video decoders tried calling gst_buffer_add_*meta() on non-writable - buffer resulting in warnings of this kind: - gstamcvideodec.c:921 (_gl_sync_render_unlocked): WARNING: amcvideodec - Failed to create the transformation meta for the gl_sync 0xabc03848 - buffer 0xabb01b40 (0) - https://bugzilla.gnome.org/show_bug.cgi?id=758694 - -2015-11-09 18:07:30 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_demux.c: - adaptivedemux: tests: disabled testFragmentDownloadError test - Until we will have support to control the generating thread from - fakeHTTPsrc element, the test testFragmentDownloadError is disabled. - https://bugzilla.gnome.org/show_bug.cgi?id=757776 - -2015-11-09 14:14:34 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_demux.c: - adaptivedemux: tests: corrected access to fakeHTTPsrc element - The src element for adaptivedemux is now a bin. Updated the tests to - correctly reach into the bin and get the fakeHTTPsrc element - https://bugzilla.gnome.org/show_bug.cgi?id=757776 - -2015-11-09 14:13:04 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/fake_http_src.c: - adaptivedemux: tests: made fakeHTTPsrc element MT safe - https://bugzilla.gnome.org/show_bug.cgi?id=757776 - -2015-11-23 11:32:13 +0900 Vineeth T M <vineeth.tm@samsung.com> - - * gst/dvdspu/gstspu-pgs.c: - spu-pgs: Fix array memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=758517 - -2015-11-24 00:20:36 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiomixer/gstaudioaggregator.c: - audiomixer: register function name for debugging just once - Not every time aggregate is called... - -2015-11-24 12:42:45 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * tests/check/elements/dash_mpd.c: - mpdparser: remove gst_mpd_client_check_time_position - https://bugzilla.gnome.org/show_bug.cgi?id=758593 - -2015-11-24 11:50:51 +0100 Maroš Ondrášek <mx3ldev@gmail.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: add depth field to audio caps if available - depth field can be retrieved from "BitsPerSample" or - from "WaveFormatEx" structure, if provided in Manifest - https://bugzilla.gnome.org/show_bug.cgi?id=758586 - -2015-11-20 16:35:43 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - mpdparser: tests: added test for fraction of seconds in availabilityStartTime - https://bugzilla.gnome.org/show_bug.cgi?id=758410 - -2015-11-20 16:36:00 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - mpdparser: added support for parsing fraction of seconds in dateTime fields - https://bugzilla.gnome.org/show_bug.cgi?id=758410 - -2015-11-22 13:11:48 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * tests/examples/waylandsink/Makefile.am: - tests: put the waylandsink example window.ui file in EXTRA_DIST - -2015-11-22 13:08:35 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * tests/examples/waylandsink/Makefile.am: - tests: fix linking waylandsink example with the gstwayland library - First, use top_builddir, otherwise it fails in out-of-source builds. - Second, link to the libtool archive directly to let make understand - the dependency. - -2015-11-20 20:59:16 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: always set presentationTimeOffset - Set it for all types of segment lists (templates / lists / base) - and not only for templates. - https://bugzilla.gnome.org/show_bug.cgi?id=751529 - -2015-11-20 17:50:30 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Error out if we get a timeout during live mixing - We can't handle that but need complete streams without gaps. - -2015-11-20 17:46:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmpeg.c: - mxfmpeg: Use the correct sound essence compression UL for MP3 - There's one for MPEG 1 Layer 1 and one for Layer 2 and 3. We previously - had the second for Layer 1 and 2 and nothing for Layer 3, which was wrong. - -2015-11-20 17:34:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmpeg.c: - mxfmpeg: Set the essence container UL byte 13 to 0x10 for h264 - 0x04 signifies a MPEG elementary stream but according to RP2008, 0x10 should - be used for a h264 byte-stream. This also fixes compatibility of our files - with ffmpeg. - -2015-11-20 11:18:43 +1100 Roman Nowicki <rnowicki@sims.pl> - - * ext/qt/qtitem.cc: - qml: reuse existing GstQSGTexture - Fixes a memory leak leaking the texture objects. - https://bugzilla.gnome.org/show_bug.cgi?id=758286 - -2015-11-20 11:08:37 +1100 Matthew Waters <matthew@centricular.com> - - * ext/qt/gstqsgtexture.cc: - qml: activate the wrapped context when binding - Mitigates the following critical - gst_gl_context_thread_add: assertion 'context->priv->active_thread == g_thread_self ()' failed - -2015-11-19 11:55:19 +0100 Roman Nowicki <rnowicki@sims.pl> - - * ext/qt/qtitem.cc: - qml: proper initialization if scene is already initialized - The scene graph can be initialized when the we receive window handle change - notification and so we will not receive a scenegraph initialization - notification. Initialize ourself in this case. - https://bugzilla.gnome.org/show_bug.cgi?id=758337 - -2015-07-29 22:31:30 +0900 Jimmy Ohn <yongjin.ohn@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Add binary search for stream_sidx_seek - Add binary search to optimize in stream_sidx_seek. - https://bugzilla.gnome.org/show_bug.cgi?id=749653 - -2015-11-19 15:59:56 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * tests/check/elements/dash_mpd.c: - mpdparser: remove unused functions gst_mpdparser_get_chunk_by_index and gst_mpdparser_find_segment_by_index - https://bugzilla.gnome.org/show_bug.cgi?id=758233 - -2015-11-19 17:24:53 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/opencv/gstedgedetect.cpp: - * ext/opencv/gstmotioncells.cpp: - * ext/opencv/gsttemplatematch.cpp: - * gst/dataurisrc/gstdataurisrc.c: - * gst/mve/gstmvemux.c: - * gst/pcapparse/gstirtspparse.c: - * gst/pcapparse/gstpcapparse.c: - * tests/check/elements/dataurisrc.c: - docs: update gst-launch-0.10 lines - Update references to gst-launch-0.10 to gst-launch-1.0 - -2015-11-19 10:32:03 +1100 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideodec.h: - amcvideodec: move release_output_buffer into the sync meta - Some devices only ever keep one buffer available in the GL queue resulting in - multiple calls to release_output_buffer only causing one frame to be rendered. - If there is a queue after amcvideodec (even playsink's small one), then - multiple buffers are pushed but only a small fraction of them are actually - rendered on time. The rest will either render some number of frames ahead of - where they are meant to be or timeout waiting for a frame that's already been - rendered. - Solved by moving the release_output_buffer into the sync_meta the is pushed - downstream. When downstream renders, the custom sync implementation attempts - to release the current buffer (if not already released) and render. Once the - frame has been rendered to the screen, the next frame is released and is - hopefully available by the time the next frame is to be rendered. - This fixes a perceived frame jitter in the output. - -2015-11-17 15:23:17 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsrc.c: - * ext/dash/gstmpdparser.c: - * ext/gl/gstglbumper.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstgloverlay.c: - * ext/hls/gsthlsdemux.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkatespu.c: - * ext/kate/gstkateutil.c: - * ext/libmms/gstmms.c: - * ext/neon/gstneonhttpsrc.c: - * ext/opus/gstopusenc.c: - * ext/sndfile/gstsfsink.c: - * ext/sndfile/gstsfsrc.c: - * ext/spc/tag.c: - * ext/timidity/gsttimidity.c: - * ext/wayland/gstwaylandsink.c: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglslstage.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/x11/gstgldisplay_x11.c: - * gst/audiovisualizers/gstwavescope.c: - * gst/dvbsuboverlay/dvb-sub.c: - * gst/librfb/rfbdecoder.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * sys/acmenc/acmenc.c: - * sys/acmmp3dec/acmmp3dec.c: - * sys/applemedia/avfassetsrc.m: - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtputil.c: - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dvb/camswclient.c: - * sys/dvb/dvbbasebin.c: - * sys/dvb/parsechannels.c: - * sys/pvr2d/gstpvrvideosink.c: - * sys/uvch264/gstuvch264_mjpgdemux.c: - * sys/vdpau/gstvdpvideomemory.c: - * tests/examples/gtk/glliveshader.c: - * tests/icles/metadata_editor.c: - Remove unnecessary NULL checks before g_free() - g_free() is NULL-safe - -2015-11-11 16:11:14 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - mpdparser: Also allow '/' in RepresentationID - Used by http://www.bok.net/dash/tears_of_steel/cleartext/stream.mpd - https://bugzilla.gnome.org/show_bug.cgi?id=757903 - -2015-10-26 16:24:40 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * .gitignore: - * configure.ac: - * tests/examples/Makefile.am: - * tests/examples/waylandsink/Makefile.am: - * tests/examples/waylandsink/main.c: - * tests/examples/waylandsink/window.ui: - tests/examples: add a waylandsink example - https://bugzilla.gnome.org/show_bug.cgi?id=748322 - -2015-11-18 12:56:06 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/wlwindow.c: - waylandsink: call gst_video_sink_center_rect with a destination rectangle that starts from (0,0) - The intention of this code is to find the center rectangle relative - to (0,0), since subsurface coordinates are relative to the parent - surface. - The old code used to work but was wrong and broken by - http://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/gst-libs/gst/video/gstvideosink.c?id=ff57f6913456ec1991e55517cf1f239e80eeddef - -2015-11-16 17:25:34 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: fixed illegal memory access in gst_mpd_client_get_last_fragment_timestamp_end - https://bugzilla.gnome.org/show_bug.cgi?id=758188 - -2015-11-16 17:25:21 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - mpdparser: tests: added test for gst_mpd_client_get_last_fragment_timestamp_end - The timestamp for last fragment is incorrectly retrieved if segment templates - are used. - https://bugzilla.gnome.org/show_bug.cgi?id=758188 - -2015-11-17 16:21:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Don't require a non-zero buffer size when doing decoding to a surface - At least on some devices/Android versions the buffer size will always be zero - in these cases. - https://bugzilla.gnome.org/show_bug.cgi?id=758228 - -2015-11-17 17:17:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Remove unused variable - gstglimagesink.c: In function 'gst_glimage_sink_on_draw': - gstglimagesink.c:1959:18: error: unused variable 'sync_meta' -Werror=unused-variable - GstGLSyncMeta *sync_meta = NULL; - ^ - -2015-11-17 17:09:51 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglviewconvert.c: - glviewconvert: String literals are const - gstglviewconvert.c: In function '_mangle_extensions': - gstglviewconvert.c:1511:13: error: assignment discards 'const' qualifier from pointer target type -Werror=discarded-qualifiers - ext_str = "#extension GL_OES_EGL_image_external : require\n"; - ^ - -2015-11-17 17:08:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - glsyncmeta: Actually return the newly created meta from gst_buffer_add_gl_sync_meta() - gstglsyncmeta.c -fPIC -DPIC -o .libs/libgstgl_1.0_la-gstglsyncmeta.o - gstglsyncmeta.c: In function 'gst_buffer_add_gl_sync_meta': - gstglsyncmeta.c:131:1: error: control reaches end of non-void function -Werror=return-type - } - ^ - -2015-11-17 16:21:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Fix indentation - -2015-11-17 16:08:17 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: fix negotiation more - Year 12: I still don't understand how negotiation works. - Apparently gst_pad_query_caps doesn't do what I thought it did. To get the - actual caps that can flow through vtdec:src we must call gst_pad_peer_query_caps - with the template caps as filter. - Fixes negotiation with stuff that doesn't understand GLMemory (hello videoscale). - -2015-11-17 16:14:11 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: minor texture cache fixes - Small fix on how the texture cache is cleaned up / setup in case of renegotiation - -2015-11-17 16:13:00 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/corevideotexturecache.m: - applemedia: corevideotexturecache: stop configuring cache->convert over and over - -2015-11-16 15:46:41 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * sys/androidmedia/gstamcvideodec.c: - glimagesink: wait on the correct sync meta when rendering - -2015-11-03 13:19:41 +1100 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/Makefile.am: - * sys/androidmedia/gstamc2dtexturerenderer.c: - * sys/androidmedia/gstamc2dtexturerenderer.h: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideodec.h: - amcviddec: output external-oes textures - This provides a performance and power usage improvement by removing - the texture copy from an OES texture to 2D texture. - The flow is as follows - 1. Generate the output buffer with the required sync meta with the incrementing - push counter and OES GL memory - 1.1 release_output_buffer (buf, render=true) and push downstream - 2. Downstream waits for on the sync meta (timed wait) or drops the frame (no wait) - 2.1 Timed wait for the frame number to reach the number of frame callbacks fired - 2.2 Unconditionally update the image when the wait completes (success or fail). - Sets the affine transformation matrix meta on the buffer. - 3. Downstream renders as usual. - At *some* point through this the on_frame_callback may or may not fire. If it - does fire, we can finish waiting early and render. Otherwise we have to - wait for a timeout to occur which may cause more buffers to be pused into the - internal GL queue which siginificantly decreases the chances of the - on_frame_callback to fire again. This is because the frame callback only occurs - when the internal GL queue changes state from empty to non-empty. - Because there is no way to reliably correlate between the number of buffers - pushed and the number of frame callbacks received, there are a number of - workarounds in place. - 1. We self-increment the ready counter when it falls behind the push counter - 2. Time based waits as the frame callback may not be fired for a certain frame. - 3. It is assumed that the device can render at speed or performs some QoS of - the interal GL queue (which may not match the GStreamer QoS). - It holds that we call SurfaceTexture::updateTexImage for each buffer pushed - downstream however there's no guarentee that updateTexImage will result in - the exact next frame (it could skip or duplicate) so synchronization is not - guaranteed to be accurate although it seems to be close enough to be unable - to discern visually. This has not changed from before this patch. The current - requirement for synchronization is that updateTexImage is called at the point in - time when the buffers is to be rendered. - https://bugzilla.gnome.org/show_bug.cgi?id=757285 - -2015-11-02 17:57:29 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - * gst-libs/gst/gl/gstglsyncmeta.h: - glsyncmeta: add vfuncs for all operations - there could be other ways/requirements for synchronising two GPU command - streams (whether GL or platform specific). - e.g. glfencesync/eglwaitnative/cond/etc - -2015-11-10 15:37:05 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: add support for rendering external-oes textures - https://bugzilla.gnome.org/show_bug.cgi?id=757285 - -2015-11-10 14:54:02 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglviewconvert.c: - * gst-libs/gst/gl/gstglviewconvert.h: - glviewconvert: add support rectangle/external-oes textures - https://bugzilla.gnome.org/show_bug.cgi?id=757285 - -2015-11-17 15:18:28 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: fix setting internal SKIP / DROP flags - -2015-11-17 09:08:52 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Fix structure memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=758205 - -2015-11-16 21:52:07 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Add support for bufferlists - -2015-11-17 11:21:27 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - applemedia: vtdec: improve negotiation - Rework negotiation implementing GstVideoDecoder::negotiate. Make it possible to - switch texture sharing on and off at runtime. Useful to (eventually) turn - texture sharing on in pipelines where glimagesink is linked only after - decoding has already started (for example OWR). - -2015-11-17 11:19:57 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: improve handing of decode errors/frame drops - Improve decode error handling by avoiding calling into GstVideoDecoder from the - VT decode callback. This removes contention on the GST_VIDEO_DECODER_STREAM_LOCK - which used to make the decode callback slow enough for VT to start dropping lots - of frames once the first frame was dropped. - -2015-11-17 11:22:15 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: fix uninitialized variable warning - -2015-11-14 20:21:17 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - * tests/check/elements/dash_demux.c: - adaptivedemux: remove now-defunct "num-lookback-fragments" property - This no longer does anything, and it was marked as CONSTRUCT_ONLY - which means someone would really have to go out of their way to - be able to set this, which would only be done in very custom - scenarios, if ever, and those will likely target a specific - version of GStreamer then, so probably not much point keeping - it deprecated for a while before removing it. - -2015-11-13 17:14:14 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Always give a valid reply to internal caps queries - Caps queries can always have a valid reply, either the filter or ANY. - If the caps are ANY, then accept-caps always returns TRUE. - -2015-11-12 16:35:12 +0100 Nicolas Huet <nicolas.huet@parrot.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtsdemux: fix section_data leak - If packet->payload_unit_start_indicator is true and pointer 0, there is no - discontinuity check. Therefore there could be a previous section not complete - that need to be cleared. - https://bugzilla.gnome.org/show_bug.cgi?id=758010 - -2015-11-13 10:41:58 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst-libs/gst/gl/gstglsl.c: - glsl: fix possible string overrun in gst_glsl_version_profile_from_string - given a NULL-terminated string, s. - si = '\0'; - i++; - does not guarentee that si is NULL terminated and thus string operations - could read off the end of the array. - https://bugzilla.gnome.org/show_bug.cgi?id=758039 - -2015-11-13 16:50:22 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglshader.c: - glshader: don't read invalid list pointers (use after free) - gst_gl_shader_detach_unlocked already removes the list entry so attempting to - use the element to iterate to the next stage could read invalid data. - Based on patch by Vineeth TM <vineeth.tm@samsung.com> - https://bugzilla.gnome.org/show_bug.cgi?id=758039 - -2015-11-13 10:44:26 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * tests/check/libs/gstglsl.c: - tests:glsl: version_profile_s string leak - https://bugzilla.gnome.org/show_bug.cgi?id=758039 - -2015-11-13 10:56:10 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst-libs/gst/gl/gstglsl.c: - glsl: free str while returning error - https://bugzilla.gnome.org/show_bug.cgi?id=758039 - -2015-11-13 11:04:34 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * tests/check/libs/gstglupload.c: - tests:glupload: fix caps memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=758039 - -2015-11-12 12:21:54 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opus/gstopusenc.c: - opusenc: avoid potential overflow expression - The result of the two expressions will be promoted to guint64 anyway, - perform all the arithmetic in 64 bits to avoid potential overflows. - CID 1338690, CID 1338691 - -2015-11-12 12:00:07 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: remove memory leak - The values of channel_mapping are copied by gst_codec_utils_opus_create_caps () - but it doesn't free or take ownership of the g_new0 allocated memory. This - needs to be freed before going out of scope. - CID 1338692 - -2015-11-12 11:42:36 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: remove unnecessary buffer check - buf surely isn't NULL inside the block conditional to a buffer size bigger - than (G_MAXUINT16 - 3). Plus gst_buffer_unref() checks if the buffer is - NULL and does nothing if it is. - CID 1338693 - -2015-11-12 11:23:31 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opus/gstopusparse.c: - opusparse: initialize sample rate to a default - sample_rate might be used uninitialized if !sink_caps is TRUE. Initialize - it to the default used in gst_codec_utils_opus_parse_caps () when there is - no rate defined in the caps. - CID 1338695 - -2015-11-12 16:36:03 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst-libs/gst/gl/gstglslstage.c: - glslstage: Fix vertex_sources memory leak - vertex_sources is being allocated but not freed resulting in leak - https://bugzilla.gnome.org/show_bug.cgi?id=757974 - -2015-11-12 16:26:00 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: remove unnecessary free - version_str is already being freed. So no need to call again - https://bugzilla.gnome.org/show_bug.cgi?id=757974 - -2015-11-12 16:18:35 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: Fix string leak - String got using gst_glsl_version_profile_to_string, is allocated - memory and should be freed - https://bugzilla.gnome.org/show_bug.cgi?id=757974 - -2015-11-12 16:02:45 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: Fix frag_prog and frag_body memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=757974 - -2015-11-11 16:51:23 +0000 Florin Apostol <florin.apostol@oregan.net> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fixed handling errors emitted by uri handler - https://bugzilla.gnome.org/show_bug.cgi?id=757947 - -2015-11-10 16:32:37 +0100 Nicolas Huet <nicolas.huet@parrot.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: fix pending buffers leak when flushing - https://bugzilla.gnome.org/show_bug.cgi?id=757895 - -2015-06-10 14:18:00 +0200 Etienne Peron <etienne.peron@parrot.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Fix pad leak when the pad is never exposed - If tsdemux never receives data for a stream, the corresponding pad will never - be added and stream->active will remain FALSE. When the stream is removed, the - pad will not be unreffed and will be leaked. - https://bugzilla.gnome.org/show_bug.cgi?id=757873 - -2015-11-09 17:45:29 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/ivfparse/gstivfparse.c: - ivfparse: Fix the wrong width & height parsing of vp9 bitstream - The current implementation for detecting the resolution changes - on key frames is based on vp8 bitstream alignment. Avoid this - width and height parsing for vp9 bitstream, which requires proper - frame header parsing inorder to detect the resolution change (Fixme). - https://bugzilla.gnome.org/show_bug.cgi?id=757825 - -2015-11-11 11:40:52 +0100 Heinrich Fink <hfink@toolsonair.com> - - * sys/applemedia/vtenc.c: - vtenc: Set profile_level to NULL after release - Otherwise, gst_vtenc_negotiate_profile_and_level will double-release as - it checks for profile_level != NULL. This caused crashes when the - vtenc instance is stopped and then restarted. - https://bugzilla.gnome.org/show_bug.cgi?id=757935 - -2015-11-11 23:39:35 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: mangle gl_FragColor for GL3 - Some drivers don't provide the compatibility definition and we need to provide - our own 'out vec4' variable to put the results of the fragment shader into. - https://bugzilla.gnome.org/show_bug.cgi?id=757938 - -2015-11-11 16:06:25 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * tests/check/libs/gstglcolorconvert.c: - tests:glcolorconvert: Fix caps memory leak - Output caps being got from video info is not getting freed - https://bugzilla.gnome.org/show_bug.cgi?id=757929 - -2015-11-10 17:58:58 +1100 Matthew Waters <matthew@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: provide our own definition of log2() - The log2 function/macro doesn't exist when targetting android API < 18 (or MSVC - < 2013) whereas our current baseline is API 9. - -2015-11-10 13:52:30 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * ext/gl/gstglstereomix.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * gst-libs/gst/gl/gstglviewconvert.h: - glviewconvert: remove set_format - We need the caps to be able to - 1. check the caps features - 2. get the requested texture-target on input/output - -2015-11-11 10:31:07 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: fix a memory leak if the view conversion fails - -2015-11-11 13:37:59 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: balance the creation/destruction of the overlay compositor - Fixes some leaks/possible segfault on when failing to create the compositor. - -2015-11-11 12:23:30 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglutils.c: - glshader: properly unref the stages on failure - When failing in the varargs functions, all the stage objects not handled need to - be unreffed to prevent a leak. - -2015-11-11 11:29:35 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglslstage.c: - glslstage: properly return an error when we could not create the shader stage - While it was erroring out correctly later, there were GLib warnings about - setting a GError over the top of another GError. - -2015-11-11 01:05:20 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglshaderstrings.c: - glshaderstrings: fixup the external-oes fragment shader - The wrong sampler type was used - s/sampler2DExternalOES/samplerExternalOES/ - -2015-11-10 23:41:24 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: try to keep the same texture-target if possible - Fixes issues attempting to passthrough external-oes textures - -2015-11-10 22:41:57 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: fix rendering rectangular textures with GL3 - Rectangular textures are unavailable in unextended - GLES2 #version 100 shaders. - Fixes - texture-target=rectangle ! glcolorconvert ! texture-target=2D - There's a couple of differences between GL3 and GLES2/GL - - varying -> in or out depending on the stage (vertex/fragment) - - attribute -> in - - filtered texture access is a single function, texture() - -2015-11-10 20:20:29 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: properly use the other texture-target on fixation - -2015-11-10 20:15:56 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglslstage.c: - glslstage: add debug as to why _set_strings() failed - -2015-11-10 20:13:53 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsl.c: - glsl: fix check for glsl version against GL context inversion - Any GLSL version that was less than the provided GL version would fail - -2015-11-10 10:02:38 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Fix pad memory leak. - The static pads got from queue and uri_handler are not being freed - resulting in memory leaks. - https://bugzilla.gnome.org/show_bug.cgi?id=757859 - -2015-11-10 13:13:50 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_enums.h: - * gst-libs/gst/gl/gstglmemory.h: - gl: forward declare some enums - Specifically the GstGLTextureTarget enum - -2015-11-10 13:11:37 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstglshaderstrings.c: - * gst-libs/gst/gl/gstglshaderstrings.h: - * gst-libs/gst/gl/gstglslstage.c: - glslstage: expose the default shader strings as public - Add some other simple strings for external-oes textures or transforming - the texture coordinates with a transformation matrix - -2015-11-06 03:05:31 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: wait on the sync meta for input buffers - -2015-11-05 00:13:01 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: wait on the provided sync meta provided to glimagesink - -2015-11-08 22:14:01 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.h: - glcolorconvert: use the correct oes target string in the template caps - -2015-11-10 12:32:39 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gstgtkglsink.c: - gtk: add the overlaycomposition feature to the template caps - There is a possibility that the _get_caps impl will be called with the - feature in the filter caps which when interecting with the template, - will return EMPTY and therefore fail negotiation. - https://bugzilla.gnome.org/show_bug.cgi?id=757854 - -2015-11-10 14:21:33 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/corevideotexturecache.m: - applemedia: fix vtdec texture sharing on ios 9.1 - Use gst_gl_sized_gl_format_from_gl_format_type to get the format passed to - CVOpenGLESTextureCacheCreateTextureFromImage. Before this change extracting the - second texture from the pixel buffer was failing on ios 9.1. - -2015-11-06 17:24:52 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/templatematch.c: - templatematch: add a framerate to test caps - The pad template requires a framerate, so use it to prevent - caps negotiation failures. - Fixes the unit test - -2015-11-06 20:38:56 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/.gitignore: - tests: update .gitignore for new test binaries - -2015-11-06 19:26:21 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/assrender/gstassrender.c: - assrender: don't send flush events on seeks - It's for the upstream element driving the pipeline to - handle seeks and send flush events or not, filters - should not interfere here, otherwise downstream pads - could be flushing before upstream pads are flushing, - which can result in GST_FLOW_ERROR being sent instead - of GST_FLOW_FLUSHING when trying to forward sticky - events at just the wrong moment. - -2015-11-06 16:16:32 +0100 Edward Hervey <edward@centricular.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Don't send flush events - It is up to the element handling the seek to send flush events - downstream, otherwise we end up with a situation where upstream - would get unexpected GST_FLOW_FLUSHING - -2015-11-06 19:23:09 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/assrender/gstassrender.c: - * ext/curl/gstcurlftpsink.c: - * ext/dtls/gstdtlsdec.c: - * ext/smoothstreaming/gstmssmanifest.c: - * gst/geometrictransform/gstmirror.c: - * gst/onvif/gstrtponviftimestamp.c: - Fix code indentation - -2015-10-22 13:40:36 +0200 Branko Subasic <branko@axis.com> - - * gst/onvif/gstrtponviftimestamp.c: - * tests/check/elements/rtponviftimestamp.c: - rtponviftimestamp: use stream time for timestamp - The Onvif Streaming Specification specifies that the NTP timestamps - in the Onvif extension header indicaes the absolute UTC time associated - with the access unit. But by using running time we can not achieve that, - since a frame's running time depends on the played interval, whether a - non-flushing is done, etc. Instead we have to use the stream time. - https://bugzilla.gnome.org/show_bug.cgi?id=757688 - -2015-11-06 09:44:57 +0100 Linus Svensson <linussn@axis.com> - - * gst/onvif/gstrtponviftimestamp.c: - * gst/onvif/gstrtponviftimestamp.h: - * tests/check/elements/rtponviftimestamp.c: - rtponviftimestamp: Update ntp-offset and d/e-bits with a GstEvent - It is now possible to update the currently used ntp-offset with a - custom serialized downstream event. The element will read the ntp-offset - property when doing the state transition from READY to PAUSED and - use that offset until it receives a "GstNtpOffset" event, which also - has a "ntp-offset" attribute in that it's structure. In case the - property is not set and no event has been received, the element will - guess the npt-offset with help of the clock. If no clock can be - retrieved, the element will error out and stop the data flow. - The same event is also used for updating the D/E-bits in the RTP - extension header. The discont flag in a buffer can be set whenver a - live/network source looses a frame, but that is not the type of - discontinuity that the onvif extension header should reflect. The - header is mainly used for playback of a track concept, in which - gaps can be present, and it's those kind of gaps that should be - highlighted with the D- and E-bits. - https://bugzilla.gnome.org/show_bug.cgi?id=757688 - -2015-11-06 09:44:16 +0100 Linus Svensson <linussn@axis.com> - - * gst/onvif/gstrtponviftimestamp.c: - * gst/onvif/gstrtponviftimestamp.h: - * tests/check/elements/rtponviftimestamp.c: - rtponviftimestamp: Do not rearange order of data - If a buffer or a buffer list is cached, no events serialized with the - data stream should get through. The cached buffers and events should - be purged when we stop flushing. - https://bugzilla.gnome.org/show_bug.cgi?id=757688 - -2015-10-13 14:21:47 +0200 Branko Subasic <branko@axis.com> - - * tests/check/Makefile.am: - * tests/check/elements/rtponvifparse.c: - * tests/check/elements/rtponviftimestamp.c: - rtponvif: split unit tests in several files - Split the unit tests for rtponviftimestamp and rtponvifparse - elements in separate files. - Setup and cleanup the element and pads in fixures. Make the tests work - with CK_FORK=no as well, by cleaning up the 'buffers' list when needed. - Make unit tests work when run in valgrind by unreffing all buffers, - and by not allocating any payload in RTP buffers. Since we're not - doing anything with the payload part, but we're memcmp-aring the - complete buffer memory, valgrind complained about non-initialized - memory being used. - https://bugzilla.gnome.org/show_bug.cgi?id=757688 - -2015-09-04 09:59:06 +0200 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: improved bitrate estimations - Bitrate estimation is now handled through a queue2 element added after - the source element used to download fragments. - Original hlsdemux patch by Duncan Palmer <dpalmer@digisoft.tv> - https://bugzilla.gnome.org/show_bug.cgi?id=733959 - -2015-11-06 12:59:51 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - dshow: fix GList leak - _remove_link() would not free the actual list nodes. - -2015-11-06 12:31:09 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/gstglshader.c: - * gst/mpegtsdemux/mpegtsparse.c: - glshader, tsdemux: simplify code - Jus use _delete_link() instead of _remove_link() + _free1() - -2015-11-06 12:30:12 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/gstglmixerbin.c: - glmixerbin: fix minor leak - Don't leak removed list node. - -2015-11-06 10:22:42 +0100 Thibault Saunier <tsaunier@gnome.org> - - * ext/faac/gstfaac.c: - faac: Initialize debug category soon enough - Avoiding assertions - -2015-11-05 10:12:41 +0000 Julian Bouzas <julian.bouzas@vcatechnology.com> - - * configure.ac: - configure.ac: Added --with-hls-crypto=auto|nettle|libgcrypt|openssl option to build the source using the desired cryptographic library for HLS - https://bugzilla.gnome.org/show_bug.cgi?id=755319 - -2015-11-06 00:48:42 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/m3u8.c: - hls: m3u8: don't leak GList nodes when matching up variant lists after master list update - -2015-11-05 12:36:48 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: use GST_STIME_FORMAT for GstClockTimeDiff - No need to manually handle negative value of deadline, GST_STIME_FORMAT does - exactly this. - -2015-11-05 12:17:00 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/resindvd/resindvdsrc.c: - resindvd: use GST_STIME_FORMAT for GstClockTimeDiff - No need to use G_GINT64_FORMAT for potentially negative values of - GstClockTimeDiff. Since 1.6 these can be handled with GST_STIME_FORMAT. - Plus it creates more readable values in the logs. - https://bugzilla.gnome.org/show_bug.cgi?id=757480 - -2015-11-05 12:11:19 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusdec.c: - opusdec: Update sink pad templates - We always require the channel-mapping-field. If it's 0 we require nothing - else, otherwise we need channels, stream-count and coupled count to be - available. - -2015-11-03 19:09:33 -0800 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: don't compare templ instance pointers - One can pass the PadTemplate from the element_class or the one from the factory. - While they have the same content, the addresses are different. - -2015-11-04 00:12:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/opus.c: - opus: Remove invalid unit test - Opus headers should never be in-band, so don't test for correct - handling of that. - -2015-11-04 00:12:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusenc.c: - opusenc: Create an empty taglist if there is none - There always have to be 2 buffers in the streamheaders, even if - the comment buffer is basically empty. - -2015-11-03 14:41:57 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Set to running in a single place - Only set to running when the thread is actually started. - -2015-11-03 14:37:26 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Document more locking - -2015-11-03 19:53:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Don't create an incomplete OpusHead but set all the other caps fields instead - OpusHead is optional, the other fields are not. - https://bugzilla.gnome.org/show_bug.cgi?id=757152 - -2015-11-03 19:51:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsmux/Makefile.am: - * gst/mpegtsmux/mpegtsmux.c: - tsmux: Simplify Opus caps parsing by using codecutils helpers - https://bugzilla.gnome.org/show_bug.cgi?id=757152 - -2015-11-03 14:50:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/Makefile.am: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusheader.c: - * ext/opus/gstopusheader.h: - * ext/opus/gstopusparse.c: - * ext/opus/gstopusparse.h: - * ext/opus/gstrtpopusdepay.c: - * ext/opus/gstrtpopuspay.c: - opus: Add proper support for multichannel audio - https://bugzilla.gnome.org/show_bug.cgi?id=757152 - -2015-11-03 11:41:07 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusparse.c: - * ext/opus/gstopusparse.h: - opusparse: Fix up pre-skip in OpusHead if upstream using GstAudioClippingMeta - Makes transmuxing from e.g. MPEG-TS to Ogg sample accurate. - https://bugzilla.gnome.org/show_bug.cgi?id=757153 - -2015-11-02 18:02:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsmux/Makefile.am: - * gst/mpegtsmux/mpegtsmux_opus.c: - tsdemux/mux: Add support for GstAudioClippingMeta for Opus - https://bugzilla.gnome.org/show_bug.cgi?id=757153 - -2015-11-02 17:33:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusdec.c: - opusdec: Handle GstAudioClippingMeta instead of the pre-skip field in the OpusHead - oggdemux is outputting the meta now, and only outputs if it should really - apply to the current buffer. Previously we would skip N samples also if we - started the decoder in the middle of the stream. - https://bugzilla.gnome.org/show_bug.cgi?id=757153 - -2015-11-02 16:52:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusenc.c: - opusenc: Add GstAudioClippingMeta to buffers that need to be clipped - https://bugzilla.gnome.org/show_bug.cgi?id=757153 - -2015-11-02 10:30:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusenc.c: - opusenc: Disable granule position calculations by the base class - It is doing the wrong thing because of the Opus pre-skip: while the timestamps - are shifted by the pre-skip, the granule positions are not shifted. - oggmux is doing the right thing here already. - https://bugzilla.gnome.org/show_bug.cgi?id=757153 - -2015-10-31 15:02:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusenc.c: - opusenc: Add some FIXME comments about calculating padding with LPC - https://bugzilla.gnome.org/show_bug.cgi?id=757153 - -2015-10-30 20:57:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - opusenc: Encode exactly the amount of samples we got as input and put correct timestamps on it - The first frame has lookahead less samples, the last frame might have some - padding or we might have to encode another frame of silence to get all our - input into the encoded data. - This is because of a) the lookahead at the beginning of the encoding, which - shifts all data by that amount of samples and b) the padding needed to fill - the very last frame completely. - Ideally we would use LPC to calculate something better than silence for the - padding to make the encoding as smooth as possible. - With this we get exactly the same amount of samples again in an - opusenc ! opusdec pipeline. - https://bugzilla.gnome.org/show_bug.cgi?id=757153 - -2015-10-30 20:47:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusheader.c: - * ext/opus/gstopusheader.h: - * ext/opus/gstopusparse.c: - opusenc: Put lookahead/pre-skip into the OpusHead header - https://bugzilla.gnome.org/show_bug.cgi?id=757153 - -2015-10-25 17:27:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/Makefile.am: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux_opus.c: - * gst/mpegtsmux/mpegtsmux_opus.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - tsmux: Add support for Opus - https://bugzilla.gnome.org/show_bug.cgi?id=757049 - -2015-10-24 14:27:43 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Add support for Opus - Code partially based on - https://git.videolan.org/?p=ffmpeg.git;a=commit;h=74141f693ded2fbf75af56fff309d2db35183635 - and based on the spec draft at - https://wiki.xiph.org/OpusTS - Makes it possible to demux - http://www.obe.tv/Downloads/opus.ts - https://bugzilla.gnome.org/show_bug.cgi?id=757049 - -2015-10-25 19:31:51 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - tsmux: Don't leak buffer in error cases - https://bugzilla.gnome.org/show_bug.cgi?id=757049 - -2015-10-25 19:29:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - tsmux: Call prepare function for each collected buffer - Not when clipping buffers, as that doesn't happen for every buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=757049 - -2015-10-25 18:09:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - mpegtsdescriptor: Add API for creating extended descriptors and fix writing them - https://bugzilla.gnome.org/show_bug.cgi?id=757049 - -2015-11-02 21:16:15 -0800 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gsthanddetect.cpp: - opencv: cast paramspec flags to fix the build for c++ - All the other elements in this plugin do this already. - -2015-11-03 15:05:20 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: use GST_STIME_ARGS for GstClockTimeDiff - No need to use G_GINT64_FORMAT for potentially negative values of - GstClockTimeDiff. Since 1.6 these can be handled with GST_STIME_ARGS. - Plus it creates more readable values in the logs. - https://bugzilla.gnome.org/show_bug.cgi?id=757480 - -2015-11-03 15:00:01 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: use GST_STIME_ARGS for GstClockTimeDiff - No need to manually handle negative value of deadline, GST_STIME_ARGS does - exactly this. - -2015-11-03 10:42:40 +0000 Hyunil Park <hyunil46.park@samsung.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Add exception code for setting wl_surface - Waylandsink needs exception code in gst_wayland_sink_set_window_handle(). - After making sink->window, User can call - gst_wayland_sink_set_window_handle(). It is the user's fault, but - Waylandsink needs to handle the exception, if not then sink->window is - changed and rendering fails. - https://bugzilla.gnome.org/show_bug.cgi?id=747482 - -2015-04-09 13:17:01 +0900 Hyunil Park <hyunil46.park@samsung.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Add exception code for setting wl_display - Waylandsink needs exception code in gst_wayland_sink_set_context(). After - calling gst_wayland_sink_set_context(), below code is set. - GST_ELEMENT_CLASS (parent_class)->set_context (element, context); but, If - user can call onemore. It is user's fault. but waylandsink need to - exception. - https://bugzilla.gnome.org/show_bug.cgi?id=747482 - -2015-11-02 20:10:35 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Hold object lock while manipulating the segment - Make sure the object lock is held when aggregator->segment is - modified. - -2015-11-02 19:40:28 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: Improve log messages - Make the level of log messages saner and improve some. - -2015-11-02 19:05:01 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Remove dead code - This code will never be called as max>=min in all cases. If the upstream - latency query returned min>max, the function already returned and all - values that are added to those have max>= min. - -2015-11-02 17:02:47 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: use GST_STIME_ARGS for GstClockTimeDiff - No need to manually handle negative values of best->dts in - GST_DEBUG_OBJECT. Use GST_STIME_ARGS for this. - -2015-11-02 16:58:57 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: use GST_STIME_ARGS for GstClockTimeDiff - No need to manually handle negative values of diff, GST_STIME_ARGS does - exactly this. - -2015-11-02 11:17:29 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: remove unreachable code - The stream->cur_seg_template is set to the lowest available segment - template (representation or adaptation or period, in this order). - Because the template elements are inherited, the lowest template will - have all the elements the parents had, so there is no need to check the - parent for an element that is not found in the child (eg initialisation - or index). - https://bugzilla.gnome.org/show_bug.cgi?id=752714 - -2015-11-02 10:48:11 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * tests/check/elements/dash_mpd.c: - tests: add a test for MPD file duration parsing - https://bugzilla.gnome.org/show_bug.cgi?id=752336 - -2015-11-02 10:25:38 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstmpdparser.c: - mpdparser: add some checks to duration parsing - https://bugzilla.gnome.org/show_bug.cgi?id=752336 - -2015-09-29 09:32:02 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: added duration format validation - https://bugzilla.gnome.org/show_bug.cgi?id=752336 - -2015-11-02 11:21:14 +0000 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: fix memory leak - Free new_mpd, allocated with g_slice_new(), before going out of scope in - goto error. - CID 1338050 - -2015-11-02 20:14:11 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtenc.c: - Revert "vtenc: free input buffer ASAP" - This reverts commit 6101fc57b8afac4f4e4aa742892f0d9c99d38a8c. - GstVideoEncoder assumes that the input buffer is available until _finish_frame. - https://bugzilla.gnome.org/show_bug.cgi?id=756951 - -2015-11-01 23:34:32 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusdec.c: - opusdec: Assume 48kHz if no sample rate is given in the header - -2015-10-30 20:59:41 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusenc.c: - opusenc: Place 48kHz first in the caps - For all the other sample rates the encoder will have to resample internally. - -2015-11-02 12:10:44 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/gstglutils.c: - gstglutils: fix shader compilation on Mountain Lion - Make gst_gl_context_gen_shader/_compile_shader assume GST_GLSL_PROFILE_ES | - GST_GLSL_PROFILE_COMPATIBILITY as the profile. Without this, the shader compiler - doesn't inject the #version tag resulting in a compilation error on Mountain - Lion. - This is a workaround for old code using gst_gl_context_gen_shader. New code - should use the gst_glsl_stage_* API directly which allows the caller to - explicitly specify version/profile. - -2015-10-31 18:47:39 +0100 Philippe Renon <philippe_renon@yahoo.fr> - - * sys/winks/gstksvideosrc.c: - ksvideosrc: don't try to align current timestamp on previous timestamp - this causes frames to be dropped. - Based on a patch by Sebastian Dröge - https://bugzilla.gnome.org/show_bug.cgi?id=748337 - -2015-10-31 23:28:20 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - glbufferpool: explicitly initialize a possibly uninitialized variable - The ret variable may be uninitialized and so its contents were undefined and - the results were erratic (failing with glvideomixer, succeeding in other cases) - P.S. No idea why gcc/clang et al never picked up on this like they normally do - (probably due to some optimisation pass figuring out it's only set once...) - -2015-10-29 11:38:35 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * tests/check/elements/dash_mpd.c: - mpdparser: make durations unsigned where appropriate - The standard does not seem to make any particular explicit not - implicit reference to the signedness of durations, and the code - does not rely on such, nor on the negativity of the -1 value - that's used as a placeholder when a duration property is not - present in the XML. - https://bugzilla.gnome.org/show_bug.cgi?id=750847 - -2015-10-30 15:55:19 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: inherit bitstreamSwitching from Period to AdaptationSet - https://bugzilla.gnome.org/show_bug.cgi?id=752340 - -2015-08-20 18:14:36 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstdashdemux.c: - dashdemux: marked PROP_BANDWIDTH_USAGE property as deprecated - https://bugzilla.gnome.org/show_bug.cgi?id=753890 - -2015-10-30 15:02:35 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - dashdemux: unit testing reproducing inherited segment duration overflow - unit test reproducing https://bugzilla.gnome.org/show_bug.cgi?id=751832 - -2015-10-30 14:31:21 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: inherited segment URLs are ignored if they are defined again in a lower SegmentList - According to the standard: - "SegmentBase, SegmentTemplate and SegmentList shall inherit - attributes and elements from the same element on a higher level. - If the same attribute or element is present on both levels, - the one on the lower level shall take precedence over the one - on the higher level." - gst_mpdparser_parse_segment_list_node will now discard any inherited - segment URLs if the parsed element defines some too. - https://bugzilla.gnome.org/show_bug.cgi?id=751832 - -2015-10-20 17:21:00 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_demux.c: - * tests/check/elements/fake_http_src.c: - * tests/check/elements/fake_http_src.h: - adaptivedemux: tests: added test for fragment download error - https://bugzilla.gnome.org/show_bug.cgi?id=757361 - -2015-10-20 15:46:36 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_demux.c: - adaptivedemux: tests: made adaptive demux test thread safe - https://bugzilla.gnome.org/show_bug.cgi?id=757361 - -2015-10-16 16:20:34 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_demux.c: - adaptivedemux: tests: added query test - Testing if adaptive demux responds to queries. - https://bugzilla.gnome.org/show_bug.cgi?id=757361 - -2015-10-28 11:21:14 +0000 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - dashdemux: tests: added test for multiple BaseURL entries - https://bugzilla.gnome.org/show_bug.cgi?id=757245 - -2015-09-16 10:40:33 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - dashdemux: tests: added unit test for 6d1eda9391d3143b5fc633edfd94b89dbba209ab - Commit 6d1eda9391d3143b5fc633edfd94b89dbba209ab fixed the period start - time scaling. This patch updates the unit tests to cover that scenario. - https://bugzilla.gnome.org/show_bug.cgi?id=755105 - -2015-10-16 17:10:11 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_demux.c: - adaptivedemux: tests: added download error test - Tests adaptive demux behaviour when the uri is wrong and download does - not happen. - -2015-10-30 12:49:20 +0000 Florin Apostol <florin.apostol@oregan.net> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: stop task on multiple download errors - On multiple download errors, we stop the download task and change the src - element state to NULL. - https://bugzilla.gnome.org/show_bug.cgi?id=756240 - -2015-10-30 12:24:22 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix a missing lock in write to stream->last_ret - https://bugzilla.gnome.org/show_bug.cgi?id=757359 - -2015-10-07 23:20:51 +0100 Florin Apostol <florin.apostol@oregan.net> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: return error if src element cannot start - https://bugzilla.gnome.org/show_bug.cgi?id=756209 - -2015-10-08 11:45:25 +0100 Florin Apostol <florin.apostol@oregan.net> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fixed waiting for fragment updates - https://bugzilla.gnome.org/show_bug.cgi?id=756237 - -2015-10-08 12:35:44 +0100 Florin Apostol <florin.apostol@oregan.net> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix header redownload in case of errors - https://bugzilla.gnome.org/show_bug.cgi?id=756239 - -2015-10-30 00:04:12 +0000 Florin Apostol <florin.apostol@oregan.net> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: release manifest lock before sending flush stop event - https://bugzilla.gnome.org/show_bug.cgi?id=757337 - -2015-10-29 23:41:46 +0000 Florin Apostol <florin.apostol@oregan.net> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: reset download_finished before starting the src element - https://bugzilla.gnome.org/show_bug.cgi?id=757336 - -2015-10-29 23:23:05 +0000 Florin Apostol <florin.apostol@oregan.net> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: release manifest lock before changing element state - https://bugzilla.gnome.org/show_bug.cgi?id=757335 - -2015-10-30 16:38:17 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/corevideotexturecache.m: - vtdec: fix compilation error - Undefined symbols for architecture x86_64: - "__gl_target_to_gst", referenced from: - __do_get_gl_buffer in libgstapplemedia_la-corevideotexturecache.o - -2015-10-30 15:00:23 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglcolorconvert.c: - * tests/check/libs/gstglmemory.c: - * tests/check/libs/gstglupload.c: - gl/tests: update for glmemory api changes - -2015-10-30 14:43:23 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglcolorconvertelement.c: - glcolorconvert: remove unused ret variable - -2015-10-30 14:40:35 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglslstage.h: - glslstage: remove typedefs from the header - They are already defined in the forward decleration header and defining them - more than once will give an error with OSX's clang about typedef redefinition - being a C11 feature. - -2015-10-30 14:38:05 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: follow the correct texture target names - -2015-10-30 01:42:42 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: explicitly configure the texture target on the gl buffer pool - If we don't, then the pool could end up allocating 2D textures when the - caps explictly state they should be rectangle textures. - -2015-10-30 01:27:36 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - glbufferpool: add bufferpool options for the various texture targets - This was chosen over relying solely on the caps as glupload needs to propose an - allocation and set the texture target based on the output caps. Setting the - caps in the config is currently pointless as they are overwritten in a lot of - element's decide_allocation functions. - This provides a mechanism for the buffer pool to be configured for a certain - texture target when none has been configured. - -2015-10-29 13:04:31 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglcolorconvertelement.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * sys/applemedia/corevideotexturecache.h: - * sys/applemedia/corevideotexturecache.m: - * sys/applemedia/vtdec.c: - glcolorconvert: add support for converting texture targets - Solved with a simple shader templating mechanism and string replacements - of the necessary sampler types/texture accesses and texture coordinate - mangling for rectangular and external-oes textures. - -2015-10-29 00:44:26 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.m: - * ext/gl/gstglcolorconvertelement.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstgloverlay.c: - * ext/gl/gstglstereomix.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstgluploadmeta.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * sys/applemedia/corevideotexturecache.m: - * tests/check/libs/gstglmemory.c: - glmemory: add support for rectangle textures - Add the various tokens/strings for the differnet texture types (2D, rect, oes) - Changes the GLmemory api to include the GstGLTextureTarget in all relevant - functions. - Update the relevant caps/templates for 2D only textures. - -2015-10-30 01:45:13 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.h: - glcolorconvert: order the caps template so that RGBA is first - glcolorconvert ! glcolorconvert would sometimes negotiated RGB - (the first list entry) otherwise. - -2015-10-30 01:16:02 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglbufferpool.h: - glbufferpool: move typedef's into the forward decleration file - Otherwise, for example, clang will warn about typedef redefinitions - being a C11 feature. - -2015-10-16 18:36:20 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/fake_http_src.c: - tests: fixed fake soup http src plugin - The soup http src changed the way it interprets the seek segment stop value. - Previously it was inclusive, now it is not (see commit - 21c6da6764c0cd015e9f3c5eecba36e297187deb, - bug https://bugzilla.gnome.org/show_bug.cgi?id=748316) - Updated fake soup http src to also consider segment stop not inclusive. - https://bugzilla.gnome.org/show_bug.cgi?id=756322 - -2015-10-09 14:10:52 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/Makefile.am: - * tests/check/elements/dash_demux.c: - adaptivedemux: tests: added unit test for adaptivedemux - Created a unit test for dashdemux. It relies on a fake SOUP HTTP src plugin - that will feed data to dashdemux. The test controls the data to be - generated and checks the correct data was received for each expected - stream. - https://bugzilla.gnome.org/show_bug.cgi?id=756322 - -2015-10-09 21:23:20 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * tests/check/elements/fake_http_src.c: - * tests/check/elements/fake_http_src.h: - tests: added fake http src plugin - Added a fake http src plugin capable of generating data buffers for a - request of a http url. Can be used in tests to simulate http accesses. - https://bugzilla.gnome.org/show_bug.cgi?id=756322 - -2015-07-07 15:38:08 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * tests/check/elements/dash_mpd.c: - dashdemux: provide a default suggestedPresentationDelay - If MPD@suggestedPresentationDelay is not present in the manifest, - dashdemux selects the fragment closest to the most recently generated - fragment. This causes a playback issue because this choice does not allow - the DASH client to build up any buffer of downloaded fragments without - pausing playback. This is because by definition new fragments appear on - the server in real-time (e.g. if segment duration is 4 seconds, a new - fragment will appear on the server every 4 seconds). If the starting - playback position was n*segmentDuration seconds behind "now", the DASH - client could download up to 'n' fragments faster than realtime before it - reached the point where it needed to wait for fragments to appear on the - server. - The MPD@suggestedPresentationDelay attribute allows a content publisher - to provide a suggested starting position that is behind the current - "live" position. - If the MPD@suggestedPresentationDelay attribute is not present, provide - a suitable default value as a property of the dashdemux element. To - allow the default presentation delay to be specified either using - fragments or seconds, the property is a string that contains a number - and a unit (e.g. "10 seconds", "4 fragments", "2500ms"). - -2015-10-29 15:02:38 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/ivfparse/gstivfparse.c: - * gst/ivfparse/gstivfparse.h: - ivfparse: Add vp9 support - Differentiate the vp8/vp9 bitstream based on fourcc. - https://bugzilla.gnome.org/show_bug.cgi?id=757251 - -2015-09-09 14:09:43 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstdashdemux.c: - dashdemux: improve detection of stream language - Improved the detection of stream's language if the AdaptationSet - contains more than 1 ContentComponent - https://bugzilla.gnome.org/show_bug.cgi?id=752367 - -2015-10-29 12:04:31 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dash_mpd: restrict segment template format strings to %00-9*d as per spec - https://bugzilla.gnome.org/show_bug.cgi?id=751735 - -2015-09-09 12:36:10 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: segment template parsing: added support for %d - Added support for %d in template identifier. - Added testcases for %d, %3d, %0-4d identifier formats. - -2015-10-29 11:54:34 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: corrected parsing of segment templates - Corrected the parsing of a segment template string. - Added unit tests to test the segment template parsing. - All reported problems are now correctly handled. - https://bugzilla.gnome.org/show_bug.cgi?id=751735 - -2015-10-29 11:17:48 +0000 Florin Apostol <florin.apostol@oregan.net> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - dahsdemux: task is signaled to stop without stop condition being set - The gst_adaptive_demux_stream_free function is trying to stop the stream's - download task. For this, it signals the task. But it fails to also set the - stream->download_finished = TRUE, so the task will go back to sleep and - only exit when the download is finished. - https://bugzilla.gnome.org/show_bug.cgi?id=755121 - -2015-10-28 17:02:51 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: fixed crash when segment timeline list is greater than segment url list - When building the media segment list using a SegmentList node, the - gst_mpd_client_setup_representation function will iterate through the - list of S nodes and will expect to find a matching SegmentUrl node. If - one does not exist, the code made an illegal memory access. - https://bugzilla.gnome.org/show_bug.cgi?id=752496 - -2015-09-11 10:59:15 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - dashdemux: unit test for missing profiles - -2015-09-11 10:57:26 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstmpdparser.c: - mpdparser: do not dereference profiles is absent - These are used to apply restrictions on what the MPD file may - use, so no profile means no restrictions. - Besides, nothing actually uses the profiles (yet) anyway. - https://bugzilla.gnome.org/show_bug.cgi?id=750869 - -2015-09-16 16:46:29 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/hls/gsthlsdemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: fixed multithread support - https://bugzilla.gnome.org/show_bug.cgi?id=755169 - -2015-10-28 16:31:39 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: parser rejects negative values for mediaPresentationDuration - https://bugzilla.gnome.org/show_bug.cgi?id=752326 - -2015-10-28 16:24:01 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: corrected parsing of negative values into unsigned data - https://bugzilla.gnome.org/show_bug.cgi?id=752429 - -2015-09-17 20:18:52 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparser: h264: initialize parsing structures - Initialize to 0 these parse structures before filling them: GstH264SEIMessage, - GstH264NalUnit, GstH264PPS, GstH264SPS and GstH264SliceHdr. - When calling the functions which fill those structures, they may fail, leaving - unitialized those structures. This situation may lead to future problems, such - as a segmentation fault when freeing, for example. - This patch initializes to zero these structures, before filling them. - https://bugzilla.gnome.org/show_bug.cgi?id=755161 - -2015-09-18 10:09:26 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparser: h265: initialize parsing structures - Initialize to 0 these parse structures before filling them: GstH265SEIMessage, - GstH265NalUnit, GstH265VPS, GstH265PPS, GstH265SPS and GstH265SliceHdr. - When calling the functions which fill those structures, they may fail, leaving - unitialized those structures. This situation may lead to future problems, such - as a segmentation fault when freeing, for example. - This patch initializes to zero these structures, before filling them. - https://bugzilla.gnome.org/show_bug.cgi?id=755161 - -2015-10-26 19:58:04 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudiomixer.c: - liveadder: Make latency property be a uint in millisecs - This restores roughly the same behaviour as the old liveadder element. - Except that the latency now also includes the output-buffer-duration. - https://bugzilla.gnome.org/show_bug.cgi?id=757050 - -2015-09-08 14:00:54 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstmpdparser.c: - mpdparser: forbid negative values for duration - https://bugzilla.gnome.org/show_bug.cgi?id=752492 - -2015-10-28 15:39:07 +0000 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: parser rejects XMLs with negative period duration - https://bugzilla.gnome.org/show_bug.cgi?id=752329 - -2015-10-28 15:34:29 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - mpdparser: check segment lists have either duration or timeline - And add error checking along the way. - Add duration where appropriate so unit tests still pass. - https://bugzilla.gnome.org/show_bug.cgi?id=751650 - -2015-09-29 16:17:03 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - mpdparser: validate representation set identifier - It must have no whitespace, and must comply with RFC 1738 when - used to build a URL. - https://bugzilla.gnome.org/show_bug.cgi?id=750852 - -2015-10-28 14:41:54 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglslstage.c: - glslstage: initialize output params to 0 before calling gl functions - The client side API of the Chromium's GPU Process has asserts - in debug mode that check that output params are initialized to 0. - -2015-10-27 16:32:48 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Remove some dead code that could never be called - Coverity CIDs #1328818, #1328819, #1328820. - -2015-10-27 00:36:41 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstopengl.c: - opengl: build/provide glstereomix/split on gles only systems - -2015-10-26 16:51:06 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * gst/geometrictransform/geometricmath.c: - * gst/geometrictransform/geometricmath.h: - * gst/geometrictransform/gstbulge.c: - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstmarble.c: - * gst/geometrictransform/gstmarble.h: - * gst/geometrictransform/gstsquare.c: - * gst/geometrictransform/gststretch.c: - geometrictransform: rename gemetric math functions to have their symbols namespaced - Otherwise those symbols can conflict with external libraries when - linking everything statically for mobile targets. - Use the gst_gm_ prefix, short for gst geometric math. - https://bugzilla.gnome.org/show_bug.cgi?id=756882 - -2015-10-26 15:30:08 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: don't advertise the local wl_display context - This wl_display proxy is temporary only until waylandsink goes NULL, - at which point the connection to the display is disposed. Unfortunately, - if this is advertised as a GstContext, playbin will cache it and re-feed - it to the sink when it goes PLAYING again, but the wl_display pointer - will at that point be invalid and cause a crash. - Another solution to the problem would be to also cache the GstWlDisplay - object inside the GstContext, which would automatically ref-count - the display connection, but I see no reason in doing that at the moment, - as there are no known users of this GstContext outside waylandsink. - It's probably better to avoid chasing hidden refcounts. - https://bugzilla.gnome.org/show_bug.cgi?id=756567 - -2015-10-26 18:26:18 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: allow outputting multiple textures for gles3 contexts - the USING_GLES2 includes all GLES3 contexts as well which does support - drawing to multiple buffers. Instead make or decision solely based on - whether glDrawBuffers is available or not. - -2015-10-26 17:36:21 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstopengl.c: - * gst-libs/gst/gl/gstglviewconvert.c: - glviewconvert: expose the element on gles2 platforms - We can do everything with gles3 however gles2 restricts us not allowing - separated or frame-by-frame multiview modes due to multiple draw buffers. - -2015-10-25 01:19:33 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/hlsdemux_m3u8.c: - tests: hlsdemux_m3u: add test for master playlist with missing variant list uri - https://bugzilla.gnome.org/show_bug.cgi?id=756861 - -2015-10-20 09:13:04 +0100 André Draszik <git@andred.net> - - * ext/hls/m3u8.c: - hlsdemux: don't crash or leak memory on broken master playlist - If a (master) playlist contains a variant list entry without a - URI then during parsing of the next variant list entry we are - a) leaking the entry we're currently parsing (new_list), and - b) free'ing the pointer to the previous list entry (list) without - updating the pointer. - Hence when then adding the URI for the latest parsed entry, incorrect - information is stored, as the information is used from 'list' which - is not valid memory anymore, also leading to crashes. - Fix this by correctly storing the new variant list entry pointer - as needed. - https://bugzilla.gnome.org/show_bug.cgi?id=756861 - -2015-09-04 11:29:08 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: change dispose function to finalize - -2015-08-30 21:35:02 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: remove helper function only used once - -2015-08-30 17:41:23 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: remove deprecated 'fragments-cache' property - It's been non-functional for two cycles now, let's - get rid of it. - -2015-09-02 16:40:17 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: m3u8: move file lookup by sequence directly into code - Nicer to read, two lines of code less, and also the callback - function should've been a GCompareFunc that returns a gint - and not a boolean (it did work correctly, was just confusing). - -2015-09-01 12:48:38 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: m3u8: clean-up: remove unused argument in function call - -2015-08-30 17:22:19 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/m3u8.h: - hlsdemux: m3u8: clean-up: reindent header for better readability - And remove duplicate define. - -2015-10-23 18:58:41 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Remove empty set/get_property() - We can add them again if we ever add properties. - -2015-10-23 18:38:33 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/Makefile.am: - * gst/mxf/mxfmux.c: - * gst/mxf/mxfmux.h: - mxfmux: Port to GstAggregator - -2015-10-22 19:20:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Set GC essence element UL version to 0x01 - ffmpeg otherwise rejects it and the spec is not 100% clear about that. - -2015-10-20 17:09:22 +0200 Santiago Carot-Nemesio <sancane@gmail.com> - - * ext/srtp/gstsrtp.c: - srtp: Fix critical warning trying to retrieve SSRC from a non fb message - https://bugzilla.gnome.org/show_bug.cgi?id=756876 - -2015-10-22 19:24:34 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/Makefile.am: - mxf: Reorder CFLAGS and LIBS - -2015-10-23 15:42:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: Add create_new_pad() vfunc to allow subclasses to override the default behaviour - Not all aggregator subclasses will have a single pad template called sink_%u - and might do something special depending on what the application requests. - https://bugzilla.gnome.org/show_bug.cgi?id=757018 - -2015-10-21 19:00:41 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Set KAG size to 1 - We're not aligning our output in any way, and 0 is invalid. - -2015-10-21 18:58:06 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Don't let the header partition's prev_partition point forward to the footer - -2015-10-21 18:32:09 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxftypes.c: - mxftypes: Fix generation of operational pattern UL - -2015-10-21 18:31:43 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/examples/mxf/mxfdemux-structure.c: - mxfdemux-structure: Sync fakesink state with the bin to make the application work at all - -2015-10-21 18:20:16 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmpeg.c: - mxfmpeg: h264 is always byte-stream inside MXF - -2015-10-21 18:06:11 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/mxfmux.c: - * tests/check/pipelines/mxf.c: - mxf: Add unit tests for H264/PCM - -2015-10-21 17:47:00 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Don't leak SEEK events when dropping them - -2015-10-21 17:21:09 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfvc3.c: - mxfvc3: The wrapping is the 15th byte of the essence container UL, not the 16th - In other mappings it is the 16th though. - -2015-10-21 17:11:03 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: If seeking to the remaining parts of the file fails on EOS, consider the stream done - Without this we would run this while loop forever, always seeking again for - the same stream. - -2015-10-21 15:07:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/mxfmux.c: - * tests/check/pipelines/mxf.c: - mxf: Properly enable unit tests again - -2015-10-21 01:22:11 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxf.c: - mxf: Re-enable mxfmux element - -2015-10-21 01:21:37 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfjpeg2000.c: - mxfjpeg2000: Fix caps - There is no fields field anymore. - -2015-10-21 01:17:04 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Don't fail SEGMENT events - -2015-10-21 01:02:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfmux.c: - mxfmux: Push stream-start and caps event before segment event - And don't push the caps event during instance initialization already. - -2015-10-21 00:45:19 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfaes-bwf.c: - mxfaes-bwf: Format is unsigned if it's 1 byte per channel - ... not 1 byte per block. - -2015-10-21 16:51:10 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gsthanddetect.cpp: - opencv: handdetect: no need to get a writable buffer - No need to get a writable buffer inside cv_trans_func of opencv video - filter. GstBaseTransform takes care of this. - -2015-10-21 14:35:11 +0100 Tim-Philipp Müller <tim@centricular.com> - - * common: - Automatic update of common submodule - From b99800a to b319909 - -2015-10-20 17:29:42 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Use new GST_ENABLE_EXTRA_CHECKS #define - https://bugzilla.gnome.org/show_bug.cgi?id=756870 - -2015-10-21 14:26:01 +0300 Sebastian Dröge <sebastian@centricular.com> - - * README: - * common: - Automatic update of common submodule - From 9aed1d7 to b99800a - -2015-10-21 05:34:18 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfiltershader.c: - glshaderelement: free the vertex and fragment strings on finalize - Fixes a memory leak when using the vertex/fragment properties. - -2015-10-21 05:33:13 +1100 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - androidmedia: fix build errors - printf %lld instead of G_GINT64_FORMAT. - Double ret variable declaration. - -2015-10-21 05:00:11 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfiltershader.c: - glshaderelement: remove unneeded reference to <gst/gl/gstglshadervariables.h> - -2015-10-21 04:44:50 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gsteglimagememory.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcontext.c: - gl: fix usage of string.h and stdio.h functions without including the headers - e.g: - gstglcontext_egl.c:613:7: error: implicit declaration of function 'strcmp' - -Werror=implicit-function-declaration - if (strcmp (G_MODULE_SUFFIX, "so") == 0) - -2015-10-16 07:03:06 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: create a context in NULL_READY - So that it's possible for decoders et al. to request the OpenGL context - in their READY_PAUSED transition with decodebin/playbin. - -2015-10-16 00:34:22 +1100 Matthew Waters <matthew@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideodec.h: - amcviddec: use gstcontext to retreive the OpenGL context - -2015-04-20 13:46:58 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Only allow GL output if the decoder has unknown color formats - If GST_AMC_IGNORE_UNKNOWN_COLOR_FORMATS is set to yes, non-GL output - is still allowed. - https://bugzilla.gnome.org/show_bug.cgi?id=731204 - -2014-06-05 10:33:56 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/androidmedia/Makefile.am: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - * sys/androidmedia/gstamc2dtexturerenderer.c: - * sys/androidmedia/gstamc2dtexturerenderer.h: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcsurface.c: - * sys/androidmedia/gstamcsurface.h: - * sys/androidmedia/gstamcsurfacetexture.c: - * sys/androidmedia/gstamcsurfacetexture.h: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideodec.h: - * sys/androidmedia/gstamcvideoenc.c: - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - * sys/androidmedia/org/freedesktop/gstreamer/androidmedia/GstAmcOnFrameAvailableListener.java: - androidmedia: Add support for GL output in amcvideodec - https://bugzilla.gnome.org/show_bug.cgi?id=731204 - -2015-04-30 12:33:58 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Do not flush codec if it is not started - -2015-04-13 13:10:10 +0200 Matthieu Bouron <matthieu.bouron@gmail.com> - - * sys/androidmedia/gstjniutils.c: - androidmedia: Allow object to be NULL in gst_amc_jni_*unref functions - -2015-03-13 16:13:08 +0100 Edward Hervey <bilboed@bilboed.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcvideoenc.c: - androidmedia: Fix debug statement (%d for a gsize argument) - -2015-04-02 16:28:14 +0200 Matthieu Bouron <matthieu.bouron@gmail.com> - - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Improve color format debug messages - -2015-03-31 16:24:40 +0200 Matthieu Bouron <matthieu.bouron@gmail.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Improve debug messages - -2015-03-31 17:48:59 +0200 Matthieu Bouron <matthieu.bouron@gmail.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Do not warn we do not support COLOR_FormatSurface - -2015-10-21 03:59:33 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstglshadervariables.c: - * gst-libs/gst/gl/gstglshadervariables.h: - gl: remove unneeded shader variable parsing code - -2015-10-21 03:23:30 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfiltershader.c: - * ext/gl/gstglfiltershader.h: - glshaderelement: implement setting arbitrary uniforms - Currently float and int are supported by default. vec2, vec3, vec4 - and mat4 are supported if graphene is used. Of course if one wants - to set custom uniforms they can also be set using the create-shader - signal. - -2015-10-20 12:24:11 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gsthanddetect.cpp: - opencv: handdetect: free best_r with delete - best_r is a cv::Rect, so it should be freed with delete and not with - g_free() - -2015-10-20 12:08:59 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstmotioncells.cpp: - opencv: motioncells: remove unnecessary check - We know that the gchar arrays contain at least one string. Furthermore, - g_strfreev() checks if the array is NULL and simply returns if it is. - Hence, there is no need to check if the array is empty before using - g_strfreev(). - CID 1327412-1327415 - -2015-07-08 17:17:12 +0200 Edward Hervey <edward@centricular.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hls/m3u8: Update current position in all cases - In order to ensure the sequence_position will always be consistently updated, - store the current file duration. - This way, when we advance, we can always increment the position based on what - was previously outputted. - https://bugzilla.gnome.org/show_bug.cgi?id=752132 - -2015-10-14 18:35:00 +0200 plamot <pierre.lamot@openwide.fr> - - * sys/dshowvideosink/dshowvideosink.cpp: - dshowvideosink: Fix 64bit compatibility issue - SetWindowLong works only for 32 bit systems, thus windows events (move/resize) - where not interpreted on 64 bit systems - https://bugzilla.gnome.org/show_bug.cgi?id=756617 - -2015-10-19 15:15:30 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * ext/gl/gstglimagesink.c: - * ext/gtk/gtkgstglwidget.c: - * ext/qt/qtitem.cc: - * gst-libs/gst/gl/android/gstglwindow_android_egl.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.h: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.h: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglsl.c: - * gst-libs/gst/gl/gstglslstage.c: - * gst-libs/gst/gl/gstglsyncmeta.c: - * gst-libs/gst/gl/gstglviewconvert.c: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/win32/gstglcontext_wgl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.h: - * gst-libs/gst/gl/x11/gstglcontext_glx.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - gl: be consistent in gobject boilerpate - GST_GL_IS_* vs GST_IS_GL_* - git grep -l 'GST_GL_IS_' | xargs sed -i 's/GST_GL_IS_/GST_IS_GL_/g' - -2015-10-19 15:02:10 +1100 Matthew Waters <matthew@centricular.com> - - * .gitignore: - add glliveshader program to .gitignore - -2015-10-17 12:48:11 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * gst/pnm/gstpnmdec.c: - pnmdec: drop frame in case of _handle() failure - Allows baseclass to handle it from there - Related to: - https://bugzilla.gnome.org/show_bug.cgi?id=756563 - -2015-10-17 01:51:24 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmdec.h: - pnmdec: propagate input state after parsing - Store and copy input state fields when setting the - output state of the decoder. Avoids problems like - the framerate set by an upstream element being ignored - Related to: - https://bugzilla.gnome.org/show_bug.cgi?id=756563 - -2015-10-16 20:45:42 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * gst/pnm/gstpnmdec.c: - pnmdec: completely reset parsing state at flush - Makes sure the mngr struct reflects a clean state - for the next frame, avoiding failures like: - https://bugzilla.gnome.org/show_bug.cgi?id=756563 - -2015-10-17 15:26:46 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfiltershader.c: - * ext/gl/gstglfiltershader.h: - * tests/examples/gtk/glliveshader.c: - glshaderelement: implement on-demand create-shader signalling - One may not have an GstGLContext available or current in the thread where one - would need to update the shader. Support this by signalling create-shader - whenever the one-shot 'update-shader' is set to TRUE. - -2015-10-17 02:42:47 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.m: - gl/calayer: don't leak a gl shader object - We will always overwrite the ca_sink->redisplay_shader without freeing the - object. - -2015-10-17 02:40:50 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gstgtkbasesink.c: - gtk: separate out the widget/window destroy callbacks - Fixes assertion due to the sink_finalize() being run before the widget destroy - callback. - https://bugzilla.gnome.org/show_bug.cgi?id=755969 - -2015-10-17 01:08:29 +1100 Matthew Waters <matthew@centricular.com> - - * tests/examples/gtk/Makefile.am: - * tests/examples/gtk/glliveshader.c: - gl/examples: add a live shader demo using the new GstGLSLStage - Implemented with videotestsrc ! glshader ! glupload ! gtkglsink - Errors on an invalid shader compilation are ignored however any error - provided by the glsl compiler is printed to stdout. - -2015-10-16 00:23:56 +0200 Miguel París Díaz <mparisdiaz@gmail.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: skip padding when mapping RTP packets - https://bugzilla.gnome.org/show_bug.cgi?id=756653 - -2015-10-14 19:32:07 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Properly forward the return value of gst_video_decoder_negotiate() - https://bugzilla.gnome.org/show_bug.cgi?id=756578 - -2015-10-14 19:24:22 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Implement support for COLOR_QCOM_FormatYVU420SemiPlanar32mMultiView for decoding - https://bugzilla.gnome.org/show_bug.cgi?id=756578 - -2015-10-16 02:57:19 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglslstage.c: - glslstage: add brackets around pointer dereference referencing an array - While technically, i is always 0 and *vertex_sourcesi++ is equivalant - to (*vertex_sources)i++. Be future-proof in the case of code - moves/changes/etc. - CID 1327406 - -2015-10-15 23:47:11 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.m: - gl/caopengllayersink: port to new GstGLShader API - fixes build error: - "undefined symbols for architecture: - gst_gl_shader_compile_with_default_vf_and_check" - -2015-10-15 22:42:26 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglcontext.c: - gl/tests: port glcontext test to opengl - Now uses vao's and vbo's when possible like the rest of the gstgl library. - -2015-09-04 16:16:51 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfiltershader.c: - * ext/gl/gstglfiltershader.h: - glshader: port element to GstGLSLStage - - Provide a shader property to set the full shader pipeline - - Provide vertex and fragment properties for just providing simple - shader sources. - -2015-09-04 16:02:32 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/effects/gstgleffectidentity.c: - * ext/gl/gstglcolorscale.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstglimagesink.c: - * ext/gtk/gtkgstglwidget.c: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglutils.c: - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglupload.c: - glshader: port to using GstGLSLStage objects for string management - A GstGLShader is now simply a collection of stages that are - compiled and linked together into a program. The uniform/attribute - interface has remained the same. - -2015-09-04 14:36:47 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglslstage.c: - * gst-libs/gst/gl/gstglslstage.h: - glsl: add a shader stage object GstGLSLStage - Represents a stage (vertex, geometry, fragment, etc) in the shader - pipeline. - -2015-09-04 00:09:09 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglshadervariables.h: - gl/shader/variables: include generic gl.h header - Otherwise we may miss some forward declarations - Fixes build error: undefined reference to GstGLSLStage - -2015-08-20 15:11:06 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglsl.c: - * gst-libs/gst/gl/gstglsl.h: - * gst-libs/gst/gl/gstglsl_private.h: - * tests/check/Makefile.am: - * tests/check/libs/.gitignore: - * tests/check/libs/gstglsl.c: - gl: add some GLSL utility functions - Specifically parsing/setting GLSL versions and the shader related - function table. - -2015-10-14 22:51:29 +0200 Paul Arzelier <paul.arzelier@free.fr> - - * ext/dtls/gstdtlscertificate.c: - dtls: Fix name conflict with openssl on win32 - https://bugzilla.gnome.org/show_bug.cgi?id=756592 - -2015-09-04 18:40:18 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/m3u8.c: - hls: if media sequence is not specified, use 0 - Allows playlists that are missing the mediasequence information to - be correctly parsed. If the playlist was updated without reseting - the mediasequence it would constantly increase over subsequent updates, - leading to issues during playback. - -2015-08-30 14:56:57 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: fix fallback buffer allocation - Copy-paste mistake; the wl_buffer was attached on the wrong buffer... - -2015-08-30 14:55:11 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - waylandsink: rename GstWlDisplay::formats array to shm_formats - These formats are specific to the wl_shm interface. We are going - to add dmabuf formats later as well. - -2015-08-29 22:29:17 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/Makefile.am: - * ext/wayland/wlshmallocator.c: - * ext/wayland/wlshmallocator.h: - waylandsink: replace the custom GstWlShmMemory with GstFdMemory - -2015-10-14 19:53:34 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/POTFILES.in: - po: Update POTFILES.in for OpenCV C++ file rename - -2015-10-14 17:41:05 +0200 Edward Hervey <edward@centricular.com> - - * ext/hls/m3u8.c: - hls: Allow debugging of the playlist - Helps debugging issues - -2015-10-14 17:38:39 +0200 Edward Hervey <edward@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Avoid negative sequence numbers - For live streams, we want to make sure there's a certain distance - between the sequence to play and the last (earliest) fragment. - The problem is that it assumes there are at least 3 fragments in - the playlist, which might not always be the case (like in the case - of a server restarting and gradually adding fragments). - In order to avoid ending up with negative sequence numbers (which - will just loop forever), limit the new target sequence number to - the highest of: - * either the first sequence number of the playlist (fallback) - * or 3 fragments from the last one (standard behaviour) - -2015-10-14 15:30:05 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstopencvutils.cpp: - * ext/opencv/gstopencvvideofilter.cpp: - * ext/opencv/gsttemplatematch.cpp: - opencv: switch remaining to C++ - Switch remaining C files to C++ for consistency with other OpeCV elements, - and support of the new 2.4.11 API. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-10-14 10:31:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Set default last_byte_pos to -1 - The value is optional in the range, and if it is absent it means we should - download until the end of stream. Not until position 0. - https://bugzilla.gnome.org/show_bug.cgi?id=748316 - -2015-10-14 10:34:58 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: HTTP ranges are inclusive, GStreamer segment.stop is exclusive - Translate the values accordingly. - https://bugzilla.gnome.org/show_bug.cgi?id=748316 - -2015-10-14 14:34:32 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstmotioncells.cpp: - * ext/opencv/gstmotioncells.h: - * ext/opencv/motioncells_wrapper.cpp: - * ext/opencv/motioncells_wrapper.h: - opencv: motioncells: Switch to C++ - Switch gstmotioncells to C++ for consistency with other OpenCV elements, - and support of the new 2.4.11 API. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-10-14 22:35:26 +1100 Matthew Waters <matthew@centricular.com> - - * Makefile.am: - build: add liveadder directory to the cruft list - So that we can remove it and avoid duplicate GstLiveAdder GType registrations. - -2015-10-13 12:40:04 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/gl/gstgldebug.c: - gl: fix leak in gst_gl_insert_debug_marker() - The string allocated by g_vasprintf() was leaked. - Reproduced using the - validate.file.compositor.simple.play_15s.synchronized validate scenario. - https://bugzilla.gnome.org/show_bug.cgi?id=756492 - -2015-10-12 11:07:32 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - docs: update to git - https://bugzilla.gnome.org/show_bug.cgi?id=756424 - -2015-10-12 09:36:29 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - liveadder: latency property is an uint64 in audiomixer - -2015-10-11 23:44:25 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gsttextoverlay.cpp: - textoverlay: Switch to C++ - Switch gsttextoverlay to C++ for consistency with other OpenCV elements, - and support of the new 2.4.11 API. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-10-11 21:54:30 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstpyramidsegment.cpp: - opencv: pyramidsegment: Switch to C++ - Switch gstpyramidsegment to C++ for consistency with other OpenCV elements, - and support of the new 2.4.11 API. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-10-05 00:55:36 +0100 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-liveadder.xml: - * gst/audiomixer/gstaudiomixer.c: - * gst/liveadder/Makefile.am: - * gst/liveadder/liveadder.c: - * gst/liveadder/liveadder.h: - liveadder: Remove plugin, replace by compat subclass of audiomixer - New subclass with a similar behaviour as the old liveadder, but - a slightly different API as the latency is in nanoseconds, not - milliseconds. Also, the new liveadder has a effective latency that - is latency + output-buffer-duration. In practice, just setting a non-zero - latency with the new audiomixer gives you the right behavior in 99% of the - cases. - -2015-10-11 10:00:43 +0100 Julien Isorce <j.isorce@samsung.com> - - * configure.ac: - * ext/dash/Makefile.am: - dashdemux: fix undefined reference to gst_ntp_clock_new - Found with gst-inspect-1.0 -b in gst-uninstalled env. - https://bugzilla.gnome.org/show_bug.cgi?id=756383 - -2015-10-10 17:52:23 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstcvsobel.cpp: - cvsobel: Switch to C++ - Switch gstcvlsobel to C++ for consistency with other OpenCV elements, and - support of the new 2.4.11 API. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-10-10 17:00:55 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstcvlaplace.cpp: - cvlaplace: Switch to C++ - Switch gstcvlaplace to C++ for consistency with other OpenCV elements, and - support of the new 2.4.11 API. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-10-10 16:57:36 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstcvequalizehist.cpp: - cvequalizehist: Switch to C++ - Switch gstcvequalizehist to C++ for consistency with other OpenCV elements, - and support of the new 2.4.11 API. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-10-10 14:10:32 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstcvdilateerode.cpp: - * ext/opencv/gstcverode.cpp: - cverode: Switch to C++ - Switch gstcverode to C++ for consistency with other OpenCV elements, and - support of the new 2.4.11 API. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-10-08 14:46:10 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvb: simplify ZAP file format parser - Simplify state handing, drop unneeded local vars, etc. - -2015-10-07 14:22:46 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: fixed has_next_period - gst_mpd_client_has_next_period now calls gst_mpd_client_setup_media_presentation - to refresh the period information. - https://bugzilla.gnome.org/show_bug.cgi?id=756186 - -2015-10-07 08:48:15 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: Fix build error - Build error due to wrong argument type in debug message - aagg->priv->offset and next_offset are of type int64, but uint64 - formatter is being used in logs. Changing all those to int64 - https://bugzilla.gnome.org/show_bug.cgi?id=756065 - -2015-10-06 21:23:11 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: Proxy the ignore-eos videoaggregator property as well - Identical to how the z-order property is proxied - -2015-10-05 11:21:07 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/id3tag/id3tag.c: - id3tag: fix sample memory leak - When getting sample from taglist, the memory is not being freed resulting in memory leak. - https://bugzilla.gnome.org/show_bug.cgi?id=756070 - -2015-10-01 11:18:52 +0200 Havard Graff <havard.graff@gmail.com> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: plug memory-leaks - https://bugzilla.gnome.org/show_bug.cgi?id=756001 - -2015-10-02 22:57:27 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdbin.h: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - resindvd: Port to new GLib mutex/cond API - -2015-10-02 22:24:19 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * ext/hls/m3u8.c: - * ext/libde265/libde265-dec.c: - * gst-libs/gst/glib-compat-private.h: - * gst/videomeasure/gstvideomeasure_ssim.c: - Update GLib dependency to 2.40.0 - -2015-10-02 19:02:26 +0100 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstcvdilate.cpp: - cvdilate: Change gstcvdilate to C++ - Change the gstcvdilate.c file extension to cpp and add it into Makefile for - consistency with other elements of opencv and because Opencv not support C - language in new API 2.4.11. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-10-02 18:50:45 +0100 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstskindetect.cpp: - skindetect: Change gstskindetect to C++ - Change the file extension to cpp and add it into Makefile for consistency - with other elements of opencv and because Opencv not support C language in - new API 2.4.11. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-08-31 17:43:26 +0200 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/gstopencvutils.h: - opencvutils: add extern C, for the opencv elements work. - Adding G_BEGIN_DECLS and G_END_DECLS to gstopencvutils.h - to allow C-style linking. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-10-02 18:40:43 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstretinex.cpp: - retinex: use OpenCV namespace - As part of the switch to C++, use the new OpenCV functions. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-10-02 18:10:32 +0100 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstcvsmooth.cpp: - cvsmooth: port to C++ - Change the file extension to cpp and add it into Makefile for consistency - with other elements of opencv and because Opencv not support C language in - new API 2.4.11. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-10-02 17:48:47 +0100 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstretinex.cpp: - retinex: Change retinex to C++ - Change the gstretinex.c file to cpp and add it into Makefile. - It is necessary to migrate the retinex element to C++, - because new Opencv API leaves obsolete functions like cvSmooth. - This element uses this function. - You can see in this link: - http://docs.opencv.org/modules/imgproc/doc/filtering.html? - highlight=cvsmooth#void cvSmooth(const CvArr* src, CvArr* dst, - int smoothtype, int size1, int size2, double sigma1, double sigma2) - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-10-02 17:18:33 +0100 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/gsthanddetect.cpp: - * ext/opencv/gsthanddetect.h: - handdetect: remove another unused variable - Memory is reserved for this variable and then released without making any - use of it. - https://bugzilla.gnome.org/show_bug.cgi?id=752528 - -2015-10-02 17:02:42 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gsthanddetect.cpp: - * ext/opencv/gsthanddetect.h: - handdetect: CvPoint values changed from uint to int - The x and y values of CvPoint changed from unsigned to signed integers - in OpenCV 2.4.11. - https://bugzilla.gnome.org/show_bug.cgi?id=752528 - -2015-10-02 16:22:36 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gsthanddetect.cpp: - * ext/opencv/gsthanddetect.h: - handdetect: need to migrate to C++ - The cascade classifier changes its structure on new version of OpenCV 2.4.11. - It is need to migrate to C++ to utilize the new load method of OpenCV which - allows to load the old and new classifiers. - https://bugzilla.gnome.org/show_bug.cgi?id=752528 - -2015-10-02 16:01:29 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gsthanddetect.cpp: - handdetect: Change gsthanddetect to C++ - Change the gsthanddetect.c file to cpp and add it into Makefile. - It is necessary to migrate the handdetect plugin to C++, - in order to load new and old classifiers, to make handdetect work - with newer versions of Opencv. - https://bugzilla.gnome.org/show_bug.cgi?id=752528 - -2015-10-02 17:05:11 +0200 Polochon_street <polochonstreet@gmx.fr> - - * ext/dtls/gstdtlsdec.c: - dtls: fix printf format on win32 - -2015-08-20 16:03:29 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/inter/gstintertest.c: - * tests/examples/camerabin2/gst-camerabin2-test.c: - * tests/examples/codecparsers/parse-jpeg.c: - * tests/examples/gl/gtk/fxtest/fxtest.c: - * tests/examples/gl/gtk/fxtest/pixbufdrop.c: - * tests/examples/opencv/gstfacedetect_test.c: - * tests/examples/playout.c: - * tools/gst-app-maker: - gstreamer: bad: Fix memory leaks when context parse fails - When g_option_context_parse fails, context and error variables are not getting free'd - which results in memory leaks. Free'ing the same. - And replacing g_error_free with g_clear_error, which checks if the error being passed - is not NULL and sets the variable to NULL on free'ing. - https://bugzilla.gnome.org/show_bug.cgi?id=753854 - -2015-06-25 19:17:36 +0200 Arnaud Vrac <avrac@freebox.fr> - - * ext/assrender/gstassrender.c: - assrender: optimize blending - Skip empty source pixels when blending an image. There can be hundreds - of images to blend at each frame, so this brings a nice performance - boost. - https://bugzilla.gnome.org/show_bug.cgi?id=753821 - -2015-08-19 17:18:31 +0200 Arnaud Vrac <avrac@freebox.fr> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: Use the window size from downstream - This allows rendering the overlay at a resolution matching the video - resolution. - https://bugzilla.gnome.org/show_bug.cgi?id=753824 - -2014-09-04 18:16:00 +0200 Arnaud Vrac <avrac@freebox.fr> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: Improve negotiation - This is mostly a copy/paste of the negotiation function in - basetextoverlay, which was improved recently to handle many more cases. - This will allow us to negotiate a window size with downstream. - https://bugzilla.gnome.org/show_bug.cgi?id=753824 - -2015-08-19 13:44:35 +0200 Arnaud Vrac <avrac@freebox.fr> - - * configure.ac: - * ext/assrender/gstassrender.c: - assrender: render the subtitles with the proper aspect - This bumps the libass version requirement to 0.10.2. - https://bugzilla.gnome.org/show_bug.cgi?id=753824 - -2015-09-07 16:20:42 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - dashdemux: test: added unit test for presentation time offset - https://bugzilla.gnome.org/show_bug.cgi?id=752409 - -2015-09-30 10:27:06 -0700 Aleix Conchillo Flaqué <aleix@oblong.com> - - * configure.ac: - dtls: require openssl >= 1.0.1 - https://bugzilla.gnome.org/show_bug.cgi?id=755892 - -2015-10-02 14:46:59 +0200 Paul Arzelier <paul.arzelier@free.fr> - - * ext/dtls/gstdtlsenc.c: - dtls: fix printf format on win32 - https://bugzilla.gnome.org/show_bug.cgi?id=755981 - -2015-09-30 11:00:39 +0800 John Chang <r97922153@gmail.com> - - * ext/dash/gstisoff.c: - dashdemux: Correctly assign earliest pts instead of overriding it with first offset - https://bugzilla.gnome.org/show_bug.cgi?id=755824 - -2015-09-15 03:14:37 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * ext/qt/gstplugin.cc: - * ext/qt/gstqsgtexture.h: - * ext/qt/gstqtsink.cc: - * ext/qt/qtitem.cc: - * ext/qt/qtitem.h: - qt: add support for building on osx/ios - Including: - - Necessary configure checks - - Necessary compile time platform checks - - Necessary runtime qt iOS/OSX platform detection - https://bugzilla.gnome.org/show_bug.cgi?id=755100 - -2015-09-28 11:29:29 +0100 John Slade <john@jtes.net> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: Fix indentation with gst-indent - https://bugzilla.gnome.org/show_bug.cgi?id=755732 - -2015-10-02 11:31:50 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiovisualizers/Makefile.am: - audiovisualizers: Fix nodist_HEADERS - -2015-10-02 14:56:41 +1000 Jan Schmidt <jan@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/baseaudiovisualizer.c: - Remove baseaudiovisualizer test. - The base class has moved into gst-plugins-base - -2015-09-30 19:05:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Convert GST_ERROR_OBJECT() for seek events to GST_DEBUG_OBJECT() - -2015-09-30 19:03:05 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: For the start time selection, only set the segment position - segment.time and segment.start can stay the same, and were always the same - before anyway because of a mistake. - https://bugzilla.gnome.org/show_bug.cgi?id=755623 - -2015-09-30 19:01:21 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: Select the initial offset based on the start segment position - instead of always using 0. Otherwise we might output a lot of silence in the - beginning instead of outputting from the relevant position. - https://bugzilla.gnome.org/show_bug.cgi?id=755623 - -2015-10-01 15:35:37 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * docs/plugins/Makefile.am: - * gst/audiovisualizers/Makefile.am: - * gst/audiovisualizers/gstaudiovisualizer.c: - * gst/audiovisualizers/gstaudiovisualizer.h: - * gst/audiovisualizers/gstspacescope.h: - * gst/audiovisualizers/gstspectrascope.h: - * gst/audiovisualizers/gstsynaescope.h: - * gst/audiovisualizers/gstwavescope.h: - audiovisualizers: merge audiovisualizer base classes - These plugins now use the audiovisualizer base class in pbutils - https://bugzilla.gnome.org/show_bug.cgi?id=742875 - -2015-10-02 01:01:42 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgldebug.c: - * gst-libs/gst/gl/gstgldebug.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - gl: move debugging related functions to their own file - -2015-10-01 23:20:19 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglcolorscale.c: - glcolorscale: use glbasefilter vfuncs - Uses less code \o/ - Fixes legacy opengl rendering \o/ - -2015-09-16 12:50:46 +0200 Philippe Normand <philn@igalia.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: activate streams before configuring bitrate - Doing the contrary has no effect and the consequence is that playback - will start with the lowest bitrate even if we can already handle - higher bitrate. - https://bugzilla.gnome.org/show_bug.cgi?id=755108 - -2015-06-08 15:33:22 +0200 Philippe Normand <philn@igalia.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: PlayReady WRM parsing support - If the manifest has a ProtectionHeader node then parse it and emit - protection events according to the specified protection SystemID. - https://bugzilla.gnome.org/show_bug.cgi?id=753613 - -2015-09-03 15:11:00 +0200 Philippe Normand <philn@igalia.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: always use timescale for gst timestamp calculation - Not doing this can lead the demuxer to attempt downloading fragments - for an invalid start time. The server would then send a HTTP - Precondition failed error, the demuxer would try some more times to - download the invalid fragment and eventually error out. - https://bugzilla.gnome.org/show_bug.cgi?id=754523 - -2015-09-30 08:36:15 +0200 Antoine Jacoutot <ajacoutot@gnome.org> - - * gst-libs/gst/gl/Makefile.am: - gl: Pass GL_CFLAGS to g-ir-scanner - This unbreaks building when some headers are under a non-standard path. - e.g. /usr/X11R6/include as on OpenBSD. - https://bugzilla.gnome.org/show_bug.cgi?id=755850 - -2015-09-30 00:44:16 -0700 Aleix Conchillo Flaqué <aleix@oblong.com> - - * sys/applemedia/Makefile.am: - applemedia: dist missing header files - https://bugzilla.gnome.org/show_bug.cgi?id=755852 - -2015-09-30 13:13:19 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * tests/check/elements/audiointerleave.c: - audiointerleave: typecast bit-mask to guint64 to fix segmentation fault - While creating caps in audiointerleave tests, bitmask is being set as 0x9 - This is resulting in segmentation fault. Fix the same by typecasting to guint64 - https://bugzilla.gnome.org/show_bug.cgi?id=755840 - -2015-09-30 15:17:38 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: fixup strstr lengths so we don't overrun - -2015-09-30 13:31:50 +1000 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * ext/gl/gstgluploadelement.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * tests/check/libs/gstglupload.c: - glupload: remove useless release_buffer - It's a leftover from when we weren't outputting GstBuffer's and - returning raw texture id's. - -2015-09-30 01:53:53 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglutils.c: - glutils: use gst_element_set_context for setting display/other_context - 1. So we get tracking inside GstElement properly when e.g. adding to a bin - 2. Removes redundant code. Now only one place where - GstContext->GstGLDisplay/GstGLContext transformation occurs - 3. Fixes a memory leak in the process - 4. Make the retrieval of debug categories thread safe - -2015-09-29 22:57:52 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - gtk: add some GL debug statements to show up in GL traces - -2015-08-30 17:11:31 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gstm3u8playlist.c: - * ext/hls/gstm3u8playlist.h: - hls: m3u8playlist: more clean-ups - Remove unused functions; move GstM3U8 struct into .c file, - and indent the header so it's nice to read. - -2015-08-30 17:01:13 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gstm3u8playlist.c: - hls: m3u8playlist: fix silly queue iteration code - -2015-08-30 16:40:02 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gstm3u8playlist.c: - hls: m3u8playlist: more minor playlist_render() clean-ups - Move the TAG defines directly into the code, not sure what - their purposes is, these are printf format strings so having - them directly as literals in the code where they're used - makes the code easier to follow. - -2015-08-30 16:34:26 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gstm3u8playlist.c: - hls: m3u8playlist: move entry rendering into render_playlist() - Makes the code easier to follow and avoids unnecessary temporary - strings, since we can just append to the playlist GString directly. - -2015-08-30 16:24:41 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gstm3u8playlist.c: - * ext/hls/gstm3u8playlist.h: - hls: m3u8playlist: simplify gst_m3u8_playlist_render() - Remove playlist_str GString variable from GstM3U8Playlist struct, - since it's only used temporarily in playlist_render(). Might just - as well keep it local then. - -2015-08-30 15:55:51 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/Makefile.am: - * ext/hls/gstfragmented.h: - * ext/hls/gsthlssink.c: - * ext/hls/gstm3u8playlist.h: - hls: remove unused macro and direct gio usage - -2015-09-30 00:36:14 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: fix downstream key unit events handling with hlssink - The buffer timestamps in the collect function will already be - running time, don't try to convert them again to running time, - this would yield CLOCK_TIME_NONE now that the segment is shifted - to account for negative dts. - This fixes x264enc ! mpegtsmux ! hlssink, which was broken - because mpegtsmux would send a downstream key unit event with - running time NONE and then hlssink would immediately send - another one upstream and it would just be a flood of force - keyframe events in both directions after the first one. This - would then break hlssink because it uses multifilesink in - next-file=key-unit-event mode, and starting a new file after - every few kB does not work well for HLS. - -2015-08-20 17:35:04 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstcverode.c: - opencv: erode: remove non-ip transform func - Transform is set to be done in place in gstcvdilateerode.c, so the in-place - transform function is always used and the other is redundant. Removing it. - https://bugzilla.gnome.org/show_bug.cgi?id=753885 - -2015-08-20 17:23:40 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/opencv/gstcvdilate.c: - opencv: dilate: remove non-ip transform func - Transform is set to be done in place in gstcvdilateerode.c, so the in-place - transform function is always used and the other is redundant. Removing it. - https://bugzilla.gnome.org/show_bug.cgi?id=753885 - -2015-09-29 20:00:02 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstcvdilateerode.c: - * ext/opencv/gstcvequalizehist.c: - * ext/opencv/gstcvlaplace.c: - * ext/opencv/gstcvsmooth.c: - * ext/opencv/gstcvsobel.c: - * ext/opencv/gstretinex.c: - * ext/opencv/gstretinex.h: - * ext/opencv/gstskindetect.c: - opencv: use gst_opencv_video_filter_set_in_place() - Using the gst_base_transform function directly won't work. Need to use - gst_opencv_video_filter_set_in_place(). - -2015-09-29 17:00:22 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gsthanddetect.c: - handdetect: check for haar cascade files path - When running GStreamer from uninstalled sources, the location of the haar - cascade files will be local. Check if running in uninstalled and set the - file paths accordingly. - -2015-09-26 17:02:09 +0800 John Chang <r97922153@gmail.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: remove unused variable - https://bugzilla.gnome.org/show_bug.cgi?id=755656 - -2015-09-29 13:31:18 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: fix compilation with older glib version - Remove weird use of private gtype defines and fix compilation - with older glib versions such as 2.36. - https://bugzilla.gnome.org/show_bug.cgi?id=755754 - -2015-09-29 13:52:47 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstcvlaplace.c: - * ext/opencv/gstcvlaplace.h: - opencv: cvlaplace: add scale and shift properties - Add scale and shift properties so these can be used to tweak the values - used in cvConvertScale() instead of using only defaults. - -2015-08-28 16:24:24 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/qt/gstqtsink.cc: - qtsink: explicitely fallthrough switch statement - In case ret is False, fallthrough to default case. - CID #1320705 - -2015-08-28 16:13:16 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: add break to switch case - Even though all cases inside VC1_STREAM_FORMAT_ASF are goto or - g_assert_not_reached(), add a break at the end to appease Coverity. - CID #1320706 - -2015-09-28 20:56:56 +0200 Arnaud Vrac <avrac@freebox.fr> - - * ext/assrender/gstassrender.c: - assrender: fix leak of tag samples in the tag list - Move handling of a GstSample in a separate function, and unref the - sample after calling it. libass copies the font data so we don't need to - keep it around. - https://bugzilla.gnome.org/show_bug.cgi?id=755759 - -2015-09-28 20:30:17 +0200 Arnaud Vrac <avrac@freebox.fr> - - * ext/assrender/gstassrender.c: - assrender: fix gap event leak and invalid return value - We don't want the gap event to be forwarded - https://bugzilla.gnome.org/show_bug.cgi?id=755759 - -2015-09-29 16:17:22 +1000 Matthew Waters <matthew@centricular.com> - - * sys/nvenc/gstnvbaseenc.c: - nvenc: call the parent class on GstElement::set_context - -2015-09-17 16:59:16 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - gl/eagl: use the default GL context debug category - -2015-07-30 16:42:38 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * sys/Makefile.am: - * sys/nvenc/Makefile.am: - * sys/nvenc/README: - * sys/nvenc/TODO: - * sys/nvenc/gstnvbaseenc.c: - * sys/nvenc/gstnvbaseenc.h: - * sys/nvenc/gstnvenc.c: - * sys/nvenc/gstnvenc.h: - * sys/nvenc/gstnvh264enc.c: - * sys/nvenc/gstnvh264enc.h: - Add Nvidia based hardware encoder element - Currently only h264 is supported - https://bugzilla.gnome.org/show_bug.cgi?id=753405 - -2015-09-29 00:25:00 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gstgtkbasesink.c: - gtk: fix assertion when the element has no peer - When proxying keyboard/navigation/mouse events, only unref a successfully - retreived peer pad. - https://bugzilla.gnome.org/show_bug.cgi?id=755738 - -2015-09-28 15:30:30 +0200 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - * gst/midi/Makefile.am: - * gst/midi/alsamidisrc.c: - * gst/midi/alsamidisrc.h: - * gst/midi/midi.c: - Revert "midi: add an ALSA MIDI sequencer source" - This reverts commit cd7f4e524718a2f75467852235e4e13d64d2ac82. - -2015-09-28 22:31:09 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglutils.c: - gl: set the context on the element on a context query - Otherwise it's possible to lose the context information if the - context is only propagated through queries. - -2015-09-28 22:20:29 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.m: - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglstereosplit.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglbasefilter.c: - gl: chain up to the parent class for GstElement::set_context - https://bugzilla.gnome.org/show_bug.cgi?id=705579 - -2015-08-07 15:28:54 +0200 Antonio Ospite <ao2@ao2.it> - - * configure.ac: - * gst/midi/Makefile.am: - * gst/midi/alsamidisrc.c: - * gst/midi/alsamidisrc.h: - * gst/midi/midi.c: - midi: add an ALSA MIDI sequencer source - The alsamidisrc element allows to get input event from ALSA MIDI - sequencer devices, and possibly convert them to sound using some - downstream element like fluiddec. - https://bugzilla.gnome.org/show_bug.cgi?id=738687 - -2015-08-28 16:35:39 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/qt/qtitem.cc: - qml: remove overwritten value - Value in tex is overwritten before being used. Removing it. - CID 1320715 - https://bugzilla.gnome.org/show_bug.cgi?id=754253 - -2015-09-02 23:45:07 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * ext/qt/Makefile.am: - * ext/qt/gstqsgtexture.h: - * ext/qt/gstqtgl.h: - * ext/qt/qtitem.cc: - * ext/qt/qtitem.h: - qt: add support for building/running on android - Including: - - Necessary configure checks - - Necessary compile time platform checks - - Necessary runtime qt android platform detection - - Escaping GLsync definition with Qt's GLES2 implementation - https://bugzilla.gnome.org/show_bug.cgi?id=754466 - -2015-09-02 23:40:31 +1000 Matthew Waters <matthew@centricular.com> - - * ext/qt/Makefile.am: - qt: don't use CPPFLAGS for tools that cannot use them - For example moc will bail out when given arguments it does not - know about. The moc specific MOC_CPPFLAGS can still be used - to pass flags to moc. - https://bugzilla.gnome.org/show_bug.cgi?id=754466 - -2015-09-02 23:39:54 +1000 Matthew Waters <matthew@centricular.com> - - * ext/qt/Makefile.am: - qt: rename library to include gst prefix - libqtsink -> libgstqtsink - https://bugzilla.gnome.org/show_bug.cgi?id=754466 - -2015-08-31 19:21:54 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstglbasefilter.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglfilter.c: - gl: sprinkle some debug markers to ease debugging - -2015-08-31 19:18:23 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - gl/utils: add a function to insert a debug marker - These markers are visible in tools that record the GL function calls - such as apitrace, et al. - Makes it easier to match up GL draw commands with specific elements. - -2015-08-31 19:17:21 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/glprototypes/debug.h: - gl: add some debugging prototypes - -2015-09-26 19:19:50 +1000 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - glwindow: remove unused draw_unlocked function - The functionality is provided by draw anyway and is leftover from - X11's specific threading requirements that no longer apply. - -2015-09-27 13:07:19 +1000 Jan Schmidt <jan@centricular.com> - - * ext/resindvd/gstmpegdemux.c: - resindvd: Send gap updates to the segment stop during stills - Ignore the normal gap threshold for laggy streams and - immediately catch all streams up to the end of the segment - when processing gap updates for a segment during a - still frame sequence. - https://bugzilla.gnome.org/show_bug.cgi?id=755680 - -2015-09-27 00:24:24 +1000 Jan Schmidt <jan@centricular.com> - - * gst/dvdspu/Makefile.am: - * gst/dvdspu/gstdvdspu-render.c: - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - * gst/dvdspu/gstspu-common.h: - * gst/dvdspu/gstspu-pgs.c: - * gst/dvdspu/gstspu-pgs.h: - * gst/dvdspu/gstspu-vobsub-render.c: - * gst/dvdspu/gstspu-vobsub.c: - * gst/dvdspu/gstspu-vobsub.h: - Revert "dvdspu: render to AYUV overlay" - This reverts commit 5016a73190595505dc38b54f8f9a08c4f180f3a6. - -2015-09-27 00:24:23 +1000 Jan Schmidt <jan@centricular.com> - - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstspu-common.h: - * gst/dvdspu/gstspu-pgs.c: - * gst/dvdspu/gstspu-vobsub-render.c: - Revert "dvdspu: render to ARGB overlay instead of AYUV" - This reverts commit dd3e9deb2aa695a391b58f24d86a3c00bbc1258a. - -2015-09-27 00:24:17 +1000 Jan Schmidt <jan@centricular.com> - - * gst/dvdspu/gstspu-vobsub.c: - * gst/dvdspu/gstspu-vobsub.h: - Revert "dvdspu: handle frame size event from upstream" - This reverts commit 46aaaa6c309b8a8f6e218142fd5944f5d24f095c. - -2015-09-27 00:24:17 +1000 Jan Schmidt <jan@centricular.com> - - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - Revert "dvdspu: cache overlay composition" - This reverts commit aabb8a1a68372f750c63b9b6586e18e829745774. - -2015-09-27 00:24:15 +1000 Jan Schmidt <jan@centricular.com> - - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - Revert "dvdspu: improve negotiation of overlay composition" - This reverts commit 1899e2a099932a7a734e7784c20b624517237e18. - -2015-09-18 19:07:47 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/dvdspu/gstspu-pgs.c: - dvdspu: fix pgs palette colors - U and V were inverted - https://bugzilla.gnome.org/show_bug.cgi?id=755239 - -2014-08-27 16:47:22 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - dvdspu: improve negotiation of overlay composition - Support negotiating GstVideoOverlayComposition downstream - while not providing it upstream. - https://bugzilla.gnome.org/show_bug.cgi?id=663750 - -2013-09-02 17:48:50 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - dvdspu: cache overlay composition - This avoids rendering the overlay buffer for each video frame. - https://bugzilla.gnome.org/show_bug.cgi?id=663750 - -2013-08-30 22:08:01 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/dvdspu/gstspu-vobsub.c: - * gst/dvdspu/gstspu-vobsub.h: - dvdspu: handle frame size event from upstream - An IDX file or codec_data normally contains the original frame size of - the video. Allow upstream to provide this information by sending a - custom event, which will allow scaling the overlay correctly. - https://bugzilla.gnome.org/show_bug.cgi?id=663750 - -2013-12-05 21:59:18 +0100 Arnaud Vrac <avrac@freebox.fr> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: allow suffix in dvd event name to allow multiple sticky dvd events - https://bugzilla.gnome.org/show_bug.cgi?id=663750 - -2015-04-07 14:38:08 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstspu-common.h: - * gst/dvdspu/gstspu-pgs.c: - * gst/dvdspu/gstspu-vobsub-render.c: - dvdspu: render to ARGB overlay instead of AYUV - https://bugzilla.gnome.org/show_bug.cgi?id=663750 - -2013-01-23 17:59:01 +0100 Arnaud Vrac <avrac@freebox.fr> - - * gst/dvdspu/Makefile.am: - * gst/dvdspu/gstdvdspu-render.c: - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - * gst/dvdspu/gstspu-common.h: - * gst/dvdspu/gstspu-pgs.c: - * gst/dvdspu/gstspu-pgs.h: - * gst/dvdspu/gstspu-vobsub-render.c: - * gst/dvdspu/gstspu-vobsub.c: - * gst/dvdspu/gstspu-vobsub.h: - dvdspu: render to AYUV overlay - Instead of only supporting writing SPU data directly to YUV frames, - render the SPU data to an intermediate AYUV overlay buffer. The overlay - data is then attached to the video frame if downstream supports overlay - composition, otherwise the AYUV overlay is blended to the video frame. - For the PGS format, the overlay buffer size is set to the size of the - Composition Window, and its position in the overlay composition is set - to the window position. The objects to render are now cropped when the - cropping flag is set. - For the Vobsub format, the overlay buffer size is set to the size of the - Display Area. - Once rendered, the overlay composition rectangle is now moved and scaled - to fit the video output size, to avoid clipping. - https://bugzilla.gnome.org/show_bug.cgi?id=663750 - -2013-09-02 17:07:49 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: pass dvdspu argument to set_caps functions - https://bugzilla.gnome.org/show_bug.cgi?id=663750 - -2015-09-18 19:15:45 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/dvdspu/gstspu-pgs.c: - dvdspu: skip unneeded reading of RLE data - The RLE data was being read for dumping the SPU image even when the - DUMP_FULL_IMAGE macro was not set. - https://bugzilla.gnome.org/show_bug.cgi?id=663750 - -2015-08-29 19:16:38 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * tests/check/elements/compositor.c: - check: Add test for videoaggregator sinkpads being sorted by zorder - https://bugzilla.gnome.org/show_bug.cgi?id=754285 - -2015-09-26 10:21:41 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiomixer/gstaudioaggregator.c: - audiomixer: fix deadlock when G_DISABLE_ASSERT is not defined - This makes the audiomixer unit test time out in master. - Broke with 587e7c4 - -2015-09-26 10:49:31 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/dash_mpd.c: - dash: Fix unit test after internal API change - -2015-08-25 17:39:30 +0900 Jimmy Ohn <yongjin.ohn@lge.com> - - * ext/sndfile/gstsfdec.c: - sfdec: Fix typo in goto variable name - https://bugzilla.gnome.org/show_bug.cgi?id=754057 - -2015-08-18 14:16:11 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: create src pads for subtitle streams. - Create src pads for Representations that contain timed-text subtitles, - both when the subtitles are encapsulated in ISO BMFF (i.e., the - Representation has mimeType "application/mp4") and when they are - unencapsulated (i.e., the Representation has mimeType - "application/ttml+xml"). - https://bugzilla.gnome.org/show_bug.cgi?id=747774 - -2015-09-26 00:17:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: Stop using deprecated gst_segment_to_position() - -2015-08-31 16:12:40 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Don't forward QOS events to sinkpads that had no buffer yet - Otherwise they will receive a QOS event that has earliest_time=0 (because we - can't have negative timestamps), and consider their buffer as too late - https://bugzilla.gnome.org/show_bug.cgi?id=754356 - -2015-09-22 16:17:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * tests/check/elements/dash_mpd.c: - dashdemux: Implement lazy-loading of external periods - https://bugzilla.gnome.org/show_bug.cgi?id=752230 - -2015-09-21 21:05:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Load OnLoad external resources immediately instead of on demand - https://bugzilla.gnome.org/show_bug.cgi?id=752230 - -2015-09-08 13:36:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Add support for loading external SegmentLists - https://bugzilla.gnome.org/show_bug.cgi?id=752230 - -2015-09-08 13:04:11 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Add support for loading external AdaptationSets - https://bugzilla.gnome.org/show_bug.cgi?id=752230 - -2015-08-21 16:40:10 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Implement loading of external Period nodes - The same has to be done for AdaptationSet and SegmentList nodes still. - Also this does not correctly implement the semantics: by default Period (and - other nodes) should only be loaded when needed, not in the very beginning. We - need to implement lazy loading for them, which means adjusting - gst_mpd_client_setup_media_presentation(). - https://bugzilla.gnome.org/show_bug.cgi?id=752230 - -2015-08-21 12:06:07 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * tests/check/Makefile.am: - mpdparser: Store an URI downloader in the parser for downloading additional MPD resources if needed - https://bugzilla.gnome.org/show_bug.cgi?id=752230 - -2015-07-10 18:56:29 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - mpdparser: Parse xlink attributes from Period, AdaptationSet and SegmentList - We still have to do something useful with them, like actually loading the - content behind the URL. - https://bugzilla.gnome.org/show_bug.cgi?id=752230 - -2015-09-16 23:38:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Properly handle relative and non-HTTP URIs for the headers/indices - gst_uri_join_strings() will return the second parameter if it is an absolute - URI. No need to do a (wrong) check if the URI is absolute or not beforehand. - https://bugzilla.gnome.org/show_bug.cgi?id=755134 - -2015-09-16 23:12:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: If no Initialization is present in the SegmentBase, assume it is before the indexRange - https://bugzilla.gnome.org/show_bug.cgi?id=755132 - -2015-09-25 23:51:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -=== release 1.6.0 === - -2015-09-25 23:33:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.6.0 - -2015-09-25 23:01:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2015-09-25 10:32:00 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: use GL_ELEMENT_ARRAY_BUFFER for vbo indices - Fixes this error with chromium gpu process: - GL_INVALID_OPERATION, glBindBuffer: buffer bound to more than 1 target - https://bugzilla.gnome.org/show_bug.cgi?id=755618 - -2015-09-17 14:17:09 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: fix texture leak in _gl_mem_copy - https://bugzilla.gnome.org/show_bug.cgi?id=755456 - -2015-09-24 18:51:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gtk/gstgtkbasesink.c: - gtk: Only run from the main thread in stop() if we created the window - We're not doing anything at all from the main thread in other cases. - -2015-09-24 15:52:40 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gtk/gtkgstbasewidget.c: - gtk: When setting format check if pending format changed - In case the format changed fast and the pending format is different - than the currently set but the currently set is equal to the pending - one we could end up having mismatch between the finally set format - and the data stream format. - https://bugzilla.gnome.org/show_bug.cgi?id=755542 - -2015-09-24 15:51:28 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gtk/gstgtkbasesink.c: - gtk: Do not forget to release OBJECT_LOCK on error path - https://bugzilla.gnome.org/show_bug.cgi?id=755542 - -2015-09-24 11:37:04 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gtk/Makefile.am: - * ext/gtk/gstgtkbasesink.c: - * ext/gtk/gstgtkutils.c: - * ext/gtk/gstgtkutils.h: - * ext/gtk/gtkgstglwidget.c: - gtk: Factor out a function to run a function on main thread - https://bugzilla.gnome.org/show_bug.cgi?id=755251 - -2015-09-24 10:51:31 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gtk/gstgtkbasesink.c: - gtk: Marshall state changes in the main thread - Gtk is not MT safe thus we need to make sure that everything is done - in the main thread when working with it. - https://bugzilla.gnome.org/show_bug.cgi?id=755251 - -2015-09-23 15:56:26 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Add a clock epoch that is used as offset whenever restarting the clock - Otherwise we're going to return times starting at 0 again after shutting down - an element for a specific input/output and then using it again later. - https://bugzilla.gnome.org/show_bug.cgi?id=755426 - -2015-09-22 19:35:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Disable inputs/outputs in PAUSED->READY to allow going to PAUSED again from there - https://bugzilla.gnome.org/show_bug.cgi?id=755426 - -2015-09-23 11:42:51 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gtk/gstgtkbasesink.c: - gtksink: Do not show window until we reach the PAUSED state - https://bugzilla.gnome.org/show_bug.cgi?id=755459 - -2015-09-22 14:43:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Only check stream->segments for a repeated last segment if we have a static list of segments - Otherwise we'll crash, trying to derefence NULL. And if we have no static list - of segments, we can't have repeated segments anyway. - Regression introduced by cfe2871a5e3c5b1db20470927642b776e055a87a - https://bugzilla.gnome.org/show_bug.cgi?id=755411 - -2015-09-21 19:02:08 +0530 Arun Raghavan <git@arunraghavan.net> - - * ext/x265/gstx265enc.c: - x265enc: Drop incorrect stream-format="avc" in template caps - -2015-09-21 10:47:15 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gtk/gstgtkbasesink.c: - gtksink: Do not re destroy the GtkWindow if destroyed by the user - Otherwise we will get an ASSERT. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=755249 - -2015-09-21 08:04:40 +0000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - gl/dispmanx: fix rendering with recent resize state tracking - 557ca6fda5f831be4aba5819bf7b30b296e575cd didn't change to the - necessary gst_gl_window_resize() call for the dispmanx backend. - -2015-09-19 11:46:37 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gtk/gstgtkbasesink.c: - * ext/gtk/gstgtkbasesink.h: - * ext/gtk/gstgtkglsink.c: - gtkglsink: Hide and clean the GtkWindow we might create - When stopping the sink we should always hide the window. - https://bugzilla.gnome.org/show_bug.cgi?id=755249 - -=== release 1.5.91 === - -2015-09-18 19:51:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.5.91 - -2015-09-18 19:31:06 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2015-09-18 18:00:05 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: Only skip the remaining part of a GAP buffer - We might've queued up a GAP buffer that is only partially inside the current - output buffer (i.e. we received it too late!). In that case we should only - skip the part of the GAP buffer that is inside the current output buffer, not - also the remaining part. Otherwise we forward this pad too far into the future - and break synchronization. - -2015-09-18 21:14:46 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: disable the texture cache on OSX - This a workaround until the incompatibility with CVOpenGLTextureCache - and opengl3 contexts is fixed. - https://bugzilla.gnome.org/show_bug.cgi?id=754786 - -2015-09-17 19:42:34 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Keep at least two buffers in the queue in live mode - When in live mode, the queue needs to hold the currently processed - buffer and one more at least. - https://bugzilla.gnome.org/show_bug.cgi?id=754851 - -2015-09-18 11:55:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/zh_CN.po: - po: Update translations - -2015-09-18 15:28:27 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: gst-indent file - -2015-09-17 19:56:47 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/dvdspu/gstspu-pgs.c: - dvdspu: pgs: fix printf format/argument mismatch in debug statements - Fixes compiler warnings when extra debugging is enabled at compile time. - -2015-09-17 17:54:36 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: remove unprefix STATISTICS_MESSAGE_NAME after all - It was only added during 1.5.x so we might just as well remove it - immediately. - https://bugzilla.gnome.org/show_bug.cgi?id=754686 - -2015-09-07 16:57:05 +0200 Philippe Normand <philn@igalia.com> - - * ext/hls/gsthlsdemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: prefix the statistics message name macro - Keep old define around for now. - https://bugzilla.gnome.org/show_bug.cgi?id=754686 - -2015-09-18 00:10:10 +1000 Jan Schmidt <jan@centricular.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: Hook up the recently added change_state vfunc. - The state change function was implemented, but not installed, - making the compiler complain about the unused function. - -2015-09-18 00:20:13 +1000 Jan Schmidt <jan@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - * ext/dts/gstdtsdec.c: - * ext/gl/gstglstereomix.c: - * gst/audiomixer/gstaudioaggregator.c: - Don't throw compiler warnings with G_DISABLE_ASSERT - Disable code that warns about unused variables when G_DISABLE_ASSERT - is defined, as it is in tarballs and pre-releases. - -2015-09-17 22:17:24 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - gl/caopengllayer: fix non-existent selector warning - 557ca6fda5f831be4aba5819bf7b30b296e575cd introduced the queueResize - call without implementing the selector - -2015-09-17 21:31:39 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: Fix g_return_val_if_fail in a void function - -2015-09-17 15:06:31 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/vtdec.c: - applemedia/vtdec: fix negotiation errors when resizing glimagesink - GstVideoDecoder has its own logic for detecting when to reconfigure - which ultimately calls decide_allocation and results in a new - texture cache that has not been configured from our reconfigure check. - https://bugzilla.gnome.org/show_bug.cgi?id=755156 - -2015-09-17 17:22:47 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: request a resize on caps/3d mode changes - Fixes incorrect aspect ratio on OSX when changing caps or the 3d - output mode. - https://bugzilla.gnome.org/show_bug.cgi?id=755111 - -2015-09-17 17:06:37 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.h: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - glwindow: add API to request a resize event on the next draw - - glimagesink needs to be able to resize the viewport on aspect ratio - changes resulting from either caps changes or 3d output mode changes. - - Performing a glViewport outside the GstGLWindow::resize callback - will not have the winsys' stack of viewports required to correctly - place the output frame. - Provide a function to request a resize on the next draw event from the - winsys. - Also track size changes inside the base GstGLWindow class rather - than in each subclass. - https://bugzilla.gnome.org/show_bug.cgi?id=755111 - -2015-09-17 16:55:11 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgluploadelement.c: - gl/uploadelement: fail earlier if we could not upload the buffer - -2015-09-17 16:05:21 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl/x11: store the correct dimension from the resize events - small typo s/width/height/ - -2015-09-17 13:47:23 +0900 Vineeth T M <vineeth.tm@samsung.com> - - * sys/bluez/gstavdtputil.c: - avdtputil: fix GError memory leak during failures - https://bugzilla.gnome.org/show_bug.cgi?id=755142 - -2015-09-17 13:35:02 +0900 Vineeth T M <vineeth.tm@samsung.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglstereosplit.c: - * ext/gl/gstgltestsrc.c: - * ext/gtk/gtkgstglwidget.c: - * gst-libs/gst/gl/gstglbasebuffer.c: - * gst-libs/gst/gl/gstglbasefilter.c: - * gst-libs/gst/gl/gstglfilter.c: - gl: Fix GError leaks during failures - https://bugzilla.gnome.org/show_bug.cgi?id=755140 - -2015-09-16 00:19:35 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosink.h: - intervideosink: render preroll frames as well - Derive from GstVideoSink so that preroll frames will automatically - get rendered too, unless the show-preroll-frame property is set to - FALSE. Fixes intervideosrc only picking up frames if intervideosink - is in PLAYING state. - https://bugzilla.gnome.org/show_bug.cgi?id=755049 - -2015-09-17 00:01:58 +1000 Jan Schmidt <jan@centricular.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Check if downstream supports GstVideoOverlayComposition. - Fix the negotiation of GstVideoOverlayComposition by checking - intersection with the peer caps, rather than just accept-caps, - which might only check the pad template. - https://bugzilla.gnome.org/show_bug.cgi?id=755113 - -2015-09-09 14:49:17 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstmpdparser.c: - mpdparser: support for negative repeat count in segments - Implements negative repeat segment fields, defined in 5.3.9.6.1. - -2015-09-08 15:14:13 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - mpdparser: properly read signed r values for S elements - The spec defines these as signed in 5.3.9.6.1. - Since we don't support this behavior, warn and default to 0 - (non repeating), which is the spec's default when the value - is not present. - https://bugzilla.gnome.org/show_bug.cgi?id=752480 - -2015-09-09 11:05:35 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstmpdparser.c: - mdpparser: catch failures to parse - https://bugzilla.gnome.org/show_bug.cgi?id=752480 - -2015-09-16 17:28:05 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: avoid updating the viewport in the draw loop - Fixes flashes/incorrect aspect ratio when resizing glimagesink on OSX. - -2015-09-15 21:50:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Fix playback of live streams - dashdemux seeks each live stream to its current fragment in the beginning, but - the base class does not know about this. Update the demuxer segment with this - seek so we generate the correct SEGMENT event and can actually play the - stream. - This needs some refactoring at some point. - https://bugzilla.gnome.org/show_bug.cgi?id=755047 - -2015-09-15 15:39:11 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/opus/gstopusdec.c: - opusdec: remove check for number of channels - opus decoder can convert from different number of channels, no - need to check, just let it negotiate and create a new decoder if - needed. - https://bugzilla.gnome.org/show_bug.cgi?id=755059 - -2015-09-15 10:00:43 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Only overwrite last return if it was OK - Prevents overwriting other conditions that would be more important, - such as EOS. - https://bugzilla.gnome.org/show_bug.cgi?id=755042 - -2015-09-15 09:58:20 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: fix return when trying to advance in subfragmented stream - Even if it doesn't actually advance the subfragment in the default way - for streams that have subfragments, it can help the base class to return - EOS when there is no more fragments instead of signaling it that it should - continue downloading. - https://bugzilla.gnome.org/show_bug.cgi?id=755042 - -2015-09-15 11:34:12 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglmemory.c: - gl: bufferpool take into account video stride alignment requirements - when allocating memory. Fixes crashes with avdec_h265 in the AVX2 - code path which requires 32-byte stride alignment, but the - GstAllocationParams only specified a 16-byte alignment. - https://bugzilla.gnome.org/show_bug.cgi?id=754120 - -2015-09-15 13:40:58 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/soundtouch/gstpitch.cc: - pitch: Set seqnum on newly created segment event - https://bugzilla.gnome.org/show_bug.cgi?id=755012 - -2015-09-11 21:37:08 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: Fix mixup of running times and segment positions - We have to queue buffers based on their running time, not based on - the segment position. - Also return running time from GstAggregator::get_next_time() instead of - a segment position, as required by the API. - Also only update the segment position after we pushed a buffer, otherwise - we're going to push down a segment event with the next position already. - https://bugzilla.gnome.org/show_bug.cgi?id=753196 - -2015-09-11 16:56:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: Use stream time in the position query instead of segment position - https://bugzilla.gnome.org/show_bug.cgi?id=753196 - -2015-09-11 12:22:51 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Fix mixup of running times and segment positions - We have to queue buffers based on their running time, not based on - the segment position. - Also return running time from GstAggregator::get_next_time() instead of - a segment position, as required by the API. - Also only update the segment position after we pushed a buffer, otherwise - we're going to push down a segment event with the next position already. - https://bugzilla.gnome.org/show_bug.cgi?id=753196 - -2015-09-11 12:21:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.h: - aggregator: Document that get_next_time() should return running time - https://bugzilla.gnome.org/show_bug.cgi?id=753196 - -2015-09-03 14:20:00 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - mpdparser: Don't consider period start times in periods with segment lists either - https://bugzilla.gnome.org/show_bug.cgi?id=754222 - -2015-09-03 10:26:03 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/dash_mpd.c: - mpdparser: Fix unit test that assumed that fragment timestamps should include the period start timestamp - https://bugzilla.gnome.org/show_bug.cgi?id=754222 - -2015-09-02 18:33:51 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: Export the period start time to the base class - https://bugzilla.gnome.org/show_bug.cgi?id=754222 - -2015-09-02 18:29:43 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Properly implement timestamping of multi-period streams - Each period will start again with pts 0 + period presentation offset, which is - also going to be the presentation time inside the container stream if any. - However all periods together should form a continuous timeline, with regard to - stream time and running time. - For making this possible we keep track of the "user requested segment", i.e. - the seek events, inside the demuxer without adjusting anything and taking this - demuxer segment only as orientation for modified segments per stream. - This per stream segments will have their segment.start at pts that would be - produced for this stream in this period, and the segment.base/time adjusted so - that this pts maps to the running and stream time this period should have in - the context of all other periods. - https://bugzilla.gnome.org/show_bug.cgi?id=754222 - -2015-09-01 13:13:58 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - Revert "dashdemux: Subtract the period start time from the presentation offset" - This reverts commit 626a8f0a74f8ea748b811b74ba9e7ae2baea2cca. - This allows us to get the plain presentation offset and the period start time - separately. We have to adjust the timestamp by the presentation offset, but - the period start time should only adjust the stream time and running time. - https://bugzilla.gnome.org/show_bug.cgi?id=752409 - -2015-09-01 13:12:45 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - Revert "dashdemux: Include the period start in the fragment timestamps in all cases" - This reverts commit e671ad25a989cb21c62c7a5867c2090890ce49ba. - The timestamps should restart at 0 again for each period, but we have to - adjust the segment to map those timestamps to the actual stream time and - running time of that period. - Otherwise we would have timestamps that conflict with the ones from the tfdt - inside the MP4 container, which are restarting at 0 for each period. - https://bugzilla.gnome.org/show_bug.cgi?id=752409 - -2015-09-14 19:03:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Consider the repeat count when checking if a segment is the last one - Otherwise we play only the first repetition of the last segment and then EOS. - https://bugzilla.gnome.org/show_bug.cgi?id=752480 - -2015-09-14 13:56:10 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: also check for subfragments on has_next_fragment - In dash isombff profile the fragment is split into subframents where - bitrate switching is possible. Also take that into consideration - when checking if a stream has next fragments. - -2015-09-11 11:22:35 +0200 Miguel París Díaz <mparisdiaz@gmail.com> - - * ext/opus/gstopusenc.c: - opusenc: improve deprecated properties docs - https://bugzilla.gnome.org/show_bug.cgi?id=754819 - -2015-09-11 11:11:09 +0200 Miguel París Díaz <mparisdiaz@gmail.com> - - * ext/opus/gstopusenc.c: - opusenc: do not throw g_warning when getting deprecated properties - https://bugzilla.gnome.org/show_bug.cgi?id=754819 - -2015-09-09 19:51:18 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - videoaggregator: fix caps query to properly handle alpha formats - Only accept alpha if downstream has alpha as well. It could - theoretically accept alpha unconditionally if blending is - properly implemented for handle it but at the moment this - is a missing feature. - Improves the caps query by also comparing with the template - caps to filter by what the subclass supports. - https://bugzilla.gnome.org/show_bug.cgi?id=754465 - -2015-09-12 00:51:52 +1000 Jan Schmidt <jan@centricular.com> - - * sys/applemedia/corevideotexturecache.m: - vtdec: Use R/RG textures for NV12 when the context provides them - Fixes playback to GL memory on iOS, where the colours are messed - up by passing Luminance/LuminanceAlpha textures where - color convert expects R/RG textures. - https://bugzilla.gnome.org/show_bug.cgi?id=754504 - -2015-09-08 17:17:36 +1000 Jan Schmidt <jan@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: Prefer GL output caps. - Prefer GL caps by putting them first in the pad template and - intersecting using GST_CAPS_INTERSECT_FIRST. - -2015-09-10 19:02:12 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparsers: h265: Fix the selection of Active Ref Pic Set - If short_term_ref_pic_set_sps_flag is FALSE, the ShortTermRefPicSet - structure is supposed to derive from slice header. Which means, - CurrRpsIdx is equal to num_short_term_ref_pic_sets. But the number - of refpicsets communicated via sps header is only num_short_term_ref_pic_sets - 1. - And we are using slice_header structure to reference the last entry, which is - ShortTermRefPicSetnum_short_term_ref_pic_sets. - https://bugzilla.gnome.org/show_bug.cgi?id=754834 - -2015-09-10 16:28:31 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparsers: h265 : Fix default scaling list values - Fix the default_scaling_list values based on Table 7-6 - https://bugzilla.gnome.org/show_bug.cgi?id=754834 - -2015-09-10 14:11:58 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: less-than-zero comparison of an unsigned value is never true - Use the correct type, GstClockTimeDiff, instead. - CID 1323742 - -2015-09-10 00:07:18 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * ext/gtk/gtkgstglwidget.c: - * ext/qt/qtitem.cc: - gtk, qt: more specifically define the compile time requirements - Otherwise we could include headers/configurations that will - never been installed. - https://bugzilla.gnome.org/show_bug.cgi?id=754732 - -2015-09-02 23:42:34 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - build/qt: indent configure file - don't mix tabs and spaces - https://bugzilla.gnome.org/show_bug.cgi?id=754466 - -2015-09-10 00:00:11 +1000 Matthew Waters <matthew@centricular.com> - - * ext/qt/gstqsgtexture.cc: - qt: use our function table instead of directly calling gl functions - Otherwise when building with --as-needed we would need to link to - a GL or GLES library. - https://bugzilla.gnome.org/show_bug.cgi?id=754732 - -2015-09-09 23:53:57 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglapi.h: - gl/api: use public rather than private define - HAVE_IOS is only defined for the build of this module so - attempting to use gstgl in iOS would result in incorrect GL - includes. - Use GST_GL_HAVE_PLATFORM_EAGL instead for choosing the iOS GL - header. - -2015-09-03 16:36:57 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Handle pipelines where the running time does not start around 0 properly - We were converting all times to our internal running times, that is the time - the sink itself spent in PLAYING already. But forgot to do that for the - running time calculated from the buffer timestamps. As such, all buffers were - scheduled much later if the pipeline's running time did not start at 0. - This happens for example if a base time is explicitly set on the pipeline. - https://bugzilla.gnome.org/show_bug.cgi?id=754528 - -2015-09-07 13:36:19 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Consider pipeline latency, render delay and ts offset when scheduling frames - Without this, we will schedule all frames too late in live pipelines. - https://bugzilla.gnome.org/show_bug.cgi?id=754666 - -2015-09-09 13:58:05 +0900 Kouhei Sutou <kou@clear-code.com> - - * sys/directsound/gstdirectsoundsrc.c: - directsoundsrc: fix build error for 64bit Windows build by MinGW - Casting to UINT from HMIXER generates the following warning with - 64bit Windows target MinGW: - gstdirectsoundsrc.c: In function 'gst_directsound_src_mixer_find': - gstdirectsoundsrc.c:733:30: error: cast from pointer to integer of different size -Werror=pointer-to-int-cast - mmres = mixerGetDevCaps ((UINT) dsoundsrc->mixer, - ^ - cc1: all warnings being treated as errors - We can use portable GPOINTER_TO_UINT() macro for this propose. - https://bugzilla.gnome.org/show_bug.cgi?id=754756 - -2015-09-09 09:33:01 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - gl/eagl: Also unbind renderbuffer after setting up framebuffer - https://bugzilla.gnome.org/show_bug.cgi?id=754757 - -2015-09-09 09:27:17 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - gl/eagl: Don't make context uncurrent just to make it current again in the next line - Also binding the framebuffer again is unnecessary then as it was just bound a - few lines before while the context was current. - https://bugzilla.gnome.org/show_bug.cgi?id=754757 - -2015-09-07 12:09:41 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstmpdparser.c: - mpdparser: fix period start time scaling - This GstStreamPeriod start value is expressed in nanoseconds, - and the glib time addition function expects microseconds. - There seems to have been a confusion with GstPeriodNode's start - field, which is expressed in milliseconds. - Additionally, add a warning if the timestamp modification did - not succeed, and NULL was returned. - -2015-09-05 23:38:44 +1000 Jan Schmidt <jan@centricular.com> - - * ext/faac/gstfaac.c: - faac: Add bitrate info to the tags output. - Makes it possible for muxers to know the target bitrate as soon - as encoding starts, which flvmux now uses. - -2015-09-05 01:50:41 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/compositor/compositor.c: - * tests/check/elements/compositor.c: - compositor: Ensure all arguments to CLAMP are signed int - If any of the arguments to CLAMP are unsigned integers, the comparison causes - an automatic conversion of the signed int to unsigned, which causes -1 to become - UINT_MAX and get clamped to the high value of the CLAMP instead of 0. - See 716 at http://c0x.coding-guidelines.com/6.3.1.8.html - Also add a test for this. - https://bugzilla.gnome.org/show_bug.cgi?id=754576 - -2015-09-04 15:43:40 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gtk/gtkgstbasewidget.c: - gtk: Do not consider GtkEvents as handled - Applications might still want to use them - after the sink transformed them into - GstNavigation events - -2015-09-02 19:16:56 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: lift restriction of changing pixel-aspect-ratio - The videoaggregator can convert PAR, there is no reason for - restricting it. - https://bugzilla.gnome.org/show_bug.cgi?id=754291 - -2015-08-07 17:27:48 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * configure.ac: - * ext/qt/qtitem.cc: - qmlsink: Ensure that at least one windowing system is available - Otherwise, we'll just crash at runtime because the gl context is NULL - https://bugzilla.gnome.org/show_bug.cgi?id=754108 - -2015-08-28 20:33:40 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: Reset state on flush and state changes - https://bugzilla.gnome.org/show_bug.cgi?id=753152 - -2015-08-31 18:06:31 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - * ext/qt/gstqtsink.cc: - * ext/qt/qtitem.cc: - * gst-libs/gst/gl/gstglcontext.c: - gtk, qt, gl: fix typo in debug and error messages - -2015-08-28 23:05:20 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Also ignore start-time on seek from gst_element_send_event() - https://bugzilla.gnome.org/show_bug.cgi?id=753806 - -2015-08-29 16:51:08 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/compositor/compositor.c: - compositor: variables in clamp_rectangle() should be signed - x/y/w/h are signed integers. As can be seen in GstCompositorPad. - The prototype for clamp_rectangle was wrong. This commit reverts the change - and fixes the prototype. - This reverts commit bca444ea4a84c39e9989681f892f6e4cb2033cf9. - -2015-08-28 19:55:59 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - * gst/mpegdemux/gstmpegdemux.c: - * sys/pvr2d/pvr_includes/dri2_ws.h: - * sys/pvr2d/pvr_includes/img_defs.h: - * sys/pvr2d/pvr_includes/img_types.h: - * sys/pvr2d/pvr_includes/pvr2d.h: - * sys/pvr2d/pvr_includes/servicesext.h: - * sys/pvr2d/pvr_includes/wsegl.h: - * sys/uvch264/gstuvch264_mjpgdemux.c: - Fix file permissions of some files - -2015-08-28 15:21:11 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/compositor/compositor.c: - compositor: remove check for below zero for unsigned value - CLAMP checks both if value is '< 0' and '> max'. Value will never be a negative - number since it is an unsigned integer. Removing that check and only checking if - it is bigger than max by using MIN(). - CID 1320707 - -2015-08-28 13:42:29 +0200 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstedgedetect.cpp: - edgedetect: Rename gstedgedetect.c to gstedgedetect.cpp for consistency. - Change the file extension to cpp and add it into Makefile for consistency - with other elements of opencv. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-08-27 21:51:52 +0200 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/gstedgedetect.c: - edgedetect: remove unused and useless functions. - The cvSmooth cvNot functions and do not have the correct input parameters. - Furthermore, cvSmooth function is not necessary for edge detection, - because the Canny function makes the step of smoothing the image. - And cvNot function is useless because there aren't changes if this - function is eliminated. - https://bugzilla.gnome.org/show_bug.cgi?id=754148 - -2015-08-26 18:40:35 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/opencv/gsttextoverlay.c: - * ext/opencv/gsttextoverlay.h: - textoverlay: remove unused variable - Memory is reserved for this variable but never used. Removing it. - -2015-08-26 18:21:15 +0200 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/gstfaceblur.cpp: - * ext/opencv/gstfaceblur.h: - faceblur: remove unused variable. - Memory is reserved for this variable and then released without making any - use of it. - https://bugzilla.gnome.org/show_bug.cgi?id=753994 - -2015-08-26 17:56:50 +0200 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/gstfaceblur.cpp: - * ext/opencv/gstfaceblur.h: - faceblur: need to migrate to C++. - The cascade classifier changes its structure on new version of OpenCV 2.4.11. - It is need to migrate to C++ to utilize the new load method of OpenCV which - allows to load the old and new classifiers. - https://bugzilla.gnome.org/show_bug.cgi?id=753994 - -2015-08-26 12:47:58 +0200 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/gstfaceblur.cpp: - faceblur: Check CvHaarClassifierCascade is release before being modified. - For PROP_PROFILE case that exist inside gst_face_blur_set_property - function loads the new XML file in the CvHaarClassifierCascade property - without first checking that it is released because maybe there is an XML - file previously loaded. - https://bugzilla.gnome.org/show_bug.cgi?id=753994 - -2015-08-26 12:27:15 +0200 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/gstfaceblur.cpp: - faceblur: Code refactoring of gst_face_blur_load_profile. - Changes inside the gst_face_blur_load_profile function, the number of - input parameters and in lines where it is used due to it cannot be used - generically. - https://bugzilla.gnome.org/show_bug.cgi?id=753994 - -2015-08-26 11:57:24 +0200 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstfaceblur.cpp: - faceblur: Change gstfaceblur to C++. - Change the gstfaceblur.c file to cpp and add it into Makefile. - It is necessary to migrate the faceblur plugin to C++, - in order to load new and old classifiers, to make faceblur work - with newer versions of Opencv. - https://bugzilla.gnome.org/show_bug.cgi?id=753994 - -2015-08-27 11:10:05 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Fix caps memory leak by making static caps actually static - See https://bugzilla.gnome.org/show_bug.cgi?id=754157 - -2015-08-21 16:13:43 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: don't meddle with the class struct from an instance - Fix some very dubious code. The class methods should always - be set, and the instance-specific check should then be done - inside the method. For data_received that's there already, for - finish_fragment we need to add it. - https://bugzilla.gnome.org/show_bug.cgi?id=753937 - -2015-08-26 10:52:46 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - h264parse/h265parse: Fix negotiation crash - As it's recursive, gst_pad_get_allowed_caps() may also return - empty for anything incompatible downstream. EMPTY is not valid caps - value for gst_caps_fixate(). This lead to assertion and then crash. - Ideally, the negotiate function should be re-factored to have a return - value, and we could make the negotiation fails earlier. - https://bugzilla.gnome.org/show_bug.cgi?id=754122 - -2015-08-26 15:40:16 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/compositor/compositor.c: - * tests/check/elements/compositor.c: - compositor: Actually use the output resolution for clamping - The obscured check in compositor was using the dimensions of the pad to clamp - the h/w of the pad instead of the output resolution, and was doing an incorrect - calculation to do so. Fix that by simplifying the whole calculation by using - corner coordinates. Also add a test for this bug which fell through the cracks, - and just skip all the obscured tests if the pad's alpha is 0.0. - https://bugzilla.gnome.org/show_bug.cgi?id=754107 - -2015-08-24 07:46:27 +0300 XuGuangxin <Guangxin.Xu@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - codecparsers: h265: Fix tile row and column parsing - Section 6.5.1: Coding tree block raster and tile scanning conversion process - Follow the equations 6-3 and 6-4 - This will provide correct offset_max in slice_header for parsing - num_entry_point_offsets. - https://bugzilla.gnome.org/show_bug.cgi?id=754024 - Signed-off-by: Sreerenj Balachandran <sreerenj.balachandran@intel.com> - -2015-08-07 12:53:23 +0300 Athanasios Oikonomou <athoik@gmail.com> - - * ext/hls/m3u8.c: - hlsdemux: select correct position for live streams that don't remove fragments - Some live streams (eg youtube) don't remove fragments in order to allow - seeking back in time (live + vod). - When gst_m3u8_client_has_next_fragment is called, we are getting wrong fragment - because current_file points in first file of the fragments list resulting in - watching the stream from the beginning again. - This patch sets current_file to nth fragment for live streams, then on - gst_m3u8_client_has_next_fragment will keep up with the live stream. - https://bugzilla.gnome.org/show_bug.cgi?id=753344 - -2015-08-24 19:47:01 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstgluploadelement.c: - glupload: Use base class metadata copy function - This allow properly copying selected meta, like the composition - overlay. Note that output buffer need to be readable, but GlUpload - keeps a ref. For now, simply drop GlUpload ref after perform, - leaving that ref has no purpose. The method shall be removed - in the future. - https://bugzilla.gnome.org/show_bug.cgi?id=754047 - -2015-08-24 19:28:10 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglcolorconvertelement.c: - glcolorconvert: Use base transform metadata copy - Use base class default method instead of only copying flags and - timestamp. This way, selected meta's like compostion overlay will - be passed downstream as expected. - https://bugzilla.gnome.org/show_bug.cgi?id=754047 - -2015-08-25 10:09:14 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - gl/eagl: Unref context after setting a window handle - gst_gl_window_get_context() returns a new reference. - Hopefully fixes https://bugzilla.gnome.org/show_bug.cgi?id=753758 - -2015-08-24 21:28:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * win32/common/libgstcodecparsers.def: - win32: Add new h265 parser symbols - -2015-08-24 08:06:15 +0300 lyb <andy_liu_china@163.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - codecparsers: h265: Add APIs for up-right-diagonal/raster scan conversion - As per 7-42 and 7-43 the ScalingFactor's scanIdx is 0, - which is "up-right-diagonal" scan. Add APIs for converting - up-right-diagonal to raster and vise versa. - https://bugzilla.gnome.org/show_bug.cgi?id=754024 - -2015-08-24 04:18:52 +0300 XuGuangxin <Guangxin.Xu@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparsers: h265: Fix the range of delta_chroma_log2_weight_denom - Being more strict on specification, According to 7.4.7.3, - delta_chroma_log2_weight_denom should be in the range of - (0 - luma_log2_weight_denom), (7 - luma_log2_weight_denom) - https://bugzilla.gnome.org/show_bug.cgi?id=754024 - -2015-08-23 23:38:21 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: fix latency handling again - The tsdemux latency should always be added to the minimum - latency (which is always a valid clock time value). The - "cleanup" in commit a1f709c2 made it so that it would not - be added if upstream reported 0 as minimum latency (as - e.g. udpsrc would). This broke playback of live mpeg-ts - streaming in some cases, leading to playback stutter due - to a too-small configured latency for the pipeline. - https://bugzilla.gnome.org/show_bug.cgi?id=751508 - -2015-08-21 13:42:18 -0700 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglimagesink.c: - glimagesink: update display size before sending event - This is minor issue, as the reconfigure event is asynchronous. - Basically, update width/height before sending the event. - -2015-08-20 17:27:34 -0700 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglcolorconvertelement.c: - * ext/gl/gstgluploadelement.c: - * gst-libs/gst/gl/gstglbasefilter.c: - gl: Let base transform relay the meta api for us - During allocation query, when this element is not passthrough, it must - relay the overlay compostion meta and it's parameters. Fortunatly, base - transform can do this for us. - https://bugzilla.gnome.org/show_bug.cgi?id=753850 - -2015-08-21 20:29:24 +0200 Koop Mast <kwm@rainbow-runner.nl> - - * configure.ac: - curl: Give netinet/ip.h it own configure check - On FreeBSD netinet/ip.h needs the sys/types.h and netinet/in.h header - before it can be tested. - https://bugzilla.gnome.org/show_bug.cgi?id=753944 - -2015-08-19 17:42:49 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/dts/gstdtsdec.c: - dtsdec: remove unused value - length is set to a different value before being read. Remove initial value. - Silences compiler warning. - -2015-08-21 05:26:25 +0200 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gstfacedetect.h: - facedetect: remove unnecessary variable. - Memory is reserved for this variable and then released without making any - use of it. - https://bugzilla.gnome.org/show_bug.cgi?id=748377 - -2015-08-21 14:07:32 +0900 Justin Kim <justin.kim@collabora.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: add specific error message when missing GL_SHADING_LANGUAGE_VERSION - GL_SHADING_LANGUAGE_VERSION was introduced since ES 2.0, but in some - android emulator doesn't support this feature. To prevent confusion for - developer, the error message need to be more clear. - https://bugzilla.gnome.org/show_bug.cgi?id=753905 - -2015-08-21 16:44:43 +0900 hoonhee.lee <hoonhee.lee@lge.com> - - * tests/check/elements/audiomixer.c: - tests: audiomixer: remove duplicated word in comment - https://bugzilla.gnome.org/show_bug.cgi?id=753915 - -2015-08-21 16:31:41 +0900 hoonhee.lee <hoonhee.lee@lge.com> - - * ext/gl/caopengllayersink.m: - caopengllayersink: Don't chain up to parent's query handling twice for DRAIN query - https://bugzilla.gnome.org/show_bug.cgi?id=753913 - -2015-08-20 15:00:02 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * tests/check/elements/hlsdemux_m3u8.c: - check: hlsdemux: make duration unit test robust to floating point rounding - The test_playlist_with_doubles_duration() test fails on some platforms - due to rounding errors that occur when m3u8.c converts from the floating - point value in the HLS manifest to a GstClockTime. - Using assert_equals_float() fixes this because this function handles - the rounding error issues by accepting almost equal. - https://bugzilla.gnome.org/show_bug.cgi?id=753881 - -2015-08-17 18:35:58 +0200 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasefilter.c: - glbasefilter: only call gl_{stop,start} if the context changed - Removes the redundant GL object creation/deletion on every - decide_allocation call which is being called for every caps change. - Thus reduces the required GL state changes on reconfigure events - which are being sent by glimagesink/xvimagesink - -2015-08-20 14:09:37 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * configure.ac: - opencv: Fix OpenCV data path check to work with cross compilation - https://bugzilla.gnome.org/show_bug.cgi?id=753651 - -2015-08-20 14:11:56 +0300 Ben Browitt <ben.browitt@gmail.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Always set the pad's buffer_vinfo when storing a buffer - Otherwise it might be unset, and then the buffer is used and - gst_video_frame_map() will crash because of invalid video-info. - https://bugzilla.gnome.org/show_bug.cgi?id=753805 - -2015-08-19 21:33:09 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: Handle encoding specified in the <xml> element when dumping nodes - Previous patch did not handle the case where an encoding (e.g. UTF-8) is - specified in the <xml ?> element. Added an extra test for with and without - encoding. - https://bugzilla.gnome.org/show_bug.cgi?id=753813 - -2013-01-31 14:03:40 +0100 Arnaud Vrac <avrac@freebox.fr> - - * ext/assrender/gstassrender.c: - assrender: check video frame mapping succeeded before blending - If the mapping fails just skip overlay rendering and push the video - frame downstream. - https://bugzilla.gnome.org/show_bug.cgi?id=753822 - -2015-08-19 15:31:16 +0200 Arnaud Vrac <avrac@freebox.fr> - - * configure.ac: - * gst-libs/gst/video/Makefile.am: - * sys/uvch264/Makefile.am: - * tests/examples/uvch264/Makefile.am: - configure.ac: fix build when the uvch264 plugin is not selected - Instead of checking for the gstreamer-video-1.0 package is installed, - just assume it is since we already check for the -base dependency. - With this replace the GST_VIDEO_* variables in makefiles and directly - link with libgstvideo. - https://bugzilla.gnome.org/show_bug.cgi?id=753820 - -2015-08-19 11:29:43 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: replace xmlNodeDump with xmlNodeDumpOutput - When running on an STB, the function - gst_mpdparser_get_xml_node_as_string causes a segmentation fault. This - code works correctly on a Linux desktop. - Looking at the libxml documentation, the xmlNodeDump is deprecated. - Replacing the use of xmlNodeDump with xmlNodeDumpOutput fixes the - segfault on the STB and removes the use of the deprecated function. - -2015-08-19 12:37:40 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * configure.ac: - configure: check for Qt version - Usage of QSGSimpleTextureNode::setOwnsTexture() was added in commit - 6b8cf8419d8ea80081de8150a6b1c3cf763c4d69, this function was added in - Qt 5.4.0. Check for this version or later. - https://bugzilla.gnome.org/show_bug.cgi?id=753812 - -2015-07-16 22:57:36 +0200 Arnaud Vrac <avrac@freebox.fr> - - * ext/hls/gsthlsdemux.c: - hlsdemux: abort playlist update when cancelled - Otherwise the download thread will get stuck, since the downloader is - disabled. - -2015-08-19 13:52:21 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - gtk/gl: Use our GL function table instead of directly calling GL functions - Otherwise we would have to link the plugin to the GL libraries directly. - -=== release 1.5.90 === - -2015-08-19 13:46:53 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.5.90 - -2015-08-19 12:52:18 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2015-08-19 11:36:13 +0300 Sebastian Dröge <sebastian@centricular.com> - - * po/ky.po: - * po/nb.po: - * po/sv.po: - po: Update translations - -2015-08-18 13:56:59 +0200 Guillaume Marquebielle <guillaume.marquebielle@parrot.com> - - * gst/liveadder/liveadder.c: - liveadder: fix assertion when copying buffer region - In gst_live_adder_chain() function, calls to gst_buffer_copy_region() can lead - to assertion as 'offset + size <= bufsize' is not respected. - Indeed 'offset' and 'size' parameters are calculated through calling gst_live_adder_length_from_duration(), - and thus gst_util_uint64_scale_int_round(). - Depending on the nearest integers, rounded values 'offset' and 'size' can then trigger the assertion. - This case mainly occurs when 'skip' value is > 0 in chain function process. - https://bugzilla.gnome.org/show_bug.cgi?id=753759 - -2015-08-17 18:06:30 +0200 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/gsthanddetect.c: - * ext/opencv/gsthanddetect.h: - handdetect: remove unnecessary variable. - Memory is reserved for this variable and then released without making any - use of it. - https://bugzilla.gnome.org/show_bug.cgi?id=752528 - -2015-08-17 18:02:28 +0200 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/gsthanddetect.c: - handdetect: check CvHaarClassifierCascade is release before being modified. - Make sure a previous cascade, if it exists, is released before loading a - new XML file onto it. - https://bugzilla.gnome.org/show_bug.cgi?id=752528 - -2015-08-17 17:47:42 +0200 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/gsthanddetect.c: - handdetect: code refactoring of gst_handdetect_load_profile. - Change gst_handdetect_load_profile() so it can be used generically. - https://bugzilla.gnome.org/show_bug.cgi?id=752528 - -2015-08-18 11:54:33 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/daala/gstdaalaenc.c: - daalaenc: Fix build - And also only generate the supported caps once, not on every CAPS/ACCEPT_CAPS - query. It's not that cheap. - -2015-08-17 23:44:42 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * tests/examples/opencv/gstfacedetect_test.c: - examples: facedetect: add silent option - By default the example floods the screen with the detected face values. - Add an option to avoid this for frail terminals. - -2015-08-17 14:38:52 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/x265/gstx265enc.c: - x265enc: add accept-caps handling - Ovewrite default handling to avoid doing a caps query. Check - the received caps against the possible formats supported by - the x265 library. - -2015-08-17 14:32:56 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/daala/gstdaalaenc.c: - daalaenc: add accept-caps handling - Ovewrite default handling to avoid doing a caps query. Check - the received caps against the possible formats supported by - the daala library. - -2015-08-16 07:06:44 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/openjpeg/gstopenjpegenc.c: - * ext/schroedinger/gstschroenc.c: - * ext/webp/gstwebpenc.c: - * gst/pnm/gstpnmenc.c: - videoencoders: use template subset check for accept-caps - It is faster than doing a query that propagates downstream and - should be enough - Elements: openjpegenc, schroenc, webpenc, pnmenc - -2015-08-17 17:38:15 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * configure.ac: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfacedetect.cpp: - opencv: support alternative path convention - Some distributions store OpenCV files in /usr/share/opencv and some others - (and default when building from source) install them in - /usr/share/OpenCV. Support both to find cascade files. - https://bugzilla.gnome.org/show_bug.cgi?id=753651 - -2015-08-16 21:18:50 +0200 Rico Tzschichholz <ricotz@ubuntu.com> - - * ext/dash/Makefile.am: - dashdemux: link against gio for g_resolver and g_inet_address_from_string - Add missing gio-2.0 CFLAGS/LIBS to fix linker failure - -2015-08-16 07:18:34 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/faac/gstfaac.c: - * ext/gsm/gstgsmenc.c: - * ext/opus/gstopusenc.c: - * ext/sbc/gstsbcenc.c: - * ext/voaacenc/gstvoaacenc.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * gst/adpcmenc/adpcmenc.c: - * gst/siren/gstsirenenc.c: - audioencoders: use template subset check for accept-caps - It is faster than doing a query that propagates downstream and - should be enough - Elements: faac, gsmenc, opusenc, sbcenc, voamrwbenc, adpcmenc, sirenenc - -2015-08-17 07:55:03 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: Remove custom getcaps and just use the template - We know from the beginning the caps that are acceptable, no need - for custom getcaps or manually generating caps. - -2015-08-17 07:54:36 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: add version to gst-launch string on documentation - gst-launch will call the 0.10 version, we want 1.0 - -2015-08-17 07:15:00 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/faac/gstfaac.c: - faac: make template pad caps more accurate and remove custom getcaps - Allows reusing baseclass caps query handling and simplifying negotiation - code. - -2015-08-17 11:50:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: still reset pending audio info on hard flush - Follow-up to previous commit. - https://bugzilla.gnome.org/show_bug.cgi?id=752431 - -2015-07-15 10:44:02 -0600 Jason Litzinger <jlitzinger@control4.com> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: fix handling of sample rate change during playback - If the sample rate of the media changes, the resulting flush will - clear the has_next_audioinfo flag, and the caps won't be sent - downstream. - https://bugzilla.gnome.org/show_bug.cgi?id=752431 - -2015-03-17 17:55:26 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstpngparse.c: - * gst/videoparsers/gstvc1parse.c: - videoparsers: Use gst_base_parse_merge_tags() - Instead of squashing all upstream tags - https://bugzilla.gnome.org/show_bug.cgi?id=679768 - -2015-08-16 18:13:12 +0200 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Recalculate offset and size in raw upload - As we only expose the mapped portion of the frame into the GL - memory object (and not the original padding) we need to - re-calculate the size and offset. - -2015-08-16 08:49:35 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: fix off by one seeking issue - When seeking to the last second of a mpd it would reject the seek - because the comparison was < instead of <= - This fails the important use case of seeking to the end of a file - to play it back in reverse from the end - -2015-08-16 12:55:57 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsdemux: Fix illogical comparision - A variable can't be two values at once. We want to stop if it's not the - actual ts *AND* not the other ts - CID #1316475 - -2015-08-16 12:52:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Free UTCTiming struct if there are no values associated with it - CID 1316479 - -2015-08-15 23:36:01 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/check/Makefile.am: - check: Link against GModule for tests using g_module_* - -2015-08-15 19:04:27 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Demote debugging level - -2015-08-15 19:01:00 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Actually wait for playlist update when requested - There are several cases where a HLS server could temporarily have wrong - fragments, or reconfigure the playlist. In those cases, when we get - fragment download failures, we *really* want to wait a bit (for the next - playlist update) before retrying to get fragments. - Previously this method was first checking to see if there was next fragments - (according to the previous manifest update) before waiting for the next update. - The problem was that if that if there is a temporary failure on the server, - that's uncorrelated to whether the manifest contains next fragments or not. - -2015-08-14 12:25:19 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/check/elements/glimagesink.c: - * tests/check/generic/states.c: - checks: Ensure thread-safe libX11/GL when running tests - -2015-08-15 12:58:40 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dts/gstdtsdec.c: - * ext/faad/gstfaad.c: - * ext/gsm/gstgsmdec.c: - * ext/mpg123/gstmpg123audiodec.c: - * ext/opus/gstopusdec.c: - * ext/sbc/gstsbcdec.c: - * gst/adpcmdec/adpcmdec.c: - * gst/siren/gstsirendec.c: - audiodecoders: use default pad accept-caps handling - Avoids useless check of downstream caps when handling an - accept-caps query - Elements: dtsdec, faad, gsmdec, mpg123audiodec, opusdec, - sbcdec, adpcmdec, sirendec - -2015-08-15 12:55:49 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/daala/gstdaaladec.c: - * ext/libde265/libde265-dec.c: - * ext/openexr/gstopenexrdec.cpp: - * ext/openjpeg/gstopenjpegdec.c: - * ext/rsvg/gstrsvgdec.c: - * ext/schroedinger/gstschrodec.c: - * ext/webp/gstwebpdec.c: - * gst/pnm/gstpnmdec.c: - * gst/vmnc/vmncdec.c: - videodecoders: use default pad accept-caps handling - Avoids useless check of downstream caps when handling an - accept-caps query - Elements: daaladec, libde265dec, openjpegdec, rsvgdec, schrodec, - webpdec, pnmdec, vmncdec, openexrdec - -2015-08-15 16:22:20 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265depay.c: - rtph265depay: make sure we call handle_nal for each NAL - Call handle_nal for each NAL in the STAP-A RTP packet. This makes sure - we correctly extract the SPS and PPS. - https://bugzilla.gnome.org/show_bug.cgi?id=730999 - -2015-08-15 15:02:33 +0200 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstgloverlaycompositor.c: - gloverlaycompositor: Also disable the blend when done - -2015-08-15 14:31:15 +0200 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglimagesink.c: - * ext/gtk/gstgtkglsink.c: - * gst-libs/gst/gl/gstglupload.c: - glsink: Enable sync meta on pools we offer - As the upload is asynchronous, we need to enable the sync meta to - gain correct rendering. The buffer pool receiver don't know about - that. - -2015-08-15 15:12:27 +0200 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtkglsink.h: - * ext/gtk/gtkgstglwidget.c: - gtkglsink: Add overlay composition support - Rendering composition overlay in GL with additional high resolution - overlay being added. - -2015-08-15 15:08:11 +0200 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gtkgstbasewidget.c: - * ext/gtk/gtkgstbasewidget.h: - * ext/gtk/gtkgstglwidget.c: - * ext/gtk/gtkgstwidget.c: - gtkglsink: Fix unsafe handling of buffer life time - We need to keep the active buffer (the one we have retreive a - texture id from) otherwise it's racy and upstream may upload - new content before we have rendered or during later redisplay. - -2015-08-14 18:07:15 +0200 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gtkgstbasewidget.c: - * ext/gtk/gtkgstbasewidget.h: - * ext/gtk/gtkgstglwidget.c: - gtkglsink: Remove reset path - The reset path is bogus and there is no reason to get rid of these - things during resize. - -2015-08-14 17:36:48 +0200 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Move overlay rendering after video rendering - This is mostly cosmetic, but heoretically it reduces the amount of - required object in the context at one point. It also avoids potential - conflicts. - -2015-08-15 14:45:34 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265pay.c: - rtph265pay: Copy metadata in the payloader, but only the relevant ones - The payloader didn't copy anything so far, the depayloader copied every - possible meta. Let's make it consistent and just copy all metas without - tags or with only the video tag. - https://bugzilla.gnome.org/show_bug.cgi?id=751774 - -2015-08-15 11:41:40 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265pay.c: - rtph265pay: Use GST_WARNING_OBJECT() instead of GST_WARNING() - https://bugzilla.gnome.org/show_bug.cgi?id=753228 - -2015-08-15 11:30:36 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265pay.c: - rtph265pay: fix potential crash when shutting down - A race condition in the state change function may cause buffers to be - unreffed while they are still used by the streaming thread in - gst_rtp_h265_pay_send_vps_sps_pps() resulting in a crash. Chain up to the - parent class first in the state change function to make sure streaming - has stopped and only then free those buffers. - https://bugzilla.gnome.org/show_bug.cgi?id=741381 - -2015-08-15 10:03:07 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/glprototypes/opengl.h: - opengl: Change GLclampd to double - GLclampd does not exist on GLES, only desktop GL. - -2015-08-14 10:32:14 -0700 Martin Kelly <martin@surround.io> - - * gst-libs/gst/gl/glprototypes/opengl.h: - opengl: add missing ClearDepth prototype - The ClearDepth call is missing. - https://bugzilla.gnome.org/show_bug.cgi?id=753639 - -2015-08-06 14:33:54 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst/videoparsers/gsth264parse.c: - h264parse: Clear SPS info after processing. - The SPS struct might be filled out by a call to - gst_h264_parser_parse_subset_sps, which fills out - dynamically allocated data and requires a call - to gst_h264_sps_clear() to free it. Also make sure - to clear out any allocated SPS data when returning - an error. - https://bugzilla.gnome.org/show_bug.cgi?id=753306 - -2015-08-12 00:20:26 +0200 Vanessa Chipirrás Navalón <vchipirras6@gmail.com> - - * ext/opencv/gstfacedetect.cpp: - facedetect: Refactor the code - Some lines of code are repeated several times, therefore - this lines are simplified with a inline function, that this is - proper style of C++. - -2015-08-14 11:43:57 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/videoparsers/gstpngparse.c: - pngparse: enable accept-intersect and accept-template flags on sinkpad - Do a quick check with the pad template caps as it is enough. Users - should have figured the appropriate full caps on a previous caps query - https://bugzilla.gnome.org/show_bug.cgi?id=753623 - -2015-08-14 11:43:18 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstvc1parse.c: - videoparsers: enable accept-template flag - Do a quick check with the pad template caps as it is enough. Users - should have figured the appropriate full caps on a previous caps query - https://bugzilla.gnome.org/show_bug.cgi?id=753623 - -2015-08-14 15:08:08 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265pay.c: - rtph265pay: fix buffer leak when using SPS/PPS - Fixes a buffer leak that would occur if the pipeline was shutdown while a - SPS/PPS header was being created. - https://bugzilla.gnome.org/show_bug.cgi?id=741271 - -2015-08-14 11:49:51 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265depay.c: - * gst/rtp/gstrtph265depay.h: - rtph265depay: copy metadata in the depayloader, but only the relevant ones - The payloader didn't copy anything so far, the depayloader copied every - possible meta. Let's make it consistent and just copy all metas without - tags or with only the video tag. - https://bugzilla.gnome.org/show_bug.cgi?id=751774 - -2015-08-14 09:44:24 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/dash/gstdashdemux.c: - * gst-libs/gst/uridownloader/gstfragment.c: - * gst-libs/gst/uridownloader/gstfragment.h: - * gst-libs/gst/uridownloader/gsturidownloader.c: - dashdemux: add support for HTTP HEAD method of time sync - The urn:mpeg:dash:utc:http-head:2014 method of time synchronisation - uses an HTTP HEAD request to a specified URL and then parses the - Date: HTTP response header. - This commit adds support to dashdemux for this method of time - synchronisation by making a HEAD request and then parsing the Date: - response. - This commit adds support to gstfragment to return the HTTP headers - and to uridownloader to support HEAD requests. To avoid creating a - new API, the RANGE get function is re-used (abused?) with start=-1 - and end=-1 to indicate a HEAD request. - https://bugzilla.gnome.org/show_bug.cgi?id=752413 - -2015-08-13 18:21:29 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/dash/gstdashdemux.c: - dashdemux: post-review fixup of UTCTiming element - This commit addresses the following items from the code review: - use a portable way to define NTP_TO_UNIX_EPOCH, - fix memory leak on error, and - add documentation to UTCTiming parse functions - Using LL is not portable, so the G_GUINT64_CONSTANT needs to be instead. - If an error occurs during DNS resolution, the GError was not being - released, causing a memory leak. - https://bugzilla.gnome.org/show_bug.cgi?id=752413 - -2015-07-15 11:56:13 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/dash/Makefile.am: - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * tests/check/elements/dash_mpd.c: - dashdemux: add support for UTCTiming elements for clock drift compensation - Unless the DASH client can compensate for the difference between its - clock and the clock used by the server, the client might request - fragments that either not yet on the server or fragments that have - already been expired from the server. This is an issue because these - requests can propagate all the way back to the origin - ISO/IEC 23009-1:2014/Amd 1 PDAM1 defines a new UTCTiming element to allow - a DASH client to track the clock used by the server generating the - DASH stream. Multiple UTCTiming elements might be present, to indicate - support for multiple methods of UTC time gathering. Each element can - contain a white space separated list of URLs that can be contacted - to discover the UTC time from the server's perspective. - This commit provides parsing of UTCTiming elements, unit tests of this - parsing and a function to poll a time server. This function - supports the following methods: - urn:mpeg:dash:utc:ntp:2014 - urn:mpeg:dash:utc:http-xsdate:2014 - urn:mpeg:dash:utc:http-iso:2014 - urn:mpeg:dash:utc:http-ntp:2014 - The manifest update task is used to poll the clock time server, - to save having to create a new thread. - When choosing the starting fragment number and when waiting for a - fragment to become available, the difference between the server's idea - of UTC and the client's idea of UTC is taken into account. For example, - if the server's time is behind the client's idea of UTC, we wait for - longer before requesting a fragment - PDAM1: http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=66068 - dashdemux: support NTP time servers in UTCTiming elements - Use the gst_ntp_clock to support the use of an NTP server. - https://bugzilla.gnome.org/show_bug.cgi?id=752413 - -2015-08-14 11:13:51 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/check/generic/states.c: - check: Rename states unit test - Makes it easier to differentiate from other modules states unit test - -2015-08-13 10:31:20 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/dvdspu/gstspu-pgs.c: - spu-pgs: fix buffer and event leak - When playing mts files with embedded subtitles, the buffer is mapped, - but not unmapped at the end resulting in a memory leak. - Also unref event in handle_dvd_event as it takes ownership of the event. - https://bugzilla.gnome.org/show_bug.cgi?id=753539 - -2015-08-13 10:25:52 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: Fix event leaks - When playing mts files with embedded subtitles, there are few event leaks. - Events are supposed to be transfer full. So if not forwarding the event, - they need to be freed. - https://bugzilla.gnome.org/show_bug.cgi?id=753539 - -2015-08-13 12:38:41 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/srtp/gstsrtpdec.c: - Revert "srtpdec: Add support for buffer list" - This reverts commit ff11a1a8a0c685d2edd0e06c0071cbb94f2cb663. - It can't be assumed that all buffers in a buffer list have the same SSRC or - are RTP or RTCP only. It has to be checked for every single buffer, and one - basically has to do the processing that is done by the default chain_list - implementation. - -2015-08-12 17:54:52 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265depay.c: - rtph265depay: checking if depay has sps/pps nals before insertion - Related to: https://bugzilla.gnome.org/show_bug.cgi?id=753430 - https://bugzilla.gnome.org/show_bug.cgi?id=753228 - -2015-08-12 17:22:42 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265depay.c: - rtph265depay: only update the srcpad caps if something else than the codec_data changed - h264parse and gstrtph264depay do the same, let's keep the behaviour - consistent. As we now include the codec_data inside the stream, this causes - less caps renegotiation. - https://bugzilla.gnome.org/show_bug.cgi?id=753228 - -2015-08-12 16:43:48 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265depay.c: - rtph265depay: PPS replaces old PPS if it has the same id - https://bugzilla.gnome.org/show_bug.cgi?id=753228 - -2015-08-12 16:11:00 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265depay.c: - rtph265depay: Insert SPS/PPS NALs into the stream - rtph264depay does the same and this fixes decoding of some streams with 32 - SPS (or 256 PPS). It is allowed to have SPS ID 0 to 31 (or PPS ID 0 to 255), - but the field in the codec_data for the number of SPS or PPS is only 5 - (or 8) bit. As such, 32 SPS (or 256 PPS) are interpreted as 0 everywhere. - This looks like a mistake in the part of the spect about the codec_data. - -2015-08-12 15:49:50 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265depay.c: - rtph265depay: implement process_rtp_packet() vfunc - For more optimised RTP packet handling: means we don't need to map the - input buffer again but can just re-use the mapping the base class has - already done. - Based on: https://bugzilla.gnome.org/show_bug.cgi?id=750235 - https://bugzilla.gnome.org/show_bug.cgi?id=753228 - -2015-08-12 15:14:50 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265depay.c: - rtph265depay: Use GST_BUFFER_PTS() instead of GST_BUFFER_TIMESTAMP() - Switching to GST_BUFFER_TIMESTAMP() to be consistent with other rtp code. - -2015-08-12 14:59:53 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265depay.c: - rtph265depay: prevent trying to get 0 bytes from adapter - This causes an assertion and would lead to getting a NULL instead - of a buffer. Without proper checking this would easily lead to a - segfault. - Related to rpth264depay: https://bugzilla.gnome.org/show_bug.cgi?id=737199 - -2015-08-12 07:58:09 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparsers: h265: Fix the range of delta_chroma_log2_weight_denom - ChromaLog2WeightDenom = luma_log2_weight_denom + delta_chroma_log2_weight_denom - The value of ChromaLog2WeightDenom should be in the range of 0 to 7 and - the value luma_log2_weight_denom should be also in the range of 0 to 7. - Which means , delta_chroma_log2_weight_denom can have values in the range - between -7 and 7. - https://bugzilla.gnome.org/show_bug.cgi?id=753552 - -2015-08-12 05:11:27 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparsers: h265: Fix the parsing of ref_pic_lists_modification - https://bugzilla.gnome.org/show_bug.cgi?id=753552 - -2015-08-12 00:20:10 +0200 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: take into account non 1/1 par for navigation - The current code was ignoring the par/dar aspect when transforming - from window coordinates to stream coordinates resulting in incorrect - coordinates being sent upstream in the navigation events. - -2015-08-12 00:18:20 +0200 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gtkgstbasewidget.c: - gtk: fix motion event name - s/motion/mouse/ - Fixes hover interaction with DVD menus - -2015-08-12 00:14:14 +0200 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gtkgstbasewidget.c: - gtk: correct navigation events for window scaling - i.e. take into account the possiblity of scaling in the sink - or through GDK_SCALE. - Fixes DVD Menus with a scaled gtkwidget - -2015-08-11 15:02:25 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/frei0r/gstfrei0r.c: - frei0r: Fix setting string parameters - String parameters are expected to be passed as (f0r_param_string *), - which actually map to char**. In the filters this is evaluated as - (*(char**)param) which currently lead to crash when passing char*. - Remove the special case for string, all types, including char* as - passed as a reference. - https://phabricator.freedesktop.org/T83 - -2015-08-11 13:34:59 +0200 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gstgtkbasesink.c: - * ext/gtk/gtkgstbasewidget.c: - * ext/gtk/gtkgstbasewidget.h: - gtk: implement GstNavigation interface - Now we can push key/mouse input into the pipeline for DVD use cases. - -2015-06-30 13:51:33 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstrtpopusdepay.c: - * ext/opus/gstrtpopuspay.c: - opus: Copy metadata in the (de)payloader, but only the relevant ones - The payloader didn't copy anything so far, the depayloader copied every - possible meta. Let's make it consistent and just copy all metas without tags or - with only the audio tag. - https://bugzilla.gnome.org/show_bug.cgi?id=751774 - -2015-08-11 04:14:19 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth265parse.c: - videoparsers: h265: Fix the frame start detection code - Check slice headers in between GST_H265_NAL_SLICE_TRAIL_N - and GST_H265_NAL_SLICE_RASL_R for frame start detection. - https://bugzilla.gnome.org/show_bug.cgi?id=753497 - -2015-08-11 03:47:42 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth265parse.c: - videoparsers: h265: Avoid skipping of EOS and EOB nals - EndOfSequence and EndOfBitstream nal units have size of 2 bytes. - Don't consider them as broken nals. - https://bugzilla.gnome.org/show_bug.cgi?id=753497 - -2015-08-10 23:02:12 +0200 Vanessa Chipi <vchipirras6@gmail.com> - - * ext/opencv/gstfacedetect.cpp: - facedetect: wrong form to write the delete operator - The delete operator is written this way: delete (cascade). This way is - misspelled, it is an operator, not a function. Delete the parentheses. - -2015-08-10 19:13:11 +0200 vanechipi <vchipirras6@gmail.com> - - * ext/opencv/gstfacedetect.cpp: - facedetect: simplify repeated code. - Store the value of r.height / 2 instead of repeating the operation line - three times. - -2015-08-10 19:02:10 +0200 vanechipi <vchipirras6@gmail.com> - - * ext/opencv/gstfacedetect.cpp: - facedetect: Redundancy exists in code. - Checking the vector is not empty and checking the vector size is greater - than zero are the same thing, this is a redundancy in the code. Only - checking the vector is not empty is sufficient, therefore removing the - other check. - -2015-08-10 14:48:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/Makefile.am: - gl: Add opengl_version.h to the list of sources - Adding this private header to the list of sources. We don't want to make - this header public, but we need it in the list of sources otherwise it - won't be included in the tarball. This fixes make distcheck. - This regression was introduced by commit 1a6fe3db - -2015-08-10 19:06:16 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * tests/examples/opencv/gstfacedetect_test.c: - examples: facedetect: only create variables when needed - The variables to store face values are only needed if they will be used to - control the volume. Which isn't the default to avoid potentially being very - loud accidentally. Only create variables when needed. - -2015-08-10 16:51:17 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * tests/examples/opencv/gstfacedetect_test.c: - examples: facedetect: make volume control optional - -2015-08-10 16:38:32 +0200 Matthew Waters <matthew@centricular.com> - - * ext/gl/effects/gstgleffectblur.c: - * ext/gl/effects/gstgleffectbulge.c: - * ext/gl/effects/gstgleffectfisheye.c: - * ext/gl/effects/gstgleffectglow.c: - * ext/gl/effects/gstgleffectidentity.c: - * ext/gl/effects/gstgleffectlaplacian.c: - * ext/gl/effects/gstgleffectlumatocurve.c: - * ext/gl/effects/gstgleffectmirror.c: - * ext/gl/effects/gstgleffectrgbtocurve.c: - * ext/gl/effects/gstgleffectsin.c: - * ext/gl/effects/gstgleffectsobel.c: - * ext/gl/effects/gstgleffectsquare.c: - * ext/gl/effects/gstgleffectsqueeze.c: - * ext/gl/effects/gstgleffectssources.c: - * ext/gl/effects/gstgleffectssources.h: - * ext/gl/effects/gstgleffectstretch.c: - * ext/gl/effects/gstgleffecttunnel.c: - * ext/gl/effects/gstgleffecttwirl.c: - * ext/gl/effects/gstgleffectxray.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstgleffects.h: - * gst-libs/gst/gl/gstglfilter.c: - gl: use gles2 shaders everywhere - This effectively limits a glfilter subclass to be > GL(ES) 2.0. - rather than a possible GL 1.4. - -2015-08-10 15:44:54 +0200 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/utils/opengl_versions.h: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.h: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - glcontext/wgl: implement gl3 core profile context selection - -2015-02-28 01:07:44 +0100 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * ext/gl/gstgltransformation.c: - * ext/gl/gstgltransformation.h: - gltransformation: implement pivot point for rotation and scale - https://bugzilla.gnome.org/show_bug.cgi?id=744763 - Add a pivot vector for setting the origin of rotations and scales. - With the pivot point the rotation and scale operations can have - different origins. This adds the ability to rotate around different points. - Currently the default (0, 0) pivot point is possible, - a rotation around the center, and zooming into and out of the center. - With an pivot point this is optional. - I defined the following image coordinates for the pivot point: - (-1,1) ------------------------- (1,1) - | | - | | - | | - | (0,0) | - | | - | | - | | - (-1,-1) ------------------------- (1,-1) - Example: - Rotate the video at the bottom left corner - gst-launch-1.0 videotestsrc \ - ! gltransformation \ - scale-x=0.5 \ - scale-y=0.5 \ - rotation-z=25.0 \ - pivot-x=-1.0 \ - pivot-y=-1.0 \ - ! glimagesink - The pivot-z option defines the pivot point in 3D space. - This only affects rotation, since we have no Z data to scale. - With this option a video can be rotated around a point in 3D space. - Example: - Rotate around point behind the video: - gst-launch-1.0 videotestsrc \ - ! gltransformation \ - rotation-x=10.0 \ - pivot-z=-4.0 \ - ! glimagesink - -2015-08-08 14:45:42 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst-libs/gst/gl/gstgloverlaycompositor.c: - gloverlaycompositor: Add shader to convert BGRA/ARGB -> RGBA - Depending on the bytes order we will get BGRA (little) and ARGB (big) - from the composition overlay buffer while our GL code expects RGBA. Add - a fragment shader that do this conversion. - https://bugzilla.gnome.org/show_bug.cgi?id=752842 - -2015-08-08 17:28:03 +0200 Matthew Waters <matthew@centricular.com> - - * ext/qt/gstqsgtexture.cc: - * ext/qt/gstqsgtexture.h: - * ext/qt/qtitem.cc: - qml: implement the required multiple GL context synchonisation - From GStreamer's GL context into the QML context - -2015-08-08 17:22:05 +0200 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - gl/syncmeta: implement synchronisation without glFenceSync - Uses glFinish as that's the best we have for lesser OpenGL versions. - -2015-08-08 15:45:59 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/asfmux/gstasfmux.c: - asfmux: output TIME segment if we output a stream and won't seek back later - Check if downstream is seekable via a SEEKING query and output a - BYTE segment if we want to seek back to fix up the headers later, - but if we're streaming send a TIME segment instead (which goes - down better with e.g. asfmux ! rtpasfpay). - https://bugzilla.gnome.org/show_bug.cgi?id=719553 - -2015-08-08 15:30:43 +0200 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglcontext.c: - tests/glcontext: fix INVALID_ENUM GL error in test - -2015-08-08 15:21:03 +0200 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - context/glx: only use glXCreateContextAttribs for OpenGL 3 contexts - mesa for example when creating a GL 3.1 compatibility context - overrides our context profile selection to create a core context. - -2015-08-08 13:19:41 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * tests/examples/opencv/gstfacedetect_test.c: - examples: facedetect: only set to playing when it's not already - -2015-08-08 12:52:36 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * tests/examples/opencv/gstfacedetect_test.c: - * tests/examples/opencv/gsthanddetect_test.c: - examples: opencv: remove unnecessary setting of a property - "/dev/video0" is the default device of v4l2src, setting it to this is - redundant. - -2015-08-07 15:43:53 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/opencv/gstfacedetect.cpp: - facedetect: fix profile loading check - Since the profile gchar depends on DEFAULT_FACE_PROFILE, it should never be - NULL. Furthermore CascadeClassifier accepts any input, even - an empty one, but if the profile fails to load it returns an empty cascade. - Check for this instead, and inform the user if there was an Error. - -2015-08-06 11:30:04 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/m3u8.c: - hlsdemux: don't warn about duration if it is not known - And also print the values in case of warning - -2015-08-07 13:16:56 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * .gitignore: - gitignore: add new example file - Commit 02b9daafdf64ab205ed725f5496dfa5ce860eacc added a new example file - tests/examples/opencv/gstfacedetect_test, adding it to .gitignore - -2015-08-07 13:08:17 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * configure.ac: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfaceblur.h: - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gstfacedetect.h: - * ext/opencv/gsthanddetect.c: - * ext/opencv/gsthanddetect.h: - configure: update OpenCV requirements to 2.3.0 - With facedetect ported to C++ the minimum version of OpenCV - supported is 2.3.0 - https://bugzilla.gnome.org/show_bug.cgi?id=748377 - -2015-08-07 05:58:22 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: expose compatible profiles to downstream - Some video bitstreams report a too restrictive set of profiles. If a video - decoder was to strictly follow the indicated profile, it wouldn't support that - stream, whereas it could in theory and in practice. So we should relax the - profile restriction for allowing the decoder to get connected with parser. - https://bugzilla.gnome.org/show_bug.cgi?id=747613 - -2015-08-06 18:12:07 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/bayer/gstrgb2bayer.c: - rgb2bayer: Use mapped frame stride - -2015-08-06 18:11:53 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/bayer/gstrgb2bayer.c: - rgb2bayer: Protect against failing map - -2015-08-06 18:04:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/bayer/gstbayer2rgb.c: - bayer2rgb: Read stride from the video info - -2015-08-06 18:04:41 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/bayer/gstbayer2rgb.c: - bayer2rgb: Protect against failing map - -2015-08-06 19:23:49 +0300 Ilya Averyanov <i.averyanov@geoscan.aero> - - * tools/element-templates/videoencoder: - element-template: Fix wrong pad in videoencoder - https://bugzilla.gnome.org/show_bug.cgi?id=753326 - -2015-08-03 16:57:31 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix leak in gst_dash_demux_stream_update_fragment_info() - The gst_dash_demux_stream_update_fragment_info function could call - gst_dash_demux_stream_update_headers_info function twice. The - gst_dash_demux_stream_update_headers_info function will set header_uri and - index_uri to some newly allocated strings. The values set by the first call of - gst_dash_demux_stream_update_headers_info will leak when the function is - called for a second time. - The solution is to call gst_adaptive_demux_stream_fragment_clear before the - second call of gst_dash_demux_stream_update_headers_info - https://bugzilla.gnome.org/show_bug.cgi?id=753188 - -2015-08-05 14:52:12 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: Segment should start at base ts - Instead we would use cur_ts which matches the last TS store - in the buffer list. - https://bugzilla.gnome.org/show_bug.cgi?id=753037 - -2015-08-05 12:56:57 +0200 Anders Jonsson <anders.jonsson@norsjovallen.se> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin2: Fix string typo - https://bugzilla.gnome.org/show_bug.cgi?id=753241 - -2015-08-05 11:56:32 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/opencv/gstfacedetect.cpp: - opencv: facedetect: free IplImage with cvReleaseImage - Using delete() with IplImage will fail to free some of the structure's - contents. cvReleaseImage() is the proper way of freeing the memory. - -2015-08-05 11:39:01 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/opencv/gstfacedetect.cpp: - opencv: facedetect: check pointer before using it - Check if profile is NULL before dereferencing it with new. Also, new will - never return NULL; if allocation fails, a std::bad_alloc exception will be - thrown instead. Remove check for a NULL return. - CID #1315258 - -2015-08-05 11:14:49 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/x265/gstx265enc.c: - x265enc: remove dead code - level_ok is only used in a check that will never be true, removing it. - CID #1315255 - -2015-08-05 11:11:11 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/x265/gstx265enc.c: - x265enc: fix memory leak - Free vps_nal before returning. - CID #1315257 - -2015-08-04 23:15:36 +0200 Carlos Garnacho <carlosg@gnome.org> - - * ext/rsvg/gstrsvgdec.c: - rsvg: Don't leak a GstVideoCodecState - There's already the output_state variable with it, no need to - call gst_video_decoder_get_output_state() and get a new ref. - https://bugzilla.gnome.org/show_bug.cgi?id=753262 - -2015-08-04 21:32:53 +0900 Jimmy Ohn <yongjin.ohn@lge.com> - - * gst/rawparse/gstrawparse.c: - rawparse: fix duplicated format in handle_seek_pull - GstFormat variable are duplicated in handle_seek_pull function. - So we need to move this variable in condition statement. - https://bugzilla.gnome.org/show_bug.cgi?id=753243 - -2015-08-04 14:30:17 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/opencv/gstfacedetect.cpp: - opencv: facedetect: fix crashes in finalize - Fixes gst-inspect-1.0 -a crashing. - -2015-08-03 19:42:56 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstdx9screencapsrc.h: - * sys/winscreencap/gstgdiscreencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.h: - winscreencap: Properly timestamp buffers with the current clock running time instead of doing magic - Also implement framerate handling correctly by borrowing the code from - ximagesrc. GstBaseSrc::get_times() can't be used for that, we have to - implement proper waiting ourselves. - -2015-08-04 00:20:27 +1000 Jan Schmidt <thaytan@noraisin.net> - - * ext/opencv/gstfacedetect.cpp: - opencv: Fix 32-bit build / format strings. - Use G_GSIZE_FORMAT for format strings where relevant - -2015-08-03 19:48:16 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: swap control binding proxy - The ref_object and object parameters were the wrong way around. - For the typical use case where an application is setting a - GstControlBinding on the returned ghost pad: - 1. our control binding would be removed when the new one was set - 2. sync_values calls were not being forwarded from the internal - pad to the ghost pad. - If an application attempts to perform other control binding - operations (get_* family of functions) on the internal pad, they - will also be forwarded to the ghost pad where a possible - GstControlBinding will provide the necessary values. - -2015-08-01 15:52:28 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - dash: mpdparser: plug leak in segmenttemplate parsing - Only copy the values from the parent if the current node doesn't - have that value, they were being copied from the parent and - then overwriten by the child node, leaking the parent's copy - -2015-08-01 15:51:50 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/dash_mpd.c: - tests: dash_mpd: add check for segmenttemplate inheritance - Checks if the values are properly inherited and overwriten - -2015-08-01 15:09:19 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/dash_mpd.c: - tests: dash_mpd: add one more baseURL test - This other type of baseURL test was replaced by a more complex one, - better have both to keep both options working - Also adds another 2 variations of how baseURL can be generated - https://bugzilla.gnome.org/show_bug.cgi?id=752776 - -2015-07-23 10:54:36 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - dashdemux: tests: added duration format test - https://bugzilla.gnome.org/show_bug.cgi?id=752776 - -2015-07-22 11:42:23 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - dashdemux: tests: update unit test for baseURL - Update the unit test for baseURL to test that it is properly - resolved taking into account parent baseURL elements. - https://bugzilla.gnome.org/show_bug.cgi?id=752776 - -2015-08-01 11:51:22 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/opencv/gsttemplatematch.c: - templatematch: revert rename of property - The property doesn't need to have its name changed because of C++, - just the instance variables. - -2015-07-31 17:31:15 +0100 Vanessa Chipirrás <vchipirras6@gmail.com> - - * tests/examples/opencv/Makefile.am: - * tests/examples/opencv/gstfacedetect_test.c: - facedetect: Add unit test - I created four utilities of the detected features: - 1- If you hide your mouth, the volume of video is low. - 2- If you hide the nose, the volume of the video is up. - 3- If you hide the full face, the video stops. - You can see proof of this here: - https://www.youtube.com/watch?v=pxzejNKV_WQ - https://bugzilla.gnome.org/show_bug.cgi?id=748377 - -2015-07-31 16:40:07 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/opencv/gsttemplatematch.c: - * ext/opencv/gsttemplatematch.h: - templatematch: rename conflicting variable - With the switch of gstopencv.c to C++, all OpenCV elements are built with - g++. The template variable clashes with C++'s feature of the same name. - Rename template to templ to avoid any clash. - -2015-07-31 13:45:43 +0100 Vanessa Chipirrás <vchipirras6@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstfacedetect.cpp: - * ext/opencv/gstfacedetect.h: - * ext/opencv/gstopencv.cpp: - facedetect: need to migrate to C++ - The cascade classifier changes its structure on new version of OpenCV. - The need to migrate to C++ to utilize the new load method of OpenCV which - allows to load the new classifiers. - https://bugzilla.gnome.org/show_bug.cgi?id=748377 - -2015-07-31 10:47:27 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * ext/dts/gstdtsdec.c: - dtsdec: fix taglist leak - taglist merge doesnt take ownership. So should free the tags after use - https://bugzilla.gnome.org/show_bug.cgi?id=753086 - -2015-07-30 23:31:21 +0200 Heinrich Fink <hfink@toolsonair.com> - - * sys/applemedia/avsamplevideosink.m: - applemedia/avsample: Fix racy cleanup of CA layer - The block that is dispatched async to the main thread assumed the - wrapping GstAvSampleVideoSink to be alive. However, at the time of - the block execution the GstObject instance that is deferenced to access - the CA layer might already be freed, which caused occasional crashes. - Instead, we now only pass the CoreAnimation layer that needs to be - released to the block. We use __block to make sure the block is not - increasing the refcount of the CA layer again on its own. - https://bugzilla.gnome.org/show_bug.cgi?id=753081 - -2015-07-02 19:34:43 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/libs/aggregator.c: - tests: Add test for seeking live pipelines - https://bugzilla.gnome.org/show_bug.cgi?id=745768 - -2015-07-02 19:19:33 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/libs/aggregator.c: - tests: Make source live to re-enable aggregator timeout tests - The live mode is only enabled if one of the sources if live. - https://bugzilla.gnome.org/show_bug.cgi?id=745768 - -2015-07-02 18:37:28 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/audiointerleave.c: - tests: Add audiointerleave test to show that queuing works - This tests fails without the queuing patch because incoming buffers are - not delivered before they are needed. - https://bugzilla.gnome.org/show_bug.cgi?id=745768 - -2015-07-02 18:33:43 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudiointerleave.c: - audiointerleave: Avoid caps processing if not yet negotiated - https://bugzilla.gnome.org/show_bug.cgi?id=745768 - -2015-03-16 17:06:46 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: On timeout, resync pads with not enough data - https://bugzilla.gnome.org/show_bug.cgi?id=745768 - -2015-03-06 19:50:08 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * gst/audiomixer/gstaudioaggregator.c: - aggregator: Queue "latency" buffers at each sink pad. - In the case where you have a source giving the GstAggregator smaller - buffers than it uses, when it reaches a timeout, it will consume the - first buffer, then try to read another buffer for the pad. If the - previous element is not fast enough, it may get the next buffer even - though it may be queued just before. To prevent that race, the easiest - solution is to move the queue inside the GstAggregatorPad itself. It - also means that there is no need for strange code cause by increasing - the min latency without increasing the max latency proportionally. - This also means queuing the synchronized events and possibly acting - on them on the src task. - https://bugzilla.gnome.org/show_bug.cgi?id=745768 - -2015-03-06 21:32:04 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Remove broken _clip vfunc - It never does anything. - https://bugzilla.gnome.org/show_bug.cgi?id=745768 - -2015-07-30 08:58:48 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Avoid checking for Non Mandatory VPS NAL - VPS is not mandatory, and need not check for its presence before setting - the caps. Because of the check, in streams which don't have VPS, - sticky event mishandling happens. - https://bugzilla.gnome.org/show_bug.cgi?id=752807 - -2015-07-30 15:33:46 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: assertion error due to wrong condition check - In media to caps function, reserved_keys array is being used for variable i, - leading to GLib-CRITICAL **: g_ascii_strcasecmp: assertion 's1 != NULL' failed - changed it to variable j - https://bugzilla.gnome.org/show_bug.cgi?id=753009 - -2015-07-30 11:12:21 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/gl/gstglfilterbin.c: - gstglfilterbin: remove unused variable - res is set multiple times but never used or returned. Removing it. - -2015-07-29 20:07:09 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Default to "zero" start time selection mode as documented - -2015-07-29 20:06:11 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Ignore the "first" mode if the segment not a time segment - -2015-07-29 19:10:57 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Remove debug output from gst_gl_upload_transform_caps() - We can't know if the GstGLUpload type is initialized at this point already, - and thus our debug category might not be initialized yet... and cause an - assertion here. - As we don't print debug output for any of the other transform functions, let's - defer this problem for now. - -2015-07-29 17:48:58 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/gl/gstglstereomix.c: - glstereomix: remove redundant initialization - v is initialized in the for loop init, no need to do it twice. Removing - first initialization. - -2015-07-29 17:29:28 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/rtp/gstrtph265pay.c: - rtp: remove dead assignment - Value set to ret will be overwritten at least once at the end of the while - loop, removing assignment. - -2015-07-29 17:29:29 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: use GQueue instead of GList prepend/reverse - -2015-07-29 17:17:16 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: remove redundant assignment - Value of p is already set below just before being used. Removing this - first assignment that will be ignored. - -2015-07-29 16:51:48 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: remove redundant check - No need to check if done is True since break will already terminate the for - loop. - -2015-07-29 13:09:05 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: Don't assert in GstAdapter if no data was received before EOS - -2015-07-28 22:30:09 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/compositor.c: - compositor: Add unit tests for the new aggregator start-time-selection property - https://bugzilla.gnome.org/show_bug.cgi?id=749966 - -2015-06-15 18:30:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.c: - aggregator: Add property to select how to decide on a start time - Before aggregator based elements always started at running time 0, - now it's possible to select the first input buffer running time or - explicitly set a start-time value. - https://bugzilla.gnome.org/show_bug.cgi?id=749966 - -2015-07-29 11:25:24 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: Strip keys from the fmtp that we use internally in our caps - Skip keys from the fmtp, which we already use ourselves for the - caps. Some software is adding random things like clock-rate into - the fmtp, and we would otherwise here set a string-typed clock-rate - in the caps... and thus fail to create valid RTP caps - https://bugzilla.gnome.org/show_bug.cgi?id=753009 - -2015-07-29 22:59:56 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst/videoparsers/gsth264parse.c: - h264parse: Add more NAL types for debugging output. - Register more NAL unit types so that they are dumped - by name in the debug output instead of being labelled - 'Invalid' - -2015-07-29 22:57:44 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Don't clear the PID on reset. - The PID on a pad shouldn't change on a state change, only - if the pad is freed and a new one created. Clearing the PID - prevented mpegtsmux from being reused, because all packets - would end up muxed in PID 0 - https://bugzilla.gnome.org/show_bug.cgi?id=752999 - -2015-07-29 22:56:28 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Accumulate streamheaders in reverse - Accumulate streamheader packets in reverse into the - GList for efficiency, and reverse the list once when - processing. - Improves muxing speed when there are a lot of - streamheaders. - -2015-07-29 10:12:43 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcvideoenc.c: - amcvideoenc: Always set i-frame-interval setting - Most encoders fail to initialize if we don't set it at all. - -2015-07-29 12:56:54 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/videoparsers/gsth263parse.c: - h263parse: fix caps memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=752991 - -2015-07-28 21:15:43 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Query the peer latency again on the next opportunity after a pad was added or removed - Adding a pad will add a new upstream that might have a bigger minimum latency, - so we might have to wait longer. Or it might be the first live upstream, in - which case we will have to start deadline based aggregation. - Removing a pad will remove a new upstream that might have had the biggest - latency, so we can now stop waiting a bit earlier. Or it might be the last - live upstream, in which case we can stop deadline based aggregation. - -2015-07-28 11:20:40 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * tests/check/libs/gstglcolorconvert.c: - glcolorconvert-test: Test notify function for setup_wrapped - gst_gl_memory_setup_wrapped() now takes a destroy notify function. This - destroy notify is called to track the memory life time, hence will - notify each time a memory get destroyed. This test check that the - callback count is correct. - -2015-07-28 11:06:43 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * tests/check/libs/gstglcolorconvert.c: - glcolorconvert-test: Fix build - -2015-07-28 08:59:24 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Add fixme about using bufferpool for raw - http://bugzilla.gnome.org/show_bug.cgi?id=752937 - -2015-07-27 16:58:22 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglupload.c: - glupload: Keep input frame mapped as long as needed - When performing a raw upload, we need to keep the raw data mapped as - long as needed. - https://bugzilla.gnome.org/show_bug.cgi?id=752937 - -2015-07-27 15:58:10 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglupload.c: - Revert "glupload: memcpy on raw data upload" - This reverts commit 82c0189b2842e8729e82a4e73491dffc977bc7c2. - https://bugzilla.gnome.org/show_bug.cgi?id=752937 - -2015-07-15 16:21:00 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: gst_mpdparser_get_xml_prop_duration sets default value in case of parsing errors - The gst_mpdparser_get_xml_prop_duration function will set the - property_value to the default_value in case the parsing fails. - https://bugzilla.gnome.org/show_bug.cgi?id=752426 - -2015-07-27 18:39:13 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/opus/gstopuscommon.c: - opuscommon: Use GString instead of snprintf for concating - Safer, easier to understand, and more portable. Also, skip - all this if the log level is too low. - -2015-07-27 21:54:27 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.h: - glcontext/wgl: fix defenition of gst_gl_context_wgl_new - gstglcontext_wgl.c: In function 'gst_gl_context_wgl_new': - gstglcontext_wgl.c:83:40: error: 'display' undeclared (first use in this function) - -2015-07-27 20:03:05 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.h: - gl/cocoa: fix definition of gst_gl_context_new - gstglcontext_cocoa.m:75:1: error: conflicting types for 'gst_gl_context_cocoa_new' - -2015-07-27 20:00:47 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - gl/win32: fix definition of gst_gl_window_win32_new - -2015-07-27 18:21:19 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - wayland: fail window open if the display is the correct type - Errors out cleanly if a wayland compositor is not running - -2015-07-24 17:00:27 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/android/gstglwindow_android_egl.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.h: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - glwindow: pass display to implementation's _new() - So they have to opportunity to fail if they cannot handle the - display connection. - https://bugzilla.gnome.org/show_bug.cgi?id=752743 - -2015-07-24 16:11:38 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.h: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.h: - glcontext: pass display to implentation's _new() - This allows the context to fail creation based on incompatible - display type's. e.g. glx context with an wayland display handle. - https://bugzilla.gnome.org/show_bug.cgi?id=752743 - -2015-07-06 00:52:06 +0100 Julien Isorce <julien.isorce@gmail.com> - - * configure.ac: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglapi.h: - gl: support cgl, egl and glx within a same build - On osx, with the same build, - gst-launch-1.0 videotestsrc ! glimagesink works with: - GST_GL_PLATFORM=egl GST_GL_WINDOW=x11 GST_GL_API=gles2 - GST_GL_PLATFORM=egl GST_GL_WINDOW=x11 GST_GL_API=opengl - GST_GL_PLATFORM=glx GST_GL_WINDOW=x11 GST_GL_API=opengl - GST_GL_PLATFORM=cgl GST_GL_WINDOW=cocoa GST_GL_API=opengl - GST_GL_PLATFORM=cgl GST_GL_WINDOW=cocoa GST_GL_API=opengl3 - https://bugzilla.gnome.org/show_bug.cgi?id=752743 - -2015-07-27 16:36:40 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Check that caps contain desired caps features - Use 'contains' checks instead of equality checks on caps features - to allow for uploading when caps also contain GstVideoOverlayComposition - meta. - https://bugzilla.gnome.org/show_bug.cgi?id=752912 - -2015-07-25 09:03:27 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * sys/bluez/Makefile.am: - bluez: Add built sources to CLEANFILES - -2015-07-20 10:50:44 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dahdemux: avoid overflows in computation of segment start time and duration - Used gst_util_uint64_scale to avoid overflows when segment start time - or duration is computed. - https://bugzilla.gnome.org/show_bug.cgi?id=752620 - -2015-07-13 15:37:26 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/m3u8.c: - hlsdemux: demote error to warning - It is not fatal and can be quite normal when the network is - too slow - -2015-07-24 09:42:53 +0200 Miguel París Díaz <mparisdiaz@gmail.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: do not check input buffers - With this we avoid an unnecessary and considerable overhead. - https://bugzilla.gnome.org/show_bug.cgi?id=752774 - -2015-07-06 00:45:45 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - gl: move GL_NUM_EXTENSIONS definition after gl.h - https://bugzilla.gnome.org/show_bug.cgi?id=752743 - -2015-07-23 23:59:22 +0100 Julien Isorce <julien.isorce@gmail.com> - - * ext/gl/caopengllayersink.m: - caopengllayersink: remove unused label context_creation_error - Build error introduced by commit - 5457e55f255518d679b59a170951e299ecd8c5f6 - https://bugzilla.gnome.org/show_bug.cgi?id=750310 - -2015-07-24 02:46:21 +1000 Jan Schmidt <jan@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Don't discard first AU delimiter - Don't throw away AU delimiter(s) that precede the SPS/PPS. Should - fix MPEG-TS playback on iOS/Quicktime when muxing streams that - already have AU delimiters. - See https://bugzilla.gnome.org/show_bug.cgi?id=736213 for getting - h264parse to insert AU delimiters when they don't already - exist. - -2015-07-23 11:18:47 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: fix allocation meta structure leak - gst_query_add_allocation_meta() does not take ownership - of the structure, for some reason. - CID 1312135 - -2015-07-23 10:57:26 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: fix memory leak - GstCapsFeatures need to be freed with gst_caps_features_free() after use. - CID #1312136, CID #1312136 - -2015-07-02 20:10:50 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: Add GstControlBinding proxy - This is used to proxy GstControlBinding to the pad on the - parent object. This avoid having to sync the values in the proxy pad, - this is too early if you have a queue between the pad and the actual - aggregation operation. - https://bugzilla.gnome.org/show_bug.cgi?id=734060 - -2015-07-22 19:27:19 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: Register function name - Otherwise, it sometimes segfaults with debugging enabled - -2015-07-22 19:26:42 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: Use 1.0 style buffer allocation - -2015-07-22 16:58:12 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstgluploadelement.c: - glupload: Forward composition meta even without params - When the sink does not know the window size (e.g not created yet) - it will not add any param to the the composition meta. This is no - reason not to forward this meta API. Fixes issue where it could not - attach until we resize the window. - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-07-22 15:56:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstgloverlaycompositor.c: - gloverlaycompositor: Keep memory pointer alive - Keep the composition memory pointer alive while it's being - wrapped inside a GstGLMemory object. - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-07-22 14:17:42 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstgloverlaycompositor.c: - gloverlaycompositor: Pass buffer stride - The overlay pixel buffer stride was not given back - to the GL image. - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-05-19 16:08:08 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/audiomixer/gstaudioaggregator.c: - * tests/check/Makefile.am: - * tests/check/elements/audiomixer.c: - audioaggregator: Sync pad values before aggregating - We need to sync the pad values before taking the aggregator and pad locks - otherwise the element will just deadlock if there's any property changes - scheduled using GstController since that involves taking the aggregator and pad - locks. - Also add a test for this. - https://bugzilla.gnome.org/show_bug.cgi?id=749574 - -2015-07-22 14:05:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglcompositionoverlay.c: - * gst-libs/gst/gl/gstglcompositionoverlay.h: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstgloverlaycompositor.h: - gloverlaycompositor: Hide GstCompsitionOverlay object - This object is only used inside the compositor and does not - need to be expose in libgstgl API. - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-07-22 13:33:12 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/Makefile.am: - libgstgl: Makefile style fix - -2015-07-21 23:48:25 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstglcompositionoverlay.c: - * gst-libs/gst/gl/gstglcompositionoverlay.h: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstgloverlaycompositor.h: - composition-overlay: Positions are relative to texture - The coordinate are relative to the texture dimension and not - the window dimension now. There is no need to pass the window - dimension or to update the overlay if the dimension changes. - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-07-21 21:27:45 -0400 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstgloverlaycompositor.h: - gloverlaycompositor: Create own shader object - Make gloverlaycompositor independent of the shader used in the sink. - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-07-21 18:47:56 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Properly handle compsositor life time - Should be created in READY_TO_PAUSED, not PAUSED_TO_PLAYING. - Should be cleared in PAUSED_TO_READY. - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-07-22 16:10:35 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/liveadder/liveadder.c: - liveadder: remove unneeded variable - ret is declared just to initialize to TRUE and overwrite with the value of - vret. We can return the value of vret directly. vret is TRUE unless the - forward_event_func sets it to FALSE. - -2015-07-22 15:13:48 +0200 Edward Hervey <edward@centricular.com> - - * ext/qt/Makefile.am: - qt: Don't dist files that might not exist - We only require moc building at build time. - -2015-07-22 15:50:26 +0900 Young Han Lee <y.lee@lge.com> - - * configure.ac: - configure: require libxml2 >= 2.8 for DASH plugin - The DASH plugin uses xmlBufferDetach now in the code - that handles ContentProtection elements. - https://bugzilla.gnome.org/show_bug.cgi?id=752703 - -2015-07-22 08:05:04 +0200 Edward Hervey <bilboed@bilboed.com> - - * ext/qt/Makefile.am: - qt: Tidy up makefile a bit more - Separate generated files, from disted files - -2015-07-21 20:52:23 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: Read output buffer duration with lock held - -2015-07-21 11:23:21 +0100 Julien Isorce <j.isorce@samsung.com> - - * ext/gtk/gtkgstglwidget.c: - gstglwidget: use gst_gl_display_create_context - Also handle the failure case. - https://bugzilla.gnome.org/show_bug.cgi?id=750310 - -2015-07-21 11:28:08 +0100 Julien Isorce <j.isorce@samsung.com> - - * ext/gl/caopengllayersink.m: - caopengllayersink: use gst_gl_display_create_context - https://bugzilla.gnome.org/show_bug.cgi?id=750310 - -2015-07-21 11:21:27 +0100 Julien Isorce <j.isorce@samsung.com> - - * ext/gl/gstglstereosplit.c: - glstereosplit: use gst_gl_display_create_context - Also unlock the lock on error. - https://bugzilla.gnome.org/show_bug.cgi?id=750310 - -2015-07-21 14:10:57 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/liveadder/liveadder.c: - liveadder: return false if event couldn't be pushed - Make the gst pad's event function return false if the event couldn't be - pushed to the pad. - -2015-07-21 13:11:17 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst-libs/gst/gl/gstgloverlaycompositor.c: - gloverlaycompositor: for loop initial declarations are only allowed in C99 mode - Fixes compiler warnings - -2015-06-19 11:57:06 +0100 Julien Isorce <j.isorce@samsung.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglbasefilter.c: - gl: use gst_gl_display_create_context in more elements. - glbasefilter, glbasemixer and gltestsrc. - https://bugzilla.gnome.org/show_bug.cgi?id=750310 - -2015-07-21 17:34:27 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - gl/build: fix typo in _HEADERS resulting in installing the wrong file - /usr/include/gstreamer-1.0/gst/gl/gl.h:51:43: fatal error: - gst/gl/gstgloverlaycompositor.h: No such file or directory - -2015-07-21 15:39:35 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: add RGB to NV12/NV21 conversion - -2015-07-01 14:01:45 +0200 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - glimagesink: Send reconfigure event when window size changes - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-07-20 14:24:22 -0400 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstgluploadelement.c: - glimagesinkbin: Add allocation query for GstVideoOverlayComposition - Adds an GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE query to glupload - and glimagesink. Detects the query from the downstream elements, so - it is executed only when downstream supports the overlay API. - This makes pipelines with textoverlay ! glupload ! gldownload ! xvimagesink possible. - Uses allocation meta struct for passing the window size upstream. - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-04-20 13:17:09 +0200 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: Apply GstVideoOverlayCompositionMeta buffer to converted buffer - Since glcolorconvert creates a new GstBuffer, - without the GstVideoOverlayCompositionMeta data, - it needs to be copied to not be dropped. - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-06-18 13:34:58 +0200 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Detect overlay meta buffers correctly - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-06-18 05:43:50 +0200 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * ext/gl/gstglcolorconvertelement.c: - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstglupload.c: - glimagesinkbin: Add GstVideoOverlayCompositionMeta caps features - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-06-18 06:04:37 +0200 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: Upload and draw overlays with GstGLOverlayCompositor - Receives the GstOverlayComposition buffer in the glimagesink and draws them. - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-06-30 17:59:12 +0200 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstgloverlaycompositor.c: - * gst-libs/gst/gl/gstgloverlaycompositor.h: - gloverlaycompositor: Add GstGLOverlayCompositor class - Manages the GstGLCompositionOverlay objects, - caches already uploaded overlays and draws them. - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-06-18 14:15:01 +0200 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * gst-libs/gst/gl/gstglcompositionoverlay.c: - glcompositionoverlay: Add compatibility for GL contexts without glGenVertexArrays - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-06-13 15:35:47 +0200 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglcompositionoverlay.c: - * gst-libs/gst/gl/gstglcompositionoverlay.h: - glcompositionoverlay: Add class for managing GstVideoOverlayCompositionOverlay buffers - Add a class to store and manage the OpenGL texture, - vertex buffer and GstVideoOverlayRectangle. - Transforms overlay coordinate space to vertex buffer space with aspect ratios in mind. - = Example Pipelines = - Simple pipeline - gst-launch-1.0 videotestsrc ! \ - textoverlay text="Hello World" font-desc="sans bold 30" ! \ - glimagesink - Display 3 static overlays at different positions - gst-launch-1.0 videotestsrc ! \ - textoverlay text="text1" valignment="top" font-desc="sans bold 30" ! \ - textoverlay text="text2" halignment="right" font-desc="sans bold 30" ! \ - textoverlay text="text3" halignment="left" font-desc="sans bold 30" ! \ - glimagesink - Display subtitle file over testsrc - gst-launch-1.0 videotestsrc ! \ - textoverlay name=foo filesrc location=foo.srt ! subparse ! queue ! foo. foo. ! \ - glimagesink - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-06-18 11:33:29 +0200 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Move debug init to top of the file - https://bugzilla.gnome.org/show_bug.cgi?id=745107 - -2015-04-20 15:04:56 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - opusdec: Fix PLC frame size calculations - Previously, PLC frames always had a length of 120ms, which caused audio - quality degradation and synchronization errors. Fix this by calculating an - appropriate length for the PLC frame. - The length must be a multiple of 2.5ms. Calculate a multiple of 2.5ms that - is nearest to the current PLC length. Any leftover PLC length that didn't - make it into this frame is accumulated for the next PLC frame. - https://bugzilla.gnome.org/show_bug.cgi?id=725167 - -2015-07-18 21:18:23 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: minor clean-up - No need for a foreach callback function that's just a few - lines of code and is only used once, just do the event - pushing inline. - https://bugzilla.gnome.org/show_bug.cgi?id=705991 - -2015-02-06 13:22:14 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - dashdemux: add support for generating Protection events from ContentProtection elements - If a ContentProtection element is present in an AdaptationSet element, - send Protection events on the source pad, so that qtdemux can use this - information to correctly generate its source caps for DASH CENC - encrypted streams. - This allows qtdemux to support CENC encrypted DASH streams where the - content protection specific information is carried in the MPD file - rather than in pssh boxes in the initialisation segments. - This commit adds a new function to the adaptivedemux base class to allow - a GstEvent to be queued for a stream. The queue of events are sent the - next time a buffer is pushed for that stream. - https://bugzilla.gnome.org/show_bug.cgi?id=705991 - -2015-07-20 12:40:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: fix output caps for stream-format=ADTS - Should have framed=true in caps. Fixes voaacenc ! mpegtsmux. - -2015-07-20 12:38:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: fix aac caps in pad template for raw aac - Raw aac doesn't need framed=true. - Fixes not-negotiated error with voaacenc ! mpegtsmux. - -2015-07-20 11:09:20 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gtk/gtkgstglwidget.c: - gtk: Log GDK GL error when failling creating GdkGLContext - -2015-07-20 18:19:02 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: check for pbo availability before attempting pbo download - https://bugzilla.gnome.org/show_bug.cgi?id=751165 - -2015-07-18 17:19:18 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - * ext/qt/qtitem.cc: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * tests/check/libs/gstglcontext.c: - glcontext: fix get_current_gl_api on x11/nvidia drivers - They require to get_proc_address some functions through the - platform specific {glX,egl}GetProcAddress rather than the default - GL library symbol lookup. - -2015-07-18 17:08:36 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.h: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.h: - glcontext: consolidate get_proc_address function definition - Pass the GstGLAPI directly. - -2015-07-17 17:47:37 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglcolorconvertelement.c: - glcolorconvertelement: propagate failure to convert buffer upstream - Rather than just silently continuing - -2015-07-17 13:48:00 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - glcontext/glx: try creating a context with the highest version - nvidia drivers return the exact version in glGstString (GL_VERSION) - we request on creation so start with the highest known version and - work our way down. - -2015-07-16 00:37:58 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - * tests/check/libs/gstglcontext.c: - glcontext: track sharedness with a cookie - The previous approach of traversing the other_context weak ref tree was - 1. Less performant - 2. Incorrect for context destruction removing a link in the tree - Example of 2: - c1 = context_create (NULL) - c2 = context_create (c1) - c3 = context_create (c2) - context_can_share (c1, c3) == TRUE - context_destroy (c2) - unref (c2) - context_can_share (c1, c3) returns FALSE when it should be TRUE! - This does not remove the restriction that context sharedness can only - be tracked between GstGLContext's. - -2015-07-16 00:33:17 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: use the debug object variant for completeness - -2015-07-17 16:00:01 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gtkgstglwidget.c: - gtkgstglwidget: Cleanup unused private member - new_buffer has been moved to base class. Also cleanup - the properties comment, which are also all moved into - the base class. - -2015-07-17 15:57:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gstgtkbasesink.c: - gtksink: "widget" must be access from main thread - Document that "widget" property must be accessed from the - main thread (where GTK is running). This is the same for - state transition on these elements. It is very natural to - do so un GTK applications. - -2015-07-17 15:08:53 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gtkgstglwidget.c: - gtkglsink: Don't leak vertex array and buffers - This is now possible since reset is always called from the - main thread. - https://bugzilla.gnome.org/show_bug.cgi?id=752441 - -2015-07-17 14:36:56 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gtkgstbasewidget.c: - * ext/gtk/gtkgstbasewidget.h: - gtkgstbasewidget: Fix black frame on resize - This is solved by only applying the new format when the next - buffer is to be rendered and on the GTK thread. - https://bugzilla.gnome.org/show_bug.cgi?id=752441 - -2015-07-17 13:05:05 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gstgtkbasesink.c: - * ext/gtk/gtkgstbasewidget.c: - * ext/gtk/gtkgstbasewidget.h: - gtkgstbasewidget: Pass already parsed VideoInfo - As the base sink already parse the caps into VideoInfo it - makes sense to pass in VideoInfo to the widget instead. - https://bugzilla.gnome.org/show_bug.cgi?id=752441 - -2015-07-16 16:49:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtkglsink.h: - gtkglsink: Port to GstGtkBaseSink base class - https://bugzilla.gnome.org/show_bug.cgi?id=752441 - -2015-07-16 16:00:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gstgtksink.c: - * ext/gtk/gstgtksink.h: - gtksink: Port to GstGtkBaseSink - https://bugzilla.gnome.org/show_bug.cgi?id=752441 - -2015-07-16 15:59:59 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/Makefile.am: - * ext/gtk/gstgtkbasesink.c: - * ext/gtk/gstgtkbasesink.h: - gtkbasesink: Create a base class - This contains all the common code between the gtkglsink and - gtksink. - https://bugzilla.gnome.org/show_bug.cgi?id=752441 - -2015-07-16 14:30:42 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtkglsink.h: - * ext/gtk/gtkgstglwidget.c: - * ext/gtk/gtkgstglwidget.h: - gtkglsink: Port to GtkGstBaseWidget - https://bugzilla.gnome.org/show_bug.cgi?id=752441 - -2015-07-16 12:55:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gstgtksink.c: - * ext/gtk/gstgtksink.h: - * ext/gtk/gtkgstwidget.c: - * ext/gtk/gtkgstwidget.h: - gtksink: Port to GtkGstBaseWidget - https://bugzilla.gnome.org/show_bug.cgi?id=752441 - -2015-07-16 12:51:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/Makefile.am: - * ext/gtk/gtkgstbasewidget.c: - * ext/gtk/gtkgstbasewidget.h: - gtk: Add GtkGstBaseWidget - This is a "pseudo" base class. Basically it's a shared instance - and class structure and a shared set of function between the - two widget. It cannot have it's own type like normal base class - since the one instance will implement GtkGLArea while the other - implements GtkDrawingAreay. To workaround this, the parent instance - and class is a union of both. - https://bugzilla.gnome.org/show_bug.cgi?id=752441 - -2015-07-16 16:47:05 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstgluploadelement.c: - uploadelement: Protect against NULL pointer - I notice that if you stop the pipeline during a renegotiation - the upload may be NULL while an allocation query is being run. - In that scenario, returning FALSE to the allocation query is the - best thing. - -2015-07-15 17:35:22 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gtkgstglwidget.c: - gtkgstglwidget: Remove unused gl_caps - -2015-07-15 16:56:33 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gstgtksink.c: - gtksink: Create a window if the widget is unparented - The same way as it's now done with the gtkglsink, create a top - level window if the widget is not parented. - https://bugzilla.gnome.org/show_bug.cgi?id=751104 - -2015-07-15 14:35:02 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gstgtksink.c: - gtksink: Ensure the copy pasted code remains the same - Move back the default property at the same place they are in the - other sink. This helps when using a diff viewer to synchronized - this unfortunate copy paste. - https://bugzilla.gnome.org/show_bug.cgi?id=751104 - -2015-07-15 14:32:42 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtkglsink.h: - * ext/gtk/gstgtksink.c: - * ext/gtk/gtkgstglwidget.c: - * ext/gtk/gtkgstwidget.c: - gtk: Fix race between queue_draw and destroy - In GTK dispose can be called before the last ref is reached. This - happens when you close the container window. The dispose will be - explicitly called, and destroyed notify will be fired. This patch - fixes this race by properly tracking the widget state. - In the sink, we now set the widget pointer to NULL, so the widget - will properly get created again if you set your pipeline to NULL - state after the widget was destroy, and set it back to PLAYING. - https://bugzilla.gnome.org/show_bug.cgi?id=751104 - -2015-07-16 21:28:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/dash/gstplugin.c: - dashdemux: remove typefinder, move it to typefindfunctions in -base - Otherwise this plugin will be loaded pretty much whenever - there's anything to typefind. And the code was pretty much - copy'n'paste from -base anyway. - -2015-07-15 13:02:54 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: default timescale is 1 - default timescale value should be 1, not 0. - https://bugzilla.gnome.org/show_bug.cgi?id=752414 - -2015-07-15 13:41:37 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: free prop_string only after it's no longer needed - https://bugzilla.gnome.org/show_bug.cgi?id=752419 - -2015-07-16 17:21:51 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-plugins-bad.doap: - Update mailing list address from sourceforge to freedesktop - -2015-07-15 11:47:51 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gtkgstwidget.c: - gtkgstwidget: Add missing break in get_property - -2015-07-15 11:44:30 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gstgtkglsink.h: - * ext/gtk/gstgtksink.h: - gtksinks: Remove undefined private structure - The classes contains a private structure which are not defined, - hence unused. - -2015-07-14 17:40:32 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: memcpy on raw data upload - Anything else requires keeping track of the GstVideoFrame mapping - across possible multiple buffers to ensure correct data pointer - usage. - -2015-07-14 17:39:59 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasebuffer.c: - glbasebuffer: add some debug and zero the data pointers on init - -2015-07-10 01:00:15 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: don't wait for data on sparse inputs like metadata or subtitle streams - -2014-11-09 19:16:29 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - mpegtsmux: add basic support for asynchronous KLV metadata streams - This is defined in SMPTE Rp 217. In this case the - metadata PES packets carry no timestamps of their - own and no Metadata Access Unit Wrappers are used. - -2015-06-29 02:42:06 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: handle non-consecutive GstBuffer input without copying - CMBlockBuffer offers a model similar to GstBuffer, as it can - consist of multiple non-consecutive memory blocks. - Prior to this change, what we were doing was: - 1) Incorrect: - CMBlockBufferCreateWithMemoryBlock does not copy the data, - but we gst_buffer_unmap'd right away. - 2) Inefficient: - If the GstBuffer consisted of non-contiguous memory blocks, - gst_buffer_map resulted in malloc / memcpy. - With this change, we construct a CMBlockBuffer out of individual mapped - GstMemory objects. CMBlockBuffer is made to retain the GstMemory - objects (through the use of CMBlockBufferCustomBlockSource), so the - original GstBuffer can be unref'd. - https://bugzilla.gnome.org/show_bug.cgi?id=751241 - -2015-07-13 23:22:00 +1000 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/avsamplevideosink.m: - applemedia/avsample: fix unconditional use of OSX 10.10 API - We can just not use the error/status properties - https://bugzilla.gnome.org/show_bug.cgi?id=746631 - -2015-07-10 19:05:41 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: try harder to find the right Qt5 build tools - First check for Qt build tools in the host_bins directory - from the Qt5Core pkg-config file. This fixes the situation - where both Qt4 and Qt5 are installed but the global moc/uic/etc. - are the Qt4 version, which would result in build failures. - -2015-07-10 14:01:43 +0200 Edward Hervey <edward@centricular.com> - - * configure.ac: - * ext/qt/qtitem.cc: - configure/qt: Fix build without Qt5X11Extras - -2015-07-10 13:26:51 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparse: g_slice_new() can't return NULL - It will abort() if allocation fails. - -2015-07-10 13:19:40 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Don't allow network access when reading the XML data - -2015-07-10 19:22:08 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - qt: don't error out if Qt X11 could not be found - PCK_CHECK_MODULES default error-if-not-found implementation errors - so override it with a simple notice that we couldn't find the library. - -2015-07-06 23:10:51 +1000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * ext/Makefile.am: - * ext/qt/.gitignore: - * ext/qt/Makefile.am: - * ext/qt/gstplugin.cc: - * ext/qt/gstqsgtexture.cc: - * ext/qt/gstqsgtexture.h: - * ext/qt/gstqtsink.cc: - * ext/qt/gstqtsink.h: - * ext/qt/qtitem.cc: - * ext/qt/qtitem.h: - * tests/examples/qt/qml/.gitignore: - * tests/examples/qt/qml/main.cpp: - * tests/examples/qt/qml/main.qml: - * tests/examples/qt/qml/play.pro: - * tests/examples/qt/qml/qml.qrc: - new qt5 qml GL video sink - Very much in the same spirit as the Gtk GL sink - Two things are provided - 1. A QQuickItem subclass that renders out RGBA filled GstGLMemory - buffers that is instantiated from qml. - 2. A sink element that will push buffers into (1) - To use - 1. Declare the GstGLVideoItem in qml with an appropriate - objectName property set. - 2. Get the aforementioned GstGLVideoItem from qml using something like - QQmlApplicationEngine engine; - engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); - QObject *rootObject = engine.rootObjects().first(); - QQuickItem *videoItem = rootObject->findChild<QQuickItem *> ("videoItem"); - 3. Set the videoItem on the sink - https://bugzilla.gnome.org/show_bug.cgi?id=752185 - -2015-07-08 17:17:18 +0200 Rico Tzschichholz <ricotz@ubuntu.com> - - * sys/bluez/Makefile.am: - bluez: Fix make dist while bluez >= 5 is not available - -2015-07-09 18:31:34 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Fix previous commit - We only want to do a hard reset of the observations if we're working - with TIME segments in push mode. For BYTE segment we want to keep - the observations (in order to do seeks in push-mode). - -2015-07-09 16:59:16 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Flush more on DISCONT buffers in push mode - When in push mode, we want to discard all previous observations from the - mpegtspacketizer when we get a DISCONT buffer. - This avoids trying to calculate bogus timestamps (estimating them using old - PCR observations). - We only do a hard reset in push-mode. In pull-mode we still need the observations - (in order to seek properly) - -2015-07-09 11:07:29 +0200 Edward Hervey <bilboed@bilboed.com> - - * .gitignore: - gitignore: Add new generated files - -2015-07-09 11:05:10 +0200 Edward Hervey <bilboed@bilboed.com> - - * sys/bluez/Makefile.am: - bluez: Include new file in dist'ed files - Fixes make distcheck and tarball generation - -2015-07-09 13:03:23 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - * ext/gtk/gtkgstwidget.c: - * tests/check/Makefile.am: - gtk: add to the generic/states test - -2015-06-17 09:36:57 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * ext/gtk/gstgtkglsink.c: - GstGtkGLSink: Ensure widget has a toplevel parent - Checking for a parent is not enough, it must have a toplevel one. - If widget has no toplevel parent then add it in a GtkWindow, that - make it usable from gst-launch-1.0. - https://bugzilla.gnome.org/show_bug.cgi?id=751104 - -2015-06-17 09:36:40 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtkglsink.h: - GstGtkGLSink: Post error if widget gets destroyed - https://bugzilla.gnome.org/show_bug.cgi?id=751104 - -2015-06-16 16:21:26 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * ext/gtk/gstgtkglsink.c: - GstGtkGLSink: fix possible warning in finalize - If the element is finalized before going in READY state - the widget could still be NULL. - https://bugzilla.gnome.org/show_bug.cgi?id=751104 - -2015-07-08 23:14:13 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - mpdparser: Fix some memory leaks in the MPD parser and unit test - -2015-07-07 16:59:52 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - dashdemux: tests: added unit tests to test all functions - Added unit tests for all functions. Code coverage: - Overall coverage rate: - lines......: 83.8% (1941 of 2316 lines) - functions..: 100.0% (141 of 141 functions) - -2015-07-08 17:08:56 +0300 Roman Donchenko <roman.donchenko@itseez.com> - - * gst/videoparsers/gstpngparse.c: - pngparse: fix a GstCaps object leak - https://bugzilla.gnome.org//show_bug.cgi?id=752127 - -2015-03-26 11:34:10 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsdemux/pesparse.c: - tsdemux: remove unnecessary check - This is not public API, use g_assert() instead of - g_return_if_fail(), so that it's compiled out in - releases. It's only called from our code, with &foo. - -2014-06-30 13:20:12 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: add support for KLV metadata streams - There's no timestamps for these streams though, we - might want to make some up based on the last/next - video PTS or so. - -2015-07-08 16:31:48 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - Revert "Revert "dashdemux: fixed gst_mpd_client_advance_segment to return GST_FLOW_EOS"" - This reverts commit 4875ddf5855a26f349df7b385b68eb692e314bfa. - This was based on a misunderstanding of the code. - https://bugzilla.gnome.org/show_bug.cgi?id=752085 - -2015-07-06 13:28:05 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - gl/eagl: Don't call anything synchronously from the main thread - This will deadlock if the main thread is the one who creates the GstGLContext. - All things we call from the main thread should be possible from any thread. - https://bugzilla.gnome.org/show_bug.cgi?id=751101 - -2015-07-08 12:16:35 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * sys/bluez/gstavdtpsrc.c: - bluez: remove unnecessary goto - All goto fail happen before ret is set. ret must be NULL, and the only - thing the fail statement block does is return NULL. Replacing the jumps to - do this return directly. - CID #1311329 - -2015-07-08 11:32:58 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/dash/gstdashdemux.c: - dashdemux: remove redundant else statement - Else statement is redundant when the if block finishes with an return. - -2015-07-08 11:42:48 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc-constants.h: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - androidmedia: Add support for H265/HEVC - -2015-06-29 12:40:55 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: fix refcount error in error handling - https://bugzilla.gnome.org/show_bug.cgi?id=751641 - -2015-07-07 19:48:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Explicitly check for CUSTOM_ERROR when converting errors to EOS - We use things like CUSTOM_SUCCESS* in other places, and those are not errors - but should just be handled like OK. - -2015-07-07 19:26:00 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - Revert "dashdemux: fixed gst_mpd_client_advance_segment to return GST_FLOW_EOS" - This reverts commit dfe37ffc59fdf5f4075696976d98ec8d6db73138. - https://bugzilla.gnome.org/show_bug.cgi?id=752085 - -2015-07-07 19:25:28 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Fix off-by-one in has-next-segment calculation - -2015-07-07 18:37:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: If downloading the last fragment fails, consider this as EOS and not ERROR - Sometimes the last fragment does not exist because of rounding errors with the - durations. Just finish the stream gracefully instead of erroring out instead. - -2015-07-07 22:35:47 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgldownloadelement.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - download: only start a download transfer for sysmem caps features - -2015-07-06 12:08:52 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - dashdemux: tests: added indentation in xml strings to improve readability - https://bugzilla.gnome.org/show_bug.cgi?id=752027 - -2015-07-03 16:17:58 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: added parsing of bitstreamSwitching@AdaptationSet - https://bugzilla.gnome.org/show_bug.cgi?id=751170 - -2015-07-03 15:31:35 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.h: - dashdemux: regrouped functions in gstmpdparser.h file - Moved gst_mpd_client_get_next_segment_availability_end_time and - gst_mpd_client_add_time_difference functions to be grouped with - functions from the same category. - https://bugzilla.gnome.org/show_bug.cgi?id=752027 - -2015-07-06 14:21:17 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - dashdemux: tests: corrected code layout - deleted the empty line between gst_mpd_parse call and its check so that - the assert is next to the function it is testing - https://bugzilla.gnome.org/show_bug.cgi?id=752027 - -2015-07-07 10:56:47 +0900 Hyunjun Ko <zzoon.ko@samsung.com> - - * gst-libs/gst/codecparsers/gstmpegvideometa.c: - mpegvideometa: add meta transform function - https://bugzilla.gnome.org/show_bug.cgi?id=751778 - -2015-07-07 10:57:26 +0900 Hyunjun Ko <zzoon.ko@samsung.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - glsyncmeta: transform func: return FALSE if not supported or failed - https://bugzilla.gnome.org/show_bug.cgi?id=751778 - -2015-07-06 14:14:12 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: fixed gst_mpd_client_advance_segment to return GST_FLOW_EOS - Fixed gst_mpd_client_advance_segment to return GST_FLOW_EOS if the - new index is out of range. - https://bugzilla.gnome.org/show_bug.cgi?id=751850 - -2015-07-07 16:39:09 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.h: - android: add missing egl.h include - -2015-07-07 15:30:17 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltransformation.c: - gltransformation: correct vao usage - keep the vao bound after uploading the new vertex data - fixes a mesa GL error "no vertex array object bound" on caps changes - -2015-06-16 07:49:34 +0000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstopengl.c: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h: - * gst-libs/gst/gl/egl/Makefile.am: - * gst-libs/gst/gl/egl/gstegl.h: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/egl/gstgldisplay_egl.h: - * gst-libs/gst/gl/gstglapi.h: - gl: consolidate egl header includes to egl-only headers - They may conflict with other headers. - -2015-07-06 19:33:35 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gtk/gtkgstglwidget.c: - gtkglsink: Release the widget lock when trying to get the GL context - Otherwise we might be waiting for the lock on the main loop (for - example in the ->render vmethod) and thus we will deadlock. - -2015-07-06 18:51:07 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Remove pixel-aspect-ratio field from the caps returned by getcaps - Avoiding not negotiated error while negotiating as we anyway force 1/1 - as output - -2015-07-06 15:24:06 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/curl/gstcurlsshsink.c: - curlsshsink: remove redundant else statement - Else statement is redundant when the if block finishes with an return. - -2015-07-02 15:17:51 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: fixed segment start when specified by SegmentTimeline - @t attribute in segment Timeline is relative to the period start. - Corrected the code to take this into account when computing segment - timestamp. - https://bugzilla.gnome.org/show_bug.cgi?id=751841 - -2015-07-03 17:00:31 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: wrong segment duration computed by gst_mpd_client_setup_representation - Corrected computation of segment start and duration. - https://bugzilla.gnome.org/show_bug.cgi?id=751914 - -2015-07-03 16:10:20 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: corrected search for audio languages - Corrected the initialisation of mimeType in - gst_mpdparser_get_list_and_nb_of_audio_language: the variable is used - in a loop, so it must be set to NULL at the beginning of each iteration. - https://bugzilla.gnome.org/show_bug.cgi?id=751911 - -2015-07-03 21:58:26 +0200 Stefan Sauer <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From f74b2df to 9aed1d7 - -2015-07-03 12:17:42 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/gl/gstglmixerbin.c: - * ext/gl/gstglvideomixer.c: - glvideomixer, glmixer: Add description and klass - -2015-07-03 19:24:58 +0530 Arun Raghavan <git@arunraghavan.net> - - * configure.ac: - build: Fix broken BlueZ configure check - The previous commit left an extra set of brackets, and missed removing - the explicit dbus check (which is no longer needed since we're using - gdbus). - -2015-01-13 10:31:41 -0800 Nick Stoughton <nstoughton@aether.com> - - * configure.ac: - build: remove support for bluez4 - -2014-12-30 07:21:44 -0800 Nick Stoughton <nstoughton@aether.com> - - * configure.ac: - * sys/bluez/Makefile.am: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsrc.c: - * sys/bluez/gstavdtputil.c: - * sys/bluez/gstavdtputil.h: - * sys/bluez/org.bluez.xml: - bluez: refactor to use glib and add connection state tracking - -2015-06-15 23:40:44 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: fix another regression - Introduced by c4c9fe60b pcapparse: Take buffer directly from the adapter - Using gst_adapter_take_buffer_fast() can lead to buffers that are - made up of multiple memories with the first memory smaller than the - RTP header size, which violates assumptions GstRtpBaseDepayloader - makes, namely that the complete RTP header will be in the first - memory. This leads to such packets being dropped when feeding - them from pcapparse to RTP depayloaders. Use take_buffer() so - we get buffers with a single memory. - -2015-07-02 13:45:04 +0200 Stian Selnes <stian@pexip.com> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/pcapparse.c: - tests: pcapparse: add unit test for frames with eth padding - https://bugzilla.gnome.org/show_bug.cgi?id=751879 - -2015-06-15 12:55:39 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: fix regression when handling packets with eth padding - Introduced by c4c9fe60b pcapparse: Take buffer directly from the adapter - Flush any trailing bytes after the payload from the adapter as well, - otherwise we'll read a bogus packet size from the adapter next and - then everything goes downhill from there. - https://bugzilla.gnome.org/show_bug.cgi?id=751879 - -2015-07-02 18:51:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Unref video frames and codec state in all cases - -2015-07-02 10:26:18 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglviewconvert.c: - gl: initialize output params to 0 before calling gl functions - The client side API of the Chromium's GPU Process has asserts - in debug mode that check that output params are initialized to 0. - -2015-06-26 15:34:35 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglupload.c: - gl: Don't leak pool if set_config failed - -2015-06-26 15:33:33 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - glfilter: Don't cache buffer pool - Caching and sharing to multiple element the same pool prevents - renegotiation from passthrough to not passthrough. - -2015-07-02 14:15:05 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Uninitializing the decoder can't fail and will always return 0 == cmResultSuccess - ... but when we cast cmResultSuccess to a gboolean it will be FALSE, and make - GstVideoDecoder::stop() fail for no reason. - -2015-07-02 17:08:26 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * ext/gl/gstglimagesink.c: - glimagesink: use g_clear_error instead of g_error_free - replace g_error_free with g_clear_error, as it internally - checks if error variable is valid or not. - https://bugzilla.gnome.org/show_bug.cgi?id=751823 - -2015-07-02 16:27:06 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * sys/androidmedia/gstamc.c: - amc: fix check whether we managed to acquire a buffer - https://bugzilla.gnome.org/show_bug.cgi?id=751821 - -2015-06-30 15:52:18 +0200 Miguel París Díaz <mparisdiaz@gmail.com> - - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpdec.h: - srtpdec: Add config for the replay window size - https://bugzilla.gnome.org/show_bug.cgi?id=751729 - -2015-06-30 13:20:43 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: corrected parsing of %u in segment templates - https://bugzilla.gnome.org/show_bug.cgi?id=751716 - -2015-06-29 22:18:38 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: corrected recognition of $$$ in segment templates - fixed recognition of $$ after a $ that ends an identifier, eg $Time$$$ - https://bugzilla.gnome.org/show_bug.cgi?id=751682 - -2015-06-29 18:50:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstjniutils.c: - androidmedia: Call initialize_classes() also when we got the Java VM from the app - https://bugzilla.gnome.org/show_bug.cgi?id=751664 - -2015-06-29 16:10:39 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * ext/gl/gstglviewconvert.c: - gl: add missing break - gst_gl_view_convert_element_set_property() is missing a break at the end - of the PROP_OUTPUT_DOWNMIX_MODE case. Adding it. - CID #1308949 - -2015-06-26 14:12:22 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Don't leak pool - gst_query_add_allocation_pool is transfer none. Also unref - if there was a configuration error. - -2015-06-26 15:58:25 +0900 Sangkyu Park <sk1122.park@samsung.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: check pointer before dereferencing - gst_ps_demux_get_stream() could return NULL when it is unknown stream, - check this hasn't happened before dereferencing the returned pointer. - https://bugzilla.gnome.org/show_bug.cgi?id=751528 - -2015-06-26 13:09:54 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: corrected next fragment duration validation - Before returning the next fragment duration value, the - gst_mpd_client_get_next_fragment_duration function tries to validate it. - But the condition was incorrect. - https://bugzilla.gnome.org/show_bug.cgi?id=751539 - -2015-06-25 23:49:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Move unref() into the right scope - -2015-06-25 23:32:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Properly handle presentationTimeOffset for seeking and multi-period streams - Segment start/time/position/base should only be modified if this is the first - time we send a segment, otherwise we will override values from the seek - segment if new streams have to be exposed as part of the seek. - Segment base should be calculated from the segment start based on the stream's - own segment, not the demuxer's segment. Both might differ slightly because of - the presentationTimeOffset. - Always add the presentationTimeOffset (relative to the period start, not - timestamp 0) to the segment start after resetting the stream's segment based - on the demuxer's segment (i.e. after seeks or stream restart). Also make sure - to keep the stream's segment up to date and not just send a new segment event - without storing the segment in the stream. - https://bugzilla.gnome.org/show_bug.cgi?id=745455 - -2015-06-25 23:24:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - dashdemux: Subtract the period start time from the presentation offset - We're interested in the offset between the period start timestamp and the - actual media timestamp so that we can properly correct for it. The absolute - presentation offset to timestamp 0 is useless as the only thing we really - care about is the offset between the current fragment timestamp and the - media timestamp. - -2015-06-25 20:19:34 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - dashdemux: Subtract the period start when seeking based on a template - Otherwise we will look for segments after the period usually. The seek - timestamp is relative to the start of the first period and we have to - select a segment relative to the current period's start. - -2015-06-25 20:09:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - dashdemux: Include the period start in the fragment timestamps in all cases - We didn't do this for fragments that are generated on demand from a template, - only for the other cases when they were all generated upfront. This caused - fragment timestamps to start from 0 again for each new period. - -2015-06-25 23:23:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Seek on the new streams if the seek caused a period switch - Seeking on the old streams is pointless, they are going to be freed on the - next opportunity. - -2015-06-25 15:05:20 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dash: Correct check for valid timeShiftBufferDepth - If not set, the timeShiftBufferDepth has a default value of -1. - The standard says that this should be interpreted as infinite. - The gst_mpd_client_check_time_position function incorrectly compares - timeShiftBufferDepth with 0 instead of -1 to determine if it was set. - https://bugzilla.gnome.org/show_bug.cgi?id=751500 - -2015-06-25 11:02:41 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * ext/opencv/gstfacedetect.c: - * sys/applemedia/iosassetsrc.m: - docs: decodebin2 -> decodebin - -2015-04-27 15:09:18 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/coremediabuffer.c: - applemedia: enable sharing of CMBlockBuffer data - Instead of wrapping with GST_MEMORY_FLAG_NO_SHARE, we make the GstMemory - object retain the underlying CMBlockBuffer. - https://bugzilla.gnome.org/show_bug.cgi?id=751072 - -2015-04-27 15:02:59 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/coremediabuffer.c: - applemedia: CMBlockBuffer can be non-contiguous - CMBlockBufferGetDataLength would return the entire data length, while - size of individual blocks can be smaller. Iterate over the block buffer - and add the individual (possibly non-contiguous) memory blocks. - https://bugzilla.gnome.org/show_bug.cgi?id=751071 - -2015-06-24 17:16:46 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: Corrected duration argument for gst_mpd_client_add_media_segment call - The last parameter of gst_mpd_client_add_media_segment function is a - duration. But when called from gst_mpd_client_setup_representation, the - last argument was wrongly set to PeriodEnd - https://bugzilla.gnome.org/show_bug.cgi?id=751449 - -2015-06-24 21:42:32 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: incorrect use of period start - The period start information, calculated in gst_mpd_client_setup_media_presentation - function is stored in stream_period->start. The information read from - xml file and stored in stream_period->period->start is not changed. - If the xml file does not contain the period start information, - stream_period->period->start will be -1. - The function gst_mpd_client_get_next_segment_availability_end_time wants to - use period start time, but incorrectly uses stream_period->period->start - (value from xml file, which could be -1) instead of stream_period->start - (computed value) - https://bugzilla.gnome.org/show_bug.cgi?id=751465 - -2015-06-15 17:18:41 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - tests: dashdemux: renamed functions - Renamed 2 testcase functions: - - dash_mpdparser_program_information - - dash_mpdparser_base_URL - -2015-06-25 00:04:32 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -=== release 1.5.2 === - -2015-06-24 23:37:26 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.5.2 - -2015-06-24 23:01:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2015-06-15 17:30:26 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - tests: dashdemux: added explicit type conversions - flexelint (http://www.gimpel.com/html/flex.htm) static code analyser - complained about implicit conversions from unsigned to signed, so I added - explicit conversions. - Ideally, the size parameter of gst_mpd_parse function should be unsigned, - but I don't want to change the API. - -2015-06-15 16:59:33 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - tests: dashdemux: corrected return type for duration_to_ms function - The duration_to_ms function converts a time specified by year, month, day, - hour, minute, second, millisecond to a millisecond value. Because all the - arguments are positive numbers, the result must also be positive. - This patch changes the returned value from a gint64 to a guint64 type. - -2015-06-24 11:15:46 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/cs.po: - * po/de.po: - * po/hu.po: - * po/pl.po: - * po/ru.po: - * po/uk.po: - * po/vi.po: - po: Update translations - -2015-06-23 18:19:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Also update segment.base and segment.time when switching periods - And include the presentation offset in the last known position for each - stream, and just because we can also keep track of the latest known position - inside the demuxer segment. - -2015-06-23 16:46:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - Revert "gl/window/x11: don't create our own X11 display" - This reverts commit 5697b6b89b4b2a15c45bd47be940a17f4412ea11. - https://bugzilla.gnome.org/show_bug.cgi?id=751003 - -2015-06-23 14:16:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - Revert "eagl: Don't dispatch_sync() to the main thread if we are on the main thread" - This reverts commit 0bff481011cf74c59869b511393d1696b570e3d5. - It wasn't supposed to be merged and also doesn't fix the problem. - -2015-06-23 13:13:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Remember the last return value of gst_adaptive_demux_stream_update_fragment_info() - It's going to return EOS if the period ended or otherwise there is just no - next fragment left. If we don't store the last return value, it will always - stay OK and gst_adaptive_demux_combine_flows() will always return OK instead - of EOS once all streams are done. - This partially switches period changes in DASH by at least trying to switch - instead of just stopping. What is still left is that after a period change - with DASH the times all start at 0 again instead of continuing. - -2015-06-23 11:05:06 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - eagl: Don't dispatch_sync() to the main thread if we are on the main thread - This will otherwise deadlock. - https://bugzilla.gnome.org/show_bug.cgi?id=751101 - -2015-06-23 10:31:44 +0200 John Ludwig <john@theludwigs.com> - - * gst-libs/gst/gl/glprototypes/base.h: - gl: Include texParameterf in the GL function table - https://bugzilla.gnome.org/show_bug.cgi?id=751228 - -2015-05-29 14:27:24 +0300 Vivia Nikolaidou <vivia@toolsonair.com> - - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gsterrorignore.c: - * gst/debugutils/gsterrorignore.h: - error-ignore: New element to convert some GstFlowReturn types into others - Can be used to fix misbehaving sinks. It will pass through all buffers - until it encounters GST_FLOW_ERROR or GST_FLOW_NOT_NEGOTIATED (configurable). - At that point it will unref the buffers and return GST_FLOW_NOT_LINKED - (configurable) - until the next READY_TO_PAUSED or FLUSH_STOP. - https://bugzilla.gnome.org/show_bug.cgi?id=750098 - -2015-06-20 13:36:27 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: simplifies and improves sink_get_caps. - The problem here was that after removing the formats and - all the things we could convert, we then intersected these - caps with the template caps. - Hence if a subclass offered permissive sink templates - (eg all the possible formats videoconvert handles), but only - one output format, then at negotiation time getcaps returned - caps with the format restricted to that format, even though - we do handle conversion. - https://bugzilla.gnome.org/show_bug.cgi?id=751255 - -2015-06-22 15:47:18 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/opencv/gstmotioncells.c: - * ext/opencv/gstmotioncells.h: - motioncells: Port to g_get_current_time - This is more portable. - https://bugzilla.gnome.org/show_bug.cgi?id=751221 - -2015-06-16 17:18:52 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: add frame rate range to caps - When AVFoundation indicates a supported frame rate range, add it to - the caps. This is important for devices such as the iPhone 6, which - indicate a single AVFrameRateRange of 2fps - 60fps. - https://bugzilla.gnome.org/show_bug.cgi?id=751048 - -2015-06-15 17:37:42 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - tests: dashdemux: added parsing of period element - Improved dash_mpd unit tests by adding new tests that parse the Period element. - Code coverage reported by lcov for dash/gstmpdparser.c is: - lines......: 43.0% (985 of 2290 lines) - functions..: 47.5% (67 of 141 functions) - -2015-06-22 14:06:04 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: fix consistency about pbo availability. - https://bugzilla.gnome.org/show_bug.cgi?id=751165 - -2015-06-15 17:34:48 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/elements/dash_mpd.c: - tests: dashdemux: extended MPD element test to test xml namespaces - Extended the dash_mpdparser_mpd testcase to also test parsing the xml - namespace attribute. - https://bugzilla.gnome.org/show_bug.cgi?id=750863 - -2015-06-15 13:43:53 +0200 Mersad Jelacic <mersad@axis.com> - - * ext/opus/gstopusenc.c: - opusenc: Add bitrate to the tags - https://bugzilla.gnome.org/show_bug.cgi?id=750992 - -2015-06-15 12:59:55 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: corrected computation of period's duration - According to ISO/IEC 23009-1:2014(E), chapter 5.3.2.1 - "The Period extends until the PeriodStart of the next Period, or until - the end of the Media Presentation in the case of the last Period." - This means that a configured value for optional attribute period duration - should be ignored if the next period contains a start attribute or it is - the last period and the MPD contains a mediaPresentationDuration attribute. - https://bugzilla.gnome.org/show_bug.cgi?id=750797 - -2015-06-22 13:29:25 +0200 Wim Taymans <wtaymans@redhat.com> - - * gst/bayer/gstbayerorc-dist.c: - bayer: update ORC files - Update ORC files with newest ORC to fix backup code generation error. - -2015-06-22 10:49:50 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/pcapparse/gstirtspparse.c: - irtspparse: reflow code to avoid uninitialized variable warning - This should hopefully allow even the most challenged static - code analyzer to figure out that it's all fine. Also makes - the flow clearer. - https://bugzilla.gnome.org/show_bug.cgi?id=751305 - -2015-06-22 10:58:00 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - tsmux: code style fix - trivial patch to add proper ( while checking for if(G_UNLIKELY()) - https://bugzilla.gnome.org/show_bug.cgi?id=751305 - -2015-06-22 09:23:12 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/uvch264/gstuvch264_src.c: - uvch264src: fix small leak in caps query handler - gst_query_set_caps_result() does not take ownership of the caps. - -2015-06-22 11:03:15 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * sys/uvch264/gstuvch264_src.c: - uvch264_src: add missing break in caps query handler - There is a missing break statement in switch, - which will result in executing default case as well - resulting in wrong behavior - https://bugzilla.gnome.org/show_bug.cgi?id=751305 - -2015-06-22 09:08:00 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpeg1sys/.gitignore: - * gst/mpeg1sys/Makefile.am: - * gst/mpeg1sys/buffer.c: - * gst/mpeg1sys/buffer.h: - * gst/mpeg1sys/gstmpeg1systemencode.c: - * gst/mpeg1sys/gstmpeg1systemencode.h: - * gst/mpeg1sys/main.h: - * gst/mpeg1sys/mpeg1systemencode.vcproj: - * gst/mpeg1sys/systems.c: - mpeg1sys: remove ancient plugin that's never even been ported to 0.8 - -2015-06-21 17:13:07 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gstjpegparser.h: - codecparsers: jpeg: add some padding to ScanHdr struct - For bits that we don't parse out at the moment. - -2015-06-21 17:03:52 +0100 Tim-Philipp Müller <tim@centricular.com> - - * win32/common/libgstcodecparsers.def: - codecparsers: jpeg: add new API to .def file - -2015-06-21 14:58:17 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gstjpegparser.c: - codecparsers: jpeg: fix docs for table parsing functions - -2015-06-21 13:55:29 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/codecparsers/gstjpegparser.c: - * gst-libs/gst/codecparsers/gstjpegparser.h: - docs: add new JPEG codecparser API to the docs - And sprinkle some more Since markers - -2015-06-21 11:51:38 +0100 Tim-Philipp Müller <tim@centricular.com> - - * .gitignore: - * tests/examples/codecparsers/Makefile.am: - * tests/examples/codecparsers/parse-vp8.c: - * tests/icles/.gitignore: - * tests/icles/Makefile.am: - examples: move vp8 parser test to codecparser example directory - -2015-06-21 11:20:57 +0100 Tim-Philipp Müller <tim@centricular.com> - - * .gitignore: - * configure.ac: - * tests/examples/Makefile.am: - * tests/examples/codecparsers/Makefile.am: - * tests/examples/codecparsers/parse-jpeg.c: - examples: add small jpeg codecparser test - https://bugzilla.gnome.org/show_bug.cgi?id=673925 - -2015-06-20 22:49:23 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gstjpegparser.c: - codecparsers: jpeg: fix validity checking of data parsed - g_return_val_if_fail() and g_assert() are not appropriate - for checking untrusted external data. - https://bugzilla.gnome.org/show_bug.cgi?id=673925 - -2015-06-20 19:52:42 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gstjpegparser.c: - * gst-libs/gst/codecparsers/gstjpegparser.h: - codecparsers: jpeg: fix up API - - add data pointer to GstJpegSegment and pass segment - to all parsing functions, rename accordingly - - shorten GstJpegMarkerCode enum type name to GstJpegMarker - - move function gtk-doc blurbs into .c file - - add since markers - - flesh out docs for SOF markers - https://bugzilla.gnome.org/show_bug.cgi?id=673925 - -2015-06-14 11:41:52 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gstjpegparser.c: - * gst-libs/gst/codecparsers/gstjpegparser.h: - codecparsers: jpeg: tweak API a little - https://bugzilla.gnome.org/show_bug.cgi?id=673925 - -2015-06-14 19:01:12 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gstjpegparser.c: - * gst-libs/gst/codecparsers/gstjpegparser.h: - codecparsers: jpeg: hide gst_jpeg_scan_for_marker_code() - Make this function private for now, since it's unclear whether - it's actually needed seeing that gst_jpeg_parse() scans too. - https://bugzilla.gnome.org/show_bug.cgi?id=673925 - -2013-09-24 16:10:45 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstjpegparser.c: - codecparsers: jpeg: fix and optimize scan for next marker code. - Fix scan for next marker code when there is an odd number of filler - (0xff) bytes before the actual marker code. Also optimize the loop - to execute with fewer instructions (~10%). - This fixes parsing for Spectralfan.mov. - -2013-09-18 15:56:52 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstjpegparser.c: - codecparsers: jpeg: fix calculation of segment size. - The size of a marker segment is defined to be exclusive of any initial - marker code. So, fix the size for SOI, EOI and APPn segments but also - the size of any possible segment that is usually "reserved" or not - explicitly defined. - https://bugzilla.gnome.org/show_bug.cgi?id=707447 - -2013-06-13 13:22:18 +0800 Wind Yuan <feng.yuan@intel.com> - - * gst-libs/gst/codecparsers/gstjpegparser.c: - codecparsers: jpeg: fix default Huffman tables generation. - Fix build_huffman_table() to correctly fill in the associated HUFFVAL - entries to the default Huffman tables. - -2012-09-12 10:40:06 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/gstjpegparser.c: - * gst-libs/gst/codecparsers/gstjpegparser.h: - codecparsers: jpeg: add JPEG bitstream parser - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - https://bugzilla.gnome.org/show_bug.cgi?id=673925 - -2015-06-20 16:07:57 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix typo in log message - -2015-06-15 16:09:54 +0100 Julien Isorce <j.isorce@samsung.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - gldisplay: add gst_gl_display_create_context - It also emits a create-context signal so that an application - can provide an external GstGLContext backend. - https://bugzilla.gnome.org/show_bug.cgi?id=750310 - -2015-06-15 16:36:26 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - glcontext: move display from priv - https://bugzilla.gnome.org/show_bug.cgi?id=750310 - -2015-06-18 10:55:28 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - Revert "glcontext: add gst_gl_context_set_display helper" - This reverts commit 71b8103cbd16fff9cf5a65cf517083cb794aa3b5. - -2015-06-18 10:52:18 +0100 Julien Isorce <j.isorce@samsung.com> - - * configure.ac: - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gpuprocess/Makefile.am: - * gst-libs/gst/gl/gpuprocess/gstglcontext_gpu_process.c: - * gst-libs/gst/gl/gpuprocess/gstglcontext_gpu_process.h: - * gst-libs/gst/gl/gpuprocess/gstglwindow_gpu_process.c: - * gst-libs/gst/gl/gpuprocess/gstglwindow_gpu_process.h: - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglapi.h: - Revert "gl: add GstGLContextGPUProcess backend" - This reverts commit b377112ee38912d316e77b4e2102041389dc0051. - -2015-06-19 14:35:37 +1000 Jan Schmidt <jan@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Remove duplicate, useless line of code - -2015-06-18 22:11:05 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/gl/gstopengl.c: - opengl: glstero* are only built with full OpenGL - Don't try to register the elements unless they are built. - -2015-06-18 21:09:24 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * configure.ac: - style: Remove white spaces at the end of line - -2015-06-18 18:09:55 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglviewconvert.c: - glviewconvert: Fix GLES2 compatibility - -2015-06-18 18:02:21 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglviewconvert.c: - glviewconvert: Fix broken validity check - -2015-06-15 16:06:41 +1000 Jan Schmidt <jan@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Move PAR calcs, and use them for stereoscopic half-aspect - Move the pixel-aspect-ratio calculations higher up in caps - determination, so the results are available for a call to - gst_video_multiview_guess_half_aspect() when stereoscopic video - is detected. - -2015-05-30 03:09:17 +1000 Jan Schmidt <jan@centricular.com> - - * configure.ac: - * tests/examples/gl/gtk/3dvideo/.gitignore: - * tests/examples/gl/gtk/3dvideo/3dvideo.vcproj: - * tests/examples/gl/gtk/3dvideo/Makefile.am: - * tests/examples/gl/gtk/3dvideo/main.cpp: - * tests/examples/gl/gtk/3dvideo/mviewwidget.c: - * tests/examples/gl/gtk/3dvideo/mviewwidget.h: - * tests/examples/gl/gtk/Makefile.am: - 3dvideo: Add simple gtk example stereoscopic video player - https://bugzilla.gnome.org/show_bug.cgi?id=611157 - -2015-05-30 02:29:04 +1000 Jan Schmidt <jan@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstglstereomix.c: - * ext/gl/gstglstereomix.h: - * ext/gl/gstglstereosplit.c: - * ext/gl/gstglstereosplit.h: - * ext/gl/gstglviewconvert.c: - * ext/gl/gstglviewconvert.h: - * ext/gl/gstopengl.c: - gl: Add glviewconvert, glstereomix and glstereosplit elements - Conversion elements for transforming multiview/stereoscopic video - https://bugzilla.gnome.org/show_bug.cgi?id=611157 - -2015-05-30 02:26:32 +1000 Jan Schmidt <jan@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: Support multiview/stereoscopic video - Support video with multiview info in the caps, transform - it to mono anaglyph by default, but allow for configuring - other output modes and handoff to the app via - the draw signal. - https://bugzilla.gnome.org/show_bug.cgi?id=611157 - -2015-05-30 02:21:43 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglviewconvert.c: - * gst-libs/gst/gl/gstglviewconvert.h: - gl libs: Add glviewconvert helper object - Add API for a helper object that can convert between different - stereoscopic video representations, and later do filtering - of multiple view streams. - https://bugzilla.gnome.org/show_bug.cgi?id=611157 - -2015-06-18 16:20:26 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - dashdemux: added warnings in gst_mpd_client_setup_streaming function - Added some warning messages in gst_mpd_client_setup_streaming to help - debug situations when the function will return FALSE. - Renamed a wrongly spelled variable. - https://bugzilla.gnome.org/show_bug.cgi?id=751149 - -2015-06-18 12:21:43 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.h: - dashdemux: corrected comments in gstmpdparser.h - Corrected some comments in gstmpdparser.h file. - Moved gst_mpd_client_get_adaptation_sets function to be grouped with - other functions from AdaptationSet group - https://bugzilla.gnome.org/show_bug.cgi?id=751149 - -2015-06-18 13:08:25 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: fixed getting representation based on max bandwidth - The gst_mpdparser_get_rep_idx_with_max_bandwidth function assumes - representations are ordered by bandwidth and incorrectly returns the - first one when wanting the one with minimum bandwidth. - Corrected gst_mpdparser_get_rep_idx_with_max_bandwidth function to get the - correct representation in case max_bandwidth parameter is 0. - https://bugzilla.gnome.org/show_bug.cgi?id=751153 - -2015-06-18 14:38:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - androidmedia: Allow the application to provide the Java VM - In JNI_OnLoad() we will already get the Java VM passed and could - just directly use that. gstreamer_android-1.0.c will now provide - this to us. - Reason for this is that apparently not all Android system are - providing the JNI functions to get the currently running Java VMs, so - we would fail to get. With this we will always be able to get the Java - VM on such systems. - -2015-06-18 14:31:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Prefer software codecs over hardware codecs for audio - Hardware codecs don't make sense for audio and are generally less reliable on - Android than the software codecs. - -2015-06-18 14:29:33 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstjniutils.c: - androidmedia: Failing to detach a thread is not that much of a problem - Someone else might have detached it before us, so make this just normal debug - output instead of a GST_ERROR() - -2015-06-18 10:43:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstjniutils.c: - androidmedia: Don't fail if JNI_CreateJavaVM can't be found - We only need that if no Java VM is running yet, and all usual cases, - i.e. when calling GStreamer from an actual Android app, there will already - be a Java VM we can just use. - It seems like some phones come without that symbol, let's hope they come - with the other symbol but for now don't make a missing JNI_CreateJavaVM fatal. - -2015-06-18 12:59:18 +0700 Alessandro Decina <alessandro.d@gmail.com> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: get rendered and dropped stats from QOS messages - Use QOS messages to update rendered and dropped frame stats. This is - the only accurate method. The old method didn't take max-lateness and - latency into account. - -2015-06-17 10:44:16 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst-libs/gst/codecparsers/nalutils.c: - nalutils: trivial patch to check if - trivial patch to add proper ( while checking for if(G_UNLIKELY()) - https://bugzilla.gnome.org/show_bug.cgi?id=751087 - -2015-06-16 17:48:51 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * common: - Automatic update of common submodule - From 6015d26 to f74b2df - -2015-06-15 21:32:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - gtkglwidget: Const'ify another array - -2015-06-15 21:29:46 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - gtkglwidget: Calculate the viewport size ourselves - Getting the current viewport and modifying it relatively will produce an - interesting feedback loop during widget resizing. Over a few frames we - will gradually move the viewport a bit until it converged again, adding - unnecessary additional borders at the top and left. - -2015-06-15 21:24:01 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - * ext/gtk/gtkgstwidget.c: - gtk: Use the display width/height for the widget's preferred width/height - -2015-06-15 20:45:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gtk/gstgtksink.c: - * ext/gtk/gtkgstwidget.c: - gtksink: Add support for xRGB/BGRx - -2015-06-15 20:39:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gtk/gstgtksink.c: - * ext/gtk/gtkgstwidget.c: - gtk: Cairo color formats are in native endianness, GStreamer's in memory order - CAIRO_FORMAT_ARGB32 is ARGB on big endian and BGRA on little endian. - -2015-06-15 20:35:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtkglsink.h: - * ext/gtk/gstgtksink.c: - * ext/gtk/gstgtksink.h: - * ext/gtk/gtkgstglwidget.c: - * ext/gtk/gtkgstwidget.c: - gtk: Implement ignore-alpha property and enable it by default - -2015-06-15 20:13:57 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtksink.c: - gtk: Sync properties from the sink to the widget upon widget creation - -2015-06-15 10:08:57 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: Remove redundant min_dts - After few iteration, this variable became the same as dts. It's not - the min as the name says, but the dts of the current buffer. Simply - remove and place with dts. Also move the debug trace to actually - print the signed version of the running-time dts. - -2015-06-15 22:43:54 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: add missing handle-events/ignore-alpha property to the bin - -2015-06-15 18:28:37 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtkglsink.h: - * ext/gtk/gstgtksink.c: - * ext/gtk/gstgtksink.h: - * ext/gtk/gtkgstglwidget.c: - * ext/gtk/gtkgstwidget.c: - gtk: implement pixel and display aspect ratio handling - -2015-06-15 14:29:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Print some debug output if we change the timestamp offset - -2015-06-15 14:25:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Add some more debug output - -2015-06-15 14:22:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Move variables into the scope where they are needed - -2015-06-15 14:19:05 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Don't update the ts-offset before updating the actual configured caps - -2015-06-15 14:18:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Remember if the last LATENCY query returned live or not and use the in the QoS messages - -2015-06-15 12:20:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Don't query supported color formats for non-video codecs - -2015-06-15 10:34:56 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: fix build error - after e000a6f0a4984fbe81190df6cd439c70dafde3d6, there is build error in bad plugins - this happens because, GST_CLOCK_STIME_IS_VALID () is being checked for pad_data - but it expects a GstClockTime parameter. Changing the check to 'dts' - https://bugzilla.gnome.org/show_bug.cgi?id=750961 - -2015-06-15 16:47:15 +1000 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/qt/mousevideooverlay/main.cpp: - * tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pro: - * tests/examples/gl/qt/mousevideooverlay/pipeline.cpp: - * tests/examples/gl/qt/mousevideooverlay/pipeline.h: - * tests/examples/gl/qt/qglwidgetvideooverlay/main.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.h: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pro: - * tests/examples/gl/qt/qglwtextureshare/pipeline.cpp: - * tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp: - * tests/examples/gl/qt/qglwtextureshare/qglwtextureshare.pro: - * tests/examples/gl/qt/videooverlay/videooverlay.pro: - gl/examples: update qt examples for api changes - -2015-06-15 14:35:35 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - gtk: silence unused variable warnings for unsupported winsys' - -2015-06-15 14:33:08 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gtkgstglwidget.c: - gtk: implement basic wayland GL support - -2015-06-14 23:20:38 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst/compositor/compositor.c: - compositor: update zorder documentation. - It is not bound between 0 and 10000 anymore. - -2015-06-14 23:13:59 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: No need to artificially bound the zorder. - It is an unsigned integer so the upper bound is G_MAXUINT. - -2014-10-29 15:03:04 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: mpeg4: actually return full number of bits of resync marker - Switch the increment of markersize from when it is used to when it is - returned from compute_resync_marker_size. - This also makes the CHECK_REMAINING in gst_mpeg4_parse_video_packet_header - check for the actually required number of bits now and not one too few. - https://bugzilla.gnome.org/show_bug.cgi?id=739345 - -2015-06-13 17:36:20 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - Revert "codecparsers: remove ignored increment of return" - This reverts commit 916b954315abc2f94348ec0be3e116c19b080b54. - Clearly something else was intended, and it also makes - more sense to add the extra bit. The resync marker is - N zero bits plus a 1 bit, and the pattern/mask needs to - be run on N+1 bits too. - (Even after the rever the code doesn't do that of course, so - it still needs to be fixed differently.) - https://bugzilla.gnome.org/show_bug.cgi?id=739345 - -2015-06-12 18:08:44 +0530 Arun Raghavan <git@arunraghavan.net> - - * sys/opensles/openslescommon.c: - * sys/opensles/openslescommon.h: - opensles: Fix build with Android API level < 14 - Headers were broken on older Android versions, apparently. - https://bugzilla.gnome.org/show_bug.cgi?id=744459 - -2015-01-28 13:06:39 +0530 Arun Raghavan <arun@centricular.com> - - * sys/opensles/openslescommon.c: - * sys/opensles/openslescommon.h: - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - * sys/opensles/openslessink.c: - * sys/opensles/openslessink.h: - openslessink: Allow setting the stream type via a property - -2015-01-27 15:25:59 +0530 Arun Raghavan <arun@centricular.com> - - * sys/opensles/Makefile.am: - * sys/opensles/openslescommon.c: - * sys/opensles/openslescommon.h: - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - * sys/opensles/openslessrc.c: - * sys/opensles/openslessrc.h: - openslessrc: Implement recording presets - This allows us to signal what kind of audio we are expecting to record, - which should tell the system to apply filters (such as echo - cancellation, noise suppression, etc.) if required. - -2015-06-13 11:40:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklinkvideosink: Remove late frame-dropping workaround for basesink bug - This was fixed by https://bugzilla.gnome.org/show_bug.cgi?id=749258 - in basesink, and is not necessary to duplicate here anymore. - -2015-06-13 18:43:04 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixerbin.c: - glmixerbin: implement proper dynamic pad removal - https://bugzilla.gnome.org/show_bug.cgi?id=750881 - -2015-06-12 20:14:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: Don't do pool caching - We now know that pool caching can cause renegotiation issues - when an element in the pipeline change from passthrough to not - passthrough. As it's not needed, don't cache existing pools. - https://bugzilla.gnome.org/show_bug.cgi?id=748344 - -2015-06-12 18:08:40 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - configure.ac: Remove reference to cvs - -2015-06-10 17:05:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Segment start should match first PTS - The segment should start at first PTS, and the vairable name lower_pts - state so correctly. Though we where using the first DTS instead. This - could lead to small desynchronization of video stream. - https://bugzilla.gnome.org/show_bug.cgi?id=740575 - -2015-06-10 12:32:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - tsmux: Add negative DTS support - Use the saved DTS, make it signed and pass that to the stream muxer. This - preserves the running time sign. All usage of -1 as invalid TS are now - replaced with G_MININT64. Negative values will be seen as wrap-around - point, but the delta between PTS and DTS will remain correct. Demuxers - don't care about absolute values, they only cares about deltas. - https://bugzilla.gnome.org/show_bug.cgi?id=740575 - -2015-06-10 12:31:13 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - tsmux: Remove uneeded cast and cast macro - https://bugzilla.gnome.org/show_bug.cgi?id=740575 - -2015-06-10 11:39:01 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Properly detect backward DTS - There was code to detect backward dts, but the marker min_dts - was never set. Setting it enable this feature that prevents - potential integer overflow when generating TS. - https://bugzilla.gnome.org/show_bug.cgi?id=740575 - -2015-06-12 16:44:55 +0100 Florin Apostol <florin.apostol@oregan.net> - - * ext/dash/gstmpdparser.c: - * tests/check/elements/dash_mpd.c: - dashdemux: fixed segfault for missing default namespace - Added a check for a_node->ns before accessing a_node->ns->href in - gst_mpdparser_get_xml_node_namespace. This could happen if the xml - is missing the default namespace. - https://bugzilla.gnome.org/show_bug.cgi?id=750866 - -2015-06-12 22:33:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Don't require the same framerate in the input as the mode's framerate - We only really care about the timestamps for the sink. - -2015-06-13 01:40:00 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * tests/examples/playout.c: - examples: playout: Add better help text - This should help people figure out how to use the example a bit better - -2015-06-13 01:35:59 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * tests/examples/playout.c: - examples: playout: Decrement the currently-playing counter correctly - Only do that when we're removing an item that was playing, otherwise we'll mess - things up while trying to edit the play queue (playlist). - -2015-01-29 00:56:26 +0000 Nirbheek Chauhan <nirbheek@centricular.com> - - * .gitignore: - * tests/examples/Makefile.am: - * tests/examples/playout.c: - playout: New example for seamless audio/video playback - An example app that takes video URIs as command line arguments and switches - between them seamlessly one after the other using compositor and audiomixer. - Both audio-video and video-only media files are valid inputs, but mixing files - of both types in a single invocation is cumbersome to support, and hence does - not work. The example attempts to keep the audio stream moving along perfectly, - and duplicates video frames where necessary to cover gaps in the video - timestamps using the 'ignore-eos' videoaggregator pad property. - Ensuring seamless (and mostly-glitch-free) switching is harder than it sounds, - and hence the example contains plenty of pad probes and running time - calculations to make things work. - The GPtrArray play_queue contains items that are being played back, have been - prepared for playback, and will be played back in the future. The queue itself - is mutable besides the first two items (playing and prepared). The item that has - been prepared should not be edited or removed since it has been prepared in - advance to be activated immediately on the current item's EOS. - The example also has support for switching to the next item in the queue - prematurely; see the --switch-after/-s flag to the application. - Note: the output video is hard-coded at 1280x720, and input video is scaled as - needed to fit this size. Set OUTPUT_VIDEO_WIDTH/HEIGHT to change this. - https://bugzilla.gnome.org/show_bug.cgi?id=748947 - -2015-06-06 20:40:13 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * tests/check/elements/compositor.c: - tests: Add test for the 'ignore-eos' compositor sink pad property - When the 'ignore-eos' property is set on a pad, compositor will keep resending - the last buffer on the pad till the pad is unlinked. We count the buffers - received on appsink, and if it's more than the buffers sent by videotestsrc, the - test passes. - -2015-02-10 00:49:35 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - videoaggregator: add "ignore-eos" property for input pads - When set, it causes videoaggregator to repeatedly aggregate the last buffer on - an EOS pad instead of skipping it and outputting silence. This is useful, for - instance, while playing back files seamless one after the other, to avoid - videoaggregator ever outputting silence (the checkerboard pattern). - It is to be noted that if all the pads on videoaggregator have this property set - on them, the mixer will never forward EOS downstream for obvious reasons. Hence, - at least one pad with 'ignore-eos' set to FALSE must send EOS to the mixer - before it will be forwarded downstream. - https://bugzilla.gnome.org/show_bug.cgi?id=748946 - -2014-12-19 14:43:20 +0100 Jesper Larsen <knorr.jesper@gmail.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegts: return early if packetizing short section - Short sections have 3 bytes of common header, while other sections - have 8 bytes of common header. If packetizing common header of short - section, we should stop after the first 3 bytes. - https://bugzilla.gnome.org/show_bug.cgi?id=735653 - -2015-06-12 17:14:02 +0300 Vivia Nikolaidou <vivia@toolsonair.com> - - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - debugutilsbad: Minor cleanup - Ran gst-indent on debugutilsbad.c, moved headers to noinst in Makefile.am - -2015-06-12 15:39:56 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gtk/gtkgstglwidget.c: - gtk: Do not try to activate a NULL GLContext - At that point in the code nothing guarantees it exists - -2015-06-12 21:31:48 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/Makefile.am: - gl/tests: remove reference to undefined buffer test - -2015-06-11 18:26:50 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgldownloadelement.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglupload.c: - * tests/check/libs/gstglmemory.c: - glmemory: separate pbo transfer from texture transfers - When supported, the potentially longer pbo upload/download can be - initiated before the texture upload/download, potentially increasing - throughput. - -2015-06-10 16:36:15 +1000 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/gstglbasebuffer.c: - * gst-libs/gst/gl/gstglbasebuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstgluploadmeta.c: - * tests/check/Makefile.am: - * tests/check/libs/gstglmemory.c: - glmemory: implement on top of glbasebuffer - Provides convenient access to PBO usage. - Currently texture updates are coupled tightly to data transfers. - -2015-06-10 16:24:59 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglbasebuffer.c: - * gst-libs/gst/gl/gstglbasebuffer.h: - gl: new glbasebuffer GstMemory object - Provides generic handling of GL buffer objects accessible using - the GL bind points (GL_ARRAY_BUFFER, GL_PIXEL_*_BUFFER). - Implementation based off the current GstGLMemory. - -2015-06-10 16:23:36 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/glprototypes/Makefile.am: - * gst-libs/gst/gl/glprototypes/all_functions.h: - * gst-libs/gst/gl/glprototypes/buffers.h: - gl/prototypes: add some buffer function prototypes - -2015-06-12 15:17:30 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtkglsink.h: - * ext/gtk/gstgtksink.c: - * ext/gtk/gstgtksink.h: - * ext/gtk/gtkgstglwidget.c: - * ext/gtk/gtkgstwidget.c: - gtk: implement video aspect-ratio handling - For both the software and the GL sink's. - Doesn't deal with the pixel-aspect-ratio field at all yet. - -2015-06-12 13:14:57 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl/window/x11: only listen on the X Display when needed - 5697b6b89b4b2a15c45bd47be940a17f4412ea11 causes us to possibly listen - on a toolkit provided Display connection. We thus could eat their - precious winsys events. Only listen if we need to - (!foreign_display or videooverlay). - -2015-06-12 12:40:50 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtksink.c: - gtk: fix a couple of typos - -2015-06-12 12:29:37 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gtk/gstgtkglsink.c: - gtkglsink: reset the context/display in READY_TO_NULL - Fixes context propagation in pipelines with upstream GL elements. - -2015-06-11 17:25:49 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: fix error calculating large presentationTimeOffset values - If the presentationTimeOffset attribute of a DASH manifest contains - a value that is larger than 2^32, gstmpdparser incorrectly calculates - the stream's presentation time offset. This is due to two bugs: - 1: Using gst_mpdparser_get_xml_prop_unsigned_integer rather than - gst_mpdparser_get_xml_prop_unsigned_integer_64 to parse the - attribute - 2: gst_mpd_client_setup_representation multiplying the value by - GST_SECOND and then dividing by timescale - https://bugzilla.gnome.org/show_bug.cgi?id=750804 - -2015-06-11 12:41:10 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/examples/gtk/gtkglsink.c: - gstgtk: No need to realize the widget - The widget already does that. - -2015-06-11 12:38:53 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/examples/gtk/gtkglsink.c: - * tests/examples/gtk/gtksink.c: - gstgtk: Don't leak the widget - g_object_get() returns a ref, gtk_container_add() only ref_sink(). - That mean we still need to unref afterward. This leak was hiding - a reference bug previously present. - -2015-06-11 12:10:23 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtksink.c: - gstgtk: Allow doing gst-inspect-1.0 on these elements - This patch allow going gst-inspect-1.0 on these elements removing - ugly crash that was previously occurring. The method consist of - making the widget creation as lazy as possible. This way we don't - endup doing gtk_init() before the application. We also ref_sink() - the widget, so we don't crash if the parent widget is discarded, - and cleanly error out with GL if the widget has no parent window, - because calling gtk_widget_realized() can only be done if the widget - has been parented to a window). - -2015-05-30 02:15:51 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglupload.c: - gl: Add support for multiple views in upload, colour convert and download - Support multiple attached views on input/output buffers - by processing each one, not just the first. - -2015-05-30 01:38:16 +1000 Jan Schmidt <jan@centricular.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: Add support for passing stereoscopic/multiview info - Pass any multiview info from the container or SEI info downstream - -2015-06-11 01:57:08 +1000 Jan Schmidt <jan@centricular.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: Don't switch to passthrough on set_caps() - Wait until at least one keyframe has been parsed before - deciding to switch to passthrough mode, in case the - stream contains SEI messages that supplement the output - caps - for example by providing stereoscopic information - -2015-06-12 00:32:00 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl/window/x11: don't create our own X11 display - It's not needed anymore with most window operations occuring in the - GL thread. - -2015-06-12 00:30:58 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl/window/x11: handle_events() may be called before the window has been created - Fixes an XIO fatal error - -2015-06-12 00:29:23 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglsinkbin.c: - gl: move basesink properties from glimagesinkbin to glsinkbin - -2015-03-25 19:27:42 +0200 Yanko Kaneti <yaneti@declera.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: Remove arbitrary constraint on prog-map program ids - https://bugzilla.gnome.org/show_bug.cgi?id=746765 - -2015-06-11 15:22:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglfilterbin.c: - * ext/gl/gstglmixerbin.c: - * ext/gl/gstglsrcbin.c: - gl: Use gst_object_ref_sink() for gl{filter,mixer,src}bin too - -2015-06-11 15:17:02 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglsinkbin.c: - glsinkbin: Use gst_object_ref_sink() for consistency with the video-sink property on playbin - -2015-06-11 15:02:44 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gtk/gtkgstglwidget.c: - gtk: Do not try to initialize display if we have not have a GLContext yet - -2015-06-11 14:58:27 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/examples/gtk/Makefile.am: - gtk: Add missing CFLAGS to example - -2014-12-18 17:00:30 +1100 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * ext/Makefile.am: - * ext/gtk/Makefile.am: - * ext/gtk/gstgtkglsink.c: - * ext/gtk/gstgtkglsink.h: - * ext/gtk/gstgtksink.c: - * ext/gtk/gstgtksink.h: - * ext/gtk/gstplugin.c: - * ext/gtk/gtkgstglwidget.c: - * ext/gtk/gtkgstglwidget.h: - * ext/gtk/gtkgstwidget.c: - * ext/gtk/gtkgstwidget.h: - * tests/check/Makefile.am: - * tests/examples/Makefile.am: - * tests/examples/gtk/Makefile.am: - * tests/examples/gtk/gtkglsink.c: - * tests/examples/gtk/gtksink.c: - Implement gtk sinks - two sinks are provided. gtksink which is a cairo/software based renderer - and gtkglsink which utilises the GL support in gtk and gstreamer. - -2015-06-10 10:36:21 +0200 Edward Hervey <edward@centricular.com> - - h263parse: Fix PSC matching - We were off by one byte in the matching - It should be (using 24 bit matching): - * startcode : 0000 0000 0000 0000 1000 00xx - * mask (bin) : 1111 1111 1111 1111 1111 1100 - * mask (hex) : f f f f f c - * match : 0 0 0 0 8 0 - https://bugzilla.gnome.org/show_bug.cgi?id=750685 - -2015-05-11 16:47:25 +0200 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: always enqueue frames, even on error - Even when we fail to encode frame, we should still enqueue it so - it could be passed into handle_frame (with output_buffer == NULL). - Otherwise, we risk GstVideoEncoder's queue of frames growing unbounded. - Note: We're slightly changing the renegotiation code to accommodate for - frames without output buffers, but this commit takes no ownership over - the way negotiation is being done. - https://bugzilla.gnome.org/show_bug.cgi?id=750669 - -2015-06-10 15:03:31 +0200 Fabio Cetrini <fcetrini@hotmail.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Avoid frame rendering while the window is completely hidden - https://bugzilla.gnome.org/show_bug.cgi?id=749856 - -2015-06-10 11:42:06 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - gl: OES_vertex_array_object is improperly implemented on PowerVR SGX 544MP - https://bugzilla.gnome.org/show_bug.cgi?id=750185 - -2015-05-11 16:40:07 +0200 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: free input buffer ASAP - VTCompressionSessionEncodeFrame retains the CVPixelBuffer during - encoding, and will release it as soon as it can (e.g. before it even - calls our callback). This means we can safely release input buffer - at this point, possibly allowing the system to reuse it sooner. - https://bugzilla.gnome.org/show_bug.cgi?id=750671 - -2015-05-11 16:39:19 +0200 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: Add missing gst_vtenc_frame_free() in error path - https://bugzilla.gnome.org/show_bug.cgi?id=750668 - -2015-06-09 16:33:39 +0200 Santiago Carot-Nemesio <sancane@gmail.com> - - * gst/liveadder/liveadder.c: - liveadder: Fix memory leaks iterating over pads - Rebased for latest master by Nicolas Huet <nicolas.huet@parrot.com>. - https://bugzilla.gnome.org/show_bug.cgi?id=745748 - -2015-06-10 00:16:27 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: add alignment=au to sink caps - VT compression callback gets a CMSampleBuffer per frame, so vtenc_h264 - should set 'alignment=au' in sink caps to indicate this. - https://bugzilla.gnome.org/show_bug.cgi?id=750635 - -2015-06-09 18:30:55 +0100 Chris Clayton <chris2553@googlemail.com> - - * sys/uvch264/gstuvch264_src.c: - uvch264src: fix compiler warnings - https://bugzilla.gnome.org/show_bug.cgi?id=750601 - -2015-05-12 00:18:02 +0200 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/avfassetsrc.m: - avfassetsrc: fix huge memory leak - CMSampleBuffers were retained -> huge memory leak. - https://bugzilla.gnome.org/show_bug.cgi?id=750638 - -2015-05-11 16:44:33 +0200 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: no need for queue_length with try_pop - -2015-05-05 15:07:53 +0200 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: don't copy meta from input to output - Copying arbitrary metas is going to cause problems and this should really be - handled by the base class. It overrides most other things already anyway, - including timestamp and duration. Those are just set here now so we can - insert the frame sorted into the queue. - https://bugzilla.gnome.org/show_bug.cgi?id=748922 - -2015-06-09 15:32:36 +0200 Stefan Sauer <ensonic@users.sf.net> - - * Makefile.am: - cruft: add the obsolete tmpl dir to cruft-dirs - -2015-06-09 14:37:36 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: fix misleading documentation copied from adder - -2015-06-09 12:11:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/Makefile.am: - dash: Add $(GST_PLUGINS_BASE_LIBS) to LIBADD - https://bugzilla.gnome.org/show_bug.cgi?id=750619 - -2015-06-09 11:30:29 +0200 Edward Hervey <bilboed@bilboed.com> - - * common: - Automatic update of common submodule - From d9a3353 to 6015d26 - -2015-06-09 09:07:45 +1000 Jan Schmidt <jan@centricular.com> - - * gst/dvdspu/gstspu-vobsub-render.c: - * gst/dvdspu/gstspu-vobsub.h: - dvdspu: Map the pixel data once per render, not *ahem* twice per byte. - The naive port to 1.0 from years ago was silly, make it better. - -2015-06-08 23:08:04 +0200 Stefan Sauer <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From d37af32 to d9a3353 - -2015-06-05 17:20:20 +0100 Florin Apostol <florin.apostol@oregan.net> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/dash_mpd.c: - tests: dashdemux: add unit tests for checking the parsing of MPD element - Create a dash test target and add unit tests that check the parsing of - attributes of the MPD element and the following child elements: - - baseURL - - program information - - location - - metrics - These tests check the compliance of parts of the MPD parser in the - dashdemux element against the DASH specification 1. - 1 http://standards.iso.org/ittf/PubliclyAvailableStandards/c065274_ISO_IEC_23009-1_2014_Electronic_inserts.zip - http://standards.iso.org/ittf/PubliclyAvailableStandards/c065274_ISO_IEC_23009-1_2014.zip - https://bugzilla.gnome.org/show_bug.cgi?id=750390 - -2015-05-06 14:29:01 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: simplify aggregate returning - Rework special handling with goto/labels to only have one case - and otherwise just return normally. - -2015-05-06 14:19:36 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: refactor caps reconfigure to its own function - Makes the aggregation code shorter and easier to read - -2015-05-06 13:59:51 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: fixing types in aggregate function - Correctly use boolean and GstFlowReturn types in the function. - -2015-05-06 13:08:11 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: use macro to access aggregator src pad - Makes code a bit more readable - -2015-05-06 13:07:52 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/base/gstaggregator.h: - aggregator: add a convenience macro to get the source pad - Easier than casting or acessing the parent everywhere - -2015-06-08 14:16:22 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: correct fix for dead code - Rename template to caps to keep the original intention of the code after - commit b4c9aa1c - CID #1304674 - -2015-06-08 14:14:41 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - Revert "tsdemux: remove dead code" - This reverts commit 0635acfec041b1c664bc0770839b1a576e3598b1. - -2015-06-08 13:37:32 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: remove dead code - After commit b4c9aa1c308f88bf4e1f69ab0156ed9f99815e8e template will always be - NULL. The if conditional will always be FALSE, so removing it. - CID #1304674 - -2015-06-07 23:06:38 +0200 Stefan Sauer <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 21ba2e5 to d37af32 - -2015-06-07 17:32:07 +0200 Stefan Sauer <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From c408583 to 21ba2e5 - -2015-06-07 17:03:15 +0200 Stefan Sauer <ensonic@users.sf.net> - - * docs/libs/Makefile.am: - * docs/plugins/Makefile.am: - docs: remove variables that we define in the snippet from common - This is syncing our Makefile.am with upstream gtkdoc. - -2015-06-07 17:16:25 +0200 Stefan Sauer <ensonic@users.sf.net> - - * autogen.sh: - * common: - Automatic update of common submodule - From d676993 to c408583 - -2015-06-07 16:45:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -2015-06-07 16:28:43 +0200 Stefan Sauer <ensonic@users.sf.net> - - * docs/libs/Makefile.am: - docs: only add the libs that we actually document right now - Keep the libs in alphabetical order unless a specific link order is required. - Also remove the -L directives as we specify the direct path to the .la files. - -2015-06-07 16:28:22 +0200 Stefan Sauer <ensonic@users.sf.net> - - * docs/libs/gst-plugins-bad-libs.types: - docs: remove duplicated entry from types file - -2015-06-07 15:59:59 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/elements/zbar.c: - zbar: split test - Lets not cram everything into a single test - this would render the test name - useless for quick diagnosis. Having separate tests for the optional feature is - also verifying the behaviour when the feature is off. - -=== release 1.5.1 === - -2015-06-07 10:55:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiomixer.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * gst-plugins-bad.doap: - * gst/audiomixer/gstaudiomixerorc-dist.c: - * gst/bayer/gstbayerorc-dist.c: - * gst/compositor/compositororc-dist.c: - * gst/fieldanalysis/gstfieldanalysisorc-dist.c: - * gst/gaudieffects/gstgaudieffectsorc-dist.c: - * win32/common/config.h: - Release 1.5.1 - -2015-06-07 09:36:21 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - po: Update translations - -2015-05-30 21:35:36 +0900 Jimmy Ohn <yongjin.ohn@lge.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Fix wrong gst-launch command in the description - Fix wrong gst-lauch command in the description. - This patch may help people to get right testing results using the script. - https://bugzilla.gnome.org/show_bug.cgi?id=750143 - -2015-06-05 14:49:18 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/directfb/dfbvideosink.c: - dfbvideosink: remove ignored assignments - Remove assignments to DFBResult res that are never read. - -2015-06-05 14:34:55 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: remove ignored assignment - Function goes to done before the value set in start_offset is ever used. - -2015-06-05 09:35:39 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/gl/caopengllayersink.m: - * ext/gl/gstglfilterbin.c: - * ext/gl/gstglmixerbin.c: - * ext/gl/gstglsinkbin.c: - * ext/gl/gstglsrcbin.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * sys/applemedia/avsamplevideosink.m: - * tests/check/elements/glimagesink.c: - Fix a common typo: retreive -> retrieve - Seems to have been copy pasted around a few places - -2015-06-05 09:22:58 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: drop TODO that doesn't need a solution - Connection speed is only checked at that point in hlsdemux so there - is no real need to refactor it. - https://bugzilla.gnome.org/show_bug.cgi?id=749328 - -2015-06-05 09:15:34 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - Revert "hlsdemux: Simplify logic in process_manifest" - This reverts commit 4ca3a22b6b33ad8be4383063e76f79c4d346535d. - The connection-speed=0 is used as a special value in the property - of hlsdemux to mean 'automatic' selection, m3u8.c doesn't need - to know about that as it should be as simple as possible. - So this patch hides this automatic selection documented in hlsdemux - into m3u8 logic and I think the gets harder to understand the code. - It also makes the hlsdemux unit tests work again - https://bugzilla.gnome.org/show_bug.cgi?id=749328 - -2015-06-05 14:30:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Fix inverted logic introduced in last commit - -2015-06-05 08:58:03 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/videosignal/gstsimplevideomarkdetect.c: - simplevideomarkdetect: fix detect of videomark partially or fully outside video - In case of the videomark being partially or fully outside, - an error was bein thrown saying, mark width is more than video width. - And when the width, offset properties are set to maximum it resulted in crash. - Instead of throwing error, added logic to detect the mark - in case of partial visibility or dont show the mark when it is outside. - https://bugzilla.gnome.org/show_bug.cgi?id=743908 - -2015-06-05 14:10:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Calculate the number of segments we have when a segment template instead of a list is used - Otherwise we would just continue downloading new files forever until we get - 404 for the first one, and then error out instead of going EOS. - -2015-06-05 08:53:30 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/videosignal/gstsimplevideomark.c: - simplevideomark: Add Error logs - When the pattern offset is outside the video, the print error message - https://bugzilla.gnome.org/show_bug.cgi?id=743908 - -2015-06-05 13:28:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - Revert "mpdparser: Don't consider streams with a known media presentation duration as live" - This reverts commit 37011e519830e0786fa6e307ed26003a2a8774f1. - This change was actually completely unnecessary, the streams in question are - marked as static and are not considered live anyway. - -2015-06-05 13:21:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Don't consider streams with a known media presentation duration as live - -2015-06-05 11:26:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Error out if downloading a segment failed too often in live mode - It's true that we shouldn't consider errors fatal immediately, but if we - always ignore them we will loop infinitely on live streams with segments - that can't be downloaded at all. - -2015-06-03 12:17:19 +0200 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/srtp/gstsrtp.c: - srtp: Allow getting ssrc of more package types than RR and SR - This allows decrypting reduce size packages. See RFC 5506 - https://bugzilla.gnome.org/show_bug.cgi?id=750326 - -2015-06-04 13:36:32 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: refactor pad creation - Avoid repeating the same pad creation code everywhere - -2015-06-04 15:57:57 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Don't crash in debug output if stream->segments is NULL - -2015-06-04 13:31:56 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/winks/gstksvideosrc.c: - ksvideosrc: fix logic and timestamp non-muxed streams again - https://bugzilla.gnome.org/show_bug.cgi?id=750381 - -2015-06-04 12:53:19 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/libde265/gstlibde265.c: - * ext/libde265/libde265-dec.c: - libde265dec: fix up plugin name and decoder description - -2015-06-04 13:36:05 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparse: Clamp seek times to the availabilityStartTime - Otherwise we will seek to negative times, which are interpreted as unsigned - integers later. - -2015-06-04 13:13:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Improve debug output a bit when advancing segments - -2015-06-04 12:36:41 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Release the manifest mutex before waiting for a download - Otherwise we will hurt parallel downloads in the best case, and often cause - deadlocks. - -2015-06-04 11:54:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusdec.c: - opusdec: If channel/rate negotiation fails, fall back to stereo and 48kHz - -2015-06-04 11:52:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusparse.c: - opusparse: Set up default header with 48kHz sample rate instead of 0 - -2015-06-04 11:45:05 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusdec.c: - opusdec: gst_structure_fixate_field_nearest_int() only works if the structure has this field - Just set the rate/channels directly if the caps don't have this field. - -2015-06-04 11:05:07 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Use 64 bit integer format strings when passing a 64 bit integer - Otherwise we'll only get half of its bits printed on 32 bit architectures. - For this, promote the %d-style format strings to something that accepts - 64 bit integers with G_GINT64_MODIFIER. - -2015-06-04 10:47:07 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparse: Validate format strings before using them - Using format strings from an untrusted source without validation is - calling for problems, and at least allows to remotely crash your application. - If not worse. - -2015-06-04 09:40:19 +0200 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - gl/dispmanx: Fix build - -2015-06-03 22:21:30 +0100 Julien Isorce <j.isorce@samsung.com> - - * tests/examples/gl/cocoa/Makefile.am: - gl/example: fix build error when compiling cocoa-videooverlay - libtool: error: ignoring unknown tag OBJC - and - clang: error: argument unused during compilation: '-pthread' - -2015-06-04 15:01:16 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - gl/window/dispmanx: fix compiler warning - -2015-06-04 12:16:35 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/android/gstglwindow_android_egl.h: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - gl/window: use the default main loop implementation for all backends - fixes glimagsink being unable to display. - https://bugzilla.gnome.org/show_bug.cgi?id=750337 - -2015-06-03 21:22:09 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - glwindow_cocoa: use parent default implementation - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=750337 - -2015-06-03 20:03:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstmpdparser.c: - mpdparser: Add the startNumber as offset to the segment index when using a template - -2015-06-03 16:59:44 +0200 Santiago Carot-Nemesio <sancane@gmail.com> - - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlsdec.h: - dtlsdec: Fix critical warning "got data flow before stream-start event" - Forward sticky events on requested src pad. - https://bugzilla.gnome.org/show_bug.cgi?id=750348 - -2015-06-03 15:25:10 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: remove useless value assignments - In all these cases ret is set but overwritten before the return of the function - -2015-06-03 14:44:31 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - examples: gst-camerabin2-test: protect from division by zero - Highly unlikely to have 0 captures, but protect from crashes in the future by - doing none of the math if there is no data. - -2015-06-02 20:57:34 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: lower curl requirement to 7.35.0 - Build and unit tests were tested against 7.35 too now, - which is the version in Ubuntu 14.04. - -2015-06-02 16:40:25 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: do not access variable after unref - Data might not exist anymore - -2015-06-02 15:45:13 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/audiointerleave.c: - tests: audiointerleave: test not setting positions - Disable "channel-positions-from-input", but without actually giving - a position table, so every position should be NONE - -2015-06-02 15:44:57 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/audiointerleave.c: - tests: Fix indentation in audiointerleave test - -2015-06-02 11:31:00 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/zbar/gstzbar.c: - zbar: don't ignore zbar_scan_image() errors - -2015-06-03 00:31:42 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - glsyncmeta: Set new sync point when copying - Set a new sync point when copying instead of - transferring the (non-refcounted) GL sync object - from the source meta. - https://bugzilla.gnome.org/show_bug.cgi?id=750279 - -2015-06-02 23:59:50 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - glsyncmeta: Add some debug output - -2015-06-02 16:02:37 +0200 Edward Hervey <edward@centricular.com> - - * tests/check/elements/asfmux.c: - * tests/check/elements/faac.c: - * tests/check/elements/faad.c: - * tests/check/elements/h263parse.c: - * tests/check/elements/hlsdemux_m3u8.c: - * tests/check/elements/jpegparse.c: - * tests/check/elements/kate.c: - * tests/check/elements/mpeg2enc.c: - * tests/check/elements/mpeg4videoparse.c: - * tests/check/elements/mpegvideoparse.c: - * tests/check/elements/mplex.c: - * tests/check/elements/opus.c: - * tests/check/elements/rtponvif.c: - * tests/check/elements/timidity.c: - * tests/check/elements/voaacenc.c: - * tests/check/elements/voamrwbenc.c: - * tests/check/libs/h264parser.c: - * tests/check/libs/mpegts.c: - * tests/check/libs/mpegvideoparser.c: - * tests/check/libs/vc1parser.c: - * tests/check/libs/vp8parser.c: - * tests/check/pipelines/simple-launch-lines.c: - * tests/check/pipelines/streamheader.c: - check: Use GST_CHECK_MAIN () macro everywhere - Makes source code smaller, and ensures we go through common initialization - path (like the one that sets up XML unit test output ...) - -2015-06-02 10:21:42 +0900 Vineeth TM <vineeth.tm@samsung.com> - - * gst/videosignal/gstsimplevideomark.c: - simplevideomark: fix display of videomark partially or fully outside video - In case of the videomark being partially or fully outside, an error was being - thrown saying the mark width is more than video width. And when the width, - offset properties are set to maximum it resulted in crash. Instead of throwing - an error, add logic to detect the mark in case of partial visibility or don't - show the mark when it is outside. - https://bugzilla.gnome.org/show_bug.cgi?id=743908 - -2015-03-24 15:17:16 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: enable Chinese AVS video stream - Chinese broadcaster encapsulate AVS video codec into MPEG2-TS. They - use the stream_id 0x42 to identify AVS video streams. It should be noted - that this id is currently within the ISO reserved range, hence it's - utilisation is unofficial. - https://bugzilla.gnome.org/show_bug.cgi?id=727731 - -2015-06-02 17:24:18 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: provide compatibility definition for GLES2 for GL_RGBA8 - -2015-06-02 16:32:03 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgleffects.c: - * ext/gl/gstglfiltershader.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - gl: consolidate internal_rgba_format into glmemory - Expose some useful value format conversion functions available in - GstGLMemory. - -2015-06-01 19:43:20 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudiointerleave.c: - audiointerleave: Always have "channels" be the actual pad count - Don't force it anywhere - https://bugzilla.gnome.org/show_bug.cgi?id=750252 - -2015-06-01 19:42:49 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudiointerleave.c: - audiointerleave: Use the channel count from the set caps - This is the same number that was used to allocate the buffer - -2015-06-01 18:50:14 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Document that the latency is in ns - -2015-06-01 20:03:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - amc: Only lower ranks of OMX.Exynos. audio codecs, the video codecs are actually working - -2015-06-01 19:40:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - amc: Give marginal rank to codecs that start with OMX.Exynos. - OMX.Exynos. codecs are existing on some devices like the - Galaxy S5 mini, and cause random crashes (of the device, - not the app!) and generally misbehave. That specific device - has other codecs that work with a different name, but let's - just give them marginal rank in case there are devices that - have no other codecs and these are actually the only working - ones - -2015-06-01 19:23:01 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Give lower ranks to codecs not starting with OMX. - On some devices there are codecs that don't start with OMX., while - there are also some that do. And on some of these devices the ones - that don't start with OMX. just crash during initialization while - the others work. To make things even more complicated other devices - have codecs with the same name that work and no alternatives. - So just give a lower rank to these non-OMX codecs and hope that - there's an alternative with a higher rank. - Also stagefright gives codecs starting with OMX. a higher rank too and - considers other codecs that don't start with OMX. as software codecs. - -2015-06-01 11:12:22 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * tests/check/elements/zbar.c: - tests: zbar: check for frame field on attach-frame=true - Also check for the sample to have a buffer and caps - associated with it. - Related to: - https://bugzilla.gnome.org/show_bug.cgi?id=747557 - -2015-05-20 15:04:40 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * sys/applemedia/vtdec.c: - vtdec: Require width and height field for H264 - This decoder does not work if width and height field are not set - in the sinkpad caps. Let's make this explicit by adding them to - the template caps. - https://bugzilla.gnome.org/show_bug.cgi?id=749655 - -2015-06-01 14:07:37 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gpuprocess/gstglcontext_gpu_process.c: - glcontext_gpu_process: close the window when done - -2015-06-01 14:05:58 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gpuprocess/gstglwindow_gpu_process.c: - glwindow_gpu_process: avoid empty struct - -2015-06-01 12:58:11 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: move main loop/context creation back to init/finalize - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=750199 - -2015-06-01 14:05:06 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/examples/gl/gtk/gstgtk.c: - examples: Fix gl usage without wayland support - Not all platforms have wayland support. Handle that gracefully at - compile time - -2015-06-01 13:55:20 +0200 Edward Hervey <bilboed@bilboed.com> - - * ext/rtmp/gstrtmpsink.c: - rtmpsink: Initialize GstMapInfo - Avoids doing a call to unmap with it uninitialized - CID #1302834 - -2015-06-01 12:51:46 +0100 Luis de Bethencourt <luisbg@osg.samsung.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: clean dereferences of private structure - https://bugzilla.gnome.org/show_bug.cgi?id=742875 - -2015-04-25 22:55:28 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: fix keyframe request race condition - It is incorrect to modify the frame properties after passing them, since - VTCompressionSessionEncodeFrame takes reference and we have no control - over when it's being used. - In fact, the code can be simplified. We just preallocate the frame - properties for keyframe requests, and pass NULL otherwise. - https://bugzilla.gnome.org/show_bug.cgi?id=748467 - -2015-06-01 11:56:13 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - * gst/audiovisualizers/gstaudiovisualizer.h: - audiovisualizer: make private all variable subclasses don't need - https://bugzilla.gnome.org/show_bug.cgi?id=742875 - -2015-05-01 23:20:30 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * ext/zbar/gstzbar.c: - * ext/zbar/gstzbar.h: - zbar: add frame sample to barcode message - New attach-frame property enables barcode frame - dumping when set to true. - https://bugzilla.gnome.org/show_bug.cgi?id=747557 - -2015-05-31 21:30:23 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - gl: Fix compiler warning - gstglwindow_wayland_egl.c:246:41: error: unused variable 'surface_listener' -Werror,-Wunused-const-variable - static const struct wl_surface_listener surface_listener = { - ^ - -2015-05-27 23:34:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcaudiodec.h: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideodec.h: - * sys/androidmedia/gstamcvideoenc.c: - * sys/androidmedia/gstamcvideoenc.h: - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - androidmedia: Conditionally use get_{input,output}_buffer() Android 21 APIs - Also properly set limit/position on byte buffer, some codecs prefer to have - correct values there. - -2015-05-31 16:53:14 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: fix compiler error - gstglwindow.c:1118:544: error: 'return' with no value, in function returning non-void -Werror - g_return_if_fail (GST_GL_IS_WINDOW (window)); - -2015-05-31 15:42:48 +1000 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/gtk/filternovideooverlay/main.cpp: - * tests/examples/gl/gtk/filtervideooverlay/main.cpp: - gl/examples: update gtk examples for glupload - -2015-05-31 15:40:15 +1000 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/gtk/filtervideooverlay/main.cpp: - * tests/examples/gl/gtk/switchvideooverlay/main.cpp: - gl/examples: update gtk examples for wayland - -2015-05-29 18:06:27 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - gl/wayland: implement setting the render rectangle - Places our subsurface at the rectangle provided position - -2015-05-29 18:03:52 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - glwindow: handle gst_video_overlay_set_render_rectangle - -2015-05-29 18:01:29 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/wayland/wayland_event_source.c: - gl/wayland: don't block the event loop after poll - Use the dispatch_pending set of functions which just run the currently - queued up events instead of potentially waiting for an event to occur. - -2015-05-27 16:42:55 +1000 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/gtk/gstgtk.c: - * tests/examples/gl/gtk/gstgtk.h: - tests/gl/gtk: implement setting a wayland display/surface - -2015-05-27 16:39:06 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/wayland/gstgldisplay_wayland.c: - * gst-libs/gst/gl/wayland/gstgldisplay_wayland.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - gl/wayland: implement basic video overlay support via subsurfaces - Currently does not position the subsurface relative to the parent surface at all - -2015-05-27 15:44:33 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/wayland/wayland_event_source.c: - gl/wayland: allow a NULL wl_event_queue - perform operations on the default wl_display event queue in that case - -2015-05-27 15:43:06 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglutils.c: - gl/utils: implement wayland display GstContext - requried for sharing GL contexts or subsurface support - -2015-05-22 16:07:49 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/wayland/wayland_event_source.c: - * gst-libs/gst/gl/wayland/wayland_event_source.h: - gl/wayland: run each window on a separate queue - Based on patch by Julien Isorce <julien.isorce@collabora.co.uk> - https://bugzilla.gnome.org/show_bug.cgi?id=709747 - -2015-05-30 02:19:25 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl: Don't leak temp strings in _RGB_pixel_order() - Fix a memory leak of temporary strings when computing - swizzling of RGB formats. - -2015-05-30 02:29:47 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - glfilter: Add transform_internal_caps() vfunc - Add a vfunc that is called by glfilter before it sets - caps features and intersects with the peer caps, and - move removing the size from caps into its default - implementation. Allows sub-classes to do more - sophisticated management of the size fields in case they - don't support arbitrary resizing or have distinct - preferences. - -2015-05-30 02:23:44 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: Don't remove size fields from caps - Instead of removing size fields, set them to the full range - like videoscale does, so the caps are clearly unfixed in - all cases. - -2015-05-10 18:55:16 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - videoaggregator: Add class property to disable caps scaling - Add preserve_update_caps_result boolean on the class to allow - sub-classes to disable videoaggregator removing sizes and framerate - from the update_caps() return result. - -2015-05-04 18:17:21 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Catch errors, and allow sub-class to return NULL from get_output_buffer() - A return value of GST_FLOW_OK with a NULL buffer from get_output_buffer() - means the sub-class doesn't want to produce an output buffer, so - skip it. - If gst_videoaggregator_do_aggregate() generates an error, make sure - to propagate it - don't just ignore and discard the error by - over-writing it with the gst_pad_push() result. - -2015-05-29 16:02:31 +0300 Vivia Nikolaidou <vivia@toolsonair.com> - - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsink.h: - rtmpsink: Do not crash when receiving buffers after GST_FLOW_ERROR - If the RTMP URI is invalid, the rtmpsink will return GST_FLOW_ERROR. - If it still receives buffers after that, it shouldn't crash. - https://bugzilla.gnome.org/show_bug.cgi?id=750104 - -2015-05-29 09:01:29 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: avoid assertion when splitting buffer - Pass size=-1 as is if that is the case instead of subtracting - the offset. Otherwise we have an invalid size passed for that - buffer. - -2015-05-28 15:59:02 +0200 Santiago Carot-Nemesio <sancane@gmail.com> - - * ext/dtls/gstdtlssrtpdec.c: - dtlssrtpdec: Release requested pads - https://bugzilla.gnome.org/show_bug.cgi?id=750036 - -2015-05-28 15:57:10 +0200 Santiago Carot-Nemesio <sancane@gmail.com> - - * ext/dtls/gstdtlsdec.c: - dtlsdec: Remove unnecessary ref/unref operations - https://bugzilla.gnome.org/show_bug.cgi?id=750036 - -2015-05-28 15:55:03 +0200 Santiago Carot-Nemesio <sancane@gmail.com> - - * ext/dtls/gstdtlsdec.c: - dtlsdec: Fix release request pad function - Don't unref the pad reference we don't own and just remove the pad. - https://bugzilla.gnome.org/show_bug.cgi?id=750036 - -2015-05-28 14:30:46 +0200 Edward Hervey <edward@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Search more when advancing fragment - In live situations, it is not uncommon for the current fragment to end - up out of the (updated) play range (lowest/highest sequence). But the next - fragment to play *is* present in the play range. - When advancing, if we can't find the current GstM3U8MediaFile, don't abort - straight away. Instead, look if a GstM3U8MediaFile with the next sequence value - is present, and if so switch to it. - https://bugzilla.gnome.org/show_bug.cgi?id=750028 - -2015-05-27 10:58:10 +0100 Julien Isorce <j.isorce@samsung.com> - - * configure.ac: - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gpuprocess/Makefile.am: - * gst-libs/gst/gl/gpuprocess/gstglcontext_gpu_process.c: - * gst-libs/gst/gl/gpuprocess/gstglcontext_gpu_process.h: - * gst-libs/gst/gl/gpuprocess/gstglwindow_gpu_process.c: - * gst-libs/gst/gl/gpuprocess/gstglwindow_gpu_process.h: - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglapi.h: - gl: add GstGLContextGPUProcess backend - It builds its GL vtable from a proc address provided - by the application. - -2015-05-27 16:28:39 +0100 Julien Isorce <j.isorce@samsung.com> - - * ext/gl/gstgleffects.c: - * ext/gl/gstglfiltershader.c: - * gst-libs/gst/gl/glprototypes/gstgl_gles2compat.h: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - gl: add and use gst_gl_internal_format_rgba - Previously when compiling GstGL with both GL and GLES2, - GL_RGBA8 was picked from GL/gl.h. But a clash may happen at - runtime when one is selecting GLES2. - gst_gl_internal_format_rgba allows to check at runtime - if it should use GL_RGBA or GL_RGBA8. - -2015-05-27 14:10:16 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - glwindow_x11: use parent default implementation - -2015-05-27 11:16:32 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - glcontext_glx: rename variable from window to context - -2015-05-27 11:11:55 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: initialize debug in class_init - Useful if one uses gst_gl_window_x11_new directly - instead of gst_gl_window_new. - -2015-05-27 11:07:38 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: initialize debug in class_init - Useful if one uses gst_gl_context_egl_new directly - instead of gst_gl_context_new. - -2015-05-27 10:55:20 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - glcontext: add gst_gl_context_set_display helper - -2015-05-27 15:25:40 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglcontext.h: - glcontext: add missing _CAST after G_TYPE_CHECK_CLASS - -2015-05-27 10:51:54 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglwindow.h: - glwindow: add missing _CAST after G_TYPE_CHECK_CLASS - -2015-05-26 18:38:39 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: provides some default implementations to factorize with all backends - -2015-05-28 00:59:39 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Push EOS on error return. - Before shutting down the srcpad task due to a - downstream error, push an EOS to give downstream - a chance to shut down somewhat cleanly. - -2015-05-27 13:12:57 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: don't overwrite value - Value of res is reset to FALSE in each iteration of the while loop. We want to - conserve TRUE if any pad event succeeded until we arrive to done. - Also, buf is set to the value of *outbuf twice. Removing the first assignment - since the second one is outside of a conditional. - -2015-05-27 13:08:46 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/opencv/gstretinex.c: - opencv: 'for' loop initial declaration - 'for' loop initial declarations are not allowed in C89, moving the declarations - to before the 'for' loops. - -2015-05-27 13:05:11 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/gl/gstgleffects.c: - gleffects: 'for' loop initial declaration - 'for' loop initial declarations are not allowed in C89, moving the declarations - to before the 'for' loops. - -2015-05-27 12:03:42 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/resindvd/gstmpegdemux.c: - resindvd: remove unused value - The data variable is incremented but never read again. Remove the unused value - assignment. - -2015-05-27 06:17:49 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: remove more unused attributes - Those are not used or only read - -2015-05-27 05:35:30 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: remove unused attribute - It is never read for anything useful - -2015-05-26 16:47:47 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * ext/gl/gstgloverlay.c: - gloverlay: fix a leak - https://bugzilla.gnome.org/show_bug.cgi?id=749846 - -2015-05-26 15:10:28 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * ext/gl/gstgloverlay.c: - gloverlay: properly handle errors while loading file - Post an error on the bus if anything bad happens while reading - and parsing the image file. - https://bugzilla.gnome.org/show_bug.cgi?id=749846 - -2015-05-26 15:04:34 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * ext/gl/gstgloverlay.c: - * ext/gl/gstgloverlay.h: - gloverlay: remove unused type_file field - https://bugzilla.gnome.org/show_bug.cgi?id=749846 - -2015-05-26 15:01:37 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/gl/gstglfilter.c: - gl: propagate return value from filter and filter_texture - https://bugzilla.gnome.org/show_bug.cgi?id=749846 - -2015-05-26 16:39:59 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/dvbsuboverlay/dvb-sub.c: - dvbsuboverlay: remove unused assignment - buf is incremented just before returning, this new value is never used. - Removing unused assignment. - -2015-05-26 15:24:52 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: 'for' loop initial declaration - 'for' loop initial declarations are only allowed in C89, moving the declaration - to before the 'for' loop. - -2015-05-26 14:14:34 +0100 Vineeth T M <vineeth.tm@samsung.com> - - * gst/gaudieffects/gstexclusion.c: - exclusion: exception when set factor to 0 - When factor property is set to 0, transform just returns. - Adjust the minimum value to 1. - https://bugzilla.gnome.org/show_bug.cgi?id=743907 - -2015-05-26 12:47:40 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgleffects.c: - gleffects: properly initialize the shaders across contexts implementing multiple API's - -2015-05-26 12:44:47 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/effects/gstgleffectssources.c: - gleffects_laplacian: fix shader compilation in gl3/gles2 - https://bugzilla.gnome.org/show_bug.cgi?id=748393 - -2015-05-25 12:33:50 +0200 Patricia Muscalu <patricia@axis.com> - - * configure.ac: - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlbasesink.h: - curlsink: handle socket callback for active FTP connections as well - Since version 7.28.0, libcurl allows application to set - socket options for active FTP connections. - Bump libcurl requirement to version tested. - https://bugzilla.gnome.org/show_bug.cgi?id=749815 - -2015-05-20 12:08:38 +0100 David Waring <david.waring@rd.bbc.co.uk> - - * ext/dash/gstmpdparser.c: - dashdemux: Fix segfault introduced by segment iteration refactoring (2105a310). - The functions to get the next fragment, next fragment timestamp and to advance - to the next fragment need to work differently when stream->segments is NULL. - Use logic similar to that introduced by commit 2105a310 to perform these - functions. - https://bugzilla.gnome.org/show_bug.cgi?id=749684 - -2015-05-18 22:33:50 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: use signed integet to represent segment index - We need to be able to represent -1 to check when we are EOS - on reverse playback and unsigned integer won't allow that. - CID #1298193 - CID #1298194 - CID #1298195 - https://bugzilla.gnome.org/show_bug.cgi?id=749534 - -2015-05-25 10:30:55 +0900 Suhwang Kim <suhwang.kim@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: fix outdated example launch line - https://bugzilla.gnome.org/show_bug.cgi?id=749809 - -2015-05-22 13:12:09 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/wayland/wayland_event_source.c: - gl/wayland: remove dead event source code - -2015-05-21 17:48:31 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/wayland/Makefile.am: - * gst-libs/gst/gl/wayland/gstgldisplay_wayland.c: - * gst-libs/gst/gl/wayland/gstgldisplay_wayland.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - gl/wayland: add GstGLDisplayWayland - Simple implementation split from GstGLWindowWayland - Can now have multiple glimagesink elements all displaying output - linked via GL or otherwise (barring GL platform limitations). - The intel driver is racy and can crash setting up the two glimagesink contexts. - e.g. - videotestsrc ! tee name=t ! queue ! glupload ! glimagesinkelement - t. ! queue ! gleffects_blur ! glimagesinkelement - videotestsrc ! glupload ! glfiltercube ! tee name=t ! queue ! glimagesinkelement - t. ! queue ! gleffects_blur ! glimagesinkelement - -2015-05-25 17:27:58 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltransformation.c: - gltransformation: fix DrawElements call for element array buffers - https://bugzilla.gnome.org/show_bug.cgi?id=749734 - -2015-05-23 01:00:18 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - gl/calayer: provide the exact GL api version for the wrapped context - Otherwise we could end up being mistaken for the diference between a - gl3 and a gl2 context resulting in a failure getting the list of - extensions from the wrapped context due to the difference between - glGetString and glGetStringi for the GL_EXTENSIONS token. - https://bugzilla.gnome.org/show_bug.cgi?id=749728 - -2015-05-22 02:40:37 +0900 Jimmy Ohn <yongjin.ohn@lge.com> - - * ext/dash/gstdashdemux.c: - dashdemux: remove unnecessary semicolon - https://bugzilla.gnome.org/show_bug.cgi?id=749691 - -2015-05-21 15:30:34 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - gl: win32: do not call SetParent in release_parent_win_id() - When called from gst_gl_window_win32_close(), internal window - could not exist, and if it does it's going to be destroyed just - after that anyway. Also it causes window_proc() to be called - and crash because it gets a NULL context. - When called from gst_gl_window_win32_set_window_handle() we are - going to set another parent anyway, and it's probably better to - reparent directly instead of passing by a NULL parent which could - cause the internal window to popup briefly. - https://bugzilla.gnome.org/show_bug.cgi?id=749601 - -2015-05-21 15:30:00 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - gl: win32: remove unused code - https://bugzilla.gnome.org/show_bug.cgi?id=749601 - -2015-05-20 17:09:21 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - gl: win32: fix crash when finalizing GstGLContext - gst_gl_context_finalize() is calling gst_gl_window_win32_quit() - which was posting a message. But then window_proc takes window's - context and get a NULL. - Now that we've got a GMainLoop we can do like other backends and - simply call g_main_loop_quit(). - This also remove duplicated code to release the parent window and - potential crash there because parent_proc could be NULL if we never - created the internal window. That could happen for example if setting - state to READY then setting a window_handle, and go back to NULL state. - https://bugzilla.gnome.org/show_bug.cgi?id=749601 - -2015-05-20 17:06:42 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - gl: win32: Fix leaked GstGLContext - https://bugzilla.gnome.org/show_bug.cgi?id=749601 - -2015-05-20 15:30:49 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - gl: win32: set the parent window when creating internal window - When _set_window_handle() was called in READY state, it wasn't - set to the internal window created later. - https://bugzilla.gnome.org/show_bug.cgi?id=749601 - -2015-05-20 15:29:50 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/gl/win32/Makefile.am: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - * gst-libs/gst/gl/win32/win32_message_source.c: - * gst-libs/gst/gl/win32/win32_message_source.h: - gl: win32: use a GMainContext to dispatch win32 messages - gst_gl_window_win32_send_message_async() could be called before the - internal window is created so we cannot use PostMessage there. - x11 and wayland backends both create a custom GSource for this, - so there is no reason to not do that for win32. - https://bugzilla.gnome.org/show_bug.cgi?id=749601 - -2015-05-22 00:27:36 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Don't leak all memory uploaded via raw uploads. - Remove an extra ref missed when switching over to not - reusing output textures - -2015-05-21 16:24:48 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglvideomixer.c: - * gst/compositor/compositor.c: - compositor/glvideomixer: Don't calculate PAR/DAR with unset GstVideoInfos - Otherwise we divide by zero. - -2015-05-21 16:19:08 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/compositor.c: - compositor: Fix double assignment - -2015-05-21 15:05:33 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: require a shader version to initialize. - It's very near pointless to try our GL implementation without shaders. - https://bugzilla.gnome.org/show_bug.cgi?id=749284 - -2015-05-20 02:38:53 +1000 Jan Schmidt <jan@centricular.com> - - * tests/examples/gl/generic/cube/Makefile.am: - * tests/examples/gl/generic/cubeyuv/Makefile.am: - * tests/examples/gl/generic/doublecube/Makefile.am: - Fix flags order in GL examples for uninstalled build - -2015-05-20 01:57:52 +1000 Jan Schmidt <jan@centricular.com> - - * sys/wasapi/Makefile.am: - wasapi: Fix flags order for uninstalled build - -2015-05-21 00:56:01 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - * gst/compositor/compositor.c: - compositor/glvideomixer: fix up par handling - We were using the wrong formula - https://bugzilla.gnome.org/show_bug.cgi?id=749634 - -2015-04-17 15:36:49 +0200 Edward Hervey <edward@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Consider SEI NALU as "HEADER" packets - Like SPS/PPS they do contain information which will be needed to - decode the following data (as per definition of the flag) - Also ensures that the series of SPS/PPS/SEI NALU before a keyframe - can be considered as one contiguous header - -2015-04-17 15:35:43 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: Carry over GST_BUFFER_FLAG_HEADER - In the same way we do it for the DELTA_UNIT flag - This allows downstream elements to know whether a given mpeg-ts - packet contains a corresponding HEADER elementary unit - -2015-05-20 12:11:31 +0200 Thijs Vermeir <thijs.vermeir@barco.com> - - * ext/x265/gstx265enc.c: - x265enc: Only copy VPS/SPS/PPS NAL units in header buffer - Previously the VPS unit was detected and all next packets where copied - into the header buffer assuming only SPS and PPS would follow. This is - not always true, also other types of NAL units follow the VPS unit and - where copied to the header buffer. Now the VPS/SPS/PPS are explicitely - detected and copied in the header buffer. - -2015-05-20 11:27:25 +0200 Thijs Vermeir <thijs.vermeir@barco.com> - - * ext/x265/gstx265enc.c: - x265enc: Fix tune parameter mismatch - There was a mismatch between the tune parameter in x265 and the enum - used in this element. The value in the enum is the x265 tune - parameter + 1. - -2015-05-19 18:02:30 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcaudiodec.h: - amcaudiodec: Add an output adapter for chunking the output into codec frames - Otherwise the base class will be confused. - See https://bugzilla.gnome.org/show_bug.cgi?id=685730 - -2015-05-19 10:43:28 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglframebuffer.c: - gl: fix crash on windows with intel driver - https://bugzilla.gnome.org/show_bug.cgi?id=749430 - -2015-05-20 00:50:37 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.m: - caopengllayersink: static const the indices array - the contents will never change anyway. - -2015-05-20 00:28:52 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.h: - * ext/gl/caopengllayersink.m: - caopengllayersink: correctly use the sync meta across multiple contexts - 1. Set the sync point after the (possible) upload has occured - 2. Wait in the correct GL context (the draw context) - Note: We don't add the GL sync meta to the input buffer as it's not - writable and a copy would be expensive. - Similar to the change with the same name for glimagesink - -2015-05-20 00:28:07 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.h: - * ext/gl/caopengllayersink.m: - caopengllayersink: update for GL3 element array buffer usage - fixes blank output - -2015-05-19 16:22:00 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: correctly use the sync meta across multiple contexts - 1. Set the sync point after the (possible) upload has occured - 2. Wait in the correct GL context (the draw context) - Note: We don't add the GL sync meta to the input buffer as it's not - writable and a copy would be expensive. - -2015-05-19 16:19:41 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.h: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - gl/calayer: provide a current wrapped GstGLContext for callbacks - So that the draw and resize callbacks can get the current GstGLContext. - -2015-05-19 16:14:39 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - glsyncmeta: ensure that the Fence is going to be executed - Otherwise it could stay client side without being submitted to the GL - server resulting in another context waiting on a Fence that will never - become signalled causing a deadlock. - -2015-05-19 11:47:23 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: don't reuse output textures for raw data upload - Causes stale textures to be used further down the chain. - -2015-05-19 11:11:02 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglframebuffer.c: - glframebuffer: don't clear the framebuffer - Breaks attempting to blend with the destination buffer and should be done - explicitly by the callback anyway. - -2015-05-19 11:09:54 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasefilter.c: - glbasefilter: track gl_start/stop correctly - Don't start multiple times without calling gl_stop. - -2015-05-18 20:16:32 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiomixer/gstaudiomixer.c: - * gst/compositor/compositor.c: - Revert "doc: Workaround gtkdoc issue" - This reverts commit ff6c736fe08e01f4320c4b02e811a0b57cf97cc1. - This is fixed by the gtk-doc 1.23 release. - <para> cannot contain <refsect2>: - http://www.docbook.org/tdg/en/html/para.html - http://www.docbook.org/tdg/en/html/refsect2.html - -2015-05-14 02:11:50 +0900 Jimmy Ohn <yongjin.ohn@lge.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - hlsdemux: Simplify logic in process_manifest - Simplify logic in process_manifest and remove a TODO item. - https://bugzilla.gnome.org/show_bug.cgi?id=749328 - -2015-05-18 14:12:56 +0900 Vineeth T M <vineeth.tm@samsung.com> - - * ext/opencv/gstcvsmooth.c: - * ext/opencv/gstcvsmooth.h: - cvsmooth: rename properties - The properties are named as param1 to param4, which makes very little sense - hence renamed the properties according to what it is doing. - https://bugzilla.gnome.org/show_bug.cgi?id=749523 - -2015-05-18 14:01:59 +0900 Vineeth T M <vineeth.tm@samsung.com> - - * ext/opencv/gstcvsmooth.c: - cvsmooth: Wrong assignment of prop leads to crash - when setting param2 property, it is wrongly being assigned to param1. - This leads to wrong behavior and a crash when param2 is set as 0. - https://bugzilla.gnome.org/show_bug.cgi?id=749523 - -2015-05-18 14:30:19 +0900 Vineeth T M <vineeth.tm@samsung.com> - - * ext/opencv/gstpyramidsegment.c: - pyramidsegment: wrong value of level property - The property level has a minimum value of 0. But when we set the level as 0, - it gets an assertion error. The function icvPyrSegmentation8uC3R returns false - if level is set as 0, since the minimum level cant be 0 and thus results in error. - Hence changing the minimum value to 1. - https://bugzilla.gnome.org/show_bug.cgi?id=749525 - -2015-05-16 23:38:14 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst/audiomixer/gstaudiomixer.c: - * gst/compositor/compositor.c: - doc: Workaround gtkdoc issue - With gtkdoc 1.22, the XML generator fails when a itemizedlist is - followed by a refsect2. Workaround the issue by wrapping the - refsect2 into para. - -2015-05-06 15:17:24 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: fix buffer timestamp not being in stream time - Timestamps should start at the segment start, rather than 0, so - we need to not subtract the first timestamp. This makes the sink - correctly account for running time when switching PMTs where a - stream starts not quite at zero, causing timing offsets that can - become noticeable and causing dropped frames after a few times. - -2015-05-06 15:16:37 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: accumulate previous segment base time - -2015-04-24 12:56:02 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - tsdemux: fix refcounting when applying a new PMT - A new program object is created to replace an existing one - in the programs hash table, so its refcount needs to match. - With the default of 0 refcount on creation, the next PAT - change will cause that refcount to be both incremented and - decremented (assuming the new PAT references that stream too), - which will cause the program to be destroyed. - https://bugzilla.gnome.org/show_bug.cgi?id=748412 - -2015-05-14 16:06:55 +0200 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlsenc.c: - * ext/dtls/gstdtlssrtpdec.c: - * ext/dtls/gstdtlssrtpenc.c: - dtls: Fix memory leak - Keys were not correctly released when it was get as a property - nor when a second key was received - https://bugzilla.gnome.org/show_bug.cgi?id=749380 - -2015-05-14 21:21:01 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: free the vertex buffer when done - fixes a memory leak - -2015-01-22 18:00:36 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - glcontext/cocoa: implement GL3 core context selection - -2015-05-14 18:35:35 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglcontext.c: - tests/gl: fix typo - -2015-05-14 16:42:09 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/effects/gstgleffectblur.c: - * ext/gl/effects/gstgleffectbulge.c: - * ext/gl/effects/gstgleffectfisheye.c: - * ext/gl/effects/gstgleffectglow.c: - * ext/gl/effects/gstgleffectlaplacian.c: - * ext/gl/effects/gstgleffectlumatocurve.c: - * ext/gl/effects/gstgleffectmirror.c: - * ext/gl/effects/gstgleffectrgbtocurve.c: - * ext/gl/effects/gstgleffectsin.c: - * ext/gl/effects/gstgleffectsobel.c: - * ext/gl/effects/gstgleffectsquare.c: - * ext/gl/effects/gstgleffectsqueeze.c: - * ext/gl/effects/gstgleffectstretch.c: - * ext/gl/effects/gstgleffecttunnel.c: - * ext/gl/effects/gstgleffecttwirl.c: - * ext/gl/effects/gstgleffectxray.c: - * ext/gl/gltestsrc.c: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglmosaic.c: - * ext/gl/gstgloverlay.c: - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/gl/gstglfilter.c: - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglupload.c: - gl: remove useless gl{En,Dis}able (GL_TEXTURE_*) calls - We are using shaders everywhere and so they are not needed - -2015-05-14 15:10:59 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: cleanup properties - remove unused "display-name" - ensure defaults between the bin/element are the same - -2015-05-14 14:56:30 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgleffects.c: - gleffects: only try the GL2 shader init path if we have a GL2 context - -2015-05-12 22:04:26 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglshader.c: - glshader: attempt to detect the gles2 inside opengl3 case - This is necessary to use gles2 shaders in a GL 3 core context on - OS X which fails without a proper #version being set on the shaders. - -2015-05-12 17:55:43 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglshader.c: - glshader: remove references to gl3 specific shaders - We rely specifically on gles2 shaders being supported by the GL - implementation with GL3 core profile. - -2015-05-01 12:04:28 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfiltercube.h: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * ext/gl/gstgloverlay.c: - * ext/gl/gstgloverlay.h: - * ext/gl/gstgltransformation.c: - * ext/gl/gstgltransformation.h: - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - gl: element buffers are part of vao state - Use them as such. They are also required for GL3 core profile support - with glDrawElements on OS X. - -2015-05-07 12:25:10 +0700 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: properly detect (hopefully) the correct ext_rg/arb_rg variant - GL_EXT_texture_rg is only valid for GLES2. GLES3 uses similar wording to - the GL_ARB_texture_rg which requires a sized internal format that the - GL_EXT_texture_rg does not require. - https://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_rg.txt - https://www.opengl.org/registry/specs/ARB/texture_rg.txt - -2015-05-14 13:04:21 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst/compositor/compositor.c: - compositor: implement proper par handling - We were previously failing on different input and output par - -2015-05-12 13:41:19 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: avoid busy-looping when waiting for new fragment - When all fragments have already been downloaded on a live stream - dashdemux would busy loop as the default implementation of - has_next_fragment would return TRUE. Implement it to correctly - signal if adaptivedemux should wait for the manifest update before - trying to get new fragments. - -2015-05-11 14:19:20 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: Improve live stream manifest update repositioning - When updating the manifest the timestamps on it might have changed a little - due to rounding and timescale conversions. If the change makes the timestamp - of the current segment to go up it makes dashdemux reposition to the previous - one causing one extra unnecessary download. - So when repositioning add an extra 10 microseconds to cover for that rounding - issues and increase the chance of falling in the same segment. - Additionally, also improve the time used when the client is already after the - last segment. Instead of using the last segment starting timestamp use the - final timestamp to make it reposition to the next one and not to the one that - has already been downloaded. - -2015-05-11 12:30:03 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: add more protection when acessing gptrarray entries - The glib structure doesn't do range checking so we have to do it - ourselves. - Also adds some more debugging messages - -2015-05-08 16:58:36 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: remove unused functions - These functions of directly getting and setting segment indexes - are no longer useful as now we need 2 indexes: repeat and segment - index. - The only operations needed are advance_segment, going back to the - first one or seeking for a timestamp. - -2015-05-08 16:49:02 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: reuse seeking function to reduce repeated code - Instead of writing a seek routine, just use the mpdparser function. - Also remove function that is not needed anymore - -2015-05-08 16:31:44 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: refactor segment iteration for better performance - Segments are now stored with their repeat counts instead of spanding - them to multiple segments. This caused advancing to the next segment - using a single index to have to iterate over the whole list every time. - This commit addresses this by storing both the segment index as well - as the repeat index and makes advancing to next segment just an - increment of the repeat or the segment index. - -2015-05-07 16:30:48 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: improve mpd parsing for repeated segment entries - Use a single segment to represent it internally to avoid using too - much memory. This has the drawback of issuing a linear search to - find the correct segment to play but this can be fixed by using - binary searches or caching the current position and just looking - for the next one. - https://bugzilla.gnome.org/show_bug.cgi?id=748369 - -2015-05-12 12:55:42 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: drop debug message that was wrong - EOS doesn't necessarily mean that no fragment was downloaded - -2015-05-12 12:55:17 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: run gst-indent - To allow commiting on this file cleanly - -2015-05-11 11:56:52 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: the parent is provided in the function - No need to get it again - -2015-05-13 15:59:48 +0200 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/dtls/gstdtlsenc.c: - dtlsenc: Fix memory leak releasing connection_id - https://bugzilla.gnome.org/show_bug.cgi?id=749318 - -2015-05-13 15:33:49 +0200 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/dtls/gstdtlsenc.c: - dtlsenc: Fix memory leak while setting connection-id - https://bugzilla.gnome.org/show_bug.cgi?id=749318 - -2015-05-13 17:15:57 +0200 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/dtls/gstdtlsdec.c: - dtlsdec: Fix memory leak, release previous pem - https://bugzilla.gnome.org/show_bug.cgi?id=749322 - -2015-05-13 16:06:52 +0200 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/dtls/gstdtlsdec.c: - dtlsdec: Fix memory leak on dispose - Parent dispose function was not called - https://bugzilla.gnome.org/show_bug.cgi?id=749322 - -2015-05-13 17:19:25 +0200 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/dtls/gstdtlsconnection.c: - dtlsconnection: Fix memory leak while setting closure - https://bugzilla.gnome.org/show_bug.cgi?id=749325 - -2015-05-13 16:23:26 +0200 Wim Taymans <wtaymans@redhat.com> - - * configure.ac: - fix faad2 version check - On fedora 22, the output of cpp inserts extra debug comments, which - makes our regexp for the faad2 version check fail. This in turn causes - it to compile with the wrong arguments passed which then causes stack - corruption and crashes. - Fix this by only checking for the version (which should be by itself on - a single line). This is potentially less safe, it might be possible that - a similar string would appear in a later version in the header file. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=748571 - -2015-05-13 23:55:28 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: propagate the version/extension failure upwards - Otherwise the calling code has no idea that the context failed to - be created fully. - https://bugzilla.gnome.org/show_bug.cgi?id=749284 - -2015-05-13 23:54:52 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglbasefilter.c: - gl: don't deadlock on context creation failure - https://bugzilla.gnome.org/show_bug.cgi?id=749284 - -2015-05-13 15:42:15 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglmixerbin.c: - glmixerbin: Don't unref pad templates - Otherwise we unref the reference that is owned by the element class. - -2015-05-13 12:31:44 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: fix failure return values from create_session() - create_session() returns an err_status_t with - err_status_ok=0 and err_status_fail=1, so - returning TRUE/FALSE is not quite right. - https://bugzilla.gnome.org/show_bug.cgi?id=749304 - -2015-05-13 13:14:14 +0200 Miguel París Díaz <mparisdiaz@gmail.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: fix over unlocking - Called should call function with lock, and is - also responsible for unlocking it later. - https://bugzilla.gnome.org/show_bug.cgi?id=749304 - -2015-05-12 15:47:33 +0800 Lyon Wang <lyon.wang@freescale.com> - - * gst/videoparsers/h263parse.c: - h263parse: fix custom picture format (CPFMT) parsing - In the H263 spec, CPFMT is present only if the use of a custom - picture format is signalled in PLUSEPTYPE and UFEP is "001", - so we need to check params->format and only if the value is - 6 (custom source format) the CPFMT should be read, otherwise - it's not present and wrong data will be parsed. - When reading the CPFMT, the width and height were not - calculated correctly (wrong bitmask). - https://bugzilla.gnome.org//show_bug.cgi?id=749253 - -2015-05-13 17:38:35 +1000 Matthew Waters <matthew@centricular.com> - - * gst/compositor/compositor.c: - * tests/check/elements/compositor.c: - compositor: fix rectangle obscure test to clamp against the output frame size - Rather than one of the input pad video info's. - The test checking this was not constraining the output frame size - to ensure that the out of frame stream was not being displayed. - -2015-05-13 17:11:55 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: implement par handling - We were previously ignoring it completely - -2015-05-13 17:10:42 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: don't upload the vertex data every frame - Add the missing cache tracking statement. - -2015-05-12 16:36:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/gl/gstgluploadelement.c: - gluploadelement: Remove uneeded header and defines - -2015-05-11 15:02:02 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstgltestsrc.c: - gltestsrc: Use default get_caps implementation - The custom code is wrong as it ignores the templates, which leads to - missing fields in the result. Instead, simply use the default get_caps - implementation which does it correctly (get the template, intersect - with filter and return). - https://bugzilla.gnome.org/show_bug.cgi?id=749237 - -2015-05-11 15:54:52 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: Implement GstVideoAggregator::find_best_format() - Without this, we will fixate weird pixel-aspect-ratios like 1/2147483647. But - in the end, all the negotiation code in videoaggregator needs a big cleanup - and videoaggregator needs to get rid of the software-mixer specific things - everywhere. - -2015-05-11 22:53:09 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstopengl.c: - gl: demote upload/convert/download elements to none - Copy paste error - -2015-05-11 22:37:44 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstopengl.c: - gl: expose internal glvideomixerelement\ - We might want more control over the exact pipeline - Also reduces overhead - -2015-05-11 22:35:18 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstopengl.c: - gl: expose internal glimagesinkelement - We might want more control over the exact pipeline. - Also reduces overhead. - -2015-05-07 21:18:27 +0200 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: fix unconditional buffer queue unlock - Unless stopRequest is set, we should unlock conditionally -- otherwise, - the 'create:' method can wake up to an empty buffer queue - and pull a nil buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=748054 - -2015-05-11 12:18:28 +0200 Heinrich Fink <hfink@toolsonair.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - decklink: Rename mode 2048p to 1556p - https://bugzilla.gnome.org/show_bug.cgi?id=749218 - -2015-05-11 12:04:47 +0200 Heinrich Fink <hfink@toolsonair.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Use correct frame rate for mode 2160p50 - https://bugzilla.gnome.org/show_bug.cgi?id=749218 - -2015-05-11 12:02:47 +0200 Heinrich Fink <hfink@toolsonair.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - decklink: Rename mode 3184p to 2160p - https://bugzilla.gnome.org/show_bug.cgi?id=749218 - -2015-01-22 15:43:22 +0100 Piotr Drąg <piotrdrag@gmail.com> - - * po/POTFILES.in: - * po/POTFILES.skip: - po: update POTFILES.skip and POTFILES.in - The ones in .skip need to be added back to POTFILES.in - after porting to 1.x. - https://bugzilla.gnome.org/show_bug.cgi?id=743352 - -2015-05-08 14:20:44 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/removesilence/gstremovesilence.c: - removesilence: remove gst_remove_silence_reset() - No need to call gst_remove_silence_reset() in gst_remove_silence_init() because - vad_new() already calls this function. Since there are no more uses of - _silence_reset(), we can remove it altogether. - -2015-05-08 14:55:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: We shouldn't manually check reconfigure flag on pads but instead implement ::negotiate() - Add FIXME comment related to that. - -2015-05-08 13:54:06 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/asfmux/gstasfmux.c: - * gst/debugutils/fpsdisplaysink.c: - * gst/mxf/mxfdv-dif.c: - * gst/mxf/mxfmux.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - Update references to decodebin - Update old references for decodebin2 to decodebin. - -2015-05-08 13:49:38 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/removesilence/gstremovesilence.c: - removesilence: update example launch line - -2015-05-07 21:04:30 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlssrtpdec.c: - * ext/dtls/gstdtlssrtpdec.h: - dtlssrtpdec: Don't merge RTP and RTCP streams that were just split by srtpdec - The funnel has some overhead, and later rtpbin will have to split both streams - again anyway. - https://bugzilla.gnome.org/show_bug.cgi?id=748723 - -2015-05-06 15:47:27 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - Revert "Revert "glimagesink: add pixel-aspect-ratio property on the bin"" - This reverts commit d96e43b034a03fe54633907bc1bf2a26fe5f95fb. - -2015-05-06 15:47:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - Revert "Revert "glimagesink: forward ALL the properties on the bin"" - This reverts commit 59fb0f830f08e3e59f87f83df8fa3c2d9f3d9741. - -2015-05-06 15:47:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * ext/gl/gstopengl.c: - Revert "Revert "glimagesink: implement as a bin"" - This reverts commit be938f92d94e8acccf593128281f6e09213600a0. - -2015-05-06 15:46:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglcolorconvertelement.c: - * ext/gl/gstglcolorconvertelement.h: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - * ext/gl/gstglmosaic.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - Revert "gl: readd glupload/download onto element pads" - This reverts commit 87d8270f302b03f63ce04f986d824892a2c131fd. - -2015-05-06 15:43:32 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - * ext/gl/gstopengl.c: - Revert "Revert "glvideomixer: implement with glmixerbin"" - This reverts commit b4bd11f2f3a60224d188b27ab55b278077cb1217. - -2015-05-06 12:59:33 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Actually set the caps on the srcpad instead of just calling the default event handler for the sinkpad - Fixes up dafa11b9d21d06a0273007628a2a0bb4d7858658 - -2015-04-29 18:23:31 +0900 Jimmy Ohn <yongjin.ohn@lge.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: only update stream position if query success - We don't need to check about the query fail case. - because it is update to segment position even though query fail. - https://bugzilla.gnome.org/show_bug.cgi?id=748529 - -2015-05-05 12:45:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - decklink: Disable decklink plugin on Android - -2015-05-05 14:44:25 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - glsyncmeta: fixup size declaration - -2015-05-04 23:42:36 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: handle the local_context query - so that upstream elements can get the GL context from glimagesink - -2015-05-03 14:56:05 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/androidmedia/gstamc-constants.h: - * sys/androidmedia/gstamc.c: - androidmedia: Add suport for COLOR_FormatYV12 - Reference: http://developer.android.com/reference/android/graphics/ImageFormat.html#YV12 - https://bugzilla.gnome.org/show_bug.cgi?id=747126 - -2015-04-30 11:44:06 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/androidmedia/gstamc-constants.h: - androidmedia: Declare QOMX_COLOR_FORMATYVU420PackedSemiPlanar32mMultiView constant - This color format is the same as QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m - but stores two images one after the other in a top-bottom layout. - https://bugzilla.gnome.org/show_bug.cgi?id=747126 - -2015-05-04 11:23:16 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstrtpopusdepay.c: - opusdepay: Set multistream=FALSE on the Opus caps - The RTP Opus mapping only allows mono/stereo, and not multistream Opus - streams. - -2015-05-04 10:35:55 +0200 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/opus/gstopusheader.c: - opusheader: Do not include rate in caps if it is 0 - As expressed in gst_opus_header_create_caps, value 0 means unset. - Setting rate value to 0 make negotiation with decoder fail. - https://bugzilla.gnome.org/show_bug.cgi?id=748875 - -2015-05-04 08:06:35 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Fix slice-height for Tegra 3 devices - https://bugzilla.gnome.org/show_bug.cgi?id=748867 - -2015-03-13 16:07:15 +0100 Edward Hervey <bilboed@bilboed.com> - - * sys/androidmedia/gstamc-constants.h: - * sys/androidmedia/gstamc.c: - androidmedia: Add support for COLOR_FormatYUV420Flexible - https://bugzilla.gnome.org/show_bug.cgi?id=747126 - -2015-03-25 17:43:59 +0100 Edward Hervey <bilboed@bilboed.com> - - * sys/androidmedia/gstamc-constants.h: - * sys/androidmedia/gstamc.c: - androidmedia: Add suport for Intel color formats - https://bugzilla.gnome.org/show_bug.cgi?id=747126 - -2015-05-02 18:06:18 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Fix profile and level setting in caps - Don't use the apis in codec-utils to extract the profile and level - syntax elements since it is wrong if there are emulation prevention - bytes existing in the byte-stream data. - https://bugzilla.gnome.org/show_bug.cgi?id=747613 - -2015-05-03 23:08:15 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - glcolorconvert: Improve passthrough check when no conversion is needed. - Make the passthrough check contingent on only the fields we - can modify being unchanged, and pre-compute it when caps - change instead of checking on each buffer. Makes the passthrough - more lenient if consumers are lax about making input and output - caps complete. - -2015-05-01 19:39:58 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: handle when source creation fail - Remember to set the source to NULL state as adding it to the pipeline - will set it to the READY state. - -2015-05-01 19:31:45 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: fix element linking order - Video source should be linked to videocrop and not to - videoconvert as it is done in the main linking path - -2015-03-13 06:10:52 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/compositor.c: - tests: Add a check for the new compositor pad-is-obscured optimization - We verify that all the buffers on an obscured sinkpad are skipped by overriding - the map() function in the GstVideoMeta of the buffers to set a variable when - called. We also test that the buffers do get mapped when they're not obscured. - Blame^WCredit for the GstVideoMeta map() idea goes to Tim. - https://bugzilla.gnome.org/show_bug.cgi?id=746147 - -2015-04-18 15:10:00 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/compositor/compositor.c: - compositor: Only map the frame from a buffer if it will be used - It's a waste of resources to map it if it won't be converted - or used at all. Since we moved the frame mapping down, we need - to use the GST_VIDEO_INFO accessor macros now in the code above - that instead of the GST_VIDEO_FRAME accessor macros. - https://bugzilla.gnome.org/show_bug.cgi?id=746147 - -2015-04-18 15:09:02 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/compositor/compositor.c: - compositor: use accessor macros for consistency - https://bugzilla.gnome.org/show_bug.cgi?id=746147 - -2015-04-18 15:09:02 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/compositor/compositor.c: - compositor: Skip pads that are completely obscured by a higher zorder pad - For each frame, compare the frame boundaries, check if the format contains an - alpha channel, check opacity, and skip the frame if it's going to be completely - overwritten by a higher zorder frame. The check is O(n^2), but that doesn't - matter here because the number of sinkpads is small. - More can be done to avoid needless drawing, but this covers the majority of - cases. See TODOs. Ideally, a reverse painter's algorithm should be used for - optimal drawing, but memcpy during compositing is small compared to the CPU used - for frame conversion on each pad. - https://bugzilla.gnome.org/show_bug.cgi?id=746147 - -2015-04-30 19:08:25 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix source caps to report cropped dimensions - https://bugzilla.gnome.org/show_bug.cgi?id=747613 - -2015-04-10 15:34:40 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix the memory freeing of stored VPS nals - https://bugzilla.gnome.org/show_bug.cgi?id=747613 - -2015-04-30 18:36:35 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix profile, tier and level setting in caps - Don't use the apis in codec-utils to extract the profile,tier and level - syntax elements since it is wrong if there are emulation prevention - bytes existing in the byte-stream data. - https://bugzilla.gnome.org/show_bug.cgi?id=747613 - -2015-04-17 15:15:33 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparser: h265: Fix nal unit size checking - The EOS and EOB nals have the size 2 which is the size of - nal unit header itself. The gst_h265_parser_identify_nalu() - is not required to scan start code again in this case. - In other cases, for a valid nalunit the minimum required size - is 3 bytes (2 byte header and at least 1 byte RBSP payload) - -2015-04-17 15:03:34 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - codecparser: h265: Calculate crop rectangle dimensions - -2015-04-17 15:01:57 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - codecparser: h265: Fix parsing multiple SEI messages in a single SEI Nal - An SEI Nal can have more than one SEI message. - Change in API: the gst_h265_parser_parse_sei() - -2015-04-30 21:32:29 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Make sure to send caps events downstream before any segment events - Upstream might not give us a caps event (dtlssrtpdec) because it might be an - RTP/RTCP mixed stream, but we split the two streams anyway and should report - proper caps downstream if possible. - Fixes "sticky event misordering" warnings with dtlssrtpdec. - -2015-04-30 10:50:19 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/rtjpeg/gstrtjpegdec.c: - * gst/rtjpeg/gstrtjpegenc.c: - rtjpeg: remove unused quality property - -2015-04-30 11:15:40 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglcolorconvertelement.c: - * ext/gl/gstglcolorconvertelement.h: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - * ext/gl/gstglmosaic.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - gl: readd glupload/download onto element pads - Allows insertion of gl elements into non-gl pipelines without converter - (upload/download) elements. - https://bugzilla.gnome.org/show_bug.cgi?id=743974 - -2015-04-29 22:55:00 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - * ext/gl/gstopengl.c: - Revert "glvideomixer: implement with glmixerbin" - This reverts commit 0fb56738a14391f248aa0be8756adeaf978baa0c. - -2015-04-29 22:38:00 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * ext/gl/gstopengl.c: - Revert "glimagesink: implement as a bin" - This reverts commit 8a0017e21d5f9a8507f0593c6b24f723aa415258. - -2015-04-29 22:32:33 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - Revert "glimagesink: forward ALL the properties on the bin" - This reverts commit 4be45e5f30dc6121f2769323603447f591ca4a0a. - -2015-04-29 22:32:20 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - Revert "glimagesink: add pixel-aspect-ratio property on the bin" - This reverts commit 2ba6bb9b9325b63f58a9ff0b2c82fa28759dcabc. - -2015-04-29 09:57:52 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/winks/gstksvideodevice.c: - * sys/winks/gstksvideodevice.h: - * sys/winks/gstksvideosrc.c: - ksvideosrc: don't timestamp buffers for muxed streams - -2015-04-29 21:37:56 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/winks/gstksvideodevice.c: - ksvideosrc: fix header size for muxed streams - -2015-04-29 19:39:14 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparser: h265: Fix the number of tile rows/columns parsing - The possible minimum value for num_tile_columns_minus1 and num_tile_rows_minus1 - is zero (7.4.3.3). - https://bugzilla.gnome.org/show_bug.cgi?id=748641 - -2015-04-29 17:20:58 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mixmatrix/mixmatrix.c: - mixmatrix: remove unused property enum items - These two properties have been there since the origin of the element but they - aren't used. Removing them. - -2015-04-29 15:41:07 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Fix comparision logic - We can't answer the SEEKING query if we do *not* have the manifest - -2015-04-29 10:56:24 +0200 Edward Hervey <edward@centricular.com> - - * gst/aiff/Makefile.am: - aiff: Re-add noinst_HEADERS instruction - Was removed in the previous android cleanup commit - -2015-04-28 21:43:56 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * sys/winks/Makefile.am: - * sys/winks/gstksclock.c: - * sys/winks/gstksvideosrc.c: - * sys/winks/ksdeviceprovider.c: - * sys/winks/ksdeviceprovider.h: - * sys/winks/kshelpers.c: - * sys/winks/kshelpers.h: - GstDeviceProvider implementation for WIN Kernel Streaming plugin - gst_ks_device_provider_probe() is a no-braier, just runs ks_enumerate_devices() - and reports the results. - Monitoring is a bit more tricky. We have to create a dummy message-processing - window and register device change notifications for it. - As kernel streaming can (and should) be used for audio capture and audio - playback, this change also has certain placeholders for such. - https://bugzilla.gnome.org/show_bug.cgi?id=747757 - -2015-04-29 02:30:05 +1000 Jan Schmidt <jan@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: Cache caps for passing to the client draw call - Don't convert the GstVideoInfo to caps on every draw call, - just cache the caps and pass them into the GstSample. - -2015-04-29 02:20:09 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Make upload method static caps non-const. - Retrieving a GstStaticCaps does a one time internal - initialisation and caches it - they can't be stored as - const structures. - -2015-04-28 17:24:04 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/opus/gstopusdec.h: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - * ext/opus/gstopusparse.c: - opus: fix includes and compilation against opus in non-standard prefix - https://bugzilla.gnome.org/show_bug.cgi?id=748594 - -2015-04-28 16:58:21 +0200 Mersad Jelacic <mersad@axis.com> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusenc.c: - opus: don't use deprecated gst_buffer_new_and_alloc - Use the helper function available in the base class instead. - https://bugzilla.gnome.org/show_bug.cgi?id=748585 - -2015-04-28 16:06:47 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/libde265/libde265-dec.c: - de265dec: use g_get_num_processors() if available - And provide home-made fallback for older GLib versions, - so that we can later find these and remove them when - we bump the GLib requirement (which is certainly going - to happen before 2.0). - https://bugzilla.gnome.org/show_bug.cgi?id=748495 - -2015-04-28 16:02:27 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/debugutils/fpsdisplaysink.c: - * gst/inter/gstintertest.c: - * gst/liveadder/liveadder.c: - gst: remove some unnecessary glib version checks - We require 2.32, no need to check for anything older - than that. - -2015-04-28 11:28:39 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/mxf/mxfmetadata.c: - mxf: fix descriptor leak - Free the existing descriptor array, if any, before replacing it. - Fix leaks with the - validate.file.playback.scrub_forward_seeking.test-mpeg2-mp3_mxf scenario. - https://bugzilla.gnome.org/show_bug.cgi?id=748580 - -2015-04-28 10:13:35 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: fix taglist leak - If the stream which is about to be removed still has a ref on a tag list we - should drop it. - Fix a leak which was occasionally happening with the - validate.file.playback.change_state_intensive.tron_en_ge_aac_h264_ts scenario. - https://bugzilla.gnome.org/show_bug.cgi?id=748576 - -2015-04-27 22:44:28 +0900 Jimmy Ohn <yongjin.ohn@lge.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: fix find_subtable() return value - find_subtable() returns a pointer, so return NULL and - not FALSE when nothing is found. - https://bugzilla.gnome.org/show_bug.cgi?id=748527 - -2015-04-28 14:52:36 +0200 Edward Hervey <edward@centricular.com> - - * win32/common/libgstcodecparsers.def: - win32: update defs - -2015-04-28 20:46:52 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: remove uneeded unref - The call to _gl_mem_alloc_data will unref and NULLify 'dest' for us. - We just need to return. - https://bugzilla.gnome.org/show_bug.cgi?id=744246 - -2015-04-28 09:37:59 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Use gst_pad_get_pad_template_caps in ::get_caps() - -2015-04-28 20:11:07 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfilterbin.c: - * ext/gl/gstglmixerbin.c: - * ext/gl/gstglsinkbin.c: - * ext/gl/gstgluploadelement.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - glupload: provide the sink template caps that could be used - https://bugzilla.gnome.org/show_bug.cgi?id=746399 - -2015-04-27 19:28:57 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/examples/camerabin2/gst-camera2.c: - * tests/examples/camerabin2/gst-camera2.h: - * tests/examples/camerabin2/gst-camera2.ui: - examples: gst-camera: add zoom property to UI - Add a slider to modify the zoom in camerabin - -2015-04-27 18:33:37 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/examples/camerabin2/gst-camera2.ui: - examples: gst-camera: remove widgets deprecated in GTK3.0 - VBox and HBox are now simply Box - -2015-04-27 15:41:04 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/examples/camerabin2/Makefile.am: - * tests/examples/camerabin2/gst-camera2.c: - * tests/examples/camerabin2/gst-camera2.ui: - examples: gst-camera: update to GTK3 - When opening the .ui file it complains about being for GTK 2 and - automatically updates it to GTK3. Commit this version and update - the makefile - -2015-04-27 13:41:44 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: remove unused code - The structure is created and never used anymore. Remove it. - -2015-04-27 13:24:54 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - wrappercamerabinsrc: use digitalzoom element - Replace videocrop ! videoscale ! capsfilter with the digitalzoom - bin that has the same pipeline internally and already updates - the capsfilter automatically when caps change, removing this code - from wrappercamerabinsrc and making it cleaner. - -2015-04-27 21:14:02 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstdigitalzoom.c: - digitalzoom: change videocrop parameters before passing caps event - Avoids one extra uneeded renegotiation if the elements are already - configured to their final property values when the caps event - goes through. - Also avoids hitting bug https://bugzilla.gnome.org/show_bug.cgi?id=748344 - -2015-04-22 13:06:30 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstdigitalzoom.c: - digitalzoom: also skip internal pipeline in upstream caps query - To avoid going through our capsfilter which would limit the choices. - -2015-04-22 13:05:42 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstdigitalzoom.c: - digitalzoom: prevent assertion when caps is any - -2015-04-21 23:10:05 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/Makefile.am: - * gst/camerabin2/gstdigitalzoom.c: - * gst/camerabin2/gstdigitalzoom.h: - camerabin: digitalzoom: create a bin element for digital zooming - It contains videocrop ! videoscale ! capsfilter and implements digital - zooming. - At this moment, it is a private element of the camerabin plugin. - This will remove some code used in wrappercamerabinsrc to make - code clearer and digitalzoom can potentially be used by other - applications in the future, it has nothing camerabin specific. - -2015-04-27 10:11:41 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - egl: Use maximum bits per color instead of minimum - https://bugzilla.gnome.org/show_bug.cgi?id=748425 - -2015-04-26 20:55:03 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * ext/libde265/libde265-dec.c: - libde265: W32 thread count support - This code is imported from GLib g_get_num_processors(). This function - was added in 2.36 but we depend on 2.32. - https://bugzilla.gnome.org/show_bug.cgi?id=748495 - -2015-04-26 21:00:06 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * ext/libde265/libde265-dec.c: - libde265: Fix format string for gsize - https://bugzilla.gnome.org/show_bug.cgi?id=748496 - -2015-04-26 21:03:45 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * ext/spandsp/gstspanplc.c: - spandsp: Don't use the private field 'missing_samples' - https://bugzilla.gnome.org/show_bug.cgi?id=748497 - -2015-04-27 14:56:06 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: remove unused property enum item - The property enum item has been there since the origin of the element but it - has never been used. Removing it. - -2015-04-27 14:49:59 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/gl/gstglfiltercube.c: - glfiltercube: Don't initialize multiple shaders on renegotiation - -2015-04-27 10:55:13 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/adpcmenc/adpcmenc.c: - * gst/festival/gstfestival.c: - * gst/games/gstpuzzle.c: - * gst/id3tag/gstid3mux.c: - * gst/librfb/gstrfbsrc.c: - * gst/mixmatrix/mixmatrix.c: - * gst/mpeg1sys/gstmpeg1systemencode.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mve/gstmvemux.c: - * gst/onvif/gstrtponviftimestamp.c: - * gst/overlay/gstoverlay.c: - * gst/rtjpeg/gstrtjpegdec.c: - * gst/rtjpeg/gstrtjpegenc.c: - * gst/speed/gstspeed.c: - * gst/stereo/gststereo.c: - * gst/subenc/gstsrtenc.c: - * gst/subenc/gstwebvttenc.c: - * gst/tta/gstttadec.c: - * gst/vbidec/gstvbidec.c: - * gst/vmnc/vmncdec.c: - Rename property enums from ARG_ to PROP_ - Property enum items should be named PROP_ for consistency and readability. - -2015-04-27 10:24:00 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Remove unused stop function - -2015-04-27 16:04:50 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: unref the pool in the correct place - Otherwise we could hold a pool to a context that is never going to be used. - https://bugzilla.gnome.org/show_bug.cgi?id=748405 - -2015-04-27 10:01:53 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/gl/gstgltransformation.c: - gltransformation: Unref shader in ::stop() - -2015-04-27 15:20:56 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglbasefilter.c: - gl: unref display/other-context in the correct place - Otherwise state changes from PLAYING->READY->PAUSED will cause there to - to be no display configured on the element. - https://bugzilla.gnome.org/show_bug.cgi?id=748405 - -2015-04-10 14:08:43 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - codecparsers: h265: add helpers to convert quantization matrices - Add utility functions to convert quantization matrices from zig-zag scan - order into raster scan order and vice-versa - https://bugzilla.gnome.org/show_bug.cgi?id=747613 - -2015-04-10 14:07:56 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparser: h265: skip byte alignment bits while parsing slice header - Skip the byte alignment bits as per the logic of byte_alignment() - provided in hevc specification. This will fix the calculation of - slice header size. - https://bugzilla.gnome.org/show_bug.cgi?id=747613 - -2015-04-10 14:07:35 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparser: h265: Fix the NumDeltaPocs calculation - Always use the equation provided in spec (7-57) for finding - the NumDeltaPocs - https://bugzilla.gnome.org/show_bug.cgi?id=747613 - -2015-04-10 14:04:17 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparser: h265: Fix the NumPocTotalCurr calculation - The NumPocToalCurr should be calculated for all B and P slices. - https://bugzilla.gnome.org/show_bug.cgi?id=747613 - -2015-04-10 13:59:50 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - codecparser: h265: Fix nal size calculation for EOS and EOB - https://bugzilla.gnome.org/show_bug.cgi?id=747613 - -2015-04-26 21:42:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglbumper.c: - * ext/gl/gstglcolorscale.c: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstgloverlay.c: - * ext/gl/gstgltransformation.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - glfilter: De-camelcase onInitFBO() vfunc - -2015-04-26 21:39:06 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglcolorscale.c: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstgloverlay.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - glfilter: Remove onStart/onStop vfuncs, and unused onReset() - onStart/onStop are just duplicates of the basetransform ones, onReset - was never called but was used everywhere when stop should've been used. - -2015-04-21 09:43:58 +0200 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * ext/gl/gstgltransformation.c: - gltransformation: don't initialize multiple shaders on renegotiation - https://bugzilla.gnome.org/show_bug.cgi?id=748407 - * delete shader if one exists - * set it to NULL after unrefing - -2015-04-26 21:11:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglcolorconvertelement.c: - glcolorconvert: Fix compiler warning - gstglcolorconvertelement.c:230:19: error: unused variable 'in_structure' - -Werror,-Wunused-variable - GstStructure *in_structure = gst_caps_get_structure (caps, 0); - ^ - -2015-04-15 01:24:45 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: drop frames we get before we have a clock - https://bugzilla.gnome.org/show_bug.cgi?id=748054 - -2015-04-26 20:33:41 +0200 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbasefilter.c: - glbasefilter: Unref other context in finalize, and display in READY->NULL - https://bugzilla.gnome.org/show_bug.cgi?id=748405 - -2015-04-19 19:16:55 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/gl/gstglcolorconvertelement.c: - glcolorconvert: Keep colorimetry and chroma-site fields if passthrough - https://bugzilla.gnome.org/show_bug.cgi?id=748141 - -2015-04-26 18:04:16 +0100 Tim-Philipp Müller <tim@centricular.com> - - * Android.mk: - * ext/faac/Makefile.am: - * ext/faad/Makefile.am: - * ext/hls/Makefile.am: - * ext/mpg123/Makefile.am: - * ext/smoothstreaming/Makefile.am: - * ext/x265/Makefile.am: - * gst-libs/gst/adaptivedemux/Makefile.am: - * gst-libs/gst/basecamerabinsrc/Makefile.am: - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/insertbin/Makefile.am: - * gst-libs/gst/interfaces/Makefile.am: - * gst-libs/gst/mpegts/Makefile.am: - * gst-libs/gst/uridownloader/Makefile.am: - * gst/adpcmdec/Makefile.am: - * gst/adpcmenc/Makefile.am: - * gst/aiff/Makefile.am: - * gst/asfmux/Makefile.am: - * gst/audiobuffer/Makefile.am: - * gst/audiofxbad/Makefile.am: - * gst/audiovisualizers/Makefile.am: - * gst/autoconvert/Makefile.am: - * gst/bayer/Makefile.am: - * gst/camerabin2/Makefile.am: - * gst/cdxaparse/Makefile.am: - * gst/coloreffects/Makefile.am: - * gst/dataurisrc/Makefile.am: - * gst/debugutils/Makefile.am: - * gst/dvbsuboverlay/Makefile.am: - * gst/dvdspu/Makefile.am: - * gst/festival/Makefile.am: - * gst/freeverb/Makefile.am: - * gst/frei0r/Makefile.am: - * gst/gaudieffects/Makefile.am: - * gst/gdp/Makefile.am: - * gst/geometrictransform/Makefile.am: - * gst/hdvparse/Makefile.am: - * gst/id3tag/Makefile.am: - * gst/inter/Makefile.am: - * gst/interlace/Makefile.am: - * gst/ivfparse/Makefile.am: - * gst/ivtc/Makefile.am: - * gst/jp2kdecimator/Makefile.am: - * gst/jpegformat/Makefile.am: - * gst/librfb/Makefile.am: - * gst/liveadder/Makefile.am: - * gst/midi/Makefile.am: - * gst/mpegdemux/Makefile.am: - * gst/mpegpsmux/Makefile.am: - * gst/mpegtsdemux/Makefile.am: - * gst/mve/Makefile.am: - * gst/mxf/Makefile.am: - * gst/nuvdemux/Makefile.am: - * gst/onvif/Makefile.am: - * gst/patchdetect/Makefile.am: - * gst/pcapparse/Makefile.am: - * gst/pnm/Makefile.am: - * gst/rawparse/Makefile.am: - * gst/rtp/Makefile.am: - * gst/sdi/Makefile.am: - * gst/sdp/Makefile.am: - * gst/segmentclip/Makefile.am: - * gst/siren/Makefile.am: - * gst/smooth/Makefile.am: - * gst/speed/Makefile.am: - * gst/stereo/Makefile.am: - * gst/subenc/Makefile.am: - * gst/tta/Makefile.am: - * gst/videofilters/Makefile.am: - * gst/videomeasure/Makefile.am: - * gst/videoparsers/Makefile.am: - * gst/videosignal/Makefile.am: - * gst/vmnc/Makefile.am: - * gst/y4m/Makefile.am: - * gst/yadif/Makefile.am: - * sys/androidmedia/Makefile.am: - Remove obsolete Android build cruft - This is not needed any longer. - -2015-04-19 00:55:50 +0900 Yujin Lee <saddopop@gmail.com> - - * sys/applemedia/plugin.m: - vtdec: fix build error with clang - This commit fixes a simple build error by clang with - by clang with -Werror,-Wtautological-pointer-compare options. - https://bugzilla.gnome.org/show_bug.cgi?id=748110 - -2015-04-26 19:08:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Only answer the duration query in non-live mode - -2015-04-25 18:50:52 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstdrawhelpers.h: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspacescope.h: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstspectrascope.h: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstsynaescope.h: - * gst/audiovisualizers/gstwavescope.c: - * gst/audiovisualizers/gstwavescope.h: - * gst/audiovisualizers/plugin.c: - audiovisualizer: fix the license from GPL to LGPL - This was a copy'n'paste buf in the initial commit done by myself. - -2015-04-25 18:46:41 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstaudiovisualizer.c: - * gst/audiovisualizers/gstaudiovisualizer.h: - audiovisualizer: fix the license from GPL to LGPL - This was a copy'n'paste buf in the initial commit done by myself. - -2015-04-25 13:38:08 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/examples/opencv/Makefile.am: - * tests/examples/opencv/gst_element_print_properties.c: - * tests/examples/opencv/gst_element_print_properties.h: - * tests/examples/opencv/gstmotioncells_dynamic_test.c: - * tests/examples/opencv/gstmotioncells_dynamic_test.h: - examples: motioncells: remove GPL3 code we don't need - If 95% of the code of an example app consists of GObject - code, maybe that's defeating the point a little. So just - remove a lot of that and trim down the example to the - absolute minimum. Also removes the last remaining GPL3 - licensed code in -bad. - -2015-04-25 12:52:04 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/examples/opencv/gstmotioncells_dynamic_test.c: - examples: motioncells: simplify property setting - -2015-04-25 12:48:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/examples/opencv/gstmotioncells_dynamic_test.c: - examples: motioncells: port to 1.x - -2014-11-20 00:33:44 +0100 Robert Jobbagy <jobbagy.robert@gmail.com> - - * tests/examples/opencv/gstmotioncells_dynamic_test.c: - * tests/examples/opencv/gstmotioncells_dynamic_test.h: - examples: motioncells: relicense opencv example to LGPLv2 - -2015-04-24 14:04:55 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/camerabin.c: - tests: camerabin: add tests for GstPhotography image capture - GstPhotography enables new paths in wrappercamerabinsrc that allows - the source to be notified about the capture caps and provide an - alternative caps if desired bypassing the negotiation (this doesn't - seem like a good idea these days). To make sure it keeps working - until we remove it from the API in favor of standard caps negotiation - features this test was added. - It adds 3 extra tests with a simple test source that will: - 1) Test that capturing with ANY caps work - 2) Test that capturing with a fixed caps work - 3) Test that capturing with a fixed caps and having the source - pick a different resolution from GstPhotography API works - by having wrappercamerabinsrc crop the capture to the final - requested dimensions - -2015-04-24 14:19:50 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - wrappercamerabinsrc: Rework cropping for zoom and dimension reduction - wrappercamerabinsrc has a videocrop element to be used for - zooming and for cropping when input caps is different when used - with the GstPhotography interface. The zooming part needs - the following elements: - capsfilter ! videocrop ! videoscale ! capsfilter - The capsfilters should always have the same caps to ensure the - zooming is done and preserves dimensions, unless when it is needed - to do more cropping due to input dimensions those caps - need to be modified accordingly to preserve the output dimensions. - This, however, makes it hard to get caps negotiation to work properly - as we need to have different caps in the capsfilters to account for - the extra cropping needed. It could be simple for fixed caps but it - gets tricky with unfixed ones. - To solve this, this patch splits the zooming and dimension reduction - cropping into 2 separate videocrop elements. The first one does - the dimension cropping, which is only needed when the GstPhotography - API is used and the source provides a caps that is different than - what is requested, while the second is dedicated to zoom crop only. - The first part of the pipeline goes from: - src ! videoconvert ! capsfilter ! videocrop ! videoscale ! capsfilter - to - src ! videocrop ! videoconvert ! capsfilter ! videocrop ! videoscale ! capsfilter - It might add an extra overhead in the image capture as the image might need - to be cropped twice but this can be solved by enabling videocrop to use - crop metas so only the later one does the real cropping. - It also makes the code a bit simpler. - -2015-04-24 14:17:51 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: remove obsolete comment - This is already handled in another place and doesn't make sense - in the function context anymore - -2015-04-24 14:16:24 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: error out if source fails to prepare for capture - Post an error when preparing the image capture through photography - interface fails - -2015-04-24 14:13:34 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: intersect instead of compare for equality - Intersect is enough to check if the requested caps are compatible - with what the source is going to provide. Equality will be too strict. - -2015-04-24 14:13:16 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: fix typo - -2015-04-24 02:22:54 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/camerabin.c: - camerabin: tests: remove unused macros - Those macros were with the wrong name (likely a copy n paste mistake) - and were unused. - -2015-04-23 14:28:11 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/camerabin.c: - tests: camerabin: remove obsolete check for 0.10 feature - -2015-04-24 16:48:23 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiobuffer/gstaudioringbuffer.c: - * gst/coloreffects/gstchromahold.c: - * gst/debugutils/gstcompare.c: - * gst/gaudieffects/gstgaussblur.c: - * gst/pcapparse/gstpcapparse.c: - * gst/rtp/gstrtph265pay.c: - * gst/sdp/gstsdpdemux.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - remove unused enum items PROP_LAST - This were probably added to the enums due to cargo cult programming and are - unused. - -2015-04-24 17:13:10 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: balance change_state display ref/unref - the display was being unreffed on the incorrect state change causing - invalid state when changing from PLAYING/PAUSED->READY->PAUSED/PLAYING. - -2015-04-23 17:43:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Don't claim to be live when answering the LATENCY query - Even for "live" streams we are not live in the GStreamer meaning of the word. - We don't produce buffers that are timestamped based on their "capture time" - and our clock, but just based on whatever timestamps the stream might contain. - Also even if we wanted to claim to be live, that wouldn't work well as we - would have to return GST_STATE_CHANGE_NO_PREROLL when going from READY to - PAUSED, which we can't. We first need data to know if we are "live" or not. - -2015-04-23 17:39:46 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Use the downloader of the base class instead of creating our own - The one of the base class is completely unused because we override all - the downloading here, so let's just use that one instead. - -2015-04-23 17:36:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Don't error out if we can't match variant playlists after updating - It's better to just select some random variant playlist instead of stopping, - chances are that it's still continuing to work and we might just have to - select a different variant again later. - -2015-04-23 17:33:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Fix how the playlists are refreshed - We should only refresh the currently selected variant playlist (if any, - otherwise the main playlist), not the main playlist. And only try to - refresh the main playlist if updating the variant playlist fails. - Some servers (Wowza) use the request of the main playlist to create a - "session", which is then part of the URI of the variant playlist and - also the fragments. Refreshing the main playlist would generate a new - session, and the server rate limits that usually. And after a few retries - the server just kicks us out. - Also as a side effect we now use the same downloader for all playlists, so - that we only have 2 instead of 3 connections to the server. And also - previously we just ignored the downloaded data from the main playlist that - the base class gave to us. - -2015-04-23 17:22:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/hls/gsthlsdemux.c: - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Allow subclasses to override how a new manifest would be downloaded - -2015-04-23 17:02:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: Expose downloader - This allows subclasses to use it and share connections if possible. - -2015-04-23 16:43:11 +0100 Tim-Philipp Müller <tim@centricular.com> - - * .gitignore: - Update .gitignore - -2015-04-23 16:40:49 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/Makefile.am: - tests: define GST_CHECK_TEST_ENVIRONMENT_BEACON - Make sure the test environment is set up. - https://bugzilla.gnome.org//show_bug.cgi?id=747624 - -2015-04-23 16:39:20 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: bump automake requirement to 1.14 and autoconf to 2.69 - This is only required for builds from git, people can still - build tarballs if they only have older autotools. - https://bugzilla.gnome.org//show_bug.cgi?id=747624 - -2015-04-23 16:47:40 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/gl/gstgluploadelement.c: - glupload: Release glupload buffer when caps are changed - https://bugzilla.gnome.org/show_bug.cgi?id=748371 - -2015-04-23 11:47:37 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstgaussblur.c: - gaudi: don't run gaussian function if sigma is 0 - -2015-04-22 19:28:39 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: handle too short segments - When the segment is very short it might be the case that the - typefinding fails and when finishing the segment hlsdemux would - consider the remaining data (pending_buffer) as an encryption - leftover. - This patch fixes it and makes sure an error is properly posted - if typefind failed by refactoring buffer handling to a function - and using it from the data_received and finish_fragment functions. - -2015-04-22 19:04:43 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: use correct variable type - gst_buffer_resize needs gssize and not gsize. This makes gdb - print it correctly when debugging. - -2015-04-22 17:08:09 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: fix mode autodetection - The autodetection mode was broken because a race condition in the input mode - setting. The mode could be reverted back when it was replaced in - the streaming thread by the old mode in the middle of mode changed callback. - -2015-04-22 17:04:25 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/decklink/gstdecklink.cpp: - decklink: do not repeat first video format in caps template - The first entry in the modes array is used as default mode for autodetection. - There's no need to copy it into the caps template. - -2015-04-22 15:04:03 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstexclusion.c: - gaudi: fix to 30780db1 - The second check for (factor == 0) creeped in the last commit. - Apologies. - -2015-04-22 14:30:56 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstexclusion.c: - gaudi: fix exclusion's factor range - Avoid dividing by zero when the factor is zero. Instead, output a buffer with - all color values as zero. - -2015-04-22 14:15:13 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstsolarize.c: - gaudi: remove floor variable in solarize - Floor variable has no effect and it isn't worth it to have it adjustable. - -2015-04-22 13:55:06 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstburn.h: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstchromium.h: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdilate.h: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstdodge.h: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstexclusion.h: - * gst/gaudieffects/gstsolarize.c: - * gst/gaudieffects/gstsolarize.h: - gaudi: remove unused property - -2015-04-22 18:54:45 +0900 Vineeth T M <vineeth.tm@samsung.com> - - * ext/gl/gstglmixer.c: - glmixer: Possible null pointer dereference - While printing error message when context fails, error variable is not being used anymore - so it will lead to null pointer dereference - https://bugzilla.gnome.org/show_bug.cgi?id=748287 - -2015-04-22 10:38:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * INSTALL: - Remove INSTALL file - autotools automatically generate this, and when using different versions - for autogen.sh there will always be changes to a file tracked by git. - -2015-04-22 10:38:13 +0200 Sebastian Dröge <sebastian@centricular.com> - - * LICENSE_readme: - Remove LICENSE_readme - It's completely outdated and just confusing, better if people are - forced to look at the actual code in question than trusting this file. - -2015-04-21 22:04:56 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Don't stop all tasks and streams from the update task on errors - It will deadlocks as we will then join() the update task from itself. Instead - just post an actual error message on the bus and only stop the update task. - The application is then responsible for shutting down the element, and thus - all the other tasks and everything, based on the error message it gets. - -2015-04-21 18:29:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Fix seeking - We also have to update the current_file GList pointer in the M3U playlist - client, otherwise we are just continuing playback from the current position - instead of seeking. - -2015-04-21 18:05:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Don't call unlock() just to call lock() immediately afterwards - -2015-04-20 08:21:32 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Reset zoom element caps to go to viewfinder mode - Avoids not-negotiated failures related to using image capture caps - still when adjusting to go back to viewfinder. - -2015-04-20 08:20:37 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/camerabin.c: - tests: camerabin: add test for capture with different caps - Adds a test to verify that viewfinder and image capture caps - can be set to non-intersecting caps and still work. - https://bugzilla.gnome.org/show_bug.cgi?id=724868 - -2015-04-20 08:42:56 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: fix leak of drain query - gst_pad_peer_query doesn't take ownership of the query object - -2015-04-20 08:42:48 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - wrappercamerabinsrc: Refactor internal pipeline - Remove tee and output-selector and just link the source - pad to the outputs we want as needed. - The way we need to prioritize caps negotiation and allocation - queries depending on the mode enabled is too custom to be - handled using tee and output-selector. - This provides more flexibility and doesn't get in the way of proper - handling of negotiation and allocation queries. - -2015-04-05 20:18:56 +0200 Michał Dębski <debski.mi.zd@gmail.com> - - * ext/gl/gstgleffects.c: - * ext/gl/gstgleffects.h: - * ext/gl/gstopengl.c: - gleffects: Create element for each effect - https://bugzilla.gnome.org/show_bug.cgi?id=746209 - -2015-03-22 11:22:52 +0100 Michał Dębski <debski.mi.zd@gmail.com> - - * ext/gl/Makefile.am: - * ext/gl/effects/gstgleffectlaplacian.c: - * ext/gl/effects/gstgleffectssources.c: - * ext/gl/effects/gstgleffectssources.h: - * ext/gl/gstgleffects.c: - * ext/gl/gstgleffects.h: - * ext/gl/gstglfilterlaplacian.c: - * ext/gl/gstglfilterlaplacian.h: - * ext/gl/gstopengl.c: - gleffects: Merge laplacian filter into effects - https://bugzilla.gnome.org/show_bug.cgi?id=746209 - -2015-03-22 11:20:49 +0100 Michał Dębski <debski.mi.zd@gmail.com> - - * ext/gl/Makefile.am: - * ext/gl/effects/gstgleffectsobel.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstgleffects.h: - * ext/gl/gstglfiltersobel.c: - * ext/gl/gstglfiltersobel.h: - * ext/gl/gstopengl.c: - gleffects: Merge sobel filter into effects - https://bugzilla.gnome.org/show_bug.cgi?id=746209 - -2015-03-22 11:13:30 +0100 Michał Dębski <debski.mi.zd@gmail.com> - - * ext/gl/Makefile.am: - * ext/gl/effects/gstgleffectblur.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstgleffects.h: - * ext/gl/gstglfilterblur.c: - * ext/gl/gstglfilterblur.h: - * ext/gl/gstopengl.c: - gleffects: Merge blur filter into effects - https://bugzilla.gnome.org/show_bug.cgi?id=746209 - -2015-03-21 23:50:33 +0100 Michał Dębski <debski.mi.zd@gmail.com> - - * ext/gl/effects/gstgleffectglow.c: - * ext/gl/gstglfilterblur.c: - gleffects: Correct attributes for hconv and vconv shaders - Width and height were switched for glow shaders. For blur - filter attributes names were obsolete. - https://bugzilla.gnome.org/show_bug.cgi?id=746209 - -2015-03-21 23:21:13 +0100 Michał Dębski <debski.mi.zd@gmail.com> - - * ext/gl/effects/gstgleffectssources.c: - gleffects: Fix fisheye shader - pass float to sqrt - On OSX passing literal int to sqrt() in GLSL results in error. - https://bugzilla.gnome.org/show_bug.cgi?id=746209 - -2015-04-21 07:28:58 +0200 Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk> - - * ext/gl/gstgltransformation.c: - gltransformation: fix shader memory leak - -2015-04-21 12:25:11 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: track context activation properly - We only need to deactivate/reactivate the context iff it was already - active. - -2015-04-21 12:19:46 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglbasefilter.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - gldisplay: synchronize the searching and creation of GstGLContext's - Ootherwise we could end up with multiple elements in different chains - each creating a context. Fixes context creation with glvideomixer. - -2015-04-20 14:35:19 +0200 Edward Hervey <edward@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Remove dead code - The detection for missing format/alignment is done way before this - codepath is reached (at which point we have already decided of a - format and alignment). - CID #1232800 - -2015-01-07 16:26:57 +0000 Edward Hervey <edward@centricular.com> - - * ext/opencv/gsthanddetect.c: - handdetect: remove unneeded check - Variable hands is already checked to contain a value previously at the beginning - of the current block. There is no need to check again. This is logically dead code. - CID 1197693 - -2015-04-20 14:20:05 +0200 Edward Hervey <edward@centricular.com> - - * sys/shm/shmpipe.c: - shmpipe: Ensure string received from recv() is NULL-terminated - We will be doing string operations on it later. - CID #1292830 - -2015-04-20 11:30:10 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: clean assignment typo - No need to set the value twice. - https://bugzilla.gnome.org/show_bug.cgi?id=745102 - CID #295122 - -2015-04-20 10:57:41 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: remove dead code - position of GstSegment is an unsigned int64, it can never be below zero. - CID #1295123 - -2015-02-09 11:29:46 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst/fieldanalysis/gstfieldanalysis.c: - fieldanalysis: exception when block width to 0 - When block width property is set to 0, exception occurs. - This happens due to divide by zero errors in calculations. - block width property can never be 0. Hence adjusting the minimum value to 1. - https://bugzilla.gnome.org/show_bug.cgi?id=744188 - -2015-04-15 15:22:37 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * ext/gl/gstglmixer.c: - glmixer: fix caps leak in gst_gl_mixer_pad_sink_getcaps() - Caps refcounting was all wrong in this function. Rewrote it and add some - comments to make it clearer. - Fix caps leaks with the - validate.file.glvideomixer.simple.play_15s.synchronized scenario. - https://bugzilla.gnome.org/show_bug.cgi?id=747915 - Signed-off-by: Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - -2015-04-20 17:08:23 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/corevideotexturecache.h: - * sys/applemedia/corevideotexturecache.m: - * sys/applemedia/vtdec.c: - applemedia: avoid implicit color conversions - Rework the GL texture code a little to avoid implicit color conversion inside - AVF/VT on both iOS and OSX. - -2015-04-19 01:15:07 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/corevideotexturecache.m: - corevideotexturecache: free texture cache on iOS - https://bugzilla.gnome.org/show_bug.cgi?id=748122 - -2015-04-19 01:21:40 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: check for failure to create buffer - gst_core_media_buffer_new and gst_core_video_texture_cache_get_gl_buffer - can fail for various platform reasons. - https://bugzilla.gnome.org/show_bug.cgi?id=748122 - -2015-04-19 13:12:05 +0900 Yujin Lee <saddopop@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: fix build failure with clang - Use fabs for floating point input. - https://bugzilla.gnome.org/show_bug.cgi?id=748128 - -2015-04-17 13:57:38 -0600 Olivier Crête <olivier.crete@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Remove unused latency query code - The behavior changes based on the type of segment, - not on the liveness of the source. - -2015-04-17 13:55:26 -0600 Olivier Crête <olivier.crete@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Cleanup latency query handling - The minimum latency is always 0 or more. And we should - requery upstream as it may have changed. - -2014-07-17 10:53:30 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Handle queue/release errors non-fatal - They can happen sometimes as a transient problem, e.g. if there - is a problem in the stream. Only handle them as fatal if many of - them happen in a row. - -2015-04-11 16:53:38 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * ext/opencv/MotionCells.cpp: - * ext/opencv/MotionCells.h: - * ext/opencv/gstcvdilate.c: - * ext/opencv/gstcvdilate.h: - * ext/opencv/gstcvdilateerode.h: - * ext/opencv/gstcvequalizehist.c: - * ext/opencv/gstcvequalizehist.h: - * ext/opencv/gstcverode.c: - * ext/opencv/gstcverode.h: - * ext/opencv/gstcvlaplace.c: - * ext/opencv/gstcvlaplace.h: - * ext/opencv/gstcvsmooth.c: - * ext/opencv/gstcvsmooth.h: - * ext/opencv/gstcvsobel.c: - * ext/opencv/gstcvsobel.h: - * ext/opencv/gstdisparity.h: - * ext/opencv/gstedgedetect.c: - * ext/opencv/gstedgedetect.h: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfaceblur.h: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstfacedetect.h: - * ext/opencv/gstgrabcut.cpp: - * ext/opencv/gstgrabcut.h: - * ext/opencv/gsthanddetect.c: - * ext/opencv/gsthanddetect.h: - * ext/opencv/gstmotioncells.h: - * ext/opencv/gstopencvutils.c: - * ext/opencv/gstopencvutils.h: - * ext/opencv/gstopencvvideofilter.h: - * ext/opencv/gstpyramidsegment.h: - * ext/opencv/gstretinex.c: - * ext/opencv/gstretinex.h: - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstsegmentation.h: - * ext/opencv/gstskindetect.c: - * ext/opencv/gstskindetect.h: - * ext/opencv/gsttemplatematch.c: - * ext/opencv/gsttemplatematch.h: - * ext/opencv/gsttextoverlay.h: - opencv: Change opencv plugin to use opencv2-style includes - If old opencv1-style legacy include directory is available, - this change becomes purely cosmetic (maybe will compile a bit faster). - It becomes an FTBFS fix when opencv1-style include directory is missing - (possibly because opencv package maintainer decided not to pack it). - https://bugzilla.gnome.org/show_bug.cgi?id=747705 - -2015-04-12 00:56:48 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - opencv: Change configure test to check for OpenCV2 headers - * Checks for opencv2 headers only, not for legacy opencv1 headers - * Checks for every opencv2 header that the implementation needs, - not just highgui_c.h - https://bugzilla.gnome.org/show_bug.cgi?id=725163 - -2015-04-17 05:12:10 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: get connection and input clock early - -2015-04-17 15:32:56 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Unify debug statements - Use 0x%04x for PIDs - -2015-04-17 15:30:29 +0200 Edward Hervey <edward@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Unify duration querying code - And properly use it in the SEEKING query. - Fixes seeking with gst-play - -2015-04-16 14:17:04 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: fix caps leak when early returning - https://bugzilla.gnome.org/show_bug.cgi?id=747993 - Signed-off-by: Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - -2015-04-16 14:21:16 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * ext/gl/gstglmixer.c: - glmixer: unref owned caps when finalizing the mixer - Fix a caps leak with the - validate.file.glvideomixer.simple.play_15s.synchronized scenario. - https://bugzilla.gnome.org/show_bug.cgi?id=747915 - Signed-off-by: Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - -2015-04-15 15:16:33 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * ext/gl/gstglmixer.c: - glmixer: pass the proper free function to frames and buffers array - 'array_buffers' contain borrowed GstBuffer and so shouldn't have a free - function. 'frames' is the one containing GstGLMixerFrameData and so should use - _free_glmixer_frame_data as free function. - Fix GstGLMixerFrameData leaks with the - validate.file.glvideomixer.simple.play_15s.synchronized scenario. - https://bugzilla.gnome.org/show_bug.cgi?id=747913 - Signed-off-by: Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - -2015-04-17 15:20:12 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstgldownloadelement.c: - gldownloadelement: Download *from* OpenGL, not into - -2015-04-17 09:24:12 +0200 Robert Swain <robert.swain@ericsson.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Add complexity property for speed/quality tradeoff - -2015-04-17 14:24:28 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - glcontext: Make gst_gl_context_egl_activate fail if the old surface could not be destroyed - https://bugzilla.gnome.org/show_bug.cgi?id=746251 - -2015-04-17 10:38:16 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/gl/gstgluploadelement.c: - gluploadelement: Unref GstGLUpload object and caps in ::stop() - Fix leak of the GstGLUpload object. - https://bugzilla.gnome.org/show_bug.cgi?id=748033 - -2015-04-17 14:09:47 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglfilterbin.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstglsinkbin.c: - * ext/gl/gstglsrcbin.c: - gl: Remove some empty ::finalize() implementations - -2015-04-17 14:06:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstgldownloadelement.c: - gldownloadelement: Fix element description - -2015-04-17 14:05:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstgldownloadelement.c: - gldownloadelement: Remove unused ::finalize() implementation - -2015-04-17 14:03:21 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglcolorconvertelement.c: - glcolorconvertelement: Also unref caps in ::stop() already - They are not useful anymore afterwards, so keeping them until ::finalize() - might only cause someone to use them later and then fail. - -2015-04-15 14:49:02 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * ext/gl/gstglcolorconvertelement.c: - glcolorconvertelement: fix GstGLColorConvert leak - convert->convert was never unreffed. - This can be reproduce with the - validate.file.glvideomixer.simple.play_15s.synchronized scenario. - https://bugzilla.gnome.org/show_bug.cgi?id=747911 - -2015-04-16 22:43:54 +1000 Jan Schmidt <jan@centricular.com> - - * ext/apexsink/gstapexraop.c: - apexsink: Fix buffer overflow, in case anyone ever ports it. - Fix a simple buffer overflow - 16 bytes isn't enough to hold - the string representation of a gulong on x86_64. I guess the - intent was to generate a 32 bit random key, so let's do that. - Only matters if anyone ever ports the sink to 1.x - https://bugzilla.gnome.org/show_bug.cgi?id=676524 - -2015-04-16 13:35:00 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: fix pad leak when not adding a new pad after no-more-pads - -2015-04-09 17:35:55 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: fix segment position tracking for the general case - Different streams can have different PTS/DTS bases, and some - streams may not even have DTS. - https://bugzilla.gnome.org/show_bug.cgi?id=745102 - -2015-04-16 10:42:45 +0200 Matthieu Bouron <matthieu.bouron@gmail.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - glcontext: Make gst_gl_context_egl_activate fail if the surface could not be created - Also add some error logging. - -2015-04-15 21:07:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Don't unref buffer that was unreffed just a few lines before already - -2015-04-11 04:20:43 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * docs/libs/Makefile.am: - Add adaptivedemux, badvideo and badbase to the link-list for the docscanner - https://bugzilla.gnome.org/show_bug.cgi?id=747697 - -2015-04-12 01:58:31 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: remove unused variables - Complement commit 5496fd3e75e65a4e387715d0ba0740790aefa5f6 by removing - the involved variables. - -2015-04-14 20:33:25 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: fix GL negotiation - -2015-04-14 18:05:31 +1000 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: log timestamps - -2015-04-13 11:55:42 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: subtract time spent in AVF queues - The time spent in AVF queues was being incorrectly added to running time - rather than subtracted. - -2015-04-11 07:38:57 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: fix GL texture negotiation - GST_VIDEO_GL_TEXTURE_UPLOAD_META_API_TYPE should no longer be used. - Instead, just get the GL context. - https://bugzilla.gnome.org/show_bug.cgi?id=747352 - -2015-04-13 19:40:31 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsdec.c: - dtlsdec: Fix typo - -2015-04-13 19:40:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlssrtpdec.c: - dtlssrtpdec: Add some more debug output - -2015-04-13 19:40:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Add some more debug output - -2015-04-10 09:34:01 +0900 Yujin Lee <saddopop@gmail.com> - - * ext/dash/gstdashdemux.c: - dashdemux: enable playback of content with text streams - There is a playback error when trying to play a content that - has 'application' mimeType. This commit prevents an exception from - setup text streams. - https://bugzilla.gnome.org/show_bug.cgi?id=747525 - -2015-04-12 13:01:56 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/winks/gstksvideosrc.c: - winks: Reset DTS to GST_CLOCK_TIME_NONE - Otherwise we might get a previous DTS set from a recycled buffer that we get - back from a buffer pool, which then confuses synchronization. - https://bugzilla.gnome.org/show_bug.cgi?id=747722 - -2015-03-28 15:44:43 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - amc: Use new JNI utils almost everywhere - -2015-03-28 15:48:28 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - amc: Allow creating global and local references of objects - -2015-03-28 15:21:02 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - amc: Make GError argument order more consistent - -2015-03-28 15:08:15 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - amc: Add helper function for getting a direct buffer array - -2015-03-28 15:08:02 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - amc: Java longs are gint64s - -2015-03-28 14:31:41 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - amc: Improve JNI utilities and add some missing ones - We now fill GErrors for everything that could throw an exception, and method - calls now always return a gboolean and their value in an out-parameter to - distinguish failures from other values. - -2015-04-11 19:35:48 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: Fix last commit - -2015-04-11 19:17:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglmemory.c: - gl: Remove iOS/EAGL workaround for R/RG textures - This should be unneeded now after https://bugzilla.gnome.org/show_bug.cgi?id=732507 - -2015-04-11 19:14:34 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: Add correct check for RG/R textures in glcolorconvert too - https://bugzilla.gnome.org/show_bug.cgi?id=732507 - -2015-04-11 12:12:57 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/winks/ksvideohelpers.c: - winks: fix debug message parameter format - The first part of the GUID structure is a DWORD - which is defined as an unsigned long, so we need - to either cast or use %08lx. - -2015-04-10 20:25:49 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/pcapparse/gstpcapparse.c: - * gst/pcapparse/gstpcapparse.h: - pcapparse: Take buffer directly from the adapter - No need to make a copy into a new buffer, just take the data - from the adapter. - -2015-04-10 20:15:52 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: Produce GstBufferList - -2015-04-10 16:23:25 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - wrappercamerabinsrc: remove unused attribute and related pad probe - The variable was never set to true and can be removed along - with the probe in which it used to act - -2015-03-31 17:10:45 +0100 Anton Obzhirov <obzhirov@yahoo.co.uk> - - * gst-libs/gst/gl/gstglbasefilter.c: - glbasefilter: avoid segfault when gl platform is not available - https://bugzilla.gnome.org/show_bug.cgi?id=747124 - -2015-04-09 16:20:44 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * tests/check/elements/audiomixer.c: - tests: fix type mismatch in varargs passing - A bitmask is 64 bits, but integer immediates are passed as int - in varargs, which happen to be 32 bit with high probability. - This triggered a valgrind jump-relies-on-uninitalized-value - report well away from the site, since it doesn't trigger on - stack accesses, and there must have been enough zeroes to stop - g_object_set at the right place. - -2014-08-20 13:46:12 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: handle seeks with no target (ie, keep current position) - Such seeks are used to change playback rate and we do not want - to alter the position in that case, so we bypass the flush/seek - logic, and set things up so a new segment is scheduled to be - regenerated. - https://bugzilla.gnome.org/show_bug.cgi?id=735100 - -2015-03-26 13:46:16 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/mpegtsparse.h: - tsparse: fix timestamps not updating after a PMT change - The PCRs stay locked onto the same PID as before the change, - but the relevant PID has no reason to be the same after it. - https://bugzilla.gnome.org/show_bug.cgi?id=745102 - -2015-03-24 12:56:53 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: send new segment when a stream is added - This will happen when the PMT changes, replacing streams with - new ones. In that case, we need to accumulate the running time - from the previous chain in the segment base. - https://bugzilla.gnome.org/show_bug.cgi?id=745102 - -2015-03-09 09:56:38 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: keep track of current position - This allows seeking to correctly set the base on the segment. - https://bugzilla.gnome.org/show_bug.cgi?id=745102 - -2015-04-09 15:41:57 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/check/Makefile.am: - check: Don't run the state change test on the dtls elements - There isn't really any way to test the elements standalone. - -2015-04-08 19:29:40 -0700 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Remove broken timestamps-going-backwards check - This would've also triggered if for some reason the segment was updated - in such a way that PTS went backwards, but the running time increased. Like - what happens when non-flushing seeks are done. - We're doing a proper buffer-from-the-past check a few lines below based on the - running time, which is the only time we should care about here. - -2015-04-08 18:51:50 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/winks/gstksvideodevice.c: - * sys/winks/ksvideohelpers.c: - * sys/winks/ksvideohelpers.h: - ksvideosrc: fix support for DV devices - -2015-02-10 13:32:00 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/winks/kshelpers.c: - ksvideosrc: only list capture devices - -2015-04-08 16:46:11 +0200 Edward Hervey <edward@centricular.com> - - * common: - * tests/check/Makefile.am: - tests: Use AM_TESTS_ENVIRONMENT - Needed by the new automake test runner - -2015-04-08 10:52:17 +0530 Arun Raghavan <arun@centricular.com> - - * sys/opensles/openslessink.c: - * sys/opensles/openslessrc.c: - opensles: Explicitly specify layout=interleaved in caps - This is fine to hard-code. Section 9.1.8 of the OpenSL ES 1.1 - specification, it is expected that multi-channel audio is always - interleaved. - -2015-04-07 15:57:30 +0200 Edward Hervey <edward@centricular.com> - - * configure.ac: - configure: Depend on openh264 >= 1.3.0 - Required for the version check header, as agreed upon on IRC - -2015-04-05 05:37:09 +0300 Ilya Konstantinov <ilya.konstantinov@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: fix setting of buffer offset end - Don't set offset end to random values off the stack. - https://bugzilla.gnome.org/show_bug.cgi?id=747352 - -2015-04-07 11:09:38 +0200 Edward Hervey <edward@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - open264: Fix GType/gsize usage - gstopenh264enc.cpp:108:7: warning: dereferencing type-punned pointer will break strict-aliasing rules -Wstrict-aliasing - -2015-04-07 11:21:55 +0200 Edward Hervey <edward@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264: Detect 1.4 API change - As mentionned in release notes : Added new Sps/Pps strategies for real-time - video (replace the old setting variable 'bEnableSpsPpsIdAddition' with - 'eSpsPpsIdStrategy') - -2015-04-06 20:28:22 -0700 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Disconnect mouse/key event signal handlers from window when shutting down context - -2015-04-06 20:24:06 -0700 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Guard against disconnecting invalid signal ids - -2015-03-26 11:52:33 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/mxf/mxfdemux.c: - mxfdemux: fix memory leak - Reset the internal segment before freeing it. - mxf_index_table_segment_parse() allocates data inside the segment - (like segment->delta_entries) which have to be freed using - mxf_index_table_segment_reset(). - https://bugzilla.gnome.org/show_bug.cgi?id=746803 - -2015-04-04 10:56:56 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlssink.c: - hlssink: write the playlist end marker on EOS - Catch EOS from the multifilesink and add the endlist marker to - the playlist when it happens - https://bugzilla.gnome.org/show_bug.cgi?id=747319 - -2015-03-29 17:53:23 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: document gap handling behavior - https://bugzilla.gnome.org/show_bug.cgi?id=746249 - -2015-03-27 19:36:42 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: drop stale white space at warning - -2015-03-27 19:28:05 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * tests/check/libs/aggregator.c: - aggregator: fix typo in test suite - -2015-03-27 18:32:27 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * tests/check/libs/aggregator.c: - aggregator: add gap event handling unit test - https://bugzilla.gnome.org/show_bug.cgi?id=746249 - -2015-03-17 22:13:06 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: implement gap handling - https://bugzilla.gnome.org/show_bug.cgi?id=746249 - -2015-04-03 18:57:58 +0100 Tim-Philipp Müller <tim@centricular.com> - - * autogen.sh: - * common: - Automatic update of common submodule - From bc76a8b to c8fb372 - -2015-04-03 11:46:12 +0530 Arun Raghavan <arun@centricular.com> - - * ext/opus/gstopusenc.c: - opus: Fix incorrect fall-through condition in property getter - -2012-04-27 18:29:14 +0200 Guillaume Emont <guijemont@igalia.com> - - * sys/shm/gstshmsrc.c: - * sys/shm/shmpipe.c: - * sys/shm/shmpipe.h: - shmsink: add an shm-area-name property - The shm-area-property tells the name of the shm area used by the element. This - is useful for cases where shmsink is not able to clean up (calling - shm_unlink()), e.g. if it is in a sandbox. - https://bugzilla.gnome.org/show_bug.cgi?id=675134 - -2015-04-01 22:10:11 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Unify downstream flow return and flushing - Also means that having a non-OK downstream flow return - wakes up the chain functions. - https://bugzilla.gnome.org/show_bug.cgi?id=747220 - -2015-04-01 21:45:01 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Flushing is always in pad lock, no need to atomics - The usage of atomics was always doubtful as it was used to release a - GCond - https://bugzilla.gnome.org/show_bug.cgi?id=747220 - -2015-04-01 21:38:11 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Reset pending_eos on pad flush - https://bugzilla.gnome.org/show_bug.cgi?id=747220 - -2015-04-01 21:37:25 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Unify code to set a pad flushing - https://bugzilla.gnome.org/show_bug.cgi?id=747220 - -2015-04-02 18:05:55 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.h: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - libgstgl: fix rendering on iOS - Stop assuming that the handle has been set by the time ->create_context is - called. After bc7a7259f357b0065dd94e0668b5a895d83fa53a set_window_handle always - happens after ->create_context in fact. - See also https://bugzilla.gnome.org/show_bug.cgi?id=745090 - -2015-03-06 21:12:52 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * gst-libs/gst/video/gstvideoaggregator.c: - aggregator: Query latency on first incoming buffer. - And keep on querying upstream until we get a reply. - Also, the _get_latency_unlocked() method required being calld - with a private lock, so removed the _unlocked() variant from the API. - And it now returns GST_CLOCK_TIME_NONE when the element is not live as - we think that 0 upstream latency is possible. - https://bugzilla.gnome.org/show_bug.cgi?id=745768 - -2015-04-01 20:32:41 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudiomixer.c: - * tests/check/elements/audiomixer.c: - audiomixer: Allow downstream caps with a non-default channel-mask - Instead of failing, take the downstream channel mask if the channel - count is 1. - -2015-03-31 16:27:00 +0200 Edward Hervey <edward@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: Don't use context if not present - Avoids assertions at runtime - -2015-03-31 11:24:57 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/insertbin/Makefile.am: - * gst-libs/gst/mpegts/Makefile.am: - introspection: Don't use g-ir-scanner cache at compile time - It pollutes user directories and we don't need to cache it - https://bugzilla.gnome.org/show_bug.cgi?id=747095 - -2015-03-31 10:53:55 +0100 Victor Toso <victortoso@redhat.com> - - * configure.ac: - * sys/directsound/Makefile.am: - * sys/directsound/gstdirectsoundsrc.c: - * sys/directsound/gstdirectsoundsrc.h: - directsoundsrc: Implement volume and mute - Using the MixerAPI as IDirectSoundCaptureBuffer doesn't implement volume - control. - https://bugzilla.gnome.org/show_bug.cgi?id=744383 - -2015-03-30 13:49:01 +0100 Anton Obzhirov <obzhirov@yahoo.co.uk> - - * ext/gl/Makefile.am: - * ext/gl/effects/gstgleffectbulge.c: - * ext/gl/effects/gstgleffectfisheye.c: - * ext/gl/effects/gstgleffectglow.c: - * ext/gl/effects/gstgleffectidentity.c: - * ext/gl/effects/gstgleffectlumatocurve.c: - * ext/gl/effects/gstgleffectmirror.c: - * ext/gl/effects/gstgleffectrgbtocurve.c: - * ext/gl/effects/gstgleffectsin.c: - * ext/gl/effects/gstgleffectsquare.c: - * ext/gl/effects/gstgleffectsqueeze.c: - * ext/gl/effects/gstgleffectssources.c: - * ext/gl/effects/gstgleffectssources.h: - * ext/gl/effects/gstgleffectstretch.c: - * ext/gl/effects/gstgleffecttunnel.c: - * ext/gl/effects/gstgleffecttwirl.c: - * ext/gl/effects/gstgleffectxray.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstgleffects.h: - * ext/gl/gstglfilterblur.c: - * ext/gl/gstglfiltersobel.c: - gleffects: port all effects to GLES2.0 - https://bugzilla.gnome.org/show_bug.cgi?id=745955 - -2015-03-28 11:40:14 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlssink.c: - hlssink: implement a chain_list to request key unit for segments - upstream might send buffer lists instead of buffers and hlssink's - probe won't get called and a new segment won't be created when needed. - This patch fixes it by adding a chain_list function to the sink pad - that will just pass through the whole bufferlist if no segment needs - to be requested at the moment or convert the list into buffers to - check the proper timestamp to request the next key-unit that will - start the segment. - https://bugzilla.gnome.org/show_bug.cgi?id=746906 - -2015-03-28 17:28:34 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst/mxf/mxfdemux.c: - mxfdemux: resurrect some flow return handling - https://bugzilla.gnome.org/show_bug.cgi?id=744572 - -2015-03-28 17:28:26 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: resurrect some flow return handling - https://bugzilla.gnome.org/show_bug.cgi?id=744572 - -2015-03-27 00:27:34 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: do not try to advance fragment if there is none - It might return OK from subclasses and it could cause a bitrate - renegotiation. For DASH and MSS that is ok as they won't expose - new pads as part of this but it can cause issues for HLS as - it will expose new pads, leading to pads that will only have EOS - that cause decodebin to fail - https://bugzilla.gnome.org/show_bug.cgi?id=745905 - -2015-03-24 13:57:54 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/opus/gstrtpopuspay.c: - rtpopuspay: Forward stereo preferences from caps upstream - https://bugzilla.gnome.org/show_bug.cgi?id=746617 - -2015-03-24 13:56:21 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/opus/gstrtpopuspay.c: - rtpopuspay: Set the number of channels to 2 as per RFC draft - https://bugzilla.gnome.org/show_bug.cgi?id=746617 - -2015-03-17 21:49:40 +0800 Jun Xie <xixi10111011@gmail.com> - - * ext/dash/gstmpdparser.c: - dashdemux: set default @startNumber and also avoid wrong overwrite - Set default @startNumber to 1, if @startNumber is missing at all level. - Also avoid incorrect overwriting inherited value. - https://bugzilla.gnome.org/show_bug.cgi?id=746347 - -2015-03-24 16:18:22 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: check sink caps are valid - -2015-03-24 16:17:00 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiomixer/gstaudioaggregator.c: - Revert "audioaggregator: check sink caps are valid" - This reverts commit 6d4d0d1cdf7c7531fbf72ce39e1eab1260d20550. - Never put code with side effects into an assertion, it can be compiled out - -2015-03-24 15:45:25 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: check sink caps are valid - CID #1291622 - -2015-03-24 15:13:52 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/opus/gstopusenc.c: - opusenc: fall through switch statement - Adding a comment makes coverity happy and quells the issue. - CID 1291629 - -2015-03-24 19:05:00 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/video/gstvideoaggregatorpad.h: - videoaggregator: Document why buffer_vinfo is needed - -2015-03-24 19:04:26 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Check if there's a previous buffer to 'keep' - If we want to keep a previous buffer but there's no previous buffer, we actually - need more data instead. - -2015-03-23 16:43:01 +0100 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - gl/dispmanx: surfaceless EGL context support - Show the DispmanX window only if there's no shared external GL context - set up. When a window is required by the context a transparent - DispmanX element is created and later on made visible by the ::show - method. - https://bugzilla.gnome.org/show_bug.cgi?id=746632 - -2015-03-23 15:09:33 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstsolarize.c: - gaudieffects: clean solarize code - -2015-03-23 14:39:56 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstsolarize.c: - gaudieffects: removing values only used once - -2015-03-23 11:13:24 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstburn.h: - * gst/gaudieffects/gstdilate.h: - * gst/gaudieffects/gstdodge.h: - * gst/gaudieffects/gstexclusion.h: - * gst/gaudieffects/gstsolarize.h: - gaudieffects: small cleanup in headers - -2015-03-23 13:15:30 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusenc.c: - opusenc: Set output format immediately after creating the encoder instance - We know the caps by then, there's no need to wait until we actually receive - the first buffer. - -2015-03-23 13:13:35 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - opusenc: Remove another unused variable - -2015-03-23 13:11:42 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - * ext/opus/gstopusheader.c: - opusenc: Remove useless headers and header_sent variables from the instance struct - They are only used inside a single function. - -2015-03-23 12:24:55 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstrtpopusdepay.c: - * ext/opus/gstrtpopuspay.c: - opus: Handle sprop-stereo and sprop-maxcapturerate RTP caps fields - https://bugzilla.gnome.org/show_bug.cgi?id=746617 - -2015-03-23 12:09:25 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusdec.c: - opusdec: Take channels and sample rate from the caps if we have no stream header - -2015-03-23 12:07:52 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusdec.c: - opusdec: Reset the decoder if the caps change - -2015-03-23 11:57:09 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusdec.c: - opusdec: Take output sample rate from the stream headers too - This way we let opusdec do the resampling if needed and don't carry - around buffers with a too high sample rate if not required. - While Opus always uses 48kHz internally, this information from the - header specifies which frequencies are safe to drop. - -2015-03-23 11:56:09 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusheader.c: - opusheader: Put number of channels and sample rate into the caps - https://bugzilla.gnome.org/show_bug.cgi?id=746617 - -2015-03-22 19:12:15 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: remove unused gl_thread field - -2015-03-22 19:03:19 +0100 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: fix GThread leak - https://bugzilla.gnome.org/show_bug.cgi?id=746541 - -2015-03-20 18:33:45 +0100 Nicola Murino <nicola.murino@gmail.com> - - * ext/gl/gstglimagesink.c: - glimagesink: fix caps leak - https://bugzilla.gnome.org/show_bug.cgi?id=746541 - -2015-03-18 11:25:42 +0100 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Add support for buffer list - https://bugzilla.gnome.org/show_bug.cgi?id=746387 - -2015-03-19 16:17:58 +0100 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: Do not drop all buffers in buffer list if one fails - https://bugzilla.gnome.org/show_bug.cgi?id=746387 - -2015-03-19 13:59:42 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstdilate.c: - gaudieffects: update copyright dates of dilate - -2015-03-19 13:58:21 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstdilate.c: - gaudieffects: factorize transform code of dilate - -2015-03-19 14:04:28 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - dtls: Pass the connection instance as data to the thread pool - No need to ref/unref the connection every time we push something on the pool. - However we have to provide non-NULL data to the pool, so let's just give it - some coffee. - -2015-03-19 13:55:53 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - dtls: Remove unused thread struct field - -2015-03-19 13:30:00 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - * ext/dtls/gstdtlsconnection.h: - * ext/dtls/gstdtlsenc.c: - dtls: Use a shared thread pool for the timeouts - This way we will share threads with other DTLS connections if possible, and - don't have to start/stop threads for timeouts if there are many to be handled - in a short period of time. - Also use the system clock and async waiting on it for scheduling the timeouts. - -2015-03-18 18:17:39 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - dtls: Shutdown timeout thread when it's not needed - It is not needed most of the time and usually we have a thread - idling around doing nothing all the time after the first few seconds. - -2015-03-18 10:12:49 -0700 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglupload.c: - gl/docs: update some doc comments - -2015-03-18 17:40:47 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsenc.c: - dtlsenc: Clear the queue when deactivating the pad - -2015-03-18 17:38:35 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsenc.c: - * ext/dtls/gstdtlsenc.h: - dtlsenc: Handle pad activity states properly - -2015-03-18 17:35:12 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsenc.c: - dtlsenc: Don't manually activate/deactivate srcpad - -2015-03-18 10:47:15 +0100 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Separate buffer encoding functionality into a different function - https://bugzilla.gnome.org/show_bug.cgi?id=746387 - -2015-03-18 10:16:41 +0100 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: Add support for buffer list - https://bugzilla.gnome.org/show_bug.cgi?id=746387 - -2015-03-18 09:39:49 +0100 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: Add missing locks - https://bugzilla.gnome.org/show_bug.cgi?id=746387 - -2015-03-18 09:17:31 +0100 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: Split chain functionality so it can be reused for buffer list - https://bugzilla.gnome.org/show_bug.cgi?id=746387 - -2015-03-18 13:52:38 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsenc.c: - * ext/dtls/gstdtlsenc.h: - dtlsenc: Use a GQueue instead of a GPtrArray - Using a GPtrArray as a queue is not very efficient as the whole - array has to be copied whenever an element is removed from the - beginning. - -2015-03-18 10:06:47 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsdec.c: - dtlsdec: Fix locking - Especially don't hold any mutex while adding/removing pads or pushing data. - -2015-03-18 09:57:32 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsdec.c: - dtlsdec: Add support for buffer lists - -2015-03-18 09:46:40 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - * ext/dtls/gstdtlsconnection.h: - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlsdec.h: - * ext/dtls/gstdtlsenc.c: - * ext/dtls/gstdtlsenc.h: - * ext/dtls/gstdtlssrtpdec.c: - * ext/dtls/gstdtlssrtpenc.c: - * ext/dtls/gstdtlssrtpenc.h: - dtls: Fix some search & replace mistakes from renaming the elements - -2015-03-17 16:49:54 +0100 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: Improve memory management on chain function - Avoiding copy the buffer twice, one while mapping and other with mencpy - https://bugzilla.gnome.org/show_bug.cgi?id=746356 - -2015-03-17 16:50:41 +0100 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: Fix typo in log - -2015-03-17 11:43:00 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsagent.c: - dtls: Initialize debug category earlier - Otherwise the openssl initialization will use it before initialization - -2014-11-13 20:39:11 -0500 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/audiointerleave.c: - audiointerleave: Add unit tests - Almost a copy of the "interleave" unit tests, improved to support - the thread on the src pad on GstAggregator. - https://bugzilla.gnome.org/show_bug.cgi?id=740236 - -2015-03-06 13:49:48 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudiointerleave.c: - * gst/audiomixer/gstaudiointerleave.h: - audiointerleave: Set src caps in aggregate - This prevents races between the setcaps of the sink pads - https://bugzilla.gnome.org/show_bug.cgi?id=740236 - -2014-11-13 15:40:15 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/Makefile.am: - * gst/audiomixer/gstaudiointerleave.c: - * gst/audiomixer/gstaudiointerleave.h: - * gst/audiomixer/gstaudiomixer.c: - audiointerleave: Add interleave element based on audioaggregator - https://bugzilla.gnome.org/show_bug.cgi?id=740236 - -2015-03-06 16:51:12 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: Print a message when a buffer is late - https://bugzilla.gnome.org/show_bug.cgi?id=740236 - -2014-11-15 17:54:51 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudioaggregator.c: - audioaggregator: Don't re-send the caps if they did not change - https://bugzilla.gnome.org/show_bug.cgi?id=740236 - -2014-11-06 17:15:17 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/Makefile.am: - * gst/audiomixer/gstaudioaggregator.c: - * gst/audiomixer/gstaudioaggregator.h: - * gst/audiomixer/gstaudiomixer.c: - * gst/audiomixer/gstaudiomixer.h: - audioaggregator: Split base class from audiomixer - Also: - - Don't modify size on early buffer - The size is the size of the buffer, not of remaining part. - - Use the input caps when manipulating the input buffer - Also store in in the sink pad - - Reply to the position query in bytes too - - Put GAP flag on output if all inputs are GAP data - - Only try to clip buffer if the incoming segment is in time or samples - - Use incoming segment with incoming timestamp - Handle non-time segments and NONE timestamps - - Don't reset the position when pushing out new caps - - Make a number of member variables private - - Correctly handle case where no pad has a buffer - If none of the pads have buffers that can be handled, don't claim to be EOS. - - Ensure proper locking - - Only support time segments - https://bugzilla.gnome.org/show_bug.cgi?id=740236 - -2015-03-07 22:08:40 -0500 Olivier Crête <olivier.crete@ocrete.ca> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Release pad object lock before dropping buffer - Otherwise, the locking order is violated and deadlocks happen. - https://bugzilla.gnome.org/show_bug.cgi?id=745768 - -2015-03-06 20:22:13 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Only ignore pads with no buffers on timeout - When the timeout is reached, only ignore pads with no buffers, iterate - over the other pads until all buffers have been read. This is important - in the cases where the input buffers are smaller than the output buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=745768 - -2015-03-06 21:12:13 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Be more aggressive with invalid replies to our latency query - https://bugzilla.gnome.org/show_bug.cgi?id=745768 - -2015-03-06 20:25:03 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Only advance by the buffer size when a buffer is late - https://bugzilla.gnome.org/show_bug.cgi?id=745768 - -2015-03-16 17:49:58 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/dtls/gstdtlsagent.c: - * ext/dtls/gstdtlscertificate.c: - * ext/dtls/gstdtlsconnection.c: - dtls: make sure we actually log into the right debug category - GST_DTLS_USE_GST_LOG is not defined anywhere, so - we'd just log into the default category by accident. - We use the gst logging system unconditionally now, - so might just as well remove this #if #else. - -2015-03-16 17:36:49 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/dtls/gstdtlsagent.c: - * ext/dtls/gstdtlsconnection.c: - dtls: fix some more compiler warnings - gcc-4.9.2: - gstdtlsagent.c:114:1: error: old-style function definition - gstdtlsconnection.c:253:3: error: ISO C90 forbids mixed declarations and code - gstdtlsconnection.c:291:3: error: ISO C90 forbids mixed declarations and code - gstdtlsconnection.c:391:3: error: ISO C90 forbids mixed declarations and code - gstdtlsconnection.c:434:3: error: ISO C90 forbids mixed declarations and code - gstdtlsconnection.c:773:1: error: 'BIO_s_gst_dtls_connection' was used with no prototype before its definition - gstdtlsconnection.c:773:1: error: old-style function definition - -2015-03-16 17:53:11 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/Makefile.am: - * ext/dtls/gstdtlsagent.c: - * ext/dtls/gstdtlscertificate.c: - * ext/dtls/gstdtlscommon.h: - * ext/dtls/gstdtlsconnection.c: - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlssrtpdec.c: - dtls: Unconditionally use GStreamer debug log system - -2015-03-16 17:48:43 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsagent.c: - * ext/dtls/gstdtlsagent.h: - * ext/dtls/gstdtlscertificate.c: - * ext/dtls/gstdtlscertificate.h: - * ext/dtls/gstdtlscommon.h: - * ext/dtls/gstdtlsconnection.c: - * ext/dtls/gstdtlsconnection.h: - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlsdec.h: - * ext/dtls/gstdtlsenc.c: - * ext/dtls/gstdtlsenc.h: - * ext/dtls/gstdtlssrtpbin.c: - * ext/dtls/gstdtlssrtpbin.h: - * ext/dtls/gstdtlssrtpdec.c: - * ext/dtls/gstdtlssrtpdec.h: - * ext/dtls/gstdtlssrtpdemux.c: - * ext/dtls/gstdtlssrtpdemux.h: - * ext/dtls/gstdtlssrtpenc.c: - * ext/dtls/gstdtlssrtpenc.h: - * ext/dtls/plugin.c: - dtls: Re-namespace from Er to Gst - -2015-03-16 17:35:29 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsconnection.c: - dtls: Fix some compiler warnings - gstdtlsconnection.c:128:32: error: passing 'const char 30' to parameter of type 'void *' - discards qualifiers -Werror,-Wincompatible-pointer-types-discards-qualifiers - SSL_get_ex_new_index (0, "gstdtlsagent connection index", NULL, NULL, - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - /usr/include/openssl/ssl.h:1981:43: note: passing argument to parameter 'argp' here - int SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, - ^ - gstdtlsconnection.c:822:40: error: arithmetic on a pointer to void is a GNU extension - -Werror,-Wpointer-arith - memcpy (out_buffer, priv->bio_buffer + priv->bio_buffer_offset, copy_size); - ~~~~~~~~~~~~~~~~ ^ - -2015-03-16 17:34:05 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dtls/gstdtlsagent.c: - * ext/dtls/gstdtlscertificate.c: - * ext/dtls/gstdtlsconnection.c: - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlsenc.c: - * ext/dtls/gstdtlssrtpbin.c: - * ext/dtls/gstdtlssrtpdec.c: - * ext/dtls/gstdtlssrtpdemux.c: - * ext/dtls/gstdtlssrtpenc.c: - * ext/dtls/plugin.c: - dtls: Fix indention - -2015-03-16 17:33:03 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * ext/Makefile.am: - * ext/dtls/Makefile.am: - * ext/dtls/gstdtlsagent.c: - * ext/dtls/gstdtlsagent.h: - * ext/dtls/gstdtlscertificate.c: - * ext/dtls/gstdtlscertificate.h: - * ext/dtls/gstdtlscommon.h: - * ext/dtls/gstdtlsconnection.c: - * ext/dtls/gstdtlsconnection.h: - * ext/dtls/gstdtlsdec.c: - * ext/dtls/gstdtlsdec.h: - * ext/dtls/gstdtlsenc.c: - * ext/dtls/gstdtlsenc.h: - * ext/dtls/gstdtlssrtpbin.c: - * ext/dtls/gstdtlssrtpbin.h: - * ext/dtls/gstdtlssrtpdec.c: - * ext/dtls/gstdtlssrtpdec.h: - * ext/dtls/gstdtlssrtpdemux.c: - * ext/dtls/gstdtlssrtpdemux.h: - * ext/dtls/gstdtlssrtpenc.c: - * ext/dtls/gstdtlssrtpenc.h: - * ext/dtls/plugin.c: - dtls: Add new DTLS plugin - This is a copy of the Ericsson DTLS plugin from - https://github.com/EricssonResearch/openwebrtc-gst-plugins/tree/master/ext/erdtls/src - https://bugzilla.gnome.org/show_bug.cgi?id=744582 - -2015-03-16 03:53:33 +1100 Jan Schmidt <jan@centricular.com> - - * gst/compositor/compositororc.orc: - compositor: Revert most of previous patch. - The calculation doesn't produce the same results. - Keep just the change to divide alpha by 255 instead of 256, - for slightly better accuracy - -2015-03-15 16:55:00 +0000 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - androidmedia: Add helpers for calling static methods - -2015-03-15 16:38:29 +0000 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - androidmedia: Fix indention - -2014-06-05 10:33:56 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - androidmedia: Add more JNI helper functions - -2014-06-02 12:37:09 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/androidmedia/Makefile.am: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstjniutils.c: - * sys/androidmedia/gstjniutils.h: - androidmedia: Split jni code to gstjniutils.c - -2015-03-15 16:10:31 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: drop some superfluous assertions - g_return_*_if_fail() is for public API to catch - programming errors. For internal code, we should - just use g_assert() to check internal state. - -2015-03-15 15:54:01 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/mpegtsmux.c: - tests: mpegtsmux: add test for keyframe/delta flag propagation - The first output MPEG-TS packet that corresponds to a video input - buffer which had the delta flag cleared (i.e. was a keyframe) - should have the delta flag cleared as well. - This is needed e.g. by tcpserversink in order to keep track - of the last keyframe and be able to burst data to newly- - connected clients. - https://bugzilla.gnome.org/show_bug.cgi?id=706872 - -2015-03-15 14:35:15 +0000 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - gl/docs: add missing functions/objects - -2015-03-15 12:58:26 +0000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: tentative proper context collision detection - Fixes - tee name=t ! queue ! gliamgesink t. ! queue ! glimagesink - -2014-07-18 10:44:59 +0200 Jesper Larsen <knorr.jesper@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Fix namespace of some internal functions - https://bugzilla.gnome.org/show_bug.cgi?id=733347 - -2015-03-16 00:22:14 +1100 Jan Schmidt <jan@centricular.com> - - * gst/compositor/compositororc.orc: - compositor: Fix blending functions - Correctly calculate alpha in a few places by dividing by 255, - not 256. - Fix the argb and bgra blending functions to avoid an off-by-one - error in the calculations, so painting with alpha = 0xff doesn't - ever bleed through from behind - -2015-03-15 12:06:22 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/mpegtsmux.c: - tests: mpegtsmux: add unit test for "alignment" property - https://bugzilla.gnome.org/show_bug.cgi?id=722129 - -2015-03-14 15:27:39 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: make "alignment" property more useful for packetisation - Currently the alignment property just makes sure that we - output things in multiples of align*packet_size bytes, but - with no clear maximum size. When streaming MPEG-TS over - UDP one wants buffers with a maximum packet size of 1316. - The alignment property so far would just output buffers - that are a multiple of 1316 then. - Instead we now make the alignment property output - individual buffers with the alignment size, which - is entirely backwards compatible with the expected - behaviour up until now. For efficiency reason - collect all those buffers in a buffer list and - send that downstream. - Also collect data to push downstream in a buffer - list from the adapter if we don't align things, - which is still more efficient because of the - silly way the muxer currently creates output - packets. - https://bugzilla.gnome.org/show_bug.cgi?id=722129 - -2015-03-11 23:03:24 +0800 xixi <xixi10111011@gmail.com> - - * ext/dash/gstmpdparser.c: - dashdemux: fetch wrong segment at the end of Period - Fix check for end of Period time to avoid trying - to fetch a segment that doesn't exist - https://bugzilla.gnome.org/show_bug.cgi?id=746038 - -2015-03-14 19:48:21 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * ext/gl/gstgluploadelement.c: - * gst-libs/gst/gl/gstglupload.c: - glupload: move meta-data copy into gst-gl library - In some upload implementations the out buffer has more than one references, - turning the buffer not writable, so it won't be possible to modify its - meta-data. - This patch moves the meta-data copy before increasing the reference of the out - buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=746173 - -2015-03-14 18:45:01 +0000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: fix the slight difference between EXT_rg and ARB_rg - GL_EXT_texture_rg doesn't take sized formats for the internalformat - parameter of TexImage* but GL_ARB_texture_rg and GL(ES)3 do. - https://bugzilla.gnome.org/show_bug.cgi?id=732507 - -2015-03-14 17:29:02 +0000 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: remove hack around bug 648359 - It is already fixed - -2015-03-14 12:24:53 +0000 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: remove deprecated g_atomic function - We depend on 2.32 already - -2015-03-14 11:45:20 +0000 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: fix pad leak - Only get the pad if it is really going to be used to avoid - leaking it - -2015-03-14 18:10:24 +0000 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/generic/cube/main.cpp: - gl/examples: fixup generic cube example for NDC - translating outside the clip region doesn't work - -2015-03-14 15:38:28 +0000 Julien Isorce <j.isorce@samsung.com> - - * tests/examples/gl/sdl/.gitignore: - * tests/examples/gl/sdl/Makefile.am: - * tests/examples/gl/sdl/sdlshare2.c: - gl/examples: add sdlshare2 that uses glimagesink to output textures - https://bugzilla.gnome.org/show_bug.cgi?id=739681 - -2015-03-14 16:30:42 +0000 Julien Isorce <j.isorce@samsung.com> - - * ext/gl/gstglimagesink.c: - glimagesink: keep window invisible when sharing output - https://bugzilla.gnome.org/show_bug.cgi?id=739681 - -2015-03-14 15:16:55 +0000 Julien Isorce <j.isorce@samsung.com> - - * ext/gl/gstglimagesink.c: - * tests/examples/gl/generic/cube/Makefile.am: - * tests/examples/gl/generic/cube/main.cpp: - * tests/examples/gl/generic/cubeyuv/Makefile.am: - * tests/examples/gl/generic/cubeyuv/main.cpp: - * tests/examples/gl/generic/doublecube/Makefile.am: - * tests/examples/gl/generic/doublecube/main.cpp: - * tests/examples/gl/qt/mousevideooverlay/pipeline.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.cpp: - glimagesink: provide GstSample in client-draw signal - Instead of prividing texture and size directly. - And apply changes to examples. - https://bugzilla.gnome.org/show_bug.cgi?id=739681 - -2015-03-14 15:37:05 +0000 Julien Isorce <j.isorce@samsung.com> - - * tests/examples/gl/sdl/sdlshare.c: - sdlshare: use glupload and unmap frame - -2015-03-14 16:25:29 +0000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglsyncmeta.c: - * gst-libs/gst/gl/gstglsyncmeta.h: - glsyncmeta: make context to wait and set sync explicit - otherwise we may wait on a sync object in same context by accident - -2015-03-14 15:16:01 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: fix build - Was supposed to be squashed into earlier commit. - -2015-03-14 15:15:02 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - docs: update plugin docs - -2015-03-14 14:43:37 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * sys/Makefile.am: - * sys/osxvideo/Makefile.am: - * sys/osxvideo/osxvideoplugin.c: - * sys/osxvideo/osxvideosrc.c: - * sys/osxvideo/osxvideosrc.h: - Remove unported and useless osxvideosrc element - There are other elements for this now. - -2015-03-13 18:24:43 +0000 Ramiro Polla <ramiro.polla@collabora.co.uk> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: properly escape percent sign in documentation - -2015-03-14 12:58:22 +0000 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Add NULL check in error case - Other context may be NULL if something went wrong. Avoid trying to unref - a NULL pointer. - -2015-03-14 11:01:12 +0000 Matthew Waters <matthew@centricular.com> - - * configure.ac: - gl: fix a couple of typos in configure.ac - https://bugzilla.gnome.org/show_bug.cgi?id=744020 - -2015-03-14 10:39:06 +0000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglcolorconvertelement.c: - * ext/gl/gstgluploadelement.c: - glupload/colorconvert: only copy timestamps if the input buffer != output - -2015-03-11 00:06:55 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/cocoa/Makefile.am: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstgldisplay_cocoa.h: - * gst-libs/gst/gl/cocoa/gstgldisplay_cocoa.m: - * gst-libs/gst/gl/gstgldisplay.c: - gl: add GstGLDisplayCocoa - https://bugzilla.gnome.org/show_bug.cgi?id=746012 - -2015-03-13 09:07:16 +0000 Julien Isorce <j.isorce@samsung.com> - - * tests/examples/gl/cocoa/cocoa-videooverlay.m: - examples: initialize NSApp at the beginning - -2015-03-14 07:49:14 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: do not terminate loop in gst_gl_window_cocoa_close - It is now done in _finalize. - Fix regression introduced by - "gl/window: create the main loop/context on init/finalize" - bc7a7259f357b0065dd94e0668b5a895d83fa53a - -2015-03-13 15:34:55 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglutils.c: - gl: avoid overwriting display and context to NULL - It happens when the application provides display - and/or context. - -2015-03-13 17:41:17 +0000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gltestsrc.c: - * gst-libs/gst/gl/gstglshader.c: - glshader: attribute locations are -1 on error - -2015-03-13 17:04:17 +0000 Neos3452 <neos3452@gmail.com> - - * gst-libs/gst/gl/gstglshader.c: - glshader: prevent from getting attributes without vertex shader - It doesn't make sense to query for vertex attributes without a vertex - shader. Moreover this is causing a crash on OSX. - https://bugzilla.gnome.org/show_bug.cgi?id=746168 - -2015-03-14 02:53:00 +1100 Jan Schmidt <jan@centricular.com> - - * ext/gl/gstglfilterbin.c: - GL: Remove annoying printf in the filterbin class_init - -2015-03-12 09:27:30 +0100 ijsf <ijsf@gmx.net> - - * sys/applemedia/avfvideosrc.m: - Restricted activeVideoMaxFrameDuration to fix frame rate - -2015-03-13 12:43:13 +0000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: add pixel-aspect-ratio property on the bin - -2015-03-13 12:40:04 +0000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: unref the bufferpool - -2015-03-13 12:29:54 +0000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: forward ALL the properties on the bin - -2015-03-13 12:28:36 +0000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgluploadelement.c: - gluploadelement: properly unref buffers that are the same as the input - basetransform doesn't unref equal input and output buffers - -2015-03-13 10:25:35 +0000 Matthew Waters <matthew@centricular.com> - - * ext/gl/effects/gstgleffectbulge.c: - * ext/gl/effects/gstgleffectfisheye.c: - * ext/gl/effects/gstgleffectglow.c: - * ext/gl/effects/gstgleffectidentity.c: - * ext/gl/effects/gstgleffectlumatocurve.c: - * ext/gl/effects/gstgleffectmirror.c: - * ext/gl/effects/gstgleffectrgbtocurve.c: - * ext/gl/effects/gstgleffectsin.c: - * ext/gl/effects/gstgleffectsquare.c: - * ext/gl/effects/gstgleffectsqueeze.c: - * ext/gl/effects/gstgleffectstretch.c: - * ext/gl/effects/gstgleffecttunnel.c: - * ext/gl/effects/gstgleffecttwirl.c: - * ext/gl/effects/gstgleffectxray.c: - * ext/gl/gstglbumper.c: - * ext/gl/gstglcolorscale.c: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstglfilterapp.c: - * ext/gl/gstglfilterblur.c: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglfilterlaplacian.c: - * ext/gl/gstglfilterreflectedscreen.c: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstglfiltersobel.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - * ext/gl/gstglmosaic.c: - * ext/gl/gstgloverlay.c: - * ext/gl/gstgltransformation.c: - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - gl: get the context from basemixer/basefilter - -2015-03-13 09:38:54 +0000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglbasefilter.c: - * gst-libs/gst/gl/gstglfilter.c: - gl: retreive the gldisplay/app gl context as soon as possible - fixes the usage of gst_gl_display_filter_gl_api - -2015-03-13 09:37:46 +0000 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglcontext.c: - gl/tests: fix deadlock on glcontext wrapped context test - -2015-03-12 16:46:44 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: cache indices in a buffer object - -2015-03-12 17:11:31 +0000 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Fix discont detection and buffer alignment code - Actually accumulate the sample counter to check the accumulated error - between actual timestamps and expected ones instead of just resetting - the error back to 0 with every new buffer. - Also don't reset discont_time whenever we don't resync. The whole point of - discont_time is to remember when we first detected a discont until we actually - act on it a bit later if the discont stayed around for discont_wait time. - https://bugzilla.gnome.org/show_bug.cgi?id=746032 - -2015-03-08 18:16:04 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.h: - * ext/gl/caopengllayersink.m: - * ext/gl/gstopengl.c: - caopengllayersink: implement as a bin like glimagesink - -2015-03-03 18:05:04 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: avoid deadlock when creating context on the main thread. - Make window/view creation async so that it is possible to - gst_gl_context_create from the main thread. - -2015-03-03 17:26:47 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglbasefilter.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - gl: store the list of contexts within gldisplay - Removes the reliance on the allocation query to propogate GL contexts. - Allows thread safely getting a context for the a specific thread. - -2015-03-03 16:48:24 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: unset the current shader after rendering - fixes gltestsrc ! glimagesink when gltestsrc doesn't use a shader - -2015-03-03 16:38:56 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltestsrc.c: - * ext/gl/gstgltestsrc.h: - gltestsrc: remove usage of gldownload library object - -2015-02-28 00:30:38 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - glcontext: store the thread current context - -2015-02-26 18:26:36 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstglsrcbin.c: - * ext/gl/gstglsrcbin.h: - * ext/gl/gstopengl.c: - gl: new glsrcbin element - -2015-02-26 13:45:56 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - * ext/gl/gstopengl.c: - glvideomixer: implement with glmixerbin - The relevant properties are forwarded to/from the containing bin - and sink pads. - -2015-02-26 00:20:37 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - glmixer: remove usage of upload/download objects - -2015-02-25 23:48:56 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstglmixerbin.c: - * ext/gl/gstglmixerbin.h: - * ext/gl/gstopengl.c: - gl: new glmixerbin element - -2015-02-20 16:47:01 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * ext/gl/gstopengl.c: - glimagesink: implement as a bin - glupload ! glcolorconvert ! sink - Some properties are manually forwarded. The rest are available using - GstChildProxy. - The two signals are forwarded as well. - -2015-02-19 18:23:37 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstglsinkbin.c: - * ext/gl/gstglsinkbin.h: - * ext/gl/gstopengl.c: - gl: new glsinkbin element - similar to glfilterbin but for sinks - -2015-02-19 14:19:59 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: don't use the library upload/convert objects - -2015-02-19 13:33:28 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstglfilterbin.c: - * ext/gl/gstglfilterbin.h: - * ext/gl/gstopengl.c: - gl: new element glfilterbin - It encapsulates a confiurable GL processing element in the - upload/colorconvert/download dance required to transparently process - the majority of GstBuffer's. - -2015-02-19 13:24:59 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstgldownloadelement.c: - * ext/gl/gstgldownloadelement.h: - * ext/gl/gstopengl.c: - gl: add new gldownloadelement - Simply transforms caps to/from raw/glmemory capsfeatures - -2015-02-12 17:59:27 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstglcolorconvertelement.c: - * ext/gl/gstglcolorconvertelement.h: - * ext/gl/gstopengl.c: - gl: add a new glcolorconvert element based on the glcolorconvert library object - -2015-03-11 16:56:16 +0000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: implement propose_allocation pool handling for glmemory upload - -2015-02-11 23:29:01 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstgluploadelement.c: - * ext/gl/gstgluploadelement.h: - * ext/gl/gstopengl.c: - gl: add a new glupload element based on the glupload library object - -2015-02-11 14:48:45 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/gstglbasemixer.c: - * ext/gl/gstglbasemixer.h: - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - * ext/gl/gstglmixerpad.h: - * ext/gl/gstglvideomixer.h: - gl: add a new glbasemixer class below glmixer - It deals with propagating the gl display/contexts throughout the - application/pipeline - -2015-02-11 01:48:11 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglbasefilter.c: - * gst-libs/gst/gl/gstglbasefilter.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - gl: add a new glbasefilter class below glfilter - It deals with propagating the gl display/contexts throughout the - application/pipeline - -2015-02-11 01:27:28 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - glutils: expose running a query on a set of src/sink pads - -2015-03-12 12:49:40 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - opusenc: replace cbr and constrained-vbr properties with an enum - It was deemed confusing before. - https://bugzilla.gnome.org/show_bug.cgi?id=744909 - -2015-03-12 10:14:50 +0000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: advertise resize in the caps negotiation properly - -2015-03-12 01:49:58 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Add locking to fill_buffer and fix mix_buffer - The audiomixer pad struct fields may be changed from other threads - -2015-03-12 01:56:44 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - * gst/audiomixer/gstaudiomixer.h: - audiomixer: Mark a discont when we receive a new segment event - This allows us to handle new segment events correctly; either by dropping - buffers or inserting silence; for example if the offset is changed on an srcpad - connected to audiomixer. - -2015-03-12 09:46:02 +0000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: we don't do resizing of the video frames - As we cannot do accurate texel sampling then due to the texture - coordinates being interpolated based on the output frame size. - -2015-01-20 19:53:09 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: While aggregating, sync values for all pads before converting frames - -2015-03-11 18:49:22 +0000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl/x11: don't XGetWindowAttributes every XEvent - fixes a deadlock in xcb where the X window may not exist. - https://bugzilla.gnome.org/show_bug.cgi?id=745633 - -2015-03-11 14:50:28 +0000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - gl/window: hopefully fixup compile warnings on android/ios - -2015-03-11 17:19:17 +1100 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: Remove redundant check for clearing context on reset. - The context is already cleared a few lines above. - -2015-03-11 16:55:14 +1100 Jan Schmidt <jan@centricular.com> - - * ext/dash/gstisoff.c: - * ext/dc1394/gstdc1394.c: - * ext/openjpeg/gstopenjpegenc.c: - * ext/resindvd/gstmpegdesc.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/gl/egl/gsteglimagememory.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/insertbin/gstinsertbin.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst/mxf/mxfmetadata.c: - * gst/siren/gstsirendec.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - * sys/acmenc/acmenc.c: - * sys/vdpau/gstvdpvideobufferpool.c: - Remove a bunch of silly ';;' typos at the end of lines - -2015-03-06 15:31:18 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl/window: create the main loop/context on init/finalize - Avoids races setting the window handle from the main thread. - https://bugzilla.gnome.org/show_bug.cgi?id=745633 - -2015-03-08 02:04:11 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/base/gstaggregator.h: - aggregatory: don't redefine GST_FLOW_CUSTOM_SUCCESS - -2015-03-04 11:12:32 +0100 Edward Hervey <bilboed@bilboed.com> - - * sys/androidmedia/gstamcaudiodec.c: - androidmedia: Remove unused label/variable - -2015-03-10 15:31:21 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix get_presentation_offset check. - And return 0 isntead of FALSE. - https://bugzilla.gnome.org/show_bug.cgi?id=745455 - -2015-03-02 14:00:03 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: implement get_presentation_offset. - To account for presentationTimeOffset as per section 7.2.1 . - https://bugzilla.gnome.org/show_bug.cgi?id=745455 - -2015-03-02 13:53:03 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: API: get_presentation_offset virtual method. - Asks the subclass for a potential time offset to apply to each - separate stream, in dash streams can have "presentation time offsets", - which can be different for each stream. - https://bugzilla.gnome.org/show_bug.cgi?id=745455 - -2015-03-06 12:24:44 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * ext/dash/gstmpdparser.c: - gstmpdparser: Really set the default value for startNumber. - + The specs ask for a default of 1, the current code only did - set a default when the field was present. - https://bugzilla.gnome.org/show_bug.cgi?id=745455 - -2015-03-09 11:11:16 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/videoparsers/gstmpegvideoparse.c: - videoparser: unused value - Value set in off will be immediately overwritten after going to next. - CID #1226476 - -2015-03-09 12:51:21 +0900 hoonhee.lee <hoonhee.lee@lge.com> - - * gst/y4m/gsty4mdec.c: - y4mdec: remove unnecessary semicolon - https://bugzilla.gnome.org/show_bug.cgi?id=745877 - -2015-03-09 12:41:59 +0900 hoonhee.lee <hoonhee.lee@lge.com> - - * tests/check/libs/gstglcontext.c: - tests: glcontext: remove unnecessary semicolon - https://bugzilla.gnome.org/show_bug.cgi?id=745875 - -2015-03-06 14:49:20 +0200 Mohammed Hassan <mohammed.hassan@jolla.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: update zoom param spec if video source changes its max-zoom - If the video source happens to allow max-zoom to be greater than our maximum hard coded - value of 10 then the user cannot set anything greater than our maximum specified in the - param spec. We have to update our param spec to prevent glib from capping the value - https://bugzilla.gnome.org/show_bug.cgi?id=745740 - -2015-03-07 10:28:35 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/plugin.m: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - vtdec: Register a hardware-only vtdec_hw on OSX and give it a higher rank - while having the default vtdec at secondary rank. This allows decodebin/playbin - to prefer the hardware based decoders, and if that fails to initialize because - hardware resources are busy to fall back to e.g. the libav based h264 decoder - instead of the software based vtdec (which is slower), and only fall back to - the software based vtdec if there is no higher ranked decoder available. - -2015-03-06 20:11:00 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglmixer.c: - glmixer: Don't share our downstream pool with upstream - Pool cannot have multiple owner. This can lead to spurious - pool was flushing error. - https://bugzilla.gnome.org/show_bug.cgi?id=74570 - -2015-03-05 16:28:36 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: Don't chain downstream pool - Chaining a downstream pool would lead to two owner of the same - pool. In dynamic pipeline, if one owner is removed from the pipeline - the pool will be stopped, and the rest of the pipeline will fail - since the pool will now be flushing. Also fix proposed pool caching, - filter->pool was never set, never unrefed. - https://bugzilla.gnome.org/show_bug.cgi?id=745705 - -2015-03-05 15:49:50 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Only cache pool, don't manage it - GLImage does not use any kind of internal pool. There was some - remaining code and comment stating that it was managing the - pool, and it was in fact setting the active state when doing - to ready state. - * Only create the pool if requested and in propose_allocation - * Cache the pool to avoid reallocation on spurious reconfigure - * Don't try to deactivate the pool (we don't own it) - https://bugzilla.gnome.org/show_bug.cgi?id=745705 - -2015-03-06 12:07:47 -0500 Xavier Claessens <xavier.claessens@collabora.com> - - * gst/videoparsers/gstpngparse.c: - pngparse: stop spamming info messages - https://bugzilla.gnome.org/show_bug.cgi?id=745755 - -2015-03-06 18:54:24 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstgldownload.c: - gldownload: Simplify caps feature setting code - -2015-03-06 18:15:11 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglfilter.c: - gl: Remove format info in glcolorconvert's transform_caps function instead of on every caller - ... and let glmixer actually transform the caps it is supposed to transform - instead of inventing new caps. - -2015-03-06 18:49:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - Revert "videoaggregator: Create new caps from the video-info" - This reverts commit 78215be0dfbb4e8ed4f249e161a94c644328d28d. - because it broke glvideomixer with custom caps features. - -2015-03-06 18:36:12 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Simplify caps feature setting code - -2015-03-06 14:54:41 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/rtp/gstrtph265depay.c: - rtp: donl_present variable unused - donl_present is not implemented, yet the value is set and checked a few times. - Cleaning this. - CID #1249687 - -2015-03-06 14:27:44 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: fall through switch statement - Adding a comment makes coverity happy and quells the issue. - CID #1139748 - -2015-03-06 14:36:26 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Create new caps from the video-info - In case the original caps were missing some optional fields like - interlace-mode. We assume default values for those everywhere, - but they can still cause negotiation to fail if a downstream element - expects the field to be there and at a specific value. - -2015-02-25 13:52:21 +0100 Florian Zwoch <fzwoch@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: allow "capture-screen" mode to select which screen to capture via the "device-index" option - https://bugzilla.gnome.org/show_bug.cgi?id=745161 - -2015-03-05 19:09:49 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: Only use debugging if we have valid values - The debug category won't have been created/activated if it's not a - valid display - -2015-03-05 15:54:55 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/opencv/motioncells_wrapper.cpp: - motioncells: protect against not found id - If searchIdx() doesn't find the id it returns -1, which breaks - motioncelssvector.at (idx). Check for it and return if not found. - Changing a few other lines for style consistency. - -2015-03-05 15:34:09 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/opencv/gsttemplatematch.c: - opencv: remove always-true check - filter->cvImage has just been used/dereferenced, there would be an error - there if the pointer was NULL. No need to check since it will always be true. - -2015-03-04 16:13:30 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Calculate the duration more accurately from the capture time and numbers of samples - This should prevent any accumulating rounding errors with the duration. - -2015-03-04 16:05:28 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Fix the timestamp and offset calculations even more - -2015-03-04 16:04:18 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Don't subtract the duration from the capture time - We already have the real capture time, not the time when we received - the end of the packet. - -2015-03-04 13:16:03 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - Revert "audiomixer: Latency is twice the output buffer duration, not only once" - This reverts commit d387cf67df91b59540f32ee17b4c02f747969add. - The analysis was wrong: The first 20ms of latency are introduced by the source - already and put into the latency query, making it only necessary to cover the - additional 20ms of audiomixer inside audiomixer. - -2015-03-04 09:24:27 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: fix latency query in FEC case - The max latency parameter is "the maximum time an element - synchronizing to the clock is allowed to wait for receiving all - data for the current running time" (docs/design/part-latency.txt). - https://bugzilla.gnome.org/show_bug.cgi?id=744338 - -2015-03-03 11:42:09 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: reset the parser information when caps changes - This prevents it from going into passthrough after receiving 2 - byte-stream caps (different ones) as it would keep the have_pps and - have_sps set to true and would just go into passthrough without - updating its caps. - This patch makes it reset its stream information to restart properly - when new caps are received. - https://bugzilla.gnome.org/show_bug.cgi?id=745409 - -2015-03-03 17:47:51 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: set timestamp on discont buffers - Make sure discont buffers have its timestamp set to allow downstream - to resync if needed - -2012-03-22 08:47:57 +0100 Oleksij Rempel <bug-track@fisher-privat.net> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - camerabin2: check negotiated caps avoid reseting of the pipe - To avoid useless renegotiation of the pipe we can check for - negotiated caps on src_filter and compare it with requested - filter. If the caps intersect, avoid restart. - Signed-off-by: Oleksij Rempel <bug-track@fisher-privat.net> - https://bugzilla.gnome.org/show_bug.cgi?id=672610 - -2015-03-02 01:08:15 +0300 Ilya Averyanov <i.averyanov@geoscan.aero> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Remove duplicate code - The muxer is already allocated in reset(), which is called soon afterwards. - https://bugzilla.gnome.org/show_bug.cgi?id=745506 - -2015-03-03 10:12:11 +0800 Song Bing <b06498@freescale.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Set query ALLOCATION need_pool to FALSE - Set query ALLOCATION need_pool to FALSE as it only need query if can - support video overlay composition meta. - https://bugzilla.gnome.org/show_bug.cgi?id=745495 - -2015-03-04 14:38:36 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/avsamplevideosink.h: - * sys/applemedia/avsamplevideosink.m: - applemedia/avsamplesink: utilise a pull based approach of displaying video frames - Using requestMediaDataWhenReadyOnQueue the layer will execute a block - when it would like more frames. Using this we can provide the current - frame and avoid needlessly filling the layer's buffer queue causing - older frames to be displayed when under resource pressure. - -2015-03-03 15:22:38 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstgloverlay.c: - gloverlay: Fix upside down and miss-aligned JPEG - LibJPEG uses macroblock of 8x8 sample. In this element we use RGB and - Y444, two 24bit formats that are stored in 32bit pixels. This mean we - have 32x32 bytes macroblocks. For this reason, we need to allocate - our buffer slightly larger. We also need to pass the line pointer in - the right order, otherwise the image endup upside-down. - https://bugzilla.gnome.org/show_bug.cgi?id=745109 - -2015-03-03 20:03:55 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Latency is twice the output buffer duration, not only once - Let's assume a source that outputs outputs 20ms buffers, and audiomixer having - a 20ms output buffer duration. However timestamps don't align perfectly, the - source buffers are offsetted by 5ms. - For our ASCII art picture, each letter is 5ms, each pipe is the start of a - 20ms buffer. So what happens is the following: - 0 20 40 60 - OOOOOOOOOOOOOOOO - | | | | - 5 25 45 65 - IIIIIIIIIIIIIIII - | | | | - This means that the second output buffer (20 to 40ms) only gets its last 5ms - at time 45ms (the timestamp of the next buffer is the time when the buffer - arrives). But if we only have a latency of 20ms, we would wait until 40ms - to generate the output buffer and miss the last 5ms of the input buffer. - -2015-02-18 21:21:01 -0500 Xavier Claessens <xavier.claessens@collabora.com> - - gltransformation: normalize translations - https://bugzilla.gnome.org/show_bug.cgi?id=744763 - * Lubosz: use maxfloat for transformation range - -2015-02-18 20:41:14 -0500 Xavier Claessens <xavier.claessens@collabora.com> - - * ext/gl/gstgltransformation.c: - gltransformation: Fix doc typo - https://bugzilla.gnome.org/show_bug.cgi?id=744763 - -2015-03-03 13:45:46 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: Get rid of uploader if caps have changed - We need to update the uploader format if that caps have changed. - https://bugzilla.gnome.org/show_bug.cgi?id=745549 - -2015-03-03 16:50:30 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/wayland/wlshmallocator.c: - waylandsink: g_mkstemp is safer than mkstep - -2015-03-03 16:49:07 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/wayland/wlshmallocator.c: - Revert "waylandsink: mkstemp requires setting permission mask" - This reverts commit 1890e7355a5464fcfff58633851265b3fc7a3731. - Better to use g_mkstemp that takes care of the mask without affecting the - entire process. - -2015-03-03 16:55:26 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/gl/gstglwindow.c: - gl: Fix context leaks - Introduced by a12ca13750a15300ab3c718ebde2984dc3d587b3 - -2015-03-03 16:23:40 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/asfmux/gstasfmux.c: - asfmux: remove unnecessary conditional - The two branches of the if conditional are identical, which means in all cases - the same gst_asf_put_guid() will be executed. Do it directly. - CID #1226448 - -2015-03-03 15:51:50 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/wayland/wlshmallocator.c: - waylandsink: mkstemp requires setting permission mask - Using mkstemp without setting the permission mask is potentially harmful. - POSIX specification of mkstemp() does not say anything about file modes, so we - need to make sure its file mode creation mask is set appropriately before - calling it. - -2015-03-02 16:45:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Reset the clock calibration when unsetting the master clock - Otherwise the old calibration will stick around for the next time we use it, - potentially giving us completely wrong times. - -2015-03-02 13:57:24 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink{audio,video}src: Add some more debug output - -2015-02-12 13:43:30 +0100 DanielD10 <d.dedisse@vogo.fr> - - * sys/decklink/gstdecklink.cpp: - decklink: Incorrect frame rate for interlaced modes - https://bugzilla.gnome.org/show_bug.cgi?id=744386 - -2015-03-01 19:57:23 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - gl/cocoa: register only one custom nsapp loop - Otherwise the pipeline stalls when running - more than one glimagesink with gst-launch. - Also only register the custom nsapp loop - when setting up the nsapp from gstgl. - -2015-03-01 16:54:10 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - gl/cocoa: instead of class_init use g_once to setup nsapp - -2015-02-26 23:04:09 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - gl/cocoa: check for deprecated constants prior to OSX 10.10 - -2015-03-01 09:43:32 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst-libs/gst/gl/gstglbufferpool.c: - glbufferpool: Fix offset for odd height - We also need to recalculate the offset, since otherwise the frame - mapping will be forward two lines in the U and V planes (I420) due - to gst_video_info_align() round up the Y plane to a even number of - lines. - https://bugzilla.gnome.org/show_bug.cgi?id=745054 - -2015-03-01 00:08:42 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * tests/check/libs/gstglmemory.c: - gl-test: Port unit tests to new API - -2015-02-28 15:00:13 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: Support offset when downloading - Make sure we support offset and video alignment when downloading too. - This is currently not used (plane_start is always 0), but it makes - the code correct if we want to use that later. - -2015-02-28 13:01:16 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: Provide correct size on upload - Provide the right size to GL when uploading. Using maxsize is wrong - since we offset the data point with the memory offset and video - alignement offset. - https://bugzilla.gnome.org/show_bug.cgi?id=744246 - -2015-02-28 12:48:03 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: Provide correct size on download - Provide the right size to GL when downloading. This fixes downloading - from GLMemory that where created for libav. - https://bugzilla.gnome.org/show_bug.cgi?id=744246 - -2015-02-28 11:55:26 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - glmemory: Use fallback for partial copy - When the memory is partial copy, the texture size and videoinfo no - longer make sense. As we cannot guess what the application wants, we - safely copy into a sysmem memory. - https://bugzilla.gnome.org/show_bug.cgi?id=744246 - -2015-02-25 18:07:03 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/gl/gstgloverlay.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglupload.c: - glmemory: Add GstAllocationParams and alignment support - This implements support for GstAllocationParams and memory alignments. - The parameters where simply ignored which could lead to crash on - certain platform when used with libav and no luck. - https://bugzilla.gnome.org/show_bug.cgi?id=744246 - -2015-02-28 18:21:33 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: perform egl upload on the gl thread - Fixes EGLImage usage on raspberry pi - https://bugzilla.gnome.org/show_bug.cgi?id=743914 - -2015-02-27 11:07:34 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Fix scaling with rate of internal/external clock - -2015-02-27 00:26:00 +0530 Arun Raghavan <git@arunraghavan.net> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Use standard upstream latency querying logic - The same functionality is duplicated in the default latency querying - now. - -2015-02-27 00:01:41 +0530 Arun Raghavan <git@arunraghavan.net> - - * gst/liveadder/liveadder.c: - liveadder: Use default upstream latency querying logic - We can rely on the standard upstream latency querying logic and then add - our own latency. - -2015-02-26 13:20:26 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Set freed method implementation to NULL - When trying to render buffers with meta:GLTextureUpload the glimagesink crashes - with a segmentation fault. - This patch workarounds this crash setting to NULL the method implementation - after free. - https://bugzilla.gnome.org/show_bug.cgi?id=745206 - -2015-02-25 14:48:59 +0100 Roman Nowicki <r.nowicki@sims.pl> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: release existing D3D swap chain on init - https://bugzilla.gnome.org/show_bug.cgi?id=745159 - -2015-02-24 19:01:45 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/Makefile.am: - opengl: Clean Makefile.am - + Split headers from source - + Remove uneeded AM_CFLAGS, AM_LDFLAGS - + Always set OBJCFLAGS - Due to the presence of a .m and regardless of the conditional values, - automake will promote the link command to OBJC using OBJCFLAGS. Only - the basic flags (like warnings and optimization) are going to make a - difference though. - This cleanup builds up the makefile with less specific files first - toward more specific file. FLAGS are built with the basic that unused - flags will have empty variable. - -2015-02-24 12:54:54 -0500 Xavier Claessens <xavier.claessens@collabora.com> - - * ext/gl/gstglimagesink.c: - glimagesink: cosmetic cleanup - https://bugzilla.gnome.org/show_bug.cgi?id=745105 - -2015-02-24 19:52:59 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/Makefile.am: - opengl: don't add --tag=CC twice to LIBTOOLFLAGS - -2015-02-24 14:35:37 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/Makefile.am: - opengl: Add --tag=CC to LIBTOOLCLFAGS - This is required for static build. - -2015-02-24 18:50:03 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/jpegformat/gstjpegparse.c: - * tests/check/elements/jpegparse.c: - jpegparse: interlaced doesn't mean progressive scan - Removing interlaced variable since it is meant to mean progressive scan - and that isn't used. - -2015-02-24 18:38:31 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * tests/check/elements/jpegparse.c: - Revert "tests: check jpegparse for progressive marker" - This reverts commit 1c77d12ce8770f0e065e9c00c35d711fdef1c9f8. - "interlaced" in the caps don't mean the same thing as the SOF2 marker in the - JPEG format. This test passes because of broken behaviour. - -2015-02-24 17:41:43 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * tests/check/elements/jpegparse.c: - tests: check jpegparse for progressive marker - -2015-02-24 14:01:04 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: Deactivate window before changing handle - When setting a new window handle, we need to ensure all implementations - will detect the change. - For that we deactivate the context before setting the window handle, then - reactivate the context - https://bugzilla.gnome.org/show_bug.cgi?id=745090 - -2015-02-24 13:58:26 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - gl/egl: Detect window handle changes - When (re)activating the context, the backing window handle might have changed. - If that happened, destroy the previous surface and create a new one - https://bugzilla.gnome.org/show_bug.cgi?id=745090 - -2015-02-24 14:20:42 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst-libs/gst/gl/gstglapi.c: - gl: remove docbook related warnings - -2015-02-24 13:51:24 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/modplug/gstmodplug.cc: - modplug: remove unused variable - -2015-02-24 13:36:00 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/modplug/gstmodplug.cc: - modplug: not using deprecated API anymore - -2015-02-24 13:16:21 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/modplug/gstmodplug.cc: - modplug: update example pipeline command - -2015-02-24 19:03:43 +0530 Arun Raghavan <arun@centricular.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - mpegts: Fix a compiler warning - Causes the following warning on clang: - gst-dvb-section.c:567:36: error: format specifies type 'unsigned long' but the argument has type 'int' -Werror,-Wformat - descriptors_loop_length, end - 4 - data); - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~ - -2015-02-24 23:54:13 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: only attempt use of the texture cache with GLMemory caps features - Otherwise we send rectangle textures to glimagesink - -2015-02-24 23:52:39 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/caopengllayersink.m: - caopengllayersink: render black when we don't have a texture to display - Like when the winsys asks us to redraw before the pipeline has started - -2015-02-25 00:00:48 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: allow sharing between buffers - There was no real reason why the flag was set. We should be able - to handle it. Fixes last-sample handling on gl sinks - -2015-02-24 20:34:35 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - glsyncmeta: add compat definition for gles2 - -2015-02-24 11:19:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Don't initialize the render window swap chain while the device is lost and we're waiting for reset - https://bugzilla.gnome.org/show_bug.cgi?id=744615 - -2015-02-24 11:18:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Deactivate the fallback buffer pool when replacing it during caps changes - https://bugzilla.gnome.org/show_bug.cgi?id=744615 - -2015-01-29 17:41:19 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - * ext/gl/caopengllayersink.h: - * ext/gl/caopengllayersink.m: - * ext/gl/gstopengl.c: - new caopengllayersink element - renders gstreamer gl scene/video frames to a caopengllayer retreivable - from the "layer" property. - -2015-01-19 12:43:23 +1100 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * sys/applemedia/Makefile.am: - * sys/applemedia/avsamplevideosink.h: - * sys/applemedia/avsamplevideosink.m: - * sys/applemedia/plugin.m: - * tests/examples/Makefile.am: - * tests/examples/avsamplesink/.gitignore: - * tests/examples/avsamplesink/Makefile.am: - * tests/examples/avsamplesink/main.m: - applemedia: new AVSampleBufferLayerSink - Renders buffers using the CALayer subclass AVSampleBufferDisplayLayer - which can be placed inside a Core Animation render tree. - -2015-02-24 19:06:18 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - gl/calayer: don't use the async callback to render - not until we can provide equivalent functionality for other window - implementations. - -2015-02-24 01:20:23 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - glsyncmeta: also supported with gles3 - -2015-02-24 14:23:49 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.h: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - libgstgl: eagl: handle CALayer resize - -2015-02-23 16:13:31 +0100 Vasilis Liaskovitis <vliaskov@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: Fix transfer_pbo memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=744977 - -2015-02-22 10:03:54 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - gl/cocoa: reduce custom main loop latency - This fix a very slow rendering rate regression that only - happens when using gst-launch, i.e. in the case where - the main thread does not run any NSApp loop. - Git bisect reported it has been introduced by the commit - e10d2417e2fe7aa4733c076984339b0d61caa169: - "move to CGL and CAOpenGLLayer for rendering". - Then the commit 7d463576271e5a4cc1070780ba1a69c971e8be1d: - "gstglwindow_cocoa: fix slow render rate" attempted to fix - the slow rendering rate problem when using gst-launch. - At least for me it does not work. I tried several - combinations, for example to flush CA transactions in the - custom app loop, as mentioned in the doc, but the only solution - that fixes the slow rendering is by reducing the loop latency. - From what I tested, no need to put less than 60ms, even if the - framerate has an interval much lower (16.6ms for 60 fps). - -2015-02-17 23:50:51 +0000 Julien Isorce <j.isorce@samsung.com> - - * ext/gl/gstglmixerpad.h: - glmixer: fix some compiler warnings - i686-apple-darwin11-llvm-gcc-4.2 - gstglmixer.h:43: error: redefinition of typedef ‘GstGLMixer’ - gstglmixerpad.h:32: error: previous declaration of ‘GstGLMixer’ was here - gstglmixer.h:46: error: redefinition of typedef ‘GstGLMixerFrameData’ - gstglmixerpad.h:33: error: previous declaration of ‘GstGLMixerFrameData’ was here - -2015-02-21 19:07:29 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-opus.xml: - docs: update - -2015-02-21 19:07:14 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - docs: add opus elements to documentation - -2015-02-21 18:52:00 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * tests/examples/mxf/mxfdemux-structure.c: - mxf-example: don't quit on Warning - Don't quit on Warning. - Print out a message when there is an Error or Warning. - -2015-02-21 18:47:29 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * tests/examples/mxf/mxfdemux-structure.c: - mxf-example: always show gtk window - Show gtk window even when there are no tags, to always have visual feedback - about the pipeline running. - -2015-02-21 17:35:03 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * tests/examples/mxf/mxfdemux-structure.c: - mxf-example: merge returns in g_value_to_string() - -2015-02-21 17:25:51 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * tests/examples/mxf/mxfdemux-structure.c: - mxf-example: make bus_callback consistent - Simplify the bus_callback to make it consisten with other examples. - -2015-02-21 17:18:02 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * tests/examples/mxf/mxfdemux-structure.c: - mxf-example: fix usage of argc and argv - -2015-02-21 17:02:09 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * tests/examples/camerabin2/gst-camera2.c: - camerabin examples: remove unneeded variable - ret is only used once, we don't need to store it in a variable for that. - -2015-02-21 14:42:05 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/gl/gstglmemory.c: - gstglmemory: Remove now unused transfer_upload function. - -2015-02-21 23:29:22 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: disable automatic pbo upload - until we can track where the data is/or is going to be. - -2015-02-20 13:55:05 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - * tests/check/elements/hlsdemux_m3u8.c: - hlsdemux: select correct starting position for live streams - When playing live HLS streams, the media playback starts from the - beginning of the media playlist. When playing a live HLS stream, - media playback should start from 3 fragments from the end of the - playlist. - See section 6.3.3. of the HLS draft 1 - This commit changes the logic to select 3 fragments from the end when - playing a live stream. - 1 http://tools.ietf.org/html/draft-pantos-http-live-streaming-12#page-29 - https://bugzilla.gnome.org/show_bug.cgi?id=727742 - -2015-02-20 18:42:23 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - glememory: only store and act on the map flags on first/last map/unmap - Anytime else, we have no idea how to match up map and unmaps. - We also don't know exactly how the calling code is using us. - Also fixes the case where we're trying to transfer while someone else - is accessing our data pointer or texture resulting in mismatched video - frames. - https://bugzilla.gnome.org/show_bug.cgi?id=744839 - -2015-02-19 21:21:56 -0500 Olivier Crete <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Use src_lock to protect latency related members - One has to use the src_lock anyway to protect the min/max/live so they - can be notified atomically to the src thread to wake it up on changes, - such as property changes. So no point in having a second lock. - Also, the object lock was being held across a call to - GST_ELEMENT_WARNING, guaranteeing a deadlock. - -2015-02-19 18:53:32 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Remove untrue comment - -2015-02-19 18:30:35 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Don't try to push tags while flush seeking - The downstream segment could have been flushed already, so - need to re-send the segment event before re-sending the tags. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-02-19 14:34:23 +0100 Guillaume Seguin <guillaume@segu.in> - - * ext/hls/gsthlssink.c: - hlssink: reduce playlist's EXT-X-VERSION to 3 - We are not using any features greater than the 3rd version, - so reduce to what we actually use to make it compatible with - more players - https://bugzilla.gnome.org/show_bug.cgi?id=744689 - -2015-02-19 14:30:10 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstrtpopuspay.c: - rtpopuspay: default encoding name to OPUS - https://bugzilla.gnome.org/show_bug.cgi?id=737810 - -2015-02-19 14:05:06 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstrtpopuspay.c: - rtpopuspay: make caps writable before truncating them - https://bugzilla.gnome.org/show_bug.cgi?id=737810 - -2015-02-05 10:27:51 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstrtpopuspay.c: - rtpopuspay: negotiate the encoding name - Chrome uses a different encoding name that gstreamer. - https://bugzilla.gnome.org/show_bug.cgi?id=737810 - -2015-02-19 17:21:46 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst/videosignal/gstsimplevideomarkdetect.c: - simplevideomarkdetect: move offset calculations out of inner loops - the calculations for detecting the videomark is being repeated - in for loop unnecessarily. Moving this outside of for loop - such that the code need not be executed evertime the loop is executed. - https://bugzilla.gnome.org/show_bug.cgi?id=744778 - -2015-02-19 11:04:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Use the sinkpads iterator directly to query upstream latencies - While gst_aggregator_iterate_sinkpads() makes sure that every pad is only - visited once, even when the iterator has to resync, this is not all we have - to do for querying the latency. When the iterator resyncs we actually have - to query all pads for the latency again and forget our previous results. It - might have happened that a pad was removed, which influenced the result of - the latency query. - -2015-02-19 10:57:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Move gst_aggregator_get_latency_unlocked() a bit - It was between another function and its helper function before, which was - confusing when reading the code as it had nothing to do with the other - functions. - -2015-02-19 01:28:30 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/resindvd/rsninputselector.c: - rsninputselector: Fail the latency query if one of the upstream queries fails - -2015-02-19 01:28:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/liveadder/liveadder.c: - liveadder: Fail the latency query if one of the upstream queries fails - -2015-02-19 01:28:06 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Fail the latency query if one of the upstream queries fails - -2015-02-18 19:06:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: Only set latency if we already know our caps - Otherwise we might set bogus values or GST_CLOCK_TIME_NONE. - Also make sure to reset the caps field to NULL after unreffing - the caps to prevent accidential use afterwards, and unref any - old caps before we remember new caps. - -2015-02-18 15:53:53 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Document locking order - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-02-18 15:11:14 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Rename confusinly named SRC_STREAM_LOCK macros to SRC_LOCK - This will match the name of the lock itself. It is also not a stream - lock as it not recursive and not held while pushing. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-02-18 15:06:01 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Rename confusingly named stream lock to flush lock - This lock is not what is commonly known as a "stream lock" in GStremer, - it's not recursive and it's taken from the non-serialized FLUSH_START event. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-02-18 15:04:04 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Fix macro indendation - Changes no code - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-02-18 17:10:48 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstgltransformation.c: - * ext/gl/gstgltransformation.h: - gltransform: Fix includes of graphene headers - The graphene-1.0 part should not be in the source code. This directory - is part of the cflags include. This is similar to gstreamer-1.0/ - directory. This break compilation if the include directory where - graphene is installed is not in your include path. - -2015-02-18 19:07:42 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: remove unneeded values - No need to store the GstFlowReturn when we can check if it is not OK directly - -2015-02-18 18:33:20 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: renaming GstFlowReturn variable - Having a variable named ret in a static void function is very confusing since - this usually is to store what the function will return. - -2015-02-18 18:00:48 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: remove ignored value - Value stored in ret will be ovewritten in the next iteration of the loop. Which - means it is never used. - Plus a style issue to make gst-indent happy and allow the commit. - -2015-02-18 17:41:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusenc.c: - opusenc: Remove g_warnings() for the deprecated audio property - Otherwise there are g_warnings() already when just using gst-inspect or - dumping a pipeline graph. - -2015-02-15 23:16:52 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - dashdemux: protect against malformed isombff format - Be more careful around malformed mpds that announce using - isombff profile but actually are regular mpds - -2015-02-18 12:45:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Deactivate the fallback pool and unref the fallback buffer when resetting - Otherwise we will still have a reference to the surface left, which would - prevent activating the sink again later. E.g. after we lost the device. - Hopefully fixes https://bugzilla.gnome.org/show_bug.cgi?id=744615 - -2015-02-17 11:53:49 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: remove unused define - -2015-02-17 11:41:27 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: use correct function to clear fragment info - Just freeing the url won't reset the byte ranges and can lead to wrong - ranges being used. - -2015-02-17 10:50:59 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: depracate bandwidth-usage in favor of bitrate-limit - Bitrate-limit is already available in the baseclass and, even though - the bandwidth-usage name is better, hls and mss already used - bitrate-limit. This patch deprecates the bandwidth-usage and maps - it to the baseclass bitrate-limite. - -2015-02-17 10:40:06 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: add bitrate-limit property - Move the property from subclasses to adaptivedemux, it allows - selecing the percentage of the measured bitrate to be used when - selecting stream bitrates - -2015-02-17 10:04:30 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlssink.c: - * ext/hls/gstm3u8playlist.c: - hlssink: allow creation of 'infinite' playlist - Allow the playlist-length to accept '0' as a value, indicating - that no segment should be removed from the playlist. This allows - generating playlists to be used as VOD when complete. - -2015-02-17 10:04:27 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlssink.c: - * ext/hls/gstm3u8playlist.c: - * ext/hls/gstm3u8playlist.h: - hlssink: remove unused attribute - the GFile attribute is never used - -2015-02-17 10:03:44 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: add connection-speed property - Allows to set a bitrate directly instead of measuring it internally - based on the received chunks. The connection-speed was removed from - mssdemux and hlsdemux as it is now in the base class - -2015-02-17 00:34:55 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - basecamerabinsrc: don't use private GMutex implementation details - Don't use private GMutex implementation details to check - whether it has been freed already or not. Just clear mutex - and GCond unconditionally in free function, they are always - inited anyway, and the free function can't be called multiple - times either. - -2015-02-16 23:54:28 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: don't use private GMutex implementation details - Don't use private GMutex implementation details to check - whether it has been freed already or not. Just turn dispose - function into finalize function which will only be called - once, that way we can just clear the mutex unconditionally. - -2015-02-17 18:17:59 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: don't deadlock if the dispatch_sync is called from the main thread - Provide a helper function to check whether we are being called from - the main thread and act appropriately. - -2015-02-17 16:41:17 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.h: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - gl/calayer: only start drawing if the parent gl context is ready - otherwise we may try to use GstGLFuncs * that hasn't been set yet - -2015-02-17 16:39:56 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: small refactor of layer/view creation into the window - -2015-02-17 01:04:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - glwindow: Remove assertion in gst_gl_window_show() for subclasses not implementing it - On Android and iOS we can't create a window ourselves, so also can't just show - one. That's not a problem and an assertion is not really needed here. - -2015-02-16 12:35:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Check if VTSessionCopyProperty() succeeds before using the result - https://bugzilla.gnome.org/show_bug.cgi?id=744585 - -2015-02-13 23:45:20 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: drop GAP events until we handle them properly - -2015-02-12 12:04:44 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst/videosignal/gstsimplevideomark.c: - simplevideomark: refactor code - the calculations for drawing the videomark is being repeated - in for loop unnecessarily. Moving this outside of for loop - such that the code need not be executed evertime the loop is executed. - https://bugzilla.gnome.org/show_bug.cgi?id=744371 - -2015-02-09 11:21:35 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: Fix segment and segment event handling during seeking - Always update the segment and not only for accurate seeking and always - send a new segment event after seeks. - For non-accurate force a reset of our segment info to start from - where our seek led us as we don't need to be accurate - https://bugzilla.gnome.org/show_bug.cgi?id=743363 - -2015-02-13 16:06:34 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: use new gst_aggregator_pad_drop_buffer() - -2015-02-13 16:03:53 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: use new gst_aggregator_pad_drop_buffer() - -2015-02-13 15:53:19 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - * tests/check/libs/aggregator.c: - aggregator: use new gst_aggregator_pad_drop_buffer() - -2015-02-13 15:49:50 +0000 Tim-Philipp Müller <tim@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: add gst_aggregator_pad_drop_buffer() - steal_buffer() + unref seems to be a wide-spread idiom - (which perhaps indicates that something is not quite - right with the way aggregator pad works currently). - -2015-02-12 13:32:39 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: only post latency message if anything changed - Perhaps we should check for element state as well and - only post it if in PLAYING state. - -2015-02-12 15:48:07 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/audiomixer.c: - * tests/check/elements/compositor.c: - tests: remove GST_DISABLE_PARSE guards from two tests that don't require it - -2015-01-28 12:12:26 +0530 Arun Raghavan <arun@centricular.com> - - * sys/opensles/openslessink.c: - * sys/opensles/openslessrc.c: - opensles: Make debug category naming a bit more consistent - -2015-02-13 19:12:20 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - applemedia: avfvideosrc: fix crash when non-GL memory is used - -2015-02-05 18:10:15 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Fix logic in fragment_download_finish. - This was preventing us from surfacing a meaningful error. - https://bugzilla.gnome.org/show_bug.cgi?id=743703 - -2015-02-12 22:06:17 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix handling of live streams with timeshift buffers. - By implementing get_live_seek_range. - As shown by : - gst-validate-1.0 playbin \ - uri=http://dev-iplatforms.kw.bbc.co.uk/dash/news24-avc3/news24.php - This patch handles live seeking, by setting a live seek range - comprised between now - timeShiftBufferDepth and now. - The inteersting thing with this stream is that one can actually - ask fragments up to availabilityStartTime, but it seems quite clear - in the spec that content is only guaranteed to exist up to - timeShiftBufferDepth. - One can test live seeking this way : - gst-validate-1.0 playbin \ - uri=http://dev-iplatforms.kw.bbc.co.uk/dash/news24-avc3/news24.php \ - --set-scenario seek_back.scenario - with scenario being: - description, seek=true - seek, playback-time=position+5.0, start="position-600.0", - flags=accurate+flush - This example will play the stream, wait for five seconds, then seek back - to a position 10 minutes earlier. - https://bugzilla.gnome.org/show_bug.cgi?id=744362 - -2015-02-12 22:04:10 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Set first segment time to segment start. - Otherwise as long as a seek wasn't executed, the position was - reported incorrectly: - gst-validate-1.0 playbin \ - uri=http://dev-iplatforms.kw.bbc.co.uk/dash/news24-avc3/news24.php - https://bugzilla.gnome.org/show_bug.cgi?id=744362 - -2015-02-12 17:33:50 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Fix debug statement - -2015-02-12 15:02:31 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstgluploadmeta.c: - gl: Add/Update more debug statements - Where possible, use the _OBJECT variants in order to track better from - which object the debug statement is coming from - Define (and use) GST_CAT_DEFAULT where applicable - Use GST_PTR_FORMAT where applicable - -2015-02-12 14:58:14 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglcontext.h: - gl: Make glcontext debug category used in more places - As a bonus it makes the egl context debug messages visible now :) - -2015-02-12 14:56:12 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Sprinkle more debug - -2015-02-12 11:15:31 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: set proper stream type to streams - strncmp returns 0 when it compares equal and not a - boolean - -2015-02-12 11:26:44 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: calculate stream_time used to sync pad values correctly - Use pad (input) segment to calculate the stream time from the - input timestamp, not the aggregator (output) segment. - -2015-02-12 11:11:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: Only use the duration of the sample if it is valid - -2015-01-27 13:48:42 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: track per-fragment bitrates. - And use the average to go up in resolution, and the last fragment - bitrate to go down. - This allows the demuxer to react rapidly to bitrate loss, and - be conservative for bitrate improvements. - + Add a construct only property to define the number of fragments - to consider when calculating the average moving bitrate. - https://bugzilla.gnome.org/show_bug.cgi?id=742979 - -2015-02-11 14:44:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/x265/gstx265enc.c: - x265enc: Add support for 10bit 4:2:0 and 4:4:4 formats - -2015-02-11 14:16:21 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusdec.c: - * ext/resindvd/rsninputselector.c: - * ext/x265/gstx265enc.c: - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst/audiomixer/gstaudiomixer.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/inter/gstinteraudiosrc.c: - * gst/liveadder/liveadder.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - Improve and fix LATENCY query handling - This now follows the design docs everywhere, especially the maximum latency - handling. - https://bugzilla.gnome.org/show_bug.cgi?id=744106 - -2015-02-10 15:55:50 +0800 Song Bing <b06498@freescale.com> - - * tests/examples/camerabin2/gst-camera2.c: - camerabin examples: memory leak in camerabin examples code - should unref caps after set to profile. profile will ref it. - https://bugzilla.gnome.org/show_bug.cgi?id=744219 - -2015-02-10 15:53:21 +0800 Song Bing <b06498@freescale.com> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - camerabin examples: memory leak in camerabin examples code - should unref after set object. The object will be refed when set - property. - https://bugzilla.gnome.org/show_bug.cgi?id=744219 - -2015-02-10 16:18:34 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/opensles/openslesringbuffer.c: - openslesringbuffer: Only allocate at most half the number of internal buffers as external audioringbuffer ones - Otherwise we might end up reading too much from the audioringbuffer, which - would result in reading silence. - -2015-02-10 16:01:19 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Apply the diff between element and pipeline "base" time in all cases - Even if both clocks have the same rate, we need to apply this diff. Only when - it's the same clock we don't, as it's our clock then. - -2015-02-10 15:30:44 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Add the diff between the pipeline base time and when we start to play - Add the diff between the external time when we went to playing and - the external time when the pipeline went to playing. Otherwise we - will always start outputting from 0 instead of the current running - time. - -2015-02-10 14:53:55 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Actually include the change mentioned in the last commit - -2015-02-10 14:48:09 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideo{src,sink}: Sample the internal clock immediately after starting the device - Otherwise we might stay at 0.0s for too long because we will take the first - timestamp we ever see as 0.0... which will be after we started the device. - -2015-02-10 10:56:37 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: When receiving timeout before caps, make sure to also advance our frame counter - Otherwise we will directly go EOS on the next non-timeout. - -2015-02-10 10:49:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Pause srcpad task on flow errors - Otherwise we will call the task function over and over again until - upstream finally handled the flow return and shuts us down. - -2015-02-09 00:59:30 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: fix buffer selection when duration=-1 - If the src framerate and videoaggreator's output framerate were - different, then we were taking every single buffer that had duration=-1 - as it came in regardless of the buffer's start time. This caused the src - to possibly run at a different speed to the output frames. - https://bugzilla.gnome.org/show_bug.cgi?id=744096 - -2015-02-09 21:04:17 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Fix compiler warning with gcc - gstdecklink.cpp: In member function 'virtual HRESULT GStreamerDecklinkInputCallback::VideoInputFrameArrived(IDeckLinkVideoInputFrame*, IDeckLinkAudioInputPacket*)': - gstdecklink.cpp:498:22: error: comparison between signed and unsigned integer expressions -Werror=sign-compare - if (capture_time > m_input->clock_start_time) - ^ - gstdecklink.cpp:503:22: error: comparison between signed and unsigned integer expressions -Werror=sign-compare - if (capture_time > m_input->clock_offset) - ^ - -2015-02-09 17:17:37 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink{audio,video}src: Implement clock slaving if the pipeline clock is not the decklink clock - -2015-02-09 17:15:21 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudio{src,sink}: Only start streams / scheduled playback if there is a videosrc at this point - -2015-02-09 17:04:27 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Don't provide a clock - The audio source only works together with the video source, and the video - source is already providing a clock. - -2015-02-09 16:18:03 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - decklinkaudiosink: Throttle reading from the ringbuffer - The driver has an internal buffer of unspecified and unconfigurable size, and - it will pull data from our ring buffer as fast as it can until that is full. - Unfortunately that means that we pull silence from the ringbuffer unless its - size is by conincidence larger than the driver's internal ringbuffer. - The good news is that it's not required to completely fill the buffer for - proper playback. So we now throttle reading from the ringbuffer whenever - the driver has buffered more than half of our ringbuffer size by waiting - on the clock for the amount of time until it has buffered less than that - again. - -2015-02-09 15:19:11 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - decklinkaudiosink: Start scheduled playback when going to PLAYING - The ringbuffer's acquire() is too early, and ringbuffer's start() will only be - called after the clock has advanced a bit... which it won't unless we start - scheduled playback. - -2015-02-09 21:18:24 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/corevideotexturecache.m: - * sys/applemedia/vtdec.c: - vtdec: fix texture sharing on iOS - Move GLES calls to the context thread. Fix - CVOpenGLESTextureCacheCreateTextureFromImage usage on iOS. - -2015-02-09 20:44:50 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - libgstgl: set user data and GDestroyNotify for wrapped textures - -2015-02-08 21:53:58 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink{audio,video}src: Take the capture times from the pipeline clock - Not from the decklink clock. Both will return exactly the same time once the - decklink clock got slaved to the pipeline clock and received the first - observation, but until then it will return bogus values. But as both return - exactly the same values, we can as well use the pipeline clock directly. - -2015-02-08 14:32:22 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: don't set element factory details - This is an abstract base class, not an element. - -2015-02-08 01:19:42 +1100 Rob Clark <rob@ti.com> - - * gst/dvdspu/gstspu-vobsub-render.c: - dvdspu: some optimizations - Detect invisible pixels, and skip gstspu_vobsub_blend_comp_buffers() - when there are only invisible pixels. This significantly reduces the - CPU load in cases of DVDs which don't use the clip_rect to exclude - processing for parts of the screen where the video is visible. - https://bugzilla.gnome.org/show_bug.cgi?id=667221 - -2015-02-08 05:06:48 +1100 Jan Schmidt <jan@centricular.com> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: Avoid warning if the video for a still frame arrives after the SPU - When we don't have a segment on the video pad yet during a still frame - don't freak out. - -2015-02-08 04:51:13 +1100 Jan Schmidt <jan@centricular.com> - - * ext/resindvd/gstmpegdemux.c: - resindvd: Don't send meaningless segment position downstream - Don't place a meaningless value in the position field in - outgoing segments - values have to be in the range start->stop. - https://bugzilla.gnome.org/show_bug.cgi?id=740558 - -2015-02-06 16:22:26 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/aiff/aiffparse.c: - Revert "aiffparse: make sure we have data before handling sink event" - This reverts commit a4baabb48d252214d3833b502c7903d9f15f3502. - -2015-02-06 15:10:55 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/aiff/aiffparse.c: - aiffparse: make sure we have data before handling sink event - Check AIFF_PARSE_DATA is True before handling sink event, if not goto exit. - -2015-02-05 15:57:59 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiomixer/gstaudiomixer.h: - audiomixer: remove now-unused base_time field in object structure - -2015-02-06 10:59:27 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Streamline latency calculations - Min latency can never be invalid, latency property can never be invalid - either. So no need to check for all these things in various places. - -2015-02-06 10:36:28 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: If upstream has no max latency but the subclass has, take the subclass max latency - -2015-02-06 10:33:59 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Fix min>max latency error check - We have to include the upstream latency, our own latency and the subclass - latency in the calculations. - FIXME: This is still not entirely correct - -2015-02-06 10:30:59 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Don't add the latency property to the max latency - It has no meaning for the max latency and is only used to increase the min - latency. - -2015-02-06 12:53:15 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/glprototypes/vao.h: - glproto/vao: only supported in core for ES 3.0+ - Was causing horizontally flipped video for frame 2 onward on android - -2015-02-05 13:31:18 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/faac/gstfaac.c: - faac: relace parsed with framed in aac caps - For AAC it should always be 'framed' and not 'parsed' - -2015-02-05 11:39:55 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/faac/gstfaac.c: - faac: fix output caps to negotiate with some muxers - Add parsed/framed=true to allow negotiation with some - muxers that required parsed input. Encoders already provide - parsed/framed output so it should say so in caps. - -2015-02-05 15:48:41 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/compositor.c: - tests: compositor: add unit test for proper segment.base handling - As adjusted by gst_pad_set_offset(), or when doing segment seeks - or looping for example. - -2015-02-05 15:23:04 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/audiomixer.c: - tests: audiomixer: add unit test for proper segment.base handling - As adjusted by gst_pad_set_offset(), or when doing segment seeks - or looping for example. See previous audiomixer commit. - -2015-02-05 16:02:54 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Remove weird and wrong segment handling - There's no reason why audiomixer should override the segment - base of upstream with whatever value it got from a SEEK event, - or even worse... with 0 if there was no SEEK event yet. This - broke synchronization if upstream provided a segment base other - than 0, e.g. when using pad offsets. - Also that this code did things conditional on the element's state - should've been a big warning already that something is just wrong. - If this breaks anything else now, let's fix it properly :) - Also don't do fancy segment position trickery when receiving a - segment event. It's just not correct. - -2015-02-05 12:24:04 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/opensles/openslesringbuffer.c: - openslesringbuffer: Only pre-roll a single buffer - There is no reason to pre-roll more buffers here as we have our own ringbuffer - with more segments around it, and we can immediately provide more buffers to - OpenSL ES when it requests that from the callback. - Pre-rolling a single buffer before starting is necessary though, as otherwise - we will only output silence. - Lowers latency a bit, depending on latency-time and buffer-time settings. - -2015-02-05 12:22:46 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/opensles/openslesringbuffer.c: - openslesringbuffer: Allocate at most 4 internal buffers - 4 is the "typical" number of buffers defined by Android's OpenSL ES - implementation, and its code is optimized for this. Also because we - have our own ringbuffer around this, we will always have enough - buffering on our side already. - Allows for more efficient processing. - -2015-02-05 12:21:55 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/opensles/openslessink.c: - * sys/opensles/openslessrc.c: - openslessink/src: Lower default buffer time to 200ms like alsasink - -2015-02-05 16:46:32 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: ensure that the input upload/colorconvert are always available - -2015-02-05 11:06:10 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: log the converted caps - -2015-02-05 11:05:02 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: restrict EGL and UploadMeta to RGBA - other formats are highly untested. - -2015-02-05 11:04:05 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: don't intersect with the input caps - that limits our formats to whatever is in the input caps - -2015-02-04 14:10:13 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst-libs/gst/gl/gstglfilter.c: - gl: fix memory leak - In gst_gl_filter_fixate_caps () it can goto done without freeing the memory of - the tmp GstStructure. This makes it go out of scope and leak. - CID #1265765 - -2015-02-04 11:52:26 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/opencv/MotionCells.cpp: - motioncells: initialize class variables - Some variables are not initialized in the constructor. It is highly unlikely - they are used before being set, but it is safer to initialize them. - CID #1197704 - -2015-02-03 18:13:25 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/winks/kshelpers.c: - ksvideosrc: Fix missing brace warning - There is more but it's from ks.h GUID initializer, which is shipped - this way with mingw. - -2015-02-03 17:44:34 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/winks/gstksvideodevice.c: - * sys/winks/gstksvideodevice.h: - * sys/winks/gstksvideosrc.c: - ksvideosrc: Fix buffer handling - The pseudo buffer pool code was using gst_buffer_is_writable() - alone to try and figure-out if cached buffer could be reused. - It needs to check for memory writability too. Also check map - result and fix map flags. - https://bugzilla.gnome.org/show_bug.cgi?id=734264 - -2015-02-03 17:05:06 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: avoid leaking force keyunit event when going to NULL - Do not set to NULL before unreffing the event or it will leak - -2013-03-18 08:15:00 +0000 Anton Gritsay <anton@angri.ru> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: parse force key unit events with the correct function - Otherwise it won't be parsed and bogus values would be used. - https://bugzilla.gnome.org/show_bug.cgi?id=696032 - -2015-01-26 20:42:25 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: remove update segment logic - This is not needed in 1.x series anymore - -2015-02-03 10:59:16 -0300 Aurélien Zanelli <aurelien.zanelli@darkosphere.fr> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: don't mark streams as needing a new segment on flush - The flush is called on discont and we shouldn't output a new segment - each time a discont happens. So this commit remove the mark for a new - segment when flushing streams by propagating the 'hard' flag passed - on the flusing from the base class. - https://bugzilla.gnome.org/show_bug.cgi?id=743363 - -2015-02-03 17:32:03 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/corevideotexturecache.m: - corevideotexturecache: Add some assertions instead of just dereferencing NULL - -2015-02-03 17:29:25 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/corevideotexturecache.m: - corevideotexturecache: Don't unconditionally use the CoreMedia meta on iOS - We might instead have a CoreVideo meta. - -2015-02-03 14:55:32 +0000 Tim-Philipp Müller <tim@centricular.com> - - * common: - Undo accidental common module rewind - in commit 7d463576 - -2015-02-03 15:38:40 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: Don't dereference NULL frames when draining/flushing - -2015-02-03 15:30:08 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglfilter.c: - gl: remove the egl caps from the src pads - we don't actually support producing EGLImage buffers anywhere. - -2015-02-03 13:32:47 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: put GstGLSyncMeta on output buffers - allows thread safely using the provided output buffer in a separate - thread - -2015-02-03 00:35:26 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: only try the glmemory upload for sysmem/glmemory caps features - Allows selecting/testing the upload path with explicit caps features. - -2015-02-03 00:26:20 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: add missing initilisation of tex_target when copying - fixes: - glcolorscale ! video/x-raw\(meta:GstVideoGLTextureUploadMeta\) ! - glimagesink - -2015-02-03 00:15:30 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: allow NULL buffer for accept vfunc - -2015-02-03 00:13:07 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: remove unsed convert field in private struct - -2015-02-03 00:11:06 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - glupload/download/convert: provide transform_caps functions - Allows finer grain decisions about formats and features at each - stage of the pipeline. - Also provide propose_allocation for glupload besed on the supported - methods. - -2015-02-03 11:07:58 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * common: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gstglwindow_cocoa: fix slow render rate - In gst_gl_window_cocoa_draw we used to just call setNeedsDisplay:YES. That was - creating an implicit CA transaction which was getting committed at the next - runloop iteration. Since we don't know how often the main runloop is running, - and when we run it implicitly (from gst_gl_window_cocoa_nsapp_iteration) we only - do so every 200ms, use an explicit CA transaction instead and commit it - immediately. CA transactions nest and debounce automatically so this will never - result in extra work. - -2015-02-02 23:40:16 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.h: - gstglcaopengllayer: use the correct rectangle type for iOS and OS X - -2015-02-02 21:07:48 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.h: - glcolorconvert: use the correct caps feature for supported caps - glcolorconvert currently only supports converting between GLMemory - targets. - -2015-02-02 20:51:31 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - glsyncmeta: don't use the gst debug object variants - We are not a GObject or any inferable GstMiniObject supported by - the gst debug system. Also fixes a segfault. - -2015-01-30 18:51:17 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglmemory.c: - gl: update unit test for glmemory api change - -2015-01-30 15:13:27 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: clobber the alpha channel by default - this can be disabled with the ignore-alpha property - -2015-01-30 12:32:17 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - Revert "libgstgl: gstglcaopengllayer: set the layer as opaque" - This reverts commit 6f152d381ca21595cdc823f32341c8f2fe71b9c7. - The layer shouldn't be always opaque, it should be made a property. - -2015-01-30 12:22:25 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - libgstgl: gstglcaopengllayer: set the layer as opaque - -2015-01-29 16:30:34 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: Add FIXME comment about possibility of non-Apple YCbCr422 rectangular textures - -2015-01-29 16:26:26 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: Only use GL_TEXTURE_RECTANGLE with OpenGL - It's not defined for GLES. - -2015-01-30 00:28:18 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/corevideotexturecache.h: - * sys/applemedia/corevideotexturecache.m: - * sys/applemedia/vtdec.c: - applemedia: rework GL texture sharing - Use YUV instead of RGB textures, then convert using the new apple specific - shader in GstGLColorConvert. Also use GLMemory directly instead of using the - GL upload meta, avoiding an extra texture copy we used to have before. - -2015-01-28 00:53:59 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: fix CMBlockBufferRef leak - Fix huge leak that went unnoticed for too long. Oops. - -2015-01-28 00:48:27 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - libgstgl: run a custom shader to convert YUV to RGB on mac and ios - When GL_APPLE_ycbcr_422 is available, run a custom shader to convert - GL_TEXTURE_RECTANGLE textures from YUV to RGB. - See https://www.opengl.org/registry/specs/APPLE/ycbcr_422.txt - -2015-01-28 00:43:09 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfassetsrc.m: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/coremediabuffer.h: - * sys/applemedia/vtenc.c: - applemedia: don't call CVPixelBufferLockBaseAddress when doing texture sharing - When doing texture sharing we don't need to call CVPixelBufferLockBaseAddress to - map the buffer in CPU. This cuts about 10% relative cpu time from a vtdec ! - glimagesink pipeline. - -2015-01-28 00:13:46 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstgluploadmeta.c: - gl: initial support for texture targets other than GL_TEXTURE_2D - Make GstGLMemory hold the texture target (tex_target) the texture it represents - (tex_id) is bound to. Modify gst_gl_memory_wrapped_texture and - gst_gl_download_perform_with_data to take the texture target as an argument. - This change is needed to support wrapping textures created outside libgstgl, - which might be bound to a target other than GL_TEXTURE_2D. For example on OSX - textures coming from VideoToolbox have target GL_TEXTURE_RECTANGLE. - With this change we still keep (and sometimes imply) GL_TEXTURE_2D as the - target of textures created with libgstgl. - API: modify GstGLMemory - API: modify gst_gl_memory_wrapped_texture - API: gst_gl_download_perform_with_data - -2015-01-22 13:18:23 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gstglcolorconvert: micro optimization - Don't call glClear && glClearColor at each draw since we're going to draw the - whole viewport anyway. Gets rid of a glFlush triggered by glClear on OSX. - -2015-01-22 13:17:11 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/corevideobuffer.h: - * sys/applemedia/qtkitvideosrc.m: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - applemedia: corevideobuffer: make mapping the CVPixelBuffer in CPU optional - Mapping is not necessary and impacts performance when doing texture sharing with - downstream - -2015-01-22 13:11:46 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gstglcolorconvert: relax caps features check - Require caps to have the GST_CAPS_FEATURE_MEMORY_GL_MEMORY feature but allow - them to have more features. - -2015-01-28 16:43:59 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - opusenc: change audio property to audio-type - This is now an enum with values generic (default) and voice. - https://bugzilla.gnome.org/show_bug.cgi?id=740891 - -2015-01-29 23:45:15 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - gl/win32: fixup compilation - -2015-01-29 11:54:35 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiovisualizers/gstwavescope.c: - audiovisualizer: remove double-setting of render function - No need to set the audiovisualizer->render function twice. Once is enough. - -2015-01-29 22:25:00 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - glwindow: make showing a window explicit - Also fixes the cgl context always displaying a window to render to for - every GstGLContextCocoa created - -2015-01-26 17:06:29 +0100 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Cleanup locking around AggregatorPad flush related fields - And document the locking - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-26 13:11:05 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: keep chain functions as dumb as possible. - + A pad chain function has no business checking other pads, - that's what the aggregate thread is for. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-26 11:32:47 +0100 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.c: - aggregator: More fixes around locking when accessing protected private fields - In some more places we were accessing GstAggregator->segment - and GstAggregator->seqnum without holding the GST_OBJECT_LOCK - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-26 11:29:08 +0100 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * gst/audiomixer/gstaudiomixer.c: - aggregator: Make the PAD_LOCK private - Instead of using the GST_OBJECT_LOCK we should have - a dedicated mutex for the pad as it is also associated - with the mutex on the EVENT_MUTEX on which we wait - in the _chain function of the pad. - The GstAggregatorPad.segment is still protected with the - GST_OBJECT_LOCK. - Remove the gst_aggregator_pad_peak_unlocked method as it does not make - sense anymore with a private lock. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-26 11:25:54 +0100 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst/audiomixer/gstaudiomixer.c: - * tests/check/libs/aggregator.c: - aggregator: Hide GstAggregatorPad buffer and EOS fileds - And add a getter for the EOS. - The user should always use the various getters to access - those fields - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-21 19:09:13 -0500 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/audiomixer.c: - audiomixer: Make flush start/stop test non-racy - The flush stop could have happened between the source trying - to push the segment event and the buffer, this would cause a warning. - Prevent that by taking the source's stream lock while flushing. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-22 17:41:24 -0500 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/audiomixer.c: - audiomixer: Replace racy timeout based tested with drain query - Using the drain query, we can be certain that the buffer has done going - through the aggregator by taking the stream locks. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-21 18:41:43 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Document locking of GstAggregatorPrivate members - Most of them are protected by the object lock, specify - which ones use a different lock. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-21 18:47:09 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.h: - aggregator: Document how the segment is protected - Document that it can only be accessed with the object lock. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-21 19:44:57 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Protect all latency related members with the object lock - The locking was not consistent, now consistently use the object lock. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-21 19:43:12 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * gst-libs/gst/video/gstvideoaggregator.c: - aggregator: Document locking for gst_aggregator_get_latency_unlocked() - Renamed it to _unlocked() to make it clear. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-21 19:35:25 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Protect the srcpad caps negotiation with the stream lock - Instead of adding another lock, use the srcpad stream lock, which is already - taken anyway to push out the new caps if needed. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-21 19:33:18 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Protect the tags with the object lock - The tags related variables were sometimes protected, sometimes not and - sometimes atomic. Put them all under the object lock. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-21 19:32:34 -0500 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/audiomixer.c: - audiomixer: Avoid race in caps negotiation - With the current audiomixer, the input caps need to be the same, - otherwise there is an unavoidable race in the caps negotiation. So - enforce that using capsfilters - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-21 18:53:20 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Consistenly lock the flow_return state - Use the object's lock to protect it. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-21 18:47:40 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Clear GstAudioInfo the the caps - When clearing the caps, also clear the matching GstAudioInfo - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-21 18:45:36 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Consistently lock some members - Some members sometimes used atomic access, sometimes where not locked at - all. Instead consistently use a mutex to protect them, also document - that. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-21 18:39:24 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Don't reset caps on flush - A flush event doesn't invalidate the previous caps event. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-14 14:45:06 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Lock access to members of GstAggregatorPad - Take the pad's object lock before accessing members of the - GstAggregatorPad structure. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-14 14:38:09 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: Protect exported pad members with the pad's object lock - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-14 14:35:15 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * gst/audiomixer/gstaudiomixer.c: - aggregator: Replace event lock with pad's object lock - Reduce the number of locks simplify code, what is protects - is exposed, but the lock was not. - Also means adding an _unlocked version of gst_aggregator_pad_steal_buffer(). - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-09 22:01:00 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Protect data with the same mutex as GCond - Whenever a GCond is used, the safest paradigm is to protect - the variable which change is signalled by the GCond with the same - mutex that the GCond depends on. - https://bugzilla.gnome.org/show_bug.cgi?id=742684 - -2015-01-29 02:28:38 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: If getting a timeout before having caps, just advance our position - This can happen if this is a live pipeline and no source produced any buffer - and sent no caps until an output buffer should've been produced according to the - latency. - This fix is similar in spirit to commit be7034d1 by Sebastian for audiomixer. - -2015-01-29 17:31:09 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.h: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/calayer: add resize callback based on the bounds rectangle - -2015-01-29 15:26:21 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - gl/caopengllayer: draw asynchronously - This essentially makes the CAOpenGLLayer draw every refresh cycle. - -2015-01-28 17:59:42 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: don't segfault if we have a NULL draw/resize/close callback - -2015-01-28 17:16:14 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.h: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - cgl/calayer: use a callback instead of hardcoding the draw functionality - -2015-01-28 17:13:05 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/Makefile.am: - cgl: install the gl context and gl layer headers - -2015-01-28 17:05:14 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.h: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - cgl: add a header for the CAOpenGLLayer support - -2015-01-28 17:02:59 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Always lock the mutex before starting the streams - -2015-01-28 16:58:27 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Fix deadlock - -2015-01-28 15:48:26 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink{audio,video}sink: Only start scheduled playback once both sources are ready and we are in PLAYING - Otherwise we might start the scheduled playback before the audio or video streams are - actually enabled, and then error out later because they are enabled to late. - We enable the streams when getting the caps, which might be *after* we were - set to PLAYING state. - -2015-01-28 15:26:17 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink{audio,video}src: Only start the streams once both sources are ready and we are in PLAYING - Otherwise we might start the streams before the audio or video streams are - actually enabled, and then error out later because they are enabled to late. - We enable the streams when getting the caps, which might be *after* we were - set to PLAYING state. - -2015-01-28 14:21:40 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Make sure our clock never returns NONE, always advances and does not jump when going from PAUSED to PLAYING - It basically behaves the same as the audio clocks. - -2015-01-28 12:20:05 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Handle the clock returning GST_CLOCK_TIME_NONE properly - -2015-01-28 11:41:17 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideo{sink,src}: Make elements more similar to the audio elements by enabling the video input/output only when getting the actual caps - This will also make it easier later to support caps changes and support - selecting the mode based on the caps if that should ever be implemented. - -2015-01-26 19:02:04 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Properly report caps if mode!=auto and handle caps changes properly for mode=auto - -2015-01-26 18:27:10 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Don't release input device twice on errors in set_caps() - -2015-01-27 11:25:53 +0100 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - gl/dispmanx: fix build - Commit ab48bb6f0f55091662e595a001e178154ce60cdb changed the API of - GstGLWindow. - -2015-01-27 14:52:47 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: more compatibility defines for gles2 systems - -2015-01-27 12:15:43 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - glmemory: add some thread safety for gl operations - -2015-01-27 11:53:51 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - glmemory: use pbo's for download - In order to use pbo's efficiently, the transfer operation has to - be separated from the use of the downloaded data which requires some - rearchitecturing around glcolorconvert/gldownload and elements - -2015-01-27 11:04:07 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/glprototypes/base.h: - glprototypes: add some (un)map buffer variants for GL/GLES - -2015-01-26 17:51:22 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: use audio_%02u and video_%02u names for pads - Instead of using the default ghostpad%u naming. The audio_/video_ - names are more common in demuxers - -2015-01-26 15:33:23 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklinkaudiosrc: Release the audio input on errors, not the video input - -2015-01-26 13:46:44 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/aiff/aiffparse.c: - aiffparse: remove unnecessary variable - The bps variable is declared with value aiff->bps, read once and never written. - aiff->bps can be used directly instead. - -2015-01-26 12:49:45 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/aiff/aiffparse.c: - aiffparse: fix which stop variable is used in assignment - Assignment is done to variable segment.stop when the intention was to assign to - local variable stop. Instead of overwriting it, the value is now clamped and - segment.stop is set to it soon after. - CID #1265772 - -2015-01-26 09:22:23 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: fix crash when receiving buffer without timestamps - Unset out buffer in clip function when we unref the buffer to be - clipped, otherwise aggregator will continue to use the already- - freed buffer. Fixes crash when buffers without timestamps are - being fed to aggregator. Partly because aggregator ignores the - error flow return. - https://bugzilla.gnome.org/show_bug.cgi?id=743334 - -2015-01-18 18:05:31 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * sys/Makefile.am: - * sys/directdraw/Makefile.am: - * sys/directdraw/gstdirectdrawplugin.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - * win32/MANIFEST: - * win32/vs6/libgstdirectdraw.dsp: - * win32/vs8/libgstdirectdraw.vcproj: - Remove unported directdraw plugin - This API has been deprecated for eternities and microsoft - stopped shipping the headers in 2010 accoding to wikipedia, - so let's just remove it and focus on bringing the plugins - based on the newer APIs up to snuff. - -2014-03-26 17:43:33 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/aiff/aiffmux.c: - aiffmux: write padding byte at end of SSND chunk if needed - AIFF chunks are supposed to be even aligned. - Aligning the SSND chunk will allow the aiff muxer to properly write - chunks (like the ID3 one) at the end of the file. - https://bugzilla.gnome.org/show_bug.cgi?id=727402 - -2015-01-23 12:44:22 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Free leaked GstStructure - Coverity CID : 1256565 - -2015-01-23 12:41:29 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/gl/gstgltestsrc.c: - gltestsrc: Ensure variable is initialized before usage - Coverity CID: 1256569 - -2015-01-23 12:26:16 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/codecparsers/dboolhuff.c: - codecparsers: Indent file - Someone's been commiting without using gst-indent :) - -2015-01-23 12:24:52 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/nalutils.h: - codecparsers: Add READ_UE_MAX macro - READ_UE_ALLOWED was almost exclusively used with min == 0, which doesn't - make much point for unsigned integers. - Add a READ_UE_MAX variant and use that instead. Also replaced two usages - of CHECK_ALLOWED (a,0,something) by CHECK_ALLOWED_MAX (a, something) - -2015-01-23 12:28:42 +0530 Arun Raghavan <arun@centricular.com> - - * gst/inter/gstintervideosrc.c: - intervideosrc: Fix GAP flag setting on non-black frames - The previous commit fixed setting the GAP flag on black frames, but - incorrectly dropped the flag on repeated pushes of the same video - buffer. - -2015-01-23 17:27:42 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglupload.c: - gl/tests: update glwindow api change - -2015-01-23 16:52:25 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - gl/window/eagl: fix a couple of typos - -2015-01-23 16:39:44 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglwindow.h: - glwindow: cleanup/reorganize functions/members into logical groups - -2015-01-23 15:02:55 +1100 Matthew Waters <matthew@centricular.com> - - * sys/applemedia/corevideotexturecache.m: - applemedia: update for gstgl cocoa -> cgl change - -2015-01-23 14:18:12 +1100 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/qt/qglwtextureshare/cocoa_utils.mm: - gl/qt/examples: update for NSOpenGL -> CGL change - -2015-01-23 14:11:48 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - glwindow: remove width/height from _draw() - Depending on the platform, it was only ever implemented to 1) set a - default surface size, 2) resize based on the video frame or 3) nothing. - Instead, provide a set_preferred_size () that elements/applications - can use to request a certain size which may be ignored for - videooverlay/other cases. - -2015-01-22 21:43:51 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - glcontext/cocoa: avoid destroying a possibly 0 GSource id - -2015-01-20 22:01:39 +1100 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/cocoa/Makefile.am: - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcaopengllayer.m: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: move to CGL and CAOpenGLLayer for rendering - Removes the use of NSOpenGL* variety and functions. Any Cocoa - specific functions that took/returned a NSOpenGL* object now - take/return the CGL equivalents. - -2015-01-22 16:08:11 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - glcontext/cocoa: add debug category - -2015-01-22 10:50:23 +0530 Arun Raghavan <arun@centricular.com> - - * gst/inter/gstintervideosrc.c: - intervideosrc: Fix GAP flag setting on black frames correctly - This did not actually work since the video_buffer was set to NULL after - the first black frame. - Reported by: Patrik Oldsberg <patrik.oldsberg@ericsson.com> - -2015-01-21 23:37:10 +0530 Arun Raghavan <arun@centricular.com> - - * gst/inter/gstintervideosrc.c: - intervideosrc: Fix max value of the timeout property - Reported by: Patrik Oldsberg <patrik.oldsberg@ericsson.com> - -2015-01-21 23:35:55 +0530 Arun Raghavan <arun@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264: Implement the preset interface - Will be useful when we want to set presets on the encoder via encodebin - or such. - -2015-01-21 15:31:21 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: sync with base class in -base - https://bugzilla.gnome.org/show_bug.cgi?id=742875 - -2015-01-21 15:06:21 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: ensure default query/event handlers are used - Sync audiovisualizer class implementation to the one in gst-plugins-base. This - commit matches 9dd0e6cccc971d8a6bcca4e9e4d2ee1dbb20fffa in that module. - https://bugzilla.gnome.org/show_bug.cgi?id=742875 - -2015-01-21 10:18:11 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/siren/decoder.c: - * gst/siren/encoder.c: - siren: Make some local variables non-static for thread-safety - Otherwise we will override values from another thread if we encode - or decode frames at the same time in different threads. - -2015-01-21 10:17:04 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/apexsink/gstapexsink.c: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsrc.c: - * ext/bs2b/gstbs2b.c: - * ext/dash/gstmpdparser.c: - * ext/faac/gstfaac.c: - * ext/gl/gstglfilterreflectedscreen.c: - * ext/openh264/gstopenh264enc.cpp: - * ext/voamrwbenc/gstvoamrwbenc.c: - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/gl/gstglupload.c: - * gst/adpcmenc/adpcmenc.c: - * gst/freeverb/gstfreeverb.c: - * gst/librfb/d3des.c: - * gst/mpeg1sys/buffer.c: - * gst/mpegpsmux/crc.h: - * gst/patchdetect/gstpatchdetect.c: - * gst/tta/filters.h: - * gst/vbidec/gstvbidec.c: - * gst/vbidec/vbidata.c: - * sys/dvb/camapplication.c: - * sys/dvb/camtransport.c: - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dxr3/dxr3videosink.c: - * sys/linsys/gstlinsyssdisink.c: - * sys/qcam/gstqcamsrc.c: - Constify some static arrays everywhere - -2015-01-21 08:49:23 +0100 Edward Hervey <bilboed@bilboed.com> - - * po/POTFILES.in: - po: Fix list of files tracked - sfsink/sfsrc haven't been ported (and therefore dist'ed) in 1.x - -2014-12-09 09:58:03 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: minor debug update - Only show PTS/DTS when they are valid, and include the stream id - -2015-01-20 14:55:05 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: do not skip the first fragment - Avoid advancing fragment right after downloading the header. If it - is the header, by default, don't advance to the next fragment. - -2015-01-20 16:57:15 +0100 Piotr Drąg <piotrdrag@gmail.com> - - * po/POTFILES.in: - po: update POTFILES - https://bugzilla.gnome.org/show_bug.cgi?id=743251 - -2015-01-16 19:32:15 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: expose stereo-high profile - Exposing stereo-high profile as a compatible profile of multiview-high - if the maximum number of encoded views in the stream is two. - https://bugzilla.gnome.org/show_bug.cgi?id=743174 - -2015-01-19 17:31:26 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: parse SPS subset - This patch calls gst_h264_parser_parse_subset_sps() when a - SPS subset NAL type is found. - All the bits required for parsing the SPS subset in NALs were - already there, just we need to call them when the this NAL type - is found. - With this parsing, the number of views (minus 1) attribute is - filled, which was a requirement for negotiating the stereo-high - profile. - https://bugzilla.gnome.org/show_bug.cgi?id=743174 - -2013-03-19 14:23:00 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: add initial support for MVC NAL units. - Initial support for MVC NAL units. It is only needed to propagate the - complete set of NAL units downstream at this time. - https://bugzilla.gnome.org/show_bug.cgi?id=696135 - Signed-off-by: Sreerenj Balachandran <sreerenj.balachandran@intel.com> - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2015-01-20 09:23:02 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: add explicit cast to make clang happy - Fixes compilation - -2015-01-15 17:44:45 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: refactor chunk downloading flow - Add more power to the chunk_received function (renamed to data_received) - and also to the fragment_finish function. - The data_received function must parse/decrypt the data if necessary and - also push it using the new push_buffer function that is exposed now. The - default implementation gets data from the stream adapter (all available) - and pushes it. - The fragment_finish function must also advance the fragment. The default - implementation only advances the fragment. - This allows the subsegment handling in dashdemux to continuously download - the same file from the server instead of stopping at every subsegment - boundary and starting a new request - -2015-01-19 12:37:23 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/compositor/blend.c: - compositor: fix illegal memory access in blend function with negative ypos - https://bugzilla.gnome.org/show_bug.cgi?id=741115 - -2015-01-19 08:37:59 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: add log message about segment time information - For debugging purposes - -2015-01-19 08:36:42 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix multi-period playback - If we say it is the first segment after a new period it will resync - the segment.start value and all buffers will be late for the new period - we are trying to play. Otherwise we want to keep the segment.start with - the previous value to allow the running time to smoothly increase - -2015-01-19 11:23:52 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix compiler warning with clang - gstdashdemux.c:1330:13: error: implicit conversion from enumeration type 'enum _GstAdaptiveDemuxFlowReturn' to different enumeration type - 'GstFlowReturn' -Werror,-Wenum-conversion - ret = GST_ADAPTIVE_DEMUX_FLOW_SUBSEGMENT_END; - ~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -2015-01-18 21:05:44 +0100 Nicola Murino <nicola.murino@gmail.com> - - * ext/gl/gstglimagesink.c: - glimagesink: fix memleak - https://bugzilla.gnome.org/show_bug.cgi?id=743142 - -2015-01-18 17:25:35 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * gst/real/Makefile.am: - * gst/real/gstreal.c: - * gst/real/gstreal.h: - * gst/real/gstrealaudiodec.c: - * gst/real/gstrealaudiodec.h: - * gst/real/gstrealvideodec.c: - * gst/real/gstrealvideodec.h: - Remove real plugin which is no longer needed and has never been ported - Decoders for these formats exist in gst-libav, if anyone - still has a need for them. - -2015-01-18 17:10:37 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * ext/Makefile.am: - * ext/mythtv/Makefile.am: - * ext/mythtv/gstmythtvsrc.c: - * ext/mythtv/gstmythtvsrc.h: - * gst-plugins-bad.spec.in: - Remove libgmyth-based MythTV source element which was never ported - gmyth seems to be unmaintained upstream, and no one has asked - for this to be ported for a very long time, so let's just - remove it. Neither debian nor Fedora seem to ship libgmyth - any longer, and in any case it's most likely deprecated by - the UPnP support in MythTV. - -2015-01-17 10:06:40 +1100 Lasse Laursen <lasse@lasselaursen.com> - - * gst-libs/gst/gl/gstglapi.h: - glapi: fix compilation with latest MSVC - https://bugzilla.gnome.org/show_bug.cgi?id=743041 - -2015-01-15 12:57:59 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: use the correct size for the pbo - It was missing the GstVideoAlignment padding which could cause GL - errors related to overrunning the size of the pbo. - -2015-01-16 16:18:35 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: prevent early EOS when switching at last fragment - Check if there is a next fragment before advancing to avoid causing - a bitrate switch (and maybe exposing new pads) only to push EOS. - This causes playback to stop with an error instead of properly - finishing with EOS message. - -2015-01-13 14:22:02 +0000 David Waring <david.waring@rd.bbc.co.uk> - - * ext/dash/gstmpdparser.c: - dashdemux: Fix detection for the end of segment. - The segment start time is calculated as the offset into the current segment. - The old condition to detect the end of period (i.e. segment start time > - period start + period duration) failed when the period start was not 0 since - the segment start time does not take the period start time into account. - Fix this detection by only comparing the segment start to the period duration. - https://bugzilla.gnome.org/show_bug.cgi?id=733369 - -2015-01-14 23:11:15 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: remove unused segment attribute - It was never used, only initialized - -2015-01-12 17:40:47 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: implement ISOBMFF profile handling - The ISOBMFF profile allows definind subsegments in a segment. At those - subsegment boundaries the client can switch from one representation to - another as they have aligned indexes. - To handle those the 'sidx' index is parsed from the stream and the - entries point to pts/offset of the samples in the stream. Knowing that - the entries are aligned in the different representation allows the client - to switch mid fragment. In this profile a single fragment is used per - representation and the subsegments are contained in this fragment. - To notify the superclass about the subsegment boundary the chunk_received - function returns a special flow return that indicates that. In this case, - the super class will check if a more suitable bitrate is available and will - change to the same subsegment in this new representation. - It also requires special handling of the position in the stream as the - fragment advancing is now done by incrementing the index of the subsegment. - It will only advance to the next fragment once all subsegments have been - downloaded. - https://bugzilla.gnome.org/show_bug.cgi?id=741248 - -2015-01-12 11:57:02 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/Makefile.am: - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstisoff.c: - * ext/dash/gstisoff.h: - dashdemux: parse the sidx index from isobmff streams - Allows dashdemux to identify the subsegments in the stream and - switch bitrates when needed - -2015-01-09 16:43:03 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: check for profiles - Check for available profiles to enable certain features for - dash playback. For now we check for the ISOFF On Demand 2011 profile. - -2015-01-13 10:16:22 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: add a special return to signal subsegment boundary - The subsegment boundary return tells the adaptivedemux that it can - try to switch to another representation as the stream is at a suitable - position for starting from another bitrate. - -2015-01-13 10:15:21 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Actually use the byte range for the fragment url - Otherwise we would always download the full fragment. This would - make handling subsegments in DASH impossible. - -2015-01-13 10:13:47 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: allow downloads of headers only - In order to get some subsegment information, subclasses might want - to download only the headers to have enough data (the index) - to decide where to start downloading from the subsegment. - -2015-01-12 18:22:14 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: refactor common code to function - Reuse the same function when finishing downloading and signaling to - the download loop thread to get the next fragment or abort - -2015-01-09 17:19:54 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: inform subclass when headers/index are being downloaded - This allows the subclasses to know if the chunks that are downloaded are - part of the header or of the index and will parse the parts that are - of their interest. - -2015-01-15 16:11:24 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: a few leak fixes - -2015-01-15 13:16:07 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/uridownloader/gstfragment.c: - fragment: fix caps and buffer leaks in get_property - -2015-01-14 17:43:51 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/hls/gsthlsdemux.h: - hlsdemux: remove unused fragments_cache field - -2015-01-14 16:42:25 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/hls/gsthlsdemux.c: - hlsdemux: a few leak fixes - -2015-01-12 21:22:06 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/bs2b/gstbs2b.c: - bs2b: implement the preset interface - Instead of a preset property implement the preset interface in a read-only - fashion. - -2015-01-12 12:11:01 +0100 Stefan Sauer <ensonic@users.sf.net> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-bs2b.xml: - docs: add new bs2b plugin and element - -2015-01-10 21:41:12 +0100 Christoph Reiter <reiter.christoph@gmail.com> - - * configure.ac: - * ext/Makefile.am: - * ext/bs2b/Makefile.am: - * ext/bs2b/gstbs2b.c: - * ext/bs2b/gstbs2b.h: - bs2b: add new plugin (Effect/Audio, crossfeed) - https://bugzilla.gnome.org/show_bug.cgi?id=611689 - -2015-01-15 13:13:51 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosink.c: - interaudiosink: Make sure that buffer time is always bigger than period time - -2015-01-15 12:49:20 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Also consider max-lateness property value before dropping late frames - -2015-01-15 14:09:43 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/corevideotexturecache.m: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - vtdec: implement the GL texture upload meta - -2015-01-09 00:16:17 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/corevideotexturecache.h: - * sys/applemedia/corevideotexturecache.m: - avfvideosrc: implement the GL texture upload meta - -2015-01-15 09:47:45 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixerpad.h: - * ext/gl/gstglvideomixer.c: - glvideomixer: don't upload if alpha <= 0 - Implemented using a upload_buffer vfunc within GstGLMixer allowing - NULL uploaded buffers. - -2015-01-15 09:45:21 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: remove spurious gst_video_info_align - That will be taken care of by the calling code (typically a bufferpool). - The GstVideoAlignment is purely informational to compute plane data sizes. - -2015-01-14 23:48:16 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/compositor/compositor.c: - compositor: Document the zorder pad property from gstvideoaggregator - -2015-01-14 23:47:19 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Nitpick spacing/punctuation in debug logging - -2015-01-14 16:33:53 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Stop scheduled playback shortly in PAUSED->PLAYING if it was running already - This fixes handling of flushing seeks, where we will get a PAUSED->PLAYING - state transition after the previous one without actually going to PAUSED - first. - -2015-01-14 16:01:07 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklinkvideosink: Don't schedule too late frames in prepare() - Otherwise we will overflow the internal buffer of the hardware - with useless frames and run into an error. This is necessary until - this bug in basesink is fixed: - https://bugzilla.gnome.org/show_bug.cgi?id=742916 - -2015-01-14 15:54:28 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklinkvideosink: Keep track of the time when we went to PLAYING for the external clock too - Otherwise we're adding an offset of the time the pipeline was in PLAYING - already to the running time when converting it to our internal clock. - -2015-01-14 13:32:51 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Enable QoS and set max-lateness to 20ms - -2015-01-12 17:24:52 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: fix stack smashing - Ensure that we do not trust the bitstream when filling a table - with a fixed max size. - Additionally, the code was not quite matching what the spec says: - - a value of 3 broke from the loop before adding an entry - - an unhandled value did not add an entry - The reference algorithm does these things differently (7.3.3.1 - in ITU-T Rec. H.264 (05/2003)). - This plays (apparently correctly) the original repro file, with - no stack smashing. - Based on a patch and bug report by André Draszik <git@andred.net> - -2015-01-14 22:08:43 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixerpad.h: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * tests/check/libs/gstglcolorconvert.c: - gl: split glcolorconvert usage from glupload - the separation allows the transfer operation to occur in a separate - thread/time which may increase performance in specific circumstances. - -2015-01-14 12:39:11 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: offset the data pointer for upload for GstVideoAlignment - otherwise we attempt to read from the padding data - -2015-01-14 00:08:11 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - glmemory: use pbo's for upload - -2015-01-13 23:47:06 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: relax the GLMemory uploader check for input caps features - As there may be a sysmem caps features with GLMemory filled buffers. - e.g. - videotestsrc ! glimagesink - -2015-01-13 11:32:03 -0800 Zaheer Abbas Merali <zaheermerali@gmail.com> - - * configure.ac: - * ext/openh264/gstopenh264dec.cpp: - * ext/openh264/gstopenh264enc.cpp: - Revert "Revert "openh264: fix to work with released versions and master of upstream"" - This reverts commit 329f0ccba1aa604da1bd80293fd1fe717447df5d. - -2014-12-17 09:19:52 -0800 Zaheer Abbas Merali <zaheermerali@gmail.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264: remove all trace output to console from encoder - -2015-01-13 19:56:24 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - decklink: Use BT2020 colorspace for UltraHD resolutions - -2015-01-13 19:55:37 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - decklink: Fix indention once again - -2015-01-13 16:49:07 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: handle the return of the setup function - Make the class future proof by handling the gboolean return of the setup - function. So if/when a child class uses this the base class is ready. - -2015-01-13 16:46:10 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - Revert "audiovisualizer: remove unused value" - This reverts commit 25c97570834d6de1c14424e71221d19eb0d33ee3. - It is preferable to handle the retun of the setup function. - -2015-01-13 17:44:17 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Get our own "start time" instead of the one of the pipeline - decklinkvideosink might be added later to the pipeline, or its state might - be handled separately from the pipeline. In which case the running time when - we (last) went into PLAYING state will be different from the pipeline's. - However we need our own start time to tell the Decklink API, which running - time should be displayed at the moment we go to PLAYING and start scheduled - rendering. - -2015-01-13 17:00:51 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintervideosink.c: - inter: Use a #define for the default value of the channel property - -2015-01-13 16:58:50 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstintervideosrc.c: - * gst/inter/gstintervideosrc.h: - intervideosrc: Make the timeout configurable after which we start showing a black frame - -2015-01-13 15:42:26 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: remove unused value - klass->setup (scope) will always return TRUE since all children of this class - do so, no need to store the return. Besides, the value is overwritten a few - lines down before it is used. - Change helps keep files in sync after: - -base commit a91d521a3602f33083405467db9454d422b9da1b - -2015-01-13 14:54:26 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/compositor.c: - compositor: Don't do any conversions if the pad is completely transparent anyway - -2015-01-12 12:58:27 +0100 Branislav Katreniak <bkatreniak@nuvotechnologies.com> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintervideosrc.c: - inter: silence messages for flushed / created samples - These messages are logged periodically and polute the log - https://bugzilla.gnome.org/show_bug.cgi?id=741592 - -2014-12-25 23:10:19 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: fix memleak - https://bugzilla.gnome.org/show_bug.cgi?id=741943 - -2014-12-25 22:59:42 +0100 Nicola Murino <nicola.murino@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: fix some memory leaks - https://bugzilla.gnome.org/show_bug.cgi?id=741943 - -2014-12-31 17:45:53 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * tests/check/libs/gstglcontext.c: - glcontext: allow wrapped contexts to be utilised like non-wrapped contexts - Fill in the missing pieces like get_proc_address, the gl function vtable - -2015-01-12 21:25:14 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst-libs/gst/video/.gitignore: - * gst/compositor/.gitignore: - * tests/check/pipelines/.gitignore: - gitignore: ignore more files - -2015-01-12 15:33:09 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - visual: use unused value - ret is assigned but not used and in the next cycle of the loop it is overwritten - with default_prepare_output_buffer (). If there is a flow error the function - should return instead. - CID #1226475 - -2015-01-12 16:10:31 +0100 Stefan Sauer <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From f2c6b95 to bc76a8b - -2015-01-12 15:57:53 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - decklink: Initialize refcount of our C++ classes in the constructor - CID 1262288 - CID 1262287 - CID 1262289 - -2015-01-12 14:22:47 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstdilate.c: - gaudieffects: stored value is overwritten - Value from left_luminance is assigned to out_luminance here, but that stored - value is not used before it is overwritten in the next cycle of the loop. - Removing assignation. - CID #1226473 - -2015-01-12 12:50:33 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: fix dead code - found is initialized to FALSE to then only be used in two conditional statements - that will always be false, making the blocks inside them dead code. Looking back - in the file's history the setting of the variable's value before it is checked - was dropped as part of the port to 0.11, bringing that value setting back. - https://bugzilla.gnome.org/show_bug.cgi?id=742638 - -2015-01-11 20:40:34 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: minor optimisation when scanning for SCRs - Bail out early when we're scanning for SCR, no need to - parse stuff we're not going to use nor interested in. - -2015-01-11 01:08:08 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: fix compiler warning and simplify checks in set_caps - https://bugzilla.gnome.org/show_bug.cgi?id=740195 - -2015-01-03 13:06:45 +0100 Carlos Rafael Giani <dv@pseudoterminal.org> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: rework set_format code so mpg123audiodec works with decodebin/playbin - The old code was using gst_caps_normalize() and was generally overly - complex. Simplify by picking sample rate and number of channels from - upstream and the sample format from the allowed caps. If the format caps - is a list of strins, just pick the first one. And if the srcpad isn't - linked yet, use the default format (S16). - https://bugzilla.gnome.org/show_bug.cgi?id=740195 - -2015-01-10 15:34:57 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - gl/cocoa: Disable hack for NSApp iteration with a special #define - The hack causes deadlocks and other interesting problems and it really - can only be fixed properly inside GLib. We will include a patch for - GLib in our builds for now that handles this, and hopefully at some - point GLib will also merge a proper solution. - A proper solution would first require to refactor the polling in - GMainContext to only provide a single fd, e.g. via epoll/kqueue - or a thread like the one added by our patch. Then this single - fd could be retrieved from the GMainContext and directly integrated - into a NSRunLoop. - https://bugzilla.gnome.org/show_bug.cgi?id=741450 - https://bugzilla.gnome.org/show_bug.cgi?id=704374 - -2015-01-10 15:40:30 +1100 Jan Schmidt <jan@centricular.com> - - * gst/inter/gstinteraudiosrc.c: - inter: interaudiosrc - fixate layout for default caps - Makes interaudiosrc produce valid audio caps in the absence of any other - guidance by adding to the pad template and fixate function - -2015-01-09 21:51:40 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Remove pointless atomic - It is only modified from the streaming thread - -2015-01-09 21:30:36 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Fix query leak - -2015-01-09 17:56:09 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiovisualizers/gstwavescope.c: - audiovisualizer: remove check for below zero for unsigned value - CLAMP checks both if value is '< 0' and '> max'. Value will never be a negative - number since it is an unsigned integer. Removing that check and only checking if - it is bigger than max and setting it appropriately. - Also converting the previous instance of this into MIN() for consistency. - CID 1139793 - -2014-12-02 10:10:39 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: expose compatible profiles to downstream - Some video bitstreams report a too restrictive set of profiles. If a video - decoder was to strictly follow the indicated profile, it wouldn't support that - stream, whereas it could in theory and in practice. So we should relax the - profile restriction for allowing the decoder to get connected with parser. - https://bugzilla.gnome.org/show_bug.cgi?id=739992 - -2015-01-09 16:43:39 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Print jitter from clock waiting in the debug logs - -2015-01-09 14:42:34 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/audiovisualizers/gstwavescope.c: - audiovisualizer: remove check if below zero for unsigned value - CLAMP checks both if y is '< 0' and '> h1'. y will never be a negative number - since it is an unsigned integer. Removing that check and only checking if it - bigger than h1 and setting it to that max approprietaly. - CID 1139792 - -2015-01-08 16:24:29 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: cache current file position in the list - Avoids iterating the list everytime to look for the next segment - to be used (or to advance to the next one). - -2015-01-08 15:46:49 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/m3u8.c: - hlsdemux: simplify next segment checking functions - Optimize loop by moving condition outside of it and reuse the - find_next_fragment function to check if there is next instead of - replicating the same loop - -2015-01-08 13:03:11 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: cache total duration to avoid iterating at every query - Duration queries can be done a few times per second and would cause - the segment list to be traversed for every one. Caching the duration - prevents that. - -2015-01-08 18:15:27 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Post LATENCY message when the mode changes - Different modes have different framerates, and thus different latencies. We - might need to reconfigure the latency of the pipeline. - -2015-01-08 18:14:38 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Fix compiler warning - -2015-01-08 16:42:31 +0100 Florian Langlois <florian.langlois@fr.thalesgroup.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklinkvideosrc: Add automatic mode detection - https://bugzilla.gnome.org/show_bug.cgi?id=739284 - -2015-01-08 15:54:18 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/hls/m3u8.c: - hlsdemux: g_return_if_fail in function with return type - Need to use g_return_val_if_fail() when the function returns a type, in this - case a gboolean - -2015-01-08 15:36:04 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/rtp/gstrtph265pay.c: - rtp: value truncated too short creates dead code - type is truncated to 0-31 with "& 0x1f", but right after that it is checks if - the value is equivalent to GST_H265_NAL_VPS, GST_H265_NAL_SPS, and - GST_H265_NAL_PPS (which are 32, 33, and 34 respectively). Obviously, this will - never be True if the value is maximum 31 after the truncation. - The intention of the code was to truncate to 0-63. - -2015-01-08 15:27:44 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/rtp/gstrtph265depay.c: - rtp: fix nal unit type check - After further investigation the previous commit is wrong. The code intended to - check if the type is 39 or the ranges 41-44 and 48-55. Just like gsth265parse.c - does. Type 40 would not be complete. - -2015-01-08 13:47:09 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/rtp/gstrtph265depay.c: - rtp: fix dead code and check for impossible values - nal_type is the index for a GstH265NalUnitType enum. There are two types of dead - code here: - First, after checking if nal_type is >= 39 there are two OR conditionals that - check if the value is in ranges higher than that number, so if nal_type >= 39 - falls in the True branch those other conditions aren't checked and if it falls - in the False branch and they are checked, they will always also be False. They - are redundant. - Second, the enum has a range of 0 to 40. So the checks for ranges higher than 41 - should never be True. - Removing this redundant checks. - CID 1249684 - -2015-01-08 14:47:16 +0100 Florian Zwoch <fzwoch@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: Unlock the stream lock while waiting for pending frames to be completed in finish() - We might otherwise deadlock because gst_vtenc_enqueue_buffer() can be - called again and will take the stream lock again from another thread. - https://bugzilla.gnome.org/show_bug.cgi?id=742174 - -2015-01-08 08:46:48 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: implement _has_next_fragment to avoid busy looping - It will allow the demuxer to wait for a fragment to be available instead - of busy looping polling the playlist for a new fragment - -2015-01-08 12:55:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Add a dummy value to the video connection mapping table for auto - -2015-01-08 12:48:22 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - decklinkaudiosrc: Add property to select the audio input connection - -2015-01-08 12:23:53 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - decklink: Add XLR and RCA audio connection enums - -2015-01-08 12:17:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklinkvideosrc: Add auto value for the connection property - This will use the default/auto connection for video capturing, and can - be set via the Decklink configuration tools. - -2015-01-08 12:13:03 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Fix indention once again - -2015-01-06 14:02:38 +0100 Florian Langlois <florian.langlois@fr.thalesgroup.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink: Add property for configuring the input connection of the video sources - -2015-01-08 09:35:23 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - gl/cocoa: Don't init and clear static GMutex / GCond - We would potentially use it from the main loop later in - gst_gl_window_cocoa_init_nsapp() if it timed out before. - -2015-01-07 16:53:41 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: remove logically dead code - Soon after setting two variables to 1, the code checks if their values are - different from each other. This would never be true. Removing this. - CID 1226443 - -2015-01-07 16:40:25 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/videoparsers/gstpngparse.c: - * gst/videoparsers/gstpngparse.h: - Revert "pngparse: improve parsing of the image" - This reverts commit 59e7f0597d1cc524174e847de7b91407922304c8. - This patch should not have been pushed, see - https://bugzilla.gnome.org/show_bug.cgi?id=740058#c3 - -2015-01-07 16:26:57 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/opencv/gsthanddetect.c: - handdetect: remove unneeded check - Variable hands is already checked to contain a value previously at the beginning - of the current block (in line 504). There is no need to check again. This is - logically dead code. - CID 1197693 - -2014-11-13 15:56:07 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst/videoparsers/gstpngparse.c: - * gst/videoparsers/gstpngparse.h: - pngparse: improve parsing of the image - Everytime a buffer is being provided from baseparse, we are parsing all the data from the beginning. - But since we would have already parsed some of the data in the previous iterations, - it doesnt make much sense to keep parsing the same everytime. - Hence skipping the data which is already read in previous iterations to improve the parsing performance. - https://bugzilla.gnome.org/show_bug.cgi?id=740058 - -2015-01-07 15:32:05 +0100 Florian Langlois <florian.langlois@fr.thalesgroup.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Fix latency values for sources - -2015-01-07 10:23:31 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/m3u8.c: - hlsdemux: remove duplicate call to uri_join - -2015-01-07 09:30:00 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/m3u8.c: - hlsdemux: skip checking '#EXT-X-' token for all entries - Put this common check before to avoid repeating it for all possible - entries to save some cycles - -2015-01-07 09:21:33 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/m3u8.c: - hlsdemux: avoid using g_list_append for creating segments list - Use g_list_prepend and reverse it at the end to skip traversing the - same list for every new segment - -2014-06-20 12:38:59 -0600 Thomas Bluemel <tbluemel@control4.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Don't use approximate duration for fragment buffer pts - The duration values in playlists are approximate only, and for - playlist versions 2 and older they are only rounded integer values. - They cannot be used to timestamp buffers. This resulted in playback - gaps and skips because the actual duration of fragments is slightly - different. The solution is to only set the pts of the very first - buffer processed, not for each fragment. - -2015-01-06 18:44:15 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: only update segment if we have a valid PTS - Otherwise we set the position to GST_CLOCK_TIME_NONE and it disrupts - bitrate switching - -2015-01-07 11:31:30 +0530 Rajat Verma <rajat.verma@st.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: fix crash while setting bitrate in caps structure - q->bitrate is a guint64, but G_TYPE_INT may read fewer bits - off the stack, and if we pass more then the NULL sentinel - may not be found at the right place, which in turn might - lead to crashes. - https://bugzilla.gnome.org/show_bug.cgi?id=741751 - -2015-01-02 00:59:00 +0000 Duncan Palmer <dpalmer@digisoft.tv> - - * gst/videoparsers/gsth264parse.c: - h264parse: Fix periodic SPS/PPS sending work after a seek - Reset the interval variable to have SPS/PPS sending work after - a (backwards) seek. - https://bugzilla.gnome.org/show_bug.cgi?id=742212 - -2015-01-05 21:26:22 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: fix deadlock with pad object lock - The image capture mutex and the pad object lock would cause a race - if the pad query was made right when the image probe was running. - The image probe needs the capture mutex and the querying would need - the pad object lock. - -2015-01-05 15:16:15 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: simplify weird if/else clause - It is not an if/else situation but an if error abort otherwise - just continue. Remove else to make it more readable - -2014-04-04 16:45:51 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: Implement live seeking - hlsdemux assumes that seeking is not allowed for live streams, - however seek is possible if there are sufficient fragments in the - manifest. For example the BBC have live streams that contain 2 hours - of fragments. - The seek code for both live and on-demand is common code. The - difference between them is that an offset has to be calculated - for the timecode of the first fragment in the live playlist. - When hlsdemux starts to play a live stream, the possible seek range - is between 0 and A seconds. After some time has passed, the beginning of - the stream will no longer be available in the playlist and the seek - range is between B and C seconds. - Seek range: - start 0 ........... A - later B ........... C - This commit adds code to keep a note of the B and C values - and the highest sequence number it has seen. Every time it updates the - media playlist, it walks the list of fragments, seeing if there is a - fragment with sequence number > highest_seen_sequence. If so, the values - of B and C are updated. The value of B is used when timestamping - buffers. - It also makes sure the seek range is never closer than three fragments - from the end of the playlist - see 6.3.3. "Playing the Playlist file" - of the HLS draft. - https://bugzilla.gnome.org/show_bug.cgi?id=725435 - -2015-01-05 17:58:54 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: prepare for supporting seeks in live streams - Add function to allow subclasses to specify seeking range for - live streams - https://bugzilla.gnome.org/show_bug.cgi?id=725435 - -2015-01-04 17:15:37 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: don't use iterator when setting flush pending on pads - -2015-01-04 16:57:05 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: check if pads are ready more efficiently - No need to use an iterator for this which creates a temporary - structure every time and also involves taking and releasing the - object lock many times in the course of iterating. Not to mention - all that GList handling in gst_aggregator_iterate_sinkpads(). - -2015-01-04 12:59:19 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.h: - aggregator: name vfunc arguments consistently - -2014-12-31 20:47:24 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * tests/check/Makefile.am: - tests: nodist for orc generated code - -2015-01-01 15:46:00 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: add g-i transfer and scope annotations - -2015-01-01 14:10:05 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: register names of iterate_sinkpads functions with debug system - -2015-01-01 14:03:02 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: reduce debug messages for taking/releasing logs to TRACE level - Don't spam debug log with this stuff. - -2014-12-31 18:16:21 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: move property member into private structure - Our locking (or lack thereof) while accessing this also - looks generally quite dodgy. - -2014-12-31 14:50:58 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: remove empty dispose function - -2014-12-30 23:58:34 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: give private functions namespace prefix - Especially the GST_DEBUG_FUNCPTR ones. - -2014-12-31 12:35:06 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.h: - aggregator: fix up some docs comments in header - -2014-12-30 23:44:46 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: remove now-unused system clock member - -2014-12-30 19:43:43 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstglvideomixer.c: - glmixer, glvideomixer: update for GstAggregatorPadForeachFunc change - -2014-12-30 19:26:47 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: update for aggregator start/stop vfunc change - -2014-12-30 19:22:01 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: make GstAggregatorPadForeachFunc take an GstAggregatorPad - -2014-12-30 18:01:34 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: update for aggregator start/stop vfunc change - -2014-12-30 17:56:35 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: update for aggregator start/stop vfunc change - -2014-12-30 17:50:17 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: bring start/stop vfunc semantics in line with other baseclasses - Sub-class should not have to chain up to GstAggregator's start/stop - vfuncs, same as in GstBaseSrc, GstBaseSink, GstBaseTransform etc. - -2014-12-30 15:29:36 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: fix output-block-size property description - -2014-12-30 08:07:18 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: only typefind when we have a minimum amount of data - For small amounts some data might be mistyped and it would cause - the pipeline to fail. For example if you have AAC inside mpegts, - for small amounts, the AAC samples would cause the typefinder to - think it is AAC and not mpegts. - https://bugzilla.gnome.org/show_bug.cgi?id=736061 - -2014-12-29 11:49:51 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - decklink: Add support for 4K / UHD modes - -2014-12-29 11:49:42 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Fix indention - -2014-12-29 10:44:53 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: do not try to ref null pointer - Playlists might be missing the availability start time, so check for - it before trying to ref the object - -2014-12-29 10:44:19 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: run gst-indent on mpdparser - Run gst-indent on mpdparser to have it stop complaining on every - commit - -2014-12-28 18:26:49 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: remove pointless GST_DEBUG_FUNCPTR - Not useful for GObject vfuncs. - -2014-12-28 18:24:21 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: remove duplicate pad parent_class variable - G_DEFINE_TYPE already provides one, just need to use it. - -2014-12-28 18:22:57 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.h: - aggregator: add _CAST() variants for cast macros - -2014-12-28 01:13:33 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.h: - * gst-libs/gst/video/gstvideoaggregator.h: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - aggregator: make padding larger - Esp. the class structures, can't have enough - spare space for virtual functions. - -2014-12-28 00:58:04 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/siren/gstsiren.h: - * gst/siren/gstsirendec.h: - * gst/siren/gstsirenenc.h: - siren: remove unneeded structure padding - Public headers are private and not installed. - -2014-12-27 16:15:41 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Log to the pad instead of the element - More correct way of doing the same thing as before - -2014-12-27 15:50:17 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: Point to compositor for the pad properties documentation - -2014-12-27 15:49:47 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/compositor/compositor.c: - compositor: Document the pad properties - -2014-12-27 15:49:39 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Document the pad properties - -2014-12-27 09:49:43 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Make sure that the minimum latencies are never GST_CLOCK_TIME_NONE - -2014-12-27 09:42:57 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Wait for the minimum latency, not the maximum - The minimum latency is the latency we have to wait at least - to guarantee that all upstreams have produced data. The maximum - latency has no meaning like that and shouldn't be used for waiting. - -2014-12-27 04:21:36 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Clamp the min latency at the max if it's greater - -2014-12-27 04:21:26 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Print the sinkpad name while logging latency queries - Very useful while debugging. - -2014-12-27 04:19:52 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Take the stream lock when iterating sink pads - When iterating sink pads to collect some data, we should take the stream lock so - we don't get stale data and possibly deadlock because of that. This fixes - a definitive deadlock in _wait_and_check() that manifests with high max - latencies in a live pipeline, and fixes other possible race conditions. - -2014-12-26 23:05:43 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: do not set source state with lock - It might be racy with the image probe thread as it uses the capture - mutex just like the start-capture handler from camerabin. The - start-capture would be waiting for the source's streaming thread - to stop to be able to set the source state to ready while the - probe would be blocked waiting to acquire the capture mutex. - It causes a deadlock. - -2014-12-26 10:17:19 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: use the drain query instead of flush - The flush might clear any pending captures that are still in - queues being processed while the drain query will wait for those - to be properly done - -2014-12-26 22:45:41 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: improve timestamp code - Use a combination of the running time and CMClockGetTime from AVF to compute - timestamps. - -2014-12-26 11:48:56 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/gdp/gstgdppay.c: - gdppay: use public API for accessing stream header arrays in caps - Don't rely on core implementation details, which are private and - may change. It's also not needed here, the performance impact is - close to none. Also copy buffer before changing its metadata. - -2014-12-26 11:29:12 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/gdpdepay.c: - tests: gdpdepay: update for internal gdp refactoring - This test uses some internal/private API, so needs to - be updated for recent changes. - -2014-12-26 11:27:38 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/gdp/dataprotocol.c: - * gst/gdp/dataprotocol.h: - * gst/gdp/gstgdppay.c: - gdppay: refactor payloading code a little - Get rid of some indirections and inefficiencies, - just payload things directly which gives us more - control over what memory is allocated where and - how and makes things much simpler. In particular, - we can now allocate the payload header plus the - GstMemory to represent it in one go. - -2014-12-15 00:41:22 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/gdp/dataprotocol.c: - * gst/gdp/dataprotocol.h: - * gst/gdp/gstgdppay.c: - * gst/gdp/gstgdppay.h: - * tests/check/elements/gdpdepay.c: - gdppay: refactor a little - Get rid of now-useless packetizer struct and just - call internal functions directly. Also remove - version property which is now defunct, not least - because we create the packetizer with the - version in the init function before a version - can be set. - -2014-12-13 16:46:07 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/gdppay.c: - tests: gdppay: initialise memory of buffers used in unit test - -2014-12-13 15:23:48 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/gdp/dataprotocol.c: - * gst/gdp/dataprotocol.h: - gdppay: optimise payloading of buffers with multiple memories - Add function to calculate a payload CRC across multiple memories - so we don't have to merge buffers with multiple memories just to - calculate the CRC. Also make CRC calculation function static, - since it's not used outside dataprotocol.h and move special-casing - of length = 0 -> CRC = 0 into CRC function (from caller). - Perhaps more importantly, since payload CRC is off by default: - don't map buffer (and possibly merge memories in the process) - if we are not going to use it to calculate a CRC anyway. - -2014-12-13 15:19:16 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/gdp/dataprotocol.c: - * gst/gdp/dataprotocol.h: - gdppay: dataprotocol: drop bogus const - Doesn't really make sense given that we map - it and possibly merge memories and such. - -2014-11-24 12:18:36 -0700 Vijay Jayaraman <Vijay.Jayaraman@echostar.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: typefind might fail if first buffer is too short - If typefind fails, check to see if the buffer is too short for typefind. If this is the case, - prepend the decrypted buffer to the pending buffer and try again the next time around. - https://bugzilla.gnome.org/show_bug.cgi?id=740458 - -2014-08-27 16:26:19 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/Makefile.am: - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: port to adaptive base class - Conflicts: - ext/hls/gsthlsdemux.c - ext/hls/gsthlsdemux.h - -2014-12-23 01:51:50 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: check if element exists before setting it to null - Under certain error conditions it might happen that the element - has been freed already and trying to set it to NULL causes an - assertion - -2014-12-23 01:51:10 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: make sure task has stopped before freeing it - Otherwise the thread will be running and its memory will get freed. - This leads to memory corruption - -2014-12-23 01:48:41 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix segment start when exposing new streams - Segment start needs only to be updated when starting the streams - or after a seek, doing it during bitrate changes will cause the - running time to go discontinuous (jump back to a previous ts) - and QOS will drop buffers - -2014-12-19 02:22:47 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: allow subclass to use new pads group when switching bitrate - Fix pad groups switching when bitrate changes to allow HLS to use this feature - -2014-12-23 12:24:48 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: If getting a timeout before having caps, just advance our position - This can happen if this is a live pipeline and no source produced any buffer - and sent no caps until the an output buffer should've been produced according - to the latency. - -2014-12-23 12:15:50 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Make sure to release the current buffer in reset() - If we didn't output the last one in aggregate because we were shutting down - earlier we might otherwise leak it. - -2014-12-23 11:45:50 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - * gst/audiomixer/gstaudiomixer.h: - * tests/check/elements/audiomixer.c: - audiomixer: Change blocksize property to output-buffer-duration in time format - This makes the interface of audiomixer independent of the actual caps. - -2014-12-23 11:45:05 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Don't leak flush-start events - -2014-12-23 10:24:27 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Also change the default latency to 0, not just the minimum - -2014-12-23 09:52:20 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Fix docs and default value of the latency property - -2014-12-22 22:19:52 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Also include the subclass latency in the result of the latency query - -2014-12-22 22:11:30 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Use the src query implementation of aggregator as the default case - -2014-12-22 22:11:13 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Use the src query implementation of aggregator as the default case - -2014-12-22 16:45:05 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/bayer/gstbayer2rgb.c: - bayer2rgb: take into account filter in transform_caps function - Fixes criticals when filter caps are passed. - Also fix wrong GST_DEBUG_OBJECT use. - https://bugzilla.gnome.org/show_bug.cgi?id=741863 - -2014-12-22 15:26:37 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Post a latency message if the value of the latency property changes - -2014-12-22 15:03:59 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Wake up the src thread after handling a latency query - Due to changed latencies or changed live-ness we might have to - adjust if we wait on a deadline at all and how long. - -2014-12-22 15:00:36 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Don't count the number of times we need to wake up but instead check all conditions for waiting again - This simplifies the code and also makes sure that we don't forget to check all - conditions for waiting. - Also fix a potential deadlock caused by not checking if we're actually still - running before starting to wait. - -2014-12-22 11:49:08 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Instead of crashing if no corresponding frame is found, ignore this - ... and hope that everything will be fine. This shouldn't really happen but - previously happened during shutdown. It should be fixed in videoencoder now, - but better be on the safe side here. - -2014-12-22 11:46:05 +0100 Sebastian Dröge <sebastian@centricular.com> - - * MAINTAINERS: - MAINTAINERS: Update my mail address - -2014-12-21 07:47:25 -0500 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiomixer/Makefile.am: - audiomixer: fix build flag order - Have the libraries/inlcudes from plugins-bad first to avoid picking up the installed version. - Fixes the build when the local api changed. - -2014-12-20 12:24:53 -0500 Stefan Sauer <ensonic@users.sf.net> - - * gst/freeverb/GstFreeverb.prs: - * gst/freeverb/Makefile.am: - freeverb: add a few presets - -2014-12-19 13:18:50 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * tests/check/libs/gstglcolorconvert.c: - * tests/check/libs/gstglmemory.c: - * tests/check/libs/gstglupload.c: - gltest: Port to new API - https://bugzilla.gnome.org/show_bug.cgi?id=740900 - -2014-12-19 12:22:12 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - glbufferpool: Always recalculate buffer size - Actually we should always recalculate buffer size since our buffer size - even when not-padded is smaller for many sub-sampled formats. This is - because we don't add padding between the planes. - https://bugzilla.gnome.org/show_bug.cgi?id=740900 - -2014-12-19 12:12:08 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglmemory.h: - glmemory: No need for padding - A memory object cannot be put on stack, so no need for padding. - -2014-12-19 12:11:08 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/gl/gstgloverlay.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstgluploadmeta.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - gl: Add support for GstVideoAlignment - This allow saving a copy with libav video decoders or decoders with - similar padding requirement. - https://bugzilla.gnome.org/show_bug.cgi?id=740900 - -2014-11-22 11:25:23 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - glmemory: Handle upload/download flags from map - Problem was that if buffer was mapped READWRITE (state of buffers from - libav right now), mapping it READ/GL will not upload. This is because the - flag is only set when the buffer is unmapped. We can fix this by setting - the flags in map. This result in already mapped buffer that get mapped - to be read in GL will be uploaded. The problem is that if the write - mapper makes modification afterward, the modification will never get - uploaded. - https://bugzilla.gnome.org/show_bug.cgi?id=740900 - -2014-12-13 21:47:38 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: Handle custom stride with OPENGL3 - https://bugzilla.gnome.org/show_bug.cgi?id=740900 - -2014-12-19 15:05:58 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - decklink: Fix various compiler warnings with gcc - -2014-12-19 14:50:09 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: Re-add the COM initialization code for Windows - Untested, and we will never deinitialize COM again. - -2014-12-19 14:38:03 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - decklink: Remove in-same-pipeline detection code for audio/video elements of the same device - This causes deadlocks sometimes for some reason. - -2014-12-19 14:35:03 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklinkvideosink: Implement clock slaving - -2014-12-19 13:52:08 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkvideosink.cpp: - decklinkvideosink: Add some more debug output for when frames are scheduled - -2014-12-19 13:28:29 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink: Add property for configuring the buffer size of the sources - -2014-12-19 13:24:10 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - decklinkaudiosrc: Implement timestamp jitter and discont handling - -2014-12-19 12:37:30 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Our capture time is the end timestamp of the buffer, subtract the duration - -2014-12-19 12:30:04 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink: Allow for a maximum of 5 packets to be queued up - In case downstream is a bit slow with consuming packets at times. - -2014-12-19 12:03:09 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosrc.cpp: - decklink: Implement latency query in sources and remember selected mode - -2014-12-18 18:30:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/capture.cpp: - * sys/decklink/capture.h: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksink.h: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklink: Remove obsolete files - -2014-12-18 17:31:20 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/Makefile.am: - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosrc.cpp: - * sys/decklink/gstdecklinkaudiosrc.h: - * sys/decklink/gstdecklinkvideosrc.cpp: - * sys/decklink/gstdecklinkvideosrc.h: - decklink: Add initial version of audio and video sources - -2014-12-13 17:23:31 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/Makefile.am: - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinkaudiosink.cpp: - * sys/decklink/gstdecklinkaudiosink.h: - * sys/decklink/gstdecklinkvideosink.cpp: - * sys/decklink/gstdecklinkvideosink.h: - decklink: Initial version of the audio/video sink rewrite - -2014-12-19 13:04:58 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - * gst/audiomixer/gstaudiomixer.h: - audiomixer: Track discont-time per pad instead of globally - We do discont handling per pad, not per element! - -2014-12-15 16:27:16 +0100 Branko Subasic <branko@axis.com> - - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/gstcurlsmtpsink.h: - curlsmtpsink: add final boundary to all multipart emails - Corrected the final boundary mechanism so that a final boundary is - added to each mail with multipart content that is sent, - not just to the last one. - https://bugzilla.gnome.org/show_bug.cgi?id=741553 - -2014-12-18 23:33:58 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: We're only EOS if all our pads are actually EOS - Having a buffer or not on the pad is irrelevant. - -2014-12-18 22:42:14 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: The pad's size is always supposed to be the whole buffer size - And the offset the offset into that buffer. Changing the size will - cause all kinds of assumptions to fail and cause crashes. - -2014-12-18 22:04:38 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Don't try to map NULL buffers - -2014-12-18 22:03:04 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Make sure to always update the pad's videoinfo together with buffers - Otherwise the videoinfo and the buffer content can go out of sync. - -2014-12-18 11:48:37 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/compositor.c: - compositor: Fix memory leak when no buffer is available for a pad currently - CID 1258718 - -2014-12-18 10:54:05 +0100 Sebastian Dröge <sebastian@centricular.com> - - * common: - Automatic update of common submodule - From ef1ffdc to f2c6b95 - -2014-12-17 22:01:23 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/x265/gstx265enc.c: - x265enc: reuse the gstvideo proxy getcaps - The caps query is implementing the same logic as the default - handler from the base class. Reuse it to simplify code. - -2014-12-17 21:52:13 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/opus/gstopusenc.c: - opusenc: plug ref leak of template caps - the pad template caps is already a new ref. No need to copy. - -2014-12-17 19:51:32 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst/audiomixer/gstaudiomixer.c: - aggregator: Add function to allow subclasses to set their own latency - For audiomixer this is one blocksize, for videoaggregator this should - be the duration of one output frame. - -2014-12-17 19:37:22 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Make sure to not have pads being behind the current offset - We would break sync between the different streams then. - -2014-12-17 17:54:09 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst/audiomixer/gstaudiomixer.c: - * gst/compositor/compositor.c: - * tests/check/libs/aggregator.c: - aggregator: Add a timeout parameter to ::aggregate() - When this is TRUE, we really have to produce output. This happens - in live mixing mode when we have to output something for the current - time, no matter if we have enough input or not. - -2014-12-17 18:20:15 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/audiomixer.c: - audiomixer: Add queues after the (live) sources in the unit test - -2014-12-17 12:20:54 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: improve timestamping and latency reporting - Use AVF provided timings to timestamp output buffers. Use the running time at - the time the first buffer is produced to base timestamps on. Report 1-frame - latency based on the negotiated framerate instead of hardcoding 4ms latency. - -2014-12-15 22:24:26 -0500 Raimo Järvi <raimo.jarvi@gmail.com> - - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowaudiodec.h: - * sys/dshowdecwrapper/gstdshowutil.cpp: - * sys/dshowdecwrapper/gstdshowutil.h: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - dshowdecwrapper: Remove dependency on ATL - This fixes compiling with Visual C++ Express - that doesn't include ATL. - https://bugzilla.gnome.org/show_bug.cgi?id=677223 - -2014-12-04 23:30:23 -0500 Matthew Bader <matt@hyperlobic.net> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowsrcwrapper: Added support for image/jpeg and h264 - https://bugzilla.gnome.org/show_bug.cgi?id=741188 - -2014-12-16 19:49:35 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/libs/aggregator.c: - tests: fix aggregator unit test after property renaming - -2014-12-16 17:37:12 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Implement get_next_time() - -2014-12-16 17:33:01 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Some minor cleanup - -2014-12-05 18:19:54 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * gst-libs/gst/video/gstvideoaggregator.c: - aggregator: make the src pad task drive the pipeline for live pipelines - This removes the uses of GAsyncQueue and replaces it with explicit - GMutex, GCond and wakeup count which is used for the non-live case. - For live pipelines, the aggregator waits on the clock until either - data arrives on all sink pads or the expected output buffer time - arrives plus the timeout/latency at which time, the subclass - produces a buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=741146 - -2014-12-08 15:18:25 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: always try to use newer buffers - instead of dropping them for being too old. This ensures that - the newest buffer is always used for rendering - -2014-12-16 13:35:14 +0100 Wim Taymans <wtaymans@redhat.com> - - * ext/directfb/dfbvideosink.c: - * ext/sdl/sdlvideosink.c: - * ext/wayland/wlwindow.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/pvr2d/gstpvrvideosink.c: - * sys/vdpau/gstvdpvideopostprocess.c: - rectangle: clear rectangle struct before use - -2014-12-15 15:21:50 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusparse.c: - opusparse: fix frame size determination - https://bugzilla.gnome.org/show_bug.cgi?id=741321 - -2014-06-19 21:32:09 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - * gst/mxf/mxftypes.h: - mxfdemux: Use IndexTableSegments. - This speeds up seeking drastically. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=732294 - -2014-12-14 01:29:26 +0100 Sebastian Rasmussen <sebras@hotmail.com> - - * tests/check/libs/aggregator.c: - tests/aggregator: Use correct type when setting property - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=741495 - -2014-05-08 10:41:03 +0530 Sudip Jain <sudip.jain@linaro.org> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: scan more bytes to find initial PCRs - Fixes playback of Samsung-Colorful-Variety-1080i.ts. - https://bugzilla.gnome.org/show_bug.cgi?id=729768 - -2014-12-12 20:57:28 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * ext/openh264/gstopenh264dec.cpp: - * ext/openh264/gstopenh264enc.cpp: - Revert "openh264: fix to work with released versions and master of upstream" - This reverts commit 15394aa70543f55c54fa8a474805224f4138f76c. - The latest release (v1.1) does not have pkg-config support - yet, so this plugin won't be built with the latest release. - Cerbero uses the latest release, so this makes cerbero - builds fail, which expect the plugin to be built. - We can re-commit this once there's a release that includes - pkg-config support. - -2014-12-12 10:05:23 -0800 Zaheer Abbas Merali <zaheermerali@gmail.com> - - * configure.ac: - * ext/openh264/gstopenh264dec.cpp: - * ext/openh264/gstopenh264enc.cpp: - openh264: fix to work with released versions and master of upstream - -2014-12-12 11:21:27 +0100 Thibault Saunier <tsaunier@gnome.org> - - * gst/debugutils/gstwatchdog.c: - watchdog: GstElement->state is protected with the OBJECT_LOCK - Not the STATE_LOCK. - gst_watchdog_feed was already always called with the OBJECT_LOCK taken. - -2014-11-27 20:48:24 +0100 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - videoaggregator: Hide some more fields from the API - + Add some documentation - -2014-12-12 00:30:21 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/onvif/Makefile.am: - onvif: fix 'make dist' - -2014-12-11 21:01:48 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix seek event handling - Properly do seeking and avoid only seeking when the segment was updated. - It would cause seeks after the stream was EOS to fail, for example. - https://bugzilla.gnome.org/show_bug.cgi?id=738920 - -2014-11-17 19:26:53 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/onvif/gstrtponviftimestamp.c: - * gst/onvif/gstrtponviftimestamp.h: - * tests/check/elements/rtponvif.c: - rtponviftimestamp: Automatically discover the ntp-offset by default. - This only works if no packets are pushed in before the pipeline goes - to playing. So it helps to have a live source. - https://bugzilla.gnome.org/show_bug.cgi?id=731769 - -2014-06-05 15:06:33 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/onvif/Makefile.am: - * gst/onvif/gstrtponvif.c: - * gst/onvif/gstrtponvifparse.c: - * gst/onvif/gstrtponvifparse.h: - * tests/check/elements/rtponvif.c: - add rtponvifextract element - https://bugzilla.gnome.org/show_bug.cgi?id=731769 - -2014-04-28 11:07:17 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * configure.ac: - * gst/onvif/Makefile.am: - * gst/onvif/gstrtponvif.c: - * gst/onvif/gstrtponviftimestamp.c: - * gst/onvif/gstrtponviftimestamp.h: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/rtponvif.c: - add rtponviftimestamp element - https://bugzilla.gnome.org/show_bug.cgi?id=731769 - -2014-12-08 11:02:51 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: fix position/texcoord attrib index usage - https://bugzilla.gnome.org/show_bug.cgi?id=741231 - -2014-12-11 18:17:02 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfiltercube.c: - glfiltercube: use a shader everywhere - -2014-12-11 18:15:02 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstgloverlay.c: - * ext/gl/gstgltransformation.c: - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/gl/gstglfilter.c: - gl: fixup vao and vbo usage for legacy GL - -2014-12-11 14:57:18 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgleffects.c: - gleffects: don't abort when setting the effect to 0,1,2 - -2014-12-10 12:48:33 +1100 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/sdl/sdlshare.c: - gl/examples: fixup sdl example for gluPerspective removal - -2014-12-09 08:38:55 -0800 Nick Stoughton <nstoughton@aether.com> - - * configure.ac: - * sys/bluez/gstavdtputil.c: - bluez: support compile-time distinction between bluez4 and bluez5 - Signed-off-by: Nick Stoughton <nstoughton@aether.com> - https://bugzilla.gnome.org/show_bug.cgi?id=738626 - -2014-12-10 18:23:02 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: check the return from update_manifest correctly - It is a GstFlowReturn and not a boolean - -2014-12-10 09:24:17 +0000 David Waring <david.waring@rd.bbc.co.uk> - - * ext/dash/gstmpdparser.c: - dashdemux: Change period when setting by period id. - Make gst_mpd_client_set_period_id set the current period index when it finds a - period with a matching period id. - https://bugzilla.gnome.org/show_bug.cgi?id=741322 - -2014-12-10 15:27:49 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: fix reverse playback fragment tracking - Rework reverse fragment traversing with repetition fields to prevent - NULL pointer deref and avoid never advancing a fragment as the variable - is unsigned and would always be non-negative. - CID #1257627 - CID #1257628 - -2014-12-11 00:02:26 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: bump rank to PRIMARY - -2014-12-10 22:36:53 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: negotiate profile and level with downstream - -2014-12-10 19:44:01 +1100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: report latency - -2014-12-05 16:20:08 +0000 David Waring <david.waring@rd.bbc.co.uk> - - * ext/dash/gstdashdemux.c: - dashdemux: Find current segment in the streams that have just been setup - Using demux->streams will just skip the whole loop as demux->streams will - always be NULL at that point - https://bugzilla.gnome.org/show_bug.cgi?id=741285 - -2014-12-09 05:03:11 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst/geometrictransform/gstmirror.c: - mirror: Needs remap when the mode changes. - This caused the user to think the mode wasn't taken into account. - -2014-12-09 04:28:17 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst/videoparsers/gsth264parse.c: - Revert "h264parse: expose compatible profiles to downstream" - This reverts commit 3910cbe7ce1a67ed5506f87e4c5a005c168d0e6c. - -2014-12-08 08:53:00 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: do not try to unlock not locked mutex - A misplaced unlock was causing an assertion for playback with a - set stop time - -2014-12-08 08:24:17 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/Makefile.am: - gst-libs: build order: uridownloader before adaptivedemux - Otherwise make install fails - -2014-12-05 16:33:20 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: Add properties to specify the maximum keyframe interval in frames and seconds - -2014-12-05 16:15:23 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Fix conversion of the bitrate property and our internal bitrate storage - The property is in kbit/s and we store it in bit/s, so just multiply and - divide by 1000. No need to put a factor of 8 in there. - kVTCompressionPropertyKey_AverageBitRate is also in bit/s according to - its documentation. - -2014-12-05 13:12:59 +0530 Arun Raghavan <git@arunraghavan.net> - - * gst/inter/gstintervideosrc.c: - intervideosrc: Fix a memory leak - Frees the source ARGB black frame that we use to create the black frame - in our target format. - -2014-12-02 10:10:39 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: expose compatible profiles to downstream - Some video bitstreams report a too restrictive set of profiles. If a video - decoder was to strictly follow the indicated profile, it wouldn't support that - stream, whereas it could in theory and in practice. So we should relax the - profile restriction for allowing the decoder to get connected with parser. - https://bugzilla.gnome.org/show_bug.cgi?id=739992 - -2013-05-01 11:17:02 +0800 Chun-wei Fan <fanchunwei@src.gnome.org> - - * sys/dshowvideosink/dshowvideofakesrc.cpp: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dshowvideosink/dshowvideosink.h: - dshowvideosink: Port to 1.0 and new GLib threading API - This updates the dshowvideosink to work with the GStreamer 1.0.x APIs, and - avoids the use of deprecated GLib threading API that are now used since - GLib 2.32+ - https://bugzilla.gnome.org/show_bug.cgi?id=699364 - -2014-12-04 01:46:43 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: add live support - Implement the functions of adaptivedemux to have live support - enabled. This allows mssdemux to refresh the Manifest periodically - -2014-12-04 15:52:44 -0500 Matthew Bader <matt@hyperlobic.net> - - * sys/dshowdecwrapper/CMakeLists.txt: - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowaudiodec.h: - * sys/dshowdecwrapper/gstdshowdecwrapper.h: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.h: - dshowdecwrapper: Port to 1.x - https://bugzilla.gnome.org/show_bug.cgi?id=740945 - -2014-12-01 16:40:24 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * configure.ac: - * sys/vcd/vcdsrc.c: - vcdsrc: port to 1. - https://bugzilla.gnome.org/show_bug.cgi?id=547661 - -2014-12-04 12:21:04 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: fix getting current position in segments when after last one - For live streams this makes a difference when resyncing after a - Manifest refresh, otherwise it doesn't know where to restart - -2014-12-02 23:27:29 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: support manifests with repetition fragments - Read the "r" attribute from fragments to support fragments nodes - that use repetition to have a shorter Manifest xml. - Instead of doing: - <c d="100" /> - <c d="100" /> - You can use: - <c d="100" r="2" /> - -2014-11-22 01:01:50 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/smoothstreaming/Makefile.am: - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: port to adaptivedemux base class - -2014-12-03 16:13:17 -0500 Matthew Bader <matt@hyperlobic.net> - - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowsrcwrapper: Fixed null caps comparison - https://bugzilla.gnome.org/show_bug.cgi?id=741086 - -2014-12-04 02:12:08 -0200 Flávio Ribeiro <email@flavioribeiro.com> - - * ext/hls/gsthlssink.c: - * ext/hls/gstm3u8playlist.c: - hlssink: remove unnecessary title on EXTINF tag - According to the HLS spec the remainder of the line following - the comma on EXTINF tag is not required. This patch removes - the fake title and saves some bytes on the playlist. - https://bugzilla.gnome.org/show_bug.cgi?id=741096 - -2014-12-04 20:37:51 +0530 Ramprakash Jelari <ramprakash.jelari@e-consystems.com> - - * ext/gl/gstopengl.c: - gl: Rename gst-launch-0.10 to gst-launch-1.0 in docs - -2014-12-04 15:42:55 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/Makefile.am: - decklink: Fix make distcheck - And properly dist all headers and source files. - -2014-12-03 18:31:06 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: release threads waiting for manifest update on shutdown - For live streams, also unblock threads that might be waiting for a manifest - update when stopping the pipeline. - Also add some more debug messages - -2014-12-03 13:52:07 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: use gst_task_stop instead of gst_task_pause - To avoid race conditions with gst_task_stop(); gst_task_join() with - another thread doing gst_task_pause(), the joining thread would be - waiting for the task to stop but it would never happen. So just - use gst_task_stop() everywhere to prevent more mutexes - -2014-12-03 12:48:42 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix deadlock when stopping streams - Remember to unlock the manifest's lock when leaving the download task. - -2014-12-03 16:01:11 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/linux/DeckLinkAPIDispatch.cpp: - decklink: Fix compiler warnings with gcc in the dispatcher - -2014-12-03 15:30:43 +0100 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/gl/gstglsyncmeta.h: - glsyncmeta: add G_END_DECLS - -2014-12-03 15:07:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/win/DeckLinkAPI.h: - * sys/decklink/win/DeckLinkAPI_i.c: - decklink: Update Windows SDK headers to 10.3.1 - No idea where the DecklinkAPIDispatch.cpp comes from on Windows, - but this should still work. Will just become a problem once we - use other parts of the API. - -2014-12-03 14:42:43 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/Makefile.am: - * sys/decklink/osx/DeckLinkAPI.h: - * sys/decklink/osx/DeckLinkAPIConfiguration.h: - * sys/decklink/osx/DeckLinkAPIDeckControl.h: - * sys/decklink/osx/DeckLinkAPIDiscovery.h: - * sys/decklink/osx/DeckLinkAPIDispatch.cpp: - * sys/decklink/osx/DeckLinkAPIModes.h: - * sys/decklink/osx/DeckLinkAPIStreaming.h: - * sys/decklink/osx/DeckLinkAPITypes.h: - * sys/decklink/osx/DeckLinkAPIVersion.h: - decklink: Update OS X SDK headers to 10.3.1 - -2014-12-03 14:39:13 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/linux/DeckLinkAPI.h: - * sys/decklink/linux/DeckLinkAPIConfiguration.h: - * sys/decklink/linux/DeckLinkAPIDeckControl.h: - * sys/decklink/linux/DeckLinkAPIDiscovery.h: - * sys/decklink/linux/DeckLinkAPIDispatch.cpp: - * sys/decklink/linux/DeckLinkAPIModes.h: - * sys/decklink/linux/DeckLinkAPITypes.h: - decklink: Update Linux SDK headers to 10.3.1 - -2014-12-03 10:06:09 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: remove unused error variable - CID #1256556 - -2014-12-03 09:45:58 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: remove more get_duration checks - Subclasses must implement get_duration function. If they do not know - the duration they can return GST_CLOCK_TIME_NONE - -2014-12-03 09:40:34 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: all subclasses must implement get_duration - CID #1256557 - -2014-12-02 23:29:20 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: make sure to always stop the stream on EOS - For On-Demand streams, always stop the tasks for streams that reached - EOS - -2014-12-03 08:02:58 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: try cgl before glx - It was already done by commit - f506e80686eedc66912583db11914ec3f713b478 - but it has been broken by commit - 45ec777cea0e69b2597d1ec02b18ec31d618c920 - -2014-12-03 07:46:50 +0000 Julien Isorce <j.isorce@samsung.com> - - * tests/check/elements/.gitignore: - tests: add glimagesink unit test to .gitignore - -2014-12-02 15:52:54 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: fix double unref of object - the datetime is already released by the end of the function - -2014-10-10 11:24:08 +0100 David Waring <david.waring@rd.bbc.co.uk> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: Find the current period in a live stream - Start from the correct period on a live stream - https://bugzilla.gnome.org/show_bug.cgi?id=737421 - -2014-12-02 10:06:00 +0000 David Waring <david.waring@rd.bbc.co.uk> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix period selection for live streams - Fix period selection and properly error out when update cannot be done - https://bugzilla.gnome.org/show_bug.cgi?id=725298 - -2014-07-09 10:11:40 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtbase: Improve last PCR detection - When dealing with random-access content (such as files), we initially - search for the last PCR in order to figure out duration and to handle - other position estimation such as those used in seeking. - Previously, the code looking for that last PCR would search in the last - 640kB of the file going forward, and stop at the first PCR encountered. - The problem with that was two-fold: - * It wouldn't really be the last PCR (it would be the first one within - those last 640kB. In case of VBR files, this would put off duration - and seek code slightly. - * It would fail on files with bitrates higher than 52Mbit/s (not common) - Instead this patch modifies that code by: - * Scanning over the last 2048kB (allows to cope with streams up to 160Mbit/s) - * Starts by the end of the file, going over chunks of 300 MPEG-TS packets - * Doesn't stop at the first PCR detected in a chunk, but instead records all - of them, and only stop searching if there was "at least" one PCR within - that chunk - This should improve duration reporting and seeking operations on VBR files - https://bugzilla.gnome.org/show_bug.cgi?id=708532 - -2014-12-01 11:47:29 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Only activate warning for real streams - streams with stream_type 0xff are PCR-only streams, it's normal not - to have a pad for them. - -2014-12-01 12:14:20 +0100 Jürgen Slowack <jurgen.slowack@barco.com> - - * ext/x265/gstx265enc.c: - * ext/x265/gstx265enc.h: - x265enc: add qp property - QP property enables CQP mode and sets the QP for P slices. - -2014-12-01 10:59:32 +0100 Thijs Vermeir <thijs.vermeir@barco.com> - - * tests/examples/gl/cocoa/cocoa-videooverlay.m: - gl/cocoa: Fix example on Mac OS X 10.10 - Using NSApp directly seems to confuse something, as the compiler - was expecting an id<NSFileManagerDelegate>. Switched to using - NSApplication sharedApplication, and specified the delegate - protocol on the window class as well. - Similar to https://bugzilla.gnome.org/show_bug.cgi?id=738740 - -2014-12-01 10:27:43 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/Makefile.am: - * gst-libs/gst/adaptivedemux/Makefile.am: - gst-libs: Fix dependency build - adaptivedemux depends on uridownloader and video depends on base - -2014-12-01 09:48:41 +0100 Thomas Klausner <wiz@danbala.tuwien.ac.at> - - * configure.ac: - configure: Do comparisons in a portable way with = instead of == - https://bugzilla.gnome.org/show_bug.cgi?id=740953 - -2014-11-30 21:54:38 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: reworking live manifest update wait - Check if the stream is live before checking if it is EOS as a live - stream might be considered EOS when it just needs to wait for a manifest - update to proceed with the next fragments - -2014-11-29 10:28:09 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: fix manifest update locking - To avoid unlocking a not locked mutex - -2014-11-29 10:27:25 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: Fix segment for manifests that won't start at 0 - For live streams, the manifest might start at an advanced position. Avoid - using segment start=0 to have playback start immediately - -2014-11-29 10:26:31 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: replace the streams with the new mpd client's streams - Otherwise it won't update with the new segment info from the playlist - update - -2014-11-29 10:25:45 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: when updating the manifest, set the uri - This will allow dashdemux to create the correct full path URIs to - continue downloading fragments - -2014-08-26 16:45:46 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/Makefile.am: - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: port to adaptive demux - -2014-11-22 17:27:03 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - adaptivedemux: also clear flushing state on pads before restarting - During flushing seeks the flushing flow return will propagate up to the - source element and all pads are going to have the flushing flag set. - So before restarting also remove that flag together with the EOS one. - We don't do that when pushing the flush stop event because our event - handler for the proxypad will drop all events. - -2014-11-21 20:42:09 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/adaptivedemux/Makefile.am: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: - * gst-libs/gst/adaptivedemux/gstadaptivedemux.h: - adaptivedemux: add adaptivedemux base class - https://bugzilla.gnome.org/show_bug.cgi?id=735848 - -2014-11-29 13:16:56 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/gdp/gstgdppay.c: - gdppay: minor caps event payloading optimisation - Avoid creation of buffer we're just going to throw - away two lines later anyway. - -2014-11-29 13:15:36 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/gdp/gstgdppay.c: - gdppay: fix some memory leaks - -2014-11-30 00:42:17 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: require GL_ARB_ES2_compatibility for opengl3 - until we generate gl3 compliant shaders - https://bugzilla.gnome.org/show_bug.cgi?id=740012 - -2014-11-30 00:18:55 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: properly handle the !opengl3 case - https://bugzilla.gnome.org/show_bug.cgi?id=740012 - -2014-11-28 17:31:07 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinksink.cpp: - decklinksink: Drop too late frames and start scheduled playback at the correct time - -2014-11-28 16:04:54 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/gstglfilterapp.c: - glfilterapp: fix unused variable compiler warning - When GST_GL_HAVE_OPENGL is 0 or unset. - -2014-11-28 15:06:42 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinksrc.cpp: - decklinksrc: For the source, unsetting the callback already deletes it - -2014-11-14 11:19:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinksink.cpp: - decklinksink: Wait for the pipeline clock instead of the decklink clock - Otherwise we're going to starve other elements if the decklink clock - is slower than the pipeline clock, or starts much later. - Of course this will still cause problems if the decklink clock and ours are - completely out of sync, or running at a very different rate. But this at least - works better now. - -2014-11-14 10:58:53 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksink.h: - decklinksink: Schedule video frames according to their timestamps, not according to a frame counter - -2014-11-14 11:02:01 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinksink.cpp: - decklinksink: Add some FIXME comments about synchronization - -2014-11-14 10:38:33 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/capture.cpp: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklinksrc: Sample the pipeline clock for the timestamps instead of coming up with our own - If we just count the frames and calculate timestamps from that, all frames - will arrive late in the sink as we have a live source here. Instead take - the pipeline clock at capture time as reference. - -2014-11-28 14:50:18 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/capture.h: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklinksrc: Handle callback/delegate object the same way as in the sink - Potentially fixes crashes. - -2014-11-28 14:46:06 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksink.h: - decklinksink: Don't crash when going to READY another time - We have to handle the callback object a bit different: - a) it needs a virtual destructor - b) we need to set the callback to NULL when we're done with the output - c) create a new one every time - https://bugzilla.gnome.org/show_bug.cgi?id=740616 - -2014-11-28 10:23:55 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/compositor.c: - compositor: Failure to map a video frame is not just a warning - Also add some warning debug output if mapping a output buffer fails - -2014-11-28 10:22:44 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Failure to map a video frame is not just a warning - -2014-11-28 14:08:40 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/Makefile.am: - glfilterapp is now available on gles2 as well so build it - -2014-11-28 13:04:21 +1100 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/glprototypes/gstgl_compat.h: - gl: fixup compat definition for GLuint64 for OS X - -2014-11-28 11:56:10 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/glprototypes/gstgl_compat.h: - gl: add compat definition for GLuint64 for android - ../../../../gst-libs/gst/gl/glprototypes/sync.h:41:23: error: unknown type name 'GLuint64' - GLuint64 timeout)) - -2014-11-28 02:21:49 +0900 Danny Song <danny.song.ga@gmail.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - basecamerasrc: fix typo in docs - https://bugzilla.gnome.org/show_bug.cgi?id=740815 - -2014-11-28 11:11:43 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglsyncmeta.c: - glsync: fix build with desktop gl - -2014-11-28 11:04:22 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglcolorscale.c: - gl: fix typo in #if - GST_GL_API_HAVE_OPENGL doesn't exist - -2014-11-28 10:59:46 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/effects/gstgleffectssources.h: - * ext/gl/gstglcolorscale.c: - * ext/gl/gstgleffects.c: - * gst-libs/gst/gl/gstglsyncmeta.c: - gl: fix various build errors without desktop gl - -2014-11-28 10:03:18 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: fix build error - gstgldisplay.c:234:541: error: 'return' with no value, in function returning non-void -Werror - g_return_if_fail (GST_IS_GL_DISPLAY (display)); - -2014-11-27 21:05:45 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * ext/gl/gstglbumper.c: - * ext/gl/gstglcolorscale.c: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgleffects.c: - * ext/gl/gstglfilterapp.c: - * ext/gl/gstglfilterblur.c: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglfilterlaplacian.c: - * ext/gl/gstglfilterreflectedscreen.c: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstglfiltersobel.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - * ext/gl/gstglmosaic.c: - * ext/gl/gstgloverlay.c: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstgltransformation.c: - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - gldisplay: implement runtime GL api filtering - Needed so that the pipeline/application can limit the choice of GL api - to what it supports - -2014-11-27 16:17:50 +1100 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * ext/gl/Makefile.am: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfiltercube.h: - * ext/gl/gstglimagesink.c: - * ext/gl/gstopengl.c: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * tests/examples/gl/generic/cube/main.cpp: - * tests/examples/gl/generic/cubeyuv/main.cpp: - * tests/examples/gl/generic/doublecube/main.cpp: - * tests/examples/gl/generic/recordgraphic/main.cpp: - * tests/examples/gl/qt/mousevideooverlay/pipeline.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.cpp: - * tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp: - * tests/examples/gl/sdl/sdlshare.c: - gl: remove the use of glu - -2014-10-17 15:22:24 +0200 Matthew Waters <matthew@centricular.com> - - * configure.ac: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/glprototypes/gstgl_compat.h: - * gst-libs/gst/gl/glprototypes/sync.h: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglsyncmeta.c: - * gst-libs/gst/gl/gstglsyncmeta.h: - gl: add a sync meta for synchronizing across GL contexts - A context can create a GLsync object that can be waited on in order - to ensure that GL resources created in one context are able to be - used in another shared context without any chance of reading invalid - data. - This meta would be placed on buffers that are known to cross from - one context to another. The receiving element would then wait - on the sync object to ensure that the data to be used is complete. - -2014-10-17 15:08:29 +0200 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/glprototypes/Makefile.am: - * gst-libs/gst/gl/glprototypes/all_functions.h: - * gst-libs/gst/gl/glprototypes/sync.h: - glprototypes: add sync function definitions - -2014-11-17 18:06:20 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfilterapp.c: - * ext/gl/gstopengl.c: - glfilterapp: port to gles2 and gl3 - -2014-11-14 23:24:48 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgloverlay.c: - * ext/gl/gstgloverlay.h: - gloverlay: support gl3 - -2014-11-14 00:20:10 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - glvideomixer: add support for gl3 - -2014-11-13 21:30:38 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfiltercube.h: - glfiltercube: add a gl3 code path - -2014-11-13 15:09:04 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglfiltershader.c: - glfiltershader: support gl3 - -2014-11-13 12:12:46 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltransformation.c: - * ext/gl/gstgltransformation.h: - gltransformation: support gl3 - -2014-11-12 23:48:32 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/effects/gstgleffectidentity.c: - * ext/gl/effects/gstgleffectmirror.c: - * ext/gl/effects/gstgleffectsqueeze.c: - * ext/gl/effects/gstgleffectssources.c: - gleffects: support gl3 whereever gles2 is supported - -2014-11-12 23:47:13 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglcolorscale.c: - * ext/gl/gstglcolorscale.h: - glcolorscale: support gl3 - -2014-11-12 22:49:11 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - glfilter: add a gl3 code path using vao's and vbo's - -2014-11-12 22:48:04 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglframebuffer.c: - glframebuffer: add support for gl3 - -2014-10-23 22:35:20 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - glcolorconvert: add support for gl3 - -2014-10-21 22:18:51 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: use vbo's and vao's for gl3 - -2014-10-21 19:30:38 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - glshader add support for gl3 - -2014-10-19 08:09:37 +0400 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - glx: ask for a GL3 core context - -2014-11-27 21:22:44 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Minor cleanup - -2014-11-26 15:02:14 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/compositor.c: - * gst/compositor/compositorpad.h: - compositor: Implement rescaling of the input via pad properties - compositor has now the same interface as glvideomixer. - -2014-11-27 20:34:25 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Copy over more fields from the relevant video-info - gst_video_info_set_format() will reset the complete video-info, but - we want to keep values like the PAR, colorimetry and chroma site. - Otherwise we risk setting different values on the srcpad caps than - what is actually inside the buffers. - -2014-11-27 20:25:29 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Directly use the converters video-info instead of recalculating it - -2014-11-27 19:52:20 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Do source pad negotiation only from the aggregated function - Otherwise we might negotiate from the sinkpad streaming threads at - the same time as on the srcpad streaming thread, and then all kinds - of crazy bugs happen that don't make any sense at all. - -2014-11-27 18:46:03 +0100 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - videoconvert: Hide all conversion related fields - And do not delay the setting of the conversion_info - https://bugzilla.gnome.org/show_bug.cgi?id=740768 - -2014-11-27 16:43:39 +0100 Thibault Saunier <tsaunier@gnome.org> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Do not try to resize a buffer to a negative size on EOS - -2014-11-26 18:24:05 +0100 Thibault Saunier <tsaunier@gnome.org> - - * ext/gl/gstglmixer.c: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - videoaggregator: Expose vmethods to set converters and prepare/clean frames - This gives more flexibility to the subclasses and permits to remove the - GstVideoAggregatorClass->disable_frame_conversion ugly API. - WARNING: This breaks the API as it removes the disable_frame_conversion - field - API: - + GstVideoAggregatorClass->find_best_format - + GstVideoAggregatorPadClass->set_format - + GstVideoAggregatorPadClass->prepare_frame - + GstVideoAggregatorPadClass->clean_frame - - GstVideoAggregatorClass->disable_frame_conversion - https://bugzilla.gnome.org/show_bug.cgi?id=740768 - -2014-11-26 15:41:37 +0100 Thibault Saunier <tsaunier@gnome.org> - - * gst/debugutils/gstwatchdog.c: - * gst/debugutils/gstwatchdog.h: - watchdog: Handle FLUSHING seek events even in PAUSED state - https://bugzilla.gnome.org/show_bug.cgi?id=740757 - -2014-11-26 15:43:12 +0100 Thibault Saunier <tsaunier@gnome.org> - - * gst/debugutils/gstwatchdog.c: - * gst/debugutils/gstwatchdog.h: - watchdog: Properly handle PAUSED state - In PAUSED state we should just preroll, so get one buffer - and stop monitoring. - https://bugzilla.gnome.org/show_bug.cgi?id=740757 - -2014-10-31 11:01:47 +0100 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Let a full renegotiation happen after removing the last pad - With the current code, we will end up setting the preferred downstream - format as the srcpad format, and it might not be accepted by the next - sinkpad to be added. We should instead let the next sinkpad reconfigure - everything. - -2014-11-27 13:40:56 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: add quality property - -2014-11-27 13:33:07 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/vtenc.c: - vtenc: set profile and level in caps - -2014-11-27 18:09:58 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: Unref buffer with the correct function - -2014-11-27 18:09:14 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: Handle failure of memory allocation gracefully - -2014-11-27 18:04:58 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: Use g_try_malloc() in the appropriate places - g_malloc() aborts if allocation fails, it's pointless to check against NULL - afterwards. That's why g_try_malloc() exists. - -2014-11-27 17:11:13 +0100 Edward Hervey <bilboed@bilboed.com> - - * common: - Automatic update of common submodule - From f32cfcd to ef1ffdc - -2014-11-27 10:48:43 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: support RGB16/BGR16 video format download - https://bugzilla.gnome.org/show_bug.cgi?id=740801 - -2014-11-27 13:01:19 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: only attempt a resize when the window has already resized - fixes a black startup screen on wayland - -2014-11-27 11:47:38 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - gl/wayland: implement resizing the window using the right mouse button - -2014-11-26 22:05:10 +0530 Arun Raghavan <git@arunraghavan.net> - - * common: - * configure.ac: - build: Use newer AX_PTHREAD instead of ACX_PTHREAD - -2014-11-26 14:36:42 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - * sys/Makefile.am: - * sys/qtwrapper/Makefile.am: - * sys/qtwrapper/audiodecoders.c: - * sys/qtwrapper/codecmapping.c: - * sys/qtwrapper/codecmapping.h: - * sys/qtwrapper/imagedescription.c: - * sys/qtwrapper/imagedescription.h: - * sys/qtwrapper/qtutils.c: - * sys/qtwrapper/qtutils.h: - * sys/qtwrapper/qtwrapper.c: - * sys/qtwrapper/qtwrapper.h: - * sys/qtwrapper/videodecoders.c: - Remove unported and obsolete qtwrapper plugin code - QuickTime is deprecated, we want new plugins based - on avfoundation (osx) or dxva/mediafoundation (windows). - -2014-11-27 01:27:19 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: support fixed dimensions on both sides of the element - Fixes: - width=320,height=240 ! glfilter ! width=800,height=600 - width=230,height=240 ! glfilter ! width=600 - ... ! glfilter ! width=800 - -2014-11-25 13:33:07 +1100 Matthew Waters <matthew@centricular.com> - - * configure.ac: - gl: fix automagic disabling of desktop GL - If configure finds GL + GLES2 but the user passes --enable-gles2 and - the two GL API's cannot be built against together, configure was still - allowing the desktop GL stack to be built. - -2014-11-26 13:06:21 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Also sync pad properties to the controller if conversion is disabled - -2014-11-26 12:35:52 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/compositor.c: - * gst/compositor/compositorpad.h: - compositor: Remove unused zorder pad property - It's handled in videoaggregator already. - -2014-11-23 23:49:50 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/nalutils.h: - codecparsers: fix some compiler warnings - i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 - "warning: comparison is always true due to limited - range of data type" - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=740673 - -2014-11-25 18:53:55 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/compositor/compositor.c: - compositor: GstVideoMeta is supported just fine, tell upstream about that - Also provide a GstVideoBufferPool to upstream just in case. - -2014-11-24 13:25:55 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/winks/gstksvideodevice.c: - * sys/winks/ksvideohelpers.c: - winks: fix debug message format issues - And print last bits of GUID properly instead - of printing nonsense. - https://bugzilla.gnome.org/show_bug.cgi?id=733055 - -2014-11-25 08:24:16 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegts: fix some compiler warnings - i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 - "warning: comparison is always true due to limited - range of data type" - https://bugzilla.gnome.org/show_bug.cgi?id=740674 - -2014-11-24 19:53:56 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: use pkg-config to detect X11 - Like we do in -base and -good now. - https://bugzilla.gnome.org/show_bug.cgi?id=731047 - -2014-11-24 19:21:29 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Use a fixed number of slices by default - -2014-11-24 19:16:20 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Add some more encoding properties - Merged from https://github.com/EricssonResearch/openwebrtc-gst-plugins - based on a patchset by Robert Swain <robert.swain@ericsson.com> - -2014-11-24 18:40:53 +0530 Ramprakash Jelari <ramprakash.jelari@e-consystems.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: Fix unused variable warning by moving declaration where it is actually used - -2014-11-24 14:07:19 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - decklink: Add support for 2k modes - -2014-11-24 13:56:56 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: HD1080i50 is 50 frames per second - -2014-11-24 17:58:42 +0530 Ramprakash Jelari <ramprakash.jelari@e-consystems.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Fix format string compiler warning - -2014-11-24 17:18:44 +0530 Ramprakash Jelari <ramprakash.jelari@e-consystems.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - dvbsection: Fix format string compiler warning - -2014-11-24 16:54:42 +0530 Ramprakash Jelari <ramprakash.jelari@e-consystems.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegtsdescriptor: Fix format string compiler warning - gstmpegtsdescriptor.c:778:16: warning: format specifies type 'unsigned long' but the argument has type 'int' -Wformat - -2014-11-24 11:32:33 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Fix valid compiler warning - gstglupload.c:442:32: error: if statement has empty body -Werror,-Wempty-body - if (upload->texture_idsi); - ^ - -2014-11-24 10:43:23 +0100 Philippe Normand <philn@igalia.com> - - * gst-libs/gst/gl/egl/Makefile.am: - gl: ship the gstglcontext_egl.h header - It is required by gsteglimagememory.h. - https://bugzilla.gnome.org/show_bug.cgi?id=740611 - -2014-11-23 21:43:20 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/gstglshadervariables.c: - gl: shadervariables: make parsing of floats locale-independent - Floating point numbers are written differently in different - locales, e.g. in many countries 1/2 = 0,5 instead of 0.5, and - strtod will not be able to parse "0.5" correctly in such a - locale. - -2014-11-24 02:52:24 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglshadervariables.c: - glshadervariables: also trim \r as well as \n - -2014-11-05 20:18:06 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * ext/gl/gstglmixer.c: - * gst-libs/gst/gl/egl/gsteglimagememory.c: - * gst-libs/gst/gl/egl/gsteglimagememory.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * tests/check/libs/gstglupload.c: - glupload: rearchitecture for non GLMemory inputs/outputs - Allows other memory types to be implemented/returned/used by the caller. - -2014-11-14 10:55:14 +0900 Wonchul Lee <wonchul86.lee@lge.com> - - * gst/rawparse/gstrawparse.c: - rawparse: send SEEKING query upstream first - Sometimes rawparse does not handle the seeking query - properly, the rawparse should send the query upstream - first. For example, upstream could support seeking in - TIME format (but not in BYTE format), so the BYTE format - seeking query that rawparse sends in push mode would - fail. - https://bugzilla.gnome.org/show_bug.cgi?id=722764 - -2014-11-21 15:46:49 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: let VT pick the bitrate by default - -2014-11-20 10:23:30 -0800 Aleix Conchillo Flaqué <aleix@oblong.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: fix rtp/rtcp sink event memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=740451 - -2014-11-20 16:04:34 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: set H264_Baseline_AutoLevel on OSX as well - -2014-11-20 15:50:18 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: disable the reorder queue for baseline streams - -2014-11-20 09:41:43 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: Fix divide by zero in the picture buffer length calculation - -2014-11-20 09:13:58 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * ext/gl/gstglimagesink.c: - glimagesink: critical error while seek playback-test(stop state) - If we seek when media is in stop state, playback-test gives - critical error, since context of glimagesink is destroyed during stop. - But since context is not present, we need not handle send_event in glimagesink - Hence adding a condition to check if context is valid. - https://bugzilla.gnome.org/show_bug.cgi?id=740305 - -2014-11-19 17:17:06 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Unblock events/queries immediately if the pad is flushing - https://bugzilla.gnome.org/show_bug.cgi?id=740376 - -2014-11-19 17:15:02 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Drop serialized events/queries if the pad is flushing - https://bugzilla.gnome.org/show_bug.cgi?id=740376 - -2014-11-19 17:03:41 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Block serialized events/queries until the pad has consumed all buffers - Otherwise the caps of the pad might change while the subclass still works with - a buffer of the old caps, assuming the the current pad caps apply to that - buffer. Which then leads to crashes and other nice effects. - https://bugzilla.gnome.org/show_bug.cgi?id=740376 - -2014-11-19 17:02:40 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Don't output 0-duration buffers at the segment end - https://bugzilla.gnome.org/show_bug.cgi?id=740376 - -2014-11-19 17:03:33 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Fix typo in debug output - -2014-11-17 14:05:01 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: fix up QoS handling for live sources - Only attempt adaptive drop when we are not live - https://bugzilla.gnome.org/show_bug.cgi?id=739996 - -2014-11-17 14:00:10 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: add _get_latency() for subclass usage - API: gst_aggregator_get_latency - https://bugzilla.gnome.org/show_bug.cgi?id=739996 - -2014-11-17 09:36:52 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: build errors when GST_GL_HAVE_OPENGL is 0 - Moving variables within #if GST_GL_HAVE_OPENGL, which are not going to be used otherwise. - and which are needed only when OpenGl is present - https://bugzilla.gnome.org/show_bug.cgi?id=740235 - -2014-11-17 11:10:35 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * tests/examples/opencv/gsthanddetect_test.c: - examples: relicense opencv gsthanddetect_test to LGPLv2+ - The GPL3 license header was copy'n'pasted from a - neighbouring source file by mistake, the original - code was not GPL3 licensed, but fell under the - default GStreamer license, which is LGPLv2+. - https://bugzilla.gnome.org/show_bug.cgi?id=685655 - -2014-11-17 18:50:28 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: add read-only context property - -2014-11-17 18:50:04 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: add read-only context property - -2014-11-11 17:08:25 +0900 Hyunjun Ko <zzoonis@gmail.com> - - * tests/examples/opencv/gst_element_print_properties.c: - opencv-example: Use g_snprintf instead of sprintf - https://bugzilla.gnome.org/show_bug.cgi?id=739846 - -2014-11-16 20:32:56 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@sisa.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: drop explicit comparisons against 0 for true/false - -2014-11-16 11:00:14 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: Only use convertRectToBacking on OSX >= 10.7 - It does not exist before and older versions also don't have - support for HiDPI displays anyway. - https://bugzilla.gnome.org/show_bug.cgi?id=740201 - -2014-11-16 10:57:55 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/gstglapi.h: - gl: Use numeric OSX version instead of the macro - The macro is not defined on older OSX versions and evaluates to 0. - https://bugzilla.gnome.org/show_bug.cgi?id=740201 - -2014-11-15 21:59:48 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: fix possible crash by passing 64 bits for 64-bit queue property - https://bugzilla.gnome.org/show_bug.cgi?id=740191 - -2014-11-14 10:40:31 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/capture.cpp: - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - decklink: Fix indention - -2014-11-10 10:01:24 +0100 Gwenole Beauchesne <gb.devel@gmail.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix derivation of MaxPicNum variable. - The logic to compute the MaxPicNum variable was reversed. In paricular, - MaxPicNum is double MaxFrameNum only if field_pic_flag is set to 1. - https://bugzilla.gnome.org/show_bug.cgi?id=739291 - -2014-11-13 12:01:25 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: Don't override the application delegate - Otherwise interesting things will happen in Cocoa applications, like - infinite event loops that block the NSApplication loop forever. - This was only needed for GNUStep and thus can safely be removed now. - -2014-11-13 11:58:07 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * tests/examples/gl/cocoa/cocoa-videooverlay.m: - gl/cocoa: Remove GNUStep support - Until gcc and GNUStep properly support Objective-C blocks and other - "new" features of Objective-C we can't properly support them without - making the code much more ugly. - https://bugzilla.gnome.org/show_bug.cgi?id=739152 - -2014-11-12 18:06:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosink.h: - interaudiosink: Make sure to store at least period-time samples at once in the adapter - It's better to create some more silence than having the source pull multiple - short buffers out of the adapter and insert silence between them. - -2014-11-12 16:45:12 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: fix build on iOS - -2014-11-12 15:35:36 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/coremediabuffer.c: - coremediabuffer: set ->pixel_buf for CVPixelBuffer buffers - Fix a bug for which we never actually set ->pixel_buf to non-NULL for - CVPixelBuffer buffers. - -2014-06-06 13:57:30 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: set channel positions using the appropriate API - https://bugzilla.gnome.org/show_bug.cgi?id=731038 - -2014-11-12 13:58:56 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstintervideosrc.c: - intervideosrc: Stop showing the current frame after 1 second, not after 30 frames - -2014-11-12 09:41:53 +0000 Julien Isorce <j.isorce@samsung.com> - - * tests/check/Makefile.am: - tests: add CFLAGS and LADD for glimagesink unit test - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=732694 - -2014-11-12 11:52:58 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Add new enable-frame-skip property and disable it by default - Otherwise e.g. videotestsrc ! openh264enc ! ... will drop every second frame - because otherwise the target bitrate can't be reached without loosing too - much quality. - -2014-11-12 09:59:53 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: fix compilation on < 10.9 - -2014-11-12 11:44:07 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: don't set the upload to NULL on the drain query - https://bugzilla.gnome.org/show_bug.cgi?id=732694 - -2014-11-11 17:04:48 +0900 Hyunjun Ko <zzoonis@gmail.com> - - * gst-libs/gst/gl/gstglwindow.c: - gl: Correct invalid comment text - -2014-11-11 23:54:44 +0000 Julien Isorce <j.isorce@samsung.com> - - * tests/check/Makefile.am: - * tests/check/elements/glimagesink.c: - gl: add unit test that checks for glimagesink drain query handling - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=732694 - -2014-11-11 23:49:59 +0000 Julien Isorce <j.isorce@samsung.com> - - * ext/gl/gstglimagesink.c: - glimagesink: release stored buffers on drain query - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=732694 - -2014-11-11 23:43:42 +0000 Julien Isorce <j.isorce@samsung.com> - - * gst-libs/gst/gl/gstglwindow.c: - gl: do not raise a critical msg if the backend does not handle window events - Fix "assertion 'window_class->handle_events != NULL' failed" - if not using a X11 window. - -2014-11-11 18:01:54 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: enable the hw encoder on OSX - -2014-11-11 12:00:30 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinksink.cpp: - decklinksink: Check the correct variable for failure - If we can't get an output, we would otherwise just use it later and crash. - -2014-11-11 11:18:19 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosrc.c: - interaudiosrc: Make sure we have a writable buffer before we start changing metadata - -2014-11-11 11:15:35 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstintervideosrc.c: - intervideosrc: Set the GAP flag on repeated buffers - videorate does the same and it allows optimizations downstream. - -2014-11-11 11:12:55 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosrc.c: - interaudiosrc: Set the GAP flag on buffers that only contain silence - -2014-11-11 14:23:55 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglfilter.c: - gl: remove the width/height fields from the caps to support frame resizing - It was previously only occuring with sysmem caps features - https://bugzilla.gnome.org/show_bug.cgi?id=739334 - -2014-11-10 17:42:20 +0100 Aurélien Zanelli <aurelien.zanelli@darkosphere.fr> - - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: fix GstH264ParserResult documentation typo - https://bugzilla.gnome.org/show_bug.cgi?id=739906 - -2014-11-10 16:01:25 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/.gitignore: - tests: Add x265enc unit test to .gitignore - -2014-11-09 20:53:34 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/videoparsers/gstpngparse.c: - pngparse: optimise reading of png files - Read PNG data chunk in one go by letting the parser - base class know the size we need, so that it doesn't - drip-feed us small chunks of data (causing a lot of - reallocs and memcpy in the process) until we have - everything. - Improves parsing performance of very large PNG files - (65MB) from ~13 seconds to a couple of millisecs. - https://bugzilla.gnome.org/show_bug.cgi?id=736176 - -2014-11-09 19:23:47 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/examples/mpegtsmux/mpts_test2.c: - examples: remove pointless mpegtsmux example - Serves no purpose, is not even hooked up to the - build system, has hard coded file names and paths, - and can easily be replaced with a gst-launch line. - https://bugzilla.gnome.org/show_bug.cgi?id=739844 - -2014-11-09 10:25:25 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: Don't pretend to support reconfiguration - We will run into an assertion in set_caps() if we try to change - caps while the source is already running. Don't try to find new - caps in GstBaseSrc::negotiate() to prevent caps changes. - -2014-10-09 13:11:48 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: set seq_layer_sent to FALSE on reset() - https://bugzilla.gnome.org/show_bug.cgi?id=738526 - -2014-10-09 13:03:56 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - * gst/videoparsers/gstvc1parse.h: - vc1parse: implement asf to *-frame-layer stream-format - This commit add an helper to convert a frame to frame-layer format and - use it to implement these two stream-format conversion: - - asf --> sequence-layer-frame-layer - - asf --> frame-layer - In simple/main profile, we basically have a raw frame, so building a - frame layer isn't too complicated. But in advanced profile, the first - frame-layer should contain sequence-header, entrypoint, and frame and - each keyframe should contain entrypoint, so we have to handle these - carefully. - https://bugzilla.gnome.org/show_bug.cgi?id=738526 - -2014-10-09 10:38:40 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: check output format at negotiation time - Add an helper to check that output stream-format is coherent with - profile and header-format. It also check if we know how to do the - conversion if the input stream-format differs from selected - output-format. - So, in case output stream-format is not allowed, it will now fail at - negotiation rather than in pre_push_frame. - https://bugzilla.gnome.org/show_bug.cgi?id=738526 - -2014-09-30 15:35:38 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: add some asf related stream-format conversions - This commit introduces an helper to convert an ASF frame to BDUs format with - startcodes and use this helper to implements following stream-format - conversions: - - asf --> bdu - - asf --> sequence-layer-bdu - - asf --> sequence-layer-raw-frame - https://bugzilla.gnome.org/show_bug.cgi?id=738526 - -2014-09-30 15:28:55 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - * gst/videoparsers/gstvc1parse.h: - vc1parse: add some simple stream-format conversion - It add the support of following stream-format conversion: - - bdu --> sequence-layer-bdu - - bdu-frame --> sequence-layer-bdu-frame - - frame-layer --> sequence-layer-frame-layer - For these conversion, the only requirements is to push a sequence-layer - buffer prior to data. - https://bugzilla.gnome.org/show_bug.cgi?id=738526 - -2014-09-30 14:53:25 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: prepare the stream-format conversion code and add the simplest ones - It prepares the template for stream-format conversion and it implements - the following conversion: - - sequence-layer-bdu --> bdu - - sequence-layer-bdu-frame --> bdu-frame - - sequence-layer-frame-layer --> frame-layer - Work is done in the pre_push_frame() method. - https://bugzilla.gnome.org/show_bug.cgi?id=738526 - -2014-09-05 17:57:47 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: do not override last known stream error - https://bugzilla.gnome.org/show_bug.cgi?id=736141 - -2014-11-07 19:30:18 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: seeks in the manifest never fail - Set void as the return and remove error handling as it could - never fail - -2014-11-07 19:16:47 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: make sure flushes have the same seqnum as the seek event - They are part of the same operation and should preserve the seqnum - -2014-11-07 19:09:15 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: simplify seek to eos handling - Remove redundant flush stop pushing and remove a goto to make - the code flow simpler - -2014-09-17 15:22:59 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: send missing FLUSH_STOP/EOS when no seeking period is found - https://bugzilla.gnome.org/show_bug.cgi?id=736800 - -2014-11-07 15:50:51 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: set the HEADER flag on buffers containing SPS or PPS - -2014-11-07 15:41:15 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: set the HEADER flag on buffers containing VPS, SPS or PPS - -2014-11-07 11:41:01 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - * pkgconfig/gstreamer-gl.pc.in: - gstglconfig: Put gstglconfig.h into $(libdir)/gstreamer-1.0/include - It's architecture dependent and should not be placed into the include - directory as the assumption is that all those headers are architecture - independent. - https://bugzilla.gnome.org/show_bug.cgi?id=739767 - -2014-11-07 00:16:12 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/smoothstreaming/gstmssmanifest.c: - smoothstreaming: initialise new GstH264NalUnit fields - CID #1251107. - -2014-11-06 23:58:06 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * ext/gl/gstglimagesink.c: - glimagesink: don't make gst_glimage_sink_handle_events call _ensure_gl_setup - gst_glimage_sink_handle_events can be called from the overlay interface and from - the main thread before GL is setup. Before this change, that would call - _ensure_gl_setup() and deadlock on OSX. - Change things so that it's always safe to call gst_glimage_sink_handle_events() - without stuff deadlocking. - -2014-11-06 23:55:20 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * ext/gl/gstglimagesink.c: - glimagesink: fix possible deadlock on osx - Remove gst_glimage_sink_handle_events call in gst_glimage_sink_init. It was - unnecessary and when the element was instantiated from the main thread, caused a - deadlock in OSX creating the context (thread). - -2014-11-06 13:22:17 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: add realtime and allow-frame-reordering properties - -2014-11-07 10:01:59 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: clamp the resize width/height to >= 1 to avoid a GL error - -2014-11-06 17:36:15 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstintervideosrc.c: - intervideosrc: Print a warning into the debug log on generating black frames - -2014-11-06 17:21:39 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstintervideosink.c: - intervideosink: Add some debug output in the render function - -2014-11-06 11:53:04 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: don't unnecesarily set src_caps - https://bugzilla.gnome.org/show_bug.cgi?id=739374 - -2014-10-29 22:55:47 +0100 Matej Knopp <matej.knopp@gmail.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: don't unnecesarily set src_caps - https://bugzilla.gnome.org/show_bug.cgi?id=739374 - -2014-11-06 18:43:01 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglutils.c: - glutils: only attempt getting the app context when we don't already have a display - avoids querying/messaging the world on each frame - -2014-11-06 18:37:23 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: fail context creation if glGetString returns NULL - -2014-10-29 12:24:16 +0100 Lubosz Sarnecki <lubosz@gmail.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - glimagesink: implement gst_video_overlay_handle_events - https://bugzilla.gnome.org/show_bug.cgi?id=736035 - -2014-11-04 15:16:33 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosrc.c: - interaudiosrc: Fix compiler warning about unused variables - gstinteraudiosrc.c: In function 'gst_inter_audio_src_create': - gstinteraudiosrc.c:339:27: error: variable 'buffer_samples' set but not used -Werror=unused-but-set-variable - guint64 period_samples, buffer_samples; - ^ - -2014-11-04 14:56:55 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstinteraudiosrc.h: - * gst/inter/gstintersurface.c: - * gst/inter/gstintersurface.h: - interaudio: Make buffer size and latency handling more explicit and add properties for them - This now makes audio work more reliable without disconts. - -2014-11-04 13:59:20 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosink.c: - interaudiosink: Use the bpf from the audio info instead of hardcoding 4 - -2014-11-04 13:58:44 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosrc.c: - interaudio: Only flush the ringbuffer on the sink side - -2014-11-04 13:46:46 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosink.c: - interaudiosink: Flush the adapter when we get new caps - Ideally we would drain the source but that would require more coordination - between sink and source than what we currently have. - -2014-11-04 09:52:11 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - gl/cocoa: include gl3.h in configure too for consistency with gstglapi.h - -2014-11-03 20:45:03 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/insertbin/gstinsertbin.c: - insertbin: Add doc for the ignored user-data in action signals - -2014-11-03 23:24:33 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: use NSAutoreleasePool to free resize data - Otherwise when resizing the window you will also get messages like: - class NSConcreteMapTable autoreleased with no pool in place - just leaking - class NSConcreteValue autoreleased with no pool in place - just leaking - class NSConcreteValue autoreleased with no pool in place - just leaking - class __NSCFDictionary autoreleased with no pool in place - just leaking - -2014-11-03 23:08:09 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglapi.h: - gl/cocoa: include gl3.h to have GL_CONTEXT_PROFILE_MASK - -2014-11-03 23:07:34 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: make sure to turn on frame rectangle changes notifications - Default value of property postsFrameChangedNotifications is YES - but it is worth to explicitly enable it. - -2014-11-03 23:02:17 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: fix uncaught exception 'unrecognized selector sent to instance' - Need to set the ':' as the reshape method now takes one parameter. - For the story, the GstGLNSView was previously inheriting from - NSOpenGLView which has a reshape function without any parameter. - Now the GstGLNSView inherits from NSView and we re-use the reshape - function manually. - -2014-11-03 22:59:41 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: fix compiler warning - Use the reshape function after being defined. The other way - would have been to declare the reshape function in the header. - gstglwindow_cocoa.m: In function '-GstGLNSView drawRect:': - gstglwindow_cocoa.m:555: warning: 'GstGLNSView' may not respond to '-reshape' - gstglwindow_cocoa.m:555: warning: (Messages without a matching method signature - gstglwindow_cocoa.m:555: warning: will be assumed to return 'id' and accept - gstglwindow_cocoa.m:555: warning: '...' as arguments.) - -2014-11-03 16:54:58 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstintervideosrc.c: - intervideosrc: Negotiate framerate with downstream - Prefer the closest framerate to the input framerate though. - -2014-11-03 16:24:33 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintervideosrc.c: - inter*src: No need to set caps manually on the pad - basesrc does that for us already. - -2014-11-03 16:13:23 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Swap source/destination parameters of gst_video_converter_frame() - -2014-11-03 15:19:48 +0100 Wim Taymans <wtaymans@redhat.com> - - * gst/inter/gstintervideosrc.c: - inter: fix order of arguments - -2014-11-03 10:05:59 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - interaudio: Set all required fields on the template caps - https://bugzilla.gnome.org/show_bug.cgi?id=739542 - -2014-11-03 00:17:41 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - gl: fix Since marker for gst_gl_window_run_navigation() - -2014-11-02 23:24:39 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/inter/gstintersurface.c: - inter: don't leak surface name - -2013-09-03 11:11:54 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: start pushing data again when a pad gets linked later - The whole not_linked optimisation is really a bit dodgy here, but - let's leave it in place for now and at least start pushing data - again when a pad got linked later, in which case we should get a - RECONFIGURE event. - -2013-09-02 23:36:43 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - * gst/mpegdemux/plugin.c: - mpegdemux: namespace fixes - -2014-11-02 19:26:20 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: post QoS messages when dropping frames due to QoS - -2014-11-02 19:12:56 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/audiovisualizers/gstaudiovisualizer.h: - audiovisualizer: fix boilerplate macros - -2014-11-02 17:18:12 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/hls/gsthlsdemux.c: - * ext/smoothstreaming/gstmssdemux.c: - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - Sprinkle some G_PARAM_DEPRECATED and #ifndef GST_REMOVE_DEPRECATED - -2014-11-02 17:17:46 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/gsthlsdemux.c: - hls: fix indentation - -2014-10-29 18:18:07 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst-libs/gst/gl/gstglshadervariables.c: - glshader: Fix memory leak - Memory is only freed in the TRUE clause of the if conditional. Free in the else - clause as well. - Also, consolidate g_malloc + sprintf into a g_strdup_printf(). - CID #1212171 - https://bugzilla.gnome.org/show_bug.cgi?id=739368 - -2014-11-01 10:10:27 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/opus/gstrtpopusdepay.c: - * ext/opus/gstrtpopuspay.c: - rtpopus: Use OPUS encoding name - Both Firefox and Chrome uses OPUS as the encoding in their SDP. - Adding this now defacto standard name remove the need for special - case in SDP parsing code. - https://bugzilla.gnome.org/show_bug.cgi?id=737810 - -2014-10-31 17:32:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: add type of stream to debug log - Makes it faster to debug why certain streams are not showing - -2014-10-31 17:32:39 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: do not unlock not locked mutex - -2014-10-31 10:45:19 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: fix comments that confuse gtk-doc - GTK-Doc uses a special syntax for code documentation. A multiline comment that - starts with an additional '*' marks a documentation block that will be processed - by the GTK-Doc tools. So GTK-Doc is confused if a comment block starts with that - additional '*' but isn't meant to be processed. Removing this additional '*'. - https://bugzilla.gnome.org/show_bug.cgi?id=739444 - -2014-10-31 12:52:50 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: resize the viewport correctly on a caps change - with force-aspect-ratio=true, if the width or height changed, the - viewport wasn't being updated to respect the new video width and height - until a resize occured. - -2014-10-31 12:52:07 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: advertise support for changing input caps mid-stream - https://bugzilla.gnome.org/show_bug.cgi?id=739334 - -2014-10-31 12:30:53 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglwindow.c: - gl: sprinkle some Since markers - -2014-10-30 14:27:38 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - mpegts: remove storage of never used values - Both _parse_atsc_mgt() and _parse_atsc_vct () change the value of the variable - data just before returning. The new value is never used since data is a pointer - declared at the beginning of the function and going out of scope just after the - new value is stored. - https://bugzilla.gnome.org/show_bug.cgi?id=739404 - -2014-10-30 17:06:01 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstsolarize.c: - gaudieffects: remove < 0 comparison on guint32 - Current CLAMP checks both if the value is below 0 or above 255. Considering it - is an unsigned value it can never be less than zero, so that comparison is - unnecessary. Switching to using if just for the upper bound. - CID #1139796 - -2014-10-30 16:05:14 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstsolarize.c: - gaudieffects: declare floor and ceiling as constants - -2014-10-30 15:49:01 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/gaudieffects/gstdilate.c: - gaudieffects: stored value is overwritten - Value from left_luminance is assigned to out_luminance here, but that stored - value is not used before it is overwritten in the next cycle of the loop. - Removing assignation. - CID #1226473 - -2014-10-24 16:52:42 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: do not remove programs on EOS - As a consequence, tsdemux won't remove its pads anymore on EOS. - Fixes the case when mpegtsbase is not able to process new packets - after EOS as the corresponding pids aren't known anymore because - the programs were removed and the pes/psi were kept, preventing the - PAT to be parsed again. - https://bugzilla.gnome.org/show_bug.cgi?id=738695 - -2014-04-21 11:48:22 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/siren/common.c: - siren: fix sample rate list - It was using a 24000/24000/48000, but I think it meant to use - 24000/32000/48000. Not 100% sure... - https://en.wikipedia.org/wiki/G.722.1 has the list of supported - bitrates. It's not clear whether the "flag" code maps to this, - however. - Coverity 206072 - -2014-10-30 14:49:05 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: remove storage of never used values - These two values are stored just before the function returns and they go out of - scope. - -2014-06-10 09:33:40 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - opusenc: update output segment stop time to match clipped samples - This will let oggmux generate a granpos on the last page that properly - represents the clipped samples at the end of the stream. - -2014-10-30 18:45:04 +0530 Arun Raghavan <arun@accosted.net> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Trivial documentation fix - -2014-10-30 23:08:00 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: don't get the current caps from GstVideoInfo for the srcpad - It's missing the caps features needed. - -2014-10-30 18:57:59 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglutils.c: - * tests/examples/gl/qt/qglwtextureshare/pipeline.cpp: - * tests/examples/gl/sdl/sdlshare.c: - gl/examples: update for other-context property removal - -2014-10-30 16:48:00 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.h: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.h: - glcontext: add more functionality to wrapped contexts - Implements get_current_context() and get_proc_address() for wrapped - contexts. - -2014-10-30 12:43:09 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - glshader: advertise the default vertex and fragment shaders on desktop GL - -2014-05-22 13:13:14 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: recognize SVC NAL units. - Identify SVC NAL units and tag them as such. This is necessary for - gst_h264_parser_parse_slice_hdr() to fail gracefully, if the user - did not perform the check himself. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-10-29 14:53:15 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix number of list0 {,non-}anchor refs. - Fix copy-paste error in gst_h264_sps_mvc_copy() where num_anchor_refs_l0 - and num_non_anchor_refs_l0 were incorrectly initialized from list1. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-10-29 13:51:40 +0000 Tim-Philipp Müller <tim@centricular.com> - - * win32/common/libgstcodecparsers.def: - Update .def for new API - -2014-10-29 13:15:51 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: sprinkle some gtk-doc Since: markers for new API - -2014-10-29 12:22:14 +0100 Lubosz Sarnecki <lubosz@gmail.com> - - * ext/gl/gstglimagesink.c: - satisfy gst-indent - -2014-10-29 22:23:13 +1000 Jan Schmidt <jan@centricular.com> - - * ext/gl/gstglfiltercube.c: - glfiltercube: Fix typo in property description - -2014-10-29 22:23:02 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: Initialise nalu extension type to NONE - Always set a default NALU extension type, and override it - when we find a supported extension, to avoid having it unset/random - for unsupported NALU extensions - -2014-10-07 16:28:03 +1100 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: Fix frame packing SEI parsing - -2014-03-25 14:08:44 +0100 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst/videoparsers/gsth264parse.c: - codecparsers: h264: add support for Frame Packing Arrangement SEI message. - This parses the frame_packing_arragement() payload in SEI message. - This information can be used by decoders to appropriately rearrange the - samples which belong to Stereoscopic and Multiview High profiles. - https://bugzilla.gnome.org/show_bug.cgi?id=685215 - Signed-off-by: Sreerenj Balachandran <sreerenj.balachandran@intel.com> - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-03-08 18:17:16 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst/videoparsers/gsth264parse.c: - codecparsers: h264: add support for Stereo Video Information SEI message. - Add the necessary payload parsing support for stereo_video_info. - https://bugzilla.gnome.org/show_bug.cgi?id=685215 - Signed-off-by: Sreerenj Balachandran <sreerenj.balachandran@intel.com> - -2012-10-01 13:36:45 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: parse seq_parameter_set_mvc_extension(). - https://bugzilla.gnome.org/show_bug.cgi?id=685215 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2012-09-26 18:46:36 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: parse MVC syntax elements. - https://bugzilla.gnome.org/show_bug.cgi?id=685215 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-10-29 22:58:37 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/mpegtsparse.c: - tsparse: Handle backward and discont timestamps better. - Assume that small backward PCR jumps are just from upstream packet - mis-ordering and don't reset timestamp tracking state - assuming that - things will be OK again shortly. - Make the threshold for detecting discont between sequential buffers - configurable and match the smoothing-latency setting on tsparse - to better cope with data bursts. - -2014-10-29 22:58:37 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/mpegtsparse.h: - tsparse: Implement timestamp/retimestamping of output buffers - When the set-timestamps property is set, use PCRs on the provided - (or autodetected) pcr-pid to apply (or replace) timestamps on the - output buffers, using piece-wise linear interpolation. - This allows tsparse to be used to stream an arbitrary mpeg-ts file, - or to smooth jittery reception timestamps from a network stream. - The reported latency is increased to match the smoothing latency if - necessary. - -2014-10-29 10:09:35 +0100 Vincent Abriou <vincent.abriou@st.com> - - * configure.ac: - configure.ac: auto decision to include GL library fails - The part of the configure.ac that consist to check if we - can include both GL and GLES2 at the same time is failing. - Indeed, in the case NEED_GLES2=yes and NEED_OPENGL=auto, - HAVE_OPENGL variable is updated whereas it should be HAVE_GL - variable that has to be updated (HAVE_OPENGL variable is not - used in the rest of the configure.ac). - https://bugzilla.gnome.org/show_bug.cgi?id=739348 - Signed-off-by: Vincent Abriou <vincent.abriou@st.com> - Reviewed-by: Benjamin GAIGNARD <benjamin.gaignard@linaro.org> - -2014-10-29 10:37:38 +0000 Luis de Bethencourt <luis.bg@samsung.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: remove ignored increment of return - 'return val++;' returns the value before it is incremented because the post - increment happens after the statement. Removing the unused increment. - https://bugzilla.gnome.org/show_bug.cgi?id=739345 - -2014-10-29 08:27:57 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * ext/gl/gstglmixer.c: - glmixer:fix incorrect parameter passed to handle_set_context - -2014-10-28 21:42:31 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/webp/gstwebpdec.h: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst/camerabin2/gstwrappercamerabinsrc.h: - * sys/uvch264/gstuvch264_src.h: - Add some missing G_END_DECLS - -2014-10-28 17:44:47 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/faad/gstfaad.c: - faad: fix wrong unrefs in set_format error code path - -2014-10-28 18:27:11 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: get the config from the correct pool - -2014-10-28 18:01:27 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: avoid uninitialized variable size when chaining multiple glfilters - https://bugzilla.gnome.org/show_bug.cgi?id=739277 - -2014-10-28 18:01:01 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: gst-indent file - -2014-10-28 17:31:37 +1100 Matthew Waters <matthew@centricular.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.h: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.h: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.h: - * tests/check/libs/gstglcontext.c: - glcontext: add api for retreiving the current context and api - that is current in the calling thread. - -2014-10-21 19:03:08 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/glprototypes/Makefile.am: - * gst-libs/gst/gl/glprototypes/all_functions.h: - * gst-libs/gst/gl/glprototypes/vao.h: - glprototypes: add vertex attribute array definitions - -2014-10-27 17:57:46 +0100 Sebastian Dröge <sebastian@centricular.com> - - * common: - Automatic update of common submodule - From 84d06cd to 7bb2bce - -2014-10-27 15:34:58 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintervideosrc.c: - inter: Use 64-bit safe scaling functions - -2014-10-27 12:43:53 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: reflow switch case statement a bit - Make it clear there's no 'break' missing at the end - of the case SYS_DVBT, and pacify coverity (CID 1249689). - -2014-06-12 16:59:46 +0200 L. Sorin <sorin@axis.com> - - * ext/curl/gstcurlsshsink.c: - * ext/curl/gstcurlsshsink.h: - curlsshsink: use the locally defined types - Just a matter of coding style, makes the code a bit tidier... - https://bugzilla.gnome.org/show_bug.cgi?id=731581 - -2014-10-26 15:45:20 +0000 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - Parallelise 'make check-valgrind' - -2014-10-26 15:44:05 +0000 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: check for more openh264 API that we need - -2014-10-25 18:50:42 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/audiomixer.c: - tests: fix audiomixer test on big endian systems - -2014-10-24 21:42:58 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: correctly capitalize DiSEqC - -2014-10-24 20:12:23 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: rework _output_frontend_stats() - Retry stat reporting ioctls on EINTR - -2014-10-24 19:30:25 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add checks on allowed DVB-T bandwidths - -2014-10-24 19:12:33 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add fixme note on DTV_LNA setting - Rephrase another comment while at it - -2014-10-24 18:57:40 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add missing logic for additional bandwidths - New 1.712, 5 and 10 MHz bandwidths were been ignored - at set/get prop. - -2014-10-24 15:53:59 +0200 Edward Hervey <bilboed@bilboed.com> - - * configure.ac: - configure.ac: Use libsrtp.pc if present - -2014-10-23 17:42:27 +0300 Vootele Vesterblom <vov@bang-olufsen.dk> - - * gst/rawparse/gstrawparse.c: - rawparse: fix handling of segment event in sink event handler - -2014-10-24 00:35:22 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: override the caps query in order to 'convert' capsfeatures - Otherwise, it is only possible for the sink pads and the src pads to - have the exact same caps features. We can convert from any feature - to another feature so support that. - -2014-10-23 23:55:48 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: override the accept caps query in order to 'convert' capsfeatures - Otherwise, it is only possible for the sink pads and the src pads to - have the exact same caps features. We can convert from any feature - to another feature so support that. - -2014-08-14 23:29:00 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglmixer.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - gl: propogate other-context using GstContext - -2014-10-20 03:07:08 -0600 Brendan Long <self@brendanlong.com> - - * ext/dash/README: - dash: Remove obsolete README. - https://bugzilla.gnome.org/show_bug.cgi?id=738848 - -2014-10-22 19:34:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - interaudio: Add support for arbitrary raw audio formats - -2014-10-22 19:31:31 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosrc.c: - * gst/inter/gstintervideosrc.h: - intervideo: Add support for arbitrary video formats - -2014-10-22 19:28:48 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintervideosrc.c: - inter: Truncate the caps as part of the fixating - -2014-10-22 19:08:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - interaudio: Fix timestamp, latency and period handling - -2014-10-22 18:41:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - interaudio: Use GST_DEBUG_OBJECT() instead of GST_DEBUG() - -2014-10-22 18:40:01 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosink.h: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstinteraudiosrc.h: - * gst/inter/gstintersurface.h: - interaudio: Properly pass through caps from the sink to the source - Otherwise a magic capsfilter after the source is required with - exactly the same caps as the input. - -2014-10-22 18:13:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstintersurface.c: - * gst/inter/gstintersurface.h: - inter: Clean up surfaces after the last user is gone - -2014-10-22 18:07:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintersurface.c: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosrc.c: - inter: Whitespace cleanup - -2014-10-22 18:03:13 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstintersurface.h: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosink.h: - * gst/inter/gstintervideosrc.c: - * gst/inter/gstintervideosrc.h: - intervideo: Properly pass through caps from the sink to the source - Otherwise a magic capsfilter after the source is required with - exactly the same caps as the input. - This would've failed before with invalid buffer sizes: - gst-launch-1.0 videotestsrc ! intervideosink intervideosrc ! "video/x-raw,width=640,height=480" ! xvimagesink - -2014-10-22 15:07:04 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/rawparse/gstrawparse.c: - rawparse: Check for 0-size after adjusting the size for the frame size - If we don't have a complete raw audio frame we would otherwise still - ask for a 0 sized buffer from the adapter. - -2014-10-22 14:43:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/rawparse/gstrawparse.c: - rawparse: Don't try to retrieve 0 byte buffers from the adapter in multi-frame mode - -2014-10-22 13:03:30 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: improve openh264 check - The openh264 API is still unstable, so check for - structure member that we need to prevent building - against an older incompatible version. - -2014-10-22 12:36:36 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: simplify openh264 check - Of course PTHREADS_CFLAGS is not used anywhere now - for the check, but that was the case before as well. - -2014-10-21 16:21:08 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: Fix compiler warning - gstglwindow_cocoa.m: In function '-GstGLNSView drawRect:': - gstglwindow_cocoa.m:555: warning: 'GstGLNSView' may not respond to '-reshape' - gstglwindow_cocoa.m:555: warning: (Messages without a matching method signature - gstglwindow_cocoa.m:555: warning: will be assumed to return 'id' and accept - gstglwindow_cocoa.m:555: warning: '...' as arguments.) - -2014-10-21 15:42:32 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Fix locking - The object lock only protects the session, as we modify - the session from other threads when the bitrate property - is changed. Don't hold it much longer than for session - related things. - And we need to release the video decoder stream lock before - enqueueing a frames. It might wait for our callback to dequeue - a frame from another thread, which will then take the stream - lock too and deadlock. - -2014-10-21 13:01:45 +0100 Tim-Philipp Müller <tim@centricular.com> - - * common: - Automatic update of common submodule - From a8c8939 to 84d06cd - -2014-10-21 13:28:50 +0200 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - configure: use a macro to check for pthread - Replace the hardcoded -lpthread in most of the places with $PTHREAD_LIBS. For - openh264 also add $PTHREAD_LIBS to OPENH264_LIBS until upstream ships a .pc - file. - -2014-10-21 12:58:39 +0200 Stefan Sauer <ensonic@users.sf.net> - - * README: - * common: - Automatic update of common submodule - From 36388a1 to a8c8939 - -2014-10-21 12:39:14 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: reset end_of_playlist attribute when we receive a seek - https://bugzilla.gnome.org/show_bug.cgi?id=738696 - -2014-10-20 18:25:08 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst/audiomixer/gstaudiomixer.c: - audiomixer: critical error for blocksize, timeout min/max values - Audiomixer blocksize, cant be 0, hence adjusting the minimum value to 1 - timeout value of aggregator is defined with MAX of MAXINT64, - but it cannot cross G_MAXLONG * GST_SECOND - 1 - Hence changed the max value of the same - https://bugzilla.gnome.org/show_bug.cgi?id=738845 - -2014-10-21 06:04:10 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: fixup eglimage include path - -2014-10-21 02:52:05 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: fixate the parts of the caps we don't know how to deal with - fixes glvideomixer with video/x-raw,width=foo i.e. no format field. - -2014-10-18 10:03:43 +0200 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglfilter.c: - glbufferpool: add the GstVideoGLTextureUploadMeta buffer pool option - -2014-10-20 10:34:27 +1100 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - * gst/compositor/compositor.c: - videoaggregator: operate on caps rather than video info - Otherwise the CapsFeatures will be lost along with the possibility - of multiple output types and formats. - https://bugzilla.gnome.org/show_bug.cgi?id=738129 - -2014-09-19 11:37:56 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: introduce a helper to make sequence-layer - It will be useful to implement stream-format conversion. - https://bugzilla.gnome.org/show_bug.cgi?id=738526 - -2014-10-20 02:27:15 -0600 Brendan Long <self@brendanlong.com> - - * configure.ac: - gl: Check for GLU before trying to use it in configure.ac - https://bugzilla.gnome.org/show_bug.cgi?id=738816 - -2014-10-20 15:02:28 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstglmemory.c: - glcolorconvert: support RGB16/BGR16 video format upload - https://bugzilla.gnome.org/show_bug.cgi?id=738842 - -2014-10-09 15:12:01 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * tests/check/libs/vc1parser.c: - vc1parser: fix expected level in sequence-layer parsing unit test - Sequence-layer used for unit test have a level set to 2 which should - match the medium level, not the high. - https://bugzilla.gnome.org/show_bug.cgi?id=738230 - -2014-10-09 15:05:55 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst-libs/gst/codecparsers/gstvc1parser.h: - vc1parser: fix level values for simple/main profile - In simple profile, level set to 0 or 2 indicate low and medium level - respectively. In main profile, level set to 0, 2 or 4 indicate low, - medium and high level respectively. - Level values are defined in Annex J.1.2 of the SMPTE 421M. - https://bugzilla.gnome.org/show_bug.cgi?id=738230 - -2014-08-02 11:29:37 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: send initial GAP event on sparse streams for faster startup with playbin - Signal sparse streams properly in stream-start event and force sending - of pending sticky events which have been stored on the pad already and - which otherwise would only be sent on the first buffer or serialized - event (which means very late in case of subtitle streams). Playsink in - playbin waits for stream-start or another serialized event, and if we - don't do this it will wait for the multiqueue to run full before - starting playback, which might take a couple of seconds. - https://bugzilla.gnome.org/show_bug.cgi?id=734040 - -2014-10-20 12:30:50 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: GAP detection - All pads of a stream are now added at the beginning. In order to cope with - streams that don't get any data (forever or for a long time) we detect gaps - and push out GAP events when needed. - Cleanups and commenting by Jan Schmidt <jan@centricular.com> - https://bugzilla.gnome.org/show_bug.cgi?id=734040 - -2014-10-01 16:17:46 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - * gst/videoparsers/gstvc1parse.h: - vc1parse: select caps according to wmv format at negotiation - Some VC1 decoder can have different caps according to wmv format, ie - WMV3 or WVC1. - So instead of keeping the first available caps, we interserct with - current WMV format. - https://bugzilla.gnome.org/show_bug.cgi?id=738532 - -2014-10-20 11:22:54 +0200 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - configure: add pthread to the configure check for openh264 - -2014-10-20 09:47:27 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/rtmp/gstrtmpsink.c: - rtmpsink: Declare sink variable that was forgotten in last commit - -2014-10-19 20:35:41 +0200 Havard Graff <havard.graff@gmail.com> - - * ext/rtmp/gstrtmpsink.c: - rtmpsink: Free URI string in finalize() - https://bugzilla.gnome.org/show_bug.cgi?id=738674 - -2014-10-17 21:26:52 -0700 Brion Vibber <brion@pobox.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: Fix for building on Mac OS X 10.10 - Using NSApp directly seems to confuse something, as the compiler - was expecting an id<NSFileManagerDelegate>. Switched to using - NSApplication sharedApplication, and specified the delegate - protocol on the window class as well. - https://bugzilla.gnome.org/show_bug.cgi?id=738740 - -2014-10-19 14:57:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Use kVTProfileLevel_H264_Baseline_AutoLevel only on iOS - It is not required on OSX apparently and was only added in 10.9.6 there. - Calculating the correct level from the configuration is not trivial, so let's - just not set a level at all here. - -2014-10-19 14:51:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * sys/applemedia/vtenc.c: - vtenc: VTCompressionSessionPrepareToEncodeFrames only exists since 10.9.6 - Check with configure for it instead of using one of the availability macros - as those wouldn't work as expected with minor versions. - -2014-10-19 14:32:31 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Remove unused #define - -2014-10-19 13:44:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/rtp/Makefile.am: - rtpbad: Fix make dist by removing non-existing file from EXTRA_DIST - It's used by the rtp plugin in gst-plugins-good for VP8 but not needed - or used here. - -2014-10-17 16:51:27 +0200 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/rtp/Makefile.am: - rtpbad: include plugins base cflags (fix build on jenkins) - -2014-10-16 10:34:01 +0200 Thijs Vermeir <thijsvermeir@gmail.com> - - * configure.ac: - * gst/rtp/Makefile.am: - * gst/rtp/gstrtp.c: - * gst/rtp/gstrtph265depay.c: - * gst/rtp/gstrtph265depay.h: - * gst/rtp/gstrtph265pay.c: - * gst/rtp/gstrtph265pay.h: - rtp: add h265 RTP payloader + depayloader - -2014-10-15 15:25:55 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/curl/gstcurlbasesink.c: - curlbasesink: strip newlines from curl debug messages - The messages we receive in the custom log handler might end with a newline and - are not \0 terminated. Copy the messages, trim and terminate them. - -2014-10-15 15:24:12 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/curl/gstcurlbasesink.c: - curlbasesink: small code cleanup - Use a local var and save a local var. - -2014-10-15 16:52:09 +0200 Thijs Vermeir <thijsvermeir@gmail.com> - - * tests/check/Makefile.am: - * tests/check/elements/x265enc.c: - tests/x265enc: add simple unit test - -2014-03-05 16:39:30 +0100 Thijs Vermeir <thijsvermeir@gmail.com> - - * configure.ac: - * ext/Makefile.am: - * ext/x265/Makefile.am: - * ext/x265/gstx265enc.c: - * ext/x265/gstx265enc.h: - x265enc: add x265 encoder element - -2014-10-14 14:00:11 +0200 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgldeinterlace.c: - gldeinterlace: ref the uploaded buffer - Instead of the possibly non-GL input buffer. - -2014-10-14 16:41:51 +0200 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - glfilter: add uploaded_buffer field - -2014-09-22 09:44:14 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: parse frame header when stream format is ASF/raw for simple/main profile - When stream-format is ASF or sequence-layer-raw-frame, we basically have - a raw frame so we can parse it to extract some information such the - keyframe flag. The only requirement is to have a valid sequence-header. - This commit parse the frame header and set the DELTA_UNIT buffer flag in - case the frame is not a keyframe. - https://bugzilla.gnome.org/show_bug.cgi?id=738519 - -2014-10-14 10:51:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/libde265/libde265-dec.c: - libde265: Change rank to SECONDARY, gst-libav has PRIMARY rank - -2014-09-17 10:38:44 +0200 Joachim Bauch <bauch@struktur.de> - - * configure.ac: - * ext/Makefile.am: - * ext/libde265/Makefile.am: - * ext/libde265/gstlibde265.c: - * ext/libde265/libde265-dec.c: - * ext/libde265/libde265-dec.h: - * gst-plugins-bad.spec.in: - Integrate libde265 into gst-plugins-bad. - -2014-10-13 14:05:24 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: just assume none header-format when no codec_data is present - https://bugzilla.gnome.org/show_bug.cgi?id=738449 - -2014-10-14 09:19:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: Set reorder length to 0 if we can't calculate it - Instead of leaving it at whatever value it had before. - -2014-10-13 13:28:57 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Only finalize the other context in finalize() - Otherwise we change a value of a property when going to READY state, - which is unexpected behaviour. - -2014-10-13 13:27:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: Call the pad's parent class finalize method - -2014-10-13 13:27:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglmixer.c: - glmixer: Only finalize the other context in finalize() - Otherwise we change a value of a property when going to READY state, - which is unexpected behaviour. - -2014-10-13 13:25:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstgltestsrc.c: - * ext/gl/gstgltestsrc.h: - gltestsrc: Add other-context property - -2014-10-13 11:56:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Don't leak other-context - -2014-10-13 11:53:47 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - glmixer: Add other-context property - -2014-10-12 21:25:16 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - dvb: make interleaving a prop and proxy on dvbbasebin - DTV_INTERLEAVING is currently used only for DTBM. This is - congruent with the v4l dvb API where the different interleaving - modes where added for v5.7 - -2014-10-12 18:30:38 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add transmission mode checks for DVB-T/T2 - These and every sanity check leading to a warning - (we have a few in place) should come handy when - debuging failed tunning scenarios. - -2014-10-12 13:34:09 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: docs, drop v5 API change history comments < .5 - We only support from minor 5 and up now. Also add a - note about the recently added preliminar DTMB support. - -2014-10-12 13:08:13 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add missing DVB-T2 bandwidth types - DVB-T2 supports 5, 10 and 1.712 MHz - Order of the enum values (new values after _AUTO) - has been kept congruent with the one in the v4l - API for consistency - -2014-10-07 10:37:33 +0200 Benjamin Gaignard <benjamin.gaignard@linaro.org> - - * ext/wayland/gstwaylandsink.c: - waylandsink: do not render twice the same buffer - Do not try to render a buffer that is already being rendered. - This happens typically during the initial rendering stage as the first - buffer is rendered twice: first by preroll(), then by render(). - This commit avoids this assertion failure: - CRITICAL: gst_wayland_compositor_acquire_buffer: assertion - 'meta->used_by_compositor == FALSE' failed - https://bugzilla.gnome.org/show_bug.cgi?id=738069 - Signed-off-by: Fabien Dessenne <fabien.dessenne@st.com> - Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org> - -2014-07-24 16:53:53 +0200 Tifaine Inguere <tifaine.inguere@st.com> - - * ext/wayland/wlwindow.c: - waylandsink : Allow surface to catch input events - If waylandsink is the owner of the display then it is in charge - of catching input events on the surface. - https://bugzilla.gnome.org/show_bug.cgi?id=733682 - Signed-off-by: Tifaine Inguere <tifaine.inguere@st.com> - Reviewed-by: Benjamin Gaignard <benjamin.gaignard@linaro.org> - -2014-07-02 13:29:55 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/wlbuffer.c: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - waylandsink: take into account the case where a pool may be destroyed together with GstWlDisplay - There are two cases covered here: - 1) The GstWlDisplay forces the release of the last buffer and the pool - gets destroyed in this context, which means it unregisters all the - other buffers from the GstWlDisplay as well and the display->buffers - hash table gets corrupted because it is iterating. - 2) The pool and its buffers get destroyed concurrently from another - thread while GstWlDisplay is finalizing and many things get corrupted. - -2014-07-01 11:43:20 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlbuffer.c: - * ext/wayland/wlbuffer.h: - * ext/wayland/wlvideoformat.h: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: stack the video subsurface into another subsurface that covers the whole render rectangle - The main reason behind this is that when the video caps change and the video - subsurface needs to resize and change position, the wl_subsurface.set_position - call needs a commit in its parent in order to take effect. Previously, - the parent was the application's surface, over which there is no control. - Now, the parent is inside the sink, so we can commit it and change size smoothly. - As a side effect, this also allows the sink to draw its black borders on - its own, without the need for the application to do that. And another side - effect is that this can now allow resizing the sink when it is in top-level - mode and have it respect the aspect ratio. - -2014-06-20 16:24:36 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlshmallocator.c: - * ext/wayland/wlvideoformat.c: - * ext/wayland/wlvideoformat.h: - waylandsink: rename video format conversion functions to indicate they are about wl_shm - Needed to add linux_dmabuf format conversion functions later - -2014-06-23 17:27:01 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlbuffer.c: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - waylandsink: remove the ugly gst_wl_display_stop() now that this mechanism is not needed anymore - Because we no longer have a custom buffer pool that holds a reference - to the display, there is no way for a cyclic reference to happen like - before, so we no longer need to explicitly call a function from the - display to release the wl_buffers. - However, the general mechanism of registering buffers to the display - and forcibly releasing them when the display is destroyed is still - needed to avoid potential memory leaks. The comment in wlbuffer.c - is updated to reflect the current situation. - -2014-06-23 16:40:02 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/Makefile.am: - * ext/wayland/gstwaylandsink.c: - * ext/wayland/waylandpool.c: - * ext/wayland/waylandpool.h: - * ext/wayland/wlshmallocator.c: - * ext/wayland/wlshmallocator.h: - waylandsink: replace the custom buffer pool with an allocator - This reduces the complexity of having a custom buffer pool, as - we don't really need it. We only need the custom allocation part. - And since the wl_buffer is no longer saved in a GstMeta, we can - create it and add it on the buffers in the sink's render() - function, which removes the reference cycle caused by the pool - holding a reference to the display and also allows more generic - scenarios (the allocator being used in another pool, or buffers - being allocated without a pool if anything stupid does that). - This commit also simplifies the propose_allocation() function, - which doesn't really need to do all these complicated checks, - since there is always a correct buffer pool available, created - in set_caps(). - The other side effect of this commit is that a new wl_shm_pool - is now created for every GstMemory, which means that we use - as much shm memory as we actually need and no more. Previously, - the created wl_shm_pool would allocate space for 15 buffers, no - matter if they were being used or not. - -2014-06-20 14:47:57 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/Makefile.am: - * ext/wayland/gstwaylandsink.c: - * ext/wayland/waylandpool.c: - * ext/wayland/waylandpool.h: - * ext/wayland/wlbuffer.c: - * ext/wayland/wlbuffer.h: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - waylandsink: rework the mechanism for keeping buffers out of the pool until wl_buffer::release - This also removes the GstWlMeta and adds a wrapper class for wl_buffer - which is saved in the GstBuffer qdata instead of being a GstMeta. - The motivation behind this is mainly to allow attaching wl_buffers on - GstBuffers that have not been allocated inside the GstWaylandBufferPool, - so that if for example an upstream element is sending us a buffer - from a different pool, which however does not need to be copied - to a buffer from our pool because it may be a hardware buffer - (hello dmabuf!), we can create a wl_buffer directly from it and first, - attach it on it so that we don't have to re-create a wl_buffer every - time the same GstBuffer arrives and second, force the whole mechanism - for keeping the buffer out of the pool until there is a wl_buffer::release - on that foreign GstBuffer. - -2014-10-09 08:20:15 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * ext/schroedinger/gstschrodec.c: - schrodec: optimize parse logic - Header will be read each and everytime parse function will be called - which is not necessary since until we have complete data, - we need not parse the header again. - https://bugzilla.gnome.org/show_bug.cgi?id=737984 - -2014-10-10 13:05:49 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/fluidsynth/gstfluiddec.c: - fluiddec: don't leak incoming caps event - https://bugzilla.gnome.org/show_bug.cgi?id=738291 - -2014-10-09 18:18:02 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: fix framesize when input is frame-layer - frame-layer header is represented as a sequence of 32 bit unsigned - integer serialized in little-endian byte order, so framesize is on the - first 3 bytes. - SMPTE 421M Annex L. - https://bugzilla.gnome.org/show_bug.cgi?id=738243 - -2014-10-07 17:05:04 +0200 Antonio Ospite <ao2@ao2.it> - - * gst/midi/midiparse.c: - midiparse: mention fluiddec instead of fluidsynth - The element name is actually fluiddec even if it uses fluidsynth. - https://bugzilla.gnome.org/show_bug.cgi?id=738223 - -2014-10-09 11:51:16 +0200 Antonio Ospite <ao2@ao2.it> - - * ext/fluidsynth/gstfluiddec.c: - fluiddec: fix some memory leaks - https://bugzilla.gnome.org/show_bug.cgi?id=738223 - -2014-10-09 04:11:00 -0400 David Woodhouse <dwmw2@infradead.org> - - * gst/pcapparse/gstpcapparse.c: - * gst/pcapparse/gstpcapparse.h: - pcapparse: Add support for LINKTYPE_RAW - Also, strictly speaking, these numbers aren't DLT_*; they are LINKTYPE_* because - libpcap translates from internal OS-specific DLT_ numbering to the portable - LINKTYPE_ number space when writing files. - https://bugzilla.gnome.org/show_bug.cgi?id=738206 - -2014-10-09 14:51:56 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * tests/check/elements/audiomixer.c: - test: use G_GSIZE_FORMAT in audiomixer test - https://bugzilla.gnome.org/show_bug.cgi?id=738227 - -2014-10-07 16:57:27 +1100 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/aggregator.c: - tests/aggregator: add timeout handling test for the timeout parameter - -2014-10-06 21:46:24 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst/audiomixer/gstaudiomixer.c: - aggregator: add latency query handling - -2014-10-06 18:33:52 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: support unresponsive pads - Render unresponsive pads with the last video frame received. - -2014-10-06 18:23:03 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - aggregator: add a timeout property determining buffer wait time - Determines the amount of time that a pad will wait for a buffer before - being marked unresponsive. - Network sources may fail to produce buffers for an extended period of time, - currently causing the pipeline to stall possibly indefinitely, waiting for - these buffers to appear. - Subclasses should render unresponsive pads with either silence (audio), the - last (video) frame or what makes the most sense in the given context. - -2014-10-06 18:10:38 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - videoaggregator: remove the use of the queued buffer on sink pads - That data is now held by the aggregator class - -2014-10-09 11:46:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: expose parsed profile, tier and level to downstream - https://bugzilla.gnome.org/show_bug.cgi?id=732239 - -2014-10-09 01:18:16 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: expose parsed profile and level to downstream - Set parsed profile and level in src caps. - https://bugzilla.gnome.org/show_bug.cgi?id=732239 - -2014-10-09 10:54:35 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: Add support for HiDPI displays - Without this our GL surface would be upscaled after rendering - by Cocoa, which would reduce image quality. - -2014-10-09 12:28:11 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: output why we cannot convert a buffer - -2014-10-09 12:25:55 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: fix planar YUV download - - sample the u and v planes properly - - output the correctly scaled u and v planes for different chroma block sizes - -2014-10-08 21:51:12 +0300 Vivia Nikolaidou <n.vivia@gmail.com> - - * ext/gl/gstgloverlay.c: - gloverlay: And fix another unused variable compiler warning - -2014-10-08 21:49:25 +0300 Vivia Nikolaidou <n.vivia@gmail.com> - - * ext/gl/gstgloverlay.c: - gloverlay: Fix unused variable compiler warning when compiling without desktop GL - -2014-09-26 13:55:20 +0530 Anuj Jaiswal <anuj.jaiswal@samsung.com> - - * ext/zbar/gstzbar.c: - zbar: Add YVU9 and YUV9 to ZBAR_YUV_CAPS - https://bugzilla.gnome.org/show_bug.cgi?id=737407 - -2014-09-28 10:51:09 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * ext/gl/gltestsrc.c: - * ext/gl/gstgltestsrc.c: - gltestsrc: implement checkers pattern with GLSL - https://bugzilla.gnome.org/show_bug.cgi?id=737505 - -2014-10-07 15:24:10 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/hlsdemux_m3u8.c: - hlsdemux: Fix M3U8 parsing unit test after API changes - -2014-10-02 10:37:57 -0600 Thomas Bluemel <tbluemel@control4.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: Fix accessing invalidated memory - In gst_hls_demux_get_next_fragment() the next fragment URI gets - stored in next_fragment_uri, but the gst_hls_demux_updates_loop() - can at any time update the playlist, rendering this string invalid. - Therefore, any data (like key, iv, URIs) that is taken from a - GstM3U8Client needs to be copied. In addition, accessing the - internals of a GstM3U8Client requires locking. - https://bugzilla.gnome.org/show_bug.cgi?id=737793 - -2014-10-07 12:12:04 +0200 Felix Schwarz <felix.schwarz@oss.schwarz.eu> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/mpegts.h: - mpegts: fix typos in comments - https://bugzilla.gnome.org/show_bug.cgi?id=738072 - -2014-10-07 23:04:30 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: fix UYVY download green screen - -2014-10-07 22:50:22 +1100 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolrconvert: fix YUY2 download - - The shader was outputing the wrong values compared with raw - videotestsrc. - - deal with the texture edge properly. - - properly sample the 2x1 rectangle for the u and v values - - don't double sample the y value - -2014-10-06 21:25:30 +0300 Vivia Nikolaidou <n.vivia@gmail.com> - - * ext/curl/gstcurlsmtpsink.c: - curlsmtpsink: Set CURLOPT_UPLOAD to 1 to not use VRFY and other unneeded commands - Fixes the sink with SMTP servers that disable VRFY for spam protection. - http://sourceforge.net/p/curl/bugs/1389/ - -2014-09-17 16:48:02 +0200 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Replace GMainContext with GAsyncQueue (v2) - The previous implementation kept accumulating GSources, - slowing down the iteration and leaking memory. - Instead of trying to fix the main context flushing, replace - it with a GAsyncQueue which is simple to flush and has - less overhead. - https://bugzilla.gnome.org/show_bug.cgi?id=736782 - -2014-10-06 13:09:00 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Handle seek event in READY state - -2014-07-21 11:07:19 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst/audiomixer/gstaudiomixer.c: - * gst/audiomixer/gstaudiomixer.h: - audiomixer: Set the sinkpad segments basetime after seeking - Otherwise stream offset and running time comparison will not be - correct, leading to segfaults after seeks - -2014-05-28 16:29:37 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst/audiomixer/Makefile.am: - * gst/audiomixer/gstaudiomixer.c: - * gst/audiomixer/gstaudiomixer.h: - * tests/check/elements/audiomixer.c: - audiomixer: Port to GstAggregator - https://bugzilla.gnome.org/show_bug.cgi?id=737183 - Co-Authored by: Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - -2014-09-23 15:59:10 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Do not wrongly set the aggregator.segment - The aggregator.segment is not to be initialized by the subclasses but - by the aggregator itself. Moreover, initializing it on start would make - us loose the information coming from the initial seek. - -2014-07-30 11:57:46 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Make sure not to unref a NULL pointer - -2014-08-05 15:36:30 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Set seqnum only when segments are received. - -2014-08-02 18:25:01 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Add a streaming lock so to secure flush start action - Without a lock that is taken in FLUSH_START we had a rare race where we - end up aggregating a buffer that was before the whole FLUSH_START/STOP - dance. That could lead to very wrong behaviour in subclasses. - -2014-07-18 13:58:55 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Query seeking when a seek failed to see if it was expected - And do not worry if seeking failed on a stream that is not seekable - -2014-07-18 01:41:26 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: set future seqnum before propagating the seek event. - So the seqnum is properly set for the following events. - -2014-07-08 16:16:55 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Store segment when seeked in READY for later use - -2014-10-06 16:44:51 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264plugin.c: - openh264: Use a MARGINAL rank for the encoder and decoder - They work but for now we prefer others until these are extensively tested. - -2014-10-01 10:57:26 +0200 Lihua Liu <lihual@axis.com> - - * ext/curl/gstcurlsmtpsink.c: - curlsmtpsink: Email with multipart content-type should end with a final boundary - Add final boundary for each of the sending out emails from smtpsink. - https://bugzilla.gnome.org/show_bug.cgi?id=736134 - -2014-10-06 11:44:12 +0100 Vineeth T M <vineeth.tm@samsung.com> - - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstvc1parse.h: - videoparser: comment unused GST_BASE_PARSE_FRAME_FLAG_PARSING - GST_BASE_PARSE_FRAME_FLAG_PARSING value is wrong, and the same flag is - not being used presently. Hence changing the value and commenting it out. - This needs to be included in baseparse.h later on - https://bugzilla.gnome.org/show_bug.cgi?id=737411 - -2014-10-04 20:55:08 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: make denoise work - https://bugzilla.gnome.org/show_bug.cgi?id=737894 - -2014-10-06 10:11:47 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Unmap and free GstVideoFrames as needed after conversion and errors - -2014-10-06 10:11:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Unref the taglist in GstAggregator::stop() - -2014-10-03 20:42:58 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add preliminary support for DTMB - Previously known as DMB-T/H, this is the - terrestial DTV broadcast standard currently - used by the People's Republic of China, - Hong Kong, Laos and Macau (officially), - and by Malaysia, Iraq, Jordan, Syria and - Lebanon (experimentally). - -2014-10-03 20:20:30 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add missing standard transmission modes - These apply to ISDB-T, DVB-T2 and DTMB - Order of the enum values (new rates after _AUTO) - has been kept congruent with the one in the v4l - API for consistency. - -2014-10-03 20:03:27 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add missing DTMB guard intervals - -2014-10-03 19:55:02 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add missing DVB-T2 guard intervals - According to the v4l-dvb API docs, these are only - used for DVB-T2 at the moment. - Order of the enum values (new rates after _AUTO) - has been kept congruent with the one in the v4l - API for consistency. - -2014-10-03 19:20:03 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: fix typo in GstMpegtsExtendedEventDescriptor doc - -2014-10-03 19:06:21 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add _MUTABLE_PLAYING to tuning props - The element can (re)tune while playing so basically - every property used at set_fe_params() can be set - in state <= PLAYING. - -2014-10-03 17:22:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: The codec can only do baseline so simplify the code a bit - and declare this also on the srcpad caps. - With baseline profile there are no B-frames or frame reordering. - -2014-10-03 17:20:28 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: On ::finish() stop trying if the decoder returned that no output is available - -2014-10-03 13:54:22 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - * ext/openh264/gstopenh264enc.cpp: - * ext/openh264/gstopenh264plugin.c: - openh264: Run gst-indent over everything - -2014-10-03 13:52:32 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/Makefile.am: - openh264: Remove unused codecparsers lib - -2014-10-02 16:46:25 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - * ext/openh264/gstopenh264enc.cpp: - openh264: Add FIXME comment about missing API in openh264 - -2014-10-02 16:33:30 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Try to handle frame reordering - As openh264 has no way to attach any IDs to input frames that we then get on - the output frames, we have to assume that the input has valid PTS. We just - take the frame with the oldest PTS, and if there is no PTS information we take - the one with the oldest DTS. - -2014-10-02 16:23:37 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Don't drop videocodec frames if we can't decode them *yet* - Fixes jittery playback of streams with B frames. - -2014-10-02 16:21:37 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: GstVideoDecoder works on frames, not sub-frames (e.g. NALs) - And we can just pass complete AUs to the decoder without problems. - -2014-10-02 16:19:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: As we require NAL alignment from upstream we don't need to parse anything - -2014-10-02 15:48:51 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Properly drain codec on ::finish() - -2014-10-02 15:22:14 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Properly drain the encoder on ::finish() - -2014-10-02 14:36:45 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: We always get a single frame as output, not a NAL - No need to accumulate NALs. - -2014-10-02 14:20:21 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Fix up caps and stride handling - -2014-10-02 14:15:49 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Add support for GstVideoMeta - This will allow upstream elements to work more efficiently. - -2014-10-02 14:12:11 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Add support for GstVideoMeta - This will make operation with various sinks faster for free. - -2014-10-02 14:08:49 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Optimize frame copying a bit - -2014-10-02 14:06:58 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Don't forget to unref the input state - -2014-10-02 14:03:43 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Fix various crashes on ::stop() - -2014-10-02 14:00:06 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Remove invalid sprops-parameter-set handling - This only exists on RTP caps, not H264 caps. - -2014-10-02 13:53:01 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264enc.cpp: - openh264enc: Don't set caps manually - This will break the order of events in GStreamer. - -2014-10-02 13:49:14 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/openh264/gstopenh264dec.cpp: - openh264dec: Fix input state handling and propagation of upstream caps fields - -2014-10-03 13:45:26 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * ext/Makefile.am: - * ext/openh264/Makefile.am: - * ext/openh264/gstopenh264dec.cpp: - * ext/openh264/gstopenh264dec.h: - * ext/openh264/gstopenh264enc.cpp: - * ext/openh264/gstopenh264enc.h: - * ext/openh264/gstopenh264plugin.c: - openh264: Add OpenH264 based encoder/decoder elements - These are the openh264 elements released under the BSD-2 license - by Ericsson as part of the OpenWebRTC project. - https://github.com/EricssonResearch/openwebrtc-gst-plugins - https://bugzilla.gnome.org/show_bug.cgi?id=737788 - -2014-09-18 17:14:22 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Do not to release VIDEO_AGGREGATOR_LOCK while setting format info - We should be able to always keep the VIDEO_AGGREGATOR_LOCK while - negotiating caps, this patch introduce that change. - That also implies that we do not need the SETCAPS_LOCK anymore because - now VIDEO_AGGREGATOR_LOCK guarantees that setcaps is not called from - several threads and the gst_aggregator_set_caps method is now - protected. - https://bugzilla.gnome.org/show_bug.cgi?id=735042 - -2014-10-03 12:34:15 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Take lock to ensure set_caps is not called concurently - Avoiding to be in an inconsistent state where we do not have - actual negotiate caps set as srccaps and leading to point where we - try to unref ->srccaps when they have already been set to NULL. - https://bugzilla.gnome.org/show_bug.cgi?id=735042 - -2014-09-29 10:15:39 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst/aiff/aiffparse.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/coloreffects/gstchromahold.c: - * gst/dvdspu/gstdvdspu.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mxf/mxfdemux.c: - * gst/rawparse/gstrawparse.c: - * gst/sdp/gstsdpdemux.c: - gst: remove unnecessary GLIB_DISABLE_DEPRECATION_WARNINGS - There are unnecessary definitions for disabling deprecation warnings. - Since GLIB_DISABLE_DEPRECATION_WARNINGS is not needed anymore in these files, - removing the same. - https://bugzilla.gnome.org/show_bug.cgi?id=737559 - -2014-10-01 16:19:02 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: unref caps when it is empty in renegotiate() - https://bugzilla.gnome.org/show_bug.cgi?id=737724 - -2014-10-02 10:26:43 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Fix calculation of the frame size for COLOR_FormatYUV420Planar - https://bugzilla.gnome.org/show_bug.cgi?id=734156 - -2014-10-01 17:22:59 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Also copy over the chroma siting and colorimetry when deciding on a conversion - -2014-10-01 17:18:05 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Revert the last commit and handle resolutions differences properly - This is about converting the format, not about converting any widths and - heights. Subclasses are expected to handler different resolutions themselves, - like the videomixers already do properly. - -2014-10-01 17:11:16 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: GstVideoConverter currently can't rescale and will assert - Leads to ugly assertions instead of properly erroring out: - CRITICAL **: gst_video_converter_new: assertion 'in_info->width == out_info->width' failed - -2014-10-01 16:04:36 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: Always update our viewport if Cocoa tells us something has changed - The visible rect and bounds might be the same as before, but Cocoa - might've changed our viewport without us nothing. This happens if - you hide the view and show it again. - -2014-10-01 11:55:13 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: Handle NSView::renewGState() properly - Don't update the screen until we redraw, this prevents flickering during - scrolling, clipping, resizing, etc - -2014-10-01 00:53:59 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/fluidsynth/gstfluiddec.c: - fluiddec: don't crash on 0-sized input buffers - https://bugzilla.gnome.org/show_bug.cgi?id=737658 - -2014-09-30 14:58:06 +0200 Lubosz Sarnecki <lubosz@gmail.com> - - * configure.ac: - gltransformation: requires graphene 1.0.0 - -2014-09-25 17:01:31 +0200 Lubosz Sarnecki <lubosz@gmail.com> - - * ext/gl/gstgltransformation.c: - gltransformation: graphene multiplication order has changed - https://bugzilla.gnome.org/show_bug.cgi?id=733510 - -2014-09-30 20:39:36 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: update element documentation - -2014-09-30 18:26:34 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/Makefile.am: - * tests/check/libs/.gitignore: - * tests/check/libs/gstglcolorconvert.c: - tests/glcolorconvert: do reorder checking for rgba formats - -2014-09-30 14:46:14 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: convert xRGB into ARGB properly - The alpha channel might not be the last component so check which one - it is in and clobber that one instead. - -2014-09-30 01:45:20 +1000 Matthew Waters <matthew@centricular.com> - - * tests/check/libs/gstglmemory.c: - tests/glmemory: add simple transfer test - tests transferring to/from the GL with a 1x1 RGBA pixel. - -2014-09-30 01:38:05 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: unset the opposite corresponding transfer flags when mapped with write - fixes consistency with consecutive gst_memory_map()'s with - flags & GST_MAP_WRITE - -2014-09-29 09:33:42 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: Update viewport according to the current clipping - We have to update the GL viewport if the NSView is only partially - visible. Otherwise the content of the frame will be visibly offset. - -2014-09-29 10:01:27 +0200 Jesper Larsen <knorr.jesper@gmail.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: do not discard on discont if PES start - If a discontinuity in the stream is detected, data is discarded until - a new PES starts. If the first packet after the discontinuity is also - the start of a PES, there is no reason to discard the packets. - https://bugzilla.gnome.org/show_bug.cgi?id=737569 - -2014-07-31 22:57:40 +0100 David Waring <davidjw@rd.bbc.co.uk> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - dash: Use GstUri to join URIs - -2014-09-29 10:49:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - gl/cocoa: Improve the NSApplication initialization - This is only for non-Cocoa apps but previously caused a 2 second - waiting during startup for Cocoa apps. This is unacceptable. - Instead we now check a bit more extensive if something actually - runs on the GLib default main context, and if not don't even - bother waiting for something to happen from there. - -2014-09-29 09:24:49 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: NSView::drawRect() should call into reshape too - We a) need to render again because part of the window was - obscured and b) might need to reshape because of clipping - changes. - -2014-09-26 14:21:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: Call UI related API from the application main thread - -2014-09-26 13:05:27 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: Switch to a plain NSView subclass instead of NSOpenGLView - We don't and can't use NSOpenGLView as it's supposed to be used and - it gets into our way by being to clever in various situations. - -2014-09-29 08:54:29 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: Initialize variable - Avoids the following warning: - gstglcontext.c:647:58: error: 'prev' may be used uninitialized in - this function -Werror=maybe-uninitialized - -2014-09-28 18:03:09 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst-libs/gst/video/Makefile.am: - video: fix build in gst-uninstalled setup - Include the base video lib appropriately and resort all of them as - thaytan suggested. - -2014-09-29 00:23:57 +1000 Jan Schmidt <jan@centricular.com> - - * tests/examples/gl/qt/qglwtextureshare/README: - * tests/examples/gl/qt/qglwtextureshare/gstthread.cpp: - * tests/examples/gl/qt/qglwtextureshare/gstthread.h: - * tests/examples/gl/qt/qglwtextureshare/pipeline.cpp: - * tests/examples/gl/qt/qglwtextureshare/pipeline.h: - * tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp: - * tests/examples/gl/qt/qglwtextureshare/qglwtextureshare.pro: - examples: Fix Qt/GL qglwtextureshare example for X11 - We need to pass the X11 display to GstGL or else it will - use its own X11 Display pointer, and the GL Context won't get shared - correctly on newer X servers - -2014-09-28 20:21:50 +1000 Jan Schmidt <jan@centricular.com> - - * tests/examples/gl/qt/.gitignore: - * tests/examples/gl/qt/README: - * tests/examples/gl/qt/mousevideooverlay/main.cpp: - * tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pro: - * tests/examples/gl/qt/mousevideooverlay/pipeline.cpp: - * tests/examples/gl/qt/mousevideooverlay/pipeline.h: - * tests/examples/gl/qt/mousevideooverlay/qrenderer.cpp: - * tests/examples/gl/qt/mousevideooverlay/qrenderer.h: - * tests/examples/gl/qt/qglwidgetvideooverlay/main.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.h: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pro: - * tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp: - * tests/examples/gl/qt/qglwtextureshare/qglwtextureshare.pro: - * tests/examples/gl/qt/videooverlay/Debug/videooverlay: - * tests/examples/gl/qt/videooverlay/videooverlay.pro: - examples: port GL/Qt examples to Qt5 - Update the GL Qt integration examples for Qt5 changes and for GstGL - signal signature changes. - -2014-09-29 00:32:05 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: fixup error in sharegroup comment - -2014-09-29 00:27:30 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gltestsrc.c: - * ext/gl/gstgltestsrc.c: - Revert accidental push: "gltestsrc: implement checkers pattern with GLSL" - This reverts commit eae09179f0b4eb584c8fc7b6560d8fc8e86eed4c. - -2014-09-29 00:24:28 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: detect the sharegroup case where the context are in different chains - In the end they will lead to the same root context in the tree so check that - for equality. - -2014-09-28 10:51:09 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * ext/gl/gltestsrc.c: - * ext/gl/gstgltestsrc.c: - gltestsrc: implement checkers pattern with GLSL - -2014-09-28 21:18:32 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: silence a warning with empty input caps - discovered with the doublecube example - gst_caps_get_features: assertion 'index < GST_CAPS_LEN (caps)' failed - -2014-09-28 20:37:04 +1000 Matthew Waters <matthew@centricular.com> - - * tests/examples/gl/generic/cube/main.cpp: - * tests/examples/gl/generic/cubeyuv/main.cpp: - * tests/examples/gl/generic/doublecube/main.cpp: - * tests/examples/gl/generic/recordgraphic/main.cpp: - examples/gl: update for signal signature change - -2014-09-28 16:58:42 +1000 Matthew Waters <matthew@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: don't create converters when the subclass doesn't want them - fixes a critical with glvideomixer after - 35bd1969f912cecda0fb5df9595a005e6ddf4e7a - CRITICAL **: gst_video_converter_new: assertion 'in_info->width == out_info->width' failed - -2014-09-26 22:29:56 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgloverlay.c: - gloverlay: fix zero output frames with YUY2/UYVY - also, be nice and disable blending for other elements - -2014-09-26 22:22:06 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgloverlay.c: - gloverlay: protect desktop gl specific tokens with #if - -2014-09-26 12:28:10 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgloverlay.c: - gloverlay: free the image memory every time the location changes - fixes a memory leak - -2014-09-25 20:48:59 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/Makefile.am: - gloverlay: Include into the build with GLES2 only too - -2014-09-26 01:45:22 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgltestsrc.c: - gltestsrc: free the shader on stop - -2014-09-26 01:34:54 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: fix blending with low-alpha sources - We also need to apply the blend paramaters to the alpha channel otherwise - the output of the blend will appear black at low alpha values (< 0.2). - -2014-09-26 01:14:35 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstgloverlay.c: - * ext/gl/gstgloverlay.h: - * ext/gl/gstopengl.c: - gloverlay: reimplement everything - - update for shaders - - add alpha property - - image placement properties shamelessly borrowed from gdkpixbufoverlay - - image placement properties are GstController able - - use GstGLMemory for the overlay image data - - add support for gles2 - -2014-09-25 16:04:33 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/dvdspu/gstdvdspu.c: - * gst/jp2kdecimator/jp2kcodestream.c: - * gst/jpegformat/gstjifmux.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - style: remove unnecessary break statements - Code flow never arrives to these break statements due to the gotos preceding - them. So the breaks are unnecessary, as discussed in bug 736942. - https://bugzilla.gnome.org/show_bug.cgi?id=737370 - -2014-09-25 15:45:57 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * ext/mpeg2enc/gstmpeg2enc.cc: - mpeg2enc: break statement unnecessary - Code flow never arrives to the break statements due to the goto's. So the - breaks are unnecessary. - https://bugzilla.gnome.org/show_bug.cgi?id=736942 - -2014-09-25 16:13:19 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: Switch from our custom main loop to a GMainLoop - Simplifies code a lot and makes it more similar to the other backends. - -2014-09-25 16:12:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - gl/cocoa: Clear the current GL context when it should happen - -2014-09-24 12:42:23 +0200 Lihua Liu <lihual@axis.com> - - * ext/curl/gstcurlsmtpsink.c: - curlsmtpsink: Email with multipart content-type should end with a final boundary - Add final boundary for each of the sending out emails from smtpsink. - https://bugzilla.gnome.org/show_bug.cgi?id=736134 - -2014-09-25 10:14:41 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlhttpsink.c: - curl*sink: add more logging - -2014-09-25 08:05:50 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/curl/gstcurlbasesink.c: - curlbasesink: add a debug function - If gstreamer is build with logging enabled, add a debug function and output - verbose messages to the log instead of stderr. - -2014-09-24 22:24:49 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/curl/gstcurlhttpsink.c: - curlhttpsink: only add content-disposition header if a filename is set - The header is optional and therefore we better omit it if we don't have a filename. - -2014-09-24 22:06:21 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/curl/gstcurlbasesink.c: - curlbasesink: don't replace specific error messages with a generic one - Only set an error if we haven't set one already. - -2014-09-24 21:07:20 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/curl/gstcurltlssink.c: - curltlssink: swap check - Lets check for NULL first, as that is the default anyway. - -2014-07-29 16:12:26 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst/videoparsers/gsth264parse.c: - h264parse: Return flushing if we get chained while being set to READY - Or not negotiated in the case we would be actually not negotiated - Currently we are getting assertions from - gst_pb_utils_add_codec_description_to_tag_list because of NULL - caps. - https://bugzilla.gnome.org/show_bug.cgi?id=737186 - -2014-09-09 13:12:31 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: mark first buffer as discont after restarting a download task - Mark first buffer as discont after restarting a download task, so - downstream can reset its state to properly handle the new fragment. - Related issue: https://bugzilla.gnome.org/show_bug.cgi?id=736318 - https://bugzilla.gnome.org/show_bug.cgi?id=736319 - -2014-09-19 22:32:39 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: push a time segment when restarting streaming - This should inform demuxers/decoders downstream that the stream is - about to start from a new position and they should flush accordingly - https://bugzilla.gnome.org/show_bug.cgi?id=736319 - -2014-09-24 16:55:49 +0200 Wim Taymans <wtaymans@redhat.com> - - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/bad-video-orc-dist.c: - * gst-libs/gst/video/bad-video-orc-dist.h: - * gst-libs/gst/video/bad-video-orc.orc: - * gst-libs/gst/video/gstcms.c: - * gst-libs/gst/video/gstcms.h: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/videoconvert.c: - * gst-libs/gst/video/videoconvert.h: - video: use video lib conversion code instead of copy - -2014-09-18 17:26:37 +0530 Anuj Jaiswal <anuj.jaiswal@samsung.com> - - * ext/mplex/gstmplex.cc: - mplex: break statement unnecessary - One more code flow issue where it never arrives to the break statement due to - the goto. So the break is unnecessary. - Plus two coding style fixes. - https://bugzilla.gnome.org/show_bug.cgi?id=736895 - -2014-09-24 22:42:58 +1000 Jan Schmidt <thaytan@noraisin.net> - - * gst/debugutils/gstchopmydata.c: - chopmydata: Transfer timestamps to output buffers - Allows using chopmydata as a simple repacketizer - -2014-09-19 09:51:48 +0530 Anuj Jaiswal <anuj.jaiswal@samsung.com> - - * sys/androidmedia/gstamcaudiodec.c: - androidmedia: break statements unnecessary - Code flow never arrives to the break statements due to the goto's. So the - breaks are unecessary. Second part to commit a3958ae65b - https://bugzilla.gnome.org/show_bug.cgi?id=736940 - -2014-09-19 09:59:41 +0530 Anuj Jaiswal <anuj.jaiswal@samsung.com> - - * sys/androidmedia/gstamcvideodec.c: - androidmedia: break statement unnecessary - Code flow never arrives to the break statements due to the goto's. So the - breaks are unecessary. - https://bugzilla.gnome.org/show_bug.cgi?id=736942 - -2014-09-18 16:13:58 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowsrcwrapper: avoid error when set_caps called twice - If set_caps is called in a running state, return immediately if the caps - haven't changed. If the pins are already connected, disconnect them. - https://bugzilla.gnome.org/show_bug.cgi?id=736926 - -2014-09-24 14:29:37 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: skip input frames with an alpha of 0 - -2014-09-24 13:13:19 +1000 Matthew Waters <matthew@centricular.com> - - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstgltestsrc.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - gl: download whenever we have sysmem capsfeatures - Otherwise we could pass on a RGBA formatted buffer and downstream would - misinterpret that as some other video format. - Fixes pipelines of the form - gleffects ! tee ! xvimagesink - -2014-09-19 01:22:14 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * ext/gsettings/org.freedesktop.gstreamer.default-elements.gschema.xml.in: - gsettings: Fix typo in description - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=736933 - -2014-09-23 17:32:59 +0100 Luis de Bethencourt <luis.bg@samsung.com> - - * gst/mpegpsmux/psmuxstream.c: - mpegpsmux: refactor duplicate else branches - Unknown case should assert if reached instead of just assuming the max buffer - size. - https://bugzilla.gnome.org/show_bug.cgi?id=736460 - -2014-09-19 09:54:11 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: initialize sent_codec_tag before using it - https://bugzilla.gnome.org/show_bug.cgi?id=736951 - -2014-09-22 17:14:29 +0530 Sanjay NM <sanjay.nm@samsung.com> - - * gst/videofilters/gstzebrastripe.c: - videofilters: Add support for more YUV formats - https://bugzilla.gnome.org/show_bug.cgi?id=737111 - -2014-08-21 02:14:40 +0200 Lubosz Sarnecki <lubosz@gmail.com> - - * ext/gl/gstgltestsrc.c: - * ext/gl/gstgltestsrc.h: - gltestsrc: add Mandelbrot fractal pattern. - https://bugzilla.gnome.org/show_bug.cgi?id=735131 - -2014-08-21 02:13:58 +0200 Lubosz Sarnecki <lubosz@gmail.com> - - * ext/gl/gltestsrc.c: - * ext/gl/gltestsrc.h: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstgltestsrc.h: - gltestsrc: implement snow pattern with GLSL. - https://bugzilla.gnome.org/show_bug.cgi?id=735131 - -2014-09-23 12:02:18 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: fallback to upload if contexts cannot share GL resources - Fixes pipelines of the form - gleffects ! tee ! glimagesink - as tee does not pass on the allocation query. - -2014-09-23 12:01:04 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - glcontext: add gst_gl_context_can_share - Which determines whether two GstGLContext's can share sharable - OpenGL resources. - -2014-09-22 20:01:27 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/check/libs/gstglupload.c: - gl/tests: update for upload API changes - -2014-09-22 10:08:17 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - gl: Let gst_gl_context_get_thread() return a new reference to the GThread - Otherwise it might go away in the meantime and the caller has some random pointer. - -2014-09-22 11:10:42 +0530 Anuj Jaiswal <anuj.jaiswal@samsung.com> - - * gst-libs/gst/gl/gstglfilter.c: - gl: consecutive return, break statement - Signed-off-by: Anuj Jaiswal <anuj.jaiswal@samsung.com> - https://bugzilla.gnome.org/show_bug.cgi?id=736939 - -2014-09-22 12:21:22 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/debug.h: - gl/debug: desktop GL does not have the KHR suffixes - -2014-09-22 11:59:30 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/gl/gtk/fxtest/fxtest.c: - * tests/examples/gl/gtk/gtkvideooverlay/main.cpp: - examples/gl/gtk: use the sync bus callback to set the window handle - And output error messages. - -2014-09-19 18:59:01 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add missing FEC rates - Order of the enum values (new rates after _AUTO) - has been kept congruent with the one in the v4l - API for consistency. - -2014-09-21 13:32:29 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - gl: add since markers for new API - -2014-09-21 21:42:41 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: add debug line for freeing textures - -2014-09-21 21:36:49 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * ext/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - glupload: provide the output buffer that is rendered into - Allows callers to properly reference count the buffers used for - rendering. - Fixes a redraw race in glimagesink where the previous buffer - (the one used for redraw operations) is freed as soon as the next - buffer is uploaded. - 1. glimagesink uploads in _prepare() to texture n - 1.1 glupload holds buffer n - 2. glimagesink _render()s texture n - 3. glimagesink uploads texture n+1 - 3.1 glupload free previous buffer which deletes texture n - 3.2 glupload holds buffer n+1 - 4. glwindow resize/expose - 5. glimagesink redraws with texture n - The race is that the buffer n (the one used for redrawing) is freed as soon as - the buffer n+1 arrives. There could be any amount of time and number of - redraws between this event and when buffer n+1 is actually rendered and thus - replaces buffer n as the redraw source. - https://bugzilla.gnome.org/show_bug.cgi?id=736740 - -2014-09-21 21:30:58 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - glcontext: add API to retreive the thread that context is active in - -2014-09-19 15:32:33 +0530 Sanjay NM <sanjay.nm@samsung.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglmixer.c: - gl: Removed unreachable break, unused variable - https://bugzilla.gnome.org/show_bug.cgi?id=736957 - -2014-09-19 14:36:39 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Fix encoder to work on iOS - iOS has special stride requirements that we don't know yet, so copy - input buffers into buffers allocated by iOS for now. - Later we should check the stride and probably provide a buffer pool for these - buffers so upstream can directly write in there. - -2014-09-19 14:32:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/corevideobuffer.c: - applemedia: We need to map the coremedia buffers in non-readonly mode - Our buffers claim to be writable so other elements expect to be able - to write there without losing their changes. - -2014-09-18 18:16:59 +0200 Philippe Normand <philn@igalia.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: lock client mutex before entering the retry_failover block - This is consistent with the case where the block execution is - triggered by the goto invoked after the current_variant update. - https://bugzilla.gnome.org/show_bug.cgi?id=736919 - -2014-09-12 02:36:47 -0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: synchronize with the download loop thread to signal it to continue - If EOS or ERROR happens before the download loop thread has reached its - g_cond_wait() call, then the g_cond_signal doesn't have any effect and - the download loop thread stucks later. - https://bugzilla.gnome.org/show_bug.cgi?id=735663 - -2014-09-12 02:35:44 -0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: synchronize with the download loop thread to signal it to continue - If EOS or ERROR happens before the download loop thread has reached its - g_cond_wait() call, then the g_cond_signal doesn't have any effect and - the download loop thread stucks later. - https://bugzilla.gnome.org/show_bug.cgi?id=735663 - -2014-08-29 12:38:12 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: synchronize with the download loop thread to signal it to continue - If EOS or ERROR happens before the download loop thread has reached its - g_cond_wait() call, then the g_cond_signal doesn't have any effect and - the download loop thread stucks later. - https://bugzilla.gnome.org/show_bug.cgi?id=735663 - -2014-09-17 17:27:53 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: fix clearing of eos state in pads - The internal pad still keeps its EOS flag and event as it can be assigned - after the flush-start/stop pair is sent. The EOS is assigned from the streaming - thread so this is racy. - To be sure to clear it, it has to be done after setting the source to READY to - be sure that its streaming thread isn't running. - https://bugzilla.gnome.org/show_bug.cgi?id=736012 - -2014-09-17 17:27:25 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: fix clearing of eos state in pads - The internal pad still keeps its EOS flag and event as it can be assigned - after the flush-start/stop pair is sent. The EOS is assigned from the streaming - thread so this is racy. - To be sure to clear it, it has to be done after setting the source to READY to - be sure that its streaming thread isn't running. - https://bugzilla.gnome.org/show_bug.cgi?id=736012 - -2014-09-17 14:51:53 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: fix clearing of eos state in pads - The internal pad still keeps its EOS flag and event as it can be assigned - after the flush-start/stop pair is sent. The EOS is assigned from the streaming - thread so this is racy. - To be sure to clear it, it has to be done after setting the source to READY to - be sure that its streaming thread isn't running. - https://bugzilla.gnome.org/show_bug.cgi?id=736012 - -2014-09-18 17:49:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Let the encoder automatically choose a h264 level - We should negotiate these things via caps... - -2014-09-18 13:45:33 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Use 0 instead of G_MAXDOUBLE as the max keyframe interval - 0 means no limit, which was meant here with G_MAXDOUBLE probably. - -2014-09-18 13:42:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Expected duration is supposed to be the duration of the stream, not a frame - Just don't set it for now, it isn't really needed. - -2014-09-18 11:39:53 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * tests/check/libs/vc1parser.c: - vc1parser: add unit test for sequence-layer parsing - Check that a sequence-layer header is successfully parsed. - https://bugzilla.gnome.org/show_bug.cgi?id=736871 - -2014-09-18 11:49:13 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - vc1parser: take care of endianness when parsing sequence-layer - sequence-layer is serialized in little-endian byte order except for - STRUCT_C which is serialized in big-endian byte order. - But since STRUCT_A and STRUCT_B fields are defined as unsigned int msb - first, we have to pass them as big-endian to their parsing function. So - we basically use temporary buffers to convert them in big-endian. - See SMPTE 421M Annex J and L. - https://bugzilla.gnome.org/show_bug.cgi?id=736871 - -2014-09-18 13:11:05 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: Properly handle keyframes - Especially set the SYNC_POINT flag on keyframes. - -2014-09-18 14:24:13 +0530 Sanjay NM <sanjay.nm@samsung.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: removed an unwanted initialization and a variable - https://bugzilla.gnome.org/show_bug.cgi?id=736863 - -2014-09-17 12:24:39 +0200 Jerome Laheurte <jlaheurte@quividi.com> - - * sys/dshowsrcwrapper/BUILD.txt: - * sys/dshowsrcwrapper/CMakeLists.txt: - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowaudiosrc.h: - * sys/dshowsrcwrapper/gstdshowfakesink.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - dshowsrcwrapper: Port to 1.0 - https://bugzilla.gnome.org/show_bug.cgi?id=732283 - -2014-09-18 12:53:11 +0530 Sanjay NM <sanjay.nm@samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin2: removed redundant initialization - https://bugzilla.gnome.org/show_bug.cgi?id=736853 - -2014-09-17 15:50:23 +0530 Anuj Jaiswal <anuj.jaiswal@samsung.com> - - * ext/faad/gstfaad.c: - faad: logical disjunction consecutive return, break unnecessary - https://bugzilla.gnome.org/show_bug.cgi?id=736790 - -2014-09-17 11:49:22 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: enable header-format conversion - In fact we support header-format conversion which is done in - update_caps() method. - https://bugzilla.gnome.org/show_bug.cgi?id=736786 - -2014-09-18 10:30:04 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: Fix compilation - -2014-09-18 09:47:06 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: Handle 0/1 framerates correctly by not calculating their frame duration - -2014-09-17 17:37:12 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/atdec.c: - atdec: Fix some compiler warnings with newer clang - -2014-09-17 17:10:58 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Prepare encoder after setup - This will allow encoding to happen faster on the first frame. - -2014-09-17 17:08:57 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: Only drain the encoder in ::finish(), not on every frame - Otherwise quality and bitrate will be bad. - -2014-09-17 15:39:26 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Error out if encoding returned an error - Otherwise we will just continue consuming frames until all memory is filled - up and the app crashes. - -2014-09-17 14:56:05 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Check for errors from VTCompressionSessionCompleteFrames() - -2014-09-17 14:55:24 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Properly scale timestamps for the API and set invalid values - -2014-09-17 14:54:39 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: Properly scale timestamps for the API and set invalid values - -2014-09-17 13:19:04 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/plugin.m: - * sys/applemedia/vth264decbin.c: - * sys/applemedia/vth264decbin.h: - * sys/applemedia/vth264encbin.c: - * sys/applemedia/vth264encbin.h: - applemedia: Remove old code that is of no use anymore - -2014-09-16 17:38:53 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: forge sequence-layer from seq_hdr instead of seq_layer - If we don't have a seq_layer_buffer, we also don't have a valid - seq_layer because there are set together in - gst_vc1_parse_handle_seq_layer(). - So when output header format is sequence-layer and when we don't have a - seq_layer_buffer, we forge one from seq_hdr. - https://bugzilla.gnome.org/show_bug.cgi?id=736781 - -2014-09-17 10:39:26 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - applemedia: Unconditionally use VideoToolbox on iOS if available - Because we do weak linking now we can always compile it in and check at - runtime if it is actually available or not. - -2014-09-17 10:38:20 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/plugin.m: - applemedia: Do weak linking with the VideoToolbox framework - It does not exist on older OSX and iOS but we still want to - be able to use it when it's available. - -2014-09-16 12:06:35 +0200 Ognyan Tonchev <ognyan@axis.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: do not leak buffer pool in error case - https://bugzilla.gnome.org/show_bug.cgi?id=736735 - -2014-09-16 15:59:58 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: fix sequence-layer/frame-layer endianness - Sequence-layer and frame-layer are serialized in little-endian byte - order except for STRUCT_C and framedata fields as described in SMPTE 421M Annex - L. - https://bugzilla.gnome.org/show_bug.cgi?id=736750 - -2014-09-16 16:51:28 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: Port to GstVideoEncoder base class - -2014-09-16 16:13:16 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtenc.c: - vtenc: Use correct instance struct size - -2014-09-16 15:48:11 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: Fix compiler warnings - values of type 'OSStatus' should not be used as format arguments; add an explicit cast to 'int' instead -Wformat - -2014-09-16 15:02:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/coremediactx.c: - * sys/applemedia/coremediactx.h: - * sys/applemedia/dynapi-internal.h: - * sys/applemedia/dynapi.c: - * sys/applemedia/dynapi.h: - * sys/applemedia/mtapi.c: - * sys/applemedia/mtapi.h: - * sys/applemedia/vtapi.c: - * sys/applemedia/vtapi.h: - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: Port to the real VideoToolbox API instead of using our dlopen() wrapper - It's a public framework since a long time. - -2014-09-16 11:42:34 +0200 Ognyan Tonchev <ognyan@axis.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: do not leak pool in error cases - https://bugzilla.gnome.org/show_bug.cgi?id=736732 - -2014-09-16 11:43:02 +0200 Ognyan Tonchev <ognyan@axis.com> - - * sys/vdpau/gstvdpdecoder.c: - vdpdecoder: do not leak pool - https://bugzilla.gnome.org/show_bug.cgi?id=736733 - -2014-09-16 11:41:43 +0200 Ognyan Tonchev <ognyan@axis.com> - - * ext/gl/gstgltestsrc.c: - gltestsrc: do not leak pool in error cases - https://bugzilla.gnome.org/show_bug.cgi?id=736730 - -2014-09-16 11:42:13 +0200 Ognyan Tonchev <ognyan@axis.com> - - * ext/openni2/gstopenni2src.cpp: - openni2src: do not leak pool - https://bugzilla.gnome.org/show_bug.cgi?id=736731 - -2014-09-16 11:41:16 +0200 Ognyan Tonchev <ognyan@axis.com> - - * ext/gl/gstglmixer.c: - glmixer: do not leak pool in error cases - https://bugzilla.gnome.org/show_bug.cgi?id=736729 - -2014-09-16 13:21:22 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst/vmnc/vmncdec.c: - vmncdec: modify wrong packetized mode logic - packetized mode is being set when framerate is being set - which is not correct. Changing the same by checking the - input segement format. If input segment is in TIME it is - Packetized, and if it is in BYTES it is not. - https://bugzilla.gnome.org/show_bug.cgi?id=736252 - -2014-09-16 11:24:37 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/webp/gstwebpdec.c: - webpdec: Remove unused variable - -2014-09-16 13:19:25 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * ext/webp/gstwebpdec.c: - webpdec: modify wrong packetized mode logic - packetized mode is being set when framerate is being set - which is not correct. Changing the same by checking the - input segement format. If input segment is in TIME it is - Packetized, and if it is in BYTES it is not. - https://bugzilla.gnome.org/show_bug.cgi?id=736252 - -2014-09-16 01:15:31 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/templatematch.c: - templatematch: Compare the correct loop variables - -2014-09-15 15:42:41 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: No need to set kVTVideoDecoderSpecification_EnableHardwareAcceleratedVideoDecoder on iOS - -2014-09-15 15:36:44 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - configure: And make the preprocessor check work properly - -2014-09-15 15:25:46 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - configure: Do the AM_CONDITIONAL() after finally setting the variable - -2014-09-15 15:12:31 +0300 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * sys/applemedia/vtdec.c: - applemedia: Don't include VideoToolbox on iOS < 8.0 - It's private API and does not work without a jailbroken device. - -2014-09-15 13:33:45 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Also refetch the playlist after the first fragment failure - Previously we only refetched the playlist if downloading a fragment - has failed once. We should also do that if it failed a second or third time, - chances are that the playlist was updated now and contains new URIs. - -2014-09-15 11:59:32 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dash: Actually retry 3 times as advertised instead of 2 - -2014-09-15 11:59:19 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hls: Actually retry 3 times as advertised instead of 2 - -2014-09-13 20:49:16 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/vtdec.c: - vtdec: Fix compilation on iOS 8.0 - -2014-09-11 14:36:31 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: fix malformed sequence layer header and STRUCT_C - This commit fix several issues with sequence layer header forging on - update_caps(): - - 0x00000004 unsigned integer is before STRUCT_C. - - Set reserved bits of STRUCT_C to their values for simple/main - profiles in sequence layer header format and ASF header format. - - Sequence layer shall be represented as a sequence of 32 bits unsigned - integers and shall be serialized in little-endian byte order except - for STRUCT_C which shall be serialized in big-endian byte-order. - See SMPTE 421M Annex L for more details about sequence layer format. - https://bugzilla.gnome.org/show_bug.cgi?id=736474 - -2014-09-12 14:49:44 +0200 Edward Hervey <bilboed@bilboed.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Use proper variable for delivery system - We want to check the delivery system is ISDBT (and not the modulation - which we check later in that case). - CID #1238439 - -2014-09-12 09:30:04 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: fix trivial coding style issue - https://bugzilla.gnome.org/show_bug.cgi?id=736531 - -2014-09-11 18:33:20 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/mpegtsdemux/pesparse.h: - tsdemux: fix overflow of packet_length field of PESHeader - packet_length is defined as a guint16 in the PESHeader structure. This - definition match the specification. But since we add 6 bytes to the - packet_length value (length of start_code + stream_id + packet_length), - we can overflow the guint16 when the value in the PES header is greater - than 65529. - So use a guint32 instead of a guint16 to avoid overflow. - https://bugzilla.gnome.org/show_bug.cgi?id=736490 - -2014-09-10 15:39:44 -0300 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: improve position detection when a download restart - Query other src pads before falling back to the position of the last - known pushed segment (which can be far ahead in time). - https://bugzilla.gnome.org/show_bug.cgi?id=736421 - -2014-09-10 15:43:05 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: improve position detection when a download restart - Query other src pads before falling back to the position of the last - known pushed segment (which can be far ahead in time). - https://bugzilla.gnome.org/show_bug.cgi?id=736421 - -2014-09-11 16:21:30 +0400 Belozorov Semen <skiminokD@gmail.com> - - * gst/mpegpsmux/mpegpsmux_h264.c: - mpegpsmux: fix memory leak when converting H.264 avc to byte-stream format - Fix memory leak for input stream with caps "video/x-h264,stream-format=avc". - https://bugzilla.gnome.org/show_bug.cgi?id=736426 - -2014-09-10 19:27:27 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/aiff/aiffmux.c: - aiffmux: allocate byte writer on stack - -2014-09-10 19:19:32 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/asfmux/gstasfobjects.c: - * gst/asfmux/gstasfparse.c: - asfmux: allocate byte readers on the stack - -2014-09-10 10:58:03 +0200 Jesper Larsen <knorr.jesper@gmail.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - tsdemux: clear mutex resources in dispose - https://bugzilla.gnome.org/show_bug.cgi?id=736390 - -2014-09-10 17:24:39 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/mpg123/gstmpg123audiodec.c: - * ext/opus/gstopusdec.c: - * gst/adpcmenc/adpcmenc.c: - * sys/opensles/openslessrc.c: - * sys/uvch264/gstuvch264_src.c: - Fix up one-element lists in template caps - -2014-09-10 16:38:52 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: fix bogus BGRA caps - Remove 0.10-style endianness/*_mask/bpp/depth fields. - -2014-09-10 19:16:53 +1000 Matthew Waters <ystreet00@gmail.com> - - * configure.ac: - build: don't AC_SUBST intermediate values - -2014-09-09 12:01:47 +0200 Vasilis Liaskovitis <vliaskov@gmail.com> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - GstGLWindow: Introduce navigation thread - This thread dispatches navigation events. It is needed to avoid deadlocks - between window backend threads that emit navigation events (e.g. X11/GMainLoop - thread) and consumers of navigation events such as glimagesink, see - https://bugzilla.gnome.org/show_bug.cgi?id=733661 - GstGlWindow_x11 thread is changed to invoke the navigation thread for navigation - dispatching, instead of emiting the event itself. Othe backends beside X11 do - not dispatch navigation events yet, but should use this thread when dispatching - these events in the future. - The navigation thread is currently part of GstGLWindow and not implemented in - separate subclasses / backends. This will be needed in the future. - gst_gl_window_x11_get_surface_dimensions is also changed to use a cached value - of the window's width, height. These values are now retrieved in the X11 - thread, function gst_gl_window_x11_handle_event. This change is needed because - otherwise the XGetWindowAttributes gets called from the navigation thread, - leading to xlib aborting due to multithreaded access (if XInitThreads is not - called before, as is the case for gst-launch) - -2014-09-05 13:58:19 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: retry opening the frontend on EINTR - -2014-09-05 13:32:09 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: assorted doc & spelling fixes - -2014-09-07 01:30:16 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/dataurisrc/gstdataurisrc.c: - Revert "dataurisrc: Remove unnecessary else if condition" - This reverts commit 3024ae9c38490817a76c83feab3c8472989cafad. - The *buf can be NULL or not depending if the caller of gst_pad_get_range - function provided or not a buffer. - -2014-09-05 16:11:08 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/hlsdemux_m3u8.c: - tests: hlsdemux: fix compilation - In file included from /home/thiagoss/gst/head/gstreamer/gst/gst.h:54:0, - from /home/thiagoss/gst/head/gstreamer/libs/gst/check/gstcheck.h:34, - from elements/hlsdemux_m3u8.c:27: - ../../ext/hls/gstfragmented.h:8:28: error: redundant redeclaration of ‘fragmented_debug’ -Werror=redundant-decls - GST_DEBUG_CATEGORY_EXTERN (fragmented_debug); - Move the definition of the category to after the declaration. - -2014-09-05 12:56:13 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/Makefile.am: - hlsdemux: And fix Makefile yet again - -2014-09-05 12:25:01 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/hlsdemux_m3u8.c: - hlsdemux: Include the m3u8.c file directly in the test because of an automake bug - $(top_srcdir) doesn't seem to work with _SOURCES because that would be too - obvious. - http://lists.gnu.org/archive/html/automake/2013-09/msg00005.html - -2014-09-05 09:53:15 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst/aiff/aiffparse.c: - aiffparse: Fix handling of 64 bit floating point data - In gst_aiff_parse_create_caps if and else-if conditions - are duplicated. - https://bugzilla.gnome.org/show_bug.cgi?id=736090 - -2014-09-05 08:51:30 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstfacedetect.h: - facedetect: Add new property min-stddev - face detection will be performed only if image standard deviation is - greater that min-stddev. Default min-stddev is 0 for backward - compatibility. This property will avoid to perform face detection on - images with little changes improving cpu usage and reducing false - positives - https://bugzilla.gnome.org/show_bug.cgi?id=730510 - -2014-07-07 10:52:57 +0200 Lubosz Sarnecki <lubosz@gmail.com> - - * ext/gl/gstgltransformation.c: - * ext/gl/gstgltransformation.h: - gltransformation: fix issues and expose mvp matrix - * aspect should not be 0 on init - * rename fovy to fov - * add mvp to properties as boxed graphene type - * fix transformation order. scale first - * clear color with 1.0 alpha - https://bugzilla.gnome.org/show_bug.cgi?id=734223 - -2014-09-04 21:41:54 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/Makefile.am: - hlsdemux: Also get the m3u8.c source file from the $(top_srcdir) for the test - Should fix make distcheck for real now. - -2014-09-04 19:01:45 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/Makefile.am: - hlsdemux: Use $(top_srcdir) instead of $(top_builddir) for the include path - -2014-09-04 18:21:38 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: Don't send flush events to deactivated pads - https://bugzilla.gnome.org/show_bug.cgi?id=736012 - -2014-09-04 18:21:25 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Don't send flush events to deactivated pads - https://bugzilla.gnome.org/show_bug.cgi?id=736012 - -2014-09-04 18:20:58 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Don't send flush events to deactivated pads - https://bugzilla.gnome.org/show_bug.cgi?id=736012 - -2014-09-04 17:52:35 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/Makefile.am: - hlsdemux: Compile the m3u8.c directly instead of re-using the .o file - -2014-09-04 17:50:16 +0300 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/hlsdemux_m3u8.c: - hlsdemux: Add unit test for parsing of M3U8 playlists - Ported from https://github.com/ylatuya/gst-plugins-bad - This still has some unit tests for alternative renditions and - seeking, which are commented out for the time being until we - support them properly. - -2014-09-04 17:49:23 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Properly assign offsets to the files if we accumulate them instead of reading from the playlist - -2014-09-04 13:38:21 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst/dataurisrc/gstdataurisrc.c: - dataurisrc: Remove unnecessary else if condition - In gst_data_uri_src_create(), buf cannot be NULL, hence - else if (*buf != NULL) will be invalid so removing the - else if condition and adding a check to unreference buf - in else condition, just in case - https://bugzilla.gnome.org/show_bug.cgi?id=735861 - -2014-09-02 18:06:53 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: simplify ISDB-T launch line example - -2014-09-02 12:13:01 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: delay locking till actually needed - Get rid of unneeded locking at prop setting by doing - it only when tuning the frontend at _tune_fe() - -2014-09-02 12:11:44 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst/dataurisrc/gstdataurisrc.c: - dataurisrc: Make get_uri() threadsafe - https://bugzilla.gnome.org/show_bug.cgi?id=735861 - -2014-09-01 17:41:50 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcaudiodec.h: - amcaudiodec: Remove hack for Google MP3 decoder - The first buffer does not contain more garbage than any other MP3 decoder - outputs and we don't really know how much we have to drop or not. - After this change the output has the same duration as with mad. - -2014-09-01 08:24:57 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst/videofilters/gstzebrastripe.c: - zebrastripe: Refactor to remove duplicate code - gst_zebra_stripe_transform_frame_ip_planarY - gst_zebra_stripe_transform_frame_ip_YUY2 - gst_zebra_stripe_transform_frame_ip_AYUV - all above 3 functions do the same functionality except for offset and pixel stride. - Hence moving the functionality to a single funtion. - https://bugzilla.gnome.org/show_bug.cgi?id=735032 - -2014-08-29 18:55:32 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix description for modulation prop - -2014-08-29 17:16:09 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add basic checks on ISDB-T parameters - Also add a routine for checking wrong delsys/modulation - combinations right before tuning (only implemented for - ISDB-T for now). - -2014-08-29 18:09:07 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: add support for additional modulation types - -2014-08-29 13:26:12 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: drop FIXME on _ISDBT_LAYER_ENABLED prop - Valid values range from 1 to 7 as stated. - DTV_ISDBT_LAYER_ENABLED bitmask is built from - OR-ing 0x1 0x2 0x4. If all bits are set - (0x00000111 = 7) it means all layers should be - demodulated. - -2014-08-29 19:26:40 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/assrender/gstassrender.c: - assrender: remove code that can't be reached - If this code could ever be reached, it would leak - memory (CID 1231979), but gst_caps_get_features() - never returns NULL, so that can't happen. - -2014-08-29 19:24:52 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: remove code that can't be reached - If this code could ever be reached, it would leak - memory (CID 1231977), but gst_caps_get_features() - never returns NULL, so that can't happen. - -2014-08-28 20:12:07 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix up handling of input caps corner cases - Do more elaborate validation of the input caps: what fields - are required and/or not allowed. Don't assume AVC3 format - input without codec_data field is byte-stream format. Fix - up some now-unreachable code (CID 1232800). - -2014-08-28 16:42:30 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Add missing break to switch - CID 1232801 - -2014-08-28 11:37:56 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/rawparse/gstrawparse.c: - rawparse: Reset negotiation state when going back to READY - After going back to READY we can accept new format settings again. - -2014-08-22 15:18:59 -0600 Thomas Bluemel <tbluemel@control4.com> - - * configure.ac: - * ext/hls/Makefile.am: - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Support OpenSSL for AES decryption of HLS fragments - https://bugzilla.gnome.org//show_bug.cgi?id=735248 - -2014-08-26 16:21:42 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * tests/examples/gl/qt/qglwtextureshare/glcontextid.h: - * tests/examples/gl/qt/qglwtextureshare/gstthread.h: - * tests/examples/gl/qt/qglwtextureshare/main.cpp: - * tests/examples/gl/qt/qglwtextureshare/pipeline.cpp: - * tests/examples/gl/qt/qglwtextureshare/pipeline.h: - * tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp: - * tests/examples/gl/qt/qglwtextureshare/qglwtextureshare.pro: - gl: qglwtextureshare demo fixes and cleanup - 1. glcontextid function is replaced by gstreamer gst_gl_context_new_wrapped . - 2. call gst_init before gst_gl_display_new , seems gst_gl_display_new depends - on gst_allocator_register , which only worked after gst_init called - 3. flush gstreamer OpenGL context before using shared texture, fix - flicker problem. - https://bugzilla.gnome.org/show_bug.cgi?id=735566 - -2014-08-27 13:40:42 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - gl: Add GSTGLAPI macro to the debug callback function - Fixes the Windows build. - https://bugzilla.gnome.org/show_bug.cgi?id=735565 - -2014-08-28 09:53:17 +0300 Blake Tregre <blake.tregre@gmail.com> - - * gst/librfb/rfbdecoder.c: - rfbsrc: Clamp out of bounds resolutions to prevent segfaults - https://bugzilla.gnome.org/show_bug.cgi?id=726801 - -2014-08-27 14:47:25 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * configure.ac: - gl: do not check for GL/GLU/EGL/GLES2 libs if disabled in configuration - https://bugzilla.gnome.org/show_bug.cgi?id=735522 - -2014-08-26 12:38:52 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - egl: Wrap KHR_create_context flags in an ifdef - EGL_CONTEXT_FLAGS_KHR and EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR - don't exist in the Android NDK. Wrap their usage in an #ifdef - EGL_KHR_create_context to fix the build there. - -2014-08-21 12:32:10 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: don't consider unknown stream-format as avc - It should try to use bytestream in these cases that the format - is set to _FORMAT_NONE as it seems that is what the 'else' clause - for bytestream can handle (by defaulting to _FORMAT_BYTESTREAM). - -2014-08-25 13:33:15 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * tests/check/elements/h264parse.c: - h264parse: tests: fix caps for avc format - If it has a codec_data field, it should also use the stream-format=avc as - codec_data doesn't make sense otherwise and the default should - be bytestream - -2014-08-25 15:21:39 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - docs: add mpegpsmux and mpegtsmux - -2014-08-25 15:20:59 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-audiomixer.xml: - docs: add audiomixer to docs - -2014-08-25 15:20:16 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/inspect/plugin-aiff.xml: - docs: add aiff elements to docs - -2014-08-25 14:56:15 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - docs: plugins: misc updates - -2014-08-25 14:43:49 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.types: - docs: move GstPhotography interface docs into the library docs - Now that we have docs for the libs. - -2014-08-25 12:21:36 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/sndfile/gstsf.c: - sndfile: don't decode formats that are better handled by other elements - In particular: flac, ogg, pcm, au, aiff, wav. - https://bugzilla.gnome.org/show_bug.cgi?id=722316 - -2014-08-22 16:49:10 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - egl: fallback to a non-debug context if a debug one fails - The text for EGL_KHR_create_context added the possiblity for ES - contexts to ask for a debug context however that has not been - fully realized by all implementations. Fallback to a non-debug - context when the implementation errors. - -2014-08-05 14:06:07 -0400 Youness Alaoui <kakaroto@kakaroto.homelinux.net> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Add support for RTP/RTCP mixing if data arrives on RTCP pad - https://bugzilla.gnome.org/show_bug.cgi?id=734321 - -2014-08-21 16:24:06 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: fix abort in error code path with newer glib - Don't forget to unlock mpd client again when erroring out. - Fixes abort when g_mutex_clear() is called on a locked mutex. - -2014-07-02 12:49:44 +0200 Lubosz Sarnecki <lubosz@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - gstopengl: add introspection support - https://bugzilla.gnome.org/show_bug.cgi?id=734482 - -2014-08-05 12:07:08 +0200 Lubosz Sarnecki <lubosz@gmail.com> - - * tests/examples/gl/gtk/switchvideooverlay/main.cpp: - examples: fix gtk+ 3.14 deprecation error - https://developer.gnome.org/gtk3/3.13/GtkWidget.html#gtk-widget-set-double-buffered - https://bugzilla.gnome.org/show_bug.cgi?id=734482 - -2014-07-07 10:52:06 +0200 Lubosz Sarnecki <lubosz@gmail.com> - - * ext/gl/gstglimagesink.c: - glimagesink: expose context - * expose context in draw / reshape callbacks - * add context property - https://bugzilla.gnome.org/show_bug.cgi?id=734482 - -2014-07-07 10:51:28 +0200 Lubosz Sarnecki <lubosz@gmail.com> - - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - glshader: expose opengl handle in getter - https://bugzilla.gnome.org/show_bug.cgi?id=734482 - -2014-08-20 09:37:01 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * gst-libs/gst/gl/gstglutils.c: - gl: check null before unref GstGLDisplay - -2014-08-21 10:03:07 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/debug.h: - gl: add prototype definition for KHR_debug - -2014-08-20 23:24:12 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - glcontext: implement the debug callback - For both GL_KHR_debug and ARB_debug_output. This allows us to - receive errors and other hints from the GL instead of querying after - every GL operation. - -2014-08-20 23:23:06 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/Makefile.am: - * gst-libs/gst/gl/glprototypes/all_functions.h: - * gst-libs/gst/gl/glprototypes/gstgl_compat.h: - * gst-libs/gst/gl/gstglapi.h: - gl: add prototypes for KHR_debug/ARB_debug_output - -2014-08-19 17:17:33 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: unref pad reference when removing internal source in error - Avoids leaking the pad in error situations - -2014-08-19 16:01:58 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: read language from ContentComponent node as a fallback - If the language is not specified in the AdaptationSet, use the ContentComponent - node to get it. We only get it if there is only a single ContentComponent as - it doesn't seem clear on what to do if there are multiple entries - https://bugzilla.gnome.org/show_bug.cgi?id=732237 - -2014-06-25 15:55:32 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/dash/Makefile.am: - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: push language code tag - Language code tag is retrieved from the AdaptationSet language - property. - https://bugzilla.gnome.org/show_bug.cgi?id=732237 - -2014-08-19 20:14:22 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglutils.c: - gl: don't take an extra ref on the display on set_context - gst_context_get_gl_display() returns a ref. Don't take another in - gst_object_replace(). - -2014-08-19 17:01:36 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglmixer.c: - glmixer: unref the GstGLUpload in the pad if freed while running - Dynamic pipelines that get and release the sink pads will finalize - the pad without going through gst_gl_mixer_stop() which is where the - upload object is usually freed. Don't leak objects in such case. - -2014-08-14 23:51:21 -0400 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * ext/gl/gstglmixer.c: - glvideomixer: avoid gl resource race condition between different thread - https://bugzilla.gnome.org/show_bug.cgi?id=734830 - -2014-08-19 14:44:29 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: don't clobber unnecessary GstVideoInfo fields - otherwise we might clobber other important fields such as the frame rate. - -2014-08-19 14:43:42 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: get the attribute from the correct shader - -2014-08-19 14:23:21 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - glimagesink: unref the window on navigation event - plugs a memory leak - -2014-08-19 00:01:28 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: remove pads when resetting the element - Otherwise the pads will be there if it is restarted and the stream - can be a completely different one. - https://bugzilla.gnome.org/show_bug.cgi?id=734394 - -2014-08-17 01:42:05 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparser: h264: Use proper bit_reader api while parsing buffering_period SEI - https://bugzilla.gnome.org/show_bug.cgi?id=734970 - -2014-08-14 10:19:13 +0530 Vineeth T M <vineeth.tm@samsung.com> - - * gst/videofilters/gstscenechange.c: - scenechange: fix crash on startup - gst_video_frame_map() was using the oldinfo GstVideoInfo - before it's been populated, resulting in a crash right - at the start. - https://bugzilla.gnome.org/show_bug.cgi?id=734763 - -2014-08-14 15:26:53 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - androidmedia: Make sure to unblock any thread waiting on the drain condition variable when errors happen - -2014-08-14 15:24:21 +0300 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcaudiodec.h: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideodec.h: - * sys/androidmedia/gstamcvideoenc.c: - * sys/androidmedia/gstamcvideoenc.h: - androidmedia: Fix draining logic to let the base class handle EOS events - https://bugzilla.gnome.org//show_bug.cgi?id=734775 - -2014-08-11 21:25:41 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/parsechannels.c: - dvbbasebin: fix parsing of freqs in some ZAP files - Change avoids attempting to convert to kHz if unneeded. - There are quite some ZAP format variants out there. Among - their subtle little differences, some store transponder - frequencies in Mhz and others in kHz. The latter been the - most common variant. - -2014-08-07 19:37:01 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: get rid of remaining trailing whitespace - -2014-08-07 19:19:36 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: wrap around known-interruptible ioctls - Also get rid of the asumption that some requests like - FE_SET_TONE or FE_SET_VOLTAGE only error out with -1 - -2014-08-07 14:00:40 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: drop gst_dvbsrc_retry_ioctl for retry macro - LOOP_WHILE_EINTR macro makes it easier to handle - assorted ioctl argp types. Functionality is otherwise - equivalent. - -2014-08-12 12:35:00 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/dvbbasebin.h: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - dvbsrc: dvbbasebin: add 'tune' signal - It works the same as the 'tune' property that is used only to signal - the element that it should tune, but it is more natural to be used - as a signal rather than a property. - It is also proxied at the dvbbasebin element - -2014-08-07 15:25:32 +0200 Thibault Saunier <thibault.saunier@collabora.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Do not switch playlist on trick modes - Instead always use the low bandwith playlist making things go smoother - as the current heuristic is rather set for normal playback, and - currently it does not behave properly. - https://bugzilla.gnome.org/show_bug.cgi?id=734445 - -2014-07-21 14:42:47 +0200 Thibault Saunier <thibault.saunier@collabora.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: No need to have a I-Frame list to do trick modes - It just works cleanly without any index and there is no real reason for - that limitation. Also, there are very few stream with that feature. - https://bugzilla.gnome.org/show_bug.cgi?id=734445 - -2014-08-05 17:13:13 +0200 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Do not tweak segments on reverse playback - We can't compare the first buffer start and the segment start in that - case... playback is going backward! - https://bugzilla.gnome.org/show_bug.cgi?id=734445 - -2014-08-13 16:57:15 +0200 Valentin PONS <valx76@gmail.com> - - * ext/opencv/gstfacedetect.c: - facedetect: Use NULL to disable eyes/nose/mouth - Without printing a warning about it - https://bugzilla.gnome.org/show_bug.cgi?id=734623 - -2014-08-10 22:58:22 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - glbufferpool: fix allocator leak in some cases - Spotted by Sebastian Rasmussen. - https://bugzilla.gnome.org/show_bug.cgi?id=734523 - -2014-08-11 12:32:04 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/assrender/gstassrender.c: - assrender: save a few ref/unref pairs - The event/query functions already have a reference to the element, avoid - ref/unref in the functions handling caps queries and events. - -2014-08-11 12:31:17 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/assrender/gstassrender.c: - assrender: remove obsolete fixme - -2014-08-11 12:22:44 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/assrender/gstassrender.c: - assrender: improve negotiation - Check if downstream supports overlay meta, if possible use it and - if not fallback to no-overlay caps - https://bugzilla.gnome.org/show_bug.cgi?id=733916 - -2014-08-11 12:21:28 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/assrender/gstassrender.c: - assrender: always intersect with the filter caps - Avoids returning values that peers can't use - https://bugzilla.gnome.org/show_bug.cgi?id=733916 - -2014-08-11 11:35:01 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: improve negotiation - Check if downstream supports overlay meta, if possible use it and - if not fallback to no-overlay caps - https://bugzilla.gnome.org/show_bug.cgi?id=733916 - -2014-08-11 11:33:28 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: always intersect with the filter in getcaps - Avoids returning unsupported caps to peers - https://bugzilla.gnome.org/show_bug.cgi?id=733916 - -2014-08-11 23:38:40 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: fix up doc comment for set_src_caps - It does not occur 'later' anymore - https://bugzilla.gnome.org/show_bug.cgi?id=732662 - -2014-08-07 19:54:36 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: push the caps event as soon as we receive it - Along with the required mandatory dependent events. - Some elements need to perform an allocation query inside - ::negotiated_caps(). Without the caps event being sent prior, - downstream elements will be unable to answer and will return - an error. - https://bugzilla.gnome.org/show_bug.cgi?id=732662 - -2014-08-11 16:01:32 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * ext/webp/Makefile.am: - * ext/webp/gstwebp.c: - * ext/webp/gstwebpenc.c: - * ext/webp/gstwebpenc.h: - webenc: Add WebP image encoder - https://bugzilla.gnome.org/show_bug.cgi?id=733087 - -2014-08-09 01:29:30 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * ext/sbc/gstsbcenc.c: - sbcenc: Unref output caps in error cases - gst_caps_intersect() returns a reference to a caps object which in - the normal case is consumed, but in error cases must be unreferenced. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=734521 - -2014-08-08 14:08:19 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * ext/opus/gstopusenc.c: - opusenc: Unref pad template caps after usage - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=734517 - -2014-08-09 11:41:17 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * gst/inter/gstintertest.c: - inter: Unref bus after usage - gst_pipeline_get_bus() returns a reference to a bus that needs to - be unreferenced after usage. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=734525 - -2014-08-09 11:45:41 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * tests/examples/gl/clutter/clutteractor.c: - * tests/examples/gl/clutter/clutteractortee.c: - * tests/examples/gl/gtk/fxtest/fxtest.c: - examples/gl: unref bus and element after usage - gst_pipeline_get_bus() and gst_bin_get_by_interface() both - return references that need to be unreferenced after usage. - https://bugzilla.gnome.org/show_bug.cgi?id=734527 - -2014-08-10 19:12:01 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - docs: update for git master - -2014-08-10 19:05:43 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/inspect/plugin-rtpvp8.xml: - docs: remove rtpvp8 plugin docs, the elements are now in -good - -2014-08-10 18:07:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/gl/gstglcolorscale.c: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglmosaic.c: - * ext/gl/gstgloverlay.c: - * ext/gl/gstglvideomixer.c: - opengl: update element docs for 1.x - -2014-08-10 17:48:50 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-eglglessink.xml: - docs: remove eglglessink from docs as it no longer exists - -2014-08-09 11:36:38 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Unref elements after usage - gst_bin_get_by_name() and gst_bin_get_by_interface() both return - references to elements that need to be unreferenced after usage. - https://bugzilla.gnome.org/show_bug.cgi?id=734524 - -2014-08-09 01:27:53 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * ext/openal/gstopenalsink.c: - * ext/openal/gstopenalsrc.c: - openal: Unref pad template caps after usage - https://bugzilla.gnome.org/show_bug.cgi?id=734520 - -2014-08-10 12:29:04 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/ladspa/gstladspafilter.c: - ladspa: fix up broken patch merge - Sorry, should've been commit --amend - -2014-08-09 13:24:00 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * sys/pvr2d/gstpvrvideosink.c: - pvrvideosink: Avoid leaking bufferpool configuration - gst_buffer_pool_get_config() returns a copy to the bufferpool's - configuration, which must be passed to gst_structure_free() after - use if not given away to gst_buffer_pool_set_config(). - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=734537 - -2014-08-09 13:22:42 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * sys/directsound/gstdirectsoundsrc.c: - directsoundsrc: Avoid leaking copy of caps object - gst_pad_get_pad_template_caps() returns a reference which is unreferenced, - so creating a copy using gst_caps_copy() results in a reference leak. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=734536 - -2014-08-09 13:20:41 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * sys/applemedia/vtenc.c: - vtenc: Avoid leaking caps object and its copy - gst_pad_get_pad_template_caps() returns a reference which is unreferenced, - so creating a copy using gst_caps_copy() results in a reference leak. Also - the caps are pushed as an event downstream, but this doesn't consume the - caps so it must still be unreferenced. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=734534 - -2014-08-09 13:17:17 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * sys/androidmedia/gstamcvideoenc.c: - amcvideoenc: Avoid leaking copy of caps object - gst_pad_get_pad_template_caps() returns a reference which is unreferenced, - so creating a copy using gst_caps_copy() results in a reference leak. - Also remove the incorrect comment to avoid confusion in the future. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=734533 - -2014-08-09 13:12:14 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * gst/interlace/gstinterlace.c: - interlace: fix caps refcounting - tcaps was unrefed when it shouldn't have been unrefed - in some cases. - https://bugzilla.gnome.org/show_bug.cgi?id=734531 - -2014-08-09 13:09:52 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Avoid leaking copy of caps object - gst_pad_get_pad_template_caps() returns a reference which is unreferenced, - so creating a copy using gst_caps_copy() results in a reference leak. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=734528 - -2014-08-09 11:17:44 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Unref allowed caps after usage - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=734522 - -2014-08-09 01:25:21 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * ext/ladspa/gstladspafilter.c: - ladspa: Unref pad template caps after usage - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=734519 - -2014-08-09 01:25:21 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * ext/ladspa/gstladspafilter.c: - ladspa: Unref pad template caps after usage - https://bugzilla.gnome.org/show_bug.cgi?id=734519 - -2014-08-09 01:23:50 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * ext/directfb/dfbvideosink.c: - dfbvideosink: Unref pad template caps after usage - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=734518 - -2014-08-10 11:35:41 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/Makefile.am: - * tests/check/pipelines/.gitignore: - * tests/check/pipelines/colorspace.c: - tests: remove defunct test code for old colorspace element - https://bugzilla.gnome.org/show_bug.cgi?id=734538 - -2014-08-09 13:27:00 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * tools/element-templates/srcpad: - element-maker: Avoid leaking copy of caps object - gst_pad_get_pad_template_caps() returns a reference which is unreferenced, - so creating a copy using gst_caps_copy() results in a reference leak. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=734539 - -2014-08-09 14:27:34 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * ext/gsm/gstgsmenc.c: - gstgsmenc: Unref caps object after usage - gst_audio_encoder_set_output_format() does not consume caps, so - unreference that object instead. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=734544 - -2014-08-09 14:24:59 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * ext/opus/gstopusheader.c: - opus: Improve annotation of internal function - https://bugzilla.gnome.org/show_bug.cgi?id=734543 - -2014-08-06 18:11:20 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: support downloading segments in reverse order - When a seek with a negative rate is requested, find the target - segment where gstsegment.stop belongs in and then download from - this segment backwards until the first segment. - This allows proper reverse playback. - -2014-08-07 19:18:49 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - glvideomixer: add a background property - That's compatible with the compositor/videomixer property - https://bugzilla.gnome.org/show_bug.cgi?id=731954 - -2014-08-06 13:27:04 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/faad/gstfaad.c: - ext:faad: Set rank to SECONDARY as the libav decoder is concidered better - https://bugzilla.gnome.org/show_bug.cgi?id=676131 - -2014-08-06 16:48:03 +0300 Vasilis Liaskovitis <vliaskov@gmail.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - GstGLWindow, GstGLImagesink, x11: Scale navigation events on resized windows - If window is resized, GstStructure pointer values have to be rescaled to - original geometry. A get_surface_dimensions GLWindow class method is added for - this purpose and used in the navigation send_event function. - https://bugzilla.gnome.org/show_bug.cgi?id=703486 - -2014-08-06 08:15:38 -0400 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: don't determine if frame needs upload by pointer compare - https://bugzilla.gnome.org/show_bug.cgi?id=734269 - -2014-08-05 11:45:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtspacketizer: Store PCR time/byte offsets in 64 bit integers - 32 bit integers are going to overflow, especially the PCR offset to - the first PCR will overflow after about 159 seconds. This makes playback - of streams stop at 159 seconds as suddenly the timestamps are starting - again from 0. Now we have a few more years time until it happens again - and 64 bits are too small. - -2014-08-05 10:42:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - Revert "mpegtspacketizer: Convert PCR times to GStreamer times before comparing them against 500 * GST_MSECOND" - This reverts commit 9f186c6ab32c1e949916d385186b2d400190add6. - That commit was actually completely wrong, nevermind. - -2014-08-05 10:36:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Convert PCR times to GStreamer times before comparing them against 500 * GST_MSECOND - Otherwise it will believe to detect PCR gaps already when there's a very small - gap of a few milliseconds, breaking playback of some files. - -2014-07-31 17:40:30 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com> - - * sys/dvb/gstdvbsrc.h: - dvbsrc: remove srcpad leftover - The element is inheriting its srcpad from basesrc - -2014-08-01 18:02:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinksink.cpp: - decklinksink: Initialize pixel format to bmdFormat8BitYUV - https://bugzilla.gnome.org/show_bug.cgi?id=725871 - -2014-08-01 16:40:49 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers_h264: initialize some fields of pic_timing structure - Otherwise pic timing structure can have invalid cpb_removal_delay, - dpb_output_delay or pic_struct_present_flag which are blindly retrieved - in h264parse. - https://bugzilla.gnome.org/show_bug.cgi?id=734124 - -2014-08-01 16:58:23 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinksink.cpp: - decklinksink: Catch errors during data flow and error out properly - Otherwise we will just deadlock the thread if e.g. scheduling a video - frame fails for whatever reason. - -2014-07-31 20:52:39 -0300 Thiago Santos <thiagoss@osg.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: return the error to the source immediately to stop faster - When flushing, this will prevent dashdemux from trying to download more - fragments or more chunks of the same fragment before stopping. - Also improves the error handling to not transform everything non-ok into - an error. - https://bugzilla.gnome.org/show_bug.cgi?id=734014 - -2014-07-29 02:11:54 -0300 Thiago Santos <ts.santos@osg.sisa.samsung.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: avoid timestamp overflows - Cause timing to break in the pipeline that can lead to a stall - https://bugzilla.gnome.org/show_bug.cgi?id=733837 - -2014-08-01 13:14:03 +0200 Edward Hervey <edward@collabora.com> - - * po/POTFILES.in: - po: Remove files no longer present - They were removed when sndfile was ported to 1.x - -2014-08-01 12:38:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklink.cpp: - decklink: 59.94fps is 60000/1001, not 30000/1001 - And also change 30/1 to 60/1 for one 60fps mode. - -2014-08-01 17:51:08 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gl/docs: remove superflous 'the' - -2014-08-01 16:41:13 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstgldisplay.c: - gl: document GST_GL_* environment variables - https://bugzilla.gnome.org/show_bug.cgi?id=733245 - -2014-08-01 10:01:18 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/check/libs/gstglmemory.c: - * tests/check/libs/gstglupload.c: - gl/tests: update for API changes - -2014-07-31 18:55:33 +0200 Edward Hervey <edward@collabora.com> - - * Makefile.am: - * common: - Makefile: Add usage of build-checks step - Allows building checks without running them - -2014-07-31 18:46:33 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - glcontext: add a destroy function - that just calls the subclass - -2014-07-31 18:36:58 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl/x11: silence runtime warning - g_main_loop_quit: assertion 'loop != NULL' failed - -2014-07-31 15:18:04 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: use the plane offsets to compute the size of the data pointer - Certain elements expect that there be a certain number of lines - that they can write into. e.g. for odd heights, I420, YV12, NV12, - NV21 (and others) Y lines are expected to have exactly twice the - number of U/UV lines. - https://bugzilla.gnome.org/show_bug.cgi?id=733717 - -2014-07-31 14:07:29 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstgluploadmeta.c: - glmemory: use GstVideoInfo everywhere - Simplifies a lot of the calling code - https://bugzilla.gnome.org/show_bug.cgi?id=733717 - -2014-07-30 16:32:01 -0300 Robert Jobbagy <jobbagy.robert@gmail.com> - - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfaceblur.h: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstfacedetect.h: - faceblur: facedetect: add properties to faceblur - Makes faceblur have the same properties as facedetect. Also improves - the standard defaults and makes them the same in the 2 elements - -2014-07-30 16:30:39 -0300 Robert Jobbagy <jobbagy.robert@gmail.com> - - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfaceblur.h: - faceblur: post message when profile loading fails - -2014-07-30 16:07:17 -0300 Robert Jobbagy <jobbagy.robert@gmail.com> - - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfacedetect.c: - facedetect: faceblur: update launch line examples - Reflect 1.0 and more useful examples - -2014-07-29 13:25:22 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - glimagesink: keep the uploaded buffer around on successful redisplay - We might need it later to perform a redisplay. GstGLUpload will take - of releasing the previous buffer when it receives a new buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=733726 - -2014-07-29 11:47:55 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglmemory.c: - glmemory: reenable the texture_rg support for !eagl - The GST_GL_HAVE_PLATFORM_EAGL is always defined we need to compare - against the value instead. - -2014-07-28 19:11:41 -0300 Thiago Santos <ts.santos@osg.sisa.samsung.com> - - * tests/check/elements/.gitignore: - * tests/check/libs/.gitignore: - tests: gitignore: update with new tests - -2014-07-28 16:55:15 -0300 Thiago Santos <ts.santos@osg.sisa.samsung.com> - - * tests/files/blue-square.png: - tests: files: adds missing file from previous commit - This is required for the templatematch test to work - -2014-07-28 15:45:09 -0300 Thiago Santos <ts.santos@osg.sisa.samsung.com> - - * tests/check/Makefile.am: - * tests/check/elements/templatematch.c: - * tests/files/Makefile.am: - tests: templatematch: add test to check that we use the correct rgb format - templatematch should use the same RGB format that opencv uses (BGR), make sure - we keep it that way with this test. - https://bugzilla.gnome.org/show_bug.cgi?id=678485 - -2012-06-15 13:19:06 +0100 David Rothlisberger <david.rothlisberger@youview.com> - - * ext/opencv/gsttemplatematch.c: - opencv templatematch: Set caps to BGR order - templatematch operates on BGR data. In fact, OpenCV's IplImage always - stores color image data in BGR order -- this isn't documented at all in - the OpenCV source code, but there are hints around the web (see for - example - http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00041000000000000000 - and http://www.comp.leeds.ac.uk/vision/opencv/iplimage.html ). - gst_templatematch_load_template loads the template (the image to find) - from disk using OpenCV's cvLoadImage, so it is stored in an IplImage in - BGR order. But in gst_templatematch_chain, no OpenCV conversion - functions are used: the imageData pointer of the IplImage for the video - frame (the image to search in) is just set to point to the raw buffer - data. Without this fix, that raw data is in RGB order, so the call to - cvMatchTemplate ends up comparing the template's Blue channel against - the frame's Red channel, producing very poor results. - -2014-07-28 13:10:35 -0300 Thiago Santos <ts.santos@osg.sisa.samsung.com> - - * ext/opencv/gsttemplatematch.c: - templatematch: mark pads as proxy caps - Allows negotiation to happen properly - -2012-06-25 20:37:01 +0100 William Manley <william.manley@youview.com> - - * ext/opencv/gsttemplatematch.c: - templatematch: Produce a warning message if we can't load a template image - -2012-06-20 15:22:52 +0100 William Manley <william.manley@youview.com> - - * ext/opencv/gsttemplatematch.c: - templatematch: Match rectangle grows redder with increased match certainty - This is useful for debugging your matches as it indicates how certain the - match was in addition to its position. - -2012-06-20 15:05:40 +0100 William Manley <william.manley@youview.com> - - templatematch: Allow changing template property on the fly - Previously changing the template property resulted in an exception - thrown from cvMatchTemplate, because "dist_image" (the intermediate - match-certainty-distribution) was the wrong size (because the - template image size had changed). - Locking has also been added to allow changing the properties (e.g. the - pattern to match) while the pipeline is playing. - * gst_element_post_message is moved outside of the lock, because it will - call into arbitrary user code (otherwise, if that user code calls into - gst_templatematch_set_property on this same thread it would deadlock). - * gst_template_match_load_template: If we fail to load the new template - we still unload the previous template, so this element becomes a no-op - in the pipeline. The alternative would be to keep the previous template; - I believe unloading the previous template is a better choice, because it - is consistent with the state this element would be in if it fails to - load the very first template at start-up. - Thanks to Will Manley for the bulk of this work; any errors are probably - mine. - -2012-06-01 16:07:34 +0100 David Rothlisberger <david.rothlisberger@youview.com> - - * ext/opencv/gsttemplatematch.c: - templatematch: Pass video through when nothing to match against - The early return was bypassing the call to gst_pad_push. With no - filter->template (and thus no filter->cvTemplateImage) the rest of this - function is essentially a no-op (except for the call to gst_pad_push). - This (plus the previous commit) allows templatematch to be - enabled/disabled without removing it entirely from the pipeline, by - setting/unsetting the template property. - -2012-06-20 15:05:06 +0100 William Manley <william.manley@youview.com> - - * ext/opencv/gsttemplatematch.c: - templatematch: Remove no-op call to gst_templatematch_load_template - We have just set filter->template to NULL, so - gst_templatematch_load_template did nothing. - -2014-07-08 19:18:48 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: clarify units for freq and symbol-rate - -2014-07-07 18:52:20 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - dvbsrc: add preliminary support for ISDB-T/Tb - ISDB-T and ISDB-Tb (the Brazilian variant) are the - terrestial DTV standards used by Japan, Philippines, - Maldives, Thailand, most South American countries - and Botswana. Changeset adds the set of previously - missing (and required) ISDB-T parameters, adapter - and frontend setup logic and proxies the new - properties on dvbbasebin. - Tested to work with the live aerial broadcast by - Tv Paraíba HD in Campina Grande (Brazil). - https://bugzilla.gnome.org/show_bug.cgi?id=732875 - -2014-07-05 03:08:00 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - dvbsrc: make slof/lof1/lof2 settable properties - Allows proper tuning around high/low band boundaries when using - non "standard" LNBs. - Not all LNBs (Low noise block down converters) are made equal. - This is particularly true for universal LNBFs, where, even though - there are seemingly standard values for the local oscillator - frequencies, these can vary from manufacturer to manufacturer - and LNB model. Change also proxies the new LNB properties in - dvbbasebin. - https://bugzilla.gnome.org/show_bug.cgi?id=732818 - -2014-07-27 13:26:00 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - glimagesink: silence gsignal warning - instance '0xblah' has no handler with id '13' - -2014-07-26 13:27:51 -0300 Thiago Santos <ts.santos@osg.sisa.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: do not give references to probes - They are kept until the probes are removed but they will never be - removed as the refcount of the element won't get to 0 because the - probes own references (cyclic refs). As the probes should only be - running as long as the element is running there is no need to - secure a ref for them. - Removes 3 leaked refs of wrappercamerabinsrc - -2014-07-26 12:46:01 -0300 Thiago Santos <ts.santos@osg.sisa.samsung.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: use gst_object_ref to make it easier to track refs - Helps debugging - -2014-07-26 12:38:42 -0300 Thiago Santos <ts.santos@osg.sisa.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: unref request pads - Do not forget to unref output-selector requested pads - -2014-04-21 23:05:48 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/jpegformat/gstjpegparse.c: - * gst/jpegformat/gstjpegparse.h: - jpegparse: port to baseparse - https://bugzilla.gnome.org/show_bug.cgi?id=728356 - -2014-07-24 12:25:36 +0300 Vasilis Liaskovitis <vliaskov@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - glwindow/11: Emit signals for mouse and key navigation events - https://bugzilla.gnome.org/show_bug.cgi?id=703486 - -2014-07-24 12:23:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - glwindow: Constify string parameters to the send_*_event() functions - -2014-07-24 13:05:00 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - glimagesink: remove extra argument from debug call - -2014-07-07 00:20:01 +0300 Vasilis Liaskovitis <vliaskov@gmail.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: Add navigation interface and callbacks for GstGLWindow mouse/key signals - https://bugzilla.gnome.org/show_bug.cgi?id=703486 - -2014-07-06 23:39:47 +0300 Vasilis Liaskovitis <vliaskov@gmail.com> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - GstGLWindow : Add mouse-event and key-event signals for navigation - https://bugzilla.gnome.org/show_bug.cgi?id=703486 - -2014-07-23 10:25:31 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * ext/gl/gstgleffects.c: - * ext/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglframebuffer.c: - gl: fix multi gl object leaks - 1. fix FBO leaks in decide_allocation - 2. fix texture leaks in decide_allocation and reset - 3. fix texture leaks in FBO incomplete error path - -2014-07-23 13:55:06 -0300 Thiago Santos <ts.santos@osg.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: only flush buffers if renegotiation is needed - This avoid extra overhead when taking sequential pictures that woudln't - need renegotiation - -2014-07-23 13:37:05 -0300 Thiago Santos <ts.santos@osg.samsung.com> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin: handle EOS on the pipeline - Make camerabin handle EOS to the pipeline to allow standard pipeline - close where an EOS is sent to the whole pipeline before setting it to NULL. - -2014-07-21 18:22:18 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Do not scan for keyframe when in push mode. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=733490 - -2014-07-21 18:21:41 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Do not scan for a keyframe in non-accurate mode. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=733490 - -2014-07-01 10:24:44 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/gdp/gstgdppay.c: - gdppay: remove obsolete code - Buffers have no caps in 1.0 - -2014-07-01 10:07:40 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/gdp/gstgdppay.c: - * gst/gdp/gstgdppay.h: - * tests/check/elements/gdppay.c: - gdppay: put all sticky events in streamheader - Use the sticky events to compose the streamheader as they are the - ones that are persisted to config new pads linked. Instead of storing - them ourselves rely on the pad storage that already orders it for us - https://bugzilla.gnome.org/show_bug.cgi?id=732596 - -2014-07-21 21:03:26 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/gstfacedetect.c: - facedetect: improve enum GstFaceDetectUpdates descriptions - https://bugzilla.gnome.org/show_bug.cgi?id=730509 - -2014-05-21 12:59:57 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/gstfacedetect.c: - facedetect: make updates on_change works as expected - https://bugzilla.gnome.org/show_bug.cgi?id=730509 - -2014-07-22 12:42:36 +0530 Sanjay NM <sanjay.nm@samsung.com> - - * gst/pnm/gstpnmenc.c: - * gst/pnm/gstpnmenc.h: - pnmenc: Port PNM Encoder to use GstVideoEncoder Class - https://bugzilla.gnome.org/show_bug.cgi?id=731943 - -2014-06-18 11:44:54 +0530 Sanjay NM <sanjay.nm@samsung.com> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmutils.c: - pnmdec: Patch to handle max value - Convert the image values from 0-maxvalue to 0-255 when - 'decoding' the pnm image - https://bugzilla.gnome.org/show_bug.cgi?id=731773 - -2014-07-15 16:42:57 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/kate/gstkatedec.c: - * ext/kate/gstkateutil.c: - katedec: handle segment event earlier - Delaying the segment event to when caps are decided can cause issues as - the first thing katedec does on its chain function it doing a segment clip. - It will lead to an assertion if the segment format is undefined - https://bugzilla.gnome.org/show_bug.cgi?id=733226 - -2014-07-15 16:41:51 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/kate/gstkatedec.c: - katedec: handle streamheaders in caps - Properly handle the caps event by configuring the kate decoding lib using the - available streamheaders. This makes it possible to decode kate subtitles when - the stream is seeked before katedec gets the initial buffers that are usually - the streamheaders. - https://bugzilla.gnome.org/show_bug.cgi?id=733226 - -2014-07-21 17:34:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - openjpeg: Don't remember -lopenjp2 as libs when falling back to openjpeg1 - -2014-07-21 11:07:28 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * tests/examples/gl/sdl/Makefile.am: - gl: Reorder CFLAGS to include in-source dirs first in examples - https://bugzilla.gnome.org/show_bug.cgi?id=733426 - -2014-05-06 09:28:14 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - openjpeg: Win32-compatible OpenJPEG-2.0 detection - OpenJPEG 2.0 API uses stdcall on W32 by default. This prevents normal - autoconf library macros from finding its functions. - A more compatible check is to acutally link a program that includes a - real header. - https://bugzilla.gnome.org/show_bug.cgi?id=733487 - -2014-07-21 10:14:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Fix unitialized variable compiler warning - gstopenni2src.cpp:721:14: error: variable 'oni_ts' is used uninitialized whenever 'if' condition is false -Werror,-Wsometimes-uninitialized - } else if (src->color->isValid () && src->sourcetype == SOURCETYPE_COLOR) { - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - gstopenni2src.cpp:752:26: note: uninitialized use occurs here - GST_BUFFER_PTS (buf) = oni_ts - src->oni_start_ts; - ^~~~~~ - gstopenni2src.cpp:721:10: note: remove the 'if' if its condition is always true - } else if (src->color->isValid () && src->sourcetype == SOURCETYPE_COLOR) { - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - gstopenni2src.cpp:721:14: error: variable 'oni_ts' is used uninitialized whenever '&&' condition is false -Werror,-Wsometimes-uninitialized - } else if (src->color->isValid () && src->sourcetype == SOURCETYPE_COLOR) { - ^~~~~~~~~~~~~~~~~~~~~~ - gstopenni2src.cpp:752:26: note: uninitialized use occurs here - GST_BUFFER_PTS (buf) = oni_ts - src->oni_start_ts; - ^~~~~~ - gstopenni2src.cpp:721:14: note: remove the '&&' if its condition is always true - } else if (src->color->isValid () && src->sourcetype == SOURCETYPE_COLOR) { - ^~~~~~~~~~~~~~~~~~~~~~~~~ - gstopenni2src.cpp:642:18: note: initialize the variable 'oni_ts' to silence this warning - uint64_t oni_ts; - ^ - = 0 - -2014-07-17 16:25:54 +0200 Fabrice Bellet <fabrice@bellet.info> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - parser: mpeg4: fix vlc table used for sprite trajectory - The vlc table members cbits, cword and values were assigned in the wrong - order, causing the mpeg4 parser to fail when handling sprite - trajectories. - https://bugzilla.gnome.org/show_bug.cgi?id=733322 - -2014-07-18 15:09:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Make statistics message more generic for other adaptive streaming demuxers to reuse - https://bugzilla.gnome.org/show_bug.cgi?id=725828 - -2014-02-25 11:58:57 +0100 Alexander Zallesov <zallesov@gmail.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Provide statistics about time to download playlists and fragments - https://bugzilla.gnome.org/show_bug.cgi?id=725828 - -2014-07-19 18:04:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -=== release 1.4.0 === - -2014-07-19 17:27:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.4.0 - -2014-07-19 16:45:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2014-07-19 12:47:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - po: Update translations - -2014-07-16 18:27:15 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: set src to ready when there are no pending buffers - Setting to ready will block waiting for buffers to be reclaimed, so flush - before setting to null to make sure no buffers are pending - https://bugzilla.gnome.org/show_bug.cgi?id=733072 - -2014-07-17 10:05:47 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/examples/gl/gtk/fxtest/pixbufdrop.c: - examples: fix compilation of gl fxtest example on win32 with Gtk+ 3.0 - https://bugzilla.gnome.org/show_bug.cgi?id=733063 - -2014-07-17 00:11:48 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/opensles/openslesringbuffer.c: - openslesringbuffer: Provide the size of our array to GetDestinationOutputDeviceIDs - Otherwise it does not and just fails. It needs to know the size of the - array to not write too much to it. - -2014-07-17 00:11:21 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/opensles/openslessink.c: - openslessink: Silence some error debug output to log output - These are not really errors, just unsupported features we don't - necessarily need. - -2014-07-16 16:57:35 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Reset flow_return *after* stopping the srcpad task. - Otherwise it might be set in an already running aggregate function. - -2014-07-10 13:18:21 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Flush sinkpads when stopping - All values are meaningless in that case, so we should make sure that - we clean everything - -2014-07-10 13:15:55 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Do not forget to reset the flow return when stoping - Setting it to FLUSHING when the element is not started, and to OK - when it starts. - -2014-07-08 16:48:08 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Handle event seqnum - -2014-07-13 16:07:02 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * gst/mxf/mxfmux.c: - mxfmux: Avoid taking unnecessary ref - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=733123 - -2014-07-16 16:31:27 +0300 Mart Raudsepp <leio@gentoo.org> - - * configure.ac: - gl: Include GL_CFLAGS while checking for GL typedefs - Otherwise those checks may fail at configure time if they contain extra - include paths, while at build time they are included, potentially causing - incompatible typedefs between system GL headers and gstreamer compatibility - prototypes. - https://bugzilla.gnome.org/show_bug.cgi?id=733248 - -2014-07-16 16:29:10 +0300 Mart Raudsepp <leio@gentoo.org> - - * configure.ac: - gl: Always include EGL_CFLAGS in GL_CFLAGS when EGL_LIBS is added to GL_LIBS - They should be handled in tandem, in case any EGL provider could require some - CFLAGS and set them (possibly once moved to prefer pkg-config files), - such as for a custom header location. - -2014-03-17 16:09:46 +0100 Piotr Drąg <piotrdrag@gmail.com> - - * po/POTFILES.in: - po: update POTFILES - https://bugzilla.gnome.org/show_bug.cgi?id=726555 - -2014-07-15 13:29:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Open Direct3D devices in a threadsafe way - Otherwise we'll get crashes when using the device from multiple - threads, e.g. when using multiple sinks at once. - https://bugzilla.gnome.org/show_bug.cgi?id=707523 - -2014-07-11 21:15:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/curl/gstcurlsftpsink.c: - * ext/curl/gstcurlsshsink.c: - curlsshsink: Include gst.h and other stuff before anything else - -2014-07-11 10:40:42 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Fix caps filter caps proxying - The notify signal is triggered when caps is changed. But instead of - proxying the fixed caps, we query for the caps. Hence, when we go to - READY state, we endup setting template caps on the proxied caps - filter instead of NULL, which leads to negoitation failure. Correctly - proxy NULL caps if this is the new caps. Fixes not negotiated error - when running in cheese. Also fix a leak of caps string in one of the - trace. - https://bugzilla.gnome.org/show_bug.cgi?id=732741 - -2014-07-11 13:58:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/Makefile.am: - gl: Always build gstglmixer, not only when full OpenGL support is enabled - -2014-07-11 13:25:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/curl/gstcurlsftpsink.c: - * ext/curl/gstcurlsshsink.c: - curl: Use winsock2 instead and the GLib macro for checking if we're on Windows - -2014-07-11 13:25:18 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/MotionCells.cpp: - motioncells: Use no network API if not required - -2014-07-11 13:21:21 +0200 Alexey Pavlov <alexpux@gmail.com> - - * ext/curl/gstcurlsftpsink.c: - * ext/curl/gstcurlsshsink.c: - * ext/opencv/MotionCells.cpp: - ext: Include winsock.h on Windows when required - https://bugzilla.gnome.org/show_bug.cgi?id=733052 - -2014-07-11 12:13:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.3.91 - -2014-07-11 12:04:07 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/Makefile.am: - * gst-libs/gst/gl/Makefile.am: - gl: Link to all required libraries but not more - -2014-07-11 12:01:12 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/Makefile.am: - video: Properly include headers in Makefile.am - and don't set noinst_HEADERS twice. - -2014-07-11 11:05:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2014-07-11 09:43:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/plugin.m: - atdec: Change rank to MARGINAL until it can properly handle multichannel audio - https://bugzilla.gnome.org/show_bug.cgi?id=727757 - -2014-07-11 09:41:05 +0200 Sebastian Dröge <sebastian@centricular.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * ext/gl/Makefile.am: - * ext/gl/gstglmixer.c: - * ext/gl/gstglmixer.h: - * ext/gl/gstglmixerpad.h: - * ext/gl/gstglmosaic.h: - * ext/gl/gstglvideomixer.h: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - gl: Move GstGLMixer to the plugin for now - It depends on GstAggregator and we don't want to install headers - for that yet. - https://bugzilla.gnome.org/show_bug.cgi?id=732207 - -2014-07-11 09:33:57 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/Makefile.am: - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/wayland/Makefile.am: - * pkgconfig/Makefile.am: - libs: Don't install headers and pc files for libgstwayland/badvideo/badbase - These will disappear after 1.4.0 and it would be rather annoying if - people started depending on them. - https://bugzilla.gnome.org/show_bug.cgi?id=732207 - -2014-07-10 15:52:46 +0100 Philip Withnall <philip.withnall@collabora.co.uk> - - * ext/opus/gstopusheader.c: - opus: Fix a double-unref in the Opus header code - The headers were never getting reffed when being added to the headers - list, which is later unreffed-and-freed by the caller (e.g. - gst_opus_parse_parse_frame()). - https://bugzilla.gnome.org/show_bug.cgi?id=733013 - -2014-07-11 08:54:30 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/vi.po: - po: Update translations - -2014-07-10 11:29:41 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/examples/mpegts/ts-parser.c: - examples: Add CAT section and CA descriptor support - https://bugzilla.gnome.org/show_bug.cgi?id=732986 - -2014-07-10 11:24:12 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - mpegts: Add parsing for CA descriptor (0x05) - https://bugzilla.gnome.org/show_bug.cgi?id=732986 - -2014-07-07 11:52:18 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin2: Flush downstream after setting src to READY - v4l2src requires all buffers to come back in order to cleanly stop - streaming. Flushing the pipline should force all buffers to come - back. - https://bugzilla.gnome.org/show_bug.cgi?id=732741 - -2014-07-06 11:28:34 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * tests/icles/dccp/call/DCCPClient.c: - * tests/icles/dccp/call/DCCPServer.c: - tests/icles/dccp: Release reference to parent - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=732977 - -2014-07-09 15:03:42 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - glimagesink: Keep aspect ratio by default - The expected default behaviour for video sink is to maintain the - aspect ratio. Fix the default value to reflect this. The property - default was already TRUE, but the value was not initially TRUE. - -2014-07-06 01:55:50 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegts: No need to check for NULL before calling g_free() - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=732789 - -2014-07-06 01:55:16 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: Don't confuse slice allocator with regular one - Previously selector_bytes and private_data_bytes were sometimes allocated and - free using the normal allocator and sometimes using the slice allocator. - Additionally prefer g_strdup() to g_memdup() for strings. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=732789 - -2014-07-09 07:50:13 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: Fix dvb linkage leaks - CID #1224130 - -2014-07-04 14:04:47 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * tests/examples/mpegts/ts-parser.c: - mpegts: use getter for egde linkage descriptor type - https://bugzilla.gnome.org/show_bug.cgi?id=730914 - -2014-07-04 14:02:22 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - mpegts: docs: add missed *_free methods - https://bugzilla.gnome.org/show_bug.cgi?id=730914 - -2014-06-24 19:18:56 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: fix annotation - https://bugzilla.gnome.org/show_bug.cgi?id=730914 - -2014-07-09 07:38:38 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/gstmpegtssection.h: - mpegts: Add padding to public structures - Allows use to add API in the future without breaking ABI. We broke the API/ABI - once between 1.2 and 1.4, let's try to avoid this in the future even if this - is an unstable library. - https://bugzilla.gnome.org/show_bug.cgi?id=730914 - -2014-07-08 15:43:32 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - mpegts: atsc: fix leak of short name - -2014-07-08 14:56:13 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: fix leak of language code - -2014-07-06 23:30:53 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: Fix some more the locking logic in update_src_caps - We need the GST_OBJECT_LOCK only to iterate the sinkpads, nothing else. - https://bugzilla.gnome.org/show_bug.cgi?id=732750 - -2014-07-06 22:16:48 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: fix broken locking in update_src_caps function - We would unlock an already-unlocked mutex that we never re-locked. - https://bugzilla.gnome.org/show_bug.cgi?id=732750 - -2014-07-06 16:17:06 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: fix locking - We would unlock a mutex we never locked on SEGMENT - events. - -2014-07-04 21:00:38 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/opencv/gstfacedetect.c: - facedetect: Make cascades dir a little more portable - -2014-07-04 20:55:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/opencv/gsthanddetect.c: - * ext/opencv/gsthanddetect.h: - handdetect: Use already mapped image - No need to map again the image, it's already handled by the base class. - -2014-07-04 20:39:49 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/opencv/gsthanddetect.c: - handdetect: Move size warning in set_caps so it's called once - -2014-07-04 20:33:41 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfaceblur.h: - faceblur: Port to OpencvVideoFilter base class - This fixes issue whit black frames when special memory, like GlMemory is - in used. - https://bugzilla.gnome.org/show_bug.cgi?id=732756 - -2014-07-04 20:31:50 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/opencv/gstopencvvideofilter.c: - cvvideofilter: Don't try to make buffer writable - First this is handle by base transform, hence this is a no-op, and if it wasn't it - would lead to a buffer copy being leaked, and then an unreffed buffer being - pushed downstream. - https://bugzilla.gnome.org/show_bug.cgi?id=732756 - -2014-07-04 20:30:20 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/opencv/gstopencvvideofilter.c: - cvvideofilter: Check buffer_map return value - Check the resturn value and cleanly fail if we could not mapped the buffers. - https://bugzilla.gnome.org/show_bug.cgi?id=732756 - -2014-07-04 03:19:42 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * ext/mimic/gstmimdec.c: - mimdec: Print invalid fourcc in error message in hex - Previously this was printed as characters which caused later processing - of the error message to sometimes warn about non-UTF-8 characters. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=732715 - -2014-07-04 03:20:22 +0200 Sebastian Rasmussen <sebras@hotmail.com> - - * gst/aiff/aiffparse.c: - aiffparse: Print invalid fourcc in error message in hex - Previously this was printed as characters which caused later processing - of the error message to sometimes warn about non-UTF-8 characters. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=732715 - -2014-07-04 17:51:58 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * configure.ac: - configure: fix uninitialized variables with --disable-external - https://bugzilla.gnome.org/show_bug.cgi?id=732744 - -2014-07-01 12:34:44 +0530 Arun Raghavan <arun@accosted.net> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Add proper clean up of OpenNI2 objects - https://bugzilla.gnome.org/show_bug.cgi?id=732535 - -2014-07-01 12:18:45 +0530 Arun Raghavan <arun@accosted.net> - - * ext/openni2/gstopenni2src.cpp: - * ext/openni2/gstopenni2src.h: - openni2src: Don't embed C++ objects in our GObject - Since C++ objects shoudl be properly constructed, we keep only pointers - to them and manually construct them on the heap. - https://bugzilla.gnome.org/show_bug.cgi?id=732535 - -2014-07-01 12:18:19 +0530 Arun Raghavan <arun@accosted.net> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Close device when stopping the stream - https://bugzilla.gnome.org/show_bug.cgi?id=732535 - -2014-07-01 11:58:36 +0530 Arun Raghavan <arun@accosted.net> - - * ext/openni2/gstopenni2src.cpp: - * ext/openni2/gstopenni2src.h: - openni2src: Fix timestamping - OpenNI2 makes no guarantees of timestamp starting from zero, just that - it will be a millisecond timestamp. Make timestamps start from zero - manually so things work correctly. - https://bugzilla.gnome.org/show_bug.cgi?id=732535 - -2014-07-01 11:56:59 +0530 Arun Raghavan <arun@accosted.net> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Make the location property not be mandatory - Our calls to device open already handle the unset location case (by - opening any available device). - https://bugzilla.gnome.org/show_bug.cgi?id=732535 - -2014-07-01 11:56:15 +0530 Arun Raghavan <arun@accosted.net> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Open device on NULL->READY - https://bugzilla.gnome.org/show_bug.cgi?id=732535 - -2014-07-01 11:53:46 +0530 Arun Raghavan <arun@accosted.net> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Fix deadlock when _get_caps() is called before READY - The object lock was not being dropped in the empty case. Restructured - the code a bit to make this sort of error less likely. - https://bugzilla.gnome.org/show_bug.cgi?id=732535 - -2014-07-01 11:51:21 +0530 Arun Raghavan <arun@accosted.net> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Mark element as a live source - https://bugzilla.gnome.org/show_bug.cgi?id=732535 - -2014-07-03 19:10:26 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Always lock the D3D surfaces in write mode - Locking them in readonly mode can give different stride to mapping - in write mode, which then causes rendering to be broken. - Happened on all (many?) NVIDIA GPUs. - Thanks to voskater15@gmail.com for hinting at the problem. - https://bugzilla.gnome.org/show_bug.cgi?id=712809 - -2014-07-03 19:05:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dhelpers: Swap UV planes properly for YV12 as compared to I420 - If we only do it in one place colors will look funny. - -2014-07-03 17:53:33 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - amc: Properly integrate COLOR_QCOM_FormatYVU420SemiPlanar32m again - https://bugzilla.gnome.org/show_bug.cgi?id=732683 - -2014-07-03 15:07:23 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - amcaudiodec: audio/mpeg is always MPEG 1 layer 3 - Configuring e.g. layer 2 on such a decoder usually fails unless - it additionally also accepts audio/mpeg-L2. - -2014-07-03 14:15:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Don't dereference NULL if we have no PCR yet - Can happen sometimes if the duration is requested before we - received enough data with a PCR. - -2014-07-03 21:39:19 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - tsdemux: Add locking around mpegtspacketiser groups. - Otherwise occasionally DURATION queries can crash, if they happen at - the wrong moment. - -2014-07-03 09:00:32 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - glcocoa: initalize NSApp asap when using gst-launch - See https://bugzilla.gnome.org/show_bug.cgi?id=732661 - -2014-07-02 12:54:45 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * configure.ac: - * sys/applemedia/Makefile.am: - * sys/applemedia/plugin.m: - applemedia: enable vtdec and vtenc only on >= 10.8 where VideoToolbox is public - Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=723670 - -2014-07-02 04:54:29 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * sys/applemedia/vtdec.c: - vtdec: avoid segfault when output isn't configured - This can help when the callback is called during/after videodecoder - base class shut down - https://bugzilla.gnome.org/show_bug.cgi?id=728435 - -2014-07-02 00:27:12 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * sys/applemedia/vtdec.c: - vtdec: ignore the dropped flag if buffer was received - Apparently there is some issue with VT that makes it mark the dropped - flag even though the buffer was decoded. - https://bugzilla.gnome.org/show_bug.cgi?id=728435 - -2014-07-02 10:31:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Don't leak all surfaces - This was broken when disabling the buffer pool exporting. - Also disable buffer pool a bit more efficient... - -2014-07-02 10:01:34 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: PostMessage() takes integers as last parameters, not pointers - -2014-07-02 09:59:02 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Remove unused variable - -2014-07-02 17:38:13 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/gl/qt/qglwtextureshare/.gitignore: - * tests/examples/gl/qt/qglwtextureshare/moc_gstthread.cpp: - * tests/examples/gl/qt/qglwtextureshare/moc_pipeline.cpp: - * tests/examples/gl/qt/qglwtextureshare/moc_qglrenderer.cpp: - * tests/examples/gl/qt/qglwtextureshare/qglwtextureshare: - gl/examples: gitignore generated files - -2014-07-01 08:36:53 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * tests/examples/gl/qt/qglwtextureshare/glcontextid.h: - * tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp: - gl : fix qglwtextureshare demo - -2014-06-23 11:53:11 +0200 Göran Jönsson <goranjn@axis.com> - - * gst/debugutils/gstwatchdog.c: - watchdog: Only create a new GSource if we have a main context - We can still get OOB events while stopping the watchdog element, and while - stopping it we destroy the main context. - Also let the GSource own a reference to the element for additional safety. - https://bugzilla.gnome.org/show_bug.cgi?id=732554 - -2014-07-01 12:52:39 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: reset QoS on segment event - https://bugzilla.gnome.org/show_bug.cgi?id=732540 - -2014-07-01 16:54:00 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * tests/check/libs/h264parser.c: - tests: h264parser: add test to identify EOSEQ / EOS NALs. - Check that end_of_seq() EOSEQ and end_of_stream EOS NAL units - are correctly parsed and the reported NAL unit size yields 1 byte, - i.e. the only NalHeaderBytes in there. - https://bugzilla.gnome.org/show_bug.cgi?id=732553 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-06-25 17:19:00 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * tests/check/elements/h264parse.c: - tests: h264parse: add test for byte-stream/au output. - Check that conversion to byte-stream/au formats work and that we - can effectively drop broken/invalid NAL units from the resulting - access unit buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=732203 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-06-25 18:47:55 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * tests/check/elements/h264parse.c: - tests: h264parse: check SEI buffering_period() message is output. - If an SEI NAL unit with a buffering_period() message is inserted - between an SPS and PPS NAL unit, check that the output buffer still - contain it. i.e. make sure that this SEI message is not dropped. - https://bugzilla.gnome.org/show_bug.cgi?id=732156 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-06-26 09:44:26 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix collection of access units to preserve config headers. - Always use a GstAdapter when collecting access units (alignment="au") - in either byte-stream or avcC format. This is required to properly - preserve config headers like SPS and PPS when invalid or broken NAL - units are subsequently parsed. - More precisely, this fixes scenario like: - <SPS> <PPS> <invalid-NAL> <slice> - where we used to reset the output frame buffer when an invalid or - broken NAL is parsed, i.e. SPS and PPS NAL units were lost, thus - preventing the next slice unit to be decoded, should this also - represent any valid data. - https://bugzilla.gnome.org/show_bug.cgi?id=732203 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-06-25 13:14:10 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: improve conditions for skipping NAL units. - Carefully track cases when skipping broken or invalid NAL units is - necessary. In particular, always allow NAL units to be processed - and let that gst_h264_parse_process_nal() function decide on whether - the current NAL needs to be dropped or not. - This fixes parsing of streams with SEI NAL buffering_period() message - inserted between SPS and PPS, or SPS-Ext NAL following a traditional - SPS NAL unit, among other cases too. - Practical examples from the H.264 AVC conformance suite include - alphaconformanceG, CVSE2_Sony_B, CVSE3_Sony_H, CVSEFDFT3_Sony_E - when parsing in stream-format=byte-stream,alignment=au mode. - https://bugzilla.gnome.org/show_bug.cgi?id=732203 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-06-25 11:06:41 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: introduce new state tracking variables. - Improve parser state tracking by introducing new flags reflecting - it: "got-sps", "got-pps" and "got-slice". This is an addition for - robustness purposes. - Older have_sps and have_pps variables are kept because they have - a different meaning. i.e. they are used for deciding on when to - submit updated caps or not, and rather mean "have new SPS/PPS to - be submitted?" - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-06-24 13:55:13 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix and optimize NAL collection function. - Use gst_h264_parser_identify_nalu_unchecked() to identify the next - NAL unit. We don't want to parse the full NAL unit, but only the - header bytes and possibly the first RBSP byte for identifying the - first_mb_in_slice syntax element. - Also fix check for failure when returning from that function. The - only success condition for that is GST_H264_PARSER_OK, so use it. - https://bugzilla.gnome.org/show_bug.cgi?id=732154 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-07-01 16:09:28 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: clarifications and documentation fixes. - Fix documentation for GstH264NalUnit. The @ref_idc part was totally - unbalanced. Also add a note about @offset and @size fields to remind - that this is relative to the start of the NAL unit, thus including - the header bytes. - -2014-07-01 15:46:17 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix identification of EOSEQ and EOS NALs. - An end_of_seq() EOSEQ or end_of_stream() EOS NAL unit is really - one byte long because this shall include the NalHeaderBytes (1) too. - The NALU.offset starts from the first byte of the header. - This is the proper fix to commit d37f842. In practice, this fixes - parsing of FRExt1_Panasonic_D and FRExt2_Panasonic_C, that include - additional frames after an EOSEQ. - https://bugzilla.gnome.org/show_bug.cgi?id=732553 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-06-27 12:24:49 +0200 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: Report limited bandwidth - Makes uridecodebin treat this source as a stream source, - allowing timeshifting. - https://bugzilla.gnome.org/show_bug.cgi?id=732335 - -2014-07-01 10:03:05 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * tests/check/libs/mpegts.c: - mpegts: Expose GstMpegtsDescriptor free function - Nothing earth shattering, but avoids people having to use g_boxed_free() - -2014-06-30 19:15:01 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglmemory.c: - eagl: Disable usage of R and RG textures on iOS - They don't work currently and just render zeroes, while the - fallback code path with LUM and LUM_ALPHA textures still works. - https://bugzilla.gnome.org/show_bug.cgi?id=732390 - -2014-06-30 11:54:41 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/opencv/gstfaceblur.c: - faceblur: release the haar cascade - -2014-06-30 12:22:07 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/gstaggregator.c: - * tests/check/libs/aggregator.c: - aggregator: Avoid destroying sources we do not own - + Unref the maincontext in a new dispose function - + Make sure to remove all sources on dispose - https://bugzilla.gnome.org/show_bug.cgi?id=732445 - -2014-06-16 12:35:13 +0200 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/vtenc.c: - vtenc: fix memory leak - The pixel buffer release callback is called if the void * - dataPtr given to the CVPixelBufferCreateWithPlanarBytes - is not NULL. - According to the documentation dataPtr is supposed to be a - "plane description block" but no specific type is given. - https://bugzilla.gnome.org/show_bug.cgi?id=711847 - -2014-06-30 00:22:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/gstsegmentation.cpp: - segmentation: Release memory storage in finalize - -2014-06-30 00:18:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/gsttextoverlay.c: - textoverlay: Release memory storage and resize image when caps change - -2014-06-30 00:15:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/gsttemplatematch.c: - templatematch: Release cvImages when reloading templates are changing caps - -2014-06-30 00:12:26 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/gstpyramidsegment.c: - pyramidsegment: Release image when changing caps or reusing the element - -2014-06-30 00:09:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/gsthanddetect.c: - handdetect: Release memory storage - -2014-06-30 00:07:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/gstfaceblur.c: - faceblur: Release memory storage - And also release cvImages and memory storage when changing caps or reusing the - element. - -2014-06-30 00:05:53 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/gstedgedetect.c: - edgedetect: Don't leak cvImages when caps are changing or the element is reused - -2014-06-29 23:42:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/gstpyramidsegment.c: - pyramidsegment: Release memory storage when finalizing - -2014-06-29 23:33:20 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/schroedinger/gstschroenc.c: - schroenc: Remove obsolete FIXME comment - -2014-06-29 23:31:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/schroedinger/gstschroenc.c: - schroenc: Don't leak all input buffers - -2014-06-29 23:22:13 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/h264parse.c: - h264parse: Fix memory leak in unit test - -2014-06-29 22:30:56 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/gsttextoverlay.c: - textoverlay: Free text buffer in finalize - -2014-06-29 22:26:47 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Chain up to the parent class' finalize function - -2014-06-29 22:25:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Make sure to always unref the display - Even if we didn't create a context yet. - -2014-06-29 22:20:51 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintersubsrc.h: - intersubsrc: basesrc is already creating a pad for us, no need to do it twice - -2014-06-29 22:18:41 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/yadif/gstyadif.c: - * gst/yadif/gstyadif.h: - yadif: basetransform is creating pads for us already, don't do it twice - -2014-06-29 21:57:32 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/libs/gstglupload.c: - glupload: Fix memory leak in unit test - -2014-06-29 21:53:21 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/libs/gstglcontext.c: - glcontext: Fix memory leaks in unit test - -2014-06-29 21:34:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * tests/check/libs/mpegts.c: - mpegts: Fix memory leaks in the test and the library - Currently uses g_boxed_free() in the unit test, this needs to - be fixed properly when cleaning up the API. - https://bugzilla.gnome.org/show_bug.cgi?id=730914 - -2014-06-29 21:05:27 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/assrender/gstassrender.c: - assrender: Make static caps actually static - Otherwise we leak once caps instance on every function call. - -2014-06-29 21:01:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/uvch264/gstuvch264_src.c: - uvch264src: Free property strings when disposing the instance - -2014-06-29 20:58:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsrc.c: - intersubsink/src: Free channel string when finalizing the instance - -2014-06-29 20:13:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/uvch264/gstuvch264_src.c: - uvch264src: Fix compiler warning when compiling with G_DISABLE_ASSERT - -2014-06-29 20:11:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: Fix compiler warnings when compiling with G_DISABLE_ASSERT - -2014-06-28 23:26:23 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatespu.c: - * ext/kate/gstkateutil.c: - kate: Use G_GSIZE_FORMAT instead of unportable %zu - -2014-06-28 17:02:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/bad-video-orc-dist.c: - * gst-libs/gst/video/bad-video-orc-dist.h: - badvideo: Update dist generated ORC files - -2014-06-28 17:01:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/bad-video-orc.orc: - * gst-libs/gst/video/gstcms.c: - * gst-libs/gst/video/gstcms.h: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/videoconvert.c: - * gst-libs/gst/video/videoconvert.h: - badvideo: Rename videoconvert functions to prevent conflicts with static linking - https://bugzilla.gnome.org/show_bug.cgi?id=728443 - -2014-06-28 11:20:43 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/check/libs/aggregator.c: - tests: aggregator: fix various leaks in the tests - -2014-06-28 09:43:48 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/check/elements/compositor.c: - compositor: tests: Fix pad leak - Remember to unref requested pad - -2014-06-28 09:35:21 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/dataurisrc/gstdataurisrc.c: - dataurisrc: fix leak as gst_buffer_replace adds its own ref - So unref the buffer after that otherwise it leaks - -2014-06-28 09:34:05 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: always store or unref the buffer on the _chain function - Otherwise it leaks, and it is very common to go to flushing when the - pipeline is stopping, leaking a buffer. - -2014-06-28 09:32:32 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: always unref the buffer on _finish function - Otherwise the user doesn't know if it was unref'd or not - -2014-06-28 09:31:55 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: add dispose/finalize functions - Add functions to be able to cleanup the mutex/cond and pending buffers - on the aggregator and on its pad - -=== release 1.3.90 === - -2014-06-28 11:30:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.3.90 - -2014-06-28 11:27:15 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2014-06-28 10:43:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/inter/gstinteraudiosrc.c: - interaudiosrc: Fail in set_caps() if the caps can't be parsed - -2014-06-27 17:35:32 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/check/elements/camerabin.c: - tests: camerabin: fix caps leak in test - The gst_query_set_caps_result doesn't take ownership of caps - -2014-06-27 17:27:25 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: fix caps leaks - Fix leak of caps event and of caps objects when setting caps on - sink and src pads - -2014-06-27 17:00:03 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/kate/gstkateutil.c: - kate: unref events when freeing events list - Instead of just feeing the queue structs - -2014-06-27 16:58:47 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/kate/gstkateenc.c: - kateenc: fix segment event leak - gst_event_replace increments the refcount - -2014-06-27 12:50:02 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - mpegts: atsc: avoid calling g_convert with 0-sized input - Avoids an assertion. The cached string will be assigned an empty string - as its value when size is 0. - -2014-06-27 10:53:20 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst/videoparsers/gsth264parse.c: - * win32/common/libgstcodecparsers.def: - codecparsers: h264: fix memory leak in GstH264PPS. - The gst_h264_parse_pps() function dynamically allocates the slice - group ids map array, so that needs to be cleared before parsing a - new PPS NAL unit again, or when it is no longer needed. - Likewise, a clean copy to the internal NAL parser state needs to be - performed so that to avoid a double-free corruption. - https://bugzilla.gnome.org/show_bug.cgi?id=707282 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-06-26 17:18:47 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: fix typo in GstH264VUIParams description. - -2014-01-31 17:07:42 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst/videoparsers/gsth264parse.c: - codecparsers: h264: add support for Recovery Point SEI message. - The recovery point SEI message helps a decoder in determining if the - decoding process would produce acceptable pictures for display after - the decoder initiates random access or after the encoder indicates - a broken link in the coded video sequence. - This is not used in the h264parse element, but it could help debugging. - https://bugzilla.gnome.org/show_bug.cgi?id=723380 - -2014-03-25 12:01:55 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/nalutils.c: - * gst-libs/gst/codecparsers/nalutils.h: - codecparsers: h264: add nal_reader_skip_long() helper. - Add nal_reader_skip_long() helper function to allow an arbitrary number - of bits to be skipped. The former nal_reader_skip() function is too - limited to the actual cache size. - Use this new function to simplify gst_h264_parser_parse_sei_message() - default case, that skips unsupported payloads. - v2: made args consistent from header to source file. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-06-27 00:09:08 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: fix a refcount error when keeping the buffer - We take a ref on the pad's buffer at the beginning so we need to - unref when we are done in all cases. - -2014-06-26 15:59:35 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvp8rangedecoder.c: - codecparsers: vp8: move up built-in range decoder private data. - Use the first _gst_reserved slot to hold the built-in range decoder - private data. The first slot was formerly the buffer size, which was - then promoted to semi-public namespace when it got integrated as git - commit 2940ac6. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-06-26 11:25:37 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: free pixel swizzling information - -2014-06-26 11:15:56 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixer.h: - glmixer: remove redundant/unused lock - Use the GstObject lock instead - -2014-06-26 11:12:49 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - glmixer: remove redundant creation and free of GPtrArrays - Also plugs a memory leak - -2014-06-26 10:54:38 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - glmixer: plug a memory leak for the caps - gst_query_set_caps_result() takes a ref on the caps - -2014-06-26 10:53:16 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: plug a memory leak of the srccaps - -2014-06-26 10:31:02 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - glmixer: intersect with the filtercaps if available - -2014-06-26 10:30:41 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/gstgl_gles2compat.h: - gl: update gles2 compatability header - -2014-06-25 14:50:05 +0200 Edward Hervey <bilboed@bilboed.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * gst-libs/gst/mpegts/Makefile.am: - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gst-dvb-section.h: - * gst-libs/gst/mpegts/gst-scte-section.h: - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - * sys/dvb/camconditionalaccess.c: - * sys/dvb/camconditionalaccess.h: - * sys/dvb/camdevice.c: - * sys/dvb/camdevice.h: - * sys/dvb/camswclient.c: - * sys/dvb/camswclient.h: - * sys/dvb/camutils.c: - * sys/dvb/camutils.h: - * sys/dvb/dvbbasebin.c: - * tests/check/libs/mpegts.c: - * tests/examples/mpegts/ts-parser.c: - mpegts: Unify API : GstMpegts / gst_mpegts_ / GST_*_MPEGTS_ - It was previously a mix and match of both variants, introducing just too much - confusion. - The prefix are from now on: - * GstMpegts for structures and type names (and not GstMpegTs) - * gst_mpegts_ for functions (and not gst_mpeg_ts_) - * GST_MPEGTS_ for enums/flags (and not GST_MPEG_TS_) - * GST_TYPE_MPEGTS_ for types (and not GST_TYPE_MPEG_TS_) - The rationale for chosing that is: - * the namespace is shorter/direct (it's mpegts, not mpeg_ts nor mpeg-ts) - * the namespace is one word under Gst - * it's shorter (yah) - -2014-06-25 14:13:55 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegtssection: Free data in error cases - Data is marked as "transfer full", if we have an error we need to - free it. - -2014-06-25 22:05:37 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: pass through the allocation query when in passthrough mode - Otherwise two GL elements on either side will fail to use the same - GL context. - -2014-06-25 21:50:40 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: prefer passthrough for non-sysmem caps - -2014-06-25 18:23:52 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/Makefile.am: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstopengl.c: - glshader: enable glshader on GLES2 - -2014-06-24 19:37:17 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/gl/gstglcolorscale.c: - glcolorscale: do passthrough on same caps - See https://bugzilla.gnome.org/show_bug.cgi?id=732178 - -2014-06-24 19:35:01 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: handle NULL decide_query which means passthrough - See https://bugzilla.gnome.org/show_bug.cgi?id=732178 - -2014-06-24 19:23:01 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: prepend intersection to src caps - Prefer to stay in the same memory space if possible. - Also it let a chance to do passthrough. - See https://bugzilla.gnome.org/show_bug.cgi?id=732178 - -2014-06-22 13:14:27 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/gl/Makefile.am: - * ext/gl/gstglvideomixer.c: - * ext/gl/gstopengl.c: - gl: enable glvideomixer on GLES2 - -2014-06-24 22:15:53 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - * sys/dvb/gstdvbsrc.h: - dvbsrc: add copyright/license stub to header - -2014-06-24 20:52:54 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - dvbsrc: documentation fixes - -2014-06-25 12:00:34 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: bas output width/height on the pad properties - Allows automatic negotiation of the size in the following case: - gst-launch-1.0 glvideomixer name=m sink_0::xpos=0 sink_1::xpos=320 ! glimagesink \ - videotestsrc ! m. \ - videotestsrc pattern=1 ! m. - https://bugzilla.gnome.org/show_bug.cgi?id=731878 - -2014-06-25 10:18:48 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: don't clobber already allocated shader - -2014-06-24 16:32:22 +0200 Sebastian Rasmussen <sebrn@axis.com> - - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlsftpsink.c: - curls?ftpsink: Fix memory leaks due to new error handling - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=732174 - -2014-06-24 16:04:57 +0200 Edward Hervey <bilboed@bilboed.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: More doc fixes - Still not done :( - -2014-06-24 15:41:36 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gst-dvb-section.h: - * gst-libs/gst/mpegts/gstmpegtssection.h: - mpegts: more annotation fixes - -2014-06-01 10:44:23 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst/mpegtsdemux/tsdemux.c: - * tests/examples/mpegts/ts-parser.c: - mpegts: change to GType and from gchar to gchar* - https://bugzilla.gnome.org/show_bug.cgi?id=730914 - -2014-06-24 23:51:24 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstopengl.c: - gl: XInitThreads when env variable is set - This is too allow gst-launch debugging with multiple GL contexts as - well as avoiding segfaulting innocent gtk+ apps that have not called - XInitThreads. - https://bugzilla.gnome.org/show_bug.cgi?id=731525 - -2014-06-24 23:33:30 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gl: add a scary note about initializing thread support for the winsys - We cannot do it as the winsys may crash if we initialize too late. - Example, GLX contexts with Intel drivers: - Intel requires the X Display to be the same in order to share GL - resources across GL contexts. These GL contexts are generally - accessed from different threads. Without winsys support it is - nearly impossible to guarentee that concurrent access will not - occur. This concurrent access could result in crashes or abortion - by the winsys (xcb). - https://bugzilla.gnome.org/show_bug.cgi?id=731525 - -2014-06-24 14:05:14 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * tests/check/libs/mpegts.c: - mpegts: Fix descriptor_from_dvb_service - Various leaks/overwrites issues - -2014-06-24 13:46:17 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstperspective.c: - all: Don't declare variables in 'for' loops - -2014-06-24 11:27:15 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/base/Makefile.am: - badbase: Use the correct LDFLAGS for creating libraries - Otherwise we won't e.g. create .dlls on Windows - -2014-06-24 08:01:21 +0200 Edward Hervey <edward@collabora.com> - - * gst/compositor/Makefile.am: - compositor: Fix Makefile CFLAGS/LIBADD ordering - We want to use the libraries from -bad if/when present - -2014-06-23 20:44:23 +0200 Eric Trousset <etrousset@awox.com> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dhelpers.h: - d3dvideosink: Release D3D surfaces when shutting down the sink - https://bugzilla.gnome.org/show_bug.cgi?id=726026 - -2014-06-23 20:33:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/opensles/openslessrc.c: - openslessrc: Classification of the element factory should be Source/ not Src/ - https://bugzilla.gnome.org/show_bug.cgi?id=727811 - -2014-06-23 22:40:23 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: don't clobber already heap allocated video frame - CID # 1223440 - -2014-06-23 22:36:23 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/video/gstvideoaggregator.c: - videoaggregator: fix up the parent chaining for dispose and finalize - -2014-06-23 21:43:10 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgluploadmeta.c: - gluploadmeta: reenable GLMemory upload path - -2014-06-22 23:39:14 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix diseqc-source prop name in example - -2014-06-22 21:04:45 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix nit on warning message - -2014-06-22 22:04:31 +0100 Tim-Philipp Müller <tim@centricular.com> - - * configure.ac: - configure: use $ERROR_CFLAGS instead of hard-coding -Werror - https://bugzilla.gnome.org//show_bug.cgi?id=731692 - -2014-06-15 21:15:51 +0200 Koop Mast <kwm@rainbow-runner.nl> - - * configure.ac: - configure: use -Werror to make the include GL and GLES2 header check guaranteed fatal - Clang will only give a warning for the redefinition of typedef GLenum. - Since master is build with -Werror this will result in a build failure - later in the gl plugin. Add -Werror to the test, so the test result is as - expected. This will allow the gl plugins to build. - https://bugzilla.gnome.org//show_bug.cgi?id=731692 - -2014-06-17 14:23:43 +0100 Chris Bass <floobleflam@gmail.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: fix hvcC size check - In ISO/IEC 14496-15, the minimum size of a HEVCDecoderConfigurationRecord - (i.e., the contents of a hvcC box) is 23 bytes. However, the code in h265parse - checks that the size of this data is not less than 28 bytes, and it refuses to - accept caps if the check fails. The result is that standards-conformant streams - that don't carry any parameter sets in their hvcC boxes won't play. - https://bugzilla.gnome.org//show_bug.cgi?id=731783 - -2014-06-19 20:15:05 +0200 Koop Mast <kwm@rainbow-runner.nl> - - * ext/modplug/Makefile.am: - modplug: don't hardcode c++ standard library - Fixes build with llvm on FreeBSD. - https://bugzilla.gnome.org//show_bug.cgi?id=731930 - -2014-06-22 19:36:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -=== release 1.3.3 === - -2014-06-22 19:22:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-libs/gst/video/bad-video-orc-dist.c: - * gst-plugins-bad.doap: - * gst/compositor/compositororc-dist.c: - * win32/common/config.h: - Release 1.3.3 - -2014-06-22 19:09:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2014-06-22 18:58:51 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/Makefile.am: - gl: Need to link to new badvideo library for the video aggregator base class - -2014-06-22 18:51:45 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/video/Makefile.am: - video: Link with $(LIBM) for rint() and others - -2014-06-22 14:25:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/da.po: - * po/de.po: - * po/hu.po: - * po/id.po: - * po/nl.po: - * po/pl.po: - * po/ru.po: - * po/sr.po: - * po/uk.po: - po: Update translations - -2014-06-20 08:20:55 -0600 Thomas Bluemel <tbluemel@control4.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Fix decrypting fragments - Only reset the decryption engine on the first buffer of a fragment, - not again for the second buffer. This fixes corrupting the second - buffer of a fragment. - https://bugzilla.gnome.org/show_bug.cgi?id=731968 - -2014-06-22 14:12:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/rawparse/gstrawparse.c: - rawparse: Use the pad passed to us directly for default event handling - -2014-06-19 17:24:26 +0900 Justin Joy <justin.joy.9to5@gmail.com> - - * gst/rawparse/gstrawparse.c: - rawparse: default query should be forward on target pad - https://bugzilla.gnome.org/show_bug.cgi?id=731899 - -2014-06-22 12:32:35 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: fix up comment - -2014-06-22 09:44:24 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/glprototypes/Makefile.am: - * gst-libs/gst/gl/glprototypes/gstgl_gles2compat.h: - * gst-libs/gst/gl/gstglapi.h: - gl: move gles2 compat header to glprototypes - -2014-06-22 09:36:34 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - glbufferpool: provide a consistent API regardless of platform - -2014-06-22 09:22:23 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gl.h: - gl: mark library as API unstable - -2014-06-21 16:57:34 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/uridownloader/gsturidownloader.h: - libs:uridownloader: Properly declare APIs as UNSTABLE - -2014-06-21 16:52:51 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstvideoaggregator.h: - libs:video: Properly declare APIs as UNSTABLE - -2014-06-21 16:51:01 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/Makefile.am: - * gst-libs/gst/base/gstaggregator.h: - libs:base: Properly declare APIs as UNSTABLE - -2014-06-21 16:57:18 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Fix compiler warning - gstwaylandsink.c:480:14: error: comparison of constant -1 with expression of - type 'enum wl_shm_format' is always false - -Werror,-Wtautological-constant-out-of-range-compare - if (format == -1) - ~~~~~~ ^ ~~ - -2014-06-21 16:55:05 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Update comments to the new reality and remove unused variables - -2014-06-21 15:40:58 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/video/Makefile.am: - libs:video: Add -I$(top_srcdir)/gst-libs to fix distcheck - -2014-06-21 15:26:14 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/Makefile.am: - libs:base: Fix includedir - -2014-06-21 13:45:13 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/base/gstaggregator.c: - aggregator: Fix requested pad name - -2014-06-20 22:02:07 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - libs: videoaggregato: Do not import videoconvert.h in gstvideoaggregatorpad.h - + Add a Private structure to the GstVideoAggregatorPad - + Add some padding - -2014-06-20 21:18:58 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/video/Makefile.am: - Final fix compilation - -2014-06-20 20:11:07 +0100 Tim-Philipp Müller <tim@centricular.com> - - * Makefile.am: - build: remove gst-libs/gst/video/ from CRUFT_DIRS - It was gone, but now it's back. - -2014-06-20 20:23:30 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/video/Makefile.am: - libs:video:Fix compilation - -2014-06-20 11:10:45 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gl/gstglvideomixer.c: - gl:glvideomixer: Add the Compositor in the element metadata class - So it is possible to pick one compositing element from the registry - -2014-05-22 19:46:02 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/compositor/Makefile.am: - * gst/compositor/blend.c: - * gst/compositor/blend.h: - * gst/compositor/blendorc.h: - * gst/compositor/compositor.c: - * gst/compositor/compositor.h: - * gst/compositor/compositororc-dist.c: - * gst/compositor/compositororc-dist.h: - * gst/compositor/compositororc.orc: - * gst/compositor/compositorpad.h: - * tests/check/Makefile.am: - * tests/check/elements/compositor.c: - compositor: Add a new compositor based on the new GstVideoAggregator base class - It is a replacement for videomixer with a similare API - Co-Authored by: Thibault Saunier <tsaunier@gnome.org> - https://bugzilla.gnome.org/show_bug.cgi?id=731919 - -2014-06-10 11:26:53 +0200 Thibault Saunier <tsaunier@gnome.org> - - * ext/gl/gstglmosaic.c: - * ext/gl/gstglvideomixer.c: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixer.h: - * gst-libs/gst/gl/gstglmixerpad.h: - gl: Port glmixer to the GstVideoAggregator baseclass - https://bugzilla.gnome.org/show_bug.cgi?id=731921 - -2014-06-03 19:00:34 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * configure.ac: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/bad-video-orc-dist.c: - * gst-libs/gst/video/bad-video-orc-dist.h: - * gst-libs/gst/video/bad-video-orc.orc: - * gst-libs/gst/video/gstcms.c: - * gst-libs/gst/video/gstcms.h: - * gst-libs/gst/video/gstvideoaggregator.c: - * gst-libs/gst/video/gstvideoaggregator.h: - * gst-libs/gst/video/gstvideoaggregatorpad.h: - * gst-libs/gst/video/videoconvert.c: - * gst-libs/gst/video/videoconvert.h: - * pkgconfig/gstreamer-bad-video-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-video.pc.in: - videoaggregator: Create a new GstVideoAggregator baseclass - This base class has been added to a newly created libgstbadvideo library - Co-Authored by: Thibault Saunier <tsaunier@gnome.org> - https://bugzilla.gnome.org/show_bug.cgi?id=731918 - -2014-05-22 19:44:37 +0200 Thibault Saunier <tsaunier@gnome.org> - - * configure.ac: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/base/Makefile.am: - * gst-libs/gst/base/gstaggregator.c: - * gst-libs/gst/base/gstaggregator.h: - * pkgconfig/gstreamer-bad-base-uninstalled.pc.in: - * pkgconfig/gstreamer-bad-base.pc.in: - * tests/check/Makefile.am: - * tests/check/libs/aggregator.c: - aggregator: Add new GstAggregator base class - This base class has been added to a newly created libgstbadbase library - Co-Authored by: Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - https://bugzilla.gnome.org/show_bug.cgi?id=731917 - -2014-06-20 14:59:12 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Clear exceptions also when we did not provide a GError - -2014-06-19 11:26:41 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - androidmedia: Also don't report warnings for queue/dequeue errors during flushing in error cases - ... and fix a case where we released an invalid buffer index. - -2014-06-19 11:15:56 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - androidmedia: Don't consider input buffer queueing failures as an error during flushing - -2014-06-19 11:12:47 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - androidmedia: Clean up flushing code and don't consider output buffer releasing failures during flushing as an error - -2014-06-19 09:57:25 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Include the debug string in the error messages we propagate from t source - -2014-06-19 09:56:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Include the debug string in the error messages we propagate from the source - -2014-06-19 09:54:10 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Include a more descriptive error message - -2014-06-19 09:53:00 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Propagate error messages from the source element up in the hierarchy - Instead of inventing our own generic error strings which are mostly useless. - -2014-06-19 09:40:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Directly convert GErrors to error messages - This will make sure that we don't leak debug information into the actual - error message string and keep it behind the debug string. - -2014-06-17 11:48:12 +0200 Miguel París Díaz <mparisdiaz@gmail.com> - - * ext/srtp/gstsrtpenc.c: - gstsrtpenc: unref event when needed - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=731768 - -2014-06-18 15:36:09 +0200 Wim Taymans <wtaymans@redhat.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: improve property comments - Add a Note to the allow-repeat-tx property because it is potentially - insecure when used incorrectly. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=731714 - -2014-06-13 11:15:25 +0200 Miguel París Díaz <mparisdiaz@gmail.com> - - * ext/srtp/gstsrtpenc.c: - * ext/srtp/gstsrtpenc.h: - gstsrtpenc: add allow-repeat-tx property - -2014-05-27 12:40:09 +0200 Lubosz Sarnecki <lubosz@gmail.com> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/gl/Makefile.am: - * ext/gl/gstgltransformation.c: - * ext/gl/gstgltransformation.h: - * ext/gl/gstopengl.c: - opengl: add element for transforming video geometry - * add graphene as soft dependency for linear algebra - -2014-06-18 10:13:10 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/pnm/Makefile.am: - pnm: link against libgstbase for GstAdapter - https://bugzilla.gnome.org/show_bug.cgi?id=730523 - -2014-06-17 23:20:04 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglframebuffer.c: - glframebuffer: don't segfault needlessly with GLES2 - gst_gl_framebuffer_use_v2 was using a function that is not available - with GLES2 - -2014-06-16 20:36:09 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglfiltershader.c: - * ext/gl/gstglfiltershader.h: - glfiltershader: port to GLES2 - Provide a time variable - -2014-06-17 13:48:10 +0100 Tim-Philipp Müller <tim@centricular.com> - - * win32/common/libgstcodecparsers.def: - win32: update exports for changed h264 codec parser API - -2014-06-17 12:50:17 +0530 Sanjay NM <sanjay.nm@samsung.com> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmutils.c: - pnmdec: Added PBM Support - https://bugzilla.gnome.org/show_bug.cgi?id=730523 - -2014-06-17 13:15:06 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/wayland/wayland.h: - wayland: add unstable API guards to wayland library header - -2014-06-17 13:11:29 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/wayland/Makefile.am: - gst-libs: fix uninstalled build of new wayland lib - -2014-06-16 18:53:53 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/wldisplay.c: - waylandsink/wldisplay: verify that all the required interfaces have been found on the compositor - This allows waylandsink to fail gracefully before going to READY - in case one of the required interfaces does not exist. Not all - interfaces are necessary for all modes of operation, but it is - better imho to fail before going to READY if at least one feature - is not supported, than to fail and/or crash at some later point. - In the future we may want to relax this restriction and allow certain - interfaces not to be present under certain circumstances, for example - if there is an alternative similar interface available (for instance, - xdg_shell instead of wl_shell), but for now let's require them all. - Weston supports them all, which is enough for us now. Other compositors - should really implement them if they don't already. I don't like the - idea of supporting many different compositors with different sets of - interfaces implemented. wl_subcompositor, wl_shm and wl_scaler are - really essential for having a nice video sink. Enough said. - -2014-06-16 18:03:51 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: remove the buffer from the surface when going PAUSED -> READY - This essentially hides the video and allows the application to - potentially draw a black background or whatever else it wants. - This allows to differentiate the "paused" and "stopped" modes - from the user's point of view. - Also reworded a comment there to make my thinking more clear, - since the "reason for keeping the display around" is not really - the exposed() calls, as there is no buffer shown in READY/NULL - anymore. - -2014-06-12 17:43:40 +0200 Arnaud Vrac <avrac@freebox.fr> - - * configure.ac: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-wayland-uninstalled.pc.in: - * pkgconfig/gstreamer-wayland.pc.in: - wayland: install .pc file - -2014-06-13 16:37:38 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/wlwindow.c: - waylandsink/wlwindow: do not commit a resize when it happens due to a video info change - 1) We know that gst_wayland_sink_render() will commit the surface - in the same thread a little later, as gst_wl_window_set_video_info() - is always called from there, so we can save the compositor from - some extra calculations. - 2) We should not commit a resize with the new video info while we are still - showing the buffer of the previous video, with the old caps, as that - would probably be a visible resize glitch. - -2014-06-13 16:29:32 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/wlwindow.c: - waylandsink/wlwindow: take into account the video aspect ratio when determining the size of the surface - -2014-06-13 15:58:08 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: improve the way the video size is passed to wlwindow and also improve the code for window creation - -2014-06-06 12:49:56 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * gst-libs/gst/wayland/wayland.c: - * gst-libs/gst/wayland/wayland.h: - waylandsink: rename pause/resume_rendering to begin/end_geometry_change and update their documentation - -2014-05-29 12:27:46 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - waylandsink: remove the manual synchronization from pause/resume_rendering and use subsurface sync/desync - Previously, in order to change the surface size we had to let the pipeline - redraw it, which at first also involved re-negotiating caps, etc, so a - synchronization with the pipeline was absolutely necessary. - At the moment, we are using wl_viewport, which separates the surface size - from the buffer size and it also allows us to commit a surface resize without - attaching a new buffer, so it is enough to just do: - gst_wayland_video_pause_rendering(): - wl_subsurface_set_sync() - gst_video_overlay_set_render_rectangle(): - wl_subsurface_set_position() - wl_viewport_set_destination() - wl_surface_damage() - wl_surface_commit() - ... commit the parent surface ... - gst_wayland_video_resume_rendering(): - wl_subsurface_set_desync() - This is enough to synchronize a surface resize and the pipeline can continue - drawing independently. Now of course, the names pause/resume_rendering are - bad. I will rename them in another commit. - -2014-06-06 12:10:24 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: protect access to properties with the OBJECT_LOCK - -2014-06-06 12:04:44 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - waylandsink: protect access to the display with a new display_lock - Access is protected only for setting/creating/destroying the display - handle. set_caps() for example is not protected because it cannot be - called before changing state to READY, at which point there will be - a display handle available and which cannot change by any thread at - that point - -2014-06-06 10:35:20 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: remove the OBJECT_LOCK from set_caps() - It's not really necessary, this method is protected from GstBaseSink with the PREROLL_LOCK - -2014-05-28 13:10:43 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - waylandsink: Replace the OBJECT_LOCK with a private render_lock to lock render operations - This is because: - * GST_ELEMENT_WARNING/ERROR do lock the OBJECT_LOCK and we deadlock instantly - * In future commits I want to make use of GstBaseSink functions that also - lock the OBJECT_LOCK inside this code - -2014-05-26 14:13:56 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: move surface resizing logic to the GstWlWindow and make it be called from the main thread - -2014-05-26 12:54:10 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: cleanup GstWlWindow a bit after the overlaying semantics change - * own_surface is not needed anymore - * gst_wl_window_from_surface is not used externally anymore - * many initializations to 0 are not needed (GObject does them) - -2014-05-26 11:34:51 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * gst-libs/gst/wayland/wayland.c: - * gst-libs/gst/wayland/wayland.h: - wayland: remove gst_wayland_video_set_surface_size() - Not needed anymore, since we use gst_video_overlay_set_render_rectangle() - -2014-05-23 18:18:32 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: create and maintain the subsurface inside the sink - This means that the given surface in set_window_handle can now be - the window's top-level surface on top of which waylandsink creates - its own subsurface for rendering the video. - This has many advantages: - * We can maintain aspect ratio by overlaying the subsurface in - the center of the given area and fill the parent surface's area - black in case we need to draw borders (instead of adding another - subsurface inside the subsurface given from the application, - so, less subsurfaces) - * We can more easily support toolkits without subsurfaces (see gtk) - * We can get properly use gst_video_overlay_set_render_rectangle - as our api to set the video area size from the application and - therefore remove gst_wayland_video_set_surface_size. - -2014-05-23 13:09:27 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * gst-libs/gst/wayland/wayland.c: - * gst-libs/gst/wayland/wayland.h: - wayland: add public API for creating & using the display handle GstContext - -2014-05-21 18:27:28 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlwindow.c: - * gst-libs/gst/wayland/wayland.h: - waylandsink: get the external display handle using GstContext - This drops the ugly GstWaylandWindowHandle structure and is much - more elegant because we can now request the display separately - from the window handle. Therefore the window handle can be requested - in render(), i.e. when it is really needed and we can still open - the correct display for getting caps and creating the pool earlier. - This change also separates setting the wl_surface from setting its size. - Applications should do that by calling two functions in sequence: - gst_video_overlay_set_window_handle (overlay, surface); - gst_wayland_video_set_surface_size (overlay, w, h); - -2014-05-21 13:14:15 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: drop width/height arguments from gst_wl_window_new_from_surface() - -2014-05-22 10:10:51 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/wldisplay.h: - * ext/wayland/wlvideoformat.h: - * ext/wayland/wlwindow.h: - waylandsink: add G_BEGIN/END_DECLS on all headers for consistency - -2014-05-21 12:58:10 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: fix assertion failure when stopping immediately after starting, without displaying anything - This was triggered in scenarios like - filesrc location=nonexistent_file ! decodebin ! waylandsink - -2014-05-21 11:55:45 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/scaler.xml: - * ext/wayland/wldisplay.c: - waylandsink: Update wl_scaler to version 2 - -2014-05-20 19:04:16 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * gst-libs/gst/wayland/Makefile.am: - wayland/Makefile.am: link with gstvideo to avoid introspection errors - -2014-05-20 19:03:39 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/Makefile.am: - waylandsink/Makefile.am: Fix scaler-client-protocol.h generation - -2014-03-13 13:13:08 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/wlvideoformat.c: - * ext/wayland/wlvideoformat.h: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: remove unused functions - -2014-03-12 19:25:06 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Add myself to the authors list - -2014-03-12 17:03:10 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/wldisplay.c: - waylandsink/wldisplay: bind to the latest available wl_compositor version - -2014-03-12 14:28:44 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: create/destroy the display when entering/leaving the READY state instead of PAUSED - This is the only way to get the negotiation working with the dynamic - detection of formats from the display, because the pipeline needs - to know the supported formats in the READY state and the supported - formats can only be known if we open the display. - Unfortunately,in wayland we cannot have a separate connection to - the display from the rest of the application, so we need to ask for a - window handle when going to READY in order to get the display from it. - And since it's too early to create a top level window from the state - change to READY, create it in render() when there is no other window. - This also changes set_window_handle() to not support window handle - changes in PAUSED/PLAYING (because it's complex to handle and useless - in practice) and make sure that there is always a valid display pointer - around in the READY state. - -2014-03-12 14:13:49 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Support all video formats supported by the display - -2014-03-12 13:54:44 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: fix crash in case there is no pool because of a caps negotiation error - -2014-03-11 19:47:52 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/wlwindow.c: - waylandsink: set an empty input region on the video surface - -2014-03-11 19:46:56 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/wlwindow.c: - waylandsink/wlwindow: reuse code between the two constructors - -2014-03-11 18:45:23 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: increase debug messages - -2014-03-11 17:48:46 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - waylandsink: Use a boolean in combination with render_cond to comply with GCond's usage documentation - -2014-03-11 17:45:05 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - waylandsink: Implement expose() and handle resizing properly in non-PLAYING states - -2014-03-11 13:14:00 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: Use wl_scaler/wl_viewport to scale the surface in the compositor/hardware - -2014-03-11 13:05:56 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * configure.ac: - * ext/wayland/.gitignore: - * ext/wayland/Makefile.am: - * ext/wayland/scaler.xml: - waylandsink: Build bindings for the unstable wl_scaler spec - -2014-03-10 13:50:06 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Set external surfaces and their child objects to use our own event queue - This fixes weird freezes because of frame_redraw_callback() not being - called from the main thread when it should with weston's toy toolkit. - It's also safer to know that frame_redraw_callback() will always be - called from our display thread... Otherwise it could be called after - the sink has been destroyed for example. - -2014-03-07 17:25:00 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - waylandsink: Wait for the frame_cb to redraw and drop frames meanwhile - We are not supposed to redraw until we receive a frame callback and this - is especially useful to avoid allocating too many buffers while the - window is not visible, because the compositor may not call wl_buffer.release - until the window becomes visible (ok, this is a wayland bug, but...). - -2014-03-07 16:16:30 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/waylandpool.c: - * ext/wayland/waylandpool.h: - waylandsink: Handle wl_buffer::release and don't reuse buffers that are not released - This is achieved by adding an extra reference on the buffers, which does - not allow them to return to the pool. When they are released, this reference - is dropped. - The rest complexity of this patch (hash table, mutex, flag, explicit release calls) - merely exists to allow a safe, guaranteed and deadlock-free destruction sequence. - See the added comment on gstwaylandsink.c for details. - -2014-03-06 17:03:50 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/waylandpool.c: - * ext/wayland/waylandpool.h: - waylandsink/waylandpool: remove useless munmap call - This data pointer is part of a bigger mmap'ed region, - it has not been returned from mmap itself. - -2014-02-28 13:37:30 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/waylandpool.c: - waylandsink/waylandpool: call the start/stop methods of the parent class - start() makes sure that the minimum ammount of buffers requested is allocated. - stop() makes sure that buffers are actually destroyed and prevents - filling the file system when resizing the surface a lot, because the - wayland-shm-* files will stay on the file system as long as the wl_buffers - created out of them are alive. - -2014-02-28 13:36:43 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/waylandpool.c: - waylandsink/waylandpool: unlink mmaped shm files so that they don't remain on the file system - -2014-02-28 11:48:30 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - * gst-libs/gst/wayland/wayland.h: - waylandsink: implement the GstVideoOverlay & GstWaylandVideo interfaces - This is the initial implementation, without the GstVideoOverlay.expose() - method. It only implements using an external (sub)surface and resizing - it with GstWaylandVideo. - -2014-02-14 16:08:56 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/Makefile.am: - * ext/wayland/gstwaylandsink.c: - waylandsink: implement with stubs the GstWaylandVideo & GstVideoOverlay interfaces - -2013-05-06 13:16:02 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/wayland/Makefile.am: - * gst-libs/gst/wayland/wayland.c: - * gst-libs/gst/wayland/wayland.h: - wayland: Add new gst-wayland library containing a new GstWaylandVideo interface - This interface is needed to be able to embed waylandsink into - other wayland surfaces. Due to the special nature of wayland, - GstVideoOverlay is not enough for this job. - -2014-02-26 18:35:29 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - waylandsink: handle the list of supported formats properly - enum wl_shm_format is not a flags enum, as it may have been in the past, - so multiple formats cannot be stored in a bitfield. Use an array instead. - -2014-02-26 17:41:11 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/wlvideoformat.c: - waylandsink/wlvideoformat: add mappings for many common formats - -2014-02-26 16:20:41 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: unref the buffer pool - -2014-02-26 16:11:29 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/waylandpool.c: - * ext/wayland/waylandpool.h: - waylandsink/waylandpool: ref the display instead of the sink to avoid cyclic references - The reference to the sink is not really needed anyway in waylandpool, - what matters basically is that the display is active as long as the - pool is active, so we really want to reference the display object - instead of the sink. - -2014-02-26 14:56:21 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - waylandsink: make the display property useful - Let the display property control the name of the display, - like in x(v)imagesink. - -2014-02-14 17:20:42 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: access sink->pool in a more atomic fashion - -2014-02-14 16:33:10 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - waylandsink: remove the useless wayland_lock - -2014-02-13 13:28:40 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/waylandpool.c: - * ext/wayland/wldisplay.c: - * ext/wayland/wlvideoformat.c: - * ext/wayland/wlwindow.c: - waylandsink: apply the same debug category to all the subobjects - -2014-02-13 13:15:31 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/waylandpool.c: - * ext/wayland/waylandpool.h: - * ext/wayland/wldisplay.c: - * ext/wayland/wlvideoformat.c: - * ext/wayland/wlwindow.c: - waylandsink: cleanup header includes - -2014-02-13 11:59:45 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/Makefile.am: - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/wlwindow.c: - * ext/wayland/wlwindow.h: - waylandsink: split window-related code out to a new GstWlWindow class - GstWlWindow also has API ready to support subsurfaces. - -2014-02-13 11:32:00 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - waylandsink: remove callback and redraw_pending variables from the window structure - -2014-02-13 10:51:59 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/waylandpool.c: - waylandsink/waylandpool: improve debug message - -2014-02-13 10:37:01 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/waylandpool.c: - waylandsink/waylandpool: find the video format from the GstVideoInfo instead of accessing the sink - For the sake of isolation only. The format should be the same. - -2014-02-13 10:29:08 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - waylandsink/waylandpool: refactor code - * make use of GstBufferPool::start/stop functions to allocate/deallocate memory - * get rid of struct shm_pool and do all operations cleanly inside WaylandBufferPool - * store a GstVideoInfo during configuration instead of the width & height - and use the stride from the video info instead of hardcoding its value - -2014-02-13 10:02:54 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/Makefile.am: - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/wlvideoformat.c: - * ext/wayland/wlvideoformat.h: - waylandsink: split video format related functions out to a separate file - -2014-02-12 15:16:08 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/waylandpool.c: - waylandsink/waylandpool: move code around for better readability - -2014-02-12 14:41:52 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/waylandpool.c: - * ext/wayland/waylandpool.h: - waylandsink: move struct shm_pool and its related functions to waylandpool.c - And also make the instance of this struct to be owned by the buffer - pool instead of the element, for the sake of isolation - -2013-05-14 19:35:33 +0300 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/waylandpool.c: - waylandsink: Use XDG_RUNTIME_DIR instead of /tmp for the shm file - -2014-02-12 14:15:52 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/waylandpool.c: - * ext/wayland/waylandpool.h: - waylandsink: remove unused variables - -2014-02-12 11:28:40 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/Makefile.am: - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/waylandpool.c: - * ext/wayland/wldisplay.c: - * ext/wayland/wldisplay.h: - waylandsink: process display events in a separate thread - This also moves the display-related code into a new GstWlDisplay class, - which takes care of the new thread - -2014-02-04 16:32:31 +0100 George Kiagiadakis <george.kiagiadakis@collabora.com> - - * ext/wayland/gstwaylandsink.h: - * ext/wayland/waylandpool.h: - waylandsink: tidy up the header files - -2014-06-12 16:38:35 +0530 Sanjay NM <sanjay.nm@samsung.com> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmdec.h: - pnmdec: use GstVideoDecoder Class - https://bugzilla.gnome.org/show_bug.cgi?id=731400 - -2014-06-16 07:42:37 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Don't overwrite original seek value - In accurate mode, we'll be using start to fill in the seek segment, - therefore don't overwrite it with the shifted seek position. - https://bugzilla.gnome.org/show_bug.cgi?id=731698 - -2014-06-15 15:18:46 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: silence incorrect number of arguments in format warning - -2014-06-15 15:17:07 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldownload.c: - gldownload: plug a memory leak - -2014-06-15 13:59:07 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: wire up the alpha pad property - -2014-06-15 13:44:04 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglvideomixer.c: - glvideomixer: support input frame scaling - -2014-06-15 12:26:21 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - glvideomixer: add positioning of input streams - https://bugzilla.gnome.org/show_bug.cgi?id=729798 - -2014-06-15 12:24:38 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixer.h: - glmixer: allow the subclass to choose the sink pad type - Allows custom properties to be placed on the sink pads by subclasses - -2014-06-13 11:46:19 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: live: handle pcr/dts discrepancies some more - When wrapover/reset occur, we end up with a small window of time where - the PTS/DTS will still be using the previous/next time-range. - In order not to return bogus values, return GST_CLOCK_TIME_NONE if the - PTS/DTS value to convert differs by more than 15s against the last seen - PCR - https://bugzilla.gnome.org/show_bug.cgi?id=674536 - -2014-06-13 10:37:46 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Fix wraparound detection issue - Using 32bit unsigned values for corrected pcr/offset meant that we - potentially ended up in bogus values - Furthermore, refpcr - refpcroffset could end up being negative, which - PCRTIME_TO_GSTTIME() can't handle (and returned a massive positive value) - -2014-06-13 11:26:38 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - docs: add gsteglimagememory - -2014-06-13 09:55:42 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - docs: add glframebuffer object - -2014-06-13 09:52:01 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - docs: misc adds for gl functions - -2014-06-13 09:41:51 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - docs: add gluploadmeta object - -2014-06-13 09:32:56 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - docs: update for some gl function name changes - -2014-06-12 23:14:45 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglfilterapp.c: - * ext/gl/gstglfilterapp.h: - glfilterapp: actually emit the client-draw signal - -2014-06-12 23:13:11 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/gl/generic/cube/main.cpp: - * tests/examples/gl/generic/cubeyuv/main.cpp: - * tests/examples/gl/generic/doublecube/main.cpp: - * tests/examples/gl/generic/recordgraphic/main.cpp: - gl/examples: update for TEXTURE_2D change - -2014-05-30 16:52:09 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: implement proper seeking for h264 streams. - Co-Authored by: Thibault Saunier <tsaunier@gnome.org> - From a high level perspective, the new process for seeking h264 - streams is as follows: - 1) Rewind the stream until we find the first I-slice of a frame, - and mark its offset in the stream. - 2) Rewind the stream until we find SPS and PPS informations, - to make sure the subsequent parser is up to date. - 3) Accumulate optionnal SEI NAL units on the way. - 4) Push the SPS, PPS and SEI units before the new keyframe. - https://bugzilla.gnome.org/show_bug.cgi?id=675132 - -2014-06-12 10:14:27 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: do not try to close negative file descriptors - Interestingly, Coverity implies that close takes an unsigned - argument, while my close(2) man page shows it taking a signed - argument. I guess it may be platforms specific. - Coverity 1214602 - -2014-06-12 10:17:10 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/hls/m3u8.c: - hls: fix build with GLib 2.32 - Provide internal copy of g_list_copy_deep() until we - bump the GLib requirement. - https://bugzilla.gnome.org/show_bug.cgi?id=731555 - -2014-06-12 10:00:55 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/aiff/aiffparse.c: - aiffparse: bail out early when bytes per sample is not set - This should always be set for valid files when we get there, - and checking this avoids having ad hoc checks further down - in several places. - Coverity 1139698 - -2014-06-11 15:11:40 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: fix quantization matrix conversion routine names. - Fix routine names for zigzag/raster scan order conversion routines for - quantization matrices. This ought to use the gst_h264_quant_matrix_*() - naming convention instead of gst_h264_video_quant_matrix_*(), which - derived from the MPEG-2 function names. - https://bugzilla.gnome.org/show_bug.cgi?id=731524 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-05-26 18:29:21 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - * gst-libs/gst/codecparsers/gstmpeg4parser.h: - * gst-libs/gst/codecparsers/gstvp8parser.h: - codecparsers: add C++ guards for MPEG-4 and VP8 parsers. - Fix MPEG-4 and VP8 APIs to export their external symbols as pure C - symbols, i.e. un-mangled for C++. - https://bugzilla.gnome.org/show_bug.cgi?id=731522 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-06-12 14:58:47 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixer.h: - glmixer: send the stream-start event - and the caps event after. - https://bugzilla.gnome.org/show_bug.cgi?id=730944 - -2014-06-12 13:37:51 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/gl/generic/cube/Makefile.am: - * tests/examples/gl/generic/cubeyuv/Makefile.am: - * tests/examples/gl/generic/doublecube/Makefile.am: - * tests/examples/gl/generic/recordgraphic/Makefile.am: - * tests/examples/gl/sdl/Makefile.am: - gl/examples: add GST_PLUGINS_BASE_CFLAGS - -2014-06-12 13:15:10 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/gl/generic/doublecube/main.cpp: - gl/examples: remove spurious include for doublecube example - -2014-06-12 13:06:31 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/gl/clutter/Makefile.am: - * tests/examples/gl/cocoa/Makefile.am: - * tests/examples/gl/generic/cube/Makefile.am: - * tests/examples/gl/generic/cubeyuv/Makefile.am: - * tests/examples/gl/generic/doublecube/Makefile.am: - * tests/examples/gl/generic/recordgraphic/Makefile.am: - * tests/examples/gl/gtk/Makefile.am: - * tests/examples/gl/gtk/filtervideooverlay/Makefile.am: - * tests/examples/gl/gtk/fxtest/Makefile.am: - * tests/examples/gl/gtk/gtkvideooverlay/Makefile.am: - * tests/examples/gl/gtk/switchvideooverlay/Makefile.am: - * tests/examples/gl/sdl/Makefile.am: - gl/examples: add the srcdir and builddir includes - And remove references to $(GST_PLUGINS_GL_*) - -2014-06-12 12:49:42 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglfilterapp.c: - * ext/gl/gstglfilterapp.h: - * gst-libs/gst/gl/gstglutils.h: - * tests/examples/gl/generic/recordgraphic/main.cpp: - glfilterapp: remove the reshape/draw properties - The reshape property was never used. - Replace the draw property with a signal. - Based on patch by Mathieu Duponchelle <mathieu.duponchelle@epitech.eu> - https://bugzilla.gnome.org/show_bug.cgi?id=704507 - -2014-06-12 12:14:35 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - glmixer: lock the size of mix->frames to the number of pads - Fixes a segfault with decodebin ! glmixer where the request pads on - both sides were being requested after the state change to PAUSED. - Also fixes dynamically adding and removing pads while glmixer is - in a state >= PAUSED. - -2014-06-12 12:09:56 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/gl/generic/cube/main.cpp: - * tests/examples/gl/generic/cubeyuv/main.cpp: - * tests/examples/gl/generic/doublecube/main.cpp: - * tests/examples/gl/qt/mousevideooverlay/pipeline.cpp: - * tests/examples/gl/qt/mousevideooverlay/pipeline.h: - * tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.h: - gl/examples: Port to using signals instead of properties - Based on patch by Mathieu Duponchelle <mathieu.duponchelle@epitech.eu> - https://bugzilla.gnome.org/show_bug.cgi?id=704507 - -2014-06-01 15:02:52 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: replace pointer properties with signals - Based on patch by Mathieu Duponchelle <mathieu.duponchelle@epitech.eu> - https://bugzilla.gnome.org/show_bug.cgi?id=704507 - -2014-06-11 09:38:00 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Use first group for handling reference pcr - If _set_current_pcr_offset gets called after a flushing seek, we ended - up using the current group for delta calculation ... whereas we should - be using the first group to calculate shifts. - Also add an early exit if there are no changes to apply - -2014-06-10 14:50:10 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Remove unused variable - The seeksegment was no longer used since the switch to calculating segments - when we see data. - -2014-06-10 14:27:53 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Fix debug statement - -2014-06-10 14:27:01 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Fix duration evaluation in push mode - When working in push mode, we need to be able to evaluate the duration - based on a single group of observations. - To do that we use the current group values - -2014-06-02 11:07:01 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Handle early PTS conversion - When handling the PTS/DTS conversion in new groups, there's a possibility - that the PTS might be smaller than the first PCR value observed, due to - re-ordering. - When using the current group, only apply the wraparound correction when we - are certain it is one (i.e. differs by more than a second) and not when it's - just a small difference (like out-of-order PTS). - https://bugzilla.gnome.org/show_bug.cgi?id=731088 - -2014-06-09 10:10:01 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/gdp/dataprotocol.c: - gdp: don't print already-freed string - CID 1221987 - -2014-06-09 10:56:48 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/speed/gstspeed.c: - speed: Fix position query some more - Forgot to remove code in 16fd917632c0992349ca28cf9108e9562c493ad7 - CID #1139677 - -2014-06-07 07:13:59 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsdemux: Fix sticky event handling - When we receive sticky events from upstream, always return TRUE. - Fixes the issue where we receive custom sticky events (such as "uri") - and no pads are created yet. - -2014-06-04 18:34:44 +0100 Damian Ziobro <damian@xmementoit.com> - - * ext/hls/m3u8.c: - hlsdemux: Improve parsing quoted key URIs and apply it for I-frame-based stream URI - https://bugzilla.gnome.org/show_bug.cgi?id=730830 - -2014-06-06 13:08:04 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: Don't store the current key in the playlist - It's per fragment and applying to all following fragments - until the next key is specified. - -2014-06-06 13:04:04 +0300 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Fix compiler warnings - -2014-05-30 16:34:18 -0600 Thomas Bluemel <tbluemel@control4.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: Reload the variant playlist if refreshing a playlist or downloading a fragment fails - This can happen if the playlists have moved due to the variant playlist - now being redirected to another target. This currently only works as long - as the referenced playlists don't change in relation to the variant - playlist, and the new location is purely due to a new path triggered by a - new redirection target of the variant playlist, or a new redirection - target of the playlist itself. - https://bugzilla.gnome.org/show_bug.cgi?id=731164 - -2014-06-05 16:45:12 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/schroedinger/gstschroenc.c: - schroenc: Use an arbitrary framerate if none if given - The schro encoder always requires a framerate, but some source material, - such as RTP doesn't have a fixed one, so just fake it. - https://bugzilla.gnome.org/show_bug.cgi?id=729054 - -2014-06-04 14:35:51 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: drop redundant assignment - -2014-06-04 01:02:20 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: improve timeout handing at locking loop - New approach attempts to be more accurate by measuring - the elapsed time by iteration. Also: - * Use a 10 seconds default timeout and a half a second - polling step. New values should better match the tuning - process on real-life scenarios. - * Correct elapsed_time computation. - * Add _retry_ioctl() to avoid bailing out on temporary - ioctl EINTR failures (no need to check for EAGAIN cause - we are opening the frontend on blocking mode) - * Small corrections to fail condition handling - -2014-06-05 18:43:30 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gl/wayland: create a dummy display instead of an EGLDisplay - Currently, GstGLWindowWaylandEGL holds the wayland display connection - If we create the EGLDisplay at the GstDisplay creation time, then - libEGL will internally open another connection to the wayland server. - These two display connections are unable to communicate resulting in - no window output/display and hangs inside libEGL. - Eventually we will move the wl_display from GstGLWindow to GstGLDisplay. - -2014-06-05 09:40:38 +0200 Edward Hervey <bilboed@bilboed.com> - - * ext/rtmp/gstrtmp.c: - rtmp: proxy logging from librtmp - Helps with debugging various librtmp issues - -2014-06-05 08:29:50 +0200 Edward Hervey <bilboed@bilboed.com> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: Fix position querying - It's the position we're querying, not the duration :) - -2014-06-04 21:39:48 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Remove extraneous extra parameter from check_pending_buffers function - -2014-06-04 21:31:21 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketiser: Always initialise packet AFC flags and PCR fields - Also fix a slight typo in a comment about the smoothing algorithm - -2014-05-23 15:07:19 +1000 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Reset pending_ts on a discont, to re-measure initial timestamps - Since all the other timestamp tracking now gets reset on a discont, - it makes sense to wait for a PCR and timestamp buffers like when - playback first starts - -2014-03-21 22:16:41 -0700 Aleix Conchillo Flaqué <aleix@oblong.com> - - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpdec.h: - * ext/srtp/gstsrtpenc.c: - * ext/srtp/gstsrtpenc.h: - srtp: add support for rollover counters and replay protection window size - We add a new signal, get-rollover-counter, to the SRTP encoder. Given a - ssrc the signal will return the currently internal SRTP rollover counter - for the given stream. - For the SRTP decoder we have a new SRTP caps parameter "roc" that needs - to be set when a new SRTP stream is created for a given SSRC. - https://bugzilla.gnome.org/show_bug.cgi?id=726861 - -2013-10-14 16:14:42 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * gst/liveadder/liveadder.c: - liveadder: handle gap buffer flag - Remove GAP flag unless both sides have gap data, ignore - incoming data if it is gap data. - https://bugzilla.gnome.org/show_bug.cgi?id=722397 - -2014-05-25 21:43:22 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/gl/gstglimagesink.c: - glimagesink: improve state change debug message - -2014-06-03 13:59:51 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: always release the previous buffer - Fixes the case where _perform_with_buffer() is called without - intervening calls to _release_buffer() as is the case on start up - with glimagesink. - Also release the buffer when reseting the upload. - https://bugzilla.gnome.org/show_bug.cgi?id=731107 - -2014-06-02 21:51:38 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/shm.c: - tests: Take account of memory alignment in shm test - -2014-06-02 21:43:56 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/gdp/dataprotocol.c: - gdp: Fail gracefully if event can't be parsed - https://bugzilla.gnome.org/show_bug.cgi?id=731093 - -2014-06-02 21:43:34 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/gstshmsink.c: - shmsink: Allocate enough memory to do alignment - https://bugzilla.gnome.org/show_bug.cgi?id=731093 - -2014-06-02 12:39:49 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Actually print the stacktrace into the error string - -2014-06-02 11:28:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Clear the exception before trying to call Java methods to convert it to a string - -2014-06-02 11:16:32 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Fix crashes when loading the plugin in a standalone application on Android >= 4.4 - Check if libnativehelper is loaded in the process and if - it has these awful wrappers for JNI_CreateJavaVM and - JNI_GetCreatedJavaVMs that crash the app if you don't - create a JniInvocation instance first. If it isn't we - just fail here and don't initialize anything. - See this code for reference: - https://android.googlesource.com/platform/libnativehelper/+/master/JniInvocation.cpp - -2014-06-02 10:11:58 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/speed/gstspeed.c: - speed: make position query able to convert bytes to time - (same as 744c58d71b21475d2edd5b9334e277cfa4c53260 but for the - position query) - It was only querying in time, but then trying to use dead bytes - to time conversion code. - Coverity 1139677 - -2014-06-02 09:42:33 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: avoid crashing in pathological case - (Identical to commit 612cdeec80da95b12f9fad928419c7de2be20d68 which - was for resindvd) - When we'd see an unknown stream type, then a SDDS stream. - Then we'd get to the end of the switch with a NULL temp stream - pointer, and dereference it. - Coverity 1139708 - -2014-06-02 09:23:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: Handle (unlikely) NULL return of gl->GetString (GL_VERSION) more gracefully - CID 1219858 - -2014-06-02 08:22:15 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - mpegts: Remove unneeded NULL check - Allocating those structures is done in all code paths leading there - CID #1219860 - CID #1219861 - CID #1219862 - CID #1219863 - CID #1219864 - -2014-06-01 10:43:49 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/mpeg2enc/gstmpeg2encoptions.cc: - mpeg2enc: increase max. allowed value for bitrate property - For DVD the limit is around 10Mbit/s, but for e.g. ATSC - it could be much higher. - -2014-05-25 13:05:49 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: better error handling in case tsparse is missing - https://bugzilla.gnome.org/show_bug.cgi?id=730641 - -2014-05-30 17:35:49 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: add prop setup code for guint64 - Needed since we are now proxying tuning-timeout - from dvbsrc. - -2014-05-20 07:34:56 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/MotionCells.cpp: - * ext/opencv/gstmotioncells.c: - motioncells: improve logging - https://bugzilla.gnome.org/show_bug.cgi?id=730141 - -2014-05-20 07:29:16 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/MotionCells.cpp: - motioncells: make framedrop work at 30 fps too - https://bugzilla.gnome.org/show_bug.cgi?id=730141 - -2014-05-20 07:25:20 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/gstmotioncells.c: - * ext/opencv/motioncells_wrapper.cpp: - motioncells: use standard macro for boolean - https://bugzilla.gnome.org/show_bug.cgi?id=730141 - -2014-05-20 07:18:39 +0200 Nicola Murino <nicola.murino@gmail.com> - - * configure.ac: - opencv: make the plugin compile with all 2.4.x versions - https://bugzilla.gnome.org/show_bug.cgi?id=730141 - -2014-05-26 22:34:01 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - * sys/dvb/camconditionalaccess.c: - * sys/dvb/camdevice.c: - * sys/dvb/camswclient.c: - dvb/cam*: use g_strerror and other few nits - -2014-05-30 11:00:06 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: fix dvbsrc signal proxying - https://bugzilla.gnome.org/show_bug.cgi?id=641204 - -2014-05-30 00:49:49 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: proxy new props/signals from dvbsrc - Proxy tuning start/done/fail signals and tuning-timeout - property. - https://bugzilla.gnome.org/show_bug.cgi?id=641204 - -2014-05-01 18:25:05 -0400 Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com> - - dvbsrc: smarten up tuning logic - * Drop remaining sleep() logic in favor of polling - * Use best guess delivery system if none is set - * Make tuning/locking timeout configurable - * Add signals for tuning start, done and fail - * Drop gst_dvbsrc_frontend_status(). It was used only - for signal LOCK checking. This is now part of the - tuning/locking loop - * Break up frontend configuration and tuning - on separate functions - Plus: - * Add some more useful DEBUG/TRACE messages - * Move over misplaced DVB API message - * Fix wrong comment for default DVB buffer size (http://linuxtv.org/downloads/v4l-dvb-apis/dmx_fcalls.html#DMX_SET_BUFFER_SIZE) - This patch builds up on previous work done by - Fabrizio (Misto) Milo <mistobaan@gmail.com> - https://bugzilla.gnome.org/show_bug.cgi?id=641204 - -2014-05-30 16:35:30 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - androidmedia: Add exceptions from the Java API to error messages, and post more error/warning messages overall - -2014-05-30 15:24:48 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - androidmedia: Add a GError argument to all amc methods and catch exceptions there - -2014-05-30 15:24:15 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Describe exceptions happening when scanning all codecs - -2014-05-30 12:19:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - androidmedia: Add API to convert an exception into a string - -2014-05-30 12:40:08 +0200 Jorge Zapata <jorgeluis.zapata@gmail.com> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - Release the codec before freeing it - On Samsung Galaxy S4 it is impossible to have more than one - hardware decoder at the same time. If we do not release it - explicitly the GC only releases it whenever the whole application - is finished not whenever the activity is finished and thus a player - will not be able to work correctly - -2014-05-30 02:10:25 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: fix structure handling in preview message - Avoid trying to modify the message structure as it isn't mutable. - Use a copy and post a new message if necessary. - Fixes failing tests. - -2014-05-30 12:23:09 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: remove uneeded gl api ifdefs - -2014-05-30 11:51:01 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - glwindow_x11: allow expose events to redraw our window - otherwise we will not update the window contents on low framerate - streams until the next buffer - https://bugzilla.gnome.org/show_bug.cgi?id=723529 - -2014-05-30 11:46:00 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - glimagesink: unref the old buffer outside the lock - it could very well deadlock - https://bugzilla.gnome.org/show_bug.cgi?id=723529 - -2014-05-30 11:35:04 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - Revert "880/906 glimagesink: remove unused stored_buffer field" - This reverts commit af3a68db7dc473fb6903c18966b39e4c3f1464d7. - Conflicts: - ext/gl/gstglimagesink.c - https://bugzilla.gnome.org/show_bug.cgi?id=723529 - -2014-05-30 10:46:25 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: fix up assertion - error: 'return' with no value, in function returning non-void - -2014-05-30 10:27:14 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/effects/gstgleffectidentity.c: - * ext/gl/effects/gstgleffectmirror.c: - * ext/gl/effects/gstgleffectsqueeze.c: - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/glprototypes/base.h: - * gst-libs/gst/gl/glprototypes/blending.h: - * gst-libs/gst/gl/glprototypes/eglimage.h: - * gst-libs/gst/gl/glprototypes/fbo.h: - * gst-libs/gst/gl/glprototypes/fixedfunction.h: - * gst-libs/gst/gl/glprototypes/gles.h: - * gst-libs/gst/gl/glprototypes/opengl.h: - * gst-libs/gst/gl/glprototypes/shaders.h: - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglfeature.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstgluploadmeta.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglwindow.c: - glfeature: remove GST_GL_API_GLES3 - instead check the gl version using gst_gl_context_check_gl_version() - -2014-05-30 10:25:18 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: check for GLES versions - -2014-05-29 20:35:48 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - gl/context: add check_gl_version - -2014-05-29 17:09:26 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: Try GLX support before EGL support - If available, glx has got a better chance of being the Gl platform - we want to use compared to EGL - -2014-05-29 16:59:28 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglcontext.c: - glcontext: Try to open lib{EGL|GL|GLESv2}.so.1 before lib{EGL|GL|GLESv2} - Fixes issues with .so (without numbering) being installed for development - (such as from mesa-dev) but actual driver (with numbering) coming from - some other place (like nvidia drivers) - -2014-05-29 16:01:22 +0200 Christian Fredrik Kalager Schaller <uraeus@linuxrising.org> - - * gst-plugins-bad.spec.in: - Update spec file with latest changes - -2014-05-29 12:30:13 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-atsc-section.h: - atsc-section: Fix annotation - -2014-05-29 12:29:52 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - dvb-descriptor: Fix multilingual service name parsing - the provider and service name was inverted - -2014-05-28 16:47:53 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * tests/examples/mpegts/ts-parser.c: - example: ts-parser: add parential rating descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=730854 - -2014-05-28 16:47:28 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * tests/examples/mpegts/ts-parser.c: - example: ts-parser: add ca iddentifier descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=730854 - -2014-05-28 12:23:50 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * tests/examples/mpegts/ts-parser.c: - example: ts-parser: add stream identifier descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=730854 - -2014-05-28 12:23:12 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * tests/examples/mpegts/ts-parser.c: - example: ts-parser: add content descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=730854 - -2014-05-28 12:19:43 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * tests/examples/mpegts/ts-parser.c: - example: ts-parser: add component descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=730854 - -2014-05-29 11:55:51 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/examples/mpegts/ts-parser.c: - examples: factor dumping code - We can just re-use the new function instead of having two duplicates - -2014-05-29 10:50:58 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * tests/examples/mpegts/ts-parser.c: - example: ts-parser: add linkage descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=730901 - -2014-05-28 20:42:05 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: bugfix mobile hand over linkage parse missmatch - https://bugzilla.gnome.org/show_bug.cgi?id=730901 - -2014-05-28 16:34:08 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-atsc-section.h: - * tests/examples/mpegts/ts-parser.c: - mpegts: atsc: add missing field to ETT table - Set the subtable_extension as ett_table_id_extension - for ETT tables as it is used by it - https://bugzilla.gnome.org/show_bug.cgi?id=730435 - -2014-05-28 15:59:23 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * tests/examples/mpegts/ts-parser.c: - mpegts: atsc: add atsc's EIT table parsing - ATSC has its own version of the EIT table (DVB also has one). - This patch adds parsing for the ATSC EIT table and also fixed - the section identification to mark it as the ATSC one. - The implementation aws refactored to reuse some common internal - structures from ETT. - Also adds its dumping function to ts-parser example - https://bugzilla.gnome.org/show_bug.cgi?id=730435 - -2014-05-22 17:49:39 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/check/libs/mpegts.c: - tests: mpegts: add test for STT parsing - Specially for the time to UTC datetime conversion - Example taken from the A65 spec - https://bugzilla.gnome.org/show_bug.cgi?id=730435 - -2014-05-22 01:47:48 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * tests/examples/mpegts/ts-parser.c: - mpegts: atsc: add STT table parsing - Adds the system time table structure and functions for convenient parsing of - it and for getting the UTC datetime that it represents. Also adds its - information dumping to the ts-parser example - https://bugzilla.gnome.org/show_bug.cgi?id=730435 - -2014-05-19 16:20:44 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - mpegts: atsc: add encoding conversion for UTF-16 ETT strings - https://bugzilla.gnome.org/show_bug.cgi?id=730435 - -2014-05-19 14:50:13 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/examples/mpegts/ts-parser.c: - examples: mpegts: add function to dump ETT tables - https://bugzilla.gnome.org/show_bug.cgi?id=730435 - -2014-05-19 13:46:03 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - mpegts: atsc: add ETT structures and parsing - ETT (extended text table) contains ATSC text information with descriptions - of virtual channels and events. The text can be internationalized and also - compressed. - https://bugzilla.gnome.org/show_bug.cgi?id=730435 - -2014-05-16 15:39:48 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/mpegtsdemux/mpegtsbase.c: - tsbase: parse the mgt and add listed EIT/ETT pids to the known psi - This will make tsbase also parse the EITs and ETTs from ATSC streams that have - their pids reported on the MGT and post to the bus - https://bugzilla.gnome.org/show_bug.cgi?id=730435 - -2014-05-15 12:31:05 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * tests/examples/mpegts/ts-parser.c: - mpegts: add atsc MGT section parsing - Add a parsing function for MGT and also detect the EIT tables - for ATSC, the EIT pids are reported inside the MGT and we are still - only relying only on the table id for detecting it. In the future we - would want to also check the pid and compare with whatever the MGT - previously reported to confirm that it is indeed the EIT. - https://bugzilla.gnome.org/show_bug.cgi?id=730435 - -2014-05-23 01:41:18 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - mpegts: atsc: rename TVCT to VCT as it is the same as CVCT - Make the ATSC section parse handle both TVCT and CVCT as they are - nearly the same struct (CVCT uses 2 reserved bits that are ignored - in TVCT). - This is changing the glib type and the struct name but TVCT wasn't - released in a stable package yet so there should be no problem. - Also includes some parsing fixes and changes short_name to be - directly stored as utf8 rather than utf16 - https://bugzilla.gnome.org/show_bug.cgi?id=730642 - -2014-05-28 13:11:05 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/examples/mpegts/ts-parser.c: - examples: ts-parser: add TVCT and CVCT tables dumping - https://bugzilla.gnome.org/show_bug.cgi?id=730642 - -2014-05-29 10:37:02 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Fix assertion after API changes - -2014-05-29 18:33:10 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/colorconvert: keep our private pointer - again, avoid to much trigger - -2014-05-29 18:32:48 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/check/libs/gstglupload.c: - tests: update for glupload changes - -2014-05-29 17:29:41 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - gl/colorconvert: use GstObject's lock instead of our own - -2014-05-29 17:12:03 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/colorconvert: remove unnecassary pointer inderection - -2014-05-29 16:45:37 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload: re add the upload meta to the private struct - try and avoid being to trigger happy - -2014-05-29 16:29:09 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload: small code cleanup and gst-indent - -2014-05-29 16:22:52 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - gl/download: use GstObject's lock instead of out own - -2014-05-29 16:20:30 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - gl/upload: use GstObject's lock instead of our own - -2014-05-29 16:18:08 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - gl/filter: also remove the width/height in transform_caps - allows scaling in the filters - -2014-05-29 16:11:20 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/colorconvert: optimise the same format case - simply return the input buffer unchanged - -2014-05-29 16:07:40 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/colorconvert: fix YUY2/UYVY download for RG/LA textures - -2014-05-29 15:50:56 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - gl/colorconvert: allocate output buffers - Allows the nop optimisation by simply reffing the input buffer. - -2014-05-28 16:18:13 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/examples/mpegts/ts-parser.c: - examples: Avoid shadowing main loop variable - We end up with interesting results otherwise :) - -2014-05-28 15:53:21 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/examples/mpegts/ts-parser.c: - examples: Add support for private-data-specifier and frequency-list - -2014-05-28 15:52:49 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: Make some fields optional - Some people might just not care about the contents - -2014-05-28 15:52:03 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: Update docs for DVB frequency list - -2014-05-28 23:21:07 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/check/libs/gstglupload.c: - tests: update for recent glupload changes - GstGLUploadMeta object is now the GstVideoGLTextureUploadMeta - provider. - -2014-05-28 12:56:24 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: Always use the redirect target to resolve relative URIs - But redownload the playlists from the original URI if it's not - a permanent redirect. - -2014-05-28 12:43:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: Always use the redirect target to resolve relative URIs - But redownload the playlists from the original URI if it's not - a permanent redirect. - -2014-05-28 12:44:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Don't set base URI if there was no redirect - -2014-05-28 09:18:49 +0100 Damian Ziobro <damian@xmementoit.com> - - * ext/hls/m3u8.c: - hlsdemux: Make parsing of "-quoted key URIs more resilient - https://bugzilla.gnome.org/show_bug.cgi?id=730830 - -2014-05-28 10:19:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: Always use the redirect target to resolve relative URIs - But redownload the playlists from the original URI if it's not - a permanent redirect. - -2014-05-28 09:42:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gstfragment.c: - * gst-libs/gst/uridownloader/gstfragment.h: - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Store URI and redirect target in the downloaded fragments - -2014-05-28 07:40:19 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegts: Fix Logical Channel Descriptor parsing - No wonder we were getting garbage ... - -2014-05-27 20:37:26 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * tests/examples/mpegts/ts-parser.c: - example: ts-parser: add terrestrial delivery system descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=730847 - -2014-05-27 20:32:42 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * tests/examples/mpegts/ts-parser.c: - example: ts-parser: printing enum types - https://bugzilla.gnome.org/show_bug.cgi?id=730847 - -2014-05-28 14:43:43 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.h: - gl/upload: fix incorrect type in macros - -2014-05-28 14:40:10 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * gst-libs/gst/gl/gstgluploadmeta.c: - * gst-libs/gst/gl/gstgluploadmeta.h: - gl/upload: add GstGLUploadMeta object - That simply deals with the provider aspect of GstVideoGLTextureUploadMeta. - -2014-05-27 17:34:05 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/examples/mpegts/ts-parser.c: - examples: Add DVB Extended event parsing - -2014-05-27 17:32:52 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: Ensure NULL-terminated language code - Yup, it breaks API and ABI, I know. But let's avoid people and bindings - printing out garbage - -2014-05-27 17:25:25 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: Fix Extended DVB descriptor parsing - We were over-reading data, and the nb_items field isn't needed, - it's a property of the GPtrArray - -2014-05-28 00:56:05 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - gl/win32: make send_message reentrant - I could not find a comparable win32API function so keep the running - thread pointer to compare against. - https://bugzilla.gnome.org/show_bug.cgi?id=730782 - -2014-05-27 16:17:39 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: Fix usage of memcpy - source and destination were inverted - -2014-05-26 20:38:45 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * tests/examples/mpegts/ts-parser.c: - examples: Add support for DVB multilingual component descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=728429 - -2014-05-26 20:38:19 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * tests/examples/mpegts/ts-parser.c: - examples: Add support for DVB multilingual service name descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=728429 - -2014-05-26 20:37:53 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * tests/examples/mpegts/ts-parser.c: - examples: Add support for DVB multilingual bouquet name descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=728429 - -2014-05-26 20:37:21 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * tests/examples/mpegts/ts-parser.c: - examples: Add support for DVB multilingual network name descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=728429 - -2014-04-17 18:20:39 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add multilingual component descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=728429 - -2014-04-17 18:20:03 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add multilingual service name descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=728429 - -2014-04-17 18:10:51 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add multilingual bouquet name descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=728429 - -2014-04-17 18:07:52 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add multilingual network name descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=728429 - -2014-05-27 10:21:45 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: add/remove pads to flowcombiner differently due to streaming nature - Due to mpegts streaming nature some pads are created but are only added - later to the element. This can cause a scenario where the first stream - doesn't have an available decoder (while the next ones still pending - would have) and tsdemux will fail with not-linked as the first stream - added wouldn't be linked. - To avoid this tsdemux needs to add pads to the flowcombiner - when they are created instead of only when adding them to the - element. - -2014-05-27 13:56:34 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: fix compiler warning - gstglcolorconvert.c:1133:11: error: 'j' may be used uninitialized in this function - Was used uninitialized when jumping to out label - in error case. - -2014-05-27 18:20:29 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglupload.c: - gl/colorconvert: operate on buffers instead of memories - -2014-05-27 07:42:14 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - mxfdemux: remove unread last_flow variable - it isn't necessary anymore and is already unused - -2014-05-27 11:28:27 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - glimagesink: make it actually honor show-preroll-frame property - https://bugzilla.gnome.org/show_bug.cgi?id=730802 - -2014-05-27 12:08:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Compare positions to find the earliest pad, not flow returns - -2014-05-27 08:54:20 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglcontext.h: - gl: add missing cgl and eagl context type - https://bugzilla.gnome.org/show_bug.cgi?id=729245 - -2014-05-27 08:46:16 +0100 Julien Isorce <julien.isorce@gmail.com> - - * configure.ac: - * gst-libs/gst/gl/gstglcontext.c: - * tests/examples/gl/qt/qglwtextureshare/glcontextid.h: - * tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp: - gl: rename platform cocoa to cgl - Before: - GST_GL_PLATFORM=cocoa GST_GL_WINDOW=cocoa - gst-launch-1.0 videotestsrc ! glimagesink - After: - GST_GL_PLATFORM=cgl GST_GL_WINDOW=cocoa - gst-launch-1.0 videotestsrc ! glimagesink - but still pass --enable-cocoa to configure script - because currently it can only be used with cocoa API. - We could later have cgl/gstglcontext_cgl.h that manages - a CGLContextObj directly and cocoa/gstglcontext_cocoa.h - would just wrap it. - So that it could be used with other Apple's window APIs. - https://bugzilla.gnome.org/show_bug.cgi?id=729245 - -2014-05-27 08:51:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - Revert "androidmedia: Place some const keywords in a few places" - This reverts commit 3078b3a34c1f75b86bd629df1cd7c089a0f69999. - gst_video_frame_map() doesn't take a const GstVideoInfo*, so - all this is rather useless. - -2014-05-27 13:55:15 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - gl/mixer: don't segfault when we don't have a buffer - https://bugzilla.gnome.org/show_bug.cgi?id=729257 - -2014-05-27 13:04:39 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl/window_x11: avoid BadDrawable error on shutdown - -2014-05-26 17:34:40 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - mxfdemux: use GstFlowCombiner - Removes flow return combination code to use the newly added GstFlowCombiner - https://bugzilla.gnome.org/show_bug.cgi?id=709224 - -2014-05-26 17:18:01 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegdemux: use GstFlowCombiner - Removes flow return combination code to use the newly added GstFlowCombiner - https://bugzilla.gnome.org/show_bug.cgi?id=709224 - -2014-05-23 18:26:57 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: use GstFlowCombiner - Removes flow return combination code to use the newly added GstFlowCombiner - -2014-05-27 10:47:25 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - gl/context_egl: pass the vars in the right order to DestroySurface - https://bugzilla.gnome.org/show_bug.cgi?id=728514 - -2014-05-26 16:31:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - androidmedia: Place some const keywords in a few places - -2013-11-13 18:41:33 +0800 Chen Jie <chenj@lemote.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideodec.h: - * sys/androidmedia/gstamcvideoenc.c: - * sys/androidmedia/gstamcvideoenc.h: - androidmedia: add gst_amc_color_format_copy - gst_amc_color_format_copy will copy in/out a frame resides at a - GstAmcBuffer. Lots of codes in gst_amc_video_*_fill_buffer are moved to - this new function. - -2013-10-08 21:11:48 +0800 Chen Jie <chenj@lemote.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideoenc.c: - androidmedia: move create_src|sink_caps to gstamc.c - Some hack logic needs also to be present in create_src|sink_caps, for - working around some broken codecs. These hacks are hidden - in color_format/video_format conversion -- the prototypes of these - functions are also changed to include more args for hack judgement. - Also in case of multi-color_formats mapped to one video_format, then - map that video_format back will not give the original color_format, which - causes gst_amc_codec_configure failed with something like - 'does not support color format N'. - The new prototype involves with GstAmcCodecInfo and mime, which - ensures the converted color_format is supported by the codec. - A COLOR_FormatYCbYCr to GST_VIDEO_FORMAT_YUY2 mapping is also added, in - order to work around bugs in OMX.k3.video.decoder.avc(which incorrectly - reports supporting COLOR_FormatYCbYCr, which is actually - COLOR_FormatYUV420SemiPlanar). There are already hacks for this in - gst_amc_video_format_to_color_format, gst_amc_color_format_to_video_format - and gst_amc_color_format_info_set, but the codec will still not work(be - ignored because of "has unknown color formats") without adding this mapping. - -2014-04-11 15:14:17 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * sys/dvb/parsechannels.c: - dvb: parsechannels: add delsys property - Signed-off-by: Stefan Ringel <linuxtv@stefanringel.de> - https://bugzilla.gnome.org/show_bug.cgi?id=709414 - -2014-05-26 13:29:53 +0200 Edward Hervey <bilboed@bilboed.com> - - * win32/common/libgstcodecparsers.def: - win32: update .def for new symbols - -2014-04-11 15:38:16 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: map SYS_DVBC_ANNEX_A SYS_DVBC_ANNEX_AC for DVB API < 5.6 - https://bugzilla.gnome.org/show_bug.cgi?id=721869 - -2014-04-15 09:31:02 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix typo in testing flag - % instead of & - https://bugzilla.gnome.org/show_bug.cgi?id=721869 - -2014-05-25 15:16:13 +0800 Chen Jie <chenj@lemote.com> - - * sys/androidmedia/gstamcvideoenc.c: - amcvideoenc: Unit of bitrate property is now bit/sec - https://bugzilla.gnome.org/show_bug.cgi?id=705129 - -2014-05-26 11:55:31 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/examples/mpegts/ts-parser.c: - examples: Add support for DVB Bouquet Name parsing - -2014-05-26 11:54:50 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: Fix Bouquet Name parsing - the field is not length prefixed - -2014-05-26 11:42:46 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/examples/mpegts/ts-parser.c: - examples: Add support for DVB Service List descriptor - -2014-04-17 14:56:23 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add bouquet name descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=728364 - -2014-04-17 14:55:29 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add stuffing descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=728364 - -2014-04-17 14:54:28 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add service list descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=728364 - -2014-05-10 18:32:28 +0200 Miguel París Díaz <mparisdiaz@gmail.com> - - * ext/opus/gstopusenc.c: - opusenc: Use aux vars to minimize critical region - This avoid dead lock between gst_audio_encoder_finish_frame() and - gst_opus_enc_get_property(). - Also, now bytes var is set into protected section. - https://bugzilla.gnome.org/show_bug.cgi?id=729882 - -2014-05-24 19:51:12 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Add missing tone ioctl - https://bugzilla.gnome.org/show_bug.cgi?id=730692 - -2014-05-25 09:03:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: Remove format information to allow color convert again - We also need to remove the format information, as glfilter can do - color convertion. This code was imported from videoconvert. - https://bugzilla.gnome.org/show_bug.cgi?id=729861 - -2014-05-25 11:44:57 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - gl/memory: allocate the correct memory size - and avoid wasting resources we will never need - https://bugzilla.gnome.org/show_bug.cgi?id=730703 - -2014-05-23 23:02:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: Fix YUY2 and UYVY support with luminance_alpha - https://bugzilla.gnome.org/show_bug.cgi?id=730666 - -2013-12-03 12:09:58 +0100 Jorge Zapata <jorgeluis.zapata@gmail.com> - - * sys/androidmedia/gstamc-constants.h: - * sys/androidmedia/gstamc.c: - androidmedia: Add a new QCOM color format - It is a NV12 based, aligned to 32 bytes - https://bugzilla.gnome.org/show_bug.cgi?id=730635 - -2014-05-23 15:00:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamc.c: - androidmedia: First try to get symbols from the current program, then load libdvm - If the application is using the new ART runtime it will otherwise - load dalvik and start a dalvik VM next to the ART VM. - Does not work very well obviously. - -2013-04-01 07:49:01 +0000 Chen Jie <chenj@lemote.com> - - * sys/androidmedia/Makefile.am: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcvideoenc.c: - * sys/androidmedia/gstamcvideoenc.h: - androidmedia: add support for video encoding - https://bugzilla.gnome.org/show_bug.cgi?id=705129 - -2014-05-23 12:07:50 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - gl/memory: provide compatability defines - fixes build on android/OS X - -2014-05-23 11:01:06 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/colorconvert: remove scratch texture for YUY2/UYVY - We can get all our data from the one RG/LA texture with some shader magic. - https://bugzilla.gnome.org/show_bug.cgi?id=728890 - -2014-05-23 10:59:05 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - gl/memory: RGBA/UNSIGNED_BYTE only format supported by ReadPixels GLES2 - Error out in case we attempt to read with any other invalid format. - -2014-05-23 10:57:24 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - gl/memory: generate textures with a sized internal format - Required in order to generate RG and RED textured with GLES3. - -2014-05-21 21:47:45 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglupload.c: - gl/memory: implement GL_EXT_texture_rg support - Which is used by default over the Luminance formats due to it - being color renderable with fbos (and deprecation/removal with - GL 3.x). - https://bugzilla.gnome.org/show_bug.cgi?id=729750 - https://bugzilla.gnome.org/show_bug.cgi?id=704222 - https://bugzilla.gnome.org/show_bug.cgi?id=728890 - -2014-05-22 11:50:16 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - Revert "h264parser: Remove unused fps_num/fps_den fields" - This breaks the build since mss has not been ported. - This reverts commit aeb6a520742fd82888e41ea23f9a39add51125a0. - -2014-05-22 16:12:01 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: Remove unused fps_num/fps_den fields - Instead the newly added function should be used to calculate - the framerate properly. - -2014-05-19 17:52:38 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: use new gst_h264_video_calculate_framerate() to get framerate - https://bugzilla.gnome.org/show_bug.cgi?id=723352 - -2014-05-19 17:43:54 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers_h264: add gst_h264_video_calculate_framerate() - Add a new function to calculate video stream framerate which rely on - SPS, slice header and pic timing using formula: - time_scale 1 1 - fps = ----------------- x --------------- x ------------------------ - num_units_in_tick DeltaTfiDivisor (field_pic_flag ? 2 : 1) - See section E2.1 of H264 specification for definition of variables. - https://bugzilla.gnome.org/show_bug.cgi?id=723352 - -2014-05-21 21:44:40 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - gl/context: add gl extension checking to check_feature() - Useful for extensions that do not define any new GL API entrypoints - but can still modify behaviour when used. - -2014-05-21 20:36:37 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldownload.c: - gl/download: fixup YUY2/UYVY download - Regression from 2da979831ec3b1a8d993eb6f2d3999c5810c4d67 as it did - not update the download code to reflect the change in texture format. - -2014-05-19 11:48:55 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: set field_pic_flag when parsing a slice header - field_pic_flag was used but never set to other value than its default - https://bugzilla.gnome.org/show_bug.cgi?id=730363 - -2014-05-22 11:54:40 +0100 Damian Ziobro <ziobro.damian@gmail.com> - - * ext/hls/m3u8.c: - hlsdemux: Fix storing of the IV based on the media sequence number - https://bugzilla.gnome.org/show_bug.cgi?id=730574 - -2014-05-22 12:23:57 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix building with newer kernel headers - c400eef3772b7dc470eefae02a1288c2b125e25c introduced some defines to handle - older kernel headers. However, the check is done before the corresponding - kernel header (dvb/frontend.h) is included. As a result the macros are - always defined with results in 'redefined' errors with newer kernel - headers. - Move the check after the include to fix this. - https://bugzilla.gnome.org/show_bug.cgi?id=730570 - -2014-05-21 13:23:30 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -=== release 1.3.2 === - -2014-05-21 13:06:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * common: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect-build.stamp: - * docs/plugins/inspect.stamp: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * gst/bayer/gstbayerorc-dist.c: - * win32/common/config.h: - Release 1.3.2 - -2014-05-21 12:42:56 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2014-05-21 19:47:22 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - gl/filter: fixup passthrough bufferpool - In a pipeline like so: - videotestsrc ! gleffects ! videoconvert ! sink - gleffects was simply passing the videoconvert bufferpool to videotestsrc - and not creating a glbufferpool. videobufferpool would then fail - to allocate from the glallocator. - -2014-05-21 10:51:26 +0200 Sebastian Dröge <sebastian@centricular.com> - - * common: - Automatic update of common submodule - From 211fa5f to 1f5d3c3 - -2014-05-21 08:53:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - dvb-section: Don't compare unsigned integers for >= 0 - gst-dvb-section.c:93:12: error: comparison of unsigned expression >= 0 is always true - -Werror,-Wtautological-compare - if (hour >= 0 && hour < 24 && minute >= 0 && minute < 60 && second >= 0 - ~~~~ ^ ~ - gst-dvb-section.c:93:40: error: comparison of unsigned expression >= 0 is always true - -Werror,-Wtautological-compare - if (hour >= 0 && hour < 24 && minute >= 0 && minute < 60 && second >= 0 - ~~~~~~ ^ ~ - gst-dvb-section.c:93:70: error: comparison of unsigned expression >= 0 is always true - -Werror,-Wtautological-compare - if (hour >= 0 && hour < 24 && minute >= 0 && minute < 60 && second >= 0 - ~~~~~~ ^ ~ - -2014-05-20 17:09:43 +0200 L. Sorin <sorin@axis.com> - - * ext/curl/gstcurlsshsink.c: - curlsshsink: post error on bus in element, not transfer thread - Looks like this file was missed in Bug 728960: - https://bugzilla.gnome.org/show_bug.cgi?id=728960 - https://bugzilla.gnome.org/show_bug.cgi?id=730459 - -2014-05-21 10:26:21 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglupload.c: - gl/upload: switch the 'master' texture for YUY2, UYVY - From d4bcef3204709159713ff1630978ecac0bd91dc9 on, using a RGBA - texture to hold the data causes the glmemory to have half width - and a scaling of 2, 1. Using a LA texture solves this problem - however cannot be attached to the framebuffer for copying into - a RGBA texture. Which will be solved by moving to EXT_texture_rg. - https://bugzilla.gnome.org/show_bug.cgi?id=728890 - -2014-05-14 17:59:52 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/egl/gsteglimagememory.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/gstglfilter.c: - gl/eglimage: add eglimage context feature - Allows us to selectively use EGLImages only when available - https://bugzilla.gnome.org/show_bug.cgi?id=728234 - -2014-05-14 17:33:21 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - gl/context: add generic feature checking - At the moment it simply delegates to the subclass. - -2014-05-20 11:42:35 +0200 Wim Taymans <wtaymans@redhat.com> - - * gst/bayer/gstbayerorc.orc: - bayer: fix unused variable - -2014-01-28 14:04:11 +0100 L. Sorin <sorin@axis.com> - - * ext/curl/gstcurlsshsink.c: - * ext/curl/gstcurlsshsink.h: - * tests/check/elements/curlsftpsink.c: - curlsftpsink: authenticate remote host via public key fingerprint - Expose one more libcurl option: CURLOPT_SSH_HOST_PUBLIC_KEY_MD5. - This allows authenticating the server by the MD5 fingerprint of - the server's public key. - https://bugzilla.gnome.org/show_bug.cgi?id=723167 - -2014-05-19 13:43:59 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - mpegts: Check hour:minute:second values before creating datetime - Avoids assertions when the packets are malformed and also add the case - where the time isn't specified, only the date. - -2014-05-19 12:25:51 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Check if context creation failed before trying to use it - Otherwise we will cause assertions everywhere by passing NULL to functions - and eventually crash when dereferencing a NULL pointer. - https://bugzilla.gnome.org/show_bug.cgi?id=730069 - -2014-05-19 12:21:13 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglcontext.c: - glcontext: Add more assertions to make sure that everything sets the GError during context creation if something fails - -2014-05-19 11:34:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/freeverb/gstfreeverb.c: - freeverb: Don't pass floats to abs() but instead cast them to ints first - gstfreeverb.c:781:29: error: using integer absolute value function 'abs' when - argument is of floating point type -Werror,-Wabsolute-value - if (abs (out_l2) > 0 || abs (out_r2) > 0) - -2014-05-19 09:12:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/rsvg/gstrsvgdec.c: - rsvgdec: Unref handle and output state on error paths - CID 1214604 - -2014-05-16 09:10:48 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/opensles/openslesringbuffer.c: - opensles: Work around race condition in Android < 4.2 that leads to deadlocks on shutdown - We need to sleep a bit before destroying the player object - because of a bug in Android in versions < 4.2. - OpenSLES is using AudioTrack for rendering the sound. AudioTrack - has a thread that pulls raw audio from the buffer queue and then - passes it forward to AudioFlinger (AudioTrack::processAudioBuffer()). - This thread is calling various callbacks on events, e.g. when - an underrun happens or to request data. OpenSLES sets this callback - on AudioTrack (audioTrack_callBack_pullFromBuffQueue() from - android_AudioPlayer.cpp). Among other things this is taking a lock - on the player interface. - Now if we destroy the player interface object, it will first of all - take the player interface lock (IObject_Destroy()). Then it destroys - the audio player instance (android_audioPlayer_destroy()) which then - calls stop() on the AudioTrack and deletes it. Now the destructor of - AudioTrack will wait until the rendering thread (AudioTrack::processAudioBuffer()) - has finished. - If all this happens with bad timing it can happen that the rendering - thread is currently e.g. handling underrun but did not lock the player - interface object yet. Then destroying happens and takes the lock and waits - for the thread to finish. Then the thread tries to take the lock and waits - forever. - We wait a bit before destroying the player object to make sure that - the rendering thread finished whatever it was doing, and then stops - (note: we called gst_opensles_ringbuffer_stop() before this already). - -2014-05-15 20:34:48 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegts: mpegtsdescriptor: fix gobject-introspection warnings - Adds missing : to gobject-introspection markers - -2014-05-15 19:16:30 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegts: sections: prevent assertion when packet parsing fails - the descriptors entry can be left as NULL and freeing the structure - will fail (assertion happens) - -2014-05-14 21:32:10 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/gstmotioncells.c: - motioncells: fix memleak - Check gst_buffer_map return and remember to unmap and free memory before - returning - https://bugzilla.gnome.org/show_bug.cgi?id=730133 - -2014-05-14 11:47:03 +0200 Wim Taymans <wtaymans@redhat.com> - - * sys/bluez/gstavdtputil.c: - bluez: fix property names - These were forgotten when they got renamed. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=729731 - -2014-05-13 14:13:57 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - gl/download: update to be similar to the glupload semantics - -2014-05-13 14:07:39 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/colorconvert: fix up alpha clobbering - Previously it would only work if the alpha value was in the last - component (RGBx, BGRx). Now it works wherever the alpha value may - be (xRGB, xBGR, etc). - -2014-05-14 00:23:35 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: post error message when erroring out on unsupported essence wrapping - -2014-04-10 16:10:06 +0200 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * Android.mk: - Add missing backslash in Android.mk - https://bugzilla.gnome.org/show_bug.cgi?id=727968 - -2014-05-13 16:29:46 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlssink.c: - hlssink: do not leak playlist object - In finalize, also release the playlist - -2014-05-13 13:16:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: Fix building without EGL support - This fixes the OSX build and any builds with --disable-egl. That issue - was introduced in "glfilter: rewrite transform_caps to preserve caps fields". - https://bugzilla.gnome.org/show_bug.cgi?id=729861 - -2014-05-13 13:30:47 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: rewrite transform_caps to preserve caps fields - https://bugzilla.gnome.org/show_bug.cgi?id=729861 - -2014-05-13 10:53:19 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - gl/colorconvert: use the texture scaling from the gl memory - The colorconvert values were not being used at all. - https://bugzilla.gnome.org/show_bug.cgi?id=729896 - -2014-05-12 19:29:45 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: Fix handling of stride with alignement larger then 8 - Setting a scaled factor for X coordinate is not enough as the indexer - will still think stride is shorter and will not fully skip it. Instead, - update width, so the lines are as expected. Combined with the scale, it - will hide the cropped portion. - https://bugzilla.gnome.org/show_bug.cgi?id=729896 - -2014-05-13 11:22:58 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: mpdparser: properly unref gstdatetime - Avoid leaking the GstDateTime instances when summing dates - CID #1212143 - -2014-05-13 10:24:51 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: mpdparser: avoid double free of segment timeline node - The parsing function already frees the old value (if any), avoid a double - free by not freeing it before calling the function without setting the - pointer to NULL - Coverity ID: 1212178 - -2014-05-13 10:13:37 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: mpdparser: avoid double free - The _parse_url function already frees the previous pointer, avoid - freeing it before without setting to null or we have a double free. - Coverity ID: 1212181 - Coverity ID: 1212180 - Coverity ID: 1212179 - -2014-05-13 14:21:15 +0200 Edward Hervey <edward@collabora.com> - - * ext/schroedinger/gstschrodec.c: - schrodec: Use pool configuration - It was leaking the config, but also not using it... - CID #1212155 - -2014-05-13 14:15:24 +0200 Edward Hervey <edward@collabora.com> - - * ext/rsvg/gstrsvgdec.c: - rsvg: Don't leak GstVideoCodecState - And avoid useless call to _get_output_state (set_output_state() already - returns it). - CID #1212160 - CID #1212161 - -2014-05-13 13:54:23 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtbase: Small rewrite - Setting done was useless anyway - -2014-05-13 13:52:48 +0200 Edward Hervey <edward@collabora.com> - - * ext/dash/gstmpdparser.c: - dash: Don't leak GstActiveStream - CID #1212142 - -2014-05-13 11:41:42 +0200 Edward Hervey <edward@collabora.com> - - * sys/shm/gstshmsrc.c: - shm: Don't leak GstShmPipe - By reordering the leaking code path to before the allocation - CID #1212153 - -2014-05-13 11:38:44 +0200 Edward Hervey <edward@collabora.com> - - * gst/vmnc/vmncdec.c: - vmndec: Don't leak output state - _set_output_state returns a reference to the codec state. - CID #1212170 - -2014-05-13 11:35:46 +0200 Edward Hervey <edward@collabora.com> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: Don't leak adapter data - CID #1212158 - -2014-05-13 11:30:35 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegpsmux/psmuxstream.c: - mpegpsmux; Fix stream leak - CID #1212164 - -2014-05-13 11:23:42 +0200 Edward Hervey <edward@collabora.com> - - * gst/jp2kdecimator/jp2kcodestream.c: - jp2kdecimator: Don't leak various slices and arrays - CID #1212139 - CID #1212140 - CID #1212141 - -2014-05-13 11:19:24 +0200 Edward Hervey <edward@collabora.com> - - * gst/asfmux/gstasfobjects.c: - asfmux: Don't leak bytereader - By making it go through the error path that takes care of cleanups - CID #1212168 - -2014-05-12 13:50:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Ensure we still have a texture after upload_set_format() - gst_gl_upload_set_format() resets the upload, hence the texture. - So we need to ensure we have a texture after this call when - uploading. - -2014-05-12 12:59:59 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Correctly update the video info from video meta - Using gst_video_info_set_format() isn't complete when updating - a video info from video meta. - -2014-05-12 12:57:18 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Correctly update video info in upload fallback - When the upload accelerated method fails, we fallback to an upload, - but the video info was not correctly updated. - -2014-05-12 18:28:45 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: avoid deadlocking when erroring - It might get stuck when posting the message while - a reconfigure event is being pushed upstream - -2014-05-12 17:37:16 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: fix caps leak - -2014-05-12 15:43:05 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: handle error messages from internal source - set up a bin message handler to get notified of error messages from - the internal source element - -2014-05-12 14:58:45 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: Always accept the latency configure event - Upstream or internal elements are irrelevant and we should - always succeed. - -2014-05-12 14:51:00 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: reenable segment tracking for streams - Store the latest pushed timestamp so that mssdemux streams know - where they are in time - -2014-05-12 14:23:15 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: deprecate unused max-queue-size-buffers - There is no internal storage of buffers anymore - -2014-05-12 14:18:13 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/Makefile.am: - * ext/smoothstreaming/gstdownloadrate.c: - * ext/smoothstreaming/gstdownloadrate.h: - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: measure bitrate similarly to hlsdemux - new bitrate = (old bitrate + (last fragment bitrate * 3)) / 4 - -2014-05-12 13:40:19 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: remove uridownloader in favor of internal source - Refactor mssdemux to remove uridownloader to use an internal - source element which reduces startup latency and provides smaller - buffers for better buffering management downstream - -2014-05-12 13:28:35 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: initialize the mutex and cond for fragment download - -2014-05-12 13:32:31 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload: set out_tex after reset, not before - Fix a regression introduced recently with the lazy init. - It was happening when calling gst_video_gl_texture_upload_meta_upload - from an aplication. So not using gst_gl_upload_perform_with_buffer. - -2014-05-11 12:48:52 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload: update the video info on mapping a video frame - The buffer should contain the most specific data on how the data is - formatted. We should use this information. - https://bugzilla.gnome.org/show_bug.cgi?id=729896 - -2014-05-12 21:56:06 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/convert: clobber alpha channel when needed - Needed in the conversion from padded RGB formats to formats with an - alpha channel. e.g. BGRx -> ABGR, etc - https://bugzilla.gnome.org/show_bug.cgi?id=729742 - -2014-05-12 21:51:38 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload: avoid performing color conversion when there is no need - One such example is when the buffer contains GstGLMemory in the - RGBA format - https://bugzilla.gnome.org/show_bug.cgi?id=729278 - -2014-05-12 10:01:43 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Don't free string we're still using - CID 1213780 - -2014-05-11 15:26:45 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: remove unused stream uridownloader - The uridownloader for the stream fragments isn't used anymore. - -2014-05-11 07:56:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/assrender/gstassrender.c: - assrender: Do not try to add a feature to a caps features ANY - It does not makes sense and asserts - Based on 7f9aac386fd5d5921c80100889a5f212c0148a88 from gst-plugins-base. - -2014-05-11 07:55:59 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Do not try to add a feature to a caps features ANY - It does not makes sense and asserts. - Based on 7f9aac386fd5d5921c80100889a5f212c0148a88 from gst-plugins-base. - -2014-05-11 14:02:34 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/colorconvert: choose the right alpha component for AYUV -> RGBA - -2014-05-11 10:27:02 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload: update the respective state when we cache textures/data - -2014-05-01 02:10:20 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@sisa.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: drop C++ style comments - This patch builds on previous work done by - Fabrizio (Misto) Milo <mistobaan@gmail.com> - https://bugzilla.gnome.org/show_bug.cgi?id=641204 - -2014-05-01 01:58:03 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@sisa.samsung.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix up error reporting - This patch builds on previous work done by - Fabrizio (Misto) Milo <mistobaan@gmail.com> - https://bugzilla.gnome.org/show_bug.cgi?id=641204 - -2014-05-10 23:33:24 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload: cache the textures that we are using - -2014-05-10 22:48:05 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload: avoid recreating the GLMemory struct for output textures - -2014-04-11 19:38:32 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: error out if we get EOS immediately without any data - It's not really right to just go EOS as if nothing was wrong. - -2014-05-10 12:54:58 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: remove confusing debug log line - -2014-05-07 20:08:08 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautoconvert.h: - autoconvert: factories don't need the lock - An atomic is enough, they can only be set once. - -2014-05-09 20:06:12 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - Revert "autoconvert: Handle caps query on internal srcpad" - This is not needed anymore if the gst_pad_link checks nothing. - This reverts commit a303375a3f5c12e97ca8bf50b5a93ce8652faf23. - -2014-05-09 20:12:27 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: No need to check anything when linking internal pads - -2014-05-09 20:05:07 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Don't ignore elements accepted ANY, it is valid - -2014-05-09 18:49:14 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Remove broken usage of the iterator - We're a subclass, so we can just take the object lock and iterate the list - directly. - -2014-05-08 19:35:07 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Process upstream getcaps - Process it like downstream getcaps - -2014-05-07 20:00:08 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Return the GList of factories, to a pointer to it. - -2014-05-07 19:54:46 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautoconvert.h: - autoconvert: subelement can only be change with stream lock held - It was already the case, now be more explicit about that, and remove useless - lock/ref/unlock/unref dances. - -2014-05-07 19:48:49 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Keep a ref to the pads too - Simplifies the code - -2014-05-07 19:47:04 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Remove uneeded if() - NULL is valid GList - -2014-05-07 19:44:11 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Always push reconfigure upstream too - A reconfigure could trigger a change of contents instead of just reconfiguring the internal element - -2014-05-07 19:43:13 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Remove unused internal parameter - -2014-05-09 18:59:46 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglupload.c: - gl: Fix some of the error handling - -2014-05-09 17:59:43 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglupload.c: - glupload: Update GstVideoInfo after the buffer is mapped - gst_video_frame_map() will store an updated video info base - on the video meta. In order to have the right stride and offset - we should update that video info accordingly. - -2014-05-09 15:42:08 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstglshadervariables.c: - gl: Fix memory leak - CID #1212171 - -2014-05-09 15:26:31 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hls: Remove invalid free - data does not have to be freed at all here, it's a pointer to - an arbitrary position inside the current line. Also don't reuse - the data variable for anything else, that will cause crashes - in playlists that have the I-frame playlist URI followed by - other attributes. - CID 1212127 - -2014-05-09 14:31:57 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: Fix leak - The cell extension was never added to the parent cell - CID #1212162 - -2014-05-09 22:22:43 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/colorconvert: preserve alpha in AYUV <-> RGBA conversions - https://bugzilla.gnome.org/show_bug.cgi?id=729743 - -2014-05-09 18:07:03 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglupload.c: - gl/colorconvert: implement lazy init - -2014-05-08 15:38:24 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload: set initted to TRUE when _init_upload succeeded - -2014-05-08 22:49:33 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gldisplay: Use GST_STR_NULL() for printing possibly NULL strings and print all variables we use - Fixes compiler warning about set but not used platform_choice variable - among other things. - -2014-05-08 16:08:08 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/gl/gstgleffects.c: - gleffects: use gl_vtable - -2014-05-08 17:28:11 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload: fix compilation on OS X - -2014-05-08 15:40:33 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload: fail propoerly if init fails - -2014-05-08 15:30:49 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - gl: make all GObjects inherit from GstObject - Aids memory leak debugging with GST_TRACE=mem-live - -2014-05-08 13:46:29 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * tests/check/libs/gstglupload.c: - gl/upload: implement lazy init - Rename init_format to set_format - -2014-05-08 00:59:42 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - gl/upload: add get_format method - Simply retreives the format set by init_format - -2014-05-08 00:48:07 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - gl/filter: attempt to passthrough the pool if the caps are the same - Reduces the number of glbufferpool instances required for >=2 - consecutive GL elements in a pipeline. - -2014-05-08 00:43:14 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - gl/filter: always initialize the upload object - -2014-05-07 21:45:53 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmixer.c: - gl: advertise GstGLMemory usage in the caps as capsfeatures - https://bugzilla.gnome.org/show_bug.cgi?id=729658 - -2014-05-07 20:12:23 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/gl/clutter/clutteractor.c: - * tests/examples/gl/clutter/clutteractortee.c: - gl/examples: fix compilation for clutter examples - ClutterX11TexturePixmap is deprecated in Clutter 1.6 and we ask for - at least 1.8 - -2014-05-07 19:05:55 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gl/display: avoid endless recursion for cocoa - -2014-05-06 08:52:27 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: deprecate max-buffering-time property - It is not used as dashdemux doesn't have a internal buffer - for fragments anymore - -2014-05-06 01:56:28 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: removing old unused code - The 'catch up mode' isn't needed anymore since dashdemux - is downloading and pushing from the same thread - -2014-05-05 10:13:15 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: remember to set starting fragment to new fragments - -2014-05-02 18:34:04 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: handle a few more error cases - related to missing plugins, bad URI and a lockup on dealing with - errors from the source. - -2014-05-02 18:32:56 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Only set timestamp to the first buffer of fragments - Setting it to the other parts of the fragment is slightly wrong - and misleading as it isn't accurate enough. - -2014-05-02 18:30:05 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: handle error messages from the sources - Set up a message handling function to be able to catch errors - from the source element and signal the cond to allow the download - loop to retry the download. - -2014-05-01 21:04:54 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: check for errors between downloads - To abort earlier in case of failures - -2014-05-01 21:00:32 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Always accept the latency configure event - Upstream or internal elements are irrelevant and we should - always succeed. - -2014-05-01 12:04:51 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/Makefile.am: - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstdownloadrate.c: - * ext/dash/gstdownloadrate.h: - dashdemux: measure download rate just like hlsdemux - new bitrate = (old bitrate + (last fragment bitrate * 3)) / 4 - -2014-04-25 08:50:18 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: remove uridownloader from fragments download - Instead, use a source element linked to a ghostpad to provide - smaller buffers and more granular control for downstream - buffering elements while also reducing startup latency - -2014-05-07 09:11:25 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - gl/sink: make sure we always initialize the upload object - https://bugzilla.gnome.org/show_bug.cgi?id=729542 - -2014-05-06 19:24:55 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: fix internal source event leaks - -2014-05-06 11:59:24 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglupload.c: - gl: do not allocate the target texture of an EGLImage - The target texture of an EGLImage is the texture bind just - before calling glEGLImageTargetTexture2D. - As we currently only support a gl texture as the source of an EGLImage - the gl texture is actually already allocated when creating the eglimage. - I also see some cases where it fails to upload an eglimage when - glTexImage2D is called on the target. - -2014-05-06 11:51:31 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglutils.c: - gl: allow to avoid calling glTexImage2D(w, h, NULL) when generating a texture - Just pass 0 as width or height to gst_gl_context_gen_texture. - -2014-05-06 11:27:47 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglbufferpool.c: - gl: no need to initialize a frame buffer object to upload an eglimage - Fix https://bugzilla.gnome.org/show_bug.cgi?id=729588 - -2014-05-06 11:21:56 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/egl/gsteglimagememory.c: - gl: use GST_CAT_ERROR instead of GST_ERROR_OBJECT - It fixes segault when GST_DEBUG is at least level 1 and eglCreateImage fails - -2014-05-06 10:14:26 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglupload.c: - gl: delete texture used with GstVideoGLTextureUploadMeta - -2014-05-06 14:23:34 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl: use gst_gl_context_gen_shader helper instead of duplicating code - -2014-05-06 09:55:05 -0400 Luis de Bethencourt <luis@debethencourt.com> - - * gst/pnm/gstpnmenc.c: - pnmenc: remove empty line - Remove trailing empty line from commit bfdc54395238c04fc6e5b51880c2d706f33e9011 - https://bugzilla.gnome.org/show_bug.cgi?id=729614 - -2013-11-20 12:16:17 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst/mpegtsmux/tsmux/tsmux.h: - mpegtsmux: Remove unused data in TsMuxSection - https://bugzilla.gnome.org/show_bug.cgi?id=721685 - -2014-05-06 21:17:59 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/check/Makefile.am: - tests: reenable camerabin element test - -2014-05-06 16:39:06 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * tests/check/Makefile.am: - gl/display: clean up pre gstglcontext api and struct fields - https://bugzilla.gnome.org/show_bug.cgi?id=729551 - -2014-05-06 17:27:15 +1000 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - gl/display: add get_handle_type - https://bugzilla.gnome.org/show_bug.cgi?id=729551 - -2014-05-06 17:08:18 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gl/display: avoid opening the X11 display on systems with Cocoa (OS X) - https://bugzilla.gnome.org/show_bug.cgi?id=729551 - -2014-05-06 16:39:55 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglwindow.c: - gl/window: fix string length check for eagl - -2014-05-06 16:31:28 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - gl/display: check the correct env variable for choosing an egl display - GST_GL_WINDOW is used for window system specific choices. - An EGLDisplay can be created from window systems with egl support by using - eglGetDisplay(). - https://bugzilla.gnome.org/show_bug.cgi?id=729551 - -2014-05-06 12:56:25 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/gl/cocoa/Makefile.am: - gl/cocoa: Use OBJCFLAGS where needed - Should fix usage of c-compiler-only flags with an objective-c compiler - -2014-05-06 09:48:58 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/pnm/gstpnmenc.c: - pnmenc: fix flow return and buffer leak in not-negotiated case - https://bugzilla.gnome.org/show_bug.cgi?id=729614 - -2014-05-06 09:40:01 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/icles/.gitignore: - tests: add new vp8parser-test binary to .gitignore - -2014-05-05 17:20:45 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Don't reset stream if the key hasn't changed - -2014-05-05 17:00:02 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpdec.h: - srtpdec: Add "remove-key" action signal to remove a single key - Removing all the keys can be a problem as it also resets the various - counters, so instead add an option to remove a single key. - -2014-05-05 22:25:08 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: Use %u in templates to match rtpbin - -2014-05-06 00:11:26 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Remove unused field - -2014-05-06 09:23:13 +0530 Sanjay NM <sanjay.nm@samsung.com> - - * gst/pnm/gstpnmenc.c: - Fix for not checking zero width and height - Signed-off-by: Sanjay NM <sanjay.nm@samsung.com> - https://bugzilla.gnome.org/show_bug.cgi?id=729614 - -2014-05-05 11:13:09 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Only set the segment position if there is a timestamp - Only the first buffer of a fragment has its timestamp set, so only - update the segment.position when pushing those buffers to avoid - having GST_CLOCK_TIME_NONE set to the position - https://bugzilla.gnome.org/show_bug.cgi?id=729364 - -2014-05-05 12:30:32 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - configure: Use the same includes for GL that we would use later in the code for checking if GLES2 and OpenGL headers can both be included - -2014-05-05 20:06:29 +1000 Matthew Waters <ystreet00@gmail.com> - - * configure.ac: - gl: check if we can include both GL and GLES2 headers at the same time - If we cannot, then default to GL over GLES2 unless GLES2 is required. - -2014-05-05 09:46:06 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Set Cache-Control header according to the caching requirements of the playlist - -2014-05-05 09:38:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: Update for uri downloader API changes - -2014-05-05 09:37:44 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Update for uri downloader API changes - -2014-05-05 09:36:56 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - * gst-libs/gst/uridownloader/gsturidownloader.h: - uridownloader: Add parameter to disallow caching as required by HLS - -2014-05-05 09:34:56 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hls: Store allowcache playlist field in a boolean - -2014-05-04 22:22:14 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - configure: Use the same #includes for checking GL types as later in the code - -2014-05-03 21:38:42 -0400 Luis de Bethencourt <luis@debethencourt.com> - - * tests/examples/gl/clutter/cluttershare.c: - gl/clutter: safer check for cogl version - Use COGL_VERSION_ENCODE to check for the minimum required and maximum allowed - cogl version. In certain situations just using the COGL_VERSION_* macro name can - give you the following error: - error "COGL_VERSION_MAX_ALLOWED must be >= COGL_VERSION_MIN_REQUIRED" - -2014-05-03 21:05:19 -0400 Luis de Bethencourt <luis@debethencourt.com> - - * tests/examples/gl/generic/cube/main.cpp: - * tests/examples/gl/generic/cubeyuv/main.cpp: - * tests/examples/gl/generic/doublecube/main.cpp: - * tests/examples/gl/generic/recordgraphic/main.cpp: - gl/examples/generic: remove trailing whitespaces - -2014-05-03 20:48:33 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - Back to development - -=== release 1.3.1 === - -2014-05-03 18:16:21 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * gst/audiomixer/gstaudiomixerorc-dist.c: - * gst/bayer/gstbayerorc-dist.c: - * gst/fieldanalysis/gstfieldanalysisorc-dist.c: - * gst/gaudieffects/gstgaudieffectsorc-dist.c: - * win32/common/config.h: - * win32/common/libgstcodecparsers.def: - Release 1.3.1 - -2014-05-03 18:16:07 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2014-05-03 19:45:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/examples/gl/clutter/Makefile.am: - examples: Fix CFLAGS in clutter GL examples - -2014-05-03 19:42:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/examples/gl/Makefile.am: - examples: Add all gl subdirs to DIST_SUBDIRS to fix the build - -2014-05-03 17:24:17 +0200 Sebastian Dröge <sebastian@centricular.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - po: Update translations - -2014-05-03 13:12:40 +0200 Sebastian Dröge <sebastian@centricular.com> - - * Makefile.am: - * configure.ac: - * sys/Makefile.am: - * sys/mfc/Makefile.am: - * sys/mfc/fimc/fimc.c: - * sys/mfc/fimc/fimc.h: - * sys/mfc/gstmfc.c: - * sys/mfc/gstmfcdec.c: - * sys/mfc/gstmfcdec.h: - * sys/mfc/mfc_decoder/mfc_decoder.c: - * sys/mfc/mfc_decoder/mfc_decoder.h: - mfc: Remove mfc plugin, it is obsoleted by the v4l2videodec element from gst-plugins-good - -2014-05-03 12:02:27 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/mpegtsmux.c: - mpegtsmux: Use complete caps for setting up the streams in the test - -2014-05-03 10:15:16 +0200 Sebastian Dröge <sebastian@centricular.com> - - * common: - Automatic update of common submodule - From bcb1518 to 211fa5f - -2014-03-19 09:22:08 +0100 Per x Johansson <perxjoh@axis.com> - - * gst/debugutils/gstwatchdog.c: - watchdog: Add handling of PAUSED state - Also allow disabling the timeout by setting it to 0. - https://bugzilla.gnome.org/show_bug.cgi?id=726156 - -2014-05-02 17:27:56 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpenc.c: - * ext/srtp/gstsrtpenc.h: - srtpenc: Add config for the replay window size - -2014-05-02 17:24:47 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpenc.h: - srtpenc: Remove unused object members - -2014-05-02 17:19:21 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: Remove useless structure - Remove now useless structure - -2014-05-02 17:14:14 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: Remove ssrc parsing from stream - It's no longer used - -2014-05-02 17:13:54 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: Remove SSRC from signal, it's meaningless - -2014-05-02 17:07:21 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpenc.c: - * ext/srtp/gstsrtpenc.h: - srtpenc: Set the SRTP key as a shared key for all SSRCs - This is already how it was used. - -2014-05-02 14:20:58 +0200 Blake Tregre <blake.tregre@gmail.com> - - * gst/librfb/gstrfbsrc.c: - rfbsrc: Send stream-start event in the beginning - https://bugzilla.gnome.org/show_bug.cgi?id=726802 - -2014-05-02 10:44:41 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Update for URI downloader API changes - And make sure to set refresh=TRUE when updating the playlist. - -2014-05-02 10:43:06 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: Update for URI downloader API changes - And include the manifest file as referer in requests, and make sure - to set refresh=TRUE when updating the manifest. - -2014-05-02 10:39:22 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Update for URI downloader API changes - And include the MPD file as referer in requests, and make sure - to set refresh=TRUE when updating the MPD. - -2014-05-02 10:36:21 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - * gst-libs/gst/uridownloader/gsturidownloader.h: - uridownloader: Add refresh parameter to hint caches that they should check if they're up to date - -2014-05-02 15:56:59 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstglfilter.c: - gl: use the bufferpool's upload when available - Avoids duplicating GL resources - https://bugzilla.gnome.org/show_bug.cgi?id=728872 - -2014-05-02 05:57:00 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl: show internal cocoa window on top of others - Useful when your OSX terminal is fullscreen - https://bugzilla.gnome.org/show_bug.cgi?id=728127 - -2014-05-02 05:51:36 +0100 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/gl/cocoa/cocoa-videooverlay.m: - gl: pass NSView instead of NSWindow in cocoa-videooverlay example - https://bugzilla.gnome.org/show_bug.cgi?id=728451 - -2014-05-02 05:50:18 +0100 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/gl/cocoa/cocoa-videooverlay.m: - gl: add copyright to cocoa example - -2014-05-02 05:46:18 +0100 Julien Isorce <julien.isorce@gmail.com> - - * configure.ac: - * tests/examples/gl/cocoa/.gitignore: - * tests/examples/gl/cocoa/Makefile.am: - * tests/examples/gl/cocoa/cocoa-videooverlay.m: - * tests/examples/gl/cocoa/videooverlay/.gitignore: - * tests/examples/gl/cocoa/videooverlay/Makefile.am: - gl: rename cocoa example and move it to its parent directory - -2014-05-02 05:29:41 +0100 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/gl/cocoa/README: - gl: remove unuseful README for cocoa example - -2014-05-01 16:07:05 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - gl/pool: init the upload object on start - Theoretically, set_config could be called multiple times - -2014-05-01 19:16:35 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Only clear streams if they have been created - -2014-05-01 19:10:43 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Use object debug - -2014-05-01 15:59:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Always succeed the LATENCY event - Upstream and our internal source is irrelevant for the latency - and we don't want the LATENCY event to ever fail. - -2014-05-01 15:56:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Reset the last flow return before restarting the internal source - Otherwise we will never recover from previous errors, and especially - will never start again after a flushing seek if downstream returned - GST_FLOW_FLUSHING to us. - -2014-05-01 15:29:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Only set PTS on the first buffer of a fragment instead of setting the same on all of them - -2014-04-30 17:59:28 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Always flush the internal proxy pads before downloading - hlsdemux can't rely on the source to push flushes on a seek on ready - as that might not make sense. So always resort to flushing the - internal proxy pads by pushing flush events from the source's src pad. - Also as the seeking is not required anymore, only seek if there is - really a byte range to be used. And store a ref to the source's - src pad to avoid doing get_static_pad for every fragment. - -2014-05-01 14:36:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - gl: Try harder to load symbols from the correct place - This commit makes the loading of the GModules threadsafe, and - always first tries to load the symbol for the GL library that - is selected for the current context. Only then it falls back - to looking into the current module (NULL), and only as a last - resort the context specific function (e.g. eglGetProcAddress()) - is called. - Also add configure parameters to select the names of the library - modules instead of using the defaults, and let the defaults be - independent of the G_MODULE_SUFFIX. - https://bugzilla.gnome.org/show_bug.cgi?id=728753 - -2014-05-01 14:11:00 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglcolorscale.c: - glcolorscale: fix operation with dual GL, GLES2 libgstgl - -2014-05-01 13:57:16 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglupload.c: - gl/mem: implement texture copying between formats with strides properly - Previously, we used the width to determine the amount of data to be - copied using pbos. This, makes it allocate enough data for the - the strides as well. - -2014-05-01 12:51:06 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.h: - gl/mem: pad the public struct - -2014-04-30 18:37:27 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglcontext.c: - gl: no need to provide full lib path to load symbols - - Make gstgl work on Mali - - Keep it work on RPI - - fallback to NULL name module if fails with usual lib name - https://bugzilla.gnome.org/show_bug.cgi?id=728753 - -2014-04-30 10:05:15 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatespu.c: - kate: avoid read buffer overflow in crafted stream - Coverity 1208777 - -2014-04-30 17:30:06 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/gl/gstglcolorscale.c: - * ext/gl/gstglcolorscale.h: - glcolorscale: use a shader on GLESv2 - Otherwise you only see black frames - Fix https://bugzilla.gnome.org/show_bug.cgi?id=728947 - -2014-04-30 15:30:53 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - glimagesink: use new helper function to avoid duplicating default shader text - -2014-04-30 15:28:35 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/gl/effects/gstgleffectidentity.c: - * ext/gl/effects/gstgleffectmirror.c: - * ext/gl/effects/gstgleffectsqueeze.c: - * ext/gl/effects/gstgleffectssources.c: - * ext/gl/effects/gstgleffectssources.h: - gleffects: use new helper functions to avoid duplicating the same vertex shader text - And also use the default fragment shader text for the identity effect - -2014-04-30 15:20:23 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - gl: add convenient functions to setup default vertex and fragment shaders - Most of our 2D filters use the same simple vertex shader. - Also define the default fragment shader as the identity. - Avoid duplicating the same vertex and fragment shader text. - -2014-04-30 08:53:19 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Only unref pending buffer if there is one - -2014-04-29 18:15:05 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Do not push last buffer after error - In decryption scenario, a buffer is always stored to be sent later - to wait for more data or EOS to be able to strip the final bytes - if requested. In case an error hapenned this buffer can be ignored - and not pushed downstream. - -2014-04-29 18:14:29 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: flush the adapter in the end of a fragment - In case of error there might be some data left in the - adapter when EOS is received. Clear the adapter to be - able to restart again later if requested. - -2014-04-29 18:14:14 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: handle more error cases - Handle some more error cases: - 1) When the source element fails to go to ready - 2) When decryption fails - 3) When there is no source to handle a specific URI - 4) When the URI is invalid - -2014-04-29 15:19:51 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: handle errors from internal source - Set up a message handling function to catch errors from the internal - source and store the last return code to identify error situations - when returning from a fragment download. - Also moves the duration increase to after the download when we - know if it was successful or not - -2014-04-29 15:17:00 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Improve pad switching conditions - When using the internal source, hlsdemux doesn't know the caps of - the input before adding the pad, so remove the arguments that would - use that as it is always NULL. - And use an specific flag to signal when a pad switch is required. - Using the discont flag is a bad idea now because when a fragment - download fails it will lead to exposing a pad group without any - data, causing decodebin to abort. - -2014-04-28 20:01:48 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: properly flush decryption status on seeks - Avoids mixing decryption of different fragments when seeking happens - and leading to broken stream output. - -2014-04-28 19:10:02 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Track fragments duration - When receving EOS from the internal src, increase the current positon - by the fragment duration to allow correct restoring of download position - if the bitrate changes - -2014-04-25 12:55:54 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: properly stop tasks by stopping fragment download - Issue a signal to the fragment download cond to stop - the task earlier - -2014-04-25 10:40:50 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: decrypt before typefinding - Make sure typefinding gets the decrypted content instead of - trying to typefind the encrypted data. - -2014-04-25 10:39:19 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: fix decryption function return - Correctly return the decrypted buffer when it succeeds and - return NULL otherwise - -2014-04-22 20:19:54 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: keep connection alive between downloads - Use the same properties as uridownloader to keep connections alive - between consecutive fragments downloads. - 1) set keep-alive property to true - 2) keep the element in READY instead of in NULL - -2014-04-16 20:02:35 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: create sources from uri - Instead of using always an http source, create it dynamically from - uri when needed. If not needed just replace the URI on the current - element - -2014-04-16 18:04:05 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: do not try to run typefind again if caps is the same - Always reset the do_typefind flag if hls did typefind because - trying it on non-zero offsets doesn't make sense and will cause - assertions - -2014-04-16 06:12:42 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: enable download bitrate measure - Measure the download bitrate to be able to select - the best playlist. - As the buffers are directly pushed downstream and it - might block. The time is only measured from the download - until the pad push and it is started again after the push - returns. - -2014-04-08 17:31:32 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: re-enable decryption after uridownloader removal - Now the decryption is done buffer by buffer instead of on the - whole fragment at once. As it expects multiples of 16 bytes a - GstAdapter was added to properly chunk the buffers. - Also the last buffer must be resized depending on the value of the - last byte of the fragment, so hlsdemux always keeps a pending buffer - as it doesn't know if it is the last one yet - -2014-04-07 13:57:26 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: replace uridownloader with a GstElement - The GstElement is directly linked into a ghost pad and - its buffers are pushed as received downstream. This way the - buffers are small enough and not a whole fragment that usually - causes extra latency and makes buffering harder - -2014-04-29 19:24:08 +0100 Philippe Normand <pnormand@igalia.com> - - * gst-libs/gst/gl/gstglutils.h: - gl: add missing G_BEGIN/END_DECLS in utils header - -2014-04-29 13:21:27 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/examples/gl/gtk/Makefile.am: - examples: gl: add missing entry to cflags to find gst/gl/gl.h - Otherwise build fails - -2014-04-29 16:44:59 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/examples/gl/gtk/gstgtk.c: - tests: drop direct include - It is only allowed to include gdk/gdkx.h and that will bring all the x11 things. - -2014-01-06 22:13:21 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/sndfile/gstsfdec.c: - sndfile: send a toc for the segments in the audio file - -2014-04-29 15:06:00 +0000 Haakon Sporsheim (ieei) <haakon.sporsheim@gmail.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: unref/replace force_key_unit_event in gst_h264_parse_reset - https://bugzilla.gnome.org/show_bug.cgi?id=729200 - -2014-04-29 22:18:14 +1000 Jan Schmidt <jan@centricular.com> - - * tests/examples/gl/sdl/Makefile.am: - gl/sdl example: Fix uninstalled build - -2014-04-23 20:29:47 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglutils.c: - gl: Reduce noisy Info level output to LOG - -2014-04-29 18:32:22 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/gl/sdl/Makefile.am: - * tests/examples/gl/sdl/sdlshare.c: - gl/examples/sdl: update for the latest gstgl changes - -2014-04-29 16:38:55 +1000 Matthew Waters <ystreet00@gmail.com> - - * configure.ac: - * tests/examples/Makefile.am: - * tests/examples/gl/Makefile.am: - * tests/examples/gl/clutter/.gitignore: - * tests/examples/gl/clutter/Makefile.am: - * tests/examples/gl/clutter/clutteractor.c: - * tests/examples/gl/clutter/clutteractortee.c: - * tests/examples/gl/clutter/cluttershare.c: - * tests/examples/gl/clutter/cluttershare.cbp: - * tests/examples/gl/cocoa/Makefile.am: - * tests/examples/gl/cocoa/README: - * tests/examples/gl/cocoa/videooverlay/.gitignore: - * tests/examples/gl/cocoa/videooverlay/Makefile.am: - * tests/examples/gl/cocoa/videooverlay/main.m: - * tests/examples/gl/generic/Makefile.am: - * tests/examples/gl/generic/README: - * tests/examples/gl/generic/cube/.gitignore: - * tests/examples/gl/generic/cube/Makefile.am: - * tests/examples/gl/generic/cube/cube.vcproj: - * tests/examples/gl/generic/cube/main.cpp: - * tests/examples/gl/generic/cubeyuv/.gitignore: - * tests/examples/gl/generic/cubeyuv/Makefile.am: - * tests/examples/gl/generic/cubeyuv/cubeyuv.vcproj: - * tests/examples/gl/generic/cubeyuv/main.cpp: - * tests/examples/gl/generic/doublecube/.gitignore: - * tests/examples/gl/generic/doublecube/Makefile.am: - * tests/examples/gl/generic/doublecube/doublecube.vcproj: - * tests/examples/gl/generic/doublecube/main.cpp: - * tests/examples/gl/generic/generic.sln: - * tests/examples/gl/generic/recordgraphic/.gitignore: - * tests/examples/gl/generic/recordgraphic/Makefile.am: - * tests/examples/gl/generic/recordgraphic/main.cpp: - * tests/examples/gl/generic/recordgraphic/recordgraphic.vcproj: - * tests/examples/gl/gtk/Makefile.am: - * tests/examples/gl/gtk/README: - * tests/examples/gl/gtk/filternovideooverlay/.gitignore: - * tests/examples/gl/gtk/filternovideooverlay/Makefile.am: - * tests/examples/gl/gtk/filternovideooverlay/filternovideooverlay.vcproj: - * tests/examples/gl/gtk/filternovideooverlay/main.cpp: - * tests/examples/gl/gtk/filtervideooverlay/.gitignore: - * tests/examples/gl/gtk/filtervideooverlay/Makefile.am: - * tests/examples/gl/gtk/filtervideooverlay/filtervideooverlay.vcproj: - * tests/examples/gl/gtk/filtervideooverlay/main.cpp: - * tests/examples/gl/gtk/fxtest/.gitignore: - * tests/examples/gl/gtk/fxtest/Makefile.am: - * tests/examples/gl/gtk/fxtest/fxtest.c: - * tests/examples/gl/gtk/fxtest/fxtest.vcproj: - * tests/examples/gl/gtk/fxtest/pixbufdrop.c: - * tests/examples/gl/gtk/gstgtk.c: - * tests/examples/gl/gtk/gstgtk.h: - * tests/examples/gl/gtk/gtk.sln: - * tests/examples/gl/gtk/gtkvideooverlay/.gitignore: - * tests/examples/gl/gtk/gtkvideooverlay/Makefile.am: - * tests/examples/gl/gtk/gtkvideooverlay/gtkvideooverlay.vcproj: - * tests/examples/gl/gtk/gtkvideooverlay/main.cpp: - * tests/examples/gl/gtk/pixbufdrop/pixbufdrop.vcproj: - * tests/examples/gl/gtk/switchvideooverlay/.gitignore: - * tests/examples/gl/gtk/switchvideooverlay/Makefile.am: - * tests/examples/gl/gtk/switchvideooverlay/main.cpp: - * tests/examples/gl/gtk/switchvideooverlay/switchvideooverlay.vcproj: - * tests/examples/gl/qt/Makefile.am: - * tests/examples/gl/qt/README: - * tests/examples/gl/qt/mousevideooverlay/gstthread.cpp: - * tests/examples/gl/qt/mousevideooverlay/gstthread.h: - * tests/examples/gl/qt/mousevideooverlay/main.cpp: - * tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pri: - * tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pro: - * tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.sln: - * tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.vcproj: - * tests/examples/gl/qt/mousevideooverlay/pipeline.cpp: - * tests/examples/gl/qt/mousevideooverlay/pipeline.h: - * tests/examples/gl/qt/mousevideooverlay/qrenderer.cpp: - * tests/examples/gl/qt/mousevideooverlay/qrenderer.h: - * tests/examples/gl/qt/qglwidgetvideooverlay/gstthread.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/gstthread.h: - * tests/examples/gl/qt/qglwidgetvideooverlay/main.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.h: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglrenderer.cpp: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglrenderer.h: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pri: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pro: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.sln: - * tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.vcproj: - * tests/examples/gl/qt/qglwtextureshare/AsyncQueue.h: - * tests/examples/gl/qt/qglwtextureshare/README: - * tests/examples/gl/qt/qglwtextureshare/cocoa_utils.mm: - * tests/examples/gl/qt/qglwtextureshare/glcontextid.h: - * tests/examples/gl/qt/qglwtextureshare/gstthread.cpp: - * tests/examples/gl/qt/qglwtextureshare/gstthread.h: - * tests/examples/gl/qt/qglwtextureshare/main.cpp: - * tests/examples/gl/qt/qglwtextureshare/moc_gstthread.cpp: - * tests/examples/gl/qt/qglwtextureshare/moc_pipeline.cpp: - * tests/examples/gl/qt/qglwtextureshare/moc_qglrenderer.cpp: - * tests/examples/gl/qt/qglwtextureshare/pipeline.cpp: - * tests/examples/gl/qt/qglwtextureshare/pipeline.h: - * tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp: - * tests/examples/gl/qt/qglwtextureshare/qglrenderer.h: - * tests/examples/gl/qt/qglwtextureshare/qglwtextureshare: - * tests/examples/gl/qt/qglwtextureshare/qglwtextureshare.pro: - * tests/examples/gl/qt/videooverlay/Debug/videooverlay: - * tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_gstthread.cpp: - * tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_pipeline.cpp: - * tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_qrenderer.cpp: - * tests/examples/gl/qt/videooverlay/videooverlay.cpp: - * tests/examples/gl/qt/videooverlay/videooverlay.pri: - * tests/examples/gl/qt/videooverlay/videooverlay.sln: - * tests/examples/gl/qt/videooverlay/videooverlay.vcproj: - * tests/examples/gl/qt/videooverlay/videovideooverlay.pro: - * tests/examples/gl/sdl/.gitignore: - * tests/examples/gl/sdl/Makefile.am: - * tests/examples/gl/sdl/sdl.sln: - * tests/examples/gl/sdl/sdlshare.c: - * tests/examples/gl/sdl/sdlshare.vcproj: - gl/examples: move to -bad - - fix all the compiler errors - - give them their own gl directory - -2014-04-28 15:56:06 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * pkgconfig/gstreamer-egl-uninstalled.pc.in: - * pkgconfig/gstreamer-egl.pc.in: - egl: remove pc files - Forgot to do that in 09116bf10d515d50bdd1e9a20278be816cb762aa: - "egl/eglglessink: remove since EGLImage and iOS support have been added in glimagesink" - -2014-04-28 15:52:41 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * pkgconfig/gstreamer-gl-uninstalled.pc.in: - * pkgconfig/gstreamer-gl.pc.in: - gl: append GL_LIB and GL_CFLAGS in pc files - -2014-04-28 15:47:27 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * configure.ac: - gl: append EGL_LIB to GL_LIB - -2014-04-28 15:15:20 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - gl: use gst_gl_platform_from_string because we support gl shareList on all platforms - -2014-04-28 15:07:34 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglfilter.c: - glfilter: only warn when other_context attribute is set - Fix false positive - -2014-04-28 14:54:21 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl: fix string literal warning - warning: format not a string literal, argument types not checked -Wformat-nonliteral - -2014-04-28 10:12:52 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Unset referer if none was specified later on - -2014-04-28 09:32:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Set Referer in requests to the playlist URI - -2014-04-28 09:23:34 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - * gst-libs/gst/uridownloader/gsturidownloader.h: - uridownloader: Add API to specify the referer of a request - -2014-04-27 23:29:41 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix parsing of slice groups for map type = 2. - When parsing slice groups information for slice_group_map_type = 2, we - should only be reading up to num_slice_groups_minus1 groups since there - is always a "leftover" slice group and as many "foreground" slice groups - as needed. - This fixes parsing for SVCBMT-5 and SVCBMT-12 whereby the base layer would - have incorrectly been parsed to have up to 38 reference frames in list0, - which is not possible. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-04-27 09:25:50 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * sys/decklink/gstdecklink.cpp: - decklink: Don't fail if HW does not have all interfaces - This patch completes 1c1cc73a3b230454663971656515297f9ee8bd9f. These - changes where accidentally pushed as a separate patch with wrong commit - message. - https://bugzilla.gnome.org/show_bug.cgi?id=7273 - -2014-04-27 13:09:52 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/decklink/gstdecklink.cpp: - Revert "y4mdec: check for VIDEO meta instead of CROP meta" - This reverts commit 68309bd21592a96dc8241702f17ded4e5f545f33. - Commit message and files changed do not match. - -2014-04-27 00:36:32 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ext/daala/gstdaaladec.c: - * ext/hls/gsthlsdemux.c: - * gst/liveadder/liveadder.c: - * gst/sdp/gstsdpdemux.c: - * gst/speed/gstspeed.c: - * gst/videomeasure/gstvideomeasure_collector.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/videosignal/gstsimplevideomark.c: - * gst/videosignal/gstsimplevideomarkdetect.c: - * gst/videosignal/gstvideoanalyse.c: - docs: remove outdated and pointless 'Last reviewed' lines from docs - They are very confusing for people, and more often than not - also just not very accurate. Seeing 'last reviewed: 2005' in - your docs is not very confidence-inspiring. Let's just remove - those comments. - -2014-04-26 08:08:57 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix derivation of default scaling lists. - When useDefaultScalingMatrixFlag is computed to be 1 while parsing - scaling_list(), then the scaling list shall be inferred to be equal - to the default list (7.4.2.1.1.1). That default list is really one - of Default_4x4_{Intra,Inter} or Default_8x8_{Intra,Inter} and not - one from fall-back rule sets A or B. - This fixes parsing for FRExt1_Panasonic_D, FRExt2_Panasonic_C, - FRExt3_Panasonic_E and FRExt4_Panasonic_B. - https://bugzilla.gnome.org/show_bug.cgi?id=724518 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-04-16 01:50:16 +0200 Sebastian Rasmussen <sebrn@axis.com> - - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlfilesink.c: - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlhttpsink.c: - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/gstcurltlssink.c: - curl*sink: report errors from curl when setting options - https://bugzilla.gnome.org/show_bug.cgi?id=728960 - -2014-04-15 23:53:32 +0200 Sebastian Rasmussen <sebrn@axis.com> - - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlbasesink.h: - * ext/curl/gstcurlfilesink.c: - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlhttpsink.c: - * ext/curl/gstcurlsftpsink.c: - * ext/curl/gstcurlsmtpsink.c: - curl*sink: post error on bus in element, not transfer thread - https://bugzilla.gnome.org/show_bug.cgi?id=728960 - -2014-04-22 22:26:32 +0200 Sebastian Rasmussen <sebrn@axis.com> - - * ext/curl/gstcurlhttpsink.c: - curlhttpsink: allow for unconditionally disabling proxying - Previously if the proxy server hostname was the empty string - curlhttpsink would never even set the libcurl option. For libcurl - however, having a proxy server hostname be the empty string means that - proxying should be disabled even if environment variables might be set. - Now with the restriction lifted, doing this is allowed. - https://bugzilla.gnome.org/show_bug.cgi?id=728960 - -2014-04-22 22:26:56 +0200 Sebastian Rasmussen <sebrn@axis.com> - - * tests/check/elements/curlfilesink.c: - * tests/check/elements/curlftpsink.c: - * tests/check/elements/curlhttpsink.c: - * tests/check/elements/curlsftpsink.c: - * tests/check/elements/curlsmtpsink.c: - curl*sink: improve return value checks in test cases - https://bugzilla.gnome.org/show_bug.cgi?id=728960 - -2014-04-22 22:26:12 +0200 Sebastian Rasmussen <sebrn@axis.com> - - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurltlssink.c: - * tests/check/elements/curlfilesink.c: - curl*sink: fix typos - https://bugzilla.gnome.org/show_bug.cgi?id=728960 - -2014-04-16 01:50:03 +0200 Sebastian Rasmussen <sebrn@axis.com> - - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlbasesink.h: - * ext/curl/gstcurlfilesink.c: - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlftpsink.h: - * ext/curl/gstcurlsftpsink.h: - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/gstcurlsshsink.h: - * ext/curl/gstcurltlssink.c: - curl*sink: fix some gst-indent problems - https://bugzilla.gnome.org/show_bug.cgi?id=728960 - -2014-04-25 16:18:07 -0400 Luis de Bethencourt <luis@debethencourt.com> - - * tests/check/libs/gstglmemory.c: - gl: check the correct GstGLMemory in basic_test - -2014-04-25 17:40:56 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Only require alignment and stream-format for h264, parsed is implicit - -2014-04-25 14:41:27 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Set source state to NULL if downloading failed for whatever reason - -2014-04-24 13:59:35 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl/x11: Removed unused variable - -2014-04-24 18:33:03 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - gl/x11: Get rid of unneeded second display connection and do everything from the main loop - -2014-04-24 18:28:34 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - gl/x11: Block rendering until swapbuffers is called and don't go via X11 events as unneeded indirection - This should fix QoS problems, where basesink believed it was rendering with - 20FPS but actually we were just queueing up X11 Expose events and only once - in a while something was rendered. - -2014-04-24 16:05:32 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - gl: fails glimagesink when shader compilation went wrong - Those shaders are fixed and very simple so it should not fail - but it's worth to handle a such case. - -2014-04-24 15:36:47 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - gl: call glClearColor before glClear - -2014-04-24 16:33:56 +0200 Josep Torra <n770galaxy@gmail.com> - - * pkgconfig/gstreamer-gl-uninstalled.pc.in: - pkgconfig: fix gstreamer-gl uninstalled - Ensure to provide libgstgl also in the uninstalled setup. - Fixes build of gst-omx for RPI in uninstalled setup. - -2014-04-24 15:17:41 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - gl/rpi: do not scale to full screen - Having a 640x360 movie being scaled to 1900x1200 does not look nice - -2014-04-24 14:50:57 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - gl/rpi: change dispmanx attributes of existing element instead of creating a new one - I was lucky that: - e1 = vc_dispmanx_element_add () - eglCreateWindowSurface (e1) - vc_dispmanx_element_remove (e1) - e2 = vc_dispmanx_element_add () - resulted in having e2 equal to e1. And also having the egl surface - that does not allocate its buffers before the first draw. - -2014-04-24 14:38:40 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - gl/rpi: ensure the dispmanx element to be opaque - So that we ensure it does not get alpha composited with other - dispmanx elements like the desktop. - -2014-04-18 20:04:25 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/plugin.m: - avfassetsrc: downgrade rank to SECONDARY in OS X - -2014-04-18 20:03:48 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/avfassetsrc.m: - avfassetsrc: rename references to iOS - -2014-04-14 19:08:01 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/avfassetsrc.h: - * sys/applemedia/avfassetsrc.m: - * sys/applemedia/plugin.m: - iosavassetsrc: rename element to avfassetsrc - https://bugzilla.gnome.org/show_bug.cgi?id=728249 - -2014-04-03 14:02:18 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/iosassetsrc.m: - * sys/applemedia/iosavassetsrc.h: - * sys/applemedia/iosavassetsrc.m: - * sys/applemedia/plugin.m: - iosavassetsrc: Port to 1.0 - Also enables this element on OSX >= 10.7. - https://bugzilla.gnome.org/show_bug.cgi?id=728249 - -2013-05-11 03:41:36 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/iosavassetsrc.h: - * sys/applemedia/iosavassetsrc.m: - * sys/applemedia/plugin.m: - applemedia: add new source/decoder element for iOS assets - https://bugzilla.gnome.org/show_bug.cgi?id=728249 - -2014-04-09 10:55:03 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/coremediabuffer.h: - * sys/applemedia/vtenc.c: - coremediabuffer: handle stride alignment - Handle stride alignment through the use of the video meta API. The - code is based on the corevideobuffer implementation. - If the video meta API is not supported and the underlying buffer - contains padding, the core media buffer is copied to a system memory - buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=727885 - -2014-04-09 11:47:12 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: check if downstream supports the video meta API - Check if downstream supports the video meta API, so we can use it later - with the core media buffers. - https://bugzilla.gnome.org/show_bug.cgi?id=727953 - -2014-04-24 10:37:00 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: pass a NSView to set_window_handle instead of a NSWindow - Fix backwards compatibility - https://bugzilla.gnome.org/show_bug.cgi?id=728451 - -2014-04-24 09:03:32 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: only draw once the window has been resized - It avoids to draw the first frame with an incorrect view port. - -2014-04-24 08:49:54 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - gl/cocoa: set the view to use for drawing by the context - It avoids to draw to an invalid buffer. - Withtout this the default frame buffer is undefined: - glBindFramebuffer (GL_FRAMEBUFFER, 0) - Visually you could see some white frames at the beginning - when lunching videotestsrc ! glimagesink - With OpenGL Profiler from XCode you could see some - GL_INVALID_FRAMEBUFFER_OPERATION for the first frames - -2014-04-23 14:41:21 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglupload.c: - gl: fix declaration-definition mismatch for _init_upload - -2014-04-23 13:34:12 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglbufferpool.c: - gl/bufferpool: do not reset upload when set_config does not change the caps - With videotestsrc ! glimagesink it was reset 3 times - -2014-04-23 13:30:27 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglapi.h: - gl: use #ifdef instead of #if for __APPLE__ - warning: "__APPLE__" is not defined -Wundef - with gcc version 4.7.2 20120731 (prerelease) - (crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08) - -2014-04-23 12:42:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/gl/gstglmemory.c: - glmemory: User g_slice_new0 to ensure fully initilized structure - The pbo pointer not being initialized would trigger a use of unitilialized variable - in valgrind. - -2014-03-29 18:34:26 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - decklink: Fix support for HW without output - Devices suitable for decklinksrc may not have any output, hence querying - the input returns NULL. Add support for all cases where - input/output/config may be missing. - https://bugzilla.gnome.org/show_bug.cgi?id=727306 - -2014-03-15 15:17:43 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * sys/decklink/gstdecklink.cpp: - y4mdec: check for VIDEO meta instead of CROP meta - This element only need stride support, but checks for CROP_META, which - is a bit too much, even though this works as CROP imply having VIDEO - meta. - https://bugzilla.gnome.org/show_bug.cgi?id=726255 - -2014-04-23 11:10:28 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Use the pixel-aspect-ratio adjusted width/height when centering the frame in the display area - Makes sure we actually keep the display aspect ratio - -2014-04-23 10:55:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: By default keep the display aspect ratio - Also the default for the pixel-aspect-ratio should be 1/1, not 0/1. - -2014-04-23 10:42:45 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: Flush program end code bytes - This should not harm regular files, since those are the last 4 bytes of - a normal file. - This allows to handle playback of concatenated mpeg-ps files. Seeking and - duration reporting is still wrong though. - -2014-04-23 10:27:23 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstgltestsrc.c: - gltestsrc: Unref context when creation failed and guard against that in fill() - -2014-04-23 10:24:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Call gst_object_unref() on the GstGL GObjects again - While they're plain GObjects it does not hurt to call gst_object_unref() - on them and potentially allows to debug reference leaks a bit easier. - -2014-04-23 10:00:48 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: If creating a context or upload failed, destroy it - Fixes deadlocks in error cases when later code assumes the broken - context is actually usable. - https://bugzilla.gnome.org/show_bug.cgi?id=728761 - -2014-04-22 12:56:54 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Remove dead code and simplify if statement - CID 1204274 - -2014-04-21 13:15:34 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mxf/mxfmpeg.c: - mxf: fix MP2 case - Testing mpegversion when mpegaudioversion was likely meant. - Similar tests in sys/androidmedia/gstamcaudiodec.c also test - mpegaudioversion with the same conditional code. - Coverity 206071 - -2014-04-21 10:36:55 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: guard against dividing by zero - If framerate is unknown, we write the maximum framerate - allowed for this profile/level: - https://tools.ietf.org/html/draft-ietf-avt-rtp-vc1-06#section-6.1 - http://wiki.multimedia.cx/index.php?title=VC-1#Setup_Data_.2F_Sequence_Layer - Coverity 1139694 - -2014-04-21 10:07:06 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mxf/mxfmux.c: - mxfmux: guard against dividing by 0 - Use a placeholder value in that case, it's better than crashing. - Coverity 1139697 - -2014-04-21 09:51:19 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - gl: a couple spelling/grammar fixes - -2014-04-21 09:50:19 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - gl: guard against using a NULL window pointer - Coverity 1195145 - -2014-04-21 09:47:08 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/gl/gstglmemory.c: - gl: prevent division by 0 on unsupported texture type - Coverity 1199697 - -2014-04-21 22:01:47 +1000 Jan Schmidt <jan@centricular.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - glcolorconvert: Fix bt709 conversion matrices. - Fix the sign on one entry in the bt.709 YUV->RGB conversion - matrix, and the corresponding inverse matrix. Fixes really - wrong colouring of some videos. - -2014-04-17 09:58:47 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: fix test for proper use count balancing - usecount is unsigned, so too many "unuse" will wrap the counter - around and the >= 0 check will always be fine. - It would be much simpler to just make the counter signed, but - moving the checks where the decrements happen allow a mistake - to be detected earlier, and thus easier to debug. - Coverity 1139791 - -2014-04-17 09:35:37 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mxf/mxfdemux.c: - mxfdemux: guard against NULL non source components - This component is dereferenced, and later code checking for - NULL in particular cases implies it can be NULL. This likely - does not fix the coverity warning as it was seeing another - path setting component to NULL explicitely, but this was - spotted by looking at: - Coverity 1139736 - Which is actually OK from what I can see since the actual - dereference of the explicit NULL pointer will not happen - if the condition that led to the NULL pointer assignment - is met, since the assignment and defeference have mutually - exclusive tests. - -2014-04-17 09:26:20 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/rawparse/gstaudioparse.c: - rawparse: catch errors in caps manipulation - Coverity 1139622 - -2014-04-18 20:12:37 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: fix complier error using fixed lenght arrays - -2014-04-18 18:12:36 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst/ivfparse/gstivfparse.c: - * gst/ivfparse/gstivfparse.h: - ivfparse: detect and propagate resolution changes. - Detect resolution changes on key frames, and propagate the resulting - caps to the src pad. Only the uncompressed data chunk is decoded, so - avoid using the new VP8 bitstream parsing library for now. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-04-18 17:34:08 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst/ivfparse/gstivfparse.c: - * gst/ivfparse/gstivfparse.h: - ivfparse: avoid possible division-by-zero when calculating PTS. - Avoid possible division-by-zero while deriving the presentation timestamp - of the buffer. The base class will take care of any interpolation needs. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-10-25 07:38:53 +0800 Halley Zhao <halley.zhao@intel.com> - - * configure.ac: - ivfparse: enable build. - Drop `ivfparse' element from the non-ported set of plugins in configure. - -2014-03-04 15:46:58 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst/ivfparse/gstivfparse.c: - * gst/ivfparse/gstivfparse.h: - ivfparse: port to baseparse. - https://bugzilla.gnome.org/show_bug.cgi?id=710855 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-01-24 08:37:16 +0800 Zhao, Halley <halley.zhao@intel.com> - - * tests/icles/Makefile.am: - * tests/icles/vp8parser-test.c: - tests: add standalone program for VP8 parser. - Add standalone test application that demonstrates how to use the new - VP8 bitstream parsing library, while also allowing simple debugging/ - tracing of IVF files. - clean-ups, updated to new parser API - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-01-08 02:49:00 +0800 Zhao, Halley <halley.zhao@intel.com> - - * tests/check/Makefile.am: - * tests/check/libs/vp8parser.c: - tests: add test for VP8 bitstream parsing library. - updated to new parser API - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-04-09 09:22:02 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/codecparsers/Makefile.am: - codecparsers: vp8: rename dboolhuff symbols. - Rename VP8 dboolhuff symbols so that to avoid clashes with libvpx when - static linking. - -2014-04-08 10:30:09 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/dboolhuff.AUTHORS: - * gst-libs/gst/codecparsers/dboolhuff.LICENSE: - * gst-libs/gst/codecparsers/dboolhuff.PATENTS: - * gst-libs/gst/codecparsers/dboolhuff.c: - * gst-libs/gst/codecparsers/dboolhuff.h: - * gst-libs/gst/codecparsers/gstvp8rangedecoder.c: - * gst-libs/gst/codecparsers/vp8utils.c: - codecparsers: vp8: add GStreamer native utilities. - Import libvpx 1.3.0 range decoder files (dboolhuff.ch) to implement - the VP8 utilities native interface. Likewise, copy and use the default - libvpx generated entropy probabilities tables. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-01-08 02:49:00 +0800 Zhao, Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/gstvp8parser.c: - * gst-libs/gst/codecparsers/gstvp8parser.h: - * gst-libs/gst/codecparsers/gstvp8rangedecoder.h: - * gst-libs/gst/codecparsers/vp8utils.h: - codecparsers: add VP8 bitstream parser. - https://bugzilla.gnome.org/show_bug.cgi?id=722760 - refactored, among other fixes - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-04-18 16:23:43 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Improve ts_to_offset code - * Search in current pending values first. For CBR streams we can very - easily end up having just one initial observations and then nothing - else (since the bitrate doesn't change). - * Use one group whether we are in that group *OR* if there is only - one group. - * If the group to use isn't closed (points are being accumulated in the - PCROffsetCurrent), use the latest data available for calculation - * If in the unlikelyness that all of this *still* didn't produce more - than one data point, just return the initial offset - -2014-04-18 16:20:31 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/gstmpegdefs.h: - tsdemux: Fix scaling macros - While the calculation done in these macros will work with 64bit - integers, they will fail if working with 32bit integers. - Force the scaling up to solve that. - This amazingly didn't introduce major issues up to now, but resulted - in bogus values in debug logs. - -2014-04-18 16:18:01 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Don't hard-flush the packetizer on discont buffers - Doing a hard flush on the packetizer will drop all observations, which - will eventually break push-based seeking (with BYTES segment) since - we won't know where to seek to anymore (new data would always be - considered as the beginning of the stream). - -2014-04-16 16:25:29 +0200 Edward Hervey <edward@collabora.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: Fix copy/paste error - We want to check whether the rate is different. We check changes in - numerator *and* denominator. - CID #1139631 - CID #1139642 - -2014-04-16 16:19:47 +0200 Edward Hervey <edward@collabora.com> - - * gst/mxf/mxftypes.c: - mxf: Handle fraction parsing failure - And properly cleanup/reset the segment before returning on errors - CID #206012 - -2014-04-16 16:12:02 +0200 Edward Hervey <edward@collabora.com> - - * gst/mxf/mxftypes.c: - mxf: Remove useless check - a guint will always smaller or equal to the maximum value it can - contain - CID #206049 - -2014-04-09 12:27:16 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mxf/mxfup.c: - mxf: avoid dereferencing NULL mapping data pointer - Also unref buffers on error, as it seems to be done in one, but - not all, error paths. - The NULL pointer part is Coverity 206112 - https://bugzilla.gnome.org/show_bug.cgi?id=727889 - -2014-04-16 16:07:17 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/camswclient.c: - dvb: Fix if() check - introduced by my previous commit :( - -2014-04-16 15:43:06 +0200 Edward Hervey <edward@collabora.com> - - * configure.ac: - configure: Detect EGL header presence - Fixes the build for Android, and I suspect for other systems too... - -2014-04-16 15:37:57 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/camsession.c: - dvb/camsession: Don't do operations on unexisting sessions - CID #206114 - -2014-04-16 15:32:32 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/camswclient.c: - dvb: Handle socket() failure - CID #206178 - -2014-04-16 15:23:57 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Handle failure to get statistics from the device - Check the ioctl return value and don't output bogus values. - CID #206016 - -2014-04-16 15:18:44 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Don't close a fd that wasn't open - We are handling the failure cases in this block where the open failed - CID #206179 - -2014-04-16 15:17:03 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Don't try to access NULL string - And refactor the pid setting code to be in its own function for clarity - CID #206374 - -2014-04-10 16:04:21 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add dvb ca identifier descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=727560 - -2014-04-10 16:03:07 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add scrambling descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=727560 - -2014-04-10 16:02:09 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add frequency list descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=727560 - -2014-04-10 16:00:50 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add data broadcast id descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=727403 - -2014-04-10 15:59:50 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add private data specifier descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=727403 - -2014-04-16 09:20:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - dvb: Minor code style fix - -2014-04-10 15:58:55 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add parential rating descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=727403 - -2014-04-10 15:58:04 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: add linkage descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=727403 - -2014-04-16 00:25:51 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: for loop initial declarations are only allowed in C99 mode - Fixes compiler warnings. - -2014-04-15 20:47:55 +0200 Sebastian Dröge <sebastian@centricular.com> - - * Makefile.am: - egl: Add libgstegl and eglgles plugin to the CRUFT directories - -2014-04-15 17:58:34 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * configure.ac: - * docs/plugins/Makefile.am: - * ext/Makefile.am: - * ext/eglgles/Android.mk: - * ext/eglgles/Makefile.am: - * ext/eglgles/TODO: - * ext/eglgles/gstegladaptation.c: - * ext/eglgles/gstegladaptation.h: - * ext/eglgles/gstegladaptation_eagl.m: - * ext/eglgles/gstegladaptation_egl.c: - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - * ext/eglgles/video_platform_wrapper.c: - * ext/eglgles/video_platform_wrapper.h: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/egl/Makefile.am: - * gst-libs/gst/egl/egl.c: - * gst-libs/gst/egl/egl.h: - * pkgconfig/Makefile.am: - * win32/common/config.h: - egl/eglglessink: remove since EGLImage and iOS support have been added in glimagesink - https://bugzilla.gnome.org/show_bug.cgi?id=703343 - -2014-03-24 12:08:43 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstgles2.h: - gl: allow to include GLES/gl.h - https://bugzilla.gnome.org/show_bug.cgi?id=703343 - -2014-04-14 07:56:16 +0200 Edward Hervey <edward@collabora.com> - - * ext/wayland/gstwaylandsink.c: - wayland: Remove dead assignment - We set it just after variable declaration - CID #1197709 - -2014-04-13 19:20:32 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - gl/eagl: Fix compilation - -2014-04-13 16:53:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - gl/eagl: Notify the window's resize callback about surface dimension changes - https://bugzilla.gnome.org/show_bug.cgi?id=728107 - -2014-04-13 16:46:11 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.h: - gl/eagl: Remove spurious private struct pointer - -2014-04-13 16:40:58 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/android/gstglwindow_android_egl.h: - gl/android: Notify the window's resize callback about surface dimension changes - https://bugzilla.gnome.org/show_bug.cgi?id=728107 - -2014-04-13 22:16:45 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: remove unused texture - -2014-04-13 22:14:52 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - glimagesink: move upload into _prepare() - -2014-04-13 13:49:22 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - gl/context: output available extensions - -2014-04-13 13:39:14 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - gl/context: provide get_gl_version - -2014-04-13 00:21:00 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/color: restore viewport dimensions when fbo done - Regression introduced by 95abfda1399bcddbee345d4542e857d743965477. - It caused to display the wrong frame size when resizing the window. - -2014-04-12 22:45:30 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - gl: Import QuartzCore/QuartzCore.h for CAEAGLLayer on older iOS versions - -2014-04-12 22:15:35 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstopengl.c: - gl: Set glimagesink rank to SECONDARY - This is a full-featured video sink now and especially should be - used instead of osxvideosink on OSX if available. - -2014-04-12 21:43:50 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/eagl/Makefile.am: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.h: - * gst-libs/gst/gl/eagl/gstglcontext_eagl.m: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.h: - * gst-libs/gst/gl/eagl/gstglwindow_eagl.m: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgles2.h: - * gst-libs/gst/gl/gstglwindow.c: - gl: Add support for iOS EAGL platform - https://bugzilla.gnome.org/show_bug.cgi?id=703341 - -2014-04-12 17:33:44 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: make gst_gl_window_cocoa_send_message_async re-entrant - Backends that use g_main_context_invoke are re-entrant. - Il allows to call two nested gst_gl_context_thread_add. - ex: init_upload / init_colorconvert - -2014-04-12 17:01:09 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: First handle GL window setup, then create the context and its thread - -2014-04-12 15:51:47 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - gl/cocoa: fix NSAutoreleasePool initialization - -2014-04-12 12:42:40 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: ensure to call NSApplication:sharedApplication in the main thread - "(NSApplication *)sharedApplication This method also makes a connection - to the window server and completes other initialization" - The implicit thing which is not mentioned is that it required - to be called in the main thread. - Fix a regression introduces by 82b7c915bb02a9790d256d599452e5a54afda633 - When using with gst-launch, it was not possible to click on the close - cross of the window anymore which is a bit anoying and also because - it's was possible before. - Prior to this commit the GstGLContextCocoaClass was initialized - in the main thread because gst_gl_context_new was called in the - state change function from going from ready to paused. - From this commit this call is done from the streaming thread. - So that the call to NSApplication sharedApplication; - was not done in the main thread anymore. - We now ensure that by assuming there is a GMainLoop running. - It's for debugging purpose so that's ok to do that. Also - note we already do this assumtion to run app itereations. - The regression had no consequence on the cocoa/videooverlay example - (that should be moved from gst-plugins-gl to -bad) because the - application is responsible for that necessary call. - -2014-04-12 14:40:40 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/color: fix warning type qualifiers ignored - i686-apple-darwin11-llvm-gcc-4.2 - "warning: type qualifiers ignored on function return type" - -2014-04-12 18:24:43 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/color: remove if statement with no effect - Coverity 1199698 - -2014-04-12 18:16:29 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglupload.c: - gl/color: pass large value by reference - Coverity 1199700 - -2014-04-02 12:59:58 -0700 Aleix Conchillo Flaqué <aleix@oblong.com> - - * ext/srtp/gstsrtp.c: - srtpdec: fix assertion checking ssrc from rtcp packets - rtcp_buffer_get_ssrc is called even with RTP buffers. this means we - might end up with an exception and not find any valid RTCP packet type - and thus hit GST_RTCP_TYPE_INVALID. we now take care of this. - https://bugzilla.gnome.org/show_bug.cgi?id=727512 - -2014-04-11 12:29:17 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/jp2kdecimator/gstjp2kdecimator.c: - jp2kdecimator: fix maybe-uninitialized compiler error - -2014-04-11 11:34:26 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - mpegtsmux: Remove unneeded unref - packet_buffer has already been cleared in all code paths leading - to this point. - CID #1199696 - -2014-04-11 08:39:29 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Handle symbols added in minor version 7 and 8 - Some symbols were re-defined in minor v8 (GO TEAM BACKWARDS COMPATIBLE!) - Some symbols were added in minor v7 - https://bugzilla.gnome.org/show_bug.cgi?id=727977 - -2014-04-11 17:24:39 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - gl/mem: cache the stride/unpack length for upload - -2014-04-11 17:23:32 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/color: explicitly map the buffers we are copying into - Otherwise it may not be downloaded at all. - -2014-04-11 08:16:01 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Add comment with all DVB API v5 minor changes - There wasn't a definite list anyway, so I just dove in the kernel - and extract all that information. - -2014-04-11 16:09:09 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl/color: cache the temporary textures - -2014-04-11 11:04:43 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - gl/mem: provide defines for tokens not defined in GLES2/ancient platforms - -2014-04-11 11:03:19 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl: fixup incorrect number of arguments - -2014-04-11 10:55:21 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcolorconvert.c: - gl: fix incorrect usage of g_return_if_fail - -2014-04-02 17:43:52 +1100 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * tests/check/libs/gstglmemory.c: - * tests/check/libs/gstglupload.c: - gl/mem: allocate the memory per plane - This patch provides the basic infrastructure required for this. - Upload and Download has been ported to this. - Has the nice effect of allowing GstGLMemory to be our - refcounted texture object for any texture type (not just RGBA). - Should not lose any features/video formats. - -2014-04-01 15:10:05 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/egl/gsteglimagememory.c: - gl/eglimage: #if 0 unused code - -2014-04-01 13:30:51 +1100 Matthew Waters <ystreet00@gmail.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * ext/gl/gstglimagesink.c: - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglcolorconvert.c: - * gst-libs/gst/gl/gstglcolorconvert.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - gl: add colorconvert object that converts between color spaces/formats - Currently used by both upload and download objects separately. - -2014-04-10 17:55:21 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: fix faac API error checking - Coverity 1139790 - -2014-04-10 17:52:02 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstplugin.c: - dashdemux: do not ignore failure to register typefinder - Coverity 1139629 - -2014-04-10 17:48:03 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - dashdemux: fix time leak - Coverity 1147016 - -2014-04-10 17:44:14 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - dashdemux: remove dead code and variable - A recent commit made stream not able to be NULL, ending up with - a flag being always set to FALSE when it matters. - Coverity 1146968, 1147012 - -2014-04-10 17:37:22 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/curl/gstcurlsmtpsink.c: - curl: remove unneeded NULL check - We just checked for NULL and allocated if it was. And glib aborts - if it can't allocate, I'm told. - Coverity 1139841 - -2014-04-10 17:33:55 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/curl/gstcurlbasesink.c: - curl: remove duplicate assignment - Coverity 1197708 - -2014-04-10 16:53:42 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Also update the sequence position when updating non-live playlists - -2014-04-10 14:59:57 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Try reloading the playlist first if downloading a fragment fails - But only add this for non-live playlists. For live playlists we already - have another thread that is periodically updating playlists. - Reason for this is that sometimes downloading a fragment can fail because - the URIs have changed or expired since last time. - -2014-04-10 14:46:01 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: When updating a non-live playlist make sure to find the current sequence by time - Sequence numbers in different playlists are not guaranteed to be the same for the - same position, e.g. fragments could have different durations in different playlists. - In theory we should do exactly the same for live playlists, but unfortunately we can't - because doing this kind of seeking requires the complete playlist since we started - playback. For live playlists the server is however dropping fragments in the beginning - over time and we have no absolute time references. - -2014-04-09 17:28:49 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - smoothstreaming: avoid using an uninitialized manifest - If we did not set the manifest yet, early out in the seeking query. - Coverity 1139737 - -2014-03-17 16:39:42 +0100 Thibault Saunier <tsaunier@gnome.org> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parse: Set framerate even for interlaced videos - Co-Authored by: Mathieu Duponchelle <mathieu.duponchelle@opencreed.com> - https://bugzilla.gnome.org/show_bug.cgi?id=726752 - -2014-04-09 10:04:46 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/Makefile.am: - * gst-libs/gst/mpegts/gst-atsc-section.c: - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - mpegts: add atsc terrestrial virtual channel table - https://bugzilla.gnome.org/show_bug.cgi?id=727460 - -2014-04-09 15:07:19 +0200 Santiago Carot-Nemesio <sancane@gmail.com> - - * gst/liveadder/liveadder.c: - liveadder: fix memory leak querying sink caps - https://bugzilla.gnome.org/show_bug.cgi?id=727894 - -2014-04-09 18:44:38 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/hls/gsthlssink.c: - hlssink: catch failure to write playlist file - Coverity 1139613 - -2014-04-09 18:31:31 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatespu.c: - kate: fix implicit promotion to signed int breaking on largeish inputs - Coverity 1139858, 1139857 - -2014-04-09 18:16:52 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/ladspa/gstladspasink.c: - ladspa: remove duplicate assignment - Coverity 1139706 - -2014-04-09 18:12:58 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: fix open error checking - Coverity 206364 - -2014-04-09 17:37:41 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/schroedinger/gstschrodec.c: - schrodec: remove unnecessary check - The tag was dereferenced earier. From the libschroedinger code, - it's not obvious to see whether tag and frame would be NULL at - the same time. I think is likely that both will be non NULL - here, but that's not certain. Additional tests may be needed - to avoid dereferencing tag and/or frame, but what to do if - only one is NULL isn't obvious, as the _get_tag function does - transfer ownership so isn't undoable. - Coverity 1139850 - -2014-04-09 17:10:06 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - smoothstreaming: remove unnecessary check - The function is static, the only call site passes a non NULL - pointer, and the pointer is dereferenced before anyway. - Coverity 1139839 - -2014-04-09 16:55:30 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/srtp/gstsrtpdec.c: - srtp: remove dead assignment - Coverity 1197707 - -2014-04-09 15:54:18 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - mpegts: fix sdt length check - It was originally test for 9 bytes (as the comment says) and was - rewritten buggily. So rewrite it a third way, which is now - hopefully consistent with the original and the comment, while - being more sense-making to humans. - Coverity 1139654 - -2014-04-09 16:00:24 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsmux/tsmux/tsmux.c: - Revert "tsmux: catch alloc failure" - Turns out glib aborts on allocation failure, so this is pointless. - We'll just ignore Coverity warnings on such constructs. - This reverts commit d347809a82e24057302f948269392e76aaacea10. - -2014-04-09 15:58:37 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegts: turns out glib aborts on allocation failure - So this is actually pointless. We'll just have to ignore - Coverity moaning on those. - Revert "mpegts: test for allocation failure" - This reverts commit 224cb81b8fcbf03df5e07f045ecb9ecf64189400. - -2014-04-09 15:44:10 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegts: test for allocation failure - While it's unlikely to get there, it silences the coverity warning - on the error code path that we test for NULL before freeing, when - all branches there are from locations where pmt cannot be NULL, - and removing the NULL check makes the code more vulnerable to a - hypothetical future branch from somewhere where it can be. - Coverity 1139852 - -2014-04-09 15:41:11 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - asfmux: remove unnecessary test - We've been dereferencing that object like there's no tomorrow - in the code just before that. - Coverity 206369 - -2014-04-09 15:37:55 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/asfmux/gstasfobjects.c: - asfmux: remove stray gst_buffer_unmap on error path - A previous commit removed the map, and the unmap on the main - code path, but not the one on the error path. - Coverity 1139930 - -2014-04-09 15:28:05 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: remove dead code - Those events were previously taken from a cached events list, - which was removed during the port to 0.11, but this bit stayed. - Coverity 1139684 - -2014-04-09 15:24:13 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: remove unneeded check - A message may not be NULL in the message handling function - (and nothing there sets it to NULL). - Coverity 1139848 - -2014-04-09 15:18:22 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/debugutils/gstcompare.c: - compare: special case empty regions with 1 SSIM to avoid dividing by 0 - Coverity 1139689, 1139688 - -2014-04-09 15:09:25 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/inter/gstintertest.c: - inter: remove dead code - Coverity 1139666 - -2014-04-09 15:03:45 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/liveadder/liveadder.c: - liveadder: remove dead code - From the 0.11 port - Coverity 1139676 - -2014-04-09 14:37:48 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/gstmpegdemux.c: - resindvd: avoid crashing in pathological case - When we'd see an unknown stream type, then a SDDS stream. - Then we'd get to the end of the switch with a NULL temp stream - pointer, and dereference it. - Coverity 1139708 - -2014-04-09 14:13:46 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtsdemux: catch prev-not-found when inserting in the group list - While this probably should never happen if callers are well behaved, - this avoids a crash if it does. With a warning about it. Unsure if - it'd be better to not add at all, but it should not happen... - Coverity 1139713 - -2014-04-09 13:51:41 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: guard against _dispose being called mutiple times - _dispose calls _reset, so we need to make sure _reset handles - already NULLed fields. - Coverity 1139843 - -2014-04-09 13:43:10 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsmux/tsmux/tsmux.c: - tsmux: prevent possible double free on error path - Spotted while looking at a Coverity issue in the area. - -2014-04-09 13:41:35 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsmux/tsmux/tsmux.c: - tsmux: catch alloc failure - While it will probably not trigger, it should silence a Coverity - warning about the fail code path testing for NULLness before - freeing, where the buffer was already dereferenced. It seems - safest to keep that test, in case future goto fail statements - happen to have a NULL buffer there. - Coverity 1139851 - -2014-04-09 11:43:23 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * sys/decklink/capture.cpp: - decklink: initialize priv to NULL - While the code that creates the object sets priv to some existing - pointer after new, this ensures any future new not doing this will - hit the various priv!=NULL asserts in the code. - Coverity 1139935 - -2014-04-09 11:15:10 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/speed/gstspeed.c: - speed: make duration query able to convert bytes to time - It was only querying in time, but then trying to use dead bytes - to time conversion code. - Coverity 1139677 - -2014-04-09 11:04:32 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: fix left crop change test - It was testing a noop - Coverity 1139643 - -2014-04-09 11:02:00 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusheader.c: - opus: add missing va_end in variadic function - Coverity 1139944 - -2014-04-09 11:00:22 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * sys/shm/shmpipe.c: - shm: remove dead code - Coverity 1139683 - -2014-04-09 10:56:16 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * sys/mfc/mfc_decoder/mfc_decoder.c: - mfc: reset "in use" flag on failure to initialize - -2014-04-09 10:55:46 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * sys/mfc/mfc_decoder/mfc_decoder.c: - mfc: test for allocation failure before dereferencing - Coverity 1139849 - -2014-04-09 10:33:10 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/mpeg2enc/gstmpeg2enc.cc: - mpeg2enc: remove dead assignment - Coverity 1139829 - -2014-04-09 10:28:46 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/gl/effects/gstgleffectlumatocurve.c: - * ext/gl/effects/gstgleffectlumatocurve.h: - * ext/gl/effects/gstgleffectrgbtocurve.c: - * ext/gl/effects/gstgleffectxray.c: - gl: pass large structure by const pointer, not value - Avoids large pointless memcpy. - Coverity 206236, 206237 - -2014-04-08 21:39:20 +0300 Mohammed Sameer <msameer@foolab.org> - - * gst/camerabin2/gstviewfinderbin.c: - camerabin: add any feature to viewfinderbin static pad template - https://bugzilla.gnome.org/show_bug.cgi?id=727857 - -2014-04-08 20:54:26 +0300 Mohammed Sameer <msameer@foolab.org> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: report an error if we fail to link vfsrc and viewfinder queue - https://bugzilla.gnome.org/show_bug.cgi?id=727855 - -2014-04-08 17:45:46 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: post proper error message when window disappears - -2014-04-08 17:34:13 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/flite/gstflitetestsrc.c: - flite: fix off by one in channel mask building - The first loop would shift 1 by 64, which is either undefined - or implementation defined, instead of clearing the top bit. - Coverity 1197691 - -2014-04-08 17:10:27 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/hls/m3u8.c: - hls: restore NULL test mistakenly removed - Thanks to tpm for point out I'm an idiot. - -2014-04-08 16:53:54 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/hls/gsthlsdemux.c: - hls: only set DISCONT flag on a valid buffer - Recent refactoring causes this code to be called with either a NULL - fragment, or a non NULL fragment. In the former case, we don't have - a buffer. In the latter case, the original code dealing with DISCONT - assumed the buffer was valid. Testing for a NULL buffer here thus - does not seem to change the intent, and fixes: - Coverity 1195147 - -2014-04-08 16:53:41 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: guard against NULL material track - Just to be on the safe side. - -2014-04-08 16:46:56 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/hls/m3u8.c: - hls: bring NULL test before dereference - Coverity 1195168 - -2014-04-08 16:23:50 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/gl/gstglmosaic.c: - * ext/gl/gstglvideomixer.c: - gl: test for frame NULLness before dereferencing it - Coverity 1195172, 1195171 - -2014-04-09 00:44:08 +1000 Jan Schmidt <jan@centricular.com> - - * gst/dvbsuboverlay/dvb-sub.c: - dvbsuboverlay: Avoid infinite loops on short data - -2014-04-08 16:09:16 +0100 Tim-Philipp Müller <tim@centricular.com> - - * sys/dvb/camswclient.c: - dvb: fix compilation - -2014-04-08 15:54:01 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/gl/egl/gsteglimagememory.c: - gl: fix leaks - As the relevant variables are initialized to 0/NULL, we can loop - over the full range and make sure we free partial allocations - when an error happens partway through initialization. - -2014-04-08 15:26:04 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * sys/dvb/camswclient.c: - dvb: reject too long socket paths - Coverity 206004 - -2014-04-08 14:33:06 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: implement simple KEY_UNIT seeking - If a KEY_UNIT seek was requested, adjust segment - start to position of the key frame. - -2014-04-08 14:24:31 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/resindvdsrc.c: - resindvd: guard against overflow in audio subtitle streams - Turns out there was the same issue as with subtitles. - There is space for a single audio stream, but up to 255 - may be used based on a uint8_t value in a struct, which may - or may not be read from the (untrusted) data. - A comment in ifo_types.h says this value is either 0 or 1, so - we can ensure this here without drawbacks. - Coverity 1139585 - -2014-04-08 14:19:29 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/resindvdsrc.c: - resindvd: guard against overflow in menu subtitle streams - There is space for a single subtitle stream, but up to 255 - may be used based on a uint8_t value in a struct, which may - or may not be read from the (untrusted) data. - A comment in ifo_types.h says this value is either 0 or 1, so - we can ensure this here without drawbacks. - Coverity 1139586 - -2014-04-08 13:26:49 +0100 Tim-Philipp Müller <tim@centricular.com> - - * gst/mxf/mxfdemux.c: - mxfdemux: fix seeking, send data starting from a key unit - Fixes multiple seeking issues. When doing ACCURATE or normal - non-KEYUNIT seeks, mxfdemux would just send data from the - edit unit that covered the seek position, whether that's - a keyframe or not. Decoders would only output things from - the next keyframe then, which means there's a gap between - the start of the segment and the first decoded data in - some cases. In combination with gst-editing-services this - might result in a frozen picture for the duration of that - gap at the beginning (if videorate fixes up the first - buffer's start timestamp to cover the entire gap), or - a black frame (if no videorate is used and videomixer - fills the gap). Also fixes A/V sync issue when requesting - a KEYUNIT seek. - -2014-04-08 12:37:30 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dts/gstdtsdec.c: - dtsdec: fix buffer overflows - Channels can be up to 7. Also add a guard in case more can be - returned in the future. - Coverity 1139820, 1139821 - -2014-04-08 13:20:54 +0200 Xavi Artigas <xartigas@fluendo.com> - - * sys/directsound/gstdirectsoundsrc.c: - directsoundsrc: Fix critical due to missing debug category initialization - https://bugzilla.gnome.org/show_bug.cgi?id=727812 - -2014-04-08 12:20:40 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/festival/gstfestival.c: - festival: fix fd leak - Coverity 1139831 - -2014-04-08 11:26:38 +0200 Edward Hervey <edward@collabora.com> - - * gst/speed/gstspeed.c: - speed: Clarify passthrough in switch statement - We do want the caps event to be forwarded downstream - CID #1139754 - -2014-04-08 11:23:50 +0200 Edward Hervey <edward@collabora.com> - - * ext/soundtouch/gstpitch.cc: - soundtouch: Add missing break in switch - Whoops, modifying the pitch when modifying the output rate ... - CID #1139749 - -2014-04-08 11:21:44 +0200 Edward Hervey <edward@collabora.com> - - * ext/rsvg/gstrsvgoverlay.c: - rsvg: Add missing break in switch statement - This wasn't fatal before (worst case it would clear an already empty - adapter). - CID #1139758 - -2014-04-08 11:20:29 +0200 Edward Hervey <edward@collabora.com> - - * ext/mpeg2enc/gstmpeg2enc.cc: - mpeg2enc: Add missing break in switch - QUERY_CAPS is fully handled, we don't need to passthrough to the default - handler. - CID #1139756 - -2014-04-08 09:51:08 +0200 Edward Hervey <edward@collabora.com> - - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2enc.c: - bz2: Initialize variables - There is a small chance that we might end up in the done step without - having any output available. - Furthermore, when going through not_ready, we need to ensure gst_buffer_unmap - has a properly initialized GstMapInfo. - CID #1139923 - CID #1139924 - CID #1139919 - CID #1139920 - -2014-04-08 07:48:28 +0200 Edward Hervey <edward@collabora.com> - - * tests/check/elements/mpegtsmux.c: - check: Fix mpegtsmux caps - Incoming streams need to be parsed. Doesn't fix the test completely though - -2014-04-08 07:47:15 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Initialize helper mpegts library - We now use that library, we need to initialize it so that debug - categories (amongst other things) get properly initialized - -2014-04-07 13:25:56 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mxf/mxfdms1.c: - mxf: fix stop date parsing using the wrong input - Coverity 1139645 - -2014-04-07 13:22:22 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/jp2kdecimator/jp2kcodestream.c: - jp2kdecimator: fix copy/paste errors in expressions - Correct formulae found in ITU T.800, B.12.1.345 - Coverity 1139649, 1139650, 1139651 - -2014-04-04 15:30:20 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * tests/check/elements/shm.c: - tests: fix shm test deadlock - The test was not bringing the source back to NULL, so its thread - could start creating a buffer while the pads were being shutdown. - -2014-04-06 11:57:12 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/gl/gstglimagesink.c: - glimagesink: Create GL context and set up window from the streaming thread - gst_gl_context_create() might need to dispatch some operations to the - application's main thread, and calling this in the change_state function - can cause deadlocks. - -2014-04-04 09:19:39 +0200 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - configure: Fix check for iOS for the OpenGL support - There is also an i386 version of iOS, which is for the simulator. - Better use our already existing HAVE_IOS check instead of relying - on the host triplet. - -2014-04-03 11:54:41 +0200 Wim Taymans <wtaymans@redhat.com> - - * ext/timidity/gstwildmidi.c: - wildmidi: fix possible uninitialized variables - -2014-04-03 11:48:07 +0200 Wim Taymans <wtaymans@redhat.com> - - * ext/dash/gstmpdparser.c: - mpdparse: only add location when node existed - Actually return FALSE when the location node was non-existing - Only add the location node when it existed - -2014-04-02 23:49:37 +0200 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Require parsed/framed input for most of the supported formats - https://bugzilla.gnome.org/show_bug.cgi?id=719519 - -2014-04-02 23:08:36 +0200 Sebastian Dröge <sebastian@centricular.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Only pass a dest rectangle if set, otherwise pass NULL - Call with an uninitialized rectangle will cause errors. - https://bugzilla.gnome.org/show_bug.cgi?id=714998 - -2014-04-02 13:48:02 +0100 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/libs/gstglmemory.c: - * tests/check/libs/gstglupload.c: - tests: fix gl unit tests for recent API changes - -2014-04-02 23:05:47 +1100 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - gl: pass video info's by reference - -2014-04-02 23:05:11 +1100 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglmosaic.c: - * ext/gl/gstglvideomixer.c: - gl: fix array initialization - -2014-04-02 22:54:55 +1100 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglbumper.c: - glbumper: remove redundant check - -2014-04-02 22:53:10 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - gl/glx: use the context's display rather than asking for the window's - -2014-04-02 22:43:41 +1100 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglmosaic.c: - * ext/gl/gstglvideomixer.c: - gl: fix assignment of temporary variables - -2014-04-02 22:42:50 +1100 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - gl: avoid adding a NULL pool to propose allocation - -2014-04-02 12:38:28 +1100 Matthew Waters <ystreet00@gmail.com> - - * configure.ac: - gl/win32: actually build the gl plugins on win32 - Regression from c8ff215b02ee178513e076e2dfbd14e9ce77ec49 - -2014-04-02 09:29:56 +1100 Matthew Waters <ystreet00@gmail.com> - - * configure.ac: - gl/win32: fix detection of GL/wglext.h - Was resulting in 'present but cannot be compiled' errors - -2014-04-01 21:48:26 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - gl: fix detection of extensions with GL versions < 3 - Mesa, for example returns valid pointers for glGetIntegerv and - glGetStringi even if the gl version is less than that required for - both those functions to supposedly exist. - https://bugzilla.gnome.org/show_bug.cgi?id=727324 - -2014-03-30 21:02:45 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: fix docs - Signed-off-by: Stefan Ringel <linuxtv@stefanringel.de> - https://bugzilla.gnome.org/show_bug.cgi?id=727356 - -2014-03-30 21:02:10 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gstmpegts-private.h: - mpegts: add dvb-t2 delivery system descriptor - Signed-off-by: Stefan Ringel <linuxtv@stefanringel.de> - https://bugzilla.gnome.org/show_bug.cgi?id=727356 - -2014-03-24 17:44:47 +0100 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: bugfix delivery system descriptors - Signed-off-by: Stefan Ringel <linuxtv@stefanringel.de> - https://bugzilla.gnome.org/show_bug.cgi?id=726979 - -2014-03-27 21:22:32 +0100 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: use GST_READ_UINT32_BE - Signed-off-by: Stefan Ringel <linuxtv@stefanringel.de> - https://bugzilla.gnome.org/show_bug.cgi?id=727187 - -2014-03-27 21:21:23 +0100 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegts: add parsing data broadcast descriptor - Signed-off-by: Stefan Ringel <linuxtv@stefanringel.de> - https://bugzilla.gnome.org/show_bug.cgi?id=727187 - -2014-03-27 21:18:36 +0100 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegts: add parsing stream identifier - Signed-off-by: Stefan Ringel <linuxtv@stefanringel.de> - https://bugzilla.gnome.org/show_bug.cgi?id=727187 - -2014-03-27 13:56:26 +0100 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: use glib alloc and free - Signed-off-by: Stefan Ringel <linuxtv@stefanringel.de> - https://bugzilla.gnome.org/show_bug.cgi?id=727159 - -2014-03-29 17:26:03 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: use correct print format for gint64 - https://bugzilla.gnome.org/show_bug.cgi?id=727385 - -2014-03-30 18:52:38 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Handle errors when switching playlists properly - -2014-03-30 18:12:07 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Go EOS if the end of the segment is reached - -2014-03-30 18:06:51 +0200 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Store buffer end position in segment.position - -2014-03-29 10:19:52 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Fix typo in debug output - -2014-03-28 18:27:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: Copy over DISCONT flag from input buffers - -2014-03-28 18:11:21 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Push next buffer after a discont with the DISCONT flag - -2014-03-28 17:32:56 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Drain remaining data on disconts - -2014-03-28 17:25:02 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Flush if we receive a discont buffer - -2014-03-28 17:24:46 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Don't dereference NULL if flushed before a program was selected - -2014-03-27 19:42:52 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Ensure that all pending data is pushed even if the stream was not activated before - gst_ts_demux_push_pending_data() will check if it now can activate the - stream and add the pad, we don't have to check that ourselves. - Fixes playback of very short MPEG TS files. - -2014-03-27 19:22:03 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Fix pull mode scanning for PCR on small files - If a file does not contain 5 PCRs until it is EOS, or does not - contain more than 655360 bytes the PCR scanning algorithm just - aborted. - -2014-03-26 22:25:07 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Don't set the segment offset - It's causing wrong running times after seeks or bitrate - switches. - -2014-03-26 07:32:43 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Set DISCONT flag on all buffers in reverse playback mode - -2014-03-26 07:25:13 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Fix forwards and backwards searching in the files list - -2014-03-26 07:24:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Unset DTS of all buffers - We won't get a valid DTS from the source. - -2014-03-26 07:22:54 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Send flush start event before waiting for the tasks to finish - Otherwise we'll wait until buffers are completely processed downstream, - which might take quite some time. - -2014-03-09 19:31:31 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: Implement trick modes via I-frame variant lists - -2014-03-09 18:24:50 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: Implement parsing of #EXT-X-I-FRAME-STREAM-INF - These are I-frame-only variant lists that can be used - for trick mode playback. - -2014-03-28 20:22:43 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/egl/Makefile.am: - gl: egl: fix distcheck and out of source build - -2014-03-28 20:47:36 +0100 Rico Tzschichholz <ricotz@ubuntu.com> - - * ext/Makefile.am: - * gst-libs/gst/gl/Makefile.am: - build: Fix make dist - -2014-03-28 19:46:33 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/Makefile.am: - tests: fix LDADD order for insertbin test - -2014-03-28 19:41:25 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/Makefile.am: - tests: don't link codecparser tests twice to the lib - -2014-03-28 19:30:16 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/Makefile.am: - tests: fix build of gl unit tests in uninstalled setup - Put local .la files first, and add link to libgstvideo - for tests that use the libgstvideo API directly. - -2014-03-27 22:41:02 +1100 Matthew Waters <ystreet00@gmail.com> - - * configure.ac: - gl/win32: allow not building the gl plugins - Fixes build on windows if <GL/wglext.h> headers are not present. - https://bugzilla.gnome.org/show_bug.cgi?id=727125 - -2014-03-28 11:54:45 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: unref last buffer on DRAIN - Similar to 093574053fae243ec5fcfd6adae8185053b1e896 - in gstbasesink - https://bugzilla.gnome.org/show_bug.cgi?id=726107 - -2014-03-27 18:51:59 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@sisa.samsung.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: fix wrong doc block for create_window - Wrong since 1ad253b9 when prop name was changed from - can_create_window to create_window. - -2014-03-27 22:02:22 +1100 Matthew Waters <ystreet00@gmail.com> - - * configure.ac: - gl: don't fail configure if we do not understand the platform - -2014-03-25 15:40:14 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/android/Makefile.am: - * gst-libs/gst/gl/cocoa/Makefile.am: - * gst-libs/gst/gl/dispmanx/Makefile.am: - * gst-libs/gst/gl/win32/Makefile.am: - gl: fix out-of-source builds pt2 - 21b897de2f762bee504cbc007fd108148ee5ae24 did this for x11 and wayland. - Do it for the other backends as well. - -2014-03-26 23:13:53 +0000 Julien Isorce <julien.isorce@gmail.com> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gstglfilter.c: - gl: only set CAPS_FEATURE_MEMORY_EGL_IMAGE on egl platform - -2014-03-26 17:14:40 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * configure.ac: - configure.ac: fix OSX host check - Makes the check works with (i386|x86_64)-apple-darwin* hosts. - https://bugzilla.gnome.org/show_bug.cgi?id=727104 - -2014-03-26 19:17:03 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/gl/gstglimagesink.c: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstglfilter.c: - gl: let the user includes itself our egl headers if needed - Forgot to address this change. - https://bugzilla.gnome.org/show_bug.cgi?id=703343 - -2014-03-22 22:01:49 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - gl: add EGLImage support - * picked from old libgstegl: - - GstEGLImageMemory - - GstEGLImageAllocator - - last_buffer management from removed GstEGLImageBufferPool - * add-ons: - - GstEGLImageMemory now old a reference on GstGLContext - so that it can delete the EGLImage and its gltexture source - while having the associated gl context being current. - - add EGLImage support for GstVideoGLTextureUploadMeta which - mainly call EGLImageTargetTexture2D - - GstGLBufferPool now supports GstEGLImageAllocator - - glimagesink / glfilters / etc.. now propose GstEGLImageAllocator - to upstream - https://bugzilla.gnome.org/show_bug.cgi?id=703343 - -2014-03-24 12:12:42 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * configure.ac: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/egl/Makefile.am: - gl: deploy egl headers in gst/gl/egl instead of gst/gl - https://bugzilla.gnome.org/show_bug.cgi?id=703343 - -2014-03-24 12:10:00 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/x11/Makefile.am: - gl: remove commented and unsued code in x11 Makefile.am - https://bugzilla.gnome.org/show_bug.cgi?id=703343 - -2014-03-23 21:55:34 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * configure.ac: - * pkgconfig/Makefile.am: - pkgconfig: add gstreamer-gl - https://bugzilla.gnome.org/show_bug.cgi?id=703343 - -2014-03-24 12:04:08 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglcontext.c: - gl: fix crash if _build_extension_string is not called - On GLES2 then (gl->GetIntegerv && gl->GetStringi) is false - regression introduced by cc6df204e2f58fffda5cbe90f3450aeba95889c4 - https://bugzilla.gnome.org/show_bug.cgi?id=703343 - -2014-03-26 10:14:36 +0100 Edward Hervey <bilboed@bilboed.com> - - * configure.ac: - gl: Only enabled cocoa backend on osx (and not ios) - ios requires using EAGL - -2014-03-26 09:05:15 +1100 Jan Schmidt <jan@centricular.com> - - * ext/rtmp/gstrtmpsink.c: - rtmpsink: Remove URL check for valid playpath. - The playpath is an optional component of the URL - don't require it. - -2014-03-25 17:39:18 +0100 Wim Taymans <wtaymans@redhat.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: unlock object lock before posting error - Posting an error with the object lock will deadlock. Rework the code - a bit to make things more simple. - -2014-03-25 15:04:14 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - * gst-libs/gst/codecparsers/gstmpegvideometa.h: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: cosmetics: drop TAB characters. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-03-25 21:40:11 +1100 Jan Schmidt <jan@centricular.com> - - * gst/dvbsuboverlay/dvb-sub.c: - dvbsuboverlay: Clarify confusing debug message - The message is describing the number of bytes remaining for - parsing, not 'missing'. - -2014-03-25 21:40:11 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - tsdemux: Fix mpegts_packetizer_set_current_pcr_offset() - When adjusting the PCR offset of groups, adjust the correct group - entry from the list - not the current group repeatedly. - -2014-03-25 21:40:11 +1100 Jan Schmidt <jan@centricular.com> - - * gst/dvbsuboverlay/dvb-sub.c: - dvbsuboverlay: Remove warning for 2-bit and 8-bit subpictures - Both 2-bit and 8-bit mode now seem fine, so remove the warning - messages about them - -2014-03-25 21:40:10 +1100 Jan Schmidt <jan@centricular.com> - - * gst/dvbsuboverlay/dvb-sub.c: - dvbsuboverlay: Fix 8-bit subpicture rendering. - Fix 2 small flaws handling 8-bit subpictures that makes - my one test file work. - -2013-03-08 09:57:22 +0800 Li Xiaowei <xiaowei.a.li@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix slice_header() parsing for MVC. - The idr_pic_id syntax element depends on IdrPicFlag, which is a calculated - value that does not only depend on NAL unit type (IDR), but possibly also - on MVC non_idr_flag syntax element. - The computed idr_pic_flag is already stored in GstH264NalUnit structure. - https://bugzilla.gnome.org/show_bug.cgi?id=721772 - Signed-off-by: Li Xiaowei <xiaowei.a.li@intel.com> - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2012-10-01 09:48:06 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: add gst_h264_parse_nalu_header() helper. - Add helper to parse the NALU header. Move bounds checking to there. - https://bugzilla.gnome.org/show_bug.cgi?id=685215 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2012-10-01 09:37:21 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: add gst_h264_parse_sps_data() helper. - Split seq_parameter_set_data() parsing off gst_h264_parse_sps() so - that it could be re-used later on. - https://bugzilla.gnome.org/show_bug.cgi?id=685215 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2012-09-26 18:46:36 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: complete set of NAL unit types. - Add missing NAL unit types. They are mostly related to alpha blending, - scalable video coding extensions (SVC, Annex.G), and multiview video - coding extensions (MVC, Annex.H). - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-03-24 19:27:44 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: clean-up gst_h264_parser_parse_sei_message(). - Fix build when GST_DISABLE_GST_DEBUG is not defined. Use a switch - statement to dispatch to the various SEI payload handlers. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-03-21 17:07:19 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/nalutils.c: - * gst-libs/gst/codecparsers/nalutils.h: - codecparsers: h264: fix skipping of unsupported SEI messages. - The payloadSize does not account for emulation prevention bytes. So, - just use nal_reader_skip() for skipping payload_size bits. It should - be possible to further optimize this code since the NAL reader shall - be aligned to byte boundary already. - Kill the now unused nal_reader_skip_to_next_byte() function. - https://bugzilla.gnome.org/show_bug.cgi?id=726829 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-03-21 17:03:36 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix SEI buffering_period() parsing. - Fix parsing of buffering_period() SEI messages. The number of bits - used to express {nal,vcl}_initial_cpb_removal_delay{,_offset} syntax - elements is not 5 but 1 + initial_cpb_removal_delay_length_minus1. - https://bugzilla.gnome.org/show_bug.cgi?id=726828 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2012-10-10 16:19:49 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/nalutils.c: - codecparsers: h264: fix rbsp_more_data() implementation. - Account for trailing zero bits when checking for rbsp_more_data(). - In particular, fix an hypothetical stream whereby rbsp_more_data() - is called in the following conditions for PPS header: NalReader - reached position 20, 12 bits are remaining and trailing data at - current byte position is c8 00. - rbsp_more_data() used to return TRUE whereas it should obviously - return FALSE because x8 00 represents a valid rbsp_trailing_bits() - structure. - https://bugzilla.gnome.org/show_bug.cgi?id=685890 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-03-24 17:33:00 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * ext/gl/Makefile.am: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/wayland/Makefile.am: - * gst-libs/gst/gl/x11/Makefile.am: - gl: fix out-of-source builds. - Always use the locally generated <gst/gl/gstglconfig.h> file. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2014-03-25 00:50:30 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldownload.c: - gl/download: add support for the bt709 color matrix - -2014-03-25 00:34:13 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload: add support for the bt709 color matrix - -2014-03-24 23:09:20 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/cocoa/Makefile.am: - * gst-libs/gst/gl/dispmanx/Makefile.am: - * gst-libs/gst/gl/wayland/Makefile.am: - * gst-libs/gst/gl/win32/Makefile.am: - * gst-libs/gst/gl/x11/Makefile.am: - gl: remove explicit reference to X_CFLAGS - They are in GL_CFLAGS if required - -2014-03-23 23:43:28 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - gl/upload: remove the legacy GL 1.x upload path - uploading requires shaders and fbos available in GL2. - -2014-03-23 11:02:08 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglcontext.c: - gl: fallback to glGetString if GL_NUM_EXTENSIONS fails - Need it on MacOSX 10.7.5 - -2014-03-23 01:02:03 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/Makefile.am: - * gst-libs/gst/gl/glprototypes/all_functions.h: - gl: and update the Makefile - -2014-03-23 00:38:16 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/all_functions.h: - * gst-libs/gst/gl/glprototypes/base.h: - * gst-libs/gst/gl/glprototypes/blending.h: - * gst-libs/gst/gl/glprototypes/eglimage.h: - * gst-libs/gst/gl/glprototypes/fbo.h: - * gst-libs/gst/gl/glprototypes/fixedfunction.h: - * gst-libs/gst/gl/glprototypes/gles.h: - * gst-libs/gst/gl/glprototypes/gles1.h: - * gst-libs/gst/gl/glprototypes/gles1_functions.h: - * gst-libs/gst/gl/glprototypes/gles2_functions.h: - * gst-libs/gst/gl/glprototypes/gles3opengl.h: - * gst-libs/gst/gl/glprototypes/opengl.h: - * gst-libs/gst/gl/glprototypes/opengl_functions.h: - * gst-libs/gst/gl/glprototypes/shaders.h: - * gst-libs/gst/gl/gstglapi.h: - gl: reorganize the extension headers by function rather than api - -2014-03-21 20:29:49 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - gl/win32: use the correct include and gst-indent - -2014-03-21 15:56:16 +0100 Wim Taymans <wtaymans@redhat.com> - - * tests/check/elements/mpegvideoparse.c: - check: fix make check - The mpeg parser now flags the stream as mpeg2 if there is a picture - extension header, so remove it for mpeg1 data. - -2014-03-18 09:16:25 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - gl: use wglCreateContextAttribsARB to create share context - https://bugzilla.gnome.org/show_bug.cgi?id=726494 - -2014-03-17 20:43:35 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - gl/mixer: fix download check for failure - -2014-03-17 20:40:51 +0100 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/gstgltestsrc.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - gl: silence a critical if upstream does not provide us with meta params - -2014-03-19 13:48:10 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/gl/gstopengl.c: - * gst-libs/gst/gl/gstglapi.h: - gl: silence warnings building for RPI related to 'vcos_*' - Similar than 1190a79b199584cfc4dd62c474531c32cfbba425 - -2014-03-19 13:45:35 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/gl/gstopengl.c: - * gst-libs/gst/gl/android/gstglwindow_android_egl.h: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/egl/gstgldisplay_egl.h: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.h: - gl: keep only one occurence of '#include <EGL/egl.h>' - To simply maintainance if we need to put specific includes around it. - -2014-03-16 01:25:10 +0100 Edward Hervey <edward@collabora.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Don't forward text gap events downstream - That gap is only for the subtitle stream and not for the video stream. - -2014-03-18 00:11:09 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - gl: don't default to GST_GL_HAVE_WINDOW_DISPMANX=1 - Mistake introduced by 2a0f0399ae226089c2ba07b1b904741b856f37af - https://bugzilla.gnome.org/show_bug.cgi?id=726591 - -2014-03-18 00:08:50 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/glprototypes/gstgl_compat.h: - * tests/examples/gtk/gstgtk.c: - gl: fix the use of always-defined macros - After 2a0f0399ae226089c2ba07b1b904741b856f37af GST_GL_* macros are always - defined to 0 or 1. Don't use #ifdef ... or #if defined() on them. - https://bugzilla.gnome.org/show_bug.cgi?id=726591 - -2014-03-18 00:07:43 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - gl: check for X unconditionally - Without this the HAVE_X macro is empty, not "no" or "yes", which is not - what the later code is counting on. - https://bugzilla.gnome.org/show_bug.cgi?id=726591 - -2014-03-17 17:35:22 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * configure.ac: - gl: set default value to 0 for all definitions that go to gstglconfig.h - To avoid warnings like "GST_GL_HAVE_OPENGL is not defined". - As we are using #if instead of #ifdef - -2014-03-17 15:49:37 +0100 Matthew Waters <ystreet00@gmail.com> - - * configure.ac: - gl: allow not building the gl library plugins - -2014-03-17 15:16:13 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - gl: add GModule libs for win32 - -2014-03-17 15:06:25 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - gl: only link against gstegl if we are using egl - Assuming if we are building egl that the egl library is built - -2014-03-17 15:05:24 +0100 Matthew Waters <ystreet00@gmail.com> - - * configure.ac: - gl: add the option of disabling cocoa on OS X using --disable-cocoa - -2014-03-17 14:37:13 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - gl: add path of the gstegl library - Temporary until we merge the two libraries - -2014-03-17 14:26:31 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - Revert "gl: add dep on gstegl" - It was already in _LIBADD - This reverts commit b10a3530804335fc3b9494603ef78ce9417c3bc8. - -2014-03-17 14:11:14 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - gl: add dep on gstegl - Temporary until we merge the two libraries - -2014-03-17 14:06:22 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - gl/cocoa: Fix debug statements and platform - -2014-03-17 12:32:26 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * configure.ac: - gl: set HAVE_EGL_RPI to yes if HAVE_GL and RPI - Which fixes build on Raspberry Pi since -gl has been moved to -bad - -2014-03-17 12:04:40 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/gl/cocoa/Makefile.am: - gl: Fix static build with objective-C - --tag=CC is needed for static build - -2014-03-17 12:00:09 +0100 Thijs Vermeir <thijsvermeir@gmail.com> - - * configure.ac: - * ext/Makefile.am: - make: whitespace cleanups - -2014-03-17 10:56:39 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstgldisplay_egl.c: - * gst-libs/gst/gl/egl/gstgldisplay_egl.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - gl: Add EGLDisplay display subclass - -2014-03-17 10:44:32 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglwindow.c: - gl/window: add a dummy window class - Effective for the case where we have a platform that does not - require a native window. We require a mainloop to run the GL - commands which is currently operated by GstGLWindow. - -2014-03-17 08:10:50 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglutils.c: - gl: fix undeclared symbol when building without GST_DEBUG - -2014-03-16 18:55:03 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglutils.c: - gl: fix a double unref of the query when building without X - -2014-03-16 16:36:06 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: handle video/x-raw(ANY) if downstream supports the GstVideoOverlayCompositionMeta API - https://bugzilla.gnome.org/show_bug.cgi?id=726463 - -2014-03-16 17:21:38 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglutils.c: - gl: silence a compiler warning about missing prototypes - -2014-03-14 19:03:36 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglutils.c: - gl/utils: add x11 GstContext handling - https://bugzilla.gnome.org/show_bug.cgi?id=726360 - -2014-03-16 15:34:11 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - gl: define GL_NUM_EXTENSIONS if not defined - -2014-03-16 15:08:23 +0100 Matthew Waters <ystreet00@gmail.com> - - * configure.ac: - * docs/libs/Makefile.am: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * ext/Makefile.am: - * gst-libs/gst/Makefile.am: - * tests/check/Makefile.am: - * tests/check/libs/.gitignore: - Move gst-plugins-gl to bad - -2014-03-16 15:06:37 +0100 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/effects/gstgleffectbulge.c: - * ext/gl/effects/gstgleffectfisheye.c: - * ext/gl/effects/gstgleffectglow.c: - * ext/gl/effects/gstgleffectidentity.c: - * ext/gl/effects/gstgleffectlumatocurve.c: - * ext/gl/effects/gstgleffectmirror.c: - * ext/gl/effects/gstgleffectrgbtocurve.c: - * ext/gl/effects/gstgleffectsin.c: - * ext/gl/effects/gstgleffectsquare.c: - * ext/gl/effects/gstgleffectsqueeze.c: - * ext/gl/effects/gstgleffectstretch.c: - * ext/gl/effects/gstgleffecttunnel.c: - * ext/gl/effects/gstgleffecttwirl.c: - * ext/gl/effects/gstgleffectxray.c: - * ext/gl/gstgldifferencematte.h: - * ext/gl/gstglfilterapp.h: - * ext/gl/gstglfilterblur.h: - * ext/gl/gstglfiltercube.h: - * ext/gl/gstglfilterglass.h: - * ext/gl/gstglfilterlaplacian.h: - * ext/gl/gstglfilterreflectedscreen.c: - * ext/gl/gstglfilterreflectedscreen.h: - * ext/gl/gstglfiltershader.h: - * ext/gl/gstglfiltersobel.h: - * ext/gl/gstgloverlay.h: - * ext/gl/gstopengl.c: - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshadervariables.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglmemory.c: - * tests/check/libs/gstglupload.c: - gl: silence all the compiler warnings - -2014-03-16 11:23:16 +0100 Matthew Waters <ystreet00@gmail.com> - - * ext/gl/BUGS: - * ext/gl/Makefile.am: - * ext/gl/effects/gstgleffectbulge.c: - * ext/gl/effects/gstgleffectfisheye.c: - * ext/gl/effects/gstgleffectglow.c: - * ext/gl/effects/gstgleffectidentity.c: - * ext/gl/effects/gstgleffectlumatocurve.c: - * ext/gl/effects/gstgleffectlumatocurve.h: - * ext/gl/effects/gstgleffectmirror.c: - * ext/gl/effects/gstgleffectrgbtocurve.c: - * ext/gl/effects/gstgleffectscurves.h: - * ext/gl/effects/gstgleffectsin.c: - * ext/gl/effects/gstgleffectsquare.c: - * ext/gl/effects/gstgleffectsqueeze.c: - * ext/gl/effects/gstgleffectssources.c: - * ext/gl/effects/gstgleffectssources.h: - * ext/gl/effects/gstgleffectstretch.c: - * ext/gl/effects/gstgleffecttunnel.c: - * ext/gl/effects/gstgleffecttwirl.c: - * ext/gl/effects/gstgleffectxray.c: - * ext/gl/gltestsrc.c: - * ext/gl/gltestsrc.h: - * ext/gl/gstglbumper.c: - * ext/gl/gstglbumper.h: - * ext/gl/gstglcolorscale.c: - * ext/gl/gstglcolorscale.h: - * ext/gl/gstgldeinterlace.c: - * ext/gl/gstgldeinterlace.h: - * ext/gl/gstgldifferencematte.c: - * ext/gl/gstgldifferencematte.h: - * ext/gl/gstgleffects.c: - * ext/gl/gstgleffects.h: - * ext/gl/gstglfilterapp.c: - * ext/gl/gstglfilterapp.h: - * ext/gl/gstglfilterblur.c: - * ext/gl/gstglfilterblur.h: - * ext/gl/gstglfiltercube.c: - * ext/gl/gstglfiltercube.h: - * ext/gl/gstglfilterglass.c: - * ext/gl/gstglfilterglass.h: - * ext/gl/gstglfilterlaplacian.c: - * ext/gl/gstglfilterlaplacian.h: - * ext/gl/gstglfilterreflectedscreen.c: - * ext/gl/gstglfilterreflectedscreen.h: - * ext/gl/gstglfiltershader.c: - * ext/gl/gstglfiltershader.h: - * ext/gl/gstglfiltersobel.c: - * ext/gl/gstglfiltersobel.h: - * ext/gl/gstglimagesink.c: - * ext/gl/gstglimagesink.h: - * ext/gl/gstglmosaic.c: - * ext/gl/gstglmosaic.h: - * ext/gl/gstgloverlay.c: - * ext/gl/gstgloverlay.h: - * ext/gl/gstgltestsrc.c: - * ext/gl/gstgltestsrc.h: - * ext/gl/gstglvideomixer.c: - * ext/gl/gstglvideomixer.h: - * ext/gl/gstopengl.c: - move gl elements to ext subdirectory - -2014-03-15 15:55:46 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - 906/906 filter: warn about trying to share with multiple contexts at once - -2014-03-15 14:06:40 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - 905/906 Add GL context sharing support for non-gstgl elements - -2014-03-15 13:55:39 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 904/906 mixer: ask for display handles on pad activation - -2014-03-15 13:51:44 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglapi.h: - 903/906 api: add GstGLPlatform to/from string - -2014-03-15 11:25:43 +0100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/opengl.h: - * gst-libs/gst/gl/gstglcontext.c: - 902/906 context: implement glGetStringi handling for GL core contexts/GLES3 - -2014-03-12 23:46:58 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - 901/906 glx: use the display handle from the global display - Intel drivers require the display handles be the same for context - sharing to occur. Also solves some cases of use after free of the - display when integrating with gstreamer-vaapi. - See https://bugs.freedesktop.org/show_bug.cgi?id=41736 for the intel bug. - -2014-03-12 23:44:28 +1100 Matthew Waters <ystreet00@gmail.com> - - * tests/check/libs/gstglcontext.c: - 900/906 tests/gstglcontext: reduce the number of frames displayed - Was causing timeouts on intel hardware due to vsync handling. - -2014-03-12 23:43:12 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - 899/906 egl: warn if we resort to display handles from the window - -2014-03-06 18:11:22 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 898/906 glimagesink: add an other-context property - Allows applications to provide us with an OpenGL context with which - to share with. - -2014-03-04 23:28:01 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglapi.c: - 897/906 api: plugin a small memory leak - Found by adrien.schwartzentruber@gmail.com - -2014-03-02 11:48:54 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglutils.c: - 896/906 utils: use the vtable for deleting the texture - -2014-02-28 17:42:51 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - 895/906 context: call window_class->close last - We should destroy resources before closing the display connection - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=725048 - -2014-02-25 09:27:26 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * gst-libs/gst/gl/gstglfeature.h: - 894/906 gl: add missing G_BEGIN_DECLS/G_END_DECLS - https://bugzilla.gnome.org/show_bug.cgi?id=725111 - -2014-02-24 23:55:58 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 893/906 x11: close both of the display's we use - (the comment doesn't seem to apply anymore) - https://bugzilla.gnome.org/show_bug.cgi?id=725048 - -2014-02-23 11:44:51 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - 892/906 silence a compiler warning on older gcc versions (4.6) - -2014-02-11 08:57:29 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - * tests/check/libs/gstglcontext.c: - 891/906 context: add support for wrapping external contexts - -2013-11-27 17:52:46 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/x11/Makefile.am: - * gst-libs/gst/gl/x11/gstgldisplay_x11.c: - * gst-libs/gst/gl/x11/gstgldisplay_x11.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - * gst-libs/gst/gl/x11/x11_event_source.c: - 890/906 x11: add display subclass - GstGLDisplayX11 holds the display connection and name. Each thread requires - it's own X11 Display connection (initialised from name) due to the fact that - we do not want to call XInitThreads(). Doing so would result in segfaults - when integrating with GUI toolkits Gtk, Qt, etc. - The Display connection is for OpenGL platforms where a constant display is - required in order to share contexts (egl). In the case of a wrapped context - (added later), we do not have GstGLWindow to retreive the display from so a - 'master' connection is used instead. - -2014-01-15 10:21:56 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - 889/906 display: add display type enum - -2014-02-23 11:27:23 +1100 Adrien SCH <adrien.schwartzentruber@gmail.com> - - * gst-libs/gst/gl/gstgldownload.c: - 888/906 correct error handling in gstgldownload.c - -2014-02-23 10:36:57 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 887/906 mixer: fixup a memory leak of the context in the GLTextureUploadMeta path - gst_structure_get returns a reference to the object and we asked - for another with gst_object_replace. - https://bugzilla.gnome.org/show_bug.cgi?id=724816 - -2014-02-23 01:32:23 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst/gl/gstgltestsrc.c: - 886/906 fixup a memory leak of the context in the GLTextureUploadMeta path - gst_structure_get returns a reference to the object and we asked - for another with gst_object_replace. - https://bugzilla.gnome.org/show_bug.cgi?id=724816 - -2014-02-21 15:25:22 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - 885/906 filter: free our data - plugs some memory leaks - https://bugzilla.gnome.org/show_bug.cgi?id=724816 - -2014-02-21 13:28:16 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - 884/906 filter: return the pad template caps in transform_caps - We can transform from any input in our caps to any output. - With the following pipeline snippet: - ... ! vaapidecode ! glcolorscale ! xvimagesink - GstVideoGLTextureUploadMeta was being used on both src and sink - pads causing linking to fail. This allows the usage of the meta - on either pad without affecting whether the meta is chosen on the - other pad. - -2014-02-11 08:23:39 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/gles1.h: - * gst-libs/gst/gl/glprototypes/gles1gles2.h: - * gst-libs/gst/gl/glprototypes/gles1gles2opengl.h: - * gst-libs/gst/gl/glprototypes/gles1opengl.h: - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglcontext.c: - 883/906 api: provide from_string() - Also s/gst_gl_api_string/gst_gl_api_to_string/g - -2014-02-11 07:24:40 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstopengl.c: - 882/906 port glcolorscale to GLES2 - -2014-02-06 21:43:45 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - 881/906 upload: restore default values for unpack_length - fixes elements that upload a supplementary texture (glbumber, - gldifferencematte, etc) - -2014-02-05 00:44:18 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 880/906 glimagesink: remove unused stored_buffer field - It has the potential to cause deadlocks. - -2014-02-20 22:40:05 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst/gl/Makefile.am: - 879/906 build: don't add X_CFLAGS to CFLAGS - It should already be included if needed inside GL_CFLAGS - -2014-02-05 01:53:04 +1100 Matthew Waters <ystreet00@gmail.com> - - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglmemory.c: - * tests/check/libs/gstglupload.c: - 878/906 tests: update for glmem api change - -2014-02-04 13:49:35 +0100 Chris Paulson-Ellis <chris@edesix.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 877/906 x11: Use correct format string for guintptr - https://bugzilla.gnome.org/show_bug.cgi?id=723537 - -2014-02-01 03:14:48 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglupload.c: - 876/906 glmem: use GstVideoInfo for format configuration - Allows use of strides - -2014-01-31 06:53:54 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - 875/906 upload: support for arbitrary strides - Using GL_UNPACK_ALIGNMENT for GLES2 and GL_UNPACK_ROW_LENGTH for everything else - -2014-01-30 07:49:20 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - 874/906 filter: implement draw_texture for GLES2 - (taken from gleffects) - -2014-01-29 19:14:54 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * gst/gl/gstglimagesink.c: - 873/906 upload: use GstVideoInfo for choosing the format - -2014-01-29 06:42:40 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - 872/906 upload: consolidate data _fill - -2014-01-29 02:51:23 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - 871/906 upload: fix texture scaling for YUY2/UYVY with GLES2 - Another artifact from the transition to GL_TEXTURE_2D - -2014-01-29 01:02:57 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - 870/906 upload: remove superflous g_mutex_init - -2014-01-30 08:28:52 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - * tests/check/libs/gstglupload.c: - 869/906 tests: add some upload tests - -2014-01-28 07:50:13 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - 868/906 upload: fix compilation for GLES2 - -2014-01-17 08:46:02 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - 867/906 glupload: Add GRAY8/GRAY16LE/BE upload support to glimagesink - the 16bit data is uploaded as LUMINANCE_ALPHA, then expanded, composed - in shader. value weight is a little complicate, high byte weight is - 255*256/65535 (denormalize to 0~255 ,shift to high byte,then normalize - to 0~1), low byte weight is 255/65535(similar) - https://bugzilla.gnome.org/show_bug.cgi?id=722670 - -2013-11-23 22:57:03 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - 866/906 upload: update some docs - -2013-11-23 22:19:18 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - 865/906 glmem: report successful copy to the caller - -2013-12-29 17:29:53 +1100 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/gtk/fxtest/fxtest.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - * tests/examples/gtk/gstgtk.c: - 864/906 examples: update to gtk3 - -2013-11-26 09:32:32 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - 863/906 window: hold a ref to our GstGLDisplay - -2013-11-25 20:34:06 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 862/906 window: remove set_need_lock - No-one is using it. The only code that did was the x11 one which - doesn't need it anymore. - -2014-01-10 02:50:14 +0800 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * gst-libs/gst/gl/glprototypes/opengl.h: - 861/906 glprototypes: Add missing glScalef declare - https://bugzilla.gnome.org/show_bug.cgi?id=721903 - -2013-11-23 22:58:57 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - 860/906 docs: misc updates - -2013-11-23 22:57:49 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - 859/906 window: provide some documetation - -2013-11-23 22:56:10 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - 858/906 glmem: update the docs - -2013-11-23 22:54:46 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - 857/906 display: document the new GstContext api - -2013-11-23 22:53:48 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - 856/906 context: document it - -2013-11-14 15:27:52 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixer.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * gst/gl/gstglimagesink.c: - 855/906 upload: add support for GstVideoGLTextureUploadMeta - -2013-11-13 00:41:01 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - 854/906 use the allocation query to propogate GstGLContext - uses the GstVideoGLTextureUploadMeta api type for the query - -2013-10-24 22:30:45 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglmixer.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglmemory.c: - 853/906 display: remove _{set,get}_context - A GstGLDisplay doesn't need a GstGLContext and its use - was cause a reference cycle - -2013-11-13 10:43:16 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - 852/906 use GstContext for GstGLDisplay propogation - implements the hooks required in GstElement::set_context and the context query - -2013-12-20 15:18:38 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/gl/gstgldeinterlace.c: - 851/906 deinterlace: fix texture coordinates computation - Fixes a regression introduced by fffdcbdd3dde437e10cf6e1b5e40c6958d41e6c1 - https://bugzilla.gnome.org/show_bug.cgi?id=720826 - -2013-11-15 18:28:49 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - 850/906 glupload: Remove texture scaling artifacts from the TEXTURE_RECTANGLE -> TEXTURE_2D transition - fixes the funky colours in some of the yuv formats - https://bugzilla.gnome.org/show_bug.cgi?id=721155 - -2013-10-26 02:20:17 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gltestsrc.c: - 849/906 testsrc: use _context_get_gl_api - -2013-10-24 22:28:57 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - 848/906 filter: a little code cleanup - -2013-11-13 15:57:07 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 847/906 mixer: unmap the video frames we map - plugs a memory leak - -2013-11-15 20:50:27 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 846/906 mixer: handle 0/1 framerate better in caps - -2013-11-15 20:49:43 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - 845/906 filter: handle capsfeatures properly - -2013-11-14 15:08:47 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixer.h: - * gst/gl/gstglmosaic.c: - * gst/gl/gstglmosaic.h: - * gst/gl/gstglvideomixer.c: - * gst/gl/gstglvideomixer.h: - 844/906 mixer: give access to the pads at render time - allows us to move the video frame mapping somewhere else - -2013-11-13 23:24:00 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - 843/906 memory: provide copy_into_texture - -2013-12-25 23:35:50 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/gl/Makefile.am: - 842/906 Fix gstglconfig.h-related 'make distcheck' issues - Fix srcdir vs. builddir issue in docs and 'files left after - disclean' issue for gstglconfig.h - -2013-11-30 09:51:49 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglwindow.c: - 841/906 osx: allow x11/glx backend and set default runtime to cocoa/nsgl - https://bugzilla.gnome.org/show_bug.cgi?id=719757 - -2013-12-14 19:12:09 +0100 Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - - * gst/gl/gstglvideomixer.c: - 840/906 glvideomixer: Use correct coordinates after the switch from GL_TEXTURE_RECTANGLE to GL_TEXTURE_2D - https://bugzilla.gnome.org/show_bug.cgi?id=720177 - -2013-11-30 16:38:13 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - 839/906 cocoa: allow to call set_window_handle before to create glcontext - So that it actually make cocoa videooverlay example work again. - Fixes bug https://bugzilla.gnome.org/show_bug.cgi?id=719758 - -2013-11-15 18:28:49 +1100 Matthew Waters <ystreet00@gmail.com> - - * ext/libvisual/visual-gl.c: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgles2.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglutils.c: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gltestsrc.c: - * gst/gl/gstglbumper.c: - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfilterreflectedscreen.c: - * gst/gl/gstglfiltershader.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglmosaic.c: - * gst/gl/gstgloverlay.c: - * gst/gl/gstglvideomixer.c: - * tests/check/libs/gstglcontext.c: - * tests/examples/clutter/cluttershare.c: - * tests/examples/sdl/sdlshare.c: - 838/906 gl: Use GL_TEXTURE_2D instead of GL_TEXTURE_RECTANGLE - We create our textures (in Desktop GL) with GL_TEXTURE_RECTANGLE, - vaapi attempts to bind our texture to GL_TEXTURE_2D which throws a - GL_INVALID_OPERATION error and as thus, no video. - Also, by moving exclusively to GL_TEXTURE_2D and the npot extension - we also remove a difference between the Desktop GL and GLES2 code. - https://bugzilla.gnome.org/show_bug.cgi?id=712287 - -2013-11-08 12:12:26 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - 837/906 cocoa: resize OpenGL view size each time the window is resized - Fixes glitches that can appear when the OpenGL view has not been resized - after a window resize. - https://bugzilla.gnome.org/show_bug.cgi?id=711672 - -2013-11-01 16:35:46 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - 836/906 cocoa: only use GSRegisterCurrentThread with GNUStep environment - -2013-11-06 22:16:21 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglwindow.c: - 835/906 gstglwindow: remove unused fields - -2013-11-06 22:13:20 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglwindow.c: - 834/906 gstglwindow: clear mutex - -2013-11-06 22:12:02 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglcontext.c: - 833/906 gstglcontext: initialize window to NULL - -2013-11-06 21:59:27 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 832/906 x11: ignore Expose events not initiated by gst_gl_window_draw - -2013-11-06 21:55:49 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst/gl/gstglimagesink.c: - 831/906 glimagesink: avoid to overload the drawer if already drawing - Especially if the application calls gst_video_overlay_expose a lot - -2013-10-23 21:46:04 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/gstglvideomixer.c: - * gst/gl/gstglvideomixer.h: - * gst/gl/gstopengl.c: - 830/906 glvideomixer: Add a new simple glvideomixer element - that simply uses glBlendFunc to blend each imput frame - https://bugzilla.gnome.org/show_bug.cgi?id=710714 - -2013-10-23 20:38:56 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 829/906 mixer: error out properly on flushing - -2013-10-22 21:48:00 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - 828/906 context: refcount the display - -2013-10-26 02:20:54 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 827/906 mixer: don't unref the query in the default case - The element/application performing the query is responsible for the - de/allocation - -2013-10-24 21:24:03 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - 826/906 upload: free our mutex - -2013-10-11 16:00:23 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 825/906 glwindow_x11: check if the loop exists - It happens when calling set_window_handle before to reach GST_STATE_READY. - In this case the parent is set when creating the internal window. - -2013-10-01 23:47:54 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/android/gstglwindow_android_egl.h: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglshadervariables.c: - 824/906 android: Build fixes - https://bugzilla.gnome.org/show_bug.cgi?id=709786 - -2013-10-01 11:46:46 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - 823/906 wayland_egl: make the wayland backend actually work on Raspberry Pi - Fix resizing and can now move the window - -2013-10-01 11:44:00 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - 822/906 gstglcontext_egl: avoid non working EGL confs on rpi/wayland - -2013-10-01 11:42:21 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglframebuffer.c: - * tests/check/libs/gstglcontext.c: - 821/906 tests: fix test_share on GLESv2 - -2013-10-01 11:27:07 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglwindow.c: - 820/906 gstglwindow: if available use wayland instead dispmanx on rpi - -2013-09-27 01:15:25 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * gst/gl/gstgldeinterlace.c: - 819/906 make gen_texture/del_texture threadsafe - Use stack allocated instead of static variables - Conflicts: - gst-libs/gst/gl/gstglutils.c - -2013-09-25 12:26:57 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 818/906 window: add send_message_async vmethod - - provide a default synchronous send_message - - make context creation threadsafe again - -2013-09-24 16:37:11 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst/gl/gstglbumper.c: - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfiltershader.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglmosaic.c: - 817/906 make the state change test pass - -2013-09-24 14:07:58 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 816/906 x11: fix make check segfault - -2013-09-20 11:55:36 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglcontext.c: - * gst/gl/gstglimagesink.c: - 815/906 fix some refcount errors - -2013-09-20 11:54:42 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 814/906 mixer: timestamp buffers - -2013-09-16 19:07:18 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - * gst/gl/gstglimagesink.c: - 813/906 unref the pool on shutdown - -2013-09-15 14:23:43 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglfeature.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixer.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gstglbumper.c: - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfilterreflectedscreen.c: - * gst/gl/gstglfiltershader.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - * gst/gl/gstglmosaic.c: - * gst/gl/gstgloverlay.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstgltestsrc.h: - * tests/check/libs/gstglcontext.c: - * tests/check/libs/gstglmemory.c: - 812/906 move the GL vtable from GstGLDisplay to GstGLContext - Conflicts: - tests/check/libs/gstglcontext.c - -2013-08-22 15:55:35 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/check/libs/gstglmemory.c: - 811/906 tests: update for GstGLContext addition - -2013-09-26 14:46:16 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglutils.c: - 810/906 gstglutils: use gl_vtable for glDeleteTextures - -2013-09-26 14:43:19 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * tests/check/libs/gstglcontext.c: - 809/906 tests: port test_share to GLES2 - Also add a deinit function to release fbo, tex and shader. - -2013-09-03 22:03:03 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 808/906 x11: remove dead code - -2013-09-03 21:49:18 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - 807/906 context: Move some window error enums to context - -2013-08-30 00:28:04 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - 806/906 egl: doesn't require the EGLConfig from the other context - libEGL should give us the same or similar EGLConfig from the - EGLDisplay we have. - -2013-08-30 00:22:31 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - 805/906 glfilter: rename external-opengl-context prop to other-context - It now requires a GstGLContext instead of a handle - -2013-08-30 15:53:41 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/gstglcontext.c: - * gst/gl/gstopengl.c: - 804/906 rpi: call bcm_host_init in plugin_init - -2013-08-30 14:12:37 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/dispmanx/Makefile.am: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c: - * gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglwindow.c: - 803/906 raspberrypi: add support for dispmanx - See https://bugzilla.gnome.org/show_bug.cgi?id=703342 - -2013-08-29 20:12:27 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/check/libs/gstglcontext.c: - 802/906 add GstGLContext test that tests context sharing - -2013-08-29 20:10:42 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - 801/906 context: Reimplement GL context sharing - https://bugzilla.gnome.org/show_bug.cgi?id=704806 - -2013-08-28 10:32:29 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst/gl/gstglimagesink.c: - 800/906 glimagesink: avoid to draw texture while releasing stored buffer - Spoted by generic/cube example with ClientDrawCallback set to - returning TRUE (it means drawing as fast as possible) - -2013-08-28 10:07:24 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 799/906 glimagesink: fix asynchrone drawing - Simplify gst_glimage_sink_redisplay which is there - only to ask the window for a redraw. - Put a lock to make sure we are not realeasing - the stored buffer while still drawing the corresponding - texture - -2013-08-22 00:29:36 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/Makefile.am: - 798/906 build: install needed header - -2013-08-21 15:40:52 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 797/906 x11: fix build for clang - -2013-08-21 14:05:56 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/android/gstglwindow_android_egl.h: - * gst-libs/gst/gl/egl/gstglcontext_egl.c: - * gst-libs/gst/gl/egl/gstglcontext_egl.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - 796/906 move egl into its own directory - -2013-08-21 13:57:56 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - 795/906 android: port to GstGLContext - not tested - -2013-08-15 17:09:04 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/cocoa/Makefile.am: - * gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstglegl.c: - * gst-libs/gst/gl/gstglegl.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/win32/Makefile.am: - * gst-libs/gst/gl/win32/gstglcontext_wgl.c: - * gst-libs/gst/gl/win32/gstglcontext_wgl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_wgl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32_wgl.h: - * gst-libs/gst/gl/x11/Makefile.am: - * gst-libs/gst/gl/x11/gstglcontext_glx.c: - * gst-libs/gst/gl/x11/gstglcontext_glx.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.h: - 794/906 context: add subclasses for the different platforms (egl, glx, wgl, etc) - - most code taken from the Window subclasses - - tested combinations: xEGL, GLX, Wayland+EGL, Cocoa (under GNUStep), WGL (Wine) - -2013-08-14 10:44:19 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglcontext.c: - * gst-libs/gst/gl/gstglcontext.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32_wgl.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - 793/906 add a GstGLContext object that will be the basis of OpenGL contexts - At the moment it just sits in between GstGLDisplay and GstGLWindow - performing some of the stuff that GstGLWindow used to do. - -2013-08-13 20:10:56 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/android/Makefile.am: - * gst-libs/gst/gl/cocoa/Makefile.am: - * gst-libs/gst/gl/wayland/Makefile.am: - * gst-libs/gst/gl/win32/Makefile.am: - * gst-libs/gst/gl/x11/Makefile.am: - * gst/gl/Makefile.am: - 792/906 build: use our own in tree headers before system ones - allows us to develop against the tree rather than what may be installed - -2013-08-16 16:29:12 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/x11_event_source.c: - 791/906 glwindow/x11: remove X11EventSource as soon as the window is deleted - gst_gl_window_x11_send_message do not use XSendEvent anymore - -2013-08-16 15:26:28 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst/gl/gstglimagesink.c: - 790/906 glimagesink: retrieve window only when clientDrawCallback return true - -2013-08-07 17:11:59 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstglegl.c: - 789/906 egl: Create a window surface if necessary - -2013-08-07 11:46:49 +0200 Tonu Jaansoo <chain@bsd.ee> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - 788/906 osx: Fix compilation - -2013-08-07 11:42:46 +0200 Tonu Jaansoo <chain@bsd.ee> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglupload.c: - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglimagesink.c: - 787/906 gl: The GLSL rectangle resampler does not always work with int tex coords - Use floats instead. - -2013-07-24 13:35:27 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/glprototypes/gles3opengl.h: - 786/906 glprototypes: Add support for NV extensions for DrawBuffers and ReadBuffer - -2013-07-24 13:34:20 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstglegl.c: - 785/906 egl: Use EGL_KHR_surfaceless_context instead of creating a useless surface if available - -2013-07-22 19:00:42 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * gst/gl/gstgloverlay.h: - 784/906 gloverlay: add G_BEGIN/END declaration - -2013-07-19 16:28:20 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/gl/gstglimagesink.c: - 783/906 glimagesink: Fix format string warning - -2013-07-19 10:07:54 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstgldownload.c: - 782/906 gldownload: Use strlen() instead of sizeof(char*) - gstgldownload.c:846:22: error: argument to 'sizeof' in 'memcpy' call is the same expression as the source; did you mean to provide an explicit length? -Werror=sizeof-pointer-memaccess - -2013-07-19 16:48:03 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldownload.c: - 781/906 download: propogate errors from the GL thread - -2013-07-18 20:21:57 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - 780/906 up/download: check return values - So we fail properly - -2013-07-18 19:37:32 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - 779/906 download: remove _thread variants of the API - -2013-07-18 19:36:27 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - 778/906 upload: remove _thread variants of the API - -2013-07-18 19:17:18 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - 777/906 upload: overhaul and addition of new video formats - use the shaders from eglglessink (adapted for Desktop GL) - error out properly - -2013-07-17 21:17:03 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldownload.c: - 776/906 download: fix compiler warning about missing string format - -2013-07-19 09:20:09 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/glprototypes/gstgl_compat.h: - * gst-libs/gst/gl/gstglapi.h: - 775/906 configure: Check for GLeglImageOES and others again - https://bugzilla.gnome.org/show_bug.cgi?id=704498 - -2013-07-18 20:26:44 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - 774/906 win32: Fix some compiler errors/warnings - -2013-07-18 01:42:31 +0200 Mathieu Duponchelle <mathieu.duponchelle@epitech.eu> - - * gst-libs/gst/gl/gstglfilter.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterreflectedscreen.c: - 773/906 glfilters: Mark writable-only properties as readable as well - https://bugzilla.gnome.org/show_bug.cgi?id=704429 - -2013-07-18 01:41:05 +0200 Mathieu Duponchelle <mathieu.duponchelle@epitech.eu> - - * gst/gl/gstglbumper.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfilterreflectedscreen.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglmosaic.c: - * gst/gl/gstgloverlay.c: - 772/906 glfilters: Mark them as Video filters in their classification - It makes it possible for applications like pitivi to - use them. - https://bugzilla.gnome.org/show_bug.cgi?id=704429 - -2013-07-17 11:22:02 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - * tests/examples/gtk/gstgtk.c: - 771/906 gl: Some less long/ulong/gulong usage - -2013-07-16 18:28:33 +0200 Mathieu Duponchelle <mathieu.duponchelle@epitech.eu> - - * tests/examples/clutter/clutteractor.c: - * tests/examples/clutter/cluttershare.c: - 770/906 tests/examples: port some of the examples. - This commit is a first step, removes glupload, switch new-decoded-pad - to pad-added, but these examples still fail for various reasons. - -2013-07-16 18:27:07 +0200 Mathieu Duponchelle <mathieu.duponchelle@epitech.eu> - - * tests/examples/gtk/fxtest/fxtest.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - * tests/examples/sdl/sdlshare.c: - 769/906 tests/examples: fix and port some of the examples. - Realize widgets, remove glupload element. - -2013-07-16 16:17:11 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/gl/gstgltestsrc.c: - 768/906 gltestsrc: Fix usage of FBO API - -2013-07-16 14:22:53 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 767/906 glimagesink: Remove GValue usage for fraction handling - -2013-07-04 10:01:52 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglutils.c: - 766/906 utils: generate a RGBA texture in all cases - -2013-07-03 21:01:25 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - 765/906 wayland: remove fullscreen - -2013-07-03 14:37:13 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - 764/906 filter: fix pad template caps - upload is for the sink template - download is form the src template - -2013-07-03 14:13:00 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - 763/906 memory: copy properly depending on where the most recent data is - -2013-07-16 14:11:46 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 762/906 glimagesink: Fix some memory leaks and properly set up the buffer pool - -2013-07-16 13:28:19 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - 761/906 x11: Protect event display connection with a mutex - We use it from different threads and need to serialize the - accesses to it. - -2013-07-16 13:23:54 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 760/906 x11: Always use the same display connection from the GL thread - The other display connection might be used by async calls from elsewhere - at the same time. - https://bugzilla.gnome.org/show_bug.cgi?id=704247 - -2013-07-15 21:44:20 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstgldownload.c: - 759/906 gldownload: #ifdef some GLES2 specific code to fix compilation - -2013-07-15 18:07:12 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - 758/906 android: Don't require a window to be set - This allows the filters to be usable without a GL sink downstream. - -2013-07-15 18:01:55 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstglegl.c: - 757/906 egl: Create an offscreen surface if no window was provided - -2013-07-15 17:20:00 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstgldownload.c: - 756/906 gldownload: Reset the viewport after download RGB via GLES2 - -2013-07-15 17:11:59 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstgldownload.c: - 755/906 gldownload: Unbind framebuffer after downloading RGB with GLES2 - -2013-07-15 17:08:42 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - 754/906 gldownload: Add support for RGB reordering when using GLES2 - -2013-07-15 17:08:23 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstgldisplay.c: - 753/906 gldisplay: Sending a message is synchronous, we can allocate the memory on the stack - -2013-07-15 15:58:04 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst/gl/gstglimagesink.c: - 752/906 glwindow: Add destroy notifies for the data of the callbacks - And actually call the close callback when the window is closed. - -2013-07-15 15:25:57 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstgldisplay.c: - 751/906 gldisplay: Don't hold lock while sending a message to the GL thread - https://bugzilla.gnome.org/show_bug.cgi?id=704247 - -2013-07-15 14:11:20 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstgles2.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - 750/906 glupload: Add support for RGB reordering when using GLES2 - -2013-07-15 07:39:07 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstglshader.c: - 749/906 glshader: Add some more debug output - -2013-07-12 14:31:48 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstgldownload.c: - 748/906 glupload: GL_STENCIL_ATTACHMENT is needed for desktop GL, not GLES - -2013-07-12 14:26:58 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglupload.c: - 747/906 gl: Constify YUV conversion shaders - -2013-07-12 14:20:41 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/android/gstglwindow_android_egl.h: - 746/906 android: Add comment to clarify the type of a variable - -2013-07-12 14:20:05 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglupload.c: - 745/906 gl: Simplify and optimize YUV conversion shaders a bit - -2013-07-12 11:35:52 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gl.h: - 744/906 gl: Use __GST_GL_H__ instead of __GL_H__ as a multi-include guard - GL/gl.h might use the latter already. - -2013-07-11 21:30:53 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - 743/906 win32: Allow setting window handle before creating the context - -2013-07-11 21:22:57 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - 742/906 cocoa: Allow setting window handle before creating the context - -2013-07-11 21:17:42 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - 741/906 wayland: Don't leak main context and loop - -2013-07-11 21:15:41 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 740/906 x11: Allow setting window handle before creating the context - -2013-07-11 20:58:36 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 739/906 x11: Don't leak main context and main loop - -2013-07-11 20:51:47 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstglapi.h: - 738/906 gl: Include glu.h after gl.h - -2013-07-11 16:21:00 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/gl/gstglimagesink.c: - 737/906 glimagesink: Request and set the window handle much earlier - -2013-07-11 16:05:48 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/gl/gstopengl.c: - 736/906 glimagesink: Give MARGINAL rank to be able to autoplug it if nothing else is available - -2013-07-10 11:31:17 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/android/Makefile.am: - * gst-libs/gst/gl/android/gstglwindow_android_egl.c: - * gst-libs/gst/gl/android/gstglwindow_android_egl.h: - * gst-libs/gst/gl/gstglegl.c: - * gst-libs/gst/gl/gstglwindow.c: - 735/906 gl: Add support for Android - https://bugzilla.gnome.org/show_bug.cgi?id=703340 - -2013-07-11 11:37:17 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/win32/Makefile.am: - 734/906 win32: Make automake happy by using noinst_HEADERS - -2013-07-11 11:03:31 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/cocoa/Makefile.am: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/glprototypes/Makefile.am: - * gst-libs/gst/gl/glprototypes/gstgl_compat.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglbufferpool.h: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglegl.h: - * gst-libs/gst/gl/gstglfeature.h: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmixer.h: - * gst-libs/gst/gl/gstglmixerpad.h: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglshadervariables.h: - * gst-libs/gst/gl/gstglupload.h: - * gst-libs/gst/gl/gstglutils.h: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/Makefile.am: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/win32/Makefile.am: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - * gst-libs/gst/gl/x11/Makefile.am: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.c: - * gst-libs/gst/gl/x11/x11_event_source.c: - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectlumatocurve.h: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gltestsrc.h: - * gst/gl/gstglbumper.h: - * gst/gl/gstglcolorscale.h: - * gst/gl/gstgldeinterlace.h: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldifferencematte.h: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - * gst/gl/gstglfilterapp.h: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfilterblur.h: - * gst/gl/gstglfiltercube.h: - * gst/gl/gstglfilterglass.h: - * gst/gl/gstglfilterlaplacian.h: - * gst/gl/gstglfilterreflectedscreen.h: - * gst/gl/gstglfiltershader.c: - * gst/gl/gstglfiltershader.h: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglfiltersobel.h: - * gst/gl/gstglimagesink.h: - * gst/gl/gstglmosaic.h: - * gst/gl/gstgloverlay.c: - * gst/gl/gstgloverlay.h: - * gst/gl/gstgltestsrc.h: - * gst/gl/gstopengl.c: - 733/906 gl: Major header and include cleanup - -2013-07-10 16:03:04 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gl.h: - * gst-libs/gst/gl/gstgl_fwd.h: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglegl.c: - * gst-libs/gst/gl/gstglegl.h: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglfeature.h: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmixer.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst/gl/gstglimagesink.h: - * gst/gl/gstgltestsrc.h: - 732/906 build: fix repeated typedefs - Write forward declarations in another way to avoid - repeated typedefs "error: redefinition of typedef". - Raised when using i686-apple-darwin11-llvm-gcc-4.2 - It seems that C apple compiler does not support - C11 feature. - https://bugzilla.gnome.org/show_bug.cgi?id=703885 - -2013-07-10 15:47:23 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - 731/906 cocoa: fix build when GNUSTEP is not defined - -2013-07-10 11:30:16 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/glprototypes/gstgl_compat.h: - 730/906 glcompat: Properly check for GLchar and other types - On Android for example these are no #defines but typedefs - -2013-07-10 11:24:34 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglutils.c: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gstglfiltershader.c: - * tests/check/pipelines/simple-launch-lines.c: - * tests/examples/clutter/clutteractor.c: - * tests/examples/clutter/clutteractortee.c: - * tests/examples/clutter/cluttershare.c: - * tests/examples/gtk/fxtest/fxtest.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - * tests/examples/gtk/gstgtk.c: - * tests/examples/sdl/sdlshare.c: - 729/906 gl: Include config.h everywhere - -2013-07-03 14:13:56 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglimagesink.c: - 728/906 glimagesink: fix for gles2 - https://bugzilla.gnome.org/show_bug.cgi?id=703508 - -2013-07-03 09:12:39 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglegl.c: - * gst-libs/gst/gl/gstglegl.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.h: - 727/906 egl: Refactor EGL logic into a helper object - -2013-07-02 22:45:08 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - 726/906 window: don't call a NULL destroy function - -2013-07-02 22:06:03 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/Makefile.am: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - * gst-libs/gst/gl/x11/x11_event_source.c: - * gst-libs/gst/gl/x11/x11_event_source.h: - 725/906 x11: use GMainContext/GMainLoop - allows us to be reentrant - https://bugzilla.gnome.org/show_bug.cgi?id=703445 - -2013-07-02 18:33:42 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - 724/906 wayland: make reentrant - https://bugzilla.gnome.org/show_bug.cgi?id=703445 - -2013-07-01 14:43:14 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow.c: - 723/906 gstglwindow: close has to be called in the glthread. - Indeed 'glXMakeCurrent (window_x11->device, None, NULL);' - has to be called in the thread where the glcontext is actually - current. - Otherwise glXDestroyContext may crash. - -2013-07-01 01:36:35 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * gst-libs/gst/gl/gstglapi.h: - 722/906 gl: Fix build on Win32 - 1) Need to include GL/glext.h on W32 to provide necessary macros - 2) W32 macros that pre-processor has by default are different for different - toolchains. Borland uses __WIN32__, everyone else has _WIN32, so check both. - Side-note: glext.h is not supplied by mingw-w64 at the moment, but can be - downloaded from http://www.opengl.org/registry/ - https://bugzilla.gnome.org/show_bug.cgi?id=703364 - -2013-06-28 11:10:22 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstglfilter.c: - 721/906 glfilter: Use uint64 for the OpenGL context property - ulong/long properties are deprecated and should not be used anymore - for portability reasons. - -2013-06-28 11:00:46 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * tests/examples/clutter/clutteractortee.c: - * tests/examples/gtk/fxtest/fxtest.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - 720/906 examples: Stop using deprecated GLib thread API - -2013-06-28 11:00:07 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/gl/gstglshader.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglimagesink.c: - 719/906 gl: Fix compilation with GLES2 - -2013-06-28 00:34:48 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglutils.c: - * gst/gl/gstgleffects.c: - 718/906 shader: make it possible to unref in the non-GL thread - -2013-06-28 00:31:36 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/libvisual/CMakeLists.txt: - * gst-libs/gst/gl/CMakeLists.txt: - * gst/gl/CMakeLists.txt: - 717/906 remove outdated cmake build files - -2013-06-17 19:45:27 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.c: - 716/906 wayland: properly choose EGL_RENDERABLE_TYPE - based on the gl api we chose - -2013-06-16 20:47:05 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.h: - 715/906 display: inherit from the right object class - -2013-06-16 20:44:47 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglframebuffer.c: - * gst-libs/gst/gl/gstglframebuffer.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - 714/906 Add GstGLFramebuffer to replace _display_gen_fbo and friends - This version is simply API compatible with _display_gen_fbo. - The next version will likely revamp the API - -2013-06-16 20:41:29 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglshader.c: - 713/906 shader: make it possible to create the object in a non-GL thread - -2013-06-16 20:38:27 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - 712/906 wayland: shutdown properly - We cannot use _finalize as this will be called before GstGLWindow's - _finalize. This causes us to try and perform operations with the - wayland server when the connection has been severed. - -2013-06-16 20:37:06 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.c: - 711/906 wayland: support choosing Desktop GL as the api - -2013-06-16 20:34:15 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglwindow.c: - 710/906 window: fail if the user specifies an GL api that we cannot work with - It would've been caught later in an g_assert anyway. - -2013-06-13 18:33:47 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - 709/906 display: some more cleanups - -2013-06-13 17:57:35 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglmixerpad.h: - * gst-libs/gst/gl/gstglutils.h: - * gst-libs/gst/gl/gstglwindow.c: - 708/906 display: a cleanup and removal of old code - -2013-06-13 16:55:37 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - 707/906 display: move error_message to utils - -2013-06-13 16:31:38 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - 706/906 display: move activate_context into utils - -2013-06-13 16:04:40 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 705/906 x11: don't shutdown in _finalize - The window's loop could be still running when _finalize is called - and if we destroy the display connection it will never be closed. - Add _open and _close vfuncs to GstGLWindow so that subclasses can - start up and shutdown at the right time. - -2013-06-13 14:36:41 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/libvisual/visual-gl.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglwindow.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - * tests/check/libs/gstglmemory.c: - * tests/examples/clutter/clutteractor.c: - * tests/examples/clutter/clutteractortee.c: - * tests/examples/clutter/cluttershare.c: - * tests/examples/sdl/sdlshare.c: - 704/906 Use gst_object_unref so we can get refcounts in the log - -2013-06-13 14:18:24 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 703/906 x11: don't segfault if destroy_cb is NULL - -2013-06-12 23:21:16 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 702/906 x11: fix segfault if the x11 backend is instantiated but not used - -2013-06-12 23:17:30 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/gltestsrc.c: - * gst/gl/gstglbumper.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - * gst/gl/gstgloverlay.c: - * gst/gl/gstgltestsrc.c: - 701/906 display: move context creation into window - -2013-06-12 01:04:55 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglutils.c: - * gst-libs/gst/gl/gstglutils.h: - 700/906 display: move most of the code into utils for sorting later - This contains a hack that essentially requires one GstGLDisplay - per process. - -2013-06-11 18:50:12 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixerpad.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - 699/906 display: remove list of upload and download objects - and only create an up/download object when needed. - -2013-06-11 12:26:50 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 698/906 move sink-specific stuff from GstGLDisplay into glimagesink - -2013-06-11 11:27:56 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 697/906 display: allow the user to try and choose the GL api we use via env variable - GST_GL_API=opengl,opengl3,gles2,gles3 - -2013-06-11 11:26:38 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglapi.c: - 696/906 glapi: fix memory leak from not freeing a string - -2013-06-04 22:18:51 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/cocoa/Makefile.am: - * gst-libs/gst/gl/wayland/Makefile.am: - * gst-libs/gst/gl/win32/Makefile.am: - * gst-libs/gst/gl/x11/Makefile.am: - 695/906 build: remove libtool warning about -version-info not used in convenience libraries - -2013-06-04 22:17:41 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/Makefile.am: - 694/906 build: add support for static plugins - -2013-06-04 22:16:00 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.c: - 693/906 x11_glx: ask for a 3.0 GL Context - (falling back if needed) - -2013-06-03 18:15:45 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - 692/906 window_x11: add XError trapping - some functions in GLX can fail if the implementation does not support - certain features we ask for (i.e. GL 3) bringing down the entire - application - -2013-06-03 18:13:52 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfeature.h: - 691/906 feature: make gst_gl_check_extension public - prevents duplication of code of extension string parsing in GstGLWindow's - -2013-06-02 21:47:17 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.h: - 690/906 windowx11glx: use fbconfigs if supported - -2013-04-25 12:04:23 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglbumper.c: - 689/906 bumper: nicer error for no bumpmap file proveded - -2013-04-24 14:25:21 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 688/906 display: properly shutdown if we error after context creation - The _finalize() code checks to see if the context was created before - attempting to destroy it. We never did say that we had created the context. - -2013-04-24 14:24:27 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglbumper.c: - 687/906 bumper: error out properly if we cannot load the png file - -2013-04-24 14:23:16 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfiltershader.c: - 686/906 filtershader: fix string format compiler warnings - -2013-04-24 14:22:40 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - 685/906 filter: improve error handling - -2013-04-24 12:18:14 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 684/906 display: lack of format-string causing a compiler warning - -2013-04-24 12:17:36 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfeature.c: - 683/906 feature: remove double free - -2013-03-11 15:51:06 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgloverlay.c: - 682/906 overlay: fix video-top property - -2013-06-02 07:52:30 +0000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglshader.c: - 681/906 win32: fix gl api calls on 32-bit - win has the bright idea of having 5 different calling conventions. - we should probably use the right one so we don't crash from stack - corruption. - -2013-03-10 13:37:48 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/opengl.h: - * gst/gl/gstgloverlay.c: - 680/906 overlay: tentative port to new GstGLFuncs API - -2013-03-10 13:34:15 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstopengl.c: - 679/906 opengl: fix plugins not being registered when they should be - -2013-03-09 23:36:36 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/win32/gstglwindow_win32_wgl.c: - 678/906 window_win32_wgl: implement wglGetProcAddress for extension functions - -2013-03-09 22:53:41 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - 677/906 memory: fix GSIZE printf format on win32 - -2013-03-09 22:53:09 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_wgl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32_wgl.h: - 676/906 windwo_win32: port to new API - -2013-03-09 22:47:11 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - 675/906 upload: provide nicer debugging - -2013-03-09 22:45:23 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfeature.c: - 674/906 feature: try and catch more GL extension functions - if we don't find the extension in core GL, try the extension version anyway - -2013-03-09 22:37:34 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfeature.h: - 673/906 feature: add gstreamer license - -2013-03-09 22:05:28 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 672/906 display: constify GstGLFuncs *gl - -2013-03-09 21:59:02 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/gstgl_compat.h: - * gst-libs/gst/gl/gstglapi.h: - 671/906 win32: #include GL/glext.h on windows - also add some GL default variables if some GL types are not defined - -2013-02-18 21:40:34 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - 670/906 display: replace glib deprecated api - -2013-02-12 23:48:36 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.h: - 669/906 window: seperate object creation and context creation - -2013-02-04 21:30:51 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglshader.c: - 668/906 shader: fix gles2 segfault - -2013-02-04 21:29:33 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfiltercube.c: - 667/906 filtercube: fix for gles2 compilation - -2013-02-01 18:20:04 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfiltersobel.c: - 666/906 sobel: port for non-glew - -2013-02-01 00:08:28 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglmosaic.c: - 665/906 mosaic: fix a couple of assertions - -2013-02-01 00:06:54 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfiltershader.c: - 664/906 filtershader: improve error checking - -2013-01-31 23:51:04 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfiltershader.c: - 663/906 filtershader: port to non-glew - -2013-01-31 23:46:37 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfilterlaplacian.c: - 662/906 laplacian: port to non-glew - -2013-01-31 23:43:52 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterglass.h: - 661/906 glass: port to non-glew + shader matrices - -2013-01-31 23:39:56 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfiltercube.c: - 660/906 cube: port for non-glew - -2013-01-31 23:34:42 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfilterblur.c: - 659/906 blur: port for non-glew - -2013-01-31 23:32:49 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 658/906 mixer: fix eos timestamp check - -2013-01-31 23:31:09 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfilterapp.c: - 657/906 filterapp: port to non-glew - -2013-01-31 23:29:13 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglbumper.c: - 656/906 bumper: use DrawElements for semi-compatability with ES - also GL_QUADS isn't available with ES contexts - -2013-01-17 23:45:59 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldownload.c: - 655/906 download: remove erronous ReadBuffer call - - it was causing segfaults in mesa - - we didn't set the readbuffer so we shouldn't reset it - -2013-01-17 23:17:14 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgldifferencematte.c: - 654/906 differencematte: port to non-GLEW - -2013-01-17 23:16:07 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgldeinterlace.c: - 653/906 deinterlace: port to non-GLEW + arrays - -2013-01-17 23:14:49 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/opengl.h: - * gst/gl/gstglbumper.c: - 652/906 bumper: port to non-GLEW + arrays - -2013-01-17 23:12:35 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglupload.c: - 651/906 up/download: fix some typos when removing GLEW - -2013-01-16 22:41:18 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - 650/906 filter: fix _draw_texture()'s wrong vertices - -2013-01-16 22:27:10 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectsqueeze.c: - 649/906 effects: fixes for mirror(1) and squeeze(2) producing black - -2013-01-16 15:23:49 +1100 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/clutter/cluttershare.c: - 648/906 tests/examples: remove dependency on glew - -2013-01-16 15:21:44 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/all_functions.h: - * gst-libs/gst/gl/glprototypes/gles3opengl.h: - * gst-libs/gst/gl/glprototypes/opengl_functions.h: - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgles2.h: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglfeature.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglupload.c: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gstglbumper.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - * gst/gl/gstglmosaic.c: - 647/906 remove dependecy on glew - -2013-01-13 00:09:33 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/gles1.h: - * gst-libs/gst/gl/glprototypes/gles1gles2opengl.h: - * gst-libs/gst/gl/glprototypes/gles1opengl.h: - * gst-libs/gst/gl/glprototypes/gles2opengl.h: - * gst-libs/gst/gl/glprototypes/opengl.h: - 646/906 some gl header fixes/additions - -2013-01-10 13:32:16 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 645/906 fix gles2 compilation - -2013-01-10 10:57:11 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/.gitignore: - 644/906 update .gitignore for some new files - -2013-01-10 01:44:54 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - 643/906 display: privatise most of the struct - -2013-01-10 01:13:23 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglshadervariables.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gltestsrc.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstopengl.c: - * tests/check/pipelines/simple-launch-lines.c: - 642/906 add gstglconfig.h for apps to find out what our capabilites are - ie libgstgl can be compiled with any combination of opengl/gles2 - -2013-01-10 00:30:03 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 641/906 display: feature check for GL extension functions - -2013-01-10 00:25:06 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - 640/906 build: add missing file to built sources - -2013-01-10 00:23:32 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.c: - 639/906 add get_proc_address implementations for egl and glx - -2013-01-08 17:40:39 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - 638/906 window: add get_proc_address + stub for retrieving gl functions - -2013-01-08 17:38:40 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.h: - 637/906 x11_egl: add prelim support for choosing opengl or gles - -2013-01-08 17:36:18 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 636/906 window_x11: compact debug info - -2013-01-07 14:08:39 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/opengl_functions.h: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglfeature.h: - 635/906 fixup compile errors - -2012-12-19 14:54:21 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - 634/906 wayland egl: deactivate context before we destroy it - avoids a segfault with dri drivers - -2012-12-19 14:32:20 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 633/906 display: fail properly in context creation in order to minimize a race condition - previously, on context creation, when we failed to get a valid context - we would still atempt to run the window mainloop as well as setting an error - on the display. This would cause the calling element to finalize the display - and therefore attempt to quit the window mainloop. However the mainloop - may not have started running. Thus when the window mainloop ran it would - never a get a quit message and never end. - -2012-12-18 18:31:00 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgleffects.c: - 632/906 remove stray ) - The rest is indent stuff from the stray ) - -2012-12-18 18:29:11 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglshader.h: - 631/906 remove redefinition warnings in compiling tests - -2012-12-09 09:32:48 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglapi.c: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglfeature.h: - 630/906 display: add gl api checking - i.e. check for cases where the window wants a different API than - what the library was compiled with - -2012-12-09 09:30:48 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_wgl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32_wgl.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.h: - 629/906 window: add GError for error handling of context creation - -2012-12-09 09:04:32 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfiltershader.c: - 628/906 shader filter: don't do anything if we don't have a shader file - -2012-12-07 13:32:28 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglshader.c: - 627/906 shader: check for invalid objects - -2012-12-07 00:20:58 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgleffects.c: - 626/906 fix build failure from undefined macro - -2012-12-07 00:16:04 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/glprototypes/README: - * gst-libs/gst/gl/glprototypes/all_functions.h: - * gst-libs/gst/gl/glprototypes/gles1.h: - * gst-libs/gst/gl/glprototypes/gles1_functions.h: - * gst-libs/gst/gl/glprototypes/gles1gles2.h: - * gst-libs/gst/gl/glprototypes/gles1gles2opengl.h: - * gst-libs/gst/gl/glprototypes/gles1opengl.h: - * gst-libs/gst/gl/glprototypes/gles2.h: - * gst-libs/gst/gl/glprototypes/gles2_functions.h: - * gst-libs/gst/gl/glprototypes/gles2opengl.h: - * gst-libs/gst/gl/glprototypes/opengl.h: - * gst-libs/gst/gl/glprototypes/opengl_functions.h: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglfeature.c: - * gst-libs/gst/gl/gstglfeature.h: - 625/906 add vtable for opengl functions - The vtable provides the ability for one to compile (but not link) - against both OpenGL and GL|ES and starts the move away from GLEW - -2012-12-06 18:40:26 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglshadervariables.c: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gltestsrc.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfiltercube.h: - * gst/gl/gstopengl.c: - * tests/check/pipelines/simple-launch-lines.c: - 624/906 OPENGL_ES2 => HAVE_GLES2 and add HAVE_OPENGL - use GstGLAPI to determine which code paths to execute. - perform some cleanups - -2012-12-06 17:40:47 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_wgl.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.h: - 623/906 move GL includes into a single file - -2012-12-05 17:23:21 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgles2.h: - 622/906 add missing GL_STENCIL_ATTACHMENT for gles2 compatability - -2012-12-03 15:04:49 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gstglapi.h: - * gst-libs/gst/gl/gstglrenderer.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_wgl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32_wgl.h: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.h: - 621/906 GstGLRendererAPI => GstGLAPI and get GstGLAPI from a window - -2012-11-30 17:09:21 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - 620/906 wayland_egl: attempt at resizing the video - -2012-11-29 13:06:24 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.c: - 619/906 fix typo for win32 debug variables - -2012-11-29 01:01:59 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/cocoa/Makefile.am: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/wayland/Makefile.am: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c: - * gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h: - * gst-libs/gst/gl/wayland/wayland_event_source.c: - * gst-libs/gst/gl/wayland/wayland_event_source.h: - 618/906 add wayland-egl window backend - -2012-11-20 00:15:05 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - 617/906 fix 'set but not used' compiler warnings - -2012-11-19 22:54:19 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/cocoa/Makefile.am: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h: - * gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst-libs/gst/gl/win32/Makefile.am: - * gst-libs/gst/gl/win32/gstglwindow_win32.c: - * gst-libs/gst/gl/win32/gstglwindow_win32.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32_egl.h: - * gst-libs/gst/gl/win32/gstglwindow_win32_wgl.c: - * gst-libs/gst/gl/win32/gstglwindow_win32_wgl.h: - * gst-libs/gst/gl/x11/Makefile.am: - * gst-libs/gst/gl/x11/gstglwindow_x11.c: - * gst-libs/gst/gl/x11/gstglwindow_x11.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_egl.h: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.c: - * gst-libs/gst/gl/x11/gstglwindow_x11_glx.h: - 616/906 move window-specific code into seperate subfolders - -2012-11-19 21:52:22 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_win32_egl.c: - * gst-libs/gst/gl/gstglwindow_win32_egl.h: - 615/906 preliminary support for Win32 EGL - -2012-11-18 01:23:52 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 614/906 try GLX first when using ANY | OPENGL | OPENGL3 - -2012-11-18 01:16:44 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglwindow_cocoa.m: - 613/906 window_cocoa: fix segfault with gst-launch-1.0 -e ... and sending SIGINT (Ctrl-C) - GNUstep has a signal handler for SIGINT which runs in the main thread. - However that thread has never been 'registered' with GNUstep so - the autorelease magic of objective-c causes a segfault from accessing - a null NSThread object somewhere deep in GNUstep. - -2012-11-16 18:01:08 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/GNUmakefile.gnustep: - * gst/gl/GNUmakefile.gnustep: - * gst/gl/effects/GNUmakefile.gnustep: - 612/906 remove GNUstep makefiles - -2012-11-16 17:13:03 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow_cocoa.h: - * gst-libs/gst/gl/gstglwindow_cocoa.m: - 611/906 cocoa port of determining gl platform at runtime - -2012-11-15 21:46:21 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11_egl.c: - 610/906 WindowX11EGL: remove get_platform call - -2012-11-15 13:17:59 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_win32.h: - * gst-libs/gst/gl/gstglwindow_win32_wgl.c: - * gst-libs/gst/gl/gstglwindow_win32_wgl.h: - 609/906 win32 port of determining GL platform at runtime - - add GstGLWindowWin32 and GstGLWindowWin32WGL along the same lines as the - X11 variants - -2012-11-14 20:39:38 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglrenderer.h: - 608/906 add GST_GL_PLATFORM_ANY for choosing any platform - -2012-11-14 20:36:16 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst-libs/gst/gl/gstglwindow_x11.h: - * gst-libs/gst/gl/gstglwindow_x11_egl.c: - * gst-libs/gst/gl/gstglwindow_x11_glx.c: - 607/906 remove get_platform and get_window_handle vfuncs - - rename choose_visual() to choose_format() for later incorporating - win32 changes and new GstGLPlatform for WGL, EGL, GLX, etc. - -2012-11-13 22:12:20 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglrenderer.h: - * gst-libs/gst/gl/gstglwindow.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst-libs/gst/gl/gstglwindow_x11.h: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - * gst-libs/gst/gl/gstglwindow_x11_egl.c: - * gst-libs/gst/gl/gstglwindow_x11_egl.h: - * gst-libs/gst/gl/gstglwindow_x11_glx.c: - * gst-libs/gst/gl/gstglwindow_x11_glx.h: - * gst/gl/Makefile.am: - 606/906 determine the GL platform to use at runtime - - Make GstGLWindow subclassablerather than specified at compile time. - - Add GstGLWindowX11 for x11 windows and two subclasses, GstGLWindowX11GLX - and GstGLWindwX11EGL for GLX and EGL repectively. (win32 and cocoa - ports to come) - - Also cleanup GL library detection in configure.ac - -2012-12-02 14:58:14 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglshader.c: - 605/906 shader: move to gst debugging - -2012-11-21 13:34:15 +1100 Matthew Waters <ystreet00@gmail.com> - - * ext/libvisual/visual-gl.c: - * gst/gl/gstglbumper.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfilterreflectedscreen.c: - * gst/gl/gstglfiltershader.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglmosaic.c: - * gst/gl/gstgloverlay.c: - * gst/gl/gstgltestsrc.c: - 604/906 gst_element_class_set_details_simple() => gst_element_class_set_metadata() - -2012-11-08 22:53:56 +1100 Matthew Waters <ystreet00@gmail.com> - - * ext/libvisual/visual-gl.c: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstgles2.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixer.h: - * gst-libs/gst/gl/gstglmixerpad.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglshadervariables.c: - * gst-libs/gst/gl/gstglshadervariables.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectlumatocurve.h: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectscurves.h: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gltestsrc.c: - * gst/gl/gltestsrc.h: - * gst/gl/gstglbumper.c: - * gst/gl/gstglbumper.h: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglcolorscale.h: - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstgldeinterlace.h: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldifferencematte.h: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterapp.h: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfilterblur.h: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfiltercube.h: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterglass.h: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfilterlaplacian.h: - * gst/gl/gstglfilterreflectedscreen.c: - * gst/gl/gstglfilterreflectedscreen.h: - * gst/gl/gstglfiltershader.c: - * gst/gl/gstglfiltershader.h: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglfiltersobel.h: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - * gst/gl/gstglmosaic.c: - * gst/gl/gstglmosaic.h: - * gst/gl/gstgloverlay.c: - * gst/gl/gstgloverlay.h: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstgltestsrc.h: - * gst/gl/gstopengl.c: - * tests/check/libs/gstglmemory.c: - * tests/check/pipelines/simple-launch-lines.c: - * tests/examples/clutter/clutteractor.c: - * tests/examples/clutter/clutteractortee.c: - * tests/examples/clutter/cluttershare.c: - * tests/examples/gtk/fxtest/fxtest.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - * tests/examples/gtk/gstgtk.c: - * tests/examples/sdl/sdlshare.c: - 603/906 update FSF address - -2012-11-04 19:15:05 +1100 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/clutter/clutteractor.c: - * tests/examples/clutter/clutteractortee.c: - * tests/examples/clutter/cluttershare.c: - 602/906 hide deprecation warnings with newer clutter versions - -2012-10-11 00:24:51 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglupload.c: - 601/906 fix typo causing shader compilation failure for uploading I420 - -2012-09-27 15:53:46 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - 600/906 docs: add docs for new objects and expand on some existing ones - -2012-09-26 07:18:53 +0000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstglupload.c: - * tests/check/pipelines/simple-launch-lines.c: - 599/906 GL|ES2: fix typos from recent changes and make downloading RGB formats work again - -2012-09-25 19:26:17 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/clutter/cluttershare.c: - 598/906 examples: fix compilation of cluttershare - -2012-09-25 18:13:41 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/check/pipelines/simple-launch-lines.c: - 597/906 tests: add some simple pipeline tests to check - -2012-09-25 18:07:23 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglcolorscale.h: - 596/906 colorscale: port over to filter base class - -2012-09-25 18:06:14 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfilterreflectedscreen.c: - * gst/gl/gstglfiltershader.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstgloverlay.c: - 595/906 update for filter API change - gleffects needed a similar change - -2012-09-25 17:59:27 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - 594/906 filter: update for up/download API changes and scaling fixes - -2012-09-25 16:03:01 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - 593/906 testsrc/imagesink: update for up/download API changes - -2012-09-25 16:01:54 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - 592/906 memory: update for up/download API changes - -2012-09-25 16:00:48 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixerpad.h: - 591/906 mixer: save the upload object instead of querying for it every frame - -2012-09-25 15:20:21 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - 590/906 up/download: fix scaling on transfer - i.e. uploading from a 10x10 video frame to a 20x20 texture into another 30x30 videoframe - -2012-09-20 23:45:26 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglcolorscale.h: - 589/906 Revert "GLColorscale: convert to a bin of glupload ! gldownload" - The elements no longer exist so we have to do something different - -2012-09-20 23:41:00 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglmosaic.c: - * gst/gl/gstglmosaic.h: - 588/906 mosaic: update for mixer changes and convenience API - -2012-09-20 23:27:00 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixer.h: - * gst-libs/gst/gl/gstglmixerpad.h: - 587/906 mixer: mirror the changes done for filter - -2012-09-20 23:21:19 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglmemory.c: - 586/906 fix up some debug statements to get them into the right categories - -2012-09-20 23:20:00 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgltestsrc.c: - * gst/gl/gstgltestsrc.h: - 585/906 gltestsrc: update for new GLDownload in libs - -2012-09-20 23:16:08 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 584/906 glimagesink: update for new GLUpload object in libs - -2012-09-20 23:06:49 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstgldeinterlace.h: - 583/906 deinterlace: change for new API - also allow elements to call the _filter_texture vfunc if they want - -2012-09-20 23:03:55 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglbumper.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfilterreflectedscreen.c: - * gst/gl/gstglfiltershader.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstgloverlay.c: - 582/906 filters: changes for new API - -2012-09-19 00:32:30 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - 581/906 filter: add seperate filter function for operating on textures instead of buffers - -2012-09-19 00:29:57 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - 580/906 bufferpool: remove obselete gl meta buffer pool options - -2012-09-18 21:42:24 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldownload.c: - 579/906 download: fix YV12 format - same as I420 but plane 1+2 swapped - -2012-09-18 21:39:21 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - 578/906 {up,down}load: add variants that can be called in the gl thread - -2012-09-17 10:37:37 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/Makefile.am: - 577/906 remove upload and download elements from the build system - -2012-09-17 10:30:01 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglmeta.c: - * gst-libs/gst/gl/gstglmeta.h: - * gst-libs/gst/gl/gstglupload.h: - 576/906 remove uneeded GstGLMeta (use GstVideoMeta) - -2012-09-16 21:42:08 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - 575/906 filter: port to new upload/download - -2012-09-16 21:36:09 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - 574/906 memory: implement transperent upload/download for data - (not async yet) - -2012-09-16 21:23:09 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgldownload.c: - * gst-libs/gst/gl/gstgldownload.h: - * gst-libs/gst/gl/gstglupload.c: - * gst-libs/gst/gl/gstglupload.h: - 573/906 add upload and download library objects - allows multiple upload pipelines that previously wasn't possible - (i.e. upload RGB and I420 and ... on the same GstGLDisplay) - -2012-09-16 21:11:46 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgldownload.c: - * gst/gl/gstgldownload.h: - * gst/gl/gstglupload.c: - * gst/gl/gstglupload.h: - * gst/gl/gstopengl.c: - 572/906 remove upload and download elements - to be replaced by upload and download in memory - -2012-09-05 14:58:38 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 571/906 mixer: fix deadlock on shutdown - didn't reiterate over the sinkpad's displays and reactivate them causing a deadlock - -2012-09-04 22:50:00 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgldownload.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglupload.c: - 570/906 remove the requirement for VideoMeta to be present on non-GL buffers - -2012-08-20 16:55:41 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgldifferencematte.c: - 569/906 differencematte: prevent double unref of shader and midtexture - -2012-08-27 14:08:16 +0000 Matthew <matt@matt-bunt-lapt.(none)> - - * gst-libs/gst/gl/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - 568/906 window: fix public definitions - -2012-08-27 14:07:31 +0000 Matthew <matt@matt-bunt-lapt.(none)> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglshadervariables.c: - 567/906 fix OpenGL|ES2 ifdef'ed code - -2012-08-20 13:27:50 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 566/906 effects: avoid using tanh in sin_fragment - It produces weird results on nouveau. - Provide an alternative implementation with (1-sinh)*cosh - -2012-08-20 13:06:27 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 565/906 effects: fix shader compilation with mesa drivers - -2012-08-15 21:37:01 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.h: - 564/906 glmemory: remove unused typedef - -2012-08-15 16:52:48 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 563/906 readd support for hanging GL pipelines e.g. ... ! gleffects ! fakesink - -2012-08-15 15:35:46 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 562/906 gldisplay: fix download of YUV formats - -2012-08-14 23:55:14 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 561/906 gldisplay: fix endianess issues on RGB download - -2012-08-14 14:41:19 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/clutter/clutteractor.c: - * tests/examples/clutter/clutteractortee.c: - * tests/examples/clutter/cluttershare.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - 560/906 examples: update for bus api changes and glimagesink changes - -2012-08-14 02:05:13 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 559/906 glmixer: pass the mixpad's display to the querying element - -2012-08-12 19:03:48 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/Makefile.am: - 558/906 add missing includes for _post_missing_element_message in glcolorspace - -2012-08-10 16:41:12 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstopengl.c: - 557/906 Fix plugin define and remove warning - -2012-08-10 15:55:51 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglcolorscale.h: - 556/906 GLColorscale: convert to a bin of glupload ! gldownload - -2012-08-10 15:31:20 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 555/906 Make the query for a GstGLDisplay a pad peer query - Allows the query to pass through bin boundaries and makes it possible for - arbitrary gl elements to be placed in bins. - -2012-08-08 16:08:40 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * tests/check/libs/gstglmemory.c: - 554/906 GstGLMemory: update for GstAllocator API changes - -2012-07-16 23:31:31 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfiltershader.c: - 553/906 GstGLFilterShader: update for GstGLMeta - -2012-07-16 23:22:58 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfilterapp.c: - 552/906 GstGLFilterApp: update for GstGLMeta - -2012-07-16 22:40:15 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgloverlay.c: - 551/906 GstGLOverlay: fix loading of non-square overlays - libjpeg complains about "Application read too {many,few} scan lines" in non-square images - -2012-07-16 21:40:59 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgloverlay.c: - 550/906 GstGLOverlay: fix libPNG complaining about unsigned integer being out of range - -2012-07-16 21:35:26 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgloverlay.c: - 549/906 GstGLOverlay: update for GstGLMeta - -2012-07-16 15:06:50 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgldifferencematte.c: - 548/906 GstGLDifferenceMatte: update for GstGLMeta - -2012-07-16 00:36:30 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglbumper.c: - 547/906 GstGLBumper: fix libPNG complaining about invalid png files - We failed to inform libPNG that we had already read the header - -2012-07-16 00:03:50 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfiltersobel.c: - 546/906 GstGLFilterSobel: update for GstGLMeta - -2012-07-13 01:07:37 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglbumper.c: - 545/906 GstGLBumper: update for GstGLMeta - -2012-07-13 01:04:22 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/libvisual/visual-gl.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 544/906 fix memory leaks from not g_free()ing string returned by gst_element_get_name - -2012-07-12 18:22:01 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 543/906 GstGLDisplay: fix segfault from GST_PTR_FORMAT trying to expand the object - -2012-07-12 18:19:44 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixer.h: - 542/906 GstGLMixer: add allocation and bufferpool methods - based off GstBaseTransform - -2012-07-12 18:11:11 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgltestsrc.c: - 541/906 GstGLTestSrc: generate a GLBufferPool instead of a VideoBufferPool in decide_allocation - -2012-07-12 18:09:57 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglmosaic.c: - * gst/gl/gstglmosaic.h: - 540/906 GstGLMosaic: update for GstGLMeta - -2012-07-12 18:07:34 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 539/906 GstGLImageSink: fold multiple fields into one and use VIDEO_SINK_* for window width/height - replace the caps information with a GstVideoInfo - place the window width/height information width VIDEO_SINK - -2012-07-11 14:20:14 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstgldeinterlace.h: - 538/906 GstGLDeinterlace: update for GstGLMeta - -2012-07-11 13:55:55 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfilterreflectedscreen.c: - 537/906 GstGLFilterReflectedScreen: update for GstGLMeta - -2012-07-11 13:37:55 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfilterglass.c: - 536/906 GstGLFilterGlass: update for GstGLMeta - -2012-07-11 13:11:59 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfilterlaplacian.c: - 535/906 GstGLFilterLaplacian: update for GstGLMeta - -2012-07-11 01:25:03 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfiltercube.c: - 534/906 GstGLFilterCube: Update for GstGLMeta - -2012-07-11 01:10:43 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglfilterblur.c: - 533/906 GstGLFilterBlur: update for GstGLMeta - -2012-07-09 22:27:48 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - 532/906 GstGLFilter: implement allocation vfuncs - -2012-07-09 22:26:12 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgleffects.c: - 531/906 GstGLEffects: update for GstGLMeta - -2012-07-09 16:17:18 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglupload.c: - 530/906 GstGLUpload: fix video scaling and use GL_UPLOAD_CAPS - -2012-07-09 16:15:28 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgldownload.c: - 529/906 GstGLDownload: fix video scaling and use GL_DOWNLOAD_CAPS - -2012-07-09 16:13:39 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmeta.h: - 528/906 GstGLMeta: seperate upload/download/normal GL caps video formats - differentiate between upload, download and GL caps - -2012-07-09 16:12:53 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 527/906 GstGLDisplay: add some trace debugging - -2012-07-08 13:11:05 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgltestsrc.c: - * gst/gl/gstgltestsrc.h: - 526/906 GstGLTestSrc: update for 1.0 - implement decide_allocation - rename push_src_create to _fill - use GstVideoInfo to convert times - make use of GstGLMeta and friends - -2012-07-08 01:50:41 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgldownload.c: - * gst/gl/gstgldownload.h: - 525/906 GstGLDownload: add allocation methods and use GstGLMeta - make GstGLDownload work with the new GstGLMeta and friends - -2012-07-08 01:49:06 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - 524/906 GstGLDisplay: rework the download code - data paramaters now take GstVideoFrame - remove redundant parameters - -2012-07-08 01:11:56 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglimagesink.c: - * gst/gl/gstglupload.c: - 523/906 update for meta API changes - -2012-07-08 01:10:40 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 522/906 GstGLDisplay: add forgotten function definition - -2012-07-08 01:09:56 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmemory.c: - 521/906 GstGLMemory: update for GstAllocator changes - -2012-07-07 22:56:33 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 520/906 GstGLMixer: fix for GstChildProxy changes - -2012-07-06 19:10:45 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglupload.c: - * gst/gl/gstglupload.h: - 519/906 GstGLUpload: implement the allocation funcs and use GstGLMeta - make use of the new GstGLMeta, GstGLMemory and GstGLBufferPool objects - -2012-07-06 19:07:45 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 518/906 GstGLImageSink: add propose_allocation impl and use GstGLMeta - make use of GstGLMeta and GstGLMemory - -2012-07-06 19:05:03 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglbufferpool.c: - * gst-libs/gst/gl/gstglbufferpool.h: - 517/906 add GstGLBufferPool - which adds GstGLMeta to buffers - -2012-07-06 18:57:39 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglmeta.c: - * gst-libs/gst/gl/gstglmeta.h: - 516/906 add skeleton GstGLMeta - the GstVideoMeta _map/unmap functions still need implementing - -2012-07-06 18:51:02 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - 515/906 GstGLDisplay: rework gen_texture and upload - rename functions so that other code can create textures in the GL thread - change upload functions to take a GstVideoFrame - default to GLSL for upload conversion - -2012-07-06 18:22:22 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglmemory.c: - * gst-libs/gst/gl/gstglmemory.h: - * tests/check/libs/gstglmemory.c: - 514/906 add GstGLMemory and allocator - implement custom GstMemory for GL textures - currently map/unmap returns NULL although it might be favourable to upload/download/cache the image data - -2012-06-19 18:40:28 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglmixerpad.h: - * gst/gl/gltestsrc.h: - * gst/gl/gstglcolorscale.h: - * gst/gl/gstgldownload.h: - * gst/gl/gstglimagesink.h: - * gst/gl/gstgltestsrc.h: - * gst/gl/gstglupload.h: - 513/906 Remove GstGLBuffer (to be replaced by GstGLMeta) - -2012-06-19 15:54:24 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixer.h: - * gst-libs/gst/gl/gstglmixerpad.h: - 512/906 GstGLMixer: update for 1.0 based on the videomixer2 element in -good - -2012-06-07 00:51:47 +1000 Matthew Waters <ystreet00@gmail.com> - - * tests/examples/clutter/clutteractor.c: - * tests/examples/clutter/clutteractortee.c: - * tests/examples/clutter/cluttershare.c: - * tests/examples/gtk/fxtest/fxtest.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - * tests/examples/gtk/gstgtk.c: - * tests/examples/sdl/sdlshare.c: - 511/906 tests: update for 1.0 - -2012-06-05 22:59:31 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 510/906 GstGLImageSink: update for 1.0 - -2012-06-05 19:10:19 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - 509/906 GstGLDisplay: update for 1.0 - -2012-06-05 18:53:38 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstgldownload.c: - 508/906 GstGLDownload: update for 1.0 - -2012-06-05 15:40:52 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gltestsrc.c: - * gst/gl/gltestsrc.h: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstgltestsrc.h: - 507/906 GstGLTestSrc: update for 1.0 - -2012-06-05 13:56:43 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglupload.c: - 506/906 GstGLUpload: update for 1.0 - -2012-06-04 18:44:56 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst/gl/gstglcolorscale.c: - 505/906 GstGLColorscale: update for 1.0 - -2012-06-03 20:40:53 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - 504/906 GstGLFilter: update for 1.0 - -fix up function definitions - -remove _prepare_output_buffer (functionality taken over by GstBufferPool). - -2012-05-30 13:46:21 +1000 Matthew Waters <ystreet00@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst/gl/gstglbumper.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfilterreflectedscreen.c: - * gst/gl/gstglfiltershader.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglmosaic.c: - * gst/gl/gstgloverlay.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 503/906 Rename GST_BOILERPLATE_* to G_DEFINE_TYPE_* and move _base_init into _class_init - -2012-05-29 17:55:44 +1000 Matthew Waters <ystreet00@gmail.com> - - * ext/libvisual/Makefile.am: - * gst-libs/gst/gl/Makefile.am: - * gst/gl/Makefile.am: - * pkgconfig/gstreamer-gl-uninstalled.pc.in: - * pkgconfig/gstreamer-gl.pc.in: - 502/906 Update versioning for gstreamer 1.0 - Renames GST_MAJORMINOR to GST_API_VERSION in build files - removes -lgstinterfaces from _LDADD flags - -2012-05-20 18:45:06 +0300 Raimo Järvi <raimo.jarvi@gmail.com> - - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_win32.c: - 501/906 Fix building on 64 bit mingw-w64 - https://bugzilla.gnome.org/show_bug.cgi?id=676428 - -2012-04-20 12:33:38 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 500/906 gldisplay: do not call glCheckFramebufferStatus if 0 is bound - Indeed it may return GL_FRAMEBUFFER_UNDEFINED if there is no - default framebuffer. - It seems to be the case on MacOSX - -2012-04-20 11:19:32 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/Makefile.am: - 499/906 examples: fix build on MacOSX - -2012-04-20 10:41:51 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 498/906 gldisplay: don't pass non-constant strings as printf format strings - Fixes 'format not a string literal and no format arguments' on darwin - -2012-04-20 10:32:23 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglshadervariables.c: - 497/906 filtershader: fix format compiler warnings - -2012-04-20 10:26:30 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/CMakeLists.txt: - 496/906 cmake build: add path to config.h on APPLE - -2012-04-18 15:44:05 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - 495/906 glES2.0: properly use glDeleteShader - -2012-04-17 18:25:55 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst/gl/CMakeLists.txt: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstglupload.h: - 494/906 cmake build: use config.h from win32/common and add some guidelines - -2013-06-28 00:04:43 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/gl/gstglfiltershader.c: - 493/906 glfiltershader: fix crash when loading shader file - Just use g_file_get_contents() instead of home-made file loading. - Fixes two issues - one is that we should pass "r" to fopen and - not O_RDONLY, the other is that an incorrect variable was used - to read the file length, leading to an empty shader file. - Spotted by: Wang Xin-yu (王昕宇) <comicfans44@gmail.com> - https://bugzilla.gnome.org/show_bug.cgi?id=702844 - https://bugzilla.gnome.org/show_bug.cgi?id=702845 - Conflicts: - gst/gl/gstglfiltershader.c - -2012-04-13 15:08:00 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - 492/906 glwindow: properly fails if resource not found - -2012-04-13 12:38:11 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/gstglimagesink.c: - 491/906 glES2.0: properly fails if driver/kernel inconsistency - -2012-04-11 10:44:23 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst/gl/gstgltestsrc.c: - 490/906 gldisplay: error out instead of g_assert - -2012-04-10 16:12:14 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglimagesink.c: - 489/906 glimagesink: pixel-aspect-ratio property now returns "1/1" by default - Previously it was not set - Fix bug #671734 (compatibility with Totem) - -2012-04-04 16:22:40 +0200 Julien Isorce <julien.isorce@gmail.com> - - * ext/libvisual/visual-gl.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/gstgleffects.c: - 488/906 libvisual-gl: full compatibility with projectM-libvisual if libprojectM >= 2.0.1 - Fix bug #310775 - -2012-03-06 14:31:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfiltershader.c: - 487/906 gl: Fix compiler warnings - 'if statement has empty body', which were real bugs and - 'comparison of unsigned expression < 0 is always false', which was - only an unneeded comparison. - -2011-12-22 15:30:38 +0100 Julien Isorce <julien.isorce@gmail.com> - - * ext/libvisual/visual-gl.c: - * gst-libs/gst/gl/gstgldisplay.c: - 486/906 libvisual-gl: add minimal support to libvisual plugins that uses Framebuffer objects - Fix bug #310775 - gst-launch audiotestsrc ! libvisual_gl_projectM ! glimagesink is working - but for now you cannot append any other opengl filters between - libvisual_gl_projectM and glimagesink because our FBO is turned OFF. - It would require that libvisual allows to split rendering between - pass1,2,3... and final rendering. In order to unbind our FBO before - the passN, and then rebind it just before the final libvisual rendering. - -2011-12-15 18:13:00 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 485/906 gstgldisplay: turn off texture binding and read buffer when downloading rgb is done - It fixes: (black image before) - gst-launch-0.10 audiotestsrc ! libvisual_gl_lv_gltest ! gldownload ! ximagesink - and - gst-launch-0.10 audiotestsrc ! libvisual_gl_lv_gltest ! gldownload ! glimagesink - -2011-12-15 18:08:48 +0100 Julien Isorce <julien.isorce@gmail.com> - - * ext/libvisual/visual-gl.c: - 484/906 libvisual_gl: correctly setup depth and blend functions - -2011-12-15 16:18:36 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 483/906 glelements: do not leak parent when using gst_pad_get_parent - -2011-11-25 16:51:59 +0100 Jonathan Matthew <notverysmart@gmail.com> - - * ext/libvisual/CMakeLists.txt: - * ext/libvisual/Makefile.am: - * ext/libvisual/visual-gl.c: - 482/906 ext: Add a libvisual plugin wrapping opengl libvisual - Fix bug #202069 - -2011-11-24 16:02:32 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst-libs/gst/gl/gstglmixer.c: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gstglbumper.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfiltershader.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglmosaic.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 481/906 feature checking: error out instead of doing nothing if an OpenGL feature is not present - Fix bug #572767 - -2011-11-21 16:46:51 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglshadervariables.c: - * gst/gl/gstglfiltershader.c: - * gst/gl/gstgloverlay.c: - 480/906 win32 builds: add glshader filter sources to vs9 and codeblocks - Also fix some warnings from msvc9 and mingw-3.4.5 - -2011-11-21 15:04:16 +0100 Руслан Ижбулатов <lrn1986@gmail.com> - - * gst-libs/gst/gl/gstglshadervariables.c: - 479/906 gstglshadervariables: strtok_r is not multiplatform - Fix bug #664367 - -2011-11-18 17:32:05 +0100 Wei Feng <wei.feng.wayne@gmail.com> - - * gst-libs/gst/gl/gstgles2.h: - 478/906 OpenGL ES 2.0: include glib.h to use G_BEGIN_DECLS in gstgles2.h - Fix bug #631019 - -2011-11-18 17:27:45 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgles2.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - 477/906 OpenGL ES 2.0: fix build since glfiltershader changes - -2011-11-18 17:26:35 +0100 Antoni Silvestre <antoni.silvestre@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - 476/906 OpenGL ES 2.0: fix build and disable some examples - Fix bug #631019 - -2011-11-18 12:16:22 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglmosaic.c: - 475/906 docs: add glmosaic and glshader to docs - -2011-11-18 11:52:10 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/gstopengl.c: - 474/906 build: make libjpeg use conditional - Disable gloverlay element if we do not hve libjpeg - -2011-11-18 10:10:59 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/CMakeLists.txt: - 473/906 cmake build: 2.8 is now required and add jpeg - jpeg and png should be optional but our cmake build is still in pre-alpha - -2011-11-18 08:08:18 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/gl/Makefile.am: - * gst/gl/gstopengl.c: - 472/906 linpng: make libpng use conditional - Disable 3 elements if we don't have libpng. - -2011-11-17 17:36:44 +0100 Luc Deschenaux <luc.deschenaux@freesurf.ch> - - * gst-libs/gst/gl/CMakeLists.txt: - * gst-libs/gst/gl/GNUmakefile.gnustep: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstgles2.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglshadervariables.c: - * gst-libs/gst/gl/gstglshadervariables.h: - * gst/gl/CMakeLists.txt: - * gst/gl/GNUmakefile.gnustep: - * gst/gl/Makefile.am: - * gst/gl/gstglfiltershader.c: - * gst/gl/gstglfiltershader.h: - * gst/gl/gstopengl.c: - 471/906 glshader: add dynamic fragment shader filter - Also add fragment shader parser - Fix bug #600195 - -2011-11-17 15:22:06 +0100 Anthony Violo <anthony.violo@ubicast.eu> - - * gst/gl/Makefile.am: - * gst/gl/gstgloverlay.c: - * gst/gl/gstgloverlay.h: - 470/906 gloverlay: add jpeg support - Fix bug #636070 - -2011-11-17 11:39:50 +0100 Anthony Violo <anthony.violo@ubicast.eu> - - * gst/gl/gstgloverlay.c: - * gst/gl/gstgloverlay.h: - 469/906 gloverlay: manage ratio texture - Fix bug #630525 - -2011-11-17 11:34:20 +0100 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/clutter/clutteractor.c: - 468/906 tests: fix commentary in clutteractor example - -2011-11-16 16:53:25 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglwindow_x11.c: - * tests/examples/clutter/clutteractor.c: - * tests/examples/clutter/clutteractortee.c: - * tests/examples/clutter/cluttershare.c: - 467/906 tests: various build fixes - - cmake could not find glib - - put gtk variables at the beginning to avoid GL conflicts - - update examples to clutter-1.8 - - use const instead of deprecated G_CONST_RETURN - - set max pending events to 0 to make cube example works again - -2011-08-03 09:08:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/examples/clutter/clutteractortee.c: - 466/906 tests: Fix variable unused but set compiler warning - -2011-08-03 09:07:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/gl/gstglbumper.c: - * gst/gl/gstgldownload.c: - 465/906 gl: Fix variable unused but set compiler warnings - -2011-05-25 11:21:19 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/gl/gstglimagesink.c: - 464/906 glimagesink: Interface query should return FALSE if the supplied interface is not GST_TYPE_X_OVERLAY - -2010-12-14 23:56:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgles2.h: - 463/906 Add some more G_{BEGIN,END}_DECLS to public headers - https://bugzilla.gnome.org/show_bug.cgi?id=637260 - -2010-10-19 18:00:33 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglshader.c: - * gst/gl/gstglbumper.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterreflectedscreen.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgloverlay.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 462/906 various: add missing G_PARAM_STATIC_STRINGS flags - Canonicalize property names as needed. Includes some gst-indent changes as well :/ - -2010-09-16 15:00:29 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/gl/gstglimagesink.c: - * tests/examples/clutter/clutteractor.c: - * tests/examples/clutter/clutteractortee.c: - * tests/examples/gtk/gstgtk.c: - 461/906 xoverlay: require base from git and update to new API - -2010-09-08 20:38:07 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/gl/gstgleffects.c: - 460/906 gstgleffects: Fix upper bound of an array iteration - 10 is above NEEDED_TEXTURES (currently 5) and makes the code consistent - with the rest of the usage in the file. - -2010-08-11 00:47:42 +1000 Jan Schmidt <thaytan@noraisin.net> - - * gst-libs/gst/gl/Makefile.am: - 459/906 Fix distcheck. - -2010-07-23 22:12:15 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglfilterreflectedscreen.c: - 458/906 glfilterreflectedscreen: fix some warnings from msvc9 - -2010-07-12 18:38:59 +0200 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/gtk/fxtest/pixbufdrop.c: - 457/906 gtk examples: adapt code since the native-window changes from gtk - Fixes bug #599885 - -2010-05-05 11:21:31 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 456/906 glfilter/glmixer/gltestsrc/glupload: throw an element error if no parent bin - Fixes bug #602153 - -2010-05-04 11:37:38 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 455/906 glimagesink: handle pixel-aspect-ratio - -2010-05-01 11:19:55 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 454/906 blur: fix gaussian kernel computation - -2010-04-29 20:49:02 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldifferencematte.h: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfilterblur.h: - 453/906 blur: give up some accuracy for speed - Settle with 7x7 gaussian convolution kernels, maybe slightly less - accurate than previous 9x9 but fast enough to be able to use it on i915. - About a 20% percent speed gain (again, roughly measured with - videotestsrc and glimagesink sync=false). No noticeable rendering - difference with current effects. - -2010-04-28 17:08:45 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 452/906 sin: get rid of hls conversion code - Get rid of buggy and complicated hls conversion code for the sin effect. - The only thing needed was hue anyway and it is easily calculated using - Preucil formula for rgb to polar coordinates conversion. - Now works on i915 (removed all the IF blocks). Still needs some tuning, - I wonder if it will ever work properly. - -2010-04-30 11:44:26 +0200 Roland Peffer <Roland.Peffer@clixxun.de> - - * gst/gl/gstglupload.c: - 451/906 glupload: par is already handled in fixate_caps function - Fixes bug #593165 - -2010-04-30 11:42:41 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglupload.c: - 450/906 indent: gstglupload.c - -2010-04-29 14:21:28 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - 449/906 sobel: drop unused single pass sobel shader - Drop unused sobel shader, if anyone still needs it, git log is your - friend. - -2010-04-29 14:20:56 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectxray.c: - 448/906 xray: increase edges visibility - Some little fine tuning, still not completely satisfied yet. - -2010-04-29 12:59:42 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gstgleffects.h: - 447/906 xray: port to the new separable sobel convolution - Port xray effect to use the same sobel convolution just used in - glfiltersobel. Now xray too works on i915 (a bit slow). - -2010-04-29 10:57:38 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstglfilterblur.c: - 446/906 blur: forgot to add all the changes in previous commit - -2010-04-29 09:15:21 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstglfilterblur.c: - 445/906 blur: use draw_texture from glfilter - -2010-04-29 09:02:12 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstglfilterlaplacian.c: - 444/906 laplacian: precalculate coordinates - Precalculate coordinates to avoid unneeded texture indirections. - Now laplacian works on i915. - -2010-04-29 08:27:29 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/gstglfiltersobel.c: - 443/906 sobel: move some highly duplicated code into glfilter - Add a new convenience function in GstGLFilter that just draws an input - texture to a target texture using a simple shader with just a "tex" - uniform sampler. - Move draw_texture from glfiltersobel to glfilter. Still need to update - other plugins to this. - -2010-04-27 21:56:04 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 442/906 blur: optimize coordinates calculations - Save 28 instructions on i915 (mainly redundant MOVs) and gain a 25% - (roughly measured with videotestsrc and glimagesink sync=false) speed - bump - -2010-04-27 19:38:33 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglfiltersobel.h: - 441/906 sobel: convolve only luma - Rework Sobel a little bit again making it work as the old one: - 1. desaturate input texture - 2. calculate horizontal convolution for x gradient and vertical - convolution for y gradient at the same time (halves the number of - needed texture lookups) - 3. store results in a single texture (red and green channel) - 4. calculate remaining convolution (same as above switching vertical and - horizontal) - 5. calculate length of gradient using red and green as x and y - components. - Optimize wherever possible, store kernels as constants in the shaders, - remove unneeded uniforms. Restore invert property carefully avoiding - using IF. - Still not sure if "full color" convolution will be needed, glfiltersobel - is to be intended as a demo filter and xray, the only effect which uses - sobel only needs edge intensity. Dropping it for now. - -2010-04-27 09:08:22 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglfiltersobel.h: - 440/906 sobel: implement sobel filter using separable kernels - Reimplement sobel in a multipass fully separated convolution: - - calculate x gradient map convolving first horizontally with blurring - kernel and then vertically with differentiating kernel - - calculate y gradient map convolving first vertically with blurring - kernel and then horizonally with differentiating kernel - - calculate length of the gradient vector - Particular care was needed with normalization of the blurring kernel and - with grey level offset of the differentiating one to prevent overflow of - rgb values from the 0.0,1.0 range in intermediate passes. - Now works on i915. - -2010-04-26 13:20:38 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 439/906 sobel: get rid of #version 120 dependent array constructors - -2010-04-27 11:07:04 +0200 Pierre Pouzol <pierre.pouzol@hotmail.fr> - - * gst/gl/gstglfilterreflectedscreen.c: - * gst/gl/gstglfilterreflectedscreen.h: - 438/906 glfilterreflectedscreen: improve behavior and add some properties - Fixes bug #612163 - -2010-04-26 23:48:15 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglfilterreflectedscreen.c: - 437/906 glfilterreflectedscreen: remove unused code (copied/pasted from glfilterglass) - -2010-04-26 23:42:38 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/gstglfilterreflectedscreen.c: - 436/906 gleffectssources: fix some warnings from msvc9 - -2010-04-26 23:38:59 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/GNUmakefile.gnustep: - 435/906 GNUStep build: add glfilterreflectedscreen sources - -2010-04-26 14:41:17 +0200 Pierre Pouzol <pierre.pouzol@hotmail.fr> - - * gst/gl/gstglfilterreflectedscreen.c: - * gst/gl/gstglfilterreflectedscreen.h: - 434/906 glfilterreflectedscreen: forgot to add sources - -2010-04-26 14:32:28 +0200 Pierre Pouzol <pierre.pouzol@hotmail.fr> - - * gst/gl/CMakeLists.txt: - * gst/gl/Makefile.am: - * gst/gl/gstopengl.c: - 433/906 glfilterreflectedscreen: add new OpenGL Reflected Screen filter - Fixes bug #612163 - -2010-04-26 14:11:28 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 432/906 GstGLDisplay: this is GL_DEPTH24_STENCIL8_EXT, not GL_DEPTH24_STENCIL8_EXT - -2010-04-26 13:57:00 +0200 Pierre Pouzol <pierre.pouzol@hotmail.fr> - - * gst-libs/gst/gl/gstgldisplay.c: - 431/906 GstGLDisplay: enable stencil buffer when using framebuffer objects. - Fixes Bug #612159 - -2010-04-26 12:45:57 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 430/906 convolution: save some indirection grouping math and sampling - Thanks to Eric Anholt I've finally understood (at least I hope) how to - count texture indirections and save up some. Texture sampling dependent - on the result of some math counts as an indirection phase. Grouped - texture lookups with no math involved count as a single indirection. - Math on the coordinates count as indirection. - So the best thing is to group all the math involving coordinates and - then do all the lookups. - This saves enough indirections to make glfilterblur and glow effect - work, albeit a bit slowly, on i915. - -2010-04-25 10:55:43 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstglfilterlaplacian.c: - 429/906 laplacian: remove unused norm_const and norm_offset uniforms - Remove unused uniforms from the laplacian filter. Also remove if - kerneli != 0 checks so that it compiles where IF is not available. - Again, big thanks to Eric Anholt for the hints. - -2010-04-13 16:20:02 -0700 Eric Anholt <eric@anholt.net> - - * gst/gl/gstglfilterlaplacian.c: - 428/906 laplacian: Avoid using GLSL 1.20 features in a non-#versioned shader. - Fixes compile on Mesa. - -2010-04-25 10:31:01 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 427/906 rgb_to_curve: save up a texture indirection - Apparently assigning gl_TexCoord to a temp count as an indirection. - Using it directly avoids it and limits indirections to four not - exceeding i915 limit. Now xpro effect works on i915. - -2010-04-25 10:04:28 +0200 Vinson Lee <vlee@vmware.com> - - * gst/gl/effects/gstgleffectssources.c: - 426/906 multiply: fix a compilation error with Apple compiler - Fix multiply_fragment_source to compile with Apple GLSL compiler. - https://bugzilla.gnome.org/show_bug.cgi?id=616748 - -2010-04-24 21:11:35 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 425/906 twirl: get rid of polar coordinates conversion - Get rid of polar coordinates in the twirl effect. The same can be done - using a rotation matrix, saving alu instructions and, most of all, - avoiding the use of the evil atan() function (which uses IF operators). - Calculate rotation angle in a saner, understandable way. - Works on i915! (Hope it still works elsewhere too as I'm not able to - test at the moment) - -2010-04-24 20:43:39 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 424/906 tunnel: get rid of polar coordinates conversion - Get rid of polar coordinates in the tunnel effect as the same can easily - be done just clamping the radius and multiplying. - Remove the evil atan() call that uses branching and a lot of unneeded alu - instructions. Now works on i915! - -2010-04-23 20:06:48 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldifferencematte.h: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfilterblur.h: - 423/906 convolution: generate gaussian kernel on the fly - Generate a normalized gaussian kernel with given size and standard - deviation on the fly. - Remove "norm_const" uniform from convolution shaders and provide a - normalized kernel instead. Remove norm_offset uniform as it was always - zero, will reintroduce it if really needed in the future. Thanks to Eric - Anholt for suggesting it. - Save some ALU instruction calculating directly the coordinate for - texture lookup instead of summing an offset. - Still exceed maximum indirect texture lookups on i915, the only solution - I see is using a 3x3 kernel. - -2010-04-23 17:49:45 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 422/906 convolution: reduce the number of register used - Reduce the number of register calculating texture lookup offset on the - fly. It was just a simple sequence, no need to store it in a array. - Fixes maximum number of registers exceeded error with i915. Still - exceed maximum indirect texture lookups and maximum ALU instructions. - Maybe we should gave up some blur goodness and use lightly more little - kernels. - -2010-04-23 17:37:21 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 421/906 convolution: don't check kerneli to be non zero - Apparently saving up some texture lookup for zero kernel elements is - definitely not worth the use of branching. This way convolution - fragment programs also work where IF operator is not supported (tested - on i915 and nouveau). See also discussion on bug #615696. - Thanks to Eric Anholt for spotting this. - -2010-04-23 17:30:45 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstglfilterblur.c: - 420/906 blur: use common shader sources - Port blur filter to use the common convolution shaders in - gstgleffectssources.c. This reduces code duplication and, incidentally, - the shaders in the common file were already updated to not use array - constructor and to not depend on #version 120. - First step towards bug #615696 fixing. - -2010-04-23 17:19:50 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstglfilterblur.c: - 419/906 blur: remove horizontal flip - Apparently there was some stale horizontal flip function still there - from my summer of code experiments. Remove it. - -2010-04-23 17:14:59 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 418/906 effects: disable gst-indent in the sources - Fix some crazy formatting caused by gst-indent previous runs and disable - the script for this file. The best would be to move shaders into - separate files and load them at runtime or hardcode them at compile - time. - -2010-03-31 12:40:12 +0200 Руслан Ижбулатов <lrn1986@gmail.com> - - * gst/gl/gstglbumper.c: - 417/906 glbumper: Use png_sig_cmp() instead of png_check_sig() - Fixes bug #613186 - -2010-03-24 11:10:21 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/gl/gstglbumper.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglmosaic.c: - * gst/gl/gstgloverlay.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 416/906 gl: use gst_element_class_set_details_simple() - Fixes #613371. - -2010-03-09 01:35:42 +0100 Nicholas Panayis <nick@movency.com> - - * gst-libs/gst/gl/gstglwindow_win32.c: - 415/906 gstglwindow_win32: share opengl context in correct order - Allow to use the opengl context sharing feature if the original - context has been used already. - This is only possible on win32 with wglShareLists because on other - backends, the sharing is made when a context is created. - This new feature is only usefull when using external context - because gst-gl internally makes sure that the orginal context is not - already used when sharing it. - Fix bug #611067 - -2010-03-09 01:24:06 +0100 David Hoyt <dhoyt@llnl.gov> - - * gst/gl/gstglbumper.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgloverlay.c: - 414/906 glbumper/gldifferencematte/gloverlay: libpng 1.4.x compatible - Fix bug #608643 - -2010-01-12 18:32:39 +0300 Руслан Ижбулатов <lrn1986@gmail.com> - - * tests/examples/gtk/fxtest/pixbufdrop.c: - 413/906 Fix Windows compiler warning in test/examples/gtk/fxtest/pixbufdrop.c - -2010-01-06 00:13:46 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/GNUmakefile.gnustep: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - * gst/gl/GNUmakefile.gnustep: - * gst/gl/effects/GNUmakefile.gnustep: - 412/906 Cocoa backend: improve support on GNUStep - -2009-12-18 00:34:13 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 411/906 gstglmixer: copy/past recent changes from gstvideomixer - -2009-12-16 01:33:39 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 410/906 gstglmixer: inactivate shared gl context before to release ours - First, inactivate shared gl contexts known by each sink pad. - Then, destroy the gl context known by the glmixer. - Finally, re-activate shared gl contexts. - This is to satisfy the fact that no shared gl context must be current - when an opengl context is destroyed. - Moreover the application may hang or crash without those steps. - -2009-11-25 10:24:37 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstgleffects.c: - 409/906 gleffects: indent and fix some warnings in ES 2.0 mode - -2009-11-21 21:40:14 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - * gst/gl/gstopengl.c: - 408/906 gleffects: start to make it compatible with OpenGL ES 2.0 - For now only identity, mirror and squeeze effects are available. - Maybe some factorization is needed about compilation shader - before to put the other effects since only a copy/past is needed, - at least until effect number 9: heat. - The effects from 10:sepia to 15:glow require more work. - -2009-11-21 13:32:59 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_winCE.c: - 407/906 winCE backend: fix build - -2009-11-21 13:21:54 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterapp.h: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 406/906 glimagesink: add a client-data property - Also add it to glfilterapp. - Fixes #559131 - -2009-11-17 23:47:24 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * tests/examples/clutter/cluttershare.c: - * tests/examples/sdl/sdlshare.c: - 405/906 glfilter: add external-opengl-context property - It repairs the cluttershare and sdlshare example - -2009-11-17 22:54:39 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglupload.c: - 404/906 glupload: repair external_opengl_context property - qglwtextureshare now works again. In this example, - the pipeline is src ! glupload ! fakesink. - So in this case the glupload element is a sink in - terms of gl chain. - But the problem is still there if the pipeline is - src ! glupload ! glfilter ! fakesink - (it's the case in sdlshare and cluttershare examples) - because since recent changes about how the gstgldisplay - is transmitted to the gl element, the context is usually - created by the sink in terms of gl chain. - A solution would be to also install this property on glfilter. - -2009-11-17 02:16:01 +0000 Jan Schmidt <thaytan@noraisin.net> - - * gst-libs/gst/gl/gstglmixer.c: - 403/906 gstglmixer: Initialise the debug category - Initialise the gstglmixer debug category before using it. - -2009-11-17 01:08:09 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstgloverlay.c: - 402/906 gloverlay: fix some warnings - -2009-11-16 14:32:16 +0100 Anthony Violo <anthony.violo@ubicast.eu> - - * gst/gl/gstgloverlay.c: - * gst/gl/gstgloverlay.h: - 401/906 gloverlay: Added rotate texture - fix #601277 - -2009-11-05 14:53:35 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 400/906 gstgldisplay: no need the I420 work around if ATI Mobility - fix #588653 - -2009-11-04 23:44:46 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - 399/906 glmixer: fix when no more gl elements after it - For example: - videotestsrc ! glupload ! ... ! glfiter ! ... ! glmosaic ! fakesink - Usefull when using glmixer inside cluttershare or sdlshare cases. - -2009-11-04 23:12:42 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstgldownload.c: - 398/906 gldownload: do not forgot to create the gl context - fix #600630 - -2009-11-04 23:11:54 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglmosaic.c: - 397/906 glmosaic: fix a comparison warning - -2009-11-04 23:10:16 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstgldifferencematte.c: - 396/906 gldifferencematte: fix some warnings from vc9 - -2009-10-28 10:41:53 +0100 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldifferencematte.h: - 395/906 differencematte: fix regressions from gdkpixbuf to libpng migration - The background image needs to be scaled to fit current texture size. - Previously this was done by gdk_pixbuf_scale_simple but that's been - removed. - Create a texture from the background pixbuf with correct dimensions and - use interpolation shader to scale it to the right size. Interpolation - fragment shader doesn't have too much sense if all the textures don't - have the same size so this seemed the most natural place to do the - scaling. It could probably be done with some custom texture mapping - outside the shader but it involved more code. - Fixes bug #599883. - -2009-10-27 17:02:23 +0100 Pratheesh Gangadhar <pratheesh.gangadhar@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 394/906 gstgldisplay: use of GL_DEPTH_COMPONENT16 if OpenGL ES 2.0 - glRenderbufferStorage does not accept GL_DEPTH_COMPONENT in - OpenGL ES 2.0. - Fix bug #593786 - -2009-10-27 15:27:14 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixer.h: - * gst/gl/gstglmosaic.c: - * gst/gl/gstglmosaic.h: - 393/906 glmosaic: for now it's a cube mosaic - Also use GPtrArray instead of GArray in glmixer. - And add a pipeline to tests/pieplines - -2009-10-27 11:14:38 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglmosaic.c: - 392/906 glmosaic: desactivate shader when done - -2009-10-26 11:44:35 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_cocoa.m: - 391/906 Cocoa: fix backend since recent changes - Before, the window size was given at its creation. Now, it's done at - the drawing step because it's only relevant when there is a glimagesink - element in the pipeline. - -2009-10-23 20:53:32 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstgloverlay.c: - 390/906 remove warnings from vs9 - -2009-10-23 20:52:32 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_win32.c: - 389/906 fix codeblocks build on win32 - -2009-10-23 10:52:39 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/CMakeLists.txt: - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - * gst/gl/CMakeLists.txt: - * gst/gl/Makefile.am: - * gst/gl/gstglbumper.c: - 388/906 just fix builds and indent - -2009-10-23 01:11:27 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgles2.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglmixer.c: - * gst-libs/gst/gl/gstglmixer.h: - * gst-libs/gst/gl/gstglmixerpad.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglmosaic.c: - * gst/gl/gstglmosaic.h: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - * gst/gl/gstopengl.c: - 387/906 glmixer: add a glmixer base element - glmixer can be seen as a glfilter except it handles N requested - sink pads. - Each sink pad and the src pad are video/x-raw-gl. - glmixer is responsible for managing different framerates from inputs. - It uses OpenGL context sharing. It means that each input is in its - own OpenGL context shared together and shared with the OpenGL context - of the ouput gl chain. - Also add a glmosaic which is an example of implementation of glmixer. - For now glmosaic is a cube but it will be fixed in the next commits. - For now the glmixer has some weird behaviours in some configurations - but it will be improved in the next commits. - The autotools builds is temporarly broken since those changes - have been made on win32. - -2009-10-23 01:07:29 +0200 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/gtk/fxtest/pixbufdrop.c: - 386/906 pixbufdrop: fix example on win32 - -2009-10-04 02:23:45 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/gstglbumper.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 385/906 rewrite the way a gstgldisplay is transmited to the gl elements - Before, a gstgldisplay was instancied by the gl src in terms of gl chain. - And then the next element got it through the first gstglbuffer. - Now, this is done though queries. - All glelements get their ref on a gstgldisplay in READY state. - This rewrite is mainly a first step to be able to share OpenGL context hold - by the gstgldisplay using more complex glelements. - For example, with a glvideomixer. The associated gstgldisplay of each gl chain - of the sink pads will share their OpenGL context. - -2009-10-16 18:08:11 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/gl/gstgldisplay.c: - 384/906 build: use <stdio.h> / "stdio.h" - -2009-10-16 17:29:08 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/gl/gstgldisplay.c: - 383/906 build: include <stdio.h> when using printf & co. - -2009-10-15 15:40:11 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgles2.h: - * gst/gl/gstglfiltercube.c: - 382/906 ES2.0: remove warnings - Partially fix #593786 - -2009-10-15 14:59:08 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - 381/906 EGL and GLX:: set a minimum depth size - -2009-09-21 15:00:02 +0200 Anthony Violo <anthony.violo@ubicast.eu> - - * gst/gl/gstgloverlay.c: - * gst/gl/gstgloverlay.h: - 380/906 gloverlay: can put video over png images - Fix bug #595303 - -2009-09-21 10:51:47 +0200 Anthony Violo <anthony.violo@ubicast.eu> - - * gst/gl/gstgloverlay.c: - 379/906 gloverlay: add support to use RGB png images - Previously restricted to RGBA, now gloverlay can also handle a RGB image. - -2009-09-19 14:31:28 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - 378/906 gldisplay: avoid to request gl thread when deleting a texture - A texture is not destroyed when when we are done with it. - This texture is just added to the texture pool in order to be - re-used. In this case no OpenGL code is executed so we do not need to - request gl thread. - -2009-09-19 14:16:25 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 377/906 gldisplay: avoid to request gl thread when generating a texture - Thanks to the texture pool the gl textures are re-used. - When re-using one, no opengl code is executed so do not need - to request gl thread. - -2009-09-01 15:21:39 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/gl/Makefile.am: - * gst/gl/Makefile.am: - 376/906 build: support openGLES on linux via autofoo. Partialy fixes #593786 - Add a pkg-config check for opengl and if not found assume opengl-es. If user has - none of both one still get build error later on (there is no pkg-config for - opengl-es). - Add more files to EXTRA dist and build the opengles variant if selected. - Simmilar changes could be done for the winCE backend. - -2009-09-02 10:06:36 +0200 Anthony Violo <anthony.violo@ubicast.eu> - - * gst/gl/gstgloverlay.c: - * gst/gl/gstgloverlay.h: - 375/906 gloverlay: can control image size and position - Fix bug #591591 - -2009-09-01 19:46:10 +0200 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/sdl/sdlshare.c: - 374/906 sdlshare example: fix build on win32 - -2009-08-31 17:26:34 +0200 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/sdl/sdlshare.c: - 373/906 sdlshare example: review includes order and fix closure - -2009-08-31 17:18:01 +0200 Miquel Àngel Farré <miquel.farre@gmail.com> - - * tests/examples/sdl/sdlshare.c: - 372/906 make sdlshare example work on linux. Fix bug #593486 - -2009-08-26 23:43:37 +0200 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/sdl/sdlshare.c: - 371/906 tests: add sdlshare example - It shows how to use gl textures that come - from gst gl elements inside a SDL OpenGL scene - -2009-08-17 15:48:09 +0100 Christian Schaller <christian.schaller@collabora.co.uk> - - * gst/gl/Makefile.am: - 370/906 Add missing header file to Makefile.am and update spec file to actually be for this package - -2009-08-03 17:52:31 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 369/906 define missing glew macro on older versions - -2009-08-03 10:13:02 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_cocoa.m: - 368/906 Cocoa backend: fix crash when resizing - Default implementation of NSOpenglView::update is not safe because it - just calls update on the opengl context whereas we are not in the gl thread. - Also fix the white flickering when resizing, because now we need to call - the draw callback manually when resizing. - -2009-07-31 18:17:55 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/gl/gstglimagesink.c: - 367/906 docs: fix GstXvImageSInk -> GstGLImageSink and reindent - -2009-07-30 00:36:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/gl/Makefile.am: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldifferencematte.h: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfilterblur.h: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglfiltersobel.h: - * gst/gl/gstgloverlay.c: - * gst/gl/gstgloverlay.h: - 366/906 docs: make remaining elements show up in docs - Split out declarations into header files and hook everything up so - that five more elements show up in the plugin docs. Fixes #559135. - -2009-07-27 09:58:20 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_cocoa.m: - 365/906 Cocoa backend: make sure that nsapp is initialized - gst-launch-0.10 videotestsrc ! tee name=t ! queue ! glimagesink t. ! queue ! glimagesink - now works properly on MacOSX - -2009-07-24 10:33:47 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/CMakeLists.txt: - * gst/gl/CMakeLists.txt: - 364/906 make the cmake build work on MacOSX - We can now generate a Xcode project (or Unix Makfiles), - see INSTALL file - -2009-07-24 10:12:07 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_cocoa.m: - 363/906 Cocoa backend: fix crash when closing - - All gstglwindow members are now modified only in the gl thread - to avoid thread concurrency - - OpenGL context is now properly clean - - fix a couple of things in implementation of xoverlay interface - -2009-07-17 16:47:41 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_cocoa.m: - 362/906 make cocoa backend work on MacOSX - It works with both gst-launch and a cocoa app (non-embedded and embedded) - But there is still some problems: - - sometimes crash when closing - - flickering when resizing - - embedded mode not perfect - I will first make the CMake build work with cocoa backend - in order to generate a XCode project. - Then it should be easier to fix those issues. - -2009-07-14 20:36:13 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * tests/examples/gtk/gstgtk.c: - 361/906 gstgtk: add missing license and copyright information - -2009-07-14 20:25:28 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * tests/examples/gtk/fxtest/fxtest.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - 360/906 examples: add missing copyright/license to my examples - -2009-07-13 16:32:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/gl/Makefile.am: - 359/906 gl: Link with -lm and fix indention - -2009-07-13 12:53:17 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst-libs/gst/gl/gstgldisplay.c: - 358/906 gstgldisplay: Close a small race starting the display thread - Take the display lock before signalling the create-context cond - to ensure the caller has dropped the lock and is therefore listening - for the signal. - -2009-07-13 12:52:31 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 357/906 x11: Don't crash when the X11 display is not available. - Error out cleanly instead of crashing when the X11 display can't - be contacted. - -2009-07-13 12:08:11 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/gl/Makefile.am: - 356/906 build: Fix typo: gstglbumber.h -> gstglbumper.h - -2009-06-25 21:32:38 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstgldeinterlace.c: - 355/906 same motion compensation - -2009-06-25 01:30:44 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/CMakeLists.txt: - * gst/gl/Makefile.am: - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstopengl.c: - 354/906 fix and add gldeinterlace filter to the builds - -2009-06-24 17:58:35 +0200 julien <julien@KJIS.(none)> - - * gst/gl/gstgldeinterlace.c: - * gst/gl/gstgldeinterlace.h: - 353/906 add a gldeinterlace filter - Greedyh operation implemented using OpenGL Shading Language. - We could add other operations later. - Does some good results but still not as expected. - That's why I do not add it yet to the build. - -2009-06-12 11:33:02 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglbumper.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - 352/906 fix typo - Change GST_GL_DISPLAY_PROJECTION_PERSPECIVE to - GST_GL_DISPLAY_PROJECTION_PERSPECTIVE. - Re-indent a couple of files that needed it. - -2009-06-09 20:35:26 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglimagesink.c: - 351/906 allow to switch xoverlay while being in paused state - -2009-06-07 20:19:03 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - 350/906 fix window position when using xoverlay - x, y are the coordinates of the position inside - the new parent window. - Fixes #584877 - -2009-06-06 14:34:57 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 349/906 can switch xoverlays while playing - Fixes bug #584877 - Before this commit calling "gst_x_overlay_set_xwindow_id" more - than one time, had no effect. - It mainly affects the glimagesink implementation. - But on win32 (and CE), some stuff has to be done to - release the old parent. - And add a switchxoverlay example where the user - can click on left/right part of the main window to - switch the xoverlay. - -2009-06-04 09:50:52 +0200 LRN <lrn1986@gmail.com> - - * gst/gl/Makefile.am: - 348/906 Add gstvideo to glimagesink LIBADD. Fixes bug #584680 - -2009-06-04 00:27:44 +0200 LRN <lrn1986@gmail.com> - - * gst-libs/gst/gl/gstglwindow_win32.c: - 347/906 fix miscast of a pointer in SetWindowLongPtr - GCC 4.4.0 complains error: cast from pointer to integer of different size - Fixes #584678. - -2009-05-12 11:41:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/gl/Makefile.am: - 346/906 Fix linking by providing libtool the correct --tag parameter - -2009-05-11 18:06:18 +0200 julien <julien@KJIS.(none)> - - * tests/examples/clutter/cluttershare.c: - 345/906 change rotation center in cluttershare example - -2009-05-09 21:30:30 +0200 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/clutter/cluttershare.c: - 344/906 Use a more complex gst gl pipeline in the cluttershare example - -2009-05-09 21:26:42 +0200 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/clutter/cluttershare.c: - 343/906 Add a signal watch bus callback to check gst messages - -2009-05-09 20:51:36 +0200 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/clutter/cluttershare.c: - 342/906 Fix texture actor update due to a too strong thread locking. - On linux, the GSource func attached to the clutter_threads_add_idle - was not getting the cpu ressource periodically. - Because the use of clutter_threads_enter/leave inside the fakesink - callback seems to be too strong. - So remove the use if clutter_threads_enter/leave in the fakesink callback. - Then replace GQueue by GAsyncQueue to keep thread safe access to the - communication queues between clutter and gst-gl. - Call clutter_threads_add_idle with high priority. - -2009-05-09 15:44:09 +0200 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/clutter/cluttershare.c: - 341/906 Properly clean up pending gst gl buffers in cluttershare example - -2009-05-08 21:43:56 +0200 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/clutter/cluttershare.c: - 340/906 Fix cluttershare example. - It requires at least clutter 0.8.6 since lower clutter versions are - not compatible with GL_TEXTURE_RECTANGLE_ARB. - Remove use of ClutterEffectTemplace since it does not exist in - clutter 0.9. - -2009-05-04 11:24:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/examples/clutter/cluttershare.c: - 339/906 Cast to a GstBuffer* before passing to gst_buffer_unref to fix compiler warning - -2009-05-02 14:27:23 +0200 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/clutter/cluttershare.c: - 338/906 Use GQueue in the cluttershare example - -2009-04-30 23:40:38 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * tests/examples/clutter/cluttershare.c: - 337/906 Improve cluttershare example - Use clutter_threads_API. - When just using glupload from rgb, we have to be sure that - the upload texture is not in use in our gst gl context. - -2009-04-20 18:17:54 -0400 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - 336/906 x11/x11ES fix some pointer cast warnings - -2009-04-20 23:55:51 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_cocoa.m: - 335/906 cocoa update since interface changed - -2009-04-20 23:48:15 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst/gl/gstglupload.c: - * gst/gl/gstglupload.h: - * tests/examples/clutter/cluttershare.c: - 334/906 win32/winCE fix some pointer cast warnings with mingw - And turn off deprecated Wp64 msvc compiler option. - -2009-04-20 00:52:41 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - 333/906 add force-aspect-ratio support - -2009-04-18 16:08:23 +0200 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/clutter/cluttershare.c: - 332/906 just gst-indent and C90 on cluttershare example - -2009-04-18 08:40:51 -0400 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - * gst/gl/gstglupload.c: - 331/906 indent and fix some compiler warnings - -2009-04-18 13:57:44 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_cocoa.m: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - * gst/gl/gstglupload.h: - * tests/examples/clutter/cluttershare.c: - 330/906 Can now share textures with an external gl context - The external opengl context must be specify when creating - our OpenGL context (glx) or just after (wgl). - When calling glXCreateContext or wglShareLists, the - external opengl context must not be current. - Then our gl context can be current in the gl thread while - the external gl context is current in an other thread. - See tests/examples/clutter/cluttershare.c - -2009-04-12 22:24:06 -0700 David Schleef <ds@hutch-2.local> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_cocoa.m: - 329/906 Build for Cocoa on darwin, with various fixes - -2009-04-12 20:03:30 -0700 David Schleef <ds@hutch-2.local> - - * tests/examples/gtk/fxtest/fxtest.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - * tests/examples/gtk/gstgtk.c: - 328/906 Convert gtk examples to use helper library - Helper lib implements gst-gtk glue on all platforms - -2009-04-10 20:42:59 +0200 Julien <julien@Julien-Kubuntu.(none)> - - * gst-libs/gst/gl/gstgldisplay.c: - 327/906 fix init FBO's texture attachment on ES 2.0 - -2009-04-10 20:30:46 +0200 Julien <julien@Julien-Kubuntu.(none)> - - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgles2.h: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst-libs/gst/gl/gstglwindow_x11ES2.c: - 326/906 add X backend for OpenGL ES 2.0 - -2009-03-29 15:40:16 +0000 Filippo Argiolas <filippo.argiolas@gmail.com> - - * tests/examples/clutter/clutteractortee.c: - 325/906 Restore glimagesink instead of ximagesink - Partially revert previous commit. It's not an issue with glimagesink - Xoverlay interface. It's always the same intel bug with direct - rendering redirection (the one that affects each opengl application - with compositing managers). It works fine with DRI2 and UXA - acceleration. Still leaving effects disabled because I'm testing intel - hardware that doesn't support FBOs. - -2009-03-29 09:01:55 +0000 Filippo Argiolas <filippo.argiolas@gmail.com> - - * tests/examples/clutter/clutteractortee.c: - 324/906 Temporary disable glimagesink in clutteractortee - GLimagesink XOverlay interface doesn't seem to work with composite - redirection on intel (and I believe ati too). Windows aren't - redirected offscreen at all. This commit just shows that the example - correcty works with ximagesink. The most evident difference I see is - that glimagesink reparents the xoverlay window into its own while both - x and xvimagesink destroy their window and render directly to the - xoverlay one. - -2009-03-29 08:51:16 +0000 Filippo Argiolas <filippo.argiolas@gmail.com> - - * tests/examples/clutter/clutteractortee.c: - 323/906 Remove redundant XMoveWindow call - Revert the "move windows" thing from commit - 175f7a707bc922f3facc63e7d9b6d01f9bb6b1b0 - Windows are offscreen who cares about their position? If you see the - windows something is going wrong with composite redirection. - -2009-03-18 22:46:56 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 322/906 download YUY2/UYVY fix a regression - The call to glLoadIdentity was removed by mistake during - OpenGL ES 2.0 integration. - -2009-03-15 14:48:19 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstgles2.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_winCE.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfiltercube.h: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglupload.c: - * gst/gl/gstopengl.c: - 321/906 add OpenGL ES 2.x support. - In OpenGL 2.x for Embedded System, a lot of basic scene/draw functions - have been removed. It means that everything is made using vertex and - fragment shaders. - I have also added a gstglwindow backend for winCE that uses EGL - (Native Platform Graphics Intercace) (which is a full part of - OpenGL ES specification). It remove the use of wgl/glx functions. - -2009-03-07 03:13:38 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_cocoa.m: - 320/906 fix position and content rect - -2009-03-06 22:43:41 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_win32.c: - 319/906 win32 backend fix transmition message to the parent. - The Qt mouvexoverlay example shows how to rotate the cube - by moving (+click) the mouve over a qwidget using xoverlay - interface. - -2009-02-26 17:45:21 -0500 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/GNUmakefile.gnustep: - * gst/gl/GNUmakefile.gnustep: - * gst/gl/effects/GNUmakefile.gnustep: - 318/906 rename GNUmakefile(s) to GNUmakefile(s).gnustep - -2009-02-26 01:06:58 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/GNUmakefile: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_cocoa.m: - * gst/gl/GNUmakefile: - 317/906 implement gstglwindow for Cocoa (MacOS and GNUstep) - -2009-02-25 00:39:48 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/CMakeLists.txt: - 316/906 remove some unused HAVE_LIBPNG: libpng is a required package - -2009-02-25 00:12:12 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/GNUmakefile: - * gst/gl/CMakeLists.txt: - * gst/gl/GNUmakefile: - * gst/gl/effects/GNUmakefile: - 315/906 add GNUstep build - -2009-02-23 11:07:22 -0800 David Schleef <ds@schleef.org> - - * pkgconfig/gstreamer-gl-uninstalled.pc.in: - 314/906 Add srcdir to includes for out-of-source builds - When you use gstreamer uninstalled and build outside - the source tree, the includes need to be specified for - both the source tree and the build tree. - -2009-02-23 13:39:29 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/gl/gstglfiltercube.c: - 313/906 indent: don't use tabs inside property descriptions - -2009-02-23 13:35:48 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/gl/gstglbumper.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgloverlay.c: - 312/906 build: include stdlib.h when using free(). - -2009-02-22 19:36:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - 311/906 Cast GstBuffer subclasses to GstBuffer * before passing to gst_buffer_unref() - -2009-02-10 22:39:14 -0800 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gltestsrc.c: - * gst/gl/gstglbumper.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgloverlay.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - * gst/gl/gstopengl.c: - * tests/examples/clutter/clutteractor.c: - * tests/examples/clutter/clutteractortee.c: - * tests/examples/gtk/fxtest/fxtest.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - 310/906 Global reindent - Indent parameters: - INDENT_PARAMETERS="--braces-on-if-line \ - --case-brace-indentation0 \ - --case-indentation2 \ - --braces-after-struct-decl-line \ - --line-length80 \ - --no-tabs \ - --cuddle-else \ - --dont-line-up-parentheses \ - --honour-newlines \ - --continuation-indentation4 \ - --tab-size8 \ - --indent-level2" - -2009-02-03 18:58:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 309/906 Replay: Fix callbacks passed over XEvents on 64 bit architectures - Althought the XEvent's xclient.data.l array is an array of - longs they will be constrained to 32 bit by the X11 protocol. - On 64 bit architectures use two elements of the array to store - one pointer. - This fixes segfaults that happen at least for every example - on startup. - -2009-02-05 13:13:51 -0800 David Schleef <ds@schleef.org> - - * gst/gl/CMakeLists.txt: - * gst/gl/Makefile.am: - * gst/gl/gstgloverlay.c: - * gst/gl/gstopengl.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - 308/906 Rename glpixbufoverlay to gloverlay - -2009-02-04 16:57:14 -0800 David Schleef <ds@schleef.org> - - * gst/gl/Makefile.am: - * gst/gl/gstglpixbufoverlay.c: - * gst/gl/gstopengl.c: - 307/906 Remove conditionals on gdkpixbuf - -2009-02-08 01:50:10 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/CMakeLists.txt: - * gst/gl/CMakeLists.txt: - 306/906 fix CMake build and frozen CodeBlocks build - -2009-02-07 21:19:24 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/CMakeLists.txt: - 305/906 CMake build now checks for libpng - -2009-02-05 19:59:27 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglshader.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstglpixbufoverlay.c: - * gst/gl/gstopengl.c: - 304/906 only load RGBA files.png - -2009-02-04 16:18:15 -0800 David Schleef <ds@schleef.org> - - * gst/gl/Makefile.am: - 303/906 Add libpng dependency - -2009-01-26 16:30:22 -0800 David Schleef <ds@schleef.org> - - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstglpixbufoverlay.c: - 302/906 Fix some warnings - -2009-01-23 02:04:23 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstglpixbufoverlay.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - 301/906 depends on libpng instead of gdk_pixbuf - -2009-01-22 02:19:31 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglbumper.c: - * gst/gl/gstglpixbufoverlay.c: - * gst/gl/gstopengl.c: - 300/906 use libpng in glpixbufoverlay filter. - -2009-01-22 01:16:38 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglbumper.c: - * gst/gl/gstglbumper.h: - 299/906 use libpng to load the normal map instead of using gdkpixbuf - -2009-02-10 21:57:31 -0800 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gltestsrc.c: - * gst/gl/gstglbumper.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglpixbufoverlay.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - * gst/gl/gstopengl.c: - * tests/examples/clutter/clutteractor.c: - * tests/examples/clutter/clutteractortee.c: - * tests/examples/gtk/fxtest/fxtest.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - 298/906 Revert "Fix indention" - This reverts commit 96e4ab18c2cf9876f6c031b9aba6282d0bd45a93. - You should have asked first. And you would have been told "no", - because it causes people on development branches to do a huge - amount of extra work. - -2009-02-10 21:57:08 -0800 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 297/906 Revert "Fix callbacks passed over XEvents on 64 bit architectures" - This reverts commit 280771d09b58617b27201027de0e1194da376e72. - -2009-02-03 18:58:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 296/906 Fix callbacks passed over XEvents on 64 bit architectures - Althought the XEvent's xclient.data.l array is an array of - longs they will be constrained to 32 bit by the X11 protocol. - On 64 bit architectures use two elements of the array to store - one pointer. - This fixes segfaults that happen at least for every example - on startup. - -2009-02-03 18:33:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gltestsrc.c: - * gst/gl/gstglbumper.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglpixbufoverlay.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - * gst/gl/gstopengl.c: - * tests/examples/clutter/clutteractor.c: - * tests/examples/clutter/clutteractortee.c: - * tests/examples/gtk/fxtest/fxtest.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - 295/906 Fix indention - -2009-02-03 11:23:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 294/906 Fix format string compiler warnings by using G_GUINT64_FORMAT - -2009-01-15 18:39:48 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglbumper.c: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstglpixbufoverlay.c: - 293/906 minimal gtk doc - -2009-01-09 17:46:01 -0800 David Schleef <ds@hutch-2.local> - - * gst/gl/effects/gstgleffectssources.h: - 292/906 Add 'extern' for data symbols in headers - -2009-01-09 17:20:25 -0800 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/gstgldisplay.c: - 291/906 Add check for GLEW_EXT_framebuffer_object - -2009-01-08 19:18:47 -0800 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/Makefile.am: - 290/906 Set GL_LIBS correctly in configure.ac - This doesn't detect the existence of libraries, which needs to - be fixed. - -2009-01-07 19:11:01 -0800 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/Makefile.am: - * gst/gl/Makefile.am: - 289/906 build fixes for Windows libraries - -2008-12-14 12:06:06 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 288/906 add more debug ouputs about GLSL and mesa - -2008-12-13 19:36:32 -0500 julien <julien@julien-desktop.(none)> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 287/906 fix a regression about glXChooseVisual which failed when using mesa, so attributes must be less restrictives. - -2008-12-13 00:50:16 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_win32.c: - 286/906 win32 Register window class in gst_gl_window_class_init - -2008-12-07 03:25:59 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst/gl/gstglupload.c: - * tests/examples/clutter/clutteractortee.c: - 285/906 fix gl framerate in gst caps. Consider position in xoverlay. Fix inversion bettween COLS and ROWS, and move windows. - -2008-11-29 22:16:44 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - 284/906 workaround about the ATI shader compiler on linux (setlocale) - -2008-11-25 01:01:01 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 283/906 better result in cube and doublecube example. And some clean up debug and comments - -2008-11-23 16:14:26 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/CMakeLists.txt: - 282/906 update CMake build - -2008-11-23 16:04:27 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - 281/906 Make cube example work on x11. Finish TODO task 9. - -2008-11-22 16:43:24 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst/gl/gstglimagesink.c: - 280/906 Remove set_visible, because it's now automatically done when the first post redisplay comes. - -2008-11-22 00:51:30 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 279/906 finish set_xwindow_id (gst_gl_window_set_external_win_id): child is resized at the same time as the parent is. - -2008-11-21 20:51:48 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 278/906 Implement set_xwindow_id (gst_gl_window_set_external_window_id). - -2008-11-21 19:37:21 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 277/906 open x client connection for sender only at start up - -2008-11-21 19:11:11 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_x11.c: - 276/906 better deal with last pending custom cb and destroy_context_cb - -2008-11-21 01:31:19 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglwindow_x11.c: - 275/906 Make sure the gl ressoures are destroyed before to destroy gl window - -2008-11-20 01:24:10 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - 274/906 add some other debug outputs and checks - -2008-11-19 00:07:22 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst/gl/gstglimagesink.c: - 273/906 add some debug outputs about Visual and XVisualInfo - -2008-11-17 01:04:32 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 272/906 add a visible member to deal better with the first expose events - -2008-11-16 16:57:00 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 271/906 revert last commit because the crash comes from libselinux - -2008-11-15 23:32:04 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 270/906 fix use of different Display structures which point on the same display name - -2008-11-15 18:51:44 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 269/906 Better deal with XNextEvent and XSendEvent - -2008-11-15 02:24:07 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 268/906 Better deal with Atoms - -2008-11-14 01:00:33 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 267/906 Get ride of calling sleep in gl thread X loop - -2008-11-13 02:05:33 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 266/906 secure close when clicking on the cross - -2008-11-13 01:29:10 +0100 Julien Isorce <julien.isorce@gmail.com> - - 265/906 CRLF -> LF - -2008-11-13 01:23:51 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst/gl/gstglimagesink.c: - 264/906 Rewrite gstglwindow_x11.c because X API is not thread safe. - -2008-11-11 03:19:51 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 263/906 discard x custom messages which are of date - -2008-11-09 23:23:30 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst/gl/Makefile.am: - 262/906 Works on linux but still some bugs. Fix autotools build. - -2008-11-09 22:14:29 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 261/906 implement quit x message loop - -2008-11-09 02:44:25 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - 260/906 try to make XSendEvent blocker (as win32 SendMessage is) - -2008-11-06 23:41:11 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglwindow_x11.c: - 259/906 continue x implementation (but still not tested) - -2008-11-06 01:28:26 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow_x11.c: - 258/906 setup x message loop - -2008-11-05 02:06:33 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_x11.c: - * gst/gl/gstglupload.c: - 257/906 begin gstglwindow_x11.c implementation - -2008-10-29 23:53:22 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/CMakeLists.txt: - 256/906 fix CMake an CodeBlocks builds - -2008-10-28 21:44:09 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglwindow_win32.c: - 255/906 fix window closure when using gst xoverlay interface - -2008-10-28 01:38:45 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_win32.c: - 254/906 Better handle when the parent window is resizing, and cleanup some code - -2008-10-28 00:22:27 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 253/906 win32: re-implement supports for gst xoverlay interface, on this branch - -2008-10-25 16:18:23 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_win32.c: - 252/906 avoid a dead lock on window closure - -2008-10-25 02:03:16 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglwindow_win32.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 251/906 Properly clean OpenGL contexts - -2008-10-24 01:39:00 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglwindow_win32.c: - 250/906 win32: basic stuffs are working now on this branch with this new deep design (gstglwindow) - -2008-10-23 01:40:52 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/CMakeLists.txt: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglwindow.h: - * gst-libs/gst/gl/gstglwindow_win32.c: - 249/906 begin GstGLWindow in order to totally remove gstfreeglut - -2008-10-16 23:47:01 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/CMakeLists.txt: - * gst/gl/effects/gstgleffectxray.c: - 248/906 fix msvc warnings and update CMake build, win32 CodeBlocks build and vs8 build - -2008-10-15 16:18:22 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffectscurves.h: - * gst/gl/effects/gstgleffectxray.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - * tests/examples/gtk/fxtest/fxtest.c: - 247/906 Import xray effect - Add xray effect. Maps luma to a negative, slightly cyan tinted, curve, - applies some light gaussian blur and multiplies it with its sobel edges. Not - sure about the name, likely to change. Probably still needs some tuning. - -2008-10-15 16:14:52 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - 246/906 Add multiply fragment shader - Add a fragment shader to blend two textures with multiply blend mode - -2008-10-15 15:49:12 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/gstglfiltersobel.c: - 245/906 Add invert property to sobel filter - Add an invert property to sobel_fragment_source and Sobel filter. Useful - to have dark edges with white background. - -2008-10-15 12:50:07 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectlumatocurve.h: - 244/906 Make luma_to_curve non-static - Make luma_to_curve public so that it can be used as a step for more - complex effects. - -2008-10-15 12:42:29 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 243/906 Support for missing videoformats in glupload - Add support for missing alpha channeled videoformats (RGBA, BGRA, - ARGB, ABGR) in gst_gl_display_do_upload_fill. - -2008-10-13 23:14:27 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - 242/906 Fix crash in filters when going to NULL with no display - -2008-10-11 11:45:54 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/CMakeLists.txt: - 241/906 fix CMake build - -2008-10-04 22:34:07 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldownload.c: - 240/906 Build gtk-docs for plugins. - Add include to otherwise empty .types file to fix the scanner build. - Edit Makefile.am, .sections, -docs.sgml to scan all plugins and include - them in the master file. Fix xml errors in two sources (missing closing - tag). - -2008-09-29 23:45:10 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gltestsrc.c: - * gst/gl/gstglbumper.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - * gst/gl/gstopengl.c: - 239/906 start to write the gtk doc - -2008-09-25 22:25:29 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilterglass.c: - 238/906 fix glfilterglass (reason: videotestsrc rgb is by default bpp=32, depth=24, so alpha channel is 0) - -2008-09-24 19:32:48 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/CMakeLists.txt: - 237/906 update cmake build and the 2 frozen win32 builds (CodeBlocks, vs8) - -2008-09-23 10:37:58 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/CMakeLists.txt: - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstglfiltersobel.c: - * gst/gl/gstopengl.c: - 236/906 import sobel edge detector from cvs branch - -2008-09-24 02:07:41 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglfilterglass.c: - 235/906 can use several G_LOG_DOMAINs and GST_CATegories, with msvc8 - -2008-09-22 09:47:16 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstglpixbufoverlay.c: - 234/906 use right blending function with pixbuf overlay - -2008-09-21 10:58:13 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 233/906 no need to explicit set the debug category if default one is used - -2008-09-21 10:04:49 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - 232/906 use texture1 for curve textures - -2008-09-21 19:26:37 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/CMakeLists.txt: - * gst/gl/Makefile.am: - * gst/gl/gstglfilterglass.c: - * gst/gl/gstglfilterglass.h: - * gst/gl/gstopengl.c: - 231/906 Add a glfilterglass inspired from http://www.mdk.org.pl/2007/11/17/gl-colorspace-conversions - -2008-09-21 16:40:38 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstglshader.c: - 230/906 explicit check g_getenv return value to be not NULL - -2008-09-20 15:44:24 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/gstgldownload.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - * gst/gl/gstgltestsrc.h: - * gst/gl/gstglupload.c: - * gst/gl/gstopengl.c: - 229/906 update authors from the CVS repository - -2008-09-20 14:12:49 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstglshader.c: - 228/906 output shaders info log only if GST_GL_SHADER_DEBUG env variable is set. Should fix TODO task 18 - -2008-09-19 12:47:06 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectrgbtocurve.c: - 227/906 explicitly bind the main texture and the curve one to separate units in rgb and luma to curve effects. This should solve the issue pointed in TODO item 21. - -2008-09-18 22:50:05 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 226/906 check on win32 that every tests/pipelines and tests/examples (generic, gtk, qt) still work - -2008-09-18 21:13:37 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 225/906 fix a regression that made the gltestsrc element not working - -2008-09-16 02:10:31 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 224/906 fix a regression about MESA YCbCr colorspace conversion - -2008-09-14 23:22:58 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 223/906 fix a regression (sometimes a FBO is needed even if the video source is rgb) - -2008-09-14 19:56:50 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/gstgleffects.c: - 222/906 Finish TODO task 17 - -2008-09-13 19:47:44 +0200 Julien <julien@bowob.(none)> - - * gst-libs/gst/gl/gstgldisplay.c: - 221/906 fix g_int_hash -> g_direct_hash - -2008-09-13 18:17:42 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 220/906 Use a better key for the pool of textures - -2008-09-13 03:32:04 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstgltestsrc.h: - * gst/gl/gstglupload.c: - 219/906 Use a gst debug category for GstGLDisplay instead of g_print, gst-launch-0.10 --gst-debug=gldisplay:3 videotestsrc ! glimagesink - -2008-09-12 01:13:50 +0200 Julien <julien@bowob.(none)> - - * gst-libs/gst/gl/CMakeLists.txt: - * gst/gl/Makefile.am: - 218/906 The CMake build now works on my Kubuntu-KDE4.1.1 - -2008-09-11 02:07:12 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/CMakeLists.txt: - * gst/gl/CMakeLists.txt: - 217/906 Add cmake build http://www.cmake.org. See CMake install instructions in the INSTALL file. (I have not correctly configured yet the CMake build for unix, BE patient) - -2008-09-07 17:44:42 +0200 Julien <julien@bowob.(none)> - - * gst/gl/gstopengl.c: - 216/906 fix glbumper related gtk dependencies - -2008-09-07 14:17:57 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/gstopengl.c: - 215/906 glbumper is compiled only when having GdkPixBuf. And update win32 codeblocks build - -2008-09-07 01:38:10 +0200 julien User <julien@ubuntu.ubuntu-domain> - - * gst/gl/gstglbumper.c: - 214/906 update codeblocks build on linux and fix a warning - -2008-09-07 01:23:19 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglbumper.c: - * gst/gl/gstglbumper.h: - 213/906 forgot to add the bumper files - -2008-09-07 00:45:34 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst/gl/Makefile.am: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglpixbufoverlay.c: - * gst/gl/gstopengl.c: - 212/906 add a glbumper (bump mapping filter through GLSL) that exposes how to use both vertex and fragment shaders - -2008-08-25 10:34:54 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 211/906 Fix upload AYUV and YV12 (a regression in last commits) - -2008-08-24 16:33:26 +0200 julien User <julien@ubuntu.ubuntu-domain> - - * gst-libs/gst/gl/gstgldisplay.c: - 210/906 get ride of a wrong color on nvidia/linux when converting yv12 to rgb through GLSL - -2008-08-24 15:39:14 +0200 julien User <julien@ubuntu.ubuntu-domain> - - * gst-libs/gst/gl/gstgldisplay.c: - 209/906 fix warnings - -2008-08-24 04:24:29 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 208/906 fix upload AYUV, regression during the 2 last commits - -2008-08-24 03:38:40 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 207/906 oups, fix my mistake on last commit - -2008-08-24 03:12:12 +0200 unknown <Luc@.(none)> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/BUGS: - * gst/gl/gstgldownload.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglupload.c: - 206/906 Do not use frame buffer object when "input video is RGB" or when "GLSL is not available and YCbCr is available". So frame buffer object is not a plugin requirement anymore. So I decreased the OpengGL version from 1.4 to 1.2 (maybe less?) - -2008-08-21 11:12:42 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - 205/906 use a GHash table instead of a GData for the texture pool - -2008-08-20 15:47:51 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 204/906 get ride of a bug on ATI related to YV12 to rgb conversion through GLSL and add an example - -2008-08-20 10:02:02 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstglpixbufoverlay.c: - 203/906 use opengl for pixbuf resizing in glpixbufoverlay, start to work on properties - -2008-08-20 09:26:46 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstglpixbufoverlay.c: - 202/906 use fixed opengl pipeline for glpixbufoverlay (any drawback?) - -2008-08-20 09:24:53 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 201/906 fix a signedness warning - -2008-08-20 00:11:39 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 200/906 get ride of a ATI bug related to GLSL colorspace conversion for I420 and YV12 to rgb - -2008-08-19 22:15:17 +0200 Julien Isorce <julien.isorce@gmail.com> - - * tests/examples/gtk/fxtest/pixbufdrop.c: - 199/906 add pixbufdrop vs8 project - -2008-08-19 21:04:29 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstgldifferencematte.c: - * tests/examples/gtk/fxtest/fxtest.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - 198/906 add fxtest vs8 project - -2008-08-19 11:07:18 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstgleffects.c: - 197/906 Shaders which are in the shaderstable are now released - -2008-08-19 09:48:14 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstgldifferencematte.c: - 196/906 fix a differencematte memory issue - -2008-08-19 08:50:14 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/gstgldifferencematte.c: - * tests/examples/gtk/fxtest/pixbufdrop.c: - 195/906 fix gstgldifferencematte and add an example app to test it dragging an image over the video (works with pixbufoverlay too, see pixbufdrop --help) - -2008-08-18 21:50:09 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/gstgldifferencematte.c: - 194/906 another typo, restore old twirl fragment source - -2008-08-18 21:43:02 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/gstgldifferencematte.c: - 193/906 fix typos - -2008-08-18 21:40:26 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstgldifferencematte.c: - 192/906 complete differencematte filter.. I did it quickly, probably still needs some work - -2008-08-18 20:25:25 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstgldifferencematte.c: - * gst/gl/gstglpixbufoverlay.c: - * gst/gl/gstopengl.c: - 191/906 little cleanup. add first draft of gstgldifferencematte. still doesn't work - -2008-08-18 18:53:13 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglimagesink.c: - 190/906 force calling glimagesink->stop() when going from PAUSED to READY - -2008-08-18 17:19:06 +0200 unknown <Administrateur@.(none)> - - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglpixbufoverlay.c: - 189/906 update vs8 build and fix some warnings that comes from vc8 - -2008-08-18 16:16:58 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/gstglpixbufoverlay.c: - * gst/gl/gstopengl.c: - 188/906 add first draft of a pixbuf overlay element. add macros to optionally build the latter if gdk-pixbuf is found - -2008-08-18 11:48:47 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * tests/examples/clutter/clutteractortee.c: - 187/906 remove expose event handling, it's map-unmap that is not behaving correctly, any idea? - -2008-08-18 11:08:09 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * tests/examples/clutter/clutteractortee.c: - 186/906 add expose event handling to clutteractortee - -2008-08-18 10:50:37 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * tests/examples/clutter/clutteractor.c: - * tests/examples/clutter/clutteractortee.c: - 185/906 add clutteractortee example, a nice example about how clutter could be used to create a live preview widget for gleffects. It uses texture from pixmap, still needs some work regarding clean exit and expose event management. - -2008-08-18 09:06:09 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 184/906 add a couple of macros to autotools to compile with uintrepid automake. remove array constructor so we don't have to depend on glsl #version 120. - -2008-08-17 17:45:52 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * tests/examples/clutter/clutteractor.c: - 183/906 add an example to use texture from pixmap to do some kind of x_overlay on a clutteractor. A better way would be to directly share gl handles between clutter and gstgl but still I cannot find a way to do it. - -2008-08-17 12:21:49 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectscurves.h: - 182/906 add a better sepia toning curve - -2008-08-17 09:24:24 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstgltestsrc.c: - 181/906 add a translatable string to testsrc to get rid of po dir errors after distclean and git clean - -2008-08-16 17:36:10 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * tests/examples/gtk/fxtest/fxtest.c: - 180/906 minor cleanup in fxtest - -2008-08-16 12:37:36 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffectsdistortion.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - 179/906 distortion effect cleanup - -2008-08-16 10:15:31 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * tests/examples/gtk/fxtest/fxtest.c: - 178/906 improve fxtest command line option handling, default to videotestsrc if no source bin description is given - -2008-08-16 09:40:54 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstgleffects.c: - 177/906 fix gleffects memory issue (init resources on start and reset them on stop) - -2008-08-16 09:17:14 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 176/906 fix a typo - -2008-08-16 09:13:39 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffectsin.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - * tests/examples/gtk/fxtest/fxtest.c: - 175/906 add sin effect (desaturate everything but red shades). still needs some tuning. - -2008-08-14 22:28:19 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - 174/906 add a property to gleffects to switch video left to right, useful with webcams to resemble a mirror - -2008-08-14 21:29:02 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectscurves.h: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - * tests/examples/gtk/fxtest/fxtest.c: - 173/906 add lumaxpro (desaturate + cross process) effect. nothing too impressive but I like it. - -2008-08-14 20:54:54 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * tests/examples/gtk/fxtest/fxtest.c: - 172/906 add support for command line parsing to fxtest (try fxtest videotestsrc ! desired caps ! identity). report a new issue on BUGS. - -2008-08-14 20:02:04 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/gstgleffects.c: - * tests/examples/gtk/fxtest/fxtest.c: - 171/906 import fxtest (little gtk app to easily test effects) from cvs branch, fixed rgbtocurve. - -2008-08-14 17:03:21 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstopengl.c: - 170/906 update codeblocks build - -2008-08-14 14:08:23 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffectbulge.c: - * gst/gl/effects/gstgleffectfisheye.c: - * gst/gl/effects/gstgleffectsdistortion.c: - * gst/gl/effects/gstgleffectsquare.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/effects/gstgleffecttunnel.c: - * gst/gl/effects/gstgleffecttwirl.c: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - 169/906 import remaining distortion effects from cvs branch (fisheye, twirl, bulge, tunnel, square) - -2008-08-14 12:39:01 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectscurves.h: - 168/906 cleanup curves header - -2008-08-14 12:26:25 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectscurves.h: - 167/906 better cross processing curve - -2008-08-14 12:09:39 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffectrgbtocurve.c: - * gst/gl/effects/gstgleffectscurves.h: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - 166/906 add rgb_to_luma_fragment source and correspondent effect. use the latter for a cross processing effect. - -2008-08-14 11:31:09 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffectlumatocurve.c: - * gst/gl/effects/gstgleffectscurves.h: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - 165/906 import luma_to_curve effects (Sepia, Heat) from cvs branch with better texture memory handling (teximage curves only once). Sepia curve still needs some love. - -2008-08-14 09:39:55 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - 164/906 rename blend_fragment_source to sum_fragment_source and add uniform blending parameters - -2008-08-14 09:26:23 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffectglow.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstgleffects.c: - * gst/gl/gstgleffects.h: - 163/906 import glow effect (maybe the most tricky) from cvs branch - -2008-08-14 08:03:49 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffects.h: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/effects/gstgleffectstretch.c: - * gst/gl/gstgleffects.c: - 162/906 import stretch effect from cvs - -2008-08-14 00:07:20 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffects.h: - * gst/gl/effects/gstgleffectsqueeze.c: - * gst/gl/effects/gstgleffectssources.c: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstgleffects.c: - 161/906 import squeeze effect from cvs - -2008-08-13 22:42:48 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/effects/gstgleffectssources.c: - 160/906 forgot to add a file - -2008-08-13 22:36:13 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffectidentity.c: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffects.h: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstgleffects.c: - 159/906 still some source tree reorganize, fixed some issue with headers and ifdefs, moved identity into effects dir - -2008-08-13 20:58:49 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/effects/gstgleffectmirror.c: - * gst/gl/effects/gstgleffects.h: - * gst/gl/effects/gstgleffectssources.h: - * gst/gl/gstgleffects.c: - 158/906 still working on mergin gstgleffects, add mirror effect. reorganize source tree. - -2008-08-13 17:59:09 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglupload.c: - 157/906 move thread_do_upload_make from thread_do_upload to thread_init_upload - -2008-08-13 17:16:17 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/BUGS: - 156/906 fix a crash that could happens when using at least 2 gl context and when closing a window on linux - -2008-08-13 16:01:21 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/BUGS: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstgleffects.c: - 155/906 fix some errors and check all the pipelines listed in tests/pipelines - -2008-08-12 11:09:37 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/gstgleffects.c: - * gst/gl/gstopengl.c: - 154/906 added first skeleton of gstgleffects, imported basic stuff from cvs branch. - -2008-08-11 20:12:02 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/gstglfilterblur.c: - 153/906 Try to genereate textures within gstglfilterblur to see if the new thread_use_fbo works both with textures from the pool and custom ones - -2008-08-11 20:01:41 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 152/906 remove an unneeded (really?) glTexImage - -2008-08-11 19:08:22 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/Makefile.am: - 151/906 ISO C90 - -2008-08-11 19:01:33 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglfilterblur.c: - 150/906 glTexImage2D(w, h, NULL) is now called only one time (mem alloc) - -2008-08-11 17:21:30 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 149/906 same as previous commit - -2008-08-11 17:17:22 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 148/906 Fix rgb issue. Current program should always be set to 0 when a new texture is attached to a fbo. - -2008-08-11 15:53:12 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstopengl.c: - 147/906 oups forgot to add 2 files to the previous commit - -2008-08-11 15:40:39 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - * gst/gl/gstglfilteredge.c: - * gst/gl/gstglfilteredge.h: - * gst/gl/gstglupload.c: - 146/906 remove filteredge - -2008-08-11 15:30:38 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglfilterblur.c: - 145/906 gen/del the middle texture only one time in the gstglfilterblur - -2008-08-11 11:26:32 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfilterblur.h: - * gst/gl/gstopengl.c: - 144/906 remove gstglfilterblur.h, it's easier to have everything in the same file - -2008-08-11 09:52:16 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/gstglfilterblur.c: - 143/906 Add init and reset callbacks in GstGLFilter to run arbitrary gl code at start and stop. Useful to init and cleanup custom gl resources. - -2008-08-11 09:00:40 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglfilterblur.c: - 142/906 Add a generic action to be able to execute arbitrary gl code within the gl thread with less pain - -2008-08-10 11:22:34 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/gstglfilterblur.c: - 141/906 some steps towards simplification. added a convenience function to gstglfilter and some comment here and there - -2008-08-05 10:15:07 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 140/906 Fix GL_STACK_OVERFLOW - -2008-08-04 12:13:29 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/gstglfilterblur.c: - 139/906 fix warnings when compiling upload/download shaders - -2008-08-04 09:56:59 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - 138/906 is that videoformat pointer really needed? - -2008-08-04 09:46:14 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - 137/906 Don't reallocate texture memory every time in upload_* functions. - -2008-08-01 11:00:49 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - 136/906 reindent gstgldisplay with gstreamer-c-mode - -2008-07-31 17:48:04 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/gstglfilterblur.c: - * gst/gl/gstglfilterblur.h: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstopengl.c: - 135/906 add and make the Filippo's gstglfilterblur works on the master branch (example of multiple step rendering) - -2008-07-25 01:43:28 +0200 julien User <julien@ubuntu.ubuntu-domain> - - * gst/gl/gstglimagesink.c: - 134/906 fix makefiles list from configure.ac (tests have changes) and fix a warning - -2008-07-21 00:24:48 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 133/906 finish todo task 4 - -2008-07-20 16:38:48 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 132/906 make the plugin properly shutdown when one of the check requirements failed - -2008-07-19 08:32:38 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/gstglfilteredge.c: - 131/906 fix warnings (unused vars) - -2008-07-19 03:00:26 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglfilteredge.c: - * gst/gl/gstglfilteredge.h: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfilterlaplacian.h: - 130/906 use GstGLShader in the GLSL colorspace conversion - -2008-07-18 22:33:44 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/gl/gstglfilterlaplacian.c: - 129/906 fixed warning for unused variable (fatal with -Werror) - -2008-07-18 21:55:00 +0200 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/gstglfilterlaplacian.c: - 128/906 add GstGLShader stuffs in the vs8 project, fix laplacian fragment code to make it compile on ATI, and fix check function about Opengl and Glew version - -2008-07-18 10:49:34 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglshader.c: - * gst-libs/gst/gl/gstglshader.h: - * gst/gl/Makefile.am: - * gst/gl/gstglfilterlaplacian.c: - * gst/gl/gstglfilterlaplacian.h: - * gst/gl/gstopengl.c: - 127/906 Imported GstGLShader from cvs branch. Added a demo laplacian convolution filter to demonstrate how this can be integrated with minimum effort. - -2008-07-16 15:23:36 -0700 David Schleef <ds@hutch.local> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/gstgltestsrc.h: - 126/906 Change some guints to GLuints because of warnings on OS/X. - -2008-07-16 15:22:36 -0700 David Schleef <ds@hutch.local> - - * gst-libs/gst/gl/Makefile.am: - 125/906 Add libraries as appropriate to fix compilation - -2008-07-15 14:36:03 -0700 David Schleef <ds@schleef.org> - - 124/906 Global replace of CRLF line endings to LF - -2008-07-12 14:18:47 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 123/906 X Specific: better implementation of the gst_gl_set_window_id - -2008-07-12 13:24:30 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 122/906 better implementation of gst_gl_display_set_window_id for win32. (change the window of the current wglcontext instead of reinit everything, and so avoid some problems about opengl objects that could be init in the previous wglcontext and so no usable in the newer wglcontext, it what the case for the first texture) This newer implementation has not been made yet on linux - -2008-07-12 01:13:08 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 121/906 avoid use of GLSL functions when fragment_shader is not available - -2008-07-11 06:24:27 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 120/906 git-svn-id: svn://svn.wobow.com/GStreamer_playground/gst-plugins-gl@580 93df14bb-0f41-7a43-8087-d3e2a2f0e464 - -2008-07-10 23:53:36 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglimagesink.c: - 119/906 git-svn-id: svn://svn.wobow.com/GStreamer_playground/gst-plugins-gl@579 93df14bb-0f41-7a43-8087-d3e2a2f0e464 - -2008-07-07 20:59:20 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/gstglimagesink.c: - 118/906 git-svn-id: svn://svn.wobow.com/GStreamer_playground/gst-plugins-gl@573 93df14bb-0f41-7a43-8087-d3e2a2f0e464 - -2008-07-06 16:50:29 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglimagesink.c: - 117/906 up gtk example - -2008-07-05 22:56:29 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfiltercube.h: - * gst/gl/gstglfilteredge.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstgltestsrc.h: - 116/906 git-svn-id: svn://svn.wobow.com/GStreamer_playground/gst-plugins-gl@563 93df14bb-0f41-7a43-8087-d3e2a2f0e464 - -2008-06-30 00:38:39 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglupload.c: - 115/906 git-svn-id: svn://svn.wobow.com/GStreamer_playground/gst-plugins-gl@556 93df14bb-0f41-7a43-8087-d3e2a2f0e464 - -2008-06-29 17:27:43 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilteredge.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 114/906 git-svn-id: svn://svn.wobow.com/GStreamer_playground/gst-plugins-gl@555 93df14bb-0f41-7a43-8087-d3e2a2f0e464 - -2008-06-28 23:28:11 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstgldownload.c: - 113/906 git-svn-id: svn://svn.wobow.com/GStreamer_playground/gst-plugins-gl@554 93df14bb-0f41-7a43-8087-d3e2a2f0e464 - -2008-06-28 15:38:41 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglupload.c: - 112/906 git-svn-id: svn://svn.wobow.com/GStreamer_playground/gst-plugins-gl@552 93df14bb-0f41-7a43-8087-d3e2a2f0e464 - -2008-06-24 22:28:03 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 111/906 up - -2008-06-23 23:12:37 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglfiltercube.c: - 110/906 git-svn-id: svn://svn.wobow.com/GStreamer_playground/gst-plugins-gl@544 93df14bb-0f41-7a43-8087-d3e2a2f0e464 - -2008-06-23 18:56:29 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterapp.h: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 109/906 git-svn-id: svn://svn.wobow.com/GStreamer_playground/gst-plugins-gl@543 93df14bb-0f41-7a43-8087-d3e2a2f0e464 - -2008-06-21 21:38:42 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglcolorscale.h: - * gst/gl/gstgldownload.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilteredge.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstgltestsrc.h: - * gst/gl/gstglupload.c: - * gst/gl/gstglupload.h: - 108/906 git-svn-id: svn://svn.wobow.com/GStreamer_playground/gst-plugins-gl@540 93df14bb-0f41-7a43-8087-d3e2a2f0e464 - -2008-06-19 23:38:36 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 107/906 fix opengl version checker - -2008-06-16 23:12:48 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglfilteredge.c: - 106/906 up sobel algo - -2008-06-15 18:31:12 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/gstglfilteredge.c: - 105/906 up Sobel filter and gl/glew version checker - -2008-06-13 00:01:26 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/Makefile.am: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfilteredge.c: - * gst/gl/gstglfilteredge.h: - * gst/gl/gstopengl.c: - 104/906 start to add a glfilteredge that proceeds edge detection using GLSL - -2008-06-12 21:40:17 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/gstgldownload.c: - * gst/gl/gstgldownload.h: - * gst/gl/gstglupload.c: - * gst/gl/gstglupload.h: - * gst/gl/gstopengl.c: - 103/906 rename glgraphicmaker -> glupload and glvideomaker -> gldownload - -2008-06-11 23:43:41 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglcolorscale.c: - 102/906 up - -2008-06-11 23:42:50 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglfilterapp.c: - 101/906 idem - -2008-06-11 23:40:57 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglfilterapp.c: - 100/906 fix warnings linux-specific - -2008-06-11 23:40:01 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglfiltercube.c: - 099/906 up (switching linux and win32) ... not fun editor ... - -2008-06-11 23:38:33 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/Makefile.am: - 098/906 up... - -2008-06-11 23:36:25 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglgraphicmaker.c: - 097/906 fix warnings - -2008-06-11 23:31:53 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst/gl/Makefile.am: - * gst/gl/gltestsrc.c: - * gst/gl/gltestsrc.h: - 096/906 up - -2008-06-11 23:26:16 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gltestsrc.c: - * gst-libs/gst/gl/gltestsrc.h: - 095/906 up - -2008-06-11 23:23:12 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglfilter.c: - 094/906 up - -2008-06-11 23:12:53 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstopengl.c: - 093/906 remove 2 warnings - -2008-06-11 23:04:52 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstgltestsrc.c: - 092/906 Finish to revive the gltestsrc. Next step is to do some refactoring. - -2008-06-11 18:33:53 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gltestsrc.c: - * gst-libs/gst/gl/gltestsrc.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/Makefile.am: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstgltestsrc.h: - * gst/gl/gstopengl.c: - 091/906 start to revive the gltestsrc - -2008-06-10 23:00:39 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/Makefile.am: - 090/906 up - -2008-06-10 22:59:57 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglcolorscale.c: - * gst/gl/gstglcolorscale.h: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstopengl.c: - 089/906 add a "glcolorscale" element equivalent to "ffmepgcolorspace ! videoscale ! ffmpegcolorspace" - -2008-06-10 22:08:11 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst/gl/gstglfilter.c: - * gst/gl/gstglgraphicmaker.c: - * gst/gl/gstglgraphicmaker.h: - * gst/gl/gstglimagesink.c: - 088/906 fix some caps negociations those pipelines works fine : gst-launch-0.10 -v videotestsrc ! video/x-raw-yuv, width=320, height=240 ! glgraphicmaker ! video/x-raw-gl, width=720 , height=576 ! glfiltercube ! glimagesink and gst-launch-0.10 -v videotestsrc ! video/x-raw-yuv, width=320, height=240 ! glgraphicmaker ! video/x-raw-gl, width=720 , height=576 ! glimagesink - -2008-06-10 19:07:43 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglfilter.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterapp.h: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglvideomaker.c: - 087/906 glfilter can accept to have an input size different than the out put size : video/x-raw-gl, width=w1, height=w1 ! glfilter ! video/x-raw-gl, width=w2, height=w2 ! (fix every examples) - -2008-06-08 22:11:36 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 086/906 up - -2008-06-08 13:15:12 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglfilter.c: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfiltercube.h: - * gst/gl/gstglvideomaker.c: - 085/906 fix regressions about glvideomaker. - -2008-06-08 02:19:43 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/Makefile.am: - * gst/gl/gstglfilter.c: - * gst/gl/gstglfilter.h: - * gst/gl/gstglfilterapp.c: - * gst/gl/gstglfilterapp.h: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglgraphicmaker.c: - * gst/gl/gstglgraphicmaker.h: - * gst/gl/gstopengl.c: - 084/906 add a glfilterapp which holds the client draw and reshape callbacks (some "wanted" regressions about the glvideomaker, have been done with this version. Will be fix in next commits) - -2008-06-07 21:56:00 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglfilter.c: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglgraphicmaker.c: - * gst/gl/gstglimagesink.c: - 083/906 finish to implement the glfilter: example : gst-launch-0.10 videotestsrc num_buffers = 100 ! glgraphicmaker ! glfiltercube ! glimagesink - -2008-06-07 15:27:12 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglfilter.c: - * gst/gl/gstglfilter.h: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglimagesink.c: - 082/906 glfilter can request, use and reject a FBO (step 1) - -2008-06-07 00:01:18 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglfilter.c: - * gst/gl/gstglfilter.h: - * gst/gl/gstglfiltercube.c: - * gst/gl/gstglfiltercube.h: - * gst/gl/gstglgraphicmaker.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstopengl.c: - 081/906 start to add a glfilter - -2008-05-24 12:35:34 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 080/906 fix gstfreeglut linux implementation to correctly handle the gstxoverlay interface - -2008-05-22 20:10:31 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 079/906 up - -2008-05-21 22:49:21 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/gstglvideomaker.c: - 078/906 up from kubuntu - -2008-05-21 21:17:49 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 077/906 up - -2008-05-21 21:15:47 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 076/906 check OpenGL and Glew versions - -2008-05-20 17:40:20 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - * gst/gl/gstglvideomaker.c: - * gst/gl/gstglvideomaker.h: - 075/906 indent - -2008-05-19 23:06:07 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 074/906 up - -2008-05-19 23:03:22 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 073/906 up - -2008-05-19 21:36:59 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 072/906 up - -2008-05-19 21:28:28 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - 071/906 remove all warnings - -2008-05-19 18:45:46 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglimagesink.c: - 070/906 implement and fix onClose: when a user click on the cross of an internal window (there is not this issue when using the gstxoverlay interface) - -2008-05-19 16:57:39 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstglgraphicmaker.c: - * gst/gl/gstglgraphicmaker.h: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - * gst/gl/gstglvideomaker.c: - * gst/gl/gstglvideomaker.h: - * gst/gl/gstopengl.c: - 069/906 add gstreamer license - -2008-05-18 20:05:18 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/Makefile.am: - 068/906 up - -2008-05-18 19:58:49 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/Makefile.am: - 067/906 up - -2008-05-18 19:18:04 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/Makefile.am: - * gst/gl/gstglgraphicmaker.c: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglvideomaker.c: - * gst/gl/gstglvideomaker.h: - 066/906 up - -2008-05-18 17:55:56 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstgldisplay.h: - 065/906 up - -2008-05-18 16:04:56 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst/gl/Makefile.am: - * gst/gl/gstopengl.c: - 064/906 up - -2008-05-18 14:47:01 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstgldisplay.h: - 063/906 up - -2008-05-18 11:12:46 +0000 Julien Isorce <julien.isorce@gmail.com> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/gstgl.c: - * gst/gl/gstglgraphicmaker.c: - * gst/gl/gstglgraphicmaker.h: - * gst/gl/gstglimagesink.c: - * gst/gl/gstglimagesink.h: - * gst/gl/gstglvideomaker.c: - * gst/gl/gstglvideomaker.h: - 062/906 git-svn-id: svn://svn.wobow.com/GStreamer_playground/gst-plugins-gl@421 93df14bb-0f41-7a43-8087-d3e2a2f0e464 - -2008-07-15 14:16:53 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/glextensions.c: - * gst-libs/gst/gl/glextensions.h: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/.cvsignore: - * gst/gl/BUGS: - * gst/gl/Makefile.am: - * gst/gl/color_matrix.c: - * gst/gl/glimagesink.c: - * gst/gl/glimagesink.h: - * gst/gl/gltestsrc.c: - * gst/gl/gltestsrc.h: - * gst/gl/gstglconvert.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstglfilterexample.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstgltestsrc.h: - * gst/gl/gstglupload.c: - * gst/gl/gstopengl.c: - 061/906 First SVN commit. This commit is a hack to make git-rebase work - -2008-02-23 15:10:49 +0000 Tim-Philipp Müller <tim at centricular dot net> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstgldisplay.c: - 060/906 * gst-libs/gst/gl/gstglbuffer.c: (gst_gl_buffer_format_from_video_format): Fix compiler warning if there are video format enums gstglbuffer doesn't know about yet. * gst-libs/gst/gl/gstgldisplay.c: (gst_gl_display_upload_texture_rectangle), (gst_gl_display_draw_texture): Fix printf format for 64-bit integers. - -2008-01-31 23:40:13 +0000 David Schleef <ds@schleef.org> - - * pkgconfig/gstreamer-gl-uninstalled.pc.in: - * pkgconfig/gstreamer-gl.pc.in: - * tests/check/pipelines/simple-launch-lines.c: - 059/906 * configure.ac: * pkgconfig/Makefile.am: * pkgconfig/gstreamer-gl-uninstalled.pc.in: * pkgconfig/gstreamer-gl.pc.in: * pkgconfig/gstreamer-plugins-gl-uninstalled.pc.in: * pkgconfig/gstreamer-plugins-gl.pc.in: Rename pkgconfig files. And install them. * tests/check/Makefile.am: * tests/check/generic/states.c: * tests/check/pipelines/simple-launch-lines.c: Add some tests copied from -good. - -2008-01-31 21:35:56 +0000 Tim-Philipp Müller <tim at centricular dot net> - - * gst-libs/gst/gl/Makefile.am: - * gst/gl/Makefile.am: - 058/906 * gst-libs/gst/gl/Makefile.am: The library needs to link against libgstvideo-0.10. * gst/gl/Makefile.am: The plugin does not (I think) need to link against GL or libgstvideo, since our new gstreamer GL library already does that, but it does need to link against our brand-new libgstgl-0.10. - -2008-01-31 20:31:11 +0000 David Schleef <ds@schleef.org> - - * gst/gl/.cvsignore: - * gst/gl/Makefile.am: - 057/906 * gst/gl/.cvsignore: ingore some files * gst-libs/gst/Makefile.am: distcheck fixes * gst/gl/Makefile.am: distcheck fixes * win32/common/config.h: -good has this in CVS, so we will too. - -2008-01-31 20:21:26 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/Makefile.am: - * gst-libs/gst/gl/gstglfilter.c: - * gst-libs/gst/gl/gstglfilter.h: - * gst/gl/glimagesink.c: - * gst/gl/gstopengl.c: - 056/906 * configure.ac: Readd pre-pkgconfig OpenGL detection, since pkgconfig requires Mesa from git master. * gst/gl/glimagesink.c: * gst/gl/gstopengl.c: Move debug category initialization to element. * gst-libs/gst/gl/Makefile.am: * gst-libs/gst/gl/gstglfilter.c: * gst-libs/gst/gl/gstglfilter.h: * gst/gl/gstglfilter.c: * gst/gl/gstglfilter.h: Move glfilter to library. * pkgconfig/gstreamer-plugins-gl.pc.in: Add gstreamer-base-0.10 as a requirement. * po/en.po: Update. - -2008-01-18 15:13:16 +0000 Tim-Philipp Müller <tim at centricular dot net> - - * gst-libs/gst/gl/Makefile.am: - * gst/gl/Makefile.am: - 055/906 * configure.ac: * docs/Makefile.am: * gst-libs/Makefile.am: * gst-libs/gst/gl/Makefile.am: * gst/gl/Makefile.am: * tests/Makefile.am: Fix compilation in uninstalled setup and some distcheck-y bits (not all though). - -2008-01-17 23:23:31 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/Makefile.am: - * gst/gl/Makefile.am: - * gst/gl/gstgltestsrc.c: - 054/906 Fixes to make project compile. Probably still doesn't work. * configure.ac: * gst-libs/gst/Makefile.am: * gst-libs/gst/gl/Makefile.am: * gst/Makefile.am: * gst/gl/Makefile.am: * gst/gl/gstgltestsrc.c: * po/LINGUAS: * win32/MANIFEST: - -2008-01-17 19:40:36 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/Makefile.am: - 053/906 Add project infrastructure. Not complete, doesn't work. * .cvsignore: * AUTHORS: * COPYING: * COPYING.LIB: * INSTALL: * Makefile.am: * NEWS: * README: * RELEASE: * REQUIREMENTS: * autogen.sh: * configure.ac: * docs/.cvsignore: * docs/Makefile.am: * docs/libs/Makefile.am: * docs/plugins/Makefile.am: * docs/version.entities.in: * ext/Makefile.am: * gst-libs/Makefile.am: * gst-libs/gst/Makefile.am: * gst-libs/gst/gl/Makefile.am: * gst-plugins-gl.doap: * gst-plugins-gl.spec.in: * gst/Makefile.am: * m4/.cvsignore: * m4/Makefile.am: * pkgconfig/.cvsignore: * pkgconfig/Makefile.am: * pkgconfig/gstreamer-plugins-gl-uninstalled.pc.in: * pkgconfig/gstreamer-plugins-gl.pc.in: * sys/Makefile.am: * tests/Makefile.am: * tests/check/Makefile.am: * tests/examples/Makefile.am: * tests/icles/Makefile.am: * tools/Makefile.am: * win32/common/config.h.in: - -2008-01-06 03:01:39 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/glimagesink.c: - * gst/gl/glimagesink.h: - * gst/gl/gstglupload.c: - 052/906 * sys/glsink/glimagesink.c: * sys/glsink/glimagesink.h: * sys/glsink/gstglbuffer.h: * sys/glsink/gstgldisplay.c: * sys/glsink/gstgldisplay.h: * sys/glsink/gstglupload.c: Handle xoverlay exposes correctly. This means glimagesink works correctly most of the time in totem (fullscreening being an execption). Doesn't handle expose events directly to the GL window. - -2008-01-06 01:19:48 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/glextensions.c: - * gst-libs/gst/gl/glextensions.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/glimagesink.c: - * gst/gl/glimagesink.h: - * gst/gl/gstopengl.c: - 051/906 * sys/glsink/glextensions.c: * sys/glsink/glextensions.h: * sys/glsink/glimagesink.c: * sys/glsink/glimagesink.h: * sys/glsink/gstgldisplay.c: * sys/glsink/gstgldisplay.h: * sys/glsink/gstopengl.c: Reenable video/x-raw-rgb and x-raw-yuv for glimagesink. Enable vblank synchronization. Remove unused code. - -2007-12-31 07:55:23 +0000 David Schleef <ds@schleef.org> - - * gst/gl/Makefile.am: - 050/906 * configure.ac: * sys/glsink/Makefile.am: Switch to using pkgconfig to detect libGL. Since we use recent features added to Mesa, there's no point in adding a check for pre-pkgconfig versions. - -2007-12-29 00:37:40 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/glextensions.c: - * gst-libs/gst/gl/glextensions.h: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/glimagesink.c: - * gst/gl/glimagesink.h: - * gst/gl/gstglconvert.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstglfilter.c: - * gst/gl/gstglfilter.h: - * gst/gl/gstglfilterexample.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 049/906 * configure.ac: * sys/glsink/glextensions.c: * sys/glsink/glextensions.h: * sys/glsink/glimagesink.c: * sys/glsink/glimagesink.h: * sys/glsink/gstglbuffer.c: * sys/glsink/gstglbuffer.h: * sys/glsink/gstglconvert.c: * sys/glsink/gstgldisplay.c: * sys/glsink/gstgldisplay.h: * sys/glsink/gstgldownload.c: * sys/glsink/gstglfilter.c: * sys/glsink/gstglfilter.h: * sys/glsink/gstglfilterexample.c: * sys/glsink/gstgltestsrc.c: * sys/glsink/gstglupload.c: Major cleanup of code. Convert glupload to BaseTransform. Handle caps negotiation mostly correctly. Reenable in build. - -2007-12-27 05:26:05 +0000 David Schleef <ds@schleef.org> - - * gst/gl/glimagesink.c: - * gst/gl/gstglupload.c: - 048/906 * sys/glsink/glimagesink.c: * sys/glsink/gstglupload.c: Change glimagesink over to using GL buffers. This breaks glimagesink for normal operation, but should be fixed soon. - -2007-12-27 04:15:26 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst/gl/gltestsrc.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstglfilter.c: - * gst/gl/gstglfilterexample.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - 047/906 * sys/glsink/gltestsrc.c: * sys/glsink/gstglbuffer.c: * sys/glsink/gstglbuffer.h: * sys/glsink/gstgldownload.c: * sys/glsink/gstglfilter.c: * sys/glsink/gstglfilterexample.c: * sys/glsink/gstgltestsrc.c: * sys/glsink/gstglupload.c: Convert gldownload to BaseTransform. Make glfilterexample visually interesting. Add support for various formats to downloading. Fix a few places where we leak GL state to other elements (bad, but hard to prevent). - -2007-12-27 00:52:22 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/BUGS: - * gst/gl/Makefile.am: - * gst/gl/color_matrix.c: - * gst/gl/gstglconvert.c: - * gst/gl/gstglfilter.c: - * gst/gl/gstglfilter.h: - * gst/gl/gstglfilterexample.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstglupload.c: - * gst/gl/gstopengl.c: - 046/906 * sys/glsink/BUGS: * sys/glsink/Makefile.am: * sys/glsink/gstglbuffer.c: * sys/glsink/gstglbuffer.h: * sys/glsink/gstglconvert.c: * sys/glsink/gstgldisplay.c: * sys/glsink/gstglfilter.c: * sys/glsink/gstglfilter.h: * sys/glsink/gstglfilterexample.c: * sys/glsink/gstgltestsrc.c: * sys/glsink/gstglupload.c: * sys/glsink/gstopengl.c: Remove code that handles non-texture buffers. Add a GstGLBufferFormat type that corresponds to how to use the texture, not the original video format. Convert gstflfilter.c into a base class, add glfilterexample and glconvert elements. * sys/glsink/color_matrix.c: Minor ramblings about color conversion matrices. - -2007-12-25 00:34:13 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/gstgldisplay.c: - * gst/gl/Makefile.am: - * gst/gl/gltestsrc.c: - * gst/gl/gltestsrc.h: - * gst/gl/gstgldownload.c: - * gst/gl/gstgltestsrc.c: - * gst/gl/gstgltestsrc.h: - * gst/gl/gstglupload.c: - * gst/gl/gstopengl.c: - 045/906 * sys/glsink/Makefile.am: * sys/glsink/gltestsrc.c: * sys/glsink/gltestsrc.h: * sys/glsink/gstgldisplay.c: * sys/glsink/gstgldownload.c: * sys/glsink/gstglfilter.c: * sys/glsink/gstgltestsrc.c: * sys/glsink/gstgltestsrc.h: * sys/glsink/gstglupload.c: * sys/glsink/gstopengl.c: Add gltestsrc element, a duplicate of videotestsrc that uses GL rendering to create images. More cleanup. - -2007-12-24 21:26:38 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst/gl/gstgldownload.c: - * gst/gl/gstglfilter.c: - 044/906 * sys/glsink/gstglbuffer.c: * sys/glsink/gstgldownload.c: * sys/glsink/gstglfilter.c: Clean up code. Fix a few leaks. - -2007-12-24 21:04:45 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst-libs/gst/gl/gstgldisplay.c: - * gst-libs/gst/gl/gstgldisplay.h: - * gst/gl/Makefile.am: - * gst/gl/glimagesink.h: - 043/906 * sys/glsink/Makefile.am: * sys/glsink/glimagesink.h: * sys/glsink/glvideo.c: * sys/glsink/glvideo.h: * sys/glsink/gstglbuffer.c: * sys/glsink/gstglbuffer.h: * sys/glsink/gstgldisplay.c: * sys/glsink/gstgldisplay.h: Rename glvideo.ch to gstgldisplay.ch. - -2007-12-24 20:53:55 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst/gl/glimagesink.c: - * gst/gl/glimagesink.h: - * gst/gl/glvideo.c: - * gst/gl/glvideo.h: - * gst/gl/gstgldownload.c: - * gst/gl/gstglfilter.c: - * gst/gl/gstglupload.c: - 042/906 * sys/glsink/glimagesink.c: * sys/glsink/glimagesink.h: * sys/glsink/glvideo.c: * sys/glsink/glvideo.h: * sys/glsink/gstglbuffer.c: * sys/glsink/gstglbuffer.h: * sys/glsink/gstgldownload.c: * sys/glsink/gstglfilter.c: * sys/glsink/gstglupload.c: Rewrite a bunch of code to use textures as the intermediate instead of renderbuffers. upload, download, filtering all work. - -2007-12-22 05:01:57 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/glextensions.c: - * gst-libs/gst/gl/glextensions.h: - * gst-libs/gst/gl/gstglbuffer.c: - * gst/gl/glvideo.c: - * gst/gl/glvideo.h: - * gst/gl/gstgldownload.c: - * gst/gl/gstglupload.c: - 041/906 * sys/glsink/glextensions.c: * sys/glsink/glextensions.h: * sys/glsink/glvideo.c: * sys/glsink/glvideo.h: * sys/glsink/gstglbuffer.c: * sys/glsink/gstgldownload.c: * sys/glsink/gstglupload.c: A careful read of the documentation reveals that I can't use renderbuffers as textures. Duh. Checkpoint because I'm about to rewrite a bunch of code. - -2007-12-21 00:03:10 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/glextensions.c: - * gst-libs/gst/gl/glextensions.h: - * gst-libs/gst/gl/gstglbuffer.c: - * gst-libs/gst/gl/gstglbuffer.h: - * gst/gl/Makefile.am: - * gst/gl/glimagesink.c: - * gst/gl/glimagesink.h: - * gst/gl/glvideo.c: - * gst/gl/glvideo.h: - * gst/gl/gstgldownload.c: - * gst/gl/gstglfilter.c: - * gst/gl/gstglupload.c: - * gst/gl/gstopengl.c: - 040/906 * sys/glsink/Makefile.am: * sys/glsink/glextensions.c: * sys/glsink/glextensions.h: * sys/glsink/glimagesink.c: * sys/glsink/glimagesink.h: * sys/glsink/glvideo.c: * sys/glsink/glvideo.h: * sys/glsink/gstglbuffer.c: * sys/glsink/gstglbuffer.h: * sys/glsink/gstgldownload.c: * sys/glsink/gstglfilter.c: * sys/glsink/gstglupload.c: * sys/glsink/gstopengl.c: Switch to using framebuffer_objects instead of GLXPixmaps, because that's what my driver supports. Remove GLDrawable, since GstGLDisplay now has a default drawable and context. - -2007-12-18 01:25:57 +0000 David Schleef <ds@schleef.org> - - * gst/gl/Makefile.am: - * gst/gl/glimagesink.c: - * gst/gl/glimagesink.h: - * gst/gl/glvideo.c: - * gst/gl/glvideo.h: - * gst/gl/gstglupload.c: - * gst/gl/gstopengl.c: - * gst/gl/gstvideo-common.c: - * gst/gl/gstvideo-common.h: - 039/906 * sys/glsink/Makefile.am: * sys/glsink/glimagesink.c: * sys/glsink/glimagesink.h: * sys/glsink/glvideo.c: * sys/glsink/glvideo.h: * sys/glsink/gstopengl.c: * sys/glsink/gstglupload.c: Use new GstVideoFormat checked into -base. Add new glupload element to upload raw video into a GLXPixbuf. Untested. Will likely crash your motorcycle if you try it. * sys/glsink/gstvideo-common.c: * sys/glsink/gstvideo-common.h: Remove. - -2007-12-16 22:57:21 +0000 David Schleef <ds@schleef.org> - - * gst/gl/glimagesink.c: - * gst/gl/glimagesink.h: - * gst/gl/glvideo.c: - * gst/gl/glvideo.h: - 038/906 * sys/glsink/glimagesink.c: * sys/glsink/glimagesink.h: * sys/glsink/glvideo.c: * sys/glsink/glvideo.h: Rename GLVideo* to GstGL*. - -2007-12-16 00:16:46 +0000 David Schleef <ds@schleef.org> - - * gst-libs/gst/gl/glextensions.c: - * gst-libs/gst/gl/glextensions.h: - * gst/gl/Makefile.am: - * gst/gl/glvideo.c: - 037/906 * sys/glsink/Makefile.am: * sys/glsink/glextensions.c: * sys/glsink/glextensions.h: * sys/glsink/glvideo.c: Add vblank synchronization. Isn't really working on my driver. :( - -2007-12-15 19:31:23 +0000 David Schleef <ds@schleef.org> - - * gst/gl/Makefile.am: - * gst/gl/glimagesink.c: - * gst/gl/glvideo.c: - * gst/gl/glvideo.h: - * gst/gl/gstvideo-common.c: - * gst/gl/gstvideo-common.h: - 036/906 * sys/glsink/Makefile.am: * sys/glsink/glimagesink.c: * sys/glsink/glvideo.c: * sys/glsink/glvideo.h: * sys/glsink/gstvideo-common.c: * sys/glsink/gstvideo-common.h: Add support for xRGB, xBGR, and AYUV. Re-add support for power-of-2 textures. - -2007-12-15 06:33:36 +0000 David Schleef <ds@schleef.org> - - * gst/gl/Makefile.am: - * gst/gl/glimagesink.c: - * gst/gl/glimagesink.h: - * gst/gl/glvideo.c: - * gst/gl/glvideo.h: - * gst/gl/gstopengl.c: - * gst/gl/gstvideo-common.c: - * gst/gl/gstvideo-common.h: - 035/906 * sys/glsink/gstvideo-common.c: * sys/glsink/gstvideo-common.h: Pull together some common raw video functions into one location. This should eventually move to -base. * sys/glsink/Makefile.am: * sys/glsink/glimagesink.c: * sys/glsink/glimagesink.h: * sys/glsink/glvideo.c: * sys/glsink/glvideo.h: * sys/glsink/gstopengl.c: Use the new video-common.h stuff. Readd support for RGB video. - -2007-12-14 16:23:06 +0000 Christian Schaller <christian.schaller@collabora.co.uk> - - * gst/gl/Makefile.am: - 034/906 update spec file and add two missing files for disting - -2007-12-12 02:33:12 +0000 David Schleef <ds@schleef.org> - - * gst/gl/Makefile.am: - * gst/gl/glimagesink.c: - * gst/gl/glvideo.c: - * gst/gl/glvideo.h: - 033/906 * sys/glsink/Makefile.am: * sys/glsink/glimagesink.c: * sys/glsink/glvideo.c: * sys/glsink/glvideo.h: Split out gl-related code into a separate file with a sensible API. Major cleanup. Still crashes occasionally due to different threads touching bits at the same time. - -2007-06-06 15:58:31 +0000 Jan Schmidt <jan.schmidt@sun.com> - - * gst/gl/glimagesink.c: - 032/906 * sys/glsink/glimagesink.c: (gst_glimage_sink_stop), (gst_glimage_sink_create_window), (gst_glimage_sink_init_display): Sprinkle in some XSync calls to avoid raciness with broken drivers (ATI) when re-using a single glimagesink. - -2007-05-18 12:39:49 +0000 Jan Schmidt <jan.schmidt@sun.com> - - * gst/gl/glimagesink.c: - 031/906 * sys/glsink/glimagesink.c: (gst_glimage_sink_init_display): Update the cached caps after opening the display so that we report only the supported caps formats, not just the template caps. Fixes: #439405 - -2007-04-03 22:36:47 +0000 David Schleef <ds@schleef.org> - - * gst/gl/glimagesink.c: - 030/906 * sys/glsink/glimagesink.c: Fix handling of video/x-raw-yuv. Add overlay handling. - -2006-09-23 00:28:35 +0000 David Schleef <ds@schleef.org> - - * gst/gl/glimagesink.c: - 029/906 * sys/glsink/glimagesink.c: Fix problems when the element cannot open the display. (fixes #357212) - -2006-09-22 15:59:59 +0000 Tim-Philipp Müller <tim at centricular dot net> - - * gst/gl/glimagesink.c: - 028/906 * ext/directfb/dfbvideosink.c: (plugin_init): Lower rank from SECONDARY to MARGINAL. Plugins in -bad that might be autoplugged shouldn't trump plugins in -base, -good or -ugly (in this case ximagesink). * sys/glsink/glimagesink.c: (plugin_init): Set rank to NONE to prevent it from being autoplugged until errors are handled properly (see #357212). - -2006-08-15 19:29:58 +0000 Tim-Philipp Müller <tim at centricular dot net> - - * gst/gl/glimagesink.c: - 027/906 * ext/libfame/gstlibfame.c: (gst_fameenc_get_property): * sys/glsink/glimagesink.c: (gst_glimage_sink_get_property): Fix leaks (#351502). - -2006-06-23 09:09:44 +0000 Tim-Philipp Müller <tim at centricular dot net> - - * gst/gl/glimagesink.c: - 026/906 * ext/directfb/dfbvideosink.c: * ext/gsm/gstgsmdec.c: * ext/gsm/gstgsmenc.c: * ext/libmms/gstmms.c: * ext/neon/gstneonhttpsrc.c: * ext/theora/theoradec.c: * gst/freeze/gstfreeze.c: * gst/gdp/gstgdpdepay.c: * gst/gdp/gstgdppay.c: * sys/glsink/glimagesink.c: Use GST_DEBUG_CATEGORY_STATIC where possible (#342503) and fix one GObject boilerplate macro. - -2006-04-25 21:56:38 +0000 Stefan Kost <ensonic@users.sf.net> - - * gst/gl/glimagesink.c: - 025/906 * ext/amrwb/gstamrwbdec.c: * ext/amrwb/gstamrwbenc.c: * ext/amrwb/gstamrwbparse.c: * ext/arts/gst_arts.c: * ext/artsd/gstartsdsink.c: * ext/audiofile/gstafparse.c: * ext/audiofile/gstafsink.c: * ext/audiofile/gstafsrc.c: * ext/audioresample/gstaudioresample.c: * ext/bz2/gstbz2dec.c: * ext/bz2/gstbz2enc.c: * ext/cdaudio/gstcdaudio.c: * ext/directfb/dfbvideosink.c: * ext/divx/gstdivxdec.c: * ext/divx/gstdivxenc.c: * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init): * ext/faac/gstfaac.c: (gst_faac_base_init): * ext/faad/gstfaad.c: * ext/gsm/gstgsmdec.c: * ext/gsm/gstgsmenc.c: * ext/hermes/gsthermescolorspace.c: * ext/ivorbis/vorbisfile.c: * ext/lcs/gstcolorspace.c: * ext/libfame/gstlibfame.c: * ext/libmms/gstmms.c: (gst_mms_base_init): * ext/musepack/gstmusepackdec.c: (gst_musepackdec_base_init): * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): * ext/nas/nassink.c: (gst_nassink_base_init): * ext/neon/gstneonhttpsrc.c: * ext/sdl/sdlaudiosink.c: * ext/sdl/sdlvideosink.c: * ext/shout/gstshout.c: * ext/snapshot/gstsnapshot.c: * ext/sndfile/gstsf.c: * ext/swfdec/gstswfdec.c: * ext/tarkin/gsttarkindec.c: * ext/tarkin/gsttarkinenc.c: * ext/theora/theoradec.c: * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): * ext/xvid/gstxviddec.c: * ext/xvid/gstxvidenc.c: * gst/cdxaparse/gstcdxaparse.c: (gst_cdxa_parse_base_init): * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_base_init): * gst/chart/gstchart.c: * gst/colorspace/gstcolorspace.c: * gst/deinterlace/gstdeinterlace.c: * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init): * gst/festival/gstfestival.c: * gst/filter/gstbpwsinc.c: * gst/filter/gstiir.c: * gst/filter/gstlpwsinc.c: * gst/freeze/gstfreeze.c: * gst/games/gstpuzzle.c: (gst_puzzle_base_init): * gst/librfb/gstrfbsrc.c: * gst/mixmatrix/mixmatrix.c: * gst/mpeg1sys/gstmpeg1systemencode.c: * gst/mpeg1videoparse/gstmp1videoparse.c: * gst/mpeg2sub/gstmpeg2subt.c: * gst/mpegaudioparse/gstmpegaudioparse.c: * gst/multifilesink/gstmultifilesink.c: * gst/overlay/gstoverlay.c: * gst/passthrough/gstpassthrough.c: * gst/playondemand/gstplayondemand.c: * gst/qtdemux/qtdemux.c: * gst/rtjpeg/gstrtjpegdec.c: * gst/rtjpeg/gstrtjpegenc.c: * gst/smooth/gstsmooth.c: * gst/smoothwave/gstsmoothwave.c: * gst/spectrum/gstspectrum.c: * gst/speed/gstspeed.c: * gst/stereo/gststereo.c: * gst/switch/gstswitch.c: * gst/tta/gstttadec.c: (gst_tta_dec_base_init): * gst/tta/gstttaparse.c: (gst_tta_parse_base_init): * gst/vbidec/gstvbidec.c: * gst/videocrop/gstvideocrop.c: * gst/videodrop/gstvideodrop.c: * gst/virtualdub/gstxsharpen.c: * gst/xingheader/gstxingmux.c: (gst_xing_mux_base_init): * gst/y4m/gsty4mencode.c: * sys/cdrom/gstcdplayer.c: * sys/directdraw/gstdirectdrawsink.c: * sys/directsound/gstdirectsoundsink.c: * sys/glsink/glimagesink.c: * sys/qcam/gstqcamsrc.c: * sys/v4l2/gstv4l2src.c: * sys/vcd/vcdsrc.c: (gst_vcdsrc_base_init): * sys/ximagesrc/ximagesrc.c: Define GstElementDetails as const and also static (when defined as global) - -2006-04-01 10:09:11 +0000 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/gl/glimagesink.c: - 024/906 rework build; add translations for v4l2 - -2006-02-25 21:40:08 +0000 Julien Moutte <julien@fluendo.com> - - 023/906 2006-02-25 Julien MOUTTE <julien@moutte.net> - * sys/glsink/glimagesink.c: It doesn't seem we need GLU.h - -2006-02-22 14:37:20 +0000 Jan Schmidt <jan.schmidt@sun.com> - - * gst/gl/Makefile.am: - * gst/gl/glimagesink.c: - 022/906 * configure.ac: * sys/glsink/Makefile.am: Merge patch from #317048 for building on Cygwin. Patch by Cygwin Ports maintainer. * sys/glsink/glimagesink.c: (gst_glimage_sink_init_display): Move normal debug output to LOG level not ERROR. - -2006-02-14 11:36:30 +0000 Andy Wingo <wingo@pobox.com> - - 021/906 2006-02-14 Andy Wingo <wingo@pobox.com> - * sys/glsink/glimagesink.c (gst_glimage_sink_init): Come on - schleef, don't break me gst-inspect -a. - -2006-01-30 15:47:47 +0000 Andy Wingo <wingo@pobox.com> - - * gst/gl/Makefile.am: - 020/906 2006-01-30 Andy Wingo <wingo@pobox.com> - * sys/glsink/Makefile.am (libgstglimagesink_la_LIBADD) - (libgstglimagesink_la_CFLAGS): Add PLUGINS_BASE cflags and libs. - -2006-01-28 12:45:54 +0000 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/gl/Makefile.am: - 019/906 * sys/glsink/Makefile.am: glimagesink.h is dead, long live glimagesink.h - -2006-01-28 04:39:18 +0000 David Schleef <ds@schleef.org> - - * gst/gl/Makefile.am: - * gst/gl/glimagesink.c: - * gst/gl/glimagesink.h: - 018/906 * configure.ac: * sys/Makefile.am: * sys/glsink/Makefile.am: * sys/glsink/glimagesink.c: * sys/glsink/glimagesink.h: revival of glimagesink. Kind of works. - -2005-11-21 14:33:11 +0000 Jan Schmidt <jan.schmidt@sun.com> - - * gst/gl/glimagesink.c: - 017/906 * ext/audioresample/gstaudioresample.c: * ext/polyp/polypsink.c: (gst_polypsink_sink_fixate): * gst/librfb/gstrfbsrc.c: (gst_rfbsrc_fixate): * gst/modplug/gstmodplug.cc: * sys/glsink/glimagesink.c: (gst_glimagesink_fixate): * sys/v4l2/gstv4l2src.c: (gst_v4l2src_fixate): Rename gst_caps_structure_fixate_* to gst_structure_fixate_* (#322027) - -2005-10-12 14:29:55 +0000 Stefan Kost <ensonic@users.sf.net> - - * gst/gl/glimagesink.c: - 016/906 * examples/indexing/indexmpeg.c: (main): * ext/artsd/gstartsdsink.c: (gst_artsdsink_open_audio), (gst_artsdsink_close_audio), (gst_artsdsink_change_state): * ext/artsd/gstartsdsink.h: * ext/audiofile/gstafparse.c: (gst_afparse_open_file), (gst_afparse_close_file): * ext/audiofile/gstafparse.h: * ext/audiofile/gstafsink.c: (gst_afsink_open_file), (gst_afsink_close_file), (gst_afsink_chain), (gst_afsink_change_state): * ext/audiofile/gstafsink.h: * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), (gst_afsrc_close_file), (gst_afsrc_change_state): * ext/audiofile/gstafsrc.h: * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_init): * ext/directfb/directfbvideosink.c: (gst_directfbvideosink_init): * ext/dts/gstdtsdec.c: (gst_dtsdec_init): * ext/jack/gstjack.h: * ext/jack/gstjackbin.c: (gst_jack_bin_init), (gst_jack_bin_change_state): * ext/musepack/gstmusepackdec.c: (gst_musepackdec_init): * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_init): * ext/nas/nassink.c: (gst_nassink_open_audio), (gst_nassink_close_audio), (gst_nassink_change_state): * ext/nas/nassink.h: * ext/polyp/polypsink.c: (gst_polypsink_init): * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_change_state): * ext/sdl/sdlvideosink.h: * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init): * ext/sndfile/gstsf.c: (gst_sf_set_property), (gst_sf_change_state), (gst_sf_release_request_pad), (gst_sf_open_file), (gst_sf_close_file), (gst_sf_loop): * ext/sndfile/gstsf.h: * ext/swfdec/gstswfdec.c: (gst_swfdec_init): * ext/tarkin/gsttarkindec.c: (gst_tarkindec_init): * gst/apetag/apedemux.c: (gst_ape_demux_init): * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_init): * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_init): * gst/festival/gstfestival.c: (gst_festival_change_state): * gst/festival/gstfestival.h: * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init): * gst/multifilesink/gstmultifilesink.c: (gst_multifilesink_init), (gst_multifilesink_set_location), (gst_multifilesink_open_file), (gst_multifilesink_close_file), (gst_multifilesink_next_file), (gst_multifilesink_pad_query), (gst_multifilesink_handle_event), (gst_multifilesink_chain), (gst_multifilesink_change_state): * gst/multifilesink/gstmultifilesink.h: * gst/videodrop/gstvideodrop.c: (gst_videodrop_init): * sys/cdrom/gstcdplayer.c: (cdplayer_init): * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_init), (dxr3audiosink_open), (dxr3audiosink_close), (dxr3audiosink_chain_pcm), (dxr3audiosink_chain_ac3), (dxr3audiosink_change_state): * sys/dxr3/dxr3audiosink.h: * sys/dxr3/dxr3spusink.c: (dxr3spusink_init), (dxr3spusink_open), (dxr3spusink_close), (dxr3spusink_chain), (dxr3spusink_change_state): * sys/dxr3/dxr3spusink.h: * sys/dxr3/dxr3videosink.c: (dxr3videosink_init), (dxr3videosink_open), (dxr3videosink_close), (dxr3videosink_write_data), (dxr3videosink_change_state): * sys/dxr3/dxr3videosink.h: * sys/glsink/glimagesink.c: (gst_glimagesink_init): * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_change_state), (gst_qcamsrc_open), (gst_qcamsrc_close): * sys/qcam/gstqcamsrc.h: * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init): * sys/vcd/vcdsrc.c: (gst_vcdsrc_set_property), (gst_vcdsrc_get), (gst_vcdsrc_open_file), (gst_vcdsrc_close_file), (gst_vcdsrc_change_state), (gst_vcdsrc_recalculate): * sys/vcd/vcdsrc.h: renamed GST_FLAGS macros to GST_OBJECT_FLAGS moved bitshift from macro to enum definition - -2005-09-05 17:20:28 +0000 Jan Schmidt <jan.schmidt@sun.com> - - * gst/gl/glimagesink.c: - 015/906 Fix up all the state change functions. - -2004-11-01 14:43:38 +0000 Jan Schmidt <jan.schmidt@sun.com> - - * gst/gl/glimagesink.c: - 014/906 * ext/alsa/gstalsa.c: (gst_alsa_class_init), (gst_alsa_dispose), (gst_alsa_finalize): * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init), (gst_cdaudio_finalize): * ext/cdparanoia/gstcdparanoia.c: (cdparanoia_class_init), (cdparanoia_finalize): * ext/divx/gstdivxdec.c: (gst_divxdec_dispose): * ext/divx/gstdivxenc.c: (gst_divxenc_dispose): * ext/dvdread/dvdreadsrc.c: (dvdreadsrc_class_init), (dvdreadsrc_finalize): * ext/flac/gstflacdec.c: (gst_flacdec_class_init), (gst_flacdec_finalize): * ext/flac/gstflacenc.c: (gst_flacenc_class_init), (gst_flacenc_finalize): * ext/gnomevfs/gstgnomevfssink.c: (gst_gnomevfssink_class_init), (gst_gnomevfssink_finalize): * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_class_init), (gst_gnomevfssrc_finalize): * ext/libfame/gstlibfame.c: (gst_fameenc_class_init), (gst_fameenc_finalize): * ext/nas/nassink.c: (gst_nassink_class_init), (gst_nassink_finalize): * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_finalize), (gst_sdlvideosink_class_init): * ext/sndfile/gstsf.c: (gst_sf_dispose): * gst-libs/gst/mixer/mixertrack.c: (gst_mixer_track_dispose): * gst-libs/gst/tuner/tunerchannel.c: (gst_tuner_channel_dispose): * gst-libs/gst/tuner/tunernorm.c: (gst_tuner_norm_dispose): * gst-libs/gst/xwindowlistener/xwindowlistener.c: (gst_x_window_listener_dispose): * gst/audioscale/gstaudioscale.c: * gst/playondemand/gstplayondemand.c: (play_on_demand_class_init), (play_on_demand_finalize): * gst/videofilter/gstvideobalance.c: (gst_videobalance_dispose): * gst/videoscale/gstvideoscale.c: (gst_videoscale_chain): * sys/cdrom/gstcdplayer.c: (cdplayer_class_init), (cdplayer_finalize): * sys/glsink/glimagesink.c: (gst_glimagesink_finalize), (gst_glimagesink_class_init): * sys/oss/gstosselement.c: (gst_osselement_class_init), (gst_osselement_finalize): * sys/oss/gstosssink.c: (gst_osssink_dispose): * sys/oss/gstosssrc.c: (gst_osssrc_dispose): * sys/v4l/gstv4lelement.c: (gst_v4lelement_dispose): Fixes a bunch of problems with finalize and dispose functions, either assumptions that dispose is only called once, or not calling the parent class dispose/finalize function - -2004-08-27 19:18:24 +0000 David Schleef <ds@schleef.org> - - * gst/gl/glimagesink.c: - 013/906 * sys/glsink/glimagesink.c: (gst_glimagesink_ximage_put), (gst_glimagesink_xwindow_new), (gst_glimagesink_xcontext_get), (gst_glimagesink_fixate): Move local variable declarations to make gcc-2.95 happy. - -2004-08-09 20:16:48 +0000 David Schleef <ds@schleef.org> - - * gst/gl/ARB_multitexture.h: - * gst/gl/EXT_paletted_texture.h: - * gst/gl/NV_register_combiners.h: - * gst/gl/gstgl_nvimage.c: - * gst/gl/gstgl_pdrimage.c: - * gst/gl/gstgl_rgbimage.c: - * gst/gl/gstglsink.c: - * gst/gl/gstglsink.h: - * gst/gl/gstglxwindow.c: - * gst/gl/regcomb_yuvrgb.c: - 012/906 * sys/glsink/ARB_multitexture.h: Remove old files. * sys/glsink/EXT_paletted_texture.h: * sys/glsink/NV_register_combiners.h: * sys/glsink/gstgl_nvimage.c: * sys/glsink/gstgl_pdrimage.c: * sys/glsink/gstgl_rgbimage.c: * sys/glsink/gstglsink.c: * sys/glsink/gstglsink.h: * sys/glsink/gstglxwindow.c: * sys/glsink/regcomb_yuvrgb.c: - -2004-08-09 20:14:51 +0000 David Schleef <ds@schleef.org> - - * gst/gl/Makefile.am: - * gst/gl/glimagesink.c: - * gst/gl/glimagesink.h: - 011/906 Patch from Gernot Ziegler <gz@lysator.liu.se> rewriting the GL sink plugin. (Bug #147302) * configure.ac: Test for OpenGL * sys/Makefile.am: Use test for OpenGL * sys/glsink/Makefile.am: * sys/glsink/glimagesink.c: rewrite * sys/glsink/glimagesink.h: rewrite - -2004-03-15 19:32:26 +0000 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/gl/gstgl_nvimage.c: - * gst/gl/gstgl_pdrimage.c: - * gst/gl/gstgl_rgbimage.c: - * gst/gl/gstglsink.c: - * gst/gl/gstglxwindow.c: - * gst/gl/regcomb_yuvrgb.c: - 010/906 don't mix tabs and spaces - -2004-03-15 16:32:53 +0000 Johan Dahlin <johan@gnome.org> - - * gst/gl/ARB_multitexture.h: - * gst/gl/EXT_paletted_texture.h: - * gst/gl/NV_register_combiners.h: - * gst/gl/gstglsink.h: - 009/906 * *.h: Revert indenting - -2004-03-14 22:34:32 +0000 Thomas Vander Stichele <thomas at apestaart dot org> - - * gst/gl/ARB_multitexture.h: - * gst/gl/EXT_paletted_texture.h: - * gst/gl/NV_register_combiners.h: - * gst/gl/gstgl_nvimage.c: - * gst/gl/gstgl_pdrimage.c: - * gst/gl/gstgl_rgbimage.c: - * gst/gl/gstglsink.c: - * gst/gl/gstglsink.h: - * gst/gl/gstglxwindow.c: - * gst/gl/regcomb_yuvrgb.c: - 008/906 gst-indent - -2004-01-12 04:15:47 +0000 David Schleef <ds@schleef.org> - - * gst/gl/gstgl_nvimage.c: - * gst/gl/gstgl_pdrimage.c: - * gst/gl/gstglsink.c: - 007/906 * ext/ffmpeg/gstffmpeg.c: * ext/ffmpeg/gstffmpegcodecmap.c: * ext/ffmpeg/gstffmpegdec.c: * ext/ffmpeg/gstffmpegenc.c: * ext/ffmpeg/gstffmpegprotocol.c: * ext/gdk_pixbuf/gstgdkanimation.c: * ext/jpeg/gstjpeg.c: * ext/libpng/gstpng.c: * ext/mpeg2dec/perftest.c: * ext/speex/gstspeex.c: * gst-libs/gst/resample/dtos.c: * gst/intfloat/gstintfloatconvert.c: * gst/oneton/gstoneton.c: * gst/rtjpeg/RTjpeg.c: * gst/rtp/gstrtp.c: * sys/dxr3/dxr3init.c: * sys/glsink/gstgl_nvimage.c: * sys/glsink/gstgl_pdrimage.c: * sys/glsink/gstglsink.c: * testsuite/gst-lint: Make sure everybody wraps #include "config.h" in #ifdef HAVE_CONFIG_H - -2003-12-22 01:47:08 +0000 David Schleef <ds@schleef.org> - - * gst/gl/gstglsink.c: - 006/906 Merge CAPS branch - -2003-12-04 10:37:36 +0000 Andy Wingo <wingo@pobox.com> - - * gst/gl/gstglsink.c: - 005/906 remove copyright field from plugins - -2003-11-07 12:46:52 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net> - - * gst/gl/gstgl_rgbimage.c: - * gst/gl/gstglxwindow.c: - * gst/gl/regcomb_yuvrgb.c: - 004/906 Remove all config.h includes from header files, add it to each source file and remove duplicate config.h includes from several source files - -2003-11-06 00:27:03 +0000 madmac <madmac> - - * gst/gl/gstglsink.c: - 003/906 updates to glsink - -2003-10-31 16:40:20 +0000 madmac <madmac> - - * gst/gl/ARB_multitexture.h: - * gst/gl/gstgl_nvimage.c: - * gst/gl/gstgl_rgbimage.c: - * gst/gl/gstglsink.c: - * gst/gl/gstglxwindow.c: - * gst/gl/regcomb_yuvrgb.c: - 002/906 glsink with correct threading support - -2003-10-28 18:54:20 +0000 madmac <madmac> - - * gst/gl/ARB_multitexture.h: - * gst/gl/EXT_paletted_texture.h: - * gst/gl/Makefile.am: - * gst/gl/NV_register_combiners.h: - * gst/gl/gstgl_nvimage.c: - * gst/gl/gstgl_pdrimage.c: - * gst/gl/gstgl_rgbimage.c: - * gst/gl/gstglsink.c: - * gst/gl/gstglsink.h: - * gst/gl/gstglxwindow.c: - * gst/gl/regcomb_yuvrgb.c: - 001/906 welcome to glsink for 0.7.x :) - -2014-03-14 18:23:51 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * configure.ac: - * sys/winks/Makefile.am: - * sys/winks/gstksclock.c: - * sys/winks/gstksvideodevice.c: - * sys/winks/gstksvideosrc.c: - * sys/winks/gstksvideosrc.h: - * sys/winks/kshelpers.c: - * sys/winks/ksvideohelpers.c: - winks: port to 1.0 - https://bugzilla.gnome.org/show_bug.cgi?id=702041 - -2014-03-15 15:17:43 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/y4m/gsty4mdec.c: - y4mdec: check for VIDEO meta instead of CROP meta - This element only need stride support, but checks for CROP_META, which - is a bit too much, even though this works as CROP imply having VIDEO - meta. - https://bugzilla.gnome.org/show_bug.cgi?id=726255 - -2014-03-04 13:19:55 +0100 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/plugins/gst-plugins-bad-plugins.args: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - dvbsrc: mpegts: change bandwidth to DVBv5 values - Signed-off-by: Stefan Ringel <linuxtv@stefanringel.de> - https://bugzilla.gnome.org/show_bug.cgi?id=725463 - -2013-10-31 14:27:10 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * tests/examples/mpegts/ts-parser.c: - examples: ts-parser: Add table_id_name function - https://bugzilla.gnome.org/show_bug.cgi?id=721682 - -2013-11-19 11:36:14 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * tests/examples/mpegts/ts-parser.c: - examples: ts-parser: Add DVB teletext/subtitling - https://bugzilla.gnome.org/show_bug.cgi?id=721682 - -2014-03-03 13:07:47 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Support Bluray DTS/DTS-HD and AC3+/TrueHD streams - Apart from just adding detection of the proper stream type, we also need to only - output the first substream (0x71) which contains the core substream. - While this does not provide *full* DTS-HD support (since it will miss the complementary - substreams), it will still work in the way legacy (non-DTS-HD) bluray players would work. - https://bugzilla.gnome.org/show_bug.cgi?id=725563 - -2014-03-13 14:41:06 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Fix string order in warning message - -2014-03-09 18:41:28 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Always calculate the current download rate - Also take into account the last download rate when - calculating it. - -2014-03-11 10:32:46 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * ext/sbc/gstsbcenc.c: - sbcenc: Allow user to set channel-mode - Don't return error when channel-mode is already set, just check that it - is coherent with number of channels. - https://bugzilla.gnome.org/show_bug.cgi?id=726098 - -2014-03-10 11:19:46 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Differentiate the mpeg-2 stream from mpeg-1 based on pic_ext - Presence of picture extension header identifies the stream as mpeg2. - We are supposed to set the mpegversion to 2 if there is a picextension - instead of blindly setting the version to 1 - https://bugzilla.gnome.org/show_bug.cgi?id=726028 - -2014-03-11 22:36:01 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: set a group-id on the stream-start event - Set a default group-id to fix a warning printed by the sink. - -2014-03-10 22:48:04 +0100 Mathieu Duponchelle <mduponchelle1@gmail.com> - - * gst/frei0r/gstfrei0rfilter.c: - frei0rfilter: fix memory corruption on sink caps changes. - When the input size changed, the frei0r filters didn't take - it into account and ended up corrupting memory. - Fixes #726069 - -2014-03-11 15:30:19 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/atdec.c: - atdec: Add some more debug output - -2014-03-11 14:47:04 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/atdec.c: - * sys/applemedia/atdec.h: - atdec: Implement draining properly - -2014-03-11 14:37:49 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/atdec.c: - atdec: First dequeue a buffer before enqueueing anything from the queue - Required for offline rendering according to the docs. wtf. - -2014-03-11 14:32:12 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/atdec.c: - * sys/applemedia/atdec.h: - atdec: Keep track of the current position - It's required to set a valid sample time for decoding on iOS. - -2014-03-11 14:24:59 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/atdec.c: - * sys/applemedia/atdec.h: - atdec: Always try to pull one decoded frame out of the queue - ... instead of doing magic calculations with the buffer duration. - -2014-03-11 14:22:57 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/atdec.c: - atdec: Handle errors in handle_frame() properly - -2014-03-11 14:14:23 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/atdec.c: - atdec: Call AudioQueueReset() for flushing - AudioQueueFlush() is for draining all remaining data. - -2014-03-11 11:18:22 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/atdec.c: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/vtutil.c: - atdec: Set correct number of frames for MP3 - -2014-03-11 11:18:11 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/atdec.c: - atdec: Initialize the audio description with zeroes - -2014-03-11 11:14:21 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/atdec.c: - atdec: Set the correct layer depending on the MP3 caps - -2014-03-11 10:26:34 +0100 Wim Taymans <wtaymans@redhat.com> - - * configure.ac: - configure: videosignal was ported almost a year ago - -2014-03-09 19:38:39 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Fix comparison in bitrate selection - -2014-03-07 12:11:59 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: set proxy allocation flag on the video sink pad - https://bugzilla.gnome.org/show_bug.cgi?id=725893 - -2014-03-07 16:22:50 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - m3u8: Fix off-by-one in the download range end - -2014-03-07 16:22:10 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gstfragment.c: - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownload: Handle no buffers before EOS as error instead of crashing - -2014-03-06 23:14:10 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Implement proper segment handling - https://bugzilla.gnome.org/show_bug.cgi?id=695846 - https://bugzilla.gnome.org/show_bug.cgi?id=723268 - -2014-03-05 10:47:01 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - * gst-libs/gst/uridownloader/gstfragment.c: - hlsdemux: Implement handling of byte ranges - -2014-02-27 10:54:10 +0100 Zallesov <zallesov@gmail.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Fix seeking further than track duration - Don't fail the seek but instead send an EOS event from the streaming thread. - -2014-03-05 16:02:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Switch playlists after pushing the fragment - Makes sure we properly set the discont flag for the next buffer, - not the current one. - -2014-01-10 17:38:09 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: handle video/x-raw(ANY) if downstream supports the GstVideoOverlayCompositionMeta API - https://bugzilla.gnome.org/show_bug.cgi?id=721950 - -2014-03-04 17:25:23 +0200 Andres Gomez <agomez@igalia.com> - - * sys/wininet/gstwininetsrc.c: - wininet: "iradio-mode" property defaults to TRUE - As per discussed in bug #725383, it doesn't make much sense to default - to FALSE in the "iradio-mode" property. Better, let's sent the header - by default and just ignore headers that are not understood, if so. - https://bugzilla.gnome.org/show_bug.cgi?id=725659 - -2014-03-05 00:51:04 +0000 Tim-Philipp Müller <tim@centricular.com> - - * tests/check/elements/mpg123audiodec.c: - tests: fix mpg123audiodec test for big-endian architectures - -2014-03-05 11:20:27 +0100 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/rawparse/gstvideoparse.c: - rawparse: increase framerate to maxint - -2014-03-05 10:54:47 +0100 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/rawparse/gstvideoparse.c: - rawparse: increase maximum framerate - -2014-03-02 05:25:48 +0100 Sebastian Rasmussen <sebras@hotmail.com> - - * .gitignore: - .gitignore: Ignore gcov intermediate files - https://bugzilla.gnome.org/show_bug.cgi?id=725481 - -2014-03-01 17:13:58 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: Implement proper handling of discontinuities - It's not really correct yet for seeks but better than what - we had before. - See https://bugzilla.gnome.org/show_bug.cgi?id=695846 - -2014-02-28 11:16:27 -0800 Aleix Conchillo Flaqué <aleix@oblong.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: unref caps after gst_query_set_caps_result - https://bugzilla.gnome.org/show_bug.cgi?id=725412 - -2014-02-25 11:45:46 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * ext/hls/m3u8.c: - hlsdemux: Segfaults if playlist has no media files - hlsdemux causes a null pointer dereference if the media playlist - does not contain any media files. The gst_m3u8_client_get_duration - function assumes that demux->client->current->files is valid when - computing duration. - gst_m3u8_client_update needed to be modified to check for the - case of downloading an M3U8 file that doesn't contain any media - files, and returning an error to gsthlsdemux.c - This bug can be reproduced by creating a master m3u8 file that - contains one media playlist that points back to the master m3u8 - file. For example create a file called bug725134.m3u8: - #EXTM3U - #EXT-X-VERSION:4 - #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1251135, CODECS="avc1.42001f mp4a.40.2", RESOLUTION=640x352 - bug725134.m3u8 - https://bugzilla.gnome.org/show_bug.cgi?id=725134 - -2014-02-28 09:34:59 +0100 Sebastian Dröge <sebastian@centricular.com> - - * common: - Automatic update of common submodule - From fe1672e to bcb1518 - -2014-02-27 22:28:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Don't write after the end of the psm array when initialising it - -2014-02-27 21:45:34 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openal/gstopenalsrc.c: - openalsrc: Remove unused function to fix compiler warning - -2014-02-27 21:41:53 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/id3tag/id3tag.c: - id3tag: Remove unused function to fix compiler warning - -2014-02-27 15:49:20 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Init and clear a mutex - GLib initialises automatically for us for some reason... but of course - does not clear the mutex once the demuxer is destroyed. - -2014-02-27 15:41:30 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Unref seek events before returning from the seek handler - Otherwise we leak them all. - -2014-02-27 12:02:19 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Fix debug output to describe the new reality - -2014-02-27 11:53:12 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Warning messages are not fatal - Also they need to be parsed with gst_message_parse_warning(), - gst_message_parse_error() does not work on them. - -2014-02-26 22:26:48 +0100 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - docs: mpegts: add missed docs - Signed-off-by: Stefan Ringel <linuxtv@stefanringel.de> - https://bugzilla.gnome.org/show_bug.cgi?id=725278 - -2014-02-26 21:08:23 +0100 Stefan Ringel <linuxtv@stefanringel.de> - - * docs/plugins/gst-plugins-bad-plugins.args: - docs: dvbsrc: add missed args - Signed-off-by: Stefan Ringel <linuxtv@stefanringel.de> - https://bugzilla.gnome.org/show_bug.cgi?id=725278 - -2014-02-26 22:12:23 +0100 Stefan Sauer <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 1a07da9 to fe1672e - -2014-02-26 19:18:54 +0100 Stefan Sauer <ensonic@users.sf.net> - - * docs/Makefile.am: - docs: remove stray ( in Makefile.am - -2014-02-24 22:53:14 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: forward tags that have global scope - Instead of dropping all tag events - https://bugzilla.gnome.org/show_bug.cgi?id=644395 - -2014-02-24 22:43:56 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: store global tags to push later - Keep a list of current global tags around and push them - whenever a new stream is started. Also convert all stream - specific tags to global as they are stream specific for - the container, so they are global for the streams from - within that container. - https://bugzilla.gnome.org/show_bug.cgi?id=644395 - -2014-02-26 11:32:01 +0100 Stefan Sauer <ensonic@users.sf.net> - - * docs/Makefile.am: - docs: install prebuilt plugin docs if gtk-doc is disabled - Sync to the Makefile.am from gst-plugin-base where it is done right. - Fixes #725034 - -2014-02-21 09:36:51 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * ext/hls/m3u8.c: - hlsdemux: Fix parsing of CODECS and RESOLUTION - hlsdemux does not check for the '"' character in #EXT-X-STREAM-INF - attributes. The CODECS parameter is an example of an attribute - that might use the '"' symbol and might contain a ',' character - inside this quoted string. - For example: CODECS="avc1.77.30, mp4a.40.2" - hlsdemux does not correctly parse the RESOLUTION attribute, it - assumes that an '=' character is used to delineate the width - and height values, but the HLS RFC states that a 'x' character - must be used as the delimiter between width and height. - https://bugzilla.gnome.org/show_bug.cgi?id=725140 - -2014-02-21 09:30:49 +0000 Alex Ashley <bugzilla@ashley-family.net> - - * ext/hls/m3u8.c: - hlsdemux: Fix for URLs that contain a '/' in the query parameter - If the URL for the master manifest files contains a '/' character - in the query parameter (for example - http://example.net/1054559_h264_1500k.mp4/master.m3u8?acl=/*1054559_h264_1500k.mp4), - hlsdemux is incorrectly converting the relative URLs of the media - playlists in to absolute URLs. It is incorrectly using the last '/' it - finds in the URL. According to RFC3986 the '/' character is allowed in - the query part of the URL. - https://bugzilla.gnome.org/show_bug.cgi?id=725137 - -2013-12-02 10:01:12 +0000 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * gst-libs/gst/egl/egl.c: - * gst-libs/gst/egl/egl.h: - eglglessink: move GstEGLImageBufferPool to gstegl lib - https://bugzilla.gnome.org/show_bug.cgi?id=706054 - -2014-02-25 12:17:20 +0100 Jesper Larsen <knorr.jesper@gmail.com> - - * tests/check/libs/mpegts.c: - test: mpegts: Add check for SDT - https://bugzilla.gnome.org/show_bug.cgi?id=724981 - -2014-02-22 16:46:31 +0100 Jesper Larsen <knorr.jesper@gmail.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: Add constructor for dvb service descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=724981 - -2014-02-25 10:28:38 +0100 Jesper Larsen <knorr.jesper@gmail.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - docs: mpegts: Add new SDT API - https://bugzilla.gnome.org/show_bug.cgi?id=724981 - -2014-02-22 16:47:57 +0100 Jesper Larsen <knorr.jesper@gmail.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gst-dvb-section.h: - mpegts: Add support for creation of SDT - https://bugzilla.gnome.org/show_bug.cgi?id=724981 - -2014-02-22 16:41:22 +0100 Jesper Larsen <knorr.jesper@gmail.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gst-dvb-section.h: - mpegts: Add transport_stream_id to GstMpegTsSDT - The transport_stream_id is contained in the subtable extension. - Introduce a variable for readability. - https://bugzilla.gnome.org/show_bug.cgi?id=724981 - -2014-02-25 11:29:06 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: Initialize PSM fully - Some gaps were missed in the previous version. Instead just initialize - the whole table to -1 first and then fill what needs to be specified. - -2014-02-24 15:52:53 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegts: Fix descriptor checks - Only use g_return_val_if_fail on provided direct arguments. The others get - checked all the time. - https://bugzilla.gnome.org/show_bug.cgi?id=724464 - -2014-02-24 14:56:03 -0500 Kipp Cannon <kcannon@cita.utoronto.ca> - - * gst/debugutils/debugutilsbad.c: - debugutilsbad.c fails gst-indent check - this patch is "gst-indent debugutilsbad.c" - https://bugzilla.gnome.org/show_bug.cgi?id=725090 - -2014-02-22 18:22:26 +0100 Jesper Larsen <knorr.jesper@gmail.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: network_name: Check converted length - Check the length of the name argument after it has been converted. - https://bugzilla.gnome.org/show_bug.cgi?id=723953 - -2014-02-08 22:47:20 +0100 Jesper Larsen <knorr.jesper@gmail.com> - - * tests/check/Makefile.am: - * tests/check/libs/.gitignore: - * tests/check/libs/mpegts.c: - tests: Add test for mpegts library - Tests for PAT, PMT, and NIT - Creates a new table, and populates it with descriptors. - Parses the newly created tables, and checks the data. - Creates a GstMpegTsSection from the tables, and packetize the sections. - The packetized section data is byte-wise compared to a static byte array - https://bugzilla.gnome.org/show_bug.cgi?id=723953 - -2014-02-24 11:06:28 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - examples: gst-camerabin2-test: new 1.x raw caps format - Remove -yuv and -rgb from video/x-raw as those are from the - old 0.10 version - -2014-02-23 15:18:22 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: Keep track of timestamps by adding them up during playback - ...instead of adding them from the start of playlist every time. This - among other things fixes timestamps for live streams, where the playlist - is some kind of ringbuffer of fragments and thus adding from the beginning - of the playlist will miss the past fragments. - https://bugzilla.gnome.org/show_bug.cgi?id=724983 - -2014-02-23 11:01:57 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Deprecate fragments-cache property - The buffering/caching is handling completely different now and - outside of hlsdemux. - -2014-02-18 19:16:35 -0600 Brendan Long <self@brendanlong.com> - - * ext/kate/gstkatedec.c: - * ext/kate/gstkateutil.c: - * ext/kate/gstkateutil.h: - katedec: Merge new tags with existing tags to prevent overwriting demuxer tags - https://bugzilla.gnome.org/show_bug.cgi?id=724699 - -2014-02-20 15:09:36 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/hls/gsthlsdemux.c: - * ext/smoothstreaming/gstmssdemux.c: - ext: Use Codec/Demuxer/Adaptive for the adaptive streaming demuxers - -2014-02-17 09:19:32 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: Refactor threading and downloading - We now download fragments as fast as possible and push them downstream - while another thread is just responsible for updating live playlists - every now and then. - This simplifies the code a lot and together with the new buffering - mode for adaptive streams in multiqueue makes streams start much faster. - Also simplify threading a bit and hopefully make the GstTask usage safer. - -2014-02-19 09:35:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Only switch pads if the caps are changing - -2014-02-21 12:33:42 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/dash/gstdashdemux.c: - dashdemux: ensure segments aren't fetched before they're available - Incorrect time scaling in gst_dash_demux_wait_for_fragment_to_be_available() - means that media segments are fetched before their availablity time. This - patch fixes this. - https://bugzilla.gnome.org/show_bug.cgi?id=724875 - -2014-02-21 14:06:24 +0100 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Uncomment PAT clearup in _reset - The PAT is related to the stream, we therefore want it cleared along - with anything stream related. - This commented section was from the (old) mpegtsparse and *might* have - been related to speeding up DVB start-up. But we have another plan for that. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=724716 - -2014-02-18 10:19:52 +0000 Chris Bass <floobleflam@gmail.com> - - * ext/dash/gstdashdemux.c: - dashdemux: initialise demux->last_manifest_update - demux->last_manifest_update is not initialised at startup, with the - effect that live manifests are reloaded immediately after the download - loop begins. This patch fixes this. - https://bugzilla.gnome.org/show_bug.cgi?id=724790 - -2013-12-29 16:00:01 +0100 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Fix ts_to_offset beyond last observed PCR - The requested TS might be beyond the last observed PCR. In order to calculate - a coherent offset, we need to use the last and previous-to-last groups. - https://bugzilla.gnome.org/show_bug.cgi?id=721035 - -2014-02-12 18:15:44 -0600 Brendan Long <self@brendanlong.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - mpegts: Add gst_mpegts_section_get_data, to allow us to get the original binary section data. - https://bugzilla.gnome.org/show_bug.cgi?id=724255 - -2014-02-20 19:08:33 +0100 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegts: Add size guards for descriptors where neeeded - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=724464 - -2014-02-20 18:14:51 +0100 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpeg-ts: Rename private function - Calling it _desc_checks when it was in fact used for sections was a - tad confusing ... - -2014-02-16 10:45:21 +0100 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: Add support for content descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=724034 - -2014-02-16 10:44:55 +0100 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - mpegts: Add support for component descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=724034 - -2014-02-16 10:43:52 +0100 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: Add support for extended event desriptor - https://bugzilla.gnome.org/show_bug.cgi?id=724034 - -2014-02-10 21:52:28 +0100 Stefan Ringel <linuxtv@stefanringel.de> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: Add support for DVB terrestrial delivery system descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=724069 - -2014-02-16 10:09:18 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * sys/Makefile.am: - * sys/winks/Makefile.am: - configure: Rename all variables related to the winks plugin - It does not make sense to call them after directshow if they - are for the winks plugin only. - https://bugzilla.gnome.org/show_bug.cgi?id=724100 - -2013-04-08 14:04:10 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: fix update interval with respect of the spec - -2014-02-14 12:39:06 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcaudiodec.h: - amcaudiodec: Calculate number of samples per frame for MP3 and use that - Some audio decoders (at least the MP3 decoder on MTK based devices) outputs - raw audio in batches of multiple audio frames. We need to handle that - properly, otherwise the base class will be kind of unhappy. - -2014-02-14 12:33:08 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcaudiodec.c: - amcaudiodec: Error out if we get an invalid raw audio buffer size - -2014-02-14 12:32:31 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Store return value of gst_caps_merge_structure() - The inputs are both invalid afterwards. - -2014-02-14 12:31:29 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Release buffer to Android if allocating output failed - -2014-02-14 12:28:50 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcaudiodec.c: - amcaudiodec: Release buffer back to Android if allocating output fails - -2014-02-13 10:21:15 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Keep alive connections if the source supports that - -2014-02-13 10:06:48 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Re-use old source element if possible - Allows to implement keep-alive handling in the source element. - -2014-02-12 18:49:13 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Ignore empty lines in the playlist - Based on a patch by Andoni Morales. - -2014-02-12 18:47:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Make sure to ignore \r in line endings in every case - -2014-02-12 18:27:21 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Give a proper name to the srcpads and remove it when resetting the element - -2014-02-12 18:06:43 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Fix potential deadlock - The streaming thread might use our lock, so shutting - down the element while holding that lock calls for problems. - -2014-02-12 17:59:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Shutdown the source element before unlinking it - Otherwise we might get warnings about pushing to unlinked pads. - Based on a patch by Andoni Morales. - -2014-02-12 16:46:31 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Stop leaking GErrors in some error paths - -2012-05-11 13:58:28 +0200 Gil Pedersen <git@gpost.dk> - - * ext/hls/gsthlsdemux.c: - hlsdemux: don't pause task when it is stopped - This fixes a potential dead-lock situation from GstTask - https://bugzilla.gnome.org/show_bug.cgi?id=675869 - -2014-02-12 16:01:05 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Wait for the update task to finish when shutting down - -2014-02-12 15:33:06 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Prevent rounding errors due to division by using gst_util_uint64_scale() - -2013-07-25 19:36:48 +0200 Arnaud Vrac <avrac@freebox.fr> - - * ext/hls/gsthlsdemux.c: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: schedule next update based on the fragment duration - -2014-02-12 15:16:23 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Properly error out if caps can't be typefind instead of using NULL caps - -2013-07-29 18:00:31 +0200 Arnaud Vrac <avrac@freebox.fr> - - * ext/hls/gsthlsdemux.c: - hlsdemux: log fragment timestamp - -2014-02-12 14:10:02 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Use g_ascii_xdigit_value() instead of our own version of it - -2014-02-12 13:40:41 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Error out if the key is not 16 bytes large - -2014-02-12 13:13:30 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Download playlists with compression, keys and fragments without - -2014-02-12 13:11:38 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: Download the manifest with compression, the fragments without - -2014-02-12 13:10:50 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Download MPD with compression, the fragments without - -2014-02-12 13:08:29 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - * gst-libs/gst/uridownloader/gsturidownloader.h: - uridownloader: Add support for compressed downloads - Very useful for playlists, less useful for media files. - -2014-02-12 11:26:04 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Don't set the element private data on the srcpads - It's not used anyway. - -2014-02-12 11:25:41 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Use gst_pad_use_fixed_caps() on the srcpads - -2014-02-12 10:59:38 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Cache the key fragment instead of downloading it over and over again - -2014-02-12 10:58:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Fix cleanup when decryption fails - First unmap buffers, then unref them. And also unref the - key fragment. - -2014-02-11 15:20:58 +0100 Lihua Liu <lihual@axis.com> - - * ext/curl/gstcurlsmtpsink.c: - curlsmtpsink: Include timezone information in mail header - https://bugzilla.gnome.org/show_bug.cgi?id=724125 - -2014-02-11 18:15:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Don't try decryption if an unsupported method is found - -2014-02-11 18:15:07 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Properly parse IV from the playlist - Without this every fragment's first 16 bytes will be corrupted - if not the fallback IV is used by the playlist. - -2014-02-11 15:26:01 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Reset cancelled state after fetching an URI - Otherwise it will never ever be able to fetch anything after an - error until the user resets it manually. - -2014-02-11 14:57:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Propagate download errors properly and post error messages if they're fatal - -2014-02-11 14:18:32 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/dash/gstdashdemux.c: - * ext/hls/gsthlsdemux.c: - * ext/smoothstreaming/gstmssdemux.c: - ext: Update for GstUriDownloader API changes - -2014-02-11 14:13:30 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - * gst-libs/gst/uridownloader/gsturidownloader.h: - uridownloader: Provide some more details about errors if downloading fails - -2014-02-11 09:20:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - configure: The winks plugin is not ported to 1.0 yet - https://bugzilla.gnome.org/show_bug.cgi?id=724100 - -2014-02-10 15:38:08 -0800 Aleix Conchillo Flaqué <aleix@oblong.com> - - * sys/shm/shmpipe.c: - shm: call close() after shutdown() - shutdown() doesn't close the file descriptor so we leak sockets if we - don't call close(). - https://bugzilla.gnome.org/show_bug.cgi?id=724077 - -2014-02-10 14:33:49 -0800 Aleix Conchillo Flaqué <aleix@oblong.com> - - * sys/shm/shmpipe.c: - shm: use shutdown() instead of close() - we make sure both ends get notified when the socket is closed by using - shutdown() instead of close(). - https://bugzilla.gnome.org/show_bug.cgi?id=724077 - -2014-02-10 18:29:23 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Start downloading the next fragment immediately after caching the initial fragments - And only afterwards wait until a fragment was played. Otherwise we're keeping - our cache most of the time at "fragments-cache" fragments minus one. - Also allow setting "fragments-cache" to 1 now to start playback even faster. - -2014-02-10 18:27:58 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Start fetching new fragments whenever we have less fragments cached than given by the fragments-cache property - Waiting until our cache is empty before starting to fetch the next fragment - kind of defeats the purpose of caching multiple fragments. - -2014-02-10 18:21:38 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Fix bitrate calculation - g_get_monotonic_time() returns microseconds, not nanoseconds. - -2014-02-10 17:26:27 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Actually store doubles as such and don't truncate them to ints - Fixes broken duration reporting. - -2014-02-10 17:25:57 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/m3u8.c: - hlsdemux: Use locale-independent int/float parsing functions from GLib - -2014-02-10 14:34:40 +0100 Wim Taymans <wtaymans@redhat.com> - - * ext/fluidsynth/gstfluiddec.c: - fluiddec: add more soundfont search paths - Fedora installs the soundfonts in /usr/share/soundfonts/ so make sure we - look there as well. - -2014-02-10 08:19:52 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * ext/fluidsynth/gstfluiddec.c: - Change soundfont file search path for fluiddec - Use glib to get a list of system "share" directories, then go through that - list, appending 'sounds/sf2/' to each directory to get a soundfont directory, - and looking for .sf2 files there. - This way fluiddec is able to load sf2 files on W32, because otherwise the - path '/usr/share/sounds/sf2' makes no sense there. - Fixes #724013 - -2014-02-10 08:21:04 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - Fix winks configure test - Fixes #723995 - -2014-02-10 08:22:05 +0000 Руслан Ижбулатов <lrn1986@gmail.com> - - * sys/winks/Makefile.am: - winks: Make headers known to automake - Fixes #724003 - -2014-02-09 18:49:49 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * ext/hls/Makefile.am: - * ext/hls/gsthlsdemux.c: - hlsdemux: Prefer to use nettle for decryption but fall-back to libgcrypt - nettle is used by newer versions of gnutls, while older versions of gnutls - used libgcrypt. Support both for now as not every distro has nettle yet. - nettle is preferred as it is more efficient to use and much smaller. - -2014-02-09 18:19:33 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - hlsdemux: Update to non-deprecated GLib thread API - -2014-02-09 18:09:36 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * ext/hls/Makefile.am: - * ext/hls/gsthlsdemux.c: - * m4/libgcrypt.m4: - hlsdemux: Use libgcrypt directly instead of going through gnutls - gnutls is also just wrapping gcrypt, but we don't need any of - the TLS related functionality. We just need to be able to decrypt - AES128-CBC. - -2014-02-08 20:08:29 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/opus.c: - opus: Remove unused variable from unit test - -2014-02-08 20:07:57 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/kate.c: - kate: Remove unused variable from unit test - -2014-02-08 20:07:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/assrender.c: - assrender: Fix compiler warning in test - error: suggest braces around initialization of subobject -Werror,-Wmissing-braces - -2014-02-08 19:59:43 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Fix comparison compiler warning - error: comparison of constant -1 with expression of type - 'GstSrtpCipherType' is always false - -2014-02-08 19:29:33 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/MotionCells.h: - motioncells: Remove unused private fields - -2014-02-08 19:28:26 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/gstsegmentation.cpp: - segmentation: Fix integer underflow check - error: comparison of unsigned expression < 0 is - always false -Werror,-Wtautological-compare - -2014-02-08 18:58:38 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/directfb/dfbvideosink.c: - dfbvideosink: Fix unitialized variable compiler warning - -2014-02-08 18:57:30 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/bz2/gstbz2dec.h: - * ext/bz2/gstbz2enc.h: - bz2: Fix typo in header include guards - -2014-02-08 18:56:06 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/vdpau/gstvdpvideobufferpool.c: - vdpau: Fix comparison compiler warning - error: comparison of constant -1 with expression - of type 'const GstVideoFormat' is always false - -2014-02-08 18:54:58 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/uvch264/gstuvch264_src.c: - uvch264src: Fix unitialized variable compiler warnings - -2014-02-08 18:48:42 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/id3tag/id3tag.c: - id3tag: Fix uninitialized variable compiler warning - error: variable 'image_type' is used uninitialized whenever - 'if' condition is false -Werror,-Wsometimes-uninitialized - -2014-02-08 18:45:10 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: Remove unused variable - -2014-02-08 18:20:22 +0100 Jesper Larsen <knorr.jesper@gmail.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegts: pmt: Detect descriptor length correct - -2014-02-08 17:43:03 +0100 Jesper Larsen <knorr.jesper@gmail.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegts: Correctly check for PAT,PMT,CAT,TSDT - -2014-02-08 13:08:02 +0100 Jesper Larsen <knorr.jesper@gmail.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegts: Fix some packetizing bugs - - Length of NIT stream descriptors was not detected correct - - Reserved bits was not set according to EN 300 468, ISO/IEC 13818-1 - - Also set output data size if the section was previously packetized - https://bugzilla.gnome.org/show_bug.cgi?id=723892 - -2014-02-07 11:54:07 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Remove or move variable assignments - To where they're needed - -2014-02-07 11:53:38 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - dvb-descriptor: Remove unneeded increment - -2014-02-07 11:42:51 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - dvb-descriptor: Fix comparision - we want to stop if one OR the other is NULL. - -2014-02-06 13:53:49 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegts: Updated docs with new API - -2013-11-19 12:21:31 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst/mpegtsmux/tsmux/Makefile.am: - * gst/mpegtsmux/tsmux/crc.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - mpegtsmux: Use mpeg-ts lib for PAT/PMT sections - Rewrite of the PAT/PMT section handling to use the mpeg-ts library - -2013-11-20 11:14:46 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst/mpegtsmux/Makefile.am: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/tsmux/Makefile.am: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - mpegtsmux: Add support for muxing SI tables - The muxer is now able to include DVB sections in the transport stream. - The si-interval property will determine how often the SI tables are - muxed into the stream. - The section is handled by the mpeg-ts library. Below is a small example - that will include a Netork Information Table with a Network Name - descriptor in the stream. - GstMpegTsNIT *nit; - GstMpegTsDescriptor *descriptor; - GstMpegTsSection *section; - GstElement *mpegtsmux; - gst_mpegts_initialize (); - nit = gst_mpegts_section_nit_new (); - nit->actual_network = TRUE; - descriptor = gst_mpegts_descriptor_from_dvb_network_name ("Network name"); - g_ptr_array_add (nit->descriptors, descriptor); - section = gst_mpegts_section_from_nit (nit); - // mpegtsmux should be retrieved from the pipeline - gst_mpegts_section_send_event (section, mpegtsmux); - gst_mpegts_section_unref (section); - -2013-11-19 11:30:33 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - mpegts: Support registration and custom descriptor - Support for registration descriptor (0x05) - Add function to create a descriptor with custom tag and data - -2013-11-19 11:15:52 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: Add creation of DVB Subtitling descriptor - Descriptor tag is 0x59 - -2013-11-19 10:50:30 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: Support parsing of DVB Teletext descriptor - Descriptor tag is 0x56 - -2013-11-20 11:06:03 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - mpegts: Add support for creating PAT/PMT - -2013-11-20 11:04:58 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - mpegts: Add program_number to GstMpegTsPMT - -2013-10-28 14:49:08 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: Add network name descriptor construction - Add function to create a Network Name DVB descriptor. - -2013-10-28 14:48:13 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gst-dvb-section.h: - mpegts: Add support for creating a NIT section - Functions that will enable user to create Network Information Tables. - -2013-10-28 14:26:39 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gst-dvb-section.h: - mpegts: Add network_id to GstMpegTsNIT - The network_id is stored in the subtable extension. Make a field - in the GstMpegTsNIT for better code readability - -2013-10-31 13:47:23 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - mpegts: Add functions to send sections as events - Added function that enables the user to send a GstMpegTsSection as - an event to a GstElement. (i.e. mpegtsmux) - -2013-10-28 14:44:13 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - mpegts: Add functions to packetize section - Sections needs to be packetized for use in i.e. mpegtsmux. - These functions handles the generic common parts of a GstMpegTsSection - -2013-10-28 14:39:49 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegts: Add init functions for descriptor/section - -2013-10-30 10:43:21 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegts: Add function to encode UTF8 strings - This can be used to create descriptors with appropriate character maps - -2013-10-30 10:42:07 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegts: Use big endian UCS-2 coding - Parsing of control codes requires a big endian character map - -2013-10-30 10:33:18 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegts: Add support for two-way iconv conversions - To use in conversions from UTF-8 to another character map - -2014-02-06 16:17:39 +0100 Edward Hervey <edward@collabora.com> - - * sys/applemedia-nonpublic/Makefile.am: - * sys/applemedia/Makefile.am: - applemedia: Fix libtool usage - --tag=CC is needed for static build - -2014-02-06 14:21:52 +0100 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/gsttsdemux.c: - mpegtsdemux: Update plugin license field - The original code (old mpegtsparse) from which this plugin was based on - was dual-licensed. This allowed usage of the code under any of the - licenses (which including LGPL): - """ - * Alternatively, the contents of this file may be used under the terms of - * the GNU Lesser General Public License Version 2 or later (the "LGPL"), - * in which case the provisions of the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of the MPL or the LGPL. - """ - When refactored (leading to the creation of this new plugin), I chose all - new code to be LGPL-only (which was allowed for pre-existing code) by removing - the MPL sections. - The headers were all updated, but not the plugin license field. This commit - fixes this. - -2014-02-04 14:15:40 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/check/libs/insertbin.c: - tests: insertbin: update tests to 1.x scenario - The thread that calls the success/failure callback can be the - same that is adding/removing the element as the IDLE probe can - happen instantly if the pad is not 'busy'. - This required moving some checks for the callback counter around - as well as removing some pad pushes from the main test thread as - they were made useless after the IDLE pad probe was fixed in core - by commit 0324358ebc8122a41ab499a3ef7973b61c3e621b - -2014-02-03 23:39:35 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/check/elements/camerabin.c: - tests: camerabin: avoid warning if test is failing - In case the test fails the message won't be returned and it - will lead to an assertion that might be misleading to those - debugging the issue. - -2014-02-03 23:10:03 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: stop source to do internal reconfiguration safely - In order to be able to change the caps on multiple capsfilters the - source element needs to be stopped, otherwise it will get a few - reconfigure events and might try to renegotiate while the bin - is still transitioning its caps, leading to a not-negotiated failure - and the image capture won't happen because the source will be - unusable. - The solution is to keep the source in paused while the caps are being - changed in the bin, and then bring the element back to playing once - it is done. Unfortunately this increases the image capture latency, - but it should always work. - A possible improvement to reduce the latency is to add another signal - to be called before 'start-capture': 'prepare-capture'. At this step - the camera source should set all caps it needs and get the source - ready for doing the capture as soon as 'start-capture' is called. - This can be done on a future commit - -2014-02-03 23:09:28 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: remove unused variable - Probably a left over from 0.10 -> 1.x porting - -2014-02-04 17:22:27 +0100 Carlos Rafael Giani <dv@pseudoterminal.org> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: improved error report and checks - Signed-off-by: Carlos Rafael Giani <dv@pseudoterminal.org> - -2014-02-04 12:52:25 +0100 Duncan Palmer <dpalmer@digisoft.tv> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Fix race condition between EOS handling and downloading a range - https://bugzilla.gnome.org/show_bug.cgi?id=723134 - -2014-02-04 05:46:16 -0500 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/aiff/aiffparse.c: - * gst/aiff/aiffparse.h: - aiffparse: adaptive buffer size - Copied from wavparse, helps with CPU usage on high bitrate - files. - -2014-02-02 18:17:06 -0800 Dan Kegel <dank@kegel.com> - - * configure.ac: - Since b1a756fd, applemedia fails to build on osx 10.7, which lacks VideoToolbox.h... so disable it on OSX if that header is missing. - https://bugzilla.gnome.org/show_bug.cgi?id=723508 - -2014-02-02 13:50:53 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/aiff/aiffparse.c: - aiffparse: fix data start offset calculation not counting COMM size - In particular, this fixes seeking back to the start reading data - out of sync with sample start granularity, yielding swapped channels. - -2014-01-31 23:43:32 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/check/elements/gdpdepay.c: - tests: gdpdepay: update to 1.x events - Tests needed stream start at beginning and segment after the - caps event - -2014-01-31 18:38:44 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/gdp/dataprotocol.c: - * gst/gdp/dp-private.h: - gdp: add DTS to headers - -2014-01-31 12:15:49 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/gdp/gstgdppay.c: - * gst/gdp/gstgdppay.h: - * tests/check/elements/gdppay.c: - gdppay: update to 1.x reality - * stream-start-id is mandatory at the beginning, so add that to the - gdp headers - * caps must be sent before new segment, invert the order from legacy - 0.10 code - And fix the tests as a ref is now kept for those buffers that compose - the header - -2014-01-31 16:58:16 -0500 Colin Macdonald <cbm@m.fsf.org> - - * gst/geometrictransform/gstfisheye.c: - fisheye: Fix documentation - https://bugzilla.gnome.org/show_bug.cgi?id=723398 - -2014-01-29 16:32:30 +0100 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Default framerate to 0/1 when no informations found - It is not perfect but it allows us to be sure that the mandatory 'framerate' - field is present in the caps. - As soon as some information is found in the stream, that will be - updated. - https://bugzilla.gnome.org/show_bug.cgi?id=723243 - -2014-01-30 19:45:08 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/check/elements/gdppay.c: - tests: gdppay: refactor and add missing bits - Most of the tests weren't updated after the sticky events order - and stream start. Fix that and refactor those tests check that - are the same to some common functions. - Those functions still don't actually test the content but at - least now they are in a single place and can be improved - without replication - -2014-01-30 18:17:33 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/check/elements/gdppay.c: - tests: gdppay: Do not forget to send stream-start event on test - Even if we don't want to push the caps event, a stream-start must - be present before any data in 1.x - -2014-01-30 18:09:13 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/gdp/gstgdppay.c: - gdppay: push the stream-start event - instead of just swallowing upstream's stream-start into its - payload, push it as elements expect a stream-start before data - -2014-01-30 20:28:04 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: We do not support the SKIP seek flag but that is not a problem - -2014-01-30 10:44:18 +0100 Edward Hervey <bilboed@bilboed.com> - - * common: - Automatic update of common submodule - From d48bed3 to 1a07da9 - -2014-01-30 03:28:45 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/check/elements/camerabin.c: - tests: camerabin: improve preview handling in tests - Always erase the preview image data to allow the next check for - it to operate properly - -2014-01-29 20:38:57 +0100 Duncan Palmer <dpalmer@digisoft.tv> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Always release the object lock in gst_uri_downloader_fetch_uri_with_range() - even if downloader->priv->urisrc is not set. This avoids deadlock under some - some conditions on cancel. - https://bugzilla.gnome.org/show_bug.cgi?id=723127 - -2014-01-29 13:25:37 +0100 Nicola Murino <nicola.murino@gmail.com> - - * configure.ac: - opencv: The plugin works with 2.4.8 too - https://bugzilla.gnome.org/show_bug.cgi?id=723230 - -2014-01-29 10:50:40 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/nalutils.c: - * gst-libs/gst/codecparsers/nalutils.h: - codecparsers: Don't use gst_ as prefix for private symbols - Otherwise they get exposed/accessible in the resulting .so - And make check-exports will complain - -2014-01-27 23:55:57 -0300 Amaury Medeiros <amaurymedeiros@gmail.com> - - * gst/mpegtsdemux/pesparse.c: - tsdemux: Fix flags comparison operator precedence - Fix operator precedence, so the whole operation is - negated instead of only flags variable. - https://bugzilla.gnome.org/show_bug.cgi?id=722096 - -2014-01-26 14:42:52 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst-libs/gst/mpegts/Makefile.am: - mpegts: install but nodist for generated header - -2014-01-25 17:40:46 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Don't handle FLUSHING or NOT_LINKED as error - And also just stop the task for FLUSHING. - -2014-01-24 21:41:25 +0100 Sjoerd Simons <sjoerd@luon.net> - - * gst/mxf/mxfdemux.c: - mxfdemux: Don't go into pull mode when the sequential flag is set - When the scheduling query results has GST_SCHEDULING_FLAG_SEQUENTIAL set - in its flags don't go into pull mode to prevent over-eager seeking. - https://bugzilla.gnome.org/show_bug.cgi?id=722934 - -2014-01-24 12:36:59 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * tests/check/elements/h264parse.c: - tests: h264parse: fix tests after leading 0x00 removal - Commit 6af387cd5ab2c946025e5499903e75ee87b063a9 made h264parse - strip a leading 0x00 byte from some output scenarios. This broke - tests as bs_to_nal test expects one more byte on the output. - Fix this by comparing the output with the expected stripped version, - too. - -2014-01-24 01:07:45 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/nalutils.c: - * gst-libs/gst/codecparsers/nalutils.h: - codecparsers: refactor common nal parsing to nalutils - Moves common code from h264 and h265 to a separate file - -2014-01-03 09:44:28 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst/videoparsers/gsth264parse.c: - h264parse: Fix multiple SEI messages in one SEI RBSP parsing. - An SEI RBSP could contains more than one SEI message as specified in - 7.4.2.3.1. - This commit change the parser API: the gst_h264_parser_parse_sei() - function now create and fill a GArray containing GstH264SEIMessage. - https://bugzilla.gnome.org/show_bug.cgi?id=721715 - -2014-01-22 10:26:32 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: remove trailling 0x00 bytes as the spec doesn't allow them - Just like h264, the spec doesn't allow the last bytes of a NAL to be 0x00. - So remove it as it is probably just padding. - This is related to https://bugzilla.gnome.org/show_bug.cgi?id=721384 - -2014-01-20 17:24:54 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: remove trailling 0x00 bytes as the spec doesn't allow them - The spec states that the last byte of a NAL 'shall not' be 0x00 - and it is allowed for byte-stream format to add padding 0x00 for - alignment. - So our parser should strip any trailling 0x00. - https://bugzilla.gnome.org/show_bug.cgi?id=721384 - -2014-01-21 23:42:58 +0900 Justin Joy <justin.joy.9to5@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: don't leak pad name when treating events - https://bugzilla.gnome.org/show_bug.cgi?id=722699 - -2014-01-21 10:27:20 +0100 Wim Taymans <wtaymans@redhat.com> - - * gst/mpegpsmux/mpegpsmux.c: - mpegpsmux: update last_ts to mux correctly - We use last_ts to decide what buffer to mux next so make sure that it - always contains the last known valid timestamp. - -2014-01-21 10:58:35 +0900 duhui.lee <duhui.lee@lge.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: Initialize pointer correctly that is never assigned but freed in error cases - Fixes crash on broken streams. - https://bugzilla.gnome.org/show_bug.cgi?id=722669 - -2014-01-21 09:44:00 +0100 Alexey Chernov <4ernov@gmail.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: First destroy the window, then unregister the class - It's impossible to create another pipeline with d3dvideosink after disposing - the previous one due to some problem in d3dvideosink. The message is: "Unable - to register Direct3D hidden window class". - I've evaluated the problem and it's that UnregisterClass() in working thread is - called before DestroyWindow() and UnregisterClass() does nothing. - https://bugzilla.gnome.org/show_bug.cgi?id=722622 - -2014-01-20 16:25:51 +0100 Wim Taymans <wtaymans@redhat.com> - - * gst/mpegpsmux/mpegpsmux.c: - mpegpsmux: fix timestamp handling - If the first buffer that we handle for a stream has no timestamp, we - would never consider this pad again for muxing which causes queues to - fill up and pipelines to stall. Instead, try to mux pads with -1 - timestamps as soon as possible. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=722330 - -2014-01-20 16:23:49 +0100 Wim Taymans <wtaymans@redhat.com> - - * gst/mpegpsmux/mpegpsmux.c: - mpegpsmux: return GST_FLOW_EOS when we pushed EOS - Return GST_FLOW_EOS from the collected function when we pushed EOS or - else it simply keeps on calling our collected function. - -2014-01-20 10:38:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/Makefile.am: - applemedia: Actually the enc/decbins are not used anywhere currently - Code is commented out. - -2014-01-20 10:34:57 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/plugin.m: - applemedia: Fix build on iOS and probably also on OSX - The video toolbox is not available on iOS, and also on OSX - we should probably build all source files that are used for - it. - https://bugzilla.gnome.org/show_bug.cgi?id=722590 - -2014-01-20 15:21:42 +0900 duhui.lee <duhui.lee@lge.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Update caps when receive VPS/SPS/PPS - https://bugzilla.gnome.org/show_bug.cgi?id=722240 - -2014-01-20 17:03:09 +0900 duhui.lee <duhui.lee@lge.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: Fix segfault when parsing HRD parameter - https://bugzilla.gnome.org/show_bug.cgi?id=722240 - -2014-01-18 13:56:28 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openexr/gstopenexrdec.cpp: - openexrdec: Don't start scanning for the header from the start again each time - This will be incredible slow if the upstream block size is very small. Instead - continue scanning for the header where we previously stopped. - For the standard filesrc block-size this made decoding a file about - 3 times faster. - https://bugzilla.gnome.org/show_bug.cgi?id=719890 - -2014-01-18 13:06:29 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/sndfile/gstsfdec.c: - sfdec: This is a decoder, not a demuxer - Don't confuse autopluggers! - https://bugzilla.gnome.org/show_bug.cgi?id=722316 - -2014-01-18 01:19:36 +0200 Andrey Utkin <andrey.krieger.utkin@gmail.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - tsdemux: Fix leak of PCROffsetGroup - https://bugzilla.gnome.org/show_bug.cgi?id=722462 - -2014-01-16 12:18:45 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Remove some useless assignments and skip the current part of the buffer if the pad is muted - -2014-01-16 20:16:47 +1100 Jan Schmidt <jan@centricular.com> - - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/gstmpegdemux.h: - * ext/resindvd/gstpesfilter.c: - resindvd: Merge changes across from master mpegdemux - Merge various changes and fixes from the master mpegdemux - Performance improvement from the way streams are organised, - return flow combining, language tag event generation, - adjustments and fixes in debug output, and things like that. - -2014-01-16 20:14:48 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegdemux: Merge some changes from the resindvd copy - One bug fix, some debug changes and other inconsequential changes - just to reduce the diff between the 2 copies a bit. - -2014-01-15 23:30:28 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Fix and simplify overlap calculation - -2014-01-14 23:55:53 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/resindvd/resindvdsrc.c: - resindvdsrc: fix minor memory leak when creating title info message - -2013-10-09 17:49:06 +0200 Jorge Zapata <jorgeluis.zapata@gmail.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Add the divx variant for mpeg4 video - Looks like all the mpeg4 video decoders also accept the divx - variants. So we better add those caps too - https://bugzilla.gnome.org/show_bug.cgi?id=711163 - -2014-01-14 17:08:36 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * configure.ac: - configure: fix (again) check for DB API: 5.4 is Not Recent Enough - Maybe testing the version is clearer, but testing for < 5 is not - enough, my version is 5.4 and does not yet have those new enums. - If you git blame to this and have a version > 5.4 that does not - either, please feel free to join along and bump the version. - -2014-01-14 23:21:25 +0900 duhui.lee <duhui.lee@lge.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - h265parser: Fix segfault when parsing VPS - https://bugzilla.gnome.org/show_bug.cgi?id=722081 - -2014-01-14 10:38:37 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opencv/gstfaceblur.c: - faceblur: set maximum feature size to 0x0 - Previously faces would only be detected if they were at least 30x30 pixels - large and at most 32x32 pixels. We keep the minimum setting (maybe needs - a property as in facedetect) but disable the maximum feature size. - See https://bugzilla.gnome.org/show_bug.cgi?id=722158 - -2014-01-14 01:06:02 -0500 Kipp Cannon <kcannon@cita.utoronto.ca> - - * ext/opencv/gstfacedetect.c: - facedetect: set maximum feature size to 0x0 - This disables the "max feature size" feature. The current configuration - is totally busted: The max feature size is hard-coded to 2 pixels more - than the user-supplied min feature size which pretty much means you need - to guess the size of the person's face to within a few pixels to get the - code to find it. - https://bugzilla.gnome.org/show_bug.cgi?id=722158 - -2014-01-14 02:19:12 +0200 Andrey Utkin <andrey.krieger.utkin@gmail.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - tsdemux: fix memleak of PCROffsetCurrent - https://bugzilla.gnome.org/show_bug.cgi?id=722145 - -2014-01-13 21:50:16 +0900 Justin Joy <justin.joy.9to5@gmail.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: prevent to overrun chroma_weight_l0_flag - The index of elements cannot exceed or equal to the size of elements. - https://bugzilla.gnome.org/show_bug.cgi?id=722101 - -2014-01-13 10:01:43 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/schroedinger/gstschroenc.c: - schroenc: set buffer offset to buffer timestamp - oggmux expects this to order incoming buffers - https://bugzilla.gnome.org/show_bug.cgi?id=722078 - -2014-01-10 08:58:27 +0100 Edward Hervey <bilboed@bilboed.com> - - * configure.ac: - dvb: Use DVB_API_VERSION to know if we have recent enough version - We end up with the same end-result but it's more comprehensible - -2014-01-09 16:38:13 +0100 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - configure: check for good enough dvb kernel headers - Recent changes are using new dvb api. Don't built the plugin, if we can't. - Fixes #721869 - -2014-01-09 08:18:07 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/aiff/aiffparse.c: - aiffparse: misc code cleanups - Fix the launch examples for 1.0. Turn more logging into _OBJECT variants. - -2014-01-09 09:13:48 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstmpdparser.c: - dashdemux: remove unnecessary variable - Instead of using 2 indexes that were actually the same, use only - one. Saves a variable. - -2014-01-09 09:11:23 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - dashdemux: fix seeking when the mpd uses a segment template - Remove the dashdemux seeking function to use the one implemented - in mpdparser as it is more complete. This also makes dashdemux not - crash when seeking on streams that use segment templates. - -2014-01-08 16:33:05 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpeg4videoparse.h: - mpeg4videoparse: do not lose DISCONT flag if buffer isn't pushed - mpeg4videoparse might not push buffers while parsing. If those buffers - contain the DISCONT flag, it gets lost and downstream won't get any - buffer with the flag. - Fix it by adding the DISCONT to the next pushed buffer. - This makes backwards playback work. - -2014-01-06 22:15:24 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/sndfile/gstsfdec.c: - sfdec: skip '\0' strings for metadata - libsndfile does not filter empty strings. We get a warning from gstreamer when - setting this as a tag. - -2014-01-06 15:15:27 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/sndfile/gstsfdec.c: - sfdec: break long method - Extract taglist creation into separate funtion. - -2014-01-06 15:01:22 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/mpegts/gst-atsc-section.h: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gst-dvb-section.h: - * gst-libs/gst/mpegts/gst-scte-section.h: - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * gst-libs/gst/mpegts/mpegts.h: - mpegts: make headers usable with c++ compiler - Add G_BEGIN_DECLS G_END_DECLS - https://bugzilla.gnome.org/show_bug.cgi?id=671136 - -2014-01-06 15:02:30 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/sndfile/gstsfdec.c: - sfdec: remove left over property-id enum - -2014-01-06 14:52:54 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Allows hvc1 version 0 and fix reading of NAL count in codec_data - -2014-01-06 14:48:26 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth265parse.c: - h265parse: Fix some more debug output - And don't access invalid memory - -2014-01-06 14:47:43 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/codecparsers/gsth265parser.c: - h265parser: Fix debug output - -2014-01-06 13:51:01 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/mpegts/gstmpegtssection.h: - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Add HEVC / h265 support - -2014-01-05 23:44:36 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/aiff/aiffparse.c: - aiffparse: typo fix in comment - -2014-01-05 23:43:25 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/sndfile/gstsfdec.c: - sfdec: the read functions already return frames_read - Fixes choppy output. - -2014-01-05 23:41:26 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/sndfile/gstsf.c: - sndfile: enable rf64 format - -2014-01-02 21:02:27 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/sndfile/gstsfdec.c: - sfdec: add date to taglist - -2014-01-03 11:18:06 -0500 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/gstshmsink.c: - shmsink: Document that socket-path may change - -2014-01-03 11:16:42 -0500 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/gstshmsink.c: - shmsink: Change default shm size to 64 MiB - The original size of 256k was too small for anything where - one would want to use shm. If the buffer's size needs to be limit, it is - better to use buffer-time in most cases anyway. - -2013-10-10 18:25:46 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - dvbsrc: Add dvb-s2, dvb-t2 support - https://bugzilla.gnome.org/show_bug.cgi?id=709414 - -2013-10-10 18:23:20 +0200 Stefan Ringel <linuxtv@stefanringel.de> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - dvbsrc: Change from deprecated frontend type field to DTV_ENUM_DELSYS - -add delsys property - -add delivery system capability to the gstreamer adapter structure - -ready for add new delivery systems - Application must ask the adapter structure to know which delivery systems are avaible. - The property delsys must be set. - https://bugzilla.gnome.org/show_bug.cgi?id=709414 - -2014-01-03 09:59:34 +0100 Miguel París Díaz <mparisdiaz@gmail.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Fix GstCaps memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=721382 - -2013-12-31 22:38:03 +0100 Piotr Drąg <piotrdrag@gmail.com> - - * po/POTFILES.in: - po: update POTFILES - https://bugzilla.gnome.org/show_bug.cgi?id=721293 - -2013-12-31 23:18:54 +1100 Jan Schmidt <jan@centricular.com> - - * sys/androidmedia/gstamc-constants.h: - * sys/androidmedia/gstamc.c: - androidmedia: Add new color format, and enhance debug output - Add a new color format seen on my Galaxy S3 - (OMX_SEC_COLOR_FormatNV12Tiled = 0x7fc00002) to the table, - but don't actually implement it - the decoder doesn't choose it. - Remove an assert that makes the plugin fail noisily and take the app down - if it sees a color format it doesn't recognise (just skip the codec instead) - Modify the debug output when plugin scanning to print color format info to - make this sort of thing easier in the future. - -2013-12-19 23:00:12 +1100 Jan Schmidt <jan@centricular.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: Don't disrupt buffer state in the clip function - Collectpads assumes that it can pass any buffer to the clip function - for adjustment, some of which are artificially injected - so don't - adjust global timestamp tracking there. Instead, only adjust the - buffer timestamps and use them directly in the collection function. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=698748 - -2013-12-30 15:49:57 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/sndfile/gstsfdec.c: - sndfile: emit midi-base-note tag - Query instrument data. Use both 'loop_info' and 'instrument' to inform about the - basenote. - -2013-12-30 13:28:52 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: Remove unneeded call - 'parse' is already provided by the parent variable - -2013-12-29 13:31:53 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - opencv: The plugin works with 2.4.7 too - Reported by kwm on IRC. - -2013-12-28 12:39:25 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusparse.c: - opusparse: Don't send caps in GstBaseParse::start() - This is too early and will confuse the event order. The other - code that sets the caps is at the right position and does it - properly already. - -2013-12-24 23:15:28 +0000 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * sys/mfc/mfc_decoder/mfc_decoder.c: - mfc: fix input dequeue for odroid - https://bugzilla.gnome.org/show_bug.cgi?id=721027 - -2013-12-27 14:29:46 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: increase max payload size to 4000 bytes - 1275 is the maximum size of a frame, but the encoder may return - up to 3 frames, and we need a few extra bytes for TOC, etc. We - use 4000, which is a bit more, and suggested in the libopus docs. - -2013-12-27 10:25:30 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst-libs/gst/mpegts/gst-dvb-section.h: - mpegts: fix g-i annotations and gtk-doc markup - -2013-12-20 10:05:22 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: remove stream loop thread - Download and push from the same task, makes code a lot simpler - to maintain. Also pushing from separate threads avoids deadlocking - when gst_pad_push blocks due to downstream queues being full. - -2013-12-20 19:42:52 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: fix deadlock near EOS - A deadlock can happen when the source sends EOS when - being put to NULL as the object lock is being held by the - thread that sets the element to NULL and is needed by - the event handler. - -2013-12-20 19:39:16 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstmpdparser.c: - dash: detect EOS when segments are generated by template - Use the Period duration do know when to end the stream - -2013-12-13 17:26:10 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: do not try to access buffer after losing the ref - For obvious reasons - -2013-12-13 17:25:37 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: use a separate GstUriDownloader per stream - Avoids one download having to wait for another to finish - before starting - -2013-12-09 13:55:20 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: store GstActiveStream to avoid getting it every time - GstActiveStream is used everywhere to operate on the MPD client, - better store it in the GstDashDemuxStream to avoid getting it - everytime - -2013-12-09 13:33:53 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: simplify locking for streams - Use a single lock for all streams instead of having separate locks. - This makes maintenance easier and at most points we would need - a single lock before iterating on all streams data. So not much - is gained from individual locks. - -2013-12-09 11:28:25 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: fix multiple period mpd playback - Make dash playlists with multiple periods work again by waiting - to switch the periods when all streams have reached the end of - the current period. The stream_loop is responsible for advancing - the period, but the download loops will already start downloading - data for the next period as soon as possible. - -2013-12-05 02:53:18 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: add combine flows function - Use a flow combination function to decide the result from the - stream_loop - -2013-12-04 11:30:22 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: handle multiple languages - Handle multiple languages by using the not-linked return to stop - the download task for that stream. It can be reactivated when - a reconfigure event is received. Stopping the unused streams is - relevant to save network bandwidth - -2013-12-03 16:16:09 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Use 1 download task per stream - Instead of having a single download task for all streams, this - commit makes each stream have its own download loop, allowing - parallel download of fragments. - -2013-12-03 00:12:08 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: refactor fragment fetching into smaller functions - Makes it easier to maintain and extend. This is a first step into - adding multi language support to dashdemux - -2013-12-02 17:41:01 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - dashdemux: run gst-indent - Lots of indentation issues making it very annoying to commit - because of the indent hook. Fix this for once. - -2013-12-02 17:31:41 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: expose all streams - always expose all streams instead of only exposing one of each type. - This is more aligned with gstreamer's way of working. Allows the user - to select the stream that it wants to use by linking its pad and leaving - the unused ones as unlinked. - -2013-12-24 11:51:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/eglgles/gstegladaptation_eagl.m: - eglglessink: Properly clean up renderbuffers and EAGL context - -2013-12-23 15:33:42 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/adpcmenc/adpcmenc.c: - adpcmenc: Properly set output format - Otherwise this will just error out if we only set caps on the srcpad. - -2013-12-22 22:33:51 +0000 Tim-Philipp Müller <tim@centricular.com> - - * autogen.sh: - * common: - Automatic update of common submodule - From dbedaa0 to d48bed3 - -2013-12-22 21:56:03 +0000 Tim-Philipp Müller <tim@centricular.com> - - * po/Makevars: - po: set gettext domain in Makevars so we don't have to patch the generated Makefile.in.in - https://bugzilla.gnome.org/show_bug.cgi?id=705455 - -2013-12-22 17:46:40 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/corevideobuffer.c: - applemedia: vtdec: set the correct stride in the video meta - -2013-12-22 17:44:01 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/atdec.c: - applemedia: atdec: fix aac decoding on Mavericks - -2013-12-20 18:12:53 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/modplug/gstmodplug.cc: - modplug: small seeking code reshuffle - Put the code that checks stop values together. Don't clamp a cur value of -1 to 0 (should not happen right now). - -2013-12-20 18:10:14 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/sndfile/gstsfdec.c: - sfdec: make _stop() non fatal when we have an error already - Having no open file in _stop() is okay. Just reset state. - -2013-12-20 18:08:33 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/sndfile/gstsfdec.c: - * ext/sndfile/gstsfdec.h: - sfdec: add event function and seeking support - -2013-12-18 08:12:07 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/sndfile/gstsfdec.c: - sfdec: add taglist support - Map the metadata strings and a bunch of info-fields to GStreamer tags. - -2013-12-17 22:25:03 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/sndfile/gstsfdec.c: - * ext/sndfile/gstsfdec.h: - sfdec: add query implementation for position and duration - -2013-12-17 17:56:32 +0100 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - * ext/sndfile/Makefile.am: - * ext/sndfile/gstsf.c: - * ext/sndfile/gstsf.h: - * ext/sndfile/gstsfdec.c: - * ext/sndfile/gstsfdec.h: - sndfile: rewrite sndfile for 1.0 - Add a sfdec for a start. Instead of a source plugin, this is a demuxer/decoder combination. This makes it work with auto-plugging. - -2013-12-20 00:39:34 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: updating docs explaining how it works - mssdemux changed a lot and the docs were not correct anymore. - Also adds the 'Adaptive' category to its details - -2013-12-19 14:30:13 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: do not push event holding object lock - Can lead to deadlocks as the push might block downstream in - serialized event cases. - -2013-12-19 14:29:42 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: lock around 'cancelled' flag - Prevents race conditions when pipeline is seeking near eos - -2013-12-19 21:59:09 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Also resync timestamps on the RESYNC flag - -2013-12-19 21:36:50 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/eglgles/gstegladaptation_eagl.m: - eglglessink: Don't set the EAGLContext of the main thread and don't reuse it either - ... instead create a new context for every sink instance. - https://bugzilla.gnome.org/show_bug.cgi?id=720421 - -2013-12-19 08:57:41 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/corevideobuffer.c: - applemedia: corevideobuffer: fix for planar formats - -2013-12-19 07:54:07 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: remove silly stride requirement - This is legacy from the 0.10 times, and it isn't clear how it was useful back - then also.' - -2013-12-19 11:11:28 +1100 Jan Schmidt <thaytan@noraisin.net> - - * ext/directfb/dfb-example.c: - directfb: Add hack to fix compile with broken DirectFB define - Compilation breaks because some versions of DirectFB redefine - __no_instrument_function__, which is used in the G_GNUC_NO_INSTRUMENT - macro. - -2013-12-17 17:55:58 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: fix segfault when trying to access codec_data - Check if codec_data was obtained before trying to use it to - prevent a segfault - -2013-12-17 17:54:31 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: also generate caps from audiotag attribute - Some audio will have its audio format defined by the AudioTag - instead of the Fourcc. Fallback to using AudioTag if Fourcc - isn't available - -2013-12-17 16:31:52 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: make sure streams stop properly on cancelled - specially when the gst_task_join is waiting for the task - to go stop and the task itself sets its back to paused, causing - a deadlock on exit. - -2013-12-17 13:16:58 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: track segments per stream - As streams now flow independently, the GstSegment needs to be put - on each stream so they can track the position of each one correctly - instead of being mixed in a single segment - -2013-11-14 15:23:42 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: push language code tag - https://bugzilla.gnome.org/show_bug.cgi?id=712358 - -2013-11-14 15:14:18 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssmanifest: store the language of the stream - https://bugzilla.gnome.org/show_bug.cgi?id=712358 - -2013-12-16 16:14:24 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: remove the stream loop task - Download and push from the same task, makes code a lot simpler - to maintain. Also pushing from separate threads avoids deadlocking - when gst_pad_push blocks due to downstream queues being full - -2013-12-13 17:31:11 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: Improve logging - Show the stream's pad on log messages to make easier to debug - issues in the multiple threads - -2013-12-10 18:08:40 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: improve flow return handling - Handle different flow returns both from the streaming and the - downloading loops - -2013-12-10 15:41:00 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: remove stream locks - Simplify the locking by using a single lock instead of having one - lock per stream. This still works and is simpler to maintain. - -2013-11-12 09:58:31 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: avoid downloading not-linked streams - When a stream gets a not-linked return, it will be marked as so and - won't download any more new fragments until a reconfigure event - is received. This will make mssdemux expose all pads, but only download - fragments for the streams that are actually being used. - Relying on the pads being linked/unlinked isn't enough in this scenario - as there might be an input-selector downstream that is actually discarding - buffers for a given linked pad. - When streams are switching, the old active stream can be blocked because - input-selector will block not-linked streams. In case the mssdemux's - stream loop is blocked pushing a buffer to a full queue downstream it will - never unblock as the queue will not drain (input-selector is blocking). - In this scenario, stream switching will deadlock as input-selector is - waiting for the newly active stream data and the stream_loop that would - push this data is blocked waiting for input-selector. - To solve this issue, whenever an stream is reactivated on a reconfigure - it will enter into the 'catch up mode', in this mode it can push buffers - from its download thread until it reaches the currrent GstSegment's position. - This works because this timestamp will always be behind or equal to the maximum - timestamp pushed for all streams, after pushing data for this timestamp, - the stream will go back to default and be pushed sequentially from the main - streaming thread. By this time, the input-selector should have already - released the thread. - https://bugzilla.gnome.org/show_bug.cgi?id=711849 - -2013-12-18 16:26:17 -0500 Luis de Bethencourt <luis@debethencourt.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - mpegvideoparse: Fix documentation of GstMpegVideoSequenceScalableMode - -2013-12-18 13:48:54 +0100 Sebastian Dröge <sebastian@centricular.com> - - * pkgconfig/gstreamer-plugins-bad.pc.in: - pkgconfig: Don't include libraries in the generic gst-plugins-bad pc file - -2013-12-18 13:45:22 +0100 Mariusz Buras <mariusz.buras@youview.com> - - * gst-libs/gst/mpegts/Makefile.am: - * pkgconfig/gstreamer-plugins-bad.pc.in: - mpegts: Install generated headers - https://bugzilla.gnome.org/show_bug.cgi?id=720673 - -2013-12-17 10:01:42 +0100 Davide Bertola <dade@dadeb.it> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: Enable hardware accelerated decoding on 10.9 - -2013-12-17 12:17:51 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlsmtpsink.c: - curl: Fix indention - -2013-12-17 12:06:13 +0100 Haridass Selvaraj <haridasj@axis.com> - - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlftpsink.h: - * tests/check/elements/curlftpsink.c: - curlftpsink: Optionally create a temporary file during FTP transfer/upload - https://bugzilla.gnome.org/show_bug.cgi?id=711620 - -2013-12-17 10:23:15 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinksink.cpp: - decklinksink: Give preference to the order of the filter caps when querying caps - -2013-12-17 10:21:26 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinksink.cpp: - decklinksink: Only intersect with the filter caps if there actually is a filter - -2013-12-15 21:05:31 -0800 Todd Agulnick <todd@agulnick.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: Some compiler warning fixes to satisfy XCode compiler - https://bugzilla.gnome.org/show_bug.cgi?id=720513 - -2013-12-16 16:07:44 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/id3tag/id3tag.c: - id3tag: Read image-description from the info structure, not the caps - -2013-12-16 11:14:29 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * configure.ac: - configure.ac: Fix typo in bz2 check - https://bugzilla.gnome.org/show_bug.cgi?id=720532 - -2013-12-16 11:51:00 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/id3tag/id3tag.c: - id3tag: Write image-type into the APIC tag - -2013-12-16 10:25:22 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gstvc1parse.c: - * gst/videoparsers/gstvc1parse.h: - vc1parse: Post VIDEO_CODEC tag - -2013-12-16 10:24:28 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gstpngparse.c: - * gst/videoparsers/gstpngparse.h: - pngparse: Post VIDEO_CODEC tag - -2013-12-16 10:22:24 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Use pbutils API to create the VIDEO_CODEC tag string - -2013-12-16 10:21:00 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpeg4videoparse.h: - mpeg4videoparse: Post VIDEO_CODEC tag - -2013-12-16 10:19:36 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - h265parse: Post VIDEO_CODEC tag - -2013-12-16 10:18:23 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: Post VIDEO_CODEC tag - -2013-12-16 10:16:14 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth263parse.h: - h263parse: Post VIDEO_CODEC tag - -2013-12-16 10:13:36 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gstdiracparse.h: - diracparse: Post VIDEO_CODEC tag - -2013-12-14 18:12:53 -0500 Todd Agulnick <todd@agulnick.com> - - * sys/decklink/gstdecklinksrc.cpp: - decklinksrc: Process EOS even when there are no incoming video frames. - https://bugzilla.gnome.org/show_bug.cgi?id=680700 - -2013-12-14 15:55:42 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: handle level 3 in get_dpb_max_mb_s_from_level. oops. - -2013-12-14 15:55:22 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/atdec.c: - applemedia: atdec: fix mp3 caps - -2013-12-14 18:42:11 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/decklink/gstdecklinksrc.cpp: - decklinksrc: Set GST_ELEMENT_FLAG_SOURCE on the source - As it does not inherit from basesrc, this flag is not automatically set - and e.g. gst_bin_iterate_sources() and other code does not consider this - element a source. - https://bugzilla.gnome.org/show_bug.cgi?id=680700 - -2013-12-14 13:32:26 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * configure.ac: - configure.ac: add missing AM_CONDITIONAL for OPENEXR and SBC - Makes my automake (1.14) happier. - -2013-12-14 13:30:01 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/plugin.m: - applemedia: always include <Foundation/Foundation.h> - Fixes compilation with newest xcode. - -2013-12-12 17:49:24 +0100 Matej Knopp <matej.knopp@gmail.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: not all startcodes should have 3-byte 0 prefix - The parser assumes that every time there is a 0 before the startcode, - it is part of the startcode. But that's not true. - From the specification - Byte stream NAL unit syntax - zero_byte is a single byte equal to 0x00. - When any of the following conditions are fulfilled, the zero_byte syntax - element shall be present. - – the nal_unit_type within the nal_unit( ) is equal to 7 (sequence parameter - set) or 8 (picture parameter set) - – the byte stream NAL unit syntax structure contains the first NAL unit of an - access unit in decoding order, as specified by subclause 7.4.1.2.3. - The problem with doing this for all startcodes is that a trailing zero can mess - up timestamps. The trailing zero gets prepended to the startcode, which will - carry the PTS and DTS of previous buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=664443 - -2013-12-10 11:27:52 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/asfmux/gstasfobjects.c: - * gst/asfmux/gstasfobjects.h: - * gst/asfmux/gstasfparse.c: - asfparse: add timestamps to packets - re-enable the code that adds timestamps to packets after baseparse's - port - -2013-12-10 10:34:02 -0300 Thiago Santos <ts.santos@sisa.samsung.com> - - * gst/asfmux/gstasfobjects.c: - * gst/asfmux/gstasfobjects.h: - * gst/asfmux/gstasfparse.c: - * gst/asfmux/gstasfparse.h: - asfparse: port to baseparse - asfparse was not really functional after the port to 1.0 - Now porting it to baseparse to get it working again - -2013-12-13 11:49:52 +0100 Benjamin Gaignard <benjamin.gaignard@linaro.org> - - * gst/dvbsuboverlay/dvb-sub.c: - dvbsuboverlay: fix reading of display window in display definition segment - From ETSI EN 300 743 V1.3.1 (2006-11) 7.2.1 Display definition segment specifictations - the parameters of display window are in this order: Xmin, Xmax, Ymin, Ymax. - Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org> - Signed-off-by: Pierre-Yves Mordret <pierre-yves.mordret@st.com> - https://bugzilla.gnome.org/show_bug.cgi?id=720382 - -2013-12-13 14:16:49 -0800 Aleix Conchillo Flaqué <aleix@oblong.com> - - srtp: add 256-bit key support - * ext/srtp/gstsrtp.ch: added GST_SRTP_CIPHER_AES_256_ICM to - GstSrtpCipherType and new function cipher_key_size. - * ext/srtp/gstsrtpenc.c: maximum key size is now 46 characters (14 for - the salt plus the key). If different ciphers are chosen for RTP and - RTCP the maximum needed key size is expected. - * ext/srtp/gstsrtpdec.c: minor documentation updates. - https://bugzilla.gnome.org/show_bug.cgi?id=720434 - -2013-12-12 13:21:15 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/gsm/gstgsmdec.c: - gsmdec: process all available input frames in one go - Instead of parsing, decoding and sending out - lots os little 20ms audio buffers one by one. - -2013-12-11 18:52:53 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: fix compiler warning (uninitialized variable) - -2013-12-11 08:11:50 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - applemedia: vtdec: rename reorder_queue_frame_delay to reorder_queue_length - -2013-12-11 08:10:19 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: report latency - -2013-12-11 07:58:23 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: set reorder queue length to the max DPB length - Set reorder_queue_frame_delay from the DPB size (in frames). Still not optimal, - as the DPB size is larger than the max bframe forward prediction length, but I - don't know how to compute the latter without parsing every group of pictures. - -2013-12-10 23:06:53 +1100 Jan Schmidt <jan@centricular.com> - - * ext/soundtouch/gstbpmdetect.cc: - soundtouch: Call default event handler for basetransform - Make pipeline end properly at EOS and not leak by passing events - to the default event handler. - -2013-12-06 00:45:50 +1100 Jan Schmidt <jan@centricular.com> - - * ext/resindvd/resindvdbin.c: - resindvd: Remove racy glib warning. - Sometimes, the pad probes can be called twice - for OOB events - travelling downstream. Clear out the pad block id, so it only - gets removed once. - -2013-12-06 00:22:20 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/gsm/gstgsmdec.c: - gsmdec: fix decoding of audio/ms-gsm variant - Alternates between 33 and 32 byte frames, but must start - with a 33 byte frame. This has been broken for ages since - the element was ported to the audio decoder base class. - https://bugzilla.gnome.org/show_bug.cgi?id=709416 - -2013-12-10 11:10:54 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/vtdec.c: - applemedia: vtdec: set the correct video format in the video meta - Fixes all kinds of weird bugs when videoconvert is used with the decoder. - -2013-04-17 10:44:48 +0800 Cong Zhong <congx.zhong@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix picture level scaling lists derivation (rule B). - Fix picture level scaling lists derivation from fall-back rule set B, - as specified in 7.4.2.2. More precisely, the sequence level scaling - lists need to be used but intra and inter lists arguments were swapped. - This fixes FRExt/freh5.264 from conformance testing. - https://bugzilla.gnome.org/show_bug.cgi?id=720099 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-12-08 16:46:58 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/corevideobuffer.c: - applemedia: corevideobuffer: set the correct stride for packed formats - -2013-12-08 15:31:09 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: fix mpeg2 video support - -2013-12-08 15:25:27 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: make jpeg decoding actually work - -2013-12-08 15:24:58 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: vtdec: fail gracefully when not negotiated - -2013-12-07 23:55:13 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/plugin.m: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - applemedia: rewrite VideoToolbox decoder based on GstVideoDecoder - -2013-12-06 21:11:32 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/vmnc/Makefile.am: - * gst/vmnc/vmncdec.c: - * gst/vmnc/vmncdec.h: - vmcndec: Add missing header file - Forgot to add header file to previou commit - -2013-12-06 20:58:48 -0500 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * gst/vmnc/Makefile.am: - * gst/vmnc/vmncdec.c: - vmncdec: Port to GStreamer 1.0 API - -2013-12-06 17:58:13 -0500 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * gst/stereo/gststereo.c: - stereo: Port to GStreamer 1.0 API - -2013-12-06 17:10:39 -0500 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * gst/jp2kdecimator/gstjp2kdecimator.c: - * gst/jp2kdecimator/gstjp2kdecimator.h: - * gst/jp2kdecimator/jp2kcodestream.c: - jp2kdecimator: Port to GStreamer 1.0 API - -2013-12-05 16:50:27 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/asfmux/gstrtpasfpay.c: - rtpasfpay: Use GstRTPBasePayload method to push buffer - This way the event is also pushed. - https://bugzilla.gnome.org/show_bug.cgi?id=719553 - -2013-12-05 12:05:30 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/sbc/gstsbcdec.c: - sbcdec: Require caps to be set before any data processing - -2013-12-05 12:05:21 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/adpcmdec/adpcmdec.c: - adpcmdec: Require caps to be set before any data processing - -2013-12-05 12:05:09 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/siren/gstsirendec.c: - sirendec: Require caps to be set before any data processing - -2013-12-05 12:04:59 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/opus/gstopusdec.c: - opusdec: Require caps to be set before any data processing - -2013-12-05 12:04:39 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123audiodec: Require caps to be set before any data processing - -2013-12-05 12:04:23 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/gsm/gstgsmdec.c: - gsmdec: Require caps to be set before any data processing - -2013-12-05 11:49:41 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Use new gst_video_decoder_set_needs_format() API - -2013-12-05 11:49:31 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/mfc/gstmfcdec.c: - mfcdec: Use new gst_video_decoder_set_needs_format() API - -2013-12-05 11:49:14 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: Use new gst_video_decoder_set_needs_format() API - -2013-12-05 11:45:36 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/daala/gstdaaladec.c: - daaladec: Use new gst_video_decoder_set_needs_format() API - -2013-12-04 17:31:27 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - mpegvideoparser: Also initialize debug category in parse_sequence_header - Also remove the useless initialized flag, this is already done by the macro - https://bugzilla.gnome.org/show_bug.cgi?id=719657 - -2013-12-04 22:38:20 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openexr/gstopenexrdec.cpp: - openexrdec: Instead of trying to parse the bitstream, just look for the next header - This should be more robust and allows us to handle new versions of the - file format if the library supports it. - -2013-12-04 09:13:31 +0100 Wim Taymans <wtaymans@redhat.com> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstvc1parse.c: - videoparsers: use ACCEPT_INTERSECT - We can also accept caps with missing fields. - -2013-12-04 09:03:45 +0100 Wim Taymans <wtaymans@redhat.com> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstvc1parse.c: - videoparsers: remove fields from filter - Don't filter out the caps properties we can convert between when - proxying the getcaps query to the downstream peer pad. - -2013-12-04 09:00:43 +0100 Wim Taymans <wtaymans@redhat.com> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstvc1parse.c: - videoparsers: refactor remove_fields in getcaps - -2013-12-03 14:53:24 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Check color format - -2013-12-03 14:47:32 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Add support for the video meta - -2013-12-03 14:46:25 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openni2/gstopenni2src.cpp: - * ext/openni2/gstopenni2src.h: - openni2src: Use GstVideoFrame API for better handling of strides - And do proper stride conversion. - -2013-12-03 14:35:57 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Fix buffer handling to actually work and properly timestamp buffers - -2013-12-03 14:35:42 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Don't shut down library when finalizing an element instance - -2013-12-03 14:35:21 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Fix negotiation and creation of a video buffer pool - -2013-12-03 14:34:56 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Use debug category properly - -2013-12-02 17:03:46 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Classification of the element should be Source/Video - -2013-12-02 17:01:36 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Use GstVideoInfo to create caps and don't leak them - -2013-12-02 16:59:14 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openni2/gstopenni2src.cpp: - openni2src: Some random cleanup and minor fixes - -2013-12-02 11:17:02 +0100 Miguel Casas-Sanchez <miguelecasassanchez@gmail.com> - - * configure.ac: - * docs/plugins/Makefile.am: - * ext/Makefile.am: - * ext/openni2/Makefile.am: - * ext/openni2/gstopenni2.cpp: - * ext/openni2/gstopenni2src.cpp: - * ext/openni2/gstopenni2src.h: - openni: Add OpenNNI2 plugin - https://bugzilla.gnome.org/show_bug.cgi?id=708914 - -2013-12-02 10:28:28 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/geometrictransform/gstbulge.c: - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstdiffuse.c: - * gst/geometrictransform/gstfisheye.c: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstmarble.c: - * gst/geometrictransform/gstmirror.c: - * gst/geometrictransform/gstperspective.c: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstrotate.c: - * gst/geometrictransform/gstsphere.c: - * gst/geometrictransform/gstsquare.c: - * gst/geometrictransform/gststretch.c: - * gst/geometrictransform/gsttunnel.c: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gstwaterripple.c: - geometrictransform: G_DEFINE_TYPE() already calls g_type_class_peek_parent() for us - -2013-12-02 10:25:57 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/geometrictransform/gstbulge.c: - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstcirclegeometrictransform.c: - * gst/geometrictransform/gstdiffuse.c: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstmarble.c: - * gst/geometrictransform/gstperspective.c: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstrotate.c: - * gst/geometrictransform/gstsphere.c: - * gst/geometrictransform/gstsquare.c: - * gst/geometrictransform/gststretch.c: - * gst/geometrictransform/gsttunnel.c: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gstwaterripple.c: - geometrictransform: Remove empty GObject::finalize() implementations - Also don't use GST_DEBUG_FUNCPTR for GObject vfuncs - -2013-10-20 22:04:38 +0200 Antonio Ospite <ospite@studenti.unina.it> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gstperspective.c: - * gst/geometrictransform/gstperspective.h: - * gst/geometrictransform/plugin.c: - geometrictransform: Add a 2D perspective transform plugin - The perspective plugin applies a 2D perspective (also called projective) - transform to the frame buffer. - A perspective transform can be used for instance to perform keystone - correction when playing the content with a video projector. - https://bugzilla.gnome.org/show_bug.cgi?id=710810 - -2013-12-01 23:31:25 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ext/mpeg2enc/gstmpeg2enc.cc: - mpeg2enc: avoid list for one single value in template caps - -2013-12-01 22:32:09 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/asfmux/gstasfmux.c: - asfmux: microoptimisation: avoid unnecessary gst_buffer_get_size() calls - -2013-11-29 13:23:40 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/asfmux/gstrtpasfpay.c: - rtpasfpay: init rtp buffer fixing rtp packet creation - https://bugzilla.gnome.org/show_bug.cgi?id=719553 - -2013-11-29 13:22:56 +0000 Tim-Philipp Müller <tim@centricular.com> - - * gst/asfmux/gstasfmux.c: - asfmux: don't use buffer after giving away ownership - https://bugzilla.gnome.org/show_bug.cgi?id=719553 - -2013-11-29 10:14:43 +0100 Christian Fredrik Kalager Schaller <uraeus@linuxrising.org> - - * gst-plugins-bad.spec.in: - Update spec file with latest changes - -2013-11-25 16:57:00 +0000 Lubosz Sarnecki <lubosz@gmail.com> - - * gst/videoparsers/gstpngparse.c: - pngparse: Don't try to set framerate if not from upstream - https://bugzilla.gnome.org/show_bug.cgi?id=715166 - -2013-11-28 15:10:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Fix splitting of multiple NALU per buffer - Conversion to byte-stream/nal crashes without that because the - baseparse frame of all NALUs is finished for the first NALU, then - used again for parsing the second NALU. Just that now the buffer - of the frame is already gone. Instead we create temporary frames - for every NALU. - -2013-10-31 17:16:14 +0100 Antonio Ospite <ospite@studenti.unina.it> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: fix setting codec_data when using WaveFormatEx - When using WaveFormatEx the actual codec private data is at the end of - the wav header structure, after the cbSize field, see for example the - notes at http://wiki.multimedia.cx/index.php?title=WAVEFORMATEX - The previous code was erroneously passing the whole WAVEFORMATEX - structure as codec_data. - The smoothstreaming specifications1,2,3 always mention WAVEFORMATEX - and never smaller structures like WAVEFORMAT or PCMWAVEFORMAT, so the - buffer can assumed to be at least 18 bytes and always consuming the wav - header gives the (possibly empty) codec private data. - 1 http://web.archive.org/web/20120907004742/http://www.iis.net/community/files/media/smoothspecs/%5BMS-SMTH%5D.pdf - 2 http://download.microsoft.com/download/B/0/B/B0B199DB-41E6-400F-90CD-C350D0C14A53/%5BMS-SSTR%5D.pdf - 3 http://download.microsoft.com/download/9/5/E/95EF66AF-9026-4BB0-A41D-A4F81802D92C/%5BMS-SSTR%5D.pdf - https://bugzilla.gnome.org/show_bug.cgi?id=699924 - -2013-10-31 15:58:27 +0100 Antonio Ospite <ospite@studenti.unina.it> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: use mssdemux_debug debug category for gstmssmanifest.c too - -2013-10-16 16:22:36 +0200 Antonio Ospite <ospite@studenti.unina.it> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: fix coding style - -2013-11-25 15:17:33 +1100 Jan Schmidt <jan@centricular.com> - - * gst/dvdspu/gstspu-vobsub.c: - dvdspu: Don't unmap an unreffed buffer - gst_dvd_spu_finish_spu_buf drops the reference to the current - buffer, so make sure to call gst_buffer_unmap before it. - -2013-11-23 19:11:42 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openexr/gstopenexrdec.cpp: - openexrdec: Consider the pixel aspect ratio stored in the file - -2013-11-23 18:37:00 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openexr/Makefile.am: - * ext/openexr/gstopenexr.c: - * ext/openexr/gstopenexrdec.cpp: - * ext/openexr/gstopenexrdec.h: - openexr: Add OpenEXR decoder element - This currently converts from ARGB64_F16 (16 bit float per component) - to ARGB64 by clipping. We should add support for the F16 format and - implement a conversion filter element that can apply gamma curves, - change exposure, etc. - -2013-11-23 11:29:08 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * ext/Makefile.am: - * ext/openexr/Makefile.am: - * ext/openexr/gstopenexr.c: - * ext/openexr/gstopenexr.h: - * ext/openexr/gstopenexrdec.cpp: - * ext/openexr/gstopenexrdec.h: - openexr: Add OpenEXR plugin - See http://www.openexr.com - -2013-11-23 11:35:35 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegenc.c: - openjpeg: Fix names of debug categories - -2013-11-23 14:35:06 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst/dvdspu/gstspu-vobsub.c: - dvdspu: pop new packet when invalid next command block - ... to prevent staying stuck on current command block and busy looping. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=712219 - -2013-11-23 11:23:35 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparse: accept VideoObjectLayer as start of frame and config - ... which it deserves as much as VideoObject. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=667564 - -2013-11-21 15:54:32 +0000 Tim-Philipp Müller <tim@centricular.com> - - * sys/qtwrapper/audiodecoders.c: - * sys/qtwrapper/imagedescription.c: - * sys/qtwrapper/videodecoders.c: - qtwrapper: g_memmove() is deprecated - Just use plain memmove(), g_memmove() is deprecated in - recent GLib versions. - https://bugzilla.gnome.org/show_bug.cgi?id=712811 - -2013-11-20 12:46:23 +1100 Jan Schmidt <jan@centricular.com> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: Handle vobsub packets smaller than 4 bytes - In particular, handle the case of an empty packet with size 0 bytes. - Partially fixes: #712643 - -2013-11-19 20:18:48 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpenc.c: - srtpenc: Set the first session flag to false once one is create - Otherwise it always thinks it's the first session. - https://bugzilla.gnome.org/show_bug.cgi?id=711495 - -2013-11-19 20:12:54 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpdec.h: - srtpdec: Make sure that stream-id/caps/segment are sent before buffers - It may be possible that only one of the two sink pads is linked in that case, - the events need to be created from the other pad. - -2013-11-19 19:10:06 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Pass is_rtcp to setcaps function - -2013-04-04 17:59:01 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - srtp: Implement SRTCP demultiplexing - Separate multiplexed RTP and RTCP if they arrive - on the rtp_sink pad. - -2013-11-19 00:38:33 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/daala/gstdaaladec.c: - * ext/daala/gstdaalaenc.c: - daala: Fix compilation - -2013-11-13 22:25:59 -0300 Thiago Santos <ts.santos@partner.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: do not try to deinit the downloadrate while it is used - This can cause an assertion or deadlocks. - -2013-11-11 16:35:35 -0300 Thiago Santos <ts.santos@partner.samsung.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: also consider /manifest - The spec says /Manifest, but /manifest is easily found on some - services, so handle that, too. - https://bugzilla.gnome.org/show_bug.cgi?id=710223 - -2013-11-14 09:02:35 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Fix compilation when debug is disabled - -2013-11-13 18:59:48 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@sisa.samsung.com> - - * gst-libs/gst/codecparsers/Makefile.am: - codecparsers: Add -lm needed by H.265 parser - -2013-11-13 17:16:04 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/gstpngparse.c: - pngparse: Proxy upstream framerate on srcpad if avalaible - If the user sets it himself with capsfilter, the information should be - kept and transmitted downstream. - -2013-11-12 18:36:04 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsmux/Makefile.am: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - mpegtsmux: Properly add subtitle descriptor for DVb subpicture subtitles - We were adding an empty descriptor for them and it was not possible to - actually use them on muxed streams. - -2013-11-13 14:28:30 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: fix non-egl display context query - -2013-11-11 16:15:00 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: look beyond start code before leaping - In case more data than a start code alone is needed to decide whether - it ends a frame, arrange for more input data and decide when available. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=711627 - -2013-11-11 13:24:08 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: declare missing instance variables - Fixes build on 32-bit system. - https://bugzilla.gnome.org/show_bug.cgi?id=711844 - -2013-11-10 12:17:18 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: tweak extension handling - -2013-11-10 12:15:33 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst/mpegdemux/gstmpegdemux.c: - mpgegdemux: do not use pushed buffer in debug message - -2013-11-09 13:32:21 +0100 Matej Knopp <matej.knopp@gmail.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: check for same TSN only for interlaced streams (fixes unit test) - https://bugzilla.gnome.org/show_bug.cgi?id=711721 - -2013-11-09 12:18:02 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/Makefile.am: - audiomixer: Add test for the ORC code - -2013-11-09 09:43:56 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/videoparsers/gstmpegvideoparse.c: - Revert "mpegvparse: Fix last start code position when input buffer is empty" - This reverts commit 7c23a6f23c185330d74ae4ccce79c3641a2fabac. - The fix was not complete, see discussion in - https://bugzilla.gnome.org/show_bug.cgi?id=711627 - -2013-11-08 20:23:27 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/mpegts/gst-dvb-section.h: - mpegts: Add some more element-type annotations for g-i - -2013-11-07 21:37:29 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/coremediabuffer.c: - coremediabuffer: keep an extra ref to the image and data buffer - -2013-11-07 10:57:22 -0700 Greg Rutz <greg@gsr-tek.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvparse: Fix last start code position when input buffer is empty - When the input buffer is empty and we need more data to determine - whether or not to terminate the previous frame, the last start code - location needs to be set to 4 bytes before the the current position - (size of start_code is 32-bits) - https://bugzilla.gnome.org/show_bug.cgi?id=711627 - -2013-11-07 14:39:26 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: Fix bad condition in h264 parser - https://bugzilla.gnome.org/show_bug.cgi?id=711615 - -2013-11-07 12:29:48 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/coremediabuffer.c: - applemedia: coremediabuffer: use correct retain/release functions on CMSampleBufferRef buffer - Fixes a crash while releasing the sample buffer after the image - buffer it contains. - Also fixes a minor coding style error. - https://bugzilla.gnome.org/show_bug.cgi?id=711606 - -2013-11-07 14:26:22 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/plugin.m: - qtkitvideosrc: lower rank to GST_RANK_SECONDARY - Makes avfvideosrc be prefered over qtkitvideosrc since it is deprecated - with OS X 10.9. - https://bugzilla.gnome.org/show_bug.cgi?id=711614 - -2013-11-07 13:33:36 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/plugin.m: - avfvideosrc: set rank to GST_RANK_PRIMARY - Makes avfvideosrc to be used with autodetection. - https://bugzilla.gnome.org/show_bug.cgi?id=711614 - -2013-11-07 12:47:51 -0300 Thiago Santos <ts.santos@partner.samsung.com> - - * ext/hls/gsthlssink.c: - hlssink: do not lose ref to the multifilesink - It is needed to update location properties and it was being lost on - state changes, causing issues if the pipeline was to be reused - -2013-11-07 12:35:55 -0300 Thiago Santos <ts.santos@partner.samsung.com> - - * ext/hls/gsthlssink.c: - hlssink: make sure it is handled as a sink - It only gets the sink flag set when it adds the multifilesink, that - happens in null->ready and it might be too late. Set the flag - explicitly on the constructor. - https://bugzilla.gnome.org/show_bug.cgi?id=711086 - -2013-11-07 13:05:08 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/atdec.c: - avfvideosrc: fix compiler warning in iOS - -2013-11-07 12:29:34 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: fix build in iOS with isEqualTo doesn't exists - -2013-11-07 12:20:31 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: fix build with older SDK not supporting AVDeviceFormat - AVDeviceFormat and AVFrameRateRange are available in iOS since 7.0 - so we need a more dynamic approach to support compilation with older - SDK's. We use a NSObject to avoid referencing those types and key-value - coding or preformSelector to access properties. - -2013-11-07 01:38:20 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: fix checks for HAVE_IOS - -2013-11-07 01:37:38 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: include config.h - -2013-11-06 18:53:25 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: add more debug - -2013-11-06 18:50:46 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: fix compilation with gcc - The synthesize block needs to be moved to fix a compiler error - -2013-11-06 18:49:35 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: sort caps with the highest resolution first - When started without any caps filter we prefer the highest - supported resolution. - -2013-11-04 11:14:35 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: support screen capture on OSX - https://bugzilla.gnome.org/show_bug.cgi?id=711432 - -2013-10-31 13:05:40 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: minor cosmetic - -2013-10-31 13:03:58 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: use input device formats to set/get caps if available - https://bugzilla.gnome.org/show_bug.cgi?id=711211 - -2013-10-29 15:37:16 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: update caps if frame size has changed - On OSX, setting the pixel format on the output reset the capture device - to its native resolution, so we need to update the caps if the output - frame size has changed before a proper solution is found. - -2013-10-29 15:36:06 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: check if low preset is available - -2013-10-28 18:22:13 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: use a dedicated queue for AVFoundation calls - Replace the main queue with a dedicated queue for AVFoundation calls - so the execution on this queue won't block if the main queue - is not running. - -2013-10-29 17:33:11 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: remove trailing space - -2013-10-30 14:51:50 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: dispatch AVFoundation calls synchronously in the main queue - -2013-10-30 12:40:01 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/plugin.m: - applemedia: enable avfvideosrc if AVFoundation is present - -2013-10-30 12:39:24 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: only enable 1920x1080 preset on iOS - -2013-10-28 11:20:27 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * configure.ac: - configure.ac: detect presence of AVFoundation - -2013-10-28 11:53:26 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/plugin.m: - applemedia: port avfvideosrc to 1.0 - -2013-11-07 14:12:17 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/audiomixer.c: - audiomixer: Add unit test for handling unaligned buffers - That is, buffers that start or end in the middle of an output block. - -2013-11-07 14:12:00 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Fix EOS handling if we have some pending data - -2013-11-07 13:57:35 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/audiomixer.c: - audiomixer: Add test for the discont handling - -2013-11-07 13:55:32 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/audiomixer.c: - audiomixer: Refactor sync test to be more reusable - -2013-11-07 13:48:06 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/audiomixer.c: - audiomixer: Remove some racy-ness from the unit test - We might already be EOS when we start the mainloop, so only - set the pipeline to PLAYING from the main loop. - -2013-11-07 09:54:40 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - codecparsers: Remove some unused functions - -2013-11-06 22:13:13 -0300 Thiago Santos <ts.santos@partner.samsung.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: Make sure video-done is post only when file is closed - Force filesink to null before posting video-done to make sure the - file was closed. - Had to do it from a separate thread to avoid calling state_change from - a sync message handler. - https://bugzilla.gnome.org/show_bug.cgi?id=709373 - -2013-11-06 23:11:14 +0000 Tim-Philipp Müller <tim@centricular.com> - - * win32/common/libgstcodecparsers.def: - win32: add new codecparser API to .def file - -2013-10-09 10:54:14 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gsth265parse.c: - * gst/videoparsers/gsth265parse.h: - * gst/videoparsers/plugin.c: - videoparsers: add H.265 HEVC video parser element - https://bugzilla.gnome.org/show_bug.cgi?id=708438 - -2013-10-01 13:39:41 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/gsth265parser.c: - * gst-libs/gst/codecparsers/gsth265parser.h: - codecparsers: add H.265 HEVC bitstream parser - https://bugzilla.gnome.org/show_bug.cgi?id=708438 - -2013-11-05 12:43:44 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/aiff/aiffparse.c: - aiffparse: fix seeking in push mode - -2013-11-06 15:50:08 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/audiomixer/gstaudiomixer.c: - audiomixer: Don't take channel mask in consideration in mono or stereo - This could cause negotiation to fail. - https://bugzilla.gnome.org/show_bug.cgi?id=708633 - -2013-11-06 15:31:31 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/.gitignore: - audiomixer: Add test to the .gitignore file - -2013-11-06 15:18:58 +0100 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/audiomixer.c: - audiomixer: Add simply synchronization test - -2013-11-06 15:18:50 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - * gst/audiomixer/Makefile.am: - * gst/audiomixer/gstaudiomixer.c: - * gst/audiomixer/gstaudiomixer.h: - * gst/audiomixer/gstaudiomixerorc-dist.c: - * gst/audiomixer/gstaudiomixerorc-dist.h: - * gst/audiomixer/gstaudiomixerorc.orc: - * tests/check/Makefile.am: - * tests/check/elements/audiomixer.c: - audiomixer: Add new element based on adder that does synchronized audio mixing - -2013-11-05 11:19:37 +0000 Tim-Philipp Müller <tim@centricular.com> - - * common: - Automatic update of common submodule - From 865aa20 to dbedaa0 - -2013-11-04 19:58:35 +0100 Sebastian Dröge <sebastian@centricular.com> - - * ext/eglgles/gstegladaptation_egl.c: - eglglessink: Query upstream first to get a EGLDisplay - -2013-11-04 10:04:59 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia-nonpublic/Makefile.am: - applemedia-nonpublic: Link with gmodule for g_module_open() and others - -2013-11-04 10:04:42 +0100 Sebastian Dröge <sebastian@centricular.com> - - * sys/applemedia/Makefile.am: - applemedia: Link with gmodule for g_module_open() and others - -2013-11-01 22:32:32 +0100 Sebastian Dröge <sebastian@centricular.com> - - * configure.ac: - configure: Always define AM_CONDITIONAL USE_EGLGLES - -2013-10-04 12:48:10 +0200 L. Sorin <sorin@axis.com> - - * configure.ac: - * ext/curl/Makefile.am: - * ext/curl/gstcurl.c: - * ext/curl/gstcurlsftpsink.c: - * ext/curl/gstcurlsftpsink.h: - * ext/curl/gstcurlsshsink.c: - * ext/curl/gstcurlsshsink.h: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/curlsftpsink.c: - curl: curlsftpsink - new libcurl-based sink element for SFTP - Note: SFTP = SSH File Transfer Protocol - The sink acts as a client and uploads data to the SFTP server. - https://bugzilla.gnome.org/show_bug.cgi?id=709795 - -2013-10-31 13:36:25 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@sisa.samsung.com> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * ext/Makefile.am: - * ext/cdaudio/Makefile.am: - * ext/cdaudio/gstcdaudio.c: - * tests/check/Makefile.am: - * win32/common/config.h: - cdaudio: Remove cdaudio plugin - This element is being removed due to it been - considered obsolete and the functionaily it - provides no longer needed. - Details on the decision can be found here: - https://bugzilla.gnome.org/show_bug.cgi?id=711223 - Fixes: - https://bugzilla.gnome.org/show_bug.cgi?id=711232 - -2013-11-01 10:41:16 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/yadif/yadif.c: - yadif: Fix compiler warning caused by specifying const twice - yadif.c:49:24: warning: duplicate 'const' declaration specifier -Wduplicate-decl-specifier - DECLARE_ASM_CONST (16, const xmm_reg, pb_1) = { - ^ - yadif.c:33:50: note: expanded from macro 'DECLARE_ASM_CONST' - #define DECLARE_ASM_CONST(n,t,v) static const t __attribute__((used)) __attribute__ ((aligned (n))) v - ^ - yadif.c:52:24: warning: duplicate 'const' declaration specifier -Wduplicate-decl-specifier - DECLARE_ASM_CONST (16, const xmm_reg, pw_1) = { - ^ - yadif.c:33:50: note: expanded from macro 'DECLARE_ASM_CONST' - #define DECLARE_ASM_CONST(n,t,v) static const t __attribute__((used)) __attribute__ ((aligned (n))) - -2013-11-01 10:40:06 +0100 Sebastian Dröge <sebastian@centricular.com> - - * gst/yadif/yadif.c: - yadif: Fix build with XCode - https://bugzilla.gnome.org/show_bug.cgi?id=710451 - -2013-10-28 15:04:16 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: Remove the explicit PAR calculation based on VUI headers - The PAR calculation based on VUI headers is already doing by the - h264 codecparser and we does't need to duplicate those code. - https://bugzilla.gnome.org//show_bug.cgi?id=711009 - -2013-10-17 12:05:44 +0200 Antonio Ospite <ospite@studenti.unina.it> - - * docs/plugins/gst-plugins-bad-plugins.args: - * gst/geometrictransform/gstrotate.c: - rotate: Fix angle property help text - The help text of the angle property was probably copied from the circle - plugin, fix it to mention the rotation determined by the angle. - https://bugzilla.gnome.org/show_bug.cgi?id=710391 - -2013-10-30 18:48:08 -0700 Reynaldo H. Verdejo Pinochet <reynaldo@sisa.samsung.com> - - * configure.ac: - * ext/cdaudio/gstcdaudio.c: - cdaudio: port to 1.X - https://bugzilla.gnome.org/show_bug.cgi?id=711223 - -2013-10-30 18:25:50 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/androidmedia/gstamc.c: - androidmedia: fix rank for more software decoders - In Galaxy S4 the codecs list contains some OMX.SEC.foo.sw.dec - as software decoders - https://bugzilla.gnome.org/show_bug.cgi?id=711214 - -2013-10-17 12:53:31 +0200 Antonio Ospite <ospite@studenti.unina.it> - - * gst/geometrictransform/gstgeometrictransform.c: - geometrictransform: Fix setting black background for AYUV buffers - When the frame buffer is AYUV writing all zeros does not set it to - black, in YUV colorspace 0x10 is the black level for luminance and 0x80 - is the black level for chrominance. - Fix setting the background to black when the out_frame format is AYUV; - in all the other supported formats zeroing the data with memset is still - the right thing to do. - https://bugzilla.gnome.org/show_bug.cgi?id=710392 - -2013-10-23 23:34:27 +0100 Matthieu Bouron <matthieu.bouron@gmail.com> - - * sys/applemedia-nonpublic/plugin.m: - applemedia-nonpublic: fix plugin name - https://bugzilla.gnome.org/show_bug.cgi?id=711135 - -2013-10-23 17:22:16 +0100 Matthieu Bouron <matthieu.bouron@gmail.com> - - * sys/applemedia/vtenc.c: - vtenc: use proper release callback type in CVPixelBufferCreateWithPlanarBytes - https://bugzilla.gnome.org/show_bug.cgi?id=711140 - -2013-09-21 00:20:36 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: fix truncated line - https://bugzilla.gnome.org/show_bug.cgi?id=710657 - -2013-10-30 16:20:56 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * ext/eglgles/gstegladaptation_eagl.m: - eglglessink: remove unused functions in the eagl backend - https://bugzilla.gnome.org/show_bug.cgi?id=711159 - -2013-10-18 11:54:12 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - androidmedia: fix access to invalid buffers in the decoding loop - Flushing the decoder invalidates all buffers, so it should be done - after quiting the decoding loop. Otherwise we can jump into - "failed_release" and stop everything - https://bugzilla.gnome.org/show_bug.cgi?id=711156 - -2013-10-28 09:33:47 +0100 Edward Hervey <edward@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Unify value setting - the initial par_n = par_d = 0; was always overwritten since the switch/case - handles all values - And remove the 0 case (it's the same handling as default) - -2013-10-28 09:33:16 +0100 Edward Hervey <edward@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Avoid ending up with undefined values - If caps aren't fixed, we'd end up with undefined values for format - and align. - -2013-10-11 11:23:16 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Demote GST_ERROR to GST_WARNING - discontinuities are not errors per-se and we handle them correctly. - -2013-10-25 11:11:30 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/hls/gsthlsdemux.c: - hlsdemux: fix memory leak in gst_hls_demux_get_next_fragment - This patch fixes three memory leaks in hlsdemux, one that occurs - during normal operation and two that occur during error conditions. - The gst_hls_demux_get_next_fragment function calls - gst_fragment_get_buffer which increments the reference count - on the buffer but gst_hls_demux_get_next_fragment never calls unref on - the buffer. This means that the reference count for each downloaded - fragment never gets to zero and so its memory is never released. - This patch adds a call to gst_buffer_unref after the flags have been - updated on the buffer. - There is a leak-on-error in gst_hls_demux_decrypt_fragment if it fails - to download the key file. If the key fails to download, null is - returned without doing an unref on the encrypted fragment. The - semantics of gst_hls_demux_decrypt_fragment is that it takes ownership - of the encrypted fragment and releases it before returning. - There is a leak-on-error in gst_hls_src_buf_to_utf8_playlist in the - unlikely event that the gst_buffer_map fails. In the "happy path" - operation of gst_hls_src_buf_to_utf8_playlist the buffer gets an unref - before the function returns, therefore the error condition must do the - same. - https://bugzilla.gnome.org/show_bug.cgi?id=710881 - -2013-10-23 17:11:20 +0100 Matthieu Bouron <matthieu.bouron@gmail.com> - - * gst/mpegtsmux/mpegtsmux_ttxt.c: - mpegtsmux: fix uninitialized variable warning - https://bugzilla.gnome.org/show_bug.cgi?id=710759 - -2013-10-23 16:58:49 +0100 Matthieu Bouron <matthieu.bouron@gmail.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtsdemux: fix uninitialized variable warning - https://bugzilla.gnome.org/show_bug.cgi?id=710759 - -2013-10-18 10:12:56 +0800 Chen Jie <chenj@lemote.com> - - * sys/androidmedia/gstamc.c: - androidmedia: make gst_amc_avc_profile_from_string recognize alt name - https://bugzilla.gnome.org/show_bug.cgi?id=710433 - -2013-10-12 16:04:25 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/soundtouch/gstpitch.cc: - pitch: Fix inverted condition in setcaps - -2013-10-11 10:32:52 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Skip packets with corrupted length - This is similar to what we do for packets with payload - -2013-10-11 10:29:20 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Refactor language tag extraction - subtitling descriptor needs to be used with a different method to extract - language codes. - -2013-10-11 10:21:25 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - mpegts: Add support for parsing DVB Subtitling descriptor (0x59) - Essentially works in the same vein as the iso639 descriptor code - -2013-10-10 22:46:48 +0200 Jesper Larsen <knorr.jesper@gmail.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegts: Fix assertion fault in ISO 639 parsing - https://bugzilla.gnome.org/show_bug.cgi?id=709180 - -2013-10-09 17:18:41 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/speed/gstspeed.c: - speed: Fix some bytes-per-frame vs. bytes-per-sample mixups - Otherwise we will crash when handling multiple channels and - miscalculate timestamps. - https://bugzilla.gnome.org/show_bug.cgi?id=709734 - -2013-10-08 11:10:49 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - configure: Make sure to try window-system-agnostic EGL if nothing was auto-detected - -2013-10-08 07:56:11 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: log time format as name instead of the number - -2013-10-06 17:37:38 +0200 Gilles Dartiguelongue <eva@gentoo.org> - - * configure.ac: - egl: Allow disabling gstreamer-egl library - https://bugzilla.gnome.org/show_bug.cgi?id=709531 - -2013-10-05 14:45:33 +0200 Jesper Larsen <knorr.jesper@gmail.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Use mpegts-lib for ISO 639 language tags - https://bugzilla.gnome.org/show_bug.cgi?id=709180 - -2013-10-05 14:45:32 +0200 Jesper Larsen <knorr.jesper@gmail.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Return descriptor in get_descriptor - https://bugzilla.gnome.org/show_bug.cgi?id=709180 - -2013-10-05 14:45:31 +0200 Jesper Larsen <knorr.jesper@gmail.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - mpegts: Add ISO 639 parsing functions - https://bugzilla.gnome.org/show_bug.cgi?id=709180 - -2013-10-05 00:00:52 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: handle sticky dvd events - palette-changed events are now sticky. - https://bugzilla.gnome.org/show_bug.cgi?id=709454 - -2013-10-03 07:57:17 -0300 Thiago Santos <ts.santos@partner.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Small improvement on always valid if condition - No need to check for !cancelled as the above if guarantees it - to be true - -2013-10-03 07:56:21 -0300 Thiago Santos <ts.santos@partner.samsung.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Do not call _stop holding the updates lock - It will cause a deadlock and the calers for _get_next_fragment - will already call _stop if required when _get_next_fragment fails. - Fixes #690148 - -2013-06-12 10:50:51 -0600 Greg Rutz <greg@gsr-tek.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Improve if cause readability - Fixed up the error-handling code when downloading fragments. - Modifed the error-handling code to use positive logic when - testing for cancellation of the download loop. - https://bugzilla.gnome.org/show_bug.cgi?id=701404 - -2013-09-26 17:05:24 -0300 Thiago Santos <ts.santos@partner.samsung.com> - - * ext/dash/gstdashdemux.c: - dashdemux: actually return true on latency query - Do not forget to set the return for latency query - -2013-09-26 16:13:33 -0300 Alex Ashley <bugzilla@ashley-family.net> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: stop fetching live fragments that don't yet exist - There is an issue for live streams where download_loop will keep - downloading segments until it gets a 404 error for a segment - that has not yet been published. This is a problem because this - request for a segment that doesn't exist will propagate all the - way back to the origin server(s). This means that dashdemux causes - extra load on the origin server(s) for segments that aren't yet - available. - This patch uses availabilityStartTime, period - and the host's idea of UTC to decide if a fragment is available to - be requested from an HTTP server and filter out requests for fragments - that are not yet available. - https://bugzilla.gnome.org/show_bug.cgi?id=701404 - -2013-10-03 13:26:06 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/videoparsers/gsth264parse.c: - h264parse: Fix conversion to AVC if a SPS/PPS not from the first indizes is used - https://bugzilla.gnome.org/show_bug.cgi?id=707974 - -2013-10-02 10:55:30 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - * ext/openjpeg/Makefile.am: - * ext/openjpeg/gstopenjpeg.h: - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegdec.h: - * ext/openjpeg/gstopenjpegenc.c: - * ext/openjpeg/gstopenjpegenc.h: - openjpeg: Port OpenJPEG plugin to the 2.0 API - -2013-10-02 05:49:43 +0300 Dominik Röttsches <dominik.rottsches@intel.com> - - * sys/applemedia/vtenc.c: - vtenc: Add support for I420 - https://bugzilla.gnome.org/show_bug.cgi?id=709241 - -2013-10-02 05:49:34 +0300 Dominik Röttsches <dominik.rottsches@intel.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: Use correct strides, etc from the GstVideoFrame - https://bugzilla.gnome.org/show_bug.cgi?id=706211 - -2013-08-20 17:03:38 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: store quantization matrices in zig-zag order - Quantizer matrices are encoded in zigzag scan order in the bitstream, - so always parse it as it is. - https://bugzilla.gnome.org/show_bug.cgi?id=708629 - -2013-10-02 11:40:05 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * win32/common/libgstcodecparsers.def: - win32: update with the new file libgstcodecparsers.def - https://bugzilla.gnome.org/show_bug.cgi?id=708629 - -2013-10-02 11:24:58 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: add helpers to convert quantization matrices - Add utility functions to convert quantization matrices from zig-zag scan - order into raster scan order and vice-versa - https://bugzilla.gnome.org/show_bug.cgi?id=708629 - -2013-09-30 15:32:55 -0600 Brendan Long <b.long@cablelabs.com> - - * configure.ac: - * gst-plugins-bad.spec.in: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-mpegts-uninstalled.pc.in: - * pkgconfig/gstreamer-mpegts.pc.in: - * pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in: - Add gstreamer-mpegts pkg-config file. - https://bugzilla.gnome.org/show_bug.cgi?id=709145 - -2013-09-29 23:43:23 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/opencv/gstdisparity.cpp: - opencv: don't unref NULL caps in finalize - Fixes gst-inspect-1.0 -a and generic states unit test. - -2013-09-26 13:37:09 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * sys/applemedia/Makefile.am: - * sys/applemedia/iosassetsrc.h: - * sys/applemedia/iosassetsrc.m: - iosassetsrc: Port to 1.0 and fix some bugs on the way - -2013-09-26 13:21:59 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/iosassetsrc.h: - * sys/applemedia/iosassetsrc.m: - * sys/applemedia/plugin.m: - iosassetsrc: Add new element from the GStreamer SDK project - -2013-09-23 14:36:40 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/eglgles/Makefile.am: - * ext/eglgles/gstegladaptation.c: - * ext/eglgles/gstegladaptation.h: - * ext/eglgles/gstegladaptation_eagl.m: - * ext/eglgles/gstegladaptation_egl.c: - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Port iOS part to 1.0 - -2013-09-23 13:20:46 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - configure: Fix iOS check for eglglessink - -2013-09-23 11:35:56 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * sys/applemedia-nonpublic/Makefile.am: - * sys/applemedia-nonpublic/coremediactx.c: - * sys/applemedia-nonpublic/plugin.m: - * sys/applemedia/Makefile.am: - * sys/applemedia/plugin.m: - applemedia: avfvideosrc is not ported to 1.0 yet - -2013-09-18 17:51:26 +0200 Michael Olbrich <m.olbrich@pengutronix.de> - - * gst/liveadder/liveadder.c: - liveadder: round when calculation length from duration - liveadder sometimes calculates the offsets incorrectly before adding. The - resulting errors can easily be heard when mixing silence with a sine. - I'm not sure what the exact conditions are to trigger this, but it definitively - happens when the buffers of two streams have a different duration and buffer - length and duration don't match exactly for one stream because of rounding - errors (e.g. duration=0:00:00.021333333) - I have to admit, I got lost in the math somewhere but it seems that not - rounding in gst_live_adder_length_from_duration() causes 1 sample overlaps in - consecutive buffers from the same stream. - When using gst_util_uint64_scale_int_round() instead of just truncating the - sine sound correctly again. - https://bugzilla.gnome.org/show_bug.cgi?id=708345 - -2013-09-25 15:22:12 +0100 Javier Jardón <jjardon@gnome.org> - - * ext/hls/gstm3u8playlist.c: - hlssink: Use floats for the EXTINF duration values - https://bugzilla.gnome.org/show_bug.cgi?id=708851 - -2013-09-25 15:18:39 +0100 Javier Jardón <jjardon@gnome.org> - - * ext/hls/gstm3u8playlist.c: - hlssink: Write EXT-X-VERSION tag in the playlist file - https://bugzilla.gnome.org/show_bug.cgi?id=708851 - -2013-09-19 14:53:46 +0200 Edward Hervey <edward@collabora.com> - - * tests/check/elements/uvch264demux.c: - check: Update uvch264demux for behaviour change - Since 006e7a3428bd097fc6e6c648332bff583dd434f9 we no longer error out on - incomplete aux segment. - -2013-09-27 14:45:00 +0000 Steve Maynard <steve@secondstryke.com> - - * gst-libs/gst/mpegts/Makefile.am: - * gst-libs/gst/mpegts/gst-scte-section.h: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * gst-libs/gst/mpegts/mpegts.h: - * gst-plugins-bad.spec.in: - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/mpegtsbase.c: - mpegts: Add SCTE/EISS sections and table types - https://bugzilla.gnome.org/show_bug.cgi?id=708688 - -2013-07-29 08:10:07 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Wait for valid PCR/offset obvervations - It is quite possible that we might get PTS/DTS before the first - PCR/Offset observation. - In order to end up with valid timestamp we wait until at least one - stream was able to get a proper running-time for any PTS/DTS. - Until then, we queue up the pending buffers to push out. - Once we see a first valid timestamp, we re-evaluate the amount of - running-time elapsed (based on returned inital running-time and amount - of data/DTS queued up) for any given stream. - Taking the biggest amount of elapsed time, we set that on the packetizer - as the initial offset and recalculate all pending buffers running-time - PTS/DTS. - Note: The buffer queueing system can also be used later on for the - dvb fast start proposal (where we queue up all stream packets before - seeing PAT/PMT and then push them once we know if they belong to the - chosen program). - -2013-07-07 15:04:18 +0200 Edward Hervey <edward@collabora.com> - - * tests/examples/mpegts/ts-parser.c: - examples: Add descriptor dumping - -2013-07-26 07:54:30 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtsdemux: New PCR<=>Offset estimation code - This allows: - * Better duration estimation - * More accurate PCR location - * Overall more accurate running-time location and calculation - Location and values of PCR are recorded in groups (PCROffsetGroup) - with notable PCR/Offset observations in them (when bitrate changed - for example). PCR and offset are stored as 32bit values to - reduce memory usage (they are differences against that group's - first_{pcr|offset}. - Those groups each contain a global PCR offset (pcr_offset) which - indicates how far in the stream that group is. - Whenever new PCR values are observed, we store them in a sliding - window estimator (PCROffsetGroupCurrent). - When a reset/wrapover/gap is detected, we close the current group with - current values and start a new one (the pcr_offset of that new group - is also calculated). - When a notable change in bitrate is observed (+/- 10%), we record - new values in the current group. This is a compromise between - storing all PCR/offset observations and none, while at the same time - providing better information for running-time<=>offset calculation - in VBR streams. - Whenever a new non-contiguous group is start (due to seeking for example) - we re-evaluate the pcr_offset of each groups. This allows detecting as - quickly as possible PCR wrapover/reset. - When wanting to find the offset of a certain running-time, one can - iterate the groups by looking at the pcr_offset (which in essence *is* - the running-time of that group in the overall stream). - Once a group (or neighbouring groups if the running-time is between two - groups) is found, once can use the recorded values to find the most - accurate offset. - Right now this code is only used in pull-mode , but could also - be activated later on for any seekable stream, like live timeshift - with queue2. - Future improvements: - * some heuristics to "compress" the stored values in groups so as to keep - the memory usage down while still keeping a decent amount of notable - points. - * After a seek compare expected and obtained PCR/Offset and if the - difference is too big, re-calculate position with newly observed - values and seek to that more accurate position. - Note that this code will *not* provide keyframe-accurate seeking, but - will allow a much more accurate PCR/running-time/offset location on - any random stream. - For past (observed) values it will be as accurate as can be. - For future values it will be better than the current situation. - Finally the more you seek, the more accurate your positioning will be. - -2013-07-05 17:11:46 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtspacketizer: No longer use a private struct - These are not public headers, it just adds complexity for no reason - -2013-09-26 16:51:25 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Fix dereferencing of NULL pointer - On some live HLS streams, gst_hls_demux_switch_playlist causes - assertion failures because it tried to dereference a NULL fragment. - This is because g_queue_peek_tail sometimes was returning NULL and - this case was not being checked. - This patch does two things: - * move the g_queue_peek_tail inside the semaphore protection - * check if q_queue_peek_tail returns NULL - https://bugzilla.gnome.org/show_bug.cgi?id=708849 - -2013-09-27 16:10:54 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/mpegtsparse.h: - mpegtsparse: Queue buffers until we have enough to know the caps - https://bugzilla.gnome.org/show_bug.cgi?id=708222 - -2013-09-16 11:46:27 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: rework TS packet sync and extraction - The previous code could enter an infinite loop because the adapter state - could get out of sync with its mapped data state after sync was lost. - The code was pretty confusing so it's been rewritten to be clearer. - The easiest way to reproduce the infinite loop is to use the breakmydata - element before tsdemux to trigger a resync. - https://bugzilla.gnome.org/show_bug.cgi?id=708161 - -2013-09-16 11:42:48 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: fix buffer overflow - This can happen with a corrupt TS file, found with breakmydata element - plugged before tsdemux. - https://bugzilla.gnome.org/show_bug.cgi?id=708161 - -2013-09-25 23:57:42 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - configure: remove AS_SCRUB_INCLUDE - Shouldn't be needed any more. - https://bugzilla.gnome.org/show_bug.cgi?id=707658 - -2013-09-25 20:25:03 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * sys/bluez/gstavdtputil.c: - bluez: Fix compilation on big endian systems - -2013-09-24 18:31:10 +0100 Tim-Philipp Müller <tim@centricular.net> - - * README: - * common: - Automatic update of common submodule - From 6b03ba7 to 865aa20 - -2013-09-24 15:05:28 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - configure: Actually use 1.3.0.1 as version to make configure happy - -2013-09-24 15:00:27 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - Back to development - -=== release 1.2.0 === - -2013-09-24 14:37:58 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-eglglessink.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.2.0 - -2013-09-24 14:37:29 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2013-09-23 16:18:43 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/sdp/gstsdpelem.c: - sdpdemux: Change rank to NONE until it can be autoplugged properly - https://bugzilla.gnome.org/show_bug.cgi?id=702495 - -2013-09-20 16:17:14 +0200 Edward Hervey <edward@collabora.com> - - * common: - Automatic update of common submodule - From b613661 to 6b03ba7 - -2013-09-19 20:17:01 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/audiofxbad/gstaudiofxbad.c: - audiofxbad: Change plugin name to audiofxbad from audiochannelmix - -2013-09-19 20:09:26 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/dash/gstplugin.c: - * ext/smoothstreaming/gstsmoothstreaming-plugin.c: - dash/smoothstreaming: Remove unused debug category with the same name - It caused static linking to fail. - -2013-09-19 18:43:28 +0100 Tim-Philipp Müller <tim@centricular.net> - - * common: - Automatic update of common submodule - From 74a6857 to b613661 - -2013-09-19 17:36:03 +0100 Tim-Philipp Müller <tim@centricular.net> - - * autogen.sh: - * common: - Automatic update of common submodule - From 098c0d7 to 74a6857 - -2013-09-19 16:44:48 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/eglgles/Makefile.am: - eglglessink: Fix static linking for Android by passing --tag=CC to libtool - -2013-09-19 11:35:01 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - Back to development - -=== release 1.1.90 === - -2013-09-19 10:50:47 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-eglglessink.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.1.90 - -2013-09-19 10:46:27 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2013-09-19 09:46:34 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * po/cs.po: - * po/nl.po: - * po/pl.po: - * po/ru.po: - * po/uk.po: - * po/vi.po: - po: Update translations - -2013-09-18 22:36:51 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/eglgles/gstegladaptation.c: - * ext/eglgles/gstegladaptation_egl.c: - * ext/eglgles/gsteglglessink.c: - eglglessink: Update for new GstContext API - -2013-09-18 22:24:07 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst-libs/gst/egl/egl.c: - * gst-libs/gst/egl/egl.h: - egl: Update for new GstContext API - -2013-09-17 17:41:39 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Reset GstUriDownloader cancellation when restarting to play - -2013-09-15 17:09:16 +0530 Sudip Jain <sudip.jain@st.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Correct condition check for current next indicator - https://bugzilla.gnome.org/show_bug.cgi?id=708106 - -2013-09-12 12:03:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rawparse/gstrawparse.c: - * gst/rawparse/gstrawparse.h: - rawparse: fix event order - Delay forwarding the segment event until we pushed caps. - Send STREAM_START in pull mode. - -2013-09-12 13:21:37 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Don't put the level restrictions on the sinkpad caps - They tend to be inaccurate and having them in the sinkpad caps - prevents playback of files that would otherwise play fine. - -2013-09-10 18:51:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - tsdemux: respect seqnums on seeks - Pass the seqnum to other events that are consequence of the - original seek event - -2013-09-10 11:37:55 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - opencv: We also work with OpenCV 2.4.6.1 - -2013-09-10 08:48:32 +0000 Iain Lane <iain.lane@canonical.com> - - * ext/modplug/gstmodplug.cc: - modplug: Specify directory when including stdafx.h - modplug stopped exposing their directory in their pcfile, meaining - consumers accessing the headers directly fail to build. - http://sourceforge.net/p/modplug-xmms/git/ci/75e9b166982ed637b59ef7cbc1835a09f768923e/ - -2013-09-09 13:14:13 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/uvch264/gstuvch264_src.c: - uvch264src: Fix small mem leak - -2013-09-07 23:09:31 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: don't update src caps if only codec_data differs - https://bugzilla.gnome.org/show_bug.cgi?id=705333 - -2013-09-05 19:23:10 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/uvch264/gstuvch264_src.c: - uvch264src: Let the caps be NULL if there is no peer - -2013-09-05 19:22:51 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/uvch264/gstuvch264_src.c: - uvch264src: No need to drop segment events - In 1.0, segment events are sticky and not additive, no need to prevent - their accumulation. - -2013-09-05 19:10:31 +0100 Tim-Philipp Müller <tim@centricular.net> - - * sys/decklink/gstdecklinksrc.cpp: - decklinksrc: send caps event before segment - -2013-09-04 10:58:24 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: change pool->sink->last_buffer to pool->last_buffer - So that GstEGLImageBufferPool does not depend on GstEglGlesSink - The goal is still to move it into gstegl lib - -2013-09-04 10:56:12 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: buffer pool does not need to maintain a ref on the display - Because it does not use it and also it may not know it when - we create the pool - -2013-09-04 10:52:51 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: add GstEGLImageBufferPoolSendBlockingAllocate callback - The goal here is to prepare GstEGLBufferPool to be moved into - gstegl lib. So it has to not depend on 'gst_eglglessink_queue_object' - -2013-09-04 10:48:34 +0100 Julien Isorce <julien.isorce@collabora.co.uk> - - * ext/eglgles/gstegladaptation.h: - * ext/eglgles/gstegladaptation_egl.c: - * ext/eglgles/gsteglglessink.c: - eglglessink: prepare gst_egl_adaptation_allocate_eglimage to be moved - into gstegl lib or splited between gstegl lib and gstgl lib - because it both depends on egl and gl - So it has to not depend on GstEglAdaptationContext - -2013-08-30 13:54:40 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * gst/videoparsers/gsth264parse.c: - * tests/check/elements/h264parse.c: - h264parse: Add support for stream-format=avc3 - When outputting in AVC3 stream format, the codec_data should not - contain any SPS or PPS, because they are embedded inside the stream. - In case of avc->bytestream h264parse will push the SPS and PPS from - codec_data downstream at the start of the stream, at intervals - controlled by "config-interval" and when there is a codec_data change. - In the case of avc3->bytstream h264parse detects that there is - already SPS/PPS in the stream and sets h264parse->push_codec to FALSE. - Therefore avc3->bytstream was already supported, except for the stream - type. - In the case of bystream->avc h264parse will generate codec_data caps - from the parsed SPS/PPS in the stream. However it does not remove these - SPS/PPS from the stream. bytestream->avc3 is the same as bytestream->avc - except that the codec_data must not have any SPS/PPS in it. - |--------------+-------------+-------------------| - |stream-format | SPS in-band | SPS in codec_data | - |--------------+-------------+-------------------| - | avc | maybe | always | - |--------------+-------------+-------------------| - | avc3 | always | never | - |--------------+-------------+-------------------| - Amendment 2 of ISO/IEC 14496-15 (AVC file format) is defining a new - structure for fragmented MP4 called "avc3". The principal difference - between AVC1 and AVC3 is the location of the codec initialisation - data (e.g. SPS, PPS). In AVC1 this data is placed in the initial MOOV box - (moov.trak.mdia.minf.stbl.stsd.avc1) but in AVC3 this data goes in the - first sample of every fragment. - https://bugzilla.gnome.org/show_bug.cgi?id=702004 - -2013-09-03 17:36:08 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/soundtouch/gstbpmdetect.cc: - * ext/soundtouch/gstpitch.cc: - soundtouch: Fix compilation with soundtouch 1.4.0 - It used FLOAT_SAMPLES/INTEGER_SAMPLES #defines instead of ones properly - prefixed with a namespace. - https://bugzilla.gnome.org/show_bug.cgi?id=707390 - -2013-09-03 11:14:43 +0100 Tim-Philipp Müller <tim@centricular.net> - - * .gitignore: - .gitignore: ignore new win32 config.h-new - -2013-09-03 11:05:02 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Port tiled NV12 conversion to 1.0 - -2013-09-03 10:56:46 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Add FIXME comment - -2013-08-12 10:16:16 +0000 Jorge Luis Zapata <jzapata@fluendo.com> - - * sys/androidmedia/gstamc-constants.h: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcvideodec.c: - androidmedia: add support for a new qualcomm colorspace - -2013-09-02 23:28:38 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: minor clean-up - -2013-09-02 22:54:32 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: send events on pads that are not linked - Someone might be waiting for certain events with a probe. - https://bugzilla.gnome.org/show_bug.cgi?id=707317 - -2013-08-28 20:07:48 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/Makefile.am: - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: disable buffer pools - On a device lost, all the surfaces allocated in the - device need to be released before resetting the device, - which can't be done for the allocated buffers. - https://bugzilla.gnome.org/show_bug.cgi?id=706566 - -2013-09-02 13:40:37 +0100 Tim-Philipp Müller <tim@centricular.net> - - * Makefile.am: - * configure.ac: - * win32/MANIFEST: - * win32/common/config.h.in: - Change how win32/common/config.h is updated - Generate win32/common/config.h-new directly from config.h.in, - using shell variables in configure and some hard-coded information. - Change top-level makefile so that 'make win32-update' copies the - generated file to win32/common/config.h, which we keep in source - control. It's kept in source control so that the git tree is - buildable from VS. - This change is similar to the one recently applied to GStreamer - and gst-plugins-good. The previous config.h file in -bad was in - pretty bad shape, so unlike core and base, I didn't attempt to - leave it strictly the same, but fixed it as necessary. Needs - testing I cannot do myself. - https://bugzilla.gnome.org/show_bug.cgi?id=569015 - -2013-09-02 12:19:12 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/.gitignore: - tests: ignore new aiffparse test binary - -2013-09-02 10:29:08 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/soundtouch/gstbpmdetect.cc: - * ext/soundtouch/gstpitch.cc: - * ext/soundtouch/gstpitch.hh: - soundtouch: Allow compilation against float and integer version of the library - https://bugzilla.gnome.org/show_bug.cgi?id=707270 - -2013-08-30 21:52:35 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix warnings when building in OS X Snow Leopard - gstdashdemux.c:1753: warning: format '%llu' expects type 'long long unsigned int', but argument 8 has type 'long unsigned int' - gstdashdemux.c:2224: warning: format '%llu' expects type 'long long unsigned int', but argument 9 has type 'guint64' - gstdashdemux.c:2224: warning: format '%llu' expects type 'long long unsigned int', but argument 10 has type 'guint64' - -2013-08-30 21:36:19 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: Fix warnings when building in OS X Snow Leopard - gstmpdparser.h:530: warning: type qualifiers ignored on function return type - gstmpdparser.c:4177: warning: type qualifiers ignored on function return type - -2013-08-30 09:05:43 +0200 Edward Hervey <edward@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Use codecparsers macros - note: I/SI also covers the S_I/S_SI variants - -2013-08-29 11:02:37 -0700 Kerrick Staley <kerrick@kerrickstaley.com> - - * tests/examples/directfb/gstdfb.c: - examples: port directfb example to 1.0 - gst_pad_get_negotiated_caps was removed from 1.0; - gst_pad_get_current_caps should be used instead. See - http://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/random - /porting-to-1.0.txt - https://bugzilla.gnome.org/show_bug.cgi?id=707074 - -2013-08-29 15:55:08 +0100 Tim-Philipp Müller <tim@centricular.net> - - * win32/common/config.h: - win32: update config.h - -2013-08-29 15:46:14 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/directfb/dfbvideosink.c: - dfbvideosink: make "layer-mode" property an enum - https://bugzilla.gnome.org/show_bug.cgi?id=703520 - -2013-08-29 14:48:28 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/directfb/dfbvideosink.c: - dfbvideosink: don't use deprecated GLib thread API - https://bugzilla.gnome.org/show_bug.cgi?id=703520 - -2013-06-26 11:07:14 +0900 Kazunori Kobayashi <kkobayas@igel.co.jp> - - * configure.ac: - * ext/directfb/dfbvideosink.c: - * ext/directfb/dfbvideosink.h: - dfbvideosink: port to 1.0 - including the following supports and fixes: - * Create DirectFB surfaces from GstBufferPool - * Add NV12 pixel format support - * Don't use the cursor in the exclusive mode - - EnableCusor() can be only used when the administrative mode is set - in DirectFB 1.6.0 and later. - * Support multiple plane rendering for planar color formats - - This accommodates the chroma plane offsets of the framebuffer - in planar formats. - * Invoke SetConfiguration regardless of video mode setting in setcaps() - - SetConfiguration() method should be invoked regardless of - the result of gst_dfbvideosink_get_best_vmode(), since the two are - unrelated. - * Disable DirectFB signal handler - - "--dfb:no-sighandler" option is passed to DirectFBInit(). - This prevents DirectFB from trying to kill the process and allows - GStreamer's termination sequence to proceed normally. - https://bugzilla.gnome.org/show_bug.cgi?id=703520 - -2013-08-29 10:20:56 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * sys/bluez/gstavdtputil.c: - avdtputil: Some minor cleanup and leak fixes - -2013-08-28 14:26:04 +0200 Bernhard Miller <bernhard.miller@streamunlimited.com> - - * sys/bluez/a2dp-codecs.h: - * sys/bluez/gstavdtpsrc.c: - * sys/bluez/gstavdtputil.c: - bluez: support aac in avdtpsrc - Signed-off-by: Bernhard Miller <bernhard.miller@streamunlimited.com> - -2013-08-28 13:26:56 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - Back to development - -=== release 1.1.4 === - -2013-08-28 13:07:27 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-eglglessink.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * gst/bayer/gstbayerorc-dist.c: - * gst/fieldanalysis/gstfieldanalysisorc-dist.c: - * win32/common/config.h: - Release 1.1.4 - -2013-08-28 13:07:24 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2013-08-28 12:33:17 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * po/pt_BR.po: - po: update translations - -2013-08-28 11:13:14 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst-libs/gst/mpegts/mpegts.h: - mpegts: mark as unstable API - -2013-08-27 17:05:44 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtsdemux: fix possible read beyond end of buffer when resyncing - -2013-08-27 11:27:04 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: only update src CAPS when it's necessary - https://bugzilla.gnome.org/show_bug.cgi?id=705452 - -2013-08-20 11:59:34 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: do not set CAPS and passthrough mode if SPS/PPS have not been parsed - https://bugzilla.gnome.org/show_bug.cgi?id=705452 - -2013-08-26 13:48:02 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - configure.ac: Don't set BZ2_LIBS if bz2 is not found - -2013-08-26 10:22:06 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/webp/gstwebpdec.c: - webpdec: Some cleanup and minor fixes - -2013-08-24 00:46:38 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - * ext/Makefile.am: - * ext/webp/Makefile.am: - * ext/webp/gstwebp.c: - * ext/webp/gstwebpdec.c: - * ext/webp/gstwebpdec.h: - webp: Add WebP image decoder plugin - https://bugzilla.gnome.org/show_bug.cgi?id=706285 - -2012-09-01 20:46:43 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstfacedetect.h: - facedetect: new property to control bus messages updates - https://bugzilla.gnome.org/show_bug.cgi?id=655622 - -2013-08-23 12:01:32 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/opencv/gstopencvutils.c: - * ext/opencv/gstsegmentation.cpp: - opencv: Fix indention - -2013-08-23 12:01:07 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstdisparity.h: - opencv: Port to non-deprecated GMutex/GCond API - -2013-08-23 11:38:04 +0200 Miguel Casas-Sanchez <miguelecasassanchez@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstdisparity.cpp: - * ext/opencv/gstdisparity.h: - * ext/opencv/gstopencv.c: - opencv: Add disparity-map calculation element - https://bugzilla.gnome.org/show_bug.cgi?id=704760 - -2013-08-22 17:32:17 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * sys/directsound/gstdirectsoundsrc.c: - directsoundsrc: Remove unused variable - -2013-08-22 16:07:58 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - configure: Update opencv dependency, 2.4.5 works too. - -2013-08-22 13:45:59 +0200 Kishore Arepalli <kishore.arepalli@gmail.com> - - * sys/directsound/gstdirectsoundsrc.c: - * sys/directsound/gstdirectsoundsrc.h: - directsoundsrc: Add 'device-name' property for selecting a audio device - https://bugzilla.gnome.org/show_bug.cgi?id=706574 - -2013-08-22 14:56:05 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - configure: Fix bz2 configure check for Windows - Due to function decorations on Windows AC_CHECK_LIB can't be used to check for bz2. - https://bugzilla.gnome.org/show_bug.cgi?id=465924 - -2013-08-21 14:44:38 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Refuse negative rates which we don't support yet - And remove a check which was done before - -2013-03-10 17:02:18 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - mpegtsmux: Set the program number from prog-map - The prog-map property of mpegtsmux only allows you to group pids together in a program. - The program number set in the PAT/PMT tables cannot be set explicitly. - This patch will set the program number according to the prog-map. - If a program id of 0 is given, the first vacant program number starting from 1 will be used. - https://bugzilla.gnome.org/show_bug.cgi?id=697239 - -2013-08-21 08:58:52 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/camutils.c: - * sys/dvb/dvbbasebin.c: - dvb: Adapt for latest mpegts lib changes - -2013-08-21 08:58:23 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - mpegtsbase: Adapt for latest mpegts lib changes - -2013-08-21 08:40:16 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gst-dvb-section.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * tests/examples/mpegts/ts-parser.c: - mpegts: ABI/API break: Use GPtrArray instead of GArray - While it was a great idea, various g-i based bindings don't support - GArray with entries greater than sizeof(gpointer) :( - So let's just make everybody happy by just using GPtrArray. - And since we're breaking the API, also rename the various descriptor fields - to no longer have the descriptor_ prefix. - It does cost a bit more in terms of memory/cpu usage, but makes it usable - from bindings. - -2013-08-19 15:31:51 -0400 Robert Krakora <rob.krakora@messagenetsystems.com> - - * sys/uvch264/gstuvch264_mjpgdemux.c: - uvch264src: don't error out on incomplete aux data segment - It appears that the Logitech C920 sometimes drops the next - to last segment of RAW aux data contained within the MJPEG - container. H264 data that is multiplexed with in the same - container does not appear to be affected. This appears to - be a bug in the Logitech C920 firmware and uvch264src should - not error out in this case. - Sometimes it can take 24 hours of continuous streaming for - the problem to occur, but sometimes it takes only a couple - of hours. - https://bugzilla.gnome.org/show_bug.cgi?id=706276 - -2013-08-20 16:01:47 +0200 Edward Hervey <edward@collabora.com> - - * gst/ivtc/gstivtc.c: - ivtc: Use input framerate when possible - if input is 30000/1001 ... use 24000/1001 as the output fixated framerate - -2013-08-15 11:45:34 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/id3tag/id3tag.c: - id3mux: handle publisher, interpreted-by and musical-key tags - https://bugzilla.gnome.org/show_bug.cgi?id=705999 - -2013-08-20 13:29:14 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Fix switch statement in level detection code - Properly fall through the cases without re-assigning the level to - the wrong value. - https://bugzilla.gnome.org/show_bug.cgi?id=706369 - -2013-08-19 17:23:28 +0200 Edward Hervey <edward@collabora.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: Forward segment event after caps - Store it until we know what our caps are. - -2013-08-20 00:26:06 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/aiffparse.c: - test: fix compiler warning in aiffparse test on 32-bit x86 - -2013-08-19 09:25:20 +0000 Matthieu Bouron <matthieu.bouron@collabora.com> - - * tests/check/elements/aiffparse.c: - aiffparse: fix copyright - -2013-08-17 00:22:44 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/aiffparse.c: - tests: fix some leaks in aiffparse unit test - -2013-08-17 00:09:18 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/aiffparse.c: - tests: fix state change order in aiffparse test - Do state changes from sink to src. Fixes race condition in - pull mode test where the source will start up and push buffers - to queue/identity or aiffparse before the main thread has - managed to set them to playing yet. - -2013-08-12 18:33:39 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * tests/check/Makefile.am: - * tests/check/elements/aiffparse.c: - * tests/files/Makefile.am: - * tests/files/s16be-id3v2.aiff: - aiffparse: add tests - https://bugzilla.gnome.org/show_bug.cgi?id=705993 - -2013-08-17 00:23:08 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/aiff/aiffparse.c: - aiffparse: don't leak adapter - -2013-08-15 13:58:48 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/aiff/aiffparse.c: - aiffparse: s/newsegment/segment/ - https://bugzilla.gnome.org/show_bug.cgi?id=705993 - -2013-08-13 18:42:55 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/aiff/aiffparse.c: - aiffparse: fix push mode - Fix push mode by handling sink events (CAPS, SEGMENT) properly. - https://bugzilla.gnome.org/show_bug.cgi?id=705993 - -2013-08-16 15:41:48 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparse: Reparse the config if the size changed - Also only re-issue the caps update if the part of the config that - changed is one we care about. - -2013-08-16 19:48:03 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/srtp/gstsrtpdec.c: - srtpdec: fix buffers being dropped due to shadowed variable - Spotted by gstblub@gmail.com. - https://bugzilla.gnome.org/show_bug.cgi?id=706091 - -2013-08-08 11:19:00 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/dash/gstmpdparser.c: - dashdemux: offset segment numbers by startNumber - For SegmentTemplate elements containing a startNumber attribute, the - `number' member of GstMediaSegments should be offset by the value of - startNumber; however, this is not currently the case. As a result, the - first URI(s) requested by the download loop will be wrong. - This commit ensures that segment numbers will be offset by startNumber - when one is present in a SegmentTemplate element. - https://bugzilla.gnome.org/show_bug.cgi?id=705661 - -2013-08-08 15:19:15 +0100 Chris Bass <floobleflam@gmail.com> - - * ext/dash/gstmpdparser.c: - dashdemux: remove incorrect timestamp scaling. - When using a SegmentTemplate element, the timestamps of the buffers - output by dashdemux are incorrect, causing problems downstream. - The reason is that GstMediaSegment start times are calculated (in - gst_mpdparser_get_chunk_by_index) by multiplying segment index by - segment duration and then scaling the result according the `timebase' - attribute from the MPD. However, the segment duration is already a - GstClockTime (i.e., it has already been scaled according to the timebase - from the MPD and converted to a nanosecond value), so multiplying it by - the segment index will give the correct timestamp without the need for - any further scaling. - https://bugzilla.gnome.org/show_bug.cgi?id=705679 - -2013-08-15 20:12:42 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/examples/stats/Makefile.am: - * tests/examples/stats/mp2ogg.c: - examples: remove another obsolete example - -2013-08-15 15:46:58 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/daala/gstdaaladec.c: - * ext/daala/gstdaalaenc.c: - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegenc.c: - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgdec.h: - * ext/schroedinger/gstschrodec.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/mfc/gstmfcdec.c: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - ext: Use new flush vfunc of video codec base classes and remove reset implementations - -2013-08-14 19:12:16 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/examples/capsfilter/Makefile.am: - * tests/examples/capsfilter/capsfilter1.c: - * tests/examples/gstplay/.gitignore: - * tests/examples/gstplay/Makefile.am: - * tests/examples/gstplay/player.c: - * tests/examples/indexing/.gitignore: - * tests/examples/indexing/Makefile.am: - * tests/examples/indexing/indexmpeg.c: - * tests/examples/level/Makefile.am: - * tests/examples/level/README: - * tests/examples/level/demo.c: - * tests/examples/level/plot.c: - examples: remove prehistoric examples - -2013-08-14 18:17:51 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstinteraudiosrc.h: - interaudiosrc: make silence memory actually contain silence - instead of random data. Reported by Marco Micheletti on - gstreamer-devel. - -2013-08-14 13:27:03 +0100 Tim-Philipp Müller <tim@centricular.net> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: fix criticals when trying to cast a GstPad to a GstElement - message->src might be a GstPad. Observed during gst-inspect-1.0 -a - -2013-08-14 13:59:27 +0200 Edward Hervey <edward@collabora.com> - - * .gitignore: - * gst-libs/gst/mpegts/.gitignore: - .gitignore: Update for new files to ignore - -2013-08-14 13:41:37 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/pesparse.c: - * gst/mpegtsdemux/pesparse.h: - pesparse: Refactory secondary PES extension handling - Some streams had wrong values for the stream_id_extension, make sure - we only remember the valid ones. - For streams with PES_extension_field_length == 0, assume there's nothing - else. - For streams that state they have a TREF extension but don't have enough - data to store it, just assume it was produced by a non-compliant muxer - and skip the remaining data. - Only store remaining data in stream_id_extension_data instead of storing - data we already parse. - -2013-08-14 10:47:31 +0200 Zaheer Abbas Merali <zaheermerali@gmail.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: Remove unneeded unref and only set pad caps if we have caps - Fixes crashes due to invalid unrefs. - https://bugzilla.gnome.org/show_bug.cgi?id=705957 - -2013-08-14 10:39:46 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/pesparse.c: - pesparse: Fix pes extension data length check - And remove length/data updates (we use the header size just below to - properly set them). - Based on feedback from Stas Sergeev <stsp@list.ru> - https://bugzilla.gnome.org/show_bug.cgi?id=657343 - -2013-08-14 10:33:14 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/pesparse.c: - * gst/mpegtsdemux/pesparse.h: - * gst/mpegtsdemux/tsdemux.c: - pesparse: Remove unused argument - We always provided 0 as the offset and never used the returned value. - Based on feedback from Stas Sergeev <stsp@list.ru> - https://bugzilla.gnome.org/show_bug.cgi?id=657343 - -2013-08-13 17:47:14 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - codecparsers: mpegvideoparse: turn internal consistency check into a g_assert() - We only check input from the API user with g_return_*_if_fail(). - Internal sanity checks should use g_assert() instead, which is - disabled by default for releases. - -2013-08-13 17:45:51 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: mpegvideoparser: minor doc fixes - -2013-08-13 12:41:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: use gst_data_queue_push_force for adding events to queue - This prevents locking on startup when a stream only has a single buffer - for one of the streams and mssdemux decides to push an EOS event right - after it. - -2013-08-08 13:32:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: use push_force when adding events to the dataqueue - This prevents deadlocks on startup on files that have only a very - large buffer for a stream and the queue is filled and will lock on - the eos event that is pushed after the buffer. As no buffers have yet - been pushed to other streams, the pipeline locks on preroll - -2013-07-30 15:17:23 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: support field encoding for interlaced video - https://bugzilla.gnome.org/show_bug.cgi?id=705144 - -2013-08-12 01:02:51 -0400 Alexandre Rostovtsev <tetromino@gentoo.org> - - * configure.ac: - neonhttpsrc: allow building with neon-0.30 - https://bugzilla.gnome.org/show_bug.cgi?id=705812 - -2013-08-12 12:27:33 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpenc.c: - srtp: Let packets through without touching them if no crypto or auth is set - -2013-08-12 12:27:16 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Refactor code a bit - Simplify the error handling case and get the packet push out of the if() - -2013-08-12 11:56:27 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Don't error on invalid packet, just drop it - -2013-08-07 15:01:33 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: Fix the SequenceLayer handling for advanced profile. - The Sequence Header Data Structure STRUCT_C for Advanced Profile - has only a one valid field which is the profile indicator. Don't - use the reserved fields for fps update like Simple/Main profile. - https://bugzilla.gnome.org/show_bug.cgi?id=705667 - -2013-08-07 14:52:43 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: Fix seq hdr STRUCT_A handling for advanced profile. - The Sequence Header Data Structure STRUCT_A for advanced profile - may be eight consecutive zero bytes.Don't try to override the - width and height values in this case. - https://bugzilla.gnome.org/show_bug.cgi?id=705667 - -2013-08-07 10:14:20 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/aiff/aiffparse.c: - aiffparse: fix SSND data size - AIFF chunk size does not include the chunk header size (8 bytes), so the - SSND data size is equal to the chunk size minus the SSND header size (8 - bytes). - https://bugzilla.gnome.org/show_bug.cgi?id=705675 - -2013-07-13 02:50:52 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * ext/hls/gsthlsdemux.c: - hlsdemux: add support for redirections - -2013-08-02 20:37:30 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/mpegdemux/Makefile.am: - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: send codec tag for each stream - -2013-08-10 21:34:10 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/uvch264demux.c: - tests: uvch264demux: send stream-start events and fix event order - -2013-08-10 21:33:36 +0100 Tim-Philipp Müller <tim@centricular.net> - - * sys/uvch264/gstuvch264_mjpgdemux.c: - uvch264mjpgdemux: fix event ordering - -2013-08-10 20:02:01 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/mplex.c: - tests: mplex: fix 'Got data flow before stream-start event' failure - -2013-08-10 19:54:57 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/mpeg2enc.c: - tests: mpeg2enc: fix 'Got data flow before stream-start event' failure - -2013-08-10 19:44:15 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/aiff/aiffparse.c: - aiffparse: fix CAPS query - Was causing criticals in decodebin/playbin because the caps - query done when exposing pads would return ANY caps. - -2013-08-10 19:43:41 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/aiff/aiffparse.c: - aiffparse: don't unref NULL buffer - -2013-08-07 19:08:33 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/aiff/aiffparse.c: - aiffparse: set missing layout field in srcpad caps - https://bugzilla.gnome.org/show_bug.cgi?id=705674 - -2013-08-07 17:28:29 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/aiff/aiffparse.c: - aiffparse: send start stream event - https://bugzilla.gnome.org/show_bug.cgi?id=705674 - -2013-08-06 16:53:37 +0100 Matthieu Bouron <matthieu.bouron@collabora.com> - - * gst/aiff/aiffparse.c: - aiffparse: fix buffers initialisation - https://bugzilla.gnome.org/show_bug.cgi?id=705674 - -2013-08-02 14:11:01 +0200 Lubosz Sarnecki <lubosz@gmail.com> - - * configure.ac: - build: add subdir-objects to AM_INIT_AUTOMAKE - Fixes warnings with automake 1.14. - https://bugzilla.gnome.org/show_bug.cgi?id=705350 - -2013-08-09 20:12:09 +0100 David Schleef <ds@schleef.org> - - * configure.ac: - * tests/check/Makefile.am: - tests: create/remove orc directory at proper time - Before automake creates .deps directories, and during distclean. - https://bugzilla.gnome.org/show_bug.cgi?id=705350 - -2013-08-09 20:10:35 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/Makefile.am: - * tests/check/elements/baseaudiovisualizer.c: - tests: fix build of baseaudiovisualizer test with subdir-objects option - https://bugzilla.gnome.org/show_bug.cgi?id=705350 - -2013-08-07 09:04:39 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Use slice type to determine if frame is keyframe - This is the same behaviour as pre-baseparse-refactoring - https://bugzilla.gnome.org/show_bug.cgi?id=705598 - -2013-08-03 14:20:47 +0200 Edward Hervey <edward@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Do not trigger caps update if we only have PPS updates - Updating caps results in downstream elements potentially reconfiguring themselves - (such as decoders). If we do this in the middle of keyframes, we would result - in those elements being reconfigured and handling garbage until the next keyframe. - Instead of this only send (potentially) new codec_data when we have *both* SPS and - PPS. - https://bugzilla.gnome.org/show_bug.cgi?id=705333 - -2013-07-31 11:56:39 -0700 David Schleef <ds@schleef.org> - - * gst/ivtc/gstivtc.c: - ivtc: quiet FIXME when it's not relevant - -2013-07-31 11:54:06 -0700 David Schleef <ds@schleef.org> - - * gst/ivtc/gstivtc.c: - ivtc: implement new edge-directed upsampling - -2013-08-03 18:07:30 +0100 Tim-Philipp Müller <tim@centricular.net> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: remove use of _XOPEN_SOURCE - Which causes problems when used with _GNU_SOURCE apparently, and it - seems it was only set because of usleep(), which we can just replace - with g_usleep() until we get rid of those entirely. - https://bugzilla.gnome.org/show_bug.cgi?id=705208 - -2013-08-02 15:12:17 +0200 Bernhard Miller <bernhard.miller@streamunlimited.com> - - * sys/bluez/gstavdtpsrc.c: - bluez: return GST_FLOW_EOS in avdtpsrc create when stream is EOF - Signed-off-by: Bernhard Miller <bernhard.miller@streamunlimited.com> - https://bugzilla.gnome.org/show_bug.cgi?id=705349 - -2013-08-01 11:01:03 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Look harder for next sync position - If ever we lose sync, we were just checking for the next 0x47 marker ... - which might actually happen within a mpeg-ts packet. - Instead check for 3 repeating 0x47 at the expected packet size interval, - which the same logic we use when we initially look for the packet size. - -2013-08-01 10:58:23 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Fix PCR LUT table - We were only resetting the first 512 values of the lookup table instead - of the whole 8192. - This resulted in any PCR PID over 0x0200 ... ending up taking the first PCR - table around :( - -2013-07-30 22:06:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: properly error out when manifest has no streams - Post an error message when the manifest is parsed and no valid streams - are found be activated and used. - Fixes #704308 - -2013-07-30 16:08:17 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsmux/mpegtsmux.c: - mpegts: private/teletext -> application/x-teletext - -2013-07-29 21:25:14 +0100 Tim-Philipp Müller <tim@centricular.net> - - * win32/common/config.h: - win32: update - -2013-07-29 21:24:51 +0100 Tim-Philipp Müller <tim@centricular.net> - - * .gitignore: - tests: ignore new example binaries - -2013-07-29 21:23:48 +0100 Tim-Philipp Müller <tim@centricular.net> - - * po/LINGUAS: - * po/el.po: - * po/hr.po: - * po/hu.po: - * po/nb.po: - * po/nl.po: - * po/sv.po: - * po/vi.po: - po: update translations - -2013-07-29 14:48:02 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - Back to development - -=== release 1.1.3 === - -2013-07-29 13:52:29 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-eglglessink.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.1.3 - -2013-07-29 13:52:24 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2013-07-29 12:17:57 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * gst/midi/midiparse.c: - midi: Fix handling of the SEGMENT query - -2013-07-29 12:14:08 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/mxf/mxfdemux.c: - gst: Don't swap start/stop for negative rates in the SEGMENT query - -2013-07-29 11:02:34 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Implement SEGMENT query - -2013-07-29 11:01:09 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Implement SEGMENT query - -2013-07-29 11:00:14 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/mxf/mxfdemux.c: - mxfdemux: Implement SEGMENT query - -2013-07-29 09:35:08 +0200 Edward Hervey <edward@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/eglgles/gstegladaptation_egl.c: - * ext/eglgles/gsteglglessink.c: - * ext/faac/gstfaac.c: - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/gstmpegdesc.c: - * ext/resindvd/gstpesfilter.c: - * ext/rsvg/gstrsvgdec.c: - * ext/smoothstreaming/gstmssdemux.c: - * ext/wayland/gstwaylandsink.c: - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst/audiofxbad/gstaudiochannelmix.c: - * gst/debugutils/gstwatchdog.c: - * gst/dvdspu/gstdvdspu.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintervideosrc.c: - * gst/ivtc/gstcombdetect.c: - * gst/ivtc/gstivtc.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstpesfilter.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/siren/gstsirendec.c: - * gst/siren/gstsirenenc.c: - * gst/videofilters/gstscenechange.c: - * gst/videofilters/gstvideodiff.c: - * gst/videofilters/gstzebrastripe.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/h263parse.c: - * sys/androidmedia/gstamc.c: - * sys/dvb/camapplicationinfo.c: - * sys/dvb/camconditionalaccess.c: - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpvideomemory.c: - all: Fix for GST_DISABLE_GST_DEBUG - Where applicable, remove methods that don't do anything different than - the default implementation. - -2013-07-29 08:46:39 +0200 Edward Hervey <edward@collabora.com> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-celt.xml: - * gst-plugins-bad.spec.in: - docs/spec: Really remove all mentions of CELT plugin - -2013-07-29 08:29:34 +0200 Edward Hervey <edward@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Show NALU string type in debug messages - If you know the NALU type by heart I tip my hat to you, for the rest of - us mere mortals this is a bit more helpful - -2013-07-29 08:28:17 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Remove unused macros - -2013-07-29 08:23:30 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Add more AC3 detection cases - ATSC ac3 streams are always guaranteed to be AC3 if EAC3 descriptor - is not present - If stream registration id is 'AC-3' then it's also guaranteed to be AC3. - Finally if AC3 descriptor is present it's guaranteed to be AC3. - Only silences a warning, but still. - -2013-07-29 08:20:10 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Flush out pending data on EOS - Ensures downstream elements (like decoders) really get all the data - -2013-07-29 08:18:24 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtspacketizer: More AFC flags - I should have put those in a previous commit. sorry :( - -2013-07-29 08:14:57 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/gstmpegdefs.h: - mpegdefs: Simplify PCR/PTS/DTS => GST conversion macros - We know we will not overflow 64 bits, therefore just use direct - multiplication/division instead of the scale method (trims usage from - 50 instruction calls to 2/3). - -2013-07-28 20:14:55 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst/dvdspu/gstspu-vobsub-render.c: - dvdspu: artifacts when rendering clipped spu - https://bugzilla.gnome.org/show_bug.cgi?id=705039 - -2013-07-28 18:28:30 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: do not update caps when bitrate changes - https://bugzilla.gnome.org/show_bug.cgi?id=705035 - -2013-07-28 14:22:38 -0700 David Schleef <ds@schleef.org> - - * REQUIREMENTS: - Fix URIs in REQUIREMENTS - -2013-07-28 13:12:32 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/Makefile.am: - * ext/celt/Makefile.am: - * ext/celt/gstcelt.c: - * ext/celt/gstceltdec.c: - * ext/celt/gstceltdec.h: - * ext/celt/gstceltenc.c: - * ext/celt/gstceltenc.h: - celt: remove, replaced by opus. - -2013-07-28 17:29:32 +0200 Olivier Crête <olivier.crete@collabora.com> - - * sys/uvch264/gstuvch264_mjpgdemux.c: - uvch264_mjpgdemux: Remove duplicated variables - -2013-07-28 17:25:10 +0200 Olivier Crête <olivier.crete@collabora.com> - - * sys/uvch264/gstuvch264_mjpgdemux.c: - uvch264_mjpgdemux: Don't unmap/unref buffer if it's pushed out as-is - -2013-07-26 18:33:00 +0000 Robert Krakora <rob.krakora@messagenetsystems.com> - - * sys/uvch264/gstuvch264_mjpgdemux.c: - uvcv4l2_mjpegdemux: Unmap buffer - https://bugzilla.gnome.org/show_bug.cgi?id=699517 - -2013-07-28 15:46:33 +0200 Christian Fredrik Kalager Schaller <uraeus@linuxrising.org> - - * gst-plugins-bad.spec.in: - Update spec file to be current - -2013-07-27 12:17:34 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: HDV only has mpeg 1 audio layer 2 - Set that accordingly on the caps - -2013-07-26 17:31:22 +0200 Edward Hervey <edward@collabora.com> - - * gst/asfmux/gstasfmux.c: - asfmux: Various debug argument fixes - mainly G_GUINT16_FORMAT to ... the right type (guint32 or guint8) - -2013-07-26 17:25:42 +0200 Edward Hervey <edward@collabora.com> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: Remove dead assignment - harder ? :) - -2013-07-26 13:20:27 -0700 David Schleef <ds@schleef.org> - - * ext/ladspa/gstladspa.c: - ladspa: initialize debug category earlier - You know, before it's used. - -2013-07-26 07:53:06 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/pesparse.c: - mpegtsdemux: Add more flag debugging for PES and TS packets - Helps with debugging issues. And also remove unused variable (opcr) - This will also allow us in the future to properly detect: - * random-access location (to enable keyframe observation and - potentially seeking - * discont location (to properly handle resets) - * splice location (to properly handle new stream changes) - -2013-07-24 17:49:59 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - codecparser: Make warnings more meaningful - By stating whether we don't have enough data or it's a corrupted - packet - -2013-07-24 17:49:23 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/pesparse.c: - pesparse: Demote a Warning - We actually now know what to do ... have a log message :) - -2013-07-25 15:06:12 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: avoid using clipped out buffers - If a buffer was entirely clipped out (ie, it's out of the segment - entirely), we'll end up with a NULL buffer, which we don't want - to process/dereference. - -2013-07-24 15:50:14 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: Remember requested seek rate and use it - The new seek handling re-creates the segment time information once it - has enough information after a seek. - The problem was that we'd completely ignore the requested rate. So store - that and use it in the newly created segment. - https://bugzilla.gnome.org/show_bug.cgi?id=694369 - -2013-07-24 09:18:43 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/atdec.c: - applemedia: atdec: destroy the queue if set_format fails - -2013-07-24 09:15:49 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/atdec.c: - applemedia: atdec: remove c++ style comments - -2013-07-24 09:11:59 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/atdec.c: - * sys/applemedia/atdec.h: - applemedia: atdec: 1st round of fixes - -2013-07-23 10:10:13 +0200 Edward Hervey <edward@collabora.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Fix codec_data handling - Set to sequence_offset so that _process_config accepts it. - (btw: seq_offset usage throughout this plugin is really dodgy) - https://bugzilla.gnome.org/show_bug.cgi?id=702806 - -2013-06-14 07:28:29 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Create and send codec tag - Helps with applications that rely on presence of that tag for user-facing - information. - https://bugzilla.gnome.org/show_bug.cgi?id=702216 - -2013-07-23 13:29:18 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/hls/gsthlsdemux.c: - hlsdemux: Implement pkcs7 unpadding - Every encrypted fragment will be a multiple of 128 bits, the last byte - contains the number of bytes that were added as padding in the end - and should be removed. - https://bugzilla.gnome.org/show_bug.cgi?id=701673 - -2013-07-23 10:30:39 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/atdec.c: - * sys/applemedia/atdec.h: - * sys/applemedia/plugin.m: - applemedia: add AudioToolbox based audio decoder - -2013-07-23 10:33:21 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * sys/decklink/gstdecklinksrc.cpp: - decklink: Add support for group-id in the stream-start event - -2013-07-23 10:31:27 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - mxfdemux: Add support for group-id in the stream-start event - -2013-07-23 10:24:22 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: Add support for group-id in the stream-start event - -2013-07-23 10:21:26 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/mpegtsparse.h: - tsparse: Add support for group-id in the stream-start event - -2013-07-23 10:15:58 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegdemux: Add support for group-id in the stream-start event - -2013-07-23 10:14:01 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/midi/midiparse.c: - * gst/midi/midiparse.h: - midiparse: Add support for group-id in the stream-start event - -2013-07-23 10:11:49 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: Add support for group-id in the stream-start event - -2013-07-23 10:09:38 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/gstmpegdemux.h: - resindvd: Add support for group-id in the stream-start event - -2013-07-23 10:07:24 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - hlsdemux: Add support for group-id in the stream-start event - -2013-07-23 10:04:42 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dash: Add support for group-id in the stream-start event - -2013-07-22 17:30:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlace: fix negotiation if filter caps are passed to query_caps - Make videotestsrc ! interlace ! $anything work again. Problem - was that upstream filter caps were passed which contained - interlace-mode=progressive, which doesn't intersect too well - with interlace's source pad template caps, leading to - not-negotiated errors. - -2013-07-22 14:56:32 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Don't abort on invalid streams - Just return an error - -2013-07-19 15:30:42 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/hls/Makefile.am: - * ext/hls/gstfragment.c: - * ext/hls/gstfragment.h: - hls: fix for assert failure when using encrypted HLS streams - When using an HLS encrypted stream, an assertion failure is thrown: - (gst-launch-1.0:31028): GLib-GObject-WARNING **: cannot register - existing type `GstFragment' - (gst-launch-1.0:31028): GLib-CRITICAL **: g_once_init_leave: assertion - `result != 0' failed - Eventually tracked this down to the call gst_fragment_new() - in function gst_hls_demux_decrypt_fragment. - The GstFragment class is defined in ext/hls/gstfragment.c and in - gst-libs/gst/uridownloader/gstfragment.c. Having two class definitions - with the same name causes the assert failure when trying to allocate - GstFragment. Deleting the version from hls and editing the - Makefile.am solves this assert failure. - https://bugzilla.gnome.org/show_bug.cgi?id=704555 - -2013-07-19 23:42:12 +0200 Youri Westerman <tetracon@gmail.com> - - * sys/decklink/gstdecklink.cpp: - decklink: actually enable decklinksink - https://bugzilla.gnome.org/show_bug.cgi?id=704505 - -2013-07-19 20:09:28 +0200 Youri Westerman <tetracon@gmail.com> - - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksink.h: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklink: add "device-number" to select from multiple devices - https://bugzilla.gnome.org/show_bug.cgi?id=704505 - -2013-07-22 10:46:23 +0200 Edward Hervey <edward@collabora.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Only map input buffer once - Instead of constantly map/unmapping it a bit everywhere, we pass along - to all functions the GstMapInfo. - Makes mpeg video frame parsing 6% faster - https://bugzilla.gnome.org/show_bug.cgi?id=702330 - -2013-03-10 12:07:40 +1300 Douglas Bagnall <douglas@paradise.net.nz> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: disentangle requested program number from active program number - The program_number attribute was overloaded, trying to indicate both - the currently playing program, and the program requested via the - "program-number" property. The end result was that setting the - property didn't work (see #690934). - I added a new requested_program_number field rather than reviving the - current_program_number field because it seemed this would result in - fewer changes overall and be less confusing. It breaks symmetry with - the "program-number" property, but it retains parallels with the likes - of program->program_number. - Because gst_ts_demux_reset is called after the properties have been - parsed, requested_program_number is initialised in gst_ts_demux_init. - Whether this is exactly the right place, I don't know. - -2013-03-06 12:15:47 +0100 Jesper Larsen <jesper.larsen@ixonos.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: fix program-number functionality - Setting the program-number property does not affect which program - is actually being demuxed. - Moving the initialization of the program_number from - gst_ts_demux_reset to gst_ts_demux_init seems to fix this issue. - https://bugzilla.gnome.org/show_bug.cgi?id=690934 - -2013-07-22 09:18:32 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/resindvd/gstmpegdemux.c: - resindvd: Send stream-start event before anything else on the mpeg demuxer srcpads - -2013-07-17 17:12:59 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: do not push discont buffers if they aren't discont - Explicitly unset discont flag when it shouldn't be set. - https://bugzilla.gnome.org/show_bug.cgi?id=682110 - -2013-07-17 11:28:28 +0200 Miguel Casas-Sanchez <miguelecasassanchez@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstgrabcut.cpp: - * ext/opencv/gstgrabcut.h: - * ext/opencv/gstopencv.c: - grabcut: Add GrabCut segmentation element - https://bugzilla.gnome.org/show_bug.cgi?id=702722 - -2013-07-15 23:01:31 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/videoparsers/h263parse.c: - h263parse: fix height extraction for H263p - -2013-07-15 22:57:06 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/h263parse.c: - * gst/videoparsers/h263parse.h: - h263parse: add pixel-aspect-ratio if upstream doesn't provide one - -2013-07-09 12:49:55 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: fix typo in check_queue_full function - It should return True when the queue IS full - Fixes #704226 - -2013-07-15 11:15:11 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Remember seek sequence number - * Avoids handling twice the same seek (can happen with playbin and files - with subtitles) - * Set the sequence number of the segment event to the sequence number of - the seek event that generated it (-1 for the initial one). - -2013-05-24 18:18:35 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: implement seeking in push mode - -2013-05-28 16:14:42 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: recalculate new segment after byte seek - The seeking start time is approximated from the seek offset in bytes - using the accumulated PCR observations, so on a VBR stream there might - be a big difference between the actual PCR and the estimated one after - the seek. This might result in a long wait to skip all out of segments - packets. - Instead we just recalculate the new segment to start at the first PTS - after the seek, so that playback starts immediatly. - -2013-07-13 23:49:44 +0100 Tim-Philipp Müller <tim@centricular.net> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * win32/common/config.h: - Update docs and win32 config.h to development version - -2013-07-12 15:58:33 +0100 Tim-Philipp Müller <tim@centricular.net> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-openal.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - docs: add newly-ported elements to docs - -2013-07-11 17:46:37 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Use sequence_display_extension values to update the src caps - The caps should always represent what the user is supposed to see. - So if there is a sequence_display_extension associated with the - stream then use the display_horizontal_size/display_vertical_size - to update the src caps (if they are less than the values provided - by sequence header). - https://bugzilla.gnome.org/show_bug.cgi?id=704009 - -2013-07-12 09:45:38 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ChangeLog: - * NEWS: - * RELEASE: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-eglglessink.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * gst/bayer/gstbayerorc-dist.c: - * gst/fieldanalysis/gstfieldanalysisorc-dist.c: - * win32/common/config.h: - Release 1.1.2 - Oops... should've been part of 1.1.2 tag already :( - -2013-07-11 16:57:20 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - Back to development - -=== release 1.1.2 === - -2013-07-11 16:31:22 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2013-07-10 12:28:38 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/mpegpsmux/mpegpsmux.c: - mpegpsmux: Send stream-start event before any data - -2013-07-08 08:44:43 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtsdemux: Avoid parsing section without enough data - This is actually a workaround (we'll be skipping the upcoming section) - This will only happen for sections where the beginning is located within - the last 8 bytes of a packet (which is the minimum we need to properly - identify any section beginning). - Later we should figure out a way to store those bytes and mark that - some analysis needs to happen. The probability of this happening is - too low for me to care right now and do that fix. There is a good chance - that section will eventually be repeated and won't end up on such border. - -2013-07-08 08:43:50 +0200 Edward Hervey <edward@collabora.com> - - * tests/examples/mpegts/ts-parser.c: - examples: Add BAT support to mpegts example - -2013-07-08 08:42:18 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gst-dvb-section.h: - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegts: Unify section checks and add BAT parsing - * Avoid repeating code everywhere, and instead provide all parsing - information in one go. - * Add BAT support - * Refine BAT/CAT identification (by adding PID checks) - -2013-07-07 11:42:50 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Avoid vmethod calls - Depending on usage, tsparse and tsdemux might not need to be called - when new section/pes-data is available. - -2013-07-07 10:25:27 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/mpegtsparse.c: - mpegtsdemux: Remove unneeded variables - * packet.origts is no longer used since the PCR refactoring done ages ago - * known_packet_size is a duplicate of packet_size != 0 - * caps was never used outside of the packetizer - -2013-07-09 11:39:46 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parser: fix size caps to report cropped dimensions. - Restore the original h264parser behaviour to report cropped dimensions - in size caps. - https://bugzilla.gnome.org/show_bug.cgi?id=694068 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-07-08 18:44:24 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix calculation of the frame cropping rectangle. - Fix calculation of the frame cropping rectangle, and more precisely - the actual cropped height. The frame_crop_top_offset subtraction - was not scaled up with SubHeightC. - Also clean-up variables to align more with (7-18) to (7-21). - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-02-15 14:18:49 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - h264parser: Parse the cropping-rectangle separately. - Assign the un-cropped width/height to sps->width/sps->height - during sps header parsing. Added new fields to SPS header structure - to provide the crop-rectangle dimensions. - https://bugzilla.gnome.org/show_bug.cgi?id=694068 - -2013-07-03 16:38:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: implement queue full check function - Checks if the queue is full according to max buffering time - set by the user - https://bugzilla.gnome.org/show_bug.cgi?id=701404 - -2013-07-09 00:47:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: minor refactor - Split one very large function into 2 smaller but still large functions. - Also change the if conditions to positive checks to improve readability. - -2013-07-08 23:24:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: handle live playback resync - During a live stream it is possible for dashdemux to lag behind on a - slow connection or to rush ahead of the connection os too fast. - For the first case it is necessary to jump some segments ahead to be able to - continue playback as old segments are usually deleted from the server. - For the later, dashdemux should wait a little before attempting another - download do give time to the server to produce a new segment - -2013-07-05 13:22:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: fix template based segment generation - When using a template based segment list, do not try to - contruct a finite segment list for the limits of the available periods. - We might not know when the period ends (for live streams) and we can - always create the segment on demand when requested by dashdemux, - avoiding use of some memory and cpu when re-creating this list. - -2013-07-04 23:42:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: use more appropriate data structures for parsing - Replaces the 2 likely larger lists with more appropriate structures - to improve performance. - Replaces S nodes GList for a GQueue, this reduces latency to startup - because of traversing the list just append an element. - Replaces the processed media segments GList for a GPtrArray as it is - constantly acessed by index during playback. - -2013-07-04 15:14:00 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: answer to latency queries - Set live if stream is live and also add to the max latency the - max internal buffering - -2013-07-08 22:01:58 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: fix crash when download is null - Do no try to unref a NULL download attribute - -2013-07-08 22:00:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: do not set cancelled unless explicitly called by user - Cancelled is a 'permanent' state of the uridownloader and is only - removed by a call to _reset. When a download fails we just want to - return NULL on the fetch function and leave the downloader ready - for another fetch, otherwise the user has to call _reset after - failed downloader, even when it didn't call _cancel. - -2013-07-07 08:35:02 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegts: Avoid false-positives in section type detection - Due to the variety of section types out there, we need to add - some checks when identifying section types. - We check here that the PID is also consistent with the table_id. - -2013-07-07 08:29:37 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtsdemux: Fix multiple-SI detection/parsing - We had two issues with the previous code: - 1) We were badly handling PUSI-flagged packets. We were discarding the - initial data (if pointer != 0) whereas we should have been accumulating - it with the previous data (if there was a continuity of course). - => First series of information loss - 2) We were not checking whether there were more sections after the end - of one (i.e. when the following byte was not a stuff byte). - This fixes those two issues. - Fixes #677443 - https://bugzilla.gnome.org/show_bug.cgi?id=677443 - -2013-07-07 07:21:46 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtbase: Fix switch/case typo - Ended up trying to analyze PMT ... with a PAT :( - -2013-07-06 14:50:52 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Handle private section streams - Until now we simply ignored those streams (since we couldn't do anything - with it anyway). Now that we have the mpegts library and we offload the - section handling to the application side we can properly identify and - extract them. - By default it is disabled for tsparse and enabled for tsdemux, but there is - a property to change that. - This should open the way to properly handle all private section streams, - including: - * DSM-CC - * MHEG - * Carousel data - * Metadata streams (though I haven't seen any of those in the wild) - * ... And all other specs/protocols making use of those - Partially fixes #560631 - -2013-07-06 12:39:49 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - * tests/examples/mpegts/ts-parser.c: - mpegts: Properly handle UTC time in sections - * don't unref inexistant GstDateTime - * Fine-tune hour/min/sec BCD reading code - * Update example code accordingly - -2013-07-06 10:59:08 +0200 Edward Hervey <edward@collabora.com> - - * tests/examples/mpegts/ts-parser.c: - examples: Registration descriptor support - And output the length of the descriptors - -2013-07-06 10:38:26 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - mpegts: Fix NIT parsing - The size checks were wrong. The smallest size for a NIT is 16 bytes - (12 for the smallest content + 4 for crc) and the smallest size for - a inner stream loop is 6 bytes (without any descriptors). - Also remove FIXME that has already moved elsewhere - -2013-07-06 10:36:33 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Handle registration descriptor for programs and streams - * Allows us to simplify some code and prepare for future cleanups. - * Remove useless casts - * Add some FIXME regarding VC1 - -2013-07-05 21:49:48 +0200 Piotr Drąg <piotrdrag@gmail.com> - - * po/POTFILES.in: - * po/POTFILES.skip: - po: update POTFILES - https://bugzilla.gnome.org/show_bug.cgi?id=703683 - -2013-07-05 11:20:49 -0600 Brendan Long <b.long@cablelabs.com> - - * gst/subenc/gstwebvttenc.c: - webvttenc: Separate cues with two line breaks instead of one. - See http://dev.w3.org/html5/webvtt/#syntax - https://bugzilla.gnome.org/show_bug.cgi?id=703673 - -2013-07-05 18:33:42 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - codecparsers: mpeg2: fix video packet header size checks. - Fix video packet header size checks for: - - Sequence Header: 64 bits ; - - Sequence Scalable Extension: 10 bits ; - - Slice Header: 6 bits. - https://bugzilla.gnome.org/show_bug.cgi?id=703668 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-07-05 14:58:25 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - codecparsers: mpeg2: add missing gtk-doc entries. - The following functions were missing gtk-doc entries: - - gst_mpeg_video_parse_sequence_display_extension - - gst_mpeg_video_finalise_mpeg2_sequence_header - - gst_mpeg_video_quant_matrix_get_raster_from_zigzag - - gst_mpeg_video_quant_matrix_get_zigzag_from_raster - https://bugzilla.gnome.org/show_bug.cgi?id=703667 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-01-31 11:57:54 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * tests/check/libs/mpegvideoparser.c: - codecparsers: mpeg2: update test program with new GstMpegVideoPacket API. - This is the lost hunk from: - https://bugzilla.gnome.org/show_bug.cgi?id=692933 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-01-30 16:56:15 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: mpeg2: add slice header parsing API. - Add API to parse the Slice header. This also calculates the macroblock - position as specified in 6.3.16. - https://bugzilla.gnome.org/show_bug.cgi?id=664274 - Signed-off-by: Sreerenj Balachandran <sreerenj.balachandran@intel.com> - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-01-25 15:48:58 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: mpeg2: add sequence scalable extension parsing API. - Add API to parse the Sequence Scalable Extension header. - https://bugzilla.gnome.org/show_bug.cgi?id=664274 - Signed-off-by: Sreerenj Balachandran <sreerenj.balachandran@intel.com> - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-07-04 14:22:14 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: cope with new parser API. - Migrate the code to use the new parser API based on GstMpegVideoPacket. - Also try to optimize gst_mpegv_parse_process_config() by using more of - GstMpegVideoPacket and determining the extension_start_code_identifier - prior to calling the parser function for that extension packet. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-01-31 11:57:54 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: mpeg2: add new API that takes GstMpegVideoPacket arguments. - Add new interface to MPEG-2 video parser that takes GstMpegVideoPacket - arguments instead of data, size, and offset. New functions are called - after gst_mpeg_video_packet_*() and provide the default implementation. - Older API is moved to the deprecated namespace and uses the new functions. - https://bugzilla.gnome.org/show_bug.cgi?id=692933 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-07-05 16:46:42 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Remove no-longer needed code - Since we now send all sections to the packetizer, we no longer need to do - anymore in-depth checks for the validity of a section. - The choice boils down to: - 1) Is it from a known PES pid ? If so pass it on (which might be just pushing - downstream in the case of tsparse, or accumulating PES data for tsdemux) - 2) Is it from a known SI pid ? If so pass it to the section packetizer - -2013-07-05 13:53:06 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/dvbbasebin.c: - dvb: Fix PMT handling - Was using an older (temporary) version of the mpegts library API. - -2013-07-05 10:57:34 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtsdemux: Fix compilation with debugging disabling - We previously weren't using that variable ... - -2013-07-04 08:43:37 +0200 Edward Hervey <edward@collabora.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gst-dvb-section.c: - * gst-libs/gst/mpegts/gst-dvb-section.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - mpegts: Improve documentation - * Add a base page for the library - * Add pages for the base MPEG-TS section and descriptors - * Add pages for the known variants - * Add documentation on more fields/sections/types - * Remove some fixmes that were ... fixed - -2013-07-04 07:49:37 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Switch to using GstMpegTsStreamType - We still have some other stream types which haven't been ported, but - we will do so once we have defined the enums in the mpegts library. - Also add some FIXMEs regarding items discovered during analysis - -2013-07-04 07:48:10 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - mpegtsdescriptor: Fix handling of unknown stream encodings - If we cannot identify the encoding used for a string, return a NULL - string instead of garbage and add a FIXME so we can detect and later - fix it. - -2013-07-04 07:45:12 +0200 Edward Hervey <edward@collabora.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * tests/examples/mpegts/ts-parser.c: - mpegts: Add registered mpeg-ts stream types - These are the values officially registered in the base specification - (H.222.0/13818-1). Later on we can add other enums for other variants - Note that the enum is not used in the structure fields (such as a pmt - stream stream_type field) since it can contain values from other - variants. - -2013-07-04 02:12:30 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/examples/camerabin2/Makefile.am: - camerabin: examples: add missing lib to makefile - Fixes initialization of sample application - -2013-07-03 19:11:45 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstmpdparser.c: - dashdemux: prevent assertion when duration is unknown - Duration from segment being unknown is a issue from the MPD and not - a programming issue, so the assert isn't useful here. Instead check - and return an error code so the caller can fallback to alternatives - -2013-07-03 19:11:11 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix event leak when parsing manifest fails - Always remember to unref the event before proceeding, in both success - and failure cases - -2013-07-03 12:30:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: various cleanups - Removing unused function, replacing // comments with /* */ and - replacing some GST_WARNING with GST_INFO/_DEBUG as they are meant - to be - -2013-06-11 14:28:53 +0100 Alex Ashley <bugzilla@ashley-family.net> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: Change first fragment selection for live streams - When dashdemux selects its first fragment, it always selects the - first fragment listed in the manifest. For on-demand content, - this is the correct behaviour. However for live content, this - behaviour is undesirable because the first fragment listed in the - manifest might be some considerable time behind "now". - The commit uses the host's idea of UTC and tries to find the - oldest fragment that contains samples for this time of day. - https://bugzilla.gnome.org/show_bug.cgi?id=701509 - -2013-07-03 18:52:18 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/Makefile.am: - * gst-libs/gst/mpegts/gst-dvb-descriptor.c: - * gst-libs/gst/mpegts/gst-dvb-descriptor.h: - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/mpegts.h: - mpegts: split dvb descriptors/enums into a separate file - We will do the same once we have ATSC/ISDB/... descriptor parsing - -2013-07-03 18:44:54 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/mpegts/gst-dvb-section.c: - * tests/examples/mpegts/ts-parser.c: - mpegts: Fix TOT section parsing - And use it in example - -2013-07-03 18:00:55 +0200 Edward Hervey <edward@collabora.com> - - * tests/examples/mpegts/ts-parser.c: - examples: Fix a leak - -2013-07-03 17:59:02 +0200 Edward Hervey <edward@collabora.com> - - mpegts: Split files and implement free functions - * In order to avoid future clashing between table_id for the various - mpeg-ts variants, use different enums. - * In order to keep everything clean(ish) and allow for cleaner growth, - split into different files (will need the same for descriptors later) - * Also ... implement free functions for all table types :) - -2013-07-03 15:30:01 +0200 Edward Hervey <edward@collabora.com> - - * win32/common/config.h: - win32: back to feature development - -2013-07-03 10:16:29 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstmpdparser.c: - dashdemux: only generate index segment uri if there is a template - Simple fix to avoid an assertion. - -2013-06-21 17:09:30 -0600 Greg Rutz <greg@gsr-tek.com> - - * ext/dash/gstmpdparser.c: - dashdemux: Implement inheritance for certain MPD elements - According to the MPEG-DASH spec, certain elements (i.e. - SegmentBase, SegmentTemplate, and SegmentList) should inherit - attributes from the same elements in the containing AdaptationSet - or Period. - Updated the SegmentBase, SegmentTemplate, and SegmentList parsers - to properly inherit attributes from the corresponding elements in - AdaptationSet and/or Period. - https://bugzilla.gnome.org/show_bug.cgi?id=702677 - -2013-06-21 15:51:46 -0600 Greg Rutz <greg@gsr-tek.com> - - * ext/dash/gstmpdparser.c: - dashdemux: Properly detect presence of xml attributes - Convert all xml attribute/content parsing functions to return a - boolean value indicating whether or not the attribute/content was - present. We need this finer-grained control in order to properly - implement the inheritance policies described in the spec - Also fixed several memory leak conditions when handling errors in - the xml attribute/content parsing functions. - https://bugzilla.gnome.org/show_bug.cgi?id=702677 - -2013-07-02 21:31:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstmpdparser.c: - dashdemux: change debug message from warning to info - It isn't a warning/issue. - -2013-07-02 21:28:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstmpdparser.c: - dashdemux: protect from access to empty list data - Check if the list has elements before trying to access the last one - and causing a segfault - -2013-07-02 23:16:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: Simplify locking to fix deadlocks - Use object lock to protect variables from concurrent access and - use download_lock to only allow one download running - -2013-07-02 16:04:45 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: protect against failed header downloads - Avoids criticals when downloaded fragment is NULL - -2013-07-03 13:59:04 +0200 Edward Hervey <edward@collabora.com> - - * tests/examples/mpegts/ts-parser.c: - examples: GstMpegTS => GstMpegTs - -2013-07-03 13:57:57 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/camconditionalaccess.c: - * sys/dvb/camconditionalaccess.h: - * sys/dvb/camdevice.c: - * sys/dvb/camdevice.h: - * sys/dvb/camswclient.c: - * sys/dvb/camswclient.h: - * sys/dvb/camutils.c: - * sys/dvb/camutils.h: - * sys/dvb/dvbbasebin.c: - dvb: GstMpegTS => GstMpegTs - -2013-07-03 13:57:38 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: GstMpegTS => GstMpegTs - -2013-07-03 13:56:22 +0200 Edward Hervey <edward@collabora.com> - - * docs/libs/gst-plugins-bad-libs.types: - * gst-libs/gst/mpegts/Makefile.am: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - libs/mpegts: Rename GstMpegTS => GstMpegTs - Sorry for this :( But this makes it more in sync with expected type - naming in gobject (i.e. CamelCase and not CamelMAYBECase). - Also split descriptor type enums into the different variants: - * ISO H.222.0 / 13818-1 (i.e. standard mpeg-ts) - * DVB - * ATSC - * ISDB - * miscellaneous - This will avoid future clashes when specs use the same descriptor type - -2013-07-01 08:35:26 +0200 Edward Hervey <edward@collabora.com> - - * configure.ac: - * tests/examples/Makefile.am: - * tests/examples/mpegts/Makefile.am: - * tests/examples/mpegts/ts-parser.c: - examples: Add an example of a mpeg-ts SI extractor - Serves as an example of usage of the new mpegts library from an - application. - Will parse/dump all sections received on a bus. - Usage is ./tsparse <any gst-launch line using tsdemux or tsparse> - Examples: - ./tsparse file:///some/mpegtsfile ! tsparse ! fakesink - ./tsparse dvb://CHANNEL ! tsparse ! fakesink - ./tsparse playbin uri=dvb://CHANNEL - ./tsparse playbin uri=file:///some/mpegtsfile - ... - https://bugzilla.gnome.org/show_bug.cgi?id=702724 - -2013-06-23 08:44:08 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/Makefile.am: - * sys/dvb/camconditionalaccess.c: - * sys/dvb/camconditionalaccess.h: - * sys/dvb/camdevice.c: - * sys/dvb/camdevice.h: - * sys/dvb/camswclient.c: - * sys/dvb/camswclient.h: - * sys/dvb/camutils.c: - * sys/dvb/camutils.h: - * sys/dvb/dvbbasebin.c: - dvb: Switch to MPEG-TS SI library - Also serves as an example of using mpegts library from a plugin - https://bugzilla.gnome.org/show_bug.cgi?id=702724 - -2013-06-23 08:43:23 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/gstmpegdesc.c: - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/gsttsdemux.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/pesparse.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Switch to MPEG-TS SI library - * Only mpeg-ts section packetization remains. - * Improve code to detect duplicated sections as early as possible - * Add FIXME for various issues that need fixing (but are not regressions) - https://bugzilla.gnome.org/show_bug.cgi?id=702724 - -2013-06-23 08:41:12 +0200 Edward Hervey <edward@collabora.com> - - * configure.ac: - * docs/libs/Makefile.am: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/mpegts/Makefile.am: - * gst-libs/gst/mpegts/gstmpegts-private.h: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: - * gst-libs/gst/mpegts/gstmpegtsdescriptor.h: - * gst-libs/gst/mpegts/gstmpegtssection.c: - * gst-libs/gst/mpegts/gstmpegtssection.h: - * gst-libs/gst/mpegts/mpegts.h: - gst-libs: New Mpeg-TS support library - Exposes various MPEG-TS (ISO/IEC 13818-1) and DVB (EN 300 468) Section - Information as well as descriptors for usage by plugins and applications. - This replaces entirely the old GstStructure-based system for conveying - mpeg-ts information to applications and other plugins. - Parsing and validation is done on a "when-needed" basis. This ensures - the minimal overhead for elements and applications creating and using - sections and descriptors. - Since all information is made available, this also allows applications - to parse custom sections and descriptors. - Right now the library is targeted towards parsing, but the structures - could be used in the future to allow applications to create and inject - sections and descriptors (for usage by various mpeg-ts elements). - https://bugzilla.gnome.org/show_bug.cgi?id=702724 - -2013-06-10 18:01:14 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - dashdemux: Handle case without an initialization segment - If no initialization segment is defined, then don't print a - critical or a warning, just ignore it. - https://bugzilla.gnome.org/show_bug.cgi?id=701961 - -2013-07-01 18:22:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstmpdparser.c: - dash: save 1 or 2 string copies when getting fragment uris - Only create new string if required, saving maybe 1 or 2 str copies per - fragment. - -2013-07-01 18:15:43 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * docs/libs/Makefile.am: - docs: add uridownloader lib to gtk-doc libs - fixes runtime linking error on windows - -2013-07-01 17:50:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: each fragment can have its own index - Return index URI/range to dashdemux from the mpdparser to be able - to download and deliver them downstream for playback. - -2013-07-01 13:19:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: handle top-level index urls - Parse and provide access to top-level index segments if available. - dashdemux should push those whenever a header is pushed. - Fixes #700489 - -2013-05-06 17:08:54 -0400 Arthur Shipkowski <art@videon-central.com> - - * ext/dash/gstmpdparser.c: - dashdemux: Fix critical error output when Initialization has no URL - Issue evinced by - http://yt-dash-mse-test.commondatastorage.googleapis.com/car-20120827-manifest.mpd - which produces output like ** (gst-launch-1.0:8060): CRITICAL **: - gst_mpdparser_get_initializationURL: assertion `InitializationURL->sourceURL - != NULL' failed - https://bugzilla.gnome.org/show_bug.cgi?id=700489 - -2013-07-01 14:35:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstmpdparser.c: - dashdemux: prevent crash by checking if the segment node is present - Do not try to access range data if there is no segment node - -2013-06-25 18:34:13 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/Makefile.am: - * ext/dash/gstdash_debug.h: - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - dash: use same debug category for dashdemux and the mpd parser - Makes debugging easier - -2013-06-20 03:52:31 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: add support for range based segments - Use the mediaRange information and pass it to the uridownloader - to correctly download only the segment ranges indicated in the - MPD - https://bugzilla.gnome.org/show_bug.cgi?id=702206 - -2013-06-19 18:28:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - * gst-libs/gst/uridownloader/gsturidownloader.h: - uridownloader: add support for range based downloads - Adds a new API gst_uri_downloader_fetch_uri_with_range that allows - downloading only a byte range from an URI. It uses a seek event - sent to the source to signal the range to be downloaded. - https://bugzilla.gnome.org/show_bug.cgi?id=702206 - -2013-03-09 01:49:23 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: Fix the return value type for the SEI palyload parsing methods. - The return value type of SEI payload parsing functions - are GstH264ParserResult. - https://bugzilla.gnome.org/show_bug.cgi?id=695475 - -2013-06-28 20:15:08 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpenc.c: - srtp: Don't require a key if both auth and cipher are null - -2013-06-28 20:32:36 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/Makefile.am: - * ext/srtp/gstsrtp.c: - * ext/srtp/gstsrtp.h: - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpenc.h: - srtp: Move the enums to the common header - The types are used in both the encoder and decoder - -2013-06-28 20:13:38 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpenc.c: - srtp: Remove unused code - -2013-06-28 12:25:59 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/frei0r/gstfrei0r.c: - frei0r: add the build prefix path in the search dirs - -2013-06-25 10:26:24 -0600 Greg Rutz <greg@gsr-tek.com> - - * ext/dash/gstmpdparser.c: - dashdemux: Cleanup memory allocation/deallocation - Ensure that g_free/xmlFree is used correctly based on how the - memory was allocated. - When deallocating GLists, there were many places that were using - g_list_foreach and g_list_free. Converted these occurrences to - call g_list_free_full. - Add NULL checks to all xmlFree calls since the documentation does - not guarantee that passing NULL is safe - In places where we are strdup'ing memory allocated by libxml2, - changed those calls to use xmlMemStrdup(). - There were several places where we were missing g_slice_free when - deallocating a top-level node structure. - https://bugzilla.gnome.org/show_bug.cgi?id=702837 - -2013-06-24 13:02:40 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/gstmpegdesc.h: - mpegdesc: Extend list of known descriptors - Add the various ATSC ones - -2013-06-24 08:24:58 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Only warn for added streams when needed - We use add_stream(stream_type:-1) to ensure a programs' PCR Stream is - also taken into account. For most programs this will re-use an - existing ES stream. - So only warn that we are re-adding a stream if it was already present - AND it is not to ensure the PCR stream is taken into account. - -2013-06-23 15:12:58 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Speed up section parsing - Only create subtables when needed. It was previously creating one every - single time ... to check if one was present. - And speed up code to detect whether a subtable was already present or not. - Overall makes section pushing 2 times faster. - -2013-06-24 07:40:20 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/gstmpegdesc.h: - mpegdesc: Extend list of known descriptors - From ITU-T H222.0 (06/2012). Freely available from itu.int - -2013-06-23 15:26:14 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtspacketizer: Speedup packet parsing - Avoid using bitshifting where not needed. - Speeds up packet parsing by 3% (this is *the* hotspot of mpeg-ts elements). - -2013-06-22 08:57:12 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst-libs/gst/codecparsers/gstmpeg4parser.h: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - codecparsers: Fix gtk-doc - Detected by initial pre-run of gi-scanner. - -2013-06-23 11:29:23 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/daala/gstdaala.c: - * ext/daala/gstdaaladec.c: - * ext/daala/gstdaaladec.h: - daaladec: Add decoder element - -2013-06-23 10:04:29 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - * ext/daala/gstdaala.c: - * ext/daala/gstdaalaenc.c: - * ext/daala/gstdaalaenc.h: - daalaenc: Add encoder element - -2013-06-22 11:27:37 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - * ext/Makefile.am: - * ext/daala/Makefile.am: - * ext/daala/gstdaala.c: - * ext/daala/gstdaaladec.c: - * ext/daala/gstdaaladec.h: - * ext/daala/gstdaalaenc.c: - * ext/daala/gstdaalaenc.h: - daala: Initial version of a Daala plugin - -2013-06-23 09:05:29 +0200 Edward Hervey <edward@collabora.com> - - * ext/srtp/Makefile.am: - srtp: Fix dist - The enums should not be dist-ed and instead be re-generated when - compiling. - -2013-06-19 20:39:54 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtspacketizer: Better detect already seen section - In some cases (NIT on highly-populated DVB-C operator for example), there - will be more than one section emitted for the same subtable and version - number. - In order not to lose those updates for the same version number, we checked - against the CRC of the previous section we parsed. - The problem is that, while it made sure we didn't lose any information, it - also meant that if the same section came back (same version, same CRC) later - on we would re-process it, re-parse it and re-emit it. - This version improves on that by keeping a list of previously observed CRC - for identical PID/subtable/version-number and will only process sections if - they really were never seen in the past (as opposed to just before). - On a 30s clip, this brings down the number of NIT section parsing from 4541 - down to 663. - https://bugzilla.gnome.org/show_bug.cgi?id=614479 - -2013-06-20 22:12:11 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * configure.ac: - * sys/Makefile.am: - * sys/winscreencap/Makefile.am: - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstdx9screencapsrc.h: - * sys/winscreencap/gstgdiscreencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.h: - * sys/winscreencap/gstwinscreencap.h: - winscreencap: Initial port to 1.0 - -2013-06-20 09:52:31 +0200 Xavi Artigas <xartigas@fluendo.com> - - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Fix copying of raw video frames on Samsung Galaxy S3 with Exynos 4 SOC - -2013-06-19 12:52:52 -0700 Aleix Conchillo Flaque <aleix@oblong.com> - - * sys/shm/gstshmsink.c: - shmsink: unref buffer if no clients are connected - If no client has received the command, unref the buffer. This will - make sure that the shared memory area does not get filled with buffers - no one knows about. - https://bugzilla.gnome.org/show_bug.cgi?id=702684 - -2013-06-19 19:29:27 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Speed up NIT parsing - Avoid duplicating the delivery structure, and instead give it to the - receiving container. - -2013-06-07 12:53:08 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtbase: simplify code - We don't need generic methods for push/flush since we know all the - subclass that we control - -2013-06-05 15:51:58 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/gstmpegdesc.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Fix for compiling without GST_DEBUG - Protect debug-only variables/usage, and in one case remove a useless - variable. - -2013-06-17 08:15:54 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/mpegtsparse.h: - tsparse: Ensure initial events are sent in the right order - First send stream-start, then caps, then segment. - The segment we push is from upstream in push-mode. If we work in pull-mode - then we initialize the base segment to BYTES. - https://bugzilla.gnome.org/show_bug.cgi?id=702422 - -2013-06-18 12:29:41 -0700 Aleix Conchillo Flaque <aleix@oblong.com> - - * sys/shm/gstshmsink.c: - shmsink: propagate events to basesink class - https://bugzilla.gnome.org/show_bug.cgi?id=702597 - -2013-06-18 13:47:54 +0200 Benjamin Gaignard <benjamin.gaignard@linaro.org> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/waylandpool.c: - wayland: Add support for RGBx and RGBA formats - Wayland interface could offer two buffers pixels formats: WL_SHM_FORMAT_XRGB8888 and WL_SHM_FORMAT_ARGB8888. - Update waylandsink to support them and check if the format is really available. - https://bugzilla.gnome.org/show_bug.cgi?id=702112 - -2013-06-18 12:46:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/opencv/Makefile.am: - opencv: fix CFLAGS order and add plugins base libs includes to CXXFLAGS - https://bugzilla.gnome.org/show_bug.cgi?id=702297 - -2013-06-15 00:12:18 +0200 Alban Browaeys <prahal@yahoo.com> - - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstsegmentation.h: - opencv: fixes build by moving the c++ header to gstsegmentation.cpp - Fixes: - In file included from gstsegmentation.h:51:0, - from gstopencv.c:42: - /usr/include/opencv2/video/background_segm.hpp:47:16: fatal error: list: - No such file or directory - #include <list> - ^ - compilation terminated. - https://bugzilla.gnome.org/show_bug.cgi?id=702297 - -2013-06-18 13:33:14 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: fix release of null pointer - -2013-06-18 13:17:52 +0200 Thiago Santos <thiago.sousa.santos@collabora.com> - - * sys/applemedia/coremediabuffer.c: - applemedia: coremediabuffer: fix leaking of apple media structs - remember to release the apple's api buffers to avoid huge leaking - -2013-06-18 13:02:42 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/Makefile.am: - applemedia: move defines to CPPFLAGS for obj-c files - -2013-06-11 11:54:41 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - dshowaudiosrc: fix audiocapture producing silence - Configure the capture latency using the IAMBufferNegotiation - interface and try to respect the configured latency-time and buffer-time - -2013-06-14 14:52:07 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Make sure the buffer is writable before we add the MPEG video meta - https://bugzilla.gnome.org/show_bug.cgi?id=702174 - -2013-06-13 13:34:37 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * sys/applemedia-nonpublic/Makefile.am: - * tests/examples/camerabin2/Makefile.am: - build: Fix some automake warnings - -2013-05-27 22:22:32 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/mpegtsdemux/mpegtspacketizer.c: - tsdemux: fix M2TS stream resync - Sync byte scan is incorrect for M2TS streams because the timestamp 4 - bytes were not included in the flush size. This can result in an - infinite loop. - Rework the scan code to be clearer and work in all cases. - -2013-05-24 10:59:55 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: move some debug prints at the log level - -2013-05-24 10:59:59 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: fixes seeking in pull mode - Preserve the current segment and observations in pull mode seeks with - flushing. - https://bugzilla.gnome.org/show_bug.cgi?id=698050 - -2013-06-11 19:45:31 +0200 Patricia Muscalu <patricia@axis.com> - - * ext/curl/gstcurlsmtpsink.c: - curlsmtpsink: removed an incorrect assert - https://bugzilla.gnome.org/show_bug.cgi?id=702036 - -2013-06-11 14:32:43 +0200 Miguel Casas-Sanchez <miguelecasassanchez@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstopencv.c: - * ext/opencv/gstsegmentation.cpp: - * ext/opencv/gstsegmentation.h: - opencv: add foreground/background segmentation element - Add an element to the opencv plugin for foregroung/background image - sequence segmentation, using one out of 3 algorithms. - https://bugzilla.gnome.org/show_bug.cgi?id=701421 - -2013-06-10 17:00:42 +0200 Hans de Goede <hdegoede@redhat.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Add video-source-filter during construction - By adding the video-source-filter during construction time, rather then - patching it in later (*), we can greatly reduce the amount of caps involved - in negotation, speeding up pipeline creation. - I wrote this while working on speeding up the startup of cheese. My cheese - has been modified to add a capsfilter, filtering for only the configured - resolution, with that cheese patch + this patch, the pipeline creation time - goes from aprox 1.1 seconds to aprox 350ms. This is with a Logitech 9000 - pro camera, which supports lots of different resolutions at many different - framerates per resolution, causing a caps "explosion" if not filtered. - *) Note the code for this is left in, as it is still necessary if the - video-source-filter is changed between a stop + re-start. - https://bugzilla.gnome.org/show_bug.cgi?id=701953 - -2013-06-10 18:00:13 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Make gst-indent happy - -2013-06-10 10:05:56 +0200 Hans de Goede <hdegoede@redhat.com> - - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Don't unset the video-source property on pipeline start - check_and_replace_src() was setting self->app_vid_src to NULL, which - means that an app setting the video-source property, and then starting, - stopping and re-starting the pipeline (ie to make changes to the - video-source-filter property) would after the restart no longer have - a video-source. - This patch fixes this by making gst_camerabin_setup_default_element return a - ref to the passed in user_element, rather then returning the user_element as - is, so that that ref can be passed on to the bin, and the app_vid_src ref - stays valid. - https://bugzilla.gnome.org/show_bug.cgi?id=701915 - -2013-06-08 14:48:03 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * ext/eglgles/gstegladaptation_egl.c: - eglglessink: Remove workaround for a bug in the RPi EGL implementation - It's fixed in the latest firmware since a few weeks. - -2013-05-06 16:56:01 -0400 Arthur Shipkowski <art@videon-central.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix issue with get returning a value for max-buffering-time - It was not properly divided by GST_SECONDS. Also fix issue with - max-buffering-time being multiplied by GST_SECONDS every time the - property is retrieved. - https://bugzilla.gnome.org/show_bug.cgi?id=700487 - -2013-06-07 15:18:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/librfb/Makefile.am: - rfb: Link with libgstbase for GstPushSrc - -2013-06-07 14:01:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Fix string comparison - -2013-04-04 18:22:52 +0200 Alban Browaeys <prahal@yahoo.com> - - * gst/mpegdemux/gstpesfilter.c: - mpegdemux: accept ID_PRIVATE_STREAM_1 to avoid loosing sync - Current fallback to lost_sync seems to impede a delay to restore - sync. Let the parser parse and skip the private stream. - Here it contains the digital camera brand (in 2010 bytes) - and is repeated twice. - https://bugzilla.gnome.org/show_bug.cgi?id=697283 - -2013-06-07 12:10:08 +0200 Ilya Smelykh <ilya.smelykh@gmail.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Wait until SPS/PPS before outputting any data - https://bugzilla.gnome.org/show_bug.cgi?id=646327 - -2013-06-07 14:06:56 +0800 Chen Jie <chenj@lemote.com> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Hacks for HuaweiMediaPad which reports wrong color format - COLOR_FormatYCbYCr is reported but it is actually COLOR_TI_FormatYUV420PackedSemiPlanar. - -2013-06-05 16:16:36 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - mpegvideoparser: Fix the pixel-aspect-ratio calculation - Ignore the display_extension values if they are greater than the width/height - values provided by seqhdr and calculate the PAR based on the seqhdr values.T - his is what DVD players are doing. - Thanks to "David Schleef <ds@schleef.org>" - https://bugzilla.gnome.org/show_bug.cgi?id=685103 - -2013-06-05 18:36:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - Back to development - -=== release 1.1.1 === - -2013-06-05 18:10:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ChangeLog: - * NEWS: - * RELEASE: - * common: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-eglglessink.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * gst/bayer/gstbayerorc-dist.c: - * gst/bayer/gstbayerorc-dist.h: - * gst/fieldanalysis/gstfieldanalysisorc-dist.c: - * gst/fieldanalysis/gstfieldanalysisorc-dist.h: - * gst/gaudieffects/gstgaudieffectsorc-dist.c: - * gst/gaudieffects/gstgaudieffectsorc-dist.h: - * win32/common/config.h: - Release 1.1.1 - -2013-06-05 18:28:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/vdpau/Makefile.am: - vdpau: Add some missing headers to dist - -2013-06-05 18:01:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/Makefile.am: - dash: Add to Makefile.am for make dist - -2013-06-05 17:49:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/Makefile.am: - applemedia-nonpublic: Add to the Makefile.am for dist - -2013-06-05 16:54:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2013-06-05 15:20:52 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Fix leak - Since we were manually setting GValue to the GValueArray, we also need - to specify how many were set, otherwise all values in the array will - be leaked. - -2013-06-05 15:15:06 +0200 Sebastian Dröge <slomo@circular-chaos.org> - - * common: - Automatic update of common submodule - From 098c0d7 to 01a7a46 - -2013-06-05 13:39:14 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Speedup TDT/TOT parsing - Use quarks where needed, makes it 2.5 times faster - -2013-06-05 13:21:29 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Fix string leak - The description/text get copied in the structure. - -2013-06-05 12:49:09 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Speed up descriptor parsing/packing - descriptors are stored as a GValueArray of GString. The downside is - that there is no way to "pass" ownership of a GValue to a GValueArray - which previously resulted in expensive copy/free of the (already expensive) - GString. - Here we estimate first the size of the GValueArray, then create it, - then directly use the GValue of that array. - Speeds up total SI parsing by ~30% - -2013-06-05 11:21:21 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Use gst_value_list_append_and_take_value - Avoids doing the expensive copy of structures/arrays/... - Speeds up parsing SI by about 50% - -2013-06-05 11:20:49 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Avoid copying GValueArray - Just give the GValueArray to the container GValue. - -2013-05-29 09:25:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * Makefile.am: - cruft: Add signalprocessor directory - -2013-05-29 08:37:19 +0200 Branko Subasic <branko@axis.com> - - * docs/libs/Makefile.am: - docs: removed signalprocessor from docs/libs/Makefile.am - -2013-05-28 15:54:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/midi/midiparse.c: - midiparse: In pull mode drop SEGMENT, CAPS and STREAM_START events - We create and send our own later from another thread. - -2013-05-28 15:53:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/midi/midiparse.c: - midiparse: Push stream-start event before anything else - -2013-05-28 08:08:42 +0200 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/signalprocessor/.gitignore: - * gst-libs/gst/signalprocessor/Makefile.am: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.h: - signalprocessor: ladspa is not using this anymore - When we port lv2, we'll go the same route as the new ladspa plugin. - -2013-05-28 07:53:37 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/ladspa/gstladspa.c: - ladspa: fix typos in launch examples - -2013-05-27 23:07:16 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/ladspa/gstladspa.c: - * ext/ladspa/gstladspa.h: - * ext/ladspa/gstladspafilter.c: - * ext/ladspa/gstladspafilter.h: - * ext/ladspa/gstladspasink.c: - * ext/ladspa/gstladspasink.h: - * ext/ladspa/gstladspasource.c: - * ext/ladspa/gstladspasource.h: - * ext/ladspa/gstladspautils.c: - * ext/ladspa/gstladspautils.h: - ladspa: use the registry cache for plugin details - Split the introspection and registration part. This way we only need to open all - plugins when updating the registry. When reading the registry we can register - the elements entierly from the cache. - -2013-05-27 11:20:07 +0200 Miguel Casas-Sanchez <miguelecasassanchez@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstopencv.c: - * ext/opencv/gstretinex.c: - * ext/opencv/gstretinex.h: - opencv: Add colour image enhancement element based on Retinex algorithm - Add colour image enhancement element based on Retinex algorithm. Two types - exist, namely basic and multiscale; both are described in this article: - Rahman, Zia-ur, Daniel J. Jobson, and Glenn A. Woodell. "Multi-scale retinex - for color image enhancement." Image Processing, 1996. Proceedings., - International Conference on. Vol. 3. IEEE, 1996 - Visually speaking the result looks a bit funny, but is pretty invariable to - lightning changes, which is good for some applications, like image - segmentation. - https://bugzilla.gnome.org/show_bug.cgi?id=700977 - -2013-05-26 14:29:54 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiofxbad/gstaudiochannelmix.h: - audiochannelmix: fill in the author template - The copyright header still contained the author template. - -2013-05-25 15:25:56 +0200 Michael Rubinstein <mrubinstein@weather.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsdemux: Free memory behind GString if we don't use it - https://bugzilla.gnome.org/show_bug.cgi?id=700903 - -2013-05-23 14:32:07 +0200 Patricia Muscalu <patricia@axis.com> - - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlbasesink.h: - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/gstcurlsmtpsink.h: - curlsmtpsink: terminate transfer thread properly - If no EOS has been sent, the curl readfunc callback will - return ABORT. The media file in that case will not be properly - finalized. - https://bugzilla.gnome.org/show_bug.cgi?id=700886 - -2013-04-08 14:59:54 +0000 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/directdraw/gstdirectdrawsink.c: - directdrawsink: update window width/height when it's not done in WndProc - -2013-04-05 17:59:41 +0000 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - directdrwasink: call previous WndProc if any - -2013-04-05 17:26:57 +0000 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/directdraw/gstdirectdrawsink.c: - directdrawsink: respect PAR with coordinates - -2013-04-25 15:35:50 +0000 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia-nonpublic/Makefile.am: - applemedia-nonpublic: fix symbols redefinition for objc files - -2013-04-24 15:55:12 +0000 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/Makefile.am: - applemedia: fix duplicated symbols with applemedia - -2013-05-23 14:57:49 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Post an error message when EOS'ing without source pads - This ensures we don't "hang" when files can't be decoded, or contain - no valid streams. - -2013-05-23 14:56:40 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Demote a warning to debug level - We will get it for virtually every first packets. - -2013-05-01 16:37:54 +0200 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - codecparsers: Actually store mpeg video bitrate value - And use the extension also (higher 12 bits) - -2013-05-23 11:04:57 +0200 Miguel Casas-Sanchez <miguelecasassanchez@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstopencv.c: - * ext/opencv/gstskindetect.c: - * ext/opencv/gstskindetect.h: - opencv: Add skin color detection element - https://bugzilla.gnome.org/show_bug.cgi?id=700654 - -2013-05-07 21:45:54 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/vtdec.c: - vtdec: simplify caps setting - -2013-04-26 17:47:26 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - applemedia: fix H264 streams with b-frames - The decoder output frames in DTS order, even with the flag - kVTDecodeFrame_EnableTemporalProcessing. We store a internal - queue of the decoded frames and push them PTS order. - -2013-04-26 17:45:31 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: fix segfault with dropped frames - -2013-04-26 17:40:00 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/vtapi.c: - * sys/applemedia/vtapi.h: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - applemedia: improve usage of the VT API - Add timing information to CV samples and pass the GstBuffer - as extra data in the decode function - -2013-04-26 13:26:03 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: add support for MPEG-1 too - -2013-04-25 11:30:07 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/vtapi.h: - * sys/applemedia/vtdec.c: - applemedia: add support for MPEG-2 decoding - -2013-04-25 11:27:13 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/vtdec.c: - applemedia: use the best colorformat on each platform - This saves a colorspace conversion before the sink in OS X - -2013-04-25 11:17:16 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/vtdec.c: - * sys/applemedia/vtutil.c: - * sys/applemedia/vtutil.h: - applemedia: replace private function with its public variant - FigVideoFormatDescriptionCreateWithSampleDescriptionExtensionAtom - is an un-documented private function which might change its signature - as it already did in the past. Replace it with - CMVideoFormatDescriptionCreate and the also un-documented Extensions - dictionary. - -2013-04-24 22:22:28 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/bufferfactory.h: - * sys/applemedia/bufferfactory.m: - * sys/applemedia/qtkitvideosrc.m: - applemedia: remove the unneeded buffer factory - -2013-04-24 22:15:01 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/cmapi.c: - * sys/applemedia/cmapi.h: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/coremediabuffer.h: - * sys/applemedia/coremediactx.c: - * sys/applemedia/coremediactx.h: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/corevideobuffer.h: - * sys/applemedia/cvapi.c: - * sys/applemedia/cvapi.h: - * sys/applemedia/vtapi.h: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - applemedia: don't use the dynamic API for public frameworks - Public frameworks don't need to build the API dynamically, we instead - use the framework directly. - The exception is for VideoToolbox which went public in the 10.8 SDK, - but it's still private in older version of the SDK and iOS. This allow - building the plugin against SDK's where it's not a public framework. - -2013-04-24 18:53:11 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * configure.ac: - * sys/Makefile.am: - * sys/applemedia-nonpublic/Makefile.am: - * sys/applemedia-nonpublic/bufferfactory.h: - * sys/applemedia-nonpublic/bufferfactory.m: - * sys/applemedia-nonpublic/celapi.c: - * sys/applemedia-nonpublic/celapi.h: - * sys/applemedia-nonpublic/celvideosrc.c: - * sys/applemedia-nonpublic/celvideosrc.h: - * sys/applemedia-nonpublic/cmapi.c: - * sys/applemedia-nonpublic/cmapi.h: - * sys/applemedia-nonpublic/coremediabuffer.c: - * sys/applemedia-nonpublic/coremediabuffer.h: - * sys/applemedia-nonpublic/coremediactx.c: - * sys/applemedia-nonpublic/coremediactx.h: - * sys/applemedia-nonpublic/corevideobuffer.c: - * sys/applemedia-nonpublic/corevideobuffer.h: - * sys/applemedia-nonpublic/cvapi.c: - * sys/applemedia-nonpublic/cvapi.h: - * sys/applemedia-nonpublic/dynapi-internal.h: - * sys/applemedia-nonpublic/dynapi.c: - * sys/applemedia-nonpublic/dynapi.h: - * sys/applemedia-nonpublic/mioapi.c: - * sys/applemedia-nonpublic/mioapi.h: - * sys/applemedia-nonpublic/miovideodevice.c: - * sys/applemedia-nonpublic/miovideodevice.h: - * sys/applemedia-nonpublic/miovideosrc.c: - * sys/applemedia-nonpublic/miovideosrc.h: - * sys/applemedia-nonpublic/mtapi.c: - * sys/applemedia-nonpublic/mtapi.h: - * sys/applemedia-nonpublic/plugin.m: - * sys/applemedia/Makefile.am: - * sys/applemedia/coremediactx.c: - * sys/applemedia/coremediactx.h: - * sys/applemedia/plugin.m: - applemedia: move plugins using private frameworks to applemedia-nonpublic - -2013-05-20 13:24:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Fix indention - -2013-05-17 20:17:31 +0800 Chen Jie <chenj@lemote.com> - - * sys/androidmedia/gstamcvideodec.c: - androidmedia: fix a minor error in COLOR_FormatYUV420Planar converting - https://bugzilla.gnome.org/show_bug.cgi?id=700521 - -2013-05-18 14:01:22 -0700 David Schleef <ds@schleef.org> - - * tools/element-templates/audiofilter: - element-maker: Add transform functions to audiofilter - -2013-05-18 13:57:11 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/audiofxbad/Makefile.am: - * gst/audiofxbad/gstaudiochannelmix.c: - * gst/audiofxbad/gstaudiochannelmix.h: - * gst/audiofxbad/gstaudiofxbad.c: - audiofx: Add plugin, add audiochannelmix - -2013-05-18 13:56:18 -0700 David Schleef <ds@schleef.org> - - * ext/flite/gstflitetestsrc.c: - flitetestsrc: audio format is "S16" not "s16" - -2013-05-18 11:58:14 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/videosignal/Makefile.am: - videosignal: fix CFLAGS order - -2013-05-17 21:23:55 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: send stream start event - Removes warnings about strict sticky events ordering - -2013-05-17 12:08:10 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: fix wma pro caps creation - WmaPro is actually wmaversion 3, and can also be found by the - WMAP fourcc. - Some manifests also contain the block_align field as "PacketSize" - in the audio track description, the libav decoders require it - to be present in caps. - Fixes #699921 - -2013-05-17 11:37:30 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: fix assertions when a stream caps can't be created - Fixes two assertions related to cleanup for a pad that couldn't - be exposed because the caps couldn't be identified from the - Manifest - Fixes #699921 - -2013-05-15 11:49:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/eglgles/gstegladaptation_eagl.m: - * ext/eglgles/gsteglglessink.c: - eagl: fix handling of surface dimension changes - Detect when the eagl surface changed its dimension (when the user rotates - the device for example) and adapt the egl internals to draw to that, - preventing that ios resizes the image again when drawing. - This is particularly harmful when eagl would scale down a image - to draw and the ios screen would scale it back up because the - surface is now bigger than when the element was configured. - -2013-05-15 00:48:53 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: parse block_align, channels and rate from waveformatex if possible - wma v2 expects block_align, channels and rate fields set to its caps. - This isn't present direclty on the manifests, so mssdemux should parse - it from the waveformatex structure - https://bugzilla.gnome.org/show_bug.cgi?id=699924 - -2013-05-14 22:04:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: add bitrate info to audio streams - bitrate info is always present on the QualityLevel xml node as part - of the adaptive selection processing, put it into caps as some - decoders require it (avdec_wmav2 for example) - https://bugzilla.gnome.org/show_bug.cgi?id=699924 - -2013-05-14 16:37:16 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: send stream id and newsegment before pushing data - Fixes sticky events ordering warnings when data is pushed - https://bugzilla.gnome.org/show_bug.cgi?id=699924 - -2013-05-15 22:24:29 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - dashdemux: Announce correct mpegts caps - -2013-05-15 20:03:30 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/insertbin/gstinsertbin.c: - insertbin: Annotate callback scopes - -2013-05-15 19:23:08 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - mimic: Ensure segment is sent before caps and buffer - https://bugzilla.gnome.org/show_bug.cgi?id=700420 - -2013-05-15 11:57:07 -0600 Brendan Long <b.long@cablelabs.com> - - * configure.ac: - openal: require OpenAL >= 1.14 to build the OpenAL plugin - For AL_FORMAT_MONO_ALAW_EXT and AL_FORMAT_STEREO_ALAW_EXT. - https://bugzilla.gnome.org/show_bug.cgi?id=700402 - -2013-05-15 11:38:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Push stream-start event before anything else - -2013-05-15 11:37:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/mpegtsmux.c: - mpegtsmux: Fix event handling in unit test - -2013-05-15 11:31:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/mxfdemux.c: - mxfdemux: Fix event handling in unit test - -2013-05-15 11:28:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/libs/insertbin.c: - insertbin: Fix event handling in unit test - -2013-05-15 11:26:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/schroenc.c: - schroenc: Fix event handling in unit test - -2013-05-15 11:25:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/mpg123audiodec.c: - mpg123audiodec: Fix event handling in unit test - -2013-05-15 11:15:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/parser.c: - parser: Fix event handling in unit tests - -2013-05-15 11:09:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - gdp: Fix event handling in unit test - gdp elements still needs to be fixed for all the event related - changes and generally properly ported to 1.0. - -2013-05-15 11:04:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/baseaudiovisualizer.c: - baseaudiovisualizer: Fix event handling in unit test - -2013-05-15 11:02:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: Enable GLib deprecation warnings again - -2013-05-15 11:00:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: Negotiate as soon as possible when getting the sinkpad caps - -2013-05-15 10:54:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/asfmux.c: - asfmux: Fix event handling in unit test - -2013-05-15 10:54:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - asfmux: Send stream-start event - -2013-05-15 10:51:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 5edcd85 to 098c0d7 - -2013-05-15 10:23:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/autoconvert.c: - autoconvert: Fix event handling in unit test - -2013-05-15 10:22:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/shm.c: - shm: Fix event handling in unit test - -2013-05-15 10:19:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/curlfilesink.c: - curlfilesink: Fix event handling in unit test - -2013-05-15 10:18:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/opus.c: - opus: Fix event handling in unit test - -2013-05-15 10:14:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/kate.c: - kate: Fix event handling in unit test - -2013-05-15 10:12:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/kate/gstkateenc.c: - * ext/kate/gstkateenc.h: - kateenc: Delay segment event until we have caps - -2013-05-15 10:02:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/kate/gstkateutil.c: - katedec/tiger: Don't queue sticky events that would come before CAPS - -2013-05-15 09:47:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/kate/gstkateparse.c: - kateparse: Fix event handling - Internal state should only be reset on FLUSH_STOP, not FLUSH_START. - Also forward pre-caps events immediately and don't queue them. - -2013-05-15 09:42:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/voaacenc.c: - * tests/check/elements/voamrwbenc.c: - vo{amr,aac}enc: Fix event handling in unit test - -2013-05-15 09:41:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/faac.c: - * tests/check/elements/faad.c: - faad/faac: Fix event handling in unit test - -2013-05-15 09:20:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/hls/Makefile.am: - * ext/hls/gsthlsdemux.h: - * ext/hls/gsturidownloader.c: - * ext/hls/gsturidownloader.h: - hls: Use GstURIDownloader from the library for now to keep everything in a usable state - -2013-05-14 14:32:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/ladspa/gstladspautils.c: - ladspa: Fix compilation issue when lrdf is enabled - https://bugzilla.gnome.org/show_bug.cgi?id=700328 - -2013-05-14 00:14:34 +0100 Tim-Philipp Müller <tim@centricular.net> - - * Android.mk: - * configure.ac: - * gst/nsf/Makefile.am: - * gst/nsf/dis6502.h: - * gst/nsf/fds_snd.c: - * gst/nsf/fds_snd.h: - * gst/nsf/fmopl.c: - * gst/nsf/fmopl.h: - * gst/nsf/gstnsf.c: - * gst/nsf/gstnsf.h: - * gst/nsf/log.c: - * gst/nsf/log.h: - * gst/nsf/mmc5_snd.c: - * gst/nsf/mmc5_snd.h: - * gst/nsf/nes6502.c: - * gst/nsf/nes6502.h: - * gst/nsf/nes_apu.c: - * gst/nsf/nes_apu.h: - * gst/nsf/nsf.c: - * gst/nsf/nsf.h: - * gst/nsf/osd.h: - * gst/nsf/types.h: - * gst/nsf/vrc7_snd.c: - * gst/nsf/vrc7_snd.h: - * gst/nsf/vrcvisnd.c: - * gst/nsf/vrcvisnd.h: - nsf: remove nsf plugin, replaced by gme plugin - https://bugzilla.gnome.org/show_bug.cgi?id=648021 - -2013-04-17 02:18:58 +0200 Juan Manuel Borges Caño <juanmabcmail@gmail.com> - - * configure.ac: - * ext/openal/gstopenal.c: - * ext/openal/gstopenalsink.c: - * ext/openal/gstopenalsink.h: - * ext/openal/gstopenalsrc.c: - * ext/openal/gstopenalsrc.h: - openal: improved port to 1.0 - https://bugzilla.gnome.org/show_bug.cgi?id=698013 - -2013-05-13 00:08:42 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/Makefile.am: - tests: blacklist some more tests from the generic state change test - -2013-05-13 00:06:10 +0100 Tim-Philipp Müller <tim@centricular.net> - - * sys/bluez/bluez-plugin.c: - * sys/bluez/gstavdtputil.c: - bluez: add debug category for avdtp utils - -2013-05-12 23:51:32 +0100 Tim-Philipp Müller <tim@centricular.net> - - * REQUIREMENTS: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/inspect/plugin-dirac.xml: - * ext/Makefile.am: - * ext/dirac/Makefile.am: - * ext/dirac/gstdirac.cc: - * ext/dirac/gstdiracdec.cc: - * ext/dirac/gstdiracdec.h: - * ext/dirac/gstdiracenc.cc: - * gst-plugins-bad.spec.in: - dirac: remove old dirac-research library based codec - It's not developed any more and replaced by the - libschroedinger-based elements in gst-plugins-good. - (The libschroedinger 1.0.9 release notes state "This - is an exciting release: most of the encoding tools in - dirac-research have been ported over to Schrödinger, so - now schro has the same or better compression efficiency - as dirac-research.") - -2013-05-12 22:41:32 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - * ext/ofa/Makefile.am: - * ext/ofa/gstofa.c: - * ext/ofa/gstofa.h: - * tests/check/elements/ofa.c: - ofa: port to 1.0 - -2013-05-12 20:32:23 +0100 Tim-Philipp Müller <tim@centricular.net> - - * LICENSE_readme: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/Makefile.am: - * ext/musicbrainz/Makefile.am: - * ext/musicbrainz/gsttrm.c: - * ext/musicbrainz/gsttrm.h: - musicbrainz: remove trm element which is not useful any more - TRM IDs are MusicBrainz' old audio fingerprinting system from - Relatable, they were phased out in favour of MusicIPs PUIDs. - https://wiki.musicbrainz.org/History:TRM - -2013-05-12 18:51:52 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/neon/gstneonhttpsrc.c: - neonhttpsrc: add support for SCHEDULING query - -2013-05-12 18:47:32 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - neonhttpsrc: add iradio-mode property and post icy metadata as tags - -2013-05-12 18:28:18 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - neonhttpsrc: port to 1.0 - -2013-05-11 12:07:03 -0700 David Schleef <ds@schleef.org> - - * gst/inter/gstintervideosrc.c: - intervideosrc: Fix timestamp generation - -2013-05-11 19:41:22 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/librfb/gstrfbsrc.c: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - rfbsrc: post error messages on errors - -2013-05-10 17:30:48 -0700 David Schleef <ds@schleef.org> - - * gst/videofilters/Makefile.am: - * gst/videofilters/gstvideodiff.c: - * gst/videofilters/gstvideodiff.h: - * gst/videofilters/gstvideofiltersbad.c: - videofilters: Add videodiff element - -2013-04-27 11:56:48 -0700 David Schleef <ds@schleef.org> - - * gst/y4m/gsty4mdec.c: - y4mdec: set timestamps when restriding buffer - -2013-04-15 00:24:23 -0700 David Schleef <ds@schleef.org> - - * gst/videosignal/Makefile.am: - * gst/videosignal/gstsimplevideomark.c: - * gst/videosignal/gstsimplevideomark.h: - * gst/videosignal/gstsimplevideomarkdetect.c: - * gst/videosignal/gstsimplevideomarkdetect.h: - * gst/videosignal/gstvideosignal.c: - videomark/detect: rename to simplevideomarkdetect - -2013-04-13 15:16:04 -0700 David Schleef <ds@schleef.org> - - * gst/videosignal/Makefile.am: - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideodetect.h: - * gst/videosignal/gstvideomark.c: - * gst/videosignal/gstvideomark.h: - * gst/videosignal/gstvideosignal.c: - videomark/detect: port to 1.0 - -2013-05-11 00:36:06 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/librfb/gstrfbsrc.c: - * gst/librfb/rfbdecoder.c: - rfbsrc: fix rfbdecoder new/free asymetry and wrong free in error case - If rfb_decoder_new() allocates the decoder sructure, rfb_decoder_free() - should free the structure. We should not free the decoder when an - error occurs during connection - it holds lots of configuration/state - and will be freed later in finalize. - -2013-05-11 00:29:40 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/librfb/d3des.c: - * gst/librfb/d3des.h: - * gst/librfb/rfbdecoder.c: - rfbsrc: make authentication handshake safe for multiple instances - Move DES key into context struct. - -2013-05-10 23:09:30 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/librfb/Makefile.am: - * gst/librfb/rfbdecoder.c: - * gst/librfb/vncauth.c: - * gst/librfb/vncauth.h: - rfbsrc: remove GPL-licensed source file - and replace the 1% of it that we need with new code, so we - don't have to change the runtime license of rfbsrc to GPL. - -2013-05-10 09:49:46 -0700 Aleix Conchillo Flaque <aleix@oblong.com> - - * gst/librfb/Makefile.am: - * gst/librfb/gstrfbsrc.c: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - rfbsrc: use glib gio sockets for network access - https://bugzilla.gnome.org/show_bug.cgi?id=700038 - -2013-05-09 16:41:32 -0700 Aleix Conchillo Flaque <aleix@oblong.com> - - * configure.ac: - * gst/librfb/Makefile.am: - * gst/librfb/gstrfbsrc.c: - * gst/librfb/gstrfbsrc.h: - rfbsrc: port to 1.0 - https://bugzilla.gnome.org/show_bug.cgi?id=700038 - -2013-05-10 12:49:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gstegladaptation_egl.c: - * gst-libs/gst/egl/egl.c: - * gst-libs/gst/egl/egl.h: - egl: Add destroy notify instead of always calling eglTerminate() on the display - In some scenarios, for example in QtWebKit, might be difficult to obtain full - control on the egl display and it might be only accessible indirectly via - eglGetCurrentDisplay(). - https://bugzilla.gnome.org/show_bug.cgi?id=700058 - -2013-05-10 11:48:46 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst-libs/gst/egl/egl.h: - egl: Allow being used in C++ code - -2013-05-08 23:17:08 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/dash/gstdashdemux.c: - dashdemux: rename src template from src%d to src_%u - -2013-05-08 18:22:39 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/AUTHORS: - * ext/dash/COPYING: - dash: remove superfluous files - Authors and license are at the top of the source files - -2013-05-02 14:11:54 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dash: do not use deprecated glib mutex API - -2013-04-23 12:08:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - dashdemux: fixing compiler warnings about print formats - -2013-05-08 11:14:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * configure.ac: - * ext/Makefile.am: - dash: enable in configure/makefiles - It was intentionally disabled up to this point to prevent - compile failures as dashdemux development commits were all for - 0.10 up to here - -2013-04-18 07:41:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/Makefile.am: - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstdownloadrate.c: - * ext/dash/gstdownloadrate.h: - * ext/dash/gstplugin.c: - dashdemux: port to 1.0 - -2013-04-11 09:12:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Fix another wrong assertion - Also adds a couple log messages for easier debugging - -2013-04-10 18:09:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: remove wrong asserts - Those asserts should be the contrary that they are. And also - the surround functions should already check that. Removing them. - -2013-03-13 15:55:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - dashdemux: only start timestamp from 0 for live stream - We only want to adjust the timestamps so that they start from 0 for live - streams. Non-live streams already start from 0 and after a seek we actually want - to timestamp to be the position we seek to. - -2013-03-08 15:04:48 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: make timestamps start from 0 - Non-live streams should timestamp buffers with a running-time starting from - 0. Since we already push a 0 -> -1 segment, bring the timestamps to 0 - by subtracting the initial timestamp. - -2013-03-08 14:59:59 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - dashdemux: also send newsegment on startup - -2013-03-08 14:57:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - dashdemux: small cleanup - -2013-02-22 17:00:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: live stream playback crashfix - -2013-02-22 16:46:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstmpdparser.c: - dash: mpdparser: do not cleanup xml lib too early - The xmlCleanupParser function seems to cleanup all statically - allocated libxml variables, making it unusable. We can't guarantee - that dashdemux won't need it anymore, so better not call it. - -2013-02-22 16:40:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: reimplementing live streams manifest updates - Manifest updates should be done periodically for live streams, - this patch makes the demuxer create a new manifest client for - the new version and transfers the stream position to the new - one, discarding the old one afterwards. - -2013-02-20 12:49:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstmpdparser.c: - dash: mpdparser: allow periods without start time for live streams - Live streams can have undefined start times for the periods and - mpdparser can let that pass instead of erroring out - -2013-02-19 19:35:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dash: mpdparser: use guint64 for timestamps - The timestamps can be pretty big, so use guint64 for them - -2013-02-19 01:26:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstmpdparser.c: - dashdemux: mpd parsing: fix query parameter parsing - Try harder to detect URL parameters and split them to accomodate - the fragment url in the concat: - base-url + fragment-url + url-parameters - -2013-02-18 14:02:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: plug some leaks - Add some missing free/unrefs spotted by valgrind - -2013-02-18 14:01:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: remove unused mutexes - -2013-02-14 17:39:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: properly reset stream status after a flush - The stream eos/end of period status must also be reset after a flushing - seek. This makes seeking after EOS work. - -2013-02-13 02:13:23 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: keep a list of streams periods - Keep a list of streams per period so that the download loop can keep - downloading while the stream loop is still pushing old period's data. - -2013-02-12 22:54:32 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: Properly parse base uri from mpd. - -2013-02-12 22:53:16 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Remove unused members. - -2013-02-12 18:50:51 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Only send newsegment on seek. - -2013-02-08 02:55:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: send segments that overwrite previous ones - This is only done for seeks, so it is fine - -2013-02-07 21:58:37 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - dashdemux: switch bitrates without switching pads - -2013-02-07 16:22:13 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - dashdemux: Remove unusued method. - -2013-02-07 14:09:44 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - dashdemux: Set stream need_header after seek and has_data_queued to FALSE when flushing stream. - -2013-02-07 03:09:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: do not pause/start the stream loop on playing/paused changes - The demuxer shouldn't care about paused/playing, it should act the - same in both states - -2013-02-06 13:31:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: remove property that isn't used anymore - Remove some pieces of code that are from an old property - that isn't used anymore - -2013-02-05 17:38:06 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/Makefile.am: - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstdownloadrate.c: - * ext/dash/gstdownloadrate.h: - dashdemux: add a downloadrate utility - A small struct that keeps a short history of fragment download bitrates - to have an average measure of N last fragments instead of using only - the last downloaded bitrate - -2013-02-05 14:24:45 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: sprinkling some more log - -2013-02-05 14:22:51 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: change bitrates based on the stream bitrate - Do not use a global bitrate as the sizes of the fragments matter - when calculating the download rate as the connection setup time is - also being taken into the download duration, a smaller fragment - will have a lower bitrate than a larger one. - This avoids switching the bitrates for streams frequently because - of bitrate mismatches - -2013-02-05 00:45:06 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/Makefile.am: - * ext/dash/gstdashdemux.h: - * ext/dash/gstfragment.c: - * ext/dash/gstfragment.h: - * ext/dash/gstfragmented.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstplugin.c: - * ext/dash/gsturidownloader.c: - * ext/dash/gsturidownloader.h: - dashdemux: refactor to use the uridownloader lib instead of internal copy - -2013-02-05 01:29:28 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - dashdemux: Make sure switch_pads won't leak any pad. - -2013-02-04 22:58:32 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - * ext/dash/gsturidownloader.c: - * ext/dash/gsturidownloader.h: - dashdemux: Properly stop download and stream tasks where appropriate. - -2013-02-01 02:12:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: avoid an assertion when stopping the pipeline - Avoids asserting when dataqueues are setting to flushing due - to a pipeline stop during a pad switch. - -2013-02-01 02:10:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: download the next fragment with smaller timestamp - Instead of downloading 1 fragment per stream per download loop, - select the stream with the earlier timestamp and get a fragment - only for that one. - The old algorithm would lead to problems when the fragment durations - were too different for streams. - -2013-02-01 00:37:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: track segments in the demuxer - Use a GstSegment to track the current segment information in the - demuxer. - -2013-02-01 00:33:00 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: remove buffering message emission from dashdemux - dashdemux shouldn't emit the buffering message as that can pause - the pipeline. It has no proper knowledge of the downstream buffering - status so it can pause the pipeline when it isn't necessary. It should - have an internal buffer for downloading the streams ahead of playback, - but that shouldn't make it able to stop the pipeline for buffering. - A particular case in which this is bad is when a pad switch happens - (changing bitrates for example), the new pads dashdemux creates - will get linked to demuxers and new queues will be created, - these queues are initially empty and dashdemux will quickly - drain its buffers by pushing them to those queues. So it - would have no more buffers internally and would emit a - buffering message with a low ratio, causing the pipeline - to pause when it wouldn't be necessary. - -2013-01-30 17:31:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: removing unused code - Cleaning up by removing unused code and variables - -2013-01-30 17:27:47 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: re-enable and fix adaptive switching - It is still unstable, but at least it works when the switches aren't - happening after every fragment - -2013-01-29 15:58:50 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: correctly signal EOS on manifest end - Put EOS on the streams queues after the last fragment from the - last period for each stream. This way we keep it serialized - with the buffers and it will work when streams have different - ending times - -2013-01-29 13:08:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: detect end-of-period correctly - Detect end of period when there are no more buffers on any of the - streams - -2013-01-29 13:04:01 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: Use the smallest queue value to define buffering state - The smallest queue should be used to prevent blocking the download - thread when a stream has too much data buffered, leaving the other - streams starving from fragments - -2013-01-29 11:22:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstmpdparser.c: - dash: fix parsing of streams to get correct fragment durations - Use the current stream base time instead of the 0th stream base time - to get default duration for fragments. - -2013-01-29 01:06:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - dashdemux: block waiting for buffers instead of busy wait - Make the streaming loop block waiting for buffers on the queues instead - of busy waiting eating cpu continuously on a queue length check - -2013-01-28 19:43:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: fix seeking on multiple streams - Each stream has its own durations and timestamps, the fragment number - is different for each stream when seeking, so the seek has to be done - for all streams, rather than on a single stream and propagated to - others - -2013-01-28 18:52:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstfragment.c: - * ext/dash/gstfragment.h: - * ext/dash/gstmpdparser.c: - dashdemux: Replace GQueue by GstDataQueue - GstDataQueue has proper locking and provides functions to limit the - size of the queue. Also has blocking calls that are useful to - our multithread scenario in Dash. - -2013-01-28 12:28:29 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: move the buffers queues to the streams - Store the buffers separately for each stream, this is clearer than - having a queue with a list of buffers. It also allows easier selection - of buffers to push in later refactors - -2013-01-28 10:46:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: refactor streams data to its own struct - Keeps code more organized and similar to what other demuxers - usually do - -2013-01-25 13:04:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstmpdparser.c: - dash: do not try to print a pointer as a string - -2013-01-25 12:45:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: Remove timing code that delays pushing of fragments - Fragments should be pushed ASAP as downstream should be responsible for - doing the syncrhonization and proper buffering. - This has the great side effect of fixing most of the seeking A/V sync issues. - -2013-01-25 09:36:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * ext/dash/gsturidownloader.c: - dash: fixing build warnings - Also running through gst-indent - -2013-01-23 16:43:12 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - gstdashdemux: add need_header member to know whether the initialization fragment should be pushed - -2013-01-23 13:20:25 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - dashdemux: don't wait for the whole duration of a fragment when seeking - -2013-01-23 13:19:21 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - dashdemux: switch pads and send header file when a newsegment event is sent - -2013-01-16 13:58:52 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: various fixes - -2012-12-20 09:04:28 +0100 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - Applied gst-indent - -2012-12-18 11:21:22 +0100 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/README: - Replaced URL pointing to obsolete Klagenfurt MPD by a new one - -2012-12-17 15:46:32 +0100 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstmpdparser.c: - mpdparser: fix escape sequence in URL template resolving - -2012-12-17 15:39:10 +0100 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - mpdparser: do not switch pads when bitstreamSwitching = true - -2012-12-17 15:19:33 +0100 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: complete support for manifest file updates - -2012-12-17 15:12:58 +0100 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdparser.c: - dashdemux: add support for manifest file updates - - the MPD file is updated in the download loop (only if we have a "dynamic" MPD and minimumUpdatePeriod is valid); - - properly LOCK/UNLOCK the GstMpdClient; - -2012-12-17 15:04:45 +0100 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: new API to set/get segment index and period index - TODO: rework segment selection to support Representations or Adaptation Sets with segments not aligned - -2012-12-17 15:00:52 +0100 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: new API to load the stream Period with a given index - this avoids to fiddle with stream internals in the code - -2012-12-17 14:54:42 +0100 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - dashdemux: implement seeking across Periods - -2012-11-21 14:14:34 +0100 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Applied gst-indent - -2012-11-21 14:14:21 +0100 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - By default, do not forward pad queries upstream, because it may have unforessen side-effects (forwarding the new 1.0 GST_CAPS query would prevent pad linking for instance) - -2012-11-12 10:54:35 +0100 Olivier Blin <olivier.blin@softathome.com> - - * ext/dash/gstplugin.c: - plugin: register as dashdemux instead of fragmented - This fixes conflicts with the HLS plugin, which is also named - fragmented. - When building its registry, gstreamer was picking one or the other - between hls and dashdemux. - -2012-10-25 17:55:02 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - dashdemux: check if we have received the MPD file in the proper way - -2012-10-25 17:53:53 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstmpdparser.c: - mpdparser: silence warning - -2012-10-25 17:15:09 +0200 Olivier Blin <olivier.blin@softathome.com> - - * ext/dash/gstdashdemux.c: - dashdemux: fix printing buffering time and download rate/size - This was broken on armv7. - -2012-10-25 17:17:35 +0200 Olivier Blin <olivier.blin@softathome.com> - - * ext/dash/gstdashdemux.c: - dashdemux: fix unused-but-set variable - -2012-10-25 16:49:21 +0200 Olivier Blin <olivier.blin@softathome.com> - - * ext/dash/gstdashdemux.c: - dashdemux: use new gst_mpd_client_get_next_fragment_duration API - This fixes build that has been broken by commit - fb9aeac6552021b176a4c4bd07265e02a0b70e0f. - gst_mpd_client_get_target_duration has been removed, and - gst_mpd_client_get_next_fragment_duration should be used instead. - -2012-10-24 17:28:40 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - dashdemux: remove FIXME comment - pad switching across multiple periods works perfectly fine now - and it is done only when there is a change in the CAPS - -2012-10-24 16:55:20 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - dashdemux: send new-segment events to all pads - -2012-10-24 16:30:01 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: reworked the API to retrieve fragment timestamp, fragment duration and media presentation duration - This was necessary to support variable-duration Fragments. - in the new API: - - gst_mpd_client_get_current_position returns the timestamp of the NEXT fragment to download; - - gst_mpd_client_get_next_fragment_duration returns the duration of the next fragment to download; - - gst_mpd_client_get_media_presentation_duration returns the mediaPresentationDuration from the MPD file; - also there is a new internal parser function: - - gst_mpd_client_get_segment_duration extracts the constant segment duration from the MPD file - (only used when there is no SegmentTimeline syntax element in the current representation) - In gst_mpd_client_get_next_fragment, we set the timestamp/duration of the fragment just downloaded - copying the values from the corresponding GstMediaSegment. - TODO: rework SEEKING to support seeking across different Periods. - -2012-10-24 14:50:54 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - dashdemux: use effective segment duration to reschedule the streaming task - do not assume segment duration is constant - Conflicts: - ext/dash/gstdashdemux.c - -2012-10-24 14:24:05 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - dashdemux: reworked gst_dash_demux_get_buffering_time() to return the effective buffering time - do not assume the Fragment duration is constant - -2012-10-24 11:49:51 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: complete support for Media Presentations with several Periods - - Periods are played in sequence, from PeriodStart to PeriodEnd - - seamless switching from one Period to the next one works fine; - - the 'new-segment' generation is broken, so if we need to switch pads for a new Period there is a crash; - -2012-10-22 18:12:30 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - mpdparser: initial support for Media Presentations made of several Periods - - build a list of the available Periods with their start and duration time - - add the list of GstStreamPeriod in the GstMpdClient data struct - - remove cur_period from GstMpdClient and introduce an API to get the current GstStreamPeriod - - several API clean-ups - -2012-10-24 18:10:47 +0200 Olivier Blin <olivier.blin@softathome.com> - - * ext/dash/gstmpdparser.c: - mpdparser: support BaseURL for SegmentURL using mediaRange - This is used in big_buck_bunny_CappedVBR_Multirate_4s_0_AudioVideo_MainProfile.mpd - -2012-10-24 18:04:07 +0200 Olivier Blin <olivier.blin@softathome.com> - - * ext/dash/gstmpdparser.c: - mpdparser: factorize adding range parameter to URL - -2012-10-19 20:12:09 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - dashdemux: reworked caps detection - also reworked the API to extract audio/video parameters from the manifest file - (mimeType, width, height, rate, num channels) - -2012-10-19 19:03:41 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - dashdemux: do not send bogus duration messages when mediaPresentationDuration is unknown - -2012-10-19 18:45:30 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstmpdparser.c: - mpdparser: support SegmentTimeline syntax also for list-based media segment generation - -2012-10-19 17:47:51 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - mpdparser: add support for SegmentTimeline syntax elements - build the list of segments to be played using the SegmentTimeline syntax, if present - bugfixes: - - for dynamic MPD files, when mediaPresentationDuration is not present use minimumUpdatePeriod instead - - do not add a spurious '$' when building an URL from a template like "$Bandwidth$/init.mp4v" - - introduce gst_mpd_client_add_media_segment() to avoid code duplication - -2012-10-19 15:42:51 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Fixed wrong index in fragments - -2012-10-19 12:01:03 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - mpdparser: fix memory leak in gst_mpd_client_get_next_fragment_set() - we have to free next_fragment_uri - -2012-10-19 10:50:16 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Removed unused function - -2012-10-19 10:43:49 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Seek event handling cleanup - -2012-10-18 18:49:53 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - dashdemux: fix playing of single-segment media streams - other fixes: - - fixed a buffering bug: now we stop buffering when we reach the end of manifest - - now gst_mpd_client_get_target_duration() always returns a valid duration - (in case of single-segment streams, we return either Period duration or mediaPresentation duration) - TODO: support SegmentTimeline - -2012-10-17 18:46:22 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gsturidownloader.h: - uridownloader: deleted useless declaration of gst_uri_downloader_free() - -2012-10-17 18:45:25 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gsturidownloader.c: - uridownloader: when possible, reuse existing element to download a new URI - previously a new element was allocated for each media segment, and it was never freed - -2012-10-17 18:43:26 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - dashdemux: unref caps in function need_add_header() - -2012-10-17 18:42:02 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstmpdparser.c: - dashdemux: fix extraction of SegmentTemplate->initialization in gst_mpd_client_get_next_header() - now the following MPD files are properly supported: - http://dash.edgesuite.net/adobe/hdworld_dash/HDWorld-1600.mpd - http://dash.edgesuite.net/adobe/hdworld_dash/HDWorld.mpd - -2012-10-17 18:40:02 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - dashdemux: fix memory leak in gst_dash_demux_get_next_header() - -2012-10-17 15:52:19 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - We now only accept actual manifest files, and not any XML file - -2012-10-17 15:50:33 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/Makefile.am: - * ext/dash/gstplugin.c: - Added a typefind helper for DASH: this commit should be reverted as soon as a proper patch has been submitted to gst-plugins-base - -2012-10-17 10:02:39 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Fixed state machine (again) - -2012-10-16 16:46:17 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Code refactoring - -2012-10-16 16:34:10 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Fixed state machine - -2012-10-16 13:43:39 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - Improve consistency of the tasks shutdown code - -2012-10-16 12:51:44 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Added missing g_list_free - -2012-10-16 11:44:26 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Do not answer to URI queries - -2012-10-16 11:39:18 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Try queries upstream if we cannot process them - -2012-10-16 11:26:03 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - Renamed demux->next_stream in demux->next_push - -2012-10-16 11:23:26 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Inlined one-line utility funciton that was called only once - -2012-10-16 09:10:00 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Fixed regression after the introduction of the multi-screen support, preventing the pipeline from stopping properly - -2012-10-15 16:41:28 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Modified log level of shutdown message - -2012-10-15 15:08:53 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Comments: We don't select a single representation, but a representation for each stream Code: cleanup of gst_get_next_fragment (also renamed in gst_get_next_fragment_set) - -2012-10-15 14:25:27 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Removed debug trace - -2012-10-15 14:14:53 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Added introduction and general design notes - -2012-10-15 13:54:17 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Fixed wrong comment - -2012-10-15 13:52:31 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Documented gst_dash_demux_download_loop - -2012-10-15 13:35:15 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Commented gst_dash_demux_stream_loop - -2012-10-15 13:17:12 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Commented needs_pad_switch - -2012-10-15 13:09:49 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Documented the representation switch mechanism - -2012-10-15 11:40:55 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - Replaced references to playlist (HLS) by references to manifest (DASH) - -2012-10-15 11:33:58 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Renamed gst_dash_demux_switch_playlist to gst_dash_demux_select_representation and added comments - -2012-10-15 11:19:29 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Removed obsolete comment - -2012-10-15 11:18:25 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/gstdashdemux.c: - Applied gst-indent - -2012-10-11 12:54:50 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/README: - Updated README - -2012-10-09 13:24:23 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstmpdparser.c: - mpdparser: support MPD files with SegmentBase elements encoded inside a SegmentList element - also properly support MPD files without any Initialization segment - -2012-10-08 17:43:14 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - mpdparser/dashdemux: fixed get_width, get_height, get_audio_rate, get_num_audio_channels API functions - the actual values now can be extracted also from the AdaptationSet element; - checking NULL structs for better robustness; - -2012-10-08 16:59:21 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - mpdparser: added support for single-segment streams with the URL encoded in the baseURL syntax element - -2012-10-08 15:26:48 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - mpdparser: added lang attribute to ProgramInformation node - -2012-10-08 11:47:45 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - mpdparser: added support for Accessibility, Role, Rating, Viewpoint elements to AdaptationSet node - those are DescriptorType elements, so they are just parsed and dumped for now; - -2012-10-08 11:30:40 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - mpdparser: support multiple ProgramInformation nodes - now we keep a list of ProgramInformation nodes for each Period node - -2012-10-08 11:16:09 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - mpdparser: fixed parsing of SegmentList syntax element, and eliminated Represention node list from Period node - SegmentList nodes are allowed into Period, AdaptationSet or Representation nodes - and there is at most 1 element, so no need to keep a list; - Period nodes cannot have any Represention elements, as AdaptationSet nodes are mandatory; - this breaks compatibility with some legacy DASH test sequences. - -2012-10-08 10:29:04 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstmpdparser.c: - mpdparser: fixed return with no value - gstmpdparser.c: In function ‘gst_mpdparser_get_list_and_nb_of_audio_language’: - gstmpdparser.c:2891: warning: ‘return’ with no value, in function returning non-void - -2012-10-08 10:24:29 +0200 Gianluca Gennari <gennarone@gmail.com> - - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - mpdparser.c/.h: changed license from dual MIT/LGPL 2.0 to LGPL 2.1 - uniformed licencinsing to the other libraries in the dashdemux project - -2012-10-02 02:28:58 +0200 hzakari <hamid.zakari@gmail.com> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - Optimize the two functions that return the number and the list of languages in a single function - -2012-09-29 05:27:51 +0200 Hamid ZAKARI <zakari@r-lnx-zakari.(none)> - - * ext/dash/gstdashdemux.c: - Add the headers to the adaptationsets segments if any one of these changed representation - -2012-09-29 03:13:29 +0200 Hamid ZAKARI <zakari@r-lnx-zakari.(none)> - - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - Support Multi languages (need a decodebin2 patch) - -2012-09-29 02:41:13 +0200 Hamid ZAKARI <zakari@r-lnx-zakari.(none)> - - * ext/dash/gstdashdemux.c: - Remove the "TODO" comment - -2012-09-28 12:55:27 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/COPYING: - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - Renamed LICENSE into COPYING - -2012-09-28 11:46:00 +0200 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/AUTHORS: - Updated authors - -2013-05-08 11:13:32 -0300 David Corvoysier <david.corvoysier@orange.com> - - * ext/dash/AUTHORS: - * ext/dash/LICENSE: - * ext/dash/Makefile.am: - * ext/dash/README: - * ext/dash/gstdashdemux.c: - * ext/dash/gstdashdemux.h: - * ext/dash/gstfragment.c: - * ext/dash/gstfragment.h: - * ext/dash/gstfragmented.h: - * ext/dash/gstmpdparser.c: - * ext/dash/gstmpdparser.h: - * ext/dash/gstplugin.c: - * ext/dash/gsturidownloader.c: - * ext/dash/gsturidownloader.h: - Initial import of gstdashdemux sources - -2012-10-26 18:00:02 +0200 Sebastian Pölsterl <sebp@k-d-w.org> - - * sys/dvb/gstdvbsrc.c: - Use DVB API v5 aka S2API instead of obsolete v3 API - Patch is based on work of Tony Houghton <h@realh.co.uk> - https://bugzilla.gnome.org/show_bug.cgi?id=654479 - -2013-05-08 15:42:01 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/smoothstreaming/gstmssmanifest.c: - smoothstreaming: pass width, height, channels and rate as integer - g_ascii_strtoull() returns a long long integer, but we need to - pass a normal int to gst_structure_set() for fields of G_TYPE_INT, - so cast appropriately. - -2013-05-08 12:45:20 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpvideomemory.h: - vdpau: Add VdpVideoSurface caps feature - -2013-05-08 10:55:16 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/smoothstreaming/gstmssmanifest.c: - smoothstreaming: fix WMV caps - Makes this show at least a picture: - http://playready.directtaps.net/smoothstreaming/TTLSS720VC1/To_The_Limit_720.ism/Manifest - -2013-04-23 12:08:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: fixing compiler warnings about print formats - -2013-04-16 19:35:03 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/Makefile.am: - * ext/smoothstreaming/gstdownloadrate.c: - * ext/smoothstreaming/gstdownloadrate.h: - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - * ext/smoothstreaming/gstsmoothstreaming-plugin.c: - smoothstreaming: port to 1.0 - -2013-04-12 15:59:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: remove already fixed TODO comment - -2013-04-12 15:58:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: replace gst_value_deserialize with simpler function - The deserialization was only used to convert hex strings into - GstBuffers. Replace gst_value_deserialize with a simpler, direct - function. - -2013-04-12 15:56:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: fix newsegment event leak - -2013-04-12 15:55:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: replace unused parameter - The buffer parameter wasn't being used, it was only to signal if - a buffer was downloaded and advance to the next fragment in the - manifest. - Replace the buffer with a boolean that has the same effect and is - safer - -2013-03-11 10:09:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/smoothstreaming/gstmssmanifest.c: - mss: avoid GValue leak - -2013-02-22 17:00:30 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/smoothstreaming/gstdownloadrate.c: - mssdemux: fix a small memory leak - -2013-02-19 13:17:53 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: avoid streaming to fail when download is cancelled - When download was failing repeatedly, it was causing streaming to fail even though it was cancelled on purpose (stopping tasks). - -2013-02-08 02:01:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: removing unused functions - -2013-02-08 01:51:30 -0200 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstdownloadrate.c: - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: switch bitrates without switching pads - -2013-02-07 16:26:46 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: Check if pads are valid before removing. - -2013-02-07 03:10:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: add a maximum error count for downloads - mssdemux will tolerate a few download errors before emitting an - error message to the bus - -2013-02-06 08:48:55 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: use streams bitrate individually - connection setup times seem to matter when measuring the download - rate of different streams. Streams with longer fragments have a - *relatively* lower connection setup time and achieve higher bitrates. - Using the average seems unfair here, so use each stream's measured bitrate - to select its best quality option. - -2013-02-05 17:48:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/Makefile.am: - * ext/smoothstreaming/gstdownloadrate.c: - * ext/smoothstreaming/gstdownloadrate.h: - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: use downloadbitrate utility for measuring bitrate - downloadbitrate keeps a short history of bitrates and helps - tracking the current average download bitrate for mssdemux - -2013-02-05 04:01:04 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: Properly compute new bitrate and use bitrate_limit. - -2013-02-05 03:27:51 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: Avoid a possible division by zero - -2013-02-05 03:27:22 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: Add missing object param to GST_DEBUG|INFO_OBJECT calls - -2013-02-05 00:28:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: add bitrate-limit property - It allows the plugin to use its own downloading bitrate measures - as a feedback to select the best streams bitrate for the current - network scenario - -2013-02-04 21:58:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/Makefile.am: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: use the shared uridownloader lib instead of an internal copy - -2013-02-04 02:20:51 -0200 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: Do not block on reset. - We need to cancel the downloader for each stream before joining the main download task, otherwise - the download task will block until all the stream tasks finish. - -2013-02-01 17:44:04 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: handle FLUSH events by resetting the demuxer state - -2013-02-01 17:43:46 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: add conditions to prevent some crashes - -2013-02-01 17:29:58 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: use standard glib methods - -2013-02-01 17:27:19 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: fix some memory leaks and use right free function - -2013-02-01 17:12:41 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: don't stop a task from inside the loop - Only pause the task - -2013-01-31 16:14:37 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: log manifest content for debugging - -2013-01-30 00:22:50 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: make codec private data from manifest attributes with AAC-LC - When the codec is AAC-LC, some server implementation (e.g. Microsoft IIS) doesn't add the CodecPrivateData attribute. The element needs to re-create the codec data from the Quality Level attributes (channels and sampling rate). - -2013-01-29 22:57:36 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: only try to reload the manifest for live streams - There is no way to know if a live stream is really finished, so try to reload the manifest and check if there are more fragments to download. Else just let know it's the EOS. - -2013-01-25 21:24:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: add some documentation - Adds a little bit of docs explaning the internals of mssdemux - -2013-01-22 17:33:41 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: add max-queue-size-buffers property - Indicates how much buffering should be done internally in - mssdemux - -2013-01-21 18:05:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: stop tasks faster - Issue a cancel to the downloaders so they stop earlier - -2013-01-17 16:20:10 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: implement live streams handling - Live streams force the demuxer to keep reloading the Manifest from - time to time, as the new fragments are being added as they are recorded. - The demuxer should also try to keep up and detect when it had to skip - fragments, marking the discont flag when that happens. - Curiously, the spec doesn't seem to mention when/how a live stream is supposed - to end, so keep trying downloads until the demuxer errors out. - -2013-01-17 16:19:54 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: do not leak fragments - -2013-01-17 13:48:13 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: fix issue on fragment timestamping parsing - Use guint64 as the fragments can start at very high numbers, - specially on live streams - -2013-01-16 15:28:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: error out when upstream doesn't implement URI query - Error out when upstream doesn't answer to URI query and mssdemux - doesn't know the URI to fetch the fragments from - -2013-01-15 17:31:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: push newsegments with same start time on bitrate switches - This keeps sinks working in sync after a bitrate switch - -2013-01-14 13:21:10 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: rewriting pad tasks so that buffers are pushed by ts order - Use pad tasks to download data and an extra task that gets the earlier - buffer (with the smallest timestamp) and pushes on the corresponding - pad. - This prevents that the audio stream rushes ahead on buffers as its - fragments should be smaller - -2013-01-11 15:01:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: some fixes to bitrate switching - Removes a possible deadlock from bitrate switching when the pad - that requested the switch blocks on its pad-push - -2013-01-10 16:26:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: refactoring fragment download to its own function - Makes code clearer and helps changing the download part of the - code to its own thread - -2013-01-10 15:16:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: implement bitrate switching - When connection-speed changes, signal that we might need a bitrate - switch. During the switch, a new pad group is added and the old one - is drained and removed. - New pads also need to push newsegments before starting to stream - -2013-01-08 18:01:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: add connection-speed property - This speed limits the maximum bitrate of streams. Currently it - is only read when starting the pipeline, but it should be used - for switching bitrates during playback to adapt to network - changes. - -2013-01-08 17:55:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: add an 'active' flag to manifest stream - mssdemux should set the streams it has exposed as active so that - the manifest won't use the non-active streams to compute total bitrates - or providing fragments - -2013-01-08 17:54:57 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: signal no-more-pads when finished exposing pads - This makes decodebin/playbin mechanism know it can start playing - when buffering is finished - -2013-01-08 11:08:39 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssmanifest: Keep the stream qualities list sorted by bitrate - This will help making adaptive streaming chose the best rate - for a particular connection speed - -2013-01-08 10:16:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: also consider fourcc AVC1 as H264 - H264 can be represented by both fourccs H264 and AVC1, use both. - -2013-01-04 17:01:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssmanifest: add support for VC-1 and WmaPro formats parsing - VC-1 should map to WMV3 and WmaPro to WMA2 - -2013-01-04 17:00:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: do not try to expose unknown streams - When the stream can't have its caps detected, better not to expose it. - If no streams are known, signal an error about no playable streams to - the application - -2013-01-04 15:49:43 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssmanifest: do not set codec_data when it is empty - Some manifests contain empty codec datas, better not set them - -2013-01-04 15:49:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: set timestamp and duration to fragment buffers - We can get those from the manifest and helps downstream to know - the fragment start time after a seeking operation - -2012-12-28 00:49:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssmanifest: fix typo - Fix typo that was making the advance fragment function return a wrong - flow return in case it was already EOS - -2012-12-28 00:48:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: initial implementation of seek event handling - Adds basic handling for seek in time events. Needs to cooperate - with the downstream qtdemux so that it forwards the seeks and - the corresponding newsegments - -2012-12-26 16:19:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: handle src pad queries fir duration and latency - Add a src pad query handler to get the duration from the manifest - and report it upstream. - Also adds a simple handler for latency queries - -2012-12-21 16:42:11 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: add some more error handling - Post error in some more scenarios: - * when the manifest has no streams - * when getting the fragment url fails - -2012-12-21 15:37:45 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: ensure the debug category is properly initialized - The user of the library might not need to create a NalParser, so - the debug category needs to be initialized from other functions - as well if required. - -2012-12-20 15:30:06 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: add timescale to the caps - This is important for downstream to properly timestamp the samples - The default value is 10000000, but this can be set in the stream - or at the top-level manifest entry - -2012-12-20 14:27:58 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/Makefile.am: - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: parse the fps from h264 codec data if possible - Use h264 codec parsing lib to extract the fps from the manifest's - codec data as it doesn't seem to provide it anywhere else - -2012-12-20 01:09:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: correctly add h264 codec data to caps - Need to construct an avcc atom from the codecdata read from MSS - manifests to make h264 decoders/parsers accept it - -2012-12-20 01:07:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: add the correct caps to the outgoing stream - mssdemux outputs a quicktime variant, named mss-fragment - -2012-11-25 01:57:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: set caps to buffers before pushing - Also update to the latest gstfragment API that provides - the fragment as a whole buffer. - -2012-11-22 13:01:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: improve state changing - Keep a ref on pad to prevent it being unreffed while the mssdemux - streams are still using it. Also reset the element when going to - ready instead of when going to null. - -2012-11-22 12:28:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - mssdemux: adds mininum error handling - This should care for basic scenarios of errors and EOS to allow - the pipeline to stop correctly - -2012-11-22 12:28:20 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - mssdemux: mssmanifest: prevent accessing null stream fragment - Move the access to the stream fragment data after the check - if the fragment exists to prevent a segfault - -2012-11-19 17:53:16 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - smoothstreaming: refactor structure names and implement url fetching - Use shorter names for the MSS manifest helper structure and functions. - Also continues the implementation of the stream fetching and pushing loop. - Now it uses the base url correctly and already fetches and pushes the fragments - downstream - -2012-11-16 17:30:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - mssdemux: initial implementation of the pad loop - The loop will fetch a new fragment and push on its srcpad. Each - stream has its own loop - -2012-11-16 17:29:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: more manifest parsing and helper functions - Now the mss manifest is able to generate the files urls - -2012-11-14 17:19:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: pad exposing initial implementation - Does some basic parsing of the stream caps and adds a pad for - each stream detected in the manifest - -2012-11-09 16:47:54 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - mssdemux: add manifest parsing - Continued implementing: - 1) parse the manifest with libxml2 - 2) detect stream types - -2012-11-08 16:06:44 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/smoothstreaming/Makefile.am: - * ext/smoothstreaming/gstmssdemux.c: - * ext/smoothstreaming/gstmssdemux.h: - * ext/smoothstreaming/gstmssmanifest.c: - * ext/smoothstreaming/gstmssmanifest.h: - * ext/smoothstreaming/gstsmoothstreaming-plugin.c: - smoothstreaming: stubs for mssdemux - Just the stubs for mssdemux element. - Also add some useful code from hlsdemux that we intend to reuse - -2012-11-08 15:42:39 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * configure.ac: - * ext/Makefile.am: - * ext/smoothstreaming/Makefile.am: - * ext/smoothstreaming/gstsmoothstreaming-plugin.c: - smoothstreaming: build directory stubs for new plugin - Initial build structure for MS' Smooth Streaming plugin - Conflicts: - ext/Makefile.am - -2013-02-19 13:01:37 -0500 Louis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: unlock mutex when switching urisrc state to NULL to avoid deadlock - When chain method was called after gst_uri_downloader_stop and before state has been changed to NULL, execution was blocking on g_mutex_lock. - Conflicts: - gst-libs/gst/uridownloader/gsturidownloader.c - -2013-02-07 00:28:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - uridownloader: properly unref the urisrc between downloads - This prevents leaking the element. Also sets the bus to flushing - to completely reset the downloader state - -2013-04-16 17:23:02 -0300 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * gst-libs/gst/uridownloader/gsturidownloader.c: - * gst-libs/gst/uridownloader/gsturidownloader.h: - uridownloader: make cancelled state 'permanent' until a reset - When downloading and cancelling quickly the uridownloader object and the - element using it could miss the cancelled window and the uridownloader - would fetch the wrong URI and block on subsequent fetches. - This was also problematic when stopping elements, while one task would - call the cancel, another element thread could issue a new fetch_uri. As - the cancel state isn't 'permanent' this fetch_uri would block and - prevent the whole element from stopping and going to NULL. - This patch makes the 'cancelled' state permanent until a - gst_uri_downloader_reset is called. This way the element knows the - window where the uridownloader isn't active and only reactivate it when - ready. - -2013-04-16 19:47:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/uridownloader/Makefile.am: - * gst-libs/gst/uridownloader/gstfragment.c: - * gst-libs/gst/uridownloader/gstfragment.h: - * gst-libs/gst/uridownloader/gsturidownloader.c: - * gst-libs/gst/uridownloader/gsturidownloader.h: - * gst-libs/gst/uridownloader/gsturidownloader_debug.h: - uridownloader: refactor gsturidownloader to its own lib - gsturidownloader can be reused by other plugins, better have it - into its own lib - -2013-05-07 08:26:03 -0600 Greg Rutz <greg@gsr-tek.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Fix memory leak when using prepare_func - prepare_func will allocate a new buffer to replace the original - one. Instead of using gst_buffer_replace (which causes an extra - refcount increment on the new buffer), we just unref the original - buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=699786 - -2013-05-07 14:22:10 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideometa.h: - mpegvideometa: Fix typo in comment - https://bugzilla.gnome.org/show_bug.cgi?id=699827 - -2013-05-03 21:46:08 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/ladspa/gstladspafilter.c: - * ext/ladspa/gstladspasink.c: - ladspa: sync controlled parames in filters and sinks - -2013-05-03 16:55:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/ladspa/Makefile.am: - ladspa: Add $(GMODULE_NO_EXPORT_LIBS) for gmodule - -2013-05-01 17:19:07 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: don't compare buffer size when checking whether to update caps - https://bugzilla.gnome.org/show_bug.cgi?id=699398 - -2013-05-03 11:34:34 +0200 Juan Manuel Borges Caño <juanmabcmail@gmail.com> - - * configure.ac: - * ext/ladspa/Makefile.am: - * ext/ladspa/gstladspa.c: - * ext/ladspa/gstladspa.h: - * ext/ladspa/gstladspafilter.c: - * ext/ladspa/gstladspafilter.h: - * ext/ladspa/gstladspasink.c: - * ext/ladspa/gstladspasink.h: - * ext/ladspa/gstladspasource.c: - * ext/ladspa/gstladspasource.h: - * ext/ladspa/gstladspautils.c: - * ext/ladspa/gstladspautils.h: - ladspa: improved port to gstreamer 1.0 - Fixes: #698927 - -2013-05-01 17:36:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: don't announce incomplete source caps - Don't send any source caps yet if we're still in - drop-buffers-until-we-get-a-sequence-header mode. - Fixes transmuxing of many MPEG-TS/PS streams into - formats which require things like width, height or - codec_data on the input caps. - Also fixes issues when using playbin with decoder - sinks that want width/height etc. - https://bugzilla.gnome.org/show_bug.cgi?id=695879 - -2013-04-27 12:28:42 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/kate/gstkatetag.c: - kate: fix buffer leak in katetag - Makes unit test valgrind clean. - https://bugzilla.gnome.org/show_bug.cgi?id=697071 - -2013-04-27 12:06:53 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/kate.c: - tests: fix some leaks in kate unit test - -2013-04-27 12:06:28 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - kate: minor cleanup - -2013-04-26 15:33:18 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/liveadder/liveadder.c: - liveadder: Document that the latency is in milliseconds - Bug #698896 - -2013-04-26 15:39:30 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: convert packet PTS/DTS as soon as possible - We let the mpegtspacketizer deal with pcr wraparound/resets. - https://bugzilla.gnome.org/show_bug.cgi?id=674536 - -2013-04-26 12:18:20 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/gstmpegdefs.h: - mpegtsdemux: header cleanups/updates - -2013-04-26 14:32:14 +0200 Rico Tzschichholz <ricotz@t-online.de> - - * docs/plugins/Makefile.am: - docs: Drop obsolete references to videosignal headers - In addition to 8552396c362c20adb6aa9129a453ff81ecdcf656 - -2013-04-26 10:38:36 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Update src pad caps when it was explicitly signaled - Fixes src pad caps aren't updated when converting from AVC to bytestream - and new caps had been received in the sink pad. - https://bugzilla.gnome.org/show_bug.cgi?id=698679 - -2013-04-23 15:19:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Fix caps string leak - -2013-04-24 09:40:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gstegladaptation_egl.c: - eglglessink: Use gst_egl_display_get() instead of passing a GstEGLDisplay to EGL functions - -2013-03-28 16:52:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/wasapi/Makefile.am: - * sys/wasapi/gstwasapi.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapisrc: Port to GstAudioSrc - -2013-03-27 10:10:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/wasapi/Makefile.am: - * sys/wasapi/gstwasapi.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: Port wasapisink to GstAudioSink - -2013-04-23 01:17:56 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/kate/gstkateutil.c: - * tests/check/elements/kate.c: - tests: fix remaining kate tests - https://bugzilla.gnome.org/show_bug.cgi?id=697071 - -2013-04-15 17:06:57 -0600 Brendan Long <b.long@cablelabs.com> - - * tests/check/elements/kate.c: - tests: port Kate tests to 1.0 - https://bugzilla.gnome.org/show_bug.cgi?id=697071 - -2013-04-22 23:52:20 +0100 Tim-Philipp Müller <tim@centricular.net> - - * MAINTAINERS: - * README: - * README.static-linking: - * common: - Automatic update of common submodule - From 3cb3d3c to 5edcd85 - -2013-04-21 18:28:52 +0100 Tim-Philipp Müller <tim@centricular.net> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvb.c: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/parsechannels.c: - * sys/dvb/parsechannels.h: - dvbbasebin: better error reporting - https://bugzilla.gnome.org/show_bug.cgi?id=678892 - -2013-04-21 14:13:45 +0100 Tim-Philipp Müller <tim@centricular.net> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/parsechannels.c: - dvbbasebin: log channel parsing into dvbbasebin debug category as well - -2013-04-21 14:04:11 +0100 Tim-Philipp Müller <tim@centricular.net> - - * sys/dvb/parsechannels.c: - dvbbasebin: fix path where to look for the dvb-channels.conf - Construct path based on the API version, not $major.$minor version. - -2013-04-18 20:26:15 +0000 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/eglgles/gstegladaptation_eagl.m: - eglglessink: eagl: fix eagl reuse by not releasing the context - It seems EAGL expects the application to simply ignore unused - EAGL contexts as the resources for it would be released when a new - context is set as the current one. Also move the egl extensions - querying to after a context is set to prevent crashes. - This makes the EAGL version of eglglessink reusable. - -2013-04-18 17:18:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * gst/aiff/Makefile.am: - * gst/aiff/aiffmux.c: - * gst/aiff/aiffmux.h: - * gst/aiff/aiffparse.c: - * gst/aiff/aiffparse.h: - aiff: port to 1.0 - -2013-04-18 16:11:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/egl/egl.c: - egl: Use gst_context_writable_structure() - -2013-04-18 15:26:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Give only SECONDARY rank - If available we still prefer xvimagesink. - -2013-04-18 12:54:31 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/eglgles/gstegladaptation_egl.c: - eglglessink: fixes 'makes integer from pointer without a cast' warning - -2013-04-18 12:24:18 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/eglgles/gstegladaptation.h: - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/video_platform_wrapper.c: - eglglessink: silence warnings building for RPI related to 'vcos_*' - -2013-04-18 12:27:28 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: fix warnings building on the RPI - -2013-04-18 12:16:17 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst-libs/gst/egl/egl.c: - egl: silence warnings building for RPI related to 'vcos_*' - -2013-04-17 14:45:19 -0600 Greg Rutz <greg@gsr-tek.com> - - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Add support for Motorola DigiCipher II MPEG2 video - Since there is a conflict between the DCII stream type and BluRay - stream types, moved the processing of BluRay-specific stream types - to the beginning of the function. Only if a BluRay stream type - IS NOT found do we proceed to check the rest of the stream type - identifiers - Previous code was also "sort-of" handling a similar conflict between - BluRay AC3 audio and standard AC3 audio. Moved the special case BluRay - AC3 handling in the main switch statement to the new BluRay-specific - switch. - https://bugzilla.gnome.org/show_bug.cgi?id=697892 - -2013-04-18 09:07:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: The quicktime wrapper plugin is not ported yet either - -2013-04-18 08:56:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: The osxvideosrc plugin is called osx_video - -2013-04-18 07:54:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - osxvideosrc: It's not ported to 1.0 yet - -2013-04-17 13:48:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix GstContext refcounting some more - -2013-04-17 13:16:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gstegladaptation_egl.c: - eglglessink: Fix GstContext refcounting - -2013-04-17 10:48:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gstegladaptation.c: - * ext/eglgles/gstegladaptation.h: - * ext/eglgles/gstegladaptation_egl.c: - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Update for GLTextureUploadMeta and EGL API changes - -2013-04-17 10:40:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/egl/Makefile.am: - * gst-libs/gst/egl/egl.c: - * gst-libs/gst/egl/egl.h: - egl: Use new types from libgstvideo instead of defining our own - -2013-03-25 18:30:18 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: Do not check for VUI parameters if they were not present in the SPS - -2013-04-16 22:51:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gstegladaptation.c: - eglglessink: Reorder surface queries - Otherwise wrong values can be returned. - -2013-04-16 22:25:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gstegladaptation.c: - * ext/eglgles/gstegladaptation.h: - * ext/eglgles/gstegladaptation_eagl.m: - * ext/eglgles/gstegladaptation_egl.c: - * ext/eglgles/gsteglglessink.c: - eglglessink: Properly set a debug category for the adaption layers - -2013-04-16 22:25:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Get the EGL/GLES extensions at the right position - -2013-04-16 22:14:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gstegladaptation_egl.c: - eglglessink: Fix compiler warning - gstegladaptation_egl.c: In function 'gst_egl_adaptation_create_native_window': - gstegladaptation_egl.c:868:3: error: format '%p' expects argument of type 'void *', but argument 8 has type 'EGLNativeWindowType' -Werror=format= - GST_DEBUG_OBJECT (ctx->element, "Using window handle %p", window); - ^ - -2013-04-10 17:27:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/eglgles/Makefile.am: - * ext/eglgles/gstegladaptation.c: - * ext/eglgles/gstegladaptation.h: - * ext/eglgles/gstegladaptation_eagl.m: - * ext/eglgles/gstegladaptation_egl.c: - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: refactor to allow eagl support - Put EGL specific code to a separate file and create the same functions - for EAGL, the Apple's specific EGL implementaton. - At this point, the EAGL version wasn't compiled or tested as there isn't - any simple documented way to build 1.0 for iOS. This code for the EAGL - version is still the 0.10 version, some updates should be made when 1.0 - is buildable for iOS. - -2013-04-15 17:43:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * configure.ac: - eagl: add ios window system option for eglgles configure - -2013-04-15 18:40:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * configure.ac: - ios: unconditionally check if we are building for iOS - Instead of only checking if applemedia is going to be built - -2013-04-10 14:53:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/eglgles/Makefile.am: - * ext/eglgles/gstegladaptation.c: - * ext/eglgles/gstegladaptation.h: - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: refactor egl functions/data to a separate file - This is part of the changes required to make - eglglessink work with both EGL and Apple's EAGL - -2013-04-16 16:30:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Print EGL/GLES extensions after we are actually initialized enough - -2013-04-16 16:23:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - amcaudiodec: Properly set output format instead of just setting caps - -2013-04-16 16:17:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Set parent class in class_init - -2013-04-16 16:00:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Handle refcounts of pad templates correctly - gst_pad_template_new() does not take ownership of caps anymore and - gst_element_class_add_pad_template() does take ownership of the - pad template now. - -2013-04-16 15:32:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - amcaudiodec: Use 1.0-style raw audio caps - -2013-04-16 15:31:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Properly set subclasses metadata/pad templates in base_init - -2013-04-15 16:01:29 -0700 David Schleef <ds@schleef.org> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtsdemux: check value before using as denominator - -2013-04-15 18:19:38 +0300 Anton Belka <antonbelka@gmail.com> - - * sys/uvch264/gstuvch264_mjpgdemux.c: - uvch264: printf format fix - gstuvch264_mjpgdemux.c:437:5: error: format '%lu' expects argument of type 'long unsigned int', but argument 8 has type 'GstClockTime' - -2012-10-24 12:16:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/apexsink/Makefile.am: - * ext/assrender/Makefile.am: - * ext/audiofile/Makefile.am: - * ext/bz2/Makefile.am: - * ext/cdaudio/Makefile.am: - * ext/celt/Makefile.am: - * ext/chromaprint/Makefile.am: - * ext/curl/Makefile.am: - * ext/dc1394/Makefile.am: - * ext/dirac/Makefile.am: - * ext/directfb/Makefile.am: - * ext/dts/Makefile.am: - * ext/faac/Makefile.am: - * ext/faad/Makefile.am: - * ext/flite/Makefile.am: - * ext/fluidsynth/Makefile.am: - * ext/gme/Makefile.am: - * ext/gsettings/Makefile.am: - * ext/gsm/Makefile.am: - * ext/hls/Makefile.am: - * ext/kate/Makefile.am: - * ext/ladspa/Makefile.am: - * ext/libfame/Makefile.am: - * ext/libmms/Makefile.am: - * ext/lv2/Makefile.am: - * ext/mimic/Makefile.am: - * ext/modplug/Makefile.am: - * ext/mpeg2enc/Makefile.am: - * ext/mpg123/Makefile.am: - * ext/mplex/Makefile.am: - * ext/musepack/Makefile.am: - * ext/musicbrainz/Makefile.am: - * ext/mythtv/Makefile.am: - * ext/nas/Makefile.am: - * ext/neon/Makefile.am: - * ext/ofa/Makefile.am: - * ext/openal/Makefile.am: - * ext/opencv/Makefile.am: - * ext/openjpeg/Makefile.am: - * ext/opus/Makefile.am: - * ext/resindvd/Makefile.am: - * ext/rsvg/Makefile.am: - * ext/rtmp/Makefile.am: - * ext/sbc/Makefile.am: - * ext/schroedinger/Makefile.am: - * ext/sdl/Makefile.am: - * ext/snapshot/Makefile.am: - * ext/sndfile/Makefile.am: - * ext/soundtouch/Makefile.am: - * ext/spandsp/Makefile.am: - * ext/spc/Makefile.am: - * ext/srtp/Makefile.am: - * ext/teletextdec/Makefile.am: - * ext/timidity/Makefile.am: - * ext/voaacenc/Makefile.am: - * ext/voamrwbenc/Makefile.am: - * ext/wayland/Makefile.am: - * ext/xvid/Makefile.am: - * ext/zbar/Makefile.am: - * gst/accurip/Makefile.am: - * gst/adpcmdec/Makefile.am: - * gst/adpcmenc/Makefile.am: - * gst/aiff/Makefile.am: - * gst/asfmux/Makefile.am: - * gst/audiobuffer/Makefile.am: - * gst/audiovisualizers/Makefile.am: - * gst/autoconvert/Makefile.am: - * gst/bayer/Makefile.am: - * gst/camerabin2/Makefile.am: - * gst/cdxaparse/Makefile.am: - * gst/coloreffects/Makefile.am: - * gst/dataurisrc/Makefile.am: - * gst/dccp/Makefile.am: - * gst/debugutils/Makefile.am: - * gst/dvbsuboverlay/Makefile.am: - * gst/dvdspu/Makefile.am: - * gst/faceoverlay/Makefile.am: - * gst/festival/Makefile.am: - * gst/fieldanalysis/Makefile.am: - * gst/freeverb/Makefile.am: - * gst/frei0r/Makefile.am: - * gst/games/Makefile.am: - * gst/gaudieffects/Makefile.am: - * gst/gdp/Makefile.am: - * gst/geometrictransform/Makefile.am: - * gst/hdvparse/Makefile.am: - * gst/id3tag/Makefile.am: - * gst/inter/Makefile.am: - * gst/interlace/Makefile.am: - * gst/ivfparse/Makefile.am: - * gst/ivtc/Makefile.am: - * gst/jp2kdecimator/Makefile.am: - * gst/jpegformat/Makefile.am: - * gst/librfb/Makefile.am: - * gst/liveadder/Makefile.am: - * gst/midi/Makefile.am: - * gst/mixmatrix/Makefile.am: - * gst/mpeg1sys/Makefile.am: - * gst/mpegdemux/Makefile.am: - * gst/mpegpsmux/Makefile.am: - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsmux/Makefile.am: - * gst/mve/Makefile.am: - * gst/mxf/Makefile.am: - * gst/nsf/Makefile.am: - * gst/nuvdemux/Makefile.am: - * gst/overlay/Makefile.am: - * gst/patchdetect/Makefile.am: - * gst/pcapparse/Makefile.am: - * gst/pnm/Makefile.am: - * gst/rawparse/Makefile.am: - * gst/real/Makefile.am: - * gst/removesilence/Makefile.am: - * gst/rtjpeg/Makefile.am: - * gst/sdi/Makefile.am: - * gst/sdp/Makefile.am: - * gst/segmentclip/Makefile.am: - * gst/siren/Makefile.am: - * gst/smooth/Makefile.am: - * gst/speed/Makefile.am: - * gst/stereo/Makefile.am: - * gst/subenc/Makefile.am: - * gst/tta/Makefile.am: - * gst/vbidec/Makefile.am: - * gst/videofilters/Makefile.am: - * gst/videomeasure/Makefile.am: - * gst/videoparsers/Makefile.am: - * gst/videosignal/Makefile.am: - * gst/vmnc/Makefile.am: - * gst/y4m/Makefile.am: - * gst/yadif/Makefile.am: - * sys/acmenc/Makefile.am: - * sys/acmmp3dec/Makefile.am: - * sys/applemedia/Makefile.am: - * sys/avc/Makefile.am: - * sys/bluez/Makefile.am: - * sys/cdrom/Makefile.am: - * sys/d3dvideosink/Makefile.am: - * sys/decklink/Makefile.am: - * sys/directdraw/Makefile.am: - * sys/directsound/Makefile.am: - * sys/dshowdecwrapper/Makefile.am: - * sys/dvb/Makefile.am: - * sys/dxr3/Makefile.am: - * sys/fbdev/Makefile.am: - * sys/linsys/Makefile.am: - * sys/mfc/Makefile.am: - * sys/osxvideo/Makefile.am: - * sys/pvr2d/Makefile.am: - * sys/qcam/Makefile.am: - * sys/qtwrapper/Makefile.am: - * sys/shm/Makefile.am: - * sys/uvch264/Makefile.am: - * sys/vcd/Makefile.am: - * sys/vdpau/Makefile.am: - * sys/wasapi/Makefile.am: - * sys/wininet/Makefile.am: - * sys/winks/Makefile.am: - * sys/winscreencap/Makefile.am: - * tools/gst-project-maker: - gst: Add better support for static plugins - -2013-04-15 15:13:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * Makefile.am: - cruft: Add camerabin directory to the cruft directories - -2013-04-15 09:01:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: fix timeout value - Timeout on udpsrc is in nanoseconds in 1.0 - -2013-04-15 00:22:39 -0700 David Schleef <ds@schleef.org> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: Add conditional on API version for new enum - -2013-04-04 15:59:09 +0000 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: fix deadlock draining queue from the same thread - -2011-08-10 12:13:34 +0000 Fabricio Costa Alisedo <fabricio.costa@moldeointeractive.com.ar> - - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - dshowsrcwrapper: Added Graph Builder and Capture Builder to correctly create upstream needed filters by Analog TV Capture Devices. - -2012-12-01 16:24:22 +0000 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - dshowsrcwrapper: Add support for UYVY - -2013-04-15 08:48:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix compiler warnings - gsteglglessink.c: In function 'gst_eglglessink_fill_texture': - gsteglglessink.c:1815:3: error: format '%d' expects argument of type 'int', but argument 11 has type 'gsize' -Werror=format - gsteglglessink.c: In function 'gst_eglglessink_configure_caps': - gsteglglessink.c:2850:3: error: format '%p' expects argument of type 'void *', but argument 8 has type 'EGLNativeWindowType' -Werror=format - -2013-04-15 00:48:36 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/kate/gstkatedec.c: - * ext/kate/gstkatedec.h: - kate: only send decoder output caps once or when the format changes - and not for every single buffer. And also send a caps - event for spu output. - https://bugzilla.gnome.org/show_bug.cgi?id=697071 - -2013-04-14 23:22:40 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/kate/gstkatedec.c: - * ext/kate/gstkateutil.c: - kate: fix decoder output caps - It's either pango-markup or utf8, never both at the same time. - https://bugzilla.gnome.org/show_bug.cgi?id=697071 - -2013-04-14 23:19:44 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkateutil.c: - kate: mark header buffers as such - -2013-04-14 23:08:40 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/kate/gstkateenc.c: - * ext/kate/gstkateenc.h: - * ext/kate/gstkateutil.h: - kateenc: save current input format in setcaps - -2013-04-14 21:28:51 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/kate/Makefile.am: - * ext/kate/gstkate.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatespu.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkateutil.c: - kate: fix printf format strings and disable tiger element - -2013-04-01 12:47:13 -0600 Brendan Long <b.long@cablelabs.com> - - * configure.ac: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatespu.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkateutil.c: - * ext/kate/gstkateutil.h: - kate: port Kate subtitles to 1.0 - https://bugzilla.gnome.org/show_bug.cgi?id=697071 - -2013-04-14 17:55:28 +0100 Tim-Philipp Müller <tim@centricular.net> - - * autogen.sh: - * common: - Automatic update of common submodule - From aed87ae to 3cb3d3c - -2013-04-12 17:01:38 +0200 Alexander Olsson <alexo@axis.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: accept any jpeg input - parsed, unparsed or unmarked - The src element may not include information about whether - the data is parsed or not. Hence do not require parsed=false. - Fixes multipartdemux ! jpegparse ! ... - https://bugzilla.gnome.org/show_bug.cgi?id=697884 - -2013-04-12 14:09:24 -0700 David Schleef <ds@schleef.org> - - * tools/element-templates/videofilter: - element-template: add start/stop to videofilter - -2013-04-12 14:08:15 -0700 David Schleef <ds@schleef.org> - - * tools/element-templates/sinkpad-template-video: - * tools/element-templates/srcpad-template-video: - element-templates: avoid using PadTemplates - -2013-04-12 14:07:31 -0700 David Schleef <ds@schleef.org> - - * tools/element-templates/basetransform: - element-templates: Add helper code to transform_caps - -2013-04-12 13:56:25 -0700 David Schleef <ds@schleef.org> - - * gst/videosignal/Makefile.am: - * gst/videosignal/gstvideoanalyse.c: - * gst/videosignal/gstvideoanalyse.h: - * gst/videosignal/gstvideosignal.c: - videoanalyse: port to 1.0 - -2013-04-05 21:31:18 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/videofilters/Makefile.am: - * gst/videofilters/gstscenechange.c: - * gst/videofilters/gstscenechange.h: - * gst/videofilters/gstvideofilter2.c: - * gst/videofilters/gstvideofilter2.h: - * gst/videofilters/gstzebrastripe.c: - * gst/videofilters/gstzebrastripe.h: - videofiltersbad: port to 1.0 - -2013-04-11 22:15:07 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: decrease log priority for repeating messages - https://bugzilla.gnome.org/show_bug.cgi?id=697834 - -2013-04-11 13:34:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * Makefile.am: - * configure.ac: - * docs/libs/Makefile.am: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstsurfaceconverter.c: - * gst-libs/gst/video/gstsurfaceconverter.h: - * gst-libs/gst/video/gstsurfacemeta.c: - * gst-libs/gst/video/gstsurfacemeta.h: - * gst-libs/gst/video/videocontext.c: - * gst-libs/gst/video/videocontext.h: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-basevideo-uninstalled.pc.in: - * pkgconfig/gstreamer-basevideo.pc.in: - video: Remove video library from -bad - This only contained API that now has replacements in core and base. - -2013-04-11 13:08:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Check the continuity counter for non-section packets too - And if we detect a discontinuity there (like... when losing packets - or having MPEGTS over raw UDP with out-of-order packets) we just - drop the corresponding packet. - A future version could try to implement a re-ordering algorithm based - on that, similar to what rtpjitterbuffer does. - -2013-04-11 10:06:23 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/mxf/mxfdemux.c: - mfxdemus: update todo (ther eis a muxer) - -2013-04-10 16:19:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Call ::program_stopped after removing all streams - Subclasses want to access the program while removing the streams - and will currently crash because of dereferencing NULL in some cases. - -2013-04-10 11:06:52 +0200 Alexander Schrab <alexas@axis.com> - - * gst/debugutils/gstwatchdog.c: - watchdog: race between g_main_loop_run/_quit fixed - https://bugzilla.gnome.org/show_bug.cgi?id=697694 - -2013-04-09 21:32:07 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Don't stop on invalid buffer - -2013-04-09 21:31:55 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - srtpdec: Cleaner stream cleanup - -2013-04-09 21:31:24 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtp.c: - * ext/srtp/gstsrtpdec.c: - srtpdec: Don't crash on invalid cipher - -2013-03-27 16:49:05 -0700 David Schleef <ds@schleef.org> - - * gst/debugutils/gstwatchdog.c: - watchdog: fix event handling - -2013-04-01 15:52:17 -0700 David Schleef <ds@schleef.org> - - * gst/yadif/gstyadif.c: - yadif: remove extra template code - -2013-04-01 15:47:54 -0700 David Schleef <ds@schleef.org> - - * gst/ivtc/gstivtc.c: - ivtc: remove transform_size, it's not needed - -2013-04-01 20:13:41 -0700 David Schleef <ds@schleef.org> - - * tools/element-templates/videoencoder: - element-maker: fix return value in videoencoder - -2013-04-01 20:12:57 -0700 David Schleef <ds@schleef.org> - - * tools/gst-element-maker: - gst-element-maker: create better element name when using --prefix - -2013-04-01 20:03:59 -0700 David Schleef <ds@schleef.org> - - * gst/inter/gstinteraudiosink.c: - interaudiosink: fix leak when not connected - -2013-04-09 21:00:28 +0200 Stefan Sauer <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 04c7a1e to aed87ae - -2013-04-08 17:40:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/fluidsynth/gstfluiddec.c: - * ext/mimic/gstmimenc.c: - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpenc.c: - ext: printf format fixes in debug and error messages - -2013-04-08 17:34:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/bluez/gstavdtpsink.c: - * sys/dvb/parsechannels.c: - * sys/mfc/gstmfcdec.c: - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpvideomemory.c: - sys: print format fixes in debug messages - -2013-04-07 18:41:38 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Add support for TrueHD audio - -2013-04-05 09:41:26 +0100 Todd Agulnick <todd@agulnick.com> - - * ext/opencv/gsthanddetect.c: - * ext/opencv/gsthanddetect.h: - handdetect: fix build on OS/X - gsthanddetect.h:84: error: expected specifier-qualifier-list before 'uint' - https://bugzilla.gnome.org/show_bug.cgi?id=697305 - -2013-04-05 00:49:46 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: shaders assume 32bpp - Backport fix for crashes and invalid writes in totem from libvisual - in -base, to minimise differences to version in -base and to make - sure the bug doesn't sneak back in later when the base class is - made public. - The shader code looks like it makes assumptions that are not - necessarily always true, even if they're true for now for the - existing elements, namly that pixel stride is 4, for example. - See https://bugzilla.gnome.org/show_bug.cgi?id=683527 - -2013-03-14 11:15:29 +1100 Matthew Waters <ystreet00@gmail.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: handle non-existant pool in the default allocation query - gst_query_set_nth_allocation_pool() requires there to be a pool in the - query already. This is not always the case when we get the query from - upstream. Use gst_query_add_allocation_pool() instead in such case. - https://bugzilla.gnome.org/show_bug.cgi?id=681719 - -2013-01-29 10:18:06 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/audiovisualizers/gstaudiovisualizer.c: - * gst/audiovisualizers/gstaudiovisualizer.h: - audiovisualizer: improve allocation - Based on patch by Matthew Waters - Add private data - Add decide_allocation vmethod - Refactor bufferpool negotiation - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=681719 - -2013-04-03 16:12:01 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: use bilinear filter as much as possible - Use the bilinear scalling filter when the magnifier or the minifier - filters are avaible. Some graphics cards do not provide minifier filters - but we want to use it for upscalling if it's available - https://bugzilla.gnome.org/show_bug.cgi?id=697176 - -2013-04-03 14:55:52 +0200 Edward Hervey <edward@collabora.com> - - * configure.ac: - * ext/rsvg/gstrsvg.c: - * ext/rsvg/gstrsvgdec.h: - * ext/rsvg/gstrsvgoverlay.h: - rsvg: Bump minimum requirement to 2.36.0 - And handle header changes in 2.36.2 - -2013-04-02 23:33:54 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst-libs/gst/codecparsers/gstmpegvideometa.c: - * gst-libs/gst/codecparsers/gstmpegvideometa.h: - docs: add since markers to new codecparsers video meta API - https://bugzilla.gnome.org/show_bug.cgi?id=691712 - -2013-04-01 19:49:00 -0700 David Schleef <ds@schleef.org> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: Implement basesrc->unlock() - This fixes ->NULL transition problems if librtmp is stuck in a - recv or send call that never returns. - -2013-03-30 15:07:45 -0700 David Schleef <ds@schleef.org> - - * tools/element-templates/basetransform: - element-maker: call up in basetransform template - More templates should be doing this: function implementations - should call up to the default implementation in the base class. - -2013-04-01 22:38:52 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - configure: also check for bluez for bluetooth/bluetooth.h - Fixes build on machines where bluez headers are not available. - -2013-04-01 21:49:49 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - bluez: enable bluez plugin - Seems to mostly work now. - https://bugzilla.gnome.org/show_bug.cgi?id=690582 - -2013-04-01 21:48:01 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - Bump soft liborc requirement to 0.4.17 - To match -base and -good. Also fixes potential - crash when a fallback function has to be used. - -2013-04-01 10:20:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Use the EGLImage and GstVideoGLTextureUploadMeta caps features - -2013-04-01 10:20:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/egl/egl.h: - egl: Add a #define for the EGLImage memory caps feature - -2013-04-01 09:13:16 +0200 Edward Hervey <bilboed@bilboed.com> - - * ext/rsvg/gstrsvgdec.h: - * ext/rsvg/gstrsvgoverlay.h: - rsvg: Don't include rsvg-cairo.h directly - Including it directly is now deprecated - -2013-04-01 09:10:53 +0200 Edward Hervey <bilboed@bilboed.com> - - * sys/vdpau/gstvdpdevice.c: - vdpau: Don't use deprecated GMutex methods - -2013-03-29 17:57:12 +0100 Luciana Fujii Pontello <luciana@fujii.eti.br> - - * configure.ac: - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgdec.h: - * ext/rsvg/gstrsvgoverlay.c: - * ext/rsvg/gstrsvgoverlay.h: - rsvg: Port to 1.0 - Also port the decoder to the GstVideoDecoder - -2012-09-20 19:03:11 +0200 Edward Hervey <bilboed@bilboed.com> - - * configure.ac: - * sys/Makefile.am: - * sys/vdpau/Makefile.am: - * sys/vdpau/basevideodecoder/Makefile.am: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - * sys/vdpau/basevideodecoder/gstbasevideoutils.h: - * sys/vdpau/basevideodecoder/gstvideoframe.c: - * sys/vdpau/basevideodecoder/gstvideoframe.h: - * sys/vdpau/gstvdp/Makefile.am: - * sys/vdpau/gstvdp/gstvdp.c: - * sys/vdpau/gstvdp/gstvdp.h: - * sys/vdpau/gstvdp/gstvdpbuffer.c: - * sys/vdpau/gstvdp/gstvdpbuffer.h: - * sys/vdpau/gstvdp/gstvdpbufferpool.c: - * sys/vdpau/gstvdp/gstvdpbufferpool.h: - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.c: - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.h: - * sys/vdpau/gstvdp/gstvdputils.c: - * sys/vdpau/gstvdp/gstvdpvideobuffer.c: - * sys/vdpau/gstvdp/gstvdpvideobuffer.h: - * sys/vdpau/gstvdp/gstvdpvideobufferpool.c: - * sys/vdpau/gstvdp/gstvdpvideobufferpool.h: - * sys/vdpau/gstvdp/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdp/gstvdpvideosrcpad.h: - * sys/vdpau/gstvdpau.c: - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpdecoder.h: - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdpoutputbuffer.c: - * sys/vdpau/gstvdpoutputbuffer.h: - * sys/vdpau/gstvdpoutputbufferpool.c: - * sys/vdpau/gstvdpoutputbufferpool.h: - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/gstvdpsink.h: - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdputils.h: - * sys/vdpau/gstvdpvideobufferpool.c: - * sys/vdpau/gstvdpvideobufferpool.h: - * sys/vdpau/gstvdpvideomemory.c: - * sys/vdpau/gstvdpvideomemory.h: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - * sys/vdpau/h264/gsth264dpb.c: - * sys/vdpau/h264/gsth264dpb.h: - * sys/vdpau/h264/gsth264frame.c: - * sys/vdpau/h264/gsth264frame.h: - * sys/vdpau/h264/gsth264parser.c: - * sys/vdpau/h264/gsth264parser.h: - * sys/vdpau/h264/gstnalreader.c: - * sys/vdpau/h264/gstnalreader.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/h264/gstvdph264dec.h: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.h: - * sys/vdpau/mpeg/gstvdpmpegframe.c: - * sys/vdpau/mpeg/gstvdpmpegframe.h: - * sys/vdpau/mpeg/mpegutil.c: - * sys/vdpau/mpeg/mpegutil.h: - * sys/vdpau/mpeg4/gstmpeg4frame.h: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.c: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.h: - vdpau: Port to 1.0 - New base class for vdpau decoders - * mpeg2 ported and activated - * h264 ported but deactivated - * Uses GstMpegVideo meta - -2012-12-23 01:54:52 +0100 Edward Hervey <edward@collabora.com> - - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstmpegvideoparse.h: - mpegvideoparse: Only add meta if downstream needs it - It's not perfect, because in the cases where upstream doesn't - initiate an allocation query, we won't know. - -2012-09-20 18:27:11 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstmpegvideoparse.h: - mpegvideoparse: Store information in GstMpegVideo12Meta - FIXME : Only do so if we know downstream will need it - -2012-09-20 18:03:59 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/gstmpegvideometa.c: - * gst-libs/gst/codecparsers/gstmpegvideometa.h: - codecparsers: Add Mpeg Video GstMeta - This can be used by parsers to provide pre-parsed information to - downstream elements that would require it (so they can avoid having - to parse the bitstream again). - -2012-12-26 13:16:27 +0100 Edward Hervey <edward@collabora.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - codecparser: Fix picture packet extension size check - It is at least 34 bit big (5 bytes with byte padding) - -2013-03-31 12:11:48 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/dvbbasebin.h: - dvb: Move CAM handling to a separate GstTask - * No longer blocks in READY=>PAUSED (faster startup) - * No longer requires a pad probe - -2013-03-31 11:46:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Use gst_element_get_context() wherever possible - -2013-03-30 13:40:21 +0100 Edward Hervey <edward@collabora.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: We output time segments - Fixes #690949 - -2013-03-30 13:39:49 +0100 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - tsparse: Ensure segment events are forwarded - We skip them for tsdemux though (recreated later) - Fixes #690949 - -2013-03-30 10:25:24 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: push stream start event - -2013-03-30 10:57:08 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/midi/midiparse.c: - midiparser: ensure variable is initialized and fix debug message access - -2013-03-30 09:52:45 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparser: Fix a compiler warning about uninitialised variable use - -2013-03-28 17:48:04 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - * gst-libs/gst/egl/egl.c: - * gst-libs/gst/egl/egl.h: - eglglessink: Implement GstContext handling - -2013-03-29 16:11:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Use a separate texture for the custom textures - -2013-03-29 16:05:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - * ext/eglgles/video_platform_wrapper.c: - eglglessink: Add support for GstVideoGLTextureUploadMeta - -2013-03-29 10:33:10 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst-libs/gst/egl/egl.c: - egl: check on the proper display and indent some lines - -2013-03-28 14:36:16 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/shmpipe.c: - shm: Make sure the zero-sized array is always last in the struct - https://bugzilla.gnome.org/show_bug.cgi?id=696681 - -2013-03-25 14:18:24 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpenc.c: - srtp: Update example pipelines - -2013-03-28 17:36:07 +0000 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * sys/bluez/Makefile.am: - * sys/bluez/bluez-plugin.c: - * sys/bluez/gsta2dpsrc.c: - * sys/bluez/gsta2dpsrc.h: - bluez: Remove a2dpsrc bin - This element isn't really useful. The original plan was to use this to - eventually allow dynamically picking a format based on what we can - support while negotiating with the source device. We can just plug in a - decodebin downstream and it'll handle RTP depayloading and decoding of - whatever format we negotiated with the source device. - -2013-03-14 18:04:55 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * sys/bluez/gsta2dpsrc.c: - * sys/bluez/gstavdtpsrc.c: - * sys/bluez/gstavdtputil.c: - bluez: Compile fixes for avdtpsrc/a2dpsrc code against 1.x - -2013-03-14 13:09:15 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * sys/bluez/Makefile.am: - * sys/bluez/bluez-plugin.c: - bluez: Add avdtpsrc/a2dpsrc to build - -2013-03-14 12:58:16 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * sys/bluez/gstavdtpsink.c: - bluez: Fix up some problems that came in with cherry-pick - -2013-01-08 10:19:06 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * sys/bluez/gstavdtpsrc.c: - bluez: We work in TIME format with avdtpsrc - -2012-10-29 16:45:44 +0530 Wim Taymans <wim.taymans@collabora.co.uk> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gstavdtpsink.c: - bluez: Fix depreacation warnings on g_mutex_* - -2012-10-29 16:45:25 +0530 Wim Taymans <wim.taymans@collabora.co.uk> - - * sys/bluez/gsta2dpsrc.c: - * sys/bluez/gsta2dpsrc.h: - * sys/bluez/gstavdtpsrc.c: - * sys/bluez/gstavdtpsrc.h: - bluez: Fix a number of compiler warnings - -2012-10-29 15:49:02 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * sys/bluez/gstavdtputil.c: - * sys/bluez/gstavdtputil.h: - bluez: Fix some warnings in gstavdtputil.c - -2012-10-12 18:52:24 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * sys/bluez/gstavdtputil.c: - bluez: Fix typo in resetting the D-Bus connection - No real effect since FALSE and NULL are both 0 - -2012-10-11 15:48:56 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * sys/bluez/gstavdtpsrc.c: - bluez: Handle EOF in avdtpsrc correctly - -2012-10-11 08:57:01 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * sys/bluez/gstavdtpsrc.c: - bluez: Fix avdtpsrc getcaps() function - This is now a proper subset of the template caps. - -2012-10-11 08:38:16 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsrc.c: - * sys/bluez/gsta2dpsrc.h: - * sys/bluez/gstavdtputil.h: - bluez: Add an a2dpsrc bin element - This wraps avdtpsrc + rtpsbcdepay into a single element. when more - formats are supported in avdtpsrc, payloader selection will need to be - done dynamically. - This could also be extended to accept a device, connect to it, and - provide avdtpsrc a transport (instead of passing through a transport as - it does now). - -2012-10-11 08:24:06 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * sys/bluez/gstavdtpsrc.c: - bluez: Fix avdtpsrc classification - -2012-10-10 21:38:46 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * sys/bluez/gstavdtputil.c: - bluez: Bump up priority for sockets in AVDTP elements - This is based on the code in PulseAudio. - -2012-10-10 19:49:32 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * sys/bluez/gsta2dpsink.h: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsink.h: - * sys/bluez/gstavdtpsrc.c: - * sys/bluez/gstavdtpsrc.h: - * sys/bluez/gstavdtputil.c: - * sys/bluez/gstavdtputil.h: - bluez: Add an avdtpsrc element - Source element that connects to a given transport and reads audio over - AVDTP. Does not provide a clock but uses the system clock to timestamp - incoming packets. Only SBC is currently supported. - -2013-03-28 16:51:51 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/egl/egl.c: - * gst-libs/gst/egl/egl.h: - egl: Add a boxed type for GstEGLDisplay - -2013-03-28 13:18:59 +0000 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - sbc: actually enable plugin if libsbc is available - -2013-03-27 13:11:11 +0000 Tim-Philipp Müller <tim@centricular.net> - - * ext/sbc/Makefile.am: - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - sbc: port encoder to GstAudioEncoder - https://bugzilla.gnome.org/show_bug.cgi?id=690582 - -2013-03-26 13:55:32 +0000 Tim-Philipp Müller <tim@centricular.net> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - * ext/sbc/sbc-plugin.c: - sbc: port decoder to GstAudioDecoder - https://bugzilla.gnome.org/show_bug.cgi?id=690582 - -2013-01-16 11:36:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - * ext/sbc/Makefile.am: - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - * ext/sbc/sbc-plugin.c: - sbc: import sbc decoder/encoder from bluez and port to 1.0 - https://bugzilla.gnome.org/show_bug.cgi?id=690582 - -2013-03-27 22:24:03 +0000 Tim-Philipp Müller <tim@centricular.net> - - Merge SBC decoder and encoder from bluez - https://bugzilla.gnome.org/show_bug.cgi?id=690582 - -2013-03-26 16:50:42 -0700 David Schleef <ds@schleef.org> - - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstwatchdog.c: - * gst/debugutils/gstwatchdog.h: - watchdog: new element - -2013-03-27 00:56:31 +0000 Tim-Philipp Müller <tim@centricular.net> - - * ext/sbc/gstsbcparse.c: - * ext/sbc/gstsbcparse.h: - sbc: remove parser in favour of new GstBaseParse-based sbcparse in -good - -2013-01-08 10:19:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - sbc: sbcdec: make decoder more performant - Use an adapter to accumulate input buffers. - Decode all input in one output buffer when possible to reduce the amount of push - operations. - -2012-10-30 18:41:56 +0000 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/sbc/gstsbcdec.c: - sbc: sbcdec: skip the frame on decoding error - -2012-10-29 17:22:28 +0000 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/sbc/gstsbcdec.c: - sbc: sbcdec: set DISCONT on outgoing buffers. - -2012-10-29 17:19:50 +0000 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - sbc: sbcdec: handle DISCONT and timestamps - Reset state on discont. - Interpollate timestamps. - -2012-10-03 12:47:14 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * ext/sbc/gstsbcdec.c: - sbc: audio: Make the sbcdec element copy buffer metadata - Makes sure we don't lose timestamps, etc. - -2012-10-29 12:49:53 +0000 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/sbc/gstsbcenc.c: - sbc: enc: sbc_get_frame_duration is in milliseconds - -2012-10-29 12:37:09 +0000 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/sbc/gstsbcdec.c: - sbc: dec: chain up to parent before downward state change - -2012-10-12 18:53:16 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * ext/sbc/gstsbcdec.c: - sbc: audio: Fix a leak in sbcdec - -2012-09-26 09:54:01 +0800 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * ext/sbc/gstsbcparse.c: - sbc: audio: Initialise SBC data before use in sbcparse element - -2012-08-21 11:49:24 -0400 Anderson Lizardo <anderson.lizardo@openbossa.org> - - * ext/sbc/gstsbcutil.h: - sbc: Fix trivial coding style issues on pointer declarations and casting - Avoid using C++ style pointer declarations like "char* ptr", as most - BlueZ code uses "char *ptr". - -2012-04-12 20:33:06 +0530 Syam Sidhardhan <s.syam@samsung.com> - - * ext/sbc/gstsbcutil.h: - sbc: audio: Fix newline before EOF - -2011-07-02 12:32:40 -0300 Lucas De Marchi <lucas.demarchi@profusion.mobi> - - * ext/sbc/gstsbcutil.c: - sbc: Fix common misspelled words - Accounting of misspelled words, as detected by codespell: - acording 2 - ancilliary 1 - appropiate 1 - atribute 1 - cant 1 - comming 2 - gracefull 1 - lenght 1 - mispelled 1 - occured 1 - occurences 1 - ocurred 3 - prefered 1 - presense 1 - reponse 1 - seperate 1 - succesful 1 - successully 1 - sucessfull 1 - sucessfully 1 - -2011-02-13 17:51:45 -0800 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcdec.h: - * ext/sbc/gstsbcenc.h: - * ext/sbc/gstsbcparse.h: - sbc: audio: Remove workaround for compiler warnings - -2010-05-19 16:59:30 +0200 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcparse.c: - sbc: Add pragma based workaround for GStreamer warnings - -2010-01-01 17:08:17 -0800 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - * ext/sbc/gstsbcparse.c: - * ext/sbc/gstsbcparse.h: - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - sbc: Update copyright information - -2009-04-01 10:45:30 -0300 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcparse.c: - sbc: Remove unused variable. - -2009-04-01 10:29:31 -0300 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcdec.c: - sbc: Remove unused variable. - -2009-01-30 00:31:15 +0100 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcenc.h: - * ext/sbc/gstsbcutil.c: - sbc: Fix signed/unsigned comparison issue within GStreamer plugin - -2009-01-19 10:26:28 +0200 Siarhei Siamashka <siarhei.siamashka@gmail.com> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcenc.c: - sbc: Use native byte order for audio in GStreamer and ALSA plugins - This fixes endianness inconsistency between default SBC - configuration and GStreamer/ALSA. - -2009-01-01 19:33:20 +0100 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - * ext/sbc/gstsbcparse.c: - * ext/sbc/gstsbcparse.h: - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - sbc: Update copyright information - -2008-12-23 05:25:50 +0100 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - * ext/sbc/gstsbcparse.c: - * ext/sbc/gstsbcparse.h: - * ext/sbc/gstsbcutil.h: - sbc: First attempt in fixing compiler warnings (still needs cleanup) - -2008-12-23 04:21:57 +0100 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcutil.c: - sbc: Assign variables after declarations - -2008-12-20 21:42:49 +0200 Johan Hedberg <johan.hedberg@nokia.com> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcparse.c: - sbc: More coding style fixes - -2008-02-20 13:37:00 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcparse.c: - sbc: Fix runtime warnings of gstreamer plugin. - -2008-02-19 19:49:24 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - sbc: Update gstreamer plugin to use new sbc API. - -2008-02-14 21:22:38 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcutil.c: - sbc: Make use of parameters selected in alsa plugin and fix auto selection. - -2008-02-02 03:37:05 +0000 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - * ext/sbc/gstsbcparse.c: - * ext/sbc/gstsbcparse.h: - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - sbc: Update copyright information - -2008-02-01 19:28:37 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - sbc: Add bitpool property and others fixes for gstreamer plugin. - -2008-01-30 17:30:27 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcparse.c: - * ext/sbc/gstsbcparse.h: - sbc: Enable gstreamer plugin to use autoconnect flag. - -2008-01-30 14:21:43 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - * ext/sbc/gstsbcparse.c: - * ext/sbc/gstsbcutil.c: - sbc: Fixes gstreamer caps and code cleanup. - -2008-01-24 14:25:29 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcutil.c: - sbc: Fix gtreamer payloader sending fragmented frames. - -2008-01-23 13:19:32 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - sbc: Add mp3 support for gstreamer plugin. - -2008-01-23 13:14:02 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - * ext/sbc/gstsbcparse.c: - * ext/sbc/gstsbcparse.h: - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - sbc: Make a2dpsink to act like a bin and split the payloader. - -2007-11-23 17:00:13 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - sbc: Code cleanup. - -2007-11-21 20:24:11 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - * ext/sbc/gstsbcparse.c: - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - sbc: Integrate new ipc API implementation. - -2007-11-13 20:04:12 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcenc.c: - sbc: Add sbc_reinit. - -2007-11-12 22:21:45 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcenc.c: - sbc: Fix bug in sbcenc when changing encoder parameters. - -2007-11-12 18:15:59 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcenc.c: - sbc: Make sbc codec to write directly in application buffers and so avoiding memcpys. - -2007-11-01 19:45:00 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - * ext/sbc/gstsbcparse.c: - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - sbc: Fix sbc negotiation and improves buffer handling by using GstAdapter. - -2007-11-01 13:56:51 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcenc.c: - sbc: Fix buffers timestamps in sbcenc. - -2007-10-29 15:02:26 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcparse.c: - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - sbc: Add bitpool capability. - -2007-10-24 21:51:37 +0000 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcparse.c: - sbc: Some more coding style changes - -2007-10-24 21:36:29 +0000 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcutil.c: - sbc: Don't forget to include the config options - -2007-10-24 21:33:18 +0000 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - sbc: Fix coding style issues - -2007-10-18 22:46:12 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcparse.c: - sbc: Fix coding style issues. - -2007-10-18 21:47:53 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcparse.c: - sbc: Fixes sbcparser element. - -2007-10-18 21:46:49 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - * ext/sbc/gstsbcutil.c: - sbc: Fixes for gstsbcenc. - -2007-10-18 21:45:14 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * ext/sbc/gstsbcutil.c: - * ext/sbc/gstsbcutil.h: - sbc: Add gstsbcutil.c and gstsbcutil.h. - -2007-08-27 14:10:00 +0000 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcparse.c: - sbc: Force LITTLE_ENDIAN instead of BYTE_ORDER for now - -2007-08-26 13:59:05 +0000 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcparse.c: - * ext/sbc/gstsbcparse.h: - sbc: Implement full parsing support - -2007-08-26 13:12:47 +0000 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - sbc: Add mode property to the encoder - -2007-08-25 19:32:03 +0000 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - sbc: Implement full encoding support - -2007-08-25 18:50:28 +0000 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcdec.c: - sbc: Fix class variable naming - -2007-08-25 17:37:05 +0000 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcdec.c: - sbc: Limit the supported output rates - -2007-08-25 17:03:03 +0000 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - sbc: Implement full decoding support - -2007-08-23 19:12:23 +0000 Marcel Holtmann <marcel@holtmann.org> - - * ext/sbc/gstsbcdec.c: - * ext/sbc/gstsbcdec.h: - * ext/sbc/gstsbcenc.c: - * ext/sbc/gstsbcenc.h: - sbc: Add SBC encoder and decoder skeletons for GStreamer - -2013-03-27 09:08:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Make sure that all buffers in our pool contain our own memory - -2013-03-26 15:22:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * sys/wasapi/Makefile.am: - * sys/wasapi/gstwasapi.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - wasapi: Initial port to 1.0 - This should really use GstAudioSink and GstAudioSrc. - -2013-03-26 15:01:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/wasapi/gstwasapi.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapiutil.c: - wasapi: Include config.h before anything else - -2013-03-26 14:15:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: Add support for crop meta - -2013-03-26 13:22:22 +0000 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - build: we need a recent-enough gnutls for hls - https://bugzilla.gnome.org/show_bug.cgi?id=696597 - -2012-12-22 21:59:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dhelpers.h: - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: Implement a buffer pool that shares D3D surfaces with upstream - -2012-12-22 19:12:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Allocate a new offscreen surface for every buffer - This is a preparation for implementing a buffer pool. - -2013-03-25 18:04:09 -0700 David Schleef <ds@schleef.org> - - * gst/mxf/mxfdemux.c: - mxfdemux: Use %03u for format in gst_pad_create_stream_id_printf() - -2013-03-25 13:48:20 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpenc.c: - srtp: Fix filter handling in caps negotiation to keep filter content - -2013-03-25 09:45:30 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * sys/applemedia/Makefile.am: - applemedia: fix build for objc - The obj-c api version option is required to get applemedia to - build for ios, otherwise it won't find some symbols during linking - -2013-03-25 10:10:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlaced: set both DTS and PTS - Handle both dts and pts on output buffers. - -2013-03-10 12:17:05 +1300 Douglas Bagnall <douglas@paradise.net.nz> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: remove unused current_program_number field - https://bugzilla.gnome.org/show_bug.cgi?id=690934 - -2013-03-22 19:40:58 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/rawparse/gstrawparse.c: - rawparse: send segment event in time format also in push mode - When converting the incoming segment from byte to time format, - don't just convert the start/stop/time values, but also change - the segment format to TIME. - https://bugzilla.gnome.org/show_bug.cgi?id=696361 - -2013-03-22 15:30:32 +0000 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - configure: fix build if gnutls is not present - Skip build of hls plugin if gnutls headers can't be found. - https://bugzilla.gnome.org/show_bug.cgi?id=696392 - -2013-03-22 15:49:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/y4m/gsty4mdec.c: - * gst/y4m/gsty4mdec.h: - y4mdec: Use the correct strides as used by y4m and convert to GStreamer strides if necessary - https://bugzilla.gnome.org/show_bug.cgi?id=696361 - -2013-03-22 15:19:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/fluidsynth/Makefile.am: - * ext/fluidsynth/gstfluiddec.c: - * ext/fluidsynth/gstfluiddec.h: - fluidsynth: rename to fluiddec - Rename the fluidsynth plugin to fluidsynthmidi and the decoder - to fluiddec to avoid conflicts with buzztard. - -2013-03-22 14:52:54 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/y4m/gsty4mdec.c: - y4mdec: Use the default event/query handlers for the default handling - Especially don't forward caps events from the sinkpad to the srcpad. - https://bugzilla.gnome.org/show_bug.cgi?id=696282 - -2013-03-22 14:37:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/y4m/gsty4mdec.c: - y4mdec: Properly handle segment and time values of -1 - -2013-03-22 14:48:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/midi/midi.c: - midi: set midi parser rank primary - Now that it supports seeking and all, mark it primary - -2013-03-22 13:49:49 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/midi/midiparse.c: - midiparse: always seek back to beginning - We always need to seek back to the beginning because when we do a flushing seek, - we might have lost events downstream. - -2013-03-22 13:48:26 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/fluidsynth/gstfluidsynth.c: - fluidsynth: fix debug of segment structure - -2013-03-22 13:48:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/fluidsynth/gstfluidsynth.c: - * ext/fluidsynth/gstfluidsynth.h: - fluidsynth: handle discont - -2013-03-22 12:25:16 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/midi/midiparse.c: - * gst/midi/midiparse.h: - midiparse: implement seeking - Seek back to 0 for backward seeking and let things run and clip for forwards - seeking. - -2013-03-22 12:16:45 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/fluidsynth/gstfluidsynth.c: - fluidsynth: reset on flush and state change - -2013-03-22 11:04:10 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/fluidsynth/gstfluidsynth.c: - * ext/fluidsynth/gstfluidsynth.h: - fluidsynth: add properties - Add properties. - Try to find a good default soundfont when not specified. - -2013-03-22 08:54:54 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/fluidsynth/gstfluidsynth.c: - fluidsynth: log midi tick event - -2013-03-22 08:54:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/fluidsynth/gstfluidsynth.c: - fluidsynth: redirect logging to gst logging functions - -2013-03-21 18:18:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/midi/midiparse.c: - midiparse: simplify the callbacks - We only need one callback to send bytes out. - -2013-03-21 18:17:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/fluidsynth/gstfluidsynth.c: - fluidsynth: improve debug - -2013-03-21 17:25:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/midi/midiparse.c: - midiparse: clean up tracks - -2013-03-21 17:16:24 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/midi/midiparse.c: - * gst/midi/midiparse.h: - midiparse: don't leak midi data - -2013-03-21 17:05:36 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/fluidsynth/gstfluidsynth.c: - * ext/fluidsynth/gstfluidsynth.h: - fluidsynth: produce more accurate timestamps - -2013-03-21 16:05:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/midi/midiparse.c: - midiparse: small cleanups in error paths - -2013-03-21 16:05:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/midi/midiparse.c: - midiparse: duration is max of all track durations - -2013-03-21 16:04:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/midi/midiparse.c: - midiparse: fix klass - -2013-03-21 15:43:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/opensles/openslesringbuffer.c: - opensles: Include string.h for memcpy() - -2013-03-21 15:00:16 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/midi/midiparse.c: - * gst/midi/midiparse.h: - midiparse: Update duration - Rework things a bit so that we can run over the midi events and fire callbacks - for each of them. We can then use that for calculating the duration and also for - doing playback. - Only parse as many tracks as specified in the header. - Fix default tempo; - Send MIDI tick events every 10ms - -2013-03-21 14:57:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/fluidsynth/gstfluidsynth.c: - fluidsynth: add more debug - -2013-03-21 09:30:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/midi/midiparse.c: - midiparse: handle midi in RIFF - -2013-03-21 07:21:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/midi/midiparse.c: - midiparse: small fixes - -2013-03-21 07:07:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/midi/midi.c: - midi: set rank as marginal - Set the mark to marginal until we implement more features. - -2013-03-21 07:05:54 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - * ext/fluidsynth/Makefile.am: - * ext/fluidsynth/gstfluidsynth.c: - * ext/fluidsynth/gstfluidsynth.h: - fluidsynth: add fluidsynth midi renderer - Add a fluidsynth element that converts midi events into raw - float samples. - -2013-03-21 06:50:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * gst/midi/Makefile.am: - * gst/midi/midi.c: - * gst/midi/midiparse.c: - * gst/midi/midiparse.h: - midiparse: add basic midi parser - Parses midi files and outputs buffers with midi events. - -2013-03-20 15:29:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/ivtc/Makefile.am: - ivtc: fix make dist - -2013-03-20 15:25:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/Makefile.am: - Dist hls as well - -2013-03-20 15:19:15 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: actually build hls plugin - -2013-03-20 10:49:04 +0000 Tim-Philipp Müller <tim@centricular.net> - - * sys/decklink/gstdecklinksink.cpp: - decklinksink: fix some compiler warnings - -2013-03-19 16:39:03 -0700 David Schleef <ds@schleef.org> - - * gst/ivtc/gstcombdetect.c: - * gst/ivtc/gstcombdetect.h: - * gst/ivtc/gstivtc.c: - * gst/ivtc/gstivtc.h: - combdetect,ivtc: code cleanup - -2013-03-19 17:28:16 -0700 David Schleef <ds@schleef.org> - - * tools/element-templates/sinkpad-audio: - * tools/element-templates/sinkpad-simple: - * tools/element-templates/sinkpad-template-video: - * tools/element-templates/srcpad-audio: - * tools/element-templates/srcpad-simple: - * tools/element-templates/srcpad-template-video: - * tools/gst-element-maker: - element-maker: remove sinkpad/srcpad fields - Information is in the base class anyway, plus pad creation was - done incorrectly. - -2013-03-19 12:19:27 -0700 David Schleef <ds@schleef.org> - - * gst/ivtc/gstcombdetect.c: - combdetect: output progressive video - -2013-03-18 16:22:55 -0700 David Schleef <ds@schleef.org> - - * gst/ivtc/gstcombdetect.c: - combdetect: code cleanup - -2013-03-12 17:47:52 -0700 David Schleef <ds@schleef.org> - - * gst/ivtc/gstcombdetect.c: - combdetect: switch to zebra striping - -2013-03-08 17:02:14 -0800 David Schleef <ds@schleef.org> - - * gst/ivtc/gstivtc.c: - ivtc: drop early fields - -2013-02-20 15:32:15 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/ivtc/Makefile.am: - * gst/ivtc/gstcombdetect.c: - * gst/ivtc/gstcombdetect.h: - * gst/ivtc/gstivtc.c: - * gst/ivtc/gstivtc.h: - ivtc: new inverse telecine filter - This filter converts interlaced content that was originally - telecine'd from 24 fps (or similar) progressive content. It works - approximately like videorate, but with awareness of interlacing. - It merges neighboring fields in the input interlaced stream with - the goal of minimizing combing artifacts, while keeping the output - framerate constant. If it cannot avoid combing artifacts, it will - reconstruct the image from a single field. Note that this filter - does not autodetect the framerate, but will automatically fixate - at 24 fps. - -2013-03-19 14:31:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/egl/egl.c: - egl: Fix some return values in g_return_val_if_fail() - -2013-03-19 13:54:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - wildmidi: fix event and query handler - Call the default implementation for unknown events and queries. - Fix event leak. - -2013-03-19 10:47:25 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * Makefile.am: - * configure.ac: - * ext/Makefile.am: - * ext/hls/Makefile.am: - * ext/hls/gstfragment.c: - * ext/hls/gstfragment.h: - * ext/hls/gstfragmented.h: - * ext/hls/gstfragmentedplugin.c: - * ext/hls/gsthlsdemux.c: - * ext/hls/gsthlsdemux.h: - * ext/hls/gsthlssink.c: - * ext/hls/gsthlssink.h: - * ext/hls/gstm3u8playlist.c: - * ext/hls/gstm3u8playlist.h: - * ext/hls/gsturidownloader.c: - * ext/hls/gsturidownloader.h: - * ext/hls/m3u8.c: - * ext/hls/m3u8.h: - Make the hls plugin depend on gnutls and move to ext/hls/ - gnutls is used to implement AES decryption - -2013-03-19 10:26:14 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: use gnutls instead of openssl - -2013-03-19 08:49:21 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/hls/gsthlsdemux.c: - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - hlsdemux: support encrypted streams - -2013-03-19 10:14:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * ext/timidity/gstwildmidi.c: - port wildmidi - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=696041 - -2013-03-18 21:12:00 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * sys/decklink/gstdecklinksink.cpp: - decklinksink: obtain class from object - -2013-03-18 21:01:59 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/hls/m3u8.c: - hlsdemux: fix invalid free() introduced by last commit - -2013-03-07 22:19:15 +0000 Kevin Thornberry <gimmeamilkbttf@gmail.com> - - * gst/mpegtsmux/mpegtsmux_aac.c: - mpegtsmux: fix creation of ADTS header for AAC audio in MPEG-TS - https://bugzilla.gnome.org/show_bug.cgi?id=695412 - -2013-03-18 07:34:13 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - hlsdemux: parse #EXT-X-KEY tags - -2013-03-18 07:22:36 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/hls/m3u8.c: - hlsdemux: factor out URI joining utility - -2013-03-18 07:02:54 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/hls/m3u8.c: - hlsdemux: fix URI parsing for absolute fragment paths - -2013-03-16 23:32:12 +0000 Tim-Philipp Müller <tim@centricular.net> - - * sys/decklink/gstdecklinksrc.cpp: - decklinksrc: set discont flag on first audio buffer too - -2013-03-16 23:29:35 +0000 Tim-Philipp Müller <tim@centricular.net> - - * sys/decklink/gstdecklinksrc.cpp: - decklinksrc: aggregate audio and video flow returns - And pause task in some more cases where we should - pause the task. - -2013-03-16 21:39:20 +0000 Tim-Philipp Müller <tim@centricular.net> - - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklinksrc: add send_event handler so application can inject EOS event - This is needed to shut down a recording pipeline cleanly. - https://bugzilla.gnome.org/show_bug.cgi?id=680700 - -2013-03-16 21:34:57 +0000 Tim-Philipp Müller <tim@centricular.net> - - * sys/decklink/gstdecklinksrc.cpp: - decklinksrc: pause streaming thread and send EOS event on error - Instead of just posting an EOS message and continuing, - actually pause the thread. - -2013-03-16 13:13:14 -0400 Jean-François Fortin Tam <nekohayo@gmail.com> - - * gst/frei0r/gstfrei0r.c: - frei0r: improve readability of RGB and XY property nickname strings - Also fix the Y prop nickname string being incorrect. - https://bugzilla.gnome.org/show_bug.cgi?id=695884 - -2013-03-16 13:07:25 -0400 Jean-François Fortin Tam <nekohayo@gmail.com> - - * gst/frei0r/gstfrei0r.c: - frei0r: fix nicknames for color and position properties - https://bugzilla.gnome.org/show_bug.cgi?id=695884 - -2013-03-15 20:21:47 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - configure: Mark decklink as ported - -2013-03-15 00:25:43 -0700 David Schleef <ds@schleef.org> - - * tools/element-templates/sinkpad-template: - * tools/element-templates/sinkpad-template-video: - * tools/element-templates/srcpad-template: - * tools/element-templates/srcpad-template-video: - element-maker: clean up bits from previous commit - Files that were supposed to be in the previous element-maker - commit. This is what happens when cherry-pick doesn't work. - -2013-03-15 17:47:23 +0100 Rico Tzschichholz <ricotz@t-online.de> - - * tools/Makefile.am: - tools: Fix make dist - Missing bits of b45a1df5deadb029dcbe4522f0116d34f1cd2f1e - -2013-03-15 09:29:42 +0100 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/srtp/gstsrtpenc.c: - srtp: fix compilation warning returning NULL in case of error - https://bugzilla.gnome.org/show_bug.cgi?id=695897 - -2013-03-15 09:27:36 +0100 Jose Antonio Santos Cadenas <santoscadenas@gmail.com> - - * ext/srtp/gstsrtp.c: - srtp: use constant AES_128_ICM instead of AES_ICM that is not found - https://bugzilla.gnome.org/show_bug.cgi?id=695897 - -2013-03-01 16:52:41 -0800 David Schleef <ds@schleef.org> - - * gst/segmentclip/gstvideosegmentclip.c: - videosegmentclip: Don't leak buffers after segment - -2013-03-12 17:32:51 -0700 David Schleef <ds@schleef.org> - - * gst/videosignal/gstvideosignal.c: - videosignal: add FIXME for future revival - -2013-03-14 23:57:06 -0700 David Schleef <ds@schleef.org> - - * tools/element-templates/audiodecoder: - * tools/element-templates/audioencoder: - * tools/element-templates/audiofilter: - * tools/element-templates/audiosink: - * tools/element-templates/audiosrc: - * tools/element-templates/base: - * tools/element-templates/baseaudiosink: - * tools/element-templates/baseaudiosrc: - * tools/element-templates/baseparse: - * tools/element-templates/basertpdepayload: - * tools/element-templates/basertppayload: - * tools/element-templates/basesink: - * tools/element-templates/basesrc: - * tools/element-templates/basetransform: - * tools/element-templates/cddabasesrc: - * tools/element-templates/element: - * tools/element-templates/gobject: - * tools/element-templates/pushsrc: - * tools/element-templates/sinkpad-audio: - * tools/element-templates/srcpad-audio: - * tools/element-templates/tagdemux: - * tools/element-templates/videodecoder: - * tools/element-templates/videoencoder: - * tools/element-templates/videofilter: - * tools/element-templates/videofilter2: - * tools/element-templates/videosink: - * tools/gst-element-maker: - element-maker: Update templates for 1.0 - This are (almost) completely autogenerated from the documentation. - -2013-02-05 16:34:20 -0800 David Schleef <ds@schleef.org> - - * gst/mxf/mxfaes-bwf.c: - mxfdemux: Add a second MXF UL for uncompressed audio - -2013-02-05 15:58:53 -0800 David Schleef <ds@schleef.org> - - * gst/mxf/mxfmetadata.c: - mxfdemux: Ignore missing metadata descriptors - -2013-03-14 12:09:49 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: don't stop tasks in paused - A non-live element is supposed to continue streaming in the paused state so - don't stop the tasks when going to paused. - We also always want to start the update task after we prerolled enough data, - not only in the playing state. - -2013-03-14 12:08:35 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: add more debug - -2013-03-13 12:50:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Add support for different EGLImage orientations - -2013-03-13 11:29:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/egl/egl.c: - * gst-libs/gst/egl/egl.h: - egl: Add support for different orientations of the EGLImage - The content of the EGLImages can be at least in GStreamer orientation, - meaning top line first in memory, or OpenGL orientation, meaning - bottom line first in memory. - -2013-03-13 11:09:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add RGBA to the caps again - -2013-03-13 00:25:48 +0000 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/mpegtsmux.c: - tests: fix up mpegtsmux unit test after collectpads change - It was passing expected flow returns (which might be negative) - in the buffer timestamp field, which was maybe not the best - idea. - -2013-03-11 21:55:28 -0600 Greg Rutz <greg@gsr-tek.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: fix improper video frame clear operation - The current code is memsetting the GstVideoFrame.data address to 0s (which - causes a segfault). This member is actually an array of data buffers (one for - each plane). This fix iterates over each data plane to clear them all. - https://bugzilla.gnome.org/show_bug.cgi?id=695655 - -2013-03-12 19:47:51 -0400 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * ext/Makefile.am: - * ext/srtp/.gitignore: - * ext/srtp/Makefile.am: - * ext/srtp/gstsrtp.c: - * ext/srtp/gstsrtp.h: - * ext/srtp/gstsrtpdec.c: - * ext/srtp/gstsrtpdec.h: - * ext/srtp/gstsrtpenc.c: - * ext/srtp/gstsrtpenc.h: - srtp: Add SRTP plugin based on libsrtp - In large part the work of Gabriel Millaire - -2013-03-12 19:36:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Make sure the buffer is released to the pool if it's the last used one - -2013-03-10 22:06:31 +0100 Josep Torra <n770galaxy@gmail.com> - - * sys/applemedia/miovideosrc.c: - applemedia: suppress warnings for deprecated glib API - -2013-03-10 21:21:17 +0100 Josep Torra <n770galaxy@gmail.com> - - * sys/shm/gstshmsink.c: - shmsink: Use correct print format specifiers to fix compiler warnings - -2013-03-09 01:06:31 +0000 Tim-Philipp Müller <tim@centricular.net> - - * Android.mk: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-dtmf.xml: - * gst-plugins-bad.spec.in: - * gst/dtmf/Makefile.am: - * gst/dtmf/gstdtmf.c: - * gst/dtmf/gstdtmfcommon.h: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfdepay.h: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/dtmf.c: - Remove DTMF plugin, moved to -good - https://bugzilla.gnome.org/show_bug.cgi?id=687416 - -2013-03-09 00:17:45 +0000 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - * sys/fbdev/Makefile.am: - * sys/fbdev/gstfbdevsink.c: - * sys/fbdev/gstfbdevsink.h: - fbdev: port fbdevsink to 1.0 - -2013-03-07 11:58:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: There are only two GLSL programs, not three - -2013-03-07 11:50:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: gst_buffer_pool_config_get_allocator() does *not* return a new reference to the allocator - Different to gst_query_get_n_allocation_params() which does - -2013-03-07 00:01:34 +0000 Tim-Philipp Müller <tim@centricular.net> - - * common: - Automatic update of common submodule - From ae05558 to 04c7a1e - -2013-03-06 17:53:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix allocation of RGBA textures - -2013-03-06 10:53:59 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Make sure to set the NO_SHARE flag on the EGLImage memories - See https://bugzilla.gnome.org/show_bug.cgi?id=695203 - -2013-03-05 12:47:07 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Always use an RGBA configuration - -2013-02-27 13:15:54 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in: - pkg-config: Add egl library to the generic pkg-config file - -2013-02-25 13:43:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Properly negotiate an allocator - -2013-02-25 13:31:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/egl/egl.c: - * gst-libs/gst/egl/egl.h: - egl: Rename gst_egl_image_memory_can_map() to is_mappable() - -2013-02-25 13:25:58 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/egl/egl.c: - * gst-libs/gst/egl/egl.h: - egl: Remove buffer pool option - This should be done differently via the allocators in the allocation query. - -2013-02-22 13:07:07 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * gst-libs/gst/egl/egl.c: - * gst-libs/gst/egl/egl.h: - egl: Mark memory as not mappable if it isn't - -2013-02-22 12:48:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/egl/egl.c: - egl: Implement sharing of memory - -2013-02-22 11:23:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Store a reference to the last_buffer if using EGLImages - -2013-02-22 10:58:19 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix compiler warning on RPi - -2013-02-21 17:43:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - * ext/eglgles/video_platform_wrapper.c: - * ext/eglgles/video_platform_wrapper.h: - eglglessink: Port to new EGL library - -2013-02-21 14:40:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/eglgles/Makefile.am: - egl: Move configure checks around and re-use for eglglessink plugin - -2013-02-21 13:39:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/egl/Makefile.am: - * gst-libs/gst/egl/egl.c: - * gst-libs/gst/egl/egl.h: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-egl-uninstalled.pc.in: - * pkgconfig/gstreamer-egl.pc.in: - egl: Add infrastructure for EGLImage handling - -2013-03-03 12:30:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/opensles/openslesringbuffer.h: - * sys/opensles/openslessink.h: - * sys/opensles/openslessrc.h: - opensles: Only include <gst/audio/audio.h> - -2013-03-03 12:30:32 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/pesparse.c: - mpegtsdemux: Fix various compiler warnings - -2013-03-03 12:30:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparse: Use correct type specifiers for format strings to fix compiler warnings - -2013-03-03 12:29:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: Use correct type specifiers for format strings to fix compiler warnings - -2013-03-03 12:29:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix GST_ERROR_OBJECT() parameters - -2013-03-03 10:54:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/freeverb/gstfreeverb.c: - freeverb: Fix compiler warning caused by wrong format specifier - -2013-03-01 15:58:40 -0500 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/shm.c: - tests: Add unit tests for shmsink/shmsrc - -2013-03-01 00:10:46 +0000 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - * ext/opencv/Makefile.am: - * ext/opencv/gsthanddetect.c: - opencv: use pkgdatadir locally to construct path for custom haar cascades - https://bugzilla.gnome.org/show_bug.cgi?id=685655 - -2013-01-30 14:37:18 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - * ext/opencv/Makefile.am: - * ext/opencv/gsthanddetect.c: - * ext/opencv/gsthanddetect.h: - * ext/opencv/gstopencv.c: - * tests/examples/opencv/Makefile.am: - * tests/examples/opencv/gsthanddetect_test.c: - opencv: port handdetect element to 1.0 and add to build - https://bugzilla.gnome.org/show_bug.cgi?id=685655 - -2013-01-27 19:05:27 +0200 Andol Li <andol@andol.info> - - * ext/opencv/fist.xml: - * ext/opencv/gsthanddetect.c: - * ext/opencv/gsthanddetect.h: - * ext/opencv/palm.xml: - * tests/examples/opencv/gsthanddetect_test.c: - opencv: add handdetect plugin, initial implementation - The handdetect plugin is for detecting hand gestures using - opencv. - It was created in the course of the Google Summer of Code. - https://bugzilla.gnome.org/show_bug.cgi?id=685655 - -2012-09-26 16:00:39 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsink.h: - * sys/shm/gstshmsrc.c: - * sys/shm/shmpipe.c: - * sys/shm/shmpipe.h: - shmsink: Add custom allocator to allow for zero-copy shared memory use - -2013-02-28 18:13:44 -0500 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsrc.c: - shm: Don't leak socket path - -2013-02-28 20:22:50 +0000 Tim-Philipp Müller <tim@centricular.net> - - * .gitignore: - examples: ignore new test-uvch264 binary - -2013-02-28 20:11:38 +0000 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/Makefile.am: - * tests/check/elements/camerabin.c: - tests: camerabin: report element creation failures better and fix up LIBS - -2013-02-28 20:09:29 +0000 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/mxfmux.c: - * tests/check/pipelines/mxf.c: - tests: update some element names for 1.0 - -2013-02-28 20:02:16 +0000 Tim-Philipp Müller <tim@centricular.net> - - * common: - * configure.ac: - * tests/check/Makefile.am: - tests: find uninstalled gst-libav plugins for unit tests - -2013-02-28 18:54:15 +0000 Tim-Philipp Müller <tim@centricular.net> - - * sys/decklink/Makefile.am: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksink.h: - decklinksink: port to 1.0 - Compiles, not tested yet. - -2013-02-28 18:53:54 +0000 Tim-Philipp Müller <tim@centricular.net> - - * sys/decklink/gstdecklinksrc.cpp: - decklinksrc: add layout=interleaved to audio caps - -2012-11-08 13:22:41 -0800 Blake Tregre <blake@oblong.com> - - * sys/shm/shmpipe.c: - shm: use O_CLOEXEC where appropriate in shmpipe - https://bugzilla.gnome.org/show_bug.cgi?id=684339 - -2013-02-28 16:55:05 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/rawparse/gstrawparse.c: - rawparse: fix caps leak - -2013-02-28 13:25:06 +0100 Jonas Holmberg <jonashg@axis.com> - - * tests/check/elements/dtmf.c: - tests: use relative include for out-of-tree builds in dtmf test - -2013-02-28 12:04:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/video_platform_wrapper.c: - eglglessink: gst_video_sink_center_rect() takes the structs itself instead of pointers as first parameters - -2013-02-28 11:27:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/video_platform_wrapper.c: - eglglessink: Fix aspect-ratio issues caused by scaling on RPi - -2013-02-27 21:05:38 -0500 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/gstshmsink.c: - * sys/shm/shmpipe.c: - * sys/shm/shmpipe.h: - shmsink: Error out if memory area is smaller than buffer - -2013-02-27 20:57:56 -0500 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/shmalloc.c: - shm: Make sure to not allocate blocks larger than the shared mem area - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=681359 - -2013-02-27 18:56:50 -0500 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/dtmf.c: - tests: Add tests for dtmfsrc - -2013-02-27 23:27:20 +0000 Tim-Philipp Müller <tim@centricular.net> - - * sys/decklink/Makefile.am: - * sys/decklink/capture.cpp: - * sys/decklink/capture.h: - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklinksrc: port to 1.0 - Compiles, not tested yet. A great number of superfluous custom - pad functions may have been harmed in the making of this port. - -2013-02-27 16:15:27 -0500 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/dtmf.c: - tests: Fix ref leak in dtmf test - -2013-02-27 13:14:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in: - * pkgconfig/gstreamer-plugins-bad.pc.in: - pkg-config: Make the generic pkg-config file more useful - -2013-02-23 09:11:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfcdec: Use new GST_MEMORY_FLAG_CONTIGUOUS instead of requiring a specific memory type - -2013-02-19 13:00:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: add all supported video formats to template caps - We now use gst_video_overlay_composition_blend(), so can support - all video formats supported by that, not just I420. - -2013-02-19 11:24:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: proxy the allocation query - Pass allocation query downstream. - -2013-02-19 11:14:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: don't forward CAPS event from subtitle pad - May results in not-negotiated flow errors otherwise. - -2013-02-16 02:44:19 +0100 Ole André Vadla Ravnås <oleavr@soundrop.com> - - * sys/applemedia/avfvideosrc.h: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/bufferfactory.h: - * sys/applemedia/bufferfactory.m: - * sys/applemedia/celapi.c: - * sys/applemedia/celapi.h: - * sys/applemedia/celvideosrc.c: - * sys/applemedia/celvideosrc.h: - * sys/applemedia/cmapi.c: - * sys/applemedia/cmapi.h: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/coremediabuffer.h: - * sys/applemedia/coremediactx.c: - * sys/applemedia/coremediactx.h: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/corevideobuffer.h: - * sys/applemedia/cvapi.c: - * sys/applemedia/cvapi.h: - * sys/applemedia/dynapi-internal.h: - * sys/applemedia/dynapi.c: - * sys/applemedia/dynapi.h: - * sys/applemedia/mioapi.c: - * sys/applemedia/mioapi.h: - * sys/applemedia/miovideodevice.c: - * sys/applemedia/miovideodevice.h: - * sys/applemedia/miovideosrc.c: - * sys/applemedia/miovideosrc.h: - * sys/applemedia/mtapi.c: - * sys/applemedia/mtapi.h: - * sys/applemedia/plugin.m: - * sys/applemedia/qtkitvideosrc.h: - * sys/applemedia/qtkitvideosrc.m: - * sys/applemedia/vtapi.c: - * sys/applemedia/vtapi.h: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - * sys/applemedia/vth264decbin.c: - * sys/applemedia/vth264decbin.h: - * sys/applemedia/vth264encbin.c: - * sys/applemedia/vth264encbin.h: - * sys/applemedia/vtutil.c: - * sys/applemedia/vtutil.h: - applemedia: update contact information - -2013-02-16 02:38:36 +0100 Ole André Vadla Ravnås <oleavr@soundrop.com> - - * sys/applemedia/coremediabuffer.h: - applemedia: fix gst_buffer_get_core_media_meta macro - -2013-02-16 02:37:11 +0100 Ole André Vadla Ravnås <oleavr@soundrop.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/plugin.m: - * sys/applemedia/vtenc.c: - applemedia: port vtenc to 1.0 - -2013-02-16 02:31:28 +0100 Ole André Vadla Ravnås <oleavr@soundrop.com> - - * sys/applemedia/vtdec.c: - applemedia: replace usage of deprecated gst_pad_set_caps() in vtdec - -2013-02-16 02:26:51 +0100 Ole André Vadla Ravnås <oleavr@soundrop.com> - - * sys/applemedia/vtapi.c: - * sys/applemedia/vtapi.h: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - applemedia: port vtapi to run on OS X 10.8 - -2013-02-15 08:20:59 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/freeverb/gstfreeverb.c: - freeverb: remove channel-mask from caps - The channel-mask is only needed for channels>2 which we don't do. - -2013-02-14 10:43:42 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/mpegtsmux.c: - tests: fix h264 caps in mpegtsmux test - Needs to be stream-format=byte-stream, not format=byte-stream. - -2013-02-14 10:40:36 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/faad.c: - tests: fix faad unit test for gst_caps_is_subset() fix in core - Need to specify the stream-format. - -2013-02-14 09:40:08 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpeg4videoparse.h: - Revert "mpeg4videoparse: set 0 duration when vop_coded is 0" - This reverts commit d3219a261a5a7b7340b63c80010009a73b032759. - vop_coded 0 means that the previous frame should be repeated, - so it should have valid duration after all. - https://bugzilla.gnome.org/show_bug.cgi?id=683169 - -2013-02-14 09:03:28 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/insertbin/Makefile.am: - * gst-libs/gst/insertbin/gstinsertbin.h: - insertbin: mark as unstable API - -2013-02-14 09:02:53 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/insertbin/gstinsertbin.c: - insertbin: fix up gtk-doc chunk and add since markers - -2013-02-13 15:00:09 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/uvch264demux.c: - tests: port uvch264 test to 1.0 - Fixes 'make check' build. - -2013-02-13 15:20:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/video_platform_wrapper.c: - eglglessink: Close the dispman display on RPi after usage - -2013-02-13 15:09:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: For RPi, initialize bcm_host in plugin_init() - -2013-02-13 15:06:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - eglglessink: Also check for all the required libraries and headers for RPi - -2013-02-13 12:51:58 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/h263parse.c: - * tests/check/elements/mpeg4videoparse.c: - * tests/check/elements/mpegvideoparse.c: - videoparsers: Use complete and valid caps in the tests - -2013-02-12 18:36:10 +0100 Julian Scheel <julian@jusst.de> - - * configure.ac: - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/video_platform_wrapper.c: - eglglessink: Add bcm/Raspberry Pi support. - This adds a video platform backend for the dispmanx display manager used by - broadcom and the Raspberry Pi. - Signed-off-by: Julian Scheel <julian@jusst.de> - -2013-02-12 18:11:34 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/videoparsers/gstpngparse.c: - pngparse: Declare the width/height outside the loop - Also initialize them to make gcc happy - -2013-01-28 22:42:44 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstpngparse.c: - * gst/videoparsers/gstpngparse.h: - * gst/videoparsers/plugin.c: - videoparsers: Add png file parser - https://bugzilla.gnome.org/show_bug.cgi?id=690639 - -2013-02-11 16:35:48 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/videoparsers/gstmpegvideoparse.c: - Unrevert: mpegvideoparse: set timestamp based on pic offset - API is now in baseparse in gstreamer. - Timestamps in MPEG-TS streams are based on the last timestamp - before the start code of the picture. GstBaseParse sets the - timestamp based on the beginning of the sequence header, if - one exists before the picture. This fixes the case where the - timestamp occurs in the MPEG-TS stream between the seq header - and picture start code. - -2013-02-07 15:42:54 -0800 David Schleef <ds@schleef.org> - - * gst/yadif/gstyadif.c: - * gst/yadif/gstyadif.h: - yadif: Add mode property - Copy mode from deinterlace element. Isn't actually implemented - in yadif, every frame is deinterlaced, so effectively mode=1. - -2013-02-12 11:47:50 -0800 David Schleef <ds@schleef.org> - - * gst/yadif/vf_yadif.c: - * gst/yadif/yadif.c: - yadif: Fix non-x86_64 builds - -2013-02-12 11:24:44 -0800 David Schleef <ds@schleef.org> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: add parsed=false to mpeg2 caps - -2013-02-12 10:39:44 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/glib-compat-private.h: - glib-compat-private.h: remove old GStaticRecMutex stuff - Breaks the build with newer GLibs ("unknown type GStaticRecMutex") - and is not needed any more. - -2013-02-12 09:38:35 +0000 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - * gst/videoparsers/gstmpegvideoparse.c: - Revert "mpegvideoparse: set timestamp based on pic offset" - This reverts commit 63718da919b6a3daa04a66da1be4db54e0778898. - The required baseparse API addition has not been pushed yet, - which breaks the build. - -2013-02-11 17:58:31 -0800 David Schleef <ds@schleef.org> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - mpegvideoparser: increase min size for picture coding ext - This could use additional work. The parsing code overruns the - end of buffers during normal operation, triggering GST_WARNINGs. - -2013-02-11 17:39:24 -0800 David Schleef <ds@schleef.org> - - * sys/mfc/gstmfc.c: - * sys/mfc/mfc_decoder/mfc_decoder.c: - mfc: quiet debugging when mfc device doesn't exist - Avoid registering the element if the mfc device doesn't work, - but allow plugin loading to succeed. - -2013-02-11 16:35:48 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: set timestamp based on pic offset - Timestamps in MPEG-TS streams are based on the last timestamp - before the start code of the picture. GstBaseParse sets the - timestamp based on the beginning of the sequence header, if - one exists before the picture. This fixes the case where the - timestamp occurs in the MPEG-TS stream between the seq header - and picture start code. - -2013-02-11 23:46:27 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/yadif/Makefile.am: - yadif: fix distcheck - -2013-02-11 23:29:59 +0000 Tim-Philipp Müller <tim@centricular.net> - - * LICENSE_readme: - * Makefile.am: - * REQUIREMENTS: - * configure.ac: - * ext/Makefile.am: - * ext/swfdec/Makefile.am: - * ext/swfdec/gstswfdec.c: - * ext/swfdec/gstswfdec.h: - swfdec: remove - The swfdec project is dead, and this plugin was - never really useful because of the way swf works. - Remove it before someone accidentally ports it. - -2013-02-11 22:50:15 +0000 Tim-Philipp Müller <tim@centricular.net> - - * Makefile.am: - * ext/Makefile.am: - * ext/cog/.gitignore: - * ext/cog/gstcogorc.orc: - * gst-plugins-bad.spec.in: - * tests/check/Makefile.am: - * tests/icles/.gitignore: - Add cog to cruft list and remove some more leftover files - -2013-02-11 22:40:35 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/yadif/Makefile.am: - yadif: fix build in uninstalled setup - -2013-02-03 14:32:27 +0100 Sjoerd Simons <sjoerd@greynoise.nl> - - * tests/examples/uvch264/window.glade: - uvch264 test: Use string instead of fourcc in glade caps - -2013-02-03 14:31:50 +0100 Sjoerd Simons <sjoerd@greynoise.nl> - - * sys/uvch264/gstuvch264_src.c: - uvch264: Remove custom renegotiate event - -2013-02-03 14:31:13 +0100 Sjoerd Simons <sjoerd@greynoise.nl> - - * sys/uvch264/gstuvch264_src.c: - uvch264: Add image/jpg to vfsrc and vidsrc caps - -2013-02-03 14:30:36 +0100 Sjoerd Simons <sjoerd@greynoise.nl> - - * sys/uvch264/gstuvch264_mjpgdemux.c: - uvch264: Fix NV21 vs NV12 typo - -2013-02-02 14:16:40 +0100 Sjoerd Simons <sjoerd@greynoise.nl> - - * sys/uvch264/gstuvch264_src.c: - uvch264: Pass through the filter on the caps query - -2013-01-18 23:23:56 +0100 Sjoerd Simons <sjoerd@greynoise.nl> - - * sys/uvch264/gstuvch264.c: - * sys/uvch264/gstuvch264_mjpgdemux.c: - * sys/uvch264/gstuvch264_src.c: - * tests/check/elements/uvch264demux.c: - * tests/examples/uvch264/test-uvch264.c: - * tests/examples/uvch264/window.glade: - uvch264: Remove the _ from the element names - Rename uvch264_src to uvch264src and uvch264_mjpgdemux to - uvch264mjpgdemux - -2013-01-18 23:16:31 +0100 Sjoerd Simons <sjoerd@greynoise.nl> - - * configure.ac: - configure: Mark uvch264 as ported - -2013-01-18 23:14:27 +0100 Sjoerd Simons <sjoerd@greynoise.nl> - - * tests/examples/uvch264/Makefile.am: - * tests/examples/uvch264/test-uvch264.c: - * tests/examples/uvch264/window.glade: - uvch264: Port test to gstreamer 1.0 - -2013-01-18 22:49:19 +0100 Sjoerd Simons <sjoerd@greynoise.nl> - - * sys/uvch264/Makefile.am: - * sys/uvch264/gstuvch264.c: - * sys/uvch264/gstuvch264_mjpgdemux.c: - * sys/uvch264/gstuvch264_src.c: - uvch264src: Port to gstreamer 1.0 - -2012-05-03 20:36:27 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - basecamerabinsrc: Add auto-start property to basecamerabin - -2013-02-11 12:51:04 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * tests/check/Makefile.am: - * tests/check/elements/logoinsert.c: - cog: remove last remnants - -2013-02-07 15:09:51 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/yadif/Makefile.am: - * gst/yadif/gstyadif.c: - * gst/yadif/gstyadif.h: - * gst/yadif/vf_yadif.c: - * gst/yadif/yadif.c: - * gst/yadif/yadif_template.c: - yadif: Add YADIF deinterlacing filter - Code copied from Libav, commit 26e4f0c70. Will eventually be - moved to -ugly because underlying code is GPL. - -2013-02-07 14:33:24 -0800 David Schleef <ds@schleef.org> - - * gst/fieldanalysis/gstfieldanalysis.c: - fieldanalysis: Add Y42B and Y444 formats - -2013-02-07 11:15:01 -0800 David Schleef <ds@schleef.org> - - * tools/gst-app-maker: - * tools/gst-project-maker: - gst-app-maker/gst-element-maker: 1.0 updates - -2013-02-11 12:25:05 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/Makefile.am: - * ext/cog/Makefile.am: - * ext/cog/cog.h: - * ext/cog/cogframe.c: - * ext/cog/cogframe.h: - * ext/cog/cogtables.c: - * ext/cog/cogutils.h: - * ext/cog/cogvirtframe.c: - * ext/cog/cogvirtframe.h: - * ext/cog/generate_tables.c: - * ext/cog/gstcms.c: - * ext/cog/gstcms.h: - * ext/cog/gstcog.c: - * ext/cog/gstcogdownsample.c: - * ext/cog/gstcogmse.c: - * ext/cog/gstcogorc-dist.c: - * ext/cog/gstcogorc-dist.h: - * ext/cog/gstcogscale.c: - * ext/cog/gstcogutils.c: - * ext/cog/gstcogutils.h: - cog: remove cog plugin - Everything has been merged into other elements. - -2013-02-11 20:24:14 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/mxf/mxfdemux.c: - mxfdemux: fix taglist leak - Don't leak demuxer tag list. - -2013-02-11 20:17:58 +0000 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/mxfdemux.c: - tests: fix mxfdemux pull unit test hanging forever - Our test source pad needs to answer SCHEDULING queries - properly for mxfdemux to activate in pull mode. - https://bugzilla.gnome.org/show_bug.cgi?id=691843 - -2013-02-11 19:53:39 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/mxf/mxfdemux.c: - mxfdemux: fix push mode unit test failure - In the sink event handler we end up sending multiple EOS - events per pad. Don't return FALSE when sending the - second EOS on an already-EOS pad fails. Not sure if there - was a reason for sending a second EOS, so leaving the - code in there for now, but assume all went fine if there - are source pads, which is slightly less wrong than before. - This function needs work. - -2013-02-11 12:34:47 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/Makefile.am: - tests: fix compilation of dtmf test in uninstalled setup - -2013-02-11 12:34:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - gdp: actually log generic dataprotocol stuff to gdp category - -2013-02-09 20:22:09 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintersurface.c: - * gst/inter/gstintersurface.h: - * gst/inter/gstintertest.c: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosrc.c: - inter: don't use deprecated GLib threading API - -2013-02-09 19:53:51 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/liveadder/liveadder.c: - * gst/liveadder/liveadder.h: - liveadder: don't use deprecated GLib threading API - -2013-02-09 19:49:08 +0000 Tim-Philipp Müller <tim@centricular.net> - - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsink.h: - shm: don't use deprecated threading API - -2013-02-11 11:06:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: clear the state of the decoder - Set the channels and rate back to their default values in _stop because they - are used to renegotiate when needed. - See https://bugzilla.gnome.org/show_bug.cgi?id=692950 - -2013-02-07 11:52:23 +0100 Marc Leeman <marc.leeman@gmail.com> - - * ext/rsvg/gstrsvgoverlay.c: - * ext/rsvg/gstrsvgoverlay.h: - rsvgoverlay: deprecated GStaticMutex -> GMutex - Element needs porting though. - https://bugzilla.gnome.org/show_bug.cgi?id=693322 - -2013-02-09 18:46:48 +0000 Tim-Philipp Müller <tim@centricular.net> - - * sys/mfc/fimc/fimc.c: - mfc: fix compilation with newer GLib versions - that don't include pthread.h any more from public headers. - We could just fix this by including pthread.h ourselves, - but we may just as well use atomic ops for this and - simplify the code a little. - https://bugzilla.gnome.org/show_bug.cgi?id=693322 - -2013-02-07 11:54:38 +0100 Marc Leeman <marc.leeman@gmail.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - mxfdemux: deprecated GStaticRWLock -> GRWLock - https://bugzilla.gnome.org/show_bug.cgi?id=693322 - -2013-02-07 11:54:06 +0100 Marc Leeman <marc.leeman@gmail.com> - - * gst/coloreffects/gstchromahold.c: - * gst/coloreffects/gstchromahold.h: - chromahold: deprecated GStaticMutex -> GMutex - https://bugzilla.gnome.org/show_bug.cgi?id=693322 - -2013-02-07 10:52:57 -0800 David Schleef <ds@schleef.org> - - * tools/gst-app-maker: - gst-app-maker: convert to 1.0 - -2013-02-08 00:06:16 +1100 Tim 'mithro' Ansell <mithro@mithis.com> - - * gst/gdp/gstgdppay.c: - gdppay: fix buffer leak when new caps are same as old caps - The leak occurs when you got a message with identical caps to the ones you - already had. - https://bugzilla.gnome.org/show_bug.cgi?id=693324 - -2012-10-02 11:02:32 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: add profile enums. - Add all useful profiles from AVC, MVC and SVC specifications. - https://bugzilla.gnome.org/show_bug.cgi?id=693140 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-02-07 22:26:15 +1100 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/gstdvdspu-render.c: - dvdspu: Fix the rendering of PGS windows with left != 0 - When rendering a PGS window area where the left edge is not at - pixel 0, the chroma was being rendered in the wrong place since - commit 4dc648d3430b67592cf1413ccef415f70889d71e - -2013-02-07 11:31:12 +0000 Tim Ansell <gnome at mithis.com> - - * gst/inter/gstintertest.c: - inter: fix leaks in test - https://bugzilla.gnome.org/show_bug.cgi?id=693300 - -2013-02-07 08:41:25 +0100 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - * gst/freeverb/Makefile.am: - * gst/freeverb/gstfreeverb.c: - * gst/freeverb/gstfreeverb.h: - freeverb: port to 1.0 - -2013-01-09 13:31:47 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/README: - audiovisualizers: add comments for monoscope porting - -2013-02-06 15:48:06 -0800 David Schleef <ds@schleef.org> - - * gst/interlace/gstinterlace.c: - interlace: fix negotiation for true interlaced modes - -2013-02-06 12:35:36 -0800 David Schleef <ds@schleef.org> - - * tools/element-templates/basetransform: - * tools/element-templates/gobject: - * tools/element-templates/sinkpad-simple: - * tools/element-templates/srcpad-simple: - * tools/gst-element-maker: - element-maker: Update somewhat for 1.0 - Only converted basetransform for the moment. It's probably easier - to write templates from scratch from the documentation. - -2013-02-05 11:56:46 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: mpeg2: add helpers to convert quantization matrices. - Add utility functions to convert quantization matrices from zigzag scan - order (as encoded in the bitstream) into raster scan order. Also provide - another function to reverse the operation. - https://bugzilla.gnome.org/show_bug.cgi?id=693000 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-01-31 16:13:22 +0800 Cong Zhong <congx.zhong@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: mpeg2: store quantization matrices in zigzag scan order. - Quantizer matrices are encoded in zigzag scan order in the bitstream, - but they are stored in raster scan order when they are parsed. However, - default matrices were also prepared in zigzag scan order, hence the - mismatch. i.e. the matrices were presented either in raster scan order - if they are explicitly present in the bitstream, or they were presented - in zigzag scan order if the default definitions were to be used instead. - One way to solve this problem is to always expose the quantization - matrices in zigzag scan order, since this is the role of the parser to - not build up stories from the source bitstream and just present what - is in there. - Utility functions will be provided to convert quantization matrices in - either scan order. - https://bugzilla.gnome.org/show_bug.cgi?id=693000 - Signed-off-by: Cong Zhong <congx.zhong@intel.com> - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-02-05 23:07:12 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: expose VC1 streams with missing descriptor. - Fixes playback of VC1 streams when the descriptor is missing. - -2013-02-05 17:34:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: handle EINTR from poll - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=693212 - -2010-12-27 23:21:10 +0100 Robert Swain <robert.swain@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlace: Add support for more telecine patterns - -2011-01-10 10:36:43 +0100 Robert Swain <robert.swain@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlace: Add more verbose hints about field patterns - -2013-02-04 18:07:17 -0800 David Schleef <ds@schleef.org> - - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Add descriptors for SMPTE 302m audio - -2013-02-02 18:44:11 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: separate fields for distinct functional uses of codec_data field - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=692789 - -2013-01-31 12:30:49 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/opus/gstrtpopuspay.c: - opuspay: fix timestamps - Copy timestamps to payloaded buffer. - Avoid input buffer memory leak. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=692929 - -2013-01-30 09:33:49 +0100 Benjamin Gaignard <benjamin.gaignard@st.com> - - * autogen.sh: - autogen.sh: allow calling from out-of-tree - Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org> - https://bugzilla.gnome.org/show_bug.cgi?id=692859 - -2013-01-28 20:42:49 +0100 Stefan Sauer <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From a942293 to 2de221c - -2013-01-28 14:12:56 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: fix crash when setting "cbr" property when encoder is not running yet - https://bugzilla.gnome.org/show_bug.cgi?id=692698 - -2013-01-26 22:58:29 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/dtmf/gstrtpdtmfsrc.c: - rtpdtmfsrc: fix compiler warning - gstrtpdtmfsrc.c: In function 'gst_dtmf_src_prepare_message.isra.1': - gstrtpdtmfsrc.c:669:3: error: 's' may be used uninitialized in this function - -2013-01-25 21:06:05 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstrtpdtmfdepay.c: - rtpdtmfdepay: Fix missing work in doc - -2013-01-24 21:00:08 -0500 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/dtmf.c: - tests: Add test for rtpdtmfdepay and rtpdtmfsrc - -2013-01-25 20:39:33 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstrtpdtmfsrc.c: - rtpdtmfsrc: Post the messages after the clock wait - This way, the messages will be closer in time to when the packets are sent out - -2013-01-25 20:37:53 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstrtpdtmfsrc.c: - rtpdtmfsrc: Only set the duration when starting to send - The duration depends on the clock rate, which could change due to renegotiation - -2013-01-25 20:37:09 -0500 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstrtpdtmfsrc.c: - rtpdtmfsrc: remove "ssrc" from caps - ssrc is uint and we don't have a uint range type - -2013-01-25 15:44:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - build: fix insertbin build in uninstalled setup - Make sure pkg-config in gst-libs/gst/insertbin/ can find - the uninstalled core/base properly. Fixes build of - insertbin in uninstalled setup if there arn't any - installed gir files to fall back to. - -2013-01-25 12:24:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/insertbin/gstinsertbin.c: - * tests/check/elements/autoconvert.c: - insertbin, tests: fix printf format compiler warnings - -2013-01-24 18:14:28 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: fix bitplanes decoding (DIFF6 or NORM6 residual bytes). - Fix parsing of residual bytes. This is a two-step process. First, - remaining colums of full vertical resolution (<height>) need to be - processed. Next, remaining bytes in the first row can be processed, - while taking into account the fact that we may have filled in the - first columns already. So, this is not full horizontal resolution. - The following figure helps in understanding the expected order of - operations, for a 8x5 MBs bitplane. - 5 5 6 6 6 6 6 6 - 5 5 1 1 1 2 2 2 - 5 5 1 1 1 2 2 2 - 5 5 3 3 3 4 4 4 - 5 5 3 3 3 4 4 4 - So, after tiles 1 to 4 are decoded, vertical tile 5 needs to be - processed (2x5 MBs) and then the horizontal tile 6 (6x1 MBs). - https://bugzilla.gnome.org/show_bug.cgi?id=692461 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-01-24 17:28:22 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: fix bitplanes decoding (DIFF6 or NORM6). - Fix decoding of DIFF6 or NORM6 bitplanes with an odd number of lines - (3x2 "horizontal" tiles). In this case, we have to skip the first line - of macroblocks but <width> number of bytes was used to do so, instead - of the actual <stride> size. - This fixes decoding for the video sample attached to: - https://bugzilla.gnome.org/show_bug.cgi?id=668565 - https://bugzilla.gnome.org/show_bug.cgi?id=692461 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2012-03-15 14:12:21 -0400 Olivier Crête <olivier.crete@collabora.com> - - * .gitignore: - * Android.mk: - * configure.ac: - * docs/libs/Makefile.am: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/insertbin/Makefile.am: - * gst-libs/gst/insertbin/gstinsertbin.c: - * gst-libs/gst/insertbin/gstinsertbin.h: - * gst-plugins-bad.spec.in: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-insertbin-uninstalled.pc.in: - * pkgconfig/gstreamer-insertbin.pc.in: - * tests/check/Makefile.am: - * tests/check/libs/.gitignore: - * tests/check/libs/insertbin.c: - insertbin: Add bin to dynamically insert elements in a running pipeline - This element automatically links in any element added using it's - action signals. These elements must have a single source pad and a single - sink pad. - -2013-01-23 14:47:58 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - codecparsers: vc1: add API to parse slice headers. - Add gst_vc1_parse_slice_header() function to parse slice headers as - described in 7.1.2. Slice layers are optional and allowed in advanced - profile mode only. Picture header, if available (PIC_HEADER_FLAG), - is parsed but not recorded because it shall be the same as that was - previously parsed with gst_vc1_parse_frame_header(). - This fixes SA00049.vc1 conformance test. - https://bugzilla.gnome.org/show_bug.cgi?id=692388 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-01-22 18:01:24 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: fix bitplanes decoding. - Fix decoding of DIFF2 or NORM2 bitplanes with an odd number of macroblocks. - In particular, account for the first bit that was already parsed so that to - avoid a buffer overflow after all pairs are parsed. - This fixes SA00040.vc1 conformance test. - https://bugzilla.gnome.org/show_bug.cgi?id=692312 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-01-22 19:31:02 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * configure.ac: - configure.ac: disable MFC if some v4l2 PIX_FMT missing - -2013-01-22 11:42:49 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - codecparsers: vc1: simplify GstVC1VopDquant structure. - Rename dqsbedge to dqbedge. The intent is that we can only have a single - boundary edge selector, depending on the value of dqprofile. So, dqbedge - represents DQSBEDGE if dqprofile == GST_VC1_DQPROFILE_SINGLE_EDGE, or - DQDBEDGE if dqprofile == GST_VC1_DQPROFILE_DOUBLE_EDGE. - The former dqbedge field is marked as unused and can be removed on the - next gst-plugins-bad version that allows ABI changes. - https://bugzilla.gnome.org/show_bug.cgi?id=692272 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-01-18 14:55:40 +0100 Patricia Muscalu <patricia@axis.com> - - * ext/curl/gstcurltlssink.c: - curltlssink: set correct level of SSL for the transfer - https://bugzilla.gnome.org/show_bug.cgi?id=692010 - -2013-01-22 10:48:39 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: fix VOPDQUANT parser for DQUANT == 2. - Fix parsing of VOPDQUANT when DQUANT == 2. In particular, DQUANTFRM is - not present in the bitstream in this case and it shall be derived to - the default value of zero (7.1.1.31.1). - https://bugzilla.gnome.org/show_bug.cgi?id=692271 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-01-22 10:38:20 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: fix calculation of ALTPQUANT. - Fix calculation of ALTPQUANT when DQUANT == 1. PQDIFF alters ALTPQUANT - in any case. See 7.1.1.31.6. - https://bugzilla.gnome.org/show_bug.cgi?id=692270 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-01-22 10:11:34 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: fix parser for DQPROFILE in VOPDQUANT. - Fix parse_vopdquant() to correctly parse DQPROFILE, which is 2 bits - instead of a single bit. - https://bugzilla.gnome.org/show_bug.cgi?id=692267 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-01-06 18:54:52 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: add inferred value for slice_beta_offset_div2. - The standard specifies that when slice_beta_offset_div2 is not present - in the slice header, then the value of slice_beta_offset_div2 shall be - inferred to be equal to 0. - https://bugzilla.gnome.org/show_bug.cgi?id=692265 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2013-01-17 19:02:48 +0100 Arnaud Vrac <avrac@freebox.fr> - - * ext/assrender/gstassrender.c: - * tests/check/elements/assrender.c: - assrender: reenable unit tests and up rank to primary again - -2013-01-18 16:14:03 +0100 Arnaud Vrac <avrac@freebox.fr> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: use overlay composition to blit subtitles on video frames - Re-uses existing blitting code and also means we can support - a lot more video formats out of the box, hence avoid unnecessary - pixel format or colour space conversions. - https://bugzilla.gnome.org/show_bug.cgi?id=692012 - -2013-01-17 18:48:12 +0100 Arnaud Vrac <avrac@freebox.fr> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: render overlay composition if supported downstream - This allows rendering ASS subtitles on top of video when - using hardware-accelerated video decoders based on e.g. - VA-API or VDPAU. - https://bugzilla.gnome.org/show_bug.cgi?id=678389 - https://bugzilla.gnome.org/show_bug.cgi?id=692012 - -2013-01-21 10:35:49 +0100 Arnaud Vrac <avrac@freebox.fr> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: add wait-text property - This is the same property as in the pango element, to allow waiting for - text on the text pad before rendering the video. - https://bugzilla.gnome.org/show_bug.cgi?id=692012 - -2013-01-18 15:25:48 +0100 Arnaud Vrac <avrac@freebox.fr> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: fix some subtitles being ignored - https://bugzilla.gnome.org/show_bug.cgi?id=692012 - -2013-01-17 18:33:11 +0100 Arnaud Vrac <avrac@freebox.fr> - - * ext/assrender/gstassrender.c: - assrender: refactor code to avoid duplication - https://bugzilla.gnome.org/show_bug.cgi?id=692012 - -2013-01-17 18:26:08 +0100 Arnaud Vrac <avrac@freebox.fr> - - * ext/assrender/gstassrender.c: - assrender: proxy allocations on video pad - Forward allocation queries on video sink pad instead - of discarding them. - This allows the upstream elements to use the allocation - parameters or pools from the downstream elements like - videosink. - https://bugzilla.gnome.org/show_bug.cgi?id=692012 - -2013-01-20 17:43:13 +0000 Tim-Philipp Müller <tim@centricular.net> - - * sys/bluez/gstavdtpsink.c: - bluez: clean up GValue handling a little - Allocate GValues on the stack, and unset/free them properly, fixing - a few leaks in the process. Also use gst_structure_take_value() - where appropriate to avoid unnecessary list copies. - -2013-01-20 17:17:27 +0000 Tim-Philipp Müller <tim@centricular.net> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gstavdtpsink.c: - bluez: update SBC caps for renamed fields - mode -> channel-mode - allocation -> allocation-method - -2013-01-17 19:29:31 -0500 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/shmpipe.c: - shm: Initialize shm_area_buf to invalid value - -2013-01-07 13:32:06 +0100 Roland Elek <relek.f2@gmail.com> - - * sys/shm/shmpipe.c: - shm: apply shm area permissions to shmpipe control socket - Apply shared memory area permissions to the control socket (more - precisely, the path it is bound to) as well. - https://bugzilla.gnome.org/show_bug.cgi?id=682775 - -2013-01-16 14:40:11 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/uvch264/gstuvch264_src.c: - uvch264: Define LIBUSB_CLASS_VIDEO if using an old version of libusb - -2013-01-16 14:48:46 -0500 Olivier Crête <olivier.crete@collabora.com> - - * sys/uvch264/gstuvch264_src.c: - uvch264: Prevent temporary elements from going to playing - -2013-01-16 14:42:38 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/uvch264/gstuvch264_src.c: - uvch264: do not double-unref if transform_caps fails - -2013-01-16 14:41:08 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/uvch264/gstuvch264_src.c: - uvch264: Add a fakesink to the transform_caps Some version of basetransform will return the template caps if the src pad is not linked, so the capsfilter will return ANY. Linking it to fakesink allows us to return the right caps in the capsfilter and have them transformed by the colorspace converter. - -2013-01-15 15:02:37 +0100 Martin Pitt <martinpitt@gnome.org> - - * tests/check/Makefile.am: - tests: use _1_0 variants for the various registry variables - These override the variants without version suffix. Makes 'make check' work - properly in environments that set the suffixed variant for 1.0, such as - jhbuild. - -2013-01-12 13:15:02 +0100 Mark Nauwelaerts <mnauw@users.sourceforge.net> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: zero-initialize SPS VUI parameters - ... so all 'present' flags indicate no presence of optional parts - in case VUI parameters end up not being parsed. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=681818 - -2013-01-15 15:05:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From a72faea to a942293 - -2013-01-12 18:10:35 +0100 Christian Fredrik Kalager Schaller <uraeus@linuxrisin.org> - - * gst-plugins-bad.spec.in: - Add two latest plugins to spec file - -2013-01-09 19:59:16 -0500 Olivier Crête <olivier.crete@collabora.com> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/spandsp/Makefile.am: - * ext/spandsp/gstdtmfdetect.c: - * ext/spandsp/gstdtmfdetect.h: - * ext/spandsp/gstspandsp.c: - * gst/dtmf/Makefile.am: - * gst/dtmf/gstdtmf.c: - * gst/dtmf/tone_detect.c: - * gst/dtmf/tone_detect.h: - dtmf/spandsp: Move dtmfdetect to use libspandsp - Remove our copy of the tone_detect.c file and use the original - from libspandsp. Also move the element to the spandsp plugin. - -2013-01-10 00:31:25 +0000 Tim-Philipp Müller <tim@centricular.net> - - * sys/bluez/a2dp-codecs.h: - bluez: use GLib defines to check for byte order - -2013-01-09 18:10:30 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * sys/Makefile.am: - * sys/bluez/Makefile.am: - * sys/bluez/bluez-plugin.c: - bluez: add new plugin to build system, but disable for now - Disable until it has been tested and works. - https://bugzilla.gnome.org/show_bug.cgi?id=690582 - -2013-01-09 18:02:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsink.h: - bluez: make bluez elements compile with 1.0 - Builds, but very likely doesn't work yet at all. Some - things are still commented out. - https://bugzilla.gnome.org/show_bug.cgi?id=690582 - -2012-10-09 20:35:45 +0900 Chan-yeol Park <chanyeol.park@samsung.com> - - * sys/bluez/a2dp-codecs.h: - bluez: avinfo: Replace definitions with a2dp-codecs.h's - -2012-10-09 20:35:44 +0900 Chan-yeol Park <chanyeol.park@samsung.com> - - * sys/bluez/a2dp-codecs.h: - bluez: audio: Add check for vendor specific A2DP codec - This patch adds checks(vendor ID, vendor specific codec ID) to make sure of - vendor specific A2DP codec selection. - -2012-09-14 21:40:10 +0530 Syam Sidhardhan <s.syam@samsung.com> - - * sys/bluez/gstavdtpsink.c: - bluez: gstavdtpsink: Free the D-Bus error on reply failure - If D-Bus error is set we should free it. - -2012-08-21 11:49:24 -0400 Anderson Lizardo <anderson.lizardo@openbossa.org> - - * sys/bluez/gstavdtpsink.h: - bluez: Fix trivial coding style issues on pointer declarations and casting - Avoid using C++ style pointer declarations like "char* ptr", as most - BlueZ code uses "char *ptr". - -2012-06-25 12:06:17 +0300 Luiz Augusto von Dentz <luiz.von.dentz@intel.com> - - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsink.h: - bluez: audio: Remove internal audio IPC - With unix socket and ALSA removed there is no longer any use for the - internal IPC. - -2012-05-30 17:16:19 -0400 Anderson Lizardo <anderson.lizardo@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: Remove compatibility check for DBUS_TYPE_UNIX_FD - Since commit c89b589a586e97ad875fbdd1d41f03979157ebb0, D-Bus >= 1.4.0 is - required. This version already contains Unix FD passing support, - therefore code that checks for DBUS_TYPE_UNIX_FD definition is - unnecessary. - -2012-05-18 09:46:29 -0400 Anderson Lizardo <anderson.lizardo@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: avdtp: Fix incorrect gchar buffer allocation - The code was allocating an array of gchar pointers, where an array of - gchar is expected. - -2012-04-16 11:59:59 +0900 Chan-yeol Park <chanyeol.park@samsung.com> - - * sys/bluez/gstavdtpsink.c: - bluez: audio: Add SBC NULL check for GST AVDTP signaling - Due to RF condition or headset malfunctioning, gst audio plug-in could - not get SBC (mandatory codec) information. - -2012-04-12 20:33:06 +0530 Syam Sidhardhan <s.syam@samsung.com> - - bluez: audio: Fix newline before EOF - -2012-04-12 20:32:55 +0530 Syam Sidhardhan <s.syam@samsung.com> - - * sys/bluez/gstavdtpsink.c: - bluez: gstavdtpsink: Fix D-Bus memory leak in audio - -2011-11-17 13:29:06 -0400 Anderson Lizardo <anderson.lizardo@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: AVDTP: Fix closing invalid FD on error - In gst_avdtp_sink_start(), if bt_audio_service_open() failed, there was - an attempt to close an invalid file descriptor (through - bt_audio_service_close()). - -2011-11-16 09:20:04 -0400 Anderson Lizardo <anderson.lizardo@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: Fix return value check for bt_audio_service_open() - Only negative values (namely -1) are errors for this function. - -2011-11-16 09:19:49 -0400 Anderson Lizardo <anderson.lizardo@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: AVDTP: Fix errno handling convention - Variables which are assigned to the errno variable (usually called - "err") should be negative, and "-err" should be used where a positive - value is needed. - -2011-08-26 11:18:54 -0700 Marcel Holtmann <marcel@holtmann.org> - - * sys/bluez/a2dp-codecs.h: - bluez: audio: Update license for shared header files - The header files with constants and structures for audio specific - interaction with Pulseaudio are suppose to be under LGPL license. - For some odd reason a2dp-codecs.h ended up being under GPL license - which is against the intention of this being shared and re-used by - non-GPL programs. Fix this now to avoid any future confusion. - -2011-07-02 12:32:40 -0300 Lucas De Marchi <lucas.demarchi@profusion.mobi> - - * sys/bluez/gstavdtpsink.c: - bluez: Fix common misspelled words - Accounting of misspelled words, as detected by codespell: - acording 2 - ancilliary 1 - appropiate 1 - atribute 1 - cant 1 - comming 2 - gracefull 1 - lenght 1 - mispelled 1 - occured 1 - occurences 1 - ocurred 3 - prefered 1 - presense 1 - reponse 1 - seperate 1 - succesful 1 - successully 1 - sucessfull 1 - sucessfully 1 - -2011-05-09 15:26:07 +0200 Szymon Janc <szymon.janc@tieto.com> - - * sys/bluez/gstavdtpsink.c: - bluez: Fix garbage return value in gst_avdtp_sink_audioservice_recv - -2011-02-13 17:51:45 -0800 Marcel Holtmann <marcel@holtmann.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - * sys/bluez/gstavdtpsink.h: - bluez: audio: Remove workaround for compiler warnings - -2011-01-20 11:29:41 +0200 Luiz Augusto von Dentz <luiz.dentz-von@nokia.com> - - * sys/bluez/gstavdtpsink.c: - bluez: Update a2dpsink to use new Acquire API - -2011-01-19 10:04:49 +0200 Luiz Augusto von Dentz <luiz.dentz-von@nokia.com> - - * sys/bluez/gstavdtpsink.c: - bluez: Fix use of deprecated glib on audio plugin - -2010-05-06 17:14:14 +0300 Luiz Augusto von Dentz <luiz.dentz-von@nokia.com> - - * sys/bluez/a2dp-codecs.h: - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsink.h: - bluez: Add support for media transport in gstreamer plugin - -2010-09-13 15:40:11 +0300 Luiz Augusto von Dentz <luiz.dentz-von@nokia.com> - - * sys/bluez/gstavdtpsink.c: - bluez: Fix crash on gstreamer plugin if device doesn't support sbc - -2010-05-19 16:59:30 +0200 Marcel Holtmann <marcel@holtmann.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gstavdtpsink.c: - bluez: Add pragma based workaround for GStreamer warnings - -2010-05-19 16:10:26 +0200 Marcel Holtmann <marcel@holtmann.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - * sys/bluez/gstavdtpsink.h: - bluez: Revert "Fix build issues with latest GStreamer updates" - -2010-05-17 22:31:28 +0200 Marcel Holtmann <marcel@holtmann.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - * sys/bluez/gstavdtpsink.h: - bluez: Fix build issues with latest GStreamer updates - -2010-01-01 17:08:17 -0800 Marcel Holtmann <marcel@holtmann.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsink.h: - bluez: Update copyright information - -2009-10-05 22:51:14 +0200 Luiz Augusto von Dentz <luiz.dentz@gmail.com> - - * sys/bluez/gstavdtpsink.c: - bluez: Fix codec selection on gstream plugin. - -2009-10-02 10:58:54 +0200 Johan Hedberg <johan.hedberg@nokia.com> - - * sys/bluez/gsta2dpsink.c: - bluez: Fix unnecessary NULL checks - -2009-07-15 16:51:08 -0300 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: Remove useless instruction. - -2009-07-01 13:15:57 +0200 Filippo Giunchedi <filippo@esaurito.net> - - * sys/bluez/gsta2dpsink.c: - bluez: Register the a2dp gst sink as marginal - Avoid taking over as default gst sink by registering as GST_RANK_MARGINAL - -2009-03-25 18:05:43 -0300 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: Add specific codec types. - Add specific codec types for a2dp sources and sinks so clients are able - to differ between them. - -2009-03-18 15:58:53 -0300 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: Remove unnecessary memset. - -2009-03-19 16:16:19 -0300 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: Add lock flag for capabilities. - lock flag permits the unix client to detect if there is someone holding - the lock so it can prevent useless attempt of setting a new configuration. - -2009-03-18 11:20:31 -0300 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: Introduce BT_OPEN command to audio ipc. - BT_OPEN make it possible to lock a given seid which is automacally - release if the client disconnects from the unix socket. - -2009-03-19 11:50:26 -0300 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: Add source and destination fields to audio ipc messages. - -2009-02-19 15:58:15 -0300 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: Make use of g_io_channel_shutdown instead of deprecated g_io_channel_close. - -2009-01-01 19:33:20 +0100 Marcel Holtmann <marcel@holtmann.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsink.h: - bluez: Update copyright information - -2008-12-23 05:25:50 +0100 Marcel Holtmann <marcel@holtmann.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - * sys/bluez/gstavdtpsink.h: - bluez: First attempt in fixing compiler warnings (still needs cleanup) - -2008-12-20 21:42:49 +0200 Johan Hedberg <johan.hedberg@nokia.com> - - * sys/bluez/gstavdtpsink.c: - bluez: More coding style fixes - -2008-12-20 21:04:44 +0200 Johan Hedberg <johan.hedberg@nokia.com> - - * sys/bluez/gstavdtpsink.c: - bluez: Coding style fixes - -2008-12-20 18:27:30 +0200 Johan Hedberg <johan.hedberg@nokia.com> - - * sys/bluez/gstavdtpsink.c: - bluez: Fix length header values in messages - -2008-12-16 17:09:57 -0300 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: Fix gstreamer plugin to reflect the ipc changes. - -2008-10-07 12:07:14 -0300 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: Fix channel mode string from dual to dual-channel. - -2008-10-07 11:55:58 -0300 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: Fix channel mode string to joint-stereo. - -2008-02-20 13:37:00 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - bluez: Fix runtime warnings of gstreamer plugin. - -2008-02-19 19:49:24 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gstavdtpsink.c: - bluez: Update gstreamer plugin to use new sbc API. - -2008-02-14 21:22:38 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gstavdtpsink.c: - bluez: Make use of parameters selected in alsa plugin and fix auto selection. - -2008-02-02 03:37:05 +0000 Marcel Holtmann <marcel@holtmann.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsink.h: - bluez: Update copyright information - -2008-02-01 19:28:37 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - bluez: Add bitpool property and others fixes for gstreamer plugin. - -2008-01-30 17:30:27 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsink.h: - bluez: Enable gstreamer plugin to use autoconnect flag. - -2008-01-30 14:21:43 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsink.h: - bluez: Fixes gstreamer caps and code cleanup. - -2008-01-23 19:17:33 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - bluez: Fix use of gstreamer plugin with rhythmbox and banshee and rtp timestamps. - -2008-01-23 15:18:15 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - * sys/bluez/gstavdtpsink.c: - * sys/bluez/gstavdtpsink.h: - bluez: Rename a2dpsendersink to avdtpsink. - -2008-01-23 13:23:01 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - bluez: Bug fixes for gstreamer plugin. - -2008-01-23 13:19:32 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - bluez: Add mp3 support for gstreamer plugin. - -2008-01-23 13:14:02 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - bluez: Make a2dpsink to act like a bin and split the payloader. - -2007-12-04 19:42:00 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - bluez: Fix error messages. (thanks to fchevalier for the patch) - -2007-12-03 22:41:29 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - bluez: Handle new ipc messages properly and adapt the plugins. - -2007-11-23 17:00:13 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - bluez: Code cleanup. - -2007-11-21 20:24:11 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - bluez: Integrate new ipc API implementation. - -2007-11-01 19:45:00 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - bluez: Fix sbc negotiation and improves buffer handling by using GstAdapter. - -2007-10-29 15:02:26 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - bluez: Add bitpool capability. - -2007-10-26 18:48:42 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - bluez: Remove dependency of sbc library from a2dpsink element. - -2007-10-25 21:07:50 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - bluez: Fix buffer usage. - -2007-10-24 21:40:35 +0000 Marcel Holtmann <marcel@holtmann.org> - - * sys/bluez/gsta2dpsink.c: - bluez: Some more coding style fixes - -2007-10-24 21:33:22 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - bluez: Fix coding style. - -2007-10-24 21:13:12 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - bluez: Fix a2dpsink coding style problems and improve compatibility with some players. - -2007-10-18 23:02:24 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - bluez: Add rtp header. - -2007-10-18 22:46:12 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - bluez: Fix coding style issues. - -2007-10-18 21:50:00 +0000 Luiz Augusto von Dentz <luiz.dentz@openbossa.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - bluez: Fixes a2dpsink element. - -2007-08-26 14:14:34 +0000 Marcel Holtmann <marcel@holtmann.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - bluez: Add possible capabilities and connect to audio server - -2007-08-23 19:12:23 +0000 Marcel Holtmann <marcel@holtmann.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - bluez: Add SBC encoder and decoder skeletons for GStreamer - -2007-08-22 21:50:59 +0000 Marcel Holtmann <marcel@holtmann.org> - - * sys/bluez/gsta2dpsink.c: - * sys/bluez/gsta2dpsink.h: - bluez: Add skeleton for an A2DP sink element - -2013-01-07 10:37:53 +0000 Tim-Philipp Müller <tim@centricular.net> - - * ext/resindvd/Makefile.am: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - resindvd: handle non-utf8 dvd disc titles better - Maybe something based on the code in bug #688367 - and the language encodings would work even better - though (now it will try things based on the locale). - https://bugzilla.gnome.org/show_bug.cgi?id=690097 - -2013-01-07 10:36:45 +0000 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - * ext/Makefile.am: - * ext/jasper/Makefile.am: - * ext/jasper/gstjasper.c: - * ext/jasper/gstjasperdec.c: - * ext/jasper/gstjasperdec.h: - * ext/jasper/gstjasperenc.c: - * ext/jasper/gstjasperenc.h: - * gst-plugins-bad.spec.in: - jasper: remove jasper jpeg2000 plugin, replaced by openjpeg plugin - libjasper isn't really maintained any longer, we probably - don't want to port this. - -2013-01-07 00:49:10 +0000 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - configure: allow compilation against opencv 2.4.3 as well - -2012-12-06 11:55:45 -0500 Victor Gottardi <vgottardi@hotmail.com> - - * gst/hls/gsthlssink.c: - hlssink: don't forward multifilesink messages to application - These messages are usually only needed internally. - https://bugzilla.gnome.org/show_bug.cgi?id=689822 - -2012-11-06 10:17:19 -0500 Victor Gottardi <vgottardi@hotmail.com> - - * gst/hls/gstm3u8playlist.c: - hlssink: m3u8 add EXT-X-ALLOW-CACHE - https://bugzilla.gnome.org/show_bug.cgi?id=689822 - -2012-12-05 10:06:38 -0500 Victor Gottardi <vgottardi@hotmail.com> - - * gst/hls/gstm3u8playlist.c: - hlssink: round segment duration to nearest number of seconds - E.g. for 1s period, duration can be 0.99s, rounds down to 0, results in invalid - playlist - https://bugzilla.gnome.org/show_bug.cgi?id=689822 - -2013-01-06 22:19:04 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/hls/gstm3u8playlist.c: - * gst/hls/gstm3u8playlist.h: - hlssink: don't leak old playlist entries when using max-files - Based on patch by: Victor Gottardi <vgottardi@hotmail.com> - https://bugzilla.gnome.org/show_bug.cgi?id=689822 - -2013-01-05 18:56:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/fimc/fimc.c: - * sys/mfc/fimc/fimc.h: - * sys/mfc/gstmfcdec.c: - mfc: Add support for RGB - -2013-01-04 15:38:58 -0500 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/gstshmsink.c: - shm: Actually get the permissions on get_property - -2013-01-04 17:19:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/inter/gstintersurface.c: - inter: don't use deprecated GStaticMutex API - -2013-01-03 17:28:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Don't return EGLImages that we just rendered from the buffer pool - Mapping them will fail because they're still internally used. - -2013-01-03 15:22:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/video_platform_wrapper.c: - * ext/eglgles/video_platform_wrapper.h: - eglglessink: Handle copying of GstMemory properly - We have to use the default video meta mapping functions. - -2013-01-03 12:09:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Set variables to NULL to prevent usage after free/unref - -2013-01-03 12:08:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/video_platform_wrapper.c: - eglglessink: Make sure to always use the correct GstMemory for buffers from our pool - -2013-01-03 11:03:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Don't forget to call the platform specific EGLImage free function - -2013-01-03 10:53:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/mfc_decoder/mfc_decoder.c: - mfc: Fix leak of input/output buffer storage in the MFC decoder library - -2013-01-03 10:40:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Make sure to wait for the right object to be dequeued - -2013-01-03 10:10:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Fix typo - -2013-01-02 17:23:51 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Only add crop metadata if required - -2013-01-02 16:53:19 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/fimc/fimc.c: - fimc: Do STREAMON/STREAMOFF only once and not once per buffer - -2013-01-02 16:38:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/mfc_decoder/mfc_decoder.c: - mfc: Require one more output buffer than returned by the driver - -2013-01-02 16:10:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Remove packed YUV support - This will not allow zero-copy because the same - EGLImage would need to be used for two different - textures with a different format. - -2013-01-02 16:09:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Prefer NV12 over I420/YV12 - -2013-01-02 15:40:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/mfc_decoder/mfc_decoder.c: - mfc: The first frame produces output in our case - -2013-01-02 14:32:32 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfc.c: - * sys/mfc/gstmfcdec.c: - * sys/mfc/mfc_decoder/mfc_decoder.c: - * sys/mfc/mfc_decoder/mfc_decoder.h: - mfc: Request input buffers explicitely - -2013-01-02 14:27:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/mfc_decoder/mfc_decoder.c: - mfc: Don't STREAMOFF if no STREAMON happened yet - -2013-01-02 14:23:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfc.c: - mfc: Check if the MFC hardware exists before registering the element - -2013-01-02 14:16:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/mfc_decoder/mfc_decoder.c: - mfc: Check device capabilities before doing anything else - -2013-01-02 12:33:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Include codec_data in the buffer with the next frame - -2013-01-02 11:44:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Set format field of the instance struct - -2013-01-02 11:00:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - * sys/mfc/gstmfcdec.h: - mfc: Implement support for crop metadata - -2013-01-02 10:26:04 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Check if the hardware is available in GstVideoDecoder::open() - -2013-01-01 11:56:16 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegpsmux/mpegpsmux.h: - mpegpsmux: use DTS in addition to PTS - And refactor choose_best_stream() a little. - videotestsrc pattern=ball ! x264enc ! mpegpsmux ! ... - plays much nicer now. - -2013-01-01 12:05:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Log in the performance category if we map/copy EGLImages to normal memory - -2013-01-01 11:05:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Add support for h263 and MPEG1/2 - -2013-01-01 10:48:19 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Catch errors from glEGLImageTargetTexture2DOES() - -2013-01-01 10:44:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Upload textures in GstBaseSink::prepare() already - This gives more time for the texture to be uploaded as it happens - before syncing to the running time. When the running time is reached - only eglSwapBuffers() is necessary. - -2012-12-31 19:45:54 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/mpegpsmux/psmux.c: - * gst/mpegpsmux/psmuxcommon.h: - * gst/mpegpsmux/psmuxstream.c: - mpegpsmux: use gstreamer debug logging system everywhere - -2012-12-31 19:42:03 +0000 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegpsmux/mpegpsmux_aac.c: - * gst/mpegpsmux/mpegpsmux_h264.c: - * gst/mpegpsmux/psmux.c: - * gst/mpegpsmux/psmuxstream.c: - * gst/mpegpsmux/psmuxstream.h: - mpegpsmux: port to 0.11 - Naive port. Barely tested. - -2012-12-31 12:42:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Don't reconfigure if we get compatible caps - -2012-12-31 12:33:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Only create the MFC context in ::set_format() - -2012-12-31 11:56:51 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Recreate fimc context if settings change - -2012-12-31 11:02:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Some refactoring - -2012-12-31 09:47:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - * sys/mfc/gstmfcdec.h: - mfc: Do zerocopy if we get EGLImage buffers - -2012-12-30 16:45:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Some minor fixes - -2012-12-26 13:30:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Fix double-unmap of the codec data - -2012-12-26 13:27:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/fimc/fimc.c: - * sys/mfc/gstmfcdec.c: - * sys/mfc/gstmfcdec.h: - mfc: Pass codec_data to the codec if there's some - -2012-12-26 13:18:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/fimc/fimc.c: - * sys/mfc/fimc/fimc.h: - * sys/mfc/gstmfcdec.c: - mfc: Refactor fimc code a bit - -2012-12-26 12:38:32 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/mfc_decoder/mfc_decoder.c: - mfc: Downgrade an error to debug output - -2012-12-26 11:51:46 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/fimc/fimc.c: - mfc: Some fimc cleanup - -2012-12-26 09:56:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Add profile/level and width/height constraints - -2012-12-24 16:23:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/fimc/fimc.c: - mfc: Don't leak buffers when setting new dest settings for a direct buffer - -2012-12-24 16:02:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Add initial MPEG4 support - -2012-12-24 15:44:54 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Add some more debug output - -2012-12-24 15:34:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - * sys/mfc/mfc_decoder/mfc_decoder.c: - * sys/mfc/mfc_decoder/mfc_decoder.h: - mfc: Implement tracking of frames using the v4l2_buffer timestamp - -2012-12-24 14:48:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Reset some more variables on ::reset() - -2012-12-24 14:36:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Also add support for YV12 - -2012-12-24 13:41:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - * sys/mfc/gstmfcdec.h: - mfc: Add support for video meta - -2012-12-24 13:39:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - * sys/mfc/gstmfcdec.h: - mfc: Implement negotiation to NV12 or I420 based on downstream caps - -2012-12-24 12:31:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/fimc/fimc.c: - mfc: Workaround for wrongly reported strides by FIMC - -2012-12-24 12:18:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - * sys/mfc/gstmfcdec.h: - * sys/mfc/mfc_decoder/mfc_decoder.c: - * sys/mfc/mfc_decoder/mfc_decoder.h: - mfc: Add proper support for MFC decoder strides - -2012-12-24 12:10:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Try with I420 for now, it's easier to debug - -2012-12-24 11:57:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Add some more debug output - -2012-12-24 11:54:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/fimc/fimc.c: - mfc: Don't require stride to be set on src parameters - -2012-12-24 11:49:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/mfc_decoder/mfc_decoder.c: - * sys/mfc/mfc_decoder/mfc_decoder.h: - mfc: The mfc decoder library is dual licensed too - Apache License 2.0 and LGPL2+ - -2012-12-23 12:25:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/Makefile.am: - * sys/mfc/fimc/fimc.c: - * sys/mfc/fimc/fimc.h: - * sys/mfc/gstmfcdec.c: - * sys/mfc/gstmfcdec.h: - mfc: Use CAMIF/FIMC for hardware color format conversion and de-tiling - -2012-12-23 13:46:07 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - mfc: Only unref the outbuf if it doesn't belong to the frame - -2012-12-23 12:04:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/Makefile.am: - * sys/mfc/gstmfc.c: - * sys/mfc/gstmfcdec.c: - mfc: Port to GStreamer 1.0 - -2012-12-23 11:47:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/gstmfcdec.c: - * sys/mfc/gstmfcdec.h: - mfc: Add initial decoder element implementation - This does not copy the output to any output buffers yet. - Other than that should be basically functional already. - -2012-12-23 10:23:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * sys/Makefile.am: - * sys/mfc/Makefile.am: - * sys/mfc/gstmfc.c: - * sys/mfc/gstmfcdec.c: - * sys/mfc/gstmfcdec.h: - mfc: Add plugin and decoder skeleton - -2012-12-23 10:05:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/mfc_decoder/mfc_decoder.c: - * sys/mfc/mfc_decoder/mfc_decoder.h: - mfc: Make mfc_decoder library compile and fix some compiler warnings - -2012-12-23 09:56:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/mfc/mfc_decoder/mfc_decoder.c: - * sys/mfc/mfc_decoder/mfc_decoder.h: - mfc: Add mfc_decoder library from FXI - -2012-12-31 11:38:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Downgrade a GST_ERROR to a GST_DEBUG - -2012-12-30 14:22:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Make last_flow handling more threadsafe - -2012-12-28 12:27:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - * ext/eglgles/video_platform_wrapper.c: - * ext/eglgles/video_platform_wrapper.h: - eglglessink: Add support for allocating EGLImages on Mali - This allows to decoders and other upstream elements to do - zero-copy to the sink. - -2012-12-31 00:16:42 +0000 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - configure: replace deprecated AM_CONFIG_HEADER with AC_CONFIG_HEADERS - AM_CONFIG_HEADER has been removed in the just-released automake 1.13: - https://lists.gnu.org/archive/html/automake/2012-12/msg00038.html - https://bugzilla.gnome.org/show_bug.cgi?id=690881 - -2012-12-30 11:32:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/video_platform_wrapper.c: - eglglessink: Fix indention - -2012-12-30 11:32:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Return the last_flow immediately if it wasn't GST_FLOW_OK - -2012-12-30 11:29:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix copy&paste mistake - -2012-12-30 10:45:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Improve EGL/GL error handling a bit - -2012-12-30 10:43:33 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Don't access the video frame data if not necessary - -2012-12-30 10:18:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Configure caps from the setcaps function already - -2012-07-26 20:38:28 +0200 Matthias Hardt <mhardt@berlinux-solutions.de> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: extract ISO 639 language codes for subtitles into taglists - https://bugzilla.gnome.org/show_bug.cgi?id=680200 - -2012-12-28 19:36:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Bind the OpenGL ES API in the render thread too - -2012-12-28 14:05:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Some refactoring as preparation for platform specific rendering - -2012-12-28 13:08:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.h: - eglglessink: Add some more comments - -2012-12-28 12:40:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Only use the GstVideoFrame if we have a buffer - -2012-12-27 10:51:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/eglgles/Makefile.am: - * ext/eglgles/video_platform_wrapper.c: - eglglessink: Add configure parameter to chose the EGL window system - Only needed for creating native windows. - -2012-12-26 17:35:46 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/eglgles/video_platform_wrapper.c: - eglglessink: Add support for Mali fbdev EGL driver - -2012-12-27 14:09:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dhelpers.h: - d3dvideosink: Add compatibility #defines for older mingw headers - These were removed recently but these mingw headers are still - out there. - -2012-12-21 07:35:13 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - decklink: remove useless and uninitialized list causing a crash in the device probe - -2012-12-26 17:25:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Add support for video meta and arbitrary strides - -2012-12-26 15:58:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix width/height swap in last commit - -2012-12-26 15:46:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Remove debug function call from previous commit - -2012-12-26 14:39:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - * ext/eglgles/video_platform_wrapper.c: - eglglessink: Fix handling of GstVideoOverlay::set_render_rect() and crop metadata - -2012-12-26 10:54:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/video_platform_wrapper.c: - eglglessink: Add a cast from EGLNativeWindowType to Window to fix a compiler warning - -2012-12-26 10:39:52 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix a crash on GstVideoOverlay::expose() - -2012-12-26 10:34:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - * ext/eglgles/video_platform_wrapper.c: - * ext/eglgles/video_platform_wrapper.h: - eglglessink: Fix crash when closing internal X11 window - -2012-12-26 10:20:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/eglgles/video_platform_wrapper.c: - eglglessink: Add proper check for X11 - -2012-12-18 09:53:16 -0800 Joe Konno <joe.konno@intel.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: do not default to a fullscreen canvas - Defer certain canvas particulars to the player (or the Wayland - compositor). Before this change, a fullscreen canvas was always - requested. This may not be desirable in all cases. - https://bugzilla.gnome.org/show_bug.cgi?id=690442 - -2012-12-23 09:51:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: Only use 10 bit YUV formats for exactly 10 bit images, not <= 16 bit - And use the generic converter to AYUV64 for everything else. - -2012-12-22 18:43:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Remove scary "while (object.refcount > 0) release (object);" code - If there is a memory leak, this isn't the way how it should be fixed. - -2012-12-22 18:17:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Don't forget to return a value from ::propose_allocation() - -2012-12-22 18:17:04 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Add support for the video meta - -2012-12-22 18:12:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dhelpers.h: - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: Don't use "class" as variable name and don't use C99 comments - -2012-12-22 18:04:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Only open system resources in in NULL->READY, not on object instantiation - -2012-12-22 17:55:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dhelpers.h: - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: Properly copy frames to D3D with the right strides and everything - And only support color formats that are actually supported by the driver, - this allows proper zero-copy handling later and simplifies the code a lot. - Also simplify some other places, like the format mapping code. - -2012-12-22 16:26:52 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: Remove non-sense display PAR handling - This has to be implemented properly at some point - -2012-12-22 16:18:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Fix caps leak - -2012-12-22 12:09:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Fix duplicated format entry in the template caps - -2012-12-22 12:05:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * sys/d3dvideosink/Makefile.am: - d3dvideosink: Fix linking - -2012-12-22 11:58:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dhelpers.c: - d3dvideosink: Fix some more compiler warnings - -2012-12-22 11:50:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: Port remaining bits to new GLib threading API - -2012-12-22 11:45:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: And remove the right declaration - -2012-12-22 11:44:32 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Remove unused static declaration - -2012-12-22 11:43:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Remove unused variables - -2012-12-22 11:42:52 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: Update to new GLib threading API - -2012-12-22 11:38:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: Rename keep_aspect_ratio to force_aspect_ratio in the header too - -2012-12-22 11:35:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Use G_PARAM_STATIC_STRINGS - -2012-12-22 11:34:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Rename keep-aspect-ratio to force-aspect-ratio and default to TRUE - For consistency with other video sinks. - -2012-12-22 11:30:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dhelpers.c: - * sys/d3dvideosink/d3dhelpers.h: - d3dvideosink: Add files that had to be included in the last commit - -2012-12-22 11:28:19 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/Makefile.am: - d3dvideosink: Add $(GST_PLUGINS_BASE_CFLAGS) to CFLAGS - -2012-12-22 11:24:28 +0100 Roland Krikava <rkrikava@gmail.com> - - * sys/d3dvideosink/Makefile.am: - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/d3dvideosink.h: - * sys/d3dvideosink/directx/directx.h: - * sys/d3dvideosink/directx/directx10/dx10.c: - * sys/d3dvideosink/directx/directx10/dx10.h: - * sys/d3dvideosink/directx/directx10/dx10_d3d.c: - * sys/d3dvideosink/directx/directx10/dx10_d3d.h: - * sys/d3dvideosink/directx/directx11/dx11.c: - * sys/d3dvideosink/directx/directx11/dx11.h: - * sys/d3dvideosink/directx/directx11/dx11_d3d.c: - * sys/d3dvideosink/directx/directx11/dx11_d3d.h: - * sys/d3dvideosink/directx/directx9/dx9.c: - * sys/d3dvideosink/directx/directx9/dx9.h: - * sys/d3dvideosink/directx/directx9/dx9_d3d.c: - * sys/d3dvideosink/directx/directx9/dx9_d3d.h: - * sys/d3dvideosink/directx/directx_d3d.c: - * sys/d3dvideosink/directx/directx_d3d.h: - * sys/d3dvideosink/directx/dx.c: - * sys/d3dvideosink/directx/dx.h: - d3dvideosink: Various improvements - * XOverlay set_render_rectangle support (Useful for rendering in QT QML) - * Video format negotiation (with preference ordering) - * Using Direct3D9 (No benefit to using newer D3D versions) - -2012-12-21 16:11:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Only include formats that are actually working - -2012-12-21 15:23:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Add the actually supported color formats to the template caps - -2012-12-18 22:23:42 +0100 Sebastian Rasmussen <sebras@gmail.com> - - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegenc.c: - openjpegenc/-dec: print openjpeg logs for debug tracing - -2012-12-18 16:56:28 +0100 Thijs Vermeir <thijsvermeir@gmail.com> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusparse.c: - opus: use appropriate printf format for gsize - -2012-12-18 16:52:26 +0100 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/videoparsers/gstvc1parse.c: - videoparsers: use appropriate printf format for gsize - -2012-12-18 16:50:37 +0100 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmux.c: - mxf: use appropriate printf format for gsize - -2012-12-18 16:40:59 +0100 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/jpegformat/gstjifmux.c: - jpeg: use appropriate printf format for gsize - -2012-12-18 16:20:08 +0100 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/inter/gstinteraudiosink.c: - inter: use appropriate printf format for gsize - -2012-12-18 15:44:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openjpeg/gstopenjpegenc.c: - openjpegenc: Add some properties - -2012-12-18 15:43:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: Don't crash if colorspace is not provided on the caps - g_str_equal() is *not* NULL-safe - -2012-12-17 17:19:54 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: Improve robustness against formats with different settings per component - -2012-12-17 17:13:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: Properties won't be needed in the decoder - -2012-12-17 17:11:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openjpeg/gstopenjpegenc.c: - openjpegenc: Fix data pointer incrementing - -2012-12-17 17:06:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openjpeg/gstopenjpegenc.c: - openjpegenc: Optimize image filling functions a bit - -2012-12-17 17:02:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: Add missing shifts - -2012-12-17 16:57:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openjpeg/gstopenjpegdec.c: - openjpegdec: Optimize frame filling functions a bit - -2012-12-17 15:16:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - videoparsers: Make sure the caps are actually writable before changing them - -2012-12-17 15:04:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - videoparsers: Use the peer caps for restrictions instead of the srcpad allowed caps - Otherwise we will intersect with the srcpad template caps and add all the caps fields - that the parser will ever set, no matter if downstream restricts this field or not. - This requires upstream to set this field on the caps to successfully negotiate. - https://bugzilla.gnome.org/show_bug.cgi?id=690184 - -2012-12-16 20:05:46 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegenc.c: - openjpeg: Correct template caps a bit - -2012-12-16 20:02:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegdec.h: - * ext/openjpeg/gstopenjpegenc.c: - openjpeg: Handle the num-components field in the caps - -2012-12-15 11:25:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegdec.h: - * ext/openjpeg/gstopenjpegenc.c: - openjpeg: Add support for the colorspace field in the caps - -2012-12-14 20:08:27 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openjpeg/gstopenjpeg.c: - * ext/openjpeg/gstopenjpegenc.c: - * ext/openjpeg/gstopenjpegenc.h: - openjpeg: Add JPEG2000 encoder element - -2012-12-14 14:38:45 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - * ext/openjpeg/Makefile.am: - * ext/openjpeg/gstopenjpeg.c: - * ext/openjpeg/gstopenjpegdec.c: - * ext/openjpeg/gstopenjpegdec.h: - * ext/openjpeg/gstopenjpegenc.c: - * ext/openjpeg/gstopenjpegenc.h: - openjpeg: Add OpenJPEG based JPEG2000 decoder - -2012-12-16 17:44:57 +0000 Tim-Philipp Müller <tim@centricular.net> - - * Makefile.am: - build: add removed rtpmux bits to cruft check - -2012-12-16 17:35:07 +0000 Tim-Philipp Müller <tim@centricular.net> - - * Android.mk: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-rtpmux.xml: - * gst-plugins-bad.spec.in: - * gst/rtpmux/Makefile.am: - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpdtmfmux.h: - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - * gst/rtpmux/gstrtpmuxer.c: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/rtpmux.c: - rtpmux: remove rtpmux plugin, moved to -good - Move rtpmux and rtpdtmfmux into rtpmanager plugin in -good. - https://bugzilla.gnome.org/show_bug.cgi?id=629117 - -2012-12-14 14:51:19 +0000 Tim-Philipp Müller <tim@centricular.net> - - * Android.mk: - * Makefile.am: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-scaletempo.xml: - * gst-plugins-bad.spec.in: - * gst/scaletempo/Makefile.am: - * gst/scaletempo/gstscaletempo.c: - * gst/scaletempo/gstscaletempo.h: - * gst/scaletempo/gstscaletempoplugin.c: - * tests/examples/Makefile.am: - * tests/examples/scaletempo/.gitignore: - * tests/examples/scaletempo/Makefile.am: - * tests/examples/scaletempo/demo-gui.c: - * tests/examples/scaletempo/demo-gui.h: - * tests/examples/scaletempo/demo-main.c: - * tests/examples/scaletempo/demo-player.c: - * tests/examples/scaletempo/demo-player.h: - scaletempo: remove scaletempo plugin, moved to -good - https://bugzilla.gnome.org/show_bug.cgi?id=687262 - -2012-12-14 18:09:06 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/autoconvert/gstautovideoconvert.c: - autoconvert: don't use deprecated threading API - -2012-12-13 14:12:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: use upstream width/height when given - The upstream width and height should override the dimension detected in the - file. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=683142 - -2012-12-13 11:47:57 +0100 Arnaud Vrac <avrac@freebox.fr> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparse: export number of sprite warping points in caps - This allows filtering out videos for hardware decoders that do not - support GMC at all or only support a limited number of sprite warping - points (usually 1). - -2012-12-13 11:43:09 +0100 Arnaud Vrac <avrac@freebox.fr> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparse: handle divx caps - DivX 4/5 are MPEG4 part 2 videos, so they can be parsed by this plugin. - -2012-12-13 01:57:21 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * sys/directsound/gstdirectsoundsrc.c: - * sys/directsound/gstdirectsoundsrc.h: - directsound: fix compilation errors caused by circular includes - https://bugzilla.gnome.org/show_bug.cgi?id=690128 - -2012-12-12 18:50:09 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/mxf/mxfdemux.c: - mxfdemux: printf format fixes for debug messages - -2012-12-12 00:40:20 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/hls/Makefile.am: - hls: minor Makefile clean-up - Remove superfluous SOUP_CFLAGS and SOUP_LIBS. - -2012-12-11 21:09:02 +0000 Michael Esemplare <michael.esemplare@gmail.com> - - * gst/hls/Makefile.am: - hls: link to the right gst-plugins-base libs and fix libs order - https://bugzilla.gnome.org/show_bug.cgi?id=690030 - -2012-12-11 20:58:42 +0000 Michael Esemplare <michael.esemplare@gmail.com> - - * sys/d3dvideosink/Makefile.am: - d3dvideosink: fix compiler and linker flags - https://bugzilla.gnome.org/show_bug.cgi?id=690031 - -2012-12-11 15:00:15 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Use AC_LANG_PROGRAM to make autoconf happy - -2012-12-11 14:19:41 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * sys/winscreencap/Makefile.am: - winscreencap: Fix configure check and compilation - -2012-12-11 10:58:54 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/libmms/gstmms.c: - mms: Fix format string for off_t/goffset - Fixes bug #690033. - -2012-12-06 10:06:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfdemux.c: - mxfdemux: Don't allow any wrapping other than frame wrapping - Bad things will happen otherwise, like reading a complete, - multiple GB large video track into a single buffer. - Conflicts: - gst/mxf/mxfdemux.c - -2012-12-05 15:27:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfalaw.c: - * gst/mxf/mxfd10.c: - * gst/mxf/mxfdv-dif.c: - * gst/mxf/mxfessence.h: - * gst/mxf/mxfjpeg2000.c: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfup.c: - * gst/mxf/mxfvc3.c: - mxfdemux: Add function to get the essence track wrapping - -2012-12-05 12:23:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfquark.c: - * gst/mxf/mxfquark.h: - mxf: Add support for parsing filler structural components - This does not add support for actually producing filler data - if there's a filler component in a timeline. - -2012-12-05 12:08:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfmetadata.c: - mxf: Improve debug output during metadata resolval - -2012-12-01 17:05:38 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: disable seeking if the configured url specifies live=true - Disable seeking when live=true is set in the location URL (eg: - "rtmp://example.net/stream live=true") - -2012-11-30 20:01:16 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * ext/resindvd/Makefile.am: - * gst/frei0r/Makefile.am: - resindvd, frei0r: link to libgmodule-2.0 in plugins that use g_module_* API - Probably needed for other plugins as well. - -2012-11-30 19:54:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: sprinkle some AC_LANG_PROGRAM in wasapi check - So autogen.sh stops moaning. - -2012-11-30 15:10:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfmpeg.c: - mxf: Add more support for RP2008 (AVC in the MPEG mapping) - Conflicts: - gst/mxf/mxfmpeg.c - -2012-11-30 11:44:51 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/wasapi/Makefile.am: - wasapi: make the build happy without the static plugins patch - -2012-11-30 11:40:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Add wasapi to the unported plugins - -2012-11-30 11:37:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * sys/Makefile.am: - * sys/wasapi/Makefile.am: - wasapi: Integrate into the autotools build system - Patch based on a patch by Fabrizio Ciavatta <fabrizio.ciavatta@gmail.com> - -2012-11-28 13:10:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * sys/shm/Makefile.am: - shm: Fix configure check and clean up Makefile - -2012-11-27 15:34:19 -0500 Emmanuel Durand <emmanueldurand@gmail.com> - - * configure.ac: - * sys/shm/Makefile.am: - * sys/shm/shmpipe.c: - shm: Fix compilation of shm on OSX - https://bugzilla.gnome.org/show_bug.cgi?id=689183 - -2012-11-26 19:21:03 +0000 Krzysztof Konopko <krzysztof.konopko@youview.com> - - * gst/mpegtsmux/mpegtsmux.c: - * tests/check/elements/mpegtsmux.c: - mpegtsmux: crashes when trying to re-use the element - A crash occured after pushing buffers and changing mpegtsmux state to - NULL/READ and then back to PLAYING/PAUSED. - The crash was caused by holding a dangling pointer in the MpegTsMux - program table. - Additionally stream headers were leaked when resetting the element: - mux->streamheader set to NULL in mpegtsmux_reset() before it's released - later in the same function. - Added a unit test: test_multiple_state_change - https://bugzilla.gnome.org/show_bug.cgi?id=689107 - -2012-11-23 12:26:43 +0100 Christian Fredrik Kalager Schaller <uraeus@linuxrisin.org> - - * gst-plugins-bad.spec.in: - Add latest ported plugins etc. - -2012-11-22 10:57:25 +0000 Krzysztof Konopko <krzysztof.konopko@youview.com> - - * gst/mpegtsmux/mpegtsmux.c: - * tests/check/elements/mpegtsmux.c: - mpegtsmux: propagate flow returns - And add a unit test. - https://bugzilla.gnome.org/show_bug.cgi?id=688870 - -2012-11-21 10:21:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/directdraw/Makefile.am: - * sys/directsound/Makefile.am: - * sys/winks/Makefile.am: - windows: Put the DirectX LDFLAGS in the correct place and reorder libraries - -2012-11-20 23:20:38 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/hls/gsthlssink.c: - hlssink: add doc chunk with example command line - -2012-11-20 12:05:17 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: fix redefinition of DECLARE_INTERFACE_IID - https://bugzilla.gnome.org/show_bug.cgi?id=688510 - -2012-11-19 19:29:48 -0500 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst-libs/gst/interfaces/photography.h: - GstPhotography: Add new enum values to match android's parameters - https://bugzilla.gnome.org/show_bug.cgi?id=688486 - -2012-11-19 10:32:57 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: fix PTYPE for interlaced frames. - Coverity found missing break in parse_frame_header_advanced() when - determining PTYPE from FPTYPE for interlaced streams. - https://bugzilla.gnome.org/show_bug.cgi?id=688626 - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2012-09-21 18:23:21 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix error code for invalid size parsed in SPS. - gst_h264_parse_sps() returned FALSE if it parsed invalid (negative) - size components. Now make it gracefully return GST_H264_PARSER_ERROR - instead of GST_H264_PARSER_OK (FALSE). - https://bugzilla.gnome.org/show_bug.cgi?id=684568 - -2012-11-19 11:26:27 +0000 Tim-Philipp Müller <tim@centricular.net> - - * common: - Automatic update of common submodule - From b497c4f to a72faea - -2012-11-15 11:37:12 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparse: Fix nitpick - -2012-11-15 10:14:34 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparse: Make sure pad template caps are not fixed from the begging - Right now decodebin will concider the pad template caps as fixed and if a decoder - has restriction on for example height/width it won't be autoplugged because - gst_caps_is_subset fails as those fields are missing from the pad template caps. - We fix the issue here making sure that the pad caps are fixed using data from - the stream. - -2012-11-13 22:40:25 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: forward upstream time segments after flushes - Also reset segment info and drop the segment event when demuxer is - flushed. - Restore demuxer segment with the info stored in base when demuxer is - going to push data again if needed. - Drop code to recover the segment info from base in the initial program - becauses it's superseded by the new code. - -2012-11-14 12:41:27 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/audiovisualizers/gstaudiovisualizer.c: - * gst/mpegtsmux/mpegtsmux.c: - gst_adapter_prev_timestamp -> gst_adapter_prev_pts - -2012-11-14 11:35:23 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/hls/Makefile.am: - hls: dist all header files needed to build - -2012-11-14 10:46:55 +0000 Tim-Philipp Müller <tim@centricular.net> - - * gst/accurip/Makefile.am: - accurip: fix linker flags - Spotted by Rico Tzschichholz. - -2012-11-11 12:46:43 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: reset the stream some more in the flushes - Now that we handle flushing in the FLUSH_STOP event we need to make - the streams ready if they were flushing. - -2012-11-11 12:45:03 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: flush observations too - Flush the previous observations when the packetizer is flushed. - Also don't leak them in the dispose. - -2012-11-10 20:44:44 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: fix double unref of seek event - -2012-11-10 20:30:13 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: flush in FLUSH_STOP to avoid race conditions - Ensure the chain is not running before reset the state to avoid race - conditions and random corruptions downstream. - Also fixes segfaults in the packetizer due wrong available values that - causes gst_adapter_map to return a NULL pointer. - -2012-11-12 14:56:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - amcvideodec: Fix refcount problem with frames being dropped because of decoder bugs - -2012-11-12 11:48:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Use new GType for GThread instead of just G_TYPE_POINTER - -2012-11-12 11:32:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcaudiodec.h: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideodec.h: - androidmedia: Update to new GLib thread API - -2012-11-10 19:52:46 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - Revert "tspacketizer: ensure that a null pointer isn't accessed" - This reverts commit 6efd611b8c6f43f67a2f93f8445c189e24961abd. - Also this extra check won't be needed if it's fixed the race by moving - flush actions to FLUSH_STOP. - -2012-11-10 19:46:40 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - Revert "tsbase: add a guard with an atomic boolean when flushing" - This reverts commit e14e310f7178aa8c020f593e3f71ec92ca2531f7. - Would be better move the packetizer flushing to FLUSH_STOP and avoid - the race that way. Without introducing a memory barrier that could - have impact in the performance. - -2012-11-10 14:43:17 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/hls/.gsthlsdemux.c.swp: - * gst/hls/.gsthlssink.c.swp: - hlssink: remove vim .swp files that I just committed accidentally... - -2012-11-10 14:26:46 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/hls/.gsthlsdemux.c.swp: - * gst/hls/.gsthlssink.c.swp: - * gst/hls/Makefile.am: - * gst/hls/gstfragmentedplugin.c: - hlssink: port to 1.0 - -2012-10-28 21:29:31 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/hls/gsthlssink.c: - * gst/hls/gsthlssink.h: - hlssink: cut segments using the running-time - -2012-09-09 21:56:43 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/hls/gsthlssink.c: - hlssink: don't unref ->multifilesink. - We gst_bin_add it to ourself so no need to unref in _dispose. - -2012-09-09 21:56:22 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/hls/gsthlssink.c: - hlssink: rework _reset a bit - -2012-11-10 00:08:35 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - tsbase: add a guard with an atomic boolean when flushing - -2012-11-09 22:17:11 +0100 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - tspacketizer: ensure that a null pointer isn't accessed - Mitigates segfault due race condition in FLUSH_START handling and - mpegts_base_chain. - -2012-11-08 17:15:26 +0100 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegts: Only use timestamp-based PCR/PTS estimation when needed - When dealing with non-time based push-mode streams, we need to revert - to using the offset-based PCR/PTS estimation logic of packetizer. - This solves uses cases such as: - pushfile:// ! tsdemux - src ! queue ! tsdemux - https://bugzilla.gnome.org/show_bug.cgi?id=687178 - -2012-11-08 12:12:59 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-eglglessink.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-opus.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - docs: Add missing plugin inspection files - Fixes bug #687840. - -2012-11-07 20:50:25 +0000 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - configure.ac: update courtesy of autoupdate - -2012-11-07 20:48:37 +0000 Tim-Philipp Müller <tim@centricular.net> - - * common: - * configure.ac: - configure: let AG_GST_PLUGIN_DOCS check for python - And update common for move from AS_PATH_PYTHON to AM_PATH_PYTHON, - which as a side-effect should pick up newer python versions as - well. - https://bugzilla.gnome.org/show_bug.cgi?id=563903 - -2012-11-06 20:51:10 +0000 Kevin Thornberry <gimmeamilkbttf@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: fix DTS value being used for PTS - https://bugzilla.gnome.org/show_bug.cgi?id=687806 - -2012-11-06 12:40:05 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: don't rewind to the NAL length size in bytewriter if the format is bytestream - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=687548 - Signed-off-by: Kevin Thornberry - -2012-11-06 11:54:39 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Actually add PPS data to the output buffer - -2012-09-28 12:36:55 -0400 Will Thompson <will.thompson@collabora.co.uk> - - * gst/hls/gsthlssink.c: - * gst/hls/gsthlssink.h: - hlssink: add a playlist-length property - Probably not particularly useful in general, but handy - to cut down the latency on a stream. - https://bugzilla.gnome.org/show_bug.cgi?id=687133 - -2012-10-29 13:24:25 +0000 Luciana Fujii Pontello <luciana@fujii.eti.br> - - * gst/hls/gsthlssink.c: - hlssink: reset when going to NULL state - https://bugzilla.gnome.org/show_bug.cgi?id=687133 - -2012-08-21 23:22:19 -0300 Luciana Fujii Pontello <luciana@fujii.eti.br> - - * gst/hls/gsthlssink.c: - hlssink: Fix segment names on playlist - When the playlist-root is not set, the segment name must not be - appended by the path. - https://bugzilla.gnome.org/show_bug.cgi?id=687133 - -2012-11-03 20:38:00 +0000 Tim-Philipp Müller <tim@centricular.net> - - * docs/random/LICENSE: - * ext/apexsink/gstapexplugin.c: - * ext/apexsink/gstapexraop.c: - * ext/apexsink/gstapexraop.h: - * ext/apexsink/gstapexsink.c: - * ext/apexsink/gstapexsink.h: - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - * ext/audiofile/gstaf.c: - * ext/audiofile/gstafparse.c: - * ext/audiofile/gstafparse.h: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsink.h: - * ext/audiofile/gstafsrc.c: - * ext/audiofile/gstafsrc.h: - * ext/bz2/gstbz2.c: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2dec.h: - * ext/bz2/gstbz2enc.c: - * ext/bz2/gstbz2enc.h: - * ext/cdaudio/gstcdaudio.c: - * ext/celt/gstcelt.c: - * ext/celt/gstceltdec.c: - * ext/celt/gstceltdec.h: - * ext/celt/gstceltenc.c: - * ext/celt/gstceltenc.h: - * ext/chromaprint/gstchromaprint.c: - * ext/chromaprint/gstchromaprint.h: - * ext/cog/gstcms.c: - * ext/cog/gstcms.h: - * ext/cog/gstcog.c: - * ext/cog/gstcogdownsample.c: - * ext/cog/gstcogmse.c: - * ext/cog/gstcogscale.c: - * ext/cog/gstcogutils.c: - * ext/cog/gstcogutils.h: - * ext/curl/gstcurl.c: - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlbasesink.h: - * ext/curl/gstcurlfilesink.c: - * ext/curl/gstcurlfilesink.h: - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlftpsink.h: - * ext/curl/gstcurlhttpsink.c: - * ext/curl/gstcurlhttpsink.h: - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/gstcurlsmtpsink.h: - * ext/curl/gstcurltlssink.c: - * ext/curl/gstcurltlssink.h: - * ext/dc1394/gstdc1394.c: - * ext/dc1394/gstdc1394.h: - * ext/dirac/gstdirac.cc: - * ext/dirac/gstdiracdec.cc: - * ext/dirac/gstdiracdec.h: - * ext/dirac/gstdiracenc.cc: - * ext/directfb/dfbvideosink.c: - * ext/directfb/dfbvideosink.h: - * ext/dts/gstdtsdec.c: - * ext/dts/gstdtsdec.h: - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - * ext/eglgles/video_platform_wrapper.c: - * ext/eglgles/video_platform_wrapper.h: - * ext/faac/gstfaac.c: - * ext/faac/gstfaac.h: - * ext/faad/gstfaad.c: - * ext/faad/gstfaad.h: - * ext/flite/gstflite.c: - * ext/flite/gstflitetestsrc.c: - * ext/gme/gstgme.c: - * ext/gme/gstgme.h: - * ext/gsettings/gstgsettings.h: - * ext/gsettings/gstgsettingsaudiosink.c: - * ext/gsettings/gstgsettingsaudiosink.h: - * ext/gsettings/gstgsettingsaudiosrc.c: - * ext/gsettings/gstgsettingsaudiosrc.h: - * ext/gsettings/gstgsettingsvideosink.c: - * ext/gsettings/gstgsettingsvideosink.h: - * ext/gsettings/gstgsettingsvideosrc.c: - * ext/gsettings/gstgsettingsvideosrc.h: - * ext/gsettings/gstswitchsink.c: - * ext/gsettings/gstswitchsink.h: - * ext/gsettings/gstswitchsrc.c: - * ext/gsettings/gstswitchsrc.h: - * ext/gsettings/plugin.c: - * ext/gsm/gstgsm.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmdec.h: - * ext/gsm/gstgsmenc.c: - * ext/gsm/gstgsmenc.h: - * ext/jasper/gstjasper.c: - * ext/jasper/gstjasperdec.c: - * ext/jasper/gstjasperdec.h: - * ext/jasper/gstjasperenc.c: - * ext/jasper/gstjasperenc.h: - * ext/kate/gstkate.c: - * ext/kate/gstkate.h: - * ext/kate/gstkatedec.c: - * ext/kate/gstkatedec.h: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateenc.h: - * ext/kate/gstkateparse.c: - * ext/kate/gstkateparse.h: - * ext/kate/gstkatespu.c: - * ext/kate/gstkatespu.h: - * ext/kate/gstkatetag.c: - * ext/kate/gstkatetag.h: - * ext/kate/gstkatetiger.c: - * ext/kate/gstkatetiger.h: - * ext/kate/gstkateutil.c: - * ext/kate/gstkateutil.h: - * ext/ladspa/gstladspa.c: - * ext/ladspa/gstladspa.h: - * ext/libfame/gstlibfame.c: - * ext/libfame/gstlibfame.h: - * ext/libmms/gstmms.c: - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - * ext/mimic/gstmimic.c: - * ext/modplug/gstmodplug.cc: - * ext/modplug/gstmodplug.h: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mpeg2enc/gstmpeg2enc.hh: - * ext/mpeg2enc/gstmpeg2encoder.cc: - * ext/mpeg2enc/gstmpeg2encoder.hh: - * ext/mpeg2enc/gstmpeg2encoptions.cc: - * ext/mpeg2enc/gstmpeg2encoptions.hh: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.hh: - * ext/mpeg2enc/gstmpeg2encstreamwriter.cc: - * ext/mpeg2enc/gstmpeg2encstreamwriter.hh: - * ext/mplex/gstmplex.cc: - * ext/mplex/gstmplex.hh: - * ext/mplex/gstmplexibitstream.cc: - * ext/mplex/gstmplexibitstream.hh: - * ext/mplex/gstmplexjob.cc: - * ext/mplex/gstmplexjob.hh: - * ext/mplex/gstmplexoutputstream.cc: - * ext/mplex/gstmplexoutputstream.hh: - * ext/musepack/gstmusepackdec.c: - * ext/musepack/gstmusepackdec.h: - * ext/musepack/gstmusepackreader.c: - * ext/musepack/gstmusepackreader.h: - * ext/musicbrainz/gsttrm.c: - * ext/musicbrainz/gsttrm.h: - * ext/mythtv/gstmythtvsrc.c: - * ext/mythtv/gstmythtvsrc.h: - * ext/nas/nassink.c: - * ext/nas/nassink.h: - * ext/openal/gstopenal.c: - * ext/openal/gstopenalsink.c: - * ext/openal/gstopenalsink.h: - * ext/openal/gstopenalsrc.c: - * ext/openal/gstopenalsrc.h: - * ext/opencv/MotionCells.cpp: - * ext/opencv/MotionCells.h: - * ext/opencv/gstcvdilate.c: - * ext/opencv/gstcvdilate.h: - * ext/opencv/gstcvdilateerode.c: - * ext/opencv/gstcvdilateerode.h: - * ext/opencv/gstcvequalizehist.c: - * ext/opencv/gstcvequalizehist.h: - * ext/opencv/gstcverode.c: - * ext/opencv/gstcverode.h: - * ext/opencv/gstcvlaplace.c: - * ext/opencv/gstcvlaplace.h: - * ext/opencv/gstcvsmooth.c: - * ext/opencv/gstcvsmooth.h: - * ext/opencv/gstcvsobel.c: - * ext/opencv/gstcvsobel.h: - * ext/opencv/gstedgedetect.c: - * ext/opencv/gstedgedetect.h: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfaceblur.h: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstfacedetect.h: - * ext/opencv/gstmotioncells.c: - * ext/opencv/gstmotioncells.h: - * ext/opencv/gstopencv.c: - * ext/opencv/gstopencvutils.c: - * ext/opencv/gstopencvutils.h: - * ext/opencv/gstopencvvideofilter.c: - * ext/opencv/gstopencvvideofilter.h: - * ext/opencv/gstpyramidsegment.c: - * ext/opencv/gstpyramidsegment.h: - * ext/opencv/gsttemplatematch.c: - * ext/opencv/gsttemplatematch.h: - * ext/opencv/gsttextoverlay.c: - * ext/opencv/gsttextoverlay.h: - * ext/opencv/motioncells_wrapper.cpp: - * ext/opencv/motioncells_wrapper.h: - * ext/opus/gstopus.c: - * ext/opus/gstopuscommon.c: - * ext/opus/gstopuscommon.h: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - * ext/opus/gstopusheader.c: - * ext/opus/gstopusheader.h: - * ext/opus/gstopusparse.c: - * ext/opus/gstopusparse.h: - * ext/opus/gstrtpopusdepay.c: - * ext/opus/gstrtpopusdepay.h: - * ext/opus/gstrtpopuspay.c: - * ext/opus/gstrtpopuspay.h: - * ext/resindvd/gstmpegdemux.h: - * ext/resindvd/gstpesfilter.c: - * ext/resindvd/gstpesfilter.h: - * ext/resindvd/plugin.c: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdbin.h: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - * ext/resindvd/rsndec.c: - * ext/resindvd/rsndec.h: - * ext/resindvd/rsninputselector.c: - * ext/resindvd/rsninputselector.h: - * ext/rsvg/gstrsvg.c: - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgdec.h: - * ext/rsvg/gstrsvgoverlay.c: - * ext/rsvg/gstrsvgoverlay.h: - * ext/rtmp/gstrtmp.c: - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsink.h: - * ext/rtmp/gstrtmpsrc.c: - * ext/rtmp/gstrtmpsrc.h: - * ext/schroedinger/gstschro.c: - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroutils.c: - * ext/schroedinger/gstschroutils.h: - * ext/sdl/sdlvideosink.c: - * ext/sdl/sdlvideosink.h: - * ext/snapshot/gstsnapshot.c: - * ext/snapshot/gstsnapshot.h: - * ext/sndfile/gstsf.c: - * ext/sndfile/gstsf.h: - * ext/sndfile/gstsfsink.c: - * ext/sndfile/gstsfsink.h: - * ext/sndfile/gstsfsrc.c: - * ext/sndfile/gstsfsrc.h: - * ext/soundtouch/gstbpmdetect.cc: - * ext/soundtouch/gstbpmdetect.hh: - * ext/spandsp/gstspandsp.c: - * ext/spandsp/gstspanplc.c: - * ext/spandsp/gstspanplc.h: - * ext/spc/gstspc.c: - * ext/spc/gstspc.h: - * ext/spc/tag.c: - * ext/spc/tag.h: - * ext/swfdec/gstswfdec.c: - * ext/swfdec/gstswfdec.h: - * ext/timidity/gsttimidity.c: - * ext/timidity/gsttimidity.h: - * ext/timidity/gstwildmidi.c: - * ext/timidity/gstwildmidi.h: - * ext/voaacenc/gstvoaac.c: - * ext/voaacenc/gstvoaacenc.c: - * ext/voaacenc/gstvoaacenc.h: - * ext/voamrwbenc/gstvoamrwb.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/voamrwbenc/gstvoamrwbenc.h: - * ext/wayland/waylandpool.c: - * ext/wayland/waylandpool.h: - * ext/xvid/gstxvid.c: - * ext/xvid/gstxvid.h: - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxviddec.h: - * ext/xvid/gstxvidenc.c: - * ext/xvid/gstxvidenc.h: - * ext/zbar/gstzbar.c: - * ext/zbar/gstzbar.h: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabin-enum.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabin-enum.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.h: - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - * gst-libs/gst/codecparsers/gstmpeg4parser.h: - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - * gst-libs/gst/codecparsers/parserutils.c: - * gst-libs/gst/codecparsers/parserutils.h: - * gst-libs/gst/gettext.h: - * gst-libs/gst/glib-compat-private.h: - * gst-libs/gst/gst-i18n-plugin.h: - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.h: - * gst-libs/gst/video/gstsurfaceconverter.c: - * gst-libs/gst/video/gstsurfaceconverter.h: - * gst-libs/gst/video/gstsurfacemeta.c: - * gst-libs/gst/video/gstsurfacemeta.h: - * gst-libs/gst/video/videocontext.c: - * gst-libs/gst/video/videocontext.h: - * gst/accurip/gstaccurip.c: - * gst/accurip/gstaccurip.h: - * gst/adpcmdec/adpcmdec.c: - * gst/adpcmenc/adpcmenc.c: - * gst/aiff/aiff.c: - * gst/aiff/aiffmux.c: - * gst/aiff/aiffmux.h: - * gst/aiff/aiffparse.c: - * gst/aiff/aiffparse.h: - * gst/asfmux/gstasf.c: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfmux.h: - * gst/asfmux/gstasfobjects.c: - * gst/asfmux/gstasfobjects.h: - * gst/asfmux/gstasfparse.c: - * gst/asfmux/gstasfparse.h: - * gst/asfmux/gstrtpasfpay.c: - * gst/asfmux/gstrtpasfpay.h: - * gst/audiobuffer/gstaudioringbuffer.c: - * gst/audiovisualizers/gstaudiovisualizer.c: - * gst/audiovisualizers/gstaudiovisualizer.h: - * gst/audiovisualizers/gstdrawhelpers.h: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspacescope.h: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstspectrascope.h: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstsynaescope.h: - * gst/audiovisualizers/gstwavescope.c: - * gst/audiovisualizers/gstwavescope.h: - * gst/audiovisualizers/plugin.c: - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautoconvert.h: - * gst/autoconvert/gstautovideoconvert.c: - * gst/autoconvert/gstautovideoconvert.h: - * gst/autoconvert/plugin.c: - * gst/bayer/gstbayer.c: - * gst/bayer/gstbayer2rgb.c: - * gst/bayer/gstrgb2bayer.c: - * gst/bayer/gstrgb2bayer.h: - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/camerabingeneral.h: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * gst/camerabin2/gstplugin.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstviewfinderbin.h: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - * gst/cdxaparse/gstcdxaparse.c: - * gst/cdxaparse/gstcdxaparse.h: - * gst/cdxaparse/gstvcdparse.c: - * gst/cdxaparse/gstvcdparse.h: - * gst/coloreffects/gstchromahold.c: - * gst/coloreffects/gstchromahold.h: - * gst/coloreffects/gstcoloreffects.c: - * gst/coloreffects/gstcoloreffects.h: - * gst/coloreffects/gstplugin.c: - * gst/dataurisrc/gstdataurisrc.c: - * gst/dataurisrc/gstdataurisrc.h: - * gst/dccp/gstdccp.c: - * gst/dccp/gstdccp.h: - * gst/dccp/gstdccp_common.h: - * gst/dccp/gstdccpclientsink.c: - * gst/dccp/gstdccpclientsink.h: - * gst/dccp/gstdccpclientsrc.c: - * gst/dccp/gstdccpclientsrc.h: - * gst/dccp/gstdccpplugin.c: - * gst/dccp/gstdccpserversink.c: - * gst/dccp/gstdccpserversink.h: - * gst/dccp/gstdccpserversrc.c: - * gst/dccp/gstdccpserversrc.h: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/fpsdisplaysink.h: - * gst/debugutils/gstchecksumsink.c: - * gst/debugutils/gstchecksumsink.h: - * gst/debugutils/gstchopmydata.c: - * gst/debugutils/gstchopmydata.h: - * gst/debugutils/gstcompare.c: - * gst/debugutils/gstcompare.h: - * gst/debugutils/gstdebugspy.c: - * gst/debugutils/gstdebugspy.h: - * gst/dtmf/gstdtmfdetect.c: - * gst/dtmf/gstdtmfdetect.h: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfdepay.h: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.h: - * gst/dvdspu/gstdvdspu-render.c: - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - * gst/dvdspu/gstspu-common.h: - * gst/dvdspu/gstspu-pgs.c: - * gst/dvdspu/gstspu-pgs.h: - * gst/dvdspu/gstspu-vobsub-render.c: - * gst/dvdspu/gstspu-vobsub.c: - * gst/dvdspu/gstspu-vobsub.h: - * gst/faceoverlay/gstfaceoverlay.c: - * gst/faceoverlay/gstfaceoverlay.h: - * gst/festival/gstfestival.c: - * gst/festival/gstfestival.h: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/fieldanalysis/gstfieldanalysis.h: - * gst/freeverb/gstfreeverb.c: - * gst/freeverb/gstfreeverb.h: - * gst/frei0r/gstfrei0r.c: - * gst/frei0r/gstfrei0r.h: - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rfilter.h: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rmixer.h: - * gst/frei0r/gstfrei0rsrc.c: - * gst/frei0r/gstfrei0rsrc.h: - * gst/games/gstpuzzle.c: - * gst/games/gstvideoimage.c: - * gst/games/gstvideoimage.h: - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstburn.h: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstchromium.h: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdilate.h: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstdodge.h: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstexclusion.h: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstgaussblur.h: - * gst/gaudieffects/gstplugin.c: - * gst/gaudieffects/gstplugin.h: - * gst/gaudieffects/gstsolarize.c: - * gst/gaudieffects/gstsolarize.h: - * gst/gdp/dataprotocol.c: - * gst/gdp/dataprotocol.h: - * gst/gdp/dp-private.h: - * gst/gdp/gstgdp.c: - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdpdepay.h: - * gst/gdp/gstgdppay.c: - * gst/gdp/gstgdppay.h: - * gst/geometrictransform/geometricmath.c: - * gst/geometrictransform/geometricmath.h: - * gst/geometrictransform/gstbulge.c: - * gst/geometrictransform/gstbulge.h: - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstcircle.h: - * gst/geometrictransform/gstcirclegeometrictransform.c: - * gst/geometrictransform/gstcirclegeometrictransform.h: - * gst/geometrictransform/gstdiffuse.c: - * gst/geometrictransform/gstdiffuse.h: - * gst/geometrictransform/gstfisheye.c: - * gst/geometrictransform/gstfisheye.h: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstgeometrictransform.h: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstkaleidoscope.h: - * gst/geometrictransform/gstmarble.c: - * gst/geometrictransform/gstmarble.h: - * gst/geometrictransform/gstmirror.c: - * gst/geometrictransform/gstmirror.h: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstpinch.h: - * gst/geometrictransform/gstrotate.c: - * gst/geometrictransform/gstrotate.h: - * gst/geometrictransform/gstsphere.c: - * gst/geometrictransform/gstsphere.h: - * gst/geometrictransform/gstsquare.c: - * gst/geometrictransform/gstsquare.h: - * gst/geometrictransform/gststretch.c: - * gst/geometrictransform/gststretch.h: - * gst/geometrictransform/gsttunnel.c: - * gst/geometrictransform/gsttunnel.h: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gsttwirl.h: - * gst/geometrictransform/gstwaterripple.c: - * gst/geometrictransform/gstwaterripple.h: - * gst/geometrictransform/plugin.c: - * gst/hdvparse/gsthdvparse.c: - * gst/hdvparse/gsthdvparse.h: - * gst/hls/gstfragment.c: - * gst/hls/gstfragment.h: - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - * gst/hls/gsthlssink.c: - * gst/hls/gsthlssink.h: - * gst/hls/gstm3u8playlist.c: - * gst/hls/gstm3u8playlist.h: - * gst/hls/gsturidownloader.c: - * gst/hls/gsturidownloader.h: - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - * gst/id3tag/gstid3mux.c: - * gst/id3tag/gstid3mux.h: - * gst/id3tag/id3tag.c: - * gst/id3tag/id3tag.h: - * gst/inter/gstinteraudiosink.h: - * gst/inter/gstinteraudiosrc.h: - * gst/inter/gstintersubsink.h: - * gst/inter/gstintersubsrc.h: - * gst/inter/gstintersurface.h: - * gst/inter/gstintervideosink.h: - * gst/inter/gstintervideosrc.h: - * gst/interlace/gstinterlace.c: - * gst/ivfparse/gstivfparse.c: - * gst/ivfparse/gstivfparse.h: - * gst/jp2kdecimator/gstjp2kdecimator.c: - * gst/jp2kdecimator/gstjp2kdecimator.h: - * gst/jp2kdecimator/jp2kcodestream.c: - * gst/jp2kdecimator/jp2kcodestream.h: - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjifmux.h: - * gst/jpegformat/gstjpegformat.c: - * gst/jpegformat/gstjpegformat.h: - * gst/jpegformat/gstjpegparse.c: - * gst/jpegformat/gstjpegparse.h: - * gst/librfb/gstrfbsrc.c: - * gst/librfb/gstrfbsrc.h: - * gst/librfb/vncauth.c: - * gst/librfb/vncauth.h: - * gst/liveadder/liveadder.h: - * gst/mixmatrix/mixmatrix.c: - * gst/mpeg1sys/buffer.c: - * gst/mpeg1sys/buffer.h: - * gst/mpeg1sys/gstmpeg1systemencode.c: - * gst/mpeg1sys/gstmpeg1systemencode.h: - * gst/mpegdemux/gstmpegdefs.h: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - * gst/mpegdemux/gstpesfilter.c: - * gst/mpegdemux/gstpesfilter.h: - * gst/mpegdemux/plugin.c: - * gst/mpegpsmux/crc.h: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegpsmux/mpegpsmux.h: - * gst/mpegpsmux/mpegpsmux_aac.c: - * gst/mpegpsmux/mpegpsmux_aac.h: - * gst/mpegpsmux/mpegpsmux_h264.c: - * gst/mpegpsmux/mpegpsmux_h264.h: - * gst/mpegpsmux/psmux.c: - * gst/mpegpsmux/psmux.h: - * gst/mpegpsmux/psmuxcommon.h: - * gst/mpegpsmux/psmuxstream.c: - * gst/mpegpsmux/psmuxstream.h: - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/gstmpegdesc.c: - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/gsttsdemux.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/mpegtsparse.h: - * gst/mpegtsdemux/pesparse.c: - * gst/mpegtsdemux/pesparse.h: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/mpegtsmux_aac.c: - * gst/mpegtsmux/mpegtsmux_aac.h: - * gst/mpegtsmux/mpegtsmux_ttxt.c: - * gst/mpegtsmux/mpegtsmux_ttxt.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - * gst/mve/gstmve.c: - * gst/mve/gstmvedemux.c: - * gst/mve/gstmvedemux.h: - * gst/mve/gstmvemux.c: - * gst/mve/gstmvemux.h: - * gst/mve/mve.h: - * gst/mve/mveaudioenc.c: - * gst/mve/mvevideoenc16.c: - * gst/mve/mvevideoenc8.c: - * gst/mxf/mxf.c: - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfaes-bwf.h: - * gst/mxf/mxfalaw.c: - * gst/mxf/mxfalaw.h: - * gst/mxf/mxfd10.c: - * gst/mxf/mxfd10.h: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfdms1.h: - * gst/mxf/mxfdv-dif.c: - * gst/mxf/mxfdv-dif.h: - * gst/mxf/mxfessence.c: - * gst/mxf/mxfessence.h: - * gst/mxf/mxfjpeg2000.c: - * gst/mxf/mxfjpeg2000.h: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfmpeg.h: - * gst/mxf/mxfmux.c: - * gst/mxf/mxfmux.h: - * gst/mxf/mxfquark.c: - * gst/mxf/mxfquark.h: - * gst/mxf/mxftypes.c: - * gst/mxf/mxftypes.h: - * gst/mxf/mxful.c: - * gst/mxf/mxful.h: - * gst/mxf/mxfup.c: - * gst/mxf/mxfup.h: - * gst/mxf/mxfvc3.c: - * gst/mxf/mxfvc3.h: - * gst/nsf/dis6502.h: - * gst/nsf/fds_snd.c: - * gst/nsf/fds_snd.h: - * gst/nsf/gstnsf.c: - * gst/nsf/gstnsf.h: - * gst/nsf/log.c: - * gst/nsf/log.h: - * gst/nsf/mmc5_snd.c: - * gst/nsf/mmc5_snd.h: - * gst/nsf/nes6502.c: - * gst/nsf/nes6502.h: - * gst/nsf/nes_apu.c: - * gst/nsf/nes_apu.h: - * gst/nsf/nsf.c: - * gst/nsf/nsf.h: - * gst/nsf/osd.h: - * gst/nsf/types.h: - * gst/nsf/vrc7_snd.c: - * gst/nsf/vrc7_snd.h: - * gst/nsf/vrcvisnd.c: - * gst/nsf/vrcvisnd.h: - * gst/nuvdemux/gstnuvdemux.c: - * gst/nuvdemux/gstnuvdemux.h: - * gst/overlay/gstoverlay.c: - * gst/overlay/gstoverlay.h: - * gst/patchdetect/gstpatchdetect.h: - * gst/pcapparse/gstirtspparse.c: - * gst/pcapparse/gstirtspparse.h: - * gst/pcapparse/gstpcapparse.c: - * gst/pcapparse/gstpcapparse.h: - * gst/pcapparse/plugin.c: - * gst/pnm/gstpnm.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmdec.h: - * gst/pnm/gstpnmenc.c: - * gst/pnm/gstpnmenc.h: - * gst/pnm/gstpnmutils.c: - * gst/pnm/gstpnmutils.h: - * gst/rawparse/gstaudioparse.c: - * gst/rawparse/gstaudioparse.h: - * gst/rawparse/gstrawparse.c: - * gst/rawparse/gstrawparse.h: - * gst/rawparse/gstvideoparse.c: - * gst/rawparse/gstvideoparse.h: - * gst/real/gstreal.c: - * gst/real/gstreal.h: - * gst/real/gstrealaudiodec.c: - * gst/real/gstrealaudiodec.h: - * gst/real/gstrealvideodec.c: - * gst/real/gstrealvideodec.h: - * gst/removesilence/gstremovesilence.c: - * gst/removesilence/gstremovesilence.h: - * gst/removesilence/vad_private.c: - * gst/removesilence/vad_private.h: - * gst/rtjpeg/gstrtjpeg.c: - * gst/rtjpeg/gstrtjpegdec.c: - * gst/rtjpeg/gstrtjpegdec.h: - * gst/rtjpeg/gstrtjpegenc.c: - * gst/rtjpeg/gstrtjpegenc.h: - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpdtmfmux.h: - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - * gst/rtpmux/gstrtpmuxer.c: - * gst/scaletempo/gstscaletempo.c: - * gst/scaletempo/gstscaletempo.h: - * gst/scaletempo/gstscaletempoplugin.c: - * gst/sdi/gstsdi.c: - * gst/sdi/gstsdidemux.c: - * gst/sdi/gstsdidemux.h: - * gst/sdi/gstsdimux.c: - * gst/sdi/gstsdimux.h: - * gst/sdp/gstsdpdemux.c: - * gst/sdp/gstsdpdemux.h: - * gst/sdp/gstsdpelem.c: - * gst/segmentclip/gstaudiosegmentclip.c: - * gst/segmentclip/gstaudiosegmentclip.h: - * gst/segmentclip/gstsegmentclip.c: - * gst/segmentclip/gstsegmentclip.h: - * gst/segmentclip/gstvideosegmentclip.c: - * gst/segmentclip/gstvideosegmentclip.h: - * gst/segmentclip/plugin.c: - * gst/siren/common.c: - * gst/siren/common.h: - * gst/siren/dct4.c: - * gst/siren/dct4.h: - * gst/siren/decoder.c: - * gst/siren/decoder.h: - * gst/siren/encoder.c: - * gst/siren/encoder.h: - * gst/siren/gstsiren.c: - * gst/siren/gstsiren.h: - * gst/siren/gstsirendec.c: - * gst/siren/gstsirendec.h: - * gst/siren/gstsirenenc.c: - * gst/siren/gstsirenenc.h: - * gst/siren/huffman.c: - * gst/siren/huffman.h: - * gst/siren/huffman_consts.h: - * gst/siren/rmlt.c: - * gst/siren/rmlt.h: - * gst/siren/siren7.h: - * gst/smooth/gstsmooth.c: - * gst/smooth/gstsmooth.h: - * gst/speed/demo-mp3.c: - * gst/speed/gstspeed.c: - * gst/speed/gstspeed.h: - * gst/stereo/gststereo.c: - * gst/stereo/gststereo.h: - * gst/subenc/gstsrtenc.c: - * gst/subenc/gstsrtenc.h: - * gst/subenc/gstsubenc.c: - * gst/subenc/gstwebvttenc.c: - * gst/subenc/gstwebvttenc.h: - * gst/tta/crc32.h: - * gst/tta/gsttta.c: - * gst/tta/gstttadec.c: - * gst/tta/gstttadec.h: - * gst/tta/gstttaparse.c: - * gst/tta/gstttaparse.h: - * gst/tta/ttadec.h: - * gst/vbidec/gstvbidec.c: - * gst/vbidec/gstvbidec.h: - * gst/videofilters/gstscenechange.h: - * gst/videofilters/gstvideofilter2.h: - * gst/videofilters/gstzebrastripe.h: - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gstdiracparse.h: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth263parse.h: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpeg4videoparse.h: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstmpegvideoparse.h: - * gst/videoparsers/h263parse.c: - * gst/videoparsers/h263parse.h: - * gst/videoparsers/plugin.c: - * gst/videosignal/gstvideoanalyse.c: - * gst/videosignal/gstvideoanalyse.h: - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideodetect.h: - * gst/videosignal/gstvideomark.c: - * gst/videosignal/gstvideomark.h: - * gst/videosignal/gstvideosignal.c: - * gst/videosignal/gstvideosignal.h: - * gst/vmnc/vmncdec.c: - * gst/y4m/gsty4mdec.c: - * gst/y4m/gsty4mdec.h: - * sys/acmenc/acmenc.c: - * sys/acmmp3dec/acmmp3dec.c: - * sys/applemedia/avfvideosrc.h: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/bufferfactory.h: - * sys/applemedia/bufferfactory.m: - * sys/applemedia/celapi.c: - * sys/applemedia/celapi.h: - * sys/applemedia/celvideosrc.c: - * sys/applemedia/celvideosrc.h: - * sys/applemedia/cmapi.c: - * sys/applemedia/cmapi.h: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/coremediabuffer.h: - * sys/applemedia/coremediactx.c: - * sys/applemedia/coremediactx.h: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/corevideobuffer.h: - * sys/applemedia/cvapi.c: - * sys/applemedia/cvapi.h: - * sys/applemedia/dynapi-internal.h: - * sys/applemedia/dynapi.c: - * sys/applemedia/dynapi.h: - * sys/applemedia/mioapi.c: - * sys/applemedia/mioapi.h: - * sys/applemedia/miovideodevice.c: - * sys/applemedia/miovideodevice.h: - * sys/applemedia/miovideosrc.c: - * sys/applemedia/miovideosrc.h: - * sys/applemedia/mtapi.c: - * sys/applemedia/mtapi.h: - * sys/applemedia/plugin.m: - * sys/applemedia/qtkitvideosrc.h: - * sys/applemedia/qtkitvideosrc.m: - * sys/applemedia/vtapi.c: - * sys/applemedia/vtapi.h: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - * sys/applemedia/vth264decbin.c: - * sys/applemedia/vth264decbin.h: - * sys/applemedia/vth264encbin.c: - * sys/applemedia/vth264encbin.h: - * sys/applemedia/vtutil.c: - * sys/applemedia/vtutil.h: - * sys/avc/gstavcsrc.h: - * sys/cdrom/gstcdplayer.c: - * sys/cdrom/gstcdplayer.h: - * sys/cdrom/gstcdplayer_ioctl.c: - * sys/cdrom/gstcdplayer_ioctl.h: - * sys/cdrom/gstcdplayer_ioctl_bsd.h: - * sys/cdrom/gstcdplayer_ioctl_irix.h: - * sys/cdrom/gstcdplayer_ioctl_solaris.h: - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/d3dvideosink.h: - * sys/d3dvideosink/directx/directx.h: - * sys/d3dvideosink/directx/directx10/dx10.c: - * sys/d3dvideosink/directx/directx10/dx10.h: - * sys/d3dvideosink/directx/directx10/dx10_d3d.c: - * sys/d3dvideosink/directx/directx10/dx10_d3d.h: - * sys/d3dvideosink/directx/directx11/dx11.c: - * sys/d3dvideosink/directx/directx11/dx11.h: - * sys/d3dvideosink/directx/directx11/dx11_d3d.c: - * sys/d3dvideosink/directx/directx11/dx11_d3d.h: - * sys/d3dvideosink/directx/directx9/dx9.c: - * sys/d3dvideosink/directx/directx9/dx9.h: - * sys/d3dvideosink/directx/directx9/dx9_d3d.c: - * sys/d3dvideosink/directx/directx9/dx9_d3d.h: - * sys/d3dvideosink/directx/directx_d3d.c: - * sys/d3dvideosink/directx/directx_d3d.h: - * sys/d3dvideosink/directx/dx.c: - * sys/d3dvideosink/directx/dx.h: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinksink.h: - * sys/decklink/gstdecklinksrc.h: - * sys/directdraw/gstdirectdrawplugin.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - * sys/directsound/gstdirectsoundplugin.c: - * sys/directsound/gstdirectsoundsrc.c: - * sys/directsound/gstdirectsoundsrc.h: - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowaudiodec.h: - * sys/dshowdecwrapper/gstdshowdecwrapper.cpp: - * sys/dshowdecwrapper/gstdshowdecwrapper.h: - * sys/dshowdecwrapper/gstdshowfakesrc.cpp: - * sys/dshowdecwrapper/gstdshowfakesrc.h: - * sys/dshowdecwrapper/gstdshowutil.cpp: - * sys/dshowdecwrapper/gstdshowutil.h: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.h: - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowaudiosrc.h: - * sys/dshowsrcwrapper/gstdshowfakesink.cpp: - * sys/dshowsrcwrapper/gstdshowfakesink.h: - * sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - * sys/dshowvideosink/dshowvideofakesrc.cpp: - * sys/dshowvideosink/dshowvideofakesrc.h: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dshowvideosink/dshowvideosink.h: - * sys/dvb/cam.c: - * sys/dvb/cam.h: - * sys/dvb/camapplication.c: - * sys/dvb/camapplication.h: - * sys/dvb/camapplicationinfo.c: - * sys/dvb/camapplicationinfo.h: - * sys/dvb/camdevice.c: - * sys/dvb/camdevice.h: - * sys/dvb/camresourcemanager.c: - * sys/dvb/camresourcemanager.h: - * sys/dvb/camsession.c: - * sys/dvb/camsession.h: - * sys/dvb/camswclient.c: - * sys/dvb/camswclient.h: - * sys/dvb/camtransport.c: - * sys/dvb/camtransport.h: - * sys/dvb/camutils.c: - * sys/dvb/camutils.h: - * sys/dvb/dvbbasebin.c: - * sys/dvb/dvbbasebin.h: - * sys/dvb/gstdvb.c: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/parsechannels.c: - * sys/dvb/parsechannels.h: - * sys/dxr3/ac3_padder.c: - * sys/dxr3/ac3_padder.h: - * sys/dxr3/dxr3audiosink.c: - * sys/dxr3/dxr3audiosink.h: - * sys/dxr3/dxr3common.h: - * sys/dxr3/dxr3init.c: - * sys/dxr3/dxr3spusink.c: - * sys/dxr3/dxr3spusink.h: - * sys/dxr3/dxr3videosink.c: - * sys/dxr3/dxr3videosink.h: - * sys/fbdev/gstfbdevsink.c: - * sys/fbdev/gstfbdevsink.h: - * sys/linsys/gstlinsys.c: - * sys/linsys/gstlinsyssdisink.c: - * sys/linsys/gstlinsyssdisink.h: - * sys/linsys/gstlinsyssdisrc.c: - * sys/linsys/gstlinsyssdisrc.h: - * sys/opensles/opensles.c: - * sys/opensles/opensles.h: - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - * sys/opensles/openslessink.c: - * sys/opensles/openslessink.h: - * sys/opensles/openslessrc.c: - * sys/opensles/openslessrc.h: - * sys/osxvideo/osxvideoplugin.c: - * sys/osxvideo/osxvideosrc.c: - * sys/osxvideo/osxvideosrc.h: - * sys/pvr2d/gstpvrvideosink.c: - * sys/pvr2d/gstpvrvideosink.h: - * sys/qcam/gstqcamsrc.c: - * sys/qcam/gstqcamsrc.h: - * sys/qtwrapper/audiodecoders.c: - * sys/qtwrapper/codecmapping.c: - * sys/qtwrapper/codecmapping.h: - * sys/qtwrapper/imagedescription.c: - * sys/qtwrapper/imagedescription.h: - * sys/qtwrapper/qtutils.c: - * sys/qtwrapper/qtutils.h: - * sys/qtwrapper/qtwrapper.c: - * sys/qtwrapper/qtwrapper.h: - * sys/qtwrapper/videodecoders.c: - * sys/shm/gstshm.c: - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsink.h: - * sys/shm/gstshmsrc.c: - * sys/shm/gstshmsrc.h: - * sys/uvch264/gstuvch264.c: - * sys/uvch264/gstuvch264_mjpgdemux.c: - * sys/uvch264/gstuvch264_mjpgdemux.h: - * sys/uvch264/gstuvch264_src.c: - * sys/uvch264/gstuvch264_src.h: - * sys/uvch264/uvc_h264.c: - * sys/vcd/vcdsrc.c: - * sys/vcd/vcdsrc.h: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - * sys/vdpau/basevideodecoder/gstbasevideoutils.h: - * sys/vdpau/basevideodecoder/gstvideoframe.c: - * sys/vdpau/basevideodecoder/gstvideoframe.h: - * sys/vdpau/gstvdp/gstvdp.c: - * sys/vdpau/gstvdp/gstvdp.h: - * sys/vdpau/gstvdp/gstvdpbuffer.c: - * sys/vdpau/gstvdp/gstvdpbuffer.h: - * sys/vdpau/gstvdp/gstvdpbufferpool.c: - * sys/vdpau/gstvdp/gstvdpbufferpool.h: - * sys/vdpau/gstvdp/gstvdpdecoder.c: - * sys/vdpau/gstvdp/gstvdpdecoder.h: - * sys/vdpau/gstvdp/gstvdpdevice.c: - * sys/vdpau/gstvdp/gstvdpdevice.h: - * sys/vdpau/gstvdp/gstvdpoutputbuffer.c: - * sys/vdpau/gstvdp/gstvdpoutputbuffer.h: - * sys/vdpau/gstvdp/gstvdpoutputbufferpool.c: - * sys/vdpau/gstvdp/gstvdpoutputbufferpool.h: - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.c: - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.h: - * sys/vdpau/gstvdp/gstvdputils.c: - * sys/vdpau/gstvdp/gstvdputils.h: - * sys/vdpau/gstvdp/gstvdpvideobuffer.c: - * sys/vdpau/gstvdp/gstvdpvideobuffer.h: - * sys/vdpau/gstvdp/gstvdpvideobufferpool.c: - * sys/vdpau/gstvdp/gstvdpvideobufferpool.h: - * sys/vdpau/gstvdp/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdp/gstvdpvideosrcpad.h: - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/gstvdpsink.h: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - * sys/vdpau/h264/gsth264dpb.c: - * sys/vdpau/h264/gsth264dpb.h: - * sys/vdpau/h264/gsth264frame.c: - * sys/vdpau/h264/gsth264frame.h: - * sys/vdpau/h264/gsth264parser.c: - * sys/vdpau/h264/gsth264parser.h: - * sys/vdpau/h264/gstnalreader.c: - * sys/vdpau/h264/gstnalreader.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/h264/gstvdph264dec.h: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.h: - * sys/vdpau/mpeg/gstvdpmpegframe.c: - * sys/vdpau/mpeg/gstvdpmpegframe.h: - * sys/vdpau/mpeg/mpegutil.c: - * sys/vdpau/mpeg/mpegutil.h: - * sys/vdpau/mpeg4/gstmpeg4frame.c: - * sys/vdpau/mpeg4/gstmpeg4frame.h: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.c: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.h: - * sys/vdpau/mpeg4/mpeg4util.c: - * sys/vdpau/mpeg4/mpeg4util.h: - * sys/wasapi/gstwasapi.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - * sys/wininet/gstwininetsrc.c: - * sys/wininet/gstwininetsrc.h: - * sys/winks/gstksclock.c: - * sys/winks/gstksclock.h: - * sys/winks/gstksvideodevice.c: - * sys/winks/gstksvideodevice.h: - * sys/winks/gstksvideosrc.c: - * sys/winks/gstksvideosrc.h: - * sys/winks/kshelpers.c: - * sys/winks/kshelpers.h: - * sys/winks/ksvideohelpers.c: - * sys/winks/ksvideohelpers.h: - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstdx9screencapsrc.h: - * sys/winscreencap/gstgdiscreencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.h: - * sys/winscreencap/gstwinscreencap.c: - * sys/winscreencap/gstwinscreencap.h: - * tests/check/elements/asfmux.c: - * tests/check/elements/assrender.c: - * tests/check/elements/autoconvert.c: - * tests/check/elements/autovideoconvert.c: - * tests/check/elements/baseaudiovisualizer.c: - * tests/check/elements/camerabin.c: - * tests/check/elements/dataurisrc.c: - * tests/check/elements/faac.c: - * tests/check/elements/faad.c: - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - * tests/check/elements/h263parse.c: - * tests/check/elements/h264parse.c: - * tests/check/elements/id3mux.c: - * tests/check/elements/jifmux.c: - * tests/check/elements/jpegparse.c: - * tests/check/elements/kate.c: - * tests/check/elements/logoinsert.c: - * tests/check/elements/mpeg2enc.c: - * tests/check/elements/mpeg4videoparse.c: - * tests/check/elements/mpegtsmux.c: - * tests/check/elements/mpegvideoparse.c: - * tests/check/elements/mpg123audiodec.c: - * tests/check/elements/mplex.c: - * tests/check/elements/mxfdemux.c: - * tests/check/elements/mxfmux.c: - * tests/check/elements/neonhttpsrc.c: - * tests/check/elements/ofa.c: - * tests/check/elements/opus.c: - * tests/check/elements/parser.c: - * tests/check/elements/parser.h: - * tests/check/elements/rtpmux.c: - * tests/check/elements/schroenc.c: - * tests/check/elements/timidity.c: - * tests/check/elements/uvch264demux.c: - * tests/check/elements/viewfinderbin.c: - * tests/check/elements/voaacenc.c: - * tests/check/elements/voamrwbenc.c: - * tests/check/elements/zbar.c: - * tests/check/generic/states.c: - * tests/check/libs/h264parser.c: - * tests/check/libs/mpegvideoparser.c: - * tests/check/libs/vc1parser.c: - * tests/check/pipelines/colorspace.c: - * tests/check/pipelines/mimic.c: - * tests/check/pipelines/mxf.c: - * tests/check/pipelines/streamheader.c: - * tests/examples/camerabin2/gst-camera2.c: - * tests/examples/camerabin2/gst-camera2.h: - * tests/examples/camerabin2/gst-camerabin2-test.c: - * tests/examples/gstplay/player.c: - * tests/examples/indexing/indexmpeg.c: - * tests/examples/level/demo.c: - * tests/examples/level/plot.c: - * tests/examples/mxf/mxfdemux-structure.c: - * tests/examples/stats/mp2ogg.c: - * tests/icles/dccp/call/DCCPClient.c: - * tests/icles/dccp/call/DCCPServer.c: - * tests/icles/dccp/file/DCCPClientSaveFile.c: - * tests/icles/dccp/file/DCCPServerSendFile.c: - * tests/icles/dccp/mic/DCCPClientPlayMic.c: - * tests/icles/dccp/mic/DCCPServerMic.c: - * tests/icles/dccp/mp3/DCCPClientPlayMP3.c: - * tests/icles/dccp/mp3/DCCPServerSendMP3.c: - * tests/icles/dccp/mp3Speex/DCCPClientPlaySpeexMP3.c: - * tests/icles/dccp/mp3Speex/DCCPServerSendSpeexMP3.c: - * tests/icles/dccp/mp3Stream/DCCPClientPlayMP3Stream.c: - * tests/icles/dccp/mp3Stream/DCCPServerSendMP3Stream.c: - * tests/icles/metadata_editor.c: - * tests/icles/metadata_editor.h: - * tests/icles/pitch-test.c: - * tools/element-templates/base: - * tools/gst-element-maker: - * tools/gst-project-maker: - Fix FSF address - https://bugzilla.gnome.org/show_bug.cgi?id=687520 - -2012-11-03 13:51:12 +0000 Tim-Philipp Müller <tim@centricular.net> - - * ext/opencv/gstpyramidsegment.h: - opencv: fix warnings and build against opencv 2.4.x - gstpyramidsegment.c: In function 'gst_pyramid_segment_chain': - gstpyramidsegment.c:307:3: error: implicit declaration of function - 'cvPyrSegmentation' -Werror=implicit-function-declaration - gstpyramidsegment.c:307:3: error: nested extern declaration of - 'cvPyrSegmentation' -Werror=nested-externs - https://bugzilla.gnome.org/show_bug.cgi?id=687237 - -2012-11-02 13:44:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/scaletempo/Makefile.am: - scaletempo: Use a better plugin filename - -2012-11-02 11:29:54 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Use more constants instead of hardcoding values - -2012-11-02 11:24:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/opensles/openslesringbuffer.c: - opensles: Fix compilation with debugging enabled - -2012-11-01 20:50:56 +0000 Tim-Philipp Müller <tim@centricular.net> - - * Android.mk: - * Makefile.am: - * configure.ac: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * gst-plugins-bad.spec.in: - * gst/rtpvp8/Makefile.am: - * gst/rtpvp8/dboolhuff.LICENSE: - * gst/rtpvp8/dboolhuff.c: - * gst/rtpvp8/dboolhuff.h: - * gst/rtpvp8/gstrtpvp8.c: - * gst/rtpvp8/gstrtpvp8depay.c: - * gst/rtpvp8/gstrtpvp8depay.h: - * gst/rtpvp8/gstrtpvp8pay.c: - * gst/rtpvp8/gstrtpvp8pay.h: - rtpvp8: remove and move to -good - https://bugzilla.gnome.org/show_bug.cgi?id=687263 - -2012-11-01 15:36:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/opensles/openslesringbuffer.c: - opensles: Remove unused variable - -2012-11-01 15:35:17 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/opensles/opensles.c: - * sys/opensles/opensles.h: - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslessink.c: - opensles: Make sure to only ever create a single engine object - The OpenSL ES spec defines: - An implementation shall enable creation of at least one such object, but - attempting to create more instances (either by a single application or by - several different applications) may fail. - -2012-10-31 20:00:54 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - androidmedia: Skip Aricent codecs for now - The HTC One X claims to have one (but doesn't) and loading - the library for it hangs forever. - -2012-11-01 13:51:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Post stream-status messages for our render thread - -2012-10-31 13:54:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: If pushing an item on the queue fails, free it - Otherwise we're going to leak the item. - -2012-10-31 11:38:32 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: opencv plugin builds with newer versions up to 2.4.2 as well - https://bugzilla.gnome.org/show_bug.cgi?id=687237 - -2012-10-30 19:30:38 +0100 Olivier Crête <olivier.crete@collabora.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: Negotiate format, also support more resolutions - This should enable supprt for old and new iPhones with the same code. - -2012-10-30 09:27:24 +0100 Carlos Rafael Giani <dv@pseudoterminal.org> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: removed unnecessary finalize function - https://bugzilla.gnome.org/show_bug.cgi?id=687176 - -2012-10-30 10:20:09 +1100 Jan Schmidt <thaytan@noraisin.net> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: Fix leaks from not chaining up in the finalize function - -2012-10-22 12:36:28 +1100 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegtsmux/mpegtsmux.c: - tsmux: Slightly reflow collected buffer handler for clarity. - -2012-10-26 18:29:32 +0200 Sebastian Pölsterl <sebp@k-d-w.org> - - * gst/mpegtsdemux/mpegtspacketizer.c: - tsdemux: Fix name of CAT GstStructure - The structure previously was assigned the name "pat". - https://bugzilla.gnome.org/show_bug.cgi?id=686948 - -2012-10-28 16:41:15 +0000 Tim-Philipp Müller <tim@centricular.net> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-accurip.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * gst/accurip/gstaccurip.c: - docs: add new accurip element to docs - https://bugzilla.gnome.org/show_bug.cgi?id=685163 - -2012-10-28 16:36:01 +0000 Christophe Fergeau <teuf@gnome.org> - - * configure.ac: - * gst/accurip/Makefile.am: - * gst/accurip/gstaccurip.c: - * gst/accurip/gstaccurip.h: - accuraterip: new element for AccurateRip calculation - https://bugzilla.gnome.org/show_bug.cgi?id=685163 - -2012-10-26 13:48:06 -0700 Michael Smith <msmith@rdio.com> - - * configure.ac: - * gst/mxf/Makefile.am: - * gst/mxf/mxf.c: - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfalaw.c: - * gst/mxf/mxfd10.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfdv-dif.c: - * gst/mxf/mxfessence.h: - * gst/mxf/mxfjpeg2000.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfmux.c: - * gst/mxf/mxftypes.c: - * gst/mxf/mxfup.c: - * gst/mxf/mxfvc3.c: - mxf: Port mxfdemux to 1.0 Also ports mxfmux to 1.0 to the extent that it compiles, but is 100% untested, so remains disabled. - Conflicts: - gst/mxf/mxfdemux.c - gst/mxf/mxfmux.c - -2012-10-25 19:10:40 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * sys/directsound/Makefile.am: - * sys/directsound/gstdirectsoundsrc.c: - * sys/directsound/gstdirectsoundsrc.h: - directsoundsrc: Fix a number of warnings/errors in directsoundsrc - * Don't use deprecated glib mutex functions - * Don't declare useless variables - * Don't link to non-existing libgstinterfaces - Fixes #686871 - -2012-10-25 17:50:52 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - videoparsers: use parsed or upstream fps to set some baseparse parameters - -2012-10-25 18:02:23 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: extract structure from correct caps - ... which are known != NULL. - -2012-10-25 11:31:41 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpegvideoparse.c: - videoparsers: preserve upstream fps and par - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=660866 - -2012-10-25 14:28:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Stop using deprecated GLib thread API - -2012-10-25 12:06:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Handle GAP events - -2012-10-18 16:23:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * sys/opensles/Makefile.am: - * sys/opensles/opensles.c: - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - * sys/opensles/openslessink.c: - * sys/opensles/openslessink.h: - * sys/opensles/openslessrc.c: - * sys/opensles/openslessrc.h: - opensles: Port to 1.0 - -2012-10-22 11:41:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Add support for crop metadata - -2012-10-22 11:18:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/eglgles/Makefile.am: - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Port to 1.0 - -2012-10-22 13:21:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - androidmedia: Remember and use input state - -2012-10-18 16:41:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * sys/androidmedia/Makefile.am: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcaudiodec.h: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideodec.h: - androidmedia: Port to 1.0 - -2012-10-23 12:10:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/plugin.c: - vc1parse: Give vc1parse a rank of NONE for now - -2012-10-15 09:12:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gstvc1parse.c: - * gst/videoparsers/gstvc1parse.h: - vc1parse: Port to 1.0 - -2012-02-23 13:48:57 +0100 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: disable BDU parsing until it's more mature - Parsing and splitting BDUs seems to trigger a few bugs in - downstream decoders so disable it for now. - -2012-10-14 11:39:55 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst/videoparsers/gstvc1parse.c: - * gst/videoparsers/gstvc1parse.h: - vc1parse: set duration on output buffers - This has the nice side effect of avoiding hanging at EOS with truncated asf - clips. - Conflicts: - gst/videoparsers/gstvc1parse.c - -2012-01-31 11:03:45 +0100 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: workaround for simple/main codec_data being 5 bytes long - Sometimes the codec_data buffer for simple/main pushed by asfdemux is 5 bytes - instead of 4. When that happens, codec_data is still valid but it seems to have - one 0x00 trailing byte. Might be a bug in the demuxer, needs more investigation. - -2012-01-31 11:02:10 +0100 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: remove stub stream conversion code - -2012-01-31 11:00:55 +0100 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst/videoparsers/gstvc1parse.c: - vc1parse: add some more debugging to _renegotiate - -2012-01-31 10:58:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstvc1parse.c: - * gst/videoparsers/gstvc1parse.h: - * gst/videoparsers/plugin.c: - vc1parse: Add VC1 parser plugin - -2012-10-25 12:46:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * win32/common/config.h: - Back to feature development - -=== release 1.0.2 === - -2012-10-25 01:44:35 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.0.2 - -2012-10-24 23:40:20 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * ext/opus/gstopusdec.c: - opusdec: fixed buffer unmapping bug - When the decoder received a NULL buffer, it tried to - unmap a not mapped buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=686829 - -2012-10-24 14:23:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: require wayland >= 1.0.0 - We have an API stable release now, require that. - -2012-10-24 13:41:00 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/mpg123audiodec.c: - * tests/files/Makefile.am: - tests: fix up mpg123 test a little - - dist input files - - fix sample leak - - simplify check for elements - - only run mpg123 test if mpg123 is available and selected - - fix build in uninstalled setup - https://bugzilla.gnome.org/show_bug.cgi?id=686595 - -2012-10-24 12:30:10 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * tests/check/Makefile.am: - * tests/check/elements/mpg123audiodec.c: - * tests/files/cbr_stream.mp3: - * tests/files/stream.mp2: - * tests/files/vbr_stream.mp3: - tets: add unit test for mpg123audiodec - https://bugzilla.gnome.org/show_bug.cgi?id=686595 - -2012-10-24 00:36:42 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/mpg123/gstmpg123audiodec.c: - mpg123: added gtkdoc section - https://bugzilla.gnome.org/show_bug.cgi?id=686595 - -2012-10-24 00:22:05 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: fixed bug with last frame, disabled internal resampler & chatter - * The last MP3 frame wasn't being pushed when base class was draining - * Made sure mpg123 cannot ever use its (crude) internal resampler - * Disabled mpg123 stderr output - https://bugzilla.gnome.org/show_bug.cgi?id=686595 - -2012-10-24 00:21:45 +0200 Carlos Rafael Giani <dv@pseudoterminal.org> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: cleaned up comments, formatting, and logging lines - also replaced mpg123decoder->handle != NULL checks with asserts - https://bugzilla.gnome.org/show_bug.cgi?id=686595 - -2012-10-24 11:34:32 +0200 Sebastian Rasmussen <sebrn@axis.com> - - * ext/curl/gstcurlsmtpsink.c: - curlsmtpsink: add comment describing function - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=686774 - -2010-07-02 15:28:41 +0200 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: check base_time before calculating new_start - https://bugzilla.gnome.org/show_bug.cgi?id=623387 - -2012-10-23 14:33:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/scaletempo/gstscaletempo.c: - scaletempo: Fix event leak - -2012-10-23 14:32:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/scaletempo/gstscaletempo.c: - scaletempo: Fix timestamp tracking - -2012-10-23 14:06:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/scaletempo/gstscaletempo.c: - scaletempo: Implement LATENCY query - -2012-10-23 13:39:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/scaletempo/gstscaletempo.c: - * gst/scaletempo/gstscaletempo.h: - scaletempo: Store instance private data in the instance struct - Getting it over and over again via G_TYPE_INSTANCE_GET_PRIVATE() - is really slow. - -2012-10-23 10:07:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/Makefile.am: - hls: Link to $(LIBM) for isfinite() - -2012-10-22 21:41:20 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/soundtouch/gstpitch.cc: - pitch: fix for start times > 0 - Fixes buffering and playback of streams that start with - a non-0 timestamp in totem (which has a 'pitch' element - before pulsesink). - Example URI: http://lobostv.lobocast.org.es:8004/lobostv.ogg - Still breaks with chained oggs, on second chain. - https://bugzilla.gnome.org/show_bug.cgi?id=686391 - -2012-10-22 12:08:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/opus/gstrtpopuspay.c: - opuspay: remove pointless caps serialization - Remove the caps serialization in the rtp caps. the spec nor the receiver - does anything with it. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=686547 - -2012-10-22 10:45:17 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - * gst/subenc/gstsrtenc.c: - * gst/subenc/gstwebvttenc.c: - subenc: port to 1.0 - -2012-10-22 01:39:13 +1100 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: Don't make the same buffer writable twice. - Fixes Bug 686327 - mpegtsmux: fix refcount issue with input buffers - -2012-10-20 14:55:41 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - wayland: update to wayland-protocol 0.99 - https://bugzilla.gnome.org/show_bug.cgi?id=686520 - -2012-10-18 22:23:07 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: forward non-processed dvd events - ... such as notably dvd-spu-clut-change. - -2012-10-18 22:22:12 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: segment event should be sent before gap event - -2012-10-19 09:59:10 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Don't try to render expose() if no caps are known yet - -2012-10-18 15:12:21 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix expose - -2012-10-19 01:03:51 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/mpegtsdemux/pesparse.c: - tsdemux: fix program packet sequence counter parsing in PES header - -2012-10-19 00:47:45 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/mpegtsdemux/pesparse.c: - tsdemux: fix some inconsequential PES header parsing issues - additional_copy_info: need to get rid of the highest - bit, not the lowest one - program_packet_sequence_counter: also need to get rid - of the highest bit instead of multiplying with a random - value - original_stuff_length: want to AND 0x3f to extract the - lowest 6 bits, not multiply by it. - None of these fields are actually used though, so these - should not have caused any issues. - -2012-10-17 15:54:32 +0300 Raimo Järvi <raimo.jarvi@gmail.com> - - * gst/mpegtsdemux/pesparse.c: - tsdemux: Fix parsing P-STD_buffer in PES header - https://bugzilla.gnome.org/show_bug.cgi?id=686294 - -2012-10-18 18:56:33 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - wayland: don't try to build against 0.99 or later - The plugin needs updating for some API changes since 0.95. - -2012-10-18 01:47:57 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: fix potential crash dereferencing NULL program pointer - https://bugzilla.gnome.org/show_bug.cgi?id=686358 - -2012-10-18 15:06:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - opensles: Only check for the main opensles header - -2012-10-18 14:38:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - eglglessink: Put into the not-ported plugins list - -2012-10-18 14:25:05 +0200 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - eglglessink: Documentation: Hook eglglessink documentation in - -2012-10-18 14:09:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Make compilable on desktop Linux with MESA too - -2012-10-18 14:07:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - * ext/eglgles/Makefile.am: - eglglessink: Integrate into the build system - Conflicts: - ext/Makefile.am - -2012-10-18 10:49:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix debug output - -2012-10-18 10:32:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Also clear the surface once when the buffer content is preserved - -2012-10-18 10:20:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Only draw black borders if the default swap behaviour of the surface is to destroy the buffer - -2012-10-18 09:37:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Remove unused label - -2012-10-18 02:26:17 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Factor display region reset to its own func - -2012-10-18 01:45:51 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Always Reset display_region.* at EGL/GLES ctx wipe - -2012-10-18 01:36:49 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Factor ELG/GLES context cleanup into its own func - -2012-10-18 00:33:26 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Drop drafted fast rendering path logic - -2012-10-17 15:50:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.h: - eglglessink: Also update header file - -2012-10-17 15:37:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Provide the texture positions to the shader on every frame too - -2012-10-17 15:04:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Draw black borders and also use a single GL buffer for all vertices - Fixes weird artifacts outside the video frame on - Qualcomm Snapdragon chipsets and should be faster - than glClear() on the complete area all the time. - -2012-10-17 12:49:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix memory leak - -2012-10-17 10:47:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Remove useless debug output added for debugging earlier - -2012-10-17 10:08:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Make window setting/handling a bit more threadsafe - -2012-10-17 09:59:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Print window handle after setting it - -2012-10-16 17:50:03 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Move DAR query & store to surface init - The DAR (display's pixel aspect ratio) should remain a - constant at runtime so there's no point on repeatedly - query and store this value. Doing it at surface setup - should be enough. As an added bonus this change should - make rendering a bit faster. - -2012-10-16 17:35:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Don't signal the GCond too often - -2012-10-16 17:05:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Add myself as author - -2012-10-16 16:25:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Make sure to always reset the display region in start() - -2012-10-16 16:23:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.h: - eglglessink: Also commit missing changes to the header file - -2012-10-16 16:18:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/Makefile.am: - eglglessink: Also include $(GST_BASE_CFLAGS) - -2012-10-16 16:12:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix race condition - -2012-10-16 15:40:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Refactor rendering and all context specific GL things into a separate thread - Also fixes some threading related problems. - -2012-10-16 14:39:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Re-add accidentially reverted commit - -2012-10-16 14:15:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Remove unneeded flow_lock - Use the object lock in the few places necessary, everything - else is protected by other things already. - Also store the context directly inside the instance struct - instead of allocating some memory for it. - -2012-10-16 11:53:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix debug output and constant names - -2012-10-16 11:51:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: start()/stop() is called in READY<->NULL in basesink - But this should be called in PAUSED<->READY. - -2012-10-15 13:44:29 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix for outbound DAR reported by EGL - Some EGL implementations don't honor the spec - requirement of returning DAR values as w/h * - EGL_DISPLAY_SCALING. - This changeset: - - Fixes rendering on the Samsung Galaxy III - - Fixes wrong check on required 1.2 EGL version - - Reorders the code a bit. - -2012-10-15 13:38:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix crashes if there are no EGL or GLES extensions - -2012-10-10 12:42:47 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.h: - eglglessink: Fix crash at element instantiation - -2012-10-10 12:26:04 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: GLSL: Save one extra texture lookup - -2012-10-10 12:22:24 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: GLSL: Minor named index access tweak xyz -> rgb - -2012-10-10 12:18:27 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: GLSL: Assorted fixes to optimized code - - Don't copy over opos as it's already a vec2 - - Fix index order access at frag_YUY2_YVYU_UYVY_prog - -2012-10-10 11:50:28 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: GLSL: Planar YUV converters optimization - - Use consts for the transform's offset and cofficients values - - Use dot product instead of mult and add - - Avoid unneeded texture lookups - -2012-10-10 11:05:04 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - Geglglessink: LSL: Optimize frag_YUY2_YVYU_UYVY_prog - - Avoid repeatedly performing the texture lookup - - Use consts for the transform's offset and cofficients values - - Use the dot product instead of the explicit mult and add - -2012-10-10 03:02:21 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: GLSL: Drop unneded nxy vec2 - -2012-10-10 02:16:35 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix missing double quotation mark in GLSL code - -2012-10-10 02:04:18 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: GLSL: Optimize frag_AYUV_prog - - Avoid repeatedly performing the texture lookup - - Use consts for the transform's offset and cofficients values - - Use the dot product instead of the explicit mult and add - -2012-10-09 23:35:22 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.h: - eglglessink: Documentation: GstEglGlesSink struct - -2012-10-09 23:04:05 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.h: - eglglessink: Documentation: GstEglGlesBuffer struct (DRAFT) - -2012-10-09 22:54:48 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.h: - eglglessink: Documentation: GstEglGlesImageFmt struct - -2012-10-09 22:40:19 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.h: - eglglessink: Documentation: GstEglGlesRenderContext struct - -2012-10-09 17:00:52 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Assorted doc and reordering fixes - -2012-10-09 16:25:46 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Documentation: Element properties - Brief explanatory comments plus some reordering - to group default setting of properties and runtime - flags values. - -2012-10-09 17:20:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add support for YVYU - -2012-10-09 11:48:09 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Documentation: GLSL Shaders - Brief explanatory comments plus some rerdering - to group packed/planar converters. - -2012-10-09 11:00:24 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Documentation: Element overview - -2012-10-08 12:10:25 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Refactor REORDER shader. - Avoid unneededly calling texture2D() 3 consecutive times. - -2012-10-04 15:47:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix handling of caps changes by only releasing what needs to be released - And not terminating the display connection - -2012-10-04 02:15:24 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Move display_region reset to locked section - -2012-10-04 01:56:10 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Reset display_region dims at caps renego - -2012-10-04 01:33:31 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Cosmetics - -2012-10-04 01:29:40 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Don't access local value from struct - -2012-10-03 23:41:52 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Terminate display connection at caps renego - -2012-10-02 17:56:14 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Cosmetics - -2012-10-03 12:32:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Only attach the context once to the streaming thread - -2012-10-03 10:53:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Make the context current for the thread and unbind it again around every use - This fixes some crashes and leaking of our context into other - OpenGL code on the same thread. - -2012-10-02 17:29:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Improve cleanup - -2012-10-02 15:46:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Remove unused label - -2012-10-02 15:42:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Allow setting a NULL handle - -2012-10-02 09:48:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Revert "Do not update_surface_dims() once per frame" - This reverts commit 82103376ede2bc7c63dd699f5982168660f67852. - We have to update the surface dimensions on every frame to - make sure that we get notified about updates. This happens - for example if the Android window gets re-layouted because - a widget takes more space than before. - -2012-10-02 01:43:35 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Do not update_surface_dims() once per frame - And.. Upgrade debug message to warging on weird DAR. - Correct fix to avoid spaming with this message - once per each frame is avoid calling update_surface_dims() - at render_and_display(). This is handled at egl surface - init. - -2012-10-01 16:36:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: And downgrade another warning too - -2012-10-01 16:14:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Downgrade GST_WARNING to GST_DEBUG - -2012-10-01 09:44:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add some {} to if statements make them work as expected - -2012-09-30 23:07:48 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Drop stale defines for max frame size - -2012-09-30 23:06:19 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Small commentary fixes here an there - -2012-09-28 11:48:23 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Avoid setting height or width twice - -2012-09-27 01:18:37 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Use PAR/DAR to set viewport - -2012-09-27 14:28:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Correctly resize if the surface dimensions change - -2012-09-27 14:08:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Update surface dimensions on every buffer - -2012-09-27 14:02:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: More consistent naming of shader related variables - -2012-09-27 13:57:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Some variable name cleanup - -2012-09-27 13:53:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Remove default-width/height properties - These are completely unneeded - -2012-09-25 13:32:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix double free() - -2012-09-25 09:06:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Don't leak EGL/ES render context - -2012-09-25 01:39:21 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Put EGL/GLES context vars on their own struct - -2012-09-24 11:19:32 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/TODO: - eglglessink: Small TODO reformatting - -2012-09-24 10:23:28 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/TODO: - eglglessink: Add TODO file - -2012-09-24 14:43:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Correctly implement ::expose() - We don't need the past buffer for this, the old one is still available - as texture and we just need to draw our rectangle again. - -2012-09-24 13:48:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Allow setting another window for the next time we reconfigure everything - -2012-09-24 12:36:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Also unref current caps after usage - -2012-09-24 12:32:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Implement support for caps changes - -2012-09-24 12:27:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: More cleanup and making the element reusable - -2012-09-24 12:05:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Properly init/release resources when going from NULL->READY and the other way around - -2012-09-24 11:48:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Generate the sink caps exactly once - -2012-09-24 11:17:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix code style a bit to stop confusing indent - -2012-09-24 11:15:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix support for YUY2 and UYVY - -2012-09-24 11:01:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Some property cleanup - -2012-09-24 10:45:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add support for the remaining RGB formats - -2012-09-24 10:23:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add support for Y444, Y42B and Y41B, just because it's so easy - -2012-09-24 10:02:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add some simple TODOs - -2012-09-24 01:08:22 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Lock while altering display region coords - -2012-09-24 00:27:23 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix _get_compat_format_from_caps() logic - It's a getter so it shouldn't messing with the sink context. - Adding insult to injury it was setting selected_fmt without - locking. - The associated changes to the buffer functions are merely - make-it build fixes. Those functions are barely drafted - and in WIP state. - -2012-09-23 23:07:29 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Drop unneded initial set to NULL - -2012-09-23 22:33:58 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Minor formatting and comment fixes - -2012-09-21 12:12:24 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Clean-up gl/egl allocations at _stop() - Also, conditionaly destroy window if the sink created its own. - -2012-09-21 17:08:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add support for NV12 and NV21 - Also YUY2 and UYVY but this is disabled for now as it - doesn't work completely yet. Something is wrong with - the chroma. - -2012-09-21 15:44:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Add support for I420 and YV12 color formats - -2012-09-21 14:05:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Preparations for supporting multiple textures for more YUV formats - -2012-09-21 13:42:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Use the attrib locations as really used inside the shader - -2012-09-21 12:53:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Really decouple vertex and texture positions in the shader - -2012-09-21 12:45:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Decouple texture and vertex positions - -2012-09-21 12:14:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Reorder vertex value order to make a bit more sense - -2012-09-21 01:09:11 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Handle frame scaling to fill surface - -2012-09-21 00:09:06 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Draft set_render_rectangle() from the xOverlay interface - -2012-09-20 22:50:31 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Remove stale comment - -2012-09-20 22:41:10 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Move VBO setup to setcaps - -2012-09-20 22:11:08 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Don't do context ops at render - We don't need to repeatedly call - eglMakeCurrent() while using the - same context anyway. - -2012-09-20 22:01:20 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Don't clear surface color at render - -2012-09-20 17:22:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Rename shader variables to make more sense - -2012-09-20 17:14:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add support for AYUV - -2012-09-20 17:02:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Reorder caps a bit to make more sense - -2012-09-20 16:50:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Set rank to PRIMARY - -2012-09-20 16:25:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add support for RGBA - -2012-09-20 16:21:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Correctly generated caps for the supported formats - -2012-09-20 16:08:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add ::get_caps() vfunc that returns the actually supported caps - -2012-09-20 15:56:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Also require a configuration with EGL_SURFACE_TYPE containing EGL_WINDOW_BIT - -2012-09-20 14:50:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix compiler warnings - -2012-09-19 19:26:54 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Clear surface to black by default - -2012-09-19 19:23:50 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Make sure we get a config we can use with GLES2 - -2012-09-19 19:12:30 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: set_window_handle() has been tested to work now - -2012-09-19 12:29:13 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Avoid autoscaling by default - -2012-09-18 14:58:43 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Avoid repeatedly setting 2D resizing params - Moved to initial texture setup so it hapens - just once while on the same context. - -2012-09-18 12:04:20 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Avoid initializing EGL at _set_window_handle() - _start() should take care of that. - This change asumes _setcaps() will - happen always after _start() is - done. - -2012-09-18 10:43:38 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Don't ask for a window if we already have one - -2012-09-18 10:31:26 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Fix EGL attribs var naming - -2012-09-18 02:32:25 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix slow path rendering on Android - Specify missing and mandatory params for npot - Before calling glTexImage2D. - In particular, _WRAP_T and _WRAP_S need to be - set to GL_CLAMP_TO_EDGE to avoid all-black - rendering with npot sized frames. - -2012-09-18 00:51:36 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add test on usable eglconfigs returned - -2012-09-17 23:05:29 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Drop stale error_locked label - -2012-09-17 23:04:05 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Cleanup stale code comments - -2012-09-17 18:00:16 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: GlViewPort() should use actual surface size - -2012-09-17 17:21:26 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Avoid reiniting EGL after the first time - -2012-09-17 13:44:09 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Use correct template caps - -2012-09-17 12:54:05 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix missing texture setup bits - -2012-09-17 11:57:24 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add error checking on eglSwapBuffers - -2012-09-17 11:40:49 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix stale&wrong 0.5 alpha blend - -2012-09-17 10:56:14 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add float precision specifier to fragment shader - This is required by GLES and fixes compilation of fragment - shader prog. - -2012-09-17 10:47:39 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add log reporting at shader compilation failure - -2012-09-16 22:43:38 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Add some missing checks on shader ops - - Check whether there is shader compiler support - and bail out otherwise. - - Add checks on compile and linking ops - -2012-09-14 20:49:48 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Fix setup chain logic - Mostly a procedural reordering. Idea is to avoid - trying to setup a surface without a display.This - change relies on the asumption that: - 1.- set_window_handle() can happen at any time - 2.- setcaps will never get called before _start() - is done. - If both conditions are meet the new procedure - should work as expected. - -2012-09-14 15:59:05 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: WIP: Reorder locking - -2012-09-13 23:23:08 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix xOverlay logic - Several fixes dealing with correct window - creation and set_handle() ops. Tested on - X11/mesa with internal window creation. - -2012-09-13 00:55:33 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Actually test EGL configs before claiming support - -2012-09-13 00:11:49 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Caps nego EGL fixes - - Fix alloc lol on format list: Asked for 2 slices and used 3. - - Reordered display & context init logic to prepare for actual - config checking before claiming support for a given format. - Change deals basically with setting up EGL display at start() - and choose an EGL config only at setcaps time. - -2012-09-12 22:11:39 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Caps nego. Start extending RGB support to a set. - -2012-09-12 16:19:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/eglgles/Makefile.am: - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix build of static plugin - -2012-09-12 09:28:22 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Drop wrong format test on _setcaps (draft leftover) - -2012-09-11 13:54:09 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Support RGB24 by default - -2012-09-11 13:51:25 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Instrument EGL error reporting - -2012-09-11 12:04:30 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Correctly return GstFlowReturn from render_and_display() - -2012-09-11 11:51:28 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Move VBO setup to it's own function - -2012-09-11 10:20:16 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix render_and_display logic - Switch procedure according to enabled rendering path - -2012-09-10 22:59:57 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - eglglessink: Fix sample launch line with disabled window creation - -2012-09-10 22:41:52 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Rename stale android leftover - -2012-09-10 20:22:22 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/Makefile.am: - * ext/eglgles/gsteglglessink.c: - * ext/eglgles/gsteglglessink.h: - eglglessink: Move eglgles Sink to ext/ #2 - -2012-09-10 20:00:57 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * ext/eglgles/Android.mk: - * ext/eglgles/Makefile.am: - * ext/eglgles/gstvidroidsink.c: - * ext/eglgles/gstvidroidsink.h: - * ext/eglgles/video_platform_wrapper.c: - * ext/eglgles/video_platform_wrapper.h: - eglglessink: Move eglgles Sink to ext/ - -2012-10-18 14:03:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - opensles: Add the opensles plugin to the list of not ported plugins - -2012-10-18 13:56:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * sys/Makefile.am: - * sys/opensles/Makefile.am: - opensles: Integrate into build system - -2012-10-12 10:08:59 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - openslessink: Return 0 delay if the player object is in PAUSED state - -2012-10-01 12:54:15 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - opensles: fixes noise on seekeing - -2012-10-01 11:46:50 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - opensles: chain up on _clear_all - -2012-10-01 11:14:24 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - opensles: implement the ringbuffer clear_all vmethod too - -2012-10-01 10:59:08 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslessrc.c: - opensles: initial attempt to reduce the src latency - -2012-09-29 19:00:13 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - * sys/opensles/openslessink.c: - * sys/opensles/openslessrc.c: - opensles: sprinkle comments and cosmetic fixes - -2012-09-28 15:10:19 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - opensles: check for device outputs in the mixer - -2012-09-28 14:39:01 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslessink.c: - opensles: drop 48kHz sample rate - OpenSL ES implementation in Android is just a 'facade' API on top of - AudioFlinger which will downsample 48kHz into 44.1kHz before - delivering the audio to the underlaying hardware. - We found that it suffer some sort of underrun when the downsample - enters in action so relay on our good resampler to take care of that - and fix the clicks issue. And get an extra bonus of a lower latency. - -2012-09-27 19:24:50 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslessink.c: - opensles: change the defaults to use 20 ms ringbuffer segments - In my nexus7 seems that the internal min buffer size is 20 ms so make - our segments match. - -2012-09-27 18:33:09 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - opensles: ensure that we register the callback only in STOPPED - Fixes the error registering the callback on the PLAYING -> PAUSE -> - PLAYING state change sequence. - -2012-09-27 17:46:27 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - opensles: cap queue size - Just in case we want to tweak the sink behaviour with buffer-time and - latency-time properties cap the queue size to something reasonable. - -2012-09-27 17:32:14 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslessink.c: - opensles: sink to provide the audioclock by default - -2012-09-27 17:27:24 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - opensles: only drain half ringbuffer on start - At start drain half ringbuffer into the OpenSL so the writting/reading - pointers will start at half ringbuffer distance. - -2012-09-27 14:52:59 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - opensles: monitor some player events - -2012-09-27 07:22:47 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - opensles: rework around the _delay function - -2012-09-27 05:40:46 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - opensles: implement _delay function - -2012-09-27 04:00:28 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - opensles: refactor to behave more like other sinks - Reflect the queue in our own data buffer. - Drop the _commit hook that wasn't usefull. - Don't mess with the segsize/segtotal. - -2012-09-26 14:01:17 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - opensles: read player position and show it in the log - -2012-09-26 12:50:42 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslessink.c: - opensles: do not provide a clock in the sink element. - -2012-09-26 12:32:44 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - opensles: rework on start/stop operations and callback function handling - -2012-09-26 12:09:04 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslessink.c: - opensles: fixes 8 bit format which is unsigned on android. - -2012-09-25 19:25:01 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - opensles: attempt to reduce playback latency - -2012-09-25 18:04:27 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - opensles: drop _buffer_clear calls and refactor to a shared _enqueue_cb - -2012-09-21 17:04:14 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - opensles: use 0.25s segments in the sink to lower latency - -2012-09-21 16:11:42 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslessrc.c: - opensles: finish remaining bits for source element. - -2012-09-21 14:15:12 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslessink.c: - opensles: attempt to query device for capabilities - -2012-09-20 18:41:50 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - * sys/opensles/openslessink.c: - * sys/opensles/openslessink.h: - * sys/opensles/openslessrc.c: - opensles: add the mute property and handle volume/mute changes on the fly - -2012-09-20 18:04:29 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - * sys/opensles/openslessink.c: - * sys/opensles/openslessink.h: - opensles: make the volume property actually work - -2012-09-20 14:16:25 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - opensles: rework on the ringbufffer to properly clear segments - Make the segments bigger (1 second) as it seems to be the minimum size - we need to not introduce noise. - Sink works in my nexus 7 with rates from 8000 to 44100 and some noise - can be noticed on higger sample rates. - -2012-09-20 11:50:50 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/opensles.c: - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - * sys/opensles/openslessink.c: - * sys/opensles/openslessink.h: - * sys/opensles/openslessrc.c: - * sys/opensles/openslessrc.h: - opensles: fixes the license headers - -2012-09-20 10:41:50 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/openslesringbuffer.c: - opensles: produces expected output until ringbuffer wraps - Add some log messages. - Fixed a bit the _player_cb function and properly advance reding in the - ringbuffer. - Still produces noise when the ringbuffer wraps. - -2012-09-19 18:11:54 +0200 Josep Torra <n770galaxy@gmail.com> - - * sys/opensles/Makefile.am: - * sys/opensles/opensles.c: - * sys/opensles/openslesringbuffer.c: - * sys/opensles/openslesringbuffer.h: - * sys/opensles/openslessink.c: - * sys/opensles/openslessink.h: - * sys/opensles/openslessrc.c: - * sys/opensles/openslessrc.h: - opensles: Add initial draft implementation of OpenSL ES plugin. - Initial draft implementation for a OpenSL ES based plugin for Android - that provides audio src and sink. - -2012-10-18 09:24:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/Makefile.am: - androidmedia: Use correct variable name in Makefile.am - -2012-10-17 22:54:28 +0300 Raimo Järvi <raimo.jarvi@gmail.com> - - * sys/directsound/gstdirectsoundsrc.c: - directsoundsrc: Fix compiler warning - https://bugzilla.gnome.org/show_bug.cgi?id=673414 - -2012-10-17 17:34:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/apexsink/gstapexsink.c: - * ext/assrender/gstassrender.c: - * ext/audiofile/gstafparse.c: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsrc.c: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2enc.c: - * ext/cdaudio/gstcdaudio.c: - * ext/celt/gstceltdec.c: - * ext/celt/gstceltenc.c: - * ext/chromaprint/gstchromaprint.c: - * ext/cog/gstcogdownsample.c: - * ext/cog/gstcogmse.c: - * ext/cog/gstcogscale.c: - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlfilesink.c: - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlhttpsink.c: - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/gstcurltlssink.c: - * ext/dc1394/gstdc1394.c: - * ext/dirac/gstdiracdec.cc: - * ext/dirac/gstdiracenc.cc: - * ext/directfb/dfbvideosink.c: - * ext/dts/gstdtsdec.c: - * ext/faac/gstfaac.c: - * ext/faad/gstfaad.c: - * ext/flite/gstflitetestsrc.c: - * ext/gme/gstgme.c: - * ext/gsettings/gstgsettingsaudiosink.c: - * ext/gsettings/gstgsettingsaudiosrc.c: - * ext/gsettings/gstgsettingsvideosink.c: - * ext/gsettings/gstgsettingsvideosrc.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmenc.c: - * ext/jasper/gstjasperdec.c: - * ext/jasper/gstjasperenc.c: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkatetiger.c: - * ext/libfame/gstlibfame.c: - * ext/libmms/gstmms.c: - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - * ext/modplug/gstmodplug.cc: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mplex/gstmplex.cc: - * ext/musepack/gstmusepackdec.c: - * ext/musicbrainz/gsttrm.c: - * ext/mythtv/gstmythtvsrc.c: - * ext/nas/nassink.c: - * ext/neon/gstneonhttpsrc.c: - * ext/ofa/gstofa.c: - * ext/openal/gstopenalsink.c: - * ext/openal/gstopenalsrc.c: - * ext/opencv/gstcvdilate.c: - * ext/opencv/gstcvequalizehist.c: - * ext/opencv/gstcverode.c: - * ext/opencv/gstcvlaplace.c: - * ext/opencv/gstcvsmooth.c: - * ext/opencv/gstcvsobel.c: - * ext/opencv/gstedgedetect.c: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstmotioncells.c: - * ext/opencv/gstpyramidsegment.c: - * ext/opencv/gsttemplatematch.c: - * ext/opencv/gsttextoverlay.c: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusparse.c: - * ext/opus/gstrtpopusdepay.c: - * ext/opus/gstrtpopuspay.c: - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/rsndec.c: - * ext/resindvd/rsnparsetter.c: - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgoverlay.c: - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsrc.c: - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/sdl/sdlaudiosink.c: - * ext/sdl/sdlvideosink.c: - * ext/snapshot/gstsnapshot.c: - * ext/sndfile/gstsfsink.c: - * ext/sndfile/gstsfsrc.c: - * ext/sndio/sndiosink.c: - * ext/sndio/sndiosrc.c: - * ext/soundtouch/gstbpmdetect.cc: - * ext/soundtouch/gstpitch.cc: - * ext/spandsp/gstspanplc.c: - * ext/spc/gstspc.c: - * ext/swfdec/gstswfdec.c: - * ext/teletextdec/gstteletextdec.c: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * ext/voaacenc/gstvoaacenc.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/wayland/gstwaylandsink.c: - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxvidenc.c: - * ext/zbar/gstzbar.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst/adpcmdec/adpcmdec.c: - * gst/adpcmenc/adpcmenc.c: - * gst/aiff/aiffmux.c: - * gst/aiff/aiffparse.c: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfparse.c: - * gst/asfmux/gstrtpasfpay.c: - * gst/audiobuffer/gstaudioringbuffer.c: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstwavescope.c: - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautovideoconvert.c: - * gst/bayer/gstbayer2rgb.c: - * gst/bayer/gstrgb2bayer.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/cdxaparse/gstcdxaparse.c: - * gst/cdxaparse/gstvcdparse.c: - * gst/coloreffects/gstchromahold.c: - * gst/coloreffects/gstcoloreffects.c: - * gst/dataurisrc/gstdataurisrc.c: - * gst/dccp/gstdccpclientsink.c: - * gst/dccp/gstdccpclientsrc.c: - * gst/dccp/gstdccpserversink.c: - * gst/dccp/gstdccpserversrc.c: - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/gstchecksumsink.c: - * gst/debugutils/gstchopmydata.c: - * gst/debugutils/gstcompare.c: - * gst/debugutils/gstdebugspy.c: - * gst/dtmf/gstdtmfdetect.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/faceoverlay/gstfaceoverlay.c: - * gst/festival/gstfestival.c: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/freeverb/gstfreeverb.c: - * gst/games/gstpuzzle.c: - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstsolarize.c: - * gst/geometrictransform/gstbulge.c: - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstdiffuse.c: - * gst/geometrictransform/gstfisheye.c: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstmarble.c: - * gst/geometrictransform/gstmirror.c: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstrotate.c: - * gst/geometrictransform/gstsphere.c: - * gst/geometrictransform/gstsquare.c: - * gst/geometrictransform/gststretch.c: - * gst/geometrictransform/gsttunnel.c: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gstwaterripple.c: - * gst/hdvparse/gsthdvparse.c: - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlssink.c: - * gst/id3tag/gstid3mux.c: - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosrc.c: - * gst/interlace/gstinterlace.c: - * gst/ivfparse/gstivfparse.c: - * gst/jp2kdecimator/gstjp2kdecimator.c: - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - * gst/librfb/gstrfbsrc.c: - * gst/liveadder/liveadder.c: - * gst/mixmatrix/mixmatrix.c: - * gst/mpeg1sys/gstmpeg1systemencode.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mve/gstmvedemux.c: - * gst/mve/gstmvemux.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmux.c: - * gst/nsf/gstnsf.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/overlay/gstoverlay.c: - * gst/patchdetect/gstpatchdetect.c: - * gst/pcapparse/gstirtspparse.c: - * gst/pcapparse/gstpcapparse.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - * gst/rawparse/gstaudioparse.c: - * gst/rawparse/gstvideoparse.c: - * gst/real/gstrealaudiodec.c: - * gst/real/gstrealvideodec.c: - * gst/removesilence/gstremovesilence.c: - * gst/rtjpeg/gstrtjpegdec.c: - * gst/rtjpeg/gstrtjpegenc.c: - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - * gst/rtpvp8/gstrtpvp8depay.c: - * gst/rtpvp8/gstrtpvp8pay.c: - * gst/scaletempo/gstscaletempo.c: - * gst/sdi/gstsdidemux.c: - * gst/sdi/gstsdimux.c: - * gst/sdp/gstsdpdemux.c: - * gst/segmentclip/gstaudiosegmentclip.c: - * gst/segmentclip/gstvideosegmentclip.c: - * gst/siren/gstsirendec.c: - * gst/siren/gstsirenenc.c: - * gst/smooth/gstsmooth.c: - * gst/speed/gstspeed.c: - * gst/stereo/gststereo.c: - * gst/subenc/gstsrtenc.c: - * gst/subenc/gstwebvttenc.c: - * gst/tta/gstttadec.c: - * gst/tta/gstttaparse.c: - * gst/vbidec/gstvbidec.c: - * gst/videofilters/gstscenechange.c: - * gst/videofilters/gstzebrastripe.c: - * gst/videomeasure/gstvideomeasure_collector.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videosignal/gstvideoanalyse.c: - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideomark.c: - * gst/vmnc/vmncdec.c: - * gst/y4m/gsty4mdec.c: - * sys/acmenc/acmenc.c: - * sys/acmmp3dec/acmmp3dec.c: - * sys/avc/gstavcsrc.cpp: - * sys/cdrom/gstcdplayer.c: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - * sys/directdraw/gstdirectdrawsink.c: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dxr3/dxr3audiosink.c: - * sys/dxr3/dxr3spusink.c: - * sys/dxr3/dxr3videosink.c: - * sys/fbdev/gstfbdevsink.c: - * sys/linsys/gstlinsyssdisink.c: - * sys/linsys/gstlinsyssdisrc.c: - * sys/osxvideo/osxvideosrc.c: - * sys/pvr2d/gstpvrvideosink.c: - * sys/qcam/gstqcamsrc.c: - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsrc.c: - * sys/uvch264/gstuvch264_mjpgdemux.c: - * sys/uvch264/gstuvch264_src.c: - * sys/vcd/vcdsrc.c: - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wininet/gstwininetsrc.c: - * sys/winks/gstksvideosrc.c: - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.c: - * tests/check/elements/baseaudiovisualizer.c: - * tests/check/elements/camerabin.c: - * tools/gst-element-maker: - Use gst_element_class_set_static_metadata() - where possible. Avoids some string copies. Also re-indent - some stuff. Also some indent fixes here and there. - -2012-04-03 12:09:19 +0300 Raimo Järvi <raimo.jarvi@gmail.com> - - * configure.ac: - * sys/directsound/gstdirectsoundsrc.c: - directsoundsrc: port to 1.0 - https://bugzilla.gnome.org/show_bug.cgi?id=673414 - -2012-10-16 11:38:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Fix unitialized variable compiler warning - -2012-10-16 11:34:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - Revert "configure: fix build" - This reverts commit 5c1c35290d7f72a4bc016e8aef276d8c1bdcf37b. - -2012-10-16 11:31:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/Makefile.am: - androidmedia: Add missing file - -2012-10-16 11:32:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - configure: fix build - -2012-10-15 16:35:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - androidmedia: Rename plugin - -2012-10-15 16:29:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - androidmedia: Add to the not yet ported plugins - -2012-10-15 16:05:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * sys/androidmedia/gstamcvideodec.h: - androidmedia: Make everything buildable - -2012-10-15 14:36:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Don't try to use the NVidia DRM codecs - -2012-10-09 10:56:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - Try to handle format changes more gracefully - And make stop() faster and more robust - -2012-10-09 10:27:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcaudiodec.h: - Add workaround for Google MP3 decoder outputting garbage in first output buffer - And assume one decoded input frame per output buffer to fix timestamp - handling by the base class. - -2012-10-09 10:14:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Also add some more output format checks to the audio decoder - -2012-10-09 10:13:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Check output format metadata some more - And implement workaround for NVidia Tegra 3 not setting the slice_height. - Thanks to Josep Torra for debugging this issue. - -2012-10-05 15:09:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Add some more default channel layouts, these should be good for AAC at least - -2012-10-05 14:56:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Don't set timestamps, the baseclass handles this for us anyway - -2012-10-03 10:06:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - List profiles in reverse to minimize caps - -2012-10-03 09:56:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Iterate levels in reverse order to minimize caps - -2012-10-03 09:51:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - Merge structures into caps instead of appending them - -2012-09-25 10:32:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - Use orc_memcpy() instead of memcpy() as it should be faster for larger memory areas - -2012-09-24 15:32:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Add support for audio/mpeg-L2 for the Nexus 7 - -2012-09-24 15:14:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Add support for MPEG1/2 video - -2012-09-19 14:52:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Ignore the *law and Vorbis decoders - They are broken unfortunately. - -2012-09-19 11:20:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Add FIXME comment for not handling odd widths/height with the TI hardware decoders - Must likely an issue with the codec itself though. - -2012-09-19 09:47:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Fix handling of I420 buffers with odd width - -2012-09-18 15:38:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Only mpegversion=4 is supported for AAC - -2012-09-18 15:28:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - Remove some obsolete FIXMEs - -2012-09-17 13:46:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - Fix flushing logic to unbreak handling of flushing seeks - -2012-09-17 12:24:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Fix chroma stride for I420 stride/crop conversion - -2012-09-17 11:28:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Fix Vorbis decoding - -2012-09-14 16:17:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - Wait at most 100ms for dequeueing a buffer, and retry after that - Some codecs don't fail the dequeueing if the codec is flushed, - causing deadlocks when shutting down the element. - -2012-09-14 16:11:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - Release output buffers a bit earlier - -2012-09-14 16:11:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Keep another reference of the input buffer in handle_frame() - It might be unreffed in the meantime by the other thread due - to finish_frame(). - -2012-09-14 16:10:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Pass -1 as number of frames to the base class - This will automatically do the right thing if timestamps are good enough - -2012-09-14 16:09:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Use correct buffer variable - -2012-09-14 14:43:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcvideodec.c: - Always pass 1 as number of frames to finish_frame() - -2012-09-14 14:42:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Correctly remember number of channels and samplerate - -2012-09-14 14:42:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Don't unref input buffer from handle_frame(), it's owned by the baseclass - -2012-09-14 13:31:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Remove invalid GST_ERROR() call - -2012-09-14 13:27:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Only try to get the channel-mask if it is set - -2012-09-14 13:25:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Add support for FLAC - -2012-09-14 13:24:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Fix src template caps - -2012-09-14 13:16:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcaudiodec.c: - Fix plugin initialization - -2012-09-14 13:05:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc-constants.h: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - * sys/androidmedia/gstamcaudiodec.c: - * sys/androidmedia/gstamcaudiodec.h: - Add support for audio decoders, completely untested so far - -2012-09-14 12:07:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Only set the SYNC_FRAME flag on the first buffer if we need to split the input - -2012-09-12 14:30:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc-constants.h: - * sys/androidmedia/gstamc.c: - Ignore codecs with unknown color formats for stability purposes - They can be registered nonetheless if an environment variable - or compile-time #define is set. - -2012-09-12 13:48:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Implement cropping and correctly handle the different color formats - -2012-09-11 16:30:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Really implement stride conversion for NV12 too - -2012-09-11 16:24:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Implement stride-conversion for I420 and NV12 - -2012-09-11 15:56:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Fix typo in previous commit - -2012-09-11 15:49:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Don't allow using non-Google codecs if we started the Java VM ourselves - Hardware codecs, e.g. the TI ones, only work in processes that had their - Java VM started via the non-public AndroidRuntime class. - -2012-09-11 14:30:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Rename to amc from androidmediacodec everywhere - -2012-09-11 13:08:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Improve debug output - -2012-09-11 12:39:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - * sys/androidmedia/gstamcvideodec.c: - Print the MediaFormats we get in the debug logs - -2012-09-10 15:31:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Improve debug output - -2012-09-10 15:30:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - * sys/androidmedia/gstamcvideodec.c: - Improve level/profile handling - -2012-09-10 13:39:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Allow registering as static plugin with the GStreamer SDK API - -2012-09-10 13:30:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - If the buffer sizes are the same, just memcpy() to the output buffers - -2012-09-10 12:56:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Correctly convert timestamps between us and ns - -2012-09-07 16:11:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Set SYNC_FRAME flag on buffers if required - -2012-09-07 14:22:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Improve flushing - -2012-09-07 13:44:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Wait at most 0.5 seconds for getting an input buffer for EOS - -2012-09-07 13:42:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Correctly check for flushing - -2012-09-06 17:24:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Retry for negative return values when dequeueing buffers - -2012-09-06 17:07:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Fix refcount bug - -2012-09-06 17:07:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - The MediaCodec API is apparently not threadsafe between stop() and release() - So we don't call release() and just hope for the GC to release the - codec in time. - -2012-09-06 15:44:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Fix plugin cache creation - -2012-08-24 04:35:44 -0700 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Cache the codec informations inside the registry - Otherwise we would always load all codecs during plugin initialization - which can take quite some time (because of hardware) and also loads - lots of shared libraries (which number is limited by 64 in Android). - -2012-08-24 09:20:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Properly attach and detach the current threads to the Java VM - Attaching a thread after it was detached will cause segfaults, - as such we use a pthread_key_t to keep track of the JNIEnv* of - the attached threads and in the destructor (i.e. when the - thread exits) we detach the thread. - -2012-08-23 17:31:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Don't get the output format from the codec before it is ready - Apparently things are crashing otherwise. - -2012-08-23 17:31:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Get the input buffers from the codec - -2012-08-23 17:30:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Fix JNI method call signatures - -2012-08-23 17:30:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Initialize the VM will full debugging for now - -2012-08-23 13:53:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Use NewStringUTF() instead of our own method for that - -2012-08-23 12:30:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Add the TI format to the mapping table too - -2012-08-23 12:29:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc-constants.h: - * sys/androidmedia/gstamc.c: - Add another TI specific OpenMAX color format - -2012-08-22 19:30:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcvideodec.c: - Fixes to element/elementfactory creation - -2012-08-22 19:12:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Some bugfixes to the codec scanning code - Also it's not possible to attach a thread after it was - detached once. As such we simply never detach any thread - at all now. - -2012-08-22 18:35:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - Fix some compilation errors - -2012-08-20 14:13:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamcvideodec.c: - Add important FIXME - -2012-08-20 13:45:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamcvideodec.c: - * sys/androidmedia/gstamcvideodec.h: - Add video decoder element - -2012-08-20 13:45:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - Add some more JNI wrapping - -2012-08-20 13:42:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc-constants.h: - Add some missing color format constants - -2012-08-16 15:18:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc-constants.h: - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - Implement basic wrapper around MediaCodec API - Ideally nothing else will be needed from the elements later. - -2012-08-15 18:23:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - Some more WIP - Scanning all codecs now and have data structures for holding codec - information and codec contexts. Also function declarations for - working with them. - -2012-08-14 13:20:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/androidmedia/gstamc.c: - * sys/androidmedia/gstamc.h: - Initial commit - -2012-10-15 15:53:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * sys/Makefile.am: - androidmedia: Add androidmedia plugin - -2012-10-15 11:45:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: And fix another deadlock caused by the update thread not correctly shutting down - Conflicts: - gst/hls/gsthlsdemux.c - -2012-10-15 11:02:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsturidownloader.c: - hlsdemux: Also hold the mutex before signalling the condition variable - Conflicts: - gst/hls/gsturidownloader.c - -2012-10-15 10:53:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Also cancel the downloader before stopping the playlist update task - -2012-10-15 10:38:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Only lock the mutex when it's not locked already - Conflicts: - gst/hls/gsthlsdemux.c - -2012-10-15 10:32:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Fix another race condition by holding the mutex that the condition variable uses - Conflicts: - gst/hls/gsthlsdemux.c - -2012-10-15 09:47:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Port some things from the last commits - -2012-10-15 09:35:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Never ever stop a task from the task function - This will deadlock. Also make sure to always post an error message - if required before pausing tasks from the task function. - Should fix another bunch of deadlocks. - Conflicts: - gst/hls/gsthlsdemux.c - -2012-10-15 09:24:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Fix lots of deadlocks caused by race conditions in the task state handling - -2012-10-12 10:57:44 +0400 Sergey N. Gorshkov <sng@setevisor.tv> - - * ext/rtmp/gstrtmpsink.c: - rtmpsink: handle RTMP_Write() return value correctly - Error might also be negative (-1). Unclear if 0 should - be fatal as well though. - https://bugzilla.gnome.org/show_bug.cgi?id=681111 - https://bugzilla.gnome.org/show_bug.cgi?id=686009 - -2012-10-12 23:09:06 +0100 David Régade <dregade@viewsurf.com> - - * ext/rtmp/gstrtmpsink.c: - rtmpsink: fix memory leak from URI verification via RTMP_ParseURL() - In gst_rtmp_sink_uri_set_uri(), a test is performed in order - to be sure uri is correct for librtmp. This test calls - RTMP_ParseURL with 3 AVal pointers as parameters: host, - playpath and app. - AVal is a struct with a char* + int. After RTMP_ParseURL call, - host.av_val and app.av_val both refer a substring of "uri". But - playpath.av_val may be the result of a malloc so it needs to - be freed. - https://bugzilla.gnome.org/show_bug.cgi?id=681459 - -2012-10-12 22:33:45 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: advance stream time when sending GAP event - -2012-10-12 22:33:27 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegdemux: send language info downstream if available - ... as extracted from dvd event. - -2012-10-12 22:31:53 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegdemux: remove obsolete struct field - -2012-10-12 12:28:44 -0700 Michael Smith <msmith@rdio.com> - - * gst/rawparse/gstaudioparse.c: - audioparse: Set framesize and properties correctly when taking format from caps. - -2012-10-12 17:51:51 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: tweak flow return aggregation - -2012-10-12 15:44:03 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: handle upstream TIME segments - -2012-10-12 15:07:21 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegdemux: handle and combine downstream flow return - -2012-10-12 14:50:34 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: handle new style dvd event - -2012-10-11 15:29:36 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: do not add pad after no-more-pads - -2012-10-11 15:27:12 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegdemux: clean up segment sending - ... to use the src_segment as a basis for the sent segment, - thereby properly conveying accumulated base_time etc. - Also ensure src_segment is only adjusted once, so that - all downstream segments are identical to avoid stream - misalignment. - -2012-10-11 12:07:46 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegdemux: send GAP event rather than segment updates - -2012-10-11 11:51:50 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: refactor segment sending - -2012-10-11 11:30:44 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: refactor init and reset - -2012-10-11 11:04:33 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: no more segment closing in 1.0 - -2012-10-11 11:03:21 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: clean up some debug statements - -2012-10-11 15:31:04 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/dts/gstdtsdec.c: - dtsdec: fix buffer parsing - ... to avoid feeding empty buffers to decoder. - -2012-10-12 15:26:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: First push EOS, then destroy all programs - And also properly remove the program from the subclass - -2012-10-12 15:09:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Fix invalid read - -2012-10-10 18:18:03 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: signal interlacing properly in video caps - The field is called "interlace-mode" mode now and is a string. - https://bugzilla.gnome.org/show_bug.cgi?id=685895 - -2012-10-10 14:11:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/apexsink/gstapexsink.c: - * gst/debugutils/fpsdisplaysink.c: - * gst/inter/gstintertest.c: - * tests/check/elements/dataurisrc.c: - * tools/gst-app-maker: - replace some playbin2 -> playbin - -2012-10-10 09:58:39 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparse: reset frame parser after parsing caps codec data - ... so as to arrange for a proper fresh state upon first frame. - -2012-10-10 09:48:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - common: Update to the right commit again - Was accidentially reverted to an older version in the last commit. - -2012-10-09 23:00:14 -0700 Michael Smith <msmith@rdio.com> - - * gst/rawparse/gstaudioparse.c: - * gst/rawparse/gstaudioparse.h: - audioparse: add a mode where the caps are taken from the sink pad, and thus audioparse is only performing timestamping. - -2012-10-09 21:19:15 -0700 Michael Smith <msmith@rdio.com> - - * common: - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: reset frame parser after parsing codec_data buffer in caps, to avoid not correctly parsing the full first frame. - -2012-10-09 13:53:19 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpeg4videoparse.h: - mpeg4videoparse: properly mark config data presence - ... which we allow to start at VisualObjectSequence or - at VideoObject. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=685709 - -2012-10-08 12:38:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/fieldanalysis/gstfieldanalysis.c: - fieldanalysis: Fix unitiailized variable compiler warning - And also use the pad's default event function instead - of just pushing to the peerpad. This makes sure any - default handling of events is called. - -2012-10-08 12:23:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - fieldanalysis: Remove from the NONPORTED plugins list - It's supposed to be ported in 1.0.1 already. - -2012-10-07 17:06:39 +0100 Tim-Philipp Müller <tim@centricular.net> - - * docs/Makefile.am: - docs: add 'make upload' target for docs/ for new-release script - -2012-10-07 17:03:45 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * win32/common/config.h: - Back to development (bug fixing) - -=== release 1.0.1 === - -2012-10-07 15:57:03 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.0.1 - -2012-10-06 14:57:54 +0100 Tim-Philipp Müller <tim@centricular.net> - - * common: - Automatic update of common submodule - From 6c0b52c to 6bb6951 - -2012-10-03 11:05:06 -0700 Michael Smith <msmith@rdio.com> - - * ext/directfb/dfbvideosink.c: - * ext/wayland/waylandpool.c: - * gst-libs/gst/video/gstsurfacemeta.c: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/corevideobuffer.c: - * sys/pvr2d/gstpvrbufferpool.c: - meta info: register thread-safely. - -2012-10-03 17:23:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/rtpvp8/Makefile.am: - rtpvp8: Also commit remaining uncommitted changes... - -2012-10-03 09:39:28 +0000 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/rtpvp8/Makefile.am: - rtpvp8: redifine vp8_norm to avoid duplicated symbols in static links with libvpx - -2012-10-03 09:49:39 +0000 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/videoparsers/Makefile.am: - videoparsers: fix duplicated symbols for static links with libschroedinger - -2011-12-26 22:04:04 -0600 Rob Clark <rob@ti.com> - - * gst/dvdspu/gstdvdspu-render.c: - * gst/dvdspu/gstdvdspu.c: - dvdspu: add YV12 and NV12 support - https://bugzilla.gnome.org/show_bug.cgi?id=667220 - Conflicts: - gst/dvdspu/gstdvdspu.c - gst/dvdspu/gstdvdspu.h - gst/dvdspu/gstspu-pgs.c - gst/dvdspu/gstspu-vobsub-render.c - -2012-10-02 22:20:20 +1000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/rsnparsetter.c: - * ext/resindvd/rsnparsetter.h: - resindvd: Remove caps lock from parsetter element. - All the members it used to protect in 0.10 are protected by - the stream lock now. - -2012-10-01 23:43:47 +1000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/rsnparsetter.c: - resindvd: Update overridden caps when the DAR changes - Send a new caps event downstream when we receive new orders - from the VM, if there are existing caps. - -2012-10-01 23:21:12 +1000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/Makefile.am: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/rsnparsetter.c: - * ext/resindvd/rsnparsetter.h: - * ext/resindvd/rsnwrappedbuffer.c: - * ext/resindvd/rsnwrappedbuffer.h: - resindvd: Port parsetter element - Port the DVD element which overrides the MPEG encoded pixel-aspect-ratio - to match that requested by the DVD VM. - -2012-10-01 13:52:35 +0200 Christian Fredrik Kalager Schaller <uraeus@linuxrisin.org> - - * gst-plugins-bad.spec.in: - update for latest changes - -2012-09-30 20:52:30 +0200 Christophe Fergeau <cfergeau@redhat.com> - - * ext/chromaprint/gstchromaprint.c: - chromaprint: Missing unmap buffer in transform_ip - When no samples have to be processed, transform_ip exits early, but - the buffer it uses was not properly unmapped. - https://bugzilla.gnome.org/show_bug.cgi?id=685159 - -2012-09-30 03:49:17 +1000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/resindvdsrc.c: - resindvd: Fiddle with segment handling for DVD. - Clarify some of the terms used, and make sure to extend the - stop time when the position moves past the end of the current - segment (as for still frames, for example). - Also, make sure to reset the position value of the segment the - demuxer outputs when collecting a seamless segment. - -2012-09-29 13:21:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rsrc.c: - frei0r: fix plugin loading for frei0r elements that have no info.explanation - We don't allow empty descriptions for elements any more. - -2012-09-29 12:36:08 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/directfb/Makefile.am: - * ext/dts/gstdtsdec.c: - * ext/wayland/Makefile.am: - Remove some liboil references - https://bugzilla.gnome.org/show_bug.cgi?id=673285 - -2012-09-29 12:30:20 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/cog/Makefile.am: - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstcolorconvert.c: - * ext/cog/gstlogoinsert.c: - cog: remove some old elements so they don't get ported accidentally - They are replaced by videoconvert and gdkpixbufoverlay - -2012-09-28 22:30:39 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * ext/curl/gstcurlbasesink.c: - curl: fix compiler warning with setsockopt() on windows - The optval argument is of type const char * on windows. - https://bugzilla.gnome.org/show_bug.cgi?id=685065 - -2012-09-28 11:59:57 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - * gst/frei0r/gstfrei0r.c: - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rmixer.h: - * gst/frei0r/gstfrei0rsrc.c: - * gst/frei0r/gstfrei0rsrc.h: - frei0r: Port to 1.0 - https://bugzilla.gnome.org/show_bug.cgi?id=681678 - -2012-09-26 08:20:49 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - * ext/curl/Makefile.am: - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlfilesink.c: - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlhttpsink.c: - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/gstcurltlssink.c: - curl: fix build on win32 - https://bugzilla.gnome.org/show_bug.cgi?id=684847 - -2012-09-28 00:06:45 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - wrappercamerabinsrc: change video-source if the user requested - When going from null to ready, check if the user requested to - use a new source and replace the current one. - Fixes #681562 - -2012-09-27 23:22:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.h: - wrappercamerabinsrc: pad probe ids are gulong - Change variable to the correct type - -2012-09-27 19:40:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin: use correct element name when replacing the video filter - The name was updated on the 0.10 -> 1.0 transition, but the - gst_bin_remove was still using the old name, causing an assertion - when replacing video-source-filter - https://bugzilla.gnome.org/show_bug.cgi?id=681564 - -2012-09-26 14:50:04 +1000 Jan Schmidt <thaytan@noraisin.net> - - * ext/soundtouch/gstpitch.cc: - soundtouch: Transform timestamps properly after a seek. - The segment is transformed to match the pitch conversion - being applied, so make sure the timestamps being output - match the configured downstream segment accordingly, and - adjust the downstream segment position to match the stream time - ratio also. - -2012-09-18 01:13:36 +1000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/gstmpegdemux.c: - resindvd: Don't send spurious 'close segment' events. Make a single segment - With the new 1.0 segment semantics, there's no need to close the - previous segment before sending out a new one, so don't do it. - Also, adjust the outgoing segment to just be one contiguous - timeline, with a base of 0. Fixes some repeating timestamps when - segments change. - -2012-09-24 17:25:25 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/fieldanalysis/gstfieldanalysis.h: - fieldanalysis: Port to 1.0 - I was also vaguely forced to overhaul some bits and pieces and mess with - the data structures. This was mostly due to caps not being part of - buffers and so I had to switch to using GstVideoFrame and GstVideoInfo. - -2012-09-24 16:11:32 -0500 Yaakov Selkowitz <yselkowitz@users.sourceforge.net> - - * ext/chromaprint/Makefile.am: - chromaprint: link against libgstbase - Calls to gst_base_transform_get_type and gst_base_transform_set_passthrough - require linking with libgstbase. - https://bugzilla.gnome.org/show_bug.cgi?id=684740 - -2012-09-24 16:59:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * win32/common/config.h: - Back to development (bug fixing) - -=== release 1.0.0 === - -2012-09-24 14:42:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * NEWS: - * RELEASE: - * configure.ac: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 1.0.0 - -2012-09-24 14:42:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - docs: update - -2012-09-23 13:15:20 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/capture.cpp: - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklink: change device instance lifecycle - The decklink driver eventually crashes after repeated creation/deletion - of device, input, output, and configuration objects. Change to create - these at the outset and keep them around forever. - -2012-09-22 13:56:57 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklinksrc.cpp: - decklinksrc: Fix memory leaks - Buffers now hold on to a reference for the input, so the input - object doesn't get freed (and carry the buffers with it) before - all the buffers are freed. - -2012-09-23 21:08:57 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/assrender.c: - tests: disable assrender unit test - Doesn't work, needs fixing. - -2012-09-23 21:07:07 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/assrender/gstassrender.c: - assrender: disable for autoplugging until it works - https://bugzilla.gnome.org/show_bug.cgi?id=683192 - https://bugzilla.gnome.org/show_bug.cgi?id=684683 - -2012-09-22 15:00:27 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstrtpdtmfdepay.c: - rtpdtmfdepay: Use 1.0-style caps negotiation and audio/x-raw - -2012-09-20 18:42:50 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/opus/gstopus.c: - opusenc: Rank as Primary - -2012-09-20 18:41:24 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/opus/gstrtpopuspay.c: - rtpopuspay: Allocate the rtp buffer correctly - Use the right functions to allocate the rtp buffer - -2012-09-22 16:08:39 +0100 Tim-Philipp Müller <tim@centricular.net> - - * common: - Automatic update of common submodule - From 4f962f7 to 6c0b52c - -2012-09-20 00:08:56 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/inter/gstintersubsrc.c: - intersubsrc: disable timestamping code that doesn't make sense - and which breaks the states check because we end up trying to - divide by 0. - -2012-09-18 13:17:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/vtdec.c: - applemedia: init videoinfo - -2012-09-18 13:17:27 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/y4m/gsty4mdec.c: - y4mdec: init videoinfo - -2012-09-18 00:12:52 +0100 Tim-Philipp Müller <tim@centricular.net> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - docs: remove one more old include - -=== release 0.11.99 === - -2012-09-17 18:04:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.11.99 - -2012-09-17 17:52:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colorspace.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-directdraw.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-linsys.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-lv2.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegpsdemux.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpg123.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-patchdetect.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdi.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spandsp.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-swfdec.xml: - * docs/plugins/inspect/plugin-timidity.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-video3d.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-voamrwbenc.xml: - * docs/plugins/inspect/plugin-waylandsink.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - docs: update - -2012-09-17 17:13:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-freeze.xml: - * gst/freeze/Makefile.am: - * gst/freeze/gstfreeze.c: - * gst/freeze/gstfreeze.h: - freeze: remove freeze element, was replaced by imagefreeze in -good years ago - -2012-09-17 23:59:34 +1000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/resindvdbin.c: - resindvd: Fix segment handling in the demuxer. - Transfer the incoming segment base time to the src - segment the demuxer sends downstream. Add some - (disabled) debug to the bin for tracking outgoing - timestamps. - -2012-09-17 00:05:19 +0200 Christian Fredrik Kalager Schaller <uraeus@linuxrisin.org> - - * gst-plugins-bad.spec.in: - Remove vp8 plugin from spec after move to good - -2012-09-16 15:48:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * Makefile.am: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-vp8.xml: - * ext/Makefile.am: - * ext/vp8/GstVP8Enc.prs: - * ext/vp8/Makefile.am: - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8dec.h: - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - * ext/vp8/gstvp8utils.c: - * ext/vp8/gstvp8utils.h: - * ext/vp8/plugin.c: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/vp8dec.c: - * tests/check/elements/vp8enc.c: - vp8: Remove plugin, moved to gst-plugins-good - -2012-09-16 15:25:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - vp8dec: Unref input/output states when stopping the decoder - -2012-09-16 15:18:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/GstVP8Enc.prs: - vp8enc: Update realtime profile to the new properties - -2012-09-16 11:00:53 +0200 Christian Fredrik Kalager Schaller <uraeus@linuxrisin.org> - - * gst-plugins-bad.spec.in: - Update and fix spec with latest changes and F18 name scheeme - -2012-09-16 10:56:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/vp8/gstvp8dec.c: - vp8: Require latest libvpx release (1.1.0 from May 2012) - Fixes bug #684116 and simplifies configure checks. - -2012-09-15 20:23:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Use a string field for the profile in the caps - Just for consistency with all the other codecs. - -2012-09-15 19:08:33 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/resindvd/rsndec.c: - * gst/autoconvert/gstautovideoconvert.c: - * tests/examples/opencv/gst_element_print_properties.c: - use gst_element_factory_get_metadata to replace obsolete API - -2012-09-15 00:04:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Correctly set profile in caps - -2012-09-14 23:41:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - vp8: Update copyright and authors - -2012-09-14 23:40:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - docs: Update plugin docs - -2012-09-08 15:38:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - vp8enc: Rework encoder properties to be more in line with the libvpx tools and API - Also add all available properties. - -2012-09-14 17:55:05 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/jp2kdecimator/gstjp2kdecimator.c: - * sys/decklink/gstdecklinksrc.cpp: - replace _get_caps_reffed with _get_caps - -2012-09-14 17:08:49 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/apexsink/gstapexsink.c: - * ext/assrender/gstassrender.c: - * ext/audiofile/gstafparse.c: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsrc.c: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2enc.c: - * ext/cdaudio/gstcdaudio.c: - * ext/celt/gstceltdec.c: - * ext/celt/gstceltenc.c: - * ext/chromaprint/gstchromaprint.c: - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstcogdownsample.c: - * ext/cog/gstcogmse.c: - * ext/cog/gstcogscale.c: - * ext/cog/gstcolorconvert.c: - * ext/cog/gstlogoinsert.c: - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlfilesink.c: - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlhttpsink.c: - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/gstcurltlssink.c: - * ext/dc1394/gstdc1394.c: - * ext/dirac/gstdiracdec.cc: - * ext/dirac/gstdiracenc.cc: - * ext/directfb/dfbvideosink.c: - * ext/dts/gstdtsdec.c: - * ext/faac/gstfaac.c: - * ext/faad/gstfaad.c: - * ext/flite/gstflitetestsrc.c: - * ext/gme/gstgme.c: - * ext/gsettings/gstgsettingsaudiosink.c: - * ext/gsettings/gstgsettingsaudiosrc.c: - * ext/gsettings/gstgsettingsvideosink.c: - * ext/gsettings/gstgsettingsvideosrc.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmenc.c: - * ext/jasper/gstjasperdec.c: - * ext/jasper/gstjasperenc.c: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkatetiger.c: - * ext/ladspa/gstladspa.c: - * ext/libfame/gstlibfame.c: - * ext/libmms/gstmms.c: - * ext/lv2/gstlv2.c: - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - * ext/modplug/gstmodplug.cc: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mplex/gstmplex.cc: - * ext/musepack/gstmusepackdec.c: - * ext/musicbrainz/gsttrm.c: - * ext/mythtv/gstmythtvsrc.c: - * ext/nas/nassink.c: - * ext/neon/gstneonhttpsrc.c: - * ext/ofa/gstofa.c: - * ext/openal/gstopenalsink.c: - * ext/openal/gstopenalsrc.c: - * ext/opencv/gstcvdilate.c: - * ext/opencv/gstcvequalizehist.c: - * ext/opencv/gstcverode.c: - * ext/opencv/gstcvlaplace.c: - * ext/opencv/gstcvsmooth.c: - * ext/opencv/gstcvsobel.c: - * ext/opencv/gstedgedetect.c: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstmotioncells.c: - * ext/opencv/gstpyramidsegment.c: - * ext/opencv/gsttemplatematch.c: - * ext/opencv/gsttextoverlay.c: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusparse.c: - * ext/opus/gstrtpopusdepay.c: - * ext/opus/gstrtpopuspay.c: - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/rsndec.c: - * ext/resindvd/rsnparsetter.c: - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgoverlay.c: - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsrc.c: - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/sdl/sdlaudiosink.c: - * ext/sdl/sdlvideosink.c: - * ext/snapshot/gstsnapshot.c: - * ext/sndfile/gstsfsink.c: - * ext/sndfile/gstsfsrc.c: - * ext/sndio/sndiosink.c: - * ext/sndio/sndiosrc.c: - * ext/soundtouch/gstbpmdetect.cc: - * ext/soundtouch/gstpitch.cc: - * ext/spandsp/gstspanplc.c: - * ext/spc/gstspc.c: - * ext/swfdec/gstswfdec.c: - * ext/teletextdec/gstteletextdec.c: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * ext/voaacenc/gstvoaacenc.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - * ext/wayland/gstwaylandsink.c: - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxvidenc.c: - * ext/zbar/gstzbar.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst/adpcmdec/adpcmdec.c: - * gst/adpcmenc/adpcmenc.c: - * gst/aiff/aiffmux.c: - * gst/aiff/aiffparse.c: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfparse.c: - * gst/asfmux/gstrtpasfpay.c: - * gst/audiobuffer/gstaudioringbuffer.c: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstwavescope.c: - * gst/autoconvert/gstautovideoconvert.c: - * gst/bayer/gstbayer2rgb.c: - * gst/bayer/gstrgb2bayer.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/cdxaparse/gstcdxaparse.c: - * gst/cdxaparse/gstvcdparse.c: - * gst/coloreffects/gstchromahold.c: - * gst/coloreffects/gstcoloreffects.c: - * gst/dataurisrc/gstdataurisrc.c: - * gst/dccp/gstdccpclientsink.c: - * gst/dccp/gstdccpclientsrc.c: - * gst/dccp/gstdccpserversink.c: - * gst/dccp/gstdccpserversrc.c: - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/gstchecksumsink.c: - * gst/debugutils/gstchopmydata.c: - * gst/debugutils/gstcompare.c: - * gst/debugutils/gstdebugspy.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/faceoverlay/gstfaceoverlay.c: - * gst/festival/gstfestival.c: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/freeverb/gstfreeverb.c: - * gst/freeze/gstfreeze.c: - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rsrc.c: - * gst/games/gstpuzzle.c: - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstsolarize.c: - * gst/geometrictransform/gstbulge.c: - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstdiffuse.c: - * gst/geometrictransform/gstfisheye.c: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstmarble.c: - * gst/geometrictransform/gstmirror.c: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstrotate.c: - * gst/geometrictransform/gstsphere.c: - * gst/geometrictransform/gstsquare.c: - * gst/geometrictransform/gststretch.c: - * gst/geometrictransform/gsttunnel.c: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gstwaterripple.c: - * gst/hdvparse/gsthdvparse.c: - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlssink.c: - * gst/id3tag/gstid3mux.c: - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosrc.c: - * gst/interlace/gstinterlace.c: - * gst/ivfparse/gstivfparse.c: - * gst/jp2kdecimator/gstjp2kdecimator.c: - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - * gst/librfb/gstrfbsrc.c: - * gst/liveadder/liveadder.c: - * gst/mixmatrix/mixmatrix.c: - * gst/mpeg1sys/gstmpeg1systemencode.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mve/gstmvedemux.c: - * gst/mve/gstmvemux.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmux.c: - * gst/nsf/gstnsf.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/overlay/gstoverlay.c: - * gst/patchdetect/gstpatchdetect.c: - * gst/pcapparse/gstirtspparse.c: - * gst/pcapparse/gstpcapparse.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - * gst/rawparse/gstaudioparse.c: - * gst/rawparse/gstvideoparse.c: - * gst/real/gstrealaudiodec.c: - * gst/real/gstrealvideodec.c: - * gst/removesilence/gstremovesilence.c: - * gst/rtjpeg/gstrtjpegdec.c: - * gst/rtjpeg/gstrtjpegenc.c: - * gst/rtpvp8/gstrtpvp8pay.c: - * gst/scaletempo/gstscaletempo.c: - * gst/sdi/gstsdidemux.c: - * gst/sdi/gstsdimux.c: - * gst/sdp/gstsdpdemux.c: - * gst/segmentclip/gstaudiosegmentclip.c: - * gst/segmentclip/gstvideosegmentclip.c: - * gst/siren/gstsirendec.c: - * gst/siren/gstsirenenc.c: - * gst/smooth/gstsmooth.c: - * gst/speed/gstspeed.c: - * gst/stereo/gststereo.c: - * gst/subenc/gstsrtenc.c: - * gst/subenc/gstwebvttenc.c: - * gst/tta/gstttadec.c: - * gst/tta/gstttaparse.c: - * gst/vbidec/gstvbidec.c: - * gst/videofilters/gstscenechange.c: - * gst/videofilters/gstzebrastripe.c: - * gst/videomeasure/gstvideomeasure_collector.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videosignal/gstvideoanalyse.c: - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideomark.c: - * gst/vmnc/vmncdec.c: - * gst/y4m/gsty4mdec.c: - * sys/acmenc/acmenc.c: - * sys/acmmp3dec/acmmp3dec.c: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/celvideosrc.c: - * sys/applemedia/miovideosrc.c: - * sys/applemedia/qtkitvideosrc.m: - * sys/applemedia/vtenc.c: - * sys/applemedia/vth264decbin.c: - * sys/applemedia/vth264encbin.c: - * sys/avc/gstavcsrc.cpp: - * sys/cdrom/gstcdplayer.c: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directsound/gstdirectsoundsrc.c: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dxr3/dxr3audiosink.c: - * sys/dxr3/dxr3spusink.c: - * sys/dxr3/dxr3videosink.c: - * sys/fbdev/gstfbdevsink.c: - * sys/linsys/gstlinsyssdisink.c: - * sys/linsys/gstlinsyssdisrc.c: - * sys/osxvideo/osxvideosrc.c: - * sys/pvr2d/gstpvrvideosink.c: - * sys/qcam/gstqcamsrc.c: - * sys/qtwrapper/audiodecoders.c: - * sys/qtwrapper/videodecoders.c: - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsrc.c: - * sys/uvch264/gstuvch264_mjpgdemux.c: - * sys/uvch264/gstuvch264_src.c: - * sys/vcd/vcdsrc.c: - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wininet/gstwininetsrc.c: - * sys/winks/gstksvideosrc.c: - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.c: - * tests/check/elements/baseaudiovisualizer.c: - * tests/check/elements/camerabin.c: - * tools/gst-element-maker: - replace gst_element_class_set_details_simple with gst_element_class_set_metadata - -2012-09-14 12:06:23 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: init pps and sps structures before parsing - ... which arranges for a valid fallback id, and allows to continue best effort - processing even when sps/pps parsing fails. - -2012-09-03 13:58:22 +0200 Peter Seiderer <ps.report@gmx.net> - - * gst/videoparsers/gsth264parse.c: - gsth264parse: add comment where return should be checked. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=683264 - -2012-09-03 13:43:03 +0200 Peter Seiderer <ps.report@gmx.net> - - * gst-libs/gst/codecparsers/gsth264parser.c: - gsth264parser: fix Coverity found not initialized sps/pps valid member. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=683264 - -2012-09-03 13:09:29 +0200 Peter Seiderer <ps.report@gmx.net> - - * gst-libs/gst/codecparsers/gsth264parser.c: - gsth264parser: fix Coverity detected off by one at call to READ_UE_ALLOWED. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=683263 - -2012-09-14 16:49:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gaudieffects/blur-example.py: - * gst/gaudieffects/burn-example.py: - rename some caps - -2012-09-14 16:45:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/cog/gstcogscale.c: - * ext/gsettings/gstgsettingsvideosink.c: - * ext/gsettings/gstgsettingsvideosrc.c: - * ext/kate/gstkatetiger.c: - * ext/opencv/gstedgedetect.c: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gsttemplatematch.c: - * ext/resindvd/resin-play: - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgoverlay.c: - * ext/teletextdec/gstteletextdec.c: - * ext/zbar/gstzbar.c: - * gst/asfmux/gstasfmux.c: - * gst/coloreffects/gstchromahold.c: - * gst/coloreffects/gstcoloreffects.c: - * gst/faceoverlay/gstfaceoverlay.c: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/freeze/gstfreeze.c: - * gst/gaudieffects/blur-example.py: - * gst/gaudieffects/burn-example.py: - * gst/hls/gsthlsdemux.c: - * gst/jp2kdecimator/gstjp2kdecimator.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - * gst/scaletempo/gstscaletempo.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/videosignal/gstvideoanalyse.c: - * gst/videosignal/gstvideodetect.c: - * sys/uvch264/gstuvch264_src.c: - * tests/examples/capsfilter/capsfilter1.c: - * tests/examples/directfb/gstdfb.c: - * tests/examples/opencv/gstmotioncells_dynamic_test.c: - * tests/icles/metadata_editor.c: - ffmpegcolorspace is no more - -2012-09-14 16:29:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstmotioncells.c: - * gst/asfmux/gstasfmux.c: - * gst/autoconvert/gstautovideoconvert.c: - * gst/interlace/gstinterlace.c: - * gst/pnm/gstpnmenc.c: - * gst/rawparse/README: - * win32/common/config.h: - rename some caps and elements in examples - -2012-09-02 20:17:14 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpeg4videoparse.h: - mpeg4videoparse: use previously parsed visual object when parsing VOL - https://bugzilla.gnome.org/show_bug.cgi?id=683254 - -2012-09-02 20:19:17 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - mpeg4parser: parse complexity estimation header in video object layer - https://bugzilla.gnome.org/show_bug.cgi?id=683254 - -2012-09-02 20:18:32 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - mpeg4parser: fix some issues related to video object layer parsing - https://bugzilla.gnome.org/show_bug.cgi?id=683254 - -2012-09-02 18:21:16 +0200 Arnaud Vrac <avrac@freebox.fr> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparse: do not skip user data - User data was skipped until now, so the user data was included when - parsing the previous packet and in the config buffer. - https://bugzilla.gnome.org/show_bug.cgi?id=683254 - -2012-09-14 02:59:08 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - Back to development - -=== release 0.11.94 === - -2012-09-14 02:50:44 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ChangeLog: - * configure.ac: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.11.94 - -2012-09-14 02:06:48 +0100 Tim-Philipp Müller <tim@centricular.net> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - docs: update docs - -2012-09-13 13:44:05 -0700 Jan Schmidt <thaytan@noraisin.net> - - * tests/check/elements/parser.c: - check: Verify the DTS emerging from the parser, not PTS - PTS doesn't increment linearly in parsers with frame re-ordering, but - DTS does. Verify that instead. - -2012-09-13 13:34:16 -0700 Jan Schmidt <thaytan@noraisin.net> - - * tests/check/libs/mpegvideoparser.c: - check: Fix mpegvideoparser PAR expectation - The parser (correctly) now interprets the test header using - MPEG-1 semantics, so fix the test expectation. - -2012-09-13 15:51:02 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/inter/gstintervideosrc.c: - interaudiosrc: Make caps writable in fixate - -2012-09-13 15:06:52 -0400 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintertest.c: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosrc.c: - * gst/inter/gstintervideosrc.h: - inter: Port to 1.0 API - Also remove a lot of empty, non-implemented methods - -2012-09-12 22:58:04 -0700 Jan Schmidt <thaytan@noraisin.net> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - videoparsers: Disable PTS interpolation in the base parse class - All these formats have re-ordered PTS which the base class gets - wrong. It's better to leave them blank and let the decoder sort it - out. Better yet would be to track and interpolate the timestamps - in the subclasses (FIXME) - -2012-09-09 16:40:00 -0700 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: Advance video stream with gap events. - Handle Gap events the way we used to handle segment updates - and advance/fill in the video stream accordingly. Fixes - 'still' menus which aren't DVD still frames, but are just a - single frame with accompanying audio. - -2012-09-09 16:29:52 -0700 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdbin.h: - resindvd: Start with a larger subpicture queue for preroll. - Shrink the queue once we're prerolled. Fixes the Fringe S1 - DVD. Also, ensure we only fire no_more_pads once. - -2012-09-08 19:21:47 -0700 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdbin.c: - resindvd: Disable input-selector syncing - Until segments are better worked out. Also, use - internal input-selector for audio as well - -2012-09-03 09:47:30 -0700 Jan Schmidt <thaytan@noraisin.net> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstmpegvideoparse.h: - mpegvideoparse: Handle Sequence Display Extension - Change the way the pixel-aspect-ratio is computed by - interpreting the sequence header aspect ratio info - as MPEG-1 values until a sequence extension or - sequence display extension is seen, and then updating - the sequence header struct accordingly. - Fixes incorrect anamorphic display on some MPEG-2 (DVD) - sequences. - -2012-09-13 01:40:42 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/pipelines/mxf.c: - tests: disable yet another mxf tests until the elements are ported - -2012-09-13 01:34:45 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/flite/gstflitetestsrc.c: - flitetestsrc: fix caps fixation - Make caps writable before changing them. - -2012-09-13 01:26:28 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/segmentclip/gstsegmentclip.c: - segmentclip: fix wrong pad template unref - Blows up when trying to instantiate a second clip element - of the same type, like in the generic/states unit test. - -2012-09-13 01:07:46 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/wayland/gstwaylandsink.c: - waylandsink: fail gracefully with an error message if we can't connect to wayland - g_return_val_if_fail() is not for error handling, it's for - catching programming errors in public API. - Fixes problem with generic/states unit test. - -2012-09-13 00:59:33 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/siren/gstsirendec.c: - * gst/siren/gstsirenenc.c: - siren: init debug category before logging anything - -2012-09-13 00:55:28 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/mxfdemux.c: - * tests/check/elements/mxfmux.c: - tests: skip mxf tests while elements haven't been ported yet - -2012-09-13 00:50:04 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/schroedinger/gstschroenc.c: - schroenc: remove GST_ERROR statement that was committed by accident - -2012-09-13 00:40:44 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/jifmux.c: - tests: fix jifmux test - Need to pass a GstSample now for GST_TAG_APPLICATION_DATA - instead of a GstBuffer. - -2012-09-12 18:34:03 -0400 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmdec.h: - * gst/pnm/gstpnmenc.c: - * gst/pnm/gstpnmenc.h: - pnm: Port to 1.0 API - -2012-09-12 17:34:03 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/freeze/gstfreeze.c: - * gst/freeze/gstfreeze.h: - freeze: Use a GPtrArray instead of a GQueue - This way, the most common function (changing buffers) becomes O(1) instead - of O(n) - -2012-09-12 17:24:26 -0400 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * gst/freeze/gstfreeze.c: - * gst/freeze/gstfreeze.h: - freeze: Port to 1.0 API - -2012-09-12 16:23:47 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/speed/gstspeed.c: - * gst/speed/gstspeed.h: - speed: Various 1.0 style additions - Use GstAudioInfo everywhere, etc - -2012-09-10 17:16:07 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - * gst/speed/Makefile.am: - * gst/speed/gstspeed.c: - speed: port to 0.11 - https://bugzilla.gnome.org/show_bug.cgi?id=683727 - -2012-09-12 16:03:06 -0400 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * gst/liveadder/liveadder.c: - * gst/liveadder/liveadder.h: - liveadder: port to 1.0 API - -2012-09-12 21:13:35 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/asfmux/gstasfmux.c: - * gst/debugutils/gstcompare.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mxf/mxfmux.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - collectpads: remove gst_collect_pads_add_pad_full - Rename gst_collect_pads_add_pad_full() to gst_collect_pads_add_pad() and fix all - invocations. - -2012-09-12 12:14:53 -0400 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * gst/siren/gstsirendec.c: - * gst/siren/gstsirenenc.c: - siren: Port to 1.0 API - -2012-09-12 15:08:01 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Use default query handlers where needed - And fixup getcaps handler while I'm at it - -2012-09-12 09:42:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: port tagsetter mode setting code - Check directly with GST_IS_TAG_SETTER instead of using the - deprecated GstImplementsInterface - Fixes the image tag setting unit test - -2012-09-12 13:03:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/pipelines/streamheader.c: - tests: fix win32 build even more - -2012-09-12 13:17:03 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/mpegtsmux.c: - tests: mpegtsmux: port to the new GLib thread API - -2012-09-12 11:08:25 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: fix aspect ratio calculation. - ASPECT_HORIZ_SIZE and ASPECT_VERT_SIZE are syntax elements that hold - binary encodings of sizes ranging from 1 to 256. Thus, the calculated - pixel-aspect-ratio was off by one. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - https://bugzilla.gnome.org/show_bug.cgi?id=683858 - -2012-09-12 11:01:34 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst/videoparsers/gsth264parse.c: - codecparsers: h264parse: don't use anonymous unions. - Anonymous union is an ISO C (2011) feature that is not exposed in - compilers strictly conforming to the previous standard. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2012-09-12 11:21:41 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: compute pixel aspect ratio. - Signed-off-by: Simon Farnsworth <simon.farnsworth@onelan.co.uk> - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - -2012-09-12 09:48:47 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/pipelines/streamheader.c: - tests: attempt to get disabled streamheader test to compile on win32 - Though it probably won't work, but then it's disabled. - -2012-09-12 09:10:35 +0200 Peter Korsgaard <jacmet@sunsite.dk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusenc.c: - * gst/jpegformat/gstjpegparse.c: - opus + jpegformat: unbreak non-debug build - opus + jpegformat plugin builds fail when gstreamer is configured with - --disable-gst-debug as they are checking the GST_DISABLE_DEBUG symbol - instead of GST_DISABLE_GST_DEBUG. - Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk> - https://bugzilla.gnome.org/show_bug.cgi?id=683850 - -2012-09-12 01:35:42 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/jpegformat/Makefile.am: - jpegformat: don't link to libgstinterfaces which doesn't exist any longer - -2012-09-11 20:30:55 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/spandsp/gstspanplc.c: - spanplc: Don't unref too much, don't forward gap event - -2012-09-11 20:19:48 -0400 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * ext/spandsp/gstspanplc.c: - * ext/spandsp/gstspanplc.h: - spanplc: Port to 1.0 API - -2012-09-11 19:41:31 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: Don't try to sync controller values to invalid timestamp - -2012-09-11 19:36:24 -0400 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - * tests/check/elements/jpegparse.c: - jpegparse: Finish port to 1.0 API - -2012-09-11 18:55:11 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/autoconvert.c: - test: Simplify autoconvert test - -2012-09-11 18:53:43 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Look at all possibilities for accept-caps even if there is a selected subelement - If the accept-caps succeeds with a different subelement, then the subsequent - caps event will change the current subelement. - -2012-09-11 18:02:28 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/opus.c: - test: Flush opus encoder between tests - -2012-09-11 18:01:58 -0400 Olivier Crête <olivier.crete@collabora.com> - - * tests/check/elements/opus.c: - test: Flush opus encoder between tests - -2012-09-10 18:20:48 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * configure.ac: - * sys/uvch264/gstuvch264_src.c: - * sys/uvch264/gstuvch264_src.h: - uvch264: Make gudev/libusb a hard dependency and remove XU_FIND_UNIT ioctl support - Conflicts: - sys/uvch264/gstuvch264_src.c - -2012-09-11 17:47:16 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/modplug/gstmodplug.cc: - * ext/resindvd/gstmpegdemux.c: - * gst/asfmux/gstasfparse.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/rawparse/gstrawparse.c: - ext, gst: only activate in pull mode if upstream is seekable - -2012-09-11 15:07:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/festival/gstfestival.c: - festival: timed text is text/x-raw now - -2012-09-11 15:02:00 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/d3dvideosink.h: - * sys/d3dvideosink/directx/dx.c: - d3dvideosink: port to the new GLib thread API - -2012-09-11 14:32:04 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/mpeg2enc.c: - * tests/check/elements/mplex.c: - tests: mpeg2enc, mplex: port to the new GLib thread API - -2012-09-11 14:31:49 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - opusenc: port to the new GLib thread API - -2012-09-11 01:52:46 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - * tests/check/Makefile.am: - * tests/check/pipelines/.gitignore: - gdp: move gdp plugin here from -base - Needs some reworking. - -2012-09-09 18:05:55 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/gdp/dataprotocol.c: - gdp: dump bytes into debug log using GST_MEMDUMP - Instead of home-grown solution. - -2012-07-27 15:21:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - update for new variable names - -2012-07-02 12:52:17 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/pipelines/streamheader.c: - tests: use multifdsink for streamheader test - Use multifdsink for pipes instead of multisocketsink, - to avoid "creating GSocket from fd 9: Socket operation - on non-socket "criticals from Gio. Test still fails, - but it fails in a different way now. - -2012-04-25 18:07:21 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/gdp/gstgdppay.c: - gdppay: plug buffer leak - -2012-04-19 14:41:40 +0200 Stefan Sauer <ensonic@users.sf.net> - - * tests/check/pipelines/streamheader.c: - tests: initialize variables - -2012-04-10 00:45:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - Use new gst_element_class_set_static_metadata() - -2012-04-05 15:11:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/gdp/gstgdp.c: - gst: Update for GST_PLUGIN_DEFINE() API change - -2012-04-01 18:11:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdppay.c: - Improve buffer allocation of wrapped memory - -2012-03-30 18:12:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdppay.c: - update for buffer api change - -2012-03-28 12:48:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdppay.c: - update for buffer changes - -2012-03-15 13:32:08 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - update for memory api changes - -2012-02-22 02:05:24 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdppay.c: - update for new memory api - -2012-02-03 11:38:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - gdp: fixup unit tests - -2012-02-03 11:38:15 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdppay.c: - gdppay: fixup for changed caps - Try to send the streamheader after the first buffer. - -2012-02-03 11:37:21 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - dataprotocol: don't define default Category - Since we now include this into the unit tests directly, don't define the default - category macro because it conflicts with check. - -2012-01-30 17:16:17 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - * gst/gdp/gstgdppay.c: - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - * tests/check/pipelines/streamheader.c: - update for HEADER flag changes - -2012-01-20 16:11:54 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - * gst/gdp/gstgdpdepay.c: - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - * tests/check/pipelines/streamheader.c: - port to new map API - -2012-01-19 15:32:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/pipelines/streamheader.c: - tests: fix some tests - -2012-01-04 16:41:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - * tests/check/pipelines/streamheader.c: - tests: port and enable more unit tests - -2011-12-25 23:19:57 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/gdp/Makefile.am: - * gst/gdp/dataprotocol.c: - * gst/gdp/dp-private.h: - * gst/gdp/gstgdp.c: - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - gdp: move dataprotocol library into gdp plugin and make private - We have removed things like protocol=gdp in the tcp elements - in favour of explicit gdppay/depay elements, so there's no need - to keep a public API and library for now. We can still add it - back later. Someone needs to think hard about 0.11 and gdp - anyway one of these days. - -2011-11-11 17:17:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/dataprotocol.h: - gdp: fix header files - Ensure correct indentation and retab - Make sure all structure have padding - -2011-08-16 17:32:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - gdp: rename buffer PREROLL -> LIVE flag - Rename the GST_BUFFER_FLAG_PREROLL to GST_BUFFER_FLAG_LIVE and give the new flag - a meaning. The old PREROLL flag never had a clear meaning. - -2011-06-10 13:40:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - gdp: make new _buffer_allocate method - Make a new method to allocate a buffer + memory that takes the allocator and the - alignment as parameters. Provide a macro for the old method but prefer to use - the new method to encourage plugins to negotiate the allocator properly. - -2011-05-13 18:07:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - gdp: Rework GstSegment handling - Improve GstSegment, rename some fields. The idea is to have the GstSegment - structure represent the timing structure of the buffers as they are generated by - the source or demuxer element. - gst_segment_set_seek() -> gst_segment_do_seek() - Rename the NEWSEGMENT event to SEGMENT. - Make parsing of the SEGMENT event into a GstSegment structure. - Pass a GstSegment structure when making a new SEGMENT event. This allows us to - pass the timing info directly to the next element. No accumulation is needed in - the receiving element, all the info is inside the element. - Remove gst_segment_set_newsegment(): This function as used to accumulate - segments received from upstream, which is now not needed anymore because the - segment event contains the complete timing information. - -2011-05-10 11:50:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - gdp: Hide the GstStructure in GstEvent - Hide the GstStructure of the event in the implementation specific part so that - we can change it. - Add methods to check and make the event writable. - Add a new method to get a writable GstStructure of the element. - Avoid directly accising the event structure. - -2011-05-02 16:00:52 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/gdp/dataprotocol.h: - gdp: add docs for GstDPPacketizer - -2011-03-21 18:13:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - gdp: port code to new buffer data API - -2010-12-06 19:40:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - * gst/gdp/dataprotocol.h: - gdp: remove deprecated code - -2010-10-08 09:34:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - gdp: make public enum _get_type() functions thread-safe - Not that it is likely to matter in practice, but since these are public - API they should probably be thread-safe. - -2010-10-08 00:38:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/gdp/dataprotocol.c: - gdp: dataprotocol, lfocontrolsource: fix enum value name in enums that are public API - So run-time bindings can introspect the names correctly (we abuse this - field as description field only in elements, not for public API - (where the description belongs into the gtk-doc chunk). - https://bugzilla.gnome.org/show_bug.cgi?id=629946 - -2010-03-02 22:58:06 +0100 Benjamin Otte <otte@redhat.com> - - * gst/gdp/dataprotocol.c: - gdp: Fixes for -Wmissing-declarations -Wmissing-prototypes - Also adds those flags to the configure warning flags - https://bugzilla.gnome.org/show_bug.cgi?id=611692 - -2010-03-02 23:51:18 +0100 Benjamin Otte <otte@redhat.com> - - * gst/gdp/dp-private.h: - gdp: Make code safe for -Wredundant-decls - Adds that warning to configure.ac - Includes a tiny change of the GST_BOILERPLATE_FULL() macro: - The get_type() function is no longer declared before being defined. - https://bugzilla.gnome.org/show_bug.cgi?id=611692 - -2009-11-27 16:39:37 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/gdp/dataprotocol.c: - gdp: fix broken xrefs in docs - -2008-06-30 09:38:45 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gdp: Don't write to the same region of memory as a uint64 and uint16 as this breaks ... - Original commit message from CVS: - * libs/gst/dataprotocol/dataprotocol.c: - Don't write to the same region of memory as a uint64 and uint16 - as this breaks strict aliasing rules and apparantly breaks on PPC - and s390. Thanks to Sjoerd Simons for analysing. Fixes bug #348114. - -2008-03-27 15:23:55 +0000 Michael Smith <msmith@xiph.org> - - gdp: When calculating GDP body CRC, use the correct pointer. - Original commit message from CVS: - * libs/gst/dataprotocol/dataprotocol.c: - (gst_dp_packet_from_event_1_0): - When calculating GDP body CRC, use the correct pointer. - Fixes part of #522401. - -2008-02-29 12:41:33 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gdp: Correct all relevant warnings found by the sparse semantic code analyzer. This include marking several symbols static... - Original commit message from CVS: - * gst/gstconfig.h.in: - * libs/gst/base/gstcollectpads.c: (gst_collect_pads_read_buffer): - * libs/gst/check/gstcheck.c: (gst_check_log_message_func), - (gst_check_log_critical_func), (gst_check_drop_buffers), - (gst_check_element_push_buffer_list): - * libs/gst/controller/gstcontroller.c: (gst_controller_get), - (gst_controller_get_type): - * libs/gst/controller/gsthelper.c: (gst_object_control_properties), - (gst_object_get_controller), (gst_object_get_control_source): - * libs/gst/controller/gstinterpolationcontrolsource.c: - (gst_interpolation_control_source_new): - * libs/gst/controller/gstlfocontrolsource.c: - (gst_lfo_control_source_new): - * libs/gst/dataprotocol/dataprotocol.c: - (gst_dp_event_from_packet_0_2): - * plugins/elements/gstfdsrc.c: - * plugins/elements/gstmultiqueue.c: - * plugins/elements/gsttee.c: - * plugins/elements/gsttypefindelement.c: - * plugins/indexers/gstfileindex.c: (_file_index_id_save_xml), - (gst_file_index_add_association): - * plugins/indexers/gstmemindex.c: - * tests/benchmarks/gstpollstress.c: (mess_some_more): - * tests/check/elements/queue.c: (setup_queue): - * tests/check/gst/gstpipeline.c: - * tests/check/libs/collectpads.c: (setup), (teardown), - (gst_collect_pads_suite): - * tests/examples/adapter/adapter_test.c: - * tests/examples/metadata/read-metadata.c: (make_pipeline): - * tests/examples/xml/createxml.c: - * tests/examples/xml/runxml.c: - * tools/gst-inspect.c: - * tools/gst-run.c: - Correct all relevant warnings found by the sparse semantic code - analyzer. This include marking several symbols static, using - NULL instead of 0 for pointers, not using variable sized arrays - on the stack, moving variable declarations to the beginning of - a block and using "foo (void)" instead of "foo ()" for declarations. - -2008-01-08 02:07:38 +0000 Damien Lespiau <damien.lespiau@gmail.com> - - gdp: Fix empty prototypes. Fixes bug #507957. - Original commit message from CVS: - Patch by: Damien Lespiau <damien.lespiau@gmail.com> - * libs/gst/controller/gstcontroller.h: - * libs/gst/controller/gstcontrolsource.h: - * libs/gst/controller/gstinterpolationcontrolsource.h: - * libs/gst/controller/gstlfocontrolsource.h: - * libs/gst/dataprotocol/dataprotocol.h: - Fix empty prototypes. Fixes bug #507957. - -2007-11-01 21:50:05 +0000 Tim-Philipp Müller <tim@centricular.net> - - gdp: g_type_class_ref() other types as well, see #349410 and #64764. - Original commit message from CVS: - * gst/gst.c: (init_post): - * gst/gstevent.c: (_gst_event_initialize): - * gst/gstquery.c: (_gst_query_initialize): - * libs/gst/dataprotocol/dataprotocol.c (gst_dp_init): - g_type_class_ref() other types as well, see #349410 and #64764. - * gst/gstbuffer.c: (_gst_buffer_initialize): - * gst/gstmessage.c: (_gst_message_initialize): - Simplify existing g_type_class_ref(). - -2006-10-05 14:26:08 +0000 Tim-Philipp Müller <tim@centricular.net> - - gdp: Printf fixes. - Original commit message from CVS: - * gst/gstpad.c: (pre_activate): - * gst/gstregistry.c: (gst_registry_scan_path_level): - * gst/gstregistryxml.c: (load_plugin): - * libs/gst/controller/gstcontroller.c: - (gst_controlled_property_set_interpolation_mode): - * libs/gst/dataprotocol/dataprotocol.c: - (gst_dp_packet_from_event_1_0): - * libs/gst/net/gstnetclientclock.c: - (gst_net_client_clock_observe_times): - * plugins/elements/gstfdsrc.c: (gst_fd_src_create): - Printf fixes. - -2006-08-11 15:26:33 +0000 Andy Wingo <wingo@pobox.com> - - gdp: GST_DISABLE_DEPRECATED is only for users of API that don't want to see deprecated functions in the headers; people th... - Original commit message from CVS: - 2006-08-11 Andy Wingo <wingo@pobox.com> - * configure.ac: - * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packetizer_new): - * tests/check/libs/gdp.c: (gst_dp_suite): GST_DISABLE_DEPRECATED - is only for users of API that don't want to see deprecated - functions in the headers; people that want to compile out - deprecated code should pass -DGST_REMOVE_DEPRECATED into the - CFLAGS. Fixes the build of multifdsink, or will soon.. - -2006-08-10 19:46:14 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gdp: add gst_object_{s,g}et_control_rate(), add private data section, fix docs - Original commit message from CVS: - * docs/libs/gstreamer-libs-sections.txt: - * libs/gst/controller/gstcontroller.c: - (_gst_controller_get_property), (_gst_controller_set_property), - (_gst_controller_init), (_gst_controller_class_init): - * libs/gst/controller/gstcontroller.h: - * libs/gst/controller/gsthelper.c: (gst_object_get_control_rate), - (gst_object_set_control_rate): - API: add gst_object_{s,g}et_control_rate(), add private data section, - fix docs - * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packetizer_new): - * libs/gst/dataprotocol/dataprotocol.h: - add deprecation guards to make gtk-doc happy and allow disabling cruft - -2006-08-02 15:19:30 +0000 Wim Taymans <wim.taymans@gmail.com> - - gdp: Make debug category static - Original commit message from CVS: - * libs/gst/dataprotocol/dataprotocol.c: - (gst_dp_header_from_buffer_any), (gst_dp_packet_from_caps_any), - (gst_dp_crc), (gst_dp_header_payload_length), - (gst_dp_header_payload_type), (gst_dp_packet_from_event), - (gst_dp_packet_from_event_1_0), (gst_dp_buffer_from_header), - (gst_dp_caps_from_packet), (gst_dp_event_from_packet_0_2), - (gst_dp_event_from_packet), (gst_dp_validate_header), - (gst_dp_validate_payload): - Make debug category static - Constify the crc table. - Do some more arg checking in public functions. - Fix some docs and do some small cleanups. - * tests/check/libs/gdp.c: (GST_START_TEST), (gst_dp_suite): - Add some more checks to see if GDP deals with bogus input. - -2006-07-13 14:02:16 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gdp: fix failure to deserialize event packets with empty payload (only ev... - Original commit message from CVS: - * libs/gst/dataprotocol/dataprotocol.c: - (gst_dp_event_from_packet_1_0): - Fixes #347337: failure to deserialize event packets with - empty payload (only event type) - -2006-06-13 19:24:34 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gdp: add a gdp image to the docs - Original commit message from CVS: - * docs/README: - * docs/images/gdp-header.svg: - add a gdp image - * docs/libs/Makefile.am: - * docs/libs/gdp-header.png: - * libs/gst/dataprotocol/dataprotocol.c: - add it to the API docs - * docs/manual/intro-motivation.xml: - fix typo - -2006-06-06 14:29:54 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/dataprotocol.c: - gdp: add note to docs about GDP versioning; remove tmpl file - Original commit message from CVS: - add note to docs about GDP versioning; remove tmpl file - -2006-06-06 14:24:00 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gdp: add a GstDPPacketizer object, and create/free functions - Original commit message from CVS: - * libs/gst/dataprotocol/dataprotocol.c: - (gst_dp_header_from_buffer_any), (gst_dp_packet_from_caps_any), - (gst_dp_version_get_type), (gst_dp_init), - (gst_dp_header_from_buffer), (gst_dp_header_from_buffer_1_0), - (gst_dp_packet_from_caps), (gst_dp_packet_from_caps_1_0), - (gst_dp_packet_from_event), (gst_dp_packet_from_event_1_0), - (gst_dp_event_from_packet_0_2), (gst_dp_event_from_packet_1_0), - (gst_dp_event_from_packet), (gst_dp_packetizer_new), - (gst_dp_packetizer_free): - * libs/gst/dataprotocol/dataprotocol.h: - API: add a GstDPPacketizer object, and create/free functions - API: add GstDPVersion enum - Add 1.0 event function that uses the string serialization - Serialize more useful buffer flags - Fixes #343988 - -2006-06-02 16:46:19 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gdp: factor out CRC code - Original commit message from CVS: - * libs/gst/dataprotocol/dataprotocol.c: - (gst_dp_header_from_buffer), (gst_dp_packet_from_caps), - (gst_dp_packet_from_event): - factor out CRC code - -2006-06-02 10:58:47 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gdp: factor out some common header init code - Original commit message from CVS: - * libs/gst/dataprotocol/dataprotocol.c: - (gst_dp_header_from_buffer), (gst_dp_packet_from_caps), - (gst_dp_packet_from_event): - factor out some common header init code - -2006-06-02 10:08:31 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gdp: make gst_dp_crc() public - Original commit message from CVS: - * docs/libs/gstreamer-libs-sections.txt: - * docs/libs/tmpl/gstdataprotocol.sgml: - * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_crc): - * libs/gst/dataprotocol/dataprotocol.h: - API: make gst_dp_crc() public - -2006-06-01 11:13:44 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gdp: make sure we zero the whole ABI-compatible area - Original commit message from CVS: - * libs/gst/dataprotocol/dataprotocol.c: - (gst_dp_header_from_buffer): - make sure we zero the whole ABI-compatible area - -2006-05-08 15:53:12 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/dataprotocol.c: - gdp: whitespace, comment, doc fixup - Original commit message from CVS: - whitespace, comment, doc fixup - -2006-04-28 13:40:15 +0000 Michael Smith <msmith@xiph.org> - - gdp: Fixes in reading/writing events over GDP (not currently used?) - dereferencing ... - Original commit message from CVS: - * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event), - (gst_dp_event_from_packet): - Fixes in reading/writing events over GDP (not currently used?) - - dereferencing NULL events for unknown/invalid event types, memory - leak, and change g_warning to GST_WARNING. - -2006-03-10 15:30:27 +0000 Michael Smith <msmith@xiph.org> - - gdp: Fix docs for dataprocotol to not get the return types completely wrong for a fe... - Original commit message from CVS: - * libs/gst/dataprotocol/dataprotocol.c: - Fix docs for dataprocotol to not get the return types completely - wrong for a few functions. - -2005-12-18 16:04:41 +0000 Wim Taymans <wim.taymans@gmail.com> - - gdp: Documentation updates. - Original commit message from CVS: - * libs/gst/base/gstadapter.c: - * libs/gst/base/gstadapter.h: - * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init), - (gst_base_sink_get_position): - * libs/gst/base/gstbasesink.h: - * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init), - (gst_base_src_default_query), (gst_base_src_default_do_seek), - (gst_base_src_do_seek), (gst_base_src_perform_seek), - (gst_base_src_send_event), (gst_base_src_update_length), - (gst_base_src_get_range), (gst_base_src_loop), - (gst_base_src_start): - * libs/gst/base/gstbasesrc.h: - * libs/gst/base/gstbasetransform.h: - * libs/gst/base/gstcollectpads.h: - * libs/gst/base/gstpushsrc.c: - * libs/gst/base/gstpushsrc.h: - * libs/gst/dataprotocol/dataprotocol.c: - * libs/gst/dataprotocol/dataprotocol.h: - * libs/gst/net/gstnetclientclock.h: - * libs/gst/net/gstnettimeprovider.h: - Documentation updates. - -2005-10-13 16:26:12 +0000 Andy Wingo <wingo@pobox.com> - - gdp: Fix Timmeke Waymans bug. - Original commit message from CVS: - 2005-10-13 Andy Wingo <wingo@pobox.com> - * libs/gst/dataprotocol/dataprotocol.c (gst_dp_packet_from_caps): - Fix Timmeke Waymans bug. - (gst_dp_caps_from_packet): Make sure we pass a NUL-terminated - string of the proper length to gst_caps_from_string. There's a - potential for, before this fix, that this could cause someone - connecting over the network to cause a segfault if the payload is - not NUL-terminated. - -2005-10-10 23:55:39 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/dataprotocol.c: - gdp: fix more valgrind warnings before turning up the heat - Original commit message from CVS: - fix more valgrind warnings before turning up the heat - -2005-10-08 17:17:25 +0000 Wim Taymans <wim.taymans@gmail.com> - - gdp: It's about time we bump the version number. - Original commit message from CVS: - * libs/gst/dataprotocol/dataprotocol.c: - (gst_dp_header_from_buffer), (gst_dp_packet_from_caps), - (gst_dp_packet_from_event): - * libs/gst/dataprotocol/dataprotocol.h: - * libs/gst/dataprotocol/dp-private.h: - It's about time we bump the version number. - Since event types don't fit in the guint8 anymore describing - the payload type, make payload type 16 bits wide. - -2005-09-27 16:30:26 +0000 Andy Wingo <wingo@pobox.com> - - gdp: Fix error-checking return values. - Original commit message from CVS: - 2005-09-27 Andy Wingo <wingo@pobox.com> - * libs/gst/dataprotocol/dataprotocol.c: Fix error-checking return - values. - -2005-07-27 19:00:36 +0000 Wim Taymans <wim.taymans@gmail.com> - - gdp: Fix serialization of seek events. - Original commit message from CVS: - * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event), - (gst_dp_event_from_packet): - Fix serialization of seek events. - -2005-07-27 18:33:03 +0000 Wim Taymans <wim.taymans@gmail.com> - - gdp: Some docs updates - Original commit message from CVS: - * CHANGES-0.9: - * docs/design/part-TODO.txt: - * docs/design/part-events.txt: - Some docs updates - * gst/base/gstbasesink.c: (gst_base_sink_handle_object), - (gst_base_sink_event), (gst_base_sink_do_sync), - (gst_base_sink_activate_push), (gst_base_sink_activate_pull): - * gst/base/gstbasesrc.c: (gst_base_src_send_discont), - (gst_base_src_do_seek), (gst_base_src_event_handler), - (gst_base_src_loop): - * gst/base/gstbasetransform.c: (gst_base_transform_transform_caps), - (gst_base_transform_configure_caps), (gst_base_transform_setcaps), - (gst_base_transform_get_size), (gst_base_transform_buffer_alloc), - (gst_base_transform_event), (gst_base_transform_handle_buffer), - (gst_base_transform_set_passthrough), - (gst_base_transform_is_passthrough): - * gst/elements/gstfakesink.c: (gst_fake_sink_event): - * gst/elements/gstfilesink.c: (gst_file_sink_event): - Event updates. - * gst/gstbuffer.h: - Use faster casts. - * gst/gstelement.c: (gst_element_seek): - * gst/gstelement.h: - Update gst_element_seek. - * gst/gstevent.c: (gst_event_finalize), (_gst_event_copy), - (gst_event_new), (gst_event_new_custom), (gst_event_get_structure), - (gst_event_new_flush_start), (gst_event_new_flush_stop), - (gst_event_new_eos), (gst_event_new_newsegment), - (gst_event_parse_newsegment), (gst_event_new_tag), - (gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos), - (gst_event_parse_qos), (gst_event_new_seek), - (gst_event_parse_seek), (gst_event_new_navigation): - * gst/gstevent.h: - Make GstEvent use GstStructure. Add parsing code, make sure the - API is sufficiently generic. - Mark possible directions of events and serialization. - * gst/gstmessage.c: (gst_message_init), (gst_message_finalize), - (_gst_message_copy), (gst_message_new_segment_start), - (gst_message_new_segment_done), (gst_message_new_custom), - (gst_message_parse_segment_start), - (gst_message_parse_segment_done): - Small cleanups. - * gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps), - (gst_pad_set_caps), (gst_pad_send_event): - Update for new events. - Catch events sent in wrong directions. - * gst/gstqueue.c: (gst_queue_link_src), - (gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop), - (gst_queue_handle_src_query): - Event updates. - * gst/gsttag.c: - * gst/gsttag.h: - Remove event code from this file. - * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event), - (gst_dp_event_from_packet): - Event updates. - -2005-07-05 10:20:14 +0000 Wim Taymans <wim.taymans@gmail.com> - - gdp: Ported dataprotol to 0.9. - Original commit message from CVS: - * configure.ac: - * libs/gst/dataprotocol/Makefile.am: - * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_validate_packet): - * libs/gst/dataprotocol/dataprotocol.h: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in: - * pkgconfig/gstreamer-dataprotocol.pc.in: - Ported dataprotol to 0.9. - Added pkgconfig files. - -2005-05-16 20:21:55 +0000 David Schleef <ds@schleef.org> - - gdp: remove GstData checks - Original commit message from CVS: - * check/Makefile.am: remove GstData checks - * check/gst-libs/gdp.c: (START_TEST): fix for API changes - * gst/Makefile.am: add miniobject, remove data - * gst/gst.h: add miniobject, remove data - * gst/gstdata.c: remove - * gst/gstdata.h: remove - * gst/gstdata_private.h: remove - * gst/gsttypes.h: remove GstEvent and GstMessage - * gst/gstelement.c: (gst_element_post_message): fix for API changes - * gst/gstmarshal.list: change BOXED -> OBJECT - Implement GstMiniObject. - * gst/gstminiobject.c: - * gst/gstminiobject.h: - Modify to be subclasses of GstMiniObject. - * gst/gstbuffer.c: (_gst_buffer_initialize), (gst_buffer_get_type), - (gst_buffer_class_init), (gst_buffer_finalize), (_gst_buffer_copy), - (gst_buffer_init), (gst_buffer_new), (gst_buffer_new_and_alloc), - (gst_subbuffer_get_type), (gst_subbuffer_init), - (gst_buffer_create_sub), (gst_buffer_is_span_fast), - (gst_buffer_span): - * gst/gstbuffer.h: - * gst/gstevent.c: (_gst_event_initialize), (gst_event_get_type), - (gst_event_class_init), (gst_event_init), (gst_event_finalize), - (_gst_event_copy), (gst_event_new): - * gst/gstevent.h: - * gst/gstmessage.c: (_gst_message_initialize), - (gst_message_get_type), (gst_message_class_init), - (gst_message_init), (gst_message_finalize), (_gst_message_copy), - (gst_message_new), (gst_message_new_error), - (gst_message_new_warning), (gst_message_new_tag), - (gst_message_new_state_changed), (gst_message_new_application): - * gst/gstmessage.h: - * gst/gstprobe.c: (gst_probe_perform), - (gst_probe_dispatcher_dispatch): - * gst/gstprobe.h: - * gst/gstquery.c: (_gst_query_initialize), (gst_query_get_type), - (gst_query_class_init), (gst_query_finalize), (gst_query_init), - (_gst_query_copy), (gst_query_new): - Update elements for GstData -> GstMiniObject changes - * gst/gstquery.h: - * gst/gstqueue.c: (gst_queue_finalize), (gst_queue_locked_flush), - (gst_queue_chain), (gst_queue_loop): - * gst/elements/gstbufferstore.c: - (gst_buffer_store_add_buffer_func), - (gst_buffer_store_cleared_func), (gst_buffer_store_get_buffer): - * gst/elements/gstfakesink.c: (gst_fakesink_class_init), - (gst_fakesink_render): - * gst/elements/gstfakesrc.c: (gst_fakesrc_class_init): - * gst/elements/gstfilesrc.c: (gst_mmap_buffer_get_type), - (gst_mmap_buffer_class_init), (gst_mmap_buffer_init), - (gst_mmap_buffer_finalize), (gst_filesrc_map_region), - (gst_filesrc_create_read): - * gst/elements/gstidentity.c: (gst_identity_class_init): - * gst/elements/gsttypefindelement.c: - (gst_type_find_element_src_event), (free_entry_buffers), - (gst_type_find_element_handle_event): - * libs/gst/dataprotocol/dataprotocol.c: - (gst_dp_header_from_buffer): - * libs/gst/dataprotocol/dataprotocol.h: - * libs/gst/dataprotocol/dp-private.h: - -2005-05-04 21:29:44 +0000 Andy Wingo <wingo@pobox.com> - - gdp: GCC 4 fixen. - Original commit message from CVS: - 2005-05-04 Andy Wingo <wingo@pobox.com> - * check/Makefile.am: - * docs/gst/tmpl/gstatomic.sgml: - * docs/gst/tmpl/gstplugin.sgml: - * gst/base/gstbasesink.c: (gst_basesink_activate): - * gst/base/gstbasesrc.c: (gst_basesrc_class_init), - (gst_basesrc_init), (gst_basesrc_set_dataflow_funcs), - (gst_basesrc_query), (gst_basesrc_set_property), - (gst_basesrc_get_property), (gst_basesrc_check_get_range), - (gst_basesrc_activate): - * gst/base/gstbasesrc.h: - * gst/base/gstbasetransform.c: (gst_base_transform_sink_activate), - (gst_base_transform_src_activate): - * gst/elements/gstelements.c: - * gst/elements/gstfakesrc.c: (gst_fakesrc_class_init), - (gst_fakesrc_set_property), (gst_fakesrc_get_property): - * gst/elements/gsttee.c: (gst_tee_sink_activate): - * gst/elements/gsttypefindelement.c: (find_element_get_length), - (gst_type_find_element_checkgetrange), - (gst_type_find_element_activate): - * gst/gstbin.c: (gst_bin_save_thyself), (gst_bin_restore_thyself): - * gst/gstcaps.c: (gst_caps_do_simplify), (gst_caps_save_thyself), - (gst_caps_load_thyself): - * gst/gstelement.c: (gst_element_pads_activate), - (gst_element_save_thyself), (gst_element_restore_thyself): - * gst/gstpad.c: (gst_pad_load_and_link), (gst_pad_save_thyself), - (gst_ghost_pad_save_thyself), (gst_pad_check_pull_range): - * gst/gstpad.h: - * gst/gstxml.c: (gst_xml_write), (gst_xml_parse_doc), - (gst_xml_parse_file), (gst_xml_parse_memory), - (gst_xml_get_element), (gst_xml_make_element): - * gst/indexers/gstfileindex.c: (gst_file_index_load), - (_file_index_id_save_xml), (gst_file_index_commit): - * gst/registries/gstlibxmlregistry.c: (read_string), (read_uint), - (read_enum), (load_pad_template), (load_feature), (load_plugin), - (load_paths): - * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_caps), - (gst_dp_packet_from_event), (gst_dp_caps_from_packet): - * tools/gst-complete.c: (main): - * tools/gst-compprep.c: (main): - * tools/gst-inspect.c: (print_element_properties_info): - * tools/gst-launch.c: (xmllaunch_parse_cmdline): - * tools/gst-xmlinspect.c: (print_element_properties): - GCC 4 fixen. - -2005-03-21 17:34:02 +0000 Wim Taymans <wim.taymans@gmail.com> - - * gst/gdp/dataprotocol.c: - gdp: Next big merge. - Original commit message from CVS: - Next big merge. - Added GstBus for mainloop integration. - Added GstMessage for sending notifications on the bus. - Added GstTask as an abstraction for pipeline entry points. - Removed GstThread. - Removed Schedulers. - Simplified GstQueue for multithreaded core. - Made _link threadsafe, removed old capsnego. - Added STREAM_LOCK and PREROLL_LOCK in GstPad. - Added pad blocking functions. - Reworked scheduling functions in GstPad to prepare for - scheduling updates soon. - Moved events out of data stream. - Simplified GstEvent types. - Added return values to push/pull. - Removed clocking from GstElement. - Added prototypes for state change function for next merge. - Removed iterate from bins and state change management. - Fixed some elements, disabled others for now. - Fixed -inspect and -launch. - Added check for GstBus. - -2005-03-07 18:27:42 +0000 Wim Taymans <wim.taymans@gmail.com> - - * gst/gdp/dataprotocol.c: - gdp: First THREADED backport attempt, focusing on adding locks and making sure the API is threadsafe. Needs more work. Mor... - Original commit message from CVS: - First THREADED backport attempt, focusing on adding locks and - making sure the API is threadsafe. Needs more work. More docs - follow this week. - -2005-02-18 13:58:36 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gdp: Allocate the 1 byte more memory that was forgotten!!!!! - Original commit message from CVS: - 2005-02-18 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_dump_byte_array): - Allocate the 1 byte more memory that was forgotten!!!!! - -2004-10-01 16:49:01 +0000 Wim Taymans <wim.taymans@gmail.com> - - gdp: Fix threadsafety of the crc checking function. - Original commit message from CVS: - * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_crc): - Fix threadsafety of the crc checking function. - -2004-08-16 10:35:36 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/dataprotocol.c: - gdp: fix for #150242 - Original commit message from CVS: - fix for #150242 - -2004-07-28 10:22:07 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/dataprotocol.c: - gdp: doc style fixes - Original commit message from CVS: - doc style fixes - -2004-06-09 16:24:19 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/dataprotocol.c: - * gst/gdp/dataprotocol.h: - * gst/gdp/dp-private.h: - gdp: bump GDP to 0.1, add buffer flags - Original commit message from CVS: - bump GDP to 0.1, add buffer flags - -2004-05-24 16:38:15 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/dataprotocol.h: - gdp: wrap header in _NEW - Original commit message from CVS: - wrap header in _NEW - -2004-05-19 17:22:53 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/dataprotocol.c: - * gst/gdp/dp-private.h: - Original commit message from CVS: use GST macros; add asserts - -2004-05-19 16:59:39 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/dp-private.h: - gdp: private prototype - Original commit message from CVS: - private prototype - -2004-05-19 16:37:53 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/dataprotocol.c: - * gst/gdp/dataprotocol.h: - * gst/gdp/dp-private.h: - gdp: add dataprotocol - Original commit message from CVS: - clean up libs docs; add dataprotocol - -2011-11-17 12:48:25 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - add parent to pad functions - -2011-11-10 18:32:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdpdepay.c: - update for adapter api changes - -2011-09-29 13:46:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - tests: update for new audio caps - -2011-07-08 20:02:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/gdp/gstgdppay.c: - gdppay: parse caps event and payload caps - Which makes it actually output stuff. - -2011-06-13 16:32:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdppay.c: - -base: update for buffer API change - -2011-05-16 13:48:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - -base: port to new SEGMENT API - -2011-05-09 18:16:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdppay.c: - segment: fix for new core API - Fix for gst_*_segment_full rename. - -2011-05-09 13:05:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - -base: don't use buffer caps - Port to newest 0.11 core API, remove GST_PAD_CAPS and GST_BUFFER_CAPS. - -2011-04-19 11:35:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - gst: Use G_DEFINE_TYPE instead of GST_BOILERPLATE - -2011-01-27 17:28:51 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/gdp/Makefile.am: - android: make it ready for androgenizer - Remove the android/ top dir - Fixe the Makefile.am to be androgenized - To build gstreamer for android we are now using androgenizer which generates the - needed Android.mk files. - Androgenizer can be found here: - http://git.collabora.co.uk/?p=user/derek/androgenizer.git - -2011-03-31 17:47:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdppay.c: - bufferlist: fixes for new API - -2011-03-28 17:46:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/elements/gdppay.c: - tests: fix more unit tests - -2011-03-28 15:51:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/pipelines/streamheader.c: - tests: fix remaining unit tests - -2011-03-28 14:12:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - tests: work on porting the unit tests - -2011-03-27 16:35:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - plugins: port some plugins to the new memory API - -2011-02-09 12:45:23 +0100 Andoni Morales Alastruey <amorales@flumotion.com> - - * gst/gdp/gstgdppay.c: - gdppay: ensure buffer's metadata is writable before setting caps - -2011-01-16 14:55:46 -0800 David Schleef <ds@schleef.org> - - * gst/gdp/gstgdppay.c: - gdppay: make newsegment buffer metadata writable - -2010-06-18 16:37:14 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - tests: use our own macros for the tests main function - -2010-03-15 22:49:53 +0100 Benjamin Otte <otte@redhat.com> - - * tests/check/elements/gdpdepay.c: - Add -Wwrite-strings to configure - Fixes for the code included - -2010-03-16 15:45:23 +0100 Benjamin Otte <otte@redhat.com> - - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - gst_element_class_set_details => gst_element_class_set_details_simple - Also change my email from the old university one to the current one. - -2010-03-11 13:32:14 +0100 Benjamin Otte <otte@redhat.com> - - * gst/gdp/gstgdpdepay.h: - * gst/gdp/gstgdppay.h: - Add -Wmissing-declarations -Wmissing-prototypes to warning flags - Includes all the fixes necessary to make stuff compile again. - -2009-11-05 15:42:09 +0100 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/gdp/gstgdpdepay.c: - gdpdepay: Clear adapter on flush and state change - Fixes #600469 - -2009-10-28 00:59:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - Remove GST_DEBUG_FUNCPTR where they're pointless - There's not much point in using GST_DEBUG_FUNCPTR with GObject - virtual functions such as get_property, set_propery, finalize and - dispose, since they'll never be used by anyone anyway. Saves a - few bytes and possibly a sixteenth of a polar bear. - -2009-09-22 11:58:26 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/gdp/gstgdppay.c: - gdppay: Don't repeat tags buffers for every new segment - Only send a tag buffer when one is received, not after every new segment - event/update. - -2009-08-27 18:59:49 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/gdp/gstgdppay.c: - Bug 593035 - set IN_CAPS for streamheader buffer - -2009-08-10 15:40:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/pipelines/streamheader.c: - streamheader: Fix caps leak in the vorbisenc unit test - -2009-08-10 14:14:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/pipelines/streamheader.c: - checks: fix stream header unit test hanging in gst_task_cleanup_all() - Set pipelines to NULL state and unref when done. - -2009-05-27 12:10:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gdp/gstgdppay.c: - gdppay: set caps on outgoing buffers - Set caps on outgoing buffers because NULL caps confuse basetransform. - Fixes #583867 - -2008-10-16 15:07:00 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Don't install static libs for plugins. Fixes #550851 for base. - Original commit message from CVS: - * ext/alsa/Makefile.am: - * ext/cdparanoia/Makefile.am: - * ext/gio/Makefile.am: - * ext/gnomevfs/Makefile.am: - * ext/libvisual/Makefile.am: - * ext/ogg/Makefile.am: - * ext/pango/Makefile.am: - * ext/theora/Makefile.am: - * ext/vorbis/Makefile.am: - * gst/adder/Makefile.am: - * gst/audioconvert/Makefile.am: - * gst/audiorate/Makefile.am: - * gst/audioresample/Makefile.am: - * gst/audiotestsrc/Makefile.am: - * gst/ffmpegcolorspace/Makefile.am: - * gst/gdp/Makefile.am: - * gst/playback/Makefile.am: - * gst/subparse/Makefile.am: - * gst/tcp/Makefile.am: - * gst/typefind/Makefile.am: - * gst/videorate/Makefile.am: - * gst/videoscale/Makefile.am: - * gst/videotestsrc/Makefile.am: - * gst/volume/Makefile.am: - * sys/v4l/Makefile.am: - * sys/ximage/Makefile.am: - * sys/xvimage/Makefile.am: - Don't install static libs for plugins. Fixes #550851 for base. - -2008-07-10 21:06:06 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Cleanup Plugin docs. Link to signals and properties. Fix sub-section titles. Drop mentining that all our example pipe... - Original commit message from CVS: - * docs/plugins/gst-plugins-base-plugins-docs.sgml: - * docs/plugins/gst-plugins-base-plugins-overrides.txt: - * docs/plugins/gst-plugins-base-plugins-sections.txt: - * docs/plugins/gst-plugins-base-plugins.args: - * docs/plugins/gst-plugins-base-plugins.hierarchy: - * docs/plugins/gst-plugins-base-plugins.interfaces: - * docs/plugins/gst-plugins-base-plugins.prerequisites: - * docs/plugins/gst-plugins-base-plugins.signals: - * docs/plugins/inspect/plugin-adder.xml: - * docs/plugins/inspect/plugin-alsa.xml: - * docs/plugins/inspect/plugin-audioconvert.xml: - * docs/plugins/inspect/plugin-audiorate.xml: - * docs/plugins/inspect/plugin-audioresample.xml: - * docs/plugins/inspect/plugin-audiotestsrc.xml: - * docs/plugins/inspect/plugin-cdparanoia.xml: - * docs/plugins/inspect/plugin-decodebin.xml: - * docs/plugins/inspect/plugin-ffmpegcolorspace.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-gnomevfs.xml: - * docs/plugins/inspect/plugin-libvisual.xml: - * docs/plugins/inspect/plugin-ogg.xml: - * docs/plugins/inspect/plugin-pango.xml: - * docs/plugins/inspect/plugin-playback.xml: - * docs/plugins/inspect/plugin-queue2.xml: - * docs/plugins/inspect/plugin-subparse.xml: - * docs/plugins/inspect/plugin-tcp.xml: - * docs/plugins/inspect/plugin-theora.xml: - * docs/plugins/inspect/plugin-typefindfunctions.xml: - * docs/plugins/inspect/plugin-uridecodebin.xml: - * docs/plugins/inspect/plugin-video4linux.xml: - * docs/plugins/inspect/plugin-videorate.xml: - * docs/plugins/inspect/plugin-videoscale.xml: - * docs/plugins/inspect/plugin-videotestsrc.xml: - * docs/plugins/inspect/plugin-volume.xml: - * docs/plugins/inspect/plugin-vorbis.xml: - * docs/plugins/inspect/plugin-ximagesink.xml: - * docs/plugins/inspect/plugin-xvimagesink.xml: - * ext/alsa/gstalsamixer.c: - * ext/alsa/gstalsasink.c: - * ext/alsa/gstalsasrc.c: - * ext/gio/gstgiosink.c: - * ext/gio/gstgiosrc.c: - * ext/gio/gstgiostreamsink.c: - * ext/gio/gstgiostreamsrc.c: - * ext/gnomevfs/gstgnomevfssink.c: - * ext/gnomevfs/gstgnomevfssrc.c: - * ext/ogg/gstoggdemux.c: - * ext/ogg/gstoggmux.c: - * ext/pango/gstclockoverlay.c: - * ext/pango/gsttextoverlay.c: - * ext/pango/gsttextrender.c: - * ext/pango/gsttimeoverlay.c: - * ext/theora/theoradec.c: - * ext/theora/theoraenc.c: - * ext/theora/theoraparse.c: - * ext/vorbis/vorbisdec.c: - * ext/vorbis/vorbisenc.c: - * ext/vorbis/vorbisparse.c: - * ext/vorbis/vorbistag.c: - * gst/adder/gstadder.c: - * gst/audioconvert/gstaudioconvert.c: - * gst/audioresample/gstaudioresample.c: - * gst/audiotestsrc/gstaudiotestsrc.c: - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - * gst/playback/gstdecodebin2.c: - * gst/playback/gstplaybin.c: - * gst/playback/gstplaybin2.c: - * gst/playback/gstqueue2.c: - * gst/playback/gsturidecodebin.c: - * gst/tcp/gstmultifdsink.c: - * gst/tcp/gsttcpserversink.c: - * gst/videorate/gstvideorate.c: - * gst/videoscale/gstvideoscale.c: - * gst/videotestsrc/gstvideotestsrc.c: - * gst/volume/gstvolume.c: - * sys/ximage/ximagesink.c: - * sys/xvimage/xvimagesink.c: - Cleanup Plugin docs. Link to signals and properties. Fix sub-section - titles. Drop mentining that all our example pipelines are "simple" - pipelines. - -2008-06-30 09:46:15 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/: Enable unit tests on PPC again as the bugs are now fixed. - Original commit message from CVS: - * tests/check/elements/gdpdepay.c: (gdpdepay_suite): - * tests/check/pipelines/streamheader.c: (streamheader_suite): - Enable unit tests on PPC again as the bugs are now fixed. - -2008-06-20 08:45:13 +0000 Antoine Tremblay <hexa00@gmail.com> - - gst/gdp/gstgdppay.c: Fix a buffer memleak and remove a confusing and wrong debug output. - Original commit message from CVS: - Patch by: Antoine Tremblay <hexa00 at gmail dot com> - * gst/gdp/gstgdppay.c: (gst_gdp_pay_reset): - Fix a buffer memleak and remove a confusing and wrong debug output. - Fixes bug #538663. - -2008-06-04 16:00:26 +0000 Peter Kjellerstedt <pkj@axis.com> - - tests/check/pipelines/streamheader.c: Do not try to run a test which requires vorbisenc unless we have actually built... - Original commit message from CVS: - * tests/check/pipelines/streamheader.c: (buffer_probe_cb), - (test_multifdsink_gdp_vorbisenc), (streamheader_suite): - Do not try to run a test which requires vorbisenc unless we have - actually built it. - -2008-06-04 05:58:38 +0000 Antoine Tremblay <hexa00@gmail.com> - - gst/gdp/gstgdppay.c: Don't set caps on the buffers that contain a copy of the buffer including the caps of them resul... - Original commit message from CVS: - Patch by: Antoine Tremblay <hexa00 at gmail dot com> - * gst/gdp/gstgdppay.c: (gst_gdp_pay_reset_streamheader): - Don't set caps on the buffers that contain a copy of the buffer - including the caps of them resulting in an always increasing refcount - of the caps and insanely large caps. Instead include a buffer without - caps in the new caps. Fixes bug #536475. - -2008-05-22 22:09:16 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Add some documentation comments, and some new headers to be scanned. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-base-plugins-overrides.txt: - * docs/plugins/gst-plugins-base-plugins-sections.txt: - * docs/plugins/gst-plugins-base-plugins.args: - * docs/plugins/gst-plugins-base-plugins.hierarchy: - * docs/plugins/gst-plugins-base-plugins.interfaces: - * docs/plugins/gst-plugins-base-plugins.prerequisites: - * docs/plugins/inspect/plugin-adder.xml: - * docs/plugins/inspect/plugin-alsa.xml: - * docs/plugins/inspect/plugin-audioconvert.xml: - * docs/plugins/inspect/plugin-audiorate.xml: - * docs/plugins/inspect/plugin-audioresample.xml: - * docs/plugins/inspect/plugin-audiotestsrc.xml: - * docs/plugins/inspect/plugin-cdparanoia.xml: - * docs/plugins/inspect/plugin-decodebin.xml: - * docs/plugins/inspect/plugin-ffmpegcolorspace.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-gio.xml: - * docs/plugins/inspect/plugin-gnomevfs.xml: - * docs/plugins/inspect/plugin-libvisual.xml: - * docs/plugins/inspect/plugin-ogg.xml: - * docs/plugins/inspect/plugin-pango.xml: - * docs/plugins/inspect/plugin-playback.xml: - * docs/plugins/inspect/plugin-queue2.xml: - * docs/plugins/inspect/plugin-subparse.xml: - * docs/plugins/inspect/plugin-tcp.xml: - * docs/plugins/inspect/plugin-theora.xml: - * docs/plugins/inspect/plugin-typefindfunctions.xml: - * docs/plugins/inspect/plugin-uridecodebin.xml: - * docs/plugins/inspect/plugin-video4linux.xml: - * docs/plugins/inspect/plugin-videorate.xml: - * docs/plugins/inspect/plugin-videoscale.xml: - * docs/plugins/inspect/plugin-videotestsrc.xml: - * docs/plugins/inspect/plugin-volume.xml: - * docs/plugins/inspect/plugin-vorbis.xml: - * docs/plugins/inspect/plugin-ximagesink.xml: - * docs/plugins/inspect/plugin-xvimagesink.xml: - * ext/cdparanoia/gstcdparanoiasrc.c: - * ext/ogg/gstoggdemux.c: - * ext/ogg/gstoggdemux.h: - * ext/ogg/gstoggmux.c: - * ext/ogg/gstoggmux.h: - * gst/audioconvert/audioconvert.c: - * gst/audioconvert/audioconvert.h: - * gst/audioconvert/gstaudioconvert.h: - * gst/gdp/gstgdpdepay.h: - * gst/gdp/gstgdppay.h: - * gst/playback/gstdecodebin.c: - * gst/playback/gstdecodebin2.c: - * gst/playback/gstplaybin.c: - * gst/playback/gstplaybin2.c: - * gst/playback/gsturidecodebin.c: - * gst/tcp/gstmultifdsink.c: - * gst/tcp/gstmultifdsink.h: - * gst/tcp/gsttcp.h: - Add some documentation comments, and some new headers to be scanned. - Rename some internal enum declarations (audioconvert's DitherType and - NoiseShapingType, GstUnitType from the TCP elements) to match the - documented GObject type names so that the docs pick them up. - Name the playbin2 docs markups properly so they get picked up. They'll - need renaming back when/if playbin2 becomes playbin. - 100% symbol coverage for the plugin docs, booya. - -2008-05-21 16:36:50 +0000 Wim Taymans <wim.taymans@gmail.com> - - Don't use bad gst_element_get_pad(). - Original commit message from CVS: - * ext/ogg/gstoggdemux.c: (gst_ogg_pad_typefind): - * gst/playback/decodetest.c: (new_decoded_pad_cb): - * gst/playback/gstdecodebin.c: (gst_decode_bin_init), - (try_to_link_1), (elem_is_dynamic), (close_link), (type_found), - (cleanup_decodebin): - * gst/playback/gstdecodebin2.c: (gst_decode_bin_init), - (connect_element), (gst_decode_group_control_demuxer_pad): - * gst/playback/gstplaybasebin.c: (queue_remove_probe), - (queue_out_of_data), (gen_preroll_element), (preroll_unlinked), - (mute_group_type): - * gst/playback/gstplaybin.c: (gst_play_bin_vis_blocked), - (gst_play_bin_set_property), (handoff), (gen_video_element), - (gen_text_element), (gen_audio_element), (gen_vis_element), - (remove_sinks), (add_sink), (setup_sinks): - * gst/playback/gstplaybin2.c: (pad_added_cb), (no_more_pads_cb): - * gst/playback/gstplaysink.c: (gst_play_sink_get_video_sink), - (gst_play_sink_get_audio_sink), (gst_play_sink_vis_unblocked), - (gst_play_sink_vis_blocked), (gst_play_sink_set_vis_plugin), - (gst_play_sink_get_vis_plugin), (gst_play_sink_set_mute), - (gen_video_chain), (gen_text_chain), (gen_audio_chain), - (gen_vis_chain), (gst_play_sink_reconfigure), - (gst_play_sink_set_font_desc), (gst_play_sink_get_font_desc), - (gst_play_sink_request_pad): - * gst/playback/gsturidecodebin.c: (type_found), (setup_source): - * gst/playback/test.c: (gen_video_element), (gen_audio_element), - (cb_newpad): - * gst/playback/test6.c: (new_decoded_pad_cb): - * tests/check/elements/audioconvert.c: (GST_START_TEST): - * tests/check/elements/audiorate.c: (test_injector_chain), - (do_perfect_stream_test): - * tests/check/elements/ffmpegcolorspace.c: (GST_START_TEST): - * tests/check/elements/gdpdepay.c: (GST_START_TEST): - * tests/check/elements/gnomevfssink.c: - * tests/check/elements/textoverlay.c: - (notgst_check_setup_src_pad2), (notgst_check_teardown_src_pad2): - * tests/check/elements/videotestsrc.c: (GST_START_TEST): - * tests/check/libs/cddabasesrc.c: (GST_START_TEST): - * tests/check/pipelines/oggmux.c: (test_pipeline): - * tests/check/pipelines/streamheader.c: (GST_START_TEST): - * tests/check/pipelines/theoraenc.c: (GST_START_TEST): - * tests/check/pipelines/vorbisenc.c: (GST_START_TEST): - * tests/examples/seek/scrubby.c: (make_wav_pipeline): - * tests/examples/seek/seek.c: (make_mod_pipeline), - (make_dv_pipeline), (make_wav_pipeline), (make_flac_pipeline), - (make_sid_pipeline), (make_parse_pipeline), (make_vorbis_pipeline), - (make_theora_pipeline), (make_vorbis_theora_pipeline), - (make_avi_msmpeg4v3_mp3_pipeline), (make_mp3_pipeline), - (make_avi_pipeline), (make_mpeg_pipeline), (make_mpegnt_pipeline), - (update_fill), (msg_buffering): - Don't use bad gst_element_get_pad(). - -2008-05-21 06:45:22 +0000 Antoine Tremblay <hexa00@gmail.com> - - gst/gdp/gstgdppay.c: Close a buffer memory leak. Fixes bug #534071. - Original commit message from CVS: - Patch by: Antoine Tremblay <hexa00 at gmail dot com> - * gst/gdp/gstgdppay.c: (gst_gdp_pay_chain): - Close a buffer memory leak. Fixes bug #534071. - -2008-04-18 14:54:01 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/gdp/gstgdpdepay.c: Don't validate the payload if there isn't any. - Original commit message from CVS: - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain): - Don't validate the payload if there isn't any. - Fixes #525915 - -2008-03-27 15:26:38 +0000 Michael Smith <msmith@xiph.org> - - gst/gdp/gstgdpdepay.c: Check the body CRC (if set) when depayloading. - Original commit message from CVS: - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain): - Check the body CRC (if set) when depayloading. - Fixes #522401. - -2008-03-23 13:12:41 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/check/elements/gdpdepay.c: Make test compile without unused function/variable warnings on PPC. - Original commit message from CVS: - * tests/check/elements/gdpdepay.c: - Make test compile without unused function/variable warnings on PPC. - -2008-03-22 15:00:53 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Use G_PARAM_STATIC_STRINGS everywhere for GParamSpecs that use static strings (i.e. all). This gives us less memory u... - Original commit message from CVS: - * configure.ac: - * ext/alsa/gstalsamixerelement.c: - (gst_alsa_mixer_element_class_init): - * ext/alsa/gstalsasink.c: (gst_alsasink_class_init): - * ext/alsa/gstalsasrc.c: (gst_alsasrc_class_init): - * ext/cdparanoia/gstcdparanoiasrc.c: - (gst_cd_paranoia_src_class_init): - * ext/gio/gstgiosink.c: (gst_gio_sink_class_init): - * ext/gio/gstgiosrc.c: (gst_gio_src_class_init): - * ext/gio/gstgiostreamsink.c: (gst_gio_stream_sink_class_init): - * ext/gio/gstgiostreamsrc.c: (gst_gio_stream_src_class_init): - * ext/gnomevfs/gstgnomevfssink.c: (gst_gnome_vfs_sink_class_init): - * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_class_init): - * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init): - * ext/pango/gsttextoverlay.c: (gst_text_overlay_class_init): - * ext/pango/gsttextrender.c: (gst_text_render_class_init): - * ext/theora/theoradec.c: (gst_theora_dec_class_init): - * ext/theora/theoraenc.c: (gst_theora_enc_class_init): - * ext/theora/theoraparse.c: (gst_theora_parse_class_init): - * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_class_init): - * gst-libs/gst/audio/gstaudiofiltertemplate.c: - (gst_audio_filter_template_class_init): - * gst-libs/gst/audio/gstbaseaudiosink.c: - (gst_base_audio_sink_class_init): - * gst-libs/gst/audio/gstbaseaudiosrc.c: - (gst_base_audio_src_class_init): - * gst-libs/gst/cdda/gstcddabasesrc.c: - (gst_cdda_base_src_class_init): - * gst-libs/gst/interfaces/mixertrack.c: - (gst_mixer_track_class_init): - * gst-libs/gst/rtp/gstbasertpdepayload.c: - (gst_base_rtp_depayload_class_init): - * gst-libs/gst/rtp/gstbasertppayload.c: - (gst_basertppayload_class_init): - * gst/audioconvert/gstaudioconvert.c: - (gst_audio_convert_class_init): - * gst/audiorate/gstaudiorate.c: (gst_audio_rate_class_init): - * gst/audioresample/gstaudioresample.c: - (gst_audioresample_class_init): - * gst/audiotestsrc/gstaudiotestsrc.c: - (gst_audio_test_src_class_init): - * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init): - * gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init): - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), - (preroll_unlinked): - * gst/playback/gstplaybin.c: (gst_play_bin_class_init): - * gst/playback/gstplaybin2.c: (gst_play_bin_class_init): - * gst/playback/gstplaysink.c: (gst_play_sink_class_init): - * gst/playback/gstqueue2.c: (gst_queue_class_init): - * gst/playback/gststreaminfo.c: (gst_stream_info_class_init): - * gst/playback/gststreamselector.c: (gst_selector_pad_class_init), - (gst_stream_selector_class_init): - * gst/playback/gsturidecodebin.c: (gst_uri_decode_bin_class_init): - * gst/subparse/gstsubparse.c: (gst_sub_parse_class_init): - * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init): - * gst/tcp/gsttcpclientsink.c: (gst_tcp_client_sink_class_init): - * gst/tcp/gsttcpclientsrc.c: (gst_tcp_client_src_class_init): - * gst/tcp/gsttcpserversink.c: (gst_tcp_server_sink_class_init): - * gst/tcp/gsttcpserversrc.c: (gst_tcp_server_src_class_init): - * gst/videorate/gstvideorate.c: (gst_video_rate_class_init): - * gst/videoscale/gstvideoscale.c: (gst_video_scale_class_init): - * gst/videotestsrc/gstvideotestsrc.c: - (gst_video_test_src_class_init): - * gst/volume/gstvolume.c: (gst_volume_class_init): - * sys/v4l/gstv4lelement.c: (gst_v4lelement_class_init): - * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_class_init): - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init): - * sys/ximage/ximagesink.c: (gst_ximagesink_class_init): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_class_init): - Use G_PARAM_STATIC_STRINGS everywhere for GParamSpecs that use - static strings (i.e. all). This gives us less memory usage, - fewer allocations and thus less memory defragmentation. Depend - on core CVS for this. Fixes bug #523806. - -2008-03-03 06:04:31 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Correct all relevant warnings found by the sparse semantic code analyzer. This include marking several symbols static... - Original commit message from CVS: - * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_get_type): - * ext/alsa/gstalsasink.c: (set_hwparams): - * ext/alsa/gstalsasrc.c: (set_hwparams): - * ext/gio/gstgio.c: (gst_gio_uri_handler_get_uri): - * ext/ogg/gstoggmux.h: - * ext/ogg/gstogmparse.c: - * gst-libs/gst/audio/audio.c: - * gst-libs/gst/fft/kiss_fft_f64.c: (kiss_fft_f64_alloc): - * gst-libs/gst/pbutils/missing-plugins.c: - (gst_missing_uri_sink_message_new), - (gst_missing_element_message_new), - (gst_missing_decoder_message_new), - (gst_missing_encoder_message_new): - * gst-libs/gst/rtp/gstbasertppayload.c: - * gst-libs/gst/rtp/gstrtcpbuffer.c: - (gst_rtcp_packet_bye_get_reason): - * gst/audioconvert/gstaudioconvert.c: - * gst/audioresample/gstaudioresample.c: - * gst/ffmpegcolorspace/imgconvert.c: - * gst/playback/test.c: (gen_video_element), (gen_audio_element): - * gst/typefind/gsttypefindfunctions.c: - * gst/videoscale/vs_4tap.c: - * gst/videoscale/vs_4tap.h: - * sys/v4l/gstv4lelement.c: - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_any_caps): - * sys/v4l/v4l_calls.c: - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_init), - (gst_v4lsrc_try_capture): - * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), - (gst_ximagesink_ximage_new): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), - (gst_xvimagesink_xvimage_new): - * tests/check/elements/audioconvert.c: - * tests/check/elements/audioresample.c: - (fail_unless_perfect_stream): - * tests/check/elements/audiotestsrc.c: (setup_audiotestsrc): - * tests/check/elements/decodebin.c: - * tests/check/elements/gdpdepay.c: (setup_gdpdepay), - (setup_gdpdepay_streamheader): - * tests/check/elements/gdppay.c: (setup_gdppay), (GST_START_TEST), - (setup_gdppay_streamheader): - * tests/check/elements/gnomevfssink.c: (setup_gnomevfssink): - * tests/check/elements/multifdsink.c: (setup_multifdsink): - * tests/check/elements/textoverlay.c: - * tests/check/elements/videorate.c: (setup_videorate): - * tests/check/elements/videotestsrc.c: (setup_videotestsrc): - * tests/check/elements/volume.c: (setup_volume): - * tests/check/elements/vorbisdec.c: (setup_vorbisdec): - * tests/check/elements/vorbistag.c: - * tests/check/generic/clock-selection.c: - * tests/check/generic/states.c: (setup), (teardown): - * tests/check/libs/cddabasesrc.c: - * tests/check/libs/video.c: - * tests/check/pipelines/gio.c: - * tests/check/pipelines/oggmux.c: - * tests/check/pipelines/simple-launch-lines.c: - (simple_launch_lines_suite): - * tests/check/pipelines/streamheader.c: - * tests/check/pipelines/theoraenc.c: - * tests/check/pipelines/vorbisdec.c: - * tests/check/pipelines/vorbisenc.c: - * tests/examples/seek/scrubby.c: - * tests/examples/seek/seek.c: (query_positions_elems), - (query_positions_pads): - * tests/icles/stress-xoverlay.c: (myclock): - Correct all relevant warnings found by the sparse semantic code - analyzer. This include marking several symbols static, using - NULL instead of 0 for pointers and using "foo (void)" instead - of "foo ()" for declarations. - * win32/common/libgstrtp.def: - Add gst_rtp_buffer_set_extension_data to the symbol definition file. - -2007-06-14 19:53:27 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/check/pipelines/streamheader.c: Disable test_multifdsink_gdp_vorbisenc() on ppc64 since it fails on the p5-ppc6... - Original commit message from CVS: - * tests/check/pipelines/streamheader.c: (streamheader_suite): - Disable test_multifdsink_gdp_vorbisenc() on ppc64 since it - fails on the p5-ppc64 build bot and the failure looks like it is due - to the same issue as #348114, ie. a compiler bug. - -2007-04-14 12:34:55 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst/gdp/gstgdppay.c (gst_gdp_pay_chain): tests/check/pipelines/streamheader.c (tag_event_probe_cb, - Original commit message from CVS: - * gst/gdp/gstgdppay.c (gst_gdp_pay_chain): - * tests/check/pipelines/streamheader.c (tag_event_probe_cb, - GST_START_TEST, buffer_probe_cb, GST_START_TEST): - Fix a bug where serialized IN_CAPS buffers needed to be set IN_CAPS. - -2007-04-13 21:55:31 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * tests/check/pipelines/streamheader.c: - tests/check/pipelines/streamheader.c (tag_event_probe_cb, - Original commit message from CVS: - * tests/check/pipelines/streamheader.c (tag_event_probe_cb, - GST_START_TEST, n_in_caps, buffer_probe_cb, GST_START_TEST, - streamheader_suite): - Add another test set up for failure - -2007-04-13 21:09:04 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/gstgdpdepay.c: - debug changes - Original commit message from CVS: - debug changes - -2007-04-13 21:08:11 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - tests/check/Makefile.am: tests/check/pipelines/streamheader.c (n_tags, tag_event_probe_cb, - Original commit message from CVS: - * tests/check/Makefile.am: - * tests/check/pipelines/streamheader.c (n_tags, tag_event_probe_cb, - GST_START_TEST, streamheader_suite, main): - Add a test for the streamheader bug Wim fixed. - -2007-04-12 10:03:22 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/gdp/gstgdppay.c: Make sure we set the IN_CAPS flag correctly. - Original commit message from CVS: - * gst/gdp/gstgdppay.c: (gst_gdp_pay_chain), - (gst_gdp_pay_sink_event): - Make sure we set the IN_CAPS flag correctly. - * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_render): - Get the IN_CAPS flag before we call functions that mess with the flags. - -2007-04-10 20:37:05 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/gstgdppay.c: - gst/gdp/gstgdppay.c (gst_gdp_pay_reset_streamheader, gst_gdp_pay_chain, gst_gdp_pay_sink_event): - Original commit message from CVS: - * gst/gdp/gstgdppay.c (gst_gdp_pay_reset_streamheader, - gst_gdp_pay_chain, gst_gdp_pay_sink_event): - Only stamp buffers with offset/offset_end right before they get - pushed. This ensures offset continuity, which was not the case - before as shown by - gst-launch -v -m audiotestsrc num-buffers=10 ! audioconvert ! vorbisenc ! gdppay ! identity check-imperfect-offset=TRUE ! fakesink silent=TRUE - -2007-04-10 20:25:06 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - adding debugging - Original commit message from CVS: - adding debugging - -2007-03-14 15:05:32 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/gstgdpdepay.c: - add buffer logging - Original commit message from CVS: - add buffer logging - -2006-12-22 12:10:18 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/check/elements/: Fix the dp tests, but activating the pads for the streamheader tests too and cleaning up condi... - Original commit message from CVS: - * tests/check/elements/gdpdepay.c: (cleanup_gdpdepay), - (setup_gdpdepay_streamheader): - * tests/check/elements/gdppay.c: (cleanup_gdppay), - (setup_gdppay_streamheader): - Fix the dp tests, but activating the pads for the streamheader tests - too and cleaning up conditionaly - -2006-12-21 08:12:26 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/check/elements/: consistent pad (de)activation - Original commit message from CVS: - * tests/check/elements/audioresample.c: (cleanup_audioresample): - * tests/check/elements/audiotestsrc.c: (cleanup_audiotestsrc): - * tests/check/elements/gdpdepay.c: (setup_gdpdepay), - (cleanup_gdpdepay): - * tests/check/elements/gdppay.c: (setup_gdppay), (cleanup_gdppay): - * tests/check/elements/subparse.c: (teardown_subparse): - * tests/check/elements/textoverlay.c: (cleanup_textoverlay): - * tests/check/elements/videorate.c: (cleanup_videorate): - * tests/check/elements/videotestsrc.c: (cleanup_videotestsrc): - * tests/check/elements/volume.c: (cleanup_volume): - * tests/check/elements/vorbisdec.c: (setup_vorbisdec), - (cleanup_vorbisdec): - * tests/check/elements/vorbistag.c: (setup_vorbistag), - (cleanup_vorbistag): - consistent pad (de)activation - -2006-09-21 05:31:00 +0000 Wim Taymans <wim.taymans@gmail.com> - - tests/check/: Some more compilation fixes. - Original commit message from CVS: - * tests/check/elements/gdpdepay.c: (GST_START_TEST): - * tests/check/libs/audio.c: - Some more compilation fixes. - -2006-09-20 17:04:57 +0000 Wim Taymans <wim.taymans@gmail.com> - - tests/check/: Fix some warnings. - Original commit message from CVS: - * tests/check/elements/gdpdepay.c: (GST_START_TEST): - * tests/check/elements/multifdsink.c: (GST_START_TEST): - * tests/check/elements/videorate.c: (GST_START_TEST): - * tests/check/libs/cddabasesrc.c: (GST_START_TEST): - * tests/check/pipelines/oggmux.c: (eos_buffer_probe): - Fix some warnings. - -2006-08-25 16:19:55 +0000 Michael Smith <msmith@xiph.org> - - gst/gdp/gstgdppay.c: Fix memory leaks and misleading debug messages, add a couple of comments. - Original commit message from CVS: - * gst/gdp/gstgdppay.c: (gst_gdp_pay_reset), - (gst_gdp_pay_reset_streamheader), (gst_gdp_pay_chain): - Fix memory leaks and misleading debug messages, add a couple of - comments. - * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_get_stats), - (gst_multi_fd_sink_render): - Do not use gst_buffer_make_writable() in a basesink render method, - as it may incorrectly unref the buffer. Instead, use convoluted - dance to avoid copying the buffer except when we need to. - -2006-08-21 19:04:14 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/README: - adding a README - Original commit message from CVS: - adding a README - -2006-08-21 19:01:41 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - Move GDP plugin to -base from -bad. Closes #347783. - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-base-plugins-docs.sgml: - * docs/plugins/gst-plugins-base-plugins-sections.txt: - * docs/plugins/inspect/plugin-gdp.xml: - * gst/gdp/Makefile.am: - * tests/check/Makefile.am: - Move GDP plugin to -base from -bad. Closes #347783. - -2006-08-08 13:57:29 +0000 Edward Hervey <bilboed@bilboed.com> - - tests/check/elements/gdpdepay.c: I forgot to include the file containing the #define :) - Original commit message from CVS: - * tests/check/elements/gdpdepay.c: (gdpdepay_suite): - I forgot to include the file containing the #define :) - Now includes "config.h" - -2006-08-08 13:45:44 +0000 Edward Hervey <bilboed@bilboed.com> - - tests/check/elements/gdpdepay.c: Ignore test known to fail on PPC64. See #348114. - Original commit message from CVS: - * tests/check/elements/gdpdepay.c: (gdpdepay_suite): - Ignore test known to fail on PPC64. See #348114. - -2006-08-04 13:20:23 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/gdp/gstgdpdepay.c: Fix event parsing by gdpdepay. Fixes #349916. - Original commit message from CVS: - 2006-08-04 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain): - Fix event parsing by gdpdepay. Fixes #349916. - -2006-08-02 16:56:19 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/gdp/gstgdpdepay.c: Disable seeking. - Original commit message from CVS: - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_init), - (gst_gdp_depay_finalize), (gst_gdp_depay_sink_event), - (gst_gdp_depay_src_event), (gst_gdp_depay_chain), - (gst_gdp_depay_change_state): - Disable seeking. - Small cleanups. - Clear adapter on disconts. - Clear caps when going to READY instead of NULL - * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init), - (gst_gdp_pay_init), (gst_gdp_pay_finalize), (gst_gdp_pay_reset), - (gst_gdp_buffer_from_caps), (gst_gdp_pay_buffer_from_buffer), - (gst_gdp_buffer_from_event), (gst_gdp_pay_reset_streamheader), - (gst_gdp_queue_buffer), (gst_gdp_pay_chain), - (gst_gdp_pay_sink_event), (gst_gdp_pay_src_event), - (gst_gdp_pay_change_state): - * gst/gdp/gstgdppay.h: - Reset payloader when going to READY. - Fix leaked buffers in ->queue on push errors. - Disable seeking. - Code cleanups. - Create packetizer in _init, free in _finalize. - -2006-07-31 08:48:36 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/gdp/gstgdpdepay.c: Consume all events except EOS because we generate events from the gdp payload instead. Fixes #... - Original commit message from CVS: - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_init), - (gst_gdp_depay_sink_event), (gst_gdp_depay_chain): - Consume all events except EOS because we generate events from - the gdp payload instead. Fixes #349204 - -2006-07-26 10:52:05 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst/gdp/gstgdpdepay.c: proxying get/set caps is the wrong thing to do, since we really do change caps quite fundament... - Original commit message from CVS: - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_init): - proxying get/set caps is the wrong thing to do, since we really - do change caps quite fundamentally - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - remove declaration of buffers, it's already done in gstcheck.h - -2006-07-17 14:17:45 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst/gdp/: remove parent_class setting, BOILERPLATE does this fix typo in comment - Original commit message from CVS: - 2006-07-17 Thomas Vander Stichele <thomas at apestaart dot org> - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_class_init): - * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init), - remove parent_class setting, BOILERPLATE does this - (gst_gdp_pay_reset_streamheader): - fix typo in comment - -2006-07-14 10:34:36 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/Makefile.am: - build as a plugin, not a lib - Original commit message from CVS: - build as a plugin, not a lib - -2006-07-13 15:25:58 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - docs/plugins/: add more plugins and elements to docs - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - add more plugins and elements to docs - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain): - fix segfaults due to wrong g_free - add example - * gst/gdp/gstgdppay.c: - add example - -2006-06-23 09:09:44 +0000 Tim-Philipp Müller <tim@centricular.net> - - Use GST_DEBUG_CATEGORY_STATIC where possible (#342503) and fix one GObject boilerplate macro. - Original commit message from CVS: - * ext/directfb/dfbvideosink.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmenc.c: - * ext/libmms/gstmms.c: - * ext/neon/gstneonhttpsrc.c: - * ext/theora/theoradec.c: - * gst/freeze/gstfreeze.c: - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - * sys/glsink/glimagesink.c: - Use GST_DEBUG_CATEGORY_STATIC where possible (#342503) - and fix one GObject boilerplate macro. - -2006-06-06 16:26:59 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/gstgdppay.c: - adapt to new api - Original commit message from CVS: - adapt to new api - -2006-06-06 14:39:15 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - configure.ac: enable building of GDP elements - Original commit message from CVS: - * configure.ac: - enable building of GDP elements - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain): - * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init), - (gst_gdp_pay_init), (gst_gdp_buffer_from_caps), - (gst_gdp_pay_buffer_from_buffer), (gst_gdp_buffer_from_event), - (gst_gdp_pay_reset_streamheader), (gst_gdp_pay_sink_event), - (gst_gdp_pay_set_property), (gst_gdp_pay_get_property), - (gst_gdp_pay_change_state): - * gst/gdp/gstgdppay.h: - add version 1.0 - -2006-06-02 16:45:59 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.h: - small fixes - Original commit message from CVS: - small fixes - -2006-06-02 10:28:32 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst/gdp/gstgdppay.c: add crc-header and crc-payload properties don't error out on some things that are recoverable - Original commit message from CVS: - * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init), - (gst_gdp_pay_init), (gst_gdp_buffer_from_caps), - (gst_gdp_pay_buffer_from_buffer), (gst_gdp_buffer_from_event), - (gst_gdp_pay_reset_streamheader), (gst_gdp_pay_chain), - (gst_gdp_pay_sink_event), (gst_gdp_pay_set_property), - (gst_gdp_pay_get_property): - add crc-header and crc-payload properties - don't error out on some things that are recoverable - * tests/check/elements/gdppay.c: (GST_START_TEST), (gdppay_suite): - add test for crc - -2006-06-01 22:00:23 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass - Original commit message from CVS: - * ext/alsaspdif/alsaspdifsink.h: - * ext/amrwb/gstamrwbdec.h: - * ext/amrwb/gstamrwbenc.h: - * ext/amrwb/gstamrwbparse.h: - * ext/arts/gst_arts.h: - * ext/artsd/gstartsdsink.h: - * ext/audiofile/gstafparse.h: - * ext/audiofile/gstafsink.h: - * ext/audiofile/gstafsrc.h: - * ext/audioresample/gstaudioresample.h: - * ext/bz2/gstbz2dec.h: - * ext/bz2/gstbz2enc.h: - * ext/dirac/gstdiracdec.h: - * ext/directfb/dfbvideosink.h: - * ext/divx/gstdivxdec.h: - * ext/divx/gstdivxenc.h: - * ext/dts/gstdtsdec.h: - * ext/faac/gstfaac.h: - * ext/gsm/gstgsmdec.h: - * ext/gsm/gstgsmenc.h: - * ext/ivorbis/vorbisenc.h: - * ext/libfame/gstlibfame.h: - * ext/nas/nassink.h: - * ext/neon/gstneonhttpsrc.h: - * ext/polyp/polypsink.h: - * ext/sdl/sdlaudiosink.h: - * ext/sdl/sdlvideosink.h: - * ext/shout/gstshout.h: - * ext/snapshot/gstsnapshot.h: - * ext/sndfile/gstsf.h: - * ext/swfdec/gstswfdec.h: - * ext/tarkin/gsttarkindec.h: - * ext/tarkin/gsttarkinenc.h: - * ext/theora/theoradec.h: - * ext/wavpack/gstwavpackdec.h: - * ext/wavpack/gstwavpackparse.h: - * ext/xine/gstxine.h: - * ext/xvid/gstxviddec.h: - * ext/xvid/gstxvidenc.h: - * gst/cdxaparse/gstcdxaparse.h: - * gst/cdxaparse/gstcdxastrip.h: - * gst/colorspace/gstcolorspace.h: - * gst/festival/gstfestival.h: - * gst/freeze/gstfreeze.h: - * gst/gdp/gstgdpdepay.h: - * gst/gdp/gstgdppay.h: - * gst/modplug/gstmodplug.h: - * gst/mpeg1sys/gstmpeg1systemencode.h: - * gst/mpeg1videoparse/gstmp1videoparse.h: - * gst/mpeg2sub/gstmpeg2subt.h: - * gst/mpegaudioparse/gstmpegaudioparse.h: - * gst/multifilesink/gstmultifilesink.h: - * gst/overlay/gstoverlay.h: - * gst/playondemand/gstplayondemand.h: - * gst/qtdemux/qtdemux.h: - * gst/rtjpeg/gstrtjpegdec.h: - * gst/rtjpeg/gstrtjpegenc.h: - * gst/smooth/gstsmooth.h: - * gst/smoothwave/gstsmoothwave.h: - * gst/spectrum/gstspectrum.h: - * gst/speed/gstspeed.h: - * gst/stereo/gststereo.h: - * gst/switch/gstswitch.h: - * gst/tta/gstttadec.h: - * gst/tta/gstttaparse.h: - * gst/videodrop/gstvideodrop.h: - * gst/xingheader/gstxingmux.h: - * sys/directdraw/gstdirectdrawsink.h: - * sys/directsound/gstdirectsoundsink.h: - * sys/dxr3/dxr3audiosink.h: - * sys/dxr3/dxr3spusink.h: - * sys/dxr3/dxr3videosink.h: - * sys/qcam/gstqcamsrc.h: - * sys/vcd/vcdsrc.h: - Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass - -2006-05-22 15:53:07 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst/gdp/: Handle error cases when calling functions do downwards state change after parent's change_state - Original commit message from CVS: - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain), - (gst_gdp_depay_change_state): - * gst/gdp/gstgdpdepay.h: - * gst/gdp/gstgdppay.c: (gst_gdp_pay_reset_streamheader), - (gst_gdp_pay_chain), (gst_gdp_pay_sink_event), - (gst_gdp_pay_change_state): - * gst/gdp/gstgdppay.h: - Handle error cases when calling functions - do downwards state change after parent's change_state - * tests/check/elements/gdpdepay.c: (GST_START_TEST): - * tests/check/elements/gdppay.c: (GST_START_TEST): - clean up more - -2006-05-22 13:25:52 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - adding GDP payloader and depayloader. Build integration will follow later when the GDP issues for core are sorted out. - Original commit message from CVS: - * gst/gdp/Makefile.am: - * gst/gdp/gstgdp.c: (plugin_init): - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_base_init), - (gst_gdp_depay_class_init), (gst_gdp_depay_init), - (gst_gdp_depay_finalize), (gst_gdp_depay_chain), - (gst_gdp_depay_change_state), (gst_gdp_depay_plugin_init): - * gst/gdp/gstgdpdepay.h: - * gst/gdp/gstgdppay.c: (gst_gdp_pay_base_init), - (gst_gdp_pay_class_init), (gst_gdp_pay_init), - (gst_gdp_pay_dispose), (gst_gdp_stamp_buffer), - (gst_gdp_buffer_from_caps), (gst_gdp_pay_buffer_from_buffer), - (gst_gdp_buffer_from_event), (gst_gdp_pay_reset_streamheader), - (gst_gdp_queue_buffer), (gst_gdp_pay_chain), - (gst_gdp_pay_sink_event), (gst_gdp_pay_change_state), - (gst_gdp_pay_plugin_init): - * gst/gdp/gstgdppay.h: - * tests/check/Makefile.am: - * tests/check/elements/gdpdepay.c: (setup_gdpdepay), - (cleanup_gdpdepay), (gdpdepay_push_per_byte), (GST_START_TEST), - (setup_gdpdepay_streamheader), (gdpdepay_suite), (main): - * tests/check/elements/gdppay.c: (setup_gdppay), (cleanup_gdppay), - (GST_START_TEST), (setup_gdppay_streamheader), (gdppay_suite), - (main): - adding GDP payloader and depayloader. Build integration will - follow later when the GDP issues for core are sorted out. - -2012-09-10 20:38:14 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rtpmux/gstrtpmux.c: - * tests/check/elements/rtpmux.c: - rtpmux: Misc fix for 0.11 - Convert the incoming caps before proxying them - Clear the last_pad when going to ready - tests: Implement accept_caps, don't leak event - -2012-09-10 16:12:39 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/uvch264/Makefile.am: - * sys/uvch264/gstuvch264-marshal.list: - * sys/uvch264/gstuvch264_src.c: - uvch264src: Use generic marshaller - -2012-09-10 16:09:26 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * configure.ac: - * sys/Makefile.am: - * sys/uvch264/Makefile.am: - * sys/uvch264/gstuvch264-marshal.list: - * sys/uvch264/gstuvch264.c: - * sys/uvch264/gstuvch264_mjpgdemux.c: - * sys/uvch264/gstuvch264_mjpgdemux.h: - * sys/uvch264/gstuvch264_src.c: - * sys/uvch264/gstuvch264_src.h: - * sys/uvch264/uvc_h264.c: - * sys/uvch264/uvc_h264.h: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/uvch264demux.c: - * tests/check/elements/uvch264demux_data/valid_h264_jpg.h264: - * tests/check/elements/uvch264demux_data/valid_h264_jpg.jpg: - * tests/check/elements/uvch264demux_data/valid_h264_jpg.mjpg: - * tests/check/elements/uvch264demux_data/valid_h264_yuy2.h264: - * tests/check/elements/uvch264demux_data/valid_h264_yuy2.mjpg: - * tests/check/elements/uvch264demux_data/valid_h264_yuy2.yuy2: - * tests/examples/Makefile.am: - * tests/examples/uvch264/Makefile.am: - * tests/examples/uvch264/boolean_property.glade: - * tests/examples/uvch264/enum_property.glade: - * tests/examples/uvch264/enum_property_gtk2.glade: - * tests/examples/uvch264/int_property.glade: - * tests/examples/uvch264/test-uvch264.c: - * tests/examples/uvch264/window.glade: - UVC H264 plugin - -2012-09-09 23:52:41 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/opencv/gstmotioncells.c: - opencv: disable motioncells "date" property for now - Shouldn't be of type long. Not sure it's useful at all, so - just disable it for now to see if someone misses it. - -2012-09-09 14:35:51 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - configure: remove non-existant hlssink plugin from NONPORTED list - -2012-09-08 16:08:21 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklinksink.cpp: - decklinksink: Fix memory leak - -2012-09-08 15:57:57 -0700 David Schleef <ds@schleef.org> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - inter: fix leaks in audiosrc/sink - -2012-09-08 17:03:33 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparse: Don't override upstream framerate and PAR - If upstream provided some, there's a good chance they are the ones to use - -2012-09-08 14:43:37 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/hls/Makefile.am: - * gst/hls/gstfragmentedplugin.c: - hls: disable hlssink but do build hlsdemux - -2012-09-08 14:31:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - Revert "configure.ac: Properly disable HLS plugin" - This reverts commit 3ad3445a25f31bc0d0167a4f413791bea8006783. - This disabled hlsdemux as well - -2012-09-08 14:05:08 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * configure.ac: - configure.ac: Properly disable HLS plugin - -2012-09-07 16:08:57 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/hls/Makefile.am: - hls: Add missing GST_PLUGINS_BASE_CFLAGS - -2012-09-07 16:07:40 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/hls/gsthlssink.c: - * gst/hls/gsthlssink.h: - hlssink: Add segment target-duration property - This property causes hlssink to push a force key unit event upstream - every target-duration seconds. This is for simple automatic segmenting. - To disable it, set the property to 0 and push the force key unit event - manually. - -2011-08-21 11:00:51 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * configure.ac: - * gst/hls/Makefile.am: - * gst/hls/gstfragmentedplugin.c: - * gst/hls/gsthlssink.c: - * gst/hls/gsthlssink.h: - * gst/hls/gstm3u8playlist.c: - * gst/hls/gstm3u8playlist.h: - hls: add hlssink element - -2012-09-06 01:53:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: use correct variable when handling pad probe buffers - Pad probe data is in the GstPadProbeInfo, not in the user data - parameter. - -2012-09-03 19:25:52 +0100 Rico Tzschichholz <ricotz@t-online.de> - - * ext/mythtv/gstmythtvsrc.c: - mythtv: update for duration message API change - -2012-09-03 14:21:19 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/schroedinger/gstschroenc.c: - schroenc: set interlace_coding based on input caps - and remove property. - -2012-09-03 14:04:40 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/schroedinger/gstschroenc.c: - schroenc: configure profile/level from allowed downstream caps instead of properties - This is how it's done elsewhere and works better with encodebin. - Removes "force-profile" property, read-only "profile" property and - "level" property. - https://bugzilla.gnome.org/show_bug.cgi?id=670608 - -2012-09-03 13:58:16 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/videoparsers/gstdiracparse.c: - diracparse: fix main profile mapping - -2012-09-03 13:04:01 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/schroedinger/gstschroenc.c: - schroenc: prettify enum property nicks - Use '-' instead of '_' as word separator. - -2012-09-03 12:41:33 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/videoparsers/gstdiracparse.c: - diracparse: change "interlaced" boolean in caps to "interlace-mode" - Not strictly needed, but let's make it consistent with the raw - video way of doing things. - -2012-09-03 12:33:51 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/videoparsers/gstdiracparse.c: - diracparse: use strings for profile and level in caps - For consistency with most other formats. - https://bugzilla.gnome.org/show_bug.cgi?id=658436 - -2012-09-02 12:36:37 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * ext/spc/gstspc.c: - spc: No need to define GLIB_DISABLE_DEPRECATION_WARNINGS - https://bugzilla.gnome.org/show_bug.cgi?id=683175 - -2012-09-02 03:55:35 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/id3tag/id3tag.c: - id3tag: extract year to write into ID3v1 tag from GST_TAG_DATE_TIME not GST_TAG_DATE - -2012-09-01 21:46:19 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpeg4videoparse.h: - mpeg4videoparse: set 0 duration when vop_coded is 0 - https://bugzilla.gnome.org/show_bug.cgi?id=683169 - -2012-09-02 01:42:30 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/resindvd/resindvdsrc.c: - * ext/soundtouch/gstpitch.cc: - * gst/hls/gsthlsdemux.c: - gst_message_new_duration -> gst_message_new_duration_changed - -2012-09-01 09:12:51 -0700 Jan Schmidt <thaytan@noraisin.net> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Handle caps query on internal srcpad - Reply with ANY caps to ensure linking the internal src pad. This - might need more attention later, to reply with the real upstream caps - for the currently active element. - -2012-08-31 15:28:29 -0700 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.c: - resindvd/mpegdemux: Send both PTS and DTS downstream - Now that we can. - -2012-09-02 00:04:18 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/spc/gstspc.c: - spc: don't leak buffer in case of an init error - -2012-09-02 00:34:38 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - * ext/spc/Makefile.am: - * ext/spc/gstspc.c: - * ext/spc/tag.c: - * ext/spc/tag.h: - spc: port to 0.11 - https://bugzilla.gnome.org/show_bug.cgi?id=683175 - -2012-08-31 14:13:58 -0700 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdbin.h: - resindvd: Plug a video parser in front of decoder - Seems to make playback both better and worse. The parser needs some - fixing, it seems :-/ - -2012-08-31 12:31:48 -0700 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: Make GAP event aware - -2012-08-31 08:46:45 -0700 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/Makefile.am: - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/gstmpegdemux.h: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdbin.h: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/rsnaudiomunge.c: - * ext/resindvd/rsnaudiomunge.h: - resindvd: Add some GAP event stuff to make still-frames start to work - And remove the dead audiomunge element. It isn't needed now, we just - send GAP events - -2012-06-09 22:36:06 +1000 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - * ext/resindvd/Makefile.am: - * ext/resindvd/gstmpegdefs.h: - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/gstmpegdemux.h: - * ext/resindvd/gstpesfilter.c: - * ext/resindvd/gstpesfilter.h: - * ext/resindvd/plugin.c: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/rsnaudiomunge.c: - * ext/resindvd/rsndec.c: - * ext/resindvd/rsninputselector.c: - * ext/resindvd/rsninputselector.h: - * ext/resindvd/rsnstreamselector.c: - * ext/resindvd/rsnstreamselector.h: - resindvd: Initial partial port to 0.11 - -2012-08-30 18:39:50 -0700 Jan Schmidt <thaytan@noraisin.net> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Don't drop upstream events due to silly typo - -2012-08-30 17:51:50 -0700 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegdemux: Merge some DVD pieces and fixes - Bring the resindvd copy of mpegpsdemux and the normal version - slightly closer together. - Don't forward incoming sink caps event to downstream elements. - -2012-06-11 08:33:36 +1000 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: avoid extra refs/unrefs of the demuxer - Change all the gst_pad_get_parent() calls to a cast to the - passed parent variable where appropriate, and don't unref, - including the extra unref in the - gst_flups_demux_sink_activate_push() function. - -2012-08-30 12:11:20 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: adjust to modified video overlay composition API - ... and supply overlay rectangle data in AYUV as provided by input - data rather than converting to RGB. - -2012-08-29 22:05:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: no need to set clock/basetime again - The base and clock aren't lost anymore on state changes - in 1.0 - -2012-08-29 22:05:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin: no need to send extra reconfigure - Setting capsfilters already sends reconfigure events when a new - caps is set, no need to resend them. - -2012-08-28 21:01:55 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: request _%u templates instead of _%d - In 1.0, templates have been renamed to _%u as default - -2012-08-26 16:43:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/check/elements/camerabin.c: - tests: camerabin: fix image location switching test - The test should wait until the last image-done is posted so it - can correctly check that all images have been saved. - -2012-08-26 16:42:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: rework video recording eos push - Push EOS outside of wrappercamerabinsrc so that none of the - internal elements gets its pads into eos state, preventing any - further data from passing - -2012-08-28 11:07:41 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: ensure sufficiently sized buffer when wrapping NAL - Noted by <zhangyanping210@yahoo.com.cn> - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=682589 - -2012-08-24 09:01:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/shm/Makefile.am: - shm: remove unneeded glib-gen-mak include in Makefile - No enums or marshallers to be generated here. Should also - be gst-glib-gen.mak then. - -2012-08-22 15:08:53 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: revert renaming of the type - The special type name was lost when merging from base. - -2012-08-22 13:30:40 +0200 Stefan Sauer <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 668acee to 4f962f7 - -2012-08-22 13:19:53 +0200 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - configure: bump gtk-doc req to 1.12 (mar-2009) - This allows us to e.g. unconditionally use gtkdoc-rebase. - -2012-08-21 13:29:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: avoid registering enum type of same name as libvisual plugin in -base - -2012-08-17 11:12:22 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * ext/wayland/gstwaylandsink.c: - wayland: use scale fullscreen method. - This makes the compositor scale the surface to fit and preserves - aspect ratio. - https://bugzilla.gnome.org/show_bug.cgi?id=681453 - -2012-08-17 11:10:39 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * ext/wayland/gstwaylandsink.c: - wayland: respond to ping/pong protocol so we're not deemed unresponsive. - https://bugzilla.gnome.org/show_bug.cgi?id=681453 - -2012-08-21 10:37:10 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - configure: fix check for wayland - We only seem to need wayland-client. Also make work with - wayland being installed in a non-default prefix by not - overwriting/clearing WAYLAND_{CFLAGS,LIBS} for no reason - at all. - -2012-08-21 10:29:55 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/id3tag/id3tag.c: - id3tag: fix build - Some code slipped into the last commit that was meant to be - pushed separately. Use gst_date_time_unref() instead of _free(). - -2012-08-08 17:10:28 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - * ext/wayland/Makefile.am: - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * ext/wayland/waylandpool.c: - * ext/wayland/waylandpool.h: - wayland: More fixes based on wayland-0.95.0 and gstreamer-1.0 apis - - bump wayland version to 0.95.0 which will lead to stable 1.0 release - - avoid memcopy and use propose_allocation for GstBufferPool allocation - - using WaylandBufferPool - - shm: Allocate shm buffers through new wl_shm_pool interface - (the shm buffer allocation is a two step process now: first - allocate a wl_shm_pool, then allocate a buffer from the pool) - https://bugzilla.gnome.org/show_bug.cgi?id=681453 - -2012-08-21 10:22:49 +0100 Tim-Philipp Müller <tim@centricular.net> - - * configure.ac: - * gst/id3tag/gstid3mux.c: - * gst/id3tag/id3tag.c: - id3tag: port to 0.11 - -2012-08-21 00:10:10 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - examples: GST_TAG_DATE -> GST_TAG_DATE_TIME - In camerabin2 example. - -2012-08-20 23:37:00 +0100 Tim-Philipp Müller <tim@centricular.net> - - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * ext/kate/gstkateenc.c: - * ext/kate/gstkatespu.h: - * ext/kate/gstkateutil.c: - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/resindvdbin.c: - * gst/dvdspu/gstdvdspu.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegtsdemux/tsdemux.c: - * tests/check/elements/kate.c: - video/x-dvd-subpicture -> subpicture/x-dvd - -2012-08-18 20:31:17 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - * gst/mpeg1sys/main.h: - * gst/rtjpeg/RTjpeg.c: - * gst/rtjpeg/RTjpeg.h: - * gst/tta/filters.h: - * gst/vbidec/vbidata.c: - * gst/vbidec/vbidata.h: - * gst/vbidec/vbiscreen.c: - * gst/vbidec/vbiscreen.h: - Fix up FSF address in some source files as well - -2012-08-18 11:09:39 -0400 Brian Pepple <bpepple@fedoraproject.org> - - * COPYING: - * COPYING.LIB: - Correct incorrect FSF address in license files - https://bugzilla.gnome.org/show_bug.cgi?id=682158 - -2012-08-17 22:57:10 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstaudiovisualizer.c: - * gst/audiovisualizers/gstaudiovisualizer.h: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstwavescope.c: - audiovisualizer: sync to change in base and port - Add support for GstVideoMeta and GstVideoFrame. Remove some redundant fields - that are also in GstVideoInfo. Don't disable the shader code, it does not - look broken. - -2012-08-17 15:15:34 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/README: - audiovisualizer: status update - -2012-08-15 18:28:09 -0400 Brian Pepple <bpepple@fedoraproject.org> - - * configure.ac: - configure: add missing AC_LANG_PROGRAM call to DirectShow tests - https://bugzilla.gnome.org/show_bug.cgi?id=681952 - -2012-08-15 11:26:59 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstaudiovisualizer.c: - visualizer: small cleanup - Apply cleanup from copy in base. - -2012-07-24 20:39:41 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Fix flushing/sync handling - There was a stray adapter_flush() now that we used a temporary buffer - -2012-07-19 13:35:51 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Better detect PCR resets - Assume that any differences in PCR greater than 15s means there is - a reset in the stream. - -2012-07-19 09:05:28 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - vp8dec: Call gst_video_decoder_negotiate() - -2012-07-19 09:05:13 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/schroedinger/gstschrodec.c: - schrodec: Call gst_video_decoder_negotiate() - -2012-07-14 13:59:41 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Remove/demote some debugging - -2012-07-13 16:56:11 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Always use current PTS/DTS - This avoids setting old PTS and/or DTS - -2012-07-13 16:22:27 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Remove unneeded memset(0) - -2012-07-13 16:22:11 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/mpegtsparse.h: - * gst/mpegtsdemux/pesparse.h: - * gst/mpegtsdemux/tsdemux.h: - mpegts: Use G_GNUC_INTERNAL - -2012-07-11 08:10:30 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * configure.ac: - configure.ac: dvb plugin is ported - -2012-07-11 08:10:18 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - dvb: More fixups to 1.0 - Not tested yet ! - Conflicts: - sys/dvb/gstdvbsrc.c - -2012-06-29 18:04:04 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * sys/dvb/camdevice.c: - cam: Allow time for CA to initialize - Some devices take some time to initialize, and until they are they - will error out when trying to get information about the CA device. - -2012-06-29 18:01:15 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * sys/dvb/camconditionalaccess.c: - cam: PMT_REPLY parsing - Not used yet - -2012-06-29 18:00:41 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/dvbbasebin.h: - dvbbasebin: Switch to use tsparse - -2012-06-29 17:53:30 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Use gst_structure_*_take_value where applicable - Saves copying/freeing data - -2012-06-29 16:14:02 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Cache the GIConv - Avoids having to constantly open/free them (which will end up being - very often with EIT/NIT). - -2012-06-29 16:09:31 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtbase: reset element in READY=>PAUSED - Ensures all subclass reset vmethods are called - -2012-06-28 12:18:28 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Use more Quarks - -2012-06-26 19:01:07 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Remove useless code - PCR/OPCR is meant to be handled by the packetizer - -2012-06-26 18:59:32 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Calculate pcr/time/offset separately per program - Avoids quite a few issues with multi-program streams - -2012-06-26 18:54:55 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsparse.c: - tsparse: Push out buffer on main source pad - -2012-06-26 18:51:21 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - mpegtbase: vmethod to notify when we're done processing input - This can be used to notify subclasses no more data is expected this - round. - tsparse will use it to push whole buffers (without copy) on the main - source pad. - It could also be used later to decide whether to push pending data - in order to reduce latency. - -2011-02-01 11:39:16 -0800 Fabrizio (Misto) Milo <mistobaan@gmail.com> - - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - dvbsrc + dvb api buffer property to overcome buffer under reads - -2012-08-08 15:06:09 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/soundtouch/gstpitch.cc: - soundtouch: Don't assume output buffer timestamps - There's no guarantee whatsoever that the first buffer to output will - start at the segment.start. - Instead, wait for the first buffer after a segment, and use that timestamp - -2012-08-14 11:17:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8dec.h: - vp8dec: Add support for multiple decoding threads - -2012-08-14 11:09:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/vp8/gstvp8dec.c: - vp8dec: Add support for the MFQE postprocessing flag - Which is enabled by default if postprocessing is enabled. - -2012-08-13 10:57:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: only apply repeat count when set - When there is no extension header, the repeat_count variable is left to 0 and - then the duration on the output buffers is calculated wrongly. Because the - duration is used to interpolate output timestamps, the output timestamps are - also wrong, causing bad framerates. - See https://bugzilla.gnome.org/show_bug.cgi?id=681535 - -2012-08-09 13:37:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/vp8/Makefile.am: - vp8: Use pkg-config file for getting the LIBS and CFLAGS - -2012-08-09 11:48:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: Give MARGINAL rank to the mpg123 decoder element - -2012-08-08 17:40:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - gst: Set alignment at the correct place of GstAllocationParams - -2012-08-08 17:06:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Update the per-component strides for every frame too - This is necessary because of GstVideoAlignment - -2012-08-08 16:35:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * win32/common/config.h: - Back to development - -=== release 0.11.93 === - -2012-08-08 15:32:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * gst-plugins-bad.doap: - Release 0.11.93 - -2012-08-08 12:58:50 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/mpg123/Makefile.am: - mpg123: dist header file - -2012-08-08 12:13:13 +0100 Tim-Philipp Müller <tim@centricular.net> - - * win32/common/config.h: - * win32/common/libgstphotography.def: - win32: update for photography API changes - -2012-08-08 11:53:05 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/.gitignore: - tests: .gitignore new curlsmtpsink test binary - -2012-08-03 16:21:09 +0100 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - mimic: Port to 0.11 - -2012-08-07 18:23:37 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/winks/gstksvideosrc.c: - winks: add missing default switch case - -2012-08-07 18:23:05 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/winks/gstksvideodevice.c: - winks: fix types - -2012-08-07 18:22:36 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/winks/gstksvideodevice.c: - winks: fix format warnings - -2012-08-07 18:21:49 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/winks/gstksclock.c: - * sys/winks/gstksvideosrc.c: - winks: fix unused variables warnings - -2012-08-07 18:20:53 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/winks/ksvideohelpers.c: - winks: don't reinitialize MEDIASUBTYPE_I420 - -2012-08-07 18:19:29 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/winks/kshelpers.c: - winks: define STATIC_KSPROPSETID_Wave_Queued if not defined - -2012-08-07 16:53:02 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * configure.ac: - * sys/Makefile.am: - * sys/winks/Makefile.am: - winks: integrate build with autotools - -2012-08-02 14:26:32 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: avoid duplicated symbols in static links - Rename the DLL entry point the avoid duplicated symbols in static - links. - -2012-08-02 14:26:32 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/Makefile.am: - d3dvideosink: avoid duplicated symbols in static links - Rename the DLL entry point the avoid duplicated symbols in static - links. - -2012-08-06 13:59:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/tsdemux.c: - gst: Add stream-id to stream-start events - -2012-07-26 19:31:14 +0200 Oleksij Rempel <bug-track@fisher-privat.net> - - * ext/vp8/gstvp8enc.c: - vp8enc: initiate encoder to fix a crash. - Without this patch vp8enc send header before and after first - key frame. On second keyframe vp8dec will crash without getting - decoded frame. With this pipe it is easy to reproduce this issue: - gst-launch-1.0 videotestsrc ! vp8enc ! vp8dec ! fakesink - https://bugzilla.gnome.org/show_bug.cgi?id=680667 - -2012-08-05 16:40:28 +0100 Tim-Philipp Müller <tim@centricular.net> - - * common: - Automatic update of common submodule - From 94ccf4c to 668acee - -2012-08-04 16:31:30 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/celt/gstceltenc.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkateutil.c: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusheader.c: - * ext/resindvd/rsnstreamselector.c: - * gst/aiff/aiffparse.c: - * gst/asfmux/gstasfmux.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mxf/mxfdemux.c: - * gst/nsf/gstnsf.c: - * tests/check/elements/camerabin.c: - * tests/check/elements/id3mux.c: - * tests/check/elements/jifmux.c: - * tests/check/elements/kate.c: - * tests/check/elements/ofa.c: - * tests/examples/mxf/mxfdemux-structure.c: - * tests/icles/metadata_editor.c: - gst_tag_list_free -> gst_tag_list_unref - -2012-08-03 11:31:00 +0200 Patricia Muscalu <patricia@axis.com> - - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlsmtpsink.c: - * tests/check/elements/curlfilesink.c: - curl: fixed some memory leaks in the plugin and the unit tests - https://bugzilla.gnome.org/show_bug.cgi?id=681117 - https://bugzilla.gnome.org/show_bug.cgi?id=681115 - -2012-08-03 14:12:05 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: require libmpg123 >= 1.13 for 24-bit formats - -2012-08-03 13:43:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: map input buffer in READ mode, not WRITE mode - Makes things actually work. - -2012-08-03 11:50:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/mpg123/gstmpg123audiodec.c: - mpg123: query supported output formats at run-time - Fixes stuff. We use a string here since we can't be bothered - with GValue. - -2012-08-03 11:48:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - * ext/mpg123/Makefile.am: - mpg123: hook up to build system - -2012-08-03 11:13:48 +0100 Carlos Rafael Giani <dv@pseudoterminal.org> - - * ext/mpg123/gstmpg123audiodec.c: - * ext/mpg123/gstmpg123audiodec.h: - mpg123: add new libmpg123-based mp3 decoder plugin - Needs a bit of cleaning up. - https://bugzilla.gnome.org/show_bug.cgi?id=681003 - -2012-08-03 00:10:01 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/schroedinger/gstschro.c: - * gst/mpegtsmux/mpegtsmux.c: - schroedinger, mpegtsmux: fix plugin names - -2012-07-31 09:36:35 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - wrappercamerabinsrc: Save image/video reconfiguration until capturing - Add a src pad event handler function that filters reconfigure events to - trigger the renegotiation code paths in the mode-specific start-capture - phase. - This is to work towards fixing unit tests but more work is needed. - -2012-08-02 14:40:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: do not access frame buffer following _finish_frame call - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=680494 - -2012-08-01 11:34:08 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/mplex/gstmplexjob.cc: - mplex: default to DVD MPEG-2 format instead of Generic MPEG-1 - -2012-08-01 11:31:04 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/mplex/gstmplexjob.cc: - mplexjob: add nicks for format enums, add some more formats - -2012-07-30 17:21:10 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/jifmux.c: - tests: fix jifmux test for fixed fail() - https://bugzilla.gnome.org/show_bug.cgi?id=680755 - -2012-07-29 01:11:29 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/check/elements/camerabin.c: - tests: camerabin: fix preview message handling - Preview messages now contain GstSamples instead of GstBuffers - -2012-07-29 00:53:29 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.h: - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin: update preview buffer pushing - need to pass a GstSample to the utilitary preview buffer post functions - as a GstBuffer doesn't have caps anymore. The GstSample has the GstCaps - and it is used to inform the preview's pipeline about the format of the - input, before it gets converted to the user's requested output format. - -2012-07-29 00:04:35 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/camerabin2/gstcamerabin2.c: - Revert "camerabin: update to new tag event creation API" - This reverts commit 5d890b3c92714e1f37163290c32911bcd7818a57. - The new API is the old API. - -2012-07-28 18:04:57 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: Fix references to avoid element leaking - Some pad probes are never going to be removed from the pads, so - we shouldn't keep a camerabin reference with them or camerabin will - never get released - -2012-07-28 15:17:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: update to new tag event creation API - -2012-07-28 12:09:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - examples: camerabin: remove assertion on null property - Check if the flags are not null before trying to set them to - camerabin to avoid an assertion - -2012-07-28 00:32:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/chromaprint/gstchromaprint.c: - * ext/gme/gstgme.c: - * ext/modplug/gstmodplug.cc: - * ext/schroedinger/gstschrodec.c: - * ext/soundtouch/gstbpmdetect.cc: - * ext/vp8/gstvp8dec.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/videoparsers/gstmpegvideoparse.c: - tag: Update for taglist/tag event API changes - -2012-07-27 13:22:52 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: process ATTACHMENT tag as sample - -2012-07-25 16:05:12 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - * ext/voaacenc/gstvoaacenc.c: - faac, voaacenc: adjust to modified audioencoder getcaps helper API - -2012-07-24 12:28:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/audiovisualizers/gstaudiovisualizer.c: - audiovisualizer: fixate caps - -2012-07-24 10:46:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstgaudieffectsorc-dist.c: - * gst/gaudieffects/gstgaudieffectsorc-dist.h: - * gst/gaudieffects/gstgaudieffectsorc.orc: - guadi: prefix orc functions with gaudi_orc_ - -2012-07-24 10:44:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/fieldanalysis/gstfieldanalysisorc-dist.c: - * gst/fieldanalysis/gstfieldanalysisorc-dist.h: - * gst/fieldanalysis/gstfieldanalysisorc.orc: - fieldanalysis: prefix orc functions - -2012-07-24 10:32:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/bayer/gstbayer2rgb.c: - * gst/bayer/gstbayerorc-dist.c: - * gst/bayer/gstbayerorc-dist.h: - * gst/bayer/gstbayerorc.orc: - * tests/check/Makefile.am: - bayer: prefix orc functions with bayer_orc - Add bayer orc to the unit test - -2012-07-24 10:32:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/baseaudiovisualizer.c: - tests: fix visualizer compilation - -2012-07-23 11:36:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroutils.c: - * ext/schroedinger/gstschroutils.h: - schro: Add support for video metadata and arbitrary strides - -2012-07-23 10:54:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroutils.c: - * ext/schroedinger/gstschroutils.h: - schro: Map raw video buffers with the correct read/write flags - -2012-07-23 10:35:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/schroedinger/gstschrodec.c: - * ext/vp8/gstvp8dec.c: - ext: Update for video base classes API changes - -2012-07-23 08:45:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 98e386f to 94ccf4c - -2012-07-21 19:59:21 +0200 Oleksij Rempel <bug-track@fisher-privat.net> - - * ext/vp8/gstvp8enc.c: - vp8enc: fix memory leak - unref frame. i hope it is correct place to do it. - Signed-off-by: Oleksij Rempel <bug-track@fisher-privat.net> - -2012-07-20 23:28:49 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlace: Use buffer flags and caps correctly - This requires a recent commit to -base that adds an INTERLACED buffer - flag. - -2012-07-20 16:43:19 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: only discard frame once upon decoding error - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=679886 - -2012-07-19 16:10:40 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstspectrascope.c: - spectrascope: fabs->sqrt to calculate the magnitude - -2012-07-18 09:19:30 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: also activate in push mode if the scheduling query failed - In case pads are unlinked somewhere. - -2012-07-18 08:41:43 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: fix push mode activation - Extra unref on push mode activation caused havoc. - -2012-07-16 00:05:26 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/spc/gstspc.c: - spc: extract year as GstDateTime instead of GDate - -2012-07-17 18:05:23 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: no need to make buffer writable twice - -2012-07-17 18:05:00 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: plug some ref leaks - -2012-07-17 14:02:14 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: adjust to modified video overlay composition API - -2012-07-17 16:39:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/rtpmux/gstrtpmux.c: - update for RTP buffer api changes - -2012-07-16 22:02:44 +0200 Stefan Sauer <ensonic@users.sf.net> - - * docs/plugins/Makefile.am: - * gst/audiovisualizers/Makefile.am: - * gst/audiovisualizers/gstaudiovisualizer.c: - * gst/audiovisualizers/gstaudiovisualizer.h: - * gst/audiovisualizers/gstbaseaudiovisualizer.h: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspacescope.h: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstspectrascope.h: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstsynaescope.h: - * gst/audiovisualizers/gstwavescope.c: - * gst/audiovisualizers/gstwavescope.h: - audiovisualizer: shorten base class name - As suggested on IRC rename to AudioVisualizer. We use custom suffix on the type - to avoid clashing with other copies for the time being. - -2012-07-15 12:27:12 +0100 Tim-Philipp Müller <tim@centricular.net> - - * ext/celt/gstceltenc.c: - * ext/opencv/gsttemplatematch.c: - * ext/wayland/gstwaylandsink.c: - * gst/dvbsuboverlay/dvb-sub.c: - * gst/festival/gstfestival.c: - * gst/hls/gsthlsdemux.c: - celt, opencv, wayland, dvbsub, festival, hls: printf format fixes - -2012-07-14 15:51:08 +0200 Alban Browaeys <prahal@yahoo.com> - - * ext/wayland/Makefile.am: - wayland: don't link to gstinterfaces, which doesn't exist any more - https://bugzilla.gnome.org/show_bug.cgi?id=679929 - -2012-06-30 00:22:40 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - * ext/opencv/gstcvdilate.c: - * ext/opencv/gstcvdilateerode.c: - * ext/opencv/gstcvequalizehist.c: - * ext/opencv/gstcverode.c: - * ext/opencv/gstcvlaplace.c: - * ext/opencv/gstcvsmooth.c: - * ext/opencv/gstcvsobel.c: - * ext/opencv/gstedgedetect.c: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstmotioncells.c: - * ext/opencv/gstopencvutils.c: - * ext/opencv/gstopencvvideofilter.c: - * ext/opencv/gstpyramidsegment.c: - * ext/opencv/gsttemplatematch.c: - * ext/opencv/gsttextoverlay.c: - * ext/opencv/gsttextoverlay.h: - opencv: port to 0.11 - Basic port to 0.11 API. - https://bugzilla.gnome.org/show_bug.cgi?id=679164 - -2012-07-13 12:32:51 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.h: - dvbsuboverlay: adaptively blend or attach video overlay composition - Conflicts: - gst/dvbsuboverlay/gstdvbsuboverlay.c - -2012-07-13 12:27:57 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.h: - dvbsuboverlay: use video overlay composition helper - ... rather than custom home-made blending. - Conflicts: - gst/dvbsuboverlay/gstdvbsuboverlay.c - -2012-07-12 10:13:50 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: more correctly determine expected PES packet payload size - ... particularly considering that packet_length == 0 is possible. - -2012-07-11 23:17:19 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/soundtouch/gstpitch.cc: - pitch: register as effect - -2012-07-11 20:34:05 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: correctly determine expected PES packet payload size - Avoids consistently failing to detect that a packet is complete, which - would then only be pushed upon the start of a next packet, which leads - to quite a delay in case of a sparse (subtitle) stream. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=666674 - -2012-07-10 17:58:22 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: ensure minimum page time out of 1 second - ... to compensate for some bogus subtitle with a 0 timeout, which would - result in only being shown for a very unreadable amount of time. - See https://bugzilla.gnome.org/show_bug.cgi?id=666674 - -2012-07-11 14:27:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/icles/pitch-test.c: - tests: fix build of pitch-test - Does not sound like the same test in 0.10 though.. - -2012-07-11 13:59:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: fix compiler warnings - gstdvbsuboverlay.c:772:15: error: pointer targets in passing argument 5 of 'gst_segment_clip' differ in signedness - /home/tpm/gst/0.11/gstreamer/gst/gstsegment.h:192:14: note: expected 'guint64 *' but argument is of type 'gint64 *' - gstdvbsuboverlay.c:772:15: error: pointer targets in passing argument 6 of 'gst_segment_clip' differ in signedness - -2012-07-11 13:49:14 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: fixup end-of-display-set forcing - Conflicts: - gst/dvbsuboverlay/gstdvbsuboverlay.c - -2012-07-11 13:48:32 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: ensure valid subtitle running time by proper clipping - In particular, pass buffer timestamp (pts) to dvb_sub, and then clip - and convert to running time when the duration (timeout) is known after - decoding it. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=660233 - Conflicts: - gst/dvbsuboverlay/gstdvbsuboverlay.c - -2012-07-11 13:45:14 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.h: - dvbsuboverlay: properly force end-of-display-set - ... which is upon receiving new data with different PTS spec-wise, - or optionally upon each packet of subtitle data if desired by property. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=669310 - Conflicts: - gst/dvbsuboverlay/gstdvbsuboverlay.c - -2011-12-21 13:00:27 +0200 Mart Raudsepp <mart.raudsepp@collabora.com> - - * gst/dvbsuboverlay/dvb-sub.c: - dvbsuboverlay: Handle non_modifying_colour_flag correctly in the RLE handlers - The check for when to not memset was checking on an undeterministic 'bits' variable value, - which is only meant to be used inside the loop earlier when it is supposed to check if - clut_index is 1 together with non_mod set, as per spec: - "non_modifying_colour_flag: If set to '1' this indicates that the CLUT entry value '1' - is a non modifying colour. When the non modifying colour is assigned to an object pixel, - then the pixel of the underlying region background or object shall not be modified. This - can be used to create "transparent holes" in objects." - https://bugzilla.gnome.org/show_bug.cgi?id=666352 - -2010-10-13 10:55:17 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - photography: update documentation - https://bugzilla.gnome.org/show_bug.cgi?id=622482 - -2010-10-14 10:49:55 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - photography: Add manual control of exposure, focus and white balance - Add new interface properties and mode for better manual control of - exposure, focus and white balance. - https://bugzilla.gnome.org/show_bug.cgi?id=622482 - -2010-10-08 11:33:31 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - * gst/camerabin2/gstwrappercamerabinsrc.c: - photography: Add GstPhotography prefix and fix spelling colour->color - https://bugzilla.gnome.org/show_bug.cgi?id=622482 - -2012-07-10 23:27:23 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: minor header indentation clean-up for mpegvideoparser - -2012-07-10 17:47:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * ext/soundtouch/gstbpmdetect.cc: - * ext/soundtouch/gstpitch.cc: - soundtouch: port to 0.11 - -2012-07-10 12:10:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/festival/gstfestival.c: - festival: unmap input buffer - -2012-07-04 10:14:35 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - * gst/festival/Makefile.am: - * gst/festival/gstfestival.c: - port festival to 0.11 - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=679373 - -2012-07-10 11:14:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/camerabin.c: - tests: fix some pad template-related criticals in camerabin test - -2012-07-10 00:59:40 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/dataurisrc/gstdataurisrc.c: - dataurisrc: copy into provided buffer if a buffer is provided - -2012-07-09 22:08:50 +0100 Tim-Philipp Müller <tim@centricular.net> - - * tests/check/elements/zbar.c: - tests: fix zbar test - -2012-07-09 12:22:45 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - asfmux: update for riff field rename - -2012-07-08 19:23:30 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.h: - audiovisualizers: update baseclass from libvisual porting - -2012-07-08 00:08:55 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/dtmf/gstdtmfsrc.c: - dtmfsrc: pass unhandled non-custom events to the base class - https://bugzilla.gnome.org/show_bug.cgi?id=666626 - -2012-07-06 14:53:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - asfmux: remove deprecated "is-live" property - Use the "streamable" property instead. - -2012-07-06 11:50:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - * sys/pvr2d/gstpvrvideosink.c: - update for query api changes - -2012-07-06 11:26:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - update for query api changes - -2012-07-06 11:03:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - update for allocation query changes - -2012-07-04 11:38:51 +0200 Aleix Conchillo Flaque <aleix@oblong.com> - - * sys/shm/shmpipe.c: - shmsrc: memory corruption when a client disconnects (fixes #679385) - -2012-07-05 13:18:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/musepack/gstmusepackdec.c: - * gst/aiff/aiffparse.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mxf/mxfdemux.c: - * gst/rawparse/gstrawparse.c: - gst: Implement segment-done event - -2012-07-03 12:57:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/directsound/gstdirectsoundsrc.c: - directsoundsrc: Chain up to the parent class' finalize implementation - -2012-07-02 17:55:37 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksink.h: - decklinksink: Better handling of audio output - Conflicts: - sys/decklink/gstdecklinksink.cpp - -2012-07-02 17:52:15 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklinksrc: Send newsegment events - -2012-07-02 17:51:18 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklinksink.cpp: - decklinksink: Mark element as sink element - -2012-07-02 17:49:54 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklink.cpp: - decklink: use GOnce in type registration - -2012-07-02 17:32:14 -0700 David Schleef <ds@schleef.org> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - inter: Increase the inter audio surface buffering - -2012-07-02 12:04:19 -0700 David Schleef <ds@schleef.org> - - * gst/inter/gstinteraudiosink.c: - interaudiosink: reenable channel property - -2012-07-02 12:03:44 -0700 David Schleef <ds@schleef.org> - - * gst/inter/gstinteraudiosrc.c: - interaudiosrc: Set format to time - -2012-06-29 12:03:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/d3dvideosink/d3dvideosink.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/pvr2d/gstpvrvideosink.c: - * sys/vdpau/gstvdpvideopostprocess.c: - sys: make video sinks default to force-aspect-ratio=true - -2012-06-28 18:04:10 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsparse.c: - mpegtsbase: Move known PSI PIDs to where they belong - This avoids tsdemux parsing data is doesn't really care about - Conflicts: - gst/mpegtsdemux/mpegtsparse.c - -2012-06-02 08:05:44 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtbase: Add more known default SI PIDs - -2012-06-28 17:40:16 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Fix AAC LATM caps - -2012-06-22 16:47:58 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/mpegtsmux.c: - tests: mpegtsmux: add basic output unit test verification - -2012-06-22 17:51:37 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/tsmux/tsmux.c: - mpegtsmux: apply some more CLOCK_BASE to ensure slack for PCR offset - Conflicts: - gst/mpegtsmux/tsmux/tsmux.c - -2012-06-27 11:23:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - fix x-wmv format string - -2012-06-26 16:33:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * gst/interlace/gstinterlace.c: - interlace: port to 0.11 - -2012-06-25 16:18:41 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: release the offscreen surface before the d3d device - The offscreen surface keeps a reference on the d3d device, so if the - device is released first we don't see the reference count debug message - going to 0 as it should be. - -2012-06-19 20:16:40 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: clean up element - Remove old commented code and uneeded extra indentation - -2012-06-19 20:03:02 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: rework locking for devices lost - -2012-06-19 20:19:27 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: release and recreate the device in prepare_window - -2012-06-24 21:11:39 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstspectrascope.c: - spectrascope: avoid dark pixels in fade-and-move-up mode - -2012-06-24 20:54:24 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/README: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - audiovisualizers: fix input buffer handling - Use _replace instead of _append to fix growing buffers. - -2012-06-23 15:02:13 +0100 Tim-Philipp Müller <tim@centricular.net> - - * gst/hls/gsturidownloader.c: - * gst/sdp/gstsdpdemux.c: - hls, sdp: update for gst_element_make_from_uri() changes - -2012-06-21 12:17:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/v4l2/README: - sys: remove left-over v4l2 dir which has moved to good - let's not keep a README around to announce it's moved to -good, - that's just clutter. - -2012-06-21 11:43:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Really always define DECKLINK_OSX conditional - -2011-07-13 19:25:08 +0100 Tony Houghton <h@realh.co.uk> - - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/mpegtspacketizer.c: - * sys/dvb/gstdvbsrc.c: - Correct satellite delivery descriptor parsing. - Original code to parse satellite delivery descriptors to generate - "satellite" structures appeared to be copy & pasted from cable's code - without amending for satellite. - Also added 8PSK to dvbsrc's enum for modulation. - https://bugzilla.gnome.org/show_bug.cgi?id=654485 - Conflicts: - gst/mpegdemux/gstmpegdesc.h - gst/mpegdemux/mpegtspacketizer.c - -2012-06-20 18:14:11 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/mpegtsparse.h: - tsparse: Rework handling and cleanups - tspad always has a static source pad which output everything received - (not functional yet). - Program pads are now request pads. - Remove all cruft that should have been removed from the switch over - to mpegtsbase. - Conflicts: - gst/mpegtsdemux/mpegtsparse.c - -2012-06-20 18:10:37 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtbase: Always send EOS - subclass will take care of handling it more if needed - -2012-06-20 17:52:13 -0500 Mike Ruprecht <mike.ruprecht@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: Fix element losing data at the end of buffers - rtmpsrc outputs truncated buffers because, when enough data is - read to fill the buffer, the amount read that time (todo) is set - to zero before it's added to the cumulative buffer size (bsize). - The buffer is then truncated to bsize resulting in lost data. - This patch adds todo to bsize before setting todo to zero. - Fixes #678509 - -2012-06-20 11:02:03 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/timidity/gsttimidity.c: - timidity: Fix flag checking - -2012-06-20 10:59:08 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/teletextdec/gstteletextdec.c: - teletext: #if0 code that never happens - The only place this method is called is with lofp being a guint8 (from - a data block). - -2012-06-20 10:58:32 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/teletextdec/gstteletextdec.c: - teletextdec: Use proper variable type - -2012-06-20 12:31:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/videocontext.c: - * gst/hls/gsturidownloader.c: - * tests/examples/camerabin2/gst-camera2.c: - * tests/examples/camerabin2/gst-camerabin2-test.c: - update for bus api changes - -2012-06-20 12:19:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/mpegtsmux.c: - tests: mpegtsmux: port test to 0.11 - -2012-06-20 12:17:37 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: fix value handling in pad iteration - -2012-06-20 10:34:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/gme/gstgme.c: - * ext/mimic/gstmimenc.c: - * ext/modplug/gstmodplug.cc: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mplex/gstmplex.cc: - * ext/musepack/gstmusepackdec.c: - * ext/sndfile/gstsfsink.c: - * ext/spc/gstspc.c: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * gst/aiff/aiffparse.c: - * gst/asfmux/gstasfparse.c: - * gst/cdxaparse/gstcdxaparse.c: - * gst/freeze/gstfreeze.c: - * gst/hls/gsthlsdemux.c: - * gst/liveadder/liveadder.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mxf/mxfdemux.c: - * gst/nsf/gstnsf.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/rawparse/gstrawparse.c: - * gst/tta/gstttaparse.c: - update for task api change - -2012-06-19 22:45:27 -0400 Matej Knopp <Matej@new-host-5.home> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: fix memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=678130 - -2012-06-19 10:35:48 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * sys/dvb/parsechannels.c: - dvb: Detect more issues with configuration file - Report useful errors when: - * file is present but empty - * requested channel is not present - -2012-06-19 10:22:50 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/parsechannels.c: - * sys/dvb/parsechannels.h: - dvbbasebin: Emit an error when we fail reading the channels file - Conflicts: - sys/dvb/dvbbasebin.c - -2011-02-01 10:23:04 -0800 Fabrizio (Misto) Milo <mistobaan@gmail.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: spell-check - -2011-01-14 19:30:08 -0800 Fabrizio (Misto) Milo <mistobaan@gmail.com> - - * sys/dvb/gstdvbsrc.c: - dvb: better dvsrc polarity info - -2012-06-18 11:36:15 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/teletextdec/gstteletextdec.c: - teletext: Fix initialization - We always ended up erroring on the first page otherwise - Conflicts: - ext/teletextdec/gstteletextdec.c - -2012-06-10 11:36:32 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Don't use GByteArray - Using a simple array comes to the same result for a fraction of the cost - -2012-06-10 11:21:41 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtbase: Avoid copying GstStructure - -2012-06-08 15:12:30 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/gstmpegdesc.c: - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegdesc: Don't allocate/free GstMPEGDescriptor - Just use static variables - -2012-06-16 16:49:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegdemux/Makefile.am: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - * gst/mpegdemux/gstpesfilter.c: - * gst/mpegdemux/plugin.c: - mpegdemux: rename plugin to mpegpsdemux - -2012-06-16 16:30:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegdemux/Makefile.am: - * gst/mpegdemux/flumpegdemux.c: - * gst/mpegdemux/flutspatinfo.c: - * gst/mpegdemux/flutspatinfo.h: - * gst/mpegdemux/flutspmtinfo.c: - * gst/mpegdemux/flutspmtinfo.h: - * gst/mpegdemux/flutspmtstreaminfo.c: - * gst/mpegdemux/flutspmtstreaminfo.h: - * gst/mpegdemux/gstmpegdesc.c: - * gst/mpegdemux/gstmpegdesc.h: - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - * gst/mpegdemux/gstsectionfilter.c: - * gst/mpegdemux/gstsectionfilter.h: - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtspacketizer.h: - * gst/mpegdemux/mpegtsparse.c: - * gst/mpegdemux/mpegtsparse.h: - mpegdemux: remove unused TS demuxer bits that have moved to tsdemux - -2012-06-16 19:20:29 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: remove obsolete struct field - -2012-06-16 16:50:43 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/Makefile.am: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux_ttxt.c: - * gst/mpegtsmux/mpegtsmux_ttxt.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - mpegtsmux: add support for DVB subtitle and teletext streams - See bug #673582. - Conflicts: - gst/mpegtsmux/Makefile.am - -2012-06-16 16:50:39 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: optionally use fixed-size PES header - -2012-06-16 16:50:36 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: only write PTS and DTS if different - -2012-06-16 16:50:32 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: optionally set data_alignment flag in PES header - -2012-06-16 16:50:27 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: re-enable inadvertent disabled code - -2012-06-16 16:44:32 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/mpegtsmux.c: - tests: mpegtsmux: adjust again to modified buffer collect behaviour - ... by effectively reverting previous adjustment. - -2012-06-16 16:49:34 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: use default CollectPads collect heuristic - ... with an appropriately custom buffer clip function to arrange for - buffer processing. - Conflicts: - gst/mpegtsmux/mpegtsmux.c - gst/mpegtsmux/mpegtsmux.h - -2012-06-16 15:54:49 +0300 Raimo Järvi <raimo.jarvi@gmail.com> - - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - mpegtsmux: Fix compiler warnings - https://bugzilla.gnome.org/show_bug.cgi?id=678211 - -2012-06-16 19:17:49 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: fix ported segment init - -2012-06-14 14:49:55 -0700 Matej Knopp <matej.knopp@gmail.com> - - * configure.ac: - * gst/mpegtsmux/Makefile.am: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/mpegtsmux_aac.c: - * gst/mpegtsmux/mpegtsmux_h264.c: - * gst/mpegtsmux/mpegtsmux_h264.h: - * gst/mpegtsmux/tsmux/crc.h: - * gst/mpegtsmux/tsmux/tsmux.c: - mpegtsmux: port to 0.11 - https://bugzilla.gnome.org/show_bug.cgi?id=678130 - -2012-06-15 13:00:37 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: don't recreate the d3d device if it already exists - -2012-06-15 11:41:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - * ext/jasper/Makefile.am: - * ext/jasper/gstjasper.c: - * ext/jasper/gstjasperdec.c: - * ext/jasper/gstjasperdec.h: - * ext/jasper/gstjasperenc.c: - * ext/jasper/gstjasperenc.h: - * ext/jp2k/Makefile.am: - jasper: Rename from jp2k to jasper - Jasper is not the only JPEG2000 library out there and we - might want to add encoders/decoders based on OpenJPEG for example. - -2012-06-15 10:32:39 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: add missing mutex unlock on error path - -2012-06-15 10:24:24 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - * ext/opus/gstopusheader.h: - * ext/opus/gstopusparse.c: - * ext/opus/gstopusparse.h: - opus: set author to myself, and update copyright notices - because as slomo noted, in fact pretty much all the code in there is mine. - -2012-06-15 00:58:43 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: don't create new internal windows if we already have one - -2012-06-08 23:01:26 +0300 Raimo Järvi <raimo.jarvi@gmail.com> - - * gst/librfb/gstrfbsrc.c: - rfbsrc: Fix compiling in Windows - https://bugzilla.gnome.org/show_bug.cgi?id=677724 - -2012-06-11 13:10:43 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/Makefile.am: - resindvd: rename the lib from libresindvd to libgstresindvd - For consistency. - -2012-06-07 15:06:34 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/resindvdsrc.c: - resindvd: guard against not finding some data on a DVD - May possibly help with a particular DVD. - https://bugzilla.gnome.org/show_bug.cgi?id=673118 - -2012-06-14 02:47:10 +0200 Sebastian Rasmussen <sebrn@axis.com> - - * tests/check/elements/curlfilesink.c: - curlfilesink: Remove stray debug prints - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=678060 - -2012-06-12 21:35:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * LICENSE_readme: - * ext/Makefile.am: - * ext/lcs/Makefile.am: - * ext/lcs/gstcolorspace.c: - lcs: remove old LCS colorspace conversion plugin - Wasn't even ported to 0.10, and even back in the day - no one knew where the corresponding lib was from. - -2012-06-12 21:29:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/chart/.gitignore: - * gst/chart/Makefile.am: - * gst/chart/chart.vcproj: - * gst/chart/gstchart.c: - chart: remove old plugin that has never been ported to 0.10 - -2012-06-12 21:20:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/videodrop/Makefile.am: - * gst/videodrop/gstvideodrop.c: - * gst/videodrop/gstvideodrop.h: - * gst/videodrop/videodrop.vcproj: - videodrop: drop videodrop - It was never even ported to 0.10, and videorate does its job now. - -2012-06-12 21:16:52 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * LICENSE_readme: - * REQUIREMENTS: - * ext/Makefile.am: - * ext/arts/.gitignore: - * ext/arts/Makefile.am: - * ext/arts/gst_arts.c: - * ext/arts/gst_arts.h: - * ext/arts/gst_artsio.idl: - * ext/arts/gst_artsio_impl.cc: - * ext/arts/gst_artsio_impl.h: - * ext/artsd/Makefile.am: - * ext/artsd/REQUIREMENTS: - * ext/artsd/gstartsdsink.c: - * ext/artsd/gstartsdsink.h: - * m4/Makefile.am: - * m4/as-arts.m4: - * m4/gst-artsc.m4: - arts: remove aRts-related plugins - aRts development stopped in 2004, it's unlikely ever is - still using it. Besides, these elements were never even - ported to 0.10. - -2012-06-12 21:02:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * LICENSE_readme: - * ext/Makefile.am: - * ext/shout/Makefile.am: - * ext/shout/gstshout.c: - * ext/shout/gstshout.h: - shout: remove old shout plugin that has never been ported to 0.10 - There's shout2 in -good now. - -2012-06-12 20:35:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * LICENSE_readme: - * ext/Makefile.am: - * ext/hermes/Makefile.am: - * ext/hermes/gsthermescolorspace.c: - hermes: remove hermes colorspace converter that was never ported to 0.10 - -2012-06-12 19:06:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Android.mk: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-legacyresample.xml: - * gst-plugins-bad.spec.in: - * gst/legacyresample/Makefile.am: - * gst/legacyresample/buffer.c: - * gst/legacyresample/buffer.h: - * gst/legacyresample/debug.c: - * gst/legacyresample/debug.h: - * gst/legacyresample/functable.c: - * gst/legacyresample/functable.h: - * gst/legacyresample/gstlegacyresample.c: - * gst/legacyresample/gstlegacyresample.h: - * gst/legacyresample/resample.c: - * gst/legacyresample/resample.h: - * gst/legacyresample/resample_functable.c: - * gst/legacyresample/resample_ref.c: - * tests/check/Makefile.am: - * tests/check/elements/legacyresample.c: - legacyresample: remove legacy plugin - -2012-06-12 19:02:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/Makefile.am: - * ext/audioresample/Makefile.am: - * ext/audioresample/gstaudioresample.c: - * ext/audioresample/gstaudioresample.h: - audioresample: remove old audioresample plugin that was never even ported to 0.10 - -2012-06-12 18:53:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/chromaprint/gstchromaprint.c: - chromaprint: update for new tag event API - -2012-06-12 18:47:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * LICENSE_readme: - * REQUIREMENTS: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-divxdec.xml: - * docs/plugins/inspect/plugin-divxenc.xml: - * ext/Makefile.am: - * ext/divx/Makefile.am: - * ext/divx/gstdivxdec.c: - * ext/divx/gstdivxdec.h: - * ext/divx/gstdivxenc.c: - * ext/divx/gstdivxenc.h: - divx: remove plugin that the world doesn't need any more - 2002 called. - -2012-06-12 10:59:39 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: Fix array type - We wanted an array of guint8 (and not an array of pointers) to store - the data from gst_buffer_extract() and read it. - -2012-06-12 09:10:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: don't access buffer after _finish_frame - Unmap the buffer before calling _finish_frame because we are not allowed to - access it after. - -2012-06-11 16:45:53 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: sprinkle some more debug catering - -2012-06-11 16:44:02 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: add SPN/PTS indexing capabilities - Based on patch by Andreas Frisch <fraxinas@opendreambox.org> - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=644890 - -2012-06-11 14:03:26 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - mpegtsmux: avoid memcpy due to temporary packet buffer - ... by writing directly into the output buffer instead. - -2012-06-11 10:49:15 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: do not assert on data input, just return - https://bugzilla.gnome.org/show_bug.cgi?id=674069 - -2012-06-10 14:29:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - * gst/dvdspu/gstspu-vobsub-render.c: - dvdspu: allow debugging of render and highlight rectangles via environment variable - Enable debugging of rectangles via GST_DVD_SPU_DEBUG. - https://bugzilla.gnome.org/show_bug.cgi?id=667223 - Conflicts: - gst/dvdspu/gstspu-vobsub-render.c - -2011-12-31 18:35:40 -0600 Rob Clark <rob@ti.com> - - * gst/dvdspu/gstspu-vobsub-render.c: - dvdspu: cleanup debug code - Clean up debug code for drawing highlight rects which wasn't even - compiling previously. - TODO: might be nice if this could be controlled by properties or - env variables to make it possible to enable the debug code at - runtime. - https://bugzilla.gnome.org/show_bug.cgi?id=667223 - Conflicts: - gst/dvdspu/gstspu-vobsub-render.c - -2012-06-08 17:14:09 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: plug leaks when freeing stream - -2012-06-08 17:13:39 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/mpegtsmux.c: - tests: mpegtsmux: plug some leaks - -2012-06-08 15:58:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/hls/gsthlsdemux.c: - * tests/check/elements/curlfilesink.c: - * win32/common/config.h: - elements: Use gst_pad_set_caps() instead of manual event fiddling - -2012-06-08 15:05:12 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * common: - Automatic update of common submodule - From 03a0e57 to 98e386f - -2012-06-08 11:55:35 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/mpegtsmux.c: - tests: mpegtsmux: adjust to modified buffer collect behaviour - -2012-06-08 11:12:06 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/libs/mpegvideoparser.c: - tests: mpegvideoparser: adjust to modified API - -2012-06-07 17:43:06 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: drain cached data upon EOS - -2012-06-07 17:38:51 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: allow for aligned output - ... and refactor packet handling some more in the process. - Fixes #651805. - -2012-06-07 14:38:10 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - mpegtsmux: improve m2ts timestamp interpolation - * a known PCR should really belong to a packet holding that PCR - * interpolation can be extended backward for initial packets (PAT, PMT) - -2012-06-07 12:17:24 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: tweak output buffer timestamping - -2012-06-07 16:23:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - Back to development - -=== release 0.11.92 === - -2012-06-07 16:23:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * ext/cog/gstcogorc-dist.c: - * gst-plugins-bad.doap: - * gst/bayer/gstbayerorc-dist.c: - * gst/fieldanalysis/gstfieldanalysisorc-dist.c: - * gst/gaudieffects/Makefile.am: - * win32/common/config.h: - Release 0.11.92 - -2012-06-07 16:22:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2012-06-07 12:33:31 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - vp8: fix codec state leaks - I only tested that vp8enc ! vp8dec does not crash, as valgrind does not grok - at least one of the instructions used by vp8enc, preventing me from checking - a leak, and the lack of one after the patch. - -2012-06-07 12:25:03 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dirac/gstdiracenc.cc: - diracenc: fix buffer leak - -2012-06-07 12:16:21 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dirac/gstdiracenc.cc: - diracenc: fix frame leaks - -2012-06-07 12:01:31 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dirac/gstdiracenc.cc: - diracenc: fix codec state leak - -2012-06-07 11:58:53 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/dirac/gstdiracenc.cc: - diracenc: fix stray unref causing access to freed memory - -2012-06-07 11:52:12 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - schroedinger: fix video codec state leaks - -2012-06-06 18:18:54 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * common: - Automatic update of common submodule - From 1fab359 to 03a0e57 - -2012-06-06 16:00:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/gme/gstgme.c: - gme: update for tag event change - -2012-06-03 01:58:12 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - configure: Fix the wayland version - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=677362 - -2012-06-06 13:02:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/modplug/gstmodplug.cc: - * ext/schroedinger/gstschrodec.c: - * ext/vp8/gstvp8dec.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/videoparsers/gstmpegvideoparse.c: - update for tag event change - -2012-06-06 11:14:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/bayer/gstbayer2rgb.c: - bayer: fix output frame map - -2012-06-05 17:57:41 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: Remove un-needed checks and inline some functions - val and nr always exist (&nr, &value) - bits is always called smaller than the width - Makes parsing 30% faster - -2012-06-05 18:03:10 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - mpegtsmux: more header clarifications and remove some redundant fields - -2012-06-05 14:18:34 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/tsmux/tsmux.c: - mpegtsmux: avoid PID collision for auto-generated PID - -2012-06-05 16:59:44 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - tsmux: inline more code - With the previous commit, makes mpegtsmux 10 to 15% faster - -2012-06-05 16:58:43 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: Don't use g_list_first () - Seriously ... - -2012-06-05 12:17:26 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: also properly reset and free pad data - -2012-06-05 11:52:14 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: refactor init using _reset to cater for proper reuse - -2012-06-04 16:24:05 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: header cleanups and clarifications - -2012-06-04 16:05:03 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: tweak buffer handling - ... for clarity and to avoid mixing _peek/_pop - -2012-06-04 16:03:20 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: misc code cleanups and refactoring - -2012-06-04 14:54:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: avoid separate allocation for list of programs - -2012-06-04 14:54:08 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: rearrange define's - -2012-06-04 14:48:29 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: removed hacked event handling - Conflicts: - gst/mpegtsmux/mpegtsmux.c - Reverted back to 0.10 state as it wasn't really ported - yet anyway. - -2012-06-05 09:54:53 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtsdemux: Also parse TOT (Time Offset Section) - It's the same as TDT, except with descriptors at the end - -2012-06-05 09:52:42 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtsdemux: FIXME/Comment about issues/errors - -2012-06-05 09:48:04 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Fix leak - -2012-06-05 09:44:45 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Reduce usage of GstAdapter - Peek as much as possible in one go. Ideally we should remove usage of - adapter altogether, but for the time being it provides a big enough - speedup (around 2 times faster per packet processed). - -2012-06-04 08:39:11 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtspacketizer: Avoid alloc/free where possible - Helps for streams with a lot of sections, like EIT - -2012-06-04 08:37:44 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtbase: Add more sections that don't have a CRC - -2012-06-04 08:32:51 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/mpegtsbase.c: - mpegdefs: Add list of known table_id - Along with the specifications from which they come. Avoids having - to search for which spec a table_id belongs to - -2012-06-03 10:58:20 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Clarify debug statements - Use hex values in more cases (since that's how PID/table_id/... are - represented in the various specs). - -2012-06-03 10:56:28 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtsbase/packetizer: Add CAT section handling - Allows reporting the global EMM - -2012-06-03 10:53:52 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtbase: Add more debug in PSI handling - Allows us to identify which SI we don't handle - -2012-06-03 10:53:13 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtbase: Add more default known PSI table_id - -2012-06-02 08:06:24 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtbase: Refactor PSI detection - -2012-06-05 09:30:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * win32/common/config.h: - win32: Update config.h - -2012-06-05 09:30:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - videoparsers: Fix GstBaseParse::get_sink_caps() implementations - They should take the filter caps into account and always return - the template caps appended to the actual caps. Otherwise the - parsers stop to accept unparsed streams where upstream does not - know about width, height, etc. - Fixes bug #677401. - -2012-06-01 16:29:03 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtbase: ECM/CA sections don't have a CRC - So don't check for it :) - Also add a bit more info in the warning message to speed up detecting - whether it's a false-positive or not. - -2012-06-01 10:59:22 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - codecparsers: mpeg: relax entry constraint - ... since it is acceptable and properly handled further on. - -2012-06-01 10:29:06 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * common: - Automatic update of common submodule - From f1b5a96 to 1fab359 - -2012-05-31 13:08:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 92b7266 to f1b5a96 - -2012-05-29 10:48:54 -0700 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowfakesrc.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - dshowdecwrapper: add support for VC1 and fix plugins ranks - -2012-05-29 10:48:03 -0700 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/dshowdecwrapper/gstdshowdecwrapper.cpp: - * sys/dshowdecwrapper/gstdshowfakesrc.cpp: - dshowdecwrapper: initialize debug properly - -2012-05-29 10:43:43 -0700 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - dshowdecwrapper: fix object disposal and finalization - -2012-05-30 10:34:44 -0700 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: don't flush after a device lost - -2012-05-30 13:54:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/applemedia/Makefile.am: - applemedia: Put the right flags into the right variable - -2012-05-30 12:45:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From ec1c4a8 to 92b7266 - -2012-05-30 11:32:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Revert accidentially committed stuff in last commit - -2012-05-30 11:24:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * sys/applemedia/Makefile.am: - configure: Add OBJC specific compiler flags - See bug #643939. - -2012-05-30 11:23:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 3429ba6 to ec1c4a8 - -2012-05-29 17:24:02 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: read gain from the right place in the header - It's at byte offset 16, not 14. - -2012-05-24 11:11:00 -0300 Andre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: Refactoring and make core more similar to textoverlay - Especially the combining of the text and video buffers is now - almost the same as in textoverlay. - We should really get a base class for this. - Conflicts: - ext/assrender/gstassrender.c - ext/assrender/gstassrender.h - -2012-05-28 15:48:33 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/camapplication.c: - * sys/dvb/camconditionalaccess.c: - * sys/dvb/camtransport.c: - dvb: Add more debugging to cam support - -2012-04-24 11:09:11 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/dirac/Makefile.am: - * ext/dirac/gstdirac.cc: - * ext/dirac/gstdiracdec.cc: - * ext/dirac/gstdiracenc.cc: - dirac: Port to -base video classes - Conflicts: - ext/dirac/Makefile.am - -2012-05-28 16:42:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - * gst-libs/gst/video/gstbasevideoutils.c: - * gst-libs/gst/video/gstbasevideoutils.h: - basevideo: Remove old video base classes - -2012-05-28 16:42:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroutils.c: - * ext/schroedinger/gstschroutils.h: - schroedinger: Port to 0.11 again - -2012-05-28 07:58:52 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/schroedinger/gstschrodec.c: - schrodec: We don't assume packetized input - Otherwise the parse vmethod nevers gets called - -2012-04-24 11:08:58 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/schroedinger/Makefile.am: - * ext/schroedinger/gstschro.c: - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroutils.c: - * ext/schroedinger/gstschroutils.h: - schroedinger: Port to -base video classes - Conflicts: - ext/schroedinger/Makefile.am - ext/schroedinger/gstschrodec.c - ext/schroedinger/gstschroenc.c - Back to 0.10 state, needs porting again. - -2012-05-28 16:05:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - vp8: Port to 0.11 again - -2012-05-18 12:46:55 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: fix target bitrate config with libvpx 1.1.0 - libvpx 1.1.0 disallows a bitrate of 0, which was used by - vp8enc as a default value. - Instead, we use the default libvpx bitrate, scaled to our - video size, if no bitrate was specified. - This fixes encoding VP8 video with libvpx 1.1.0. - https://bugzilla.gnome.org/show_bug.cgi?id=676245 - -2012-05-16 14:04:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Update for GstVideoCodecFrame API changes - -2012-04-27 18:22:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8dec.h: - vp8dec: Improve output_state handling - Avoid getting output_state for every buffer as that requires - getting the objectlock and doing reference counting. Store it locally - when it is created and use it. - -2012-04-27 09:05:57 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * ext/vp8/gstvp8dec.c: - vp8dec: Use outputstate when copying output buffer data - Using the input state was causing a crash because the strides/offsets - would be wrong. Fix it by using the output as we are dealing with - the decoded frame. - -2012-04-24 11:08:41 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/vp8/Makefile.am: - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8dec.h: - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - vp8: Port to -base video base classes - Conflicts: - ext/vp8/Makefile.am - ext/vp8/gstvp8dec.c - ext/vp8/gstvp8enc.c - Back to 0.10 state for now, need to be ported again. - -2012-05-27 23:41:24 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: do not assert on bad header, error out instead - -2012-05-27 00:00:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/jifmux.c: - tests: don't use GstStructure API on tag lists - -2012-05-26 14:57:50 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/gstmpegdesc.h: - mpegdesc: Add more comments/info - Namely where they belong to - -2012-05-26 14:57:23 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Make sure we have a language code before using it - -2012-05-26 14:11:24 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Check before getting descriptors from structure - Avoids spurious warnings. Not having those descriptors is nothing - fatal, so check their presence before trying to get them. - -2012-05-26 14:08:41 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/pesparse.c: - pesparse: Be a bit more permissive with PTS/DTS parsing - According to the specifications a PTS_DTS_flags value of 0x01 is forbidden. - ... but there are some rare files out there that do that. - Instead of erroring out, let's warn, carry on parsing accordingly. - If the packet is really corrupted there are enough checks afterward to - detect that. - -2012-05-25 22:20:07 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusparse.c: - opusparse: heed test vector framing to eat any padding - This fixes parsing on one particular test vector where payload - data is smaller than the actual audio payload. - -2012-05-25 14:15:44 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.h: - mpegtsbase: Fix bit operation - "a % 8" corresponds to "a & 0x7" (and not 0xf). - spotted by Julian Scheel - -2012-05-24 16:22:42 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/opus/gstopusparse.c: - opusparse: Simplify check - Avoids a unset variable warning (for nframes) with gcc 4.7.0 - -2012-05-24 22:12:56 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusheader.c: - opus: reject major version number above what we grok - -2012-05-24 21:58:44 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusheader.c: - opus: bump written version from 0 to 0x01 - as per the spec update at https://wiki.xiph.org/OggOpus#ID_Header - -2012-04-30 14:40:02 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: fix lost packet handling for FEC/PLC - The base audio decoder sends zero size packets, not NULL buffers, - to signal dropped packets. - -2012-05-24 12:32:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From dc70203 to 3429ba6 - -2012-05-23 18:19:52 +0200 Sebastian Rasmussen <sebrn@axis.com> - - * configure.ac: - configure: suppress some warnings when debug is disabled - Warnings about unused variables should be suppressed if core has the - debug system disabled. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=676672 - -2012-04-25 21:21:43 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - * sys/d3dvideosink/Makefile.am: - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/d3dvideosink.h: - * sys/d3dvideosink/directx/directx.h: - * sys/d3dvideosink/directx/directx10/dx10_d3d.h: - * sys/d3dvideosink/directx/directx11/dx11_d3d.h: - * sys/d3dvideosink/directx/directx9/dx9_d3d.c: - * sys/d3dvideosink/directx/directx9/dx9_d3d.h: - * sys/d3dvideosink/directx/directx_d3d.c: - * sys/d3dvideosink/directx/directx_d3d.h: - Port d3dvideosink to 0.11 - Fixes #674817 - -2012-05-23 12:07:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - wayland: port to 0.11 - -2012-05-22 18:55:38 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: Emit no-more-pads when pad is added - This avoids an endless hang with playbin2, which sees dvbbasesbin as - having dynamic pads ... but never emitted no-more-pads. - -2012-05-22 18:53:16 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/camutils.c: - camutils: Fix PMT message construction - The size of the message ended up being bigger than its content. - That cause some CA modules to just hang. - -2012-05-22 18:51:34 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/camtransport.c: - camtransport: Allow delay when setting up cam device - Some CA devices take a long time to set themselves up, - therefore retry every 250ms (for a maximum of 2.5s) - -2012-05-22 18:49:54 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Fixup/add debug statements - -2012-05-22 18:48:07 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Only open device read/write when needed - Avoid starting up kernel thread when not needed - -2012-05-22 18:46:09 +0200 Edward Hervey <edward@collabora.com> - - * sys/dvb/parsechannels.c: - dvb: Add warning when dvb channels file isn't present - -2012-05-23 08:39:21 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - mpegtsbase: Speed up _is_psi() - By making it inline and simplifying the bit macros - -2012-05-22 21:00:31 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: avoid scanning for start codes twice - ... since a previous terminating start code serves as subsequent start code. - -2012-05-22 19:11:29 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - dvb: Fixups for latest API changes - -2012-04-10 12:36:15 +0200 Julian Scheel <julian@jusst.de> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Add language code to taglist. - Read the language codes for tracks from the mpegts descriptors and add it into - the pads taglist. - https://bugzilla.gnome.org/show_bug.cgi?id=673896 - -2012-05-21 17:53:37 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Adapt to new packetizer API - We no longer use GstBufferList and instead copy the incoming data - into newly allocated memory. - This makes tsdemux behaviour 3 to 4 times faster. - -2012-05-21 17:53:15 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsparse.c: - tsparse: Adapt to new packetizer API - -2012-05-21 17:52:46 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Adapt to new packetizer behaviour - -2012-05-21 17:48:54 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtspacketizer: Avoid usage of GstBuffer internally - The overhead of creating/using 188 byte GstBuffer from GstAdapter - is too expensive. - We now peek the next packet, and provide a data/size which is only - valid until the packetizerpacket is cleared. - In addition, cleanup all the internal code to deal with that new - behaviour and remove double-checks which are no longer needed. - The section_length is now the corrected section_length (i.e. with - the additional 3 bytes). - Avoid using gst_adapter_prev_timestamp and instead track - the timestamp ourself. - -2012-05-20 13:27:29 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtspacketizer: Detect PCR wraparound in skew code - If the received PCR is going backwards (by a safe margin), include - that wraparound for further calculation. - https://bugzilla.gnome.org/show_bug.cgi?id=674536 - -2012-05-22 14:48:40 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gstmpegvideoparse.c: - videoparsers: avoid repeated caps setting - -2012-05-22 14:00:36 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstmpegvideoparse.h: - mpegvideoparse: tweak codec parser API and adjust parser element - ... to allow for more efficient parsing and (more) consistent parsing API - among various codec parsers. - Fixes #672701. - Conflicts: - gst/videoparsers/gstmpegvideoparse.c - -2012-05-22 12:30:07 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/codecparsers/gstmpeg4parser.h: - codecparsers: mpeg4: fixup documentation spelling - -2012-05-08 16:51:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - mpegvideoparser: Optimize scanning for start code - https://bugzilla.gnome.org/show_bug.cgi?id=672701 - -2012-05-18 12:46:55 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: fix target bitrate config with libvpx 1.1.0 - libvpx 1.1.0 disallows a bitrate of 0, which was used by - vp8enc as a default value. - Instead, we use the default libvpx bitrate, scaled to our - video size, if no bitrate was specified. - This fixes encoding VP8 video with libvpx 1.1.0. - https://bugzilla.gnome.org/show_bug.cgi?id=676245 - -2012-05-22 11:10:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - frei0r: Double properties are supposed in the range 0.0, 1.0 - Fixes bug #676137. - -2012-05-21 19:22:19 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstmpegvideoparse.h: - mpegvideoparse: unobfuscate frame parsing - ... and add comments and debug statements. - Fixes #674202. - Conflicts: - gst/videoparsers/gstmpegvideoparse.c - -2012-05-21 16:37:37 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Revert "fix crash" - This reverts commit 91210831ee672343a296f31357144359d5c2e768. - Such explicit reset should not be needed as it is arranged for by - the baseclass in unison with monitoring for a new frame by subclass. - As such it might wrongfully hide something else going on ... - See #674073. - -2012-05-21 15:24:25 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - codecparsers: mpegvideoparser: fix buffer size check - ... to mind unsigned integer wrap - Based on patch by Alban Browaeys <prahal@yahoo.com> - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=673436 - -2012-05-21 15:09:02 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/mpegvideoparse.c: - tests: mpegvideoparse: fix unit test regression - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=676097 - Conflicts: - tests/check/elements/mpegvideoparse.c - -2012-05-19 15:34:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: don't access GstElementFactory structure directly - -2012-05-18 16:17:13 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: mpeg4: do not expect a marker bit where not specified - Fixes #672447. - -2012-05-16 16:15:58 +0200 Julian Scheel <julian@jusst.de> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: flush on pusi only for payload packets - Data should not be flushed out of the tsdemux because a payload unit start - indicator (pusi) is seen in a adaptation only ts packet. If the package contains no - payload a pusi does not indicate a new PES packet, but PSI information, etc. - This fixes playback of several TS files which contain ts packets without - payload but with pusi set to 1. - https://bugzilla.gnome.org/show_bug.cgi?id=676168 - -2012-05-18 10:15:15 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Don't queue data for streams that don't have a pad - This would result in an error further down, and it also avoids processing - for that data which we wouldn't be using anyway. - -2012-05-18 10:13:19 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - tsdemux: Detect and handle scrambled packets - Users (tsdemux/mpegtsparse) can decide what to do with that - -2012-05-18 10:07:56 +0200 Edward Hervey <edward@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Emit no-more-pads when all pads are activated - Fixes #670921 again - -2012-05-17 11:15:22 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstgaudieffectsorc-dist.c: - * gst/gaudieffects/gstgaudieffectsorc-dist.h: - gaudieffects: add fallback code for orc - this includes an improved version of the burn filter, with a ~40% speed - improvement. - -2012-05-17 10:49:11 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * configure.ac: - configure: bump the orc version required to 0.4.16 - Some opcodes have changed so they would fail to build with 0.4.14 - -2012-05-17 09:47:08 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstsolarize.c: - gaudieffects: use CLAMP in solarize - No need to have a gate_int () function duplicating the already existing and - established CLAMP () function. - -2012-05-17 09:46:37 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstexclusion.c: - gaudieffects: use CLAMP in exclusion - No need to have a gate_int () function duplicating the already existing and - established CLAMP () function. - -2012-05-17 09:45:52 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstdodge.c: - gaudieffects: use CLAMP in dodge - No need to have a gate_int () function duplicating the already existing and - established CLAMP () function. - -2012-05-17 09:44:29 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstchromium.c: - gaudieffects: use CLAMP in chromium - No need to have a gate_int () function duplicating the already existing and - established CLAMP () function. - -2012-05-17 11:47:19 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: also consider nal_length_size when inserting codec data - See #676174. - -2012-05-16 21:50:48 +0100 John Hein <n4kdlmx02@sneakemail.com> - - * gst/y4m/Makefile.am: - y4m: link against the right libgstvideo - https://bugzilla.gnome.org/show_bug.cgi?id=676189 - -2012-05-16 17:50:43 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstsolarize.c: - gaudieffects: example pipelines with videoconvert - -2012-05-16 17:49:12 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/Makefile.am: - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstgaudieffectsorc.orc: - gaudieffects: orc-ify burn filter - -2012-05-16 09:12:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Require core/base 0.11.91 - -2012-01-13 18:57:20 -0500 Matej Knopp <matej.knopp@gmail.com> - - * .gitignore: - .gitignore: add visual studio IDE files and OS X .DS_Store files - https://bugzilla.gnome.org/show_bug.cgi?id=667899 - -2012-05-15 15:46:28 +0200 Stefan Sauer <ensonic@users.sf.net> - - * gst/hls/gstfragment.c: - * gst/hls/gsturidownloader.c: - hls: use gst api for timestamps instead of the (wrong) api from a too new glib - Conflicts: - gst/hls/gstfragment.c - -2012-05-14 11:38:21 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: optimize output by aggregating packets - ... rather than pushing each (small) packet in a separate buffer. - m2ts mode not yet optimized though. - -2012-05-11 11:46:58 +0200 Albert Astrals Cid <albert.astals at canonical.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegts: support items in extended event descriptor - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=672478 - -2012-05-14 09:15:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlbasesink.h: - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/gstcurlsmtpsink.h: - curl: fix compilation - Don't use deprecated thread API - -2012-05-13 17:00:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - Back to development - -=== release 0.11.91 === - -2012-05-13 16:43:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ChangeLog: - * NEWS: - * RELEASE: - * common: - * configure.ac: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.11.91 - -2012-05-13 16:43:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2012-05-13 15:56:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From dc70203 to 3429ba6 - -2012-05-13 15:24:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/curl/gstcurlhttpsink.c: - curl: Fix equality comparison with extraneous parantheses compiler warning - gstcurlhttpsink.c:411:27: error: equality comparison with extraneous parentheses - -2012-05-12 12:08:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/.gitignore: - check: make git ignore new unit test binaries - -2012-04-25 19:46:53 +0200 Sebastian Rasmussen <sebrn@axis.com> - - * docs/plugins/Makefile.am: - * ext/curl/Makefile.am: - * ext/curl/gstcurl.c: - * ext/curl/gstcurlsmtpsink.c: - * ext/curl/gstcurlsmtpsink.h: - * tests/check/Makefile.am: - * tests/check/elements/curlsmtpsink.c: - curl: new curlsmtpsink element - https://bugzilla.gnome.org/show_bug.cgi?id=653741 - -2012-01-23 09:45:24 +0100 Patricia Muscalu <patricia@axis.com> - - * ext/curl/Makefile.am: - * ext/curl/gstcurl.c: - * ext/curl/gstcurlftpsink.c: - * ext/curl/gstcurlftpsink.h: - * tests/check/Makefile.am: - * tests/check/elements/curlftpsink.c: - curl: new curlftpsink element - http://bugzilla.gnome.org/show_bug.cgi?id=653741 - -2012-01-23 09:28:10 +0100 Patricia Muscalu <patricia@axis.com> - - * ext/curl/Makefile.am: - * ext/curl/gstcurl.c: - * ext/curl/gstcurlfilesink.c: - * ext/curl/gstcurlfilesink.h: - * tests/check/Makefile.am: - * tests/check/elements/curlfilesink.c: - curl: new curlfilesink element - https://bugzilla.gnome.org/show_bug.cgi?id=653741 - -2012-01-23 09:00:47 +0100 Patricia Muscalu <patricia@axis.com> - - * configure.ac: - * docs/plugins/Makefile.am: - * ext/curl/Makefile.am: - * ext/curl/gstcurl.c: - * ext/curl/gstcurlbasesink.c: - * ext/curl/gstcurlbasesink.h: - * ext/curl/gstcurlhttpsink.c: - * ext/curl/gstcurlhttpsink.h: - * ext/curl/gstcurlsink.h: - * ext/curl/gstcurltlssink.c: - * ext/curl/gstcurltlssink.h: - * tests/check/Makefile.am: - * tests/check/elements/curlhttpsink.c: - curl: refactor curlsink, rename to curlhttpsink - Split into base, tls and http classes. - https://bugzilla.gnome.org/show_bug.cgi?id=653741 - -2012-05-10 21:15:42 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstsolarize.c: - gaudieffects: consistency in templates name - -2012-05-10 10:11:18 -0400 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - hlsdemux: Add a connection-speed property - Conflicts: - gst/hls/gsthlsdemux.c - -2012-05-10 10:10:14 -0400 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/hls/gsthlsdemux.c: - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - hls: Add a way to get best playlist for a specific bitrate in M3U8Client - Make use of it in hlsdemux - -2012-05-08 13:27:15 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Add failover protection. - Multiple streams with same bandwidth get retried - -2012-05-08 13:04:35 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - hlsdemux: Calculate the real bitrate and switch to the correct variant - We now calculate the actual bitrate using the download speed/size and - then switch directly to the variant that matches our bandwidth the - most. - It will also be able to handle any use case where some of the - variants are not available, and would skip them and go to the next - possible variant. - Conflicts: - gst/hls/gsthlsdemux.c - -2012-05-08 11:34:47 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Do not reset the sequence number in a live stream for a normal playlist update. - Only for stream switching - -2012-05-08 11:33:50 -0400 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: If we update the playlist, make sure the sequence number is never more than 3 fragments before the end - -2012-05-08 11:13:26 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: In a live stream, do not start from 3 fragments before the end. - -2012-05-08 11:09:28 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - hlsdemux: No need to store position since it's the buffer's timestamp - This also will fix the issue of having the current position different - from the actual position of the first buffer in the queue in case - the caching caused a resync of the sequence number. - Conflicts: - gst/hls/gsthlsdemux.c - -2011-09-15 20:47:54 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Fallback to previous playlist when switching if the new playlist can't be fetched - -2012-05-10 13:46:27 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstgaussblur.h: - gaudieffects: consistency fixes in gstgaussblur - -2012-05-10 10:47:27 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstgaussblur.h: - gaudieffects: port gaussianblur to GstVideoFilter - -2012-05-09 17:21:30 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstsolarize.c: - * gst/gaudieffects/gstsolarize.h: - gaudieffects: port solarize to GstVideoFilter - -2012-05-09 17:06:20 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstexclusion.h: - gaudieffects: port exclusion to GstVideoFilter - -2012-05-09 16:55:17 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstdodge.h: - gaudieffects: port dodge to GstVideoFilter - -2012-05-09 16:30:40 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdilate.h: - gaudieffects: port dilate to GstVideoFilter - -2012-05-09 16:10:18 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstburn.h: - gaudieffects: port burn to GstVideoFilter - -2012-05-09 15:44:02 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstchromium.h: - gaudieffects: port chromium to GstVideoFilter - -2012-05-09 14:28:09 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstgaussblur.c: - gaudieffects: use GST_DEBUG_FUNCPTR in blur - -2012-05-09 13:35:46 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * configure.ac: - gaudieffects: port to 0.11 - -2012-05-09 09:49:10 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstgaussblur.h: - gaudieffects: port gaussblur to 0.11 - -2012-05-08 18:09:20 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstsolarize.c: - * gst/gaudieffects/gstsolarize.h: - gaudieffects: port solarize to 0.11 - -2012-05-08 18:09:09 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstexclusion.h: - gaudieffects: port exclusion to 0.11 - -2012-05-08 17:38:22 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstdodge.h: - gaudieffects: port dodge to 0.11 - -2012-05-08 17:17:16 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdilate.h: - gaudieffects: port dilate to 0.11 - -2012-05-08 16:50:06 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstgaussblur.h: - gaudieffects: add header to gaussblur - -2012-05-08 16:39:02 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstchromium.h: - gaudieffects: port chromium to 0.11 - -2012-05-08 16:38:48 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstburn.h: - gaudieffects: port burn to 0.11 - -2012-05-08 14:17:06 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstsolarize.c: - controller: port to new controller location and api - -2012-05-08 17:58:58 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: fix deadlock when the device is lost - -2012-05-08 18:10:30 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: remove trailing ';' from locks defines to make gst-indent happy - -2012-05-07 13:13:34 -0700 Aleix Conchillo Flaque <aleix@oblong.com> - - * sys/shm/shmpipe.c: - shmsink: fix memory corruption when a client disconnects (fixes #675640) - Also, add a check to make sure a client isn't dumped twice - -2012-05-07 23:57:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/librfb/gstrfbsrc.c: - rfbsrc: call WSAStartup/Cleanup on win32 - If we link against libwinsock2, we should probably call - Startup/Cleanup as well. - https://bugzilla.gnome.org/show_bug.cgi?id=675415 - -2012-05-03 23:42:13 +0200 Marc-André Lureau <marcandre.lureau@gmail.com> - - * gst/librfb/Makefile.am: - rfbsrc: fix librfb linking on win32 - libtool: link: i686-w64-mingw32-gcc -shared .libs/libgstrfbsrc.dll.def - .libs/libgstrfbsrc_la-gstrfbsrc.o -Wl,--whole-archive ./.libs/librfb.a - -Wl,--no-whole-archive -L/usr/i686-w64-mingw32/sys-root/mingw/lib - -lgstbase-0.10 -lgstreamer-0.10 -lxml2 -lgobject-2.0 -lgthread-2.0 - -lgmodule-2.0 -lglib-2.0 -lintl -mms-bitfields -mms-bitfields -O2 -o - .libs/libgstrfbsrc.dll -Wl,--enable-auto-image-base -Xlinker - --out-implib -Xlinker .libs/libgstrfbsrc.dll.a - Creating library file: .libs/libgstrfbsrc.dll.a - ./.libs/librfb.a(librfb_la-rfbdecoder.o): In function - `rfb_decoder_read': - /home/elmarco/pkg/rhel/mingw-gstreamer-plugins-bad-free/gst-plugins-bad-0.10.23/build_win32/gst/librfb/../../../gst/librfb/rfbdecoder.c:164: - undefined reference to `_imp__recv@16' - ./.libs/librfb.a(librfb_la-rfbdecoder.o): In function - `rfb_decoder_connect_tcp': - /home/elmarco/pkg/rhel/mingw-gstreamer-plugins-bad-free/gst-plugins-bad-0.10.23/build_win32/gst/librfb/../../../gst/librfb/rfbdecoder.c:112: - undefined reference to `_imp__socket@12' - /home/elmarco/pkg/rhel/mingw-gstreamer-plugins-bad-free/gst-plugins-bad-0.10.23/build_win32/gst/librfb/../../../gst/librfb/rfbdecoder.c:119: - undefined reference to `_imp__htons@4' - /home/elmarco/pkg/rhel/mingw-gstreamer-plugins-bad-free/gst-plugins-bad-0.10.23/build_win32/gst/librfb/../../../gst/librfb/rfbdecoder.c:123: - undefined reference to `_imp__inet_addr@4' - /home/elmarco/pkg/rhel/mingw-gstreamer-plugins-bad-free/gst-plugins-bad-0.10.23/build_win32/gst/librfb/../../../gst/librfb/rfbdecoder.c:125: - undefined reference to `_imp__connect@12' - It needs -lws2_32 which is already in $(WINSOCK2_LIBS) - https://bugzilla.gnome.org/show_bug.cgi?id=675415 - -2012-05-02 08:03:46 -0700 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/dshowvideosink/dshowvideosink.cpp: - dshowvideosink: add missing casts to LPCSTR - -2012-05-03 23:51:14 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/dshowvideosink/dshowvideosink.cpp: - dshowvideosink: lower rank of the DirectShow video sink plugin - d3dvideosink should have a higher rank as it works better. - -2012-05-02 07:56:00 -0700 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/dshowvideosink/dshowvideosink.cpp: - dshowvideosink: Fix compilation on x64 platforms - -2012-05-05 20:01:46 +0300 Raimo Järvi <raimo.jarvi@gmail.com> - - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfobjects.c: - * gst/asfmux/gstrtpasfpay.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/hls/gsturidownloader.c: - * gst/mpegtsdemux/tsdemux.c: - Fix printf format compiler warnings on mingw-w64 - https://bugzilla.gnome.org/show_bug.cgi?id=675520 - -2012-05-05 18:20:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * ext/rtmp/Makefile.am: - * gst/dccp/Makefile.am: - * gst/festival/Makefile.am: - * gst/pcapparse/Makefile.am: - * gst/sdp/Makefile.am: - Add WINSOCK2_LIBS, remove WIN32_LIBS, fix rtmp build on Windows some more - One way of passing -lws2_32 to plugins should be enough.. - -2012-04-17 11:44:18 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - rtmp: link to winsock library on Windows - https://bugzilla.gnome.org/show_bug.cgi?id=674243 - -2012-05-04 14:01:13 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - configure: mark unported Windows plugins as such - https://bugzilla.gnome.org/show_bug.cgi?id=675440 - -2012-05-04 17:09:58 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin: remove unnecessary code - -2012-05-04 17:10:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin: improve image capture debug - -2012-05-04 17:05:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: always force image-profile to have variable framerate - image-encodebin can't use videorate as it always store one buffer - to be able to do its timestamps/duration math. As image captures - only push one buffer at a time, this videorate behavior breaks - camerabin usage. - -2012-05-03 19:11:57 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - basecamerabin: Do not set the pad templates in the base class. - It is best to let the subclass define the pad templates, this would - allow the subclass to decide which caps the pads should have. - -2012-05-01 17:55:02 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/video/videocontext.c: - videocontext: Remove the explicit unrefing of pad object getting from iterator. - -2012-05-02 15:35:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: avoid assertion by using null caps as any - NULL caps aren't valid caps, use a reference to 'any' caps - -2012-05-02 15:24:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: Fix get/set_property for encoding profiles - Encoding profiles are objects, not boxed types - -2012-05-02 09:43:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - basecamerasrc: null caps are not valid in 1.0 - Use any caps for the preview-caps property, as NULL caps are - not valid caps in 1.0 anymore - -2012-05-01 15:29:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/camerabin2-src.txt: - * gst/camerabin2/gstcamerabin2.c: - camerabin: remove custom renegotiate event - In 1.0 there is a core reconfigure event, camerabin doesn't need - its custom renegotiate event anymore - -2012-05-01 15:08:47 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin: Use plain video encoding profile for images - Do not use jpeg as a container format for image captures, use - the plain video encoding format. It was used as a container in - 0.10 to force the addition of tags to the image. - -2012-05-01 14:31:58 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: change output-selector negotiation mode - In 0.10 camerabin2 controlled the negotiation strictly and the output-selector - wouldn't forward setcaps calls. In 0.11 the renegotiation events are already in - core and we can allow the pipeline to handle it without much control from camerabin - part (I hope), so this patch makes output-selector forward caps negotiation events - to the active pad. - -2012-05-01 14:31:20 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: removing renegotiate handlers - gstreamer 1.0 already has the reconfigure event, remove the - custom event handling from wrappercamerabinsrc - -2012-05-01 13:28:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: prevent caps renegotiation loop - Only set the zoom capsfilter caps when the new caps are different, - preventing a caps renegotiation loop. - -2012-05-01 13:15:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/examples/camerabin2/gst-camera2.c: - camerabin: example: Update prepare-window-handle message - Message name changed from prepare-xwindow-id to prepare-window-handle - -2012-05-01 13:00:16 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/examples/camerabin2/gst-camera2.c: - * tests/examples/camerabin2/gst-camerabin2-test.c: - camerabin: examples: Renaming camerabin2 to camerabin - -2012-05-01 10:26:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - basecamerabinsrc: updating property to new name - enable-last-buffer is now enable-last-sample - -2012-05-01 10:18:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin: Replacing ffmpegcolorspace with videoconvert - -2012-04-30 12:36:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - tsbase: unref bad packets too - Conflicts: - gst/mpegtsdemux/mpegtsbase.c - -2012-04-30 12:28:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: reset the state of the stream when flushing - We need to reset the stream on a flush or else old packets could be added to the - list and leak. - -2012-04-30 11:05:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: don't push events upstream in pull mode - In pull mode, don't push the seek event upstream. - -2012-04-26 22:49:07 -0400 Wind Yuan <feng.yuan@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparser: mpeg4 type error - -2012-05-01 09:41:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegts: don't poke into private adapter fields - -2012-04-30 18:05:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/camerabin.c: - tests: update camerabin(2) unit test for rename - -2012-04-30 17:56:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * gst/camerabin2/gstplugin.c: - camerabin2: rename to "camerabin" - But leave source code intact for now, for easier patch merging. - -2012-04-30 17:44:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-camerabin2.xml: - * gst/camerabin/.gitignore: - * gst/camerabin/Makefile.am: - * gst/camerabin/TODO: - * gst/camerabin/camerabindebug.h: - * gst/camerabin/camerabingeneral.c: - * gst/camerabin/camerabingeneral.h: - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinimage.h: - * gst/camerabin/camerabinpreview.c: - * gst/camerabin/camerabinpreview.h: - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/camerabinvideo.h: - * gst/camerabin/gstcamerabin-enum.c: - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin-marshal.list: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - * gst/camerabin/gstcamerabincolorbalance.c: - * gst/camerabin/gstcamerabincolorbalance.h: - * gst/camerabin/gstinputselector.c: - * gst/camerabin/gstinputselector.h: - * tests/check/Makefile.am: - * tests/check/elements/camerabin.c: - * tests/check/elements/camerabin2.c: - * tests/examples/Makefile.am: - * tests/examples/camerabin/.gitignore: - * tests/examples/camerabin/Makefile.am: - * tests/examples/camerabin/gst-camera-perf.c: - * tests/examples/camerabin/gst-camera-perf.ui: - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin/gst-camera.h: - * tests/examples/camerabin/gst-camera.ui: - * tests/examples/camerabin/gst-camerabin-test.c: - Remove old camerabin - -2012-04-25 13:31:36 +0200 Gil Pedersen <git@gpost.dk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: start paused task on new data - -2012-04-21 11:36:09 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * Android.mk: - * ext/faac/Makefile.am: - android: Add support for the faac plugin - -2012-04-16 10:07:51 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * Android.mk: - Reenable faad plugin for the Android NDK builds - -2012-04-25 11:50:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/rsvg/gstrsvg.c: - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgdec.h: - rsvg: Stop using deprecated API when compiling with RSVG 2.35.0 or newer - -2012-03-29 15:57:58 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * sys/decklink/gstdecklinksrc.cpp: - decklink: Fix unitialized variable - -2012-04-04 11:51:28 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/opus/gstopusheader.c: - opus: Handle GstByteWriter return values - -2012-04-25 10:27:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: sndio plugin is not ported yet - -2012-04-25 10:25:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/sndio/gstsndio.c: - sndio: Fix i18n initialization - -2012-04-11 21:05:26 -0400 Jacob Meuser <jakemsr@sdf.lonestar.org> - - * configure.ac: - * ext/Makefile.am: - * ext/sndio/Makefile.am: - * ext/sndio/gstsndio.c: - * ext/sndio/sndiosink.c: - * ext/sndio/sndiosink.h: - * ext/sndio/sndiosrc.c: - * ext/sndio/sndiosrc.h: - sndio: add sndio plugin for OpenBSD - -2012-04-24 17:00:57 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * gst/coloreffects/gstchromahold.c: - * gst/coloreffects/gstchromahold.h: - * gst/coloreffects/gstcoloreffects.c: - * gst/coloreffects/gstcoloreffects.h: - coloreffects: port to 0.11 - -2012-04-24 15:20:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - dvb-sub: Use unchecked byte reader functions - -2012-04-24 14:57:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/libmms/gstmms.c: - mms: Use correct enum type - -2012-04-24 11:02:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/vdpau/gstvdpsink.c: - vdpau: Switch from deprecated XKeycodeToKeysym() to XkbKeycodeToKeysym() - Conflicts: - sys/vdpau/gstvdpsink.c - -2012-04-23 17:11:38 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - asfmux: use some more boilerplate - -2012-04-23 16:55:18 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfmux.h: - * gst/asfmux/gstasfobjects.c: - * gst/asfmux/gstasfobjects.h: - * gst/asfmux/gstasfparse.c: - * gst/asfmux/gstrtpasfpay.c: - * gst/asfmux/gstrtpasfpay.h: - asfmux: port to 0.11 - -2012-04-12 14:17:14 +0200 Gil Pedersen <git@gpost.dk> - - * configure.ac: - * gst-plugins-bad.spec.in: - * gst/hls/gstfragment.c: - * gst/hls/gstfragment.h: - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - * gst/hls/gsturidownloader.c: - hlsdemux: port to 0.11 - -2012-04-20 15:05:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: pass the reason for failed read as GstFlowReturn - Make the _read_device function return a GstFlowReturn so that we can propagate - this to the caller. This allows us to differentiate between poll errors and - flushing state. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=674219 - -2012-04-17 11:44:00 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * ext/voaacenc/gstvoaacenc.c: - Fix format (type is explicitly unsigned long) - Fixes #674244 - -2012-04-20 12:09:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/nas/nassink.c: - nas: Rework nassink a little - Based on patch from <ole.hellqvist at spray.se> - Create and destroy flow in prepare/unprepare - Remove some duplicate code from close and prepare that is now in unprepare. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=674130 - -2012-04-18 12:02:52 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/video/gstsurfaceconverter.c: - * gst-libs/gst/video/gstsurfacemeta.c: - * gst-libs/gst/video/gstsurfacemeta.h: - Doc fixes (gstsurfaceconverter, gstsurfacemeta). - -2012-04-20 11:23:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mpegtsdemux/Makefile.am: - mpegtsdemux: we ignore warnings differently - We suppress the warnings in the .c file instead. - -2012-04-19 14:20:52 +0200 Gil Pedersen <git@gpost.dk> - - * configure.ac: - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: port to 0.11 - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=674397 - -2012-04-20 10:50:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.h: - mpegtsbase: clarify event ownership - -2012-04-19 13:59:37 +0200 Gil Pedersen <git@gpost.dk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: fix memory leaks - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=674393 - -2012-04-20 11:12:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/fieldanalysis/Makefile.am: - fieldanalysis: Does not need to link to libgstbasevideo at all - Conflicts: - gst/fieldanalysis/Makefile.am - -2012-04-19 14:24:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * sys/applemedia/corevideobuffer.c: - * sys/pvr2d/gstpvrbufferpool.c: - fix for video api update - -2012-04-19 12:29:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst/y4m/gsty4mdec.c: - * sys/applemedia/corevideobuffer.c: - * sys/pvr2d/gstpvrbufferpool.c: - video: Update for libgstvideo API changes - -2012-04-17 22:46:12 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: Do not set the duration to the input buffer's duration unless valid This causes a bug where the first buffer has ts = 0, dur=X, the second buffer has ts=X (because of ts += duration), dur=-1, then the following buffers will start having a non valid timestamp. The real duration is only calculated during the caps negociation when there is a framerate available and the buffer's duration is invalid. - -2012-04-17 15:44:07 +0200 Julian Scheel <julian@jusst.de> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Set currentlist to NULL after free. - This prevents double free of currentlist is some circumstances. - -2012-04-17 18:56:50 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: Fix duration in buffers. It's frames per second, not seconds per frame - -2012-04-17 15:22:59 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfmux.h: - * gst/asfmux/gstasfobjects.h: - * gst/debugutils/gstcompare.c: - * gst/debugutils/gstcompare.h: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rmixer.h: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegpsmux/mpegpsmux.h: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mxf/mxfmux.c: - * gst/mxf/mxfmux.h: - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/videomeasure/gstvideomeasure_ssim.h: - * sys/winks/kshelpers.c: - * sys/winks/ksvideohelpers.c: - collectpads2: rename to collectpads - -2012-04-16 11:00:44 +0200 Matej Knopp <matej.knopp@gmail.com> - - * sys/applemedia/Makefile.am: - applemedia: do not link gstinterfaces - -2012-04-16 09:09:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 6db25be to dc70203 - -2012-04-13 00:13:39 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: fix pad iterator leak - -2012-04-13 00:14:27 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * tests/check/elements/mpegtsmux.c: - mpegtsmux: don't leak force key unit events - -2012-04-14 21:09:25 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - mpegvideoparse: Do not ignore start code at the end of buffer - -2012-04-14 21:02:06 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Parser fails to split some frames - -2012-04-14 20:53:47 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Fix FPS and frame duration for telecine files - -2012-04-14 20:46:24 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Do not update codec-data when only quantiser matrix changes - -2012-04-14 15:29:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/geometrictransform/Makefile.am: - geometrictransform: don't link against libgstinterfaces which was removed - The GstNavigation interface is now in libgstvideo. - -2012-04-13 22:04:38 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst/videoparsers/gstmpegvideoparse.c: - fix crash - last_sc is not reset every time a frame is being output, which can cause - last_sc > buf_size in subsequent frame. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=674073 - -2012-04-13 15:12:12 +0200 Matej Knopp <matej.knopp@gmail.com> - - * gst-libs/gst/video/gstbasevideodecoder.c: - Set sync_poinr = 1 for keyframe - -2012-04-13 14:07:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/geometrictransform/gstgeometrictransform.c: - geometrictransform: use 1.0 videofilter baseclass functions - Port to the new functions of the videofilter class - -2012-04-13 10:16:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * configure.ac: - * gst/geometrictransform/gstbulge.c: - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstdiffuse.c: - * gst/geometrictransform/gstfisheye.c: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstmarble.c: - * gst/geometrictransform/gstmirror.c: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstrotate.c: - * gst/geometrictransform/gstsphere.c: - * gst/geometrictransform/gstsquare.c: - * gst/geometrictransform/gststretch.c: - * gst/geometrictransform/gsttunnel.c: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gstwaterripple.c: - geometrictransform: port to 1.0 - Straightforward port of geometrictransform plugin - -2012-04-13 13:44:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * autogen.sh: - * configure.ac: - configure: Modernize autotools setup a bit - Also we now only create tar.bz2 and tar.xz tarballs. - -2012-04-13 13:37:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 464fe15 to 6db25be - -2012-04-13 13:10:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/camerabin2/Makefile.am: - * gst/debugutils/Makefile.am: - * gst/sdp/Makefile.am: - * tests/check/Makefile.am: - * tests/examples/camerabin/Makefile.am: - * tests/examples/camerabin2/Makefile.am: - * tests/examples/scaletempo/Makefile.am: - * win32/common/config.h: - Update for the removal of the interfaces library and the tuner/mixer interfaces - -2012-04-12 18:25:09 -0400 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * Android.mk: - Sync Android.mk entries to the new major version - Change naming on the pkgconfig files to reflect - the 0.10 -> 1.0 bump. - -2012-04-12 11:19:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - Back to development - -=== release 0.11.90 === - -2012-04-12 10:50:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin2.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-voaacenc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * gst/bayer/gstbayerorc-dist.c: - * win32/common/config.h: - Release 0.11.90 - -2012-04-12 10:47:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2012-04-11 21:47:52 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/multifdsink.c: - tests: remove obsolete multifdsink test - ... which is in -base nowadays. - -2012-04-10 17:35:54 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/x264enc.c: - tests: remove obsolete x264enc unit test - ... which is in -ugly nowadays. - -2012-04-10 17:24:05 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/mplex.c: - * tests/check/elements/opus.c: - * tests/check/elements/voaacenc.c: - * tests/check/elements/voamrwbenc.c: - tests: port some more to 1.0 - -2012-04-10 17:22:57 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: plug caps leak - -2012-04-10 17:22:44 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: tweak caps negotiation - ... so as to avoid leaking caps or manipulating NULL caps. - -2012-04-10 17:22:04 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/mplex/gstmplex.cc: - mplex: avoid leaking pad template caps and superfluous copy - -2012-04-10 17:21:29 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/mplex/gstmplex.cc: - mplex: fix pad release and cleanup - -2012-04-06 14:52:12 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - Merge remote-tracking branch 'origin/0.10' - Conflicts: - gst/h264parse/gsth264parse.c - gst/videoparsers/gsth264parse.c - -2012-04-06 14:27:06 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: tweak default setting of format and alignment in codec_data case - ... which should promote ending up in passthrough mode. - -2012-04-06 14:23:53 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - * gst/videoparsers/gsth264parse.c: - h264parse: do not use _unchecked bytewriter variants to insert config - .. since the bytewriter is explicitly created with non-fixed size to - allow (very much so expected) growth. - Partially reverts commit 20669d461a4953eb5ed01374d5ab628b4dc73b64 while - trying to keep (some?) compilers happy. - IIRC, the purpose of GstByteWriter in the first place was (at least) - being able to dump data without having to fuss with memory expansion - and size issues ... - Fixes #673485. - -2012-04-05 17:15:11 -0400 Thibault Saunier <thibault.saunier@collabora.com> - - Merge remote-tracking branch 'origin/0.10' - -2012-04-05 18:43:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 7fda524 to 464fe15 - -2012-04-05 18:02:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/apexsink/gstapexplugin.c: - * ext/arts/gst_arts.c: - * ext/artsd/gstartsdsink.c: - * ext/assrender/gstassrender.c: - * ext/audiofile/gstaf.c: - * ext/audioresample/gstaudioresample.c: - * ext/bz2/gstbz2.c: - * ext/cdaudio/gstcdaudio.c: - * ext/celt/gstcelt.c: - * ext/chromaprint/gstchromaprint.c: - * ext/cog/gstcog.c: - * ext/curl/gstcurl.c: - * ext/dc1394/gstdc1394.c: - * ext/dirac/gstdirac.cc: - * ext/directfb/dfbvideosink.c: - * ext/divx/gstdivxdec.c: - * ext/divx/gstdivxenc.c: - * ext/dts/gstdtsdec.c: - * ext/faac/gstfaac.c: - * ext/faad/gstfaad.c: - * ext/flite/gstflite.c: - * ext/gme/gstgme.c: - * ext/gsettings/plugin.c: - * ext/gsm/gstgsm.c: - * ext/hermes/gsthermescolorspace.c: - * ext/jp2k/gstjp2k.c: - * ext/kate/gstkate.c: - * ext/ladspa/gstladspa.c: - * ext/lcs/gstcolorspace.c: - * ext/libfame/gstlibfame.c: - * ext/libmms/gstmms.c: - * ext/lv2/gstlv2.c: - * ext/mimic/gstmimic.c: - * ext/modplug/gstmodplug.cc: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mplex/gstmplex.cc: - * ext/musepack/gstmusepackdec.c: - * ext/musicbrainz/gsttrm.c: - * ext/mythtv/gstmythtvsrc.c: - * ext/nas/nassink.c: - * ext/neon/gstneonhttpsrc.c: - * ext/ofa/gstofa.c: - * ext/openal/gstopenal.c: - * ext/opencv/gstopencv.c: - * ext/opus/gstopus.c: - * ext/resindvd/plugin.c: - * ext/rsvg/gstrsvg.c: - * ext/rtmp/gstrtmp.c: - * ext/schroedinger/gstschro.c: - * ext/sdl/gstsdl.c: - * ext/shout/gstshout.c: - * ext/snapshot/gstsnapshot.c: - * ext/sndfile/gstsf.c: - * ext/soundtouch/plugin.c: - * ext/spandsp/gstspandsp.c: - * ext/spc/gstspc.c: - * ext/swfdec/gstswfdec.c: - * ext/teletextdec/teletext.c: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * ext/voaacenc/gstvoaac.c: - * ext/voamrwbenc/gstvoamrwb.c: - * ext/vp8/plugin.c: - * ext/wayland/gstwaylandsink.c: - * ext/xvid/gstxvid.c: - * ext/zbar/gstzbar.c: - * gst/adpcmdec/adpcmdec.c: - * gst/adpcmenc/adpcmenc.c: - * gst/aiff/aiff.c: - * gst/asfmux/gstasf.c: - * gst/audiobuffer/gstaudioringbuffer.c: - * gst/audiovisualizers/plugin.c: - * gst/autoconvert/plugin.c: - * gst/bayer/gstbayer.c: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin2/gstplugin.c: - * gst/cdxaparse/gstcdxaparse.c: - * gst/chart/gstchart.c: - * gst/coloreffects/gstplugin.c: - * gst/dataurisrc/gstdataurisrc.c: - * gst/dccp/gstdccpplugin.c: - * gst/debugutils/debugutilsbad.c: - * gst/dtmf/gstdtmf.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/faceoverlay/gstfaceoverlay.c: - * gst/festival/gstfestival.c: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/freeverb/gstfreeverb.c: - * gst/freeze/gstfreeze.c: - * gst/frei0r/gstfrei0r.c: - * gst/games/gstpuzzle.c: - * gst/gaudieffects/gstplugin.c: - * gst/geometrictransform/plugin.c: - * gst/hdvparse/gsthdvparse.c: - * gst/hls/gstfragmentedplugin.c: - * gst/id3tag/gstid3mux.c: - * gst/inter/gstinter.c: - * gst/interlace/gstinterlace.c: - * gst/ivfparse/gstivfparse.c: - * gst/jp2kdecimator/gstjp2kdecimator.c: - * gst/jpegformat/gstjpegformat.c: - * gst/legacyresample/gstlegacyresample.c: - * gst/librfb/gstrfbsrc.c: - * gst/liveadder/liveadder.c: - * gst/mixmatrix/mixmatrix.c: - * gst/mpeg1sys/gstmpeg1systemencode.c: - * gst/mpegdemux/flumpegdemux.c: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegtsdemux/gsttsdemux.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mve/gstmve.c: - * gst/mxf/mxf.c: - * gst/nsf/gstnsf.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/overlay/gstoverlay.c: - * gst/patchdetect/gstpatchdetect.c: - * gst/pcapparse/plugin.c: - * gst/pnm/gstpnm.c: - * gst/rawparse/plugin.c: - * gst/real/gstreal.c: - * gst/removesilence/gstremovesilence.c: - * gst/rtjpeg/gstrtjpeg.c: - * gst/rtpmux/gstrtpmuxer.c: - * gst/rtpvp8/gstrtpvp8.c: - * gst/scaletempo/gstscaletempoplugin.c: - * gst/sdi/gstsdi.c: - * gst/sdp/gstsdpelem.c: - * gst/segmentclip/plugin.c: - * gst/siren/gstsiren.c: - * gst/smooth/gstsmooth.c: - * gst/speed/gstspeed.c: - * gst/stereo/gststereo.c: - * gst/subenc/gstsubenc.c: - * gst/tta/gsttta.c: - * gst/vbidec/gstvbidec.c: - * gst/videodrop/gstvideodrop.c: - * gst/videofilters/gstvideofiltersbad.c: - * gst/videomeasure/gstvideomeasure.c: - * gst/videoparsers/plugin.c: - * gst/videosignal/gstvideosignal.c: - * gst/vmnc/vmncdec.c: - * gst/y4m/gsty4mdec.c: - * sys/acmenc/acmenc.c: - * sys/acmmp3dec/acmmp3dec.c: - * sys/applemedia/plugin.m: - * sys/avc/gstavcplugin.cpp: - * sys/cdrom/gstcdplayer.c: - * sys/d3dvideosink/d3dvideosink.c: - * sys/decklink/gstdecklink.cpp: - * sys/directdraw/gstdirectdrawplugin.c: - * sys/directsound/gstdirectsoundplugin.c: - * sys/dshowdecwrapper/gstdshowdecwrapper.cpp: - * sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dvb/gstdvb.c: - * sys/dxr3/dxr3init.c: - * sys/fbdev/gstfbdevsink.c: - * sys/linsys/gstlinsys.c: - * sys/osxvideo/osxvideoplugin.c: - * sys/pvr2d/gstpvr.c: - * sys/qcam/gstqcamsrc.c: - * sys/qtwrapper/qtwrapper.c: - * sys/shm/gstshm.c: - * sys/vcd/vcdsrc.c: - * sys/vdpau/gstvdpau.c: - * sys/wasapi/gstwasapi.c: - * sys/wininet/gstwininetsrc.c: - * sys/winks/gstksvideosrc.c: - * sys/winscreencap/gstwinscreencap.c: - * tools/gst-element-maker: - * tools/gst-project-maker: - * win32/common/config.h: - gst: Update for GST_PLUGIN_DEFINE() API changes - -2012-04-05 11:51:40 -0400 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/hls/gsturidownloader.c: - hls: Some more debugging - -2012-03-15 14:42:44 -0400 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - hlsdemux: Replace the fetcher code with a GstURIDownloader object - -2012-03-14 17:01:17 -0400 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/hls/gsturidownloader.c: - hls: Minor cleanup in GstUriDownloader - -2012-03-14 17:06:22 -0400 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/Makefile.am: - * gst/hls/gsturidownloader.c: - * gst/hls/gsturidownloader.h: - hlsdemux: Factor out all the fetcher code in a GstURIDownloader class - This class is meant to be reusable by other components - -2012-04-05 10:22:29 -0400 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/hls/gstfragment.c: - hls: Do not add reference to buffers passed in GstFragment - We just steal the reference to the buffer, which means we can keep writing metadatas - on the buffers. - -2012-03-13 15:18:22 -0400 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/hls/gstfragment.c: - hls: Minor GstFragment cleanup - -2011-07-08 01:09:00 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/Makefile.am: - * gst/hls/gstfragment.c: - * gst/hls/gstfragment.h: - hls: Add a GstFragment class that represents a fragment in a m3u playlist - -2012-03-15 18:21:58 -0400 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - hls: Make the updates thread a GstTask - -2012-04-05 13:28:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Update version to 0.11.89.1 - -2012-04-05 09:16:27 +0100 uraeus <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - Update spec file - -2012-04-05 06:18:28 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: set correct newsegment fields on _TIME seeks - Forward the seek rate and set NS.start to the seek target so that decoders can - apply clipping where necessary. - -2012-04-05 08:54:28 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/corevideobuffer.h: - applemedia: update corevideobuffer after buffer meta API change - -2012-04-05 08:53:41 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/coremediabuffer.h: - applemedia: update coremediabuffer after buffer meta API change - -2012-04-05 08:52:49 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/qtkitvideosrc.m: - qtkitvideosrc: update after BaseSrc::fixate API change - -2012-04-05 08:24:31 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/rawparse/gstrawparse.c: - rawparse: fix compile warning - -2012-04-05 06:18:28 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: set correct newsegment fields on _TIME seeks - Forward the seek rate and set NS.start to the seek target so that decoders can - apply clipping where necessary. - -2012-04-04 14:41:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * docs/libs/Makefile.am: - * docs/libs/compiling.sgml: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/version.entities.in: - * ext/apexsink/Makefile.am: - * ext/assrender/Makefile.am: - * ext/celt/Makefile.am: - * ext/chromaprint/Makefile.am: - * ext/cog/Makefile.am: - * ext/dirac/Makefile.am: - * ext/directfb/Makefile.am: - * ext/dts/Makefile.am: - * ext/faac/Makefile.am: - * ext/faad/Makefile.am: - * ext/flite/Makefile.am: - * ext/gsettings/Makefile.am: - * ext/gsettings/org.freedesktop.gstreamer.default-elements.gschema.xml.in: - * ext/gsm/Makefile.am: - * ext/jp2k/Makefile.am: - * ext/kate/Makefile.am: - * ext/ladspa/Makefile.am: - * ext/lv2/Makefile.am: - * ext/mpeg2enc/Makefile.am: - * ext/mplex/Makefile.am: - * ext/musicbrainz/Makefile.am: - * ext/nas/Makefile.am: - * ext/ofa/Makefile.am: - * ext/openal/Makefile.am: - * ext/opencv/Makefile.am: - * ext/opus/Makefile.am: - * ext/resindvd/Makefile.am: - * ext/rsvg/Makefile.am: - * ext/schroedinger/Makefile.am: - * ext/sdl/Makefile.am: - * ext/soundtouch/Makefile.am: - * ext/voaacenc/Makefile.am: - * ext/voamrwbenc/Makefile.am: - * ext/vp8/Makefile.am: - * ext/wayland/Makefile.am: - * ext/zbar/Makefile.am: - * gst-libs/gst/basecamerabinsrc/Makefile.am: - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/interfaces/Makefile.am: - * gst-libs/gst/signalprocessor/Makefile.am: - * gst-libs/gst/video/Makefile.am: - * gst-plugins-bad.spec.in: - * gst/adpcmdec/Makefile.am: - * gst/adpcmenc/Makefile.am: - * gst/aiff/Makefile.am: - * gst/asfmux/Makefile.am: - * gst/audiobuffer/Makefile.am: - * gst/audiovisualizers/Makefile.am: - * gst/bayer/Makefile.am: - * gst/camerabin/Makefile.am: - * gst/camerabin2/Makefile.am: - * gst/cdxaparse/Makefile.am: - * gst/coloreffects/Makefile.am: - * gst/debugutils/Makefile.am: - * gst/dtmf/Makefile.am: - * gst/dvbsuboverlay/Makefile.am: - * gst/dvdspu/Makefile.am: - * gst/faceoverlay/Makefile.am: - * gst/fieldanalysis/Makefile.am: - * gst/frei0r/Makefile.am: - * gst/gaudieffects/Makefile.am: - * gst/geometrictransform/Makefile.am: - * gst/id3tag/Makefile.am: - * gst/inter/Makefile.am: - * gst/interlace/Makefile.am: - * gst/jpegformat/Makefile.am: - * gst/liveadder/Makefile.am: - * gst/mpegdemux/Makefile.am: - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsmux/Makefile.am: - * gst/mxf/Makefile.am: - * gst/patchdetect/Makefile.am: - * gst/pnm/Makefile.am: - * gst/rawparse/Makefile.am: - * gst/real/Makefile.am: - * gst/rtpmux/Makefile.am: - * gst/rtpvp8/Makefile.am: - * gst/scaletempo/Makefile.am: - * gst/sdp/Makefile.am: - * gst/segmentclip/Makefile.am: - * gst/siren/Makefile.am: - * gst/smooth/Makefile.am: - * gst/stereo/Makefile.am: - * gst/videofilters/Makefile.am: - * gst/videomeasure/Makefile.am: - * gst/videoparsers/Makefile.am: - * gst/videosignal/Makefile.am: - * gst/y4m/Makefile.am: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-basevideo-uninstalled.pc.in: - * pkgconfig/gstreamer-basevideo.pc.in: - * pkgconfig/gstreamer-codecparsers-uninstalled.pc.in: - * pkgconfig/gstreamer-codecparsers.pc.in: - * pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in: - * pkgconfig/gstreamer-plugins-bad.pc.in: - * sys/acmenc/Makefile.am: - * sys/acmmp3dec/Makefile.am: - * sys/applemedia/Makefile.am: - * sys/avc/Makefile.am: - * sys/d3dvideosink/Makefile.am: - * sys/decklink/Makefile.am: - * sys/directdraw/Makefile.am: - * sys/directsound/Makefile.am: - * sys/dshowdecwrapper/Makefile.am: - * sys/osxvideo/Makefile.am: - * sys/pvr2d/Makefile.am: - * sys/vdpau/Makefile.am: - * sys/vdpau/basevideodecoder/Makefile.am: - * sys/vdpau/gstvdp/Makefile.am: - * tests/check/Makefile.am: - * tests/examples/camerabin/Makefile.am: - * tests/examples/camerabin2/Makefile.am: - * tests/examples/gstplay/Makefile.am: - * tests/examples/scaletempo/Makefile.am: - * win32/common/config.h: - gst: Update versioning - -2012-04-04 12:06:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - Merge remote-tracking branch 'origin/0.10' - -2012-04-04 07:24:28 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: reset iterator to NULL after it's free - Fixes possible invalid memory access in gst_ts_demux_stream_flush - -2012-04-02 15:31:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - Merge remote-tracking branch 'origin/0.10' - Conflicts: - gst/mpegtsdemux/tsdemux.c - -2012-04-02 15:26:28 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Clear bufferlist/iterator when removing streams - -2012-04-02 15:25:46 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Don't leak buffer in fast variant - -2012-04-02 15:25:16 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Don't leak corrupt section packet buffer - -2012-04-02 11:13:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/zbar/gstzbar.c: - use transform_ip_on_passthrough - -2012-04-02 11:07:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: fix compilation - -2012-03-30 19:19:12 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Fix several leaks - * dont' leak buffers when a stream is in discont state - * don't leak buffers when a program is removed/deactivated - * remove all programs when disposing - -2012-03-30 19:19:12 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Fix several leaks - * dont' leak buffers when a stream is in discont state - * don't leak buffers when a program is removed/deactivated - * remove all programs when disposing - -2012-03-30 18:13:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/schroedinger/gstschroutils.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/corevideobuffer.c: - update for buffer api change - -2012-03-30 17:09:34 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: fixup merge - -2012-03-30 13:23:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/celt/gstceltenc.c: - celtenc: Fix compilation - -2012-03-30 12:55:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/celt/gstceltenc.c: - * ext/celt/gstceltenc.h: - celtenc: Use new gst_audio_encoder_set_headers() API - -2012-03-30 12:22:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/celt/gstceltenc.c: - * ext/opus/gstopusenc.c: - ext: Update for GstAudioEncoder API changes - -2012-03-30 12:02:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - videoparsers: Update for baseparse API changes - -2012-03-30 11:53:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/dts/gstdtsdec.c: - * ext/faad/gstfaad.c: - ext: Update for audio decoder API changes - -2012-03-29 18:04:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gst-plugins-bad - -2012-03-29 18:03:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/shm/gstshmsrc.c: - shmsrc: Fix a merge mistake - -2012-03-29 17:55:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: Revert to 0.10 state as this is unmergeable, also put it into the non-ported plugins again - -2012-03-29 17:51:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Fix merge mistake - -2012-03-29 17:41:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - Merge remote-tracking branch 'origin/0.10' - Conflicts: - NEWS - RELEASE - common - configure.ac - docs/libs/gst-plugins-bad-libs-sections.txt - docs/plugins/gst-plugins-bad-plugins.args - docs/plugins/gst-plugins-bad-plugins.hierarchy - docs/plugins/gst-plugins-bad-plugins.interfaces - docs/plugins/inspect/plugin-adpcmdec.xml - docs/plugins/inspect/plugin-adpcmenc.xml - docs/plugins/inspect/plugin-assrender.xml - docs/plugins/inspect/plugin-audiovisualizers.xml - docs/plugins/inspect/plugin-autoconvert.xml - docs/plugins/inspect/plugin-bayer.xml - docs/plugins/inspect/plugin-bz2.xml - docs/plugins/inspect/plugin-camerabin2.xml - docs/plugins/inspect/plugin-celt.xml - docs/plugins/inspect/plugin-dataurisrc.xml - docs/plugins/inspect/plugin-debugutilsbad.xml - docs/plugins/inspect/plugin-dtmf.xml - docs/plugins/inspect/plugin-dtsdec.xml - docs/plugins/inspect/plugin-dvbsuboverlay.xml - docs/plugins/inspect/plugin-dvdspu.xml - docs/plugins/inspect/plugin-faac.xml - docs/plugins/inspect/plugin-faad.xml - docs/plugins/inspect/plugin-gsm.xml - docs/plugins/inspect/plugin-h264parse.xml - docs/plugins/inspect/plugin-mms.xml - docs/plugins/inspect/plugin-modplug.xml - docs/plugins/inspect/plugin-mpeg2enc.xml - docs/plugins/inspect/plugin-mpegdemux2.xml - docs/plugins/inspect/plugin-mpegtsdemux.xml - docs/plugins/inspect/plugin-mpegvideoparse.xml - docs/plugins/inspect/plugin-mplex.xml - docs/plugins/inspect/plugin-pcapparse.xml - docs/plugins/inspect/plugin-rawparse.xml - docs/plugins/inspect/plugin-rtpmux.xml - docs/plugins/inspect/plugin-rtpvp8.xml - docs/plugins/inspect/plugin-scaletempo.xml - docs/plugins/inspect/plugin-schro.xml - docs/plugins/inspect/plugin-sdp.xml - docs/plugins/inspect/plugin-segmentclip.xml - docs/plugins/inspect/plugin-shm.xml - docs/plugins/inspect/plugin-videomaxrate.xml - docs/plugins/inspect/plugin-videoparsersbad.xml - docs/plugins/inspect/plugin-vp8.xml - docs/plugins/inspect/plugin-y4mdec.xml - ext/celt/gstceltdec.c - ext/dts/gstdtsdec.c - ext/modplug/gstmodplug.cc - ext/opus/gstopusenc.c - gst-libs/gst/video/gstbasevideocodec.c - gst-libs/gst/video/gstbasevideocodec.h - gst-libs/gst/video/gstbasevideodecoder.c - gst-libs/gst/video/gstbasevideodecoder.h - gst-libs/gst/video/gstbasevideoencoder.c - gst-libs/gst/video/gstbasevideoencoder.h - gst/adpcmdec/Makefile.am - gst/audiovisualizers/gstbaseaudiovisualizer.c - gst/h264parse/gsth264parse.c - gst/mpegdemux/mpegtsparse.c - gst/mpegtsdemux/mpegtsbase.c - gst/mpegtsdemux/mpegtspacketizer.c - gst/mpegtsdemux/mpegtsparse.c - gst/mpegtsdemux/tsdemux.c - gst/mpegtsdemux/tsdemux.h - gst/mxf/mxfdemux.c - gst/rawparse/gstaudioparse.c - gst/videoparsers/gsth263parse.c - gst/videoparsers/gsth264parse.c - sys/d3dvideosink/d3dvideosink.c - sys/decklink/gstdecklinksink.cpp - sys/dvb/gstdvbsrc.c - sys/shm/gstshmsrc.c - sys/vdpau/h264/gstvdph264dec.c - sys/vdpau/mpeg/gstvdpmpegdec.c - tests/examples/opencv/gst_element_print_properties.c - win32/common/config.h - -2012-03-29 16:08:34 +0100 uraeus <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - Add latest ported plugins to spec file - -2012-03-28 12:49:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/jp2k/gstjasperdec.c: - * ext/rtmp/gstrtmpsink.c: - * ext/spc/gstspc.c: - * gst/asfmux/gstasfparse.c: - * gst/asfmux/gstrtpasfpay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/hls/gsthlsdemux.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/nsf/gstnsf.c: - * gst/rtpvp8/gstrtpvp8pay.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * sys/decklink/gstdecklinksink.cpp: - * sys/dxr3/dxr3videosink.c: - * sys/vdpau/mpeg/gstvdpmpegframe.c: - * tests/check/elements/faad.c: - * tests/check/elements/parser.c: - * win32/common/config.h: - update for buffer changes - -2012-03-27 15:13:24 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/opus/gstopus.c: - opus: Rank rtp pay/depay - This way they can be auto-plugged. - -2012-03-27 09:36:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/Makefile.am: - basecamerabinsrc: Add $(GST_PLUGINS_BASE_LIBS) to the linker flags - -2012-03-26 12:13:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Replace master with 0.11 - -2012-03-23 18:36:21 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/modplug/gstmodplug.cc: - modplug: memory handling cleanup - Don't leak the CSoundFile. Use define for comment buffer size and ensure it is 0 - terminated. - -2012-03-23 18:18:06 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/flite/gstflite.c: - * ext/flite/gstflitetestsrc.c: - flte: comment cleanup - Remove commented out code for a flitesynth that we don't have in git anyway. Add - a comment regarding the flite voices. - -2012-03-23 18:16:08 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/modplug/gstmodplug.cc: - modplug: work around memory trashing in libmodplug (0.8.7) - Allocate double sized buffers. Also add more debug logging. - -2012-03-23 13:06:12 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsink.h: - shmsink: Make buffer-time signed to deal with backward jumps in timestamps - -2012-03-23 13:06:12 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsink.h: - shmsink: Make buffer-time signed to deal with backward jumps in timestamps - -2012-03-22 15:55:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - back to development - -=== release 0.11.2 === - -2012-03-22 15:52:37 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin2.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * ext/cog/gstcogorc-dist.c: - * ext/cog/gstcogorc-dist.h: - * gst-plugins-bad.doap: - * gst/fieldanalysis/gstfieldanalysisorc-dist.c: - * gst/fieldanalysis/gstfieldanalysisorc-dist.h: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - Release 0.11.2 - -2012-03-21 23:04:31 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * sys/decklink/Makefile.am: - * sys/decklink/osx/DeckLinkAPI.h: - * sys/decklink/osx/DeckLinkAPIConfiguration.h: - * sys/decklink/osx/DeckLinkAPIDeckControl.h: - * sys/decklink/osx/DeckLinkAPIDiscovery.h: - * sys/decklink/osx/DeckLinkAPIDispatch-osx.cpp: - * sys/decklink/osx/DeckLinkAPIModes.h: - * sys/decklink/osx/DeckLinkAPIStreaming.h: - * sys/decklink/osx/DeckLinkAPITypes.h: - * sys/decklink/osx/DeckLinkAPIVersion.h: - decklink: Add decklink dispatch code for OS/X - -2012-03-21 13:23:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/elements/h264parse.c: - * tests/check/elements/jpegparse.c: - * tests/check/elements/mxfdemux.c: - tests: update for memory api changes - -2012-03-21 09:41:08 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rawparse/gstvideoparse.c: - rawparse: fix bayer caps - -2012-03-20 20:07:11 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/geometrictransform/gstgeometrictransform.c: - geometrictransform: Prevent access to the transform map when it is null - Check if the map doesn't exist when receiving a new caps and create - a new one. This prevents that the transform functions try to access - the map when it doesn't exist. - -2012-03-20 19:19:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/geometrictransform/gstgeometrictransform.c: - geometrictransform: add some more log messages - -2012-03-20 17:32:00 -0300 Oleksij Rempel (Alexey Fisher) <bug-track@fisher-privat.net> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: avoid reseting caps to the same value - Reduces capture latency when the new caps are the same as the old - one, avoiding resetting the source state for a forced renegotiation. - -2012-03-21 00:17:47 +0200 Raimo Järvi <raimo.jarvi@gmail.com> - - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.c: - winscreencap: Fix compiling with mingw - https://bugzilla.gnome.org/show_bug.cgi?id=672505 - -2012-03-20 20:21:42 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsrc.c: - shm: port to 0.11 - -2012-03-20 20:21:37 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * gst/rawparse/gstaudioparse.c: - * gst/rawparse/gstaudioparse.h: - * gst/rawparse/gstrawparse.c: - * gst/rawparse/gstrawparse.h: - * gst/rawparse/gstvideoparse.c: - rawparse: port to 0.11 - -2012-03-20 16:44:17 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: add some channel map debug - -2012-03-20 16:34:33 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/faad/gstfaad.c: - * ext/faad/gstfaad.h: - faad: optimize channel remap, avoid potential memcpy - Combine the channel remap and copy in one operation. Calculate the channel remap - table only once, make a shortcut when we are not doing any remapping. - -2012-03-20 15:38:33 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/fieldanalysis/gstfieldanalysisorc.orc: - orc: don't compile everything at startup - -2012-03-19 22:58:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/Makefile.am: - sys: sort subdirs in Makefile alphabetically - -2012-03-19 23:49:17 +0200 Raimo Järvi <raimo.jarvi@gmail.com> - - * sys/Makefile.am: - winscreencap: Integrate into autotools build system - https://bugzilla.gnome.org/show_bug.cgi?id=672031 - -2012-03-18 23:15:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/adpcmdec/Makefile.am: - adpcmdec: GST_BASE_LIBS already contains -lgstbase-0.10 - -2012-03-18 14:43:16 -0700 David Schleef <ds@schleef.org> - - * gst/adpcmdec/Makefile.am: - adpcmdec: Add -lgstbase-0.10 - -2012-03-18 18:33:00 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/gme/Makefile.am: - * ext/gme/gstgme.c: - gme: use new style audio caps - Also do not pretend to negotiate output caps when there - is not much in output to begin with. - -2012-03-18 18:32:55 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * gst/scaletempo/Makefile.am: - * gst/scaletempo/gstscaletempo.c: - scaletempo: port to 0.11 - -2012-03-18 18:32:51 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * gst/smooth/gstsmooth.c: - smooth: port to 0.11 - -2012-03-18 18:32:46 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * gst/segmentclip/gstaudiosegmentclip.c: - * gst/segmentclip/gstsegmentclip.c: - * gst/segmentclip/gstvideosegmentclip.c: - segmentclip: port to 0.11 - -2012-03-18 18:32:41 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2enc.c: - bz2: port to 0.11 - -2012-03-18 18:32:36 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * gst/removesilence/Makefile.am: - * gst/removesilence/gstremovesilence.c: - removesilence: port to 0.11 - -2012-03-18 01:18:26 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/zbar/gstzbar.c: - zbar: fix build after base transform changes - -2012-03-18 00:51:32 +0000 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/gstfacedetect.c: - facedetect: fix structure leak - https://bugzilla.gnome.org/show_bug.cgi?id=672294 - -2012-03-17 15:09:21 +0100 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/gstopencvvideofilter.c: - opencv: fix memory leak - https://bugzilla.gnome.org/show_bug.cgi?id=672295 - -2012-03-15 22:12:59 +0100 Carsten Kroll <car@ximidi.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: fix regression setting window handle in pause/play - https://bugzilla.gnome.org/show_bug.cgi?id=656905 - -2012-03-17 15:07:49 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksink.h: - * sys/decklink/gstdecklinksrc.cpp: - decklinksink: Add device property - Also add property probe for device property, similar to decklinksrc. - -2011-10-31 18:58:34 -0700 blake tregre <blake@oblong.com> - - * sys/decklink/gstdecklinksrc.cpp: - decklinksrc: make sure we can accept caps before returning true - caps are determined by the plugin's properties, so we should check the - incoming caps to see if they agree. Fixes: #667722. - -2011-10-31 18:57:22 -0700 blake tregre <blake@oblong.com> - - * sys/decklink/gstdecklinksrc.cpp: - decklinksrc: disable pull mode - decklink device doesn't support any pull mode related functionality. - it's more like a live source, you see. Fixes: #667720. - -2012-02-11 22:49:10 -0800 blake tregre <blake@oblong.com> - - * sys/decklink/gstdecklinksrc.cpp: - decklinksrc: push new new segment event to all pads - Take care to push the event to all pads, but favor the video src pad. - Fixes: #667716. - -2012-03-17 11:41:04 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklinksrc.cpp: - decklinksrc: Implement latency query - Implement latency query. Fix memleak releasing resources. - -2012-03-17 11:39:54 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/capture.cpp: - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - decklink: reindent - -2011-10-31 18:56:23 -0700 blake tregre <blake@oblong.com> - - decklinksrc: handle flow return properly and provide better message - * sys/decklink/gstdecklinksrc.cpp: - -2012-03-07 19:22:28 -0800 David Schleef <ds@schleef.org> - - * sys/decklink/Makefile.am: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklink: Add property probing - Renames the subdevice property to just device, and has it - return the number of devices in the system in response to - a probe. This is useful both for using multiple capture - cards, and for detecting whether it's worth adding the - element to a pipeline. - Also cleans up the property descriptions. - -2012-03-17 11:45:39 -0700 David Schleef <ds@schleef.org> - - * tools/element-templates/basesrc: - * tools/element-templates/element: - element-templates: chain query/event functions - Chain up to parent class. This fix should be done to all of the - templates. - -2012-03-17 11:35:18 -0700 David Schleef <ds@schleef.org> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosink.h: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstinteraudiosrc.h: - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsink.h: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintersubsrc.h: - * gst/inter/gstintertest.c: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosrc.c: - inter: Add channel property - The channel property allows multiple intersrc/sink pairs to find - each other. It's a free-form text string that must match among - various inter elements. Also fixed up documentation and latency - handling. - -2012-03-17 16:09:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tools/element-templates/sinkpad-template-video: - * tools/element-templates/srcpad-template-video: - gst-element-maker: fix -template-video caps string - Don't forget separator. - -2012-03-17 16:05:20 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tools/element-templates/sinkpad-template-video: - * tools/element-templates/srcpad-template-video: - * tools/element-templates/videofilter: - gst-element-maker: add video pad template and use it in videofilter class - Would be nicer if one could just supplement the generic template - from the element template though. - Also, I would really have liked to just add those sections from the - pads template into the element templet directly (so I can cater for - src template caps == sink template caps), but that didn't seem to - work. - -2012-03-17 15:49:45 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tools/element-templates/sinkpad-template: - * tools/element-templates/srcpad-template: - * tools/element-templates/videofilter: - gst-element-maker: add {src,sink}pad-template, since many base classes create pads for us - And use them in the videofilter template. - -2012-03-17 15:16:29 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tools/element-templates/videofilter: - tools: add videofilter template for gst-element-maker - -2012-03-17 12:47:52 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * ext/opencv/MotionCells.cpp: - * ext/opencv/MotionCells.h: - * ext/opencv/gstopencvutils.c: - * ext/opencv/gsttemplatematch.h: - * ext/opencv/motioncells_wrapper.cpp: - opencv: fix configure check and build with opencv 2.1 - AC_CHECK_HEADERS() calls action-if-not-found also if just one of - the headers checked for is missing, which is not what we wanted. - Also, check for highgui_c.h instead of highgui.hpp. - https://bugzilla.gnome.org/show_bug.cgi?id=672226 - -2012-03-16 21:47:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst/asfmux/gstasfparse.c: - * gst/cdxaparse/gstcdxaparse.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/mxf/mxfdemux.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/rawparse/gstrawparse.c: - don't pass random pointers to pull_range - -2012-03-16 17:07:46 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstfacedetect.c: - facedetect: initialize some arbitrary variable that gcc-4.6 can track properly - The access to them is clearly guarded by the booleans though. - -2012-03-16 13:14:48 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstfacedetect.c: - opencv: cosmetic code changes - Check for the availability of the detectors in the processing function to avoid - setting up the ROIs. Use the booleans for have_xxx more. - -2012-03-16 12:57:05 +0100 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfacedetect.c: - opencv: use opencv prefix from pkgconfig to lookup datafiles - Don't hardconde /usr to lookup datafiles (such as haar cascades). - -2012-03-15 17:10:18 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/resindvdsrc.c: - rsndvdsrc: post a message with title number and durations - https://bugzilla.gnome.org/show_bug.cgi?id=672165 - -2012-03-16 12:10:10 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/faceoverlay/gstfaceoverlay.c: - faceoverlay: remove blank line in gtk-doc comment - -2012-03-16 12:04:11 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstfacedetect.c: - facedetect: skip detection for unavailable detectors - -2012-03-15 23:17:55 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstfacedetect.c: - facedetect: move the detector to an own method to hide the ugly ifdefs - This improves the readability in the actual processing function. - -2012-03-15 23:08:02 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstfacedetect.c: - facedetect: always send facedetect message - The application might like to know, when we don't see the face anymore. - -2012-03-15 22:58:11 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/faceoverlay/gstfaceoverlay.c: - faceoverlay: code cleanups - Use glib types and simply expressions in the message handler. - -2012-03-15 22:49:51 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/faceoverlay/gstfaceoverlay.c: - faceoverlay: don't access message fields directly - -2012-03-15 22:22:12 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstfacedetect.c: - facedetect: don't skip faces - Skipping faces at this point makes us lie about the num-ber of faces and also - causes leaks. - -2012-03-15 22:11:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - update for bufferpool changes - -2012-03-15 20:38:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - update for allocation query changes - -2012-03-15 18:28:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/rsvg/gstrsvgoverlay.c: - rsvgoverlay: cosmetic change - Rename PROP_FILENAME to PROP_LOCATION to match the name of - the property. Add some debug logging. - -2012-03-15 18:26:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/faceoverlay/gstfaceoverlay.c: - faceoverlay: clear overlay if the face disappears - -2012-03-15 18:21:37 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/faceoverlay/gstfaceoverlay.c: - faceoverlay: add some locking for properties, free previous location when it changes - -2012-03-15 18:08:09 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/faceoverlay/gstfaceoverlay.c: - * gst/faceoverlay/gstfaceoverlay.h: - faceoverlay: don't make rsvgoverlay reload the SVG for every single frame - Only set location on rsvgoverlay if it has changed. - -2012-03-15 17:47:58 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/faceoverlay/gstfaceoverlay.c: - faceoverlay: move face handling into own function and handle 0 face count - When a face disappears, we seem to get a message from facedetect with - a face count of 0, which we want to just ignore instead of trying to - access face #-1, which causes nasty warnings. - -2012-03-15 17:42:56 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/faceoverlay/gstfaceoverlay.c: - faceoverlay: fix pad templates - Use generic and unspecififed rgb/caps for now. The exact caps - supported depend on the facedetect element and rsvgoverlay. It's - not clear how this worked before, since facedetect only accepts - 24-bit RGB, but the caps advertised 32-bit ARGB/BGRA. In any case, - we don't want to force anything really, so that if any of those - elements acquires support for additional formats we pick those up - automatically. - -2012-03-15 17:26:14 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/rsvg/gstrsvgoverlay.c: - rsvgoverlay: fix crash due to double adapter unref - -2012-03-15 16:52:44 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/faceoverlay/gstfaceoverlay.c: - * gst/faceoverlay/gstfaceoverlay.h: - faceoverlay: fix weird pad creation code - The element would create normal pads in its instance_init function, - and then later in NULL->READY create the elements it needs, remove - the pads created in the instance_init function, and add new ghost - pads instead. Not without saving the external peer pads of the old - pads of course, which it would promptly re-link to the new ghost - pads. Do all of that a bit differently. - Fixes the generic/states.check unit test. - https://bugzilla.gnome.org/show_bug.cgi?id=670588 - -2012-03-15 15:47:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/faceoverlay/gstfaceoverlay.c: - faceoverlay: minor cosmetic changes - Remove template maker comments, use our defines for - package name and origin. - -2012-03-15 14:08:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * sys/pvr2d/gstpvrbufferpool.c: - update for bufferpool api change - -2012-03-15 13:37:36 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/faad/gstfaad.c: - * ext/kate/gstkateenc.c: - * ext/modplug/gstmodplug.cc: - * ext/rtmp/gstrtmpsrc.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/jpegformat/gstjifmux.c: - * gst/mpegdemux/gstpesfilter.c: - * gst/videoparsers/gsth264parse.c: - * sys/pvr2d/gstpvrbufferpool.c: - * sys/pvr2d/gstpvrbufferpool.h: - * tests/check/elements/schroenc.c: - update for memory api changes - -2012-03-15 00:13:40 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/.gitignore: - * tests/check/libs/.gitignore: - .gitignore: ignore more test binaries and stamp files - -2012-03-15 00:05:41 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * ext/opencv/MotionCells.h: - * ext/opencv/gsttemplatematch.h: - opencv: make build with opencv 2.3.1 as in debian sid - Where highgui.h doesn't exist any more, but only opencv2/highgui/highgui.hpp. - Also, not quite sure why we're checking for cvaux.h, it's not used anywhere. - -2012-03-14 19:52:31 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - take padding into account - -2012-03-14 17:48:40 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/mpeg2enc/gstmpeg2enc.cc: - mpeg2enc: also clear initialized mutex and cond - -2012-03-14 11:20:18 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/flite/gstflitetestsrc.c: - flite: adjust to some modified caps related API changes - -2012-03-14 10:24:05 +0100 Dmitry Ketov <dketov@gmail.com> - - * configure.ac: - * sys/winscreencap/Makefile.am: - winscreencap: Integrate into autotools build system - Fixes bug #672031. - -2012-03-13 20:50:04 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - inter: fix warnings when gst-inspecting interaudio{src,sink} - The channel property isn't implemented, so don't register it. - -2012-03-08 01:48:56 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - waylandsink: Fix warnings, proper structuring, dead code removal, adding doc section. - -2012-03-13 13:02:54 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - configure.ac: move spc plugin to NON_PORTED list(Fix build error) - -2012-03-13 09:54:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/resindvd/rsndec.c: - use gst_caps_merge instead of gst_caps_union - -2012-03-12 15:42:04 +0100 Oleksij Rempel (Alexey Fisher) <bug-track@fisher-privat.net> - - * gst/geometrictransform/gstgeometrictransform.c: - geometrictransform: make sure gt->map not freed twice - current cheese can create situation where gt->map is freed twice. - This patch set map to null to avoid it. - https://bugzilla.gnome.org/show_bug.cgi?id=671910 - -2012-03-12 17:06:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: fix for caps api change - -2012-03-12 16:51:19 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - configure.ac: bump GLib requirement to 2.31.14 - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=671911 - -2012-02-28 16:40:31 +0100 Gil Pedersen <git@gpost.dk> - - * gst/hls/gsthlsdemux.c: - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - hlsdemux: add floating point segment duration support - -2012-03-12 12:23:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/jp2k/gstjasperdec.c: - * sys/d3dvideosink/d3dvideosink.c: - * tests/check/pipelines/colorspace.c: - fix for caps _normalize changes - -2012-03-12 11:40:20 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/pipelines/colorspace.c: - tests: fix for caps API change - -2012-03-12 10:44:22 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/cog/gstcogcolorspace.c: - * tests/check/pipelines/colorspace.c: - fix for _do_simplify changes - -2012-03-11 19:06:59 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/modplug/gstmodplug.cc: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/autoconvert/gstautoconvert.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/rtpmux/gstrtpmux.c: - * gst/videoparsers/gsth264parse.c: - * tests/check/pipelines/colorspace.c: - fix for caps api changes - -2012-03-10 20:53:54 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - Fix an unwanted double negation from last commit - -2012-03-10 19:10:52 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst/aiff/aiffmux.c: - * gst/h264parse/gsth264parse.c: - * gst/jp2kdecimator/jp2kcodestream.c: - * gst/mxf/mxfmpeg.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - Fix 'ignoring return value of function declared with const attribute' - This always happens with GstByteReader/Writer and friends when - not taking into account returned boolean of the _read/_write functions - (which is actually wrong). - Make use of the *_unchecked variant as much as possible, or take the - returned value into account. - -2012-03-10 11:36:25 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/dts/gstdtsdec.c: - dtsdec: avoid runaway loop when resyncing during parse - ... by checking for the correct (decremented) size variable. - Fixes #671756. - -2012-03-09 17:16:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - * configure.ac: - configure: fix AC_LANG_SOURCE-related warnings when doing autogen.sh - -2012-03-01 14:59:55 -0300 Danilo Cesar Lemes de Paula <danilo.cesar@collabora.co.uk> - - * gst/rtpvp8/gstrtpvp8depay.c: - * gst/rtpvp8/gstrtpvp8pay.c: - Fixing rtpvp8 compatibility with the third draft - https://bugzilla.gnome.org/show_bug.cgi?id=671073 - -2012-03-08 11:32:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/elements/autovideoconvert.c: - * tests/check/elements/camerabin2.c: - * tests/check/elements/opus.c: - tests: fix more caps - -2012-03-07 17:14:29 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * ext/opus/gstopuscommon.c: - * ext/opus/gstopuscommon.h: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusheader.c: - * ext/opus/gstopusparse.c: - * ext/opus/gstrtpopuspay.c: - opus: port to updated 0.11 - -2012-03-07 10:18:31 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * ext/celt/gstceltdec.c: - * ext/celt/gstceltenc.c: - celt: port to 0.11 - -2012-03-07 12:59:28 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: only request and process 1 frame at a time - ... since it is specified in _finish_frame that input buffer may be invalidated - after calling it, and is as such not reliably available for further encoding. - Also, requesting or allowing several frames is only useful if subclass intends - to process these "in 1 run" (as in, 1 output buffer), not for having another - (inner) loop in subclass where the baseclass one will do just fine. - -2012-03-07 12:55:43 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: configure baseclass requested samples really in samples - ... as opposed to bytes. - -2012-03-06 18:49:11 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - video: Update/add docs - -2012-03-06 18:11:35 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/gme/gstgme.c: - * ext/musepack/gstmusepackdec.c: - * ext/openal/gstopenalsink.c: - * ext/timidity/gstwildmidi.c: - * sys/vdpau/gstvdp/gstvdpbufferpool.c: - * sys/vdpau/gstvdp/gstvdpdevice.c: - * sys/vdpau/gstvdpsink.c: - Add missing GLIB_DISABLE_DEPRECATION_WARNINGS - Suppress warnings about deprecated threading and GValueArray - API, so git compiles with -Werror. - -2012-03-06 18:33:25 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/siren/gstsirendec.c: - * gst/siren/gstsirendec.h: - sirendec: port to audiodecoder - -2012-03-06 18:33:17 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/siren/Makefile.am: - * gst/siren/gstsirenenc.c: - * gst/siren/gstsirenenc.h: - sirenenc: port to audioencoder - -2012-03-06 16:11:52 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/celt/gstceltdec.c: - celtdec: use base class tag handling helper - ... so as to ensure these to be handled and sent at proper time. - -2012-03-06 16:11:30 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/dts/gstdtsdec.c: - * ext/dts/gstdtsdec.h: - dtsdec: use base class tag handling helper - ... so as to ensure these to be handled and sent at proper time. - -2012-03-06 18:32:09 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/dccp/gstdccp.c: - dccp: avoid indefinite looping upon error - ... and fix 'uninitialized' compilation warning as well. - -2012-03-06 15:21:17 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Fix 'argument to 'sizeof' in 'memset' call is the same expression as the destination' compiler warning - -2012-03-06 14:57:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/gsettings/gstgsettingsaudiosink.c: - * ext/gsettings/gstgsettingsaudiosrc.c: - * ext/gsettings/gstgsettingsvideosink.c: - * ext/gsettings/gstgsettingsvideosrc.c: - gsettings: Fix 'if statement has empty body' compiler warning - -2012-03-06 14:56:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/directfb/dfbvideosink.c: - dfbvideosink: Fix 'implicit conversion from enumeration type 'DirectResult' to different enumeration type 'DFBResult'' compiler warning - We're not checking the return value of that function anyway. - -2012-03-06 14:51:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/curl/gstcurlsink.c: - curl: Fix 'equality comparison with extraneous parentheses' compiler warning - -2012-03-06 14:51:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/cog/gstcogcolorspace.c: - cogcolorspace: Use correct enum type for return value - -2012-03-06 14:50:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/vdpau/h264/gstvdph264dec.c: - vdpau: Fix loop to not read before the valid memory area - -2012-03-06 14:47:17 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/removesilence/vad_private.c: - removesilence: Fix 'argument to 'sizeof' in 'memset' call is the same expression as the destination' compiler warning - -2012-03-06 14:46:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfdemux.c: - mxfdemux: Fix 'comparison of unsigned expression >= 0 is always true' compiler warning - -2012-03-06 14:44:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: Fix 'variable 'pid' is uninitialized when used here' compiler warning - -2012-03-06 14:43:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Fix 'expression result unused' compiler warning - -2012-03-06 14:41:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dccp/gstdccp.c: - dccp: Fix 'comparison of unsigned expression < 0 is always false' compiler warning - -2012-03-06 14:38:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - baseaudiovisualizer: Fix 'comparison of unsigned expression >= 0 is always true' compiler warning - -2012-03-05 12:46:13 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtspacketizer: Handle rollover in offset calculations - -2012-03-05 12:43:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/bayer/gstbayer2rgb.c: - * gst/bayer/gstrgb2bayer.c: - x-raw-bayer -> x-bayer - -2012-03-05 12:03:23 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/mplex/Makefile.am: - * ext/mplex/gstmplex.cc: - * gst/camerabin2/gstviewfinderbin.c: - use new style caps - -2012-03-05 11:27:51 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - tsdemux: printf fix - -2012-03-05 10:14:46 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/TODO: - tsdemux: Update TODO - -2012-03-05 09:46:17 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegtsdemux/tsdemux.c: - mpegts: Switch rank of mpegtsdemux and tsdemux - More effort has been put lately in tsdemux and works in more use cases - -2012-03-05 09:38:57 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Push packets as early as possible - When the PES header tells us how big the outgoing packet is, push the - packet downstream as soon as we have the specified size instead of waiting - for the beginning of the next packet. - Reduces latency and removes issues with very sparse streams (like subtitles - and subpictures). - -2012-03-04 21:54:08 +0100 Stefan Sauer <ensonic@users.sf.net> - - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsrc.c: - shm: add minimal doc blobs - -2012-02-28 21:00:24 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * ext/wayland/gstwaylandsink.c: - waylandsink: Fix in shell_surface_set_fullscreen - -2012-02-16 22:27:23 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - waylandsink: More fixes -- update to Wayland 0.85 protocol -- Added shell surface -- Added format query for shm format -- Create the window based on width and height of video extracted from upstream caps. - -2011-11-02 16:23:02 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - Update with new APIs in wayland-client. - -2011-11-02 13:51:13 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - More Fixes: * Adding buffer_alloc * perform buffer_damage before surface_attach * Fix typo, Remove Dead code etc. - -2011-11-02 11:02:11 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * configure.ac: - * ext/Makefile.am: - * ext/wayland/Makefile.am: - * ext/wayland/gstwaylandsink.c: - * ext/wayland/gstwaylandsink.h: - Initial Commit: Adding Wayland Video Sink - -2011-12-13 23:43:59 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/resindvd/resindvdsrc.c: - resindvd: send duration message on duration updates - When we know a new duration, report it. Add more logging. - -2011-12-13 10:26:50 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/README: - audiovisualizers: planning + example update - -2012-03-03 19:03:11 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/bufferfactory.m: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/corevideobuffer.h: - * sys/applemedia/plugin.m: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - applemedia: port vtdec - -2012-03-03 18:57:07 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/cmapi.h: - applemedia: update signature of CMSampleBufferCreate and CMBlockBufferCreateWithMemoryBlock - Change data type for counters passed on the stack from UInt32 to size_t. Fixes - 64bit builds. - -2012-03-02 08:13:10 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/cmapi.h: - applemedia: update format description helper signature - Update the FigVideoFormatDescriptionCreateWithSampleDescriptionExtensionAtom - signature to match the implementation on OSX Lion. - -2012-03-02 21:41:39 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/directx/d3d.h: - * sys/d3dvideosink/directx/dx.h: - d3dvideosink: fix compiler warnings and build failure with mingw - shared.d3ddev was removed a while back, not sure how this still - compiles for anyone (tpm). - https://bugzilla.gnome.org/show_bug.cgi?id=653718 - https://bugzilla.gnome.org/show_bug.cgi?id=670143 - https://bugzilla.gnome.org/show_bug.cgi?id=656905 - -2012-03-03 15:57:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: use AS_LIBTOOL and bump version for ABI change in h.264 codec parser - Backported from the 0.10 release branch, where v.23 was used. - https://bugzilla.gnome.org/show_bug.cgi?id=671203 - -2012-03-02 11:45:41 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: record number of emulation prevention bytes in slice_header(). - Some hardware video decode acceleration API (VA-API, DXVA) require - a bit count to the first macroblock, minus the number of emulation - prevention bytes. So, instead of having the consumer of the library - scan the slice_header() again, just record that number while parsing. - Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> - https://bugzilla.gnome.org/show_bug.cgi?id=671203 - -2012-03-03 15:47:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - tsdemux: fix confusing variable name - -2012-03-02 17:11:33 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Fix segment start position - If we *really* can't figure out the first start position, that most - likely means the data to push out doesn't have any timestamp. - Use a default value of 0 then - -2012-03-02 17:10:28 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Flush out the packetizer on flushing seeks - ... else we end up with bogus data/offsets - -2012-02-29 11:14:15 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Activate pads only when receiving data for the stream - https://bugzilla.gnome.org/show_bug.cgi?id=670921 - -2012-03-02 15:37:57 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/Makefile.am: - d3dvideosink: add missing directx headers - -2012-03-02 11:07:47 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Fix level code - Valid ranges are from 4 to 10 - Valid ranges >> 1 are from 2 to 5 - Valid ranges >> 1 - 2 are from 0 to 3 - (and not from 1 to 4) - -2012-03-02 10:54:48 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Check harder for program changes - And don't just rely on the section crc/version_number changing to - indicate that the program actually changed. - -2012-03-01 18:46:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/vdpau/gstvdp/gstvdpoutputbufferpool.c: - * sys/vdpau/gstvdp/gstvdpoutputbufferpool.h: - * sys/vdpau/gstvdp/gstvdpvideobufferpool.c: - * sys/vdpau/gstvdp/gstvdpvideobufferpool.h: - vdpau: relicense four source files from GPL3+ to LGPL2+ - These source files were mistakenly licensed as GPL3, the - author (Carl-Anton Ingmarsson) has given permission to - relicense them to LGPL2+. - https://bugzilla.gnome.org/show_bug.cgi?id=671142 - -2012-03-01 18:05:17 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - mpegtsbase/tsdemux: Refactor seek and segment handling - All calculations go through the mpegtspacketizer - Remove unused variables/code - -2012-03-01 17:59:57 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Error out on EOS without any pad - Avoids ending up with hanging pipelines - -2012-03-01 17:56:34 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtspacketizer: Offset calculation - Allows PCR<=>PTS<=>offset estimation/calculation - Right now the calculation is very naive, but can be extended later on - without disrupting the code in tsdemux/mpegtsbase - -2012-03-01 17:53:41 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtspacketizer: clock fix and minor addition - * Don't take into account packets that arrived at the same time as - previous ones for clock skew estimation - * Add convenience method for processing the next ts packet - -2012-02-29 18:19:23 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - Revert "mpegtsdemux: Not apply various time the same PMT to a program when repetead" - This reverts commit 8cb0e87f5623836ddc361eb91dcf9b50b48048e7. - mpegtspacketizer already checks if it's a new PMT or not - -2012-02-29 10:33:00 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/payload_parsers.c: - * gst/mpegtsdemux/payload_parsers.h: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: Remove all seeking code - It was more than bogus - -2012-02-29 17:26:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstsurfacemeta.c: - * gst-libs/gst/video/gstsurfacemeta.h: - update for metadata API changes - -2012-02-14 11:57:00 +0100 Xavier Queralt <xqueralt@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: don't set the fetcher's location twice - Calling gst_element_make_from_uri already does it and filesrc - fails when using file protocol in a location - -2012-02-28 16:27:55 +0100 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - - * gst/mpegdemux/flutspmtinfo.c: - * gst/mpegdemux/flutspmtstreaminfo.c: - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/mpegtspacketizer.c: - * gst/rawparse/gstaudioparse.c: - * sys/dvb/camutils.c: - * tests/examples/opencv/gst_element_print_properties.c: - * tests/examples/scaletempo/demo-gui.c: - Add missing GLIB_DISABLE_DEPRECATION_WARNINGS - Suppress warnings about deprecated threading and GValueArray - API, so git compiles with -Werror. - https://bugzilla.gnome.org/show_bug.cgi?id=670982 - -2012-02-24 09:54:35 +0100 Xavier Queralt <xqueralt@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: don't fail for playlists smaller than fragments-cache - https://bugzilla.gnome.org/show_bug.cgi?id=670963 - -2012-02-28 11:39:18 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/gstsurfacemeta.c: - update for metadata tags - -2012-02-28 08:13:04 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * configure.ac: - * sys/applemedia/Makefile.am: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/coremediabuffer.h: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/corevideobuffer.h: - * sys/applemedia/plugin.m: - * sys/applemedia/qtkitvideosrc.m: - applemedia: port qtkitvideosrc - -2012-02-27 09:45:29 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: catch section lengths extending past the buffer length - This is probably the cause for an occasional crash while streaming - MPEG. Blind fix after staring at the code and following logic, so - may or may not fix the issue, I cannot test. - (Port of 4275a70cb55d375afa702917f7359ec117ed49d4 from mpegdemux) - -2012-02-27 09:42:27 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: support more character set encodings - Support UTF-16BE, EUC-KR (KSX1001), GB2312 and ISO-10646/UTF8 text - encoding and fixed new line for multibyte encoding - https://bugzilla.gnome.org/show_bug.cgi?id=664257 - (Port of 9759d66407f2be8ec29975b0eff3230bb1dae0ef from the mpegtsdemux - element) - -2012-02-27 13:13:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/celt/gstceltenc.c: - * ext/opus/gstopusenc.c: - audioencoders: chain up to parent event handler - -2012-02-26 20:43:32 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/adpcmdec/Makefile.am: - adpcmdec: link to libgstbase - -2012-02-24 19:08:40 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - tsbase: Fix parsing of PSI table IDs - (Ported from mpegtsdemux d8fd874f5290e4911437120057ee885cdb68b4af) - -2012-02-24 15:26:21 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Avoid unlinkely leaks and segfault - -2012-02-24 17:53:52 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Use new clock skew estimation for outgoing timestamps - Only used in live mode - -2012-02-24 17:52:33 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Various code cleanup and dead code removal - -2012-02-24 17:47:38 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtspacketizer: Fix issues with skew code - * Always try to get a timestamp for the algorithm - * Remove dead variable - * Return proper default value - -2012-02-24 17:07:43 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Timestamp output by default - Allows downstream elements (like demuxers or parsers) to do remote - clock rate/skew estimation. - -2012-02-24 12:53:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/dataurisrc/gstdataurisrc.c: - * tests/check/elements/dataurisrc.c: - dataurisrc: fix docs and unit test - -2012-02-23 14:46:09 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - mpegtspacketizer: Estimate clock skew and retimestamps buffers more precisly - Apply the EPTLA algotithm to estimate clock skew. - Reusing code from -good/gst/rtpmanager/rtpjitterbuffer.c - -2012-02-21 11:12:53 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Clean up AAC caps mess - -2012-02-20 17:47:11 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/gstmpegdesc.h: - tsdemux: Reindent gstmpegdesc.h - -2012-02-20 17:32:21 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Support more DTS/AC3 descriptors - -2012-02-23 18:17:50 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Remove useless finalize() - -2012-02-24 10:26:44 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/gstsurfacemeta.c: - update for metadata changes - -2012-02-24 10:21:31 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/elements/mxfmux.c: - * tests/check/pipelines/mxf.c: - tests: fix some caps - -2012-02-23 22:04:24 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: fixup nasty typo breaking compilation - -2012-02-23 21:17:53 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: consider nal_length_size when constructing codec_data - Fixes #670699. - -2012-02-23 21:16:18 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: discard frame upon decoding error - -2011-11-08 20:19:41 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: Use incoming timestamps in live mode - -2011-11-08 20:12:50 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Report latency (700ms) - -2011-11-08 09:44:18 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - mpegtsbase: Query whether upstream is live or not - -2012-02-23 11:55:16 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-camerabin2.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-chromaprint.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colorspace.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-freeverb.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-linsys.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-patchdetect.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-removesilence.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmp.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdi.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-smooth.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * win32/common/config.h: - Bump version after release - -2012-02-22 15:41:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/elements/schroenc.c: - test: port schroenc unit test - -2012-02-22 11:44:23 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * configure.ac: - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroutils.c: - * ext/schroedinger/gstschroutils.h: - schro: Port to 0.11 - Works with some sample files. There seems to be some timestamping issue though, - but the 0.10 version also complains about that too. - -2012-02-21 18:56:42 -0800 David Schleef <ds@schleef.org> - - * autogen.sh: - autogen.sh: avoid touching .po files during 'make' - A simple workaround to deal with GNU gettext automake integration - failing to deal with git. Fixes #669207 - -2012-02-22 02:06:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - update for new memory api - -2012-02-21 16:53:37 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/video/gstbasevideocodec.c: - video: More documentation - -2012-02-21 16:52:49 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.h: - basevideocodec: Document structures - -2012-02-21 10:06:16 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - Conflicts: - gst/colorspace/colorspace.c - -2012-02-20 20:11:13 -0800 David Schleef <ds@schleef.org> - - * gst/colorspace/colorspace.c: - colorspace: Fix v210 writing out of bounds - -2012-02-20 18:43:51 -0800 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschroenc.c: - schroenc: remove GST_ERROR - -2012-02-20 11:42:23 -0800 David Schleef <ds@schleef.org> - - * tools/gst-project-maker: - gst-project-maker: Create tools, pass make distcheck - Create a tools directory for an application. Add source code - stubs to allow the project to compile and pass make distcheck. - Add notes in source code to tell the user how to create plugin - or app code using the other -maker scripts. - -2012-01-26 06:58:46 -0500 Matej Knopp <matej.knopp@gmail.com> - - * ext/voaacenc/gstvoaacenc.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/rtpmux/gstrtpmux.c: - Fix compiler warnings - -2012-02-20 16:07:50 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - Conflicts: - ext/opus/gstopusparse.c - gst/colorspace/colorspace.c - -2012-01-26 16:32:17 -0500 Matej Knopp <matej.knopp@gmail.com> - - * gst/dvdspu/gstdvdspu.c: - dvdspu should forward video caps event - -2012-02-20 14:32:12 +0000 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - Add latest files to spec - -2012-02-20 12:42:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/decklink/Makefile.am: - decklink: Add $(GST_PLUGINS_BASE_CFLAGS) and $(GST_PLUGINS_BASE_LIBS) to fix the build - -2012-02-20 10:58:09 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/Makefile.am: - glib-compat-private.h to dist - -2012-02-19 15:54:39 -0800 David Schleef <ds@schleef.org> - - * tools/gst-project-maker: - gst-project-maker: Create autotools project - This is a replacement for gst-template that creates an entire - autotools project (customized to package name), and populates - it with the source for a GStreamer plugin (but no plugin features, - those come from gst-element-maker). Fixes: #665727. - -2012-02-19 12:57:39 -0800 David Schleef <ds@schleef.org> - - * ext/gme/gstgme.c: - * ext/opus/gstopusparse.c: - printf format fixes - -2012-02-19 00:15:47 -0800 David Schleef <ds@schleef.org> - - * gst/colorspace/colorspace.c: - colorspace: clamp intermediates when dithering - -2012-01-23 09:05:21 -0800 David Schleef <ds@schleef.org> - - * sys/decklink/Makefile.am: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksink.h: - decklink: Add 10-bit support - -2012-01-23 09:02:37 -0800 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroutils.c: - schro: Add RGB support - This uses the automatic YCoCg conversion inside Schroedinger to - encode/decode RGB. Only works in intra-only mode, similar to 10- - and 16-bit, since RGB is technically a >8-bit format for Dirac - purposes. This depends on schroedinger-1.0.12, which is unreleased. - -2012-02-18 00:01:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * win32/common/config.h: - win32: back to development - -2012-02-17 12:15:27 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsdemux: Not apply various time the same PMT to a program when repetead - Sometimes their are several times the same PMT applying to a same program in a stream, - tsdemux was totally baffled when this was happening, we now keep the one we - already applied so it works properly. - -2012-02-16 09:54:24 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - tsdemux: fix glib deprecation - -2012-02-17 11:06:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - back to development - -=== release 0.11.1 === - -2012-02-17 11:05:37 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-camerabin2.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * ext/cog/gstcogorc-dist.c: - * ext/cog/gstcogorc-dist.h: - * gst-plugins-bad.doap: - * gst/fieldanalysis/gstfieldanalysisorc-dist.c: - * gst/fieldanalysis/gstfieldanalysisorc-dist.h: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/eo.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - RELEASE 0.11.1 - -2012-02-17 09:01:56 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2012-02-16 16:30:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Put source to null when resetting caps - It seems that v4l2src isn't happy when switching formats on ready - state, it works when putting it to NULL. Keep this workaround in - wrappercamerabinsrc while v4l2src isn't fixed. - Fixes #849832 - -2012-02-16 14:33:20 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - Conflicts: - gst/mpegtsdemux/mpegtsbase.c - gst/mpegtsdemux/mpegtspacketizer.c - gst/mpegtsdemux/tsdemux.c - gst/mve/gstmvedemux.c - -2012-02-16 01:12:58 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Put source in NULL when it fails changing state - When source is being reset to change caps, check the return of - the state syncing function to avoid leaving the source in an - unconsistent state. - -2012-02-16 00:30:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mve/gstmvedemux.c: - mve: don't return a boolean for a GstFlowReturn - fixes playback. - -2012-02-15 10:32:17 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Avoid throwing FLOW_ERROR on last PCR processing error - In the case of scanning last pcr, errors are not critical, so we keep - the stream flowing. - -2012-02-14 11:44:48 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Add AAC latm support - -2012-02-15 11:06:57 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Minor refactoring/code cleaning - ... add some debugging symbols in the mean time. - -2012-02-15 16:38:32 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: remove _chain hack - As we can now rely upon being passed upstream delineated data in - ::handle_frame(), the latter can also parse avc formatted data - without having to intercept baseparse's chain function. - While this evidently requires 2 separate parsing paths, each can - be streamlined accordingly. - -2012-02-15 11:59:37 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - videoparsers: adjust to standardized baseparse frame state tracking - -2012-02-15 17:14:34 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2012-02-15 15:07:35 +0100 Jonas Larsson <jonas@hallerud.se> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix SEI parsing - ... in the presence of emulation_prevention_three_byte. - Fixes #668381. - -2012-02-15 14:29:23 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: use proper NALU offset for config data insertion - ... which has to be the position of the start code, which is almost always - but need not be 4 bytes. - -2012-02-15 13:39:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/videoparsers/gsth263parse.c: - h263parse: fix compilation - -2012-02-15 13:02:06 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - videoparsers: don't leak event - Unref the event when we don't chain up to the parent - -2012-02-15 12:56:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/videoparsers/dirac_parse.c: - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - videoparsers: chain up to parent event handler - Chain up to the parent event handler to get the default behaviour instead of - returning FALSE. - -2012-02-14 11:19:04 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-08-27 20:58:48 +0300 Raimo Järvi <raimo.jarvi@gmail.com> - - * sys/directdraw/gstdirectdrawsink.c: - directdrawsink: Fix warnings on 64 bit mingw-w64 - gstdirectdrawsink.c:1561:24: error: assignment from incompatible pointer type - gstdirectdrawsink.c:2028:3: error: format '%d' expects type 'int', but argument 8 has type 'size_t' - https://bugzilla.gnome.org/show_bug.cgi?id=657522 - -2012-02-13 18:44:01 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - videoparsers: adjust to modified baseparse API - -2012-02-13 11:16:20 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/pcapparse/gstirtspparse.c: - pcapparse: adjust to modified baseparse API - -2012-02-13 12:26:11 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: fixup merge - -2012-02-13 14:22:42 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/h264parse.c: - tests: h264parse: _unmap buffer upon exit - -2012-02-13 23:04:12 +1100 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Trivial bug fix. Don't copy data from an uninited buffer. - -2012-02-12 22:59:52 +0100 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * configure.ac: - * docs/plugins/Makefile.am: - * gst/multifdsink/.gitignore: - * gst/multifdsink/Makefile.am: - * gst/multifdsink/gstmultifdsink-marshal.list: - * gst/multifdsink/gstmultifdsink.c: - * gst/multifdsink/gstmultifdsink.h: - multifdsink: refactored in -base - -2012-02-10 16:52:46 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: report after merge - -2012-02-10 16:46:50 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - Conflicts: - ext/chromaprint/gstchromaprint.c - ext/mpeg2enc/Makefile.am - ext/voaacenc/gstvoaacenc.c - gst/dvbsuboverlay/gstdvbsuboverlay.c - gst/mpegtsdemux/mpegtsbase.c - gst/sdp/gstsdpdemux.c - gst/videoparsers/gsth264parse.c - sys/d3dvideosink/d3dvideosink.c - tests/examples/camerabin/gst-camera-perf.c - tests/examples/camerabin/gst-camerabin-test.c - tests/examples/camerabin2/gst-camerabin2-test.c - tests/examples/mxf/mxfdemux-structure.c - tests/examples/scaletempo/demo-main.c - -2012-02-10 14:46:00 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: unobfuscate frame parsing code - -2012-02-08 21:21:47 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * sys/shm/gstshmsink.c: - shmsink: fix indefinite wait after adding a new fd to the poll set - If the second call to _wait blocks, we will not signal the condition - variable, so ensure that second call is not blocking. - See rationale and information in the linked bug: - https://bugzilla.gnome.org/show_bug.cgi?id=669697 - -2012-02-09 18:08:22 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * ext/modplug/gstmodplug.cc: - modplug: port to 0.11 - -2012-02-09 14:42:23 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix refcount error - -2012-02-09 00:09:36 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsrc.c: - rtmp: don't use gst_element_class_install_std_props() - It's about to be removed. - -2012-02-08 20:09:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/inspect/plugin-h264parse.xml: - * gst/h264parse/Makefile.am: - * gst/h264parse/gsth264parse.c: - * gst/h264parse/gsth264parse.h: - Remove legacyh264parse element - One h264 parser ought to be enough for anybody. - https://bugzilla.gnome.org/show_bug.cgi?id=648002 - -2012-02-08 16:37:13 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2enc.c: - * ext/cog/gstcogmse.c: - * ext/kate/gstkatetiger.c: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mplex/gstmplex.cc: - * ext/resindvd/resindvdsrc.c: - * ext/teletextdec/gstteletextdec.c: - * gst/audiobuffer/gstaudioringbuffer.c: - * gst/camerabin/gstinputselector.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/freeze/gstfreeze.c: - * gst/liveadder/liveadder.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/multifdsink/gstmultifdsink.c: - * gst/mxf/mxfdemux.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/tta/gstttaparse.c: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/celvideosrc.c: - * sys/applemedia/miovideosrc.c: - * sys/applemedia/qtkitvideosrc.m: - * sys/avc/gstavcsrc.cpp: - * sys/d3dvideosink/d3dvideosink.c: - * sys/decklink/gstdecklinksink.cpp: - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/linsys/gstlinsyssdisrc.c: - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsrc.c: - * sys/winks/gstksvideodevice.c: - GST_FLOW_WRONG_STATE -> GST_FLOW_FLUSHING - -2012-02-07 17:00:26 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/assrender.c: - * tests/check/elements/faac.c: - * tests/check/elements/faad.c: - * tests/check/elements/h264parse.c: - * tests/check/elements/id3mux.c: - * tests/check/elements/jifmux.c: - * tests/check/elements/jpegparse.c: - * tests/check/elements/mpeg2enc.c: - * tests/check/elements/mpeg4videoparse.c: - * tests/check/elements/mpegtsmux.c: - * tests/check/elements/mpegvideoparse.c: - * tests/check/elements/multifdsink.c: - * tests/check/elements/mxfdemux.c: - * tests/check/elements/vp8dec.c: - * tests/check/elements/vp8enc.c: - * tests/check/elements/zbar.c: - tests: fix more unit tests - -2011-08-22 16:31:38 +0200 Carsten Kroll <car@ximidi.com> - - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/d3dvideosink.h: - d3dvideosink: create a d3d device for each sink and use the default swap chain in connection with flushing the GPU and not recreating the swap chain this avoids tearing also use GST_xx_DEBUG macros where appropriate - -2011-08-22 14:46:48 +0200 Carsten Kroll <car@ximidi.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: flush GPU before Present added alternate wait for vsync method based on GetRasterStatus - -2011-08-22 14:30:43 +0200 Carsten Kroll <car@ximidi.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: check for hardware capabilities, when negotiating - -2011-08-22 14:19:06 +0200 Carsten Kroll <car@ximidi.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: redraw last buffer when new window handle has been set. - -2011-08-22 14:13:30 +0200 Carsten Kroll <car@ximidi.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: added NV12 + enabled RGB support - -2011-08-27 13:07:00 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/d3dvideosink/d3dvideosink.c: - d3dvideosink: Fix device initialization check - -2012-02-07 12:14:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/camerabin.c: - * tests/check/elements/legacyresample.c: - tests: fix more tests - -2012-02-07 12:02:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/assrender.c: - * tests/check/elements/baseaudiovisualizer.c: - * tests/check/elements/faac.c: - * tests/check/elements/mpeg2enc.c: - * tests/check/elements/mplex.c: - tests: fix some tests - -2012-02-07 12:02:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.h: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstwavescope.c: - audiovis: port to 0.11 some more - -2012-02-02 13:33:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: prevent captures from being lost when switching resolutions - When switching capture caps, camerabin1 resets its state to ready - to force a new caps to be negotiated. This causes ongoing captures - to be aborted. - This commit adds a condition to wait for captures to finish before - going to ready state. - -2012-02-02 12:22:06 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: Improve debug message about processing counter - Mention on the logs how many capture operations might have been - lost - -2012-02-04 22:06:57 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/geometrictransform/gstrotate.c: - rotate: angle is in radians already, do not scale it - Other plugins use radians, and the angle documentation says radians. - https://bugzilla.gnome.org/show_bug.cgi?id=669365 - -2012-02-04 22:06:12 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/geometrictransform/gstrotate.c: - rotate: fix description string to match what the element does - https://bugzilla.gnome.org/show_bug.cgi?id=669365 - -2012-02-03 11:08:48 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: do not emit no-more-pads - Doing so may fix some things, but breaks others (new streams being - added in the future). - https://bugzilla.gnome.org/show_bug.cgi?id=665814 - -2012-02-03 11:26:53 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: decrease passthrough negotiation preference - Also ensure parsing fixed caps when negotiating rather than failing to - handle non-fixed list cases. - See #668471. - -2012-02-03 00:50:33 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/cog/Makefile.am: - * ext/curl/Makefile.am: - * ext/gsettings/Makefile.am: - * ext/kate/Makefile.am: - * ext/mpeg2enc/Makefile.am: - * ext/mplex/Makefile.am: - * ext/opus/Makefile.am: - * ext/sdl/Makefile.am: - * gst/hls/Makefile.am: - * gst/inter/Makefile.am: - * gst/liveadder/Makefile.am: - * gst/mve/Makefile.am: - * sys/decklink/Makefile.am: - * sys/shm/Makefile.am: - * tests/examples/scaletempo/Makefile.am: - build: fix CFLAGS order and LIBS order - _BAD_CFLAGS should always come first, then GST_PLUGINS_BASE_CFLAGS, - then GST_BASE_CFLAGS then GST_CFLAGS. Same for libs: first plugins - base libs, then GST_BASE_LIB then GST_LIBS. - -2012-02-02 23:21:50 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * gst/debugutils/Makefile.am: - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/gstchecksumsink.c: - * gst/debugutils/gstchopmydata.c: - * gst/debugutils/gstcompare.c: - * gst/debugutils/gstdebugspy.c: - debugutils: port to 0.11 - -2012-02-02 11:41:15 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegpsmux/mpegpsmux.c: - mpegpsmux: include specific AAC stream-format in template caps - This elements seems to support raw and adts AAC. - https://bugzilla.gnome.org/show_bug.cgi?id=665394 - -2012-02-02 11:37:55 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: add explicit supported AAC stream-format in template caps - https://bugzilla.gnome.org/show_bug.cgi?id=665394 - -2012-02-02 11:31:32 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: include specific support AAC stream formats in template caps - https://bugzilla.gnome.org/show_bug.cgi?id=665394 - -2012-02-02 11:27:33 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: specify in template caps we only take raw/adts AAC format - This appears to be what this element supports. - https://bugzilla.gnome.org/show_bug.cgi?id=665394 - -2012-02-02 11:20:38 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegdemux: include specific AAC stream-format types in template caps - https://bugzilla.gnome.org/show_bug.cgi?id=665394 - -2012-02-02 10:59:53 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatetiger.c: - * ext/kate/gstkateutil.c: - * ext/kate/gstkateutil.h: - kate: better error/debug reporting - Include text messages instead of error codes. - -2012-02-01 19:38:59 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/chromaprint/gstchromaprint.c: - chromaprint: fix parent structure in boilerplate macro - -2012-02-01 17:53:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegtsdemux/Makefile.am: - * gst/multifdsink/Makefile.am: - * tests/examples/opencv/gst_element_print_properties.c: - * tests/examples/scaletempo/Makefile.am: - build: ignore GValueArray deprecation warnings for the time being - until this gets sorted out with the GLib folks and we have a - viable alternative. - https://bugzilla.gnome.org/show_bug.cgi?id=667228 - -2012-02-01 17:46:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/chromaprint/gstchromaprint.c: - chromaprint: port to 0.11 - -2012-02-01 17:06:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/adpcmdec/adpcmdec.c: - adpcmdec: fix up for GstAudioDecoder API change - -2012-02-01 16:27:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/voamrwbenc/gstvoamrwbenc.c: - amrwbenc: Use new audio encoder/decoder base class API for srcpad caps - -2012-02-01 16:26:59 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: Use new audio encoder/decoder base class API for srcpad caps - -2012-02-01 16:26:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: Use new audio encoder/decoder base class API for srcpad caps - -2012-02-01 16:26:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: Use new audio encoder/decoder base class API for srcpad caps - -2012-02-01 16:25:19 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/dts/gstdtsdec.c: - dts: Use new audio encoder/decoder base class API for srcpad caps - -2012-02-01 16:23:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmenc.c: - gsm: Use new audio encoder/decoder base class API for srcpad caps - -2012-02-01 12:47:56 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: disable optimized packetized processing for reverse playback - ... as baseparse then provides whole chunks of data (as it should) at once - to be parsed, and so the assumptions used to optimize are no longer valid. - Fixes #667560. - -2012-02-01 12:23:23 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: also mind SEI position for config data insertion - Fixes #668627. - -2012-02-01 12:03:04 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: unbreak optimized packetized NALU collection processing - ... in that it was so optimized it did not consider grouping NALU into AU - altogether. - Fixes #668627. - -2011-12-14 19:27:53 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - tiger: use the new premultiplied support in gstvideo - -2012-01-30 18:46:07 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/resindvdsrc.c: - resindvd: fix wedge in preroll when playbin2 deinterlacing is enabled - When deinterlacing is enabled, an extra colorspace element is added. - Colorspace is a basetransform, and is then the only basetransform - element on the video path. A while ago, basetransform started delaying - events till caps were set on its source pad. These things conspired - to end up sending the DVD highlight events onto a blocked pad on - subtitleoverlay. - Ensuring these highlight events are only sent once we're in playing - mode fixes the issue. - https://bugzilla.gnome.org/show_bug.cgi?id=668762 - -2012-02-01 02:13:48 +0100 Robert Swain <robert.swain@gmail.com> - - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroutils.c: - * ext/schroedinger/gstschroutils.h: - schro: Fix compilation with 1.0.10 - -2011-12-26 21:57:48 -0600 Rob Clark <rob@ti.com> - - * gst/videoparsers/gstmpegvideoparse.c: - videoparsers: set interlaced field in caps for mpeg2 - https://bugzilla.gnome.org/show_bug.cgi?id=667218 - -2012-01-31 12:29:13 +0100 Stefan Sauer <ensonic@users.sf.net> - - * tests/icles/pitch-test.c: - controller: adapt to control-source type changes - -2012-01-31 08:44:04 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: update after collectpads2 changes - -2012-01-30 22:41:05 +0100 Stefan Sauer <ensonic@users.sf.net> - - * tests/icles/pitch-test.c: - controller: rename control-bindings - gst_control_binding_xxx -> gst_xxx_control_binding for consistency. - -2012-01-30 17:17:16 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - * gst/multifdsink/gstmultifdsink.c: - update for HEADER flag - -2012-01-25 13:57:57 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix parsing of VUI parameters. - max_dec_frame_buffering was mis-parsed because log2_max_mv_length_vertical - was parsed twice. - https://bugzilla.gnome.org/show_bug.cgi?id=668660 - -2012-01-29 18:01:05 +0000 Olivier Crête <olivier.crete@collabora.com> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: Unref non-forwarded events - Also, don't unref forwarded ones - -2012-01-28 20:01:35 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/voamrwbenc/gstvoamrwbenc.c: - voamrwbenc: init debug category - -2012-01-28 20:01:19 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: init debug category - -2012-01-28 16:57:03 +0000 Olivier Crête <olivier.crete@collabora.com> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: resync iterator on resync - -2012-01-28 12:32:46 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkateenc.c: - kateenc: remove 'flush every packet' hack - This is a bad hack which does not work with Matroska, and is now - obsolete as similar code is not included in oggmux/oggstream. - -2012-01-27 12:08:52 +0100 Olivier Crête <olivier.crete@collabora.com> - - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - rtpmux: Re-push sticky events on input pad change - -2012-01-27 12:07:43 +0100 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstdtmfdetect.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - dtmf: Use new-style caps - -2012-01-27 17:00:19 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure.ac: Add mpegdemux to the list of ported plugins - -2012-01-27 16:56:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Don't leak the SCHEDULING query - -2012-01-26 07:13:06 -0500 Matej Knopp <matej.knopp@gmail.com> - - * gst/mpegdemux/Makefile.am: - * gst/mpegdemux/flumpegdemux.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstpesfilter.c: - Port mpegdemux to 0.11 - -2012-01-27 14:49:58 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/cog/Makefile.am: - * ext/cog/gstcogmse.c: - * ext/curl/Makefile.am: - * ext/curl/gstcurlsink.c: - * ext/gsettings/Makefile.am: - * ext/gsettings/gstgsettingsaudiosink.c: - * ext/gsettings/gstgsettingsaudiosrc.c: - * ext/gsettings/gstgsettingsvideosink.c: - * ext/gsettings/gstgsettingsvideosrc.c: - * ext/kate/Makefile.am: - * ext/kate/gstkatetiger.c: - * ext/modplug/gstmodplug.cc: - * ext/mpeg2enc/Makefile.am: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mplex/Makefile.am: - * ext/mplex/gstmplex.cc: - * ext/opus/Makefile.am: - * ext/opus/gstopusenc.c: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/rsnparsetter.c: - * ext/sdl/Makefile.am: - * ext/sdl/sdlaudiosink.c: - * ext/sdl/sdlvideosink.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - * gst-libs/gst/glib-compat-private.h: - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst/aiff/aiffparse.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstinputselector.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/cdxaparse/gstcdxaparse.c: - * gst/coloreffects/gstchromahold.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/hls/Makefile.am: - * gst/hls/gsthlsdemux.c: - * gst/hls/m3u8.c: - * gst/inter/Makefile.am: - * gst/inter/gstintersurface.c: - * gst/inter/gstintertest.c: - * gst/liveadder/Makefile.am: - * gst/liveadder/liveadder.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mve/Makefile.am: - * gst/mve/gstmvemux.c: - * gst/mxf/mxfdemux.c: - * gst/rawparse/gstrawparse.c: - * gst/sdp/gstsdpdemux.c: - * gst/tta/gstttaparse.c: - * sys/decklink/Makefile.am: - * sys/decklink/capture.cpp: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - * sys/dvb/gstdvbsrc.c: - * sys/shm/Makefile.am: - * sys/shm/gstshmsink.c: - * tests/examples/camerabin/gst-camera-perf.c: - * tests/examples/camerabin/gst-camerabin-test.c: - * tests/examples/camerabin2/gst-camerabin2-test.c: - * tests/examples/mxf/mxfdemux-structure.c: - * tests/examples/scaletempo/Makefile.am: - * tests/examples/scaletempo/demo-gui.c: - * tests/examples/scaletempo/demo-main.c: - plenty: fixup glib deprecations - -2012-01-27 07:36:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: Add viewfinder colorspace conversion to default flags - This make the default settings more likely to work. If needed, one - can optimize by disabling conversions with the flags. - -2012-01-23 08:04:20 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Removing solved TODO and fixing a typo - -2012-01-26 23:28:28 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * gst/adpcmdec/adpcmdec.c: - adpcmdec: port to 0.11 - -2012-01-26 23:28:20 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * gst/adpcmdec/adpcmdec.c: - * gst/adpcmenc/adpcmenc.c: - adpcmenc: port to 0.11 - -2012-01-26 23:28:07 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmenc.c: - gsm: port to 0.11 - -2012-01-26 15:03:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure.ac: Add the DVB plugin to the non-ported plugins - It needs the MPEG TS parser and currently crashes during instantiation - because it can't create the MPEG TS parser. - -2012-01-25 18:25:01 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * ext/mpeg2enc/Makefile.am: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mpeg2enc/gstmpeg2enc.hh: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - * ext/mpeg2enc/gstmpeg2encstreamwriter.cc: - mpeg2enc: port to 0.11 - -2012-01-25 18:49:58 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/dts/gstdtsdec.c: - * ext/faac/gstfaac.c: - * ext/faad/gstfaad.c: - * ext/flite/gstflitetestsrc.c: - * ext/gme/gstgme.c: - * ext/mplex/gstmplexoutputstream.cc: - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsrc.c: - * ext/voaacenc/gstvoaacenc.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - * sys/dvb/gstdvbsrc.c: - * tests/check/elements/parser.c: - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin/gst-camerabin-test.c: - * tests/examples/camerabin2/gst-camerabin2-test.c: - * tests/examples/mxf/mxfdemux-structure.c: - port some more to new memory API - Fixes #668677. - -2012-01-25 16:37:22 +0100 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautoconvert.h: - * gst/autoconvert/gstautovideoconvert.c: - * tests/check/elements/autovideoconvert.c: - autoconvert: port to 0.11 - -2012-01-25 16:57:52 +0100 Olivier Crête <olivier.crete@collabora.com> - - * gst/bayer/gstrgb2bayer.c: - bayer: Intersect transformed caps with filter - -2012-01-25 15:43:01 +0100 Olivier Crête <olivier.crete@collabora.com> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: Don't leak gvalue from iterator - -2012-01-25 16:46:44 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmux/gstrtpmux.c: - more porting - -2012-01-25 16:20:41 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/multifdsink/gstmultifdsink.c: - * gst/pcapparse/gstirtspparse.c: - * gst/pcapparse/gstpcapparse.c: - * gst/rtpvp8/gstrtpvp8pay.c: - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/h263parse.c: - port some more to new memory API - -2012-01-25 14:50:50 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.h: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstwavescope.c: - * gst/bayer/gstbayer2rgb.c: - * gst/bayer/gstrgb2bayer.c: - * gst/dtmf/gstdtmfdetect.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstspu-pgs.c: - * gst/dvdspu/gstspu-vobsub.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/tsdemux.c: - port to new memory API - -2012-01-25 13:58:19 +0100 Thomas Vander Stichele <thomas (at) apestaart (dot) org> - - * common: - Automatic update of common submodule - From c463bc0 to 7fda524 - -2012-01-25 13:22:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - Merge branch 'master' into 0.11 - Conflicts: - configure.ac - ext/kate/gstkateenc.c - gst/colorspace/colorspace.c - gst/mpegvideoparse/mpegvideoparse.c - -2012-01-18 12:04:52 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: limit the amount of scanning done on duration queries - Limit the amount of data scanned when looking for PTSes in duration queries as a - failsafe for kinda broken, potentially large files with sparse or no PTSes. - -2012-01-18 11:28:26 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: don't scan for the last PTS if the first wasn't found - -2012-01-25 11:21:50 +0100 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * gst/dtmf/gstdtmfdetect.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfdepay.h: - * gst/dtmf/gstrtpdtmfsrc.c: - dtmf: port to 0.11 - -2012-01-25 10:45:51 +0100 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * gst/rtpvp8/Makefile.am: - * gst/rtpvp8/gstrtpvp8depay.c: - * gst/rtpvp8/gstrtpvp8depay.h: - * gst/rtpvp8/gstrtpvp8pay.c: - * gst/rtpvp8/gstrtpvp8pay.h: - rtpvp8: port to 0.11 - -2012-01-24 22:14:39 +0100 Olivier Crête <olivier.crete@collabora.com> - - * Android.mk: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * gst-plugins-bad.spec.in: - * gst/videomaxrate/Makefile.am: - * gst/videomaxrate/videomaxrate.c: - * gst/videomaxrate/videomaxrate.h: - videomaxrate: Remove, videorate includes the same functionality now - -2012-01-24 14:20:52 +0100 Olivier Crête <olivier.crete@collabora.com> - - * configure.ac: - * gst/rtpmux/Makefile.am: - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - * tests/check/elements/rtpmux.c: - rtpmux: port to 0.11 - -2012-01-25 11:38:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 2a59016 to c463bc0 - -2012-01-24 11:56:34 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/flite/gstflitetestsrc.c: - flite: make constant static arrays actually static - -2012-01-24 11:53:26 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/flite/gstflitetestsrc.c: - flite: fix uninitialized return value - -2012-01-24 11:22:46 +0100 Oleksij Rempel (Alexey Fisher) <bug-track@fisher-privat.net> - - * ext/vp8/gstvp8enc.c: - vp8enc: trace outgoing timestamps - add info level prints for outgoing timestamps. - Signed-off-by: Oleksij Rempel (Alexey Fisher) <bug-track@fisher-privat.net> - -2012-01-23 22:20:40 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/rsndec.c: - resindvd: fix caps refcount error - /me bad monkey. - -2012-01-23 18:30:19 +0000 Jonas Larsson <jonas@hallerud.se> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parse: fix gst_h264_parse_clock_timestamp always failing - -2012-01-23 18:01:14 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * REQUIREMENTS: - REQUIREMENTS: we need librtmp for rtmp support - https://bugzilla.gnome.org/show_bug.cgi?id=668521 - -2012-01-23 18:51:34 +0100 Jonas Larsson <jonas@hallerud.se> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: read the cbr_flag in h264_parse_hrd_parameters - -2012-01-23 17:47:45 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: fix frequent deadlock demuxing MPEG TS - A previous patch to add streams early to fix playback of - low bitrate streams causes frequent deadlock of a nature - I'm at loss how to fix. - I'm not certain whether it's a bug in decodebin2, or in - that mpegtsdemux patch. - Since it causes a major regression, let it be disabled for now. - -2012-01-23 14:10:43 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: break out when stream identified - -2012-01-23 14:06:54 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsdemux: avoid NULL manipulation if invalid input - -2012-01-23 14:05:45 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/mpegtsparse.c: - mpegdemux: avoid NULL manipulation if invalid input - -2012-01-23 14:01:02 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegdemux: avoid some unlikely leaks - -2012-01-23 13:58:57 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegvideoparse/mpegvideoparse.c: - mpegvideoparse: prevent some fall-through cases - -2012-01-23 13:58:04 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mve/gstmvemux.c: - mve: use signed loop variable - ... when using it in i >= 0. - -2012-01-23 13:57:32 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mve/mvevideoenc16.c: - mve: ensure best target found - -2012-01-23 13:56:02 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/festival/gstfestival.c: - festival: enhance some error case handling - -2012-01-23 13:55:33 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/nuvdemux/gstnuvdemux.c: - nuvdemux: check directly for valid buffer - ... rather than doing so indirectly in (incomplete) semantic way. - -2012-01-23 13:54:32 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: fix parameter sanity check - -2012-01-23 11:54:08 +0000 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - Update spec file to work - -2012-01-20 15:34:27 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/resindvdbin.c: - * ext/resindvd/rsndec.c: - resindvd: fix preroll on titles with no audio track - https://bugzilla.gnome.org/show_bug.cgi?id=599469 - -2012-01-20 12:25:09 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/resindvdsrc.c: - rsndvdsrc: fix leak - -2012-01-20 12:15:20 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/resindvdbin.c: - resindvdbin: fix video/audio mixup in error message - -2012-01-20 10:42:21 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/rsnaudiomunge.c: - rsnaudiomunge: keep the object ref longer - Since we do not get a ref to the pad, I'm not certain it's safe - to drop the object and use the pad later, so hold the object ref - till we're done with the pad. - -2012-01-21 20:08:36 +0100 Stefan Sauer <ensonic@users.sf.net> - - * tests/icles/pitch-test.c: - controller: move from control-binding to control-binding-direct - -2012-01-22 16:59:37 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/colorspace/colorspace.c: - * gst/colorspace/gstcolorspaceorc.orc: - Revert "!colorspace: fix odd size problems" - This reverts commit e2e6fdcb6b265db201f191952aeed429e85e834e. - Untested commit was accidentally pushed. - -2012-01-22 16:58:59 -0800 David Schleef <ds@schleef.org> - - * gst/colorspace/colorspace.c: - Revert "colorspace: Fix out-of-bound errors for v210" - This reverts commit 3b8b87cb6c217b9f0b52cfa3079c4a36afd1c424. - Untested commit was accidentally pushed. - -2012-01-22 16:55:46 -0800 David Schleef <ds@schleef.org> - - * gst/inter/gstintersubsink.c: - * gst/inter/gstintervideosink.c: - inter: Fix compilation - Fix up previously botched rebase. - -2012-01-09 21:59:57 -0800 David Schleef <ds@schleef.org> - - * gst/colorspace/colorspace.c: - colorspace: Fix out-of-bound errors for v210 - -2011-12-31 17:14:24 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/colorspace/colorspace.c: - * gst/colorspace/gstcolorspaceorc.orc: - !colorspace: fix odd size problems - -2012-01-22 15:49:12 -0800 David Schleef <ds@schleef.org> - - * gst/inter/gstinter.c: - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintersurface.c: - * gst/inter/gstintersurface.h: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosink.h: - * gst/inter/gstintervideosrc.c: - * gst/inter/gstintervideosrc.h: - inter: Add channel property - -2012-01-22 15:48:28 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroutils.c: - * ext/schroedinger/gstschroutils.h: - schro: Handle 10 and 16-bit formats - -2011-12-31 17:13:02 -0800 David Schleef <ds@schleef.org> - - * sys/avc/Makefile.am: - avc: fix broken line continuation - -2011-08-18 19:49:08 -0700 David Schleef <ds@schleef.org> - - * gst/colorspace/colorspace.c: - colorspace: Add jpeg color-matrix conversion - -2011-08-09 09:19:10 -0700 David Schleef <ds@schleef.org> - - * gst/inter/Makefile.am: - * gst/inter/gstinter.c: - * gst/inter/gstintersubsink.c: - * gst/inter/gstintersubsink.h: - * gst/inter/gstintersubsrc.c: - * gst/inter/gstintersubsrc.h: - * gst/inter/gstintersurface.h: - inter: Add subtitle inter elements - -2011-08-04 13:05:22 -0700 David Schleef <ds@schleef.org> - - * ext/kate/gstkateenc.c: - kateenc: Don't error on empty input buffers - -2012-01-22 19:27:59 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * gst-plugins-bad.spec.in: - * gst/mpegvideoparse/Makefile.am: - * gst/mpegvideoparse/mpegpacketiser.c: - * gst/mpegvideoparse/mpegpacketiser.h: - * gst/mpegvideoparse/mpegvideoparse.c: - * gst/mpegvideoparse/mpegvideoparse.h: - * gst/mpegvideoparse/mpegvideoparse.vcproj: - Remove legacy mpegvideoparse plugin - There's a new one in the videoparsers plugin. - -2012-01-22 19:13:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/multifdsink/.gitignore: - multifdsink: make git ignore generated files - -2012-01-22 19:11:21 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/videoparsers/gsth263parse.c: - h263parse: make level and profile fields in caps strings - For consistency with other caps. - https://bugzilla.gnome.org/show_bug.cgi?id=658438 - -2012-01-18 16:35:16 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: fix ref_pic_list_modification() - The entries were not filled in linearly and the termination was not - recorded either. Now, the actual number of modifications is recorded - similarly to dec_ref_pic_marking(). i.e. an explicit counter instead - of storing the termination value in the array. - https://bugzilla.gnome.org/show_bug.cgi?id=668192 - -2012-01-20 16:12:02 +0000 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - Update spec file for actually ported elements - -2012-01-20 15:23:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - * configure.ac: - configure: only check for gst-plugins-{good,ugly,ffmpeg} in uninstalled setups - We don't install .pc files for plugin modules, because we only need - them in uninstalled setups, so we can find the plugins for unit tests - (even when run a couple of directories deeper or out-of-tree during - make distcheck). - Try to avoid confusion, so only check for those if this is in fact - an uninstalled setup. For installed setups there's no problem finding - the plugins, we assume they are all in the plugindir specified by - GStreamer core's .pc file. - https://bugzilla.gnome.org/show_bug.cgi?id=668311 - -2012-01-20 14:46:00 +0100 Stefan Sauer <ensonic@users.sf.net> - - * tests/icles/pitch-test.c: - controller: adapt to control binding changes - -2012-01-20 11:40:00 +0100 Stefan Sauer <ensonic@users.sf.net> - - * tests/icles/pitch-test.c: - controller: adapt to controller api changes - Don't use the convenience api for control sources. - -2012-01-20 00:53:46 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/chromaprint/gstchromaprint.c: - * ext/chromaprint/gstchromaprint.h: - chromaprint: minor clean-ups - Flesh out docs a bit, fix element class. - -2011-01-02 19:34:04 +0000 Lukáš Lalinský <lalinsky@gmail.com> - - * configure.ac: - * ext/Makefile.am: - * ext/chromaprint/Makefile.am: - * ext/chromaprint/gstchromaprint.c: - * ext/chromaprint/gstchromaprint.h: - chromaprint: import Acoustid audio fingerprinting plugin - Imported from https://launchpad.net/gst-chromaprint - -2012-01-10 00:22:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: handle corner-case of short read in pull_buffer better - It's extremely unlikely, but there are corner cases where a short - read might happen, so handle that, just in case. - -2012-01-19 15:43:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/gsm/gstgsmenc.c: - gsmenc: fix unused-but-set-variable compiler warning - -2012-01-19 15:12:46 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - * configure.ac: - Add --disable-fatal-warnings configure option - -2012-01-19 11:34:26 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - * ext/mplex/gstmplex.cc: - * ext/mplex/gstmplex.hh: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.h: - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.h: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.h: - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - * gst/multifdsink/gstmultifdsink.c: - * gst/multifdsink/gstmultifdsink.h: - * gst/sdp/gstsdpdemux.c: - * gst/sdp/gstsdpdemux.h: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - * tests/examples/camerabin/gst-camera-perf.c: - * tests/examples/camerabin/gst-camerabin-test.c: - * tests/examples/camerabin2/gst-camerabin2-test.c: - * tests/examples/mxf/mxfdemux-structure.c: - * tests/examples/scaletempo/demo-gui.c: - * tests/examples/scaletempo/demo-main.c: - port to new gthread API - -2012-01-18 17:01:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure.ac: Remove GIO check, this is in gst-glib2.m4 now - -2012-01-18 16:46:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 0807187 to 2a59016 - -2012-01-18 16:35:04 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/sdp/Makefile.am: - * gst/sdp/gstsdpdemux.c: - * gst/sdp/gstsdpdemux.h: - sdpdemux: Port to GIO and the new udpsrc/sink properties - -2012-01-18 16:01:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure.ac: Add opus to the non-ported plugins - It needs to be updated for the new multichannel API. - -2012-01-18 15:48:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/multifdsink/Makefile.am: - multifdsink: Add $(GST_PLUGINS_BAD_CFLAGS) for the i18n header file - -2012-01-17 21:36:21 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/adpcmdec/Makefile.am: - * gst/adpcmdec/adpcmdec.c: - adpcmdec: port to audiodecoder - -2012-01-17 21:36:08 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/adpcmenc/Makefile.am: - * gst/adpcmenc/adpcmenc.c: - adpcmenc: port to audioencoder - -2012-01-17 18:33:09 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmdec.h: - gsmdec: port to audiodecoder - -2012-01-17 18:32:23 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/gsm/gstgsmenc.c: - * ext/gsm/gstgsmenc.h: - gsmenc: port to audioencoder - -2012-01-17 13:12:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/Makefile.am: - multifdsink: Add to the docs - -2012-01-16 22:52:18 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * ext/mplex/gstmplex.cc: - * ext/mplex/gstmplexibitstream.cc: - * ext/mplex/gstmplexoutputstream.cc: - mplex: port to 0.11 - -2012-01-16 22:52:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * gst/pcapparse/gstpcapparse.c: - pcapparse: port to 0.11 - -2012-01-16 22:51:59 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/pcapparse/gstirtspparse.c: - irtspparse: port to 0.11 - -2012-01-16 17:30:22 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/debugutils/gstdebugspy.c: - debugspy: fix string leak - -2012-01-16 17:07:29 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/flutspmtstreaminfo.c: - mpegdemux: fix missing finalize chaining to parent - This code does not seem to trigger on my test streams, so it's - a bit of a blind fix, but seems safe enough to push. - -2012-01-16 17:02:22 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opencv/gsttemplatematch.c: - opencv: fix missing finalize chaining to parent class - Not compiled, I do not have the necessary dependencies. - -2012-01-16 17:01:18 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/gme/gstgme.c: - gme: fix missing dispose chaining to parent class - Not compiled, I do not have the necessary dependencies. - -2012-01-16 16:59:57 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/spc/gstspc.c: - spc: fix missing dispose chaining to parent class - Not even compiled, I do not have the dependencies needed. - -2012-01-16 11:29:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/multifdsink/Makefile.am: - * gst/multifdsink/gstmultifdsink-marshal.list: - * gst/multifdsink/gstmultifdsink.c: - * gst/multifdsink/gstmultifdsink.h: - * tests/check/Makefile.am: - * tests/check/elements/multifdsink.c: - multifdsink: Move multifdsink from gst-plugins-base to gst-plugins-bad - -2012-01-13 15:57:33 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * gst/videoparsers/Makefile.am: - Android, Fix wrong dinamic linking attempt - gstcodecparsers is built as an static library. - This change fixes building with the Android buildsystem. - -2012-01-13 13:30:57 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/cog/gstcogmse.c: - cogmse: fix finalize not calling base class (and leaking) - -2012-01-13 12:55:39 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/cog/gstcogmse.c: - cogmse: signal chain functions to exit on flush-start - -2012-01-13 12:08:28 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/siren/gstsirenenc.c: - sirenenc: fix base class call mixup in finalize - -2012-01-13 11:22:42 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/cog/gstcogmse.c: - cogmse: fix typo using the wrong pad - -2012-01-13 11:22:21 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/cog/gstcogmse.c: - cogmse: fix possible buffer leak - -2012-01-13 10:32:59 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * sys/linsys/gstlinsyssdisink.c: - * sys/linsys/gstlinsyssdisrc.c: - linsyssdi: fix leaks - -2012-01-13 10:25:22 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/rsvg/gstrsvgoverlay.c: - rsvgoverlay: fix adapter leak - -2012-01-13 00:11:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - Merge remote-tracking branch 'origin/master' into 0.11 - -2012-01-12 17:16:32 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/cog/gstcogmse.c: - cogmse: fix pad leaks - -2012-01-12 17:11:14 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/patchdetect/gstpatchdetect.c: - * gst/patchdetect/gstpatchdetect.h: - patchdetect: remove (leaking) dead code - -2012-01-12 16:45:39 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosink.h: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstinteraudiosrc.h: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosink.h: - * gst/inter/gstintervideosrc.c: - * gst/inter/gstintervideosrc.h: - inter: remove (leaking) dead code - -2012-01-12 16:36:19 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/schroedinger/gstschroenc.c: - schroenc: balance encoder and video format alloc/dealloc - They would leak if just constructing and freeing an object, - and probably crash if going from PLAYING to READY and back - again (though I haven't tested that). - -2012-01-12 15:58:36 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: fix queue leak - -2012-01-12 15:43:51 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/dccp/gstdccpclientsink.c: - dccpclientsink: fix string leak - -2012-01-12 15:19:01 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/y4m/gsty4mdec.c: - y4mdec: fix event leak - -2012-01-12 14:34:25 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - mpegvideoparser: fix memory leak - -2012-01-12 10:26:39 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: also indicate mono audio in sink caps - -2012-01-12 10:25:48 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: also indicate mono audio in sink caps - -2012-01-11 18:24:41 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/schroedinger/gstschrodec.c: - schrodec: fix tag leak - -2012-01-11 18:12:22 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/schroedinger/gstschrodec.c: - schrodec: take out unused leaking buffer - -2012-01-11 18:37:15 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * ext/voaacenc/gstvoaacenc.c: - voaacenc: port to 0.11 - -2012-01-11 16:34:35 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusparse.c: - opusparse: fix caps leak - -2012-01-11 16:32:31 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusparse.c: - opusparse: fix slist leak - -2012-01-11 13:32:36 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * tests/check/elements/opus.c: - tests: fix buffer leaks in opus tests - -2012-01-11 12:58:08 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: fix some input and output buffer map and ref handling - -2012-01-11 12:57:19 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: base class audio info is not yet set during set_format - ... since it will only be committed after it has been accepted by subclass. - In particular, subclass should not rely on it during its setup. - -2012-01-11 12:55:32 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: sprinkle some more layout info in caps - -2012-01-11 12:39:01 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/voamrwbenc/gstvoamrwbenc.c: - voamrwbenc: fix audio format in template caps - -2012-01-11 12:24:15 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * ext/voamrwbenc/gstvoamrwbenc.c: - voamrwbenc: port to 0.11 - -2012-01-11 10:50:52 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: Unset the UNPOSITIONED flag if we have valid channel positions - -2012-01-10 17:27:54 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/modplug/gstmodplug.cc: - modplug: fix caps leak - -2012-01-10 16:59:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/dts/gstdtsdec.c: - * ext/dts/gstdtsdec.h: - dtsdec: Port to 0.11 - -2012-01-10 15:50:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - Merge branch 'master' into 0.11 - Conflicts: - gst/mpegtsdemux/tsdemux.c - gst/videoparsers/gsth264parse.c - tests/check/elements/camerabin2.c - -2012-01-10 13:38:50 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: fix slist leak - -2012-01-10 13:38:42 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: fix caps leak - -2012-01-10 13:25:05 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlace: fix caps leaks - -2012-01-10 13:24:22 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlace: fix ref leak - -2012-01-10 11:41:34 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Don't provide bogus values in non-TIME push-mode - Only take the upstream segment values in GST_FORMAT_TIME - -2012-01-10 11:37:13 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Handle rollover in PTS and DTS - Also hands back-rollover which can happen with PTS - -2012-01-04 11:05:48 +0100 Oleksij Rempel (Alexey Fisher) <bug-track@fisher-privat.net> - - * ext/vp8/gstvp8dec.c: - vp8dec: use is_alt_data option to prevent timestamp collisions - altref/invisible frames usually stored in container with same timestamp as - dependet frame. This make basevideodecoder to update timestamp for dependet - frame and couse TS colision on next frame: - ^- here is altref - time : 1 2 3 4 5 6 7 8 9 - webm ts : 1 3 5 5 7 9 - vp8dec ts: 1 3 7 7 9 - Fix bug: https://bugzilla.gnome.org/show_bug.cgi?id=655245 - Signed-off-by: Oleksij Rempel (Alexey Fisher) <bug-track@fisher-privat.net> - -2012-01-04 11:09:23 +0100 Oleksij Rempel (Alexey Fisher) <bug-track@fisher-privat.net> - - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: add option to hande alt frame data - altref/invisible 'frame' do not describe some frame directly, so it can't be - displayed and timestamps should not be updated. - Fix bug: https://bugzilla.gnome.org/show_bug.cgi?id=655245 - Signed-off-by: Oleksij Rempel (Alexey Fisher) <bug-track@fisher-privat.net> - -2012-01-09 14:56:29 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: mpeg4: fix parsing when recursively skipping user data - -2012-01-09 14:59:58 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: Make sure that the srcpad has caps before finishing actual audio data - -2012-01-09 14:39:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparse: Don't update caps on every buffer - -2012-01-09 14:28:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gstmpeg4videoparse.c: - mpeg4videoparse: Don't call gst_buffer_memcmp() with a NULL buffer - -2012-01-09 11:03:24 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: use the framerate that was copied a few lines above - -2012-01-09 10:58:56 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: add a couple consts on string literal arrays - -2012-01-09 08:40:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: GstBaseCameraSrc is the base class, not GstBin - -2012-01-09 08:34:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: voamrwbenc, lv2 and telextdec are not ported yet - -2011-12-19 11:24:31 -0500 David Biomech360 <ddes310@yahoo.com> - - * gst/coloreffects/gstcoloreffects.c: - * gst/coloreffects/gstcoloreffects.h: - coloreffects: added support for a visual magnifier color filter to be used in gnome-video-effects - https://bugzilla.gnome.org/show_bug.cgi?id=666542 - -2012-01-06 10:52:36 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix test and set not using the same input - This fixes H.264 output not having a set framerate, and - confusing some of the elements downstream (such as interlace). - -2012-01-06 10:39:07 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlace: avoid dividing by zero on unkbown framerate - If the framerate is unknown, we cannot generate meaningful - buffer timestamps/durations, so set them to _NONE instead of - calculating something wrong and dividing by 0. - -2012-01-02 08:28:13 +0100 Oleksij Rempel (Alexey Fisher) <bug-track@fisher-privat.net> - - * ext/vp8/GstVP8Enc.prs: - * ext/vp8/Makefile.am: - vp8: add initial preset file - This is initial preset file, currently with only one profile - for realtime encoding. - Signed-off-by: Oleksij Rempel (Alexey Fisher) <bug-track@fisher-privat.net> - -2012-01-05 14:30:21 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/examples/camerabin2/Makefile.am: - examples: link against video library - -2011-12-08 12:15:39 +0800 Zhao Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: remove h263 gob parsing, since there is no gob immediate after svh - -2011-12-08 12:13:38 +0800 Zhao Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: add missing zero_bits in h263 parsing - -2011-12-08 12:12:21 +0800 Zhao Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: includes start_marker in h263 header for parsing - -2011-12-08 12:07:42 +0800 Zhao Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: fix offset issue in h263 parse - -2011-12-08 11:27:56 +0800 Zhao Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: fix mask pattern for h263 start marker - -2012-01-05 11:01:01 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * tests/examples/camerabin2/gst-camera2.c: - tests: test for GTK 2.24 for new symbols used in camerabin2 tests - The whole tree is likely to switch to GTK 3.0 at some point, but - we might as well continue building with slightly less new versions - if it's not hard to do. - -2012-01-05 10:38:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.h: - signalprocessor: The multichannel.h header is gone now - -2012-01-05 10:23:07 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faad/gstfaad.c: - * ext/faad/gstfaad.h: - faad: Update for the new raw audio caps - -2012-01-05 09:52:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faac/gstfaac.c: - * ext/faac/gstfaac.h: - faac: Port to the new raw audio caps - -2012-01-05 09:34:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/flite/gstflitetestsrc.c: - flitetestsrc: Update to the new raw audio caps - -2012-01-04 16:13:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstwavescope.c: - audiovisualizers: Update for the new raw audio caps - -2012-01-04 19:52:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From 0546e58 to 0807187 - -2012-01-04 18:42:57 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/camerabin.c: - * tests/check/elements/camerabin2.c: - * tests/check/elements/jifmux.c: - tests: remove temporary files when done in camerabin, camerabin2 and jifmux tests - -2012-01-04 11:28:36 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/asfmux.c: - * tests/check/elements/assrender.c: - * tests/check/elements/autoconvert.c: - * tests/check/elements/faac.c: - * tests/check/elements/faad.c: - * tests/check/generic/states.c: - tests: port some more unit tests - -2012-01-04 10:56:51 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: fix and tweak frame timestamping - ... to run with properly init'ed variables, and to only perform interpolation - in safe cases. - -2012-01-04 10:02:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/gme/gstgme.c: - * ext/rtmp/gstrtmpsrc.c: - GST_FLOW_UNEXPECTED -> GST_FLOW_EOS - -2012-01-03 22:09:04 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: prefer negotiating pass-through - -2012-01-03 21:59:32 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: mark byte-stream AU frame with inserted codec NALs as keyframe - -2012-01-03 20:23:16 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: properly determine skip amount when no NAL start found yet - -2012-01-03 20:21:51 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: some more proper parse state reset - -2012-01-03 15:26:54 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/faad/gstfaad.c: - * ext/libmms/gstmms.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst/dataurisrc/gstdataurisrc.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - GST_FLOW_UNEXPECTED -> GST_FLOW_EOS - -2012-01-02 15:55:21 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: encoding profiles are objects in 0.11 - -2012-01-02 15:52:23 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * tests/examples/scaletempo/demo-player.c: - examples: Fix build - -2011-12-31 09:55:46 +0100 Stefan Sauer <ensonic@users.sf.net> - - * tests/icles/pitch-test.c: - controller: port to API changes - -2011-12-30 19:08:08 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: update for gdp dataprotocol library removal - -2011-12-30 18:18:10 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Swallow incoming caps event - Otherwise we end up asking subclasses to push the event forward, - which will fail since no pads are created yet. - -2011-12-30 18:17:26 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Properly carry over the timestamp - -2011-11-08 20:19:41 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux: Use incoming timestamps in live mode - -2011-11-08 20:12:50 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Report latency (700ms) - -2011-11-08 09:44:18 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - mpegtsbase: Query whether upstream is live or not - -2011-12-06 17:37:45 +0100 Matej Knopp <matej.knopp@gmail.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Activate pad before settings caps - https://bugzilla.gnome.org/show_bug.cgi?id=665677 - -2011-12-30 11:49:27 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - Merge remote-tracking branch 'origin/master' into 0.11 - Conflicts: - tests/examples/camerabin2/Makefile.am - -2011-12-30 11:41:17 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - Merge remote-tracking branch 'origin/master' into 0.11-premerge - Conflicts: - docs/libs/Makefile.am - ext/kate/gstkatetiger.c - ext/opus/gstopusdec.c - ext/xvid/gstxvidenc.c - gst-libs/gst/basecamerabinsrc/Makefile.am - gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c - gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h - gst-libs/gst/video/gstbasevideocodec.c - gst-libs/gst/video/gstbasevideocodec.h - gst-libs/gst/video/gstbasevideodecoder.c - gst-libs/gst/video/gstbasevideoencoder.c - gst/asfmux/gstasfmux.c - gst/audiovisualizers/gstwavescope.c - gst/camerabin2/gstcamerabin2.c - gst/debugutils/gstcompare.c - gst/frei0r/gstfrei0rmixer.c - gst/mpegpsmux/mpegpsmux.c - gst/mpegtsmux/mpegtsmux.c - gst/mxf/mxfmux.c - gst/videomeasure/gstvideomeasure_ssim.c - gst/videoparsers/gsth264parse.c - gst/videoparsers/gstmpeg4videoparse.c - -2011-12-30 00:02:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst-libs/gst/video/gstbasevideocodec.c: - basevideocodec: Reset should reset current caps - New caps will need to be negotiated when reset happens - (PAUSED to READY). Without reseting the internal - stored format, basevideoencoder/decoder wouldn't call the - configuration function when the same caps was negotiated - again as they would believe this was the same caps as before. - The issue is that _stop has been called when going to READY and - the elements would have reset their internal codec libs/state as - well. A new configuration should be done. - -2011-12-30 00:02:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: clarify some message logs - Be explicit on which encodebin we're switching profiles on the - log messages - -2011-12-29 13:30:13 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/examples/camerabin2/gst-camera2.c: - examples: camerabin2: add some error handling for format changing - Check that the format could be initialized and shows a modal dialog - in case it couldn't. - -2011-12-29 12:47:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/examples/camerabin2/Makefile.am: - * tests/examples/camerabin2/gst-camera2.c: - * tests/examples/camerabin2/gst-camera2.h: - * tests/examples/camerabin2/gst-camera2.ui: - examples: camerabin2: add format selection for camerabin2 example - Adds a combobox for selecting the video profile for recordings. - Useful for testing multiple formats a/v sync when recording. - -2011-12-28 16:59:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/check/Makefile.am: - tests: remove comment for already fixed issues on makefile - Some issues on camerabin2 and jifmux tests were fixed some - time ago, remove the comments about them - -2011-12-28 16:57:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Fix message leak in tests - -2011-12-27 11:59:16 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: fix gvalue leak - -2011-12-27 10:23:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: fix mainloop leaks - -2011-12-27 10:20:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: secure event ref when sending event to parent class - camerabin2 needs to hold an extra ref on send_event before sending - it to the parent class as it will need to use it after the parent - handles it. - -2011-12-24 14:32:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: porting to 0.11 - -2011-12-23 16:33:45 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * configure.ac: - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin2: port to 0.11 - -2011-12-23 09:30:31 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.h: - faac: standardize some field data types - Fixes #666750. - -2011-12-22 15:19:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst-libs/gst/basecamerabinsrc/Makefile.am: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst/camerabin2/gstwrappercamerabinsrc.c: - basecamerabinsrc: remove redundant functions - gst_bin_get_by_interface should be enough for applications. - Haven't seen anyone using those other than wrappercamerabinsrc. - -2011-12-22 15:01:47 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/camerabingeneral.h: - camerabin2: remove unused helper function - This drop_eos_probe function is not used anymore, remove it - -2011-12-22 17:15:28 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: recreate encoder after flushing - ... since it appears the existing one can't be bothered anymore to produce - some output. - -2011-12-22 17:14:09 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: refactor encoder library setup - -2011-12-22 17:10:18 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: no need to duplicate baseclass sanity checks - -2011-12-22 17:09:30 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/voamrwbenc/gstvoamrwbenc.c: - voamrwbenc: no need to duplicate baseclass sanity checks - -2011-12-21 23:51:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/zbar/gstzbar.c: - * ext/zbar/gstzbar.h: - update for videofilter changes - -2011-12-21 11:33:48 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/examples/opencv/gstmotioncells_dynamic_test.c: - tests: avoid useless include - -2011-12-19 16:49:08 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Fix A/V sync for captures - Audio src was pushing newsegments starting from 0, even when its buffers - were not starting with 0 as their timestamps. Add a buffer probe that - checks the ts of the first buffer and uses that to push a newsegment, - just like we do for video on wrappercamerabinsrc. - -2011-12-19 15:17:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/check/Makefile.am: - tests: camerabin2: enable tests - Tests are passing now, enable them - -2011-12-19 15:16:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Push newsegments on video capture start - Pushing newsegments to inform muxers about the start time of the - video buffer timestamps. - -2011-12-20 14:04:52 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: clear sei message prior to parsing - Fixes #666584. - -2011-12-19 23:51:19 +0100 Stefan Sauer <ensonic@users.sf.net> - - * tests/icles/pitch-test.c: - controller: port to new interpolation-mode api - -2011-12-19 22:54:47 +0100 Stefan Sauer <ensonic@users.sf.net> - - * tests/icles/pitch-test.c: - controller: port to new controller api - -2011-12-19 18:44:33 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/y4m/gsty4mdec.c: - y4m: update for new interlace caps - -2011-12-19 13:18:51 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: only warn when we see a PID with unknown type - This is quite frequent, and we will just ignore that stream, - so an error is not warranted. - -2011-12-19 12:32:26 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: avoid pushing SPS/PPS at start only if both are found in stream - Avoid injecting SPS/PPS nals only if both are already present in the stream. - Fixes some AVC clips that happen to have only PPS nals in stream. - -2011-12-18 18:37:08 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpeg4videoparse.h: - mpeg4videoparse: handle force key unit events - -2011-12-18 17:40:57 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: do wait for a keyframe when handling force key unit events - Although some decoders can start decoding with just PPS and SPS and waiting for - a keyframe is bad when the keyframe interval is large, gst-ffmpeg does need a - keyframe to start decoding. - -2011-12-18 17:32:11 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: unset the current PCR stream when starting a new unit - Unset the current PCR stream when starting a new unit so that afterwards a new - stream is selected as PCR and PAT and PMT tables are regenerated. - -2011-12-18 17:31:18 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: fix key unit event handling when muxing both audio and video - Take only video buffers into account when deciding when to cut so that new units - start with a video keyframe. - -2011-12-15 18:14:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - katetiger: don't unref NULL buffer - -2011-12-15 16:42:20 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusparse.c: - opus: fix bad merge (stray unmap, undeclared var) - -2011-12-15 11:11:41 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/check/Makefile.am: - tests: jifmux: re-enable jifmux's tests - Fix for its test is now available on -base module. - Enabling again. - -2011-12-15 13:47:55 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/videomeasure/gstvideomeasure_ssim.h: - videomeasure: port to GstCollectPads2 - -2011-12-15 13:39:41 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mxf/mxfmux.c: - * gst/mxf/mxfmux.h: - mxfmux: port to GstCollectPads2 - Only tested with audio, I can't get it to accept video (before - the port). - -2011-12-15 13:22:24 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: port to GstCollectPads2 - I *think* the stream lock use is correct, not 100% sure. - -2011-12-15 13:08:42 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegpsmux/mpegpsmux.h: - mpegpsmux: port to GstCollectPads2 - -2011-12-15 13:04:51 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rmixer.h: - frei0r: port to GstCollectPads2 - Untested, no sample pipeline mentioned, and I've no idea what - this plugin does, but since all the previous ports work out of - the box, this is deemed to work until evidence it doesn't. - -2011-12-15 13:02:16 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/debugutils/gstcompare.c: - * gst/debugutils/gstcompare.h: - compare: port to GstCollectPads2 - -2011-12-15 12:59:57 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfmux.h: - * gst/asfmux/gstasfobjects.h: - asfmux: port to GstCollectPads2 - -2011-12-14 17:36:55 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/dts/gstdtsdec.c: - dtsdec: avoid crashing upon draining - ... and clean up some variable init and debug statement. - -2011-12-14 08:54:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/check/elements/mpegtsmux.c: - tests: mpegtsmux: remove unused variable - -2011-12-14 08:32:50 -0300 Tommi Myöhänen <tommi.myohanen@digia.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: fix leak on error handling - Camerabin2 parses warning messages with gst_message_parse_warning(message, - &err, &debug) but doesn't free given GError and debug strings. - Documentation shows that the ownership of those fields is transferred - to caller (they are marked "transfer full" in the API docs). - -2011-12-12 15:52:20 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: check offset when retrieving table_id on malformed packets - Fix bug #665988 - -2011-12-13 10:44:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/mpegtsparse.c: - Revert "mpegtsparse: check offset when retrieving table_id on malformed packets" - This reverts commit e62978d045d57ee9fed7598c02b9017eb974ea36. - -2011-12-13 10:17:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.c: - basevideocodec: Don't use G_TYPE_REGISTER_BOXED() yet - This would require GLib 2.26. - -2011-12-12 20:01:17 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - tiger: advertise all the new YUV formats we can now use - -2011-12-12 19:34:32 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - * ext/kate/gstkatetiger.h: - tiger: replace the new YUV blitting code with the newer overlay code - -2011-12-12 14:54:00 +0100 Julien Isorce <julien.isorce@gmail.com> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: check offset when retrieving table_id on malformed packets - -2011-12-12 13:59:33 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/liveadder/liveadder.c: - liveadder: fix buffer leak - -2011-12-05 18:57:01 +0100 Matej Knopp <matej.knopp@gmail.com> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideo: Make framestate a reference counted boxed object - ...and also clear all existing frames when resetting the decoder or encoder. - -2011-12-05 18:57:01 +0100 Matej Knopp <matej.knopp@gmail.com> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideo: Make GstVideoFrame a reference counted boxed object - ...and also clear all existing frames when resetting the decoder or encoder. - -2011-12-12 10:40:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/Makefile.am: - teletextdec: Properly integrate into the build system - -2011-12-12 10:28:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/dts/Makefile.am: - dts: Add $(GST_BASE_LIBS) and CFLAGS to the build - dtsdec now uses GstAdapter, which is in libgstbase. Also reorder - CFLAGS and LIBADD. - -2011-12-11 16:07:44 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/libs/Makefile.am: - docs: fix make distcheck - Set DOC_OVERRIDES, so the -overrides.txt file which is apparently - created anyway, gets cleaned up properly. - -2011-12-11 16:05:57 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/libs/Makefile.am: - docs: minor Makefile.am clean-up - GST_BAD_CFLAGS and GST_BAD_LIBS don't exist. - -2011-12-11 15:29:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/Makefile.am: - tests: disable failing jifmux, camerabin2, and colorspace tests - jifmux: general:test_jifmux_tags:0: Assertion 'entry->components == 2' failed - camerabin2: test_multiple_video_recordings:0: gst_caps_get_structure: assertion `GST_IS_CAPS (caps) - colorspace: bad memory accesses in orc code for odd width buffers (see bug #663248) - -2011-12-11 15:03:17 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: fix g_usleep() in camerabin2 test - g_usleep() takes a microsecond value, GST_SECOND is nanoseconds, so - we were sleeping for more than 3 minutes here instead of 200ms. - -2011-12-11 00:59:15 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * po/LINGUAS: - * po/eo.po: - * po/es.po: - * po/gl.po: - * po/ky.po: - * po/lv.po: - * po/sr.po: - * po/sv.po: - po: update translations - -2011-09-25 23:57:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegpsmux/psmux.c: - * gst/mpegpsmux/psmux.h: - mpegpsmux: put stream headers into output caps - Basic version with only the system header and the program - stream map. An advanced version could include codec-specific - bits like SPS/PPS too. This is useful in connection with - e.g. multifilesink to make sure new files always start with - the stream headers. - -2011-09-16 19:32:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegpsmux/mpegpsmux.h: - mpegpsmux: add "aggregate-gops" property to aggregate GOPs into buffer lists - Useful in connection with multifilesink, for example, to make sure - the new file always starts with a keyframe. - -2011-12-10 20:08:20 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegpsmux/mpegpsmux.h: - mpegpsmux: remember primary video stream - -2011-08-31 19:40:05 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegpsmux/psmuxstream.c: - * gst/mpegpsmux/psmuxstream.h: - mpegpsmux: remember whether an incoming buffer is a keyunit or not - -2011-12-09 17:25:41 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusheader.c: - * ext/opus/gstopusparse.c: - * ext/opus/gstrtpopuspay.c: - opusenc: add upstream negotiation for multistream ability - This will help elements that cannot deal with multistream, - such as the RTP payloader. - The caps now do not include a "streams" field anymore, but - a "multistream" boolean, since we have no real use for knowing - the exact amount of streams. - https://bugzilla.gnome.org/show_bug.cgi?id=665078 - -2011-12-07 15:13:11 -0200 Danilo Cesar Lemes de Paula <danilo.cesar@collabora.co.uk> - - * ext/opus/Makefile.am: - * ext/opus/gstopus.c: - * ext/opus/gstrtpopusdepay.c: - * ext/opus/gstrtpopusdepay.h: - * ext/opus/gstrtpopuspay.c: - * ext/opus/gstrtpopuspay.h: - Adding opus RTP payloader/depayloader element - Adding OPUS RTP module based on the current draft: - http://tools.ietf.org/id/draft-spittka-payload-rtp-opus-00.txt - https://bugzilla.gnome.org/show_bug.cgi?id=664817 - -2011-12-08 19:47:55 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusheader.c: - * ext/opus/gstopusparse.c: - opus: include streams count in caps - https://bugzilla.gnome.org/show_bug.cgi?id=665078 - -2011-12-08 18:45:27 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopuscommon.c: - * ext/opus/gstopuscommon.h: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - * ext/opus/gstopusheader.c: - * ext/opus/gstopusheader.h: - * ext/opus/gstopusparse.c: - opus: properly create channel mapping tables - There are two of them, unintuitively enough; the one passed - to the encoder should not be the one that gets written to the - file. The former maps the input to an ordering which puts - paired channels first, while the latter moves the channels - to Vorbis order. So add code to calculate both, and we now - have properly paired channels where appropriate. - https://bugzilla.gnome.org/show_bug.cgi?id=665078 - -2011-12-08 22:49:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/videoparsers/Makefile.am: - videoparsers: fix LIBS order in Makefile.am - -2011-12-08 12:42:57 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: only offset timestamps when live - This code is to sync to a live source when there is a delay - between start and when we receive the first buffer, so it does - not make sense in a non live case. - This fixes playback of streams where the input timestamps are - based off some arbitrary offset. - https://bugzilla.gnome.org/show_bug.cgi?id=663756 - -2011-12-08 11:51:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: Only make the header buffer metadata writable, not the buffer - -2011-12-08 10:19:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: Fix handling of force-keyunit events - -2011-12-07 00:06:11 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/opus/gstopusdec.c: - opusdec: header cleanup - https://bugzilla.gnome.org/show_bug.cgi?id=665078 - -2011-12-07 00:06:11 -0500 Olivier Crête <olivier.crete@collabora.com> - - * ext/opus/gstopusdec.c: - opusdec: Truncate caps first - https://bugzilla.gnome.org/show_bug.cgi?id=665078 - -2011-11-28 19:47:34 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: default to stereo 48000 Hz if possible when no headers seen - https://bugzilla.gnome.org/show_bug.cgi?id=665078 - -2011-12-07 13:48:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/rsndec.c: - rsndec: Don't use the initial-identity property on autoconvert - It was removed, see bug #599469, #665205 - -2011-12-07 13:46:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautoconvert.h: - autoconvert: Remove the initial-identity property from autoconvert - Initially creating an identity element to forward serialized - events downstream before any caps are known is broken behaviour. - Serialized events should only be forwarded downstream if the - caps are already known, otherwise autopluggers and other elements - using pad-blocks will fail. - This behaviour also doesn't work anymore after basetransform - was fixed to queue serialized events until the caps are known - as a result of fixing bug #659571. - See bug #599469, #665205. - -2011-12-06 16:27:25 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/gstmpeg4videoparse.c: - videoparsers: Do not not skip startcode when needed - Fix: https://bugzilla.gnome.org/show_bug.cgi?id=665631 - -2011-12-06 08:55:19 +0800 Zhao Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: first video_packet_header doesn't start with resync_marker - -2011-12-06 08:53:07 +0800 Zhao Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: return NO_PACKET if needed - -2011-12-06 08:31:14 +0800 Zhao Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: fix an issue in check resync marker - -2011-12-06 08:25:59 +0800 Zhao Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: fix an issue in finding the last video packet in vop - -2011-12-06 08:21:19 +0800 Zhao Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: include resync marker in video packet size - -2011-12-06 08:19:05 +0800 Zhao Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: scan next resync marker after current one - -2011-12-06 08:17:38 +0800 Zhao Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: fix < 0 issue of guint in mpeg4 parser - gst_byte_reader_masked_scan_uint32 returns a guint, not a gint, which - explains the issue we sometime get using < 0 instead of == -1; - -2011-12-06 08:15:46 +0800 Zhao Halley <halley.zhao@intel.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: fix pattern/mask of resync_marker parsing of mpeg4 - -2011-12-06 13:06:06 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: handle force key unit events - Send SPS/PPS on force key unit events. Useful for example when serving HLS - without transcoding. - -2011-12-06 12:55:26 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - codecparsers: fix compile warnings in gstmpeg4parser.c - -2011-12-05 11:56:02 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * tests/check/elements/.gitignore: - * tests/check/libs/.gitignore: - tests: Add more files to .gitignore - -2011-12-05 11:50:17 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: Use faster parsing variant when input is packetized - Reduces latency and cpu usage - https://bugzilla.gnome.org/show_bug.cgi?id=665584 - -2011-12-05 11:47:57 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: Variant of _identify_nalu without checks - This is useful for cases where the caller *knows* that the provided - input contains a whole NALU and can therefore avoid: - * the expensive checks for the next start code (which won't be present) - * delaying the input parsing (since we would need the next incoming NALU - in order for the parsing code to detect the next start code) - https://bugzilla.gnome.org/show_bug.cgi?id=665584 - -2011-12-05 13:09:17 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: reflow slice nal processing - -2011-12-05 12:57:47 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: optimize slice nal processing - Only minimal slice info is needed here to determine real frame start, - so no need to parse extensively. - Fixes #665418. - -2011-12-05 12:53:59 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparser: unbreak h264 slice header parsing - .. introduced by refactoring in commit 177451c9216f4e3959e7358675fbb9731d2c81a2 - -2011-12-01 18:28:49 +0100 Edward Hervey <edward@collabora.com> - - * sys/pvr2d/gstpvr.c: - * sys/pvr2d/gstpvr.h: - * sys/pvr2d/gstpvrbufferpool.c: - * sys/pvr2d/gstpvrbufferpool.h: - * sys/pvr2d/gstpvrvideosink.c: - * sys/pvr2d/gstpvrvideosink.h: - pvr2d: Port to 0.11 - Handles GstVideoMeta and GstVideoCropMeta - Provides GstBufferPool - New GstPVRMeta to handle the wrapped PVR mem_src - -2011-12-02 17:53:23 +0100 Matej Knopp <matej.knopp@gmail.com> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: Fix reference counting of codec_data - -2011-12-05 08:56:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Implement iterate_internal_links function on the sinkpad and srcpad - -2011-11-28 19:38:34 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: guard against decoding 0 samples - https://bugzilla.gnome.org/show_bug.cgi?id=665078 - -2011-12-02 11:46:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Require XVID API >= 4.3 - This is required for encoding the simple profile - with levels 4a, 5 or 6. - Fixes bug #665378. - -2011-12-01 16:59:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - camerabin: use GstSample for the preview - -2011-12-01 10:54:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/xvid/gstxvidenc.c: - xvidenc: Don't add the profile/level to the video/x-xvid caps - -2011-12-01 09:54:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/xvid/gstxvidenc.c: - * ext/xvid/gstxvidenc.h: - xvidenc: Add profile/level to the caps and negotiate them with downstream - Still keep the profile property to select profile/level if there - are no downstream constraints. - Fixes bug #652261. - -2011-12-01 09:39:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/xvid/gstxvidenc.c: - xvidenc: Add support for levels 4a/5/6 of the simple profile - -2011-12-01 09:02:46 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: let upstream PAR override in-stream PAR - -2011-11-23 18:26:44 +0100 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: rework PAR parsing - And in the process refactor _update_src_caps a bit - -2011-11-16 00:03:12 -0500 Luciana Fujii Pontello <lucianafujii@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - h264parse: respect pixel-aspect-ratio - Parse pixel-aspect-ratio in vui information. - -2011-11-30 22:12:27 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspacescope.h: - spacespace: whitespace cleanups - -2011-11-30 22:11:40 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstwavescope.c: - * gst/audiovisualizers/gstwavescope.h: - wavescape: also add colormodes like in spacescope - -2011-11-30 15:13:04 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/README: - audiovisualizer: update README - -2011-11-30 14:20:38 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstdrawhelpers.h: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspacescope.h: - spacescope: add color-modes - In colormode we split the signal in low,mid,high frequency parts and draw them - separately into red, gree, blue color channels. - -2011-08-30 14:37:42 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/gstmotioncells.c: - * ext/opencv/gstmotioncells.h: - replace propset_mutex with GST_OBJECT_LOCK - -2011-11-25 22:32:11 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstdrawhelpers.h: - audiovisualizers: streamline the line_aa code - Have a reusable dot_aa code and reuse in the line drawing. - -2011-11-30 10:35:12 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegtsmux/Makefile.am: - mpegtsmux: fix build in uninstalled setup - Add -base libs includes to CFLAGS, fix order of LIBS. - -2011-08-21 11:01:37 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpegtsmux/Makefile.am: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * tests/check/Makefile.am: - * tests/check/elements/mpegtsmux.c: - mpegtsmux: add support for force key unit events - Handle force key unit events outputting PAT and PMT when all_headers=TRUE - -2011-11-29 23:41:22 +0100 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - opencv: allow to build against 2.3.1 - -2011-11-29 18:18:36 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - build: add old mpeg4videoparse directory to CRUFT_DIRS - -2011-11-29 19:11:22 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/Makefile.am: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * tests/examples/camerabin/Makefile.am: - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin/gst-camerabin-test.c: - * tests/examples/camerabin2/Makefile.am: - * tests/examples/camerabin2/gst-camera2.c: - * tests/examples/camerabin2/gst-camerabin2-test.c: - fix for moved interfaces - -2011-11-22 09:47:58 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: record ref_pic_list_modification(). - -2011-11-22 09:47:57 +0100 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: rename ref_pic_list_reordering() to ref_pic_list_modification(). - Upgrade to current AVC specification. - -2011-11-29 12:20:51 +0100 Alexey Fisher <bug-track@fisher-privat.net> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: recalculate adjust if difference is negative - One of my dvds jump on some position and miss about 1 minute of stream. - The reason was mpeg timestamps. On some position scr difference is negative. - It produced negative timestamps. Since it was converted to unsigned value, - gstreamer timestamps was invalid. Instead of increasing mpeg ts, - they was decreasing till it started to be positive. - The jump in timestamps caused mpeg2dec to skip frames to make QoS happy. - This patch just make diff unsigned to avoid negative values. - Signed-off-by: Alexey Fisher <bug-track@fisher-privat.net> - https://bugzilla.gnome.org/show_bug.cgi?id=656115 - -2011-11-29 12:12:33 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: Pass the all-headers field of the force-key-unit event to the subclass - -2011-11-29 12:12:04 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: Implement full support for the new force-key-unit event - Including support for the running-time and count fields. - -2011-11-29 09:31:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: Use new force-keyunit event API from gst-plugins-base - -2011-11-29 09:18:19 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: Adjusting padding is not required for -bad libraries - -2011-11-28 19:48:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: Move some fields to the private part of the instance struct - -2011-11-28 19:36:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: Make headers metadata writable before pushing downstream - The timestamp, duration, etc of the headers has to be changed. - -2011-11-28 19:35:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: Push the downstream force-keyframe event after the next keyframe - Even if the corresponding GstVideoFrame doesn't have the is_sync_point - flag set. - -2011-11-28 19:29:13 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: Don't push an upstream force-keyunit event downstream - -2011-11-25 11:48:08 +0100 Jonas Larsson <jonas@hallerud.se> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: Add initial support for the all-headers field of the force-keyframe event - See bug #607742. - -2011-11-29 09:22:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - kate: fix set-but-not-used-variable compiler warning - gstkatetiger.c:1156:15: error: variable 'height' set but not used - gstkatetiger.c:1156:8: error: variable 'width' set but not used - -2011-11-29 09:15:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - * gst-libs/gst/codecparsers/gstmpeg4parser.h: - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: minor fixes - Const-ify one more VLC table. Fix spelling of 'hybrid'. - No need to explicitly call ensure_debug_category() everywhere, - that will be done automatically from GST_LOG() and friends - via GST_CAT_DEFAULT. - -2011-11-08 10:44:11 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - * gst-libs/gst/codecparsers/gstmpeg4parser.h: - * gst/videoparsers/gstmpeg4videoparse.c: - codecparser: mpeg4: Look for resync code in _mpeg4_parse - This way the API is simpler and users can call 1 single function for packet - detection. - -2011-09-29 14:37:59 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpeg4videoparse.h: - mpeg4videoparse: Properly handle profile and level in caps - Fix #660234 - -2011-09-26 16:58:58 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpeg4videoparse.h: - * gst/videoparsers/mpeg4parse.c: - * gst/videoparsers/mpeg4parse.h: - mpeg4videoparse: Port to the new mpeg4parser library - -2011-09-26 10:39:31 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * configure.ac: - * gst/mpeg4videoparse/Makefile.am: - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstmpeg4videoparse.c: - * gst/videoparsers/gstmpeg4videoparse.h: - * gst/videoparsers/mpeg4parse.c: - * gst/videoparsers/mpeg4parse.h: - * gst/videoparsers/plugin.c: - mpeg4videoparse: Move to the videoparsers plugin - Rename a few variables to use the same convention as others elements in this - plugin - Conflicts: - gst/videoparsers/gstmpeg4videoparse.c - -2011-11-02 09:14:42 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: Declare private arrays as static all around - -2011-09-21 19:49:36 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/gstmpeg4parser.c: - * gst-libs/gst/codecparsers/gstmpeg4parser.h: - codecparsers: mpeg4: Implement an Mpeg4 part 2 parsing library - -2011-09-21 19:40:47 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/parserutils.c: - * gst-libs/gst/codecparsers/parserutils.h: - codecparsers: Move shared code to a parser utils file - -2011-09-29 16:25:29 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * pkgconfig/gstreamer-plugins-bad.pc.in: - pkgconfig: remove references to codecparsers from -bad.pc.in - -2011-11-28 23:20:58 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - Merge remote-tracking branch 'origin/master' into 0.11 - -2011-11-28 23:20:32 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - Merge commit '7521b597f4dc49d8d168f368f0e7ebaf98a72156' into 0.11 - -2011-11-28 23:20:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - Merge commit '26d6add9457f00ce8ec13844368466f0e3816e5d' into 0.11 - Conflicts: - ext/rtmp/gstrtmpsink.c - -2011-11-28 18:47:50 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstviewfinderbin.c: - camerabin2: viewfinderbin: use faster cast macro - Use cast macro without type checks when we know it should work. - -2011-11-28 18:43:40 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstviewfinderbin.c: - camerabin2: viewfinderbin: Link elements directly to use faster version - ffmpegcolorspace and videoscale should always link successfully, use - the fast pad linking version instead of calling the generic helper - function. - -2011-11-28 16:35:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/gstcamerabin2.c: - camerabin2: micro optimize linking some more - -2011-09-29 22:43:30 +0100 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * ext/kate/gstkatetiger.c: - * ext/kate/gstkatetiger.h: - kate: support for rendering on several YUV formats - This speeds up rendering a fair bit by not requiring colorspace - conversion, whether there is anything to overlay or not. - The blending code was nicked from textoverlay. I would think - this might be a helpful thing to put in, say, libgstvideo at - some point. - https://bugzilla.gnome.org/show_bug.cgi?id=660528 - -2011-08-18 11:39:37 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4parse.c: - mpeg4videoparse: fix number of bytes read for fixed time increment - The spec I found says "16 bits". - The existing code used log2(somevalue)+1. - ffmpeg uses log2(somevalue-1)+1. - The code now uses log2(somevalue-1)+1, and this makes it work with - some sample video without breaking another sample. - Now, I'm far from certain I've got the right spec, I found it by - searching the internet, so... - https://bugzilla.gnome.org/show_bug.cgi?id=654666 - -2011-11-28 15:10:39 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - mpegdemux: Try to add all streams early - This will allow us to signal no-more-pads to avoid hitting - the decodebin2 overrun. - -2011-09-26 12:43:27 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: handle pads with no data - Some streams declare PIDs but will not send data for them. - Ensure we time out on those, and both send new segments to - keep their time synchronized with the rest, and do not wait - forever before deciding to signal no-more-pads. - https://bugzilla.gnome.org/show_bug.cgi?id=659924 - -2011-09-26 12:16:30 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - mpegtsdemux: signal no-more-pads when appropriate - We track streams for which a data callback is set (and for which - pads will be added only when data is received), and signal - no-more-pads when the last pad is added. - https://bugzilla.gnome.org/show_bug.cgi?id=659924 - -2011-09-05 17:40:07 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - mpegdemux: take into account offset of first buffer - This fixes playback when the source starts later than the playback - pipeline, and when a source drops for a while then restarts. - https://bugzilla.gnome.org/show_bug.cgi?id=657794 - -2011-09-03 14:37:40 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegdemux: fix some more video freezing - There was a second threshold, which apparently needs to be smaller - than the first, though I'm not certain of it as I don't understand - yet this nest of wtf that is the mpeg demuxer timing logic. - Fixes video freezing on one (corrupted) MPEG sample. It would - previously never think it was out of the discontinuity, and would - push buffers with no timestamp. - Now this took me more than a day's poking at the thing, for just - one constant change, and I'm scared to have to touch this again :S - https://bugzilla.gnome.org/show_bug.cgi?id=655804 - -2011-08-30 14:50:52 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - mpegdemux: catch smaller PTS dicontinuities - In a test stream, I get one buffer with a PTS of about 15 seconds - in the future compared to the previous one, and next buffers with - timestamps continuing where the original ones left off. - This caused the sink to wait 15 seconds to display the frame while - more frames queued up, and then dump all the subsequent frames as - they "arrived too late". - Maybe that threshold should be made configurable, but for now, - make it more smaller to catch more of these. - https://bugzilla.gnome.org/show_bug.cgi?id=655804 - Non AV streams keep using the larger threshold (10 minutes), as - subtitles may arrive only every so often. - -2011-11-28 13:08:27 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/apexsink/gstapexsink.c: - * ext/arts/gst_arts.c: - * ext/artsd/gstartsdsink.c: - * ext/assrender/gstassrender.c: - * ext/audiofile/gstafparse.c: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsrc.c: - * ext/audioresample/gstaudioresample.c: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2enc.c: - * ext/celt/gstceltdec.c: - * ext/celt/gstceltenc.c: - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstcogdownsample.c: - * ext/cog/gstcogmse.c: - * ext/cog/gstcogscale.c: - * ext/cog/gstcolorconvert.c: - * ext/cog/gstlogoinsert.c: - * ext/curl/gstcurlsink.c: - * ext/dc1394/gstdc1394.c: - * ext/dirac/gstdiracdec.cc: - * ext/dirac/gstdiracenc.cc: - * ext/directfb/dfbvideosink.c: - * ext/divx/gstdivxdec.c: - * ext/divx/gstdivxenc.c: - * ext/dts/gstdtsdec.c: - * ext/faac/gstfaac.c: - * ext/faad/gstfaad.c: - * ext/flite/gstflitetestsrc.c: - * ext/gme/gstgme.c: - * ext/gsettings/gstswitchsink.c: - * ext/gsettings/gstswitchsrc.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmenc.c: - * ext/hermes/gsthermescolorspace.c: - * ext/jp2k/gstjasperdec.c: - * ext/jp2k/gstjasperenc.c: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatetiger.c: - * ext/lcs/gstcolorspace.c: - * ext/libfame/gstlibfame.c: - * ext/libmms/gstmms.c: - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - * ext/modplug/gstmodplug.cc: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mplex/gstmplex.cc: - * ext/musepack/gstmusepackdec.c: - * ext/musicbrainz/gsttrm.c: - * ext/mythtv/gstmythtvsrc.c: - * ext/nas/nassink.c: - * ext/neon/gstneonhttpsrc.c: - * ext/openal/gstopenalsink.c: - * ext/openal/gstopenalsrc.c: - * ext/opencv/gstcvequalizehist.c: - * ext/opencv/gstcvlaplace.c: - * ext/opencv/gstcvsobel.c: - * ext/opencv/gstedgedetect.c: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstmotioncells.c: - * ext/opencv/gstpyramidsegment.c: - * ext/opencv/gsttemplatematch.c: - * ext/opencv/gsttextoverlay.c: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusenc.c: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/rsnaudiomunge.c: - * ext/resindvd/rsndec.c: - * ext/resindvd/rsnparsetter.c: - * ext/resindvd/rsnstreamselector.c: - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgoverlay.c: - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsrc.c: - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/sdl/sdlaudiosink.c: - * ext/sdl/sdlvideosink.c: - * ext/shout/gstshout.c: - * ext/snapshot/gstsnapshot.c: - * ext/sndfile/gstsfsink.c: - * ext/sndfile/gstsfsrc.c: - * ext/soundtouch/gstpitch.cc: - * ext/spandsp/gstspanplc.c: - * ext/spc/gstspc.c: - * ext/swfdec/gstswfdec.c: - * ext/teletextdec/gstteletextdec.c: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxvidenc.c: - * ext/zbar/gstzbar.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst/adpcmdec/adpcmdec.c: - * gst/adpcmenc/adpcmenc.c: - * gst/aiff/aiffmux.c: - * gst/aiff/aiffparse.c: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfparse.c: - * gst/asfmux/gstrtpasfpay.c: - * gst/audiobuffer/gstaudioringbuffer.c: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstwavescope.c: - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautovideoconvert.c: - * gst/bayer/gstbayer2rgb.c: - * gst/bayer/gstrgb2bayer.c: - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/gstinputselector.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/cdxaparse/gstcdxaparse.c: - * gst/cdxaparse/gstvcdparse.c: - * gst/chart/gstchart.c: - * gst/coloreffects/gstchromahold.c: - * gst/coloreffects/gstcoloreffects.c: - * gst/colorspace/gstcolorspace.c: - * gst/dataurisrc/gstdataurisrc.c: - * gst/dccp/gstdccpclientsink.c: - * gst/dccp/gstdccpclientsrc.c: - * gst/dccp/gstdccpserversink.c: - * gst/dccp/gstdccpserversrc.c: - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/gstchecksumsink.c: - * gst/debugutils/gstchopmydata.c: - * gst/debugutils/gstcompare.c: - * gst/debugutils/gstdebugspy.c: - * gst/dtmf/gstdtmfdetect.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/faceoverlay/gstfaceoverlay.c: - * gst/festival/gstfestival.c: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/freeze/gstfreeze.c: - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rsrc.c: - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstsolarize.c: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/h264parse/gsth264parse.c: - * gst/hdvparse/gsthdvparse.c: - * gst/hls/gsthlsdemux.c: - * gst/id3tag/gstid3mux.c: - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosrc.c: - * gst/interlace/gstinterlace.c: - * gst/ivfparse/gstivfparse.c: - * gst/jp2kdecimator/gstjp2kdecimator.c: - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - * gst/legacyresample/gstlegacyresample.c: - * gst/librfb/gstrfbsrc.c: - * gst/liveadder/liveadder.c: - * gst/mixmatrix/mixmatrix.c: - * gst/mpeg1sys/gstmpeg1systemencode.c: - * gst/mpeg4videoparse/mpeg4videoparse.c: - * gst/mpegdemux/mpegtsparse.c: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegvideoparse/mpegvideoparse.c: - * gst/mve/gstmvedemux.c: - * gst/mve/gstmvemux.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmux.c: - * gst/nsf/gstnsf.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/overlay/gstoverlay.c: - * gst/patchdetect/gstpatchdetect.c: - * gst/pcapparse/gstirtspparse.c: - * gst/pcapparse/gstpcapparse.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - * gst/rawparse/gstrawparse.c: - * gst/real/gstrealaudiodec.c: - * gst/real/gstrealvideodec.c: - * gst/removesilence/gstremovesilence.c: - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - * gst/rtpvp8/gstrtpvp8depay.c: - * gst/rtpvp8/gstrtpvp8pay.c: - * gst/scaletempo/gstscaletempo.c: - * gst/sdi/gstsdidemux.c: - * gst/sdi/gstsdimux.c: - * gst/sdp/gstsdpdemux.c: - * gst/segmentclip/gstaudiosegmentclip.c: - * gst/segmentclip/gstvideosegmentclip.c: - * gst/siren/gstsirendec.c: - * gst/siren/gstsirenenc.c: - * gst/smooth/gstsmooth.c: - * gst/speed/gstspeed.c: - * gst/subenc/gstsrtenc.c: - * gst/subenc/gstwebvttenc.c: - * gst/tta/gstttadec.c: - * gst/tta/gstttaparse.c: - * gst/vbidec/gstvbidec.c: - * gst/videodrop/gstvideodrop.c: - * gst/videofilters/gstvideofilter2.c: - * gst/videomaxrate/videomaxrate.c: - * gst/videomeasure/gstvideomeasure_collector.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videosignal/gstvideoanalyse.c: - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideomark.c: - * gst/vmnc/vmncdec.c: - * gst/y4m/gsty4mdec.c: - * sys/acmenc/acmenc.c: - * sys/acmmp3dec/acmmp3dec.c: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/celvideosrc.c: - * sys/applemedia/miovideosrc.c: - * sys/applemedia/qtkitvideosrc.m: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - * sys/applemedia/vth264decbin.c: - * sys/applemedia/vth264encbin.c: - * sys/avc/gstavcsrc.cpp: - * sys/d3dvideosink/d3dvideosink.c: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directsound/gstdirectsoundsrc.c: - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dxr3/dxr3audiosink.c: - * sys/dxr3/dxr3spusink.c: - * sys/dxr3/dxr3videosink.c: - * sys/fbdev/gstfbdevsink.c: - * sys/linsys/gstlinsyssdisink.c: - * sys/linsys/gstlinsyssdisrc.c: - * sys/osxvideo/osxvideosrc.c: - * sys/qcam/gstqcamsrc.c: - * sys/qtwrapper/audiodecoders.c: - * sys/qtwrapper/videodecoders.c: - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsrc.c: - * sys/vcd/vcdsrc.c: - * sys/vdpau/gstvdp/gstvdpdecoder.c: - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/wininet/gstwininetsrc.c: - * sys/winks/gstksvideosrc.c: - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.c: - * tests/check/elements/autoconvert.c: - * tests/check/elements/baseaudiovisualizer.c: - * tools/element-templates/sinkpad: - * tools/element-templates/sinkpad-simple: - * tools/element-templates/srcpad: - * tools/element-templates/srcpad-simple: - various: fix pad template ref leaks - https://bugzilla.gnome.org/show_bug.cgi?id=662664 - -2011-10-06 17:43:19 +0200 Julien Isorce <julien.isorce@gmail.com> - - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsrc.c: - rtmp: add WSAStartup and WSACleanup on Win32 - https://bugzilla.gnome.org/show_bug.cgi?id=661098 - -2011-11-27 20:24:39 +0100 Matej Knopp <matej.knopp@gmail.com> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth264parse.c: - videoparsers: fix format warnings - https://bugzilla.gnome.org/show_bug.cgi?id=662618 - -2011-11-27 23:33:45 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - Merge remote-tracking branch 'origin/master' into 0.11 - -2011-11-24 13:49:12 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/aiff/Makefile.am: - * gst/aiff/aiff.c: - * gst/aiff/aiffparse.c: - * gst/aiff/aiffparse.h: - aiffparse: extract ID3 tags embedded in ID3 chunks - https://bugzilla.gnome.org/show_bug.cgi?id=664725 - -2011-11-26 15:37:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - Merge remote-tracking branch 'origin/master' into 0.11 - Conflicts: - ext/opus/gstopusdec.c - ext/opus/gstopusparse.c - gst-libs/gst/video/gstbasevideodecoder.c - gst-libs/gst/video/gstbasevideodecoder.h - -2011-11-25 23:11:32 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstopencvutils.c: - * ext/opencv/gstopencvvideofilter.c: - opencv: port baseclass to 0.11 - -2011-11-25 11:41:19 -0200 Danilo Cesar Lemes de Paula <danilo.cesar@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusenc.c: - opusenc: Fixing "Unused var" compiling error for opus codec - https://bugzilla.gnome.org/show_bug.cgi?id=664815 - -2011-11-25 14:00:18 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusheader.c: - opusenc: only use mono streams for > 2 channels - I'm getting odd results with packing streams into stereo - streams, and using only mono streams is enough in all cases. - -2011-11-25 12:47:42 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopuscommon.c: - * ext/opus/gstopuscommon.h: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusenc.c: - opus: add some more debug information about channel mapping - -2011-11-25 12:46:55 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusparse.c: - opusparse: remove dead assigments - We now only keep a ref to the headers for later reuse. - -2011-11-25 12:40:31 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: do not cause the decoder to apply the channel mapping again - Since we already reorder channels, we do not want to write that - reordering in the header, or the decoder will do it again. - -2011-11-25 12:39:20 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: fix bogus assertion - -2011-11-25 15:49:05 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/voamrwbenc.c: - tests: add unit test for voamrwbenc - -2011-11-25 12:48:58 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - Merge remote-tracking branch 'origin/master' into 0.11 - Conflicts: - ext/faac/gstfaac.c - ext/opus/gstopusdec.c - ext/opus/gstopusenc.c - gst/audiovisualizers/gstspacescope.c - gst/colorspace/colorspace.c - -2011-11-25 11:37:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: some more debug logging - -2011-11-25 11:36:14 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - vp8dec: use new basevideodecoder API to drop frames and get QoS messages posted - -2011-11-23 20:03:32 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: add API to drop a frame and post a QoS message on the bus - https://bugzilla.gnome.org/show_bug.cgi?id=640017 - API: gst_base_video_decoder_drop_frame() - -2011-08-30 23:39:36 -0300 Luciana Fujii Pontello <luciana.fujii@collabora.co.uk> - - * configure.ac: - * sys/Makefile.am: - * sys/pvr2d/Makefile.am: - * sys/pvr2d/gstpvr.c: - * sys/pvr2d/gstpvr.h: - * sys/pvr2d/gstpvrbufferpool.c: - * sys/pvr2d/gstpvrbufferpool.h: - * sys/pvr2d/gstpvrvideosink.c: - * sys/pvr2d/gstpvrvideosink.h: - * sys/pvr2d/pvr_includes/dri2_ws.h: - * sys/pvr2d/pvr_includes/img_defs.h: - * sys/pvr2d/pvr_includes/img_types.h: - * sys/pvr2d/pvr_includes/pvr2d.h: - * sys/pvr2d/pvr_includes/services.h: - * sys/pvr2d/pvr_includes/servicesext.h: - * sys/pvr2d/pvr_includes/wsegl.h: - Add pvrvideosink element - PVRVideoSink uses PVR2D library to blit images. - Author: Alessandro Decina <alessandro.decina@collabora.co.uk> - Author: Luciana Fujii <luciana.fujii@collabora.co.uk> - -2011-11-24 21:52:55 +0100 René Stadler <rene.stadler@collabora.co.uk> - - * tests/check/elements/parser.c: - tests: fix caps usage in parser test helper - Fixes previous commit; users can call this with NULL caps. - -2011-11-24 21:42:39 +0100 René Stadler <rene.stadler@collabora.co.uk> - - * tests/check/elements/asfmux.c: - * tests/check/elements/autoconvert.c: - * tests/check/elements/baseaudiovisualizer.c: - * tests/check/elements/legacyresample.c: - * tests/check/elements/parser.c: - * tests/check/elements/vp8dec.c: - * tests/check/elements/vp8enc.c: - tests: update for gstcheck API change - -2011-11-24 19:03:23 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/README: - * gst/audiovisualizers/gstdrawhelpers.h: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstwavescope.c: - audiovisualizers: add aa-line code and user for wave/space-scope - -2011-11-24 13:38:59 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusheader.c: - opus: pre-skip and output gain are little endian, remove reminder note - -2011-11-24 13:29:56 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/Makefile.am: - * ext/opus/gstopuscommon.c: - * ext/opus/gstopuscommon.h: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - * ext/opus/gstopusheader.c: - * ext/opus/gstopusheader.h: - * ext/opus/gstopusparse.c: - * ext/opus/gstopusparse.h: - opus: multichannel support - -2011-11-23 17:49:58 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - opus: switch to multistream API - It's very similar to the basic API, and is a superset ot it, - which will allow encoding and decoding more than 2 channels. - -2011-11-23 17:32:03 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: shuffle supported sample rates to favor 48000 - -2011-11-23 16:36:54 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - opusenc: remove useless setup field - -2011-11-24 12:01:48 +0100 René Stadler <rene.stadler@collabora.co.uk> - - * configure.ac: - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/h263parse.c: - videoparsers: port to 0.11 - Unit tests missing for now. - -2011-11-24 11:59:19 +0100 René Stadler <rene.stadler@collabora.co.uk> - - * gst-libs/gst/Makefile.am: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - basecamerasrc: port to 0.11 - Only to fix the build really (gtk-doc is trying to pick up the unbuildable - lib). Not tested at all (but pretty trivial case anyways). - -2011-11-02 13:25:56 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/colorspace/colorspace.c: - colorspace: fix width/height mismatches - https://bugzilla.gnome.org/show_bug.cgi?id=663238 - -2011-11-24 10:26:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: Use the sinkpad template caps as a fallback, not the srcpad ones - -2011-11-24 10:14:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream - -2011-11-24 10:09:59 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gsth263parse.c: - h263parse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream - -2011-11-24 10:08:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gstdiracparse.c: - diracparse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream - -2011-11-24 10:04:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: Implement ::get_sink_caps vfunc to propagate downstream caps constraints upstream - -2011-11-24 01:56:07 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/neon/gstneonhttpsrc.c: - neonhttpsrc: remove iradio-* properties - Should send tags instead. - -2011-11-24 01:52:36 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - neonhttpsrc: unconditionally send icecast request header, remove iradio-mode property - -2011-11-24 01:22:13 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/libmms/gstmms.c: - * ext/libmms/gstmms.h: - mmssrc: make connection-speed property a guint64 - Even if the library limits it to an int. - -2011-11-24 00:56:45 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: update for gstrtpbin -> rtpbin renaming - -2011-11-23 23:42:41 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/faac/gstfaac.c: - * ext/rtmp/gstrtmpsink.c: - faac, rtmp: more printf format fixes in debug messages - https://bugzilla.gnome.org/show_bug.cgi?id=662618 - -2011-11-21 22:45:15 +0100 Matej Knopp <matej.knopp@gmail.com> - - * configure.ac: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/y4m/gsty4mdec.c: - Fix printf format compiler warnings on OS X / 64 bit - https://bugzilla.gnome.org/show_bug.cgi?id=662618 - -2011-11-23 23:30:00 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: do not leak buffer when no encoded data yet or encoding error - -2011-11-23 23:29:10 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/dts/Makefile.am: - * ext/dts/gstdtsdec.c: - * ext/dts/gstdtsdec.h: - dtsdec: port to audiodecoder - -2011-11-23 16:01:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/smooth/gstsmooth.c: - smooth: fix printf format compiler warning in debug message - https://bugzilla.gnome.org/show_bug.cgi?id=664631 - -2011-11-23 13:47:11 +0100 Krzysztof Krakowiak <krzysztof.krakowiak@gmail.com> - - * ext/modplug/gstmodplug.cc: - modplug: fix modules playing as mono instead of stereo - replaced broken if-return logic for fixating rate and number - of channels that caused that modules were always (after - successful fixation of rate) played as mono (instead of - stereo) by correct one with appropiate warnings. - https://bugzilla.gnome.org/show_bug.cgi?id=619035 - -2011-11-23 13:22:12 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - opusdec: implement replay gain - It would ideally be better to leave this to a rgvolume element, - but we don't control the pipeline. So do it by default, and allow - disabling it via a property, so the correct volume should always - be output. - -2011-11-23 11:58:54 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - opusdec: add in-band FEC support - This allows reconstruction of lost packets if FEC info is included - in the next packet, at the cost of extra latency. Since we do not - know if the stream has FEC (and this can change at runtime), we - always incur the latency, even if we never lose any frame, or see - any FEC information. Off by default. - -2011-11-23 12:41:32 +0100 René Stadler <rene.stadler@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - frei0r: normalize boolean property default values to TRUE/FALSE - Glib barks at us with a warning when we pass e.g. 4. - -2011-11-23 11:59:42 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * pkgconfig/gstreamer-basevideo-uninstalled.pc.in: - pkgconfig: aaand fix my last commit - -2011-11-23 11:55:06 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * pkgconfig/gstreamer-basevideo-uninstalled.pc.in: - pkgconfig: Fix gstreamer-basevideo-uninstalled.pc.in - -2011-11-23 11:31:44 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/README: - * gst/audiovisualizers/gstdrawhelpers.h: - audiovisualizers: update README and TODO comments - -2011-11-23 11:21:15 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspacescope.h: - spacescope: use the drawhelpers and add a draw-style property - Like in wavescope support drawing dots and lines. - -2011-11-23 11:08:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - Conflicts: - ext/opus/gstopusdec.c - ext/opus/gstopusenc.c - ext/opus/gstopusparse.c - gst/audiovisualizers/gstwavescope.c - gst/filter/Makefile.am - gst/filter/gstfilter.c - gst/filter/gstiir.c - gst/playondemand/gstplayondemand.c - -2011-11-23 08:40:49 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/Makefile.am: - * gst/audiovisualizers/gstdrawhelpers.h: - * gst/audiovisualizers/gstwavescope.c: - audiovisualizers: add some simple drawing helpers for reuse - Add a (uninstalled) header with simple drawing macros - -2011-11-23 08:17:05 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/smoothwave/Makefile.am: - * gst/smoothwave/README: - * gst/smoothwave/gstsmoothwave.c: - * gst/smoothwave/gstsmoothwave.h: - smoothwave: remove element unported from 0.8 - The wavescope element does achieve the same effect. - -2011-11-23 08:14:38 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/audiovisualizers/gstwavescope.c: - * gst/audiovisualizers/gstwavescope.h: - wavescope: add a style property for drawing modes - Add a style enum of { dots, lines}. Now this elements is a superset of smoothwave. - -2011-11-22 23:04:49 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - docs: fix comment in gst_base_video_decoder_get_max_decode_time() docs - -2011-11-22 20:27:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: mark properties changeable at runtime with GST_PARAM_MUTABLE_PLAYING - -2011-11-22 19:57:07 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: fix weird event list handling - Get rid of weird code that copies a list manually, taking - ownership of the elements and then frees the old list. Instead, - just take over the old list entirely. (If the intent was to - reverse the list, one could use g_list_reverse() instead). - Then, push events in the list out from last to first (since they - were prepended as they came in) instead of just pushing out the - last in the list and leaking the others. - -2011-11-22 18:33:17 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/opus.c: - opus: add test - -2011-11-22 17:04:09 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - opusenc: allow setting most properties at PLAYING time - Opus allows these to be changed during encoding, transparently - to the decoder. - -2011-11-22 16:14:06 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: bound the bitrate to more sensible values - Go from the bounds mentioned in the spec, and allow some more - variation. - In particular, don't allow silly low bitrates, and allow reaching - the maximum useful bitrate. - -2011-11-22 15:33:20 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - opusenc: fix crash on pathological parameters - Asking for 1 bit/s would select a 0 byte buffer, leading - to a crash. Buffer size is now controlled by a max-payload-size - property, which can't be less than 2. - -2011-11-21 18:12:00 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusparse.c: - opusparse: do not send headers through data path - Additionally, since Opus packets may change between stereo - and mono as the encoder sees fit, assume two channels when - we do not see a header, and use the header value otherwise. - -2011-11-21 17:48:54 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusheader.c: - * ext/opus/gstopusheader.h: - opus: move header magic testing to gstopusheader - -2011-11-21 17:01:49 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: skip pre-skip samples - -2011-11-21 12:50:22 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - opusdec: read pre-skip from first header if available - -2011-11-17 11:33:56 +0100 Sebastian Pölsterl <sebp@k-d-w.org> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: support more character set encodings - Support UTF-16BE, EUC-KR (KSX1001), GB2312 and ISO-10646/UTF8 text - encoding and fixed new line for multibyte encoding - https://bugzilla.gnome.org/show_bug.cgi?id=664257 - -2011-11-22 09:11:35 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/playondemand/.gitignore: - * gst/playondemand/Makefile.am: - * gst/playondemand/demo-mp3.c: - * gst/playondemand/filter.func: - * gst/playondemand/gstplayondemand.c: - * gst/playondemand/gstplayondemand.h: - playondemand: remove unported plugin from 0.8 - These days one would do the effect e.g. using gnonlin. - -2011-11-22 09:10:32 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/speed/gstspeed.c: - speed: tiny doc blob clarification - -2011-11-21 22:55:40 +0100 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - * gst/freeverb/Makefile.am: - * gst/freeverb/gstfreeverb.c: - * gst/freeverb/gstfreeverb.h: - freeverb: add a freeverb port - Freeverb is a public domain reverb implementation. Port it as a gstreamer - element and make use of gstreamer specific features (gap aware, disconts, - controller, ...). - -2011-11-21 13:37:20 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst/mpegtsdemux/mpegtsbase.c: - update for activation changes - -2011-11-21 12:02:28 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: reset tagsetter interface on stop - -2011-11-21 11:44:01 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: handle NULL packets (used for PLC) - -2011-11-21 11:28:10 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: light cleanup - -2011-11-20 13:07:27 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusparse.c: - opusparse: parse raw opus packets - -2011-11-20 09:58:06 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: do not push header buffers - Opus headers appear only when muxed in Ogg, so only place them - on the caps, where oggmux will find them, but other elements will - be blithely unaware of them. - -2011-11-20 09:52:46 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/Makefile.am: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusheader.c: - * ext/opus/gstopusheader.h: - * ext/opus/gstopusparse.c: - * ext/opus/gstopusparse.h: - opus: make opusparse set headers on caps - Header-on-caps code moved to a new shared location to avoid - duplicating the code. - -2011-11-21 10:54:56 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/gme/gstgme.c: - gme: Port to new pad function signatures - -2011-11-21 08:20:14 +0100 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - * gst/smooth/Makefile.am: - * gst/smooth/gstsmooth.c: - * gst/smooth/gstsmooth.h: - smooth: port to 0.10 - Port from GstElement to GstVideoFilter. Fix FIXMEs. Cleanup naming. Expose left - out property (kuma-only). - -2011-11-20 20:16:03 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/passthrough/.gitignore: - * gst/passthrough/Makefile.am: - * gst/passthrough/filter.func: - * gst/passthrough/gstpassthrough.c: - * gst/passthrough/gstpassthrough.h: - * gst/passthrough/passthrough.vcproj: - passthrough: remove obsolete element - It is not built by default. We have identity for some of the needs and otherwise - audio/videofilter base classes. - -2011-11-20 20:08:47 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/filter/Makefile.am: - * gst/filter/filter.vcproj: - * gst/filter/gstfilter.c: - * gst/filter/gstfilter.h: - * gst/filter/gstiir.c: - * gst/filter/gstiir.h: - * gst/filter/iir.c: - * gst/filter/iir.h: - filter: remove filter plugin - We don't build it anyway and we have audioiirfilter in good. - -2011-11-20 20:06:29 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/inter/gstinter.c: - * gst/inter/gstintersurface.c: - inter: fix leftover boilerplace comments - -2011-11-18 03:31:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Also reset video/audio filters before capturing - Video and audio custom filter element should also be reset before - starting a new capture, otherwise we get wrong-state errors - -2011-11-19 15:58:09 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: fix terminating NUL being written in signature - -2011-11-16 19:40:20 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: make frame-size an enum - It only supports a set number of specific values (including - a non integer one). - -2011-11-16 19:22:44 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: the encoder might not make use of all the bytes - -2011-11-18 19:28:26 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstmotioncells.c: - opencv: use caps constants more - -2011-11-18 19:19:32 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstpyramidsegment.c: - * ext/opencv/gsttemplatematch.c: - opencv: fixup doc blobs - -2011-11-18 19:15:26 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstedgedetect.c: - * ext/opencv/gstedgedetect.h: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfaceblur.h: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstfacedetect.h: - * ext/opencv/gstmotioncells.c: - * ext/opencv/gstmotioncells.h: - * ext/opencv/gstopencv.c: - * ext/opencv/gstpyramidsegment.c: - * ext/opencv/gstpyramidsegment.h: - * ext/opencv/gsttemplatematch.c: - * ext/opencv/gsttemplatematch.h: - opencv: fixup gobject naming conventions - -2011-11-18 17:59:47 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - update for new scheduling query - -2011-11-18 17:18:01 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: remove redundant code - ... now that what should not be needed is really not needed anymore to cover - up bogus stuff that has been FIXMEd. - -2011-11-18 12:32:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix up AU collection processing - On the one hand, no need to collect nal if processing last one. - On the other hand, ensure AU collection processing to have sufficient - next NAL data in normal cases. - Fixes #663180. - -2011-11-18 15:12:46 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: mind to-be-skipped data in subsequent re-used offsets - -2011-11-18 15:10:57 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: avoid additional NAL parsing if no AU collection is needed - -2011-11-18 15:10:25 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: some more get_caps tweaking - ... by having it use sink template rather than src template, and not - passing an downstream parsed(=true) to upstream. - -2011-11-18 15:07:01 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: initialize additional sps field value - Fixes #663552. - -2011-11-18 13:58:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst/mpegtsdemux/mpegtsbase.c: - add parent to activate functions - -2011-11-18 12:38:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.h: - fix for scheduling mode rename - -2011-11-18 08:29:31 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstcvdilateerode.c: - * ext/opencv/gstcvequalizehist.c: - * ext/opencv/gstcvsmooth.c: - * ext/opencv/gstcvsobel.c: - opencv: remove empty finalize implementations - -2011-11-17 23:03:05 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/voamrwbenc/Makefile.am: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/voamrwbenc/gstvoamrwbenc.h: - voamrwbenc: port to audioencoder - -2011-11-17 23:02:55 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: some code shuffle cleanup - -2011-11-17 23:02:39 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/voaacenc/Makefile.am: - * ext/voaacenc/gstvoaacenc.c: - * ext/voaacenc/gstvoaacenc.h: - voaacenc: port to audioencoder - -2011-11-17 23:02:31 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/celt/gstceltenc.c: - celtenc: properly report error case - -2011-11-17 23:02:17 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/celt/gstceltdec.h: - celtdec: remove unused instance variable - -2011-11-17 10:33:42 -0800 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: Only call ::reset once in READY->PAUSED - -2011-11-17 17:32:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - Conflicts: - ext/celt/gstceltdec.c - ext/opus/gstopusdec.c - ext/opus/gstopusdec.h - ext/opus/gstopusenc.c - ext/opus/gstopusenc.h - ext/opus/gstopusparse.c - -2011-11-17 15:53:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/sdp/gstsdpdemux.c: - * gst/y4m/gsty4mdec.c: - add parent to pad functions - -2011-11-17 10:07:34 +0100 Stefan Sauer <ensonic@users.sf.net> - - * docs/libs/Makefile.am: - libs-docs: add -DGST_USE_UNSTABLE_API - -2011-11-17 09:56:34 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/gme/gstgme.c: - gme: port for pad_query api change - -2011-11-17 08:25:28 +0100 Stefan Sauer <ensonic@users.sf.net> - - * gst/asfmux/gstasfmux.c: - * gst/debugutils/gstcompare.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mxf/mxfmux.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - collectpads: port API changes - -2011-11-16 20:53:13 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstfacedetect.h: - facedetect: detect face features - Also detect mouth, nose and eyes. Drop faces that don't have them. Fixes leaking the - cascades. Adds more docs. - -2011-11-16 20:51:27 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstfacedetect.h: - facedetect: Gstfacedetect -> GstFacedetect - -2011-11-14 11:05:44 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/opencv/gstfacedetect.c: - facedetect: code maintenance - Update example to be useful. Draw colored ellipses instead of unicolor circles. - Reflow code for more local variables. Improve parameter descriptions. - -2011-11-16 10:57:55 -0800 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: Change rank to PRIMARY+1 - -2011-11-16 10:45:52 -0800 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: Don't require parsed=false on the sinkpad caps - -2011-11-16 18:49:03 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: do not include variable fields in caps - Those can vary from one packet to the next, so have no reason - to be in the caps. - -2011-11-16 18:43:53 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: fix constrained-vbr property name typo - -2011-11-16 10:38:49 -0800 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: Implement ::sink_get_caps to allow stream-format conversion again - Just proxying the downstream caps will prevent h264parse from - accepting a different stream-format than what is supported - downstream, although it could convert to a different stream-format. - -2011-11-16 18:35:29 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - opusdec: let the base class handle all timing - -2011-11-16 19:18:50 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/celt/gstceltdec.c: - * ext/celt/gstceltdec.h: - celtdec: port to audiodecoder - -2011-11-16 19:11:24 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/celt/Makefile.am: - * ext/celt/gstceltenc.c: - * ext/celt/gstceltenc.h: - celtenc: port to audioencoder - -2011-11-15 19:53:33 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/Makefile.am: - * ext/opus/gstopus.c: - * ext/opus/gstopusparse.c: - * ext/opus/gstopusparse.h: - opusparse: add opusparse element - A very simple element that parses Opus streams from the ad hoc - framing used by the Opus test vectors. - -2011-11-16 17:24:20 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: allow negotiation of rate/channels with downstream - Since an opus stream may be decoded to any (sensible) rate, - and either stereo or mono, we try to accomodate downstream. - -2011-11-16 17:05:17 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - opusdec: rewrite logic - Parameters such as frame size, etc, are variable. Pretty much - everything can change within a stream, so be prepared about it, - and do not cache parameters in the decoder. - -2011-11-16 16:56:43 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/Makefile.am: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - opus: port to base audio encoder/decoder - -2011-11-16 17:28:10 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/y4m/gsty4mdec.c: - add parent to query function - -2011-11-16 13:26:35 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: allow negotiation of rate/channels with downstream - Since an opus stream may be decoded to any (sensible) rate, - and either stereo or mono, we try to accomodate downstream. - -2011-11-16 01:14:32 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - opusdec: rewrite logic - Parameters such as frame size, etc, are variable. Pretty much - everything can change within a stream, so be prepared about it, - and do not cache parameters in the decoder. - -2011-11-15 23:00:32 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - opusdec: remove buffer pool, buffers are not constant size - -2011-11-15 19:53:33 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/Makefile.am: - * ext/opus/gstopus.c: - * ext/opus/gstopusparse.c: - * ext/opus/gstopusparse.h: - opusparse: add opusparse element - A very simple element that parses Opus streams from the ad hoc - framing used by the Opus test vectors. - -2011-11-16 12:46:04 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/TODO: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Add notes on synchronization and scheduling - -2011-11-16 12:40:58 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - update for renamed flags - Use the _check_reconfigure method instead of checking flags. - -2011-11-16 10:56:24 +0100 Jonas Larsson <jonas@hallerud.se> - - * gst/videoparsers/gsth264parse.c: - h264parse: outgoing byte stream prefix always has size 4 - Fixes #664123. - -2011-11-15 17:49:48 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: fix pointer mismatch in memcpy on drain - -2011-11-15 17:55:50 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst/mpegtsdemux/tsdemux.c: - _query_peer_*() -> _peer_query_*() - -2011-11-15 17:24:07 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - _peer_get_caps() -> _peer_query_caps() - -2011-11-15 16:34:13 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvdspu/gstdvdspu.c: - change getcaps to query - -2011-11-14 11:30:13 +0100 David King <amigadave@amigadave.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: Document requirement for PLAYING state - As described in GNOME bug 663998, the element must be in the PLAYING - state before calling capture-start. - https://bugzilla.gnome.org/show_bug.cgi?id=664048 - -2011-11-14 18:34:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/check/elements/camerabin2.c: - camerabin2: Fix some racyness in tests - Fix some racyness as the test was checking the idle property - right after it got the preview message for video recordings. In some - conditions, it might happen that camerabin2 still hasn't decremented - the processing counter after posting the preview and/or the image/video-done - message and the test will get idle=false and fail. - The approach for checking for the idle property was a busy loop with - a sleep. Far from elegant, but good enough for these tests. - -2011-11-14 16:55:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Also reset audio elements when video capture finishes - Audio elements also need to be reset after each capture, do it - together with the video elements' reset - -2011-11-11 09:58:30 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Add one debug line about camerabin2 being idle - -2011-11-10 16:53:40 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Remove video elements' state clearing from start-capture - Reduce start-capture workload by moving the elements' state reseting to the - finishing steps of the capture. This reduces the time start-capture takes to - actually start a capture and return to its caller, improving user experience. - As the elements' state reset is now triggered from the message handling - function, it needs to spawn a new thread, changing state from the pad's - task would cause a deadlock. - -2011-11-10 16:11:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: keep track of video recording state - Adds a new variable to keep track of the state of the video - recording in camerabin2. This allows start-capture to reject - new video recording requests when one is already ongoing. This - fixes one of check tests. - -2011-11-14 13:41:58 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/Makefile.am: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - opus: port to encoder/decoder base classes - -2011-11-03 14:09:52 +0200 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - mpegvideoparse:Correct the skipping of vbv_delay in picture header and some typo fixes. - https://bugzilla.gnome.org/show_bug.cgi?id=663309 - -2011-11-13 23:55:56 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/libmms/gstmms.c: - * ext/neon/gstneonhttpsrc.c: - * ext/resindvd/resindvdbin.c: - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsrc.c: - * gst/dataurisrc/gstdataurisrc.c: - * sys/dvb/dvbbasebin.c: - Update for GstURIHandler get_protocols() changes - -2011-11-11 17:46:41 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - * ext/opus/gstopusenc.c: - opus: port to 0.11 - -2011-11-10 15:13:34 +0200 Mart Raudsepp <leio@gentoo.org> - - * ext/mimic/Makefile.am: - * ext/opencv/Makefile.am: - * ext/vp8/Makefile.am: - * sys/acmmp3dec/Makefile.am: - * sys/linsys/Makefile.am: - mimic, opencv, vp8, acmmp3dec, linsys: Don't build static plugins - Pass --tag=disable-static to libtool everywhere where it's been forgotten - https://bugzilla.gnome.org/show_bug.cgi?id=663768 - -2011-11-11 10:39:17 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-11-10 19:42:40 -0300 Matej Knopp <matej.knopp@gmail.com> - - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstmpegvideoparse.h: - mpegvideoparse: add support for progressive frames - https://bugzilla.gnome.org/show_bug.cgi?id=663782 - -2011-11-09 20:09:01 +0100 Stefan Sauer <ensonic@users.sf.net> - - * configure.ac: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.h: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstwavescope.c: - audiovisualizer: port to 0.11 - -2011-11-10 18:34:03 +0100 Edward Hervey <edward@collabora.com> - - * ext/gme/gstgme.c: - gme: Remove query_types - -2011-11-10 18:34:48 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-11-10 18:25:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/faad/gstfaad.c: - update for adapter api change - -2011-11-10 17:13:40 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: fix bandwidth property type mismatch - -2011-11-10 12:14:19 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-11-10 12:11:21 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/playondemand/gstplayondemand.c: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - * sys/dxr3/dxr3audiosink.c: - * sys/dxr3/dxr3spusink.c: - * sys/dxr3/dxr3videosink.c: - * sys/winks/gstksvideosrc.c: - * tools/element-templates/element: - chain up in set_clock - -2011-11-09 12:21:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: protect image location list with mutex - Rename the image taglists' mutex into image capture mutex and - use it also for the image capture list to prevent concurrent - access from different threads (application and capture threads). - -2011-11-09 11:45:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Handle null taglists for images - Add NULL and check for them to the image capture taglist list, representing - that a capture has no application tags set. - -2011-11-09 11:17:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Don't store preview location if preview isn't requested - Do not store preview location is post-previews is false, this would - mess up preview naming in case application switches between enabling - and disabling previews - -2011-11-09 09:41:44 -0300 Lasse Laukkanen <lasse.laukkanen@digia.com> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Avoid blocking in start-capture and send application tags later - Tags are currently sent from start-capture, which is run in the - application thread. For images we can delay the tags pushing to the - buffer probe and push the tags with the location event and reduce - start-capture time. - -2011-11-09 12:24:37 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-11-09 12:19:04 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - Conflicts: - gst/colorspace/colorspace.c - -2011-11-09 12:00:05 +0100 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst-libs/gst/video/gstbasevideodecoder.h: - fix documentation typo - -2011-11-09 11:56:07 +0100 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - dtmf: fix compiler warning for uninitialized values - -2011-11-09 11:55:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst/mpegtsdemux/tsdemux.c: - remove query types - -2011-11-04 17:54:04 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - dtmfsrc: Reject start/stop requests that come out of order - -2011-10-29 18:24:26 +0200 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - dtmf: Post messages when starting to send/receive DTMF - This way, the UI can display the DTMF events as they as being sent. - -2011-11-08 08:08:20 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Decrement processing counter when message handling finishes - Some messages might be interesting to applications, so we can only - decrement the processing counter and send the idle notification - when those messages are posted on the pipline's bus - -2011-11-08 07:33:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * tests/check/elements/camerabin2.c: - camerabin2: update tests to set post-previews to true - Makes most of camerabin2 tests pass again - -2011-11-08 11:28:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * sys/dvb/dvbbasebin.c: - * tests/examples/camerabin/gst-camera-perf.c: - * tests/examples/camerabin2/gst-camerabin2-test.c: - * tests/examples/scaletempo/demo-player.c: - update for probe api changes - -2011-11-08 07:09:41 -0300 Lasse Laukkanen <lasse.laukkanen@digia.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: change post-previews property default value as false - Generating and posting preview image always comes with a performance - penalty so set default value as false. The preview-caps property that - defines the preview image format is also NULL by default, so instead - of generating preview image of unspecified format by default explicit - action from application should be required for enabling preview image - posting feature. - Application also has to add custom code to be able - to handle preview messages on its message handling function anyway. - -2011-11-07 20:39:56 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * Android.mk: - Add Android buildsystem hooks for codecparsers - -2011-11-01 20:37:17 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/colorspace/colorspace.c: - colorspace: fix r210 writing only half a scanline - https://bugzilla.gnome.org/show_bug.cgi?id=663203 - -2011-11-07 16:41:42 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/adpcmdec/adpcmdec.c: - * gst/adpcmenc/adpcmenc.c: - adpcm: add more consts, espcially for static const data - -2011-11-07 17:13:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * sys/dvb/dvbbasebin.c: - dvdbasebin: fix for pad probes update - -2011-11-03 18:55:24 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: merge caps instead of using union - It's a lot faster, and preserves caps ordering. - https://bugzilla.gnome.org/show_bug.cgi?id=663346 - -2011-10-27 15:53:48 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - * ext/kate/gstkatetiger.h: - tiger: add a 'silent' property to skip rendering - https://bugzilla.gnome.org/show_bug.cgi?id=662857 - -2011-08-29 13:00:02 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegdemux: catch section lengths extending past the buffer length - This is probably the cause for an occasional crash while streaming - MPEG. Blind fix after staring at the code and following logic, so - may or may not fix the issue, I cannot test. - -2011-10-20 10:42:42 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/resindvdsrc.c: - resindvdsrc: do not try to seek before the first chapter - https://bugzilla.gnome.org/show_bug.cgi?id=589064 - -2011-10-05 18:30:23 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/celt/gstceltenc.c: - celtenc: fix latency query - https://bugzilla.gnome.org/show_bug.cgi?id=616421 - -2011-10-05 18:25:58 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: fix latency query - This makes live 'audiosrc ! opusenc ! opusdec ! audiosink' pipelines - actually work without all audio being dumped. - https://bugzilla.gnome.org/show_bug.cgi?id=660999 - -2011-10-05 15:47:06 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: use debug level for debug info, not error - https://bugzilla.gnome.org/show_bug.cgi?id=660999 - -2011-09-29 14:22:53 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/celt/gstceltenc.c: - celtenc: fix calculation of filler data size - https://bugzilla.gnome.org/show_bug.cgi?id=660469 - -2011-09-29 14:22:33 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: fix calculation of filler data size - https://bugzilla.gnome.org/show_bug.cgi?id=660469 - -2011-10-03 18:28:14 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstpesfilter.c: - mpegpsdemux: fix zero length packet handling - https://bugzilla.gnome.org/show_bug.cgi?id=631416 - -2011-11-02 12:41:54 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * tests/check/libs/mpegvideoparser.c: - tests: mark test input data const - https://bugzilla.gnome.org/show_bug.cgi?id=663235 - -2011-11-02 12:41:30 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - mpegvideoparser: input data is const, mark it so - -2011-11-02 12:38:30 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * tests/check/libs/mpegvideoparser.c: - tests: allow building with older versions of glib (g_list_free_full) - https://bugzilla.gnome.org/show_bug.cgi?id=663234 - -2011-11-07 10:02:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-11-04 18:06:51 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * gst/bayer/Makefile.am: - Fix missing sources on bayer's buildsystem androgenizer call - -2011-11-04 18:52:35 +0100 Stefan Sauer <ensonic@users.sf.net> - - * ext/ladspa/Makefile.am: - * ext/ladspa/gstladspa.c: - * ext/lv2/Makefile.am: - * ext/lv2/gstlv2.c: - * ext/soundtouch/Makefile.am: - * ext/soundtouch/plugin.c: - * gst-libs/gst/signalprocessor/Makefile.am: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst/audiovisualizers/Makefile.am: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/audiovisualizers/plugin.c: - * gst/coloreffects/Makefile.am: - * gst/coloreffects/gstchromahold.c: - * gst/filter/Makefile.am: - * gst/filter/gstfilter.c: - * gst/filter/gstiir.c: - * gst/frei0r/Makefile.am: - * gst/frei0r/gstfrei0r.c: - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rsrc.c: - * gst/gaudieffects/Makefile.am: - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstplugin.c: - * gst/gaudieffects/gstsolarize.c: - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/stereo/Makefile.am: - * gst/stereo/gststereo.c: - * gst/subenc/Makefile.am: - * gst/subenc/gstsrtenc.c: - * gst/subenc/gstwebvttenc.c: - * tests/icles/pitch-test.c: - controller: port to new controller location and api - -2011-11-04 16:34:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - * gst/sdp/gstsdpdemux.c: - more template fixes - -2011-11-04 16:23:03 +0100 Edward Hervey <bilboed@bilboed.com> - - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin2/gst-camera2.c: - * tests/examples/camerabin2/gst-camerabin2-test.c: - * tests/examples/mxf/mxfdemux-structure.c: - * tests/examples/scaletempo/demo-player.c: - examples : Port to 0.11 - -2011-11-04 13:04:19 +0100 René Stadler <rene.stadler@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: add more size checks and improve existing - Don't subtract with unsigned values, that will bite us. Also fix format - specifier in the log message. - -2011-11-04 12:31:19 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/resindvd/resindvdbin.c: - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/sdp/gstsdpdemux.c: - * tests/check/elements/asfmux.c: - * tests/check/elements/mplex.c: - more template fixes - -2011-11-04 12:22:37 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/mplex/gstmplex.cc: - * ext/resindvd/rsnstreamselector.c: - * gst/asfmux/gstasfmux.c: - * gst/camerabin/gstinputselector.c: - * gst/liveadder/liveadder.c: - * gst/mixmatrix/mixmatrix.c: - * gst/mpeg1sys/gstmpeg1systemencode.c: - * gst/mpegdemux/mpegtsparse.c: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - * sys/dvb/dvbbasebin.c: - make request pads take _%u - -2011-11-04 11:24:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstsurfacebuffer.h: - * gst-libs/gst/video/gstsurfaceconverter.c: - * gst-libs/gst/video/gstsurfaceconverter.h: - * gst-libs/gst/video/gstsurfacemeta.c: - * gst-libs/gst/video/gstsurfacemeta.h: - * gst-libs/gst/video/videocontext.c: - * gst-libs/gst/video/videocontext.h: - video: port somewhat to 0.11 - In 0.11 this should be done differently - -2011-11-04 11:01:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-11-04 10:17:38 +0100 Edward Hervey <edward@collabora.com> - - * ext/gme/gstgme.c: - gme: Fix for removal of gst_element_found_tags_for_pad() - -2011-11-03 17:17:10 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst-libs/gst/video/gstsurfacebuffer.h: - * gst-libs/gst/video/gstsurfaceconverter.h: - surfaceconverter: Remove duplicated forward declaration - It seems that some compilers don't like duplicated typedefs. - -2011-11-03 16:57:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - videoenc: fix compiler warning - -2011-11-03 16:57:17 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - video: fix for metadata API change - -2011-11-03 14:01:41 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * configure.ac: - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - vp8: Port to 0.11 - -2011-11-03 13:56:49 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst-libs/gst/Makefile.am: - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - libs/video: Finish porting to 0.11 - -2011-09-28 19:29:07 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * configure.ac: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-basevideo-uninstalled.pc.in: - * pkgconfig/gstreamer-basevideo.pc.in: - video: Add libgstbasevideo PC file - -2011-10-19 16:19:51 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/video/videocontext.c: - * gst-libs/gst/video/videocontext.h: - video: Add GstVideoContext interface - This interface will be used to implement video context sharing. Those - context could be X11 Display, VaDisplay, etc. - -2011-10-07 19:05:30 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstsurfacebuffer.c: - * gst-libs/gst/video/gstsurfacebuffer.h: - * gst-libs/gst/video/gstsurfaceconverter.c: - * gst-libs/gst/video/gstsurfaceconverter.h: - video: Abstract surface API for HW accelerated codecs - -2011-10-26 16:31:39 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * tests/check/libs/vc1parser.c: - tests: make const data const - https://bugzilla.gnome.org/show_bug.cgi?id=662776 - -2011-10-26 16:29:35 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - vc1parser: do not overwrite buffer - I do not know the bitstream format, but this seems likely - to be what was intended. Also add a check on the number of - items to read. - https://bugzilla.gnome.org/show_bug.cgi?id=662776 - -2011-10-21 13:18:26 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - vc1parser: fix parsing of RANGEREDFRM - -2011-11-02 12:10:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsparse.c: - tag: update for tag API removal - -2011-11-02 10:31:24 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-11-02 09:14:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/gme/gstgme.c: - gme: update for taglist api changes - -2011-10-29 09:09:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/tsdemux.c: - * sys/dvb/gstdvbsrc.c: - structure: fix for api update - -2011-10-29 08:25:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/bayer/gstrgb2bayer.c: - caps: update for new API - -2011-11-01 11:47:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: On capture error, skip previews - When the camera source fails to do some capture, skip the next - preview and decrement processing counter. - -2011-11-01 10:38:33 -0300 Lasse Laukkanen <lasse.laukkanen@digia.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: track also preview images with processing counter - Makes camerabin2 only signal that it is idle after all previews have - been generated, images are captured and saved, and videos have - been finished properly. - -2011-11-01 15:08:26 +0100 René Stadler <rene.stadler@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: fix access to uninitialized memory - When vui->timing_info_present is 0, vui->fixed_frame_rate_flag and others - cannot be accessed since they have not been set. - It was also possible that sps->fps_{num,den} end up initialized here. - -2011-11-01 11:11:47 +0000 Brad Smith <brad@comstyle.com> - - * configure.ac: - configure: hack around broken mplex 2.0.0 headers in mplex check - Due to the addition of an unconditional inclusion of config.h in - mjpegtool 2.0.0's stream_params.h header the autoconf test for the - mplex module failed. Hack around this in the same way we did for - mpeg2enc. - https://bugzilla.gnome.org/show_bug.cgi?id=661614 - -2011-11-01 11:09:52 +0000 Brad Smith <brad@comstyle.com> - - * configure.ac: - configure: fix typo in mpeg2enc check so CPPFLAGS get restored correctly - https://bugzilla.gnome.org/show_bug.cgi?id=661614 - -2011-11-01 12:29:35 +0100 René Stadler <rene.stadler@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parser: fix MAX_SPS/PPS boundary checks - -2011-11-01 12:12:56 +0100 René Stadler <rene.stadler@collabora.co.uk> - - * tests/check/elements/h264parse.c: - tests: h264parse: fix exit code - -2011-11-01 00:45:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.h: - * gst/rawparse/gstrawparse.c: - * gst/rawparse/gstrawparse.h: - * sys/dvb/dvbbasebin.c: - * tests/examples/camerabin/gst-camera-perf.c: - Update for pad API changes - GstProbeType, GstProbeReturn and GstActivateMode -> GstPad* - -2011-10-28 11:10:06 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/fieldanalysis/gstfieldanalysis.c: - fieldanalysis: Don't reset the context on DISCONT - On discont, the queue of frames was being cleared, but also the - context reset. We only need to clear the queue. - -2011-10-31 14:51:32 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - Merge remote-tracking branch 'origin/master' into 0.11 - -2011-10-31 14:51:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkateenc.c: - * ext/kate/gstkateutil.c: - * gst/bayer/gstbayer2rgb.c: - * gst/mpegtsdemux/mpegtsbase.c: - kate, bayer, tsdemux: update for caps and taglist API changes - -2011-10-31 14:50:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: add kate and mythtv to non-ported list - katetiger isn't ported, so plugin doesn't build if libtiger is present. - -2011-10-31 11:36:06 +0100 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: handle failures in start() and stop() - -2011-10-31 06:59:53 -0300 Tommi Myöhänen <tommi.myohanen@digia.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.h: - basecamerasrc: optimize state changing speed - Create preview pipeline already in initialization phase. This speeds - up NULL_TO_READY state change. Also implement a separate function for - setting the preview filter element. - This also restricts the preview filter property to work only on - NULL state. - -2011-10-28 15:16:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/kate/gstkatedec.c: - * ext/kate/gstkateutil.c: - * gst-libs/gst/Makefile.am: - * gst/dataurisrc/gstdataurisrc.c: - * gst/mpegtsdemux/tsdemux.c: - make elements compile again - -2011-10-27 16:23:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtsdemux: fix compilation - -2011-10-27 16:23:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: fix compilation - -2011-10-27 16:22:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - add spandsp to non-ported - -2011-10-27 16:13:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-10-21 15:04:05 +0200 Stefan Sauer <ensonic@users.sf.net> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/apexsink/gstapexsink.c: - * ext/directfb/dfbvideosink.c: - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - * gst/camerabin/gstcamerabincolorbalance.c: - * gst/camerabin/gstcamerabincolorbalance.h: - interfaces: clean up the use of iface and class/klass - -2011-10-19 10:24:52 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - vc1parser: Correct the parsing of FRMRTQ_POSTPROC and BITRTQ_POSTPROC - -2011-10-21 11:40:54 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - vc1parser: Correct the parsing of sequece layer. - -2011-10-20 09:39:19 -0300 Reynaldo H. Verdejo Pinochet <reynaldo@collabora.com> - - * Android.mk: - Disable ext/faad for the android ndk build - It currently makes the build fail. Idea is to enable - it back again once its building problems get sorted - out. - -2011-10-18 14:41:48 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * gst/nuvdemux/gstnuvdemux.c: - assrender, nuvdemux: unref buffers with gst_buffer_unref() - -2011-10-18 14:32:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-10-18 14:28:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/celt/gstceltdec.c: - celt: start of 0.11 port - -2011-10-14 11:07:00 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - codecparsers: VC1: Compute par and fps in advanced profile - -2011-10-10 14:19:48 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - codecparsers: VC1: Handle interlaced fields - -2011-10-10 10:14:12 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - codecparsers: VC1: Handle interlaced frames properly - -2011-10-07 13:11:55 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - codecparsers: VC1: Use enums when possible - Add GstVC1FrameCodingMode and use it for the fcm field - Use GstVC1PictureType as variable type for ptype - Use GstVC1Level as variable type for level - -2011-10-07 17:42:17 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: fix bitplanes decoding (check for errors). - -2011-10-07 15:21:34 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: fix bitplanes decoding (INVERT mode). - -2011-10-07 13:59:29 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: fix MVMODE and MVMODE2 parsing. - -2011-10-05 17:39:59 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: handle skipped pictures gracefully. - -2011-10-04 17:39:42 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: VC1: Implement bitplanes diff operator - -2011-10-04 17:39:00 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - codecparsers: VC1: Some cosmetics and debug logging enhancements - -2011-10-04 15:16:04 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - * tests/check/libs/vc1parser.c: - codecparsers: vc1: Implement bitplanes handling properly - Add a new GstVC1BitPlanes API. - -2011-10-04 14:04:42 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - codecparsers: vc1: fix BFRACTION parser (values range + overflow). - -2011-10-04 11:57:37 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: fix VLC decoding. - -2011-10-05 16:40:47 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - codecparsers: VC1: Implement FrameLayer parsing - -2011-10-05 12:15:00 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - * tests/check/libs/vc1parser.c: - codecparsers: VC1: Implement Sequence Layer Data Structures - Instead of having a single VC1SequenceHeader structure, use the 3 structs - from the "Table 265: Sequence Layer Data Structure" of the specification - for the library to be more flexible. - Implement the functions to parse them - -2011-10-05 08:26:31 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: VC1: Compute framerate and bitrate in simple/main profiles - -2011-10-03 14:25:00 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - * tests/check/libs/vc1parser.c: - codecparsers: VC1: compute MB height and width - Add them to GstVC1SequenceHdr - -2011-10-03 15:36:08 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: debug cosmetics. - -2011-10-03 11:42:32 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - codecparsers: vc1: record picture layer header size in bits. - -2011-10-03 11:14:25 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - codecparsers: vc1: compute altpquant. - -2011-10-03 14:22:17 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * tests/check/libs/vc1parser.c: - codecparsers: VC1: Fix after GstVC1ParserResult renaming - -2011-09-30 12:41:13 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - codecparsers: vc1: use GstVC1ParserResult type name similarly to other parsers. - -2011-09-30 11:38:15 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstvc1parser.c: - codecparsers: vc1: handle End-of-Sequence correctly. - -2011-09-14 14:21:47 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - codecparsers: mpeg2: fix quant_matrix_extension() parser for chroma intra QM. - -2011-10-13 16:52:43 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: correct debug message and remove some dead code - See #661113. - -2011-10-06 16:55:43 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: correct parsing of "numberOfPictureParameterSets" - See #661113. - -2011-10-17 10:19:20 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/bayer/gstbayer2rgb.c: - bayer2rgb: Fix pad template caps - -2011-10-16 17:41:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * gst/y4m/gsty4mdec.c: - * gst/y4m/gsty4mdec.h: - y4m: port to 0.11 - -2011-10-16 16:45:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * ext/faac/gstfaac.c: - faac: port to 0.11 - -2011-10-16 16:28:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * gst/bayer/gstbayer2rgb.c: - * gst/bayer/gstrgb2bayer.c: - * gst/bayer/gstrgb2bayer.h: - bayer: port to 0.11 - -2011-10-16 15:28:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-10-13 16:57:31 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Use gst_buffer_join instead of bufferlists - This is *really* inefficient. We should track list of GstMemory - instead. - -2011-10-13 16:57:17 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Plug more leaks - -2011-10-13 16:55:54 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Refactor scan loop - Avoids ending up leaking packets when we got one and res was different - from GST_FLOW_OK. - It also looks more comprehensible - -2011-10-13 16:55:40 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Don't leak upstream events - -2011-10-13 16:55:05 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Refactor code to cope with g_hash_table_foreach_remove() - -2011-10-12 18:05:07 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * configure.ac: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - tsdemux/tsparse: Port to 0.11 - This is a naive port that somewhat works but is inefficient. - I need to rethink how to make the best out of GstMemory/GstBuffer - -2011-10-12 12:09:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Check before acessing preview location list - Only access the preview location if it exists, to avoid acessing - a NULL variable. If the preview location list doesn't exist, it is - likely because the source has posted a preview message after camerabin2 - has been put to READY. - -2011-08-07 17:01:48 +0200 Sjoerd Simons <sjoerd.simons@collabora.co.uk> - - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsink.h: - shm: Add buffer-time property - Add a buffer-time property to limit the size of the amount of data - queued in the shmsink buffer in nanoseconds. - Fixes: #656107 - -2011-08-07 16:36:32 +0200 Sjoerd Simons <sjoerd.simons@collabora.co.uk> - - * sys/shm/shmpipe.c: - * sys/shm/shmpipe.h: - shm: Add ability to add uint64 tags on buffers - -2011-10-11 23:30:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - basecamerasrc: Set preview pipeline to ready when going to ready - The preview pipeline should go to ready when the camerasrc goes - to ready, as in ready elements shouldn't be processing data. - -2011-10-11 23:13:00 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Add a mutex to avoid concurrent access of preview filename lists - The preview filename list is acessed whenever a new capture is started, when - camera-source posts a new preview message or on state changes. All of those can - occur simultaneously, so add a mutex to prevent concurrent access. - -2011-10-07 10:48:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: Reset audiosrc timestamping - Reset audiosrc's timestamping data by setting - it to NULL to reset the ringbuffer and then re-seting - the clock that camerabin might not redistribute - -2011-10-11 16:27:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.com> - - * gst/camerabin/camerabinvideo.c: - camerabin: Prevent audio source from providing clock - camerabin's audio source might be put to NULL during its - use, so the clock would be lost. Better not allow it to - provide a clock at all. - -2011-10-11 11:05:52 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * configure.ac: - configure.ac: openal is not ported yet - -2011-10-10 11:41:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - dvb: port to 0.11 - -2011-10-10 10:15:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.h: - dvbsuboverlay: port to 0.11 - -2011-10-08 15:16:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - * gst/dvdspu/gstspu-common.h: - * gst/dvdspu/gstspu-pgs.c: - * gst/dvdspu/gstspu-pgs.h: - * gst/dvdspu/gstspu-vobsub-render.c: - * gst/dvdspu/gstspu-vobsub.c: - * gst/dvdspu/gstspu-vobsub.h: - dvdspu: port to 0.11 - -2011-10-08 14:22:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatespu.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkateutil.c: - * ext/kate/gstkateutil.h: - kate: port to 0.11 - -2011-10-08 13:14:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - configure: disable directfb - -2011-10-08 12:07:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/zbar/gstzbar.c: - * ext/zbar/gstzbar.h: - zbar: port to 0.11 - -2011-10-08 11:57:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/gme/gstgme.c: - gme: port to 0.11 - -2011-10-08 11:46:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/flite/gstflitetestsrc.c: - flite: port to 0.11 - -2011-10-08 11:40:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsrc.c: - rtmp: port to 0.11 - -2011-10-08 11:17:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-10-06 23:22:51 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin2/gst-camera2.c: - * tests/examples/scaletempo/demo-gui.c: - examples: Fixes for compiling with GTK+ 3.0 - camerabing example had a missing ')' and the fix to build against GTK+3 - that was introduced in commit 516c977c76ba4cd86a7147aab7416a33d76f870f - is also applied to the camerabin2 example. - The scaletempo demo was using API which has been removed, so that's - wrapped in a version check. - -2011-10-06 17:56:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: beginning of port to 0.11 - -2011-10-06 12:15:45 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Make proper use of the h264parser lib in parse_chain - Minor debugging logs fixes - -2011-10-06 14:05:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-10-06 14:03:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: port to 0.11 - -2011-10-06 12:25:26 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: properly interpret baseparse draining state - ... which means the input data has reached the end, but need not exclude - many separate frames may still need parsing. - Fixes merging NALs into AU. - -2011-10-05 23:14:23 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: correct the size argument of gst_h264_parser_identify_nalu_avc() - -2011-10-05 12:09:04 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: minimum size of parsable avcC data should be 8 - -2011-10-06 10:58:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: port to 0.11 - -2011-10-05 20:06:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - jpegformat: port to 0.11 - -2011-10-05 12:53:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: more porting - -2011-10-04 18:54:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * ext/libmms/gstmms.c: - mmssrc: port to 0.11 - -2011-10-04 18:38:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * gst/dataurisrc/gstdataurisrc.c: - dataurisrc: port to 0.11 - -2011-10-04 18:35:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - configure: add more unported plugins - -2011-10-04 14:30:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/examples/opencv/gst_element_print_properties.c: - tests: port - -2011-10-04 14:27:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - video: start porting some base classes - -2011-10-04 14:27:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/parser.c: - * tests/examples/camerabin/gst-camera-perf.c: - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin/gst-camerabin-test.c: - tests: fix some tests - -2011-10-04 14:26:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/interfaces/photography.h: - photography: remore implement-interface - -2011-10-04 14:25:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - configure: add more unported plugins - -2011-10-04 13:33:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: port to 0.11 - -2011-10-04 13:33:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: use right caps - -2011-10-04 13:29:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-10-04 12:31:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/plugin.c: - videoparsers: Only fail to initialize the plugin if all parsers can't be registered - -2011-10-03 15:26:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - camerabin2: Initialize camerabin2 preview pipeline data with 0 - Use g_new0 to initialize all fields with 0 to only cleanup what has been - initialized. This makes cleanup work correctly when some initialization - fails and pointers are left in some inconsistent state. - -2011-10-03 12:06:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/rtpvp8/gstrtpvp8pay.c: - rtpvp8pay: Fix typo - -2011-09-23 22:58:30 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/rtpvp8/gstrtpvp8depay.c: - * gst/rtpvp8/gstrtpvp8pay.c: - * gst/rtpvp8/gstrtpvp8pay.h: - rtpvp8: Update the pay/depay to the ietf-draft-01 spec - -2011-10-03 11:24:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-09-28 14:57:02 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: fix decoding - A simple ... opusenc ! opusdec ... pipeline now works. - https://bugzilla.gnome.org/show_bug.cgi?id=660364 - -2011-09-28 14:56:18 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: moan if we get an unexpected amount of data - https://bugzilla.gnome.org/show_bug.cgi?id=660364 - -2011-09-28 14:22:02 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusenc.c: - opus: properly setup caps and init state from caps - https://bugzilla.gnome.org/show_bug.cgi?id=660364 - -2011-09-28 13:25:21 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusenc.c: - opusenc: use the same frame size setup as the opus test code - https://bugzilla.gnome.org/show_bug.cgi?id=660364 - -2011-09-28 13:24:52 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - opusdec: opus supports a select set of sampling rates - https://bugzilla.gnome.org/show_bug.cgi?id=660364 - -2011-09-28 13:24:21 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/opus/gstopusdec.c: - * ext/opus/gstopusenc.c: - opus: make it build against current, and remove cruft - https://bugzilla.gnome.org/show_bug.cgi?id=660364 - -2011-09-30 18:54:04 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: fix scanning stopping too early - https://bugzilla.gnome.org/show_bug.cgi?id=648245 - -2011-09-29 20:55:22 +0100 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * ext/kate/gstkatetiger.c: - kate: avoid rendering when we know there is nothing to render - https://bugzilla.gnome.org/show_bug.cgi?id=660528 - -2011-10-01 14:30:07 +0100 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * ext/kate/gstkatetiger.c: - kate: fix race condition on PAUSED->READY state change - https://bugzilla.gnome.org/show_bug.cgi?id=660630 - -2011-09-21 14:53:01 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: take into account SCR offset when seeking - Since the seeking byte offset is chosen by linear interpolation - from SCR values, we need to take that first SCR into account - to end up near the correct offset. Otherwise, as the code does - a linear search after that first seek, it will take a LOOOOOONG - time to get there for streams which don't start at zero. - https://bugzilla.gnome.org/show_bug.cgi?id=659485 - -2011-09-21 17:29:52 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: answer position query with a stream time position - https://bugzilla.gnome.org/show_bug.cgi?id=659485 - -2011-09-20 15:21:53 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.h: - mpegpsdemux: remove unused field - https://bugzilla.gnome.org/show_bug.cgi?id=659485 - -2011-09-29 18:20:44 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Refactor tests a little - Refactor camerabin2 tests a little - -2011-09-29 13:03:08 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: adding tests to check for preview message filenames - Preview messages now have filenames, add tests to check that they are - correct - -2011-09-29 18:03:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: add location to preview image messages - Makes camerabin2 intercept preview-image messages and add - the filename corresponding to the message structure in the - 'location' field. - Makes easier for applications to track preview images - -2011-09-27 13:04:21 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.h: - camerabin2: removing capsfilter from preview pipeline - appsink already has a caps property, so we don't need the - capsfilter here - -2011-09-29 16:22:00 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Fix potential loss of EOS event - Setting the audio source to NULL just after pushing the EOS event - on it could potentially cause loss of said EOS event. Instead, we - can set the audio source to NULL when ready-for-capture is - signalled and the boolean value is true as this indicates we are - not currently capturing video. - -2011-09-28 13:01:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - configure: add ported faad and sdp elements - -2011-09-28 12:54:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst-libs/gst/interfaces/photography.c: - photography: remove implements-interface prerequisite - -2011-09-28 12:54:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * common: - use the 0.11 branch of common - -2011-09-27 13:22:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: port to 0.11 - -2011-09-26 22:31:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-09-26 22:30:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: port to 0.11 - -2011-09-26 17:23:41 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Stop the audio source between captures - Move the audio source setting of state to NULL to _stop_capture () to - avoid the audio source running between captures. - -2011-09-26 16:26:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: Also set maximum number of samples that the subclass wants - -2011-09-26 16:05:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: Simple fix for GstAudioEncoder API change - -2011-08-23 18:25:20 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/gstvc1parser.c: - * gst-libs/gst/codecparsers/gstvc1parser.h: - * tests/check/Makefile.am: - * tests/check/libs/vc1parser.c: - codecparser: VC1: Implement a VC1 parsing library - -2011-09-16 19:03:31 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - * gst/videoparsers/Makefile.am: - * tests/check/Makefile.am: - codecparsers: Declare the new APIs as unstable for the time being - -2011-09-26 11:44:02 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: keep CRC table in .rodata - https://bugzilla.gnome.org/show_bug.cgi?id=660118 - -2011-09-20 16:29:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/pcapparse/Makefile.am: - * gst/pcapparse/gstirtspparse.c: - * gst/pcapparse/gstirtspparse.h: - * gst/pcapparse/gstpcapparse.c: - * gst/pcapparse/plugin.c: - irtspparse: add Interleaved RTSP parser element - -2011-09-23 10:10:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: fix compiler warning - gstfaad.c: In function 'gst_faad_parse': - gstfaad.c:615:11: error: 'len' may be used uninitialized in this function - -2011-09-23 09:57:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: parse wants a GstFlowReturn return value, not a gboolean - -2011-09-22 20:11:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegpsmux/psmux.c: - psmux: fix writing of system header, which makes VLC not skip the adjacent PSM and play embedded H.264 streams - header_length contains the length in bytes after the header_length - field, excluding the 6 byte start code and header_length field. - H.264 streams and some other formats need to be announced in the PSM. - VLC wouldn't play files created with mpegpsmux containing H.264 because - we claim the system header is larger than it actually is, which makes - VLC skip the program stream map which follows the system header, which - in turn makes it not recognise our H.264 video stream. - -2011-09-22 20:09:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/libs/.gitignore: - docs: add ignore rules for libs docs directory - -2011-09-22 18:23:32 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: fixup misunderstanding in sample counting - ... between codec and audioencoder regarding whether or not channel - count is already considered. - Fixes #659836. - -2011-09-22 16:01:56 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: use some more boilerplate - -2011-09-22 09:49:21 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/Makefile.am: - * ext/faad/gstfaad.c: - * ext/faad/gstfaad.h: - faad: port to audiodecoder - -2011-09-21 16:11:27 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: use some more boilerplate - -2011-09-21 16:01:28 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/Makefile.am: - * ext/faac/gstfaac.c: - * ext/faac/gstfaac.h: - faac: port to audioencoder - -2011-09-20 16:54:32 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - kate: forward return code from setting src pad caps - https://bugzilla.gnome.org/show_bug.cgi?id=659606 - -2011-09-20 13:00:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - basecamerasrc: Fail state change if preview pipeline fails creation - If the preview pipeline fails creation, for any reason, we should - fail basecamerasrc state change. - Also adds a missing g_return_if_fail check to preview pipeline - functions - -2011-09-19 16:32:58 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - codecparsers: Add checks to input, and fix size checking - -2011-09-19 14:54:11 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth263parse.c: - h263parse: bring debug statements up to desired specs - -2011-09-19 14:07:52 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: bring debug statements up to desired specs - -2011-09-19 13:41:44 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsinglibs: Doc and indentation fixes - -2011-09-10 11:31:20 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/rtpvp8/Makefile.am: - * gst/rtpvp8/dboolhuff.LICENSE: - * gst/rtpvp8/dboolhuff.c: - * gst/rtpvp8/dboolhuff.h: - * gst/rtpvp8/gstrtpvp8pay.c: - rtpvp8: fix bitstream parsing using the wrong kind of bitreader - VP8 uses a probabilistic bool coder, not a straight bit coder. - This fixes parsing when error-resilient is set. - This commit includes a copy of libvpx's bool coder, BSD licensed. - https://bugzilla.gnome.org/show_bug.cgi?id=652694 - -2011-09-14 20:22:42 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/celt/gstceltdec.c: - * ext/celt/gstceltenc.c: - celt: a bit more error checking on header parsing - https://bugzilla.gnome.org/show_bug.cgi?id=659087 - -2011-09-14 19:56:40 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/celt/gstceltenc.c: - celtenc: cleanup header creation - Avoid an extra copy via a temporary fixed size stack buffer. - Use libcelt's header size to allocate a buffer of the correct - size in the first place (libcelt has an off by 4 there, so - account for this). - While there, make size unsigned, and granpos signed. - https://bugzilla.gnome.org/show_bug.cgi?id=659087 - -2011-09-14 19:09:30 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/celt/gstceltenc.c: - celtenc: do not use invalid buffer timestamps - https://bugzilla.gnome.org/show_bug.cgi?id=659087 - -2011-09-14 17:26:05 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/celt/gstceltdec.c: - celtdec: fix error checking with libcelt 0.11 - The return value of celt_decode has changed, newer versions - now return positive values on success. - https://bugzilla.gnome.org/show_bug.cgi?id=659087 - -2011-09-14 17:07:50 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/celt/gstceltenc.c: - * ext/celt/gstceltenc.h: - celtenc: allow actually overriding frame size - https://bugzilla.gnome.org/show_bug.cgi?id=659087 - -2011-09-13 16:24:32 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - kate: flush on seek, and ensure we cancel any waiting buffer - This is what pango textoverlay does, and I've had that condition - variable get stuck once. - https://bugzilla.gnome.org/show_bug.cgi?id=658940 - -2011-09-12 11:17:20 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/codecparsers/gsth264parser.c: - h264parse: do not try to read from a non existent VUI - https://bugzilla.gnome.org/show_bug.cgi?id=658800 - -2011-09-16 00:32:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Adding 2 more log messages - -2011-09-14 15:20:09 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: replace deprecated g_atomic_int_exchange_and_add - It was replaced by g_atomic_int_add, which now returns the - old value. - https://bugzilla.gnome.org/show_bug.cgi?id=659061 - -2011-09-15 17:35:44 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Reset last state change result on state-locked elements - An element stores the result for the last state change it did and - GstBin's state change handler will use this last result for state - locked elements to decide if its state change was successfull or not. - In camerabin2, the filesinks have their state locked and when they - fail switching states, this last failure will be used if the application - tries to change camerabin2's state, causing any state change to fail. - This patch makes camerabin2 reset this last change failure, avoiding - that camerabin2 fails on its next state changes. - -2011-09-15 18:17:24 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/spandsp/gstspanplc.c: - spanplc: Fix typos - -2011-09-13 20:40:35 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: Handle properly frame detection - Handle the case where we have buffers containing no startcode - in the middle of a frame properly. - -2011-09-13 20:38:27 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - codecparsers: mpegvideo: Debugging symbols enhancements - -2011-09-12 13:54:37 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: mpegvideo: Add the ChromaType enum - -2011-09-12 13:41:41 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: mpegvideo: Change broken_gop to broken_link - This way we respect the standard naming - -2011-09-14 16:14:24 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstmpegvideoparse.h: - mpegvideoparse: send a video-codec tag - https://bugzilla.gnome.org/show_bug.cgi?id=569305 - -2011-09-12 16:50:10 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Check zoom notify callback from camera-source - Camerabin2 has a zoom property that is simply proxied to its - internal camera-source element. This patch makes camerabin2 listen - to 'notify' signals from it so it can update its zoom property value - when camera-source changes its zoom as a side-effect of another operation - or because the user set the zoom directly to it, instead of doing - it from camerabin2. - -2011-08-29 08:00:22 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * ext/rtmp/gstrtmpsink.c: - rtmpsink: don't block the main thread with RTMP_Connect - Move the RTMP_Connect call from the main thread (::start) to the streaming - thread (::render). - -2011-09-12 10:33:06 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: fix compiler warnings - -2011-09-12 10:23:19 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: fix compiler warnings - -2011-09-09 14:22:39 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: Make use of the h264_nal_parser_free function - -2011-09-09 14:15:21 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * tests/check/libs/h264parser.c: - codecparsers: h264: Implement the nal_parser_free function - -2011-09-06 21:29:28 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * tests/check/libs/h264parser.c: - codecparsers: h264: Use g_slice instead of g_malloc in nal_parser_new - -2011-09-06 21:28:45 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: Update the documentation - Fix a few error. - Document missing parts. - Add links to the specifications - -2011-09-09 12:27:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/m3u8.c: - hlsdemux: Fix merge mistake from last commit - -2011-09-08 23:56:33 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - hlsdemux: Report the correct timestamp for live streams - Buffers would always start with timestamp 0 and we'd start streaming - from the first buffer, but live streams always start streaming from - the last fragment - 3 fragments in the playlist, which makes its - timestamp, as returned by get_next_fragment, be whatever position - they had in the playlist. This makes sure the position correctly - reports the position of the buffer in the playlist, and added a shifting - variable to allow seeking in the middle of fragments. - -2011-09-08 22:13:19 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - hlsdemux/tsdemux: Add HP copyright on work done on HLS - -2011-09-08 20:29:42 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: set playlist to NULL after unreffing it to avoid a double-unref in the dispose - -2011-09-08 18:25:00 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Do not lock the mutex of the fetcher during EOS - The fetch_location might call stop_fetcher which could generate an EOS - and cause a deadlock - -2011-09-06 22:11:06 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - * ext/spandsp/Makefile.am: - * ext/spandsp/gstspandsp.c: - * ext/spandsp/gstspanplc.c: - * ext/spandsp/gstspanplc.h: - spandsp: Adding spandsp plugin with spanplc element for packet loss concealment - -2011-09-07 20:09:12 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Do not join the task from the task's thread itself. join it only in the state change - -2011-09-07 15:48:33 +0200 Stefan Sauer <ensonic@users.sf.net> - - * docs/libs/Makefile.am: - * docs/plugins/Makefile.am: - docs: cleanup makefiles - Remove commented out parts that we don't need. Remove "the wingo addition" - no - so useful after all. Narrow down file-globs for plugin docs. - -2011-09-07 15:42:37 +0200 Stefan Sauer <ensonic@users.sf.net> - - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - docs: fix camerabin2 names in sections.txt - -2011-09-07 15:37:53 +0200 Stefan Sauer <ensonic@users.sf.net> - - * ext/kate/gstkateparse.h: - kateparse: fix crap in object macros - -2011-09-07 12:32:48 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/videoparsers/gstmpegvideoparse.c: - mpegvideoparse: make this build with older glib - g_list_free_full is a new convenience function. - Replace it with g_list_foreach and g_list_free. - https://bugzilla.gnome.org/show_bug.cgi?id=658450 - -2011-09-07 13:46:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegvideoparse/mpegvideoparse.c: - * gst/videoparsers/plugin.c: - videoparsers: Make the h263 and (new) mpeg video parser autopluggable - -2011-09-05 20:02:57 +0300 George Kiagiadakis <george.kiagiadakis@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: Fix IDR position marking when the IDR is split into several NALs - -2011-09-07 11:27:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gsth263parse.c: - h263parse: Add all always present fields to the src template caps - -2011-09-07 11:24:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gstdiracparse.c: - diracparse: Add all fields to the src template caps - -2011-09-07 11:22:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gstmpegvideoparse.c: - videoparsers: Allow parsed streams to be passed through the parsers - -2011-09-07 11:17:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: Put stream-format and alignment into the src template caps - Also remove the parsed field from the sink template caps. - -2011-09-07 11:14:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/plugin.c: - h264parse: Change rank to PRIMARY+1 to have h264parse autoplugged - -2011-09-07 11:06:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/dirac_parse.c: - diracparse: Constify some arrays - -2011-09-06 10:49:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - camerabin2: preview: No need for appsink to store the last buffer - There is no need for preview's appsink to keep a reference to the last buffer, - so disable the property to make it unref the buffers sooner. - -2011-09-06 22:48:30 +0100 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - Update for latest new plugins and moved plugins - -2011-09-06 21:25:00 +0200 Stefan Sauer <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From a39eb83 to 11f0cd5 - -2011-09-06 16:13:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-09-06 15:40:46 +0200 Stefan Sauer <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 605cd9a to a39eb83 - -2011-09-06 13:20:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: Add Converter to classification - This parser can convert between different alignments and stream-formats. - -2011-09-05 14:39:20 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - camerabin2: preview: Appsink doesn't need to sync - Set sync to false on preview's pipeline appsink - -2011-09-05 09:55:53 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - camerabin2: preview: Remove one of the two colorspace converters - The preview pipeline doesn't need 2 colorspace converters, remove - one to speed up caps negotiation and reduce the delay on getting - the first preview buffer out of the preview pipeline. - It shouldn't cause problems as videoscale and ffmpegcolorspace seems - to handle the same caps, so no conversion should be needed for - videoscale. Additionally, camerabin1 has been working with a similar - pipeline with a single ffmpegcolorspace and no bugs have been open about it - so far. - -2011-09-01 20:01:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - camerabin2: preview: Disable appsrc signals emission - Camerabin2 doesn't check appsrc's signals, so disable them - -2011-08-26 10:50:38 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoenc: do not try to calculate latency from an unknown framerate - It'll divide by zero, and latency is unknown for an unknown framerate. - Fixes an assert in the schroenc test. - https://bugzilla.gnome.org/show_bug.cgi?id=657419 - -2011-09-03 00:36:34 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: If a fetch fails, decrement the sequence number - -2011-09-02 23:49:38 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: make hlsdemux lock/unlock the m3u8 client when it accesses it - -2011-09-02 23:48:22 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - hlsdemux: Add a get_target_duration and get_current_uri api to m3u8_client - -2011-09-02 23:48:03 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - hlsdemux: Make the m3u8 client thread-safe - -2011-09-02 19:44:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Reset in PAUSED->READY after chaining up to the parent class - Otherwise there are possible race conditions with the streaming thread. - -2011-09-02 16:08:59 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * docs/libs/gst-plugins-bad-libs-sections.txt: - * gst-libs/gst/codecparsers/gsth264parser.h: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - docs: minor fixes - -2011-08-31 10:12:44 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst-libs/gst/play/.gitignore: - * gst-libs/gst/play/play.h: - * gst-libs/gst/play/play.vcproj: - gst-libs: Remove play directory. Was unported since 0.8 - -2011-08-31 10:10:21 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * docs/libs/Makefile.am: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - docs: Add more sections to the gst-libs API docs - -2011-08-29 13:52:17 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix PPS parser - Fix transform_8x8_mode_flag and second_chroma_qp_index_offset - -2011-08-29 13:52:16 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix NAL reader initialization. - -2011-08-26 15:54:51 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: handle end-of-seq and end-of-stream NAL gracefully. - -2011-08-26 16:05:58 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - codecparsers: h264: fix ref_pic_list_reordering(). - -2011-08-16 16:19:02 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: fix pred_weight_table() parsing. - Use 16-bit signed integer values for weight values because valid - ranges are -128 to +128 inclusive. - -2011-08-16 15:21:18 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: record slice_header() size in bits. - -2011-08-16 15:14:03 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: fix slice_header() parsing. - We were not parsing the slice headers until the actual end, we are now - parsing until the end. - -2011-08-12 13:19:29 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gsth264parser.h: - codecparsers: h264: fix filler-data NAL unit type name. - -2011-08-12 10:17:47 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * configure.ac: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-codecparsers-uninstalled.pc.in: - * pkgconfig/gstreamer-codecparsers.pc.in: - codecparsers: add pkgconfig file. - Adds a new pkgconfig file for codecparsers. They don't have - any specific dependency on gst-plugins-bad and they could quite be - independent bitstream parsers. - -2011-08-05 11:21:05 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: mpeg: add user-data packet start code definition. - -2011-08-03 17:31:55 +0200 Gwenole Beauchesne <gwenole.beauchesne@intel.com> - - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - codecparsers: mpeg: fix Picture_Coding_Extension parser. - -2011-08-02 12:37:02 +0200 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - * gst/videoparsers/h264parse.c: - * gst/videoparsers/h264parse.h: - h264parse: Port to the new h.264 parsing library - -2011-07-29 10:56:15 +0200 Thibault Saunier <thibault.saunier@collabora.com> - - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/gsth264parser.c: - * gst-libs/gst/codecparsers/gsth264parser.h: - * tests/check/Makefile.am: - * tests/check/libs/h264parser.c: - codecparsers: h264: Add an h.264 bitstream parsing library - -2011-06-23 12:54:43 -0400 Thibault Saunier <thibault.saunier@collabora.com> - - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstmpegvideoparse.h: - * gst/videoparsers/mpegvideoparse.c: - * gst/videoparsers/mpegvideoparse.h: - * tests/check/elements/mpegvideoparse.c: - mpegvideoparse: Port to the new mpeg parsing library - -2011-07-19 13:52:01 +0200 Thibault Saunier <thibault.saunier@collabora.com> - - * configure.ac: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/codecparsers/Makefile.am: - * gst-libs/gst/codecparsers/gstmpegvideoparser.c: - * gst-libs/gst/codecparsers/gstmpegvideoparser.h: - * gst-plugins-bad.spec.in: - * pkgconfig/gstreamer-plugins-bad.pc.in: - * tests/check/Makefile.am: - * tests/check/libs/mpegvideoparser.c: - codecparsers: mpeg: Add an mpeg video bitstream parsing library - Create a new codecparsers library - -2011-08-30 14:50:41 -0300 Thibault Saunier <thibault.saunier@collabora.com> - - * configure.ac: - * docs/Makefile.am: - * docs/libs/Makefile.am: - * docs/libs/compiling.sgml: - * docs/libs/gst-plugins-bad-libs-docs.sgml: - * docs/libs/gst-plugins-bad-libs-overrides.txt: - * docs/libs/gst-plugins-bad-libs-sections.txt: - * docs/libs/gst-plugins-bad-libs.types: - docs: Build documentations for libraries - -2011-09-02 15:00:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/m3u8.c: - hlsdemux: Remove obsolete FIXME comment - -2011-09-02 14:55:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Reset the internal state going to/from READY instead of NULL - This theoretically allows reuse of the element when setting it to READY - instead of NULL. - -2011-09-02 14:54:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Set playlist parsing helper object to NULL after freeing - -2011-09-01 23:18:51 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Allow up to 3 consecutive failed downloads before erroring - In some networks, especiall in 3G, a fragment download or playlist - update may fail. We allow for up to 3 consecutive failures, while using - the rfc's specs for retry delays before considering that there was an - error on the stream. - -2011-09-01 22:46:19 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: remove unused argument - -2011-08-21 20:15:25 -0700 David Schleef <ds@schleef.org> - - * ext/vp8/gstvp8enc.c: - vp8enc: fix drop-frame property - Fixes #656929. - -2011-09-01 15:57:50 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Add a flag to disable image conversion elements - If we know that our camera source element produces buffers at the same - resolution and appropriate colourspace for the output, we don't need any - of the generic conversion elements in encodebin. This reduces caps - negotiation overheads among other things. - -2011-08-31 23:06:53 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/libmms/gstmms.c: - mms: fix warnings related to the format on the debug lines. - -2011-08-31 13:29:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Micro optimize encodebin pads linking - Reduce one check in encodebin pads linking on camerabin2 by - using the link_pads_full version - -2011-08-31 13:28:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - basecamerabinsrc: Optimize preview pipeline startup - Use gst_element_link_pads_full to optimize preview pipeline startup, - leading to a faster camerabin2 startup as well. - -2011-08-31 15:33:10 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Use explicit boolean literals to make gobject happy - gobject boolean properties are strict and only accept 1 or 0, otherwise - they throw an assertion. - -2011-08-31 14:48:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Just join the task - gst_task_join() will already stop the task, no need - to stop it additionally. - -2011-08-31 14:47:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Join the task instead of just stopping it and not waiting for it to finish - Fixes interesting race conditions that cause crashes in decodebin2 - because pads are added/removed from child elements although they - should be in READY state already. - -2011-08-31 12:12:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Remove unused variable - -2011-08-31 03:47:52 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: switch to higher/lower bitrate by more than one step at a time - -2011-08-31 03:20:48 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: remove spamming GST_LOG_OBJECT - -2011-08-31 03:07:48 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: If paused, do not cache fragments until out of memory error! - We should stop the update thread in PAUSED state and avoid fetching - new fragments when the queue is not empty. The queue should always be - empty since we push data into a queue. Also, in totem, if we seek and - pause the stream while it's buffering, then the state will stay playing - for some reason, so it's best not to continue fetching fragments forever. - -2011-08-31 03:01:58 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: start/stop update thread and keep track of status - -2011-08-31 02:05:08 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Post duration message when we parse the playlist - -2011-08-31 01:08:39 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Send a flush-stop when switching pads. Fixes A->A/V sync issue. - This is to ensure that we reset the accumulate segment on the sinks - so if we start with audio only then switch to audio+video, then both - sinks will have the same segments and will be synchronized. - -2011-08-26 22:48:01 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: seems there was a typo, free the adapter if it contains data, not if already empty - -2011-08-26 22:47:35 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: oups, we need to empty the queue after freeing its content - -2011-08-26 22:44:08 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Need to flush all streams when we receive a flush-start - -2011-08-26 21:46:06 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: do not broadcast the fetcher_cond on bus error if we're cancelled - If we cancel the fetch and call the stop_fetcher, which holds the lock, - when it sets the fetcher's state to NULL, it might send an error - on the bus. In that case, we must ignore it, otherwise it will try - to take the lock and will block forever. - -2011-08-26 19:29:06 +0000 Jonas Larsson <Jonas.Larsson@hiq.se> - - * gst/hls/m3u8.c: - hlsdemux: Split playslist on \r\n not just \n - -2011-08-26 19:10:58 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Do not succeed a download if the fetcher had an error - -2011-08-26 19:10:39 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Rename functions that need to be called with a locked mutex - -2011-08-26 19:09:54 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: We must signal the fetcher_cond while holding its lock - -2011-08-26 17:54:51 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: We do not need to set the current playlist to the main one - When caching fragments, if we set the current playlist to main, then - it will always think it's a live stream (no endlist in it) so it will - force the redownload of the main playlist after every seek, which is - unnecessary. Also, it causes a race condition where a seek migh happen - during that redownload, and we'll think we're trying to seek a live pipeline. - -2011-08-30 17:43:22 +1000 Jan Schmidt <thaytan@noraisin.net> - - * ext/soundtouch/gstpitch.cc: - * ext/soundtouch/gstpitch.hh: - soundtouch: Handling incoming rate when requested. - Absorb inbound segments with rate != 1.0 and output a segment with - rate taken from the new output-rate property, adjusting the segment - applied_rate, stream duration and timestamps as necessary to - compensate - -2011-08-15 17:57:53 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/MotionCells.cpp: - fix valgrind warning about Conditional jump or move depends on uninitialised value(s) - -2011-08-17 09:42:07 +0200 Nicola Murino <nicola.murino@gmail.com> - - * ext/opencv/MotionCells.cpp: - Move m_pprevFrame free just before the clone of the latest frame for readability - -2011-08-26 09:43:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Make viewfinder's queue a thread limit only - Reduce the viewfinder queue limits to only allow it to store - one buffer, preventing the queue from holding old buffers for - too long. This also avoids showing slightly outdated frames on - the viewfinder when the source has already produced new ones - and improves the buffer recycling rate, important for sources - that use bufferpools. - -2011-08-25 19:56:58 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: fix element leak - and this concludes an hour of yelling at the bloody test failing, - only to track down the problem not being in the test. - https://bugzilla.gnome.org/show_bug.cgi?id=657368 - -2011-08-26 00:52:46 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - tsdemux: In push mode, do not start pull loop if upstream seek fails - -2011-08-26 00:47:53 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: do not make the update_thread joinable - -2011-08-26 00:26:29 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Ensure the task is paused in case of cache error - -2011-08-25 23:37:47 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: stop the threads in the proper order - first pause the task, then stop all fetchers, then stop the update thread - then pause the task again, since it might have been restarted by - another thread in the meantime - -2011-08-25 23:37:25 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: do not post an error if we seek/cancel during caching of fragments - -2011-08-25 23:37:00 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: if we're canceling a fetcher, we must stop its thread - -2011-08-25 23:36:27 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: lock the update_thread mutex before stopping it - -2011-08-25 23:35:55 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: lock the fetcher mutex before stopping it - -2011-08-25 23:33:10 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: do not allow two fetchers to run simultanously - -2011-08-23 20:49:33 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Stop the streaming task on PAUSED_TO_READY state change - -2011-08-25 19:24:56 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * tests/check/Makefile.am: - tests: make camerabin2 test build - https://bugzilla.gnome.org/show_bug.cgi?id=657363 - -2011-08-25 12:49:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - Conflicts: - ext/resindvd/rsnwrappedbuffer.c - -2011-07-12 21:48:37 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - dtmf: Add more debug - -2011-07-12 19:09:02 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstdtmfcommon.h: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - dtmf: Max event type is 15 - -2011-04-14 15:46:08 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - dtmfsrc: Align DTMF sound buffers with last-stop from event - Also make sure the timestamps never go backwards - -2011-07-11 21:31:07 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstrtpdtmfsrc.c: - rtpdtmfsrc: Correctly recognize the end of a buffer - -2011-07-11 20:47:23 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstrtpdtmfsrc.c: - rtpdtmfsrc: Make sure rtpdtmfsrc timestamps don't overlap - -2011-07-11 20:46:20 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstrtpdtmfsrc.c: - rtpdtmfsrc: Put the inter digit interval at the end, not at the start - The reason is to let rtpdtmfmux drop buffers during the inter digit interval, - this way, there will be more silence around the DTMF tones so IVFs will have - a better chance recognizing them. - -2011-04-14 17:08:57 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - rtpdtmfsrc: Start at the last_stop from the start event if there was one - The goal is to try to not have a GAP between the audio and the DTMF - -2011-04-14 14:34:26 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - rtpdtmfmux: Add last-stop to dtmf-event upstream events - Add the running time of the last outputted buffer to the - upstream "dtmf-event" events so that the dtmf source does not - leave a gap. - -2011-04-14 16:49:39 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - rtpdtmfsrc: Respect ptime from the caps - Respect the ptime from the caps for the DTMF packets - -2011-07-11 21:30:28 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/dtmf/gstrtpdtmfsrc.c: - rtpdtmfsrc: Just error out if there is no clock - -2011-08-24 16:53:52 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkateutil.c: - kate: make gst_kate_util_is_utf8_string() inline to fix compiler warning with older libkate versions - gstkateutil.c:230:1: error: 'gst_kate_util_is_utf8_string' defined but not used - -2011-08-24 15:32:12 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/resindvd/rsnwrappedbuffer.c: - rsndvd: ensure metadata is writable when writing to it - https://bugzilla.gnome.org/show_bug.cgi?id=657250 - -2011-08-24 09:35:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Use FALSE instead of 0 for bool parameter - -2011-08-23 22:44:17 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Need to send a newsegment after a seek - -2011-08-23 22:38:26 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Send buffering messages on the bus - -2011-08-23 22:38:05 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: cache the number of fragments we are required to cache - -2011-08-23 22:40:25 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Forward seek/duration query/event to the sinkpad - -2011-08-24 01:03:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Optimize start up a little by removing some pad checks - Some pad checks are guaranteed to work, so we can disable them - by using gst_element_link_pads_full - -2011-08-23 19:26:31 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst/camerabin2/gstcamerabin2.c: - * tests/check/Makefile.am: - * tests/examples/Makefile.am: - camerabin2: Remove from experimental - Remove camerabin2 from experimental, allowing it to be built - without needing to pass --enable-experimental on configure. - -2011-08-23 19:13:21 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Always set encodebin flags when going to ready - When going from NULL to READY we want the encodebin flags to be - set, and not only after creating encodebin (on the first run) - -2011-08-23 11:58:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Add new entry to flags property - Adds a new entry to camerabin2 flags to disable viewfinder - conversion elements. - -2011-08-23 11:19:51 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstviewfinderbin.h: - camerabin2: viewfinderbin: Add property for disabling converters - Adds a new property to disable converters elements for performance - reasons. It should only be used if the application knows they aren't - needed. - -2011-08-19 17:28:54 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: do not try to compare a PCR with itself for statistics - Especially as one of the logs will cause a divide by zero. - https://bugzilla.gnome.org/show_bug.cgi?id=656927 - -2011-08-19 13:32:14 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: do not keep a dangling pointer - When removing the current program, it will get freed by the - hash table removal callback, so ensure we clear our pointer - to it. - Fixes a crash later on in gst_ts_demux_push trying to access it. - https://bugzilla.gnome.org/show_bug.cgi?id=656927 - -2011-08-21 20:36:07 +0100 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * ext/kate/gstkateutil.c: - kate: pass on timed event metadata as tags when we can - Metadata attached to other objects that may be used in this - event are not passed, as is binary metadata. - -2011-08-23 10:32:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Add AC_MSG_CHECKING() to the VP8E_SET_TUNING presence check - -2011-08-19 19:17:15 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * configure.ac: - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - vp8: probe for the new tuning API to keep building with older libvpx - https://bugzilla.gnome.org/show_bug.cgi?id=656928 - -2011-08-18 13:21:18 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgdec.h: - rsvgdec: use input buffer timings if possible - SVG data may come through multiple buffers, so keep track of the - timestamp of the first buffer, and use it in preference. - https://bugzilla.gnome.org/show_bug.cgi?id=628284 - -2011-08-22 17:10:24 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatespu.c: - kate: do not consider an empty SPU to be a fatal error - Instead, just encode nothing and go on. - https://bugzilla.gnome.org/show_bug.cgi?id=657091 - -2011-08-22 17:15:10 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatespu.c: - kate: do not clear out high bits from display area - http://dvd.sourceforge.net/spu_notes does not mention that high bits - are to be masked, and not clearing them makes a sample work, where - clearing them yielded left > right. - History from the dvdspu plugin, from where this code was copied, - does not shed any light, as tracing this code's origin shows - the same bitmasks being there in 2007 when it was imported. - https://bugzilla.gnome.org/show_bug.cgi?id=657091 - -2011-08-22 16:52:13 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/dvdspu/gstspu-vobsub.c: - dvdspu: do not clear out high bits from display area - http://dvd.sourceforge.net/spu_notes does not mention that high bits - are to be masked, and not clearing them makes a sample work, where - clearing them yielded left > right. - History does not shed any light, as tracing this code's origin shows - the same bitmasks being there in 2007 when it was imported. - https://bugzilla.gnome.org/show_bug.cgi?id=620119 - -2011-08-23 09:52:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: First try if upstream handles seeking in TIME format before seeking in the demuxer - -2011-08-23 09:40:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: First send SEEKING queries upstream - -2011-08-23 09:27:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Send DURATION query upstream first - -2011-08-23 09:23:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Use FALSE instead of 0 for a bool parameter - -2011-08-16 19:53:31 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: switch pads when we seek (need_segment) since tsdemux doesn't cope well with a reset - -2011-08-23 02:36:25 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Add a FIXME comment. loop task should be a pad task - -2011-08-22 23:41:39 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Do not seek in a live stream - -2011-08-22 23:41:31 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Do not take the pad stream lock, use the task's lock instead - -2011-08-16 19:46:49 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - hlsdemux: Implement EVENT_SEEK - -2011-08-23 01:54:26 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Implement the GST_QUERY_SEEKING properly - -2011-08-23 01:54:03 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Implement correctly the GST_QUERY_DURATION - -2011-08-16 19:41:08 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Do not use GST_TASK_WAIT in the task function - The task function uses GST_TASK_WAIT which does a g_cond_wait giving it - the GST_OBJECT_GET_LOCK of the task. The mutex gets locked when - g_cond_wait returns, so if we don't lock/unlock it, it will - stay locked forever, preventing the task from ever finishing. - We shouldn't lock the task object lock, so let's remove the GST_TASK_WAIT - and make the task pause instead if there are no buffers in the queue. - -2011-08-18 23:52:37 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: do not send a new-segment on stream removal - When a program is changed, stream_added is called which sets the - need_newsegment to TRUE, then stream_removed is called, which calls - the flush_pending_data, which checks for the newsegment and causes - it to send a new-segment. - We must not send the newsegment when flushing the pending data on the - removed stream. We should only push it when flushing data on the newly - added streams (after they finish parsing their PTS header) - -2011-08-16 22:05:14 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Fix newsegment when switching programs - If a program/stream is changed, then a newsegment is sent which must - not be the same as the base segment since it happens later. We must - shift the start position by the time elapsed since the newsegment - and the current PTS of the stream - -2011-08-16 19:54:04 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: interpolate gap and fix timestamps depending on upstream segment - -2011-08-18 23:54:59 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - hlsdemux: Keep a separate variable for the current variant used - By using a separate variable, first it allows us to sort the lists - of alternates but keep the pointer on the first occurence in the main - playlist (to respect the spec of starting with the bitrate specified - first in the main playlist). It also avoid playing with the lists variable - which should be used to store the list of playlists and not as a pointer - to the current one. - Also fixes a memleak with the g_list_foreach freeing the lists, if it wasn't - pointing to the first element of the list. - -2011-08-21 18:44:43 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/Makefile.am: - * sys/decklink/capture.cpp: - * sys/decklink/capture.h: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksink.h: - * sys/decklink/gstdecklinksrc.h: - decklink: fix compilation on Linux - -2011-08-18 14:29:53 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklink: Add subdevice property - -2011-07-07 16:44:31 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/decklink/capture.cpp: - * sys/decklink/capture.h: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksink.h: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - * sys/decklink/linux/DeckLinkAPI.h: - * sys/decklink/linux/DeckLinkAPIDispatch.cpp: - * sys/decklink/linux/LinuxCOM.h: - * sys/decklink/win/DeckLinkAPI.h: - * sys/decklink/win/DeckLinkAPIDispatch.cpp: - * sys/decklink/win/DeckLinkAPI_i.c: - decklink: add support for Windows - Builds with MSVC, not tested in MinGW or anything else. Added - COM handling code, borrowed from dshowvideosink. Moved Linux - specific files to ./linux and added Windows specific files to - ./win (generated from IDL files in VS9). Added macros to handle - BSTR and defined bool as BOOL. Fixes #655362. - Signed-off-by: David Schleef <ds@schleef.org> - -2011-07-07 14:34:01 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/decklink/capture.cpp: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklink: improve frame handling - Send NEWSEGMENT on start. Send warning instead of error on - dropped frames. - Signed-off-by: David Schleef <ds@schleef.org> - -2011-07-07 14:20:37 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/decklink/capture.cpp: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklink: fix debugging in capture.cpp by making category extern - Signed-off-by: David Schleef <ds@schleef.org> - -2011-07-07 14:13:00 -0400 Joshua M. Doe <oss@nvl.army.mil> - - * sys/decklink/capture.cpp: - * sys/decklink/capture.h: - decklink: use mutexes from glib instead of pthread - Signed-off-by: David Schleef <ds@schleef.org> - -2011-06-16 17:19:49 -0300 Tiago César Katcipis <tiagokatcipis@gmail.com> - - * configure.ac: - * gst/removesilence/Makefile.am: - * gst/removesilence/gstremovesilence.c: - * gst/removesilence/gstremovesilence.h: - * gst/removesilence/vad_private.c: - * gst/removesilence/vad_private.h: - removesilence: new plugin - Fixes: #597822. - Signed-off-by: David Schleef <ds@schleef.org> - -2011-08-21 14:41:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Prevent audiosrc from sending undesired eos - Basesrc derived classes send an eos when they change state - from paused to ready and that breaks video recordings on camerabin2 - as it makes the whole audio branch pads flushing. - Prevent it by using a pad probe that only allows the eos to pass - when it is caused by a stop-capture action. - -2011-08-21 14:07:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Use audiotestsrc on tests - Use audiotestsrc on tests instead of using the system's default - audiosrc, avoiding any problems that a local audio setup might - have. - -2011-08-18 18:27:03 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Use gst_pad_send_event instead of eventfunc macro - -2011-08-14 04:41:58 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Improving tests - Adding some additional checks for custom camerabin2 messages - Also improves reliability of the tests by waiting for the preview-buffer message. - This message is generated from the preview pipeline, and might arrive later than the - image/video-done from the main camerabin2 pipeline, the tests need to wait for it even - after getting the image/video-done. - -2011-08-18 15:12:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Avoid assertions when plugin creation fails - Capsfilters are created on the constructor and their properties can - be set/get from camerabin2's set/get_property functions. The user with - a broken setup would cause assertions when trying to set/get the - capture caps of this camerabin2. - A proper missing-plugin message will be posted when the user tries to - set camerabin2 to READY state. - -2011-08-20 00:48:20 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - tsmux: remove unnecessary check - remove an if (best) check where best != NULL has already been checked - -2011-08-16 19:51:34 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - tsbase: reinitiate segment at flush-stop event only - -2011-08-16 19:43:08 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - hlsdemux: Set buffer timestamp since we send a TIME segment - -2011-08-02 19:21:47 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Allow bandwidth switching during caching of fragments - -2011-08-02 19:21:18 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: set the pad's caps before adding it - -2011-08-17 11:02:12 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/ofa/gstofa.c: - ofa: fingerprint creation can fail - There does not seem to be a way to retrieve information - about why failure occured, unfortunately. - When failure occurs, do not post a NULL fingerprint tag. - https://bugzilla.gnome.org/show_bug.cgi?id=656641 - -2011-08-17 10:55:59 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/ofa/gstofa.c: - ofa: cleanup - Avoid repeating casting to GstAudioFilter when one will do - Use object related logging to make it easier to get just the logs we want - https://bugzilla.gnome.org/show_bug.cgi?id=656641 - -2011-08-17 11:07:54 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/ofa/gstofa.c: - ofa: do not create fingerprint on EOS if record is FALSE - https://bugzilla.gnome.org/show_bug.cgi?id=656641 - -2011-08-18 10:39:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Remove unused and useless variable in tags handling - -2011-08-18 08:02:50 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideo: Fix locking, especially if both pads have different streaming threads - -2011-08-18 07:42:02 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideo: Don't call g_type_class_peek_parent() in class_init - This is already done by the GObject boilerplate macro - -2011-08-17 19:01:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-08-16 10:24:37 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/aiff/aiffmux.c: - * gst/aiff/aiffmux.h: - aiffmux: drop data after 4ish GB and moan - https://bugzilla.gnome.org/show_bug.cgi?id=654278 - -2011-08-16 10:02:59 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/aiff/aiffmux.c: - aiffmux: use guint32 for guint32 parameters - This makes explicit that the range is limited. - https://bugzilla.gnome.org/show_bug.cgi?id=654278 - -2011-08-16 10:02:11 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/aiff/aiffmux.c: - aiffmux: avoid integer overflow - These values are 32 bits, and width is a multiple of 8. - https://bugzilla.gnome.org/show_bug.cgi?id=654278 - -2011-08-16 19:39:40 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/celt/gstceltdec.c: - celtdec: make this compile with git libcelt - celt_mode_info was removed, in favor of a _ctl. - https://bugzilla.gnome.org/show_bug.cgi?id=656686 - -2011-08-16 18:34:59 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/ofa/gstofa.c: - ofa: don't crash when there's no data to create a fingerprint from - Fixes a crash when no data flowed through. - https://bugzilla.gnome.org/show_bug.cgi?id=656641 - -2011-08-16 19:47:02 +0300 George Kiagiadakis <george.kiagiadakis@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4parse.c: - mpeg4videoparse: Use gst_bit_reader_skip to skip more than 32 bits. - GET_BITS is a macro for gst_bit_reader_get_bits_uint32, which cannot - read more than 32 bits and will fail in this case where it is called - to read 79 bits. Since we want to skip those bits, gst_bit_reader_skip - is more appropriate in this case. - -2011-08-15 02:08:14 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/qtkitvideosrc.m: - qtkitvideosrc: get the framerate from caps - ...and configure QTKit accordingly. Hardcoding to 30fps was pretty -bad. - -2011-08-13 15:55:01 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Add test for audio-filter property - Checks that the audio-filter is properly plugged in the pipeline - and receives buffers when recording a video. - -2011-08-11 18:59:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Add audio-filter property - Adds a property to add a custom GstElement to the audio - branch of the pipeline. This allows the user to do custom audio - processing/analysis when recording videos. - -2011-08-12 22:39:53 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.h: - basevisualizer: add more shader variants and simplify code - Use macros to simplyfy the shading code. Those will ease to add support for - other colorspaces in the future. Add more variants for the shading (left,right, - horiz-in, vert-out, vert-in). - -2011-08-12 21:22:20 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - basevisualizer: more docs - -2011-08-12 21:18:44 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.h: - baseaudiovisualizer: protect config with a lock - Before it was easy to crash the elements when using a ximagesink and triggering - renegotiation by resizing. - -2011-08-12 16:57:49 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/audiovisualizers/gstspectrascope.c: - spectrascope: make a copy of the audiodata before downmixing and windowing - The buffers come from the adapter and the data might overlap. We don't want to - modify it in place. - -2011-08-12 12:25:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: Proxy the width/height/framerate/PAR constraints of downstream caps to upstream - This allows to specify constraints on the compressed downstream caps - by muxers or capsfilters, which will then be forwarded to upstream - and allows video converters to fulfill the constraints. - Code based on Mark Nauwelaerts audio encoder base class. - -2011-08-12 12:13:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: Remove old ::getcaps() comment - -2011-08-12 12:08:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/dirac/gstdiracenc.cc: - diracenc: Update for basevideoencoder ::get_caps() removal - -2011-08-12 12:08:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/schroedinger/gstschroenc.c: - schroenc: Update for basevideoencoder ::get_caps() removal - -2011-08-12 12:08:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Update for basevideoencoder ::get_caps() removal - -2011-08-12 12:06:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: Remove ::get_caps() vfunc - Subclasses can set the caps more efficiently and this only - caused additional indirections. - -2011-08-09 09:29:21 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mxf/mxfmetadata.c: - mxf: do not assert on the values of data read from input - Instead, log a warning, and return. - https://bugzilla.gnome.org/show_bug.cgi?id=563827 - -2011-08-03 16:02:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: Use the cached video frame size instead of recalculating it - -2011-08-08 17:53:16 +0200 Sjoerd Simons <sjoerd.simons@collabora.co.uk> - - * ext/schroedinger/gstschroenc.c: - schroedinger: Fix set but unused variables - Remove some dead code that triggers "set but unused variables" - from Gcc 4.6. Fixes #656166 - Signed-off-by: David Schleef <ds@schleef.org> - -2011-08-08 16:44:20 +0200 Sjoerd Simons <sjoerd.simons@collabora.co.uk> - - * ext/dirac/gstdiracenc.cc: - dirac: Fix set but unused variables - Remove some dead code that triggers "set but unused variables" from Gcc - 4.6. Fixes #656164. - Signed-off-by: David Schleef <ds@schleef.org> - -2011-08-06 12:13:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Adding video-done message - video-done message will be posted when a video recording is - finished. Similar to image-done message. - -2011-08-05 15:48:53 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Adding top-level element documentation - -2011-08-05 13:34:08 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Fixing typo - -2011-08-04 13:33:20 +0200 Stefan Sauer <ensonic@google.com> - - * ext/opencv/gstmotioncells.c: - * ext/opencv/motioncells_wrapper.cpp: - * ext/opencv/motioncells_wrapper.h: - motioncells: turn two global vars into static variables - Move 2 variable to motioncells_warpper and make them static. - -2011-08-04 13:33:56 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * tests/examples/opencv/Makefile.am: - examples: Add missing header file - -2011-08-04 11:28:30 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * sys/decklink/Makefile.am: - decklink: Add gstdecklink.h to list of headers - -2011-08-04 09:49:46 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst/videoparsers/mpegvideoparse.c: - mpegvideoparse: fix sequence header parsing - After bitrate there's 11 bits (1 marker bit + VBV buffer size) before the load - intra quantiser flag. - -2011-08-04 09:40:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-08-04 09:36:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - Conflicts: - common - configure.ac - gst/colorspace/colorspace.c - gst/colorspace/colorspace.h - gst/colorspace/gstcolorspace.c - -2011-07-21 08:58:27 +0300 Tommi Myöhänen <tommi.myohanen@digia.com> - - * gst-libs/gst/interfaces/photography.h: - photography: add missing FLICKER_REDUCTION capability - GstPhotography API contains functions to get/set flicker reduction - mode, but GstPhotoCaps enumeration doesn't have item for it, so elements - are not able to report whether they support this feature or not. - Also add useful GST_PHOTOGRAPHY_CAPS_ALL for easily selecting all - capabilities at once. - https://bugzilla.gnome.org/show_bug.cgi?id=655318 - -2011-08-03 13:37:28 -0700 David Schleef <ds@schleef.org> - - * gst/subenc/Makefile.am: - * gst/subenc/gstsrtenc.c: - * gst/subenc/gstsubenc.c: - * gst/subenc/gstwebvttenc.c: - * gst/subenc/gstwebvttenc.h: - subenc: Add webvttenc element - -2011-08-03 13:35:41 -0700 David Schleef <ds@schleef.org> - - * ext/kate/gstkateenc.c: - kateenc: Fix uninitialized error - -2011-07-09 23:22:26 -0700 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschroenc.c: - schroenc: remove shape_output handling - -2011-07-09 23:07:39 -0700 David Schleef <ds@schleef.org> - - * ext/dirac/gstdiracenc.cc: - diracenc: Remove unused shape_output code - -2011-07-09 18:53:24 -0700 David Schleef <ds@schleef.org> - - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - vp8enc: Add more properties - -2011-06-19 16:06:46 +0200 Alexey Fisher <bug-track@fisher-privat.net> - - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - vp8enc: add min/maxsection-pct option - This options should be good to redeuce decode CPU load. - for lowend hardware: - minsection-pct=15 maxsection-pct=400 - for hiend hw: - minsection-pct=5 maxsection-pct=800 - see example: - http://www.webmproject.org/tools/encoder-parameters/#2-pass_vbr_encoding_for_smooth_playback_on_low-end_hardware - Signed-off-by: Alexey Fisher <bug-track@fisher-privat.net> - Signed-off-by: David Schleef <ds@schleef.org> - -2011-06-19 11:05:36 +0200 Alexey Fisher <bug-track@fisher-privat.net> - - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - vp8enc: add lag-in-frames option. - This option set maximum of frames codec should remember, - to make better prediktion for alt-ref frames. - See example: - http://www.webmproject.org/tools/encoder-parameters/#2-pass_best_quality_vbr_encoding - Signed-off-by: Alexey Fisher <bug-track@fisher-privat.net> - Signed-off-by: David Schleef <ds@schleef.org> - -2011-06-19 07:16:57 +0200 Alexey Fisher <bug-track@fisher-privat.net> - - * ext/vp8/gstvp8enc.c: - vp8enc: use multipass.cache file name as default for multipass mode. - Signed-off-by: Alexey Fisher <bug-track@fisher-privat.net> - Signed-off-by: David Schleef <ds@schleef.org> - -2011-07-09 16:05:07 -0400 Mukul Majmudar <mukul.majmudar@gmail.com> - - * ext/faac/gstfaac.c: - * ext/faac/gstfaac.h: - faac: Add properties for VBR encoding - Property "quality" to specify VBR quantizer quality and property - "brtype" to choose between ABR and VBR encoding. The default is now VBR - with quality=100. - Fixes bug #654310. - Signed-off-by: David Schleef <ds@schleef.org> - -2011-07-07 16:07:50 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklink: Add audio-input property - -2011-07-18 15:25:05 +1000 Tim 'mithro' Ansell <mithro@mithis.com> - - * gst/inter/Makefile.am: - inter: Adding missing base requirements. - Fixes: #654806. - -2011-08-03 15:21:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: add more missing plugin checks - Sprinkle some more missing plugin checks around - -2011-08-03 13:12:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Add a missing element check and remove TODO - Add missing element checks for elements created at _init - functions and remove TODO about it - -2011-08-03 13:57:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Remove redundant image-queue - Encodebin is used for image encoding and it already contains - a queue, so we can remove camerabin2 image queue. - -2011-08-03 13:42:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.h: - dvbsuboverlay: fix up copyrights - -2011-06-29 15:14:29 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - gst-camerabin2-test: Add audio capture caps option - -2011-08-02 15:14:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: Make access to the list of frames threadsafe - -2011-08-02 23:53:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/bayer/Makefile.am: - bayer: back around compiler warnings in orc-generated code by disabling -Werror for this plugin - https://bugzilla.gnome.org/show_bug.cgi?id=652677 - -2011-08-02 22:57:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * .gitignore: - * ext/opencv/gstmotioncells.c: - * tests/examples/opencv/gst_element_print_properties.c: - * tests/examples/opencv/gstmotioncells_dynamic_test.c: - Fix some more variable-set-but-not-used compiler warnings - -2011-08-02 21:14:06 +0200 Robert Jobbagy <jobbagy.robert@gmail.com> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - camerabin2: examples: Fix camerabin2 G_OBJECT cast - Adds missing cast to fix build error. - -2011-08-02 10:49:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Workaround for ringbuffer not resyncing on READY - Add a workaround to fix timestamps meanwhile bug - https://bugzilla.gnome.org/show_bug.cgi?id=648359 is fixed. - -2011-07-30 16:12:31 +0300 Raluca Elena Podiuc <ralucaelena1985@gmail.com> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin2 remove redundant viewfinder-colorspace and viewfinder-scale - camrabin2 connects a viewfinderbin on "vfsrc". viewfinderbin is made of: - vfbin-csp ! vfbin-videoscale ! videosink. - we should either remove csp/videoscale from wrappercamerabinsrc (as - done in this patch) or we should get rid of viewfinderbin altogether. - -2011-07-26 06:04:41 +0300 Raluca Elena Podiuc <ralucaelena1985@gmail.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst/camerabin2/gstwrappercamerabinsrc.c: - basecamerasrc: remove unused get_allowed_input_caps - The use of this method was removed in: - commit 539f10f4d99e1a074881289254d1d109159cf9e5 - basecamerasrc: More cleanup - The code from wrappercamerabinsrc is from v4l2camerasrc but is unused: - get_allowed_input_caps is not called anywhere. - -2011-07-26 05:59:09 +0300 Raluca Elena Podiuc <ralucaelena1985@gmail.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - basecamerasrc: don't use class offsets for start/stop-capture signal handlers - -2011-07-26 05:43:34 +0300 Raluca Elena Podiuc <ralucaelena1985@gmail.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - basecamerasrc: document why we set preview to PLAYING - -2011-07-26 04:42:49 +0300 Raluca Elena Podiuc <ralucaelena1985@gmail.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - basecamerasrc: document callbacks - Note for each callback: - - when it is called, - - whether it is mandatory or optional. - -2011-07-26 03:04:47 +0300 Raluca Elena Podiuc <ralucaelena1985@gmail.com> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - basecamerabinsrc: preview: remove unused new_preroll callback - -2011-07-28 13:18:57 -0300 Teemu Katajisto <teemu.katajisto@digia.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Synchronize clock and base time to audiosrc - When audio source goes to READY it loses its clock and base time, - this patch sets them back after bringing the audio source back to PAUSED. - -2011-07-28 12:56:12 -0300 Robert Swain <robert.swain@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Prevent audio source from providing clock - The audio source inside camerabin2 is put to READY and back to - PLAYING when starting capture, causing the pipeline to lose its - clock. As camerabin2 isn't put to PAUSED->PLAYING again during - this, a new clock isn't selected for elements. - -2011-06-30 11:09:44 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * tests/examples/camerabin2/gst-camerabin2-test.c: - camerabin2: Add flags prop to toggle encodebin conversion elements - A flags property has been added to encodebin to toggle whether the - conversion elements (ffmpegcolorspace, videoscale, audioconvert, - audioresample, audiorate) are created and linked into the appropriate - branches of encodebin. - Not including these elements avoids some slow caps negotiation and - allows the first buffers to flow through encodebin much more quickly. - However, it imposes that the uncompressed input is appropriate for the - target profile and elements selected to meet that profile. - -2011-06-29 15:35:42 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Prepare audiosrc before start-capture - If we bring the audio source up to the PAUSED state before emitting the - start-capture signal to the camera source, when subequently taking the - audio source to the PLAYING state, it will begin capture more quickly. - -2011-06-29 15:18:47 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Remove redundant elements - Since camerabin2 has switched to encodebin and encodebin has its own - queues and conversion elements, those preceding encodebin are no longer - necessary and as such can be removed. - -2011-08-02 12:24:01 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * configure.ac: - configure.ac: Define list of non-ported plugins - -2011-08-02 11:42:46 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * common: - Update common submodule - -2011-08-01 18:49:55 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Take into account upstream newsegment events - If the incoming newsegment event was in time, use that position value - for the downstream newsegments. - -2011-08-01 18:48:03 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - hlsdemux: Send NEWSEGMENT events - Previously hlsdemux wasn't sending out any newsegment. - Here we push a GST_FORMAT_TIME newsegment, and whenever possible we - try to indicate the proper start time. - This allows downstream elements to relay the start/time values properly - to the sinks, allowing better stream switching. - -2011-08-01 15:46:12 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Remove programs on EOS - Allows subclasses to properly flush out pending data. - -2011-08-01 10:54:16 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Refactor stream/program removal - The program_stopped vmethod was called before stream_removed vmethod - was being called. Since we only did stream-related operations in there, - we just remove the program_stopped vmethod and do everything in the - stream_removed one. - Also, make sure we flush out all pending data before sending EOS. - -2011-07-28 18:21:04 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Prevent stack gardening by using the right type - stream_type is stored as guint inside the GstStructure but was retreived - using valist with a pointer to guint16. This would cause stack gardening - when code is compiled without optimisation (e.g. in -O0 the compiler wont - pad the stack to optimise out required mask). - https://bugzilla.gnome.org/show_bug.cgi?id=655540 - -2011-07-29 21:26:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/faad.c: - tests: fix compiler warning in faad unit test - -2011-07-29 19:43:11 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/id3tag/Makefile.am: - * gst/id3tag/gstid3mux.h: - * gst/id3tag/gsttagmux.c: - * gst/id3tag/gsttagmux.h: - * gst/id3tag/id3tag.h: - id3mux: use now-public GstTagMux base class from libgsttag - -2011-07-28 20:38:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/id3tag/gstid3mux.c: - * gst/id3tag/gsttagmux.c: - tagmux: require subclass to install sink pad template - Require the subclass to install both source and sink pad - templates. Also, print some warnings if the subclass doesn't - do that. - https://bugzilla.gnome.org/show_bug.cgi?id=555437 - -2011-07-27 22:34:23 +0200 Robert Jobbagy <jobbagy.robert@gmail.com> - - * configure.ac: - * tests/examples/Makefile.am: - * tests/examples/opencv/Makefile.am: - * tests/examples/opencv/gst_element_print_properties.c: - * tests/examples/opencv/gst_element_print_properties.h: - * tests/examples/opencv/gstmotioncells_dynamic_test.c: - * tests/examples/opencv/gstmotioncells_dynamic_test.h: - gstmotioncells_dynamic_test: test tool what can to do dynamic change properties - -2011-07-27 18:58:15 +0200 Robert Jobbagy <jobbagy.robert@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/MotionCells.cpp: - * ext/opencv/MotionCells.h: - * ext/opencv/gstmotioncells.c: - * ext/opencv/gstmotioncells.h: - * ext/opencv/gstopencv.c: - * ext/opencv/motioncells_wrapper.cpp: - * ext/opencv/motioncells_wrapper.h: - motioncells: new element to detect areas of motion - -2011-07-26 17:02:05 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - hsldemux: Handle change of media types - When switching bitrates, we might end up switching to a different - media-type (like from aac to/from mpeg-ts). - For this switch to behave properly in decodebin2, this patch adds: - * dynamic source pads (which will be added/removed whenever a stream - media type changes - * re-checking the fragment media type whenever we switch to a different - playlist - -2011-07-26 13:47:04 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4parse.c: - mpeg4videoparse: Fix unitialized variable on old compilers - -2011-07-27 11:02:41 +0100 Olaf Seibert <rhialto@azenomei.knuffel.net> - - * gst/hls/gsthlsdemux.c: - hlsdemux: fix wrong usage of GST_ELEMENT_ERROR macros and compilation on NetBSD - https://bugzilla.gnome.org/show_bug.cgi?id=655319 - -2011-07-27 10:56:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: fix compiler warning - gstpcapparse.c: In function 'gst_pcap_parse_chain': - gstpcapparse.c:381:6: error: 'eth_type' may be used uninitialized in this function -Werror=uninitialized - gstpcapparse.c:354:11: note: 'eth_type' was declared here - -2011-07-26 19:11:16 +0300 Felipe Contreras <felipe.contreras@nokia.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: fix SLL parsing - The current code is not checking for ethernet type, as it's supposed to, - but link layer device type and it's hard-coded to only accept dumps from - ethernet (ARPHRD_ETHER; 1). We don't care where the dump was fetched - from (wlan, 3G, etc.) - What we care about is the that the ethernet type is IP (ETHERNET_IP; - 0x800), which is clearly field 14: - http://www.tcpdump.org/pcap3_man.html - And do a bit of cleanup. - Signed-off-by: Felipe Contreras <felipe.contreras@nokia.com> - -2011-07-21 13:26:55 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsbase/tsdemux: Fix stream/pad activation order - We first activate new streams before shutting down old ones. - We emit no-more-pads after we add new streams and emit EOS before - removing old ones. - Also cleanup/refactor a bit more of the code accordingly - -2011-07-22 12:26:07 +0300 Raluca Elena Podiuc <ralucaelena1985@gmail.com> - - * gst/camerabin2/PORTING: - camerabin2: add location=NULL docs to PORTING - https://bugzilla.gnome.org/show_bug.cgi?id=641918 - -2011-07-22 11:38:30 +0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: If location is NULL do not encode images - Using a NULL string for location means that the application - doesn't want the image to be encoded, but wants to receive - the preview image. (Only works for image captures) - Useful for application that want the capture in memory only, like - displaying to the user before it choses to encode or take another - picture in avatar capturing scenarios. - https://bugzilla.gnome.org/show_bug.cgi?id=641918 - -2011-07-21 08:04:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/schroedinger/gstschroenc.c: - schroenc: Update for GstBaseVideoEncoder::finish() signature change - -2011-07-21 08:03:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Update for GstBaseVideoEncoder::finish() signature change - -2011-07-21 08:03:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/dirac/gstdiracenc.cc: - diracenc: Update for GstBaseVideoEncoder::finish() signature change - -2011-07-21 05:44:10 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: Allow finishing of frames with no src_buffer to drop/free the GstVideoFrame - -2011-07-20 08:39:51 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: Only get caps from the subclass if they were not set yet by the subclass - -2011-07-20 09:25:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: Delay sending of serialized sink events until finish_frame() - -2011-07-20 09:09:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: Add ::reset vfunc and handle ::reset/::finish the same way as in the decoder - -2011-07-20 19:16:05 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/pesparse.c: - * gst/mpegtsdemux/pesparse.h: - pesparse: Fix stuffing byte handling - We in fact get the size of the header (including stuffing bytes), therefore - use that instead of trying to skip 0xff bytes ourselves since some media - streams do start with 0xff (like mpeg audio's initial 0xfff). - -2011-07-18 14:53:31 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - - * ext/assrender/gstassrender.c: - * ext/lv2/gstlv2.c: - * ext/modplug/gstmodplug.cc: - * ext/sndfile/gstsfsrc.c: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * ext/zbar/gstzbar.c: - Fix compilation for unused but not set - https://bugzilla.gnome.org/show_bug.cgi?id=654572 - -2011-07-20 08:57:47 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpegtsdemux/pesparse.c: - mpegtsdemux: fix compiler warnings - -2011-07-19 12:50:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: Use a temporary GstVideoState until the subclass accepted the caps - Also store the caps in the GstVideoState and assume a PAR of 1/1 instead - of 0/1 if no PAR is specified in the caps. - -2011-07-19 09:36:53 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - mpegtsbase/tsdemux: Add more comments and removal unused variable - -2011-07-19 09:36:10 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Avoid double removal of streams - This can happen if the PCR pid is the same as a audio/video PID. - -2011-07-19 09:34:37 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsbase: Add a GList of streams to the program - Allows faster iteration of all program streams. - We still keep the Array to allow fast retrieval of stream by PID. - -2011-07-19 08:45:51 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsbase: Use a bit array instead of an array of gboolean - Makes know_psi and is_pes 32 times smaller - -2011-07-19 08:37:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: Fix format string compiler warning - -2011-07-18 14:14:31 +0300 Sreerenj Balachandran <sreerenj.balachandran@intel.com> - - * ext/directfb/dfbvideosink.c: - dfbvideosink: fix harmless typo in variable initialization - https://bugzilla.gnome.org/show_bug.cgi?id=654840 - -2011-07-12 19:04:27 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: remove a check made useless by the last commit - -2011-07-12 19:01:47 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: assume byte-stream if stream-format and codec_data are missing from input caps - -2011-07-06 23:24:27 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: ignore codec_data if stream-format=byte-stream - Some encoders set codec_data even when outputting byte-stream. Before this patch - h264parse would incorrectly detect such streams as AVC. - -2011-07-18 09:12:16 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Use standalone PES parser - -2011-07-17 14:17:10 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsdemux/pesparse.c: - * gst/mpegtsdemux/pesparse.h: - mpegtsdemux: Add standalone PES parser - -2011-07-17 09:49:06 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/gstmpegdefs.h: - mpegdefs: clarify some stream ids - -2011-07-16 13:51:44 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: whoops, tsdemux isn't ready yet for primary rank :) - -2011-07-16 13:47:45 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - mpegtsbase/tsdemux: Cleanups and comments - -2011-07-16 13:44:00 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Fix newsegment creation for push mode - And all relevent comments to what it should be doing, refactor everything - a bit. Still not perfect ... but better. - Fixes #654657 - -2011-07-15 12:08:40 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - mpegtsbase: Store incoming newsegments - -2011-07-15 20:57:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/id3tag/gstid3mux.c: - * gst/id3tag/gsttagmux.h: - * gst/id3tag/id3tag.c: - * gst/id3tag/id3tag.h: - tagmux: const-ify GstTagList argument of render vfuncs - -2011-07-15 20:39:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/id3tag/gsttagmux.c: - * gst/id3tag/gsttagmux.h: - * gst/id3tag/id3tag.c: - tagmux: fix up private base class header so it can be made public - Move private bits into a private struct, add some padding. - https://bugzilla.gnome.org/show_bug.cgi?id=555437 - -2011-07-15 16:10:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - We need core/base from git - Update requirements after out-of-order 0.10.35 release - -2011-07-13 17:15:36 +0300 Raluca Elena Podiuc <ralucaelena1985@gmail.com> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: fix name of 'image-done' bus message - Use the correct bus message for camerabin2 image done and removes - check that is no longer needed for these tests. - -2011-07-15 10:04:53 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: rename offset property to ts-offset - ... so as to promote consistency with some other elements in the wild. - -2011-07-14 19:30:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/h264/gsth264dpb.c: - * sys/vdpau/h264/gsth264parser.c: - * sys/vdpau/h264/gstvdph264dec.c: - vdpau: fix some variable-set-but-unused compiler warnings - -2011-07-15 00:03:10 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: actually set seen_pat=TRUE when we see a PAT - -2011-06-26 20:32:53 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * ext/neon/gstneonhttpsrc.c: - neonhttpsrc: implement URI query - -2011-07-14 22:08:56 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - mpegtsbase: Split up whether we saw a PAT and its offset - Fixes the issue with streams that don't set an offset on their buffers, - like those coming from hlsdemux. - Fixes #653481 - -2011-07-14 17:06:38 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: properly apply ts offset - -2011-07-14 16:50:29 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/pcapparse/gstpcapparse.c: - * gst/pcapparse/gstpcapparse.h: - pcapparse: optionally output relative timestamps, possibly shifted by offset - That is, output timestamps can then either be the absolute capture time, - or the relative capture time (w.r.t. to first output buffer), or the relative - capture time incremented by some offset. - -2011-07-14 16:40:14 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: also support extracting tcp data - -2011-07-14 14:37:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/.gitignore: - * tests/check/pipelines/.gitignore: - tests: add some more unit test binaries to .gitignore - -2011-07-13 13:44:41 -0400 Olivier Crête <olivier.crete@collabora.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - docs: Revert wrongly committed changes to .args/.hierarchy - -2011-07-13 13:42:09 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/mpegvideoparse/mpegpacketiser.c: - mpegvideoparse: Restore some unused variables as comments - -2011-07-13 13:39:46 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtsdemux: Restore erroneously removed data++ - Also, put back some unused code in comment and replace // comments by /* */ - -2011-07-13 13:38:31 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegdemux: Restore erroneously removed data++ - Also, put back some unused code in comment and replace // comments by /* */ - -2011-07-13 10:42:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - schroedinger: Fix compilation and set-but-not-used compiler warnings - -2011-07-13 10:33:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/dirac/gstdiracenc.cc: - diracenc: Fix compilation by including the new gstbasevideoutils.h header and fixing some set but not used compiler warnings - -2011-07-12 18:22:35 -0400 Olivier Crête <olivier.crete@collabora.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * tests/examples/camerabin/gst-camera-perf.c: - examples/camerabin: Fix set-but-unused warnings - -2011-07-12 18:20:23 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/jp2k/gstjasperdec.c: - * ext/jp2k/gstjasperenc.c: - jp2k: Fix set-but-unused warnings - -2011-07-12 18:18:30 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/resindvd/gstpesfilter.c: - * ext/resindvd/rsnstreamselector.c: - resindvd: Fix set-but-unused warnings - -2011-07-12 18:16:54 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/cog/cogvirtframe.c: - cog: Fix set-but-unused warnings - -2011-07-12 18:13:56 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/dvb/camresourcemanager.c: - * sys/dvb/camsession.c: - * sys/dvb/camtransport.c: - dvb: Fix set-but-unused warnings - -2011-07-12 18:10:42 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/videomeasure/gstvideomeasure_ssim.c: - videomeasure: Fix set-but-unused warnings - -2011-07-12 18:09:26 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/tta/gstttadec.c: - tta: Fix set-but-unused warnings - -2011-07-12 18:08:21 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/sdi/gstsdidemux.c: - * gst/sdi/gstsdimux.c: - sdi: Fix set-but-unused warnings - -2011-07-12 18:05:25 -0400 Olivier Crête <olivier.crete@collabora.com> - - * ext/vp8/gstvp8enc.c: - vp8: Fix set-but-unused warnings - -2011-07-12 18:03:53 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/rtpvp8/gstrtpvp8pay.c: - rtpvp8: Reject unknown bitstream versions - -2011-07-12 17:59:56 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/videoparsers/h263parse.c: - videoparsers: Fix set-but-unused warnings - -2011-07-12 17:57:45 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: Fix set-but-unused warnings - -2011-07-12 17:56:25 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/mpegvideoparse/mpegpacketiser.c: - mpegvideoparse: Fix set-but-unused warnings - -2011-07-12 17:53:33 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/tsdemux.c: - mpegdemux: Fix unused-but-set warnings - -2011-07-12 17:50:27 -0400 Olivier Crête <olivier.crete@collabora.com> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsdemux: Fix unused-but-set warnings - -2011-07-12 01:18:16 +0530 Sameer Naik <sameer.subscriptions@damagehead.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: fix segfault if gst_collect_pads_pop () returns no buffer - In mpegtsmux_choose_best_stream () call if the gst_collect_pads_pop () call - returns no buffer (NULL), the plugin SegFaults in the gst_buffer_unref call. - To fix this we check if a valid buffer is returned before calling - gst_buffer_unref (). - Fixes bug #654416. - -2011-07-11 12:59:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: First inform subclass about resetting before resetting/freeing all internal state - The subclass might want to access the old state. - -2011-07-11 12:36:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: Track present position on discont before resetting it - -2011-07-11 11:52:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: Also protect the list of pending frames from concurrent access when pushing all pendings events - -2011-07-11 11:28:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideocodec: Protect access to the list of pending frames with the object lock - This is required if ::finish_frame() and all buffer output happens - on a different thread than the sinkpad streaming thread. - -2011-07-11 09:35:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: Set the correct lists to NULL after freeing - -2011-07-11 08:54:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: Work with a copy of the GstVideoState in setcaps until the caps are accepted - Also fix a refcount problem with the codec_data. - -2011-07-09 11:40:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoutils.c: - * gst-libs/gst/video/gstbasevideoutils.h: - basevideo: Move the utils from the codec header to its own header - -2011-07-09 11:31:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Use destroy notify to free the coder hook - -2011-07-09 11:09:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideo: Use GSlice for allocating GstVideoFrame and don't duplicate code in the decoder base class - -2011-06-28 11:47:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: Don't reorder serialized src events - And allow to drop EOS by the subclass if ::finish returns - DROPPED. This requires that the subclass sends EOS manually later. - Fixes bug #653544. - -2011-06-27 09:41:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideo: Add the caps to the GstVideoState and clean up caps/codec_data properly - Having access to the caps in ::set_format can be useful if - non-standard caps fields like the h264 alignment must be accessed. - -2011-07-09 10:57:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideo: Add destroy notify for the coder_hook to prevent memory leaks - Fixes bug #654293. - -2011-07-08 11:52:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfdemux.c: - mxfdemux: Properly return seeking errors if the requested position can't be found - -2011-07-07 16:00:44 -0700 Stefan Kost <ensonic@users.sf.net> - - * gst/inter/.gitignore: - inter: add ignore file for intermediate files - -2011-07-07 15:59:05 -0700 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-flite.xml: - * docs/plugins/inspect/plugin-inter.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - docs: add camerabin2 to the docs and update the doc files - -2011-07-07 15:55:59 -0700 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * gst/camerabin2/gstplugin.c: - camerabin2: don't mess with camerabin (1) namespace - Use an extra '2' to stay out of the old namespace. - -2011-07-07 11:11:42 -0700 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - docs: keep section file sorted - -2011-07-07 10:52:50 -0700 Stefan Kost <ensonic@users.sf.net> - - * gst/scaletempo/gstscaletempo.c: - scaletempo: improve the docs - Fix the syntax, add more explanation and xref the properties. - -2011-06-05 00:54:19 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/Makefile.am: - * ext/opus/Makefile.am: - * ext/opus/gstopus.c: - * ext/opus/gstopusdec.c: - * ext/opus/gstopusdec.h: - * ext/opus/gstopusenc.c: - * ext/opus/gstopusenc.h: - opus: duplicate from CELT - Copy the celt plugin and convert it to Opus. Mostly works. - -2011-07-06 15:56:32 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklink.cpp: - decklink: HD modes are square pixels - -2011-07-05 10:19:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - Add -DGST_USE_UNSTABLE_API to the compiler flags to avoid warnings - -2011-07-04 16:18:18 -0700 David Schleef <ds@schleef.org> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gstdiracparse.h: - diracparse: make diracparse work correctly - -2011-07-03 18:32:37 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklinksrc.cpp: - decklink: properly set up analog input - -2011-06-28 23:47:18 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinksrc.cpp: - decklink: Add more modes - -2011-06-03 19:41:33 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/inter/Makefile.am: - * gst/inter/gstinter.c: - * gst/inter/gstinteraudiosink.c: - * gst/inter/gstinteraudiosink.h: - * gst/inter/gstinteraudiosrc.c: - * gst/inter/gstinteraudiosrc.h: - * gst/inter/gstintersurface.c: - * gst/inter/gstintersurface.h: - * gst/inter/gstintertest.c: - * gst/inter/gstintervideosink.c: - * gst/inter/gstintervideosink.h: - * gst/inter/gstintervideosrc.c: - * gst/inter/gstintervideosrc.h: - inter: new intermediate surface plugin - This set of elements allows easily rendering audio and video to - an intermediate surface that is then used as a source in a different - pipeline. - -2011-06-18 15:51:54 -0700 David Schleef <ds@schleef.org> - - * gst/colorspace/colorspace.c: - * gst/colorspace/colorspace.h: - * gst/colorspace/gstcolorspace.c: - colorspace: Add JPEG YCbCr matrix - -2011-06-18 15:56:49 -0700 David Schleef <ds@schleef.org> - - * ext/vp8/gstvp8enc.c: - vp8enc: update for new libvpx api - -2011-06-26 19:29:24 -0700 David Schleef <ds@schleef.org> - - * gst/y4m/gsty4mdec.c: - y4mdec: Fix buffer duration - -2011-06-26 15:15:54 +0200 Alexey Fisher <bug-track@fisher-privat.net> - - * ext/vp8/gstvp8enc.c: - vp8enc: generate a timestamp for alt-ref frames. - It will fix handling of altref/invisible frames since matroska-mux - drop any fram with no timestamp. - see also: - http://www.webmproject.org/code/specs/container/ - The encoder will currently set the AR's timestamp as close as possible - to the previous frame while attempting to provide a timestamp that is - strictly increasing. In cases where the time base given to the encoder - at configure time is not granular enough to allow for this the AR - will share the same timestamp as D, but should be - treated as having no duration. - Fixes bug #652951 - Signed-off-by: Alexey Fisher <bug-track@fisher-privat.net> - -2011-06-25 23:55:28 +0300 Raimo Järvi <raimo.jarvi@gmail.com> - - * configure.ac: - wininet: Fix configure check by including windows.h - Fixes bug #653161. - -2011-06-07 13:55:38 +0300 Raimo Järvi <raimo.jarvi@gmail.com> - - * configure.ac: - * sys/Makefile.am: - * sys/d3dvideosink/Makefile.am: - d3dvideosink: Fix configure check and makefiles - Fixes bug #652035. - -2011-06-25 15:12:45 -0700 David Schleef <ds@schleef.org> - - * gst/tta/gstttadec.c: - * gst/tta/gstttaparse.c: - tta: decrease rank to NONE - Appears to be utterly incapable of parsing and decoding TTA streams. - Hasn't been updated to do TTA2. If you want this element to work, - fix the bloody thing. The gst-ffmpeg decoder works fine. - Also fixed an obvious endianness issue along the way. - Fixes: #652924 - -2011-06-18 17:47:36 +0200 Alexey Fisher <bug-track@fisher-privat.net> - - * ext/vp8/gstvp8dec.c: - vp8dec: add check if we have legal aspect-ratio before reset it. - the commit f9b552f0494e (vp8dec: set par to 1/1) - will fix situation where no aspect-ratio is set, but it brake - stream with available aspect-ratio. This patch fix it. - Fixes: #652902. - Signed-off-by: Alexey Fisher <bug-track@fisher-privat.net> - -2011-06-23 20:11:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: don't use GLib 2.28 API - Don't use GLib 2.28 API, we still only require >= 2.24. - -2011-06-23 11:28:53 -0700 David Schleef <ds@schleef.org> - - * common: - Automatic update of common submodule - From 69b981f to 605cd9a - -2011-06-22 22:25:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Set tagsetters to merge replace mode - The default for tagsetters is to use merge keep mode, so tags - would never be replaced and all captures would have the same tags. - This commit watches all elements added into encodebin and sets - all tagsetters to merge replace mode - -2011-06-22 18:58:29 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * tests/check/elements/camerabin2.c: - camerabin2: Use a single location for both modes - Implement the location property just like it works in camerabin, the - same location is used for both images and videos - -2011-06-22 16:27:00 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Send serialized custom events for filename changes in image sink - Using serialized custom events for switching image capture saving - location makes camerabin2 save each capture correctly to the location - that was set during the moment start-capture was called, and not - the moment the filesink was writing to disk. - This prevents captures to be overwriten by racyness among start-capture - and setting location for images. - -2011-06-22 15:56:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: No need to change state of the whole image branch - We only need to change the state of the filesink to switch its - saving location. This might still cause some problems of dropping - captured buffers, but it is better than changing the state of - the whole branch. - -2011-06-22 15:37:44 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Use names for image and video encodebin - Naming encodebins as image-encodebin and video-encodebin to make - it easier for debugging camerabin2. - -2011-06-17 17:26:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Remove unused variable - -2011-06-17 14:32:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Adds new test to check image location correctness - This new test checks that images are saved with the filename setting - on location on the moment of the start-capture - -2011-06-15 08:20:31 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Minor debug message fix - -2011-05-13 11:25:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - examples: camerabin2: Adds performance measurement to gst-camerabin2-test - Adds performance (timing) measure feature to gst-camerabin2-test, it allows - users to specify some target values for commonly measured times and the - application will print out a table of values at the end of its execution - with the measured times and averages of them. - -2011-06-22 10:13:38 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - legacyh264parse: create correct avc codec-data - Fixes #653013. - -2011-06-21 12:45:31 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - legacyh264parse: fix output caps alignment for avc input - ... particularly when splitting packetized input. - Fixes #652995. - -2011-06-21 12:43:41 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: avc input must either pass-through or be split into bytestream chunks - ... since parsing code is not meant to receive avc data. - Fixes #653087. - -2011-06-21 12:41:47 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: avoid bogus frame parsing state - -2011-06-20 12:47:39 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/DeckLinkAPI.h: - * sys/decklink/DeckLinkAPIDispatch.cpp: - decklink: update DeckLink API wrappers - -2011-06-20 00:38:05 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklink: Add connection type - -2011-06-05 21:19:58 -0700 Rafael Diniz <rafael@riseup.net> - - * sys/decklink/capture.cpp: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksink.h: - decklinksink: Add audio support - Signed-off-by: David Schleef <ds@schleef.org> - -2011-06-05 21:24:58 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/capture.cpp: - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklink.h: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksink.h: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklink: Add various features - Better mode support, input source property, audio support. - -2011-06-05 21:24:39 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/capture.cpp: - decklink: remove unused code - -2011-06-05 21:17:04 -0700 David Schleef <ds@schleef.org> - - * sys/decklink/DeckLinkAPIDispatch.cpp: - * sys/decklink/capture.cpp: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - decklink: reindent - -2011-06-17 16:12:00 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: only free the index array if it exists - Only free the array if it exists. - Contains an unrelated indentation fix, courtesy of gst-indent - -2011-06-18 01:11:05 +1000 Jan Schmidt <thaytan@noraisin.net> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - update docs generated files - -2011-06-18 01:09:51 +1000 Jan Schmidt <thaytan@noraisin.net> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-rtmp.xml: - * ext/rtmp/Makefile.am: - * ext/rtmp/gstrtmp.c: - * ext/rtmp/gstrtmpsink.c: - * ext/rtmp/gstrtmpsink.h: - * ext/rtmp/gstrtmpsrc.c: - RTMP: add rtmpsink element for output to an RTMP server - -2011-06-16 17:17:07 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/pipelines/colorspace.c: - tests: add colorspace unit test - Compares colorspace result with ffmpegcolorspace output using SSIM. - Also probes for possible crashes for odd width and height image by applying - all possible colorspace transformations. - -2011-06-17 12:10:06 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstcompare.c: - * gst/debugutils/gstcompare.h: - debugutils: add compare element - -2011-06-15 18:20:48 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/colorspace/colorspace.c: - colorspace: fix odd width and height handling in some fastpath cases - -2011-06-16 19:06:03 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/shmpipe.h: - shm: Improve documentation of internal shmpipe - -2011-06-15 16:32:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - * gst/colorspace/Makefile.am: - * gst/colorspace/colorspace.c: - * gst/colorspace/colorspace.h: - * gst/colorspace/colorspace.vcproj: - * gst/colorspace/gstcolorspace.c: - * gst/colorspace/gstcolorspace.h: - * gst/colorspace/gstcolorspaceorc-dist.c: - * gst/colorspace/gstcolorspaceorc-dist.h: - * gst/colorspace/gstcolorspaceorc.orc: - Moved 'colorspace' from -bad to -base - -2011-06-15 16:06:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - Conflicts: - android/aacparse.mk - android/amrparse.mk - android/h264parse.mk - android/metadata.mk - android/qtmux.mk - android/sdpelem.mk - configure.ac - gst/qtmux/gstqtmux.c - win32/common/config.h - -2011-06-13 11:12:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/wininet/gstwininetsrc.c: - wininetsrc: don't use G_CONST_RETURN - It's going to be deprecated really soon. - -2011-06-12 12:55:40 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/videoparsers/gstmpegvideoparse.c: - videoparsers: Speed up the start code search algorithm - Based on 96a7f9c8b1195129f0c2157cbbcbaa6cab45056e - Makes it 3-4 times faster - -2011-06-12 12:40:15 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/videoparsers/gstmpegvideoparse.c: - videoparsers: Fix sink pad template - no wonder it was never picked up ... - -2011-06-12 11:27:30 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Don't free unexistent PAT - And cleanup find_timestamps a bit - -2011-05-18 19:33:45 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/tsdemux.c: - tsdemux: More fixes to handle non-188 byte packets - -2011-05-15 14:04:45 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/payload_parsers.c: - * gst/mpegtsdemux/payload_parsers.h: - * gst/mpegtsdemux/tsdemux.c: - mpegts: Stop scanning for keyframes as early as possible - -2011-03-31 14:36:02 +0200 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: always try to seek for to a keyframe - keyframe is expected to lie in the the next ~2500 ms - -2011-03-23 18:50:25 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: fix timestamps in newsegement event after seeking - -2011-03-30 11:26:18 +0200 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/payload_parsers.c: - * gst/mpegtsdemux/payload_parsers.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: payload parsing for H.264 - -2011-03-28 10:20:43 +0200 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/payload_parsers.c: - * gst/mpegtsdemux/payload_parsers.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: implement key_unit seeking for MPEG2 video - -2011-03-22 16:49:13 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: accurate seeking - * pes header parsing for pts is ugly, refactor - * timestamps/newsegment after seeking is still off - -2011-02-22 12:33:56 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - mpegtsdemux: push based seeking based on PCR - buffer timestamps are converted to GstClockTime to cover pcr/pts wraps. - multiple pcr/pts wraps are handled with an index which ensures at most - a single pcr wraparound between two entries. - the last seen pcr is recorded to have a nearby index point for short seeks - resuming playback might be delayed if the postion is not a keyframe - TODO: replace manual packet scanning and parsing in the initial duration estimation - -2011-02-23 15:21:22 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: create function for pcr parsing - -2011-04-11 14:53:28 +0200 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtsdemux: adaptation field length == 0 is valid - it can be used to insert a single stuffing byte - do not parse the following payload as adaptation field - -2011-06-07 14:14:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - Add gst/invtelecine to CRUFT_DIRS - -2011-06-07 13:44:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: require GLib >= 2.24 - Make implicit requirement explicit. - -2011-06-06 15:23:22 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/baseaudiovisualizer.c: - tests: add a test for baseaudiovisualizer - -2011-06-06 15:20:30 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - baseaudiovisualizer: fix last block condition - Also push out the last frame if we have exact amount of samples. Fix the adapter - flushing to not cause endless loops. Drop a redundant avail() check. - -2011-06-04 20:41:49 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/audiovisualizers/README: - audiovisualizers: add a README with comments and plans - -2011-06-04 20:34:20 +0300 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-camerabin2.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-decklink.xml: - * docs/plugins/inspect/plugin-divxdec.xml: - * docs/plugins/inspect/plugin-divxenc.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faceoverlay.xml: - * docs/plugins/inspect/plugin-fieldanalysis.xml: - * docs/plugins/inspect/plugin-fragmented.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-linsys.xml: - * docs/plugins/inspect/plugin-lv2.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-patchdetect.xml: - * docs/plugins/inspect/plugin-sdi.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-timidity.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-video3d.xml: - * docs/plugins/inspect/plugin-videofiltersbad.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-xvid.xml: - docs: update inspect files - -2011-06-04 16:12:40 +0300 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-audiovisualizers.xml: - docs: add new audiovisualizers to the plugin docs - -2011-06-04 15:56:15 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstwavescope.c: - audiovisualizers: remove some not needed boilerplate - -2011-06-04 15:52:44 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/audiovisualizers/Makefile.am: - * gst/audiovisualizers/gstspacescope.c: - * gst/audiovisualizers/gstspacescope.h: - * gst/audiovisualizers/plugin.c: - audiovisualizers: add a spacescope element - Add another element that maps left/right channel to x,y coordinates. - -2011-06-04 15:38:46 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/audiovisualizers/gstsynaescope.c: - synaescope: tweak the algorithm - Speed-up the calculation a bit. Keep a few values as doubles. Tune the scaling - to get nices colors. - -2011-06-04 14:37:04 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstsynaescope.c: - audiovisualizers: doc-blob and comment updates - -2011-06-04 14:33:29 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/audiovisualizers/Makefile.am: - * gst/audiovisualizers/gstbaseaudiovisualizer.c: - * gst/audiovisualizers/gstbaseaudiovisualizer.h: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstspectrascope.h: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstsynaescope.h: - * gst/audiovisualizers/gstwavescope.c: - * gst/audiovisualizers/gstwavescope.h: - audiovisualizers: rename baseclass from basescope to baseaudiovisualizer - -2011-06-04 14:25:57 +0300 Stefan Kost <ensonic@users.sf.net> - - * configure.ac: - * gst/audiovisualizers/Makefile.am: - * gst/audiovisualizers/gstbasescope.c: - * gst/audiovisualizers/gstbasescope.h: - * gst/audiovisualizers/gstspectrascope.c: - * gst/audiovisualizers/gstspectrascope.h: - * gst/audiovisualizers/gstsynaescope.c: - * gst/audiovisualizers/gstsynaescope.h: - * gst/audiovisualizers/gstwavescope.c: - * gst/audiovisualizers/gstwavescope.h: - * gst/audiovisualizers/plugin.c: - audiovisualizers: rename scopes plugin to audiovisualizers - -2011-05-31 14:42:55 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/scopes/gstspectrascope.c: - * gst/scopes/gstsynaescope.c: - scopes: fix elements descriptions - -2011-05-30 23:45:17 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/scopes/gstspectrascope.c: - spectrascope: use add_pixel for non-white pixels - https://bugzilla.gnome.org/show_bug.cgi?id=651536 - -2011-05-30 23:36:42 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/scopes/Makefile.am: - * gst/scopes/gstsynaescope.c: - * gst/scopes/gstsynaescope.h: - * gst/scopes/plugin.c: - scopes: add a new element similar to synaesthesia - https://bugzilla.gnome.org/show_bug.cgi?id=651536 - -2011-05-28 23:22:59 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/scopes/gstspectrascope.c: - * gst/scopes/gstwavescope.c: - scopes: draw pixels with signle 32bit writes - https://bugzilla.gnome.org/show_bug.cgi?id=651536 - -2011-05-28 14:36:51 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/scopes/gstbasescope.c: - * gst/scopes/gstbasescope.h: - basescope: add more shading effects - https://bugzilla.gnome.org/show_bug.cgi?id=651536 - -2011-05-28 14:08:05 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/scopes/gstbasescope.c: - * gst/scopes/gstbasescope.h: - basescope: add a property to modify the ammount of shading - Add another property to specify the shading per color channel. Fix endianess - issues in the shading code. - https://bugzilla.gnome.org/show_bug.cgi?id=651536 - -2011-05-27 23:25:00 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/scopes/Makefile.am: - * gst/scopes/gstbasescope.c: - * gst/scopes/gstbasescope.h: - * gst/scopes/plugin.c: - basescope: add a backbuffer and apply shading effects - Keep the last frame and apply shade and geometry effects. Expose the shading - effects as a controllable gobject property on the baseclass. - https://bugzilla.gnome.org/show_bug.cgi?id=651536 - -2011-05-27 23:12:00 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/scopes/gstbasescope.c: - * gst/scopes/gstbasescope.h: - * gst/scopes/gstspectrascope.c: - basescope: allow subclasses telling how many sample they need per frame - This allows e.g. FFT based elements to require enough data. If they need more - data than what we get, we flush less from the adapter. - https://bugzilla.gnome.org/show_bug.cgi?id=651536 - -2011-05-27 22:53:10 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/scopes/gstbasescope.c: - basescope: remove some comments - Those comments where pointing to example calls that we do in the subclass. - https://bugzilla.gnome.org/show_bug.cgi?id=651536 - -2011-05-27 14:43:51 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/scopes/Makefile.am: - * gst/scopes/gstspectrascope.c: - * gst/scopes/gstspectrascope.h: - * gst/scopes/plugin.c: - scopes: add a simple fft based scope - Add a 2nd demo scope that uses a fft. - https://bugzilla.gnome.org/show_bug.cgi?id=651536 - -2011-05-27 11:14:19 +0300 Stefan Kost <ensonic@users.sf.net> - - * configure.ac: - * gst/scopes/Makefile.am: - * gst/scopes/gstbasescope.c: - * gst/scopes/gstbasescope.h: - * gst/scopes/gstwavescope.c: - * gst/scopes/gstwavescope.h: - * gst/scopes/plugin.c: - scopes: first version of a scopes plugin using a new baseclass - Add a new baseclass for writing visualisation plugins. Provide a simple wave - oscilloscope as a first subclass. - https://bugzilla.gnome.org/show_bug.cgi?id=651536 - -2011-04-29 13:33:43 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegvideoparse/mpegvideoparse.c: - mpegvideoparse: Avoid double scanning of pictures - The incoming data has already been scanned in mpeg_packetizer_add_buf. - We can therefore stop scanning for picture data as soon as we've parsed - the header. Makes mpegvideoparse 2 times faster. - https://bugzilla.gnome.org/show_bug.cgi?id=648933 - -2011-06-05 13:56:08 -0700 Levente Farkas <lfarkas@lfarkas.org> - - * sys/directdraw/gstdirectdrawplugin.c: - directdrawsink: lower rank to secondary - Signed-off-by: David Schleef <ds@schleef.org> - -2011-06-05 13:38:46 -0700 Levente Farkas <lfarkas@lfarkas.org> - - * sys/d3dvideosink/directx/dx.h: - d3dvideosink: compile fix - Signed-off-by: David Schleef <ds@schleef.org> - -2011-06-05 10:34:28 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/invtelecine/Makefile.am: - * gst/invtelecine/gstinvtelecine.c: - invtelecine: Remove in favor of fieldanalysis - -2011-06-04 18:54:16 -0700 David Schleef <ds@schleef.org> - - * sys/directdraw/gstdirectdrawsink.c: - directdrawsink: Handle pixel-aspect-ratio - Fixes: #651779. From Raimo Järvi. - -2011-06-04 18:43:45 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * sys/Makefile.am: - * sys/d3dvideosink/Makefile.am: - * sys/d3dvideosink/d3dvideosink.c: - * sys/d3dvideosink/d3dvideosink.h: - * sys/d3dvideosink/directx/d3d.c: - * sys/d3dvideosink/directx/d3d.h: - * sys/d3dvideosink/directx/directx.h: - * sys/d3dvideosink/directx/directx10/dx10.c: - * sys/d3dvideosink/directx/directx10/dx10.h: - * sys/d3dvideosink/directx/directx10/dx10_d3d.c: - * sys/d3dvideosink/directx/directx10/dx10_d3d.h: - * sys/d3dvideosink/directx/directx11/dx11.c: - * sys/d3dvideosink/directx/directx11/dx11.h: - * sys/d3dvideosink/directx/directx11/dx11_d3d.c: - * sys/d3dvideosink/directx/directx11/dx11_d3d.h: - * sys/d3dvideosink/directx/directx9/dx9.c: - * sys/d3dvideosink/directx/directx9/dx9.h: - * sys/d3dvideosink/directx/directx9/dx9_d3d.c: - * sys/d3dvideosink/directx/directx9/dx9_d3d.h: - * sys/d3dvideosink/directx/dx.c: - * sys/d3dvideosink/directx/dx.h: - d3dvideosink: Add plugin - Fixes #651782. Patch from various authors, by way of ossbuild. - -2011-06-04 14:04:44 -0700 David Schleef <ds@schleef.org> - - * gst/liveadder/liveadder.c: - * gst/mxf/mxfmux.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - Work around changes in g_atomic API - See #651514 for details. - -2011-06-04 13:51:20 -0700 David Schleef <ds@schleef.org> - - * sys/vdpau/h264/gsth264frame.c: - vdpau: remove old glib compatibility code - -2011-06-03 19:36:59 -0700 David Schleef <ds@schleef.org> - - * ext/vp8/gstvp8dec.c: - vp8dec: set par to 1/1 - -2011-06-03 19:36:12 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: Better handling of invalid par - -2011-05-30 17:03:14 -0700 David Schleef <ds@schleef.org> - - * gst/videofilters/gstvideofilter2.c: - videofilter2: Fix copyright - -2011-06-04 20:35:03 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvdspu/gstspu-pgs.c: - * gst/invtelecine/gstinvtelecine.c: - * gst/jpegformat/gstjpegparse.c: - * gst/librfb/rfbdecoder.c: - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstpesfilter.c: - * gst/mpegdemux/mpegtspacketizer.c: - gst: some more unused-but-set-variable warning fixes - -2011-05-30 17:54:26 +0530 Debarshi Ray <rishi@gnu.org> - - * ext/cog/gstcogdownsample.c: - * ext/cog/gstcogscale.c: - * ext/cog/gstcolorconvert.c: - * ext/cog/gstlogoinsert.c: - * gst/nsf/gstnsf.c: - * gst/patchdetect/gstpatchdetect.c: - * gst/sdi/gstsdidemux.c: - * gst/sdi/gstsdimux.c: - * gst/videofilters/gstscenechange.c: - * gst/videofilters/gstvideofilter2.c: - * gst/videofilters/gstzebrastripe.c: - * gst/videoparsers/gstdiracparse.c: - * gst/y4m/gsty4mdec.c: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksrc.cpp: - * sys/fbdev/gstfbdevsink.c: - * sys/linsys/gstlinsyssdisink.c: - * sys/linsys/gstlinsyssdisrc.c: - Remove unused but set variables - This is needed to satisfy the new -Wunused-but-set-variable added in - GCC 4.6: http://gcc.gnu.org/gcc-4.6/changes.html - -2011-05-09 14:35:42 -0300 Luciana Fujii Pontello <luciana.fujii@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - camerabin2: Adding a filter to wrappercamerabinsrc - Camerabin2 allows setting a filter for image, video or viewfinder, but - not one filter for all three at the same time. I added a filter to - wrappercamerabinsrc to allow setting a global filter when using this - source. - https://bugzilla.gnome.org/show_bug.cgi?id=649822 - -2011-05-26 00:09:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: remove unused var - -2011-05-25 23:29:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * tests/check/elements/camerabin2.c: - * tests/examples/camerabin2/gst-camerabin2-test.c: - camerabin2: Use full names in properties - Improve API by using source instead of src in properties - -2011-05-23 13:36:27 +0300 Teemu Katajisto <teemu.katajisto@digia.com> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: do not unref pad template - -2011-05-29 13:16:21 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * configure.ac: - configure.ac: fix avc check so that it tries to link to AVCVideoServices - Avoids avc plugin from being built when AVCVideoServices is not installed - -2011-05-26 12:23:01 +0300 Lasse Laukkanen <lasse.laukkanen@digia.com> - - * tests/examples/camerabin/gst-camerabin-test.c: - examples: camerabin: Add --image-formatter command-line option - Add command-line option to gst-camerabin-test for configuring camerabin - metadata formatter element. - -2011-05-31 13:08:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/faac.c: - faac: Fix unit test after latest faac changes - -2011-05-31 12:55:45 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Fix scanning on small files - We were previously: - * Stopping early in the initial PCR scan - * Giving a negative offset for the second PCR scan - -2011-05-31 12:54:43 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Don't call program_stopped with a NULL program - -2011-05-19 12:55:30 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - legacyh264parse: Delay pushing buffers until we have width/height - -2011-05-27 11:13:08 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/zbar/gstzbar.c: - zbar: remove template stamp comment - -2011-05-30 23:43:39 -0700 David Schleef <ds@schleef.org> - - * gst/bayer/Makefile.am: - * gst/bayer/gstbayer2rgb.c: - * gst/bayer/gstbayerorc-dist.c: - * gst/bayer/gstbayerorc-dist.h: - * gst/bayer/gstbayerorc.orc: - bayer2rgb: Convert to Orc - Seriously faster. Algorithm is nearly the same as bilinear, which - given the speed of this code, should be considered the baseline of - quality. Speed appears to be limited by memory bandwidth, so I - didn't bother trying to make it any faster. - -2011-05-30 16:56:33 -0700 David Schleef <ds@schleef.org> - - * gst/bayer/gstbayer2rgb.c: - bayer2rgb: Rewrite signal processing. Much faster. - -2011-05-30 17:54:26 +0530 Debarshi Ray <rishi@gnu.org> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst/camerabin/gstcamerabin.c: - Remove unused but set variables - This is needed to satisfy the new -Wunused-but-set-variable added in - GCC 4.6: http://gcc.gnu.org/gcc-4.6/changes.html - -2011-05-30 13:01:54 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/dvdspu/gstdvdspu.c: - Revert "dvdspu: Fix pad templates" - This reverts commit 732828e31cbace59e6ce4f262b8339e43ed0c631. - It was in fact an issue in core - -2011-05-30 13:01:20 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Protect against program being removed - -2011-05-30 12:27:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/faceoverlay/Makefile.am: - faceoverlay: Add gst-plugins-base CFLAGS and LIBS to fix compilation - -2011-05-30 12:24:31 +0200 Laura Lucas Alday <lauralucas@gmail.com> - - * configure.ac: - * gst/faceoverlay/Makefile.am: - * gst/faceoverlay/gstfaceoverlay.c: - * gst/faceoverlay/gstfaceoverlay.h: - faceoverlay: Add element that displays an SVG image over a detected face - Fixes bug #642759. - -2011-05-30 08:48:29 +0200 Tom Deseyn <tom.deseyn@barco.com> - - * ext/directfb/dfbvideosink.c: - dfbvideosink: Also consider non-accelerated DirectFB surfaces - Fixes bug #631390. - -2010-09-02 23:31:23 +0300 Martin Storsjo <martin@martin.st> - - * sys/qtwrapper/audiodecoders.c: - qtwrapper: Decode audio until all input data is consumed - The special return value is returned from our buffer callback - when all input data has been consumed. - -2011-05-03 14:14:20 +0300 Martin Storsjo <martin@martin.st> - - * sys/qtwrapper/audiodecoders.c: - qtwrapper: Replace the hackish 42 magic number with a define - -2011-05-30 08:43:59 +0200 Julien MOUTTE <julien@moutte.net> - - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowaudiodec.h: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.h: - dshowdecwrapper: Fix COM initialization - Fixes bug #625190. - -2011-05-30 08:43:40 +0200 Julien MOUTTE <julien@moutte.net> - - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowutil.h: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - dshowdecwrapper: Fix element registration using data in the type instead of a global - -2011-05-29 18:16:49 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: Fix pad templates - Our caps intersection code is a bit too touchy about what an element - returns compared to its pad templates. - -2011-05-29 13:05:31 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/videoparsers/h264parse.c: - h264parse: check for out of range pps_id one layer up - -2011-05-29 13:03:38 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - * gst/videoparsers/gstmpegvideoparse.c: - mpeg4videoparse: fix compiler warnings - -2011-05-29 12:54:40 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/h264parse/gsth264parse.c: - legacyh264parse: check for out of range pps_id one layer up - Fixes compiler warning comparing guint8 and MAX_PPS_COUNT which is > G_MAXUINT8 - -2011-05-27 11:05:46 +0100 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - * gst/debugutils/Makefile.am: - Fix missing header file and update spec to work around current compiler issues - -2011-05-27 10:44:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/faac/Makefile.am: - faac: fix CFLAGS and LIBS order in Makefile.am - -2011-05-27 10:44:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: Set the correct, valid sample rates in the pad template caps - -2011-05-27 10:41:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: Make sure to also return only a subset of the pad template caps in getcaps - -2011-05-27 10:35:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: Set the correct, valid sample rates in the pad template caps - -2011-05-27 10:32:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: The encoder library currently only supports 1 or 2 channels - -2011-05-27 10:31:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/voaacenc/Makefile.am: - * ext/voaacenc/gstvoaacenc.c: - voaacenc: Add profile and level to the caps - Fixes bug #650595. - -2011-05-27 10:11:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faac/Makefile.am: - * ext/faac/gstfaac.c: - * ext/faac/gstfaac.h: - faac: Add the profile and level to the caps - Also negotiate the profile from the downstream peer caps - instead of using a property. - Fixes bug #650594. - -2011-05-27 09:40:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: Use PROP_ instead of ARG_ for the property enums - -2011-05-26 09:59:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/debugutils/gstdebugspy.c: - debugspy: Use G_PARAM_STATIC_STRINGS - -2011-01-14 17:42:50 +0100 Guillaume Emont <gemont@igalia.com> - - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstdebugspy.c: - * gst/debugutils/gstdebugspy.h: - debugspy: add new element - This element allows you to get information about buffers with bus messages. It - provides the same kind of information as identity does through a notify signal - on a string property, but in a more programmer-friendly way. - -2011-05-26 09:46:58 +0200 Gabriel Strimtu <gabrielstrimtu@yahoo.com> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: Fix parsing of PSI table IDs - Fixes bug #635917. - -2011-05-26 09:22:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/dc1394/gstdc1394.c: - dc1394src: Implement LATENCY query - Based on the LATENCY query code in v4l2src and the patch - by Tristan Matthews. Fixes bug #625520. - -2011-05-25 23:14:27 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/check/Makefile.am: - tests: blacklist more sys elements from the state tests - Also wrap the list of blacklisted elements and trim some whitespace. - -2011-05-25 23:13:17 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - lv2: ensure uniqe property names - Copy and adjust the code from ladspa plugin to ensure unique gobject property - names. - -2011-05-25 20:52:09 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/h263parse.c: - * tests/check/elements/h264parse.c: - * tests/check/elements/mpeg4videoparse.c: - * tests/check/elements/mpegvideoparse.c: - tests: add unit tests for a number of video parsers - -2011-05-25 20:49:05 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/parser.c: - tests: additional offset tracking in parser test helper - -2011-05-25 20:48:38 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/parser.c: - * tests/check/elements/parser.h: - tests: additional parameterization for parser test helper - Allow context callbacks to perform custom buffer verification - and custom element setup. Also move some static tracking variables - into helper struct and expose the latter struct for use by unit test - (callbacks). - -2011-05-25 15:26:05 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: plug some more buffer leaks - -2011-05-25 13:53:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: compensate for skipped bytes in parsing state offsets - -2011-05-25 13:53:21 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix clearing adapter forming avc output frame - ... which needs to be reset upon a new frame and otherwise (only) - for avc input in passthrough mode (rather than on every chain call). - -2011-05-25 11:50:07 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/h264parse.c: - * gst/videoparsers/h264parse.h: - h264parse: handle all valid pps_id - ... which are in range 0-255. - -2011-05-15 13:23:39 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/videoparsers/gsth264parse.c: - h264parse: allow full negotiation for packetized input - ... by defaulting to allow splitting packetized input and having - negotiation with downstream deciding whether or not this applies. - Also enable pass-through parsing mode if input and output format - (stream-format and alignment) match. - API: GstH264Parse:split-packetized (removed) - Fixes #650228. - -2011-05-24 21:50:52 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/h263parse.c: - h263parse: also extract width and height into caps - -2011-04-21 22:42:45 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * tests/check/elements/jpegparse.c: - jpegparse: unit test for APP1/exif & comment parsing - https://bugzilla.gnome.org/show_bug.cgi?id=648478 - -2011-05-25 14:42:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * ext/mpeg2enc/gstmpeg2encoder.cc: - mpeg2enc: fix build with 1.9.0 release again after recent fixes for mjpegtools 2.0.0 - https://bugzilla.gnome.org/show_bug.cgi?id=650970 - -2011-05-25 15:10:19 +0200 Andreas Frisch <fraxinas@opendreambox.org> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: fix pointer output in stream-not-associated debug output - https://bugzilla.gnome.org/show_bug.cgi?id=651050 - -2011-05-24 15:42:44 +0200 Götz Waschk <waschk@mandriva.org> - - * ext/mpeg2enc/gstmpeg2encoder.cc: - mpeg2enc: support mjpegtools 2.0 - This adds conditional includes for the renamed headers in mjpegtools 2.0. - Fixes: #650970. - -2011-05-23 17:29:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/xvid/gstxviddec.c: - xviddec: Add video/mpeg,mpegversion=4 to the caps - Fixes bug #609639. - -2011-05-20 17:06:49 +0300 Lasse Laukkanen <lasse.laukkanen@digia.com> - - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinimage.h: - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin.c: - * tests/check/elements/camerabin.c: - camerabin: Add image-formatter property - Add image-formatter property in order to let application configure - the formatter element for metadata. - -2011-05-23 13:54:35 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4parse.c: - mpeg4videoparse: additional debug tracing - -2011-05-23 12:06:01 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstmpegvideoparse.c: - * gst/videoparsers/gstmpegvideoparse.h: - * gst/videoparsers/mpegvideoparse.c: - * gst/videoparsers/mpegvideoparse.h: - * gst/videoparsers/plugin.c: - videoparsers: add new mpegvideoparse - -2011-05-23 12:02:00 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpegvideoparse/mpegvideoparse.c: - mpegvideoparse: rename to legacympegvideoparse - -2011-05-18 09:47:43 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: avoid stale parsing state - -2011-05-17 22:42:45 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth263parse.c: - h263parse: simplify minimum frame size handling - -2011-05-17 22:42:29 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: simplify minimum frame size handling - -2011-05-17 22:39:19 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: simplify minimum frame size handling - -2011-05-17 22:18:51 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: avoid stale parsing state - -2011-05-12 12:07:39 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpeg4videoparse/Makefile.am: - * gst/mpeg4videoparse/mpeg4parse.c: - * gst/mpeg4videoparse/mpeg4parse.h: - * gst/mpeg4videoparse/mpeg4videoparse.c: - * gst/mpeg4videoparse/mpeg4videoparse.h: - mpeg4videoparse: port to baseparse - -2011-05-23 15:03:18 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - configure.ac: bump -core/-base requirement to 0.10.34.1 - ... since latest baseparse API is required for videoparsers. - -2011-05-23 14:41:27 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: gracefully handle truncated input NAL units - Rather than assert'ing in such case, emit warning if the length of a NAL unit - is less than expected 2 and discard it. - Based on patch by Benjamin M. Schwartz <bens@alum.mit.edu> - Fixes #650416. - -2011-05-23 16:47:31 +0200 Vincent Génieux <vgenieux@free.fr> - - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - dvbsrc: Add timeout property and use GstPoll instead of poll - This allows to use much higher timeout values because GstPoll - is interruptible and keeps the number of wakeups during signal - loss lower. - Fixes bug #608171. - -2011-05-23 14:58:08 +0100 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk> - - * ext/openal/Makefile.am: - * gst-plugins-bad.spec.in: - fix build of openal plugin from disted tarball - -2011-05-23 15:32:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/teletextdec/gstteletextdec.c: - * ext/teletextdec/gstteletextdec.h: - * ext/teletextdec/teletext.c: - teletextdec: Minor cleanup and indention fixes - -2011-05-23 15:20:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/teletextdec/gstteletextdec.c: - teletextdec: Don't use GST_FLOW_IS_FATAL() - -2011-05-23 15:14:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/teletextdec/gstteletextdec.c: - teletextdec: Fix buffer data leak - -2010-09-10 14:34:42 +0200 Andoni Morales Alastruey <amorales@flumotion.com> - - * ext/teletextdec/gstteletextdec.c: - * ext/teletextdec/gstteletextdec.h: - teletextdec: Add support for pango - https://bugzilla.gnome.org/show_bug.cgi?id=619739 - -2010-06-10 12:44:27 +0200 Andoni Morales Alastruey <amorales@flumotion.com> - - * ext/teletextdec/gstteletextdec.c: - * ext/teletextdec/gstteletextdec.h: - teletextdec: add a new method to convert a page in a list of strings - https://bugzilla.gnome.org/show_bug.cgi?id=619739 - -2010-09-09 16:41:32 +0200 Andoni Morales Alastruey <amorales@flumotion.com> - - * ext/teletextdec/gstteletextdec.c: - teletextdec: add some data in the preroll buffer - https://bugzilla.gnome.org/show_bug.cgi?id=619739 - -2010-06-10 13:55:30 +0200 Andoni Morales Alastruey <amorales@flumotion.com> - - * ext/teletextdec/gstteletextdec.c: - teletextdec: fix deadlock on a stream error - https://bugzilla.gnome.org/show_bug.cgi?id=619739 - -2010-06-10 12:42:42 +0200 Andoni Morales Alastruey <amorales@flumotion.com> - - * ext/teletextdec/gstteletextdec.c: - teletextdec: don't try to push an event on a pad that returned an error - https://bugzilla.gnome.org/show_bug.cgi?id=619739 - -2010-09-13 11:59:18 +0200 Andoni Morales Alastruey <amorales@flumotion.com> - - * configure.ac: - * ext/Makefile.am: - * ext/teletextdec/Makefile.am: - * ext/teletextdec/gstteletextdec.c: - * ext/teletextdec/gstteletextdec.h: - * ext/teletextdec/teletext.c: - teletextdec: New teletext decoder plugin based in zvbi - https://bugzilla.gnome.org/show_bug.cgi?id=619739 - -2011-05-23 14:14:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/openal/Makefile.am: - * ext/openal/gstopenal.c: - * ext/openal/gstopenalsrc.c: - * ext/openal/gstopenalsrc.h: - openal: Add new openalsrc element - Based on patches by Victor Lin <bornstub@gmail.com> - Fixes bug #550230. - -2011-05-23 13:41:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - * ext/openal/Makefile.am: - * ext/openal/gstopenal.c: - * ext/openal/gstopenalsink.c: - * ext/openal/gstopenalsink.h: - openal: Add new OpenAL sink element - Based on a patch by Chris Robinson <chris.kcat@gmail.com> - Fixes bug #615615. - -2011-05-20 15:25:08 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Do not segfault on null locations - Prevent capture from starting when saving location is set to - NULL - -2011-05-20 13:04:54 +0300 Stefan Kost <ensonic@users.sf.net> - - * sys/dvb/camapplicationinfo.c: - camapplicationinfo: fix possible array overrun - -2011-05-20 09:58:50 +0200 Rafael Diniz <rafael@riseup.net> - - * gst/mpegdemux/gstmpegdefs.h: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegptsdemux: Add support for AAC LATM/LOAS streams - Fixes bug #615681. - -2011-05-19 08:05:14 +0200 W. Michael Petullo <mike@flyn.org> - - * ext/apexsink/gstapexraop.c: - * ext/apexsink/gstapexraop.h: - * ext/apexsink/gstapexsink.c: - * ext/apexsink/gstapexsink.h: - apexsink: Add support for generation 2 AirTunes hardware - Fixes bug #649931. - -2011-05-20 00:35:55 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/mxf/mxfdemux-structure.c: - mxf-example: fix the { } scope - -2011-05-20 00:20:07 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/festival/gstfestival.c: - festival: don't leak fd on error - -2011-05-20 00:16:00 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/librfb/vncauth.c: - librfb: don't leak password on error - -2011-05-19 23:57:38 +0300 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/Makefile.am: - docs: remove obsolete commented out part - We don't have this in the other modules and its not needed. - -2011-05-19 23:50:47 +0300 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - docs: update plugin introspection data - Now more files are merged and produced in a canonical fashion, which hopefully - creates less or no delta in the future. - -2011-05-19 22:58:10 +0300 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 9e5bbd5 to 69b981f - -2011-05-19 14:58:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - camerabin2: examples: Add video-device argument - Adds an argument to select which video device should be used - on the video source element in camerabin2 - -2011-05-19 14:52:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - camerabin2: examples: Fix typo from previous commit - The property is audio-src and not audio-source - -2011-05-19 14:32:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - camerabin2: examples: Add audio-source parameter to gst-camerabin2-test - Adds an option to select the audio source to be used on video - recordings on camerabin2 test application - -2011-05-19 14:23:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * configure.ac: - configure: add missing - Adds missing to configure on the CDAUDIO pkg config check - -2011-05-19 18:45:25 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/jp2k/gstjasperenc.c: - jasperenc: remove unused 'mimetype' variable - As mimetype is not used, we don't need to fetch it and therefore neither need - the structure s. - -2011-05-19 15:26:38 +0100 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - Update spec file to fit with latest upstream spec files - -2011-05-18 15:44:06 -0400 Olivier Crête <olivier.crete@collabora.com> - - * sys/shm/gstshmsink.c: - * sys/shm/shmpipe.c: - shm: Make gcc 4.6 happy - Remove warnings due to initialized but never used warnings - -2011-05-18 13:35:34 -0700 David Schleef <ds@schleef.org> - - * gst/h264parse/gsth264parse.h: - h264parse: max pps is 255 - Fixes #650484. - -2011-05-12 22:54:44 +0300 Brian Gitonga Marete <marete@toshnix.com> - - * sys/decklink/gstdecklinksrc.h: - decklink: Change counters to 64 bit unsigned integers. - -2011-05-10 16:14:32 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - configure: switch libcdaudio to pkg-config - -2011-04-24 19:11:36 -0700 David Schleef <ds@schleef.org> - - * gst/mpegtsmux/mpegtsmux_aac.c: - * gst/mpegtsmux/mpegtsmux_h264.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: use gst debug for tsmux library - -2011-04-19 15:04:05 -0400 Quentin Smith <quentin@mit.edu> - - * sys/avc/gstavcsrc.cpp: - avc: avcsrc is always enabled - -2011-04-19 15:01:15 -0400 Quentin Smith <quentin@mit.edu> - - * sys/avc/gstavcsrc.cpp: - avc: Include 200 bus cycles in each buffer (about 300 TS packets) - -2011-04-19 15:00:53 -0400 Quentin Smith <quentin@mit.edu> - - * sys/avc/gstavcsrc.cpp: - avc: Emit a single buffer per callback - -2011-04-19 13:53:54 -0400 Quentin Smith <quentin@mit.edu> - - * sys/avc/gstavcsrc.cpp: - * sys/avc/gstavcsrc.h: - avc: Track the number of enqueued and dequeued packets - -2011-04-19 13:53:23 -0400 Quentin Smith <quentin@mit.edu> - - * sys/avc/gstavcsrc.cpp: - avc: Dump timestamp information - -2011-04-18 15:37:57 -0400 Quentin Smith <quentin@mit.edu> - - * sys/avc/gstavcsrc.cpp: - * sys/avc/gstavcsrc.h: - avc: Save AVC objects in the GstAVCSrc object - and stop them when the pipeline is stopped - -2011-04-18 15:16:00 -0400 Quentin Smith <quentin@mit.edu> - - * sys/avc/gstavcsrc.cpp: - avc: Cycle and packet are unsigned - -2011-04-18 15:15:28 -0400 Quentin Smith <quentin@mit.edu> - - * sys/avc/gstavcsrc.cpp: - avc: avcsrc is a live source - -2011-04-18 15:14:55 -0400 Quentin Smith <quentin@mit.edu> - - * sys/avc/Makefile.am: - avc: Look in AVCVideoServices for headers - -2011-04-18 12:28:52 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - avc: attempt new configure - -2011-04-16 19:42:00 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * sys/Makefile.am: - * sys/avc/Makefile.am: - * sys/avc/gstavcplugin.cpp: - * sys/avc/gstavcsrc.cpp: - * sys/avc/gstavcsrc.h: - avc: Add AVC Video Services plugin for OS/X - -2011-05-18 16:10:40 +0300 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From fd35073 to 9e5bbd5 - -2011-05-18 13:27:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Name max/min quantizer properties {max,min}-quantizer - Also improve quality property description. - -2011-05-18 13:26:23 +0200 Alexey Fisher <bug-track@fisher-privat.net> - - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - vp8enc: Add properties to select a maximum and minimum quantizer - Fixes bug #641405. - -2011-05-18 13:18:58 +0200 Alexey Fisher <bug-track@fisher-privat.net> - - * ext/vp8/gstvp8enc.c: - vp8enc: Fix quality to (constant) quantizer mapping - This now allows to select all possible quantizers between - 0 and 63. - See bug #641405. - -2011-05-18 12:24:47 +0300 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 46dfcea to fd35073 - -2011-04-28 15:59:38 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/mplex/gstmplex.cc: - * gst/adpcmdec/adpcmdec.c: - * gst/adpcmenc/adpcmenc.c: - * gst/geometrictransform/gstfisheye.c: - * gst/geometrictransform/gstmirror.c: - * gst/geometrictransform/gstsquare.c: - * gst/mpegtsdemux/tsdemux.c: - * sys/shm/gstshmsrc.c: - various: fix author tag in element details - -2011-04-27 16:56:09 +0300 Stefan Kost <ensonic@users.sf.net> - - * tools/element-templates/audiofilter: - element-templates: improve the audiofilter template - Add comments. Add start/stop methods. Add (commented) instance casts at the - begin of the method. Make transform_ip returning FLOW_OK by default. - -2011-04-27 16:51:55 +0300 Stefan Kost <ensonic@users.sf.net> - - * tools/gst-element-maker: - element-maker: improve plugin_init() - Return the result of gst_element_register(). Use the TYPE macro instead of the - _get_type() function. - -2011-05-12 11:57:19 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: fix some buffer leaks - Fixes #650323. - -2011-05-12 11:56:52 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: fixup boilerplate and debug code style - -2011-05-13 17:18:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/Makefile.am: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstimagecapturebin.c: - * gst/camerabin2/gstimagecapturebin.h: - * gst/camerabin2/gstplugin.c: - * tests/check/Makefile.am: - * tests/check/elements/imagecapturebin.c: - camerabin2: Remove obsolete imagecapturebin - imagecapturebin has been replaced by encodebin, no need - for it anymore - -2011-05-13 16:27:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: use jpeg as a container to force jifmux usage - Jifmux should be used as it can do xmp/exif tagging, so this patch - sets jpeg as a container to force it to be used together with - a jpeg encoder - -2011-05-12 11:17:28 +0000 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: do proper EOS handling on send_event(eos) - We first let the inner camera EOS. Then we manually post EOS on the image and - video sinks if those are <= READY and so have ignored EOS events. - -2011-04-28 15:11:36 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * tests/check/elements/camerabin2.c: - camerabin2: use encodebin to encode images - -2011-05-13 15:16:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjpegformat.c: - jifmux: Bump rank to secondary - jifmux is being used for quite some time and has no open bugs - currently, so we can give it a secondary rank at least. - Fixes #649391 - -2011-05-13 15:15:53 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - jifmux: Change class to formatter - jifmux is a formatter and not a muxer - Fixes #649391 - -2011-05-13 09:11:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - examples: camerabin2: Fix GOptionEntry array - Use no flags instead of passing G_OPTION_ARG_OPTIONAL to options that - must have an argument - -2011-05-12 11:39:51 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin2/Makefile.am: - camerabin2: examples: build fixes - Add some missing dependencies - -2011-05-11 18:35:40 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Changing how some properties work - Some properties (like viewfinder-filter) only are taken into use - on NULL->READY transitions and the get/set property was returning - the currently in use value, instead of the last set. - This is bad, as after setting 'a' to 'x', you expect that getting 'a' - will return 'x'. This patch fixes it. - If needed, later we could add current-* properties that are readonly - and get the current value in use. - -2011-04-29 08:54:56 -0300 Lasse Laukkanen <lasse.laukkanen@digia.com> - - * gst/camerabin2/PORTING: - camerabin2: Updating PORTING file - -2011-04-28 16:05:53 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstimagecapturebin.c: - * gst/camerabin2/gstviewfinderbin.c: - camerabin2: Adding missing plugin error messages - Whenever a required plugin is missing, camerabin2 should post - a missing plugin message to the bus - -2011-04-28 14:37:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: encodebin might not have the requested pad - handle the case where encodebin doesn't have the pad - camerabin2 is requesting, either because of its current profile - or because of missing elements, making it fail to provide - the pad - -2011-04-27 15:12:18 -0300 Lasse Laukkanen <lasse.laukkanen@digia.com> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - examples: camerabin2: Add more arguments - Add command-line options for setting image-capture, viewfinder - and video-capture caps as strings. - The width and height properties are now used only if these new caps - properties aren't set. - -2011-04-26 15:21:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstimagecapturebin.c: - camerabin2: imagecapturebin: Fix tags merging mode - Use merge replace mode to allow new tags to override old ones - and fix the use case where the last sent tags should be serialized - to the captured images. - -2011-04-26 14:53:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Fix tag handling for videos - In video mode the tags should be pushed after sending the start capture - to the source, this allows the video recording elements to be reset - and leave the flushing state they were at after a previous capture. - This fixes the problem where tags only work for the first video capture - -2011-04-26 14:50:29 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Fix set but unused variable warnings - -2011-04-26 14:49:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Fix tags setting tests - Fixes the tags setting tests to reveal a bug in camerabin2 - tag setting logic. - -2011-04-25 16:04:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/camerabin2-src.txt: - camerabin2: Adding camera source documentation file - Adds a small text file with a brief description of - what is expected from a camerabin2 source element - -2011-04-11 15:33:20 -0300 Lauri Lehtinen <lauri.lehtinen@digia.com> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - basecamerabinsrc: Handle errors from preview pipeline - Implements a message handling function to preview pipeline bus. - If GST_MESSAGE_ERROR is seen, considers preview pipeline unable - to do its job and posts an error message to application. - Sets pipeline element to NULL so that subsequent calls to post_preview - and set_caps functions just returns without pushing anything to the - disposed preview pipeline. Leaves further actions to the application. - -2011-04-08 09:22:11 -0300 Lauri Lehtinen <lauri.lehtinen@digia.com> - - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.h: - basecamerabinsrc: Protection for previewpipeline when setting new preview caps - Implements a state indicating flag to preview pipeline, - so that new caps are not set if the pipeline is processing a - preview. The caps are set as pending and applied when the - next preview post is called. - In this case a wait was implemented in the post_preview function, - so that new preview image buffer will wait until the other previews - have been posted to the application and the new caps can be used - safely. - -2011-03-29 13:46:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - examples: camerabin2: Fix compile problem with debug disabled - -2011-03-23 18:41:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstviewfinderbin.c: - camerabin2: viewfinderbin: Post missing plugin messages - Makes viewfinderbin post missing plugin messages when it - can't create an internal elements - -2011-03-23 18:40:03 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/camerabingeneral.c: - camerabin2: Improve missing plugin message - Improves the message text for missing plugin messages from - camerabin2 - -2011-03-23 17:46:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/PORTING: - camerabin2: Update porting file - Update porting file with mention that stop-capture is now - async. - -2011-04-08 17:58:42 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - gst-camerabin2-test: Allow gst-launch pipelines for sinks - Use gst_parse_launch () to parse the sink strings to allow specification - of properties to sinks and of more advanced sink graphs. - -2011-04-04 13:28:32 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Fix debug print to show audio/video depending on pad type - -2011-03-31 13:08:48 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Fix order of element state change - To change the state of elements in a pipeline, we should mirror the - behaviour of GstBin which starts at the sink element and works its way - upstream. - -2011-04-01 22:13:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - vp8dec: debug code style fixes - -2011-04-01 22:13:00 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - vp8dec: propagate downstream flow return to upstream - -2011-04-03 22:35:13 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: handle missing framerate when calculating timestamp - -2011-04-03 22:32:20 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: debug code style fixes - -2011-04-01 22:12:30 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: tune parsing sink caps into video state - ... to provide subclass with more information w.r.t. original caps. - -2011-04-01 18:49:10 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: video state reference to codec_data is not refcounted - ... but rather implicitly valid as long as sink caps are not modified. - -2011-04-01 18:00:11 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: improve glitch resilience - Provide a replacement for GST_ELEMENT_ERROR to avoid aborting at the first - atom out of place, while on the other hand not failing indefinitely. - -2011-03-31 14:47:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: reverse playback support - -2011-03-30 10:28:08 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: use basevideocodec discont field - -2011-03-30 10:18:23 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/schroedinger/gstschrodec.c: - * ext/vp8/gstvp8dec.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: really and only set src pad caps whenever requested - ... since subclass is expected to be wise enough to know when to do so. - -2011-03-30 09:17:22 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: add some sanity enforcing - -2011-03-30 09:15:13 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: add documentation - ... and remove some more stray unused code and methods. - -2011-03-29 15:41:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideocodec: fully free video frame - -2011-03-29 15:41:08 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: streamline discont, flush and reset handling - ... which is not to say there is no room for further tweaking ... - -2011-03-29 15:39:07 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: add some header commentary - -2011-03-29 12:57:21 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: remove (almost) unused fields - ... and also some more unused code. - -2011-03-29 10:41:54 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: invoke subclass start method at state change and use set_format - While this changes API slightly (e.g. actually uses set_format now), which is OK - for unstable API, it has following merits: - * symmetric w.r.t. stop at state change - * in line with other base class practice - * otherwise no subclass method at state change (global activation time) - Moreover, subclassese are either unaffected or trivially adjusted accordingly. - -2011-04-28 12:02:27 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: fixup tweak - -2011-03-28 16:15:19 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: add and tweak debug statements - -2011-03-28 13:32:17 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: arrange for limited legacy seeking support - In particular, tweak src query and event handling to provide for - byte <-> time conversion. - -2011-03-28 11:15:49 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoutils.c: - basevideo: cater for format conversion - -2011-03-28 10:51:27 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideoutils.c: - videocodec: remove unused fields and code - -2011-03-28 09:14:57 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: fix copy-and-paste variable misnomer - -2011-03-28 08:59:20 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: subsume skip_frame into finish_frame - -2011-03-28 08:56:59 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: remove unused code - -2011-03-27 22:27:09 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: code cleanup and debug style fixes - -2011-03-27 16:36:57 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: pass along buffer discont flag - -2011-03-25 15:29:34 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: implement preset interface - -2011-03-25 09:28:24 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: add documentation and related cosmetics - -2011-03-24 14:10:07 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/dirac/gstdiracenc.cc: - * ext/vp8/gstvp8enc.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: provide proper upstream flow return handling - -2011-03-24 13:59:35 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - vp8enc: minor optimization in setting up image buffer - -2011-03-24 12:50:23 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: refactor frame processing - -2011-03-24 11:55:41 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: do init at set_format time - -2011-03-24 10:15:55 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - vp8enc: fix keyframe forcing - -2011-03-24 08:23:27 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: enhance set_caps - Specifically, only invoke set_format if incoming format really changed, - and finish current format if so (and if any current). - -2011-03-23 22:17:49 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: elaborate finish to draining - -2011-03-24 09:21:04 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/dirac/gstdiracenc.cc: - * ext/schroedinger/gstschroenc.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: invoke subclass start method at state change - While this changes order w.r.t. set_format, which is OK for unstable API, - it has following merits: - * symmetric w.r.t. stop at state change - * in line with other base class practice - * little benefit in invoking 2 subclass virtual methods (set_format and start) - in immediate succession; all actions in the second could be done in the first - whereas subclass has no chance to do anything 'global' at activation time - Moreover, current -bad subclass relevant methods either trivially commute - or are either trivially adjusted accordingly. - -2011-03-24 08:21:03 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: enable clipping by default - -2011-03-24 08:17:52 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: reset more state - -2011-03-24 08:56:33 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: header cosmetic and doc fixes - -2011-03-23 09:45:20 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/dirac/gstdiracenc.cc: - * ext/schroedinger/gstschroenc.c: - * ext/vp8/gstvp8enc.c: - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideocodec: remove redundant caps field - ... as it is already at hand as the src pad's negotiated caps. - -2011-03-23 09:32:50 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: remove unused code - -2011-03-23 08:50:31 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - vp8enc: use baseclass event virtual handler - -2011-03-23 08:49:48 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: add event virtual method to allow subclass event handling - -2011-03-23 08:35:51 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: improve GstForceKeyUnit event handling - -2011-03-22 13:19:17 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.c: - basevideocodec: debug style fixes - -2011-03-21 18:02:15 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - basevideocodec: remove unused code cluttering up the place - Also minor debug style fixes. - -2011-03-21 17:44:17 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideoencoder: simplify negotiated checking - ... by avoiding some extraneous (un)ref'ing. - -2011-03-24 14:16:12 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: code cleanup and some debug - Also add some minor locking and remove unused bits. - -2011-05-16 09:07:57 +0200 Pino Toscano <toscano.pino@tiscali.it> - - * sys/shm/shmpipe.c: - shm: Don't use PATH_MAX - PATH_MAX is not defined on GNU Hurd and others. Also fix - format string. - -2011-05-14 14:48:56 +0200 Marc-André Lureau <marcandre.lureau@gmail.com> - - * gst/dccp/gstdccp_common.h: - gst/dccp: fix build on newer mingw - Fix this build error: - CC libgstdccp_la-gstdccpplugin.lo - In file included from ../../../gst/dccp/gstdccpclientsrc.h:29:0, - from ../../../gst/dccp/gstdccpplugin.c:24: - ../../../gst/dccp/gstdccp_common.h:32:0: warning: WINVER redefined enabled by default - /usr/i686-w64-mingw32/sys-root/mingw/include/_mingw.h:231:0: note: this is the location of the previous definition - In file included from ../../../gst/dccp/gstdccpplugin.c:24:0: - ../../../gst/dccp/gstdccpclientsrc.h:58:3: error: unknown type name 'uint8_t' - In file included from ../../../gst/dccp/gstdccpplugin.c:25:0: - ../../../gst/dccp/gstdccpserversink.h:74:3: error: unknown type name 'uint8_t' - In file included from ../../../gst/dccp/gstdccpplugin.c:26:0: - ../../../gst/dccp/gstdccpclientsink.h:67:3: error: unknown type name 'uint8_t' - In file included from ../../../gst/dccp/gstdccpplugin.c:27:0: - ../../../gst/dccp/gstdccpserversrc.h:58:3: error: unknown type name 'uint8_t' - make: *** libgstdccp_la-gstdccpplugin.lo Error 1 - https://bugzilla.gnome.org/show_bug.cgi?id=650171 - -2011-05-15 10:04:50 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/plugin.m: - applemedia: bump the rank of qtkitvideosrc to PRIMARY - -2011-05-15 10:00:44 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/hls/m3u8.c: - hls: fix handling of strol() overflows - -2011-05-14 12:18:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * Makefile.am: - cruft: Add ext/amrwbenc directory, it's ext/voamrwbenc now - -2011-05-13 01:03:27 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst-libs/gst/video/gstbasevideocodec.c: - basevideencoder: Fix use after free after state change transition - -2011-04-18 23:40:35 +0300 Sreerenj Balachandran <sreerenj.balachandran@nokia.com> - - * ext/opencv/gstfacedetect.c: - facedetect: Remove dead code and some minor doc changes. - -2011-04-24 21:06:29 +0300 Sreerenj Balachandran <sreerenj.balachandran@nokia.com> - - * ext/opencv/gstedgedetect.c: - edgedetect: Remove dead code and some minor doc changes - -2011-04-19 19:09:30 +0200 Luis de Bethencourt <luis.debethencourt@collabora.co.uk> - - * gst/coloreffects/gstchromahold.c: - * gst/coloreffects/gstchromahold.h: - * gst/coloreffects/gstcoloreffects.c: - * gst/coloreffects/gstcoloreffects.h: - coloreffects: Coding style fixes - -2011-04-19 10:32:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-voaacenc.xml: - aacenc: Integrate into the documentation - -2011-04-19 10:07:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * ext/Makefile.am: - * ext/amrwbenc/Makefile.am: - * ext/amrwbenc/README: - * ext/voamrwbenc/GstVoAmrwbEnc.prs: - * ext/voamrwbenc/Makefile.am: - * ext/voamrwbenc/gstvoamrwb.c: - * ext/voamrwbenc/gstvoamrwbenc.c: - * ext/voamrwbenc/gstvoamrwbenc.h: - amrwbenc: Switch to the free vo-amrwbenc library - And rename everything to voamrwbenc instead of amrwbenc. - -2011-04-15 11:19:20 +0200 benjamin gaignard <benjamin.gaignard@linaro.org> - - * ext/faac/gstfaac.c: - * tests/check/elements/faac.c: - faac: Detect output format from downstream caps change unit test - -2011-04-19 09:52:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/Makefile.am: - voaaenc: Fix CFLAGS/LIBS of the unit test - -2011-04-19 09:49:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/voaacenc/gstvoaacenc.c: - * ext/voaacenc/gstvoaacenc.h: - voaacenc: Only generate sinkcaps once and in a threadsafe way - -2011-04-19 09:42:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/voaacenc/gstvoaacenc.c: - voaacenc: Add NULL terminator to gst_structure_new() - -2011-04-19 09:40:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/voaacenc/gstvoaacenc.c: - * ext/voaacenc/gstvoaacenc.h: - voaacenc: Some minor cleanup - -2011-04-19 09:34:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/voaacenc/Makefile.am: - voaacenc: Fix CFLAGS and LIBS - -2011-04-18 17:19:00 +0200 benjamin gaignard <benjamin.gaignard@linaro.org> - - * configure.ac: - * ext/Makefile.am: - * ext/voaacenc/Makefile.am: - * ext/voaacenc/gstvoaac.c: - * ext/voaacenc/gstvoaacenc.c: - * ext/voaacenc/gstvoaacenc.h: - * tests/check/Makefile.am: - * tests/check/elements/voaacenc.c: - voaacenc: Add new plugin for audio AAC encoder based on vo-aacenc lib - Add plugin and unit test. - Fixes bug #647748. - -2011-05-14 10:19:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colorspace.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmpsrc.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * win32/common/config.h: - Back to development - -=== release 0.10.22 === - -2011-05-10 11:35:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colorspace.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmpsrc.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.10.22 - Highlights: - - hlsdemux: Add HTTP live streaming parser/demuxer element - - new elements: h263parse, zebrastripe, patchdetect - - scenechange: new scene change detection element - - removed audioparsersbad plugin, it has been moved to -good - - make opencv plugin work with OpenCV 2.2 - - countless (still experimental) camerabin2 fixes and improvements - - experimental VP8 RTP payloader/depayloader (RTP payloading not finalised yet) - - curlsink: add libcurl-based sink element (acts as client, not server) - - decklink: add decklink plugin - - linsys: add plugin for Linear Systems SDI boards - - sdi: add raw SDI muxing/demuxing elements - - camerabin now relies on muxers to mux based on running time (ie. latest base/good/ugly releases) - - many other fixes and improvements - -2011-05-05 09:54:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/camerabinvideo.h: - camerabin: Use running time for muxing - This patch removes the audio source buffer probe that was used - to re-timestamp buffers to make them start from 0. As muxers - have been fixed to use running time instead of timestamps, this - is not needed anymore. - Fixes bug #646211 - -2011-04-21 19:58:03 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/camerabinimage.c: - camerabin: Fix typo - -2011-05-04 12:36:01 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/xvid/gstxvidenc.c: - xvidenc: do not leak peer pad reference - -2011-05-03 15:47:02 +0100 Sjoerd Simons <sjoerd.simons@collabora.co.uk> - - * ext/xvid/gstxvidenc.c: - xvidenc: Always return reffed caps from _getcaps - Not returning ref caps will leads to crashes and refcounting issues in - upstream elements - -2011-04-14 13:34:53 +0200 Andoni Morales Alastruey <amorales@flumotion.com> - - * gst/hls/gsthlsdemux.c: - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - hlsdemux: set duration in outgoing buffers - Currently we push each fragment as a single buffer. - -2011-05-03 12:01:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: fix DURATION query handling - Only answer duration queries in TIME format with a duration - in seconds. Make sure we don't return GST_CLOCK_TIME_NONE as - duration (which is non-0, but still invalid/useless). - -2011-05-03 11:51:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: implement SEEKING query - -2011-05-03 09:55:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/dvb/parsechannels.c: - dvb: Use the user config dir instead of the cache dir for the channels configuration - -2011-04-29 14:37:04 +0200 Philippe Normand <pnormand@igalia.com> - - * sys/dvb/parsechannels.c: - dvb: moved dvb-channels.conf to $XDG_CACHE_HOME - -2011-04-30 19:47:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colorspace.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmpsrc.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * po/da.po: - * po/de.po: - * po/fr.po: - * po/uk.po: - * win32/common/config.h: - 0.10.21.4 pre-release - -2011-04-30 19:46:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/cog/gstcogorc-dist.c: - * gst/colorspace/gstcolorspaceorc-dist.c: - Update orc-generated disted C backup code to orc 0.4.14 - -2011-04-30 19:15:11 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/debugutils/gstchopmydata.c: - chopmydata: don't push buffers smaller than min-size on eos - When pushing the remaining data on EOS, don't just push whatever - data is left in the adapter, but only push data that's at least - of min-size. - -2011-04-30 19:08:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/debugutils/gstchopmydata.c: - chopmydata: don't mess with adapter from non-streaming thread on FLUSH_START - Don't try to push remaining data in the adapter on receiving a FLUSH event, - just flush the adapter. Do this on FLUSH_STOP, however, which is serialized, - unlike FLUSH_START, so we don't mess with the adapter at the same time as - the streaming thread. - -2011-04-30 11:28:03 +0200 Philip Jägenstedt <philipj@opera.com> - - * gst/y4m/gsty4mdec.c: - y4mdec: add plugin description - https://bugzilla.gnome.org/show_bug.cgi?id=649005 - -2011-04-29 12:39:38 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Don't leak bufferlist on streams without pads - https://bugzilla.gnome.org/show_bug.cgi?id=648929 - -2011-04-29 12:38:31 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Unref buffers we don't use. - Avoids a massive leak :) - https://bugzilla.gnome.org/show_bug.cgi?id=648929 - -2011-04-29 12:08:38 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsbase: Don't forget to free the program streams array - https://bugzilla.gnome.org/show_bug.cgi?id=648929 - -2011-04-29 12:08:04 +0200 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegtsdemux/tsdemux.c: - tsdemux: Free packet buffer even if it doesn't have a payload - This can happen with AFC-only packets. Avoids leaking buffers. - https://bugzilla.gnome.org/show_bug.cgi?id=648929 - -2011-04-28 10:07:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - decklink: Check for pthread.h and link with -lpthread - -2011-04-28 10:04:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/Makefile.am: - decklink: Add to SUBDIRS - -2011-04-28 00:00:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colorspace.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmpsrc.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * ext/cog/gstcogorc-dist.c: - * gst/colorspace/gstcolorspaceorc-dist.c: - * po/bg.po: - * po/ja.po: - * po/nl.po: - * po/pl.po: - * po/ru.po: - * po/sl.po: - * po/tr.po: - * win32/common/config.h: - 0.10.21.3 pre-release - -2011-04-27 23:43:03 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tools/Makefile.am: - tools: disable new gst-element-maker test - It doesn't seem to work in an uninstalled setup, and - breaks make distcheck for me. - -2011-04-27 01:14:20 +0300 Stefan Kost <ensonic@users.sf.net> - - * tools/Makefile.am: - element-maker: the broekn templates are not broekn, but dependencies - Rename the list and dist them. We need them for the actual templates. - -2011-04-26 15:13:55 +0300 Stefan Kost <ensonic@users.sf.net> - - * tools/Makefile.am: - * tools/gst-element-maker: - element-maker: set CPPFLAGS to make templates using uninstalled headers work - -2011-04-26 14:21:25 +0300 Stefan Kost <ensonic@users.sf.net> - - * tools/Makefile.am: - * tools/element-templates/gobject: - element-maker: fixup gobject template a bit but disable for now - The template contains things we already define by default. - -2011-04-26 14:10:05 +0300 Stefan Kost <ensonic@users.sf.net> - - * tools/element-templates/audiofilter: - * tools/element-templates/basertpdepayload: - * tools/element-templates/basertppayload: - * tools/element-templates/cddabasesrc: - * tools/element-templates/tagdemux: - element-templates: fix templates - Use the object class and not the object in the init function. Set the vmethods. - Add default returns. - -2011-04-26 14:08:51 +0300 Stefan Kost <ensonic@users.sf.net> - - * tools/Makefile.am: - element-maker: don't dist incomplete templates - Move not working templates to a separate variable to highlight the fact that - they need more work. These need at least the class and type fields filled. - -2011-04-26 13:44:04 +0300 Stefan Kost <ensonic@users.sf.net> - - * tools/Makefile.am: - * tools/gst-element-maker-test.sh: - element-maker-test: try to run element-maker for all templates - Add an easy way to check the element-maker templates. - -2011-04-26 13:42:59 +0300 Stefan Kost <ensonic@users.sf.net> - - * tools/gst-element-maker: - element-maker: make it fail, when compilation fails - -2011-04-19 15:09:54 -0400 Stefan Kost <ensonic@users.sf.net> - - * tools/gst-element-maker: - element-maker: allow to run from a different working directory - Get the dirname for the script and use that to reference the templates. Use the - templatedir variable to check for templates. - -2011-04-16 19:42:48 -0700 David Schleef <ds@schleef.org> - - * tools/gst-element-maker: - element-maker: lowercasify input - This allows using capitalized acronyms in class names, so using - "AVC_src" on the command line will create filename gstavcsrc.c, - class name GstAVCSrc, and symbol names gst_avc_src_*. - -2011-04-24 16:42:03 -0700 David Schleef <ds@schleef.org> - - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux,tsdemux: Add byte-stream to h264 caps - Fixes #606662. - -2011-04-24 16:00:00 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideoencoder: Don't allow buffers after EOS - Fixes #647852. - -2011-04-24 15:49:54 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideo: Don't duplicate code in basevideocodec - Both basevideoencoder and basevideocodec were setting - system_frame_number, leading to confusion. Fixes #647853. - -2011-04-14 16:21:15 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideo: Check if caps are set directly - Fixes #647854. - -2011-04-17 00:08:39 +0100 Mihai Draghicioiu <mihai.draghicioiu@gmail.com> - - * ext/gme/gstgme.c: - gme: fix infinite looping by fading out after two loops - https://bugzilla.gnome.org/show_bug.cgi?id=647364 - -2011-04-24 14:04:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From c3cafe1 to 46dfcea - -2011-04-22 09:37:29 +0100 Fabrizio Milo <mistobaan@gmail.com> - - * configure.ac: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfaceblur.h: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstfacedetect.h: - * ext/opencv/gsttemplatematch.c: - * ext/opencv/gsttextoverlay.h: - opencv: make work with openCV 2.2 - https://bugzilla.gnome.org/show_bug.cgi?id=641796 - -2011-04-19 17:02:45 +0100 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - Add latest plugins to spec file - -2011-04-15 22:25:27 -0700 David Schleef <ds@schleef.org> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Add byte-stream to h264 caps - -2011-04-18 12:01:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/mxfmux.c: - * tests/check/pipelines/mxf.c: - wavpack: Remove bus GSource to prevent a valgrind warning - -2011-04-18 11:57:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/ofa.c: - ofa: Remove bus GSource to prevent a valgrind warning - -2011-04-18 11:50:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/assrender.c: - assrender: Remove bus GSource to prevent a valgrind warning - -2011-04-18 11:46:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/decklink/Makefile.am: - decklink: Remove unused/unneeded CFLAGS/LIBS and move $(LIBM) to LIBADD - -2011-04-18 11:43:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/linsys/Makefile.am: - linsys: Link with libgstbase for basesink/basesrc - And remove empty and unused variables. - -2011-04-17 19:09:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/decklink/Makefile.am: - decklink: Dist all headers and put them in noinst_HEADERS - -2011-04-17 19:09:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/linsys/Makefile.am: - linsys: Dist all headers and put them in noinst_HEADERS - -2011-04-17 11:54:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Fix linsys/decklink checks for Linux - -2011-04-17 01:10:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * win32/common/config.h: - 0.10.21.2 pre-release - -2011-04-17 01:09:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/cog/gstcogorc-dist.c: - * ext/cog/gstcogorc-dist.h: - * gst/colorspace/gstcolorspaceorc-dist.c: - * gst/colorspace/gstcolorspaceorc-dist.h: - * gst/fieldanalysis/gstfieldanalysisorc-dist.c: - * gst/fieldanalysis/gstfieldanalysisorc-dist.h: - ext, gst: update disted orc backup files - -2011-04-17 00:54:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colorspace.xml: - * docs/plugins/inspect/plugin-curl.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtmpsrc.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - docs: update docs for pre-release - -2011-04-16 16:36:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: fix --disable-external - -2011-04-14 20:46:52 -0700 David Schleef <ds@schleef.org> - - * ext/assrender/gstassrender.c: - assrender: refactor blitting, avoid writing past end of buffer - Previous blitting code could potentially write past the - end of the buffer if the x or y position was odd, and for - the same underlying reason, didn't get the chroma registration - correct in the odd position case. - https://bugzilla.gnome.org/show_bug.cgi?id=647830 - -2011-04-16 11:18:44 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/jpegformat/gstjpegparse.c: - jpegformat: Fix unitialized variable on macosx - -2011-04-14 20:39:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/camerabinimage.c: - camerabin: Do not forget to unref the ffmpegcolorspace - Do not leak the ffmpegcolorspace by unrefing it at dispose - -2011-04-14 16:48:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin.c: - test: camerabin: More leak fixes - -2011-04-15 10:41:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * m4/gsettings.m4: - m4: Update gsettings m4 macros - -2011-04-14 16:24:47 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - Bump orc requirement to 0.4.11 - -2011-04-15 00:09:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmenc.c: - * ext/musicbrainz/gsttrm.c: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/rsnparsetter.c: - * gst/aiff/aiffparse.c: - * gst/colorspace/gstcolorspace.c: - * gst/debugutils/gstchecksumsink.c: - * gst/debugutils/gstchopmydata.c: - * gst/geometrictransform/gstfisheye.c: - * gst/h264parse/gsth264parse.c: - * gst/hls/m3u8.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegtsdemux/mpegtsbase.c: - Fix some unused-but-set-variable warnings with gcc 4.6 - -2011-04-14 19:53:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tools/element-templates/gobject: - element-templates: clean up gobject template a bit - Remove pointless g_return_if_fail (G_IS_FOO (obj)) checks in - vfunc implementations. Comment out unused variables to avoid - warnings with gcc 4.6. - -2011-04-14 18:36:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfobjects.c: - * gst/asfmux/gstasfparse.c: - * gst/asfmux/gstrtpasfpay.c: - asfmux: fix unused-but-set-variable warnings with gcc 4.6 - -2011-04-14 18:36:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/bayer/gstrgb2bayer.c: - bayer: fix unused-but-set-variable warnings with gcc 4.6 - -2011-04-14 14:32:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Leak fixes for the unit tests - Leak fixes related to not removing the source returned from - gst_bus_add_watch - -2011-04-14 13:27:20 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin.c: - tests: camerabin: Some leak fixes - Leak fixes related to removing the source returned from - gst_bus_add_watch - -2011-04-13 15:05:15 -0400 Reynaldo H. Verdejo Pinochet <reynaldo.verdejo@collabora.co.uk> - - * Android.mk: - * sys/audioflingersink/Android.mk: - * sys/audioflingersink/GstAndroid.cpp: - * sys/audioflingersink/audioflinger_wrapper.cpp: - * sys/audioflingersink/audioflinger_wrapper.h: - * sys/audioflingersink/gstaudioflingerringbuffer.h: - * sys/audioflingersink/gstaudioflingersink.c: - * sys/audioflingersink/gstaudioflingersink.h: - Remove audioflingersink - Remove audioflingersink, it's in gst-android now. - -2011-04-14 16:49:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideo: fix unused-but-set-variable warnings with gcc 4.6 - -2011-04-14 16:14:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabin-enum.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.h: - basecamerasrc: add unstable-API warnings if GST_USE_UNSTABLE_API is not defined - So people know this is unstable API even if it ends up right next - to our other API. - -2011-04-14 16:11:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/media-info/.gitignore: - libs: remove leftover media-info directory - -2011-04-13 22:48:28 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/m3u8.c: - hlsdemux: m3u8: return duration in nanoseconds - -2011-04-13 23:35:50 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: fix handling of end of playlist - Don't send the EOS event until we reached the end of the playlist - and the queue is really empty. - -2011-04-13 22:25:57 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: fix example pipeline - -2011-04-13 23:06:18 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: ignore seek events until it's implemented - -2011-04-13 22:17:05 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: dispose the fetcher from the same thread it's created - -2011-04-14 11:28:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink:: fix compilation with older GLib - g_object_notify_by_pspec() is new in GLib 2.26, but we only require 2.22. - -2011-04-14 07:21:50 +0100 Christian Fredrik Kalager Schaller <christian.schaller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - Update spec file with a lot of new plugins - -2011-04-13 23:59:40 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/jifmux.c: - tests: jifmux: Adds test for new exposure compensation tag - Adds a test for GST_TAG_CAPTURING_EXPOSURE_COMPENSATION on - jifmux check tests. - -2011-04-13 21:58:36 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/dtmf/Makefile.am: - * gst/dtmf/gstdtmfcommon.h: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfdepay.h: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - dtmf: Move duplicate #defines into a common include - Centralize duplicated constants so they have the same value. - Also standardise minimum tone duration to 250ms and minimum inter-tone - interval to 100ms. - -2011-04-13 22:33:37 -0300 Lasse Laukkanen <lasse.laukkanen@digia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: Preserve unused imagebin or videobin on NULL - If video or image mode is never selected then respective bin is in NULL state. - Preserve this state when resetting camerabin from PAUSED to READY. - -2011-04-13 22:07:58 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/pnm/Makefile.am: - pnm: add LIBTOOLFLAGS = --tag=disable-static - -2011-04-13 20:26:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/xvid/gstxvidenc.c: - xvidenc: Implement getcaps function - This allows to set width/height/etc restrictions to be set downstream. - Fixes bug #647498. - -2011-04-12 21:47:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Android.mk: - * Makefile.am: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-qtmux.xml: - * gst-plugins-bad.spec.in: - * gst/qtmux/Makefile.am: - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/atomsrecovery.c: - * gst/qtmux/atomsrecovery.h: - * gst/qtmux/descriptors.c: - * gst/qtmux/descriptors.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/ftypcc.h: - * gst/qtmux/gstqtmoovrecover.c: - * gst/qtmux/gstqtmoovrecover.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - * gst/qtmux/gstqtmuxmap.c: - * gst/qtmux/gstqtmuxmap.h: - * gst/qtmux/gstqtmuxplugin.c: - * gst/qtmux/properties.c: - * gst/qtmux/properties.h: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/qtmux.c: - * tests/check/pipelines/tagschecking.c: - qtmux: remove qtmux plugin, it has moved to -good - https://bugzilla.gnome.org/show_bug.cgi?id=636699 - -2011-04-13 16:31:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Fix libexif pkg-config check - There's no exif plugin so don't use AG_GST_CHECK_FEATURE. - Fixes bug #647564. - -2011-04-12 16:42:17 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - dtmf: Remove leftover MAEMO_BROKEN defines - Remove defines to work around bugs in old Maemo releases - -2011-04-11 14:44:17 -0300 Lasse Laukkanen <lasse.laukkanen@digia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: Fix corner case for preview posting - Fix corner case where video preview image is not posted if stopping - video capture immediately after capture start. - -2011-04-11 18:31:45 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: subtract id-str size from the remaining read - Fixes a regression from the patches in bug #626618. - -2011-04-11 18:30:17 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/jpegformat/gstjpegparse.c: - * tests/check/elements/camerabin2.c: - jpeg: set tags to NULL at init time and after freeing them - -2011-04-11 18:29:28 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - * tests/check/elements/camerabin2.c: - jpeg: comment and logging changes - -2011-04-10 19:53:35 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: add gst_jpeg_parse_remove_marker() - This function will remove the whole marker from the buffer. - Also we set it as the default behavior for marker JPG{0-13}? in order to avoid - a useless #if - https://bugzilla.gnome.org/show_bug.cgi?id=626618 - -2010-08-13 12:38:02 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: refactor COM parsing - add gst_jpeg_parse_com () and get_utf8_from_data () to extract and - validate comment format - https://bugzilla.gnome.org/show_bug.cgi?id=626618 - -2010-11-16 18:22:07 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: refactor APP1 parsing - add gst_jpeg_parse_app1 () and extract_and_queue_tags () - https://bugzilla.gnome.org/show_bug.cgi?id=626618 - -2010-11-21 15:05:43 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: log id when skipping an unhandled APP marker - https://bugzilla.gnome.org/show_bug.cgi?id=626618 - -2010-11-16 17:47:17 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: skip all APP markers, excepting APP1 - https://bugzilla.gnome.org/show_bug.cgi?id=626618 - -2010-11-21 15:09:17 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: add get_tag_list () - https://bugzilla.gnome.org/show_bug.cgi?id=626618 - -2011-04-11 00:36:35 -0400 Thibault Saunier <thibault.saunier@collabora.co.uk> - - * Android.mk: - * android/NOTICE: - * android/h264parse.mk: - * android/metadata.mk: - * android/qtmux.mk: - * android/sdpelem.mk: - * ext/faad/Makefile.am: - * gst-libs/gst/basecamerabinsrc/Makefile.am: - * gst-libs/gst/interfaces/Makefile.am: - * gst/adpcmdec/Makefile.am: - * gst/adpcmenc/Makefile.am: - * gst/aiff/Makefile.am: - * gst/asfmux/Makefile.am: - * gst/audiobuffer/Makefile.am: - * gst/autoconvert/Makefile.am: - * gst/bayer/Makefile.am: - * gst/camerabin/Makefile.am: - * gst/camerabin2/Makefile.am: - * gst/cdxaparse/Makefile.am: - * gst/coloreffects/Makefile.am: - * gst/colorspace/Makefile.am: - * gst/dataurisrc/Makefile.am: - * gst/debugutils/Makefile.am: - * gst/dtmf/Makefile.am: - * gst/dvbsuboverlay/Makefile.am: - * gst/dvdspu/Makefile.am: - * gst/festival/Makefile.am: - * gst/freeze/Makefile.am: - * gst/frei0r/Makefile.am: - * gst/gaudieffects/Makefile.am: - * gst/geometrictransform/Makefile.am: - * gst/h264parse/Makefile.am: - * gst/hdvparse/Makefile.am: - * gst/hls/Makefile.am: - * gst/id3tag/Makefile.am: - * gst/interlace/Makefile.am: - * gst/invtelecine/Makefile.am: - * gst/ivfparse/Makefile.am: - * gst/jp2kdecimator/Makefile.am: - * gst/jpegformat/Makefile.am: - * gst/legacyresample/Makefile.am: - * gst/librfb/Makefile.am: - * gst/liveadder/Makefile.am: - * gst/mpeg4videoparse/Makefile.am: - * gst/mpegdemux/Makefile.am: - * gst/mpegpsmux/Makefile.am: - * gst/mpegtsdemux/Makefile.am: - * gst/mpegvideoparse/Makefile.am: - * gst/mve/Makefile.am: - * gst/mxf/Makefile.am: - * gst/nsf/Makefile.am: - * gst/nuvdemux/Makefile.am: - * gst/patchdetect/Makefile.am: - * gst/pcapparse/Makefile.am: - * gst/pnm/Makefile.am: - * gst/qtmux/Makefile.am: - * gst/rawparse/Makefile.am: - * gst/rtpmux/Makefile.am: - * gst/rtpvp8/Makefile.am: - * gst/scaletempo/Makefile.am: - * gst/sdi/Makefile.am: - * gst/sdp/Makefile.am: - * gst/segmentclip/Makefile.am: - * gst/siren/Makefile.am: - * gst/speed/Makefile.am: - * gst/stereo/Makefile.am: - * gst/subenc/Makefile.am: - * gst/tta/Makefile.am: - * gst/videofilters/Makefile.am: - * gst/videomaxrate/Makefile.am: - * gst/videomeasure/Makefile.am: - * gst/videoparsers/Makefile.am: - * gst/videosignal/Makefile.am: - * gst/vmnc/Makefile.am: - * gst/y4m/Makefile.am: - * sys/audioflingersink/Android.mk: - android: make it ready for androgenizer - Remove the android/ top dir - Fixe the Makefile.am to be androgenized - To build gstreamer for android we are now using androgenizer which generates the needed Android.mk files. - Androgenizer can be found here: http://git.collabora.co.uk/?p=user/derek/androgenizer.git - -2011-04-10 00:22:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tools/Makefile.am: - element-maker: dist new videofilter2 template - -2011-04-09 13:40:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/vdpau/h264/gstvdph264dec.c: - vdpau: Fix uninitialized variable compiler warning - -2011-04-09 10:03:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/fpsdisplaysink.h: - fpsdisplaysink: Add last-message property and never print anything to stdout - Instead everything will be put into the last-message property and - gst-launch -v will print all changes of the property. This makes - the behaviour of fpsdisplay consistent with the fakesink/identity/etc - behaviour. - -2011-04-09 09:50:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/fpsdisplaysink.h: - fpsdisplaysink: Rename verbose property to silent for consistency - -2011-04-09 00:37:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/baseparse/Makefile.am: - * gst-libs/gst/baseparse/gstbaseparse.c: - * gst-libs/gst/baseparse/gstbaseparse.h: - * tools/element-templates/baseparse: - baseparse: remove -bad version of baseparse library, now in core - -2011-04-02 18:30:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gstdiracparse.h: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth263parse.h: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - * gst/videoparsers/h263parse.h: - videoparsers: port to baseparse, which is now in libgstbase in core - -2011-04-08 12:11:07 -0700 David Schleef <ds@schleef.org> - - * gst/videofilters/Makefile.am: - * gst/videofilters/gstscenechange.c: - * gst/videofilters/gstscenechange.h: - * gst/videofilters/gstvideofilter2.c: - * gst/videofilters/gstvideofiltersbad.c: - scenechange: new scene change detection element - -2011-04-08 10:26:42 -0700 David Schleef <ds@schleef.org> - - * tools/element-templates/videofilter2: - element-maker: Add videofilter2 template - -2011-04-08 19:32:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - * android/aacparse.mk: - * android/amrparse.mk: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * gst/audioparsers/Makefile.am: - * gst/audioparsers/gstaacparse.c: - * gst/audioparsers/gstaacparse.h: - * gst/audioparsers/gstac3parse.c: - * gst/audioparsers/gstac3parse.h: - * gst/audioparsers/gstamrparse.c: - * gst/audioparsers/gstamrparse.h: - * gst/audioparsers/gstdcaparse.c: - * gst/audioparsers/gstdcaparse.h: - * gst/audioparsers/gstflacparse.c: - * gst/audioparsers/gstflacparse.h: - * gst/audioparsers/gstmpegaudioparse.c: - * gst/audioparsers/gstmpegaudioparse.h: - * gst/audioparsers/plugin.c: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/aacparse.c: - * tests/check/elements/ac3parse.c: - * tests/check/elements/amrparse.c: - * tests/check/elements/flacparse.c: - * tests/check/elements/mpegaudioparse.c: - Remove audioparsers plugin, it has been moved to -good - -2011-04-08 14:08:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplay: Use PROP_ instead of ARG_ for the property enums - -2011-04-07 15:15:57 +0200 Philippe Normand <pnormand@igalia.com> - - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/fpsdisplaysink.h: - fpsdisplay: Add verbose property - When this property is set to TRUE the element will display statistics - on stdout. - Fixes https://bugzilla.gnome.org/show_bug.cgi?id=647030 - -2011-04-05 21:04:54 +0200 Haakon Sporsheim <haakon.sporsheim@gmail.com> - - * sys/dshowvideosink/dshowvideosink.cpp: - dshowvideosink: update for latest GstXOverlay changes - From xwindow_id to window_handle. - https://bugzilla.gnome.org/show_bug.cgi?id=646955 - -2011-04-07 18:30:49 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstmpegaudioparse.c: - mpegaudioparse: relax sync match a bit when draining - ... to at least allow initial caps change (but no further caps jitter). - -2011-04-06 15:58:07 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/fieldanalysis/gstfieldanalysis.h: - fieldanalysis: Use RFF flag to indicate buffers to drop downstream - Use of the GAP flag is not really correct here and makes it difficult to - handle real GAP buffers in deinterlace. The RFF flag is unused and can - be reused with similar semantics - the buffers marked with RFF that are - in a telecine state contain only unneeded repeated fields and so can be - dropped. - -2011-04-05 19:26:15 +0300 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * sys/shm/gstshmsink.c: - shmsink: ensure gst_poll_wait is called first on descriptors - We need to call gst_poll_wait before calling gst_poll_* status - functions on that new descriptor, so restart the loop, so _wait - will have been called on all elements of self->poll, whether - they have just been added or not. */ - -2011-04-06 20:40:40 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * configure.ac: - shm: Fix MSG_NOSIGNAL check - Include sys/socket.h before checking for MSG_NOSIGNAL, also - check that sys/socket.h before doing any other checks for shm - -2010-12-15 10:39:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: don't rely on the application running the default GLib main loop - Don't use g_idle_add() and friends to schedule things we can't do from the - streaming thread in another thread. The app may not be running the default - GLib main loop. Instead, just spawn a thread. - Also, we need to care for when acessing a pad variable, as another thread - might have taken camerabin to NULL while this gst_camerabin_imgbin_finished - didn't run. - https://bugzilla.gnome.org/show_bug.cgi?id=615655 - -2011-04-04 20:55:39 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstmpegaudioparse.c: - mpegaudioparse: require tighter sync match when draining - -2011-04-04 15:57:36 +0300 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 1ccbe09 to c3cafe1 - -2011-04-04 12:21:23 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: more helpful debug error message when no needed duration on input buffers - Fixes #646256. - -2011-04-02 01:21:34 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: validate properly utf-8 playlist - -2011-04-02 01:10:37 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/m3u8.c: - hlsdemux: m3u8: clear the list of media files before updating the playlist - -2011-04-02 01:08:02 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - hlsdemux: use and adapter instead of costful buffer joins - -2011-04-01 13:53:28 -0700 David Schleef <ds@schleef.org> - - * ext/dc1394/Makefile.am: - * ext/directfb/Makefile.am: - * gst/hls/Makefile.am: - Remove setting of plugindir from Makefiles - -2011-03-26 17:55:31 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideo: Fix negotiation errors - -2011-03-26 17:43:54 -0700 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschrodec.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideo: Add function to allocate src buffer - -2011-04-01 16:52:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Another windows build fix - Replace %lld with %u as GST_BUFFER_SIZE is a guint - -2011-04-01 16:12:50 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/hls/m3u8.c: - hls: Fix compilation on windows - Use string literal on printing format - -2011-04-01 13:39:50 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: Processing should stop on READY - The videobin and imagebin from camerabin have their states - locked and aren't put to READY when all the rest of camerabin - is set to it. - This might cause one of them to be still processing and post - an EOS after camerabin isn't expecting it anymore, this causes - an assertion as the processing counter would already be 0 and - would be decremented. - -2011-04-01 15:00:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/segmentclip/gstsegmentclip.c: - segmentclip: Keep a reference of events until the event is parsed - -2011-04-01 14:47:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstmpegaudioparse.c: - * gst/audioparsers/gstmpegaudioparse.h: - mpegaudioparse: Parse encoder delay and encoder padding from the LAME header if present - -2011-03-31 16:21:11 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/gstshmsink.c: - shm: Make default perm u+rw g+r for shm area - -2011-03-30 15:53:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: update for media type was renaming from playlist/m3u8 to application/x-hls - -2011-03-30 11:33:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure.ac: Add hls plugin - -2011-03-30 10:11:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Some minor cleanup - Use GST_DEBUG_FUNCPTR and G_PARAM_STATIC_STRINGS - -2011-03-30 03:34:39 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: fix indentation and docs sections - -2011-03-29 23:18:24 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: don't leek the query - -2011-03-29 23:06:14 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: check if the task's cond was signaled because it's the end of playlist - -2011-03-12 13:32:57 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: post a message in the bus when the playlist changes - -2011-03-12 13:15:52 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: don't update the playlist if we stay in the same bitrate - -2011-03-12 13:00:06 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Add support for URI queries - -2011-03-12 12:50:25 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: Add support for duration queries - -2011-03-12 12:28:42 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - hlsdemux: m3u8: protect public methods properly - -2011-03-12 12:20:32 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - hlsdemux: m3u8: add support to get the duration from a playlist - -2011-02-16 03:51:08 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: don't print an error if the download was cancelled - -2011-02-16 03:49:49 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: make sure the fetcher state change is complete before continuing - -2011-02-16 01:19:45 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: don't leak the first buffer - -2011-02-16 00:55:30 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: clean up code a little bit - -2011-02-16 00:53:48 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: only check for the end of playlist when the queue is empty - -2011-02-15 22:40:21 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - hlsdemux: make sure to stop fragments cache if something cancelled it - -2011-02-15 21:55:26 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: reuse the code in reset() to free resources in dispose() - -2011-02-15 21:49:20 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - hlsdemux: use a typefinder to set the caps in the source pad - -2011-02-15 04:39:34 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: add more comments and document better all the threads involved - -2011-02-15 03:42:29 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: handle 404 from the source element - -2011-02-15 03:41:43 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: stop the fetcher in the PAUSED_TO_READY transition, not when disposing() - -2011-02-15 03:41:01 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - hlsdemux: make sure we don't stop the fetcher twice from different threads - -2011-02-15 02:13:56 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/hls/gsthlsdemux.c: - hlsdemux: query the uri upstream before updating the playlist - -2011-02-14 18:51:32 +0100 Andoni Morales Alastruey <amorales@flumotion.com> - - * configure.ac: - * gst/hls/Makefile.am: - * gst/hls/gstfragmented.h: - * gst/hls/gstfragmentedplugin.c: - * gst/hls/gsthlsdemux.c: - * gst/hls/gsthlsdemux.h: - * gst/hls/m3u8.c: - * gst/hls/m3u8.h: - hlsdemux: Add HTTP live streaming demuxer element - Based on previous work by Marc-André Lureau - -2011-03-21 10:57:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/Makefile.am: - * gst/jpegformat/gstjifmux.c: - jifmux: Add GstTagXmpWriter support - Adds GstTagXmpWriter interface to jifmux element - -2011-03-21 10:56:51 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/Makefile.am: - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/gstqtmux.c: - qtmux: Adding GstTagXmpWriter interface - Adds GstTagXmpWriter interface support to qtmux - -2011-03-27 23:50:24 +0300 Sreerenj Balachandran <sreerenj.balachandran@nokia.com> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/opencv/Makefile.am: - * ext/opencv/gstopencv.c: - * ext/opencv/gsttextoverlay.c: - * ext/opencv/gsttextoverlay.h: - opencv text overlay: rename and docuemnt - Rename the element textwrite to opencvtextoverlay. Add proper structuring to - opencv textoverlay element. - Fixes: #640561 - -2011-03-27 13:57:05 -0700 David Schleef <ds@schleef.org> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Fix 64-bit printf format problem - -2011-03-27 20:09:52 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpsink.c: - vdpausink: fix bug where we didn't setup vdpau on a user set window - -2011-03-27 19:47:43 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - * sys/vdpau/gstvdp/gstvdpdecoder.c: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/h264/gsth264dpb.c: - * sys/vdpau/h264/gsth264dpb.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.c: - vdpau: fixup GstFlowReturn handling - Previously the different decoders would discard errounous GstFlowReturns coming - from downstream. Now we properly return these further upstream so that we - properly error out on eg. negotiation problems. - -2011-03-27 19:40:48 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpau.c: - vdpau: small indentation fix - -2010-09-06 17:42:15 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/mpeg/gstvdpmpegdec.c: - vdpaumpegdec: don't ignore return value of gst_base_video_decoder_finish_frame - -2011-03-27 17:42:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/dshowsrcwrapper/gstdshow.cpp: - dshow: fix list iteration code - -2011-03-27 17:22:52 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dccp/gstdccpserversink.c: - dccpserversink: fix list iteration code - Fix suboptimal list iteration code, and add some FIXMEs. - -2011-03-26 12:45:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/patchdetect/Makefile.am: - patchdetect: link against libm - Link against libm. Include math-compat.h header. Don't link against - orc, since it's not actually used. - https://bugzilla.gnome.org/show_bug.cgi?id=645711 - -2011-03-26 16:12:18 +1100 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegtsmux/tsmux/tsmux.c: - Use correct clock when checking whether to write a new PCR - The PCR clocks against the 27MHz SCR clock, so check it correctly - to avoid writing the PCR too often. - Partially fixes: #611046 - -2011-03-26 15:58:21 +1100 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - Rewrite M2TS packet output - Make sure we only write the bottom 30 bits of the PCR to the m2ts header. - Don't use floating point computation for it, and remove weird bit fiddling - that messes up the PCR in a way I can't find any - justification/documentation for. - Don't accidentally lose PCR packets from the output. - Fix the description for the m2ts-mode property so it's clear it's a flag, - and which setting does what. - Fixes: #611061 #644429 - Partially fixes: #645006 - -2011-03-26 11:14:01 +1100 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegtsmux/mpegtsmux.c: - Fix a FIXME, and some whitespace/code style bits. - Also, add a new copyright notice for me. - -2011-03-25 22:33:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 193b717 to 1ccbe09 - -2011-03-25 14:56:43 +0200 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From b77e2bf to 193b717 - -2011-03-25 09:32:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From d8814b6 to b77e2bf - -2011-03-25 09:08:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 6aaa286 to d8814b6 - -2011-03-25 08:33:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/aiff/aiffparse.c: - aiffparse: Add float caps to the template caps - -2011-03-24 16:16:20 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * sys/decklink/gstdecklinksrc.cpp: - decklink: Fix win32 build - -2011-03-24 22:32:42 +0200 René Stadler <mail@renestadler.de> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: ensure cleanup of pes/section filter helper structures - In particular, the section_filter would not be cleared for a private section - stream, leaking a GstAdapter. Seen on bug #645502. - -2011-03-24 22:10:43 +0200 René Stadler <mail@renestadler.de> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: don't leak pad name - As seen on bug #645502. - -2011-03-24 21:46:09 +0200 René Stadler <mail@renestadler.de> - - * gst/videoparsers/h264parse.c: - h264parse: free PPS NAL buffers on cleanup - Obviously a typo. Fixes bug #645502. - -2011-03-24 21:44:07 +0200 René Stadler <mail@renestadler.de> - - * gst/videoparsers/h264parse.c: - h264parse: don't leak all NAL buffers - gst_buffer_replace() doesn't steal the ref. Partial fix for bug #645502. - -2011-03-24 18:49:54 +0200 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 6aec6b9 to 6aaa286 - -2011-03-24 14:51:12 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsdemux: fix stream_info descriptor parsing - -2011-03-09 23:06:14 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/audioparsers/plugin.c: - dcaparse: Bump rank to primary+1 - Seems to work fine with a reasonably wide range of media, so bumping - rank. - -2011-03-24 10:08:59 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/aiff/aiffparse.c: - * gst/aiff/aiffparse.h: - aiffparse: Add support for 32 bit and 64 bit floating point formats - -2011-03-24 09:58:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/aiff/aiffparse.c: - aiffparse: The SSND header is 16 bytes large, not 8 + 16 bytes - Fixes bug #645568 and playback in pull mode for sample widths > 8 that - are not a multiple of 2 bytes (e.g. 24 bit samples). - -2011-03-24 09:29:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/aiff/aiffparse.c: - aiffparse: Use gst_util_uint64_scale_ceil() instead of a custom function - -2011-03-24 13:43:01 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * ext/dts/gstdtsdec.c: - dtsdec: Don't export bitrate if open/variable/lossless - libdca returns the bitrate as 1/2/3 for open/variable/lossless files - respectively. This makes sure we don't emit these values. - -2011-03-24 09:22:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/celt/gstceltdec.c: - celtdec: Read the additional, optional extra headers from the caps too - -2011-03-24 09:14:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/celt/gstceltdec.c: - * ext/celt/gstceltdec.h: - celtdec: Get and use streamheaders from the caps if possible - This allows playback of files where the streamheader buffers were - dropped for some reason and also sets the srcpad caps earlier. - -2011-03-23 22:53:56 -0700 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschroenc.c: - schroenc: Revert previous commit - It appears the patch, which I've been carrying around forever, - had been already applied. - -2011-02-20 14:16:18 -0800 David Schleef <ds@schleef.org> - - * ext/vp8/gstvp8dec.h: - * ext/vp8/gstvp8enc.h: - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - * gst-libs/gst/video/gstbasevideoutils.c: - * gst-libs/gst/video/gstbasevideoutils.h: - basevideo: merge utils header into basevideocodec - -2010-12-30 18:25:04 -0800 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschroenc.c: - schroenc: Output element message with frame stats - -2011-02-26 00:28:32 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/patchdetect/Makefile.am: - * gst/patchdetect/gstpatchdetect.c: - * gst/patchdetect/gstpatchdetect.h: - patchdetect: new element - Detects Munsell ColorChecker in a video image and automatically - white balances and color corrects based on the detected values. - This element is only a demonstration at this stage, it needs to - be separated into two elements. - -2011-02-27 00:48:19 -0800 David Schleef <ds@entropywave.com> - - * configure.ac: - * sys/Makefile.am: - * sys/decklink/DeckLinkAPI.h: - * sys/decklink/DeckLinkAPIDispatch.cpp: - * sys/decklink/LinuxCOM.h: - * sys/decklink/Makefile.am: - * sys/decklink/capture.cpp: - * sys/decklink/capture.h: - * sys/decklink/gstdecklink.cpp: - * sys/decklink/gstdecklinksink.cpp: - * sys/decklink/gstdecklinksink.h: - * sys/decklink/gstdecklinksrc.cpp: - * sys/decklink/gstdecklinksrc.h: - decklink: Add decklink plugin - Source and sink elements for BlackMagic DeckLink SDI cards. - -2011-03-17 17:38:58 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * sys/Makefile.am: - * sys/linsys/Makefile.am: - * sys/linsys/gstlinsys.c: - * sys/linsys/gstlinsyssdisink.c: - * sys/linsys/gstlinsyssdisink.h: - * sys/linsys/gstlinsyssdisrc.c: - * sys/linsys/gstlinsyssdisrc.h: - * sys/linsys/include/asi.h: - * sys/linsys/include/master.h: - * sys/linsys/include/sdi.h: - * sys/linsys/include/sdiaudio.h: - * sys/linsys/include/sdivideo.h: - linsys: Add plugin for Linear Systems SDI boards - -2010-09-14 11:30:33 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/sdi/Makefile.am: - * gst/sdi/gstsdi.c: - * gst/sdi/gstsdidemux.c: - * gst/sdi/gstsdidemux.h: - * gst/sdi/gstsdimux.c: - * gst/sdi/gstsdimux.h: - sdi: Add raw SDI muxing/demuxing elements - -2011-03-17 19:03:29 -0700 David Schleef <ds@schleef.org> - - * ext/cog/gstlogoinsert.c: - * tests/check/Makefile.am: - * tests/check/elements/logoinsert.c: - logoinsert: Fix memleaks, add test - -2010-11-15 11:37:12 -0800 David Schleef <ds@schleef.org> - - * ext/cog/gstlogoinsert.c: - logoinsert: Add data property - -2011-03-23 15:49:18 +0100 Robert Swain <robert.swain@collabora.co.uk> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - gst-camerabin2-test: Fix premature shutdown - We must wait for camerabin2's stop-capture procedures to finish before quitting - the main loop or firing off the next capture. If we get stuck waiting for - camerabin2 to become idle, this is a bug that needs fixing. - -2011-03-23 16:32:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Only mark video capture as finished after EOS - Instead of probing the videosink sinkpad for passing EOS, better - to wait for EOS from the bus. - This makes sure the filesink has already processed it and is - ready to close the file. This is used to notify applications - that camerabin2 is idle and can be shut down. - -2011-03-18 15:49:12 +0100 Robert Swain <robert.swain@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * gst/camerabin2/gstwrappercamerabinsrc.c: - basecamerasrc: camerabin2: wrappercamerabinsrc: Add read-only max-zoom prop - This is not implemented in any of our real sources to which wrappercamerabinsrc - might connect but this is optional and can be implemented at any time. A - limit on the software zoom level using video{crop,scale} would be arbitrary. - -2011-03-23 12:38:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst/camerabin2/gstcamerabin2.c: - * tests/check/elements/camerabin2.c: - camerabin2: Improve idle property usage - Use resource warning messages to notify camerabin2 that a capture - as aborted or couldn't be started, making it decrement the - processing counter and making the idle property more reliable. - -2011-03-22 12:04:20 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: No need to force audiosrc to null on stop_capture - Setting the audio source to null isn't needed and it could - make the EOS that is still flowing be dropped if autoaudiosrc - is used because its pads go flushing before the EOS gets pushed - from the real source. - -2011-03-22 08:32:48 -0300 Lauri Lehtinen <lauri.lehtinen@digia.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - basecamerabinsrc: Check if set preview caps are the same - Checks if the new received preview-caps are equal to what is - already in use, skips the preview-caps setting logic in case - new caps are same as current ones. - -2011-03-15 15:47:21 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Adds another 'idle' test - Adds another test that checks that the idle property works - correctly when bogus start-capture calls are made. - This fails currently, but should remind us of fixing it in - the future by defining a proper error reporting from camera - sources to camerabin2 - -2011-03-15 15:34:31 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Sprinkle some 'idle' property checks - Adds some checks for 'idle' property in camerabin2 tests - -2011-03-15 15:11:01 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Adds new idle property - Adds idle property (just like camerabin1), a boolean that - is true when camerabin2 isn't processing and can be shut down - without losing data. - -2011-03-15 10:50:54 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Adds tests for new image capture properties - Adds tests to check that changing encoder/muxer for image capture - works - -2011-03-15 10:11:43 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Adding properties for image capture settings - Adds properties for selecting image encoder and muxer for - image capture - -2011-03-14 14:33:57 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: More debug log - Small refactoring and adding more debug log to encodebin related - paths - -2011-03-14 14:30:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - basecamerasrc: Set preview pipeline NULL - Set preview pipeline to NULL when freed to be able to - recreate it on the following lines - -2011-03-23 22:02:37 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/audioparsers/gstdcaparse.c: - * gst/audioparsers/gstdcaparse.h: - dcaparse: Expose frame size in caps - This exports the size of the frame (number of bytes from one sync point - to the next) as the "frame_size" field in caps. - -2011-03-09 23:03:10 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/audioparsers/gstdcaparse.c: - * gst/audioparsers/gstdcaparse.h: - dcaparse: Expose block size in caps - This sets the "block_size" field on caps as the number of samples - encoded in one frame. - -2011-03-22 20:53:08 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: use running time for synchronization - See also #432612. - -2011-03-22 13:18:03 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gsth264parse.c: - h264parse: chain up to parent finalize - -2011-03-22 13:46:42 +0100 Chris E Jones <chris@chrisejones.com> - - * gst/scaletempo/gstscaletempo.c: - scaletempo: Correctly handle newsegment events with stop==-1 - Fixes bug #645420. - -2011-03-22 12:34:20 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * configure.ac: - configure.ac: redundant uses of AC_MSG_RESULT() - cleaned the redundant uses of AC_MSG_RESULT() in configure.ac - -2011-03-18 19:34:57 +0100 Luis de Bethencourt <luis@debethencourt.com> - - * autogen.sh: - autogen: wingo signed comment - -2011-03-21 13:31:15 -0700 David Schleef <ds@schleef.org> - - * gst/videofilters/Makefile.am: - * gst/videofilters/gstvideofilter2.c: - * gst/videofilters/gstvideofilter2.h: - * gst/videofilters/gstzebrastripe.c: - * gst/videofilters/gstzebrastripe.h: - zebrastripe: Add new GstVideoFilter2 base class - An experiment. Not completely happy with it. - -2011-03-21 20:40:14 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: Handle all ISO8859-x encodings in get_encoding() - ... according to ETSI EN 300 468, "Selection of character table" - -2011-02-21 11:44:01 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: do not try to parse packets containing section data as PES - -2011-02-21 11:42:54 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/tsdemux.c: - mpegtsdemux: add stream types for DSM CC A, B, C, D - -2011-03-21 18:54:46 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsdemux: fix playback if PMT is seen before PAT - The stream for the PMT pid has to be cleared since the version checking - in the packetizer won't emit the same PMT again otherwise. - -2011-03-21 16:51:16 +0100 Andreas Frisch <andreas.frisch@multimedia-labs.de> - - * gst/videoparsers/gsth264parse.c: - h264parse: Set parsed=true in the srcpad caps - Fixes bug #645412. - -2011-03-21 10:38:58 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/mpeg2enc/gstmpeg2enc.cc: - mpeg2enc: Lower the rank to MARGINAL - The rationale is that it can't be properly used right now when using - it to encode mpeg2video because of the needs-to-be-rewritten properties - and format negotiation. Other encoders will negotiate in a much saner - fashion. - One such example is that when you pick mpeg2enc for mpeg2video, the - default value for the 'format' property is "Generic MPEG-1", which is - completely wrong if downstream caps are mpeg2. The whole negotiation - code needs some serious loving before this plugin can be bumped back - up to a higher rank. - -2011-03-16 09:50:34 +0100 Benjamin Gaignard <benjamin.gaignard@linaro.org> - - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/fpsdisplaysink.h: - fpsdisplaysink: add "frames-dropped" and "frames-rendered" properties - https://bugzilla.gnome.org/show_bug.cgi?id=643469 - -2011-03-18 09:33:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Remove some unused variables in the I420 blending function - -2011-03-17 20:19:27 +0200 Raimo Järvi <raimo.jarvi@gmail.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Fix using alpha values in blitting. - Use each pixel's own alpha value instead of average alpha value when - calculating color components. Fixes bug #639763. - -2011-03-17 16:34:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/vp8/Makefile.am: - vp8: fix LIBADD order in Makefile.am - -2011-03-16 15:53:13 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/audioparsers/gstmpegaudioparse.c: - mpegaudioparse: add FIXME for making the base class use xing seek tables better - -2011-03-17 16:41:52 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/shmpipe.c: - shm: Don't use "sun" as a variable name, breaks on Solaris - Seems like the Solaris compiler has -Dsun=1, so don't use - sun as a variable name - Patch by Tim Mooney <mooney@dogbert.cc.ndsu.nodak.edu> - https://bugzilla.gnome.org/show_bug.cgi?id=645053 - -2011-03-17 15:27:39 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * configure.ac: - shm: Check for MSG_NOSIGNAL macro - Don't build the plugin is MSG_NOSIGNAL is not defined - https://bugzilla.gnome.org/show_bug.cgi?id=645053 - -2011-03-16 18:52:24 +0000 Sjoerd Simons <sjoerd.simons@collabora.co.uk> - - * sys/shm/gstshmsink.c: - shmsink: Keep shmsink referenced while there are still buffers around - -2011-03-16 18:51:50 +0000 Sjoerd Simons <sjoerd.simons@collabora.co.uk> - - * sys/shm/shmpipe.c: - * sys/shm/shmpipe.h: - shm: Allow ShmPipe to save a data pointer for applications - -2011-03-16 18:51:02 +0000 Sjoerd Simons <sjoerd.simons@collabora.co.uk> - - * sys/shm/shmpipe.c: - shm: Keep the ShmPipe alive as long as there are blocks left - -2011-03-09 19:34:39 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/gstshmsrc.c: - shmsrc: Only connect to sink in PLAYING in live mode - -2011-03-09 19:34:25 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/gstshmsrc.c: - shmsrc: Keep GstPoll for whole src lifetime - -2011-03-15 09:15:35 -0300 Lasse Laukkanen <lasse.laukkanen@digia.com> - - * gst/camerabin/camerabinpreview.c: - * gst/camerabin/gstcamerabin.c: - camerabin: Add an assertion to preview pipeline generation - Adds an assertion in case the preview pipeline is NULL and also - explicitly initializes preview caps to NULL for clarity. - -2011-03-14 18:25:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstdcaparse.c: - * gst/audioparsers/gstdcaparse.h: - dcaparse: Add depth and endianness to the caps - Some decoders can only handle specific endianness or a fixed - depth and this allows better negotiation. - Fixes bug #644208. - -2011-03-14 12:39:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: fix broken pad caps refcount handling - gst_caps_make_writable() takes ownership of the caps passed in, but - the caller doesn't own a ref to the caps here, because GST_PAD_CAPS - doesn't return a ref. Looks like the code relied on a caps leak - elsewhere for this to work properly. - -2011-03-14 12:33:29 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: don't error out if downstream fails to handle the newsegment event - If downstream doesn't handle the newsegment event, don't error out (esp. - not without posting a proper error message on the bus), but just continue. - If there's a problem, we'll find out when we start pushing buffers. - https://bugzilla.gnome.org/show_bug.cgi?id=644395 - -2011-03-11 14:40:44 +0000 Andreas Frisch <andreas.frisch@multimedia-labs.de> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: remove unused variable - -2011-03-11 18:23:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Set queues to silent - Optimize a little by setting queues to silent - -2011-03-11 16:20:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Refactoring encodebin usage - Refactor some common code regarding encodebin usage in camerabin2 - -2011-03-11 17:07:03 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Fix number of iteration of tests - There are 3 taglist tests, not 2 - -2011-03-11 10:32:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin2: Some memleak fixes - -2011-03-08 09:43:58 +0100 Robert Swain <robert.swain@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * tests/examples/camerabin2/gst-camerabin2-test.c: - basecamerasrc: wrappercamerabinsrc: camerabin2: Expose/add floating point zoom property - -2011-03-04 15:53:42 +0100 Robert Swain <robert.swain@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Remove dead definition - This definition is unused in this code. - -2011-03-10 11:38:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Avoid clearing recording caps - When recording 2 videos in sequence with the same video-capture-caps, - the second video would get a not-negotiated error because the - src caps were being cleared without any intention of - renegotiating it back to the requested capture caps. - This patch avoids this caps reset procedure unless a new - caps was set. - -2011-03-11 14:37:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videoparsers/gstdiracparse.c: - diracparse: Add correct template caps and element details - -2011-03-11 10:40:40 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/examples/camerabin2/Makefile.am: - examples: fix LDADD/LIBS path order for camerabin2 example - -2011-03-11 10:34:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: don't leak element name strings - Don't leak string copy returned by gst_element_get_name(). Also, check - for certain elements by checking the plugin feature / factory name, not - the assigned object name. - -2011-03-11 10:26:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/Makefile.am: - * gst/vmnc/Makefile.am: - build: remove more tarkin/theoraexp build cruft - -2011-03-10 13:39:40 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/Makefile.am: - * ext/tarkin/Makefile.am: - * ext/tarkin/README: - * ext/tarkin/TODO: - * ext/tarkin/WHAT_THE_HECK_IS_THIS_CODE_DOING: - * ext/tarkin/bitcoder.h: - * ext/tarkin/golomb.h: - * ext/tarkin/gsttarkin.c: - * ext/tarkin/gsttarkindec.c: - * ext/tarkin/gsttarkindec.h: - * ext/tarkin/gsttarkinenc.c: - * ext/tarkin/gsttarkinenc.h: - * ext/tarkin/info.c: - * ext/tarkin/mem.c: - * ext/tarkin/mem.h: - * ext/tarkin/rle.h: - * ext/tarkin/tarkin.c: - * ext/tarkin/tarkin.h: - * ext/tarkin/wavelet.c: - * ext/tarkin/wavelet.h: - * ext/tarkin/wavelet_coeff.c: - * ext/tarkin/wavelet_xform.c: - * ext/tarkin/yuv.c: - * ext/tarkin/yuv.h: - * ext/theora/Makefile.am: - * ext/theora/theoradec.c: - * ext/theora/theoradec.h: - * gst/videofilters/gstzebrastripe.h: - theora,tarkin: Remove ancient unused code - -2011-03-10 16:03:58 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: provide for PTS metadata when so configured - ... and not only when sort-of feeling like it. - In any case, if it turns out all really is in order, - and presumably DTS == PTS, then no ctts will be produced anyway. - -2011-03-10 16:02:42 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: also track original PTS buffer timestamp in reorder dts-method - -2011-03-09 14:53:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Force EOS on audio src - We can't rely on audio sources pushing EOS when going PAUSED->READY - because this is a basesrc bahavior and when used inside autoaudiosrc - the ghostpad goes flushing before the real source pushes the EOS, - so it is dropped. - -2011-03-04 06:06:16 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: No need for starting segment - -2011-03-04 06:09:43 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - gstcamerabin2: Set encodebin's videorate and audiorate properties - Listen to encodebin's element-added signal to be able to set - skip-to-first on both audiorates and videorates. - -2011-02-15 14:58:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Handle audio elements states - Audio elements are put into bin only when needed, so we need - to be careful with their states as camerabin2 won't manage - them if they are outside the bin. - Also we should reset their pad's flushing status before - starting a new capture. - -2011-01-21 12:47:57 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - camerabin2: tests: Update tests to check for audio streams - Add a check that resulting recorded video files have audio streams. - -2011-01-21 10:56:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin: adding audio related properties - Adds 4 audio properties related to audio recording - * audio-src - * mute - * audio-supported-capture-caps - * audio-capture-caps - -2011-01-20 09:34:39 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Adding audio support for video recordings - Adds an audio source and audio capsfilter/queue/convert, creating - a new branch on camerabin2 that is used to feed encodebin with - audio buffers for video recording. - -2011-02-28 15:43:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Add logging for stop-capture signal - -2011-02-24 18:28:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Add viewfinder caps related properties - Adds properties to check what caps are supported on the - viewfinder (from the camerasrc viewfinder pad) and another - one to set a caps for the viewfinder. - -2011-02-24 17:42:21 -0300 Lauri Lehtinen <lauri.lehtinen@digia.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - basecamerasrc: add virtual function to notify subclass of changing preview caps - Adds a virtual function to basecamerasrc in case subclasses want to be - notified of changing preview caps. This is useful if the subclass wants - to post the preview itself or if it wants to provide a preview buffer - as close to as possible to the user's requested resolution to the - preview generation pipeline. - -2011-02-22 13:10:15 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - examples: camerabin2: add option for setting the wrapper camera source - -2011-02-21 17:04:06 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * tests/examples/camerabin2/Makefile.am: - * tests/examples/camerabin2/gst-camerabin2-test.c: - examples: camerabin2: add encoding profile loading - -2011-02-17 14:51:16 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Fix newsegment pushing - Send update newsegments instead of non-update ones - for the video branch when starting recordings - -2011-02-15 14:59:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Set some queue's properties - Sets viewfinder queue to leaky and tell image branch - queue to don't care about durations - -2011-02-10 11:50:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Ready is enough for forcing a caps change - -2011-02-09 19:14:13 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Check for downstream caps on first captures - Use video_renegotiate and image_renegotiate booleans to make - the videosrc negotiate the capture caps on the first capture because - the caps might be set before wrappercamerabinsrc goes into PLAYING - and pads drop the internal renegotiate event. - This is required as the output-selector is using the 'none' negotiation - mode. - -2011-02-09 19:09:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Avoid fixating capture caps - When setting the internal capsfilter caps for capture we should put - the full caps instead of trying to fixate it ourselves. This way we let - the elements (and mostly the source) select the best format instead - of defaulting to what the pad fixation function picks. - -2011-02-09 08:27:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - camerabin2: examples: Allow free image dimensions - Changes the default width/height of captures so that it will - be autopicked by camerabin2 instead of hardcoding an option - -2011-02-09 08:15:08 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin2/gst-camerabin2-test.c: - camerabin2: examples: Backport fix from camerabin example - We should only check if the xwindow should be created if we already - parsed the arguments of the program - -2011-02-04 14:53:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - camerabin2: Moving preview image properties to basecamerasrc - Moves preview image related properties to basecamerasrc as that - should be present on all camerasrcs - -2011-02-08 15:51:42 +0200 Lasse Laukkanen <lasse.laukkanen@digia.com> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - basecamerasrc: Fix getting element implementing photography iface - -2011-02-03 12:02:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/Makefile.am: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabinpreview.h: - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/camerabingeneral.h: - * gst/camerabin2/gstwrappercamerabinsrc.h: - camerabin2: Move preview helper functions to basecamerabinsrc - Move preview helper functions to baseacamerabinsrc so they can - be reused by multiple camerabin2 sources. - -2011-02-03 16:58:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin2/.gitignore: - * tests/examples/camerabin2/Makefile.am: - * tests/examples/camerabin2/gst-camerabin2-test.c: - camerabin2: examples: Add gst-camerabin2-test - Adds gst-camerabin2-test example application, similar to - gst-camerabin-test for camerabin. - It is useful for taking pictures and recording videos using - camerabin2 and providing arguments for most of camerabin2 - properties - -2011-02-04 12:36:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Add viewfinder-sink property - Adds a property to set the viewfinder's sink of camerabin2 - -2011-03-09 13:19:50 +0200 René Stadler <mail@renestadler.de> - - * gst/fieldanalysis/gstfieldanalysis.c: - fieldanalysis: fix double free() crashes - -2011-03-08 17:29:20 +0000 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-03-08 17:03:22 +0000 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/directfb/dfbvideosink.c: - * ext/resindvd/rsnwrappedbuffer.c: - meta: update for new API - -2011-03-08 11:19:41 +0000 Byeong-ryeol Kim <brofkims@gmail.com> - - * gst/videofilters/Makefile.am: - videofilters: link to libm - https://bugzilla.gnome.org/show_bug.cgi?id=644176 - -2011-03-07 22:41:30 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - lv2: update url for port-groups extension - -2011-03-07 10:36:46 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - soundtouch: The pkg-config file in version 1.5 is called soundtouch - -2011-02-26 16:20:52 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/videofilters/Makefile.am: - * gst/videofilters/gstvideofiltersbad.c: - * gst/videofilters/gstzebrastripe.c: - * gst/videofilters/gstzebrastripe.h: - zebrastripe: New element - Adds zebra stripes to overexposed video. - -2011-03-04 17:37:04 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/Makefile.am: - ext: Always dist the curl directory - Event if we can't build it. Fixes make dist - -2011-03-04 17:26:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/sndfile/gstsfsink.c: - sfsink: use basesink preroll lock - -2011-03-04 13:39:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * sys/Makefile.am: - vdpau: disable until someone ports it - -2011-03-04 13:29:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - -2011-03-04 12:11:12 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/h263parse.c: - videoparsers: Fix unitialized variables - Makes macosx compiler happy - -2011-03-04 12:10:25 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/curl/gstcurlsink.c: - curlsink: Fix print-related issues - -2011-03-04 11:59:44 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/rtpvp8/gstrtpvp8pay.c: - rtpvp8: Fix unitialized variable - Makes macosx compiler happy. - -2011-03-04 09:25:49 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/fieldanalysis/gstfieldanalysisorc-dist.c: - * gst/fieldanalysis/gstfieldanalysisorc-dist.h: - fieldanalysis: add backup files for compiling without orc - -2011-03-03 00:57:09 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/h263parse.c: - * gst/videoparsers/h263parse.h: - h263parse: allocate H263Params struct on the stack - It's flat and not kept around for longer. - -2011-03-03 00:45:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/videoparsers/h263parse.c: - * gst/videoparsers/h263parse.h: - h263parse: minor clean-ups - const-ify some arguments and re-indent header a little. - -2011-02-28 11:51:54 +0100 benjamin gaignard <benjamin.gaignard@linaro.org> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplay: fix sync property default value - -2011-03-02 23:43:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/celt/gstceltdec.c: - * ext/celt/gstceltenc.c: - celtenc: Fix compilation with celt >= 0.11.0 - Fixes bug #643607. - -2010-09-15 17:32:09 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * configure.ac: - * gst/fieldanalysis/Makefile.am: - * gst/fieldanalysis/gstfieldanalysis.c: - * gst/fieldanalysis/gstfieldanalysis.h: - * gst/fieldanalysis/gstfieldanalysisorc.orc: - fieldanalysis: Add fieldanalysis element - This element analyses video buffers to identify if they are progressive, - interlaced or telecined and outputs buffers with appropriate flags for a - downstream element (which will be the deinterlace element, after some - forthcoming modifications) to be able to output progressive frames and - adjust timestamps resulting in a progressive stream. - -2011-03-01 11:23:49 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-colorspace.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-mpegtsdemux.xml: - * docs/plugins/inspect/plugin-rtmpsrc.xml: - * docs/plugins/inspect/plugin-rtpvp8.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-videoparsersbad.xml: - docs: update docs for recent changes in git - -2011-03-01 11:16:56 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-curl.xml: - * ext/curl/gstcurlsink.c: - docs: add new curl plugin and curlsink element to docs - -2011-03-01 10:49:57 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: also check for platform socket headers needed by curlsink element - -2011-03-01 10:03:07 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/curl/gstcurlsink.c: - * ext/curl/gstcurlsink.h: - curlsink: no need for a private instance structure - The entire instance structure is private anyway. - -2011-03-01 09:56:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/curl/gstcurlsink.c: - curlsink: clean up property registration code - Fix some typos, use same style as in all other plugins, avoiding - unnecessary temporary GParamSpec variables; use G_PARAM_SPEC_STATIC_STRINGS. - -2011-02-26 20:21:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - curl: add configure check and hook up to build system - -2011-02-26 20:20:33 +0000 Patricia Muscalu <patricia@axis.com> - - * ext/curl/Makefile.am: - * ext/curl/gstcurl.c: - * ext/curl/gstcurlsink.c: - * ext/curl/gstcurlsink.h: - curl: add libcurl-based sink element - Sink acts as a client and can connect to servers to - upload media. - https://bugzilla.gnome.org/show_bug.cgi?id=641496 - -2011-02-25 14:24:17 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/jp2k/gstjasperdec.c: - jp2kdec: post proper error when the image's colour space is not supported - https://bugzilla.gnome.org/show_bug.cgi?id=643115 - -2011-02-28 20:19:53 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - configure.ac: cygwin/mingw; enable plugin linking to static lib - Useful for DirectX plugin(s). - Fixes #642507. - -2011-02-28 19:58:41 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - configure.ac: export plugin description more platform independent - Fixes #642504. - -2011-02-28 18:33:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * common: - Automatic update of common submodule - From 1de7f6a to 6aec6b9 - -2011-02-27 19:39:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/directfb/dfbvideosink.c: - * ext/directfb/dfbvideosink.h: - * ext/resindvd/rsnparsetter.c: - * ext/resindvd/rsnwrappedbuffer.c: - * ext/resindvd/rsnwrappedbuffer.h: - meta: fix for new metadata api - -2011-02-26 14:54:49 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmetadata.h: - mxf: fix class struct - Fix class parent structure - Metadata is now GObject - -2011-02-26 14:22:46 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/resindvd/rsnparsetter.c: - * ext/resindvd/rsnwrappedbuffer.c: - * ext/resindvd/rsnwrappedbuffer.h: - miniobject: port rsndvd - -2011-02-26 13:39:01 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/directfb/dfbvideosink.c: - * ext/directfb/dfbvideosink.h: - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinvideo.c: - * gst/id3tag/id3tag.c: - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfalaw.c: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfdv-dif.c: - * gst/mxf/mxfjpeg2000.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfmux.c: - * gst/mxf/mxfup.c: - * gst/mxf/mxfvc3.c: - * gst/qtmux/gstqtmux.c: - miniobject: port to new 0.11 API - Remove miniobject and buffer subclassesusing GObject subclasses and - metadata. - -2011-02-28 12:06:12 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - Merge branch 'master' into 0.11 - Conflicts: - configure.ac - win32/common/config.h - -2011-02-26 13:53:44 -0800 David Schleef <ds@schleef.org> - - * gst/audioparsers/gstaacparse.c: - Revert "aacparse: allow parsed frames on sink pad" - This reverts commit e49b89d5c5a1244fa0dcb8bb4996e38fb9bff9e5. - -2011-02-25 19:59:05 -0800 David Schleef <ds@schleef.org> - - * gst/colorspace/gstcolorspace.c: - colorspace: set dithering enum directly - -2011-02-25 19:57:47 -0800 David Schleef <ds@schleef.org> - - * gst/colorspace/colorspace.c: - * gst/colorspace/gstcolorspace.c: - colorspace: Add support for r210 - -2011-02-23 17:25:03 -0800 David Schleef <ds@schleef.org> - - * gst/audioparsers/gstaacparse.c: - aacparse: allow parsed frames on sink pad - -2011-02-23 17:24:14 -0800 David Schleef <ds@schleef.org> - - * gst-libs/gst/baseparse/gstbaseparse.c: - baseparse: make_metadata_writable() fix - -2011-02-24 09:29:51 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/jifmux.c: - jifmux: tests: Increase bus waiting timeout - Double bus waiting timeout as sometimes the test would fail - because it would timeout and get no messages from the bus. - -2011-02-21 13:24:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/baseparse/gstbaseparse.c: - baseparse: rename GType from GstAudioBaseParseBad to GstBaseParseBad - We use it for video as well now. - -2011-02-21 12:14:59 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegpsmux/mpegpsmux.c: - * gst/qtmux/gstqtmux.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - Revert "Check that collectpads exists before removing pad" - This reverts commit 6d8740476ccd3a3498dc4f18c19733643825c7b8. - Depends on a core commit that was reverted - -2011-02-20 23:57:19 -0800 David Schleef <ds@schleef.org> - - * gst/mpegpsmux/mpegpsmux.c: - * gst/qtmux/gstqtmux.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - Check that collectpads exists before removing pad - The core now calls release pad from finalize, at which point - the collectpads might have already been freed. - -2011-02-20 23:01:30 -0800 David Schleef <ds@schleef.org> - - * gst/colorspace/colorspace.c: - colorspace: Fix YUV->RGB matrixing - -2011-02-20 22:43:56 -0800 David Schleef <ds@schleef.org> - - * gst/colorspace/colorspace.c: - * gst/colorspace/colorspace.h: - * gst/colorspace/gstcolorspace.c: - * gst/colorspace/gstcolorspace.h: - colorspace: Add dithering - Dithering only happens when a 16-bit-per-channel format is - involved. - -2011-01-11 10:32:47 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/xvid/gstxviddec.c: - xviddec: bodge to avoid crashes - It seems xvidcore overreads its input buffer, so a nasty workaround - is to allocate some more memory (16 bytes seem to be enough). - There is no apparent image corruption with these extra bytes set to 0, - valgrind is much happier, and the crashes go away. - It is ugly, and slower though. But then, xviddec is currently - not autoplugged for playback anyway. - https://bugzilla.gnome.org/show_bug.cgi?id=334107 - -2011-02-20 14:14:27 -0800 David Schleef <ds@schleef.org> - - * gst/colorspace/colorspace.c: - * gst/colorspace/gstcolorspace.c: - * gst/colorspace/gstcolorspaceorc.orc: - colorspace: fix a few formats - -2011-02-19 13:12:41 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/colorspace/colorspace.c: - * gst/colorspace/colorspace.h: - * gst/colorspace/gstcolorspace.c: - colorspace: Add 16-bit-per-channel handling - -2011-02-19 13:13:13 -0800 David Schleef <ds@schleef.org> - - * gst/colorspace/gstcolorspace.c: - colorspace: Fix memleak - -2011-02-19 13:07:39 -0800 David Schleef <ds@schleef.org> - - * ext/schroedinger/Makefile.am: - * ext/schroedinger/gstschro.c: - * ext/schroedinger/gstschroparse.c: - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstbasevideoparse.c: - * gst-libs/gst/video/gstbasevideoparse.h: - basevideocodec: remove parser in favor of baseparse - -2011-02-18 15:24:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - * gst/videoparsers/Makefile.am: - videoparsers: change plugin filename from libgsth263parse* to libgstvideoparsersbad* - Due to a registry bug you may need to manually remove your - registry file to make the new plugin appear with >0 features. - -2011-02-18 15:17:17 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegtsdemux/mpegtspacketizer.c: - mpegtspacketizer: fix log message printf format - -2011-02-18 15:05:31 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/baseparse/gstbaseparse.c: - baseparse: trim trailing whitespace - -2011-02-18 15:05:03 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/baseparse/gstbaseparse.c: - baseparse: use delta-unit flags instead of none - -2011-02-18 15:00:05 +0200 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/indexing/indexmpeg.c: - indexing-example: use proper signal names - -2011-02-18 09:40:00 +0100 Olivier Aubert <olivier.aubert@liris.cnrs.fr> - - * ext/rsvg/gstrsvgoverlay.c: - rsvgoverlay: allow negative values for x/y/width/height - -2011-02-18 12:39:08 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/videoparsers/Makefile.am: - videoparsers: fix build - Add includes and link against new libgstbaseparse in the - build tree. - -2011-02-17 14:32:46 -0800 David Schleef <ds@schleef.org> - - * gst/mpegtsdemux/Makefile.am: - mpegtsdemux: Fix disting of headers - -2011-02-17 13:22:28 -0800 David Schleef <ds@schleef.org> - - * gst-libs/gst/baseparse/gstbaseparse.h: - baseparse: update documentation for API changes - -2010-10-13 16:12:02 -0700 David Schleef <ds@schleef.org> - - * tests/check/Makefile.am: - * tests/check/elements/parser.c: - tests: fix baseparse test - -2010-10-09 15:08:39 -0700 David Schleef <ds@schleef.org> - - * gst/videoparsers/Makefile.am: - * gst/videoparsers/dirac_parse.c: - * gst/videoparsers/dirac_parse.h: - * gst/videoparsers/gstdiracparse.c: - * gst/videoparsers/gstdiracparse.h: - * gst/videoparsers/plugin.c: - videoparsers: Add dirac parser - -2011-02-17 13:20:46 -0800 David Schleef <ds@schleef.org> - - * tools/gst-element-maker: - element-maker: do test build with -fPIC - -2010-10-09 15:06:12 -0700 David Schleef <ds@schleef.org> - - * tools/element-templates/baseparse: - element-maker: Add baseparse template - -2010-10-13 15:39:55 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/baseparse/Makefile.am: - * gst-libs/gst/baseparse/gstbaseparse.c: - * gst-libs/gst/baseparse/gstbaseparse.h: - * gst/audioparsers/Makefile.am: - * gst/audioparsers/gstaacparse.h: - * gst/audioparsers/gstac3parse.h: - * gst/audioparsers/gstamrparse.h: - * gst/audioparsers/gstdcaparse.h: - * gst/audioparsers/gstflacparse.h: - * gst/audioparsers/gstmpegaudioparse.h: - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstbaseparse.c: - * gst/videoparsers/gstbaseparse.h: - * gst/videoparsers/gsth263parse.h: - * gst/videoparsers/gsth264parse.h: - * gst/videoparsers/h263parse.h: - baseparse: Create baseparse library - -2011-02-16 21:17:57 -0800 David Schleef <ds@schleef.org> - - * gst/dvdspu/gstspu-vobsub-render.c: - dvdsubdec: make up clut values if they weren't set - -2010-12-04 19:55:32 -0800 David Schleef <ds@schleef.org> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: fix release_pad - Remove bogus freeing of pad element_private data that we - never set (collectpads uses it, which causes confusion here). - Also, check that our collectpads instance exists before using - it. Partial fix for #636011. - -2011-02-17 21:33:56 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/mpegtsbase.c: - mpegtsdemux: use G_GUINT64_FORMAT as format specifier for guint64 - fixes compilation on 32bit - -2011-02-15 18:12:02 -0800 David Schleef <ds@schleef.org> - - * gst/colorspace/gstcolorspace.c: - colorspace: Fix memory leak - -2011-02-10 12:35:47 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/gstmpegdesc.c: - * gst/mpegtsdemux/gstmpegdesc.h: - mpegtsdemux: relicense gstmpegdefs.h, gstmpegdesc.h and gstmpegdesc.c to LGPL only - with permission from the license header: - """ - This library is licensed under 2 different licenses and you - can choose to use it under the terms of either one of them. The - two licenses are the MPL 1.1 and the LGPL. - """ - -2011-02-16 17:57:42 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * configure.ac: - * gst-plugins-bad.spec.in: - * gst/mpegtsdemux/Makefile.am: - * gst/mpegtsdemux/TODO: - * gst/mpegtsdemux/gstmpegdefs.h: - * gst/mpegtsdemux/gstmpegdesc.c: - * gst/mpegtsdemux/gstmpegdesc.h: - * gst/mpegtsdemux/gsttsdemux.c: - * gst/mpegtsdemux/mpegtsbase.c: - * gst/mpegtsdemux/mpegtsbase.h: - * gst/mpegtsdemux/mpegtspacketizer.c: - * gst/mpegtsdemux/mpegtspacketizer.h: - * gst/mpegtsdemux/mpegtsparse.c: - * gst/mpegtsdemux/mpegtsparse.h: - * gst/mpegtsdemux/tsdemux.c: - * gst/mpegtsdemux/tsdemux.h: - mpegtsdemux: add MPEG TS demuxer rewrite from Edward Hervey - with contributions from Miquel Angel Farre Guiu and Zaheer Abbas Merali - -2011-02-17 14:12:43 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/gstbaseparse.c: - baseparse: tune QUERY_SEEKING response - Even if we currently do not have a duration yet, assume seekable if - it looks like we'll likely be able to determine it later on - (which coincides with needed information to perform seeking). - -2011-02-07 14:46:57 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: tune QUERY_SEEKING response - Even if we currently do not have a duration yet, assume seekable if - it looks like we'll likely be able to determine it later on - (which coincides with needed information to perform seeking). - Fixes #641047. - -2011-02-17 12:28:56 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: remove extraneous buffer unref - -2011-02-16 15:29:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * Makefile.am: - * tests/icles/Makefile.am: - * tests/icles/equalizer-test.c: - icles: Completely remove equalizer-test from -bad, it's in -good now - -2011-02-16 15:23:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/icles/equalizer-test.c: - equalizer-test: Initialize debug category after gst_init() to fix segfault - -2011-02-14 12:53:49 +0200 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From f94d739 to 1de7f6a - -2011-02-14 12:14:12 +0200 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/Makefile.am: - docs: remove duplicated rule from Makefile.am - This causes a make warning and might even cause dist-failure. Other modules - don't need to override the target either and if we can fi it in - common/gtk-doc-plugins.mak. - -2011-02-14 11:48:34 +0200 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - docs: add rsvg plugin to the docs - -2011-02-14 11:42:52 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/rsvg/gstrsvgdec.c: - rsvgdec: add basic doc-blob - -2011-02-11 17:59:31 +0100 Olivier Aubert <olivier.aubert@liris.cnrs.fr> - - * ext/rsvg/gstrsvgoverlay.c: - * ext/rsvg/gstrsvgoverlay.h: - rsvgoverlay: implement x/y/width/height (absolute and relative) positioning and dimensioning - Signed-off-by: Olivier Aubert <olivier.aubert@liris.cnrs.fr> - -2011-02-10 16:00:03 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinvideo.c: - camerabin: application element memory leak fixes - If videobin/imagebin was never set to READY state the ownership - of elements created and set by application were never taken by - bin and therefore gst_object_sink is called for these elements - before unreffing (they may still be in floating state and not - unreffed properly without sinking first) - -2011-02-10 10:35:18 +0800 Hu Gang <gang.a.hu@intel.com> - - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - photography interface: update the noise_reduction type from guint to GstPhotographyNoiseReduction - https://bugzilla.gnome.org/show_bug.cgi?id=616814 - -2011-02-08 23:39:24 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - * gst/videoparsers/gstbaseparse.c: - baseparse: Update min/max bitrate before first posting them - This avoids posting an initial min-bitrate of G_UINTMAX and max-bitrate - of 0. - https://bugzilla.gnome.org/show_bug.cgi?id=641857 - -2011-02-08 23:50:13 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/audioparsers/gstmpegaudioparse.c: - * gst/audioparsers/gstmpegaudioparse.h: - mpegaudioparse: Post CBR bitrate as nominal bitrate - Even if VBR headers are missing, we can't guarantee that a stream is in - fact a CBR stream, so it's safer to let baseparse calculate the average - bitrate rather than assume a CBR stream. However, in order to make - /some/ metadata available before the requisite number of frames have - been parsed, this posts the bitrate from the non-VBR headers as the - nominal bitrate. - https://bugzilla.gnome.org/show_bug.cgi?id=641858 - -2011-02-04 01:00:55 -0200 Luciana Fujii Pontello <luciana@fujii.eti.br> - - * gst/camerabin/gstcamerabin.c: - camerabin: Always take photo when preview-caps is set - When filename is not set, but preview-caps is set, take the photo and - send its preview. - -2011-01-26 11:49:48 -0200 Luciana Fujii Pontello <luciana@fujii.eti.br> - - * gst/camerabin/gstinputselector.c: - camerabin: Events with select-all in input-selector - When select-all was set, input-selector wasn't handling upstream events. - Now input-selector forwards the event to all of its sink pads. This - changes the input-selector internal to camerabin until it is replaced - with a better solution. - -2011-02-07 23:17:55 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * sys/directdraw/gstdirectdrawsink.c: - directdrawsink: avoid aspect-ratio borders overlying other windows - Fixes #632056. - -2011-02-07 22:47:34 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * sys/directdraw/gstdirectdrawsink.c: - directdrawsink: avoid rendering to invalid area - Based on patch by Havard Graff <havard.graff@tandberg.com> - Fixes #594280. - -2011-02-08 11:24:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Do not re-set the clock if it is null - Avoids not needed work and doesn't assert when trying to - unref the null reference - -2011-02-07 09:50:22 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * tests/examples/camerabin/gst-camerabin-test.c: - examples: camerabin: fix --no-xwindow option handling in gst-camerabin-test - --no-window flag is false by default and selection based on the option whether - to create XWindow is done before options are parsed. Therefore XWindow is never - created. - https://bugzilla.gnome.org/show_bug.cgi?id=641712 - -2010-09-06 14:10:11 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstamrparse.c: - amrparse: a valid amr-wb frame should not have reserved frame type index - See #639715. - -2011-02-07 14:05:34 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - configure.ac: set GST_LIB_LDFLAGS - Aligns GST_LIB_LDFLAGS with e.g. -base to arrange for proper exports in libs. - -2011-01-12 17:13:07 +0200 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/camerabin/Makefile.am: - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin2/Makefile.am: - * tests/examples/camerabin2/gst-camera2.c: - camerabin-tests: fix lookup of UI files - These are uninstalled examples. Pass $srcdir to cpp to build the correct - location for the UI file. - -2011-02-04 09:08:26 +0100 Alexey Fisher <bug-track@fisher-privat.net> - - * ext/vp8/gstvp8enc.c: - vp8enc: Add description for bitrate units. - -2011-02-03 15:22:51 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstimagecapturebin.c: - imagecapturebin: Fix property setting - Set the property on the child and not on itself causing infinite - looping - -2011-02-01 11:20:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Improve preview checking - -2011-02-01 11:19:53 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Fix preview messages - Image previews where being posted in sync with the buffers - timestamps, this makes no sense as previews should be posted ASAP. - Also adds some debugging messages. - -2011-02-01 11:19:29 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - wrappercamerabinsrc: Handle src state change to avoid losing timestamps - Camerabin2 uses state changes to force the source to renegotiate its - caps to the capture formats. The state changes makes the source lose - its clock and base_time, causing it to stop timestamping the buffers. - We still need a proper way to make sources renegotiate its caps, so this - patch is a hack to make the source continue timestamping buffers even - after changing state. The patch works by getting the clock and base - time before doing the state change to NULL and setting them back - after putting it to PLAYING again. It also cares to drop the first - new segment after this state change. - -2011-01-27 15:35:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: preview filter tests - Adds tests to the preview-filter property of camerabin2 - -2011-01-27 14:39:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/camerabingeneral.h: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - camerabin2: Add preview-filter property - Adds a property to select a custom element for preview pipeline - buffers processing - -2011-01-27 10:19:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Add tests for custom filters - Adds tests to check that custom filters elements receive buffers - -2011-01-26 15:27:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Add custom filter properties - Adds custom filter properties for camerabin2. Custom filters - can be added to video/image/preview branches. - -2011-02-03 16:24:24 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/camerabin/camerabinpreview.c: - camerabin: Initialize variables - Makes compilers happy - -2011-02-02 18:41:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix up enum nick names - https://bugzilla.gnome.org/show_bug.cgi?id=591651 - -2011-01-31 17:24:24 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/dccp/gstdccp.c: - * gst/dccp/gstdccp_common.h: - dccp: use socklen_t where appropriate rather than specific type - In particular, fixes Cygwin build where socklen_t is defined as int - in line with native win32 api definition. - -2011-02-01 20:01:13 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/rtpvp8/Makefile.am: - rtpvp8: also link against libgstbase-0.10 for adapter and bit reader API - https://bugzilla.gnome.org/show_bug.cgi?id=641178 - -2011-02-01 14:40:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * gst/id3tag/id3tag.c: - id3mux: map new GST_TAG_ENCODED_BY to ID3v2 TENC frame - https://bugzilla.gnome.org/show_bug.cgi?id=627268 - -2011-01-31 17:45:19 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/videoparsers/Makefile.am: - videoparsers: dist h264parse.h, fixing make distcheck - Spotted by Nathanael D. Noblet - -2011-01-14 10:19:28 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * gst/camerabin/camerabinpreview.c: - * gst/camerabin/camerabinpreview.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: optimize setting new caps for preview image pipeline - Avoid re-creating and linking of preview image pipeline when - setting new preview image caps. Backported from camerabin2. - https://bugzilla.gnome.org/show_bug.cgi?id=639502 - -2011-01-30 17:08:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/rtpvp8/Makefile.am: - rtpvp8: fix LIBS and CFLAGS order in Makefile.am - -2011-01-23 17:02:38 +0000 Sjoerd Simons <sjoerd@luon.net> - - * gst/rtpvp8/gstrtpvp8depay.c: - rtpvp8depay: Accept packets with only one byte of data - When fragmenting partions it can happen that an RTP packet only caries 1 - byte of RTP data. - -2011-01-23 16:42:17 +0000 Sjoerd Simons <sjoerd@luon.net> - - * gst/rtpvp8/gstrtpvp8pay.c: - * gst/rtpvp8/gstrtpvp8pay.h: - rtpvp8pay: Treat the frame header just like any other partition - When setting up the initial mapping just act as if the global frame - information is another partition. This saves special-casing it later in - the actual packetizing code. - -2010-05-16 17:23:17 +0100 Sjoerd Simons <sjoerd@luon.net> - - * configure.ac: - * gst/rtpvp8/Makefile.am: - * gst/rtpvp8/gstrtpvp8.c: - * gst/rtpvp8/gstrtpvp8depay.c: - * gst/rtpvp8/gstrtpvp8depay.h: - * gst/rtpvp8/gstrtpvp8pay.c: - * gst/rtpvp8/gstrtpvp8pay.h: - rtpvp8: Add simple payloaders and depayloaders for VP8 - Minimal implementation of http://www.webmproject.org/code/specs/rtp/, - version 0.3.2 - -2011-01-28 12:38:19 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gsth264parse.c: - * gst/videoparsers/gsth264parse.h: - * gst/videoparsers/h264parse.c: - * gst/videoparsers/h264parse.h: - * gst/videoparsers/plugin.c: - videoparsers: add h264parse - Functionally equivalent to (legacy)h264parse and re-uses the latter's low - level NAL parsing, but otherwise based on GstBaseParse, and replacing - some property configuration with caps negotiation. - -2011-01-27 18:20:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: rename to legacyh264parse - -2011-01-27 18:16:14 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * gst/videoparsers/Makefile.am: - * gst/videoparsers/gstbaseparse.c: - * gst/videoparsers/gstbaseparse.h: - * gst/videoparsers/gsth263parse.c: - * gst/videoparsers/gsth263parse.h: - * gst/videoparsers/h263parse.c: - * gst/videoparsers/h263parse.h: - * gst/videoparsers/plugin.c: - h263parse: move to videoparsers and separate plugin registration - -2011-01-27 18:03:50 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h263parse/gstbaseparse.c: - * gst/h263parse/gstbaseparse.h: - * gst/h263parse/gsth263parse.c: - h263parse: update to latest baseparse - -2011-01-06 12:29:34 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h263parse/Makefile.am: - * gst/h263parse/gsth263parse.c: - * gst/h263parse/gsth263parse.h: - * gst/h263parse/h263parse.c: - * gst/h263parse/h263parse.h: - h263parse: shuffle code to untangle h263parse and parameter parsing - -2011-01-06 12:34:12 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h263parse/gsth263parse.c: - * gst/h263parse/gsth263parse.h: - * gst/h263parse/h263parse.c: - h263parse: provide for proper debug category, min frame size and code style - -2010-12-10 16:40:44 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h263parse/gsth263parse.c: - h263parse: remove redundant get_caps - .. as src pad already set to use fixed_caps - -2010-12-10 16:26:27 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h263parse/gsth263parse.c: - * gst/h263parse/gsth263parse.h: - h263parse: simplify valid_frame parsing - ... considering that baseparse takes care of skipping etc - -2010-05-14 02:08:03 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * configure.ac: - * gst/h263parse/Makefile.am: - * gst/h263parse/gstbaseparse.c: - * gst/h263parse/gstbaseparse.h: - * gst/h263parse/gsth263parse.c: - * gst/h263parse/gsth263parse.h: - * gst/h263parse/h263parse.c: - h263parse: Add an h263parse element - This adds an h263parse element for parsing H.263 streams, breaking them - up into frame-sized buffers, and exporting metadata such as profile and - level. - https://bugzilla.gnome.org/show_bug.cgi?id=622276 - -2011-01-27 16:52:34 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstac3parse.c: - ac3parse: improve handling of dependent substream frames - In particular, timestamps of these should track main-stream timestamps. - -2011-01-21 14:53:39 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: tune default duration estimate update interval - Rather than a fixed default frame count, estimate frame count to aim for - an interval duration depending on fps if available, otherwise use old - fixed default. - -2011-01-14 15:16:04 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: reverse playback; mind keyframes for fragment boundary - -2011-01-13 15:26:21 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstamrparse.c: - amrparse: properly check for sufficient available data prior to access - -2011-01-12 14:40:37 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: ensure non-empty candidate frames - -2011-01-11 15:24:23 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: clarify some debug statements - -2011-01-11 15:24:02 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: properly track upstream timestamps - ... rather than with a delay. - -2011-01-11 15:23:29 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: need proper frame duration to obtain sensible frame bitrate - -2011-01-11 15:22:51 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: proper initial values for index tracking variables - -2011-01-11 12:05:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: arrange for consistent event handling - -2011-01-10 16:59:59 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.h: - baseparse: header style cleaning - -2011-01-10 17:07:38 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: provide some more initial frame metadata in parse_frame - ... and document accordingly. - -2011-01-10 16:56:36 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - * gst/audioparsers/gstflacparse.c: - baseparse: refactor passthrough into format flags - Also add a format flag to signal baseparse that subclass/format can provide - (parsed) timestamp rather than an estimated one. In particular, such "strong" - timestamp then allows to e.g. determine duration. - -2011-01-10 15:34:48 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - * gst/audioparsers/gstac3parse.c: - * gst/audioparsers/gstamrparse.c: - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - * gst/audioparsers/gstdcaparse.c: - * gst/audioparsers/gstflacparse.c: - * gst/audioparsers/gstmpegaudioparse.c: - baseparse: introduce a baseparse frame to serve as context - ... and adjust subclass parsers accordingly - -2011-01-07 16:39:51 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - baseparse: restrict duration scanning to pull mode and avoid extra set_caps call - -2011-01-07 15:58:49 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - baseparse: update some documentation - Also add some more debug. - -2011-01-06 11:41:44 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: allow increasing min_size for current frame parsing only - Also check that subclass actually either directs to skip bytes or - increases expected frame size to avoid going nowhere in bogus - indefinite looping. - -2011-01-14 15:26:37 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baesparse: fix refactor regression in loop based parsing - -2011-01-06 11:16:56 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: pass all available data to subclass rather than minimum - Also reduce some adapter calls and add a few debug statements. - -2010-12-10 15:59:49 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: fix reverse playback handling - -2010-12-10 14:56:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: minor typo and debug statement cleanup - -2010-12-10 14:40:05 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - baseparse: reduce locking - ... which is either already mute and/or implicitly handled by STREAM_LOCK. - -2011-01-27 17:32:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/h264/gstvdph264dec.c: - vdpau: Initialize some variables to make gcc 4.6 happy - -2011-01-27 17:29:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: Initialize some variables to make gcc 4.6 happy - -2011-01-26 18:45:56 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/jp2k/gstjasperdec.c: - * ext/jp2k/gstjasperenc.c: - jp2kdec, jp2kenc: add support v308 (4:4:4 YUV) - Because we can. - -2011-01-26 14:27:21 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Use the correct for limit - There are 3 taglists to be tested, not 2 - -2011-01-26 11:40:43 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin2: Do not forget to unref some stuff - Cleanup properly by unrefing the encoding profile and preview caps - -2011-01-26 10:54:53 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/camerabingeneral.h: - * gst/camerabin2/gstimagecapturebin.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin2: Add names to some elements - Adds names to instances of some elements to make debugging easier - -2011-01-25 18:10:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Handle videosink states more carefully - When going to ready, camerabin2 could create an empty file - if the videosink was put to ready. This patch only puts videosink - to ready on the PAUSED_TO_READY state change if it is on PAUSED - or PLAYING. - -2011-01-14 14:08:38 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: avoid loop in frame locating interpolation - -2011-01-24 23:32:30 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/rsvg/gstrsvgoverlay.c: - rsvgoverlay: Do not segfault on unexistent files - When passing an unexistent file to rsvgoverlay it would - crash because the svg loading would fail without setting - an error. - This patch makes it check if the handle was actually created - and logs an error in case it didn't. Maybe it should post an - error to the bus, but the previous error handling didn't, so - I just followed the same logic. - -2011-01-24 18:37:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin/gst-camerabin-test.c: - examples: camerabin: add timing printing for preview image - Measure and print the time taken to generate preview image. And - fix a typo - -2011-01-24 18:36:58 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Remove unused macro - -2011-01-12 16:26:19 +0200 Lasse Laukkanen <lasse.laukkanen@digia.com> - - * tests/examples/camerabin/gst-camerabin-test.c: - examples: camerabin: Don't set default values for GstPhotography interface settings - Don't set any default values for source element GstPhotography interface - settings, source elements should have sane defaults themselves. - Also, setting scene-mode is tricky as it is a superset of other GstPhotography - settings. This might cause problem with defaults e.g. setting scene-mode to - 'night' may configure flash-mode as 'on' by definition, and after that - we don't want to override this flash-mode setting with gst-camerabin-test default - value. Moreover, user needs have an option to set scene mode first and then force - some individual setting to a different value from the scene-mode definition. - https://bugzilla.gnome.org/show_bug.cgi?id=639841 - -2011-01-24 17:46:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Check the start time of buffers - Be careful when trying to create a newsegment event to avoid - start times of -1 from invalid buffer timestamps - -2011-01-11 15:52:03 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/dvdspu/gstspu-vobsub-render.c: - dvdspu: don't write clipped lines to the output buffer - We may not increment the output pointer, but it'll still be just - off the end of the allocated area. - https://bugzilla.gnome.org/show_bug.cgi?id=602847 - -2011-01-19 15:07:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/PORTING: - camerabin2: Update porting file - Adds porting information about using encodebin on camerabin2 - -2011-01-14 08:12:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/PORTING: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstimagecapturebin.c: - camerabin2: Add image-done message - Post an image-done message when a new image is saved to disk - -2011-01-11 14:50:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * tests/check/Makefile.am: - * tests/check/elements/camerabin2.c: - camerabin2: Implement tagsetter interface - -2011-01-11 10:29:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Add preview image to tests - Adds tests for checking that preview images are posted with - the correct caps on tests - -2011-01-11 09:12:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Add a property to select the encoding profile - Adds a video-profile to allow selecting which encoding profile - to use for video recordings - -2011-01-11 08:44:41 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/Makefile.am: - * gst/camerabin2/gstplugin.c: - * gst/camerabin2/gstvideorecordingbin.c: - * gst/camerabin2/gstvideorecordingbin.h: - * tests/check/Makefile.am: - * tests/check/elements/videorecordingbin.c: - camerabin2: Removing videorecordingbin - Removing videorecordingbin as we now use encodebin for it - -2010-12-27 11:29:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/Makefile.am: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Move to encodebin - -2011-01-10 15:19:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Set output-selector pad-negotiation-mode to none - Use output-selector none negotiation mode as it was the default before - the last changes. This likely needs to be fixed to use 'active' on - camerabin2 - -2011-01-10 15:19:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Handle state change failures - When its internal element fails to change state, don't act as - if succeeded. - -2010-12-30 00:27:03 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - camerabin2: Implement previewing - Implement previewing functionality using 2 properties. A boolean - (post-previews) that indicates if previews should be posted, and a - GstCaps (preview-caps) to provide the desired preview caps. - wrappercamerabinsrc implements previewing by supplying the captured - image to a pipeline to adapt it to the required caps before posting. - -2010-12-30 00:26:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst/camerabin2/Makefile.am: - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/camerabingeneral.h: - camerabin2: Add methods for preview image message posting - Adds a helper struct and functions for implementing a preview message - in camerabin2. - -2010-12-29 23:48:31 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - camerabin2: tests: Use mainloops - Use mainloops instead of sleeps to read bus messages and catch - errors. - -2010-12-29 14:12:06 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Use drop_eos function from camerabingeneral - There was already a event probe function for dropping EOS on - camerabingenereal, so use that instead of replicating the code - -2011-01-24 11:55:41 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - * tests/check/elements/imagecapturebin.c: - tests: camerabin2: imagecapturebin2: fix warnings - Warnings passed me by on the last commits to camerabin2 tests, - fixing them. - -2011-01-24 11:05:41 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - tests: camerabin2: Only run a test if -good 0.10.27 is present - A camerabin2 tests depends on the commit - dcbba0932dc579abd6aab4460fa1a416374eda1b for jpegenc on -good - that was released on 0.10.27. - This patch makes it check for this version before running the - test. - -2011-01-24 10:08:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/imagecapturebin.c: - tests: imagecapturebin: Only run a test if -good is 0.10.27 or newer - One test on imagecapturebin requires dcbba0932dc579abd6aab4460fa1a416374eda1b - on good that was released on 0.10.27. - https://bugzilla.gnome.org/show_bug.cgi?id=640286 - -2011-01-18 17:31:06 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/camerabingeneral.c: - * gst/camerabin/camerabingeneral.h: - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/gstcamerabin.c: - camerabin: add names for more elements - -2011-01-24 11:18:29 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colorspace.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * win32/common/config.h: - Back to development - -=== release 0.10.21 === - -('0', '10', '21') -2011-01-21 21:13:22 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colorspace.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.10.21 - -2011-01-19 20:00:13 -0800 David Schleef <ds@schleef.org> - - * tools/gst-element-maker: - element-maker: Fix handling of debug category - -2011-01-19 18:26:30 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: mind gst_buffer_unref not liking NULL - Fixes #639950. - -2011-01-18 18:18:03 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/mxf/mxfdemux.c: - mxfdemux: Fix unitialized variable warning - -2011-01-18 13:00:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colorspace.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * win32/common/config.h: - 0.10.20.4 pre-release - -2011-01-14 16:30:11 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - audioparsers: baseparse: Be careful to not lose the event ref - Don't unref the event if it hasn't been handled, because the caller - assumes it is still valid and might reuse it. - I ran into this problem when transcoding an AVI (with mp3 inside) - to gpp. - https://bugzilla.gnome.org/show_bug.cgi?id=639555 - -2011-01-13 11:28:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/qtmux.c: - test: qtmux: Tests qtmux reuse - Forces the use of qtmux after it has been put to PLAYING and back - to NULL once - https://bugzilla.gnome.org/show_bug.cgi?id=639338 - -2011-01-13 15:27:36 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: set src pads when starting file - ... rather than at _init time, so they are also available following a - pad (de)activation cycle. - https://bugzilla.gnome.org/show_bug.cgi?id=639338 - -2011-01-12 16:39:22 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - * ext/kate/gstkatetiger.h: - * ext/kate/gstkateutil.c: - kate: ensure the kate pad does not shoot ahead of the video pad - Sync both pads by waiting in the kate chain function. - Do not reset our internal segment from segment updates, in order - to be able to map video running time to kate running time, to - give libtiger the timestamp it expects. This allows us to use - running time to sync to video, which is The Right Way. - https://bugzilla.gnome.org/show_bug.cgi?id=600929 - -2011-01-13 18:35:15 -0200 Luciana Fujii Pontello <luciana@fujii.eti.br> - - * gst/camerabin/gstcamerabin.c: - camerabin: Enable conversion flags - Camerabin default should just work, so we need to enable audio, image - and video conversions. - https://bugzilla.gnome.org/show_bug.cgi?id=639456 - -2011-01-13 17:10:13 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/audioparsers/gstdcaparse.c: - dcaparse: fix sync word for 14-bit little endian coding - Fix copy'n'paste bug that made us look for the raw little endian - sync word twice instead of looking for the 14-bit LE sync word - as well. Fixes parsing of such streams (see #636234 for sample file). - -2011-01-13 16:27:04 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - docs: minor baseparse docs/comment fixes - Remove copy'n'paste leftovers. - -2011-01-13 13:36:09 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: set pad-negotiation-mode to active for output-selector - Fixes #639413. - -2011-01-12 16:55:07 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/asfmux/gstasfmux.c: - asfmux: use g_error_free instead of g_free - -2011-01-12 16:50:51 +0200 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/camerabin2/gst-camera2.c: - camerabin2: use g_error_free instead of g_free - -2011-01-12 11:57:29 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/y4m/gsty4mdec.c: - y4mdec: Default colorspace is I420 - https://bugzilla.gnome.org/show_bug.cgi?id=639296 - -2011-01-11 23:44:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * win32/common/config.h: - 0.10.20.3 pre-release - -2011-01-11 15:50:52 +0200 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From e572c87 to f94d739 - -2011-01-10 19:11:22 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtspacketizer: Don't forget the GType when using caps_new_simple() - -2011-01-10 16:36:45 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From ccbaa85 to e572c87 - -2011-01-10 14:54:10 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From 46445ad to ccbaa85 - -2011-01-10 11:25:47 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsdemux: fix silly way of creating caps - -2011-01-10 11:18:52 +0000 Karol Sobczak <napewnotrafi@gmail.com> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsdemux: fix re-syncing on invalid data after seek - Or possibly even at startup. If we couldn't find a sync within - the first few bytes, we'd just push more data into the adapter - but never discard any of the invalid data at the beginning, so - would never be able to re-sync. - https://bugzilla.gnome.org/show_bug.cgi?id=639063 - -2011-01-08 03:12:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/cog/gstcogdownsample.c: - * ext/cog/gstcogutils.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroparse.c: - * ext/schroedinger/gstschroutils.c: - cog, schroedinger: fix warnings when compiling with -DG_DISABLE_ASSERT - -2011-01-08 03:10:00 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * ext/cog/gstcogorc-dist.c: - * ext/cog/gstcogorc-dist.h: - * win32/common/config.h: - 0.10.20.2 pre-release - -2011-01-08 02:49:06 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colorspace.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - docs: update docs - -2011-01-08 02:47:12 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * po/bg.po: - * po/ca.po: - * po/ja.po: - po: update translations - -2011-01-08 02:43:41 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/camerabin/Makefile.am: - * gst/camerabin/camerabingeneral.c: - * gst/camerabin/gstcamerabin-marshal.list: - * gst/camerabin/gstinputselector.c: - * gst/camerabin/gstinputselector.h: - camerabin: use private input-selector that still has "select-all" property - The "select-all" property was removed when input-selector was moved - to core, but camerabin uses this, so make camerabin use a private - copy until a better fix is found. - -2011-01-08 00:32:21 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/Makefile.am: - tests: Makefile.am clean-up - Avoid duplicates GST_CHECK_CFLAGS and GST_OPTIONS_CFLAGS are already in - AM_CFLAGS. Add LDADD instead of GST_CHECK_LIBS for consistency. - -2011-01-08 00:19:06 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/smoothwave/demo-osssrc.c: - smoothwave: remove old 0.8 example containing code with sideeffects in g_return_if_fail() - May just as well remove it rather than fix it, so it doesn't show - up in greps for this any longer. - -2011-01-08 00:18:17 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/.gitignore: - tests: make git ignore new schroenc test binary - -2011-01-08 00:17:26 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/Makefile.am: - tests: fix CFLAGS and LIBADD order in Makefile.am - -2011-01-08 00:08:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/Makefile.am: - tests: never disable g_assert() and cast checks for the unit tests - The unit tests are riddled with g_assert() and friends, make sure we - don't disable assert and cast checks for the unit tests even if - this has been specified for the rest of the code base, e.g. via - --disable-glib-asserts. - -2011-01-08 00:01:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/directfb/dfb-example.c: - directfb: don't put code with side-effects into g_assert() - It will all be turned into a NOOP if -DG_DISABLE_ASSERT is used - (as it is for pre-releases and releases). - -2011-01-07 23:57:21 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/xvid/gstxvidenc.c: - xvidenc: don't put code with side effects into g_return_val_if_fail() - And don't use g_return*_if_fail() for error handling in elements. - -2011-01-07 18:49:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegvideoparse/mpegpacketiser.c: - * gst/mpegvideoparse/mpegpacketiser.h: - * gst/mpegvideoparse/mpegvideoparse.c: - * gst/mpegvideoparse/mpegvideoparse.h: - Revert "mpegvideoparse: fix timestamp generation" - This reverts commit 2271608c4314d6d0a685c18c5c47d55495586159. - This patch needs more work so it doesn't cause grave playback - regressions (multi-second freezes) with some files that have - slightly broken timestamps but play fine everywhere else. - https://bugzilla.gnome.org/show_bug.cgi?id=636279 - https://bugzilla.gnome.org/show_bug.cgi?id=632222 - -2011-01-07 15:47:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: fix --disable-external - -2011-01-07 14:51:46 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: use $LIBM instead of hard-coding -lm - -2011-01-07 15:22:07 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: don't leak the caps - -2011-01-07 02:10:33 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegdemux/flutspmtinfo.c: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: fix PAT and PMT info-related object leaks - -2011-01-06 12:51:27 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: Fix unitialized variable on macosx - -2011-01-06 12:50:14 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/jp2kdecimator/jp2kcodestream.c: - jp2kdecimator: Fix unitialized variables on macosx - -2011-01-06 12:49:43 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: Fix unitialized variable on macosx - -2010-12-15 15:58:48 -0800 David Schleef <ds@schleef.org> - - * gst/y4m/gsty4mdec.h: - y4mdec: Fix copyright - -2010-12-17 14:50:50 -0800 David Schleef <ds@schleef.org> - - * tools/element-templates/pushsrc: - * tools/gst-element-maker: - element-maker: improve pushsrc - -2011-01-05 16:43:45 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/y4m/gsty4mdec.c: - y4m: Fix unitialized variables on macosx - -2011-01-05 13:44:04 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvbsuboverlay/Makefile.am: - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/ffmpeg-colorspace.h: - dvbsuboverlay: some more minor clean-ups - -2011-01-04 16:03:01 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: fix leak of "clear screen" DVBSubtitles structs - -2011-01-04 13:51:21 +0000 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: fix two minor deinitialization memory leaks - -2011-01-03 23:55:59 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/examples/Makefile.am: - examples: dist camerabin2 example as well - https://bugzilla.gnome.org/show_bug.cgi?id=638604 - -2011-01-03 23:49:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/camerabin2/Makefile.am: - camerabin2: fix cflags and libs order in Makefile.am - -2011-01-03 23:47:33 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/Makefile.am: - basecamerabinsrc: fix libs order in Makefile.am - -2011-01-03 23:46:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/Makefile.am: - build: fix disting of experimental basecamerabinsrc lib used by camerabin2 - https://bugzilla.gnome.org/show_bug.cgi?id=638604 - -2011-01-03 17:10:36 -0600 Rob Clark <rob@ti.com> - - * sys/dvb/camswclient.c: - * sys/dvb/gstdvbsrc.c: - dvb: fix build errors on macosx - fixes the following compile errors: - cc1: warnings being treated as errors - camswclient.c: In function 'cam_sw_client_open': - camswclient.c:81: warning: implicit declaration of function 'strncpy' - camswclient.c:81: warning: incompatible implicit declaration of built-in function 'strncpy' - camswclient.c:89: warning: implicit declaration of function 'strerror' - camswclient.c:89: warning: nested extern declaration of 'strerror' - camswclient.c:89: warning: format '%s' expects type 'char *', but argument 9 has type 'int' - camswclient.c: In function 'send_ca_pmt': - camswclient.c:129: warning: implicit declaration of function 'memcpy' - camswclient.c:129: warning: incompatible implicit declaration of built-in - function 'memcpy' - gstdvbsrc.c:48:19: error: error.h: No such file or directory - Signed-off-by: Rob Clark <rob@ti.com> - -2011-01-03 20:05:52 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: remove unnecessary RGB -> YUV conversion by using YUV palettes - the default CLUTs still use RGB -> YUV conversions since the standard defines - them as RGBA values. - -2011-01-03 20:21:57 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * m4/Makefile.am: - * m4/esd.m4: - * m4/glib.m4: - * m4/gst-matroska.m4: - * m4/gst-shout2.m4: - * m4/gtk.m4: - * m4/ogg.m4: - * m4/vorbis.m4: - m4: remove some cruft - -2011-01-03 17:24:23 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - qtmux: adjust nasty case timestamp tracking - That is, all sorts of problems arise with re-ordered input timestamps that - tend to defy automagic handling for every case, so allow for a few variations - that can be tried depending on circumstances. - Also try to document accordingly. - Also fixes #638288. - -2010-12-30 21:48:41 +0200 Felipe Contreras <felipe.contreras@nokia.com> - - * gst/qtmux/gstqtmux.c: - qtmux: get rid of timestamp overprotectiveness - Signed-off-by: Felipe Contreras <felipe.contreras@nokia.com> - -2011-01-03 16:56:57 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/atomsrecovery.c: - * gst/qtmux/gstqtmux.c: - qtmux: simplify and fix pts_offset storing - In particular, only write a ctts atom if and only if ever a non-zero offset. - -2011-01-03 10:43:15 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: add some more documentation - -2010-12-03 15:23:00 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - qtmux: remove large-file property - Rather, auto-determine if 64-bits fields are needed for a valid result, and - stick to plain 32-bits if not needed. - API: GstQTMux:large-file (removed) - -2011-01-03 18:13:37 +0200 Stefan Kost <ensonic@users.sf.net> - - * sys/dvb/README: - README: fix the example pipeline - Fix the obvious outdated parts. Still this README looks outdated and should be - updated or removed. - -2011-01-02 19:38:01 -0800 David Schleef <ds@schleef.org> - - * tools/gst-element-maker: - element-maker: Add debug category - -2011-01-02 16:13:56 -0800 David Schleef <ds@schleef.org> - - * gst/colorspace/colorspace.c: - colorspace: Disable matrixing on big-endian - It's broken until someone writes better Orc code. Fixes #631232. - -2010-12-05 03:29:42 -0800 David Schleef <ds@schleef.org> - - * gst/mpegtsmux/tsmux/tsmuxstream.c: - mpegtsmux: Set adaptation flag when appropriate - Specifically, when there's stuff to go into the adaptation - header. - -2010-11-17 17:49:17 -0800 David Schleef <ds@schleef.org> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - mpegtsmux: Set random_access_indicator for keyframes - -2010-12-31 16:20:22 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - tiger: outline text by default, to make it easier to read - https://bugzilla.gnome.org/show_bug.cgi?id=638527 - -2011-01-02 15:11:52 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * LICENSE_readme: - * Makefile.am: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-jack.xml: - * ext/Makefile.am: - * ext/jack/.gitignore: - * ext/jack/Makefile.am: - * ext/jack/README: - * ext/jack/gstjack.c: - * ext/jack/gstjack.h: - * ext/jack/gstjackaudioclient.c: - * ext/jack/gstjackaudioclient.h: - * ext/jack/gstjackaudiosink.c: - * ext/jack/gstjackaudiosink.h: - * ext/jack/gstjackaudiosrc.c: - * ext/jack/gstjackaudiosrc.h: - * ext/jack/gstjackringbuffer.h: - * ext/jack/gstjackutil.c: - * ext/jack/gstjackutil.h: - * gst-plugins-bad.spec.in: - * tests/examples/Makefile.am: - * tests/examples/jack/Makefile.am: - * tests/examples/jack/jack_client.c: - jack: move plugin to gst-plugins-good - https://bugzilla.gnome.org/show_bug.cgi?id=621929 - -2011-01-02 13:52:36 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkatedec.c: - * ext/kate/gstkatetiger.c: - * ext/kate/gstkateutil.c: - kate: fix caps and string leaks and some minor clean-ups - Don't leak source caps. Use GST_PTR_FORMAT to log caps, so - we don't need to leak strings from gst_caps_to_string(). - No need to use GST_DEBUG_FUNCPTR for vfuncs where the base - class will never look them up (like property getters/setters). - Don't use g_return_*_if_fail() for things that aren't directly - programming errors (by the application developer). - Fixes kate unit test under valgrind. - -2010-12-31 16:17:50 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkateutil.c: - kate: reenable the sending of a message for tags - https://bugzilla.gnome.org/show_bug.cgi?id=638412 - -2011-01-02 13:29:06 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/gaudieffects/Makefile.am: - gaudieffects: dist python examples - -2010-12-31 00:09:09 -0800 David Schleef <ds@schleef.org> - - * tools/gst-element-maker: - element-maker: Update FSF address - -2010-12-31 00:07:28 -0800 David Schleef <ds@schleef.org> - - * tools/Makefile.am: - * tools/gst-app-maker: - Add gst-app-maker - -2010-12-31 00:12:53 -0800 David Schleef <ds@schleef.org> - - * gst/dtmf/tone_detect.c: - dtmf: Fix build failure caused by previous commit - -2010-12-30 19:21:47 -0800 David Schleef <ds@schleef.org> - - * ext/cog/generate_tables.c: - * ext/cog/gstcms.c: - * ext/cog/gstcolorconvert.c: - cog: Use math-compat.h - -2010-12-30 19:21:21 -0800 David Schleef <ds@schleef.org> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegdemux: Fix c99-ism - -2010-12-30 19:12:23 -0800 David Schleef <ds@schleef.org> - - * gst/legacyresample/resample_functable.c: - * gst/legacyresample/resample_ref.c: - legacyresample: Use math-compat header - -2010-12-30 19:03:54 -0800 David Schleef <ds@schleef.org> - - * gst/gaudieffects/gstgaussblur.c: - * gst/geometrictransform/gstrotate.c: - change M_PI to G_PI - -2010-12-30 19:03:14 -0800 David Schleef <ds@schleef.org> - - * gst/frei0r/frei0r.h: - * gst/frei0r/gstfrei0r.h: - frei0r: convert uint32_t to guint32 - -2010-12-30 18:20:47 -0800 David Schleef <ds@schleef.org> - - * gst/dtmf/gstdtmfdetect.c: - * gst/dtmf/tone_detect.c: - * gst/dtmf/tone_detect.h: - dtmf: build fixes for MSVC - Use gint16 and G_PI. - -2010-12-30 18:19:47 -0800 David Schleef <ds@schleef.org> - - * gst/dtmf/tone_detect.c: - dtmf: reindent - -2010-12-30 18:02:06 -0800 David Schleef <ds@schleef.org> - - * gst/dataurisrc/gstdataurisrc.c: - dataurisrc: use g_ascii_strcasecmp() - -2010-12-31 01:38:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-selector.xml: - * gst-plugins-bad.spec.in: - * gst/selector/.gitignore: - * gst/selector/Makefile.am: - * gst/selector/gstinputselector.c: - * gst/selector/gstinputselector.h: - * gst/selector/gstoutputselector.c: - * gst/selector/gstoutputselector.h: - * gst/selector/gstselector-marshal.list: - * gst/selector/gstselector.c: - * gst/selector/selector.vcproj: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/selector.c: - * tests/examples/Makefile.am: - * tests/examples/switch/.gitignore: - * tests/examples/switch/Makefile.am: - * tests/examples/switch/switcher.c: - * tests/icles/.gitignore: - * tests/icles/Makefile.am: - * tests/icles/output-selector-test.c: - selector: move input-selector and output-selector to core - https://bugzilla.gnome.org/show_bug.cgi?id=614306 - -2010-12-30 01:17:28 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-colorspace.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dvbsuboverlay.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-jp2kdecimator.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-opencv.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-y4mdec.xml: - * docs/plugins/inspect/plugin-zbar.xml: - docs: update plugin docs - -2010-12-30 01:14:29 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-valve.xml: - * gst-plugins-bad.spec.in: - * gst/valve/Makefile.am: - * gst/valve/gstvalve.c: - * gst/valve/gstvalve.h: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/valve.c: - valve: move valve element/plugin to core - https://bugzilla.gnome.org/show_bug.cgi?id=630808 - -2010-12-29 13:18:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - camerabin2: Various leak fixes - Various leak fixes and some code reorganization - -2010-12-27 17:18:29 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin2/.gitignore: - camerabin2: example: gitignore captured files - -2010-12-26 20:52:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Implement video capture renegotiate - Handle caps renegotiation from camerabin2's renegotiate event - to allow video capture to be done with the user's requested - resolution. - -2010-12-26 20:47:40 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - camerabin2: Add tests for video capture - Add a test for capturing multiple videos with different resolutions - in a sequence. - -2010-12-26 20:35:47 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Fix renegotiate event pushing - Use a hack to make the event upstream to reach the camera source - instead of going downstream and being useless. - This was already fixed this way for image srcpad renegotiate and - video srcpad was left unfixed. - -2010-12-24 09:10:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - wrappercamerabinsrc: Refactor internal pipeline - Instead of linking 3 src pads from tee to the ghostpads, use 2 - srcpads and add an output-selector to completely split caps - negotiation of video/image modes. I don't think there is an - use case that would require image and video pads to be used - at the same time. - -2010-12-22 14:42:27 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * configure.ac: - configure: use -pthread for xvid configure check - https://bugzilla.gnome.org/show_bug.cgi?id=637823 - https://bugzilla.gnome.org/show_bug.cgi?id=637308 - -2010-12-28 17:16:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: mode can be only image or video - No need to check if camerabin is on video mode if it isn't on - image mode as those are the only 2 modes available. - Additionally, if mode gets corrupted somehow and would be neither - image or video it would cause a null pointer dereferencing some - lines of code below, so this is safer. - -2010-12-28 16:55:11 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: Remove unused variable - -2010-12-27 16:58:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/asfmux/gstasf.c: - asfmux: Fix plugin package name/origin - -2010-12-27 13:20:28 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: fix compiler warnings - -2010-12-27 11:10:53 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/dvb-sub.h: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: clean-up: allocate flat array of rectangles - instead of an array of pointers to individually-allocated rectangles. - -2010-12-23 18:18:50 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - * ext/kate/gstkatetiger.h: - tiger: fallback on headers in caps to initialize if headers are absent - When Totem switches streams, tiger will be reset, and start receiving - buffers from the middle of the stream, without being sent headers. - If this happens, try to get headers from the caps. - https://bugzilla.gnome.org/show_bug.cgi?id=638004 - -2010-12-26 17:19:00 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/interfaces/photography.c: - photography: fix typo in property description - -2010-12-26 17:07:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/examples/camerabin/gst-camera.c: - examples: fix gtk3 code path in camerabin example app - Just add rows via the combobox's model, which should work with - both gtk2 and gtk3, instead of using the gtk_combo_box_append_text() - convenience API (which was renamed to gtk_combo_box_text_append_text()). - Fixes compilation against gtk3 (there was a typo in the list store - variable name, spotted by Markus Vartiainen). - -2010-12-25 17:01:11 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - kate: if seeking with GST_SEEK_TYPE_CUR, flush everything - We don't know how to calculate the target, so be safe. - https://bugzilla.gnome.org/show_bug.cgi?id=600929 - -2010-12-25 16:44:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - tiger: move #if #else bits outside of macro - Some compilers/preprocessors don't like if/else/endif preprocessor - directives in the middle of macros. - -2010-12-24 14:44:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - dvbsuboverlay: clean-up: merge private data struct into main struct - -2010-12-24 14:24:12 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/dvb-sub.h: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: clean-up: dvb sub parser helper doesn't need to be a GObject - -2010-01-25 18:26:25 +0000 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * ext/kate/gstkate.c: - tiger: Give tiger primary rank - -2010-01-25 18:58:38 +0000 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * ext/kate/Makefile.am: - * ext/kate/gstkate.c: - * ext/kate/gstkatedec.c: - * ext/kate/gstkatedec.h: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatespu.c: - * ext/kate/gstkatetiger.c: - * ext/kate/gstkatetiger.h: - * ext/kate/gstkateutil.c: - * ext/kate/gstkateutil.h: - kate: add segment tracking, and various other improvements - https://bugzilla.gnome.org/show_bug.cgi?id=600929 - -2010-12-24 10:15:46 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mve/gstmvedemux.c: - mve: do not use the pad buffer allocation functions in demuxers - https://bugzilla.gnome.org/show_bug.cgi?id=637929 - -2010-12-24 09:50:00 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegdemux: do not use the pad buffer allocation functions in demuxers - https://bugzilla.gnome.org/show_bug.cgi?id=637931 - -2010-12-23 22:01:00 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: try harder to make buffer metadata writable before modifying - Also, check buffer for NULL-ness before dereferencing it. - https://bugzilla.gnome.org/show_bug.cgi?id=637824 - -2010-12-22 11:44:55 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - basecamerasrc: Notify earlier - Notify about ready-for-capture changes earlier to allow camerabin2 - to do the videobin state switching before the capture starts. - -2010-12-21 19:22:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstvideorecordingbin.c: - videorecordingbin: Fix leaks - -2010-12-21 11:04:00 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - camerabin2: Refactor tests - Refactor tests case so that the same tests can be run for different - camera sources. - -2010-12-20 18:30:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/.gitignore: - tests: gitignore camerabin2 tests - Adds more camerabin2 elements tests to gitignore - -2010-12-20 18:09:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Add converters for viewfinder branch - Viewfinder branch should have converters as it has to work - always anyway. - -2010-12-20 14:20:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/imagecapturebin.c: - imagecapturebin: Add another test case - Adds a test case to check if a sequence of buffers with different - caps can be pushed to imagecapturebin and saved correctly - -2010-12-20 02:59:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/viewfinderbin.c: - viewfinderbin: Add basic check test - Adds minimum check test. It's not a very useful test, but at least - it allows us to run it under valgrind and check for leaks automatically - -2010-12-20 02:58:44 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstviewfinderbin.c: - viewfinderbin: Remove leaks - Removing various leaks from viewfinderbin - -2010-12-17 23:06:45 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: more logs - -2010-12-17 23:06:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - camerabin2: Small tests update - Increases timeout value so that tests won't fail with full - debug output. - Also removes buffer alloc from videotestsrc as this feature - isn't ready on camerabin2 - -2010-12-14 22:06:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - camerabin2: Adds tests for image capture with different caps - Adds a test that tries sucessive captures with different caps - -2010-12-16 00:40:25 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - wrappercamerabinsrc: Handle camerabin2 custom renegotiate events - -2010-12-15 14:05:54 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Use custom renegotiate event - Adds a custom renegotiate event that is pushed to the camerasrc pad - that needs renegotiation due to the user selecting a new capture - caps for that pad. - This is a way of notifying the source that it should update its caps, even - if it doesn't use pad allocs. - -2010-12-16 22:49:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - wrappercamerabinsrc: Add local mode - -2010-12-14 18:42:51 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Adds properties for capture caps - Adds properties for selecting caps for video and image captures - -2010-12-19 19:40:54 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/Makefile.am: - basecamerabinsrc: Fix makefile building order - basecamerabinsrc must be built after photography interface - as it depends on it. - -2010-12-10 17:45:40 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * gst/camerabin2/gstimagecapturebin.c: - camerabin2: remove abreviations from imagecapturebin - -2010-12-16 08:47:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - basecamerasrc: Add some more logging - Adds some more logging and always assume capture has started before - start_capture is called. This helps on image captures that might - call finish_capture directly from start_capture or before start_capture - finishes. - -2010-12-15 22:35:16 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst/camerabin2/gstwrappercamerabinsrc.c: - basecamerasrc: More cleanup - Remove old legacy code copied from camerabin(1) that should be handled - by caps negotiation on camerabin2 - -2010-12-15 14:07:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstwrappercamerabinsrc.c: - wrappercamerabinsrc: Remove unused variable - Remove wait_for_prepara variable that wasn't being used - -2010-12-14 17:23:10 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/Makefile.am: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstplugin.c: - * gst/camerabin2/gstwrappercamerabinsrc.c: - * gst/camerabin2/gstwrappercamerabinsrc.h: - * tests/check/elements/camerabin2.c: - camerabin2: Rename v4l2camerasrc to wrappercamerabinsrc - Use a better name for the element that wraps single pad src element - into a 3pad source required by camerabin2. - -2010-12-14 16:59:54 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstv4l2camerasrc.c: - * gst/camerabin2/gstv4l2camerasrc.h: - v4l2camerasrc: remove video filter property code - Removes some unused custom video filter element property code - -2010-12-16 10:51:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstviewfinderbin.c: - viewfinderbin: Fix video-sink property again - Avoid switching the element on the set_property function, instead wait - for the next NULL -> READY transition. - -2010-12-14 14:48:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - camerabin2: Use videotestsrc on the tests - Use videotestsrc to avoid openning the camera device on the tests. - -2010-12-14 14:43:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstv4l2camerasrc.c: - v4l2camerasrc: add video-src property - Adds a property to select the src element to be used internally - on v4l2camerasrc. Yeah, I know, this element should have a better - name. - -2010-12-13 17:56:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - camerabin2: Add test for supported caps properties - Adds tests for checking that the supported caps properties work - as expected (using the respective pads get caps function) - -2010-12-14 08:44:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/PORTING: - camerabin2: adds PORTING document - Adds a PORTING document to explain the differences from - camerabin to camerabin2 and help application developers on - porting from one to another. - -2010-12-13 19:36:41 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/basecamerabinsrc/Makefile.am: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c: - * gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h: - * gst-libs/gst/basecamerabinsrc/gstcamerabin-enum.c: - * gst-libs/gst/basecamerabinsrc/gstcamerabin-enum.h: - * gst/camerabin2/Makefile.am: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstv4l2camerasrc.c: - * gst/camerabin2/gstv4l2camerasrc.h: - * tests/check/Makefile.am: - * tests/check/elements/camerabin2.c: - camerabin2: Move basecamerasrc to gst-libs - Move the base camera src class to gst-libs/gst/basecamerabinsrc to - allow it to be included from the tests. - -2010-12-14 14:28:49 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * gst/camerabin2/gstvideorecordingbin.c: - * gst/camerabin2/gstvideorecordingbin.h: - * tests/check/elements/videorecordingbin.c: - camerabin2: add videorecordingbin::video-muxer property - -2010-12-14 12:21:57 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * gst/camerabin2/gstvideorecordingbin.c: - * gst/camerabin2/gstvideorecordingbin.h: - * tests/check/elements/videorecordingbin.c: - camerabin2: add videorecordingbin::video-encoder property - -2010-12-14 09:58:35 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * gst/camerabin2/gstvideorecordingbin.c: - camerabin2: remove abbreviations from videorecordingbin - -2010-12-14 10:48:56 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * gst/camerabin2/gstimagecapturebin.c: - camerabin2: imagecapturebin: release objects and memory allocations - -2010-12-13 16:36:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Add camera-src property - Adds a property to select the camera source element to be used. - Changing only happens on the next NULL->READY transition - -2010-12-13 11:53:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Rename variables - Use better name for the variables, making the code clearer. Also - keep a ref for some internal elements to avoid fetching them - by name when needed later. - -2010-12-12 23:03:21 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstbasecamerasrc.c: - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Add properties for supported capture caps - Adds 2 property for getting the supported image/video capture - caps from the camera source. - -2010-12-12 20:46:16 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstbasecamerasrc.c: - * gst/camerabin2/gstcamerabin-enum.h: - * gst/camerabin2/gstv4l2camerasrc.c: - camerabin2: Put enums inside their classes .c - Remove global list of properties' enums and put them - inside their classes .c - -2010-12-12 19:33:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstviewfinderbin.h: - * tests/check/elements/camerabin2.c: - viewfinderbin: Fixes to video-sink handling - Handle video-sink more carefully, checking if it should - be already added to the bin, and removing old ones when - replacing. - -2010-12-13 16:28:58 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * gst/camerabin2/gstimagecapturebin.c: - * gst/camerabin2/gstimagecapturebin.h: - * tests/check/elements/imagecapturebin.c: - camerabin2: add imagecapturebin::image-muxer property - -2010-12-13 12:08:22 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * gst/camerabin2/gstimagecapturebin.c: - * gst/camerabin2/gstimagecapturebin.h: - * tests/check/elements/imagecapturebin.c: - camerabin2: add imagecapturebin::image-encoder property - -2010-12-10 17:45:40 +0200 Teemu Katajisto <teemu.katajisto@digia.com> - - * gst/camerabin2/gstimagecapturebin.c: - camerabin2: remove abreviations from imagecapturebin - -2010-12-10 12:08:48 -0300 André Dieb Martins <andre.dieb@gmail.com> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstviewfinderbin.h: - * tests/check/elements/camerabin2.c: - camerabin2: implement viewfinderbin::video-sink property to override default video output - -2010-12-09 14:13:13 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstbasecamerasrc.c: - basecamerasrc: Make construct_pipeline optional - Construct pipeline should be optional. Subclasses that don't - have internal elements don't need it. - -2010-12-09 12:23:01 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin2/gstbasecamerasrc.c: - * gst/camerabin2/gstbasecamerasrc.h: - basecamerasrc: write more details on the api docs - -2010-12-09 12:22:26 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin2/gstbasecamerasrc.h: - basecamerasrc: use the enum type for mode - -2010-12-09 12:21:16 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin2/gstbasecamerasrc.c: - basecamerasrc: comment cleanups - -2010-12-22 21:44:47 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: ensure buffer metadata is writable before modifying it - https://bugzilla.gnome.org/show_bug.cgi?id=637824 - -2010-12-22 18:13:04 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/id3tag/gstid3mux.c: - id3mux: Set to GST_RANK_PRIMARY - We want it to take precedence over any other id3 formatter. - -2010-12-21 18:01:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Fix some more leaks and reorganize unref code - -2010-12-20 15:33:28 +0100 benjamin gaignard <benjamin.gaignard@stericsson> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Avoid some leaks in autoconvert - unref sink and src pad after gst_pad_by_direction calls unref - element if gst_auto_convert_activate_element failed. - See bug #637553. - -2010-12-21 17:03:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/asfmux.c: - asfmux: Fix buffer leak in the unit test - -2010-12-20 07:19:04 -0800 Saleem Abdulrasool <compnerd@compnerd.org> - - * tests/examples/camerabin/gst-camera.c: - camerabin: fix for latest GTK+ API changes - -2010-12-20 17:47:29 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * common: - Automatic update of common submodule - From 169462a to 46445ad - -2010-12-20 11:06:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin.c: - camerabin: Fix caps leaks - Fix some caps leaks on unit tests - -2010-12-20 09:37:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/jifmux.c: - jifmux: Fix leaks on check test - Fix leaks in jifmux check test - -2010-12-20 13:51:03 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/interfaces/photography.c: - photography: use a flags type instead of the uint - Also use 0 as default and let the implementation set something that they support. - -2010-12-20 11:14:49 +0200 Hu Gang <gang.a.hu@intel.com> - - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - photography: add missing property and cabability flag for noise reduction - -2010-12-19 17:23:24 +0530 Olivier Crête <olivier.crete@collabora.co.uk> - - * tests/check/elements/autoconvert.c: - tests: Fix leak in autoconvert test - -2010-12-19 17:16:10 +0530 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Use gst_caps_can_intersect() - -2010-12-19 12:53:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: Free AtomInfo structs - -2010-12-19 12:50:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: Free tag string after use - -2010-12-19 12:12:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/pipelines/tagschecking.c: - tagschecking: Fix some more memory leaks - -2010-12-19 12:12:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/imagecapturebin.c: - imagecapturebin: Don't leak message in the unit test - -2010-12-19 12:09:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/camerabin2/gstimagecapturebin.c: - imagecapturebin: Don't leak pad and sink - -2010-12-19 12:05:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/camerabin2/gstimagecapturebin.c: - imagecapturebin: Don't leak pad template created from static pad template - -2010-12-19 12:03:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/camerabin2/gstimagecapturebin.c: - imagecapturebin: Don't leak location string - -2010-12-19 12:00:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - jifmux: Don't leak taglist - -2010-12-19 11:38:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/autoconvert/gstautovideoconvert.c: - autovideoconvert: Don't leak pad templates created from static pad templates - -2010-12-19 11:20:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/autoconvert/gstautovideoconvert.c: - autovideoconvert: Add autoconvert child before chaining up to parent state change function - ...and remove/unlink autoconvert child when going back to NULL. - -2010-12-19 11:19:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/Makefile.am: - states: Ignore more vdpau elements in the generic states test - -2010-12-19 11:17:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * Makefile.am: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/autovideoconvert.c: - autovideoconvert: Rename and adjust unit test too - -2010-12-18 12:48:42 -0800 Leo Singer <leo.singer@ligo.org> - - * sys/applemedia/miovideosrc.c: - * sys/applemedia/qtkitvideosrc.m: - applemedia: fix compiler warning: redundant declaration of 'parent_class' - GST_BOILERPLATE_FULL declares parent_class as well. - https://bugzilla.gnome.org/show_bug.cgi?id=637532 - -2010-12-17 19:41:25 +0200 Lasse Laukkanen <lasse.laukkanen@digia.com> - - * gst/qtmux/gstqtmux.c: - qtmux: allow zero duration tracks - -2010-12-16 15:31:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/dvb-sub.h: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: use GST_LOG etc. for logging - The dvbsub routines were originally designed as a mini lib with a - log callback (which from the looks of it in our case would always - be called and always assemble the string even with debug output - disabled). Some of these debug statements can probably be removed - or cleaned up some more. - -2010-12-16 00:19:13 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvbsuboverlay/ffmpeg-colorspace.h: - dvbsuboverlay: remove some unused defines - -2010-12-16 00:13:18 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: fix atomic access - -2010-12-16 15:33:45 +0000 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: fix rendering artefacts - Initialize source x position for odd height special case. - -2010-12-16 11:29:07 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: The enable property is a boolean and not an integer - -2010-12-16 09:56:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/autoconvert/Makefile.am: - * gst/autoconvert/gstautovideoconvert.c: - * gst/autoconvert/gstautovideoconvert.h: - * gst/autoconvert/plugin.c: - autoconvert: Rename autocolorspace to autovideoconvert - This doesn't just convert between color spaces. - -2010-12-15 12:45:38 -0800 David Schleef <ds@schleef.org> - - * tools/Makefile.am: - * tools/element-templates/audiofilter: - * tools/element-templates/audiosink: - * tools/element-templates/audiosrc: - * tools/element-templates/base: - * tools/element-templates/baseaudiosink: - * tools/element-templates/baseaudiosrc: - * tools/element-templates/basertpdepayload: - * tools/element-templates/basertppayload: - * tools/element-templates/basesink: - * tools/element-templates/basesrc: - * tools/element-templates/basetransform: - * tools/element-templates/cddabasesrc: - * tools/element-templates/element: - * tools/element-templates/gobject: - * tools/element-templates/pushsrc: - * tools/element-templates/sinkpad: - * tools/element-templates/sinkpad-simple: - * tools/element-templates/srcpad: - * tools/element-templates/srcpad-simple: - * tools/element-templates/tagdemux: - * tools/element-templates/videosink: - * tools/gst-element-maker: - element-maker: Clean up directory - -2010-12-15 21:28:06 +0100 Benjamin Gaignard <benjamin.gaignard@stericsson.com> - - * gst/bayer/gstbayer2rgb.c: - bayer2rgb: Add framerate to the sink caps - Fixes bug #637224. - -2010-12-15 21:19:55 +0100 Benjamin Gaignard <benjamin.gaignard@stericsson.com> - - * tests/check/Makefile.am: - * tests/check/elements/autocolorspace.c: - autocolorspace: Add unit test - -2010-12-15 21:14:38 +0100 Benjamin Gaignard <benjamin.gaignard@stericsson.com> - - * gst/autoconvert/Makefile.am: - * gst/autoconvert/gstautocolorspace.c: - * gst/autoconvert/gstautocolorspace.h: - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/plugin.c: - autocolorspace: Add autoconvert based video format convert element - Fixes bug #636106. - -2010-12-15 21:11:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Rename DVB subtitling media type to subpicture/x-dvb - -2010-12-15 21:11:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Rename DVB subtitling media type to subpicture/x-dvb - -2010-12-15 20:54:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Don't draw anything on the video if the enable property is set to FALSE - -2010-12-15 20:53:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Add #defines for the property default values - -2010-12-15 20:51:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Use g_atomic_int_get() for reading the max_page_timeout field - -2010-12-15 20:49:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Mark array static const and use G_N_ELEMENTS instead of sizeof - -2010-12-15 14:39:56 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: add DESC_DVB_SUBTITLING descriptor for language parsing - -2010-12-15 14:23:58 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: enable gather_pes only for DVB subtitle private streams - -2010-12-14 14:34:56 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: use atomic instructions to set/get enable property - -2010-12-14 14:28:45 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.h: - dvbsuboverlay: add property to limit page_time_out to a setable maximum - -2010-12-14 11:11:08 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: implement display definition segment subtitle windows - simplifies subtitle scaling in blit_i420() - -2010-12-11 17:25:29 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: scale subtitles according to the display size - Display size is either transmitted in the display definition segment or - implicitly defined to 720x576. The subtitle window information also present in - the display definition segment is not yet used. - -2010-12-11 17:10:25 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/dvb-sub.h: - dvbsuboverlay: implement display definition segment parsing - -2010-12-10 12:27:54 +0100 Janne Grunau <janne.grunau@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: fix luma stride for scaled subtitles (display width != width) - -2010-12-15 16:48:15 +0100 Edward Hervey <edward.hervey@collabora.co.uk> - - * ext/rsvg/gstrsvgoverlay.c: - rsvgoverlay: Don't set uint on an int property - -2010-12-15 14:56:19 +0200 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 20742ae to 169462a - -2010-12-14 19:03:09 -0800 David Schleef <ds@schleef.org> - - * tools/Makefile.am: - * tools/element-maker: - * tools/gstaudiofilter.c: - * tools/gstaudiosink.c: - * tools/gstaudiosrc.c: - * tools/gstbaseaudiosink.c: - * tools/gstbaseaudiosrc.c: - * tools/gstbasertpdepayload.c: - * tools/gstbasertppayload.c: - * tools/gstbasesink.c: - * tools/gstbasesrc.c: - * tools/gstbasetransform.c: - * tools/gstcddabasesrc.c: - * tools/gstelement.c: - * tools/gstpushsrc.c: - * tools/gsttagdemux.c: - * tools/gstvideosink.c: - * tools/sinkpad-simple.c: - * tools/sinkpad.c: - * tools/srcpad-simple.c: - * tools/srcpad.c: - element-maker: improve generation of several classes - Better creation of pads, test and fix many other classes. Most - classes work now, although might not create functional elements. - -2010-12-13 23:32:30 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/y4m/Makefile.am: - * gst/y4m/gsty4mdec.c: - * gst/y4m/gsty4mdec.h: - y4mdec: Add y4mdec - Feel the y4m love. It seeks. It works in pitivi. - -2010-12-13 23:15:05 +0000 Francis Rammeloo <francis.rammeloo@gmail.com> - - * sys/winscreencap/gstgdiscreencapsrc.c: - gdiscreencapsrc: fix memory leak - Structure members of ICONINFO struct filled by GetIconInfo() must - be deleted when no longer needed according to the API reference. - https://bugzilla.gnome.org/show_bug.cgi?id=611428 - -2010-12-13 16:23:37 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: avoid leaking tag event - -2010-12-13 15:17:29 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstac3parse.c: - ac3parse: relax bsid checking - ... to the widest possible spec interpretation. - Fixes #637062. - -2010-12-13 16:23:45 +0200 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 011bcc8 to 20742ae - -2010-12-12 23:34:02 +0000 Matthew Ife <matthew.ife@ukfast.co.uk> - - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - rfbsrc: fail more gracefully if source gets disconnected or geometry changes - Don't get caught in an infinite loop if the source gets disconnected and also - support gracefully failing upon detecting the frame geometry has increased - (rather than segfaulting). - https://bugzilla.gnome.org/show_bug.cgi?id=635397 - -2010-12-12 22:13:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: avoid leaking converted comment string - -2010-12-12 12:01:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videomeasure/gstvideomeasure_ssim.c: - ssim: Set classification to Filter/Analyzer/Video instead of Filter/Converter/Video - Fixes bug #636109. - -2010-12-12 02:24:00 +1100 Jan Schmidt <thaytan@noraisin.net> - - * gst/gaudieffects/burn-example.py: - * gst/gaudieffects/gstburn.c: - gaudieffects: Avoid divide by 0 in burn element - -2010-12-12 02:16:49 +1100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - resindvd: Defer pushing tag updates until streaming. - Push tag/title info updates in the streaming thread, avoiding - spurious losses of the downstream events when flushing. - See: https://bugzilla.gnome.org/show_bug.cgi?id=594222 - -2010-11-16 17:18:33 +1100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - resindvd: Attempt to use glib language setting for DVD menus/audio - -2010-11-16 17:09:06 +1100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - resindvd: Fix silly typo in button state tracking. - -2010-12-10 00:58:58 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - applemedia: only enqueue buffers in the VideoToolbox callbacks - These callbacks may fire from any thread, hence we should only enqueue - buffers and let the streaming thread take care of the rest as soon as - the blocking encode or decode operation has finished. - -2010-11-19 15:53:55 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/coremediactx.h: - * sys/applemedia/cvapi.c: - * sys/applemedia/dynapi-internal.h: - * sys/applemedia/dynapi.c: - * sys/applemedia/dynapi.h: - applemedia: bring back Leopard compatibility - At least as far as miovideosrc is concerned. Turns out that CoreVideo's - CVPixelBufferGetIOSurface is not present in Leopard's version of CoreVideo. - We solve this by making it possible for symbols to be marked as optional. - -2010-11-29 13:47:11 +0100 Christian Berentsen <christian.berentsen@cisco.com> - - * sys/winks/ksvideohelpers.c: - winks: fix framerate fraction range mapping - Min and max may be slightly different but compress to the same fraction. - -2010-12-09 18:06:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/jp2k/gstjasperdec.c: - jasperdec: don't fail hard on decoding error - don't post an error and return GST_FLOW_ERROR on a simple decoding error. We can - just resume and continue decoding the next image. - -2010-12-09 11:54:17 +0100 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * sys/applemedia/qtkitvideosrc.m: - qtkitvideosrc: reset the queue condition to NO_FRAMES in unlockStop. - Fixes a segfault in create: when going PLAYING -> PAUSED -> PLAYING. - -2010-12-09 11:04:19 +0100 Alessandro Decina <alessandro.decina@collabora.co.uk> - - * sys/applemedia/qtkitvideosrc.m: - qtkitvideosrc: run the mainRunLoop for a while if not running. - QTCaptureSession::addInput and QTCaptureSession::addOutput call - NSObject::performSelectorOnMainThread internally so they need the mainRunLoop to - run at least for a while to complete. - -2010-12-07 19:40:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstbasecamerasrc.c: - * gst/camerabin2/gstbasecamerasrc.h: - * gst/camerabin2/gstv4l2camerasrc.c: - * gst/camerabin2/gstv4l2camerasrc.h: - basecamerasrc: Remove ghostpads - Remove ghost pads from basecamerasrc. Different implementations - of camera sources might not use ghostpads and use default pads. - -2010-12-07 19:12:40 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstbasecamerasrc.c: - * gst/camerabin2/gstbasecamerasrc.h: - * gst/camerabin2/gstv4l2camerasrc.c: - basecamerasrc: Removing ununsed methods - Remove one unused method _finish_image_capture() - -2010-12-06 11:05:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/examples/Makefile.am: - camerabin2: Only run tests if experimental is enabled - Only run camerabin2 tests and build examples if experimental - plugins are enabled - -2010-12-06 10:06:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstbasecamerasrc.c: - * gst/camerabin2/gstv4l2camerasrc.c: - camerabin2: Cleanup - Removing commented code - -2010-12-05 11:18:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstbasecamerasrc.c: - * gst/camerabin2/gstbasecamerasrc.h: - * gst/camerabin2/gstv4l2camerasrc.c: - * gst/camerabin2/gstv4l2camerasrc.h: - basecamerasrc: Move start/stop capture signals to basecamerasrc - Move start/stop signals and ready-for-capture to basecamerasrc - as this should be present on all camera sources - -2010-12-04 10:15:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstbasecamerasrc.c: - * gst/camerabin2/gstbasecamerasrc.h: - * gst/camerabin2/gstv4l2camerasrc.c: - * gst/camerabin2/gstv4l2camerasrc.h: - basecamerasrc: Add mode property - Move mode property from v4l2camerasrc to basecamerasrc, as all - camera sources should handle it. - -2010-12-04 00:27:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Reset all elements on video recording branch before capture - We need to reset the elements from the video recording branch, including - the queue and capsfilter in order to clear the eos state and activate - the pads. - This makes it possible to record multiple videos with camerabin2 in a - sequence, otherwise the source would get a unexpected return and - push EOS, stopping the whole pipeline. - -2010-12-03 12:13:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin2.c: - camerabin2: Fix tests capture location creation - Fixes capture location creation to use multifilesink location - like strings. E.g. using capture_%d instead of capture_0 to let - camerabin2 handle the %d replacing - -2010-12-03 12:12:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstv4l2camerasrc.c: - camerabin2: More debug logs - Sprinkle some more debugging logs - -2010-12-03 12:11:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin2/gst-camera2.c: - examples: camerabin2: Print more info - Add some printing for error/eos cases. - -2010-12-02 03:44:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstvideorecordingbin.c: - camerabin2: Various fixes - As video recording bin's state is locked, we should always - remember of setting it to NULL when camerabin2 goes to NULL - Be more careful when using elements that might not - have been created yet - And do not set location property recursively on videorecordingbin - -2010-12-02 03:08:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/camerabin2.c: - camerabin2: Adding tests for camerabin2 - Adds some basic tests for camerabin2 - -2010-12-02 02:21:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/imagecapturebin.c: - * tests/check/elements/videorecordingbin.c: - tests: camerabin2: adds tests for elements - Adds basic tests for both imagecapturebin and for - videorecordingbin elements - -2010-12-02 01:33:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstviewfinderbin.c: - viewfinderbin: Improve elements creation - Be more careful with cleanup of elements. Also add some logs and - improve docs a little. - -2010-12-02 00:19:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin-enum.c: - * gst/camerabin2/gstcamerabin-enum.h: - camerabin2: remove unused code - General cleanup, removing unused bits - -2010-11-30 20:13:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * configure.ac: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * gst/camerabin2/gstimagecapturebin.c: - * gst/camerabin2/gstimagecapturebin.h: - * gst/camerabin2/gstvideorecordingbin.c: - * gst/camerabin2/gstvideorecordingbin.h: - camerabin2: adds location property - Adds a location property to enable applications to select - the captured files names. Locations are handled just like - multifilesink ones - Also disables -Wformat-nonliteral to allow to use non-literals - on g_strdup_printf on camerabin and generate a sequence of - locations for captures. - -2010-11-30 20:15:47 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Fix set/get property function names - Add more consistency to the function names by using - gst_camera_bin as the other functions. - -2010-11-30 18:19:20 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Handle vidbin state change individually - Keep vidbin state locked to avoid it going to playing without - being used and leaving an empty file created. - Check the docs on the code for details on the handling. - -2010-11-30 11:40:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * configure.ac: - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Keep it under --enable-experimental - camerabin2 is still under heavy development, activate it only if - the --enable-experimental flag is on. - Also add a note to the docs. - -2010-11-30 11:06:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin-enum.h: - * gst/camerabin2/gstv4l2camerasrc.c: - v4l2camerasrc: Add ready-for-capture property - Adds property that informs if v4l2camerasrc is available - for starting a new capture. - It is useful for applications to know (via deep-notify) when the - property changes and a new capture is possible. Note, however, that - starting a new capture from the notify callback will cause a deadlock. - -2010-11-30 09:28:50 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin-enum.c: - * gst/camerabin2/gstcamerabin-enum.h: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * gst/camerabin2/gstv4l2camerasrc.c: - * gst/camerabin2/gstv4l2camerasrc.h: - camerabin2: Update v4l2camerasrc to use start/stop signals - Removes the old logic for v4l2camerasrc that used the mode - property switching to start/stop captures to make it identical - to camerabin2 behavior and to allow the future addition of - pausing a video recording. - This also removes the MODE_PREVIEW as it became useless. - -2010-11-29 18:53:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Cleanup capturing flag - Cleanup capturing flag when the source switches back to the - viewfinder mode - -2010-11-29 18:24:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstv4l2camerasrc.h: - v4l2camerasrc: Remove unnecessary padding - -2010-11-29 15:49:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstv4l2camerasrc.c: - * gst/camerabin2/gstv4l2camerasrc.h: - v4l2camerasrc: Implement video capture - Implements video capture on v4l2camerasrc by using the mode property, - when mode is set to video, the pad probe pushes a new segment - and starts pushing buffers on the pad, when it the property is - sent back to preview, the pad probe pushes an EOS and stops - pushing buffers. - This is controlled by a Recording State variable, that is protected - by the GST_OBJECT_LOCK. I don't think locking for every buffer is - nice, so we could find an alternative lockless way here. - -2010-11-29 12:57:21 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstv4l2camerasrc.c: - v4l2camerasrc: Fix image capture - Once a image is captured, v4l2camerasrc should return to the - preview mode and stop capturing. - -2010-11-29 11:31:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin-enum.c: - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Keep mode definition at -enum file - Use 'mode' enum definition from gstcamerabin-enum file to avoid - conflicts between v4l2camerasrc and gstcamerabin2 modes. - For now there is a MODE_PREVIEW there that is only used on the - camerasrc, not sure if we are keeping it at the future, but for - now this works. - -2010-11-29 10:46:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstv4l2camerasrc.c: - v4l2camerasrc: Adds mode property - Adds mode property to v4l2camerasrc - -2010-11-29 10:45:30 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/camerabingeneral.h: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstv4l2camerasrc.c: - camerabin2: Adding debug categories - Adding debug categories to v4l2camerasrc and camerabin2, also - removing generic category from camerabingeneral. - -2010-11-26 23:55:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * configure.ac: - * tests/examples/Makefile.am: - * tests/examples/camerabin2/.gitignore: - * tests/examples/camerabin2/Makefile.am: - * tests/examples/camerabin2/gst-camera2.c: - * tests/examples/camerabin2/gst-camera2.h: - * tests/examples/camerabin2/gst-camera2.ui: - examples: Adds camerabin2 example - Adds gtk camerabin2 example app - -2010-11-26 17:24:58 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - camerabin2: Adding basic property and signals - Adds mode property to camerabin2, allowing users to - select between video and stills capture. Also adds - start/stop capture actions to trigger and stop - capturing - -2010-11-26 15:55:39 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstimagecapturebin.c: - * gst/camerabin2/gstvideorecordingbin.c: - camerabin2: Set filesink's async to FALSE - In order to preroll, camerabin2 should have its filesinks in - the imagecapturebin and videorecordingbin with async=FALSE. - -2010-11-26 14:51:30 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstcamerabin2.c: - camerabin2: Adding basic elements - Instantiating and linking basic elements on camerabin2 - so it at least shows the viewfinder when running. - -2010-11-26 10:14:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/Makefile.am: - * gst/camerabin2/gstcamerabin2.c: - * gst/camerabin2/gstcamerabin2.h: - * gst/camerabin2/gstplugin.c: - camerabin2: Adds a stub element for camerabin2 - Adds camerabin2 element, it is now a pile of stubs. - -2010-11-25 22:05:39 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstv4l2camerasrc.c: - camerabin2: v4l2camerasrc: Remove platform specific code - Remove platform specific code - -2010-11-25 21:49:47 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstbasecamerasrc.c: - * gst/camerabin2/gstv4l2camerasrc.c: - camerabin2: Removing uneeded properties - Removing uneeded and unregistered properties. - -2010-11-25 20:55:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstv4l2camerasrc.c: - camerabin2: v4l2camerasrc: Fix property warning - Avoid setting a property that doesn't exist. - -2010-11-25 20:53:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/gstv4l2camerasrc.c: - * gst/camerabin2/gstv4l2camerasrc.h: - camerabin2: v4l2camerasrc: Remove unused variable - Removed unused leftover variable - -2010-11-25 14:57:13 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/Makefile.am: - * gst/camerabin2/gstplugin.c: - * gst/camerabin2/gstvideorecordingbin.c: - * gst/camerabin2/gstvideorecordingbin.h: - camerabin2: Adds video recording bin - Adds an bin that is responsible for encoding and saving video - streams to files. - For now it is simply a ffmpegcolorspace ! theoraenc ! oggmux ! - filesink bin. - Still uncapable of recording audio. - -2010-11-25 13:00:50 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/Makefile.am: - * gst/camerabin2/camerabingeneral.c: - * gst/camerabin2/camerabingeneral.h: - * gst/camerabin2/gstbasecamerasrc.c: - * gst/camerabin2/gstbasecamerasrc.h: - * gst/camerabin2/gstcamerabin-enum.c: - * gst/camerabin2/gstcamerabin-enum.h: - * gst/camerabin2/gstplugin.c: - * gst/camerabin2/gstv4l2camerasrc.c: - * gst/camerabin2/gstv4l2camerasrc.h: - camerabin2: Adding v4l2camerasrc from robclark's branch - Adds 3-pad v4l2 camera source from Rob Clark's camerabin - branch on http://gitorious.org/robclark-gstreamer/gst-plugins-bad - -2010-11-24 20:31:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/Makefile.am: - * gst/camerabin2/gstimagecapturebin.c: - * gst/camerabin2/gstimagecapturebin.h: - * gst/camerabin2/gstplugin.c: - camerabin2: Adds new imagecapturebin - Adds an bin that is responsible for image captures. - It is a simple ffmpegcolorspace ! jpegenc ! jifmux ! multifilesink - for now. - -2010-11-24 20:15:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin2/Makefile.am: - * gst/camerabin2/gstplugin.c: - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstviewfinderbin.h: - camerabin2: Move plugin init to a separate file - Moves plugin init to gstplugin.c to allow multiple - elements to register themselves. - -2010-11-24 17:28:57 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * configure.ac: - * gst/camerabin2/Makefile.am: - * gst/camerabin2/gstviewfinderbin.c: - * gst/camerabin2/gstviewfinderbin.h: - camerabin2: viewfinderbin: Adds viewfinderbin element - Adds viewfinder bin element, one of the modules of camerabin2 - that is responsible for displaying the video from the camera. - For now it is only a bin with ffmpegcolorspace ! videoscale ! - autovideosink - -2010-12-08 19:36:48 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: fix compiler warnings on OSX. - -2010-11-24 12:22:01 +0200 Stefan Kost <ensonic@users.sf.net> - - * tests/icles/output-selector-test.c: - output-selector-test: don't hardcode videosinks and use more colorspace conv. - Use autovideosink instead of hardcoded sinks. Use an additional colorspace - converter between videotestsrc and timeoverlay. - -2010-12-08 15:18:32 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: require released versions of core/base instead of old git - -2010-12-07 15:44:00 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: re-use cleanup() in finalize() - ... and also favor finalize() rather than dispose(). - -2010-11-18 13:39:23 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - * gst/mpeg4videoparse/mpeg4videoparse.h: - mpeg4videoparse: Set srcpad caps before forwarding newsegment - This holds all newsegement and most other events till there is enough - data to set srcpad caps, so that the downstream link is properly - negotiated before data starts flowing. - https://bugzilla.gnome.org/show_bug.cgi?id=635204 - -2010-11-18 23:29:51 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - * gst/mpeg4videoparse/mpeg4videoparse.h: - mpeg4videoparse: Use sinkpad caps as base for srcpad caps - This way, we don't lose additional fields that come from upstream (like - profile/level for now). - https://bugzilla.gnome.org/show_bug.cgi?id=635202 - -2010-12-07 15:20:29 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: minor fix to error handling - We weren't handling unparseable codec_data in some cases. - https://bugzilla.gnome.org/show_bug.cgi?id=635202 - -2010-12-07 17:17:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Implement nearest neighbour scaling for the subpictures - This becomes necessary when SDTV subtitles are used for HDTV videos. - -2010-12-07 14:55:28 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: align code with comment - -2010-12-07 14:55:15 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: re-use reset() in finalize() - -2010-11-17 19:16:12 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - * gst/h264parse/gsth264parse.h: - h264parse: Set srcpad caps before forwarding newsegment - This holds all newsegement and most other events till there is enough - data to set srcpad caps, so that the downstream link is properly - negotiated before data starts flowing. - https://bugzilla.gnome.org/show_bug.cgi?id=635205 - -2010-12-06 19:00:28 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: try to convert comment tag to UTF-8 - -2010-12-06 18:19:20 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: discard incomplete image - ... as determined when finding SOI next image before an EOI. - -2010-12-06 18:18:11 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: avoid infinite loop when resyncing - -2010-12-06 22:48:09 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/rawparse/gstaudioparse.c: - audioparse: Allow implicit channel map for 1-/2-channel audio - This makes sure we don't set an empty channel map array for 1-/2-channel - audio, causing an assert later on. - -2010-12-06 17:08:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Revert some parts of last commit that shouldn't be committed - -2010-12-06 17:05:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Really choose the latest possible subpictures - And not the first subpictures that are still valid according to the - page timeout. - -2010-12-06 16:44:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Refactor blending function and take average of all chroma values - -2010-12-03 17:35:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Improve selection of current to be displayed subpictures - Drop all subpictures that are too old anyway and clear the currently - displayed subpictures if num_rects==0 happens. - -2010-12-03 16:21:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Implement clipping of video buffers - Also don't clip subpicture buffers, they have no duration and - clipping them doesn't make much sense here. - -2010-12-03 16:08:13 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.h: - dvbsuboverlay: Clean up locking some more - -2010-12-03 16:05:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Flush subtitles and all internal state when needed - -2010-12-03 15:52:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Set the global library log function exactly once - And don't use one of the possibly many renderer instances, this is only - calling for crashes. - -2010-12-03 15:46:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.h: - dvbsuboverlay: Remove lots of commented out and unused code and clean up locking - -2010-12-01 09:59:14 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Fix more of the blending, so it looks quite good now - * libdvbsub gives us alpha channel already, not transparency level, so - don't do another "alpha = 255 - alpha", this is done by libdvbsub. - * Fix alpha channel handling in interpolation - assrender had an additional - 1bpp alpha bitmap as a possible mask, we don't. So don't use the palette - index array as alpha values; bug from quick code porting long ago to - changing pixel colors (assrender has a single pixel color for whole - regions or something, unlike dvbsub, which has indexed colors). - * Don't forget to reassign our YUV and other local pixel color variables - after shifting to work on the bottom part of a 2x2 subsample block, or - it's obviously very blocky. - Remaining issues in blending: - * Should probably be interpolating or doing something else useful with the - resulting U and V channels, so that most of the source pixel UV values would - actually be actually cared about, except for just one out of possibly four. - * Don't convert AYUV to ARGB in libdvbsub, and then back from ARGB to AYUV in - dvbsuboverlay for no reason - * Re-factor the whole thing to something more like textoverlay blending - * Related to that, perhaps cache the current spu in a good format for quick - blending on each frame, after which the more often called blending parts - might become more straightforward - -2010-12-01 07:26:03 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Fix blending bug regarding color channel addressing. - libdvbsub gives us ARGB ordered pixels right now, not RGBA. - -2010-12-01 07:20:07 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Do blending calls when appropriate - This gives us actually shown subtitles, however with bugs in the - current blitting code, resulting in very transparent subtitles. - -2010-12-01 07:06:35 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Implement fallback page_time_out honoring - The spec has a page_time_out in the page composition segment to ensure - subtitles don't get stuck on screen for too much longer than intended, - when future page composition segments get lost on bad reception, or other - problems. Honor it in the gst plugin side. - -2010-12-01 06:01:15 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.h: - dvbsuboverlay: Implement subtitle queueing and syncing with video - Push incoming subtitle pages in a FIFO queue (pending_subtitles) - and dequeue the head when it's time to show it (when video running - time reaches the subtitle page running time). - Keep the subtitle page, that is supposed to be blended on top of video - currently, in a separate object variable (current_subtitle). As a - next step we can then pre-render current_subtitle to a better to blend - format. - -2010-12-01 05:49:22 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - dvbsuboverlay: Make the new dvb_subtitles_free() accept NULL - Don't crash if dvb_subtitles_free(NULL) gets passed, like most other - *_free functions are happy with. - -2010-12-01 05:26:02 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/dvb-sub.h: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Pass page_time_out and pts with the DVBSubtitles structure - Eases holding onto the information in gst plugins side queue of - DVBSubtitles, so we won't need to create yet another temporary struct - to keep the pts and page_time_out too. - And this really logically belongs at the toplevel information set anyway - and in that struct... - -2010-12-01 04:28:02 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/dvb-sub.h: - dvbsuboverlay: Make the libdvbsub callback handler responsible for memory cleanup - We want to allow queueing of raw region image data in the gst plugin side, - and keep the data around until we pop the item from the queue. So make - the callback handler responsible for memory cleanup, if one is installed. - -2010-11-30 04:45:54 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - dvbsuboverlay: Work with GstClockTime instead of PTS for subtitle timing - Abuse libdvbsub PTS tracking to just store our running time in it, to get - it back in the callbacks. As GStreamer does its own PTS handling behind our - back (especially for video), we should just sync with video per running time, - not try to do it with PTS, which doesn't seem well accessible for video chain. - We can later relabel dvb-sub.c pts naming convention if wanted, it's just - passing along guint64 values, which GstClockTime fortunately is too. - The current idea is to collect the regions returned by the callback into - a FIFO buffer and pop and pre-render the top one into a separate - quick-to-blend cached format, which is then appropriately blended in the - video chain until the next one on top of the stack reaches the video chains - running time (or the fallback timer hits). - -2010-11-30 03:56:32 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - dvbsuboverlay: Add FIXME note about non-constant PTS for a display set handling. - -2010-11-30 03:47:46 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/dvb-sub.h: - dvbsuboverlay: Remove dvb_sub_feed() API - GStreamer will only use dvb_sub_feed_with_pts, as it has its own PES filter - to do the header parsing. - -2010-11-29 20:55:30 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvbsuboverlay/TODO: - dvbsuboverlay: more TODO - -2010-11-29 20:10:17 +0000 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - gstmpegtsdemux: add temporary **HACK** for dvb subs testing so dvbsuboverlay gets whole packets - <tpm> leio, what's the mpegts demux hack about? - <leio> my libdvbsub code can't handle cut packets - <leio> so the hack instructs the demuxer to gather full packets before pushing down, but it applies that to more PES packet types than just dvbsub, but I'm not sure if that's a bad thing - <leio> either way, needs a cleaner solution, either in demuxer, or I need to handle cut packets - <tpm> ok, but really it should be fixed in the overlay, right? - <tpm> or a parser be inserted - <leio> the problem is that I don't know from the first packet beforehand if it is a cut one or no - <leio> not - <leio> err, first buffer - <leio> just when I receive the next one I see if it has a valid timestamp on it or not - <leio> so I can't very well queue it up in the chain either, I might be blocking the very last subtitle for no reason or something - <tpm> but you could just drop/ignore packets until you find one, right? - <leio> find what? - <tpm> a complete packet? - <leio> the problem isn't that they aren't complete - <leio> the problem is that they are cut across multiple GstBuffers by the demuxer without the hack - <tpm> sure, I understand that - <tpm> but you can't easily determine if a GstBuffer contains he start fragment of a packet or not? - <leio> I guess I could parse the packet and see if its length is enough, just like the libdvbsub code eventually does too - <leio> I can, it has a timestamp if it's the first chunk - <leio> I just never know if I need to wait for more, without some parsing - <tpm> ah ok - <leio> while the demuxer could just give me an uncut one in the first place - <leio> like it always does for program streams - <leio> that gather_pes is always set in gstmpegdemux, but not in gstmpegtsdemux - -2010-11-29 20:06:07 +0000 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * configure.ac: - * gst/dvbsuboverlay/Makefile.am: - * gst/dvbsuboverlay/TODO: - * gst/dvbsuboverlay/dvb-sub.c: - * gst/dvbsuboverlay/dvb-sub.h: - * gst/dvbsuboverlay/ffmpeg-colorspace.h: - * gst/dvbsuboverlay/gstdvbsuboverlay.c: - * gst/dvbsuboverlay/gstdvbsuboverlay.h: - dvbsuboverlay: initial version, work in progress - -2010-12-06 18:01:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * android/aacparse.mk: - * android/amrparse.mk: - * android/h264parse.mk: - * android/metadata.mk: - * android/qtmux.mk: - * android/sdpelem.mk: - android: update for 0.11 - -2010-12-06 17:54:04 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * win32/common/config.h: - config: update config - -2010-12-06 12:25:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * configure.ac: - configure: open 0.11 branch - -2010-12-03 18:11:56 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - * gst/audioparsers/gstac3parse.c: - * gst/audioparsers/gstamrparse.c: - audioparsers: update some documentation - -2010-12-03 18:11:38 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/audioparsers/gstmpegaudioparse.c: - mpegaudioparse: add to documentation - -2010-12-03 18:11:09 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/audioparsers/gstdcaparse.c: - dcaparse: add to documentation - -2010-12-03 18:09:41 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/qtmux/gstqtmux.c: - qtmux: add documentation - -2010-11-08 19:58:31 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: increase keyframe awareness - ... which is not particular relevant for audio parsing, but more so - in video cases. In particular, auto-determine if dealing with video (caps). - -2010-12-03 17:46:27 +0100 Benjamin Gaignard <benjamin.gaignard@stericsson.com> - - * Android.mk: - * sys/audioflingersink/Android.mk: - * sys/audioflingersink/GstAndroid.cpp: - * sys/audioflingersink/audioflinger_wrapper.cpp: - * sys/audioflingersink/audioflinger_wrapper.h: - * sys/audioflingersink/gstaudioflingerringbuffer.h: - * sys/audioflingersink/gstaudioflingersink.c: - * sys/audioflingersink/gstaudioflingersink.h: - sys: Add android audioflingersink - -2010-12-03 17:42:46 +0100 Benjamin Gaignard <benjamin.gaignard@stericsson.com> - - * Android.mk: - * android/NOTICE: - * android/aacparse.mk: - * android/amrparse.mk: - * android/h264parse.mk: - * android/metadata.mk: - * android/qtmux.mk: - * android/sdpelem.mk: - Add build system for Android - -2010-12-02 15:45:02 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin.c: - camerabin: smal api doc update - -2010-12-02 05:39:14 -0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: Avoid assertion on image finishing - As imgbin_finished() is scheduled from g_idle_add, it might - be run a little later than expected, this can lead to the application - setting camerabin to ready before imgbin_finished() runs. In this case, - the processing counter goes to 0 and an assertion happens. - This patch relaxes the imgbin_finished() check on the processing - counter. - -2010-12-01 23:14:56 -0800 David Schleef <ds@schleef.org> - - * tools/element-maker: - element-maker: Handle names with multiple underscores - -2010-12-01 23:04:57 -0800 David Schleef <ds@schleef.org> - - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstchopmydata.c: - * gst/debugutils/gstchopmydata.h: - chopmydata: Add new element - This element splits up a stream into randomly-sized buffers. - Useful (maybe) for testing parsers. - -2010-12-02 03:09:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/Makefile.am: - tests: Remove leftover comment - Remove comment that doesn't make sense anymore - -2010-12-01 23:21:33 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * sys/applemedia/miovideosrc.c: - applemedia: don't use the deprecated g_strcasecmp function. - Replace g_strcasecmp with g_ascii_strcasecmp. - -2010-12-01 23:20:36 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/pcapparse/gstpcapparse.c: - * sys/applemedia/mioapi.c: - Fix compiler warnings with gcc 4.2.1 on OSX. - -2010-12-01 15:28:53 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstac3parse.c: - * gst/audioparsers/gstac3parse.h: - ac3parse: use proper EAC-3 caps - -2010-12-01 10:45:49 +0100 David Hoyt <dhoyt@llnl.gov> - - * gst/qtmux/gstqtmux.c: - qtmux: handle msvc ftruncate incompatibility - Fixes #636185. - -2010-10-09 17:39:36 -0700 David Schleef <ds@schleef.org> - - * tests/check/Makefile.am: - * tests/check/elements/schroenc.c: - Add a schroenc test - -2010-11-27 20:13:38 -0800 David Schleef <ds@schleef.org> - - * ext/dirac/gstdiracdec.cc: - * gst/liveadder/liveadder.c: - * gst/mpegpsmux/mpegpsmux.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - Fix pad template memleaks - Pad templates returned by gst_static_pad_template_get() were not - being unreffed. - -2010-11-30 18:43:24 -0800 David Schleef <ds@schleef.org> - - * ext/vp8/gstvp8enc.c: - vp8enc: Readd setting of granulepos - Revert parts of last patch that removed setting of granulepos. - oggmux still requires correct granulepos in incoming packet. - -2010-11-29 20:21:31 -0800 David Schleef <ds@schleef.org> - - * ext/vp8/gstvp8enc.c: - vp8enc: Don't override timestamps set by base class - Because the base class does it correctly. - Fixes: #635720, #625558. - -2010-11-30 15:41:02 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: avoid unexpected stray metadata - -2010-11-30 15:40:28 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: use proper _NONE output value when applicable - -2010-11-15 20:03:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/jp2kdecimator/Makefile.am: - * gst/jp2kdecimator/gstjp2kdecimator.c: - * gst/jp2kdecimator/gstjp2kdecimator.h: - * gst/jp2kdecimator/jp2kcodestream.c: - * gst/jp2kdecimator/jp2kcodestream.h: - jp2kdecimator: Add a JPEG2000 decimator element - This element drops information from JPEG2000 images without reencoding. - -2010-11-23 21:45:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/jp2k/gstjasperenc.c: - jp2kenc: Emit SOP markers in every codestream packet - This makes parsing much easier, faster and more reliable. - -2010-11-27 16:07:19 -0600 Alejandro Gonzalez <agonzalez@dextratech.com> - - * gst/qtmux/gstqtmux.c: - qtmux: gst_qtmux_check_difference verify before subtract - Avoid negative overflow by checking the order of operands - on subtraction of unsigned integers. - https://bugzilla.gnome.org/show_bug.cgi?id=635878 - -2010-11-27 18:58:07 -0800 David Schleef <ds@schleef.org> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Fix some memleaks - -2010-11-15 11:37:39 -0800 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschroenc.c: - schroenc: minor memleak fix - -2010-11-25 19:31:35 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: Remove dead assignments - -2010-11-25 19:31:03 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/videomeasure/gstvideomeasure_collector.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - videomeasure: Remove dead assignments - -2010-11-25 19:25:27 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/tta/gstttadec.c: - * gst/tta/gstttaparse.c: - tta: Remove dead assignments and useless variable - -2010-11-25 19:24:56 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/stereo/gststereo.c: - stereo: Remove dead assignments - -2010-11-25 19:21:23 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/sdp/gstsdpdemux.c: - sdp: Remove useless variables - -2010-11-25 19:21:11 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: Remove dead assignments - -2010-11-25 19:21:01 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/real/gstrealaudiodec.c: - * gst/real/gstrealvideodec.c: - real: Remove dead assignments - -2010-11-25 19:20:51 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/ivfparse/gstivfparse.c: - ivfparse: Remove dead assignments - -2010-11-25 19:06:49 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/freeze/gstfreeze.c: - freeze: Remove dead assignments - -2010-11-25 19:06:38 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: Remove dead assignments - -2010-11-25 19:06:27 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/dtmf/gstrtpdtmfdepay.c: - dtmf: Remove dead assignments - -2010-11-25 19:01:42 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/dccp/gstdccp.c: - dccp: Remove dead assignments - -2010-11-25 18:56:42 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/audioparsers/gstaacparse.c: - * gst/audioparsers/gstamrparse.c: - * gst/audioparsers/gstbaseparse.c: - audioparsers: Remove dead assignments - -2010-11-25 18:52:47 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - vp8: Remove dead assignments - -2010-11-25 18:49:23 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/sdl/sdlaudiosink.c: - sdlaudiosink: Remove dead assignments - -2010-11-25 18:47:15 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroparse.c: - schroedinger: Remove dead assignments - -2010-11-25 18:43:30 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/mimic/gstmimenc.c: - mimenc: Remove dead assignment - -2010-11-25 18:43:18 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/cog/gstcogdownsample.c: - cogdownsample: Remove dead assignment - -2010-11-25 18:42:33 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/opencv/gstcvdilateerode.c: - * ext/opencv/gstcvlaplace.c: - * ext/opencv/gstcvsmooth.c: - * ext/opencv/gstcvsobel.c: - * ext/opencv/gstedgedetect.c: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstopencvutils.c: - * ext/opencv/gstopencvvideofilter.c: - * ext/opencv/gstpyramidsegment.c: - * ext/opencv/gsttemplatematch.c: - * ext/opencv/gsttextwrite.c: - opencv: Remove dead assignments - ... and fix indentation - -2010-11-25 18:33:37 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/cog/gstcogcolorspace.c: - cogcolorspace: Remove dead assignment - -2010-11-25 18:30:56 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/cog/cogframe.c: - cogframe: Remove dead assignments - -2010-11-25 18:29:31 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/celt/gstceltenc.c: - celtenc: Initialize variable - In the case the tag_setter returns something, empty_tags would be - garbage value. - -2010-11-25 18:29:22 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/celt/gstceltenc.c: - celtenc: Remove dead assignment - -2010-11-25 18:26:21 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/assrender/gstassrender.c: - assrender: Remove dead assignments - -2010-11-25 17:14:23 +0100 Andoni Morales Alastruey <amorales@flumotion.com> - - * gst/audioparsers/gstbaseparse.c: - audioparse: fix possible division-by-zero - https://bugzilla.gnome.org/show_bug.cgi?id=635786 - -2010-10-23 01:56:04 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/shmpipe.c: - shm: Don't pass the ShmPipe to the function closing the shm area - -2010-10-23 01:22:43 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/shmpipe.c: - shm: Use the right counter when freeing buffers - -2010-10-23 01:12:49 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/Makefile.am: - * sys/shm/shmalloc.h: - shmalloc: Manually decide to use GLib or not in the shmalloc - So make it easier for embedders to use it with or without Glib - -2010-10-20 22:49:59 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/shmpipe.c: - shm: Remove duplicated arguement - -2010-10-20 22:39:21 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/shmpipe.c: - shm: Fix socket leak on connect() error - -2010-10-20 22:28:13 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/shmpipe.c: - * sys/shm/shmpipe.h: - shm: sp_client_recv returns negative on error, so make the retval signed - -2010-10-20 22:17:30 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/shmpipe.c: - shm: Rename confusingly named variable - -2010-10-20 22:14:09 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/shmpipe.c: - shm: Change permissions on old shm areas too - Change the permissions on old shm areas - -2010-10-20 22:01:36 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/shmpipe.c: - shm: Use the macro for the last error too - -2010-10-20 21:52:31 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/shmpipe.c: - shm: Use "ablock" for all ShmAllocBlock variables - Use the ablock variable name for ShmAllocBlocks and block for - ShmBlock - -2010-10-20 21:52:24 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/shmpipe.h: - shm: Add more comments - -2010-10-20 21:41:15 +0200 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/shm/shmpipe.c: - shm: stylist improvements - -2010-10-20 21:33:24 +0200 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * sys/shm/shmalloc.c: - shm: Explain some fields - Explain what some of the fields in the allocator actually mean - -2010-11-22 15:26:06 +0100 Robert Swain <robert.swain@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlace: Fix buffer timestamp and duration - The field rate is twice the frame rate of the src pad and so the duration of - one output buffer is src_fps_d / (2 * src_fps_n). - -2010-11-22 10:29:56 +0100 Robert Swain <robert.swain@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlace: Rename pattern property to field-pattern - This is mostly for clarity of what the property means and, I believe, makes the - pattern-offset property more comprehensible. - -2010-11-22 10:27:22 +0100 Robert Swain <robert.swain@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlace: Add pattern offset property - This property allows one to start at any point within the field pattern after - a discontinuity (whenever gst_interlace_reset () is called). Thus with the - 2:3:3:2 pattern, for example, one can start at offset 2 and achieve 3:2:2:3 - or offset 1 and achieve 3:3:2:2. - -2010-11-19 17:01:41 -0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinimage.h: - * gst/camerabin/gstcamerabin.c: - camerabin: Create imagebin elements when image mode is set in camerabin NULL state - This patch refactors imagebin element creation and linking into separate functions, - and adds re-using also for imagebin internally created elements. - So this refactoring allows creating imagebin elements already in NULL state when - application sets the image mode, and next state change from NULL to READY will be faster. - This reduces first capture latency. - Earlier the elements were both created and linked in NULL to READY state change. - -2010-11-22 12:23:30 +0100 Andoni Morales Alastruey <amorales@flumotion.com> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: Create a sub-buffer with the section length - -2010-11-19 15:23:41 -0500 Josh Doe <josh@joshdoe.com> - - * ext/opencv/gstcvdilateerode.c: - * ext/opencv/gstcvequalizehist.c: - * ext/opencv/gstcvlaplace.c: - * ext/opencv/gstcvsmooth.c: - * ext/opencv/gstcvsobel.c: - * ext/opencv/gstedgedetect.c: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstopencvutils.c: - * ext/opencv/gstopencvutils.h: - * ext/opencv/gstpyramidsegment.c: - * ext/opencv/gsttemplatematch.c: - * ext/opencv/gsttextwrite.c: - opencv: fix caps issues and extend supported caps for some elements - Some elements had vague caps, such as "video/x-raw-rgb", which caused problems - at least with textwrite. For other elements, the underlying OpenCV functions - support more than just one image type, so I increased the number of supported - caps. - I created a utility function "gst_opencv_caps_from_cv_image_type", so each - element creates caps directly from OpenCV image types, such as CV_8UC1 for - 8-bit grayscale. This function uses gstvideo to create uniform caps. - https://bugzilla.gnome.org/show_bug.cgi?id=635304 - -2010-11-22 17:43:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: Small optimization on tags parsing - Optimize a little avoiding copying a taglist when parsing xmp/exif - data. - -2010-09-17 09:52:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/selector/gstoutputselector.c: - outputselector: Avoid losing the last_buffer when switching - This patch makes outputselector take an extra ref when pushing - the last_buffer to avoid it losing it during the switch function. - This makes resend-latest properly work if the active-pad is changed - during the switch function buffer pushing (on a pad probe, for example). - https://bugzilla.gnome.org/show_bug.cgi?id=629917 - -2010-09-17 09:44:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/selector/gstoutputselector.c: - outputselector: Recheck pending switch after pushing buffer - This patch makes output-selector always recheck if there's a - pending pad switch after pushing a buffer, preventing that - it pushes a buffer on the 'wrong' pad. - https://bugzilla.gnome.org/show_bug.cgi?id=629917 - -2010-11-22 15:10:26 +0200 Olivier Aubert <olivier.aubert%40liris.cnrs.fr> - - * ext/rsvg/Makefile.am: - * ext/rsvg/gstrsvg.c: - * ext/rsvg/gstrsvgoverlay.c: - * ext/rsvg/gstrsvgoverlay.h: - rsvgoverlay: scalable and relative svg overlay with cairo - Add a cairo+librsvg based overlay element to the rsvg plugin. - -2010-11-22 17:06:05 +0200 Stefan Kost <ensonic@users.sf.net> - - * tests/check/Makefile.am: - make: remove traces or moved/removed plugins - -2010-11-22 17:05:23 +0200 Stefan Kost <ensonic@users.sf.net> - - * Makefile.am: - make: add missinf trailing \ to fix the build - -2010-11-21 23:11:19 -0800 David Schleef <ds@schleef.org> - - * gst/colorspace/colorspace.c: - colorspace: remove incorrect check - -2010-11-19 17:55:36 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: remove remnant of obsolete property - -2010-11-19 15:18:58 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/qtmux.c: - tests: qtmux: also unit test fragmented file cases - -2010-07-30 12:48:29 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - qtmux: allow specifying trak timescale - This is mainly because Smoothstreaming client are broken and don't - take the TimeScale property into account. - -2010-11-19 17:41:41 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/gstqtmux.c: - qtmux: include sdtp atoms for ismv fragmented files - Based on patch by Marc-André Lureau <mlureau@flumotion.com> - -2010-11-19 19:17:45 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: enable default fragmented file for ismlmux - -2010-09-02 13:58:05 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/qtmux/atoms.h: - * gst/qtmux/ftypcc.h: - * gst/qtmux/gstqtmuxmap.c: - * gst/qtmux/gstqtmuxmap.h: - qtmux: add ismlmux, for fragmented isml major brand - -2010-11-19 14:44:45 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: finalize sinkpads list - -2010-07-22 19:40:07 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/qtmux/gstqtmux.c: - qtmux: add moov in streamheader - -2010-08-06 13:26:27 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - qtmux: add streamable property to avoid building fragmented mfra index - -2010-11-18 16:48:06 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - qtmux: add mfra to fragmented file - Based on patch by Marc-André Lureau <mlureau@flumotion.com> - -2010-11-15 15:17:59 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - qtmux: optionally create fragmented file - In this mode, an initial empty moov (containing only stream metadata) is written, - followed by fragments containing actual data (along with required metadata). - New fragments are started either at keyframe (if such are sparse) or when - property configured duration exceeded. - Based on patch by Marc-André Lureau <mlureau@flumotion.com> - Fixes #632911. - -2010-11-15 15:12:45 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - qtmux: use helper to set atom flags from given uint - -2010-11-09 16:49:07 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: refactor configuring and sending of moov - Based on patch by Marc-André Lureau <mlureau@flumotion.com> - -2010-11-09 15:54:44 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: refactor extra top-level atom handling - Also check a bit more for possible errors, and free proper items in such case. - -2010-11-09 15:01:15 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: refactor slightly using buffer helper - -2010-11-05 13:48:57 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: fix misinforming comment - -2010-11-05 12:08:15 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/gstqtmux.c: - qtmux: delegate mvex handling to atoms - ... which keeps qtmux simpler. - -2009-09-28 16:11:35 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/gstqtmux.c: - qtmux: add mvex/trex in header if fragmented - One "trex" is added per "trak". We don't support default values, - but the "trex" box is mandatory. - -2009-09-28 13:01:30 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/qtmux/fourcc.h: - qtmux: add a couple of fourcc for fragmented mp4 - -2010-11-05 11:08:01 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: avoid removing temp file when error occurred - -2009-09-30 17:16:30 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/qtmux/gstqtmux.c: - qtmux: truncate buffer file after each send - -2009-09-28 16:53:51 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/qtmux/gstqtmux.c: - qtmux: remove temp file when reset/finalize - -2010-08-18 02:00:10 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegformat: Push tags after setting srcpad caps - This patch defers emission of tag events till caps are set on the source - pad of jpegparse, so that these tags can be seen downstream. - https://bugzilla.gnome.org/show_bug.cgi?id=627211 - -2010-11-19 18:51:32 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: fix compiler warning - -2010-11-19 18:26:59 +0100 Andoni Morales Alastruey <amorales@flumotion.com> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: fix thinko - -2010-11-19 17:25:01 +0100 Andoni Morales Alastruey <amorales@flumotion.com> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: fix handling of TOT and TDT sections. Fixes #635281. - TDT and TOT sections, with PID=0x14, doesn't extend to several packets - and the section filter is not needed here and shouldn't be used at all - for these tables because the have a different structure. - For example, TDT tables were not parsed for odd hours because this bit - is the 'current_next_indicator' bit for the other sections, and the table - was discarded. - -2010-11-19 17:22:06 +0100 Andoni Morales Alastruey <amorales@flumotion.com> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: don't calculate the CRC for TOT tables. Fixes #635281. - TOT tables, with table_id=0x73, don't have a CRC, so don't calcute it - -2010-11-18 18:42:38 +0100 Andoni Morales Alastruey <amorales@flumotion.com> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: Add TDT to the initial pids filter for dvbsrc. Fixes #635200. - -2010-11-16 17:35:36 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: add gst_jpeg_parse_skip_marker () - https://bugzilla.gnome.org/show_bug.cgi?id=626618 - -2010-08-13 13:14:30 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: use byte reader accessors - https://bugzilla.gnome.org/show_bug.cgi?id=626618 - -2010-11-17 10:49:30 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: inline gst_jpeg_parse_sof () - No functional changes (hopefully). - https://bugzilla.gnome.org/show_bug.cgi?id=626618 - -2010-11-16 17:23:35 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: fix typo - https://bugzilla.gnome.org/show_bug.cgi?id=626618 - -2010-11-18 10:58:06 -0300 Aleksey Lim <alsroot@member.fsf.org> - - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/gstcamerabin.c: - camerabin: Do not use audio clock after stopping video capture - Adda provide clock function to camerabin to make it not - provide the audio clock of the record bin when no video - recording is happening - Fixes #613379 - -2010-11-17 16:23:42 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: use correct offset when adding index entry - ... bearing in mind that BUFFER_OFFSET is media specific and may not - reflect the basic offset after having been parsed. - -2010-11-17 14:30:09 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: enhancements for timestamp marked framed formats - That is, as such formats allow subclass to extract position from frame, - it is possible to extract duration (if not otherwise provided) - from (near) last frame, and a seek can fairly accurately target the required - position. - Fixes #631389. - -2010-11-16 17:06:14 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: refactor frame scanning peformed by _loop - -2010-11-16 18:04:00 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: slightly optimize sending of pending newsegment events - -2010-11-16 17:04:35 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: minor fixes and enhancements - Arrange for upstream as well as downstream flushing when seeking. - Also determine upstream size as well as seekability. Adjust some comments - to reality and employ debug statement in proper order. - -2010-11-17 15:33:36 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - aacparse: minor cleanups - -2010-11-17 15:24:37 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - aacparse: fix regression in ADIF src caps setting - -2010-11-16 12:11:53 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - * gst/audioparsers/gstflacparse.h: - flacparse: parse seektable - Fixes #631389 (partially). - -2010-11-16 12:08:54 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: minor refactor and enable default baseparse segment clipping - -2010-11-12 00:40:33 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/celvideosrc.c: - * sys/applemedia/celvideosrc.h: - celvideosrc: fix nasty deadlock - We cannot call any CMBufferQueue functions while holding the lock that - our callback also depends on. So now we make use of CMBufferQueue's - trigger API in order to get notified when the queue has data. - -2010-11-11 23:41:44 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/cmapi.c: - * sys/applemedia/cmapi.h: - cmapi: cover CMBufferQueue's trigger API - -2010-11-11 21:42:03 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/celvideosrc.c: - celvideosrc: unlock should also notify - Otherwise we depend on being woken up by the CoreMedia queue getting - its next buffer. - -2010-11-10 23:16:51 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - applemedia: don't push synchronously from callback - The codec that called us might be holding locks to shared resources, so - we should never push downstream from within its buffer callback. - Note that a GstBufferList is not used here because we need to preserve - the buffer metadata held by our GstBuffer subclasses. - -2010-11-10 20:52:47 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/vtenc.c: - vtenc: bump H.264 level from 1.3 to 3.0 - This should be turned into a property. - -2010-11-10 20:44:15 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/celvideosrc.c: - * sys/applemedia/celvideosrc.h: - celvideosrc: add basic device selection support - -2010-11-10 20:51:27 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/cvapi.c: - * sys/applemedia/cvapi.h: - cvapi: add wrapper for IO surface access - To be used in a future video sink for zero-copy rendering. - -2010-11-10 20:25:28 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/celapi.c: - * sys/applemedia/celapi.h: - celapi: add capture port type constants - -2010-11-09 22:43:14 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Remove unused src_stride variable from blit functions - -2010-11-09 18:10:43 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * Makefile.am: - * win32/common/libgstphotography.def: - win32: Adding photography interface .def file - Adds check-exports to -bad to have photography interface - .def file created - Fixes #578629 - -2010-11-09 19:38:25 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstmpegaudioparse.c: - mpegaudioparse: fix silly leak in _reset - -2010-11-08 23:54:31 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/celvideosrc.c: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - * sys/applemedia/vth264decbin.c: - * sys/applemedia/vth264encbin.c: - applemedia: biplanar is actually NV12, not I420 - D'oh! - -2010-11-08 21:22:13 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - vtenc: remove keyframe enforcement workaround - Was only needed for old iOS where the H.264 encoder didn't support - kVTEncodeFrameOptionKey_ForceKeyFrame. - -2010-11-08 18:56:52 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/cvapi.c: - * sys/applemedia/cvapi.h: - cvapi: add a few extra bits of wrapping - -2010-11-08 15:08:19 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/cvapi.h: - applemedia: lock CVPixelBuffer read-only - As per Apple's docs, this may improve performance by avoiding redundant - invalidations of existing caches of the buffer contents. - -2010-11-08 10:33:58 -0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * tests/examples/camerabin/gst-camerabin-test.c: - examples: camerabin: Remove gstring leak - Simplify gst-camerabin-test by removing GString and replacing - with gchar for the filename handling. Also removes a leak of - the GString data. - -2010-11-08 16:00:21 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/rsvg/gstrsvgdec.c: - rsvgdec: avoid reffing the element in chain - -2010-11-08 15:45:48 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/rsvg/gstrsvgdec.c: - rsvgdec: add some minimal logging to track what it is doing - -2010-11-08 13:52:49 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/celvideosrc.c: - celvideosrc: put planar first in template caps - -2010-11-08 13:49:04 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/cvapi.h: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - * sys/applemedia/vth264decbin.c: - * sys/applemedia/vth264encbin.c: - applemedia: improve vtenc/vtdec performance - Profiling of H.264 encode and decode revealed that conversions - between packed and planar were happening behind the scenes. - Hence we now choose I420 instead of YUY2. - -2010-10-22 18:07:00 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * tests/examples/camerabin/gst-camerabin-test.c: - examples: add async bus handler to gst-camerabin-test - Splits the bus handler into sync and async, keeping the - prepare-xwindow handling at the sync for faster handling and - moving the others to the async handler - -2010-11-06 12:27:32 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: we still require Gtk+ >= 2.14.0 when compiling against 2.0 - The check for the minor version was dropped in one of the previous - commits. - -2010-11-05 16:51:57 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/celvideosrc.c: - * sys/applemedia/celvideosrc.h: - celvideosrc: measure fps when statistics is enabled - Also refactor timestamping slightly. - -2010-11-05 15:14:08 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/celvideosrc.c: - * sys/applemedia/celvideosrc.h: - celvideosrc: update to new Celestial and MediaToolbox APIs - This means celvideosrc is no longer compatible with iOS 3.x. - -2010-11-05 15:08:56 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/celvideosrc.c: - celvideosrc: fix debug category description - -2010-11-05 15:08:02 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/celapi.c: - * sys/applemedia/celapi.h: - celapi: update to reflect new API on iOS 4.x - Also add remaining property constants for device and stream. - -2010-11-05 15:07:38 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/mtapi.c: - * sys/applemedia/mtapi.h: - mtapi: update to reflect new API on iOS 4.x - Also add remaining property constants for device and stream. - -2010-11-05 10:56:51 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/gstcolorspaceorc-dist.c: - * gst/colorspace/gstcolorspaceorc-dist.h: - colorspace: Update generated ORC sources - -2010-08-26 17:08:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - * tests/check/elements/camerabin.c: - camerabin: Adds 'idle' property - Adds 'idle', a read-only boolean property that tells applications - if there is any capturing/saving/encoding going on in camerabin. If - not, it is safe to set it to NULL and release resources without - losing data. - -2010-05-05 13:58:07 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin.c: - * tests/check/elements/camerabin.c: - camerabin: Add "ready-for-capture" property - Add "ready-for-capture" property to indicate if preparing a new - capture is possible. - "ready-for-capture" changes before the 'image-done' signal, so - the application can be notified that it can do a new capture - even before the previous one has finished encoding/saving. - -2010-11-05 00:32:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: don't even check for Gtk+ if --disable-examples is specified - There are Gtk+-based examples in plugin dirs and tests/icles/ too, and - we want to disable those as well then. - -2010-11-05 00:24:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: add --with-gtk option and default to Gtk+ 2.0 while the 3.0 API is still in flux - https://bugzilla.gnome.org/show_bug.cgi?id=634014 - -2010-11-03 00:04:27 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * tests/Makefile.am: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/zbar.c: - * tests/files/Makefile.am: - * tests/files/barcode.png: - tests: add very simple zbar unit test - Not valgrind clean yet (could be zbar's fault though). - -2010-11-04 19:25:24 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/celvideosrc.c: - * sys/applemedia/miovideosrc.c: - * sys/applemedia/qtkitvideosrc.m: - applemedia: make video source element details consistent - Inspired by the v4l2src element details. - -2010-11-04 19:11:04 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/qtkitvideosrc.m: - applemedia: consistently use gst_element_class_set_details_simple - -2010-11-04 19:02:50 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/celvideosrc.c: - * sys/applemedia/celvideosrc.h: - celvideosrc: update e-mail address - -2010-11-04 18:59:44 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/celvideosrc.c: - * sys/applemedia/celvideosrc.h: - * sys/applemedia/plugin.m: - applemedia: rename iphonecamerasrc to celvideosrc - This is in order to improve consistency with the other three sources. - -2010-11-04 17:58:36 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: don't explicitly empty the buffer queue - We're holding the only reference to it so there's no need to explicitly - empty it right before letting go of our reference. - -2010-11-04 17:50:33 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/avfvideosrc.m: - avfvideosrc: make buffer offset start from zero - -2010-11-04 17:47:25 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/qtkitvideosrc.m: - qtkitvideosrc: implement zero-copy by using buffer-factory - This means we'll wrap each CoreVideo buffer inside a GstBuffer instead of - making a copy. - -2010-11-04 17:44:12 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/bufferfactory.h: - * sys/applemedia/bufferfactory.m: - bufferfactory: add support for wrapping CVBuffer - -2010-11-04 17:24:03 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/qtkitvideosrc.m: - qtkitvideosrc: fix up refcounting - Should keep a strong reference to the device, but we don't need to manage - the reference count of elements of an NSMutableArray as it takes care of - that for us. - -2010-11-04 17:16:05 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/qtkitvideosrc.m: - qtkitvideosrc: simplify timestamping algorithm - Aligning timestamps on duration boundaries, skipping frames and so forth - are clearly things that fall outside the scope of a video source. - -2010-11-04 14:14:09 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/Makefile.am: - * sys/applemedia/avfvideosrc.h: - * sys/applemedia/avfvideosrc.m: - * sys/applemedia/bufferfactory.h: - * sys/applemedia/bufferfactory.m: - * sys/applemedia/plugin.m: - applemedia: add new iOS video source based on AVFoundation - This element makes use of the documented AVFoundation framework made - available starting with iOS 4.0, and hence this means we can finally - capture video using a public API. - -2010-11-04 14:24:36 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/vtdec.c: - * sys/applemedia/vtenc.c: - * sys/applemedia/vth264decbin.c: - applemedia: fix stream-format caps used for H.264 - The stream-format's "avc-sample" member is now called just "avc". - -2010-11-04 14:29:37 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/miovideodevice.c: - * sys/applemedia/plugin.m: - * sys/applemedia/qtkitvideosrc.m: - applemedia: update e-mail addresses - -2010-11-04 14:18:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/gstcolorspace.c: - colorspace: Inverse -base version check logic to actually make sense - -2010-11-03 18:34:28 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/pcapparse/gstpcapparse.c: - * gst/pcapparse/gstpcapparse.h: - pcapparse: Add support for Linux Cooked Capture (SLL) frames - -2010-11-03 18:23:27 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: Fail on unknown version or linktype - The element only knows about major version 2 and only decodes linktype ethernet - -2010-11-03 18:02:49 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/pcapparse/gstpcapparse.c: - pcapparse: Send error GstMessage if stream doesn't have the expected magic - -2010-11-03 16:16:24 +0100 Andoni Morales Alastruey <amorales@flumotion.com> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: send TDT tables messages in a serialized event downstream - https://bugzilla.gnome.org/show_bug.cgi?id=633917 - -2010-11-03 15:37:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - colorspace: Add support for IYU1 - -2010-11-03 15:12:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - * gst/colorspace/gstcolorspaceorc.orc: - colorspace: First version of YUV9 and YVU9 implementation - -2010-11-03 09:20:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - * gst/colorspace/gstcolorspace.c: - colorspace: Use GST_CHECK_PLUGINS_BASE_VERSION() instead of other hacks - -2010-10-18 15:32:14 +0200 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/mpegvideoparse/mpegpacketiser.c: - * gst/mpegvideoparse/mpegpacketiser.h: - * gst/mpegvideoparse/mpegvideoparse.c: - * gst/mpegvideoparse/mpegvideoparse.h: - mpegvideoparse: fix timestamp generation - Use information from the gop header and picture - header to calculate the picture timestamp. (time_code - and temporal_reference) and adapt to upstream timestamps if - provided. - https://bugzilla.gnome.org/show_bug.cgi?id=632222 - -2010-11-02 23:08:30 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/vtapi.h: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - applemedia: switch vtapi to CFTypeRef style typedefs - -2010-11-02 22:53:33 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/applemedia/celapi.h: - * sys/applemedia/cmapi.c: - * sys/applemedia/cmapi.h: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/coremediabuffer.h: - * sys/applemedia/iphonecamerasrc.c: - * sys/applemedia/iphonecamerasrc.h: - * sys/applemedia/mioapi.h: - * sys/applemedia/miovideodevice.c: - * sys/applemedia/miovideodevice.h: - * sys/applemedia/miovideosrc.c: - * sys/applemedia/miovideosrc.h: - * sys/applemedia/mtapi.h: - * sys/applemedia/vtapi.h: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - * sys/applemedia/vtenc.c: - applemedia: support public version of CoreMedia - Also rename the relevant API so we mirror the public API more closely, and - switch to CoreFoundation CFTypeRef style typedefs. We still support the old - private CoreMedia in order to not break OS X support. - This means that vtenc and vtdec are now compatible with iOS 4.x, and in - theory also future versions of OS X, where this API may turn public like - it has on iOS. - -2010-11-02 17:46:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/zbar/gstzbar.c: - zbar: handle more formats that start with an 8-bit Y plane - We can handle most planar YUV layouts too, as long as we don't - tell zbar about the chroma planes. - -2010-11-02 17:18:52 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/zbar/gstzbar.c: - * ext/zbar/gstzbar.h: - zbar: use correct stride - Fixes detection for images with a width that's not a multiple of four. - Based on patch by: Kaj-Michael Lang <milang@tal.org> - Based on patch by: Stefan Kost <ensonic@users.sf.net> - https://bugzilla.gnome.org/show_bug.cgi?id=630830 - -2010-11-02 16:54:59 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/colorspace/gstcolorspace.c: - colorspace: fix build with current git of gst-plugins-base - ifdef tests don't work so well if we define them in the code - above in case they aren't defined. - -2010-11-02 16:35:57 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/zbar/gstzbar.c: - zbar: minor clean-up - Fix typo and use DEFAULT_FOO define for property default. - -2010-11-02 16:32:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/zbar/gstzbar.c: - zbar: disable cache by default - Since it breaks still image bar code detection. - -2010-11-02 16:05:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - * gst/colorspace/colorspace.h: - * gst/colorspace/gstcolorspace.c: - * gst/colorspace/gstcolorspace.h: - colorspace: Add support for 8 bit paletted RGB - This needs the 8 bit paletted support from -base - which will be committed after release. Without this - the 8 bit parts are disabled. - -2010-11-02 10:24:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/camerabinpreview.c: - camerabin: Add missing change to previous commits - Forgot to add this change to the latest commits. This fixes the build. - -2010-11-02 09:39:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/camerabinpreview.c: - camerabin: Fix leaks in the preview handling - Remember to unref the bus after adding the watch. - Remember to unref the element after getting it with - gst_bin_get_by_name. - -2010-11-02 09:38:20 -0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: Do not leak a caps - gst_caps_replace doesn't take ownership, but refs the caps. So we - unref the remaining caps. - -2010-09-24 16:28:13 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: Reset pre-night-mode stored fps when mode changes - When switching between video/still modes the pre-night-mode fps - should be reset to prevent it being used in the incorrect mode, causing - the videosource to fail configuring itself - -2010-09-21 16:23:47 +0300 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * tests/examples/camerabin/gst-camerabin-test.c: - examples: camerabin: add support for setting many post-processing elements - Instead of taking a single element as input for the image post - processing option, take a list of comma separated elements - that will be used. - -2010-09-20 11:54:20 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: Store app preferred capture parameters separately - Store width/height/fps for video captures in a separate variable - than the one that stores the currently used value. - This prevents the user preferences to be lost when resetting - the currently used dimensions for night mode, for example - -2010-09-20 08:42:41 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: cleanup used caps when going to NULL - Resets used caps so that camerabin doesn't try to use them - when restarting, where elements/properties might have changed - and the old caps be incompatible - -2010-09-09 10:50:59 +0300 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: fix priority for idle_add function - Adds a higher priority to the idle_add function for when - the image bin finished the image capture. This reduces the - delay for the application to be notified about this. - -2010-11-01 23:04:44 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/selector/gstinputselector.c: - inputselector: log times in human readable form - -2010-11-01 22:40:36 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/selector/gstinputselector.c: - inputselector: move reoccuring logs to LOG and remove a double info - Less debug spew in DEBUG category. No need to log pad again if we use - GST_LOG_OBJECT(pad,...). - -2010-11-01 15:53:52 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/cog/gstcogorc-dist.c: - * gst/colorspace/gstcolorspaceorc-dist.c: - * gst/colorspace/gstcolorspaceorc-dist.h: - cog, colorspace: update orc backup functions for latest changes - Should fix build on systems without the latest orc. - -2010-11-01 15:53:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/el.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/gl.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ro.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - po: update for new translations - -2010-10-31 23:46:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - * gst/colorspace/gstcolorspace.c: - colorspace: Add support for RGB15 and BGR15 - -2010-10-31 23:44:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - * gst/colorspace/gstcolorspace.c: - colorspace: Add support for RGB16 and BGR16 - -2010-10-31 23:25:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - * gst/colorspace/gstcolorspaceorc.orc: - colorspace: Add support for Y16 - -2010-10-31 23:25:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/gstcolorspaceorc.orc: - colorspace: Fix Y800 ORC getline implementation - -2010-10-31 23:07:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - * gst/colorspace/gstcolorspace.c: - * gst/colorspace/gstcolorspaceorc.orc: - colorspace: Add support for A420 - -2010-10-31 23:00:07 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - colorspace: Add support for Y41B - -2010-10-31 22:39:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - * gst/colorspace/colorspace.h: - * gst/colorspace/gstcolorspace.c: - * gst/colorspace/gstcolorspace.h: - colorspace: Add support for SDTV/HDTV YUV conversions - -2010-10-31 22:21:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - colorspace: Add comment for the A420 getline/putline table row - -2010-10-31 20:40:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - * gst/colorspace/colorspace.h: - colorspace: Add const to the source arrays and the getline/putline table - -2010-10-31 19:42:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - colorspace: Make fast-path transform table const - -2010-10-31 19:39:33 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/colorspace/colorspace.c: - colorspace: Only do the I420->YUY2 conversion once per scanline in the fast path - -2010-10-29 14:08:58 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: use only upstream duration if it provides one - -2010-10-25 14:15:50 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: reflow update_bitrate code - ... which makes local variables represent real state better, and avoids - triggering unneeded updates/actions. - -2010-10-25 14:13:51 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: add some debug statements - -2010-10-28 18:51:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/gaudieffects/Makefile.am: - * gst/gaudieffects/gstplugin.c: - gaudieffects: Include gstcontroller header and add the required CFLAGS - -2010-10-27 14:57:36 +0200 Luis de Bethencourt <luis@debethencourt.com> - - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstburn.h: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstchromium.h: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdilate.h: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstexclusion.h: - * gst/gaudieffects/gstplugin.c: - * gst/gaudieffects/gstsolarize.c: - * gst/gaudieffects/gstsolarize.h: - gaudieffects: made filter parameters dynamic and controllable - -2010-07-01 15:07:41 +0200 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/winks/gstksvideodevice.c: - winks: work around shutdown deadlock - GetOverlappedResult() might never return with some drivers. Time out - after 1000 ms. We cannot really fix this without either: - 1) Controlling the streaming thread so we can do CancelIo() from that - thread. - 2) Switch to using IO completion ports. - -2010-06-11 18:04:58 +0200 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/winks/gstksvideodevice.c: - winks: remove JPEG validation hack - This should clearly not be done in a video source. - -2010-04-20 12:05:45 +0200 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/winks/ksvideohelpers.c: - winks: set PrioritySubClass to KSPRIORITY_NORMAL instead of 1 - In order to match the reference implementation. - -2010-04-20 11:59:23 +0200 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/winks/gstksvideodevice.c: - winks: retry when KsCreatePin fails with ERROR_NOT_READY - Turns out that the reference implementation does this, hence we need to - mirror this behaviour. This typically happens with hardware that takes - some time to initialize. - -2009-10-26 16:09:00 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/winks/ksvideohelpers.c: - winks: improve framerate fraction conversions - * For instance 7.5 fps should be represented as 15/2 instead of 7/1. - * Clamp AvgTimePerFrame and dwBitRate to account for rounding errors. - -2009-10-12 17:26:15 +0200 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/winks/gstksclock.c: - * sys/winks/gstksvideodevice.c: - * sys/winks/gstksvideodevice.h: - * sys/winks/gstksvideosrc.c: - * sys/winks/kshelpers.c: - * sys/winks/kshelpers.h: - * sys/winks/ksvideohelpers.c: - winks: improve error-handling - Most important part here is special-casing "device busy" so the application - is able to provide better feedback when another application is using the - device. - -2009-09-07 16:45:57 +0200 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/winks/gstksvideodevice.c: - * sys/winks/gstksvideodevice.h: - * sys/winks/gstksvideosrc.c: - winks: performance improvements - * Make the driver write directly into each GstBuffer to avoid memcpy(). - * Don't memset() the buffer before reusing it. - * Recycle memory by keeping two spare buffers. Two because the sink - downstream may keep a ref to the previous buffer. - Note that we align buffers on highest possible byte boundary (4096) so we - don't have to take into account what kind of alignment the driver requires. - -2009-09-07 16:09:34 +0200 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/winks/gstksclock.c: - * sys/winks/gstksclock.h: - * sys/winks/gstksvideodevice.c: - * sys/winks/gstksvideodevice.h: - * sys/winks/gstksvideosrc.c: - * sys/winks/gstksvideosrc.h: - winks: store priv pointer instead of looking it up - -2009-08-31 19:33:30 +0200 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/winks/gstksvideosrc.c: - winks: post error message on flow-unexpected - -2009-08-31 19:28:50 +0200 Andres Colubri <andres.colubri@gmail.com> - - * sys/winks/gstksvideosrc.c: - * sys/winks/gstksvideosrc.h: - winks: add property probing support - -2009-08-31 19:26:36 +0200 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/winks/gstksvideosrc.c: - * sys/winks/ksvideohelpers.c: - * sys/winks/ksvideohelpers.h: - winks: sort devices that look like cameras first - -2009-08-31 19:25:02 +0200 Knut Inge Hvidsten <knut.inge.hvidsten@tandberg.com> - - * sys/winks/ksvideohelpers.c: - winks: provide guessed pixel-aspect-ratio in caps - -2009-08-31 19:23:40 +0200 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/winks/gstksclock.c: - winks: only try to change state when actually open - -2009-08-31 19:22:40 +0200 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/winks/kshelpers.c: - * sys/winks/kshelpers.h: - * sys/winks/ksvideohelpers.c: - winks: ignore unsupported formats - -2010-10-28 16:14:34 +0200 Ole André Vadla Ravnås <oravnas@cisco.com> - - * sys/winks/gstksvideodevice.c: - * sys/winks/gstksvideosrc.c: - winks: adjust a couple of logging severities - Should clearly not be considered warnings, as they're quite common. - -2010-10-27 18:30:11 +0100 Ole André Vadla Ravnås <oravnas@cisco.com> - - * configure.ac: - * sys/Makefile.am: - * sys/applemedia/Makefile.am: - * sys/applemedia/celapi.c: - * sys/applemedia/celapi.h: - * sys/applemedia/cmapi.c: - * sys/applemedia/cmapi.h: - * sys/applemedia/coremediabuffer.c: - * sys/applemedia/coremediabuffer.h: - * sys/applemedia/coremediactx.c: - * sys/applemedia/coremediactx.h: - * sys/applemedia/corevideobuffer.c: - * sys/applemedia/corevideobuffer.h: - * sys/applemedia/cvapi.c: - * sys/applemedia/cvapi.h: - * sys/applemedia/dynapi-internal.h: - * sys/applemedia/dynapi.c: - * sys/applemedia/dynapi.h: - * sys/applemedia/iphonecamerasrc.c: - * sys/applemedia/iphonecamerasrc.h: - * sys/applemedia/mioapi.c: - * sys/applemedia/mioapi.h: - * sys/applemedia/miovideodevice.c: - * sys/applemedia/miovideodevice.h: - * sys/applemedia/miovideosrc.c: - * sys/applemedia/miovideosrc.h: - * sys/applemedia/mtapi.c: - * sys/applemedia/mtapi.h: - * sys/applemedia/plugin.m: - * sys/applemedia/qtkitvideosrc.h: - * sys/applemedia/qtkitvideosrc.m: - * sys/applemedia/vtapi.c: - * sys/applemedia/vtapi.h: - * sys/applemedia/vtdec.c: - * sys/applemedia/vtdec.h: - * sys/applemedia/vtenc.c: - * sys/applemedia/vtenc.h: - * sys/applemedia/vth264decbin.c: - * sys/applemedia/vth264decbin.h: - * sys/applemedia/vth264encbin.c: - * sys/applemedia/vth264encbin.h: - * sys/applemedia/vtutil.c: - * sys/applemedia/vtutil.h: - applemedia: New plugin for Apple multimedia APIs - Provides the following elements: - qtkitvideosrc: OS X video source relying on the QTKit API. Comes with - hard-coded caps as the API does not provide any way of querying for - formats supported by the hardware. Hasn't been tested a lot, but seems - to work. - miovideosrc: OS X video source which uses the undocumented/private - CoreMediaIOServices API, which is also the one used by iChat. - Present on latest version of Leopard and all versions of Snow Leopard. - Has been tested extensively with built-in cameras and TANDBERG's - PrecisionHD USB camera. - vtenc, vtdec: Generic codec wrappers which make use of the undocumented/ - private VideoToolbox API on OS X and iOS. List of codecs are currently - hard-coded to H.264 for vtenc, and H.264 + JPEG for vtdec. Can easily be - expanded by adding new entries to the lists, but haven't yet had time to - do that. Should probably also implement probing as available codecs depend - on the OS and its version, and there doesn't seem to be any way to - enumerate the available codecs. - vth264decbin, vth264encbin: Wrapper bins to make it easier to use - vtdec_h264/vtenc_h264 in live scenarios. - iphonecamerasrc: iPhone camera source relying on the undocumented/private - Celestial API. Tested on iOS 3.1 running on an iPhone 3GS. Stops working - after a few minutes, presumably because of a resource leak. Needs some - love. - Note that the iOS parts haven't yet been ported to iOS 4.x. - -2010-10-28 11:43:34 +0100 Sebastian Pölsterl <sebp@k-d-w.org> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: Add tag event emission. Fixes #627253 - -2010-10-27 13:17:10 +0100 Jan Schmidt <thaytan@noraisin.net> - - * common: - Automatic update of common submodule - From 7bbd708 to 011bcc8 - -2010-10-21 16:06:08 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: Check the source scene mode when creating it - As camerabin only gets notified of the changes from the - video source element, it should query the initial value - once the source is created so it initializes itself - correctly. - -2010-10-20 00:07:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/Makefile.am: - tests: fix distcheck a bit more - Dist elements/parser.h header file, which fixes the 'make check' build. - -2010-10-19 23:40:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/valve.c: - tests: fix valve unit test - gst_buffer_pad_alloc() needs simple caps or NULL caps, - ANY caps are not allowed. - -2010-10-19 23:25:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/audioparsers/gstdcaparse.c: - dcaparse: init variable to make osx build bot happy - gstdcaparse.c: In function 'gst_dca_parse_check_valid_frame': - gstdcaparse.c:246: warning: 'best_sync' may be used uninitialized in this function - -2010-10-19 00:15:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/audioparsers/Makefile.am: - * gst/audioparsers/gstdcaparse.c: - * gst/audioparsers/gstdcaparse.h: - * gst/audioparsers/plugin.c: - audioparsers: add very basic dts/dca parser - Still some issues, e.g. with seekable queries in totem, but also - processing already-chunked input (created with matroskademux ! gdppay). - -2010-10-19 16:23:23 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/amrwbenc/gstamrwbenc.c: - * ext/apexsink/gstapexsink.c: - * ext/artsd/gstartsdsink.c: - * ext/audiofile/gstafsink.c: - * ext/audioresample/gstaudioresample.c: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2enc.c: - * ext/cdaudio/gstcdaudio.c: - * ext/cog/gstcogmse.c: - * ext/cog/gstlogoinsert.c: - * ext/dc1394/gstdc1394.c: - * ext/dirac/gstdiracenc.cc: - * ext/directfb/dfbvideosink.c: - * ext/divx/gstdivxenc.c: - * ext/dts/gstdtsdec.c: - * ext/faac/gstfaac.c: - * ext/jack/gstjackaudiosink.c: - * ext/jack/gstjackaudiosrc.c: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkatetiger.c: - * ext/kate/gstkateutil.c: - * ext/libfame/gstlibfame.c: - * ext/modplug/gstmodplug.cc: - * ext/mpeg2enc/gstmpeg2encoptions.cc: - * ext/mplex/gstmplexjob.cc: - * ext/musicbrainz/gsttrm.c: - * ext/mythtv/gstmythtvsrc.c: - * ext/nas/nassink.c: - * ext/neon/gstneonhttpsrc.c: - * ext/ofa/gstofa.c: - * ext/opencv/gstedgedetect.c: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstpyramidsegment.c: - * ext/opencv/gsttemplatematch.c: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdsrc.c: - * ext/sdl/sdlvideosink.c: - * ext/shout/gstshout.c: - * ext/snapshot/gstsnapshot.c: - * ext/sndfile/gstsfsink.c: - * ext/soundtouch/gstpitch.cc: - * ext/tarkin/gsttarkindec.c: - * ext/tarkin/gsttarkinenc.c: - * ext/xvid/gstxvidenc.c: - * ext/zbar/gstzbar.c: - various (ext): add missing G_PARAM_STATIC_STRINGS flags - Canonicalize property names as needed. - -2010-10-19 16:24:12 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/videosignal/gstvideoanalyse.c: - videoanalyse: fix copy'n'paste off by one for param spec flags change - -2010-10-19 13:43:14 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/asfmux/gstasfmux.c: - * gst/autoconvert/gstautoconvert.c: - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinvideo.c: - * gst/dccp/gstdccpclientsink.c: - * gst/dccp/gstdccpclientsrc.c: - * gst/dccp/gstdccpserversink.c: - * gst/dccp/gstdccpserversrc.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/filter/gstiir.c: - * gst/freeze/gstfreeze.c: - * gst/games/gstpuzzle.c: - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstsolarize.c: - * gst/h264parse/gsth264parse.c: - * gst/id3tag/gstid3mux.c: - * gst/librfb/gstrfbsrc.c: - * gst/mixmatrix/mixmatrix.c: - * gst/mpeg4videoparse/mpeg4videoparse.c: - * gst/mpegdemux/flutspatinfo.c: - * gst/mpegdemux/flutspmtinfo.c: - * gst/mpegdemux/flutspmtstreaminfo.c: - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/mpegtsparse.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mve/gstmvemux.c: - * gst/nsf/gstnsf.c: - * gst/passthrough/gstpassthrough.c: - * gst/pcapparse/gstpcapparse.c: - * gst/playondemand/gstplayondemand.c: - * gst/pnm/gstpnmenc.c: - * gst/qtmux/gstqtmoovrecover.c: - * gst/real/gstrealaudiodec.c: - * gst/real/gstrealvideodec.c: - * gst/rtpmux/gstrtpmux.c: - * gst/scaletempo/gstscaletempo.c: - * gst/sdp/gstsdpdemux.c: - * gst/selector/gstinputselector.c: - * gst/selector/gstoutputselector.c: - * gst/smooth/gstsmooth.c: - * gst/speed/gstspeed.c: - * gst/stereo/gststereo.c: - * gst/subenc/gstsrtenc.c: - * gst/vbidec/gstvbidec.c: - * gst/videodrop/gstvideodrop.c: - * gst/videomeasure/gstvideomeasure_collector.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/videosignal/gstvideoanalyse.c: - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideomark.c: - various (gst): add missing G_PARAM_STATIC_STRINGS flags - Canonicalize property names as needed. - -2010-10-19 15:30:02 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/artsd/gstartsdsink.c: - * ext/audiofile/gstafsink.c: - * ext/shout/gstshout.c: - * gst/smooth/gstsmooth.c: - various: wrap property registration and add a single fixme for long desc. - -2010-10-19 15:06:36 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/pnm/gstpnmenc.c: - pnmenc: remove stray " in doc comment - -2010-10-19 13:44:25 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/dtmf/gstdtmfsrc.c: - dtmfsrc: remove DEBUG_FUNCPTR from gobject vmethods - -2010-10-08 19:33:16 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/jifmux.c: - tests: jifmux: Adds tests for the new tags - Adds tests for the new exif tags in -base - -2010-10-09 17:36:07 -0700 David Schleef <ds@schleef.org> - - * ext/dirac/gstdiracenc.cc: - * ext/schroedinger/gstschroenc.c: - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - basevideo: Move common fields/functions to basecodec - -2010-09-28 18:21:57 +0300 Kaj-Michael Lang <milang@tal.org> - - * ext/zbar/gstzbar.c: - * ext/zbar/gstzbar.h: - zbar: Make scanner cache optional - -2010-10-14 23:04:15 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/interfaces/photography.h: - photography: actualy use the enum in the vmethods - If we introduce a new GstPhotographyNoiseReduction, lets also use it - in the vmethods - -2010-10-14 23:03:19 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/interfaces/photography.h: - photography: retab interface struct fields - -2010-10-14 12:32:05 -0700 David Schleef <ds@schleef.org> - - * common: - Automatic update of common submodule - From 5a668bf to 7bbd708 - -2010-10-14 14:07:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin-enum.h: - camerabin: Remove unused entry - Remove camerabin unused enum entry - -2010-10-14 13:41:00 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/interfaces/photography.h: - photography: Avoid breaking ABI - Move the newly added functions/fields to the end of the structs - -2010-10-14 11:45:55 +0200 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/mpegvideoparse/mpegpacketiser.c: - mpegvideoparse: accelerate search for start code - As the startcode always starts with 0x000001 some iterations - can be skipped if values > 1 are detected. - ~ 70% faster on HD video stream. - https://bugzilla.gnome.org/show_bug.cgi?id=632130 - -2010-10-14 16:48:21 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstac3parse.c: - ac3parse: properly parse e-ac3 frame header - Also add a few debug statements. - -2010-10-14 11:24:42 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: reflow opening and closing decoder - In particular, this reconfigures quite forcefully when renegotiation is needed. - Fixes #631501. - -2010-10-13 17:47:29 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: prevent infinite loop when adjusting framerate - Fixes #632070. - -2010-10-12 21:46:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/jifmux.c: - tests: jifmux: update tests to the new datetime api - Update jifmux tests to use new gstdatetime API in core - -2010-10-12 09:37:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gstrotate.c: - * gst/geometrictransform/gstrotate.h: - * gst/geometrictransform/plugin.c: - geometrictransform: Adds rotate element - Adds a new rotate element to geometrictransform. It still - needs some work. But this is a good starting point. - Based on patch from Bert Douglas <bertd tplogic com> - -2010-10-13 11:00:01 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: tweak setting buffer metadata; avoid timestamp jitter - Fixes #631993. - -2010-10-12 18:17:27 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - * ext/faad/gstfaad.h: - faad: cater for renegotiation - At least, whenever either stream (e.g. ADTS) or upstream provides necessary - info for doing so. - Fixes #631501. - -2010-10-12 18:07:49 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - * gst/audioparsers/gstaacparse.h: - aacparse: streamline src caps setting - In particular, also set src caps whenever changes in stream warrant doing so. - -2010-10-12 16:13:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/directdraw/gstdirectdrawsink.c: - directdrawsink: port GstXOverlay bits to new API - Don't use deprecated API. - -2010-10-12 16:35:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/faac.c: - faac: adjust unit test to faac modified output - -2010-10-10 12:32:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/Makefile.am: - checks: remove variables from Makefile.am that aren't set - Remove some stuff that was copy'n'pasted from core but - doesn't apply here. The following vars aren't set: - CHECK_CFLAGS, CHECK_LIBS, GST_OBJ_CFLAGS, GST_OBJ_LIBS, - so we may just as well remove them. - -2010-10-12 12:11:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/examples/camerabin/gst-camera.c: - examples: Fix compilation with GTK+ 3.0 - -2010-10-12 10:28:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/flacparse.c: - flacparse: Adjust unit tests to new flacparse behaviour - Garbage after frames is now included in the frames because flacparse - has no easy way to detect the real end of a frame. Decoders are - expected to everything after the frame because only decoding the - bitstream will reveal the real end of the frame. - Fixes bug #631814. - -2010-10-12 10:27:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: Don't drop the last frame if it is followed by garbage - See bug #631814. - -2010-10-11 17:49:46 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: perform bitrate handling and posting after newsegment sending - -2010-10-11 17:36:19 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: immediately post subclass provided bitrate - -2010-10-11 17:06:48 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: fix parsing with unknown framesizes - Fixes #631814 (mostly). - -2010-10-11 17:05:28 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - * ext/faac/gstfaac.h: - faac: handle trailing encoder output - -2010-10-11 14:25:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/gsettings/gstswitchsrc.c: - switchsrc: Set the GST_ELEMENT_IS_SOURCE flag - -2010-09-13 19:07:55 +0100 Damien Lespiau <damien.lespiau@intel.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Fix example usage, bandwidth=8 not 8MHz - The bandwidth property is enum that takes the values 8, 7, 6, AUTO not - 8MHz. - -2010-10-08 17:01:29 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/shmalloc.h: - shm: Add C++ protection - Add c++ protection in the relevant places - -2010-10-08 12:44:45 -0700 David Schleef <ds@schleef.org> - - * common: - Automatic update of common submodule - From c4a8adc to 5a668bf - -2010-10-08 12:55:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 5e3c9bf to c4a8adc - -2010-10-07 23:37:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: Simplify frame header parsing by using lookup tables - Based on a patch by Felipe Contreras. - See bug #631200. - -2010-10-07 23:28:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - * gst/audioparsers/gstflacparse.h: - flacparse: Don't parse the complete FLAC frames but only look for valid frame headers - Thanks to Felipe Contreras for the suggestion. This is partially - based on his patches and makes flacparse more than 3.5 times faster. - Looking for valid frame headers is unlikely to give false positives - because every frame header is at least 9 bytes long, contains a - 14 bit sync code and a 8 bit checksum over the first 8 bytes. - Fixes bug #631200. - -2010-10-07 11:59:30 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: workaround internal rtspsrc failing state change - Fixes #630046. - -2010-10-07 10:34:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/rawparse/Makefile.am: - * gst/rawparse/gstaudioparse.c: - * gst/rawparse/gstaudioparse.h: - audioparse: Add support for setting the channel-positions - -2010-10-06 18:32:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: Really post tags only after the initial newsegment event - The first newsegment event will be send by the first call to - gst_base_parse_push_buffer() if necessary, posting the tags - before that is not a good idea. Instead do it from the - GstBaseParse::pre_push_buffer vfunc. - -2010-10-06 16:54:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/coloreffects/gstchromahold.c: - chromahold: Fix hue calculation for red colors - Also make the calculation much more accurate... - -2010-10-06 15:21:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/coloreffects/gstchromahold.c: - chromahold: Make everything greyscale if the target color is grey - -2010-10-06 11:55:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/coloreffects/Makefile.am: - * gst/coloreffects/gstchromahold.c: - * gst/coloreffects/gstchromahold.h: - * gst/coloreffects/gstplugin.c: - chromahold: Add chromahold color effect - This effect converts all colors except a single one to - grey. The color is selected by an RGB triple and a - tolerance for the color matching in hue degree can be specified. - -2010-10-05 17:04:10 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: fix and reflow some exits - -2010-10-05 16:56:49 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: error out if no streams found in sdp message - -2010-10-05 16:47:51 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: unbreak standard manager setup - -2010-10-05 11:44:48 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/.gitignore: - .gitignore: ignore more unit test binaries - -2010-10-05 11:42:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * ext/Makefile.am: - * ext/alsaspdif/Makefile.am: - * ext/alsaspdif/alsaspdifsink.c: - * ext/alsaspdif/alsaspdifsink.h: - * gst-plugins-bad.spec.in: - * m4/Makefile.am: - * m4/gst-alsa.m4: - alsaspdif: remove alsaspdifsink element - Remove alsaspdifsink, it's not needed any longer. alsasink in -base - has been able to handle SPDIF for a while now. - -2010-10-05 11:17:52 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - Revert "baseparse: add skip property" - This reverts commit b5a3d60363d837a10f0533c141ec93d10b742312. - Reverting this for now, since no one really seems to remember why this - property exists or what it could possibly be good for. It seems to have - been in the original mp3parse since the beginning of time and was back- - ported from there. - -2010-10-04 10:41:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: Fix uninitialized variable compiler warnings - These warnings are wrong, the variables are only used if they were - initialized by the bit reader. - -2010-09-14 02:48:58 +0300 Felipe Contreras <felipe.contreras@gmail.com> - - * gst/audioparsers/gstflacparse.c: - flacparse: fix picture parsing - Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> - -2010-10-03 23:54:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: Push tags before the header buffers are pushed - -2010-08-02 20:50:21 +0300 Felipe Contreras <felipe.contreras@gmail.com> - - * gst/audioparsers/gstflacparse.c: - flacparse: trivial caps fix - Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> - -2010-10-03 23:45:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: Add G_PARAM_STATIC_STRINGS - Add G_PARAM_STATIC_STRINGS to qtmux properties - -2010-10-03 23:14:53 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/Makefile.am: - tests: valve: Fix tests build - Adds missing cflags/libs to valve check test to - fix build - -2010-10-03 23:50:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - audioparser: Let the format string agree with the parameters to fix compiler warning - -2010-10-03 15:55:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/vdpau/mpeg/gstvdpmpegdec.c: - vdpau: Check return values of the bitreader functions - -2010-10-03 15:41:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstac3parse.c: - ac3parse: Use unchecked versions of the bitreader get functions - We didn't check the return values anyway... - -2010-09-28 13:52:29 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/valve/gstvalve.c: - valve: no need to ref the object in _chain - Don't ref the pad in chain, like elsewhere - -2010-09-22 15:44:43 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: Fix debug output - We lose the reference to the buffer after gst_pad_push(), so the debug - print should happen before. - https://bugzilla.gnome.org/show_bug.cgi?id=622276 - -2010-10-01 12:34:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/flacparse.c: - * tests/check/elements/parser.c: - * tests/check/elements/parser.h: - audioparsers: add flacparse unit test - ... and tweak parser test helper in the process. - -2010-09-29 16:12:42 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: support reverse playback - ... in pull mode or upstream driven. - -2010-09-27 12:16:43 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: remove done TODOs and update documentation - -2010-09-25 14:40:54 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: use determined seekability in answering SEEKING query - -2010-09-25 14:32:06 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: add skip property - -2010-09-25 13:59:39 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/ac3parse.c: - * tests/check/elements/mpegaudioparse.c: - audioparsers: add ac3parse and mpegaudioparse unit test - -2010-09-25 13:59:18 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/Makefile.am: - * gst/audioparsers/gstmpegaudioparse.c: - * gst/audioparsers/gstmpegaudioparse.h: - * gst/audioparsers/plugin.c: - mpegaudioparse: initial version - ... adequately equivalent to mp3parse, so lets boldly set it - to higher rank. - -2010-09-25 14:01:07 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - aacparse: set minimum frame size at _start - ... rather than one time at _init. - -2010-09-25 13:50:51 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/aacparse.c: - * tests/check/elements/aacparse_data.h: - * tests/check/elements/amrparse.c: - * tests/check/elements/amrparse_data.h: - * tests/check/elements/parser.c: - * tests/check/elements/parser.h: - audioparsers: refactor existing unit tests using common helper - -2010-09-22 15:07:09 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - * gst/audioparsers/gstac3parse.c: - * gst/audioparsers/gstamrparse.c: - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - baseparse: use _set_frame_props to configure frame lead_in and lead_out - ... provided a corresponding decoder with sufficient leading and following - frames to carry out full decoding for a particular segment. - -2010-09-22 14:13:17 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - * gst/audioparsers/gstac3parse.c: - * gst/audioparsers/gstamrparse.c: - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - * gst/audioparsers/gstflacparse.c: - baseparse: use _set_duration to configure duration update interval - ... as it logically belongs there as one or the other; either subclass - can provide a duration, or an estimate must be made (reguarly updated). - -2010-09-22 13:55:20 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: localize use of provided fps information - -2010-09-22 12:13:12 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: seek table and accurate seek support - -2010-09-21 13:57:10 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: proper and more extended segment and seek handling - That is, loop pause handling, segment seek support, newsegment for gaps, etc - -2010-09-21 10:57:04 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - baseparse: add index support - -2010-09-21 09:59:56 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: refactor state reset - -2010-09-20 16:39:37 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: prevent indefinite resyncing - -2010-09-20 13:57:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: specific EOS handling if no output so far - -2010-09-20 13:31:57 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: adjust _set_frame_prop documentation and set default as claimed - -2010-09-20 13:30:54 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: fix bitrate copy-and-paste and update heuristic - -2010-09-17 18:33:29 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: post duration message if average bitrates is updated - -2010-09-17 18:24:22 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - baseparse: remove is_seekable vmethod and use a set_seek instead - Seekability, like duration, etc is unlikely to change (frequently), and - the default assumption covers most cases, so let subclass set when needed. - At the same time, allow subclass to indicate if it has seek-metadata (table) - available, and possibly have it provide an average bitrate. - -2010-09-17 17:35:40 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstac3parse.c: - ac3parse: remove redundant default is_seekable - -2010-09-17 17:21:46 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - baseparse: add another hook for subclass prior to pushing buffer - ... and allow subclass to perform custom segment clipping, or to - emit tags or messages at this time. - -2010-09-17 17:19:37 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: 0 converts to 0 by default - -2010-09-16 18:56:46 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - basepase: refactor conversion using helper function and export default convert - -2010-09-16 18:35:47 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: streamline query handling - -2010-09-16 11:51:20 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - baseparse: cleanup struct and remove unused member - -2010-08-16 11:04:37 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/plugin.c: - audioparsers: increase ranks to enable auto-plugging - Because we can, and should, have some shakedown testing before having - these make it into -good later on ... - -2010-09-22 16:07:24 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: Allow chaining of subclass event handlers - This allows the child class to chain its event handler with - GstBaseParse, so that subclasses don't have to duplicate all the default - event handling logic. - https://bugzilla.gnome.org/show_bug.cgi?id=622276 - -2010-09-30 17:48:35 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * tests/check/elements/valve.c: - tests: Fix caps leak in the valve test - -2010-09-30 17:24:29 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/valve.c: - valve: Add unit tests - Add a unit test for the valve element. - -2010-09-30 16:26:19 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/valve/gstvalve.c: - * gst/valve/gstvalve.h: - valve: Make the drop variable into an atomic. - Using an atomic allows us to avoid locking the whole object all time time. - As suggested by Stefan Kost. - -2010-09-30 16:22:04 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/valve/gstvalve.c: - valve: Correctly set the DISCONT flag after dropping buffers - -2010-09-30 16:16:47 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/valve/gstvalve.c: - valve: Remove superflous checking casts - -2010-09-30 16:13:23 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/valve/gstvalve.c: - valve: Fix style, improve comments - Minor improvements to the comments and break a few overly long lines - -2010-09-30 16:07:29 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - rtpmux: Improve documentation - Add an example pipeline, and try to explain a bit more what it does. - -2010-09-29 17:34:00 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: Do not wrongly fail when starting a capture - If the elements are in NULL/READY and changing state to - PAUSED/PLAYING while a capture is started - camerabin might not set the active_bin properly causing the - capture start to fail. - This patch fixes it by checking the current and pending state - of the branches instead of only the current one - -2010-09-29 10:13:06 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: reverse playback; cater for decoder delay - ... thereby actually using the gather and decode queues. - -2010-09-29 10:08:17 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: tweak output buffer timestamping - In particular, avoid packetised input leading to initial to non-0 output ts. - -2010-09-28 16:20:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - frei0r: Use static caps instead of converting strings to caps all the time - -2010-09-28 16:14:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - frei0r: Fix crashes if plugins don't provide correct property information - The vertigo plugin for example claims to have 3 properties but - the 3rd property does nothing and has a NULL name. - Fixes bug #630783. - Thanks to Martti Kühne for debugging this. - -2010-09-28 14:26:11 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/valve/gstvalve.c: - valve: move default: parst in the switch statement to the end - Now sure if it matters, but the previous form looks weired. - -2010-09-28 14:23:01 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/valve/gstvalve.c: - valve: move debug-category registration to type init - -2010-09-28 14:22:18 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/liveadder/liveadder.c: - liveadder: move debug-category registration to type init - -2010-09-28 14:17:45 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/liveadder/liveadder.c: - liveadder: GST_BOILERPLATE already sets parent_class - -2010-09-28 14:16:58 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/liveadder/liveadder.c: - liveadder: use base_init for pad_templates and element_details - -2010-09-28 14:15:57 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/liveadder/liveadder.c: - liveadder: use G_PARAM_STATIC_STRINGS on properties - -2010-09-28 14:15:13 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/valve/gstvalve.c: - valve: use G_PARAM_STATIC_STRINGS on properties - -2010-09-28 14:07:39 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/valve/gstvalve.c: - valve: GST_BOILERPLATE already sets parent_class - -2010-09-28 14:08:29 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/videomeasure/gstvideomeasure_collector.c: - videomeassure: GST_BOILERPLATE already sets parent_class - -2010-09-28 11:35:53 +0300 Hu Gang <gang.a.hu@intel.com> - - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - * gst/camerabin/gstcamerabin-enum.h: - photography: extend photography iface - Add more color tone modes and add NoseReduction settings. - Fixes #616814. - -2010-09-26 20:41:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/resindvd/resindvdsrc.c: - resindvdsrc: improve error messages on read erros - Provide i18n-ed error messages when a read error happens, - and point out that the error could be happening because the - DVD is scrambled. - https://bugzilla.gnome.org/show_bug.cgi?id=613633 - -2010-09-24 00:05:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: set plugin release datetime - -2010-09-25 12:33:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/ofa/gstofa.c: - ofa: Call g_object_notify() after the fingerprint was created - -2010-09-25 10:46:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rfilter.h: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rmixer.h: - * gst/frei0r/gstfrei0rsrc.c: - * gst/frei0r/gstfrei0rsrc.h: - frei0r: Fix scanning of plugin subdirectories and support different vendors - The frei0r spec specifies, that plugins can be in subdirectories inside - the main plugin directories to introduce new namespaces called vendors. - -2010-09-24 22:47:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/frei0r.h: - frei0r: Update frei0r interface specification to 1.2 - -2010-09-24 22:43:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - frei0r: Add support for the FREI0R_PATH environment variable - This was added in version 1.2 of the spec and replaces the default - list of directories. - -2010-09-23 14:15:08 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: initialize interval_ts and last_frames_* counters - Initialize interval_ts to first QOS event timestamp, otherwise the - fps statistics are printed always after one rendered frame. - Also, initialize last_frames_* counters, the values are bogus e.g. after - PLAYING-NULL-PLAYING state change. - -2010-09-24 13:29:55 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/rtpmux/gstrtpdtmfmux.c: - rtpdtmfmux: remove unused variable - -2010-09-24 13:25:22 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/rtpmux/gstrtpdtmfmux.c: - rtpdtmfmux: remove unused signal boilerplate - -2010-09-24 13:24:48 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: no need to ref pad in _chain() - -2010-09-22 23:41:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin/gst-camera.c: - camerabin: example: make gst-camera use flags - Enable all convertion flags in gst-camera example app - for safety. - Fixes #603063 - -2010-09-22 23:39:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/gstcamerabin-enum.c: - * gst/camerabin/gstcamerabin-enum.h: - camerabin: Adds new video-colorspace-flag to flags - Adds a new flag to allow a colorspace convertion before - the video encoder element. - Fixes #603063 - -2010-09-22 22:39:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/camerabingeneral.c: - * gst/camerabin/camerabinpreview.c: - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/gstcamerabin.c: - camerabin: Use link_full version for disabling hierarchy check - Disable hierarchy checks when linking because we are already - handling the element adding to bins and it should be done - correctly. - -2010-09-22 21:03:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/gstcamerabin.c: - camerabin: Set queues to silent - We currently don't use queues' signals, so set them - to silent. - -2010-09-22 11:57:28 -0700 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschrodec.c: - schrodec: Fix class definition - Class structures should include parent class, not the parent - instance structure. - -2010-09-22 16:41:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/pcapparse/gstpcapparse.c: - * gst/pcapparse/gstpcapparse.h: - pcapparse: fix weird caps code - Remove the weird (failing) code to figure out caps on the srcpad. - Add a caps property to decide what caps to put on the outgoing buffers. - Fix an event leak. - -2010-09-21 18:13:37 -0700 David Schleef <ds@schleef.org> - - * gst/colorspace/colorspace.c: - colorspace: quiet a GST_ERROR - -2010-09-21 19:07:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/sdp/gstsdpdemux.c: - * gst/sdp/gstsdpdemux.h: - sdpdemux: add property to disable redirect - Add a property to avoid redirection to the rtsp-sdp:// url but instead embeds an - rtspsrc element inside sdpdemux as the session manager. - Based on patch by Marco Ballesio. - Fixes #630046 - -2010-09-21 18:45:03 +0200 Edward Hervey <bilboed@bilboed.com> - - * ext/sdl/sdlvideosink.c: - sdlvideosink: Fix function prototype for touchy compilers - -2010-09-21 18:34:19 +0200 Edward Hervey <bilboed@bilboed.com> - - * common: - Automatic update of common submodule - From 080e025 to 5e3c9bf - -2010-09-21 16:31:07 +0200 Edward Hervey <bilboed@bilboed.com> - - * ext/sdl/sdlvideosink.c: - sdl: Port to new XOverlay API - Fixes #630253 - -2010-09-21 16:26:34 +0200 Edward Hervey <bilboed@bilboed.com> - - * sys/vdpau/gstvdpsink.c: - vdpau: Use the new XOverlay API - Fixes #630254 - -2010-09-21 10:59:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin/gst-camerabin-test.c: - camerabin: examples: do not use deprecated GstXOverlay functions - Replace the deprecated gst_x_overlay_set_xwindow_id with - gst_x_overlay_set_window_handle - Fixes #630255 - -2010-09-21 12:33:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Use -DGST_DISABLE_DEPRECATED again for GIT versions - -2010-09-21 12:29:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - dshowdecwrapper: Don't use GST_FLOW_IS_FATAL() - And don't error out on UNEXPECTED - -2010-09-21 12:27:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/spc/gstspc.c: - spc: Don't use GST_FLOW_IS_FATAL() - -2010-09-21 12:27:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/mplex/gstmplex.cc: - mplex: Don't use GST_FLOW_IS_SUCCESS() - -2010-08-27 19:17:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/icles/pitch-test.c: - pitch-test: Don't use deprecated GstController API - -2010-08-27 19:00:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/timidity/gsttimidity.c: - timidity: Don't post an error message on the bus for UNEXPECTED - Also don't use GST_FLOW_IS_FATAL() - -2010-08-27 19:00:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - wildmidi: Don't use GST_FLOW_IS_FATAL() - -2010-08-27 18:58:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/gme/gstgme.c: - gme: Post an error message on the bus for fatal errors - Also don't use GST_FLOW_IS_FATAL(). - -2010-08-27 18:56:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/sndfile/gstsfsink.c: - sfsink: Don't use GST_FLOW_IS_FATAL() - -2010-08-27 18:52:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/tta/gstttaparse.c: - ttaparse: Don't post an error message on UNEXPECTED - Also don't use GST_FLOW_IS_FATAL() - -2010-08-27 18:51:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: Don't use GST_FLOW_IS_SUCCESS() - -2010-08-27 18:51:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/rawparse/gstrawparse.c: - rawparse: Don't use GST_FLOW_IS_FATAL() - -2010-08-27 18:50:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/nuvdemux/gstnuvdemux.c: - nuvdemux: Don't use GST_FLOW_IS_FATAL() - And don't post an error message for WRONG_STATE or UNEXPECTED. - -2010-08-27 18:49:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/nsf/gstnsf.c: - * gst/nsf/nes_apu.c: - nsf: Don't use GST_FLOW_IS_FATAL() - -2010-08-27 18:48:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfdemux.c: - mxfdemux: Don't use GST_FLOW_IS_FATAL() - -2010-08-27 18:47:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mve/gstmvedemux.c: - * gst/mve/gstmvedemux.h: - mvedemux: Add proper flow return aggregation - NOT_LINKED should only be returned if all streams returned NOT_LINKED. - -2010-08-27 18:41:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/mpegtsparse.c: - mpegdemux: Don't use GST_FLOW_IS_FATAL() - And fix some minor issues related to its usage. - -2010-08-27 18:36:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Don't use GST_FLOW_IS_FATAL() - -2010-08-27 18:35:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: Don't use GST_FLOW_IS_FATAL() - Also don't post an error message for UNEXPECTED and do it - for NOT_LINKED. - -2010-08-27 18:33:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/asfmux/gstasfparse.c: - asfparse: Don't use GST_FLOW_IS_FATAL() - Also don't push EOS downstream on WRONG_STATE, it will be dropped anyway. - -2010-08-27 18:32:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: Don't use GST_FLOW_IS_SUCCESS() - -2010-08-27 18:32:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/aiff/aiffparse.c: - aiffparse: Don't use GST_FLOW_IS_FATAL() - -2010-09-20 21:46:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: Mention photography interface in docs - Add a note to docs about getting the videosource and accessing - its photography interface (in case it has it) - Fixes #616923 - -2010-08-25 14:04:59 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: Adds missing variable initialization - Adds missing app_src_vid initialization - -2010-08-26 15:33:59 +0300 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: check state change to playing for imagebin and videobin - Properly check and handle error cases related to imagebin and - videobin state changes. - -2010-06-28 21:48:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/camerabinimage.c: - camerabin: Remove useless src template pad - camerabin imagebin doesn't need a src template pad. - -2010-06-21 09:34:43 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/camerabinpreview.c: - * gst/camerabin/camerabinpreview.h: - * gst/camerabin/gstcamerabin.c: - camerabin: Forward tag events to preview pipeline - Forward tag events from image pipeline to preview pipeline so - that preview elements can use capture tags information - -2010-06-21 16:17:24 +0300 Hoseok Chang <hoseok.chang@nokia.com> - - * gst/camerabin/camerabinpreview.c: - * gst/camerabin/camerabinpreview.h: - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: add "preview-source-filter" property - Adds 'preview-source-filter' for adding an element to proccess - the preview images before posting them to the bus. - -2010-05-25 15:39:43 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * tests/examples/camerabin/gst-camerabin-test.c: - camerabin: update tag names in test application to latest gst definitions - -2010-05-17 13:44:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: Make block-after-capture resetting more consistent - Adds another boolean to help controlling viewfinder blocking, - making it possible for the applications to reset the viewfinder - blocking after capture was started but before the blocking - actually happens. - -2010-05-12 21:11:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: Unblock the viewfinder when going to READY - Unblock the viewfinder when going to ready to avoid - blocking when setting camerabin to playing again and - attemping to capture. Keep the property as is. - -2010-09-20 17:19:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: add monitoring and support for photoiface zoom for video-source - Makes camerabin aware of changes in its videosource zoom property. - -2010-09-20 16:22:30 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - * tests/check/elements/camerabin.c: - * tests/examples/camerabin/gst-camerabin-test.c: - camerabin: Change zoom property from int to float - Updates zoom property for a more natural type and - makes it consistent with the photography API - -2010-09-19 18:51:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - photography: Add zoom property - Adds a property to set/get the zoom as a float - -2010-06-08 10:04:52 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: remove caching photography interface settings - Camerabin doesn't implement photography interface, so we - don't need caching the video source properties anymore. - -2010-04-22 17:46:59 +0300 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * tests/examples/camerabin/Makefile.am: - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin/gst-camerabin-test.c: - examples: camerabin: use photoiface properties through video-source - Fixes #616923 - -2010-04-22 14:03:34 +0300 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * tests/check/elements/camerabin.c: - tests: camerabin: remove photoiface property/settings tests - Fixes #616923 - -2010-08-31 18:06:15 -0300 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * gst/camerabin/Makefile.am: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabinphotography.c: - * gst/camerabin/gstcamerabinphotography.h: - camerabin: remove photography interface implementation from camerabin - Remove notify signal proxy for video-source. Application can use - video-source directly from now on to get notified of property changes. - Add monitoring scene-mode property change to select lowest possible - framerate for video capture when night mode is selected. - Fixes #616923 - -2010-04-29 12:44:29 +0300 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * tests/examples/camerabin/gst-camerabin-test.c: - examples: camerabin: add --no-xwindow option and fix option handling - Add --no-xwindow option to not to create xwindow. Also fix zoom and - mute option types and filename string handling. - -2010-04-29 13:24:18 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - photography: Add image-preview-supported-caps interface property - Adds a readable property to gstphotography interface to query - what are the allowed preview caps supported. - Patch by Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - -2010-09-20 12:34:06 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideoutils.h: - basevideo: Remove unused code - -2010-09-20 11:26:59 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideo: Remove check for old -base - -2010-09-19 19:33:40 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - * gst-libs/gst/video/gstbasevideoutils.h: - basevideo: Add handling of GstForceKeyUnit events - -2010-09-18 19:25:49 -0700 David Schleef <ds@schleef.org> - - * gst/invtelecine/gstinvtelecine.c: - invtelecine: Fix name of 30p/60i pattern - -2010-09-18 19:21:47 -0700 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschrodec.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: add capture pattern handling - Move typical scan_for_sync() usage into base class, which just - calls gst_adapter_masked_scan_uint32(). - -2010-09-18 19:14:36 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: Don't blow away field information - Also, set field flags correctly. - -2010-09-18 17:28:48 -0700 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschrodec.c: - * ext/vp8/gstvp8dec.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - * gst-libs/gst/video/gstbasevideoutils.h: - basevideo: Move deadline to frame structure - -2010-09-18 14:57:32 -0700 David Schleef <ds@schleef.org> - - * gst/interlace/gstinterlace.c: - interlace: Add allow-rff property. Fix timestamping - -2010-09-18 13:32:07 -0700 David Schleef <ds@schleef.org> - - * gst/interlace/gstinterlace.c: - interlace: merge telecine into normal operation - -2010-09-08 15:08:50 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlace: Add telecine support - -2010-09-17 08:43:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/cog/Makefile.am: - * ext/cog/cogvirtframe.c: - * ext/cog/gstcog.c: - * ext/cog/gstcogmse.c: - cog: Allow compilation without orc - Also don't ignore --disable-orc. Fixes bug #629897. - -2010-09-14 16:17:47 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin.c: - camerabin: Adds a new test to check sequential capture of images - Adds a new test case that shoots a sequence of image capture - and check that the files are valid. - Also adds taglist checking capabilities to tests. - -2010-09-15 17:54:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - qtmux: Follow xmp serialization guidelines closer - qt and isom variants have different ways of serializing - xmp, follow these guidelines. - Those can be found in Adobe's xmp docs. - -2010-09-15 21:47:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/colorspace/gstcolorspaceorc-dist.c: - * gst/colorspace/gstcolorspaceorc-dist.h: - colorspace: add orc-dist files - Should fix build without orc or too old orc. - -2010-09-15 17:51:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/debugutils/gstchecksumsink.h: - checksumsink: fix up copyright in header file - -2010-09-12 14:59:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * pkgconfig/gstreamer-libs-uninstalled.pc.in: - * pkgconfig/gstreamer-libs.pc.in: - * pkgconfig/gstreamer-plugins-uninstalled.pc.in: - * pkgconfig/gstreamer-plugins.pc.in: - pkgconfig: remove some old unused files from 0.8 days - -2010-09-15 18:38:03 +0300 Stefan Kost <ensonic@users.sf.net> - - * Makefile.am: - metadata: add removed files to cruft vars - -2010-09-15 18:13:55 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/check/elements/jifmux.c: - tests: add missing stdio include - -2010-09-15 18:10:33 +0300 Stefan Kost <ensonic@users.sf.net> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-metadata.xml: - * ext/Makefile.am: - * ext/metadata/.gitignore: - * ext/metadata/Makefile.am: - * ext/metadata/README: - * ext/metadata/TODO: - * ext/metadata/gstbasemetadata.c: - * ext/metadata/gstbasemetadata.h: - * ext/metadata/gstmetadata.c: - * ext/metadata/gstmetadatademux.c: - * ext/metadata/gstmetadatademux.h: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadatamux.h: - * ext/metadata/metadata.c: - * ext/metadata/metadata.h: - * ext/metadata/metadata_mapping.htm: - * ext/metadata/metadataexif.c: - * ext/metadata/metadataexif.h: - * ext/metadata/metadataiptc.c: - * ext/metadata/metadataiptc.h: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadatamuxjpeg.h: - * ext/metadata/metadatamuxpng.c: - * ext/metadata/metadatamuxpng.h: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsejpeg.h: - * ext/metadata/metadataparsepng.c: - * ext/metadata/metadataparsepng.h: - * ext/metadata/metadataparseutil.c: - * ext/metadata/metadataparseutil.h: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - * ext/metadata/metadatatypes.c: - * ext/metadata/metadatatypes.h: - * ext/metadata/metadataxmp.c: - * ext/metadata/metadataxmp.h: - * tests/check/Makefile.am: - * tests/check/pipelines/.gitignore: - * tests/check/pipelines/metadata.c: - * tests/icles/Makefile.am: - metadata: remove metadata plugin - This plugins functionality is replaced by utility libraries in base for exif - and xmp. Jpeg images can use this via jpegformat plugin. - Fixes #486659 - -2010-09-14 11:28:56 -0700 David Schleef <ds@schleef.org> - - * gst/bayer/gstbayer2rgb.c: - bayer2rgb: Add format=bggr/etc. to caps - -2010-09-13 18:49:43 -0700 David Schleef <ds@schleef.org> - - * gst/colorspace/Makefile.am: - * gst/colorspace/colorspace.c: - * gst/colorspace/colorspace.h: - * gst/colorspace/gstcolorspace.c: - * gst/colorspace/gstcolorspace.h: - * gst/colorspace/gstcolorspaceorc.orc: - colorspace: Add conversion code - Work in progress. Colorspace handles most format conversion using - 3-stage getline/matrix/putline process using an AYUV or ARGB - intermediate, with most functions handled by Orc. There is also - a table of single-pass conversions, all handled by Orc. The plan - is to add optional stages for various chroma upsampling/downsampling - algorithms, dithering, and float/int16 intermediates, and then have - Orc create multi-stage functions at runtime. - -2010-09-13 12:48:50 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/colorspace/Makefile.am: - * gst/colorspace/gstcolorspace.c: - * gst/colorspace/gstcolorspace.h: - * gst/colorspace/gstcolorspaceorc.orc: - * gst/colorspace/yuv2rgb.c: - * gst/colorspace/yuv2rgb.h: - colorspace: Revive element - Now based on Orc. - -2010-09-09 14:49:06 -0400 Tristan Matthews <le.businessman@gmail.com> - - * ext/jack/Makefile.am: - * ext/jack/gstjackaudiosink.c: - * ext/jack/gstjackaudiosrc.c: - jack: added translatable text for server not found error - -2010-08-09 14:32:57 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/celt/gstceltenc.c: - celtenc: Change bitrate to bits/sec - -2010-09-10 13:36:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - jifmux: Reset tags when going to READY - Reset the tagsetter tags when going to READY state - -2010-09-10 13:33:16 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - jpegformat: Fix element description - Use saner categories for jifmux/jpegparse elements - -2010-09-10 11:31:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: Set tags to more elements - Remove check for 'Muxer' category when setting tags - for tagsetters. Set them to all tagsetters in the - pipelines. - -2010-09-10 18:35:27 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: redirect SDP with an rtsp control URL - When we find an SDP with an rtsp:// url as the global control attribute or when - all streams have an rtsp:// control attribute, post an redirect message with an - rtsp-sdp:// url containing the SDP. - Fixes #628214 - -2010-09-10 10:29:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/gstfisheye.c: - * gst/geometrictransform/gsttunnel.c: - geometrictransform: Fix build with debugging disabled - Add some ifdefs to prevent build failures due to unused - variables - -2010-09-09 23:59:17 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/check/Makefile.am: - * tests/check/generic/states.c: - tests: allow running state tests for all elements - Now one can use GST_NO_STATE_IGNORE_ELEMENTS=1 make generic/states.check - to try elements that would normaly be skipped. - -2010-09-09 17:18:06 +0200 Edward Hervey <bilboed@bilboed.com> - - * configure.ac: - configure.ac: Remove dependency on libswscale - It's not used in the gst opencv plugin. - -2010-09-09 15:03:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * ext/opencv/Makefile.am: - opencv: define CV_NO_BACKWARD_COMPATIBILITY to suppress warnings caused by compat header - Compile with -DCV_NO_BACKWARD_COMPATIBILITY for now, so that the compat header - doesn't get included, which causes compiler warnings that (it seems) can't be - switched off easily. As a result, we also specify a max. version in configure, - so the build doesn't break if our code doesn't compile against newer opencv - versions any more with that flag. - -2010-09-09 11:07:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/opencv/Makefile.am: - opencv: avoid 'unused' compiler warnings with inline functions in opencv headers - Override CV_INLINE to avoid 'unused' gcc warnings. GLib will take care of defining - 'inline' sufficiently and OpenCV's define isn't good enough to avoid 'unused' - compiler warnings (at least in version 2.1.0). - -2010-09-09 10:27:49 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/opencv/gstopencv.c: - opencv: update plugin source package name and origin - -2010-09-08 23:59:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstfacedetect.h: - facedetect: Add more parameters - Expose the parameters of cvHaarDetectObjects in facedetect - element. - -2010-09-08 14:59:54 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/Makefile.am: - * ext/opencv/basicfilters/Makefile.am: - * ext/opencv/edgedetect/Makefile.am: - * ext/opencv/faceblur/Makefile.am: - * ext/opencv/facedetect/Makefile.am: - * ext/opencv/gstcvdilate.c: - * ext/opencv/gstcvdilate.h: - * ext/opencv/gstcvdilateerode.c: - * ext/opencv/gstcvdilateerode.h: - * ext/opencv/gstcvequalizehist.c: - * ext/opencv/gstcvequalizehist.h: - * ext/opencv/gstcverode.c: - * ext/opencv/gstcverode.h: - * ext/opencv/gstcvlaplace.c: - * ext/opencv/gstcvlaplace.h: - * ext/opencv/gstcvsmooth.c: - * ext/opencv/gstcvsmooth.h: - * ext/opencv/gstcvsobel.c: - * ext/opencv/gstcvsobel.h: - * ext/opencv/gstedgedetect.c: - * ext/opencv/gstedgedetect.h: - * ext/opencv/gstfaceblur.c: - * ext/opencv/gstfaceblur.h: - * ext/opencv/gstfacedetect.c: - * ext/opencv/gstfacedetect.h: - * ext/opencv/gstopencvutils.c: - * ext/opencv/gstpyramidsegment.c: - * ext/opencv/gstpyramidsegment.h: - * ext/opencv/gsttemplatematch.c: - * ext/opencv/gsttemplatematch.h: - * ext/opencv/gsttextwrite.c: - * ext/opencv/gsttextwrite.h: - * ext/opencv/pyramidsegment/Makefile.am: - * ext/opencv/templatematch/Makefile.am: - * ext/opencv/textwrite/Makefile.am: - opencv: Refactor files structure - Remove internal folders and put all code inside the main plugin - folder. Also fixes some building warnings. - -2010-09-08 00:08:44 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-opencv.xml: - * ext/Makefile.am: - * ext/opencv/Makefile.am: - opencv: Adds new plugin opencv - Moves opencv plugin from http://github.com/Elleo/gst-opencv - into -bad module. - -2010-09-05 23:09:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/facedetect/gstfacedetect.c: - facedetect: Post an useful message - Add a message to be post when faces are found on a frame that - contains all faces on a single message and also has - timestamp/running/segment times for that buffer so it - can be identified. - This message is called 'facedetect' and has a 'faces' list - of structures with all faces. - The old 'face' message is still posted for each face found, but - it is not really useful as it doesn't have any reference to the - buffer that generated it. - -2010-09-05 17:53:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/facedetect/Makefile.am: - * ext/opencv/facedetect/gstfacedetect.c: - * ext/opencv/facedetect/gstfacedetect.h: - facedetect: Use GstOpencvVideoFilter as the base class - Port facedetect to use GstOpencvVideoFilter as the base class - to inherit all the goodness that GstBaseTransform/GstVideoFilter - already handles. - -2010-09-03 20:27:31 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/Makefile.am: - * ext/opencv/basicfilters/Makefile.am: - * ext/opencv/basicfilters/gstcvdilate.c: - * ext/opencv/basicfilters/gstcvdilateerode.c: - * ext/opencv/basicfilters/gstcvdilateerode.h: - * ext/opencv/basicfilters/gstcvequalizehist.c: - * ext/opencv/basicfilters/gstcvequalizehist.h: - * ext/opencv/basicfilters/gstcverode.c: - * ext/opencv/basicfilters/gstcvlaplace.c: - * ext/opencv/basicfilters/gstcvlaplace.h: - * ext/opencv/basicfilters/gstcvsmooth.c: - * ext/opencv/basicfilters/gstcvsmooth.h: - * ext/opencv/basicfilters/gstcvsobel.c: - * ext/opencv/basicfilters/gstcvsobel.h: - * ext/opencv/gstopencvvideofilter.c: - * ext/opencv/gstopencvvideofilter.h: - opencvbasetrans: Use GstVideoFilter as the base class - Port from GstBaseTransform to GstVideoFilter as the base class. - -2010-05-24 19:28:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/basicfilters/Makefile.am: - * ext/opencv/basicfilters/gstcvlaplace.c: - * ext/opencv/basicfilters/gstcvlaplace.h: - * ext/opencv/gstopencv.c: - * ext/opencv/gstopencvbasetrans.c: - * ext/opencv/gstopencvbasetrans.h: - cvlaplace: adds new cvlaplace element - Adds new cvlaplace element. - Also adds a new opencvbasetransform function to be overriden - by children classes: the cv_set_caps, it allows children classes - to know what are they going to handle and prepare properly. - -2010-05-19 20:11:39 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/basicfilters/Makefile.am: - * ext/opencv/basicfilters/gstcvsobel.c: - * ext/opencv/basicfilters/gstcvsobel.h: - * ext/opencv/gstopencv.c: - * ext/opencv/gstopencvutils.c: - Adds new element cvsobel - -2010-05-17 19:04:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/basicfilters/Makefile.am: - * ext/opencv/basicfilters/gstcvequalizehist.c: - * ext/opencv/basicfilters/gstcvequalizehist.h: - * ext/opencv/gstopencv.c: - Adds new element cvequalizehist - -2010-05-16 19:14:54 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/basicfilters/Makefile.am: - * ext/opencv/basicfilters/gstcvdilate.c: - * ext/opencv/basicfilters/gstcvdilate.h: - * ext/opencv/basicfilters/gstcvdilateerode.c: - * ext/opencv/basicfilters/gstcvdilateerode.h: - * ext/opencv/basicfilters/gstcverode.c: - * ext/opencv/basicfilters/gstcverode.h: - * ext/opencv/gstopencv.c: - Adds new elements cvdilate and cverode - Adds 2 similar elements (so similar they have their own baseclass), - cvdilate and cverode. - -2010-05-16 17:03:51 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/basicfilters/gstcvsmooth.c: - * ext/opencv/gstopencvbasetrans.c: - cvsmooth: Improve parameters docs - -2010-05-16 16:37:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/basicfilters/gstcvsmooth.c: - cvsmooth: Deactivating blur-no-scale - Deactivate blur-no-scale because basetransform doesn't provide a way - to override getcaps for pads, always using templatecaps independent - of properties. - -2010-05-16 11:42:08 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/basicfilters/gstcvsmooth.c: - * ext/opencv/gstopencvbasetrans.c: - * ext/opencv/gstopencvutils.c: - * ext/opencv/gstopencvutils.h: - cvsmooth: Add support for video/x-raw-gray - -2010-05-16 00:46:01 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/Makefile.am: - * ext/opencv/gstopencvbasetrans.c: - * ext/opencv/gstopencvutils.c: - * ext/opencv/gstopencvutils.h: - Adding gstopencvutils - Adds a file to keep utilitary functions together - -2010-05-11 20:11:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/Makefile.am: - * ext/opencv/basicfilters/gstcvsmooth.c: - * ext/opencv/basicfilters/gstcvsmooth.h: - * ext/opencv/gstopencv.c: - cvsmooth: Adds new element cvsmooth - Adds new cvsmooth element - -2010-05-05 01:24:54 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/Makefile.am: - * ext/opencv/basicfilters/Makefile.am: - * ext/opencv/gstopencvbasetrans.c: - * ext/opencv/gstopencvbasetrans.h: - gstopencvbasetrans: Adds this new base class - Adds GstOpencvBaseTransform as base class for simple 1:1 - opencv filters - -2010-04-26 17:18:54 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/pyramidsegment/gstpyramidsegment.c: - pyramidsegment: Allocate a new buffer for output - Use a newly allocated buffer for output, and release the intermediary - image used. - Also add a TODO for performance improvement - -2010-04-26 17:34:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/faceblur/gstfaceblur.c: - * ext/opencv/facedetect/gstfacedetect.c: - * ext/opencv/templatematch/gsttemplatematch.c: - * ext/opencv/textwrite/gsttextwrite.c: - faceblur: facedetect: templatematch: textwrite: Set buffer to writable - These elements operates in place, set buffer to writable before - operating. - -2010-04-26 16:17:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/edgedetect/gstedgedetect.c: - edgedetect: Fix chain buffer handling - Allocate a new output buffer instead of using the input buffer - pointing to the internal cvCEdge opencv's IplImage data, which - might change, consequently changing the buffer. - -2010-04-25 16:27:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/opencv/edgedetect/gstedgedetect.c: - * ext/opencv/faceblur/gstfaceblur.c: - * ext/opencv/facedetect/gstfacedetect.c: - * ext/opencv/pyramidsegment/gstpyramidsegment.c: - * ext/opencv/templatematch/gsttemplatematch.c: - * ext/opencv/textwrite/gsttextwrite.c: - configure: enable -Werror to improve code - -Werror on git version is useful to keep code clean. - -2010-03-02 13:55:05 +0530 Sreerenj Balachandran <bsreerenj@gmailcom> - - * ext/opencv/textwrite/gsttextwrite.c: - * ext/opencv/textwrite/gsttextwrite.h: - Added the property for setting the RGB colours. modified: ext/opencv/textwrite/gsttextwrite.c modified: ext/opencv/textwrite/gsttextwrite.h - -2010-03-02 13:18:19 +0530 Sreerenj Balachandran <bsreerenj@gmailcom> - - * ext/opencv/textwrite/gsttextwrite.c: - * ext/opencv/textwrite/gsttextwrite.h: - Added the property for setting the "thickness" of font modified: ext/opencv/textwrite/gsttextwrite.c modified: ext/opencv/textwrite/gsttextwrite.h - -2010-03-02 12:45:58 +0530 Sreerenj Balachandran <bsreerenj@gmailcom> - - * ext/opencv/textwrite/gsttextwrite.c: - * ext/opencv/textwrite/gsttextwrite.h: - Added the property for setting x and y co-ordinates modified: ext/opencv/textwrite/gsttextwrite.c modified: ext/opencv/textwrite/gsttextwrite.h - -2010-03-02 12:41:25 +0530 Sreerenj Balachandran <bsreerenj@gmailcom> - - * ext/opencv/textwrite/gsttextwrite.c: - * ext/opencv/textwrite/gsttextwrite.h: - added the propery for setting x and y co-ordinates modified: ext/opencv/textwrite/gsttextwrite.c modified: ext/opencv/textwrite/gsttextwrite.h - -2010-02-28 14:36:35 +0000 Mike Sheldon <mike@mikeasoft.com> - - * ext/opencv/facedetect/gstfacedetect.c: - Apply Stefan's faceblur fixes to facedetect - -2010-02-28 14:32:00 +0000 Sreerenj Balachandran <bsreerenj@gmail.com> - - * ext/opencv/Makefile.am: - * ext/opencv/gstopencv.c: - * ext/opencv/textwrite/Makefile.am: - * ext/opencv/textwrite/gsttextwrite.c: - * ext/opencv/textwrite/gsttextwrite.h: - Add simple text overlay plugin - -2010-02-19 22:50:18 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/opencv/faceblur/gstfaceblur.c: - faceblur: fix handling of profile property. - Dup and free the string. Fixes leaking new values and avoids crashing - gst-inspect. - -2009-12-18 11:23:59 +0000 Mike Sheldon <mike@mikeasoft.com> - - * ext/opencv/templatematch/gsttemplatematch.h: - Fix includes in template matching element - -2009-05-26 12:59:04 +0100 Mike Sheldon <mike@mikeasoft.com> - - * ext/opencv/edgedetect/gstedgedetect.c: - * ext/opencv/edgedetect/gstedgedetect.h: - * ext/opencv/faceblur/gstfaceblur.c: - * ext/opencv/faceblur/gstfaceblur.h: - * ext/opencv/facedetect/gstfacedetect.c: - * ext/opencv/facedetect/gstfacedetect.h: - * ext/opencv/gstopencv.c: - * ext/opencv/pyramidsegment/gstpyramidsegment.c: - * ext/opencv/pyramidsegment/gstpyramidsegment.h: - * ext/opencv/templatematch/gsttemplatematch.c: - * ext/opencv/templatematch/gsttemplatematch.h: - Bring code in to line with general Gstreamer standards - -2009-05-25 12:57:11 +0100 Mike Sheldon <mike@mikeasoft.com> - - * ext/opencv/templatematch/gsttemplatematch.c: - Fix segfault in template match element if no template has been set Add template matching python example Add autotool, libtool and pkgconfig dependencies to debian control file - -2009-05-25 11:26:28 +0100 Mike Sheldon <mike@mikeasoft.com> - - * ext/opencv/Makefile.am: - * ext/opencv/faceblur/Makefile.am: - * ext/opencv/faceblur/gstfaceblur.c: - * ext/opencv/faceblur/gstfaceblur.h: - * ext/opencv/gstopencv.c: - Add a plugin for automatically blurring faces in videos and images - -2009-05-13 12:19:43 +0300 Noam <noam@duapov.(none)> - - * ext/opencv/templatematch/gsttemplatematch.c: - * ext/opencv/templatematch/gsttemplatematch.h: - Added control for changing method - -2009-05-13 11:55:31 +0300 Noam <noam@duapov.(none)> - - * ext/opencv/Makefile.am: - * ext/opencv/gstopencv.c: - * ext/opencv/templatematch/Makefile.am: - * ext/opencv/templatematch/gsttemplatematch.c: - * ext/opencv/templatematch/gsttemplatematch.h: - Added templatematch element - -2009-05-08 11:55:20 +0530 kapil <kapil@kapil-laptop.(none)> - - * ext/opencv/Makefile.am: - * ext/opencv/edgedetect/Makefile.am: - * ext/opencv/edgedetect/gstedgedetect.c: - * ext/opencv/edgedetect/gstedgedetect.h: - * ext/opencv/facedetect/Makefile.am: - * ext/opencv/facedetect/gstfacedetect.c: - * ext/opencv/facedetect/gstfacedetect.h: - * ext/opencv/gstopencv.c: - * ext/opencv/pyramidsegment/Makefile.am: - * ext/opencv/pyramidsegment/gstpyramidsegment.c: - * ext/opencv/pyramidsegment/gstpyramidsegment.h: - Registering all elements under opencv plugin - -2009-05-06 15:49:42 +0100 Mike Sheldon <mike@mikeasoft.com> - - * ext/opencv/facedetect/gstfacedetect.c: - Fix the profile parameter in the facedetect element to accept a string correctly - -2009-05-06 15:33:48 +0100 Mike Sheldon <mike@mikeasoft.com> - - * ext/opencv/edgedetect/gstedgedetect.c: - * ext/opencv/facedetect/gstfacedetect.c: - * ext/opencv/pyramidsegment/gstpyramidsegment.c: - Release OpenCV images when finalizing elements - -2009-05-06 16:38:15 +0530 kapil <kapil@kapil-laptop.(none)> - - * ext/opencv/edgedetect/gstedgedetect.h: - * ext/opencv/facedetect/gstfacedetect.h: - * ext/opencv/pyramidsegment/gstpyramidsegment.h: - Fixed compile errors - -2009-04-20 18:40:13 +0300 Mike Sheldon <mike@mikeasoft.com> - - * ext/opencv/facedetect/gstfacedetect.c: - Make face detect send a bus message when a face is detected Write a simple python example for face detection - -2009-04-18 23:43:37 +0300 Mike Sheldon <mike@mikeasoft.com> - - * ext/opencv/Makefile.am: - * ext/opencv/edgedetect/gstedgedetect.c: - * ext/opencv/edgedetect/gstedgedetect.h: - * ext/opencv/facedetect/Makefile.am: - * ext/opencv/facedetect/gstfacedetect.c: - * ext/opencv/facedetect/gstfacedetect.h: - * ext/opencv/pyramidsegment/gstpyramidsegment.c: - * ext/opencv/pyramidsegment/gstpyramidsegment.h: - Add face detection element Clean up some generated files Update a few old comments - -2008-12-18 23:48:40 +0000 Mike Sheldon <mike@mikeasoft.com> - - * ext/opencv/Makefile: - * ext/opencv/Makefile.in: - * ext/opencv/edgedetect/Makefile: - * ext/opencv/edgedetect/Makefile.in: - * ext/opencv/pyramidsegment/Makefile: - * ext/opencv/pyramidsegment/Makefile.in: - * Remove some autotools generated files - -2008-12-18 23:43:36 +0000 Mike Sheldon <mike@mikeasoft.com> - - * ext/opencv/Makefile: - * ext/opencv/Makefile.am: - * ext/opencv/Makefile.in: - * ext/opencv/edgedetect/Makefile: - * ext/opencv/edgedetect/Makefile.am: - * ext/opencv/edgedetect/Makefile.in: - * ext/opencv/edgedetect/gstedgedetect.c: - * ext/opencv/edgedetect/gstedgedetect.h: - * ext/opencv/pyramidsegment/Makefile: - * ext/opencv/pyramidsegment/Makefile.am: - * ext/opencv/pyramidsegment/Makefile.in: - * ext/opencv/pyramidsegment/gstpyramidsegment.c: - * ext/opencv/pyramidsegment/gstpyramidsegment.h: - * Make it possible to set threshold2 at runtime * Implement pyramid segmentation element * Make masking optional on edgedetect * Clean up edgedetect, add element details * Implemented edge detect element - -2010-09-08 16:57:57 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/id3tag/id3tag.c: - id3mux: Map GST_TAG_ALBUM_ARTIST - Map GST_TAG_ALBUM_ARTIST to TPE2 as it is done in - -base id3tag mappings. - -2010-08-09 00:15:03 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - * configure.ac: - * tests/check/Makefile.am: - Use AG_GST_CHECK_GST_PLUGINS_{GOOD,UGLY,BAD,FFMPEG} macros from common - to find plugin directories for the various modules our unit tests depend - on in an uninstalled environment. This makes sure these plugins are found - even when distchecking (which happens from a subdirectory, which means - that the currently used trick to find the uninstalled directories of - these modules doesn't work in that case). - -2010-09-07 19:16:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - docs: update plugin docs sgml file a bit - -2010-09-07 15:22:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * docs/plugins/.gitignore: - docs: add 2 new files to gitignore - Adds gst-plugins-bad-plugins.args.new and - gst-plugins-bad-plugins.signals.new to .gitignore - -2010-09-07 14:45:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - jifmux: Make it more colorspace smart - This makes it able to recombine rgb images, making it possible - to add tags to rgb jpegs as well. - Uses a simple strategy to check what are the possible colorspaces - and avoid adding jfif to ones that aren't YUV/Gray. - -2010-09-07 10:26:29 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/jifmux.c: - tests: jifmux: Adds tests for new ppi tags - Adds tests to check if libexif can read our - EXIF_TAG_X/Y_RESOLUTION tags. - -2010-09-07 13:28:20 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * gst/interlace/gstinterlace.c: - interlace: Fix element details - -2010-09-07 11:42:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From c2e10bf to aa0d1d0 - -2010-09-07 11:34:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-interlace.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - docs: update plugin introspection data for recent changes - -2010-09-07 11:28:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-amrwb.xml: - * docs/plugins/inspect/plugin-dvbsrc.xml: - * docs/plugins/inspect/plugin-flacparse.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-mpegtsparse.xml: - * docs/plugins/inspect/plugin-x264.xml: - docs: remove introspection files for plugins that have been merged, moved or renamed - The aacparse, amrparse, flacparse plugins have been merged into the audioparsersbad - plugin. The aiffparse plugin has been renamed to aiff since it also contains an - aiff muxer now. The amrwb plugin has been renamed to amrwbenc. The dvbsrc plugin - has been renamed to dvb. The gstrtpmanager plugin has moved to -good. The x264 - plugin has moved to -ugly. And the mpegtsparse plugin has been merged into the - mpegdemux2 plugin. - -2010-09-07 00:16:00 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * .gitignore: - * tests/examples/Makefile.am: - tests: fix distcheck by disting new jack example directory - Also add test binary to ignores. - -2010-09-06 17:17:54 -0400 Tristan Matthews <le.businessman@gmail.com> - - * configure.ac: - * tests/examples/Makefile.am: - * tests/examples/jack/Makefile.am: - * tests/examples/jack/jack_client.c: - examples: add test to demonstrate jack_client_t usage - -2010-09-06 16:11:31 -0400 Tristan Matthews <le.businessman@gmail.com> - - * ext/jack/gstjack.c: - * ext/jack/gstjack.h: - * ext/jack/gstjackaudioclient.c: - * ext/jack/gstjackaudioclient.h: - * ext/jack/gstjackaudiosink.c: - * ext/jack/gstjackaudiosink.h: - * ext/jack/gstjackaudiosrc.c: - * ext/jack/gstjackaudiosrc.h: - jack: added client property - -2010-06-17 16:26:07 -0400 Tristan Matthews <tristan@sat.qc.ca> - - * ext/jack/gstjackbin.c: - jack: removed unused file gstjackbin.c - This is a 0.8 leftover. - -2010-09-06 14:12:00 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: non-TIME seek event is simply not handled - -2010-09-06 09:28:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * configure.ac: - configure: Bump -core/-base requirements to 0.10.30.1 - We need 0.10.30.1 to have latest tags in core/base for jifmux - tests. - -2010-08-26 02:54:55 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/dtmf/gstdtmfsrc.c: - dtmfsrc: Make the dtmfsrc accept events sent with gst_element_send_event - The doc says to use gst_element_send_event on the pipeline, but if - we are to call it on the element itself, it's a noop. This should make it - handle the event properly before delegating it to basesrc. - -2010-09-05 16:30:05 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - vdpauvideopostprocess: set new framerate on output caps instead of input caps - It's not allowed to change the caps provided by the setcaps function. - https://bugzilla.gnome.org/show_bug.cgi?id=628326 - -2010-09-06 03:23:26 -0700 David Schleef <ds@schleef.org> - - * tools/element-maker: - element-maker: Take parameters on command line - Now it's actually useful. - -2010-09-06 03:04:13 -0700 David Schleef <ds@schleef.org> - - * gst/interlace/gstinterlace.c: - interlace: Add documentation - -2010-09-06 10:29:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplay: Use G_GUINT64_FORMAT instead of %llu - Fixes compiler warnings on 64 bit architectures. - -2010-09-06 11:03:07 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/selector/gstinputselector.c: - inputselector: sync with copy in -base - Use _get_caps_reffed to avoid copies. - -2010-08-24 11:50:47 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/selector/gstoutputselector.c: - outputselector: move the debug init to the boilerplate macro - -2010-08-24 11:50:09 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/selector/gstinputselector.c: - inputselector: use GST_BOILERPLATE macro - -2010-08-24 11:26:52 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/fpsdisplaysink.h: - fpsdisplaysink: don't add a g_mainloop dependency - Just update the fps-message from the probe handler. - -2010-08-18 11:35:44 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: small cleanup - Add one one example and lower the fon't size for the overlay. - -2010-08-23 09:51:25 -0500 Rob Clark <rob@ti.com> - - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/fpsdisplaysink.h: - fpsdisplaysink: measure fps in terms of wall clock time - Measure fps in terms of system clock, rather than pipeline clock, to get - an accurate meaure of fps. - -2010-09-05 22:41:24 -0700 David Schleef <ds@schleef.org> - - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstchecksumsink.c: - * gst/debugutils/gstchecksumsink.h: - checksumsink: Add new element - -2010-09-05 22:30:54 -0700 David Schleef <ds@schleef.org> - - * gst/videomeasure/gstvideomeasure_ssim.c: - ssim: Add I420 support - -2010-09-05 21:34:30 -0700 David Schleef <ds@schleef.org> - - * gst/interlace/gstinterlace.c: - interlace: Add more formats - -2010-09-05 18:58:36 -0700 David Schleef <ds@schleef.org> - - * common: - Automatic update of common submodule - From d3d9acf to c2e10bf - -2010-09-05 23:40:08 +1000 Jan Schmidt <thaytan@noraisin.net> - - * docs/plugins/gst-plugins-bad-plugins.args.new: - * docs/plugins/gst-plugins-bad-plugins.signals.new: - Remove .new docs files from the repository - -2010-09-05 15:34:13 -0700 Jonathan Rosser <jonathan.rosser@rd.bbc.co.uk> - - * ext/cog/cogvirtframe.c: - cog: Fix cog_virt_frame_new_convert_u8() - Conversion was using uninitialized data instead of source frame. - Fixes #626425. - -2010-09-05 12:06:31 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/cog/gstcogorc-dist.c: - cog: Fix generated Orc code - Also drop required Orc back down to 0.4.7. - -2010-08-30 21:22:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/camerabinimage.c: - * gst/camerabin/gstcamerabin.c: - camerabin: Use jifmux instead of metadatamux - Use jifmux element to write exif/xmp tags instead of metadatamux - -2010-08-30 21:21:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/Makefile.am: - * gst/camerabin/gstcamerabin.c: - camerabin: Use new tags from -base - Replace private tags from metadata plugin with the new generic tags - from -base. - -2010-09-03 14:12:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/camerabin.c: - camerabin: Refactor tests - The tests were done in 2 steps, first there was a suite - that generated the files (while checking that camerabin - was operating correctly). Then there was a second suite - that was run to check that all files were playable with - playbin2. Those second tests were not being run because - they were checking if camerabin was initialized, and it - never was as those tests didn't use a 'setup' function. - This commit refactors the tests by removing this second - suite and merging its validation with the first suite's - functions. - -2010-08-24 14:43:50 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/jifmux.c: - tests: jifmux: Adds geo location tags tests - Adds some more tests for geo location tags. - Also use libexif constants for the exif tags' ids. - -2010-08-24 09:02:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/jifmux.c: - tests: jifmux: Refactor testing code a little - Refactor testing code to allow testing for cases where the - same gstreamer tag is mapped to multiple exif tags. - -2010-08-23 11:57:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/jifmux.c: - jifmux: More tests for exif tags - Refactors some code and add some more tests for exif tags - -2010-09-02 11:18:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - jifmux: Do not limit the size of the image on 16bits - Use guint instead of guint16 to represent the size of the encoded image, - this would make some recombined images lose most of their data and - show like a big black image with a small line of content on top. - Also adds a minor log message. - -2010-08-21 17:01:29 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjifmux.h: - jifmux: Set output pad caps - Set output pad caps to guarantee caps on the buffers being - pushed downstream. - -2010-08-20 08:34:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - jifmux: Detect EOI correctly - EOI are not always at the last 4 bytes. We need to search - the last 5 bytes to find the 0xFFD9 sequence as jpegenc seems - to round the buffer size to the next 4 multiple. - -2010-08-19 22:43:47 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - jifmux: Put APP0 first always - Fixes the order of the APP0/APP1 markers. APP0 should - be first. - -2010-09-02 01:32:10 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gstvdph264dec.c: - vdpauh264dec: parse "pixel-aspect-ratio" from stream - -2010-09-02 01:04:15 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - vdpau: remove non working unused code from GstBaseVideoDecoder - -2010-09-02 00:17:49 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - vdpau: GstBaseVideoDecoder set default par to 1/1 - -2010-09-01 23:47:21 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg/gstvdpmpegframe.c: - * sys/vdpau/mpeg/gstvdpmpegframe.h: - * sys/vdpau/mpeg4/gstmpeg4frame.h: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.c: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.h: - * sys/vdpau/mpeg4/mpeg4util.c: - vdpau: remove gst_base_video_decoder_get_current_frame - we now pass the current frame to GstBaseVideoDecoder::parse_data - also fixup some errors in vdpaumpeg4dec so that it now gives correct output - -2010-09-01 22:03:05 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - * sys/vdpau/basevideodecoder/gstvideoframe.c: - * sys/vdpau/basevideodecoder/gstvideoframe.h: - vdpau: rework GstBaseVideoDecoder timestamping - timestamps are now chosen in the following order: - upstream -> parsed by decoder -> calculated from timestamp offset - we also check the timestamps supplied from upstream/decoder to see if they - atleast is increasing. - -2010-09-01 17:45:19 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpdecoder.c: - vdpau: fix invalid unref - -2010-09-05 12:19:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From ec60217 to d3d9acf - -2010-09-05 11:45:35 +0200 Edward Hervey <bilboed@bilboed.com> - - * configure.ac: - configure.ac: Bump orc requirement to 0.4.8.1 - 0.4.7 creates code with unavailable symbols - 0.4.8 creates buggy code - Let's use git head of orc (which still won't work because git head - of orc still claims to be 0.4.8) - This allows all the rest of -bad to build properly. - -2010-07-14 21:00:12 +0200 Edward Hervey <bilboed@bilboed.com> - - * ext/timidity/gsttimidity.c: - timidity: Fix unitialized variables (gcc 4.4.4) - -2010-09-04 11:35:16 -0700 David Schleef <ds@schleef.org> - - * ext/cog/gstcogorc-dist.c: - * ext/cog/gstcogorc-dist.h: - cog: update disted Orc files - -2010-08-26 22:03:20 -0700 David Schleef <ds@schleef.org> - - * ext/sdl/sdlvideosink.c: - sdlvideosink: Re-enable YVYU and UYVY - YVYU on my machine appears to be doing software conversion - (and doing it incorrectly). - -2010-08-26 20:15:43 -0700 David Schleef <ds@schleef.org> - - * tools/base.c: - * tools/element-maker: - element-maker: construct element names - -2010-08-22 21:43:20 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/interlace/Makefile.am: - * gst/interlace/gstinterlace.c: - interlace: new element - -2010-08-20 17:24:23 -0700 David Schleef <ds@schleef.org> - - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstcogorc.orc: - cog: Add fast paths for colorspace conversion - -2010-08-20 17:23:17 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - configure: require Orc 0.4.7 - -2010-08-13 21:58:01 -0700 David Schleef <ds@schleef.org> - - * tools/element-maker: - * tools/gstelement.c: - element-maker: Fix up GstElement - -2010-08-13 21:54:54 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cogvirtframe.c: - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstcogorc.orc: - cog: Improvements in colorspace and scaler - Add fast paths for YUV->YUV conversions and Orc code for all. - Use Orc for horizontal resampling. - -2010-06-11 14:39:30 -0700 David Schleef <ds@schleef.org> - - * ext/cog/Makefile.am: - * ext/cog/gstcog.c: - * ext/cog/gstcogdownsample.c: - * ext/cog/gstcogfilter.c: - * ext/cog/gstcogmse.c: - * ext/cog/gstcogscale.c: - * ext/cog/gstcolorconvert.c: - * ext/cog/gstlogoinsert.c: - cog: minor cleanups - Improve element descriptions, remove unused files, code cleanup. - -2010-09-03 10:03:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.args.new: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.signals.new: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * win32/common/config.h: - Back to development - Temporarily disable -DGST_DISABLE_DEPRECATED for git builds until - the code is updated for the GST_FLOW_IS_* macro deprecations. - -2010-09-01 22:05:43 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxstream.c: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - mpegtsmux: Initialize PES packet before getting the header size. - The PES header length is calculated before setting the dynamic flags, returning - a wrong value. Small frames that should be sent in a single TS packet are - spawned to a new packet because of that error. For audio streams where a single - frame can cope in one TS packet it introduces a huge overhead. - For a 100B packet, we prepare a TS packet with a payload of(100+9)B. Then, we - write the TS header using this value in tsmux_write_ts_header, and call - tsmux_stream_get_data(). The dynamic flags where not set yet and now - tsmux_stream_pes_header_length() returns 14B instead of 9B. The payload of the - TS packet is 114B, 5B more than what was calculated. 109B are sent in a first - packet and the remaining 5B are sent in another one. - Fixes bug #628548. - -2010-09-02 10:23:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/cog/gstcogcolorspace.c: - cogcolorspace: Classify as Filter/Converter/Video instead of effect - Fixes bug #628570. - -2010-09-01 18:30:17 +0200 Thibault Saunier <tsaunier@gnome.org> - - * gst/videosignal/gstvideoanalyse.c: - videoanalyse: Use correct element classification - This is no effect but an analyzer. Fixes bug #628527. - -=== release 0.10.20 === - -2010-09-03 00:23:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * ext/cog/gstcogorc-dist.c: - * ext/cog/gstcogorc-dist.h: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.10.20 - -2010-09-03 00:21:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-zbar.xml: - docs: update for release - -2010-09-03 00:19:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * po/LINGUAS: - * po/el.po: - * po/gl.po: - * po/ro.po: - * po/sl.po: - po: update translations - -2010-09-03 00:01:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-plugins-bad.doap: - doap: reference git repository instead of CVS repository - -2010-09-02 22:39:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: fix wrong use of GST_ELEMENT_ERROR - -2010-08-30 16:01:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * ext/cog/gstcogorc-dist.c: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - 0.10.19.5 pre-release - -2010-08-30 15:20:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/examples/camerabin/Makefile.am: - camerabin: Don't install gst-camera.ui - The examples are not meant to be installed and the executables of - them are not installed anyway. - Fixes bug #627918. - -2010-08-25 22:56:03 -0400 Youness Alaoui <youness.alaoui@collabora.co.uk> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: Unlock the right mutex - The mutex locked is for the 'mux' object, but we unlock the - pad, which means that if the rtpmux gets a flush, then the - object lock will stay locked forever, causing it to freeze - the next time it tries to take it. - Fixes bug #627991 - -2010-08-27 15:49:39 +1000 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - configure: Bump neon requirement to 0.27.0 - Needed in order to have ne_set_connect_timeout - Fixes bug #625076 - -2010-08-21 21:42:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * ext/cog/gstcogorc-dist.c: - * ext/cog/gstcogorc-dist.h: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - 0.10.19.4 pre-release - -2010-08-16 12:36:24 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: autodetect out-of-order input timestamps and determine DTS accordingly - Favour using input buffer timestamps for DTS, but fallback to using buffer - duration (accumulation) if input ts detected out-of-order. - Fixes #624212. - -2010-08-20 11:09:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - jifmux: Avoid recombining RGB jpegs - JFIF only allows YUV as colorspace, when we receive an RGB jpeg, - we should just push it forward without adding the JFIF marker. - Fixes #627413 - -2010-08-13 14:34:21 +0200 Philip Jägenstedt <philipj@opera.com> - - * ext/vp8/gstvp8dec.c: - vp8dec: Set GstBaseVideoDecoder::packetized to TRUE as soon as possible - This fixes an infinite loop if an EOS event is received before - GstBaseVideoDecoder::start() is called, e.g. immediately when the - pads are activated. - Fixes bug #626815. - -2010-08-13 17:24:25 +0300 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 3e8db1d to ec60217 - -2010-08-11 22:03:07 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstdilate.c: - gaudieffects: Mark inline functions as static inline - Otherwise it fails to correctly link them in some cases. - https://bugzilla.gnome.org/show_bug.cgi?id=626670 - -2010-08-11 17:19:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * .gitignore: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsettings.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * win32/common/config.h: - 0.10.19.3 pre-release - -2010-08-11 17:19:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/gsettings/Makefile.am: - gsettings: fix make distcheck - Clean up file we generated at build time. - -2010-08-11 12:09:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/Makefile.am: - checks: blacklist gsettings* elements for generic/states test - When the test is run, the schema file won't be installed yet, - and there doesn't seem to be an environment variable to set - to force GSettings to look in a different directory. - https://bugzilla.gnome.org/show_bug.cgi?id=626603 - -2010-08-11 00:23:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-coloreffects.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * ext/cog/gstcogorc-dist.c: - * win32/common/config.h: - 0.10.19.2 pre-release - This commit is out of sequence, it really belongs between commits - 15098331412ceb982c24b89bb4346354fb56433c (Automatic update of - common submodule) and dd26f378b01d679834f12935efc7093fb5807956 - (configure: Fix the CELT checks to ...) - -2010-08-09 00:42:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: bump core/base requirement to released versions - This commit is out of sequence, it really belongs between commits - 15098331412ceb982c24b89bb4346354fb56433c (Automatic update of - common submodule) and dd26f378b01d679834f12935efc7093fb5807956 - (configure: Fix the CELT checks to ...) - -2010-08-09 00:42:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: fix --disable-external - This commit is out of sequence, it really belongs between commits - 15098331412ceb982c24b89bb4346354fb56433c (Automatic update of - common submodule) and dd26f378b01d679834f12935efc7093fb5807956 - (configure: Fix the CELT checks to ...) - -2010-08-08 17:09:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/jifmux.c: - checks: skip jifmux tests if required elements aren't available - This commit is out of sequence, it really belongs between commits - 15098331412ceb982c24b89bb4346354fb56433c (Automatic update of - common submodule) and dd26f378b01d679834f12935efc7093fb5807956 - (configure: Fix the CELT checks to ...) - -2010-08-11 11:52:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/legacyresample/Makefile.am: - legacyresample: Link against $(LIBM) for rint() and friends - -2010-08-11 11:51:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * m4/gsettings.m4: - gsettings: Add gsettings.m4 for the gsettings macros - -2010-08-11 11:50:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/invtelecine/Makefile.am: - invtelecine: Link against $(LIBM) for sqrt() and friends - -2010-08-11 11:39:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Fix the CELT check to actually succeed if CELT >= 0.5 is available - Also remove the AC_MSG_RESULTS(no), pkg-config does this for us already. - -2010-08-10 10:58:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From bd2054b to 3e8db1d - -2010-08-09 17:20:11 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/gstsquare.c: - * gst/geometrictransform/gstsquare.h: - geometrictransform: add a "zoom" parameter to square filter - https://bugzilla.gnome.org/show_bug.cgi?id=625908 - -2010-08-09 16:55:43 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/gstsquare.c: - * gst/geometrictransform/gstsquare.h: - geometrictransform: make square "width" and "height" customizable - https://bugzilla.gnome.org/show_bug.cgi?id=625908 - -2010-08-09 10:03:20 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/gstmirror.c: - * gst/geometrictransform/gstmirror.h: - geometrictransform: add a "mode" property to mirror filter - Add a "mode" enum property to mirror that defines how to split the frame - and with side reflect. - https://bugzilla.gnome.org/show_bug.cgi?id=625908 - -2010-08-09 08:52:51 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/gstbulge.c: - * gst/geometrictransform/gstbulge.h: - geometrictransform: add a "zoom" parameter to bulge filter - Rework bulge mapping function to give more predictable results. - Now the bulge is done dividing by a scale factor that smoothsteps from - "zoom" at the center to 1.0 at "radius". - https://bugzilla.gnome.org/show_bug.cgi?id=625908 - -2010-08-05 16:16:37 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/gststretch.c: - * gst/geometrictransform/gststretch.h: - geometrictransform: add an "intensity" parameter to stretch filter - https://bugzilla.gnome.org/show_bug.cgi?id=625908 - -2010-08-05 12:43:15 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/gsttunnel.c: - geometrictransform: make tunnel "radius" customizable - https://bugzilla.gnome.org/show_bug.cgi?id=625908 - -2010-08-05 12:29:16 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/gstbulge.c: - geometrictransform: make bulge "radius" customizable - https://bugzilla.gnome.org/show_bug.cgi?id=625908 - -2010-08-05 12:25:04 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/gststretch.c: - geometrictransform: make stretch "radius" customizable - https://bugzilla.gnome.org/show_bug.cgi?id=625908 - -2010-08-08 23:56:43 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/mpeg4/mpeg4util.c: - vdpaumpeg4dec: fix typo in default_non_intra_quant_matrix - -2010-07-14 11:03:35 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpau.c: - * sys/vdpau/mpeg4/gstmpeg4frame.c: - * sys/vdpau/mpeg4/gstmpeg4frame.h: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.c: - * sys/vdpau/mpeg4/gstvdpmpeg4dec.h: - * sys/vdpau/mpeg4/mpeg4util.c: - * sys/vdpau/mpeg4/mpeg4util.h: - vdpau: add mpeg4 part2 decoder - -2010-08-08 12:46:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/id3mux.c: - checks: skip id3mux unit tests that need id3demux if id3demux is not available - -2010-08-08 12:26:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: build and dist new coloreffects plugin - Fixes make distcheck. - -2010-08-08 12:01:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - frei0r: Only check the plugin filenames, not the directory names - -2010-08-08 11:56:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - frei0r: Don't try to register/load the same frei0r plugin at different locations twice - This could happen because for example /usr/lib is linked - to /usr/lib64 and both are loaded. The frei0r specification - says that the plugin init function must only be called once - and for some plugin weird things (including crashes) are - happening. - Fixes bug #623710. - -2010-08-06 01:56:29 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - dvbsrc: align actual default values for properties with defaults in param spec - https://bugzilla.gnome.org/show_bug.cgi?id=621404 - -2010-08-06 12:14:04 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpdevice.c: - * sys/vdpau/gstvdp/gstvdpdevice.h: - vdpau: fix destruction of GstVdpDevice when it failed to open - only close display in finalize and check if vdp_decoder_destroy is available - before we use it - -2010-08-05 23:55:00 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/gstvdpsink.h: - vdpausink: use separate mutex for device locking - we can't use GST_OBJECT_LOCK since that cause problems when we try to post - errors, due to gst_element_post_message also taking the GST_OBJECT_LOCK - -2010-08-06 11:04:57 +0100 David Hoyt <dhoyt@llnl.gov> - - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - neonhttpsrc: add connect-timeout and read-timeout properties - https://bugzilla.gnome.org/show_bug.cgi?id=625076 - -2010-08-06 10:44:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - * tests/check/elements/neonhttpsrc.c: - neonhttpsrc: add "cookies" property - Based on patch by: Sameer Naik - https://bugzilla.gnome.org/show_bug.cgi?id=625174 - -2010-07-25 17:04:12 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/dshowvideosink/dshowvideosink.cpp: - dshowvideosink: close our own window when changing the window id - If we created the window, it needs to be closed after setting a new - window id. - https://bugzilla.gnome.org/show_bug.cgi?id=574290 - -2010-07-25 17:01:19 +0200 Raimo Jarvi <raimo.jarvi@gmail.com> - - * sys/dshowvideosink/dshowvideosink.cpp: - dshowvideosink: allow changing window ID whilst in PLAYING state - https://bugzilla.gnome.org/show_bug.cgi?id=574290 - -2010-08-06 03:19:16 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - frei0r: Load plugins in /usr/{local/,}lib{32,64}/frei0r-1 too - Loads the plugins in more paths where they could be installed by - multilib distributions. - Fixes #623710 - -2010-08-05 13:57:11 +0300 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From a519571 to bd2054b - -2010-08-03 10:08:34 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstcirclegeometrictransform.c: - * gst/geometrictransform/gstcirclegeometrictransform.h: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gstwaterripple.c: - geometrictransform: make ciclegt "radius" property relative - Make the "radius" property of CircleGeometricTransform relative. - This is more coherent with the way x,y-center properties are handled - and allow to set a radius without knowing the video size. - Radius is defined with respect to the circle circumscribed about the - video rectangle so that a point in the center has radius 0.0 and one in - a vertex has radius 1.0. - Note that this is not a regression from the previous absolute way of - defining the radius as a user who knows the video size can easily - calculate the relative radius and set that. - https://bugzilla.gnome.org/show_bug.cgi?id=625959 - -2010-08-04 23:50:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/id3tag/id3tag.c: - id3mux: minor code clean-up - Add helper function to write text frames with just one string. - -2010-08-04 23:44:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/.gitignore: - .gitignore: ignore more unit test binaries - -2010-06-14 20:07:33 +1000 Jonathan Matthew <jonathan@d14n.org> - - * gst/id3tag/id3tag.c: - * tests/check/Makefile.am: - * tests/check/elements/id3mux.c: - id3mux: add support for beats-per-minute tag - Write beats per minute into the TBPM frame, and add unit - test for id3mux, based on id3v2mux unit test. - https://bugzilla.gnome.org/show_bug.cgi?id=621523 - -2010-08-04 19:26:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - configure: Check if the compiler supports ISO C89 or C99 and which parameters are required - This first checks what is required for ISO C99 support and sets the relevant - compiler parameters and if no C99 compiler is found, it checks for a - C89 compiler. This enables us to check for and use C89/C99 functions - that gcc hides from us without the correct compiler parameters. - -2010-08-04 10:15:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-coloreffects.xml: - coloreffects: Add to the documentation - -2010-08-04 10:11:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/coloreffects/gstcoloreffects.c: - * gst/coloreffects/gstplugin.c: - coloreffects: Minor cleanup - -2010-08-04 10:09:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/coloreffects/gstcoloreffects.c: - coloreffects: Improve property description a bit - -2010-08-04 10:08:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/coloreffects/gstcoloreffects.c: - coloreffects: Don't use the fixed_caps func on the pads - coloreffects can renegotiate during playback without any problems. - -2010-08-03 14:39:22 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/coloreffects/gstcoloreffects.c: - * gst/coloreffects/gstcoloreffects.h: - coloreffects: add ayuv support - Currently implemented switching from yuv to rgb, looking up rgb from the - table in the usual way, getting back to yuv. With luma lookup presets - (sepia, heat, xray) a color space conversion is saved directly looking - up rgb for a given Y and converting to yuv. - Probably this latter step can even be made faster precalculating a luma - to yuv table in an outer loop. - https://bugzilla.gnome.org/show_bug.cgi?id=625817 - -2010-08-01 23:03:24 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * configure.ac: - * gst/coloreffects/Makefile.am: - * gst/coloreffects/gstcoloreffects.c: - * gst/coloreffects/gstcoloreffects.h: - * gst/coloreffects/gstplugin.c: - coloreffects: new plugin for lookup table color mapping - Implements a color lookup table filter with 4 presets: - - heat: fake heat camera effect - - sepia: sepia toning - - xray: invert + shade to blue - - xpro: cross process - https://bugzilla.gnome.org/show_bug.cgi?id=625817 - -2010-08-03 10:29:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - docs: Add lots of gaudieffects/geometrictransform symbols to the docs - -2010-08-02 11:30:50 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gstfisheye.c: - * gst/geometrictransform/gstfisheye.h: - * gst/geometrictransform/plugin.c: - geometrictransform: new filter "fisheye" - Ports gleffects "fisheye" filter to geometrictransform. - Fake fisheye lens filter. Somewhat empiric implementation because I - didn't find any good algorithm that does it with nice results. - https://bugzilla.gnome.org/show_bug.cgi?id=625722 - -2010-08-02 11:12:42 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gstmirror.c: - * gst/geometrictransform/gstmirror.h: - * gst/geometrictransform/plugin.c: - geometrictransform: new filter "mirror" - Ports gleffects "mirror" filter to geometrictransform. - Simple yet effective mirror effect, splits the image into halves and - reflect the first into the second. - https://bugzilla.gnome.org/show_bug.cgi?id=625722 - -2010-08-02 11:01:31 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gstsquare.c: - * gst/geometrictransform/gstsquare.h: - * gst/geometrictransform/plugin.c: - geometrictransform: new filter "square" - Ports gleffects "square" filter to geometrictransform. - Maps a region around the center into a zoomed square and smoothly get - back to normal zoom. With faces it makes a funny "cube-face" effect. - https://bugzilla.gnome.org/show_bug.cgi?id=625722 - -2010-08-02 10:46:44 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gsttunnel.c: - * gst/geometrictransform/gsttunnel.h: - * gst/geometrictransform/plugin.c: - geometrictransform: new filter "tunnel" - Ports gleffects "tunnel" filter to geometrictransform. - Do nothing in a circle around the center and zoom outside. - https://bugzilla.gnome.org/show_bug.cgi?id=625722 - -2010-08-02 09:39:51 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gstbulge.c: - * gst/geometrictransform/gstbulge.h: - * gst/geometrictransform/plugin.c: - geometrictransform: new filter "bulge" - Ports gleffects "bulge" filter to geometrictransform. - Adds a protuberance around the center point. - https://bugzilla.gnome.org/show_bug.cgi?id=625722 - -2010-08-02 09:17:03 +0200 Filippo Argiolas <filippo.argiolas@gmail.com> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/geometricmath.c: - * gst/geometrictransform/geometricmath.h: - * gst/geometrictransform/gststretch.c: - * gst/geometrictransform/gststretch.h: - * gst/geometrictransform/plugin.c: - geometrictransform: new filter "stretch" - Ports gleffects "stretch" filter to geometrictransform. - Shrinks the image around the center and gradually return to normal zoom - creating funny caricatures. - https://bugzilla.gnome.org/show_bug.cgi?id=625722 - -2010-08-02 18:33:46 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpau.c: - vdpau: set back plugin ranks to GST_RANK_NONE - the previous change was not meant to slip in - -2010-08-02 18:23:11 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - vdpau: slightly fix GstBaseVideoDecoder timestamping - clear timestamps on flush and properly calculate the frame's end offset - -2010-08-01 12:32:31 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpvideobuffer.c: - vdpau: init debug category in gst_vdp_video_buffer_get_type - -2010-08-02 20:41:12 +1000 Jan Schmidt <thaytan@noraisin.net> - - * docs/plugins/inspect/plugin-gaudieffects.xml: - * gst/gaudieffects/Makefile.am: - * gst/gaudieffects/blur-example.py: - * gst/gaudieffects/gstgaussblur.c: - * gst/gaudieffects/gstgaussblur.h: - * gst/gaudieffects/gstplugin.c: - * gst/gaudieffects/gstplugin.h: - gaudieffects: Add Gaussian Blur effect, and brief example. - -2010-07-30 23:59:10 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: fix warning on osx. - -2010-07-30 22:27:49 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpdecoder.c: - * sys/vdpau/gstvdp/gstvdpdevice.c: - * sys/vdpau/gstvdp/gstvdpdevice.h: - * sys/vdpau/gstvdpau.c: - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/gstvdpvideopostprocess.c: - vdpau: add error reporting to device creation - -2010-07-30 16:54:40 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - vdpau: fix small typo in GstBaseVideoDecoder - -2010-07-30 14:47:43 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpvideosrcpad.c: - vdpau: use gst_vdp_yuv_to_video_caps in GstVdpVideoSrcPad to transform set caps - this way we'll keep other all other fields in the caps which we didn't take in - account when we manually created the "video/x-vdpau-video" caps - -2010-07-30 14:44:09 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdputils.c: - * sys/vdpau/gstvdp/gstvdputils.h: - * sys/vdpau/gstvdp/gstvdpvideobuffer.c: - * sys/vdpau/gstvdp/gstvdpvideobuffer.h: - * sys/vdpau/gstvdpvideopostprocess.c: - vdpau: rename gst_vdp_video_buffer_parse_yuv_caps and move it to gstvdputils.h - -2010-07-30 14:07:22 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.c: - vdpau: GstVdpOutputSrcPad use gst_pad_alloc when outputting video/x-raw-rgb - we implement "acceptcaps" to prevent us from getting a buffer with different - width and height from what we requested. - -2010-07-30 11:29:16 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdputils.c: - vdpau: properly remove "chroma-type" field from transformed caps - -2010-07-30 11:27:27 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.c: - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.h: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - vdpauvideopostprocess: use GstVdpVideo|OutputBufferPool to cache our buffers - This way we'll reuse the GstVdpVideo|OutputBuffers if they're of the same - size and chroma-type/rgba-format. - Also remove gst_vdp_output_src_pad_negotiate and set a "setcaps" function on - GstVdpOutputSrcPad instead, leaving negotiation to GstVdpVideoPostProcess. - -2010-07-30 11:20:35 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/gstvdpsink.h: - vdpausink: use GstVdpOutputBufferPool to alloc our buffers - This way we'll reuse our GstVdpOutputBuffers if they're of the same size and - rgba-format - -2010-07-30 11:16:09 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpvideosrcpad.c: - vdpau: use GstVdpVideoBufferPool in GstVdpVideoSrcPad - We also don't pad_alloc our GstVdpVideoBuffers anymore since we don't support - downstream negotation anyway. - -2010-07-30 11:06:17 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/Makefile.am: - * sys/vdpau/gstvdp/gstvdpoutputbuffer.c: - * sys/vdpau/gstvdp/gstvdpoutputbuffer.h: - * sys/vdpau/gstvdp/gstvdpoutputbufferpool.c: - * sys/vdpau/gstvdp/gstvdpoutputbufferpool.h: - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.c: - * sys/vdpau/gstvdpsink.c: - vdpau: add GstVdpOutputBufferPool - GstVdpVideoOutputPool is a subclass of GstVdpBufferPool that caches - GstVdpOutputBuffers - -2010-07-30 11:01:15 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/Makefile.am: - * sys/vdpau/gstvdp/gstvdpvideobuffer.c: - * sys/vdpau/gstvdp/gstvdpvideobuffer.h: - * sys/vdpau/gstvdp/gstvdpvideobufferpool.c: - * sys/vdpau/gstvdp/gstvdpvideobufferpool.h: - * sys/vdpau/gstvdp/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdpvideopostprocess.c: - vdpau: add GstVdpVideoBufferPool - GstVdpVideoBufferPool is a subclass of GstVdpBuffer that caches - GstVdpVideoBuffers - -2010-07-30 10:55:56 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/Makefile.am: - * sys/vdpau/gstvdp/gstvdpbuffer.c: - * sys/vdpau/gstvdp/gstvdpbuffer.h: - * sys/vdpau/gstvdp/gstvdpbufferpool.c: - * sys/vdpau/gstvdp/gstvdpbufferpool.h: - vdpau: add GstVdpBufferPool base class - GstVdpBufferPool will be used to cache GstVdpVideo|OutputBuffers since - creating these can be a costly operation on some hardware. - -2010-07-28 21:39:12 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.c: - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.h: - * sys/vdpau/gstvdp/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdpvideopostprocess.c: - vdpau: remove GstVdpOutputSrcPad "template-caps" property - instead we do as GstVdpVideoSrcPad and use the "templ" property of GstPad, - which enable us to change the signature of gst_vdp_output_src_pad_new to match - gst_pad_new_from_template - -2010-07-28 21:15:46 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.c: - * sys/vdpau/gstvdpvideopostprocess.c: - vdpau: remove GstVdpOutputSrcPad code to retrieve the device from downstream - we now no longer try to get the GstVdpDevice from downstream since it in - practice didn't give us anything and complicates the code alot. Nevertheless if device - distribution should be done there's probably a lot better ways to do it. - Instead we now simply aquire the device in vdpauvideopostprocess when we're - going into PAUSED. - -2010-07-27 23:24:43 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpdecoder.c: - * sys/vdpau/gstvdp/gstvdpdecoder.h: - * sys/vdpau/gstvdp/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdp/gstvdpvideosrcpad.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - vdpau: cleanup GstVdpDecoder opening of it's GstVdpDevice - we now no longer try to get the GstVdpDevice from downstream since it in - practice didn't give us anything and complicates the code alot. Nevertheless if device - distribution should be done there's probably a lot better ways to do it. - -2010-07-27 23:17:09 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - vdpau: fix GstBaseVideoDecoder returning wrong GstStateChangeReturn - when gst_base_video_decoder_start|stop fails we now return - GST_STATE_CHANGE_FAILURE instead of returning what the parent class returns - -2010-07-27 15:33:00 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/mpeg/gstvdpmpegdec.c: - vdpaumpegdec: remove unneeded setting of buffer flags - GstBaseVideoDecoder sets GST_VIDEO_BUFFER_TFF for us and - GST_BUFFER_FLAG_DELTA_UNIT doesn't make sense for decoded frames. - -2010-07-29 16:08:03 +0200 Andoni Morales <ylatuya@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - dshowvideosrc: don't make a range if min==max - Fixes bug #625138 - -2010-07-29 10:38:58 +0100 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: actually work when we have small buffers coming in - available_fast is not what we want and it will never get to discover packet - size if 188 byte buffers are being picked up. - -2010-07-28 18:36:53 +0200 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * .gitignore: - .gitignore: ignore gsettings xml schema file - -2010-07-28 18:34:15 +0200 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-gaudieffects.xml: - * docs/plugins/inspect/plugin-geometrictransform.xml: - * docs/plugins/inspect/plugin-ivfparse.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-shm.xml: - * docs/plugins/inspect/plugin-videomaxrate.xml: - docs: add more plugins and elements to the docs - -2010-07-28 17:46:53 +0200 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/ivfparse/gstivfparse.c: - * gst/ivfparse/gstivfparse.h: - ivfparse: fix up macros and function names to match guidelines - -2010-07-28 17:34:02 +0200 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstburn.h: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstchromium.h: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdilate.h: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstdodge.h: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstexclusion.h: - * gst/gaudieffects/gstsolarize.c: - * gst/gaudieffects/gstsolarize.h: - gaudieffects: fix structure names to comply with the plugin moving guidelines - -2010-07-28 16:15:53 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/qtmux/gstqtmux.c: - qtmux: use caps bitrate at last chance - If we didn't get the stream's bitrate from one of the atoms, - try getting it from the caps as a last resort. - https://bugzilla.gnome.org/show_bug.cgi?id=625496 - -2010-07-28 16:12:11 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/qtmux/atoms.c: - qtmux: btrt - max bitrate before average - According to iso base media file format, the max bitrate - is before the avg - https://bugzilla.gnome.org/show_bug.cgi?id=625496 - -2010-07-27 18:23:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: Reset the segment on FLUSH_STOP and when going back to READY - -2010-07-27 18:07:00 +0200 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/vdpau/gstvdp/Makefile.am: - vdpau: dist new header file - Fix make distcheck. - -2010-07-23 19:41:29 +0200 Julien Moutte <julien@fluendo.com> - - * sys/dshowvideosink/dshowvideofakesrc.cpp: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dshowvideosink/dshowvideosink.h: - dshowvideosink: Improvements contributed from the Moovida projet. - * Inherit from GstVideoSink - * Implement GstNavigation interface - * Proper COM initialization for threaded environments - * Fix Window resource leak - * Add EVR support for better video scaling on Windows Vista and above - * Only apply PAR scaling when the keep_aspect_ratio property is set to stay - consistent with the other Linux sinks - * Prevent an infinite loop with the wndproc chain - * Fix debugging messages to use the object instance - -2010-07-23 00:28:49 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpdecoder.c: - * sys/vdpau/gstvdp/gstvdpdecoder.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - vdpau: add gst_vdp_decoder_render and gst_vdp_decoder_init_decoder - -2010-07-22 09:21:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/icles/metadata_editor.c: - examples: Use cairo instead of gdk_draw_* API - Fixes bug #625003. - -2010-07-12 22:37:47 -0300 Luis de Bethencourt <luis@debethencourt.com> - - * configure.ac: - * gst/gaudieffects/Makefile.am: - * gst/gaudieffects/gstburn.c: - * gst/gaudieffects/gstburn.h: - * gst/gaudieffects/gstchromium.c: - * gst/gaudieffects/gstchromium.h: - * gst/gaudieffects/gstdilate.c: - * gst/gaudieffects/gstdilate.h: - * gst/gaudieffects/gstdodge.c: - * gst/gaudieffects/gstdodge.h: - * gst/gaudieffects/gstexclusion.c: - * gst/gaudieffects/gstexclusion.h: - * gst/gaudieffects/gstplugin.c: - * gst/gaudieffects/gstplugin.h: - * gst/gaudieffects/gstsolarize.c: - * gst/gaudieffects/gstsolarize.h: - gaudieffects: Adds new plugin 'gaudieffects' - Adds the new 'gaudieffects' plugin, originally found - here: http://github.com/luisbg/gaudi_effects - Contains the following video effect elements: burn, chromium, dilate, - dodge, exclusion and solarize. - Thanks to Jan Schmidt for the reviewing and refactoring - -2010-07-19 21:53:30 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gsth264parser.c: - * sys/vdpau/h264/gstvdph264dec.c: - vdpauh264dec: try to calculate framerate if we don't get one from upstream - -2010-07-19 11:34:39 +0200 Thijs Vermeir <thijsvermeir@gmail.com> - - * sys/vdpau/gstvdp/gstvdpdevice.c: - vdpau: fix segfault when vdpau device could not be created - -2010-07-18 21:15:34 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gstvdph264dec.c: - vdpauh264dec: fix problem when encountering GST_NAL_AU_DELIMITER - -2010-07-08 09:56:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/wasapi/gstwasapisrc.c: - wasapisrc: Use new gst_audio_clock_new_full() - -2010-07-08 09:55:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/alsaspdif/alsaspdifsink.c: - alsaspdifsink: Use new gst_audio_clock_new_full() - -2010-07-15 13:23:52 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gstvdph264dec.c: - vdpauh264dec: calculate width and height from bitstream info - -2010-07-15 11:10:03 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gsth264parser.c: - vdpauh264dec: fix usage of g_bit_storage - -2010-07-14 11:19:05 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/mpeg/mpegutil.c: - vdpaumpegdec: rename zigzag matrix - -2010-07-14 11:17:49 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * configure.ac: - * sys/vdpau/h264/gsth264parser.c: - vdpauh264dec: use g_bit_storage instead of log2 - log2 caused compile issues on certain platforms - -2010-07-13 00:40:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/gsettings/Makefile.am: - gsettings: Fix maintainer-clean when it is not available - Do not use @GSETTINGS_RULES@ if gsettings is not available - to avoid maintainer-clean failing. - -2010-07-11 10:47:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - * gst/frei0r/gstfrei0r.h: - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rfilter.h: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rmixer.h: - * gst/frei0r/gstfrei0rsrc.c: - * gst/frei0r/gstfrei0rsrc.h: - frei0r: Use correct order of directories to search for plugins - And don't fail if a plugin was already registered. Frei0r allows - plugins in directories with higher importance to override plugins - from directories with lower importance. - -2010-07-10 16:52:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - vp8enc: Add support for enabling automatic insertion of alt-ref frames by the encoder - -2010-07-10 16:51:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Fix handling of invisible/alt ref frames - -2010-07-10 15:50:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: Fix memory leak - The timestamps are only used if the output adapter is used, not - if complete frames are provided by the decoder and finish_frame() is - called and even in the case where the output adapter is used they - might not be used and are leaked. - -2010-07-10 15:46:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/vp8dec.c: - vp8dec: Add simple unit test for vp8dec - -2010-07-10 15:46:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/vp8enc.c: - vp8enc: Improve unit test a bit - -2010-07-10 15:32:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/vp8enc.c: - vp8enc: Also check the output caps in the unit test - -2010-07-10 15:29:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/vp8enc.c: - vp8enc: Add simple unit test - -2010-07-09 17:44:56 +0300 David Hoyt <dhoyt@llnl.gov> - - * gst/aiff/aiffmux.c: - aifmmux: use alternative way to check for inf - MSVC emits a divide-by-zero error when compiling aiffmux.c on line 205. - Fixes #623881. - -2010-07-08 21:53:35 +0100 David Hoyt <dhoyt@llnl.gov> - - * sys/winks/gstksvideosrc.c: - winks: fix compilation by using the right function - Fixes #623883. - -2010-07-08 17:58:16 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: fix exif frame size - Skip the correct number of bytes when reading exif - data - Fixes #623854 - -2010-07-08 15:07:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - wildmidi: Correctly initialize properties with the default values again - -2010-07-08 07:57:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - wildmidi: Use PROP_ instead of ARG_ for property enums and use G_PARAM_STATIC_STRINGS - Also don't use G_PARAM_CONSTRUCT, it does not make sense for elements. - -2010-07-07 23:06:43 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: Fix viewfiner-sink property for bins - Correctly iterate viewfinder-sink children when - it is a bin. - Fixes #623802 - -2010-07-06 14:48:08 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/gstqtmux.c: - qtmux: Write 'btrt' atom for H.264 media if possible - This writes out the optional 'btrt' atom (MPEG4BitrateBox) for H.264 - media if either or both of average and maximum bitrate are available for - the stream. - https://bugzilla.gnome.org/show_bug.cgi?id=623678 - -2010-07-05 14:09:50 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - qtmux: Write avg/max bitrate to ESDS if available - This collects the 'bitrate' and 'maximum-bitrate' tags on the - corresponding pad and uses these to populate these fields in the ESDS - where applicable. - https://bugzilla.gnome.org/show_bug.cgi?id=623678 - -2010-07-07 10:33:18 -0700 Michael Smith <msmith@songbirdnest.com> - - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - dshowdecwrapper: reset flow return state tracker after flush to avoid spurious errors after flushing in some cases. - -2010-07-07 08:37:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/timidity/gstwildmidi.c: - wildmidi: Add support for wildmidi 0.2.3 - Fixes bug #623722. - -2010-07-01 10:56:19 +0200 Philippe Normand <pnormand@igalia.com> - - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dshowvideosink/dshowvideosink.h: - dshowvideosink: Update renderer aspect ratio after force-aspect-ratio property update. - A new virtual method has been added to the RendererSupport class. It - is called during the initial renderer configuration and each time the - force-aspect-ratio property of the sink is updated. - Fixes bug #623272. - -2010-07-07 00:15:22 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - dshowaudiodec: Fix compilation error - Closes #623713 - -2010-07-06 13:15:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - asfmux: only use g_warning() when setting the old is-live property, not when reading it - Don't want warnings in e.g. gst-inspect. - -2010-07-06 10:53:04 +0200 Edward Hervey <bilboed@bilboed.com> - - * po/POTFILES.in: - po: Use proper gsettings schema file - -2010-07-05 11:52:56 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/elements/jpegparse.c: - tests: fix caps leak in jpegparse unit test - -2010-07-05 11:48:08 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: fix skipping extra 0xff markers - In particular, this makes the jpegparse unit test pass again. - Also add a debug statement. - Fixes #622690. - -2010-07-05 10:09:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/celt/gstceltdec.c: - * ext/celt/gstceltenc.c: - celt: Improve debugging - -2010-07-05 10:08:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/celt/gstceltenc.c: - * ext/celt/gstceltenc.h: - celtenc: Add support for setting the prediction mode and the start band - -2010-07-05 09:53:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - celt: Add check for celt 0.8 - -2010-07-05 09:52:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/celt/gstceltenc.c: - celt: Remove support for celt < 0.5 - celt 0.5 was released more than a year ago and the bitstream is - incompatible with the current one anyway. - -2010-07-05 09:47:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/celt/gstceltdec.c: - * ext/celt/gstceltenc.c: - celt: Fix compilation with celt 0.8 - Fixes bug #623550. - -2010-07-05 09:32:30 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * ext/gsettings/gstgsettingsaudiosrc.c: - * ext/gsettings/gstgsettingsvideosink.c: - * ext/gsettings/gstgsettingsvideosrc.c: - gsettings: fix some more warnings - -2010-07-05 09:28:49 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * ext/gsettings/gstgsettingsaudiosink.c: - gsettings: fix a compiler warning - -2010-07-03 16:15:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - * ext/gsettings/Makefile.am: - * ext/gsettings/gstgsettings.h: - * ext/gsettings/gstgsettingsaudiosink.c: - * ext/gsettings/gstgsettingsaudiosink.h: - * ext/gsettings/gstgsettingsaudiosrc.c: - * ext/gsettings/gstgsettingsaudiosrc.h: - * ext/gsettings/gstgsettingsvideosink.c: - * ext/gsettings/gstgsettingsvideosink.h: - * ext/gsettings/gstgsettingsvideosrc.c: - * ext/gsettings/gstgsettingsvideosrc.h: - * ext/gsettings/gstswitchsink.c: - * ext/gsettings/gstswitchsink.h: - * ext/gsettings/gstswitchsrc.c: - * ext/gsettings/gstswitchsrc.h: - * ext/gsettings/org.freedesktop.gstreamer.default-elements.gschema.xml.in: - * ext/gsettings/plugin.c: - * po/POTFILES.in: - gsettings: Initial version of GSettings plugin - This provides audio/video sources and sinks. - Fixes bug #616265. - -2010-07-03 17:48:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-lv2.xml: - docs: Integrate VP8 documentation - -2010-07-03 17:47:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8dec.h: - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - vp8: Add initial documentation, based on the theoradec/theoraenc documentation - -2010-07-03 17:34:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/Makefile.am: - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8dec.h: - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8enc.h: - * ext/vp8/plugin.c: - vp8: Move structure definitions, etc to public header files for gtk-doc - -2010-07-02 12:45:20 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/qtmux/gstqtmux.c: - qtmux: Don't use bogus codec/format tags - https://bugzilla.gnome.org/show_bug.cgi?id=623365 - -2010-07-01 15:19:12 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - rtpmux: Add support for GstBufferList - Factor out most of the buffer handling and implement a chain_list - function. Also, the DTMF muxer has been modified to just have a - function to accept or reject a buffer instead of having to subclass - both chain and chain_list. - -2010-07-01 15:15:49 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: Don't leak invalid buffers - -2010-06-14 15:15:09 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/videomaxrate/videomaxrate.c: - * gst/videomaxrate/videomaxrate.h: - videomaxrate: Add to docs - -2010-06-11 18:31:05 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/videomaxrate/videomaxrate.c: - videomaxrate: Add fixates_caps - -2010-06-10 20:36:29 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/videomaxrate/videomaxrate.c: - videomaxrate: Accept wider caps - -2010-06-10 20:25:01 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/videomaxrate/videomaxrate.c: - * gst/videomaxrate/videomaxrate.h: - videomaxrate: Make period over which to average configurable - -2010-06-10 20:43:16 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/videomaxrate/videomaxrate.c: - videomaxrate: Simplify transform_caps - -2010-06-10 20:14:01 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/videomaxrate/videomaxrate.c: - videomaxrate: Use basetransform correctly - -2010-06-10 20:08:14 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/videomaxrate/videomaxrate.c: - * gst/videomaxrate/videomaxrate.h: - videomaxrate: Make plugin actually work by using an average - -2010-06-10 19:17:00 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * configure.ac: - * gst/videomaxrate/Makefile.am: - * gst/videomaxrate/videomaxrate.c: - * gst/videomaxrate/videomaxrate.h: - videomaxrate: Import plugin - Import plugin from PsiMedia, based on my work - -2010-07-01 16:28:57 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: signal-fps-measurements is writable - signal-fps-measurements is a readwrite property, not read-only. - Also adds some more debugging logs. - -2010-06-30 18:59:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/Makefile.am: - tests: add gst-ffmpeg to whitelist as well - The mxf tests use some ffmpeg elements if they're available. - -2010-06-30 18:52:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/Makefile.am: - tests: add plugin loading whitelist to test environment - Only want to load core/-base/-good/-ugly/-bad plugins here. - -2010-06-30 18:20:13 +0100 Sebastian Pölsterl <sebp@k-d-w.org> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: don't free PAT structure which may still be needed later - This is a problem if you tune to a channel which uses pid X and later tune to - another channel where X is used for another table (e.g. PMT). - The code that does that was actually already there but never used because the - pat structure was freed before. The commit that introduced those lines intended - to fix a memory leak, but we clean things up elsewhere. - Fixes #622725. - -2010-06-30 18:19:00 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-zbar.xml: - docs: update inspect info, now sorted and escaped - -2010-06-30 17:54:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * .gitignore: - .gitignore: ignore temporary orc files - -2010-06-29 11:21:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * sys/vdpau/h264/gsth264parser.c: - vdpau: Check for log2 and only use it if it's available - -2010-06-28 16:20:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * autogen.sh: - * configure.ac: - Bump automake requirement to 1.10 and autoconf to 2.60 - For maintainability reasons, $(builddir) and other things. - See #622944 and #570428. - -2010-06-28 12:00:55 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gsth264frame.c: - vdpauh264dec: don't use deprecated g_ptr_array_free incase glib >= 2.22 - -2010-06-28 11:19:27 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.c: - vdpauvideopostprocess: fix resizing of output - -2010-06-28 11:08:56 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gsth264frame.c: - vdpauh264dec: don't use glib 2.22 functions - -2010-06-27 20:29:06 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - vdpau: change GstBaseVideoDecoder state api - -2010-06-27 10:52:33 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gsth264dpb.c: - vdpauh264dec: free frames on finalize in GstH264DPB - -2010-06-27 09:55:22 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - * sys/vdpau/gstvdp/gstvdpdecoder.c: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - vdpau: add display property to GstVdpDecoder - -2010-06-27 01:27:28 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/h264/gsth264dpb.c: - * sys/vdpau/h264/gsth264dpb.h: - * sys/vdpau/h264/gsth264frame.c: - * sys/vdpau/h264/gsth264frame.h: - * sys/vdpau/h264/gstvdph264dec.c: - vdpauh264dec: rename GstVdpH264Frame to GstH264Frame - -2010-06-27 00:36:25 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.c: - * sys/vdpau/gstvdpvideopostprocess.c: - vdpau: fix error handling when plugging "vdpauvideopostprocess ! fakesink" - -2010-06-27 00:35:11 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpdecoder.c: - * sys/vdpau/gstvdp/gstvdpdecoder.h: - * sys/vdpau/gstvdp/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdp/gstvdpvideosrcpad.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - vdpau: add error parameter to gst_vdp_video_src_pad_get_device - -2010-06-28 10:47:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/vdpau/Makefile.am: - vdpau: Link to $(LIBM) for log2 and friends - -2010-06-27 19:22:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/legacyresample/resample_functable.c: - * gst/legacyresample/resample_ref.c: - legacyresample: Include _stdint.h for int16_t and friends - -2010-06-27 17:46:44 +0200 Robert Swain <robert.swain@collabora.co.uk> - - * ext/cog/cogframe.c: - * ext/cog/cogvirtframe.c: - cog: Use g_malloc() instead of malloc() - malloc() needs stdlib.h, which isn't included here and the - memory is freed later with g_free() anyway. - -2010-06-27 11:24:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * gst/ivfparse/gstivfparse.c: - * gst/jpegformat/gstjifmux.c: - assrender, ivfparse, jpegformat: fix compiler warnings with debugging disabled in core - -2010-06-27 10:41:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/examples/camerabin/gst-camera.c: - * tests/icles/metadata_editor.c: - tests: Fix build with GTK+ < 2.17.7 - gtk_widget_get_allocation() was added in that version. - -2010-06-27 10:36:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * tests/examples/scaletempo/demo-gui.c: - configure: Require GTK+ >= 2.14 for the example - -2010-06-27 07:40:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/examples/camerabin/gst-camera.c: - * tests/icles/metadata_editor.c: - tests: Don't use deprecated GTK API to fix the build with GTK+ 3.0 - -2010-06-26 21:02:53 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdp/Makefile.am: - * sys/vdpau/gstvdp/gstvdp.c: - * sys/vdpau/gstvdp/gstvdpdecoder.c: - * sys/vdpau/gstvdp/gstvdpdecoder.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/h264/gstvdph264dec.h: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.h: - vdpau: add GstVdpDecoder base class - -2010-06-26 19:02:00 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gsth264dpb.c: - * sys/vdpau/h264/gsth264dpb.h: - * sys/vdpau/h264/gstvdph264dec.c: - vdpauh264dec: add gst_h264_dpb_set_output_func function - -2010-06-25 20:19:20 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: Write uint tags that don't have a complement - Write uint tags that have complements (e.g. track-number/ - track-count) even when we only have one of them available - and set the other one to 0. - Fixes #622484 - -2010-06-25 11:02:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/metadata/metadataexif.c: - * ext/metadata/metadataiptc.c: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadatamuxpng.c: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsepng.c: - * ext/metadata/metadataparseutil.c: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatypes.c: - * ext/metadata/metadataxmp.c: - metadata: Include config.h in metadata*.c files - Include config.h in metadataexif.c in metadata plugin so - that HAVE_EXIF gets defined and exif metadata is properly - generated. - Also adds config.h to all .c files missing it in metadata plugin - Fixes #622692 - -2010-06-24 20:21:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - asfmux: Warn if preroll value is too big - Post a warning when the preroll value is greater than - the streams duration - -2010-06-24 23:57:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/vdpau/basevideodecoder/Makefile.am: - vdpay: fix build in uninstalled setup - Add GST_PLUGINS_BASE_CFLAGS to CFLAGS so it finds the gst/video/video.h - headers in an uninstalled setup. Also reshuffle order. - -2010-06-24 18:32:44 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/asfmux/gstasfobjects.c: - asfmux: Make metadata writable before setting it - Before copying metadata from one buffer to another, make sure - the destination is metadata-writable. - -2010-06-24 22:14:38 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gstvdph264dec.c: - vdpauh264dec: fix unitialized variable - -2010-06-24 22:06:56 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gstnalreader.c: - * sys/vdpau/h264/gstnalreader.h: - vdpauh264dec: fix initalization of GstNalReader cache - -2010-06-24 12:37:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/debugutils/.gitignore: - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutils-marshal.list: - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/fpsdisplaysink.h: - fpsdisplaysink: Adds a signal to inform measurements to apps - Adds a signal for applications to receive the fps measurements made - instead of only printing them to the frame/stdout. - This signal is only emited if the signal-fps-measurements property - is set to TRUE - -2010-06-24 10:59:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/fpsdisplaysink.h: - fpsdisplaysink: Adds max-fps and min-fps property - Adds 2 properties for getting the maximum and minimum fps - values measured - -2010-06-24 10:24:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: Use G_PARAM_STATIC_STRINGS in all properties - Add G_PARAM_STATIC_STRINGS to the properties that are - missing it - -2010-06-24 10:23:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/fpsdisplaysink.h: - fpsdisplaysink: Add fps-update-interval property - Use a property to set/get the fps update interval instead - of having a hardcoded value. - -2010-06-24 16:20:23 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/basevideodecoder/Makefile.am: - vdpau: rename GstBaseVideoDecoder to SatBaseVideoDecoder using CFLAGS - -2010-06-24 15:23:33 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/basevideodecoder/Makefile.am: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - * sys/vdpau/basevideodecoder/gstbasevideoutils.h: - * sys/vdpau/basevideodecoder/gstvideoframe.c: - * sys/vdpau/basevideodecoder/gstvideoframe.h: - * sys/vdpau/basevideodecoder/satbasevideodecoder.h: - * sys/vdpau/basevideodecoder/satvideoframe.h: - * sys/vdpau/h264/gsth264dpb.c: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/h264/gstvdph264dec.h: - * sys/vdpau/h264/gstvdph264frame.c: - * sys/vdpau/h264/gstvdph264frame.h: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.h: - * sys/vdpau/mpeg/gstvdpmpegframe.c: - * sys/vdpau/mpeg/gstvdpmpegframe.h: - Revert "vdpau: rename GstBaseVideoDecoder to SatBaseVideoDecoder" - This reverts commit aa0444f204157c22c11a742547c9e68a9eaecc80. - -2010-06-24 15:09:33 +0300 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 35617c2 to a519571 - -2010-06-24 13:18:55 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/basevideodecoder/Makefile.am: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - * sys/vdpau/basevideodecoder/gstvideoframe.h: - * sys/vdpau/basevideodecoder/satbasevideodecoder.c: - * sys/vdpau/basevideodecoder/satbasevideodecoder.h: - * sys/vdpau/basevideodecoder/satbasevideoutils.h: - * sys/vdpau/basevideodecoder/satvideoframe.c: - * sys/vdpau/basevideodecoder/satvideoframe.h: - * sys/vdpau/h264/gsth264dpb.c: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/h264/gstvdph264dec.h: - * sys/vdpau/h264/gstvdph264frame.c: - * sys/vdpau/h264/gstvdph264frame.h: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.h: - * sys/vdpau/mpeg/gstvdpmpegframe.c: - * sys/vdpau/mpeg/gstvdpmpegframe.h: - vdpau: rename GstBaseVideoDecoder to SatBaseVideoDecoder - -2010-06-23 22:33:05 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gsth264parser.c: - vdpauh264dec: use bitshifts instead of pow - -2010-06-23 22:21:18 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gstvdph264dec.c: - vdpauh264dec: add interlaced = false to sink caps - we don't support interlaced content yet - -2010-06-23 22:18:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - rtmp: All read return values smaller than zero are failures - -2010-06-23 21:10:03 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gsth264parser.c: - vdpauh264dec: fix parsing of scaling lists - -2010-06-23 21:09:42 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gstnalreader.c: - vdpauh264dec: fix reading of signed exp golomb - -2010-06-22 15:49:15 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - vdpau: fixup decoder timestamping - -2010-06-22 14:52:00 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - vdpau: remove parse_codec_data from GstBaseVideoDecoder - -2010-06-22 14:25:17 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gsth264parser.c: - vdpauh264dec: fix initialization of fallback scaling matrix - -2010-06-22 14:17:28 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gsth264dpb.c: - * sys/vdpau/h264/gsth264dpb.h: - * sys/vdpau/h264/gsth264parser.c: - * sys/vdpau/h264/gsth264parser.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/h264/gstvdph264frame.h: - vdpauh264dec: improve further - -2010-06-17 15:20:51 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/h264/gsth264dpb.c: - * sys/vdpau/h264/gsth264parser.c: - * sys/vdpau/h264/gstvdph264dec.c: - vdpauh264dec: now works for simple streams - -2010-06-17 15:20:03 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdp/gstvdpvideosrcpad.h: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - vdpau: change gst_vdp_video_src_pad_get_device behaviour - it now creates the device if it's not available - -2010-06-16 23:12:43 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - * sys/vdpau/h264/gsth264dpb.c: - * sys/vdpau/h264/gsth264dpb.h: - * sys/vdpau/h264/gsth264parser.c: - * sys/vdpau/h264/gsth264parser.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/h264/gstvdph264dec.h: - * sys/vdpau/h264/gstvdph264frame.h: - vdpau: more work on h264 decoder - -2010-06-10 12:13:50 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/basevideodecoder/gstvideoframe.h: - * sys/vdpau/h264/gsth264parser.c: - * sys/vdpau/h264/gsth264parser.h: - * sys/vdpau/h264/gstnalreader.c: - * sys/vdpau/h264/gstnalreader.h: - * sys/vdpau/h264/gstvdph264dec.c: - * sys/vdpau/h264/gstvdph264dec.h: - * sys/vdpau/h264/gstvdph264frame.c: - * sys/vdpau/h264/gstvdph264frame.h: - vdpau: add beginning of h264 decoder - -2010-06-09 15:43:43 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * configure.ac: - * sys/vdpau/Makefile.am: - * sys/vdpau/basevideodecoder/Makefile.am: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.c: - * sys/vdpau/basevideodecoder/gstbasevideodecoder.h: - * sys/vdpau/basevideodecoder/gstbasevideoutils.h: - * sys/vdpau/basevideodecoder/gstvideoframe.c: - * sys/vdpau/basevideodecoder/gstvideoframe.h: - * sys/vdpau/gstvdp/Makefile.am: - * sys/vdpau/gstvdp/gstvdp.c: - * sys/vdpau/gstvdp/gstvdp.h: - * sys/vdpau/gstvdp/gstvdpdevice.c: - * sys/vdpau/gstvdp/gstvdpdevice.h: - * sys/vdpau/gstvdp/gstvdpoutputbuffer.c: - * sys/vdpau/gstvdp/gstvdpoutputbuffer.h: - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.c: - * sys/vdpau/gstvdp/gstvdpoutputsrcpad.h: - * sys/vdpau/gstvdp/gstvdputils.c: - * sys/vdpau/gstvdp/gstvdputils.h: - * sys/vdpau/gstvdp/gstvdpvideobuffer.c: - * sys/vdpau/gstvdp/gstvdpvideobuffer.h: - * sys/vdpau/gstvdp/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdp/gstvdpvideosrcpad.h: - * sys/vdpau/gstvdpau.c: - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/gstvdpsink.h: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - * sys/vdpau/mpeg/gstvdpmpegdec.c: - * sys/vdpau/mpeg/gstvdpmpegdec.h: - * sys/vdpau/mpeg/gstvdpmpegframe.c: - * sys/vdpau/mpeg/gstvdpmpegframe.h: - * sys/vdpau/mpeg/mpegutil.c: - * sys/vdpau/mpeg/mpegutil.h: - vdpau: base vdpaumpegdec on GstBaseVideoDecoder - -2010-06-08 13:36:53 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - vdpauvideopostprocess: fix small bug - -2010-05-15 22:47:41 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/mpegutil.c: - vdpaumpegdec: use READ_UINT8|16|32 macros - -2010-06-04 12:24:16 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdpvideosrcpad.h: - vdpau: remove gst_vdp_video_src_pad_set_caps - -2010-06-23 21:46:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: Do some sanity checks before accepting an URI - Fixes bug #622369. - -2010-06-17 10:58:55 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/jifmux.c: - jifmux: Adds image orientation tags tests - Adds tests for image orientation tags to jifmux - -2010-06-23 10:38:54 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: obtain correct upstream timestamp - ... for optional downstream use. - -2010-06-22 12:28:38 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: add new h264 caps attribute alignment - See #606662. - -2010-06-21 23:48:59 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/timidity/gstwildmidi.c: - wildmidi: fix previous commit - We were leaking the element refcount and not the pad one. - -2010-06-21 22:33:54 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/timidity/gstwildmidi.c: - wildmidi: don't leak the element refcount - -2010-06-21 19:39:54 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/qtmux/gstqtmux.c: - qtmux: Remove the pad from our internal list before calling collectpads - Previously we would end up with the collectpaddata structure already freed. - This would result in a bogus iteration of mux->sinkpads (all the - GstQTPad being freed) and it wouldn't be removed from that list. - Finally, due to it not being removed from that list, we would end up - calling a bogus gst_qt_mux_pad_reset on those structures => SEGFAULT - -2010-06-21 10:21:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/Makefile.am: - * gst/camerabin/camerabindebug.h: - * gst/camerabin/camerabingeneral.h: - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinpreview.c: - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/gstcamerabin.c: - camerabin: Move debug category declaration to a separate file - Having GST_DEBUG_CATEGORY and GST_DEBUG_CATEGORY_EXTERN together - might lead to 'undefined symbol' problems. This commit moves - the _EXTERN to a separate new file. - -2010-06-21 11:13:20 +0200 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/h264parse/gsth264parse.c: - Revert "h264parse: add parsed field to src caps" - This reverts commit 54edae4f1f2119cf492ffe44f936f99e133af7dc. - See this bug for more information: - https://bugzilla.gnome.org/show_bug.cgi?id=606662 - -2010-06-17 08:42:53 +1000 Austin Lund <austin.lund@gmail.com> - - * gst/mpegvideoparse/mpegpacketiser.c: - mpegvideoparse: Remove redundant log message - -2010-06-20 10:39:39 +0200 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/h264parse/gsth264parse.c: - h264parse: add parsed field to src caps - -2010-06-18 14:37:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/id3tag/id3tag.c: - id3tag: Use gst_tag_list_peek_string_index - Replace _get_string_index with _peek_string_index to avoid - a string copy - -2010-06-18 18:41:59 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: also handle 3-byte bytestream sync code - -2010-06-17 10:52:31 +0200 Thijs Vermeir <thijsvermeir@gmail.com> - - * gst/mpegdemux/gstsectionfilter.c: - mpegdemux: improve debug output - -2010-06-16 10:31:19 +0200 Benjamin Otte <otte@redhat.com> - - * gst/pnm/gstpnmdec.c: - pnmdec: Don't crash if no valid input was parsed yet - https://bugzilla.redhat.com/show_bug.cgi?id=603771 - -2010-06-11 10:53:26 +1000 Austin Lund <austin.lund@gmail.com> - - * gst/mpegvideoparse/mpegpacketiser.c: - * gst/mpegvideoparse/mpegvideoparse.c: - mpegvideoparse: Added debugging output for mpegpacketiser - -2010-06-15 16:50:05 +0200 Edward Hervey <bilboed@bilboed.com> - - * common: - Automatic update of common submodule - From 9339ccc to 35617c2 - -2010-06-15 16:54:28 +0300 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 5adb1ca to 9339ccc - -2010-06-15 15:34:05 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: fix seek event ref handling - -2010-06-15 15:33:37 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: prevent arithmetic overflows in pull mode buffer cache handling - -2010-06-15 15:32:34 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: fix seek handling - Allow a few more seek event type combinations, and really use the result - of gst_segment_set_seek to perform the seek. Also add some debug. - -2010-06-15 16:35:35 +0300 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 57c89b7 to 5adb1ca - -2010-06-15 15:49:26 +0300 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From c804988 to 57c89b7 - -2010-06-12 09:02:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Implement multipass encoding - Fixes bug #621348. - -2010-06-15 11:20:21 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: sprinkle some branch prediction - -2010-06-15 11:16:47 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: handle FLUSH_STOP event - -2010-06-15 11:16:34 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - * gst/mpeg4videoparse/mpeg4videoparse.h: - mpeg4videoparse: add config-interval parameter to re-insert config in stream - Add a new config-interval property to instruct the parser to insert - config (VOSH, VOS, etc) at periodic intervals in the stream - (when a GOP or VOP-I is encountered). - Based on patch by <marc.leeman at gmail.com> - Fixes #621205. - -2010-06-15 17:16:12 +1000 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegvideoparse/mpegpacketiser.c: - mpegvideoparse: Apply previous timestamp when there isn't any newer. - If the current incoming packet didn't carry a timestamp, but a - previous packet had one we didn't yet use, then apply that timestamp - to the next picture. - Fixes: #618336 - -2010-06-14 17:01:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * tests/examples/mxf/mxfdemux-structure.c: - configure: Require GLib 2.20 - -2010-06-14 15:56:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Set VP8E_SET_CPUUSED to 0 - This setting controls how much CPU can be used by the encoder, specified - in fractions of 16. Negative values mean strict enforcement of this - while positive values are adaptive. - The default value is -4, which means that we're not running as fast - as possible and probably are wasting some quality. 0 is the recommended - default by libvpx upstream. - -2010-06-14 15:51:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Use VPX defines for REALTIME, GOOD/BEST quality deadlines instead of our own - These are the values used for the speed property. - -2010-06-14 15:46:58 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/dts/gstdtsdec.c: - dtsdec: prevent compiler warning if orc not present - -2010-05-31 18:30:36 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: handle FLUSH_STOP sink event - -2010-05-31 18:30:19 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: optimize image parsing - Use adapter API for scanning and peeking to reduce buffer copying. - See #583047. - -2010-06-14 15:32:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/dts/gstdtsdec.c: - dtsdec: Call orc_init() before trying to get target flags - -2010-06-14 14:53:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Check for orc instead of liboil - -2010-06-14 14:51:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/dts/Makefile.am: - * ext/dts/gstdtsdec.c: - dtsdec: Use orc for CPU feature detection - -2010-06-14 14:48:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/Makefile.am: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Don't use liboil functions - glibc memcpy() will be faster than liboil's/orc's for now anyway - and we can use orc's later, after orc has support for loop unrolling. - -2010-06-14 14:47:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/legacyresample/Makefile.am: - * gst/legacyresample/resample.c: - * gst/legacyresample/resample_functable.c: - * gst/legacyresample/resample_ref.c: - legacyresample: Don't include liboil headers, they're not used anyway - -2010-06-14 13:26:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Use GLIB_EXTRA_CFLAGS - -2010-06-14 13:04:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 7a0fdf5 to c804988 - -2010-06-14 12:49:40 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - * gst/h264parse/gsth264parse.h: - h264parse: add option to insert SPS/PPS in stream - Add a new config-interval property to insert SPS and PPS at periodic intervals - in the stream (when an IDR is encountered). - Based on patch by <marc.leeman at gmail.com> - Fixes #620978. - -2010-06-09 15:32:14 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: also collect SPS and PPS nalu in codec_data - -2010-06-14 11:34:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 6da3bab to 7a0fdf5 - -2010-06-13 08:28:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/xvid/gstxvid.c: - xvid: Don't use deprecated 15/16 bit RGB masks - -2010-06-12 08:28:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 733fca9 to 6da3bab - -2010-05-22 10:35:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/vcd/vcdsrc.c: - vcdsrc: minor clean-up - Use gst_uri_has_protocol(). - -2010-06-11 15:29:43 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * configure.ac: - * tests/check/Makefile.am: - * tests/check/elements/jifmux.c: - jifmux: Fix tests building - Only build jifmux tests if libexif headers are present - -2010-06-09 19:16:03 -0700 David Schleef <ds@schleef.org> - - * ext/cog/gstcogorc-dist.c: - * ext/cog/gstcogorc-dist.h: - * ext/cog/gstcogorc.orc: - cog: use glib instead of stdint types - -2010-06-09 18:39:38 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - configure: use m4 macro for Orc check - -2010-06-05 16:02:41 +0200 Philip Jägenstedt <philipj@opera.com> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: remove spurious warning - -2010-06-10 14:17:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: require core/base git for the new image tags and helper functions - -2010-05-10 10:47:06 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/jifmux.c: - tests: jifmux: Adds jifmux exif tags tests - Adds a basic unit test for jifmux to test that exif tags - are writen properly. - This test uses libexif. - Fixes #614872 - -2010-04-28 23:52:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - jpegformat: Add exif support - Adds exif writing support to jifmux. - Adds parsing support to jpegparse. - Fixes #614872 - -2010-06-09 12:40:21 -0700 David Schleef <ds@schleef.org> - - * common: - Automatic update of common submodule - From fad145b to 733fca9 - -2010-06-09 12:34:10 -0700 David Schleef <ds@schleef.org> - - * common: - Automatic update of common submodule - From 47683c1 to fad145b - -2010-06-09 20:49:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: Fix timestamps after a seek - -2010-06-08 14:33:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfmux.h: - asfmux: Deprecate 'is-live' and add 'streamable' property - Following the similar change in flvmux, this commit adds - 'streamable' property and deprecated 'is-live' for a better/less wrong - name. - -2010-05-13 12:15:27 +0200 Andoni Morales Alastruey <amorales@flumotion.com> - - * gst/asfmux/gstasfmux.c: - asfmux: don't set the 'seekable' flag if we are streaming - Fixes #618522 - -2010-04-29 10:46:49 +0200 Andoni Morales Alastruey <amorales@flumotion.com> - - * gst/asfmux/gstasfmux.c: - asfmux: write preroll info in the header at initialization - This value doesn't need to be updated and is usefull in a streaming context - Fixes #618522 - -2010-04-26 13:33:48 +0200 Andoni Morales Alastruey <amorales@flumotion.com> - - * gst/asfmux/gstasfmux.c: - asfmux: put headers in streamheader for streaming - Fixes #618522 - -2010-06-08 13:59:45 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/mpegtsmux/tsmux/tsmux.h: - mpegtsmux: start pmt at 0x020 as suggested by Zaheer - -2010-06-08 13:59:08 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - mpegtsmux: take all the pmt in the streamheaders - -2010-06-08 09:14:01 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: Do not assert on set_property to NULL for elements - Check if the value is NULL before reffing them in set_property - for 'GstElement' properties - -2010-06-08 08:41:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: Do not assert on null caps property - If camerabin receives a null caps as 'filter-caps' argument, - use the default value - -2010-06-07 22:56:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/gstgeometrictransform.c: - geometrictransform: Use _CAST macro - Replace default type casting macro with the faster direct _CAST macro - -2010-06-07 22:21:10 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstcirclegeometrictransform.c: - * gst/geometrictransform/gstdiffuse.c: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstgeometrictransform.h: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstmarble.c: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstsphere.c: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gstwaterripple.c: - geometrictransform: Make properties controllable - Makes the element's properties controllable and threadsafe. - Fixes #620825 - -2010-06-07 17:39:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: Remove page-url and swf-url properties - It's possible to include all those options in the URL already - by appending the options and separating them by spaces, e.g. - rtmp://somewhere/something opt1=val1 opt2=val2 - -2010-06-07 17:30:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: Fix memory leaks - -2010-06-07 11:15:26 -0400 Olivier Crête <tester@tester.ca> - - * gst/dtmf/gstdtmfdetect.c: - * gst/dtmf/gstdtmfdetect.h: - dtmfdetect: Only works with rate=8000, fix in caps - -2010-06-07 07:58:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: Fix crash in 'filename' property - Do not crash when filename property is set to NULL, use an - empty string instead. - -2010-06-07 07:38:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/kate/gstkateenc.c: - * ext/kate/gstkatespu.c: - kate: Run gst-indent on .c files - kate plugin has some indentation problems, run gst-indent on them - and fix it - -2010-06-06 22:34:55 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/geometricmath.c: - * gst/geometrictransform/geometricmath.h: - * gst/geometrictransform/gstmarble.c: - * gst/geometrictransform/gstmarble.h: - * gst/geometrictransform/plugin.c: - marble: Adds 'marble' element to geometrictransform - Adds a new element that does a marbling effect to - geometrictransform plugin - -2010-06-06 14:35:44 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/gstgeometrictransform.c: - geometrictransform: Use explicit formats from gstvideo - Use explicit format macros from gstvideo to avoid exposing - unsupported formats on template pads. Using the macros - also give us complete caps (width/height/framerate). - And add support for AYUV. - Fixes #620717 - -2010-06-05 19:38:44 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gstdiffuse.c: - * gst/geometrictransform/gstdiffuse.h: - * gst/geometrictransform/plugin.c: - diffuse: Adds diffuse element to geometrictransform - Adds the 'diffuse' element to geometrictransform. It moves - the pixels of the image in random directions - -2010-06-05 19:20:06 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstgeometrictransform.h: - geometrictransform: Make map precalculation optional - Adds a variable to be set to allow subclasses to enable - or disable precalculation of the pixels mapping - -2010-06-06 15:32:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: Add some braces to improve readability - -2010-06-06 15:29:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: Improve timestamp handling a bit - -2010-06-06 15:24:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - * ext/rtmp/gstrtmpsrc.h: - rtmpsrc: Add support for seeking - -2010-06-06 13:57:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - * ext/rtmp/gstrtmpsrc.h: - rtmpsrc: Handle timestamps and the position query - This is not very accurate but better than nothing. The demuxer - after the source knows more accurate timestamps. - -2010-06-06 08:30:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - rtmpsrc: Allocate and free the RTMP instance in start/stop - -2010-06-04 22:36:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - * ext/rtmp/gstrtmpsrc.h: - rtmpsrc: Add properties for setting the swfUrl and pageUrl properties - These are required for some streams unfortunately. - -2010-06-04 22:04:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/rtmp/gstrtmpsrc.c: - * ext/rtmp/gstrtmpsrc.h: - rtmpsrc: Major cleanup and reorganization - -2010-06-04 08:14:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - * ext/rtmp/Makefile.am: - * ext/rtmp/README: - * ext/rtmp/gstrtmpsrc.c: - * ext/rtmp/gstrtmpsrc.h: - * gst/rtmp/Makefile.am: - * gst/rtmp/amf.c: - * gst/rtmp/amf.h: - * gst/rtmp/bytes.h: - * gst/rtmp/dh.h: - * gst/rtmp/dhgroups.h: - * gst/rtmp/handshake.h: - * gst/rtmp/hashswf.c: - * gst/rtmp/http.h: - * gst/rtmp/log.c: - * gst/rtmp/log.h: - * gst/rtmp/parseurl.c: - * gst/rtmp/rtmp.c: - * gst/rtmp/rtmp.h: - * gst/rtmp/rtmp_sys.h: - rtmp: Move to ext and drop internal librtmp copy - We really don't want this in gst-plugins-bad because of - legal complexities around RTMP and possible problems - for distributions. - Add README that explains how to build librtmp to be suitable - for linking to the GStreamer plugin. - -2010-06-02 00:45:06 +0100 Bastien Nocera <hadess@hadess.net> - - * configure.ac: - * gst/rtmp/Makefile.am: - * gst/rtmp/amf.c: - * gst/rtmp/amf.h: - * gst/rtmp/bytes.h: - * gst/rtmp/dh.h: - * gst/rtmp/dhgroups.h: - * gst/rtmp/gstrtmpsrc.c: - * gst/rtmp/gstrtmpsrc.h: - * gst/rtmp/handshake.h: - * gst/rtmp/hashswf.c: - * gst/rtmp/http.h: - * gst/rtmp/log.c: - * gst/rtmp/log.h: - * gst/rtmp/parseurl.c: - * gst/rtmp/rtmp.c: - * gst/rtmp/rtmp.h: - * gst/rtmp/rtmp_sys.h: - rtmp: Add RTMP source plugin - https://bugzilla.gnome.org/show_bug.cgi?id=566604 - -2010-06-05 11:04:45 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/gstgeometrictransform.c: - geometrictransform: Set output buffer data to 0 - Initialize output buffer data to 0 before doing the - transform. - -2010-06-05 10:58:00 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstgeometrictransform.h: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstsphere.c: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gstwaterripple.c: - geometrictransform: Descriptions and default values - Improve some properties and element descriptions and changes - some default properties values. - -2010-06-04 16:14:02 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/gstshmsink.c: - shmsink: Verify that pipe exists before resizing it - -2010-06-04 15:54:33 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/shmalloc.c: - * sys/shm/shmalloc.h: - * sys/shm/shmpipe.c: - * sys/shm/shmpipe.h: - shm: Add copyright notices to shmalloc.ch and shmpipe.ch - -2010-06-04 15:53:20 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/geometricmath.c: - * gst/geometrictransform/geometricmath.h: - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstcircle.h: - * gst/geometrictransform/gstcirclegeometrictransform.c: - * gst/geometrictransform/gstcirclegeometrictransform.h: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstkaleidoscope.h: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstpinch.h: - * gst/geometrictransform/gstsphere.c: - * gst/geometrictransform/gstsphere.h: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gsttwirl.h: - * gst/geometrictransform/gstwaterripple.c: - * gst/geometrictransform/gstwaterripple.h: - geometrictransform: Remove trailing whitespace - Remove trailing whitespace from geometrictransform files - -2010-06-03 00:24:50 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gstwaterripple.c: - * gst/geometrictransform/gstwaterripple.h: - * gst/geometrictransform/plugin.c: - waterripple: Adds new waterripple element to geometrictransofmr - Adds an water ripple distortion element to geometrictransform - -2010-06-02 23:55:41 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gstsphere.c: - * gst/geometrictransform/gstsphere.h: - * gst/geometrictransform/plugin.c: - sphere: Adds new 'sphere' element to geometrictransform - Adds a new element to do 'sphere' effect into geometrictransform - plugin - -2010-06-02 22:01:31 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstgeometrictransform.h: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gsttwirl.c: - geometrictransform: adds some properties to base class - Adds a property to select what to do with pixels that are mapped out of - edges: ignore, clamp or wrap. - -2010-06-02 18:58:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/geometricmath.c: - * gst/geometrictransform/geometricmath.h: - * gst/geometrictransform/gstcircle.c: - * gst/geometrictransform/gstcircle.h: - * gst/geometrictransform/plugin.c: - circle: Adds circle element to geometrictransform plugin - Adds the new 'circle' element to geometrictransform plugin - -2010-06-02 01:21:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/geometricmath.c: - * gst/geometrictransform/geometricmath.h: - * gst/geometrictransform/gstkaleidoscope.c: - * gst/geometrictransform/gstkaleidoscope.h: - * gst/geometrictransform/plugin.c: - kaleidoscope: Adds new element 'kaleidoscope' - Adds new kaleidoscope element to geometrictransform plugin - -2010-06-02 00:48:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gsttwirl.c: - * gst/geometrictransform/gsttwirl.h: - * gst/geometrictransform/plugin.c: - gsttwirl: Adds new element twirl - Adds a new element to geometrictransform plugin: twirl - -2010-06-02 00:34:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gstcirclegeometrictransform.c: - * gst/geometrictransform/gstcirclegeometrictransform.h: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstpinch.h: - geometrictransform: Adds a intermediary baseclass circlegeometrictransform - Adds an intermediary baseclass named gstcirclegeometrictransform - to keep common properties code for filters that operate on - a circular area. - -2010-05-30 12:50:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstpinch.h: - pinch: Some optimization using the prepare func - Small optimization by precalculating the center of the effect, - also use newly added _CAST macro. - -2010-05-30 12:36:08 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstgeometrictransform.h: - geometrictransform: Adds prepare function and cleanup - Adds a prepare function to make subclasses precalculate values - that will be used throughout the mapping functions. - Also adds a missing cleanup to fix a memleak - -2010-05-26 21:39:21 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstgeometrictransform.h: - geometrictransform: Precalculate mapping array - Precalculate when setting caps the warping map to avoid - recalculating it every buffer - -2010-05-26 18:29:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/gstgeometrictransform.c: - geometrictransform: Accept any rgb or gray - Using gstvideo functions geometrictransform can handle - rgb or gray, put that on template caps - -2010-05-26 18:22:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstgeometrictransform.h: - * gst/geometrictransform/gstpinch.c: - geometrictransform: Rename some variables for clarity - Renames some variables and adds a minimum doc to the - mapping function for a little clarity. - Also uses gstvideo functions for the row and pixel strides - instead of hardcoded values - -2010-05-24 23:57:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * configure.ac: - * gst/geometrictransform/Makefile.am: - * gst/geometrictransform/gstgeometrictransform.c: - * gst/geometrictransform/gstgeometrictransform.h: - * gst/geometrictransform/gstpinch.c: - * gst/geometrictransform/gstpinch.h: - * gst/geometrictransform/plugin.c: - geometrictransform: New plugin for geometric transforms - Adds a new plugin that has elements that perform geometric - transformations to images. By geometric transformations I mean - that the operations are functions that given the output pixel - position, get the pixel position in the input image. This pixel - is then copied from input to output. - The gstgeometrictransform baseclass makes it easy to write - such elements. It boils down to write the mapping function - and exposing properties - Already added the first of the elements, 'pinch'. It's a common - effect in image editors, like gimp (distort -> pinch) - -2010-06-03 23:19:35 -0700 David Schleef <ds@schleef.org> - - * tools/element-maker: - * tools/gobject.c: - * tools/gstbasesink.c: - * tools/gstbasesrc.c: - tools: flesh out element-maker templates - -2010-06-03 18:14:05 -0700 David Schleef <ds@schleef.org> - - * gst/bayer/gstbayer2rgb.c: - bayer2rgb: handle other bayer formats - -2010-06-03 18:14:57 -0700 David Schleef <ds@schleef.org> - - * gst/bayer/gstrgb2bayer.c: - * gst/bayer/gstrgb2bayer.h: - rgb2bayer: handle multiple bayer formats - -2010-06-03 15:53:04 -0700 David Schleef <ds@schleef.org> - - * gst/bayer/Makefile.am: - * gst/bayer/gstbayer.c: - * gst/bayer/gstrgb2bayer.c: - * gst/bayer/gstrgb2bayer.h: - bayer: Add rgb2bayer element - Mostly for testing/completeness. - -2010-06-03 20:51:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsrc.c: - shm: fix debug messages - Misc. printf format fixes and missing arguments. - -2010-06-03 15:27:03 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/gstshmsink.c: - shmsink: Make static function static - -2010-06-03 15:26:52 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsrc.c: - shm: Use gst_element_class_set_details_simple - -2010-06-03 14:42:06 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * configure.ac: - * sys/Makefile.am: - * sys/shm/Makefile.am: - * sys/shm/gstshm.c: - * sys/shm/gstshmsink.c: - * sys/shm/gstshmsink.h: - * sys/shm/gstshmsrc.c: - * sys/shm/gstshmsrc.h: - * sys/shm/shmalloc.c: - * sys/shm/shmalloc.h: - * sys/shm/shmpipe.c: - * sys/shm/shmpipe.h: - shm: Move to sys/ since it doesn't exist on windows - -2010-06-03 14:41:55 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/gstshmsrc.c: - shmsrc: Fix indentation - -2010-06-03 14:22:36 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/gstshmsink.c: - * gst/shm/shmpipe.c: - * gst/shm/shmpipe.h: - shmsink: Print errors if fchmod fails - -2010-04-07 19:05:37 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmpipe.c: - shmpipe: Fix crash when sp_close_shm is called with self == NULL. - If sp_open_shm errors out trying to open a shm area, it would crash - when trying to free the area. The RETURN_ERROR macro calls - sp_shm_area_dec with self == NULL. sp_shm_area_dec calls - sp_shm_close, with self == NULL, which it then tries to access a - parameter of without checking. This patch checks to make sure - self != NULL before accessing that parameter. - -2010-04-07 19:05:15 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmpipe.c: - shmpipe: Update code standard - -2010-02-03 13:50:13 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/gstshmsrc.c: - shmsrc: Add socket path to error message - -2010-02-02 17:40:09 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmpipe.c: - shmpipe: Remove wrong test inversion - -2010-02-02 17:35:26 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmpipe.c: - shmpipe: Verify that accept succeeds - -2010-02-02 17:35:15 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmpipe.c: - shmpipe: Fix one byte overflow - -2010-02-02 11:11:06 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/gstshmsink.c: - * gst/shm/gstshmsrc.c: - shmsrc: Improve debug prints - -2010-01-26 12:34:34 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/gstshmsink.c: - shmsink: Get potentially modified after opening shmpipe - -2010-01-26 12:32:56 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmpipe.c: - * gst/shm/shmpipe.h: - shm: Try alternate paths for the socket - -2010-01-29 11:06:44 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmpipe.c: - shmpipe: Don't pretend the path is random - -2010-01-29 10:57:27 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmpipe.c: - shmpipe: Create shm area exclusively - -2010-01-28 15:34:44 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmalloc.h: - * gst/shm/shmpipe.c: - * gst/shm/shmpipe.h: - shmalloc: Make it build in non-glib world - -2010-01-28 12:19:07 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/gstshmsrc.c: - * gst/shm/gstshmsrc.h: - shmsrc: Make the shmpipe life independant of the element states - -2010-01-28 11:57:34 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmpipe.c: - shmpipe: Simplify handling of random paths - -2010-01-28 11:36:01 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/gstshmsrc.c: - shmpipe: Remove useless attrib - -2010-01-28 11:31:11 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmpipe.c: - shmpipe: Ref client shmarea when a buffer is received in it - -2010-01-28 11:30:11 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmpipe.c: - shmpipe: Don't dec old shm area when new one is added - Its ref will be dropped when the "close" message arrives - -2010-01-27 11:49:34 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/gstshmsrc.c: - shmsrc: Lock uses of shmpipe - -2010-01-26 14:20:35 +0200 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/gstshmsrc.c: - shmsrc: Add is-live property - -2009-11-03 20:03:24 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmpipe.c: - shm: Print details on errors - -2009-11-03 18:33:35 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/gstshmsink.c: - * gst/shm/shmpipe.c: - shm: Make valgrind happy - -2009-11-03 16:31:37 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/gstshmsink.c: - shmsink: Don't block on EOS in non-blocking mode - -2009-11-03 16:09:35 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/shmpipe.c: - shm: Block if required - -2009-10-30 18:24:58 +0000 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/gstshm.h: - * gst/shm/gstshmsink.c: - * gst/shm/gstshmsink.h: - shmsink: Port to ShmPipe - -2009-10-30 12:37:50 +0000 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/gstshmsrc.c: - * gst/shm/gstshmsrc.h: - shmsrc: Port to ShmPipe - -2009-10-29 19:18:25 +0000 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/shm/Makefile.am: - * gst/shm/shmalloc.c: - * gst/shm/shmalloc.h: - * gst/shm/shmpipe.c: - * gst/shm/shmpipe.h: - shm: Add shmpipe implementation - -2009-04-29 16:33:46 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * configure.ac: - * gst/shm/Makefile.am: - * gst/shm/gstshm.c: - * gst/shm/gstshm.h: - * gst/shm/gstshmsink.c: - * gst/shm/gstshmsink.h: - * gst/shm/gstshmsrc.c: - * gst/shm/gstshmsrc.h: - shm: Add shm based sink and src - These two elements (shmsink and shmsrc) communicate buffers using POSIX - shared memory. They also communicate the caps. The source currently acts as - a live source and ignores the timestamps coming from the sink. It also does - not transfer the tags. - -2010-06-03 15:51:18 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Some checks to avoid asserts - gst_mpeg_descriptor_find() expects the description field to be non-NULL. - This fixes a couple of calls where the value being passed is not - verified to be non-NULL first. - https://bugzilla.gnome.org/show_bug.cgi?id=620456 - -2010-06-03 10:49:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: fix printf format warning in log message - gstvp8enc.c:564: error: format ‘%d’ expects type ‘int’, but argument 8 has type ‘size_t’ - gstvp8enc.c:744: error: format ‘%d’ expects type ‘int’, but argument 8 has type ‘size_t’ - -2010-06-03 10:43:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/rtpmux/gstrtpdtmfmux.c: - rtpmux: fix missing debug log message argument - -2010-06-02 22:07:31 -0700 David Schleef <ds@schleef.org> - - * gst/invtelecine/gstinvtelecine.c: - invtelecine: add an assert to placate gcc-4.5 - -2010-06-02 19:46:50 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideoparse.c: - basevideoparse: fix warning - -2010-06-02 19:38:35 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideoparse.c: - basevideoparse: remove bogus api - -2010-06-02 17:54:42 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoutils.c: - * gst-libs/gst/video/gstbasevideoutils.h: - basevideo: remove gst_base_video_state_from_caps - -2010-06-02 17:40:17 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideoutils.c: - basevideo: remove compatibility code - -2010-06-02 16:06:20 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - configure: Orc is not required - -2010-06-02 16:01:28 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoparse.c: - * gst-libs/gst/video/gstbasevideoutils.c: - basevideo: use debug category for each class - -2009-10-05 15:47:58 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst-libs/gst/video/gstbasevideoutils.c: - basevideo: Fail if caps don't contain a framerate field - Return false from the caps parsing function if there is no framerate - field in the provided caps - Merging previous commit into current codebase. - -2010-06-02 13:31:46 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - basevideodecoder: create new segments if missing - -2009-09-17 10:50:40 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideo: Add a warning - Merging previous commit into current codebase. - -2009-07-03 16:08:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/vp8/Makefile.am: - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.h: - * gst-libs/gst/video/gstbasevideoencoder.h: - * gst-libs/gst/video/gstbasevideoparse.h: - * gst-libs/gst/video/gstbasevideoutils.h: - basevideo, vp8: guard unstable API with GST_USE_UNSTABLE_API - Add some guards and fat warnings to the header files with still unstable - API, so people who just look at the installed headers know that it - actually is unstable API. - Merging previous commit into current codebase. - -2010-06-02 19:52:07 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: Clear adapter when flushing - -2010-06-02 19:45:29 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: Stop decoding if can't push - -2010-06-02 19:44:31 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: Flush adapter right ater using it - -2009-11-18 11:14:28 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimenc: No need to do a try allocation - -2009-11-18 11:08:25 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimenc: Document paused-mode property - -2009-10-12 20:19:38 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - mimic: Use log loglevel for messages that are shown on every frame - -2009-10-12 20:09:34 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - mimdec: Remove object lock usage, stream lock is enough - -2009-10-12 20:08:12 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: Output framerate is unknown - -2009-10-12 20:06:13 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - mimdec: Remove local state variable from instance - -2009-10-12 19:57:50 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: Remove useless variable - -2009-10-12 19:56:54 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: Make caps a lot stricter - -2009-10-12 19:52:35 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimenc: Set delta_unit flag on intra frames - -2009-10-12 19:50:52 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - mimic: Initialize encoder/decoders in state change and setcaps where possible - -2009-10-12 19:36:29 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - mimic: Fix element details - -2009-10-12 19:31:38 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimic: Hold element lock while accessing the clock - -2009-10-12 19:29:17 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimic: Refactor tcp header creation to not make a separate buffer - -2009-10-12 19:18:20 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimic: Function can't fail - -2009-10-12 19:17:30 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - mimic: Remove C++ style comments - -2009-10-12 19:16:26 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - mimic: Use GST_ELEMENT_ERROR when returning a flow error - -2009-10-12 18:54:59 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.h: - * ext/mimic/gstmimenc.h: - mimic: Fix GST_MIM_*_CLASS macros - -2009-10-12 18:47:35 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimic: Warn if paused-mode is toggled while playing - -2009-10-12 18:39:06 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - mimic: Add GST_DEBUG_FUNCPTR where appropriate - -2009-10-12 18:36:58 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - * ext/mimic/gstmimic.c: - mimic: Rename functions/macros to match class names - -2010-05-10 18:37:55 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpdtmfmux.c: - rtpdtmfmux: Add some debug messages - -2010-05-07 18:56:57 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpdtmfmux.h: - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - rtpdtmfmux: Remove stream-lock event handling - -2010-05-07 18:54:49 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpdtmfmux.c: - rtpdtmfmux: Update doc for simplification - -2010-05-07 18:42:06 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - dtmf: Remove rtpdtmfmux stream-lock code - -2010-05-07 18:40:30 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * tests/check/elements/rtpmux.c: - tests: Change tests to not use the priority pads instead of the events - -2010-05-06 19:51:59 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpdtmfmux.h: - rtpdtmfmux: Drop buffers on non-priority sinks when something is incoming on the priority sink - -2010-05-06 18:11:40 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - rtpdtmfmux: Add priority sink pads - -2010-05-07 17:15:47 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpdtmfmux.c: - rtpdtmfmux: Cleanup event function - -2010-05-07 16:42:22 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - * tests/check/elements/rtpmux.c: - rtpmux: Aggregate incoming segments - -2010-05-06 19:09:48 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpdtmfmux.c: - rtpdtmfmux: Update documentation - -2010-05-06 18:10:45 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - rtpmux: Simplify request pad creation - -2010-06-02 12:16:56 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoparse.c: - basevideo: make printf formats portable - -2010-06-02 11:41:25 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - Update Orc requirement to 0.4.4.1 - -2010-06-02 11:31:26 -0700 David Schleef <ds@schleef.org> - - Merge branch 'hacking' - -2010-05-22 18:14:09 -0700 David Schleef <ds@schleef.org> - - * gst/invtelecine/gstinvtelecine.c: - invtelecine: Add verify-field-flags property - When enabled, check that the video matches the field flags on the - incoming buffers. - -2010-05-22 11:36:37 -0700 David Schleef <ds@schleef.org> - - * gst/invtelecine/gstinvtelecine.c: - invtelecine: remove old code - -2010-05-22 11:30:54 -0700 David Schleef <ds@schleef.org> - - * gst/invtelecine/gstinvtelecine.c: - invtelecine: Add 4:2:2 formats - -2010-05-22 00:44:40 -0700 David Schleef <ds@schleef.org> - - * gst/invtelecine/gstinvtelecine.c: - invtelecine: Change format table - Add format name, phase table. - -2010-03-09 12:32:42 -0800 David Schleef <ds@schleef.org> - - * gst/invtelecine/gstinvtelecine.c: - invtelecine: Add multiple pulldown formats - -2010-05-21 23:39:06 -0700 David Schleef <ds@schleef.org> - - * gst/invtelecine/Makefile.am: - * gst/invtelecine/gstinvtelecine.c: - invtelecine: handle different frame sizes - -2010-05-24 12:55:16 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideodecoder: (in vp8) Mark discont buffers - -2010-06-02 05:51:41 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * gst/ivfparse/gstivfparse.c: - ivfparse: Fix format string warning - Fixes #620324 - -2010-06-01 23:50:03 -0700 David Schleef <ds@schleef.org> - - * tests/icles/Makefile.am: - cog: remove old tests - -2010-06-01 23:34:05 -0700 David Schleef <ds@schleef.org> - - * tests/check/Makefile.am: - tests: Add orc tests to check Makefile - -2010-06-01 16:55:17 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/cog/Makefile.am: - * ext/cog/cogframe.c: - * ext/cog/cogvirtframe.c: - * ext/cog/gstcogorc-dist.c: - * ext/cog/gstcogorc-dist.h: - * ext/cog/gstcogorc.orc: - cog: use common/orc.mak - -2010-05-16 10:24:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/schroedinger/gstschroenc.c: - schro: Fix segfault on EOS - -2010-05-14 01:21:08 -0700 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroparse.c: - schro: fix for base video updates - -2010-05-16 10:15:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/dirac/gstdiracenc.cc: - dirac: Fixes for base video encoder changes - -2010-06-01 15:54:51 -0700 David Schleef <ds@schleef.org> - - * ext/vp8/Makefile.am: - * ext/vp8/gst/video/gstbasevideocodec.c: - * ext/vp8/gst/video/gstbasevideocodec.h: - * ext/vp8/gst/video/gstbasevideodecoder.c: - * ext/vp8/gst/video/gstbasevideodecoder.h: - * ext/vp8/gst/video/gstbasevideoencoder.c: - * ext/vp8/gst/video/gstbasevideoencoder.h: - * ext/vp8/gst/video/gstbasevideoparse.c: - * ext/vp8/gst/video/gstbasevideoparse.h: - * ext/vp8/gst/video/gstbasevideoutils.c: - * ext/vp8/gst/video/gstbasevideoutils.h: - * ext/vp8/gst/video/gstvideocompat.c: - * ext/vp8/gst/video/gstvideocompat.h: - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - * gst-libs/gst/video/gstbasevideoparse.c: - * gst-libs/gst/video/gstbasevideoparse.h: - * gst-libs/gst/video/gstbasevideoutils.c: - * gst-libs/gst/video/gstbasevideoutils.h: - basevideo: Move base video from vp8 to gst-libs - -2010-06-01 23:49:31 -0700 David Schleef <ds@schleef.org> - - * common: - Automatic update of common submodule - From 17f89e5 to 47683c1 - -2010-06-01 22:55:11 -0700 David Schleef <ds@schleef.org> - - * common: - Automatic update of common submodule - From fd7ca04 to 17f89e5 - -2010-05-26 06:52:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8utils.h: - vp8: Use VPX_PLANE_* instead of PLANE_* - -2010-05-24 11:04:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8utils.h: - vp8: Add compatilibity defines to work with older versions of libvpx too - -2010-05-23 09:28:13 +0200 Philip Jägenstedt <philipj@opera.com> - - * ext/vp8/gstvp8enc.c: - vp8dec: s/IMG_FMT_I420/VPX_IMG_FMT_I420/ - This corresponds to upstream libvpx commit 6cd4a10e167203d1deb79abf60ee72599e97891b - -2010-05-22 12:55:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Allow a maximum keyframe distance of 0, i.e. all frames are keyframes - -2010-05-22 09:08:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/ivfparse/gstivfparse.c: - ivfparse: Send an initial NEWSEGMENT event - -2010-05-22 09:02:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/ivfparse/Makefile.am: - * gst/ivfparse/gstivfparse.c: - ivfparse: Integrate into the build system - -2010-05-22 08:56:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/ivfparse/gstivfparse.c: - * gst/ivfparse/gstivfparse.h: - ivfparse: Add simple IVF parser - This only supports VP8 so far. - Fixes bug #619158. - -2010-05-22 08:45:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - vp8dec: Set decoder deadline from the QoS information - -2010-06-01 10:18:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * win32/common/config.h: - Back to development - -=== release 0.10.19 === - -2010-05-31 02:10:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-segmentclip.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-vp8.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-zbar.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.10.19 - -2010-05-31 02:10:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2010-05-31 01:52:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/Makefile.am: - docs: add some distclean rules to fix distcheck - Stolen from gtk-doc.m4 and not found in gtk-doc-plugin.m4. We need - them because we do have libs/interfaces stuff as well now (namely - GstPhotography). - -2010-05-31 00:33:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - docs: fix build of gtk-doc scanner - -2010-05-28 16:35:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Move debug output one line above where the packet is still valid - -2010-05-28 15:53:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Correctly ignore non-frame packets from the encoder - Fixes bug #619916. - -2010-05-21 14:01:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegvideoparse/mpegvideoparse.c: - mpegvideoparse: change profile and level strings to something nicer-looking - This is more in line with what we do elsewhere, even if it doesn't - resemble the offical abbreviations exactly. - See #616078. - -2010-05-25 16:37:58 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: plug a few memory leaks - Fixes #619617. - -2010-05-26 14:11:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * win32/common/config.h: - 0.10.18.3 pre-release - -2010-05-26 14:03:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/camerabin.dot: - * docs/plugins/camerabin.png: - * docs/plugins/figures/Makefile.am: - docs: fix dist/distcheck issues with camerabin figures - Move figures into docs/plugins as well, to avoid issues with - make dist and make distcheck (make distdir will not first descend - into child directories). Out-of-source build seems to still work - as well. - -2010-05-26 12:36:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - po: update translations - -2010-05-26 11:55:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From 357b0db to fd7ca04 - -2010-05-07 16:42:12 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - * ext/mplex/Makefile.am: - mplex: add MPLEX_LDFLAGS variable - So mingw32 users can hack around a compiler/linker bug. - Fixes #617145 - -2010-05-25 00:27:17 +0100 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegvideoparse/mpegpacketiser.c: - * gst/mpegvideoparse/mpegvideoparse.c: - mpegvideoparse: fix crash if downstream is unliked - mpeg_packetizer_get_block() in some circumstances (here: if - downstream was unlinked) returns a block but does not set the - buffer causing mpegvideoparse_drain_avail() to cause invalid memory - access. - Fixes #619502. - -2010-05-24 17:41:40 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-app.xml: - * gst-libs/gst/app/.gitignore: - * gst-libs/gst/app/Makefile.am: - * gst-libs/gst/app/gstapp-marshal.list: - * gst-libs/gst/app/gstappbuffer.c: - * gst-libs/gst/app/gstappbuffer.h: - * gst-libs/gst/app/gstappsink.c: - * gst-libs/gst/app/gstappsink.h: - * gst-libs/gst/app/gstappsrc.c: - * gst-libs/gst/app/gstappsrc.h: - * gst/app/Makefile.am: - * gst/app/gstapp.c: - Removing remaining gstapp* - There are some remaining gstapp* living unlinked from the build scripts. - Remove them. - -2010-05-24 19:21:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/Makefile.am: - camerabin: Fix test build - Adds missing -bad cflags to camerabin tests. - -2010-05-23 19:17:41 +0100 Sebastian Pölsterl <sebp@k-d-w.org> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtspacketizer: fix minor memory leak - Don't leak language code. - Fixes #619444. - -2010-05-21 20:48:34 -0700 David Schleef <ds@schleef.org> - - * ext/cog/gstcogcolorspace.c: - cogcolorspace: resample YUV->YUV conversions - Fixes a segfault (bug #618044). - -2010-04-08 16:05:11 +0100 Bastien Nocera <hadess@hadess.net> - - * sys/vcd/vcdsrc.c: - vcdsrc: change VCD URI handler to the DVD scheme - The current URI parsing code doesn't allow setting the "device" - from which the VCD should be read. - Use the same structure as the DVD URI handling instead, so that - devices can be passed in the URI, as well as track number. - Up the rank of the VCD plugin so that it can be auto-plugged and - used by Totem. - https://bugzilla.gnome.org/show_bug.cgi?id=340986 - -2010-05-22 07:44:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gst/video/gstbasevideodecoder.c: - basevideodecoder: Take the frame duration into account when calculating the earliest time - This formula is used in many other elements too. - Fixes bug #619318. - -2010-05-22 07:35:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gst/video/gstbasevideodecoder.c: - basevideodecoder: Reset QoS values when necessary - -2010-05-22 09:35:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Use GST_VIDEO_CAPS_YUV(I420) instead of handwritten I420 caps for the pad template - Fixes bug #619344. - -2010-05-21 20:53:36 +0200 Philip Jägenstedt <philipj@opera.com> - - * ext/vp8/gst/video/gstbasevideodecoder.c: - * ext/vp8/gst/video/gstbasevideodecoder.h: - * ext/vp8/gst/video/gstbasevideoutils.h: - * ext/vp8/gstvp8dec.c: - vp8dec: drop late frames after decoding them - This saves a memcpy, which is always something. - -2010-05-21 21:28:29 +0200 Philip Jägenstedt <philipj@opera.com> - - * ext/vp8/gstvp8enc.c: - vp8enc: threads property - Increasing from 1 to 2 threads on an Thinkpad X60s decreased encode time - in a test from ~24 s to ~19 s, so this is quite useful. - Ideally we should let 0 be the default and automatically match the number - of CPU cores (or something). - -2010-05-21 15:17:46 +0200 Philip Jägenstedt <philipj@opera.com> - - * ext/vp8/gstvp8enc.c: - vp8enc: add mode property to switch between CBR/VBR - Always using CBR when bitrate is used isn't that great, VBR mode - can produce meaningful results too. - -2010-05-21 10:54:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - vp8dec: Only enable postprocessing if the decoder supports it - -2010-05-21 08:23:58 +0200 Philip Jägenstedt <philipj@opera.com> - - * ext/vp8/plugin.c: - vp8: typo: s/HAVE_VP8_DECODER/HAVE_VP8_ENCODER/ - Fixup for bug #619172. - -2010-05-21 08:13:06 +0200 Philip Jägenstedt <philipj@opera.com> - - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - vp8: move #ifdef HAVE_VP8_ENCODER/DECODER - Otherwise we'll try including e.g. <vpx/vp8cx.h> which doesn't exist. - -2010-05-20 16:49:03 +0200 Philip Jägenstedt <philipj@opera.com> - - * configure.ac: - vp8: link with -lm -lpthread when testing for vp8 encoder/decoder - Fixup for bug #619172. - -2010-05-20 20:06:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Write GStreamer element and version in the vorbiscomment vendor string - -2010-05-20 16:49:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - * ext/vp8/plugin.c: - vp8: Only enable the encoder or decoder if it's available in libvpx - Fixes bug #619172. - -2010-05-20 10:19:54 +0200 Philip Jägenstedt <philipj@opera.com> - - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - * ext/vp8/plugin.c: - vp8: exlcude dec/enc based on CONFIG_VP8_DECODER/ENCODER - This may not be very autotoolish, but works with libvpx in the state - that libvpx is actually in. Moved the debug init to the elements - themselves to minimize amount of #ifdefs - -2010-05-20 15:59:57 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * docs/plugins/Makefile.am: - docs: fix html image location for out-of-source build - -2010-05-20 09:24:53 +0200 Philip Jägenstedt <philipj@opera.com> - - * ext/vp8/gstvp8enc.c: - vp8enc: Limit max-latency to 25 to match libvpx - From libvpx/vp8/encoder/onyx_int.h: - #define MAX_LAG_BUFFERS (CONFIG_REALTIME_ONLY? 1 : 25) - While we don't need to be tied to what libvpx does internally, it - doesn't make sense to pretend to support longer frame lags than are - actually possible. - -2010-05-20 09:56:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8utils.c: - vp8: Undef HAVE_CONFIG_H before including libvpx headers - A public libvpx header includes private headers if this is - defined, causing compilation failures because the private headers - are not installed of course. - -2010-05-20 08:53:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Some more minor adjustments for the Ogg mapping - -2010-05-19 17:12:55 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/audiofile/Makefile.am: - * ext/dirac/Makefile.am: - * ext/resindvd/Makefile.am: - * ext/schroedinger/Makefile.am: - * ext/sndfile/Makefile.am: - * gst-libs/gst/app/Makefile.am: - * gst-libs/gst/interfaces/Makefile.am: - * gst-libs/gst/signalprocessor/Makefile.am: - * gst-libs/gst/video/Makefile.am: - * gst/aiff/Makefile.am: - * gst/asfmux/Makefile.am: - * gst/audiobuffer/Makefile.am: - * gst/camerabin/Makefile.am: - * gst/dvdspu/Makefile.am: - * gst/nuvdemux/Makefile.am: - * gst/videomeasure/Makefile.am: - * sys/dvb/Makefile.am: - * sys/dxr3/Makefile.am: - * tests/examples/camerabin/Makefile.am: - Split out GST_PLUGINS_BAD_CFLAGS from GST_CFLAGS - Move include directives for gst-libs into GST_PLUGINS_BAD_CFLAGS, - and fix all the Makefiles that use it. This is so that all the - include directories are added in the proper order: first the - directories in srcdir/builddir, then gst-plugins-base dirs, then - gstreamer dirs. If the order is wrong, installed headers may be - used instead of local headers and/or uninstalled headers from -base. - -2010-05-19 23:02:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - vp8dec: Fix memory leak - -2010-05-19 21:34:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Adjust Ogg mapping for the changes - -2010-05-12 18:50:34 -0700 David Schleef <ds@schleef.org> - - * gst/qtmux/fourcc.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmuxmap.c: - qtmux: Add VP8 - -2010-05-19 18:12:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - vp8dec: Add properties to control the VP8 decoder post processing feature - This is disabled by default for now. - -2010-05-19 17:16:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Rename keyframe-interval to max-keyframe-distance - And use default settings for buffer sizes until we expose this - somehow. - -2010-05-19 17:13:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/Makefile.am: - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - * ext/vp8/gstvp8utils.c: - * ext/vp8/gstvp8utils.h: - vp8: Improve error handling and debug output - -2010-05-19 14:46:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - vp8: Use correct strides and plane offsets for GStreamer - -2010-05-18 14:47:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Implement GstTagSetter interface - -2010-05-18 14:33:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Fix setting of the keyframe flag on encoded frames - -2010-05-18 14:30:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Post an error message on the bus if encoder initialization fails - -2010-05-18 14:28:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - vp8dec: Fix memory leaks and fail if initializing the decoder fails - -2010-05-18 02:44:54 -0700 David Schleef <ds@schleef.org> - - * ext/vp8/gstvp8enc.c: - vp8enc: Set timebase - Also misc cleanup. - -2010-05-16 10:36:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - vp8dec: Fix decoding of invisible frames - -2010-05-14 14:26:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Update the latency when initializing the encoder - -2010-05-14 14:02:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - vp8dec: Correctly initialize stream info before peeking at the stream - Otherwise peeking will fail and we'll get invalid values - -2010-05-14 11:01:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8dec.c: - vp8dec: Make sure to pass a keyframe as first frame to the decoder, copy output frames only once and require width/height/etc on the input caps - -2010-05-14 10:30:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Add support for invisible frames and the Ogg mapping - -2010-05-14 01:14:46 -0700 David Schleef <ds@schleef.org> - - * ext/vp8/gstvp8dec.c: - vp8dec: Fix reset after seeking - Also remove some unused code. - -2010-05-13 21:19:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Set frame numbers as buffer offsets - -2010-05-13 21:18:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Always get as many frames as possible from the encoder - -2010-05-13 21:08:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Fill the oldest pending frame instead of the newest - -2010-05-13 20:20:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/vp8/gstvp8enc.c: - vp8enc: Correctly set delta unit flag for non-keyframes - -2010-05-13 01:04:04 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/Makefile.am: - * ext/vp8/Makefile.am: - * ext/vp8/gst/video/gstbasevideocodec.c: - * ext/vp8/gst/video/gstbasevideocodec.h: - * ext/vp8/gst/video/gstbasevideodecoder.c: - * ext/vp8/gst/video/gstbasevideodecoder.h: - * ext/vp8/gst/video/gstbasevideoencoder.c: - * ext/vp8/gst/video/gstbasevideoencoder.h: - * ext/vp8/gst/video/gstbasevideoparse.c: - * ext/vp8/gst/video/gstbasevideoparse.h: - * ext/vp8/gst/video/gstbasevideoutils.c: - * ext/vp8/gst/video/gstbasevideoutils.h: - * ext/vp8/gst/video/gstvideocompat.c: - * ext/vp8/gst/video/gstvideocompat.h: - * ext/vp8/gstvp8dec.c: - * ext/vp8/gstvp8enc.c: - * ext/vp8/plugin.c: - vp8: Add encoder/decoder - -2010-05-18 21:32:22 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/h264parse/gsth264parse.c: - h264parse: fix wrong timestamps in some cases after seeking. - Reset ->last_outbuf_dts on flush-stop. Fixes #619064. - -2010-05-17 16:26:03 +0100 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: fix memory corruption when parsing adaptation field - -2010-05-17 11:52:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/Makefile.am: - * ext/polyp/Makefile.am: - * ext/polyp/plugin.c: - * ext/polyp/polypsink.c: - * ext/polyp/polypsink.h: - Remove unused polyp audio plugin code - polypaudio was renamed to pulseaudio ages ago. - Fixes #618867. - -2010-05-15 15:37:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - resindvd: Check for dvdnav and dvdread libraries - -2010-05-15 01:18:52 +0200 Benjamin Otte <otte@redhat.com> - - * tests/examples/camerabin/Makefile.am: - examples: Don't install camerabin examples - -2010-05-15 00:19:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * win32/common/config.h: - 0.10.18.2 pre-release - -2010-05-14 18:31:52 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - docs: remove more cruft related to plugins that have been moved to -good - -2010-05-14 18:25:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From 4d67bd6 to 357b0db - -2010-05-14 16:53:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: fix --disable-external - -2010-05-14 01:55:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - build: add old shave files in common to 'cruft' files - -2010-05-13 14:42:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/festival/gstfestival.c: - festival: Only close the connection if it's opened - -2010-05-13 14:41:08 +0200 Ivan Zderadicka <ivan.zderadicka@gmail.com> - - * gst/festival/gstfestival.c: - festival: Don't open an infinite number of connections to the server and close connections - Fixes bug #618527. - -2010-05-13 12:55:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/jack/gstjackaudiosrc.c: - jacksrc: make sure we always read nframes - Error out when we are asked to read a different size that what was configured as - the jack period size because that would mean something else is wrong. - Fixes #618409 - -2010-05-11 17:56:31 -0400 Tristan Matthews <tristan@sat.qc.ca> - - * ext/jack/gstjackaudiosrc.c: - * ext/jack/gstjackaudiosrc.h: - jack: improve process_cb - -2010-05-11 13:52:51 -0400 Joshua M. Doe <joshua.doe@us.army.mil> - - * gst/frei0r/gstfrei0r.c: - * gst/frei0r/gstfrei0r.h: - frei0r: Fix setting of boolean values - Setting boolean type parameters from gst-launch failed because of improper handling of type conversions. - Fixes bug #618388. - -2010-05-12 13:00:16 +0200 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtspacketizer.h: - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: parse TDT table in mpegts. - Some tables in MPEG-TS do not have a crc in the spec, so also mpegtsparse - is not calculating crc for sections with table_id 0x70 - 0x72 because they - do not have a CRC in the spec. See EN300468. Parse Time and Date table and - output bus message. - -2010-05-11 16:03:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - po: remove oss4 strings - -2010-05-11 15:33:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - * configure.ac: - * docs/plugins/inspect/plugin-oss4.xml: - * gst-plugins-bad.spec.in: - * po/POTFILES.in: - * sys/Makefile.am: - * sys/oss4/Makefile.am: - * sys/oss4/oss4-audio.c: - * sys/oss4/oss4-audio.h: - * sys/oss4/oss4-mixer-enum.c: - * sys/oss4/oss4-mixer-enum.h: - * sys/oss4/oss4-mixer-slider.c: - * sys/oss4/oss4-mixer-slider.h: - * sys/oss4/oss4-mixer-switch.c: - * sys/oss4/oss4-mixer-switch.h: - * sys/oss4/oss4-mixer.c: - * sys/oss4/oss4-mixer.h: - * sys/oss4/oss4-property-probe.c: - * sys/oss4/oss4-property-probe.h: - * sys/oss4/oss4-sink.c: - * sys/oss4/oss4-sink.h: - * sys/oss4/oss4-soundcard.h: - * sys/oss4/oss4-source.c: - * sys/oss4/oss4-source.h: - * tests/icles/.gitignore: - * tests/icles/Makefile.am: - * tests/icles/test-oss4.c: - Remove oss4 plugin - It has been moved to gst-plugins-good. - See #614305. - -2010-05-11 14:02:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-imagefreeze.xml: - * gst/imagefreeze/Makefile.am: - * gst/imagefreeze/gstimagefreeze.c: - * gst/imagefreeze/gstimagefreeze.h: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/imagefreeze.c: - Remove imagefreeze plugin/element. - It has been moved to gst-plugins-good. - See #613786. - -2010-05-11 13:15:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/pipelines/tagschecking.c: - tests: don't fail tagschecking test if qtdemux is not available or too old - -2010-05-11 13:08:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstcapssetter.c: - * gst/debugutils/gstcapssetter.h: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/capssetter.c: - Remove capssetter element - It has been moved to gst-plugins-good. - See #617739. - -2010-05-11 10:04:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Check for GTK+ 3.0 and if it's not available for GTK+ 2.0 - -2010-05-11 10:01:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/examples/scaletempo/demo-gui.c: - scaletempo: Don't use deprecated GTK symbols in the demo - -2010-05-07 19:15:31 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: Don't try to re-send the same event more than once - -2010-05-07 22:53:17 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - jpegformat: make the intention of the elements more clear - -2010-05-07 13:57:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - Revert "jifmux: Merge xmp and tagsetter tags." - This reverts commit 4e5c4122349031264bf47e6af9338f8ae0236d5f. - jifmux shouldn't be able to handle jif and shouldn't expect - any xmp on its data. So, no need to handle them. - -2010-05-07 12:42:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - jifmux: Merge xmp and tagsetter tags. - When the current file already has tags, they shouldn't be ignored, - parse them and merge with the tagsetter ones. - -2010-05-07 11:07:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - jifmux: Reject buffers without caps - jifmux expects whole jpeg pictures in buffers, so it should - reject buffers without caps. - -2010-05-07 10:59:22 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - jifmux: Be safe and check bytewriter returns - Check GstByteWriter returns to know when recombining the image - failed and log a warning. - -2010-05-07 10:13:54 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/jpegformat/gstjifmux.c: - jifmux: Avoid adding 2 xmp packets - jifmux was only appending a new xmp packet to the stream, - it should replace if there is already one. - -2010-05-07 10:58:49 +0300 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - docs: add freeze to plugin docs - -2010-05-07 08:12:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * examples/mpts_test2.c: - * tests/examples/mpegtsmux/mpts_test2.c: - mpegtsmux: Move multi-program muxing example at least to the correct directory - But it doesn't work out of the box because of hardcoded paths. - -2010-05-06 13:51:22 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimic: Push out newsegment from current timestamp if the incoming ts is valid - Push out newsegment event with the timestamp from the incoming buffer if - the incoming buffers have a valid timestamp but no valid newsegment event - has been through. - -2010-05-06 22:38:22 +1000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - resindvd: Apply caps to generated buffers - Avoid the new warning from the core about not being able to apply caps - to NAV packet buffers, where resindvdsrc holds a ref. - -2010-05-06 13:12:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/debugutils/gstcapssetter.c: - * gst/debugutils/gstcapssetter.h: - capssetter: Some minor cleanup - -2010-05-06 09:51:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/libmms/gstmms.c: - mmssrc: Use the escaped location for the RTSP redirect message - gst_uri_get_location() unescapes the location, which could result in - an invalid RTSP URI. - -2010-05-06 09:48:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/libmms/gstmms.c: - mmssrc: Check URI for validity and work around URI parsing bugs in libmms - Fixes bug #617650. - -2010-05-06 08:08:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/libmms/gstmms.c: - mmssrc: Some random cleanup - -2010-05-05 12:23:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/imagefreeze/gstimagefreeze.c: - imagefreeze: Set fixed caps on the correct pad - This makes the sink getcaps function actually used instead of using - the fixed caps function for it. - -2010-05-01 12:31:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/examples/camerabin/.gitignore: - Add new camerabin test binary to .gitignore - -2010-05-01 15:00:27 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp.h: - vdpau: fix small typo - -2010-05-01 14:58:30 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdp.h: - vdpau: add leftover gstvdp.h - -2010-05-01 14:45:04 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - vdpauvideopostprocess: fix crasher on setting properties before we're in READY - -2010-04-29 22:43:59 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpoutputsrcpad.c: - vdpau: remove debug code - -2010-04-29 22:24:35 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/gstvdpvideobuffer.c: - * sys/vdpau/gstvdpvideobuffer.h: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideosrcpad.c: - vdpau: small api cleanup - merge gst_vdp_video_buffer_get_allowed_video|yuv_caps into - gst_vdp_video_buffer_get_allowed_caps - -2010-04-22 12:57:30 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp.c: - * sys/vdpau/gstvdpoutputsrcpad.h: - vdpau: small fixes - -2010-04-22 12:52:42 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpau.c: - vdpau: add back gstvdpau.c - -2010-03-17 21:02:07 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp.c: - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdputils.h: - * sys/vdpau/gstvdpvideobuffer.c: - * sys/vdpau/gstvdpvideobuffer.h: - * sys/vdpau/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdpvideosrcpad.h: - vdpau: add gst_vdp_init function where we register types - -2010-03-17 20:59:08 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpoutputbuffer.c: - * sys/vdpau/gstvdpoutputbuffer.h: - * sys/vdpau/gstvdpoutputsrcpad.c: - * sys/vdpau/gstvdpoutputsrcpad.h: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - vdpau: add better error handling to GstVdpOutputSrcPad - gst_vdp_output_src_pad_push, gst_vdp_output_src_pad_alloc_buffer and - gst_vdp_output_src_pad_get_device now take a GError parameter to be able to - signal errors to the caller - -2009-11-28 23:58:57 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdpvideosrcpad.h: - vdpau: make GstVdpVideoSrcPad(Class)? private - -2009-11-28 23:55:09 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - vdpaumpegdec: follow GstVdpVideoSrcPad changes - -2009-11-28 23:52:15 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdpvideosrcpad.h: - vdpau: remove template-caps propery form GstVdpVideoSrcPad - GstVdpVideoSrcPad now use the template property of GstPad instead. Also changed - the _new function to be like gst_pad_new_from_template. - -2010-05-01 01:16:50 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * sys/directdraw/gstdirectdrawsink.c: - * sys/directsound/gstdirectsoundsrc.c: - Fix warnings in directdrawsink and directsoundsrc - Fixes #617331 - -2010-04-30 19:03:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - Bump core/base requirements to released versions - -2010-04-29 16:33:44 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: improve buffer scanning - Specifically, when scanning for entropy data segment length and needing - more data, do not rescan from start next time around, but resume at - last position. - See also #583047. - -2010-04-27 10:48:32 -0400 Tristan Matthews <tristan@tristan-laptop.(none)> - - * ext/jack/Makefile.am: - * ext/jack/gstjackaudiosrc.c: - * ext/jack/gstjackutil.c: - * ext/jack/gstjackutil.h: - jack: implement multichannel support correctly for jackaudiosrc - Fixes parts of bug #616541. - -2010-04-29 13:18:58 +0100 Brian Cameron <brian.cameron@oracle.com> - - * sys/oss4/oss4-sink.c: - * sys/oss4/oss4-sink.h: - oss4sink: implement GstStreamVolume interface and add mute and volume properties - OSS4 supports per-stream volume control, so expose this using the right - API, so that playbin2 and applications like totem can make use of it - (instead of using a volume element for volume control). - Fixes #614305. - -2010-04-29 04:42:21 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * ext/kate/gstkateenc.c: - * ext/kate/gstkatespu.c: - * ext/mpeg2enc/gstmpeg2encoptions.cc: - * ext/timidity/gsttimidity.c: - * gst/dccp/gstdccp.c: - * sys/acmenc/acmenc.c: - * sys/acmmp3dec/acmmp3dec.c: - * sys/wininet/gstwininetsrc.c: - Fix printf format strings for gcc 4.5 - Done on Windows/MinGW. - Fixes #617146 - -2010-04-27 11:21:16 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/jack/gstjackaudiosink.c: - * ext/jack/gstjackaudiosrc.c: - * ext/jack/gstjackringbuffer.h: - jack: remove empty dispose and finalize methods - -2010-04-27 10:59:00 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/jack/gstjackaudiosink.c: - * ext/jack/gstjackaudiosrc.c: - jack: don't leak caps - Add dispose methods to clear caps. - -2010-04-27 10:34:24 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/jack/gstjackaudiosink.c: - * ext/jack/gstjackaudiosrc.c: - jack: don't use GST_DEBUG_FUNCPTR for gobject vmethods - -2010-04-26 15:06:09 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/ladspa/gstladspa.c: - * ext/lv2/gstlv2.c: - ladspa,lv2: don't fail in plugin_init when having 0 elements - If we fail, the plugin scanner will blacklist us. - -2010-04-23 14:41:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From fc85867 to 4d67bd6 - -2010-04-20 16:58:33 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/gstcamerabin.c: - camerabin: add meaningful names for queue elements inside camerabin - -2010-04-20 15:37:03 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: also set short configuration data in codec_data - That is, header configuration may start at Video Object (startcode), - rather than at Visual Object Sequence, which is catered for and parsed, - so let's also take it as codec_data if no more available. - Fixes (remainder of) #572551. - -2010-04-19 19:04:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: Avoid crashing when setting zoom in NULL - Avoid setting zoom in NULL state because the source is not - set yet and this leads to a crash. It is set on READY > PAUSED - anyway. - -2010-04-18 14:51:35 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/mpegvideoparse/mpegpacketiser.c: - * gst/mpegvideoparse/mpegpacketiser.h: - * gst/mpegvideoparse/mpegvideoparse.c: - mpegvideoparse: Export profile and level in caps - This exports profile and level in caps for MPEG 2 streams. - https://bugzilla.gnome.org/show_bug.cgi?id=616078 - -2010-04-16 19:45:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/gstmpegdefs.h: - resindvdbin: Use GST_FLOW_CUSTOM_SUCCESS instead of some integer - Fixes compiler warnings with gcc 4.5. - This is the same as commit 5a51dbd. - -2010-04-16 19:43:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegdefs.h: - mpegdemux: Use GST_FLOW_CUSTOM_SUCCESS instead of some integer - Fixes compiler warning with gcc 4.5. - -2010-04-16 19:42:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - Revert "mpegpsdemux: Workaround new gcc 4.5 compiler warning" - This reverts commit a331228eccfb8c66493fa3c8c49338c79cf4642c. - -2010-04-16 19:41:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/gstmpegdemux.c: - Revert "resindvdbin: Apply gcc 4.5 compiler warning workaround to the mpegpsdemux copy" - This reverts commit 65b0f75d1b3119316b2dcaf5bff4dfd2bd824cc1. - -2010-04-15 21:44:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/metadata/metadataexif.c: - metadata: Another workaround for enum values that are not actually member of the enum - -2010-04-15 21:40:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/gstmpegdemux.c: - resindvdbin: Apply gcc 4.5 compiler warning workaround to the mpegpsdemux copy - Same as a331228eccfb8c66493fa3c8c49338c79cf4642c. - -2010-04-15 21:38:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/vdpau/gstvdpvideopostprocess.c: - vdpau: Initialize possibly uninitialized variable - -2010-04-15 21:35:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Actually compare the state and not the state change return from _get_state() - -2010-04-15 21:26:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: Workaround new gcc 4.5 compiler warning - gcc 4.5 warns when comparing some integer with an enum value, in - the case of GstFlowReturn this is valid though. We should later - add GST_FLOW_CUSTOM_OK1, GST_FLOW_CUSTOM_OK2, etc. after new core - is released. - -2010-04-15 20:50:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/cdxaparse/gstcdxaparse.c: - cdxaparse: Compare the correct variable to GST_SEEK_TYPE_SET - -2010-04-15 07:24:16 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * configure.ac: - configure: Drop -Wcast-align - Commit message copied from core's commit from Benjamin Otte: - 246f5dba96a5b50bb74621af67b30942cca72af5 - Apparently gcc warns that GstMiniObject is not castable to - GstEvent/Message/Buffer due to them containing 64bit variables, even - though ARM hackers claim that those only need 4byte alignment. And as - long as gcc behaves that way, this warning is not very useful. - So we'll remove the warning until this problem is fixed. - Fixes #615698 - -2010-04-15 13:20:42 +0300 Adam Endrodi <adam.endrodi@blumsoft.eu> - - * gst/camerabin/gstcamerabin.c: - camerabin: reset software zooming if not set by the photo interface - Otherwise both software (videoscal+videocrop) and hardware zooming would be used. - -2010-04-14 16:42:57 -0700 David Schleef <ds@schleef.org> - - * gst/invtelecine/gstinvtelecine.c: - invtelecine: Fix up element details - -2010-04-14 16:32:34 -0700 David Schleef <ds@schleef.org> - - * Makefile.am: - * configure.ac: - * tools/Makefile.am: - * tools/base.c: - * tools/element-maker: - * tools/gobject.c: - * tools/gstaudiofilter.c: - * tools/gstaudiosink.c: - * tools/gstaudiosrc.c: - * tools/gstbaseaudiosink.c: - * tools/gstbaseaudiosrc.c: - * tools/gstbasertpdepayload.c: - * tools/gstbasertppayload.c: - * tools/gstbasesink.c: - * tools/gstbasesrc.c: - * tools/gstbasetransform.c: - * tools/gstcddabasesrc.c: - * tools/gstelement.c: - * tools/gstpushsrc.c: - * tools/gsttagdemux.c: - * tools/gstvideosink.c: - tools: Add element-maker - Add a script that creates elements based on any of the GStreamer - base classes. It isn't very user friendly at the moment, one - needs to edit the script to make it work properly. Each base class - has a template file describing what to put into the constructed - element. Eventually, these templates should be moved to reside - with the base class source and installed to a well-known directory, - where an installed script could find them. - The template files use the .c ending so editors know they are C - source, but gst-indent doesn't handle them correctly. So they - need to be committed with -n. Ugh. I'll try to figure out a fix - for that soon. - -2010-04-13 20:32:50 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - * gst/camerabin/gstcamerabinphotography.c: - camerabin: Add video-capture-width/height/framerate properties - Adds video-capture-width, video-capture-height and - video-capture-framerate properties to allow applications to - get/set those values. Getting was not possible before this patch, - and setting was done through the set-video-resolution-fps - action, which sets the properties and promptly resets the - video source to use them. - Fixes #614958 - -2010-04-13 18:33:40 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: Adds image-capture-width/height properties - Adds image-capture-width and image-capture-height properties - to camerabin, allowing the user to get/set them. Getting was - not possible before and setting was done through the - set-image-resolution action, which shouldn't now just set - the properties. - Fixes #614958 - -2010-04-13 15:59:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst-libs/gst/interfaces/photography.c: - * gst/camerabin/gstcamerabin.c: - camerabin: photography: Spring G_PARAM_STATIC_STRINGS - Sprinkle some G_PARAM_STATIC_STRINGS over the properties - in GstPhotography interface and in camerabin - -2010-03-02 14:04:44 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - * tests/check/elements/camerabin.c: - camerabin: add block-after-capture property for viewfinder blocking - Adds block-after-capture property to block running viewfinder after capturing. - This property is useful if application wants to display capture preview and avoid - running viewfinder on background. - Based on a patch by Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - -2010-02-09 14:52:49 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * tests/examples/camerabin/gst-camerabin-test.c: - examples: camerabin: add viewfinder-filter and filter caps properties - Adds support for setting filter-caps and viewfinder-filter - properties in the gst-camerabin-test application - -2010-01-26 15:18:24 +0200 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabinphotography.c: - * tests/check/elements/camerabin.c: - GstPhotography: Add flicker and focus mode settings to photography API - Adds flicker and focus mode settings to photography API and also - implement it in camerabin. - -2009-11-26 12:12:06 +0200 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * tests/examples/camerabin/Makefile.am: - * tests/examples/camerabin/gst-camerabin-test.c: - camerabin: add gst-camerabin-test command line test tool - gst-camerabin-test tool can be used to capture still images and - video clips using camerabin element. - -2009-11-16 15:02:03 +0200 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * gst/camerabin/camerabinimage.c: - camerabin: do not set imagebin sinkpad twice - If we already have a sinkpad, do not get a new one - -2009-11-16 15:13:31 +0200 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * tests/check/elements/camerabin.c: - camerabin: update unit tests - Add testing of setting and getting of camerabin property elements and - add post-processing elements to pipeline. - -2009-11-13 16:42:44 +0200 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * tests/check/elements/camerabin.c: - camerabin: add unit tests for setting different flags when capturing - Adds some tests that use flags for capturing to asure it works - with flags set or not. - -2009-10-28 17:37:56 +0200 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * tests/check/elements/camerabin.c: - camerabin: add paused video capture file validity check in unit test - Also check that the file captured in the paused capture unit test is - playable. - -2009-10-19 14:31:54 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - * tests/check/elements/camerabin.c: - camerabin: add viewfinder-filter property - Adds a new property called viewfinder-filter to camerabin. - This property is used to add a filter to process the video - flow right before the viewfinder sink. - Also updates test to check property exists. - -2009-10-21 18:02:27 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * tests/check/elements/camerabin.c: - camerabin: set videotestsrc pattern to white in unit test - Lower complexity of encoding and videotestsrc redrawing in order - to prevent unit test timeouts. - -2009-10-14 14:01:34 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: proxy video source photography interface property notify signals - If photography interface properties change in video source, notify the - application by emitting notify for respective camerabin properties. - -2009-10-14 14:42:01 +0300 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * tests/check/elements/camerabin.c: - camerabin: New unit tests - Add unit tests for camerabin properties setting and getting, - adds one for video capturing with pause. - Also does some c99 variable declaration fixes. - -2009-10-14 14:01:05 +0300 Shenghua Liu <EXT-Liu.shenghua@nokia.com> - - * tests/check/elements/camerabin.c: - camerabin: update unit test to have test on recording snapshot preview - Adds a small check to verify that the preview image message is - being sent on video recording. - -2009-09-21 17:47:20 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabinphotography.c: - camerabin: add api to query supported image capture resolution - Adds new property 'image-capture-supported-caps' to GstPhotography - to query the supported image capture caps. - Also implement it in camerabin. - -2009-07-02 18:03:57 +0300 René Stadler <rene.stadler@nokia.com> - - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinimage.h: - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/camerabinvideo.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: rename function and variable names, update documentation - Get rid of user_* prefix internally, use app_* instead. - -2009-09-16 15:11:49 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: add video-source-filter property - Add video-source-filter property that can be used to inject application - specific gstreamer element to camerabin pipeline. The video-source-filter - element will process all frames coming from video source. - One could add image analyzers to collect information about the stream, - or add image enhancers to improve capture quality, for example. - -2010-04-12 18:07:29 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/check/elements/aacparse.c: - * tests/check/elements/amrparse.c: - check: Don't re-declare 'GList *buffers' in the tests - It's an external which lives in gstcheck.c. Redeclaring it makes some - compilers/architectures think the 'buffers' in the individual tests are - a different symbol... and therefore we end up comparing holodecks with - oranges. - -2010-02-18 18:19:50 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: don't try adapting image capture resolution if no source-resize flag - If source-resize flag is disabled then set resolution to image capture caps - according to capture resolution video source element produces. Otherwise we - write wrong resolution to image metadata. - -2010-01-05 15:13:02 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: Fix capturing flag handling after image has been captured - Make sure capturing flag is unset and image-captured message is sent - before sending eos event to image bin and saving the image to a file. - -2009-11-04 13:24:13 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: fix setting filter-caps property in NULL state - Split _set_capsfilter_caps() into two parts so that we can call one part - regardless of the element state. - -2009-09-11 09:38:51 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: improve image done signal emission - Use g_idle_add_full() with G_PRIORITY_HIGH to emit image done signal, - g_idle_add() is more likely to starve with higher priority events. - -2010-04-12 12:42:06 +0200 Edward Hervey <bilboed@bilboed.com> - - * configure.ac: - configure: Remove -Wundef flag - Same fix as for #615161 - -2010-04-12 09:16:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/vdpau/Makefile.am: - vdpau: Correctly link to the local libgstvdp-0.10 by using the libtool archive - -2010-04-09 09:14:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/Makefile.am: - tests: camerabin: enable camerabin tests - Re-enabling camerabin tests, they are passing. - -2010-04-09 11:22:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From fdf023d to fc85867 - -2010-04-08 12:00:10 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/check/elements/jpegparse.c: - tests: Fix compilation error on macosx - -2010-04-08 10:45:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/oss4/oss4-audio.c: - oss4: 8-bit PCM audio caps don't need an endianness field - -2010-04-08 10:40:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/oss4/oss4-audio.c: - oss4: don't iterate the formats table twice for each entry - When iterating the formats table, we can just pass the whole - entry to our helper function, which avoids iterating the table - again to find the entry structure from the passed format id. - -2010-03-30 11:43:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/oss4/oss4-audio.c: - oss4: also accept formats not natively supported - Also accept formats that are not natively supported by the - hardware, OSS4 can convert them internally. List the native - formats first in the caps though, to express our preference - for the native formats. We need this in order to support the - case properly where the audio hardware supports only e.g. - little endian PCM, but the host is big endian, since many - audio elements only support native endianness and make the - reasonable assumption that any audiosink will be able to - handle audio in native endianness. - Based on patch by Jerry Tan <jerry.tan@sun.com> - Fixes #614317. - -2010-04-08 08:48:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/soundtouch/Makefile.am: - soundtouch: use $(LIBM) in Makefile.am instead of -lm - -2010-04-08 01:42:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/invtelecine/gstinvtelecine.c: - invtelecine: fix print format in debug message - -2010-04-08 01:41:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: pass constant string as format string to printf - Fix compiler warning about non-string literal being passed as - first argument to print. - -2010-03-26 18:56:49 +0000 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: Don't emit bitrate tags too early - We wait to parse a minimum number of frames (10, arbitrarily) before - emiting bitrate tags so that our early estimates are not wildly - inaccurate for streams that start with a silence. If the stream ends - before that, we just emit the tags anyway. - While it _would_ be nicer to be specify the threshold to start pushing - the tags in terms of duration, this would introduce more complexity than - this merits. - https://bugzilla.gnome.org/show_bug.cgi?id=614991 - -2010-04-07 11:22:43 +0200 Benjamin Otte <otte@redhat.com> - - * ext/metadata/metadataexif.c: - metadata: fix crash when converting units - x/y-resolution are fractions, so setting them using float values is not - a good idea. - https://bugzilla.redhat.com/show_bug.cgi?id=577655 - -2010-04-05 10:33:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Add support for BlueRay style DTS - Fixes bug #614259. - -2010-04-04 20:23:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegdefs.h: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Add support for the two DTS HD stream types - Fixes bug #614259. - -2010-04-02 19:52:25 +0200 Sebastian Pölsterl <sebp@k-d-w.org> - - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtspacketizer.h: - mpegtspacketizer: Additionally use the CRC to check if tables are duplicates - The current code just uses table id, subtable extension and version number to - check if the section has been seen before. However, this comparison is not - sufficient, causing actually new tables being dismissed. - Fixes bug #614479. - -2010-04-02 19:48:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: Correctly clean up internal state for reuse - Fixes bug #614591. - -2010-04-02 19:19:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: Make sure that the buffer metadata is writable before setting caps - Fixes bug #614349. - -2010-04-02 19:09:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Use uint instead of int for frequency and symbol-rate properties - The kernel API specifies them as uint32 and frequencies/symbol-rates greater - than 2^31 are actually needed sometimes. - Fixes bug #614475. - -2010-03-30 01:17:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - * ext/Makefile.am: - * gst/Makefile.am: - * sys/Makefile.am: - build: build plugins and examples in parallel where possible, if make -jN is used - -2010-03-30 01:16:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - po: update for string changes and new comment - -2010-03-30 01:14:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/oss4/oss4-mixer.c: - oss4: add comment for translators - Not that that will make these strings much better. Also remove i18n - marker where it doesn't make sense. - -2010-03-27 09:46:30 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/qtmux/gstqtmuxplugin.c: - qtmux: use GStreamer package name and origin in the plugin info - -2010-03-29 14:49:06 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: fix writing NALU prefix for byte-stream output format - Specifically, input may already be in byte-stream format, so sync - bytes should not be misinterpreted as NALU size. - -2010-03-29 10:00:57 +1100 Jan Schmidt <thaytan@noraisin.net> - - * ext/spc/gstspc.h: - openspc: Fix build warning - Add a prototype for gst_spc_dec_get_type - -2010-03-26 18:58:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - * gst/audioparsers/gstflacparse.h: - flacparse: Optionally check the overall frame checksums too before accepting a frame as valid - This is optional because it's a quite expensive operation and it's very - unlikely that a non-frame is detected as frame after the header CRC check - and checking all bits for valid values. The overall frame checksums are - mainly useful to detect inconsistencies in the encoded payload. - -2010-03-26 18:42:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: Check the CRC-8 of the headers before accepting a frame as valid - This makes false-positives during seeking much less likely and detection of - them much faster. - -2010-03-26 18:20:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: Set the last stop to the buffer starttime if the duration is invalid - ...instead of not setting it at all. - -2010-03-26 18:19:00 +0100 Joshua M. Doe <josh@joshdoe.com> - - * gst/audioparsers/gstbaseparse.c: - baseparse: Send NEWSEGMENT event with correct start and position - Instead of taking the last stop (which could be buffer endtime instead - of starttime) always take the buffer starttime. - Fixes bug #614016. - -2010-03-26 16:49:01 +0000 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: Fix buffer refcount issue - When called from the GST_FLAC_PARSE_STATE_HEADERS case, - gst_flac_parse_hand_headers() does a gst_buffer_set_caps() on a buffer - with refcount > 1. This change handles this case by making the buffer - metadata_Writable. - https://bugzilla.gnome.org/show_bug.cgi?id=614037 - -2010-03-26 12:04:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: add missing space to debug message - -2010-03-26 08:41:46 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: don't use function that doesn't exist - Fixes the build. - -2010-03-25 23:48:09 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/divx/gstdivxdec.c: - * ext/divx/gstdivxenc.c: - divx: add const to fix compiler warnings - -2010-03-25 23:30:29 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: add boolean return to _process - Avoid trying to push results if processing failed anyway. - -2010-03-25 23:28:25 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: remove useless g_assert - g_malloc and co would terminate when out of memory. No need to check after it. - -2010-03-25 23:24:36 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: add more logging - -2010-03-25 23:12:37 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: register function pointers just once - Avoid re-registering those for each wrapped ladpsa/lv2 element. - -2010-03-25 23:07:46 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: add rate to caps - -2010-03-25 23:04:41 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: rename log category to be less ambigous - -2010-03-25 22:59:18 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/README: - lv2: add more examples - -2010-03-25 22:58:47 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/dtmf/gstdtmfdetect.c: - dtmfdetect: if we tell that we handle gap flags, then do so - -2010-03-25 22:55:32 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/dtmf/gstdtmfdetect.c: - dtmfdetect: use glib types - -2010-03-25 22:54:49 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/dtmf/gstdtmfdetect.c: - dtmfdetect: fix classification - -2010-03-25 22:53:20 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/dtmf/gstdtmfdetect.c: - dtmfdetect: reformat message docs - Use a list like in other element docs as an untweaked docbook table look ugly. - -2010-03-25 17:09:17 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - audioparsers: remove unused GstBaseParseClassPrivate structure - -2010-03-25 12:55:02 +0000 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: Make bitrate estimation more accurate - This implements the get_frame_overhead() vfunc so that baseparse can - make more accurate bitrate estimates. - -2010-03-25 11:48:46 +0000 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - aacparse: Fix bitrate calculation - This patch adds the get_frame_overhead() vfunc so that baseparse can - accurately calculate the min/avg/max bitrates for aacparse. - Note: The bitrate was being incorrectly calculated for ADTS streams - (it's not in the header as the code suggests). - -2010-03-25 11:22:58 +0000 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - audioparsers: Add bitrate calculation to baseparse - This makes baseparse keep a running average of the stream bitrate, as - well as the minimum and maximum bitrates. Subclasses can override a - vfunc to make sure that per-frame overhead from the container is not - accounted for in the bitrate calculation. - We take care not to override the bitrate, minimum-bitrate, and - maximum-bitrate tags if they have been posted upstream. We also - rate-limit the emission of bitrate so that it is only triggered by a - change of >10 kbps. - -2010-03-23 17:34:30 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/pipelines/tagschecking.c: - tests: tagschecking: New tags tests - Adds new tags checking tests. - -2010-03-25 00:20:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: init debug category before using it - -2010-03-24 18:54:57 +0100 Edward Hervey <bilboed@bilboed.com> - - * common: - Automatic update of common submodule - From 55cd514 to c1d07dd - -2010-03-24 17:05:14 +0100 Andoni Morales <ylatuya@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowvideosrc: Add support for YUY2 input format - Fix bug #613708 - -2010-03-24 16:15:37 +0200 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.types: - * gst-libs/gst/interfaces/photography.c: - docs: add photography iface to docs - We normaly have separate libs docs, not done becasue of lazyness here yet. - -2010-03-24 16:05:20 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/jpegformat/gstjpegparse.c: - jpegformat: add blank line to fix generated xml - -2010-03-24 15:59:53 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/jack/gstjackaudiosrc.c: - jack: fix element name in section doc blob - -2010-03-24 15:05:50 +0100 Benjamin Otte <otte@redhat.com> - - * ext/modplug/gstmodplug.cc: - modplug: Define WORDS_BIGENDIAN to avoid undefined warning - https://bugzilla.gnome.org/show_bug.cgi?id=613795 - -2010-03-24 12:16:07 +0100 Benjamin Otte <otte@redhat.com> - - * configure.ac: - Use pkgconfig to detect dvdnav - The previously used dvdnav-config script was broken in a lot of distros. - -2010-03-24 00:27:34 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - kate: fix yet another compiler warning - -2010-03-23 19:56:48 -0400 Tristan Matthews <tristan@sat.qc.ca> - - * gst/pnm/gstpnmdec.c: - * sys/osxvideo/osxvideosrc.c: - * sys/qtwrapper/audiodecoders.c: - * sys/qtwrapper/codecmapping.c: - * sys/qtwrapper/qtutils.c: - * sys/qtwrapper/qtutils.h: - osx: more compiler warning fixes - Avoid new warnings. - Fixes #613758. - -2010-03-23 14:15:53 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/faac.c: - tests: faac: Fix build - Fixes build of faac due to functions not being static nor - having being declared in headers. (No previous prototype error) - Probably due to added -Wmissing-prototypes - -2010-03-23 11:10:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/amrwbenc/gstamrwbenc.c: - amrwbenc: Fix compiler warning - -2010-03-23 09:14:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/cog/cog.orc: - cog: touch cog.orc to force regeneration of cogorc.ch - .. with new Makefile.am rules, which should fix the build - without the need to do a 'manual' make clean after updating. - -2010-03-23 01:41:31 +0100 Benjamin Otte <otte@redhat.com> - - * sys/wininet/gstwininetsrc.c: - wininet: Fix warnings - -2010-03-23 01:30:54 +0100 Benjamin Otte <otte@redhat.com> - - * sys/directdraw/gstdirectdrawsink.c: - directdraw: Fix warnings - -2010-03-23 01:15:27 +0100 Benjamin Otte <otte@redhat.com> - - * configure.ac: - Remove -Wundef for Windows - Windows headers tend to check _MSC_VER uncondtionally in some places, - but use #ifdef _MSC_VER in other places. - -2010-03-23 01:14:33 +0100 Benjamin Otte <otte@redhat.com> - - * configure.ac: - Add a bunch of warning flags - None of them trigger any warning - -2010-03-23 01:11:42 +0100 Benjamin Otte <otte@redhat.com> - - * gst/aiff/aiffmux.c: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfobjects.c: - * gst/asfmux/gstasfobjects.h: - * gst/dccp/gstdccp.c: - Fixes for -Waggregate-return - The flag wasn't added due to libexif using aggregate return values. - -2010-03-22 18:02:39 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/gettext.h: - * gst/videomeasure/gstvideomeasure.c: - i18n: build fixes: #if -> #ifdef for ENABLE_NLS - -2010-03-22 18:01:27 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/gst-i18n-plugin.h: - i18n: fix the build - Don't include locale.h which we include in gettext.h if needed. Guard the - include like we do in the simillar headers in core. - -2010-03-22 16:56:03 +0100 Benjamin Otte <otte@redhat.com> - - * configure.ac: - * ext/jack/gstjackaudiosrc.c: - * ext/neon/gstneonhttpsrc.c: - * ext/timidity/gstwildmidi.c: - * gst/librfb/d3des.c: - * gst/mpegdemux/gstmpegdesc.c: - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegpsmux/psmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/qtmux/atoms.c: - * tests/check/elements/amrparse.c: - * tests/check/elements/capssetter.c: - * tests/check/generic/states.c: - * tests/examples/camerabin/gst-camera.c: - * tests/examples/directfb/gstdfb.c: - * tests/icles/metadata_editor.c: - Add -Wold-style-definition - and fix the warnings - -2010-03-22 16:21:31 +0100 Benjamin Otte <otte@redhat.com> - - * configure.ac: - * gst/mxf/mxfmux.c: - Add -Wformat-nonliteral -Wformat-security flags - and fix the warnings - -2010-03-22 16:13:12 +0100 Benjamin Otte <otte@redhat.com> - - * sys/oss4/oss4-mixer.c: - oss4: Refactor code to make it look more modern - A side effect is that it passes -Wformat-nonliteral and doesn't read - invalid memory in some cases, like when the mixer track contains - a % sign or there is a number but not a known mixer name. - -2010-03-22 14:09:24 +0100 Benjamin Otte <otte@redhat.com> - - * sys/oss4/oss4-mixer.c: - oss4: Avoid g_quark_to_string (g_quark_from_string ()) madness - We to the strdup inside gst_oss4_mixer_control_get_translated_name() - instead of in the only caller. - -2010-03-22 13:50:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/ladspa/gstladspa.c: - ladspa: Fix compiler warnings - -2010-02-02 15:49:29 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk> - - * gst/mpegvideoparse/mpegpacketiser.c: - * gst/mpegvideoparse/mpegpacketiser.h: - * gst/mpegvideoparse/mpegvideoparse.c: - mpegvideoparse: Parse bitrate and emit as tag - This patch picks up the bitrate for the stream from the MPEG sequence - header and emits it as a tag on the source pad. - Fixes #599298. - -2010-03-22 12:38:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/soundtouch/gstbpmdetect.cc: - soundtouch: build fixes: #if -> #ifdef - -2010-03-22 13:16:33 +0100 Benjamin Otte <otte@redhat.com> - - * configure.ac: - * ext/cdaudio/gstcdaudio.c: - * ext/directfb/dfbvideosink.c: - * ext/jp2k/gstjasperdec.c: - * ext/jp2k/gstjasperenc.c: - * ext/libmms/gstmms.c: - * ext/metadata/gstbasemetadata.c: - * ext/metadata/gstmetadatademux.c: - * ext/metadata/gstmetadatamux.c: - * ext/mythtv/gstmythtvsrc.c: - * ext/neon/gstneonhttpsrc.c: - * ext/resindvd/resindvdbin.c: - * ext/timidity/gsttimidity.c: - * ext/xvid/gstxvid.c: - * ext/xvid/gstxvid.h: - * gst/adpcmenc/adpcmenc.c: - * gst/dataurisrc/gstdataurisrc.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/festival/gstfestival.h: - * gst/id3tag/id3tag.c: - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mxf/mxftypes.c: - * gst/qtmux/atoms.c: - * gst/qtmux/gstqtmuxmap.h: - * gst/real/gstrealaudiodec.c: - * gst/real/gstrealvideodec.c: - * gst/sdp/gstsdpdemux.c: - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/parsechannels.c: - * sys/vcd/vcdsrc.c: - * tests/check/elements/asfmux.c: - * tests/check/elements/autoconvert.c: - * tests/check/elements/mplex.c: - * tests/check/elements/qtmux.c: - * tests/check/elements/selector.c: - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin/gst-camera.h: - * tests/examples/scaletempo/demo-gui.c: - * tests/examples/scaletempo/demo-main.c: - Add -Wwrite-strings - and fix its warnings - -2010-03-22 12:30:01 +0100 Benjamin Otte <otte@redhat.com> - - * configure.ac: - * ext/ladspa/gstladspa.c: - * ext/mpeg2enc/gstmpeg2encoptions.cc: - * gst/nsf/fmopl.h: - * tests/check/pipelines/metadata.c: - Add -Wundef - and fix the warnings - -2010-03-22 12:03:56 +0100 Benjamin Otte <otte@redhat.com> - - * tests/check/pipelines/.gitignore: - Update .gitignore - -2010-03-22 12:02:16 +0100 Benjamin Otte <otte@redhat.com> - - * configure.ac: - * ext/apexsink/gstapexsink.c: - * ext/cdaudio/gstcdaudio.c: - * ext/dc1394/gstdc1394.c: - * ext/jp2k/gstjasperdec.c: - * ext/jp2k/gstjasperenc.c: - * ext/kate/gstkatetag.c: - * ext/metadata/gstmetadatademux.c: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/metadataparseutil.h: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * gst/camerabin/gstcamerabin.c: - * gst/cdxaparse/gstcdxaparse.c: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/freeze/gstfreeze.c: - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - * gst/librfb/gstrfbsrc.c: - * gst/mpegdemux/mpegtspacketizer.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - * gst/sdp/gstsdpdemux.c: - * gst/subenc/gstsrtenc.c: - Add -Wredundant-decls flag - and fix warnings from it - -2010-03-22 08:47:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/gme/gstgme.h: - gme: Fix compiler warning - -2010-03-22 08:45:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpoutputbuffer.c: - * sys/vdpau/gstvdpoutputbuffer.h: - * sys/vdpau/gstvdpoutputsrcpad.h: - vdpau: Fix compiler warnings - -2010-03-21 23:10:08 +0100 Benjamin Otte <otte@redhat.com> - - * ext/cog/Makefile.am: - * ext/cog/cogvirtframe.c: - * ext/cog/generate_tables.c: - * ext/cog/gstcogmse.c: - * ext/cog/gstcogutils.c: - orc: Fix warnings - -2010-03-21 23:00:48 +0100 Benjamin Otte <otte@redhat.com> - - * tests/examples/scaletempo/demo-gui.c: - examples: Fix warnings - -2010-03-21 22:48:13 +0100 Benjamin Otte <otte@redhat.com> - - * sys/directdraw/gstdirectdrawsink.c: - directdraw: Fix warnings - -2010-03-21 22:46:00 +0100 Benjamin Otte <otte@redhat.com> - - * tests/examples/camerabin/Makefile.am: - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin/gst-camera.h: - gst-camera: Add a header declaring the functions from the ui file - -2010-03-21 22:10:47 +0100 Benjamin Otte <otte@redhat.com> - - * tests/icles/Makefile.am: - * tests/icles/metadata_editor.h: - tests: Add file I forgot to check in - -2010-03-21 22:09:20 +0100 Benjamin Otte <otte@redhat.com> - - * sys/acmmp3dec/acmmp3dec.c: - acmmp3dec: fix warnings - -2010-03-21 21:53:44 +0100 Benjamin Otte <otte@redhat.com> - - * sys/acmenc/acmenc.c: - Fix acmenc for warning flags - -2010-03-21 21:39:18 +0100 Benjamin Otte <otte@redhat.com> - - * configure.ac: - * ext/cdaudio/gstcdaudio.c: - * ext/dc1394/gstdc1394.c: - * ext/dirac/gstdiracenc.cc: - * ext/flite/gstflitetestsrc.c: - * ext/jack/gstjack.h: - * ext/metadata/gstmetadata.c: - * ext/metadata/gstmetadatademux.h: - * ext/metadata/gstmetadatamux.h: - * ext/mythtv/gstmythtvsrc.c: - * ext/resindvd/resindvdsrc.c: - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroparse.c: - * ext/schroedinger/gstschroutils.c: - * ext/sdl/sdlaudiosink.c: - * gst-libs/gst/video/gstbasevideoutils.c: - * gst/adpcmdec/adpcmdec.c: - * gst/adpcmenc/adpcmenc.c: - * gst/aiff/aiffmux.c: - * gst/asfmux/gstasfmux.c: - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautoconvert.h: - * gst/bayer/gstbayer2rgb.c: - * gst/dccp/gstdccp.c: - * gst/dtmf/gstrtpdtmfdepay.h: - * gst/dvdspu/gstdvdspu.c: - * gst/invtelecine/gstinvtelecine.c: - * gst/legacyresample/resample.c: - * gst/legacyresample/resample.h: - * gst/librfb/rfbdecoder.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdesc.h: - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtspacketizer.h: - * gst/mpegdemux/mpegtsparse.h: - * gst/mpegvideoparse/mpegpacketiser.c: - * gst/mpegvideoparse/mpegvideoparse.h: - * gst/mve/gstmvedemux.c: - * gst/mve/gstmvedemux.h: - * gst/mve/gstmvemux.c: - * gst/mve/gstmvemux.h: - * gst/mve/mveaudiodec.c: - * gst/mve/mveaudioenc.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmpeg.c: - * gst/nsf/nes_apu.c: - * gst/nsf/nsf.c: - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/atomsrecovery.c: - * gst/qtmux/descriptors.c: - * gst/sdp/gstsdpdemux.c: - * gst/siren/common.c: - * gst/siren/common.h: - * gst/siren/dct4.c: - * gst/siren/dct4.h: - * gst/siren/huffman.c: - * gst/siren/huffman.h: - * gst/siren/rmlt.c: - * gst/siren/rmlt.h: - * gst/tta/gstttadec.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/vmnc/vmncdec.c: - * sys/dvb/cam.c: - * sys/dvb/cam.h: - * sys/dvb/camapplicationinfo.c: - * sys/dvb/camapplicationinfo.h: - * sys/dvb/camconditionalaccess.c: - * sys/dvb/camconditionalaccess.h: - * sys/dvb/camdevice.c: - * sys/dvb/camdevice.h: - * sys/dvb/camresourcemanager.c: - * sys/dvb/camresourcemanager.h: - * sys/dvb/camsession.c: - * sys/dvb/camswclient.c: - * sys/dvb/camswclient.h: - * sys/dvb/camtransport.c: - * sys/dvb/dvbbasebin.h: - * sys/dvb/parsechannels.c: - * sys/oss4/oss4-mixer.c: - * sys/vcd/vcdsrc.h: - * tests/check/elements/aacparse.c: - * tests/check/elements/amrparse.c: - * tests/check/elements/asfmux.c: - * tests/check/elements/assrender.c: - * tests/check/elements/autoconvert.c: - * tests/check/elements/camerabin.c: - * tests/check/elements/faad.c: - * tests/check/elements/imagefreeze.c: - * tests/check/elements/jpegparse.c: - * tests/check/elements/mpeg2enc.c: - * tests/check/elements/mplex.c: - * tests/check/elements/ofa.c: - * tests/check/elements/qtmux.c: - * tests/check/elements/rtpmux.c: - * tests/check/elements/selector.c: - * tests/check/elements/timidity.c: - * tests/check/generic/states.c: - * tests/check/pipelines/metadata.c: - * tests/check/pipelines/tagschecking.c: - * tests/icles/metadata_editor.c: - Add -Wmissing-declarations -Wmissing-prototypes to configure flags - And fix all warnings - -2010-03-21 21:37:37 +0100 Benjamin Otte <otte@redhat.com> - - * gst/siren/common.c: - * gst/siren/dct4.c: - * gst/siren/decoder.c: - * gst/siren/encoder.c: - * gst/siren/huffman.c: - * gst/siren/rmlt.c: - siren: Run gst-indent script - Includes running dos2unix on decoder.c - -2010-03-21 21:29:47 +0100 Benjamin Otte <otte@redhat.com> - - * tests/check/elements/kate.c: - tests: Fix kate test - It was failing due to the new buffer_metadata_writable checks added to - the core recently. - -2010-03-21 18:59:30 +0100 Benjamin Otte <otte@redhat.com> - - * gst/legacyresample/Makefile.am: - * gst/legacyresample/resample_chunk.c: - legacyresample: remove unused file - -2010-03-21 17:54:26 +0100 Benjamin Otte <otte@redhat.com> - - * configure.ac: - configure: s/GST_CVS/GST_GIT/ - -2010-03-19 16:47:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/cog/generate_tables.c: - cog: Generate correct YUV->RGB tables - Fixes: #613332. - -2010-03-19 11:10:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: disable loop and auto multicast join - Disable loopback of packets. - Disable autojoin of multicast groups in the sink because the source already - does that on the shared socket. - -2010-03-18 17:30:26 +0100 Benjamin Otte <otte@redhat.com> - - * ext/alsaspdif/alsaspdifsink.c: - * ext/amrwbenc/gstamrwbenc.c: - * ext/arts/gst_arts.c: - * ext/artsd/gstartsdsink.c: - * ext/audiofile/gstafparse.c: - * ext/audiofile/gstafparse.h: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsink.h: - * ext/audiofile/gstafsrc.c: - * ext/audiofile/gstafsrc.h: - * ext/audioresample/gstaudioresample.c: - * ext/cdaudio/gstcdaudio.c: - * ext/celt/gstceltenc.c: - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstcogdownsample.c: - * ext/cog/gstcogfilter.c: - * ext/cog/gstcogmse.c: - * ext/cog/gstcogscale.c: - * ext/cog/gstcolorconvert.c: - * ext/cog/gstlogoinsert.c: - * ext/dc1394/gstdc1394.c: - * ext/dirac/gstdiracdec.cc: - * ext/dirac/gstdiracenc.cc: - * ext/directfb/dfbvideosink.c: - * ext/divx/gstdivxdec.c: - * ext/divx/gstdivxenc.c: - * ext/dts/gstdtsdec.c: - * ext/faac/gstfaac.c: - * ext/faad/gstfaad.c: - * ext/flite/gstflitetestsrc.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmenc.c: - * ext/hermes/gsthermescolorspace.c: - * ext/jack/gstjackaudiosink.c: - * ext/jack/gstjackaudiosrc.c: - * ext/jp2k/gstjasperdec.c: - * ext/jp2k/gstjasperenc.c: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkatetiger.c: - * ext/ladspa/gstladspa.c: - * ext/lcs/gstcolorspace.c: - * ext/libfame/gstlibfame.c: - * ext/libmms/gstmms.c: - * ext/lv2/gstlv2.c: - * ext/metadata/gstmetadatademux.c: - * ext/metadata/gstmetadatamux.c: - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - * ext/musicbrainz/gsttrm.c: - * ext/mythtv/gstmythtvsrc.c: - * ext/nas/nassink.c: - * ext/neon/gstneonhttpsrc.c: - * ext/polyp/polypsink.c: - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/rsnaudiomunge.c: - * ext/resindvd/rsnparsetter.c: - * ext/resindvd/rsnstreamselector.c: - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroparse.c: - * ext/sdl/sdlaudiosink.c: - * ext/sdl/sdlvideosink.c: - * ext/shout/gstshout.c: - * ext/snapshot/gstsnapshot.c: - * ext/sndfile/gstsfsink.c: - * ext/sndfile/gstsfsrc.c: - * ext/spc/gstspc.c: - * ext/swfdec/gstswfdec.c: - * ext/tarkin/gsttarkindec.c: - * ext/tarkin/gsttarkinenc.c: - * ext/theora/theoradec.c: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxvidenc.c: - * ext/zbar/gstzbar.c: - * gst-libs/gst/app/gstappsink.c: - * gst-libs/gst/app/gstappsrc.c: - * gst/adpcmdec/adpcmdec.c: - * gst/adpcmenc/adpcmenc.c: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfparse.c: - * gst/asfmux/gstrtpasfpay.c: - * gst/audiobuffer/gstaudioringbuffer.c: - * gst/audioparsers/gstaacparse.c: - * gst/audioparsers/gstamrparse.c: - * gst/bayer/gstbayer2rgb.c: - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/gstcamerabin.c: - * gst/cdxaparse/gstcdxaparse.c: - * gst/chart/gstchart.c: - * gst/colorspace/gstcolorspace.c: - * gst/dccp/gstdccpclientsink.c: - * gst/dccp/gstdccpclientsrc.c: - * gst/dccp/gstdccpserversink.c: - * gst/dccp/gstdccpserversrc.c: - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/gstcapssetter.c: - * gst/dtmf/gstdtmfdetect.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dvdspu/gstdvdspu.c: - * gst/festival/gstfestival.c: - * gst/filter/gstiir.c: - * gst/freeze/gstfreeze.c: - * gst/games/gstpuzzle.c: - * gst/h264parse/gsth264parse.c: - * gst/hdvparse/gsthdvparse.c: - * gst/invtelecine/gstinvtelecine.c: - * gst/legacyresample/gstlegacyresample.c: - * gst/librfb/gstrfbsrc.c: - * gst/liveadder/liveadder.c: - * gst/mixmatrix/mixmatrix.c: - * gst/mpeg1sys/gstmpeg1systemencode.c: - * gst/mpeg4videoparse/mpeg4videoparse.c: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/mpegtsparse.c: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegvideoparse/mpegvideoparse.c: - * gst/mve/gstmvedemux.c: - * gst/mve/gstmvemux.c: - * gst/nsf/gstnsf.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/overlay/gstoverlay.c: - * gst/passthrough/gstpassthrough.c: - * gst/pcapparse/gstpcapparse.c: - * gst/playondemand/gstplayondemand.c: - * gst/qtmux/gstqtmoovrecover.c: - * gst/qtmux/gstqtmux.c: - * gst/real/gstrealaudiodec.c: - * gst/real/gstrealvideodec.c: - * gst/rtjpeg/gstrtjpegdec.c: - * gst/rtjpeg/gstrtjpegenc.c: - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - * gst/scaletempo/gstscaletempo.c: - * gst/sdp/gstsdpdemux.c: - * gst/selector/gstinputselector.c: - * gst/selector/gstoutputselector.c: - * gst/siren/gstsirendec.c: - * gst/siren/gstsirenenc.c: - * gst/smooth/gstsmooth.c: - * gst/smoothwave/gstsmoothwave.c: - * gst/speed/gstspeed.c: - * gst/stereo/gststereo.c: - * gst/tta/gstttadec.c: - * gst/tta/gstttaparse.c: - * gst/valve/gstvalve.c: - * gst/vbidec/gstvbidec.c: - * gst/videodrop/gstvideodrop.c: - * gst/videomeasure/gstvideomeasure_collector.c: - * gst/videosignal/gstvideoanalyse.c: - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideomark.c: - * gst/vmnc/vmncdec.c: - * sys/acmenc/acmenc.c: - * sys/acmmp3dec/acmmp3dec.c: - * sys/cdrom/gstcdplayer.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directsound/gstdirectsoundsrc.c: - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dvb/dvbbasebin.c: - * sys/dvb/gstdvbsrc.c: - * sys/dxr3/dxr3audiosink.c: - * sys/dxr3/dxr3spusink.c: - * sys/dxr3/dxr3videosink.c: - * sys/fbdev/gstfbdevsink.c: - * sys/osxvideo/osxvideosrc.c: - * sys/qcam/gstqcamsrc.c: - * sys/qtwrapper/audiodecoders.c: - * sys/qtwrapper/videodecoders.c: - * sys/vcd/vcdsrc.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisrc.c: - * sys/winks/gstksvideosrc.c: - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.c: - gst_element_class_set_details => gst_element_class_set_details_simple - -2010-03-18 17:11:59 +0100 Benjamin Otte <otte@redhat.com> - - * gst/virtualdub/LICENSE: - * gst/virtualdub/Makefile.am: - * gst/virtualdub/gstvirtualdub.c: - * gst/virtualdub/gstvirtualdub.h: - * gst/virtualdub/gstxsharpen.c: - * gst/virtualdub/virtualdub.vcproj: - virtualdub: Remove - THe plugin is so hopelessly outdated, it's just not worth keeping. - -2010-03-18 17:04:59 +0100 Benjamin Otte <otte@redhat.com> - - * ext/xine/Makefile.am: - * ext/xine/gstxine.h: - * ext/xine/xine.c: - * ext/xine/xineaudiodec.c: - * ext/xine/xineaudiosink.c: - * ext/xine/xinecaps.c: - * ext/xine/xineinput.c: - Remove xine plugin code - The plugin is unmaintained (even worse than Xine ;)) - -2010-03-18 16:17:10 +0100 Benjamin Otte <otte@redhat.com> - - * tests/examples/gob/Makefile.am: - * tests/examples/gob/gst-identity2.gob: - Remove gob examples - They were outdated and wouldn't have compiled anymore. - -2010-03-17 11:30:34 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cogvirtframe.c: - cog: Fix off-by-one in 444->420 conversion - Fixes #613160. - -2010-03-17 14:29:31 +0300 Руслан Ижбулатов <lrn1986@gmail.com> - - * ext/cog/gstlogoinsert.c: - cog: Use "(png_infopp) NULL" instead of png_infopp_NULL - -2010-03-17 14:23:41 +0300 Руслан Ижбулатов <lrn1986@gmail.com> - - * ext/cog/gstlogoinsert.c: - cog: Use png_get_io_ptr() instead of accessing io_ptr directly - -2010-03-17 14:21:53 +0300 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - cog: Check for libpng >= 1.2 instead of libpng12 - -2010-03-16 23:46:04 +0200 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/inspect/plugin-xdgmime.xml: - docs: the xdgmime plugin was merged into typefinders - -2010-03-16 23:43:02 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/neon/gstneonhttpsrc.c: - neon,dvd: also use g_value_set_static_string() here for static strings - -2010-03-15 10:13:19 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: fix minor memory leak in property getter - Don't leak the string returned by g_strjoinv(). While we're at it, - use GString to assemble the string to be returned. - -2010-03-15 09:24:17 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: use g_value_set_static_string() where possible - -2010-03-15 12:17:37 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cog.orc: - * ext/cog/cogvirtframe.c: - cog: disable code that causes an orcc crash - Revert this after orc release and version bump. - -2010-03-15 11:54:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/imagefreeze/gstimagefreeze.c: - imagefreeze: Only start the task after a seek if a buffer was received already - -2010-03-15 01:46:45 -0700 David Schleef <ds@schleef.org> - - * ext/cog/gstlogoinsert.c: - cog: comment on previous bad commit message - The recent commit "logoinsert checkpoint FIXME" should - actually read: Fix logoinsert variable names. - -2010-03-15 01:26:25 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cog.orc: - * ext/cog/cogframe.c: - * ext/cog/cogframe.h: - * ext/cog/cogvirtframe.c: - * ext/cog/cogvirtframe.h: - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstcolorconvert.c: - * ext/cog/gstlogoinsert.c: - cog: implement chroma-site - Determine chroma site position from the caps and use it when - upsampling/downsampling chroma. - -2010-03-14 18:56:06 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cog.orc: - * ext/cog/cogvirtframe.c: - * ext/cog/cogvirtframe.h: - * ext/cog/generate_tables.c: - * ext/cog/gstcogcolorspace.c: - cogcolorspace: implement color-matrix handling - -2009-10-08 15:18:41 -0700 David Schleef <ds@schleef.org> - - * ext/cog/gstlogoinsert.c: - cog: logoinsert checkpoint FIXME - -2009-10-30 15:35:36 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cogframe.c: - * ext/cog/cogvirtframe.c: - * ext/cog/cogvirtframe.h: - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstcolorconvert.c: - * ext/cog/gstlogoinsert.c: - cog: Add n_taps to chroma upsampling - -2010-03-13 18:54:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - asfmux: fix typo in property description - -2010-03-13 06:03:32 +0100 Raimo Järvi <raimo.jarvi@gmail.com> - - * gst/mpegvideoparse/mpegvideoparse.c: - mpegvideoparse: Update caps when the sequence header changes - Fixes bug #612687. - -2010-03-12 19:30:48 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/camerabin/gstcamerabin.c: - camerabin: activate video bin before feeding data to it - Fixes #612615. - -2010-03-12 11:28:51 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/pipelines/tagschecking.c: - tests: tagschecking: Improvements and new geo-location tests - Makes some improvements to tagschecking.c, making it use - fakesrc instead of videotestsrc and allowing to set input - caps so that more muxers can be used. Previously we could - only use those that accepted raw video caps. - Also adds some tests for geo-location tags - -2010-03-12 10:53:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: Use xmp on mp4mux and gppmux too - Do not restrict xmp to qtmux, but use it too - on mp4mux and gppmux - -2010-03-12 13:59:12 +0100 Edward Hervey <bilboed@bilboed.com> - - * common: - Automatic update of common submodule - From e272f71 to 55cd514 - -2010-03-12 09:52:57 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: Fix unitialized variable on macosx 10.5 - -2010-03-11 21:32:28 +0200 Stefan Kost <ensonic@users.sf.net> - - * configure.ac: - * gst/jpegformat/Makefile.am: - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - jpegformat: add xmp reading and writing support - Bump needed base version for new xmp helper library. Use xmp helpers in - jpegparse and jifmux. - -2010-03-12 08:23:46 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Fix merge mistake - -2010-02-28 19:41:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/segmentclip/Makefile.am: - * gst/segmentclip/gstaudiosegmentclip.c: - * gst/segmentclip/gstaudiosegmentclip.h: - * gst/segmentclip/gstsegmentclip.c: - * gst/segmentclip/gstsegmentclip.h: - * gst/segmentclip/gstvideosegmentclip.c: - * gst/segmentclip/gstvideosegmentclip.h: - * gst/segmentclip/plugin.c: - segmentclip: Add audio/video buffer segment clip elements - These elements clip the audio/video buffers to the configured segment - for the case when the upstream elements don't do this correctly. - -2010-02-28 16:08:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/imagefreeze.c: - imagefreeze: Add some unit tests - -2010-02-28 16:04:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/imagefreeze/gstimagefreeze.c: - imagefreeze: Set undefined framerate in sink getcaps function - -2010-02-28 15:02:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/imagefreeze/gstimagefreeze.c: - imagefreeze: Implement reverse playback and set buffer offsets - -2010-02-27 17:37:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-imagefreeze.xml: - imagefreeze: Add to the docs - -2010-02-27 17:33:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/imagefreeze/Makefile.am: - * gst/imagefreeze/gstimagefreeze.c: - * gst/imagefreeze/gstimagefreeze.h: - imagefreeze: Add still frame stream generator element - -2010-03-05 13:33:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/pipelines/tagschecking.c: - check: tagschecking: tests for tags serialization in muxers - Adds a check unit test that aims to test tags serialization - and deserialization consistency (in muxers). It provides a - basic function that allows one to easily specify tags, a - muxer and a demuxer and a test will be done to check if - the tags have been consistently muxed and demuxed - -2010-02-22 16:45:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/Makefile.am: - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/gstqtmux.c: - qtmux: add xmp support - Adds xmp metatags adding to qtmux. - Fixes #609539 - -2010-03-11 09:29:53 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * configure.ac: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - * ext/metadata/metadataxmp.c: - metadata: Remove _XMP_GEO_* tags - Removes GST_TAG_XMP_GEO_LOCATION_COUNTRY, - GST_TAG_XMP_GEO_LOCATION_CITY and - GST_TAG_XMP_GEO_LOCATION_SUBLOCATION from metadata's - private tags as those are now present at -core tags. - Fixes #612410 - -2010-03-11 17:17:15 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/qtmux/gstqtmoovrecover.c: - qtmux: fix GST_ELEMENT_ERROR usage - We need to pass (NULL) rather than NULL for empty arguments. - -2010-03-11 17:58:25 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjpegparse.c: - jpegformat: Fix unitialized variables - -2010-03-10 11:50:47 -0600 Rob Clark <rob@ti.com> - - * gst/dccp/gstdccp.c: - fix compile error with trace macro - Note that this one isn't a problem with normal trace macros, but causes problems with - some replacement trace macros that I use, which expect the format string to be - appendable (ie "foo "fmt in the macro) - https://bugzilla.gnome.org/show_bug.cgi?id=612454 - -2010-03-10 11:49:22 -0600 Rob Clark <rob@ti.com> - - * ext/alsaspdif/alsaspdifsink.c: - fix trace macro typo - https://bugzilla.gnome.org/show_bug.cgi?id=612454 - -2010-03-10 10:26:27 -0600 Rob Clark <rob@ti.com> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: fix compile error - gst/mpeg4videoparse/mpeg4videoparse.c:689: warning: comparison is always true due to limited range of data type - https://bugzilla.gnome.org/show_bug.cgi?id=612454 - -2010-03-10 10:23:23 -0600 Rob Clark <rob@ti.com> - - * gst/qtmux/gstqtmoovrecover.c: - qtmux: fix compile error - gst/qtmux/gstqtmoovrecover.c:268: warning: format not a string literal and no format arguments - https://bugzilla.gnome.org/show_bug.cgi?id=612454 - -2010-03-11 11:21:10 +0100 Benjamin Otte <otte@redhat.com> - - * common: - Automatic update of common submodule - From df8a7c8 to e272f71 - -2010-03-11 11:29:16 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/metadata/gstbasemetadata.c: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/metadataexif.c: - * ext/metadata/metadataiptc.c: - * ext/metadata/metadatatypes.c: - * ext/metadata/metadataxmp.c: - metadata: don't check for NULL when calling g_free. - g_free does the check already. Also small code logic cleanup and whitespace fix. - -2010-03-11 11:28:14 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/metadata/gstmetadatademux.c: - * ext/metadata/gstmetadatamux.c: - metadata: remove empty setter/getter vmethod implementations - -2010-03-11 11:14:53 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/invtelecine/gstinvtelecine.c: - invtelecine: inlcude stdlib.h for abs() - -2010-02-17 13:11:18 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/metadata/TODO: - metadata: update bug status - -2009-09-08 09:13:07 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: refactor cropping and adapting captured images - -2009-09-10 13:41:40 +0300 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * gst/camerabin/camerabingeneral.c: - * gst/camerabin/gstcamerabin.c: - camerabin: fix NULL -> READY state change failure handling. - In some error situations the NULL -> READY state change failed - and camerabin elements were not destroyed. - -2010-02-17 11:51:26 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/camerabinpreview.c: - camerabin: don't use gst_bus_poll() when creating preview image - Avoid using gst_bus_poll() as the docs recommend. Use - gst_bus_timed_pop_filtered() instead. - -2010-03-10 21:01:20 +0100 Benjamin Otte <otte@redhat.com> - - * configure.ac: - Update for recent changes to common submodule - This just replaces every "$ERROR_CFLAGS" usage with a usage of - "$WARNING_CFLAGS $ERROR_CFLAGS" to get the same functionality as - previously. - Actually using that separation will happen later. - -2010-03-10 21:52:20 +0100 Benjamin Otte <otte@redhat.com> - - * common: - Automatic update of common submodule - From 9720a7d to df8a7c8 - -2010-03-10 20:44:07 +0100 Benjamin Otte <otte@redhat.com> - - * common: - Automatic update of common submodule - From 0b6e072 to 9720a7d - -2010-03-10 16:10:06 +0100 Benjamin Otte <otte@redhat.com> - - * common: - Automatic update of common submodule - From 7cc5eb4 to 0b6e072 - -2010-03-10 11:33:10 +0100 Benjamin Otte <otte@redhat.com> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-apexsink.xml: - * docs/plugins/inspect/plugin-invtelecine.xml: - * docs/plugins/inspect/plugin-nsf.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - docs: Update to match recent commits - -2010-03-10 01:10:27 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From 7aa65b5 to 7cc5eb4 - -2009-12-08 16:36:16 -0500 Tristan Matthews <tristan@sat.qc.ca> - - * ext/dc1394/gstdc1394.c: - dc1394: list valid iso-speeds in help and validate speeds in set_property. - -2009-12-08 16:05:14 -0500 Tristan Matthews <tristan@sat.qc.ca> - - * ext/dc1394/gstdc1394.c: - dc1394: check iso-speed values in set_property, ignore if invalid - -2009-12-08 15:37:03 -0500 Tristan Matthews <tristan@sat.qc.ca> - - * ext/dc1394/gstdc1394.c: - * ext/dc1394/gstdc1394.h: - dc1394: add iso-speed property - Add iso-speed property which allows for higher bandwidth dc video. - Automatically set to b-mode as needed. - Fixes #603745. - -2010-03-09 19:48:44 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - - * gst/selector/Makefile.am: - inputselector: fix the LDFLAGS - -2010-03-09 21:38:59 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 44ecce7 to 7aa65b5 - -2010-03-09 21:26:14 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/schroedinger/gstschroenc.c: - schroenc: Only enable framestats code with schro >= 1.0.9 - -2010-02-28 10:42:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/Makefile.am: - * gst/frei0r/gstfrei0r.c: - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rsrc.c: - frei0r: Sync properties to the controller if one was set - -2010-02-27 19:08:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rsrc.c: - frei0r: Protect set/get property and processing functions from concurrent access - The frei0r documentation says that these functions must not be called - on the same instance from different threads at the same time. All - other functions are guaranteed to be threadsafe. - -2010-02-26 16:40:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/cog/Makefile.am: - * pkgconfig/Makefile.am: - * tests/icles/Makefile.am: - build: Make some more rules silent if requested - -2010-02-26 15:45:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Use automake 1.11 silent rules instead of shave if available - This makes sure that we use something that is still maintained and - also brings back libtool 1.5 support. - -2010-02-26 15:25:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/assrender.c: - assrender: Add test for correct I420 rendering - -2010-03-09 12:33:37 -0800 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschroenc.c: - schroenc: Add frame-stats message - -2010-03-08 21:00:21 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * gst/invtelecine/Makefile.am: - * gst/invtelecine/gstinvtelecine.c: - invtelecine: Add invtelecine element - Automatic inverse telecine element. Right now, it clumsily attempts - to rearrange video fields into frames that don't have combing effects, - and only works with 60i/24p content at 720x480. Later, it will handle - other pulldown variations, change caps and smooth timestamps - appropriately. - -2010-03-01 13:49:39 +0100 Benjamin Otte <otte@redhat.com> - - * ext/apexsink/gstapexplugin.c: - apexsink: Use "apexsink" for plugin name - -2010-03-01 13:47:32 +0100 Benjamin Otte <otte@redhat.com> - - * gst/vmnc/vmncdec.c: - wmnc: Update description - -2010-03-01 13:22:06 +0100 Benjamin Otte <otte@redhat.com> - - * gst/nuvdemux/gstnuvdemux.c: - nuvdemux: Update plugin description - -2010-03-01 13:18:59 +0100 Benjamin Otte <otte@redhat.com> - - * gst/nsf/gstnsf.c: - nsf: Name the plugin nsf, not nsfdec - The plugin in gstnsf.so should be named nsf, not nsfdec. - -2010-03-08 12:23:48 -0300 Tiago Katcipis <tiagokatcipis@gmail.com> - - * ext/soundtouch/gstpitch.cc: - soundtouch: removing very annoying g_print() in pitch element - Fixes #612208. - -2010-03-09 17:50:29 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * win32/common/config.h: - Back to development - -=== release 0.10.18 === - -2010-03-06 01:49:26 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.10.18 - -2010-03-06 01:39:58 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2010-03-03 23:42:28 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * win32/common/config.h: - 0.10.17.4 pre-release - -2010-02-22 19:38:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/gstqtmuxmap.c: - qtmux: Rename 'avc-sample' to 'avc' in caps - Fixes #606662 - -2010-02-22 19:24:06 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: Replace 'avc-sample' with 'avc' in caps - Fixes #606662 - -2010-02-28 23:14:36 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins.args: - docs: remove bits that refer to plugins that have been moved - -2010-02-26 18:06:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Drop text buffers before the segment start and clip running time end to the segment stop - -2010-02-27 11:23:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Consume text buffers if they're to be displayed in the next 500ms - Instead of only consuming them if they're to be display now. Consuming - them then might make following buffers with the same timestamp to - be too late. - -2010-02-26 11:50:25 -0800 Michael Smith <msmith@songbirdnest.com> - - * gst/qtmux/gstqtmux.c: - qtmux: Take lock around use of (non-threadsafe) tagsetter interface. - -2010-02-24 02:03:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * win32/common/config.h: - 0.10.17.3 pre-release - -2010-02-23 18:16:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: Protect libass structures from concurrent access from multiple threads - Fixes bug #608751. - -2010-02-23 17:28:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Call $PKG_CONFIG instead of pkg-config to fix cross compilation - -2010-02-22 16:51:00 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/atoms.c: - qtmux: write all udta children atoms - UDTA might have META and other children atoms - together, write them all. - -2010-02-22 10:48:11 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - qtmux: Use internal sink pads list - Due to GstCollectPads sink pads list being not reliably - iteratable (when not inside the collected function) this - patch adds a sink pads list to qtmux to be used when iterating - sink pads on reset function. - Fixes #609055 - -2010-02-21 19:57:19 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/faad/Makefile.am: - faad: fix Makefile.am some more - FAAD_CFLAGS and _LIBS should be at the end, and -lgstaudio-0.10 - should go right after GST_PLUGINS_BASE_LIBS. - -2010-02-19 15:17:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faad/Makefile.am: - faad: Link with libgstbase for GstAdapter - Also fix order of CFLAGS and LIBS - -2010-02-19 08:58:33 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - 0.10.17.2 pre-release - -2010-02-19 08:58:06 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/icles/.gitignore: - .gitignore: ignore generated cog files - -2010-02-19 10:32:33 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: fix NULL ref and error handling if no video sink is found - If no video sink is set and autovideosink is not available for some - reason, post a proper error message on the bus when failing to - change state, and don't try to gst_object_ref() NULL pointers. Fixes - generic/states unit test when distchecking. - -2009-12-10 16:30:26 -0500 Stephen Depooter <stephend@xandros.com> - - * ext/celt/gstceltenc.c: - celt: fix compile against earlier CELT versions - Check the existence of the CELT_SET_COMPLEXITY symbol - before trying to use it. Fixes compilation against - libcelt 0.4.0. - Fixes #604311. - -2010-02-17 12:34:38 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: return offset+length from _get_image_length(). - _find_end_marker() find the position of the marker. EOI has a fixed length of 2 - bytes that where missing. Fixes #608998 - -2010-02-17 01:34:45 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/.gitignore: - .gitignore: ignore new faad unit test - -2010-02-17 01:29:40 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: fix invalid memory access - See bug #608998. - -2010-02-16 22:23:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/assrender.c: - assrender: Fix unit test to actually check for everything to work correctly - -2010-02-16 22:22:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: If no codec data is set, still initialize the ass track - -2010-02-16 21:41:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/assrender.c: - assrender: Add simple unit test - This renders a test string on top of a red video stream and checks - if the text is only rendered at the correct timestamps. - -2010-02-16 20:38:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/ofa.c: - ofa: Fix warning message parsing - -2010-02-16 16:49:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: guard against codec_data field with a NULL buffer in caps - Fixes #609478. - -2010-02-16 17:13:09 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - qtmux: prevent leaking hdlr name - -2010-02-16 16:24:12 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmuxmap.c: - qtmux: support for ALAC - Fixes #580731. - -2010-02-16 14:19:04 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - qtmux: refactor building stsd entry 'wave' extension - -2010-02-16 10:00:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - Update .spec file: shapewipe and ivorbisdec have been moved elsewhere - -2010-02-16 09:49:05 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/faac/gstfaac.c: - * ext/faad/gstfaad.c: - docs: unify doc style - Use gtkdoc syntax and add short desc for the examples. - -2010-02-15 23:43:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: fix up GST_CXXFLAGS properly - We don't want C specific flags in GST_CXXFLAGS, so base it on the - GST_CFLAGS that only contains the pkg-config CFLAGS but none of - the GST_OPTION_CFLAGS. Also, we only need the local includes once. - -2010-02-15 23:17:57 +0200 Stefan Kost <ensonic@users.sf.net> - - * configure.ac: - configure: base GST_CXXFLAGS on --cflags from pkg-config - pkg-config sets GST_CFLAGS and GST_LIBS. We need to use CFLAGS as a starting - point for for both C and CXX settings. - -2010-02-15 12:57:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/cog/gstcogmse.c: - cogmse: fix printf format and a few ref leaks - -2010-02-15 12:46:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/Makefile.am: - * m4/Makefile.am: - * m4/gst-ivorbis.m4: - build: remove somem more ivorbis cruft - -2010-02-15 11:55:07 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * Makefile.am: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-tremor.xml: - * ext/Makefile.am: - * ext/ivorbis/Makefile.am: - * ext/ivorbis/vorbis.c: - * ext/ivorbis/vorbisdec.c: - * ext/ivorbis/vorbisdec.h: - * ext/ivorbis/vorbisenc.h: - * ext/ivorbis/vorbisfile.c: - Moved 'ivorbis(dec)' from -bad to -base. - Fixes #609063. - -2010-02-15 09:36:05 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/hdvparse/gsthdvparse.c: - hdvparse: Fix field error. - Spotted by Burkhard Plaum - -2010-02-15 01:26:09 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/jpegparse.c: - tests: fix caps leak in jpegparse unit test - -2010-02-13 15:28:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/dataurisrc.c: - tests: add unit test for dataurisrc - Requires fixes from core git, so bump core requirement to git as well. - -2010-02-14 23:18:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 96dc793 to 44ecce7 - -2010-02-14 15:22:05 +0100 Benjamin Otte <otte@redhat.com> - - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin/gst-camera.ui: - examples: Call gst_ensure_native_window() for gst-camera - Fixes spurious SEGVs due to multithreading conflicts in - client-side-window Gtk versions. - -2010-02-14 13:43:04 +0100 Benjamin Otte <otte@redhat.com> - - * tests/examples/camerabin/gst-camera.c: - examples: Use gtk functions instead of libX11 functions in camerabin - Gets around the need to link to libX11 directly and provides the same - functionality. - To boost, it's more portable, too! - -2010-02-14 13:41:57 +0100 Benjamin Otte <otte@redhat.com> - - * tests/examples/directfb/Makefile.am: - examples: Properly link to libm - -2010-02-13 11:00:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - Add shapewipe examples directory to CRUFT_DIRS - -2010-02-12 11:35:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-jpegformat.xml: - * docs/plugins/inspect/plugin-lv2.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - docs: Update documentation - -2010-02-12 11:21:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * Makefile.am: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-shapewipe.xml: - * gst/shapewipe/Makefile.am: - * gst/shapewipe/gstshapewipe.c: - * gst/shapewipe/gstshapewipe.h: - * tests/check/Makefile.am: - * tests/check/elements/shapewipe.c: - * tests/examples/Makefile.am: - * tests/examples/shapewipe/Makefile.am: - * tests/examples/shapewipe/shapewipe-example.c: - Moved 'shapewipe' from -bad to -good - Fixes bug #584536. - -2010-02-11 21:57:49 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/faad/gstfaad.c: - faad: add documentation - -2010-02-11 20:37:55 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/faad.c: - faad: add unit test - -2010-02-11 20:21:38 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: fix documentation typo - -2010-02-11 20:21:17 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: remove some redundant code - ... and move and modify some debug logging. - -2010-02-10 23:29:23 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: drain sync pending frames when appropriate - -2010-02-10 23:14:48 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: send tags exactly once when init'ed - -2010-02-10 23:14:21 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: refactor some partial stream reset - -2010-02-10 22:14:07 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: correctly estimate average bps - Count consumed bytes and corresponding duration atomically, - rather than letting bytecount run ahead of what has been decoded. - Fixes #440476. - -2010-02-10 21:49:00 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: give up after some number of decoding failures - -2010-02-10 21:37:12 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - * ext/faad/gstfaad.h: - faad: do not attempt to sync indefinitely - -2010-02-10 21:12:07 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - * ext/faad/gstfaad.h: - faad: use adapter rather than temporary buffer - -2010-02-10 19:14:19 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: objectify debug statements and adjust some levels - -2010-02-10 18:46:16 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: refactor src caps (re)negotiation and reflow some error exits - -2010-02-09 23:35:20 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - * ext/faad/gstfaad.h: - faad: remove defunct and otherwise obsolete code - -2010-02-09 23:25:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - faad: refactor reset - -2010-02-09 22:46:32 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faad/gstfaad.c: - * ext/faad/gstfaad.h: - faad: use an in struct segment rather than a separately allocated one - -2010-02-10 10:52:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Preserve the input color values in all cases - -2010-02-10 10:50:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Scale mask alpha values by the source alpha values - -2010-02-10 10:42:32 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Fix ARGB processing - -2010-02-10 10:34:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/examples/shapewipe/shapewipe-example.c: - shapewipe: Print some more details on error/warning messages - -2010-02-09 15:20:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Never flush more bytes than available - This could happen if the input doesn't contain any MPEG TS - data and the complete adapter content should be skipped. - -2010-02-08 11:51:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/atomsrecovery.c: - qtmux: atomsrecovery: Fix compilation problem - Fixes a compilation error due to unused function result. - -2010-02-08 08:26:33 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Improve/add debug output - -2010-02-08 08:20:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Always hold the mask mutex before signalling the GCond - -2010-02-08 08:19:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Move chain function error cases at the end of the function and add useful debug output - -2010-02-08 08:12:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - * gst/shapewipe/gstshapewipe.h: - shapewipe: Fix race condition during shutdown that can lead to a deadlock - -2010-02-08 08:11:33 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Drop mask buffer on FLUSH events - -2010-02-08 08:09:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - * gst/shapewipe/gstshapewipe.h: - shapewipe: Update copyright year - -2010-02-08 08:08:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Don't reset properties when going PAUSED->READY - Also use defines for the default values of the properties. - -2010-02-07 11:09:45 +0100 David Hoyt <dhoyt@llnl.gov> - - * ext/rsvg/gstrsvgdec.c: - rsvgdec: fix compilation with MSVC - MSVC doesn't like #if #else within statements. - Fixes #609215. - -2010-01-26 17:08:04 +0000 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * ext/kate/gstkatedec.c: - katedec: don't escape special characters - Don't escape special characters, as we'll send the buffer as - text/plain rather than text/x-pango-markup; this avoids e.g. - quotes from appearing as " in the rendered subtitles. - See bug #600929. - -2010-01-24 11:14:15 +0000 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * ext/kate/gstkatetiger.c: - kate: rename the tiger overlay element's sink pad to 'subtitle_sink' - As this is what playbin2 expects. See bug #600929. - -2010-02-07 10:19:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/jpegformat/gstjpegformat.c: - jpegparse: lower rank to NONE so it is not autoplugged for decoding - This element is too new and too untested to have it autoplugged. - -2010-02-05 17:25:59 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/jpegparse.c: - jpegparse: Fix unit test - The parsed buffers have a framerate of 1/1. - Fixes bug #608998. - -2010-02-05 10:18:39 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/metadata/metadatatypes.c: - metadata: append_sorted should really append sorted - ... which means that identical offset_orig should preserve the order - in which they are appended. - -2010-02-05 10:16:27 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/metadata/gstmetadatademux.c: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadatamuxpng.c: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsepng.c: - * ext/metadata/metadataparseutil.c: - metadata: use a non-DEFAULT proper debug category in helper files - -2010-02-04 19:45:42 +0100 Julien Moutte <julien@fluendo.com> - - * gst/mpegtsmux/mpegtsmux_h264.c: - mpegtsmux: Fix a potential unref of a NULL pointer. - At first iteration we don't have any cached SPS/PPS buffer to free. - -2010-02-02 11:43:22 -0500 Marc-André Lureau <mlureau@flumotion.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: add PAT/PMT in streamheader - The check for PAT/PMT buffers was suggested by - Zaheer Abbas Merali. - https://bugzilla.gnome.org/show_bug.cgi?id=608896 - -2010-02-03 13:31:22 +0100 Marc-André Lureau <mlureau@flumotion.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - mpegtsmux: add pat-interval and pmt-interval properties - https://bugzilla.gnome.org/show_bug.cgi?id=608896 - -2010-02-03 13:41:27 +0100 Marc-André Lureau <mlureau@flumotion.com> - - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - mpegtsmux: fix PAT/PMT insertion frequency - The current code is comparing timestamps with different clock. - Let's use only the clock for PTS values. - Also rename frequency to interval, to avoid confusion. And remove - documentation about value 0, which won't work like documented. - https://bugzilla.gnome.org/show_bug.cgi?id=608896 - -2010-01-27 16:29:00 +0100 Marc-André Lureau <mlureau@flumotion.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - mpegtsmux: marking non-delta unit, including pre-sections - This patch address the issue observed with KF timestamps - and delta flag. When a section is appended before the keyframe, - it is not marked as non-delta. It's preferable to mark the - first buffer non-delta. - This patch also simplify the initial patch written by thomas, - since it does not clutter tsmux/ with a delta flag passed - around only for GStreamer convenience. - https://bugzilla.gnome.org/show_bug.cgi?id=604908 - -2010-02-03 15:07:08 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/jpegformat/Makefile.am: - * gst/jpegformat/gstjifmux.c: - * gst/jpegformat/gstjifmux.h: - * gst/jpegformat/gstjpegformat.c: - * gst/jpegformat/gstjpegformat.h: - jpegformat: add a basic jifmuxer - The new element can chop and reassemble the markers. I implements the tagsetter - and for now can serialize some tags to jpeg comments. - -2009-12-12 16:07:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/Makefile.am: - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/atomsrecovery.c: - * gst/qtmux/atomsrecovery.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/gstqtmoovrecover.c: - * gst/qtmux/gstqtmoovrecover.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - * gst/qtmux/gstqtmuxplugin.c: - qtmux: Adds moov recovery feature - Adds a new property to qtmux that sets a path to a file to write - and update data about the moov atom (that is not writen till the - end of the file). If the pipeline/app crashes during execution it - might be possible to recover the movie using the qtmoovrecover element. - qtmoovrecover is an element that is also a pipeline. It is not - meant to be used with other elements (it has no pads). It is merely - a tool/utilitary to recover unfinished qtmux files. - Fixes #601576 - -2010-02-02 11:22:06 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/jpegformat/gstjpegformat.h: - * gst/jpegformat/gstjpegparse.c: - jpegparse: improve parsing - Handle more app maker. Print app marker names to debug log. Remember last_marker - when parsing to avoid reparsing from the very begin. - -2010-02-02 12:23:24 +0100 Julien Moutte <julien@fluendo.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/mpegtsmux_h264.c: - * gst/mpegtsmux/mpegtsmux_h264.h: - mpegtsmux: generate SPS/PPS header once and fix overflow - Some H264 packets can be as small as 5 bytes for repeated frames. - In such a situation the output buffer size was not big enough (5*2) to fit the - SPS/PPS header and the start codes. This corrupts the ES stream. - We now generate the SPS/PPS only once which is much more optimal and we now - know the size of the header to calculate the output buffer size more safely. - -2010-02-02 01:44:20 +0100 Grigori Goronzy <greg@blackbox> - - * ext/assrender/gstassrender.c: - assrender: instruct libass to use light autohinting - Fixes bug #608753. - -2010-02-02 08:53:53 +0100 Eric Appleman <erappleman@gmail.com> - - * ext/assrender/gstassrender.c: - assrender: Don't scan current working directory recursively for fonts - This can take a very long time and also libass will overwrite files - if there's an embedded font with the same filename as an existing file. - Fixes bug #575878 and #608706. - -2010-02-01 16:26:36 -0800 David Hoyt <dhoyt@llnl.gov> - - * sys/dshowvideosink/dshowvideosink.cpp: - dshowvideosink: don't crash on invalid AM_MEDIA_TYPE - -2010-01-27 19:06:53 -0800 Michael Smith <msmith@songbirdnest.com> - - * gst/qtmux/atoms.c: - qtmux: for fixed-sample size streams (PCM audio, etc) don't allocate an enormous buffer that we then won't use at all. - -2010-01-27 15:37:37 -0800 Michael Smith <msmith@songbirdnest.com> - - * gst/qtmux/gstqtmux.c: - qtmux: handle muxing adpcm correctly. - -2010-01-22 13:36:04 -0800 Michael Smith <msmith@songbirdnest.com> - - * gst/qtmux/atoms.c: - qtmux: Set the mdia hdlr name field to what quicktime uses. Fix writing it since it's not null-terminated. Improves compatibility with some hardware players. - -2010-01-22 13:30:07 -0800 Michael Smith <msmith@songbirdnest.com> - - * gst/qtmux/gstqtmux.c: - qtmux: endianness in gstreamer is an int, not boolean. - -2010-01-16 13:17:08 -0800 Michael Smith <msmith@songbirdnest.com> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: parse more forms of codec_data - -2010-02-01 22:37:39 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - lv2: code cleanups - More logging and comments. Rename some vars for consistency. Fully init port - struct. - -2010-02-01 22:32:32 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/ladspa/gstladspa.c: - * ext/lv2/gstlv2.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.h: - signalprocessor,lv2,ladspa: move sample-rate to baseclass - We need the sample-rate in baseclass for upcomming timestamp changes. - -2010-02-01 22:24:52 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/README: - * ext/lv2/gstlv2.c: - lv2: shorter element names - Cut off the protocol part from the uri. Also just g_Strdup, instead of printf - the name. - -2010-02-01 17:46:29 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: provide a getcaps function for src pad and improve setcaps - Previously jpegparse was failing in decodebin as the caps we were setting where not - setting all caps fields. We need the own getcaps function to report what we actualy - accept. - -2010-02-01 17:16:16 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/jpegformat/gstjpegparse.c: - jpegparse: extract comment and post as metadata - -2010-02-01 15:04:28 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/jpegformat/Makefile.am: - * gst/jpegformat/gstjpegformat.h: - * gst/jpegformat/gstjpegparse.c: - * gst/jpegformat/gstjpegparse.h: - jpegformat: code cleanups - Move the jpeg marker defines to a header (to be used for jifmux). Rewrite some - comments. Use gst_element_class_set_details_simple(). Add more logging. - -2010-01-31 22:21:42 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - lv2: simpify property registration - Avoid type cheking casts for each property. Use a running index. - -2010-01-31 22:16:18 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/signalprocessor/Makefile.am: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: use the gst-controller, add some basic timestamping - Atleast for FX we now have timestamps and can sync the controller. Still need - timestamps for sources. - -2010-01-31 22:14:04 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/ladspa/gstladspa.c: - ladspa: simplify property registration - Don't do checking cast for each parameter. Use a running index. - -2010-01-31 22:13:06 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - lv2: use plugin dependency registry api - -2010-01-31 22:11:40 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - lv2: lookup GQuark just once instead for each plugin+1 - -2010-01-31 22:08:33 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/ladspa/gstladspa.c: - ladspa: lookup GQuark just once and not for each plugin+1 - -2010-01-31 22:07:09 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: these are not gtk-doc comments - -2010-01-31 22:05:30 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/ladspa/Makefile.am: - * ext/ladspa/gstladspa.c: - * ext/lv2/Makefile.am: - * ext/lv2/gstlv2.c: - ladspa/lv2: link and init to gst-controller - -2010-01-31 15:53:27 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: new is a c++ keyword, better logging - Use pad instead of new for the pad var. Also use pad as object in to debug - logging. - -2010-01-30 15:19:30 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From 15d47a6 to 96dc793 - -2010-01-29 12:25:08 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/jpegformat/Makefile.am: - * gst/jpegformat/gstjpegformat.c: - * gst/jpegformat/gstjpegparse.c: - jpegformat: move plugin part to speparate file, so that we can add the jifmux - -2010-01-29 11:39:50 +0200 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-jpegformat.xml: - docs: update of the plugin docs, adding new introspect data - -2009-08-19 12:22:30 +0200 Arnout Vandecappelle <arnout@mind.be> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/jpegformat/Makefile.am: - * gst/jpegformat/gstjpegparse.c: - * gst/jpegformat/gstjpegparse.h: - * tests/check/Makefile.am: - * tests/check/elements/jpegparse.c: - jpegparse: new jpeg parser element. FIxes #583098 - Parse JPEG images, extracts its metadata, set caps and - packetize an image per buffer. - -2010-01-28 15:00:32 +0200 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/camerabin/gst-camera.c: - camerabin-example: cleanups for mainloop and state-changes. Fixes #608042 - Start camerabin via idle handler to have the mainloop already running. Avoid - some unnecessary state changes. Cleanup the bus usage when restarting. - -2010-01-28 14:57:06 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin.c: - camerabin: don't log NULL caps, also downgrade to DEBUG as it is very verbose - This debug log entry was also not ment to be used in the failure case. - -2010-01-28 00:07:14 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dataurisrc/gstdataurisrc.c: - dataurisrc: add start function so we can error out properly if no uri is set - Also save a set URI after it has been parsed successfully, so that _get_uri() - actually works. - -2010-01-27 23:46:32 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dataurisrc/gstdataurisrc.c: - dataurisrc: don't post error message when setting the URI failed - There's a gboolean return for that, and the messages don't really - add anything useful. - -2010-01-27 23:39:14 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dataurisrc/gstdataurisrc.c: - dataurisrc: must release the object lock before using GST_ELEMENT_ERROR - -2010-01-27 23:34:34 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - lv2: add more debug and remove "\n" from debug logging - -2010-01-27 23:29:44 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - lv2: better gobject properties - Use lv2:symbol as a base for the property name and lv2:name for nick and blurb. - -2010-01-26 17:54:28 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - qtmux: streamline moov data memory storage - In particular, use arrays rather than (double) linked lists. - -2010-01-14 11:50:33 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * gst/audioparsers/gstbaseparse.c: - audioparsers: rename baseparse GType name to avoid possible conflicts - -2010-01-14 12:06:03 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: use correct h264_parse prefix in function name - -2010-01-27 12:08:48 +0100 Vincent GENIEUX <vgenieux at free.fr> - - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - dvbsrc: fix element shutdown on bad reception - When we have a bad reception, avoid going into an infinite loop by setting a - shutdown flag when shutting down. - Fixes #607747 - -2010-01-26 13:44:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: g_free is NULL safe - -2010-01-25 19:06:53 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/asfmux/gstasfobjects.c: - * gst/asfmux/gstasfobjects.h: - * gst/asfmux/gstasfparse.c: - * gst/asfmux/gstrtpasfpay.c: - rtpasfpay: Fix packet length semantics - Following the ed4d08189ea6e19a50e029e60da52d3583c39fbb - commit, this one fixes rtpasfpay to use packet length - as the payloaded data length, but also accepting it - as the full packet size for compatibility with - other implementations due to the lack of clarity of the - spec in this part. - -2010-01-21 10:51:16 -0300 Håkon Skjelten <skjelten@pvv.org> - - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfmux.h: - * gst/asfmux/gstasfobjects.h: - asfmux: Compatibility with WMSP in WMP - Makes the asfmux content compatible with WMSP and does - some hacks to make it playable in WMP, it doesn't accept - data objects with 0 size indicating that we don't know - its size, though the spec says it should be possible. - Fixes #607555 - -2010-01-25 23:06:59 +0200 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/camerabin/gst-camera.c: - camerabin-example: remove maemo comment and log filename - The maemo fixme is not needed anymore. Log the choosen filename to help - people finding the files. - -2010-01-25 23:04:38 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/camerabingeneral.c: - camerabin: ref element before removing from the bin to resurrect - This function is not supposed to dispose the element in the case of failure - as the caller is using the elements name in the error message. Also add - some more input parameter checks in the form of g_return_val_if_fail - -2010-01-25 12:21:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/selector/gstinputselector.c: - Revert "inputselector: Protect g_object_notify() with the object's mutex" - This reverts commit 7e067615ffb5614f068f7753c10dde99afe49c3c, it's causing - deadlocks with playbin2. - -2010-01-25 12:12:32 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dataurisrc/gstdataurisrc.c: - dataurisrc: Remove role attribute from links - -2010-01-25 11:56:33 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-adpcmenc.xml: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-dataurisrc.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * gst/dataurisrc/gstdataurisrc.c: - dataurisrc: Add docs and integrate into build system - Fixes again bug #596885. - -2010-01-25 11:12:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dataurisrc/Makefile.am: - * gst/dataurisrc/gstdataurisrc.c: - * gst/dataurisrc/gstdataurisrc.h: - dataurisrc: Add data: URI source element - This is slightly based on the WebKit data: URI source - but supports more parts of RFC 2397. - Fixes bug #596885. - -2010-01-25 07:42:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/dataurisrc/Makefile.am: - dataurisrc: Add directory for data: URI source - -2010-01-25 11:36:48 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - lv2: create valid gobject property names. Fixes #602528 - We cannot use the names as we get them from lv2 for the gparamspec name, only - for nick/blurb. Apply same algorithms like elsewhere (ladspa) for name. - -2010-01-25 11:49:46 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/mxf/mxfup.c: - mxf: add a return to fix the build when turning assert off - -2010-01-25 11:48:29 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/ivorbis/vorbisdec.c: - * gst/mxf/mxfup.c: - * win32/common/config.h: - Revert "mxf: add a return to fix the build when turning assert off" - This reverts commit 68ca62b369fc1b77adae85d9d805457fe4e3b562. - -2010-01-22 17:45:20 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/ivorbis/vorbisdec.c: - * gst/mxf/mxfup.c: - * win32/common/config.h: - mxf: add a return to fix the build when turning assert off - -2010-01-24 20:53:00 +0100 Kipp Cannon <kcannon@ligo.caltech.edu> - - * gst/selector/gstinputselector.c: - inputselector: Protect g_object_notify() with the object's mutex - This works around the thread unsafety of g_object_notify() - Fixes bug #607513. - -2010-01-22 10:48:26 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * ext/faac/gstfaac.c: - faac: fix warnings under OS X.. - -2010-01-22 10:46:51 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * configure.ac: - Don't build osxvideosrc and qtwrapper in Snow Leopard. - QuickTime isn't available anymore in OS X Snow Leopard. - -2010-01-22 02:23:30 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/pnm/gstpnmutils.h: - pnm: use same media type as other elements - gdkpixbuf and our new typefinder in -base use image/x-portable-*. - -2010-01-22 02:22:56 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - pnm: make element details a bit more descriptive - -2010-01-22 02:19:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/pnm/gstpnm.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmdec.h: - * gst/pnm/gstpnmenc.c: - * gst/pnm/gstpnmenc.h: - * gst/pnm/gstpnmutils.c: - * gst/pnm/gstpnmutils.h: - pnm: add copyright notice - -2010-01-22 02:10:08 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/pnm/gstpnm.c: - pnm: move typefinding into -base - -2010-01-11 01:18:16 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/examples/camerabin/gst-camera.c: - tests: refactor weird bus sync handler code in camerabin example - -2010-01-21 18:11:34 +0100 Thijs Vermeir <thijsvermeir@gmail.com> - - * ext/Makefile.am: - flite: build and dist flite plugin - fixing "make dist" - -2010-01-21 15:58:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxftypes.c: - mxf: Correctly initialize memory - -2010-01-20 13:30:48 +0100 Benjamin Otte <otte@redhat.com> - - * ext/lv2/gstlv2.c: - * ext/theora/theoradec.h: - * ext/zbar/gstzbar.h: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfobjects.c: - * gst/asfmux/gstasfobjects.h: - * gst/qtmux/descriptors.c: - * gst/qtmux/descriptors.h: - * gst/qtmux/properties.c: - cleanup Various style and cleanups - Various fixes for gtk-doc warnings and making functions without - arguments take void as parameter. - -2010-01-20 13:29:52 +0100 Benjamin Otte <otte@redhat.com> - - * sys/oss4/oss4-mixer.c: - oss4 Fix compiler warning about unused return value - -2010-01-20 00:54:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From 358cf5c to 15d47a6 - -2010-01-18 10:57:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/cdxaparse/gstcdxaparse.c: - cdxaparse: Fix buffer leak - Fixes bug #607285. - -2010-01-16 15:32:47 -0800 David Schleef <ds@schleef.org> - - * ext/faac/gstfaac.c: - faac: Fix channel layout - Adjusted the channel mappings to agree with the default channel mappings - in the spec, which is presumably what faac is using. Fixes #607105. - -2010-01-16 15:32:02 -0800 David Schleef <ds@schleef.org> - - * ext/flite/gstflitetestsrc.c: - flite: handle samplesperbuffer - -2010-01-16 12:43:43 -0800 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/Makefile.am: - * ext/flite/Makefile.am: - * ext/flite/gstflite.c: - * ext/flite/gstflitetestsrc.c: - flite: Add flitetestsrc - Flite is a speech synthesizer library (BSD-ish license). This element - negotiates a (possibly) multichannel audio stream, and then continually - outputs buffers naming the number and position of the channel. It's - kinda crappy, but I needed it for testing purposes. - -2010-01-16 17:02:52 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - frei0r: Make sure that property names always start with a letter - Otherwise GLib throws assertions - -2010-01-16 16:52:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Replace floating point arithmetic in the inner processing loops by integer arithmetic - -2010-01-16 13:05:58 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: Only accept specific channel layouts as required by AAC - Fixes bug #607105. - -2010-01-16 11:41:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/examples/camerabin/Makefile.am: - * tests/examples/camerabin/gst-camera.c: - * tests/icles/Makefile.am: - examples: Fix build and signal connection for GtkBuilder stuff - -2010-01-16 11:26:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Check for gmodule-export-2.0 for GtkBuilder - -2010-01-16 11:23:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/icles/Makefile.am: - * tests/icles/metadata_editor.c: - icles: Link with GTK+ - -2010-01-16 11:16:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Require GTK+ >= 2.12 for GtkBuilder - GTK+ 2.12 is already older than 2 years so this shouldn't - be a problem for anybody. Also it's only used in examples. - -2010-01-16 06:57:26 +0100 Javier Jardón <jjardon@gnome.org> - - * configure.ac: - * gst-plugins-bad.spec.in: - * po/POTFILES.skip: - * tests/examples/camerabin/Makefile.am: - * tests/examples/camerabin/gst-camera-perf.glade: - * tests/examples/camerabin/gst-camera-perf.ui: - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin/gst-camera.ui: - * tests/icles/Makefile.am: - * tests/icles/metadata_editor.c: - * tests/icles/metadata_editor.ui: - tests: Port from libglade to GtkBuilder - Fixes bug #601108. - -2010-01-15 21:34:02 +0100 Julien Moutte <dolphy@imac.(none)> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: don't set an invalid framerate. - When fixed_vop_rate is not set we can not set a framerate based on - vop_time_increment_resolution as it would most likely be wrong. - Don't set any framerate on the caps in that case. - -2010-01-14 08:09:03 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/gstqtmux.c: - qtmux: Actually use new caps info on renegotiation - Following the previous qtmux commit, this patch tries - to use the new info added to the caps to fill the 'trak' - atom's fields and children atoms. This way qtmux will - use the late added 'codec_data' when h264parse adds - it in the following pipeline: - videotestsrc num-buffers=200 ! x264enc byte-stream=true ! \ - h264parse output-format=0 ! qtmux ! \ - filesink location=test.mov - -2010-01-13 23:33:51 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/gstqtmux.c: - qtmux: Do caps renegotiation when it only adds fields - Qtmux can accept caps renegotiation if the new caps is a - superset of the old one, meaning upstream added new info to - the caps. This patch still doesn't make qtmux update any - atoms info from the new info, but at least it doesn't - reject the new caps anymore. - A pipeline that reproduces this use case is: - videotestsrc num-buffers=200 ! x264enc byte-stream=true ! \ - h264parse output-format=0 ! qtmux ! \ - filesink location=test.mov - -2010-01-14 12:59:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Improve debug output a bit and simplify code - -2010-01-14 12:56:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Make sure that the video buffer is writable before writing to it - -2010-01-14 12:47:15 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/apexsink/gstapexsink.c: - apexsink: change volume property to a double - Change the volume property from int to a double so that playbin2 can use it. - Keep the volume internally as a percent for now with the default 75% mapped to - a volume of 1.0. - some cleanups, add some FIXME and comments. - Fixes #606878 - -2010-01-13 19:30:45 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: provide request pads under wider conditions - Fixes #606859. - -2010-01-13 10:35:00 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/gstqtmuxmap.c: - qtmux: Only accept avc-sample h264 - qtmux and mp4mux should only accept h264 in avc-sample - format - -2010-01-13 09:42:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: Add stream-format to caps - Adds the new stream-format field to h264parse caps - Fixes #606662 - -2010-01-13 00:38:47 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * Makefile.am: - * common: - build: include cruft.mak and add recently-merged plugins to cruft list - -2010-01-12 23:53:18 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/libmms/gstmms.c: - mmssrc: post error message in addition to redirect when connect fails - When we can't connect to the server, we should still post a proper - error message on the bus, so that applications that don't handle the - redirect messsage get a proper error message (and a hint to look for - the redirect). - Fixes #606636. - -2010-01-12 15:45:14 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: Correctly rewrite all nal prefixes - When converting to byte-stream do not forget to rewrite - all nal prefixes instead of only the first one. - -2010-01-12 19:33:37 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: improve faac configuration - In particular, align configuration some more with reference binary faac. - Fixes #606726. - -2010-01-12 14:51:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux_h264.c: - mpegtsmux: Fix mistake on previous commit - Use the correct variables and variable format in the warning - message - -2010-01-12 18:55:53 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/audioparsers/gstflacparse.c: - flacparse: Initialize variables. - Fixes build on $#@*( macosx - -2010-01-12 17:05:13 +0100 Edward Hervey <bilboed@bilboed.com> - - * tests/check/Makefile.am: - tests: Add neonhttpsrc to the list of elements ignored for state-change - Setting neonhttpsrc to PAUSED/PLAYING requires a running http server on - localhost. - -2010-01-12 09:58:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: remove codec_data if output is bytestream - codec_data should be removed from the src pad caps if the - output is in bytestream format - Fixes #606657 - -2010-01-12 09:35:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux_h264.c: - mpegtsmux: Do not crash on misinterpreted h264 - Avoid crashing when bytestream h264 is interpreted as avc format - h264 - Fixes #606657 - -2010-01-11 22:41:57 +0300 ������ ��������� <lrn1986@gmail.com> - - * ext/soundtouch/gstbpmdetect.cc: - * ext/soundtouch/gstpitch.cc: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst/audioparsers/gstaacparse.c: - * gst/audioparsers/gstamrparse.c: - * gst/h264parse/gsth264parse.c: - * gst/mpegdemux/Makefile.am: - win32: Include config.h before anything else. Fix mpegdemux LIBADD - Because config.h defines __MSVCRT_VERSION__, which should be defined - before inclusion of any system header. - Also fixes mpegdemux Makefile.am LIBADD typo. - Fixes #606665 - -2010-01-12 00:46:27 +0300 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - * gst/librfb/rfbdecoder.c: - * gst/librfb/vncauth.c: - librfb: port rfbsrc to MinGW - Fixes #606677 - -2010-01-11 13:20:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - aacparse: Also add stream-format to template caps - Do not forget to add stream-format to template caps - off aacparse - -2010-01-11 13:13:41 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/faac/gstfaac.c: - * gst/audioparsers/gstaacparse.c: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmuxmap.c: - * tests/check/elements/aacparse.c: - Rename aac's stream-format 'none' to 'raw' - Renames aac's stream-format from previous commits from none to - raw - -2010-01-11 16:09:38 +0100 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - configure: include <windows.h> into msacm.h conftest - -2010-01-11 12:10:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * tests/check/elements/aacparse.c: - aacparse: update tests to stream-format changes - Updates aacparse unit tests to check for stream-format - correctness as well. - -2010-01-11 10:51:18 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - aacparse: Add stream-format to output caps - Adds stream-format field to output caps - -2010-01-11 10:34:32 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmuxmap.c: - qtmux: Only accept stream-format='none' aac - Only accept raw aac streams (stream-format=none) to avoid - generating invalid files. - Fixes #604925 - -2010-01-11 09:48:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: Add format to output caps - Adds 'stream-format' to output caps to inform if the stream is - adts or raw. This makes it possible for muxers to reject - input streams on caps if they don't support adts instead of - generating a invalid file. - Fixes #604925 - -2010-01-11 01:02:59 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/resindvd/gstmpegdemux.c: - resindvd: fix unaligned access in this copy of mpegdemux as well - See #606371. - -2010-01-11 00:59:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/vmnc/vmncdec.c: - vmnc: use existing macros to avoid alignment issues - -2010-01-11 00:57:41 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/librfb/rfbdecoder.c: - rfbsrc: use existing macros to avoid alignment issues - -2010-01-11 00:24:59 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/asfmux/gstasfobjects.c: - asfmux: fix alignment and endianness issue - -2010-01-11 00:16:18 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/zbar/gstzbar.c: - zbar: use GST_MAKE_FOURCC to create FOURCC - -2010-01-10 10:06:55 -0300 Linqiang Pu <pulq.ustc@gmail.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: fix allignment issue - Use GST_READ_UINT32_BE instead of GUINT32_FROM_BE to - fix int allignment issues on ARM - Fixes #606371 - -2010-01-08 16:06:38 +0000 Marc-André Lureau <mlureau@flumotion.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: only video can have non-delta-unit - -2009-12-18 14:14:17 +0100 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/tsmux/tsmux.c: - * gst/mpegtsmux/tsmux/tsmux.h: - mpegtsmux: mark delta-unit on outgoing buffers - Signed-off-by: Marc-André Lureau <mlureau@flumotion.com> - -2010-01-07 17:54:28 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: optimize src caps updating - -2010-01-07 17:47:03 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: fix framerate calculation - ... and also remove a superfluous duplicate debug statement. - -2010-01-07 17:42:24 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: fix regression in output buffer timestamping - Specifically, properly mark a buffer (NALU or AU) to start a frame or not. - -2010-01-06 11:20:06 -0800 Michael Smith <msmith@songbirdnest.com> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: avoid crash if vos < 5 bytes. - -2009-12-13 13:53:14 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: fix typo in property description - -2009-12-13 13:49:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegdemux/Makefile.am: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: fix language extraction - The descriptor contains ISO 639-2 language codes, but we want - two-letter ISO 639-1 codes in GST_TAG_LANGUAGE. - -2009-12-05 18:16:47 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/examples/camerabin/gst-camera.c: - examples: make camerabin test application handle errors when starting up - Instead of hanging forever in a _get_state() in case an error occurs when - starting up camerabin, bail out and print an error message. Also remove - unnecessary _get_state() when shutting down the pipeline. - -2010-01-05 18:44:45 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-audioparsersbad.xml: - audioparsers: add some missing documentation pieces - -2010-01-05 16:10:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - * ext/faac/gstfaac.h: - faac: documentation fix - -2010-01-05 15:05:05 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstaacparse.c: - * gst/audioparsers/gstamrparse.c: - * gst/audioparsers/gstbaseparse.c: - audioparsers: documentation fixes - -2010-01-05 15:04:38 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/audioparsers/gstac3parse.c: - ac3parse: add documentation - -2010-01-05 14:48:49 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/audioparsers/gstflacparse.c: - * gst/audioparsers/gstflacparse.h: - flacparse: add documentation - -2009-12-21 18:29:43 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: perform additional frame checks when resyncing - -2010-01-05 16:35:52 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: fix (multiple channel) frame parsing - -2010-01-05 16:35:44 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: declare unparsed input and parsed output - -2009-12-21 18:19:23 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstac3parse.c: - ac3parse: fix scanning for next syncword - -2009-12-21 18:18:39 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: adjust seek handling and newsegment sending - Perform sanity check on type of seek, and only perform one that is - appropriately supported. Adjust downstream newsegment event - to first buffer timestamp that is sent downstream. - -2009-12-21 11:59:45 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: minor refactor cleanup - Also add some debug logging. - -2009-12-18 21:05:11 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: locate next sync code more efficiently - -2009-12-18 21:04:12 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: baseparse takes care of handling leftover pieces - -2009-12-18 21:02:40 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: implement leftover draining in pull mode - -2009-12-17 12:45:36 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstflacparse.c: - flacparse: set _OFFSET and _OFFSET_END on outgoing buffers - -2009-12-17 12:44:20 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/Makefile.am: - * gst/audioparsers/gstflacparse.c: - * gst/audioparsers/gstflacparse.h: - * gst/audioparsers/plugin.c: - * gst/flacparse/Makefile.am: - * gst/flacparse/gstbaseparse.c: - * gst/flacparse/gstbaseparse.h: - * gst/flacparse/gstflac.c: - audioparsers: move 'flacparse' into it - -2009-12-16 18:38:33 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: provide default conversion using bps if no fps available - Also store estimated duration as such, rather than pretending otherwise - (e.g. set by subclass). - -2010-01-04 10:23:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/modplug/gstmodplug.cc: - modplug: Fix indention - -2009-12-29 17:28:06 +0200 Kaj-Michael Lang <milang@tal.org> - - * ext/modplug/gstmodplug.cc: - modplug: Allow 1-2 channels for 16 and 32 bit depths, not only for 8 bits. - Fixes bug #605721. - -2009-12-29 16:07:59 +0200 Kaj-Michael Lang <milang@tal.org> - - * ext/modplug/gstmodplug.cc: - * ext/modplug/gstmodplug.h: - modplug: Allow 32 bit depth, modplugs native format. - Fixes bug #605720. - -2010-01-02 17:33:57 +0100 Arnaud Patard <arnaud.patard@rtp-net.org> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Handle eac3 in PMT - When the stream type is set to private data, gst-mpegtsdemux is trying to find - audio descriptors in PMT and look for AC3 (tag 0x6a) but doesn't look for EAC3 - (tag 0x7a). Handle this case too. - Fixes bug #605904. - -2009-12-30 21:50:32 +0100 Alessandro Decina <alessandro.d@gmail.com> - - * gst/h264parse/gsth264parse.c: - h264parse: fix caps handling in _update_src_caps. - -2009-12-28 11:34:35 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/qtmux/gstqtmux.h: - qtmux: also add .h file changes to unbreak the build - -2009-12-27 23:51:50 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/qtmux/gstqtmux.c: - qtmux: use correct names from template for request pads - The pads where names pad0, pad1, ... - -2009-12-27 23:32:58 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/qtmux/gstqtmux.c: - qtmux: move errors _new_pad to the end - -2009-12-21 19:12:42 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * common: - Automatic update of common submodule - From 47cb23a to 14cec89 - -2009-12-21 13:58:30 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: Accept non-paired uint tags - Adds support for unpaired unsigned interger tags - -2009-12-21 12:05:37 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/fourcc.h: - * gst/qtmux/gstqtmux.c: - qtmux: Adds new tags - Maps more tags that are already posted by qtdemux - Fixes #599759 - -2009-12-18 16:16:46 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: only raw output needs codec_data in caps - -2009-12-18 13:30:29 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: check for remaining data when draining in push mode - -2009-12-18 13:30:07 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - baseparse: fix pull mode cache size comparison - -2009-12-18 13:01:17 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/audioparsers/gstac3parse.c: - ac3parse: Fix unitialized variable. - -2009-12-17 11:04:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: Internal sink improvements - Does some general improvements with the internal sink handling. - 1) Do not remove and re-add the ghostpad when changing - internal sink - 2) Only instantiate the default sink when changing from NULL - to READY if there is no other available - 3) Avoid changing the internal sink if not on NULL state - Fixes #598682 - -2009-12-17 07:54:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: Minor fixes - Downgrade a warning message to debug. Remove an - already fixed FIXME and add a note about (not-)using - fpsdisplaysink in autovideosink. Change the created - ghostpad to use the name "sink" as it is advertised in - the pad template. - -2009-12-17 14:46:01 +0000 Christian Schaller <christian.schaller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - * gst/audioparsers/Makefile.am: - Update spec file and fix ac3parser header listing in Makefile.am - -2009-12-17 01:05:28 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/icles/Makefile.am: - tests: try to fix 'make dist' when cog is not installed - -2009-12-16 18:32:42 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: fix setting sync on child bin - Use GST_IS_BIN instead of G_OBJECT_TYPE to check if the - internal sink is a bin. Using the later won't work when - the sink is not a bin directly (but inherits from one, like - autovideosink). - Fixes #604280 - -2009-12-15 13:08:08 +0100 Philippe Normand <phil@base-art.net> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: check the sync property exists on embedded sink(s) - Follow-up on 4111d6321f140eb7790620ab42e5cf1d9413b56a, the video - sink(s) used by fpsdisplaysink might not have the sync property. So we - check its existence to avoid warning from g_object_set() at runtime. - Fixes #604280 - -2009-12-10 22:20:45 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - * gst/qtmux/gstqtmuxmap.c: - qtmux: support more of j2k - Reads the new caps added to qtdemux by commit - c917d65e6df0b5d585f905c7ad78a8a0a44b2cb0 - and adds its corresponding atoms. - Also adds support for image/x-jpc as it is the same - as image/x-jp2, except that the buffers need to be - boxed inside a jp2c isom box before muxing. To solve - this the QTPads now have a function that (if - not NULL) is called when a buffer is collected. This - function returns a replacement to the current collected - buffer. - Fixes #598916 - -2009-12-14 16:16:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/cog/Makefile.am: - cog: Table generation utility needs to link to -lm too - -2009-12-14 16:08:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/cog/cog.orc: - cog: Don't build orc_memcpy() and depend on orc >= 0.4.3 for orc_memcpy() - In the latest release this function is already defined. - -2009-12-10 16:53:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/fourcc.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - qtmux: Maps 'classification' tag for 3gpp files - Adds the mapping of 'classification' tags to writing of - 'clsf' atoms for gppmux. - Based on a patch by: Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - -2009-12-10 22:49:13 -0300 Philippe Normand <phil@base-art.net> - - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/fpsdisplaysink.h: - fpsdisplaysink: expose video sink using a property - Exposes the internally used sink as video-sink property and - makes the default one to be autovideosink instead of - the hardcoded xvimagesink - Fixes #604280 - -2009-12-11 16:32:48 -0800 Peter van Hardenberg <pvh@songbirdnest.com> - - * configure.ac: - * gst-plugins-bad.spec.in: - * gst/adpcmenc/Makefile.am: - * gst/adpcmenc/adpcmenc.c: - adpcmenc: add new adpcm encoder element. - -2009-12-11 10:25:16 -0800 Michael Smith <msmith@songbirdnest.com> - - * gst/audioparsers/gstbaseparse.c: - audioparse: fix a format string as reported on irc. - -2009-12-10 10:10:15 -0800 Michael Smith <msmith@songbirdnest.com> - - * gst/adpcmdec/adpcmdec.c: - adpcmdec: make power of 2 more accurate. - -2009-12-10 12:56:47 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: fix caps parameters setting - Also consider PPS when selecting SPS to pick parameters from. - Only update caps when settings actually changed, and when these are valid. - -2009-12-08 18:57:49 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/ivorbis/vorbisdec.c: - * ext/ivorbis/vorbisdec.h: - ivorbis: also cater for traditional 16-bit width sample output - -2009-12-10 10:40:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Don't do pointer dereferences in the processing loop - Lowers the time taken there in my testcase from 6.91% to 6.20% - as measured by callgrind. - -2009-11-18 16:38:33 +0100 unknown <havard.graff@.eu.tandberg.int> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: update the current_ssrc from the caps - Fixes #604101 - -2009-12-09 14:42:21 +0100 Håvard Graff <havard.graff@tandberg.com> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: release pads when disposing - Because of an allocated priv (GstRTPMuxPadPrivate), the element will - leak memory if not gst_rtp_mux_release_pad() is called. This would - previously only happen if release_request_pad() was called explicitly, - somthing that should not be neccesary. - Fixes #604099 - -2009-12-09 13:40:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmux/gstrtpdtmfmux.c: - dtmfmux: method name cleanups - -2009-12-09 09:57:58 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Implement srcpad query function to always forward to the video sinkpad - -2009-12-09 09:55:32 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Proxy buffer allocation on video sinkpad to the srcpad - ...and add getcaps function to the video sinkpad. - -2009-12-09 09:51:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Implement srcpad event functions for seeking and correct event forwarding - Copied from textoverlay. - -2009-12-08 17:59:04 -0800 Michael Smith <msmith@songbirdnest.com> - - * gst/qtmux/atoms.c: - * gst/qtmux/gstqtmux.c: - qtmux: remove c++ comments and add some more comments. - -2009-12-08 17:55:56 -0800 Michael Smith <msmith@songbirdnest.com> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmuxmap.c: - qtmux: add ima adpcm support - -2009-12-08 17:55:13 -0800 Stephen McNamara <steve.mcnamara@ultra-sml.com> - - * sys/dshowvideosink/dshowvideosink.cpp: - dshowvideosink: don't leak filter_media_event - -2009-11-23 16:34:50 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstac3parse.c: - ac3parse: ensure sufficient data available for parsing - -2009-10-29 15:19:04 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstac3parse.c: - ac3parse: extract and use some more details for Enhanced Ac-3 streams - -2009-10-29 15:18:37 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - baseparse: custom bufferflag indicates not to count frame in stats - -2009-10-28 14:08:43 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstac3parse.c: - ac3parse: perform additional frame checks when resyncing - -2009-10-28 14:07:17 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstac3parse.c: - ac3parse: inform base parser of frame duration - -2009-10-27 16:16:50 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstac3parse.c: - ac3parse: improve src caps settings - -2009-11-27 17:59:03 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/Makefile.am: - * gst/audioparsers/gstac3parse.c: - * gst/audioparsers/gstac3parse.h: - * gst/audioparsers/plugin.c: - ac3parse: initial version - MARGINAL rank for now; might take some time for some (useful) - framed=true/false to appear here and there. - -2009-11-26 18:34:45 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstamrparse.c: - * gst/audioparsers/gstamrparse.h: - amrparse: use (default) time handling of baseparser class - -2009-11-26 18:15:21 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * gst/amrparse/Makefile.am: - * gst/amrparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.h: - * gst/audioparsers/Makefile.am: - * gst/audioparsers/gstamrparse.c: - * gst/audioparsers/gstamrparse.h: - * gst/audioparsers/plugin.c: - audioparsers: move 'amrparse' into it - -2009-11-27 17:27:32 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/audioparsers/gstbaseparse.c: - audioparsers: reference GstBaseParse now lives here - -2009-11-28 18:13:31 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * gst/aacparse/Makefile.am: - * gst/audioparsers/Makefile.am: - * gst/audioparsers/gstaacparse.c: - * gst/audioparsers/gstaacparse.h: - * gst/audioparsers/gstbaseparse.c: - * gst/audioparsers/gstbaseparse.h: - * gst/audioparsers/plugin.c: - audioparsers: rename 'aacparse' plugin to generic 'audioparsers' plugin - -2009-11-26 17:04:43 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/Makefile.am: - * gst/aacparse/gstaacparse.c: - * gst/aacparse/plugin.c: - aacparse: separate plugin registration and rename plugin - -2009-11-26 17:04:36 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstaacparse.c: - aacparse: ensure sufficient data available before accessing - -2009-11-05 14:31:40 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstaacparse.c: - * gst/aacparse/gstaacparse.h: - aacparse: use (default) time handling of baseparser class - -2009-10-29 15:19:35 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstaacparse.c: - aacparse: fixup comments to C-style - -2009-10-29 16:05:00 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstbaseparse.c: - baseparse: reset passthrough mode to default (disabled) on activation - -2009-10-29 15:16:59 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstbaseparse.c: - baseparse: ensure buffer metadata is writable - -2009-10-28 14:06:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstbaseparse.c: - * gst/aacparse/gstbaseparse.h: - baseparse: fix/enhance DISCONT marking - In particular, consider DISCONT == !sync, and allow subclass to query - sync state, as it may want to perform additional checks depending - on whether sync was achieved earlier on. - Also arrange for subclass to query whether leftover data is being drained. - -2009-11-23 15:48:25 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstbaseparse.c: - * gst/aacparse/gstbaseparse.h: - baseparse: add timestamp handling, and default conversion - In particular, (optionally) provide baseparse with a notion of frames per second - (and therefore also frame duration) and have it track frame and byte counts. - This way, subclass can provide baseparse with fps and have it provide default - buffer time metadata and conversions, though subclass can still install - callbacks to handle such itself. - -2009-10-28 12:02:03 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstbaseparse.c: - baseparse: documentation fixes - -2009-10-28 12:00:08 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstbaseparse.c: - baseparse: use_fixed_caps for src pad - After all, stream is as-is, and there is little molding to downstream's - taste that can be done. If subclass can and wants to do so, it can - still override as such. - -2009-12-08 14:46:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-lv2.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shapewipe.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: Add docs and integrate into the docs build system - -2009-12-08 14:06:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: For synchronizing the text, take the video running time of the next frame - This makes sure that libass already has all text buffers for the next frame - at the time when the next frame is processed. Without this text buffers - might be one frame late or not shown at all if they're only shown for a - single frame. - -2009-12-08 11:26:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Fix I420 mode and enable it - -2009-12-08 11:25:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Fix compilation with older libass versions - -2009-12-07 10:21:32 -0800 Michael Smith <msmith@songbirdnest.com> - - * sys/dshowvideosink/dshowvideosink.h: - dshowvideosink: spell things more betterer. - -2009-12-07 10:09:19 -0800 Stephen McNamara <steve.mcnamara@ultra-sml.com> - - * sys/dshowvideosink/dshowvideosink.h: - dshowvideosink: add virtual destructor for internal helper class. - -2009-12-07 18:35:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Don't unref buffers twice - -2009-12-07 18:30:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Improve embedded font usage - For this add some new mimetypes and also check the filename extension. - Fixes bug #603938. - -2009-12-07 18:03:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Disable I420 support for now, it doesn't work reliable yet - -2009-12-07 17:04:04 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Add support for I420 - -2009-12-07 15:31:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: Optimize blit function and add support for all other non-alpha RGB formats - Also make sure to not write behind array bounds. - -2009-12-07 14:35:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Fix attachment tag handling and move it into a separate function - ...to prevent code duplication. - -2009-12-07 14:26:46 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Update text last stop after checking if timestamp/duration is valid - -2009-12-07 14:23:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: If an ASS track was allocated already only feed new codec_data to it instead of recreating - -2009-12-07 14:05:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: Lots of random cleanup and some minor memleak fixes - -2009-12-07 13:40:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Extract embedded fonts from the subtitle streams if requested - -2009-12-07 13:26:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Don't let libass print stuff on stderr but proxy the messages to the GStreamer debugging system - -2009-12-05 11:25:15 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * ext/apexsink/Makefile.am: - apexsink: clean up and fix configure logic and Makefile.am - Check for openssl and libcrypto using pkg-config and don't build the - plugin if those are not available. Also, fix the CFLAGS/LIBS order - in Makefile.am and use the detected LIBS instead of hard-coding - -lcrypto in the Makefile.am. Should fix #601417. - -2009-12-01 15:07:49 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From 87bf428 to 47cb23a - -2009-12-01 14:09:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure: Call AG_GST_PLATFORM for GST_EXTRA_MODULE_SUFFIX - This is used in the frei0r plugin already but never defined anywhere. - Fixes bug #602524. - -2009-12-01 14:17:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From da4c75c to 87bf428 - -2009-11-27 18:55:58 +0100 Edward Hervey <bilboed@bilboed.com> - - * common: - Automatic update of common submodule - From 53a2485 to da4c75c - -2009-11-27 14:38:04 +0200 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabinphotography.c: - * gst/camerabin/gstcamerabinphotography.h: - camerabin: photography interface properties. Fixes #573370 (partially) - Added GObject properties to photography interface and implemented - them in camerabin. Changed zooming to check if video-source has - zoom property. - -2009-02-23 23:18:33 +0200 René Stadler <rene.stadler@nokia.com> - - * Makefile.am: - * configure.ac: - * pkgconfig/Makefile.am: - * pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in: - * pkgconfig/gstreamer-plugins-bad.pc.in: - Add pkgconfig files for photography interface library. - -2009-10-28 12:47:19 +0200 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * gst/camerabin/Makefile.am: - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinimage.h: - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/camerabinvideo.h: - * gst/camerabin/gstcamerabin-enum.c: - * gst/camerabin/gstcamerabin-enum.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: add flags property. Fixes #573370 (partially) - Adds flags property to enable runtime configuration of - conversion and scaling elements. Also adds flag for disabling - audio completely. - -2009-10-27 16:28:25 +0200 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/camerabinvideo.h: - camerabin: remove timeoverlay build-time definition - -2009-11-26 15:33:32 -0600 Wim Taymans <wim.taymans@collabora.co.uk> - - * sys/vdpau/Makefile.am: - vdpau: fix build - -2009-11-25 21:41:27 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: replace _scale with _scale_round - Use the rounding version for improved sync between streams. - Small variations in the duration when muxing might lead to - cumullative wrong timestamping when demuxing. - Fixes #602936 - -2009-11-24 16:16:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: use timestamps for muxing - Try to use timestamps even when the stream has out of order - timestamps, only fall back to durations when we detect an - out of order buffer. Improves sync between streams. - -2009-11-24 14:34:51 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/metadata/gstmetadatamux.c: - metadata: fix classification - -2009-11-18 11:38:50 +0100 Xavier Queralt Mateu <xqueralt@flumotion.com> - - * gst/mpegdemux/mpegtspacketizer.c: - Expose lang codes in pmt - -2009-11-22 19:30:43 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - * gst/h264parse/gsth264parse.h: - h264parse: optional transforming from bytestream to sample format (or vice versa) - -2009-11-20 18:31:39 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: refactor a bit into a reset function - -2009-11-20 18:49:56 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - * gst/h264parse/gsth264parse.h: - h264parse: provide w/h from stream in src caps if not in sink caps - -2009-11-06 12:58:33 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: parse SPS some more (e.g. for width/height) - -2009-11-22 19:34:25 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - * gst/h264parse/gsth264parse.h: - h264parse: optionally output AUs rather than NALUs - That is, Access Units (frames/fields) instead of (possibly) parts thereof. - -2009-11-23 10:32:41 +0100 Edward Hervey <bilboed@bilboed.com> - - * po/POTFILES.in: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - po: remove ext/resindvd/rsnbasesrc.c - -2009-11-23 09:35:30 +0100 Edward Hervey <bilboed@bilboed.com> - - * win32/common/config.h: - win32: pre-release=>git - -2009-11-23 09:17:39 +0100 Edward Hervey <bilboed@bilboed.com> - - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdputils.h: - vdpau: Fix includes - -2009-11-22 22:54:27 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdputils.c: - vdpauvideopostprocess: convert to 1/1 pixel-aspect-ratio for rgb too - -2009-11-22 22:34:19 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpsink.c: - vdpausink: intersect allowed caps with our template caps - -2009-11-22 22:31:38 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdputils.c: - vdpau: fix gst_vdp_video|yuv_to_output_caps to also add rgb caps - -2009-11-22 22:30:19 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - vdpauvideopostprocess: use GstVdpVideoSrcPad - -2009-11-22 22:29:58 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpoutputbuffer.c: - * sys/vdpau/gstvdpoutputbuffer.h: - vdpau: add functions to GstVdpOutputBuffer needed for rgb download - -2009-11-22 22:28:18 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdpoutputsrcpad.c: - * sys/vdpau/gstvdpoutputsrcpad.h: - vdpau: add GstPad subclass GstVdpOutputSrcPad - GstVdpOutputSrcPad is a subclass of GstPad that is used for pushing out - GstVdpOutputBuffers. It takes care of caps negotiation and conversion to - video/x-raw-rgb. - -2009-11-22 22:24:12 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdpvideosrcpad.h: - gstvdpvideosrcpad: add "template-caps" property - The property limits the available output caps - -2009-11-22 22:18:55 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideobuffer.c: - gstvdpvideobuffer: fix typo - -2009-11-21 02:51:39 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdpvideosrcpad.h: - gstvdpvideosrcpad: replace get_pad_template() with get_template_caps() - -2009-11-21 01:10:50 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdpvideosrcpad.h: - gstvdpvideosrcpad: don't recreate caps in getcaps - -2009-11-21 00:13:46 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpmpegdec.h: - * sys/vdpau/gstvdpvideobuffer.c: - * sys/vdpau/gstvdpvideobuffer.h: - * sys/vdpau/gstvdpvideosrcpad.c: - * sys/vdpau/gstvdpvideosrcpad.h: - vdpau: add GstPad subclass GstVdpVideoSrcPad - GstVdpVideoSrcPad takes care of caps negotiation and conversion of - GstVdpVideoBuffers to the negotiated output format. - -2009-10-27 22:04:10 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdpsink.c: - vdpausink: rework presentation blocking a bit - instead of blocking until the previous surface has been displayed, we new only - add surfaces to the queue if it's idle. - -2009-10-27 21:18:04 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - vdpauvideopostprocess: split up chain function - -2009-10-27 20:57:05 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - vdpauvideopostprocess: implement basic qos handling - -2009-10-16 00:16:24 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpmpegdec.h: - vdpaumpegdec: add display property - -2009-10-08 23:38:24 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdputils.h: - vdpau: remove unused functions - -2009-10-08 20:25:40 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpmpegdec.h: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - vdpau: use local libgstvdp headers - -2009-10-08 20:23:33 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdp.c: - * sys/vdpau/gstvdpvideoyuv.c: - * sys/vdpau/gstvdpvideoyuv.h: - * sys/vdpau/gstvdpyuvvideo.c: - * sys/vdpau/gstvdpyuvvideo.h: - vdpau: remove now unneeded vdpauvideoyuv and vdpauyuvvideo elements - -2009-10-08 20:19:57 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - vdpauvideopostprocess: add display property - -2009-10-08 20:13:24 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpsink.c: - vdpausink: add debug output - -2009-10-08 20:13:04 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdputils.h: - * sys/vdpau/gstvdpvideobuffer.c: - * sys/vdpau/gstvdpvideobuffer.h: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - vdpauvideopostprocess: add support for video/x-raw-yuv input - -2009-10-07 10:25:46 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - vdpaumpegdec: add src_getcaps func - this way we can return only the caps we really support, since we're able to query vdpau - about it - -2009-10-07 00:13:00 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpmpegdec.h: - * sys/vdpau/gstvdpvideobuffer.c: - * sys/vdpau/gstvdpvideobuffer.h: - vdpaumpegdec: add support for negotation of x-raw-yuv output - -2009-10-04 19:27:56 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpmpegdec.h: - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdputils.h: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - * sys/vdpau/gstvdpvideoyuv.c: - * sys/vdpau/gstvdpvideoyuv.h: - * sys/vdpau/gstvdpyuvvideo.c: - * sys/vdpau/gstvdpyuvvideo.h: - vdpau: create a libgstvdp library. - The library contains GstVdpDevice GstVdpVideoBuffer and GstVdpOutputBuffer. The - library will (apart from the plugins here) be used by the upcoming gst-ffmpeg - vdpau support. - -2009-10-03 14:30:41 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - vdpaumpegdec: check for sink element returning wrong buffer type - -2009-10-02 01:04:02 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpvideobuffer.c: - * sys/vdpau/gstvdpvideobuffer.h: - vdpau: remove unneeded gst_vdp_video_buffer_add_reference function - -2009-09-24 22:26:58 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - vdpauvideopostprocess: fix longname - -2009-11-22 19:30:58 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/mimic/Makefile.am: - * gst/autoconvert/Makefile.am: - * gst/dtmf/Makefile.am: - * gst/liveadder/Makefile.am: - * gst/rtpmux/Makefile.am: - * gst/siren/Makefile.am: - * gst/valve/Makefile.am: - Clean up LDFLAGS, LIBS, CFLAGS - Fix order, fix variables that don't exist, like GST_LIBS_LIBS, - use $(LIBM) instead of -lm, and move _LIBS from LDFLAGS to LIBADD. - Spotted by Havard Graff. - -2009-11-22 19:02:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/cog/cogutils.h: - cog: include our own _stdint.h instead of <stdint.h> - -2009-11-20 11:13:58 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/librfb/d3des.c: - * gst/librfb/vncauth.c: - librfb: include our own _stdint.h not stdint.h - -2009-11-21 17:31:53 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/Makefile.am: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - * ext/resindvd/rsnbasesrc.c: - * ext/resindvd/rsnbasesrc.h: - resindvd: Remove local basesrc copy - Use the real version of basesrc instead of a local copy now that it - supports the seamless segment feature that resin needs. - -2009-11-20 13:41:27 -0800 Michael Smith <msmith@songbirdnest.com> - - * tests/icles/Makefile.am: - tests/icles: make cog test program depend on USE_COG. Fixes build without orc. - -2009-11-20 20:55:15 +0100 David Schleef <ds@schleef.org> - - * ext/cog/cog.orc: - * ext/cog/cogvirtframe.c: - cog: convert some params to consts in orc code - -2009-11-20 17:33:21 +0100 Julien Moutte <julien@fluendo.com> - - * gst/frei0r/gstfrei0rmixer.c: - frei0r: Fix compilation warnings. - -2009-11-20 17:32:44 +0100 Julien Moutte <julien@fluendo.com> - - * gst/amrparse/gstbaseparse.c: - amrparse: Fix compilation warnings - -2009-11-20 17:32:13 +0100 Julien Moutte <julien@fluendo.com> - - * gst/aacparse/gstbaseparse.c: - aacparse: Fix compilation warnings - -2009-11-20 10:31:47 -0500 Olivier Crête <tester@tester.ca> - - * gst/dtmf/tone_detect.h: - dtmf: Use _stdint.h from configure - https://bugzilla.gnome.org/show_bug.cgi?id=602465 - -2009-11-20 13:13:36 +0100 David Schleef <ds@schleef.org> - - * ext/cog/Makefile.am: - * tests/icles/Makefile.am: - cog: Add orc test code for cog - Also look for cog.orc source file in the right place. - -2009-11-19 20:33:07 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/dtmf/tone_detect.c: - * gst/dtmf/tone_detect.h: - dtmf: Update dtmfdetect to make it MSVC friendly - https://bugzilla.gnome.org/show_bug.cgi?id=602465 - -2009-11-19 18:28:52 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: fix missing debug argument - Adds a missing debug argument - -2009-11-19 23:01:29 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - lv2: set the audio-channel positions again, but now in _setup - Readd the code that was reverted for the release. We now set audio-channel - positions if any on the pad caps and not on the templates. - -2009-11-19 22:59:17 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: remove commented out code that we don't need anymore - -2009-11-17 00:39:50 +0200 Stefan Kost <ensonic@users.sf.net> - - * tests/check/generic/states.c: - tests: make state-change test timeout longer if wrappers are enabled - When ladspa || lv2 are enabled one could quickly get to 500 elements. - -2009-11-17 00:37:28 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/real/gstrealaudiodec.c: - realaudiodec: reindent and make valgrind happy - The state-change tests reported access to uninitialized memory. - -2009-11-16 22:07:31 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/ladspa/gstladspa.c: - ladspa: only use g_return_val_if_fail for checking pre-conditions - g_return_* can be disabled. Still we want to check for failed instance creation. - -2009-11-16 22:05:16 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - lv2: only use g_return_val_if_fail for checking pre-conditions - g_return_* can be disabled. Still we want to check for failed instance creation. - -2009-11-16 21:52:32 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/ladspa/gstladspa.c: - ladspa: remove left-over comment - -2009-11-16 21:50:20 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/ladspa/gstladspa.c: - * ext/lv2/gstlv2.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.h: - signalprocessor: change _setup to pass whole caps and not just sampling_rate - This allows to get rid of the sampling_rate variable in the base-class. Also now - subclasses can modify the caps to actualy negotiate. This is needed to e.g. set - audio-channel positions. - -2009-11-19 11:36:14 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: fix misinforming debug statement - -2009-11-19 11:14:57 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: ensure writable buffer metadata before setting caps - -2009-11-19 10:31:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - Automatic update of common submodule - From 0702fe1 to 53a2485 - -2009-11-18 20:06:06 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - asfmux: improving debug messages - Improves debug messages for asfmux - -2009-10-29 08:36:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmuxmap.c: - qtmux: support for SVQ3 - Adds support for muxing SVQ3 content. Usually this format - has decoder info that must be passed in the 'seqh' field - in the caps. It is also good to add the gama atom to make - quicktime not crash. - Fixes #587922 - -2009-11-18 18:00:37 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/jp2k/gstjp2k.c: - jp2k: Raise rank of encoder to MARGINAL - -2009-11-18 18:00:23 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/gsm/gstgsm.c: - gsm: Raise rank of encoder to PRIMARY - -2009-11-18 18:00:00 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/amrwbenc/gstamrwb.c: - amrwbenc: Raise rank to SECONDARY - -2009-11-18 17:59:21 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/dirac/gstdirac.cc: - dirac: Raise rank of encoder to MARGINAL - We'll prefer to use schroedinger if available, but in case it's not available - we still have the libdirac option - -2009-11-18 17:58:53 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/xvid/gstxvid.c: - xvid: Raise rank of encoder to SECONDARY - -2009-11-18 17:58:39 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/aiff/aiff.c: - aiff: Raise rank of muxer to PRIMARY - -2009-11-18 17:57:59 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/mve/gstmve.c: - mve: Raise rank of muxer to PRIMARY - -2009-11-18 17:57:25 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/asfmux/gstasfmux.c: - asfmux: Raise rank to PRIMARY - -2009-11-18 13:41:36 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: bump core requirements to 0.10.25.1 as well - Make implicit requirement explicit. - -2009-11-17 16:31:09 +0100 Yaakov Selkowitz <yselkowitz@users.sourceforge.net> - - * ext/ladspa/Makefile.am: - * ext/lv2/Makefile.am: - signalprocessor: Use correct CFLAGS for the signalprocessor headers in LV2/LADSPA - This makes sure that the headers from the source tree are taken and not - accidentially installed system headers in the case of builddir!=srcdir. - Fixes bug #602161. - -2009-11-18 03:09:18 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/rsnaudiomunge.c: - * gst/dvdspu/Makefile.am: - * gst/dvdspu/gstdvdspu.c: - resindvd, dvdspu: Use new still-frame API from gst-plugins-base - Replace the current custom DVD still-frame events with new event - creation/parsing API from libgstvideo. - -2009-11-18 02:16:03 +0000 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - bump gst-plugins-base requirement to 0.10.25.1 - -2009-11-18 02:04:19 +0000 Jan Schmidt <thaytan@noraisin.net> - - * gst/aiff/Makefile.am: - * gst/aiff/aiff.c: - Revert "aiff: Disable aiff muxer for this release." - This reverts commit 7426be70ffb113f02e37407ea989e60b638b2f00. - Re-enable the aiff muxer now that gst-plugins-bad 0.10.17 is out - and we can rely on gst-plugins-base from git. - -2009-11-17 17:25:14 -0300 Thiago Sousa Santos <thiagoss@redmoon.(none)> - - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfmux.h: - asfmux: handle streams with different start times - Prevents losing sync when remuxing streams with different - start times. The smallest start time is selected as - the base time and all timestamps are subtracted - from it to get the actual time to be used when - muxing and building indexes - Fixes #586848 - -2009-11-17 09:26:05 -0300 Thiago Sousa Santos <thiagoss@redmoon.(none)> - - * gst/qtmux/gstqtmux.c: - qtmux: do not leak a string - Frees a string after use. Also does some code organization - -2009-11-16 14:57:53 -0300 Thiago Sousa Santos <thiagoss@redmoon.(none)> - - * gst/qtmux/atoms.c: - qtmux: do not add size to the pointer variable - Do not wrongly add the result of the function to the - pointer to the buffer size. Instead, check the result - to see if the serialization was ok. - Based on a patch by: "Carsten Kroll <car@ximidi.com>" - Fixes #602106 - -2009-11-06 10:34:39 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - qtmux: handle 'late' streams - When muxing streams, some can start later than others. qtmux - now handle this by adding an empty edts entry with the - duration of the 'lateness' to the stream's trak. - It tolerates a stream to be up to 0.1s late. - Fixes #586848 - -2009-11-05 21:35:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - qtmux: adds the EDTS and ELTS atoms to atoms.c - These atoms will be useful for signaling streams - that start later in the file. As well for adding - edit lists if needed sometime later. - -2009-11-17 17:59:56 -0800 Michael Smith <msmith@songbirdnest.com> - - * gst/adpcmdec/adpcmdec.c: - adpcmdec: decode adpcm without explicit length, as found in qt. - -2009-11-15 03:21:56 +0000 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: Forward the still frame event downstream - Forward still-frame events downstream so elements like deinterlace - can use them. - -2009-11-14 00:31:29 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - resindvd: Guard against a divide-by-zero error. - https://bugzilla.gnome.org/show_bug.cgi?id=600263 - -2009-11-18 01:46:38 +0000 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - * win32/common/config.h: - Back to development -> 0.10.17.1 - -2009-11-17 01:53:54 +0000 Jan Schmidt <thaytan@noraisin.net> - - * gst-plugins-bad.doap: - Add 0.10.17 release to the doap file - -=== release 0.10.17 === - -2009-11-17 01:25:47 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-aiff.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shapewipe.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * win32/common/config.h: - Release 0.10.17 - -2009-11-17 01:13:36 +0000 Jan Schmidt <thaytan@noraisin.net> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2009-11-15 21:46:01 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/ladspa/gstladspa.c: - * ext/lv2/gstlv2.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.h: - signalprocessor: don't set channel positions in template-caps, Fixes #601775 - Revert the changes that added audio positions to template caps. We have an un- - fortunate limitation in core that does not allow to do it. Keep a few things - commented out, so that the channel position can later on be set in setcaps. - -2009-11-13 02:18:31 +0000 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - * po/ky.po: - * po/lv.po: - * po/sv.po: - * win32/common/config.h: - 0.10.16.3 pre-release - -2009-11-11 10:58:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/celt/gstceltdec.c: - * ext/celt/gstceltenc.c: - celt: Port to 0.7 API - Fixes bug #600724. - -2009-11-11 10:54:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/celt/gstceltenc.c: - celt: Make celt version checks better extensible - -2009-11-09 19:20:21 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ChangeLog: - * configure.ac: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - 0.10.16.2 pre-release - -2009-11-09 19:08:49 +0000 Jan Schmidt <thaytan@noraisin.net> - - * gst/aiff/Makefile.am: - * gst/aiff/aiff.c: - aiff: Disable aiff muxer for this release. - The aiff muxer relies on GstByteWriter API added after 0.10.25. Disable - it for this release. - Revert this commit after gst-plugins-bad 0.10.17 - -2009-11-09 14:10:20 +0000 Jan Schmidt <thaytan@noraisin.net> - - * gst/asfmux/Makefile.am: - asfmux: Uncomment --disable-static flag - For some reason that libtool flags line that prevents building - the static lib was commented out. Reported by Mart Raudsepp on IRC. - -2009-11-09 11:49:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/selector/gstinputselector.c: - inputselector: Remove useless variables and fix a uninitialized variable compiler warnings - Merged from gst-plugins-base, dfd51aa82a9e1c9924375183796eab70e574a231. - -2009-11-09 11:48:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/selector/gstinputselector.c: - inputselector: Make sure that running_time->timestamp calculation never becomes negative - Merged from gst-plugins-base, f3653854585864a09d35e037853407332ea6901f. - -2009-11-09 11:48:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/selector/gstinputselector.c: - inputselector: Use the start time (i.e. timestamp) as the last stop - Using the end time makes it impossible to replace buffers, which is - a big problem for subtitles that could have very long durations. - Merged from gst-plugins-base, 27034be4611231cc55fa3d3e253baa40c6bff41d. - -2009-11-09 11:47:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/selector/gstinputselector.c: - inputselector: Improve debugging - Merged from gst-plugins-base. - -2009-11-07 12:29:15 +0100 Edward Hervey <bilboed@bilboed.com> - - * ext/jp2k/gstjasperenc.c: - jp2kenc: Fix klass (s/Decoder/Encoder/) - -2009-11-06 15:31:26 +0100 Chris Hills <chaz@chaz6.com> - - * sys/dvb/gstdvbsrc.c: - dvbsrc: Add support for DVB-T/DVB-C with DVB API 3.3 - -2009-11-06 11:44:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: The text and video duration should only compared as running time too - The end times of the text and video buffers could be different than - their start running time + duration because of different rates. - -2009-11-06 09:16:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/kate/gstkate.c: - kate: Lower tiger's rank to NONE again - It's not well tested yet and doesn't handle segments and text/video - synchronization properly yet. Autoplugging it will cause failures. - -2009-11-06 07:12:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Reset segments on FLUSH_STOP events - -2009-11-05 17:41:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Improve debugging - -2009-11-06 00:46:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/gstqtmux.c: - qtmux: Adding some ifs for protection - Adding somes ifs to protect against warning conditions - that might happen when upstream element is not sane - Fixes #600895 - -2009-11-05 13:40:38 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/scaletempo/gstscaletempo.c: - scaletempo: properly update new segments - Scaletempo was missing an update of 'stop' in - new segment parameters when pushing it downstream, - which caused files to end earlier when rate < 1. - Fixes #599903 - Based on patch by: Bastian Hecht <hechtb@gmail.com> - -2009-11-05 23:17:58 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - timidity: printf format fixes - -2009-11-05 22:03:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/mythtv/gstmythtvsrc.c: - mythtv: printf format fixes - -2009-11-05 21:58:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/libmms/gstmms.c: - mms: printf format fixes - -2009-11-05 21:51:07 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkateenc.c: - * ext/kate/gstkatespu.c: - kate: printf format fixes - -2009-11-05 21:47:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/resindvd/gstmpegdemux.c: - resindvd: printf format fixes - -2009-11-05 21:45:07 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/dvb/dvbbasebin.c: - dvbbasebin: printf format fixes - -2009-11-05 21:44:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/directfb/dfbvideosink.c: - directfb: printf format fixes - -2009-11-05 21:44:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/alsaspdif/alsaspdifsink.c: - alsaspdifsink: printf format fixes - -2009-11-05 17:13:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Update last stop for the subtitles - -2009-11-05 17:06:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Synchronize text and video by taking the running time instead of the stream time - -2009-11-05 16:44:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: Keep track of the subtitle segments - -2009-11-05 16:41:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: If the video segment is not in TIME format don't accept it - -2009-11-04 22:52:19 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - dtmfdetect: Add dtmfdetects to plugins docs - -2009-11-04 22:19:58 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/dtmf/Makefile.am: - * gst/dtmf/gstdtmf.c: - * gst/dtmf/gstdtmfdetect.c: - * gst/dtmf/gstdtmfdetect.h: - * gst/dtmf/tone_detect.c: - * gst/dtmf/tone_detect.h: - dtmfdetect: Add DTMF tone detector - It looks at raw audio data and emits messages when DTMF is detected. - The dtmf detector is the same Goertzel implementation used in FreeSwitch - and Asterisk. It is in the public domain. - -2009-11-05 13:53:46 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/selector/gstinputselector.c: - Revert "inputselector: use get_caps_reffed()" - This reverts commit 49ec4f796a0e3f88a851708782c853baf4b05724. - We can't use this new function yet. - -2009-11-05 13:29:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/selector/gstinputselector.c: - inputselector: use get_caps_reffed() - -2009-11-05 13:17:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Drop too late text buffer immediately - Also improve debugging a bit and drop buffers without valid - timestamp or duration because we can't handle them. - -2009-11-05 12:25:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Fix race condition that results in a deadlock on shutdown - -2009-11-04 22:21:35 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/dtmf/gstdtmfsrc.c: - dtmfsrc: Reject empty caps - -2009-11-04 22:21:22 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/dtmf/gstdtmfsrc.c: - dtmfsrc: Use log level for repeated debug messages - -2009-11-04 20:05:17 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/dtmf/gstdtmfsrc.c: - dtmfsrc: Allow for any samplerate - -2009-11-04 23:32:07 +0000 Jan Schmidt <thaytan@noraisin.net> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Fix previous commit: ensure we take a ref on the features - -2009-11-04 15:21:50 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/rsnbasesrc.c: - * gst/autoconvert/gstautoconvert.c: - resindvd,autoconvert: Avoid depending on 0.10.26 API - Wait until after the next release to bump the core requirement. - Until then, don't use gst_plugin_feature_list_copy and - gst_pad_peer_get_caps_refed. - -2009-11-02 17:06:53 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdsrc.c: - resindvd: Remove old code and obsolete comments - Remove some disabled code paths and obsolete FIXME comments - -2009-10-14 15:47:27 -0400 Gabriel Millaire <gabriel.millaire@collabora.co.uk> - - * ext/celt/gstceltdec.c: - * ext/celt/gstceltenc.c: - celtdec : chain_parse_data : check validity of timestamp, create a new one if needed celtenc : default framesize is 480 setcaps : gets framesize and set caps enc_chain : sets framesize in caps Added frame-size to static caps of audio/x-celt Replaced GST_DEBUG_OBJECT by GST_LOG_OBJECT in enc_chain setcaps: get frame-size from int instead of string setcaps: use default value for frame-size - -2009-11-04 17:13:34 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegdemux: Fix pointer-differences printout - There is unfortunately no G_*_FORMAT conversion specifier for differences of - pointers in glib, and we can't rely either on all platforms being 64bit. - So let's just cast the difference to a gint and be done with it. - -2009-11-04 13:55:04 +0000 Jan Schmidt <thaytan@noraisin.net> - - * po/Makevars: - po: Don't create backup .po files - As well as preventing creation of useless backup files, it works - around a bug in gettext 0.17 on OS/X - -2009-11-04 15:57:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/cdaudio/gstcdaudio.c: - cdaudio: fix properties - Fix properties and allow setting the device property. - -2009-11-04 13:11:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: Return WRONG_STATE from the subtitle chain when flushing - -2009-11-04 13:07:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Unlock and free any pending subtitle buffers on FLUSH_START - -2009-11-04 12:50:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: Synchronize subtitle buffers with the video - Fixes bug #600662. - -2009-11-04 00:21:19 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/selector/gstinputselector.c: - inputselector: also add inline to the proto to fix the build - -2009-11-04 00:19:20 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/zbar/gstzbar.c: - zbar: include quality and check count, fixes #600461 - We report the relative quality in the message and we also use the cache to skip - early detects and doubles. - -2009-11-03 18:14:12 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/selector/gstinputselector.c: - gst: Remove dead assignments and resulting unused variables - Merged from gst-plugins-base, 8cd1b5209b68944e1be56ca8bb69e46d4abb7a34. - -2009-11-03 18:12:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/selector/gstinputselector.c: - inputselector: Use the same iterate internal links function as in gst-plugins-base - -2009-11-03 18:11:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/selector/gstinputselector.c: - Remove GST_DEBUG_FUNCPTR where they're pointless - There's not much point in using GST_DEBUG_FUNCPTR with GObject - virtual functions such as get_property, set_propery, finalize and - dispose, since they'll never be used by anyone anyway. Saves a - few bytes and possibly a sixteenth of a polar bear. - Merged from gst-plugins-base, 6f4c1ac58341ee189225d313ddfe9ae24a65c88c. - -2009-11-03 18:09:55 +0100 David Schleef <ds@schleef.org> - - * gst/selector/gstinputselector.c: - Remove Ronald Bultje from Authors field - Replaced with "GStreamer maintainers - <gstreamer-devel@lists.sourceforge.net>" or just removed, - depending on the number of other authors. - Merged from gst-plugins-base, 0e9bc5125aca546d773ed1002df573dd8e2dc136. - -2009-11-03 18:08:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/selector/gstinputselector.c: - inputselector: set output caps before pushing - Set the output caps on the srcpad before pushing the buffer because else core - will do a rather expensive check to see if we can actually accept those caps on - the srcpad. - Merged from gst-plugins-base, bdfb4b46d746ef298fcf44260879c342af4cafa3. - -2009-11-03 18:06:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/selector/gstinputselector.c: - inputselector: install an acceptcaps function - Install a custom acceptcaps function instead of using the default expensive - check. We accept whatever downstream accepts so we pass along the acceptcaps - call to the downstream peer. - Merged from gst-plugins-base, 5b72f2adf996739036e8d9b5f91005455d1fface. - -2009-11-03 15:08:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - tiger: Make sure that tiger is not autoplugged by decodebin2 - It's not really a decoder... - -2009-11-03 14:50:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/kate/gstkate.c: - kate: Change ranks of katedec and tiger to PRIMARY to be autoplugged - -2009-11-03 14:49:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/kate/gstkatetiger.c: - tiger: Change name of the subtitle sink template and classification - This will make sure that subtitleoverlay can work with tiger. - -2009-11-02 11:33:19 +0000 Jan Schmidt <thaytan@noraisin.net> - - * gst/autoconvert/gstautoconvert.c: - resindvd: Take a copy of the passed plugin features - Clarify the ownership of the internal plugin feature list by making - a copy of any passed list. Avoids crashes when freeing a passed list, - or leaks caused by not freeing any internally built list. - -2009-11-02 10:20:40 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/rsnbasesrc.c: - resindvd: Fix an oversight from updating the copy of basesrc - Plugins need gst-i18n-plugin.h, not gst-i18n-lib.h - -2009-11-01 15:56:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/soundtouch/gstpitch.cc: - pitch: remove pointless gst_element_no_more_pads() - -2009-11-01 23:17:02 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - resindvd: Use gst_base_src_new_seamless_segment() - When switching to a new seamless segment, use the new - gst_base_src_new_seamless_segment() function, because elements can't - send themselves seek events from the streaming thread. - -2009-11-01 23:16:18 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/rsnbasesrc.c: - * ext/resindvd/rsnbasesrc.h: - resindvd: Add gst_base_src_new_seamless_segment() to GstBaseSrc copy - Add a new function to the internal copy of GstBaseSrc for starting a new - seamless segment. - -2009-11-01 19:21:38 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/Makefile.am: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - * ext/resindvd/rsnbasesrc.c: - * ext/resindvd/rsnbasesrc.h: - * ext/resindvd/rsnpushsrc.c: - * ext/resindvd/rsnpushsrc.h: - resindvd: Update the base source copy - This breaks seamless segment updates, causing deadlocks, - to be fixed in subsequent commits. - -2009-11-02 02:48:18 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/gstspu-pgs.c: - dvdspu: Fix PGS window parsing - Fix a problem introduced in the last PGS parsing patch by skipping - the window count byte after reading it. - -2009-11-01 20:42:44 +0200 René Stadler <mail@renestadler.de> - - * gst/aiff/aiffparse.c: - aiff: fix aiffparse debug category variable name - Fixes missing symbol when compiling with debugging, since this is now in sync - with the plugin_init in aiff.c. - -2009-11-01 20:41:03 +0200 René Stadler <mail@renestadler.de> - - * gst/aiff/aiff.c: - aiff: init plugin debug category - Fixes assertion (or unused variable warning with DISABLE_NLS). - -2009-10-31 19:42:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-aiff.xml: - * gst/aiff/aiffmux.h: - * gst/aiff/aiffparse.h: - aiff: add aiff elements to docs - -2009-10-31 19:37:08 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/aiff/aiff.c: - * gst/aiff/aiffmux.c: - * gst/aiff/aiffparse.c: - * gst/aiff/aiffparse.h: - aiff: gratuitious clean-ups: canonicalise function names, structs and defines - -2009-10-31 17:50:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/aiff/Makefile.am: - * gst/aiff/aiff.c: - * gst/aiff/aiffmux.c: - * gst/aiff/aiffparse.c: - * gst/aiff/aiffparse.h: - aiff: enable new aiff muxer - Fixes #598763 even more. - -2009-10-17 22:58:03 +0100 Robert Swain <robert.swain@gmail.com> - - * gst/aiff/aiffmux.c: - * gst/aiff/aiffmux.h: - aiff: add basic AIFF muxer - Fixes #598763. - -2009-10-31 17:25:15 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/aiff/Makefile.am: - * gst/aiff/aiffparse.c: - * gst/aiff/aiffparse.h: - aiff: remove unused includes and fix flags order in Makefile.am - Also remove GST_PLUGINS_BASE_LIBS from LIBADD since we don't - need to link against any of the -base libs (we just use a define - from the gstaudio headers). - -2009-10-31 17:20:53 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/inspect/plugin-aiff.xml: - * gst-plugins-bad.spec.in: - * gst/aiff/Makefile.am: - * gst/aiff/aiffparse.c: - * gst/aiff/aiffparse.h: - * gst/aiffparse/Makefile.am: - * po/POTFILES.in: - aiff: rename 'aiffparse' plugin to 'aiff' - -2009-10-08 19:06:26 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * tests/check/elements/rtpmux.c: - tests: Add test for rtpdtmfmux locking - -2009-09-28 19:54:53 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/rtpmux.c: - tests: Add unit test for rtpmux - -2009-09-28 13:36:44 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: Don't ignore requested pad name - -2009-10-29 16:42:34 -0700 Michael Smith <msmith@songbirdnest.com> - - * tests/check/Makefile.am: - tests: Use GST_PLUGINS_BASE_{CFLAGS,LIBS} for camerabin tests. - -2009-10-29 16:34:23 -0700 Michael Smith <msmith@songbirdnest.com> - - * sys/osxvideo/Makefile.am: - * sys/osxvideo/osxvideoplugin.c: - osxvideosrc: change a .m file containing only C code to a .c file. Makes building this easier. - -2009-10-27 22:08:42 +0000 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Don't send new-segment with start time == -1 - When sending new-segment to a stream, ensure that there is either a valid - PCR, or else wait until there's a PTS on the stream (dropping packets if - needed) in order to avoid generating an invlaid new-segments event. - https://bugzilla.gnome.org/show_bug.cgi?id=595161 - -2009-10-28 16:22:13 +0200 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * tests/check/elements/camerabin.c: - camerabin: use raw audio/video in unit tests - Removes dependency to ogg/vorbis/theora when running camerabin - unit tests. - -2009-10-28 17:37:44 +0100 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowfakesink.cpp: - * sys/dshowsrcwrapper/gstdshowfakesink.h: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowsrcwrapper: cleanup push buffer callback - -2009-10-27 14:31:39 -0700 Michael Smith <msmith@songbirdnest.com> - - * gst/id3tag/id3tag.c: - id3mux: glib doesn't reliably null-terminate wide-character encodings in g_convert, so write the null-terminator separately and explicitly. - -2009-10-18 14:20:07 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - lv2: fix pad direction for ungrouped ports - Classic copy'n'paste bug. - -2009-10-27 16:37:53 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk> - - * gst/asfmux/gstasfmux.c: - asfmux: fix tag writing bug - g_convert seems to add a single null terminating byte to - the end of the string, even when the output is UTF16, we - force the second 0 byte when copying to the output buffer. - This issue was causing random crashes because it was - assumed that the string resulting from g_convert had - 2 extra bytes, but it has only one. - -2009-10-27 11:51:05 -0700 Michael Smith <msmith@songbirdnest.com> - - * sys/directsound/gstdirectsoundsrc.c: - * tests/icles/output-selector-test.c: - * win32/vs6/gst_plugins_bad.dsw: - * win32/vs8/gst-plugins-bad.sln: - * win32/vs8/libgstdirectdraw.vcproj: - Remove executable bits from non-executable files. - -2009-10-27 00:22:42 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/rsnstreamselector.c: - * ext/resindvd/rsnstreamselector.h: - resindvd: Remove extra new-segment in rsnstreamselector. Send discont. - All the input pads for the resin stream selectors have the same source, - and receive/send the same segment info, so there's no need to send a - segment when switching and activating a different pad. Removing it makes - on-the-fly audio track switching work properly. - After switching audio track, mark the next buffer discont. - -2009-10-26 20:55:15 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - resindvd: Avoid a deadlock. Improve chapter seek. - Avoid a potential deadlock that happens when a call to - gst_clock_id_wait_async() immediately calls the callback. - Improve previous chapter seeking slightly by avoiding 'segment - start != -1' assertions when there is no previous chapter and - the seek therefore fails. - -2009-10-26 12:19:32 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/rsnstreamselector.c: - resindvd: lower a debug message to log level. - -2009-10-26 11:00:34 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - resindvd: Add a keypress mapping for switching audio track - For debugging purposes, make keys 1-8 switch audio track. - -2009-10-24 12:54:19 +0100 Jan Schmidt <thaytan@noraisin.net> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/autoconvert.c: - autoconvert: Add a simple unit test - Set up an autoconvert with 2 factories, and check that it can switch - between them when the caps change. - -2009-10-24 14:29:33 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/rsndec.c: - resindvd: Set the new initial-identity property on autoconvert - https://bugzilla.gnome.org/show_bug.cgi?id=599469 - -2009-10-24 12:38:14 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautoconvert.h: - autoconvert: Support installing identity as the initial child - Add the 'initial-identity' property, which inserts identity for - at startup for event passing, and replaces it with a new child - when the first buffer (and caps) actually arrives. - https://bugzilla.gnome.org/show_bug.cgi?id=599469 - -2009-10-24 11:18:59 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautoconvert.h: - autoconvert: Cache incoming new segment events and push to children. - Cache incoming new-segment info. - When installing a child element, inform it of the current segment info. - https://bugzilla.gnome.org/show_bug.cgi?id=599469 - -2009-10-26 00:41:55 +0000 Jan Schmidt <thaytan@noraisin.net> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Add some debug in factory caps intersection - -2009-10-24 11:05:47 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Simple fixes. - Free the plugin feature list on dispose. - Output a debug message when downstream returns a fatal flow result - Fix awkward wording in a debug warning. - -2009-10-24 10:27:03 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Gratuitously move GST_OBJECT_LOCK into a macro - Create GST_AUTOCONVERT_LOCK/UNLOCK macros that (for now) just call - GST_OBJECT_LOCK. - -2009-10-15 13:32:32 +0100 Robert Swain <rob@fluffy.(none)> - - * ext/faac/gstfaac.c: - faac: Use definitions for default values - Makes changing the defaults easier and more fool-proof in the future. - Fixes #598552 - -2009-10-15 13:17:46 +0100 Robert Swain <rob@fluffy.(none)> - - * ext/faac/gstfaac.c: - faac: Change default AAC Profile to Low Complexity (LC) as this is more widely supported - -2009-10-15 13:15:40 +0100 Robert Swain <rob@fluffy.(none)> - - * ext/faac/gstfaac.c: - faac: Change the param_spec default value for allowed block types to match the gst_faac_init value of 'normal' as this is better - -2009-10-20 10:57:28 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * gst/mpegvideoparse/mpegvideoparse.c: - mpegvideoparse: check width/height range - Checks if the width/height that are to be set on src pad caps - are within valid range of 16,4096 - -2009-10-16 10:47:32 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * gst/qtmux/ftypcc.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - * gst/qtmux/gstqtmuxmap.c: - * gst/qtmux/gstqtmuxmap.h: - gppmux: Add support for 3gr6 - Keep track of the chunk durations to be able to add 3gr6 - brand if it is a faststart file and the longest chunk is - smaller than a sec. Implemented according to 3gpp - TS 26.244 v6.4.0 (2005-09) - Fixes #584361 - -2009-10-15 21:11:16 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * gst/qtmux/gstqtmux.c: - qtmux: Only push ftyp later (in faststart mode) - In faststart mode, there is no need to send the ftyp - right at the beginning of the stream. Waiting and sending it - only later (when the moov atom is ready to be sent) provides - us with more information about the stream and we can better - select the compatible brands. - -2009-10-15 17:51:39 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * gst/qtmux/gstqtmux.c: - qtmux: Improve error message - Improve error message when we can't get or estimate the - timestamp/duration of a buffer - -2009-10-26 00:42:16 +0000 Jan Schmidt <thaytan@noraisin.net> - - * win32/common/config.h: - win32: Commit bumped version number - -2009-10-24 16:31:26 -0400 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/camerabin/camerabingeneral.c: - camerabin: fix build - -2009-10-19 15:54:29 +0300 Teemu Katajisto <ext-teemu.katajisto@nokia.com> - - * tests/check/elements/camerabin.c: - camerabin: fix for gstreamer core unit test framework update - Set camerabin state to NULL in the each test case end. - -2009-10-19 14:54:59 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabinphotography.c: - * tests/check/elements/camerabin.c: - * tests/examples/camerabin/gst-camera-perf.c: - * tests/examples/camerabin/gst-camera.c: - camerabin: remove abbreviations from the property names. Fixes #573370 (partialy) - Also rename their use in tests and examples. - -2009-10-16 11:50:22 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/interfaces/Makefile.am: - * gst/camerabin/Makefile.am: - * gst/selector/Makefile.am: - build: use gst-glib-gen.mak to fix the glib build rules. - The build rules in glib-gen.mak were using pattern rules in a non save way. - -2009-10-16 11:21:05 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/cog/.gitignore: - * tests/check/elements/.gitignore: - * tests/examples/camerabin/.gitignore: - gitignore: ignore more - -2009-10-15 17:45:00 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/camerabin/gst-camera-perf.c: - camerabin: set camerabin to READY before accessing the elements - -2009-10-14 17:42:43 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/timidity/gstwildmidi.c: - wildmidi: use G_DIR_SEPARATOR_S instead of hardcoded slashes - -2009-10-15 17:17:41 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin.c: - camerabin: code cleanups - Align element initialisation. This should be re-thought, g_object_new zeros things already. - Harmonize the element getters for the src/sinks to return what we actualy use. - -2009-10-15 16:41:12 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst/camerabin/camerabinpreview.c: - * gst/camerabin/camerabinpreview.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: implement video preview creation - Completes preview creation mechanism to be able to provide a preview - image for video clips too. - -2009-10-15 16:15:03 +0300 Stefan Kost <ensonic@users.sf.net> - - * configure.ac: - * gst/camerabin/camerabingeneral.c: - * gst/camerabin/camerabingeneral.h: - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/gstcamerabin.c: - camerabin: set camerabin default sources/sinks like in playbin2. Fixes #574434 - This uses same approach like in playbin, namely checking for user defined - element, auto{audio,video}{sink,src} and finally DEFAULT_{AUDIO,VIDEO}{SRC,SINK} - defines from config.h. - -2009-10-15 15:59:23 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/ladspa/gstladspa.c: - ladspa: don't reference freed pointer when building portnames - -2009-10-08 15:18:04 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cog.orc: - * ext/cog/cogvirtframe.c: - * ext/cog/cogvirtframe.h: - * ext/cog/generate_tables.c: - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstlogoinsert.c: - cog: Add color matrix to RGB->YCbCr conversion - -2009-10-08 14:33:28 -0700 David Schleef <ds@schleef.org> - - * ext/cog/Makefile.am: - * ext/cog/cogframe.h: - * ext/cog/cogvirtframe.c: - * ext/cog/cogvirtframe.h: - * ext/cog/generate_tables.c: - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstlogoinsert.c: - cog: Add color matrix selection to cogcolorspace - Eventually hook it up to caps via gstvideo - -2009-10-08 13:24:36 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cog.orc: - * ext/cog/cogvirtframe.c: - * ext/cog/cogvirtframe.h: - * ext/cog/gstcogcolorspace.c: - cog: Improve RGB<->YCbCr matrixing - YCbCr->RGB now has a 'bits' setting, which controls the number - of bits used for the matrix coefficients. Choices are 6 or 8. - 6 is low quality, but faster. - RGB->YCbCr now works. Always works in 8 bit, since it's the same - speed as 6 bit. - -2009-10-08 13:23:53 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cog.orc: - * ext/cog/cogvirtframe.c: - cog: Fix AYUV unpacking - -2009-10-07 16:30:26 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cog.orc: - * ext/cog/cogvirtframe.c: - cog: hacking to improve matrix quality - -2009-10-24 20:33:27 +0200 Edward Hervey <bilboed@bilboed.com> - - * configure.ac: - configure.ac: And back to development we go - -=== release 0.10.16 === - -2009-10-23 23:16:45 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shapewipe.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.10.16 - -2009-10-23 23:15:31 +0100 Jan Schmidt <thaytan@noraisin.net> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2009-10-23 11:00:53 +0300 Kaj-Michael Lang <milang@tal.org> - - * ext/zbar/gstzbar.c: - Fix start/stop typo - -2009-10-23 10:48:25 +0100 Thomas Green <tom78999@gmail.com> - - * configure.ac: - configure: also build neonhttpsrc with libneon-29.x - Fixes #599332. - -2009-10-23 10:18:12 +0200 Edward Hervey <bilboed@bilboed.com> - - * ext/schroedinger/gstschroenc.c: - schroenc: Use guint64 instead of uint64_t. Fixes #599355 - -2009-10-22 14:00:10 +0100 Jan Schmidt <thaytan@noraisin.net> - - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowfakesink.cpp: - * sys/dshowsrcwrapper/gstdshowfakesink.h: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - Revert "dshowsrcwrapper: cleanup push buffer callback" - gst-plugins-bad is still frozen for general commits. - This reverts commit 2e4131926f2726fe8fee5c39dd9357f14764d0cb. - -2009-10-22 14:26:30 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowfakesink.cpp: - * sys/dshowsrcwrapper/gstdshowfakesink.h: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowsrcwrapper: cleanup push buffer callback - -2009-10-22 11:43:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegpsmux/Makefile.am: - mpegpsmux: some minor build fixes - CLFAGS -> CFLAGS, and fix order of variables while we're at it. - -2009-10-22 00:50:37 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Take the object lock fewer times - When starting up and creating the list of element factories, only - take the object lock twice instead of 3 times. - -2009-10-21 23:06:56 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Don't hold the object lock when pushing - When pushing out cached events, don't hold the object lock. Avoids - deadlocks starting up DVD playback. - -2009-10-22 11:10:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/faac/Makefile.am: - faac: Link with libgstbase for GstAdapter - Fixes bug #599272. - -=== release 0.10.15 === - -2009-10-21 17:14:34 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gmedec.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shapewipe.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xdgmime.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - release 0.10.15 - -2009-10-21 16:51:09 +0100 Jan Schmidt <thaytan@noraisin.net> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2009-10-16 14:37:02 -0700 Michael Smith <msmith@songbirdnest.com> - - * gst/id3tag/id3tag.c: - id3tag: actually write image to APIC tag. - -2009-10-16 12:30:59 +0100 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - * win32/common/config.h: - 0.10.14.4 pre-release - -2009-10-16 11:53:14 +0100 Jan Schmidt <thaytan@noraisin.net> - - * sys/vdpau/Makefile.am: - dist: Include vdpsink.h in the tarball to fix the dist. - -2009-10-16 11:08:05 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/dts/gstdtsdec.c: - dtsdec: Use gst_buffer_ref/unref, not gst_object_ref/unref - properly fixes: #598274 - -2009-10-16 01:26:10 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/autoconvert/gstautoconvert.c: - autoconvert: Use gst_pad_peer_accept_caps instead of gst_pad_set_caps. - gst_pad_set_caps on the internal source pad always succeeds, because - caps propagate to the peer with buffers, not immediately. Using - gst_pad_peer_accept_caps properly checks whether the actual - sub-element can accept caps when they change. - https://bugzilla.gnome.org/show_bug.cgi?id=575568 - -2009-10-16 01:09:49 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - resindvd: Re-send audio stream select on re-configuration - When the layout of the audio streams changes, re-send the current - audio stream selection event, in order to trigger switching to the - new stream properly. - https://bugzilla.gnome.org/show_bug.cgi?id=575568 - -2009-10-16 00:50:31 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - resindvd: Fix a small flaw - if any audio stream exists, use it - Don't create a dummy audio stream if only non-AC3 tracks exist. - -2009-10-16 10:16:33 +0300 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From 85d1530 to 0702fe1 - -2009-10-15 23:48:53 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ChangeLog: - * configure.ac: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - 0.10.14.3 pre-release - -2009-10-14 11:06:46 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/rsndec.c: - resindvd: Fix decoder pad template to allow LPCM - The pad template in the new switching decoder is too restrictive, - preventing the LPCM decoder from being selected. - https://bugzilla.gnome.org/show_bug.cgi?id=575568 - -2009-10-14 10:41:38 +0200 Edward Hervey <bilboed@bilboed.com> - - * common: - Automatic update of common submodule - From a3e3ce4 to 85d1530 - -2009-10-13 13:05:50 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/rsnaudiomunge.c: - resindvd: Don't leak a reference to the parent in rsnaudiomunge - Don't leak a reference to the pad parent in the sink pad event handler - in rsnaudiomunge. - https://bugzilla.gnome.org/show_bug.cgi?id=598263 - -2009-10-13 13:04:47 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/dts/gstdtsdec.c: - dtsdec: Fix reference leak on all input buffers in 'dvd mode' - https://bugzilla.gnome.org/show_bug.cgi?id=598274 - -2009-10-13 16:01:26 +0200 Peter Christoffersen <gnome-bugzilla@plyt.dk> - - * ext/faad/gstfaad.c: - faad2: Don't leak element reference in the setcaps function - Fixes bug #598139. - -2009-10-12 14:27:57 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ChangeLog: - * configure.ac: - * po/LINGUAS: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/eu.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - 0.10.14.2 pre-release - -2009-10-12 12:29:44 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/faad/gstfaad.c: - faad: fixes warning in macosx snow leopard - -2009-10-12 09:06:37 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/jack/gstjackaudiosink.c: - * ext/jack/gstjackaudiosrc.c: - jack: ensure segtotal is at least 2 - Not only adjust buffer-time and avoid segtotal=0, but instead ensure segtotal is - atleast 2. Do same change on jacksrc. We could also check the latency and buffer - time configured by the client and adjust buffer-time so that we get to the same - number of segments. - -2009-10-12 00:51:27 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/jack/gstjackaudiosink.c: - jack: don't crash in ringbuffer with SIGFPE on small buffer-times - Jack overrides user-specified latency-time with the one it gets from jack - itself. It also needs to adjust buffer-time somewhat to avoid segtotal being 0 - -2009-10-11 22:10:04 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/metadata/metadataexif.c: - metadata: init variables - metadatamux_exif_get_exif_from_tag() does not neccesarily init the passed - variables. - -2009-10-03 21:35:02 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessor: use the type define like everywhere else - -2009-10-03 21:31:55 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - signalprocessort: register debug category just once - Previously we were trying to register it for every subclass. - -2009-10-11 14:10:59 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/soundtouch/gstbpmdetect.cc: - * ext/soundtouch/gstpitch.cc: - soundtouch: fixes warnings on macosx snow leopard - -2009-10-11 14:02:26 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroparse.c: - schroedinger: fix warnings on macosx snow leopard - -2009-10-11 13:56:43 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadatamuxpng.c: - metadata: fix warnings in macosx snow leopard - -2009-10-11 13:51:58 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/libmms/gstmms.c: - mms: fixes warning in macosx snow leopard - -2009-10-11 13:46:00 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/dirac/gstdiracenc.cc: - dirac: fix warning in macosx snow leopard - -2009-10-11 13:13:56 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/nuvdemux/gstnuvdemux.c: - * gst/speed/gstspeed.c: - speed: fix warnings in macosx snow leopard - -2009-10-11 13:07:19 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegvideoparse/mpegvideoparse.c: - mpegvideoparse: fix warning in macosx snow leopard - -2009-10-11 12:56:29 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/mpegtspacketizer.c: - mpegdemux: fix warnings in macosx snow leopard - -2009-10-11 11:35:23 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/dtmf/gstrtpdtmfdepay.c: - dtmf: fix warnings in macosx snow leopard - -2009-10-11 11:27:08 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/amrparse/gstamrparse.c: - * gst/amrparse/gstbaseparse.c: - amrparse: fix warnings in macosx snow leopard - -2009-10-11 11:22:11 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/aacparse/gstaacparse.c: - * gst/aacparse/gstbaseparse.c: - aacparse: fix warnings in macosx snow leopard - -2009-10-11 11:14:16 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoparse.c: - basevideo: fix warnings in macosx snow leopard - -2009-10-09 13:18:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - * gst/dvdspu/gstdvdspu.c: - assrender/dvdspu: Increase ranks to PRIMARY - -2009-10-09 09:19:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: Include SubPicture in the classification - -2009-10-09 09:18:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/assrender/gstassrender.c: - assrender: Make classification a bit more accurate - Change from "Filter/Effect/Video" to "Mixer/Video/Overlay/Subtitle" - -2009-10-08 19:51:31 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/capssetter.c: - capssetter: add unit test - -2009-10-08 11:00:49 +0100 Jan Schmidt <thaytan@noraisin.net> - - * common: - Automatic update of common submodule - From 19fa4f3 to a3e3ce4 - -2009-10-07 16:29:08 -0700 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschroparse.c: - schro: remove unused include of liboil.h - -2009-10-07 15:43:22 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/metadata/metadataxmp.c: - metadata: don't copy trailing NULL of strings in xmp metadata - Also useing g_strdup, fixes the malloc <-> g_free mismatch. - -2009-10-07 15:26:12 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/cog/gstcms.c: - * ext/directfb/dfb-example.c: - * ext/libmms/gstmms.c: - * ext/resindvd/resindvdsrc.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/videomeasure/gstvideomeasure_collector.c: - * sys/dvb/gstdvbsrc.c: - * tests/examples/camerabin/gst-camera-perf.c: - build: fprintf, sprintf, sscanf need stdio.h - -2009-09-18 18:45:09 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/pipelines/.gitignore: - * tests/check/pipelines/mimic.c: - tests: Add test for mimic elements - -2009-09-18 17:47:58 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimenc: Remove invalid todo - -2009-10-06 18:36:15 +0200 Sebastian Pölsterl <sebp@k-d-w.org> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: Ignore emphasis on/off bytes, and do fallback string encoding. - For fallback, try ISO 8859-9 encoding if ISO 6637 failed. - Add more debug calls. - -2009-10-05 17:04:28 -0700 David Schleef <ds@schleef.org> - - * ext/dirac/gstdiracenc.cc: - dirac: various fixes - - Work around BaseEncoder bug not tracking frame index early. - - Fix conversion of UYVY, YUY2, AYUV to internal format. - -2009-10-05 16:16:34 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideo: Revert "Call GstBaseVideoEncoder::start/stop during pad deactivation." - This reverts commit 4c087bcb072dcc9847b11c00123cf93c5e541dcb. - The reverted commit changes the order that set_format() and start() - are called, which is incorrect. The correct order is set_format(), - start(), handle_frame()..., stop() - -2009-10-05 13:33:22 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideoencoder.c: - basevideo: Free frame using utility function - -2009-10-05 21:11:18 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/dirac/gstdiracenc.cc: - diracenc: Fix caps unlinked negotiation - move caps related code to gst_dirac_enc_set_format, and - use the source pad template to get allowed caps when there is - no peer pad. - -2009-10-05 19:49:06 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/schroedinger/gstschroenc.c: - schroenc: When the source pad isn't linked, use the pad template - For negotiation, use the source pad pad template when it doesn't - have a peer. - -2009-10-05 15:47:58 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst-libs/gst/video/gstbasevideoutils.c: - basevideo: Fail if caps don't contain a framerate field - Return false from the caps parsing function if there is no framerate - field in the provided caps - -2009-10-05 11:15:03 -0700 Michael Smith <msmith@songbirdnest.com> - - * gst/id3tag/id3tag.c: - id3mux: Write UTF-16 byte order marker correctly. - -2009-10-05 16:39:37 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * ext/schroedinger/gstschroenc.c: - schroenc: move caps related code to gst_schro_enc_set_format. - -2009-10-05 15:28:47 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * configure.ac: - Depend on gtk-x11 explicitly. - Fixes the build on OSX if gtk+-quartz is installed. - -2009-10-05 15:26:15 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * sys/qtwrapper/audiodecoders.c: - Fix compilation warning with gcc-4.2. - -2009-10-05 11:47:56 +0100 Jan Schmidt <thaytan@noraisin.net> - - * tests/check/elements/.gitignore: - Add faac test binary to the git ignores - -2009-10-05 11:47:01 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/dirac/Makefile.am: - * ext/schroedinger/Makefile.am: - Use GST_CXXFLAGS and GST_CFLAGS to pull in local gst-libs includes. - Move the GST_CXXFLAGS and GST_CFLAGS to the start of the includes set - to pull in the local gst-libs from there first, instead of listing - it explicitly. - -2009-10-05 11:02:16 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/dirac/Makefile.am: - * ext/schroedinger/Makefile.am: - Fix CFLAGS and LDFLAGS for dirac/schrodinger - Include the local headers and libs before ones outside this - module. - -2009-10-02 16:35:09 -0700 David Schleef <ds@schleef.org> - - * ext/dirac/Makefile.am: - * ext/dirac/gstdiracenc.cc: - * gst-libs/gst/video/gstbasevideoencoder.c: - dirac: convert to BaseVideoEncoder - -2009-09-27 14:25:39 -0700 David Schleef <ds@schleef.org> - - * ext/cog/Makefile.am: - * ext/cog/cogvirtframe.c: - * ext/cog/cogvirtframe.h: - * ext/cog/gstcms.c: - * ext/cog/gstcms.h: - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstcogscale.c: - * ext/cog/gstcolorconvert.c: - * ext/cog/gstlogoinsert.c: - cog: hacking - Add RGB to YCbCr matrixing - Add tiny color management system (CMS) for video - Add quality level for colorspace - -2009-09-25 18:14:28 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cogvirtframe.c: - cog: reset cache instead of returning NULL - Returning NULL makes things crash. Resetting the cache - makes things run slow. Still an underlying bug somewhere, - but not critical. - -2009-09-23 13:17:54 -0700 David Schleef <ds@schleef.org> - - * ext/celt/gstceltdec.c: - * ext/celt/gstceltdec.h: - celtdec: Handle lookahead, discont - -2009-10-02 19:08:21 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/faac/gstfaac.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - * tests/examples/camerabin/gst-camera-perf.c: - build: add missing stdlib include to fix the build - -2009-10-02 14:25:50 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - Add GstBaseVideoDecoder::set_sink_caps vfunc. - -2009-10-02 12:40:02 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/video/gstbasevideodecoder.c: - Call GstBaseVideoDecoder::start/stop during pad deactivation. - -2009-10-01 16:06:02 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/video/gstbasevideoencoder.c: - Don't ignore the value returned from GstBaseVideoEncoder::set_format. - -2009-10-01 16:12:15 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * ext/schroedinger/gstschroenc.c: - Fix schroenc for refcount change in GstBaseVideoEncoder. - -2009-10-01 15:50:55 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/video/gstbasevideoencoder.c: - Unref frame->sink_buffer in gst_base_video_encoder_finish_frame - -2009-10-01 16:11:46 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * ext/schroedinger/gstschroenc.c: - Make gst_schro_enc_handle_frame return GstFlowReturn. - -2009-10-01 16:26:22 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - Make GstBaseVideoEncoder::handle_frame return GstFlowReturn - -2009-10-01 16:24:50 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst-libs/gst/video/gstbasevideoencoder.c: - Call GstBaseVideoEncoder::start/stop during pad deactivation. - -2009-10-02 12:04:28 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/videosignal/gstvideodetect.c: - Fix a compiler warning. - -2009-10-02 13:02:31 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/zbar/gstzbar.c: - * ext/zbar/gstzbar.h: - zbar: post a message instead of printing the code to stdout - Docment the message format that we sent. Add a property to turn message sending off. - -2009-10-02 11:23:49 +0300 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-lv2.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shapewipe.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-timidity.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xvid.xml: - docs: update plugin doc scan files - -2009-10-02 11:22:48 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/zbar/gstzbar.c: - zbar: cleanups - Use start/stop to manage the cache. Few code cleanups and comments. - -2009-10-02 11:09:11 +0300 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-amrwb.xml: - * docs/plugins/inspect/plugin-cog.xml: - * docs/plugins/inspect/plugin-pnm.xml: - * docs/plugins/inspect/plugin-videomeasure.xml: - * docs/plugins/inspect/plugin-xdgmime.xml: - * docs/plugins/inspect/plugin-zbar.xml: - docs: add zbar plugin - -2009-10-02 10:37:43 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/Makefile.am: - zbar: add new plugin to the build here too - -2009-10-02 10:32:37 +0300 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - docs: keep list sorted - -2009-10-02 07:46:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure.ac: Fix build system, zbar is no dependency-less plugin - -2009-10-01 23:51:04 +0300 Stefan Kost <ensonic@users.sf.net> - - * configure.ac: - * ext/zbar/Makefile.am: - * ext/zbar/gstzbar.c: - * ext/zbar/gstzbar.h: - zbar: wrap zbar library as a image analyzer - zbar is a bar code scanner library. - -2009-10-01 17:19:54 +0100 Christian F.K. Schaller <christian.schaller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - * win32/MANIFEST: - update spec file with latest changes and remove file from MANIFEST which isn't there any longer - -2009-09-02 15:26:15 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * ext/metadata/metadataxmp.c: - metadata: change XMP location tags to start with capitals - -2009-08-25 10:10:15 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: fix deadlock when error occurs at video recording startup - -2009-08-27 14:35:26 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: handle preview-caps only in image mode and only when they change - This prevents camerabin to create preview pipeline every time when - application re-sets the same caps again. - -2009-08-25 09:35:07 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: don't send multiple EOS events to video pipeline - -2009-08-22 17:09:39 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst/camerabin/gstcamerabinphotography.c: - camerabin: fix scene mode setting - Camerabin caches photography settings, but it didn't take into account - that scene mode setting may change other settings as well. So, config - needs to be read back from device after scene mode is set. - -2009-08-21 09:14:31 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: allow mode parameter setting in NULL state - -2009-08-20 17:55:26 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: allow capture resolution to be set in NULL state - -2009-09-10 15:16:23 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: fix image queue parameter setting - Camerabin incorrectly used G_GUINT64_CONSTANT macro for setting - "max-size-buffers" and "max-size-bytes" properties in image queue, - even when they aren't 64bit integers. - -2009-08-12 11:10:55 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: fix warning with g_object_get and join separate g_object_sets into one - -2009-07-31 11:57:12 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: reset active-pad in output-selector after READY state - Camerabin sets itself to READY state during resolution change. This - operation makes output-selector to forget its currently active pad, - so it must be set again after state change. - -2009-06-29 15:23:25 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: don't reset capsfilters or zoom if error occurs - If an error occurs, application should set pipeline to NULL, and updating - zoom can actually block message handling if video device driver has failed - and video src element supports zooming using photography interface and S_CROP. - -2009-10-01 17:17:03 +0300 René Stadler <rene.stadler@nokia.com> - - * gst/videomeasure/Makefile.am: - videomeasure: link with libm - -2009-10-01 15:09:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdbin.h: - resindvdbin: If no suitable audio decoder is found play the DVD without audio - -2009-10-01 14:54:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/resindvdbin.c: - resindvdbin: Also post missing element messages if any other element is missing - -2009-10-01 14:52:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/Makefile.am: - * ext/resindvd/resindvdbin.c: - resindvdbin: Post missing decoder messages if one is missing - For video this is an error, for audio only a warning. - -2009-10-01 14:40:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/resindvdbin.c: - resindvdbin: Use the new video decoder - This makes resindvdbin work with other MPEG video decoders than - mpeg2dec, for example the FFMPEG or Fluendo MPEG decoders. - -2009-10-01 14:37:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/Makefile.am: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/rsndec.c: - * ext/resindvd/rsndec.h: - resindvdbin: Rename files - -2009-10-01 14:36:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/rsnaudiodec.c: - * ext/resindvd/rsnaudiodec.h: - resindvdbin: Refactor audio decoder and add a (MPEG) video decoder - -2009-10-01 13:29:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/rsnaudiodec.c: - rsnaudiodec: Get desired sink caps from the pad template - -2009-10-01 10:54:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/rsvg/gstrsvgdec.c: - rsvg: Unpremultiply Cairo's ARGB to match GStreamer's - -2009-09-25 12:20:50 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * gst/videomeasure/gstvideomeasure_collector.c: - Take offset gaps into account. - Prevents measurecollector from crashing when frame numbers are not consecutive. - Fixes bug #596285. - -2009-09-29 15:47:13 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * gst/qtmux/atoms.c: - qtmux: fix flags_as_uint to flags - -2009-09-30 15:47:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/resindvdbin.c: - resindvdbin: Create external srcpads from the static pad templates - -2009-09-22 12:16:37 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/gstspu-pgs.c: - dvdspu: Improve PGS parsing - Improve (slightly) the interpretation of PGS set-window blocks - to avoid printing warnings about unused bytes when there are multiple - window definitions. - -2009-09-22 01:16:47 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/gstspu-pgs.c: - dvdspu: Fix rendering and add guards - Fix the rendering when we hit the right hand side of the display - area, by resetting to the correct X coordinate, and add some more - guards against bad PGS data. - -2009-09-08 00:01:28 +0300 René Stadler <mail@renestadler.de> - - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideomark.c: - * gst/videosignal/gstvideomark.h: - videosignal: change pattern data type to uint64, add property and message field - Keeps the old uint typed value support for compatibility. - -2009-09-06 05:36:46 +0300 René Stadler <mail@renestadler.de> - - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideomark.c: - videosignal: allow pattern-count property to be 0 - -2009-09-04 22:50:34 +0300 René Stadler <mail@renestadler.de> - - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideomark.c: - videosignal: add support for packed YUV formats - -2009-09-04 22:30:27 +0300 René Stadler <mail@renestadler.de> - - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideodetect.h: - * gst/videosignal/gstvideomark.c: - * gst/videosignal/gstvideomark.h: - videosignal: add support for all planar YUV formats, using gstvideo - -2009-09-06 02:44:05 +0300 René Stadler <mail@renestadler.de> - - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideomark.c: - videosignal: add bound checks - -2009-09-04 16:25:05 +0300 René Stadler <mail@renestadler.de> - - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideomark.c: - videosignal: remove unused macros - -2009-09-26 17:23:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/resindvdbin.c: - resindvdbin: Use gst_caps_can_intersect() because it's faster - -2009-09-26 17:21:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/rsnaudiodec.c: - * ext/resindvd/rsnaudiodec.h: - rsnaudiodec: Use ghost pads and always forward application/x-gst-dvd events immediately - Fixes bug #582779. - -2009-09-26 17:19:32 +0200 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdbin.c: - * ext/resindvd/rsnaudiodec.c: - resindvdbin: Use autoconvert in rsnaudiodec and build a list of possible decoders - Partially fixes bug #582779. - -2009-09-25 16:54:10 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/amrparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.h: - * gst/flacparse/gstbaseparse.c: - * gst/flacparse/gstbaseparse.h: - baseparse: sync baseparse change - -2009-09-25 17:02:53 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstaacparse.c: - * gst/aacparse/gstbaseparse.c: - * gst/aacparse/gstbaseparse.h: - aacparse: forego (bogus) parsing of already parsed (raw) input - -2009-09-25 11:07:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/selector/gstinputselector.c: - inputselector: Use new single iterator for the internally linked pads - This fixes a deadlock and removes some useless code. - -2009-09-25 11:04:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/rsnstreamselector.c: - rsnstreamselector: Use new single object iterator for the internally linked pads - This prevents an ugly deadlock. - -2009-09-25 10:50:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/resindvdbin.c: - * ext/resindvd/rsnbasesrc.c: - resindvdbin: Don't block the external ghost pads but only their targets - -2009-09-24 11:26:29 -0700 David Schleef <ds@schleef.org> - - * ext/cog/Makefile.am: - cog: use BUILT_SOURCES instead of temp library - -2009-09-23 12:32:54 +0200 Alessandro Decina <alessandro.d@gmail.com> - - * gst/adpcmdec/adpcmdec.c: - * gst/asfmux/gstasfobjects.c: - * gst/asfmux/gstasfparse.c: - * gst/h264parse/gsth264parse.c: - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mxf/mxfmpeg.c: - * gst/siren/gstsirendec.c: - * gst/siren/gstsirenenc.c: - Fix warnings with gcc 4.0.1. - -2009-09-22 12:25:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: fix --disable-external again - -2009-09-22 13:44:14 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - Revert "LV2 preset support." - This reverts commit c95f59cd2dc129899b37fecaa52c89db3d8a5ef8. - -2009-09-22 13:43:57 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/gstlv2.c: - Revert "Fix property index when setting preset." - This reverts commit 0a6b22b1917af8a89db1981a0f5df3dcee78b1dd. - -2009-09-22 13:23:25 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/cog/Makefile.am: - cog: fix the build - Add a uninstalled convinience libtool library containing the generated sources. - Add that as a dependency to the plugin. - -2009-08-17 17:21:41 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/gstlv2.c: - Fix property index when setting preset. - -2009-08-17 17:06:40 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - LV2 preset support. - -2009-09-22 08:11:36 +0200 Lutz Mueller <lutz@topfrose.de> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmdec.h: - * gst/pnm/gstpnmutils.c: - pnm: Handle ASCII encoded PNM data that is split over multiple buffers - Also: - - unref buffers after gst_buffer_span - - fix scanning of header if header data is split over several buffers - Fixes bug #595700. - -2009-09-21 11:33:50 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cogtables.c: - * ext/cog/cogvirtframe.c: - * ext/cog/cogvirtframe.h: - * ext/cog/generate_tables.c: - * ext/cog/gstcogscale.c: - cog: Add quality setting to cogscale - -2009-09-21 09:35:30 -0700 David Schleef <ds@schleef.org> - - * ext/cog/Makefile.am: - * ext/cog/cog.orc: - * ext/cog/cogvirtframe.c: - cog: (re-)implement 1/2/4-tap scaling - -2009-09-21 09:30:44 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cogframe.h: - * ext/cog/cogvirtframe.c: - cog: Fix the virtual frame line cache - -2009-09-21 09:49:23 -0700 David Schleef <ds@schleef.org> - - * ext/celt/gstceltenc.c: - celtenc: VBR requires celt-0.6.0 - -2009-09-21 12:06:55 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: Specify that psi table is static const. - This avoids re-allocating it every single time we go into it. - Roughly 10% performance boost in overall tsparse processing time. - -2009-09-20 17:53:24 +0100 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtspacketizer.h: - Revert "mpegtsparse: use fixed size array rather than dynamically allocating" - This reverts commit ae75b6f3666512887ae526f16a1ad41bbf2517ac. - -2009-09-20 15:30:59 +0100 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtspacketizer.h: - mpegtsparse: use fixed size array rather than dynamically allocating - -2009-09-20 15:18:46 +0100 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtspacketizer.h: - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: replace streams hashtable with an array of streams - -2009-09-20 14:08:50 +0100 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: unref caps on dispose, reset packet size on _reset - -2009-09-20 13:15:14 +0100 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtspacketizer.h: - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: make sure packetsize is set on caps of buffers - -2009-09-20 12:38:00 +0100 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtspacketizer.h: - mpegtsparse: detect packetsize and don't just assume 188 bytes. - -2009-09-19 14:10:28 -0700 David Schleef <ds@schleef.org> - - * ext/celt/gstceltenc.c: - * ext/celt/gstceltenc.h: - celtenc: Add complexity, cbr, and max-bitrate properties - -2009-09-19 13:32:19 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/cog/Makefile.am: - * ext/cog/cog.orc: - * ext/cog/cogframe.c: - * ext/cog/cogorc.c: - * ext/cog/cogorc.h: - * ext/cog/cogvirtframe.c: - * ext/cog/gstcogcolorspace.c: - cog: autogenerate code, colorspace improvements - -2009-09-18 20:27:44 -0700 David Schleef <ds@schleef.org> - - * ext/cog/cogframe.c: - * ext/cog/cogvirtframe.c: - * ext/cog/gstcog.c: - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstcogdownsample.c: - * ext/cog/gstcogfilter.c: - * ext/cog/gstcogmse.c: - * ext/cog/gstcogutils.c: - * ext/cog/gstcolorconvert.c: - * ext/cog/gstlogoinsert.c: - cog: remove // comments - -2009-09-16 20:39:52 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: Don't use GstIterator, do change detection ourselves. - Using a GstIterator is slow because we have to create/destroy that - iterator every single time. - We just do the threadsafe cookie check and list iteration ourselves. - -2009-09-15 23:18:43 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: Avoid type-checking casts in tight loops - -2009-09-15 23:12:33 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtspacketizer.h: - * gst/mpegdemux/mpegtsparse.c: - mpegtspacketizer: Make next_packet() return an enum. - This avoids calling an extra gst_adapter_available() in a tight loop. - -2009-09-15 23:11:01 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: More branch prediction macros - -2009-09-15 20:49:39 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtsparse.c: - mpegtspacketizer: Spread branch prediction macros - -2009-09-15 19:16:36 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse/mpegtspacketizer: Register and use GQuark for structures. - -2009-09-15 18:57:25 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtspacketizer.h: - * gst/mpegdemux/mpegtsparse.c: - mpegtspacketizer: Initialize debugging in _get_type - There's no need for an extra function since all debuggin will require - a MpegTSPacketizer which means that the GType will be created, therefore - move the debug category initialization there. - -2009-09-15 23:09:21 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtspacketizer: memset structure instead of individually setting fields to 0 - -2009-09-15 23:08:13 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtspacketizer: Remove g_return_if_fail - It's overkill for code only used by one element. - -2009-09-15 19:44:46 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtsparse.c: - mpegtspacketizer/parse: Don't use gst_structure_to_string() for debugging. - There's GST_PTR_FORMAT for that, and too bad for the systems that don't have - support for that. It just costs too much cpu. - -2009-09-15 19:00:30 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegtsparse/.gitignore: - * gst/mpegtsparse/Makefile.am: - * gst/mpegtsparse/gstmpegdesc.c: - * gst/mpegtsparse/gstmpegdesc.h: - * gst/mpegtsparse/mpegtspacketizer.c: - * gst/mpegtsparse/mpegtspacketizer.h: - * gst/mpegtsparse/mpegtsparse.c: - * gst/mpegtsparse/mpegtsparse.h: - * gst/mpegtsparse/mpegtsparsemarshal.list: - gst: Remove dead mpegtsparse directory. - This was seriously confusing. Also, the code is in gst/mpegdemux/ - -2009-09-18 14:25:49 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/Makefile.am: - * ext/cog/Makefile.am: - * ext/cog/cog.h: - * ext/cog/cogframe.c: - * ext/cog/cogutils.h: - * ext/cog/cogvirtframe.c: - * ext/cog/cogvirtframe.h: - * ext/cog/gstcog.c: - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstcogdownsample.c: - * ext/cog/gstcogfilter.c: - * ext/cog/gstcogmse.c: - * ext/cog/gstcogscale.c: - * ext/cog/gstcogutils.c: - * ext/cog/gstcogutils.h: - * ext/cog/gstcolorconvert.c: - * ext/cog/gstlogoinsert.c: - cog: fixes to make cog work inside -bad - -2009-09-18 15:06:57 -0700 David Schleef <ds@schleef.org> - - * gst/videomeasure/Makefile.am: - videomeasure: fix line endings - -2009-09-18 15:06:36 -0700 David Schleef <ds@schleef.org> - - * gst/videomeasure/Makefile.am: - videomeasure: fix distcheck - -2009-09-17 18:16:35 -0700 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschroenc.c: - schroenc: quiet debugging message in last commit - -2009-09-17 18:15:28 -0700 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschroenc.c: - schroenc: Keep track of granule offset - -2009-08-31 10:36:46 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/cog/Makefile.am: - * ext/cog/cogframe.c: - * ext/cog/cogframe.h: - * ext/cog/cogorc.c: - * ext/cog/cogorc.h: - * ext/cog/cogvirtframe.c: - * ext/cog/cogvirtframe.h: - * ext/cog/gstcog.c: - * ext/cog/gstcogcolorspace.c: - * ext/cog/gstcogdownsample.c: - * ext/cog/gstcogfilter.c: - * ext/cog/gstcogmse.c: - * ext/cog/gstcogscale.c: - * ext/cog/gstcogutils.c: - * ext/cog/gstcogutils.h: - * ext/cog/gstcolorconvert.c: - * ext/cog/gstlogoinsert.c: - Copy cog plugin and video library from cog project - -2009-09-17 16:54:57 -0700 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschrodec.c: - schrodec: Fix resync bug due to adapter API change - gst_adapter_masked_scan_uint32() changed slightly from when - this element was in Schroedinger. Oops. - -2009-09-17 16:57:16 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideo: debug at new segment events - -2009-09-17 16:54:14 -0700 David Schleef <ds@schleef.org> - - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - mpegtsdemux: Set DISCONT on buffers - -2009-09-17 10:50:40 -0700 David Schleef <ds@schleef.org> - - * gst-libs/gst/video/gstbasevideodecoder.c: - basevideo: Add a warning - -2009-09-17 10:49:13 -0700 David Schleef <ds@schleef.org> - - * ext/celt/gstceltenc.c: - celtenc: don't limit bit rate - -2009-09-17 09:38:02 +0200 Lutz Mueller <lutz@topfrose.de> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - pnm: Add ASCII decoding support - ...and make the ASCII output of the encoder a bit more pretty. - Fixes bug #595409. - -2009-09-17 09:35:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - pnm: Remove the experimental status from the pnm plugin - -2009-08-14 18:08:56 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/gstlv2.c: - More tolerate port group support, plugin cleanup. - Gracefully handle plugins with illegal groups that contain no symbol by - treating ports in that group normally (i.e. as if they weren't part of a - group). The port groups spec mandates that groups have a valid unique - symbol, but plugins aren't perfect... - Make (conceptually) static plugin variables actually (C) static, - and clean up SLV2 related things with a GCC shared library destructor, - if GCC is in use. - -2009-08-12 01:07:57 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/gstlv2.c: - Make mono warning visible in public documentation. - -2009-08-12 01:03:32 -0400 Dave Robillard <dave@drobilla.net> - - * ext/ladspa/gstladspa.c: - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.h: - Multi-channel support with channel positions. - This queries port roles from the LV2 data and converts it into GStreamer - channel positions. This should allow any type of multi-channel plugin - (including beyond stereo, e.g. surround) to work fine in GStreamer, - and with elements that require channel positions to be explicitly stated. - -2009-08-10 23:12:24 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/gstlv2.c: - Add documentation for LV2 element. - -2009-08-10 23:04:47 -0400 Dave Robillard <dave@drobilla.net> - - * ext/ladspa/gstladspa.c: - Fix typo in LADSPA element documentation. - -2009-07-21 15:45:06 -0400 Dave Robillard <dave@drobilla.net> - - * configure.ac: - Bump SLV2 dependency to 0.6.6. - -2009-07-10 21:52:30 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/calf-lv2-port-groups.patch: - * ext/lv2/swh-lv2-port-groups.patch: - Add swh and calf LV2 port group patches. - -2009-07-03 20:00:11 -0400 Dave Robillard <dave@drobilla.net> - - * ext/ladspa/gstladspa.c: - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.h: - Working multi-channel pads for LV2 plugins. - -2009-06-27 00:25:38 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/gstlv2.c: - Allocate a static predicate for pg:inGroup. - -2009-06-25 17:25:52 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/gstlv2.c: - Only allocate lv2:inPlaceBroken predicate once. - -2009-06-25 15:10:24 -0400 Dave Robillard <dave@drobilla.net> - - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - Eliminate use of static mono pad template. - -2009-06-25 15:07:05 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/gstlv2.c: - Separate port discovery from pad template creation. - This first counts ports (using the builtin slv2 functions to do so - rather than manually as before), then creates descriptors for each port - and finds all port groups. Only then are pad templates created (towards - using group information for creating multi-channel pads). - -2009-06-25 12:34:03 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/gstlv2.c: - Use silly glib types :). - -2009-06-20 19:52:26 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - Query and store port group information. - Replace port index arrays with a struct for holding more information - than just indices (e.g. groups). - -2009-05-25 22:15:56 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - Working basic LV2 signal processing. - LV2 plugins, short of any surprises, should work with the same basic - functionality as LADSPA plugins. - -2009-05-25 20:43:10 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/gstlv2.c: - Set class inPlaceBroken property. - -2009-09-17 09:43:37 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/ivorbis/vorbisdec.c: - docs: fix example and mention difference to vorbisdec - -2009-09-02 11:11:20 +0100 Jan Schmidt <thaytan@noraisin.net> - - * sys/vdpau/gstvdpvideopostprocess.c: - vdpau: Fix bogus check before unreffing - -2009-09-01 19:48:43 +0100 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - vdpau: Fix pkg-config test - If the pkg-config check doesn't succeed, test with the old method - instead of bailing out of configure with an error. - -2009-08-20 00:16:02 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdpvideopostprocess.c: - vdpauvideopostprocess: handle pixel-aspect-ratio better - the implementation is not entirely correct since we assume that the sink - element's pixel-aspect-ratio is 1/1 - -2009-08-19 22:52:34 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdpvideopostprocess.c: - vdpauvideopostprocess: remove par from caps since we don't handle it yet - -2009-08-19 22:40:48 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdputils.c: - vdpauvideopostprocess: don't remove interlaced flag in video_to_output_caps() - -2009-08-19 22:23:17 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - vdpauvideopostprocess: add inverse-telecine property - -2009-08-19 22:03:11 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - vdpauvideopostprocess: fix noise-reduction property getter - -2009-08-19 22:02:19 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - vdpauvideopostprocess: add sharpening property - -2009-08-17 23:42:50 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdevice.h: - vdpau: remove gst_vdp_device_new from header - -2009-08-17 23:42:21 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpsink.c: - vdpausink: fix error handling if gst_vdp_get_device returns NULL - -2009-08-17 23:39:52 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp.c: - vdpau: add back vdpausink and vdpauvideopostprocess - -2009-08-17 23:39:14 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpdevice.h: - vdpdevice: fix error handling and threadsafety - return NULL incase of initalization errors and guard hashtable access with a mutex - -2009-07-17 22:50:18 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - vdpauvideopostprocess: get correct number of needed frames if we're doing noise reduction - -2009-07-17 22:48:23 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - vdpaumpegdec: small indent fix - -2009-07-15 20:18:33 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - vdpaumpegdec: fix gst_byte_reader_masked_scan_uint32 usage - -2009-07-04 19:48:42 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - vdpauvidepostprocess: remove boolean noise-reduction property - Use the float one to determine if we should enable noise reduction or not - -2009-07-04 15:46:02 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - vdpauvideopostprocess: add support for noise reduction - -2009-07-04 13:59:36 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - vdpauvideopostprocess: add support for deinterlacing - The code is roughly modeled after the deinterlace plugin - -2009-07-02 17:11:10 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/gstvdpsink.h: - vdpausink: add myself to copyright - -2009-07-02 14:01:16 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideopostprocess.c: - vdpauvideopostprocess: s/gst_vdp_vpp_set_caps/gst_vdp_vpp_sink_setcaps - -2009-07-01 23:12:20 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - vdpaumpegdec: use gst_byte_reader_masked_scan_uint32 instead of our own version - -2009-07-01 00:20:33 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdpvideobuffer.c: - * sys/vdpau/gstvdpvideobuffer.h: - vdpau: use G_N_ELEMENTS instead of hardcoding array sizes - -2009-07-01 00:13:14 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdevice.c: - vdpau: use G_N_ELEMENTS instead of NULL terminating array - -2009-06-30 23:55:13 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdp.c: - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdpoutputbuffer.c: - * sys/vdpau/gstvdpoutputbuffer.h: - * sys/vdpau/gstvdpsink.c: - * sys/vdpau/gstvdpsink.h: - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdputils.h: - * sys/vdpau/gstvdpvideobuffer.c: - * sys/vdpau/gstvdpvideobuffer.h: - * sys/vdpau/gstvdpvideopostprocess.c: - * sys/vdpau/gstvdpvideopostprocess.h: - * sys/vdpau/gstvdpvideoyuv.c: - * sys/vdpau/gstvdpyuvvideo.c: - vdpau: add new vdpausink and vdpauvideopostprocess elements - vdpausink is as the name implies a sink which takes vide/x-vdpau-output buffers - and outputs it to the screen. - vdpauvideopostprocess is an element which takes video/x-vdpau-video buffers and - outputs video/x-vdpau-output buffers. The element can also do things like - deinterlacing and other postprocessing but this is not implemented yet. - -2009-06-29 22:50:42 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * configure.ac: - vdpau: check for vdpau with pkg-config first - -2009-06-24 17:51:58 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpvideoyuv.c: - vdpau: split gst_vdp_mpeg_dec_reset into start and stop - -2009-06-24 11:36:28 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdputils.h: - * sys/vdpau/gstvdpvideoyuv.c: - * sys/vdpau/gstvdpyuvvideo.c: - * sys/vdpau/gstvdpyuvvideo.h: - vdpau: don't put the GstVdpDevice in the caps - -2009-06-23 23:03:52 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpmpegdec.h: - * sys/vdpau/gstvdpvideoyuv.c: - * sys/vdpau/gstvdpvideoyuv.h: - * sys/vdpau/gstvdpyuvvideo.c: - * sys/vdpau/gstvdpyuvvideo.h: - vdpau: make GstVdpVideoYUV implement pad_alloc - also change GstVdpMpegDec and GstVdpYUVVideo to make use of this - -2009-06-23 17:26:22 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdputils.h: - * sys/vdpau/gstvdpvideoyuv.c: - * sys/vdpau/gstvdpyuvvideo.c: - vdpau: add support for YUY2 - -2009-06-23 17:16:25 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideoyuv.c: - * sys/vdpau/gstvdpyuvvideo.c: - vdpau: add support for UYVY - -2009-06-23 16:57:45 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdputils.h: - * sys/vdpau/gstvdpvideoyuv.c: - * sys/vdpau/gstvdpyuvvideo.c: - * sys/vdpau/gstvdpyuvvideo.h: - vdpau: factor out common caps calculation and put it in gstvdputils.ch - -2009-06-22 23:25:55 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdputils.c: - * sys/vdpau/gstvdputils.h: - * sys/vdpau/gstvdpvideoyuv.c: - * sys/vdpau/gstvdpyuvvideo.c: - vdpau: refactor GstVdpVideoYUV and GstVdpYUVVideo - -2009-06-22 22:17:48 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpyuvvideo.c: - * sys/vdpau/gstvdpyuvvideo.h: - vdpau: make GstVdpYUVVideo inherit from GstBaseTransform - -2009-06-22 11:00:40 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideoyuv.c: - vdpau: fixup some debug prints - -2009-06-22 10:57:25 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpvideoyuv.c: - * sys/vdpau/gstvdpvideoyuv.h: - vdpau: make GstVdpVideoYUV inherit from GstBaseTransform - -2009-09-16 08:22:19 +0200 Lutz Mueller <lutz@topfrose.de> - - * gst/pnm/gstpnm.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - * gst/pnm/gstpnmutils.c: - * gst/pnm/gstpnmutils.h: - pnm: Support ASCII format for encoding and handle unsupported formats better in the decoder - Fixes bug #595215. - -2009-09-15 23:32:06 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Handle base_time when sending segment updates. - Don't send bogus new segment update events when the stream doesn't - start at 0. Fixes broken seeking in some files. - Fixes: #594812 - -2009-08-18 13:35:59 +0200 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/gstsectionfilter.c: - mpegtsdemux, mpegtsparse: max section length is 4093 not 1021. - -2009-08-18 01:08:03 +0200 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: add pad for DVB Subtitling pads - -2009-09-13 19:39:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - pnm: Use correct rowstride for 8 bit grayscale too - -2009-09-13 19:33:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - pnm: Correctly convert from/to GStreamer rowstride - -2009-09-13 19:17:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - pnm: Fix caps - 8 bit grayscale caps have no endianness field and the caps name - of GST_VIDEO_CAPS_RGB is still "video/x-raw-rgb" and not GST_VIDEO_CAPS_RGB. - -2009-09-13 19:13:24 +0200 Lutz Mueller <lutz@topfrose.de> - - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmenc.c: - * gst/pnm/gstpnmenc.h: - pnm: Lots of bugfixes - (1) Fix examples. - (2) Add support for gray images. - (3) Remove "use_fixed_caps" which doesn't seem to be useful. - (4) Do proper negotiation in the encoder. - (5) Fix memleak in the setcaps function in the encoder. - (6) Keep a link to the src pad in the encoder now that we need it more often. - Partially fixes bug #164870. - -2009-09-12 18:57:05 +0100 Christian Schaller <christian.schaller@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - Fix factory information for h264parse, add missing Video - -2009-09-11 14:38:46 -0700 Michael Smith <msmith@songbirdnest.com> - - * gst/aiffparse/aiffparse.c: - aiffparse: Fix an off-by-8 bug in parsing the AIFF data size. - This led to overreading by 8 bytes, giving an audible glitch at the end of - a file (except when the file didn't have a trailing chunk of some sort). - -2009-09-08 20:52:09 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Use GST_TIME_FORMAT in debug statement. - -2009-09-08 09:20:00 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Reset stream->last_time when flushing. - This fixes naive seeking a tiny bit (by basically hinting at _data_cb - that it shouldn't expect the incoming buffers to be the ones just after - the previous ones). - Without this, seeking by more than 10mins forward would just end up in an - endless loop. - -2009-09-08 09:18:42 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Sprinkle branch prediction macros. - -2009-09-10 12:12:26 -0700 Michael Smith <msmith@songbirdnest.com> - - * gst/id3tag/id3tag.c: - id3tag: When writing id3v2.3, do not use UTF-8. - UTF-8 is only permitted in v2.4. So instead use ISO-8859-1 for ascii-only - strings, and UTF16 otherwise. Also, do not null terminate strings in text - frames, except where required. These two allow windows media player to play - (and correctly read tags) files created by id3mux. - -2009-07-23 16:13:28 -0700 Michael Smith <msmith@songbirdnest.com> - - * gst/adpcmdec/adpcmdec.c: - adpcmdec: complete ima adpcm support. - -2009-07-23 11:59:39 -0700 Michael Smith <msmith@songbirdnest.com> - - * gst/adpcmdec/adpcmdec.c: - adpcmdec: checkpoint for incomplete IMA ADPCM support. - -2009-09-10 12:02:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videomeasure/gstvideomeasure.c: - * gst/videomeasure/gstvideomeasure_collector.c: - * gst/videomeasure/gstvideomeasure_ssim.c: - videomeasure: Fix format strings and include correct i18n header - -2009-09-10 11:58:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/videomeasure/gstvideomeasure.c: - * gst/videomeasure/gstvideomeasure.h: - * gst/videomeasure/gstvideomeasure_collector.c: - * gst/videomeasure/gstvideomeasure_collector.h: - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/videomeasure/gstvideomeasure_ssim.h: - videomeasure: Fix indention, line endings and use LRN's real name - -2009-09-09 19:14:27 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - * gst/videomeasure/Makefile.am: - * gst/videomeasure/gstvideomeasure.c: - * gst/videomeasure/gstvideomeasure.h: - * gst/videomeasure/gstvideomeasure_collector.c: - * gst/videomeasure/gstvideomeasure_collector.h: - * gst/videomeasure/gstvideomeasure_ssim.c: - * gst/videomeasure/gstvideomeasure_ssim.h: - videomeasure: Initial version of videomeasure plugin - This plugin contains elements for calculating metrics of video streams, intended for objective video codec comparison. - At the moment only SSIM metric is implemented (why would you need anything else anyway?). - Also contains a helper videomeasure_collector element that collects measurement events and outputs them into a file (to be used with gst-launch). - Other metrics may be implemented in the future along with a base class for all measurers. - Fixes bug #594321. - -2009-09-10 08:54:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - pnm: Mark PNM plugin as experimental because it doesn't work well yet - -2009-09-10 08:53:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/pnm/gstpnmdec.c: - pnmdec: Partially fix negotiation issues and refcount leaks - -2009-09-10 08:48:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/pnm/Makefile.am: - * gst/pnm/gstpnmenc.c: - pnmenc: Fix negotiation issues and refcount leaks - -2009-09-10 08:29:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/pnm/gstpnm.c: - pnm: Fix typefinder caps - -2009-09-10 08:23:22 +0200 Lutz Mueller <lutz@topfrose.de> - - * configure.ac: - * gst/pnm/Makefile.am: - * gst/pnm/gstpnm.c: - * gst/pnm/gstpnmdec.c: - * gst/pnm/gstpnmdec.h: - * gst/pnm/gstpnmenc.c: - * gst/pnm/gstpnmenc.h: - * gst/pnm/gstpnmutils.c: - * gst/pnm/gstpnmutils.h: - pnm: Add PNM encoder and decoder elements - Fixes bug #164870. - -2009-09-10 07:56:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/ladspa/Makefile.am: - * ext/lv2/Makefile.am: - * gst-libs/gst/signalprocessor/Makefile.am: - signalprocessor: Fix various build/dist issues - Install the headers, version the library with @GST_MAJORMINOR@, - add all required libraries to _LIBADD instead of _LDFLAGS, - and add GST_*_LDFLAGS to _LDFLAGS. - Fixes bug #594715. - -2009-09-09 14:34:03 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowvideosrc: cache device caps - -2009-09-09 12:41:17 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * win32/vs9/libgstdshowsrcwrapper.vcproj: - dshowvideosrc: use IEnumMediaTypes when IAMStreamConfig is not usable - For some device drivers IAMStreamConfig is not supported. - But EnumMediatypes does not provide range size and framerate. - -2009-09-06 11:50:39 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/faac.c: - faac: add unit test - -2009-09-08 22:24:12 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: add some debug statements for discrepancy cases and plug memleak - -2009-09-06 11:49:17 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: sprinkle some more G_(UN)LIKELY - -2009-09-06 11:44:27 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: enforce sync between wrapper view of data and encoder returned data - -2009-09-05 21:35:35 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - docs: add faac to documentation - -2009-09-05 21:35:19 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: add some documentation - -2009-08-31 19:31:57 +0200 Havard Graff <havard.graff@tandberg.com> - - * gst/selector/gstoutputselector.c: - outputselector: make GST_FORMAT_TIME the default segment format - -2009-08-31 19:33:50 +0200 Havard Graff <havard.graff@tandberg.com> - - * sys/dshowvideosink/dshowvideosink.cpp: - dshowvideosink: remove unused variable to fix compiler warning - Fixes bug #594278. - -2009-09-08 15:16:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Fix usage of __always_inline__ attribute - This attribute can't be used for function declarations because - it needs the function body. Instead of a forward declaration of - functions, move the function itself above it's first use. - Fixes bug #594489 and compilation with gcc 4.3 and earlier. - -2009-09-07 17:33:15 +0200 Marc-André Lureau <mlureau@flumotion.com> - - * ext/assrender/gstassrender.c: - assrender: Fix compilation with libass = 0.9.6 - Fixes bug #594382. - -2009-09-07 19:08:08 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: fix aspect-ratio parsing in VO - -2009-09-07 16:20:23 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: also consider user_data pieces when parsing VO(S) - -2009-09-07 16:44:52 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowfakesink.cpp: - * win32/vs9/gst-plugins-bad.sln: - * win32/vs9/libgstdshowsrcwrapper.vcproj: - dshowsrcwrapper: add support both Unicode and MBCS - -2009-09-07 15:44:16 +0200 Julien Isorce <julien.isorce@gmail.com> - - * win32/vs8/gst-plugins-bad.sln: - * win32/vs9/gst-plugins-bad.sln: - * win32/vs9/libgstdshowsrcwrapper.vcproj: - dshowsrcwrapper: upgrade frozen build to vs9 - -2009-09-07 15:21:28 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp: - dshowsrcwrapper: indent dshowsrcwrapper.cpp - -2009-09-07 15:12:55 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp: - Revert "dshowsrcwrapper: remove unused extern C" - This reverts commit d3c88d637d7e7d60f1437ccd3dfc23b37e2a320e. - Reverting this since the entry point isn't found because of - C++ build. - -2009-09-07 10:59:53 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowaudiosrc.h: - * sys/dshowsrcwrapper/gstdshowfakesink.cpp: - * sys/dshowsrcwrapper/gstdshowfakesink.h: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - dshowsrcwrapper: indent - -2009-09-07 10:51:28 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowsrcwrapper: convert line ended characters to LF - -2009-09-07 10:38:39 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp: - dshowsrcwrapper: remove unused extern C - -2009-09-07 10:31:54 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - dshowsrcwrapper: go back to previous mode - -2009-09-05 10:22:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * common: - Automatic update of common submodule - From 00a859e to 19fa4f3 - -2009-09-04 19:17:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - wildmidi/timidity: Add audio/riff-midi to the src pad template caps - -2009-09-04 17:32:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/siren/gstsirendec.c: - * gst/siren/gstsirenenc.c: - siren: fix setting caps on the output pad - Also set the caps on the output pad when the input buffers don't have caps. - -2009-09-04 17:27:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - * ext/timidity/gstwildmidi.h: - wildmidi: cleanups and fix seeking - Remove time_per_frame, it's too inaccurate. - Fix convert for -1 values. - Use scaling to convert samples to time. - Fix segment handling. - Fix seeking. - Fix buffer clipping (not yet enabled) - Protect the WildMidi library with the object lock to avoid races when changing - properties. - Fix offsets on output buffers, for raw audio the offset contains the sample - position not byte position. - Add better DISCONT handling. - Fixes #519001 - -2009-09-04 16:29:53 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowvideosrc: move VIDEO_STREAM_CONFIG_CAPS to GstCapturePinMediaType - -2009-09-04 14:11:33 +0100 christian schaller <christian.schaller@collabora.co.uk> - - Merge branch 'master' of ssh://uraeus@git.freedesktop.org/git/gstreamer/gst-plugins-bad - -2009-09-04 14:10:55 +0100 christian schaller <christian.schaller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - Update spec file - -2009-09-04 13:13:39 +0200 Josep Torra <n770galaxy@gmail.com> - - * ext/neon/gstneonhttpsrc.c: - neonhttpsrc: handle all redirection http status codes - -2009-09-04 12:53:36 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: in seeking use a factor for SCR interpolation - Fixes seeking on clips where PTS are unalignded with SCR. - -2009-09-04 12:40:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/siren/gstsirendec.c: - * gst/siren/gstsirendec.h: - sirendec: rewrite sirendec - Add setcaps and event functions. - Add state change functions to clean variables. - Use adapter. - Add timestamps and duration on outgoing buffers. - Add DISCONT handling. - -2009-09-04 12:40:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/siren/gstsirenenc.c: - sirenenc: cleanups - -2009-09-04 12:35:31 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: set specific caps for lpcm in private stream - In the clips that I've found those streams, the lpcm header is - different than the DVD case. - Then the decoder need to know this in order to be able parse it. - -2009-09-04 12:30:18 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - mpegtsdemux: added autodetect of packet size and removed m2ts mode property - -2009-09-04 12:08:45 +0200 Julien Isorce <julien.isorce@gmail.com> - - Merge branch 'master' of ssh://cap@git.freedesktop.org/git/gstreamer/gst-plugins-bad - -2009-09-04 12:08:02 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - dshowvideosrc: move default video caps into GstCapturePinMediaType - -2009-09-04 12:02:18 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegdemux/gstmpegdefs.h: - * gst/mpegdemux/gstmpegdesc.h: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: some more handling of VC1 and EAC3 - If the PMT have the register descriptor HDMV assume EAC3 - For VC1 make the code more aligned to RP227. - -2009-07-16 10:06:36 +0100 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * gst/dvdspu/gstspu-vobsub-render.c: - Try to fit subtitles within the video frame when they're too large - -2009-09-01 21:30:35 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/pcapparse/gstpcapparse.c: - * gst/pcapparse/gstpcapparse.h: - pcapparse: Set the GStreamer timestamp according to the pcap timestamps - -2009-09-03 19:04:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/siren/gstsirenenc.c: - * gst/siren/gstsirenenc.h: - sirenenc: fix events and caps - Add an event function that clears the adapter. - Add a setcaps function to configure caps on the srcpad. Remove the instance - variable for the caps. - -2009-09-03 18:43:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/siren/gstsirenenc.c: - * gst/siren/gstsirenenc.h: - sirenenc: fix timestamping - Handle DISCONT and reset adapter. - code cleanups. - Put timestamps and discont flags on output buffers. - Fix error handling. - Remove bogus object locks, it's all protected by the STREAM_LOCK. - -2009-09-03 17:49:41 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowvideosrc: factorize dshow format to gst caps conversion - -2009-09-03 17:20:47 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - dshowsrcwrapper: remove cplusplus condition - -2009-09-03 17:12:26 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - dshowvideosrc: factorize dshow video format parsing - -2009-09-03 15:45:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: If stream type is AC3 and no EAC3 descriptor is found assume AC3 - -2009-09-03 15:40:14 +0200 Josep Torra <josep@fluendo.com> - - * gst/mpegdemux/gstmpegdefs.h: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Implement EAC3 handling according some ATSC specs. - Fixes bug #594030. - -2009-09-03 00:28:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/inspect/plugin-xdgmime.xml: - * gst-plugins-bad.spec.in: - * gst/xdgmime/Makefile.am: - * gst/xdgmime/gstxdgmime.c: - xdgmime: move xdg typefinder to the other typefinders in -base - Remove the xdgmime plugin which now barely contains any code at all - and move the functionality into gst-plugins-base next to the other - typefinders. - -2009-09-02 13:35:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegsmux, mpegpsmux: fix unused variable warning with the debugging system in core disabled - -2009-09-01 12:41:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Stream type 0x81 is normal AC3, not EAC3 - Not sure what the stream type for EAC3 is though. - Fixes bug #593059. - -2009-08-30 23:07:30 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: refactor slightly and remove superfluous code - -2009-08-30 23:06:24 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - faac: freshen up caps negotiation - Perform sink and src caps negotiation during caps negotation, - and also cater for re-negotiation. - -2009-08-30 23:00:35 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/faac/gstfaac.c: - * ext/faac/gstfaac.h: - faac: rewrite data caching and timestamp handling - Also fixes #593348. - -2009-08-31 18:55:52 +0200 Peter Kjellerstedt <pkj@axis.com> - - * configure.ac: - configure: A little clean up. - Reorder the list of AM_CONDITIONAL()s used when --disable-external is - specified to match the actual order of the plug-ins earlier in the file. - -2009-08-31 18:49:16 +0200 Peter Kjellerstedt <pkj@axis.com> - - * configure.ac: - configure: Allow --disable-external to be specified again. - -2009-08-31 18:47:44 +0200 Peter Kjellerstedt <pkj@axis.com> - - * configure.ac: - configure: Allow --disable-kate to actually be specified. - -2009-08-31 18:41:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - wildmidi: cleanup error handler - -2009-08-31 18:34:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - wildmidi: free the adapter - -2009-08-31 18:32:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - wildmidi: cleanups - -2009-08-31 18:21:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - wildmidi: allow for push mode operation - Fixes #586929 - -2009-08-31 18:20:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - * ext/timidity/gstwildmidi.h: - wildmidi: use state machine - Use a state machine to keep track of the current state. - Add chain function and event function on the sinkpad. - Remove some unused code. - -2009-08-31 17:38:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - wildmidi: remove useless function calls - -2009-08-31 17:33:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - * ext/timidity/gstwildmidi.h: - wildmidi: set caps on pad - Set the caps on the pad and use those caps instead of keeping a separate caps - pointer around. - Fix some whitespace. - -2009-08-31 17:27:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/timidity/gstwildmidi.c: - wildmidi: fix whitespace - -2009-08-31 16:07:03 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/Makefile.am: - kate: fix typo in Makefile.am - GST_PLUGIN_BASE_LIBS should be GST_PLUGINS_BASE_LIBS. Fixes #593683. - -2009-08-31 13:31:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-flacparse.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegpsmux.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rsvg.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shapewipe.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xdgmime.xml: - * docs/plugins/inspect/plugin-xvid.xml: - docs: update plugin docs for git version - -2009-08-31 13:14:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/gme/gstgme.c: - * ext/metadata/gstbasemetadata.c: - * ext/metadata/metadata.c: - * ext/mplex/gstmplex.cc: - * ext/rsvg/gstrsvgdec.c: - * gst/aiffparse/aiffparse.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegvideoparse/mpegpacketiser.c: - * gst/mxf/mxfmux.c: - * gst/nuvdemux/gstnuvdemux.c: - GstAdapter is not a GstObject and should be freed with g_object_unref() - -2009-08-31 13:00:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: use an old-fashioned array instead of GPtrArray for mux->programs - Using GPtrArray for a fixed-sized array is a bit pointless and makes - for ugly code. - -2009-08-31 10:48:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegpsmux/mpegpsmux_aac.c: - * gst/mpegpsmux/mpegpsmux_aac.h: - * gst/mpegpsmux/mpegpsmux_h264.c: - * gst/mpegpsmux/mpegpsmux_h264.h: - mpegpsmux: Add missing files to fix compilation - Fixes bug #593625. - -2009-08-10 01:14:19 +0800 Lin YANG <oxcsnicho@gmail.com> - - * examples/mpts_test2.c: - mpegtsmux: Test program of mpts support is added - -2009-07-22 20:27:36 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: Minor fixes - -2009-07-22 20:25:42 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: mux->programs: use GPrtArray instead of GArray - -2009-07-11 19:29:53 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: mpegtsmux_collected(): calculate PCR for programs - -2009-07-11 19:15:12 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - mpegtsmux: mpegtsmux_create_streams(): create multi streams - -2009-07-11 19:13:23 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: MpetTsPadData: add prog_id and ref to its program - -2009-07-11 19:09:17 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: Extend mux->program to a GArray programs - -2009-07-11 17:44:54 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegtsmux/mpegtsmux.h: - mpegtsmux: Add new property prog-map to the muxer - -2009-08-18 12:14:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: Free the PPS buffers too - -2009-08-17 18:03:00 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - h264parse: compute timestamp - -2009-08-17 17:58:46 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - h264parse: recognize more types of NAL - Also recognizes NALs carrying VCL (i.e. visible pictures). We - typically only compute timestamps for such NALs - -2009-08-17 17:56:26 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - * gst/h264parse/gsth264parse.h: - h264parse: parser init & finalize - -2009-08-17 17:53:43 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - h264parse: decode slice header - -2009-08-17 17:53:11 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - h264parse: decode SEI - -2009-08-17 17:52:47 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - h264parse: decode SEI: picture timing info - -2009-08-17 17:52:12 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - h264parse: decode SEI: buffering period - -2009-08-17 17:51:36 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - h264parse: decode PPS - -2009-08-17 17:51:10 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - h264parse: decode SPS - -2009-08-17 17:50:33 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - h264parse: SPS: decode vui params - -2009-08-17 17:50:02 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - h264parse: SPS: decode hrd params - -2009-08-17 17:44:38 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.h: - h264parse: Start slice header parsing work - -2009-08-17 17:43:51 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - * gst/h264parse/gsth264parse.h: - h264parse: Start SEI parsing work - -2009-08-17 17:42:06 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - * gst/h264parse/gsth264parse.h: - h264parse: Start PPS parsing work - -2009-08-17 17:38:59 +0800 Lin YANG <oxcsnicho@gmail.com> - - * gst/h264parse/gsth264parse.c: - * gst/h264parse/gsth264parse.h: - h264parse: Start SPS parsing work - -2009-08-11 12:00:10 +0200 Lin Yang <oxcsnicho@gmail.com> - - * configure.ac: - * gst/mpegpsmux/Makefile.am: - * gst/mpegpsmux/bits.h: - * gst/mpegpsmux/crc.h: - * gst/mpegpsmux/mpegpsmux.c: - * gst/mpegpsmux/mpegpsmux.h: - * gst/mpegpsmux/psmux.c: - * gst/mpegpsmux/psmux.h: - * gst/mpegpsmux/psmuxcommon.h: - * gst/mpegpsmux/psmuxstream.c: - * gst/mpegpsmux/psmuxstream.h: - mpegpsmux: Add MPEG PS muxer - -2009-08-13 16:45:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - * ext/rsvg/Makefile.am: - * ext/rsvg/gstrsvg.c: - * ext/rsvg/gstrsvgdec.c: - * ext/rsvg/gstrsvgdec.h: - rsvg: Add RSVG SVG decoder plugin - This supports - - decoding single SVG images and a stream of SVG images with a given framerate - - lossless scaling of SVG images - - ARGB output - -2009-08-31 09:11:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - assrender: Fix compilation with libass >= 0.9.7 and fix aspect ratio setting - Fixes bug #575261. - -2009-08-30 22:20:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxftypes.c: - mxf: Unconditionally use GLib 2.16 API - -2009-08-30 22:17:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/xdgmime/Makefile.am: - * gst/xdgmime/gstxdgmime.c: - * gst/xdgmime/xdgmime/xdgmime.c: - * gst/xdgmime/xdgmime/xdgmime.h: - * gst/xdgmime/xdgmime/xdgmimealias.c: - * gst/xdgmime/xdgmime/xdgmimealias.h: - * gst/xdgmime/xdgmime/xdgmimecache.c: - * gst/xdgmime/xdgmime/xdgmimecache.h: - * gst/xdgmime/xdgmime/xdgmimeglob.c: - * gst/xdgmime/xdgmime/xdgmimeglob.h: - * gst/xdgmime/xdgmime/xdgmimeicon.c: - * gst/xdgmime/xdgmime/xdgmimeicon.h: - * gst/xdgmime/xdgmime/xdgmimeint.c: - * gst/xdgmime/xdgmime/xdgmimeint.h: - * gst/xdgmime/xdgmime/xdgmimemagic.c: - * gst/xdgmime/xdgmime/xdgmimemagic.h: - * gst/xdgmime/xdgmime/xdgmimeparent.c: - * gst/xdgmime/xdgmime/xdgmimeparent.h: - xdgmime: Always use GLib instead of xdgmime - Now that we depend on GLib 2.16 we can as well use it's - internal copy of the xdgmime instead of our own. - -2009-08-30 22:13:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/id3tag/id3tag.c: - id3tag: Unconditionally use GLib 2.16 API - -2009-08-19 17:18:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/resindvd/rsnstreamselector.c: - rsnstreamselector: Use iterate internal links instead of deprecated get internal links - -2009-08-19 17:05:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/selector/gstinputselector.c: - inputselector: Use iterate internal links instead of deprecated get internal links - -2009-08-30 23:38:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * win32/common/config.h: - Back to hacking -> 0.10.14.1 - -=== release 0.10.14 === - -2009-08-30 00:24:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * common: - common: update common to a version that includes a fixed mangle-tmpl.py - Which is needed to build the plugin docs for the frei0r plugin (and - was included in the 0.10.14 release tarball). - -2009-08-29 19:35:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-asfmux.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-kate.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mimic.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-schro.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shapewipe.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-vdpau.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xdgmime.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.10.14 - -2009-08-29 19:02:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2009-08-26 01:21:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * win32/common/config.h: - 0.10.13.5 pre-release - -2009-08-26 01:18:00 +0100 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - * sys/directdraw/Makefile.am: - * sys/directsound/Makefile.am: - * sys/directsound/gstdirectsoundsrc.c: - directdraw, directsound: unify CFLAGS and fix configure checks for DirectX-based plugins - One set of CFLAGS for all DirectX-based plugins. Correct header/library - checks for DirectX-based-plugins. Remove unused variable and label in - directsoundsrc. - Fixes #593068. - -2009-08-26 00:26:42 +0100 Arek Korbik <arkadini@gmail.com> - - * ext/schroedinger/gstschroenc.c: - schroenc: set right OFFSET and OFFSET_END on header buffers to make oggmux happy - Without this oggmux will just keep buffering output pages in some cases. - Fixes #593024. - -2009-08-25 23:44:50 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * ext/resindvd/Makefile.am: - * gst/rawparse/Makefile.am: - resindvd, rawparse: fix LDFLAGS for gst-plugins-base libs - Fixes #593063. - -2009-08-24 20:06:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - 0.10.13.4 pre-release - -2009-08-24 18:16:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/amrwbenc/gstamrwbenc.c: - amrwbenc: use different element GType name to avoid conflict with previous plugin - Use a different GType name for the element to avoid 'cannot register existing type' - warnings when running 'make check' in the unpacked tarball with the old amrwb plugin - also installed as system plugin under the old name (it used to be called 'amrwrb' - and now it's 'amrwbenc'). - -2009-08-24 14:37:28 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowsrcwrapper: use of default debug category and better dshow errors readability - -2009-08-21 01:17:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/icles/test-oss4.c: - tests: fix test-oss4 to treat an empty device name the same as a NULL name - -2009-08-18 15:48:09 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimenc: Write FOURCC as 32bit - -2009-08-15 17:54:50 -0700 David Schleef <ds@schleef.org> - - * REQUIREMENTS: - remove a bunch of junk from REQUIREMENTS - -2009-08-14 20:20:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - 0.10.13.3 pre-release - -2009-08-14 14:10:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: disable ass plugin for libass >= 0.9.7 because of API changes - See #575261. - -2009-08-12 18:33:22 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfmux.h: - asfmux: Do not mess up GstCollectData list - asfmux was messing up with the GstCollectData list of its - GstCollectPads when sorting the list inplace. This patch makes - it copy the list before sorting it, leaving the GstCollectPads - list as is. Fixes #591610 - -2009-08-12 12:23:30 -0400 Olivier Crête <tester@tester.ca> - - * ext/mimic/gstmimenc.c: - mimenc: USE GST_WRITE_*_LE macros - -2009-08-12 12:21:33 -0400 Olivier Crête <tester@tester.ca> - - * ext/mimic/gstmimenc.c: - mimenc: Refuse to go playing in paused-mode without clock - Only try to use the clock in if paused-mode is set and refuse to go playing - in paused-mode without it. - Fixes bug #591538 - -2009-08-11 16:42:51 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/dtmf/gstdtmfsrc.c: - dtmfsrc: Empty event queue on finalize - -2009-08-11 16:39:42 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - dtmf: Use GSlice for internal event structures - -2009-08-11 16:23:20 -0400 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dtmf/gstrtpdtmfsrc.c: - rtpdtmfsrc: Cleanup events on finalize - Problem found by Laurent Glayal - Fixes bug #591440 - -2009-08-11 16:23:20 -0400 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dtmf/gstrtpdtmfsrc.c: - rtpdtmfsrc: Cleanup events on finalize - Problem found by Laurent Glayal - Fixes bug #591440 - -2009-08-12 10:28:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/vdpau/gstvdp.c: - * sys/vdpau/gstvdpdevice.c: - * tests/check/Makefile.am: - vdpau: blacklist for generic states test, and demote to GST_RANK_NONE - These elements are not fit for autoplugging, so demoting to RANK_NONE. - Also blacklisting for generic states test, since fixing these elements - up to do some minimal error handling seems to be a bit more work. - Partially fixes #591538. - -2009-08-11 18:01:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * po/LINGUAS: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/lv.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - 0.10.13.2 pre-release. - -2009-08-11 15:27:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * MAINTAINERS: - Add myself to MAINTAINERS file and update Wim's e-mail. - -2009-08-11 14:17:32 +0100 Christian Schaller <christian.schaller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - Update spec file with latest changes - -2009-08-11 12:42:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkateenc.c: - * tests/check/elements/kate.c: - kateenc: error out if category has not been set and check for obviously wrong values - -2009-08-11 02:46:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * gst-plugins-bad.spec.in: - * gst/rtpmanager/.gitignore: - * gst/rtpmanager/Makefile.am: - * gst/rtpmanager/gstrtpbin-marshal.list: - * gst/rtpmanager/gstrtpbin.c: - * gst/rtpmanager/gstrtpbin.h: - * gst/rtpmanager/gstrtpjitterbuffer.c: - * gst/rtpmanager/gstrtpjitterbuffer.h: - * gst/rtpmanager/gstrtpmanager.c: - * gst/rtpmanager/gstrtpptdemux.c: - * gst/rtpmanager/gstrtpptdemux.h: - * gst/rtpmanager/gstrtpsession.c: - * gst/rtpmanager/gstrtpsession.h: - * gst/rtpmanager/gstrtpssrcdemux.c: - * gst/rtpmanager/gstrtpssrcdemux.h: - * gst/rtpmanager/rtpjitterbuffer.c: - * gst/rtpmanager/rtpjitterbuffer.h: - * gst/rtpmanager/rtpsession.c: - * gst/rtpmanager/rtpsession.h: - * gst/rtpmanager/rtpsource.c: - * gst/rtpmanager/rtpsource.h: - * gst/rtpmanager/rtpstats.c: - * gst/rtpmanager/rtpstats.h: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/rtpbin.c: - * tests/check/elements/rtpbin_buffer_list.c: - Move rtpmanager from -bad to -good. - -2009-08-11 09:05:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/elements/.gitignore: - .gitignore: ignore asfmux unit test binary - -2009-08-11 09:00:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/Makefile.am: - checks: disable unit tests that are flaky or don't work with core git - camerabin test seems to time out with core git, so disabling because - chances are the problem is in the test and the core git stuff will - be released before we can fix the code in the test. - neonhttpsrc unit test is a bit flaky, it tends to fail the first - time when called (the host/url it checks for seems to be down as - well/anyway). - -2009-08-10 22:16:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mixmatrix/Makefile.am: - * sys/dshowsrcwrapper/Makefile.am: - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowaudiosrc.h: - * sys/dshowsrcwrapper/gstdshowfakesink.cpp: - * sys/dshowsrcwrapper/gstdshowfakesink.h: - * sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - Remove execute flags from source files - -2009-08-09 02:04:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: bump core/base requirements to released version - To avoid confusion. - -2009-08-10 16:35:36 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowsrcwrapper: can list more than 1 device - something like the following code now works: - vector<string> getVideoDeviceNames() - { - vector<string> l_name; - string property; - GstElement* videodevicesrc = create_element("dshowvideosrc", "videodevicesrc"); - GstPropertyProbe* probe = GST_PROPERTY_PROBE (videodevicesrc); - GValueArray* va = gst_property_probe_get_values_name (probe, "device-name"); - if (va) - { - for(size_t i=0; i < va->n_values; ++i) - { - GValue* v = g_value_array_get_nth(va, i); - string name(g_value_get_string(v)); - l_name.push_back(name); - } - } - if (videodevicesrc) - gst_object_unref(GST_OBJECT (videodevicesrc)); - return l_name; - } - -2009-08-10 16:17:41 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - dshowaudiosrc: handles device-name property - -2009-08-10 16:03:17 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - dshowsrcwrapper: add a helper function to check a media type - -2009-08-10 14:32:03 +0200 Julien Isorce <julien.isorce@gmail.com> - - Merge branch 'master' of ssh://cap@git.freedesktop.org/git/gstreamer/gst-plugins-bad - -2009-08-10 13:21:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/Makefile.am: - spc: fix typo in Makefile.am and build the right plugin (spc not gme) - -2009-08-10 14:23:14 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - dshowvideosrc: can use other video sizes and framerates than the defaults - Even if the device could capture several video sizes at several framerates, - without this commit, it was only possible to use one video size and - one framerate: the default directshow values. - -2009-08-10 11:40:13 +0200 Julien Isorce <julien.isorce@gmail.com> - - * win32/vs8/gst-plugins-bad.sln: - * win32/vs8/libgstdirectsound.vcproj: - directsoundsrc: add vs8 project - -2009-08-10 11:36:41 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/directsound/gstdirectsoundsrc.c: - directsoundsrc: LF and indent - -2009-08-09 15:20:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautoconvert.h: - autoconvert: Cache events and send them downstream once an element was selected - -2009-08-09 14:55:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautoconvert.h: - autoconvert: Small cleanups - -2009-08-09 12:25:01 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/directdraw/gstdirectdrawsink.c: - directdrawsink: Fix crash when exposing in GST_STATE_READY - Fixes bug #541962. - -2009-08-08 22:14:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Don't answer the SEEKING query if we don't know the answer yet - A bitrate!=-1 is required for seeking but the bitrate is only calculated - after the second PCR was read. - Fixes bug #590446. - -2009-08-08 21:20:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/spc/gstspc.c: - spc: Lower rank to SECONDARY to make the gme plugin the default - -2009-08-08 21:17:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - * ext/spc/Makefile.am: - * ext/spc/gstspc.c: - * ext/spc/gstspc.h: - * ext/spc/tag.c: - * ext/spc/tag.h: - spc: Add the OpenSPC spc plugin again - The gme plugin obsoletes it but it might still be useful - for users that don't have gme yet or prefer openspc for some reason. - -2009-08-08 12:20:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - kate: some minor clean-ups - Print flow return as string in log message; if we check the return - value of gst_buffer_new_and_alloc() we should use the _try() function - that might actually return NULL. Post error message when returning - GST_FLOW_ERROR. Use portable GLib macros to print 64-bit integers. - Don't use 0LL, that's also not portable (and unneeded here). - -2009-08-08 10:30:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/rawparse/gstvideoparse.c: - videoparse: Only provide very fundamental caps in the pad template - We can't easily know which caps will can be used because we rely on - libgstvideo's support for video formats. - -2009-08-08 10:27:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/rawparse/gstrawparse.c: - * gst/rawparse/gstrawparse.h: - rawparse: Small cleanups and implement SEEKING query - -2009-08-08 08:27:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/rawparse/gstaudioparse.c: - audioparse: Small cleanups - -2009-08-08 07:59:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/rawparse/Makefile.am: - * gst/rawparse/gstrawparse.h: - * gst/rawparse/gstvideoparse.c: - * gst/rawparse/gstvideoparse.h: - videoparse: Use libgstvideo for everything instead of our own calculations - Also make RGB usage easier by providing xRGB, RGBx, etc. formats - instead of requiring to set red_mask and friends. - -2009-08-07 19:12:26 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: fix a memory leak - -2009-08-07 19:00:23 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegdemux/gstmpegdefs.h: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: added VC1, EAC3 and LPCM related to blueray/hdmv - -2009-08-07 18:35:42 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: added caps for AAC and fixed playback of a clip with LPCM - -2009-08-07 18:17:28 +0200 Josep Torra <n770galaxy@gmail.com> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegpsdemux: improved demuxer performance - Increased performance doing pull_range in blocks of 32Kb instead of 4Kb. - Caching the value of gst_adapter_available instead of calling it 3 times. - Added some comments with the header descriptions. - Peek enough data to avoid a corner case where could be readed data outside - the buffer. - Speed up some more inlining some functions and keeping another stream pointer - list to be used as iterator. - Sprinkle branch prediction macros accross the code. - Handling the seeking with flush in pull mode in the proper way. - -2009-08-07 14:41:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/gme/Makefile.am: - * ext/gme/gstgme.c: - * ext/gme/gstgme.h: - gmedec: Use GstAdapter instead of many buffer joins - This reduces the number of reallocations and memcpys drastically. - Also free the input data as soon as it's complete and passed to GME - as it's not needed anymore. - -2009-08-07 13:07:17 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.c: - * gst/flacparse/gstbaseparse.c: - baseparse: prevent infinite loop when draining - -2009-08-07 13:06:28 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.c: - * gst/flacparse/gstbaseparse.c: - baseparse: fix minor memory leak - -2009-08-07 13:04:18 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/flacparse/gstbaseparse.c: - flacparse: sync baseparse (some more) - -2009-08-07 09:21:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/gme/gstgme.c: - gmedec: Add caps for all supported file formats to the srcpad template - -2009-08-07 07:23:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/gme/gstgme.c: - gme: Don't add empty string tags - -2009-08-07 07:01:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/gme/gstgme.c: - gme: Fix caps name again - -2009-08-07 06:59:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/gme/gstgme.c: - * ext/gme/gstgme.h: - gme: Rename everything from SPC to GME - -2009-08-07 06:59:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/spc/Makefile.am: - * ext/spc/gstspc.c: - * ext/spc/gstspc.h: - * ext/spc/tag.c: - * ext/spc/tag.h: - spc: Really remove old SPC code - -2009-08-07 06:56:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/gme/Makefile.am: - * ext/gme/gstgme.c: - * ext/gme/gstgme.h: - * ext/gme/tag.c: - * ext/gme/tag.h: - gme: Use gme for tags and duration parsing - -2009-08-07 06:41:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/Makefile.am: - * ext/gme/Makefile.am: - * ext/gme/gstgme.c: - * ext/gme/gstgme.h: - * ext/gme/tag.c: - * ext/gme/tag.h: - spc: Rename SPC plugin to GME - as preparation for enabling support for non-SPC gaming console sound files. - -2009-08-06 21:42:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/spc/gstspc.c: - spcdec: Forward all unknown src events upstream and don't restrict to SPC - -2009-08-06 19:26:21 +0200 ric <csxnju at sogou.com> - - * gst/rtpmanager/rtpsource.c: - rtpsource: avoid buffer leak on bad seqnum - Fixes #590797 - -2009-08-05 09:36:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegptsdemux: Fix SEEKING query - Send the BYTES based query downstream, not the orignal one. - -2009-08-04 12:58:35 +0200 Jan Urbanski <wulczer@wulczer.org> - - * gst/qtmux/gstqtmux.c: - qtmux: Don't require endianness field for 8 bit raw audio - Fixes bug #590360. - -2009-08-04 10:18:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/spc/gstspc.c: - spc: Make the SPC plugin work with the latest libgme release - gme_enable_accuracy() was added in SVN trunk and is not yet - in any release. - -2009-08-04 10:06:54 +0200 Michael Pyne <mpyne@kde.org> - - * configure.ac: - * ext/spc/gstspc.c: - * ext/spc/gstspc.h: - spc: Use the portable libgme instead of x86-only OpenSPC library - This will later allow us to play other gaming console files - that are supported by libgme. - Fixes bug #576800. - -2009-06-12 17:22:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/flacparse/Makefile.am: - * gst/flacparse/gstbitreader.c: - * gst/flacparse/gstbitreader.h: - * gst/flacparse/gstbytereader.c: - * gst/flacparse/gstbytereader.h: - * gst/flacparse/gstflacparse.c: - flacparse: remove internal bitreader and bytereader now that these are in libgstbase - -2009-07-31 11:27:03 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst/selector/gstoutputselector.c: - outputselector: check for pending srcpad in _get_property() - If there is a pending srcpad, return it instead of active srcpad - in gst_output_selector_get_property() function. - -2009-07-30 14:17:59 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: Set camerasrc to READY state instead of PAUSED when acquiring allowed caps - -2009-07-31 07:16:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * sys/directdraw/gstdirectdrawsink.c: - directdraw: Fix indention - -2009-07-31 02:05:41 +0400 Руслан Ижбулатов <lrn1986@gmail.com> - - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - directdraw: Implement GstNavigation interface - Fixes bug #590208. - -2009-07-31 00:19:19 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * gst/asfmux/gstasfobjects.c: - * gst/asfmux/gstasfobjects.h: - * gst/asfmux/gstrtpasfpay.c: - rtpasfpay: set padding field to 0 on rtp asf packets - The ASF RTP spec demands that packets have their padding removed - and the padding size field set to 0 for packets when puting them - inside the RTP packets - -2009-07-30 00:19:18 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * gst/asfmux/gstasfmux.c: - asfmux: Set video stream seekable property to true - Video stream always have indexes, so they are all seekable - -2009-07-30 00:12:45 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * gst/asfmux/gstasfmux.c: - asfmux: Removing useless TODOs - After testing in windows and linux, this audio correction field - made no difference so far. All example files I got only had - zeroes in this field - -2009-07-30 00:04:43 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * gst/asfmux/gstasfmux.c: - asfmux: Fixes video stream properties object - Fixes stream properties object creation for video content - -2009-07-29 19:07:27 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfmux.h: - asfmux: accept pad requests a little longer - asfmux now start rejecting pad requests after it pushes the first - buffer, before this, it was rejecting after going to paused - -2009-07-29 18:44:11 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * gst/asfmux/gstasfmux.c: - asfmux: adds support to vc-1 streams - -2009-07-29 17:23:31 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: Remove empty finalize - -2009-07-29 16:02:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - configure.ac: Fix macro name - -2009-07-29 15:35:03 +0200 Joni Valtanen <joni.valtanen@movial.com> - - * configure.ac: - * sys/Makefile.am: - * sys/directsound/Makefile.am: - * sys/directsound/gstdirectsoundplugin.c: - * sys/directsound/gstdirectsoundsrc.c: - * sys/directsound/gstdirectsoundsrc.h: - directsoundsrc: Add DirectSound source plugin - Fixes bug #344129. - -2009-07-28 22:51:39 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * tests/check/Makefile.am: - * tests/check/elements/asfmux.c: - asfmux: First basic check unit tests - Adds simple asfmux unit tests, that test pad creation and pushing a - single buffer through them - -2009-07-28 21:37:04 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * gst/asfmux/gstasfmux.c: - asfmux: Forcing pad names to be video_%02d and audio_%02d like - -2009-07-28 18:18:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmanager/rtpsource.c: - rtpsource: allow for NULL caps on buffers - Add the NULL caps check where it matters and also cover another case of - potential NULL caps. - Fixes #590030 - -2009-07-28 11:59:56 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmanager/rtpsource.c: - rtpsource: Incoming buffers do not always have caps - -2009-07-27 14:03:59 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst/camerabin/gstcamerabinphotography.c: - camerabin: photo iface setter functions return TRUE when used in NULL state - We cache the values and apply then when possible. - -2009-07-27 08:25:37 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com> - - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/camerabinvideo.h: - * gst/camerabin/gstcamerabin.c: - camerabin: do not put video pipeline into READY when start recording camerabin: remember probe IDs and disconnect them when destroying pipelines - -2009-07-27 19:59:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/amrwbenc/gstamrwbenc.c: - amrwbenc: Fix compilation - -2009-07-27 19:55:27 +0200 Iago Toral <itoral@igalia.com> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-amrwb.xml: - * docs/plugins/inspect/plugin-amrwbenc.xml: - * ext/Makefile.am: - * ext/amrwb/Makefile.am: - * ext/amrwb/gstamrwbdec.c: - * ext/amrwb/gstamrwbdec.h: - * ext/amrwb/gstamrwbparse.c: - * ext/amrwb/gstamrwbparse.h: - * ext/amrwbenc/GstAmrwbEnc.prs: - * ext/amrwbenc/Makefile.am: - * ext/amrwbenc/README: - * ext/amrwbenc/gstamrwb.c: - * ext/amrwbenc/gstamrwbenc.c: - * ext/amrwbenc/gstamrwbenc.h: - amrwb: Remove AMR-WB parser and decoder and rename encoder plugin from amrwb to amrwbenc - Partially fixes bug #584890. - -2009-07-27 15:46:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmanager/rtpsession.c: - rtpsession: avoid doing lip-sync in BYE - When we get a BYE packet, don't do lip-sync with the SR inside because some - senders have trouble constructing valid SR packets after BYE. - -2009-07-27 15:33:04 +0200 Julien Isorce <julien.isorce@gmail.com> - - * win32/MANIFEST: - * win32/vs6/gst_plugins_bad.dsw: - * win32/vs7/gst-plugins-bad.sln: - * win32/vs7/libgstdirectdraw.vcproj: - * win32/vs8/libgstdirectdraw.vcproj: - directdrawsink: update vs8 build - also remove directdrawsink from vs6 and vs7 build - -2009-07-27 14:52:57 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/Makefile.am: - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * sys/dshowsrcwrapper/gstdshowaudiosrc.h: - * sys/dshowsrcwrapper/gstdshowfakesink.cpp: - * sys/dshowsrcwrapper/gstdshowfakesink.h: - * sys/dshowsrcwrapper/gstdshowinterface.h: - * sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - * sys/dshowsrcwrapper/libgstdshow.def: - * win32/vs8/libdshowsrcwrapper.vcproj: - dshowsrcwrapper: remove use of IGstDshowInterface - -2009-07-27 13:17:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmanager/rtpsession.c: - rtpbin: don't do lip-sync after a BYE - After a BYE packet from a source, stop forwarding the SR packets for lip-sync - to rtpbin. Some senders don't update their SR packets correctly after sending a - BYE and then we break lip-sync. We prefer to let the jitterbuffers drain with - the current lip-sync instead. - -2009-07-27 12:43:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmanager/rtpsession.c: - rtpbin: only reconsider once for BYE - When iterating the sources of a BYE packet, don't signal a reconsideration for - each of them but signal after we handled all sources. - -2009-07-25 12:19:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkatespu.c: - kate: break up macros into multiple lines - -2009-07-24 21:54:59 +0100 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatespu.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkatetiger.c: - * ext/kate/gstkateutil.c: - kate: use GST_ELEMENT_ERROR for error reporting - See #525743. - -2009-07-24 14:52:28 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * configure.ac: - * gst/asfmux/Makefile.am: - * gst/asfmux/gstasf.c: - * gst/asfmux/gstasfmux.c: - * gst/asfmux/gstasfmux.h: - * gst/asfmux/gstasfobjects.c: - * gst/asfmux/gstasfobjects.h: - * gst/asfmux/gstasfparse.c: - * gst/asfmux/gstasfparse.h: - * gst/asfmux/gstrtpasfpay.c: - * gst/asfmux/gstrtpasfpay.h: - asfmux: Adds new plugin asfmux - Adds the brand new asfmux plugin, containing 3 elements: - asfmux, rtpasfpay and asfparse. This plugin was developed - as a GSoC 2009 project, with David Schleef as the mentor and - Thiago Santos as the student. - -2009-07-24 08:25:03 +0100 Jan Schmidt <thaytan@noraisin.net> - - * win32/MANIFEST: - win32: Fix the distcheck after dshowsrcwrapper rearrangements - Remove old files from the win32 manifest, and add the new one. - -2009-07-24 07:40:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/musepack/gstmusepackdec.c: - musepackdec: Implement SEEKING query - -2009-07-24 01:00:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - Revert "docs: fix docs build again" - It's not needed any longer after Stefan's updates in the common module. - This reverts commit 09c550a172a2c8a76f0b48f2f8ce11070598f66c. - -2009-07-24 00:42:53 +0300 Stefan Kost <ensonic@users.sf.net> - - * common: - Automatic update of common submodule - From fedaaee to 94f95e3 - -2009-07-23 17:57:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - docs: fix docs build again - There is no element called 'ladspa', so there won't be a -details - file for it. - -2009-07-23 09:58:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegdemux: Remove some backward compatibility code - Also we always require liboil so use it unconditionally. - -2009-07-23 09:52:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegdemux: Implement query type function for the src pads - -2009-07-20 22:13:11 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: Lock element before unlocking - -2009-07-20 22:08:52 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: Fix leaks - Use gst_pad_new_from_static_template() to not leak the pad template - Also properly chain up the finalize to the parent - -2009-07-20 22:08:24 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimenc: Use gst_pad_new_from_static_template - Prevents leak found by valgrind - -2009-07-20 21:52:59 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimenc: Unref clockid - -2009-07-20 14:00:17 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: Don't overwrite valid timestamps - -2009-07-20 13:45:54 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - Revert "mimdec: Ignore the timestamps inside the buffers" - This reverts commit 5e051fa98aeebdce2eca6b321ec1929e6f8fdf61. - -2009-07-21 15:33:41 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmanager/rtpsession.c: - rtpsession: Free conflicting addresses on finalize - -2009-07-21 15:31:33 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: Free the pad private data on pad release - Free the pad private data on pad release instead of using a weak ref, - which is not thread safe. Also, lock the content of the pad private using the element's - object lock. - -2009-07-22 14:19:18 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimenc: Ignore errors pushing out new segments - The following buffer push will return more valuable information. - -2009-07-22 18:01:12 +0300 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-amrwb.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-frei0r.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-lv2.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shapewipe.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-timidity.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xdgmime.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * ext/ladspa/gstladspa.c: - docs: add docs for ladspa and update plugin docs - Add also inspect files for lv2 and frei0r (no docs yet). - -2009-07-22 17:05:29 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/camerabin/gst-camera-perf.c: - camerabin: more perf-test cleanups - Remove some obsolete exmaples. Add video-width/height. Use proper api for - setting still image resolution. Fix stopping random tests on bin-state-changes. - Remove the memdup in snapshot again, as its not needed (pixbuf goes out of - scope with the buffer). - -2009-07-22 11:45:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * sys/dshowsrcwrapper/Makefile.am: - dshowsrcwrapper: update Makefile.am for source file renames as well - -2009-07-21 13:37:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/pcapparse/gstpcapparse.h: - docs: add pcapparse to docs - -2009-07-22 12:34:36 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - dshowaudiosrc: do not remove a range of length 0 - -2009-07-22 12:24:46 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshowaudiosrc.cpp: - * win32/vs8/libdshowsrcwrapper.vcproj: - dshowaudiosrc: converts code to C++ - -2009-07-22 11:01:49 +0200 Julien Isorce <julien.isorce@gmail.com> - - * sys/dshowsrcwrapper/gstdshowvideosrc.cpp: - * win32/vs8/libdshowsrcwrapper.vcproj: - dshowvideosrc: converts code to C++ - -2009-07-22 00:33:22 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: don't add a base_time==-1 to segment positions - Fixes assertion about newsegment with start=-1. - -2009-07-21 17:48:33 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin.c: - camerabin: small speedup in software zoom - Force crop on even pixel position to avoid slowpath in crop & scale. - -2009-07-21 16:48:26 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/camerabin/gst-camera-perf.c: - camerabin: we need to copy the data in the example - gdk_pixbuf_new_from_data does not copy the data. - -2009-07-21 11:28:20 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/lv2/Makefile.am: - make: remove whitespace after trailing backslash - -2009-07-21 12:42:33 +0100 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * ext/kate/gstkatespu.h: - kate: fix time conversion from DVD style timestamps. - -2009-07-21 13:51:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfdemux.c: - mxfdemux: Implement SEEKING query - -2009-07-21 13:39:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: Implement SEEKING query - Fixes bug #588944. - -2009-07-21 13:33:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Implement SEEKING query - Partially fixes bug #588944. - -2009-07-21 13:17:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: Free the PMT before setting a new one - -2009-07-21 13:14:00 +0200 Mikael Magnusson <mikma@users.sourceforge.net> - - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: Remove old PES PIDs when receiving PAT tables - Fixes bug #583470. - -2009-07-21 11:10:49 +0200 Julien Isorce <julien.isorce@gmail.com> - - * win32/vs8/libdshowsrcwrapper.vcproj: - dshowsrcwrapper: fix relative path - -2009-07-21 10:49:37 +0200 Julien Isorce <julien.isorce@gmail.com> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/dshow/Makefile.am: - * gst-libs/gst/dshow/gstdshowfakesrc.cpp: - * gst-libs/gst/dshow/gstdshowfakesrc.h: - * gst-libs/gst/dshow/gstdshowinterface.cpp: - * sys/dshowsrcwrapper/Makefile.am: - * sys/dshowsrcwrapper/gstdshow.cpp: - * sys/dshowsrcwrapper/gstdshow.h: - * sys/dshowsrcwrapper/gstdshowaudiosrc.c: - * sys/dshowsrcwrapper/gstdshowaudiosrc.h: - * sys/dshowsrcwrapper/gstdshowfakesink.cpp: - * sys/dshowsrcwrapper/gstdshowfakesink.h: - * sys/dshowsrcwrapper/gstdshowinterface.h: - * sys/dshowsrcwrapper/gstdshowsrcwrapper.cpp: - * sys/dshowsrcwrapper/gstdshowsrcwrapper.h: - * sys/dshowsrcwrapper/gstdshowvideosrc.c: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - * sys/dshowsrcwrapper/libgstdshow.def: - * win32/common/libgstdshow.def: - * win32/vs6/gst_plugins_bad.dsw: - * win32/vs6/libdshowsrcwrapper.dsp: - * win32/vs8/gst-plugins-bad.sln: - * win32/vs8/libdshowsrcwrapper.vcproj: - start refactoring of dshowsrcwrapper - -remove gst-libs/gst/dshow - -fakesource is moved from gst-libs/gst/dshow to sys/dshowsrcwrapper - -some minor changes (C/C++ check and includes) to make the plugin - compile again. - -2009-07-21 01:06:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkateutil.c: - kate: use new GST_TAG_SUBITLE_CODEC tag instead of GST_TAG_CODEC - -2009-07-21 00:54:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkateenc.c: - * ext/kate/gstkateutil.c: - * tests/check/elements/kate.c: - katedec: only put primary language tag in GST_TAG_LANGUAGE - Only put primary language into GST_TAG_LANGUAGE, and convert to lower case, - ie. only use "en" of "en_GB". This is per our tag documentation and hence - what apps expect. Also add example to kateenc property description so people - know a language code is wanted here. - -2009-07-21 00:04:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkatedec.c: - katedec: add comment why we dont' support application/x-kate here for now - -2009-07-20 13:54:49 +0100 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * ext/kate/Makefile.am: - * ext/kate/README: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkatespu.c: - * ext/kate/gstkatespu.h: - katedec: create SPU format images from suitable background images - Make katedec fabricate dvd-style subpictures for subtitle overlay - bitmaps, for easier playbin2 integration (#588638). - -2009-07-20 16:24:23 +0100 ogg.k.ogg.k <ogg.k.ogg.k@googlemail.com> - - * ext/kate/gstkatetag.c: - * ext/kate/gstkateutil.c: - * tests/check/Makefile.am: - * tests/check/elements/kate.c: - kate: fix some minor memory leaks - Makes 'make check-valgrind' work for the kate unit test (#525743) - -2009-07-20 16:39:42 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/camerabin/gst-camera-perf.c: - camerabin: add code in test to store snapshots for manual verification - Use gdk_pixbuf to save the image in perf-test. Also remove some obsolute - commented out code. - -2009-07-20 16:24:05 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/camerabinpreview.c: - camerabin: log formats in preview image conversion - -2009-07-20 16:21:06 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/camerabinvideo.c: - camerabin: remove unused variable assignment - Result is not needed here, but variable is used later on. Also remove double new - lines in function. - -2009-07-20 16:20:15 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: check query return result before using it - -2009-07-20 16:19:40 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/metadata/metadataexif.c: - metadata: don't dereference the pointer before the validity check - -2009-07-20 10:17:07 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/camerabin/gst-camera-perf.c: - camerabin: improve perf test robustness and add comments - -2009-07-20 12:25:15 +0100 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * ext/kate/gstkateenc.c: - kateenc: also recognise the new recommended 'SUB' category - Move the check for 'simple' subtitles category to a separate routine - and add in the new recommended SUB category (#525743). - -2009-07-20 11:41:40 +0100 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * ext/kate/gstkateenc.c: - * ext/kate/gstkateenc.h: - kateenc: keep bitmap/palette/region around when on the spot encoding is not possible due to an unknown end time - Fixes valgrind unitialized value report. See #525743. - -2009-07-19 23:45:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/inspect/plugin-kate.xml: - docs: add inspect info for kate plugin - Should fix the docs build. - -2009-07-19 23:35:05 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatetag.c: - * ext/kate/gstkatetiger.c: - * ext/kate/gstkateutil.c: - kate: add some FIXMEs - -2009-07-19 23:32:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkate.c: - katedec: demote to GST_RANK_NONE for now - There are still some autoplugging issues to sort out, and it needs - some testing. - -2009-07-19 23:29:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - checks: add kate unit tests to valgrind blacklist for now - And add check binary to ignore list. - -2009-07-19 23:16:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkateparse.c: - * ext/kate/gstkateutil.c: - kate: make sure to free some more stuff - -2009-07-19 22:29:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkate.h: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatetiger.c: - * ext/kate/gstkateutil.c: - * tests/check/elements/kate.c: - kate: fix up for additional subtitle/x-kate media type - -2009-07-13 22:38:43 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkate.c: - kate: remove local kate typefinder, use the one in -base - -2009-07-10 18:45:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/kate/gstkate.c: - * ext/kate/gstkate.h: - * ext/kate/gstkatedec.c: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateparse.c: - * ext/kate/gstkatetiger.c: - kate: change media type to subtitle/x-kate and update define accordingly - -2009-02-15 18:35:04 +0000 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> - - * LICENSE_readme: - * REQUIREMENTS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/Makefile.am: - * ext/kate/Makefile.am: - * ext/kate/README: - * ext/kate/gstkate.c: - * ext/kate/gstkate.h: - * ext/kate/gstkatedec.c: - * ext/kate/gstkatedec.h: - * ext/kate/gstkateenc.c: - * ext/kate/gstkateenc.h: - * ext/kate/gstkateparse.c: - * ext/kate/gstkateparse.h: - * ext/kate/gstkatetag.c: - * ext/kate/gstkatetag.h: - * ext/kate/gstkatetiger.c: - * ext/kate/gstkatetiger.h: - * ext/kate/gstkateutil.c: - * ext/kate/gstkateutil.h: - * gst-plugins-bad.spec.in: - * tests/check/Makefile.am: - * tests/check/elements/kate.c: - add new Kate plugin, for Kate overlay streams - katedec: Kate decoder (text only) - kateenc: Kate encoder (text and DVD SPU only) - katetag: Kate tagger - kateparse: Kate parser - tiger: Kate renderer using the Tiger rendering library - Fixes #525743. - -2009-07-19 15:37:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/real/gstrealaudiodec.c: - * gst/real/gstrealvideodec.c: - real: differentiate between 'module does not exist' and genuine module opening errors - Don't log a GST_ERROR if one of the codec modules we were looking for - doesn't exist. That's not a genuine error, but somewhat expected. - -2009-07-18 08:43:37 +0200 Matijs van Zuijlen <Matijs.van.Zuijlen@xs4all.nl> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Fix integer overflow - This breaks playback of files >4 GB as the offset was - a guint before. Changing it to a guint64 fixes this. - -2009-07-17 15:47:10 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/metadata/gstbasemetadata.c: - metadata: reset state if there is something to reset - The condition was wrong and as such the element was writing the same tags on subsequent - images if reused. - -2009-07-17 15:45:32 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin.c: - camerabin: use gst_caps_replace instead of separate calls - This fixes setting snapshot caps back to NULL also. - -2009-07-17 15:38:06 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/camerabin/gst-camera-perf.c: - camerabin: implemnet two more tests - Add tests for videorecording startup and capture startup delay. - -2009-07-17 09:36:15 +0100 Zaheer Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: add component tag to the video component structure in eit - -2009-07-16 17:27:09 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimenc: Don't pretend to be ML20 if paused - -2009-07-16 16:06:26 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - mimdec: Ignore the timestamps inside the buffers - -2009-07-16 15:43:46 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: Don't try to parse the header before dropping the paused frames - -2009-07-16 15:43:15 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: Print the incoming fourcc on errors - -2009-06-19 20:13:53 +1000 Austin Lund <austin.lund@gmail.com> - - * sys/dvb/gstdvbsrc.c: - Increased the length of time for tuning in gstdvbsrc.c. - Some devices take a while to tune and 500ms was too short to detect - successful tuning. As well as waiting for 5 seconds each 100ms the - status is checked and the loop is broken out of when tuning has suceeded. - -2009-07-16 19:49:26 +0200 Aleksey Yulin <ulin@tut.by> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Don't use PIDs > MPEGTS_MAX_PID - The mpegtsdemux streams array only has MPEGTS_MAX_PID entries - and accessing one afterwards will result in crashes. - Fixes bug #575672. - -2009-07-16 18:14:18 +0300 Zeeshan Ali (Khattak) <zeeshanak@gnome.org> - - * ext/metadata/gstmetadatamux.c: - Add more debug output to metadatamux - -2009-07-16 12:03:32 +0200 Josep Torra <josep@fluendo.com> - - * gst/mpegdemux/gstpesfilter.c: - pesfilter: Permit unbounded packets for 0xfd (extended stream id). - Added parsing of PES extension related data. - Fixes some VC1 related issues. - -2009-07-16 13:55:14 +0100 Jan Schmidt <thaytan@noraisin.net> - - * sys/oss4/oss4-mixer.c: - oss4: Attempt to fix a compiler warning - Don't store a const gchar * in a non-const gchar * local var. - Also, make the translation string function static since it's only - used in the one file. - -2009-07-15 18:10:04 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/metadata/metadataexif.c: - metadata: Fix some compiler warnings - Cast some debug string parameters so that they don't cause mismatched - type warnings. - -2009-07-15 16:17:35 +0100 Jan Schmidt <thaytan@noraisin.net> - - * sys/vdpau/gstvdpmpegdec.c: - vdpau: Fix a compiler warning about uninitialised variable use. - -2009-06-10 19:21:21 +0100 Garrett D'Amore <garrett.damore@sun.com> - - * sys/oss4/oss4-audio.c: - * sys/oss4/oss4-mixer-slider.c: - * sys/oss4/oss4-mixer-switch.c: - * sys/oss4/oss4-mixer.c: - oss4: Enhancements to the mixer and audio output - Code cleanups, general improvements, support for the - new mixer flags in latest gst-plugins-base. - Fixes: #584252 - Patch By: Brian Cameron <brian.cameron@sun.com> - Patch By: Garrett D'Amore <garrett.damore@sun.com> - -2009-07-15 18:27:39 +0100 Zaheer Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: add component tag to structure for component message - -2009-07-15 17:44:10 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinvideo.c: - camerabin: use nonbuffered io to save memcopies - We write large blocks anyway, so no extra buffering please. Also use one - g_object_set to set multiple properties on same object. - -2009-07-15 12:20:17 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/TODO: - camerabin: track todo items - -2009-07-15 11:17:36 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin.c: - camerabin: leave image/video bin in ready when changing mode - -2009-07-14 14:10:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/amrparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.h: - amrparse: Sync baseparse changes - -2009-07-14 14:08:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/aacparse/gstbaseparse.c: - * gst/aacparse/gstbaseparse.h: - aacparse: Add function for the baseparse subclass to push buffers downstream - Also handle the case gracefully where the subclass decides to drop - the first buffers and has no caps set yet. It's still required to - have valid caps set when the first buffer should be passed downstream. - -2009-07-14 14:07:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/aacparse/gstbaseparse.c: - baseparse: Fix seek event leaking - -2009-07-14 10:44:58 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/metadata/metadatatags.c: - metadata: fix copy'n'paste in tag description - -2009-07-13 18:04:14 -0700 David Schleef <ds@schleef.org> - - * ext/schroedinger/gstschroenc.c: - schro: Add enum types for schroedinger settings - -2009-06-30 16:31:12 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - resindvd: Don't send empty language code strings - Ignore empty language codes on some poorly coded DVDs, rather than - setting empty strings into our outgoing taglist. - -2009-07-13 12:24:04 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * common: - Automatic update of common submodule - From 5845b63 to fedaaee - -2009-07-10 21:42:19 +0100 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimenc: Only enable paused mode if the property is true - -2009-07-10 13:03:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/ivorbis/Makefile.am: - * ext/ivorbis/vorbisdec.c: - ivorbis: extract vorbis comments - Fixes #575818. - -2009-07-08 17:59:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Add BGRA support for video in/output - -2009-07-08 15:26:07 +0200 Sebastian Pölsterl <sebp@k-d-w.org> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsdemux: Fix double free - The hash table already makes sure that the stream is correctly - free'd when elements are removed. - Fixes bug #587819. - -2009-07-08 10:16:19 +0100 Miguel Àngel Farré <miquel.farre@gmail.com> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: parse component tag - -2009-07-08 10:11:52 +0100 Miguel Àngel Farré <miquel.farre@gmail.com> - - * gst/mpegdemux/gstmpegdesc.h: - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: parse carousel identifier descriptor - -2009-07-07 15:28:04 +0100 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/gstmpegdesc.h: - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: add parsing of data broadcast descriptors - -2009-07-07 20:28:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst-libs/gst/video/Makefile.am: - basevideo: Link with libgstvideo for some used functions - -2009-07-07 19:18:16 +0100 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - mimenc: Send pause frames when paused - -2009-07-07 19:15:42 +0100 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimdec.c: - mimdec: Ignore pause frames - -2009-07-07 18:27:36 +0100 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimenc: Put keyframe/paused flags in tcp header - -2009-07-07 18:18:06 +0100 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - mimenc: Put timestamp on the header buffer - -2009-07-07 18:22:54 +0100 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - mimenc: Retimestamp to the running time - -2009-07-06 17:17:22 +0100 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - mimenc: Save the segment - -2009-07-06 16:24:59 +0100 Olivier Crête <olivier.crete@collabora.co.uk> - - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - mimenc: Add property for the paused mode - -2009-07-03 16:08:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/schroedinger/Makefile.am: - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.h: - * gst-libs/gst/video/gstbasevideoencoder.h: - * gst-libs/gst/video/gstbasevideoparse.h: - * gst-libs/gst/video/gstbasevideoutils.h: - basevideo, schroedinger: guard unstable API with GST_USE_UNSTABLE_API - Add some guards and fat warnings to the header files with still unstable - API, so people who just look at the installed headers know that it - actually is unstable API. - -2009-07-02 15:58:00 +0100 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: fix sdt parsing. - fix parsing of everything for each service from eit schedule flag on and also - add a running-status parameter to the bus message structure. - -2009-07-02 11:24:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - * gst/shapewipe/gstshapewipe.h: - shapewipe: Add support for ARGB video input/output - -2009-07-01 10:55:12 -0700 David Schleef <ds@schleef.org> - - * configure.ac: - * ext/Makefile.am: - * ext/schroedinger/Makefile.am: - * ext/schroedinger/gstschro.c: - * ext/schroedinger/gstschrodec.c: - * ext/schroedinger/gstschroenc.c: - * ext/schroedinger/gstschroparse.c: - * ext/schroedinger/gstschroutils.c: - * ext/schroedinger/gstschroutils.h: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/video/Makefile.am: - * gst-libs/gst/video/gstbasevideocodec.c: - * gst-libs/gst/video/gstbasevideocodec.h: - * gst-libs/gst/video/gstbasevideodecoder.c: - * gst-libs/gst/video/gstbasevideodecoder.h: - * gst-libs/gst/video/gstbasevideoencoder.c: - * gst-libs/gst/video/gstbasevideoencoder.h: - * gst-libs/gst/video/gstbasevideoparse.c: - * gst-libs/gst/video/gstbasevideoparse.h: - * gst-libs/gst/video/gstbasevideoutils.c: - * gst-libs/gst/video/gstbasevideoutils.h: - basevideo: move from -base - Also move schroedinger plugin. This creates a new library, - gstbasevideo-0.10, which will probably be merged back into - gstvideo-0.10 when this is moved back to -base. - -2009-07-01 12:55:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmanager/rtpsource.c: - rtpbin: use new method for netaddress to string - -2009-06-29 17:24:58 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/Makefile.am: - dist: Add lv2 plugin to the dist - -2009-06-29 16:37:01 +0100 Jan Schmidt <thaytan@noraisin.net> - - * tests/examples/Makefile.am: - dist: Add the camerabin examples subdirectory to the dist - -2009-06-29 18:48:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmanager/gstrtpbin.c: - * tests/check/elements/rtpbin.c: - rtpbin: do better cleanup of the src ghostpads - Connect to the pad-removed signal of the ptdemux elements so that we remove the - ghostpads for them. Fixes cleanup when going to NULL as well as when releasing - the sinkpads. - Fixes #561752 - -2009-06-29 17:48:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - docs: remove old element - -2009-05-28 19:08:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmanager/rtpsession.c: - rtpsession: add a comment - -2009-06-29 16:37:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmanager/gstrtpbin.c: - * gst/rtpmanager/gstrtpbin.h: - * gst/rtpmanager/gstrtpsession.c: - rtpbin: add SDES property - Remove all individual SDES properties and use one sdes property that takes a - GstStructure instead. This will allow us to add more custom stuff to the SDES - messages later. - -2009-06-29 16:21:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmanager/rtpsession.c: - * gst/rtpmanager/rtpsession.h: - * gst/rtpmanager/rtpsource.c: - * gst/rtpmanager/rtpsource.h: - rtpbin: add SDES property that takes GstStructure - Remove all individual SDES properties and use one sdes property that takes a - GstStructure instead. This will allow us to add more custom stuff to the SDES - messages later. - -2009-06-02 17:46:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/rtpmanager/Makefile.am: - * gst/rtpmanager/gstrtpclient.c: - * gst/rtpmanager/gstrtpclient.h: - * gst/rtpmanager/gstrtpmanager.c: - rtpbin: removed old gstrtpclient - -2009-06-29 12:23:59 +0200 Andoni Morales <ylatuya at gmail.com> - - * ext/sdl/sdlvideosink.c: - sdl: only include sys/time.h when we have it - Fixes #586956 - -2009-06-29 12:02:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rsrc.c: - frei0r: Correctly clean up elements to be reusable and not leak memory - -2009-06-29 11:59:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rfilter.h: - frei0r: In the filter plugins create the frei0r instances in create() before playback starts - -2009-06-29 11:56:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0rmixer.c: - frei0r: In the mixer plugins create the frei0r instances in create() before playback starts - -2009-06-29 11:54:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0rsrc.c: - frei0r: In the src plugins create the frei0r instances in create() before playback starts - -2009-06-29 11:50:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0rfilter.c: - frei0r: Use fixed caps on the filter pads - This is required because we have to create a new frei0r - instance for any caps changes and the instances can have history. - Just creating a new instance during playback can result in bad output - right after the caps change. - -2009-06-27 09:51:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - frei0r: Set the default property values correctly - -2009-06-26 18:35:06 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin.c: - camerabin: code cleanups - Downgrade a WARNING to INFO. Use a bit more compact code. Add a fixme comment. - -2009-06-26 18:34:36 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin.c: - camerabin: just ref caps, we don't need a writable copy - -2009-06-26 18:33:47 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin.c: - camerabin: no need to ref and unref this temporarily - -2009-06-26 18:32:40 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin.c: - camerabin: don't leak sink_caps if they would be any-caps - -2009-06-26 18:31:51 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin.c: - camerabin: don't leak preview images - -2009-06-26 18:30:01 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin.c: - camerabin: don't leak viewfinder-caps - -2009-06-26 16:07:43 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/camerabin/gst-camera-perf.c: - camerabin: make shot2shot test more reliable - We can only trigger next shot (in the test) when current is captured and saved. - -2009-06-26 13:10:12 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/camerabinvideo.c: - camerabin: insert a few blank lines for readability - -2009-06-26 13:09:27 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/camerabinpreview.c: - camerabin: don't leak messages and element refs in preview - -2009-06-26 15:10:05 +0100 Jan Schmidt <thaytan@noraisin.net> - - * autogen.sh: - autogen.sh: Use printf instead of 'echo -n'. Check for automake-1.101 - Check for more automake command variants. Use printf instead of 'echo -n' - for portability - -2009-06-26 13:42:51 +0100 Jan Schmidt <thaytan@noraisin.net> - - * common: - Automatic update of common submodule - From f810030 to 5845b63 - -2009-06-26 09:30:22 +0100 Changwoo Ryu <cwryu@debian.org> - - * gst/freeze/Makefile.am: - freeze: don't build plugin static lib - Pass --tag=disable-static to libtool like we do for other plugins. - Fixes #587023. - -2009-06-25 12:31:32 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/gstlv2.c: - Use GST_WARNING instead of fprintf. - -2009-05-30 11:18:21 -0400 Dave Robillard <dave@drobilla.net> - - * ext/lv2/README: - Add LV2 quick start README. - -2009-06-25 19:23:16 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/gstcamerabin.c: - camerabin: don't leak requestpads - Requestpads need to be released and unreffed. Add a comment in one case where - we intentionaly don't unref. - -2009-06-25 19:21:47 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/camerabin/gst-camera-perf.c: - camerabin: sync first test more safely - Don't use gst_element_get_state() to wait for PLAYING, Use the bus-handler - insteader and asynchronously schedule next test. - -2009-06-25 16:41:49 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/gstcapssetter.c: - * gst/debugutils/gstcapssetter.h: - capssetter: import element into -bad - -2009-06-25 08:38:21 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/qtmux/atoms.c: - qtmux: Remove unused variable. - -2009-06-25 08:38:10 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/qtmux/gstqtmux.c: - qtmux: Fix debug statement. - -2009-06-24 18:56:28 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/examples/camerabin/gst-camera-perf.c: - camerabin: add target-times option to specify test times - Have some reasonable default times. Add a commandline option to override - defaults. Interpret target-time=0 as skip-test. - -2009-06-23 13:01:52 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: buffer-alloc support fixes to image and video bin handling - Keep image bin in PAUSED state in image mode except when processing/saving (PLAYING/READY). - Change output-selector to view finder before setting video bin to READY. - Fix filename sent with img-done signal. - -2009-06-23 13:01:13 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/camerabinvideo.h: - camerabin: fix setting mute when video bin elements haven't been created - -2009-06-16 18:12:29 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: set image bin to PAUSED when starting capture - Set image bin to PAUSED also when starting capture using photography - interface. - -2009-04-21 10:55:36 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: leave v4l2camsrc "capture-mode" as video mode when pausing - -2009-06-24 15:14:33 +0100 Jan Schmidt <jan.schmidt@sun.com> - - * common: - Automatic update of common submodule - From f3bb51b to f810030 - -2009-06-22 03:55:27 +0100 Jan Schmidt <thaytan@noraisin.net> - - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdpvideoyuv.c: - VDPAU: Move I420/YV12 to the front of the caps. Add debug. - Make I420/YV12 caps be preferred when downloading to YUV buffers, - when possible, by listing them first in the set of output caps. - Add some debug in the caps selection code. - -2009-06-23 18:01:18 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * ext/xvid/gstxvidenc.c: - xvidenc: also allow video/mpeg on output caps. Fixes #377784. - -2009-06-23 18:23:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Correctly handle 0/1 fps - -2009-06-22 23:50:49 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/ladspa/Makefile.am: - * ext/ladspa/gstladspa.h: - * ext/lv2/Makefile.am: - * ext/lv2/gstlv2.h: - signalprocessor: use $(top_builddir) instead of relative paths - -2009-06-22 23:49:03 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/Makefile.am: - camerabin: add local include dir to CFLAGS - -2009-04-28 23:24:45 -0400 Dave Robillard <dave@drobilla.net> - - * configure.ac: - * ext/Makefile.am: - * ext/ladspa/Makefile.am: - * ext/ladspa/gstladspa.h: - * ext/lv2/Makefile.am: - * ext/lv2/gstlv2.c: - * ext/lv2/gstlv2.h: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/signalprocessor/.gitignore: - * gst-libs/gst/signalprocessor/Makefile.am: - * gst-libs/gst/signalprocessor/gstsignalprocessor.c: - * gst-libs/gst/signalprocessor/gstsignalprocessor.h: - Working LV2 plugin discovery. - - Separate gstsignalprocessor into a separate library (not sure if this - is in the right place, but it works for now anyway) - - Create LV2 element based on LADSPA element, port most discovery - functionality - -2009-03-29 13:31:21 -0400 Dave Robillard <dave@drobilla.net> - - * ext/ladspa/gstladspa.h: - Fix inconsistent style (trivial test commit). - -2009-03-29 13:23:02 -0400 Dave Robillard <dave@drobilla.net> - - * configure.ac: - Add configure check for SLV2. - -2009-06-22 22:01:22 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/check/elements/camerabin.c: - camerabin: debug log only change - -2009-06-22 18:35:21 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - * ext/metadata/metadataxmp.c: - metadata: map more tags and fix reading of xmp tags - Register xmp schemas for photoshop and iptc. Map a few location tags there. - Add more dc tags. Fix reading xmp tag by iteration over known schemas. Add - some more debug logging. - -2009-06-16 17:12:27 +0300 Stefan Kost <ensonic@users.sf.net> - - * tests/check/elements/camerabin.c: - camerabin: more cleanup in tests - Add more debug logging. Remove unused mutex and cond. - -2009-06-12 14:26:24 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/camerabingeneral.c: - * gst/camerabin/camerabingeneral.h: - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/gstcamerabin.c: - camerabin: code cruft removal and debug logs - Remove unused code. Add lots of debug loging. Change comments for local - functions to not use /** gtk-doc start style. - -2009-06-12 10:40:48 +0300 Stefan Kost <ensonic@users.sf.net> - - * configure.ac: - * tests/examples/Makefile.am: - * tests/examples/camerabin/.gitignore: - * tests/examples/camerabin/Makefile.am: - * tests/examples/camerabin/gst-camera-perf.c: - * tests/examples/camerabin/gst-camera-perf.glade: - * tests/examples/camerabin/gst-camera.c: - * tests/examples/camerabin/gst-camera.glade: - camerabin: add camerabin examples - gst-camera is a gtk-test app to play with the imagecapture and videorecording. - gst-camera-perf is a tool to run various scenarios and take time meassurements - (e.g. shot-to-shot). Also sort the output files in configure.ac a bit to be - in alphabetical order. - -2009-06-10 11:15:01 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/metadata/metadataexif.c: - metadata: fix conversion of geo coordinates - Coordinate conversion has been verified with exiv2 and some webpages. - Minutes wher totally off and seconds were not used at all. - -2009-06-22 11:19:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/h264parse/gsth264parse.c: - h264parse: detect and fix for bad NALU sizes - when in AVC mode a nalu size seems invalid, assume the NALU has the size of the - available data instead of looping forever. - Fixes #586354 - -2009-06-19 21:20:26 +0100 Jan Schmidt <thaytan@noraisin.net> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpvideoyuv.c: - VDPAU: Add some debug statements - -2009-06-18 17:06:23 +0100 Jan Schmidt <thaytan@noraisin.net> - - * sys/vdpau/Makefile.am: - VDPAU: Fix build flags to pull in gst-plugins-base libs - -2009-06-15 18:33:06 +0100 Jan Schmidt <thaytan@noraisin.net> - - * sys/vdpau/gstvdpvideoyuv.c: - VDPAU: Refactor the error path to a common output, and fix a leak. - Don't leak the input buffer on errors. Add some debug statements. - -2009-06-15 18:29:56 +0100 Jan Schmidt <thaytan@noraisin.net> - - * sys/vdpau/gstvdpmpegdec.c: - VDPAU: Fix up caps in vdpaumpegdec. Remove extra semicolon - Fix a typo in the caps for the VDPAU mpeg decoder (chroma_type->chroma-type) - and use the GST_VDP_VIDEO_CAPS for the pad template. - Remove a stray semicolon. - -2009-06-12 16:39:39 +0100 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - * sys/vdpau/Makefile.am: - VDPAU: Enhance the configure tests - Check for the VDPAU headers in /usr/include/nvidia as they are on some - platforms (Fedora/rpmfusion). Also check that the libvdpau library is - available. - -2009-06-09 23:14:26 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - vdpaumpegdec: use fixed src caps - -2009-06-08 14:35:29 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpmpegdec.h: - vdpaumpegdec: drop all frames before a GOP when we seek - -2009-06-08 14:15:03 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - vdpaumpegdec: small cleanup - -2009-06-07 23:46:38 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdpmpegdec.h: - * sys/vdpau/gstvdpvideobuffer.c: - * sys/vdpau/gstvdpvideobuffer.h: - * sys/vdpau/gstvdpvideoyuv.h: - * sys/vdpau/gstvdpyuvvideo.h: - vdpau: s/IS_VDPAU/IS_VDP - -2009-06-07 01:25:01 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - vdpaumpegdec: send newsegment event if only the rate has been updated - -2009-06-07 01:12:50 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpmpegdec.h: - vdpaumpegdec: use mutex to protect mpeg_dec->seeking from concurrent access - -2009-06-07 00:55:55 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - vdpaumpegdec: use gst_pad_get_parent for threadsafety - -2009-06-06 21:27:52 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - vdpaumpegdec: further work on seeking - -2009-06-05 23:11:18 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/mpegutil.c: - vdpaumpegdec: small cleanups - -2009-06-05 22:28:02 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdec.c: - vdpaumpegdec: set GST_BUFFER_FLAG_DELTA_UNIT on non I_FRAME's - -2009-06-05 21:48:28 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdp.c: - * sys/vdpau/gstvdpmpegdec.c: - * sys/vdpau/gstvdpmpegdec.h: - vdpaumpegdec: rename gstvdpmpegdecoder.ch to gstvdpmpegdec.ch - -2009-06-05 21:46:08 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp.c: - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - vdpaumpegdec: rename GstVdpMpegDecoder to GstVdpMpegDec - -2009-06-05 21:42:30 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - vdpaumpegdec: pass buffer size directly to gst_vdp_mpeg_decoder_decode - -2009-06-05 21:18:47 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: small cleanup - -2009-06-05 21:16:48 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - vdpaumpegdec: calculate byterate from the size of the incoming data - -2009-06-05 19:08:24 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: print frame_nr in debug print - -2009-06-05 18:28:17 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: interlaced fixes - -2009-06-05 18:18:38 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: only set base duration once - -2009-06-05 17:53:16 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: don't send the EVENT_NEWSEGMENT downstream if we're seeking - -2009-06-05 17:43:49 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - vdpaumpegdec: implement seeking - -2009-06-05 11:54:17 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: change a GST_DEBUG to GST_WARNING - -2009-06-05 11:52:32 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - vdpaumpegdec: remove unused broken_gop field - -2009-06-05 11:51:41 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: add new gst_vdp_mpeg_decoder_flush for flushing the decoder - -2009-06-05 11:24:34 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: use GSE_DEBUG_FUNCPTR - -2009-06-05 11:20:56 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: don't drop discont buffers - -2009-06-05 11:17:16 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - * sys/vdpau/mpegutil.c: - * sys/vdpau/mpegutil.h: - vdpaumpegdec: handle GST_QUERY_POSITION and GST_QUERY_DURATION - -2009-06-04 21:17:40 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - * sys/vdpau/mpegutil.c: - * sys/vdpau/mpegutil.h: - vdpaumpegdec: calculate correct duration from data in MPEG_PACKET_EXT_PICTURE_CODING - -2009-06-04 19:30:02 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - vdpaumpegdec: fix so that the first frame in a raw mpegvideo stream get timestamp 0 - -2009-06-04 19:17:14 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpdecoder.h: - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - vpdaumpegdec: remove useless GstVdpDecoder baseclass - -2009-06-04 18:11:06 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/mpegutil.c: - * sys/vdpau/mpegutil.h: - vdpaumpegdec: use GstBitReader to parse bitstream - -2009-05-06 23:07:00 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * gst/mpegvideoparse/mpegvideoparse.c: - * sys/vdpau/gstvdp.c: - vdpau: change element rank for testing purposes - set mpegvideoparse rank to primary and vdpaumpegdec to primary - 1 to get vdpaumpegdec - correctly plugged into playbin - -2009-05-05 23:19:56 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpmpegdecoder.c: - vdpau: add debug on GstVdpDevice destroy - -2009-05-05 23:13:25 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: small code cleanup - -2009-05-05 23:08:51 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: remove unnused GstVdpBFrame struct - -2009-05-05 23:07:06 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdecoder.c: - vdpaumpegdec: fix small typo in debug print - -2009-05-05 18:54:31 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpdecoder.h: - vdpaumpegdec: fixup timestamping of outgoing buffers - -2009-05-05 18:45:07 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: don't add forward_reference if the frame is an I_FRAME - -2009-05-05 18:37:50 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: set correct timestamps - -2009-05-05 17:30:33 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - vdpaumpegdec: remove unneeded locking since we know do StateChange correctly - -2009-05-05 17:28:19 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp.c: - * sys/vdpau/gstvdpdecoder.h: - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - * sys/vdpau/gstvdpvideobuffer.c: - * sys/vdpau/gstvdpvideobuffer.h: - s/GST_TYPE_VDPAU/GST_TYPE_VDP/g - -2009-05-05 17:20:16 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdpvideoyuv.h: - * sys/vdpau/gstvdpyuvvideo.h: - vdpau: s/GST_TYPE_VDPAU/GST_TYPE_VDP/g - -2009-05-05 17:15:33 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: fixup state change - -2009-05-05 16:29:24 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdevice.c: - vdpau: init "vdpaudevice" debug catoegory in gst_vdp_get_device - -2009-05-05 08:11:03 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: hold the lock in change_state - -2009-05-03 21:52:49 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - * sys/vdpau/gstvdpvideobuffer.c: - * sys/vdpau/gstvdpvideobuffer.h: - vdpaumpegdec: the B_FRAME decoding was completely wrong, fix it - the buffers don't come in output order so fix the decoder to handle this - add new gst_vdp_video_buffer_add_reference method to GstVdpVideoBuffer to be able to keep - buffers alive. Ie. a B_FRAME need to have both the forward reference and the backward - reference alive during it's lifetime. - add mutex to protect for threadsafety issues when we reset the decoder in FLUSH_STOP - -2009-04-30 21:58:01 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/mpegutil.c: - vdpaumpegdec: set full_pel_forward_vector to 0 when pic_type == P_FRAME - -2009-04-27 21:30:59 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: drop frames if we haven't got an I_FRAME yet - -2009-04-27 20:57:12 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp.c: - vdpau: set vdpauvideoyuv and vdpauyuvvideo to GST_RANK_PRIMARY - -2009-04-27 20:50:11 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: destroy the VdpDecoder and reset the decoder on state change - -2009-04-27 20:45:11 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdevice.c: - vdpau: fix error where we forgot to pass a trailing NULL to g_object_new - -2009-04-27 20:21:44 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdevice.c: - vdpau: close display on finalize - -2009-04-27 20:18:52 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdecoder.c: - vdpau: small fixes - init create GstVdpDevice on GST_STATE_CHANGE_READY_TO_PAUSED instead of on - GST_STATE_CHANGE_NULL_TO READY - add back incrementing of frame_nr - -2009-04-27 20:15:07 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdevice.c: - vdpau: use g_once_init_enter instead of g_once - -2009-04-27 18:34:53 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: if available use incoming buffer timestamp as output timestamp - -2009-04-27 15:12:26 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: clear the adapter when we reset the decoder - -2009-04-26 23:25:33 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpdecoder.h: - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - * sys/vdpau/gstvdpvideobuffer.h: - * sys/vdpau/gstvdpvideoyuv.c: - * sys/vdpau/gstvdpvideoyuv.h: - * sys/vdpau/gstvdpyuvvideo.c: - * sys/vdpau/gstvdpyuvvideo.h: - vdpau: fixup renaming - the rename work done in commit 24cf84d06b2f4b2edec3383b198441a07829618b didn't - include typecasts. This commit fixes this. - -2009-04-26 23:20:30 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: reset decoder on GST_EVENT_FLUSH_STOP - -2009-04-26 22:05:11 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: reset decoder when we get a discont buffer - -2009-04-26 20:40:45 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: add "MPEG_PACKET_EXT_PICTURE_CODING" debug statement - -2009-04-22 23:35:07 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - * sys/vdpau/mpegutil.c: - * sys/vdpau/mpegutil.h: - vdpaumpegdec: handle broken_gop field - -2009-04-22 21:04:58 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/mpegutil.c: - vdpaumpegdec: convert all manual parsing to use read_bits instead - -2009-04-22 20:28:19 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: remove unneded gst_buffer_ref and the accompanying gst_buffer_unref - -2009-04-22 20:25:55 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: fixup error where we set forward_reference instead of backward_reference - -2009-04-16 23:43:24 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - * sys/vdpau/mpegutil.c: - vdpaumpegdec: handle multiple B_FRAMEs in a row - -2009-04-16 22:30:27 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: more B_FRAME work - -2009-04-16 22:06:50 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - vdpaumpegdec: inital support at handling B_FRAMES - -2009-04-15 23:49:07 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: fixup GstFlowReturn propagation a bit - -2009-04-15 23:38:53 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/mpegutil.c: - * sys/vdpau/mpegutil.h: - vdpaumpegdec: parse PICTURE_CODING_EXTENSION alternate_scan bit - -2009-04-15 23:31:33 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/mpegutil.c: - vdpaumpegdec: fixup quantmatrix extension parsing - -2009-04-15 18:17:54 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdec: correct some default values - mpeg1 now give nearly correct output :) - -2009-04-15 17:52:27 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.h: - vdpaumpegdecoder: remove unused slice field - -2009-04-14 23:47:40 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpvideobuffer.h: - vdpau: rename "video/vdpau-video" caps to "video/x-vdpau-video" - -2009-04-14 21:07:32 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpdecoder.h: - vdpau: remove "silent" property from GstVdpDecoder - -2009-04-14 21:05:44 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpdecoder.c: - vdpau: don't set element details in GstVdpDecoder - -2009-04-14 21:04:59 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp.c: - * sys/vdpau/gstvdpmpegdecoder.c: - vdpaumpegdecoder: rename to "vdpaumpegdec" - -2009-04-14 19:08:53 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - vdpaumpegdecoder: remove unnecesary want_slice field - -2009-04-13 22:21:03 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdp.c: - vdpau: small cosmetical fix - -2009-04-13 22:19:20 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdp.c: - * sys/vdpau/gstvdpdecoder.c: - * sys/vdpau/gstvdpdecoder.h: - * sys/vdpau/gstvdpdevice.c: - * sys/vdpau/gstvdpdevice.h: - * sys/vdpau/gstvdpmpegdecoder.c: - * sys/vdpau/gstvdpmpegdecoder.h: - * sys/vdpau/gstvdpvideobuffer.c: - * sys/vdpau/gstvdpvideobuffer.h: - * sys/vdpau/gstvdpvideoyuv.c: - * sys/vdpau/gstvdpvideoyuv.h: - * sys/vdpau/gstvdpyuvvideo.c: - * sys/vdpau/gstvdpyuvvideo.h: - vdpau: rename all files and objects from Vdpau to Vdp - -2009-04-13 21:23:38 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaumpegdecoder.c: - vdpau: decode slices when we get the next picture header. MPEG2 now kindof works. - -2009-04-13 21:11:54 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaumpegdecoder.c: - * sys/vdpau/gstvdpaumpegdecoder.h: - * sys/vdpau/mpegutil.c: - vdpau: small improvement to mpeg decoder - -2009-04-13 20:04:21 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudevice.c: - * sys/vdpau/gstvdpaumpegdecoder.c: - * sys/vdpau/gstvdpaumpegdecoder.h: - * sys/vdpau/gstvdpauvideoyuv.c: - * sys/vdpau/gstvdpauvideoyuv.h: - * sys/vdpau/gstvdpauyuvvideo.c: - * sys/vdpau/gstvdpauyuvvideo.h: - vdpau: remove unused "silent" properties - -2009-04-13 19:36:53 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpauvideoyuv.c: - * sys/vdpau/gstvdpauyuvvideo.c: - vdpau: implement GstVdpauVideoBuffer -> I420 conversion - -2009-04-09 16:54:27 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudevice.h: - * sys/vdpau/gstvdpauvideoyuv.c: - * sys/vdpau/gstvdpauyuvvideo.c: - vdpau: move definition of the VdpChromaType array and the VdpauFormats to gstdevice.h - -2009-04-07 21:51:48 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaumpegdecoder.c: - vdpau: small fix - set vdp_info.forward_reference to VDP_INVALID handle when unreffing the old - buffer - -2009-04-07 20:46:49 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpau.c: - * sys/vdpau/gstvdpaudevice.c: - * sys/vdpau/gstvdpaudevice.h: - * sys/vdpau/gstvdpauvideoyuv.c: - * sys/vdpau/gstvdpauyuvvideo.c: - * sys/vdpau/gstvdpauyuvvideo.h: - vdpau: add new GstVdpauYUVVideo element - the GstVdpauYUVVideo element takes raw YUV video and outputs - GstVdpauVideoBuffers - -2009-04-04 22:45:09 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaumpegdecoder.c: - * sys/vdpau/gstvdpauvideoyuv.c: - vdpau: VideoYUV unref buffer in chain so that we don't leak them MpegDecoder parse sequence headers - -2009-04-04 22:05:11 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaumpegdecoder.c: - vdpau: remove some unneded includes - -2009-04-04 22:03:23 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpau.c: - * sys/vdpau/gstvdpaudecoder.h: - * sys/vdpau/gstvdpaumpegdecoder.c: - * sys/vdpau/gstvdpauvideoyuv.c: - vdpau: move plugin definition to a new gstvdpau.c file fix up debug categories - -2009-04-04 20:53:35 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaudecoder.h: - * sys/vdpau/gstvdpaumpegdecoder.c: - * sys/vdpau/gstvdpaumpegdecoder.h: - * sys/vdpau/gstvdpauvideobuffer.c: - * sys/vdpau/gstvdpauvideobuffer.h: - * sys/vdpau/gstvdpauvideoyuv.c: - * sys/vdpau/gstvdpauvideoyuv.h: - vdpau: add new GstVdpauVideoYUV element - GstVdpauDecoder now pushes GstVdpauVideoBuffers instead of doing - VdpSurface -> YUV conversion. To get YUV data you now put in a GstVdpauVideoYUV - element which takes GstVdpauVideoBuffers and outputs YUV data. - -2009-04-03 17:59:02 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaumpegdecoder.c: - vdpau: small indent fix - -2009-04-03 17:58:25 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudevice.c: - vdpau: remove obosolete FIXME and some debug prints from gstvdpaudevice.c - -2009-04-03 17:53:21 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudevice.h: - vdpau: commit rename of gst-vdpau-device.h to gstvdpaudevice.h - -2009-04-03 17:52:20 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gst-vdpau-device.c: - vdpau: remove gst-vdpau-device.c - -2009-04-03 17:51:16 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpaudecoder.h: - * sys/vdpau/gstvdpaudevice.c: - vdpau: rename gst-vdpau-device.ch to gstvdpaudevice.ch - -2009-04-01 21:42:56 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaudecoder.h: - vdpau: change all references of "gst_vdpaudecoder*" to "gst_vdpau_decoder" - -2009-04-01 21:40:14 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaumpegdecoder.c: - vdpau: make the decoder clean up after itself - -2009-04-01 21:26:45 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - vdpau: remove extra \ from Makefile.am - -2009-04-01 21:19:18 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gst-vdpau-device.c: - * sys/vdpau/gst-vdpau-device.h: - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaudecoder.h: - * sys/vdpau/gstvdpaumpegdecoder.c: - * sys/vdpau/gstvdpaumpegdecoder.h: - vdpau: add gstvdpaudevice for abstracting vdpau initalization - -2009-03-31 22:54:14 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaumpegdecoder.h: - vdpau: remove comment - -2009-03-31 22:53:40 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaudecoder.h: - * sys/vdpau/gstvdpaumpegdecoder.c: - * sys/vdpau/gstvdpaumpegdecoder.h: - * sys/vdpau/mpegutil.c: - * sys/vdpau/mpegutil.h: - vdpau: MPEG1 decoding know gives recognizable output - -2009-03-29 15:28:06 +0200 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaudecoder.h: - * sys/vdpau/gstvdpaumpegdecoder.c: - * sys/vdpau/gstvdpaumpegdecoder.h: - * sys/vdpau/mpegutil.c: - * sys/vdpau/mpegutil.h: - vdpau: create VdpDecoder in set_caps add more functions for parsing mpeg - -2009-03-27 17:11:04 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaudecoder.h: - * sys/vdpau/vdpauvariables.h: - vdpau: store vdpau function pointers in a local structure - -2009-03-27 16:55:19 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaumpegdecoder.c: - * sys/vdpau/gstvdpaumpegdecoder.h: - * sys/vdpau/mpegutil.c: - * sys/vdpau/mpegutil.h: - vdpau: extract mpeg2 profile from codec_data - -2009-03-26 21:04:48 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaudecoder.h: - * sys/vdpau/gstvdpaumpegdecoder.c: - * sys/vdpau/gstvdpaumpegdecoder.h: - vdpau: extract mpeg version - -2009-03-25 20:41:46 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpauh264decoder.c: - * sys/vdpau/gstvdpauh264decoder.h: - * sys/vdpau/gstvdpaumpegdecoder.c: - vdpau: add version specification to mpegdecoder caps - -2009-03-25 20:38:27 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpaumpegdecoder.c: - * sys/vdpau/gstvdpaumpegdecoder.h: - vdpau: focus on mpeg instead of h264 - -2009-03-25 19:59:06 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaudecoder.h: - * sys/vdpau/vdpauvariables.h: - vdpau: rough try at implementing pushinf of YV12 buffers - -2009-03-24 22:26:56 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudecoder.c: - vdpau: remove obsolete comment - -2009-03-23 21:36:55 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaudecoder.h: - * sys/vdpau/vdpauvariables.h: - vdpau: init vdpau in GST_STATE_CHANGE_NULL_TO_READY add gst_vdpaudecoder_push_video_surface to vdpaudecoder.h - -2009-03-23 20:47:00 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaudecoder.h: - vdpau: add stubs for pushing VdpVideoSurfaces to the src pad - -2009-03-21 22:06:12 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpauh264decoder.c: - vdpau: update VdpauH264Decoder element description - -2009-03-20 21:26:11 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudecoder.c: - vdpau: changle gstvdpaudecoder.c classification - -2009-03-20 21:24:40 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaudecoder.h: - * sys/vdpau/gstvdpauh264decoder.c: - * sys/vdpau/gstvdpauh264decoder.h: - * sys/vdpau/vdpauvariables.h: - vdpau: implement downstream caps negotiation - -2009-03-15 21:23:35 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/gstvdpaudecoder.c: - vdpau: small indentation fix - -2009-03-15 21:21:49 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * sys/vdpau/Makefile.am: - * sys/vdpau/gstvdpaudecoder.c: - * sys/vdpau/gstvdpaudecoder.h: - vdpau: add basic base class for vdpau decoders - -2009-03-14 10:43:28 +0100 Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> - - * configure.ac: - * sys/Makefile.am: - * sys/vdpau/Makefile.am: - add new vdpau directory - -2009-06-19 19:09:19 +0200 Branko Subasic <branko.subasic at axis.com> - - * gst/rtpmanager/gstrtpsession.c: - * gst/rtpmanager/rtpsession.c: - * gst/rtpmanager/rtpsession.h: - * gst/rtpmanager/rtpsource.c: - * gst/rtpmanager/rtpsource.h: - * tests/check/Makefile.am: - * tests/check/elements/rtpbin_buffer_list.c: - rtpbin: add support for buffer-list - Add support for sending buffer-lists. - Add unit test for testing that the buffer-list passed through rtpbin. - fixes #585839 - -2009-06-18 12:13:28 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstaacparse.c: - aacparse: ADIF: do not send bogus timestamps, leave to downstream (decoder) - -2009-06-11 15:54:42 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - qtmux: only use (64-bit) extended (mdat) atom size if needed. Fixes #585319. - -2009-06-10 14:46:14 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/gstqtmux.c: - qtmux: set default movie timescale to microsecond units - -2009-06-10 13:24:20 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - qtmux: compress/optimize stsc writing - -2009-06-10 12:42:44 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmuxmap.c: - qtmux: add 3GP style tagging (and refactor appropriately) - -2009-06-01 23:00:44 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/gstqtmux.c: - qtmux (and variants): handle pixel-aspect-ratio. Fixes #584358. - -2009-06-19 17:04:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/mythtv/gstmythtvsrc.c: - * gst/mpegtsmux/mpegtsmux.c: - Fix previous commit so that things still work with debug logs enabled - -2009-06-19 16:21:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/apexsink/gstapexsink.c: - * ext/directfb/dfbvideosink.c: - * ext/libmms/gstmms.c: - * ext/metadata/metadataexif.c: - * ext/mythtv/gstmythtvsrc.c: - * ext/resindvd/resindvdsrc.c: - * ext/sdl/sdlvideosink.c: - * gst/dvdspu/gstdvdspu.c: - * gst/liveadder/liveadder.c: - * gst/mpegtsmux/mpegtsmux.c: - * gst/mpegvideoparse/mpegvideoparse.c: - * gst/rtpmanager/gstrtpjitterbuffer.c: - * sys/oss4/oss4-mixer.c: - Make build without warnings with debugging disabled - -2009-06-16 21:34:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rsrc.c: - frei0r: Make plugin scanning more robust - -2009-06-16 21:27:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - frei0r: Make sure to only register plugins that have valid propert types - -2009-06-16 19:42:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/frei0r/gstfrei0rfilter.c: - frei0r: Remove custom get_unit_size implementation - This is already handled by the default one from GstVideoFilter - -2009-06-15 17:05:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0rfilter.c: - frei0r: Fix the klass of the filter elements - -2009-06-14 19:41:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rsrc.c: - frei0r: Free type names - -2009-06-14 19:35:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0rmixer.c: - frei0r: Unref the GstCollectPads instance on finalize - -2009-06-14 19:27:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0rsrc.c: - frei0r: Don't allow caps changes in PLAYING/PAUSED - Most frei0r source plugins generate output based on - previous output and creating a new instance on caps - changes will let the output start at 0 again. - -2009-06-14 19:21:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/Makefile.am: - * gst/frei0r/gstfrei0r.c: - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rmixer.c: - * gst/frei0r/gstfrei0rmixer.h: - freir0: Add support for frei0r mixer plugins - -2009-06-13 10:06:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0rsrc.c: - frei0r: Destroy the f0r_instance_t in stop() - -2009-06-12 22:04:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rsrc.c: - frei0r: Add the frei0r plugin type to the element name - This makes it easier to distinguish generators from filters, etc - -2009-06-12 22:00:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/Makefile.am: - * gst/frei0r/gstfrei0r.c: - * gst/frei0r/gstfrei0rsrc.c: - * gst/frei0r/gstfrei0rsrc.h: - frei0r: Add support for frei0r source/generator plugins - -2009-06-12 15:13:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - frei0r: Allow the complete double range for double properties - The spec restricts it to 0,1 but some plugins are using the - complete double range. - -2009-06-12 15:07:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/frei0r/gstfrei0r.c: - frei0r: Use better property nicks - -2009-06-12 14:59:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/frei0r/Makefile.am: - * gst/frei0r/frei0r.h: - * gst/frei0r/gstfrei0r.c: - * gst/frei0r/gstfrei0r.h: - * gst/frei0r/gstfrei0rfilter.c: - * gst/frei0r/gstfrei0rfilter.h: - frei0r: First version of a frei0r wrapper plugin - Currently this only supports frei0r filters. - -2009-06-14 20:00:51 +0200 Maximilian Högner <pbmaxi@hoegners.de> - - * gst/scaletempo/gstscaletempo.c: - scaletempo: Explicitely cast to signed integers to fix a segfault - Fixes bug #585660. - -2009-06-09 19:14:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - * gst/shapewipe/gstshapewipe.h: - shapewipe: Implement basic QoS - This change is based on Tim's QoS implementation - for jpegdec. - -2009-06-09 18:45:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Proxy queries on the video pads to the correct peers - -2009-06-09 18:37:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Proxy bufferalloc on the video sinkpad - -2009-06-09 18:25:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Try to work inplace if possible - This saves one new, large allocation per frame for the - most cases. - -2009-06-16 18:46:49 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/mxf/mxfdemux.c: - mxfdemux: fix stray semicolons that mess up if statement - -2009-06-11 13:42:20 +0100 Jan Schmidt <thaytan@noraisin.net> - - * common: - * docs/plugins/Makefile.am: - docs: Bump common to correct upload-doc.mak, fix a comment in the doc Makefile - -2009-06-18 20:33:00 +0100 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - * win32/common/config.h: - Back to development -> 0.10.13.1 - -2009-06-18 08:53:12 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst-plugins-bad.doap: - Add 0.10.13 release entry to the doap file - -=== release 0.10.13 === - -2009-06-18 08:29:56 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shapewipe.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-xdgmime.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * win32/common/config.h: - Release 0.10.13 - -2009-06-17 21:56:56 +0100 Jan Schmidt <thaytan@noraisin.net> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: - * po/lt.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files + * ext/wpe/gstwpesrcbin.cpp: + * ext/wpe/gstwpevideosrc.cpp: + wpe: Add 'run-javascript' action signal + Introduce way of running a script in the context of the internal + webView. + Fixes #1722 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3753> -2009-06-16 17:09:26 +0300 Stefan Kost <ensonic@users.sf.net> +2023-01-19 22:40:36 +0900 Seungha Yang <seungha@centricular.com> - * gst/camerabin/camerabinimage.c: - camerabin: reset filename after capture to avoid racy when capturing again - If we don't reset the filename we cannot check if we still expect the filename - for a subsequent capture pass. The imagebin would good to paused and we set the - filename in that state. This trigers an error-message and would capture to the - old filename. + * sys/win32ipc/gstwin32ipcvideosrc.cpp: + win32ipcvideosrc: Fix leak in fallback copy path + Clear shared memory after use + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3751> -2009-06-12 10:29:20 +0300 Stefan Kost <ensonic@users.sf.net> +2023-01-19 15:36:40 +0100 Edward Hervey <edward@centricular.com> - * tests/check/Makefile.am: - * tests/check/elements/camerabin.c: - camerabin: cleanups in the tests - Sprinkle more logging to make it easier to follow. Specify a low framerate and - capture resolution to avoid tests timing out. Make the sinks sync to test closer - to reality. Fix Makefile to use uninstalled interface. + * sys/va/gstvah264enc.c: + * sys/va/gstvah265enc.c: + va: Fix path leak + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3755> -2009-06-12 10:26:30 +0300 Stefan Kost <ensonic@users.sf.net> +=== release 1.21.90 === - * gst/camerabin/camerabinimage.c: - * gst/camerabin/gstcamerabin.c: - camerabin: set imagebin to PAUSED on capture and delayed filename setting - We need to set imagebin to PAUSED to not fail the bufferalloc. We also need to - keep the filesinks state locked until we have the filename for the run. +2023-01-13 19:08:48 +0000 Tim-Philipp Müller <tim@centricular.com> + + * NEWS: + * RELEASE: + * gst-plugins-bad.doap: + * meson.build: + Release 1.21.90 -2009-06-12 10:14:27 +0300 Stefan Kost <ensonic@users.sf.net> +2023-01-12 22:17:24 +0900 Seungha Yang <seungha@centricular.com> - * gst/selector/gstoutputselector.c: - outputselector: do the pad_alloc for the pad that is pending and have a fallback - We should do the pad_alloc for the pending pad if any, as we will switch to that - pad on next _chain() call. Also do a fallback alloc, if there is no output yet to - not fail state transitions in dynamic pipelines. + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + d3d11memory: Fix potential crash in GstD3D11PoolAllocator + Allocator object can be the final refcount holder, when a GstD3D11Memory + is being released. Do unref allocator once there's no more + remaining operation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3715> -2009-06-11 16:00:36 +0100 Jan Schmidt <thaytan@noraisin.net> +2023-01-12 22:14:30 +0900 Seungha Yang <seungha@centricular.com> - * win32/common/config.h: - win32: Bump win32 config.h version number too + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + d3d11memory: Remove GstD3D11PoolAllocator::dispose + Clear GstD3D11Device object in finalize method as well + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3715> -2009-06-05 22:43:50 +0100 Jan Schmidt <thaytan@noraisin.net> +2023-01-11 15:41:21 +0000 Tim-Philipp Müller <tim@centricular.com> - * configure.ac: * po/LINGUAS: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ja.po: - * po/ky.po: + * po/hr.po: + * po/ka.po: * po/lt.po: - * po/mt.po: - * po/nb.po: * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: * po/ru.po: * po/sk.po: - * po/sq.po: + * po/sl.po: * po/sr.po: - * po/sv.po: - * po/tr.po: * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - 0.10.12.3 pre-release - -2009-06-06 21:28:27 +0400 LRN <lrn1986@gmail.com> - - * gst/debugutils/Makefile.am: - Added base libs to debug utils makefile - Fixes #585015 - -2009-06-07 10:55:59 +0200 Edward Hervey <bilboed@bilboed.com> - - * tests/check/pipelines/metadata.c: - tests/metadata: Don't try tags we can't handle. Fixes #584945 - -2009-06-06 19:28:07 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/hdvparse/Makefile.am: - hdvparse: Link against libm because we use pow(). - -2009-06-06 13:53:04 +0100 Jan Schmidt <jan.schmidt@sun.com> - - * tests/examples/Makefile.am: - examples: Don't build the mxf example if GTK isn't present. - -2009-06-06 13:17:49 +0100 Jan Schmidt <jan.schmidt@sun.com> - - * ext/apexsink/gstapexraop.c: - * ext/apexsink/gstapexsink.c: - apexsink: Fix compiler warnings - Fix compile warnings on solaris from bzero not being declared (use - memset instead), and strict-aliasing warnings (use a temporary - variable). - -2009-06-06 02:35:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/id3tag/id3tag.c: - id3mux: init genre field in ID3v1 tag to an invalid number - So that it is not interpreted as 'Blues' if no genre is to be written. - -2009-06-06 01:05:49 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/id3tag/gstid3mux.c: - id3mux: don't write ID3v1 tag until specifically instructed to do so - ID3v1 tags are one of the most broken and ill-designed things that - exist on this planet. Let's not write them by default. - -2009-06-06 00:58:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/id3tag/id3tag.c: - id3mux: don't write empty ID3v1 tag - -2009-06-06 00:39:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/inspect/plugin-id3tag.xml: - * gst/id3tag/Makefile.am: - * gst/id3tag/gstid3mux.c: - * gst/id3tag/gstid3mux.h: - * gst/id3tag/gsttagmux.c: - * gst/id3tag/id3tag.c: - * gst/id3tag/id3tag.h: - id3tag: rename new id3tag element to id3mux replacing the one removed from -ugly - -2009-06-05 23:52:05 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/nsf/nes6502.c: - nsf: Fix compiler warning on Solaris. - A SEC() macro already exists on Solaris, causing warnings about - redefining it. - -2009-06-05 22:20:46 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/hdvparse/gsthdvparse.c: - hdvparse: Fix the build on Commander Thaytan's S10SP - -2009-06-05 19:53:09 +0100 Jan Schmidt <thaytan@noraisin.net> - - * tests/check/elements/.gitignore: - gitignore: Ignore shapewipe unit test binary - -2009-06-05 19:32:26 +0100 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-x264.xml: - * ext/Makefile.am: - * ext/x264/GstX264Enc.prs: - * ext/x264/Makefile.am: - * ext/x264/gstx264enc.c: - * ext/x264/gstx264enc.h: - * gst-plugins-bad.spec.in: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - Moved 'x264enc' from -bad to -ugly - -2009-06-05 21:17:55 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/Makefile.am: - * tests/check/Makefile.am: - camerabin: fix link order - Move local version up in the link order. - -2009-06-05 20:22:17 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/hdvparse/gsthdvparse.c: - hdvparse: Emit a GST_MESSAGE_ELEMENT with some goodness in it. - -2009-06-05 10:49:41 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegvideoparse/mpegvideoparse.c: - mpegvideoparse: Add methods to get names of various values. - -2009-06-05 10:48:52 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mpegdemux/gstmpegdefs.h: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Fix HDV private stream definition/caps. - -2009-06-05 10:47:41 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/hdvparse/gsthdvparse.c: - hdvparse: Rewrite from scratch. Handle both hdv-a and hdv-v - This time we analyze a lot more information. - Still need to re-add the message emission. - -2009-06-05 16:48:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * ext/celt/gstceltenc.c: - celtenc: correct framesize range - A CELT framesize can be between 64 and 512 samples. - Fix a typo in the bitrate property description. - -2009-05-27 11:33:01 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/Makefile.am: - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinimage.h: - * gst/camerabin/camerabinpreview.c: - * gst/camerabin/camerabinpreview.h: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - * tests/check/elements/camerabin.c: - camerabin: preview image sending optimization - * decouple image capturing from image post-processing and encoding - * post image-captured message after image is captured - * post preview-image message with snapshot of captured image - -2009-05-19 16:58:36 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/camerabinimage.c: - camerabin: don't lose post processing element in first reset - -2009-05-12 12:49:33 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/camerabingeneral.c: - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinvideo.c: - camerabin: add debug including dot graph writing - -2009-05-05 14:19:46 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: unblock if error occurs during capture - -2009-05-04 10:33:18 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabinphotography.c: - camerabin: ignore night mode handling if already in night mode - -2009-05-04 10:32:10 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: stop ongoing capture if changing resolution - -2009-04-23 18:15:43 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/camerabinvideo.c: - camerabin: limit the size of video bin queue leading to view finder - We don't want to show old buffers in view finder. - -2009-04-22 12:29:14 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/Makefile.am: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabinxoverlay.c: - * gst/camerabin/gstcamerabinxoverlay.h: - camerabin: don't proxy gst xoverlay interface - Default view finder sink in camerabin is autovideosink which doesn't - support xoverlay iface. If application decides to use another sink - that supports xoverlay, then it can use the interface directly. - -2009-04-20 17:06:14 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - * gst/camerabin/gstcamerabinphotography.c: - camerabin: allow configuring photography settings when in NULL state - Cache the photography settings if set in NULL state and apply them later - -2009-04-20 17:05:49 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - photography: add functions to set/get all settings with one call - -2009-03-09 18:00:45 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: crop still image capture frame if necessary - If incoming still image capture frame aspect ratio differs from aspect - ratio that application requested, then apply crop to the frame. - -2009-06-05 10:25:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/inspect/plugin-adpcmdec.xml: - * docs/plugins/inspect/plugin-hdvparse.xml: - * docs/plugins/inspect/plugin-id3tag.xml: - docs: add inspect files for new plugins - -2009-06-05 10:16:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - docs: fix build of plugin docs by updating inspect templates - The xml inspect data of the debugutilsbad plugin didn't contain the - data for the fpsdisplaysink element (someone probably ran 'make udpate' - in docs/plugins with the old libgstfpsdisplaysink.so from before the - rename still around). - -2009-06-05 10:34:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/xml/element-fpsdisplaysink-details.xml: - Revert "docs: add doc file fro new plugin" - This reverts commit 039ef3eb072555b7ca38fc351ca386bb680ccccc. - We don't track the stuff in xml/ in git. - -2009-06-05 11:18:31 +0300 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/xml/element-fpsdisplaysink-details.xml: - docs: add doc file fro new plugin - -2009-06-01 16:31:42 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/selector/gstoutputselector.c: - output-selector: serialize setting and actual changing of new active pad - -2009-05-04 12:29:54 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/selector/gstoutputselector.c: - output-selector: unref latest buffer also when resending has been disabled - -2009-04-16 17:32:03 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/selector/gstoutputselector.c: - output-selector: keep ref to buffer for resending only if explicitly requested - -2009-06-04 19:08:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/selector/gstinputselector.c: - inputselector: don't leak pads in iterator - -2009-06-04 16:29:31 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegdemux/gstmpegdesc.c: - mpegdemux: Add a GST_MEMDUMP line in the descriptor parsing - Make it possible to see descriptor contents in the debug output - (GST_DEBUG=mpegtsdesc:9), and remove a stray semi-colon. - -2009-06-04 16:11:16 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Avoid passing the custom GST_FLOW_NEED_MORE_DATA upstream - Don't return GST_FLOW_NEED_MORE_DATA from the chain function at the end - of files. - -2009-06-04 08:56:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/selector/gstinputselector.c: - inputselector: Notify when the tags property of the selector sinkpads changes - First part of bug #584686. - -2009-06-04 08:56:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/elements/shapewipe.c: - shapewipe: Increase timeout of the unit test - -2009-06-03 23:35:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - Bump core/base requirements to released versions - -2009-06-02 11:36:01 +0100 Christian Schaller <christian.schaller@collabora.co.uk> - - * gst-plugins-bad.spec.in: - add two new plugins to spec file - -2009-06-02 11:23:37 +0100 Christian Schaller <christian.schaller@collabora.co.uk> - - * gst/dvdspu/Makefile.am: - dvdspu: add missing header to Makefile.am: gstspu-common.h - -2009-06-02 01:09:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/dirac/Makefile.am: - dirac: use GST_CXXFLAGS instead of GST_CFLAGS for c++ compilers - Fixes compiler message about passing -Wdeclaration-after-statement - to the C++ compiler. - -2009-06-01 15:53:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/aacparse/gstaacparse.c: - aacparse: fix sample rate extraction from codec data - In one case we extracted the sample rate index from the codec data - and saved it as sample rate rather than getting the real sample - rate from the table. Fix that, and also make sure we don't access - non-existant table entries by adding a small helper function that - guards against out-of-bounds access in case of invalid input data. - -2009-06-01 14:02:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/aacparse/gstaacparse.c: - * gst/amrparse/gstamrparse.c: - aacparse, amrparse: remove bogus gst_pad_fixate_caps() calls - -2009-06-01 13:56:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/aacparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.c: - * gst/flacparse/gstbaseparse.c: - baseparse: propagate return value of GstBaseParse::set_sink_caps() - gst_base_parse_sink_setcaps() presumably should fail if the subclass - returns FALSE from its ::set_sink_caps() function. - -2009-06-01 13:47:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/aacparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.c: - * gst/flacparse/gstbaseparse.c: - baseparse: don't try to GST_LOG an already-freed caps string - The proper way to log caps is via GST_PTR_FORMAT anyway. - -2009-06-01 13:05:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/aacparse/gstaacparse.c: - * tests/check/elements/aacparse.c: - aacparse: set channels and rate on output caps, and keep codec_data - Create output caps from input caps, so we maintain any fields we - might get on the input caps, such as codec_data or rate and channels. - Set channels and rate on the output caps if we don't have input caps - or they don't contain such fields. We do this partly because we can, - but also because some muxers need this information. Tagreadbin will - also be happy about this. - -2009-06-01 22:42:08 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/ftypcc.h: - * gst/qtmux/gstqtmuxmap.c: - gppmux: enhance ftyp brand heuristic. Fixes #584360. - -2009-06-01 21:24:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Fix some issues that were exposed by the new unit test - -2009-06-01 21:24:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/check/Makefile.am: - * tests/check/elements/shapewipe.c: - shapewipe: Add unit test for shapewipe - -2009-05-31 21:33:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-amrwb.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-shapewipe.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xdgmime.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * gst/shapewipe/gstshapewipe.c: - shapewipe: Add documentation and integrate into the build system - -2009-05-31 20:24:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/sdp/gstsdpdemux.c: - sdpdemux: include glib.h before checking if G_OS_WIN32 is defined - -2009-05-31 20:23:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * .gitignore: - .gitignore: ignore new shapewipe example binary - -2009-05-31 18:23:50 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/hdvparse/gsthdvparse.c: - hdvparse: Setting rank to NONE so it doesn't get picked up by playbin2. - -2009-05-31 18:23:08 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/hdvparse/gsthdvparse.c: - hdvparse: Emit application message with the parsed information. - -2009-05-31 14:15:11 +0200 Edward Hervey <bilboed@bilboed.com> - - * configure.ac: - * gst/hdvparse/Makefile.am: - * gst/hdvparse/gsthdvparse.c: - * gst/hdvparse/gsthdvparse.h: - hdvparse: New element for parsing private/hdv-a1 streams. - -2009-05-29 21:07:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - shapewipe: Adjust border to still have everything transparent at 1.0 and the other way around - -2009-05-29 16:55:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - * tests/examples/shapewipe/shapewipe-example.c: - shapewipe: Divide the border value by two, otherwise we use a twice a wide border - -2009-05-29 16:51:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/shapewipe/gstshapewipe.c: - * gst/shapewipe/gstshapewipe.h: - * tests/examples/shapewipe/shapewipe-example.c: - shapewipe: Add border property to allow smooth borders - ...and use a border of 0.01 in the example application. - -2009-05-29 15:44:51 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Fix bogus uninitialised variable access - Typo in the previous commit - -2009-05-29 15:01:42 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Use the ISO 639 language code descriptor to send tags. - If there is an ISO 639 language descriptor for a stream, send a language - code tag so that players can show a meaningful language for the audio and - subtitle streams. - -2009-05-29 16:00:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/examples/shapewipe/Makefile.am: - shapewipe: Fix Makefile of the example application - -2009-05-29 15:32:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/shapewipe/Makefile.am: - * gst/shapewipe/gstshapewipe.c: - * gst/shapewipe/gstshapewipe.h: - * tests/examples/Makefile.am: - * tests/examples/shapewipe/Makefile.am: - * tests/examples/shapewipe/shapewipe-example.c: - shapewipe: Add a simple shapewipe transition filter & example application - -2009-05-28 17:37:44 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmanager/gstrtpbin.c: - rtpbin: Transform the right session sdes message - Fixes #584165 - -2009-05-28 17:33:10 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmanager/rtpsource.c: - Add ssrc to application/x-rtp-source-sdes structure - -2009-05-28 23:12:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/rawparse/gstaudioparse.c: - audioparse: add support for A-Law and µ-Law - -2009-05-28 23:08:17 +0100 Tristan Matthews <le.businessman@gmail.com> - - * gst/dvdspu/gstspu-pgs.c: - gstspu: Fix compiler warnings on OS/X - Fix some warnings for format string args and uninitialized vars on OS/X - Fixes: #584164 - Signed-off-by: Jan Schmidt <thaytan@noraisin.net> - -2009-05-28 13:56:10 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/fourcc.h: - * gst/qtmux/gstqtmux.c: - qtmux: use different stsd atom type for H263 for ISO and QT variants - Fixes #584114. - -2009-05-28 13:07:37 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * configure.ac: - soundtouch: fix detection of libsoundtouch >= 1.4 - -2009-05-28 13:09:24 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/amrparse/gstamrparse.c: - * gst/amrparse/gstamrparse.h: - amrparse: consider header size in byte <-> time conversions - -2009-05-26 19:43:53 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/aacparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.c: - baseparse: fix debug category - -2009-05-28 10:38:50 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/selector/gstoutputselector.h: - selector: remove not needed instance var (previous commit). - -2009-05-11 16:12:54 +0300 Stefan Kost <ensonic@users.sf.net> - - * ext/jack/gstjackaudioclient.c: - * ext/jack/gstjackaudiosink.c: - jack: when stopping playback, do one more cycle to flush the port. Fixes #582167 - The gst_jack_audio_client_set_active() flags the port as deactivating and uses - a GCond to wait until the jack_process_cb() has run once more and cleared the - flag. This way the client zero's the buffer. This happens if one manyally go - to PAUSED and then to READY, while leting the mainloop run inbetween. - -2009-05-28 10:12:58 +0300 Stefan Kost <ensonic@users.sf.net> - - * gst/selector/gstoutputselector.c: - * gst/selector/gstoutputselector.h: - outputselector: implement pad_alloc on active pad. - -2009-05-27 22:54:51 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/gstmpegdemux.h: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/rsnaudiomunge.c: - resindvd: Create all the audio streams of all formats - Enable creation of the demuxer pads for all audio streams, even types we - don't yet support. This means that unsupported types (LPCM, DTS) are output, - but not linked to anything yet. If only unsupported streams are available, - the user hears silence instead of having the pipeline not pre-roll correctly. - This is a prerequisite for hooking up the automatic decoder switching. - -2009-05-27 11:03:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmanager/rtpsource.c: - rtpsouce: the network address is in network order - Bring the network address in netowkr byte order to the host order. - -2009-05-27 00:51:45 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/gstspu-pgs.c: - gstspu: Convert g_warnings to GST_ERROR, and fix format specifiers - Use G_GSSIZE_FORMAT for printing pointer differences, which should work on - both 32-bit and 64-bit systems. - Use GST_ERROR instead of g_warning for printing messages about unknown - packet contents. - -2009-05-27 00:47:05 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/gstspu-vobsub-render.c: - gstspu: Fix a nasty regression, with DVDs randomly crashing - Use the local wrapper function when clearing the compositing buffers to - ensure the correct portion is being cleared. - -2009-05-26 19:38:54 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/gstmpegdemux.c: - resindvd: LPCM streams are only from 0xa0 to 0xaf. - Fix the same bug as the previous commit, but in resindvd's copy of - mpegdemux. - -2009-05-26 18:47:32 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Only treat streams from 0xa0 to 0xaf as LPCM, not 0xa0..0xbf - Don't treat some streams (Private Stream 2) as LPCM when they're not. Fixes - playback of files that have private streams in them now that the PES filter - emits such packets. - -2009-05-26 18:43:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst/dvdspu/gstspu-pgs.c: - dvdspu: fix printf formats to avoid compiler warnings - -2009-05-26 17:19:35 +0100 Jan Schmidt <thaytan@noraisin.net> - - * common: - Automatic update of common submodule - From 6ab11d1 to c572721 - -2009-05-23 23:19:05 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/Makefile.am: - * gst/dvdspu/gstdvdspu-render.c: - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - * gst/dvdspu/gstspu-common.h: - * gst/dvdspu/gstspu-pgs.c: - * gst/dvdspu/gstspu-pgs.h: - * gst/dvdspu/gstspu-vobsub-render.c: - * gst/dvdspu/gstspu-vobsub.c: - * gst/dvdspu/gstspu-vobsub.h: - gstspu: Implement PGS rendering and alpha blending - Refactor the DVD subpicture compositing, switching it to 8-bit alpha - calculations. Reuse some of the resulting code to implement PGS - subpicture blending. - Implement parsing and collecting of composition objects properly, but - assuming a single active window and colour palette for now. I need more - PGS samples. - -2009-05-22 11:13:59 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/Makefile.am: - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstspu-vobsub.c: - * gst/dvdspu/gstspu-vobsub.h: - dvdspu: Move a bunch of vobsub specific logic to a separate file. - Start separating out the vobsub logic in preparation for creating - separate renderer objects for each subpicture format. - -2009-05-22 11:12:52 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/gstspu-pgs.c: - dvdspu: Add copyright header and includes to the PGS handler - -2009-05-22 10:15:44 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/gstspu-pgs.c: - dvdspu: Make the PGS dumping less verbose - -2009-05-21 23:45:43 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: Collect entire PGS packets and queue as events - Collect fragmented PGS packets and submit as complete events for - processing at the correct moment. - -2009-05-20 08:55:40 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/Makefile.am: - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - * gst/dvdspu/gstspu-pgs.c: - * gst/dvdspu/gstspu-pgs.h: - dvdspu: Add simple PGS handler that dumps the packet info - Add setcaps logic on the subpicture sink pad for configuring - which subpicture format is arriving. - Add the first piece of PGS subpicture handling by dumping the stream - contents out to the terminal as the packets arrive. - Add some more debug. - Don't calculate the running time for our subpicture packets twice, - once is enough. - -2009-05-21 15:22:58 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/dvdspu/gstdvdspu.c: - dvdspu: Add a simple default colour table. - When we're not provided with a palette in advance, draw with a grey - colour or two, instead of YUV green. - -2009-05-21 11:13:54 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegdemux: Add sparse stream filling. - First stab at sending new-segment events to effect sparse stream - updates. + * po/zh_TW.po: + gst-plugins-bad: update translations + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3711> -2009-05-21 00:41:47 +0100 Jan Schmidt <thaytan@noraisin.net> +2023-01-11 14:53:39 +0000 Tim-Philipp Müller <tim@centricular.com> - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegdemux: Add support for outputting sub-picture streams found in files. - Output subpicture streams when they are found on the private stream ID. - Don't strip off the first byte of such packets when pushing. + * scripts/dist-translations.py: + * scripts/meson.build: + Fix translation pot files when creating dist tarballs + Add version as per Translation Project requirements and + also add a .pot file without the ABI suffix. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3711> -2009-05-20 08:50:37 +0100 Jan Schmidt <thaytan@noraisin.net> +2023-01-11 12:17:13 +0200 Sebastian Dröge <sebastian@centricular.com> - * gst/mpegdemux/gstmpegdefs.h: - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - * gst/mpegdemux/gstpesfilter.h: - mpegtsdemux: Add mapping for DVD and Bluray subpicture streams. - Add output subpicture pads for DVD (video/x-dvd-subpicture) and Bluray PGS - (subpicture/x-pgs) streams. Remove an unused variable from - the PES filter. + * tools/gst-transcoder.c: + tools: Use `gst_macos_main()` on macOS + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1673 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3709> -2009-05-25 00:25:07 +0100 Jan Schmidt <thaytan@noraisin.net> +2023-01-11 03:23:57 +0900 Seungha Yang <seungha@centricular.com> - * ext/resindvd/gstmpegdemux.c: - resindvd: Fix subpicture timing in some cases - Make sure we send events to all pads. Unmark the notlinked flag on - freshly selected pads to ensure they get data. + * meson.build: + meson: gst-plugins-bad: Disable spammy MSVC warning + warning C5051: attribute 'noinline' requires at least '/std:c++20'; + ignored + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3705> -2009-05-22 14:02:38 +0100 Jan Schmidt <thaytan@noraisin.net> +2023-01-09 12:39:55 +0200 Sebastian Dröge <sebastian@centricular.com> - * ext/resindvd/gstmpegdemux.c: - resindvd: Try a different approach to segment filling. - Restore the old segment update behaviour, and instead extend the - close segment stop time if the SCR (last_stop) overruns the calculated - stop position. + * gst/mxf/mxfmetadata.c: + mxfmux: Add all local tags to the primer + No matter if they're allocated via GSlice or malloc(). The allocator is + completely irrelevant, all local tags need to be in the primer so they + can be handled. + This didn't have any effect in practice because all local tags that + appear in the muxer are allocated via GSlice. Only from the demuxer they + might be allocated via malloc(). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3699> -2009-05-21 11:10:13 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-12-15 18:42:26 +0000 Philippe Normand <philn@igalia.com> - * ext/resindvd/gstmpegdemux.c: - resindvd: Minor change to inline a function in the demuxer + * docs/plugins/gst_plugins_cache.json: + * ext/aom/gstav1enc.c: + * ext/aom/gstav1enc.h: + av1enc: Add property for controlling max distance between 2 keyframes + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2743> -2009-05-20 19:31:24 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-07-11 11:03:16 +0530 Yatin Mann <yatinmaan1@gmail.com> - * tests/check/Makefile.am: - states: Ignore the camerabin for the states test - It accesses the video device, which isn't generally desirable for the - state test. + * docs/plugins/gst_plugins_cache.json: + * ext/aom/gstav1enc.c: + * ext/aom/gstav1enc.h: + aom: av1enc: Expose more properties + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2743> -2009-05-22 13:07:38 +0100 Jan Schmidt <thaytan@noraisin.net> +2023-01-08 23:46:40 +0530 yatinmaan <yatinmaan1@gmail.com> - * gst/dvdspu/gstdvdspu.c: - dvdspu: Don't accidentally lose the colour palette when flushing the SPU - Fixes racy startup on DVDs where it sometimes gets entirely the wrong set - of colours in the menus and subtitles. - -2009-05-26 15:40:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmanager/rtpsource.c: - rtpsource: byteswap the port from GstNetAddress - Since the port in GstNetAddress is in network order we might need to byteswap it - before adding it to the source statistics. + * ext/aom/gstav1enc.h: + aom: av1enc: Remove redundant enum variants from header + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2743> -2009-05-11 19:30:34 +0200 Edward Hervey <bilboed@bilboed.com> +2022-07-11 09:27:41 +0530 Yatin Mann <yatinmaan1@gmail.com> - * gst/mpegdemux/gstpesfilter.c: - gstpesfilter: Directly use gst_adapter_take_buffer(). + * ext/aom/gstav1enc.c: + * ext/aom/gstav1enc.h: + aom: av1enc: Ensure that input pts is strictly increasing + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2743> -2009-05-25 16:27:34 +0200 Edward Hervey <bilboed@bilboed.com> +2022-07-04 19:55:59 +0530 Yatin Mann <yatinmaan1@gmail.com> - * gst/mpegdemux/gstpesfilter.c: - gstpesfilter: Don't peek the adapter if we don't have enough data. + * ext/aom/gstav1enc.c: + aom: av1enc: Fix pts unit + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2743> -2009-05-25 16:25:42 +0200 Edward Hervey <bilboed@bilboed.com> +2023-01-02 18:34:59 +0900 ekwange <ekwange@gmail.com> - * gst/mpegdemux/gstpesfilter.c: - gstpesfilter: Don't skip private streams PES but push them out. - The one thing we *DO* need to do for those streams is to skip all - the PTS/DTS/Scrambling/DSM/extension/... handling. + * ext/directfb/dfbvideosink.c: + * ext/directfb/dfbvideosink.h: + dfbvideosink: Fix compile error + Fix some compile errors + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3670> -2009-05-25 15:21:52 +0200 Edward Hervey <bilboed@bilboed.com> +2023-01-01 19:19:03 -0500 Olivier Crête <olivier.crete@collabora.com> - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Ignore NULL packets as early as possible. - This avoids: - * creating a MpegTSStream structure for nothing - * processing packet data for nothing + * gst-libs/gst/webrtc/nice/nice.c: + webrtc nice: Let libnice handle STUN/TURN DNS resolution + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3676> -2009-05-25 15:21:12 +0200 Edward Hervey <bilboed@bilboed.com> +2023-01-06 15:07:42 -0500 Olivier Crête <olivier.crete@collabora.com> - * gst/mpegdemux/gstmpegdefs.h: - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Add mapping for HDV private streams + * gst-libs/gst/webrtc/nice/meson.build: + * gst-libs/gst/webrtc/nice/nice.c: + webrtc: Change requirement to libnice 0.1.20 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3676> -2009-05-25 17:24:32 +0200 Mathias Hasselmann <mathias.hasselmann at gmx.de> +2023-01-04 21:37:55 +0100 Mathieu Duponchelle <mathieu@centricular.com> - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - neonhttp: add property to support SS cerificates - Add a property to support self-signed certificates in neonhttpsrc. This property - is FALSE by default. - Fixes #511097 + * docs/meson.build: + docs: explicitly declare gir build dependencies + As the path to the gir file is passed to hotdoc.generate_doc() and + not the build target itself, meson doesn't know about the dependency. + In turn, as the CI doesn't build everything before building the + documentation target, some gir files might not exist, for instance + in the case of gst-rtsp-server, causing the output documentation to + be empty. + The error occurred silently because hotdoc accepts wildcards for + *-sources arguments, thus it won't warn about a missing gir file as + it is legitimate for glob matching to resolve to nothing. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3686> -2009-05-25 13:46:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2023-01-04 18:55:08 -0300 Rodrigo Bernardes <rodrigo.bernardes@kantaribopemedia.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: remove ptdemux ghostpads + * sys/dvb/parsechannels.c: + dvbbasebin: don't rely on g_key_file_get_(integer|uint64) return + instead check if an error was returned, and fail if any + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3688> -2009-05-25 13:33:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2023-01-03 15:01:37 -0500 Olivier Crête <olivier.crete@collabora.com> - * tests/check/elements/rtpbin.c: - tests: add receive rtpbin unit test + * ext/srt/gstsrtobject.c: + srt: Avoid crash on unknown option + Use the correct field that is null instead of the struct value which + never is. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3672> -2009-05-25 11:18:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-30 10:30:38 -0500 Xavier Claessens <xavier.claessens@collabora.com> - * ext/x264/gstx264enc.c: - * ext/x264/gstx264enc.h: - x264enc: add multipass-cache-file property - Fixes #583627 + * ext/qroverlay/gstbaseqroverlay.c: + qroverlay: Add qrcode-case-sensitive property + This allows to encode case sensitive strings, like wifi SSID/password. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3662> -2009-05-23 13:11:28 +0100 Christian Schaller <christian.schaller@collabora.co.uk> +2023-01-03 17:28:18 +0800 He Junyan <junyan.he@intel.com> - * gst-plugins-bad.spec.in: - Update spec file + * gst-libs/gst/codecs/gsth265decoder.c: + h265decoder: Fix a memory leak because of slice header. + The gst_h265_slice_hdr_free() should free the slice header just + parsed, not the priv->current_slice. Or, the memory leak will + happen because we do not free the slices in priv->nalu list. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3671> -2009-05-22 16:56:52 -0700 Michael Smith <msmith@songbirdnest.com> +2022-12-30 17:10:12 +0000 مهدي شينون (Mehdi Chinoune) <mehdi.chinoune@hotmail.com> - * common: - * configure.ac: - * gst/adpcmdec/Makefile.am: - * gst/adpcmdec/adpcmdec.c: - adpcmdec: Add new plugin for ms-adpcm decoding. + * ext/opencv/meson.build: + meson: Accept latest version of opencv 4.x + We've been bumping along the maximum opencv 4.x version for years, + just accept all opencv versions till someone reports breakage. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1680 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3664> + +2022-12-26 20:53:53 +0900 Seungha Yang <seungha@centricular.com> + + * sys/va/gstvajpegdec.c: + vajpegdec: Set maybe-leaked flag on template caps + The fixup function could return new caps object + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3642> -2009-05-20 16:46:49 +0200 Edward Hervey <bilboed@bilboed.com> +2022-12-22 21:29:39 +0000 Philippe Normand <philn@igalia.com> - * gst/mpegvideoparse/mpegpacketiser.c: - * gst/mpegvideoparse/mpegpacketiser.h: - * gst/mpegvideoparse/mpegvideoparse.c: - mpegvideoparse: Detect interlaced content and set it on outgoing caps. - I also added the parsing of all the other bits in the sequence extension - header in case we need it later. + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/gstwebrtcstats.c: + * tests/check/elements/webrtcbin.c: + webrtcbin: Support for setting kind attribute on RTCRtpStreamStats + The attribute maps the `kind` property of the associated transceiver. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3630> -2009-05-22 16:41:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-23 01:00:57 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: add to new signal to remove SSRC pads + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.h: + d3d11memory: Fix typo in vfunc name + s/set_actvie/set_active/g + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3627> -2009-05-22 16:35:20 +0200 Ali Sabil <ali.sabil at gmail.com> +2022-12-19 19:53:28 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpmanager/gstrtpbin-marshal.list: - * gst/rtpmanager/gstrtpssrcdemux.c: - * gst/rtpmanager/gstrtpssrcdemux.h: - ssrcdemux: emit signal when pads are removed - Add action signal to clear an SSRC in the ssrc demuxer. - Add signal to notify of removed ssrc. - See #554839 + * sys/nvcodec/gstnvenc.c: + * sys/nvcodec/gstnvenc.h: + * sys/nvcodec/gstnvencoder.cpp: + nvcudaenc: Don't use default CUDA stream + Set non-default CUDA stream via NvEncSetIOCudaStreams() if possible, + so that NVENC's internal kernel function can run on the given CUDA + stream instead of default CUDA stream + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3615> + +2022-12-14 10:35:53 +0100 Evgeny Pavlov <lucenticus@gmail.com> + + * sys/amfcodec/gstamfav1enc.cpp: + * sys/amfcodec/gstamfav1enc.h: + * sys/amfcodec/include/components/VideoEncoderAV1.h: + * sys/amfcodec/meson.build: + * sys/amfcodec/plugin.cpp: + amfcodec: add support of AMF AV1 encoder + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3569> -2009-05-22 15:45:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-22 00:22:46 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: use our ghostpads instead of its target - Since we keep a reference to our ghostpads, we can use them to track sessions. - This avoid us having to mess with the target of the ghostpad. + * sys/nvcodec/gstcudabasetransform.c: + cudabasetransform: Update CUDA stream on context update + CUDA stream must be associated with updated CUDA context + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3618> -2009-05-22 15:37:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-21 14:36:31 +0800 He Junyan <junyan.he@intel.com> - * tests/check/elements/rtpbin.c: - tests: more rtpbin checks + * sys/va/gstvafilter.c: + va: Delay the VAProcPipelineCaps query after context created. + The VAAPI vaQueryVideoProcPipelineCaps() requires the context as the + parameter. So far, we always pass VA_INVALID_ID and it can succeed. + But the API does not say that and in theory, a valid context is required. + Now the new platform really needs a valid context and so we have to + delay that query until the context is created. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3613> -2009-05-22 15:36:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-21 00:20:17 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: don't warn when getting request pads twice - Allow getting the request pads multiple times, just return the previously - created pads. + * sys/nvcodec/gstnvdecoder.c: + nvdecoder: Use own CUDA stream in GL output path + Use the same CUDA stream passed to CuvidMapVideoFrame() + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3611> + +2022-12-13 08:58:43 -0500 Xavier Claessens <xavier.claessens@collabora.com> + + * meson.build: + Fix API visibility macros + This copies the logic from GLib discussed there: + https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2936 + Beside being simpler, it also fix all public symbols being annotated + with dllexport when doing a static build, as discovered there: + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3540#note_1678335 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3567> -2009-05-22 13:47:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-19 18:41:46 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpmanager/rtpsource.c: - rtpsource: add RTP and RTCP source address - Add the RTP and RTCP sender addresses in the stats structure. + * sys/nvcodec/gstnvdec.c: + * sys/nvcodec/gstnvdecoder.c: + nvdec: Don't use default CUDA stream + NVDEC launches CUDA kernel function (ConvertNV12BLtoNV12 or so) + when CuvidMapVideoFrame() is called. Which seems to be + NVDEC's internal post-processing kernel function, maybe + to convert tiled YUV to linear YUV format or something similar. + A problem if we don't pass CUDA stream to the CuvidMapVideoFrame() + call is that the NVDEC's internel kernel function will use default CUDA stream. + Then lots of the other CUDA API calls will be blocked/serialized. + To avoid the unnecessary blocking, we should pass our own + CUDA stream object to the CuvidMapVideoFrame() call + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3605> -2009-05-22 13:45:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-16 15:03:12 +0100 Edward Hervey <edward@centricular.com> - * gst/rtpmanager/gstrtpsession.c: - rtpsession: reuse source code for SDES - Reuse the RTPSource object property instead of duplicating code. + * gst/mpegtsdemux/mpegtsbase.c: + mpegts: Always clear packetizer on DISCONT push mode + If a discontinuity is detected in push mode, we need to clear the cached section + observations since they might have potentially changed. + This was only done properly when operating with TIME segments (dvb, udp, + adaptive demuxers, ...) but not with BYTE segments (such as with custom app/fd + sources). + We still don't want to flush out the PCR observations, since this might be + needed for seeking in push-based BYTE sources. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1650 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3584> -2009-05-22 13:44:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-17 20:04:01 +0900 Seungha Yang <seungha@centricular.com> - * tests/check/elements/rtpbin.c: - tests: add more rtpbin tests + * sys/d3d11/gstd3d11window_win32.cpp: + d3d11videosink: Fixing focus lost on desktop layout change + Watch all message on the window thread, instead of internal window only. + Otherwise, some global window messages, such as desktop layout change, + wouldn't be handled by our window. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3593> -2009-05-22 12:23:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-17 01:01:00 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/rtpbin.c: - tests: add rtpbin unit test - Add the beginnings of an rtpbin unit test - Add some more stuff to .gitignore + * sys/applemedia/avfvideosrc.m: + avfvideosrc: Report latency when doing screen capture + There is no `device` when doing screen capture, but there is always an + `input`, so use that to decide when we can reply to a latency query. + Without this, the latency query just fails. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3589> -2009-05-22 12:20:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-16 18:15:04 +0100 Victor Manuel Jaquez Leal <vjaquez@igalia.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: set target state on new elements - Set the state on newly added elements to the state of the parent. - Add some debug info and do some cleanups + * sys/va/gstvaav1dec.c: + vaav1dec: Remove double caps unref. + There was a duplicated caps unref raising a warning. + Also it reorgs the sorrounding code for simplicity. + Fixes: #1196 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3587> -2009-05-22 11:59:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-16 02:52:08 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: unref requests pads after releasing + * sys/d3d11/gstd3d11videosink.cpp: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window.h: + * sys/d3d11/gstd3d11window_win32.cpp: + d3d11videosink: Move potentially time-consuming operations to ::prepare() + Move following tasks to ::prepare() from ::show_frame() + * CPU -> GPU upload + * GstD3D11Window object setup, including input caps change handling + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3574> -2009-05-21 16:00:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-16 21:42:50 +0900 Seungha Yang <seungha@centricular.com> - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: fix memleaks and refcounts - Use correct constants for PID_type so that we clear the right filter. - provide_clock must return a ref to a clock. + * sys/d3d11/gstd3d11window_win32.cpp: + d3d11videosink: Call ShowWindow() from window thread + ... when rendering on external HWND. ShowWindow() will cause + synchronous message passing to window thread and then can be blocked. + At the same time, window thread can wait for GStreamer thread. + Instead of the synchronous call, queue the task to window message + and performs from the window thread. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3583> -2009-05-22 09:55:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> +2022-12-15 01:15:10 +0900 Seungha Yang <seungha@centricular.com> - * autogen.sh: - * configure.ac: - autotools: move -Wno-portability for automake to configure.ac + * sys/d3d11/gstd3d11videosink.cpp: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window.h: + * sys/d3d11/gstd3d11window_dummy.cpp: + * sys/d3d11/gstd3d11window_win32.cpp: + d3d11videosink: Fix deadlock when parent window is busy + Deadlock sequence: + * From a streaming thread, d3d11videosink sends synchronous message + to the parent window, so that internal (child) window can be + constructed on the parent window's thread + * App thread (parent window thread) is waiting for pipeline's + state change (to GST_STATE_NULL) but streaming thread is + blocked and waiting for app thread + To avoid the deadlock, GstD3D11WindowWin32 should send message + to the parent window asynchronously. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3570> -2009-05-22 09:54:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> +2022-12-13 12:23:56 +0100 Thibault Saunier <tsaunier@igalia.com> - * gst/id3tag/gstid3tag.c: - * gst/id3tag/gstid3tag.h: - * gst/id3tag/id3tag.c: - id3tag: canonicalise function names + * ext/wpe/gstwpevideosrc.cpp: + base:navigation: Cleanup navigation key modifiers enum + We were exposing the 'ALT' modifier as if we were guaranteeing its + accuracy but truth is we were only exposing configuration dependent + values. + Make the API simpler for now, the same way as Gtk3 was exposing it, and + when we have time to guarantee more values by making them take backends + configuration into account, we will expose those values in a accurate + way. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1402 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3565> -2009-05-22 09:51:29 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> +2022-10-18 12:17:04 +1100 Matthew Waters <matthew@centricular.com> - * gst/id3tag/gstid3tag.c: - * gst/id3tag/gstid3tag.h: - * gst/id3tag/gsttagmux.c: - id3tag: change GType to GstId3Tag so it doesn't conflict with the id3tag plugin in -ugly + * docs/plugins/gst_plugins_cache.json: + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/gstwebrtcbin.h: + * ext/webrtc/utils.c: + * ext/webrtc/utils.h: + * tests/check/elements/webrtcbin.c: + webrtc: implement support for msid values + Local msid values are taken from sink pad property, or fallback to the + previously used cname. + The remote msid values are exposed on the relevant src pads. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3106> -2009-05-22 01:29:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> +2022-12-13 04:31:24 +0900 Seungha Yang <seungha@centricular.com> - * win32/common/config.h: - win32: update config.h + * gst-libs/gst/codecparsers/gsth264parser.h: + h264parser: Update doc for GST_H264_FRMAE_PACKING_TOP_BOTTOM + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1318> -2009-05-22 01:27:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> +2021-11-07 11:18:15 +1100 Brad Hards <bradh@frogmouth.net> - * gst/id3tag/gsttagmux.c: - id3tag: register GType of the base class with a less generic name - .. so we can easily move the base class into -base later without - causing GType name conflicts. + * gst-libs/gst/codecparsers/gsth264parser.h: + * sys/msdk/gstmsdkh264enc.c: + h264parser: typo fix in enum value + Old value is marked deprecated, new enum with same entry is added. Should be binary compatible. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1318> -2009-05-22 01:04:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> +2022-10-21 22:46:16 -0500 A. Wilcox <AWilcox@Wilcox-Tech.com> - * common: - * m4/gst-fionread.m4: - m4: fix 'suspicious cache value id' warnings in gst-fionread.m4 - And update common to pull in a related fix from there. + * gst-libs/gst/mpegts/gstmpegtsdescriptor.c: + * tests/check/libs/mpegts.c: + mpegts: Handle when iconv doesn't support ISO 6937 + Systems like musl libc don't support ISO 6937 in iconv. This ensures + that the MPEG-TS plugin can cope with that. There is existing support + in the plugin for other methods, so it seems to have been the original + intent anyway. + Fixes: #1314 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3245> -2009-05-22 01:43:50 +0200 Olivier Crête <olivier.crete@collabora.co.uk> +2022-12-11 10:12:25 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: Implement releasing the streams - See #561752 + * gst-libs/gst/va/gstvaallocator.c: + vaallocator: Fix gi annotations. + Remove spurious types and skip functions that returns VASurfaceID + which isn't exposed to introspection. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3557> -2009-05-22 01:16:11 +0200 Olivier Crête <olivier.crete@collabora.co.uk> +2022-11-22 12:32:52 +0100 Stéphane Cerveau <scerveau@igalia.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: Keep jb signals handler - Keep the signal handlers so they can be disconnected at release time - See #561752 + * ext/zxing/gstzxing.cpp: + * ext/zxing/meson.build: + zxing: update to 1.4.0 tag + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3450> -2009-05-22 01:12:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-06 11:30:47 +0100 Edward Hervey <edward@centricular.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: use the right lock for the sessions - Use the right lock when iterating the sessions. + * gst/mpegtsdemux/mpegtspacketizer.c: + mpegts: Check continuity counter on section streams + This wasn't really done, and is needed in order to detect potential section + changes for sections that have got identical information (such as when switching + between streams that have the same PAT/PMT pid and subtable information). + Other checks exist in tsbase to detect if the "new" PAT/PMT really is an update or not. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3530> -2009-05-22 01:03:55 +0200 Olivier Crête <olivier.crete@collabora.co.uk> +2022-12-08 06:05:25 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: Free session if request pads are released - Free the session when all the request pads are released. - Don't mess with the session list in free_session as it is called from a foreach - on that list. - Set the state of the upstream element to NULL first. - See #561752 + * gst-libs/gst/cuda/gstcudanvrtc.c: + cuda: Fix runtime compiler library loading on Windows + The cuda is a part of GPU driver but runtime compiler is a part of + cuda toolkit, which means the version number can be different. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3545> + +2022-12-08 05:58:48 +0900 Seungha Yang <seungha@centricular.com> + + * gst-libs/gst/cuda/gstcuda-private.h: + * gst-libs/gst/cuda/gstcudautils.c: + * gst-libs/gst/cuda/gstcudautils.h: + * sys/nvcodec/gstcudamemorycopy.c: + cuda: Hide memory copy util function + The method was intended to be used by only cudaupload/download elements + and not ready to be a part of public API + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3545> -2009-05-22 00:51:53 +0200 Olivier Crête <olivier.crete@collabora.co.uk> +2022-12-08 04:32:47 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: Implement relasing of the rtp recv pad + * sys/winks/gstksvideosrc.c: + ksvideosrc: Warn for deprecated plugin use + This plugin should not be used any more + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3544> -2009-05-22 00:44:51 +0200 Olivier Crête <olivier.crete@collabora.co.uk> +2022-12-08 04:25:55 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: Implement releasing of rtp send pads + * sys/winscreencap/gstdx9screencapsrc.c: + * sys/winscreencap/gstgdiscreencapsrc.c: + winscreencap: Warn for deprecated plugin use + This plugin should not be used any more + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3544> -2009-05-22 00:34:36 +0200 Olivier Crête <olivier.crete@collabora.co.uk> +2022-11-27 00:26:22 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: Implement release of the recv rtcp pad - See #561752 + * gst/proxy/gstproxysink.c: + proxysink: Post EOS message on EOS event + proxysink is actual sink (GST_ELEMENT_FLAG_SINK flag has configured) + so it should post EOS message. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3472> -2009-05-22 00:16:19 +0200 Olivier Crête <olivier.crete@collabora.co.uk> +2022-12-07 12:28:55 -0300 Thibault Saunier <tsaunier@igalia.com> - * gst/rtpmanager/gstrtpbin.c: - rtpbin: Implement releasing of rtcp src pad - See #561752 + * gst/videoparsers/gsth264parse.c: + h264parse: Avoid setting wrong colorimetry info if the stream doesn't contain it + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3543> -2009-05-18 23:38:59 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-12-01 19:35:07 +0200 Marek Olejnik <molejnik@fluendo.com> - * ext/dts/gstdtsdec.c: - * ext/dts/gstdtsdec.h: - dtsdec: Reconcile element code with a52dec changes - Re-work the dtsdec element code to unify it with changes made it a52dec, - including support for reverse playback and dynamic channel negotiation - on the source pad. + * gst-libs/gst/codecs/gsth265decoder.c: + h265decoder: Do not abort when failed to prepare ref pic set + Currently the element calls abort when failed to prepare reference + picture set. This can happent when the input stream is somehow + corrupted, like a rtsp strem with lost packets. Now it will only + return with GST_FLOW_ERROR instead of terminating whole process. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3505> -2009-05-21 21:35:32 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-12-07 10:21:52 +0200 Sebastian Dröge <sebastian@centricular.com> - * win32/common/config.h: - win32: Update the win32 config.h + * gst/dvbsubenc/gstdvbsubenc.c: + dvbsubenc: Forward GAP events as-is if we wouldn't produce an end packet and are not in the middle of an existing subtitle + An end packet is only produced once for the last subtitle, so multiple + GAP events between subtitles would result only in a single end packet + and nothing else otherwise. This would potentially starve downstream + then, so instead forward the GAP events in that case. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3534> -2009-05-18 23:21:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-12-05 19:30:43 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - * gst/sdp/gstsdpdemux.c: - * gst/sdp/gstsdpdemux.h: - sdpdemux: rework RTCP sending and RTP receiving - When we are dealing with multiast, create the udp src and sink elements pointing - to the multicast addresses. When we are doing unicast, receive data on the local - ports and don't send RTCP because we don't know where we have to send it. - Fixes #583188 - -2009-05-21 13:15:46 -0700 Michael Smith <msmith@songbirdnest.com> - - * configure.ac: - * gst/id3tag/Makefile.am: - * gst/id3tag/gstid3tag.c: - * gst/id3tag/gstid3tag.h: - * gst/id3tag/gsttagmux.c: - * gst/id3tag/gsttagmux.h: - * gst/id3tag/id3tag.c: - * gst/id3tag/id3tag.h: - id3tag: Add new id3 tagging plugin, supports v1, v2.3, and v2.4. - By default, does v1 and v2.3, but there are properties to select. - Will hopefully replace id3mux, id3v2mux, in the not-too-distant future. + * sys/directshow/dshowvideosink.cpp: + directshow: Fix build error with glib 2.75 and newer + Starting with glib 2.75, `NULL` is `nullptr`, which cannot be + implicitly coerced to `0`, unlike `NULL`. So explicitly pass `0`. + ``` + 3206/4524 Compiling C++ object subprojects/gst-plugins-bad/sys/directshow/gstdirectshow.dll.p/dshowvideosink.cpp.obj + FAILED: subprojects/gst-plugins-bad/sys/directshow/gstdirectshow.dll.p/dshowvideosink.cpp.obj + "cl" "-Isubprojects\gst-plugins-bad\sys\directshow\gstdirectshow.dll.p" "-Isubprojects\gst-plugins-bad\sys\directshow" "-I..\subprojects\gst-plugins-bad\sys\directshow" "-Isubprojects\gst-plugins-bad" "-I..\subprojects\gst-plugins-bad" "-Isubprojects\gst-plugins-base\gst-libs" "-I..\subprojects\gst-plugins-base\gst-libs" "-Isubprojects\gstreamer\libs" "-I..\subprojects\gstreamer\libs" "-Isubprojects\gstreamer" "-I..\subprojects\gstreamer" "-Isubprojects\orc" "-I..\subprojects\orc" "-I..\subprojects\gst-plugins-bad\sys\directshow\strmbase\baseclasses" "-Isubprojects\gst-plugins-base\gst-libs\gst\video" "-Isubprojects\gstreamer\gst" "-Isubprojects\gst-plugins-base\gst-libs\gst\audio" "-Isubprojects\gst-plugins-base\gst-libs\gst\tag" "-IC:/gst-install/include/glib-2.0" "-IC:/gst-install/lib/glib-2.0/include" "-IC:/gst-install/include" "/MD" "/nologo" "/showIncludes" "/utf-8" "/W2" "/EHsc" "/O2" "/Zi" "/wd4018" "/wd4146" "/wd4244" "/wd4305" "/utf-8" "/we4002" "/we4003" "/we4013" "/we4020" "/we4027" "/we4029" "/we4033" "/we4045" "/we4047" "/we4053" "/we4062" "/we4098" "/we4101" "/we4189" "/utf-8" "-D_MBCS" "/wd4189" "/wd4456" "/wd4701" "/wd4703" "/wd4706" "/wd4996" "-DHAVE_CONFIG_H" "/Fdsubprojects\gst-plugins-bad\sys\directshow\gstdirectshow.dll.p\dshowvideosink.cpp.pdb" /Fosubprojects/gst-plugins-bad/sys/directshow/gstdirectshow.dll.p/dshowvideosink.cpp.obj "/c" ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp + ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(62): warning C5051: attribute 'noinline' requires at least '/std:c++20'; ignored + ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(123): error C2664: 'LRESULT SendMessageA(HWND,UINT,WPARAM,LPARAM)': cannot convert argument 3 from 'nullptr' to 'WPARAM' + ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(123): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type + C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\winuser.h(3690): note: see declaration of 'SendMessageA' + ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(635): error C2664: 'BOOL SystemParametersInfoA(UINT,UINT,PVOID,UINT)': cannot convert argument 2 from 'nullptr' to 'UINT' + ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(635): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type + C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\winuser.h(13153): note: see declaration of 'SystemParametersInfoA' + ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(1593): error C2664: 'LRESULT SendMessageA(HWND,UINT,WPARAM,LPARAM)': cannot convert argument 3 from 'nullptr' to 'WPARAM' + ../subprojects/gst-plugins-bad/sys/directshow/dshowvideosink.cpp(1593): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type + C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um\winuser.h(3690): note: see declaration of 'SendMessageA' + ``` + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3528> -2009-05-21 21:02:55 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-12-05 02:29:08 +0000 Tim-Philipp Müller <tim@centricular.com> - * configure.ac: - Back to hacking -> 0.10.12.1 + * meson.build: + Back to development -=== release 0.10.12 === +=== release 1.21.3 === -2009-05-20 22:31:54 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-12-05 01:28:21 +0000 Tim-Philipp Müller <tim@centricular.com> - * ChangeLog: * NEWS: * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xdgmime.xml: - * docs/plugins/inspect/plugin-xvid.xml: * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.10.12 - -2009-05-20 20:44:12 +0100 Jan Schmidt <thaytan@noraisin.net> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ky.po: - * po/lt.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - -2009-05-20 17:10:40 +0200 Edward Hervey <bilboed@bilboed.com> - - * gst/mxf/mxfmetadata.c: - mxf: Fix frame_layout for non-interlaced formats. Fixes #583337 + * meson.build: + Release 1.21.3 -2009-05-16 01:58:33 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-12-04 12:25:41 +0000 Tim-Philipp Müller <tim@centricular.com> * ChangeLog: - * configure.ac: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ky.po: - * po/lt.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - 0.10.11.3 pre-release - -2009-05-16 01:53:15 +0100 Jan Schmidt <thaytan@noraisin.net> - - * win32/MANIFEST: - win32: Add directdraw project files to the win32 manifest - -2009-05-16 01:14:23 +0100 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-directdraw.xml: - * sys/Makefile.am: - Moved 'directdraw' from -good to -bad - -2007-06-15 09:13:55 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - MOVED FROM GOOD win32/vs6/: Mark *.dsp & *.dsw as binary files and convert to DOS line endings, as they don't load into VS6 correctly... - Original commit message from CVS: - * win32/vs6/autogen.dsp: - * win32/vs6/gst_plugins_good.dsw: - * win32/vs6/libgstalaw.dsp: - * win32/vs6/libgstalpha.dsp: - * win32/vs6/libgstalphacolor.dsp: - * win32/vs6/libgstapetag.dsp: - * win32/vs6/libgstaudiofx.dsp: - * win32/vs6/libgstauparse.dsp: - * win32/vs6/libgstautodetect.dsp: - * win32/vs6/libgstavi.dsp: - * win32/vs6/libgstcutter.dsp: - * win32/vs6/libgstdirectdraw.dsp: - * win32/vs6/libgstdirectsound.dsp: - * win32/vs6/libgsteffectv.dsp: - * win32/vs6/libgstflx.dsp: - * win32/vs6/libgstgoom.dsp: - * win32/vs6/libgsticydemux.dsp: - * win32/vs6/libgstid3demux.dsp: - * win32/vs6/libgstinterleave.dsp: - * win32/vs6/libgstjpeg.dsp: - * win32/vs6/libgstlevel.dsp: - * win32/vs6/libgstmatroska.dsp: - * win32/vs6/libgstmedian.dsp: - * win32/vs6/libgstmonoscope.dsp: - * win32/vs6/libgstmulaw.dsp: - * win32/vs6/libgstmultipart.dsp: - * win32/vs6/libgstqtdemux.dsp: - * win32/vs6/libgstrtp.dsp: - * win32/vs6/libgstrtsp.dsp: - * win32/vs6/libgstsmpte.dsp: - * win32/vs6/libgstspeex.dsp: - * win32/vs6/libgstudp.dsp: - * win32/vs6/libgstvideobalance.dsp: - * win32/vs6/libgstvideobox.dsp: - * win32/vs6/libgstvideocrop.dsp: - * win32/vs6/libgstvideoflip.dsp: - * win32/vs6/libgstvideomixer.dsp: - * win32/vs6/libgstwaveform.dsp: - * win32/vs6/libgstwavenc.dsp: - * win32/vs6/libgstwavparse.dsp: - Mark *.dsp & *.dsw as binary files and convert to DOS line - endings, as they don't load into VS6 correctly otherwise. - -2007-02-11 15:26:49 +0000 Sébastien Moutte <sebastien@moutte.net> - - MOVED FROM GOOD Makefile.am: Add win32 MANIFEST - Original commit message from CVS: - * Makefile.am: - Add win32 MANIFEST - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - Clear unused code and add comments. - Remove yuv from template caps, it only supports RGB - actually. - Implement XOverlay interface and remove window and fullscreen - properties. - Add debug logs. - Test for blit capabilities to return only the current colorspace if - the hardware can't blit for one colorspace to another. - * sys/directsound/gstdirectsoundsink.c: - Add some debugs. - * win32/MANIFEST: - Add VS7 project files and solution. - * win32/vs6/gst_plugins_bad.dsw: - * win32/vs6/libgstdirectdraw.dsp: - * win32/vs6/libgstdirectsound.dsp: - * win32/vs6/libgstqtdemux.dsp: - Update project files. - -2006-11-01 10:19:18 +0000 Sergey Scobich <sergey.scobich@gmail.com> - - MOVED FROM GOOD sys/: Wait until the window is created before using it; guard unistd.h includes with HAVE_UNISTD_H. (#366523) - Original commit message from CVS: - Patch by: Sergey Scobich <sergey dot scobich at gmail com> - * sys/directdraw/gstdirectdrawsink.c: - (gst_directdrawsink_window_thread), - (gst_directdrawsink_create_default_window): - * sys/directdraw/gstdirectdrawsink.h: - * sys/directsound/gstdirectsoundsink.c: - Wait until the window is created before using it; guard unistd.h - includes with HAVE_UNISTD_H. (#366523) - * win32/vs8/libgstdirectdraw.vcproj: - * win32/vs8/libgstdirectsound.vcproj: - Update project files. - -2006-07-24 21:43:06 +0000 Sébastien Moutte <sebastien@moutte.net> - - MOVED FROM GOOD sys/directsound/gstdirectsoundsink.*: Add an attenuation property that will directly attenuate the directsound buffer. - Original commit message from CVS: - * sys/directsound/gstdirectsoundsink.h: - * sys/directsound/gstdirectsoundsink.c: - Add an attenuation property that will directly attenuate the - directsound buffer. - Change the size of the directsound secondary buffer to a half second. - Add more debug logs. - Add a lock to protect dsound buffer write access. - Fix a bad implementation of reset. - * sys/directsound/gstdirectdrawsink.c: - * sys/directsound/gstdirectdrawsink.h: - Add a keep_aspect_ratio property. - Do not use overlay if not supported. - Add more debug logs. - Remove overwrite of WM_ERASEBKGND message handling. It was not - redrawing border when keep_aspect_ratio was enabled. - * win32/common/config.h: - update version waiting an auto-generated config.h - -2006-03-03 23:45:23 +0000 Sébastien Moutte <sebastien@moutte.net> - - MOVED FROM GOOD sys/: sinks are now using GST_RANK_PRIMARY to be used with autodectection - Original commit message from CVS: - * sys/directdraw: - * sys/directsound: - sinks are now using GST_RANK_PRIMARY to be used with autodectection - * win32/vs6: - project files updated to fix some bugs - * win32/vs7: - * win32/vs8: - vs7 and vs8 project files added - -2006-01-05 23:17:44 +0000 Sébastien Moutte <sebastien@moutte.net> - - * win32/vs6/libgstdirectdraw.dsp: - MOVED FROM GOOD added sys/directdraw added sys/directsound added win32/vs6/gst_plugins_bad.dsw added win32/vs6/libgstdirectsound.dsp ... - Original commit message from CVS: - 2006-01-05 Sebastien Moutte <sebastien@moutte.net> - * added sys/directdraw - * added sys/directsound - * added win32/vs6/gst_plugins_bad.dsw - * added win32/vs6/libgstdirectsound.dsp - * added win32/vs6/libgstdirectdraw.dsp - * added win32/common/config.h - -2009-02-27 20:40:31 +0100 LRN <lrn1986@gmail.com> - - * sys/directdraw/gstdirectdrawsink.c: - MOVED FROM GOOD directdrawsink: Fix type mismatches - Fixes bug #573343. - -2009-01-29 11:07:59 +0200 Stefan Kost <ensonic@users.sf.net> - - * sys/directdraw/gstdirectdrawsink.c: - MOVED FROM GOOD Remove version numbers from a few gst-launch examples. - The majority of the examples doe not use -0.10 and this will also help us to maintain the docs. - -2009-01-29 10:10:08 +0200 Stefan Kost <ensonic@users.sf.net> - - * sys/directdraw/gstdirectdrawsink.c: - MOVED FROM GOOD Update and add documentation for platform specific plugins (sys). - Link to properties. Correct titles for examples. Fix examples. - -2008-11-04 12:28:34 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - MOVED FROM GOOD Don't install static libs for plugins. Fixes #550851 for -good. - Original commit message from CVS: - * ext/aalib/Makefile.am: - * ext/annodex/Makefile.am: - * ext/cairo/Makefile.am: - * ext/dv/Makefile.am: - * ext/esd/Makefile.am: - * ext/flac/Makefile.am: - * ext/gconf/Makefile.am: - * ext/gdk_pixbuf/Makefile.am: - * ext/hal/Makefile.am: - * ext/jpeg/Makefile.am: - * ext/ladspa/Makefile.am: - * ext/libcaca/Makefile.am: - * ext/libmng/Makefile.am: - * ext/libpng/Makefile.am: - * ext/mikmod/Makefile.am: - * ext/pulse/Makefile.am: - * ext/raw1394/Makefile.am: - * ext/shout2/Makefile.am: - * ext/soup/Makefile.am: - * ext/speex/Makefile.am: - * ext/taglib/Makefile.am: - * ext/wavpack/Makefile.am: - * gst/alpha/Makefile.am: - * gst/apetag/Makefile.am: - * gst/audiofx/Makefile.am: - * gst/auparse/Makefile.am: - * gst/autodetect/Makefile.am: - * gst/avi/Makefile.am: - * gst/cutter/Makefile.am: - * gst/debug/Makefile.am: - * gst/effectv/Makefile.am: - * gst/equalizer/Makefile.am: - * gst/flx/Makefile.am: - * gst/goom/Makefile.am: - * gst/goom2k1/Makefile.am: - * gst/icydemux/Makefile.am: - * gst/id3demux/Makefile.am: - * gst/interleave/Makefile.am: - * gst/law/Makefile.am: - * gst/level/Makefile.am: - * gst/matroska/Makefile.am: - * gst/median/Makefile.am: - * gst/monoscope/Makefile.am: - * gst/multifile/Makefile.am: - * gst/multipart/Makefile.am: - * gst/oldcore/Makefile.am: - * gst/qtdemux/Makefile.am: - * gst/replaygain/Makefile.am: - * gst/rtp/Makefile.am: - * gst/rtsp/Makefile.am: - * gst/smpte/Makefile.am: - * gst/spectrum/Makefile.am: - * gst/udp/Makefile.am: - * gst/videobox/Makefile.am: - * gst/videocrop/Makefile.am: - * gst/videofilter/Makefile.am: - * gst/videomixer/Makefile.am: - * gst/wavenc/Makefile.am: - * gst/wavparse/Makefile.am: - * sys/directdraw/Makefile.am: - * sys/directsound/Makefile.am: - * sys/oss/Makefile.am: - * sys/osxaudio/Makefile.am: - * sys/osxvideo/Makefile.am: - * sys/sunaudio/Makefile.am: - * sys/v4l2/Makefile.am: - * sys/waveform/Makefile.am: - * sys/ximage/Makefile.am: - Don't install static libs for plugins. Fixes #550851 for -good. - -2008-08-21 21:56:19 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - * sys/directdraw/gstdirectdrawsink.c: - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_buffer_alloc, gst_directdraw_sink_bufferpool_clear): - Original commit message from CVS: - * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_buffer_alloc, - gst_directdraw_sink_bufferpool_clear): - Fix two more buffer ref leaks. - -2008-08-21 15:28:09 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c: Fix buffer ref leak. - Original commit message from CVS: - Patch by: Ole André Vadla Ravnås <ole.andre.ravnas at tandberg com> - * sys/directdraw/gstdirectdrawsink.c: - (gst_directdraw_sink_show_frame): - Fix buffer ref leak. - -2008-05-07 15:33:52 +0000 Haakon Sporsheim <haakon.sporsheim@tandberg.com> - - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_setup_ddraw): Do IDirectDrawClipper_SetHWnd() if the window I... - Original commit message from CVS: - patch by: Haakon Sporsheim <haakon.sporsheim at tandberg com> - * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_setup_ddraw): - Do IDirectDrawClipper_SetHWnd() if the window ID has already been - set after creating the clipper. - -2008-05-07 15:28:06 +0000 Haakon Sporsheim <haakon.sporsheim@tandberg.com> - - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame): Added checking of surface lost case after an uns... - Original commit message from CVS: - patch by: Haakon Sporsheim <haakon.sporsheim at tandberg com> - * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame): - Added checking of surface lost case after an unsuccessful - IDirectDrawSurface7_Lock() call. - If surface is lost, return GST_FLOW_OK. - -2008-05-07 15:19:47 +0000 Haakon Sporsheim <haakon.sporsheim@tandberg.com> - - * sys/directdraw/gstdirectdrawsink.c: - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame, - Original commit message from CVS: - patch by: Haakon Sporsheim <haakon.sporsheim at tandberg com> - * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame, - WndProc, gst_directdraw_sink_window_thread): - Improved Windows message loop and fixed window destruction issue. - When the window which DirectDraw is rendering to is destroyed, the - render/show_frame function will return GST_FLOW_ERROR. - Partially fixes #520885. - -2008-05-07 15:09:10 +0000 Haakon Sporsheim <haakon.sporsheim@tandberg.com> - - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_set_caps): Fixed mid stream resolution change bug, the offscr... - Original commit message from CVS: - patch by: Haakon Sporsheim <haakon.sporsheim at tandberg com> - * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_set_caps): - Fixed mid stream resolution change bug, the offscreen surface is now - released when set_caps is called. - Partially fixes #520885. - -2008-05-07 14:56:22 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - * sys/directdraw/gstdirectdrawsink.c: - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c - Original commit message from CVS: - * sys/directdraw/gstdirectdrawsink.c - (gst_directdraw_sink_buffer_alloc): - Make it so that gst_directdraw_sink_buffer_alloc uses the right - width/height. - Especially when looking through the pool of buffers, make sure that - the width/height of caps is used instead of the already negotiated - dimensions. - For example if a buffer with different caps is requested, i.e. - higher resolution, the caller would get a buffer with the old - dimensions and thus corrupt the heap. - -2008-05-07 14:43:39 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - * sys/directdraw/gstdirectdrawsink.c: - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c - Original commit message from CVS: - * sys/directdraw/gstdirectdrawsink.c - (gst_directdraw_sink_buffer_alloc): - Clear the flags on recycled buffers from buffer_alloc. - Partially fixes #520885. - The right fix this time. - -2008-05-07 14:39:45 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - * sys/directdraw/gstdirectdrawsink.c: - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c - Original commit message from CVS: - * sys/directdraw/gstdirectdrawsink.c - (gst_directdraw_sink_buffer_alloc): - Reverting previous commit, it had it all mixed up, was for a different - patch (major automation screw-up). Sorry! - -2008-05-07 13:48:28 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - * sys/directdraw/gstdirectdrawsink.c: - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c - Original commit message from CVS: - * sys/directdraw/gstdirectdrawsink.c - (gst_directdraw_sink_buffer_alloc): - Clear the flags on recycled buffers from buffer_alloc. - Partially fixes #520885. - -2008-02-12 12:22:48 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c: Properly chain up finalize functions. Fixes bug #515980. - Original commit message from CVS: - * sys/directdraw/gstdirectdrawsink.c: - (gst_ddrawsurface_class_init), (gst_ddrawsurface_finalize), - (gst_directdraw_sink_finalize): - Properly chain up finalize functions. Fixes bug #515980. - -2008-01-07 16:41:00 +0000 Tim-Philipp Müller <tim@centricular.net> - - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c: FALSE is not a gpointer. - Original commit message from CVS: - * sys/directdraw/gstdirectdrawsink.c: - (gst_directdraw_sink_window_thread): - FALSE is not a gpointer. - -2008-01-05 21:20:08 +0000 Julien Moutte <julien@moutte.net> - - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c: Make sure we create our internal window only when we need it. That will give a ch... - Original commit message from CVS: - 2008-01-05 Julien Moutte <julien@fluendo.com> - * sys/directdraw/gstdirectdrawsink.c: - (gst_directdraw_sink_set_window_id), - (gst_directdraw_sink_set_caps), - (gst_directdraw_sink_change_state), - (gst_directdraw_sink_buffer_alloc), - (gst_directdraw_sink_draw_borders), - (gst_directdraw_sink_show_frame), - (gst_directdraw_sink_setup_ddraw), - (gst_directdraw_sink_window_thread), - (gst_directdraw_sink_get_ddrawcaps), - (gst_directdraw_sink_surface_create): Make sure we create our - internal window only when we need it. That will give a chance to - the application to get the prepare-xwindow-id bus message. Draw - black borders when keeping aspect ratio. Handle the case where - our - rendering window disappears (closed or errors) like other sinks - do. Various 80 columns fixes, improve state change order. That - element could need some more love. - -2007-09-22 08:12:57 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - MOVED FROM GOOD fix header and comments - Original commit message from CVS: - fix header and comments - -2007-06-14 12:14:24 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - MOVED FROM GOOD Make sure to dist everything needed for win32 builds. - Original commit message from CVS: - * configure.ac: - * sys/Makefile.am: - * sys/directdraw/Makefile.am: - * sys/directsound/Makefile.am: - * sys/waveform/Makefile.am: - Make sure to dist everything needed for win32 builds. - -2007-06-08 16:31:15 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - MOVED FROM GOOD Rename the keep-aspect-ratio property to force-aspect-ratio to make it consistent with xvimagesink and ximagesink. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.args: - * sys/directdraw/gstdirectdrawsink.c: - (gst_directdraw_sink_class_init): - Rename the keep-aspect-ratio property to force-aspect-ratio to make - it consistent with xvimagesink and ximagesink. - -2007-05-24 08:35:23 +0000 Vincent Torri <vtorri@univ-evry.fr> - - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.*: Fix more warnings when compiling with MingW (#439914). - Original commit message from CVS: - Patch by: Vincent Torri <vtorri at univ-evry fr> - * sys/directdraw/gstdirectdrawsink.c: - (gst_directdraw_sink_buffer_alloc), - (gst_directdraw_sink_show_frame), - (gst_directdraw_sink_check_primary_surface), - (gst_directdraw_sink_check_offscreen_surface), - (EnumModesCallback2), (gst_directdraw_sink_get_ddrawcaps), - (gst_directdraw_sink_surface_create): - * sys/directdraw/gstdirectdrawsink.h: - Fix more warnings when compiling with MingW (#439914). - -2007-05-20 14:59:46 +0000 Tim-Philipp Müller <tim@centricular.net> - - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.c: Bunch of small fixes: remove static function that doesn't exist; declare another ... - Original commit message from CVS: - * sys/directdraw/gstdirectdrawsink.c: (gst_ddrawsurface_finalize), - (gst_directdraw_sink_buffer_alloc), - (gst_directdraw_sink_get_ddrawcaps), - (gst_directdraw_sink_surface_create): - Bunch of small fixes: remove static function that doesn't exist; - declare another one that does; printf format fix; use right macro - when specifying debug category; remove a bunch of unused variables; - #if 0 out an unused chunk of code (partially fixes #439914). - -2007-05-15 17:22:58 +0000 Tim-Philipp Müller <tim@centricular.net> - - MOVED FROM GOOD Add DIRECTDRAW_CFLAGS and DIRECTSOUND_CFLAGS to Makefile.am; save and restore the various flags in the directdraw/dir... - Original commit message from CVS: - * configure.ac: - * sys/directdraw/Makefile.am: - * sys/directsound/Makefile.am: - Add DIRECTDRAW_CFLAGS and DIRECTSOUND_CFLAGS to Makefile.am; save - and restore the various flags in the directdraw/directsound - detection section. Apparently improves cross-compiling for win32 - with mingw32 under some circumstances (#437539). - -2007-04-29 13:56:18 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * sys/directdraw/gstdirectdrawsink.c: - MOVED FROM GOOD 80 char police - Original commit message from CVS: - 80 char police - -2007-03-11 22:23:04 +0000 Sébastien Moutte <sebastien@moutte.net> - - MOVED FROM GOOD sys/directdraw/gstdirectdrawsink.*: Handle display mode changes during playback. - Original commit message from CVS: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - Handle display mode changes during playback. - -2007-02-27 12:02:03 +0000 Christian Schaller <uraeus@gnome.org> - - * sys/directdraw/gstdirectdrawplugin.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - MOVED FROM GOOD update copyright statements - Original commit message from CVS: - update copyright statements - -2007-02-18 18:00:51 +0000 Sébastien Moutte <sebastien@moutte.net> - - MOVED FROM GOOD sys/directdraw/: Prepare the plugin to move to good: - Original commit message from CVS: - * sys/directdraw/gstdirectdrawplugin.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - Prepare the plugin to move to good: - Remove unused/untested code (rendering to an extern surface, - yuv format rendering).Use GST_(DEBUG/*)_OBJECT macros - Rename all functions from gst_directdrawsink to gst_directdraw_sink. - Add gtk doc section - Fix a bug in gst_directdraw_sink_show_frame, memcpy line by line - respecting destination surface stride. - * sys/directsound/gstdirectsoundplugin.c: - * sys/directsound/gstdirectsoundsink.c: - * sys/directsound/gstdirectsoundsink.h: - Prepare the plugin to move to good: - Rename all functions from gst_directsoundsink to gst_directsound_sink. - Add gtk doc section - * win32/common/config.h.in: - * win32/MANIFEST: - Add config.h.in - -2007-02-11 15:26:49 +0000 Sébastien Moutte <sebastien@moutte.net> - - MOVED FROM GOOD Makefile.am: Add win32 MANIFEST - Original commit message from CVS: - * Makefile.am: - Add win32 MANIFEST - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - Clear unused code and add comments. - Remove yuv from template caps, it only supports RGB - actually. - Implement XOverlay interface and remove window and fullscreen - properties. - Add debug logs. - Test for blit capabilities to return only the current colorspace if - the hardware can't blit for one colorspace to another. - * sys/directsound/gstdirectsoundsink.c: - Add some debugs. - * win32/MANIFEST: - Add VS7 project files and solution. - * win32/vs6/gst_plugins_bad.dsw: - * win32/vs6/libgstdirectdraw.dsp: - * win32/vs6/libgstdirectsound.dsp: - * win32/vs6/libgstqtdemux.dsp: - Update project files. - -2007-01-03 19:54:33 +0000 Vincent Torri <vtorri@univ-evry.fr> - - MOVED FROM GOOD Add directdrawsink to build and dist it, so it gets built when compiling with MingW on win32 and the required headers... - Original commit message from CVS: - Patch by: Vincent Torri <vtorri at univ-evry fr> - * configure.ac: - * sys/Makefile.am: - * sys/directdraw/Makefile.am: - Add directdrawsink to build and dist it, so it gets built when - compiling with MingW on win32 and the required headers and libraries - are available (fixes: #392313). - * sys/directdraw/gstdirectdrawsink.c: - (gst_directdrawsink_center_rect), (gst_directdrawsink_show_frame), - (gst_directdrawsink_setup_ddraw), - (gst_directdrawsink_surface_create): - Comment out some unused things and fix some printf format issues in - order to avoid warnings when buildling with MingW (#392313). - -2006-11-01 10:19:18 +0000 Sergey Scobich <sergey.scobich@gmail.com> - - MOVED FROM GOOD sys/: Wait until the window is created before using it; guard unistd.h includes with HAVE_UNISTD_H. (#366523) - Original commit message from CVS: - Patch by: Sergey Scobich <sergey dot scobich at gmail com> - * sys/directdraw/gstdirectdrawsink.c: - (gst_directdrawsink_window_thread), - (gst_directdrawsink_create_default_window): - * sys/directdraw/gstdirectdrawsink.h: - * sys/directsound/gstdirectsoundsink.c: - Wait until the window is created before using it; guard unistd.h - includes with HAVE_UNISTD_H. (#366523) - * win32/vs8/libgstdirectdraw.vcproj: - * win32/vs8/libgstdirectsound.vcproj: - Update project files. - -2006-07-24 21:43:06 +0000 Sébastien Moutte <sebastien@moutte.net> - - MOVED FROM GOOD sys/directsound/gstdirectsoundsink.*: Add an attenuation property that will directly attenuate the directsound buffer. - Original commit message from CVS: - * sys/directsound/gstdirectsoundsink.h: - * sys/directsound/gstdirectsoundsink.c: - Add an attenuation property that will directly attenuate the - directsound buffer. - Change the size of the directsound secondary buffer to a half second. - Add more debug logs. - Add a lock to protect dsound buffer write access. - Fix a bad implementation of reset. - * sys/directsound/gstdirectdrawsink.c: - * sys/directsound/gstdirectdrawsink.h: - Add a keep_aspect_ratio property. - Do not use overlay if not supported. - Add more debug logs. - Remove overwrite of WM_ERASEBKGND message handling. It was not - redrawing border when keep_aspect_ratio was enabled. - * win32/common/config.h: - update version waiting an auto-generated config.h - -2006-06-12 10:53:26 +0000 Tim-Philipp Müller <tim@centricular.net> - - MOVED FROM GOOD ext/libmms/gstmms.c: Set caps on outgoing buffers. - Original commit message from CVS: - * ext/libmms/gstmms.c: (gst_mms_create): - Set caps on outgoing buffers. - * sys/directdraw/gstdirectdrawsink.c: (gst_directdrawsink_init): - Comment out unused global instance variable. - -2006-06-01 22:00:26 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - MOVED FROM GOOD Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass - Original commit message from CVS: - * ext/alsaspdif/alsaspdifsink.h: - * ext/amrwb/gstamrwbdec.h: - * ext/amrwb/gstamrwbenc.h: - * ext/amrwb/gstamrwbparse.h: - * ext/arts/gst_arts.h: - * ext/artsd/gstartsdsink.h: - * ext/audiofile/gstafparse.h: - * ext/audiofile/gstafsink.h: - * ext/audiofile/gstafsrc.h: - * ext/audioresample/gstaudioresample.h: - * ext/bz2/gstbz2dec.h: - * ext/bz2/gstbz2enc.h: - * ext/dirac/gstdiracdec.h: - * ext/directfb/dfbvideosink.h: - * ext/divx/gstdivxdec.h: - * ext/divx/gstdivxenc.h: - * ext/dts/gstdtsdec.h: - * ext/faac/gstfaac.h: - * ext/gsm/gstgsmdec.h: - * ext/gsm/gstgsmenc.h: - * ext/ivorbis/vorbisenc.h: - * ext/libfame/gstlibfame.h: - * ext/nas/nassink.h: - * ext/neon/gstneonhttpsrc.h: - * ext/polyp/polypsink.h: - * ext/sdl/sdlaudiosink.h: - * ext/sdl/sdlvideosink.h: - * ext/shout/gstshout.h: - * ext/snapshot/gstsnapshot.h: - * ext/sndfile/gstsf.h: - * ext/swfdec/gstswfdec.h: - * ext/tarkin/gsttarkindec.h: - * ext/tarkin/gsttarkinenc.h: - * ext/theora/theoradec.h: - * ext/wavpack/gstwavpackdec.h: - * ext/wavpack/gstwavpackparse.h: - * ext/xine/gstxine.h: - * ext/xvid/gstxviddec.h: - * ext/xvid/gstxvidenc.h: - * gst/cdxaparse/gstcdxaparse.h: - * gst/cdxaparse/gstcdxastrip.h: - * gst/colorspace/gstcolorspace.h: - * gst/festival/gstfestival.h: - * gst/freeze/gstfreeze.h: - * gst/gdp/gstgdpdepay.h: - * gst/gdp/gstgdppay.h: - * gst/modplug/gstmodplug.h: - * gst/mpeg1sys/gstmpeg1systemencode.h: - * gst/mpeg1videoparse/gstmp1videoparse.h: - * gst/mpeg2sub/gstmpeg2subt.h: - * gst/mpegaudioparse/gstmpegaudioparse.h: - * gst/multifilesink/gstmultifilesink.h: - * gst/overlay/gstoverlay.h: - * gst/playondemand/gstplayondemand.h: - * gst/qtdemux/qtdemux.h: - * gst/rtjpeg/gstrtjpegdec.h: - * gst/rtjpeg/gstrtjpegenc.h: - * gst/smooth/gstsmooth.h: - * gst/smoothwave/gstsmoothwave.h: - * gst/spectrum/gstspectrum.h: - * gst/speed/gstspeed.h: - * gst/stereo/gststereo.h: - * gst/switch/gstswitch.h: - * gst/tta/gstttadec.h: - * gst/tta/gstttaparse.h: - * gst/videodrop/gstvideodrop.h: - * gst/xingheader/gstxingmux.h: - * sys/directdraw/gstdirectdrawsink.h: - * sys/directsound/gstdirectsoundsink.h: - * sys/dxr3/dxr3audiosink.h: - * sys/dxr3/dxr3spusink.h: - * sys/dxr3/dxr3videosink.h: - * sys/qcam/gstqcamsrc.h: - * sys/vcd/vcdsrc.h: - Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass - -2006-04-25 21:56:38 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - MOVED FROM GOOD Define GstElementDetails as const and also static (when defined as global) - Original commit message from CVS: - * ext/amrwb/gstamrwbdec.c: - * ext/amrwb/gstamrwbenc.c: - * ext/amrwb/gstamrwbparse.c: - * ext/arts/gst_arts.c: - * ext/artsd/gstartsdsink.c: - * ext/audiofile/gstafparse.c: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsrc.c: - * ext/audioresample/gstaudioresample.c: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2enc.c: - * ext/cdaudio/gstcdaudio.c: - * ext/directfb/dfbvideosink.c: - * ext/divx/gstdivxdec.c: - * ext/divx/gstdivxenc.c: - * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init): - * ext/faac/gstfaac.c: (gst_faac_base_init): - * ext/faad/gstfaad.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmenc.c: - * ext/hermes/gsthermescolorspace.c: - * ext/ivorbis/vorbisfile.c: - * ext/lcs/gstcolorspace.c: - * ext/libfame/gstlibfame.c: - * ext/libmms/gstmms.c: (gst_mms_base_init): - * ext/musepack/gstmusepackdec.c: (gst_musepackdec_base_init): - * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): - * ext/nas/nassink.c: (gst_nassink_base_init): - * ext/neon/gstneonhttpsrc.c: - * ext/sdl/sdlaudiosink.c: - * ext/sdl/sdlvideosink.c: - * ext/shout/gstshout.c: - * ext/snapshot/gstsnapshot.c: - * ext/sndfile/gstsf.c: - * ext/swfdec/gstswfdec.c: - * ext/tarkin/gsttarkindec.c: - * ext/tarkin/gsttarkinenc.c: - * ext/theora/theoradec.c: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxvidenc.c: - * gst/cdxaparse/gstcdxaparse.c: (gst_cdxa_parse_base_init): - * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_base_init): - * gst/chart/gstchart.c: - * gst/colorspace/gstcolorspace.c: - * gst/deinterlace/gstdeinterlace.c: - * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init): - * gst/festival/gstfestival.c: - * gst/filter/gstbpwsinc.c: - * gst/filter/gstiir.c: - * gst/filter/gstlpwsinc.c: - * gst/freeze/gstfreeze.c: - * gst/games/gstpuzzle.c: (gst_puzzle_base_init): - * gst/librfb/gstrfbsrc.c: - * gst/mixmatrix/mixmatrix.c: - * gst/mpeg1sys/gstmpeg1systemencode.c: - * gst/mpeg1videoparse/gstmp1videoparse.c: - * gst/mpeg2sub/gstmpeg2subt.c: - * gst/mpegaudioparse/gstmpegaudioparse.c: - * gst/multifilesink/gstmultifilesink.c: - * gst/overlay/gstoverlay.c: - * gst/passthrough/gstpassthrough.c: - * gst/playondemand/gstplayondemand.c: - * gst/qtdemux/qtdemux.c: - * gst/rtjpeg/gstrtjpegdec.c: - * gst/rtjpeg/gstrtjpegenc.c: - * gst/smooth/gstsmooth.c: - * gst/smoothwave/gstsmoothwave.c: - * gst/spectrum/gstspectrum.c: - * gst/speed/gstspeed.c: - * gst/stereo/gststereo.c: - * gst/switch/gstswitch.c: - * gst/tta/gstttadec.c: (gst_tta_dec_base_init): - * gst/tta/gstttaparse.c: (gst_tta_parse_base_init): - * gst/vbidec/gstvbidec.c: - * gst/videocrop/gstvideocrop.c: - * gst/videodrop/gstvideodrop.c: - * gst/virtualdub/gstxsharpen.c: - * gst/xingheader/gstxingmux.c: (gst_xing_mux_base_init): - * gst/y4m/gsty4mencode.c: - * sys/cdrom/gstcdplayer.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directsound/gstdirectsoundsink.c: - * sys/glsink/glimagesink.c: - * sys/qcam/gstqcamsrc.c: - * sys/v4l2/gstv4l2src.c: - * sys/vcd/vcdsrc.c: (gst_vcdsrc_base_init): - * sys/ximagesrc/ximagesrc.c: - Define GstElementDetails as const and also static (when defined as - global) - -2006-04-01 10:09:11 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * sys/directdraw/gstdirectdrawplugin.c: - MOVED FROM GOOD rework build; add translations for v4l2 - Original commit message from CVS: - rework build; add translations for v4l2 - -2006-03-03 23:45:23 +0000 Sébastien Moutte <sebastien@moutte.net> - - MOVED FROM GOOD sys/: sinks are now using GST_RANK_PRIMARY to be used with autodectection - Original commit message from CVS: - * sys/directdraw: - * sys/directsound: - sinks are now using GST_RANK_PRIMARY to be used with autodectection - * win32/vs6: - project files updated to fix some bugs - * win32/vs7: - * win32/vs8: - vs7 and vs8 project files added - -2006-01-05 23:17:44 +0000 Sébastien Moutte <sebastien@moutte.net> - - * sys/directdraw/gstdirectdrawplugin.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - MOVED FROM GOOD added sys/directdraw added sys/directsound added win32/vs6/gst_plugins_bad.dsw added win32/vs6/libgstdirectsound.dsp ... - Original commit message from CVS: - 2006-01-05 Sebastien Moutte <sebastien@moutte.net> - * added sys/directdraw - * added sys/directsound - * added win32/vs6/gst_plugins_bad.dsw - * added win32/vs6/libgstdirectsound.dsp - * added win32/vs6/libgstdirectdraw.dsp - * added win32/common/config.h - -2009-05-15 10:45:45 +0100 Jan Schmidt <thaytan@noraisin.net> - - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: Fix resetting of the sink in NULL - Reset the fpsdisplaysink in NULL by removing the textoverlay if we - created it. - Fixes: #582633 - -2009-05-16 00:17:00 +0100 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-y4menc.xml: - * gst/y4m/Makefile.am: - * gst/y4m/gsty4mencode.c: - * gst/y4m/gsty4mencode.h: - * gst/y4m/y4menc.vcproj: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/y4menc.c: - Moved 'y4menc' from -bad to -good - -2009-05-15 18:24:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * po/Makevars: - po: add Makevars magic so we don't get line numbers in *.po files - This avoids the number one reason for local modifications in *.po - files and and makes things less annoying when working with git (or - any other VCS for that matter). - -2009-05-15 01:54:44 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> - - * gst/qtmux/atoms.c: - qtmux Fixes segfault when adding a blob as first tag. - Moves tags data initialization to the function that actually appends - the tags to the list. Fixes #582702 - Also fixes some style caught by the pre-commit hook. - -2009-05-14 21:20:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - mxfdemux: Use a RW lock to protect metadata and add all pads at once without a lock held - This makes it possible, among other things, to do a query in the - pad-added callback. - Fixes bug #582656. - -2009-05-14 10:34:08 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - resindvd: Fix the argument order in a debug statement - Make the debug statement correctly show the 'old' and 'new' button - coordinates, instead of the wrong way around. - -2009-05-14 09:53:25 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/gstmpegdemux.h: - resindvd: Make segment updates less aggressive. - When updating a pad, send the update to half a second behind the SCR, - which avoids ever updating the start time for a pad to beyond the end of - the cell. Also, remember the last actual new-segment start time for each - pad, and use it when closing the segment. - -2009-05-13 12:47:43 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/resindvdsrc.c: - resindvd: Rework button highlight calculation slightly - When the current button number is higher than the number of available - buttons, switch to the highest numbered button rather than the lowest. - Also, don't throw errors when we fail to retrieve some button info - from libdvdnav, just reset the highlight. + * docs/random/ChangeLog-0.8: + Remove ChangeLog files from git repository + This information is tracked fully in the git repository, so + no point having the ChangeLog duplicate it, and it interferes + with grepping the repository. + We are going to create the ChangeLogs on the fly when generating + tarballs going forward (with a limited history), since it's still + valuable for tarball consumers to be able to easily see a list of + recent changes. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer-project/-/issues/73 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3521> + +2022-11-07 00:10:39 +0000 Tim-Philipp Müller <tim@centricular.com> + + * meson.build: + * scripts/gen-changelog.py: + meson: Generate ChangeLog files for release tarballs on dist + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3521> -2009-05-12 23:42:00 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-12-01 03:52:53 +0900 Seungha Yang <seungha@centricular.com> - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - resindvd: Send commands-changed on button change and handle commands query - Send the commands-changed navigation message when the set of available - DVD menu button actions changes, and handle the commands navigation - query so that (e.g.) Totem can know about the available navigation - commands. + * docs/plugins/gst_plugins_cache.json: + * sys/d3d11/plugin.cpp: + d3d11av1dec: Promote rank to primary + 1 + ... so that this element can have higher rank than the other software + AV1 decoders + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3495> + +2022-12-02 07:03:30 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvajpegdec.c: + vajpegdec: Reenable element negotiation. + negotiation vmethod were overwritten by vabasedec, leading to errors. + This was a regression of commit b6538e0560. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3509> + +2022-12-01 13:28:16 +0100 Johan Sternerup <johast@axis.com> + + * gst-libs/gst/webrtc/nice/nicestream.c: + webrtc: Fix possible use-after-free of GstWebRTCICETransport + Because of the asynchronous resolving of mDNS ICE candidates it is + possible that GstWebRTCICE outlives webrtcbin. This in turn prolongs + the lifetime of the GstWebRTCNiceStream objects via refs in + nice_stream_map. Thus the GstWebRTCICETransport objects held in + GstWebRTCNiceStream may be invalid at the time they are accessed by + the _on_candidate_gathering_done() callback since GstWebRTCNiceStream + doesn't take a reference to them. Doing so would create a circular + reference, so instead this commit introduces weak references to the + transport objects and then we can check if the objects are valid before + accessing them. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3502> -2009-05-14 08:42:24 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-28 20:42:29 +0100 Victor Manuel Jaquez Leal <vjaquez@igalia.com> - * ext/resindvd/resindvdsrc.c: - resindvd: Fix a leak of the DVD title string + * sys/va/gstvaav1dec.c: + * sys/va/gstvabasedec.c: + * sys/va/gstvabasedec.h: + * sys/va/gstvah264dec.c: + * sys/va/gstvah265dec.c: + * sys/va/gstvajpegdec.c: + * sys/va/gstvampeg2dec.c: + * sys/va/gstvavp8dec.c: + * sys/va/gstvavp9dec.c: + va: Handle input caps change. + Update output caps if it's notified by baseclass + See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3328 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3480> -2009-05-14 10:55:38 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-27 13:00:20 +0100 Victor Manuel Jaquez Leal <vjaquez@igalia.com> - * gst/dvdspu/gstdvdspu.c: - dvdspu: Push update frame, if any, when entering stills. - When entering a still frame generates an updated buffer, make sure - to push it out, otherwise we may not put a frame onscreen with a - rendered button, causing raciness as to whether buttons get drawn - or not when jumping back to the menu on some discs. + * sys/va/gstvaav1dec.c: + vaav1dec: Use gst_va_base_dec_set_output_state(). + And even that vaav1dec doesn't use vabasedec negotiate vmethod, it should align + with the new scheme of using base's width & height for surface size and + output_info structure for downstream display size negotiation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3480> -2009-05-13 10:29:36 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-26 11:45:52 +0100 Victor Manuel Jaquez Leal <vjaquez@igalia.com> - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdbin.h: - resindvd: Fix raciness in rsndvdbin when initially creating pads - Protect pad exposure with a preroll lock to avoid situations - where no-more-pads is fired more than once, or fired just before - the last pad is actually added. - -2009-05-13 17:55:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/y4m/gsty4mencode.c: - y4menc: change my email - change my email to something more current - See #580783 - -2009-05-13 17:54:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/y4m/gsty4mencode.c: - y4menc: don't strip timestamps - Fixes #582483 - -2009-05-13 10:47:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-deinterlace2.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * gst/deinterlace/.gitignore: - * gst/deinterlace/Makefile.am: - * gst/deinterlace/deinterlace.vcproj: - * gst/deinterlace/gstdeinterlace.c: - * gst/deinterlace/gstdeinterlace.h: - * gst/deinterlace2/Makefile.am: - * gst/deinterlace2/gstdeinterlace2.c: - * gst/deinterlace2/gstdeinterlace2.h: - * gst/deinterlace2/tvtime/greedy.c: - * gst/deinterlace2/tvtime/greedyh.asm: - * gst/deinterlace2/tvtime/greedyh.c: - * gst/deinterlace2/tvtime/greedyhmacros.h: - * gst/deinterlace2/tvtime/linear.c: - * gst/deinterlace2/tvtime/linearblend.c: - * gst/deinterlace2/tvtime/mmx.h: - * gst/deinterlace2/tvtime/plugins.h: - * gst/deinterlace2/tvtime/scalerbob.c: - * gst/deinterlace2/tvtime/sse.h: - * gst/deinterlace2/tvtime/tomsmocomp.c: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoop0A.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA8.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA2.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA6.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH2.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVA.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVAH.inc: - * gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc: - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: - * gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc: - * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: - * gst/deinterlace2/tvtime/vfir.c: - * gst/deinterlace2/tvtime/weave.c: - * gst/deinterlace2/tvtime/weavebff.c: - * gst/deinterlace2/tvtime/weavetff.c: - * gst/deinterlace2/tvtime/x86-64_macros.inc: - Moved 'deinterlace2' from -bad to -good - And remove old deinterlace plugin as deinterlace2 will - be called deinterlace in -good. - -2009-05-12 21:50:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-flv.xml: - * docs/plugins/inspect/plugin-flvdemux.xml: - * gst/flv/Makefile.am: - * gst/flv/gstflvdemux.c: - * gst/flv/gstflvdemux.h: - * gst/flv/gstflvmux.c: - * gst/flv/gstflvmux.h: - * gst/flv/gstflvparse.c: - * gst/flv/gstflvparse.h: - Moved 'flv' from -bad to -good + * sys/va/gstvavp9dec.c: + vavp9dec: Use gst_va_base_dec_set_output_state(). + As this element reopen the internal decoder differently, it only uses the helper + function to negotiate. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3480> -2009-05-12 00:50:01 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-28 19:31:57 +0100 Victor Manuel Jaquez Leal <vjaquez@igalia.com> - * ChangeLog: - * configure.ac: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ky.po: - * po/lt.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - 0.10.11.2 pre-release + * sys/va/gstvampeg2dec.c: + vampeg2dec: Streams are progressive by default. + By initializating progressive, then interlaced streams are detected correctly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3480> -2009-05-11 17:50:41 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-26 09:11:39 +0100 Victor Manuel Jaquez Leal <vjaquez@igalia.com> - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/gstmpegdemux.h: - resindvd: Modify the segment update logic - Send segment updates to the audio and subpicture pads more frequently, - but less often to the video pad, where timestamps appear less often. - This helps with gap filling on some DVDs. - -2009-05-11 16:09:56 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/rsnaudiomunge.c: - resindvd: Increase the amount of filler audio generated - When creating a filler audio buffer in rsnaudiomunge, generate - a bit more, as audio sinks don't seem to preroll otherwise. This - needs a better algorithm in general, to intelligently fill the - gap, rather than hard-coding a value. + * sys/va/gstvabasedec.c: + * sys/va/gstvabasedec.h: + * sys/va/gstvah264dec.c: + * sys/va/gstvah265dec.c: + * sys/va/gstvampeg2dec.c: + * sys/va/gstvavp8dec.c: + va: Add and use common decode negotiate vmethod. + This vmethod can be used by decoders with the same VA decoder reopen logic: + same profile, chroma, width and height. + Also a new public method called gst_va_base_dec_set_output_state() with the + common GStreamer code for setting the output state, which is always called by + the negotiate vmethod. + In order to do this refactoring, new variables in vabasedec have to be populated + by the decoders: + * width and height define the resolution set in VA decoder. In the case of H264 + would be de coded_width and codec_height, or max_width and max_height in AV1. + * output_info is the downstream video info used for negotiation in + gst_va_base_dec_set_output_state(). + * input_state, from codec parent class shall be also held by vabasedec + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3480> -2009-05-11 14:17:42 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-24 13:52:59 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - resindvd: Manage timed still sequences better - Make timed still frames work better by extending the current segment - when needed, and restarting the still sequence with the correct - remaining duration when the wait it interrupted by activation of a - highlight NAV packet. - -2009-05-11 11:06:03 +0100 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/rsnaudiomunge.c: - resindvd: Change the audiomunge debug output. - Make sure we always show information about the segment events passing through, - even when pre-roll audio buffers aren't going to be needed. + * sys/va/gstvaav1dec.c: + vaav1dec: Use gst_va_base_dec_prepare_output_frame(). + And simplify a bit the code flow. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3480> -2009-05-11 11:04:25 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-24 13:15:04 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/dvdspu/gstdvdspu.c: - dvdspu: Make the debugging output a bit clearer. - Display more info about custom DVD events in the debug messages. + * sys/va/gstvabasedec.c: + * sys/va/gstvabasedec.h: + * sys/va/gstvah264dec.c: + * sys/va/gstvajpegdec.c: + * sys/va/gstvampeg2dec.c: + * sys/va/gstvavp8dec.c: + * sys/va/gstvavp9dec.c: + va: Add and use gst_va_base_dec_prepare_output_frame(). + This helper will do downstream negotiation and later will + allocate the output frame. + H265 and AV1 decoders don't use this approach since their output + frame allocation is different. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3480> -2009-05-08 17:42:12 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-23 18:29:58 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/dvdspu/gstdvdspu.c: - dvdspu: Always push a frame at the start of a still frame, and fix a leak. - Make sure to push the frame for a still frame, with discont = true and - timestamp=none, so that it gets displayed by the sink. Also, don't leak - each rendered video frame during still menus. + * sys/va/gstvaav1dec.c: + * sys/va/gstvah264dec.c: + * sys/va/gstvah265dec.c: + * sys/va/gstvavp8dec.c: + va: Remove last_ret error handling in decoders. + It was used in the early development of the base classes. Now it + shouldn't be needed. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3480> -2009-05-08 17:40:48 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-23 18:14:30 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/dvdspu/gstdvdspu-render.c: - dvdspu: Add a guard when we don't have any subpicture buffer to render + * sys/va/gstvaav1dec.c: + * sys/va/gstvabasedec.c: + * sys/va/gstvabasedec.h: + * sys/va/gstvah264dec.c: + * sys/va/gstvah265dec.c: + * sys/va/gstvajpegdec.c: + * sys/va/gstvampeg2dec.c: + * sys/va/gstvavp8dec.c: + * sys/va/gstvavp9dec.c: + va: Add and use gst_va_base_dec_process_output(). + This function will copy the frame, if it's needed, and will apply buffer flags. + The function is used by all the decoders. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3480> -2009-05-08 16:29:20 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-12-01 22:50:30 +0800 He Junyan <junyan.he@intel.com> - * ext/resindvd/rsnaudiomunge.c: - resindvd: Rename the audio munger debug category - Rename a debug category: rsn_audiomunge -> rsnaudiomunge. + * sys/va/gstvaav1dec.c: + * sys/va/gstvabaseenc.c: + va: Fix the caps memory leak by gst_va_pool_new_with_config(). + The gst_va_pool_new_with_config() will ref the caps, and so we need + to unref after that. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3503> -2009-05-08 16:27:31 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-30 13:33:49 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * ext/resindvd/resindvdsrc.c: - resindvd: Ensure we send a title tag in the first play section. + * sys/va/gstvaav1dec.c: + * sys/va/gstvadevice.c: + * sys/va/gstvadevice.h: + * sys/va/gstvah264dec.c: + * sys/va/gstvah264enc.c: + * sys/va/gstvah265dec.c: + * sys/va/gstvah265enc.c: + * sys/va/gstvajpegdec.c: + * sys/va/gstvampeg2dec.c: + * sys/va/gstvavp8dec.c: + * sys/va/gstvavp9dec.c: + va: Add render node name in non-first devices. + There could be multi-GPU setups where the non-first has more + entrypoints than the first one, and the elements names are not + homogeneous, leading to pipeline building error. + This patch add the render node in the elements names when they belong + to the non-first device. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3491> -2009-05-08 16:06:01 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-26 21:02:00 +0100 Victor Manuel Jaquez Leal <vjaquez@igalia.com> - * ext/resindvd/resindvdsrc.c: - resindvd: Simplify some stuff. Remove an unnecessary LOG message. - Skip attempting to schedule a nav block unless we're in PLAYING. Take a lock - slightly later, when we actually need it. Remove a noisy LOG message. + * sys/va/gstvafilter.c: + vafilter: Increase the caps for HDR. + As they might be other medatadata types. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3473> -2009-05-08 14:23:48 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-26 20:48:45 +0100 Victor Manuel Jaquez Leal <vjaquez@igalia.com> - * ext/resindvd/resindvdsrc.c: - resindvd: Remove per-menu description from the TITLE tag - The part number reported while in a menu doesn't reflect the selected - menu, so it's pointless to use it to report which menu we're in (Audio, - Angle etc). Just report "DVD Menu" in the title tag instead. + * sys/va/gstvafilter.c: + vafilter: Increase the number of 3DLUT caps to 16. + To fix the warning on Alderlake + vafilter gstvafilter.c:534:gst_va_filter_ensure_filters:<vafilter0> + vaQueryVideoProcFiltersCaps: list argument exceeds maximum number + Increase the number of caps to 16 as vadumpcaps does. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3473> -2009-05-08 14:20:32 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-15 06:58:14 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - resindvd: Send title info message when current angle is switched. - Make sure we send an update title tag when the current angle or available - angles changes. + * tests/examples/va/vaenc-dynamic-reconfigure.c: + example: vaenc-dynamic-reconfigure: Support H265. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2036> -2009-05-08 10:43:27 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-05-04 10:42:59 +0800 He Junyan <junyan.he@intel.com> - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - resindvd: Implement navigation command change message and query - Send messages when the available DVD navigation commands changes, and - handle navigation commands and angles queries. + * sys/va/gstvah265enc.c: + va: Add H265 SCC profile support. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2036> -2009-05-11 16:59:20 +0200 Edward Hervey <bilboed@bilboed.com> +2022-05-02 23:14:32 +0800 He Junyan <junyan.he@intel.com> - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - mpegtsdemux: Protect bitrate estimation against bogus values. - If the estimated bitrate is lower than 188 bytes, there's most likely - something completely wrong with the two samples. If that happens, - force recalculation. - Use guint64 for observation PCR, I saw cases where it would overflow. + * sys/va/gstvah265enc.c: + va: Add extended formats support such as 10/12 bits, 4:2:2 and 4:4:4. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2036> -2009-05-11 16:58:58 +0200 Edward Hervey <bilboed@bilboed.com> +2022-04-25 15:49:31 +0800 He Junyan <junyan.he@intel.com> - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Only take PCR from the active stream for bitrate estimation. + * sys/va/gstvaencoder.c: + * sys/va/gstvaencoder.h: + * sys/va/gstvah265enc.c: + va: enable multi tile support for H265 encoder. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2036> -2009-05-11 16:40:46 +0200 Edward Hervey <bilboed@bilboed.com> +2022-06-02 21:18:16 +0800 He Junyan <junyan.he@intel.com> - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: Change debugging levels for very frequent messages. - This allows debugging with mpegtsdemux:4 while being able to track what's - going on (and avoid taking up as much cpu for debugging as for the actual - demuxing process). + * sys/va/gstvah265enc.c: + va: enable vah265lpenc for low power mode H265 encoder. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2036> -2009-05-09 09:57:47 +0200 Edward Hervey <bilboed@bilboed.com> +2022-04-18 22:36:09 +0800 He Junyan <junyan.he@intel.com> - * gst/mpegdemux/gstmpegtsdemux.h: - mpegtsdemux: Revert indentation and comment header file. - One shouldn't run gst-indent on .h files, in this case it was un-beautifying - the indentation :) + * sys/va/gstvah265enc.c: + va: Add the low-delay-b frame support for H265. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2036> -2009-05-10 21:21:36 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> +2022-04-06 17:06:20 +0800 He Junyan <junyan.he@intel.com> - * gst/qtmux/gstqtmuxmap.c: - gppmux: Add MPEG-4 part 2 to supported formats. Fixes #581593. + * sys/va/gstvaencoder.c: + * sys/va/gstvaencoder.h: + va: Add prediction direction attribute support for H265 encoder. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2036> -2009-05-10 17:17:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-25 21:55:28 +0800 He Junyan <junyan.he@intel.com> - * configure.ac: - faad: Fix configure check for the FAAD version - The previous version matched things like 297 for - version 2.7, etc which could be added to the file - by other headers. - Fixes bug #582074. + * sys/va/plugin.c: + va: Register and enable and the vah265enc plugin. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2036> -2009-05-10 11:17:17 +0200 Marc-Andre Lureau <marcandre.lureau@gmail.com> +2022-03-25 21:54:30 +0800 He Junyan <junyan.he@intel.com> - * autogen.sh: - Run libtoolize before aclocal - This unbreaks the build in some cases. Fixes bug #582021 + * sys/va/gstvah265enc.c: + * sys/va/gstvah265enc.h: + * sys/va/meson.build: + va: Implement the vah265enc plugin for va HEVC encoding. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2036> -2009-05-10 10:40:36 +0200 Tristan Matthews <le.businessman@gmail.com> +2022-11-29 02:22:50 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfmux.c: - mxfmux: Fix uninitialized variable compiler warning - This will always be set to something but gcc didn't detect - this. Fixes bug #582013. + * sys/mediafoundation/gstmfvideosrc.cpp: + mfvideosrc: Fix buffer leak + The allocated buffer should be released + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3479> -2009-05-09 23:47:39 +0100 Christian Schaller <christian.schaller@collabora.co.uk> +2022-11-29 02:10:42 +0900 Seungha Yang <seungha@centricular.com> - * ext/x264/GstX264Enc.prs: - Remove wrong stuff from preset file + * sys/mediafoundation/gstmfsourcereader.cpp: + * sys/mediafoundation/gstwin32devicewatcher.cpp: + mediafoundation: Chain up from GObject::constructed + ... so that GstTracer can trace it + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3479> -2009-05-09 15:48:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-11-29 02:06:11 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfmux.c: - * gst/mxf/mxfmux.h: - mxfmux: Write metadata items in reference order - This ensures that the metadata items are always written - in the same order and that first comes the preface, - then the identification linked from the preface, ... - Some demuxers can't handle files where the metadata - items are in random order. + * sys/d3d11/gstd3d11videosink.cpp: + * sys/d3d11/gstd3d11window_corewindow.cpp: + * sys/d3d11/gstd3d11window_dummy.cpp: + * sys/d3d11/gstd3d11window_swapchainpanel.cpp: + * sys/d3d11/gstd3d11window_win32.cpp: + d3d11: Use correct ref/unref methods + Those objects are GstObject subclasses + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3479> -2009-05-09 15:48:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-11-25 20:19:22 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfmux.c: - mxfmux: Fix EOS logic again + * sys/win32ipc/gstwin32ipcvideosrc.cpp: + win32ipcvideosrc: Fix property name and enum value mismatch + Make them consistent + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3465> -2009-05-09 15:48:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-11-25 20:14:43 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfmux.c: - mxfmux: Don't unref NULL buffers if pushing a buffer after the first failed + * sys/win32ipc/gstwin32ipcvideosrc.cpp: + win32ipcvideosrc: Protect pipe from flush thread + The pipe object must be protected against GstBaseSrc::unlock() + thread. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3465> -2009-05-09 12:42:25 +0100 Christian Schaller <christian.schaller@collabora.co.uk> +2022-11-25 18:38:27 +0800 He Junyan <junyan.he@intel.com> - * ext/x264/GstX264Enc.prs: - Add a more representative example preset file for x264 + * gst-libs/gst/codecparsers/gsth264parser.c: + h264parser: Fix a typo in pred_weight_table parsing. + When setting default values, the reference list number of l1 is wrong. + Fix: https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/issues/336 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3464> -2009-05-08 18:24:28 +0100 Zaheer Merali <zaheerabbas@merali.org> +2022-11-22 17:01:37 +0800 Ma, Mingyang <mingyang.ma@intel.com> - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - mpegtsdemux: Add initial naive seeking support and fix duration query. - Sync from gst-fluendo-mpegdemux and have seeking/duration query - improvements in. No support however for wrapped around pcrs etc. but a - start nonetheless. - Also fix indentation issues. + * sys/msdk/gstmsdkdec.c: + msdkdec: Update decoding pts + Update frame pts before calling gst_video_decoder_finish_frame, or frames may be lost when transcoding in specific stream + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3449> -2009-05-08 16:38:26 +0100 Christian Schaller <christian.schaller@collabora.co.uk> +2022-11-19 02:56:27 +0900 Seungha Yang <seungha@centricular.com> - * gst-plugins-bad.spec.in: - Comment out preset not in yet + * docs/plugins/gst_plugins_cache.json: + * meson_options.txt: + * sys/meson.build: + * sys/win32ipc/gstwin32ipcutils.cpp: + * sys/win32ipc/gstwin32ipcutils.h: + * sys/win32ipc/gstwin32ipcvideosink.cpp: + * sys/win32ipc/gstwin32ipcvideosink.h: + * sys/win32ipc/gstwin32ipcvideosrc.cpp: + * sys/win32ipc/gstwin32ipcvideosrc.h: + * sys/win32ipc/meson.build: + * sys/win32ipc/plugin.cpp: + * sys/win32ipc/protocol/win32ipcmmf.cpp: + * sys/win32ipc/protocol/win32ipcmmf.h: + * sys/win32ipc/protocol/win32ipcpipeclient.cpp: + * sys/win32ipc/protocol/win32ipcpipeclient.h: + * sys/win32ipc/protocol/win32ipcpipeserver.cpp: + * sys/win32ipc/protocol/win32ipcpipeserver.h: + * sys/win32ipc/protocol/win32ipcprotocol.cpp: + * sys/win32ipc/protocol/win32ipcprotocol.h: + * sys/win32ipc/protocol/win32ipcutils.cpp: + * sys/win32ipc/protocol/win32ipcutils.h: + win32ipc: Add WIN32 shared memory videosrc/sink elements + Windows supports various IPC methods but that's completely + different form that of *nix from implementation point of view. + So, instead of adding shared memory functionality to existing + shm plugin, new WIN32 shared memory source/sink elements + are implemented in this commit. + Each videosink (server) and videosrc (client) pair will communicate + using WIN32 named pipe and thus user should configure unique/proper + pipe name to them (e.g., \\.\pipe\MyPipeName). + Once connection is established, videosink will create named shared memory + object per frame and client will be able to consume the object + (i.e., memory mapped file handle) without additional copy operation. + Note that implementations under "protocol" directory are almost + pure C/C++ with WIN32 APIs except for a few defines and debug functions. + So, applications can take only the protocol part so that the application + can send/receive shared-memory object from/to the other end + even if it's not an actual GStreamer element. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3441> + +2022-11-23 14:35:07 +0100 Jan Lorenz <jan.lorenz@pascom.net> + + * sys/mediafoundation/gstmfcapturedshow.cpp: + mfvideosrc: check HRESULT of CreateClassEnumerator correctly + Fixes a crash during direct show device enumeration + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1599 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3460> -2009-05-08 15:39:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-11-22 15:27:38 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * gst/deinterlace2/gstdeinterlace2.c: - * gst/deinterlace2/gstdeinterlace2.h: - deinterlace2: Add a disabled mode for passthrough operation - Also allow to change the mode in PAUSED and PLAYING by updating - the caps if necessary. + * sys/kms/gstkmssink.h: + kmssink: Fix compilation without kernel headers + There was a drm/drm_mode.h included added recently, drm/ is usually + referencing the linux kernel header, but we only requires the libdrm + headers to be installed. On top of this, including drm_mode.h is never + needed as its already included by drm.h. + Fixes #1596 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3452> -2009-05-07 17:53:42 +0100 Christian Schaller <christian.schaller@collabora.co.uk> +2022-11-10 08:50:35 -0500 Daniel Morin <daniel.morin@collabora.com> - * ext/faac/gstfaac.c: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/x264/gstx264enc.c: - * gst/flv/gstflvdemux.c: - * gst/mxf/mxf.c: - * gst/qtmux/gstqtmux.c: - Add ranks to various muxers and encoders in -bad + * ext/onnx/gstonnxclient.cpp: + * ext/onnx/gstonnxclient.h: + * ext/onnx/gstonnxobjectdetector.cpp: + * ext/onnx/meson.build: + onnx: Update to OnnxRT >= 1.13.1 API + - Replace deprecated methods + - Add a check on ORT version we are compatible with. + - Add clarification to the example given. + - Add the url to retrieve the model mentioned in the example. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3388> + +2022-11-22 16:42:26 +0800 He Junyan <junyan.he@intel.com> + + * gst/videoparsers/gsth265parse.c: + h265parse: Add the missing timestamp when splitting a frame. + When splitting a frame, the gst_buffer_copy_region() does not copy + the timestamp correctly for sub frames when the offset is not 0. + We still need those timestamps for each output sub frame. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3448> + +2022-11-22 15:50:44 +0800 He Junyan <junyan.he@intel.com> + + * gst/videoparsers/gsth264parse.c: + h264parse: Add the missing timestamp when splitting a frame. + When splitting a frame, the gst_buffer_copy_region() does not copy + the timestamp correctly for sub frames when the offset is not 0. + We still need those timestamps for each output sub frame. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3448> -2009-05-07 17:34:36 +0100 Christian Schaller <christian.schaller@collabora.co.uk> +2022-11-21 19:40:35 +0200 Sebastian Dröge <sebastian@centricular.com> - * gst-plugins-bad.spec.in: - Update spec file + * gst/dvbsubenc/gstdvbsubenc-util.c: + * gst/dvbsubenc/gstdvbsubenc.c: + * gst/dvbsubenc/gstdvbsubenc.h: + dvbsubenc: Write Display Definition Segment if a non-default width/height is used + Otherwise it can't be rendered by dvbsuboverlay or ffmpeg at least. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3446> -2009-05-07 13:12:34 +0200 Rov Juvano <rovjuvano@users.sourceforge.net> +2022-10-28 00:06:23 +0900 Seungha Yang <seungha@centricular.com> - * tests/examples/scaletempo/demo-player.c: - scaletempo: Don't require gconfaudiosink in the demo - Fixes bug #537700. + * docs/plugins/gst_plugins_cache.json: + * ext/aom/gstav1dec.c: + av1dec: Demote rank to secondary + cerbero does not build this plugin for now, and there's altanative + dav1ddec + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3287> -2009-05-06 21:48:30 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-18 13:32:10 -0800 Bill Hofmann <bill.hofmann@gmail.com> - * ext/resindvd/resindvdsrc.c: - resindvd: Don't open all VTS ifo at the start - Load each VTS ifo the first time the disc enters that VTS, - rather than scanning them all at the start. + * sys/kms/gstkmsedid.c: + * sys/kms/gstkmsedid.h: + * sys/kms/gstkmssink.c: + * sys/kms/gstkmssink.h: + * sys/kms/meson.build: + kmssink: add HDR10 infoframe support + If stream has HDR10 metadata and HDMI device EDID supports it, this patch + will set the DRM properties accordingly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3303> -2009-05-06 21:19:13 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-21 15:48:49 -0500 Bill Hofmann <bill.hofmann@gmail.com> - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - resindvd: Send a title tag when we change chapter/menu/angle - Allow apps like Totem to display a nicer title that reflects the current - position on the disc. + * docs/plugins/gst_plugins_cache.json: + * sys/kms/gstkmssink.c: + * sys/kms/gstkmssink.h: + kmssink: Add skip-vsync property + The legacy emulation in DRM/KMS drivers badly interact with GStreamer and + may cause the framerate to be halved. With this property, users can disable + vsync (which is handled internally by the emulation) in order to regain the + full framerate. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3303> -2009-05-05 13:18:20 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-18 02:06:51 +0900 Seungha Yang <seungha@centricular.com> - * ext/resindvd/resindvdsrc.c: - resindvd: Don't send highlight-reset messages when not needed - Fix a small bug that results in the SPU highlight being reset more often - than is necessary - ie, clearing it when it's already cleared. + * gst-libs/gst/codecs/gstav1decoder.c: + av1decoder: Clear highest_spatial_layer per sequence header + Clear the value to default zero, indicating that no spatial scalability + layer is used. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3430> -2009-05-05 13:14:47 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-18 01:59:55 +0900 Seungha Yang <seungha@centricular.com> - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - resindvd: send angles-changed messages when appropriate - When the current angle changes, or the number of available angles changes, - send an angles-changed message to let the app know. + * gst-libs/gst/codecs/gstav1decoder.c: + av1decoder: Don't error out by dropped OBU + OBU can be dropped if the current layer is not in selected operation + point + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3430> -2009-05-05 11:34:26 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-18 01:49:43 +0900 Seungha Yang <seungha@centricular.com> - * ext/resindvd/resindvdsrc.c: - resindvd: Make the next/prev angle switching cycle at the ends - When the current angle is 1 and prev_angle is requested, loop to the - maximum angle and vice versa for next_angle + * gst-libs/gst/codecs/gstav1decoder.c: + av1decoder: Fix wrong spatial layer validation + Highest spatial id and temporal id is independent, and should not drop + temporal enhance layer by the previous condition. Note that + the decision for dropping OBU based on operation point is being + handled in gst_av1_parser_identify_one_obu() already. + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1585 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3430> -2009-05-05 16:54:39 +0200 Arnout Vandecappelle <arnout@mind.be> +2022-11-18 01:43:26 +0900 Seungha Yang <seungha@centricular.com> - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: don't leak the config data - Clear the config data when going to READY or when disposed. - Fixes #581427 + * gst-libs/gst/codecparsers/gstav1parser.c: + av1parser: Don't print warning for expected OBU drop + Dropping an OBU which is not in selected operation point is an + expected condition. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3430> -2009-05-05 16:48:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-11-18 01:41:33 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpmanager/gstrtpssrcdemux.c: - rtpssrcdemux: drop unexpected RTCP packets - We usually only get SR packets in our chain function but if an invalid packet - contains the SR packet after the RR packet, we must not fail but simply ignore - the malformed packet. - Fixes #581375 + * gst-libs/gst/codecparsers/gstav1parser.c: + av1parser: Remove impossible condition + unsigned integer cannot be negative + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3430> + +2022-11-19 19:22:17 +1100 Jan Schmidt <jan@centricular.com> -2009-05-04 22:09:05 +0100 Zaheer Abbas Merali <zaheer@localhost.localdomain> + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: Remove queue after rtpfunnel + The original BUNDLE support commit placed a queue after the + rtpfunnel that combines streams, but I don't see a good reason for + it. It has default settings, so if network output is slow might + accidentally store up to 1 second of pending data, increasing + latency. + Remove it in favour of doing any necessary buffering before + webrtcbin. If it turns out that there is a reason for it to + exist, the limits should probably be configurable and small. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3437> - * gst/mpegdemux/mpegtsparse.c: - * gst/mpegdemux/mpegtsparse.h: - mpegtsparse: Remember pids that are meant to be stream pids. - Fixes #569781 +2022-11-19 04:42:56 +1100 Jan Schmidt <jan@centricular.com> -2009-05-04 12:37:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/webrtc/webrtc_fwd.h: + webrtc: Improve GstWebRTCStatsType docstring + Fix a typo of peer-connectiion -> peer-connection + Add a link to the w3c RTCStats type for a description + of what each statistics type is. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3434> - * ext/celt/gstceltenc.c: - celt: Implement preset interface +2022-11-19 04:42:20 +1100 Jan Schmidt <jan@centricular.com> -2009-05-04 12:36:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: Fix a typo in debug log + transceiever -> transceiver + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3434> - * ext/dirac/gstdiracenc.cc: - dirac: Implement preset interface +2022-11-13 03:07:54 +0900 Seungha Yang <seungha@centricular.com> -2009-05-04 12:34:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * sys/qsv/plugin.cpp: + qsv: Promote encoder rank to PRIMARY on Windows + QSV is very well integrated with GstD3D11 infrastructure on Windows, + and this is the recommended H/W encoder element over the MediaFoundation + plugins on Intel GPU system. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3393> - * ext/jp2k/gstjasperenc.c: - jp2kenc: Implement preset interface +2022-11-15 13:50:13 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> -2009-05-04 12:33:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/v4l2codecs/gstv4l2format.c: + video: Add arbitrary tile dimensions support + In current tile representation, only tiles with power of two + width and height in bytes are supported. This limitation + prevents adding more complex tiles formats. + In this patch, we deprecate tile_ws and tile_hs from GstVideoFormatInfo and + replace if with an array of GstVideoTileInfo. Each plane tiles are then + described with their pixels width/height, line stride and total size. + The helper gst_video_format_info_get_tile_sizes() that depends on the + deprecated API is also being removed. This can simply be removed as it wasn't + in any stable release yet. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3424> - * ext/mpeg2enc/gstmpeg2enc.cc: - mpeg2enc: Implement Preset interface +2020-08-31 14:04:54 +0200 Johan Sternerup <johast@axis.com> -2009-05-04 12:31:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * ext/webrtc/gstwebrtcbin.c: + * gst-libs/gst/webrtc/ice.c: + * gst-libs/gst/webrtc/ice.h: + * gst-libs/gst/webrtc/nice/nice.c: + webrtcbin: Add settings for HTTP proxy + Pass this to libnice which has a simple HTTP 1.0 proxy with basic + authentication only. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2867> - * ext/xvid/gstxvidenc.c: - xvid: Implement Preset interface +2021-10-20 13:02:31 +0300 Vivia Nikolaidou <vivia@ahiru.eu> -2009-05-04 12:30:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst/mpegtsdemux/tsdemux.c: + tsdemux: Add pad-name to warning for continuity mismatch + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3141> - * ext/faac/gstfaac.c: - faac: Implement preset interface +2022-05-02 19:13:41 +0200 Enrique Ocaña González <eocanha@igalia.com> -2009-05-03 17:42:44 +0100 Vincent Genieux <mutex@runbox.com> + * ext/hls/gsthlsdemux.c: + * ext/hls/gsthlsdemux.h: + * ext/hls/m3u8.c: + * ext/hls/m3u8.h: + * tests/check/elements/hlsdemux_m3u8.c: + hlsdemux: Expose EXT-X-PROGRAM-DATE-TIME as tags. + This allows an application to use timestamps associated + with fragments. + Patch by: Thomas Bluemel <tbluemel@control4.com> + See: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/195 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1417> - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtspacketizer.h: - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: Ignore subtable extension when parsing PAT - Fixes #569673. +2022-11-16 19:39:47 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-05-03 17:21:22 +0100 Vincent Genieux <mutex@runbox.com> + * sys/va/gstvabaseenc.c: + vabaseenc: Reduce logging noise if finish_frame fails. + Fixes: #1579 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3423> - * gst/mpegdemux/mpegtsparse.c: - * gst/mpegdemux/mpegtsparse.h: - mpegtsparse: make safe changing the program-numbers property dynamically - Fixes #569437. +2022-11-13 03:28:23 +0900 Seungha Yang <seungha@centricular.com> -2009-05-03 14:28:51 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * sys/amfcodec/plugin.cpp: + amfcodec: Promote encoder rank to PRIMARY + This H/W encoder implementation is the recommended element + on AMD system over the MediaFoundation one. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3394> - * ext/libmms/gstmms.c: - mms: extend BaseSrc query handling rather than overriding +2022-11-02 14:45:51 +0100 Edward Hervey <edward@centricular.com> -2009-04-27 22:39:15 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + * gst/mpegtsdemux/tsdemux.c: + tsdemux: Push GST_EVENT_STREAM_COLLECTION + Demuxers that are not streams-aware will have that handled by parsebin. This + created a difference in results downstream between streams-aware and + non-streams-aware demuxers + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2784> - * gst/aacparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.c: - * gst/flacparse/gstbaseparse.c: - baseparse: fix (regression in) newsegment handling - (aacparse, amrparse, flacparse). Fixes #580133. +2022-11-14 15:53:00 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> -2009-05-02 12:23:03 +0100 Zaheer Merali <zaheerabbas@merali.org> + * sys/v4l2codecs/gstv4l2codech264dec.c: + * sys/v4l2codecs/gstv4l2codech265dec.c: + * sys/v4l2codecs/gstv4l2codecmpeg2dec.c: + * sys/v4l2codecs/gstv4l2codecvp8dec.c: + * sys/v4l2codecs/gstv4l2codecvp9dec.c: + v4l2codecs: Allow output caps to be updated + This change allow output caps to be updated even though we stay in + streaming state. This is needed so that any upstream updated to fields + like framerate, hdr data, etc. can result in a downstream caps event + being pushed. + Previously, any of these changes was being ignored and the downstream + caps would not reflect it. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3328> - * sys/dvb/gstdvbsrc.c: - dvbsrc: fix pes filter pid resetting +2022-11-05 21:06:39 +0900 Seungha Yang <seungha@centricular.com> -2009-05-01 02:26:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + * sys/nvcodec/gstnvav1dec.c: + * sys/nvcodec/gstnvdecoder.c: + * sys/nvcodec/gstnvdecoder.h: + * sys/nvcodec/gstnvh264dec.c: + * sys/nvcodec/gstnvh265dec.c: + * sys/nvcodec/gstnvvp8dec.c: + * sys/nvcodec/gstnvvp9dec.c: + nvdecoder: Handle input caps change + Update output caps if it's notified by baseclass + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3328> - * ext/dts/gstdtsdec.h: - dtsdec: cosmetic fix to header structure to make gtk-doc happy +2022-11-05 21:00:43 +0900 Seungha Yang <seungha@centricular.com> -2009-05-01 14:25:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + * sys/nvcodec/gstnvav1dec.c: + * sys/nvcodec/gstnvdecoder.c: + * sys/nvcodec/gstnvdecoder.h: + * sys/nvcodec/gstnvh264dec.c: + * sys/nvcodec/gstnvh265dec.c: + * sys/nvcodec/gstnvvp8dec.c: + * sys/nvcodec/gstnvvp9dec.c: + nvdecoder: Don't hold decoder output state + It's not referenced by this implementation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3328> - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/debugutils/fpsdisplaysink.c: - docs: make fpsdisplaysink show up in the docs +2022-11-05 20:16:21 +0900 Seungha Yang <seungha@centricular.com> -2009-05-01 02:21:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + * tests/examples/codecs/decoder-caps-update.cpp: + * tests/examples/codecs/meson.build: + * tests/examples/meson.build: + examples: Add test code to verify decoder caps update + Sample command lines + * Configures pipeline with video encoder + decoder-caps-update \ + --encoder="video/x-raw,format=NV12 ! qsvh264enc" \ + --decoder=d3d11h264dec \ + --videosink=d3d11videosink + * Playing exisiting file + decoder-caps-update \ + --location=test_file.mp4 \ + --decoder=d3d11h264dec \ + --videosink=d3d11videosink + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3328> - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/fpsdisplaysink.h: - fpsdisplaysink: move private struct into plugin struct and use Gst namespace +2022-11-05 02:47:54 +0900 Seungha Yang <seungha@centricular.com> -2009-05-01 01:59:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + * sys/d3d11/gstd3d11av1dec.cpp: + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/gstd3d11decoder.h: + * sys/d3d11/gstd3d11h264dec.cpp: + * sys/d3d11/gstd3d11h265dec.cpp: + * sys/d3d11/gstd3d11mpeg2dec.cpp: + * sys/d3d11/gstd3d11vp8dec.cpp: + * sys/d3d11/gstd3d11vp9dec.cpp: + d3d11decoder: Handle input caps change + Update output caps if it's notified by baseclass + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3328> - * docs/plugins/inspect/plugin-debugutilsbad.xml: - * gst/debugutils/Makefile.am: - * gst/debugutils/debugutilsbad.c: - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: rename plugin (not element) to debugutilsbad - Makes it easier to add further utils here without creating yet another plugin. +2022-11-05 01:07:02 +0900 Seungha Yang <seungha@centricular.com> -2009-05-01 14:28:23 +0100 Zaheer Merali <zaheerabbas@merali.org> + * gst-libs/gst/codecs/gstav1decoder.c: + * gst-libs/gst/codecs/gstav1picture.c: + * gst-libs/gst/codecs/gstav1picture.h: + * gst-libs/gst/codecs/gsth264decoder.c: + * gst-libs/gst/codecs/gsth264picture.c: + * gst-libs/gst/codecs/gsth264picture.h: + * gst-libs/gst/codecs/gsth265decoder.c: + * gst-libs/gst/codecs/gsth265picture.c: + * gst-libs/gst/codecs/gsth265picture.h: + * gst-libs/gst/codecs/gstmpeg2decoder.c: + * gst-libs/gst/codecs/gstmpeg2picture.c: + * gst-libs/gst/codecs/gstmpeg2picture.h: + * gst-libs/gst/codecs/gstvp8decoder.c: + * gst-libs/gst/codecs/gstvp8picture.c: + * gst-libs/gst/codecs/gstvp8picture.h: + * gst-libs/gst/codecs/gstvp9decoder.c: + * gst-libs/gst/codecs/gstvp9picture.c: + * gst-libs/gst/codecs/gstvp9picture.h: + codecs: Keep track of non-decoding-essential input state change + In theory, input caps can be updated anytime at non-keyframe or + sequence boundary, such as HDR10 metadata, framerate, aspect-ratio + or so. Those information update might not trigger ::new_sequence() + or subclass may ignore the changes. + By this commit, input state change will be tracked by baseclass + and subclass will be able to know the non-decoding-essential + update by checking the codec specific picture struct + on ::output_picture() + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3328> - * sys/dvb/gstdvbsrc.c: - dvbsrc: unset pid filters correctly +2022-11-16 09:42:08 +0100 Edward Hervey <bilboed@bilboed.com> -2009-04-30 14:43:36 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> + * gst/mpegtsdemux/mpegtspacketizer.c: + Revert "mpegtspacketizer: memcmp potentially seen_before data" + This reverts commit fcad4cc646a23e4e621ec5e8485958ab78d98090. + This was wrong is so many ways. + * The memcmp was badly used (it should use == 0 to check the data is identical, + and not != 0) + * There was no boundary checks on the present stream section_data when passing + it to memcmp. + * The return value should have been TRUE (i.e. we have done all checks, none of + them failed, therefore the section has been seen before) + * stream->section_data would *always* be NULL if the section had already been + processed + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1559 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3421> - * gst/qtmux/gstqtmuxmap.c: - qtmux: changes caps of src pads to video/quicktime, variant=something - Take a look at bug #580005 for further info. +2022-11-16 09:29:59 +0100 Edward Hervey <edward@centricular.com> -2009-04-30 17:29:35 +0100 Christian Schaller <christian.schaller@collabora.co.uk> + * gst/mpegtsdemux/mpegtsbase.c: + mpegts: Check is program is identical before updating + There is no need to update the program if it's identical :) + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3421> - Merge branch 'master' of ssh://uraeus@git.freedesktop.org/git/gstreamer/gst-plugins-bad +2022-11-16 03:15:44 +0900 Seungha Yang <seungha@centricular.com> -2009-04-30 17:28:47 +0100 Christian Schaller <christian.schaller@collabora.co.uk> + * gst/codectimestamper/gstcodectimestamper.c: + * gst/codectimestamper/gstcodectimestamper.h: + codectimestamper: Remove duplicated GstSegment struct + Use the one in priv struct. And use gst_segment_is_equal() + to compare GstSegment + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3380> - * gst-plugins-bad.spec.in: - Update for new presets file +2022-11-09 18:03:48 +1100 Matthew Waters <matthew@centricular.com> -2009-04-30 17:08:52 +0100 Tristan Matthews <le.businessman@gmail.com> + * gst/codectimestamper/gstcodectimestamper.c: + * tests/check/elements/h264timestamper.c: + * tests/check/meson.build: + h264/5timestamper: provide a workaround for h264/5parse producing pts=NONE buffers + A workaround for + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/649 + and + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/287 + which is hard to change baseparse behaviour for both video and audio + parsers. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3380> - * gst/debugutils/fpsdisplaysink.c: - fpsdisplaysink: init variable to NULL to avoid compiler warning - Fixes #580901. +2022-11-12 06:16:59 +0900 Seungha Yang <seungha@centricular.com> -2009-04-30 14:20:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + nvcodec: Update plugin cache + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3389> - * gst/dvdspu/gstdvdspu-render.c: - * gst/dvdspu/gstdvdspu.h: - dvdspu: do some basic clipping - Add some basic clipping of the subtitle region when the subtitle is bigger than - the image we should put it on. +2022-11-12 05:45:15 +0900 Seungha Yang <seungha@centricular.com> -2009-04-30 14:18:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + * tests/check/elements/cudaconvert.c: + tests: cudaconvert: Update test code + Adding more formats, and rescale test with borders + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3389> + +2022-11-12 04:48:50 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstcudaconvertscale.c: + cudaconvertscale, cudascale: Add "add-borders" property and support 8bits RGB planar formats + Adding "add-borders" property which is identical to that of + videoscale and this will be enabled by default. + And adding RGBP/BGRP/GBR/GBRA format support. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3389> - * gst/dvdspu/gstdvdspu.c: - dvdspu: don't EOS when the subtitle got EOS - Don't forward the EOS on the subtitle pad as the video might still be running. +2022-11-12 04:06:32 +0900 Seungha Yang <seungha@centricular.com> -2009-04-30 13:45:30 +0300 Stefan Kost <ensonic@users.sf.net> + * sys/nvcodec/cuda-converter.c: + * sys/nvcodec/cuda-converter.h: + * sys/nvcodec/gstcudaconverter.c: + * sys/nvcodec/gstcudaconverter.h: + * sys/nvcodec/gstcudaconvertscale.c: + * sys/nvcodec/meson.build: + cuda: Rewrite colorspace/rescale object + Rewriting GstCudaConverter object, since the old implementation was not + well organized and it's hard to add new features. + Moreover, the conversion operations were not very optimized. + Major change of this implementation: + * Remove redundant intermediate conversion operations such as + any RGB -> ARGB(64) conversion or any YUV -> Y444 (or 16bits Y444). + That's not required most of cases. The only required case is + converting 24bits (such as RGB/BGR) packed format to 32bits format + because CUDA texture object does not support sampling 24bits format + * Use normalized sample fetching (i.e., 0, 1 range float value) + and also normalized coordinates system for CUDA texture. + It's consistent with the other graphics APIs such as Direct3D + and OpenGL, that makes sampling operations much easier. + * Support a kind of viewport and adopt math for colorspace conversion + from GstD3D11 implementation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3389> + +2022-11-10 19:38:03 +0900 Seungha Yang <seungha@centricular.com> + + * gst-libs/gst/cuda/gstcudamemory.c: + * sys/nvcodec/gstcudaformat.h: + cudaupload,cudadownload: Add support for planar 8bits RGB formats + Defines RGBP, BGRP, and GBR formats, which have the same memory + layout as already supported Y444. And defines GBRA format as well + which needs just one additional alpha plane + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3389> + +2022-11-10 20:47:44 +0900 Seungha Yang <seungha@centricular.com> + + * gst-libs/gst/cuda/gstcudacontext.c: + cudacontext: Store texture alignment + it was missed in the previous refactoring + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3389> - * gst/debugutils/fpsdisplaysink.c: - fpsdisplay: code cleanup and plug overlay as needed - Pluggin the text-ovelay causes some slowdowns and might need a colorspace - converter. We now only check the text-overlay property whne goint to ready and - plug or unplug the text-overlay at that time. If the property changes during - playing, its not switched immediately. +2022-11-12 04:01:08 +0900 Seungha Yang <seungha@centricular.com> -2009-04-30 00:06:36 +0300 Stefan Kost <ensonic@users.sf.net> + * sys/nvcodec/gstcudabasefilter.c: + * sys/nvcodec/gstcudabasefilter.h: + * sys/nvcodec/gstcudaconvert.c: + * sys/nvcodec/gstcudaconvert.h: + * sys/nvcodec/gstcudaconvertscale.c: + * sys/nvcodec/gstcudaconvertscale.h: + * sys/nvcodec/gstcudafilter.c: + * sys/nvcodec/gstcudascale.c: + * sys/nvcodec/gstcudascale.h: + * sys/nvcodec/meson.build: + cudaconvert, cudascale: Port to GstCudaBaseCovert baseclass + Don't need to hold duplicated code in the source tree + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3389> - * ext/x264/GstX264Enc.prs: - * ext/x264/Makefile.am: - * ext/x264/gstx264enc.c: - x264enc: add preset support - Add preset iface and a (dummy) preset file as a starting point. +2022-11-09 21:31:01 +0900 Seungha Yang <seungha@centricular.com> -2009-04-26 21:26:00 +0100 Jan Schmidt <thaytan@noraisin.net> + * sys/nvcodec/gstcudabasefilter.h: + * sys/nvcodec/gstcudaconvertscale.c: + * sys/nvcodec/gstcudaconvertscale.h: + * sys/nvcodec/gstcudafilter.c: + * sys/nvcodec/meson.build: + cuda: Add convertscale element + GstCudaConverter object can do colorspace conversion and scale at once. + Adding new element "cudaconvertscale" to do that, this can + save unnecessary GPU operation if colorspace conversion and + rescale is required for given input stream format. + Most of codes are taken from d3d11convert element + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3389> - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/rsnaudiodec.c: - * ext/resindvd/rsnaudiomunge.c: - resindvd: Convert some g_print to GST_LOG_OBJECT and friends, remove some others - Trim down the g_print verbosity. +2022-11-10 14:39:12 +0800 Elliot Chen <elliot.chen@nxp.com> -2009-04-26 21:29:27 +0100 Jan Schmidt <thaytan@noraisin.net> + * gst-libs/gst/play/gstplay.c: + gstplay: add warning message details check before post it + For some warning message which has no detail data, need check to avoid printing critical log. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3382> - * ext/resindvd/resindvdsrc.c: - resindvd: Add DVDFASTSTART env var to making some testing easier +2021-10-14 11:56:58 +0200 Rafał Dzięgiel <rafostar.github@gmail.com> -2009-04-24 14:08:55 +0100 Jan Schmidt <thaytan@noraisin.net> + * tests/check/elements/dash_mpd.c: + tests: Add DASH MPD baseURL with query test + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1147> - * ext/resindvd/gstmpegdemux.c: - resindvd: Remove redundant modulo operation in the demuxer +2021-10-14 10:12:51 +0200 Rafał Dzięgiel <rafostar.github@gmail.com> -2009-04-24 14:07:30 +0100 Jan Schmidt <thaytan@noraisin.net> + * ext/dash/gstmpdparser.c: + mpdparser: Fix missing baseURL query + When no initializationURL or mediaURL, return baseURL that also + contains original URI query if available. This fixes a problem + where URI query was being omitted in the HTTP requests. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1147> - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/resindvdsrc.c: - resindvd: Map audio and subpicture logical streams to physical. - The logical audio and subpicture stream number doesn't always correspond - with the physical substream it is coming from. When configuring the demuxer - pads, use the mapping table provided in each PGC to get the layout and - ensure the demuxer creates the correct pads. +2021-10-14 10:09:31 +0200 Rafał Dzięgiel <rafostar.github@gmail.com> -2009-04-29 18:52:20 +0100 Tristan Matthews <le.businessman@gmail.com> + * ext/dash/gstmpdclient.c: + * ext/dash/gstmpdparser.c: + * ext/dash/gstmpdparser.h: + mpdparser: Be consistent about returning duplicated URL + Instead of returning a "const gchar" or a "gchar" that should not be freed, always + return a duplicated string as those functions were used together with g_strdup anyway. + This is needed to prepare support for returning modified strings in next commit. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1147> - * gst/flv/gstflvmux.c: - flvmux: init variable to NULL to fix compiler warning - Fixes #580786. +2021-10-14 10:18:40 +0200 Rafał Dzięgiel <rafostar.github@gmail.com> -2009-04-29 16:57:36 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + * ext/dash/gstmpdparser.c: + mpdparser: Return correct mediaURL value + This fixes a problem where get_mediaURL was returning NULL when segmentURL + was unavailable instead of baseURL as a fallback. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1147> - * ext/x264/gstx264enc.c: - x264enc: add some documentation on profile +2022-11-13 02:08:15 +0900 Seungha Yang <seungha@centricular.com> -2009-04-29 13:56:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/d3d11/gstd3d11converter.cpp: + d3d11converter: Fix YUY2 conversion error + Always configure shader conversion path, then fallback to the + shader path if processor is not available + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3392> - * gst/flv/gstflvmux.c: - * gst/flv/gstflvparse.c: - flv: Set/require the framed/parsed fields of the audio/mpeg caps to TRUE +2022-11-12 22:55:52 +0900 Seungha Yang <seungha@centricular.com> -2009-04-29 13:16:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * gst-libs/gst/d3d11/gstd3d11-private.h: + * gst-libs/gst/d3d11/gstd3d11converter.cpp: + * gst-libs/gst/d3d11/gstd3d11device.cpp: + * tests/check/elements/d3d11colorconvert.c: + d3d11: Add support for planar RGB formats + Adding RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, and + GBRA_12LE format support + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3392> + +2022-11-13 02:28:42 +0900 Seungha Yang <seungha@centricular.com> - * gst/flv/gstflvmux.c: - flv: Always write at least the minimal tags and write the PAR as tags + * docs/plugins/gst_plugins_cache.json: + d3d11screencapturesrc: Update plugin cache + Missed in + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3360 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3392> -2009-04-29 13:03:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-11-15 00:11:15 +1100 Jan Schmidt <jan@centricular.com> - * gst/flv/gstflvmux.c: - * gst/flv/gstflvmux.h: - flv: Add support for muxing some tags + * ext/aes/gstaesdec.c: + aesdec: Fix padding removal for per-buffer-padding=FALSE + When per-buffer-padding is FALSE, the OpenSSL context needs + to be told to remove any padding at the end of the ciphertext + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1243 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3406> -2009-04-29 13:03:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-11-12 09:16:36 +0100 Edward Hervey <edward@centricular.com> - * gst/flv/gstflvparse.c: - flv: Add support for title tag + * gst/transcode/gsttranscodebin.c: + transcodebin: Use const arguments for clarity + And rename it when it classhes with existing local variable + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3390> -2009-04-29 09:40:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-11-12 09:15:23 +0100 Edward Hervey <edward@centricular.com> - * gst/flv/gstflvparse.c: - flv: Fix parsing of tags and add new mappings - We shouldn't register a new GstTag for every unknown tag - we find as this might lead to conflicts and also those - tags are essentially unknown. - Add mappings for some known tags and also convert string - dates to GDate, as found in many FLV files. + * gst/transcode/gsttranscodebin.c: + transcodebin: Don't leak GstStream + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3390> -2009-04-28 16:10:21 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-11-12 08:35:27 +0100 Edward Hervey <edward@centricular.com> - * gst/rtpmux/gstrtpmux.c: - rtpmux: Reject wrong caps + * gst/transcode/gsttranscodebin.c: + transcode: Don't leak caps + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3390> -2009-04-28 16:03:19 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-11-12 08:35:12 +0100 Edward Hervey <edward@centricular.com> - * gst/rtpmux/gstrtpmux.c: - rtpmux: Fix leak Fixed a leak discovered by Laurent Glayal <spegle@yahoo.fr> + * gst/transcode/gst-cpu-throttling-clock.c: + transcode: Don't leak timer + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3390> -2009-04-28 15:58:41 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-11-11 14:37:17 +0100 Edward Hervey <edward@centricular.com> - * gst/rtpmux/gstrtpmux.c: - rtpmux: Fix leak - Fixed a leak discovered by Laurent Glayal <spegle@yahoo.fr> + * gst/mpegtsdemux/mpegtsbase.c: + mpegtsbase: Don't leak GList + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3390> -2009-04-27 11:09:08 +0200 Olivier Crete <olivier.crete@collabora.co.uk> +2022-11-12 10:04:39 +0100 Edward Hervey <edward@centricular.com> - * gst/rtpmanager/rtpsource.c: - rtpsouce: make WARNING into LOG - Since neither rtpmanager nor any of the payloaders properly implement - pad allocation, there is no way for the rtpmanager to inform downstream elements - of the new SSRC if there is an SSRC collision. So the warning is emitted all the - time and it is confusing. - Fixes #580144 + * gst/transcode/gsturitranscodebin.c: + uritranscodebin: Don't leak uris, profile, sinkpad and filters + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3390> -2009-04-27 11:06:01 +0200 Olivier Crete <olivier.crete@collabora.co.uk> +2022-11-12 10:04:26 +0100 Edward Hervey <edward@centricular.com> - * gst/rtpmanager/rtpsession.c: - rtpsession: notify when SSRC changes - Emit a g_object_notify when the SSRc changes because of a collision. - Fixes #580144 + * gst/transcode/gsttranscodebin.c: + transcodebin: Don't leak profile + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3390> -2009-04-27 10:04:51 +0100 Christian Schaller <christian.schaller@collabora.co.uk> +2022-11-12 10:03:48 +0100 Edward Hervey <edward@centricular.com> - * gst-plugins-bad.spec.in: - * gst/dccp/Makefile.am: - Add new plugin to spec file and add missing header to gst/dccp/Makefile.am + * gst/transcode/gsttranscodebin.c: + transcodebin: Actually free the TranscodingStream structure + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3390> -2009-04-25 00:44:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> +2022-11-12 10:02:53 +0100 Edward Hervey <edward@centricular.com> - * tests/check/elements/.gitignore: - * tests/check/pipelines/.gitignore: - tests: make git ignore new unit tests binaries + * gst-libs/gst/transcoder/gsttranscoder.c: + transcoder: Don't leak API bus and GMainLoop + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3390> -2009-04-25 00:42:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> +2022-11-10 03:23:53 +0900 Seungha Yang <seungha@centricular.com> - * win32/MANIFEST: - win32: dist libgstdshow.def by adding it to win32/MANIFEST - Fixes #578563. + * sys/d3d11/meson.build: + meson: d3d11: Clarify the message for WGC support check + Even Windows10 SDK seems to have required symbols depending on installed + SDK version + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3376> + +2022-11-10 02:49:38 +0900 Seungha Yang <seungha@centricular.com> + + * sys/d3d11/gstd3d11winrtcapture.cpp: + d3d11screencapturesrc: Fix build error with MSVC x86 + Delete the code for now. Note that the code block is unnecessary already + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3375> -2009-04-24 18:53:36 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br> +2022-11-10 14:31:43 +1100 Matthew Waters <matthew@centricular.com> - * gst/qtmux/gstqtmuxmap.c: - mp4mux: Changes src caps to application/x-iso-mp4 - Fixes #580005 + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/webrtcdatachannel.c: + * ext/webrtc/webrtcdatachannel.h: + webrtc/datachannel: handle error messages from appsrc/sink + Fixes a possible race where closing a data channel may produce e.g. + not-linked errors. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3381> -2009-04-24 16:01:44 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-11-10 14:22:30 +1100 Matthew Waters <matthew@centricular.com> - * win32/common/config.h: - win32: Commit the win32 config with bumped version number. - Should have committed this when I unfroze the build last time, sorry. + * ext/sctp/gstsctpdec.c: + sctpdec: fix stream reset (src pad removal) if no data is ever received + If we don't receive any data from usrsctp, then there will be no src pad + for the stream id and the stream reset will fail to remove the relevant + src pad. Workaround by first attempting to add the relevant src pad, then + almost immediately removing it. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3381> -2009-04-24 14:51:00 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-07-19 17:42:12 +0800 He Junyan <junyan.he@intel.com> - * tests/check/Makefile.am: - check: exclude rsndvdbin from the states test + * tests/check/libs/h264bitwriter.c: + * tests/check/libs/h265bitwriter.c: + test: Correct the test suite name of the h264 and h265 bitwriter. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3384> -2009-04-24 15:42:27 +0300 Stefan Kost <ensonic@users.sf.net> +2022-10-10 19:58:12 +0100 Colin Kinloch <colin.kinloch@collabora.com> - * configure.ac: - soundtouch: fix configure to use proper shell syntax. fixes #580091 + * sys/va/gstvavpp.c: + videocrop, videobox: Simplify navigation event handling and support touch events + Signed-off-by: Colin Kinloch <colin.kinloch@collabora.com> + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3053> -2009-04-23 17:33:25 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-09-23 19:29:31 +0100 Colin Kinloch <colin.kinloch@collabora.com> - * configure.ac: - soundtouch: Fix compilation on newer libSoundTouch - Newer libsoundtouch requires that we include an extra header that wasn't - previously required, so define HAVE_SOUNDTOUCH_1_4 for newer builds so that it - gets included. + * sys/va/gstvavpp.c: + va: Fix vapostproc navigation event co-ordinate mapping + Signed-off-by: Colin Kinloch <colin.kinloch@collabora.com> + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3053> -2009-04-20 11:38:01 +0300 Stefan Kost <ensonic@users.sf.net> +2022-09-19 18:05:28 +0100 Colin Kinloch <colin.kinloch@collabora.com> - * gst/debugutils/fpsdisplaysink.c: - fpsdisplay: more cleanups - Use normal gst-defines in PLUGIN_DEFINE. Shorten _start/stop method names. - More ideas. Move debug category-init down to plugin-init. + * sys/va/gstvavpp.c: + va: Use gst_video_orientation_from_tag to parse orientation + Signed-off-by: Colin Kinloch <colin.kinloch@collabora.com> + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3053> -2009-04-20 09:51:50 +0300 Stefan Kost <ensonic@users.sf.net> +2022-09-07 16:26:22 +0800 Tong Wu <tong1.wu@intel.com> - * gst/debugutils/fpsdisplaysink.c: - fpsdisplay: use a nicer font family + * sys/msdk/gstmsdkvpp.c: + msdkvpp: delete the macros to make video memory work on Windows + Since gst_msdk_import_to_msdk_surface has been implemented for d3d11, we + delete the macros to make it work on Windows. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3231> -2009-04-20 10:24:37 +0300 Stefan Kost <ensonic@users.sf.net> +2022-09-07 15:29:37 +0800 Tong Wu <tong1.wu@intel.com> - * gst/debugutils/fpsdisplaysink.c: - fpsdisplay: various cleanups, docs and comments - Remove unused base_init. Add basic doc blob. Reuse query object. Rename - variables for clarity. Add comments and ToDos. + * sys/msdk/gstmsdkvpp.c: + msdkvpp: modify the way of copying system memory to msdk surface + Replace video_copy with memcpy to fix the issue when the sizes of the + src frame and dst frame don't match. Moreover, for Windows, you have to + do the copy first and call gst_msdk_import_to_msdk_surface later. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3231> -2009-04-20 09:49:32 +0300 Stefan Kost <ensonic@users.sf.net> +2022-09-07 10:55:57 +0800 Tong Wu <tong1.wu@intel.com> - * gst/debugutils/fpsdisplaysink.c: - fpsdisplay: remove iface proxy - When we get bus messages for setting the xid, we have the real sink element - instance as message_src. No need to proxy the xoverlay iface therefore - (autovideosink does not do it either). Also we don't need to rewrite the - message src of all messages from that sink. + * sys/msdk/gstmsdkvpp.c: + msdkvpp: add d3d11 support during negotiation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3231> -2009-04-23 11:04:46 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-09-02 16:03:09 +0800 Tong Wu <tong1.wu@intel.com> - * gst/selector/gstinputselector.c: - input-selector: Forward segment events for the active pad immediately. - When a segment event is received on the active pad, forward it downstream - immediately instead of deferring it until the next data buffer arrives. This - fixes problems with segment updates never being sent downstream, like those - needed for sparse streams, or for closing previously opened segments. - This fixes playback of DVD menus with a still video frame and an audio track, - for example. - Fixes: #577843 + * sys/msdk/gstmsdkvpp.c: + msdkvpp: add d3d11 video memory to sink and src caps + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3231> -2009-04-22 18:01:07 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-09-07 10:44:16 +0800 Tong Wu <tong1.wu@intel.com> - * gst/rtpmux/gstrtpmux.c: - rtpmux: Fix warning + * sys/msdk/gstmsdkvpp.c: + * sys/msdk/gstmsdkvpp.h: + msdkvpp: delete use_sinkpad_va and use_srcpad_va + This two variables are no longer useful. Delete them for now. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3231> -2009-04-20 20:00:15 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-08-26 16:19:33 +0800 Tong Wu <tong1.wu@intel.com> - * gst/rtpmux/gstrtpmux.c: - rtpmux: Set different caps depending on the input - -2009-04-22 16:25:07 -0400 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmux/gstrtpmux.c: - rtpmux: Only free pad private when pad is disposed - -2009-04-22 19:52:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/flv/gstflvdemux.c: - * gst/flv/gstflvdemux.h: - * gst/flv/gstflvmux.c: - * gst/flv/gstflvmux.h: - flv: Add documentation to flvmux and flvdemux - Partially fixes bug #573737. - -2009-04-22 19:45:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfmux.h: - mxf: Mark most fields of the instance struct as private - -2009-04-22 19:43:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/deinterlace2/gstdeinterlace2.c: - * gst/deinterlace2/gstdeinterlace2.h: - deinterlace2: Add documentation and integrate into the build system - -2009-04-22 19:24:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-amrwb.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-assrender.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-deinterlace2.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-flv.xml: - * docs/plugins/inspect/plugin-fpsdisplaysink.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xdgmime.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - * gst/mxf/mxfmux.c: - mxf: Add documentation to mxfmux and update the docs + * sys/msdk/gstmsdkenc.c: + msdkenc: modify the way of copying system memory to msdk surface + Replace video_copy with memcpy to fix the issue when the sizes of the + src frame and dst frame don't match. Moreover, for Windows, you have to + do the copy first and call gst_msdk_import_to_msdk_surface later. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3231> -2009-03-19 15:37:17 -0700 LRN <lrn1986@gmail.com> +2022-10-17 17:01:18 +0800 Tong Wu <tong1.wu@intel.com> - * ext/modplug/gstmodplug.cc: - modplug: Use correct header file - modplug's sndfile.h conflicts with libsndfile's sndfile.h, so - we'll access it directly using modplug/sndfile.h. Fixes #573849 - Signed-off-by: David Schleef <ds@schleef.org> + * sys/msdk/gstmsdkallocator.h: + * sys/msdk/gstmsdkallocator_d3d.c: + * sys/msdk/gstmsdkenc.c: + msdkallocator_d3d: add d3d11 video memory and import it to msdk surface + This patch introduces d3d11 texture and index to GstMsdkMemoryID and + implements gst_msdk_import_to_msdk_surface in order to wrap the surface + to mfxMemId. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3231> -2009-03-19 15:29:04 -0700 LRN <lrn1986@gmail.com> +2022-08-26 14:13:36 +0800 Tong Wu <tong1.wu@intel.com> - * m4/gst-sdl.m4: - sdl: Use SDL static-libs for conftest - Fixes: #573847. This fixes building with SDL on Windows. - Signed-off-by: David Schleef <ds@schleef.org> + * sys/msdk/gstmsdkallocator_d3d.c: + msdkallocator_d3d: implement GetHDL callback function + During encoding process, oneVPL runtime will call GetHDL callback function. + This patch implements this function for the use of msdk. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3231> -2009-03-19 14:55:26 -0700 LRN <lrn1986@gmail.com> +2022-10-17 16:48:15 +0800 Tong Wu <tong1.wu@intel.com> - * ext/mpeg2enc/gstmpeg2encoptions.cc: - mpeg2enc: Get number of processors on win32 - Fixes #573848. - Signed-off-by: David Schleef <ds@schleef.org> + * sys/msdk/gstmsdkallocator.h: + * sys/msdk/gstmsdkallocator_libva.c: + * sys/msdk/gstmsdkallocator_libva.h: + * sys/msdk/gstmsdkenc.c: + * sys/msdk/gstmsdkvpp.c: + msdkallocator: add a parameter to function gst_msdk_import_to_msdk_surface + Add a flags parameter to function gst_msdk_import_to_msdk_surface and + move the function declaration to gstmsdkallcator.h to prepare for adding + Windows implementation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3231> -2009-03-19 14:49:13 -0700 David Schleef <ds@schleef.org> +2022-08-19 13:51:11 +0800 Tong Wu <tong1.wu@intel.com> - * configure.ac: - soundtouch: Add pkgconfig check for soundtouch-1.4 - Fixes #573846. + * sys/msdk/gstmsdkenc.c: + * sys/msdk/gstmsdkenc.h: + msdkenc: add d3d11 pool during negotiation + This patch adds Windows specific set_format and propose_allocation + functions to enable creating d3d11 pools during negotiation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3231> -2009-02-26 14:18:54 -0800 David Schleef <ds@schleef.org> +2022-08-19 13:40:05 +0800 Tong Wu <tong1.wu@intel.com> - * gst/rawparse/gstrawparse.c: - * gst/rawparse/gstrawparse.h: - * gst/rawparse/gstvideoparse.c: - * gst/rawparse/gstvideoparse.h: - Add interlaced support to videoparse - Add a virtual method in rawparse to set buffer flags. This doesn't - use API from unreleased -base, since it defines GST_VIDEO_BUFFER_TFF - if it's not defined yet. + * sys/msdk/gstmsdkenc.c: + * sys/msdk/gstmsdkh265enc.c: + * sys/msdk/gstmsdkvp9enc.c: + * sys/msdk/msdk.h: + msdkenc: add D3D11 caps for msdkenc + This patch adds D3D11 feature to sink factory for msdkenc. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3231> -2009-04-21 22:13:12 +0100 Jan Schmidt <thaytan@noraisin.net> +2022-05-07 17:10:34 +0800 Tong Wu <tong1.wu@intel.com> - * common: - Automatic update of common submodule - From b3941ea to 6ab11d1 + * sys/msdk/gstmsdkcontext.c: + * sys/msdk/gstmsdkcontext.h: + * sys/msdk/gstmsdkcontextutil.c: + * sys/msdk/gstmsdkcontextutil.h: + * sys/msdk/gstmsdkdec.c: + * sys/msdk/gstmsdkenc.c: + * sys/msdk/gstmsdkvpp.c: + MSDK: Introduce d3d11 device to MSDK context + Currently MSDK context does not support d3d11va. Now introduce d3d11va + device to MSDK context, making it able to create msdk session with d3d11 + device and to easily share with upstream and donwstream. + Add environment variable to enable user to choose GPU device in multi-GPU + environment. This variable is only valid when there's no context + returned by upstream or downstream. Otherwise it will use the device + that created by upstream or downstream. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3231> -2009-04-21 13:27:29 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-05-07 16:28:50 +0800 Tong Wu <tong1.wu@intel.com> - Merge branch 'rtpmux-fixes' + * sys/msdk/meson.build: + MSDK: Add gst d3d11 lib into MSDK's dependency + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3231> -2009-04-21 16:48:39 +0200 Edward Hervey <bilboed@bilboed.com> +2022-11-09 14:59:41 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * ext/libmms/gstmms.c: - mmssrc: If the connection fails, emit a redirection msg to the rtsp equivalent. - This should help fix the issue with Windows Media Server using rtsp... but - still declaring the stream with mms:// + * sys/va/gstvafilter.c: + vafilter: Log out processed surfaces for debug. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3373> -2009-04-21 16:08:55 +0200 Edward Hervey <bilboed@bilboed.com> +2022-11-09 14:53:30 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Only error out at EOS push failure if we don't have any streams. - This should remove the bogus error messages while still keeping the original - intent of this, which is to inform the pipeline/application/user that we - could not find any valid streams. - There are many reasons why pushing an event can fail, and not all of them are - because there's no link downstream (it could be because it was blocked, or - flushing). + * sys/va/gstvadeinterlace.c: + * sys/va/gstvavpp.c: + vadeinterlace, vapostproc: Drop output buffer if process failed. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3373> -2009-04-10 19:24:26 +0200 Zaheer Abbas Merali <zaheer@localhost.localdomain> +2022-11-07 16:32:50 -0300 Daniel <daniel.almeida@collabora.com> - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: add hack specific for itvhd - itvhd masks its h264 video stream as a private stream making it harder for - other set top boxes to decode. this checks for specific program number, video - pid and stream type combination before declaring it as h264. + * docs/plugins/gst_plugins_cache.json: + * gst/debugutils/gstvideocodectestsink.c: + debugutils: videocodectestsink: add support for more formats + Add support for more formats so as to run the libvpx high bit depth test suite. + This means the files under CONFIG_VP9_HIGHBITDEPTH + This also allows running the yuv444p 8bit file in the regular 8 bit vp9 suite. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3356> -2009-04-10 19:06:55 +0200 Zaheer Abbas Merali <zaheer@localhost.localdomain> +2022-11-10 15:07:20 +0800 Elliot Chen <elliot.chen@nxp.com> - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: detect AC3 streams in PMT table - add 'has-ac3' boolean to pmt bus message + * gst-libs/gst/play/gstplay.c: + gstplay: fix segmentation fault caused by subtitle info update + For subtitle stream played by subrui, gstplay will update subtitle + information before select the stream by using playbin3. Need check + the subtitle_sid value to avoid segmentation fault. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3383> -2009-04-10 01:16:30 +0200 Zaheer Abbas Merali <zaheer@localhost.localdomain> +2022-11-09 14:16:23 +0100 Guillaume Desmottes <guillaume.desmottes@onestream.live> - * gst/mpegdemux/gstmpegtsdemux.c: - itv hd hack + * ext/gs/gstgssink.cpp: + gssink: add 'content-type' property + Useful when one wants to upload a video as `video/mp4` instead of + 'video/quicktime` for example. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3371> -2009-04-10 01:11:01 +0200 Zaheer Abbas Merali <zaheer@localhost.localdomain> +2022-06-01 21:24:41 +1000 Matthew Waters <matthew@centricular.com> - * gst/mpegdemux/gstmpegtsdemux.c: - hack for itvhd sid to detect mpeg1 as h264 + * ext/closedcaption/ccutils.c: + * ext/closedcaption/ccutils.h: + * ext/closedcaption/gstcccombiner.c: + * ext/closedcaption/gstcccombiner.h: + cccombiner: initial implementation of using CCBuffer helper + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3211> -2009-04-20 18:41:39 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-06-01 17:47:55 +1000 Matthew Waters <matthew@centricular.com> - * gst/rtpmux/gstrtpmux.c: - rtpmux: Remove useless caps mangling + * ext/closedcaption/ccutils.c: + * ext/closedcaption/ccutils.h: + * ext/closedcaption/gstccconverter.c: + * ext/closedcaption/gstccconverter.h: + * tests/check/elements/ccconverter.c: + closedcaption: move CC buffering to helper object + Move most of the interesting code from ccconverter to this new helper + object. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3211> -2009-04-20 18:36:42 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-05-30 21:39:13 +1000 Matthew Waters <matthew@centricular.com> - * gst/rtpmux/gstrtpmux.c: - rtpmux: Rename variable for more clarity + * ext/closedcaption/ccutils.c: + * ext/closedcaption/ccutils.h: + * ext/closedcaption/gstcccombiner.c: + * ext/closedcaption/gstccconverter.c: + closedcaption: move cdp->cc_data into shared location + So it can be used by both ccconverter and cccombiner + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3211> -2009-04-20 17:43:39 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-05-13 15:19:43 +1000 Matthew Waters <matthew@centricular.com> - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - rtpmux: Use GST_BOILERPLATE + * ext/closedcaption/ccutils.c: + * ext/closedcaption/ccutils.h: + * ext/closedcaption/gstcccombiner.c: + * ext/closedcaption/gstccconverter.c: + * ext/closedcaption/gstclosedcaption.c: + closedcaption: move cc_data->cdp to shared file + Used by both ccconverter and cccombiner + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3211> -2009-04-20 17:42:40 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-05-12 13:22:00 +1000 Matthew Waters <matthew@centricular.com> - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpdtmfmux.h: - * gst/rtpmux/gstrtpmux.c: - rtpmux: Do the includes locally + * ext/closedcaption/gstccconverter.c: + ccconverter: avoid different indent versions indenting !! differently. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3211> -2009-04-20 16:34:30 +0200 Andy Wingo <wingo@wingomac.bcn.oblong.net> +2022-05-12 13:19:58 +1000 Matthew Waters <matthew@centricular.com> - * sys/osxvideo/osxvideosrc.c: - patch over logic errors in osxvideosrc - apple's compiler carps, with reason, about some constructs in osxvideosrc.c - fix them. - also it seems that for some reason this required a gst-indent run. whee + * ext/closedcaption/ccutils.c: + * ext/closedcaption/ccutils.h: + * ext/closedcaption/gstcccombiner.c: + * ext/closedcaption/gstcccombiner.h: + * ext/closedcaption/gstccconverter.c: + * ext/closedcaption/meson.build: + closedcaption: move cdp framerate table to common file + shared by both cccombiner and ccconverter + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3211> -2009-04-20 13:09:46 +0200 Andy Wingo <wingo@oblong.net> +2022-05-12 13:15:19 +1000 Matthew Waters <matthew@centricular.com> - add osxvideosrc - * configure.ac: - * sys/Makefile.am: - * sys/osxvideo/Makefile.am: Autoconfiscation. - * sys/osxvideo/osxvideoplugin.m: - * sys/osxvideo/osxvideosrc.h: - * sys/osxvideo/osxvideosrc.c: Add osxvideosrc. Should fix #153684. - Patch-by: Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - Patch-by: Ali Sabil <ali.sabil@tandberg.com> - Patch-by: Barracuda Networks <justin@affinix.com> + * ext/closedcaption/gstcccombiner.c: + cccombiner: don't assume a single cea608 data packet per buffer + e.g. 24fps can have up to 3 and would include either two field0 or + field1 cea608 data. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3211> -2009-04-19 17:18:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-05-06 14:00:38 +1000 Matthew Waters <matthew@centricular.com> - * gst/deinterlace2/gstdeinterlace2.c: - deinterlace2: Make it possible to select interlacing autodetection or to enfore deinterlacing - For this add a "mode" property that defaults to "interlaced" for now as - most decoders/demuxers don't properly set the "interlaced" field on the - caps yet. - If this property is set to "auto" the element will work in passthrough - mode unless the caps contain the "interlaced" field. + * ext/closedcaption/gstccconverter.c: + * tests/check/elements/ccconverter.c: + ccconverter: drop data when overflow on extracting cea608 from cc_data + If the buffer overflows, then drop rather than causing a failure and + fropping the output buffer indefinitely. This may have caused downstream to + be waiting for data the will never arrive. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3211> -2009-04-18 23:42:57 +0100 Zaheer Merali <zaheerabbas@merali.org> +2022-05-05 18:27:50 +1000 Matthew Waters <matthew@centricular.com> - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: fix leak of GST_TYPE_LIST gvalue + * ext/closedcaption/gstccconverter.c: + * tests/check/elements/ccconverter.c: + ccconverter: fix framerate passthrough with malformed input + If an input is malformed (only produces cea608 field 1 cc_data) then + when in passthrough we would effectively be dropping every second cea608 + on output as we would not store any unused cea608 data. + Fix by having all code paths go through the framerate conversion code + which will store and retrieve any relevant data across buffers. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3211> + +2022-11-10 05:54:18 +0900 Seungha Yang <seungha@centricular.com> + + * sys/amfcodec/gstamfh264enc.cpp: + * sys/amfcodec/gstamfh265enc.cpp: + amfcodec: Fix typos + Fixing typo surfrace -> surface + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3378> + +2022-11-10 06:03:45 +0900 Seungha Yang <seungha@centricular.com> + + * sys/mediafoundation/gstmfcapturedshow.cpp: + mfvideosrc: Return S_OK from ISampleGrabberCB callback + The Microsoft's ISampleGrabber implementation seems to be ignoring + the HRESULT return value from the callback though, + S_OK is the right HRESULT code. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3379> -2009-04-18 13:09:23 +0100 Zaheer Merali <zaheerabbas@merali.org> +2022-11-08 19:26:39 +0900 Seungha Yang <seungha@centricular.com> - * gst/mpegdemux/mpegtsparse.c: - mpegtsparse: fix leak in src_pad_query + * sys/d3d11/gstd3d11screencapturedevice.cpp: + * sys/d3d11/gstd3d11screencapturesrc.cpp: + d3d11screencapturesrc: Specify PAR 1/1 to template caps + ... otherwise PAR can be wrongly signalled during the negotiation + Fixing below pipeline when desktop resolution is not 640x480 + gst-launch-1.0.exe \ + d3d11screencapturesrc ! videoscale ! + video/x-raw,width=640,height=480,pixel-aspect-ratio=1/1 ! d3d11videosink + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3360> -2009-04-17 16:16:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk> +2022-05-22 12:02:15 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/rtpmanager/gstrtpsession.c: - rtpsession: join the RTCP thread - Avoid a case where a joinable thread would be left unjoined, which leaked the - thread structure. - Fixes #577318. + * tests/examples/va/meson.build: + * tests/examples/va/vaenc-dynamic-reconfigure.c: + tests: examples: va: Add encoders dynamic reconfiguration. + Take the QSV encoder test and used it for VA. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2466> -2009-04-17 15:39:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-11-05 15:12:28 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/deinterlace2/gstdeinterlace2.c: - deinterlace2: Use GST_(DEBUG|WARNING|ERROR)_OBJECT instead of the non-OBJECT ones + * sys/va/gstvacaps.c: + * sys/va/gstvah264enc.c: + va: caps: Fix raw caps for H264 encoding. + Mesa gallium and Intel i965 ill reports unsupported video formats. + This commit reverts ecb12a05 and adds a deeper workaround, since + ecb12a05 only fix the template caps, but not when renegotation + happens. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2466> + +2022-10-21 10:56:59 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvabaseenc.c: + vabaseenc: Log out the flow error name. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2466> + +2022-10-20 11:20:18 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvah264enc.c: + vah264enc: Enable parameters change while running. + 1. Removes the verification if the internal encoder is not opened + yet to allow the property setting. + 2. And toggles on the base class' reconf flag for each property + variable that can be modified at run time. + 3. Mark those modifiable properties as mutable while playing. + Currently the run-time modifiable properties are: + qpi, qpp, qpb, bitrate, target percentage, target usage and rate control + Other properties can be enabled too, but they need testing. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2466> + +2022-10-20 11:13:19 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvabaseenc.c: + * sys/va/gstvabaseenc.h: + vabaseenc: Enable encoder reconfiguration. + Adds an internal function reset() which drains the internal queues and + calls the reconfig() vmethod. + This reset() method is called inconditionally at set_format() and in + handle_frame() if the instance's reconf flag is enabled. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2466> + +2022-09-20 20:55:18 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvah264enc.c: + vah264enc: Avoid reopen encoder or renegotiate. + If parameters remain similar enough to avoid either encoder reopening + or downstream renegotiation, avoid it. + This is going to be useful for dynamic parameters setting. + To check if the stream parameters changed, so the internal encoder has + to be closed and opened again, are required two steps: + 1. If input caps, profile, chroma or rate control mode have changed. + 2. If any of the calculated variables and element properties have + changed. + Later on, only if the output caps also changed, the pipeline + is renegotiated. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2466> + +2022-09-20 19:11:35 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvaencoder.c: + * sys/va/gstvaencoder.h: + vaencoder: Add gst_va_encoder_get_reconstruct_pool_config() + This method will return the caps configured in the reconstruct buffer + pool, and its maxium number of buffers to allocate. + The caps are needed later to know if the internal encoder has to be + reopened if the stream properties change. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2466> + +2022-11-08 03:43:02 +0900 Seungha Yang <seungha@centricular.com> + + * sys/directshow/plugin.cpp: + directshow: Demote rank of device provider to GST_RANK_NONE + Current directshow plugin seems to be unstable and unmaintained + for many many years. + See + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3323 + and + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1828 + Disable this device provider by default to avoid any side-effect + of this plugin + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3355> + +2022-11-08 11:43:19 +0100 Victor Manuel Jaquez Leal <vjaquez@igalia.com> + + * sys/va/gstvah264enc.c: + vah264enc: Fix properties documentation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3361> -2009-04-17 15:39:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-11-08 11:36:12 +0100 Victor Manuel Jaquez Leal <vjaquez@igalia.com> - * gst/deinterlace2/gstdeinterlace2.c: - deinterlace2: Reset history if DISCONT is set on the incoming buffer + * sys/va/gstvaav1dec.c: + * sys/va/gstvabaseenc.c: + * sys/va/gstvacompositor.c: + * sys/va/gstvah264dec.c: + * sys/va/gstvah265dec.c: + * sys/va/gstvajpegdec.c: + * sys/va/gstvampeg2dec.c: + * sys/va/gstvavp8dec.c: + * sys/va/gstvavp9dec.c: + va: Document device-path property. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3361> -2009-04-17 15:39:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-11-08 10:37:10 +0100 Victor Manuel Jaquez Leal <vjaquez@igalia.com> - * gst/deinterlace2/gstdeinterlace2.c: - deinterlace2: Fix timestamps for buffers with RFF flag set + * docs/plugins/gst_plugins_cache.json: + va: Reenable plugin cache. + This basically a revert of commit 9bb560e7 + Also it adds vaav1dec. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3361> -2009-04-16 22:14:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-11-08 11:34:20 +0100 Victor Manuel Jaquez Leal <vjaquez@igalia.com> - * gst/mxf/mxfmetadata.c: - mxf: Properly handle the new interlaced support from libgstvideo for (de)muxing + * sys/va/gstvampeg2dec.c: + * sys/va/gstvavp8dec.c: + vavp8dec, vampeg2dec: Fix type name. + The camel case name is wrong when registering the type. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3361> -2009-04-16 17:41:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-10-26 18:05:32 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/deinterlace2/gstdeinterlace2.c: - * gst/deinterlace2/gstdeinterlace2.h: - * gst/deinterlace2/tvtime/greedy.c: - * gst/deinterlace2/tvtime/greedyh.c: - * gst/deinterlace2/tvtime/scalerbob.c: - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: - * gst/deinterlace2/tvtime/weave.c: - * gst/deinterlace2/tvtime/weavebff.c: - * gst/deinterlace2/tvtime/weavetff.c: - deinterlace2: Rename line_length to row_stride and remove output_stride + * sys/va/gstvacaps.c: + vacaps: Sort raw caps according their efficiency. + Caps negotiations considers template caps order. This patch sets the + correct order according the feture caps: VAMemory, DMABuf and + SystemMemory. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3349> -2009-04-16 15:52:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-11-08 02:08:08 +0000 Tim-Philipp Müller <tim@centricular.com> - * gst/deinterlace2/gstdeinterlace2.c: - deinterlace2: Implement support for RFF and ONEFIELD buffer flags + * meson.build: + Back to development + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3358> -2009-04-16 18:36:13 +0300 Stefan Kost <ensonic@users.sf.net> +=== release 1.21.2 === - * configure.ac: - * gst/debugutils/Makefile.am: - * gst/debugutils/fpsdisplaysink.c: - * gst/debugutils/fpsdisplaysink.h: - fpsdisplaysink: add a initial port of a sink with fps display - This now works with a event probe. Needs some extra work. +2022-11-07 23:53:59 +0000 Tim-Philipp Müller <tim@centricular.com> -2009-03-09 18:22:28 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + * ChangeLog: + * NEWS: + * RELEASE: + * gst-plugins-bad.doap: + * meson.build: + Release 1.21.2 - * gst/camerabin/gstcamerabin.c: - camerabin: clean up and fix assertion fail when setting zoom in NULL state +2022-11-07 23:53:57 +0000 Tim-Philipp Müller <tim@centricular.com> -2009-03-09 18:31:07 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + * ChangeLog: + Update ChangeLogs for 1.21.2 - * gst/camerabin/gstcamerabin.c: - camerabin: fix format matching when detecting allowed frame rate +2020-12-08 16:55:26 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-03-09 18:25:48 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + * ext/srt/gstsrtobject.c: + * ext/srt/gstsrtobject.h: + srt: Add a property to disable automatic reconnect + This adds a new boolean property `auto-reconnect`, defaulting to `true`. + Setting it to `false` makes the elements (in caller mode) immediately + report an error to the application instead of trying to reconnect. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3326> - * gst/camerabin/gstcamerabin.c: - camerabin: don't lose pending state when changing resolution +2022-10-26 18:04:17 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-02-27 17:12:38 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> + * sys/va/gstvabasetransform.c: + vabasetransform: Fail if cannot import the input buffer. + Otherwise got a buffer double free. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3348> + +2022-11-06 01:53:46 +0900 Seungha Yang <seungha@centricular.com> + + * sys/mediafoundation/gstmfcapturedshow.cpp: + * sys/mediafoundation/gstmfcapturedshow.h: + * sys/mediafoundation/gstmfdevice.cpp: + * sys/mediafoundation/gstmfsourceobject.cpp: + * sys/mediafoundation/gstmfsourceobject.h: + * sys/mediafoundation/gstmfsourcereader.cpp: + * sys/mediafoundation/gstmfvideosrc.cpp: + * sys/mediafoundation/meson.build: + mfvideosrc: Add support for DirectShow capture filter + Adding DirecShow video capture filter mode, in addition + to existing MediaFoundation and WinRT(UWP) mode, to support + DirectShow only filters (not KS driver compatible) + such as custom virtual camera filters. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3350> - * gst/camerabin/gstcamerabin-marshal.list: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - * tests/check/elements/camerabin.c: - camerabin: change img-done signal parameter from GString* to const gchar* - Don't allow setting filename via img-done signal parameter but force app - use filename property. Don't stop capture when setting filename property. - Update check unit test based on the change. +2021-12-01 16:23:41 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-04-15 13:23:01 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + * gst/rtmp2/gstrtmp2sink.c: + * gst/rtmp2/gstrtmp2src.c: + * gst/rtmp2/rtmp/rtmpclient.c: + rtmp2: Improve error messages + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1403> - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - rtpmux: Add GST_DEBUG_FUNCPTRs +2021-12-01 16:04:24 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-04-15 13:15:55 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + * gst/rtmp2/gstrtmp2sink.c: + * gst/rtmp2/gstrtmp2src.c: + * gst/rtmp2/rtmp/rtmpclient.c: + * gst/rtmp2/rtmp/rtmpconnection.c: + rtmp2/connection: Pass triggering GError in 'error' signal + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1403> - * gst/rtpmux/gstrtpdtmfmux.c: - rtpdtmfmux: Release locked pad on release_pad - Release the special pad if the pad is removed from the muxer. +2021-12-01 16:02:53 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-04-15 13:09:27 -0400 Laurent Glayal <spglegle@yahoo.fr> + * gst/rtmp2/rtmp/rtmpconnection.c: + rtmp2/connection: Pass triggering GError to _emit_error + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1403> - * gst/rtpmux/gstrtpdtmfmux.c: - rtpdtmfmux: Release special on pad dispose - Fixes #577690 +2021-12-01 16:01:10 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-04-15 18:14:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + * gst/rtmp2/rtmp/rtmpconnection.c: + rtmp2/connection: Discern reasons for cancelling all commands + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1403> - * gst/rtpmanager/gstrtpjitterbuffer.c: - jitterbuffer: prevent overflow in EOS estimation - Use a guint64 instead of a guint to hold a 64bit value to prevent completely - bogues EOS estimation values due to overflows. +2021-12-01 15:53:13 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-04-15 17:44:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + * gst/rtmp2/rtmp/rtmpconnection.c: + rtmp2/connection: Handle EOF like error + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1403> - * gst/rtpmanager/gstrtpbin.c: - * gst/rtpmanager/gstrtpbin.h: - rtpbin: we should not provide a clock - There is no need to provide a clock. +2021-12-01 15:49:22 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-04-15 17:28:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + * gst/rtmp2/rtmp/rtmpclient.c: + rtmp2/client: Make sure 'salt' is not NULL + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1403> - * gst/rtpmanager/gstrtpjitterbuffer.c: - jitterbuffer: more estimated EOS fixes - Do more accurate EOS estimate and guard against backward timestamps. +2021-12-01 15:46:42 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-04-15 17:25:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk> + * gst/rtmp2/rtmp/rtmpclient.c: + rtmp2/client: Make sure 'reason' is not NULL + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1403> - * gst/rtpmanager/gstrtpjitterbuffer.c: - jitterbuffer: release lock before pushing EOS - Make sure we release the jitterbuffer lock before we start pushing out data - because else we might deadlock. +2021-12-01 16:13:42 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-04-15 15:46:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst/rtmp2/rtmp/rtmpclient.c: + rtmp2/client: Make sure 'desc' is not NULL + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1403> - * gst/deinterlace2/gstdeinterlace2.c: - * gst/deinterlace2/gstdeinterlace2.h: - * gst/deinterlace2/tvtime/greedy.c: - * gst/deinterlace2/tvtime/greedyh.c: - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: - deinterlace2: Move output buffer from the instance struct to a function parameter +2021-12-01 16:11:31 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-04-15 15:33:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst/rtmp2/rtmp/rtmpclient.c: + rtmp2/client: Make sure 'code' is not NULL + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1403> - * gst/deinterlace2/gstdeinterlace2.c: - * gst/deinterlace2/gstdeinterlace2.h: - deinterlace2: Add initial support for automatic detection of the field order +2022-11-07 07:45:53 +0100 Edward Hervey <edward@centricular.com> -2009-04-15 14:47:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/gstwebrtcstats.c: + * ext/webrtc/transportstream.c: + * ext/webrtc/utils.c: + * ext/webrtc/utils.h: + * ext/webrtc/webrtcsdp.c: + webrtcbin: Don't duplicate enum string values + Some were leaked when debugging was enabled. Instead just directly use the + static strings as-is. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3347> - * gst/deinterlace2/gstdeinterlace2.c: - deinterlace2: Add support for YVYU colorspace - This is the same as YUY2 with just Cr and Cb swapped. As - we don't make a difference between them when deinterlacing - this works. +2022-11-04 14:24:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> -2009-04-13 13:32:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * gst/debugutils/gstvideocodectestsink.c: + videocodectestsink: Add YUV422 support + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3331> - * gst/mxf/mxfmux.c: - mxfmux: Small cleanup +2022-11-05 21:35:08 +0900 Seungha Yang <seungha@centricular.com> -2009-04-10 18:00:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + * sys/d3d11/gstd3d11window.cpp: + d3d11videosink: Always clear back buffer on resize + Swapchain may not need to be resized if the size of backbuffer + is equal to the previous size. Then previously rendered frame will be stay + on the screen. Do clear back buffer whenever resize() is called + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3341> - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - dshowdec: fix compilation with the debugging system disabled - One GST_DEBUG_CATEGORY_INIT should be enough anyway. - Fixes #578562 (spotted by David Hoyt). +2022-11-05 00:00:43 +0900 Seungha Yang <seungha@centricular.com> -2009-04-09 23:53:39 +0200 Janin Kolenc <janin.kolenc at marand.si> + * sys/qsv/gstqsvallocator_va.cpp: + qsv: Fix encoding error when input memory belongs to other GPU + Copy frame if VA display of input buffer is different from that + of encoder, like we've been doing on Windows + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3335> + +2022-11-04 21:52:39 +0800 He Junyan <junyan.he@intel.com> + + * sys/va/gstvabaseenc.c: + va: baseenc: Do not import the VA surface from other display. + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1167 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3322> + +2022-11-04 21:26:23 +0800 He Junyan <junyan.he@intel.com> + + * sys/va/gstvacompositor.c: + va: compositor: Do not use allocator and pool from other display. + Just like the va decoder, the compositor should not use allocator + and pool from other display. Also, when importing the input buffer, + if it is from other display, we should fallback to memory copy. + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1167 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3322> - * ext/x264/gstx264enc.c: - * ext/x264/gstx264enc.h: - x264enc: add force keyframe event handling - Use the GstForceKeyUnit event to force a keyframe. - Fixes #578112. +2022-11-04 17:12:22 +0800 He Junyan <junyan.he@intel.com> -2009-04-08 11:52:46 -0700 Michael Smith <msmith@songbirdnest.com> + * sys/va/gstvabasetransform.c: + va: basetransform: Do not use allocator and pool from other display. + Just like the va decoder, the vpp and deinterlace should not use allocator + and pool from other display. Also, when importing the input buffer, if it + is from other display, we should fallback to memory copy. + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1167 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3322> - * configure.ac: - * sys/acmenc/Makefile.am: - * sys/acmmp3dec/Makefile.am: - acmenc, acmmp3dec, sdp: link to all requires libraries on win32. - Add winsock for windows (for sdp). Link to all the plugins-base - libs we indirectly use for acmmenc and acmmp3dec. +2022-11-04 17:08:12 +0800 He Junyan <junyan.he@intel.com> -2009-04-07 15:50:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/va/gstvabasedec.c: + va: basedec: Do not use allocator and pool from other display. + The command line such as: + gst-launch-1.0 -vf filesrc location=1.264 ! h264parse ! + vah264dec ! varenderD129postproc ! fakesink + The decoder here gets the allocation proposal from the vpp which is + on another GPU device. The allocator and pool belong to other display + and should not be used in the decoder. + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1167 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3322> - * tests/check/Makefile.am: - * tests/check/pipelines/mxf.c: - mxf: Add unit tests for checking if mxfmux ! mxfdemux pipelines are working without errors +2022-11-04 20:28:34 +0800 He Junyan <junyan.he@intel.com> -2009-04-07 15:49:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/va/gstvaallocator.c: + * gst-libs/gst/va/gstvaallocator.h: + libs: va: Add API to peek the va buffer's display. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3322> - * gst/mxf/mxfdemux.c: - mxfdemux: Don't use invalid buffer offsets, instead assume offset == 0 +2022-11-04 20:28:34 +0800 He Junyan <junyan.he@intel.com> -2009-04-07 15:45:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/va/gstvaallocator.c: + * gst-libs/gst/va/gstvaallocator.h: + libs: va: Add API to peek the va memory's display. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3322> - * gst/mxf/mxfmetadata.c: - mxf: Fix comparison +2022-11-04 17:06:37 +0800 He Junyan <junyan.he@intel.com> -2009-04-07 15:19:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/va/gstvaallocator.c: + * gst-libs/gst/va/gstvaallocator.h: + libs: va: Add API to peek the allocator's display. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3322> - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxful.c: - * gst/mxf/mxful.h: - Use UL database for all metadata ULs - -2009-04-07 04:53:02 +0300 René Stadler <mail@renestadler.de> - - * gst/aacparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.c: - * gst/flacparse/gstbaseparse.c: - baseparse: Fix slightly broken buffer-in-segment check (aacparse, amrparse, flacparse) - -2009-04-05 03:50:19 +0300 René Stadler <mail@renestadler.de> - - * gst/aacparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.c: - baseparse: Fix push mode seeking (aacparse, amrparse) - Sending the flush-start event forward before taking the stream lock actually - works, in contrast to deadlocking in downstream preroll_wait (hunk 1). - After that we get the chain function being stuck in a busy loop. This is fixed - by updating the minimum frame size inside the synchronization loop because the - subclass asks for more data in this way (hunk 2). - Finally, this leads to a very probable crash because the subclass can find a - valid frame with a size greater than the currently available data in the - adapter. This makes the subsequent gst_adapter_take_buffer call return NULL, - which is not expected (hunk 3). - -2009-04-04 21:19:11 +0300 Felipe Contreras <felipe.contreras@gmail.com> - - * common: - Automatic update of common submodule - From d0ea89e to b3941ea - -2009-04-04 17:51:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * ext/bz2/Makefile.am: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2enc.c: - bz2: fix some refcount mistakes and do some cleaning up - No need to unref buffers if pad_push returns something non-FLOW_OK. - In fact, this will cause assertions or crashes. However, we do need - to unref the input buffer whenever we don't pass it downstream. Also, - a non-OK flow return is not an error, so don't post error messages on - the bus - the pipeline may just be shutting down. Miscellaneous other - clean-ups and crack removal. Plenty of work left for those who feel - like it. - -2009-04-04 14:54:25 +0200 Edward Hervey <bilboed@bilboed.com> - - * common: - Automatic update of common submodule - From f8b3d91 to d0ea89e - -2009-04-03 23:10:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure.ac: fix dvdnav version check - Fixes #577864. This time for real. - -2009-04-03 17:55:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - * ext/resindvd/resindvdsrc.h: - resindvd: require libdvdnav >= 4.1.2 for dvdnav_get_current_time() - Fixes #577864. +2022-11-04 17:03:35 +0800 He Junyan <junyan.he@intel.com> -2009-04-03 10:29:53 +0100 Jan Schmidt <thaytan@noraisin.net> + * gst-libs/gst/va/gstvaallocator.h: + libs: va: Fix code style in gstvaallocator.h + Replace all tabs with spaces. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3322> - * configure.ac: - misc: Bump plugins-base requirement to 0.10.22.1 +2022-11-05 05:32:52 +0900 Seungha Yang <seungha@centricular.com> -2009-04-01 17:41:40 +0100 Jan Schmidt <thaytan@noraisin.net> + * docs/plugins/gst_plugins_cache.json: + * sys/d3dvideosink/d3dvideosink.c: + d3dvideosink: Update plugin description + Direct3D is too generic (there are various version numbers). + Clarify that this element is using the Direct3D9 API + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3333> - * ext/resindvd/resindvdsrc.c: - resindvd: Send both the logical and physical substream ID in the stream change. - When sending the stream change message(s) to the demuxer, also include the - logical stream id along with the physical ID, so that the demuxer can remap - logical->physical MPEG stream ID. +2022-11-04 08:41:10 +0100 Edward Hervey <edward@centricular.com> -2009-04-01 02:23:20 +0100 Jan Schmidt <thaytan@noraisin.net> + * ext/lv2/gstlv2.c: + lv2: Don't leak plugin information on registration + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3319> - * ext/resindvd/Makefile.am: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - resindvd: Use new GstNavigation functionality. - Handle the new DVD commands, so that we can handle commands from a player - to change angle, jump to menus etc. Use the new GstNavigation event parsing - functions, instead of hand-rolled stuff. - Send GstNavigation notification messages when the mouse enters a button - or leaves it, so UI can turn the mouse cursor to a hand icon. +2022-11-04 08:40:24 +0100 Edward Hervey <edward@centricular.com> -2009-03-30 01:07:49 +0100 Jan Schmidt <thaytan@noraisin.net> + * ext/ladspa/gstladspa.c: + ladspa: Don't leak plugin information on registration + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3319> - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdbin.h: - resindvd: Switch to using a hard-coded mpeg2dec, and change pad blocking a bit. - Change the pad blocking behaviour during startup, and use a hard-coded mpeg2dec (for the moment), in order to make things work with playbin2. +2022-11-04 08:09:52 +0100 Edward Hervey <edward@centricular.com> -2009-03-25 12:31:10 +0000 Jan Schmidt <thaytan@noraisin.net> + * ext/fdkaac/gstfdkaacenc.c: + fdkaacenc: Properly terminate GEnumValue table + It should be terminated with a NULL entry, otherwise we just stray into the + realms of cryptographic libraries^W^W random memory usage. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3319> - * ext/resindvd/resindvdsrc.c: - resindvd: Add newline to debug g_print statement +2022-07-27 15:59:35 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-03-25 02:20:12 +0000 Jan Schmidt <thaytan@noraisin.net> + * ext/srt/gstsrtobject.c: + srt: Remove callers for which srt_bstats fails + This keeps them from accumulating in the element and in the stats while + the sink is not being fed, as long as we at least periodically grab + stats. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3156> - * ext/resindvd/resindvdsrc.c: - resindvd: Make highlights work when jumping into menus - Make the highlights re-appear correctly when jumping back into menus - by making sure to set the flushing_seek flag for user-action initiated - seeks. - Fiddle some debug related to tracking down the issue. +2022-07-29 11:53:18 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-03-25 01:21:28 +0000 Jan Schmidt <thaytan@noraisin.net> + * ext/srt/gstsrtobject.c: + srt: Use simpler list operations for callers + Avoid `g_list_append` and `g_list_remove` (which have to scan the list) + and replace them with `g_list_prepend` and `g_list_delete_link`. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3156> - * ext/resindvd/resindvdsrc.c: - resindvd: Support multiangle titles. - Add a workaround for an apparent libdvdnav bug where it loses nav packets - during multiangle titles, and add some keypress bindings to switch the angle. +2020-11-10 10:06:37 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-03-18 09:35:12 +0000 Jan Schmidt <thaytan@noraisin.net> + * ext/srt/gstsrtobject.c: + srt: Clean up poll/sock lifecycle + Make sure `srtobject->poll_id` is never invalid as long as `srtobject` + exists. Only remove our caller socket from it when the socket becomes + invalid. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3156> - * ext/resindvd/resindvdbin.c: - resindvd: Add back in support for using hardcoded a52dec +2022-06-08 16:35:54 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-03-16 20:31:58 +0000 Jan Schmidt <thaytan@noraisin.net> + * ext/srt/gstsrtobject.c: + srt: Clean up error handling + - Make the srt_epoll_wait loops more uniform. + - Error only via GError when possible; let the element send the error + message. Avoids a second error message. + - Return 0 when cancelled. Avoids an error message from the element. + - Don't send an error message from send_headers when we're a server + sink. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3156> - * ext/resindvd/gstmpegdemux.c: - resindvd: Add some debug when creating the output pads in the demuxer +2022-10-11 11:14:59 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-03-10 10:39:22 +0000 Jan Schmidt <thaytan@noraisin.net> + * ext/srt/gstsrtobject.c: + srt: Simplify socket stats + Don't hide stats depending on whether we're a sending or receiving + socket. While we're here, add some more debug logs. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3156> - * ext/resindvd/rsnaudiodec.c: - resindvd: More hacking on the audio decoder. +2020-10-05 19:50:13 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2009-03-05 00:04:24 +0000 Jan Schmidt <thaytan@noraisin.net> + * ext/srt/gstsrtobject.c: + * ext/srt/gstsrtobject.h: + srt: Replace stats accumulation with naive byte counting + srt_bstats cannot be used to get the stats of closed connections, so the + best we can do is keep the running count ourselves. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3156> - * ext/resindvd/resindvdsrc.c: - resindvd: Trim back the g_print debug - convert to GST_DEBUG and GST_LOG +2022-11-04 18:32:05 +0900 Seungha Yang <seungha@centricular.com> -2009-03-04 16:16:57 +0000 Jan Schmidt <thaytan@noraisin.net> + * sys/directshow/gstdshow.cpp: + directshow: Validate enumerated AM_MEDIA_TYPE struct + The video info struct can be null if format is undefined + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3323> - * ext/resindvd/resindvdbin.c: - * ext/resindvd/rsnaudiodec.c: - * ext/resindvd/rsnaudiodec.h: - resindvd: Extend the Resin audio decoder element, and switch rsndvdbin to use it - -2009-02-27 10:18:14 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ext/resindvd/Makefile.am: - * ext/resindvd/rsnaudiodec.c: - * ext/resindvd/rsnaudiodec.h: - resindvd: First part of the re-plugging audio decoder +2022-11-03 23:40:00 +0900 Seungha Yang <seungha@centricular.com> -2009-02-27 09:42:35 +0000 Jan Schmidt <thaytan@noraisin.net> + * tests/examples/d3d11/d3d11decoder-appsink.cpp: + * tests/examples/d3d11/d3d11videosink-present.cpp: + examples: d3d11: Fix GCC build error/warning + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3318> - * ext/resindvd/resindvdbin.c: - resindvd: remove unused code path from the bin +2022-11-03 05:18:03 +0900 Seungha Yang <seungha@centricular.com> -2009-02-26 00:29:26 +0000 Jan Schmidt <thaytan@noraisin.net> + * docs/plugins/gst_plugins_cache.json: + * sys/qsv/gstqsvjpegenc.cpp: + qsvjpegenc: Add support for YUY2 format + Now GstD3D11 defines YUY2 format + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3316> - * ext/resindvd/resindvdbin.h: - resindvd: Indent some things +2022-11-03 05:12:31 +0900 Seungha Yang <seungha@centricular.com> -2009-02-26 00:27:54 +0000 Jan Schmidt <thaytan@noraisin.net> + * docs/plugins/gst_plugins_cache.json: + * sys/qsv/gstqsvallocator.cpp: + * sys/qsv/gstqsvallocator.h: + * sys/qsv/gstqsvallocator_d3d11.cpp: + * sys/qsv/gstqsvdecoder.cpp: + * sys/qsv/gstqsvjpegdec.cpp: + * sys/qsv/gstqsvjpegdec.h: + * sys/qsv/meson.build: + * sys/qsv/plugin.cpp: + qsv: Add JPEG decoder + Because DXVA does not define JPEG decoding, we need this + vendor specific API for Windows + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3316> - * ext/resindvd/rsnaudiomunge.c: - * ext/resindvd/rsnwrappedbuffer.c: - resindvd: Switch GST_BOILERPLATE to G_DEFINE_TYPE for no real reason. +2022-11-03 03:38:33 +0900 Seungha Yang <seungha@centricular.com> -2009-03-24 01:02:28 +0000 Jan Schmidt <thaytan@noraisin.net> + * docs/plugins/gst_plugins_cache.json: + * gst-libs/gst/d3d11/gstd3d11-private.h: + * gst-libs/gst/d3d11/gstd3d11converter.cpp: + * gst-libs/gst/d3d11/gstd3d11device.cpp: + d3d11: Add support for YUY2 format + YUY2 is a primary YUV 4:2:2 format for DXVA. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3316> - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - resindvd: Add faststart, and work around some multi-angle issues - Add a 'fast-start' property to the rsndvdsrc element, that attempts to - jump directly to the DVD menu when starting. Doesn't work correctly on all - titles yet. - Add workarounds for issues with multiple angles in libdvdnav: Use a heuristic - to avoid detecting discontinuities during multiple-angle titles, it seems - caused by libdvdnav losing some NAV packets in multiangle titles. Fix - seeking in multi-angle titles by aligning our sector calculation logic - with libdvdnav's. Also, use libdvdnav's dvdnav_get_current_time() method - to determine the logical position of the current cell when it changes, as the - cell_start value in the cell_change event provides a number that doesn't - compensate for angle cell blocks. +2022-11-01 09:47:38 +0800 Tong Wu <tong1.wu@intel.com> -2009-03-21 19:04:05 +0000 Jan Schmidt <thaytan@noraisin.net> + * sys/msdk/gstmsdkcontext.c: + msdkcontext: use gst_object_unref instead of g_object_unref + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3301> - * ext/resindvd/resindvdsrc.c: - resindvd: Small debug output change in the source element +2022-10-31 16:59:18 +0800 Tong Wu <tong1.wu@intel.com> -2009-04-01 02:25:42 +0100 Jan Schmidt <thaytan@noraisin.net> + * sys/msdk/gstmsdkcontext.c: + msdkcontext: use gst_object_ref for GstVaDisplay + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3301> - * gst/dvdspu/gstdvdspu.c: - dvdspu: Add some debug - Add a little bit of extra debug. Wrap a hardcoded #if 0 into a define instead. +2022-10-31 16:56:32 +0800 Tong Wu <tong1.wu@intel.com> -2009-04-02 13:05:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/msdk/gstmsdkcontext.c: + msdkcontext: g_object_new() must not return nullptr + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3301> - * ext/jp2k/gstjasperenc.c: - jp2enc: Unref peer caps after usage to fix a memory leak +2022-10-31 16:52:23 +0800 Tong Wu <tong1.wu@intel.com> -2009-04-02 12:46:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/msdk/gstmsdkenc.c: + msdkenc: use GST_CAPS_FEATURE_MEMORY_VA to check the feature + Add macros to protect sinkpad_is_va(), since it is not defined on + Windows. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3301> - * tests/check/Makefile.am: - * tests/check/elements/mxfmux.c: - mxfmux: Add unit tests +2022-11-01 12:03:24 +0100 Guillaume Desmottes <guillaume.desmottes@onestream.live> -2009-04-01 15:45:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk> + * ext/wpe/gstwpevideosrc.cpp: + wpe: fix wpevideosrc gst-play example + wpe:// no longer works since 1.20, see wpesrc examples. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3306> + +2022-10-27 10:03:34 -0400 Eric Knapp <emkman99@gmail.com> + + * sys/va/gstvah264enc.c: + vah264enc: Added option to insert CEA-708 closed captions + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2910> + +2022-11-01 22:19:18 +0900 Seungha Yang <seungha@centricular.com> + + * docs/plugins/gst_plugins_cache.json: + * sys/qsv/gstqsvav1enc.cpp: + * sys/qsv/gstqsvh264dec.cpp: + * sys/qsv/gstqsvh264enc.cpp: + * sys/qsv/gstqsvh265dec.cpp: + * sys/qsv/gstqsvh265enc.cpp: + * sys/qsv/gstqsvjpegenc.cpp: + * sys/qsv/gstqsvutils.h: + * sys/qsv/gstqsvvp9dec.cpp: + * sys/qsv/gstqsvvp9enc.cpp: + qsv: Check 16K resolution support + ... and remove duplicated code + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3310> - * gst/legacyresample/gstlegacyresample.c: - legacyresample: fix negotiation so that upstream can actually fixate to downstream's rate - If one side has a preference for a particular sample rate or set of sample rates, we - should honour this in the caps we advertise and transform to and from, so that elements - actually know about the other side's sample rate preference and can negotiate to it - if supported. Also add unit test for this. +2021-05-14 10:24:05 +0200 Marijn Suijten <marijns95@gmail.com> -2009-03-31 16:07:46 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + * gst-libs/gst/vulkan/gstvkimageview.c: + * gst-libs/gst/vulkan/gstvkimageview.h: + vulkan: Mark gst_vulkan_image_view_new create_info as constant pointer + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1615> - * gst/aacparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.c: - baseparse: Delay newsegment as long as possible. - If newsegment is sent (too) early, caps may not yet be fixed/set, - and downstream may not have been linked. +2021-01-05 22:33:12 +0100 Marijn Suijten <marijns95@gmail.com> -2009-03-30 21:57:12 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + * gst-libs/gst/vulkan/gstvkcommandpool.c: + * gst-libs/gst/vulkan/gstvkdescriptorpool.c: + * gst-libs/gst/vulkan/gstvkdevice.c: + * gst-libs/gst/vulkan/gstvkphysicaldevice.c: + * gst-libs/gst/vulkan/gstvkqueue.c: + vulkan: Remove unnecessary null checks + These null checkes are slightly misleading when double-checking + mutability for external language interop. None of the functions in + these files allow the variable at hand to become `NULL` under normal + operation, because they are checked at initialization and never (allowed + to be) reassigned to `NULL`. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1615> - * ext/mpeg2enc/gstmpeg2encoptions.cc: - mpeg2enc: fix bitrate property settings - Align bitrate property interpretation with usual mpeg2enc behaviour. - Fixes #575736. +2021-01-04 01:07:04 +0100 Marijn Suijten <marijns95@gmail.com> -2009-03-27 21:39:05 +0000 Alan Falloon <afalloon@lumenera.com> + * gst-libs/gst/vulkan/gstvkdisplay.c: + * gst-libs/gst/vulkan/gstvkfence.c: + * gst-libs/gst/vulkan/gstvkimagememory.c: + * gst-libs/gst/vulkan/gstvkqueue.c: + vulkan: Add missing `(nullable)` annotation to `Returns` + Most of these functions already state they might return `%NULL`, but + this is not picked up by G-IR. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1615> - * configure.ac: - configure.ac: make --disable-external work again +2021-01-04 00:40:24 +0100 Marijn Suijten <marijns95@gmail.com> -2009-03-27 19:37:47 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> + * gst-libs/gst/vulkan/gstvkdescriptorcache.c: + * gst-libs/gst/vulkan/gstvkdescriptorpool.c: + * gst-libs/gst/vulkan/gstvkdescriptorset.c: + * gst-libs/gst/vulkan/gstvkinstance.c: + * gst-libs/gst/vulkan/gstvkwindow.c: + vulkan: Add missing `array length` and `(out)` annotation to parameters + Add `array length` annotation for `layouts` such that `n_layouts` is + properly marked as its length, and add `(out)` where a function returns + in that parameter. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1615> - * ext/jp2k/gstjasperdec.c: - * ext/jp2k/gstjasperdec.h: - jp2kdec: implement basic QoS - Don't try to decode frames that are going to be late anyway. +2022-11-01 02:00:33 +0900 Seungha Yang <seungha@centricular.com> -2009-03-27 17:44:57 +0100 Wim Taymans <wim.taymans@collabora.co.uk> + * sys/d3d11/gstd3d11decoder.cpp: + d3d11decoder: Fix for VP9 decoding with odd resolution + Fixing off by one mismatch when width and/or height of stream + is odd number + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3302> + +2022-10-28 03:25:38 +0900 Seungha Yang <seungha@centricular.com> + + * docs/plugins/gst_plugins_cache.json: + * sys/qsv/gstqsvallocator.cpp: + * sys/qsv/gstqsvallocator.h: + * sys/qsv/gstqsvallocator_d3d11.cpp: + * sys/qsv/gstqsvdecoder.cpp: + * sys/qsv/gstqsvvp9dec.cpp: + * sys/qsv/gstqsvvp9dec.h: + * sys/qsv/meson.build: + * sys/qsv/plugin.cpp: + qsv: Add VP9 decoder + Recent Intel GPU supports 12bits VP9 decoding but only VP9 + profile2 with 10bits is defined by DXVA spec. + Thus, we need this vendor specific decoder element + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3290> - * gst/rtpmanager/gstrtpbin.c: - * gst/rtpmanager/gstrtpbin.h: - * gst/rtpmanager/gstrtpjitterbuffer.c: - * gst/rtpmanager/gstrtpjitterbuffer.h: - rtpbin: add on_npt_stop signal - Add the on_npt_stop signal to rtpbin and rtpjitterbuffer to notify the - application that the NPT stop position has been reached. +2022-10-30 19:01:54 +0900 Seungha Yang <seungha@centricular.com> -2009-03-27 11:20:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk> + * sys/d3d11/gstd3d11vp9dec.cpp: + d3d11vp9dec: Disallow Profile2 12bits stream + Since DXVA does not support the format, specify bit-depth field + to sinkpad template caps so that d3d11vp9dec can be skipped + during autoplugging + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3297> - * gst/selector/gstoutputselector.c: - outputselector: reset state when going to READY - Reset the last-buffer, the pending pad and the segment when going to the READY - state. - Fixes #576712. +2022-10-30 18:37:55 +0900 Seungha Yang <seungha@centricular.com> -2009-03-25 21:24:44 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + * gst/videoparsers/gstvp9parse.c: + vp9parse: Set subsampling to src caps even if GBR stream + Some muxer elements will need the subsampling information + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3297> - * gst/qtmux/gstqtmux.c: - qtmux: fix reusing element - State change to READY and then back to PAUSED should still provide - the proper structures as are otherwise freshly available following - a request_new_pad. - Pointed out by Thiago Santos. +2022-10-30 18:35:08 +0900 Seungha Yang <seungha@centricular.com> -2009-03-26 20:28:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst/videoparsers/gstvp9parse.c: + vp9parse: Delaying src caps until frame is parsed if profile > 0 + subsampling and/or bitdepth information will be required for + negotiation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3297> - * gst/mxf/mxfmux.c: - * gst/mxf/mxftypes.c: - mxf: Fix compilation and compiler errors with GLib < 2.16.0 +2022-10-29 16:17:53 +0530 Sanchayan Maity <sanchayan@asymptotic.io> -2009-03-26 14:26:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * ext/fdkaac/gstfdkaacenc.c: + fdkaacenc: Update documentation to clarify bitrate and peak-bitrate + bitrate property is only applicable for constant bitrate and + peak-bitrate is only applicable for variable bitrate. Clarify + the same. - * gst/mxf/mxftypes.c: - mxf: Fix "cast to pointer type of different size" compiler warning +2022-10-29 12:19:58 +0530 Sanchayan Maity <sanchayan@asymptotic.io> -2009-03-26 13:24:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * ext/fdkaac/gstfdkaacenc.c: + * ext/fdkaac/gstfdkaacenc.h: + fdkaacenc: Add support for setting bitrate mode - * gst/mxf/mxftypes.c: - mxf: Rename forgotten function to fix unresolved symbols error +2021-01-31 22:00:36 +0530 Sanchayan Maity <sanchayan@asymptotic.io> -2009-03-26 13:20:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * ext/fdkaac/gstfdkaacenc.c: + * ext/fdkaac/gstfdkaacenc.h: + fdkaacenc: Add support for setting peak bitrate - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdv-dif.c: - * gst/mxf/mxfvc3.c: - mxf: Use mxf_u{l,uid}_is_equal() and friends instead of memcmp() +2021-01-23 18:35:12 +0530 Sanchayan Maity <sanchayan@asymptotic.io> -2009-03-26 13:11:07 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * ext/fdkaac/gstfdkaacenc.c: + * ext/fdkaac/gstfdkaacenc.h: + fdkaacenc: Add support for enabling afterburner + This is an additional quality parameter. In the default configuration this + quality switch is deactivated because it would cause a workload increase + which might be significant. If workload is not an issue in the application + it can be recommended to activate this feature. - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfdms1.h: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfmux.c: - * gst/mxf/mxftypes.c: - * gst/mxf/mxftypes.h: - mxf: Differentiate between UL and UUID +2020-11-26 19:23:11 +0530 Sanchayan Maity <sanchayan@asymptotic.io> -2009-03-26 12:46:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * ext/fdkaac/gstfdkaacdec.c: + fdkaacdec: Do not report decoding error for flush request + A flush request is done when set_format is called to empty internal bit + buffer maintained by fdk-aac. When this happens, during the explicit + call to handle_buffer, decodeFrame does not return a AAC_DEC_OK. This + gets reported as a decoding error while no decoding error in fact took + place. Since this can be confusing, just return a GST_FLOW_OK and log + that an explicit flush was requested. - * gst/mxf/Makefile.am: - * gst/mxf/mxf.c: - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfaes-bwf.h: - * gst/mxf/mxfalaw.c: - * gst/mxf/mxfalaw.h: - * gst/mxf/mxfd10.c: - * gst/mxf/mxfd10.h: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfdv-dif.c: - * gst/mxf/mxfdv-dif.h: - * gst/mxf/mxfessence.c: - * gst/mxf/mxfessence.h: - * gst/mxf/mxfjpeg2000.c: - * gst/mxf/mxfjpeg2000.h: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfmpeg.h: - * gst/mxf/mxfmux.h: - * gst/mxf/mxfparse.h: - * gst/mxf/mxftypes.c: - * gst/mxf/mxftypes.h: - * gst/mxf/mxful.c: - * gst/mxf/mxful.h: - * gst/mxf/mxfup.c: - * gst/mxf/mxfup.h: - * gst/mxf/mxfvc3.c: - * gst/mxf/mxfvc3.h: - * gst/mxf/mxfwrite.c: - mxf: Source files and #include cleanup - -2009-03-26 12:10:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/xdgmime/Makefile.am: - * gst/xdgmime/gstxdgmime.c: - xdgmime: Use GIOs g_content_type_guess() if possible +2022-10-25 13:22:30 +1100 Matthew Waters <matthew@centricular.com> -2009-03-26 11:51:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/codecparsers/gstvp9parser.c: + vp9parser: initialize subsampling to -1 + The default value of 0 is a valid subsampling value and could be + confused with an 'unset' value. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3260> - * gst/mxf/mxfwrite.c: - mxf: Use the UL database for some more ULs +2022-10-27 14:20:37 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-26 11:42:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/va/gstvaencoder.c: + vaencoder: Reset attribute index to one. + Further fix to 4ffb3663 where I forgot to reset the attribute index. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3285> - * gst/mxf/mxfmetadata.c: - mxf: Remove some GLib < 2.14 compatibility stuff +2022-10-03 15:20:24 -0300 Thibault Saunier <tsaunier@igalia.com> -2009-03-26 11:37:28 +0100 Руслан Ижбулатов <lrn1986@gmail.com> + * ext/dash/gstdashdemux.c: + * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: + adaptivedemux: Minor typo fix + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3159> - * configure.ac: - * sys/acmenc/Makefile.am: - * sys/acmenc/acmenc.c: - * sys/acmmp3dec/Makefile.am: - * sys/acmmp3dec/acmmp3dec.c: - acm: Port to MinGW - Fixes bug #573595. - -2009-03-26 11:33:50 +0100 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - * gst/xdgmime/Makefile.am: - xdgmime: Link with winsock library to fix build with MinGW - Partially fixes bug #573595. - -2009-03-26 11:32:08 +0100 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - * gst/dccp/Makefile.am: - * gst/dccp/gstdccp.c: - * gst/dccp/gstdccp.h: - * gst/dccp/gstdccp_common.h: - * gst/dccp/gstdccpclientsink.c: - * gst/dccp/gstdccpclientsink.h: - * gst/dccp/gstdccpclientsrc.c: - * gst/dccp/gstdccpclientsrc.h: - * gst/dccp/gstdccpserversink.c: - * gst/dccp/gstdccpserversink.h: - * gst/dccp/gstdccpserversrc.c: - * gst/dccp/gstdccpserversrc.h: - dccp: Port DCCP plugin to MinGW - Partially fixes bug #573595. - -2009-03-26 11:23:30 +0100 Руслан Ижбулатов <lrn1986@gmail.com> - - * configure.ac: - dccp: Disable the dccp plugin if no pthread support is available - Partially fixes bug #573595. - -2009-03-26 08:13:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - Merge branch 'mxfmux' - -2009-03-26 08:12:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfdv-dif.c: - * gst/mxf/mxfjpeg2000.c: - * gst/mxf/mxfvc3.c: - mxfmux: Cleanup +2022-09-20 15:32:52 -0300 Thibault Saunier <tsaunier@igalia.com> -2009-03-26 08:11:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * ext/dash/gstmpdclient.c: + dash: Fix computing `repeat_index` when seeking in stream with a start !=0 on the first fragment + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3159> - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfalaw.c: - * gst/mxf/mxfmux.c: - * gst/mxf/mxfmux.h: - mxfmux: Fix handling of buffers with more than one edit unit and EOS handling +2022-10-27 15:21:30 +0800 He Junyan <junyan.he@intel.com> -2009-03-25 23:04:13 +0200 Stefan Kost <ensonic@users.sf.net> + * gst-libs/gst/codecparsers/gsth265bitwriter.c: + * gst-libs/gst/codecparsers/gsth265bitwriter.h: + * tests/check/libs/h265bitwriter.c: + h265bitwriter: Correct the all API to byte aligned. + In fact, all the h265 bit writer have byte aligned output. So we + change the API from bit size in unit to byte size, which is easy + to use. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3193> + +2022-10-27 13:42:17 +0800 He Junyan <junyan.he@intel.com> + + * gst-libs/gst/codecparsers/gsth264bitwriter.c: + * gst-libs/gst/codecparsers/gsth264bitwriter.h: + * sys/va/gstvah264enc.c: + * tests/check/libs/h264bitwriter.c: + h264bitwriter: Correct the all API to byte aligned. + In fact, all the h264 bit writer have byte aligned output except + the slice header. So we change the API from bit size in unit to + byte size, which is easy to use. For slice header, we add a extra + "trail_bits_num" to return the unaligned bits number. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3193> + +2022-10-27 14:40:49 +0800 He Junyan <junyan.he@intel.com> + + * gst-libs/gst/codecparsers/gsth264bitwriter.c: + * gst-libs/gst/codecparsers/gsth265bitwriter.c: + bitwriter: Fix a nal conversion bug when input is not byte aligned. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3193> + +2022-10-24 11:56:51 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> + + * sys/msdk/gstmsdkvpp.c: + msdkvpp: Set va mem caps as higher priority + We use va pool as msdkvpp's bufferpool, which means both va memory + and dma memory will be allocated by va pool. Considering drm modifier + stuff is not ready, we use va memory with higher priortiry than + dma memory when deciding vpp caps. + Besides, this patch removes the specified "interlace-mode" in vpp caps. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3253> - * ext/ladspa/gstsignalprocessor.c: - * ext/ladspa/gstsignalprocessor.h: - ladspa: comment signalprocessor class more and do minor code cleanups +2022-10-18 03:36:23 +0000 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2009-03-25 12:40:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/msdk/gstmsdkav1enc.c: + * sys/msdk/gstmsdkav1enc.h: + * sys/msdk/gstmsdkenc.c: + * sys/msdk/gstmsdkenc.h: + msdkav1enc: Remove reorder TU workaround + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3225> - * configure.ac: - Require core >= 0.10.22.1 for %u pad template support +2022-10-18 03:10:43 +0000 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2009-03-24 15:23:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk> + * sys/msdk/gstmsdkav1enc.c: + * sys/msdk/gstmsdkav1enc.h: + * sys/msdk/gstmsdkenc.c: + * sys/msdk/gstmsdkenc.h: + msdkav1enc: Remove pts workaround + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3225> - * gst/selector/gstinputselector.c: - selector: merge the tags - Merge the tags received on the input-selector sinkpads instead of only keeping - the last one we saw. +2022-10-27 04:15:01 +0900 Seungha Yang <seungha@centricular.com> -2009-03-23 19:33:31 +0000 Jan Schmidt <thaytan@noraisin.net> + * gst-libs/gst/codecparsers/meson.build: + codecparsers: {h264,h265}bitwriter: Don't install headers yet + Those APIs are quite early stage of development, and we might want to + change them in the near future + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3275> - * NEWS: - Fix version number in the NEWS file +2022-10-18 16:34:41 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2009-03-19 01:17:25 +0200 René Stadler <mail@renestadler.de> + * sys/msdk/gstmsdkvpp.c: + msdkvpp: Fix upper frc + Refact vpp commit 4c6b7194451ff6fbfe88834219d982302114d74b broke the + upper FRC, here to fix this by using outbuf_new. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3223> - * gst/aacparse/gstaacparse.c: - aacparse: Fix busyloop when seeking. Fixes #575388 - The problem is that after a discont, set_min_frame_size(1024) is called when - detect_stream returns FALSE. However, detect_stream calls check_adts_frame - which sets the frame size on its own to something larger than 1024. This is the - same situation as in the beginning, so the base class ends up calling - check_valid_frame in an endless loop. +2022-07-29 18:15:08 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2009-03-19 00:32:40 +0200 René Stadler <mail@renestadler.de> + * docs/plugins/gst_plugins_cache.json: + * sys/msdk/gstmsdkav1enc.c: + bad: Add msdkav1enc docs + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2971> - * gst/aacparse/gstaacparse.c: - aacparse: Refactor check_valid_frame to expose broken code - Just moving code around and removing an unhelpful/misleading comment. +2022-10-25 08:14:18 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> -2009-03-23 11:17:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk> + * gst/codecalpha/gstalphacombine.c: + alphacombine: Add missing query handler for gaps + The gap handling was in place, but there was no event handler to trigger it. + Implement the alpha sink event handler for the gaps. This fixes handling of + valid streams which may not refresh the alpha frames for every video frames. + It will also allow a clean error if the stream was missing the initial + alpha frame, at least until we find a better way to handle these + invalid frames. + Related to #1518 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3264> - * gst/qtmux/gstqtmux.c: - qtmux: fix includes for lseek - -- +2022-10-26 11:47:43 +0200 Ignacio Casal Quinteiro <qignacio@amazon.com> -2009-03-20 14:20:16 +0100 LRN <lrn1986 at gmail dot com> + * sys/applemedia/avfdeviceprovider.m: + avfdeviceprovider: do not leak the properties + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3268> - * gst/qtmux/gstqtmux.c: - win32: fix seeking in large files - Use _lseeki64() on Windows to seek in large files. - Fixes #576021. +2022-10-21 10:57:39 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-16 11:21:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk> + * sys/va/gstvaencoder.c: + vaencoder: Fix caps semantics. + When using gst_va_caps_from_profiles() the semantics of sink/src caps + depends if the element is an encoder or a decoder. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3063> - * ext/jack/gstjack.c: - * ext/jack/gstjack.h: - * ext/jack/gstjackaudiosink.c: - * ext/jack/gstjackaudiosrc.c: - jack: Add new connection mode - Add a new connection mode to jacksrc and jacksink. In this new auto-force - connection mode jack will create as many ports as requested/needed in the - pipeline and will then connect as many physical ports as possible, possibly - leaving some ports unconnected. - Also get rid of some leftover g_print. - Fixes #575284. +2022-10-19 16:44:07 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-23 15:06:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/va/gstvadecoder.c: + * sys/va/gstvaencoder.c: + va: Fix typos. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3063> + +2022-08-11 12:51:17 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvaencoder.c: + * sys/va/gstvah264enc.c: + vah264enc: Fail if unsupported rate control. + Handle when encoder doesn't support rate control, which is set as + VA_RC_NONE, and if the set rate control mode is not supported by the + GStreamer element, the element configuration fails. + Also it logs out max and target bitrate. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3063> + +2022-09-15 12:56:14 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvah264enc.c: + vah264enc: Add todo item. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3063> + +2022-10-19 16:08:17 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvaencoder.c: + * sys/va/gstvaencoder.h: + * sys/va/gstvah264enc.c: + vaencoder: Honor entrypoint at constructor. + The entrypoint is set when the encoder helper is constructed, + nonetheless it was also passed as parameter when opening. That's + buggy. + In order to simplify the code, the entrypoint at construction is + honored. + But gst_va_encoder_has_profile_and_entrypoint() now doesn't rely in + the internal list of profiles since it only contains those that + belongs to codec and entrypoint, thus it queries directly the VA + driver. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3063> - * gst/mxf/mxfparse.c: - mxf: Move some static const variables into functions +2022-08-11 12:50:27 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-13 19:42:18 +0100 Alessandro Decina <alessandro.decina@collabora.co.uk> + * sys/va/gstvabaseenc.c: + vabaseenc: Scope error bail out. + Though this is not enforced by the GStreamer code style, it's clearer + to add a nested scope for error handling using label/goto. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3063> - * configure.ac: - * ext/celt/gstceltenc.c: - celtenc: build with celt 0.5. +2022-09-20 15:00:15 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-22 20:14:25 +0000 Jan Schmidt <thaytan@noraisin.net> + * sys/va/gstvabaseenc.c: + * sys/va/gstvabaseenc.h: + * sys/va/gstvah264enc.c: + vabaseenc: Use class entrypoint. + Add a macro to access to class entrypoint and use it instead of move + it to a variable. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3063> - * configure.ac: - back to development -> 0.10.11.1 +2022-10-26 02:55:34 +0900 Seungha Yang <seungha@centricular.com> -2009-03-20 15:55:19 +0200 Stefan Kost <ensonic@users.sf.net> + * gst-libs/gst/d3d11/gstd3d11-private.h: + * gst-libs/gst/d3d11/gstd3d11format.h: + d3d11: Move format defines to private header + Those defines will be likely changed/deleted in the future, and we + don't need to expose them to public at the moment + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3265> - * tests/check/Makefile.am: - tests: reenable metadata test +2022-10-25 09:39:07 +0300 Sebastian Dröge <sebastian@centricular.com> -2009-03-20 15:33:31 +0200 Stefan Kost <ensonic@users.sf.net> + * gst-libs/gst/transcoder/gsttranscoder.c: + * gst-libs/gst/va/gstvaallocator.c: + * gst-libs/gst/vulkan/gstvkerror.c: + Fix various warnings from gobject-introspection + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3261> - * tests/check/Makefile.am: - metadata: reenable test +2022-10-22 11:13:10 +0100 Tim-Philipp Müller <tim@centricular.com> -2009-03-20 15:18:05 +0200 Stefan Kost <ensonic@users.sf.net> + * tests/check/elements/fdkaac.c: + * tests/check/meson.build: + fdkaac: add minimal unit test + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1785> - * ext/metadata/metadataexif.h: - * ext/metadata/metadataiptc.h: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadatamuxpng.c: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsepng.c: - * ext/metadata/metadataxmp.h: - metdata: more logging and code cleanups - Sprinkle more debug log statements into the code. Move some repeaded string - constant into header files and use sizeof instead of manually counted bytes. Add - comments. +2022-10-22 11:10:24 +0100 Tim-Philipp Müller <tim@centricular.com> -2009-03-20 15:14:07 +0200 Stefan Kost <ensonic@users.sf.net> + * ext/fdkaac/gstfdkaacenc.c: + fdkaacenc: fix output caps in case of implicit signaling and HE-AAC + Need to put the actual profile in the output caps otherwise any + capsfilter after the encoder that was used to force the output + profile will fail, such as + fdkaacenc ! audio/mpeg,stream-format=adts,profile=he-aac-v1 ! .. + because we put profile=lc in there to match the profile signaled + in the ADTS header. This is expressed through the base-profile=lc + in the GStreamer caps though, the profile needs to carry the + 'real' profile. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1785> - * ext/metadata/metadatamuxjpeg.c: - metadata: fix muxing jfifless jpeg. Fixes #574401 - Don't error out when to be muxed jpeg has no jfif, as we can easily - add it. +2022-10-21 17:10:57 +0100 Tim-Philipp Müller <tim@centricular.com> -2009-03-20 15:10:22 +0200 Stefan Kost <ensonic@users.sf.net> + * ext/fdkaac/gstfdkaacenc.c: + fdkaacenc: don't set base-profile=lc for non-backwards compatible output + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1785> - * ext/metadata/metadataexif.h: - * ext/metadata/metadataiptc.h: - * ext/metadata/metadataxmp.h: - metadata: fix include guards +2022-10-21 13:15:29 +0100 Tim-Philipp Müller <tim@centricular.com> -2009-03-20 15:04:16 +0200 Stefan Kost <ensonic@users.sf.net> + * docs/plugins/gst_plugins_cache.json: + * ext/fdkaac/gstfdkaacenc.c: + fdkaacenc: rename profile=sbr|ps to profile=he-aac-v1|he-aac-v2 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1785> - * ext/metadata/metadata.c: - metadata: rework doc comment +2022-03-01 14:12:27 +0100 Piotrek Brzeziński <piotr@centricular.com> -2009-03-09 23:43:55 +0200 Stefan Kost <ensonic@users.sf.net> + * ext/fdkaac/gstfdkaacenc.c: + fdkaacenc: add support for AAC-LD + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1785> - * gst/autoconvert/Makefile.am: - * gst/camerabin/Makefile.am: - * gst/dtmf/Makefile.am: - * gst/liveadder/Makefile.am: - * gst/mxf/Makefile.am: - * gst/nuvdemux/Makefile.am: - * gst/qtmux/Makefile.am: - * gst/rtpmux/Makefile.am: - * gst/siren/Makefile.am: - * gst/valve/Makefile.am: - Makefile.am: no static libs for plugins +2022-02-23 17:17:25 +0100 Piotrek Brzeziński <piotr@centricular.com> -2009-03-22 15:58:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * ext/fdkaac/gstfdkaacenc.c: + fdkaacenc: add support for HE-AACv1 and HE-AACv2 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1785> - * gst/mxf/mxfmux.c: - mxfmux: Fix error handling +2022-10-22 04:28:03 +0900 Seungha Yang <seungha@centricular.com> -2009-03-22 15:51:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + gst-plugins-bad: Update Windows plugins cache + Add/update d3d11, qsv, nvcodec, wic, directshow, and amfcodec plugins cache + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3250> - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfalaw.c: - * gst/mxf/mxfdv-dif.c: - * gst/mxf/mxfjpeg2000.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfup.c: - * gst/mxf/mxfvc3.c: - mxfmux: Fix some memory leaks, improve debugging and handle errors better +2022-10-22 03:02:56 +0900 Seungha Yang <seungha@centricular.com> -2009-03-22 15:35:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/nvcodec/gstcudamemorycopy.c: + * sys/nvcodec/gstnvencoder.cpp: + * sys/nvcodec/gstnvh264encoder.cpp: + * sys/nvcodec/gstnvh265encoder.cpp: + nvcodec: Update for documentation + * Use GST_PARAM_DOC_SHOW_DEFAULT flags for GPU ID related + properties + * Fix some typos + * Add since markers + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3250> - * gst/mxf/mxfmux.c: - * gst/mxf/mxfmux.h: - mxfmux: Add an error state from which we return immediately - Also improve debugging a bit. +2022-10-22 02:59:13 +0900 Seungha Yang <seungha@centricular.com> -2009-03-19 20:41:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/mediafoundation/gstmfaudiodecoder.cpp: + * sys/mediafoundation/gstmfaudioencoder.cpp: + * sys/mediafoundation/gstmfh264enc.cpp: + * sys/mediafoundation/gstmfh265enc.cpp: + * sys/mediafoundation/gstmfvideoencoder.cpp: + * sys/mediafoundation/gstmfvp9enc.cpp: + mediafoundation: Update for documentation + * Use GST_PARAM_DOC_SHOW_DEFAULT flags for GPU ID related + properties + * Add doc caps + * Add since markers + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3250> + +2022-10-22 04:09:39 +0900 Seungha Yang <seungha@centricular.com> + + * sys/mediafoundation/gstmfvideoencoder.cpp: + mfvideoencoder: Document only hardware encoders + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3250> + +2022-10-22 22:37:33 +0900 Seungha Yang <seungha@centricular.com> + + * sys/mediafoundation/gstmfvideoencoder.cpp: + mfvideoencoder: Fix device enumeration + Although a GPU does not support the codec, the other GPU might + be able to support the codec + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3250> + +2022-10-22 02:56:23 +0900 Seungha Yang <seungha@centricular.com> + + * sys/amfcodec/gstamfh264enc.cpp: + * sys/amfcodec/gstamfh265enc.cpp: + amfcodec: Update for documentation + * Use GST_PARAM_DOC_SHOW_DEFAULT flags for GPU ID related + properties + * Add doc caps + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3250> - * gst/mxf/mxful.c: - mxf: Optimize mxf_ul_is_subclass() a bit +2022-10-22 02:53:16 +0900 Seungha Yang <seungha@centricular.com> -2009-03-19 14:30:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/qsv/gstqsvdecoder.cpp: + * sys/qsv/gstqsvencoder.cpp: + qsv: Use GST_PARAM_DOC_SHOW_DEFAULT flag + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3250> - * gst/mxf/Makefile.am: - * gst/mxf/mxfparse.c: - * gst/mxf/mxfparse.h: - * gst/mxf/mxftypes.h: - * gst/mxf/mxful.c: - * gst/mxf/mxful.h: - mxf: Start implementing a central UL database and add some helper functions and use them +2022-10-22 02:49:00 +0900 Seungha Yang <seungha@centricular.com> -2009-03-17 14:27:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/d3d11/gstd3d11compositor.cpp: + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/gstd3d11deinterlace.cpp: + * sys/d3d11/gstd3d11screencapturesrc.cpp: + * sys/d3d11/gstd3d11testsrc.cpp: + * sys/d3d11/gstd3d11videosink.cpp: + d3d11: Update for documentation + * Use GST_PARAM_DOC_SHOW_DEFAULT flags for GPU ID related + properties + * Add doc caps + * Increase deinterlace max resolution + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3250> - * gst/mxf/mxfmpeg.c: - mxfmux: Make sure to include a picture in the edit units when muxing MPEG2/MPEG4 +2022-10-22 02:48:23 +0900 Seungha Yang <seungha@centricular.com> -2009-03-17 14:23:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/d3d11/gstd3d11screencapturesrc.cpp: + * sys/d3d11/gstd3d11winrtcapture.cpp: + d3d11: Run indent + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3250> + +2022-10-22 22:33:01 +0900 Seungha Yang <seungha@centricular.com> + + * sys/wic/plugin.cpp: + wic: Add since marker + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3250> + +2022-10-22 03:12:19 +0900 Seungha Yang <seungha@centricular.com> + + * sys/directshow/plugin.cpp: + directshow: Add since marker + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3250> + +2022-10-21 23:20:47 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_config.cpp: + * sys/qsv/libmfx/meson.build: + * sys/qsv/meson.build: + qsv: Enable MinGW toolchain support + Use PCRE regex method to work around (likely) GCC std::regex bug, + and enable building for non-MSVC + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3239> - * gst/mxf/mxfmpeg.c: - mxfdemux: Remove accidentially committed g_assert_not_reached() +2022-10-21 21:50:01 +0530 Nirbheek Chauhan <nirbheek@centricular.com> -2009-03-16 17:49:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/vulkan/cocoa/gstvkcocoa_utils.h: + * gst-libs/gst/vulkan/cocoa/gstvkwindow_cocoa.m: + * gst-libs/gst/vulkan/ios/gstvkios_utils.h: + * gst-libs/gst/vulkan/ios/gstvkwindow_ios.m: + gl/vulkan: Fix static linking on macOS + duplicate symbol '__invoke_on_main' in: + /Library/Frameworks/GStreamer.framework/Versions/1.0/lib/libgstvulkan-1.0.a(cocoa_gstvkwindow_cocoa.m.o) + /Library/Frameworks/GStreamer.framework/Versions/1.0/lib/libgstgl-1.0.a(cocoa_gstglwindow_cocoa.m.o) + ld: 1 duplicate symbol for architecture x86_64 + clang: error: linker command failed with exit code 1 (use -v to see invocation) + Also make the same change in iOS for consistency. + Continuation of https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1132 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3242> - * gst/mxf/mxfup.c: - mxf: Add support for muxing/demuxing subsampled YUV formats +2022-10-18 17:05:41 +1100 Matthew Waters <matthew@centricular.com> -2009-03-16 17:22:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: configure rtpulpfecdec passthrough property + This allows downstream (payloaders mostly) to be able to correctly + detect actual packet loss from rtp sequence numbers. + See + https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/581 + for background. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1407 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3212> - * gst/mxf/mxfup.c: - mxfdemux: Use correct width/height for stride conversions +2022-10-07 04:20:29 +0900 Seungha Yang <seungha@centricular.com> -2009-03-16 17:18:17 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/d3d11/gstd3d11screencapture.cpp: + * sys/d3d11/gstd3d11screencapture.h: + * sys/d3d11/gstd3d11screencapturesrc.cpp: + * sys/d3d11/gstd3d11winrtcapture.cpp: + * sys/d3d11/gstd3d11winrtcapture.h: + * sys/d3d11/meson.build: + d3d11screencapture: Add WinRT API based capture mode + Add Windows Graphics Capture (WGC) API based screen capture mode. + The conditions where this mode is used: + * Explicitly requested by user (capture-api property) + * To capture specific window + * When DXGI desktop duplication API does not work on hybrid graphics systems + (e.g., multi-gpu laptop) + Full features of this implementation require Windows 11. And Windows 11 + SDK is required to build this feature. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3144> - * gst/mxf/mxfup.c: - mxf: Implement stride transformations for raw video content for muxing and demuxing +2022-10-06 23:54:14 +0900 Seungha Yang <seungha@centricular.com> -2009-03-16 15:37:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/d3d11/gstd3d11dxgicapture.cpp: + * sys/d3d11/gstd3d11dxgicapture.h: + * sys/d3d11/gstd3d11screencapture.cpp: + * sys/d3d11/gstd3d11screencapture.h: + * sys/d3d11/gstd3d11screencapturesrc.cpp: + * sys/d3d11/meson.build: + d3d11screencapture: Subclassing capture implementation + Preparation to use WinRT capture API + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3144> + +2022-10-21 19:08:49 +0900 Seungha Yang <seungha@centricular.com> + + * docs/plugins/gst_plugins_cache.json: + * sys/qsv/gstqsvav1enc.cpp: + * sys/qsv/gstqsvdecoder.cpp: + * sys/qsv/gstqsvencoder.cpp: + * sys/qsv/gstqsvh264dec.cpp: + * sys/qsv/gstqsvh264enc.cpp: + * sys/qsv/gstqsvh265dec.cpp: + * sys/qsv/gstqsvh265enc.cpp: + * sys/qsv/gstqsvjpegenc.cpp: + * sys/qsv/gstqsvvp9enc.cpp: + * sys/qsv/plugin.cpp: + qsv: Add plugin doc + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2738> + +2022-07-09 05:38:05 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/libmfx/api/vpl/mfx.h: + * sys/qsv/libmfx/api/vpl/mfxcommon.h: + * sys/qsv/libmfx/api/vpl/mfxdefs.h: + * sys/qsv/libmfx/api/vpl/mfxencodestats.h: + * sys/qsv/libmfx/api/vpl/mfxjpeg.h: + * sys/qsv/libmfx/api/vpl/mfxstructures.h: + * sys/qsv/libmfx/api/vpl/mfxvideo++.h: + * sys/qsv/libmfx/api/vpl/mfxvideo.h: + * sys/qsv/libmfx/dispatcher/linux/device_ids.h: + * sys/qsv/libmfx/dispatcher/linux/mfxloader.cpp: + * sys/qsv/libmfx/dispatcher/linux/mfxloader.h: + * sys/qsv/libmfx/dispatcher/linux/mfxvideo_functions.h: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl.cpp: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl.h: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_config.cpp: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_loader.cpp: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_lowlatency.cpp: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_msdk.cpp: + * sys/qsv/libmfx/dispatcher/windows/main.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_critical_section.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_critical_section.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher_defs.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher_log.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher_log.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_driver_store_loader.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_driver_store_loader.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_dxva2_device.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_dxva2_device.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_exposed_functions_list.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_function_table.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_library_iterator.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_library_iterator.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_load_dll.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_load_dll.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_vector.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_win_reg_key.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_win_reg_key.h: + * sys/qsv/libmfx/dispatcher/windows/mfxvideo++.h: + * sys/qsv/libmfx/dispatcher/windows/version.rc.in: + * sys/qsv/libmfx/meson.build: + qsv: Update SDK version to v2022.2.4 + See release note + https://github.com/oneapi-src/oneVPL/releases/tag/v2022.2.0 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2738> - * gst/mxf/mxfup.c: - mxfdemux: Simplify caps selection by using a lookup table +2022-10-14 16:05:28 +0800 He Junyan <junyan.he@intel.com> -2009-03-16 12:48:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst/videoparsers/gstav1parse.c: + av1parse: Correct the pts for frames and OBUs inside a TU. + When the output alignment is smaller than the input alignment, for + example, When the output alignment is "FRAME" and the parse is likely + connecting to a decoder, the current PTS setting for AV1 frames inside + a TU is not very correct. + For example, a TU may begin with non-displayed frames and end with a + displayed frame. The current way will assign the PTS to the first + non-displayed frame, which is a decode-only frame and the PTS will be + discarded in the video decoder. While the last displayed frame has + invalid PTS, and so the video decoder needs to guess its PTS based on + the frame rate and previous frame's PTS. This is not a decent and + robust way. And more important, when the previous frames provide DTS, + the video decoder will also guess the PTS based on the previous frames' + DTS and trigger the warning like: + gstvideodecoder.c:3147:gst_video_decoder_prepare_finish_frame: \ + <vavp9dec0> decreasing timestame + It sets the reordered_output and makes the decoder in free run mode. + We should correct the PTS for a TU, let the non-displayed frames have + no PTS while set the correct PTS to the displayed one. Also, when the + AV1 stream has multi spatial layers, there are more than one displayed + frames inside one TU with the same PTS. + Note: If the input alignment is not TU aligned, we can not know the + exact PTS of this TU, and so we just clear the PTS of the decode only + frame and leave others unchanged. + We also correct all the PTS if the output is OBU aligned. All their + PTS and DTS are set to the input buffer's PTS. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3182> - * gst/mxf/mxfup.c: - mxfmux: Add initial support for muxing raw picture essence +2022-10-14 17:25:45 +0800 He Junyan <junyan.he@intel.com> -2009-03-16 12:15:46 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst/videoparsers/gstav1parse.c: + av1parse: Only check the TU bound when the alignment is TU. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3182> - * gst/mxf/mxfmux.c: - mxfmux: Only add an essence container UL once to the partition and preface +2022-10-14 15:46:16 +0800 He Junyan <junyan.he@intel.com> -2009-03-16 12:07:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst/videoparsers/gstav1parse.c: + av1parse: push all data once when input alignment not smaller than output. + When the incoming data has big alignment than the output, we do not need to + call finish_frame() and exit the current handle_frame() for each splitted + frame. We can push them all at one shot with in one handle_frame(), whcih + may improve the performance and can help us to find the edge of TU. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3182> - * gst/mxf/mxfup.c: - mxfdemux: Add support for AYUV and v308 YUV colorspaces +2022-10-14 15:27:52 +0800 He Junyan <junyan.he@intel.com> -2009-03-16 11:00:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst/videoparsers/gstav1parse.c: + av1parse: Set the output buffer flags correctly. + The current code forgets to clear some flags and has some typo. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3182> - * gst/mxf/mxfmpeg.c: - mxfmux: Use the correct edit rate instead of estimating it from the first buffer duration +2022-10-21 10:50:36 +1100 Matthew Waters <matthew@centricular.com> -2009-03-15 15:27:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: also add rtcp-fb ccm fir for video mlines by default + In addition to the 'nack pli' already added. Both are supported by + rtpbin/rtpsession by default already. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3235> - * gst/mxf/mxfdemux.c: - mxfdemux: Error out directly if pushing a packet downstream failed +2022-10-19 16:03:55 +0900 Sangchul Lee <sc11.lee@samsung.com> -2009-03-15 15:27:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: Improve documentation of 'turn-server' property + Description about how to set time-limited credentials is added. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3229> - * gst/mxf/mxfdv-dif.c: - mxfmux: Add support for DV/DIF muxing and add framerate, etc to the caps when demuxing DV/DIF content +2022-09-23 18:25:41 +0200 Mathieu Duponchelle <mathieu@centricular.com> -2009-03-15 15:27:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * gst/debugutils/gstfakeaudiosink.c: + * gst/debugutils/gstfakesinkutils.c: + * gst/debugutils/gstfakesinkutils.h: + * gst/debugutils/gstfakevideosink.c: + fake{video|audio}sink: don't proxy properties at instance init. + Instead proxy properties from the GstBaseSink class at class_init time, + and duplicate the rest of the fakesink properties manually. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1442 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3073> + +2022-10-18 11:16:20 +0200 Alba Mendez <alba.mendez@dolby.com> + + * gst-libs/gst/webrtc/nice/nice.c: + webrtcbin: support adding TURN servers after pipeline start + Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1680 + When a TURN server is added for the first time, propagate + the change to all nice streams that already exist. This + lets us add servers after the pipeline has been started + (and streams have been added). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3217> - * gst/mxf/mxfmux.c: - mxfmux: Add some debugging and error out on invalid input data +2022-10-17 06:48:12 -0500 Fabian Orccon <forccon@fluendo.com> -2009-03-14 19:59:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * ext/srtp/meson.build: + srtp: Fix test skipping when plugin option is disabled + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3200> - * gst/deinterlace/gstdeinterlace.c: - deinterlace: Fix uninitialized variable compiler warnings +2022-10-14 00:17:52 +0900 Seungha Yang <seungha@centricular.com> -2009-03-11 19:38:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/d3d11/gstd3d11videosink.cpp: + * tests/examples/d3d11/d3d11videosink-present.cpp: + d3d11videosink: Add "emit-present" property + Controls the decision for "present" signal use, and + allows delayed "present" signal handler install via the property + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3176> - * gst/mxf/mxfmpeg.c: - mxfmux: Add support for muxing MPEG audio and video +2022-10-17 19:36:13 +0300 Sebastian Dröge <sebastian@centricular.com> -2009-03-11 19:38:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/play/gstplay-signal-adapter.c: + play: Add/fix various annotations + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3194> - * gst/mxf/mxfmpeg.c: - mxfdemux: Use correct caps type for AC3 audio (audio/x-ac3 instead of audio/ac3) +2022-10-17 11:29:02 +0300 Sebastian Dröge <sebastian@centricular.com> -2009-03-11 19:34:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/vulkan/android/gstvkdisplay_android.c: + * gst-libs/gst/vulkan/cocoa/gstvkdisplay_cocoa.m: + * gst-libs/gst/vulkan/gstvkdevice.c: + * gst-libs/gst/vulkan/gstvkdisplay.c: + * gst-libs/gst/vulkan/gstvkfence.c: + * gst-libs/gst/vulkan/gstvkformat.c: + * gst-libs/gst/vulkan/gstvkinstance.c: + * gst-libs/gst/vulkan/gstvkqueue.c: + * gst-libs/gst/vulkan/gstvkutils.c: + * gst-libs/gst/vulkan/ios/gstvkdisplay_ios.m: + * gst-libs/gst/vulkan/wayland/gstvkdisplay_wayland.c: + * gst-libs/gst/vulkan/xcb/gstvkdisplay_xcb.c: + vulkan: Add/fix various annotations + And fix a memory leak in gst_vulkan_display_wayland_new() in error + cases. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3194> - * gst/mxf/mxfjpeg2000.c: - mxfmux: Add support for muxing JPEG2000 code streams +2022-10-17 10:54:06 +0300 Sebastian Dröge <sebastian@centricular.com> -2009-03-11 19:33:54 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/d3d11/gstd3d11converter.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + d3d11: Add/fix various annotations + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3194> - * gst/mxf/mxfvc3.c: - mxfmux: Add support for muxing VC-3 (aka DNxHD) video +2022-10-17 10:51:42 +0300 Sebastian Dröge <sebastian@centricular.com> -2009-03-11 19:33:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/cuda/gstcudacontext.c: + * gst-libs/gst/cuda/gstcudautils.c: + cuda: Add/fix various annotations + And fix a memory leak when creating a CUDA context fails. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3194> - * gst/mxf/mxfalaw.c: - mxfmux: Add support for muxing A-Law audio +2022-10-17 10:47:02 +0300 Sebastian Dröge <sebastian@centricular.com> -2009-03-11 19:33:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/codecs/gsth264decoder.c: + * gst-libs/gst/codecs/gsth264picture.c: + * gst-libs/gst/codecs/gsth265decoder.c: + * gst-libs/gst/codecs/gsth265picture.c: + * gst-libs/gst/codecs/gstvp9decoder.h: + codecs: Add/fix various annotations + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3194> - * gst/mxf/mxfaes-bwf.c: - mxfmux: Add support for muxing raw audio +2022-10-17 10:44:24 +0300 Sebastian Dröge <sebastian@centricular.com> -2009-03-11 19:32:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/audio/gstnonstreamaudiodecoder.c: + badaudio: Add/fix annotations + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3194> - * configure.ac: - * gst/mxf/Makefile.am: - * gst/mxf/mxf.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfmux.c: - * gst/mxf/mxfmux.h: - * gst/mxf/mxfparse.c: - * gst/mxf/mxfparse.h: - * gst/mxf/mxftypes.h: - * gst/mxf/mxfwrite.c: - * gst/mxf/mxfwrite.h: - mxf: Add MXF muxer - This muxer currently only supports OP1a and is - probably not yet 100% complying to the standards. +2022-10-14 21:51:17 +0300 Sebastian Dröge <sebastian@centricular.com> -2009-03-11 19:30:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/webrtc/ice.c: + * gst-libs/gst/webrtc/ice.h: + * gst-libs/gst/webrtc/icetransport.c: + * gst-libs/gst/webrtc/icetransport.h: + * gst-libs/gst/webrtc/nice/nice.c: + webrtc: Add/fix various annotations + And mark string parameters as const. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3194> - * ext/jp2k/gstjasperenc.c: - jp2kenc: Add width/height/fourcc to the pad template caps +2022-10-17 00:40:46 +0900 Seungha Yang <seungha@centricular.com> -=== release 0.10.11 === + * docs/plugins/gst_plugins_cache.json: + * sys/wasapi2/gstwasapi2client.cpp: + * sys/wasapi2/gstwasapi2client.h: + * sys/wasapi2/gstwasapi2device.c: + * sys/wasapi2/gstwasapi2ringbuffer.cpp: + * sys/wasapi2/gstwasapi2ringbuffer.h: + * sys/wasapi2/gstwasapi2sink.c: + * sys/wasapi2/gstwasapi2src.c: + * sys/wasapi2/gstwasapi2util.c: + * sys/wasapi2/gstwasapi2util.h: + wasapi2: Add support for process loopback capture + Adding loopback capture mode for specified PID. + Note that this feature requires Windows 10 build 20348 + (Windows 11/Windows Server 2022 or later), + and any process loopback related properties will not be exposed + if OS does not support it. + Example launch lines: + * wasapi2src loopback-mode=include-process-tree loopback-target-pid=<PID> + Captures audio generated by an application (specified by PID) + and its child process + * wasapi2src loopback-mode=exclude-process-tree loopback-target-pid=<PID> + Captures desktop audio excluding PID and its child process + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1278 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3195> -2009-03-21 01:09:08 +0000 Jan Schmidt <thaytan@noraisin.net> +2022-10-14 16:21:07 -0400 Arun Raghavan <arun@asymptotic.io> - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-autoconvert.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-deinterlace2.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dirac.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-flv.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xdgmime.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.10.11 + * gst/rtmp2/gstrtmp2sink.c: + rtmp2sink: Correctly return GST_FLOW_ERROR on error + If there is an error while connecting, the streaming task will be stopped, and + is_running() will be false, causing a GST_FLOW_FLUSHING to be returned. Instead, + we perform the error check (!self->connection) first, to return an error if + that's what occured. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3189> -2009-03-20 23:37:39 +0000 Jan Schmidt <thaytan@noraisin.net> +2022-10-14 18:51:43 +0200 Mathieu Duponchelle <mathieu@centricular.com> - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ky.po: - * po/lt.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/tr.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files + * gst-libs/gst/webrtc/nice/nice.c: + webrtc/nice: fix small leak of split strings + g_strfreev previously stopped at our manual NULL-termination. Fix by + restoring the pointer after joining. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3188> -2009-03-20 23:31:19 +0000 Jan Schmidt <thaytan@noraisin.net> +2022-10-12 16:11:47 +0800 He Junyan <junyan.he@intel.com> - * sys/dshowdecwrapper/gstdshowvideodec.h: - dshowdec: Add par_n and par_d to the object structure to fix compilation + * gst/videoparsers/gstvp9parse.c: + vp9parse: The show_existing_frame buffer should not be decode only. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3155> -2009-03-18 12:32:08 +0000 Jan Schmidt <thaytan@noraisin.net> +2022-10-11 16:17:26 +0800 He Junyan <junyan.he@intel.com> - * configure.ac: - * win32/common/config.h: - 0.10.6.5 pre-release + * gst/videoparsers/gstvp9parse.c: + vp9parse: Correct the pts for frames inside a super frame. + When the alignment is "FRAME" and the parse is likely connecting to + a decoder, the current PTS setting for VP9 frames inside a super + frame is not very correct. + For example, the super frame may begin with non-displayed frames and + end with a displayed frame. The current way will assign the PTS to + the first non-displayed frame, which is a decode-only frame and the + PTS will be discarded in the video decoder. While the last displayed + frame has invalid PTS, and so the video decoder needs to guess its + PTS based on the frame rate and previous frame's PTS. This is not a + decent and robust way. And more important, when the previous frames + provide DTS, the video decoder will also guess the PTS based on the + previous frames' DTS and trigger the warning like: + gstvideodecoder.c:3147:gst_video_decoder_prepare_finish_frame: \ + <vavp9dec0> decreasing timestame + It sets the reordered_output and makes the decoder in free run mode. + We should correct the PTS for a super frame, let the non-displayed + frames have no PTS while set the correct PTS to the displayed one. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3155> -2009-03-18 10:35:43 +0000 Jan Schmidt <thaytan@noraisin.net> +2022-10-08 00:29:03 +0200 Piotr Brzeziński <piotr@centricular.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmetadata.c: - mxfdemux: Fix build on GLib < 2.16 some more + * sys/applemedia/avfvideosrc.m: + avfvideosrc: Allow specifying crop coordinates during screen capture + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3153> -2009-03-18 00:02:48 +0000 Jan Schmidt <thaytan@noraisin.net> +2022-10-12 11:12:50 +0200 Edward Hervey <edward@centricular.com> - * configure.ac: - 0.10.10.4 pre-release + * gst/mxf/gstmxfelement.c: + * gst/mxf/meson.build: + * gst/mxf/mxfcustom.c: + * gst/mxf/mxfcustom.h: + mxfdemux: Add support for Canon XF-HEVC + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1495 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3163> -2009-03-16 17:29:16 +0000 Zaheer Merali <zaheerabbas@merali.org> +2022-10-12 11:12:14 +0200 Edward Hervey <edward@centricular.com> * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmetadata.c: - mxf: Replace g_hash_table_get_values with code working with glib 2.6. - Fixes #575565 + mxfdemux: Don't leak index table segments on failures + The segment was freed ... but not the contents :) + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3163> -2009-03-13 16:31:56 +0000 Jan Schmidt <thaytan@noraisin.net> +2022-10-11 13:09:20 +0300 Sebastian Dröge <sebastian@centricular.com> - * configure.ac: - * win32/common/config.h: - 0.10.10.3 pre-release + * gst-libs/gst/webrtc/webrtc_fwd.h: + webrtc: Move GST_WEBRTC_ERROR_TYPE_ERROR at the end of the enum to keep ABI compatibility + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3154> -2009-03-13 16:16:21 +0000 Jan Schmidt <thaytan@noraisin.net> +2022-10-06 20:37:45 +0900 Sangchul Lee <sc11.lee@samsung.com> - * po/fi.po: - * po/id.po: - * po/pt_BR.po: - po: Update po files from upstream + * tests/check/elements/webrtcbin.c: + tests/webrtc: Add test for 'add-turn-server' action signal + It just checks return value of the action signal. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3131> -2009-03-13 16:08:03 +0000 Jan Schmidt <thaytan@noraisin.net> +2020-12-10 16:25:26 +0100 Johan Sternerup <johast@axis.com> - * po/LINGUAS: - * po/tr.po: - po: Add Turkish translation + * ext/sctp/gstsctpenc.c: + sctpenc: Prohibit sending of interleaved message parts + Apparently we cannot start sending messages from another datachannel + before the previous message was completely sent. usrsctplib will + complain about being locked on another stream id and set + errno=EINVAL. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2454> -2009-03-12 23:54:12 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> +2022-10-07 08:30:05 +0200 Wojciech Kapsa <wojciech.kapsa@medvc.eu> - * gst/xdgmime/gstxdgmime.c: - xdgmime: make xdg typefinder more conservative - The whole raison d'etre of this typefinder is to help avoid false - positives when used in combination with our main typefinder in - -base. Its task is not really to typefind audio/video files, even - less so given that it detects *MIME* types, not GStreamer media - types. Therefore, if this typefinder detects an audio or video - type, don't even suggest it - our own typefinders are hopefully - better at this and detect the right type of type on top of that, - and even if they're not we really want to know about it and fix - it. Fixes #575157. + * sys/decklink/gstdecklinkvideosrc.cpp: + * sys/decklink/gstdecklinkvideosrc.h: + decklink: reset calculation of gst_decklink_video_src_update_time_mapping on no_signal. When the HDMI cable was disconnected for a long time, the calculation took too much time. SDI cable works fine. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3132> -2009-03-13 15:59:37 +0100 Wim Taymans <wim.taymans@collabora.co.uk> +2022-10-07 07:56:21 -0400 Xavier Claessens <xavier.claessens@collabora.com> - * gst/rtpmanager/gstrtpsession.c: - rtpbin: don't return FALSE on seek events - Silently ignore the seek event instead of returning FALSE. + * ext/dash/meson.build: + Meson: Fix libxml2 fallback + The variable xml2lib_dep does not exist. The correct name is already in + the wrap file. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3136> -2009-03-13 10:07:18 +0000 Josep Torra <n770galaxy@gmail.com> +2022-09-22 22:39:31 +0900 Sangchul Lee <sc11.lee@samsung.com> - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: workaround to fix playback of certain malformed clips - Added a workarround to permit play certain malformed clips where first - SCR is greater than last SCR. Fixes bug #454228 + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: Fix pointer dereference before null check + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3129> -2009-03-12 20:13:11 +0100 Edward Hervey <bilboed@bilboed.com> +2022-09-26 13:57:15 +0200 Wojciech Kapsa <wojciech.kapsa@medvc.eu> - * tests/check/Makefile.am: - check: Disabling metadata unit test until #574401 is fixed. + * docs/plugins/gst_plugins_cache.json: + * sys/decklink/gstdecklink.cpp: + * sys/decklink/gstdecklink.h: + * sys/decklink/gstdecklinkaudiosink.cpp: + * sys/decklink/gstdecklinkaudiosink.h: + * sys/decklink/gstdecklinkaudiosrc.cpp: + * sys/decklink/gstdecklinkaudiosrc.h: + * sys/decklink/gstdecklinkdeviceprovider.cpp: + * sys/decklink/gstdecklinkvideosink.cpp: + * sys/decklink/gstdecklinkvideosink.h: + * sys/decklink/gstdecklinkvideosrc.cpp: + * sys/decklink/gstdecklinkvideosrc.h: + decklink: Add new persistent-id property and sort devices by persistent ID + The order of the devices iterator from the SDK is undefined and can + randomly change. + Keep the device-number property for backwards compatibility and + simplicity but prefer the persistent-id property and also use it for the + device provider implementation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3078> -2009-03-12 17:53:37 +0000 Christian Schaller <christian.schaller@collabora.co.uk> +2022-10-04 19:19:57 -0300 Thibault Saunier <tsaunier@igalia.com> - * gst-plugins-bad.spec.in: - add some more plugins the spec file + * gst/transcode/gsttranscodebin.c: + * gst/transcode/gsttranscodeelement.c: + transcodebin: Implement support for upstream stream selection + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3128> -2009-03-11 13:04:36 +0000 Christian Schaller <christian.schaller@collabora.co.uk> +2022-10-05 05:38:54 +0530 Nirbheek Chauhan <nirbheek@centricular.com> - * gst-plugins-bad.spec.in: - Update spec file with new plugins + * gst-libs/gst/d3d11/gstd3d11device.cpp: + d3d11: Fix debug build on UWP + GstDXGIGetDebugInterface() is unused when targeting UWP. We directly + call DXGIGetDebugInterface1() in that case. + Fixes build failure: + ../gst-libs/gst/d3d11/gstd3d11device.cpp(271): error C2440: '=': cannot convert from 'HRESULT (__cdecl *)(UINT,const IID &,void **)' to 'DXGIGetDebugInterface_t' + ../gst-libs/gst/d3d11/gstd3d11device.cpp(271): note: This conversion requires a reinterpret_cast, a C-style cast or function-style cast + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3118> -2009-03-10 15:12:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> +2022-10-05 15:59:03 +0900 Sangchul Lee <sc11.lee@samsung.com> - * ext/directfb/dfbvideosink.c: - dfbvideosink: include stdlib.h for abs() + * gst-libs/gst/webrtc/nice/nice.c: + webrtc/nice: Make sure to return NULL when validating turn server fails + It affects 'add-turn-server' signal action and 'turn-server' property + of webrtcbin. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3120> -2009-03-10 21:18:20 +0100 Josep Torra <n770galaxy@gmail.com> +2022-03-21 10:29:21 +0100 Johan Sternerup <johan.sternerup@axis.com> - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: Fixed a bug in the TS scanner. Fixes #574009 + * ext/webrtc/webrtcdatachannel.c: + * gst-libs/gst/webrtc/datachannel.c: + * gst-libs/gst/webrtc/datachannel.h: + * gst-libs/gst/webrtc/webrtc-priv.h: + * gst-libs/gst/webrtc/webrtc_fwd.h: + * tests/check/elements/webrtcbin.c: + webrtc: return error when sending on non-open datachannel + According to W3C + specification (https://w3c.github.io/webrtc-pc/#datachannel-send) we + should return InvalidStateError exception when trying to send when the + channel is not open. In the world of C/glib/gstreamer we don't have + exceptions but have to rely on gboolean/GError instead. Introducing + these calls for a change in function signature of the action signals + used to send data on the datachannel. Changing the signature of the + existing "send-string" and "send-data" signals would mean an immediate + breaking change so instead we deprecate them. Furthermore, there is no + way to express GError** as an argument to an action signal in a way + that fits language bindings (pointer-to-pointer simply does not work) + and we have to use regular functions instead. + Therefore we introduce gst_webrtc_data_channel_send_data_full() and + gst_webrtc_data_channel_send_string_full() while deprecating the old + functions and corresponding signals. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1958> -2009-03-10 00:22:55 +0000 Jan Schmidt <thaytan@noraisin.net> +2022-09-23 17:18:35 +0200 Stéphane Cerveau <scerveau@igalia.com> - * configure.ac: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ky.po: - * po/lt.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - * win32/common/config.h: - 0.10.10.2 pre-release + * gst-libs/gst/codecparsers/gsth265bitwriter.c: + * gst-libs/gst/codecparsers/gsth265parser.c: + * gst-libs/gst/codecparsers/gsth265parser.h: + * sys/nvcodec/gstnvh265dec.c: + * sys/va/gstvah265dec.c: + * tests/check/libs/h265bitwriter.c: + h265parse: fix typo in member of GstH265SPS + Rename sps_extnsion_params to sps_extension_params + Fix comment about vui_parameters_present_flag + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3072> -2009-03-10 00:10:09 +0000 Jan Schmidt <thaytan@noraisin.net> +2022-10-04 03:57:31 +0100 Tim-Philipp Müller <tim@centricular.com> - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-twolame.xml: - * ext/Makefile.am: - * ext/twolame/Makefile.am: - * ext/twolame/gsttwolame.c: - * ext/twolame/gsttwolame.h: - * po/POTFILES.in: - Moved twolame from Bad to Ugly + * meson.build: + Back to development + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3115> -2009-03-09 23:13:00 +0000 Jan Schmidt <thaytan@noraisin.net> +=== release 1.21.1 === - * common: - Automatic update of common submodule - From 7032163 to f8b3d91 +2022-10-04 01:14:01 +0100 Tim-Philipp Müller <tim@centricular.com> -2009-03-08 12:05:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * ChangeLog: + * NEWS: + * RELEASE: + * gst-plugins-bad.doap: + * meson.build: + Release 1.21.1 - * common: - Automatic update of common submodule - From ffa738d to 7032163 +2022-10-04 01:13:59 +0100 Tim-Philipp Müller <tim@centricular.com> -2009-03-08 11:21:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * ChangeLog: + Update ChangeLogs for 1.21.1 - * common: - Automatic update of common submodule - From 3f13e4e to ffa738d +2022-09-29 14:34:31 +0300 Sebastian Dröge <sebastian@centricular.com> -2009-03-07 11:46:33 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst/gaudieffects/gstgaussblur.c: + gaussblur: Fix memory leak when setting caps multiple times + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3091> - * common: - Automatic update of common submodule - From 3c7456b to 3f13e4e +2022-09-27 18:17:24 +0100 Christopher Obbard <chris.obbard@collabora.com> -2009-03-07 10:46:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/v4l2codecs/gstv4l2codecdevice.c: + v4l2codecs: Warn user when no media devices are found + Currently if the user is not able to access the devices under /dev/media*, + either due to no media devices present on the system or simply no permission + to access the device, v4l2codecs initialises with no features or debug messages. + Since calling `GST_DEBUG="v4l2*:7" gst-inspect-1.0 v4l2codecs` is a typical way + to diagnose why element(s) failed to enumerate, we should be more verbose here + when the user is not able to access any /dev/media* device. So print a simple + debug message in this case to aid debugging. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3088> - * common: - Automatic update of common submodule - From 57c83f2 to 3c7456b +2022-09-20 23:31:45 +0300 Mart Raudsepp <mart@leio.tech> -2009-03-06 22:36:19 +0000 Jan Schmidt <thaytan@noraisin.net> + * gst/mpegtsdemux/mpegtsbase.c: + tsdemux: Don't trigger a program change when falling back to ignore-pcr behaviour + Since commit a79a756b79aa1675e we could change to ignore-pcr automatically at 500ms + into a live stream when no PCR is seen by then. However the stream counting in + program change detection was wrongly considering ignore-pcr programs to have a + separate PCR PID, even though we are actually ignoring the PCR PID completely, + resulting in an erroneous program switch getting triggered from the different + stream count. This in turn would send an EOS and switch out the pads for what + actually is still the same program, while we intended to simply apply a + workaround for broken encoders. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3060> - * gst/camerabin/gstcamerabin.c: - * tests/check/elements/camerabin.c: - camerabin: Make the tests pass when the camerabin can't initialise. - The camerabin tests were throwing glib errors and hanging when - gst-plugins-good elements (jpegenc, videocrop) can't found. +2022-09-27 19:46:28 +0530 Nirbheek Chauhan <nirbheek@centricular.com> -2009-03-06 21:14:48 +0000 Jan Schmidt <thaytan@noraisin.net> + * meson.build: + meson: Remove builtin variable datadir from pkgconfig variables + Fixes warning with meson 0.62: + gst-plugins-bad| subprojects/gst-plugins-bad/meson.build:546: WARNING: + Project targets '>= 0.62' but uses feature deprecated since '0.62.0': + pkgconfig.generate variable for builtin directories. They will be + automatically included when referenced + and more. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3086> + +2022-09-22 09:14:57 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * tests/interactive/pitch-test.c: + bad/soundtouch: Fix interactive test build on MSVC + Needed for https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/930 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3064> + +2022-09-21 19:19:45 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + + * meson.build: + meson: Use implicit builtin dirs in pkgconfig generation + Starting with Meson 0.62, meson automatically populates the variables + list in the pkgconfig file if you reference builtin directories in the + pkgconfig file (whether via a custom pkgconfig variable or elsewhere). + We need this, because ${prefix}/libexec is a hard-coded value which is + incorrect on, for example, Debian. + Bump requirement to 0.62, and remove version compares that retained + support for older Meson versions. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1245 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3061> + +2022-09-20 13:38:26 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvabaseenc.c: + vabaseenc: Move out encoder validation from assertion. + Assertion can be disabled at compilation time. Still it's important to + validate it the encoder object was opened by the subclass. This patch + removes the assertion and returns if the encoder is open. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3051> - * tests/check/elements/.gitignore: - misc: Ignore the camerabin binary in the check/elements subdir +2022-09-12 09:46:43 -0400 Xavier Claessens <xavier.claessens@collabora.com> -2009-03-06 19:22:58 +0000 Jan Schmidt <thaytan@noraisin.net> + * tools/meson.build: + meson: Set install_tag on some targets + Trying to follow recommendation from Meson documentation: + https://mesonbuild.com/Installing.html#installation-tags + Move tools into 'bin' or 'bin-devel' categories to keep only libs and + plugins in the default 'runtime' category. This simplifies distribution + of GStreamer application skipping parts that are not needed, similarly + to what Cerbero does by hardcoding huge list of files. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3017> - * gst/camerabin/Makefile.am: - camerabin: Partly fix distcheck - Don't dist the generated marshal.h header by putting it in the headers - list. +2022-09-20 16:21:24 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2009-03-07 00:20:28 +0200 Stefan Kost <ensonic@users.sf.net> + * sys/msdk/gstmsdkav1enc.c: + msdkav1enc: We should not set other alignment here + According to spec, we have 32bit alignment for height (progressive) and + 16bit alignment for width, so here we don't need to add other alignment + settings. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3050> - * tests/check/pipelines/metadata.c: - metadata: change 'q' back to 'jpegenc' (my keyboard hates me) +2022-09-17 17:49:47 +0800 He Junyan <junyan.he@intel.com> -2009-03-06 23:34:56 +0200 Stefan Kost <ensonic@users.sf.net> + * sys/va/gstvah264enc.c: + va: h264enc: Fix rate control enum register failure for the second GPU. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3041> - * configure.ac: - * ext/metadata/metadata.c: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadataparsejpeg.c: - * tests/check/pipelines/metadata.c: - metadata: cleanup, fix the test, add comments - First do not build the plugin, if we have none of the backend, as it won't work - then. Fix the miniobject_unref error in the test. Sprinkle a first handful of - debug logs into the element code. +2022-09-17 10:14:40 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-06 20:02:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/va/gstvah264enc.c: + vah264enc: Avoid precision lost by just rounding up. + The code where dividing by 16 and later multiplying by 16, which is + spurious and a potential loose of precision. - * tests/check/elements/legacyresample.c: - legacyresample: Fix memory leak in the unit test by unreffing the caps +2022-09-16 14:17:38 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-06 17:46:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/va/gstvah264enc.c: + vah264enc: Update AUD property if driver can't handle raw data. - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - mxfdemux: Store and use the seqnum of the currently running segment everywhere +2022-09-16 13:55:11 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-06 17:24:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/va/gstvah264enc.c: + vah264enc: Remove unused dispose method. - * gst/mxf/mxfmetadata.c: - mxf: Don't even try to serialize DM frameworks as it will cause an assertion until this is finished +2022-09-16 15:45:11 -0400 Eric Knapp <emkman99@gmail.com> -2009-03-06 12:42:50 +0100 Edward Hervey <bilboed@bilboed.com> + * sys/va/gstvadeinterlace.c: + vadeinterlace: Fix passthrough latency query + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3038> - * ext/faad/gstfaad.c: - faad: Use the public headers if faad2 >= 2.7. Fixes #573369 - Since faad2-2.7, the public function prototypes are in sync with the - actual function prototypes used internally in libfaad. +2022-09-17 05:01:55 +0900 Seungha Yang <seungha@centricular.com> -2009-03-06 11:08:18 +0100 Wim Taymans <wim.taymans@collabora.co.uk> + * sys/nvcodec/gstnvh265dec.c: + nvh265sldec: Sync up with d3d11h265dec implementation + Each RefPicSetStCurrBefore/RefPicSetStCurrAfter/RefPicSetLtCurr array + might have empty element (i.e., reference pictures might not be stored + sequentially). Don't error out for the empty element case, + but instead, iterates each array and fill NVDEC's reference list + as much as possible + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1441 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3039> + +2022-09-16 12:50:33 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvabaseenc.c: + * sys/va/gstvabaseenc.h: + * sys/va/gstvah264enc.c: + va: baseenc: Fix gobject style for chained method. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3035> + +2022-09-13 23:20:54 +0900 Seungha Yang <seungha@centricular.com> + + * gst/codectimestamper/gsth264timestamper.c: + * gst/codectimestamper/gsth265timestamper.c: + codectimestamper: Update document + Add more description about those elements + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3021> - * ext/ladspa/gstladspa.c: - ladspa: fix compilation when LRDF is missing - -- +2022-06-09 22:32:16 +0800 He Junyan <junyan.he@intel.com> -2009-03-05 22:55:17 +0200 Stefan Kost <ensonic@users.sf.net> + * sys/va/gstvaav1dec.c: + va: av1dec: user internal buffer pool for non output layers. + The AV1 support multi spatial layers within one TU with different + resolutions, and only the highest spatial layer need to be output. + For example, there are two spatial layer, base level is 800x600 + and higher level is 1920x1080. We need to decode both because the + higher level needs base layer as reference, but we only need to output + 1920x1080 frames here. + The current manner always renegotiates the caps once we detect the + current picture resolution changes, so we renegotiate again and + again between different layers. That's a big waste and has very + low performance. We now only do the renegotiation for the highest + output layer. For other non output layers, we just keep a internal + buffer pool which is big enough to handle the surface allocation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2382> - * configure.ac: - * ext/ladspa/Makefile.am: - ladspa: remove -ldl as we now use glibs gmodule. +2022-05-12 10:12:37 +0800 He Junyan <junyan.he@intel.com> -2009-03-05 22:37:52 +0200 Stefan Kost <ensonic@users.sf.net> + * gst-libs/gst/codecs/gstav1decoder.c: + * gst-libs/gst/codecs/gstav1decoder.h: + codecs: av1decoder: Add the highest_spatial_layer field. + As SPEC says, when multi spatial layer exists, we should only output + one frame with the highest spatial id from each TU. We now store the + highest spatial layer information in the base class in order to let + the sub class handle different layers easily. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2382> - * configure.ac: - * ext/ladspa/Makefile.am: - * ext/ladspa/gstladspa.c: - ladspa: add initial liblrdf support. - Get classification from rdf metadata. +2022-09-15 00:52:14 +0000 Devin Anderson <danderson@microsoft.com> -2009-03-05 22:04:48 +0200 Stefan Kost <ensonic@users.sf.net> + * ext/voamrwbenc/gstvoamrwbenc.c: + * tests/check/elements/voamrwbenc.c: + * tests/check/meson.build: + voamrwbenc: Fix truncation of audio data at end-of-stream when audio data doesn't align on 20 millisecond frame size. + The AMR-WB codec imposes a fixed 20 millisecond frame size. In its current + form, the `voamrwbenc` plugin deals with this limitation by discarding any + audio at the end of the stream that falls short of 20 milliseconds. This patch + keeps the audio data, and appends silence to the end to preserve frame size + alignment. + The patch also adds tests to check for the updated behavior. I noticed that + tests weren't being built, so I changed the build to allow for building the + tests when the `tests` and `voamrwbenc` options are set. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3027> + +2022-09-15 21:56:27 +0900 Seungha Yang <seungha@centricular.com> + + * gst/codectimestamper/gstcodectimestamper.c: + codectimestamper: Fix for unknown framerate + Use default framerate if numerator or denominator is unknown + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3031> + +2022-08-26 08:43:34 -0400 Thibault Saunier <tsaunier@igalia.com> + + * docs/plugins/gst_plugins_cache.json: + * sys/qsv/plugin.cpp: + Build documentation for rust plugins + - Update the docker image we use, starting using the standard one adding + `gtk4-doc` as required by rust plugins + - Update the plugins_doc_caches as required, some more plugins are built + with the new image + - Install ninja from pip as the version from F31 is too old + - Avoid buildings all GSreamer plugins when building the doc as it takes + time and resources for no good reason + - Stop linking to `GInstanceInitFunc` as it is not present in latest GLib + documentation, leading to warnings in hotdoc. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2954> - * ext/mplex/gstmplex.cc: - mplex: fix required version - With this version it builds on opensuse 11.1. +2022-08-29 10:17:45 -0400 Thibault Saunier <tsaunier@igalia.com> -2009-03-05 14:40:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/meson.build: + doc: Do not build plugins to build the doc + It is not actually necessary + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2954> - * gst/mxf/mxfmetadata.c: - mxf: Don't use NULL GstStructures to prevent warnings - Currently serializing of DM Frameworks is not supported - yet by DMS1 and will give us NULL. - -2009-03-04 21:30:30 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * gst-libs/gst/interfaces/Makefile.am: - * gst-libs/gst/interfaces/photography.h: - * gst/camerabin/Makefile.am: - photography: declare interface as unstable API by means of a warning - Application developers won't know right away which module an interface comes from, - and may assume that it is covered by the usual GStreamer API guarantees, so make - it as clear as possible that this particular API is still subject to change - (should have done that with other libraries in -bad before too really). - -2009-03-04 20:37:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * configure.ac: - configure: detect faad's minor version and define FAAD2_MINOR_VERSION in config.h - -2009-03-04 16:46:08 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> - - * docs/plugins/inspect/plugin-valve.xml: - * gst-plugins-bad.spec.in: - * gst/valve/Makefile.am: - valve: rename plugin file from libfsvalve.* to libgstvalve.* - If you're running things uninstalled, you might need to manually - remove the registry to get the plugin's features to show up - correctly. Also, you probably want to do a make clean to get rid - of the old plugin file. - -2009-03-04 19:50:10 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/real/gstreal.c: - gsreal: bring down the rank of the real decoders to MARGINAL. - Basically, at this point, the ffmpeg equivalent decoders perform way - better, so we'll make the ffmpeg equivalents PRIMARY and these - MARGINAL. +2022-09-15 12:14:56 +0100 Tim-Philipp Müller <tim@centricular.com> -2009-03-04 18:42:15 +0000 Zaheer Merali <zaheerabbas@merali.org> + * tests/check/meson.build: + tests: add a few more orc tests + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3029> - * sys/dvb/gstdvbsrc.c: - dvbsrc: make some docs up to date +2022-09-14 00:58:37 +0900 Seungha Yang <seungha@centricular.com> -2009-03-04 18:16:31 +0000 Josep Torra <n770galaxy@gmail.com> + * sys/nvcodec/gstnvdec.c: + nvdec: Fix for HEVC decoding when coded resolution is larger than display resolution + As documented in the SDK header, we should set coded width/height + values to the corresponding decoder configuration option, + instead of display resolution + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1438 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3022> - * gst/mpegdemux/gstmpegtsdemux.c: - mpegtsdemux: reset sync_lut_len to 0 on READY to NULL +2022-09-13 04:06:02 +0900 Seungha Yang <seungha@centricular.com> -2009-03-04 15:30:04 +0000 Christian Schaller <cschalle@crazyhorse.localdomain> + * sys/nvcodec/gstcudamemorycopy.c: + cudaupload,cudadownload: Fix document + * Fix typo, NVIDA -> NVIDIA + * Add cudadownload doc to the source file + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3018> + +2022-09-13 01:02:55 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstcudamemorycopy.c: + cudaupload,cudadownload: Use shared GstD3D11Device context if possible + Handle d3d11 device context in set_context() method with + additional device compatibility check so that only NVIDIA GPU + associated d3d11 device can be configured in the element. + And clear old d3d11 device per set_info() for d3d11 device to be + updated as well. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3018> + +2022-09-13 01:02:50 +0900 Seungha Yang <seungha@centricular.com> + + * gst-libs/gst/cuda/cuda-gst.h: + * gst-libs/gst/cuda/gstcudacontext.c: + * gst-libs/gst/cuda/gstcudaloader.c: + * gst-libs/gst/cuda/gstcudautils.c: + * gst-libs/gst/cuda/gstcudautils.h: + * gst-libs/gst/cuda/meson.build: + * gst-libs/gst/cuda/stub/cuda.h: + * gst-libs/gst/cuda/stub/cudaD3D11.h: + cuda: Remove GST_CUDA_HAS_D3D define from header + ... and fix d3d11 specific enum type name + GST_CUDA_HAS_D3D is a build time define which indicates whether + GstD3D11 library is available or not, but DirectX SDK headers + must be available on the build system already. + Expose Direct3D related symbols if the build target is Windows + (i.e., if G_OS_WIN32 is defined) + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3018> + +2021-03-24 14:20:18 -0500 Zebediah Figura <z.figura12@gmail.com> + + * meson.build: + meson: Build with -Wl,-z,nodelete to prevent unloading of dynamic libraries and plugins + GLib made the unfortunate decision to prevent libgobject from ever being + unloaded, which means that now any library which registers a static type + can't ever be unloaded either (and any library that depends on those, + ad nauseam). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/778> + +2022-06-06 10:56:12 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * docs/plugins/gst_plugins_cache.json: + va: Remove from plugin cache. + GstVA is not currently build by CI, because libva version is lower + than expected. So, the gstva library is not build, thus some symbols + aren't documented, breaking the documentation CI. + To move things forward, let's just remove temporarly the va plugins + from cache. While we decide on how to update the libva package in + the CI. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1025> + +2022-06-27 18:56:01 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * gst-libs/gst/va/gstvaallocator.h: + va: allocator: Fix parameter name to match signature. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1025> + +2022-02-07 17:34:57 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * docs/libs/va/index.md: + * docs/libs/va/sitemap.txt: + * gst-libs/gst/va/gstva.h: + * gst-libs/gst/va/gstvaallocator.c: + * gst-libs/gst/va/gstvaallocator.h: + * gst-libs/gst/va/gstvadisplay.c: + * gst-libs/gst/va/gstvapool.c: + * gst-libs/gst/va/gstvasurfacecopy.h: + * gst-libs/gst/va/gstvautils.c: + * gst-libs/gst/va/gstvavideoformat.c: + * gst-libs/gst/va/meson.build: + * sys/va/gstjpegdecoder.c: + * sys/va/gstjpegdecoder.h: + * sys/va/gstvabasetransform.c: + * sys/va/gstvacompositor.c: + * sys/va/gstvafilter.c: + * sys/va/gstvah264enc.c: + va: Complete library and plugin documentation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1025> - Merge branch 'master' of ssh://uraeus@git.freedesktop.org/git/gstreamer/gst-plugins-bad +2022-09-13 14:46:37 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-04 15:28:46 +0000 Christian Schaller <cschalle@crazyhorse.localdomain> + * gst-libs/gst/va/gstva.h: + * gst-libs/gst/va/meson.build: + * sys/va/gstvabasedec.c: + * sys/va/gstvacaps.c: + * sys/va/gstvadecoder.c: + * sys/va/gstvadisplay_priv.c: + * sys/va/gstvaencoder.c: + * sys/va/gstvafilter.c: + * sys/va/gstvah264enc.c: + * sys/va/gstvajpegdec.c: + va: Move gstvavideoformat out of library headers. + Since it's no needed for API consumers. Though it can be added later. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1025> - * docs/plugins/Makefile.am: - * gst-plugins-bad.spec.in: - * tests/examples/Makefile.am: - docs/plugins/Makefile.am: add figures subdirectory tests/examples/Makefile.am: add mxf subdirectory gst-plugins.spec.in: add new plugins +2021-10-03 10:17:00 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-04 16:15:57 +0100 Peter Kjellerstedt <pkj@axis.com> + * docs/meson.build: + * gst-libs/gst/va/meson.build: + docs: Generate libgstva GI and pkg-config. + Currently libgstva is only exposed internally to gst-plugins-bad. No + headers are installed, no documentation generated, pkgconfig file, + neither gobject-introspection files. + This patch turn on all that. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1025> + +2022-05-19 00:44:40 +0900 Seungha Yang <seungha@centricular.com> + + * docs/plugins/gst_plugins_cache.json: + * gst/codectimestamper/gstcodectimestamper.c: + * gst/codectimestamper/gstcodectimestamper.h: + * gst/codectimestamper/gsth264timestamper.c: + * gst/codectimestamper/gsth264timestamper.h: + * gst/codectimestamper/gsth265timestamper.c: + * gst/codectimestamper/gsth265timestamper.h: + * gst/codectimestamper/meson.build: + * gst/codectimestamper/plugin.c: + * gst/meson.build: + * meson_options.txt: + Add H.264/H.265 timestamp correction element + Adding {h264,h265}timestamper element to correct timestamp of + encoded frames. This initial version supports only DTS + correction based on given PTS and SPS data. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2580> - * tests/check/Makefile.am: - check: gst-plugins-bad.supp needs to be distributed. +2022-09-07 11:22:45 -0400 Thibault Saunier <tsaunier@igalia.com> -2009-03-04 15:05:48 +0200 Stefan Kost <ensonic@users.sf.net> + * gst/debugutils/gsttestsrcbin.c: + * tests/validate/meson.build: + * tests/validate/testsrcbin/caps_spec.validatetest: + * tests/validate/testsrcbin/caps_spec/flow-expectations/log-testsrcbin0-video_src_0-expected: + testsrcbin: Add a way to specify caps for the output of the sources + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3007> - * configure.ac: - * ext/ladspa/gstladspa.c: - ladspa: add LIBDIR/ladspa to search path and make path more portable - Use glib defines for searchpath separators. Filter searchpath to avoid scanning - path entries twice. Fix the return in ladspa_plugin_directory_search to return - wheter we found a plugin. +2022-09-08 17:29:37 -0400 Thibault Saunier <tsaunier@igalia.com> -2009-03-04 14:34:12 +0200 Stefan Kost <ensonic@users.sf.net> + * gst/debugutils/gsttestsrcbin.c: + testsrcbin: Plug some leaks + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3007> - * ext/ladspa/Makefile.am: - * ext/ladspa/load.c: - * ext/ladspa/search.c: - * ext/ladspa/utils.h: - ladspa: rewrite the directory scanning, fixes first part of #573370 - Move the two function from search.c into gstladspa.c and make them static. - Remove non needed arguments from function prototypes. Use glib api for - simplicity and portability. +2020-11-19 18:34:00 -0300 Thibault Saunier <tsaunier@igalia.com> -2009-03-04 11:14:18 +0100 LRN <lrn1986@gmail.com> + * docs/plugins/gst_plugins_cache.json: + * gst/debugutils/gsttestsrcbin.c: + testsrcbin: Add an 'expose-sources-async' property + Which allows simluating usual source which require decoding etc in decodebin for example + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3007> - * ext/faad/gstfaad.c: - faad: use gint8 instead of int8_t - Use gint8 instead of int8_t to fix compilation. - Fixes #573851. +2022-09-05 18:32:20 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-04 11:07:52 +0100 LRN <lrn1986@gmail.com> + * sys/va/gstvajpegdec.c: + vajpegdec: Enhance explanation comment. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2948> - * ext/gsm/gstgsmdec.c: - gsmdec: Use G_BYTE_ORDER to fix Windows compile - gstgsmdec relies on BYTE_ORDER, which is not available on Windows. Use - G_BYTE_ORDER instead. - Fixes #573850. +2022-09-06 14:53:41 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-03 14:30:53 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * sys/va/gstvacaps.c: + va: caps: Use G_STMT_START / END + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2948> - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-mimic.xml: - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - Add Doc for mimic plugin +2022-09-05 16:59:12 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-03 14:03:34 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * sys/va/gstvajpegdec.c: + vajpegdec: Check if driver has internal color conversion. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2948> + +2022-09-06 18:49:02 +0200 Mathieu Duponchelle <mathieu@centricular.com> + + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: fix picking available payload types + When picking an available payload type, we need to pick one that is + available across all media. + The previous code, when multiple media were present, looked at the first one, + noticed it had pt 96 as the media pt, then simply looked at the next media, + noticed it didn't, and decided 96 was available. + Instead, check if the pt is used by any of the media, if it is, decide + it is not available and go to the next pt. I'm fairly sure that was the + original intent. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2984> - * configure.ac: - * ext/Makefile.am: - * ext/mimic/gstmimic.c: - Move mimic to -bad +2022-08-03 19:36:11 +0300 Jordan Petridis <jordan@centricular.com> -2009-03-03 14:20:37 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * ext/fluidsynth/gstfluiddec.c: + fluidsynth: correctly version guard methods + We bumped the minimum version to 2.1 but the api we used + wasn't introduced till version 2.2 of fluidsynth + Follow-up to gstreamer/gstreamer!2718 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2718 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2835> - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - * ext/mimic/gstmimic.c: - Re-indent to GST style +2022-08-21 03:37:40 +1000 Jan Schmidt <jan@centricular.com> -2008-07-25 22:47:26 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * ext/dash/gstdashdemux.c: + * ext/dash/gstdashdemux.h: + * ext/dash/gstmpdclient.c: + * ext/dash/gstmpdclient.h: + dashdemux: Preserve current representation on live manifest updates + When updating a manifest during live playback, preserve the current + representation for each stream. + During update_fragment_info, if the current representation changed + because it couldn't be matched, trigger a caps change and new + header download. + This reverts commit e0e1db212fd0df2239583b9099fc4361adeded05 + and reapplies "dashdemux: Fix issue when manifest update sets slow start + without passing necessary header & caps changes downstream" with + changes. + Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/507 + Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1729 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2920> - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - MOVED FROM GST-P-FARSIGHT Only output a newsegment if the incoming newsegment isnt a time segment - 20080725224726-3e2dc-f82b993c0fbfe8bd487d2f1962fec1d0b6564ebc.gz +2022-09-02 09:55:20 +0000 Florian Zwoch <fzwoch@gmail.com> -2008-07-25 22:26:48 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/va/plugin.c: + va: Fix log message when registering H264 encoder. + The log message would report an error for the H264 decoder when + registering failed, but we tried to register the H264 encoder instead. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2974> - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - MOVED FROM GST-P-FARSIGHT Remove unused member variables - 20080725222648-3e2dc-24649782a39462c7c3fef9d6270b3db4c4ace1bb.gz +2022-07-05 17:14:37 -0400 Olivier Crête <olivier.crete@collabora.com> -2008-07-25 22:24:48 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * ext/webrtc/gstwebrtcbin.c: + * tests/check/elements/webrtcbin.c: + webrtcbin: Allow locked mlines with no caps, as the last ones + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2439> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Send out the right segment and use stored timestamps directly - 20080725222448-3e2dc-e119bf09ede1cf187581d59176c8b35bafb731ae.gz +2022-05-16 18:05:25 -0400 Olivier Crête <olivier.crete@collabora.com> -2008-07-25 19:48:33 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * ext/webrtc/gstwebrtcbin.c: + * tests/check/elements/webrtcbin.c: + webrtcbin: Reject creating an offer if a locked mline has no caps + This avoids getting in a bunch of corner cases. We'd have to insert + a "rejected" line from the start as a place-holder to get around this, + but the rest of the code just becomes more complicated, so just + disallow it for now. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2439> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Skip non-keyframes before we get a keyframe - 20080725194833-3e2dc-583df57c8ebce4b149a01768ed7d3737136a208f.gz +2022-05-16 17:17:13 -0400 Olivier Crête <olivier.crete@collabora.com> -2008-07-25 19:33:58 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/webrtctransceiver.c: + * ext/webrtc/webrtctransceiver.h: + * tests/check/elements/webrtcbin.c: + webrtcbin: Store pending mid to make create-offer idempotent + If the mid is not stored in the transceiver, but it is stored in + last_offer, then a further create-offer call will just ignore that + transceiver. + Also include unit test for ensure it doesn't regress. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2439> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Ignore upstream newsegment events in mimdec - 20080725193358-3e2dc-7c0f22386e0208a45eae9c1d7eb62e86f61d14ba.gz +2022-05-26 18:17:16 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2008-07-25 19:25:30 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/msdk/gstmsdkvpp.c: + * sys/msdk/gstmsdkvpp.h: + msdkvpp: Add va memory when fixating src caps + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2498> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT emit the right timestamp in the newsegment event - 20080725192530-3e2dc-a3cc0ce73fca181caee323d699d8576df916e8d3.gz +2022-06-08 12:31:56 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2008-07-25 19:08:49 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/msdk/gstmsdkvpp.c: + * sys/msdk/gstmsdkvpp.h: + msdkvpp : Use va pool at linux path and system pool for windows + We use msdkvpp's own pool to allocate buffers instead of external frame + allocator mfxFrameAllocator. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2498> - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - MOVED FROM GST-P-FARSIGHT Use video/x-mimic as the caps type - 20080725190849-3e2dc-38e4acc9d4ad8231ed22f6cc4d7d8c2a8b5668e9.gz +2022-05-09 18:34:38 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2008-07-04 22:07:13 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/msdk/gstmsdkallocator.h: + * sys/msdk/gstmsdkallocator_libva.c: + * sys/msdk/gstmsdkvpp.c: + msdkvpp: Import buffer to msdk_surface + If the buffer is not msdk_buffer, we can try to directly import the + attached memory (i.e. va mem and dmabuf mem) by applying the common + uitl function: import_to_msdk_function (). + Here add a flag "from_qdata" in GstMsdkSurface to handle the cropping case, + we should avoid updating the crop values when msdk_surface is from the + memory's qdata, because the crop info from this surface is the already + updated one. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2498> - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - MOVED FROM GST-P-FARSIGHT Add proper locking to mimenc - 20080704220713-3e2dc-6a22d1a423716e8b84bc3bda9986a1b4ff0c0d37.gz +2022-05-09 18:19:01 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2008-07-04 22:03:18 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/msdk/gstmsdkvpp.c: + msdkvpp: Add va caps at sink and src pad + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2498> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Remove useless implementation of getcaps from mimdec - 20080704220318-3e2dc-d81bc59b2308c5ad0d3144030c5650295e99f3c6.gz +2022-08-25 17:28:36 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2008-07-04 22:02:43 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/msdk/gstmsdkenc.c: + msdkenc: Apply common util func to import mem as msdk_surface + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2498> - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - MOVED FROM GST-P-FARSIGHT Add proper locking to mimdec - 20080704220243-3e2dc-71c157d82999dfb41bd62b4064b1887ab22e84c1.gz +2022-05-27 17:56:33 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2008-07-04 21:59:36 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/msdk/gstmsdkallocator.c: + * sys/msdk/gstmsdkallocator.h: + * sys/msdk/gstmsdkallocator_libva.c: + * sys/msdk/gstmsdkallocator_libva.h: + * sys/msdk/meson.build: + * sys/msdk/msdk.h: + msdk: Add help functions to get mfxFrameSurface1 from GstBuffer and wrap it as GstMsdkSurface + Note that the memory abstraction for system memory is for windows path. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2498> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Remove leak - 20080704215936-3e2dc-22d992f98c9931f062662fc05f1ce65bc97f619a.gz +2022-05-19 19:18:21 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2008-07-04 21:55:50 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/msdk/gstmsdkenc.c: + * sys/msdk/msdk.c: + * sys/msdk/msdk.h: + msdkenc: Use va pool on linux and system pool for windows + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2498> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Reset the gst timestamp if the time different is too large - 20080704215550-3e2dc-76eb3f600f2b977e916f7e1f654529ddaff06ac9.gz +2022-05-19 18:57:50 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2008-07-04 21:52:08 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/msdk/gstmsdkenc.c: + msdkenc: Directly import dmabuf memory as mfx surface + When input buffer is of dmabuf memory but not a msdk buffer (i.e., the + allocator is not msdk_allocator), then we can try to get fd of this mem, + create the corresponding va surface and wrap it as mfx surface. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2498> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Use the timestamp from the first buffer as the base - 20080704215208-3e2dc-5822771f2694deda4a7cd5cdd3c38ab9eff7fa2d.gz +2022-04-21 17:27:09 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2008-07-04 21:49:35 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/msdk/gstmsdkenc.c: + msdkenc: Directly import va memory as mfx surface + If input buffer is of va memory, we can directly obtain va surface from + the buffer and wrap it as mfx surface. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2498> - * ext/mimic/gstmimenc.c: - MOVED FROM GST-P-FARSIGHT Store the timestamp in the header - 20080704214935-3e2dc-90ec73df3225b41baa681ab691fb8bd47e17c780.gz +2022-03-03 10:07:19 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> -2008-07-04 21:19:43 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/msdk/gstmsdk_va.c: + * sys/msdk/gstmsdk_va.h: + * sys/msdk/gstmsdkenc.c: + * sys/msdk/meson.build: + msdk: Use va libs API to get VA surface from buffer + Direct apply gst_va_buffer_get_surface to get VASurface from a buffer, + so remove corresponding functions which are not used. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2498> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Re-indent mimdec - 20080704211943-3e2dc-def1e0dacc4a45fe2b4afdcb903a1328c95117ac.gz +2022-09-01 15:11:31 -0400 Thibault Saunier <tsaunier@igalia.com> -2008-07-04 21:15:11 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * ext/aes/meson.build: + * ext/aom/meson.build: + * ext/assrender/meson.build: + * ext/avtp/meson.build: + * ext/bs2b/meson.build: + * ext/bz2/meson.build: + * ext/chromaprint/meson.build: + * ext/closedcaption/meson.build: + * ext/colormanagement/meson.build: + * ext/curl/meson.build: + * ext/dash/meson.build: + * ext/dc1394/meson.build: + * ext/directfb/meson.build: + * ext/dtls/meson.build: + * ext/dts/meson.build: + * ext/faac/meson.build: + * ext/faad/meson.build: + * ext/fdkaac/meson.build: + * ext/flite/meson.build: + * ext/fluidsynth/meson.build: + * ext/gme/meson.build: + * ext/gs/meson.build: + * ext/gsm/meson.build: + * ext/gtk/meson.build: + * ext/hls/meson.build: + * ext/iqa/meson.build: + * ext/isac/meson.build: + * ext/kate/meson.build: + * ext/ladspa/meson.build: + * ext/ldac/meson.build: + * ext/libde265/meson.build: + * ext/lv2/meson.build: + * ext/mdns/meson.build: + * ext/modplug/meson.build: + * ext/mpeg2enc/meson.build: + * ext/mplex/meson.build: + * ext/musepack/meson.build: + * ext/neon/meson.build: + * ext/onnx/meson.build: + * ext/openal/meson.build: + * ext/openaptx/meson.build: + * ext/opencv/meson.build: + * ext/openexr/meson.build: + * ext/openh264/meson.build: + * ext/openjpeg/meson.build: + * ext/openmpt/meson.build: + * ext/openni2/meson.build: + * ext/opus/meson.build: + * ext/qroverlay/meson.build: + * ext/resindvd/meson.build: + * ext/rsvg/meson.build: + * ext/rtmp/meson.build: + * ext/sbc/meson.build: + * ext/sctp/meson.build: + * ext/smoothstreaming/meson.build: + * ext/sndfile/meson.build: + * ext/soundtouch/meson.build: + * ext/spandsp/meson.build: + * ext/srt/meson.build: + * ext/srtp/meson.build: + * ext/svthevcenc/meson.build: + * ext/teletextdec/meson.build: + * ext/ttml/meson.build: + * ext/voaacenc/meson.build: + * ext/voamrwbenc/meson.build: + * ext/vulkan/meson.build: + * ext/wayland/meson.build: + * ext/webp/meson.build: + * ext/webrtc/meson.build: + * ext/webrtcdsp/meson.build: + * ext/wildmidi/meson.build: + * ext/wpe/meson.build: + * ext/x265/meson.build: + * ext/zbar/meson.build: + * ext/zxing/meson.build: + * gst/accurip/meson.build: + * gst/adpcmdec/meson.build: + * gst/adpcmenc/meson.build: + * gst/aiff/meson.build: + * gst/asfmux/meson.build: + * gst/audiobuffersplit/meson.build: + * gst/audiofxbad/meson.build: + * gst/audiolatency/meson.build: + * gst/audiomixmatrix/meson.build: + * gst/audiovisualizers/meson.build: + * gst/autoconvert/meson.build: + * gst/bayer/meson.build: + * gst/camerabin2/meson.build: + * gst/codecalpha/meson.build: + * gst/coloreffects/meson.build: + * gst/debugutils/meson.build: + * gst/dvbsubenc/meson.build: + * gst/dvbsuboverlay/meson.build: + * gst/dvdspu/meson.build: + * gst/faceoverlay/meson.build: + * gst/festival/meson.build: + * gst/fieldanalysis/meson.build: + * gst/freeverb/meson.build: + * gst/frei0r/meson.build: + * gst/gaudieffects/meson.build: + * gst/gdp/meson.build: + * gst/geometrictransform/meson.build: + * gst/id3tag/meson.build: + * gst/inter/meson.build: + * gst/interlace/meson.build: + * gst/ivfparse/meson.build: + * gst/ivtc/meson.build: + * gst/jp2kdecimator/meson.build: + * gst/jpegformat/meson.build: + * gst/librfb/meson.build: + * gst/midi/meson.build: + * gst/mpegdemux/meson.build: + * gst/mpegpsmux/meson.build: + * gst/mpegtsdemux/meson.build: + * gst/mpegtsmux/meson.build: + * gst/mxf/meson.build: + * gst/netsim/meson.build: + * gst/onvif/meson.build: + * gst/pcapparse/meson.build: + * gst/pnm/meson.build: + * gst/proxy/meson.build: + * gst/rawparse/meson.build: + * gst/removesilence/meson.build: + * gst/rist/meson.build: + * gst/rtmp2/meson.build: + * gst/rtp/meson.build: + * gst/sdp/meson.build: + * gst/segmentclip/meson.build: + * gst/siren/meson.build: + * gst/smooth/meson.build: + * gst/speed/meson.build: + * gst/subenc/meson.build: + * gst/switchbin/meson.build: + * gst/timecode/meson.build: + * gst/transcode/meson.build: + * gst/videofilters/meson.build: + * gst/videoframe_audiolevel/meson.build: + * gst/videoparsers/meson.build: + * gst/videosignal/meson.build: + * gst/vmnc/meson.build: + * gst/y4m/meson.build: + * meson.build: + * sys/amfcodec/meson.build: + * sys/androidmedia/meson.build: + * sys/applemedia/meson.build: + * sys/asio/meson.build: + * sys/bluez/meson.build: + * sys/d3d11/meson.build: + * sys/d3dvideosink/meson.build: + * sys/decklink/meson.build: + * sys/directshow/meson.build: + * sys/directsound/meson.build: + * sys/dvb/meson.build: + * sys/fbdev/meson.build: + * sys/ipcpipeline/meson.build: + * sys/kms/meson.build: + * sys/magicleap/meson.build: + * sys/mediafoundation/meson.build: + * sys/msdk/meson.build: + * sys/nvcodec/meson.build: + * sys/opensles/meson.build: + * sys/qsv/meson.build: + * sys/shm/meson.build: + * sys/tinyalsa/meson.build: + * sys/uvch264/meson.build: + * sys/v4l2codecs/meson.build: + * sys/va/meson.build: + * sys/wasapi/meson.build: + * sys/wasapi2/meson.build: + * sys/wic/meson.build: + * sys/winks/meson.build: + * sys/winscreencap/meson.build: + meson: Call pkgconfig.generate in the loop where we declare plugins dependencies + Removing some copy pasted code + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2970> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Simplify newsegment code - 20080704211511-3e2dc-b98d1e5b31c23eb7912197f9364a31560d092c63.gz +2022-09-01 11:51:48 -0400 Thibault Saunier <tsaunier@igalia.com> -2008-07-04 20:50:10 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * docs/meson.build: + * gst-libs/gst/adaptivedemux/meson.build: + * gst-libs/gst/audio/meson.build: + * gst-libs/gst/codecparsers/meson.build: + * gst-libs/gst/codecs/meson.build: + * gst-libs/gst/cuda/meson.build: + * gst-libs/gst/d3d11/meson.build: + * gst-libs/gst/insertbin/meson.build: + * gst-libs/gst/interfaces/meson.build: + * gst-libs/gst/mpegts/meson.build: + * gst-libs/gst/opencv/meson.build: + * gst-libs/gst/play/meson.build: + * gst-libs/gst/player/meson.build: + * gst-libs/gst/sctp/meson.build: + * gst-libs/gst/transcoder/meson.build: + * gst-libs/gst/uridownloader/meson.build: + * gst-libs/gst/va/meson.build: + * gst-libs/gst/vulkan/meson.build: + * gst-libs/gst/wayland/meson.build: + * gst-libs/gst/webrtc/meson.build: + * gst-libs/gst/webrtc/nice/meson.build: + * meson.build: + meson: Namespace the plugins_doc_dep/libraries variables + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2970> - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - MOVED FROM GST-P-FARSIGHT Port mimic plugins to GST_BOILERPLATE - 20080704205010-3e2dc-da41e5685ab9ceb67555d499125432cd12d5505d.gz +2022-09-01 10:28:13 -0400 Thibault Saunier <tsaunier@igalia.com> -2008-07-04 20:41:12 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * gst-libs/gst/cuda/meson.build: + cuda: meson: Fix generating GstCuda gir file against gstreamer-full + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2970> - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - * ext/mimic/gstmimic.c: - MOVED FROM GST-P-FARSIGHT Remove trailing whitespace in mimic plugin - 20080704204112-3e2dc-1ab4b913d58faa058742b01e083f7debd6877bb3.gz +2022-08-31 18:44:14 -0400 Thibault Saunier <tsaunier@igalia.com> -2008-07-04 20:29:41 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * meson.build: + meson: Rename plugins list and make them "dependency" objects + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2970> - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - MOVED FROM GST-P-FARSIGHT Fix conflicts - 20080704202941-3e2dc-7f5a38845b797e12d672551466e635d484cb6763.gz +2022-08-30 05:02:31 +0900 Seungha Yang <seungha@centricular.com> -2007-11-10 05:17:17 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + d3d11memory: Fix GstAllocator::mem_copy() implementation + We were checking possible bind flags for the DXGI format + of the source texture but that's never applied to + the destination texture desc. + Just use the already configured bind (and misc) flags of source texture + for the destination texture allocation without additional check. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2950> - * ext/mimic/gstmimenc.c: - MOVED FROM GST-P-FARSIGHT Fix mimic enc chain function, return res for chain(), get the parent element with the proper accessor function, use the _OBJECT debugging macros - 20071110051717-3e2dc-4726fcd19cc3d1121a4e13276a41f5f86dc1c9b1.gz +2022-08-24 08:22:49 +0200 Robert Rosengren <robertr@axis.com> -2007-11-10 05:14:27 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * ext/curl/gstcurlbasesink.c: + * ext/curl/gstcurlbasesink.h: + curlbasesink: gst_curl_base_sink_transfer_thread_close is internal + gst_curl_base_sink_transfer_thread_close is moved from external header + to be static function, as it has no users. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2732> - * ext/mimic/gstmimenc.c: - MOVED FROM GST-P-FARSIGHT Make the _set_caps function of mimic enc more robust - 20071110051427-3e2dc-381a71f2cbfdbf508e941b672e9058c82fabce24.gz +2022-07-07 09:20:04 +0200 Robert Rosengren <robertr@axis.com> -2007-11-10 05:14:01 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * ext/curl/gstcurlhttpsink.c: + * ext/curl/gstcurlhttpsink.h: + curlhttpsink: Only set MIME as content-type if not set by property + Setting the content-type property shall override internally detected MIME + types, to make it possible to do as following example (where audio/basic to be + used prior to audio/x-mulaw): + gst-launch-1.0 ... ! mulawenc ! audio/x-mulaw,rate=8000,channels=1 ! + curlhttpsink location=<url> content-type=audio/basic + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2732> - * ext/mimic/gstmimenc.c: - MOVED FROM GST-P-FARSIGHT Remove the gst 0.9.1 ifdef - 20071110051401-3e2dc-1f071d732d64573889977405995692d94b10a0d6.gz +2022-08-26 00:16:56 +0900 Seungha Yang <seungha@centricular.com> -2007-11-10 05:10:35 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * gst-libs/gst/d3d11/gstd3d11-private.h: + * gst-libs/gst/d3d11/gstd3d11bufferpool.cpp: + * gst-libs/gst/d3d11/gstd3d11bufferpool.h: + * gst-libs/gst/d3d11/gstd3d11compile.cpp: + * gst-libs/gst/d3d11/gstd3d11converter.cpp: + * gst-libs/gst/d3d11/gstd3d11converter.h: + * gst-libs/gst/d3d11/gstd3d11device.cpp: + * gst-libs/gst/d3d11/gstd3d11device.h: + * gst-libs/gst/d3d11/gstd3d11format.cpp: + * gst-libs/gst/d3d11/gstd3d11format.h: + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.h: + * gst-libs/gst/d3d11/gstd3d11utils.cpp: + * sys/d3d11/gstd3d11pluginutils.h: + d3d11: Update library doc + * Private header name is changed to gstd3d11-private.h to follow + naming convention + * Add Since mark everywhere + * Update member variable names to be consistent with the other + object implementations in this library + * Correct outdated documentation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2945> - * ext/mimic/gstmimenc.c: - MOVED FROM GST-P-FARSIGHT Make caps gst 0.10 compliant - 20071110051035-3e2dc-f7024bd3ecfb6794fe8d09dcb100ba0b4783df5d.gz +2022-08-25 14:24:25 +0200 Piotr Brzeziński <piotr@centricular.com> -2007-11-10 05:09:50 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/applemedia/avfvideosrc.m: + avfvideosrc: Fix wrong default framerate value + Current default G_MAXINT is not a correct value under any circumstances. + This creates an issue with screen capture, during which we currently do + not get any framerate info causing G_MAXINT to show up, where elements + downstream can possibly misbehave - for example, `vtenc` causes + a kernel panic. + Replace with 30/1 to avoid such scenarios. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2944> - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimenc.c: - MOVED FROM GST-P-FARSIGHT Use g_type_class_peek_parent instead of reffing the parent class directly - 20071110050950-3e2dc-6d14ddd6ae3ceeeaa4e641b7b09613e442927f92.gz +2022-08-25 15:28:21 +0800 He Junyan <junyan.he@intel.com> -2007-11-10 05:08:52 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/va/gstjpegdecoder.c: + jpegdecoder: return the real error of decode_scan and decode_frame. + The current handle_frame() does not return the real error that happens + in decode_scan and decode_frame, which makes the pipeline continue with + the error and may trigger asserting later. + We also return the error when decode_quant_table or decode_huffman_table + fails. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2938> - * ext/mimic/gstmimenc.c: - MOVED FROM GST-P-FARSIGHT Remove framesize properties on the mimic encoder - 20071110050852-3e2dc-cb8165c073bfa981790dc91693fd1c483ea7b6ea.gz +2022-08-19 21:54:48 +0900 Seungha Yang <seungha@centricular.com> -2007-11-10 05:07:53 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * tests/examples/d3d11/d3d11videosink-present.cpp: + * tests/examples/d3d11/meson.build: + examples: d3d11videosink: Add present signal example + Add an example to show the usage of present singal. + In this example, a text overlay with alpha blended background + will be rendered on swapchain's backbuffer by using + Direct3D11, Direct2D, and DirectWrite APIs. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2923> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Use the _OBJECT debug macros - 20071110050753-3e2dc-560d22a86eea1108f1746d0123744d33812e94c9.gz +2022-08-24 00:13:21 +0900 Seungha Yang <seungha@centricular.com> -2007-11-10 05:03:51 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/d3d11/gstd3d11videosink.cpp: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window.h: + * sys/d3d11/gstd3d11window_dummy.cpp: + d3d11videosink: Add display-format property + Make swapchian's display format configurable, since some DXGI formats + we can use for swapchain are not API interop compatible. + For instance, BGRA format should be used for Direct2D interop. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2923> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Use gst_pad_get_parent instead of looking into the GstObject directly - 20071110050351-3e2dc-636f7d7737494f810047a8ee6927cde060bb4b4b.gz +2022-08-19 20:25:31 +0900 Seungha Yang <seungha@centricular.com> -2007-11-10 05:02:32 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/d3d11/gstd3d11videosink.cpp: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window.h: + * sys/d3d11/gstd3d11window_corewindow.cpp: + * sys/d3d11/gstd3d11window_swapchainpanel.cpp: + * sys/d3d11/gstd3d11window_win32.cpp: + d3d11videosink: Add present signal + The "present" signal will be emitted just before the + IDXGISwapChain::Present() call. The client can perform additional + GPU operation with given GstD3D11Device object and + ID3D11RenderTargetView handle. Or, the client can read back + the scene to be displayed on window using the signal. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2923> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Return back result of pad push - 20071110050232-3e2dc-4a080d97963cd8ab6d528c4012d14353c1cfe97b.gz +2022-08-19 04:49:53 +0900 Seungha Yang <seungha@centricular.com> -2007-11-10 04:11:25 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * gst-libs/gst/codecs/gsth265decoder.c: + h265decoder: Update SpsMaxLatencyPictures properly + The SpsMaxLatencyPictures value never gets back to zero even if + it's needed. Update the value properly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2915> - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - MOVED FROM GST-P-FARSIGHT Ole's port to gst 0.10 - 20071110041125-3e2dc-e2994c3bbe1578d98e4f707bd10f24fabf942c2b.gz +2022-08-19 04:44:48 +0900 Seungha Yang <seungha@centricular.com> -2008-12-11 17:54:18 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * gst-libs/gst/codecs/gsth265decoder.c: + h265decoder: Reorganize debug printing + As of the MR + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2575 + gst_h265_decoder_process_sps() is called per slice and it causes + noisy debug message print. + Reorganize related and the other debug printings at once. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2915> - * ext/mimic/.git-darcs-dir: - MOVED FROM GST-P-FARSIGHT Remove .git-darcs-dir files +2022-08-20 16:15:15 +0100 Philippe Normand <philn@igalia.com> -2008-02-11 22:24:31 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> + * ext/openh264/gstopenh264dec.cpp: + * ext/openh264/gstopenh264enc.cpp: + openh264: Register debug categories earlier + Otherwise the GST_ERROR message logged in case of ABI mismatch would be done on + an uninitialized category. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2918> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Limit timestamp diff in case of a jump in the timestamps - 20080211222431-4f0f6-726fc66403081533371f775954aab4c7b8fdc643.gz +2022-08-20 16:57:27 +0100 Philippe Normand <philn@igalia.com> -2008-02-06 03:16:54 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> + * ext/openh264/gstopenh264enc.cpp: + openh264enc: Fix constrained-high encoding + constrained-high is high without B-frames, there is no EProfileIdc for this, so + assume high instead of hitting an assert down the line. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2919> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Make it back to 30 fps in caps - 20080206031654-4f0f6-d8197e53888906805041e6552c0dd774c55e9e89.gz +2022-08-19 09:07:50 -0400 Thibault Saunier <tsaunier@igalia.com> -2008-02-06 03:09:47 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> + * gst-libs/gst/webrtc/ice.c: + * gst-libs/gst/webrtc/ice.h: + * gst-libs/gst/webrtc/nice/nice.c: + webrtc:ice: Fix candidate stats related APIs for bindings + null-terminated arrays of structures is not usable. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2917> - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - * ext/mimic/gstmimenc.c: - MOVED FROM GST-P-FARSIGHT Fix timestamps in gst buffers sent by gstmimic - 20080206030947-4f0f6-9dc7d9b1a92a717c71b1e490a5591f0e2ffe0dad.gz +2022-08-18 13:27:02 +0800 He Junyan <junyan.he@intel.com> -2008-02-06 02:03:35 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> + * sys/va/gstvah265dec.c: + va: h265dec: Enable the scc_main_4:4:4_10 profile. + We should enable this profile which is already allown in vaprofile.c + after libva 1.8 version. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2909> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Fix framerate type in caps for gstmimic element - 20080206020335-4f0f6-0d9e136039ad6b7b84982bdac242a059d50fbb66.gz +2022-07-06 09:08:17 -0400 U. Artie Eoff <ullysses.a.eoff@intel.com> -2006-03-24 20:16:19 +0000 philippe.kalaf@collabora.co.uk <philippe.kalaf@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * sys/kms/gstkmssink.c: + * sys/kms/gstkmssink.h: + kmssink: add fd property + This allows an application to provide their own opened DRM device + fd handle to kmssink. For example, an application can lease + multiple fd's from a DRM master to display on different CRTC + outputs at the same time with multiple kmssink instances. + Specifying the fd property is not allowed when driver-name + and/or bus-id properties are specified. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2807> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Fixed couple of compilation issues - 20060324201619-2425b-bf339926f533aa4efece855fbbe94e59c7bb955f.gz +2022-08-19 00:05:17 +0900 Seungha Yang <seungha@centricular.com> -2006-03-24 19:57:20 +0000 philippe.kalaf@collabora.co.uk <philippe.kalaf@collabora.co.uk> + * sys/d3d11/gstd3d11deinterlace.cpp: + * sys/d3d11/gstd3d11screencapture.cpp: + * sys/d3d11/gstd3d11videosink.cpp: + d3d11: Use CRITICAL_SECTION instead of GRecMutex + The GRecMutex abstraction (and heap allocation happens in GLib) + is unnecessary for this plugin. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2914> - * ext/mimic/gstmimenc.c: - MOVED FROM GST-P-FARSIGHT Calls to gst_pad_get_parent ref the object so it needs to be unreffed < hexa00@gmail.com - 20060324195720-2425b-17928be34ee67f71efbaf62de76deba9ad13f0f2.gz +2022-08-17 11:18:54 -0400 Thibault Saunier <tsaunier@igalia.com> -2006-02-14 21:00:27 +0000 philippe.kalaf@collabora.co.uk <philippe.kalaf@collabora.co.uk> + * gst-libs/gst/webrtc/webrtc_fwd.h: + webrtc: doc: Cleanup Since markers + We hide some newly public symbols when moving some objects to the library + which was not really correct in the end. Properly add the Since markers + as needed. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2891> - * ext/mimic/Makefile.am: - MOVED FROM GST-P-FARSIGHT Separated ERROR_CFLAGS from GST_CFLAGS - 20060214210027-2425b-1f9e6ed591c08e5907d02ef7ea9a8cf62bf29840.gz +2022-08-16 08:59:00 -0400 Thibault Saunier <tsaunier@igalia.com> -2005-10-24 15:37:48 +0000 Philippe Khalaf <burger at speedy dot org> + * gst-libs/gst/webrtc/ice.h: + webrtc:ice: Reindent header + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2891> - * ext/mimic/gstmimdec.c: - MOVED FROM GST-P-FARSIGHT Should not be done in dispose, moving to finalize - 20051024153748-05459-9625fec05547c535bf5f3c66aebba84861b549aa.gz +2022-08-15 21:27:06 -0400 Thibault Saunier <tsaunier@igalia.com> -2005-07-16 19:50:21 +0000 Philipe Kalaf <philippe.kalaf@collabora.co.uk> + * gst-libs/gst/webrtc/ice.h: + webrtc:ice: Mark protected fields as such + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2891> - * ext/mimic/.git-darcs-dir: - * ext/mimic/Makefile.am: - * ext/mimic/gstmimdec.c: - * ext/mimic/gstmimdec.h: - * ext/mimic/gstmimenc.c: - * ext/mimic/gstmimenc.h: - * ext/mimic/gstmimic.c: - MOVED FROM GST-P-FARSIGHT Import from CVS to darcs +2022-08-15 21:25:25 -0400 Thibault Saunier <tsaunier@igalia.com> -2009-03-03 14:32:38 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * gst-libs/gst/webrtc/datachannel.c: + * gst-libs/gst/webrtc/dtlstransport.c: + * gst-libs/gst/webrtc/ice.c: + * gst-libs/gst/webrtc/icestream.c: + * gst-libs/gst/webrtc/icetransport.c: + * gst-libs/gst/webrtc/rtpreceiver.c: + * gst-libs/gst/webrtc/rtpsender.c: + * gst-libs/gst/webrtc/rtptransceiver.c: + webrtc: Fix documentaton moving symbols in the right pages + As those symbols are documented in a 'fwd' header smart indexing in + hotdoc wasn't working. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2891> + +2022-08-15 11:52:50 -0400 Thibault Saunier <tsaunier@igalia.com> + + * gst-libs/gst/webrtc/ice.c: + * gst-libs/gst/webrtc/ice.h: + * gst-libs/gst/webrtc/nice/nice.c: + webrtc:ice: Avoid using GArray in public API + And use plain null terminated C arrays instead. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2891> + +2022-08-15 11:37:57 -0400 Thibault Saunier <tsaunier@igalia.com> + + * gst-libs/gst/webrtc/ice.c: + webrtc:ice: Fix some annotations + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2891> + +2022-08-15 11:36:25 -0400 Thibault Saunier <tsaunier@igalia.com> + + * gst-libs/gst/webrtc/ice.c: + * gst-libs/gst/webrtc/ice.h: + webrtc: Make GstWebRTCIceCandidateStats a Boxed type + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2891> + +2022-08-14 17:38:24 -0400 Thibault Saunier <tsaunier@igalia.com> + + * gst-libs/gst/webrtc/ice.h: + webrtc:ice: Add padding to structures + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2891> + +2022-08-14 21:49:27 +0900 Seungha Yang <seungha@centricular.com> + + * gst-libs/gst/cuda/cuda-gst.h: + * gst-libs/gst/cuda/gstcudanvrtc.c: + * gst-libs/gst/cuda/gstcudanvrtc.h: + * gst-libs/gst/cuda/gstnvrtcloader.c: + * gst-libs/gst/cuda/gstnvrtcloader.h: + * gst-libs/gst/cuda/meson.build: + * sys/nvcodec/gstcudafilter.c: + cuda: Hide runtime compiler related header and symbols + That's already abstracted via gst_cuda_nvrtc_compile() method + and therefore, we do not need to expose such symbols yet. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2884> - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - rtpmux: Ignore rtpmux get_type function for docs +2022-08-17 12:22:38 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-03 19:08:28 +0000 Sebastian Pölsterl <marduk@k-d-w.org> + * sys/va/gstvajpegdec.c: + vajpegdec: Fix memory leak. + Free value content. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2899> - * gst/mpegdemux/mpegtspacketizer.c: - mpegtsparse: fix memleak - Fix memleak in mpegts_packetizer_clear where MpegTSPacketizerStream is - not freed properly when using foreach_stream_clear function. +2022-08-16 20:05:15 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-03 18:28:10 +0000 Josep Torra <n770galaxy@gmail.com> + * sys/va/gstvajpegdec.c: + vajpegdec: Fix 4:2:2 for i965. + Since i965 uses NV12 either for 4:2:0 and 4:2:2 chroma (using an + internal color conversion) the chroma validation has to be shortcut. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2899> - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - mpegtsdemux: dynamically adjust the sync LUT table - Make the sync LUT table adjusted dynamically according to the size - of scanned data. Fixes demuxing buffers of any size. +2022-08-16 19:50:49 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-02-25 21:05:42 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * gst-libs/gst/va/gstvavideoformat.c: + va: libs: Add Y42B format. + Enable 4:2:2 JPEG decoding in iHD. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2899> - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-autoconvert.xml: - * gst/autoconvert/Makefile.am: - * gst/autoconvert/gstautoconvert.c: - * gst/autoconvert/gstautoconvert.h: - autoconvert: Import fsselector from gst-plugins-farsight as autoconvert - fsselector is too close to selector, so import is as autoconvert. Not importing - the history because the directory is also called gst/selector and it fails. +2022-08-16 16:06:20 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-02 10:57:35 +0100 Edward Hervey <bilboed@bilboed.com> + * gst-libs/gst/va/gstvavideoformat.c: + * gst-libs/gst/va/gstvavideoformat.h: + * sys/va/gstvacaps.c: + va: Validate JPEG subsampling configurations. + There are Mesa Gallium drivers that report subsampling but without + any pixel format. So, strip out these subsamplings. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2899> - * gst/qtmux/gstqtmux.c: - qtmux: Be a bit more verbose in our debug message when failing to renegotiate +2022-08-16 14:45:46 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-03-02 17:00:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/va/gstvadecoder.c: + * sys/va/gstvaencoder.c: + va: gst_va_create_raw_caps_from_config() may return NULL. + This patch verifies if the function returns NULL in the caller. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2899> - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - mxfdemux: Use arrays instead of lists for the metadata registries +2022-08-17 11:42:09 -0400 Eric Knapp <emkman99@gmail.com> -2009-03-02 16:29:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/decklink/gstdecklink.cpp: + * sys/decklink/gstdecklink.h: + * sys/decklink/gstdecklinkvideosrc.cpp: + decklink: Validate video input format + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2892> - * gst/xdgmime/gstxdgmime.c: - xdgmime: Reduce probability to POSSIBLE +2022-08-15 11:23:56 -0400 Eric Knapp <emkman99@gmail.com> -2009-03-02 16:27:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/decklink/gstdecklink.cpp: + decklink: Auto-detect 10-bit YUV + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2892> - * gst/xdgmime/gstxdgmime.c: - xdgmime: Add locking to the xdg_mime_* calls as it's not thread-safe +2022-08-14 22:31:29 -0400 Daniel Morin <daniel.morin@collabora.com> -2009-03-01 20:18:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/play/gstplay-media-info.h: + * gst-libs/gst/play/gstplay-signal-adapter.h: + * gst-libs/gst/play/gstplay-video-overlay-video-renderer.h: + * gst-libs/gst/play/gstplay-video-renderer.h: + * gst-libs/gst/play/gstplay-visualization.h: + gst-play: missing cleanup for g_autoptr + Without this change cleanup function for g_autoptr is not defined for + GstPlayMediaInfo, GstPlaySignalAdapter, GstPlayVideoRenderer, + GstPlayVideoOverlayVideoRenderer and GstPlayVisualization. Cleanup + function was defined in gstplay.h, but missing in other header files. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2888> - * gst/xdgmime/xdgmime/xdgmimealias.c: - * gst/xdgmime/xdgmime/xdgmimecache.c: - * gst/xdgmime/xdgmime/xdgmimeglob.c: - * gst/xdgmime/xdgmime/xdgmimeicon.c: - * gst/xdgmime/xdgmime/xdgmimeparent.c: - xdgmime: Use g_pattern_match_simple() instead of fnmatch() for Win32 compatibility +2022-08-16 21:01:47 +0900 Seungha Yang <seungha@centricular.com> -2009-03-01 20:13:31 +0100 LRN <lrn1986@gmail.com> + * gst-libs/gst/d3d11/meson.build: + meson: d3d11: Fix missing header install + Install gstd3d11compile.h header file + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2896> - * gst/xdgmime/xdgmime/xdgmimemagic.c: - xdgmime: Fix unused variable compiler warning +2022-08-15 01:50:15 +0900 Seungha Yang <seungha@centricular.com> -2009-03-01 20:12:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/d3d11/gstd3d11av1dec.cpp: + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/gstd3d11decoder.h: + * sys/d3d11/gstd3d11h264dec.cpp: + * sys/d3d11/gstd3d11h265dec.cpp: + * sys/d3d11/gstd3d11mpeg2dec.cpp: + * sys/d3d11/gstd3d11vp8dec.cpp: + * sys/d3d11/gstd3d11vp9dec.cpp: + d3d11decoder: Do timer based DecoderBeginFrame retry + ... instead of retry count based one, because the precision of Sleep() + varies depending on system and application configuration. + Also, don't retry DecoderBeginFrame if decoder is doing flush. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2886> + +2022-08-14 21:18:24 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstcudamemorycopy.c: + cudaupload,cudadownload: Don't simplify caps in transform_caps + The simplified caps might not be a subset of filter caps + and basetransform will complain about it. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2883> - * gst/xdgmime/xdgmime/xdgmimecache.c: - xdgmime: Don't warn if we have no MMAP support +2022-08-15 00:22:14 +0900 Seungha Yang <seungha@centricular.com> -2009-03-01 20:11:07 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/d3d11/gstd3d11decoder.cpp: + d3d11decoder: Do not use miniobject qdata + The miniobject qdata uses global mutex. + Use ID3D11DeviceChild::{Set,Get}PrivateData methods instead. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2885> + +2022-08-13 05:24:03 +0900 Seungha Yang <seungha@centricular.com> - * gst/xdgmime/xdgmime/xdgmimecache.c: - xdgmime: Use g_ntohls instead of the non-GLib functions for Win32 compatibility + * docs/plugins/gst_plugins_cache.json: + docs: Remove dxgiscreencapsrc from documentation + The implementation was dropped in + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1750 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2878> -2009-03-01 20:09:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-08-13 12:24:37 +0300 Sebastian Dröge <sebastian@centricular.com> - * gst/xdgmime/xdgmime/xdgmimemagic.c: - xdgmime: Use G_BYTE_ORDER instead of relying on LITTLE_ENDIAN to be defined + * gst-libs/gst/player/gstplayer-media-info.c: + player: Don't leak wrapped video info + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1373 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2880> -2009-03-01 20:02:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-08-13 11:50:20 +0300 Sebastian Dröge <sebastian@centricular.com> - * ext/ladspa/Makefile.am: - ladspa: Don't compile unused code from load.c + * gst-libs/gst/play/gstplay.c: + play: Make ownership of video-sink clearer in combination with floating references + And correctly handle the case of VideoRenderer::create_video_sink() not + actually returning a floating reference, which might be tricky for some + bindings. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2880> -2009-02-28 23:47:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> +2022-08-13 11:49:08 +0300 Sebastian Dröge <sebastian@centricular.com> - * gst/real/gstreal.c: - realdec: use gst_plugin_add_dependency() + * gst-libs/gst/play/gstplay.c: + play: Fix object construction + Ideally new() functions should simply call g_object_new() and not much + else, so let's do that here and handle all the construction properly in + a GObject way. + Now a play object created via g_object_new() is actually usable. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2880> -2009-02-28 15:23:07 -0800 Michael Smith <msmith@syncword.(none)> +2022-08-13 11:39:59 +0300 Sebastian Dröge <sebastian@centricular.com> - * sys/acmenc/acmenc.c: - acmenc: fix whitespace - Convert to unix newlines, and reindent in some broken places. + * gst-libs/gst/player/gstplayer.c: + player: Fix object construction + Ideally new() functions should simply call g_object_new() and not much + else, so let's do that here and handle all the construction properly in + a GObject way. + Now a player object created via g_object_new() is actually usable. + In addition, also fix the video-renderer property so that reading it + returns an object of the correct type. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2880> -2009-02-28 20:42:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-08-13 11:30:35 +0300 Sebastian Dröge <sebastian@centricular.com> - * gst/mxf/mxfmetadata.c: - mxf: Fix memory leak - gst_structure_id_set() will copy GstStructures instead of taking - the ownership. + * gst-libs/gst/player/gstplayer.c: + player: Release signal adapter on finalize + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2880> -2009-02-28 20:39:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-08-08 23:37:11 +0900 Seungha Yang <seungha@centricular.com> * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfmpeg.c: - mxf: Store the metadata type ID inside the class structure - -2009-02-28 19:41:10 +0100 vanista <vanista@gmail.com> - - * gst/mpegdemux/gstsectionfilter.c: - mpegtsdemux: Fix memory leaks when PUSI is missed due to packet loss - Fixes bug #573288. - -2009-02-28 11:43:56 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/nsf/fmopl.c: - nsf: Don't write further than the limits of the table (size is 75, as defined in the header) - gcc 4.3.3 found this one, I'm impressed. - -2009-02-28 10:29:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/examples/mxf/mxfdemux-structure.c: - mxf: Don't use GLib 2.16 API unconditionally in the example - -2009-02-27 20:43:25 +0100 Andrzej Polatyński <apolatynski@gmail.com> - - * gst/videosignal/gstvideoanalyse.c: - videoanalyse: Fix brightness calculation to not only use the first rowstride - Fixes bug #573391. - -2009-02-27 11:36:58 -0800 Michael Smith <msmith@songbirdnest.com> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - mpeg4videoparse: Use correct values for checking VO startcode. - Fix compiler warning due to condition always being true - since we're - only looking at the final byte of the startcode (not the leading - 0x000001), only check for < 0x1f, not < 0x11f - -2009-02-27 20:21:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/xdgmime/gstxdgmime.c: - xdgmime: Use empty caps for registering the typefinders with old core versions - core before 0.10.22.1 produced assertions when storing typefind factories - with NULL caps in the registry. - -2009-02-26 15:40:26 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mpeg4videoparse/mpeg4videoparse.c: - * gst/mpeg4videoparse/mpeg4videoparse.h: - mpeg4videoparse: handle more formats - We only need a Video Object Start code before we can start pushing out data. - Search for this code also instead of only looking for VOS and VOP. - Fixes #572551. - -2009-02-27 12:03:23 +0000 Jan Schmidt <thaytan@noraisin.net> - - Merge branch 'work' - -2009-02-27 11:56:45 +0000 Jan Schmidt <thaytan@noraisin.net> - - * docs/plugins/.gitignore: - docs: Ignore some more generated files - -2009-02-27 11:55:34 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ext/celt/gstceltdec.c: - * ext/celt/gstceltdec.h: - celtdec: Move define into the C file so it doesn't show up in the docs - -2009-02-27 11:54:42 +0000 Jan Schmidt <thaytan@noraisin.net> - - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/inspect/plugin-dirac.xml: - docs: Enroll dirac plugin into the docs - -2009-02-27 11:39:56 +0000 Jan Schmidt <thaytan@noraisin.net> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/dts/gstdtsdec.c: - dtsdec: Add some basic docs to the plugin - -2009-02-27 10:16:57 +0000 Jan Schmidt <thaytan@noraisin.net> - - * ext/apexsink/gstapexraop.c: - apexsink: Use a union to avoid type-punning strict aliasing compiler warning. - -2009-02-27 12:35:14 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/Makefile.am: - * gst/camerabin/gstcamerabin-marshal.list: - * gst/camerabin/gstcamerabin.c: - * tests/check/elements/camerabin.c: - camerabin: rework signaling and tests - Revert the GString change. There are no marshallers for it. A better change is - now described in http://bugzilla.gnome.org/show_bug.cgi?id=573370. - Test should work again. - -2009-02-27 11:24:37 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/aacparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.c: - * gst/flacparse/gstbaseparse.c: - baseparse: revert last change and properly fix - Baseparse internaly breaks the semantics of a _chain function by calling it with - buffer==NULL. The reson I belived it was okay to remove it was that there is - also an unchecked access to buffer later in _chain. Actually that code is wrong, - as it most probably wants to set discont on the outgoing buffer. - -2009-02-27 11:06:04 +0100 Edward Hervey <bilboed@bilboed.com> - - * sys/qtwrapper/qtutils.c: - qtwrapper: Only use _dump_mem() if requested. - -2009-02-26 12:48:16 -0800 David Schleef <ds@schleef.org> - - * gst/rawparse/gstvideoparse.c: - Add v210 format - -2009-02-26 12:47:16 -0800 David Schleef <ds@schleef.org> - - * gst/rawparse/gstvideoparse.c: - Fix incorrect "pixel_aspect_ratio" in caps - Should be "pixel-aspect-ratio". - -2009-02-26 18:46:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * tests/examples/mxf/.gitignore: - * tests/examples/mxf/Makefile.am: - * tests/examples/mxf/mxfdemux-structure.c: - mxf: Add example application to output the structural metadata tree into a GtkTreeView - -2009-02-26 13:10:29 +0100 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/rtpmanager/gstrtpsession.c: - gstrtpbin: Don't forward revc events to sender - Don't send events from the receiver to the sender side. - Fixes #572900. - -2009-02-26 11:02:06 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/aacparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.c: - * gst/flacparse/gstbaseparse.c: - baseparse: remove checks for buffer==NULL - Accordifn to docs for GstPadChainFunction buffer cannot be NULL. If we would - leave the check, we would also need more such check below. - -2009-02-25 15:06:07 +0000 Jan Schmidt <thaytan@noraisin.net> - - * common: - * configure.ac: - build: Update shave init statement for changes in common. Bump common. - -2009-02-25 15:24:13 +0200 Stefan Kost <ensonic@users.sf.net> - - * tests/check/elements/neonhttpsrc.c: - tests: add a timeout of 5 slightly above the default - -2009-02-25 15:17:14 +0200 Stefan Kost <ensonic@users.sf.net> - - * tests/check/elements/camerabin.c: - camerabin: increase timeout and lower video recording length - The video was recorded for too long for the test timeouts. Also the verification - suite did not had custom timouts at all. Also split the verification for images - and video to get better reporting. - -2009-02-25 11:32:22 +0000 Jan Schmidt <thaytan@noraisin.net> - - * common: - Automatic update of common submodule - From 9cf8c9b to a6ce5c6 - -2009-02-25 12:34:33 +0200 Stefan Kost <ensonic@users.sf.net> - - * tests/check/Makefile.am: - tests: blacklist dccp plugins. - Unless one runs a very recent kernel, they can easily lockup the whole system. - -2009-02-25 11:45:05 +0200 Stefan Kost <ensonic@users.sf.net> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/camerabin/gstcamerabin.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/rtpmanager/rtpjitterbuffer.c: - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - * gst/selector/gstinputselector.c: - docs: various doc fixes - No short-desc as we have them in the element details. - Also keep things (Makefile.am and sections.txt) sorted. - Reword ambigous returns. No text after since please. - -2009-02-25 11:34:45 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/mpegdemux/gstmpegdemux.c: - mpegdemux: don't ignore GstFlowReturn values - don't ignore the return value of pull_range because we only get a valid non-NULL - buffer when the return value is GST_FLOW_OK. Avoids a crash when the pipeline is - shutting down. - -2009-02-25 11:41:36 +0200 Stefan Kost <ensonic@users.sf.net> - - * gst/camerabin/gstcamerabin-marshal.list: - * gst/camerabin/gstcamerabin.c: - camerabin: update signal marshaller and docs - Use GString instead of GPointer for the marshaller as this is what the callback uses. - Slightly reformat docs. - -2009-02-25 11:38:58 +0200 Stefan Kost <ensonic@users.sf.net> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/figures/Makefile.am: - * docs/plugins/figures/camerabin.dot: - * docs/plugins/figures/camerabin.png: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-amrwb.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-camerabin.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-deinterlace2.xml: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-flv.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-gstsiren.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-liveadder.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-timidity.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-twolame.xml: - * docs/plugins/inspect/plugin-valve.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xdgmime.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - docs: update docs to add camerabin and its figure - -2009-02-25 11:00:55 +0200 Stefan Kost <ensonic@users.sf.net> - - * tests/check/elements/camerabin.c: - camerabin: get rid of // comment and explain - -2009-02-25 10:46:10 +0200 Stefan Kost <ensonic@users.sf.net> - - * tests/check/elements/camerabin.c: - camerabin: update check unit test - Use playbin2 for validation. Use tmp_dir for capturing. Wait with g_cond for - burst capture finish. Cleanup some g_object_set. Add some logging to ease - tracing. - -2009-02-25 10:45:19 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: unblock correct pad in reset, support fakesink as view finder - -2009-02-24 16:36:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * tests/examples/app/.gitignore: - * tests/examples/app/Makefile.am: - * tests/examples/app/appsink-src.c: - * tests/examples/app/appsrc-ra.c: - * tests/examples/app/appsrc-seekable.c: - * tests/examples/app/appsrc-stream.c: - * tests/examples/app/appsrc-stream2.c: - * tests/examples/app/appsrc_ex.c: - Remove tests/examples/app as it was moved to -base a long time ago - -2009-02-24 16:33:51 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * Makefile.am: - * configure.ac: - * tests/Makefile.am: - * tests/examples/Makefile.am: - * tests/examples/app/.gitignore: - * tests/examples/app/Makefile.am: - * tests/examples/app/appsink-src.c: - * tests/examples/app/appsrc-ra.c: - * tests/examples/app/appsrc-seekable.c: - * tests/examples/app/appsrc-stream.c: - * tests/examples/app/appsrc-stream2.c: - * tests/examples/app/appsrc_ex.c: - * tests/examples/capsfilter/Makefile.am: - * tests/examples/capsfilter/capsfilter1.c: - * tests/examples/directfb/.gitignore: - * tests/examples/directfb/Makefile.am: - * tests/examples/directfb/decker.ttf: - * tests/examples/directfb/dfblogo.png: - * tests/examples/directfb/gstdfb.c: - * tests/examples/gob/Makefile.am: - * tests/examples/gob/gst-identity2.gob: - * tests/examples/gstplay/.gitignore: - * tests/examples/gstplay/Makefile.am: - * tests/examples/gstplay/player.c: - * tests/examples/indexing/.gitignore: - * tests/examples/indexing/Makefile.am: - * tests/examples/indexing/indexmpeg.c: - * tests/examples/level/Makefile.am: - * tests/examples/level/README: - * tests/examples/level/demo.c: - * tests/examples/level/plot.c: - * tests/examples/scaletempo/.gitignore: - * tests/examples/scaletempo/Makefile.am: - * tests/examples/scaletempo/demo-gui.c: - * tests/examples/scaletempo/demo-gui.h: - * tests/examples/scaletempo/demo-main.c: - * tests/examples/scaletempo/demo-player.c: - * tests/examples/scaletempo/demo-player.h: - * tests/examples/stats/Makefile.am: - * tests/examples/stats/mp2ogg.c: - * tests/examples/switch/.gitignore: - * tests/examples/switch/Makefile.am: - * tests/examples/switch/switcher.c: - Move examples directory to tests/examples as in every other GStreamer module - -2009-02-24 16:21:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * ext/dts/gstdtsdec.c: - * ext/dts/gstdtsdec.h: - dtsdec: Use new DCA functions/constants as not all distros package the compat dts.h - For backward compatibility we define the DCA functions/constants to the - old DTS functions/constants if we're building against libdts. - -2009-02-24 15:26:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * gst/xdgmime/Makefile.am: - * gst/xdgmime/gstxdgmime.c: - * gst/xdgmime/xdgmime/xdgmime.c: - * gst/xdgmime/xdgmime/xdgmime.h: - * gst/xdgmime/xdgmime/xdgmimealias.c: - * gst/xdgmime/xdgmime/xdgmimealias.h: - * gst/xdgmime/xdgmime/xdgmimecache.c: - * gst/xdgmime/xdgmime/xdgmimecache.h: - * gst/xdgmime/xdgmime/xdgmimeglob.c: - * gst/xdgmime/xdgmime/xdgmimeglob.h: - * gst/xdgmime/xdgmime/xdgmimeicon.c: - * gst/xdgmime/xdgmime/xdgmimeicon.h: - * gst/xdgmime/xdgmime/xdgmimeint.c: - * gst/xdgmime/xdgmime/xdgmimeint.h: - * gst/xdgmime/xdgmime/xdgmimemagic.c: - * gst/xdgmime/xdgmime/xdgmimemagic.h: - * gst/xdgmime/xdgmime/xdgmimeparent.c: - * gst/xdgmime/xdgmime/xdgmimeparent.h: - xdgmime: Add new typefinder based on xdgmime - This typefinder is mostly useful to filter out any false positives - by the other typefinders like the usual Word document misdetected as - MP3 file. - -2009-02-24 13:37:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - dts: Prefer libdca over libdts as it's the successor - -2009-02-23 16:02:08 +0100 Edward Hervey <bilboed@bilboed.com> - - * sys/qtwrapper/audiodecoders.c: - qtwrapper: Fix build on macosx - -2009-02-23 15:25:03 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/liveadder/liveadder.c: - liveadder: Fix build on macosx - -2009-02-20 12:08:04 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - camerabin: Add aspect ratio capsfilter for view finder - If dealing with larger frame sizes than view finder sink element - accepts then maintain aspect ratio when scaling frames to fit. - -2009-02-20 12:07:33 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst/camerabin/gstcamerabin.c: - camerabin: Scale incoming frames if their size does not match requested size - If capture preparation in videosrc results in frame size different - from requested size, then we need to scale them. - -2009-02-20 12:03:03 +0200 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com> - - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - photo iface: Add caps object to preparation API for requested and actual capture format - Allow requesting of certain format with prepare_for_capture() and return - the actual format in GstPhotoCapturePrepared callback. - -2009-02-23 11:49:07 +0000 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - build: Add soundtouch's -lBPM to _LIBS, not _CFLAGS - -2009-02-22 22:00:58 +0100 Edward Hervey <bilboed@bilboed.com> - - * gst/dccp/gstdccpserversink.c: - dccp: Fix "non-void without return value" compilation issue. - -2009-02-22 19:17:30 +0000 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - * ext/soundtouch/Makefile.am: - * ext/soundtouch/gstbpmdetect.cc: - Detect libsoundtouch 1.4 and higher. - In libsoundtouch 1.4, libBPM appears to have been subsumed into - libSoundTouch, and into the soundtouch namespace. - -2009-02-22 18:12:19 +0000 Jan Schmidt <thaytan@noraisin.net> - - * configure.ac: - * docs/plugins/Makefile.am: - Use shave for the build output - -2009-02-22 18:41:08 +0100 Andoni Morales <ylatuya@gmail.com> - - * configure.ac: - * gst/camerabin/camerabingeneral.h: - * gst/camerabin/gstcamerabin.c: - camerabin: Fix compilation on Windows with Visual Studio - Windows doesn't have strcasecmp so we should use - g_ascii_strcasecmp here instead. - Also Windows doesn't have sys/time.h so we first - need to check if it actually exists and if not - we should not include it. - Fixes bug #572315. - -2009-02-22 15:58:06 +0000 Jan Schmidt <thaytan@noraisin.net> - - * common: - Automatic update of common submodule - From 5d7c9cc to 9cf8c9b - -2009-02-22 14:58:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * ext/directfb/dfbvideosink.c: - dfbvideosink: Don't use void * pointer arithmetic - -2009-02-22 13:17:54 +0100 Edward Hervey <bilboed@bilboed.com> + mxfdemux: Always calculate BlockAlign of raw audio + Workaround for nBlockAlign and nBitsPerSample mismatch. Always + use the formula described in the specification for BlockAlign value + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2864> - * ext/xvid/gstxvid.c: - xvid: Fix compilation warning +2022-08-12 22:05:36 +0900 Seungha Yang <seungha@centricular.com> -2009-02-21 11:13:50 -0800 David Schleef <ds@schleef.org> + * gst-libs/gst/d3d11/meson.build: + meson: d3d11: Fix build with GIR enabled + ... and remove unused list + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2870> - * common: - Automatic update of common submodule - From 80c627d to 5d7c9cc +2022-08-12 18:24:41 +0300 Matthias Clasen <mclasen@redhat.com> -2009-02-10 17:02:24 +0000 Olivier Crête <olivier.crete@collabora.co.uk> + * gst-libs/gst/player/gstplayer.c: + gstplayer: Plug a memory leak + This was showing up as a memory leak in GTK's + gstreamer media backend: + 40 bytes in 1 blocks are definitely lost in loss record 18,487 of 40,868 + at 0x484586F: malloc (vg_replace_malloc.c:381) + by 0x50D5278: g_malloc (gmem.c:125) + by 0x50EDBA5: g_slice_alloc (gslice.c:1072) + by 0x50EFBCC: g_slice_alloc0 (gslice.c:1098) + by 0x51F2F45: g_type_create_instance (gtype.c:1911) + by 0x51DAE37: g_object_new_internal (gobject.c:2011) + by 0x51DC080: g_object_new_with_properties (gobject.c:2181) + by 0x51DCB20: g_object_new (gobject.c:1821) + by 0x9855F86: UnknownInlinedFun (gstplayer-wrapped-video-renderer.c:109) + by 0x9855F86: gst_player_new (gstplayer.c:579) + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1374 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2875> - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-dtmf.xml: - * docs/plugins/inspect/plugin-rtpmux.xml: - * gst/rtpmux/Makefile.am: - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmuxer.c: - Moved rtpmux from gst-p-farsight to -bad +2022-08-12 11:32:45 +0200 Corentin Damman <c.damman@intopix.com> -2009-02-20 17:45:50 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * sys/d3d11/gstd3d11window.cpp: + d3d11window: fix DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING swap chain flag for full screen + Fixes #1372 (regression introduced in 5eeec165) + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2866> - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpdtmfmux.h: - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - * gst/rtpmux/gstrtpmuxer.c: - Re-indent to Gst style +2022-08-10 11:12:37 +0100 Philippe Normand <philn@igalia.com> -2009-02-10 19:11:15 +0000 Olivier Crête <olivier.crete@collabora.co.uk> + * ext/wpe/gstwpesrcbin.cpp: + wpesrc: Switch URI handler to web+... protocols + The web://http:// URIs were not compliant with RFC 3986. Using web+http:// + allows us to use the GstUri parser to pass down a valid URI to `wpevideosrc`. + Corresponding change for the CEF source element: + https://github.com/centricular/gstcefsrc/commit/8d499495dd79cc0bf9a38ae82b03e374d78f68ae + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2856> + +2022-08-09 12:24:53 +0200 Corentin Damman <c.damman@intopix.com> + + * sys/nvcodec/gstnvh264encoder.cpp: + * sys/nvcodec/gstnvh265encoder.cpp: + nvcodec: fix caps leaks in nvh264/h265encoder + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2850> + +2022-08-09 12:29:34 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvah264enc.c: + vah264enc: Set codec frame sync point if IDR + This flag is used by GstVideoEncoder base class for certain configurations. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2852> + +2022-08-09 12:28:43 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvaencoder.c: + * sys/va/gstvaencoder.h: + * sys/va/gstvah264enc.c: + vah264enc: Packed headers can be zero. + A driver can report back no packed header support (VA_ENC_PACKED_HEADER_NONE). + This patch removes that false verification. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2851> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Document rtp muxer a bit +2022-08-07 23:24:04 +0900 Seungha Yang <seungha@centricular.com> -2009-02-20 13:30:49 -0500 Laurent Glayal <spglegle@yahoo.fr> + * gst-libs/gst/d3d11/gstd3d11converter.cpp: + * gst-libs/gst/d3d11/gstd3d11device.cpp: + * sys/d3d11/gstd3d11convert.cpp: + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/gstd3d11window_win32.cpp: + d3d11: Use WIN32 API directly for locking with RAII pattern + Such abstraction is unnecessary for this library/plugin. + Use WIN32 API directly instead of GLib wrappers. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2848> - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpdtmfmux.h: - MOVED FROM GST-P-FARSIGHT Add signals before stream lock and after unlocking +2022-08-07 22:41:07 +0900 Seungha Yang <seungha@centricular.com> -2009-02-18 20:18:46 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * gst-libs/gst/d3d11/gstd3d11_private.h: + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + d3d11memory: Remove unnecessary locking + * memory map/unmap is already protected by d3d11 device lock. + Don't need to take another memory lock. + * Use WIN32 critical section and slim reader/writer lock APIs + directly instead of GLib wrappers. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2848> + +2022-08-05 17:20:05 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvah264enc.c: + vah264enc: Fix caps for mesa gallium. + Radeon mesa gallium driver has a bug which adds P010_10LE sink caps + format. This patch removes formats which arent 420 chroma. + gst_caps_set_format_array() wasn't used because the fix traverse + several structures with potential different formats. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2844> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Let ssrc through getcaps +2022-08-05 15:54:39 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2009-02-18 19:58:58 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * sys/va/gstvah264dec.c: + * sys/va/gstvaprofile.c: + vah264dec: Complete profiles in decoder. + Instead of specifying all the H.264 "supported" profiles in the global + hash table (used either by decoders and encoders), just complete them + in the decoder only, since the encoder doesn't support them. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2844> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Rename have_base to have_ts_base +2022-08-05 22:34:06 +0900 Seungha Yang <seungha@centricular.com> -2009-02-18 18:14:52 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * sys/d3d11/gstd3d11pluginutils.cpp: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window.h: + * sys/d3d11/gstd3d11window_dummy.cpp: + * sys/qsv/gstqsvallocator_d3d11.cpp: + * tests/examples/d3d11/d3d11converter.cpp: + * tests/examples/d3d11/d3d11videosink-appsrc.cpp: + d3d11: Don't find global default allocator + We were using global default allocator already. Pass null + allocator object to *_alloc() methods then the method will + use default allocator. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2843> - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - MOVED FROM GST-P-FARSIGHT Protect the seqnum with object lock in rtpmux +2022-08-05 22:23:52 +0900 Seungha Yang <seungha@centricular.com> -2009-02-18 18:07:44 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + d3d11memory: Allow null GstD3D11Allocator to alloc methods + Similar to gst_allocator_alloc(), use default GstD3D11Allocator + when caller passes null allocator object + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2843> - * gst/rtpmux/gstrtpmux.h: - MOVED FROM GST-P-FARSIGHT Remove unused sink_ts_base +2022-08-06 00:03:43 +0900 Seungha Yang <seungha@centricular.com> -2009-02-18 15:20:58 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * gst-libs/gst/d3d11/gstd3d11_private.h: + * gst-libs/gst/d3d11/gstd3d11compile.cpp: + * gst-libs/gst/d3d11/gstd3d11converter.cpp: + * gst-libs/gst/d3d11/gstd3d11device.cpp: + * gst-libs/gst/d3d11/gstd3d11format.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * gst-libs/gst/d3d11/gstd3d11utils.cpp: + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/gstd3d11deinterlace.cpp: + * sys/d3d11/gstd3d11pluginutils.cpp: + * sys/d3d11/gstd3d11testsrc.cpp: + * sys/d3d11/gstd3d11window.cpp: + d3d11: Use std::call_once() + g_once_init_enter() always takes global mutex for non-GCC build. + Use C++ once call implementation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2843> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Have getcaps to force the same clockrate on all pads +2022-08-06 04:57:49 +0900 Seungha Yang <seungha@centricular.com> -2009-02-18 17:05:13 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * gst-libs/gst/d3d11/gstd3d11device.cpp: + d3d11device: Use WIN32 critical section API directly + GLib's GRecMutex will allocate another heap memory for CRITICAL_SECTION + struct and g_rec_mutex_lock/g_rec_mutex_unlock use WIN32 APIs actually. + We don't need such intermediate function calls and redundant heap allocation. + Just call WIN32 APIs directly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2845> + +2022-08-03 17:52:25 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvabaseenc.c: + * sys/va/gstvabaseenc.h: + * sys/va/gstvah264enc.c: + vah264enc: Lock properties read/write. + This is a first step for changing properties at runtime. + And add missing bitrate upate and notification. + Fixes: #1258 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2836> + +2022-08-04 13:02:00 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvah264enc.c: + vah264enc: Use guint32 for rc_ctrl as it's for rc_ctrl_mode. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2836> + +2022-08-04 12:57:11 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvah264enc.c: + vah264enc: Split aud property and its usage. + Just as other property variables, it's split for ease it usage, + particularly after adding access locks. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2836> + +2022-08-04 12:00:58 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvabaseenc.h: + va: baseenc: Untabbify and format. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2836> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Validate RTP data in RTP Mux +2022-08-03 03:29:20 +0900 Seungha Yang <seungha@centricular.com> -2009-02-18 14:16:00 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * sys/d3d11/gstd3d11compositor.cpp: + d3d11compositor: Add gamma-mode and primaries-mode properties + Allows controlling gamma remap and/or chromatic adaptation behavior. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2831> - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - MOVED FROM GST-P-FARSIGHT Remove unused clock-rate property +2022-08-03 01:47:46 +0900 Seungha Yang <seungha@centricular.com> -2009-02-18 13:56:36 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * sys/d3d11/gstd3d11videosink.cpp: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window.h: + * sys/d3d11/gstd3d11window_dummy.cpp: + d3d11videosink: Add gamma-mode and primaries-mode properties + Allows controlling gamma remap and/or chromatic adaptation behavior. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2831> - * gst/rtpmux/gstrtpdtmfmux.h: - MOVED FROM GST-P-FARSIGHT Clarify locking in rtpdtmfmux +2022-08-03 01:19:41 +0900 Seungha Yang <seungha@centricular.com> -2009-02-18 13:32:56 -0500 Laurent Glayal <spglegle@yahoo.fr> + * sys/d3d11/gstd3d11convert.cpp: + d3d11convert: Add gamma-mode and primaries-mode properties + Allows controlling gamma remap and/or chromatic adaptation behavior. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2831> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Missing format parameter +2022-08-03 00:26:33 +0900 Seungha Yang <seungha@centricular.com> -2008-12-11 17:54:18 -0500 Olivier Crête <olivier.crete@collabora.co.uk> + * gst-libs/gst/d3d11/gstd3d11converter.cpp: + * gst-libs/gst/d3d11/gstd3d11converter.h: + d3d11converter: Add options for gamma and primaries conversion + Gamma remap and/or primaries conversion requires additional + processing which might be something user want to avoid, performance + reason for example + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2831> - * gst/rtpmux/.git-darcs-dir: - MOVED FROM GST-P-FARSIGHT Remove .git-darcs-dir files +2022-08-01 13:04:47 +0200 Robert Mader <robert.mader@collabora.com> -2008-12-01 17:55:22 -0500 Håvard Graff <havard.graff@tandberg.com> + * ext/wayland/gstwaylandsink.c: + waylandsink: Logging code style updates + For better readability of debug messages and to keep similar code + in sync with `GstGtkWaylandsink`. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2694> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Update seqnum base in rtp muxer - With help from Wim +2022-06-30 11:48:45 +0200 Robert Mader <robert.mader@collabora.com> -2008-12-01 17:54:58 -0500 Håvard Graff <havard.graff@tandberg.com> + * ext/wayland/gstwaylandsink.c: + waylandsink: Rename occurrences of GstWaylandSink to 'self' + Rename all occurrences to `self`, making it consintent with `GstWl*` + and `GstGtkWaylandsink`. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2694> - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Fix some more leaks +2022-07-19 15:10:00 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2008-12-01 17:48:29 -0500 Håvard Graff <havard.graff@tandberg.com> + * sys/va/gstvavpp.c: + vapostproc: Check for colorimetry changes. + It uses what's merged in + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2765 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2777> - * gst/rtpmux/gstrtpdtmfmux.c: - MOVED FROM GST-P-FARSIGHT Fix leak +2022-04-11 15:35:45 -0500 Olivier Crête <olivier.crete@collabora.com> -2008-09-29 15:03:05 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + * tests/examples/gtk/gtkwaylandsink.c: + gtkwaylandsink test: Add navigationtest to example + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1515> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Don't unref caps we don't know (thanks Wim) +2021-12-08 10:30:21 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com> -2008-08-12 12:48:02 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * ext/gtk/gstgtkutils.c: + * ext/gtk/gstgtkutils.h: + * ext/gtk/gstgtkwaylandsink.c: + * ext/gtk/gstgtkwaylandsink.h: + * ext/gtk/gstplugin.c: + * ext/gtk/gtkgstbasewidget.c: + * ext/gtk/gtkgstbasewidget.h: + * ext/gtk/gtkgstwaylandwidget.c: + * ext/gtk/gtkgstwaylandwidget.h: + * ext/gtk/meson.build: + * ext/meson.build: + * meson_options.txt: + * tests/examples/gtk/gtkwaylandsink.c: + * tests/examples/gtk/meson.build: + * tests/examples/gtk/window.ui: + * tests/examples/meson.build: + Add new gtkwaylandsink element + This is based on gtksink, but similar to waylandsink uses Wayland APIs + directly instead of rendering with Gtk/Cairo primitives. + Note that the long term plan is to move this into the existing extension + in `-good`, which requires the Wayland library to move the as well. + For this reason several files like `gstgtkutils.*` and `gtkgstbasewidget.*` + are straight copies and should be kept in sync. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1515> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Put per-buffer debug at level LOG +2022-08-02 05:06:24 +0900 Seungha Yang <seungha@centricular.com> -2008-08-12 12:47:14 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window_win32.cpp: + d3d11videosink: Translate mouse position + Converts mouse cursor position represented in display coordinates to + stream coordinates. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2824> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Make debug print accurate +2022-08-02 04:16:31 +0900 Seungha Yang <seungha@centricular.com> -2008-08-12 12:46:23 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + * sys/d3d11/gstd3d11videosink.cpp: + d3d11videosink: Early terminate mouse/keyboard event handling + ... and add missing null check (plus coding style fix) + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2824> + +2022-07-30 17:28:41 +0100 Philippe Normand <philn@igalia.com> + + * gst-libs/gst/webrtc/nice/nice.c: + * gst-libs/gst/webrtc/nice/nicestream.c: + * gst-libs/gst/webrtc/nice/nicetransport.c: + webrtc: nice: WeakRef access fixes + The GstWebRTCNiceStream::ice property getter already hands-off a full reference, + so there is no need to call g_weak_ref_get() in call sites. + Fixes #1350 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2819> + +2022-07-30 17:19:42 +0100 Philippe Normand <philn@igalia.com> + + * gst-libs/gst/webrtc/ice.h: + webrtc: ice: Fix GstWebRTCICE parent class + It is a GstObject, not a GObject. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2819> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Set our caps on the buffers +2022-07-30 17:43:38 +0100 Philippe Normand <philn@igalia.com> -2008-08-12 12:46:07 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + * ext/dtls/gstdtlssrtpdec.c: + * ext/dtls/gstdtlssrtpenc.c: + dtls: Properly name encoder/decoder logging categories + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2820> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Take the clock-base stored from the last setcaps +2022-07-30 17:42:50 +0100 Philippe Normand <philn@igalia.com> -2008-08-12 12:41:59 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + * ext/dtls/gstdtlsagent.c: + * ext/dtls/gstdtlsagent.h: + * ext/dtls/gstdtlsconnection.c: + * ext/dtls/gstdtlsconnection.h: + dtls: Make agent and connection GstObjects + Facilitates debug logs interpretation of GST_DEBUG_OBJECT() calls. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2820> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Store the clock-base on setcaps +2022-07-30 02:29:49 +0530 Nirbheek Chauhan <nirbheek@centricular.com> -2008-08-12 12:30:52 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + * ext/sctp/usrsctp/meson.build: + * sys/qsv/libmfx/meson.build: + meson: Don't pass -Werror to vendored code + Do it the correct way with libusrsctp -- override the option so that + it's done in a compiler-agnostic and future-proof way. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2494> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Add padprivate to the request pads +2022-05-25 18:40:30 +0530 Nirbheek Chauhan <nirbheek@centricular.com> -2008-08-12 12:23:32 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + * gst/rtmp2/gstrtmp2locationhandler.c: + * gst/rtmp2/rtmp/rtmpclient.c: + rtsp+rtmp: Forward warning added to tls-validation-flags to our users + With the 2.72 release, glib-networking developers have decided that + TLS certificate validation cannot be implemented correctly by them, so + they've deprecated it. + In a nutshell: a cert can have several validation errors, but there + are no guarantees that the TLS backend will return all those errors, + and things are made even more complicated by the fact that the list of + errors might refer to certs that are added for backwards-compat and + won't actually be used by the TLS library. + Our best option is to ignore the deprecation and pass the warning onto + users so they can make an appropriate security decision regarding + this. + We can't deprecate the tls-validation-flags property because it is + very useful when connecting to RTSP cameras that will never get + updates to fix certificate errors. + Relevant upstream merge requests / issues: + https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2214 + https://gitlab.gnome.org/GNOME/glib-networking/-/issues/179 + https://gitlab.gnome.org/GNOME/glib-networking/-/merge_requests/193 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2494> - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - MOVED FROM GST-P-FARSIGHT Remove whitespace in gstrtpmux +2022-05-25 16:03:22 +0530 Nirbheek Chauhan <nirbheek@centricular.com> -2008-08-11 21:20:06 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + * ext/dtls/gstdtlscertificate.c: + dtls: Disable OpenSSL 3.0 deprecation warnings for now + Fedora 36 ships with OpenSSL 3.0, which deprecates all low-level APIs, + so this code needs to be rewritten. There is no easy fix in the + porting guide, and it recommends disabling the warnings if you can't + use the high-level API. + https://wiki.openssl.org/index.php/OpenSSL_3.0#Upgrading_to_OpenSSL_3.0_from_OpenSSL_1.1.1 + Here's the replacement API: + https://www.openssl.org/docs/man3.0/man7/migration_guide.html#Deprecated-low-level-object-creation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2494> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Make indentation more correct +2022-07-29 02:36:40 +0900 Seungha Yang <seungha@centricular.com> -2008-08-11 21:05:34 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + * sys/wasapi2/gstwasapi2ringbuffer.cpp: + wasapi2: Fix initial mute/volume setting + Fix up volume/mute change flag setting + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2809> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Fix typo +2022-07-26 13:59:33 -0400 Eric Knapp <emkman99@gmail.com> -2008-08-11 21:03:22 -0400 Olivier Crête <olivier.crete@collabora.co.uk> + * sys/va/gstvah264enc.c: + va: h264enc: Make AUD the first NAL unit + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2796> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Set seqnum-base and clock-base in caps from rtpmuxer +2022-07-26 15:49:32 -0400 U. Artie Eoff <ullysses.a.eoff@intel.com> -2007-08-15 13:50:38 +0000 Zeeshan Ali <first.last@nokia.com> + * ext/webrtc/meson.build: + * gst-libs/gst/webrtc/nice/meson.build: + meson: webrtc: ensure definition of libgstwebrtcnice_dep + ... and skip if it's disabled. + Fixes #1344 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2797> - * gst/rtpmux/gstrtpdtmfmux.c: - MOVED FROM GST-P-FARSIGHT more debug - 20070815135038-f3f1e-9c7a5490a525c6e8753cb1b8c03354df99132b5c.gz +2022-04-18 23:25:13 +0530 yatinmaan <yatinmaan1@gmail.com> -2007-08-23 21:22:25 +0000 philippe.kalaf@collabora.co.uk <philippe.kalaf@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * ext/webrtc/fwd.h: + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/gstwebrtcbin.h: + * ext/webrtc/gstwebrtcstats.c: + * ext/webrtc/meson.build: + * ext/webrtc/transportstream.c: + * ext/webrtc/webrtcsctptransport.h: + * gst-libs/gst/webrtc/ice.c: + * gst-libs/gst/webrtc/ice.h: + * gst-libs/gst/webrtc/icestream.c: + * gst-libs/gst/webrtc/icestream.h: + * gst-libs/gst/webrtc/icetransport.h: + * gst-libs/gst/webrtc/meson.build: + * gst-libs/gst/webrtc/nice/meson.build: + * gst-libs/gst/webrtc/nice/nice.c: + * gst-libs/gst/webrtc/nice/nice.h: + * gst-libs/gst/webrtc/nice/nice_fwd.h: + * gst-libs/gst/webrtc/nice/nicestream.c: + * gst-libs/gst/webrtc/nice/nicestream.h: + * gst-libs/gst/webrtc/nice/nicetransport.c: + * gst-libs/gst/webrtc/nice/nicetransport.h: + * gst-libs/gst/webrtc/webrtc-priv.h: + * gst-libs/gst/webrtc/webrtc.h: + * gst-libs/gst/webrtc/webrtc_fwd.h: + webrtc: Split WebRTCICE into base classes and implementation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2398> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Sync jitterbuffer with CVS -bad - 20070823212225-2425b-0fe69bf72539678dda45d615a09f1cbf502cc71a.gz +2022-07-22 22:50:33 +0900 Seungha Yang <seungha@centricular.com> -2007-08-20 18:50:32 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> + * sys/qsv/gstqsvallocator_d3d11.cpp: + * sys/qsv/gstqsvencoder.cpp: + qsvencoder: Add support for D3D11 shared texture + Although input texture belongs to the other d3d11 device, + we can do GPU copy when its physical device is identical. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2790> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT missing comment - 20070820185032-4f0f6-0ab67b6ac40dd4e35a8fe53f3cb6daff65ce43b9.gz +2022-07-23 00:41:49 +0900 Seungha Yang <seungha@centricular.com> -2007-07-12 19:53:36 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * sys/amfcodec/gstamfencoder.cpp: + * sys/d3d11/gstd3d11screencapture.cpp: + * sys/d3d11/gstd3d11window_dummy.cpp: + * sys/mediafoundation/gstmfvideoencoder.cpp: + * sys/mediafoundation/gstmfvideoencoder.h: + * sys/nvcodec/gstnvencoder.cpp: + d3d11: Port to GstD3D11Fence + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2790> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Make buffer writable before writing into it - 20070712195336-3e2dc-91a5fb797cfa4919d4e2f9a728c6d6fbd3b83d93.gz +2022-07-23 00:11:18 +0900 Seungha Yang <seungha@centricular.com> -2007-07-06 20:24:59 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * gst-libs/gst/d3d11/gstd3d11_fwd.h: + * gst-libs/gst/d3d11/gstd3d11device.cpp: + * gst-libs/gst/d3d11/gstd3d11device.h: + d3d11: Implement fence abstraction + Depending on device feature level, d3d11 runtime can support + ID3D11Fence which is equivalent to ID3D12Fence. + Waiting using fence has performance-wise benefit over pulling + ID3D11Query status. If ID3D11Fence is not supported by device, + then ID3D11Query will be used instead. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2790> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Set pads active when adding them to a potentially running element - 20070706202459-3e2dc-a3731f885725594def0a7be997fc7b3a739ee967.gz +2022-06-08 15:44:26 +0200 Benjamin Gaignard <benjamin.gaignard@collabora.com> -2007-06-07 12:01:21 +0000 Olivier Crete <olivier.crete@collabora.co.uk> + * gst-libs/gst/codecs/gsth265decoder.c: + codecs: h265: Make sure that sps is processed just before decoding + It may happens that bitstream doesn't provided SPS in decoding order + (like in VPSSPSPPS_A_MainConcept_1 conformance test file). + To be sure that the decoder got the correct SPS parameters process + SPS just before start decoding the frame. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2575> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Fix multiple ref leaks (patches by SP GLE) - 20070607120121-3e2dc-061e9ef7a47b1b84fa8f8092f4b8bcc0e6db8c8c.gz +2022-03-18 15:04:18 +0100 Sebastian Fricke <sebastian.fricke@collabora.com> -2007-05-28 15:25:05 +0000 Zeeshan Ali <first.last@nokia.com> + * gst-libs/gst/codecs/gsth265decoder.c: + codecs: h265: Fix typos + Fix multiple typos in warning and info messages. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2575> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT send event to all src pads - 20070528152505-f3f1e-039216c73dc93f64c49962c77a0253cb9cfec4d3.gz +2022-05-16 15:27:40 +0200 Benjamin Gaignard <benjamin.gaignard@collabora.com> -2007-05-28 12:37:49 +0000 Zeeshan Ali <first.last@nokia.com> + * gst/videoparsers/gsth265parse.c: + videoparsers: h265: Be less restrictive between PPS and SPS parsing order + Allow to parse PPS to be parser even if SPS hasn't been parsered before. + This help to parse VPSSPSPPS_A_MainConcept_1 conformance test + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2575> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT print a warning if receive an error iterating sinkpads - 20070528123749-f3f1e-4c1eb3f511b5610143610a65a94d117f2c3d2580.gz +2022-05-16 15:25:36 +0200 Benjamin Gaignard <benjamin.gaignard@collabora.com> -2007-05-28 12:28:08 +0000 Zeeshan Ali <first.last@nokia.com> + * gst-libs/gst/codecparsers/gsth265parser.c: + * gst-libs/gst/codecparsers/gsth265parser.h: + codecparsers: Defering computation of pps and sps fields + While possible defer computataion of pps and sps fields until + slice parsing since it may happens that bitstreams don't encoded + them in expected order. + A example weird ordered bitstreams is VPSSPSPPS_A_MainConcept_1 + conformance test. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2575> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT deal with all the gst_iterator_next() return values - 20070528122808-f3f1e-d301644c3be7633ec6dc5e28596e9346d2da6a50.gz +2022-07-20 12:11:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> -2007-05-25 12:31:16 +0000 Zeeshan Ali <first.last@nokia.com> + * sys/v4l2codecs/gstv4l2codech264dec.c: + v4l2codecs: h264: Reset the number of slices on picture start + This way, if we aborted a frame in the middle, we don't endup thinking + there is multiple slices to send. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1079> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Return correct value from the event handler - 20070525123116-f3f1e-131b37b5f4521618fe2f1320409a47e65b35ad2d.gz +2022-07-12 15:44:45 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> -2007-05-25 10:27:09 +0000 Zeeshan Ali <first.last@nokia.com> + * sys/v4l2codecs/gstv4l2codech264dec.c: + v4l2codecs: h264: Fix initialization of the slice array + The function g_array_sized_new() leaves the len to 0, but the slice + implementation assumes it would be set to 4. Sending multiple slices is + not yet support for H.264 as no driver needed it yet, but if that code + was to be used it would have overflowed as the array would never grow as + multiple 0 by 2 always results in 0. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1079> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Ville's original patch to fix the traversal of dtmf event - 20070525102709-f3f1e-6c41d1ef934068a4f4e810e7e981b420075b0c98.gz +2022-07-12 15:43:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> -2007-03-29 13:52:50 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * sys/v4l2codecs/gstv4l2codech264dec.c: + v4l2codecs: h264: Rename count variable to num_controls + This is the counter for the used control slot. The term num_controls was + introduced in the HEVC decoder and felt like a better choice. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1079> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Set the correct ts-offset on the get_prop value - 20070329135250-65035-a43e222d91d57c0a61cb3287586aaa29abf78674.gz +2022-06-20 12:22:20 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> -2007-03-29 13:52:23 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * sys/v4l2codecs/gstv4l2codech265dec.c: + v4l2codecs: hevc: Add an API check + This adds an API check and bump recommended base kernel version to 5.20. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1079> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Refactorize state_change - 20070329135223-65035-23a0107b2e397710f035c6e88cc0e49b65bb4d5d.gz +2022-07-12 08:56:07 -0400 Benjamin Gaignard <benjamin.gaignard@collabora.com> -2007-03-29 13:36:22 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * sys/v4l2codecs/gstv4l2codech265dec.c: + * sys/v4l2codecs/gstv4l2codech265dec.h: + * sys/v4l2codecs/meson.build: + * sys/v4l2codecs/plugin.c: + v4l2codecs: Add v4l2 stateless H265 decoder + Add v4l2 stateless H265 decoder. + Co-authored-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> + Co-authored-by: Sebastian Fricke <sebastian.fricke@collabora.com> + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1079> - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - MOVED FROM GST-P-FARSIGHT set SSRC on the packets - 20070329133622-65035-1be6e0aa85a71389f7d257b9cd3e13a73d6b745b.gz +2022-04-25 15:27:39 +0200 Benjamin Gaignard <benjamin.gaignard@collabora.com> -2007-03-29 13:19:36 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * sys/v4l2codecs/gstv4l2decoder.c: + v4l2codecs: Increase minimum payload size + Fluster MAXBINS_{A-C}_TI_5 HEVC tests files require to store + a payload larger than usual given their resolutions. + Increase the minimum payload size to handle them correctly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1079> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Code clean-up and more debug output - 20070329131936-65035-9d499e209e0d7a409c3aa0d1040778babf076179.gz +2022-07-12 08:57:38 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> -2007-03-28 11:22:19 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * sys/v4l2codecs/linux/v4l2-controls.h: + * sys/v4l2codecs/linux/videodev2.h: + v4l2codecs: Align v4l2 headers with HEVC final uAPI + HEVC uAPI have landed for kernel 5.10. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1079> - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - MOVED FROM GST-P-FARSIGHT Use own clock-base - 20070328112219-65035-1ba5fefbc65059e9b0c860528a31062ceb6a7331.gz +2022-04-29 12:10:05 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> -2007-03-23 16:31:39 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * gst-libs/gst/codecparsers/gsth265parser.c: + * gst-libs/gst/codecparsers/gsth265parser.h: + codecparsers: h265: Introduce long_term_ref_pic_set_size + This is the size of the `if( long_term_ref_pics_present_flag )` inside + slice_segment_header( ) syntax. This size in bit, and after de-emulation + is needed by some HW. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1079> - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - MOVED FROM GST-P-FARSIGHT Only accept RTP streams that have the same clock-rate - 20070323163139-65035-fc0b17b0b8a7a041f48994c4f26e96568168bf95.gz +2022-07-21 16:11:03 +0300 Sebastian Dröge <sebastian@centricular.com> -2007-03-22 16:15:52 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * gst/audiobuffersplit/gstaudiobuffersplit.c: + audiobuffersplit: Actually store number of samples to drop in gapless mode + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2780> - * gst/rtpmux/gstrtpdtmfmux.c: - MOVED FROM GST-P-FARSIGHT Some more code-cleanups - 20070322161552-65035-bda96165e146b4f1d5fea1cc9576a7ab3abebc9e.gz +2022-07-21 16:10:18 +0300 Sebastian Dröge <sebastian@centricular.com> -2007-03-22 15:42:51 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * gst/audiobuffersplit/gstaudiobuffersplit.c: + audiobuffersplit: Use input running time for comparison instead of the currently tracked running time + Otherwise gapless mode would do completely wrong calculations on + discontinuities and cause input/output to drift slowly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2780> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT return newpad instead of NULL and warn if failed to create a pad - 20070322154251-65035-cdb6651e61c2eb0205cc8c24693b43f98a2da718.gz +2022-07-21 13:38:22 +0300 Sebastian Dröge <sebastian@centricular.com> -2007-03-22 12:41:32 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * gst/audiobuffersplit/gstaudiobuffersplit.c: + audiobuffersplit: Combine two if expressions to reduce indentation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2780> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Refactorize the RTPMux code - 20070322124132-65035-0a3278147546e33f687097a43b775b3f6aa99f93.gz +2022-07-22 04:51:14 +0900 Seungha Yang <seungha@centricular.com> -2007-03-22 12:14:53 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * sys/d3d11/gstd3d11compositor.cpp: + d3d11compositor: Add support for crop meta + GstD3D11Converter supports cropping already. Cropping is just + a matter of setting source rectangle area to converter, + from d3d11 point of view + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2782> - * gst/rtpmux/gstrtpdtmfmux.c: - MOVED FROM GST-P-FARSIGHT Some more doc fixing - 20070322121453-65035-12d602272217b51bd97df4e5790024c399622dd3.gz +2022-07-18 00:41:00 +0900 Seungha Yang <seungha@centricular.com> -2007-03-22 11:32:28 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * tests/examples/d3d11/d3d11converter.cpp: + * tests/examples/d3d11/meson.build: + examples: d3d11: Add GstD3D11Converter example + An example to demonstrate color space conversion, rescale and flip/rotation + using GstD3D11Converter + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2767> - * gst/rtpmux/gstrtpdtmfmux.c: - MOVED FROM GST-P-FARSIGHT More Refactoring - 20070322113228-65035-bae34a79599e7de5293ed77b022361ccff822bb9.gz +2022-07-21 05:13:21 +0900 Seungha Yang <seungha@centricular.com> -2007-03-22 11:31:54 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * gst-libs/gst/d3d11/gstd3d11.h: + * gst-libs/gst/d3d11/gstd3d11_fwd.h: + * gst-libs/gst/d3d11/gstd3d11_private.h: + * gst-libs/gst/d3d11/gstd3d11converter.cpp: + * gst-libs/gst/d3d11/gstd3d11converter.h: + * gst-libs/gst/d3d11/gstd3d11format.cpp: + * gst-libs/gst/d3d11/meson.build: + * sys/d3d11/gstd3d11compositor.cpp: + * sys/d3d11/gstd3d11convert.cpp: + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/gstd3d11pluginutils.cpp: + * sys/d3d11/gstd3d11pluginutils.h: + * sys/d3d11/gstd3d11testsrc.cpp: + * sys/d3d11/gstd3d11window.h: + * sys/d3d11/meson.build: + d3d11: Move GstD3D11Converter to gst-libs + The object is equivalent to GstVideoConverter but for D3D11. + Application can use this object directly for various conversions, + such as color space conversion, rescale, crop and flip/rotation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2767> - * gst/rtpmux/gstrtpdtmfmux.c: - MOVED FROM GST-P-FARSIGHT More documentation - 20070322113154-65035-624850541a5b5fc3df231204be5a83d07239db28.gz +2022-07-21 05:40:45 +0900 Seungha Yang <seungha@centricular.com> -2007-03-21 16:33:11 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * gst-libs/gst/d3d11/gstd3d11.h: + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.h: + * gst-libs/gst/d3d11/meson.build: + d3d11: Define enum and flags types manually + gnome.mkenums_simple() doesn't work well for GstD3D11, seems to + be confused by numeric representation of D3D11, must be a bug + in GLib or so. Just don't rely on the incomplete automagic. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2767> - * gst/rtpmux/gstrtpdtmfmux.c: - MOVED FROM GST-P-FARSIGHT Refactor the event handler function - 20070321163311-65035-987e7f25d1ab5335b79f44b277abf15e4e37d317.gz +2022-07-21 05:39:58 +0900 Seungha Yang <seungha@centricular.com> -2007-03-21 14:52:44 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * gst-libs/gst/d3d11/gstd3d11format.cpp: + d3d11: Run gst-indent + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2767> - * gst/rtpmux/Makefile.am: - * gst/rtpmux/gstrtpdtmfmux.c: - * gst/rtpmux/gstrtpdtmfmux.h: - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - * gst/rtpmux/gstrtpmuxer.c: - MOVED FROM GST-P-FARSIGHT Add RTPDTMFMux element - 20070321145244-65035-9a01390b0dee3398e53199a1fa1d9352004f338e.gz +2022-07-06 16:14:13 +0300 Jordan Petridis <jordan@centricular.com> -2007-03-21 12:31:49 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * ext/openmpt/gstopenmptdec.c: + openmpt: update from now deprecated api + https://lib.openmpt.org/doc/classopenmpt_1_1module.html#ab2695af0baa274054f5687741fa7c05b + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2721> - * gst/rtpmux/Makefile.am: - * gst/rtpmux/gstrtpmux.c: - * gst/rtpmux/gstrtpmux.h: - MOVED FROM GST-P-FARSIGHT Remove DTMF-specific code from RTP muxer and make it extendable - 20070321123149-65035-b8a8f55ff78eed8cbb0042e827885edfc5438242.gz +2022-04-29 19:27:16 +0800 Fan F He <fan.f.he@intel.com> -2007-03-20 12:05:24 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * sys/msdk/gstmsdkenc.c: + * sys/msdk/gstmsdkenc.h: + * sys/msdk/gstmsdkh264enc.c: + * sys/msdk/gstmsdkh265enc.c: + * sys/msdk/gstmsdkh265enc.h: + * sys/msdk/msdk-enums.c: + * sys/msdk/msdk-enums.h: + msdkenc: Enable LowDelayBrc and MaxFrameSize for I/P frame + Enable these features for accurate bitrate control. + Feature introduction of LowDelayBRC, MaxFrameSizeI and MaxFrameSizeP could be found here: + https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md + Signed-off-by: Fan F He <fan.f.he@intel.com> + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2742> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Put more helpful description - 20070320120524-65035-db27a7cf6307b511aeb3d996d26e790e367a7bad.gz +2022-07-20 05:28:51 +0900 Seungha Yang <seungha@centricular.com> -2007-03-16 15:16:41 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * sys/d3d11/gstd3d11converter.cpp: + * sys/d3d11/gstd3d11converter.h: + * sys/d3d11/gstd3d11testsrc.cpp: + * sys/d3d11/gstd3d11window_dummy.cpp: + d3d11converter: Use GstStructure to set initialization options + Runtime updatable options are exposed via object properties + but there are a few options which should be known at initialization + time. Use GstStructure to signal it and to be easily extensible + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2776> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT remove the (commented-out) code for blocking the pads - 20070316151641-65035-0123af387951f88594797c722e882cfe70240aff.gz +2022-07-19 01:52:48 +0900 Seungha Yang <seungha@centricular.com> -2007-03-16 13:14:44 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * sys/d3d11/gstd3d11converter.cpp: + d3d11converter: Use primaries and transfer function compare methods + Different enum values could be functionally equal, then we don't need + to do full conversion. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2776> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Drop buffers instead of blocking the sinkpads - 20070316131444-65035-9c1345ad96108881f455d4b55a7f623cd302d0ed.gz +2022-07-17 04:48:24 +0900 Seungha Yang <seungha@centricular.com> -2007-03-14 17:16:18 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * gst-libs/gst/d3d11/gstd3d11format.cpp: + * gst-libs/gst/d3d11/gstd3d11format.h: + * sys/d3d11/gstd3d11converter.cpp: + * sys/d3d11/gstd3d11pluginutils.cpp: + * sys/d3d11/gstd3d11pluginutils.h: + * sys/d3d11/gstd3d11screencapture.cpp: + * sys/d3d11/gstd3d11window.cpp: + d3d11format: Move DXGI color space mapping method to gst-libs + Expose color space mapping method to public so that application + can configure GstCaps or GstVideoInfo using DXGI color space + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2776> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Implement stream locking, needed for DTMF - 20070314171618-65035-e4d24b1606ce0a3e2e739f01833f61e4d7555eac.gz +2022-07-17 00:33:55 +0900 Seungha Yang <seungha@centricular.com> -2007-03-14 10:20:58 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * sys/d3d11/gstd3d11convert.cpp: + d3d11convert: Use new colorimetry compare function + Avoid conversion if both are functionally identical + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2765> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT use GST_*_OBJECT instead of g_* - 20070314102058-65035-e2442888f2e3e5a3a7659ad7954a4fba34749ce2.gz +2022-07-17 23:58:19 +0900 Seungha Yang <seungha@centricular.com> -2007-03-14 10:18:54 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * sys/d3d11/gstd3d11testsrc.cpp: + d3d11testsrc: Fix SMPTE pattern rendering + It was wrong vertex shader code + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2766> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT No need to manage pads, parent does that for us - 20070314101854-65035-ef5f4abde227102a1128835ab325905eae4c3726.gz +2022-07-13 10:30:49 +0200 Piotr Brzeziński <piotr@centricular.com> -2007-03-14 09:03:58 +0000 zeenix@gmail.com <zeenix@gmail.com> + * sys/applemedia/vtdec.c: + * sys/applemedia/vtenc.c: + applemedia: Add HEVC support to vtenc and vtdec + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2754> - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT Fix copyright header - 20070314090358-d014a-3a6d3eeeaaf5cb8ca3bca6a33e99a551f598bd48.gz +2022-06-16 03:57:37 +0900 Seungha Yang <seungha@centricular.com> -2007-03-07 08:53:07 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> + * gst-libs/gst/d3d11/gstd3d11.h: + * gst-libs/gst/d3d11/gstd3d11compile.cpp: + * gst-libs/gst/d3d11/gstd3d11compile.h: + * gst-libs/gst/d3d11/meson.build: + * sys/d3d11/gstd3d11compositor.cpp: + * sys/d3d11/gstd3d11converter.cpp: + * sys/d3d11/gstd3d11overlaycompositor.cpp: + * sys/d3d11/gstd3d11screencapture.cpp: + * sys/d3d11/gstd3d11screencapturesrc.cpp: + * sys/d3d11/gstd3d11shader.cpp: + * sys/d3d11/gstd3d11shader.h: + * sys/d3d11/gstd3d11testsrc.cpp: + * sys/d3d11/meson.build: + * sys/d3d11/plugin.cpp: + d3d11: Move HLSL compiler to gst-libs + We should move this functionality to gst-libs so that GstD3D11Converter + can be moved to gst-libs. + Another advantage is that applications can call our + HLSL compiler wrapper method without any worry about OS version + dependent system installed HLSL library. + Note that there are multiple HLSL compiler library versions + on Windows and system installed one would be OS version dependent. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2760> + +2022-06-04 18:07:16 -0400 Thibault Saunier <tsaunier@igalia.com> - * gst/rtpmux/.git-darcs-dir: - * gst/rtpmux/Makefile.am: - * gst/rtpmux/gstrtpmux.c: - MOVED FROM GST-P-FARSIGHT The first implementation of RTP muxer - 20070307085307-65035-833402413f99cb3f8be4883e92bad4c8722510c9.gz + * docs/plugins/gst_plugins_cache.json: + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: Add a signal to plug bandwidth estimator elements + We need GStreamer elements to do the bandwidth estimation as this way + they can also control the pacing of the transmission flow as specified + in the GCC algorithm for example. + Bandwidth estimator element are placed right before the "RTPSession" as + an "rtp-aux-sender" element. This way they can use the "Transport-wide + Congestion Control" RTCP feedback messages through the "RTPTwcc" custom + events that are sent by the rtpsession. + Applications are responsible to react to the bandwidth estimator element + and set the encoder target bitrate etc... which means that we can not + pass an estimator as an element factory, so a signal as been chosen + instead. + GCC: https://datatracker.ietf.org/doc/html/draft-ietf-rmcat-gcc-02 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2562> -2009-02-20 18:16:02 -0500 Olivier Crête <olivier.crete@collabora.co.uk> +2022-07-08 00:16:02 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfsrc.c: - Document rtpdtmfdepay a bit + * gst-libs/gst/codecs/gsth265decoder.c: + h265decoder: Report latency + Similar to that of h264decoder + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2726> + +2022-07-08 22:05:12 +0800 He Junyan <junyan.he@intel.com> + + * sys/va/gstvabaseenc.c: + va: baseenc: Do not use codec frame structure again after finish_frame(). + In _push_out_one_buffer(), we use codec frame structure again for error handling + after we already call finish_frame(), which is a latent segment fault. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2739> + +2022-07-08 21:57:40 +0800 He Junyan <junyan.he@intel.com> + + * sys/va/gstvabaseenc.c: + va: baseenc: Do not clear the codec frame twice when error. + The current manner will clear the input codec frame twice if we fail + to push the output data, which will trigger an assert. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2739> -2009-02-20 17:41:37 -0500 Olivier Crête <olivier.crete@collabora.co.uk> +2022-07-05 18:21:12 +0300 Jordan Petridis <jordan@centricular.com> - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-dtmf.xml: - * gst/dtmf/gstdtmf.c: - Moved dtmf elements from gst-plugins-farsight to -bad + * ext/fluidsynth/gstfluiddec.c: + fluiddec: Remove workaround for version 1.1.9 + We require >= 2.1 version since the previous commit + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2718> -2009-02-20 17:40:57 -0500 Olivier Crête <olivier.crete@collabora.co.uk> +2022-07-05 17:32:12 +0300 Jordan Petridis <jordan@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - * gst/dtmf/gstrtpdtmfdepay.h: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - Fix up documentation blobs SGML + * ext/fluidsynth/gstfluiddec.c: + * ext/fluidsynth/meson.build: + fluidsynth: update from now deprecated api + fluid_synth_set_chorus_on and fluid_synth_set_reverb_on were + deprecated in favor of new funtions where you can also specify + the fx_group the effect would apply. + The behavior of the set_* variants was to apply to all groups + so we pass -1 to the new functions as per documentation. + https://www.fluidsynth.org/api/group__chorus__effect.html#ga3c48310eecdca9cd338799d19f19c32d + and + https://www.fluidsynth.org/api/group__reverb__effect.html#gacb7917564c988cf54f2e35189b509c8e + and the introduction of the change: + https://github.com/FluidSynth/fluidsynth/pull/673 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2718> -2009-02-20 17:37:43 -0500 Olivier Crête <olivier.crete@collabora.co.uk> +2022-07-08 02:24:56 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmf.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - * gst/dtmf/gstrtpdtmfcommon.h: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfdepay.h: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - Re-indent to Gst style + * gst-libs/gst/d3d11/gstd3d11_private.h: + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * sys/d3d11/gstd3d11compositor.cpp: + * sys/d3d11/gstd3d11convert.cpp: + * sys/d3d11/gstd3d11converter.cpp: + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/gstd3d11deinterlace.cpp: + * sys/d3d11/gstd3d11overlaycompositor.cpp: + * sys/d3d11/gstd3d11pluginutils.cpp: + * sys/d3d11/gstd3d11testsrc.cpp: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window_corewindow.cpp: + * sys/d3d11/gstd3d11window_dummy.cpp: + * sys/d3d11/gstd3d11window_swapchainpanel.cpp: + * sys/d3d11/gstd3d11window_win32.cpp: + d3d11: Use scoped device lock + Make code simpler and more deadlock-free + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2728> -2009-02-18 13:30:44 -0500 Laurent Glayal <spglegle@yahoo.fr> +2022-07-08 18:53:01 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Missing format directive + * sys/qsv/gstqsvencoder.cpp: + qsvencoder: Fix for latency report when B-frame is enabled + QSV runtime will introduce additional delay when B-frame is enabled + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2730> -2008-12-04 21:21:44 -0500 Olivier Crête <olivier.crete@collabora.co.uk> +2022-07-08 19:05:19 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfdepay.h: - MOVED FROM GST-P-FARSIGHT Allow setting a maximum duration to a RTP DTMF event + * sys/qsv/gstqsvencoder.cpp: + qsvencoder: Do not query again if previous call succeeded + Don't need to query multiple times + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2730> -2008-12-04 21:11:17 -0500 Olivier Crête <olivier.crete@collabora.co.uk> +2022-07-08 03:38:30 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfdepay.c: - MOVED FROM GST-P-FARSIGHT Improve the minimum quanta to make it impossible for the duration to fall down to 0 + * sys/d3d11/gstd3d11screencapture.cpp: + * sys/d3d11/gstd3d11screencapture.h: + * sys/d3d11/gstd3d11screencapturesrc.cpp: + d3d11screencapturesrc: Set colorimetry to caps + Make use of reported DXGI colorspace if possible + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2729> -2008-12-01 18:31:48 -0500 Olivier Crête <olivier.crete@collabora.co.uk> +2022-07-08 20:11:00 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfdepay.h: - MOVED FROM GST-P-FARSIGHT Allow setting a minimum size of a sound quanta in the dtmf depayloader + * sys/d3d11/gstd3d11pluginutils.cpp: + d3d11: Update colorspace map + Map DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 to sRGB colorimetry + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2729> -2008-12-11 17:54:18 -0500 Olivier Crête <olivier.crete@collabora.co.uk> +2022-07-08 04:37:33 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/.git-darcs-dir: - MOVED FROM GST-P-FARSIGHT Remove .git-darcs-dir files + * sys/d3d11/gstd3d11pluginutils.cpp: + * sys/d3d11/gstd3d11pluginutils.h: + d3d11: Add an utility method for DXGI colorspace conversion + Add a method for DXGI_COLOR_SPACE_TYPE -> GstVideoColorimetry conversion + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2729> -2008-12-01 17:37:10 -0500 Håvard Graff <havard.graff@tandberg.com> +2022-07-08 01:30:13 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfdepay.c: - MOVED FROM GST-P-FARSIGHT Do wierd casting of the volume to make MSVC happy + * gst-libs/gst/d3d11/gstd3d11utils.cpp: + d3d11: Serialize ensure_element_data() call + It can be called any time from random thread. Thus, multiple + device objects can be created for the same physical device + if the call is not serialized, that's not a scenario we expect. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2727> -2008-10-15 16:21:50 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-07-07 02:17:56 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Clarify the documentation of the "event-type" field when specifying dtmf events + * gst/proxy/gstproxysink.c: + proxysink: Fix GstProxySrc leak + Clear weak pointer to peer src when disposing. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1552> -2008-07-22 21:39:38 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-07-06 03:14:25 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Remove g_debugs - 20080722213938-3e2dc-44a82d017fe66f3112301c410aa0b543de6156ad.gz + * gst/proxy/gstproxysink.c: + * gst/proxy/gstproxysink.h: + * tests/check/elements/proxysink.c: + * tests/check/meson.build: + proxysink: Make sure stream-start and caps events are forwarded + There might be a sequence of event and buffer flow: + - Got stream-start/caps/segment events + - Got flush events + - And then buffers with a new segment event + In the above case, stream-start and caps event might not be reached to + peer proxysrc if peer proxysrc is not ready to receive them. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1552> -2008-06-13 23:57:23 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-03-04 14:28:21 +1100 Matthew Waters <matthew@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Take rate from the peers caps if possible - 20080613235723-3e2dc-15690ee42708c539e1be12e20e076a5613faea96.gz + * ext/webrtc/gstwebrtcice.c: + webrtc: implement support for asynchronous host resolution + Doesn't block anymore if a mdns host resolution takes multiple seconds + to complete in e.g. stun/turn/ice candidate usage. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1961> -2008-06-13 23:41:44 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-07-04 22:27:34 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Put the sample rate in dtmfsrc into a variable - 20080613234144-3e2dc-e60070943bec829b703b8821c7aa4351a02deebe.gz + * sys/d3d11/gstd3d11converter.cpp: + * sys/d3d11/gstd3d11converter.h: + d3d11converter: Remove convert() method + Expose only single convert_buffer() method. It's safer approach than + passing arbitrary list of SRV/RTV pointers. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2713> + +2022-07-04 22:26:19 +0900 Seungha Yang <seungha@centricular.com> + + * sys/d3d11/gstd3d11testsrc.cpp: + d3d11testsrc: Use convert_buffer() method + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2713> -2008-06-13 23:30:06 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-07-04 22:01:49 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Take the clock-rate from the caps in rtpdtmfsrc - 20080613233006-3e2dc-a7d4e918643f4f8c1bb2cc2678558c654025920e.gz + * sys/d3d11/gstd3d11compositor.cpp: + * sys/d3d11/gstd3d11videoprocessor.cpp: + * sys/d3d11/gstd3d11videoprocessor.h: + * sys/d3d11/gstd3d11videosink.cpp: + * sys/d3d11/gstd3d11window.h: + * sys/d3d11/meson.build: + d3d11: Remove video processor + Processing using ID3D11VideoProcessor was integrated into + GstD3D11Converter and GstD3D11VideoProcessor implementation is + not used anymore. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2713> -2008-04-28 22:22:37 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-07-04 21:57:42 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/Makefile.am: - MOVED FROM GST-P-FARSIGHT Link modules with libm where required - 20080428222237-3e2dc-b1e9120c1e9ca1a510bfd7c27e2d45f0d4a12504.gz + * gst-libs/gst/d3d11/gstd3d11_private.h: + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.h: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window_dummy.cpp: + * tests/examples/d3d11/d3d11videosink-appsrc.cpp: + d3d11memory: Update alloc_wrapped() API to avoid staging texture alloc + Add size parameter and use it for CPU accessible memory size + instead of allocating staging texture per API call. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2713> -2008-04-12 23:44:18 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-30 11:04:29 +0200 Ignazio Pillai <ignazp@amazon.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfdepay.c: - MOVED FROM GST-P-FARSIGHT Fix byte ordering issues with dtmfsrc and rtpdtmfdepay.. use of G_STRINGIFY to avoid error on MSVC - 20080412234418-4f0f6-4828d1613dfcd564afd236dfc8fb57a299092f83.gz + * sys/wasapi/gstwasapiutil.c: + wasapi: Implement default audio channel mask + Some multichannel capture devices does not provide a channel mask value + which will result in a pipeline failure due to the empty channel mask. + Implemented the same fix used for wasapi2 + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1204 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2692> -2008-03-20 19:14:38 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-07-03 01:22:10 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfdepay.h: - MOVED FROM GST-P-FARSIGHT Fix copyrights again, per smcv's advice.. - 20080320191438-4f0f6-671c9db5d996a4601df017ceab4af6d16469c966.gz + * sys/d3d11/gstd3d11videosink.cpp: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window.h: + * sys/d3d11/gstd3d11window_dummy.cpp: + * sys/d3d11/gstd3d11window_win32.cpp: + d3d11videosink: Add support for rotation + Adding "rotate-method" property + Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1396 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2708> -2008-03-19 21:17:31 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-07-03 01:18:19 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Make it clear that dtmfsrc also takes named events as input - 20080319211731-3e2dc-26c729f6dc8db27e71cf6b22646a81530dbf862f.gz + * sys/d3d11/gstd3d11videosink.cpp: + * sys/d3d11/gstd3d11videosink.h: + d3d11videosink: Protect window with lock at every place + Access to the object should be thread safe to support runtime + property update + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2708> -2008-03-20 18:48:41 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-07-02 04:23:41 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfdepay.c: - MOVED FROM GST-P-FARSIGHT debug message made into errors because that's what they are... - 20080320184841-4f0f6-8a2d283297b02713dade0ae4acaa5f6e0f67eace.gz + * sys/d3d11/gstd3d11basefilter.cpp: + * sys/d3d11/gstd3d11convert.cpp: + d3d11convert: Add support for GstVideoOrientationMethod + Add flip/rotation support via GstVideoDirectionInterface + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2708> -2008-03-20 18:39:37 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-07-02 02:15:00 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfdepay.c: - MOVED FROM GST-P-FARSIGHT Clean unused stuff... - 20080320183937-4f0f6-bcb841cdc07f9e9677512f4b50b4b659a58c6783.gz + * sys/d3d11/gstd3d11converter.cpp: + d3d11converter: Add support for GstVideoOrientationMethod + Shader can handle rotation/flip with other conversions + at once in a single pipeline, and depending on device + capability, videoprocessor may support it too. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2708> -2008-03-20 18:39:12 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-07-01 23:49:49 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfdepay.h: - MOVED FROM GST-P-FARSIGHT Fix copyrights - 20080320183912-4f0f6-689365d5a406632e3d088fac74e4fb6f8a4eb0ea.gz + * sys/d3d11/gstd3d11videosink.cpp: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window.h: + * sys/d3d11/gstd3d11window_dummy.cpp: + d3d11videosink: Use single GstD3D11Converter object + GstD3D11Converter supports videoprocessor and texture upload. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2697> -2008-03-20 01:13:01 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-07-01 21:35:15 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/Makefile.am: - * gst/dtmf/gstdtmf.c: - * gst/dtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Adding support for rtpdtmfdepay - 20080320011301-4f0f6-d36a5d24be20336e36c4796d75476c9b5ee1a7e1.gz + * gst-libs/gst/d3d11/gstd3d11_private.h: + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + d3d11memory: Add private method for texture wrapped memory allocation + Unlike public method gst_d3d11_allocator_alloc_wrapped(), newly + added method by this commit will not calculate CPU accessible memory + size, since staging texture must be allocated to calculate the size. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2697> -2008-03-19 19:32:51 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-07-01 21:20:02 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT encoding name has to be upper-case - 20080319193251-3e2dc-1581b33be9b486e35ec4948009677ccd5ffdc098.gz + * gst-libs/gst/d3d11/gstd3d11_private.h: + * sys/d3d11/gstd3d11pluginutils.h: + d3d11: Use library private header in plugin + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2697> -2008-03-20 00:51:47 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-07-01 20:47:37 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfcommon.h: - * gst/dtmf/gstrtpdtmfdepay.c: - * gst/dtmf/gstrtpdtmfdepay.h: - MOVED FROM GST-P-FARSIGHT Adding necessary files for rtpdtmfdepay - 20080320005147-4f0f6-550fe22f70152f3aab3dcd7a6b02cbf81e89232d.gz + * sys/d3d11/gstd3d11compositor.cpp: + d3d11compositor: Use single GstD3D11Converter object + ... and remove unnessary videoprocessor/upload/copy code + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2697> -2008-03-20 00:50:41 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-07-01 04:12:23 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Fix typos - 20080320005041-4f0f6-9d22fa5d155e35b605ea85b1fd9e7197a882a1f0.gz + * sys/d3d11/gstd3d11convert.cpp: + d3d11convert: Add border-color property + Use user specified border-color instead of black color + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2697> -2008-02-16 13:41:40 +0000 Sjoerd Simons <sjoerd@luon.net> +2022-07-01 20:13:29 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT dtmfsrc: Correctly set the endianess in the caps to the machines endianess - 20080216134140-93b9a-40a3a9d7ac1679c5e0dfd24a6b91e4aba6cc6496.gz + * sys/d3d11/gstd3d11convert.cpp: + d3d11convert: Use single GstD3D11Converter object + ... and don't use GstD3D11VideoProcessor. Now GstD3D11Converter will + be able to convert using videoprocessor, and texture upload is also supported by + GstD3D11Converter. All the noisy code can be removed therefore. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2697> -2007-09-17 17:52:33 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-22 02:44:26 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Search&Replace oops - 20070917175233-3e2dc-57f579c4b890993f49fa8e9e6470a3eb79d2b922.gz + * sys/d3d11/gstd3d11compositor.cpp: + * sys/d3d11/gstd3d11convert.cpp: + * sys/d3d11/gstd3d11converter.cpp: + * sys/d3d11/gstd3d11converter.h: + * sys/d3d11/gstd3d11testsrc.cpp: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window_dummy.cpp: + d3d11converter: Add support conversion using videoprocessor + * Add videoprocessor feature to d3d11converter, in order to unifiy + conversion flow. + * Add convert_buffer() method to support automatic shader/videoprocessor + selection. The method also supports texture upload if input memory + cannot be used for conversion (e.g., system memory or so) + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2697> -2007-09-17 17:51:33 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-21 23:43:46 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT events dont yet belong in the caps - 20070917175133-3e2dc-fd1d83b7826b898110fc571ae7c3440f1887434d.gz + * sys/d3d11/gstd3d11overlaycompositor.cpp: + * sys/d3d11/gstd3d11overlaycompositor.h: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window_dummy.cpp: + d3d11overlaycompositor: Objectify overlay render implementation + Be consistent with other implementations + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2697> -2007-09-17 16:08:20 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-21 22:44:55 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Add patch to make it work with maemo dsp sources that payload incorrectly - 20070917160820-3e2dc-06b1b1d1b0918b30dabea5a0714cb732b3b8d8dd.gz + * sys/d3d11/gstd3d11compositor.cpp: + * sys/d3d11/gstd3d11convert.cpp: + * sys/d3d11/gstd3d11pluginutils.cpp: + * sys/d3d11/gstd3d11pluginutils.h: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window_dummy.cpp: + d3d11: Don't use const pointer to GstDxgiColorSpace + Instead, fill values of passed GstDxgiColorSpace struct + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2697> -2007-09-17 04:26:49 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-28 16:40:55 +0300 Sebastian Dröge <sebastian@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Oops, set to no preroll when playing->paused too - 20070917042649-3e2dc-94adb6aa0617e815a6e233232dabb4bbc48dc82c.gz + * sys/decklink/gstdecklink.h: + * sys/decklink/gstdecklinkvideosink.cpp: + decklinkvideosink: Pass video frames directly to the Decklink SDK without copying + If the video frame is stored in PBO memory then we need to copy anyway as + it might be stored in CPU-accessible GPU memory that can't be accessed + from the Decklink driver. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2674> -2007-09-17 00:36:54 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-10 14:11:06 +0800 Vincent Cheah Beng Keat <vincent.beng.keat.cheah@intel.com> - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Complete port to basesrc - 20070917003654-3e2dc-db0f84dabd9dd1ac929a0461865b8aaa8ef91a77.gz + * sys/msdk/gstmsdkdec.c: + * sys/msdk/gstmsdkmjpegdec.c: + * sys/msdk/meson.build: + msdkmjpegdec: Add support for error report + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2401> -2007-09-17 00:24:12 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-23 01:10:38 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Add caps negotiation function - 20070917002412-3e2dc-ca266816e9629746e9083c5bb8b7f73b94a9b2b0.gz + * sys/nvcodec/gstnvencoder.cpp: + * sys/nvcodec/gstnvencoder.h: + * sys/nvcodec/gstnvh264encoder.cpp: + * sys/nvcodec/gstnvh264encoder.h: + * sys/nvcodec/gstnvh265encoder.cpp: + * sys/nvcodec/gstnvh265encoder.h: + * sys/nvcodec/plugin.c: + nvencoder: Add support for dynamic GPU device selection + Adding nvautogpu{h264,h265}enc class which will accept upstream logical + GPU device object (GstCudaContext or GstD3D11Device) instead of + using pre-assigned GPU instance. + If upstream logical GPU device object is not NVENC compatible + (e.g., D3D11 device of non-NVIDIA GPU) or it's system memory, + then user specified "cuda-device-id" or "adapter-luid" property + will be used for GPU device selection. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2666> + +2022-06-27 20:50:15 +0900 Seungha Yang <seungha@centricular.com> + + * gst-libs/gst/cuda/gstcudautils.c: + cuda: Protect gst_cuda_ensure_element_context() with lock + Serialize the order of context setup since it can be called + from multiple threads + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2666> -2007-09-17 00:16:59 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-30 16:45:46 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Properly free non-start events - 20070917001659-3e2dc-a571777e3ecfb90989f87412f554aa10a31cc2ca.gz + * gst-libs/gst/cuda/gstcudamemory.c: + * sys/nvcodec/gstcudabasefilter.c: + * sys/nvcodec/gstcudaformat.h: + cuda: Add YUY2 and UYVY formats for GL interop + Those formats are not supported conversion formats by CUDA convert/scale elements + but would be useful for GL <-> CUDA interop use case. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2691> + +2022-06-30 17:47:05 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstcudamemorycopy.c: + cudadownload: Passthrough in case of CUDA -> SYSTEM + GstCudaMemory supports CPU access via CUDA pinned host memory already + and it would show faster memory transfer performance between + GPU and CPU than copying from/to normal system memory. + If downstream supports video meta, we can passthrough CUDA memory. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2690> -2007-09-17 00:15:52 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-30 09:09:02 +0300 Sebastian Dröge <sebastian@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Make interval and packet_redundancy into uint - 20070917001552-3e2dc-60032e547b3669b87317c981d985c156aab91b40.gz + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: Reject caps that are not valid for creating an SDP media. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2689> -2007-09-16 19:44:08 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-04-22 16:37:34 +0200 Corentin Damman <c.damman@intopix.com> - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Make the rtp dtmf src use basesrc - 20070916194408-3e2dc-734000130dce2434a014acf843d641ff0e60aa5a.gz + * sys/nvcodec/gstcudaformat.h: + cudaformat: add support for planar 4:2:2 YUV formats in CUDA D3D11 interop + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2269> -2007-09-16 19:41:01 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-04-22 15:58:13 +0200 Corentin Damman <c.damman@intopix.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Make dtmf src code nicer - 20070916194101-3e2dc-a8be8c509c65400d1d3962da02e67d15d2054316.gz + * gst-libs/gst/cuda/gstcudamemory.c: + * sys/nvcodec/gstcudaformat.h: + cudamemory: add support for planar 4:2:2 YUV formats + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2269> -2007-09-16 19:40:52 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2021-06-22 14:43:29 +0200 Benjamin Gaignard <benjamin.gaignard@collabora.com> - * gst/rtpdtmf/.git-darcs-dir: - MOVED FROM GST-P-FARSIGHT Remove unused directory - 20070916194052-3e2dc-44d7f4cb2f220761b65e2b9b6cec4b3c6f8be7c5.gz + * sys/v4l2codecs/gstv4l2decoder.c: + v4l2codecs: enumerate all possible formats + Some decoder may also allow to (down) scale the decoded video. + Use VIDIOC_ENUM_FRAMESIZES iotcl to enumerate the possible output + formats resolutions. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2589> -2007-09-14 04:20:42 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-26 22:26:29 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Implement stopping in a nice thread safe way - 20070914042042-3e2dc-1fe257ff4b72aca4b0eb5f285a14650b8df268c3.gz + * sys/nvcodec/gstnvav1dec.c: + * sys/nvcodec/gstnvdecoder.h: + * sys/nvcodec/gstnvh264dec.c: + * sys/nvcodec/gstnvh264dec.h: + * sys/nvcodec/gstnvh265dec.c: + * sys/nvcodec/gstnvh265dec.h: + * sys/nvcodec/gstnvvp8dec.c: + * sys/nvcodec/gstnvvp8dec.h: + * sys/nvcodec/gstnvvp9dec.c: + * sys/nvcodec/gstnvvp9dec.h: + nvcodec: Add cuda-device-id read-only property to stateless decoders + ... and remove unnecessary intermediate subclass from class hierarchy + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2665> -2007-09-14 04:18:34 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-26 21:09:50 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Remove get_times (Wim says its only good for really fake sources) - 20070914041834-3e2dc-fff4d5da2a145f19e7b610a1027d2c4d4bc5eae0.gz + * sys/nvcodec/gstnvdec.c: + nvcodec: Add cuda-device-id read-only property to CUVID decoders + Similar to the other hardware decoder plugins, provides assigned + device id via property + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2665> -2007-09-13 21:21:45 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-29 10:55:13 +0100 Tim-Philipp Müller <tim@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT using the unlock method of basesrc - 20070913212145-4f0f6-0e438a681bf1651c0cc0d8fa3269aed3f1668b6b.gz + * meson.build: + coding style: allow declarations after statement + See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1243/ + and https://gitlab.freedesktop.org/gstreamer/gstreamer-project/-/issues/78 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2683> -2007-09-13 21:12:26 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-29 00:31:01 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT more debug - 20070913211226-4f0f6-bc32b5828fc8e0323c8a6eee779a38145aacd593.gz + * sys/d3d11/gstd3d11convert.cpp: + d3d11convert: Add support for GstVideoCropMeta + Performs crop, scale, and color space conversion all in + a single render pipeline. Note that cropping related property is not + added in this element (which will make negotiation very complicated), + but user can configure videocrop element for crop meta to be attached + on each buffer. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2678> -2007-09-13 20:46:14 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-28 17:40:56 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT added debugs - 20070913204614-4f0f6-68c2a69ae7a1efca6e13c116dbad7f9b686f0242.gz + * sys/d3d11/gstd3d11videosink.cpp: + d3d11videosink: Fix for force-aspect-ratio setting when rendering on shared texture + Set specified force-aspect-ratio value on window object + in case of shared texture rendering as well + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1304 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2671> -2007-09-13 19:20:53 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-26 06:39:54 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Make sure to unlock the thread when going to ready and to flush the queue when moving to paused or playing - 20070913192053-4f0f6-76c3925380d1a30988286170535a65dea64a5583.gz + * sys/mediafoundation/gstmfvideoencoder.cpp: + * sys/mediafoundation/gstmfvideoencoder.h: + mfvideoenc: Fix broken encoding when resolution is not an even number + Width and height values of 4:2:0 subsampled YUV format should be even number, + and if it's not the case, there should be padding which is not a contiguous memory layout. + Do copy input frames to MediaFoundation's memory in that case for now. + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1165 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2661> -2007-09-13 17:55:20 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-28 01:29:06 +0100 Tim-Philipp Müller <tim@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Changed dtmfsrc into a subclass of GstBaseSrc - 20070913175520-4f0f6-16ca4bf93690072f3e836d1c8a5b52cf7a421916.gz + * ext/opus/gstopusheader.h: + dv, opusparse: fix duplicate symbols in static build + Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1262 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2670> -2007-09-04 22:57:53 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-27 04:07:04 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Add another fix for a possible race condition - 20070904225753-4f0f6-5ba8c4260c002bb27eb98e9faba3c15799357b57.gz + * sys/d3d11/plugin.cpp: + d3d11: Enumerate devices via native DXGI API + D3D11CreateDevice() can fail for some reason (e.g., buggy GPU driver) + and then gst_d3d11_device_new() will return nullptr. + Use DXGI API directly instead of relying on the gst_d3d11_device_new() + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2663> -2007-09-04 21:52:24 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-25 01:15:17 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Add comment to explain push back - 20070904215224-3e2dc-d92ac1f403dcf571546a7c53f18809f840eea51d.gz + * tests/examples/d3d11/d3d11videosink-appsrc.cpp: + * tests/examples/d3d11/meson.build: + examples: Add an example for application texture sharing + This example shows GstD3D11BufferPool usage and a way of + D3D11 texture sharing between application and GStreamer via appsrc. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2646> -2007-09-04 20:55:09 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-24 07:06:00 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Properly do the locking to avoid race conditions with clock unscheduling - 20070904205509-3e2dc-da19900b51af6aedb6547f4f392bef4d1061dec2.gz + * tests/examples/d3d11/d3d11decoder-appsink.cpp: + * tests/examples/d3d11/meson.build: + examples: Add d3d11decoder zero-copy rendering example + This example code demonstrates D3D11 device sharing between + application and GStreamer. Application can access texture + using appsink and it can be rendered on application's window without + any copy operation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2646> -2007-09-01 00:03:24 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-24 22:17:28 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT oups, I did it again... - 20070901000324-4f0f6-3d8b46691ee520537b06c511a5e732f5b812b844.gz + * gst-libs/gst/d3d11/gstd3d11utils.cpp: + * gst-libs/gst/d3d11/gstd3d11utils.h: + d3d11: Add a helper method for GstContext creation + Add gst_d3d11_context_new() method for application to create + GstContext using GstD3D11Device. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2646> -2007-08-31 23:54:28 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-24 01:00:00 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT oups, sorry.. DTMF, not RTP_DTMF for this file... - 20070831235428-4f0f6-00b606bfb4892e4f217c440b611cc794ab0de55a.gz + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.h: + d3d11memory: Add support for wrapping application texture + Add gst_d3d11_allocator_alloc_wrapped() method to support wrapping + application texture using GstD3D11Memory without copy. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2646> -2007-08-31 23:44:13 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-24 01:25:07 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Fixes the deadlock when pausing the dtmfsrc and rtpdtmfsrc. Had to push something on the async queue to release the blocking async_queue_pop(). Thanks to Olivier for the solution. - 20070831234413-4f0f6-793cf35fc43636e7275258cc7063fc068f5efa0a.gz + * gst-libs/gst/d3d11/d3d11-prelude.h: + * gst-libs/gst/d3d11/gstd3d11.h: + * gst-libs/gst/d3d11/gstd3d11_fwd.h: + * gst-libs/gst/d3d11/gstd3d11_private.h: + * gst-libs/gst/d3d11/gstd3d11bufferpool.cpp: + * gst-libs/gst/d3d11/gstd3d11bufferpool.h: + * gst-libs/gst/d3d11/gstd3d11config.h.meson: + * gst-libs/gst/d3d11/gstd3d11device.cpp: + * gst-libs/gst/d3d11/gstd3d11device.h: + * gst-libs/gst/d3d11/gstd3d11format.cpp: + * gst-libs/gst/d3d11/gstd3d11format.h: + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.h: + * gst-libs/gst/d3d11/gstd3d11utils.cpp: + * gst-libs/gst/d3d11/gstd3d11utils.h: + * gst-libs/gst/d3d11/meson.build: + d3d11: Install library headers + Our Direct3D11 abstraction layer has been improved and + it gained good shape from API point of view. + Also, On Windows, GstD3D11 has various advantages over GstGL + in terms of compatibility/stability/feature/performance. + Note that WGL implementation is known to be buggy for some + drivers/vendors/scenario (that's a reason why Google implemented ANGLE). + Moreover, GstGL is not fully optimized for Windows unfortunately. + It's the time to open this interface to application developers + for various optimized processing using our Direct3D11 + infrastructure. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2646> -2007-08-28 22:15:34 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-24 01:21:48 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT ClockID when waiting for buffer is now unscheduled when stopping the task. Various fixes to avoid bugs (thanks to -Wall -Werror). Fixes to allow the merge of the branch. - 20070828221534-4f0f6-b0d6a4fe48c4e2a16b9ff69cb310087c970ce48e.gz + * gst-libs/gst/d3d11/gstd3d11bufferpool.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.h: + * sys/amfcodec/gstamfencoder.cpp: + * sys/d3d11/gstd3d11compositor.cpp: + * sys/d3d11/gstd3d11convert.cpp: + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/gstd3d11deinterlace.cpp: + * sys/d3d11/gstd3d11screencapturesrc.cpp: + * sys/d3d11/gstd3d11testsrc.cpp: + * sys/d3d11/gstd3d11upload.cpp: + * sys/d3d11/gstd3d11videosink.cpp: + * sys/nvcodec/gstnvencoder.cpp: + * sys/qsv/gstqsvallocator_d3d11.cpp: + * sys/qsv/gstqsvdecoder.cpp: + * sys/qsv/gstqsvencoder.cpp: + d3d11: Update gst_d3d11_allocation_params_new() interface + Define GST_D3D11_ALLOCATION_FLAG_DEFAULT (0) value instead of + casting enum type everywhere. And pass D3D11_RESOURCE_MISC_FLAG value + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2646> -2007-08-28 17:15:46 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-27 12:06:50 -0400 U. Artie Eoff <ullysses.a.eoff@intel.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Cleaned up the code a bit, no use of GST_* and return value verification from gst_* - 20070828171546-4f0f6-bdeb4b1b7f99f9464aabe5c43bd4a4d2025262b6.gz + * sys/va/gstvavpp.c: + va: postproc: add scale-method property + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2654> -2007-08-27 19:56:10 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-27 11:54:28 -0400 U. Artie Eoff <ullysses.a.eoff@intel.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Fix overly long lines and tabs - 20070827195610-3e2dc-396a3fa01e16f184e4109c71fe2deb6e516bdf0d.gz + * sys/va/gstvafilter.c: + * sys/va/gstvafilter.h: + * sys/va/gstvavpp.c: + va: filter/postproc: move unconditional props to vavpp + Only conditional/dynamic properties should be installed/handled + by vafilter. Thus, move and install the unconditional/static + properties in vavpp. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2654> -2007-08-27 19:26:18 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-23 11:39:57 -0400 U. Artie Eoff <ullysses.a.eoff@intel.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT untabbified dtmfsrc - 20070827192618-4f0f6-77d68070464f1b5f9a46cb6eec2d922340143c04.gz + * sys/va/gstvacompositor.c: + * sys/va/gstvafilter.c: + * sys/va/gstvafilter.h: + va: compositor/filter: use scale method setter + Use the filter's scale method member instead of the sample's member. + Removes the filter_flags member from the composite sample. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2654> -2007-08-27 17:24:24 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-23 11:11:16 -0400 U. Artie Eoff <ullysses.a.eoff@intel.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Fix RTP timestamps by sending a new_segment event to the payloader - 20070827172424-4f0f6-d20907e3d436d50bfe74eb4fc3d2d6d7b6b6dbc5.gz + * sys/va/gstvafilter.c: + * sys/va/gstvafilter.h: + va: filter: add scale method field and setter + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2654> -2007-08-27 17:23:39 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-01-21 21:33:52 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Better handling of packets, we send the same duration for all packets to avoid huge packets when min duration defines are modified. - 20070827172339-4f0f6-cc93304437ea376fff6458c74c46c19f6920d329.gz + * sys/va/gstvabasedec.h: + * sys/va/gstvajpegdec.c: + * sys/va/gstvajpegdec.h: + * sys/va/gstvaprofile.c: + * sys/va/meson.build: + * sys/va/plugin.c: + va: Add vajpegdec element. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1575> -2007-08-27 17:23:22 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-24 19:42:36 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Changing minimum values to work better on some gateways - 20070827172322-4f0f6-5bf2bffa59a8244538dced795fa7d7649452ca91.gz + * gst-libs/gst/va/gstva.h: + * gst-libs/gst/va/gstvaallocator.c: + * gst-libs/gst/va/gstvaallocator.h: + * sys/va/gstvabasedec.c: + * sys/va/gstvabasedec.h: + va: allocator: Add hack for no fourcc when surface creation. + This patch adds general mechanism for handling specific hacks. In this + case for jpeg decoder in i965 driver, which cannot create surfaces + with fourcc specified. + From jpeg decoder to the allocator, which creates the surfaces, + there's a non-simple path: basedec pseudo-class adds a hacks guint32 + which will be set by actual elements (vajpegdec, in this case) and + basedec will always set the hack to the allocator when the allocator + is instantiated. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1575> + +2022-06-24 19:54:51 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * gst-libs/gst/va/gstvavideoformat.c: + va: Add RGBP format definition. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1575> -2007-08-22 20:16:53 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-04-28 13:16:03 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT The DTMF tone generator now respects the volume argument passed in the event - 20070822201653-4f0f6-8b7ff874006e11f5a74d0fd91e5a9a43cd082ada.gz + * sys/va/gstvacaps.c: + va: caps: Add jpeg fields in coded caps. + Given the supported rt formats in a profile/entrypoint config it's + possible to know the supported JPEG colorspace and subsampling. This + patch adds this information in coded caps to a safer autoplugging + after jpegparser. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1575> -2007-08-22 18:01:33 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-01-17 15:43:47 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/dtmf/gstdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT don't know why I did that... - 20070822180133-4f0f6-6a7382f6c7d3630f91da384e1904763c7ea6fa1a.gz + * sys/va/gstjpegdecoder.c: + * sys/va/gstjpegdecoder.h: + * sys/va/meson.build: + va: Add jpegdecoder base class. + This base class is intented for hardware accelerated decoders, but since + only VA uses it, it will be kept internally in va plugin. + It follows the same logic as the others video decoders in the library but. + as JPEG are independet images, there's no need to handle a DBP so no need + of a picture object. Instead a scan object is added with all the structures + required to decode the image (huffman and quant tables, mcus, etc.). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1575> -2007-08-22 17:55:33 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-27 12:36:29 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Ported the event queue work from dtmfsrc to rtpdtmfsrc - Added a queue based system for the rtpdtmfsrc. Now it waits for start/stop messages on the queue, and makes sure that the minimum duty cycle (120ms) is respected between each - tone, including inter-digit silence. - 20070822175533-4f0f6-f27414c406f1f7b00c9a9084a988cf3a7930fe5c.gz + * sys/va/meson.build: + va: build: Remove duplicated source. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1575> -2007-08-22 17:54:44 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-27 19:58:58 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT ouch, printing with arguments but without %s.. that made it segfault a few times... - 20070822175444-4f0f6-445ea6ce7a9668d04cf999af772a504ec74fb67a.gz + * sys/nvcodec/gstcudamemorycopy.c: + cudamemorycopy: Make sure writable caps before removing fields + The caps to be modified may not be writable when D3D11/GL/NVMM + are all disabled. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2664> -2007-08-22 17:51:26 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-25 19:50:10 +0100 Tim-Philipp Müller <tim@centricular.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Moved the timestamp from the event to dtmfsrc structure since we have only one event at a time, so let's keep it stored in the dtmfsrc struct - 20070822175126-4f0f6-53bcda2bd8ae8c56d29e62e69ac19a30e08ad350.gz + * tests/check/meson.build: + tests: skip unit tests for dependency-less elements that have been disabled + Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1136 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2660> -2007-08-20 20:38:26 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-23 14:31:10 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Added a queue based system for the dtmfsrc. Now it waits for start/stop messages on the queue, and makes sure that the minimum duty cycle (120ms) is respected between each tone, including inter-digit silence. - 20070820203826-4f0f6-750a22b612a5e495e767666934465c34fe32074b.gz + * gst-libs/gst/va/gstvaallocator.c: + va: allocator: Use always lseek to get dmabuf size. + Gallium drivers historically have reported strange dmabuf sizes, from always + zero to the whole frame (multiple fds). The simplest solution is to use lseek + SEEK_END to get the prime descriptor size. + Also the allocator raises a warning if both values differ in order to report + it to driver. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2574> -2007-08-20 18:48:52 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-08 09:02:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * gst/dtmf/Makefile.am: - * gst/dtmf/gstdtmf.c: - * gst/dtmf/gstdtmfsrc.c: - * gst/dtmf/gstdtmfsrc.h: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Added dtmfsrc, a DTMF Tone Generator, and made it part of the 'dtmf' plugin. - 20070820184852-4f0f6-a0d85e67708290aebafa89ab79d3cedd5815b620.gz + * gst-libs/gst/va/gstvaallocator.c: + va: allocator: Fix translation of VADRMPRIMESurfaceDescriptor + VADRMPRIMESurfaceDescriptor structure describes the offsets from the + point of view of the specific handle (DMABuf). While GstVideoInfo + (and the meta) describes offsets from the point of the view of the + GstBuffer, an aggregate of all the GstMemory (1 per handle). + This changes combined with Mesa Fix(https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16813) + fixes decoding failure with AMD driver. + Fixes #1223 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2574> -2007-08-20 18:48:00 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-06-23 21:43:11 +0900 Seungha Yang <seungha@centricular.com> - * gst/dtmf/.git-darcs-dir: - * gst/dtmf/Makefile.am: - * gst/dtmf/gstrtpdtmfsrc.c: - * gst/dtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Moved rtpdtmf to dtmf directory - 20070820184800-4f0f6-fa33ea974510161de8c9951c39087af3613b65a4.gz + * gst-libs/gst/d3d11/gstd3d11.h: + * gst-libs/gst/d3d11/gstd3d11stagingbufferpool.cpp: + * gst-libs/gst/d3d11/gstd3d11stagingbufferpool.h: + * gst-libs/gst/d3d11/meson.build: + * sys/amfcodec/gstamfencoder.cpp: + * sys/d3d11/gstd3d11compositor.cpp: + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/gstd3d11download.cpp: + * sys/d3d11/gstd3d11screencapturesrc.cpp: + * sys/d3d11/gstd3d11testsrc.cpp: + * sys/d3d11/gstd3d11upload.cpp: + * sys/d3d11/gstd3d11videosink.cpp: + * sys/qsv/gstqsvallocator_d3d11.cpp: + * sys/qsv/gstqsvencoder.cpp: + d3d11: Revert staging buffer pool implementation + The staging buffer pool implementation was added to improve + throughput performance since we can avoid per-frame + CPU copy operation via staging texture but it turned out that + we can not make it thread safe. See + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1182 + Reverting the staging texture implementation as it does not show + any visible value. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2651> + +2022-06-23 21:35:23 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvdecoder.cpp: + qsvdecoder: Fix system memory alignment + Do right padding, not left + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2651> -2007-07-12 19:57:15 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-23 21:41:24 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - * gst/rtpdtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Send all packet from the streaming thread, including the last one - 20070712195715-3e2dc-6848c70a7f0137c91fa882a8efb6dbf83891ae13.gz + * sys/d3d11/gstd3d11decoder.cpp: + d3d11decoder: Fix texture download + Stride applied to src/dst was reversed + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2651> -2007-07-12 19:55:28 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-16 17:02:43 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Put non-zero duration in first packet and put a minimum duration of 50ms - 20070712195528-3e2dc-d46edeaab84fb55e74842bdcf4f8792dfcdb0457.gz + * gst/jpegformat/gstjpegparse.c: + jpegparse: Add YUV440 sampling support. + Found some samples with this sampling, so in order to support it, + JPEG2000 header cannot be used anymore, a this patch also adds the + enums for each supported colorspace and sampling, avoiding hacks. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2641> -2007-07-12 16:23:28 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-16 16:33:14 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Fix RTP timestamp on dtmf packets - 20070712162328-3e2dc-98c1303f4a52b891ce59bf88e07d29f4e2dfc974.gz + * gst-libs/gst/va/gstvaallocator.c: + * sys/va/gstvafilter.c: + va: Use driver implementation macro rather than function. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2642> -2007-07-11 15:52:02 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-18 10:36:53 +0800 He Junyan <junyan.he@intel.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Only set marker on very first packet of an event - 20070711155202-3e2dc-f7ea3abd2cb0ca2937ea4508e6e301baaa6e2154.gz + * gst/videoparsers/gsth265parse.c: + h265parse: Fix uninitialized width and height when update src caps. + The commit b90d0274 introduces uninitialized width and height when we + consider to change the "pixel-aspect-ratio" for some interlaced stream. + We need to check the resolution in the src caps, and if no resolution + info found, there is no need to consider the aspect ratio. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2630> -2007-07-11 15:51:57 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-21 20:04:15 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Send on packet start time - 20070711155157-3e2dc-ee0e9fc13d35296593005267a2417dd65e790d29.gz + * sys/d3d11/gstd3d11deinterlace.cpp: + * sys/d3d11/gstd3d11testsrc.cpp: + * sys/d3d11/gstd3d11window.cpp: + d3d11: Fix some typos + Fix up spelling and d3d11testsrc class meta. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2644> -2007-07-11 15:50:56 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-18 20:14:22 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT RTP timestamp is the time of the beginning of the dtmf event - 20070711155056-3e2dc-cb5cda73fbf7df1c545cb0321b0e339914c5897f.gz + * sys/d3d11/gstd3d11compositor.cpp: + * sys/d3d11/gstd3d11compositor.h: + * sys/d3d11/gstd3d11compositorbin.cpp: + * sys/d3d11/gstd3d11compositorbin.h: + * sys/d3d11/meson.build: + * sys/d3d11/plugin.cpp: + d3d11compositor: Performance optimization + Removing glvideomixer-like nuance (it was initially referenced) + and rewriting element since it's not an optimal design at all + from performance point of view. + * Remove wrapper bin (and internal conversion/upload/download elements) + which will waste CPU/GPU resources. Conversion/blending can be done by the + d3d11compositor element at once. + * Add support YUV blending without RGB conversion. + The RGB <-> YUV conversion is completely unnecessary since YUV textures + support blending as well. + * Remove complicated blending operation properties since it's hard + to use from application point of view. Instead, adding "operator" property + like what compositor element does. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2631> -2007-04-24 20:02:52 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-18 20:40:40 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT 80 column is enough for everyone - 20070424200252-3e2dc-d1bc17266afff2599129a25d44338062372f7ea3.gz + * sys/d3d11/gstd3d11converter.cpp: + d3d11converter: Fix alpha factor update + converter should set entire constant buffer values since it's mapped + with write-discard flag + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2631> -2007-04-24 19:31:55 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-02 14:22:21 +0200 Robert Mader <robert.mader@collabora.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - * gst/rtpdtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Add redundancy and interval properties to rtpdtmfsrc (patch by SP GLE <spglegle@yahoo.fr>) - 20070424193155-3e2dc-66688001e7b529c46f108633cd9520347c3c8c3e.gz + * docs/plugins/gst_plugins_cache.json: + * ext/wayland/gstwaylandsink.c: + * ext/wayland/gstwaylandsink.h: + * gst-libs/gst/wayland/gstwlwindow.c: + * gst-libs/gst/wayland/gstwlwindow.h: + gstwaylandsink: Add rotate-method property + Similar to and inspired by glimagesink and gtkglsink. + Using the Wayland buffer transform API allows to offload + rotate operations to the Wayland compositor. This can have + several advantages: + - The Wayland compositor may be able to use hardware plane + capabilities to do the rotation. + - In case of pre-rotated content on rotated outputs the + rotations may equal out, potentially allowing the + compositor to use hardware planes even if they don't + support rotate operations. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2543> -2007-05-04 19:52:51 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-18 04:05:53 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Only send dtmf if the method is unspecified or is 1 - 20070504195251-3e2dc-b95b4b8e8dad87962cf39ec2ee67b6f1b619e9bd.gz + * sys/d3d11/gstd3d11decoder.h: + d3d11decoder: Check 16K resolution support + 16K decoding is supported by some GPUs + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2629> -2007-03-08 22:35:59 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-17 05:11:08 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Make documentation consistent with itself - 20070308223559-3e2dc-cc20fe571370bc51bf963cc3df1b8ab4a3ddc20b.gz + * sys/d3d11/gstd3d11av1dec.cpp: + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/gstd3d11decoder.h: + * sys/d3d11/gstd3d11h264dec.cpp: + * sys/d3d11/gstd3d11h265dec.cpp: + * sys/d3d11/gstd3d11mpeg2dec.cpp: + * sys/d3d11/gstd3d11vp8dec.cpp: + * sys/d3d11/gstd3d11vp9dec.cpp: + d3d11decoder: Add support for non-zero crop-{x,y} position + AVC and HEVC define crop rectangle and the x/y coordinates might + not be zero. This commit will address the non-zero x/y offset coordinates + via GstVideoCropMeta if downstream supports the meta and d3d11 memory. + Otherwise decoder will copy decoded texture into output frame. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2624> -2007-04-12 20:04:35 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-17 02:45:51 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - * gst/rtpdtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Use segment to calculate dtmfsrc rtp timestamp - 20070412200435-3e2dc-b5cc26b12b6e8b89f131fd27f0e4627746e85697.gz + * sys/d3d11/gstd3d11convert.cpp: + * sys/d3d11/gstd3d11converter.cpp: + d3d11converter: Implement filling border color + Equivalent to GST_VIDEO_CONVERTER_OPT_BORDER_ARGB and + GST_VIDEO_CONVERTER_OPT_FILL_BORDER options of GstVideoConverter + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2622> -2007-04-02 12:46:35 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-06-16 02:18:43 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Clean-up and refactorize dtmfsrc code - 20070402124635-65035-3d13244461c1dd1fcc96b74124ad7a74d2ff0144.gz + * sys/d3d11/gstd3d11compositor.cpp: + * sys/d3d11/gstd3d11convert.cpp: + * sys/d3d11/gstd3d11converter.cpp: + * sys/d3d11/gstd3d11converter.h: + * sys/d3d11/gstd3d11testsrc.cpp: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window.h: + * sys/d3d11/gstd3d11window_dummy.cpp: + * sys/d3d11/plugin.cpp: + d3d11converter: Objectify converter + ... and set conversion options via property + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2622> -2007-03-30 15:43:03 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-16 00:52:16 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Ooops, little typo - 20070330154303-3e2dc-9f6edcde24d30caea8ea876b24a3a680d40b2ea1.gz + * sys/d3d11/gstd3d11shader.cpp: + * sys/d3d11/gstd3d11shader.h: + d3d11shader: Remove GstD3D11Quad helper object + It's not very generic to be used for various scenario. Use native D3D11 + APIs directly instead. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2622> -2007-03-30 00:17:00 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-16 00:50:12 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - * gst/rtpdtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Make it generate the proper rtp timestamps in sync with the live source - 20070330001700-3e2dc-bbf954e4edec0615c4eee603fbc6ab8a7d89436f.gz + * sys/d3d11/gstd3d11compositor.cpp: + d3d11compositor: Don't use GstD3D11Quad + The helper object will be removed + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2622> -2007-03-29 11:42:57 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-06-15 23:46:27 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Increment the ts after setting the buffer's ts - 20070329114257-65035-c8686ab4ce20b1f36f3dac120485ade5cd90aac9.gz + * sys/d3d11/gstd3d11overlaycompositor.cpp: + d3d11overlaycompositor: Fix HLSL compiler warning + warning X3206: 'Sample': implicit truncation of vector type + And don't use GstD3D11Quad since it will result in redundant API calls + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2622> -2007-03-29 10:39:46 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-02-01 23:46:43 +0100 Mathieu Duponchelle <mathieu@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Calculate the rtp ts before gst ts get incremented - 20070329103946-65035-f74e3a0140c57e941444bb837d6053ad1c3cf567.gz + * docs/plugins/gst_plugins_cache.json: + * ext/closedcaption/gstcccombiner.c: + * ext/closedcaption/gstcccombiner.h: + cccombiner: expose output-padding property + When schedule=true and output-padding=false, cccombiner will not + inject padding in the output closed caption meta stream. + The property has no effect when schedule=false. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1621> -2007-03-29 10:39:04 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-06-15 15:06:20 -0400 Olivier Crête <olivier.crete@collabora.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Some code-cleanup - 20070329103904-65035-db08cc7c3098b60a556d3809de912cd0e1a545c1.gz + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: Limit sink query to sink pads + This allows the reception of streams that don't exactly match + the codec preferences. In particular, the ssrc in the codec preferences + is local sender SSRC, the other side is expected to send a different SSRC. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2615> -2007-03-29 10:38:24 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-06-08 19:18:48 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Initialize the GstSegment at the right time - 20070329103824-65035-9ab3a0a03c5f9329cd4625ae6567c2c1fd4a73d8.gz + * gst/videoparsers/gsth265parse.c: + avviddec, video.c, h265parse: Workaround for broken field-based interlaced encoders + Some encoders (e.g. Makito) have H265 field-based interlacing, but then + also specify an 1:2 pixel aspect ratio. That makes it kind-of work with + decoders that don't properly support field-based decoding, but makes us + end up with the wrong aspect ratio if we implement everything properly. + As a workaround, detect 1:2 pixel aspect ratio for field-based + interlacing, and check if making that 1:1 would make the new display + aspect ratio common. In that case, we override it with 1:1. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2577> -2007-03-26 10:57:12 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2021-05-19 16:03:22 +0200 Stéphane Cerveau <scerveau@collabora.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Call set_caps when we have all the params - 20070326105712-65035-3e3dfce0b50d61eafda846bee0a6d66c3541c6ed.gz + * ext/srt/gstsrtsrc.c: + * ext/srt/gstsrtsrc.h: + srtsrc: add "keep-listening" property to avoid EOS on disconnect + The property 'keep-listening' avoids EOS + when the remote client disconnects. + It can be useful to a keep a pipeline alive + when the srt connection drops remotely. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/967> -2007-03-23 16:29:22 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2021-05-19 16:00:13 +0200 Stéphane Cerveau <scerveau@collabora.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Set caps on the buffer before pushing it - 20070323162922-65035-9e4be5449c79c0a459965ee07adb4a8143c4c1d5.gz + * ext/srt/gstsrtsrc.c: + srtsrc: remove dead code + Remove code useless since + 132e3a1af9deb1d2cdf84d22b954967207bcc03a + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/967> -2007-03-14 17:17:56 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-05-19 05:24:08 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Request for stream lock when generating DTMF packets - 20070314171756-65035-0b497dfac203ff4f579525485d5804e5f5093b3f.gz + * sys/qsv/gstqsvh264dec.cpp: + qsvh264dec: Use newly added avcC data parsing API + Use gst_h264_parser_parse_decoder_config_record() method to parse + codec_data. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2449> -2007-03-07 11:41:09 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-05-19 05:06:04 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Correct caps printout - 20070307114109-65035-124202884918a9c8a803080d6967234539d24b97.gz + * gst/videoparsers/gsth264parse.c: + h264parse: Use newly added avcC data parsing API + Use gst_h264_parser_parse_decoder_config_record() method to parse + codec_data. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2449> -2007-02-16 12:06:06 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-05-19 04:49:36 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Add doc-section comments - 20070216120606-65035-6e7d28721dc0872f3f55ba7ccd4fed3d66f8175f.gz + * gst-libs/gst/codecs/gsth264decoder.c: + h264decoder: Use newly added avcC data parsing API + Use gst_h264_parser_parse_decoder_config_record() method to parse + codec_data. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2449> -2007-02-15 13:48:53 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-05-19 04:25:38 +0900 Seungha Yang <seungha@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - * gst/rtpdtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Add copyrights - 20070215134853-65035-50fe5f8e999ae86a1e3ba0dbdece4911eb9dcca0.gz + * gst-libs/gst/codecparsers/gsth264parser.c: + * gst-libs/gst/codecparsers/gsth264parser.h: + * tests/check/libs/h264parser.c: + h264parser: Add an API for AVCDecoderConfigurationRecord parsing + Add a method for AVC configuration date parsing + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2449> -2007-02-15 13:35:36 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-06-15 10:07:26 +0300 Sebastian Dröge <sebastian@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT No need to handle downstream events - 20070215133536-65035-648b791d404bf06900bd2698d925117c89743db9.gz + * sys/decklink/gstdecklink.cpp: + decklinkvideosink: Fix selection of > PAL widescreen modes + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2601> -2007-02-15 12:26:55 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-06-07 16:30:36 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Attempt to correct event handling - 20070215122655-65035-47070d9a28c08d9353b04d2d9301e29b7ee72b83.gz + * sys/va/gstvabasedec.c: + va: basedec: Select output format with the used chroma in decoder. + Currently, video format is decided with downstream caps intersection, + but that's not correct since chroma is not considered. The video + decoders have to decide the output format given the used chroma, not + by the downstream caps negotiation. + This patch changes that. Still, caps feature is selected by caps + negotiation, then, with the preferred caps feature, the output format + is search within that caps feature. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2569> -2007-02-15 10:26:29 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-05-23 11:41:17 +1000 Matthew Waters <matthew@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - MOVED FROM GST-P-FARSIGHT Use pause_task instead of stop_task to avoid any possible deadlocks - 20070215102629-65035-a48c773661e385a91e022e0ac1da0862c4206f85.gz + * docs/plugins/gst_plugins_cache.json: + * ext/vulkan/gstvulkan.c: + * ext/vulkan/meson.build: + * ext/vulkan/vkoverlaycompositor.c: + * ext/vulkan/vkoverlaycompositor.h: + vulkan: add vulkan overlay compositor element + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2470> -2007-02-15 10:10:30 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-05-23 11:26:24 +1000 Matthew Waters <matthew@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - * gst/rtpdtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Put correct seq and timestamps on the packets - 20070215101030-65035-7146a3c4a8d0feab513d13a207b2cdc5de311f03.gz + * gst-libs/gst/vulkan/gstvkfullscreenquad.c: + * gst-libs/gst/vulkan/gstvkfullscreenquad.h: + vkfullscreenquad: add support for disabling clearing + e.g. if drawing over the top of an existing image, we don'w want to + clear. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2470> -2007-02-14 13:55:01 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-05-23 11:25:03 +1000 Matthew Waters <matthew@centricular.com> - * gst/rtpdtmf/gstrtpdtmfsrc.c: - * gst/rtpdtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Fix the copyright notice - 20070214135501-65035-e90753b1f6525f7b9c0ac2eb7e40cef7ca673e68.gz + * gst-libs/gst/vulkan/gstvkfullscreenquad.c: + * gst-libs/gst/vulkan/gstvkfullscreenquad.h: + vkfullscreenquad: support setting blend operations + Allows e.g. blending with an existing image. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2470> -2007-02-14 13:13:52 +0000 zeeshan.ali@nokia.com <zeeshan.ali@nokia.com> +2022-05-23 11:24:04 +1000 Matthew Waters <matthew@centricular.com> - * gst/rtpdtmf/.git-darcs-dir: - * gst/rtpdtmf/Makefile.am: - * gst/rtpdtmf/gstrtpdtmfsrc.c: - * gst/rtpdtmf/gstrtpdtmfsrc.h: - MOVED FROM GST-P-FARSIGHT Add RTP DTMF event packet generator element and test app for it - 20070214131352-65035-3c14a1047c3cd6696f3a716a62b21d3f4b9da62b.gz + * gst-libs/gst/vulkan/gstvkfullscreenquad.c: + vkfullscreenaud: create the vulkan command pool upfront + Allows outside to reuse the same command buffer pool much more easily. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2470> -2009-01-30 09:03:42 +0100 Edward Hervey <bilboed@bilboed.com> +2022-05-17 17:07:49 +1000 Matthew Waters <matthew@centricular.com> - * autogen.sh: - autogen.sh: actually setting up a symbolic link for the pre-commit hook + * gst-libs/gst/vulkan/gstvkbuffermemory.h: + * gst-libs/gst/vulkan/gstvkbufferpool.h: + * gst-libs/gst/vulkan/gstvkcommandbuffer.h: + * gst-libs/gst/vulkan/gstvkdescriptorpool.h: + * gst-libs/gst/vulkan/gstvkdescriptorset.h: + * gst-libs/gst/vulkan/gstvkfence.h: + * gst-libs/gst/vulkan/gstvkimagebufferpool.h: + * gst-libs/gst/vulkan/gstvkimagememory.h: + * gst-libs/gst/vulkan/gstvkmemory.h: + * gst-libs/gst/vulkan/gstvkvideofilter.h: + vulkan: add some missing GAutoPtr definitions + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2470> -2009-02-21 17:45:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-05-17 16:32:09 +1000 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - mxfdemux: Add read-only property to get the structural metadata + * gst-libs/gst/vulkan/gstvkimageview.h: + vulkan: remove unneeded #ifdef for GAutoPtr + Not necessary anymore as we depend on a new enough Glib version + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2470> -2009-02-21 17:40:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-05-17 13:22:33 +1000 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfmpeg.c: - mxfdemux: Add MPEG video bitrate to the tags if available + * ext/vulkan/gstvulkanelements.h: + * ext/vulkan/vkcolorconvert.h: + * ext/vulkan/vkdeviceprovider.h: + * ext/vulkan/vkdownload.h: + * ext/vulkan/vkimageidentity.h: + * ext/vulkan/vkshaderspv.h: + * ext/vulkan/vksink.h: + * ext/vulkan/vkupload.h: + * ext/vulkan/vkviewconvert.h: + vulkan: move element register definition to relevant element headers + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2470> -2009-02-21 17:38:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-06-13 03:29:11 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/Makefile.am: - * gst/mxf/mxf.c: - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfquark.c: - * gst/mxf/mxfquark.h: - * gst/mxf/mxftypes.h: - mxfdemux: Post structural metadata tree as tag on the bus - This will later be used to keep the structural metadata when - remuxing an MXF file and can also be used in Pitivi for example - to know the file structure and to select what should be used - and played. + * sys/d3d11/gstd3d11converter.cpp: + * sys/d3d11/gstd3d11pluginutils.cpp: + * sys/d3d11/gstd3d11pluginutils.h: + d3d11converter: Add support for colorimetry conversion + Handle color primaries and gamma functions. + HDR <-> SDR conversion (tone mapping) should be implemented as well + but not a part of this patch. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2581> -2009-02-21 16:09:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-06-14 03:15:42 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfaes-bwf.c: - mxfdemux: Fix calculation of AES3 bitrate tag + * sys/d3d11/gstd3d11convert.cpp: + d3d11convert: Don't passthrough if colorimetry conversion is required + Different input/output colorimetry requires conversion + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2581> -2009-02-21 16:05:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-06-14 00:24:41 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfparse.c: - * gst/mxf/mxfparse.h: - mxfdemux: Add helper function to convert MXFraction to gdouble and use it + * sys/d3d11/gstd3d11pluginutils.cpp: + d3d11window: Use SDR colorspace whenever possible + PQ uses completely different light level scale + and it should not be used for SDR bt2020. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2581> -2009-02-21 16:00:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-06-06 03:41:52 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - mxfdemux: Only store the main descriptor in source packages - For the tracks we still resolve the descriptors but the - source package only contains the descriptor it really references - instead of all subdescriptors of multiple descriptors. - This makes it easier later to serialize the structural metadata - again. + * sys/d3d11/gstd3d11converter.cpp: + * sys/d3d11/gstd3d11converter.h: + * sys/d3d11/gstd3d11pluginutils.cpp: + * sys/d3d11/gstd3d11pluginutils.h: + d3d11converter: Rewrite conversion object + Rewriting GstD3D11Converter (equivalent to GstVideoConverter) + to optimize some conversion path and clean up. + * Extract YUV <-> RGB conversion matrix building method to + utils. It will be used by other implementation + * Use calculated offset values for YCbCr <-> YPbPr conversion + instead of hardcoded values + * Handle color range adjustment + * Move transform matrix building helper function to utils. + The method will be used by other elements + * Use single constant buffer. Multiple constatne buffer for + conversion pipeline is almost pointless + * Remove lots of duplicated HLSL code and split pixel shader + code path into sampling -> colorspace conversion -> + shader output packing + * Avoid floating point precision error around UV coordinates + * Optimize RGB -> YUV conversion path + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2581> -2009-02-17 17:37:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-05-24 10:40:26 +0200 Benjamin Gaignard <benjamin.gaignard@collabora.com> - * gst/mxf/mxfdemux.c: - mxfdemux: Set free'd memory to NULL to prevent a double free later in some cases + * sys/v4l2codecs/gstv4l2format.c: + * sys/v4l2codecs/gstv4l2format.h: + * sys/v4l2codecs/linux/videodev2.h: + v4l2codecs: Add P010 pixel format + Copy V4L2_PIX_FMT_P010 define from linux header. + V4L2_PIX_FMT_P010 is the little endian definition of P010 so map + it GST_VIDEO_FORMAT_P010_10LE. + Add it v4l2 default video formats to allows v4l2 decoders to + enumerate and use it. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2590> -2009-02-15 09:51:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-06 12:56:30 +0100 Tim-Philipp Müller <tim@centricular.com> + * ext/gs/gstgscommon.cpp: + * gst/mpegtsdemux/mpegtsbase.c: * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfmetadata.c: - mxfdemux: Don't use generic metadata parsers for unknown metadata, the results are useless anyway - -2009-02-19 11:36:45 +0000 Zaheer Merali <zaheerabbas@merali.org> - - * gst/mpegdemux/flumpegdemux.c: - * gst/mpegdemux/flutspatinfo.c: - * gst/mpegdemux/flutspatinfo.h: - * gst/mpegdemux/flutspmtinfo.c: - * gst/mpegdemux/flutspmtinfo.h: - * gst/mpegdemux/flutspmtstreaminfo.c: - * gst/mpegdemux/flutspmtstreaminfo.h: - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - mpegtsdemux: s/fluts/mpegts - Change all definitions from fluts to mpegts. - -2009-02-10 18:58:40 +0000 Olivier Crête <olivier.crete@collabora.co.uk> - - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - Add doc infrastructure to valve - -2009-02-10 18:52:54 +0000 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/valve/gstvalve.c: - * gst/valve/gstvalve.h: - Document the GstValve - -2009-02-10 18:03:26 +0000 Olivier Crête <olivier.crete@collabora.co.uk> - - * configure.ac: - * docs/plugins/inspect/plugin-valve.xml: - Moved valve from gst-plugins-farsight to -bad - -2009-02-10 17:57:16 +0000 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/valve/gstvalve.c: - Rename fsvalve to valve - -2009-02-10 17:55:47 +0000 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/valve/gstvalve.c: - * gst/valve/gstvalve.h: - Re-indent valve in gst style - -2008-12-13 00:31:45 -0500 Olivier Crête <olivier.crete@collabora.co.uk> - - * gst/valve/gstvalve.c: - MOVED FROM GST-P-FARSIGHT Ignore errors if dropping is set to true + * meson.build: + * sys/d3d11/gstd3d11deinterlace.cpp: + * sys/va/vacompat.h: + Bump GLib requirement to >= 2.62 + Can't require 2.64 yet because of + https://gitlab.freedesktop.org/gstreamer/cerbero/-/issues/323 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2568> -2008-12-11 17:54:18 -0500 Olivier Crête <olivier.crete@collabora.co.uk> +2022-06-08 10:42:18 +0300 Sebastian Dröge <sebastian@centricular.com> - * gst/valve/.git-darcs-dir: - MOVED FROM GST-P-FARSIGHT Remove .git-darcs-dir files + * docs/plugins/gst_plugins_cache.json: + * sys/decklink/gstdecklink.cpp: + * sys/decklink/gstdecklink.h: + decklink: Add support for 4K DCI, 8K/UHD2 and 8K DCI modes + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2570> -2008-12-10 17:00:33 -0500 Olivier Crête <olivier.crete@collabora.co.uk> +2022-06-02 06:06:48 +0900 Seungha Yang <seungha@centricular.com> - * gst/valve/gstvalve.c: - MOVED FROM GST-P-FARSIGHT Add getcaps proxying to the valve + * sys/qsv/gstqsvallocator_d3d11.cpp: + qsvencoder: Do not copy if input is D3D11 texture + In case that input is D3D11 texture, QSV seems to work regardless + of the alignment. Actually the alignment requirement seems to make + only sense for system memory. + Other Intel GPU dependent implementations (new VA encoder, and MediaFoundation) + do not require such alignment nor other vendor specific ones (NVENC and AMF) + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2540> -2008-08-20 14:11:02 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-06-09 23:19:24 +0900 Seungha Yang <seungha@centricular.com> - * gst/valve/gstvalve.c: - * gst/valve/gstvalve.h: - MOVED FROM GST-P-FARSIGHT Rebase valve onto gstelement instead of basetransform + * sys/d3d11/gstd3d11decoder.cpp: + d3d11decoder: Fix for alternate interlacing signalling + Don't set d3d11+interlace caps feature. None of d3d11 elements + support it + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2579> -2008-08-19 18:49:51 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-06-04 22:33:34 +0900 Seungha Yang <seungha@centricular.com> - * gst/valve/gstvalve.c: - MOVED FROM GST-P-FARSIGHT Revert "Fix refcounting issues in prepare_output_buffer" - This reverts commit 65dd460f0a3a9c4882e638c86208f74ef62c3460. + * sys/d3d11/gstd3d11testsrc.cpp: + * sys/d3d11/gstd3d11testsrc.h: + * sys/d3d11/meson.build: + * sys/d3d11/plugin.cpp: + d3d11: Add d3d11testsrc element + Adding Direct3D11 based videotestsrc element + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2554> -2008-08-05 11:30:57 +0000 sjoerd@luon.net <sjoerd@luon.net> +2022-06-08 16:38:00 +0200 Mathieu Duponchelle <mathieu@centricular.com> - * gst/valve/gstvalve.c: - MOVED FROM GST-P-FARSIGHT Fix refcounting issues in prepare_output_buffer - 20080805113057-be0f2-9dc270781f0a0f21c616ed11dbd1f198fd1b326e.gz + * docs/meson.build: + -bad/docs: be more selective about header files to exclude + A few header files in -bad contain comments that start with the + /** gtk-doc pattern, but should not actually be parsed (and warned + about as such). + Previously, we were using far-reaching wildcard patterns to avoid + parsing those, but this had the unintended side effect of also + excluding legitimate files, and creating confusion when comments + were not parsed from those. + Switch to excluding specific files instead. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2576> -2008-04-09 16:32:21 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-27 05:15:13 +1000 Jan Schmidt <jan@centricular.com> - * gst/valve/gstvalve.c: - MOVED FROM GST-P-FARSIGHT Remove unused dispose method in valve - 20080409163221-3e2dc-92ccb2db874e46e0d92c15520577c1be0e2bc617.gz + * sys/androidmedia/gstamc-constants.h: + * sys/androidmedia/gstamc.c: + * sys/androidmedia/gstamcvideoenc.c: + * sys/androidmedia/gstamcvideoenc.h: + amc: Add H.265 encoder mapping. + Add mime type mapping to enable the use of Android H.265 encoders + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2511> -2007-12-19 20:32:30 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-13 17:21:25 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - * gst/valve/gstvalve.c: - MOVED FROM GST-P-FARSIGHT Dont hold the object lock while calling base alloc function - 20071219203230-3e2dc-6519175d8d81496515b2d9060ac316650560f691.gz + * sys/msdk/gstmsdkdec.c: + * sys/msdk/gstmsdkdec.h: + msdkdec: Decoder should use its own pool when downstream allocator is not recognizable + Msdkdec should use it own pool when the allocation from downstream query + is not any msdk_allocator (i.e. msdk_video_allocator, + msdk_dmabuf_allocator and msdk_system_allocator). Otherwise, when using + pipeline "msdkh264dec ! vah264enc !" to transcode a not 16-bit-aligned + stream (i.e. 1920x1080), the transcoding will fail due to the size + mismatch issue between decoder pool and encoder pool. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2451> -2007-12-19 20:32:18 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-06 10:56:12 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/valve/gstvalve.c: - * gst/valve/gstvalve.h: - MOVED FROM GST-P-FARSIGHT Set the DISCONT flag after dropping buffers - 20071219203218-3e2dc-bc5f03d88ff5837040b9214de016cc142776dfc2.gz + * docs/plugins/gst_plugins_cache.json: + va: Update plugin cache. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2522> -2007-12-19 00:57:39 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-29 13:43:29 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/valve/gstvalve.c: - * gst/valve/gstvalve.h: - MOVED FROM GST-P-FARSIGHT Use do the alloc_buffer function in the valve - 20071219005739-3e2dc-2a0fdfa2f38f03ab4791fe5c4ab85e8790113683.gz + * sys/va/gstvah264enc.c: + vah264enc: Guard logging functions + .. and use spec for rate control rather than static switch. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2522> -2007-11-21 20:08:58 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-30 10:20:11 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/valve/gstvalve.c: - MOVED FROM GST-P-FARSIGHT Only set passthrough to TRUE on newer versions of gst - 20071121200858-3e2dc-b16cdeabbc3c0562c6fc7b11b9b9792c910f569e.gz + * sys/va/gstvabaseenc.c: + * sys/va/gstvah264enc.c: + vah264enc: Support default and none rate control. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2522> -2007-11-21 18:17:29 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-29 12:09:05 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/valve/gstvalve.c: - MOVED FROM GST-P-FARSIGHT Compare minor, not major - 20071121181729-3e2dc-a5997c3b7f5c86966370969714facf8ee242659d.gz + * sys/va/gstvaencoder.c: + * sys/va/gstvaencoder.h: + * sys/va/gstvah264enc.c: + va: encoder: Rate control property. + Fixes: #1241 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2522> -2007-10-26 22:37:49 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-30 11:26:24 +0100 Philippe Normand <philn@igalia.com> - * gst/valve/gstvalve.c: - MOVED FROM GST-P-FARSIGHT Make the valve element work with gst < 0.10.13 - 20071026223749-3e2dc-18f685a4e45fbdce677ac777586876fc719d7222.gz + * docs/plugins/gst_plugins_cache.json: + * ext/webrtc/gstwebrtcbin.c: + * tests/check/elements/webrtcbin.c: + webrtcbin: Add a prepare-data-channel GObject signal + This new signal allows data-channel consumers to configure signal handlers on a + newly created data-channel, before any data or state change has been notified. + The webrtcin unit-tests were refactored to make use of this new signal. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2427> -2007-10-24 22:42:46 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-16 16:43:57 +0100 Philippe Normand <philn@igalia.com> - * gst/valve/Makefile.am: - * gst/valve/gstvalve.c: - MOVED FROM GST-P-FARSIGHT Rename valve to fsvalve - 20071024224246-3e2dc-c54216af2ef0ef3f1a2206d723e87be2a23ab8ed.gz + * ext/webrtc/webrtcdatachannel.c: + webrtcdatachannel: Chain to parent class constructed + And add a debug log statement. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2427> -2007-10-24 22:41:47 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-06-02 10:32:28 -0400 Eric Knapp <emkman99@gmail.com> - * gst/valve/.git-darcs-dir: - * gst/valve/Makefile.am: - * gst/valve/gstvalve.c: - * gst/valve/gstvalve.h: - MOVED FROM GST-P-FARSIGHT Add valve element - 20071024224147-3e2dc-f28ab0c073e283894b65c22c4f44397c897dec01.gz + * docs/plugins/gst_plugins_cache.json: + * sys/decklink/gstdecklink.cpp: + * sys/decklink/gstdecklink.h: + * sys/decklink/gstdecklinkvideosink.cpp: + * sys/decklink/gstdecklinkvideosink.h: + decklinkvideosink: Add 3G-SDI Level A output support + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2544> -2009-02-10 19:20:26 +0000 Olivier Crête <olivier.crete@collabora.co.uk> +2022-06-04 15:05:05 +0800 He Junyan <junyan.he@intel.com> - * gst/siren/gstsirendec.c: - * gst/siren/gstsirenenc.c: - Add some documentation to the siren enc/dec plugins + * gst-libs/gst/codecparsers/gsth264parser.c: + h264parser: Fix memory leaks in parse_user_data_unregistered(). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2551> -2009-02-10 19:20:19 +0000 Olivier Crête <olivier.crete@collabora.co.uk> +2022-06-04 17:23:00 +0200 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> - * gst/siren/gstsiren.h: - * gst/siren/gstsirendec.c: - * gst/siren/gstsirendec.h: - * gst/siren/gstsirenenc.c: - * gst/siren/gstsirenenc.h: - Re-indent the siren stuff to be gst style + * gst/rtmp2/rtmp/rtmpmessage.c: + rtmp2: Fix allocation of GstRtmpMeta + Use the right size. + On 64-bit platforms, `GstMetaInfo` is larger than `GstRtmpMeta`, which + masked this bug. On 32-bit platforms, it causes crashes. Thanks to + @maxatka for discovering this. + Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1721 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2553> -2009-02-10 17:29:05 +0000 Olivier Crête <olivier.crete@collabora.co.uk> +2022-06-02 16:38:55 +0200 Robert Mader <robert.mader@collabora.com> - * configure.ac: - * docs/plugins/inspect/plugin-gstsiren.xml: - Moved siren from gst-p-farsight to -bad + * docs/plugins/gst_plugins_cache.json: + * ext/wayland/gstwaylandsink.c: + gstwaylandsink: Add support for the "render-rectangle" property + We already implement the `set_render_rectangle` videooverlay interface, + thus install the videooverlay property accordingly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2479> -2009-02-10 17:23:38 +0000 Olivier Crête <olivier.crete@collabora.co.uk> +2022-01-04 15:20:41 +0100 Robert Mader <robert.mader@collabora.com> - * gst/siren/Makefile.am: - * gst/siren/gstrtpsirendepay.c: - * gst/siren/gstrtpsirendepay.h: - * gst/siren/gstrtpsirenpay.c: - * gst/siren/gstrtpsirenpay.h: - * gst/siren/gstsiren.c: - Move siren rtp pay/depay to good + * docs/plugins/gst_plugins_cache.json: + * ext/wayland/gstwaylandsink.c: + * ext/wayland/gstwaylandsink.h: + * ext/wayland/meson.build: + * ext/wayland/wldisplay.c: + * ext/wayland/wldisplay.h: + * ext/wayland/wlwindow.c: + * ext/wayland/wlwindow.h: + * gst-libs/gst/wayland/gstwl_fwd.h: + * gst-libs/gst/wayland/gstwlbuffer.c: + * gst-libs/gst/wayland/gstwlbuffer.h: + * gst-libs/gst/wayland/gstwlcontext.c: + * gst-libs/gst/wayland/gstwlcontext.h: + * gst-libs/gst/wayland/gstwldisplay.c: + * gst-libs/gst/wayland/gstwldisplay.h: + * gst-libs/gst/wayland/gstwllinuxdmabuf.c: + * gst-libs/gst/wayland/gstwllinuxdmabuf.h: + * gst-libs/gst/wayland/gstwlshmallocator.c: + * gst-libs/gst/wayland/gstwlshmallocator.h: + * gst-libs/gst/wayland/gstwlvideobufferpool.c: + * gst-libs/gst/wayland/gstwlvideobufferpool.h: + * gst-libs/gst/wayland/gstwlvideoformat.c: + * gst-libs/gst/wayland/gstwlvideoformat.h: + * gst-libs/gst/wayland/gstwlwindow.c: + * gst-libs/gst/wayland/gstwlwindow.h: + * gst-libs/gst/wayland/meson.build: + * gst-libs/gst/wayland/wayland-prelude.h: + * gst-libs/gst/wayland/wayland.c: + * gst-libs/gst/wayland/wayland.h: + * tests/examples/waylandsink/main.c: + * tests/examples/waylandsink/wayland-threads.c: + gstwayland: Move reusable parts of the waylandsink into a library + In preparation for the new element `GstGtkWaylandSink`, move reusable + parts out of `GstWaylandSink` into the already exisiting but very + barebone library. + Notable changes include: + - the `GstWaylandVideo` interface was dropped + - support for `wl-shell` was dropped + - lots of renaming in order to match established naming patterns + - lots of code modernisations, reducing boilerplate + - members were made private wherever possible + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2479> -2008-12-11 17:54:18 -0500 Olivier Crête <olivier.crete@collabora.co.uk> +2022-06-06 00:30:15 +0200 Jan Alexander Steffens (heftig) <heftig@archlinux.org> - * gst/siren/.git-darcs-dir: - MOVED FROM GST-P-FARSIGHT Remove .git-darcs-dir files + * ext/opencv/gstcvtracker.cpp: + * ext/opencv/gstcvtracker.h: + * ext/opencv/meson.build: + opencv: Allow building against 4.6.x + Replace the broken version checks with one modeled after + `GLIB_CHECK_VERSION`. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2557> -2008-10-05 22:03:05 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-05-30 16:31:38 -0400 Olivier Crête <olivier.crete@collabora.com> - * gst/siren/gstsirendec.c: - MOVED FROM GST-P-FARSIGHT Add underscore to make the encoder like the decoder + * ext/webrtc/gstwebrtcbin.c: + * tests/check/elements/webrtcbin.c: + webrtcbin: Reject answers that don't contain the same number of m-line as offer + Otherwise, it segfaults later. Also add test to validate this. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2526> -2008-10-05 22:01:44 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-03-15 12:44:20 +0100 Marc Leeman <m.leeman@televic.com> - * gst/siren/gstsirenenc.c: - MOVED FROM GST-P-FARSIGHT Rename offset to out_offset to make its meaning clearer + * docs/plugins/gst_plugins_cache.json: + * gst/librfb/gstrfb-utils.c: + * gst/librfb/gstrfb-utils.h: + * gst/librfb/gstrfbsrc.c: + * gst/librfb/gstrfbsrc.h: + * gst/librfb/meson.build: + rfbsrc: add uri interface + Adding a uri interface enables plugging in RFB/VNC sources to anything + that makes use of uridecodebin: + gst-play-1.0 rfb://:password@10.40.216.180:5903?shared=1 + Use userinfo to pass user (ignored) and password, other key/value pairs + can be encoded in the query part of the URI (see shared) + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1963> -2008-10-05 22:00:27 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-05-17 00:36:24 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - * gst/siren/gstsirendec.c: - MOVED FROM GST-P-FARSIGHT Check the size of the input buffer, not the output buffer + * gst/videoparsers/gsth264parse.c: + * gst/videoparsers/gstvideoparseutils.c: + * gst/videoparsers/gstvideoparseutils.h: + videoparse: rename from _free to _clear + The function does not free the structure but the data + contained within. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1458> -2008-09-16 15:40:04 -0400 Olivier Crête <olivier.crete@collabora.co.uk> +2022-05-16 14:21:53 +0200 Andoni Morales Alastruey <ylatuya@gmail.com> - * gst/siren/gstsirendec.c: - MOVED FROM GST-P-FARSIGHT Preserve timestamp + * gst-libs/gst/codecparsers/gsth264parser.c: + h264parse: fix leak in user data unregistered + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1458> -2008-07-04 22:21:03 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-02-27 18:41:12 +0000 Andoni Morales Alastruey <ylatuya@gmail.com> - * gst/siren/gstsirendec.c: - * gst/siren/gstsirendec.h: - MOVED FROM GST-P-FARSIGHT Remove useless checks, document locking - 20080704222103-3e2dc-47a7f49c414f98a188ffc42b07189daf5147483b.gz + * gst-libs/gst/codecparsers/gsth264parser.h: + Fix documentation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1458> -2008-07-04 22:17:43 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-02-17 15:55:19 +1100 Brad Hards <bradh@frogmouth.net> - * gst/siren/gstsirenenc.c: - * gst/siren/gstsirenenc.h: - MOVED FROM GST-P-FARSIGHT make sirenenc thread safe - 20080704221743-3e2dc-f93da86438f753e14be25166aee45f8802f7d100.gz + * tests/check/elements/h264parse.c: + h264parse: add unit test for Precision Time Stamp in SEI messages + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1458> -2008-07-04 20:18:30 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2021-12-19 19:14:05 +0100 Andoni Morales Alastruey <ylatuya@gmail.com> - * gst/siren/gstsirendec.c: - * gst/siren/gstsirenenc.c: - MOVED FROM GST-P-FARSIGHT Replace use GST_DEBUG_OBJECT in sirenenc - 20080704201830-3e2dc-8f3e401aaa594c8cc5853b73f41ca5cb047ee2d3.gz + * gst-libs/gst/codecparsers/gsth264parser.c: + * gst-libs/gst/codecparsers/gsth264parser.h: + * gst/videoparsers/gsth264parse.c: + * gst/videoparsers/gsth264parse.h: + * gst/videoparsers/gstvideoparseutils.c: + * gst/videoparsers/gstvideoparseutils.h: + h264parse: add support Precision Time Stamp in SEI messages + Expose User Data Unregistered as a new Meta and add + API to parse Precision Time Stamp (ST 0604). + Fixes #927 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1458> + +2022-06-02 02:22:19 +0900 Seungha Yang <seungha@centricular.com> + + * gst-libs/gst/cuda/meson.build: + meson: cuda: Add missing override_dependency() + Required for GstCuda library to be consumed via "gstreamer-cuda-1.0" + dependency. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2539> + +2022-06-02 21:25:38 +0900 Seungha Yang <seungha@centricular.com> + + * gst-libs/gst/cuda/gstcudautils.c: + cuda: Fix uninitialized debug category + Make sure debug category init + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2542> -2008-07-04 20:17:44 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-04-22 06:46:07 +0000 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - * gst/siren/gstsirendec.c: - * gst/siren/gstsirendec.h: - * gst/siren/gstsirenenc.c: - MOVED FROM GST-P-FARSIGHT Port sirendec to Gstelement - 20080704201744-3e2dc-99bf7b86e42da363d8c826449d84b43751572d5e.gz + * sys/msdk/gstmsdkav1enc.c: + * sys/msdk/gstmsdkav1enc.h: + * sys/msdk/gstmsdkenc.c: + * sys/msdk/gstmsdkenc.h: + msdkav1enc: Reorder pts + This is a workaround for pts because oneVPL cannot handle the pts + correctly when there is b-frames. We first cache the input frame pts in + a queue then retrive the smallest one for the output encoded frame as + we always output the coded frame when this frame is displayable. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2089> + +2022-03-31 06:45:03 +0000 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> + + * sys/msdk/gstmsdkav1enc.c: + * sys/msdk/gstmsdkav1enc.h: + msdkav1enc: Add b-pyramid and p-pyramid + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2089> + +2022-03-31 06:33:55 +0000 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> + + * sys/msdk/gstmsdkav1enc.c: + * sys/msdk/gstmsdkav1enc.h: + msdkav1enc: Add tile for encoding + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2089> -2008-07-04 20:04:54 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-03-31 06:03:36 +0000 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - * gst/siren/gstsirenenc.c: - MOVED FROM GST-P-FARSIGHT Release ref at the end of chain - 20080704200454-3e2dc-386f2685882a74d01ce503f91396ea37506dbe83.gz + * sys/msdk/gstmsdk.c: + * sys/msdk/gstmsdkav1enc.c: + * sys/msdk/gstmsdkav1enc.h: + * sys/msdk/gstmsdkenc.c: + * sys/msdk/gstmsdkenc.h: + * sys/msdk/meson.build: + msdk: Add msdkav1enc element + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2089> -2008-07-04 20:03:15 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-31 20:39:29 +0200 Jakub Adam <jakub.adam@collabora.com> - * gst/siren/gstsirenenc.c: - MOVED FROM GST-P-FARSIGHT Remove useless call to peek_parent - 20080704200315-3e2dc-6b30efd2d32b6ca96609f4bdc0c3e286f4441746.gz + * sys/amfcodec/gstamfencoder.cpp: + amfencoder: always empty the queue when pushing output samples + gst_amf_encoder_try_output() pushes at most one output buffer downstream + although more may be ready. As a consequence, output samples will keep + queueing up in AMFComponent whenever QueryOutput() returns AMF_REPEAT + (and do_wait is FALSE). This has negative impact on latency when the + video being encoded is a live stream. + In order to avoid it, always retrieve and push all samples available in + AMFComponent's output queue at once. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2536> + +2022-05-29 06:55:27 +0900 Seungha Yang <seungha@centricular.com> + + * sys/directshow/gstdshowvideosrc.cpp: + * sys/directshow/plugin.cpp: + directshow: Fix for uninitialized debug category warning + A method in the code is used in another place (device provider) + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2519> -2008-07-04 20:00:29 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-29 12:42:52 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/siren/gstsirendec.c: - MOVED FROM GST-P-FARSIGHT Make GstSirenEnc use GST_*_OBJECT appropriately - 20080704200029-3e2dc-f68fdaaa8929039fd8413ff0bf8ff514f6e4fbe1.gz + * sys/va/gstvabaseenc.c: + * sys/va/gstvabasetransform.c: + va: Register base classes as abstract. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2521> -2008-07-04 19:51:02 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-29 12:09:22 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/siren/gstsirenenc.c: - * gst/siren/gstsirenenc.h: - MOVED FROM GST-P-FARSIGHT Port sirenenc to gstelement - 20080704195102-3e2dc-cd7687512ac560faaf15f53e1e262d1874a36cdf.gz + * sys/va/gstvaencoder.c: + va: encoder: Use entrypoint type. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2521> -2008-04-28 22:22:37 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-27 14:47:21 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/siren/Makefile.am: - MOVED FROM GST-P-FARSIGHT Link modules with libm where required - 20080428222237-3e2dc-b1e9120c1e9ca1a510bfd7c27e2d45f0d4a12504.gz + * sys/va/gstvah264enc.c: + va264enc: Fix typo. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2508> -2008-04-12 23:43:25 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-05-27 14:45:51 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/siren/gstrtpsirendepay.c: - MOVED FROM GST-P-FARSIGHT Removed debug output - 20080412234325-4f0f6-36b946a7ca3ab4e5802917b8930f036c50a93a29.gz + * sys/va/gstvaencoder.c: + va: encoder: Fix regression since commit 2042c2d4f0. + There's no need to compare with the open entrypoint to query the + encoder. This commit removes the checks to the configured entrypoint + with the parameter. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2508> -2008-04-10 23:43:28 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-03-26 23:48:46 +0900 Seungha Yang <seungha@centricular.com> - * gst/siren/common.h: - MOVED FROM GST-P-FARSIGHT Oups, typo - 20080410234328-4f0f6-962e375e78da05eab52892a57d3226fdd2ffc86d.gz + * sys/mediafoundation/gstmfh264enc.cpp: + * sys/mediafoundation/gstmfh265enc.cpp: + * sys/mediafoundation/gstmfvideoencoder.cpp: + * sys/mediafoundation/gstmfvideoencoder.h: + * sys/mediafoundation/gstmfvp9enc.cpp: + * tests/examples/mediafoundation/meson.build: + * tests/examples/mediafoundation/mfvideoenc-dynamic-reconfigure.c: + * tests/examples/meson.build: + mfvideoencoder: Handle dynamic property update + Re-init MFT on property update to apply new encoding options + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2037> -2008-04-10 07:01:16 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-03-26 23:50:24 +0900 Seungha Yang <seungha@centricular.com> - * gst/siren/.git-darcs-dir: - * gst/siren/Makefile.am: - * gst/siren/common.c: - * gst/siren/common.h: - * gst/siren/dct4.c: - * gst/siren/dct4.h: - * gst/siren/decoder.c: - * gst/siren/decoder.h: - * gst/siren/encoder.c: - * gst/siren/encoder.h: - * gst/siren/gstrtpsirendepay.c: - * gst/siren/gstrtpsirendepay.h: - * gst/siren/gstrtpsirenpay.c: - * gst/siren/gstrtpsirenpay.h: - * gst/siren/gstsiren.c: - * gst/siren/gstsiren.h: - * gst/siren/gstsirendec.c: - * gst/siren/gstsirendec.h: - * gst/siren/gstsirenenc.c: - * gst/siren/gstsirenenc.h: - * gst/siren/huffman.c: - * gst/siren/huffman.h: - * gst/siren/huffman_consts.h: - * gst/siren/rmlt.c: - * gst/siren/rmlt.h: - * gst/siren/siren7.h: - MOVED FROM GST-P-FARSIGHT Added Siren encoder/decoder/payloader/depayloader - 20080410070116-4f0f6-72ffbdbb262f07bfabd1e469973a01b3359bee45.gz + * sys/mediafoundation/plugin.cpp: + mediafoundation: Run indent + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2037> -2009-02-10 18:46:03 +0000 Olivier Crête <olivier.crete@collabora.co.uk> +2022-03-26 22:24:27 +0900 Seungha Yang <seungha@centricular.com> - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/liveadder/liveadder.h: - Add liveadder to the docs + * sys/mediafoundation/gstmfvideoencoder.cpp: + mfvideoenc: Remove redundant bitwise or operation + MFT_ENUM_FLAG_SORTANDFILTER_APPROVED_ONLY (0xc0) covers + MFT_ENUM_FLAG_SORTANDFILTER (0x40) + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2037> -2009-02-10 18:38:11 +0000 Olivier Crête <olivier.crete@collabora.co.uk> +2022-03-26 21:47:10 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - Document the liveadder + * sys/mediafoundation/gstmfvideoencoder.cpp: + mfvideoencoder: Early terminate d3d11 interop + Shared texture will work only for the same GPU + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2037> -2009-02-10 16:18:32 +0000 Olivier Crête <olivier.crete@collabora.co.uk> +2022-03-26 21:43:50 +0900 Seungha Yang <seungha@centricular.com> - * configure.ac: - * docs/plugins/inspect/plugin-liveadder.xml: - * gst/liveadder/liveadder.c: - * gst/liveadder/liveadder.h: - Moved liveadder from gst-plugins-farsight to -bad - Re-indent liveadder in gst style and add it to configure + * sys/mediafoundation/gstmfvideoencoder.cpp: + mfvideoencoder: Check HRESULT code as well for GPU sync + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2037> -2008-12-13 00:09:46 -0500 Olivier Crête <olivier.crete@collabora.co.uk> +2022-03-26 21:40:47 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Use log for message thats on every buffer + * sys/mediafoundation/gstmfvideoencoder.cpp: + mfvideoencoder: Don't specify keyed mutex misc flag + Current implemetation copies textures using non-keyed mutex way. + D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX is pointless + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2037> -2008-12-11 17:54:18 -0500 Olivier Crête <olivier.crete@collabora.co.uk> +2022-05-25 13:25:15 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/liveadder/.git-darcs-dir: - MOVED FROM GST-P-FARSIGHT Remove .git-darcs-dir files + * sys/va/gstvacompositor.c: + vacompositor: Pass video info pointer than copying it. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2496> -2008-08-27 17:16:27 +0200 Edward Hervey <bilboed@bilboed.com> +2022-05-25 13:24:41 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT liveadder : Handle jitter in incoming buffers - Incoming buffers (especially those from an RTP connection) might have slight timestamp jitter. This is normally handled by audiosink (accepting up to 500ms of jitter). - Here we accept a maximum jitter of 10ms. If a buffer is within 10ms of the expected time, we correct its timestamp. + * sys/va/gstvacompositor.c: + vacompositor: Remove useless consts. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2496> -2008-07-04 18:57:21 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-27 21:13:43 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Add handling of position query to liveadder - 20080704185721-3e2dc-7a687e346e74b44fa847c5e5b6eb64c3e0949764.gz + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.h: + * sys/d3d11/gstd3d11decoder.cpp: + d3d11decoder: Work around Intel DXVA driver crash + Intel DXVA driver crashes sometimes (from GPU thread) if + ID3D11VideoDecoder is released while there are outstanding view objects. + To make sure the object life cycle, holds an ID3D11VideoDecoder refcount + in GstD3D11Memory object. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2504> -2008-05-21 17:20:05 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-26 23:50:08 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Replace C99 llabs with C89 code - 20080521172005-3e2dc-8e637d1daa0e27cc2edae1fdfd0dbf23896fb5bc.gz + * sys/qsv/gstqsvencoder.cpp: + qsvencoder: Bind internal texture to render target + ... so that memory allocator can initialize texture with black color + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2502> -2008-05-15 01:22:57 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-26 23:46:05 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Reset vars before restarting thread on flush stop - 20080515012257-3e2dc-e3521752cf3eaf2b8767f4c620eadfc24a8e8e31.gz + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + d3d11memory: Clear YUV texture with black color + We prefer black color as an initial texture color and + Direct3D11 runtime will initialize texture with zeros (except for alpha) + which is fine for RGB formats. But UV components of YUV texture + requires manual clear for black color. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2502> -2008-05-15 01:22:27 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-24 12:54:05 -0400 U. Artie Eoff <ullysses.a.eoff@intel.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Implement first version of seeking - 20080515012227-3e2dc-7f53f78d1c3dfdcdb6e7ad53e6c7f16d5e998a05.gz + * tests/check/elements/vacompositor.c: + * tests/check/meson.build: + tests: va: add simple vacompositor test + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2481> -2008-05-15 01:21:42 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-04-22 16:29:56 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Add duration query from adder - 20080515012142-3e2dc-2768199183bfb9d569be1389e382bedc02e3e95e.gz + * sys/msdk/gstmsdkh265enc.c: + * sys/msdk/gstmsdkh265enc.h: + msdkh265enc: Add intra refresh parameters + Note that for msdkh265enc, intra refresh parameters are only supported + under low-power mode. If these parameters are set without enabling lowpower, + they will be simply ignored. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2308> -2008-05-15 00:02:14 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-04-15 13:38:20 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Move flush stop inside where it belongs - 20080515000214-3e2dc-cda5cddd1ead5c48a554e9e9bc75ae68437bcdfb.gz + * sys/msdk/gstmsdkh264enc.c: + * sys/msdk/gstmsdkh264enc.h: + msdkh264enc: Add intra refresh parameters + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2308> -2008-05-14 23:49:48 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-23 00:36:50 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - * gst/liveadder/liveadder.h: - MOVED FROM GST-P-FARSIGHT Have the liveadder remember if its playing or not - 20080514234948-3e2dc-9064a27a54aef598444aa6ad6463345979120828.gz + * tests/examples/d3d11/d3d11videosink-kb.c: + * tests/examples/d3d11/d3d11videosink-kb.h: + * tests/examples/d3d11/d3d11videosink.c: + * tests/examples/d3d11/meson.build: + * tests/examples/key-handler.c: + * tests/examples/key-handler.h: + * tests/examples/nvcodec/meson.build: + * tests/examples/nvcodec/nvcodec-kb.c: + * tests/examples/nvcodec/nvcodec.c: + * tests/examples/nvcodec/nvcodec.h: + * tests/examples/qsv/meson.build: + * tests/examples/qsv/qsvenc-dynamic-reconfigure.c: + tests: examples: Stop duplicating keyboard interaction handler code + Extract the code from QSV and use it for D3D11 and NVCODEC examples + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2468> -2008-05-14 23:49:10 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-26 14:08:55 +0100 Tim-Philipp Müller <tim@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Push out buffer if we're not playing while there is no clock - 20080514234910-3e2dc-1096eb7dc3fada19afc81dcd536d9edc821d0da9.gz + * ext/webrtc/gstwebrtcice.c: + webrtc: fix build with older libnice versions + 1) check for right macro name when checking for NICE_VERSION_CHECK + 2) if libnice version is 0.1.18.1 this should not satisfy + a NICE_VERSION_CHECK(0,1,19). + Fixes build with libnice 0.1.18.1 subproject checkout. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2499> + +2022-05-24 05:33:05 +1000 Jan Schmidt <jan@centricular.com> + + * sys/androidmedia/gstamc.c: + amc: Don't map input buffer with write mode + When copying data out of a GStreamer buffer, we don't + need to map it writable. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2492> -2008-05-14 23:26:43 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-11 09:17:46 +0100 Philippe Normand <philn@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Empty the queue on flush start - 20080514232643-3e2dc-5a3f52a3fd3771164dea95bd14410d76b4fce2aa.gz + * ext/webrtc/gstwebrtcice.c: + webrtc: Use new libnice API to get the candidate relay address + Corresponding libnice API added in: + https://gitlab.freedesktop.org/libnice/libnice/-/merge_requests/229 (0.1.19) + https://gitlab.freedesktop.org/libnice/libnice/-/merge_requests/232 (0.1.20) + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1998> -2008-05-14 23:17:52 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-11 09:15:33 +0100 Philippe Normand <philn@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Reset pad private on flush stop - 20080514231752-3e2dc-113fec2faafc2dc11c1eaa818cb488b71e601f9b.gz + * ext/webrtc/gstwebrtcice.c: + * ext/webrtc/meson.build: + webrtc: Ensure the NICE_CHECK_VERSION macro is available + This macro was introduced in libnice 0.1.19.1, so until we bump our libnice + dependency to 0.1.20 we have to vendor the macro. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1998> -2008-05-14 23:16:43 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-03-26 12:36:46 +0000 Philippe Normand <philn@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Pass pad as pad to reset_pad_private - 20080514231643-3e2dc-006960b9cdc3ce8e1f890dc6d194778cbc7c9736.gz + * ext/webrtc/gstwebrtcice.c: + * ext/webrtc/gstwebrtcice.h: + * ext/webrtc/gstwebrtcstats.c: + webrtc: Refactor ICECandidateStats freeing logic to a dedicated function + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1998> -2008-05-02 19:10:04 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-03-20 12:36:07 +0000 Philippe Normand <philn@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Print debug message if we return non-ok from chain - 20080502191004-3e2dc-f1f7237c06c1158cf27e29d32a69de06f7112506.gz + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: Document IceCandidateStats and RTCIceCandidatePairStats + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1998> -2008-05-02 19:09:54 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2021-09-01 16:12:24 +0000 Sherrill Lin <lshuying@amazon.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Don't return EOS if we have no pads - 20080502190954-3e2dc-41351225e909e6d0837a6a60e187d33ab186ad76.gz + * tests/check/elements/webrtcbin.c: + webrtcstats: Update unit test for outbound rtp stats + "remote-id" is not guaranteed to present after commit 1deb034e3d873f577a38bc483e6256b0346ee874. + Thus, we should not fail the test if "remote-id" is not found. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1998> -2008-05-01 20:31:54 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2021-06-30 16:01:10 -0400 Sherrill Lin <lshuying@amazon.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Check that the format is NOT time - 20080501203154-3e2dc-780e46b1f0fe76a66e2d79a2eb85d764ff5f182f.gz + webrtcstats: Improve selected candidate pair stats by adding ICE candidate info + The implementation follows w3.org specs: + * https://www.w3.org/TR/webrtc-stats/#icecandidate-dict* + * https://www.w3.org/TR/webrtc-stats/#candidatepair-dict* + Corresponding unit tests are also added. + Rebased and updated from + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1462 + Fixes #1207 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1998> -2008-04-28 22:17:37 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-23 20:58:47 +0800 He Junyan <junyan.he@intel.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Don't use g_queue_clear() - 20080428221737-3e2dc-bb8e4748751c29e0857313a09f85067ab12c3fe4.gz + * sys/va/gstvabaseenc.c: + * sys/va/gstvabaseenc.h: + * sys/va/gstvaencoder.c: + * sys/va/gstvaencoder.h: + * sys/va/gstvah264enc.c: + * sys/va/gstvah264enc.h: + * sys/va/plugin.c: + va: H264enc: Add encoder for VAEntrypointEncSliceLP. + We name vah264lpenc to support H264's VAEntrypointEncSliceLP encoder. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2472> + +2022-05-25 20:01:34 +0800 He Junyan <junyan.he@intel.com> + + * sys/va/gstvabaseenc.c: + va: encoder: Do not reset the frame count when reconfig(). + We should not reset the input/output_frame_count when some configure + changes. For example, the if resolution changes, the current way just + resets the frame count and make the PTS of the output buffer restart + from the original PTS of the first frame. That causes a lot of QOS + event and drop all the new frames. + We should only reset them when encoder start(). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2489> + +2022-05-25 19:57:18 +0800 He Junyan <junyan.he@intel.com> + + * sys/va/gstvabaseenc.c: + * sys/va/gstvabaseenc.h: + * sys/va/gstvah264enc.c: + va: encoder: change reset_state() to a virtual function of base class. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2489> + +2022-05-24 10:21:31 -0400 U. Artie Eoff <ullysses.a.eoff@intel.com> + + * sys/va/gstvacompositor.c: + vacompositor: check caps and info return values + Check return values for get caps and video info from caps. + This was flagged by static analysis. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2480> -2008-05-01 20:09:40 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-25 02:38:01 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Pad push event after the lock has been unlocked - 20080501200940-3e2dc-ae5fec5f79f32777bba649d0d700d49f7bedff40.gz + * sys/d3d11/gstd3d11av1dec.cpp: + * sys/d3d11/gstd3d11h264dec.cpp: + * sys/d3d11/gstd3d11h265dec.cpp: + * sys/d3d11/gstd3d11mpeg2dec.cpp: + * sys/d3d11/gstd3d11vp8dec.cpp: + * sys/d3d11/gstd3d11vp9dec.cpp: + d3d11decoder: Don't print error log on negotiation failure + It may not be a critical error and even expected when shutting down + pipeline or flushing. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2483> -2008-05-01 18:25:54 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-24 11:06:39 +0200 Erwann Gouesbet <erwann.gouesbet@blacknut.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Create generic segment is none received and refuse non-time segments - 20080501182554-3e2dc-ace5ca000414428d6d94478adc5927c9f91975df.gz + * sys/d3d11/gstd3d11screencapture.cpp: + d3d11screencapture: Fix missing/outdated cursor shape + d3d11screencapture can miss a cursor shape to draw or draw an outdated cursor shape. + - AcquireNextFrame only provides cursor shape when there is one update + - current d3d11screencapture skips cursor shape when mouse is not drawn + So, if a gstreamer application uses d3d11screencapture with cursor initially not drawn + "show-cursor"=false and then switches this property to true, the cursor will not be + actually drawn until AcquireNextFrame provides a new cursor shape. + This commit makes d3d11screencapture always update the cursor shape information, even + if the mouse is not drawn. d3d11screencapture will always have the latest cursor shape + when requested to draw it. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2485> -2008-04-29 14:08:02 +0000 Simon McVittie <simon.mcvittie@collabora.co.uk> +2022-05-24 14:47:43 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Add missing semicolon (did anyone test this?!) - 20080429140802-53eee-41fdb4391eddb125b7e34019427cfa5dc8afd6c0.gz + * sys/va/plugin.c: + va: Avoid unused variable if logging is disabled. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2478> -2008-04-29 00:36:00 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-05-22 10:10:38 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Robustness check, make sure the queue is not empty before using the head element - 20080429003600-4f0f6-708c654b65812caeb3612248dbe0b2e62567c250.gz + * sys/va/gstvaencoder.c: + * sys/va/gstvah264enc.c: + va: Keep include's code style + Headers are in alphabetical order. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2465> -2008-04-29 00:34:12 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-05-24 13:19:45 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Remove useless condition - 20080429003412-4f0f6-9e890ad0ac442791a8b22650a75cb754d7f2d723.gz + * sys/va/gstvafilter.c: + vafilter: Fix logging of unsupported alpha blending. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2477> -2008-04-29 00:03:39 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-05-24 14:36:36 +1000 Matthew Waters <matthew@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT check against audio_buffer_clip which can return NULL if the buffer is outside the clipping segment - 20080429000339-4f0f6-7e4e31f066b87e29265ddb3978929e51efbff47d.gz + * ext/webrtc/gstwebrtcbin.c: + * tests/check/elements/webrtcbin.c: + webrtcbin: reuese the same fec/rtx/red payload types for the same media payload + WHen bundling, if multiple medias are used with the same media payload, then + each of the fec/rtx/red additions would add a distinct payload. This could + very easily overflow the available payload space. + Instead, track the relationship between the media payload value and + the relevant fec/rtx/red payload values and reuse them whenever + necessary, even when bundling. + e.g. + ... + a=group:BUNDLE video0 video1 + m=video 9 UDP/SAVPF 96 97 + a=mid:video0 + a=rtpmap:96 VP8/90000 + a=rtpmap:97 rtx/90000 + a=fmtp:97 apt=96 + ... + m=video 9 UDP/SAVPF 96 97 + a=mid:video1 + a=rtpmap:96 VP8/90000 + a=rtpmap:97 rtx/90000 + a=fmtp:97 apt=96 + ... + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2474> -2008-04-28 23:49:48 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-05-23 00:04:03 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Fix object locking in setcaps - 20080428234948-4f0f6-4586434b4308e114f495e926996fc19483c1056f.gz + * tests/examples/qsv/qsvenc-dynamic-reconfigure.c: + tests: examples: Fix typo in QSV encoder example + Fixing width adjustment + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2467> + +2022-05-22 22:44:11 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvav1enc.cpp: + * sys/qsv/gstqsvav1enc.h: + * sys/qsv/meson.build: + * sys/qsv/plugin.cpp: + * tests/examples/qsv/qsvenc-dynamic-reconfigure.c: + qsv: Add AV1 encoder element + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2467> + +2022-05-22 21:38:34 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvencoder.cpp: + * sys/qsv/gstqsvh264enc.cpp: + * sys/qsv/gstqsvh265enc.cpp: + * sys/qsv/gstqsvjpegenc.cpp: + * sys/qsv/gstqsvvp9enc.cpp: + qsvencoder: Move common property to baseclass + adapter-luid and device-path are common for all codecs + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2467> + +2022-05-23 15:03:03 +0800 He Junyan <junyan.he@intel.com> + + * sys/va/gstvabaseenc.c: + va: baseenc: No need to check the frame pointer in handle_frame(). + No need to check the NULL pointer of "frame" in error handling, it + is assured non-NULL by base class and we already use it everywhere + in this function. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2471> + +2022-05-22 15:03:54 +0800 He Junyan <junyan.he@intel.com> + + * sys/va/gstvabaseenc.c: + va: baseenc: include the "vacompat.h" for old version glib. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2463> -2008-04-28 23:49:35 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-04-26 12:07:26 -0400 U. Artie Eoff <ullysses.a.eoff@intel.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Use g_cond_broadcast instead of g_cond_signal - 20080428234935-4f0f6-e51fab31772b32f2fb080ad70c6bedefc5c26dc6.gz + * sys/va/plugin.c: + va: vpp: enable compositor + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2332> -2008-04-28 23:28:51 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-04-26 12:06:17 -0400 U. Artie Eoff <ullysses.a.eoff@intel.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Max latency should also be increased by our own latency - 20080428232851-4f0f6-05f9a89403cd54211f2f4a6595704270eab9616f.gz + * sys/va/gstvacompositor.c: + * sys/va/gstvacompositor.h: + * sys/va/gstvafilter.c: + * sys/va/gstvafilter.h: + * sys/va/meson.build: + va: vpp: add compositor + New implementation of a VA-API compositor with blend feature. + Various chunks of code was taken from vavpp. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2332> -2008-04-28 22:36:06 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-03-25 21:51:47 +0800 He Junyan <junyan.he@intel.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Fix deadlock on invalid timestamp error - 20080428223606-3e2dc-963e48b33efaf84c16d4ec4b789a6dfb2d9358ad.gz + * sys/va/gstvah264enc.c: + va: Apply the va base encoder to the vah264enc. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2330> -2008-04-28 16:19:58 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-03-25 21:48:05 +0800 He Junyan <junyan.he@intel.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Added comment for clarity - 20080428161958-4f0f6-cbaa166fbde99013b555c69ab48d964d75773a7f.gz + * sys/va/gstvabaseenc.c: + * sys/va/gstvabaseenc.h: + * sys/va/meson.build: + va: Add the GstVaBaseEnc common object for all va encoders. + Just like the GstVaBaseDec and GstVaBaseTransform, this base encoder + will handle all common logic for all va encoders. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2330> -2008-04-28 16:12:35 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-05-15 00:56:59 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT added TODO comments - 20080428161235-4f0f6-fbc78533d29d37b65add6f6046fec17ce5e30cae.gz + * gst-libs/gst/d3d11/gstd3d11_private.h: + * gst-libs/gst/d3d11/gstd3d11device.cpp: + * gst-libs/gst/d3d11/gstd3d11format.cpp: + * gst-libs/gst/d3d11/gstd3d11format.h: + d3d11device: Enhance format enumeration and debugging + * Enhance debug log to print human readable D3D11_FORMAT_SUPPORT flags + value, instead of packed numeric flagset value. + * Only device supported format will be added to format table. + Depending on device feature level (i.e., D3D9 feature devices), + 16bits formats will not be supported. Although there might be formats + we deinfed but not supported, it will not be a major issue in practice + since our D3D11 implementation does not support legacy devices already + (known limitation) and also old d3dvideosink will be promoted in that case. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2441> -2008-04-28 15:59:27 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2021-12-22 19:23:37 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT check_eos will always return FALSE here.. - 20080428155927-4f0f6-1a93e295d3df68a96367b75060a89a947efa8944.gz + * docs/plugins/gst_plugins_cache.json: + * gst/jpegformat/gstjpegparse.c: + * gst/jpegformat/gstjpegparse.h: + * gst/jpegformat/meson.build: + * tests/check/elements/jpegparse.c: + jpegparse: Rewrite element. + Now it uses the JPEG parser in libgstcodecparsers, while the whole + code is simplified by relying more in baseparser class for tag + handling. + The element now signals chroma-format and default framerate is 0/1, + which is for still-images. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1473> -2008-04-28 15:49:56 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2021-12-25 13:00:17 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT added comment on the no clock error - 20080428154956-4f0f6-7e24ed31f9c822e4323b681a54bc23f03c1a325e.gz + * tests/check/elements/jpegparse.c: + tests: jpegparse: Mark data as static. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1473> -2008-04-28 15:48:50 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2021-12-22 18:13:17 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT error if no clock is available - 20080428154850-4f0f6-38fdc4134835c457d0054301579d8cd4cbd4989a.gz + * gst/jpegformat/gstjifmux.c: + * gst/jpegformat/gstjifmux.h: + * gst/jpegformat/gstjpegformat.h: + * gst/jpegformat/gstjpegparse.c: + * gst/jpegformat/meson.build: + jpegformat: Use codecparsers' for JPEG markers. + Instead of repeating JPEG markers definition, this patch uses those + defined in gstcodecparsers library. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1473> -2008-04-25 21:04:56 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2021-12-22 17:35:23 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT renaming unused arg - 20080425210456-4f0f6-ab1cdc944c9bcd779504292b21dc1787d6cb62a1.gz + * gst/jpegformat/gstjpegparse.c: + * gst/jpegformat/gstjpegparse.h: + jpegparse: Headers cleanup + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1473> -2008-04-25 20:39:38 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-05-18 16:54:53 +0100 Philippe Normand <philn@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT removed unused user_data and commented line - 20080425203938-4f0f6-787778475b646461da40f3e0000a10bc96e142bc.gz + * ext/webrtc/webrtcdatachannel.c: + datachannel: Notify low buffered amount according to spec + Quoting + https://www.w3.org/TR/webrtc/#dom-rtcdatachannel-bufferedamountlowthreshold + The bufferedAmountLowThreshold attribute sets the threshold at which the + bufferedAmount is considered to be low. When the bufferedAmount decreases from + above this threshold to **equal** or below it, the bufferedamountlow event fires. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2448> -2008-04-25 20:37:35 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> +2022-05-17 14:15:40 +0300 Sebastian Dröge <sebastian@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT remove unused cases and empty switch - 20080425203735-4f0f6-c0442fcf57e3f08b81bc1be3d69f5cfa0257b52a.gz + * gst/mpegtsmux/gstbasetsmux.c: + tsmux: Make sure to set srcpad caps under all conditions before outputting the first buffer + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1218 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2438> -2008-04-28 18:34:09 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-17 04:27:00 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Explicit the discont flag mangling - 20080428183409-3e2dc-4db2505eeca033a634253b6c2d2f4f1398e9fcca.gz + * gst-libs/gst/d3d11/gstd3d11device.cpp: + d3d11device: Don't print ERROR log on open failure + Device open can be failed in various reasons, but it's unlikely + our problem + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2433> -2008-04-28 18:07:11 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-17 14:02:28 +0300 Sebastian Dröge <sebastian@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Unref events when they are dropped - 20080428180711-3e2dc-eb659787f179562f15402c819f188de398deef2d.gz + * gst/sdp/gstsdpdemux.c: + sdpdemux: Release request pads from rtpbin when freeing a stream + Otherwise the pads of the rtpbin stay around forever and are leaked. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2437> -2008-04-24 22:46:27 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-17 03:32:10 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Use Glib G_{MAX,MIN}{U,}INT{8,16,32} macros - 20080424224627-3e2dc-1036bc58b6b4db2f9f12831cdbae3bc613facbbf.gz + * sys/qsv/libmfx/meson.build: + * sys/qsv/meson.build: + qsv: Disable non-MSVC build on Windows + ... and remove pointless UWP consideration that will never work. + Cross-compiled binary has an issue which causes deadlock. + Although cerbero will not build this plugin for non-MSVC build, + people can still build this plugin and may complain its brokenness. + See also + https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/854 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2431> -2008-04-21 03:26:14 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-04-28 16:02:26 +0100 Diogo Goncalves <diogo@diporg.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Unlock liveadder empty buffer gcond on flush - 20080421032614-3e2dc-4ed29e1583ff684338ba5d7611f60b1a7eaff563.gz + * sys/applemedia/avfvideosrc.m: + avfvideosrc: fix wrong framerate selected for caps + This fix solves an issue where a format that doesn't support the + requested framerate would be selected. It ensures that we use the first + format and framerate pair that supports the requested caps. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2331> -2008-04-18 19:29:41 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-12 05:13:08 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Unref event instead of leaking it - 20080418192941-3e2dc-352e25f6ab291612be1dc139790303a1333f65d7.gz + * sys/d3d11/gstd3d11av1dec.cpp: + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/gstd3d11decoder.h: + * sys/d3d11/gstd3d11h264dec.cpp: + * sys/d3d11/gstd3d11h265dec.cpp: + * sys/d3d11/gstd3d11mpeg2dec.cpp: + * sys/d3d11/gstd3d11vp8dec.cpp: + * sys/d3d11/gstd3d11vp9dec.cpp: + d3d11decoder: Add hardcoded minimum resolution values to caps for NVIDIA + NVIDIA GPUs have undocumented limitation regarding minimum resolution + and it can be queried via a NVDEC API. However, since we don't want to + bring CUDA/NVDEC API into D3D11, use hardcoded values for now + until we find a nice way for capability check. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2406> -2008-04-03 17:09:56 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-12 07:23:29 +0200 Edward Hervey <edward@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT non-perfect stream isnt an error, lets just log it - 20080403170956-3e2dc-663f6af8ce067f44ca251a89aebf262d4b8a2869.gz + * gst/mxf/mxfdemux.c: + mxfdemux: Handle files produced by legacy FFmpeg + Until March 2022, the FFmpeg MXF muxer would write the various index table + segments with the same instance ID, which should only be used if it is a + duplicate/repeated table. + In order to cope with those, we first compare the other index table segment + properties (body/index SID, start position) before comparing the instance + ID. This will ensure that we don't consider them as duplicate, but can still + detect "real" duplicates (which would have the same other properties). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2407> -2008-04-03 16:54:31 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-03 16:23:09 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT We retimestamp to the running time, starting the segments from 0 should therefore work - 20080403165431-3e2dc-d981ac2f9ea7fd3c8d2be4d22f1817cf78c614e4.gz + * sys/va/gstvabasedec.c: + va: basedec: Always select first available format. + If the stream chroma doesn't match with any video format in the source + caps template (generated from va config surface formats) instead of + return unknown, return the first available format in the template, + assuming that the driver would be capable to do color conversions. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2404> -2008-04-03 16:54:15 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-07 03:15:44 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Do the min/max of the latencies correctly - 20080403165415-3e2dc-c1124bd84e67cf8a911a14bb123b8731da9f4fc4.gz + * gst-libs/gst/codecs/gsth265decoder.c: + h265decoder: Improve robustness against malformed NAL packets + Use newly added gst_h265_parser_identify_and_split_nalu_hevc() + method to handle broken streams where packetized NAL unit + contain start code prefix in it. + It's obviously wrong stream but we know how to work around it + and even need to support such broken streams since + stateless decoder implementations are being a primary + decoder element. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2394> -2008-04-03 02:14:25 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-10 03:32:42 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Fix indentation - 20080403021425-3e2dc-efd73a6eed0676e158af70484d4e5c42ea75de74.gz + * gst-libs/gst/codecparsers/gsth265parser.c: + * gst-libs/gst/codecparsers/gsth265parser.h: + * tests/check/libs/h265parser.c: + h265parser: Add a new NAL parsing API to handle malformed packets + Add gst_h265_parser_identify_and_split_nalu_hevc() method to + handle a case where packetized stream contains start-code prefix. + This new method behaves similar to exisiting gst_h265_parser_identify_nalu_hevc() + but it will scan start-code prefix to split given data into + NAL units. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2394> -2008-04-03 02:03:18 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-03-30 17:19:54 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Activate pads before adding them in case we're already playing - 20080403020318-3e2dc-afd58f992c0b3057221b91034b2fcd91f296e52d.gz + * sys/va/gstvaav1dec.c: + * sys/va/gstvabasedec.c: + * sys/va/gstvah264dec.c: + * sys/va/gstvah265dec.c: + * sys/va/gstvampeg2dec.c: + * sys/va/gstvavp8dec.c: + * sys/va/gstvavp9dec.c: + va: basedec: Select format from template or negotiated caps. + Instead of using a hard-coded list of preferred formats according the + chroma type, now if now caps are pre-negotiated, from template caps + will choose the first format with the same chroma type. If + pre-negotiated, then it will choose the first format, with same chroma + type, from the first caps structure. + Also all the decoders will check if GST_VIDEO_FORMAT_UNKNOWN is + returned, failing the negotiation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2351> -2008-04-03 02:02:53 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-06 17:53:51 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT For latencies, use the min of the max and the max of the min (and the min wins if they cross) - 20080403020253-3e2dc-dda7e471073ee75a6f60e845c3c546af9be19675.gz + * gst-libs/gst/va/gstvadisplay_drm.c: + libs: va: Add O_CLOEXEC flag at opening drm device. + So any other potential subprocess won't have access to it. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2386> -2008-04-03 00:57:28 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-06 18:21:00 -0400 Olivier Crête <olivier.crete@ocrete.ca> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Rename next_ts into expected_ts, make sure all buffers have a duration - 20080403005728-3e2dc-8245ce1bfeebebfb8f75073253b3c0e3c4b5f596.gz + * gst/pcapparse/gstpcapparse.c: + pcapparse: Set timestamp in DTS, not PTS + This matches the behaviour of basesrc, in particular, it matches the + behaviour of udpsrc, so it's easier to use to as a replacement to test + rtpjitterbuffer and other similar elements. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2388> -2008-04-03 00:40:12 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-01-16 15:51:32 +0300 Dmitry Osipenko <digetx@gmail.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Don't try to set the discont flag if the duration of the previous incoming buffer was not valid - 20080403004012-3e2dc-6f95520c928c347508bdf6188c873ed724ad2dd7.gz + * sys/v4l2codecs/gstv4l2codech264dec.c: + * sys/v4l2codecs/linux/v4l2-controls.h: + v4l2codecs: h264: Set frame type flags + V4L spec now requires decode_params flags to be set in accordance to the + frame's type. In particular this is required by H.264 decoder of NVIDIA + Tegra SoC to operate properly. Set the flags based on type of parsed + slices. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1757> -2008-04-02 22:46:27 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-06 10:50:59 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Reset buffers offsets to none - 20080402224627-3e2dc-d3ee8c7d0c14131017842d8159f7f684d0ccef6d.gz + * tests/check/meson.build: + tests: Skip test if srtp element not built + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2383> -2008-04-02 22:46:12 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-06 01:46:36 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Import adder src event handling - 20080402224612-3e2dc-21a682b18fe18782bf7fa48983c13c1ad86dc5a1.gz + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + d3d11memory: Protect against concurrent access from GPU and CPU to staging texture + Staging texture does not allow GPU access while it's CPU mapped. + But because we cannot block concurrent READ access by GstMemory design, + additional staging texture is still required. + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1182 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2375> -2008-03-31 18:44:21 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-05 02:16:54 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/liveadder.c: - * gst/liveadder/liveadder.h: - MOVED FROM GST-P-FARSIGHT Push out a simple newsegment event - 20080331184421-3e2dc-69544b5b03ae3bb8c1e3f967974fd250d04056b5.gz + * sys/d3d11/gstd3d11screencapture.cpp: + * sys/d3d11/gstd3d11screencapture.h: + * sys/d3d11/gstd3d11screencapturesrc.cpp: + * tests/examples/d3d11/d3d11screencapturesrc.cpp: + d3d11screencapturesrc: Fix crash when d3d11 device is different from owned one + GstD3D11ScreenCapture object is pipeline-independent global object + and the object can be shared by multiple src elements, + in order to overcome a limitation of DXGI Desktop Duplication API. + Note that the API allows only single capture session in a process for + a monitor. + Therefore GstD3D11ScreenCapture object must be able to handle a case + where a src element holds different GstD3D11Device object. Which can + happen when GstD3D11Device context is not shared by pipelines. + What's changed: + * Allocates capture texture with D3D11_RESOURCE_MISC_SHARED for the + texture to be able to copied into other device's texture + * Holds additional shader objects per src element and use it when drawing + mouse + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1197 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2366> -2008-03-31 18:44:04 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-05 20:35:57 +0300 Sebastian Dröge <sebastian@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Don't return EOS if there is no sink pad - 20080331184404-3e2dc-482a134b47eadcd9f1f9d144c02ab1145028fa07.gz + * gst/mxf/mxfmux.c: + mxfmux: Disable aggregator's default negotiation + mxfmux can't negotiate caps with upstream/downstream and always outputs + specific caps based on the input streams. This will always happen before + it produces the first buffers. + By having the default aggregator negotiation enabled the same caps + would be pushed twice in the beginning, and again every time a + reconfigure event is received. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2372> -2008-03-31 17:11:16 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-05 20:35:49 +0300 Sebastian Dröge <sebastian@centricular.com> - * gst/liveadder/liveadder.c: - MOVED FROM GST-P-FARSIGHT Reduce locking a bit and cleanup code a bit - 20080331171116-3e2dc-5ddfb0e459004780d3f7a660c64f58243936a844.gz + * gst/mpegtsmux/gstbasetsmux.c: + mpegtsmux: Disable aggregator's default negotiation + mpegtsmux can't negotiate caps with upstream/downstream and always outputs + specific caps based on the input streams. This will always happen before + it produces the first buffers. + By having the default aggregator negotiation enabled the same caps + would be pushed twice in the beginning, and again every time a + reconfigure event is received. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2372> -2008-03-29 00:45:18 +0000 Olivier Crete <olivier.crete@collabora.co.uk> +2022-05-05 00:24:26 +0900 Seungha Yang <seungha@centricular.com> - * gst/liveadder/.git-darcs-dir: - * gst/liveadder/Makefile.am: - * gst/liveadder/liveadder.c: - * gst/liveadder/liveadder.h: - MOVED FROM GST-P-FARSIGHT Add liveadder element - 20080329004518-3e2dc-40e4746fe82bbc5a871f03fe6ff6048f436c9f85.gz + * gst-libs/gst/codecs/gsth264decoder.c: + h264decoder: Fix for unhandled low-delay decoding case + Baseclass calls get_preferred_output_delay() in a chain of + sequence header parsing and then new_sequence() is called + with required DPB size (includes render-delay) information. + Thus latency query should happen before the sequence header + parsing for subclass to report required render-delay accordingly + via get_preferred_output_delay() method. + (e.g., zero delay in case of live pipeline) + This commit is to fix wrong liveness signalling in case of + upstream packetized format. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2363> -2009-02-16 16:08:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-05-05 00:49:27 +0900 Seungha Yang <seungha@centricular.com> - * ext/soundtouch/gstbpmdetect.cc: - bpmdetect: Fix accidentally introduced stack overwriting introduced in last commit + * gst-libs/gst/codecs/gsth265decoder.c: + h265decoder: Fix for unhandled low-delay decoding case + Baseclass calls get_preferred_output_delay() in a chain of + sequence header parsing and then new_sequence() is called + with required DPB size (includes render-delay) information. + Thus latency query should happen before the sequence header + parsing for subclass to report required render-delay accordingly + via get_preferred_output_delay() method. + (e.g., zero delay in case of live pipeline) + This commit is to fix wrong liveness signalling in case of + upstream packetized format. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2364> -2009-02-16 16:06:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-05-04 23:36:30 +0900 Seungha Yang <seungha@centricular.com> - * ext/soundtouch/gstbpmdetect.cc: - bpmdetect: Save one memory allocation per stereo buffer + * sys/nvcodec/gstnvh264dec.c: + * sys/nvcodec/gstnvh265dec.c: + nvh264dec,nvh265dec: Don't realloc bitstream buffer per slice + Allocated memory size has not been updated which results in + realloc per slice. Fixing it and also release bitstream buffer + on ::close(), not finalize. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2361> -2009-02-13 12:18:48 -0800 Michael Smith <msmith@songbirdnest.com> +2022-04-29 20:28:53 +0200 Jakub Adam <jakub.adam@collabora.com> - * gst/scaletempo/gstscaletempo.c: - scaletempo: Do not use void pointer arithmetic. + * sys/d3d11/gstd3d11screencapture.cpp: + d3d11screencapture: Set viewport when drawing mouse cursor + If there weren't any moved/dirty regions in the captured frame, the + viewport of the ID3D11DeviceContext would be left at whatever previous + value it had, which could lead to the cursor being drawn in a wrong + position and/or in an incorrect size. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2362> -2009-02-12 17:31:50 -0800 Michael Smith <msmith@songbirdnest.com> +2022-05-02 22:59:59 +0900 Seungha Yang <seungha@centricular.com> - * sys/dshowvideosink/dshowvideosink.cpp: - dshowvideosink: Return ASYNC appropriately from change_state. - Make sure we don't do the wrong thing when our base class is returning - ASYNC in state changes. + * sys/nvcodec/gstnvav1dec.c: + * sys/nvcodec/gstnvav1dec.h: + * sys/nvcodec/gstnvdecoder.c: + * sys/nvcodec/gstnvdecoder.h: + * sys/nvcodec/gstnvh264dec.c: + * sys/nvcodec/gstnvh265dec.c: + * sys/nvcodec/gstnvvp8dec.c: + * sys/nvcodec/gstnvvp9dec.c: + * sys/nvcodec/meson.build: + * sys/nvcodec/plugin.c: + nvcodec: Add AV1 decoder + Adding GstCodecs based AV1 decoder element + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1453> -2009-02-12 15:01:48 -0800 Michael Smith <msmith@songbirdnest.com> +2022-05-03 23:56:12 +0900 Seungha Yang <seungha@centricular.com> - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - dshowdecwrapper: fix compilation. - Accidently merged part of one change; remove it. + * gst-libs/gst/codecs/gstav1decoder.c: + * gst-libs/gst/codecs/gstav1decoder.h: + av1decoder: Add support for render delay + Sync up with other decoder baseclass implementations + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1453> -2009-02-12 22:40:48 +0100 Julien Moutte <julien@fluendo.com> +2022-04-28 03:14:54 +0900 Seungha Yang <seungha@centricular.com> - * gst/mpegdemux/gstmpegdemux.c: - Make the demuxer reusable in READY->PLAYING->READY->PLAYING cycles by flushing adapters correctly. + * gst-libs/gst/codecs/gstav1decoder.c: + * gst-libs/gst/codecs/gstav1picture.h: + av1decoder: Hold OBU temporal and spatial id in picture struct + NVDEC API requires the information + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1453> -2009-02-12 10:53:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-05-04 01:03:37 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfdemux.c: - mxfdemux: Also include the picture/sound/data essence coding in the unknown caps + * sys/nvcodec/meson.build: + meson: nvcodec: Remove unnecessary override option and fix build with non-MSVC + cpp_std=c++11 was hack for macOS build but we don't build this plugin + for Apple device anymore. And add "-Wno-deprecated-declarations" + compile option for gcc/clang + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1453> -2009-02-12 09:46:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-12-17 17:22:22 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfdemux.c: - mxfdemux: Update TODO, we should support the drop-frame property of timecode tracks + * sys/nvcodec/cuviddec.h: + * sys/nvcodec/nvEncodeAPI.h: + * sys/nvcodec/nvcuvid.h: + nvcodec: Bump SDK header version to 11.1 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1453> -2009-02-12 08:46:32 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-05-02 22:46:06 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfmetadata.c: - mxfdemux: Fix resolval of identifications from the preface + * sys/nvcodec/gstnvdecoder.c: + * sys/nvcodec/gstnvh264dec.c: + * sys/nvcodec/gstnvh265dec.c: + * sys/nvcodec/gstnvvp8dec.c: + * sys/nvcodec/gstnvvp9dec.c: + nvdecoder: Handle DPB size margin in a single place + ... instead of each subclass + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2343> -2009-02-11 18:40:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-05-02 22:41:53 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfparse.c: - * gst/mxf/mxfparse.h: - * gst/mxf/mxftypes.h: - mxfdemux: Parse MXFTimestamp's milliseconds and add _to_string() function + * sys/d3d11/gstd3d11av1dec.cpp: + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/gstd3d11h264dec.cpp: + * sys/d3d11/gstd3d11h265dec.cpp: + * sys/d3d11/gstd3d11mpeg2dec.cpp: + * sys/d3d11/gstd3d11vp8dec.cpp: + * sys/d3d11/gstd3d11vp9dec.cpp: + d3d11decoder: Handle DPB size margin in a single place + ... instead of each subclass + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2343> -2009-02-10 14:23:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-28 04:25:05 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfdemux.c: - mxfdemux: Update TODO + * gst-libs/gst/codecs/gstav1decoder.c: + * gst-libs/gst/codecs/gstav1decoder.h: + * gst-libs/gst/codecs/gstmpeg2decoder.c: + * gst-libs/gst/codecs/gstmpeg2decoder.h: + * gst-libs/gst/codecs/gstvp8decoder.c: + * gst-libs/gst/codecs/gstvp8decoder.h: + * gst-libs/gst/codecs/gstvp9decoder.c: + * gst-libs/gst/codecs/gstvp9decoder.h: + * sys/d3d11/gstd3d11av1dec.cpp: + * sys/d3d11/gstd3d11mpeg2dec.cpp: + * sys/d3d11/gstd3d11vp8dec.cpp: + * sys/d3d11/gstd3d11vp9dec.cpp: + * sys/nvcodec/gstnvvp8dec.c: + * sys/nvcodec/gstnvvp9dec.c: + * sys/v4l2codecs/gstv4l2codecmpeg2dec.c: + * sys/v4l2codecs/gstv4l2codecvp8dec.c: + * sys/v4l2codecs/gstv4l2codecvp9dec.c: + * sys/va/gstvaav1dec.c: + * sys/va/gstvampeg2dec.c: + * sys/va/gstvavp8dec.c: + * sys/va/gstvavp9dec.c: + codecs: Signal required DPB size for AV1,MPEG2,VP8, and VP9 via new_sequence() + Make all codecs consistent so that subclass can know additional DPB + size requirement depending on render-delay configuration regardless + of codec. Note that render-delay feature is not implemented for AV1 + yet but it's planned. + Also, consider new_sequence() is mandatory requirement, not optional + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2343> -2009-02-12 10:46:23 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> +2022-04-12 12:17:09 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * ext/metadata/gstbasemetadata.c: - metadata: also post error message when returning error + * sys/v4l2codecs/gstv4l2format.c: + v4l2codecs: Port to the new tile size helper + This will complete the scaling of width/height shift scaling + as only a partial implementation was made. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2190> -2009-02-11 17:23:03 +0000 Christian Schaller <cschalle@crazyhorse.localdomain> +2022-05-02 11:46:59 -0400 Thibault Saunier <tsaunier@igalia.com> - * ext/Makefile.am: - * gst-libs/gst/Makefile.am: - * gst-plugins-bad.spec.in: - Update spec file with latest changes, also add some missing disting directories to a couple of Makefiles.am files + * gst-libs/gst/cuda/meson.build: + cuda: Fix introspection warnings + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1183 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2344> -2009-02-11 17:21:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-05-02 21:57:07 +0900 Seungha Yang <seungha@centricular.com> - * gst/selector/gstinputselector.c: - inputselector: Fix compilation, activate_sinkpad() has no notify parameter + * gst-libs/gst/cuda/gstcudautils.c: + Revert "cuda: Fix GstCudaContext refcount bug" + This reverts commit df7ee0e21518ab5586e4094f2089048f3767d5f5. + We should not unref it since gst_message_new_have_context() + takes ownership of the GstContext. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2342> -2009-02-10 16:22:54 -0800 Michael Smith <msmith@songbirdnest.com> +2022-05-02 09:15:57 +0200 Edward Hervey <edward@centricular.com> - * gst/selector/gstinputselector.c: - input-selector: Activate and notify pad before processing events. - Events should trigger pad selection if we don't already have an - explicitly selected pad, so that events prior to first buffer don't get - lost. + * gst/mpegtsdemux/mpegtspacketizer.c: + tsdemux: Demote warning to simple debug + That issue is actually handled, so don't pollute the logs with such warning. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2340> -2009-02-11 01:54:03 +0200 René Stadler <mail@renestadler.de> +2022-04-29 19:08:46 +0300 Sebastian Dröge <sebastian@centricular.com> - * gst/camerabin/gstcamerabin.c: - camerabin: Sanitize constants used for element factory names. + * gst/interlace/gstinterlace.c: + interlace: Also handle a missing "interlace-mode" field as progressive + Otherwise caps negotiation will fail in situations that are supposed + to work, like: + "video/x-raw,framerate=(fraction)60/1" ! interlace field-pattern=0 ! "video/x-raw,framerate=(fraction)30/1" + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2335> -2009-02-11 01:24:51 +0200 René Stadler <mail@renestadler.de> +2022-04-29 19:08:32 +0300 Sebastian Dröge <sebastian@centricular.com> - * gst/camerabin/gstcamerabin.c: - camerabin: Use v4l2src as default source. + * gst/interlace/gstinterlace.c: + interlace: Add some more debug output to the getcaps function + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2335> -2009-02-11 01:07:04 +0200 René Stadler <mail@renestadler.de> +2022-04-29 16:56:54 +0100 Myles Inglis <myles.inglis@vcatechnology.com> - * gst-libs/gst/interfaces/.gitignore: - photography interface: .gitignore generated files. + * gst-libs/gst/cuda/gstcudautils.c: + cuda: Fix GstCudaContext refcount bug + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2334> -2009-02-11 01:02:42 +0200 René Stadler <mail@renestadler.de> +2022-04-28 17:08:11 +0200 Ludvig Rappe <ludvigr@axis.com> - * win32/common/photography-enumtypes.c: - * win32/common/photography-enumtypes.h: - photography interface: Move generated files to win32/common. + * ext/webrtc/icestream.c: + webrtc: Fix memory leak in icestream + Since both g_value_set_object() and g_weak_ref_get() takes a reference + there will be two new references to the GstWebRTCICE object when there + should be only one. g_value_take_object() has the same functionality as + g_value_set_object() but does not take a reference. + Without this change, the GstWebRTCICE object will be leaked. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2333> + +2022-04-27 22:50:37 +0900 Seungha Yang <seungha@centricular.com> + + * gst-libs/gst/cuda/gstcudautils.c: + cuda: Correct CUDA device id field in GstContext structure + device id is unsigned int, not signed. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2311> -2009-02-11 00:28:53 +0200 René Stadler <mail@renestadler.de> +2022-04-28 13:23:39 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/camerabin/.gitignore: - camerabin: Add .gitignore to hide generated signal marshaller files. + * gst-libs/gst/codecs/gsth265decoder.h: + codecs: h265decoder: Fix documentation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2328> -2009-02-11 00:19:22 +0200 René Stadler <mail@renestadler.de> +2022-04-27 15:24:50 +0200 Edward Hervey <edward@centricular.com> - * gst/camerabin/gstcamerabin.c: - camerabin: Fix plugin details to use GST_PACKAGE_* values. + * gst/mpegtsdemux/mpegtsbase.c: + mpegts: Handle "empty" PMT gracefully + Some streams have 2 PMT sections in a single TS packet. The first one is "valid" + but doesn't contain/define any streams. That causes an unrecoverable issue when + we try to activate the 2nd (valid) PMT. + Instead of doing that, pre-emptively refuse to process PMT without any streams + present within. We still do post that section on the bus to inform applications. + Fixes #1181 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2310> -2009-02-11 00:15:43 +0200 René Stadler <mail@renestadler.de> +2022-04-26 09:11:07 +0200 Stéphane Cerveau <scerveau@collabora.com> - * gst/aacparse/gstaacparse.c: - aacparse: Fix license specified in plugin details. + * tests/check/elements/srtp.c: + srtp: fix flaky unit test + Use different port for each test to avoid other UDP + packet to be received. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2294> -2009-02-10 12:28:58 -0800 Michael Smith <msmith@songbirdnest.com> +2022-04-28 00:48:35 +0900 Seungha Yang <seungha@centricular.com> - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - dshowdecwrapper: Pass pixel aspect through from demuxers, if supplied. - If the incoming caps have a pixel-aspect-ratio, ensure it's set on the - output. Corrects PAR for many (but probably not all) files. + * sys/d3d11/plugin.cpp: + d3d11h265dec: Assign PRIMARY + 1 rank + Promote d3d11h265dec to be default one if available + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2314> -2009-02-10 12:26:25 -0800 Michael Smith <msmith@songbirdnest.com> +2022-04-28 00:31:49 +0900 Seungha Yang <seungha@centricular.com> - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - dshowdecwrapper: Make audio decoders have SECONDARY rank. - These wrappers are not ideal, and for many of these formats there are - better gstreamer elements available. So, make the rank SECONDARY. In - particular, the mp3 decoder on winXP doesn't work very well. + * sys/nvcodec/gstnvvp9dec.c: + nvvp9sldec: Increase DPB size to cover render delay + This should've included in the previous MR + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/987 + already, but missed. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2313> -2009-02-10 12:12:03 -0800 Michael Smith <msmith@songbirdnest.com> +2022-03-07 15:44:04 +0000 Thibault Saunier <tsaunier@igalia.com> - * sys/dshowdecwrapper/gstdshowaudiodec.c: - * sys/dshowdecwrapper/gstdshowdecwrapper.c: - * sys/dshowdecwrapper/gstdshowvideodec.c: - dshowdecwrapper: Delete old .c files that are unused - These old files are stale; the plugin was rewritten in c++ ages - ago. Not sure why these are hanging around. + * ext/qroverlay/gstqroverlay.c: + qroverlay: Reset data_changed after we use the info + It was never reset so it was always TRUE once the data was changed! + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2299> -2009-02-10 10:17:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-04 22:00:18 +0000 Thibault Saunier <tsaunier@igalia.com> - * ext/soundtouch/gstbpmdetect.cc: - bpmdetect: Pass at most 2048 samples to SoundTouch's BPMDetect - Internally BPMDetect assumes that at most 2048 samples are passed - to it at once and stores those in a stack allocated static sized - array. If we pass too many samples this will result in a buffer overflow - resulting in heavy stack corruption and a crash. Fixes bug #570996. + * ext/qroverlay/gstqroverlay.c: + qroverlay: Add a GstQROverlay meta + See documentation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2299> -2009-02-09 17:58:42 -0800 Michael Smith <msmith@songbirdnest.com> +2022-04-27 00:27:06 +0200 Mathieu Duponchelle <mathieu@centricular.com> - * sys/acmmp3dec/acmmp3dec.c: - acmmp3dec: fix major memory leaks and clean up code. - Unref incoming buffers when we're done. - Reindent, clean up white space. Fix comments. + * gst/onvif/gstrtponviftimestamp.c: + rtponviftimestamp: add extension data to all packets .. + regardless of whether they are input as individual buffers or + buffer lists. + The ONVIF specification requires all packets to hold the extension, + it makes no sense to behave differently when handling buffer lists. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2303> -2009-02-09 18:14:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-08 21:26:16 +0000 Thibault Saunier <tsaunier@igalia.com> - * gst/mxf/mxfdemux.c: - mxfdemux: After pulling the footer metadata reset essence track positions to 0 + * sys/nvcodec/gstcudaconvert.c: + cudaconvert: Enhance debugging when setting video info fails + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2300> -2009-02-09 17:55:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-26 22:35:30 +0800 He Junyan <junyan.he@intel.com> - * gst/mxf/mxfdemux.c: - mxfdemux: When trying to find an essence track position try to find position+1 too - By searching for the following position we will add the complete - generic container (i.e. all tracks) at the same position to the - index which should make finding positions for more than one track - a bit faster. + * gst-libs/gst/codecparsers/gsth265bitwriter.c: + codecparsers: bitwriter: Calculate PicSizeInCtbsY when writing slice header. + The slice->pps->PicWidthInCtbsY/PicHeightInCtbsY values are calculated when + we parse the slice header. But they are not calculated in bitwriter and so + may not have valid value when writing slice header. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2287> + +2022-04-24 17:26:03 +0800 He Junyan <junyan.he@intel.com> + + * gst-libs/gst/codecparsers/gsth265bitwriter.c: + codecparsers: bitwriter: Fix some coverity issues of H265 bitwriter. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2287> -2009-02-09 17:48:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-24 00:02:18 +0800 He Junyan <junyan.he@intel.com> - * gst/mxf/mxfdemux.c: - mxfdemux: For new essence tracks only set the position to 0 if it starts in the current partition + * sys/va/gstvabasedec.c: + va: dec: Use gst_buffer_pool_config_set_va_alignment() to set alignment. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2282> -2009-02-09 17:44:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-23 23:59:08 +0800 He Junyan <junyan.he@intel.com> - * gst/mxf/mxfdemux.c: - mxfdemux: Check if the length of the src/essence track arrays are 0, not the array itself + * gst-libs/gst/va/gstvapool.h: + va: pool: Replace all tabs with spaces in header file. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2282> -2009-02-09 17:25:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-23 23:52:34 +0800 He Junyan <junyan.he@intel.com> - * gst/mxf/mxfdemux.c: - mxfdemux: Make sure that the srcpad and essence track arrays always exist + * gst-libs/gst/va/gstvapool.c: + va: pool: Delete the GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT. + The va pool is used for GPU side surface/image, its alignment should + not be changed arbitrarily by others. So we decide not to expose the + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT flag anymore. + Instead, user can call gst_buffer_pool_config_set_va_alignment() to + set its surface/image alignment. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2282> -2009-02-09 16:12:51 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-23 23:40:14 +0800 He Junyan <junyan.he@intel.com> - * gst/mxf/mxfdemux.c: - mxfdemux: Change some GST_ERRORs to something less critical + * gst-libs/gst/va/gstvapool.c: + * gst-libs/gst/va/gstvapool.h: + va: pool: Add set_va_alignment() API. + We want to use gst_buffer_pool_config_set_va_alignment() to replace + gst_buffer_pool_config_get_video_alignment(). The later one is specific + for GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT option. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2282> -2009-02-09 16:09:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-26 01:16:06 +0800 He Junyan <junyan.he@intel.com> - * gst/mxf/mxfdemux.c: - mxfdemux: Only go into EOS and send segment-done after all tracks are finished + * gst/videoparsers/gstav1parse.c: + av1parse: Fix a latent memory leak in colorimetry setting. + Also delete the useless "have_cinfo" judgement. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2288> -2009-02-09 16:09:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-24 22:54:58 +0800 He Junyan <junyan.he@intel.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfup.c: - mxfdemux: Update TODO + * gst/videoparsers/gstav1parse.c: + av1parse: Correct the meaning of color_range flag. + According to spec: + color range equal to 0 shall be referred to as the studio swing + representation and color range equal to 1 shall be referred to as + the full swing representation. + The current status is just the opposite. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2288> -2009-02-09 15:48:20 +0100 Julien Moutte <julien@fluendo.com> +2022-04-25 22:59:14 +0900 Seungha Yang <seungha@centricular.com> - * gst/camerabin/Makefile.am: - Fix build for camerabin. + * sys/qsv/gstqsvencoder.cpp: + qsvencoder: Workaround for invalid DTS with VP9 + SDK runtime seems to report zero DTS for all frames in case of VP9 but + we don't need to use DTS for the codec. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2291> -2009-02-09 12:02:50 +0100 Edward Hervey <bilboed@bilboed.com> - - * common: - Bump revision to use for common submodule. - -2009-01-30 16:09:30 +0100 Edward Hervey <bilboed@bilboed.com> - - * .gitignore: - * tests/check/elements/.gitignore: - * tests/check/pipelines/.gitignore: - More files to ignore - -2009-02-05 23:06:23 +0200 Nokia Corporation <multimedia@maemo.org> - - * tests/check/Makefile.am: - * tests/check/elements/camerabin.c: - tests: Add camerabin unit tests. - -2009-02-05 15:48:32 +0200 Nokia Corporation <multimedia@maemo.org> - - * configure.ac: - * gst/camerabin/Makefile.am: - * gst/camerabin/camerabingeneral.c: - * gst/camerabin/camerabingeneral.h: - * gst/camerabin/camerabinimage.c: - * gst/camerabin/camerabinimage.h: - * gst/camerabin/camerabinvideo.c: - * gst/camerabin/camerabinvideo.h: - * gst/camerabin/gstcamerabin-marshal.list: - * gst/camerabin/gstcamerabin.c: - * gst/camerabin/gstcamerabin.h: - * gst/camerabin/gstcamerabincolorbalance.c: - * gst/camerabin/gstcamerabincolorbalance.h: - * gst/camerabin/gstcamerabinphotography.c: - * gst/camerabin/gstcamerabinphotography.h: - * gst/camerabin/gstcamerabinxoverlay.c: - * gst/camerabin/gstcamerabinxoverlay.h: - Add camerabin element. - -2009-02-06 12:06:23 +0200 Nokia Corporation <multimedia@maemo.org> - - * configure.ac: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/interfaces/Makefile.am: - * gst-libs/gst/interfaces/photography-enumtypes.c: - * gst-libs/gst/interfaces/photography-enumtypes.h: - * gst-libs/gst/interfaces/photography.c: - * gst-libs/gst/interfaces/photography.h: - Add photography interface. +2022-04-24 00:37:40 +0900 Seungha Yang <seungha@centricular.com> -2009-02-09 07:33:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/cuda/meson.build: + * sys/nvcodec/meson.build: + nvcodec: Stop building for non-{Windows,Linux} target + The other platforms, specifically macOS have not been supported already + because this plugin loads so or dll. Moreover, NVIDIA dropped + support for macOS as of CUDA 11.0. See also + https://developer.nvidia.com/nvidia-cuda-toolkit-11_0_0-developer-tools-mac-hosts + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2283> - * gst/mxf/mxfdemux.c: - mxfdemux: Fix seeking to the end of file - When seeking to a position where no new offset can be - found or after the end of a track don't set the EOS flag - to TRUE as we don't (and can't) push EOS downstream then. - Instead set the current essence track position to then - end of the essence track and let the loop or chain function - set everything to EOS and push EOS downstream. - Also restart the pad's task if resolving metadata failed - (playback will continue as before) and return FALSE from - the seek if no new offset could be found. +2022-03-28 17:06:46 +0200 Stéphane Cerveau <scerveau@collabora.com> -2009-02-08 21:52:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * tests/check/elements/srtp.c: + * tests/check/meson.build: + srtp: add unit tests + Enable unit tests in meson.build + Add test_play_key_error to check the stats + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2027> - * gst/mxf/mxfdemux.c: - mxfdemux: Fix last_stop calculation when seeking +2022-03-25 17:47:23 +0100 Stéphane Cerveau <scerveau@collabora.com> -2009-02-08 21:31:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * docs/plugins/gst_plugins_cache.json: + * ext/srtp/gstsrtpdec.c: + * ext/srtp/gstsrtpdec.h: + srtpdec: add counts in stats + In order to count the buffers which have been received and dropped for + decryption reason, add a stats to track it. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2027> - * gst/mxf/mxfmetadata.c: - mxfdemux: Resolve source package before accessing it's members +2022-04-23 04:00:21 +0900 Seungha Yang <seungha@centricular.com> -2009-02-08 21:23:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/d3d11/gstd3d11window_win32.cpp: + d3d11videosink: Fix for unhandled mouse double click events + Only window created with CS_DBLCLKS style can receive those mouse + double click events, so we need to use the style for internal/external + windows can get double click events. + Also, passthrough mouse events to parent window in the same message pumping + threads instead of manually forwarding each mouse event. + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1172 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2277> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - mxfdemux: Correctly implement timestamping in all cases - When the material package track and source package track - edit rate are different the source package track edit - rate applies to the stored essence and the material track - edit rate only applies to the values in the track's sequence - and components. +2022-03-07 08:46:57 -0500 Xavier Claessens <xavier.claessens@collabora.com> -2009-02-08 21:22:17 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/vulkan/meson.build: + * sys/msdk/meson.build: + Meson: Fix deprecation warnings + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1876> - * gst/mxf/mxfdemux.c: - mxfdemux: Correctly handle DURATION queries with a negative duration +2022-04-22 17:44:06 +0200 Stéphane Cerveau <scerveau@collabora.com> -2009-02-08 21:17:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * ext/rsvg/gstrsvgdec.h: + rvsg: fix cairo include + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2276> - * gst/mxf/mxfdemux.c: - mxfdemux: When changing to the component after the last component update the essence track position +2022-04-22 12:29:29 +0200 Corentin Damman <c.damman@intopix.com> -2009-02-08 21:12:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/nvcodec/cuda-converter.c: + cuda-converter: fix nvrtc compilation on non-English locale systems + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2268> - * gst/mxf/mxfdemux.c: - mxfdemux: Small cleanup and an additional check - Update TODO list, reduce size of a stack allocated string - and don't allow essence tracks with an invalid edit rate +2022-04-21 00:38:37 +0900 Sangchul Lee <sc11.lee@samsung.com> -2009-02-08 07:30:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: Avoid access of freed memory + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2256> - * gst/mxf/mxfmetadata.c: - mxfdemux: For material packages make sure that tracks resolve to source tracks +2022-04-15 22:19:09 +0800 He Junyan <junyan.he@intel.com> -2009-02-07 10:38:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/va/gstvah264enc.c: + va: h264enc: Do not let L0 number surplus the HW limitation. + The algorithm to calculate the L0/L1 number may let the L0 number + surplus the HW limitation. We should ensure that limitation after + that calculation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2202> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfparse.c: - * gst/mxf/mxfparse.h: - * gst/mxf/mxfvc3.c: - mxfdemux: Add support for non-standard Avid MXF files containing DNxHD essence - Avid uses a custom essence container UL and custom essence element keys - that are fortunately compatible with the generic container essence - elements. Partially fixes bug #561922. +2022-03-02 14:42:42 +0800 He Junyan <junyan.he@intel.com> -2009-02-07 10:13:54 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * tests/check/libs/h265bitwriter.c: + * tests/check/meson.build: + test: Add test cases for the H265 bitwriter. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1831> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - mxfdemux: Make essence track creation a bit more robust against broken files - Some files contain multiple tracks with the same track number but different - track id inside the same source package. This is invalid and we simply ignore - the second and following of such traacks now instead of overwriting the - information of the first one. +2022-03-02 14:31:05 +0800 He Junyan <junyan.he@intel.com> -2009-02-07 10:03:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * gst-libs/gst/codecparsers/gsth265bitwriter.c: + * gst-libs/gst/codecparsers/gsth265bitwriter.h: + * gst-libs/gst/codecparsers/meson.build: + codecparsers: bitwriter: Add the common bit writer functions for H265. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1831> - * gst/mxf/mxfmetadata.c: - mxfdemux: Don't include multiple descriptors in the track's descriptors +2022-04-20 13:18:34 +0800 He Junyan <junyan.he@intel.com> -2009-02-07 09:27:13 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> + * sys/va/gstvavpp.c: + va: vpp: Update the colorimetry and HDR fields when fixup src caps. + When we fixup src caps, the current way of handling the HDR fields is not + correct. + 1. We trim the HDR fields only when the input caps is not a subset of the + fixup src caps. But in fact, the input caps with HDR fields such as the + "mastering-display-info" can possibly be the subset of the fixup src caps, + if they have all same other fields. + 2. We always copy the colorimetry from input caps to src caps if it is + absent. But when hdr-tone-mapping is enabled, the HDR->SDR conversion makes + the colorimetry change. We should use downstream's setting, or just use the + default colorimetry of SDR. + We changes to: + 1. If hdr-tone-mapping is enabled, we trim all HDR fields and add a correct + colorimetry. + 2. Copy colorimetry from input if it is still absent. + 3. Consider the subset replacement. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2244> + +2022-04-20 23:06:56 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvdecoder.h: + * sys/qsv/gstqsvh264dec.cpp: + * sys/qsv/gstqsvh264enc.cpp: + * sys/qsv/gstqsvh265dec.cpp: + * sys/qsv/gstqsvh265enc.cpp: + * sys/qsv/gstqsvjpegenc.cpp: + * sys/qsv/gstqsvvp9enc.cpp: + qsv: Add GPU description to element long-name on Windows + Would be useful for a multi-Intel-GPU system + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2249> + +2022-04-19 21:38:31 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/mxf/mxfdv-dif.c: - * gst/mxf/mxfparse.c: - * gst/mxf/mxfparse.h: - mxfdemux: Add support for non-standard Avid MXF files containing DV essence - Avid usually uses a custom essence container label for the essence - descriptors and stores the actual codec that is used inside the - picture essence coding field (and for sound probably in the sound - essence coding field but I have no sample files with sound). - Partially fixes bug #561922. + * sys/va/gstvavpp.c: + vapostproc: Notify if hdr-tone-mapping property changes. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2247> -2009-02-06 11:57:46 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-30 18:09:36 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/mxf/mxfmetadata.c: - mxfdemux: Add data definition for Avid vendor specific picture essence + * gst-libs/gst/va/vasurfaceimage.c: + * gst-libs/gst/va/vasurfaceimage.h: + * sys/va/gstvafilter.c: + * sys/va/gstvah264enc.c: + va: Expose a couple va surface/buffer methods. + And use them in va plugin. + Also, set as default logging category the vadisplay one. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2077> -2009-02-06 11:55:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-20 08:09:58 +0900 Wonchul Lee <wonchul.dev@gmail.com> - * gst/mxf/mxfdemux.c: - mxfdemux: For tracks with no known mapping use dummy caps + * ext/dash/gstdashsink.c: + dashsink: Unlock when failed to get content + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2242> -2009-02-06 11:21:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-18 17:50:22 +0900 Camilo Celis Guzman <camilo@pexip.com> - * gst/mxf/mxfdemux.c: - mxfdemux: Don't remove invalid new essence track twice from the GPtrArray + * gst/videoparsers/gstav1parse.c: + gstav1parse: fixup various possible logical errors + Found via an analyzed build for Clang. Specifically we had: + gstav1parse.c1850,11 in gst_av1_parse_detect_stream_format: Logic error: The left operand of '==' is a garbage value + gstav1parse.c1606,11 in gst_av1_parse_handle_to_small_and_equal_align: Logic error: The left operand of '==' is a garbage value + Also a couple of false-positives: + gstav1parse.c1398,24 in gst_av1_parse_handle_one_obu: Logic error: Branch condition evaluates to a garbage value + gstav1parse.c1440,37 in gst_av1_parse_handle_one_obu: Logic error: The left operand of '-' is a garbage value + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2230> -2009-02-06 11:09:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-25 10:18:34 -0400 Xavier Claessens <xavier.claessens@collabora.com> - * gst/mxf/mxfmpeg.c: - mxfdemux: Implement keyframe detection for MPEG4 video streams + * meson.build: + Always define ENABLE_NLS + GLib guarantees libintl API is always available, provided by + proxy-libintl as last resort. GLib itself unconditionally define + ENABLE_NLS. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2028> -2009-02-06 10:46:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-25 10:20:24 -0400 Xavier Claessens <xavier.claessens@collabora.com> - * gst/mxf/mxfdemux.c: - mxfdemux: Handle some more special cases when setting the position when seeking + * gst-libs/gst/gettext.h: + * gst-libs/gst/gst-i18n-plugin.h: + Delete unused i18n headers + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2028> -2009-02-06 10:46:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-25 09:59:23 -0400 Xavier Claessens <xavier.claessens@collabora.com> - * gst/mxf/mxfdemux.c: - mxfdemux: Adjust last_stop to the last keyframe when seeking + * ext/curl/gstcurlelement.c: + * ext/curl/gstcurlhttpsrc.c: + * ext/dash/gstdashdemux.c: + * ext/ladspa/gstladspa.c: + * ext/openal/gstopenal.c: + * ext/openal/gstopenalelement.c: + * ext/opencv/gsttemplatematch.cpp: + * ext/resindvd/resindvdbin.c: + * ext/resindvd/resindvdsrc.c: + * ext/rtmp/gstrtmpsrc.c: + * ext/smoothstreaming/gstmssdemux.c: + * ext/smoothstreaming/gstsmoothstreaming-plugin.c: + * ext/sndfile/gstsf.c: + * ext/sndfile/gstsfdec.c: + * ext/sndfile/gstsfelement.c: + * ext/sndfile/gstsfsink.c: + * ext/sndfile/gstsfsrc.c: + * gst-libs/gst/adaptivedemux/gstadaptivedemux.c: + * gst/aiff/aiffparse.c: + * gst/aiff/gstaiffelement.c: + * gst/asfmux/gstasfmux.c: + * gst/asfmux/gstasfparse.c: + * gst/camerabin2/camerabingeneral.c: + * gst/camerabin2/gstcamerabin2.c: + * gst/camerabin2/gstdigitalzoom.c: + * gst/camerabin2/gstviewfinderbin.c: + * gst/camerabin2/gstwrappercamerabinsrc.c: + * gst/dvdspu/gstdvdspu.c: + * gst/midi/midi.c: + * gst/mpegtsdemux/mpegtsbase.c: + * gst/transcode/gsttranscodebin.c: + * gst/transcode/gsttranscodeelement.c: + * sys/dvb/gstdvb.c: + * sys/dvb/gstdvbelement.c: + * sys/dvb/gstdvbsrc.c: + * sys/dvb/parsechannels.c: + Replace gst-i18n-*.h with gi18n-lib.h + GLib guarantees libintl is always present, using proxy-libintl as + last resort. There is no need to mock gettex API any more. + This fix static build on Windows because G_INTL_STATIC_COMPILATION must + be defined before including libintl.h, and glib does it for us as part + as including glib.h. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2028> + +2022-04-13 15:23:56 -0400 Thibault Saunier <tsaunier@igalia.com> + + * gst-libs/gst/cuda/gstcudautils.c: + * gst-libs/gst/cuda/gstcudautils.h: + * sys/nvcodec/gstcudamemorycopy.c: + cuda: Fix typo in gst_cuda_buffery_copy_type_to_string + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1472> + +2021-12-12 13:19:52 +0000 Thibault Saunier <tsaunier@igalia.com> + + * gst-libs/gst/cuda/gstcudacontext.c: + * gst-libs/gst/cuda/gstcudacontext.h: + * gst-libs/gst/cuda/gstcudautils.h: + cuda: Add a `gst_cuda_context_new_wrapped` constructor + So that application or people implementing cuda element from + outside GStreamer itself can ensure that their contexts are used + by GStreamer. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1472> -2009-02-06 10:06:59 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-12-08 11:48:08 +0000 Thibault Saunier <tsaunier@igalia.com> - * gst/mxf/mxfdemux.c: - mxfdemux: Fix logic for finding the previous keyframe + * docs/libs/cuda/index.md: + * docs/libs/cuda/sitemap.txt: + * docs/meson.build: + * gst-libs/gst/cuda/cuda-gst.h: + * gst-libs/gst/cuda/cuda-prelude.h: + * gst-libs/gst/cuda/gstcudabufferpool.c: + * gst-libs/gst/cuda/gstcudabufferpool.h: + * gst-libs/gst/cuda/gstcudacontext.c: + * gst-libs/gst/cuda/gstcudacontext.h: + * gst-libs/gst/cuda/gstcudaloader.c: + * gst-libs/gst/cuda/gstcudaloader.h: + * gst-libs/gst/cuda/gstcudamemory.c: + * gst-libs/gst/cuda/gstcudamemory.h: + * gst-libs/gst/cuda/gstcudanvrtc.c: + * gst-libs/gst/cuda/gstcudanvrtc.h: + * gst-libs/gst/cuda/gstcudautils.c: + * gst-libs/gst/cuda/gstcudautils.h: + * gst-libs/gst/cuda/gstnvrtcloader.c: + * gst-libs/gst/cuda/gstnvrtcloader.h: + * gst-libs/gst/cuda/meson.build: + * gst-libs/gst/cuda/stub/cuda.h: + * gst-libs/gst/cuda/stub/cudaGL.h: + * gst-libs/gst/cuda/stub/nvrtc.h: + * gst-libs/gst/meson.build: + * sys/nvcodec/cuda-converter.c: + * sys/nvcodec/cuda-converter.h: + * sys/nvcodec/gstcudabasefilter.c: + * sys/nvcodec/gstcudabasetransform.c: + * sys/nvcodec/gstcudabasetransform.h: + * sys/nvcodec/gstcudaconvert.c: + * sys/nvcodec/gstcudafilter.c: + * sys/nvcodec/gstcudamemorycopy.c: + * sys/nvcodec/gstcudascale.c: + * sys/nvcodec/gstcuvidloader.h: + * sys/nvcodec/gstnvbaseenc.c: + * sys/nvcodec/gstnvbaseenc.h: + * sys/nvcodec/gstnvdec.c: + * sys/nvcodec/gstnvdec.h: + * sys/nvcodec/gstnvdecoder.c: + * sys/nvcodec/gstnvdecoder.h: + * sys/nvcodec/gstnvenc.c: + * sys/nvcodec/gstnvenc.h: + * sys/nvcodec/gstnvencoder.cpp: + * sys/nvcodec/gstnvencoder.h: + * sys/nvcodec/gstnvh264dec.c: + * sys/nvcodec/gstnvh264encoder.cpp: + * sys/nvcodec/gstnvh264encoder.h: + * sys/nvcodec/gstnvh265dec.c: + * sys/nvcodec/gstnvh265encoder.cpp: + * sys/nvcodec/gstnvh265encoder.h: + * sys/nvcodec/gstnvvp8dec.c: + * sys/nvcodec/gstnvvp9dec.c: + * sys/nvcodec/meson.build: + * sys/nvcodec/plugin.c: + cuda: Factor out a public GstCUDA library + So applications and elements implemented outside GStreamer can reuse + our infrastructure + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1472> -2009-02-06 09:53:13 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-12-03 13:12:42 +0000 Thibault Saunier <tsaunier@igalia.com> - * gst/mxf/mxfd10.c: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfmpeg.h: - mxfdemux: Add keyframe detection for MPEG2 video streams - This is useful for seeking as we usually want to seek to the previous - keyframe. The keyframe detection is done by parsing the MPEG2 - elementary stream and if a GOP or I-frame packet is found we - assume a keyframe in this edit unit. + * sys/nvcodec/gstnvbaseenc.c: + * sys/nvcodec/gstnvenc.c: + nvenc: Give more details about errors + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1472> -2009-02-05 21:29:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-11-12 20:13:10 +0100 Ruben Gonzalez <rgonzalez@fluendo.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - mxfdemux: Protect the metadata with a lock against concurrent access + * docs/plugins/gst_plugins_cache.json: + gst_plugin_load_file: force plugin reload if diff filename + If a file includes a new version of a plugin that exits in the + registry, the output of gst-inspect is incorrect. The output has the + correct version but incorrect filename, and element description. + This seems to have also fixed some documentation issues. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1344> -2009-02-05 17:42:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-19 04:37:05 +0900 Seungha Yang <seungha@centricular.com> - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - Random cleanup and smaller bugfixes - Use gst_element_klass_set_details_simple(), install properties - with static strings, create pads directly from the static pad - templates, directly put the segment into the instance struct, - use GST_MSECOND instead of numbers. - The PAR is a GstFraction and not a double, use gst_structure_get_fraction(). - Simplify setcaps() functions. + * sys/d3dvideosink/d3dvideosink.c: + d3dvideosink: Remove outdated comment + d3dvideosink is not a primary video sink element + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2223> -2009-02-05 17:00:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-18 00:25:18 +0900 Seungha Yang <seungha@centricular.com> - * ext/assrender/Makefile.am: - * ext/assrender/gstassrender.c: - Use GST_VIDEO_CAPS_RGB for the template caps + * gst-libs/gst/codecs/gsth264decoder.c: + * gst-libs/gst/codecs/gsth265decoder.c: + h264decoder,h265decoder: Do not hold codec_data buffer + ... also do not need to extract it from caps. + Decoder uses codec_data only once per set_format() and + baseclass will extract codec_data buffer already. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2212> -2009-02-05 16:57:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-17 23:55:55 +0900 Seungha Yang <seungha@centricular.com> - * ext/assrender/gstassrender.c: - Fix compiler warnings + * sys/d3d11/gstd3d11decoder.cpp: + d3d11decoder: Do not preallocate texture using downstream d3d11 buffer pool + Our decoder implementation does not use downstream d3d11 pool for + decoding because of special requirement of D3D11/DXVA. So preallocation + using the downstream buffer pool will waste GPU memory in most cases. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2211> -2009-02-05 16:54:01 +0100 Benjamin Schmitz <vortex@wolpzone.de> +2022-04-14 13:22:03 +0300 Vivia Nikolaidou <vivia@ahiru.eu> - * configure.ac: - * ext/Makefile.am: - * ext/assrender/Makefile.am: - * ext/assrender/gstassrender.c: - * ext/assrender/gstassrender.h: - Add assrender plugin for rendering ASS/SSA subtitles - This element has the advantage over subparse's ASS/SSA - support that more features are supported, like fading, - by using libass. Fixes bug #481075. + * gst/videoparsers/gsth264parse.c: + h264parse: Include coded-picture-structure info in caps + This reverts commit 652773de366a98e155332bf8ffb83ee5e6bea9e5 and + modifies it to rename the caps field name to coded-picture-structure. + It was previously removed because it confuses the decoder and we didn't + have a valid use case for including it in the encoded caps at this + stage. We now do have such a use case but still don't want to confuse + the decoder, so the field is renamed. + However, it is still not accurate without looking at the SEI picture + structure of each frame, so it was named coded-picture-structure. If its + value is "frame" it is most likely progressive, if it's "field" it is + most likely interlaced or mixed. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2177> + +2022-04-18 12:44:19 +0800 He Junyan <junyan.he@intel.com> + + * sys/va/gstvah264enc.c: + va: h264enc: Fix the forgotten unlock() when getting device path property. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2215> + +2022-04-17 22:25:14 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvdecoder.cpp: + qsvdecoder: Use system memory for non-d3d11 downstream + QSV's memory download implementation seems to be more faster + than our implementation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2206> + +2022-04-17 02:14:50 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvdecoder.cpp: + * sys/qsv/gstqsvh265dec.cpp: + * sys/qsv/gstqsvh265dec.h: + * sys/qsv/meson.build: + * sys/qsv/plugin.cpp: + qsv: Add H.265 decoder + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2206> + +2022-04-17 02:18:37 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvh264dec.cpp: + * sys/qsv/gstqsvutils.cpp: + * sys/qsv/plugin.cpp: + qsv: Include single gstva.h + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2206> + +2022-04-17 02:04:08 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvh264dec.cpp: + qsvh264dec: Don't register element if it's not supported by device + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2206> + +2022-04-17 01:27:10 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvdecoder.cpp: + * sys/qsv/gstqsvdecoder.h: + * sys/qsv/gstqsvh264dec.cpp: + qsvh264dec: Add support for packetized format + Handle avc/avc3 packetized formats + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2206> + +2022-04-17 00:00:55 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvdecoder.cpp: + * sys/qsv/gstqsvencoder.cpp: + * sys/qsv/gstqsvh264dec.cpp: + * sys/qsv/gstqsvh264enc.cpp: + * sys/qsv/gstqsvh265enc.cpp: + * sys/qsv/gstqsvjpegenc.cpp: + * sys/qsv/gstqsvvp9enc.cpp: + * sys/qsv/plugin.cpp: + qsv: Move debug init into each source file + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2206> + +2022-04-16 23:51:05 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvdecoder.cpp: + qsvdecoder: Reset next_task_index per init_session() + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2206> -2009-02-05 10:50:27 +0100 Edward Hervey <bilboed@bilboed.com> +2022-04-16 21:27:57 +0900 Seungha Yang <seungha@centricular.com> - * tests/check/pipelines/metadata.c: - metadata test: Fix wrong looping variable. Test is now valid (but fails). - The inner looping was using the outer looping variable. + * sys/d3d11/gstd3d11decoder.cpp: + d3d11decoder: Copy HDR10 related caps field manually + If negotiate() is called from the set_format() chain, sinkpad may not + hold caps yet, so baseclass cannot copy it over to srcpad caps. + Copy them manually. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2203> -2009-02-04 18:11:03 -0800 Michael Smith <msmith@songbirdnest.com> +2022-04-16 22:27:13 +0900 Seungha Yang <seungha@centricular.com> - * sys/qtwrapper/audiodecoders.c: - Fix up things that the indent thingy complained about + * sys/qsv/gstqsvh264enc.cpp: + * sys/qsv/gstqsvh265enc.cpp: + qsvencoder: Rename property name i-frames to idr-interval + ... and clarify the meaning of the value for each h264 and h265 + encoder since the usage of mfxInfoMFX::IdrInterval is different + per codec. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2204> + +2022-04-16 21:26:55 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvh265enc.cpp: + qsvh265enc: Write HDR10 metadata SEI + If device supports HDR10 metadata API, write the information + into bitstream per IDR. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2204> + +2022-04-13 06:19:40 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * docs/plugins/gst_plugins_cache.json: + gst_plugins_cache.json: Update va plugins. + * Update conditionally-available attribute in vah264enc properties. + * Update GstVaFeature usage. + * Update GstVaEncoderRatecontrol usage. + * Update vapostproc classification. + * Add `add-borders` property in vapostproc. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2169> + +2022-04-13 05:58:46 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvah264enc.c: + vah264enc: Use GstVaFeature enum for enabling MBBRC. + GstVaFeature is a common enumeration for auto/disabled/enabled kind of + property setting. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2169> + +2022-04-13 05:56:59 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvaencoder.c: + * sys/va/gstvaencoder.h: + * sys/va/gstvah264enc.c: + vah264enc: Move rate-control enum to encoder class helper. + Since it's a common enumeration used, as user setting property, for + most of codecs. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2169> + +2022-04-13 05:52:31 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvah264enc.c: + vah264enc: Add device-path property. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2169> -2009-02-04 18:09:58 -0800 Michael Smith <msmith@songbirdnest.com> +2022-04-15 13:19:36 +0000 Corentin Damman <c.damman@intopix.com> - * sys/qtwrapper/audiodecoders.c: - Fix major leaks in qtwrapper audio decoders. - Free the decoder component and audiobufferlist when caps change, or when - disposing element. + * sys/nvcodec/gstcudautils.c: + cudautils: fix critical typo in gst_cuda_buffer_fallback_copy + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2194> -2009-02-04 17:50:51 -0800 Michael Smith <msmith@songbirdnest.com> +2022-04-14 20:10:46 +1000 Brad Hards <bradh@frogmouth.net> - * sys/dshowvideosink/dshowvideofakesrc.cpp: - * sys/dshowvideosink/dshowvideofakesrc.h: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dshowvideosink/dshowvideosink.h: - Handle many more edge cases in dshowvideosink. - Instrument various codepaths with debug messages. - Handle (as best as I could see how - it's pretty nasty) moving a video - window to another monitor. - Add listening for directshow events. + * po/POTFILES.skip: + * tests/interactive/meson.build: + * tests/interactive/pitch-test.c: + * tests/meson.build: + tests: rename 'icles' subdir to be more descriptive + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2178> -2009-02-04 22:50:30 +0100 Josep Torra <n770galaxy@gmail.com> +2022-04-14 08:23:51 +0200 Edward Hervey <edward@centricular.com> - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - mpegpsdemux: fixes clossing segment generation. - Ensure that the clossing segment is generated correctly and being - properly pushed. - Added some GST_DEBUG to check it. - Ensure that last_stop is updated in stream time. - Calculate duration as delta of PTS as it seems more correct than delta - of SCR in some clips that I tested. + * gst/mpegtsdemux/gstmpegdefs.h: + * gst/mpegtsdemux/tsdemux.c: + tsdemux: Fix AC-4 detection + This regression was introduced by + https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1102 + and has been present since 1.18 + * Stream Type 0x06 is defined in the base mpeg-ts specification as Private PES + Packets. Determining the content should be solely based on descriptors found + within the PMT. + * This was abused in that commit by defining a "bluray-only" stream type for AC4 + : `ST_BD_AUDIO_AC4` + * This should be entirely handled in the regular private pes handling further + down in the code + Fixes #1154 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2175> -2009-02-04 22:17:36 +0100 Josep Torra <n770galaxy@gmail.com> +2022-04-10 17:28:03 +0800 He Junyan <junyan.he@intel.com> - * gst/mpegdemux/gstmpegdemux.c: - mpegpsdemux: several fixes on the seeking function in pul mode. - Removed a line wrongly copy pasted in my previous commit. - Avoid an unsigned integer overflow. - Seek last_stop in stream time. - Clamp last_stop in stream time between first and last SCR. - Fixed a typo in the GST_DEBUG line and added some more info. + * sys/va/gstvah264enc.c: + va: h264enc: Correct the hierarchical level name for pyramid-b frames. + The current way names the level by the number of B frames it contains, the + less it contains, the higher level it is. So the non ref B frames are in the + lowest layer and the B frames in the highest level refer to I/P frames. + But the widely used way is just the opposite, the ref B frames are in the + lower level and non ref B frames are at the highest level. + The is just a terminology change, and does not have any effect for compression + result and quality. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2149> -2009-02-04 16:20:40 +0100 Josep Torra <n770galaxy@gmail.com> +2022-04-12 10:34:27 +0800 He Junyan <junyan.he@intel.com> - * gst/mpegdemux/gstmpegdemux.c: - Moved var declarations to the begin of function + * gst-libs/gst/codecparsers/gstav1parser.c: + codecs: av1parser: Fix a typo in seq_level_idx check. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2157> -2009-02-04 16:18:27 +0100 Josep Torra <n770galaxy@gmail.com> +2022-04-13 01:46:34 +0900 Seungha Yang <seungha@centricular.com> - Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gst-plugins-bad + * sys/amfcodec/gstamfh265enc.cpp: + amfh265enc: Handle preset option + Add missing preset option handling + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2165> + +2022-04-13 01:39:43 +0900 Seungha Yang <seungha@centricular.com> + + * sys/amfcodec/gstamfencoder.cpp: + amfencoder: Do shared resource copy only if texture belongs to other device + Staging texture from the same d3d11device can be copied without + shared resource handling + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2165> -2009-02-04 16:11:23 +0100 Josep Torra <n770galaxy@gmail.com> +2022-04-12 01:01:23 +0900 Seungha Yang <seungha@centricular.com> - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - Improved seeking in pull mode. Some refactoring and small fixes + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/meson.build: + win32: Enable high-resolution timer for MinGW build + timeapi.h is missing in our MinGW toolchain. Include mmsystem.h + header instead, which defines struct and APIs in case of our MinGW + toolchain. Note that in case of native Windows10 SDK (MSVC build), + mmsystem.h will include timeapi.h + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2153> -2009-02-04 11:11:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-11 16:03:41 -0500 Olivier Crête <olivier.crete@collabora.com> - * gst/mxf/mxfdemux.c: - Update TODO + * ext/wpe/gstwpevideosrc.cpp: + wpevideosrc: Give WebKit the keyboard, touch and pointer modifiers + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2156> -2009-02-04 11:09:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-11 15:56:19 -0500 Olivier Crête <olivier.crete@collabora.com> - * gst/mxf/mxf.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxftypes.h: - Post an UMID tag with the current package's UMID + * ext/wpe/gstwpevideosrc.cpp: + wpesrc: Convert from utf32 to support other keys + This makes all of the non-letter keys work. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2156> -2009-02-04 10:59:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-11 15:54:05 -0500 Olivier Crête <olivier.crete@collabora.com> - * gst/mxf/mxfdemux.c: - Reset the current partition after seeking and NEWSEGMENT events + * ext/wpe/gstwpevideosrc.cpp: + wpesrc: Initialize key event to 0 + Otherwise, WebKit sees random modifiers + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2156> + +2022-04-12 11:20:00 +0200 Andoni Morales Alastruey <amorales@fluendo.com> + + * sys/amfcodec/gstamfh264enc.cpp: + amfcodec: fix setting quality presets + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2159> -2009-02-04 10:53:52 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-11 10:32:40 +0200 Edward Hervey <edward@centricular.com> * gst/mxf/mxfdemux.c: - In push mode play all remaining parts of the file on EOS if there are any + mxfdemux: Fix issue with re-syncing + In case of re-syncing (i.e. moving to another partition to avoid too much of an + interleave), there was previously no checks to figure out whether a given + partition was already fully handled (i.e. when coming across it again after a + previous resync). + In order to handle this at least for single-track partitions, check whether we + have reached the essence track duration, and if so skip the partition. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2150> -2009-02-04 10:37:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-11 10:31:15 +0200 Edward Hervey <edward@centricular.com> * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - Add property to set the maximum allowed time difference between tracks + mxfdemux: Don't double-increase track position + The essence track position should only be overriden if we sucesfully switched to + another position. In case of EOS we do not want to override it else we would + increase the track position *again* at the end of this function + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2150> -2009-02-04 10:27:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-12 01:49:17 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfdemux.c: - Always set the current package, not only when it was changed - This is necessary as the current package link will be set to NULL - when updated metadata is parsed and should be set here again. + * sys/amfcodec/gstamfencoder.cpp: + * sys/amfcodec/gstamfh264enc.cpp: + * sys/amfcodec/gstamfh265enc.cpp: + * sys/amfcodec/meson.build: + amfcodec: Fix for MinGW build + timeapi.h header might not be missing depending on toolchain. + Also do hard meson error if winmm dep is not available but + amfcodec is explicitly enabled. + And fixing various GCC build warning errors. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2155> + +2022-04-09 23:32:19 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvallocator.cpp: + * sys/qsv/gstqsvallocator_d3d11.cpp: + * sys/qsv/gstqsvencoder.cpp: + * sys/qsv/gstqsvjpegenc.cpp: + * sys/qsv/gstqsvjpegenc.h: + * sys/qsv/meson.build: + * sys/qsv/plugin.cpp: + qsv: Add JPEG encoder + Note that YUY2 is not supported yet, since the format support is not + implemented now. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2142> + +2022-04-10 02:34:17 +0900 Seungha Yang <seungha@centricular.com> + + * docs/plugins/gst_plugins_cache.json: + * sys/amfcodec/gstamfencoder.cpp: + * sys/amfcodec/gstamfh264enc.cpp: + * sys/amfcodec/gstamfh265enc.cpp: + * sys/amfcodec/plugin.cpp: + amfcodec: Update plugin cache + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2143> + +2022-04-09 00:52:07 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstnvencoder.cpp: + * sys/nvcodec/gstnvencoder.h: + * sys/nvcodec/gstnvh264encoder.cpp: + * sys/nvcodec/gstnvh265encoder.cpp: + * tests/examples/nvcodec/nvcodec.c: + nvencoder: Update property names and default values + Update properties of newly written D3D11/CUDA mode encoders + to be consistent with Intel QSV plugin. And rename "zerolatency" + to "zero-reorder-delay" because previous "zerolatency" may + misleading + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2140> + +2022-04-09 00:00:59 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvh264enc.cpp: + * sys/qsv/gstqsvh265enc.cpp: + * sys/qsv/gstqsvvp9enc.cpp: + * tests/examples/qsv/qsvenc-dynamic-reconfigure.c: + qsvencoder: Update property names and default values + Stop using MSDK plugins property naming, instead use unified names + and default values to be consistent with newly written NVIDIA encoders. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2140> + +2022-03-31 04:16:24 +0900 Seungha Yang <seungha@centricular.com> + + * meson_options.txt: + * sys/amfcodec/gstamfencoder.cpp: + * sys/amfcodec/gstamfencoder.h: + * sys/amfcodec/gstamfh264enc.cpp: + * sys/amfcodec/gstamfh264enc.h: + * sys/amfcodec/gstamfh265enc.cpp: + * sys/amfcodec/gstamfh265enc.h: + * sys/amfcodec/gstamfutils.cpp: + * sys/amfcodec/gstamfutils.h: + * sys/amfcodec/meson.build: + * sys/amfcodec/plugin.cpp: + * sys/meson.build: + amfcodec: Add support for h264/h265 encoding + New encoder implementations for AMD GPU using AMF API + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2109> + +2022-03-31 01:36:37 +0900 Seungha Yang <seungha@centricular.com> + + * sys/amfcodec/include/components/ColorSpace.h: + * sys/amfcodec/include/components/Component.h: + * sys/amfcodec/include/components/ComponentCaps.h: + * sys/amfcodec/include/components/PreAnalysis.h: + * sys/amfcodec/include/components/VideoDecoderUVD.h: + * sys/amfcodec/include/components/VideoEncoderHEVC.h: + * sys/amfcodec/include/components/VideoEncoderVCE.h: + * sys/amfcodec/include/core/AudioBuffer.h: + * sys/amfcodec/include/core/Buffer.h: + * sys/amfcodec/include/core/Compute.h: + * sys/amfcodec/include/core/ComputeFactory.h: + * sys/amfcodec/include/core/Context.h: + * sys/amfcodec/include/core/CurrentTime.h: + * sys/amfcodec/include/core/D3D12AMF.h: + * sys/amfcodec/include/core/Data.h: + * sys/amfcodec/include/core/Debug.h: + * sys/amfcodec/include/core/Dump.h: + * sys/amfcodec/include/core/Factory.h: + * sys/amfcodec/include/core/Interface.h: + * sys/amfcodec/include/core/Plane.h: + * sys/amfcodec/include/core/Platform.h: + * sys/amfcodec/include/core/PropertyStorage.h: + * sys/amfcodec/include/core/PropertyStorageEx.h: + * sys/amfcodec/include/core/Result.h: + * sys/amfcodec/include/core/Surface.h: + * sys/amfcodec/include/core/Trace.h: + * sys/amfcodec/include/core/Variant.h: + * sys/amfcodec/include/core/Version.h: + * sys/amfcodec/include/core/VulkanAMF.h: + amfcodec: Import AMF SDK headers + SDK version v1.4.24 at the commit of + https://github.com/GPUOpen-LibrariesAndSDKs/AMF/commit/fbf12cd39fe1812ed902525a1c001307b94871b9 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2109> -2009-02-04 10:19:51 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-09 02:13:57 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfdemux.c: - Try to resolve all synchronization issues, not only the first + * sys/msdk/gstmsdkcontextutil.c: + msdk: Fix Windows build + Headers of gstva should not be included on Windows + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2141> -2009-02-03 17:47:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-08 04:24:36 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfdemux.c: - Remove some checks that will always be TRUE + * sys/d3d11/gstd3d11window_win32.cpp: + d3d11window: Use ANSI version WIN32 API explicitly + We were using ANSI version APIs implicitly because UNICODE is not + defined by ourselves. But potentially it can be broken if user + defines UNICODE. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2131> -2009-02-03 22:27:33 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk> +2022-04-08 04:02:55 +0900 Seungha Yang <seungha@centricular.com> - * configure.ac: - configure.ac: bump core/base requirements to released versions + * sys/d3d11/gstd3d11av1dec.cpp: + * sys/d3d11/gstd3d11screencapturesrc.cpp: + * sys/d3d11/gstd3d11videosink.cpp: + d3d11: Run indent + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2131> -2009-02-02 23:29:24 +0100 Josep Torra <n770galaxy@gmail.com> +2022-03-11 20:46:11 +0900 Seungha Yang <seungha@centricular.com> - * gst/mpegvideoparse/mpegvideoparse.c: - Also flush parser when a newsegment is received. Fixes loop in reverse mode. + * gst-libs/gst/codecparsers/gsth265parser.c: + * gst-libs/gst/codecparsers/gsth265parser.h: + h265parser: Fix short_term_ref_pic_set() size calculation + This field is used by DXVA/NVDEC/VA, and each specification + describes (NVDEC is not well documented) that it's the number of + bits used in short_term_ref_pic_set(). + DXVA doesn't explicitly mention that whether the size of + emulation preventation bytes (EPB) is inclusive or not, but + VA is clearly specifying that it's the size after removing + EPB. Excluding EPB size here makes more sense therefore. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1930> -2009-02-02 23:12:07 +0100 Josep Torra <n770galaxy@gmail.com> +2022-04-06 11:21:25 +0200 Edward Hervey <edward@centricular.com> - * gst/mpegdemux/gstmpegdefs.h: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - * gst/mpegdemux/gstpesfilter.c: - Add pull mode to mpegpsdemux and report duration reading first and last PTS. Some random cleanups. + * gst/mxf/mxfvanc.c: + mxfvanc: Handle empty VANC packets + Some XDCAM recorders store empty packets for VANC, and don't even include the + 2byte length. + Handle them in the same way as VANC packets with 0 packets. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2122> -2009-02-02 17:44:33 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-01 22:52:18 +0900 Sangchul Lee <sc11.lee@samsung.com> - * gst/mxf/mxfdemux.c: - Cleanup playback package selection and notify about the current package + * gst-libs/gst/webrtc/datachannel.c: + * gst-libs/gst/webrtc/webrtc_fwd.h: + webrtc/datachannel: Change initial data channel state to CONNECTING + It complies with http://w3c.github.io/webrtc-pc/#dom-rtcdatachannelstate. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2099> + +2022-04-04 20:47:03 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvencoder.cpp: + qsvencoder: Don't use USAGE_HINT_ENCODER and enable derived image support + Peformance issue by disabled derived image support was reported + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2111> + +2022-04-04 20:36:14 +0900 Seungha Yang <seungha@centricular.com> + + * sys/va/gstvah264enc.c: + Revert "vah264enc: Disable derived image support" + This reverts commit 0011feb0d660f331abde5b1e36f1c56e9cf3b014. + The commit caused performance-wise regression for some platforms + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2111> -2009-02-02 16:23:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-01 15:35:17 +0800 Tong Wu <tong1.wu@intel.com> - * gst/mxf/mxfdemux.c: - Update tags properly, especially on component switch + * sys/msdk/msdk.c: + msdk: use mfxU32 instead of uint32_t + Msdk should use mfx variables defined in mfxdefs.h. Replace uint32_t + with mfxU32. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2091> -2009-02-02 16:05:14 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-01 15:00:01 +0200 Stéphane Cerveau <scerveau@collabora.com> - * gst/mxf/mxfdemux.c: - Error out if no pads could be created + * tests/examples/camerabin2/gst-camerabin2-test.c: + bad: examples: fix unused res warning + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2095> -2009-02-02 15:54:23 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-29 14:42:04 +0200 Johan Sternerup <johast@axis.com> - * gst/mxf/mxfdemux.c: - Resolve metadata and update tracks if necessary before seeking + * ext/webrtc/gstwebrtcice.c: + * ext/webrtc/icestream.c: + * ext/webrtc/icestream.h: + * ext/webrtc/nicetransport.c: + webrtc: Improve robustness of nice agent signal handlers + NiceAgent and it's associated thread is alive for as long as + GstWebRTCICE is alive so make sure any signal handlers connected to + NiceAgent do not access data that is deleted earlier. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2073> + +2022-04-03 22:12:33 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstnvh264encoder.cpp: + * sys/nvcodec/gstnvh265encoder.cpp: + nvcodec: Fix typos + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2107> + +2022-04-03 22:08:51 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstnvencoder.h: + nvencoder: Fix operator overloading + GUID equality check was inverted + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2107> -2009-02-02 15:54:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-04-01 21:09:10 +0100 Tim-Philipp Müller <tim@centricular.com> - * gst/mxf/mxfdemux.c: - Don't go after the last component of a track + * gst-libs/gst/va/meson.build: + libs: va: make sure va-enumtypes.h is generated before it's used + Need to add a dep for the generated header file to the dependency() + so that it gets generated before anyone tries to #include files + from it (which may happen before the actual lib is built because + that's only needed when stuff is linked together later). + See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2057#note_1323236 + and CI build failures in https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2096 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2103> + +2022-04-01 05:02:58 +0900 Seungha Yang <seungha@centricular.com> + + * sys/va/gstvah264enc.c: + vah264enc: Disable derived image support + Behavior of derived image seems to be platform dependent and + it's buggy in some cases. + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1110 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2086> + +2022-04-01 22:47:07 +0800 He Junyan <junyan.he@intel.com> + + * sys/va/gstvah264enc.c: + va: h264enc: Do not use USAGE_HINT_ENCODER for input pool. + It seems that the VA_SURFACE_ATTRIB_USAGE_HINT_ENCODER is used only + for the recon surfaces, if we set this flags for input raw surfaces, + the alignment is wrong and we get broken result. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2100> + +2022-04-01 15:59:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> + + * gst-libs/gst/va/gstvaallocator.c: + va: Fix printf format modifier for drm modifiers + DRM modifiers are 64bit, the printf modifier is platform dependant. Use + the G_GINT64_MODIFIER macro to make this printf portable. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2102> + +2022-03-30 11:06:02 -0400 Xavier Claessens <xavier.claessens@collabora.com> + + * meson.build: + Use gmodule-no-export-2.0 + We don't need `-Wl,--export-dynamic`, that's used only for executables + that needs to export an API to be used by plugins they load. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2031> -2009-02-02 15:53:32 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-25 15:00:20 -0400 Xavier Claessens <xavier.claessens@collabora.com> - * gst/mxf/mxfdemux.c: - Return an error if updating an already existing pad fails + * ext/vulkan/meson.build: + * ext/webrtc/meson.build: + * gst-libs/gst/d3d11/meson.build: + * gst/rtp/meson.build: + * meson.build: + * sys/bluez/meson.build: + * sys/dvb/meson.build: + * tests/check/meson.build: + * tests/examples/ipcpipeline/meson.build: + * tests/examples/opencv/meson.build: + * tests/examples/webrtc/meson.build: + * tests/examples/wpe/meson.build: + * tests/icles/meson.build: + Remove glib and gobject dependencies everywhere + They are part of gst_dep already and we have to make sure to always have + gst_dep. The order in dependencies matters, because it is also the order + in which Meson will set -I args. We want gstreamer's config.h to take + precedence over glib's private config.h when it's a subproject. + While at it, remove useless fallback args for gmodule/gio dependencies, + only gstreamer core needs it. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2031> -2009-02-02 07:44:12 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-24 14:15:00 -0400 Xavier Claessens <xavier.claessens@collabora.com> - * gst/mxf/mxfdemux.c: - Fix seeking if the source clip duration is unknown + * ext/sctp/usrsctp/meson.build: + * meson.build: + Fix cross build with mingw32 + At least on Ubuntu 20.04 the x86_64-w64-mingw32-gcc toolchain defaults + to WinXP. We require at least Vista for FILE_STANDARD_INFO. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2022> + +2022-03-25 22:04:05 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvallocator_va.cpp: + * sys/qsv/gstqsvencoder.cpp: + * sys/qsv/gstqsvh264enc.cpp: + * sys/qsv/gstqsvh265enc.cpp: + * sys/qsv/gstqsvvp9enc.cpp: + qsvencoder: Add support for VA memory + Use VA allocator and buffer pool implementation for zero-copy + encoding with upstream VA elements + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2030> + +2022-03-25 21:03:02 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvallocator_va.h: + * sys/qsv/gstqsvdecoder.cpp: + * sys/qsv/gstqsvencoder.cpp: + qsv: Use pipeline's VA context + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2030> + +2022-03-29 14:52:33 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * gst-libs/gst/va/gstva.h: + * gst-libs/gst/va/gstvaallocator.c: + * gst-libs/gst/va/gstvaallocator.h: + * gst-libs/gst/va/gstvapool.c: + * gst-libs/gst/va/gstvapool.h: + * gst-libs/gst/va/meson.build: + * sys/va/gstvabasedec.c: + * sys/va/gstvabasetransform.c: + * sys/va/gstvaencoder.c: + * sys/va/gstvah264enc.c: + libs: va: add VA allocator parameter for derived images usage. + Added GstVaFeature enum type, and new parameter for VA allocator's + set_format() and get_format(). Also added a new parameter in VA pool + gst_va_pool_new_with_config() and + gst_buffer_pool_config_set_va_allocation_params(). + This new parameter will define if derived images will by used for + buffer mapping. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2057> -2009-02-01 16:59:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-28 21:25:50 +0900 Sangchul Lee <sc11.lee@samsung.com> - * gst/mxf/mxfdemux.c: - Add initial support for seeking in push mode + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/gstwebrtcstats.c: + * tests/check/elements/webrtcbin.c: + webrtcstats: Unify 'packets-lost' data type to int64 + Previously, 'packets-lost' member of RTCReceivedRtpStreamStats had + a value of G_TYPE_INT from rtpsource or a value of G_TYPE_UINT64 + from rtpjitterbuffer. + Because of the negative value of estimated amount of packets lost + in rtpsource as well as the description in + https://www.w3.org/TR/webrtc-stats/#dom-rtcreceivedrtpstreamstats + it is fixed to set this value with G_TYPE_INT64. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2049> + +2022-03-30 12:12:34 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvaencoder.c: + va: encoder: Remove unused allocation config. + Since it's also done inside of gst_va_pool_new_with_config(). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2072> -2009-02-01 16:58:51 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-30 02:49:40 +0900 Seungha Yang <seungha@centricular.com> - * gst/mxf/mxfdemux.c: - Fix deadlocks when seeking in pull mode failed and check new offset before using it + * gst-libs/gst/va/gstvadisplay.c: + * gst-libs/gst/va/gstvautils.c: + vadisplay: Add description readonly property + Expose description of vendor for user information, similar to + the description property of d3d11device. + Also, set description and DRM device path on GstContext structure + so that user can read them and it will be printed on terminal + when gst-launch-1.0 is used + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2064> + +2022-03-30 07:03:59 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * gst-libs/gst/va/gstvaallocator.c: + * gst-libs/gst/va/gstvapool.c: + * gst-libs/gst/va/gstvapool.h: + * gst-libs/gst/va/va_fwd.h: + va: Don't expose internal classes. + VA allocators and pools classes don't need to be exposed as external + symbols. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2070> -2009-02-01 16:58:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-30 12:01:20 +0800 Haihua Hu <jared.hu@nxp.com> - * gst/mxf/mxfdemux.c: - Update offset in push mode and handle events properly + * gst-libs/gst/play/gstplay.c: + gstplay: don't print error log in warning_cb + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2069> -2009-02-01 15:07:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-29 20:14:40 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - Implement initial seeking support (pull mode only) + * sys/va/gstvavpp.c: + vapostproc: Build classification dynamically. + By default, the classification is + "Converter/Filter/Colorspace/Scaler/Video/Hardware", but if VA + post-processor driver supports either color balance, skin tone + enhancement, sharpening or noise reduction, "Effect" is added. + Thus, if vapostproc ranking is raised, it can be chosen by + autovideosink. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2066> -2009-01-31 11:29:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-02-21 14:02:52 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmetadata.c: - Don't use GLib 2.16 API unconditionally + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/gstwebrtcbin.h: + * ext/webrtc/gstwebrtcstats.c: + webrtc: produce stats for all relevant streams + Instead of only using the last ssrc that was pushed into a sink pad. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-30 19:52:59 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-02-11 16:50:42 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - Check for EOS on all pads after adjusting the essence track durations + * ext/webrtc/gstwebrtcbin.c: + webrtc: avoid different versions of gnu-indent always wanting to change !! + Add some sneaky parenthesis to avoid always having to use git commit -n + or revert out hunk of the change. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-30 19:33:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-11-26 22:04:14 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - Fix duration calculation for essence tracks + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/transportstream.c: + * ext/webrtc/transportstream.h: + * tests/check/elements/webrtcbin.c: + webrtc: implement initial simulcast fec/rtx usage + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-30 15:50:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-11-26 22:11:06 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - Implement GstElement::query/get_query_types vfuncs + * ext/webrtc/webrtcdatachannel.c: + * gst-libs/gst/webrtc/datachannel.c: + webrtc/datachannel: fix use-after-free in sctp state notification + g_signal_disconnect*() doesn't stop any existing callbacks from running + which means that if the notify::state callback is in progress in one + thread and the data channel object is finalize()ed in another thread, + then there could be a use-after-free trying lock the data channel + object. + We can't reasonably use a GWeakRef as we don't have a 'parent' object to + free the GWeakRef after the data channel is finalized. This is also + complicated by the fact that the application can hold a reference to the + data channel object that would live beyond the lifetime of webrtcbin + itself. + We solve this by implementing a ghetto weak-ref solution internally with + a list of outstanding data channels. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-30 15:34:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-11-26 22:06:39 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - Reset all internal state in finalize + * tests/check/elements/webrtcbin.c: + tests/webrtc: fix a use-after-free in test_data_channel_close + g_object_weak_ref() is not thread-safe and the data channel object's + refs/unrefs can happen on multiple threads. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-29 20:27:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-11-26 21:51:57 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - Improve EOS detection and fix push mode for the last pushed in buffer + * tests/check/elements/webrtcbin.c: + tests/webrtc: fix a race in the tests related to state tracking + If things progress fast enough, some state changes may not be seen be + the waiting code. + Fix by: + 1. keeping a list of all the state changes + 2. waiting checks each entry and if the relevant state is found, all + states up to and including then are removed. + This ensures that any waits will see all the state sets. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-29 19:58:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-11-26 02:00:12 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - Keep track of essence track position when playing source packages - This ensures that the correct essence elements are played and - that we seek to the correct essence elements. + * tests/check/elements/webrtcbin.c: + tests/webrtc: factor out src pad property checking to a separate function + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-29 19:42:09 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-11-16 19:27:11 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - Compensate for timestamp/duration rounding errors + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/gstwebrtcstats.c: + * ext/webrtc/transportstream.c: + * ext/webrtc/transportstream.h: + * ext/webrtc/webrtctransceiver.c: + * ext/webrtc/webrtctransceiver.h: + * tests/check/elements/webrtcbin.c: + webrtcbin: initial support for sending and receiving simulcast streams + Input (sink pads) is the already-ssrc-muxed stream with the relevant rtp + sdes header extensions already applied: + - mid + - stream-id + - repaired-stream-id + Output (src pads) have the pads separated into individual ssrc's as + that's what rtpbin gives us. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> + +2021-11-16 18:11:49 +1100 Matthew Waters <matthew@centricular.com> + + * tests/check/elements/webrtcbin.c: + tests/webrtc: test for enabled bundled fec/rtx + Doesn't actually check that any fec/rtx happens, just that the pipeline + is vaguely sane and doesn't error. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> + +2021-11-16 17:39:18 +1100 Matthew Waters <matthew@centricular.com> + + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: support multiple received streams for a single mline + Each rtpbin exposed recv_src pad is now exposed as webrtcbin src_%u pad + now with no meaining applied to the value of %u. Previously this used + to mean the mline in the SDP. If this is is still required, then the + transceiver can be retrieved from the pad and the "mlineindex" property + from the transciever. The "mid" is also retrievable from the + transceiver. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-29 15:56:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-11-16 17:28:04 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - Improve EOS logic to check all pads when pulling a packet returned EOS - This makes sure that we finish all pads that are at EOS now instead of - just finishing one and returning to this point over and over again. + * ext/webrtc/gstwebrtcbin.c: + * gst-libs/gst/webrtc/webrtc_fwd.h: + webrtc: explicitly error out in a couple of renegotiation cases + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-29 15:55:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-11-16 17:21:31 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - Only push buffers for pads that are not more than 500ms before other pads + * ext/webrtc/transportstream.c: + webrtc/transportstream: add debug category + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-29 15:39:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-11-03 21:18:53 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - Improve EOS logic to only go into EOS after all tracks are finished + * tests/check/elements/webrtcbin.c: + tests/webrtc: also check valid mline for srcpad codec-preferences negotiation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-28 17:34:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-11-03 20:46:23 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - Update TODO list + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/gstwebrtcbin.h: + webrtcbin: don't name src pads based on the mline specifically anymore + Naming based on the mline doesn't really work with e.g. simulcast + scenarios. + It is entirely possible to retrieve the transceiver and then the mline + from that if that is so required. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-28 16:39:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-10-29 18:40:04 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - Try to keep the timestamp difference between tracks lower than 500ms + * tests/check/elements/webrtcbin.c: + webrtc/tests: print the correct media idx on error + Instead of the attribute index + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-27 15:36:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-10-29 18:38:37 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - Fix playback of atom files + * tests/check/elements/webrtcbin.c: + webrtc/tests: give slightly better names to the dot file dumps + Don't use printf-specifiers with g_strconcat(). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-27 15:27:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-07-21 17:48:34 +1000 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - Keep track of current playback position + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/utils.h: + * tests/check/elements/webrtcbin.c: + webrtcbin: improve some debugging output + - Put human readable names into debug strings. + - Demote some frequent rtpbin signal logging + - Don't use GST_PTR_FORMAT in g_set_error() + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-27 14:38:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-07-21 17:39:11 +1000 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - Set essence track positions to 0 if we're at the start partition + * tests/check/elements/webrtcbin.c: + webrtcbin: silence spurious warning when creating answer transceiver + When creating a transceiver when creating an answer, the media kind of the + transceiver was never set correctly initially. This would lead to a + GST_WARNING being produced about changin a transceiver's media kind. + Fix by retrieving the GstSDPMedia kind from the offer instead as the answer + GstSDPMedia has not been set as the answer caps have not been chosen yet. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-27 14:25:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-07-21 14:29:35 +1000 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfalaw.c: - * gst/mxf/mxfd10.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfdv-dif.c: - * gst/mxf/mxfjpeg2000.c: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfparse.h: - * gst/mxf/mxfup.c: - * gst/mxf/mxfvc3.c: - Generate an index table for essence streams - Generate an index table for essence streams during playback - and make sure that only the correct essence elements are - used for played tracks. - Make it possible to have one essence stream used in multiple - playback tracks. - Fix some minor bugs. + * tests/check/elements/webrtcbin.c: + tests/webrtc: always use a unique SSRC for each stream + Will become more relevant with mid/rid->ssrc mappings + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-27 14:23:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-07-21 14:14:30 +1000 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfmetadata.c: - Don't complain if the preface has no primary package set + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: add a specific find_transceiver_by_mid function + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-26 16:23:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-07-20 20:17:13 +1000 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfparse.c: - Allow index table segments without primer pack - When parsing an index table segment without a valid - primer pack in this partition only parse the static - local tags and ignore all dynamic ones. - This allows us to use index table segments in some - broken files. + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: explicitly use a variable for the rtp session idx + Slightly clearer in meaning. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-26 16:20:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2021-07-01 15:54:34 +1000 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - Add essence track abstraction - Add an abstraction to represent essence tracks and - use this everywhere. This will later be used to keep - track of positions and to generate/handle seek tables. - Some random cleanup and renaming. - -2009-01-26 14:47:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * gst/mxf/mxfparse.c: - Fix parsing of index table segments - Allocate memory for the pos tables and slice offsets - of the index entries separately to a) fix alignment in - weird cases and b) to actually have something to free() - in the index table segment reset function. + * ext/webrtc/gstwebrtcbin.c: + * tests/check/elements/webrtcbin.c: + webrtcbin: support using an a=mid value from the sink/transceiver caps + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1664> -2009-01-26 14:33:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> +2022-03-25 15:56:01 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxftypes.h: - Improve detection of the end of the header metadata - Header metadata is finished after partition.header_byte_count - bytes after the first byte of the primer pack are handled. - After this there can only be index table segments, filler packets, - essence or the start of the next partition. - This fixes playback of some files that have non-standard metadata - packets in the header metadata. + * gst-libs/gst/va/gstva.h: + * gst-libs/gst/va/gstvaallocator.h: + * gst-libs/gst/va/gstvadisplay.c: + * gst-libs/gst/va/gstvadisplay.h: + * gst-libs/gst/va/gstvadisplay_drm.c: + * gst-libs/gst/va/gstvadisplay_drm.h: + * gst-libs/gst/va/gstvadisplay_wrapped.h: + * gst-libs/gst/va/gstvapool.c: + * gst-libs/gst/va/gstvapool.h: + * gst-libs/gst/va/gstvasurfacecopy.h: + * gst-libs/gst/va/gstvautils.c: + * gst-libs/gst/va/gstvautils.h: + * gst-libs/gst/va/gstvavideoformat.h: + * gst-libs/gst/va/va_fwd.h: + * gst-libs/gst/va/vasurfaceimage.h: + * sys/va/gstvaav1dec.c: + * sys/va/gstvabasedec.c: + * sys/va/gstvabasetransform.c: + * sys/va/gstvacaps.c: + * sys/va/gstvadecoder.c: + * sys/va/gstvadeinterlace.c: + * sys/va/gstvadisplay_priv.c: + * sys/va/gstvadisplay_priv.h: + * sys/va/gstvaencoder.c: + * sys/va/gstvaencoder.h: + * sys/va/gstvafilter.c: + * sys/va/gstvah264enc.c: + * sys/va/gstvavpp.c: + * tests/examples/va/main.c: + * tests/examples/va/multiple-vpp.c: + va: Set <gst/va/gstva.h> as library single point entry header. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2048> -2009-01-30 18:27:03 -0800 Michael Smith <msmith@songbirdnest.com> +2022-02-23 15:40:19 +0800 He Junyan <junyan.he@intel.com> - * gst/selector/gstinputselector.c: - Unref event if we don't forward it, unref pads when done with them. + * gst-libs/gst/va/gstvaallocator.c: + * gst-libs/gst/va/gstvaallocator.h: + * gst-libs/gst/va/gstvapool.c: + * gst-libs/gst/va/gstvapool.h: + * gst-libs/gst/va/gstvasurfacecopy.c: + * gst-libs/gst/va/gstvasurfacecopy.h: + * gst-libs/gst/va/meson.build: + * gst-libs/gst/va/vasurfaceimage.c: + * gst-libs/gst/va/vasurfaceimage.h: + * sys/va/gstvaav1dec.c: + * sys/va/gstvabasedec.c: + * sys/va/gstvabasetransform.c: + * sys/va/gstvadecoder.c: + * sys/va/gstvadeinterlace.c: + * sys/va/gstvaencoder.c: + * sys/va/gstvafilter.c: + * sys/va/gstvah264enc.c: + * sys/va/gstvavpp.c: + * sys/va/meson.build: + va: Move allocators and pool objects into gstva library. + In order to other plugins use gstva objects, such as allocators and buffer + pools, this merge request move them from the va plugin to the gstva library. + This objects are not exposed in <gst/va/gstva.h> since they are not expected + to be used by users, only by plugin implementators. + Because of the surface copy design, which is used to implement allocator's + mem_copy() virtual function, depends on the vafilter, which is kept inside + the plugin, memory copy through VAPosproc is disabled and removed temporarly. + Also added some missing parameter validation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2048> -2009-01-30 22:28:11 +0200 Stefan Kost <ensonic@users.sf.net> +2022-02-23 15:25:08 +0800 He Junyan <junyan.he@intel.com> - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - Add releaseinfo with online url. + * gst-libs/gst/va/gstvavideoformat.c: + * gst-libs/gst/va/gstvavideoformat.h: + * gst-libs/gst/va/meson.build: + * sys/va/gstvaallocator.c: + * sys/va/gstvabasedec.c: + * sys/va/gstvacaps.c: + * sys/va/gstvadecoder.c: + * sys/va/gstvadisplay_priv.c: + * sys/va/gstvafilter.c: + * sys/va/meson.build: + * sys/va/vasurfaceimage.c: + va: Move the video format functions into gstlibva. + Untabifying header file. + The logging category was moved from the plugin generic category to + the display category. It can argue that video formats hacks are + display dependant. + Added validations for input parameters. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2048> + +2022-03-27 23:27:54 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvencoder.cpp: + * sys/qsv/gstqsvencoder.h: + * sys/qsv/gstqsvh264enc.cpp: + * sys/qsv/gstqsvh265enc.cpp: + * sys/qsv/gstqsvvp9enc.cpp: + * tests/examples/meson.build: + * tests/examples/qsv/key-handler.c: + * tests/examples/qsv/key-handler.h: + * tests/examples/qsv/meson.build: + * tests/examples/qsv/qsvenc-dynamic-reconfigure.c: + qsvencoder: Add support for dynamic bitrate update + ... and add more encoding options. + QSV API supports dynamic bitrate change without IDR insertion. + That's more efficient way of runtime encoding option update + than starting from new sequence with IDR per bitrate option change. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2039> + +2022-03-25 23:15:33 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvh265enc.cpp: + qsvh265enc: Add missing gop-size property + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2039> + +2022-03-25 21:13:22 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvallocator.cpp: + qsv: Fix mfxFrameAllocator::Lock for encoder + Only read map is possible for encoder input system memory + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2039> -2009-01-30 18:20:17 +0000 Jan Schmidt <jan.schmidt@sun.com> +2022-03-28 20:51:35 +1100 Matthew Waters <matthew@centricular.com> - * gst/dccp/gstdccp.c: - Fix compilation on Forte. - Dereference the pointer to the passed socket to check the actual fd - when closing them. - Cast an assignment to kill a warning. + * sys/applemedia/videotexturecache.m: + applemeida/texturecache: remove unused variable + Fixes: + ../sys/applemedia/videotexturecache.m:71:20: error: variable 'features' set but not used -Werror,-Wunused-but-set-variable + GstCapsFeatures *features; + ^ + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2046> -2009-01-30 18:18:10 +0000 Jan Schmidt <jan.schmidt@sun.com> +2022-03-28 20:50:27 +1100 Matthew Waters <matthew@centricular.com> - * gst/aacparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.c: - Fix the return value of the default parse_frame function. - Fix the return value of the default parse_frame function in both - copies of GstBaseParse + * sys/applemedia/corevideobuffer.c: + applemedia/corevideobuffer: remove unused variable + Fixes: + ../sys/applemedia/corevideobuffer.c:209:19: error: variable 'video_meta' set but not used -Werror,-Wunused-but-set-variable + GstVideoMeta *video_meta; + ^ + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2046> -2009-01-30 17:31:33 +0000 Jan Schmidt <thaytan@noraisin.net> +2022-03-28 20:49:01 +1100 Matthew Waters <matthew@centricular.com> - * common: - Bump common + * sys/applemedia/iosurfaceglmemory.c: + applemedia/iosgl: remove unused variable + Fixes: + ../sys/applemedia/iosurfaceglmemory.c:219:41: error: variable 'texfmt' set but not used -Werror,-Wunused-but-set-variable + GLuint tex_id, tex_target, texifmt, texfmt; + ^ + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2046> -2009-01-30 08:54:42 +0100 Edward Hervey <bilboed@bilboed.com> +2022-03-28 20:37:54 +1100 Matthew Waters <matthew@centricular.com> - * autogen.sh: - * common: - Use a symbolic link for the pre-commit client-side hook + * sys/applemedia/vtdec.c: + vtdec: remove unused variable + Fixes: + ../sys/applemedia/vtdec.c:611:35: error: variable 'output_flags' set but not used -Werror,-Wunused-but-set-variable + VTDecodeFrameFlags input_flags, output_flags; + ^ + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2046> -2009-01-29 17:59:35 -0200 Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br> +2022-03-28 20:24:59 +1100 Matthew Waters <matthew@centricular.com> - * sys/qtwrapper/audiodecoders.c: - * sys/qtwrapper/codecmapping.h: - * sys/qtwrapper/qtutils.h: - * sys/qtwrapper/qtwrapper.h: - qtwrapper: Fixes build at case sensitive systems. + * sys/applemedia/avsamplevideosink.m: + avsamplevideosink: remove unused variable + Fixes + ../sys/applemedia/avsamplevideosink.m:80:20: error: variable 'gstelement_class' set but not used -Werror,-Wunused-but-set-variable + GstElementClass *gstelement_class; + ^ + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2046> -2009-01-28 12:41:36 +0000 Josep Torra <josep@fluendo.com> +2022-03-28 20:11:29 +1100 Matthew Waters <matthew@centricular.com> - * gst/mpegdemux/gstpesfilter.c: - mpegdemux: do not skip pes packets that we think are encrypted - pes packets that claim to be encrypted may not be so, so treat as normal. - Just log the flags. - -2009-01-28 13:25:14 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmuxmap.c: - Additional media type support in qtmux (and friends). - Support AMR and H263 for both qtmux and gppmux, - and add extensions in sample table description. + * sys/applemedia/avfassetsrc.m: + avfassetsrc: fix unused-but-set warning + ../sys/applemedia/avfassetsrc.m:1014:12: error: variable 'caps' set but not used -Werror,-Wunused-but-set-variable + GstCaps *caps; + ^ + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2046> -2009-01-28 12:27:42 +0000 Zaheer Merali <zaheerabbas@merali.org> +2022-03-28 19:42:04 +1100 Matthew Waters <matthew@centricular.com> - * common: - * gst/mpegdemux/gstpesfilter.c: - Revert "mpegdemux: do not skip pes packets that we think are encrypted" - This reverts commit d3e4e5598f6c3db444d0014597d383ed35a02998. + * gst/speed/gstspeed.c: + speed: fix unused-but-set warning + ../gst/speed/gstspeed.c:523:39: error: variable 'base' set but not used -Werror,-Wunused-but-set-variable + gint64 start_value, stop_value, base; + ^ + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2046> -2009-01-28 12:06:49 +0000 Josep Torra <josep@fluendo.com> +2022-03-28 18:38:23 +1100 Matthew Waters <matthew@centricular.com> - * common: - * gst/mpegdemux/gstpesfilter.c: - mpegdemux: do not skip pes packets that we think are encrypted - pes packets that claim to be encrypted may not be so, so treat as normal. - Just log the flags. - -2009-01-24 18:13:39 +0100 Hans de Goede <jwrdegoede@fedoraproject.org> - - * configure.ac: - * docs/plugins/Makefile.am: - * ext/Makefile.am: - * ext/modplug/Makefile.am: - * ext/modplug/gstmodplug.cc: - * ext/modplug/gstmodplug.h: - * gst/modplug/libmodplug/Makefile.am: - * gst/modplug/libmodplug/README: - * gst/modplug/libmodplug/changes.txt: - * gst/modplug/libmodplug/fastmix.cpp: - * gst/modplug/libmodplug/it_defs.h: - * gst/modplug/libmodplug/load_669.cpp: - * gst/modplug/libmodplug/load_amf.cpp: - * gst/modplug/libmodplug/load_ams.cpp: - * gst/modplug/libmodplug/load_dbm.cpp: - * gst/modplug/libmodplug/load_dmf.cpp: - * gst/modplug/libmodplug/load_dsm.cpp: - * gst/modplug/libmodplug/load_far.cpp: - * gst/modplug/libmodplug/load_it.cpp: - * gst/modplug/libmodplug/load_j2b.cpp: - * gst/modplug/libmodplug/load_mdl.cpp: - * gst/modplug/libmodplug/load_med.cpp: - * gst/modplug/libmodplug/load_mod.cpp: - * gst/modplug/libmodplug/load_mt2.cpp: - * gst/modplug/libmodplug/load_mtm.cpp: - * gst/modplug/libmodplug/load_okt.cpp: - * gst/modplug/libmodplug/load_psm.cpp: - * gst/modplug/libmodplug/load_ptm.cpp: - * gst/modplug/libmodplug/load_s3m.cpp: - * gst/modplug/libmodplug/load_stm.cpp: - * gst/modplug/libmodplug/load_ult.cpp: - * gst/modplug/libmodplug/load_umx.cpp: - * gst/modplug/libmodplug/load_wav.cpp: - * gst/modplug/libmodplug/load_xm.cpp: - * gst/modplug/libmodplug/mmcmp.cpp: - * gst/modplug/libmodplug/modplug.cpp: - * gst/modplug/libmodplug/modplug.h: - * gst/modplug/libmodplug/snd_dsp.cpp: - * gst/modplug/libmodplug/snd_flt.cpp: - * gst/modplug/libmodplug/snd_fx.cpp: - * gst/modplug/libmodplug/sndfile.cpp: - * gst/modplug/libmodplug/sndfile.h: - * gst/modplug/libmodplug/sndmix.cpp: - * gst/modplug/libmodplug/stdafx.h: - * gst/modplug/libmodplug/tables.cpp: - * gst/modplug/libmodplug/tables.d: - Build the modplug plugin against the modplug library and remove our copy - Always build the modplug plugin against the system modplug library - and remove our own copy. Using the system version has advantages - if security issues or other critical bugs are found in libmodplug - and our own copy wasn't really maintained anyway. - Also our copy only contained some patches to use GLib types and functions. - Fixes bug #568837. - -2009-01-23 23:42:28 +0000 Jan Schmidt <thaytan@noraisin.net> - - * .gitignore: - * po/.gitignore: - Add more to the gitignores - -2009-01-23 14:02:26 +0000 Jan Schmidt <thaytan@noraisin.net> - - * gst/rawparse/gstvideoparse.c: - Make RGB masks unsigned in rawvideoparse - Allow the full range of 32 bit masks for RGBA/RGB data by making sure - the mask properties are unsigned. - -2009-01-23 16:09:51 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/timidity/README: - Add README with midi related links. - -2009-01-23 16:00:10 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/faad/gstfaad.c: - * gst/aacparse/gstaacparse.c: - Log aac details found in codec_data. - -2009-01-23 14:43:00 +0200 Stefan Kost <ensonic@users.sf.net> - - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadatamux.h: - * ext/metadata/metadataexif.c: - * ext/metadata/metadataexif.h: - Configure byte order for EXIF. Fixes #568704 - Exif blocks can be in differnt byte orders. Add an element property to select wich one should be written. - -2009-01-23 12:46:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-aiffparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-amrwb.xml: - * docs/plugins/inspect/plugin-apex.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dc1394.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-deinterlace2.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-flv.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegdemux2.xml: - * docs/plugins/inspect/plugin-mpegtsmux.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-ofa.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-pcapparse.xml: - * docs/plugins/inspect/plugin-qtmux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-resindvd.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-twolame.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - * gst/legacyresample/Makefile.am: - * gst/legacyresample/buffer.c: - * gst/legacyresample/buffer.h: - * gst/legacyresample/debug.c: - * gst/legacyresample/debug.h: - * gst/legacyresample/functable.c: - * gst/legacyresample/functable.h: - * gst/legacyresample/gstlegacyresample.c: - * gst/legacyresample/gstlegacyresample.h: - * gst/legacyresample/resample.c: - * gst/legacyresample/resample.h: - * gst/legacyresample/resample_chunk.c: - * gst/legacyresample/resample_functable.c: - * gst/legacyresample/resample_ref.c: - * tests/check/Makefile.am: - * tests/check/elements/legacyresample.c: - Rename audioresample files and types to legacyresample - Finish the move/rename of audioresample to legacyresample - to prevent any confusion. - -2009-01-23 12:39:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk> - - * docs/plugins/inspect/plugin-speexresample.xml: - * gst/speexresample/Makefile.am: - * gst/speexresample/README: - * gst/speexresample/arch.h: - * gst/speexresample/fixed_generic.h: - * gst/speexresample/gstspeexresample.c: - * gst/speexresample/gstspeexresample.h: - * gst/speexresample/resample.c: - * gst/speexresample/speex_resampler.h: - * gst/speexresample/speex_resampler_float.c: - * gst/speexresample/speex_resampler_int.c: - * gst/speexresample/speex_resampler_wrapper.h: - Remove speexresample from -bad, it's in -base - -2009-01-23 12:13:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk> - - * gst/rtpmanager/rtpstats.c: - Send BYE packets immediatly for small sessions - When the number of participants is less than 50, the RFC allows for sending the - BYE packet immediatly instead of using the regular BYE timeout. - Fixes #567828. - -2009-01-23 11:50:29 +0100 Hans de Goede <jwrdegoede@fedoraproject.org> - - * configure.ac: - * ext/libmms/gstmms.c: - * ext/libmms/gstmms.h: - Add seeking support to mmssrc. Fixes bug #469930. - Add proper seeking support to mmssrc and clean - up some code. This requires libmms >= 0.4. - -2009-01-23 10:44:20 +0100 Brian Cameron <brian.cameron@sun.com> - - * gst/modplug/Makefile.am: - Link modplug plugin with -lm. Fixes bug #568483. - -2009-01-23 10:11:52 +0100 Brian Cameron <brian.cameron@sun.com> - - * configure.ac: - * gst/dccp/gstdccp.c: - Fix build on Solaris. Fixes bug #568480. - Fix linking on Solaris by checking for the nsl and socket - libraries which are needed for socket() and gethostbyname(). - Don't initialize some fields of struct mh to NULL/0, they're - already set to NULL/0 by a memset(). Also this fields don't - exist on Solaris. + * ext/resindvd/gstpesfilter.c: + resindvd: silence unused-but-set warning + ../ext/resindvd/gstpesfilter.c:117:11: error: variable 'STD_buffer_size_bound' set but not used -Werror,-Wunused-but-set-variable + guint16 STD_buffer_size_bound; + ^ + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2046> -2009-01-22 14:37:21 +0100 Sebastian Dröge <slomo@circular-chaos.org> +2022-03-28 18:23:20 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfparse.c: - * gst/mxf/mxftypes.h: - Store all partitions & primer packs in memory for faster access - Store all partitions & primer packs in memory for faster access. - This is later needed for fast seeking. - Pre-fill the list of partitions with the content of the random - index pack. - Don't parse metadata of an partition twice. + * gst/mpegtsmux/gstbasetsmux.c: + mpegts: don't shadow res variable + Fixes unused-but-set warning: + ../gst/mpegtsmux/gstbasetsmux.c:2115:43: error: variable 'res' set but not used -Werror,-Wunused-but-set-variable + gboolean all_headers, done = FALSE, res = FALSE; + ^ + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2046> -2009-01-22 18:20:03 +0200 Stefan Kost <ensonic@users.sf.net> +2022-03-28 18:12:43 +1100 Matthew Waters <matthew@centricular.com> - * common: - Update common snapshot. + * gst-libs/gst/mpegts/gst-dvb-section.c: + mpeg: fix unused-but-set warning + ../gst-libs/gst/mpegts/gst-dvb-section.c:206:9: error: variable 'i' set but not used -Werror,-Wunused-but-set-variable + guint i = 0, allocated_events = 12; + ^ + ../gst-libs/gst/mpegts/gst-dvb-section.c:365:9: error: variable 'i' set but not used -Werror,-Wunused-but-set-variable + guint i = 0, allocated_streams = 12; + ^ + ../gst-libs/gst/mpegts/gst-dvb-section.c:543:9: error: variable 'i' set but not used -Werror,-Wunused-but-set-variable + guint i = 0, allocated_streams = 12; + ^ + ../gst-libs/gst/mpegts/gst-dvb-section.c:885:9: error: variable 'i' set but not used -Werror,-Wunused-but-set-variable + guint i = 0, allocated_services = 8; + ^ + ../gst-libs/gst/mpegts/gst-dvb-section.c:1316:9: error: variable 'i' set but not used -Werror,-Wunused-but-set-variable + guint i = 0, allocated_services = 8; + ^ + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2046> -2009-01-22 14:00:57 +0100 Wim Taymans <wim.taymans@collabora.co.uk> +2022-03-28 10:10:45 +0300 Sebastian Dröge <sebastian@centricular.com> - * win32/common/config.h: - Update config.h for development. + * docs/plugins/gst_plugins_cache.json: + video-format: Move NV12_8L128 into the correct position in GST_VIDEO_FORMATS_ALL + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2045> -2009-01-22 13:46:44 +0100 Sebastian Dröge <slomo@circular-chaos.org> +2022-03-28 15:56:22 +1100 Matthew Waters <matthew@centricular.com> - * common: - Fix pre-commit hook + * gst/mpegdemux/gstpesfilter.c: + mpegdemux: silence unused-but-set werror + ../gst/mpegdemux/gstpesfilter.c:117:11: error: variable 'STD_buffer_size_bound' set but not used -Werror,-Wunused-but-set-variable + guint16 STD_buffer_size_bound; + ^ + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2044> -2009-01-22 13:39:34 +0100 Jan Urbanski <j.urbanski@students.mimuw.edu.pl> +2022-03-25 14:25:02 +1100 Andrew Pritchard <andrew@vivi.io> - * gst/flv/gstflvparse.c: - Add support for ECMA arrays in script tags. Fixes bug #567965. - Add support for ECMA arrays in script tags. This fixes - seeking on some files that have the seek table stored - inside an ECMA array instead of the normal array. + * sys/androidmedia/jni/gstamcsurfacetexture-jni.c: + Fix GstAmcSurfaceTexture segfault Check that `self` and `self->callback` are defined. `self` can be set to `NULL` in `remove_listener`, and `self->callback` can be set to `NULL` inside `gst_amc_surface_texture_jni_set_on_frame_available_callback`. This can cause a segfault since the Java object can outlive the C object, and call the callback after `remove_listener` is called. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2024> -2009-01-22 13:33:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk> +2022-03-23 17:31:37 +1100 Matthew Waters <matthew@centricular.com> - * gst/rtpmanager/gstrtpjitterbuffer.c: - Unlock the jitterbuffer before pushing out the packet-lost events. Move some code before we do the unlock to make the jitterbuffer state consistent while we are unlocked. + * ext/closedcaption/gstccconverter.c: + * ext/closedcaption/gstccconverter.h: + * tests/check/elements/ccconverter.c: + ccconverter: ensure correct ordering of cea608 across output buffers + e.g. if a 60fps output is configured, we can only produce a single field + of cea608 that must alternate between field 1 and field 2. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2019> -2009-01-22 11:54:45 +0100 Sebastian Dröge <slomo@circular-chaos.org> +2022-03-23 15:13:10 +1100 Matthew Waters <matthew@centricular.com> - * gst/mxf/mxfmpeg.c: - Fix UL for DTS and MPEG2 layer 1 + * ext/closedcaption/gstccconverter.c: + * tests/check/elements/ccconverter.c: + ccconverter: ignore padding cea608 data even if marked as 'valid' + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2019> -2009-01-22 11:54:15 +0100 Sebastian Dröge <slomo@circular-chaos.org> +2022-03-23 10:36:28 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * gst/mxf/mxfmpeg.c: - Add support for AAC audio + * sys/v4l2codecs/gstv4l2decoder.c: + v4l2codecs: Detect missing M2M_HOLD_CAPTURE_BUF + Produce an error if we try to use the feature of holding capture buffer + but it is not supported by the driver. Ingoring this can lead to stalls + as the driver will run-out of capture buffer to decode into. This + affects slice decoders but also split-field interlaced decoding. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2009> + +2022-03-23 09:11:35 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> + + * sys/v4l2codecs/gstv4l2codech264dec.c: + v4l2codecs: h264: Set other field poc if available + Whenever the other field POC is available, pass it back to the + driver. This should not be strictly required, but it makes things + easier to debug and more forgiven. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2009> -2009-01-22 11:47:48 +0100 Sebastian Dröge <slomo@circular-chaos.org> +2021-12-21 10:59:37 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfparse.c: - * gst/mxf/mxfparse.h: - Store MXF metadata in a hash table, keyed by UID - Store the MXF metadata in a hash table, keyed by the - instance UID. This simplifies resolval of the metadata - and makes looping over all metadata sets unnecessary - in most cases. - Additionally parse metadata always. If we already have - a metadata set with the same UID replace it only if - the new metadata set is from a later offset. This - fixes metadata parsing of files where following partitions - don't have a complete copy of the previous metadata. + * sys/v4l2codecs/gstv4l2codech264dec.c: + * sys/v4l2codecs/gstv4l2decoder.c: + * sys/v4l2codecs/gstv4l2decoder.h: + v4l2codecs: Trace request by it FD + This helps when crossing the debug logs with the kernel logs. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2009> -2009-01-22 11:44:46 +0100 Sebastian Dröge <slomo@circular-chaos.org> +2021-12-21 10:55:58 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - Build the random index pack while parsing - If the file contains no random index pack or just - an invalid one build the random index pack while - parsing. + * sys/v4l2codecs/gstv4l2codech264dec.c: + v4l2codecs: h264: Fix dpb entry flag FLAG_FIELD + The logic to guess back this value was broken. Use the value + now saved into the picture instead. This was tested using + LibreELEC patched 5.15 kernel, and fixed the interlaced decode + issues. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2009> -2009-01-22 11:43:56 +0100 Sebastian Dröge <slomo@circular-chaos.org> +2021-12-21 10:52:32 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfaes-bwf.h: - * gst/mxf/mxfalaw.c: - * gst/mxf/mxfalaw.h: - * gst/mxf/mxfd10.c: - * gst/mxf/mxfd10.h: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfdms1.h: - * gst/mxf/mxfdv-dif.c: - * gst/mxf/mxfdv-dif.h: - * gst/mxf/mxfjpeg2000.c: - * gst/mxf/mxfjpeg2000.h: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfmpeg.h: - * gst/mxf/mxfparse.c: - * gst/mxf/mxfparse.h: - * gst/mxf/mxftypes.h: - * gst/mxf/mxfup.c: - * gst/mxf/mxfup.h: - * gst/mxf/mxfvc3.c: - * gst/mxf/mxfvc3.h: - Update copyrights for 2009 + * gst-libs/gst/codecs/gsth264decoder.c: + * gst-libs/gst/codecs/gsth264picture.h: + codecs: h264: Save the field_pic_flag + This flag is set when the stream is interlaced and the specific + slice is made of single parity fields rather the paired at the + macroblock layer. This is rarely needed in late decoding process + but the Rockchip RKVDEC HW interface requires it, hence needs to + be passed through V4L2 Stateless interface. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2009> -2009-01-22 11:42:24 +0100 Sebastian Dröge <slomo@circular-chaos.org> +2022-03-25 13:26:52 -0400 Xavier Claessens <xavier.claessens@collabora.com> - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfdms1.h: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfparse.c: - * gst/mxf/mxfparse.h: - Simplify parsing of UL/UUID arrays - Simplify parsing of UL/UUID arrays by abstracting it - into a separate function. - -2009-01-22 11:37:22 +0100 Sebastian Dröge <slomo@circular-chaos.org> - - * gst/mxf/mxf.c: - * gst/mxf/mxfalaw.c: - * gst/mxf/mxfd10.c: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfdms1.h: - * gst/mxf/mxfjpeg2000.c: - * gst/mxf/mxfmetadata.c: - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfup.c: - * gst/mxf/mxfvc3.c: - Implement parsing of DMS1 (SMPTE S380M) + * tests/examples/d3d11/d3d11device.cpp: + d3d11: Fix example build error + ``` + ../subprojects/gst-plugins-bad/tests/examples/d3d11/d3d11device.cpp:129:50: error: invalid conversion from ‘int’ to ‘DXGI_FORMAT’ -fpermissive + 129 | D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc = { 0, }; + ``` + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2029> -2009-01-22 11:00:59 +0100 Sebastian Dröge <slomo@circular-chaos.org> +2022-03-18 16:59:32 +0000 Thibault Saunier <tsaunier@igalia.com> - * configure.ac: - Disable the filter plugin from the build - The filter plugin only contains a limited IIR filter element - which is now obsoleted by the audioiirfilter element from - gst-plugins-good/audiofx. + * ext/directfb/dfbvideosink.c: + * ext/opencv/gsthanddetect.cpp: + * ext/vulkan/vksink.c: + * sys/d3d11/gstd3d11videosink.cpp: + * sys/d3dvideosink/d3dhelpers.c: + * tests/check/pipelines/ipcpipeline.c: + navigation: Add support for key Modifiers in all relevant events + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2010> -2009-01-22 11:56:34 +0000 Jan Schmidt <thaytan@noraisin.net> +2022-03-24 21:39:30 +0800 He Junyan <junyan.he@intel.com> - * configure.ac: - Back to devel -> 0.10.10.1 + * sys/va/gstvah265dec.c: + va: h265dec: Fix a crash because of missing reference frame. + Some problematic H265 stream may miss the reference frame in the DPB, + and get some message like: "No short term reference picture for xxx". + So there may be empty entries in ref_pic_list0/1 when passing to + decode_slice() function of sub class. We need to check the NULL pointer. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2018> -2009-01-22 06:12:55 +0100 Edward Hervey <bilboed@bilboed.com> +2022-03-24 15:19:27 +0800 Chun-wei Fan <fanchunwei@src.gnome.org> - * autogen.sh: - * common: - Install and use pre-commit indentation hook from common + * ext/openexr/meson.build: + openexr: Specify modules when finding OpenEXR. + Specify modules to look for OpenEXR when CMake is used, as we may have + CMake config files instead of pkg-config files that result from building + OpenEXR, which may be built with CMake which is typically the case on Visual + Studio builds. + In this case, Meson does seem to find the 'OpenEXR' package with CMake + after trying pkg-config, but does not consider it enough without the + 'modules:' argument. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2014> -2009-01-21 12:22:54 +0100 Andy Wingo <wingo@oblong.net> +2022-03-22 00:30:28 +0900 Sangchul Lee <sc11.lee@samsung.com> - * configure.ac: - Revert "add audiobuffer to the build" - This reverts commit 1c6ac170b9f218c673c0daaf5c568c6000a37fc3. + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: Update documentation of 'get-stats' action signal + Some stats fields are updated according to the current implementation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2005> -2009-01-21 12:18:49 +0100 Andy Wingo <wingo@oblong.net> +2022-03-25 00:27:42 +0100 Mathieu Duponchelle <mathieu@centricular.com> - add audiobuffer to the build - * configure.ac: Add audiobuffer to the build. + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/webrtctransceiver.c: + * ext/webrtc/webrtctransceiver.h: + * tests/check/elements/webrtcbin.c: + Revert "webrtcbin: fix msid line and allow customization" + This reverts commit 3cad3455377d5a22faa138d9df840257059776c8. + That commit was breaking the association between an audio and + a video track in the standard case. + In practice, to support carrying separate MediaStream, we are + going a way to map what MediaStreamTrack belong to what MediaStream, + but that will require some thinking about the API. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2023> -2009-01-21 04:32:16 +0100 Edward Hervey <bilboed@bilboed.com> +2022-03-24 19:55:48 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - * autogen.sh: - autogen.sh : Use git submodule + * gst/mpegtsdemux/mpegtspacketizer.c: + * gst/mpegtsdemux/mpegtspacketizer.h: + * gst/mpegtsdemux/tsdemux.c: + tsdemux: Don't check SCTE events for being too far from the PCR + Otherwise it happens that SCTE events can only be scheduled up to 15 + seconds since the last seen PCR, which is a useless restriction. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2021> -=== release 0.10.10 === +2022-03-21 23:03:36 +0100 Mathieu Duponchelle <mathieu@centricular.com> -2009-01-19 23:15:36 +0000 Jan Schmidt <thaytan@mad.scientist.com> + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/webrtctransceiver.c: + * ext/webrtc/webrtctransceiver.h: + * tests/check/elements/webrtcbin.c: + webrtcbin: fix msid line and allow customization + From https://datatracker.ietf.org/doc/html/draft-ietf-mmusic-msid-16: + > Multiple media descriptions with the same value for msid-id and + > msid-appdata are not permitted. + Our previous implementation of simply using the CNAME as the msid + identifier and the name of the transceiver as the msid appdata was + misguided and incorrect, and created issues when bundling multiple + video streams together: the ontrack event was emitted with the same + streams for the two bundled medias, at least in Firefox. + Instead, use the transceiver name as the identifier, and expose + a msid-appdata property on transceivers to allow for further + customization by the application. When the property is not set, + msid-appdata can be left empty as it is specified as optional. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2003> - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-legacyresample.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-twolame.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - * gst-plugins-bad.doap: - * po/LINGUAS: - * win32/common/config.h: - Release 0.10.10 - Original commit message from CVS: - Release 0.10.10 - -2009-01-19 22:41:58 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ky.po: - * po/lt.po: - * po/mt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - Original commit message from CVS: - Update .po files - -2009-01-09 23:44:38 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: 0.10.9.3 pre-release - Original commit message from CVS: - * configure.ac: - 0.10.9.3 pre-release - -2009-01-09 22:09:06 +0000 David Schleef <ds@schleef.org> - - gst/mpegdemux/gstmpegtsdemux.c: Don't forward duration requests in BYTES, since the returned value doesn't mean anyth... - Original commit message from CVS: - * gst/mpegdemux/gstmpegtsdemux.c: - Don't forward duration requests in BYTES, since the returned - value doesn't mean anything. Fixes #566959 - -2009-01-09 21:59:48 +0000 David Schleef <ds@schleef.org> - - gst/qtmux/gstqtmuxmap.c: Add video/x-qt-part and video/x-m4-part to caps so schroenc/schroparse can use it. Fixes #5... - Original commit message from CVS: - * gst/qtmux/gstqtmuxmap.c: Add video/x-qt-part and video/x-m4-part - to caps so schroenc/schroparse can use it. Fixes #566958 - -2009-01-09 16:49:57 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/resindvd/resindvdsrc.c: Additional patch for resin fixes time-based seeking in titles that don't start at sector ... - Original commit message from CVS: - * ext/resindvd/resindvdsrc.c: - Additional patch for resin fixes time-based seeking in titles - that don't start at sector 0 in the VTS, and fixes interpretation - of the cell elapsed time, so that it reports the correct time after - the seek completes. - Really fixes #566957. - -2009-01-08 17:57:19 +0000 Brian Cameron <brian.cameron@sun.com> - - ext/ladspa/search.c: Avoid searching (null) paths or crashing on platforms where printing a - Original commit message from CVS: - Based on Patch by: Brian Cameron <brian dot cameron at sun dot com> - * ext/ladspa/search.c: (LADSPAPluginSearch): - Avoid searching (null) paths or crashing on platforms where printing a - NULL string segfaults. Fixes #567004. - -2009-01-08 12:42:18 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/resindvd/: Add support for time based seeking. - Original commit message from CVS: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - * ext/resindvd/rsnaudiomunge.c: - Add support for time based seeking. - Make setting dvd:// reset to the default device. - Make the 'audiomunge' element send any new segment start before - the 'gap filler' buffer it generates, and any segment closes - after. - Fixes: #566957 - -2009-01-08 09:40:22 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/ladspa/gstladspa.c: Add plugin dependency for the LADSPA plugin directories. - Original commit message from CVS: - * ext/ladspa/gstladspa.c: (plugin_init): - Add plugin dependency for the LADSPA plugin directories. - Fixes bug #566878. - -2009-01-06 22:51:37 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - tests/check/Makefile.am: Dist test headers for amr and aac parsers. - Original commit message from CVS: - * tests/check/Makefile.am: - Dist test headers for amr and aac parsers. - Remove leftover lines mentioned speexresample tests. - -2009-01-06 22:35:50 +0000 Michael Smith <msmith@xiph.org> - - sys/acmmp3dec/Makefile.am: Fix typo in the opposite way to give the plugin a sensible name. - Original commit message from CVS: - * sys/acmmp3dec/Makefile.am: - Fix typo in the opposite way to give the plugin a sensible name. - -2009-01-06 22:16:56 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - sys/acmmp3dec/Makefile.am: Fix typo in the makefile target preventing disting. - Original commit message from CVS: - * sys/acmmp3dec/Makefile.am: - Fix typo in the makefile target preventing disting. - -2009-01-05 23:03:31 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Remove AppSrc/AppSink that are moving to -base. Partially fixes #564421 - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-app.xml: - * examples/Makefile.am: - * examples/app/.cvsignore: - * examples/app/Makefile.am: - * examples/app/appsink-src.c: - * examples/app/appsrc-ra.c: - * examples/app/appsrc-seekable.c: - * examples/app/appsrc-stream.c: - * examples/app/appsrc-stream2.c: - * examples/app/appsrc_ex.c: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/app/.cvsignore: - * gst-libs/gst/app/Makefile.am: - * gst-libs/gst/app/gstapp-marshal.list: - * gst-libs/gst/app/gstappbuffer.c: - * gst-libs/gst/app/gstappbuffer.h: - * gst-libs/gst/app/gstappsink.c: - * gst-libs/gst/app/gstappsink.h: - * gst-libs/gst/app/gstappsrc.c: - * gst-libs/gst/app/gstappsrc.h: - * gst/app/Makefile.am: - * gst/app/gstapp.c: - Remove AppSrc/AppSink that are moving to -base. Partially fixes - #564421 - -2009-01-05 17:41:51 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegdemux/mpegtspacketizer.c: Guard interval is 4 if descriptor part shows binary 11 (3 not 4). - Original commit message from CVS: - * gst/mpegdemux/mpegtspacketizer.c: - Guard interval is 4 if descriptor part shows binary 11 (3 not 4). - -2009-01-05 17:30:55 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegdemux/gstmpegdesc.h: Fix up satellite delivery subsystem defs. - Original commit message from CVS: - * gst/mpegdemux/gstmpegdesc.h: - Fix up satellite delivery subsystem defs. - -2009-01-05 17:26:00 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegdemux/gstmpegdesc.h: Fix up terrestrial delivery system descriptor defs. - Original commit message from CVS: - * gst/mpegdemux/gstmpegdesc.h: - Fix up terrestrial delivery system descriptor defs. - They should be shifted otherwise wrong values are seen. - -2009-01-05 13:41:07 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: "Generation UID" and "This Generation UID" are different so handle them different. Also both are not part o... - Original commit message from CVS: - * gst/mxf/Makefile.am: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmetadata.c: (mxf_metadata_handle_tag), - (mxf_metadata_preface_handle_tag), - (mxf_metadata_identification_handle_tag), - (mxf_metadata_content_storage_handle_tag), - (mxf_metadata_essence_container_data_handle_tag), - (mxf_metadata_generic_package_handle_tag), - (mxf_metadata_track_handle_tag), - (mxf_metadata_sequence_handle_tag), - (mxf_metadata_structural_component_handle_tag), - (mxf_metadata_generic_descriptor_handle_tag), - (mxf_metadata_locator_handle_tag), - (mxf_metadata_locator_class_init): - * gst/mxf/mxfmetadata.h: - "Generation UID" and "This Generation UID" are different so handle - them different. Also both are not part of every metadata type. - -2009-01-05 12:34:18 +0000 Sascha Hauer <s.hauer@pengutronix.de> - - gst/bayer/gstbayer2rgb.c: Fix color offset calculation for 24bpp. Fixes bug #566613. - Original commit message from CVS: - Patch by: Sascha Hauer <s dot hauer at pengutronix dot de> - Luotao Fu <l dot fu at pengutronix dot de> - * gst/bayer/gstbayer2rgb.c: (get_pix_offset), - (gst_bayer2rgb_set_caps): - Fix color offset calculation for 24bpp. Fixes bug #566613. - -2009-01-05 11:28:49 +0000 vanista <vanista@gmail.com> - - gst/mpegtsmux/: Improve muxing of AC3/h264 streams a bit. Fixes bug #550613. - Original commit message from CVS: - Patch by: vanista <vanista at gmail dot com> - * gst/mpegtsmux/mpegtsmux.c: (mpegtsmux_create_stream): - * gst/mpegtsmux/tsmux/tsmux.c: (tsmux_write_pmt): - * gst/mpegtsmux/tsmux/tsmuxstream.c: (tsmux_stream_new), - (tsmux_stream_write_pes_header), (tsmux_stream_get_es_descrs): - * gst/mpegtsmux/tsmux/tsmuxstream.h: - Improve muxing of AC3/h264 streams a bit. Fixes bug #550613. - -2009-01-05 10:34:03 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: Don't allow negative or zero edit rates to prevent division by zero and we support negative edit ... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_header_metadata_update_streams), - (gst_mxf_demux_pad_next_component): - Don't allow negative or zero edit rates to prevent division - by zero and we support negative edit rates anyway. - -2009-01-05 10:28:58 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - ext/x264/gstx264enc.c: Use hyphen in property name, perform safety buffer size check prior to mem access, and some mo... - Original commit message from CVS: - * ext/x264/gstx264enc.c: (gst_x264_enc_class_init), - (gst_x264_enc_header_buf), (gst_x264_enc_encode_frame): - Use hyphen in property name, perform safety buffer size check - prior to mem access, and some more parentheses in macro. - -2009-01-05 10:22:29 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Fix compilation with debugging disabled. - Original commit message from CVS: - * gst/mxf/mxfaes-bwf.c: - (mxf_metadata_wave_audio_essence_descriptor_handle_tag), - (mxf_bwf_create_caps): - * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_klv_packet): - * gst/mxf/mxfmetadata.c: (mxf_metadata_handle_tag), - (mxf_metadata_preface_handle_tag), - (mxf_metadata_identification_handle_tag), - (mxf_metadata_content_storage_handle_tag), - (mxf_metadata_essence_container_data_handle_tag), - (mxf_metadata_generic_package_handle_tag), - (mxf_metadata_source_package_handle_tag), - (mxf_metadata_track_handle_tag), - (mxf_metadata_sequence_handle_tag), - (mxf_metadata_structural_component_handle_tag), - (mxf_metadata_source_clip_handle_tag), - (mxf_metadata_dm_segment_handle_tag), - (mxf_metadata_generic_descriptor_handle_tag), - (mxf_metadata_file_descriptor_handle_tag), - (mxf_metadata_generic_picture_essence_descriptor_handle_tag), - (mxf_metadata_generic_sound_essence_descriptor_handle_tag), - (mxf_metadata_generic_data_essence_descriptor_handle_tag), - (mxf_metadata_multiple_descriptor_handle_tag): - * gst/mxf/mxfparse.c: (mxf_partition_pack_parse), - (mxf_index_table_segment_parse), (mxf_primer_pack_parse), - (mxf_local_tag_add_to_hash_table): - Fix compilation with debugging disabled. - -2009-01-05 10:00:21 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - configure.ac: Also mention jp2kenc as a jp2k plugin feature. - Original commit message from CVS: - * configure.ac: - Also mention jp2kenc as a jp2k plugin feature. - -2009-01-04 11:11:06 +0000 Sebastian Pölsterl <sebp@k-d-w.org> - - sys/dvb/dvbbasebin.c: Fix some memory leaks. Fixes bug #566356. - Original commit message from CVS: - Patch by: Sebastian Pölsterl <sebp at k-d-w dot org> - * sys/dvb/dvbbasebin.c: (dvb_base_bin_init), - (dvb_base_bin_finalize), (dvb_base_bin_activate_program), - (dvb_base_bin_pmt_info_cb), (dvb_base_bin_pad_added_cb), - (dvb_base_bin_program_destroy): - Fix some memory leaks. Fixes bug #566356. - -2009-01-02 17:40:06 +0000 Olivier Crete <tester@tester.ca> - - gst/rtpmanager/: When an SSRC is found on the caps of the sender RTP, use this as the internal SSRC. Fixes #565910. - Original commit message from CVS: - Patch by: Olivier Crete <tester at tester dot ca> - * gst/rtpmanager/gstrtpsession.c: - (gst_rtp_session_setcaps_send_rtp), (create_send_rtp_sink): - * gst/rtpmanager/rtpsession.c: (rtp_session_set_internal_ssrc): - When an SSRC is found on the caps of the sender RTP, use this as the - internal SSRC. Fixes #565910. - -2009-01-02 16:50:53 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Rename a method to better reflect what it really does. - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: - (gst_rtp_session_event_send_rtp_sink), - (gst_rtp_session_getcaps_send_rtp): - * gst/rtpmanager/rtpsession.c: (check_collision), - (rtp_session_schedule_bye_locked), (rtp_session_schedule_bye): - * gst/rtpmanager/rtpsession.h: - Rename a method to better reflect what it really does. - -2009-01-02 11:00:17 +0000 Alessandro Decina <alessandro.d@gmail.com> - - ext/apexsink/Makefile.am: Move -lgcrypto from _LDFLAGS to _LIBADD. - Original commit message from CVS: - * ext/apexsink/Makefile.am: - Move -lgcrypto from _LDFLAGS to _LIBADD. - -2009-01-02 01:44:11 +0000 Alessandro Decina <alessandro.d@gmail.com> - - ext/apexsink/Makefile.am: Link against -lgcrpyto for RSA_new and RSA_free. - Original commit message from CVS: - * ext/apexsink/Makefile.am: - Link against -lgcrpyto for RSA_new and RSA_free. - * ext/faac/gstfaac.c: - * ext/x264/gstx264enc.c: - Fix compiler warnings. - -2009-01-02 01:12:35 +0000 Alessandro Decina <alessandro.d@gmail.com> - - gst/mpegdemux/gstmpegdemux.c: Initialize scr_rate_n and scr_rate_d in order to fix compiler warnings. - Original commit message from CVS: - * gst/mpegdemux/gstmpegdemux.c: - Initialize scr_rate_n and scr_rate_d in order to fix compiler warnings. - -2008-12-31 08:53:02 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Implement support for OP2a/b/c and OP3a/b/c, i.e. tracks with more than a single component. This currently only works... - Original commit message from CVS: - * gst/mxf/mxfaes-bwf.c: (mxf_bwf_handle_essence_element), - (mxf_aes3_handle_essence_element): - * gst/mxf/mxfalaw.c: (mxf_alaw_handle_essence_element): - * gst/mxf/mxfd10.c: (mxf_d10_picture_handle_essence_element), - (mxf_d10_sound_handle_essence_element): - * gst/mxf/mxfdemux.c: (gst_mxf_demux_pad_init), - (gst_mxf_demux_choose_package), - (gst_mxf_demux_handle_header_metadata_update_streams), - (gst_mxf_demux_pad_next_component), - (gst_mxf_demux_handle_generic_container_essence_element), - (gst_mxf_demux_parse_footer_metadata), - (gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_src_query): - * gst/mxf/mxfdv-dif.c: (mxf_dv_dif_handle_essence_element): - * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_handle_essence_element): - * gst/mxf/mxfmetadata.c: (mxf_metadata_sequence_init), - (mxf_metadata_structural_component_init), - (mxf_metadata_generic_picture_essence_descriptor_init): - * gst/mxf/mxfmpeg.c: (mxf_mpeg_video_handle_essence_element), - (mxf_mpeg_audio_handle_essence_element): - * gst/mxf/mxfparse.h: - * gst/mxf/mxfup.c: (mxf_up_handle_essence_element): - * gst/mxf/mxfvc3.c: (mxf_vc3_handle_essence_element): - * tests/check/elements/mxfdemux.c: (_sink_chain): - Implement support for OP2a/b/c and OP3a/b/c, i.e. tracks with - more than a single component. This currently only works for - the case where the components are stored in playback order - in the file. - Set some more default/distinguished values for the structural - metadata. - Make some types more strict by choosing the correct subclasses. - Set DISCONT flag on buffers after a component switch. - Take the last partition from the random index pack for the footer - partition of the header partition doesn't reference the footer - partition. This gives us the final structural metadata for - some more files in the beginning. - -2008-12-29 18:22:26 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/mpegdemux/gstmpegdemux.c: Use the adjusted SCR for calculating the mux rate. - Original commit message from CVS: - * gst/mpegdemux/gstmpegdemux.c: (gst_flups_demux_src_query), - (gst_flups_demux_parse_pack_start): - Use the adjusted SCR for calculating the mux rate. - Don't update the rate estimation after a discont. - -2008-12-29 17:55:18 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/mpegdemux/gstmpegdemux.*: The position member in the newsegment event corresponds to the stream_time of the segme... - Original commit message from CVS: - * gst/mpegdemux/gstmpegdemux.c: (gst_flups_demux_send_data): - * gst/mpegdemux/gstmpegdemux.h: - The position member in the newsegment event corresponds to the - stream_time of the segment start position. - -2008-12-29 17:30:03 +0000 Robin Stocker <robin@nibor.org> - - gst/mpegdemux/gstmpegdemux.c: Converting from time to bytes operates on the stream_time, not the SCR timeline. - Original commit message from CVS: - Patch by: Robin Stocker <robin at nibor dot org> - * gst/mpegdemux/gstmpegdemux.c: (gst_flups_demux_src_query): - Converting from time to bytes operates on the stream_time, not the SCR - timeline. - The position reporting should happen in stream_time, not the segment - timestamp range. See #557161. - -2008-12-29 16:45:20 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst-libs/gst/app/gstappsrc.*: Add properties and methods to configure and retrieve the min and max latencies. - Original commit message from CVS: - * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init), - (gst_app_src_init), (gst_app_src_set_property), - (gst_app_src_get_property), (gst_app_src_query), - (gst_app_src_set_latencies), (gst_app_src_set_latency), - (gst_app_src_get_latency), (gst_app_src_push_buffer_full): - * gst-libs/gst/app/gstappsrc.h: - Add properties and methods to configure and retrieve the min and max - latencies. - -2008-12-29 16:29:08 +0000 Sebastian Pölsterl <sebp@k-d-w.org> - - gst/mpegdemux/mpegtspacketizer.c: Fix memleak. Fixes #565614. - Original commit message from CVS: - Patch by: Sebastian Pölsterl <sebp at k-d-w dot org> - * gst/mpegdemux/mpegtspacketizer.c: (mpegts_packetizer_parse_eit): - Fix memleak. Fixes #565614. - -2008-12-29 16:18:47 +0000 Sebastian Pölsterl <sebp@k-d-w.org> - - gst/mpegdemux/mpegtspacketizer.c: Add a scrambled field to the service structures retrieved from SDT to determine if ... - Original commit message from CVS: - Patch by: Sebastian Pölsterl <sebp at k-d-w dot org> - * gst/mpegdemux/mpegtspacketizer.c: (mpegts_packetizer_parse_sdt): - Add a scrambled field to the service structures retrieved from SDT to - determine if a channel is scrambled. Fixes #565613. - -2008-12-29 15:54:44 +0000 Damien Lespiau <damien.lespiau@gmail.com> - - gst/pcapparse/: Patch to make gstpcapparse compile with mingw32 gcc. Fixes #565439. - Original commit message from CVS: - Patch by: Damien Lespiau <damien dot lespiau at gmail dot com> - * gst/pcapparse/Makefile.am: - * gst/pcapparse/gstpcapparse.c: - Patch to make gstpcapparse compile with mingw32 gcc. Fixes #565439. - -2008-12-29 15:49:37 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpsession.c: Use method to get the internal SSRC. - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: - (gst_rtp_session_getcaps_send_rtp): - Use method to get the internal SSRC. - * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), - (rtp_session_set_property), (rtp_session_get_property): - Add property to congiure the internal SSRC of the session. - Fixes #565910. - -2008-12-29 15:21:58 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/rtpsession.c: Only change the SSRC of the session and reset the internal source when the SSRC actually... - Original commit message from CVS: - * gst/rtpmanager/rtpsession.c: (rtp_session_set_internal_ssrc): - Only change the SSRC of the session and reset the internal source when - the SSRC actually changed. See #565910. - -2008-12-29 14:21:47 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/rtpsource.*: When no payload was specified on the caps but there was a clock-rate, assume the clock-ra... - Original commit message from CVS: - * gst/rtpmanager/rtpsource.c: (rtp_source_init), - (rtp_source_update_caps), (get_clock_rate): - * gst/rtpmanager/rtpsource.h: - When no payload was specified on the caps but there was a clock-rate, - assume the clock-rate corresponds to the first payload type found in the - RTP packets. Fixes #565509. - -2008-12-23 16:32:05 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: With constant read failures, make sure we exit the read_device method. - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - With constant read failures, make sure we exit the read_device - method. - -2008-12-23 15:26:30 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: Post bus message with dvb read failure when unable to read from device. - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - Post bus message with dvb read failure when unable to read from - device. - -2008-12-23 12:25:47 +0000 Luotao Fu <l.fu@pengutronix.de> - - sys/fbdev/gstfbdevsink.c: Fix the Depth calculation. - Original commit message from CVS: - Patch by: Luotao Fu <l dot fu at pengutronix dot de> - * sys/fbdev/gstfbdevsink.c: (gst_fbdevsink_getcaps): - Fix the Depth calculation. - Fixes #564114. - -2008-12-23 11:39:59 +0000 Arnout Vandecappelle <arnout@mind.be> - - gst/rtpmanager/rtpjitterbuffer.*: Keep track of the last outgoing timestamp and of the last sender-side time. Timest... - Original commit message from CVS: - Patch by: Arnout Vandecappelle <arnout at mind dot be> - * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), - (calculate_skew): - * gst/rtpmanager/rtpjitterbuffer.h: - Keep track of the last outgoing timestamp and of the last sender-side - time. Timestamps can only go forward if they do at the sender - side, can only go back if they do at the sender side, and remain the - same if they remain the same at the sender side. Fixes #565319. - -2008-12-22 20:56:10 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfmpeg.c: Add initial support for h.264 video (SMPTE RP2008). - Original commit message from CVS: - * gst/mxf/mxfmpeg.c: (mxf_mpeg_es_create_caps), - (mxf_mpeg_create_caps): - Add initial support for h.264 video (SMPTE RP2008). - -2008-12-22 20:37:24 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfmetadata.*: If resolving a metadata object failed the first time return - Original commit message from CVS: - * gst/mxf/mxfmetadata.c: (mxf_metadata_base_resolve): - * gst/mxf/mxfmetadata.h: - If resolving a metadata object failed the first time return - FALSE for a second mxf_metadata_base_resolve() call instead - of TRUE. - -2008-12-22 10:14:35 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Cleanup of the includes. - Original commit message from CVS: - * gst/mxf/mxf.c: - * gst/mxf/mxfaes-bwf.h: - * gst/mxf/mxfd10.c: - * gst/mxf/mxfdms1.c: - * gst/mxf/mxfdms1.h: - * gst/mxf/mxfmpeg.h: - * gst/mxf/mxftypes.h: - Cleanup of the includes. - -2008-12-19 18:53:47 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - gst/qtmux/gstqtmux.c: Do not tempt or suggest to violate gst_collect_pads API specification. - Original commit message from CVS: - * gst/qtmux/gstqtmux.c: (gst_qt_mux_change_state): - Do not tempt or suggest to violate gst_collect_pads API specification. - -2008-12-19 18:33:47 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - gst/qtmux/: Dual license qtmux LGPL/MIT. Fixes #564232. - Original commit message from CVS: - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/descriptors.c: - * gst/qtmux/descriptors.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/ftypcc.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - * gst/qtmux/gstqtmuxmap.c: - * gst/qtmux/gstqtmuxmap.h: - * gst/qtmux/properties.c: - * gst/qtmux/properties.h: - Dual license qtmux LGPL/MIT. Fixes #564232. - -2008-12-19 10:06:24 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Add mxf_metadata_generic_sound_essence_descriptor_set_caps() to set rate and channels and use this for all ... - Original commit message from CVS: - * gst/mxf/mxfaes-bwf.c: (mxf_bwf_create_caps), - (mxf_aes3_create_caps): - * gst/mxf/mxfalaw.c: (mxf_alaw_create_caps): - * gst/mxf/mxfd10.c: (mxf_d10_create_caps): - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfmetadata.c: (mxf_metadata_source_package_resolve), - (mxf_metadata_generic_picture_essence_descriptor_set_caps), - (mxf_metadata_generic_sound_essence_descriptor_set_caps): - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfmpeg.c: (mxf_mpeg_es_create_caps): - Add mxf_metadata_generic_sound_essence_descriptor_set_caps() to - set rate and channels and use this for all sound essence. - Give some debug output when setting picture essence caps with - invalid descriptor values. - Fix height calculation from the frame layout a bit more and - add a TODO to check if it's really correct now or if it needs - more fixing (especially, does the framerate need adjustments?). - -2008-12-18 17:49:08 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Add support for VC-3 (aka DNxHD essence, see SMPTE 2019-4). - Original commit message from CVS: - * gst/mxf/Makefile.am: - * gst/mxf/mxf.c: (plugin_init): - * gst/mxf/mxfvc3.c: (mxf_is_vc3_essence_track), - (mxf_vc3_handle_essence_element), (mxf_vc3_create_caps), - (mxf_vc3_init): - * gst/mxf/mxfvc3.h: - Add support for VC-3 (aka DNxHD essence, see SMPTE 2019-4). - This is untested because of lack of sample files but should - work fine. - -2008-12-17 13:51:46 +0000 Wim Taymans <wim.taymans@gmail.com> - - Add appsrc and appsink documentation. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst-libs/gst/app/gstappsink.c: - * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init): - Add appsrc and appsink documentation. - -2008-12-17 12:06:43 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: In push mode skip the run in again if we get buffers with an offset before the run in. This can h... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_chain): - In push mode skip the run in again if we get buffers with - an offset before the run in. This can happen on seeks for example. - -2008-12-16 16:26:52 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Totally remove the internal taglists and fully use tagsetter. Fixes various tag muxing issues. - Original commit message from CVS: - * ext/celt/gstceltenc.c: - * ext/celt/gstceltenc.h: - * ext/metadata/gstmetadatamux.c: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - Totally remove the internal taglists and fully use tagsetter. Fixes - various tag muxing issues. - -2008-12-16 12:46:37 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/mxfdemux.c: Increase the timeout to 3 minutes to prevent timeouts. - Original commit message from CVS: - * tests/check/elements/mxfdemux.c: (mxfdemux_suite): - Increase the timeout to 3 minutes to prevent timeouts. - -2008-12-16 12:37:15 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/mxfdemux.*: Make sure the main loop is already running when handling the EOS event in pull mode.... - Original commit message from CVS: - * tests/check/elements/mxfdemux.c: (_sink_event): - * tests/check/elements/mxfdemux.h: - Make sure the main loop is already running when handling the EOS - event in pull mode. This works around a race condition that can - happen if the element goes into PLAYING, handles everything and - sends EOS before the main loop is started. - -2008-12-16 12:30:34 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Implement an essence element handling registry and use this instead of an hardcoded, large if-then-else block. - Original commit message from CVS: - * gst/mxf/mxfaes-bwf.c: (mxf_is_aes_bwf_essence_track), - (mxf_bwf_handle_essence_element), - (mxf_aes3_handle_essence_element), (mxf_bwf_create_caps), - (mxf_aes3_create_caps), (mxf_aes_bwf_create_caps), - (mxf_aes_bwf_init): - * gst/mxf/mxfaes-bwf.h: - * gst/mxf/mxfalaw.c: (mxf_is_alaw_essence_track), - (mxf_alaw_handle_essence_element), (mxf_alaw_create_caps), - (mxf_alaw_init): - * gst/mxf/mxfalaw.h: - * gst/mxf/mxfd10.c: (mxf_is_d10_essence_track), - (mxf_d10_picture_handle_essence_element), - (mxf_d10_sound_handle_essence_element), (mxf_d10_create_caps), - (mxf_d10_init): - * gst/mxf/mxfd10.h: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata), - (gst_mxf_demux_handle_header_metadata_update_streams), - (gst_mxf_demux_handle_generic_container_essence_element): - * gst/mxf/mxfdv-dif.c: (mxf_is_dv_dif_essence_track), - (mxf_dv_dif_handle_essence_element), (mxf_dv_dif_create_caps), - (mxf_dv_dif_init): - * gst/mxf/mxfdv-dif.h: - * gst/mxf/mxfjpeg2000.c: (mxf_is_jpeg2000_essence_track), - (mxf_jpeg2000_handle_essence_element), (mxf_jpeg2000_create_caps), - (mxf_jpeg2000_init): - * gst/mxf/mxfjpeg2000.h: - * gst/mxf/mxfmpeg.c: (mxf_is_mpeg_essence_track), - (mxf_mpeg_video_handle_essence_element), - (mxf_mpeg_audio_handle_essence_element), (mxf_mpeg_es_create_caps), - (mxf_mpeg_create_caps), (mxf_mpeg_init): - * gst/mxf/mxfmpeg.h: - * gst/mxf/mxfparse.c: (mxf_essence_element_handler_register), - (mxf_essence_element_handler_find): - * gst/mxf/mxfparse.h: - * gst/mxf/mxfup.c: (mxf_is_up_essence_track), - (mxf_up_handle_essence_element), (mxf_up_rgba_create_caps), - (mxf_up_create_caps), (mxf_up_init): - * gst/mxf/mxfup.h: - Implement an essence element handling registry and use this instead - of an hardcoded, large if-then-else block. - -2008-12-16 10:50:40 +0000 Edward Hervey <bilboed@bilboed.com> - - tests/check/Makefile.am: Blacklist rfbsrc from the state change test. - Original commit message from CVS: - * tests/check/Makefile.am: - Blacklist rfbsrc from the state change test. - -2008-12-16 09:59:38 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/: Add push and pull mode unit test for mxfdemux. - Original commit message from CVS: - * tests/check/Makefile.am: - * tests/check/elements/mxfdemux.c: (_pad_added), (_sink_chain), - (_sink_event), (_create_sink_pad), (_create_src_pad_push), - (_src_getrange), (_src_query), (_create_src_pad_pull), - (GST_START_TEST), (mxfdemux_suite): - * tests/check/elements/mxfdemux.h: - Add push and pull mode unit test for mxfdemux. - -2008-12-16 08:35:05 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add initial documentation for the MXF plugin and mxfdemux. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-mxf.xml: - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdemux.h: - Add initial documentation for the MXF plugin and mxfdemux. - -2008-12-16 08:21:29 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Rename MXFMetadataBase methods to reflect that they belong to - Original commit message from CVS: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_header_metadata_resolve_references): - * gst/mxf/mxfmetadata.c: (mxf_metadata_base_resolve_default), - (mxf_metadata_base_class_init), (mxf_metadata_base_parse), - (mxf_metadata_base_resolve), (mxf_metadata_new), - (mxf_metadata_preface_resolve), - (mxf_metadata_content_storage_resolve), - (mxf_metadata_essence_container_data_resolve), - (mxf_metadata_generic_package_resolve), - (mxf_metadata_source_package_resolve), - (mxf_metadata_track_resolve), (mxf_metadata_sequence_resolve), - (mxf_metadata_dm_segment_resolve), - (mxf_metadata_generic_descriptor_resolve), - (mxf_metadata_multiple_descriptor_resolve): - * gst/mxf/mxfmetadata.h: - Rename MXFMetadataBase methods to reflect that they belong to - MXFMetadataBase and not MXFMetadata. - -2008-12-15 18:12:26 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Return FALSE when parsing a metadata tag failed. - Original commit message from CVS: - * gst/mxf/mxfaes-bwf.c: - (mxf_metadata_wave_audio_essence_descriptor_handle_tag), - (mxf_metadata_aes3_audio_essence_descriptor_handle_tag): - * gst/mxf/mxfmetadata.c: - (mxf_metadata_multiple_descriptor_handle_tag): - Return FALSE when parsing a metadata tag failed. - Remove some useless return value assignments. - -2008-12-15 17:27:00 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Convert the structural metadata to GstMiniObjects to make a lot of code easier and to make everything bette... - Original commit message from CVS: - * gst/mxf/Makefile.am: - * gst/mxf/mxf.c: (plugin_init): - * gst/mxf/mxfaes-bwf.c: - (mxf_metadata_wave_audio_essence_descriptor_handle_tag), - (mxf_metadata_wave_audio_essence_descriptor_init), - (mxf_metadata_wave_audio_essence_descriptor_class_init), - (mxf_metadata_aes3_audio_essence_descriptor_finalize), - (mxf_metadata_aes3_audio_essence_descriptor_handle_tag), - (mxf_metadata_aes3_audio_essence_descriptor_init), - (mxf_metadata_aes3_audio_essence_descriptor_class_init), - (mxf_is_aes_bwf_essence_track), (mxf_bwf_create_caps), - (mxf_aes3_create_caps), (mxf_aes_bwf_create_caps), - (mxf_aes_bwf_init): - * gst/mxf/mxfaes-bwf.h: - * gst/mxf/mxfalaw.c: (mxf_is_alaw_essence_track), - (mxf_alaw_create_caps), (mxf_alaw_init): - * gst/mxf/mxfalaw.h: - * gst/mxf/mxfd10.c: (mxf_is_d10_essence_track), - (mxf_d10_create_caps), (mxf_d10_init): - * gst/mxf/mxfd10.h: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata), - (gst_mxf_demux_handle_header_metadata_resolve_references), - (gst_mxf_demux_find_package), (gst_mxf_demux_choose_package), - (gst_mxf_demux_handle_header_metadata_update_streams), - (gst_mxf_demux_handle_metadata), - (gst_mxf_demux_handle_generic_container_essence_element), - (gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_src_query): - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfdv-dif.c: (mxf_is_dv_dif_essence_track), - (mxf_dv_dif_create_caps), (mxf_dv_dif_init): - * gst/mxf/mxfdv-dif.h: - * gst/mxf/mxfjpeg2000.c: (mxf_is_jpeg2000_essence_track), - (mxf_jpeg2000_create_caps), (mxf_jpeg2000_init): - * gst/mxf/mxfjpeg2000.h: - * gst/mxf/mxfmetadata.c: (mxf_metadata_base_finalize), - (mxf_metadata_base_handle_tag), (mxf_metadata_base_resolve), - (mxf_metadata_base_init), (mxf_metadata_base_class_init), - (mxf_metadata_parse), (mxf_metadata_resolve), - (mxf_metadata_handle_tag), (mxf_metadata_class_init), - (mxf_metadata_init), (mxf_metadata_init_types), - (mxf_metadata_register), (mxf_metadata_new), - (mxf_metadata_preface_finalize), (mxf_metadata_preface_handle_tag), - (mxf_metadata_preface_resolve), (mxf_metadata_preface_init), - (mxf_metadata_preface_class_init), - (mxf_metadata_identification_finalize), - (mxf_metadata_identification_handle_tag), - (mxf_metadata_identification_init), - (mxf_metadata_identification_class_init), - (mxf_metadata_content_storage_finalize), - (mxf_metadata_content_storage_handle_tag), - (mxf_metadata_content_storage_resolve), - (mxf_metadata_content_storage_init), - (mxf_metadata_content_storage_class_init), - (mxf_metadata_essence_container_data_handle_tag), - (mxf_metadata_essence_container_data_resolve), - (mxf_metadata_essence_container_data_init), - (mxf_metadata_essence_container_data_class_init), - (mxf_metadata_generic_package_finalize), - (mxf_metadata_generic_package_handle_tag), - (mxf_metadata_generic_package_resolve), - (mxf_metadata_generic_package_init), - (mxf_metadata_generic_package_class_init), - (mxf_metadata_material_package_resolve), - (mxf_metadata_material_package_init), - (mxf_metadata_material_package_class_init), - (mxf_metadata_source_package_finalize), - (mxf_metadata_source_package_handle_tag), - (mxf_metadata_source_package_resolve), - (mxf_metadata_source_package_init), - (mxf_metadata_source_package_class_init), - (mxf_metadata_track_finalize), (mxf_metadata_track_handle_tag), - (mxf_metadata_track_resolve), (mxf_metadata_track_init), - (mxf_metadata_track_class_init), - (mxf_metadata_track_identifier_parse), - (mxf_metadata_timeline_track_handle_tag), - (mxf_metadata_timeline_track_init), - (mxf_metadata_timeline_track_class_init), - (mxf_metadata_event_track_handle_tag), - (mxf_metadata_event_track_init), - (mxf_metadata_event_track_class_init), - (mxf_metadata_static_track_init), - (mxf_metadata_static_track_class_init), - (mxf_metadata_sequence_finalize), - (mxf_metadata_sequence_handle_tag), - (mxf_metadata_sequence_resolve), (mxf_metadata_sequence_init), - (mxf_metadata_sequence_class_init), - (mxf_metadata_structural_component_handle_tag), - (mxf_metadata_structural_component_init), - (mxf_metadata_structural_component_class_init), - (mxf_metadata_timecode_component_handle_tag), - (mxf_metadata_timecode_component_init), - (mxf_metadata_timecode_component_class_init), - (mxf_metadata_source_clip_handle_tag), - (mxf_metadata_source_clip_resolve), - (mxf_metadata_source_clip_init), - (mxf_metadata_source_clip_class_init), - (mxf_metadata_dm_source_clip_finalize), - (mxf_metadata_dm_source_clip_handle_tag), - (mxf_metadata_dm_source_clip_init), - (mxf_metadata_dm_source_clip_class_init), - (mxf_metadata_dm_segment_finalize), - (mxf_metadata_dm_segment_handle_tag), - (mxf_metadata_dm_segment_resolve), (mxf_metadata_dm_segment_init), - (mxf_metadata_dm_segment_class_init), - (mxf_metadata_generic_descriptor_finalize), - (mxf_metadata_generic_descriptor_handle_tag), - (mxf_metadata_generic_descriptor_resolve), - (mxf_metadata_generic_descriptor_init), - (mxf_metadata_generic_descriptor_class_init), - (mxf_metadata_file_descriptor_handle_tag), - (mxf_metadata_file_descriptor_init), - (mxf_metadata_file_descriptor_class_init), - (mxf_metadata_generic_picture_essence_descriptor_handle_tag), - (mxf_metadata_generic_picture_essence_descriptor_init), - (mxf_metadata_generic_picture_essence_descriptor_class_init), - (mxf_metadata_generic_picture_essence_descriptor_set_caps), - (mxf_metadata_generic_sound_essence_descriptor_handle_tag), - (mxf_metadata_generic_sound_essence_descriptor_init), - (mxf_metadata_generic_sound_essence_descriptor_class_init), - (mxf_metadata_cdci_picture_essence_descriptor_handle_tag), - (mxf_metadata_cdci_picture_essence_descriptor_init), - (mxf_metadata_cdci_picture_essence_descriptor_class_init), - (mxf_metadata_rgba_picture_essence_descriptor_finalize), - (mxf_metadata_rgba_picture_essence_descriptor_handle_tag), - (mxf_metadata_rgba_picture_essence_descriptor_init), - (mxf_metadata_rgba_picture_essence_descriptor_class_init), - (mxf_metadata_generic_data_essence_descriptor_handle_tag), - (mxf_metadata_generic_data_essence_descriptor_init), - (mxf_metadata_generic_data_essence_descriptor_class_init), - (mxf_metadata_multiple_descriptor_finalize), - (mxf_metadata_multiple_descriptor_handle_tag), - (mxf_metadata_multiple_descriptor_resolve), - (mxf_metadata_multiple_descriptor_init), - (mxf_metadata_multiple_descriptor_class_init), - (mxf_metadata_locator_init), (mxf_metadata_locator_class_init), - (mxf_metadata_text_locator_finalize), - (mxf_metadata_text_locator_handle_tag), - (mxf_metadata_text_locator_init), - (mxf_metadata_text_locator_class_init), - (mxf_metadata_network_locator_finalize), - (mxf_metadata_network_locator_handle_tag), - (mxf_metadata_network_locator_init), - (mxf_metadata_network_locator_class_init): - * gst/mxf/mxfmetadata.h: - * gst/mxf/mxfmpeg.c: - (mxf_metadata_mpeg_video_descriptor_handle_tag), - (mxf_metadata_mpeg_video_descriptor_init), - (mxf_metadata_mpeg_video_descriptor_class_init), - (mxf_is_mpeg_essence_track), (mxf_mpeg_es_create_caps), - (mxf_mpeg_create_caps), (mxf_mpeg_init): - * gst/mxf/mxfmpeg.h: - * gst/mxf/mxfparse.c: (mxf_index_table_segment_parse), - (mxf_local_tag_add_to_hash_table): - * gst/mxf/mxfparse.h: - * gst/mxf/mxftypes.h: - * gst/mxf/mxfup.c: (mxf_is_up_essence_track), (mxf_up_create_caps), - (mxf_up_init): - * gst/mxf/mxfup.h: - Convert the structural metadata to GstMiniObjects to make a lot of - code easier and to make everything better extensible. - Add a "registry" for metadata handlers to improve extensibility even - more and to remove metadata type specifics from mxfdemux. - Clean up a lot of parts and add some more NULL checks. - -2008-12-15 15:56:18 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/faac/gstfaac.c: Fix default for outputformat property. - Original commit message from CVS: - * ext/faac/gstfaac.c: - Fix default for outputformat property. - -2008-12-15 12:02:26 +0000 Wim Taymans <wim.taymans@gmail.com> - - examples/app/: Fix example to unref after emiting the push-buffer action. - Original commit message from CVS: - * examples/app/appsrc-ra.c: (feed_data): - * examples/app/appsrc-seekable.c: (feed_data): - * examples/app/appsrc-stream.c: (read_data): - * examples/app/appsrc-stream2.c: (feed_data): - Fix example to unref after emiting the push-buffer action. - * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init), - (gst_app_src_push_buffer_full), (gst_app_src_push_buffer), - (gst_app_src_push_buffer_action): - Don't take the ref on the buffer in push-buffer action because it's too - awkward for bindings. Fixes #564482. - -2008-12-13 16:26:39 +0000 Edward Hervey <bilboed@bilboed.com> - - m4/Makefile.am: More .m4 that aren't shipped with gettext 0.17 anymore. - Original commit message from CVS: - * m4/Makefile.am: - More .m4 that aren't shipped with gettext 0.17 anymore. - -2008-12-13 13:00:10 +0000 Edward Hervey <bilboed@bilboed.com> - - m4/Makefile.am: inttypes.m4 hasn't been available since gettext-0.15, and since we now require gettext >= 0.17 ... we... - Original commit message from CVS: - * m4/Makefile.am: - inttypes.m4 hasn't been available since gettext-0.15, and since we now - require gettext >= 0.17 ... we can remove it from the list of files to - dist. - -2008-12-13 08:06:33 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: Add a generic handler for descriptive metadata so we can get some debug output and let users file... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_descriptive_metadata), - (gst_mxf_demux_handle_klv_packet): - Add a generic handler for descriptive metadata so we can get some - debug output and let users file bugs for unsupport descriptive - metadata schemes. - -2008-12-12 10:29:31 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Major update of the TODO lists. There's still much to do. - Original commit message from CVS: - * gst/mxf/mxfaes-bwf.c: - * gst/mxf/mxfalaw.c: (mxf_alaw_create_caps): - * gst/mxf/mxfdemux.c: - * gst/mxf/mxfdv-dif.c: (mxf_dv_dif_create_caps): - * gst/mxf/mxfjpeg2000.c: - * gst/mxf/mxfmpeg.c: - * gst/mxf/mxfup.c: - Major update of the TODO lists. There's still much to do. - -2008-12-11 14:35:08 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Implement parsing of Event Tracks, Static Tracks, DM Segments and DM Source Clips as a preparation for desc... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_metadata_track), - (gst_mxf_demux_handle_header_metadata_resolve_references), - (gst_mxf_demux_handle_metadata): - * gst/mxf/mxfparse.c: (mxf_metadata_track_parse), - (mxf_metadata_structural_component_parse), - (mxf_metadata_structural_component_reset): - * gst/mxf/mxfparse.h: - * gst/mxf/mxftypes.h: - Implement parsing of Event Tracks, Static Tracks, DM Segments - and DM Source Clips as a preparation for descriptive metadata - support. Next step is to implement SMPTE S380M, "Descriptive - Metadata Scheme-1". - -2008-12-09 13:44:45 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfjpeg2000.c: Implement detection of the colorspace used by the - Original commit message from CVS: - * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps): - Implement detection of the colorspace used by the - JPEG2000 codestream. XYZ colorspace isn't supported by - our decoders yet unfortunately. - -2008-12-08 15:46:13 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfparse.c: All frame layout values except 0 are for interlaced video, not only 1 and 2. - Original commit message from CVS: - * gst/mxf/mxfparse.c: - (mxf_metadata_generic_picture_essence_descriptor_set_caps): - All frame layout values except 0 are for interlaced video, - not only 1 and 2. - -2008-12-08 15:28:58 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Remove the concept of "final" metadata, broken files have updated metadata in following partitions even if ... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata), - (gst_mxf_demux_handle_primer_pack), - (gst_mxf_demux_handle_metadata_preface), - (gst_mxf_demux_handle_header_metadata_resolve_references), - (gst_mxf_demux_choose_package), - (gst_mxf_demux_handle_header_metadata_update_streams), - (gst_mxf_demux_parse_footer_metadata), - (gst_mxf_demux_handle_klv_packet): - * gst/mxf/mxfdemux.h: - * gst/mxf/mxftypes.h: - Remove the concept of "final" metadata, broken files have updated - metadata in following partitions even if the current partition - is closed and complete. - If there's a second primer pack inside a partition ignore the second - one instead of throwing an error. - Store the type of a track (audio, video, timestamp, ...) inside the - track struct. - Post no-more-pads only once for a stream and not a second time - when switching the currently playing package. - When updating all streams make sure that we could select and find - a package instead of dereferencing NULL. - Allow descriptive metadata inside metadata parts of a file when - pulling the footer metadata too. - Only switch the currently playing package if a new one was chosen - and the metadata is in a resolved state. If the latter isn't true - postpone the switch until the metadata is resolved. - Pull the footer metadata directly after parsing the header partition - pack if it's not closed or not complete instead of waiting until - the next KLV packet. - -2008-12-08 13:48:46 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfup.c: Don't create a subbuffer, instead just change the buffer metadata of the input buffer. - Original commit message from CVS: - * gst/mxf/mxfup.c: (mxf_up_handle_essence_element): - Don't create a subbuffer, instead just change the buffer metadata - of the input buffer. - -2008-12-07 20:12:33 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: Rename GstMXFPad to GstMXFDemuxPad to prevent name clashes with the GstMXFMuxPad in the muxer (la... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_pad_finalize), - (gst_mxf_demux_pad_class_init), (gst_mxf_demux_pad_init), - (gst_mxf_demux_remove_pad), (gst_mxf_demux_reset_metadata), - (gst_mxf_demux_combine_flows), - (gst_mxf_demux_handle_header_metadata_resolve_references), - (gst_mxf_demux_handle_header_metadata_update_streams), - (gst_mxf_demux_handle_generic_container_essence_element), - (gst_mxf_demux_pull_random_index_pack), (gst_mxf_demux_loop), - (gst_mxf_demux_src_query): - Rename GstMXFPad to GstMXFDemuxPad to prevent name clashes - with the GstMXFMuxPad in the muxer (later). - Pull the random index pack only directly after skipping the run - in and don't allocate an array for it if parsing it failed. - -2008-12-07 18:52:54 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfd10.c: Use the mapping data for storing the channel count and the width instead of parsing caps for every ... - Original commit message from CVS: - * gst/mxf/mxfd10.c: (mxf_d10_sound_handle_essence_element), - (mxf_d10_create_caps): - Use the mapping data for storing the channel count and the - width instead of parsing caps for every buffer. - -2008-12-07 18:39:41 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfup.c: Handle the image start and end offsets, otherwise we output too large image buffers. - Original commit message from CVS: - * gst/mxf/mxfup.c: (mxf_up_handle_essence_element), - (mxf_up_rgba_create_caps): - Handle the image start and end offsets, otherwise we output - too large image buffers. - -2008-12-07 17:57:13 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfmpeg.c: Set codec name tags for the MPEG audio essence. - Original commit message from CVS: - * gst/mxf/mxfmpeg.c: (mxf_mpeg_es_create_caps): - Set codec name tags for the MPEG audio essence. - -2008-12-07 17:16:29 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Add initial support for uncompressed video essence (SMPTE S384M). - Original commit message from CVS: - * gst/mxf/Makefile.am: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_header_metadata_update_streams): - * gst/mxf/mxftypes.h: - * gst/mxf/mxfup.c: (mxf_is_up_essence_track), - (mxf_up_handle_essence_element), (mxf_up_rgba_create_caps), - (mxf_up_create_caps): - * gst/mxf/mxfup.h: - Add initial support for uncompressed video essence (SMPTE S384M). - * gst/mxf/mxfparse.c: - (mxf_metadata_rgba_picture_essence_descriptor_handle_tag), - (mxf_metadata_rgba_picture_essence_descriptor_reset): - Fix parsing of the RGBA descriptor and add support for parsing - the pixel layout. - -2008-12-06 20:46:46 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: The previous partition field of the partition is relative to the current partition and not to the... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_parse_footer_metadata): - The previous partition field of the partition is relative - to the current partition and not to the offset of the header - partition. - -2008-12-06 19:46:05 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfd10.c: Document decoding of the AES3 data and also skip the 32 bit header in the beginning of every buffer... - Original commit message from CVS: - * gst/mxf/mxfd10.c: (mxf_d10_sound_handle_essence_element): - Document decoding of the AES3 data and also skip the 32 bit - header in the beginning of every buffer, otherwise we get - one broken audio channel. - -2008-12-05 12:26:02 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Implement parsing of the generic data essence descriptor. - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata), - (gst_mxf_demux_handle_metadata_generic_data_essence_descriptor), - (gst_mxf_demux_handle_header_metadata_resolve_references), - (gst_mxf_demux_handle_metadata): - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfparse.c: - (mxf_metadata_generic_data_essence_descriptor_handle_tag), - (mxf_metadata_generic_data_essence_descriptor_reset): - * gst/mxf/mxfparse.h: - * gst/mxf/mxftypes.h: - Implement parsing of the generic data essence descriptor. - -2008-12-05 10:32:55 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: Generalize some lines of codes that are more or less the same by a macro. - Original commit message from CVS: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_header_metadata_resolve_references): - Generalize some lines of codes that are more or less the same - by a macro. - -2008-12-04 20:11:17 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Apparently AC_CONFIG_MACRO_DIR breaks when using more than one macro directory, reverting last change. - Original commit message from CVS: - * configure.ac: - Apparently AC_CONFIG_MACRO_DIR breaks when using more - than one macro directory, reverting last change. - -2008-12-04 19:50:10 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Set AC_CONFIG_MACRO_DIR to common/m4 to point autoconf to our M4 macros. - Original commit message from CVS: - * configure.ac: - Set AC_CONFIG_MACRO_DIR to common/m4 to point autoconf to - our M4 macros. - -2008-12-04 17:51:37 +0000 Michael Smith <msmith@xiph.org> - - gst/selector/gstinputselector.c: Ensure we emit notify::active-pad when auto-selecting a pad due to it having activit... - Original commit message from CVS: - * gst/selector/gstinputselector.c: - Ensure we emit notify::active-pad when auto-selecting a pad - due to it having activity and us not having an existing active - pad. Fixes #563147 - -2008-12-04 13:28:45 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Coding style fixes. - Original commit message from CVS: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_header_metadata_resolve_references): - * gst/mxf/mxfdv-dif.c: (mxf_dv_dif_create_caps): - * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps): - Coding style fixes. - * gst/mxf/mxfmpeg.c: (mxf_mpeg_audio_handle_essence_element), - (mxf_mpeg_es_create_caps), (mxf_mpeg_create_caps): - Add support for MPEG, AC3, DTS audio. - -2008-12-04 09:26:25 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: Ignore zero sized essence elements. They're often inserted to fulfill the streaming requirements. - Original commit message from CVS: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_generic_container_essence_element): - Ignore zero sized essence elements. They're often inserted - to fulfill the streaming requirements. - -2008-12-04 08:50:48 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfparse.c: Fix setting of the height/width and PAR of video streams. - Original commit message from CVS: - * gst/mxf/mxfparse.c: - (mxf_metadata_generic_picture_essence_descriptor_set_caps): - Fix setting of the height/width and PAR of video streams. - -2008-12-04 08:37:18 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Add support for SMPTE D10 essence (SMPTE 386M). - Original commit message from CVS: - * gst/mxf/Makefile.am: - * gst/mxf/mxfd10.c: (mxf_is_d10_essence_track), - (mxf_d10_picture_handle_essence_element), - (mxf_d10_sound_handle_essence_element), (mxf_d10_create_caps): - * gst/mxf/mxfd10.h: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_header_metadata_update_streams): - Add support for SMPTE D10 essence (SMPTE 386M). - * gst/mxf/mxfparse.c: - (mxf_metadata_generic_picture_essence_descriptor_set_caps): - Don't set width/height and PAR on the caps as those values are - wrong for most files (height is sometimes the height of a field - and aspect ratio is some random value). - * gst/mxf/mxfaes-bwf.c: (mxf_bwf_create_caps), - (mxf_aes3_create_caps): - Fix calculation of block align if it isn't set in the descriptor. - -2008-12-03 16:08:28 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Add support for AES3 audio (SMPTE 382M). - Original commit message from CVS: - * gst/mxf/mxfaes-bwf.c: - (mxf_metadata_aes3_audio_essence_descriptor_handle_tag), - (mxf_metadata_aes3_audio_essence_descriptor_reset), - (mxf_aes3_handle_essence_element), (mxf_bwf_create_caps), - (mxf_aes3_create_caps), (mxf_aes_bwf_create_caps): - * gst/mxf/mxfaes-bwf.h: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata), - (gst_mxf_demux_handle_metadata_aes3_audio_essence_descriptor), - (gst_mxf_demux_handle_header_metadata_resolve_references), - (gst_mxf_demux_handle_metadata): - * gst/mxf/mxfdemux.h: - Add support for AES3 audio (SMPTE 382M). - * gst/mxf/mxfdv-dif.c: (mxf_dv_dif_create_caps): - * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps): - Fix coding style. - -2008-12-03 13:17:41 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: Improve debugging a bit. - Original commit message from CVS: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_generic_container_essence_element): - Improve debugging a bit. - -2008-12-03 11:43:00 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvparse.c: Check if strings are valid UTF8 before using them. - Original commit message from CVS: - * gst/flv/gstflvparse.c: (FLV_GET_STRING): - Check if strings are valid UTF8 before using them. - -2008-12-03 10:15:27 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfparse.c: Remove FIXME, zero-ULs and UMIDs are really invalid and we can use them as "unset" value. - Original commit message from CVS: - * gst/mxf/mxfparse.c: - Remove FIXME, zero-ULs and UMIDs are really invalid and we can - use them as "unset" value. - -2008-12-03 08:04:38 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: Use a single "track_%u" src pad template and use the track ID of the playback package for the pad... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_header_metadata_update_streams), - (gst_mxf_demux_base_init): - Use a single "track_%u" src pad template and use the track ID - of the playback package for the pad name instead of the track ID - of the source package, as the latter could be the same for - more than one track if they're in different packages. - -2008-12-02 06:21:21 +0000 David Schleef <ds@schleef.org> - - ext/jp2k/gstjasperenc.c: Some compilers complain about uninitialized variable; add a g_assert_not_reached() - Original commit message from CVS: - * ext/jp2k/gstjasperenc.c: Some compilers complain about - uninitialized variable; add a g_assert_not_reached() - -2008-12-01 19:36:35 +0000 이문형 <iwings@gmail.com> - - gst-libs/gst/app/gstappsrc.c: Don't forget to release the lock again if we bail out because some pad is flushing or w... - Original commit message from CVS: - Patch by: 이문형 <iwings at gmail dot com> - * gst-libs/gst/app/gstappsrc.c: (gst_app_src_push_buffer): - Don't forget to release the lock again if we bail out because some - pad is flushing or we've reached EOS, otherwise things will lock up - next time _push_buffer() is called (#562802). - -2008-12-01 16:37:45 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - gst/qtmux/atoms.c: Fix mj2 sample description metadata construction. - Original commit message from CVS: - * gst/qtmux/atoms.c: (build_jp2h_extension): - Fix mj2 sample description metadata construction. - -2008-12-01 15:50:40 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfjpeg2000.c: Use new image/x-jpc caps for the raw JPEG2000 codestream. - Original commit message from CVS: - * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps): - Use new image/x-jpc caps for the raw JPEG2000 codestream. - For now assume sRGB as colorspace, has to be read from the descriptor - somehow later. - -2008-12-01 15:48:13 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/jp2k/: Add image/x-jpc caps name for real, raw JPEG2000 codestream data. - Original commit message from CVS: - * ext/jp2k/gstjasperdec.c: (gst_jasper_dec_sink_setcaps): - * ext/jp2k/gstjasperenc.c: (gst_jasper_enc_reset), - (gst_jasper_enc_set_src_caps), (gst_jasper_enc_init_encoder), - (gst_jasper_enc_sink_setcaps), (gst_jasper_enc_get_data): - * ext/jp2k/gstjasperenc.h: - Add image/x-jpc caps name for real, raw JPEG2000 codestream data. - In 0.11 we should merge image/x-j2c and image/x-jpc and simply drop - the non-standard boxing in the jasper elements and handle it in - qtmux/qtdemux. - image/x-jpc will be used by mxfdemux later. - Also add support for JP2 output in jp2kenc. - -2008-12-01 15:24:37 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Add the codec name, and if possible the avg bitrate, to the pad's taglist. - Original commit message from CVS: - * gst/mxf/mxfaes-bwf.c: (mxf_bwf_create_caps): - * gst/mxf/mxfalaw.c: (mxf_alaw_create_caps): - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_generic_container_essence_element): - * gst/mxf/mxfdv-dif.c: (mxf_dv_dif_create_caps): - * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps): - * gst/mxf/mxfmpeg.c: (mxf_mpeg_es_create_caps), - (mxf_mpeg_create_caps): - Add the codec name, and if possible the avg bitrate, to the pad's taglist. - -2008-12-01 14:25:19 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: If the preface references a primary package use this as the default playback package unless one w... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_choose_package): - If the preface references a primary package use this as the default - playback package unless one was specified by the "package" property. - If there's no preface primary package still try to use the first - material package. - -2008-11-30 17:58:32 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: If there's no descriptor for the track in the track's source package and there's a single descrip... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_header_metadata_resolve_references): - If there's no descriptor for the track in the track's source - package and there's a single descriptor without a linked track - assume that it belongs to this track. - -2008-11-30 17:42:30 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Some random cleanup. - Original commit message from CVS: - * gst/mxf/mxfalaw.c: (mxf_is_alaw_essence_track): - * gst/mxf/mxfalaw.h: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_header_metadata_update_streams): - * gst/mxf/mxfjpeg2000.c: (mxf_is_jpeg2000_essence_track): - * gst/mxf/mxfjpeg2000.h: - * gst/mxf/mxfmpeg.c: (mxf_is_mpeg_essence_track), - (mxf_mpeg_es_create_caps), (mxf_mpeg_create_caps): - * gst/mxf/mxfmpeg.h: - Some random cleanup. - -2008-11-30 17:26:55 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Add property to select the top-level source package or material package that should be used for playback. - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_remove_pads), - (gst_mxf_demux_reset), (gst_mxf_demux_find_package), - (gst_mxf_demux_choose_package), - (gst_mxf_demux_handle_header_metadata_update_streams), - (gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_set_property), - (gst_mxf_demux_get_property), (gst_mxf_demux_finalize), - (gst_mxf_demux_class_init): - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfparse.c: (mxf_umid_from_string): - * gst/mxf/mxfparse.h: - Add property to select the top-level source package or material - package that should be used for playback. - -2008-11-30 16:21:42 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: Make sure that demux->offset has the correct value before calling any gst_mxf_demux_handle_* func... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_random_index_pack): - Make sure that demux->offset has the correct value before - calling any gst_mxf_demux_handle_* functions. - -2008-11-30 14:12:04 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Set the correct MPEG video version if possible and add support for MPEG4 video, including codec_data. - Original commit message from CVS: - * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps): - * gst/mxf/mxfmpeg.c: (mxf_mpeg_video_create_caps): - Set the correct MPEG video version if possible and add support - for MPEG4 video, including codec_data. - -2008-11-29 20:25:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Add initial support for JPEG2000 encoded video essence. - Original commit message from CVS: - * gst/mxf/Makefile.am: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_header_metadata_update_streams): - * gst/mxf/mxfjpeg2000.c: (mxf_is_jpeg2000_video_essence_track), - (mxf_jpeg2000_handle_essence_element), (mxf_jpeg2000_create_caps): - * gst/mxf/mxfjpeg2000.h: - Add initial support for JPEG2000 encoded video essence. - * gst/mxf/mxfparse.c: - (mxf_metadata_generic_picture_essence_descriptor_set_caps): - Set the framerate in the video caps. - -2008-11-29 20:07:11 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/jp2k/gstjasperdec.c: Don't unref the element instance if we don't own a reference. - Original commit message from CVS: - * ext/jp2k/gstjasperdec.c: (gst_jasper_dec_sink_setcaps): - Don't unref the element instance if we don't own a reference. - -2008-11-29 13:33:30 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Require gettext 0.17 because older versions don't mix with libtool 2.2. At build time an older gettext version will s... - Original commit message from CVS: - Patch by: Cygwin Ports maintainer - <yselkowitz at users dot sourceforge dot net> - * autogen.sh: - * configure.ac: - Require gettext 0.17 because older versions don't mix with libtool - 2.2. At build time an older gettext version will still work. - Fixes bug #556091. - -2008-11-28 18:55:01 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: Only try to pull the random index pack at the end of file one time and not for every single packe... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_random_index_pack): - Only try to pull the random index pack at the end of file one time - and not for every single packet if it fails. - -2008-11-28 18:13:30 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Add support for A-Law encoded audio essence (SMPTE 388M and 382M). - Original commit message from CVS: - * gst/mxf/Makefile.am: - * gst/mxf/mxfaes-bwf.c: (mxf_bwf_create_caps): - * gst/mxf/mxfalaw.c: (mxf_is_alaw_audio_essence_track), - (mxf_alaw_handle_essence_element), (mxf_alaw_create_caps): - * gst/mxf/mxfalaw.h: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_header_metadata_update_streams): - Add support for A-Law encoded audio essence (SMPTE 388M and 382M). - -2008-11-28 14:22:50 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - update spec file with latest changes - Original commit message from CVS: - update spec file with latest changes - -2008-11-28 11:24:24 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Implement parsing of index table segments, which will later be used for seeking. - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset), - (gst_mxf_demux_handle_index_table_segment): - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfparse.c: (mxf_index_table_segment_parse), - (mxf_index_table_segment_reset): - * gst/mxf/mxfparse.h: - * gst/mxf/mxftypes.h: - Implement parsing of index table segments, which will later be - used for seeking. - -2008-11-28 09:49:56 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Update audioresample documentation for the new element name. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-amrwb.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mplex.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * gst/audioresample/gstaudioresample.c: - Update audioresample documentation for the new element name. - -2008-11-28 08:37:32 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/audioresample/gstaudioresample.c: And now also update the debug category from audioresample to legacyresample. - Original commit message from CVS: - * gst/audioresample/gstaudioresample.c: - And now also update the debug category from audioresample - to legacyresample. - -2008-11-27 19:27:04 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Remove speexresample from the build system too. - Original commit message from CVS: - * configure.ac: - Remove speexresample from the build system too. - -2008-11-27 19:22:42 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Remove old speexresample files. - Original commit message from CVS: - * gst/speexresample/Makefile.am: - * gst/speexresample/README: - * gst/speexresample/arch.h: - * gst/speexresample/fixed_arm4.h: - * gst/speexresample/fixed_arm5e.h: - * gst/speexresample/fixed_bfin.h: - * gst/speexresample/fixed_debug.h: - * gst/speexresample/fixed_generic.h: - * gst/speexresample/gstspeexresample.c: - * gst/speexresample/gstspeexresample.h: - * gst/speexresample/resample.c: - * gst/speexresample/resample_sse.h: - * gst/speexresample/speex_resampler.h: - * gst/speexresample/speex_resampler_double.c: - * gst/speexresample/speex_resampler_float.c: - * gst/speexresample/speex_resampler_int.c: - * gst/speexresample/speex_resampler_wrapper.h: - * tests/check/elements/speexresample.c: - Remove old speexresample files. - -2008-11-27 17:07:43 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - docs/plugins/inspect/plugin-speexresample.xml: Remove old file. - Original commit message from CVS: - * docs/plugins/inspect/plugin-speexresample.xml: - Remove old file. - -2008-11-27 17:06:43 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - docs/plugins/inspect/plugin-legacyresample.xml: Add missing file. - Original commit message from CVS: - * docs/plugins/inspect/plugin-legacyresample.xml: - Add missing file. - -2008-11-27 16:58:31 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Integrate the moved audioresample into the build system and rename it to legacyresample. Fixes bug #558124. - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - * docs/plugins/inspect/plugin-app.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-speexresample.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-twolame.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - * gst/audioresample/gstaudioresample.c: (plugin_init): - * gst/audioresample/Makefile.am: - * tests/check/Makefile.am: - * tests/check/elements/audioresample.c: (setup_audioresample), - (GST_START_TEST): - Integrate the moved audioresample into the build system and - rename it to legacyresample. Fixes bug #558124. - -2008-11-27 16:26:39 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Implement parsing of the random index pack, which provides a seek table (including body sid) to the start o... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset), - (gst_mxf_demux_handle_random_index_pack), - (gst_mxf_demux_pull_random_index_pack), (gst_mxf_demux_loop): - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfparse.c: (mxf_random_index_pack_parse): - * gst/mxf/mxfparse.h: - * gst/mxf/mxftypes.h: - Implement parsing of the random index pack, which provides a seek - table (including body sid) to the start of partition packs. - Later this will be used for reading all index table segments of - the complete file efficiently. - -2008-11-27 10:09:53 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Add fundamental support for DV-DIF essence streams. - Original commit message from CVS: - * gst/mxf/Makefile.am: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_header_metadata_update_streams), - (gst_mxf_demux_handle_klv_packet): - * gst/mxf/mxfdv-dif.c: (mxf_is_dv_dif_essence_track), - (mxf_dv_dif_handle_essence_element), (mxf_dv_dif_create_caps): - * gst/mxf/mxfdv-dif.h: - * gst/mxf/mxfparse.c: (mxf_is_descriptive_metadata): - * gst/mxf/mxfparse.h: - Add fundamental support for DV-DIF essence streams. - Handle descriptive metadata packets as metadata packets. - -2008-11-27 08:49:08 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.*: Only try to pull the footer metadata once and not on every KLV packet if it failed before. - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset), - (gst_mxf_demux_handle_klv_packet): - * gst/mxf/mxfdemux.h: - Only try to pull the footer metadata once and not on every KLV packet - if it failed before. - -2008-11-26 12:40:18 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/rtpsession.c: Make obtain_source return an aditional ref so that we don't lose our ref to it when a se... - Original commit message from CVS: - * gst/rtpmanager/rtpsession.c: (obtain_source), - (rtp_session_create_source), (rtp_session_process_rtp), - (rtp_session_process_sr), (rtp_session_process_rr), - (rtp_session_process_sdes), (rtp_session_process_bye): - Make obtain_source return an aditional ref so that we don't lose our ref - to it when a session cleanup occurs when we are emiting a signal. - Emit the on_new_ssrc signal for the CSRC, not the SSRC. - Fixes #562319. - -2008-11-26 12:02:21 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Reset the sync parameters when clearing the payload type map too. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_reset_sync), - (gst_rtp_bin_clear_pt_map): - Reset the sync parameters when clearing the payload type map too. - Fixes #562312. - -2008-11-26 11:44:37 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.*: Remove a lot of per stream state that is not needed and pass new info in the method call. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (get_client), - (gst_rtp_bin_reset_sync), (gst_rtp_bin_associate), - (gst_rtp_bin_handle_sync), (create_stream), - (gst_rtp_bin_class_init), (new_ssrc_pad_found): - * gst/rtpmanager/gstrtpbin.h: - Remove a lot of per stream state that is not needed and pass new info in - the method call. - Add signal to reset sync parameters. - Avoid parsing the caps to get a clock_base, we get this from the sync - signal now. - -2008-11-26 11:30:28 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: Properly combine flow returns of the source pads. - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_pad_init), - (gst_mxf_demux_reset_metadata), (gst_mxf_demux_combine_flows), - (gst_mxf_demux_handle_generic_container_essence_element): - Properly combine flow returns of the source pads. - Improve debugging and reset pad fields together with the - metadata to prevent invalid memory references. - * gst/mxf/mxfparse.c: (mxf_metadata_preface_parse): - Fix typo. - -2008-11-26 10:37:34 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: When memset'ing the descriptors to zeroes only touch the part of this descriptor, not it's parent type. - Original commit message from CVS: - * gst/mxf/mxfaes-bwf.c: - (mxf_metadata_wave_audio_essence_descriptor_reset): - * gst/mxf/mxfmpeg.c: (mxf_metadata_mpeg_video_descriptor_reset): - * gst/mxf/mxfparse.c: (mxf_metadata_file_descriptor_handle_tag), - (mxf_metadata_file_descriptor_reset), - (mxf_metadata_generic_sound_essence_descriptor_reset), - (mxf_metadata_generic_picture_essence_descriptor_reset), - (mxf_metadata_cdci_picture_essence_descriptor_reset), - (mxf_metadata_rgba_picture_essence_descriptor_reset), - (mxf_metadata_multiple_descriptor_reset): - * gst/mxf/mxfparse.h: - When memset'ing the descriptors to zeroes only touch the part - of this descriptor, not it's parent type. - Set correct default values for all metadata fields. - -2008-11-26 04:57:22 +0000 David Schleef <ds@schleef.org> - - gst/mpegdemux/gstmpegtsdemux.*: Enable latency code, since we're definitely after 0.10.12 - Original commit message from CVS: - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - Enable latency code, since we're definitely after 0.10.12 - -2008-11-25 18:28:18 +0000 Jonathan Matthew <notverysmart@gmail.com> - - ext/spc/gstspc.c: Post an error and push EOS when we can't start playback for some reason. also avoid a crash when fe... - Original commit message from CVS: - Patch by: Jonathan Matthew <notverysmart at gmail dot com> - * ext/spc/gstspc.c: (gst_spc_dec_sink_event), (spc_setup): - Post an error and push EOS when we can't start playback for some reason. - also avoid a crash when fed an empty file. Fixes #480543. - -2008-11-25 16:37:50 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/speexresample.c: Make unit test again faster to prevent timeouts with valgrind. - Original commit message from CVS: - * tests/check/elements/speexresample.c: (test_pipeline): - Make unit test again faster to prevent timeouts with valgrind. - -2008-11-25 15:12:06 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpsession.c: Fix event leak. - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: - (gst_rtp_session_event_send_rtcp_src): - Fix event leak. - -2008-11-25 14:49:34 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Set video dimensions and pixel aspect ratio on the caps. - Original commit message from CVS: - * gst/mxf/mxfmpeg.c: (mxf_mpeg_video_create_caps): - * gst/mxf/mxfparse.c: - (mxf_metadata_generic_picture_essence_descriptor_set_caps): - * gst/mxf/mxfparse.h: - Set video dimensions and pixel aspect ratio on the caps. - -2008-11-25 10:26:11 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Add initial parsing of RGBA descriptors. - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata), - (gst_mxf_demux_handle_metadata_generic_descriptor), - (gst_mxf_demux_handle_metadata_file_descriptor), - (gst_mxf_demux_handle_metadata_multiple_descriptor), - (gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor), - (gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor), - (gst_mxf_demux_handle_metadata_rgba_picture_essence_descriptor), - (gst_mxf_demux_handle_metadata_mpeg_video_descriptor), - (gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor), - (gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor), - (gst_mxf_demux_handle_header_metadata_resolve_references), - (gst_mxf_demux_handle_metadata): - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfparse.c: - (mxf_metadata_rgba_picture_essence_descriptor_handle_tag), - (mxf_metadata_rgba_picture_essence_descriptor_reset): - * gst/mxf/mxfparse.h: - * gst/mxf/mxftypes.h: - Add initial parsing of RGBA descriptors. - Don't initialize descriptor GArray with zeroes. - -2008-11-25 09:38:26 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Rewrite parsing of descriptors to go top-down instead of bottom-up which makes it possible to have the buff... - Original commit message from CVS: - * gst/mxf/mxfaes-bwf.c: - (mxf_metadata_wave_audio_essence_descriptor_handle_tag): - * gst/mxf/mxfaes-bwf.h: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_metadata_generic_descriptor), - (gst_mxf_demux_handle_metadata_file_descriptor), - (gst_mxf_demux_handle_metadata_multiple_descriptor), - (gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor), - (gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor), - (gst_mxf_demux_handle_metadata_mpeg_video_descriptor), - (gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor), - (gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor), - (gst_mxf_demux_handle_header_metadata_resolve_references), - (gst_mxf_demux_handle_metadata): - * gst/mxf/mxfmpeg.c: - (mxf_metadata_mpeg_video_descriptor_handle_tag): - * gst/mxf/mxfmpeg.h: - * gst/mxf/mxfparse.c: (mxf_partition_pack_parse), - (mxf_primer_pack_parse), (mxf_metadata_preface_parse), - (mxf_metadata_identification_parse), - (mxf_metadata_content_storage_parse), - (mxf_metadata_essence_container_data_parse), - (mxf_metadata_generic_package_parse), (mxf_metadata_track_parse), - (mxf_metadata_sequence_parse), - (mxf_metadata_structural_component_parse), - (mxf_metadata_descriptor_parse), - (mxf_metadata_generic_descriptor_handle_tag), - (mxf_metadata_generic_descriptor_reset), - (mxf_metadata_file_descriptor_handle_tag), - (mxf_metadata_generic_sound_essence_descriptor_handle_tag), - (mxf_metadata_generic_picture_essence_descriptor_handle_tag), - (mxf_metadata_cdci_picture_essence_descriptor_handle_tag), - (mxf_metadata_multiple_descriptor_handle_tag), - (mxf_metadata_locator_parse): - * gst/mxf/mxfparse.h: - Rewrite parsing of descriptors to go top-down instead of bottom-up - which makes it possible to have the buffer data non-writable. - Improve debugging a bit. - -2008-11-25 00:20:22 +0000 Michael Smith <msmith@xiph.org> - - Add new directory for new acmmp3dec plugin - Original commit message from CVS: - * configure.ac: - * sys/Makefile.am: - Add new directory for new acmmp3dec plugin - * sys/acmenc/Makefile.am: - * sys/acmenc/acmmp3dec.c: - Add new acmmp3dec plugin, which uses ACM for decoding mp3 on windows. - -2008-11-24 11:31:27 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: Make sure to only output generic container essence elements for a track if the body SID of the su... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: - (gst_mxf_demux_handle_generic_container_essence_element): - Make sure to only output generic container essence elements - for a track if the body SID of the surrounding partition is - the same as the body SID of the track's source package. - -2008-11-24 11:17:19 +0000 Julien Moutte <julien@moutte.net> - - gst/flv/gstflvdemux.c: Fix non key unit seeking by always going to the previous keyframe. Mark the discont flag when ... - Original commit message from CVS: - 2008-11-24 Julien Moutte <julien@fluendo.com> - * gst/flv/gstflvdemux.c: (gst_flv_demux_find_offset), - (gst_flv_demux_handle_seek_push), - (gst_flv_demux_handle_seek_pull): - Fix non key unit seeking by always going to the previous - keyframe. Mark - the discont flag when we've moved in the file. - * gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate): MP3 - streams - are parsed already, makes autoplugged pipelines shorter. - -2008-11-24 10:46:01 +0000 vanista <vanista@gmail.com> - - gst/mpegtsmux/: Add initial support for muxing AC3/DTS/LPCM into MPEG TS. - Original commit message from CVS: - Patch by: vanista <vanista at gmail dot com> - * gst/mpegtsmux/mpegtsmux.c: (mpegtsmux_create_stream): - * gst/mpegtsmux/tsmux/tsmuxstream.c: (tsmux_stream_new): - Add initial support for muxing AC3/DTS/LPCM into MPEG TS. - Fixes bug #550613. - -2008-11-24 10:41:13 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Allow non-MXF KLV packets and just drop them instead of throwing an error and handle 9 byte product version... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_klv_packet), - (gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_chain): - * gst/mxf/mxfparse.c: (mxf_product_version_parse), - (mxf_metadata_identification_parse), - (mxf_metadata_content_storage_parse): - Allow non-MXF KLV packets and just drop them instead of throwing - an error and handle 9 byte product versions as written by Avid. - This doesn't add support for the non-standard Avid MXF files - but at least makes it possible to parse their header metadata. - Fix a copy&paste error in debug output. - -2008-11-23 17:50:08 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/jack/: Query port latencies for sink/src delays. - Original commit message from CVS: - * ext/jack/gstjackaudiosink.c: - * ext/jack/gstjackaudiosrc.c: - Query port latencies for sink/src delays. - * ext/jack/gstjackbin.c: - No printf please. - -2008-11-23 11:25:30 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/mxfdemux.c: Actually we support a length stored inside 8 bytes but it must be smaller than G_MAXUINT for GstB... - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_klv_packet), - (gst_mxf_demux_chain): - Actually we support a length stored inside 8 bytes but it must - be smaller than G_MAXUINT for GstBuffer. - -2008-11-23 11:16:36 +0000 Tal Shalif <tshalif@nargila.org> - - ext/resindvd/resindvdsrc.c: Fix format string. Fixes bug #561992. - Original commit message from CVS: - Patch by: Tal Shalif <tshalif at nargila dot org> - * ext/resindvd/resindvdsrc.c: - (rsn_dvdsrc_prepare_streamsinfo_event): - Fix format string. Fixes bug #561992. - -2008-11-22 15:31:36 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/rtpsession.c: Add property to configure the RTCP MTU. - Original commit message from CVS: - * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), - (rtp_session_init), (rtp_session_set_property), - (rtp_session_get_property): - Add property to configure the RTCP MTU. - -2008-11-22 15:24:47 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/rtpsession.c: Add G_PARAM_STATIC_STRINGS. - Original commit message from CVS: - * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), - (copy_source), (rtp_session_create_sources), - (rtp_session_get_property): - Add G_PARAM_STATIC_STRINGS. - Add property to return a GValueArray of all known RTPSources in the - session. - * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), - (rtp_source_create_sdes), (rtp_source_set_property), - (rtp_source_get_property): - Remove properties to set the various SDES items, an application is never - supposed to change the RTPSource data. - Change the SDES getter properties to one SDES property that returns all - SDES items in a GstStructure. - -2008-11-22 15:02:15 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/speexresample.c: Make the unit test a bit faster to prevent timeouts, especially with valgrind. - Original commit message from CVS: - * tests/check/elements/speexresample.c: (GST_START_TEST): - Make the unit test a bit faster to prevent timeouts, especially - with valgrind. - -2008-11-22 14:51:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Some more format string fixes and usage of guint instead of gint where negative values don't make sense. - Original commit message from CVS: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_push_src_event), - (gst_mxf_demux_handle_header_metadata_update_streams): - * gst/mxf/mxfparse.c: (gst_mxf_ul_hash), - (mxf_partition_pack_parse), (mxf_primer_pack_parse), - (mxf_metadata_preface_parse), (mxf_metadata_content_storage_parse), - (mxf_metadata_generic_package_parse), - (mxf_metadata_sequence_parse), - (mxf_metadata_generic_descriptor_parse), - (mxf_metadata_multiple_descriptor_parse): - Some more format string fixes and usage of guint instead of gint - where negative values don't make sense. - -2008-11-22 14:42:08 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mxf/: Use guint instead of guint64 or gsize for all buffer sizes and use correct format strings for them. Only lo... - Original commit message from CVS: - * gst/mxf/mxfaes-bwf.c: - (mxf_metadata_wave_audio_essence_descriptor_parse): - * gst/mxf/mxfaes-bwf.h: - * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_range), - (gst_mxf_demux_pull_klv_packet), - (gst_mxf_demux_parse_footer_metadata), - (gst_mxf_demux_handle_klv_packet), - (gst_mxf_demux_pull_and_handle_klv_packet), (gst_mxf_demux_chain): - * gst/mxf/mxfmpeg.c: (mxf_metadata_mpeg_video_descriptor_parse): - * gst/mxf/mxfmpeg.h: - * gst/mxf/mxfparse.c: (mxf_timestamp_parse), (mxf_fraction_parse), - (mxf_utf16_to_utf8), (mxf_product_version_parse), - (mxf_partition_pack_parse), (mxf_primer_pack_parse), - (mxf_local_tag_parse), (mxf_metadata_preface_parse), - (mxf_metadata_identification_parse), - (mxf_metadata_content_storage_parse), - (mxf_metadata_essence_container_data_parse), - (mxf_metadata_generic_package_parse), (mxf_metadata_track_parse), - (mxf_metadata_sequence_parse), - (mxf_metadata_structural_component_parse), - (mxf_metadata_generic_descriptor_parse), - (mxf_metadata_file_descriptor_parse), - (mxf_metadata_generic_sound_essence_descriptor_parse), - (mxf_metadata_generic_picture_essence_descriptor_parse), - (mxf_metadata_cdci_picture_essence_descriptor_parse), - (mxf_metadata_multiple_descriptor_parse), - (mxf_metadata_locator_parse): - * gst/mxf/mxfparse.h: - Use guint instead of guint64 or gsize for all buffer sizes and - use correct format strings for them. Only local tag set sizes - are still guint16 as they can't be larger. - Only allow KLV packets of sizes below 1<<32 as GStreamer only uses - guint for buffer sizes. The MXF standard allows packet sizes up - to 1<<64. - -2008-11-22 13:17:24 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Also unref the target pad for unknown pads. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_release_pad): - Also unref the target pad for unknown pads. - -2008-11-22 08:23:17 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/dccp/gstdccp.c: Use G_GSIZE_FORMAT instead of "%u" for a size_t variable in the format string to prevent a compil... - Original commit message from CVS: - * gst/dccp/gstdccp.c: (gst_dccp_socket_write): - Use G_GSIZE_FORMAT instead of "%u" for a size_t variable in - the format string to prevent a compiler warning. - -2008-11-21 16:17:22 +0000 Olivier Crete <tester@tester.ca> - - gst/rtpmanager/gstrtpbin.c: Release the right pads on rtpbin. Fixes #561752. - Original commit message from CVS: - Patch by: Olivier Crete <tester at tester dot ca> - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_release_pad): - Release the right pads on rtpbin. Fixes #561752. - -2008-11-21 15:45:15 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/gstspeexresample.c: Add a "filter-length" property that maps to the quality values for compatibilty... - Original commit message from CVS: - * gst/speexresample/gstspeexresample.c: - (gst_speex_resample_class_init), (gst_speex_resample_set_property), - (gst_speex_resample_get_property): - Add a "filter-length" property that maps to the quality values - for compatibilty with audioresample. - -2008-11-21 10:37:13 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Remove the "experimental" flag from the deinterlace2 plugin. - Original commit message from CVS: - * configure.ac: - Remove the "experimental" flag from the deinterlace2 plugin. - -2008-11-21 10:27:15 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add first version of an MXF demuxer. Currently it supports - Original commit message from CVS: - * configure.ac: - * gst/mxf/Makefile.am: - * gst/mxf/mxf.c: (plugin_init): - * gst/mxf/mxfaes-bwf.c: - (mxf_metadata_wave_audio_essence_descriptor_parse), - (mxf_metadata_wave_audio_essence_descriptor_reset), - (mxf_is_aes_bwf_essence_track), (mxf_bwf_handle_essence_element), - (mxf_bwf_create_caps), (mxf_aes_bwf_create_caps): - * gst/mxf/mxfaes-bwf.h: - * gst/mxf/mxfdemux.c: (gst_mxf_pad_finalize), - (gst_mxf_pad_class_init), (gst_mxf_pad_init), - (gst_mxf_demux_flush), (gst_mxf_demux_remove_pad), - (gst_mxf_demux_reset_mxf_state), (gst_mxf_demux_reset_metadata), - (gst_mxf_demux_reset), (gst_mxf_demux_pull_range), - (gst_mxf_demux_push_src_event), - (gst_mxf_demux_handle_partition_pack), - (gst_mxf_demux_handle_primer_pack), - (gst_mxf_demux_handle_metadata_preface), - (gst_mxf_demux_handle_metadata_identification), - (gst_mxf_demux_handle_metadata_content_storage), - (gst_mxf_demux_handle_metadata_essence_container_data), - (gst_mxf_demux_handle_metadata_material_package), - (gst_mxf_demux_handle_metadata_source_package), - (gst_mxf_demux_handle_metadata_track), - (gst_mxf_demux_handle_metadata_sequence), - (gst_mxf_demux_handle_metadata_structural_component), - (gst_mxf_demux_handle_metadata_generic_descriptor), - (gst_mxf_demux_handle_metadata_file_descriptor), - (gst_mxf_demux_handle_metadata_multiple_descriptor), - (gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor), - (gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor), - (gst_mxf_demux_handle_metadata_mpeg_video_descriptor), - (gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor), - (gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor), - (gst_mxf_demux_handle_metadata_locator), - (gst_mxf_demux_handle_header_metadata_resolve_references), - (gst_mxf_demux_handle_header_metadata_update_streams), - (gst_mxf_demux_handle_metadata), - (gst_mxf_demux_handle_generic_container_system_item), - (gst_mxf_demux_handle_generic_container_essence_element), - (gst_mxf_demux_handle_random_index_pack), - (gst_mxf_demux_handle_index_table_segment), - (gst_mxf_demux_pull_klv_packet), - (gst_mxf_demux_parse_footer_metadata), - (gst_mxf_demux_handle_klv_packet), - (gst_mxf_demux_pull_and_handle_klv_packet), (gst_mxf_demux_loop), - (gst_mxf_demux_chain), (gst_mxf_demux_src_event), - (gst_mxf_demux_src_query_type), (gst_mxf_demux_src_query), - (gst_mxf_demux_sink_activate), (gst_mxf_demux_sink_activate_push), - (gst_mxf_demux_sink_activate_pull), (gst_mxf_demux_sink_event), - (gst_mxf_demux_change_state), (gst_mxf_demux_finalize), - (gst_mxf_demux_base_init), (gst_mxf_demux_class_init), - (gst_mxf_demux_init): - * gst/mxf/mxfdemux.h: - * gst/mxf/mxfmpeg.c: (mxf_metadata_mpeg_video_descriptor_parse), - (mxf_metadata_mpeg_video_descriptor_reset), - (mxf_is_mpeg_video_essence_track), - (mxf_mpeg_video_handle_essence_element), - (mxf_mpeg_video_create_caps): - * gst/mxf/mxfmpeg.h: - * gst/mxf/mxfparse.c: (mxf_is_mxf_packet), (mxf_is_partition_pack), - (mxf_is_header_partition_pack), (mxf_is_body_partition_pack), - (mxf_is_footer_partition_pack), (mxf_is_fill), - (mxf_is_primer_pack), (mxf_is_metadata), - (mxf_is_random_index_pack), (mxf_is_index_table_segment), - (mxf_is_generic_container_system_item), - (mxf_is_generic_container_essence_element), - (mxf_is_generic_container_essence_container_label), - (mxf_ul_is_equal), (mxf_ul_is_zero), (mxf_ul_to_string), - (mxf_umid_is_equal), (mxf_umid_is_zero), (mxf_umid_to_string), - (gst_mxf_ul_hash), (gst_mxf_ul_equal), (mxf_timestamp_parse), - (mxf_timestamp_is_unknown), (mxf_timestamp_compare), - (mxf_fraction_parse), (mxf_utf16_to_utf8), - (mxf_product_version_parse), (mxf_partition_pack_parse), - (mxf_partition_pack_reset), (_mxf_mapping_ul_free), - (mxf_primer_pack_parse), (mxf_primer_pack_reset), - (mxf_local_tag_parse), (gst_mxf_local_tag_free), - (gst_metadata_add_custom_tag), (mxf_metadata_preface_parse), - (mxf_metadata_preface_reset), (mxf_metadata_identification_parse), - (mxf_metadata_identification_reset), - (mxf_metadata_content_storage_parse), - (mxf_metadata_content_storage_reset), - (mxf_metadata_essence_container_data_parse), - (mxf_metadata_essence_container_data_reset), - (mxf_metadata_generic_package_parse), - (mxf_metadata_generic_package_reset), (mxf_metadata_track_parse), - (mxf_metadata_track_reset), (mxf_metadata_track_identifier_parse), - (mxf_metadata_sequence_parse), (mxf_metadata_sequence_reset), - (mxf_metadata_structural_component_parse), - (mxf_metadata_structural_component_reset), - (mxf_metadata_generic_descriptor_parse), - (mxf_metadata_generic_descriptor_reset), - (mxf_metadata_file_descriptor_parse), - (mxf_metadata_file_descriptor_reset), - (mxf_metadata_generic_sound_essence_descriptor_parse), - (mxf_metadata_generic_sound_essence_descriptor_reset), - (mxf_metadata_generic_picture_essence_descriptor_parse), - (mxf_metadata_generic_picture_essence_descriptor_reset), - (mxf_metadata_cdci_picture_essence_descriptor_parse), - (mxf_metadata_cdci_picture_essence_descriptor_reset), - (mxf_metadata_multiple_descriptor_parse), - (mxf_metadata_multiple_descriptor_reset), - (mxf_metadata_locator_parse), (mxf_metadata_locator_reset): - * gst/mxf/mxfparse.h: - * gst/mxf/mxftypes.h: - Add first version of an MXF demuxer. Currently it supports - MPEG video and raw audio and OP 1a/b/c. - -2008-11-21 00:47:37 +0000 Michael Smith <msmith@xiph.org> - - sys/dshowdecwrapper/gstdshowaudiodec.cpp: Fix flushing/seeking problems returning error code. - Original commit message from CVS: - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - Fix flushing/seeking problems returning error code. - Fix mp3 decoding with winXP (crashed randomly, occasionally). - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - Fix problems when framerate is missing from video. - -2008-11-20 18:41:34 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpsession.c: Pass the running time to the session when processing RTP packets. - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: (get_current_times), - (rtcp_thread), (gst_rtp_session_chain_recv_rtp): - Pass the running time to the session when processing RTP packets. - Improve the time function to provide more info. - * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), - (rtp_session_init), (update_arrival_stats), - (rtp_session_process_rtp), (rtp_session_process_sdes), - (rtp_session_process_rtcp), (session_start_rtcp), - (rtp_session_on_timeout): - * gst/rtpmanager/rtpsession.h: - Mark the internal source with a flag. - Use running_time instead of the more useless timestamp. - Validate a source when a valid SDES has been received. - Pass the current system time when processing SR packets. - * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), - (rtp_source_init), (rtp_source_create_stats), - (rtp_source_get_property), (rtp_source_send_rtp), - (rtp_source_process_rb), (rtp_source_get_new_rb), - (rtp_source_get_last_rb): - * gst/rtpmanager/rtpsource.h: - Add property to get source stats. - Mark params as STATIC_STRINGS. - Calculate the bitrate at the sender SSRC. - Avoid negative values in the round trip time calculations. - * gst/rtpmanager/rtpstats.h: - Update some docs and change some variable name to more closely reflect - what it contains. - -2008-11-20 16:01:27 +0000 Leandro Melo de Sales <leandroal@gmail.com> - - gst/dccp/: CodeStyle improvements and minor fixes to the DCCP plugin. - Original commit message from CVS: - patch by: Leandro Melo de Sales <leandroal@gmail.com> - * gst/dccp/gstdccp.c: - * gst/dccp/gstdccp.h: - * gst/dccp/gstdccpclientsink.c: - * gst/dccp/gstdccpclientsink.h: - * gst/dccp/gstdccpclientsrc.c: - * gst/dccp/gstdccpserversink.c: - * gst/dccp/gstdccpserversrc.c: - * gst/dccp/gstdccpserversrc.h: - CodeStyle improvements and minor fixes to the DCCP plugin. - Fixes #553823. - -2008-11-20 08:19:15 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/rtpmanager/gstrtpjitterbuffer.c: Initialize return value to fix compiler warning about uninitialized variable. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_chain_rtcp): - Initialize return value to fix compiler warning about uninitialized - variable. - -2008-11-19 16:48:38 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Mark signal arg as static scope. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_class_init): - Mark signal arg as static scope. - -2008-11-19 09:06:29 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Remove internal sync pad, use signals instead to get lip-sync notifications. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), - (gst_rtp_bin_handle_sync), (create_stream), (free_stream), - (new_ssrc_pad_found): - Remove internal sync pad, use signals instead to get lip-sync - notifications. - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_base_init), - (gst_rtp_jitter_buffer_class_init), - (gst_rtp_jitter_buffer_internal_links), (create_rtcp_sink), - (remove_rtcp_sink), (gst_rtp_jitter_buffer_request_new_pad), - (gst_rtp_jitter_buffer_release_pad), - (gst_rtp_jitter_buffer_sink_rtcp_event), - (gst_rtp_jitter_buffer_chain_rtcp), - (gst_rtp_jitter_buffer_get_property): - * gst/rtpmanager/gstrtpjitterbuffer.h: - Make it possible to send SR packets to the jitterbuffer. - Check if the SR timestamps are valid by comparing them to the RTP - timestamps. - Signal the SR packet and the timing information to listeners. - * gst/rtpmanager/gstrtpssrcdemux.c: (create_demux_pad_for_ssrc), - (gst_rtp_ssrc_demux_rtcp_chain), (gst_rtp_ssrc_demux_src_query): - Remove some unused code. - * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), - (calculate_skew), (rtp_jitter_buffer_get_sync): - * gst/rtpmanager/rtpjitterbuffer.h: - Keep track of the last seen RTP timestamp so that we can filter out - invalid SR packets. - -2008-11-18 16:52:11 +0000 Alessandro Decina <alessandro.d@gmail.com> - - ext/metadata/gstbasemetadata.c: Avoid deadlock during pad activation. - Original commit message from CVS: - * ext/metadata/gstbasemetadata.c: - Avoid deadlock during pad activation. - Fixes #561241. - -2008-11-18 01:09:09 +0000 David Schleef <ds@schleef.org> - - gst/qtmux/gstqtmux.c: Quiet a debugging message that I recently added. - Original commit message from CVS: - * gst/qtmux/gstqtmux.c: Quiet a debugging message that I recently - added. - -2008-11-17 19:47:32 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/rtpmanager/rtpsource.c: Fix GST_DEBUG call to only have as many arguments as required by the format string. Fixes... - Original commit message from CVS: - * gst/rtpmanager/rtpsource.c: (get_clock_rate): - Fix GST_DEBUG call to only have as many arguments as required - by the format string. Fixes a compiler warning. - -2008-11-17 15:17:52 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Do not try to keep track of the clock-rate ourselves but simply get the value from the ji... - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), - (gst_rtp_bin_sync_chain), (create_stream), (new_ssrc_pad_found): - Do not try to keep track of the clock-rate ourselves but simply get the - value from the jitterbuffer. - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_chain), - (gst_rtp_jitter_buffer_get_sync): - * gst/rtpmanager/gstrtpjitterbuffer.h: - Add some debug info. - Pass the clock-rate to the jitterbuffer. - Also pass the clock-rate along with the rtp timestamp when getting the - sync parameters. - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): - Fix some debug. - * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), - (calculate_skew), (rtp_jitter_buffer_get_sync): - * gst/rtpmanager/rtpjitterbuffer.h: - Keep track of clock-rate changes and return the clock-rate together with - the rtp timestamps used for sync. - Don't try to construct timestamps when we have no base_time. - * gst/rtpmanager/rtpsource.c: (get_clock_rate): - Request a new clock-rate when the payload type changes. - Reset the jitter calculation when the clock-rate changes. - -2008-11-17 09:33:50 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/check/elements/: Add missing files. - Original commit message from CVS: - * tests/check/elements/aacparse_data.h: - * tests/check/elements/amrparse_data.h: - Add missing files. - -2008-11-15 02:56:31 +0000 David Schleef <ds@schleef.org> - - gst/qtmux/gstqtmux.*: Use dts from GST_BUFFER_OFFSET_END() for video/x-qt-part. - Original commit message from CVS: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - Use dts from GST_BUFFER_OFFSET_END() for video/x-qt-part. - -2008-11-14 23:01:56 +0000 David Schleef <ds@schleef.org> - - sys/qtwrapper/codecmapping.c: Add some of our favorite codecs. - Original commit message from CVS: - * sys/qtwrapper/codecmapping.c: Add some of our favorite codecs. - -2008-11-14 21:44:32 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/audioresample/gstaudioresample.c: Guard against a NULL dereference I somehow encountered - with a FLUSH_STOP arri... - Original commit message from CVS: - * gst/audioresample/gstaudioresample.c: - Guard against a NULL dereference I somehow encountered - - with a FLUSH_STOP arriving either before basetransform _start(), - or after _stop(). - * gst/typefind/gsttypefindfunctions.c: - Make sure we never jump backwards when typefinding corrupt mov files. - -2008-11-14 21:24:51 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - gst/qtmux/: Revert previous commit. - Original commit message from CVS: - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/descriptors.c: - * gst/qtmux/descriptors.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/ftypcc.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - * gst/qtmux/gstqtmuxmap.c: - * gst/qtmux/gstqtmuxmap.h: - * gst/qtmux/properties.c: - * gst/qtmux/properties.h: - Revert previous commit. - -2008-11-14 20:38:18 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - gst/qtmux/: Dual license LGPL/MIT, as apparently supposed to. - Original commit message from CVS: - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/descriptors.c: - * gst/qtmux/descriptors.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/ftypcc.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - * gst/qtmux/gstqtmuxmap.c: - * gst/qtmux/gstqtmuxmap.h: - * gst/qtmux/properties.c: - * gst/qtmux/properties.h: - Dual license LGPL/MIT, as apparently supposed to. - -2008-11-14 20:17:10 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - gst/qtmux/: Cut detour in sample description extension construction. - Original commit message from CVS: - * gst/qtmux/atoms.c: (build_esds_extension), - (build_mov_aac_extension), (build_jp2h_extension), - (build_codec_data_extension): - * gst/qtmux/atoms.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/gstqtmux.c: (gst_qt_mux_audio_sink_set_caps), - (gst_qt_mux_video_sink_set_caps): - * gst/qtmux/gstqtmuxmap.c: (gst_qt_mux_map_format_to_header): - Cut detour in sample description extension construction. - Also actually implement ISO JPEG2000 mj2 format. - -2008-11-14 19:52:24 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - ext/x264/gstx264enc.c: Construct source caps in more conventional (and correct) manner. - Original commit message from CVS: - * ext/x264/gstx264enc.c: (gst_x264_enc_set_src_caps): - Construct source caps in more conventional (and correct) manner. +2022-01-05 10:15:34 -0300 Thibault Saunier <tsaunier@igalia.com> -2008-11-14 16:15:43 +0000 Christian Schaller <uraeus@gnome.org> + * ext/wpe/gstwpesrcbin.cpp: + wpe: Mark first audio buffer as discont + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1492> - * ChangeLog: - * configure.ac: - * gst-plugins-bad.spec.in: - no more egging the pudding - Original commit message from CVS: - no more egging the pudding - -2008-11-14 14:23:02 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst-libs/gst/play/: Remove cruft. This is not entered by make and its not even compilable. - Original commit message from CVS: - * gst-libs/gst/play/.cvsignore: - * gst-libs/gst/play/play.h: - * gst-libs/gst/play/play.vcproj: - Remove cruft. This is not entered by make and its not even compilable. - -2008-11-13 22:30:54 +0000 David Schleef <ds@schleef.org> - - ext/dirac/gstdiracenc.cc: Set pixel-aspect-ratio correctly in the encoder API, as well as some default gstreamerish c... - Original commit message from CVS: - * ext/dirac/gstdiracenc.cc: - Set pixel-aspect-ratio correctly in the encoder API, as well - as some default gstreamerish colorspace properties. Also, - apparently, change a bunch of indentation. - -2008-11-13 21:44:15 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - ext/jp2k/: Add jp2kenc to jp2k plugin. - Original commit message from CVS: - * ext/jp2k/Makefile.am: - * ext/jp2k/gstjasperdec.c: (gst_jasper_dec_class_init), - (gst_jasper_dec_change_state): - * ext/jp2k/gstjasperenc.c: (gst_jasper_enc_base_init), - (gst_jasper_enc_class_init), (gst_jasper_enc_init), - (gst_jasper_enc_reset), (gst_jasper_enc_set_src_caps), - (gst_jasper_enc_init_encoder), (gst_jasper_enc_sink_setcaps), - (gst_jasper_enc_get_data), (gst_jasper_enc_chain), - (gst_jasper_enc_set_property), (gst_jasper_enc_get_property), - (gst_jasper_enc_change_state): - * ext/jp2k/gstjasperenc.h: - * ext/jp2k/gstjp2k.c: (plugin_init): - Add jp2kenc to jp2k plugin. - -2008-11-13 21:31:14 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - ext/jp2k/gstjasperdec.*: Make pad template caps reflect the supported formats. - Original commit message from CVS: - * ext/jp2k/gstjasperdec.c: (gst_jasper_dec_init), - (gst_jasper_dec_reset), (gst_jasper_dec_negotiate), - (gst_jasper_dec_get_picture): - * ext/jp2k/gstjasperdec.h: - Make pad template caps reflect the supported formats. - Add or modify some debug statements, and slightly simplify image - passing to encoding library. - -2008-11-13 17:24:58 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/aacparse/gstaacparse.c: Don't autoplug aacparse until it works. - Original commit message from CVS: - * gst/aacparse/gstaacparse.c: (plugin_init): - Don't autoplug aacparse until it works. - -2008-11-13 15:48:54 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Small cleanups and some more debug info. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_jitter_buffer_sink_parse_caps), - (gst_rtp_jitter_buffer_flush_stop), (gst_rtp_jitter_buffer_chain): - * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), - (calculate_skew): - Small cleanups and some more debug info. - -2008-11-13 15:20:15 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/check/: Add unit tests for new parsers. - Original commit message from CVS: - * tests/check/Makefile.am: - * tests/check/elements/aacparse.c: - * tests/check/elements/amrparse.c: - Add unit tests for new parsers. - -2008-11-13 14:31:45 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/: Update docs. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-aacparse.xml: - * docs/plugins/inspect/plugin-amrparse.xml: - Update docs. - -2008-11-13 14:21:39 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/: Fix baseparse type name. - Original commit message from CVS: - * gst/aacparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.c: - Fix baseparse type name. - -2008-11-13 12:59:34 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Add two new baseparse based parsers (aac and amr) from Bug #518857. - Original commit message from CVS: - * configure.ac: - * gst/aacparse/Makefile.am: - * gst/aacparse/gstaacparse.c: - * gst/aacparse/gstaacparse.h: - * gst/aacparse/gstbaseparse.c: - * gst/aacparse/gstbaseparse.h: - * gst/amrparse/Makefile.am: - * gst/amrparse/gstamrparse.c: - * gst/amrparse/gstamrparse.h: - * gst/amrparse/gstbaseparse.c: - * gst/amrparse/gstbaseparse.h: - Add two new baseparse based parsers (aac and amr) from Bug #518857. - -2008-11-12 10:32:24 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/rfbdecoder.c: Fix uninitialized warnings - Original commit message from CVS: - * gst/librfb/rfbdecoder.c: - Fix uninitialized warnings - -2008-11-11 19:31:35 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - tests/check/: Add unit test for qtmux. - Original commit message from CVS: - * tests/check/Makefile.am: - * tests/check/elements/qtmux.c: (setup_src_pad), - (teardown_src_pad), (setup_qtmux), (cleanup_qtmux), - (check_qtmux_pad), (GST_START_TEST), (qtmux_suite), (main): - Add unit test for qtmux. - -2008-11-11 19:24:12 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - gst/qtmux/gstqtmux.c: Add some more safety/sanity checks in tag manipulation. - Original commit message from CVS: - * gst/qtmux/gstqtmux.c: (gst_qt_mux_add_metadata_tags): - Add some more safety/sanity checks in tag manipulation. - -2008-11-10 15:26:40 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Also configure the next expected output seqnum when we get a seqnum-base on the ... - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_chain): - Also configure the next expected output seqnum when we get a seqnum-base - on the caps. - -2008-11-10 14:53:45 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/: Wim, you're a bad boy. You don't want people to contact you or what? - Original commit message from CVS: - * gst-libs/gst/app/gstappsink.c: - * gst-libs/gst/app/gstappsrc.c: - * gst/h264parse/gsth264parse.c: - Wim, you're a bad boy. You don't want people to contact you or what? - -2008-11-10 14:01:42 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst/filter/gstiir.c: Fix name tag. - Original commit message from CVS: - * gst/filter/gstiir.c: - Fix name tag. - -2008-11-08 02:00:58 +0000 Thiago Sousa Santos <thiagossantos@gmail.com> - - Copy qtmux from revision 148 of the gst-qtmux repository. - Original commit message from CVS: - patch by: Thiago Sousa Santos <thiagossantos@gmail.com> - * configure.ac: - * gst/qtmux/Makefile.am: - * gst/qtmux/atoms.c: - * gst/qtmux/atoms.h: - * gst/qtmux/descriptors.c: - * gst/qtmux/descriptors.h: - * gst/qtmux/fourcc.h: - * gst/qtmux/ftypcc.h: - * gst/qtmux/gstqtmux.c: - * gst/qtmux/gstqtmux.h: - * gst/qtmux/gstqtmuxmap.c: - * gst/qtmux/gstqtmuxmap.h: - * gst/qtmux/properties.c: - * gst/qtmux/properties.h: - Copy qtmux from revision 148 of the gst-qtmux repository. - Fixes #550280. - -2008-11-07 17:35:46 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst-libs/gst/app/gstappsrc.*: Add is-live property. - Original commit message from CVS: - * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init), - (gst_app_src_init), (gst_app_src_set_property), - (gst_app_src_get_property), (gst_app_src_push_buffer): - * gst-libs/gst/app/gstappsrc.h: - Add is-live property. - Add some more docs. - -2008-11-06 22:54:39 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - Fix basic navigation events - Original commit message from CVS: - * configure.ac: - * gst/librfb/Makefile.am: - * gst/librfb/gstrfbsrc.c: - Fix basic navigation events - -2008-11-06 14:05:55 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/deinterlace2/gstdeinterlace2.c: Bring properties into this century. - Original commit message from CVS: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace2_class_init), (gst_deinterlace2_init), - (gst_deinterlace2_set_property), (gst_deinterlace2_get_property): - Bring properties into this century. - -2008-11-06 13:00:54 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: Set filters in PAUSED or PLAYING. - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - Set filters in PAUSED or PLAYING. - -2008-11-06 12:17:08 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegdemux/gstmpegtsdemux.c: Make private section pads have a caps set so they are not tried to be linked in parse... - Original commit message from CVS: - * gst/mpegdemux/gstmpegtsdemux.c: - Make private section pads have a caps set so they are not tried - to be linked in parse_launch for example. - -2008-11-06 11:31:03 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegdemux/gstmpegtsdemux.c: No need to reclaculate flush in this case. - Original commit message from CVS: - patch by: Josep Torra - * gst/mpegdemux/gstmpegtsdemux.c: - No need to reclaculate flush in this case. - Fixes some bad decode errors introduced. - -2008-11-06 10:42:59 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegdemux/gstmpegtsdemux.*: Fix typo. - Original commit message from CVS: - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - Fix typo. - -2008-11-05 23:31:41 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/gstrfbsrc.c: Fix RGB mask in caps - Original commit message from CVS: - * gst/librfb/gstrfbsrc.c: - Fix RGB mask in caps - -2008-11-05 22:25:25 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/: Add Hextile encoding - Original commit message from CVS: - * gst/librfb/gstrfbsrc.c: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - Add Hextile encoding - -2008-11-05 18:52:38 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegdemux/gstmpegtsdemux.c: Heuristic approach when resyncing. - Original commit message from CVS: - patch by: Josep Torra - * gst/mpegdemux/gstmpegtsdemux.c: - Heuristic approach when resyncing. - -2008-11-05 18:11:55 +0000 Sebastian Pölsterl <marduk@k-d-w.org> - - gst/mpegdemux/gstmpegdesc.c: Length should be a guint8 not a gint. - Original commit message from CVS: - patch by: Sebastian Pölsterl - * gst/mpegdemux/gstmpegdesc.c: - Length should be a guint8 not a gint. - * gst/mpegdemux/mpegtspacketizer.c: - Convert text to utf8 for each descriptor separately and not - concatenate them first and convert after. - -2008-11-04 20:26:00 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/modplug/gstmodplug.cc: Send tag event. Fixes #559286. - Original commit message from CVS: - * gst/modplug/gstmodplug.cc: - Send tag event. Fixes #559286. - -2008-11-04 18:03:55 +0000 Sebastian Pölsterl <marduk@k-d-w.org> - - gst/mpegdemux/mpegtsparse.c: Fix another memleak. - Original commit message from CVS: - patch by: Sebastian Pölsterl - * gst/mpegdemux/mpegtsparse.c: - Fix another memleak. - -2008-11-04 17:25:09 +0000 Sebastian Pölsterl <marduk@k-d-w.org> - - Fix memleaks. - Original commit message from CVS: - patch by: Sebastian Pölsterl - * gst/mpegdemux/mpegtspacketizer.c: - * sys/dvb/gstdvbsrc.c: - Fix memleaks. - -2008-11-04 12:42:30 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Don't install static libs for plugins. Fixes #550851 for -bad. - Original commit message from CVS: - * ext/alsaspdif/Makefile.am: - * ext/amrwb/Makefile.am: - * ext/apexsink/Makefile.am: - * ext/arts/Makefile.am: - * ext/artsd/Makefile.am: - * ext/audiofile/Makefile.am: - * ext/audioresample/Makefile.am: - * ext/bz2/Makefile.am: - * ext/cdaudio/Makefile.am: - * ext/celt/Makefile.am: - * ext/dc1394/Makefile.am: - * ext/dirac/Makefile.am: - * ext/directfb/Makefile.am: - * ext/divx/Makefile.am: - * ext/dts/Makefile.am: - * ext/faac/Makefile.am: - * ext/faad/Makefile.am: - * ext/gsm/Makefile.am: - * ext/hermes/Makefile.am: - * ext/ivorbis/Makefile.am: - * ext/jack/Makefile.am: - * ext/jp2k/Makefile.am: - * ext/ladspa/Makefile.am: - * ext/lcs/Makefile.am: - * ext/libfame/Makefile.am: - * ext/libmms/Makefile.am: - * ext/metadata/Makefile.am: - * ext/mpeg2enc/Makefile.am: - * ext/mplex/Makefile.am: - * ext/musepack/Makefile.am: - * ext/musicbrainz/Makefile.am: - * ext/mythtv/Makefile.am: - * ext/nas/Makefile.am: - * ext/neon/Makefile.am: - * ext/ofa/Makefile.am: - * ext/polyp/Makefile.am: - * ext/resindvd/Makefile.am: - * ext/sdl/Makefile.am: - * ext/shout/Makefile.am: - * ext/snapshot/Makefile.am: - * ext/sndfile/Makefile.am: - * ext/soundtouch/Makefile.am: - * ext/spc/Makefile.am: - * ext/swfdec/Makefile.am: - * ext/tarkin/Makefile.am: - * ext/theora/Makefile.am: - * ext/timidity/Makefile.am: - * ext/twolame/Makefile.am: - * ext/x264/Makefile.am: - * ext/xine/Makefile.am: - * ext/xvid/Makefile.am: - * gst-libs/gst/app/Makefile.am: - * gst-libs/gst/dshow/Makefile.am: - * gst/aiffparse/Makefile.am: - * gst/app/Makefile.am: - * gst/audiobuffer/Makefile.am: - * gst/bayer/Makefile.am: - * gst/cdxaparse/Makefile.am: - * gst/chart/Makefile.am: - * gst/colorspace/Makefile.am: - * gst/dccp/Makefile.am: - * gst/deinterlace/Makefile.am: - * gst/deinterlace2/Makefile.am: - * gst/dvdspu/Makefile.am: - * gst/festival/Makefile.am: - * gst/filter/Makefile.am: - * gst/flacparse/Makefile.am: - * gst/flv/Makefile.am: - * gst/games/Makefile.am: - * gst/h264parse/Makefile.am: - * gst/librfb/Makefile.am: - * gst/mixmatrix/Makefile.am: - * gst/modplug/Makefile.am: - * gst/mpeg1sys/Makefile.am: - * gst/mpeg4videoparse/Makefile.am: - * gst/mpegdemux/Makefile.am: - * gst/mpegtsmux/Makefile.am: - * gst/mpegvideoparse/Makefile.am: - * gst/mve/Makefile.am: - * gst/nsf/Makefile.am: - * gst/nuvdemux/Makefile.am: - * gst/overlay/Makefile.am: - * gst/passthrough/Makefile.am: - * gst/pcapparse/Makefile.am: - * gst/playondemand/Makefile.am: - * gst/rawparse/Makefile.am: - * gst/real/Makefile.am: - * gst/rtjpeg/Makefile.am: - * gst/rtpmanager/Makefile.am: - * gst/scaletempo/Makefile.am: - * gst/sdp/Makefile.am: - * gst/selector/Makefile.am: - * gst/smooth/Makefile.am: - * gst/smoothwave/Makefile.am: - * gst/speed/Makefile.am: - * gst/speexresample/Makefile.am: - * gst/stereo/Makefile.am: - * gst/subenc/Makefile.am: - * gst/tta/Makefile.am: - * gst/vbidec/Makefile.am: - * gst/videodrop/Makefile.am: - * gst/videosignal/Makefile.am: - * gst/virtualdub/Makefile.am: - * gst/vmnc/Makefile.am: - * gst/y4m/Makefile.am: - * sys/acmenc/Makefile.am: - * sys/cdrom/Makefile.am: - * sys/dshowdecwrapper/Makefile.am: - * sys/dshowsrcwrapper/Makefile.am: - * sys/dvb/Makefile.am: - * sys/dxr3/Makefile.am: - * sys/fbdev/Makefile.am: - * sys/oss4/Makefile.am: - * sys/qcam/Makefile.am: - * sys/qtwrapper/Makefile.am: - * sys/vcd/Makefile.am: - * sys/wininet/Makefile.am: - * win32/common/config.h: - Don't install static libs for plugins. Fixes #550851 for -bad. - -2008-11-04 08:24:10 +0000 Sebastian Pölsterl <marduk@k-d-w.org> - - gst/mpegdemux/mpegtsparse.c: Fix memleak. - Original commit message from CVS: - patch by: Sebastian Pölsterl - * gst/mpegdemux/mpegtsparse.c: - Fix memleak. - -2008-11-03 22:00:09 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - examples/scaletempo/.cvsignore: Add example to cvs ignores. - Original commit message from CVS: - * examples/scaletempo/.cvsignore: - Add example to cvs ignores. - -2008-11-03 21:27:31 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - sys/qtwrapper/audiodecoders.c: Fix mismatched signedness compiler warning. - Original commit message from CVS: - * sys/qtwrapper/audiodecoders.c: - (open_decoder): - Fix mismatched signedness compiler warning. - -2008-11-03 08:55:49 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/gstspeexresample.c: Add TODO at the top of the file for enabling SSE/ARM specific optimizations and... - Original commit message from CVS: - * gst/speexresample/gstspeexresample.c: - (gst_speex_resample_convert_buffer): - Add TODO at the top of the file for enabling SSE/ARM specific - optimizations and choosing the fastest implementation at runtime. - Add g_assert_not_reached() at two places that should really never - be reached. - -2008-11-02 09:19:24 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/gstspeexresample.c: Fix format string and arguments. - Original commit message from CVS: - * gst/speexresample/gstspeexresample.c: - (gst_speex_resample_check_discont): - Fix format string and arguments. - * gst/speexresample/resample_sse.h: - Add missing file. - -2008-11-01 21:37:06 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/resindvd/Makefile.am: Dist the play scripts. - Original commit message from CVS: - * ext/resindvd/Makefile.am: - Dist the play scripts. - -2008-11-01 19:38:36 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/: Add missing headers to Makefile.am. - Original commit message from CVS: - * gst/speexresample/Makefile.am: - * gst/speexresample/gstspeexresample.c: - (gst_speex_resample_base_init), (gst_speex_resample_get_funcs), - (gst_speex_resample_convert_buffer), (_benchmark_int_float), - (_benchmark_int_int), (_benchmark_integer_resampling), - (plugin_init): - * gst/speexresample/gstspeexresample.h: - * gst/speexresample/resample.c: - * gst/speexresample/speex_resampler_double.c: - * gst/speexresample/speex_resampler_float.c: - * gst/speexresample/speex_resampler_int.c: - * gst/speexresample/speex_resampler_wrapper.h: - Add missing headers to Makefile.am. - Update copyright, years and my mail address. - Benchmark the integer resampling implementation against the - float implementation and use the faster one for 8/16 bit integer - input. On most recent systems the floating point version is faster. - -2008-10-31 18:39:37 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Use AC_TRY_COMPILE instead of AC_TRY_RUN as the result of the linking is what is interesting, not that ... - Original commit message from CVS: - * configure.ac: - Use AC_TRY_COMPILE instead of AC_TRY_RUN as the result of the linking - is what is interesting, not that it actually runs. - Fixes cross-compilation and fixes bug #558639. - -2008-10-30 19:54:38 +0000 Michael Smith <msmith@xiph.org> - - sys/qtwrapper/audiodecoders.c: Add ALAC support. - Original commit message from CVS: - * sys/qtwrapper/audiodecoders.c: - Add ALAC support. - Fix decode of mono AAC files created by itunes. - Set output format correctly (don't ask quicktime to - resample for us). - Use a larger decode buffer to avoid problems with large - ALAC packets. - Fix decode to loop until we have all output data. - * sys/qtwrapper/qtutils.c: - Fix includes so we compile on more OSes. - -2008-10-30 15:31:59 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Require at least Gtk 2.8.0 for the demos (that's the oldest I can test with; I'm fairly certain Gtk 2.0... - Original commit message from CVS: - * configure.ac: - Require at least Gtk 2.8.0 for the demos (that's the oldest I can - test with; I'm fairly certain Gtk 2.0.0 is not good enough any - longer); clean up some unused Gtk-related configure cruft. - * examples/scaletempo/demo-gui.c: - Define Gtk 2.12 function to noop when compiling against older Gtk. - -2008-10-30 14:55:43 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/gstspeexresample.c: The length for the buffer conversion function is the number of audio frames, i.... - Original commit message from CVS: - * gst/speexresample/gstspeexresample.c: - (gst_speex_resample_convert_buffer): - The length for the buffer conversion function is the number of - audio frames, i.e. we need to multiply it by the number of channels - to get the number of values. Also spotted by the unit test after - running in valgrind. - -2008-10-30 14:46:31 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/speexresample.c: Add pipeline unit tests for testing all supported formats with up/downsampling ... - Original commit message from CVS: - * tests/check/elements/speexresample.c: (element_message_cb), - (eos_message_cb), (test_pipeline), (GST_START_TEST), - (speexresample_suite): - Add pipeline unit tests for testing all supported formats with - up/downsampling and different in/outrates. - * gst/speexresample/gstspeexresample.c: - (gst_speex_resample_push_drain), (gst_speex_resample_process): - * gst/speexresample/speex_resampler_wrapper.h: - Fix bugs identified by the testsuite. - -2008-10-30 13:44:41 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/: Add support for int8, int24 and int32 input by converting internally to/from int16 or double. - Original commit message from CVS: - * gst/speexresample/gstspeexresample.c: (gst_speex_resample_stop), - (gst_speex_resample_get_funcs), - (gst_speex_resample_transform_size), - (gst_speex_resample_convert_buffer), - (gst_speex_resample_push_drain), (gst_speex_resample_process): - * gst/speexresample/gstspeexresample.h: - * gst/speexresample/speex_resampler_wrapper.h: - Add support for int8, int24 and int32 input by converting internally - to/from int16 or double. - -2008-10-30 13:38:19 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/resindvd/resindvdsrc.*: Better fix for #546319 and similar cases by explicitly registering when we're in playing ... - Original commit message from CVS: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - Better fix for #546319 and similar cases by explicitly - registering when we're in playing state or not. - -2008-10-30 13:02:18 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/ladspa/gstladspa.c: Whitespace. - Original commit message from CVS: - * ext/ladspa/gstladspa.c: - Whitespace. - * ext/ladspa/gstsignalprocessor.c: - Add a FIXME:. not sure if this code does the forwarding correctly. - -2008-10-30 12:43:44 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add support for double samples as input and refactor the usage of the different compilation flavors of the speex resa... - Original commit message from CVS: - * gst/speexresample/Makefile.am: - * gst/speexresample/arch.h: - * gst/speexresample/gstspeexresample.c: (gst_speex_resample_stop), - (gst_speex_resample_get_unit_size), (gst_speex_resample_get_funcs), - (gst_speex_resample_init_state), (gst_speex_resample_update_state), - (gst_speex_resample_reset_state), (gst_speex_resample_parse_caps), - (_gcd), (gst_speex_resample_transform_size), - (gst_speex_resample_set_caps), (gst_speex_resample_push_drain), - (gst_speex_resample_process), (gst_speex_resample_transform), - (gst_speex_resample_query), (gst_speex_resample_set_property): - * gst/speexresample/gstspeexresample.h: - * gst/speexresample/resample.c: - * gst/speexresample/speex_resampler.h: - * gst/speexresample/speex_resampler_double.c: - * gst/speexresample/speex_resampler_wrapper.h: - * tests/check/elements/speexresample.c: (setup_speexresample), - (test_perfect_stream_instance), (GST_START_TEST), - (test_discont_stream_instance): - Add support for double samples as input and refactor the usage - of the different compilation flavors of the speex resampler. - -2008-10-30 12:13:18 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/scaletempo/gstscaletempo.c: Return the result of parent_class->event(). - Original commit message from CVS: - * gst/scaletempo/gstscaletempo.c: - Return the result of parent_class->event(). - -2008-10-30 11:50:52 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/audiobuffer/: Add first version of an audioringbuffer element that can be inserted in the pipeline to convert pus... - Original commit message from CVS: - * gst/audiobuffer/Makefile.am: - * gst/audiobuffer/gstaudioringbuffer.c: - (gst_int_ring_buffer_acquire), (gst_int_ring_buffer_release), - (gst_int_ring_buffer_start), (gst_int_ring_buffer_base_init), - (gst_int_ring_buffer_class_init), (gst_int_ring_buffer_init), - (gst_int_ring_buffer_new), (gst_audio_ringbuffer_get_type), - (gst_audio_ringbuffer_class_init), (gst_audio_ringbuffer_init), - (gst_audio_ringbuffer_finalize), (gst_audio_ringbuffer_getcaps), - (gst_audio_ringbuffer_setcaps), (gst_audio_ringbuffer_bufferalloc), - (gst_audio_ringbuffer_handle_sink_event), - (gst_audio_ringbuffer_render), (gst_audio_ringbuffer_chain), - (gst_audio_ringbuffer_handle_src_event), - (gst_audio_ringbuffer_handle_src_query), - (gst_audio_ringbuffer_get_range), - (gst_audio_ringbuffer_src_checkgetrange_function), - (gst_audio_ringbuffer_sink_activate_push), - (gst_audio_ringbuffer_src_activate_push), - (gst_audio_ringbuffer_src_activate_pull), - (gst_audio_ringbuffer_change_state), - (gst_audio_ringbuffer_set_property), - (gst_audio_ringbuffer_get_property), (plugin_init): - Add first version of an audioringbuffer element that can be inserted in - the pipeline to convert push-based upstream into a pull-based - downstream. - -2008-10-30 11:43:12 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/audioresample/gstaudioresample.c: Return the result of parent_class->event(). - Original commit message from CVS: - * gst/audioresample/gstaudioresample.c: - Return the result of parent_class->event(). - -2008-10-30 00:17:12 +0000 Michael Smith <msmith@xiph.org> - - gst/aiffparse/aiffparse.c: AIFF is always signed, even for 8 bit. - Original commit message from CVS: - * gst/aiffparse/aiffparse.c: - AIFF is always signed, even for 8 bit. - -2008-10-29 17:02:55 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst-libs/gst/app/gstappsink.c: Fix the docs. - Original commit message from CVS: - * gst-libs/gst/app/gstappsink.c: (gst_app_sink_class_init): - Fix the docs. - -2008-10-29 16:53:54 +0000 Robin Stocker <robin@nibor.org> - - gst/real/gstrealvideodec.c: A RealVideo video inside a container (for example MKV) should use the - Original commit message from CVS: - Patch by: Robin Stocker <robin at nibor dot org> - * gst/real/gstrealvideodec.c: (gst_real_video_dec_setcaps): - A RealVideo video inside a container (for example MKV) should use the - PAR which is specified on the sinkpad caps. Fixes #558416. - -2008-10-29 12:11:20 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/gstspeexresample.*: Rewrite timestamp tracking to make it more robust and guarantee a continous str... - Original commit message from CVS: - * gst/speexresample/gstspeexresample.c: (gst_speex_resample_start), - (gst_speex_resample_get_unit_size), - (gst_speex_resample_push_drain), (gst_speex_resample_event), - (gst_speex_resample_check_discont), (gst_speex_resample_process), - (gst_speex_resample_transform): - * gst/speexresample/gstspeexresample.h: - Rewrite timestamp tracking to make it more robust and guarantee - a continous stream. - * tests/check/Makefile.am: - * tests/check/elements/speexresample.c: (setup_speexresample), - (cleanup_speexresample), (fail_unless_perfect_stream), - (test_perfect_stream_instance), (GST_START_TEST), - (test_discont_stream_instance), (live_switch_alloc_only_48000), - (live_switch_get_sink_caps), (live_switch_push), - (speexresample_suite): - Add unit tests for speexresample based on the audioresample unit tests. - -2008-10-29 01:00:22 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/resindvd/resindvdsrc.c: Make sure to start the NAV packet processing when changing state to PLAYING by passing a... - Original commit message from CVS: - * ext/resindvd/resindvdsrc.c: - Make sure to start the NAV packet processing when changing - state to PLAYING by passing a flag that indicates the state - change is in progress. - Fixes: #546319 - -2008-10-28 20:06:27 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/resindvd/resin-play: Remove $@ to fix parse_launch warning - Original commit message from CVS: - * ext/resindvd/resin-play: - Remove $@ to fix parse_launch warning - * ext/resindvd/resin-play2: - Add a version that uses deinterlace and xvimagesink. - -2008-10-28 19:30:33 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/gstspeexresample.*: Some random cleanup, add G_LIKELY and friends, use GST_DEBUG_OBJECT instead of ... - Original commit message from CVS: - * gst/speexresample/gstspeexresample.c: - (gst_speex_resample_get_unit_size), - (gst_speex_resample_fixate_caps), (gst_speex_resample_init_state), - (gst_speex_resample_update_state), (gst_speex_resample_parse_caps), - (gst_speex_resample_transform_size), (gst_speex_resample_set_caps), - (gst_speex_resample_push_drain), (gst_speex_resample_event), - (gst_speex_resample_check_discont), (gst_speex_fix_output_buffer), - (gst_speex_resample_process), (gst_speex_resample_transform), - (gst_speex_resample_query), (gst_speex_resample_set_property): - * gst/speexresample/gstspeexresample.h: - Some random cleanup, add G_LIKELY and friends, use GST_DEBUG_OBJECT - instead of GST_DEBUG, ... - -2008-10-28 18:44:44 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvdemux.c: Implement position query in time format. - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_query): - Implement position query in time format. - -2008-10-28 18:41:19 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/: Put the GstSegment directly into the instance struct instead of allocating and free'ing it again. - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), - (gst_flv_demux_loop), (gst_flv_demux_handle_seek_push), - (gst_flv_demux_handle_seek_pull), (gst_flv_demux_sink_event), - (gst_flv_demux_dispose), (gst_flv_demux_init): - * gst/flv/gstflvdemux.h: - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video), (gst_flv_parse_tag_timestamp): - Put the GstSegment directly into the instance struct instead of - allocating and free'ing it again. - Push tags already if only one pad was added, no need to wait for - the second one. - When generating our index set has_video and has_audio if we find - video or audio in case the FLV header has incorrect data. - -2008-10-28 16:28:45 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/gstspeexresample.c: Fixate to the nearest supported rate instead of the first one. - Original commit message from CVS: - * gst/speexresample/gstspeexresample.c: - (gst_speex_resample_class_init), (gst_speex_resample_fixate_caps), - (gst_speex_resample_process): - Fixate to the nearest supported rate instead of the first one. - -2008-10-28 16:25:00 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/audioresample/gstaudioresample.c: Fixate the rate to the nearest supported rate instead of the first one. Fixes b... - Original commit message from CVS: - * gst/audioresample/gstaudioresample.c: - (gst_audioresample_class_init), (audioresample_fixate_caps): - Fixate the rate to the nearest supported rate instead of - the first one. Fixes bug #549510. - -2008-10-28 11:46:28 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/: Update Speex resampler with latest version from Speex GIT. - Original commit message from CVS: - * gst/speexresample/README: - * gst/speexresample/arch.h: - * gst/speexresample/fixed_arm4.h: - * gst/speexresample/fixed_arm5e.h: - * gst/speexresample/fixed_bfin.h: - * gst/speexresample/fixed_debug.h: - * gst/speexresample/fixed_generic.h: - * gst/speexresample/resample.c: (compute_func), (main), (sinc), - (cubic_coef), (resampler_basic_direct_single), - (resampler_basic_direct_double), - (resampler_basic_interpolate_single), - (resampler_basic_interpolate_double), (update_filter), - (speex_resampler_init_frac), (speex_resampler_process_native), - (speex_resampler_magic), (speex_resampler_process_float), - (speex_resampler_process_int), - (speex_resampler_process_interleaved_float), - (speex_resampler_process_interleaved_int), - (speex_resampler_set_rate_frac), (speex_resampler_skip_zeros), - (speex_resampler_reset_mem): - * gst/speexresample/speex_resampler.h: - Update Speex resampler with latest version from Speex GIT. - -2008-10-28 01:53:49 +0000 Michael Smith <msmith@xiph.org> - - gst/aiffparse/aiffparse.*: Calculate width from depth correctly. - Original commit message from CVS: - * gst/aiffparse/aiffparse.c: - * gst/aiffparse/aiffparse.h: - Calculate width from depth correctly. - Read SSND header properly (fixes 24 bit AIFF reading). - -2008-10-27 17:01:22 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - ext/x264/gstx264enc.c: Adapt to slightly modified x264 API. Fixes #555238. - Original commit message from CVS: - * ext/x264/gstx264enc.c: (gst_x264_enc_init_encoder): - Adapt to slightly modified x264 API. Fixes #555238. - -2008-10-27 16:32:49 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - ext/faac/gstfaac.c: Prevent endless loop if buffer alloc error. - Original commit message from CVS: - * ext/faac/gstfaac.c: (gst_faac_sink_event): - Prevent endless loop if buffer alloc error. - -2008-10-27 09:45:04 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/: Don't memcpy() all data we want to push downstream, instead just create subbuffers and push them downstream. - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_chain), - (gst_flv_demux_pull_tag), (gst_flv_demux_pull_header), - (gst_flv_demux_create_index): - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_script), - (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), - (gst_flv_parse_tag_timestamp), (gst_flv_parse_tag_type), - (gst_flv_parse_header): - * gst/flv/gstflvparse.h: - Don't memcpy() all data we want to push downstream, instead just - create subbuffers and push them downstream. - Fix some minor memory leaks. - -2008-10-27 09:42:55 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Require CVS of core for the last change. - Original commit message from CVS: - * configure.ac: - Require CVS of core for the last change. - -2008-10-27 09:41:18 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/Makefile.am: Fix (non-critical) syntax error and add all required CFLAGS and LIBS. - Original commit message from CVS: - * gst/flv/Makefile.am: - Fix (non-critical) syntax error and add all required CFLAGS and LIBS. - * gst/flv/gstflvparse.c: (FLV_GET_STRING), - (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), - (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), - (gst_flv_parse_tag_timestamp), (gst_flv_parse_tag_type): - Rewrite the script tag parsing to make sure we don't try to read - more data than we have. Also use GST_READ_UINT24_BE directly and - fix some minor memory leaks. - This should make all crashes on fuzzed FLV files disappear. - -2008-10-27 09:37:21 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvparse.c: Properly check everywhere that we have enough data to parse and don't read outside the allocat... - Original commit message from CVS: - * gst/flv/gstflvparse.c: (FLV_GET_STRING), - (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), - (gst_flv_parse_tag_type), (gst_flv_parse_header): - Properly check everywhere that we have enough data to parse and - don't read outside the allocated memory region. - -2008-10-27 09:35:34 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvparse.c: If the caps change during playback and negotiation fails error out instead of trying to continue. - Original commit message from CVS: - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video): - If the caps change during playback and negotiation fails error out - instead of trying to continue. - -2008-10-27 09:33:40 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/: Add support for Speex audio and allow buffers without valid timestamp in the muxer. - Original commit message from CVS: - * gst/flv/gstflvmux.c: (gst_flv_mux_audio_pad_setcaps), - (gst_flv_mux_request_new_pad), (gst_flv_mux_write_buffer), - (gst_flv_mux_collected): - * gst/flv/gstflvmux.h: - * gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate): - Add support for Speex audio and allow buffers without valid - timestamp in the muxer. - -2008-10-27 09:32:03 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvdemux.c: Don't post an error message on the bus if sending EOS downstream didn't work. Fixes bug #550454. - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_loop), - (gst_flv_demux_find_offset), (gst_flv_demux_handle_seek_push), - (gst_flv_demux_handle_seek_pull): - Don't post an error message on the bus if sending EOS downstream - didn't work. Fixes bug #550454. - Fix seek event handling to look at the flags of the seek event - instead of assuming some random flags, don't send segment-start - messages when operating in push mode and push seek events upstream - if we couldn't handle them. - -2008-10-27 09:27:18 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvdemux.c: Error out early if pulling a tag failed. - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_tag): - Error out early if pulling a tag failed. - -2008-10-27 09:25:11 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/: In pull mode we create our own index before doing anything else and don't use the index provided by some fi... - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_create_index), - (gst_flv_demux_loop): - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_script), - (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), - (gst_flv_parse_tag_timestamp): - * gst/flv/gstflvparse.h: - In pull mode we create our own index before doing anything else - and don't use the index provided by some files (which are more than - often incorrect and cause failed seeks). - For push mode we still use the index provided by the file and extend it - while doing the playback. - -2008-10-27 09:20:01 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvdemux.c: Instead of using gst_pad_event_default() use a small gst_pad_push_event() wrapper that only do... - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_push_src_event), - (gst_flv_demux_loop), (gst_flv_demux_handle_seek_pull), - (gst_flv_demux_sink_event): - Instead of using gst_pad_event_default() use a small - gst_pad_push_event() wrapper that only does what we want and is much - more simple. - -2008-10-27 09:14:45 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvdemux.*: If our index was created by the element and not provided from the outside we should destroy it... - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_change_state), - (gst_flv_demux_set_index), (gst_flv_demux_init): - * gst/flv/gstflvdemux.h: - If our index was created by the element and not provided from the - outside we should destroy it when starting a new stream to get - all old entries removed. - -2008-10-27 09:12:33 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvdemux.c: Improve debugging a bit when pulling a buffer from upstream fails. - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_range): - Improve debugging a bit when pulling a buffer from upstream fails. - -2008-10-27 09:10:54 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/: Close the currently playing segment from the streaming thread instead of the thread where the seek event is... - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), - (gst_flv_demux_handle_seek_pull), (gst_flv_demux_dispose): - * gst/flv/gstflvdemux.h: - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video): - Close the currently playing segment from the streaming thread - instead of the thread where the seek event is handled. - -2008-10-27 08:57:27 +0000 David Härdeman <david@hardeman.nu> - - gst/mpegdemux/mpegtspacketizer.c: Add support for the frequency list descriptor, which provides additional frequencie... - Original commit message from CVS: - Patch by: David Härdeman <david at hardeman dot nu> - * gst/mpegdemux/mpegtspacketizer.c: (mpegts_packetizer_parse_nit): - Add support for the frequency list descriptor, which provides - additional frequencies that should be scanned by a DVB application. - Fixes bug #557814. - -2008-10-27 08:52:50 +0000 vanista <vanista@gmail.com> - - gst/mpegtsmux/mpegtsmux.c: Fix EOS logic by correctly popping the collect pad buffers only when we've chosen to use t... - Original commit message from CVS: - Patch by: vanista <vanista at gmail dot com> - * gst/mpegtsmux/mpegtsmux.c: (mpegtsmux_choose_best_stream): - Fix EOS logic by correctly popping the collect pad buffers only - when we've chosen to use them instead of popping them always and - storing them in a private queue. - Before the pipeline would deadlock if all pads go EOS at the same - time. Fixes bug #557763. - -2008-10-26 20:07:51 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Back to development -> 0.10.9.1 - Original commit message from CVS: - * configure.ac: - Back to development -> 0.10.9.1 +2022-01-04 15:49:35 -0300 Thibault Saunier <tsaunier@igalia.com> -=== release 0.10.9 === + * ext/wpe/gstwpe.h: + * ext/wpe/gstwpesrcbin.cpp: + * ext/wpe/gstwpevideosrc.cpp: + * ext/wpe/meson.build: + * tests/validate/meson.build: + * tests/validate/wpe/load_bytes_first.validatetest: + wpe: Use `about:blank` as default URL to support only using load-bytes + WebKit is not going to render anything until a URI is set, leading to a + WPE posting a `WPE View did not render a buffer` error message. To avoid + requiring the user to know it if they only want to use + `wpesrc::load-bytes` we can just use `about:blank` as default and + everything will work as users would expect. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1492> -2008-10-24 22:45:11 +0000 Jan Schmidt <thaytan@mad.scientist.com> +2022-01-27 23:54:34 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-app.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dccp.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-scaletempo.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-speexresample.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.10.9 - Original commit message from CVS: - Release 0.10.9 - -2008-10-24 21:43:17 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/ca.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/id.po: - * po/it.po: - * po/ky.po: - * po/lt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - Original commit message from CVS: - Update .po files - -2008-10-24 16:41:33 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Commit 0.10.8.4 pre-release - Original commit message from CVS: - * configure.ac: - Commit 0.10.8.4 pre-release - -2008-10-20 14:19:17 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/mpegdemux/gstmpegdemux.c: Fix reverse playback regression. - Original commit message from CVS: - * gst/mpegdemux/gstmpegdemux.c: (gst_flups_demux_send_data): - Fix reverse playback regression. - Fixes #557080 - -2008-10-19 12:39:30 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/apexsink/gstapexplugin.c: Set apexsink's rank to NONE so it doesn't get used by autoaudiosink (there's no point r... - Original commit message from CVS: - * ext/apexsink/gstapexplugin.c: (plugin_init): - Set apexsink's rank to NONE so it doesn't get used by - autoaudiosink (there's no point really). (#556588) - -2008-10-16 17:12:04 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: 0.10.8.3 pre-release - Original commit message from CVS: - * configure.ac: - 0.10.8.3 pre-release - -2008-10-16 16:37:33 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegdemux/gstmpegtsdemux.*: Properly handle some resync cases in the optimised buffering strategy. - Original commit message from CVS: - Patch by: Josep Torra - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - Properly handle some resync cases in the optimised - buffering strategy. - -2008-10-16 16:18:31 +0000 Michael Smith <msmith@xiph.org> - - sys/acmenc/Makefile.am: Remove incorrect use of DIRECTSOUND_LDFLAGS - Original commit message from CVS: - 2008-10-16 Michael Smith <msmith@songbirdnest.com> - * sys/acmenc/Makefile.am: - Remove incorrect use of DIRECTSOUND_LDFLAGS - -2008-10-16 15:21:15 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvmux.c: Don't set video_codec to the value that actually should go into audio codec, otherwise we create... - Original commit message from CVS: - * gst/flv/gstflvmux.c: (gst_flv_mux_audio_pad_setcaps), - (gst_flv_mux_write_buffer): - Don't set video_codec to the value that actually should go - into audio codec, otherwise we create invalid files. - Fixes bug #556564. - -2008-10-16 15:06:55 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Don't install static libs for plugins. Fixes #550851 for base. - Original commit message from CVS: - * ext/alsa/Makefile.am: - * ext/cdparanoia/Makefile.am: - * ext/gio/Makefile.am: - * ext/gnomevfs/Makefile.am: - * ext/libvisual/Makefile.am: - * ext/ogg/Makefile.am: - * ext/pango/Makefile.am: - * ext/theora/Makefile.am: - * ext/vorbis/Makefile.am: - * gst/adder/Makefile.am: - * gst/audioconvert/Makefile.am: - * gst/audiorate/Makefile.am: - * gst/audioresample/Makefile.am: - * gst/audiotestsrc/Makefile.am: - * gst/ffmpegcolorspace/Makefile.am: - * gst/gdp/Makefile.am: - * gst/playback/Makefile.am: - * gst/subparse/Makefile.am: - * gst/tcp/Makefile.am: - * gst/typefind/Makefile.am: - * gst/videorate/Makefile.am: - * gst/videoscale/Makefile.am: - * gst/videotestsrc/Makefile.am: - * gst/volume/Makefile.am: - * sys/v4l/Makefile.am: - * sys/ximage/Makefile.am: - * sys/xvimage/Makefile.am: - Don't install static libs for plugins. Fixes #550851 for base. - -2008-10-16 14:54:36 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - tests/check/Makefile.am: Leave apexsink out of the states test. - Original commit message from CVS: - * tests/check/Makefile.am: - Leave apexsink out of the states test. - -2008-10-16 13:05:37 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Fix problem with using the output seqnum counter to check for input seqnum disco... - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_jitter_buffer_sink_parse_caps), - (gst_rtp_jitter_buffer_flush_start), - (gst_rtp_jitter_buffer_flush_stop), (gst_rtp_jitter_buffer_chain), - (gst_rtp_jitter_buffer_loop): - Fix problem with using the output seqnum counter to check for input - seqnum discontinuities. - Improve gap detection and recovery, reset and flush the jitterbuffer on - seqnum restart. Fixes #556520. - * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_insert): - Fix wrong G_LIKELY. - -2008-10-16 11:55:19 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Commit 0.10.8.2 pre-release bump, that actually went out in a tarball on 2008-10-11 - Original commit message from CVS: - * configure.ac: - Commit 0.10.8.2 pre-release bump, that actually went out in a - tarball on 2008-10-11 - -2008-10-16 09:51:28 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpsession.c: Install event handler on the rtcp_src pad, make LATENCY event return - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: - (gst_rtp_session_event_send_rtcp_src), (create_send_rtcp_src): - Install event handler on the rtcp_src pad, make LATENCY event return - TRUE. - -2008-10-16 09:18:31 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/mpegdemux/gstmpegdemux.c: Make sure the mpegpsdemux element creates valid newsegment events. - Original commit message from CVS: - * gst/mpegdemux/gstmpegdemux.c: (gst_flups_demux_send_data): - Make sure the mpegpsdemux element creates valid newsegment events. - Fixes #556428 - -2008-10-16 08:17:59 +0000 Sebastian Pölsterl <marduk@k-d-w.org> - - gst/mpegdemux/mpegtspacketizer.c: Fixes segfault in get_encoding_and_convert. - Original commit message from CVS: - patch by: Sebastian Pölsterl - * gst/mpegdemux/mpegtspacketizer.c: - Fixes segfault in get_encoding_and_convert. - Fixes #556482 - -2008-10-16 08:13:49 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegdemux/gstmpegtsdemux.c: Fixes a segfault in the adaptation buffer size strategy. - Original commit message from CVS: - patch by: Josep Torra - * gst/mpegdemux/gstmpegtsdemux.c: - Fixes a segfault in the adaptation buffer size strategy. - Fixes #556440 - -2008-10-15 17:45:37 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/selector/gstinputselector.c: Gracefully handle the cases when we dont' have otherpad. - Original commit message from CVS: - * gst/selector/gstinputselector.c: (gst_input_selector_event), - (gst_input_selector_query): - Gracefully handle the cases when we dont' have otherpad. - Fixes #556430 - -2008-10-14 15:13:05 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/aiffparse/aiffparse.c: Fix debugging category initialization. - Original commit message from CVS: - * gst/aiffparse/aiffparse.c: (plugin_init): - Fix debugging category initialization. - Fixes #556274 - -2008-10-14 14:53:41 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/apexsink/gstapexsink.c: Fix some more format string compiler warnings (from OS/X) - Original commit message from CVS: - * ext/apexsink/gstapexsink.c: - Fix some more format string compiler warnings (from OS/X) - -2008-10-13 12:27:06 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - update spec for latest plugins changes - Original commit message from CVS: - update spec for latest plugins changes - -2008-10-13 07:35:25 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/apexsink/gstapexraop.c: Fix format string compiler warnings. - Original commit message from CVS: - * ext/apexsink/gstapexraop.c: (gst_apexraop_connect), - (gst_apexraop_set_volume): - Fix format string compiler warnings. - -2008-10-12 21:52:27 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - sys/oss4/: Add some spaces in translateable strings. - Original commit message from CVS: - * sys/oss4/oss4-mixer.c: - * sys/oss4/oss4-sink.c: - * sys/oss4/oss4-source.c: - Add some spaces in translateable strings. - Fixes: #555969 #555968 #555965 - -2008-10-12 17:08:10 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvdemux.c: Fix regression of handling flow returns in pull mode. - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_tag), - (gst_flv_demux_pull_header): - Fix regression of handling flow returns in pull mode. - Fixes bug #556003. - -2008-10-12 17:04:17 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/Makefile.am: Add apexsink to SUBDIRS. Fixes bug #555912. - Original commit message from CVS: - * ext/Makefile.am: - Add apexsink to SUBDIRS. Fixes bug #555912. - -2008-10-11 11:02:14 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - tests/check/pipelines/metadata.c: Make the metadata test not fail when jpegenc isn't available.... as it isn't here, ... - Original commit message from CVS: - * tests/check/pipelines/metadata.c: - Make the metadata test not fail when jpegenc isn't available.... - as it isn't here, because it's not in this module, and - therefore not in the plugin path when the check runs. - -2008-10-10 16:33:36 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvparse.c: Use gst_pad_alloc_buffer_and_set_caps() to make sure we get a buffer with caps that we can wor... - Original commit message from CVS: - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video): - Use gst_pad_alloc_buffer_and_set_caps() to make sure we get - a buffer with caps that we can work with (i.e. the pad's caps). - Add non-keyframe video frames to the index too but without the - keyframe flag. - Add audio frames to the index only if we have no video stream. - -2008-10-10 16:15:09 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvparse.c: Create pads from the pad templates, use fixed caps on them and only activate them after the ca... - Original commit message from CVS: - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video): - Create pads from the pad templates, use fixed caps on them - and only activate them after the caps are set. - -2008-10-10 15:51:42 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Disable flacparse for this release as it's too buggy. - Original commit message from CVS: - * configure.ac: - Disable flacparse for this release as it's too buggy. - -2008-10-10 11:17:09 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - * gst/flacparse/gstbaseparse.c: - Fix compiler warning on OS/X about parameters not matching the debug format string. - Original commit message from CVS: - 2008-10-10 Jan Schmidt <jan.schmidt@sun.com> - * gst/flacparse/gstbaseparse.c (gst_base_parse_push_buffer), - (gst_base_parse_update_upstream_durations): - Fix compiler warning on OS/X about parameters not matching - the debug format string. + * docs/plugins/gst_plugins_cache.json: + * gst/debugutils/gstfakeaudiosink.c: + * gst/debugutils/gstfakeaudiosink.h: + * gst/debugutils/gstfakevideosink.c: + * gst/debugutils/gstfakevideosink.h: + fakevideosink,fakeaudiosink: Proxy handoff and preroll-handoff signals + Proxy signals for application to be able to consume them + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1585> -2008-10-10 11:01:36 +0000 Jan Schmidt <thaytan@mad.scientist.com> +2021-12-24 19:49:34 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - Fix compiler warning on OS/X about parameters not matching the debug format string. - Original commit message from CVS: - * gst/flacparse/gstbaseparse.c (gst_base_parse_push_buffer), - (gst_base_parse_update_upstream_durations): - Fix compiler warning on OS/X about parameters not matching - the debug format string. - -2008-10-09 19:38:52 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/tomsmocomp.c: Fix unused variable compiler warning when not building - Original commit message from CVS: - * gst/deinterlace2/tvtime/tomsmocomp.c: - (gst_deinterlace_method_tomsmocomp_class_init): - Fix unused variable compiler warning when not building - X86 assembly. - -2008-10-09 16:51:35 +0000 Christian Schaller <uraeus@gnome.org> - - * configure.ac: - * gst-plugins-bad.spec.in: - * tests/check/Makefile.am: - fix various build files to allow for disting and update spec file with latest changes. - Original commit message from CVS: - fix various build files to allow for disting and update spec file with latest changes. - -2008-10-09 16:20:26 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/: Get an approximate duration of the file by looking at the timestamp of the last tag in pull mode. If we get... - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_loop): - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_timestamp): - * gst/flv/gstflvparse.h: - Get an approximate duration of the file by looking at the timestamp - of the last tag in pull mode. If we get (maybe better) duration from - metadata later we'll use that instead. - -2008-10-09 15:43:02 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvdemux.c: Refactor _pull_range() logic with checks into a seperate function to make things a bit more re... - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_range), - (gst_flv_demux_pull_tag), (gst_flv_demux_pull_header): - Refactor _pull_range() logic with checks into a seperate function - to make things a bit more readable. - -2008-10-09 15:26:56 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvdemux.c: Use gst_element_class_set_details_simple(). - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_chain), - (gst_flv_demux_base_init): - Use gst_element_class_set_details_simple(). - If we get GST_FLOW_NOT_LINKED in the parse loop but at least - one of the pads is linked continue the loop. - -2008-10-09 10:01:37 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/amrwb/gstamrwbenc.*: Pass the discont flag from the input buffer on to the output buffer in the AMR encoder. - Original commit message from CVS: - * ext/amrwb/gstamrwbenc.c: - * ext/amrwb/gstamrwbenc.h: - Pass the discont flag from the input buffer on to the output buffer in - the AMR encoder. - -2008-10-09 10:00:51 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvparse.c: Correct caps for video codec id 5: It's On2 VP6 with alpha channel which needs a different dec... - Original commit message from CVS: - * gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate), - (gst_flv_parse_tag_audio), (gst_flv_parse_video_negotiate): - Correct caps for video codec id 5: It's On2 VP6 with alpha channel - which needs a different decoder and has different caps. - Add support for audio codec id 14, which is MP3 with 8kHz sampling - rate. - Fix endianness and signedness for raw audio codec ids. - Add support for alaw and mulaw audio. - -2008-10-09 09:48:46 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/gstflvdemux.c: Go out of the parse loop as soon as we get an error instead of parsing until the GstAdapter is... - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_chain): - Go out of the parse loop as soon as we get an error instead - of parsing until the GstAdapter is empty. - Add some explanations about the header and tag size. - Don't print synchronizing message if everything is fine. - -2008-10-09 09:26:58 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flv/: Add first version of a FLV muxer. The only missing feature is writing of stream metadata. - Original commit message from CVS: - * gst/flv/Makefile.am: - * gst/flv/gstflvdemux.c: (plugin_init): - * gst/flv/gstflvmux.c: (gst_flv_mux_base_init), - (gst_flv_mux_class_init), (gst_flv_mux_init), - (gst_flv_mux_finalize), (gst_flv_mux_reset), - (gst_flv_mux_handle_src_event), (gst_flv_mux_handle_sink_event), - (gst_flv_mux_video_pad_setcaps), (gst_flv_mux_audio_pad_setcaps), - (gst_flv_mux_request_new_pad), (gst_flv_mux_release_pad), - (gst_flv_mux_write_header), (gst_flv_mux_write_buffer), - (gst_flv_mux_collected), (gst_flv_mux_change_state): - * gst/flv/gstflvmux.h: - Add first version of a FLV muxer. The only missing feature is writing - of stream metadata. - -2008-10-09 09:21:44 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/amrwb/gstamrwbparse.*: Add flush seek handler. Taken from recent armnbparse changes. - Original commit message from CVS: - * ext/amrwb/gstamrwbparse.c: - * ext/amrwb/gstamrwbparse.h: - Add flush seek handler. Taken from recent armnbparse changes. - Sync the code more and use #defines for HEADER. - -2008-10-09 08:43:41 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/amrwb/gstamrwbparse.*: Fix the duration query. Also set caps on the pads and buffers more correctly. Taken from r... - Original commit message from CVS: - * ext/amrwb/gstamrwbparse.c: - * ext/amrwb/gstamrwbparse.h: - Fix the duration query. Also set caps on the pads and buffers more - correctly. Taken from recent armnbparse changes. - -2008-10-08 16:20:26 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegdemux/: Add Fluendo to the Long Name. - Original commit message from CVS: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegtsdemux.c: - Add Fluendo to the Long Name. - -2008-10-08 15:25:24 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - Move of mpegtsparse to mpegdemux. - Original commit message from CVS: - * configure.ac: - * gst-plugins-bad.spec.in: - * gst/mpegdemux/Makefile.am: - * gst/mpegdemux/flumpegdemux.c: - * gst/mpegdemux/gstmpegdesc.c: - * gst/mpegdemux/gstmpegdesc.h: - * gst/mpegdemux/mpegtspacketizer.c: - * gst/mpegdemux/mpegtspacketizer.h: - * gst/mpegdemux/mpegtsparse.c: - * gst/mpegdemux/mpegtsparse.h: - Move of mpegtsparse to mpegdemux. - Fixes #555193. - -2008-10-08 15:22:12 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * gst/mpegtsparse/mpegtsparse.c: - Move of mpegtsparse to mpegdemux - Original commit message from CVS: - Move of mpegtsparse to mpegdemux - -2008-10-08 10:21:20 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mpegdemux/gstmpegdemux.c: Prevent a division by zero if last mux rate was zero. - Original commit message from CVS: - * gst/mpegdemux/gstmpegdemux.c: (gst_flups_demux_send_data), - (gst_flups_demux_parse_pack_start): - Prevent a division by zero if last mux rate was zero. - If we're going to send a NEWSEGMENT event but the segment start - and the current buffer timestamp differ by more than a second we - will start the NEWSEGMENT at the buffer timestamp. - This fixes playback of the tv2-1_25.mpg file, which has 0 as first SCR - but the first PTS are around 1 hour and 40 minutes. - Fixes bug #553755. - -2008-10-07 21:29:26 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/resindvd/resindvdsrc.c: Fix next/prev chapter seeking at the beginning or end. - Original commit message from CVS: - * ext/resindvd/resindvdsrc.c: - Fix next/prev chapter seeking at the beginning or end. - Use 64-bit scaling utility functions for converting MPEG - timestamps. - -2008-10-07 18:54:41 +0000 Håvard Graff <havard.graff@tandberg.com> - - gst/rtpmanager/gstrtpbin-marshal.list: Add marshaller for new action signal. - Original commit message from CVS: - Patch by: Håvard Graff <havard dot graff at tandberg dot com> - * gst/rtpmanager/gstrtpbin-marshal.list: - Add marshaller for new action signal. - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_get_internal_session), - (gst_rtp_bin_class_init): - * gst/rtpmanager/gstrtpbin.h: - Add action signal to retrieve the internal RTPSession object. - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), - (gst_rtp_session_get_property), (gst_rtp_session_release_pad): - Add property to access the internal RTPSession object. - * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), - (check_collision): - * gst/rtpmanager/rtpsession.h: - Add action signal to retrieve an RTPSource object by SSRC. - See #555396. - -2008-10-07 13:14:40 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/selector/gstoutputselector.c: Choose right pad for sending events. Fixes #555244 - Original commit message from CVS: - * gst/selector/gstoutputselector.c: - Choose right pad for sending events. Fixes #555244 - -2008-10-07 11:33:10 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Release pads of the session manager. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (find_session_by_pad), - (free_session), (gst_rtp_bin_dispose), (remove_recv_rtp), - (remove_recv_rtcp), (remove_send_rtp), (remove_rtcp), - (gst_rtp_bin_release_pad): - Release pads of the session manager. - Start implementing releasing pads of gstrtpbin. - * gst/rtpmanager/gstrtpsession.c: (remove_recv_rtp_sink), - (remove_recv_rtcp_sink), (remove_send_rtp_sink), - (remove_send_rtcp_src), (gst_rtp_session_release_pad): - Implement releasing pads in gstrtpsession. - -2008-10-07 10:02:20 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Only update the seqnum-base when it was not already configured for the streams. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_jitter_buffer_sink_parse_caps): - Only update the seqnum-base when it was not already configured for the - streams. - -2008-10-06 16:01:49 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - configure.ac - Original commit message from CVS: - * configure.ac - * ext/metadata/README: - * ext/metadata/metadataexif.c: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - Start using core geo tags (bump req). Fix handling of location - references. - * tests/check/Makefile.am: - Sort blacklisted elements and remove moved ones. Add new test. - * tests/check/pipelines/metadata.c: - Add first tests for metadata element. - * tests/icles/metadata_editor.c: - Move free to correct place. - -2008-10-06 15:53:01 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/check/generic/states.c: Stop test on state-change error. Should be applied on other modules if we agree that it... - Original commit message from CVS: - * tests/check/generic/states.c: - Stop test on state-change error. Should be applied on other modules if - we agree that it makes sense. - -2008-10-06 12:01:14 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtsparse.c: Actually copy the structure passed in when assigning it because it gets freed straight... - Original commit message from CVS: - * gst/mpegtsparse/mpegtsparse.c: - Actually copy the structure passed in when assigning it because - it gets freed straight after the function call. - Re: pat_info and pmt_info GstStructures. - -2008-10-06 08:32:41 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegdemux/gstmpegtsdemux.c: Fix wrong firing of critical introduced by previous optimisation. - Original commit message from CVS: - Patch by: Josep Torra - * gst/mpegdemux/gstmpegtsdemux.c: - Fix wrong firing of critical introduced by previous optimisation. - -2008-10-03 17:11:12 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/faac/gstfaac.c: Warn and clamp to max bitrate for samplerate. - Original commit message from CVS: - * ext/faac/gstfaac.c: (gst_faac_configure_source_pad): - Warn and clamp to max bitrate for samplerate. - Fixes #550486. - -2008-10-03 09:11:16 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtsparse.c: Fix possible crash where pat is pointing to a freed structure. - Original commit message from CVS: - * gst/mpegtsparse/mpegtsparse.c: - Fix possible crash where pat is pointing to a freed structure. - -2008-10-03 05:57:58 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/metadata/: Add mapping of format and mime type to xmp. - Original commit message from CVS: - * ext/metadata/metadata_mapping.htm: - * ext/metadata/metadataxmp.c: - * ext/metadata/Makefile.am: - Add mapping of format and mime type to xmp. - -2008-10-02 14:42:25 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/metadata/: Reverting. Will need to wait for core 0.10.21 release. - Original commit message from CVS: - * ext/metadata/README: - * ext/metadata/metadataexif.c: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - Reverting. Will need to wait for core 0.10.21 release. - -2008-10-02 13:52:50 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/metadata/: Use core gsp tags. - Original commit message from CVS: - * ext/metadata/README: - * ext/metadata/metadataexif.c: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - Use core gsp tags. - -2008-09-30 17:03:14 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flacparse/gstbaseparse.c: Add support for GstIndex. - Original commit message from CVS: - * gst/flacparse/gstbaseparse.c: (gst_base_parse_finalize), - (gst_base_parse_class_init), (gst_base_parse_push_buffer), - (gst_base_parse_change_state), (gst_base_parse_set_index), - (gst_base_parse_get_index): - Add support for GstIndex. - -2008-09-30 16:41:15 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flacparse/gstbaseparse.*: Provide a vfunc for the subclass to decide whether a frame is inside the segment or not... - Original commit message from CVS: - * gst/flacparse/gstbaseparse.c: (gst_base_parse_class_init), - (gst_base_parse_push_buffer), - (gst_base_parse_update_upstream_durations), - (gst_base_parse_convert), (gst_base_parse_frame_in_segment): - * gst/flacparse/gstbaseparse.h: - Provide a vfunc for the subclass to decide whether a frame is inside - the segment or not and add a default implementation. - Fix approximate bitrate calculations. - -2008-09-30 16:22:04 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/flacparse/gstbaseparse.c: Approximate the average bitrate, duration and size if possible and add a default conver... - Original commit message from CVS: - * gst/flacparse/gstbaseparse.c: (gst_base_parse_class_init), - (gst_base_parse_init), (gst_base_parse_push_buffer), - (gst_base_parse_update_upstream_durations), (gst_base_parse_chain), - (gst_base_parse_loop), (gst_base_parse_activate), - (gst_base_parse_convert), (gst_base_parse_query): - Approximate the average bitrate, duration and size if possible - and add a default conversion function which uses this for - time<->byte conversions. - * gst/flacparse/gstflacparse.c: (gst_flac_parse_get_frame_size): - Fix parsing if upstream gives -1 as duration. - -2008-09-30 15:08:52 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/rtpsession.c: Ref the rtpsource object before we release the session lock when we emit the signals. - Original commit message from CVS: - * gst/rtpmanager/rtpsession.c: (on_new_ssrc), (on_ssrc_collision), - (on_ssrc_validated), (on_ssrc_active), (on_ssrc_sdes), - (on_bye_ssrc), (on_bye_timeout), (on_timeout), (on_sender_timeout): - Ref the rtpsource object before we release the session lock when we emit - the signals. - -2008-09-30 11:19:10 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - sys/: New plugin for audio capture and playback using Windows Audio Session - Original commit message from CVS: - * sys/Makefile.am: - * sys/wasapi/Makefile.am: - * sys/wasapi/gstwasapi.c: - * sys/wasapi/gstwasapisink.c: - * sys/wasapi/gstwasapisink.h: - * sys/wasapi/gstwasapisrc.c: - * sys/wasapi/gstwasapisrc.h: - * sys/wasapi/gstwasapiutil.c: - * sys/wasapi/gstwasapiutil.h: - New plugin for audio capture and playback using Windows Audio Session - API (WASAPI) available with Vista and newer (#520901). - Comes with hardcoded caps and obviously needs lots of love. Haven't - had time to work on this code since it was written, was initially just - a quick experiment to play around with this new API. + * docs/plugins/gst_plugins_cache.json: + * ext/aom/gstav1enc.c: + aom: av1enc: Specify Temporal Unit alignment + Encoded bitstream consists of leading Temporal delimiter OBU + with frame, that's Temporal Unit alignment. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1471> + +2022-03-24 02:52:45 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvh264enc.cpp: + * sys/qsv/gstqsvh265enc.cpp: + * sys/qsv/gstqsvvp9enc.cpp: + qsvencoder: Clear caps after debug print + Otherwise debug function will print (null) for alread cleared pointer + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2012> + +2022-03-24 02:43:43 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvh264enc.cpp: + qsvh264enc: Fix profile and level setting in codec data + The profile field in SPS is located after header byte + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2012> + +2022-03-16 04:58:16 +0900 Seungha Yang <seungha@centricular.com> + + nvcodec: Add new Direct3D11/CUDA mode encoder implementation + Adding new encoder elements nvd3d11{h264,h265}enc for Direct3D11 + input support and re-written nvcuda{h264,h265}enc elements. + Newly writeen elements have some differences compared with old + nv{h264,h265}enc including non-backward compatible changes. + * RGBA is not a supported input format any more: + New elements will support only YUV formats to avoid implicit conversion + done by hardware. Ideally it should be done by upstream element + in order to have more control on it. Moreover, RGBA support can cause + redundant RGBA -> YUV conversion if multiple encoders are + used for the same RGBA input + * Subsampled planar format support is dropped: + I420 and YV12 format are not supported formats for Direct3D11. + Although it's supported in CUDA mode, it's not a hardware friendly + memory layout and it will waste GPU memory since UV planes + will have large padding due to the memory layout requirement of NVENC. + * GL support is dropped: Similar to the RGBA case, + GL support in encoder would be suboptimal if GL input is + used by multiple encoders, because each encoder will copy GL memory + into CUDA memory. + Upstream cudaupload element can be used for GL <-> CUDA + interop instead. + * No more pre-allocation of encoder input surfaces. New implementation + will use input CUDA memory without copy (zero-copy) or + will copy into a NVENC's input buffer struct in case of + system memory input. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1997> -2008-09-30 10:43:54 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> +2022-02-10 10:21:01 +0100 Vivienne Watermeier <vwatermeier@igalia.com> - * ChangeLog: - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - sys/dshowdecwrapper/gstdshowaudiodec.cpp - Original commit message from CVS: - * sys/dshowdecwrapper/gstdshowaudiodec.cpp - (AudioFakeSink.DoRenderSample): - Fix a couple of signed/unsigned comparison warnings. - -2008-09-30 10:22:10 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - sys/dshowdecwrapper/: Use the _T() macro to support both Unicode and MBCS. - Original commit message from CVS: - * sys/dshowdecwrapper/gstdshowaudiodec.h (AudioFakeSink.AudioFakeSink): - * sys/dshowdecwrapper/gstdshowvideodec.h (VideoFakeSink.VideoFakeSink): - Use the _T() macro to support both Unicode and MBCS. - -2008-09-30 10:17:41 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - ext/libmms/gstmms.c (plugin_init): Fix return type of the GstURIHandler::get_type() implementation. - Original commit message from CVS: - * ext/libmms/gstmms.c (plugin_init): - Fix return type of the GstURIHandler::get_type() implementation. - -2008-09-29 08:26:54 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add FLAC parser, based on GstBaseParse. Also add the bit and byte reader that will be added to libgstbase later. - Original commit message from CVS: - * configure.ac: - * gst/flacparse/Makefile.am: - * gst/flacparse/gstbaseparse.c: (gst_base_parse_get_type), - (gst_base_parse_base_init), (gst_base_parse_base_finalize), - (gst_base_parse_finalize), (gst_base_parse_class_init), - (gst_base_parse_init), (gst_base_parse_check_frame), - (gst_base_parse_parse_frame), (gst_base_parse_bytepos_to_time), - (gst_base_parse_sink_event), (gst_base_parse_sink_eventfunc), - (gst_base_parse_src_event), (gst_base_parse_src_eventfunc), - (gst_base_parse_is_seekable), (gst_base_parse_push_buffer), - (gst_base_parse_handle_and_push_buffer), (gst_base_parse_drain), - (gst_base_parse_chain), (gst_base_parse_pull_range), - (gst_base_parse_loop), (gst_base_parse_sink_activate), - (gst_base_parse_activate), (gst_base_parse_sink_activate_push), - (gst_base_parse_sink_activate_pull), (gst_base_parse_set_duration), - (gst_base_parse_set_min_frame_size), - (gst_base_parse_get_querytypes), (gst_base_parse_query), - (gst_base_parse_handle_seek), (gst_base_parse_sink_setcaps): - * gst/flacparse/gstbaseparse.h: - * gst/flacparse/gstbitreader.c: (gst_bit_reader_new), - (gst_bit_reader_new_from_buffer), (gst_bit_reader_free), - (gst_bit_reader_init), (gst_bit_reader_init_from_buffer), - (gst_bit_reader_set_pos), (gst_bit_reader_get_pos), - (gst_bit_reader_get_remaining), (gst_bit_reader_skip), - (gst_bit_reader_skip_to_byte): - * gst/flacparse/gstbitreader.h: - * gst/flacparse/gstbytereader.c: (GDOUBLE_SWAP_LE_BE), - (GFLOAT_SWAP_LE_BE), (gst_byte_reader_new), - (gst_byte_reader_new_from_buffer), (gst_byte_reader_free), - (gst_byte_reader_init), (gst_byte_reader_init_from_buffer), - (gst_byte_reader_set_pos), (gst_byte_reader_get_pos), - (gst_byte_reader_get_remaining), (gst_byte_reader_skip), - (gst_byte_reader_get_uint8), (gst_byte_reader_get_int8), - (gst_byte_reader_peek_uint8), (gst_byte_reader_peek_int8), - (gst_byte_reader_get_uint24_le), (gst_byte_reader_get_uint24_be), - (gst_byte_reader_get_int24_le), (gst_byte_reader_get_int24_be), - (gst_byte_reader_peek_uint24_le), (gst_byte_reader_peek_uint24_be), - (gst_byte_reader_peek_int24_le), (gst_byte_reader_peek_int24_be): - * gst/flacparse/gstbytereader.h: - * gst/flacparse/gstflac.c: (plugin_init): - * gst/flacparse/gstflacparse.c: (gst_flac_parse_base_init), - (gst_flac_parse_class_init), (gst_flac_parse_init), - (gst_flac_parse_finalize), (gst_flac_parse_start), - (gst_flac_parse_stop), (gst_flac_parse_get_frame_size), - (gst_flac_parse_check_valid_frame), - (gst_flac_parse_handle_streaminfo), - (gst_flac_parse_handle_vorbiscomment), - (gst_flac_parse_handle_picture), (_value_array_append_buffer), - (gst_flac_parse_handle_headers), (gst_flac_parse_generate_headers), - (gst_flac_parse_parse_frame): - * gst/flacparse/gstflacparse.h: - Add FLAC parser, based on GstBaseParse. Also add the bit and byte reader - that will be added to libgstbase later. - The FLAC parser is currently not 100% bug free and fails to get the - correct frame size for some frames in some streams. - -2008-09-27 01:12:30 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/resindvd/: Add in Title/Chapter seeking, and simple but buggy audio and subtitle stream selection. - Original commit message from CVS: - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/gstmpegdemux.h: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/rsnstreamselector.c: - Add in Title/Chapter seeking, and simple but buggy audio - and subtitle stream selection. - -2008-09-24 17:21:41 +0000 Michael Smith <msmith@xiph.org> - - sys/dshowdecwrapper/: Prefer known-good filters, create directly by GUID if possible, fall back to creating highest-m... - Original commit message from CVS: - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowaudiodec.h: - * sys/dshowdecwrapper/gstdshowfakesrc.cpp: - * sys/dshowdecwrapper/gstdshowutil.cpp: - * sys/dshowdecwrapper/gstdshowutil.h: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.h: - Prefer known-good filters, create directly by GUID if possible, - fall back to creating highest-merit filter otherwise. - Fixes playback with random dshow filters installed in some - cases. + * ext/wpe/WPEThreadedView.cpp: + * ext/wpe/WPEThreadedView.h: + * ext/wpe/gstwpevideosrc.cpp: + wpevideosrc: Add touch event support + Dispatches a list of active touch events to the wpe view on each + received TOUCH_FRAME event. Touch inputs currently only move the cursor, + since wpe doesn't seem to support clicking/scrolling or zooming with + touch input. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1633> -2008-09-23 18:13:31 +0000 Wim Taymans <wim.taymans@gmail.com> +2022-02-14 16:08:23 +0100 Vivienne Watermeier <vwatermeier@igalia.com> - gst/rtpmanager/: Fix some docs. - Original commit message from CVS: - * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_insert), - (rtp_jitter_buffer_get_sync): - * gst/rtpmanager/rtpsession.c: (on_sender_timeout), - (session_cleanup): - * gst/rtpmanager/rtpsource.c: - Fix some docs. - -2008-09-23 17:34:44 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - Patch from: Josep Torra - Original commit message from CVS: - Patch from: Josep Torra - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - Use a preallocated buffer per stream for PES packets sent on src pads. - Adaptively adjust buffer size appropriately. - -2008-09-17 14:47:12 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/neon/gstneonhttpsrc.c: Clean up the debug logging code and #ifdef mess a bit: whether or not gstreamer debug mess... - Original commit message from CVS: - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_start), - (gst_neonhttp_src_send_request_and_redirect): - Clean up the debug logging code and #ifdef mess a bit: whether or not - gstreamer debug messages should be output should not depend on an - element property; also, GST_ELEMENT_ERROR will leave a line in the log - already, so merge the more useful debug log messages with the less useful - error debug strings. - -2008-09-17 14:22:38 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/neon/gstneonhttpsrc.c: Don't post LIBRARY_INIT errors where we should be posting - Original commit message from CVS: - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_start): - Don't post LIBRARY_INIT errors where we should be posting - RESOURCE OPEN_READ errors. Fixes #552506. - -2008-09-17 13:59:21 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Fix compiler warnings on OS/X - Original commit message from CVS: - * ext/jack/gstjackaudiosink.c: (jack_process_cb): - * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew): - Fix compiler warnings on OS/X - -2008-09-17 09:06:57 +0000 Michael Krufky <mkrufky@linuxtv.org> - - sys/dvb/gstdvbsrc.c: Add adapter_name for bus message in ATSC case. Fixes #552536. - Original commit message from CVS: - patch by: Michael Krufky - * sys/dvb/gstdvbsrc.c: - Add adapter_name for bus message in ATSC case. Fixes #552536. - -2008-09-15 09:39:00 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/celt/gstceltenc.h: Help gtk-doc to parse this correctly. - Original commit message from CVS: - * ext/celt/gstceltenc.h: - Help gtk-doc to parse this correctly. - * gst/pcapparse/gstpcapparse.c: - Add missing include. - -2008-09-15 09:34:14 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - examples/Makefile.am: Only built scaletempo example if we have gtk. - Original commit message from CVS: - * examples/Makefile.am: - Only built scaletempo example if we have gtk. - -2008-09-13 01:37:50 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Do not try to adjust the offset of streams for which we have not yet seen an SR packet. A... - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (create_session), - (gst_rtp_bin_associate), (gst_rtp_bin_sync_chain): - Do not try to adjust the offset of streams for which we have not yet - seen an SR packet. Avoids large ts-offsets in some cases. - -2008-09-10 23:15:11 +0000 Michael Smith <msmith@xiph.org> - - sys/dshowdecwrapper/: Major rewrite of dshowdecwrapper. Converts code to - Original commit message from CVS: - * sys/dshowdecwrapper/Makefile.am: - * sys/dshowdecwrapper/gstdshowaudiodec.c: - * sys/dshowdecwrapper/gstdshowaudiodec.cpp: - * sys/dshowdecwrapper/gstdshowaudiodec.h: - * sys/dshowdecwrapper/gstdshowdecwrapper.c: - * sys/dshowdecwrapper/gstdshowdecwrapper.cpp: - * sys/dshowdecwrapper/gstdshowdecwrapper.h: - * sys/dshowdecwrapper/gstdshowfakesrc.cpp: - * sys/dshowdecwrapper/gstdshowfakesrc.h: - * sys/dshowdecwrapper/gstdshowutil.cpp: - * sys/dshowdecwrapper/gstdshowutil.h: - * sys/dshowdecwrapper/gstdshowvideodec.c: - * sys/dshowdecwrapper/gstdshowvideodec.cpp: - * sys/dshowdecwrapper/gstdshowvideodec.h: - Major rewrite of dshowdecwrapper. Converts code to - C++, moves to direct use of DirectShow base classes, - make a lot of code clearer, simplify, etc. - Fix decode of MP3 on Vista by working around an apparent - bug in the decoder. - -2008-09-10 12:05:39 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - sys/winks/gstksclock.c (gst_ks_clock_worker_thread_func, gst_ks_clock_start): - Original commit message from CVS: - * sys/winks/gstksclock.c (gst_ks_clock_worker_thread_func, - gst_ks_clock_start): - Synchronize KS clock as a single-shot operation for now, there's not - much point in doing it periodically until we're actually using the - KS timestamps for anything else than just discarding old frames. - * sys/winks/gstksvideosrc.c (gst_ks_video_src_open_device): - Provide the GstClock when opening the device if we already have one. - -2008-09-09 23:58:02 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - sys/winks/gstksvideodevice.c (GST_DEBUG_IS_ENABLED, last_timestamp, gst_ks_video_device_prepare_buffers, gst_ks_video... - Original commit message from CVS: - * sys/winks/gstksvideodevice.c (GST_DEBUG_IS_ENABLED, last_timestamp, - gst_ks_video_device_prepare_buffers, gst_ks_video_device_create_pin, - gst_ks_video_device_set_state, gst_ks_video_device_request_frame, - gst_ks_video_device_read_frame): - Guard against capturing old frames by keeping track of the last - timestamp and also zero-fill the buffers before each capture. - Only assign a master clock if the pin hasn't already got one. - Actually free buffers on the way down to avoid a huge memory leak, - as this was previously done when changing state to ACQUIRE downwards - and we now skip that state on the way down. - Add some debug. - * sys/winks/gstksvideosrc.c (DEFAULT_DEVICE_PATH, DEFAULT_DEVICE_NAME, - DEFAULT_DEVICE_INDEX, KS_WORKER_LOCK, KS_WORKER_UNLOCK, - KS_WORKER_WAIT, KS_WORKER_NOTIFY, KS_WORKER_WAIT_FOR_RESULT, - KS_WORKER_NOTIFY_RESULT, KS_WORKER_STATE_STARTING, - KS_WORKER_STATE_READY, KS_WORKER_STATE_STOPPING, - KS_WORKER_STATE_ERROR, KsWorkerState, device_path, device_name, - device_index, running, worker_thread, worker_lock, - worker_notify_cond, worker_result_cond, worker_state, - worker_pending_caps, worker_setcaps_result, worker_pending_run, - worker_run_result, gst_ks_video_src_reset, - gst_ks_video_src_apply_driver_quirks, gst_ks_video_src_open_device, - gst_ks_video_src_close_device, gst_ks_video_src_worker_func, - gst_ks_video_src_start_worker, gst_ks_video_src_stop_worker, - gst_ks_video_src_change_state, gst_ks_video_src_set_clock, - gst_ks_video_src_set_caps, gst_ks_video_src_timestamp_buffer, - gst_ks_video_src_create): - Remove ENABLE_CLOCK_DEBUG define, it's GST_LEVEL_DEBUG after all. - Get rid of PROP_ENSLAVE_KSCLOCK and always slave the ks clock to the - GStreamer clock, it doesn't seem to hurt and matches DirectShow's - behavior. As an added bonus we usually get PresentationTime set for - each frame, so we can expand on this later for smarter latency - reporting (by looking at the diff between the timestamp from the - driver and the time according to the GStreamer clock). - Use an internal worker thread for opening the device, setting caps, - changing its state and closing it. This way we're a lot more - compatible with drivers that rely on hacks to do video-effects - between the low-level NT API and the application. Ick. - Start the ks clock and set the pin to KSSTATE_RUN on the first - create() so that we'll hopefully get hold of the GStreamer clock - from the very beginning. This way there's no chance that the - timestamps will make a sudden jump in the beginning of the stream - when we're running with a clock. - * sys/winks/kshelpers.c (CHECK_OPTIONS_FLAG, - ks_options_flags_to_string): - Reorder the flags to match the headerfile order, and make the string - a bit more compact. - * sys/winks/ksvideohelpers.c (ks_video_probe_filter_for_caps): - Avoid leaking KSPROPERTY_PIN_DATARANGES. - -2008-09-09 17:56:10 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - Add jp2k plugin. Fixes #550657. - Original commit message from CVS: - * configure.ac: - * ext/Makefile.am: - * ext/jp2k/Makefile.am: - * ext/jp2k/gstjasperdec.c: (gst_jasper_dec_base_init), - (gst_jasper_dec_class_init), (gst_jasper_dec_init), - (gst_jasper_dec_reset), (gst_jasper_dec_sink_setcaps), - (gst_jasper_dec_negotiate), (gst_jasper_dec_get_picture), - (gst_jasper_dec_chain), (gst_jasper_dec_set_property), - (gst_jasper_dec_get_property), (gst_jasper_dec_change_state), - (plugin_init): - * ext/jp2k/gstjasperdec.h: - Add jp2k plugin. Fixes #550657. - -2008-09-09 11:47:42 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/mpegdemux/: Fix conflicting public names in new mpeg demuxers. - Original commit message from CVS: - * gst/mpegdemux/flumpegdemux.c: (plugin_init): - * gst/mpegdemux/gstmpegdemux.c: (gst_flups_demux_sync_get_type), - (gst_flups_demux_get_type), (gst_flups_demux_plugin_init): - * gst/mpegdemux/gstmpegtsdemux.c: (gst_fluts_demux_get_type), - (gst_fluts_demux_plugin_init): - Fix conflicting public names in new mpeg demuxers. - Fixes #550468 - -2008-09-09 01:14:10 +0000 Michael Smith <msmith@xiph.org> - - gst/aiffparse/aiffparse.c: Support chunks in AIFF in any order in pull mode, and any order so long as we get COMM bef... - Original commit message from CVS: - * gst/aiffparse/aiffparse.c: - Support chunks in AIFF in any order in pull mode, and any order so - long as we get COMM before the actual data (SSND) in push mode. - Fixes playback of AIFC files. - -2008-09-08 20:27:23 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/selector/gstinputselector.c: Reset the selector state when going to READY. - Original commit message from CVS: - * gst/selector/gstinputselector.c: (gst_selector_pad_reset), - (gst_input_selector_reset), (gst_input_selector_change_state): - Reset the selector state when going to READY. - -2008-09-05 13:52:34 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.*: Add signal to notify listeners when a sender becomes a receiver. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (on_sender_timeout), - (create_session), (gst_rtp_bin_associate), - (gst_rtp_bin_sync_chain), (gst_rtp_bin_class_init), - (gst_rtp_bin_request_new_pad): - * gst/rtpmanager/gstrtpbin.h: - Add signal to notify listeners when a sender becomes a receiver. - Tweak lip-sync code, don't store our own copy of the ts-offset of the - jitterbuffer, don't adjust sync if the change is less than 4msec. - Get the RTP timestamp <-> GStreamer timestamp relation directly from - the jitterbuffer instead of our inaccurate version from the source. - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop), - (gst_rtp_jitter_buffer_get_sync): - * gst/rtpmanager/gstrtpjitterbuffer.h: - Add G_LIKELY macros, use global defines for max packet reorder and - dropouts. - Reset the jitterbuffer clock skew detection when packets seqnums are - changed unexpectedly. - * gst/rtpmanager/gstrtpsession.c: (on_sender_timeout), - (gst_rtp_session_class_init), (gst_rtp_session_init): - * gst/rtpmanager/gstrtpsession.h: - Add sender timeout signal. - * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), - (calculate_skew), (rtp_jitter_buffer_insert), - (rtp_jitter_buffer_get_sync): - * gst/rtpmanager/rtpjitterbuffer.h: - Add some G_LIKELY macros. - Keep track of the extended RTP timestamp so that we can report the RTP - timestamp <-> GStreamer timestamp relation for lip-sync. - Remove server timestamp gap detection code, the server can sometimes - make a huge gap in timestamps (talk spurts,...) see #549774. - Detect timetamp weirdness instead by observing the sender/receiver - timestamp relation and resync if it changes more than 1 second. - Add method to report about the current rtp <-> gst timestamp relation - which is needed for lip-sync. - * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), - (on_sender_timeout), (check_collision), (rtp_session_process_sr), - (session_cleanup): - * gst/rtpmanager/rtpsession.h: - Add sender timeout signal. - Remove inaccurate rtp <-> gst timestamp relation code, the - jitterbuffer can now do an accurate reporting about this. - * gst/rtpmanager/rtpsource.c: (rtp_source_init), - (rtp_source_update_caps), (calculate_jitter), - (rtp_source_process_rtp): - * gst/rtpmanager/rtpsource.h: - Remove inaccurate rtp <-> gst timestamp relation code. - * gst/rtpmanager/rtpstats.h: - Define global max-reorder and max-dropout constants for use in various - subsystems. - -2008-09-05 11:07:32 +0000 Sebastian Pölsterl <marduk@k-d-w.org> - - sys/dvb/gstdvbsrc.c: Add DVB Adapter name to structure sent over bus. - Original commit message from CVS: - patch by: Sebastian Pölsterl - * sys/dvb/gstdvbsrc.c: - Add DVB Adapter name to structure sent over bus. - -2008-09-03 14:02:29 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - add mpeg demuxer - Original commit message from CVS: - add mpeg demuxer - -2008-09-02 17:43:42 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/mpegdemux/: Fix build on macosx. - Original commit message from CVS: - * gst/mpegdemux/gstmpegdemux.c: (gst_flups_demux_parse_pack_start): - * gst/mpegdemux/gstmpegtsdemux.c: (gst_fluts_demux_data_cb): - Fix build on macosx. - -2008-09-02 12:04:32 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - Add Fluendo MPEG PS and TS demuxers to gst-plugins-bad. This is now dual licensed MPL and LGPL. - Original commit message from CVS: - * configure.ac: - * gst/mpegdemux/Makefile.am: - * gst/mpegdemux/flumpegdemux.c: - * gst/mpegdemux/flutspatinfo.c: - * gst/mpegdemux/flutspatinfo.h: - * gst/mpegdemux/flutspmtinfo.c: - * gst/mpegdemux/flutspmtinfo.h: - * gst/mpegdemux/flutspmtstreaminfo.c: - * gst/mpegdemux/flutspmtstreaminfo.h: - * gst/mpegdemux/gstmpegdefs.h: - * gst/mpegdemux/gstmpegdemux.c: - * gst/mpegdemux/gstmpegdemux.h: - * gst/mpegdemux/gstmpegdesc.c: - * gst/mpegdemux/gstmpegdesc.h: - * gst/mpegdemux/gstmpegtsdemux.c: - * gst/mpegdemux/gstmpegtsdemux.h: - * gst/mpegdemux/gstpesfilter.c: - * gst/mpegdemux/gstpesfilter.h: - * gst/mpegdemux/gstsectionfilter.c: - * gst/mpegdemux/gstsectionfilter.h: - Add Fluendo MPEG PS and TS demuxers to gst-plugins-bad. This - is now dual licensed MPL and LGPL. - -2008-09-02 11:23:02 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/mpegtsmux/mpegtsmux.c: Set caps on outgoing buffers. - Original commit message from CVS: - * gst/mpegtsmux/mpegtsmux.c: (new_packet_cb): - Set caps on outgoing buffers. - -2008-09-02 09:56:44 +0000 Tim-Philipp Müller <tim@centricular.net> - - Enable/fix up translations for these plugins. - Original commit message from CVS: - * ext/resindvd/plugin.c: (plugin_init): - * ext/resindvd/resindvdsrc.c: - * ext/twolame/gsttwolame.c: (plugin_init): - * gst/aiffparse/aiffparse.c: (plugin_init): - Enable/fix up translations for these plugins. - * po/LINGUAS: - Add 'ca' to LINGUAS. - * po/POTFILES.in: - * po/POTFILES.skip: - Add more files for translation and more files which tools - should skip. - -2008-09-02 09:46:04 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/mpegtsmux/tsmux/tsmux.c: Fix build on macosx. - Original commit message from CVS: - * gst/mpegtsmux/tsmux/tsmux.c: (tsmux_write_ts_header): - Fix build on macosx. - -2008-09-01 17:54:00 +0000 Christian Schaller <uraeus@gnome.org> - - * examples/Makefile.am: - * gst-plugins-bad.spec.in: - update spec file and add missing subdirs in Makefile.am - Original commit message from CVS: - update spec file and add missing subdirs in Makefile.am - -2008-09-01 17:49:59 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mpegtsmux/mpegtsmux_aac.c: Allocate a fixed size buffer on the stack instead of using malloc(). - Original commit message from CVS: - * gst/mpegtsmux/mpegtsmux_aac.c: (mpegtsmux_prepare_aac): - Allocate a fixed size buffer on the stack instead of using malloc(). - * gst/mpegtsmux/tsmux/tsmux.c: (tsmux_new), (tsmux_free), - (tsmux_program_new), (tsmux_program_free): - * gst/mpegtsmux/tsmux/tsmuxstream.c: (tsmux_stream_new), - (tsmux_stream_free), (tsmux_stream_consume), - (tsmux_stream_add_data): - Use GSlice. - -2008-09-01 17:47:03 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/mpegtsmux/mpegtsmux.c: Add support for muxing MPEG4 video. - Original commit message from CVS: - * gst/mpegtsmux/mpegtsmux.c: (mpegtsmux_create_stream): - Add support for muxing MPEG4 video. - -2008-09-01 17:41:39 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/mpegtsmux/tsmux/: Fix build of mpegtsmux. - Original commit message from CVS: - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxstream.h: - Fix build of mpegtsmux. - -2008-09-01 16:38:40 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add Fluendo MPEG-TS muxer and libtsmux to gst-plugins-bad. This is renamed to mpegtsmux to prevent conflicts. Also al... - Original commit message from CVS: - * configure.ac: - * gst/mpegtsmux/Makefile.am: - * gst/mpegtsmux/mpegtsmux.c: (mpegtsmux_base_init), - (mpegtsmux_class_init), (mpegtsmux_init), (mpegtsmux_dispose), - (gst_mpegtsmux_set_property), (gst_mpegtsmux_get_property), - (release_buffer_cb), (mpegtsmux_create_stream), - (mpegtsmux_create_streams), (mpegtsmux_choose_best_stream), - (mpegtsmux_collected), (mpegtsmux_request_new_pad), - (mpegtsmux_release_pad), (new_packet_cb), - (mpegtsdemux_prepare_srcpad), (mpegtsmux_change_state), - (plugin_init): - * gst/mpegtsmux/mpegtsmux.h: - * gst/mpegtsmux/mpegtsmux_aac.c: (mpegtsmux_prepare_aac): - * gst/mpegtsmux/mpegtsmux_aac.h: - * gst/mpegtsmux/mpegtsmux_h264.c: (mpegtsmux_prepare_h264): - * gst/mpegtsmux/mpegtsmux_h264.h: - * gst/mpegtsmux/tsmux/Makefile.am: - * gst/mpegtsmux/tsmux/crc.h: - * gst/mpegtsmux/tsmux/tsmux.c: (tsmux_new), (tsmux_set_write_func), - (tsmux_set_pat_frequency), (tsmux_get_pat_frequency), (tsmux_free), - (tsmux_program_new), (tsmux_set_pmt_frequency), - (tsmux_get_pmt_frequency), (tsmux_program_add_stream), - (tsmux_program_set_pcr_stream), (tsmux_get_new_pid), - (tsmux_create_stream), (tsmux_find_stream), (tsmux_packet_out), - (tsmux_write_adaptation_field), (tsmux_write_ts_header), - (tsmux_write_stream_packet), (tsmux_program_free), - (tsmux_write_section), (tsmux_write_section_hdr), - (tsmux_write_pat), (tsmux_write_pmt): - * gst/mpegtsmux/tsmux/tsmux.h: - * gst/mpegtsmux/tsmux/tsmuxcommon.h: - * gst/mpegtsmux/tsmux/tsmuxstream.c: (tsmux_stream_new), - (tsmux_stream_get_pid), (tsmux_stream_free), - (tsmux_stream_set_buffer_release_func), (tsmux_stream_consume), - (tsmux_stream_at_pes_start), (tsmux_stream_bytes_avail), - (tsmux_stream_bytes_in_buffer), (tsmux_stream_get_data), - (tsmux_stream_pes_header_length), - (tsmux_stream_find_pts_dts_within), - (tsmux_stream_write_pes_header), (tsmux_stream_add_data), - (tsmux_stream_get_es_descrs), (tsmux_stream_pcr_ref), - (tsmux_stream_pcr_unref), (tsmux_stream_is_pcr), - (tsmux_stream_get_pts): - * gst/mpegtsmux/tsmux/tsmuxstream.h: - Add Fluendo MPEG-TS muxer and libtsmux to gst-plugins-bad. This - is renamed to mpegtsmux to prevent conflicts. Also all relevant - informations about copyright and license are added to the top of - every file but apart from that no changes compared to the latest - SVN versions happened. - -2008-09-01 16:05:45 +0000 Edward Hervey <bilboed@bilboed.com> - - tests/check/elements/audioresample.c: Now that GstBaseTransform is 'fixed' ... remove cruft from tests. - Original commit message from CVS: - * tests/check/elements/audioresample.c: (setup_audioresample), - (fail_unless_perfect_stream), (test_perfect_stream_instance), - (test_discont_stream_instance): - Now that GstBaseTransform is 'fixed' ... remove cruft from tests. - Add debugging for coherence. - -2008-09-01 13:23:03 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/selector/gstinputselector.c: Reuse the get_linked_pads for both source and sinkpads because they are the same. - Original commit message from CVS: - * gst/selector/gstinputselector.c: (gst_input_selector_init), - (gst_input_selector_event), (gst_input_selector_query): - Reuse the get_linked_pads for both source and sinkpads because they are - the same. - Implement a custum event handler and get the internally linked pad - directly instead of relying on the default (slower) implementation. + * ext/directfb/dfbvideosink.c: + * ext/opencv/gsthanddetect.cpp: + * ext/vulkan/vksink.c: + * gst/librfb/gstrfbsrc.c: + * sys/d3d11/gstd3d11videosink.cpp: + * sys/d3dvideosink/d3dhelpers.c: + * sys/d3dvideosink/d3dvideosink.c: + * sys/directshow/dshowvideosink.cpp: + * sys/va/gstvavpp.c: + * tests/check/pipelines/ipcpipeline.c: + all: Use new navigation interface and API + Use and implement the new navigation interface in all relevant sink elements, + and use API functions everywhere instead of directy accessing the event structure. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1633> -2008-08-31 15:01:32 +0000 Sebastian Dröge <slomo@circular-chaos.org> +2022-03-22 10:37:59 +0800 Tong Wu <tong1.wu@intel.com> - ext/celt/gstceltdec.c: Correctly take the granulepos from upstream if possible and correctly handle the granulepos in... - Original commit message from CVS: - * ext/celt/gstceltdec.c: (celt_dec_chain_parse_data): - Correctly take the granulepos from upstream if possible and - correctly handle the granulepos in various calculations: the - granulepos is the sample number of the _last_ sample in a frame, not - the first. - * ext/celt/gstceltenc.c: (gst_celt_enc_sinkevent), - (gst_celt_enc_encode), (gst_celt_enc_chain), - (gst_celt_enc_change_state): - * ext/celt/gstceltenc.h: - Handle non-zero start timestamps in the encoder and detect/handle - stream discontinuities. Fixes bug #547075. - -2008-08-31 12:20:33 +0000 Rov Juvano <rovjuvano@users.sourceforge.net> - - Add scaletempo plugin, which allows to scale the speed of audio without changing the pitch by handling seeks with a r... - Original commit message from CVS: - Patch by: Rov Juvano <rovjuvano at users dot sourceforge dot net> - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-scaletempo.xml: - * examples/scaletempo/Makefile.am: - * examples/scaletempo/demo-gui.c: (pop_status_bar), - (status_bar_printf), (demo_gui_seek_bar_format), (update_position), - (demo_gui_seek_bar_change), (demo_gui_do_change_rate), - (demo_gui_do_set_rate), (demo_gui_do_rate_entered), - (demo_gui_do_toggle_advanced), (demo_gui_do_toggle_disabled), - (demo_gui_do_seek), (demo_gui_do_play), (demo_gui_do_pause), - (demo_gui_do_play_pause), (demo_gui_do_open_file), - (demo_gui_do_playlist_prev), (demo_gui_do_playlist_next), - (demo_gui_do_about_dialog), (demo_gui_do_quit), - (demo_gui_request_set_stride), (demo_gui_request_set_overlap), - (demo_gui_request_set_search), (demo_gui_rate_changed), - (demo_gui_playing_started), (demo_gui_playing_paused), - (demo_gui_playing_ended), (demo_gui_player_errored), - (demo_gui_stride_changed), (demo_gui_overlap_changed), - (demo_gui_search_changed), (demo_gui_set_player_func), - (demo_gui_set_playlist_func), (build_gvalue_array), - (create_action), (demo_gui_show_func), (demo_gui_set_player), - (demo_gui_set_playlist), (demo_gui_show), (demo_gui_get_property), - (demo_gui_set_property), (demo_gui_init), (demo_gui_class_init), - (demo_gui_get_type): - * examples/scaletempo/demo-gui.h: - * examples/scaletempo/demo-main.c: (handle_error_message), - (handle_quit), (main): - * examples/scaletempo/demo-player.c: (no_pipeline), - (demo_player_event_listener), (demo_player_state_changed_cb), - (demo_player_eos_cb), (demo_player_build_pipeline), (_set_rate), - (demo_player_scale_rate_func), (demo_player_set_rate_func), - (_set_state_and_wait), (demo_player_load_uri_func), - (demo_player_play_func), (demo_player_pause_func), (_seek_to), - (demo_player_seek_by_func), (demo_player_seek_to_func), - (demo_player_get_position_func), (demo_player_get_duration_func), - (demo_player_scale_rate), (demo_player_set_rate), - (demo_player_load_uri), (demo_player_play), (demo_player_pause), - (demo_player_seek_by), (demo_player_seek_to), - (demo_player_get_position), (demo_player_get_duration), - (demo_player_get_property), (demo_player_set_property), - (demo_player_init), (demo_player_class_init), - (demo_player_get_type): - * examples/scaletempo/demo-player.h: - * gst/scaletempo/Makefile.am: - * gst/scaletempo/gstscaletempo.c: (best_overlap_offset_float), - (best_overlap_offset_s16), (output_overlap_float), - (output_overlap_s16), (fill_queue), (reinit_buffers), - (gst_scaletempo_transform), (gst_scaletempo_transform_size), - (gst_scaletempo_sink_event), (gst_scaletempo_set_caps), - (gst_scaletempo_get_property), (gst_scaletempo_set_property), - (gst_scaletempo_base_init), (gst_scaletempo_class_init), - (gst_scaletempo_init): - * gst/scaletempo/gstscaletempo.h: - * gst/scaletempo/gstscaletempoplugin.c: (plugin_init): - Add scaletempo plugin, which allows to scale the speed of audio without - changing the pitch by handling seeks with a rate!=1.0. - Integrate it into the docs and add the example application for it. - Fixes bug #537700. - -2008-08-30 20:22:01 +0000 David Schleef <ds@schleef.org> - - ext/dirac/gstdiracenc.cc: Fix some memleaks. - Original commit message from CVS: - * ext/dirac/gstdiracenc.cc: Fix some memleaks. - -2008-08-30 06:30:42 +0000 David Schleef <ds@schleef.org> - - ext/dirac/gstdiracenc.cc: Fix EOS handling. Clean up at object disposal. Handle 4:2:2 and 4:4:4 video. - Original commit message from CVS: - * ext/dirac/gstdiracenc.cc: Fix EOS handling. Clean up at - object disposal. Handle 4:2:2 and 4:4:4 video. - -2008-08-29 14:05:25 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/resindvd/resindvdbin.c: Fix compiler warning on Forte. - Original commit message from CVS: - * ext/resindvd/resindvdbin.c: - Fix compiler warning on Forte. - -2008-08-29 13:57:39 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Commit FIONREAD check, needed for the dccp src. - Original commit message from CVS: - * configure.ac: - Commit FIONREAD check, needed for the dccp src. - -2008-08-29 12:16:27 +0000 Christian Schaller <uraeus@gnome.org> - - * ext/Makefile.am: - * gst-plugins-bad.spec.in: - update spec file to include latest plugins, add apexsrc diretory to disted files - Original commit message from CVS: - update spec file to include latest plugins, add apexsrc diretory to disted files - -2008-08-29 11:36:41 +0000 Edward Hervey <bilboed@bilboed.com> - - ext/faac/gstfaac.*: Add code for calculating proper timestamp/duration for the trailing encoded buffers that faac wil... - Original commit message from CVS: - * ext/faac/gstfaac.c: (gst_faac_init), (gst_faac_sink_event), - (gst_faac_chain), (gst_faac_change_state): - * ext/faac/gstfaac.h: - Add code for calculating proper timestamp/duration for the trailing - encoded buffers that faac will output when receiving EOS. - -2008-08-29 08:57:14 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Fix CFLAGS and LIBS for the apexsink. - Original commit message from CVS: - * configure.ac: - Fix CFLAGS and LIBS for the apexsink. - -2008-08-28 22:02:28 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - sys/winks/ksvideohelpers.c (ks_video_media_type_free): Avoid leaking the KSDATARANGE member of each KsVideoMediaType. - Original commit message from CVS: - * sys/winks/ksvideohelpers.c (ks_video_media_type_free): - Avoid leaking the KSDATARANGE member of each KsVideoMediaType. - -2008-08-28 17:16:51 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/dccp/: Fix compilation on Solaris by including filio.h as needed. - Original commit message from CVS: - * gst/dccp/gstdccp.c: - * gst/dccp/gstdccpclientsrc.c: - Fix compilation on Solaris by including filio.h as needed. - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: - Fix compilation with Forte - apparently it hates concatenating a - macro argument that starts with an underscore?? - -2008-08-28 17:01:30 +0000 Jérémie Bernard <gremimail@gmail.com> - - Add apexsink for audio output to Apple AirPort Express Wireless devices. Fixes bug #542510. - Original commit message from CVS: - Patch by: Jérémie Bernard <gremimail at gmail dot com> - * configure.ac: - * ext/apexsink/LGPL-3.0.txt: - * ext/apexsink/Makefile.am: - * ext/apexsink/gstapexplugin.c: (plugin_init): - * ext/apexsink/gstapexraop.c: (g_strdel), (gst_apexraop_send), - (gst_apexraop_recv), (gst_apexraop_new), (gst_apexraop_free), - (gst_apexraop_set_host), (gst_apexraop_get_host), - (gst_apexraop_set_port), (gst_apexraop_get_port), - (gst_apexraop_set_useragent), (gst_apexraop_get_useragent), - (gst_apexraop_connect), (gst_apexraop_get_jacktype), - (gst_apexraop_get_jackstatus), (gst_apexraop_close), - (gst_apexraop_set_volume), (gst_apexraop_write_bits), - (gst_apexraop_write), (gst_apexraop_flush): - * ext/apexsink/gstapexraop.h: - * ext/apexsink/gstapexsink.c: (gst_apexsink_jackstatus_get_type), - (gst_apexsink_jacktype_get_type), (gst_apexsink_interfaces_init), - (gst_apexsink_implements_interface_init), - (gst_apexsink_mixer_interface_init), - (gst_apexsink_interface_supported), - (gst_apexsink_mixer_list_tracks), (gst_apexsink_mixer_set_volume), - (gst_apexsink_mixer_get_volume), (gst_apexsink_base_init), - (gst_apexsink_class_init), (gst_apexsink_init), - (gst_apexsink_set_property), (gst_apexsink_get_property), - (gst_apexsink_finalise), (gst_apexsink_open), - (gst_apexsink_prepare), (gst_apexsink_write), - (gst_apexsink_unprepare), (gst_apexsink_delay), - (gst_apexsink_reset), (gst_apexsink_close): - * ext/apexsink/gstapexsink.h: - Add apexsink for audio output to Apple AirPort Express Wireless - devices. Fixes bug #542510. - -2008-08-28 15:21:45 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpsession.c: Send EOS when the session object instructs us to. - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_send_rtcp), - (gst_rtp_session_event_send_rtp_sink): - Send EOS when the session object instructs us to. - * gst/rtpmanager/rtpsession.c: (rtp_session_on_timeout): - * gst/rtpmanager/rtpsession.h: - Make it possible for the session manager to instruct us to send EOS. We - currently will EOS when the session is a sender and when the sender part - goes EOS. This is not entirely correct behaviour because the session - could still participate as a receiver. - Fixes #549409. - -2008-08-28 01:03:24 +0000 Michael Smith <msmith@xiph.org> - - gst/aiffparse/aiffparse.c: Read size of chunks preceeding the audio data with the correct endianness. Fixes playback ... - Original commit message from CVS: - * gst/aiffparse/aiffparse.c: - Read size of chunks preceeding the audio data with the - correct endianness. Fixes playback of some files. - Fixes #538500 - -2008-08-28 00:25:28 +0000 Michael Smith <msmith@xiph.org> - - Add an AIFF parsing element, heavily based on wavparse. - Original commit message from CVS: - * configure.ac: - * gst/aiffparse/Makefile.am: - * gst/aiffparse/aiffparse.c: - * gst/aiffparse/aiffparse.h: - Add an AIFF parsing element, heavily based on wavparse. + * sys/msdk/gstmsdkenc.c: + * sys/msdk/gstmsdkh265enc.c: + * sys/msdk/gstmsdkvp9enc.c: + msdkenc: add macro definitions to avoid the gst-inspect error + Since the strings are empty for GST_MSDK_CAPS_MAKE_WITH_DMABUF_FEATURE + and GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE, when excuting + gst-inspect-1.0.exe msdkh265enc, there will be convert static caps error + because of the extra semicolon between two empty strings. Now macro + definitions are added to avoid this issue. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2004> -2008-08-27 21:33:07 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> +2022-01-26 14:55:51 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - * ChangeLog: - * sys/winks/gstksvideodevice.c: - * sys/winks/gstksvideosrc.c: - sys/winks/gstksvideodevice.c (gst_ks_video_device_class_init, gst_ks_video_device_set_state): - Original commit message from CVS: - * sys/winks/gstksvideodevice.c (gst_ks_video_device_class_init, - gst_ks_video_device_set_state): - Don't set the pin state to KSSTATE_RUN from the streaming thread. - Skip KSSTATE_ACQUIRE when changing pin state downwards. - Be nice and specify G_PARAM_STATIC_STRINGS. - Remove unused finalize method. - * sys/winks/gstksvideosrc.c (DEFAULT_ENABLE_QUIRKS, PROP_ENABLE_QUIRKS, - enable_quirks, gst_ks_video_src_class_init, gst_ks_video_src_init, - gst_ks_video_src_finalize, gst_ks_video_src_get_property, - gst_ks_video_src_set_property, gst_ks_video_src_reset, - gst_ks_video_src_apply_driver_quirks, gst_ks_video_src_change_state, - gst_ks_video_src_set_caps): - First driver quirk: work around Logitech's hostile driver software to - improve stability and performance. See comments for details. - Provide a property to disable driver quirks (enabled by default). - Be nice and specify G_PARAM_STATIC_STRINGS. - Remove unused dispose method. - Tweak include order. - -2008-08-27 15:45:16 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/selector/gstinputselector.c: Implement the LATENCY query in a better way by taking the latency of all sinkpads an... - Original commit message from CVS: - * gst/selector/gstinputselector.c: (gst_input_selector_init), - (gst_input_selector_query): - Implement the LATENCY query in a better way by taking the latency of all - sinkpads and taking the min/max instead of just taking a random pad. - -2008-08-26 12:33:16 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/tomsmocomp/: Unroll the loop to handle two bytes at once. This should give a small speedup an... - Original commit message from CVS: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: - * gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc: - * gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc: - Unroll the loop to handle two bytes at once. This should give - a small speedup and makes it possible to handle chroma and luma - different which is needed later. - -2008-08-26 11:18:38 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/dccp/gstdccpserversink.*: Don't put globals only used by one '.c' file in a header ! - Original commit message from CVS: - * gst/dccp/gstdccpserversink.c: - * gst/dccp/gstdccpserversink.h: - Don't put globals only used by one '.c' file in a header ! - Declare it as static, fixes build on macosx. - -2008-08-26 11:13:24 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/dccp/gstdccp.c: Whoops, that was one fix too much :) - Original commit message from CVS: - * gst/dccp/gstdccp.c: (gst_dccp_send_buffer): - Whoops, that was one fix too much :) - -2008-08-26 11:08:34 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/dccp/gstdccp.c: size_t's size varies by platform/architecture. Use glib convenience macro instead. Fixes build on... - Original commit message from CVS: - * gst/dccp/gstdccp.c: (gst_dccp_read_buffer), - (gst_dccp_send_buffer), (gst_dccp_set_sock_windowsize): - size_t's size varies by platform/architecture. Use glib convenience - macro instead. Fixes build on macosx. - Remove ending '\n' in debug statements. - -2008-08-26 11:01:43 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/pcapparse/gstpcapparse.c: Remove unused code and fix includes. - Original commit message from CVS: - * gst/pcapparse/gstpcapparse.c: (gst_pcap_parse_class_init): - Remove unused code and fix includes. - -2008-08-25 14:37:45 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/: First part of the C implementation of the tomsmocomp deinterlacing algorithm. This only supports s... - Original commit message from CVS: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace_method_class_init): - * gst/deinterlace2/gstdeinterlace2.h: - * gst/deinterlace2/tvtime/tomsmocomp.c: - (gst_deinterlace_method_tomsmocomp_class_init): - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: - * gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc: - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: - * gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc: - * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: - First part of the C implementation of the tomsmocomp deinterlacing - algorithm. This only supports search-effort=0 currently, is painfully - slow and needs some cleanup later when all search-effort settings - are implemented in C. - -2008-08-24 22:05:48 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - New plugin for low-latency video capture on Windows (#519935). - Original commit message from CVS: - * configure.ac: - * sys/Makefile.am: - * sys/winks/Makefile.am: - * sys/winks/gstksclock.c: - * sys/winks/gstksclock.h: - * sys/winks/gstksvideodevice.c: - * sys/winks/gstksvideodevice.h: - * sys/winks/gstksvideosrc.c: - * sys/winks/gstksvideosrc.h: - * sys/winks/kshelpers.c: - * sys/winks/kshelpers.h: - * sys/winks/ksvideohelpers.c: - * sys/winks/ksvideohelpers.h: - New plugin for low-latency video capture on Windows (#519935). - Uses Kernel Streaming, the lowest level API for doing video capture - on Windows (more or less just raw ioctls). - -2008-08-24 16:55:48 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - Added documentation blobs. Thanks to Stefan for noticing! - Original commit message from CVS: - * gst/pcapparse/gstpcapparse.c: - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.c: - Added documentation blobs. Thanks to Stefan for noticing! - -2008-08-24 13:53:29 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - New plugin: pcapparse (#520899). - Original commit message from CVS: - * configure.ac: - * gst/pcapparse/Makefile.am: - * gst/pcapparse/gstpcapparse.c: - * gst/pcapparse/gstpcapparse.h: - New plugin: pcapparse (#520899). - -2008-08-24 13:23:44 +0000 Haakon Sporsheim <hakon.sporsheim@tandberg.com> - - New plugin: winscreencap (#463941). - Original commit message from CVS: - patch by: Haakon Sporsheim <hakon.sporsheim@tandberg.com> - * configure.ac: - * sys/Makefile.am: - * sys/winscreencap/Makefile.am: - * sys/winscreencap/gstdx9screencapsrc.c: - * sys/winscreencap/gstdx9screencapsrc.h: - * sys/winscreencap/gstgdiscreencapsrc.c: - * sys/winscreencap/gstgdiscreencapsrc.h: - * sys/winscreencap/gstwinscreencap.c: - * sys/winscreencap/gstwinscreencap.h: - New plugin: winscreencap (#463941). - -2008-08-23 00:01:39 +0000 Michael Smith <msmith@xiph.org> - - sys/dshowdecwrapper/gstdshowaudiodec.c: Flip mpeg1/mpeg2 arrays for mpeg audio. Detect which type the audio is correc... - Original commit message from CVS: - * sys/dshowdecwrapper/gstdshowaudiodec.c: - Flip mpeg1/mpeg2 arrays for mpeg audio. Detect which type the audio - is correctly, instead of backwards. No functional changes, since this - mistake was completely self-consistent. - -2008-08-22 06:27:57 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/gst-plugins-bad-plugins-docs.sgml: Add, but commented out xml/element-dc1394.xml. Its documented, but - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - Add, but commented out xml/element-dc1394.xml. Its documented, but - I can't get it to be build. - * ext/celt/gstceltdec.c: - * ext/celt/gstceltenc.c: - Fix doc warnings and reformat the doc block. - -2008-08-21 13:22:38 +0000 Leandro Melo de Sales <leandroal@gmail.com> - - Add dccp plugin. Fixes #542390. - Original commit message from CVS: - patch by: Leandro Melo de Sales <leandroal@gmail.com> - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-dccp.xml: - * gst/dccp/Makefile.am: - * gst/dccp/gstdccp.c: - * gst/dccp/gstdccp.h: - * gst/dccp/gstdccpclientsink.c: - * gst/dccp/gstdccpclientsink.h: - * gst/dccp/gstdccpclientsrc.c: - * gst/dccp/gstdccpclientsrc.h: - * gst/dccp/gstdccpplugin.c: - * gst/dccp/gstdccpserversink.c: - * gst/dccp/gstdccpserversink.h: - * gst/dccp/gstdccpserversrc.c: - * gst/dccp/gstdccpserversrc.h: - * tests/icles/dccp/README: - * tests/icles/dccp/call/README: - * tests/icles/dccp/call/DCCPClient.c: - * tests/icles/dccp/call/DCCPServer.c: - * tests/icles/dccp/file/DCCPClientSaveFile.c: - * tests/icles/dccp/file/DCCPServerSendFile.c: - * tests/icles/dccp/mic/DCCPClientPlayMic.c: - * tests/icles/dccp/mic/DCCPServerMic.c: - * tests/icles/dccp/mp3/DCCPClientPlayMP3.c: - * tests/icles/dccp/mp3/DCCPServerSendMP3.c: - * tests/icles/dccp/mp3Speex/DCCPClientPlaySpeexMP3.c: - * tests/icles/dccp/mp3Speex/DCCPServerSendSpeexMP3.c: - * tests/icles/dccp/mp3Stream/DCCPClientPlayMP3Stream.c: - * tests/icles/dccp/mp3Stream/DCCPServerSendMP3Stream.c: - Add dccp plugin. Fixes #542390. - -2008-08-20 22:24:28 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Remove bits that presumably weren't supposed to be committed. - Original commit message from CVS: - * configure.ac: - Remove bits that presumably weren't supposed to be committed. - -2008-08-20 21:44:22 +0000 Michael Smith <msmith@xiph.org> - - Add new windows ACM encoder wrapper. - Original commit message from CVS: - * configure.ac: - * sys/Makefile.am: - * sys/acmenc/Makefile.am: - * sys/acmenc/acmenc.c: - Add new windows ACM encoder wrapper. - -2008-08-18 11:13:07 +0000 Michael Krufky <mkrufky@linuxtv.org> - - sys/dvb/: Add ATSC tunning and channels.conf parsing support. - Original commit message from CVS: - patch by: Michael Krufky - * sys/dvb/gstdvbsrc.c: - * sys/dvb/parsechannels.c: - Add ATSC tunning and channels.conf parsing support. - Fixes #537455 - -2008-08-13 21:58:08 +0000 Michael Smith <msmith@xiph.org> - - sys/: Initialise COM with default flags. - Original commit message from CVS: - * sys/dshowdecwrapper/gstdshowaudiodec.c: - * sys/dshowdecwrapper/gstdshowaudiodec.h: - * sys/dshowdecwrapper/gstdshowvideodec.c: - * sys/dshowdecwrapper/gstdshowvideodec.h: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dshowvideosink/dshowvideosink.h: - Initialise COM with default flags. - Only deinitialise if the initialisation was successful. - -2008-08-13 14:31:02 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Reset rtp timestamp interpollation when we detect a gap when the clock_base changed. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), - (gst_rtp_bin_sync_chain), (new_ssrc_pad_found): - Reset rtp timestamp interpollation when we detect a gap when the - clock_base changed. - Don't try to adjust the ts-offset when it's too big (> 3seconds) - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_set_ssrc): - * gst/rtpmanager/gstrtpsession.h: - Add method to set session SSRC. - * gst/rtpmanager/rtpsession.c: (check_collision), - (rtp_session_set_internal_ssrc), (rtp_session_get_internal_ssrc), - (rtp_session_on_timeout): - * gst/rtpmanager/rtpsession.h: - Added debugging for the collision checks. - Add method to change the internal SSRC of the session. - * gst/rtpmanager/rtpsource.c: (rtp_source_process_rtp): - Reset the clock base when we detect large jumps in the seqnums. - -2008-08-12 16:13:15 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - ext/x264/gstx264enc.*: Do not deal with duplicated input (timestamps). If needed, a generic element can do so. - Original commit message from CVS: - * ext/x264/gstx264enc.c: (gst_x264_enc_reset), - (gst_x264_enc_chain), (gst_x264_enc_encode_frame): - * ext/x264/gstx264enc.h: - Do not deal with duplicated input (timestamps). If needed, - a generic element can do so. - Do not manipulate input timestamps on the way out, - since that shifts the timeline and A/V sync. - -2008-08-12 15:41:48 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - docs/plugins/gst-plugins-bad-plugins.args: Integrate new properties into documentation. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.args: - Integrate new properties into documentation. - * ext/x264/gstx264enc.c: (gst_x264_enc_class_init), - (gst_x264_enc_init), (gst_x264_enc_init_encoder), - (gst_x264_enc_set_property), (gst_x264_enc_get_property): - Fix up API prior to eventual plugin move. - API: GstX264Enc:pass (provides more options, and changed to enum) - -2008-08-12 14:31:57 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - Update and add documentation for mplex. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-mplex.xml: - * ext/mplex/gstmplex.cc: - Update and add documentation for mplex. - * ext/mpeg2enc/gstmpeg2enc.cc: - Documentation update. - -2008-08-12 13:08:39 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - Add documentation and unit test for x264enc. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/x264/gstx264enc.c: - * tests/check/Makefile.am: - * tests/check/elements/x264enc.c: (setup_x264enc), - (cleanup_x264enc), (GST_START_TEST), (x264enc_suite), (main): - Add documentation and unit test for x264enc. - -2008-08-11 17:24:58 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - ext/x264/gstx264enc.c: Allocate some buffers in more adaptive and economical fashion. - Original commit message from CVS: - * ext/x264/gstx264enc.c: (gst_x264_enc_init), - (gst_x264_enc_header_buf), (gst_x264_enc_encode_frame): - Allocate some buffers in more adaptive and economical fashion. - -2008-08-11 15:16:14 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - configure.ac: Check for sufficiently up-to-date x264 API. - Original commit message from CVS: - * configure.ac: - Check for sufficiently up-to-date x264 API. - * ext/x264/gstx264enc.c: (gst_x264_enc_pass_get_type), - (gst_x264_enc_base_init), (gst_x264_enc_class_init), - (gst_x264_enc_init), (gst_x264_enc_init_encoder), - (gst_x264_enc_set_property), (gst_x264_enc_get_property): - * ext/x264/gstx264enc.h: - Expose some more parameters of the x264 encoder as properties. - -2008-08-11 07:20:15 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/rtpmanager/gstrtpbin.c: Print the pad-name in debug log. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: - Print the pad-name in debug log. - * sys/dshowsrcwrapper/gstdshowaudiosrc.c: - * sys/dshowsrcwrapper/gstdshowvideosrc.c: - Use "-" instead of "_" in property names. Can we call them just - "device" like everywhere else? - -2008-08-08 15:07:12 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - ext/x264/gstx264enc.c: Coding style and layout; re-order some functions in more typical and natural flow. - Original commit message from CVS: - * ext/x264/gstx264enc.c: (gst_x264_enc_log_callback), - (gst_x264_enc_finalize), (gst_x264_enc_header_buf), - (gst_x264_enc_set_src_caps), (gst_x264_enc_sink_set_caps), - (gst_x264_enc_flush_frames): - Coding style and layout; re-order some functions in more - typical and natural flow. - -2008-08-08 14:19:16 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - ext/x264/: Use GQueue in stead of custom queue code. - Original commit message from CVS: - * ext/x264/Makefile.am: - * ext/x264/gstx264enc.c: (gst_x264_enc_set_src_caps), - (gst_x264_enc_sink_set_caps), (gst_x264_enc_init), - (gst_x264_enc_reset), (gst_x264_enc_finalize), - (gst_x264_enc_flush_frames), (gst_x264_enc_sink_event), - (gst_x264_enc_chain), (gst_x264_enc_encode_frame), - (gst_x264_enc_change_state), (gst_x264_enc_set_property): - * ext/x264/gstx264enc.h: - Use GQueue in stead of custom queue code. - Factorize flushing out encoder delayed frames. - Factorize initialization and state change reset. - -2008-08-08 10:56:02 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - Use configure-generated _stdint.h. - Original commit message from CVS: - * ext/x264/gstx264enc.h: - * sys/fbdev/gstfbdevsink.c: - Use configure-generated _stdint.h. - -2008-08-08 10:13:36 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - ext/x264/: Use video format library and GST_WRITE_*_BE macros where applicable. - Original commit message from CVS: - * ext/x264/Makefile.am: - * ext/x264/gstx264enc.c: (gst_x264_enc_header_buf), - (gst_x264_enc_sink_set_caps), (gst_x264_enc_base_init), - (gst_x264_enc_class_init), (gst_x264_enc_log_callback), - (gst_x264_enc_init), (gst_x264_enc_init_encoder), - (gst_x264_enc_finalize), (gst_x264_enc_chain), - (gst_x264_enc_encode_frame), (plugin_init): - * ext/x264/gstx264enc.h: - Use video format library and GST_WRITE_*_BE macros where applicable. - Use finalize in stead of dispose. - Set up debug category and log callback. - -2008-08-07 16:20:30 +0000 Frederic Crozat <fcrozat@mandriva.org> - - Make sure gettext returns translations in UTF-8 encoding rather than in the current locale encoding (#546822). - Original commit message from CVS: - Patch by: Frederic Crozat <fcrozat@mandriva.org> - * ext/sndfile/gstsf.c: (plugin_init): - * sys/dvb/gstdvbsrc.c: (gst_dvbsrc_plugin_init): - * sys/oss4/oss4-audio.c: (plugin_init): - Make sure gettext returns translations in UTF-8 encoding rather - than in the current locale encoding (#546822). - -2008-08-07 14:34:03 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/twolame/gsttwolame.*: Allow raw float samples as input for encoding. - Original commit message from CVS: - * ext/twolame/gsttwolame.c: (gst_two_lame_sink_setcaps), - (gst_two_lame_chain): - * ext/twolame/gsttwolame.h: - Allow raw float samples as input for encoding. - -2008-08-07 13:15:21 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/jack/gstjackaudiosrc.c: Try committing this once again. Now properly renamed. - Original commit message from CVS: - * ext/jack/gstjackaudiosrc.c: - Try committing this once again. Now properly renamed. - -2008-08-07 09:09:44 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/: docs/plugins/inspect/plugin-jack.xml - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-jack.xml - Add new element to docs. - * ext/jack/gstjack.h - Add missing file. - * ext/jack/gstjackaudiosrc.c: - * ext/jack/gstjackaudiosrc.h: - Rename jackaudiosrc to jack_audio_src. - -2008-08-07 08:47:40 +0000 Tristan Matthews <tristan@sat.qc.ca> - - ext/jack/: Add a jackaudiosrc. Refactor sink slightly for better code reuse. - Original commit message from CVS: - patch by: Tristan Matthews <tristan@sat.qc.ca> - * ext/jack/Makefile.am: - * ext/jack/gstjack.c: - * ext/jack/gstjackaudioclient.c: - * ext/jack/gstjackaudiosink.c: - * ext/jack/gstjackaudiosink.h: - * ext/jack/gstjackaudiosrc.c: - * ext/jack/gstjackaudiosrc.h: - * ext/jack/gstjackringbuffer.h: - Add a jackaudiosrc. Refactor sink slightly for better code reuse. - Fixes #545197. - -2008-08-06 15:49:43 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - docs/plugins/: Add twolame and celt plugins to the docs. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-celt.xml: - * docs/plugins/inspect/plugin-twolame.xml: - Add twolame and celt plugins to the docs. - -2008-08-05 09:42:53 +0000 Olivier Crete <tester@tester.ca> - - gst/rtpmanager/gstrtpjitterbuffer.c: Make the buffer metadata writable before inserting it in the jitterbuffer becaus... - Original commit message from CVS: - Based on patch by: Olivier Crete <tester at tester dot ca> - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): - Make the buffer metadata writable before inserting it in the - jitterbuffer because the jitterbuffer will modify the timestamps. - * gst/rtpmanager/rtpjitterbuffer.c: - Update method comment about requiring writable metadata on buffers. - * gst/rtpmanager/rtpsession.c: (rtp_session_process_sr), - (rtp_session_process_rtcp): - Make the RTCP buffer metadata writable because we want to modify the - metadata. - Fixes #546312. - -2008-08-05 09:05:35 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/selector/gstinputselector.c: Move the select-all logic into the activation of the currently selected pad. We want... - Original commit message from CVS: - * gst/selector/gstinputselector.c: (gst_selector_pad_bufferalloc), - (gst_selector_pad_chain), (gst_input_selector_getcaps), - (gst_input_selector_activate_sinkpad): - Move the select-all logic into the activation of the currently selected - pad. We want to remember the last pad with activity in select-all mode. - Fix the getcaps function, we can produce the union of the upstream caps - in select-all mode, not the intersection like proxy_getcaps() does. - -2008-08-05 09:00:50 +0000 Håvard Graff <havard.graff@tandberg.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Fix debug by logging the right seqnum. - Original commit message from CVS: - Patch by: Håvard Graff <havard dot graff at tandberg dot com> - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_chain): - Fix debug by logging the right seqnum. - -2008-08-05 08:58:27 +0000 Olivier Crete <tester@tester.ca> - - gst/rtpmanager/gstrtpbin.c: Release lock before emitting the request-pt-map signal. - Original commit message from CVS: - Patch by: Olivier Crete <tester at tester dot ca> - * gst/rtpmanager/gstrtpbin.c: (get_pt_map): - Release lock before emitting the request-pt-map signal. - Fixes #543480. - -2008-08-02 18:48:17 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/: Use oil_memcpy() instead of memcpy() as it's faster for the sizes that are usually used here. - Original commit message from CVS: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace_simple_method_interpolate_scanline), - (gst_deinterlace_simple_method_copy_scanline), - (gst_deinterlace_simple_method_deinterlace_frame): - * gst/deinterlace2/tvtime/greedy.c: (deinterlace_frame_di_greedy): - * gst/deinterlace2/tvtime/greedyh.c: - (deinterlace_frame_di_greedyh): - * gst/deinterlace2/tvtime/scalerbob.c: - (deinterlace_scanline_scaler_bob): - * gst/deinterlace2/tvtime/tomsmocomp.c: (Fieldcopy): - * gst/deinterlace2/tvtime/weave.c: (deinterlace_scanline_weave), - (copy_scanline): - * gst/deinterlace2/tvtime/weavebff.c: (deinterlace_scanline_weave), - (copy_scanline): - * gst/deinterlace2/tvtime/weavetff.c: (deinterlace_scanline_weave), - (copy_scanline): - Use oil_memcpy() instead of memcpy() as it's faster for the sizes that - are usually used here. - -2008-08-02 18:36:11 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/: Add the remaining tvtime deinterlacing methods and fix the deinterlace_frame() implementation of G... - Original commit message from CVS: - * gst/deinterlace2/Makefile.am: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace_simple_method_deinterlace_frame), - (gst_deinterlace2_methods_get_type), (gst_deinterlace2_set_method): - * gst/deinterlace2/gstdeinterlace2.h: - * gst/deinterlace2/tvtime/linear.c: - (deinterlace_scanline_linear_c), (deinterlace_scanline_linear_mmx), - (deinterlace_scanline_linear_mmxext), - (gst_deinterlace_method_linear_class_init), - (gst_deinterlace_method_linear_init): - * gst/deinterlace2/tvtime/linearblend.c: - (deinterlace_scanline_linear_blend_c), - (deinterlace_scanline_linear_blend2_c), - (deinterlace_scanline_linear_blend_mmx), - (deinterlace_scanline_linear_blend2_mmx), - (gst_deinterlace_method_linear_blend_class_init), - (gst_deinterlace_method_linear_blend_init): - * gst/deinterlace2/tvtime/plugins.h: - * gst/deinterlace2/tvtime/scalerbob.c: - (deinterlace_scanline_scaler_bob), - (gst_deinterlace_method_scaler_bob_class_init), - (gst_deinterlace_method_scaler_bob_init): - * gst/deinterlace2/tvtime/weave.c: (deinterlace_scanline_weave), - (copy_scanline), (gst_deinterlace_method_weave_class_init), - (gst_deinterlace_method_weave_init): - * gst/deinterlace2/tvtime/weavebff.c: (deinterlace_scanline_weave), - (copy_scanline), (gst_deinterlace_method_weave_bff_class_init), - (gst_deinterlace_method_weave_bff_init): - * gst/deinterlace2/tvtime/weavetff.c: (deinterlace_scanline_weave), - (copy_scanline), (gst_deinterlace_method_weave_tff_class_init), - (gst_deinterlace_method_weave_tff_init): - Add the remaining tvtime deinterlacing methods and fix the - deinterlace_frame() implementation of GstDeinterlaceSimpleMethod. - -2008-08-02 18:30:56 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/vfir.c: Implement the VFIR deinterlacing method as simple method. - Original commit message from CVS: - * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line_c), - (deinterlace_line_mmx), (gst_deinterlace_method_vfir_class_init): - Implement the VFIR deinterlacing method as simple method. - -2008-08-02 18:18:54 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/gstdeinterlace2.*: Add a GstDeinterlaceSimpleMethod subclass of GstDeinterlaceMethod that can be use... - Original commit message from CVS: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace_simple_method_interpolate_scanline), - (gst_deinterlace_simple_method_copy_scanline), - (gst_deinterlace_simple_method_deinterlace_frame), - (gst_deinterlace_simple_method_class_init), - (gst_deinterlace_simple_method_init): - * gst/deinterlace2/gstdeinterlace2.h: - Add a GstDeinterlaceSimpleMethod subclass of GstDeinterlaceMethod that - can be used by simple deinterlacing methods. They only have to provide - a function for interpolating a scanline or copying a scanline. - -2008-08-02 18:15:49 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/gstdeinterlace2.c: Respect the latency of the deinterlacing algorithm for the timestamps of every bu... - Original commit message from CVS: - * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_chain): - Respect the latency of the deinterlacing algorithm for the timestamps - of every buffer. - -2008-08-02 18:13:20 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/: Add the MMX registers to the clobbered registers only if __MMX__ is defined. - Original commit message from CVS: - * gst/deinterlace2/tvtime/greedyh.asm: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: - Add the MMX registers to the clobbered registers only if __MMX__ is - defined. - -2008-08-02 18:09:56 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/: Enable tomsmocomp again as the C port will be ready for the next release. - Original commit message from CVS: - * gst/deinterlace2/Makefile.am: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace2_methods_get_type), (gst_deinterlace2_set_method), - (gst_deinterlace2_class_init): - Enable tomsmocomp again as the C port will be ready for the next - release. - -2008-08-02 18:02:44 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/gstdeinterlace2.c: Don't use proxy_getcaps() but implement our own getcaps() function that doubles/h... - Original commit message from CVS: - * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_init), - (gst_greatest_common_divisor), (gst_fraction_double), - (gst_deinterlace2_getcaps), (gst_deinterlace2_setcaps): - Don't use proxy_getcaps() but implement our own getcaps() function - that doubles/halfs the framerate if all fields should be sent out. - -2008-08-02 17:39:13 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add TwoLAME MP2 encoding element, based on the LAME element. - Original commit message from CVS: - * configure.ac: - * ext/Makefile.am: - * ext/twolame/Makefile.am: - * ext/twolame/gsttwolame.c: (gst_two_lame_mode_get_type), - (gst_two_lame_padding_get_type), (gst_two_lame_emphasis_get_type), - (gst_two_lame_release_memory), (gst_two_lame_finalize), - (gst_two_lame_base_init), (gst_two_lame_class_init), - (gst_two_lame_src_setcaps), (gst_two_lame_sink_setcaps), - (gst_two_lame_init), (gst_two_lame_set_property), - (gst_two_lame_get_property), (gst_two_lame_sink_event), - (gst_two_lame_chain), (gst_two_lame_setup), - (gst_two_lame_change_state), (gst_two_lame_get_default_settings), - (plugin_init): - * ext/twolame/gsttwolame.h: - Add TwoLAME MP2 encoding element, based on the LAME element. - -2008-08-02 17:29:44 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add CELT encoder and decoder elements based on the Speex elements. - Original commit message from CVS: - * configure.ac: - * ext/Makefile.am: - * ext/celt/Makefile.am: - * ext/celt/gstcelt.c: (plugin_init): - * ext/celt/gstceltdec.c: (gst_celt_dec_base_init), - (gst_celt_dec_class_init), (gst_celt_dec_reset), - (gst_celt_dec_init), (celt_dec_convert), - (celt_get_sink_query_types), (celt_dec_sink_query), - (celt_get_src_query_types), (celt_dec_src_query), - (celt_dec_src_event), (celt_dec_sink_event), - (celt_dec_chain_parse_header), (celt_dec_chain_parse_comments), - (celt_dec_chain_parse_data), (celt_dec_chain), - (celt_dec_change_state): - * ext/celt/gstceltdec.h: - * ext/celt/gstceltenc.c: (gst_celt_enc_setup_interfaces), - (gst_celt_enc_base_init), (gst_celt_enc_class_init), - (gst_celt_enc_finalize), (gst_celt_enc_sink_setcaps), - (gst_celt_enc_sink_getcaps), (gst_celt_enc_convert_src), - (gst_celt_enc_convert_sink), (gst_celt_enc_get_latency), - (gst_celt_enc_get_query_types), (gst_celt_enc_src_query), - (gst_celt_enc_sink_query), (gst_celt_enc_init), - (gst_celt_enc_create_metadata_buffer), (gst_celt_enc_setup), - (gst_celt_enc_buffer_from_data), (gst_celt_enc_push_buffer), - (gst_celt_enc_set_header_on_caps), (gst_celt_enc_sinkevent), - (gst_celt_enc_chain), (gst_celt_enc_get_property), - (gst_celt_enc_set_property), (gst_celt_enc_change_state): - * ext/celt/gstceltenc.h: - Add CELT encoder and decoder elements based on the Speex elements. - -2008-08-02 17:16:39 +0000 Tal Shalif <tshalif@nargila.org> - - ext/sdl/sdlvideosink.c: Use g_setenv() and g_unsetenv() instead of setenv() to fix compilation with mingw. Fixes bug ... - Original commit message from CVS: - Patch by: Tal Shalif <tshalif at nargila dot org> - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_initsdl): - Use g_setenv() and g_unsetenv() instead of setenv() to fix compilation - with mingw. Fixes bug #545247. - -2008-08-01 23:30:29 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Back to development -> 0.10.8.1 - Original commit message from CVS: - * configure.ac: - Back to development -> 0.10.8.1 - -2008-08-01 15:39:44 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - remove moved plugins from spec file - Original commit message from CVS: - remove moved plugins from spec file + * sys/msdk/gstmsdkdec.c: + msdkdec: Check width and height of mfxVideoParam before allocation + DecodeHeader must be called to fill the mfxVideoParam before allocation, + and thus the check for width and height in mfxVideoParam is necessary. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1817> -=== release 0.10.8 === +2022-03-18 16:34:38 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> -2008-07-31 22:15:17 +0000 Jan Schmidt <thaytan@mad.scientist.com> + * docs/plugins/gst_plugins_cache.json: + doc: Update cache after NV12_8L128 addition + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1379> - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-app.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-flvdemux.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegtsparse.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mythtv.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-oss4.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-speexresample.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - * gst-plugins-bad.doap: - * win32/common/config.h: - Release 0.10.8 - Original commit message from CVS: - Release 0.10.8 - -2008-07-31 22:03:26 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - * common: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/it.po: - * po/ky.po: - * po/lt.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - Original commit message from CVS: - Update .po files - -2008-07-24 23:53:56 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: 0.10.7.3 pre-release - Original commit message from CVS: - * configure.ac: - 0.10.7.3 pre-release - * po/LINGUAS: - * po/id.po: - Add Indonesian translation. - -2008-07-24 00:32:37 +0000 Michael Smith <msmith@xiph.org> - - gst/festival/gstfestival.c: Guard unistd.h with HAVE_UNISTD_H - Original commit message from CVS: - * gst/festival/gstfestival.c: - Guard unistd.h with HAVE_UNISTD_H - * gst/modplug/libmodplug/load_it.cpp: - * gst/modplug/libmodplug/sndfile.cpp: - * gst/modplug/libmodplug/sndfile.h: - * gst/modplug/libmodplug/stdafx.h: - Support for compiling with MSVC: use _MSC_VER for detecting MSVC instead - of MSC_VER. Make CanPackSamples take the type it's passed. Change scope - of a variable in load_it.cpp to MSVC's scoping rules. - * gst/sdp/gstsdpdemux.c: - Guard unistd.h with HAVE_UNISTD_H - Fixes #544457. - -2008-07-22 06:27:44 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/timidity/gsttimidity.c: Fix compiler warning. Fixes #544050. - Original commit message from CVS: - * ext/timidity/gsttimidity.c: - Fix compiler warning. Fixes #544050. - -2008-07-21 21:12:25 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Don't check for nav_print.h any more - it should be included in the libdvdnav development package if li... - Original commit message from CVS: - * configure.ac: - Don't check for nav_print.h any more - it should be included in - the libdvdnav development package if libdvdnav headers depend on it. - Fixes: #543846 - -2008-07-21 16:03:11 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Link the ladspa plugin with -ldl. It's needed for dlopen() and friends for loading the ladspa plugins and previously ... - Original commit message from CVS: - * configure.ac: - * ext/ladspa/Makefile.am: - Link the ladspa plugin with -ldl. It's needed for dlopen() and friends - for loading the ladspa plugins and previously was linked in by - gmodule. Fixes bug #543848. - -2008-07-21 10:16:51 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/modplug/libmodplug/Makefile.am: Use GST_CXXFLAGS instead of GST_CFLAGS for CXXFLAGS. GST_CFLAGS can contain compi... - Original commit message from CVS: - * gst/modplug/libmodplug/Makefile.am: - Use GST_CXXFLAGS instead of GST_CFLAGS for CXXFLAGS. GST_CFLAGS - can contain compiler parameters that are invalid for C++. - Fixes bug #543860. - -2008-07-21 10:15:18 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/resindvd/Makefile.am: Dist missing header files. Fixes bug #543861. - Original commit message from CVS: - * ext/resindvd/Makefile.am: - Dist missing header files. Fixes bug #543861. - -2008-07-19 14:12:59 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: 0.10.7.2 pre-release - Original commit message from CVS: - * configure.ac: - 0.10.7.2 pre-release - -2008-07-19 14:02:50 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/Makefile.am: Dist and recurse into resindvd subdir - Original commit message from CVS: - * ext/Makefile.am: - Dist and recurse into resindvd subdir - -2008-07-19 13:43:04 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Remove interleave and replaygain configure.ac pieces too - Original commit message from CVS: - * configure.ac: - Remove interleave and replaygain configure.ac pieces too - -2008-07-19 13:29:22 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - po/: Add new lithunian translation, and add french to the LINGUAS file. - Original commit message from CVS: - * po/LINGUAS: - * po/lt.po: - Add new lithunian translation, and add french to the LINGUAS - file. - -2008-07-19 00:58:49 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Remove interleave and replaygain plugins that have moved to -good - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-interleave.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * gst/interleave/Makefile.am: - * gst/interleave/deinterleave.c: - * gst/interleave/deinterleave.h: - * gst/interleave/interleave.c: - * gst/interleave/interleave.h: - * gst/interleave/plugin.c: - * gst/interleave/plugin.h: - * gst/replaygain/Makefile.am: - * gst/replaygain/gstrganalysis.c: - * gst/replaygain/gstrganalysis.h: - * gst/replaygain/gstrglimiter.c: - * gst/replaygain/gstrglimiter.h: - * gst/replaygain/gstrgvolume.c: - * gst/replaygain/gstrgvolume.h: - * gst/replaygain/replaygain.c: - * gst/replaygain/replaygain.h: - * gst/replaygain/rganalysis.c: - * gst/replaygain/rganalysis.h: - * tests/check/Makefile.am: - * tests/check/elements/deinterleave.c: - * tests/check/elements/interleave.c: - * tests/check/elements/rganalysis.c: - * tests/check/elements/rglimiter.c: - * tests/check/elements/rgvolume.c: - Remove interleave and replaygain plugins that have moved to -good - -2008-07-18 08:34:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Disable the tomsmocomp algorithm for this release as it's buggy and has no C implementation yet. - Original commit message from CVS: - * configure.ac: - * gst/deinterlace2/Makefile.am: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace2_methods_get_type), (gst_deinterlace2_set_method), - (gst_deinterlace2_class_init), (gst_deinterlace2_init): - * gst/deinterlace2/gstdeinterlace2.h: - * gst/deinterlace2/tvtime/greedy.c: - (gst_deinterlace_method_greedy_l_class_init): - * gst/deinterlace2/tvtime/greedyh.c: - (gst_deinterlace_method_greedy_h_class_init): - * gst/deinterlace2/tvtime/vfir.c: - (gst_deinterlace_method_vfir_class_init): - Disable the tomsmocomp algorithm for this release as it's buggy - and has no C implementation yet. - Build the deinterlace2 plugin on all architectures but still mark it - as experimental. - Build the x86 inline assembly only if GCC inline assembly is supported - and only on x86 or amd64. Fixes bug #543286. - -2008-07-16 14:15:39 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/real/gstrealvideodec.c: Add some casts to fix the build on Forte - Original commit message from CVS: - * gst/real/gstrealvideodec.c: (open_library): - Add some casts to fix the build on Forte - -2008-07-14 14:13:54 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/deinterlace2/tvtime/: Fix build on x86_64 - Original commit message from CVS: - * gst/deinterlace2/tvtime/greedy.c: - (gst_deinterlace_method_greedy_l_class_init): - * gst/deinterlace2/tvtime/greedyh.c: - (gst_deinterlace_method_greedy_h_class_init): - * gst/deinterlace2/tvtime/vfir.c: - (gst_deinterlace_method_vfir_class_init): - Fix build on x86_64 - -2008-07-14 07:50:01 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/resindvd/gstmpegdemux.c: Remove whitespace line. - Original commit message from CVS: - * ext/resindvd/gstmpegdemux.c: - Remove whitespace line. - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdbin.h: - Make it so that audio/video pads aren't added to the bin - until after data flow starts. - * ext/resindvd/resin-play: - Move video buffer queue outside resindvdbin - * ext/resindvd/resindvdsrc.c: - Check that the nav_clock_id didn't already get unscheduled. - * gst/dvdspu/gstdvdspu.c: - Remove assert that sometimes triggers erroneously. - -2008-07-13 10:56:45 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/greedyh.asm: Always use the C implementation if width is not a multiple of 4. The assembly op... - Original commit message from CVS: - * gst/deinterlace2/tvtime/greedyh.asm: - Always use the C implementation if width is not a multiple of 4. The - assembly optimized version only handle this and calling the C - implementation for the remaining part doesn't work because it needs - previous calculations. - -2008-07-13 10:52:03 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/: Some cleanup, use 3DNOW instead of TDNOW in macros. - Original commit message from CVS: - * gst/deinterlace2/tvtime/greedyh.asm: - * gst/deinterlace2/tvtime/greedyh.c: - * gst/deinterlace2/tvtime/greedyhmacros.h: - Some cleanup, use 3DNOW instead of TDNOW in macros. - * gst/deinterlace2/tvtime/tomsmocomp.c: - (gst_deinterlace_method_tomsmocomp_class_init): - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: - * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: - The SSE method in fact only needs MMXEXT, declare it as such. - -2008-07-11 14:06:08 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - docs/plugins/.cvsignore: Ignore *-undeclared.txt - Original commit message from CVS: - * docs/plugins/.cvsignore: - Ignore *-undeclared.txt - * ext/resindvd/rsnaudiomunge.c: - Turn g_print's into debug statements. - * ext/resindvd/resin-play: - * ext/resindvd/Makefile.am: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdbin.h: - * ext/resindvd/rsnparsetter.c: - * ext/resindvd/rsnparsetter.h: - * ext/resindvd/rsnwrappedbuffer.c: - * ext/resindvd/rsnwrappedbuffer.h: - Add a bloated implementation of a really simple idea: Replace the - pixel-aspect-ratio in the output video with a prescribed one when - necessary. There must be an easier way. - Split the dvdspu out of the resindvdbin and put out the subpicture - stream on the subpicture pad. - * ext/resindvd/gstmpegdemux.c: - Send video-aspect events down the pipe from the demuxer. - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - Handle timed-stills somewhat using g_cond_timed_wait, with a FIXME - to make it use clock-waiting later. - * ext/resindvd/rsnbasesrc.c: - Don't overwrite the last_stop in the basesrc segment after a seamless - seek. - -2008-07-11 13:54:52 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - * docs/plugins/.gitignore: - Commit file that moap seems to have missed: Ignore *-undeclared.txt - Original commit message from CVS: - Commit file that moap seems to have missed: Ignore *-undeclared.txt - -2008-07-10 21:06:03 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Cleanup Plugin docs. Link to signals and properties. Fix sub-section titles. Drop mentining that all our example pipe... - Original commit message from CVS: - * docs/plugins/gst-plugins-base-plugins-docs.sgml: - * docs/plugins/gst-plugins-base-plugins-overrides.txt: - * docs/plugins/gst-plugins-base-plugins-sections.txt: - * docs/plugins/gst-plugins-base-plugins.args: - * docs/plugins/gst-plugins-base-plugins.hierarchy: - * docs/plugins/gst-plugins-base-plugins.interfaces: - * docs/plugins/gst-plugins-base-plugins.prerequisites: - * docs/plugins/gst-plugins-base-plugins.signals: - * docs/plugins/inspect/plugin-adder.xml: - * docs/plugins/inspect/plugin-alsa.xml: - * docs/plugins/inspect/plugin-audioconvert.xml: - * docs/plugins/inspect/plugin-audiorate.xml: - * docs/plugins/inspect/plugin-audioresample.xml: - * docs/plugins/inspect/plugin-audiotestsrc.xml: - * docs/plugins/inspect/plugin-cdparanoia.xml: - * docs/plugins/inspect/plugin-decodebin.xml: - * docs/plugins/inspect/plugin-ffmpegcolorspace.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-gnomevfs.xml: - * docs/plugins/inspect/plugin-libvisual.xml: - * docs/plugins/inspect/plugin-ogg.xml: - * docs/plugins/inspect/plugin-pango.xml: - * docs/plugins/inspect/plugin-playback.xml: - * docs/plugins/inspect/plugin-queue2.xml: - * docs/plugins/inspect/plugin-subparse.xml: - * docs/plugins/inspect/plugin-tcp.xml: - * docs/plugins/inspect/plugin-theora.xml: - * docs/plugins/inspect/plugin-typefindfunctions.xml: - * docs/plugins/inspect/plugin-uridecodebin.xml: - * docs/plugins/inspect/plugin-video4linux.xml: - * docs/plugins/inspect/plugin-videorate.xml: - * docs/plugins/inspect/plugin-videoscale.xml: - * docs/plugins/inspect/plugin-videotestsrc.xml: - * docs/plugins/inspect/plugin-volume.xml: - * docs/plugins/inspect/plugin-vorbis.xml: - * docs/plugins/inspect/plugin-ximagesink.xml: - * docs/plugins/inspect/plugin-xvimagesink.xml: - * ext/alsa/gstalsamixer.c: - * ext/alsa/gstalsasink.c: - * ext/alsa/gstalsasrc.c: - * ext/gio/gstgiosink.c: - * ext/gio/gstgiosrc.c: - * ext/gio/gstgiostreamsink.c: - * ext/gio/gstgiostreamsrc.c: - * ext/gnomevfs/gstgnomevfssink.c: - * ext/gnomevfs/gstgnomevfssrc.c: - * ext/ogg/gstoggdemux.c: - * ext/ogg/gstoggmux.c: - * ext/pango/gstclockoverlay.c: - * ext/pango/gsttextoverlay.c: - * ext/pango/gsttextrender.c: - * ext/pango/gsttimeoverlay.c: - * ext/theora/theoradec.c: - * ext/theora/theoraenc.c: - * ext/theora/theoraparse.c: - * ext/vorbis/vorbisdec.c: - * ext/vorbis/vorbisenc.c: - * ext/vorbis/vorbisparse.c: - * ext/vorbis/vorbistag.c: - * gst/adder/gstadder.c: - * gst/audioconvert/gstaudioconvert.c: - * gst/audioresample/gstaudioresample.c: - * gst/audiotestsrc/gstaudiotestsrc.c: - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - * gst/playback/gstdecodebin2.c: - * gst/playback/gstplaybin.c: - * gst/playback/gstplaybin2.c: - * gst/playback/gstqueue2.c: - * gst/playback/gsturidecodebin.c: - * gst/tcp/gstmultifdsink.c: - * gst/tcp/gsttcpserversink.c: - * gst/videorate/gstvideorate.c: - * gst/videoscale/gstvideoscale.c: - * gst/videotestsrc/gstvideotestsrc.c: - * gst/volume/gstvolume.c: - * sys/ximage/ximagesink.c: - * sys/xvimage/xvimagesink.c: - Cleanup Plugin docs. Link to signals and properties. Fix sub-section - titles. Drop mentining that all our example pipelines are "simple" - pipelines. - -2008-07-10 20:23:09 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtspacketizer.c: Convert extended event text to UTF-8. - Original commit message from CVS: - * gst/mpegtsparse/mpegtspacketizer.c: - Convert extended event text to UTF-8. - -2008-07-10 18:51:11 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Document one more. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-stereo.xml: - * gst/stereo/gststereo.c: - Document one more. - -2008-07-10 09:20:23 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/gstmpegdesc.h: Fix extended event descriptor parsing, out by 1 in position of text length. - Original commit message from CVS: - * gst/mpegtsparse/gstmpegdesc.h: - Fix extended event descriptor parsing, out by 1 in position of - text length. - -2008-07-09 12:13:09 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/festival/gstfestival.c: Add a note to the docs, that festival need to be running. Also log an error it it is not.... - Original commit message from CVS: - * gst/festival/gstfestival.c: - Add a note to the docs, that festival need to be running. Also log an - error it it is not. Fixes #541327 - -2008-07-08 21:20:27 +0000 Ilja Pavkovic <illsen@gumblfarz.de> - - gst/librfb/gstrfbsrc.*: Add view-only property to ignore the navigation events - Original commit message from CVS: - patch by: Ilja Pavkovic <illsen@gumblfarz.de> - * gst/librfb/gstrfbsrc.c: - * gst/librfb/gstrfbsrc.h: - Add view-only property to ignore the navigation events - -2008-07-08 18:53:41 +0000 Michael Smith <msmith@xiph.org> - - sys/dshowdecwrapper/gstdshowaudiodec.c: Revert previous patch apart from typo fixes; the patch was not independently ... - Original commit message from CVS: - * sys/dshowdecwrapper/gstdshowaudiodec.c: - Revert previous patch apart from typo fixes; the patch was not - independently useful. - -2008-07-08 17:41:55 +0000 Alessandro Decina <alessandro@nnva.org> - - sys/dshowdecwrapper/: Add AAC, AC3 to handled codecs. - Original commit message from CVS: - Based on patch by: Alessandro Decina <alessandro@nnva.org> - * sys/dshowdecwrapper/gstdshowaudiodec.c: - * sys/dshowdecwrapper/gstdshowdecwrapper.h: - * sys/dshowdecwrapper/gstdshowvideodec.c: - Add AAC, AC3 to handled codecs. - Fix handling of flush events. - Improve debug/error output. - Fix a number of typos in comments and variable names. - -2008-07-08 15:24:44 +0000 Ilja Pavkovic <illsen@gumblfarz.de> - - gst/librfb/rfbdecoder.c: Implement ServerCutText message - Original commit message from CVS: - patch by: Ilja Pavkovic <illsen@gumblfarz.de> - * gst/librfb/rfbdecoder.c: - Implement ServerCutText message - -2008-07-08 14:28:08 +0000 Ilja Pavkovic <illsen@gumblfarz.de> - - gst/librfb/: Add property for shared desktop - Original commit message from CVS: - patch by: Ilja Pavkovic <illsen@gumblfarz.de> - * gst/librfb/gstrfbsrc.c: - * gst/librfb/rfbdecoder.c: - Add property for shared desktop - -2008-07-08 14:01:19 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Don't include ERROR_CFLAGS in GST_CXXFLAGS as it might include flags that are invalid for C++. - Original commit message from CVS: - * configure.ac: - Don't include ERROR_CFLAGS in GST_CXXFLAGS as it might include - flags that are invalid for C++. - -2008-07-08 13:31:37 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Don't use declarations after statements in the remaining code. - Original commit message from CVS: - * ext/spc/gstspc.c: (spc_setup): - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: - Don't use declarations after statements in the remaining code. - -2008-07-08 13:28:51 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/: Don't use declarations after statements. - Original commit message from CVS: - Patch by: - Jonathan Rosser <jonathan dot rosser at rd dot bbc dot co dot uk> - * ext/metadata/metadataexif.c: (metadataparse_handle_unit_tags): - * ext/metadata/metadataxmp.c: - (metadataparse_xmp_iter_add_to_tag_list): - * ext/mythtv/gstmythtvsrc.c: (gst_mythtv_src_start): - * ext/timidity/gstwildmidi.c: (gst_wildmidi_loop): - Don't use declarations after statements. - -2008-07-07 13:22:26 +0000 Alessandro Decina <alessandro@nnva.org> - - gst/mpegtsparse/mpegtsparse.c: Fix memory leak by unreffing structures when not needed. - Original commit message from CVS: - patch by: Alessandro Decina - * gst/mpegtsparse/mpegtsparse.c: - Fix memory leak by unreffing structures when not needed. - Fixes #539292. - -2008-07-07 10:43:45 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/sdp/gstsdpdemux.c: Use floating point math for latencies < 0 sec in log output. - Original commit message from CVS: - * gst/sdp/gstsdpdemux.c: - Use floating point math for latencies < 0 sec in log output. - -2008-07-06 20:43:58 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: Mark internal processing functions as static inline for quite ... - Original commit message from CVS: - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: - Mark internal processing functions as static inline for quite some - speedup as they're used only once and need to get many local variables - passed as parameter. - -2008-07-05 19:20:30 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/gstdeinterlace2.*: Call the current instance "self" instead of "object". - Original commit message from CVS: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace_method_deinterlace_frame), - (gst_deinterlace2_set_method), (gst_deinterlace2_init), - (gst_deinterlace2_reset_history), (gst_deinterlace2_reset), - (gst_deinterlace2_set_property), (gst_deinterlace2_get_property), - (gst_deinterlace2_pop_history), (gst_deinterlace2_head_history), - (gst_deinterlace2_push_history), (gst_deinterlace2_chain), - (gst_deinterlace2_setcaps), (gst_deinterlace2_sink_event), - (gst_deinterlace2_change_state), (gst_deinterlace2_src_event), - (gst_deinterlace2_src_query): - * gst/deinterlace2/gstdeinterlace2.h: - Call the current instance "self" instead of "object". - -2008-07-05 19:11:56 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/gstdeinterlace2.*: Include latency of the method in the returned latency. - Original commit message from CVS: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace_method_get_latency), - (gst_deinterlace2_set_method), (gst_deinterlace2_class_init), - (gst_deinterlace2_push_history), (gst_deinterlace2_chain), - (gst_deinterlace2_setcaps), (gst_deinterlace2_src_query): - * gst/deinterlace2/gstdeinterlace2.h: - Include latency of the method in the returned latency. - Fix outputting of all fields, i.e. doubling of the framerate. - -2008-07-05 16:47:32 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/: Use a GstObject subtype for the deinterlacing methods and export the different settings for each d... - Original commit message from CVS: - * gst/deinterlace2/Makefile.am: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace_method_class_init), (gst_deinterlace_method_init), - (gst_deinterlace_method_deinterlace_frame), - (gst_deinterlace_method_get_fields_required), - (gst_deinterlace2_methods_get_type), (_do_init), - (gst_deinterlace2_set_method), (gst_deinterlace2_class_init), - (gst_deinterlace2_child_proxy_get_child_by_index), - (gst_deinterlace2_child_proxy_get_children_count), - (gst_deinterlace2_child_proxy_interface_init), - (gst_deinterlace2_init), (gst_deinterlace2_finalize), - (gst_deinterlace2_chain), (gst_deinterlace2_src_query): - * gst/deinterlace2/gstdeinterlace2.h: - * gst/deinterlace2/tvtime/greedy.c: - (deinterlace_greedy_packed422_scanline_c), - (deinterlace_greedy_packed422_scanline_mmx), - (deinterlace_greedy_packed422_scanline_mmxext), - (deinterlace_frame_di_greedy), - (gst_deinterlace_method_greedy_l_set_property), - (gst_deinterlace_method_greedy_l_get_property), - (gst_deinterlace_method_greedy_l_class_init), - (gst_deinterlace_method_greedy_l_init): - * gst/deinterlace2/tvtime/greedyh.asm: - * gst/deinterlace2/tvtime/greedyh.c: (greedyDScaler_C), - (deinterlace_frame_di_greedyh), - (gst_deinterlace_method_greedy_h_set_property), - (gst_deinterlace_method_greedy_h_get_property), - (gst_deinterlace_method_greedy_h_class_init), - (gst_deinterlace_method_greedy_h_init): - * gst/deinterlace2/tvtime/greedyh.h: - * gst/deinterlace2/tvtime/plugins.h: - * gst/deinterlace2/tvtime/tomsmocomp.c: - (gst_deinterlace_method_tomsmocomp_set_property), - (gst_deinterlace_method_tomsmocomp_get_property), - (gst_deinterlace_method_tomsmocomp_class_init), - (gst_deinterlace_method_tomsmocomp_init): - * gst/deinterlace2/tvtime/tomsmocomp.h: - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: - * gst/deinterlace2/tvtime/vfir.c: (deinterlace_frame_vfir), - (gst_deinterlace_method_vfir_class_init), - (gst_deinterlace_method_vfir_init): - Use a GstObject subtype for the deinterlacing methods and export - the different settings for each deinterlacing method via GObject - properties. - Implement GstChildProxy interface to allow access to the used - deinterlacing method and to allow adjusting the different settings. - Move global variables of the tomsmocomp deinterlacing method into - function local variables to make it possible to use this deinterlacing - method from different instances. - -2008-07-05 12:22:37 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/greedyh.asm: Support widths that are not a multiply of 4 when using the assembly optimized gr... - Original commit message from CVS: - * gst/deinterlace2/tvtime/greedyh.asm: - Support widths that are not a multiply of 4 when using the assembly - optimized greedyh implementations. - -2008-07-04 18:54:15 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/greedyh.c: Only build the assembly optimized implementations on x86. - Original commit message from CVS: - * gst/deinterlace2/tvtime/greedyh.c: - (deinterlace_frame_di_greedyh): - Only build the assembly optimized implementations on x86. - -2008-07-04 18:52:37 +0000 Damien Lespiau <damien.lespiau@gmail.com> - - configure.ac: Fix checking of headers for the OSS4 plugin to fail if a single header doesn't exist already. AC_CHECK_... - Original commit message from CVS: - Patch by: Damien Lespiau <damien dot lespiau at gmail dot com> - * configure.ac: - Fix checking of headers for the OSS4 plugin to fail if a single - header doesn't exist already. AC_CHECK_HEADERS only fails if none - of the headers is found. Fixes bug #541543. - -2008-07-04 16:06:09 +0000 Damien Lespiau <damien.lespiau@gmail.com> - - Fix built of the festival plugin with mingw32 by linking to ws2_32.dll and including winsock headers. Fixes bug #541522. - Original commit message from CVS: - Patch by: Damien Lespiau <damien dot lespiau at gmail dot com> - * configure.ac: - * gst/festival/Makefile.am: - * gst/festival/gstfestival.c: - Fix built of the festival plugin with mingw32 by linking to ws2_32.dll - and including winsock headers. Fixes bug #541522. - -2008-07-03 14:44:51 +0000 Peter Kjellerstedt <pkj@axis.com> - - gst/rtpmanager/: Corrected a typo (interpollate -> interpolate). - Original commit message from CVS: - * ChangeLog: - * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_loop): - * gst/rtpmanager/rtpsource.c: (rtp_source_get_new_sr): - Corrected a typo (interpollate -> interpolate). - -2008-07-03 14:31:10 +0000 Peter Kjellerstedt <pkj@axis.com> - - gst/rtpmanager/: Changed some GST_DEBUG() to GST_LOG() to reduce the spam when a pipeline is running normally. - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_process_rtp), - (gst_rtp_session_send_rtp), (gst_rtp_session_send_rtcp), - (gst_rtp_session_sync_rtcp), (gst_rtp_session_chain_recv_rtp), - (gst_rtp_session_chain_recv_rtcp), (gst_rtp_session_chain_send_rtp): - * gst/rtpmanager/rtpsession.c: (source_push_rtp), - (rtp_session_send_rtp): - * gst/rtpmanager/rtpsource.c: (push_packet), (calculate_jitter), - (rtp_source_process_rtp), (rtp_source_send_rtp): - Changed some GST_DEBUG() to GST_LOG() to reduce the spam when a - pipeline is running normally. - -2008-07-03 13:47:19 +0000 Peter Kjellerstedt <pkj@axis.com> - - gst/rtpmanager/: Do not mix the use of g_get_current_time() with gst_clock_get_time(). - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_init), - (gst_rtp_session_finalize), (rtcp_thread), - (gst_rtp_session_chain_recv_rtp), (gst_rtp_session_chain_recv_rtcp), - (gst_rtp_session_event_send_rtp_sink), - (gst_rtp_session_chain_send_rtp): - * gst/rtpmanager/rtpsession.c: (check_collision), - (update_arrival_stats), (rtp_session_process_rtp), - (rtp_session_process_rtcp), (rtp_session_send_rtp), - (rtp_session_send_bye_locked), (rtp_session_send_bye), - (rtp_session_next_timeout), (session_report_blocks), (session_cleanup), - (is_rtcp_time), (rtp_session_on_timeout): - * gst/rtpmanager/rtpsession.h: - Do not mix the use of g_get_current_time() with gst_clock_get_time(). - -2008-07-01 21:40:19 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/mpegvideoparse/mpegvideoparse.*: Queue new-segment events and send them after caps have been determined and set, ... - Original commit message from CVS: - * gst/mpegvideoparse/mpegvideoparse.c: - * gst/mpegvideoparse/mpegvideoparse.h: - Queue new-segment events and send them after caps have been - determined and set, so that the decoder will have been auto-plugged. - -2008-07-01 11:28:17 +0000 Michael Smith <msmith@xiph.org> - - sys/qtwrapper/: Make qtwrapper compile/work on win32. - Original commit message from CVS: - Patch by : Michael Smith <msmith @ xiph dot org> - * sys/qtwrapper/audiodecoders.c: (qtwrapper_audio_decoder_init), - (clear_AudioStreamBasicDescription), (fill_indesc_mp3), - (fill_indesc_aac), (make_samr_magic_cookie), (write_len), - (make_aac_magic_cookie), (open_decoder), (process_buffer_cb), - (qtwrapper_audio_decoder_chain), - (qtwrapper_audio_decoder_sink_event), - (qtwrapper_audio_decoder_base_init), - (qtwrapper_audio_decoder_class_init), - (qtwrapper_audio_decoders_register): - * sys/qtwrapper/codecmapping.h: - * sys/qtwrapper/imagedescription.c: (image_description_for_avc1), - (image_description_for_mp4v), (image_description_from_stsd_buffer): - * sys/qtwrapper/imagedescription.h: - * sys/qtwrapper/qtutils.c: (get_name_info_from_component), - (dump_avcc_atom), (dump_image_description), - (AllocateAudioBufferList): - * sys/qtwrapper/qtutils.h: - * sys/qtwrapper/qtwrapper.c: (plugin_init): - * sys/qtwrapper/qtwrapper.h: - * sys/qtwrapper/videodecoders.c: - (qtwrapper_video_decoder_base_init), (open_decoder), - (decompressCb), (qtwrapper_video_decoder_chain), - (qtwrapper_video_decoders_register): - Make qtwrapper compile/work on win32. - Lots of fixes - Fixes #531840 - -2008-06-30 19:19:26 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/rawparse/gstvideoparse.c: Fix size calculation for RGB buffers -> bpp is in bits, so divide by 8 - Original commit message from CVS: - * gst/rawparse/gstvideoparse.c: - Fix size calculation for RGB buffers -> bpp is in bits, so divide by 8 - -2008-06-30 07:51:07 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/: Remove useless file and mark everything possible as static. - Original commit message from CVS: - * gst/deinterlace2/Makefile.am: - * gst/deinterlace2/tvtime/tomsmocomp.c: (tomsmocomp_init), - (tomsmocomp_filter_mmx), (tomsmocomp_filter_3dnow), - (tomsmocomp_filter_sse), (deinterlace_frame_di_tomsmocomp): - * gst/deinterlace2/tvtime/tomsmocomp.h: - Remove useless file and mark everything possible as static. - * gst/deinterlace2/tvtime/greedy.c: - * gst/deinterlace2/tvtime/greedyh.c: - Use "_stdint.h" instead of <stdint.h>. - -2008-06-29 10:56:47 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/: Get rid of speedy.ch as we don't use most of it's code anyway and it doesn't seem to be relicens... - Original commit message from CVS: - * gst/deinterlace2/Makefile.am: - * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_init): - * gst/deinterlace2/tvtime/greedy.c: (deinterlace_frame_di_greedy): - * gst/deinterlace2/tvtime/greedyh.c: - (deinterlace_frame_di_greedyh): - * gst/deinterlace2/tvtime/speedtools.h: - * gst/deinterlace2/tvtime/speedy.c: - * gst/deinterlace2/tvtime/speedy.h: - * gst/deinterlace2/tvtime/tomsmocomp.c: (Fieldcopy): - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: - * gst/deinterlace2/tvtime/vfir.c: (deinterlace_frame_vfir): - Get rid of speedy.ch as we don't use most of it's code anyway - and it doesn't seem to be relicensed to LGPL. Use memcpy() instead - of the speedy memcpy everywhere instead. - * gst/deinterlace2/gstdeinterlace2.h: - Remove many unused declarations. - -2008-06-28 20:51:36 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - ext/mpeg2enc/gstmpeg2encoptions.*: Expose the additional MPEG HDTV format profiles available in latest mjpegtools ver... - Original commit message from CVS: - * ext/mpeg2enc/gstmpeg2encoptions.cc: - * ext/mpeg2enc/gstmpeg2encoptions.hh: - Expose the additional MPEG HDTV format profiles available in latest - mjpegtools version. - -2008-06-28 18:13:08 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/gstdeinterlace2.c: Divide latency be 2 to convert from fields to frames. - Original commit message from CVS: - * gst/deinterlace2/gstdeinterlace2.c: (gst_deinterlace2_src_query): - Divide latency be 2 to convert from fields to frames. - -2008-06-28 18:10:52 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/greedy.c: Don't use scanlines function from gstdeinterlace2 as it's not appropiate for this m... - Original commit message from CVS: - * gst/deinterlace2/tvtime/greedy.c: - (deinterlace_greedy_packed422_scanline_c), - (deinterlace_greedy_packed422_scanline_mmx), - (deinterlace_greedy_packed422_scanline_mmxext), - (deinterlace_frame_di_greedy): - Don't use scanlines function from gstdeinterlace2 as it's - not appropiate for this method. Instead implement deinterlace_frame - function by taking the one from greedyh. - * gst/deinterlace2/tvtime/greedyh.c: (greedyDScaler_C): - Small fix for the C implementation. - * gst/deinterlace2/tvtime/vfir.c: (deinterlace_frame_vfir): - Don't use the scanlines function from gstdeinterlace2 as it's only - used for this method and will be removed. Instead implement - deinterlace_frame function and make it a bit more efficient. - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace2_class_init), (gst_deinterlace2_set_method), - (gst_deinterlace2_push_history), (gst_deinterlace2_chain), - (gst_deinterlace2_setcaps), (gst_deinterlace2_sink_event), - (gst_deinterlace2_change_state), (gst_deinterlace2_src_event), - (gst_deinterlace2_src_query): - Fix coding style and remove scanlines function as it's unused now. - -2008-06-28 17:25:56 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/: Add a C implementation for the greedyh deinterlacing method, clean up the code a bit and ma... - Original commit message from CVS: - * gst/deinterlace2/tvtime/greedyh.asm: - * gst/deinterlace2/tvtime/greedyh.c: (greedyDScaler_C), - (deinterlace_frame_di_greedyh), (dscaler_greedyh_get_method): - * gst/deinterlace2/tvtime/greedyhmacros.h: - Add a C implementation for the greedyh deinterlacing method, clean - up the code a bit and mark the SSE version as MMXEXT as it doesn't - require any SSE instructions. - -2008-06-27 13:22:34 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/gstdeinterlace2.c: If we're outputting all fields the framerate has to be doubled. - Original commit message from CVS: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace2_set_property), (gst_deinterlace2_chain), - (gst_deinterlace2_setcaps): - If we're outputting all fields the framerate has to be doubled. - Set duration on the outgoing buffers. - -2008-06-26 15:52:40 +0000 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> - - Add documentation for YUV4MPEG2 encoder element. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/y4m/gsty4mencode.c: - Add documentation for YUV4MPEG2 encoder element. - -2008-06-25 16:05:08 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: Remove unneeded macros that break build on macosx. - Original commit message from CVS: - * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: - Remove unneeded macros that break build on macosx. - -2008-06-24 15:48:25 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Depend on released versions of core and -base. - Original commit message from CVS: - * configure.ac: - Depend on released versions of core and -base. - -2008-06-24 12:08:47 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/greedy.c: Optimize MMX/MMXEXT implementations a bit by requiring two less memory accesses and... - Original commit message from CVS: - * gst/deinterlace2/tvtime/greedy.c: - (deinterlace_greedy_packed422_scanline_mmx), - (deinterlace_greedy_packed422_scanline_mmxext): - Optimize MMX/MMXEXT implementations a bit by requiring two less - memory accesses and fix the workaround for the missing right shift - on bytes to unset the highest bit of every byte. - -2008-06-24 10:15:41 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/greedy.c: Remove sfence instruction as it's not needed and actually is an SSE instruction. - Original commit message from CVS: - * gst/deinterlace2/tvtime/greedy.c: - (deinterlace_greedy_packed422_scanline_mmxext): - Remove sfence instruction as it's not needed and actually is an SSE - instruction. - -2008-06-24 10:12:08 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/greedy.c: Add plain MMX implementation for the greedyl method. - Original commit message from CVS: - * gst/deinterlace2/tvtime/greedy.c: - (deinterlace_greedy_packed422_scanline_mmx), - (deinterlace_greedy_packed422_scanline): - Add plain MMX implementation for the greedyl method. - -2008-06-24 09:40:03 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/Makefile.am: Move the assembly includes to noinst_HEADERS where they belong. - Original commit message from CVS: - * gst/deinterlace2/Makefile.am: - Move the assembly includes to noinst_HEADERS where they belong. - * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line_c), - (deinterlace_line_mmx): - Fix C and MMX implementations a bit more. - -2008-06-24 09:10:46 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/greedy.c: Fix the C implementation to produce correct results and optimize the - Original commit message from CVS: - * gst/deinterlace2/tvtime/greedy.c: - (deinterlace_greedy_packed422_scanline_c), - (deinterlace_greedy_packed422_scanline_mmxext), - (deinterlace_greedy_packed422_scanline): - Fix the C implementation to produce correct results and optimize the - MMXEXT implementation. - Handle odd widths and don't read over array boundaries in the MMXEXT - implementation. - * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line_c), - (deinterlace_line_mmx), (deinterlace_scanline_vfir): - Fix a small rounding bug in the MMX implementation, the MMX - implementation doesn't actually need MMXEXT instructions so don't mark - it as such. - Handle odd widths in both implementations. - -2008-06-21 21:20:24 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/resindvd/rsnbasesrc.c: Use the right i18n header. - Original commit message from CVS: - * ext/resindvd/rsnbasesrc.c: - Use the right i18n header. - -2008-06-21 09:05:00 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/greedy.c: Implement a C version of the greedy low motion algorithm and mark the assembly opti... - Original commit message from CVS: - * gst/deinterlace2/tvtime/greedy.c: - (deinterlace_greedy_packed422_scanline_sse), - (deinterlace_greedy_packed422_scanline_c), - (deinterlace_greedy_packed422_scanline): - Implement a C version of the greedy low motion algorithm and mark the - assembly optimized version as SSE as it uses SSE instructions - additional to MMX instructions. - -2008-06-20 16:54:28 +0000 Sebastian Pölsterl <marduk@k-d-w.org> - - gst/mpegtsparse/mpegtspacketizer.c: Fix problem when empty string is provided. - Original commit message from CVS: - Patch by: Sebastian Pölsterl - * gst/mpegtsparse/mpegtspacketizer.c: - Fix problem when empty string is provided. - -2008-06-20 14:48:40 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/vfir.c: Make it possible to use the vfir method on X86 CPUs without MMXEXT too but use the MM... - Original commit message from CVS: - * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line_mmxext), - (deinterlace_line_c), (deinterlace_scanline_vfir): - Make it possible to use the vfir method on X86 CPUs without MMXEXT too - but use the MMXEXT optimized code whenever possible. - -2008-06-20 14:35:25 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/gstdeinterlace2.*: Reset element state on PAUSED->READY properly, don't leak any buffers when finali... - Original commit message from CVS: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace2_class_init), (gst_deinterlace2_init), - (gst_deinterlace2_reset_history), (gst_deinterlace2_reset), - (gst_deinterlace2_finalize), (gst_deinterlace2_chain), - (gst_deinterlace2_sink_event), (gst_deinterlace2_change_state), - (gst_deinterlace2_src_query): - * gst/deinterlace2/gstdeinterlace2.h: - Reset element state on PAUSED->READY properly, don't leak any buffers - when finalizing, allocate buffers with gst_pad_alloc_buffer() and - properly return flow returns from gst_pad_push() instead of ignoring them. - -2008-06-20 13:45:08 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: Add missing header. - Original commit message from CVS: - * gst/deinterlace2/tvtime/tomsmocomp/tomsmocompmacros.h: - Add missing header. - -2008-06-20 13:24:29 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Fix compilation on generic x86/amd64 and include deinterlace2 in the build system. Because of several bugs it's still... - Original commit message from CVS: - * configure.ac: - * gst/deinterlace2/Makefile.am: - * gst/deinterlace2/tvtime/greedyh.asm: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: - Fix compilation on generic x86/amd64 and include deinterlace2 in the - build system. Because of several bugs it's still enabled only - by --enable-experimental. - -2008-06-20 13:07:56 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/resindvd/resindvdsrc.*: Schedule NAV packets and activate them with an async clock callback at the right moment. ... - Original commit message from CVS: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - Schedule NAV packets and activate them with an async clock callback - at the right moment. This makes delayed menu highlights appear - at the correct time and fixes Back To The Future. - When outputting new segment in do_seek(), calculate our position - value properly, so we report the right time when popping in and - out of the menus. - * ext/resindvd/rsnbasesrc.c: - When handling a non-flushing seek, accumulate the segment, - rather than having every seek start from 0 and messing with sync - -2008-06-19 13:18:24 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Use BOILERPLATE macro and update test to the latest api changes. - Original commit message from CVS: - * gst/selector/gstoutputselector.c: - * tests/icles/output-selector-test.c: - Use BOILERPLATE macro and update test to the latest api changes. - -2008-06-19 11:25:37 +0000 Wim Taymans <wim.taymans@gmail.com> - - examples/app/appsink-src.c: Don't use a buffer after unreffing it. - Original commit message from CVS: - * examples/app/appsink-src.c: (on_new_buffer_from_source): - Don't use a buffer after unreffing it. - -2008-06-18 07:02:54 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/metadata/metadataexif.c: Add description tag mapping. - Original commit message from CVS: - * ext/metadata/metadataexif.c: - Add description tag mapping. - -2008-06-18 06:31:13 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Fix gtk-doc warnings. Also don't misuse api-doc comments for normal comments. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * examples/app/appsrc-ra.c: - * examples/app/appsrc-seekable.c: - * examples/app/appsrc-stream.c: - * examples/app/appsrc-stream2.c: - * ext/directfb/dfbvideosink.h: - * ext/metadata/gstbasemetadata.c: - * ext/metadata/gstbasemetadata.h: - * ext/metadata/metadata.c: - * ext/metadata/metadataexif.c: - * ext/theora/theoradec.h: - * gst/deinterlace2/gstdeinterlace2.h: - * gst/deinterlace2/tvtime/speedy.c: - * gst/deinterlace2/tvtime/speedy.h: - * gst/deinterlace2/tvtime/vfir.c: - Fix gtk-doc warnings. Also don't misuse api-doc comments for normal - comments. - -2008-06-17 19:52:00 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/resindvd/resindvdbin.c: Parse the URI argument into the device name so dvd:///path/to/image works. - Original commit message from CVS: - * ext/resindvd/resindvdbin.c: - Parse the URI argument into the device name so dvd:///path/to/image - works. - * ext/resindvd/resindvdsrc.c: - Implement a trivial duration query reporting the current PGC length. - * gst/dvdspu/gstdvdspu.c: - Rename typo in the function name. - -2008-06-17 11:01:58 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Disable deinterlace2 plugin again which was accidently enabled with last commit. - Original commit message from CVS: - * configure.ac: - Disable deinterlace2 plugin again which was accidently enabled - with last commit. - -2008-06-17 10:53:35 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Make resindvd work with libdvdnav >= 4.0.0. - Original commit message from CVS: - * configure.ac: - * ext/resindvd/resindvdsrc.h: - Make resindvd work with libdvdnav >= 4.0.0. - -2008-06-17 01:08:14 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Check for libdvdnav to build resindvd. - Original commit message from CVS: - * configure.ac: - Check for libdvdnav to build resindvd. - * ext/Makefile.am: - * ext/resindvd/Makefile.am: - * ext/resindvd/gstmpegdefs.h: - * ext/resindvd/gstmpegdemux.c: - * ext/resindvd/gstmpegdemux.h: - * ext/resindvd/gstmpegdesc.c: - * ext/resindvd/gstmpegdesc.h: - * ext/resindvd/gstpesfilter.c: - * ext/resindvd/gstpesfilter.h: - * ext/resindvd/plugin.c: - * ext/resindvd/resin-play: - * ext/resindvd/resindvdbin.c: - * ext/resindvd/resindvdbin.h: - * ext/resindvd/resindvdsrc.c: - * ext/resindvd/resindvdsrc.h: - * ext/resindvd/rsnaudiomunge.c: - * ext/resindvd/rsnaudiomunge.h: - * ext/resindvd/rsnbasesrc.c: - * ext/resindvd/rsnbasesrc.h: - * ext/resindvd/rsnpushsrc.c: - * ext/resindvd/rsnpushsrc.h: - * ext/resindvd/rsnstreamselector.c: - * ext/resindvd/rsnstreamselector.h: - First commit of DVD-Video playback component 'rsndvdbin' - and helper elements. - Use --enable-experimental for now, but feel free to give it a - try using the resin-play script. - * gst/dvdspu/gstdvdspu.c: - Add some extra guards for malformed events. - -2008-06-17 00:37:49 +0000 David Schleef <ds@schleef.org> - - configure.ac: Bump dirac requirement to 0.10 due to api changes. - Original commit message from CVS: - * configure.ac: - Bump dirac requirement to 0.10 due to api changes. +2022-03-21 13:01:03 +0100 Benjamin Gaignard <benjamin.gaignard@collabora.com> -2008-06-16 14:11:36 +0000 Andy Wingo <wingo@pobox.com> + * sys/v4l2codecs/gstv4l2decoder.c: + v4l2codecs: Fix memory leak + Free pending_requests array when releasing decoder to avoid memory leak + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2000> - * ChangeLog: - * gst-libs/gst/app/gstappsrc.c: - gst-libs/gst/app/gstappsrc.c (gst_app_src_set_max_bytes) - Original commit message from CVS: - 2008-06-16 Andy Wingo <wingo@pobox.com> - * gst-libs/gst/app/gstappsrc.c (gst_app_src_set_max_bytes) - (gst_app_src_get_max_bytes, gst_app_src_push_buffer): Use - G_GUINT64_FORMAT. Avoid overflow in get_max_bytes(). - -2008-06-16 12:37:34 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - sys/dvb/gstdvbsrc.c: Move docblob upwards. Balance tags and restore blank line. - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - Move docblob upwards. Balance tags and restore blank line. - -2008-06-16 11:47:34 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: Fix out of date docs. - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - Fix out of date docs. - -2008-06-16 11:29:46 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - Patch from: Vincent Genieux - Original commit message from CVS: - Patch from: Vincent Genieux - * gst/mpegtsparse/mpegtsparse.c: - Fix refcount issues, fixes #538560. - -2008-06-16 09:22:30 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/: Parse the extended event descriptor. - Original commit message from CVS: - * gst/mpegtsparse/gstmpegdesc.h: - * gst/mpegtsparse/mpegtspacketizer.c: - Parse the extended event descriptor. - -2008-06-16 07:30:34 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Final round of doc updates. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - * gst/speed/gstspeed.c: - * gst/speexresample/gstspeexresample.c: - * gst/videosignal/gstvideoanalyse.c: - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideomark.c: - * sys/dvb/gstdvbsrc.c: - * sys/oss4/oss4-mixer.c: - * sys/oss4/oss4-sink.c: - * sys/oss4/oss4-source.c: - * sys/wininet/gstwininetsrc.c: - Final round of doc updates. - -2008-06-16 07:03:58 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/: More doc updates. More xrefs. - Original commit message from CVS: - * gst/deinterlace/gstdeinterlace.c: - * gst/rtpmanager/gstrtpbin.c: - * gst/rtpmanager/gstrtpclient.c: - * gst/rtpmanager/gstrtpjitterbuffer.c: - * gst/rtpmanager/gstrtpptdemux.c: - * gst/rtpmanager/gstrtpsession.c: - * gst/rtpmanager/gstrtpssrcdemux.c: - * gst/sdp/gstsdpdemux.c: - More doc updates. More xrefs. - -2008-06-13 22:46:43 +0000 Julien Moutte <julien@moutte.net> - - gst/flv/: Introduce demuxing support for AAC and - Original commit message from CVS: - 2008-06-14 Julien Moutte <julien@fluendo.com> - * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), - (gst_flv_demux_dispose): - * gst/flv/gstflvdemux.h: - * gst/flv/gstflvparse.c: (gst_flv_parse_audio_negotiate), - (gst_flv_parse_tag_audio), (gst_flv_parse_video_negotiate), - (gst_flv_parse_tag_video): Introduce demuxing support for AAC - and - H.264/AVC inside FLV. - * sys/dshowdecwrapper/gstdshowaudiodec.c: - (gst_dshowaudiodec_init), - (gst_dshowaudiodec_chain), (gst_dshowaudiodec_push_buffer), - (gst_dshowaudiodec_sink_event), (gst_dshowaudiodec_setup_graph): - * sys/dshowdecwrapper/gstdshowaudiodec.h: - * sys/dshowdecwrapper/gstdshowvideodec.c: - (gst_dshowvideodec_init), - (gst_dshowvideodec_sink_event), (gst_dshowvideodec_chain), - (gst_dshowvideodec_push_buffer), - (gst_dshowvideodec_src_getcaps): - * sys/dshowdecwrapper/gstdshowvideodec.h: Lot of random fixes - to improve stability (ref counting, safety checks...) - -2008-06-13 18:25:18 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/real/gstrealaudiodec.c: Disable sipro on 64bits, it crashes. - Original commit message from CVS: - * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_probe_modules): - Disable sipro on 64bits, it crashes. - -2008-06-13 18:03:16 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/real/gstrealaudiodec.c: Add raversions we can support on the caps. - Original commit message from CVS: - * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_chain), - (close_library), (open_library), - (gst_real_audio_dec_probe_modules), (gst_real_audio_dec_getcaps), - (gst_real_audio_dec_setcaps), (gst_real_audio_dec_init), - (gst_real_audio_dec_change_state), (gst_real_audio_dec_finalize): - Add raversions we can support on the caps. - Refactor the loading of the real codecs like realvideo so that we can - implement probing. - Probe all supported formats by trying to load the .so files, only report - the versions on the caps that we can actually load. - * gst/real/gstrealvideodec.c: (gst_real_video_dec_chain), - (gst_real_video_dec_getcaps), (gst_real_video_dec_setcaps), - (open_library), (close_library), - (gst_real_video_dec_probe_modules), - (gst_real_video_dec_change_state), (gst_real_video_dec_init), - (gst_real_video_dec_finalize), (gst_real_video_dec_class_init): - * gst/real/gstrealvideodec.h: - Change the loading of the library like the audio decoder. - Probe the supported formats by trying to load the .so files and only - report the versions on the caps that we can actually load. - -2008-06-13 15:46:03 +0000 Sebastian Pölsterl <marduk@k-d-w.org> - - gst/mpegtsparse/mpegtspacketizer.c: Handle character sets in strings coming from DVB SI according to the DVB SI spec. - Original commit message from CVS: - patch by: Sebastian Pölsterl - * gst/mpegtsparse/mpegtspacketizer.c: - Handle character sets in strings coming from DVB SI according - to the DVB SI spec. - -2008-06-13 14:33:52 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/replaygain/: More doc updates. - Original commit message from CVS: - * gst/replaygain/gstrganalysis.c: - * gst/replaygain/gstrglimiter.c: - * gst/replaygain/gstrgvolume.c: - More doc updates. - -2008-06-13 11:59:23 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/: docs/plugins/inspect/plugin-mythtv.xml - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrwb.xml: - * docs/plugins/inspect/plugin-app.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-flvdemux.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-interleave.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegtsparse.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-mythtv.xml - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-oss4.xml - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-speexresample.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-subenc.xml - * docs/plugins/inspect/plugin-timidity.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - * ext/amrwb/gstamrwbdec.c: - * ext/amrwb/gstamrwbenc.c: - * ext/amrwb/gstamrwbparse.c: - * ext/dc1394/gstdc1394.c: - * ext/directfb/dfbvideosink.c: - * ext/ivorbis/vorbisdec.c: - * ext/jack/gstjackaudiosink.c: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mplex/gstmplex.cc: - * ext/musicbrainz/gsttrm.c: - * ext/mythtv/gstmythtvsrc.c: - * ext/theora/theoradec.c: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * gst-libs/gst/app/gstappsink.c: - * gst/deinterlace/gstdeinterlace.c: - * gst/dvdspu/gstdvdspu.c: - * gst/festival/gstfestival.c: - * gst/freeze/gstfreeze.c: - * gst/interleave/deinterleave.c: - * gst/interleave/interleave.c: - * gst/modplug/gstmodplug.cc: - * gst/nuvdemux/gstnuvdemux.c: - Add missing elements to docs. Fix doc-markup: use convinience syntax - for examples (produces valid docbook), add several refsec2 when we - have several titles. Fix some types. - -2008-06-12 15:47:03 +0000 Wim Taymans <wim.taymans@gmail.com> - - examples/app/: Add beefed up example app from bug #413418. It now also uses appsink instead of fakesink for more ulti... - Original commit message from CVS: - * examples/app/.cvsignore: - * examples/app/Makefile.am: - * examples/app/appsink-src.c: (on_new_buffer_from_source), - (on_source_message), (on_sink_message), (main): - Add beefed up example app from bug #413418. It now also uses appsink - instead of fakesink for more ultimate coolness. - * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init), - (gst_app_src_init), (gst_app_src_set_property), - (gst_app_src_get_property), (gst_app_src_unlock), - (gst_app_src_unlock_stop), (gst_app_src_create), - (gst_app_src_set_max_bytes), (gst_app_src_push_buffer), - (gst_app_src_end_of_stream): - * gst-libs/gst/app/gstappsrc.h: - Add block property to allow push based implementation to block when we - fill up the appsrc queues. - Emit the enough-data signal while releasing our lock. - -2008-06-12 14:50:27 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - examples/app/.cvsignore: Ignore more. - Original commit message from CVS: - * examples/app/.cvsignore: - Ignore more. - -2008-06-12 14:49:18 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Do not use short_description in section docs for elements. We extract them from element details and there will be war... - Original commit message from CVS: - * ext/dc1394/gstdc1394.c: - * ext/ivorbis/vorbisdec.c: - * ext/jack/gstjackaudiosink.c: - * ext/metadata/gstmetadatademux.c: - * ext/mythtv/gstmythtvsrc.c: - * ext/theora/theoradec.c: - * gst-libs/gst/app/gstappsink.c: - * gst/bayer/gstbayer2rgb.c: - * gst/deinterlace/gstdeinterlace.c: - * gst/rawparse/gstaudioparse.c: - * gst/rawparse/gstvideoparse.c: - * gst/rtpmanager/gstrtpbin.c: - * gst/rtpmanager/gstrtpclient.c: - * gst/rtpmanager/gstrtpjitterbuffer.c: - * gst/rtpmanager/gstrtpptdemux.c: - * gst/rtpmanager/gstrtpsession.c: - * gst/rtpmanager/gstrtpssrcdemux.c: - * gst/selector/gstinputselector.c: - * gst/selector/gstoutputselector.c: - * gst/videosignal/gstvideoanalyse.c: - * gst/videosignal/gstvideodetect.c: - * gst/videosignal/gstvideomark.c: - * sys/oss4/oss4-mixer.c: - * sys/oss4/oss4-sink.c: - * sys/oss4/oss4-source.c: - Do not use short_description in section docs for elements. We extract - them from element details and there will be warnings if they differ. - Also fixing up the ChangeLog order. - -2008-06-12 14:20:40 +0000 Sebastien Merle <sylane@gmail.com> - - ext/amrwb/gstamrwbdec.c: Fix the sign of the data we pass to the decoder so that the decoder compiles with newer refe... - Original commit message from CVS: - Patch by: Sebastien Merle <sylane at gmail dot com> - * ext/amrwb/gstamrwbdec.c: (gst_amrwbdec_chain): - Fix the sign of the data we pass to the decoder so that the decoder - compiles with newer reference code as well. Fixes #528618. - -2008-06-12 13:51:51 +0000 Sebastien Merle <sylane@gmail.com> - - ext/amrwb/gstamrwbdec.c: Fix the sign of the data we pass to the decoder so that the decoder compiles with newer refe... - Original commit message from CVS: - Patch by: Sebastien Merle <sylane at gmail dot com> - * ext/amrwb/gstamrwbdec.c: (gst_amrwbdec_chain): - Fix the sign of the data we pass to the decoder so that the decoder - compiles with newer reference code as well. Fixes #528618. - -2008-06-12 13:06:37 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/icles/test-oss4.c: Include stdlib.h. - Original commit message from CVS: - * tests/icles/test-oss4.c: - Include stdlib.h. - -2008-06-11 11:12:49 +0000 Martin Eikermann <meiker@upb.de> - - gst/deinterlace2/: Add a deinterlacer plugin based on the tvtime/DScaler deinterlacer, which was relicensed to LGPL f... - Original commit message from CVS: - Based on a patch by: Martin Eikermann <meiker at upb dot de> - * gst/deinterlace2/Makefile.am: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace2_method_get_type), - (gst_deinterlace2_fields_get_type), - (gst_deinterlace2_field_layout_get_type), - (gst_deinterlace2_base_init), (gst_deinterlace2_class_init), - (gst_deinterlace2_init), (gst_deinterlace2_set_method), - (gst_deinterlace2_set_property), (gst_deinterlace2_get_property), - (gst_deinterlace2_finalize), (gst_deinterlace2_pop_history), - (gst_deinterlace2_head_history), (gst_deinterlace2_push_history), - (gst_deinterlace2_deinterlace_scanlines), (gst_deinterlace2_chain), - (gst_deinterlace2_setcaps), (gst_deinterlace2_sink_event), - (gst_deinterlace2_change_state), (gst_deinterlace2_src_event), - (gst_deinterlace2_src_query), (gst_deinterlace2_src_query_types), - (plugin_init): - * gst/deinterlace2/gstdeinterlace2.h: - * gst/deinterlace2/tvtime/greedy.c: (copy_scanline), - (deinterlace_greedy_packed422_scanline_mmxext), - (dscaler_greedyl_get_method): - * gst/deinterlace2/tvtime/greedyh.asm: - * gst/deinterlace2/tvtime/greedyh.c: - (deinterlace_frame_di_greedyh), (dscaler_greedyh_get_method), - (greedyh_init), (greedyh_filter_mmx), (greedyh_filter_3dnow), - (greedyh_filter_sse): - * gst/deinterlace2/tvtime/greedyh.h: - * gst/deinterlace2/tvtime/greedyhmacros.h: - * gst/deinterlace2/tvtime/mmx.h: - * gst/deinterlace2/tvtime/plugins.h: - * gst/deinterlace2/tvtime/speedtools.h: - * gst/deinterlace2/tvtime/speedy.c: (multiply_alpha), (clip255), - (comb_factor_packed422_scanline_mmx), - (diff_factor_packed422_scanline_c), - (diff_factor_packed422_scanline_mmx), - (diff_packed422_block8x8_mmx), (diff_packed422_block8x8_c), - (packed444_to_packed422_scanline_c), - (packed422_to_packed444_scanline_c), - (packed422_to_packed444_rec601_scanline_c), - (vfilter_chroma_121_packed422_scanline_mmx), - (vfilter_chroma_121_packed422_scanline_c), - (vfilter_chroma_332_packed422_scanline_mmx), - (vfilter_chroma_332_packed422_scanline_c), - (kill_chroma_packed422_inplace_scanline_mmx), - (kill_chroma_packed422_inplace_scanline_c), - (invert_colour_packed422_inplace_scanline_mmx), - (invert_colour_packed422_inplace_scanline_c), - (mirror_packed422_inplace_scanline_c), - (interpolate_packed422_scanline_c), - (convert_uyvy_to_yuyv_scanline_mmx), - (convert_uyvy_to_yuyv_scanline_c), - (interpolate_packed422_scanline_mmx), - (interpolate_packed422_scanline_mmxext), - (blit_colour_packed422_scanline_c), - (blit_colour_packed422_scanline_mmx), - (blit_colour_packed422_scanline_mmxext), - (blit_colour_packed4444_scanline_c), - (blit_colour_packed4444_scanline_mmx), - (blit_colour_packed4444_scanline_mmxext), (small_memcpy), - (speedy_memcpy_c), (speedy_memcpy_mmx), (speedy_memcpy_mmxext), - (blit_packed422_scanline_c), (blit_packed422_scanline_mmx), - (blit_packed422_scanline_mmxext), - (composite_colour4444_alpha_to_packed422_scanline_c), - (composite_colour4444_alpha_to_packed422_scanline_mmxext), - (composite_packed4444_alpha_to_packed422_scanline_c), - (composite_packed4444_alpha_to_packed422_scanline_mmxext), - (composite_packed4444_to_packed422_scanline_c), - (composite_packed4444_to_packed422_scanline_mmxext), - (composite_alphamask_to_packed4444_scanline_c), - (composite_alphamask_to_packed4444_scanline_mmxext), - (composite_alphamask_alpha_to_packed4444_scanline_c), - (premultiply_packed4444_scanline_c), - (premultiply_packed4444_scanline_mmxext), - (blend_packed422_scanline_c), (blend_packed422_scanline_mmxext), - (quarter_blit_vertical_packed422_scanline_mmxext), - (quarter_blit_vertical_packed422_scanline_c), - (subpix_blit_vertical_packed422_scanline_c), - (a8_subpix_blit_scanline_c), (myround), (init_RGB_to_YCbCr_tables), - (init_YCbCr_to_RGB_tables), (rgb24_to_packed444_rec601_scanline_c), - (rgba32_to_packed4444_rec601_scanline_c), - (packed444_to_rgb24_rec601_scanline_c), - (packed444_to_nonpremultiplied_packed4444_scanline_c), - (aspect_adjust_packed4444_scanline_c), (setup_speedy_calls), - (speedy_get_accel): - * gst/deinterlace2/tvtime/speedy.h: - * gst/deinterlace2/tvtime/sse.h: - * gst/deinterlace2/tvtime/tomsmocomp.c: (Fieldcopy), - (deinterlace_frame_di_tomsmocomp), (dscaler_tomsmocomp_get_method), - (tomsmocomp_init), (tomsmocomp_filter_mmx), - (tomsmocomp_filter_3dnow), (tomsmocomp_filter_sse): - * gst/deinterlace2/tvtime/tomsmocomp.h: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoop0A.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA8.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA2.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA6.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH2.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVA.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVAH.inc: - * gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc: - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: - * gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc: - * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line), - (deinterlace_scanline_vfir), (copy_scanline), - (dscaler_vfir_get_method): - * gst/deinterlace2/tvtime/x86-64_macros.inc: - Add a deinterlacer plugin based on the tvtime/DScaler deinterlacer, - which was relicensed to LGPL for GStreamer and in theory provides - better and faster results than the simple deinterlace element. - Fixes bug #163578. - Ported to GStreamer 0.10 but still not enabled or included in the - build system by default because of bad artefacts caused by a bug - somewhere and as it can be only build on x86/amd64 ATM and requires - special CFLAGS. Will be fixed soon. - -2008-06-11 11:12:14 +0000 Martin Eikermann <meiker@upb.de> - - gst/deinterlace2/: Add a deinterlacer plugin based on the tvtime/DScaler deinterlacer, which was relicensed to LGPL f... - Original commit message from CVS: - Based on a patch by: Martin Eikermann <meiker at upb dot de> - * gst/deinterlace2/Makefile.am: - * gst/deinterlace2/gstdeinterlace2.c: - (gst_deinterlace2_method_get_type), - (gst_deinterlace2_fields_get_type), - (gst_deinterlace2_field_layout_get_type), - (gst_deinterlace2_base_init), (gst_deinterlace2_class_init), - (gst_deinterlace2_init), (gst_deinterlace2_set_method), - (gst_deinterlace2_set_property), (gst_deinterlace2_get_property), - (gst_deinterlace2_finalize), (gst_deinterlace2_pop_history), - (gst_deinterlace2_head_history), (gst_deinterlace2_push_history), - (gst_deinterlace2_deinterlace_scanlines), (gst_deinterlace2_chain), - (gst_deinterlace2_setcaps), (gst_deinterlace2_sink_event), - (gst_deinterlace2_change_state), (gst_deinterlace2_src_event), - (gst_deinterlace2_src_query), (gst_deinterlace2_src_query_types), - (plugin_init): - * gst/deinterlace2/gstdeinterlace2.h: - * gst/deinterlace2/tvtime/greedy.c: (copy_scanline), - (deinterlace_greedy_packed422_scanline_mmxext), - (dscaler_greedyl_get_method): - * gst/deinterlace2/tvtime/greedyh.asm: - * gst/deinterlace2/tvtime/greedyh.c: - (deinterlace_frame_di_greedyh), (dscaler_greedyh_get_method), - (greedyh_init), (greedyh_filter_mmx), (greedyh_filter_3dnow), - (greedyh_filter_sse): - * gst/deinterlace2/tvtime/greedyh.h: - * gst/deinterlace2/tvtime/greedyhmacros.h: - * gst/deinterlace2/tvtime/mmx.h: - * gst/deinterlace2/tvtime/plugins.h: - * gst/deinterlace2/tvtime/speedtools.h: - * gst/deinterlace2/tvtime/speedy.c: (multiply_alpha), (clip255), - (comb_factor_packed422_scanline_mmx), - (diff_factor_packed422_scanline_c), - (diff_factor_packed422_scanline_mmx), - (diff_packed422_block8x8_mmx), (diff_packed422_block8x8_c), - (packed444_to_packed422_scanline_c), - (packed422_to_packed444_scanline_c), - (packed422_to_packed444_rec601_scanline_c), - (vfilter_chroma_121_packed422_scanline_mmx), - (vfilter_chroma_121_packed422_scanline_c), - (vfilter_chroma_332_packed422_scanline_mmx), - (vfilter_chroma_332_packed422_scanline_c), - (kill_chroma_packed422_inplace_scanline_mmx), - (kill_chroma_packed422_inplace_scanline_c), - (invert_colour_packed422_inplace_scanline_mmx), - (invert_colour_packed422_inplace_scanline_c), - (mirror_packed422_inplace_scanline_c), - (interpolate_packed422_scanline_c), - (convert_uyvy_to_yuyv_scanline_mmx), - (convert_uyvy_to_yuyv_scanline_c), - (interpolate_packed422_scanline_mmx), - (interpolate_packed422_scanline_mmxext), - (blit_colour_packed422_scanline_c), - (blit_colour_packed422_scanline_mmx), - (blit_colour_packed422_scanline_mmxext), - (blit_colour_packed4444_scanline_c), - (blit_colour_packed4444_scanline_mmx), - (blit_colour_packed4444_scanline_mmxext), (small_memcpy), - (speedy_memcpy_c), (speedy_memcpy_mmx), (speedy_memcpy_mmxext), - (blit_packed422_scanline_c), (blit_packed422_scanline_mmx), - (blit_packed422_scanline_mmxext), - (composite_colour4444_alpha_to_packed422_scanline_c), - (composite_colour4444_alpha_to_packed422_scanline_mmxext), - (composite_packed4444_alpha_to_packed422_scanline_c), - (composite_packed4444_alpha_to_packed422_scanline_mmxext), - (composite_packed4444_to_packed422_scanline_c), - (composite_packed4444_to_packed422_scanline_mmxext), - (composite_alphamask_to_packed4444_scanline_c), - (composite_alphamask_to_packed4444_scanline_mmxext), - (composite_alphamask_alpha_to_packed4444_scanline_c), - (premultiply_packed4444_scanline_c), - (premultiply_packed4444_scanline_mmxext), - (blend_packed422_scanline_c), (blend_packed422_scanline_mmxext), - (quarter_blit_vertical_packed422_scanline_mmxext), - (quarter_blit_vertical_packed422_scanline_c), - (subpix_blit_vertical_packed422_scanline_c), - (a8_subpix_blit_scanline_c), (myround), (init_RGB_to_YCbCr_tables), - (init_YCbCr_to_RGB_tables), (rgb24_to_packed444_rec601_scanline_c), - (rgba32_to_packed4444_rec601_scanline_c), - (packed444_to_rgb24_rec601_scanline_c), - (packed444_to_nonpremultiplied_packed4444_scanline_c), - (aspect_adjust_packed4444_scanline_c), (setup_speedy_calls), - (speedy_get_accel): - * gst/deinterlace2/tvtime/speedy.h: - * gst/deinterlace2/tvtime/sse.h: - * gst/deinterlace2/tvtime/tomsmocomp.c: (Fieldcopy), - (deinterlace_frame_di_tomsmocomp), (dscaler_tomsmocomp_get_method), - (tomsmocomp_init), (tomsmocomp_filter_mmx), - (tomsmocomp_filter_3dnow), (tomsmocomp_filter_sse): - * gst/deinterlace2/tvtime/tomsmocomp.h: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoop0A.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopBottom.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopEdgeA8.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA2.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddA6.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopOddAH2.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopTop.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVA.inc: - * gst/deinterlace2/tvtime/tomsmocomp/SearchLoopVAH.inc: - * gst/deinterlace2/tvtime/tomsmocomp/StrangeBob.inc: - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll.inc: - * gst/deinterlace2/tvtime/tomsmocomp/TomsMoCompAll2.inc: - * gst/deinterlace2/tvtime/tomsmocomp/WierdBob.inc: - * gst/deinterlace2/tvtime/vfir.c: (deinterlace_line), - (deinterlace_scanline_vfir), (copy_scanline), - (dscaler_vfir_get_method): - * gst/deinterlace2/tvtime/x86-64_macros.inc: - Add a deinterlacer plugin based on the tvtime/DScaler deinterlacer, - which was relicensed to LGPL for GStreamer and in theory provides - better and faster results than the simple deinterlace element. - Fixes bug #163578. - Ported to GStreamer 0.10 but still not enabled or included in the - build system by default because of bad artefacts caused by a bug - somewhere and as it can be only build on x86/amd64 ATM and requires - special CFLAGS. Will be fixed soon. - -2008-06-11 07:58:44 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/timidity/gstwildmidi.*: Initialize wildmidi only once in the plugin init function instead of once for every insta... - Original commit message from CVS: - Based on a patch by: Sonicadvance1 at GMAIL dot COM - * ext/timidity/gstwildmidi.c: (gst_wildmidi_init), - (gst_wildmidi_change_state), (plugin_init): - * ext/timidity/gstwildmidi.h: - Initialize wildmidi only once in the plugin init function instead - of once for every instance. The second and following calls to the - wildmidi initialization function will fail. Fixes bug #525613. - Also don't register the element at all if wildmidi initialization - fails. +2022-02-02 10:05:16 -0300 Daniel Almeida <daniel.almeida@collabora.com> -2008-06-10 12:54:59 +0000 Sebastian Dröge <slomo@circular-chaos.org> + * gst-libs/gst/codecs/gstav1decoder.c: + * gst-libs/gst/codecs/gstav1decoder.h: + * gst-libs/gst/codecs/gstvp9decoder.c: + * sys/d3d11/gstd3d11av1dec.cpp: + * sys/va/gstvaav1dec.c: + av1decoder: Sync duplicate_picture with VP9 one + Pass the current frame to the duplicate_picture callback. This makes it easier + to set the frame's output_buffer if we already have one available. Also + documented that unlike VP9, it is not optional to implement this as the + picture will populate the DPB if it is a key-frame. To ensure this, remove the + default implementation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1992> - ext/soundtouch/gstpitch.cc: Call gst_element_no_more_pads() after all pads are added. - Original commit message from CVS: - * ext/soundtouch/gstpitch.cc: - Call gst_element_no_more_pads() after all pads are added. - -2008-06-09 17:57:08 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rawparse/gstrawparse.c: Add simple reverse playback. - Original commit message from CVS: - * gst/rawparse/gstrawparse.c: (gst_raw_parse_push_buffer), - (gst_raw_parse_loop), (gst_raw_parse_handle_seek_push), - (gst_raw_parse_handle_seek_pull): - Add simple reverse playback. - -2008-06-09 12:05:00 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rawparse/gstrawparse.*: Fix seeking, timestamps, duration and some more. Fixes #536309. - Original commit message from CVS: - * gst/rawparse/gstrawparse.c: (gst_raw_parse_reset), - (gst_raw_parse_push_buffer), (gst_raw_parse_chain), - (gst_raw_parse_loop), (gst_raw_parse_sink_activatepull), - (gst_raw_parse_convert), (gst_raw_parse_sink_event), - (gst_raw_parse_handle_seek_push), (gst_raw_parse_handle_seek_pull), - (gst_raw_parse_src_query), (gst_raw_parse_get_fps): - * gst/rawparse/gstrawparse.h: - Fix seeking, timestamps, duration and some more. Fixes #536309. - -2008-06-06 16:50:51 +0000 Wim Taymans <wim.taymans@gmail.com> - - examples/app/: Added 3 more example application for using appsrc in random-access mode, pull-mode streaming and pull ... - Original commit message from CVS: - * examples/app/Makefile.am: - * examples/app/appsrc-ra.c: (feed_data), (seek_data), - (found_source), (bus_message), (main): - * examples/app/appsrc-seekable.c: (feed_data), (seek_data), - (found_source), (bus_message), (main): - * examples/app/appsrc-stream2.c: (feed_data), (found_source), - (bus_message), (main): - Added 3 more example application for using appsrc in random-access mode, - pull-mode streaming and pull mode seekable. - * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init), - (gst_app_src_start), (gst_app_src_do_get_size), - (gst_app_src_create): - * gst-libs/gst/app/gstappsrc.h: - Make stream-type property writable. - Unset flushing when starting so that we reuse appsrc. - Inform basesrc about the configured size. - Emit seek-data signal when we are going to a different offset in - random-access mode. - -2008-06-06 14:19:54 +0000 Wim Taymans <wim.taymans@gmail.com> - - examples/app/appsrc-stream.c: Use deep-notify until we can depend on a playbin2 with support for the source property. - Original commit message from CVS: - * examples/app/appsrc-stream.c: (found_source), (main): - Use deep-notify until we can depend on a playbin2 with support for the - source property. - -2008-06-06 13:01:05 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Fix deadlock when shutting down, use a new lock instead to properly shutdown. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_init), - (gst_rtp_bin_finalize), (gst_rtp_bin_change_state): - Fix deadlock when shutting down, use a new lock instead to properly - shutdown. - -2008-06-05 16:38:50 +0000 Wim Taymans <wim.taymans@gmail.com> - - examples/app/: Added an example on how to use appsrc in playbin in streaming mode from an mmapped file. - Original commit message from CVS: - * examples/app/.cvsignore: - * examples/app/Makefile.am: - * examples/app/appsrc-stream.c: (read_data), (start_feed), - (stop_feed), (found_source), (bus_message), (main): - Added an example on how to use appsrc in playbin in streaming mode from - an mmapped file. - * examples/app/appsrc_ex.c: (main): - Set pipeline to NULL to free queued buffers. - * gst-libs/gst/app/gstapp-marshal.list: - * gst-libs/gst/app/gstappsrc.c: (stream_type_get_type), (_do_init), - (gst_app_src_class_init), (gst_app_src_init), - (gst_app_src_flush_queued), (gst_app_src_dispose), - (gst_app_src_set_property), (gst_app_src_get_property), - (gst_app_src_unlock), (gst_app_src_unlock_stop), - (gst_app_src_start), (gst_app_src_stop), (gst_app_src_is_seekable), - (gst_app_src_check_get_range), (gst_app_src_do_seek), - (gst_app_src_create), (gst_app_src_set_stream_type), - (gst_app_src_get_stream_type), (gst_app_src_set_max_bytes), - (gst_app_src_get_max_bytes), (gst_app_src_push_buffer), - (gst_app_src_end_of_stream), (gst_app_src_uri_get_type), - (gst_app_src_uri_get_protocols), (gst_app_src_uri_get_uri), - (gst_app_src_uri_set_uri), (gst_app_src_uri_handler_init): - * gst-libs/gst/app/gstappsrc.h: - Measure max queue size in bytes instead. - Add support for 3 modes of operation, streaming, seekable and - random-access, making basesrc handle the scheduling modes for each. - Add appsrc:// uri handler so that automatic plugging can be done from - playbin2 or uridecodebin, for example. - Added support for custom segment formats. - Add support for push and pull based operations from the application. - Expand the methods so that errors can be detected. - Flush the queued buffers on seeks and when shutting down. - Add signals to inform the app that a seek must happen. - -2008-06-05 11:07:17 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/interleave/: Properly implement duration and position queries in bytes format. We have to take the upstream reply... - Original commit message from CVS: - * gst/interleave/deinterleave.c: (gst_deinterleave_add_new_pads), - (gst_deinterleave_src_query): - * gst/interleave/interleave.c: (gst_interleave_src_query_duration), - (gst_interleave_src_query): - Properly implement duration and position queries in bytes format. We - have to take the upstream reply and divide/multiply it by the number - of channels to get the correct result. - -2008-06-04 21:18:53 +0000 Michael Smith <msmith@xiph.org> - - sys/dshowvideosink/: Fix up copyright notice on new plugin. - Original commit message from CVS: - * sys/dshowvideosink/dshowvideofakesrc.cpp: - * sys/dshowvideosink/dshowvideofakesrc.h: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dshowvideosink/dshowvideosink.h: - Fix up copyright notice on new plugin. - -2008-06-04 17:02:38 +0000 Jon Trowbridge <trow@ximian.com> - - ext/dirac/gstdiracenc.cc: Update properties for recent dirac changes. Patch from Jonathan Rosser. - Original commit message from CVS: - * ext/dirac/gstdiracenc.cc: Update properties for recent - dirac changes. Patch from Jonathan Rosser. - -2008-06-04 11:33:21 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/x264/gstx264enc.c: Try harder not to crash when we get an EOS event but haven't set up the encoder yet (as may ha... - Original commit message from CVS: - * ext/x264/gstx264enc.c: (gst_x264_enc_header_buf), - (gst_x264_enc_sink_event), (gst_x264_enc_chain), - (gst_x264_enc_encode_frame): - Try harder not to crash when we get an EOS event but haven't set - up the encoder yet (as may happen when upstream errors out with - not-negotiated, for example). Also, always push the EOS event - downstream. - -2008-06-04 06:48:46 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/interleave/interleave.*: Use an always increasing integer for the number in the name of the requested sink pads t... - Original commit message from CVS: - * gst/interleave/interleave.c: (gst_interleave_pad_get_type), - (gst_interleave_pad_get_property), (gst_interleave_pad_class_init), - (gst_interleave_request_new_pad), (gst_interleave_release_pad): - * gst/interleave/interleave.h: - Use an always increasing integer for the number in the name of the - requested sink pads to guarantuee a unique name. Add a "channel" - property to GstInterleavePad to make it possible for applications - to retrieve the channel number in the output for every pad. - Use g_type_register_static_simple() instead of - g_type_register_static() to save some relocations. - -2008-06-03 15:41:05 +0000 Christian Schaller <uraeus@gnome.org> - - * autogen.sh: - fix package name - Original commit message from CVS: - fix package name - -2008-06-03 14:35:59 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/interleave/interleave.c: Stop GstCollectPads before calling the parent's state change function when going from PA... - Original commit message from CVS: - * gst/interleave/interleave.c: (gst_interleave_pad_get_type), - (gst_interleave_change_state): - Stop GstCollectPads before calling the parent's state change function - when going from PAUSED to READY as we otherwise deadlock. - Fixes bug #536258. - -2008-06-03 11:10:32 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/h264parse/gsth264parse.*: Parse codec_data and use the nalu_size_length field to get the NALU length in packetize... - Original commit message from CVS: - * gst/h264parse/gsth264parse.c: (gst_nal_bs_init), - (gst_h264_parse_sink_setcaps), (gst_h264_parse_chain_forward), - (gst_h264_parse_queue_buffer), (gst_h264_parse_chain_reverse), - (gst_h264_parse_chain): - * gst/h264parse/gsth264parse.h: - Parse codec_data and use the nalu_size_length field to get the NALU - length in packetized h264. - When queueing a packetized buffer in reverse mode, don't unref the - buffer twice. - Avoid accessing the buffer TIMESTAMP field after we pushed it on - the adaptor. - -2008-06-03 09:03:19 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/interleave/interleave.c: Use new gst_audio_check_channel_positions() function and register the GstInterleavePad t... - Original commit message from CVS: - * gst/interleave/interleave.c: - (gst_interleave_check_channel_positions), - (gst_interleave_set_channel_positions), - (gst_interleave_class_init): - Use new gst_audio_check_channel_positions() function and register - the GstInterleavePad type from a threadsafe context. - -2008-06-02 21:51:52 +0000 Michael Smith <msmith@xiph.org> - - configure.ac: Revert accidental addition in configure.ac. Sorry. - Original commit message from CVS: - * configure.ac: - Revert accidental addition in configure.ac. Sorry. - -2008-06-02 18:23:54 +0000 Michael Smith <msmith@xiph.org> - - Add a new win32 videosink. Uses the DirectShow renderers for high-performance video rendering on win32. - Original commit message from CVS: - * configure.ac: - * sys/Makefile.am: - * sys/dshowvideosink/Makefile.am: - * sys/dshowvideosink/README: - * sys/dshowvideosink/dshowvideofakesrc.cpp: - * sys/dshowvideosink/dshowvideofakesrc.h: - * sys/dshowvideosink/dshowvideosink.cpp: - * sys/dshowvideosink/dshowvideosink.h: - Add a new win32 videosink. Uses the DirectShow renderers for - high-performance video rendering on win32. - Currently only supports some YUV formats. - Rank PRIMARY, since it's much more useful for the common cases that the - directdraw sink (which only does RGB). - -2008-06-02 18:06:37 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/spc/Makefile.am: Dist tag.h - Original commit message from CVS: - * ext/spc/Makefile.am: - Dist tag.h - -2008-06-02 17:06:34 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/faad/gstfaad.c: Always drain before activating the new segment. - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_sink_event): - Always drain before activating the new segment. - -2008-06-02 12:42:14 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/interleave/interleave.*: Allow setting channel positions via a property and allow using the channel positions on ... - Original commit message from CVS: - * gst/interleave/interleave.c: (gst_interleave_pad_get_type), - (gst_interleave_finalize), (gst_audio_check_channel_positions), - (gst_interleave_set_channel_positions), - (gst_interleave_class_init), (gst_interleave_init), - (gst_interleave_set_property), (gst_interleave_get_property), - (gst_interleave_request_new_pad), (gst_interleave_release_pad), - (gst_interleave_sink_setcaps), (gst_interleave_src_query_duration), - (gst_interleave_src_query_latency), (gst_interleave_collected): - * gst/interleave/interleave.h: - Allow setting channel positions via a property and allow using the - channel positions on the input as the channel positions of the output. - Fix some broken logic and memory leaks. - * tests/check/Makefile.am: - * tests/check/elements/interleave.c: (src_handoff_float32), - (sink_handoff_float32), (GST_START_TEST), (interleave_suite): - Add unit tests for checking correct handling of channel positions. - -2008-06-02 10:18:25 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/faad/gstfaad.*: Add basic reverse playback support. - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_dispose), (clear_queued), - (flush_queued), (gst_faad_drain), (gst_faad_do_raw_seek), - (gst_faad_src_event), (gst_faad_sink_event), (gst_faad_chain), - (gst_faad_change_state): - * ext/faad/gstfaad.h: - Add basic reverse playback support. - Clear decoder state after disconts. - Remove some unused code. - Mark output buffers with a discont after a decoding error. - -2008-06-02 07:37:31 +0000 Sjoerd Simons <sjoerd@luon.net> - - gst/mpeg4videoparse/mpeg4videoparse.c: Fix mpeg4videoparse on big endian architectures. Fixes bug #536042. - Original commit message from CVS: - Patch by: Sjoerd Simons <sjoerd at luon dot net> - * gst/mpeg4videoparse/mpeg4videoparse.c: - (gst_mpeg4vparse_handle_vos): - Fix mpeg4videoparse on big endian architectures. Fixes bug #536042. - -2008-05-29 19:56:53 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/mplex.c: Don't use the deprecated gst_element_get_pad(). - Original commit message from CVS: - * tests/check/elements/mplex.c: (setup_src_pad), - (teardown_src_pad): - Don't use the deprecated gst_element_get_pad(). - -2008-05-29 19:11:47 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - examples/directfb/gstdfb.c: Don't use the deprecated gst_element_get_pad(). - Original commit message from CVS: - * examples/directfb/gstdfb.c: (main): - Don't use the deprecated gst_element_get_pad(). - -2008-05-28 08:53:00 +0000 Onkar Shinde <onkarshinde@gmail.com> - - sys/vcd/vcdsrc.c: Allow the track to be set by using the uri. Fixes #535043. - Original commit message from CVS: - Based on patch by: <onkarshinde at gmail dot com> - * sys/vcd/vcdsrc.c: (gst_vcdsrc_uri_get_uri), - (gst_vcdsrc_uri_set_uri): - Allow the track to be set by using the uri. Fixes #535043. - -2008-05-28 08:14:16 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/interleave/interleave.c: Implement latency query. - Original commit message from CVS: - * gst/interleave/interleave.c: (gst_interleave_src_query_duration), - (gst_interleave_src_query_latency), (gst_interleave_src_query): - Implement latency query. - -2008-05-27 17:53:58 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/mpegvideoparse/mpegvideoparse.c: Add GST_BUFFER_FLAG_DELTA_UNIT to not I frame buffers - Original commit message from CVS: - * gst/mpegvideoparse/mpegvideoparse.c: - Add GST_BUFFER_FLAG_DELTA_UNIT to not I frame buffers - -2008-05-27 16:48:10 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Break out of callbacks when we are shutting down. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: - (gst_rtp_bin_propagate_property_to_jitterbuffer), - (gst_rtp_bin_change_state), (new_payload_found), - (new_ssrc_pad_found): - Break out of callbacks when we are shutting down. - Make sure no state changes can happen when we reconfigure. - -2008-05-27 16:32:18 +0000 Wim Taymans <wim.taymans@gmail.com> - - configure.ac: Require CVS core and base for new audio clock reset method. - Original commit message from CVS: - * configure.ac: - Require CVS core and base for new audio clock reset method. - * ext/alsaspdif/alsaspdifsink.c: (alsaspdifsink_change_state): - Reset the audio clock. See #521761. - -2008-05-26 17:52:21 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/jack/gstjackaudiosink.c: Include the element name in the port name to avoid duplicate port names. - Original commit message from CVS: - * ext/jack/gstjackaudiosink.c: - (gst_jack_audio_sink_allocate_channels): - Include the element name in the port name to avoid duplicate port names. - -2008-05-26 10:28:47 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/interleave/deinterleave.c: Add another example launch line. - Original commit message from CVS: - * gst/interleave/deinterleave.c: - Add another example launch line. - * gst/interleave/interleave.c: (interleave_24), - (gst_interleave_finalize), (gst_interleave_base_init), - (gst_interleave_class_init), (gst_interleave_init), - (gst_interleave_request_new_pad), (gst_interleave_release_pad), - (gst_interleave_change_state), (__remove_channels), - (__set_channels), (gst_interleave_sink_getcaps), - (gst_interleave_set_process_function), - (gst_interleave_sink_setcaps), (gst_interleave_sink_event), - (gst_interleave_src_query_duration), (gst_interleave_src_query), - (forward_event_func), (forward_event), (gst_interleave_src_event), - (gst_interleave_collected): - * gst/interleave/interleave.h: - Major rewrite of interleave using GstCollectpads. This new version - also supports almost all raw audio formats and has better caps - negotiation. Fixes bug #506594. - Also update docs and add some more examples. - * tests/check/elements/interleave.c: (interleave_chain_func), - (GST_START_TEST), (src_handoff_float32), (sink_handoff_float32), - (interleave_suite): - Add some more extensive unit tests for interleave. - -2008-05-26 10:09:29 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: When checking the seqnum, reset the jitterbuffer if the gap is too big, we need ... - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): - When checking the seqnum, reset the jitterbuffer if the gap is too big, - we need to do this so that we can better handle a restarted source. - Fix some comments. - * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew), - (rtp_jitter_buffer_insert): - Tweak the skew resync diff. - Use our working seqnum compare function in -base. - Rework the jitterbuffer insert code to make it clearer and more - performant by only retrieving the seqnum of the input buffer once and by - adding some G_LIKELY compiler hints. - Improve debugging for duplicate packets. - * gst/rtpmanager/rtpsource.c: (rtp_source_process_rtp): - Fix a comment, we don't do skew correction here.. - -2008-05-26 10:00:24 +0000 Håvard Graff <havard.graff@tandberg.com> - - gst/rtpmanager/gstrtpbin.c: Propagate the do-lost and latency properties to the jitterbuffers when they are changed o... - Original commit message from CVS: - Patch by: Håvard Graff <havard dot graff at tandberg dot com> - * gst/rtpmanager/gstrtpbin.c: - (gst_rtp_bin_propagate_property_to_jitterbuffer), - (gst_rtp_bin_set_property): - Propagate the do-lost and latency properties to the jitterbuffers when - they are changed on rtpbin. - -2008-05-26 09:57:40 +0000 Wim Taymans <wim.taymans@gmail.com> - - Don't use _gst_pad(). - Original commit message from CVS: - * examples/switch/switcher.c: (switch_timer): - * gst/replaygain/gstrgvolume.c: (gst_rg_volume_init): - * gst/rtpmanager/gstrtpclient.c: (create_stream): - * gst/sdp/gstsdpdemux.c: (gst_sdp_demux_stream_configure_udp), - (gst_sdp_demux_stream_configure_udp_sink): - * tests/check/elements/deinterleave.c: (GST_START_TEST), - (pad_added_setup_data_check_float32_8ch_cb): - * tests/check/elements/rganalysis.c: (send_eos_event), - (send_tag_event): - Don't use _gst_pad(). - -2008-05-22 19:47:53 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - docs/plugins/: Add interleave/deinterleave to the docs and while at that run make update in docs/plugins. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrwb.xml: - * docs/plugins/inspect/plugin-app.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-flvdemux.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-interleave.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegtsparse.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-speexresample.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - Add interleave/deinterleave to the docs and while at that - run make update in docs/plugins. - * gst/interleave/deinterleave.c: - Add a parapraph about using a queue and audioconvert after the source - pads to the docs. - -2008-05-22 18:55:09 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/interleave/deinterleave.*: Don't set a getcaps() function on the src pads as it's not required and the default ge... - Original commit message from CVS: - * gst/interleave/deinterleave.c: (gst_deinterleave_base_init), - (gst_deinterleave_class_init), (gst_deinterleave_init), - (gst_deinterleave_add_new_pads), (gst_deinterleave_sink_getcaps): - * gst/interleave/deinterleave.h: - Don't set a getcaps() function on the src pads as it's not required - and the default getcaps() function returns the correct results for - our src pads. - Complete documentation and add myself to the authors of the element. - -2008-05-22 16:33:25 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/icles/: Small oss4 test that probes for available devices and retrieves their caps and mixer tracks and all tha... - Original commit message from CVS: - * tests/icles/.cvsignore: - * tests/icles/Makefile.am: - * tests/icles/test-oss4.c: (opt_show_mixer_messages), (WAIT_TIME), - (show_mixer_messages), (probe_mixer_tracks), (probe_pad), - (probe_details), (probe_element), (main): - Small oss4 test that probes for available devices and retrieves - their caps and mixer tracks and all that. Also allows testing of - mixer change messages on the bus. - -2008-05-22 15:14:26 +0000 Tim-Philipp Müller <tim@centricular.net> - - sys/oss4/: Make device-name probing in NULL state work better (e.g. for the gnome-control-center sound capplet). - Original commit message from CVS: - * sys/oss4/oss4-mixer.c: (gst_oss4_mixer_open): - * sys/oss4/oss4-property-probe.c: - (gst_oss4_property_probe_find_device_name), - (gst_oss4_property_probe_find_device_name_nofd): - * sys/oss4/oss4-property-probe.h: - * sys/oss4/oss4-sink.c: (gst_oss4_sink_get_property): - * sys/oss4/oss4-source.c: (gst_oss4_source_get_property): - Make device-name probing in NULL state work better (e.g. for the - gnome-control-center sound capplet). - -2008-05-22 14:03:05 +0000 Sjoerd Simons <sjoerd@luon.net> - - gst/mpeg4videoparse/mpeg4videoparse.c: Move some code around to integrate the startcode searching with the other bits... - Original commit message from CVS: - Patch by: Sjoerd Simons <sjoerd at luon dot net> - * gst/mpeg4videoparse/mpeg4videoparse.c: (gst_mpeg4vparse_push), - (gst_mpeg4vparse_drain), (gst_mpeg4vparse_chain), - (gst_mpeg4vparse_change_state): - Move some code around to integrate the startcode searching with the - other bits of parsing, avoid a whole bunch of peeks. - Get rid of invalid data that should not happen according to the specs. - Fixes #533559. - -2008-05-20 09:36:56 +0000 Bastien Nocera <hadess@hadess.net> - - ext/mythtv/gstmythtvsrc.c: Correctly set duration to get a more correct seek bar in totem. - Original commit message from CVS: - Patch by: Bastien Nocera <hadess at hadess dot net> - * ext/mythtv/gstmythtvsrc.c: (gst_mythtv_src_class_init), - (gst_mythtv_src_init), (gst_mythtv_src_clear), - (do_read_request_response), (gst_mythtv_src_create), - (gst_mythtv_src_start): - Correctly set duration to get a more correct seek bar in totem. - Disable query and event functions as they don't work and do some - smaller cleanup. - Fixes bug #533736. - -2008-05-20 09:04:48 +0000 Brian Koropoff <brianhk@cs.washington.edu> - - ext/spc/: Add support for some essential features like seeking, reading song duration and extended tags. Fixes bug #4... - Original commit message from CVS: - Patch by: Brian Koropoff <brianhk at cs dot washington dot edu> - * ext/spc/Makefile.am: - * ext/spc/gstspc.c: (gst_spc_dec_class_init), - (gst_spc_dec_src_query_type), (gst_spc_dec_init), - (gst_spc_dec_dispose), (gst_spc_dec_sink_event), - (gst_spc_duration), (gst_spc_fadeout), (gst_spc_dec_src_event), - (gst_spc_dec_src_query), (spc_play), (spc_setup): - * ext/spc/gstspc.h: - * ext/spc/tag.c: (spc_tag_is_extended), (spc_tag_is_text_format), - (spc_tag_is_present), (spc_tag_unpack_date), (spc_tag_clear), - (spc_tag_get_info), (spc_tag_free): - * ext/spc/tag.h: - Add support for some essential features like seeking, reading song - duration and extended tags. Fixes bug #454151. - -2008-05-19 12:32:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/deinterleave.c: Set keep-positions property to TRUE for the 8 channel test to ensure that the or... - Original commit message from CVS: - * tests/check/elements/deinterleave.c: (GST_START_TEST): - Set keep-positions property to TRUE for the 8 channel test to ensure - that the original channel position is set on the output. - -2008-05-19 07:46:05 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/interleave/deinterleave.*: Add a property to select whether channel positions should be kept on the mono output b... - Original commit message from CVS: - * gst/interleave/deinterleave.c: (gst_deinterleave_class_init), - (gst_deinterleave_init), (gst_deinterleave_add_new_pads), - (gst_deinterleave_set_pads_caps), (gst_deinterleave_set_property), - (gst_deinterleave_get_property): - * gst/interleave/deinterleave.h: - Add a property to select whether channel positions should be kept on - the mono output buffers or should be dropped. - -2008-05-18 10:27:25 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - docs/Makefile.am: Oops - fix the spelling of the variable I added. - Original commit message from CVS: - * docs/Makefile.am: - Oops - fix the spelling of the variable I added. - -2008-05-17 19:39:53 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/interleave/deinterleave.*: Queue events until src pads were added and they can be sent. Otherwise downstream will... - Original commit message from CVS: - * gst/interleave/deinterleave.c: (gst_deinterleave_finalize), - (gst_deinterleave_init), (gst_deinterleave_sink_event), - (gst_deinterleave_process), (gst_deinterleave_sink_activate_push): - * gst/interleave/deinterleave.h: - Queue events until src pads were added and they can be sent. Otherwise - downstream will never get the first newsegment event. - -2008-05-17 14:05:03 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/interleave/deinterleave.c: Always set the channel positions when gst_audio_get_channel_positions() returns someth... - Original commit message from CVS: - * gst/interleave/deinterleave.c: (gst_deinterleave_sink_setcaps), - (gst_deinterleave_getcaps): - Always set the channel positions when gst_audio_get_channel_positions() - returns something, even if they're not set in the caps. This makes - sure that the output channels can be interleaved again correctly - in the mono/stereo cases too. - Don't ask for the peercaps of the current pad in getcaps() as this - might call getcaps() again and deadlock. - -2008-05-16 22:00:49 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/timidity/gstwildmidi.c: Check some more common locations for a valid configuration file. - Original commit message from CVS: - * ext/timidity/gstwildmidi.c: (wildmidi_open_config): - Check some more common locations for a valid configuration file. - Fixes bug #533435. Packagers should still #define WILDMIDI_CFG - to the distributions default location. - -2008-05-16 21:56:24 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/interleave/: Add support for all raw audio formats and provide better negotiation if the caps are changing. - Original commit message from CVS: - * gst/interleave/Makefile.am: - * gst/interleave/deinterleave.c: (deinterleave_24), - (gst_deinterleave_finalize), (gst_deinterleave_base_init), - (gst_deinterleave_class_init), (gst_deinterleave_init), - (gst_deinterleave_add_new_pads), (gst_deinterleave_set_pads_caps), - (gst_deinterleave_set_process_function), - (gst_deinterleave_sink_setcaps), (__remove_channels), - (__set_channels), (gst_deinterleave_getcaps), - (gst_deinterleave_process), (gst_deinterleave_chain), - (gst_deinterleave_sink_activate_push): - * gst/interleave/deinterleave.h: - Add support for all raw audio formats and provide better negotiation - if the caps are changing. - Don't allow changes of the channel positions and set the position of - the corresponding channel on the src pad caps. - General cleanup and smaller bugfixes. - * tests/check/elements/deinterleave.c: (float_buffer_check_probe): - Check the channel positions on the output buffer caps. - -2008-05-16 19:56:30 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - docs/Makefile.am: Don't attempt to build plugin docs when they're disabled. - Original commit message from CVS: - * docs/Makefile.am: - Don't attempt to build plugin docs when they're disabled. - * gst/bayer/Makefile.am: - Add libgstvideo to the link. - * gst/rtpmanager/Makefile.am: - Fix link order, and move LIBS things to _LIBS - -2008-05-16 14:49:07 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - docs/plugins/gst-plugins-bad-plugins.types: Remove bogus attempt to pull 'metadata' plugin's base class into the docs. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.types: - Remove bogus attempt to pull 'metadata' plugin's base - class into the docs. - -2008-05-14 21:02:19 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Simply drop bad RTP packets with a warning instead of just posting an error and ... - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_chain): - Simply drop bad RTP packets with a warning instead of just posting an - error and stopping. This is a perfectly recoverable event and we don't - force people to use an rtpbin to filter out bad packets first. - -2008-05-14 20:57:31 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/mpeg4videoparse/mpeg4videoparse.c: Set fixed caps on the srcpad after we created the pad... - Original commit message from CVS: - * gst/mpeg4videoparse/mpeg4videoparse.c: (gst_mpeg4vparse_init): - Set fixed caps on the srcpad after we created the pad... - -2008-05-14 16:21:05 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/check/Makefile.am: Remove deinterleave test from VALGRIND_TO_FIX again now that there are suppressions in gst.s... - Original commit message from CVS: - * tests/check/Makefile.am: - Remove deinterleave test from VALGRIND_TO_FIX again now that - there are suppressions in gst.supp which make this work for me. - -2008-05-14 14:19:47 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/check/Makefile.am: Add deinterleave unit test to VALGRIND_TO_FIX, since it causes weird invalid free errors in ... - Original commit message from CVS: - * tests/check/Makefile.am: - Add deinterleave unit test to VALGRIND_TO_FIX, since it causes - weird invalid free errors in valgrind/libc after _exit for some - reason. - * tests/check/elements/deinterleave.c: (pads_created), - (set_channel_positions), (src_handoff_float32_8ch), - (float_buffer_check_probe), - (pad_added_setup_data_check_float32_8ch_cb), - (make_fake_src_8chans_float32), (GST_START_TEST), - (deinterleave_suite): - Add some more deinterleave unit test bits I had locally. - -2008-05-14 13:57:41 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/audioresample/gstaudioresample.c: Revert previous change which made basetransform handle buffer_alloc and which b... - Original commit message from CVS: - * gst/audioresample/gstaudioresample.c: (gst_audioresample_init): - Revert previous change which made basetransform handle buffer_alloc - and which breaks things badly in the non-passthrough case since it - returned buffers with a different (ie. sometimes smaller) size than - the size requested. - -2008-05-14 07:32:44 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/interleave/: Split definitions into separate header files for better documentation generation. - Original commit message from CVS: - * gst/interleave/Makefile.am: - * gst/interleave/deinterleave.h: - * gst/interleave/interleave.h: - * gst/interleave/plugin.h: - Split definitions into separate header files for better documentation - generation. - * gst/interleave/deinterleave.c: (gst_deinterleave_base_init), - (gst_deinterleave_class_init), (gst_deinterleave_sink_setcaps), - (gst_deinterleave_process): - Don't use alloca, allow caps changes as long as the number of channels - does not change, don't use g_warning, return NOT_NEGOTIATED as early - as possible and some other cleanup. - * gst/interleave/interleave.c: (gst_interleave_base_init), - (gst_interleave_class_init): - Do some random cleanup. - * tests/check/Makefile.am: - * tests/check/elements/deinterleave.c: (GST_START_TEST), - (deinterleave_chain_func), (deinterleave_pad_added), - (deinterleave_suite): - Add unit tests for the deinterleave element. - -2008-05-13 17:21:07 +0000 Sjoerd Simons <sjoerd@luon.net> - - gst/mpeg4videoparse/mpeg4videoparse.*: Parse the config data (either outbound or in the stream) to set width/height, ... - Original commit message from CVS: - Patch by: Sjoerd Simons <sjoerd at luon dot net> - * gst/mpeg4videoparse/mpeg4videoparse.c: - (gst_mpeg4vparse_set_new_caps), (gst_mpeg4vparse_align), - (get_bits), (next_start_code), (gst_mpeg4vparse_handle_vos), - (gst_mpeg4vparse_push), (gst_mpeg4vparse_drain), - (gst_mpeg4vparse_chain), (gst_mpeg4vparse_sink_setcaps), - (gst_mpeg4vparse_sink_event), (gst_mpeg4vparse_src_query), - (gst_mpeg4vparse_set_property), (gst_mpeg4vparse_get_property), - (gst_mpeg4vparse_class_init), (gst_mpeg4vparse_init): - * gst/mpeg4videoparse/mpeg4videoparse.h: - Parse the config data (either outbound or in the stream) to set - width/height, apect ration, framerate in the caps if applicable. - Mark frames as GST_BUFFER_FLAG_DELTA_UNIT when they are not - intra frames - Set the timestamps of outgoing buffers to the buffer in - which the VOP header was found. - Drop incoming data untill configuration is found (by default, - configurable using a property). - Report a 1 frame latency. Fixes #532723. - -2008-05-13 16:16:35 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/real/gstrealvideodec.c: Add some debug for where we are searching for libraries. - Original commit message from CVS: - * gst/real/gstrealvideodec.c: (open_library): - Add some debug for where we are searching for libraries. - -2008-05-13 10:59:49 +0000 Sjoerd Simons <sjoerd@luon.net> - - tests/check/elements/audioresample.c: Add unit test for the latest basetransform negotiation changes. - Original commit message from CVS: - Patch by: Sjoerd Simons <sjoerd at luon dot net> - * tests/check/elements/audioresample.c: - (live_switch_alloc_only_48000), (live_switch_get_sink_caps), - (live_switch_push), (GST_START_TEST): - Add unit test for the latest basetransform negotiation changes. - See bug #526768. - -2008-05-13 09:06:51 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Actually add the do-lost property to the object. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init): - Actually add the do-lost property to the object. - -2008-05-12 18:43:41 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Avoid waiting for a negative (huge) duration when the last packet has a lower ti... - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_loop): - Avoid waiting for a negative (huge) duration when the last packet has a - lower timestamp than the current packet. - -2008-05-12 14:28:09 +0000 Peter Kjellerstedt <pkj@axis.com> - - gst/rtpmanager/gstrtpsession.c: Make sure to unref the rtpsession returned by gst_pad_get_parent() to prevent a memor... - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_query_send_rtcp_src): - Make sure to unref the rtpsession returned by gst_pad_get_parent() to - prevent a memory leak. - -2008-05-12 14:17:06 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - docs/plugins/gst-plugins-bad-plugins-sections.txt: Quieten some docs output - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - Quieten some docs output - -2008-05-12 14:12:08 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Initialise with GST_CLOCK_TIME_NONE to avoid compiler warning. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_loop): - Initialise with GST_CLOCK_TIME_NONE to avoid compiler warning. - -2008-05-11 17:23:20 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Random doc of the day: the deinterlace element. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * gst/deinterlace/gstdeinterlace.c: - * gst/deinterlace/gstdeinterlace.h: - Random doc of the day: the deinterlace element. - -2008-05-09 10:21:07 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/: Make sure all schedule EIT and non-actual transport stream - Original commit message from CVS: - * gst/mpegtsparse/mpegtspacketizer.c: - * gst/mpegtsparse/mpegtsparse.c: - Make sure all schedule EIT and non-actual transport stream - EITs are parsed. Also add present-following flag and - actual-transport-stream flag to eit bus message. - -2008-05-09 07:41:58 +0000 Peter Kjellerstedt <pkj@axis.com> - - gst/rtpmanager/rtpsource.c: Make sure to unref the caps used by RTPSource to prevent a memory leak. - Original commit message from CVS: - * gst/rtpmanager/rtpsource.c: (rtp_source_finalize): - Make sure to unref the caps used by RTPSource to prevent a memory leak. - -2008-05-08 19:16:17 +0000 Clive Wright <clive_wright@ntlworld.com> - - sys/oss4/oss4-mixer-slider.c: Apparently mono sliders have the mono value repeated in the upper bits, so mask those o... - Original commit message from CVS: - Based on patch by: Clive Wright <clive_wright ntlworld com> - * sys/oss4/oss4-mixer-slider.c: (gst_oss4_mixer_slider_unpack_volume): - Apparently mono sliders have the mono value repeated in the upper bits, - so mask those out when reading them. Probably makes the mixer applet - work properly in some more cases. - -2008-05-08 09:43:33 +0000 Olivier Crete <tester@tester.ca> - - gst/rtpmanager/rtpsession.c: Unlock the session lock when calling one of our callbacks. - Original commit message from CVS: - Patch by: Olivier Crete <tester at tester dot ca> - * gst/rtpmanager/rtpsession.c: (source_clock_rate), - (rtp_session_process_bye), (rtp_session_send_bye_locked): - Unlock the session lock when calling one of our callbacks. - Fixes #532011. - -2008-05-08 06:23:39 +0000 Sjoerd Simons <sjoerd@luon.net> - - gst/rtpmanager/gstrtpsession.c: Send RTP BYE command on EOS. Fixes bug #531955. - Original commit message from CVS: - Patch by: Sjoerd Simons <sjoerd at luon dot net> - * gst/rtpmanager/gstrtpsession.c: - (gst_rtp_session_event_send_rtp_sink): - Send RTP BYE command on EOS. Fixes bug #531955. - -2008-05-08 06:20:42 +0000 Sjoerd Simons <sjoerd@luon.net> - - gst/audioresample/gstaudioresample.c: Let audioresample use the buffer allocation of basetransform instead of it's ow... - Original commit message from CVS: - Patch by: Sjoerd Simons <sjoerd at luon dot net> - * gst/audioresample/gstaudioresample.c: (gst_audioresample_init): - Let audioresample use the buffer allocation of basetransform instead - of it's own stuff. - * tests/check/elements/audioresample.c: (alloc_only_48000), - (GST_START_TEST), (audioresample_suite): - Add unit test for the recent basetransform bugfix, where upstream - changes caps to something that can't be passed through anymore. - -2008-05-07 20:25:09 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - win32/common/config.h.in: Don't define GST_FUNCTION, if GLib supports MSVC we'd much rather use the real thing than h... - Original commit message from CVS: - * win32/common/config.h.in: - Don't define GST_FUNCTION, if GLib supports MSVC we'd much rather - use the real thing than having "???" unconditionally. - -2008-05-07 10:38:23 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst-libs/gst/app/: Add marshal.list, make it compile and add to cvsignore. - Original commit message from CVS: - * gst-libs/gst/app/.cvsignore: - * gst-libs/gst/app/Makefile.am: - * gst-libs/gst/app/gstapp-marshal.list: - Add marshal.list, make it compile and add to cvsignore. - * gst-libs/gst/app/gstappsink.c: (gst_app_sink_dispose), - (gst_app_sink_stop): - Small cleanups. - * gst-libs/gst/app/gstappsrc.c: (gst_app_src_class_init), - (gst_app_src_init), (gst_app_src_set_property), - (gst_app_src_get_property), (gst_app_src_unlock), - (gst_app_src_unlock_stop), (gst_app_src_start), (gst_app_src_stop), - (gst_app_src_create), (gst_app_src_set_caps), - (gst_app_src_get_caps), (gst_app_src_set_size), - (gst_app_src_get_size), (gst_app_src_set_seekable), - (gst_app_src_get_seekable), (gst_app_src_set_max_buffers), - (gst_app_src_get_max_buffers), (gst_app_src_push_buffer), - (gst_app_src_end_of_stream): - * gst-libs/gst/app/gstappsrc.h: - Beat appsrc in shape, add signals and actions. - Add some docs. - Add properties for caps, size, seekability and max-buffers. - Fix unlock/stop code. - -2008-05-07 07:51:36 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Error out if we don't have the required versions of core/base. - Original commit message from CVS: - * configure.ac: - Error out if we don't have the required versions of core/base. - -2008-05-05 10:27:45 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst-libs/gst/app/gstappsink.*: Start some docs. - Original commit message from CVS: - * gst-libs/gst/app/gstappsink.c: (gst_app_sink_class_init), - (gst_app_sink_init), (gst_app_sink_set_property), - (gst_app_sink_get_property), (gst_app_sink_unlock_start), - (gst_app_sink_unlock_stop), (gst_app_sink_flush_unlocked), - (gst_app_sink_start), (gst_app_sink_stop), (gst_app_sink_event), - (gst_app_sink_preroll), (gst_app_sink_render), - (gst_app_sink_set_caps), (gst_app_sink_set_drop), - (gst_app_sink_get_drop): - * gst-libs/gst/app/gstappsink.h: - Start some docs. - Add property to drop buffers when the queue is filled - Fix unlocking and flushing when the queues are filled. - -2008-05-02 14:40:08 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - add wildmidi plugin - Original commit message from CVS: - add wildmidi plugin - -2008-04-29 19:11:56 +0000 Jens Granseuer <jensgr@gmx.net> - - gst/subenc/gstsrtenc.c: Declare variables at the beginning of blocks. Fixes compilation with gcc 2.x and other compil... - Original commit message from CVS: - Patch by: Jens Granseuer <jensgr at gmx dot net> - * gst/subenc/gstsrtenc.c: (gst_srt_enc_timestamp_to_string): - Declare variables at the beginning of blocks. Fixes compilation with - gcc 2.x and other compilers. Fixes bug #530611. - -2008-04-29 09:02:35 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/: Detect SI pids (NIT, SDT, EIT etc.) based on table id and not by pid number. This allows for exampl... - Original commit message from CVS: - * gst/mpegtsparse/mpegtspacketizer.c: - * gst/mpegtsparse/mpegtspacketizer.h: - * gst/mpegtsparse/mpegtsparse.c: - Detect SI pids (NIT, SDT, EIT etc.) based on table id and not - by pid number. This allows for example the EPG data from UK's - freesat to be picked up. - -2008-04-25 23:22:56 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/: Cast NULL sentinels to void * as NULL is defined as an integer constant in most environments when using C++ and... - Original commit message from CVS: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/soundtouch/gstbpmdetect.cc: - Cast NULL sentinels to void * as NULL is defined as an integer - constant in most environments when using C++ and it's size might - be different from a pointer. - -2008-04-25 18:18:47 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst-libs/gst/app/gstappsink.*: Add more docs. - Original commit message from CVS: - * gst-libs/gst/app/gstappsink.c: (gst_app_sink_class_init), - (gst_app_sink_init), (gst_app_sink_set_property), - (gst_app_sink_get_property), (gst_app_sink_event), - (gst_app_sink_preroll), (gst_app_sink_render), - (gst_app_sink_set_emit_signals), (gst_app_sink_get_emit_signals), - (gst_app_sink_set_max_buffers), (gst_app_sink_get_max_buffers), - (gst_app_sink_pull_buffer): - * gst-libs/gst/app/gstappsink.h: - Add more docs. - Add signals for when preroll and render buffers are available. - Add property to control signal emission. - Add property to control the max queue size. - -2008-04-25 18:13:07 +0000 Michael Smith <msmith@xiph.org> - - gst-libs/gst/dshow/Makefile.am: Use CXXFLAGS rather than CFLAGS; these are C++ files. - Original commit message from CVS: - * gst-libs/gst/dshow/Makefile.am: - Use CXXFLAGS rather than CFLAGS; these are C++ files. - Define required constants appropriately. - * sys/dshowdecwrapper/Makefile.am: - Add required include dir, libraries. - Define required constants appropriately. - -2008-04-25 11:32:09 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.*: Expose new jitterbuffer property in rtpbin too. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (create_stream), (gst_rtp_bin_init), - (gst_rtp_bin_set_property), (gst_rtp_bin_get_property): - * gst/rtpmanager/gstrtpbin.h: - Expose new jitterbuffer property in rtpbin too. - -2008-04-25 11:22:13 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Disable sending out rtp packet lost events by default and make a property to ena... - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_class_init), (gst_rtp_jitter_buffer_init), - (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_set_property), - (gst_rtp_jitter_buffer_get_property): - Disable sending out rtp packet lost events by default and make a - property to enabe it. We will likely enable it by default when the base - depayloaders have a default handler for them so that we don't send these - events all through the pipeline for now. - -2008-04-25 09:35:43 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Remove private version of a function that is in -base now. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_init), (gst_rtp_jitter_buffer_flush_stop), - (gst_rtp_jitter_buffer_src_event), (gst_rtp_jitter_buffer_chain), - (gst_rtp_jitter_buffer_loop): - Remove private version of a function that is in -base now. - Add src event handler. - Rework the jitterbuffer pushing loop so that it can quickly react to - lost packets and instruct the depayloader of them. This can then be used - to implement error concealment data. - -2008-04-25 08:21:06 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpsession.c: Set up some internal links functions for the RTCP and sync pads because the defaults ... - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: - (gst_rtp_session_query_send_rtcp_src), (create_recv_rtcp_sink), - (create_send_rtcp_src): - Set up some internal links functions for the RTCP and sync pads because - the defaults are really not correct. - Implement a query handler for the RTCP src pad, mostly to correctly - report about the latency. - -2008-04-25 08:15:58 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Also keep track of the first buffer timestamp together with the first - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), - (gst_rtp_bin_sync_chain): - * gst/rtpmanager/rtpsession.c: (update_arrival_stats), - (rtp_session_process_sr), (rtp_session_on_timeout): - * gst/rtpmanager/rtpsource.c: (rtp_source_init), - (calculate_jitter): - * gst/rtpmanager/rtpsource.h: - * gst/rtpmanager/rtpstats.h: - Also keep track of the first buffer timestamp together with the first - RTP timestamp as they both are needed to construct the timing of - outgoing packets in the jitterbuffer and are therefore also needed to - manage lip-sync. This fixes lip-sync if the first RTP packets arrive - with a wildly different gap. - -2008-04-25 08:07:36 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/flv/gstflvdemux.c: Forward unknown queries upstream instead of returning FALSE on them. - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_query): - Forward unknown queries upstream instead of returning FALSE on them. - -2008-04-24 22:19:48 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add support for the new libmpcdec API which magically gets us support for SV8 files. Also do some random cleanup. Fix... - Original commit message from CVS: - * configure.ac: - * ext/musepack/gstmusepackdec.c: (gst_musepackdec_base_init), - (gst_musepackdec_init), (gst_musepackdec_dispose), - (gst_musepackdec_handle_seek_event), (gst_musepack_stream_init), - (gst_musepackdec_loop), (plugin_init): - * ext/musepack/gstmusepackdec.h: - * ext/musepack/gstmusepackreader.c: - * ext/musepack/gstmusepackreader.h: - Add support for the new libmpcdec API which magically gets us support - for SV8 files. Also do some random cleanup. Fixes bug #526905. - -2008-04-24 21:24:18 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Back to development -> 0.10.7.1 - Original commit message from CVS: - * configure.ac: - Back to development -> 0.10.7.1 - === release 0.10.7 === +2022-03-18 15:59:21 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> -=== release 0.10.7 === + * gst-libs/gst/codecs/gstvp9decoder.c: + vp9decoder: Copy system_frame_number in duplicate_picture + Just like AV1, copy the system_frame_number from the original picture to make + it clear they reference the same data. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1992> -2008-04-24 00:18:30 +0000 Jan Schmidt <thaytan@mad.scientist.com> +2022-03-09 16:35:56 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-app.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-flvdemux.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-interleave.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegtsparse.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-speexresample.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - * gst-plugins-bad.doap: - * po/LINGUAS: - * win32/common/config.h: - Release 0.10.7 - Original commit message from CVS: - Release 0.10.7 - -2008-04-24 00:15:27 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - * common: - * po/af.po: - * po/az.po: - * po/bg.po: - * po/cs.po: - * po/da.po: - * po/de.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/fr.po: - * po/hu.po: - * po/it.po: - * po/ky.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/ru.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - Original commit message from CVS: - Update .po files - -2008-04-22 15:07:35 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/faad/gstfaad.c: Don't leak GstAudioChannelPosition. Fixes #529378. - Original commit message from CVS: - * ext/faad/gstfaad.c: - Don't leak GstAudioChannelPosition. Fixes #529378. - -2008-04-22 08:18:05 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/sdp/gstsdpdemux.c: Ref caps, see #528245. - Original commit message from CVS: - * gst/sdp/gstsdpdemux.c: (request_pt_map): - Ref caps, see #528245. - -2008-04-22 00:21:56 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: 0.10.6.4 pre-release - Original commit message from CVS: - * configure.ac: - 0.10.6.4 pre-release - -2008-04-21 21:54:11 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/rganalysis.c: Don't leak a tag list. Fixes bug #529285. - Original commit message from CVS: - * tests/check/elements/rganalysis.c: (GST_START_TEST): - Don't leak a tag list. Fixes bug #529285. - -2008-04-21 21:52:30 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/ofa.c: Don't leak the tags string and tag list. Fixes bug #529283. - Original commit message from CVS: - * tests/check/elements/ofa.c: (bus_handler): - Don't leak the tags string and tag list. Fixes bug #529283. - -2008-04-21 08:26:37 +0000 Olivier Crete <tester@tester.ca> - - gst/rtpmanager/gstrtpbin.c: Ref caps when inserting into the cache. - Original commit message from CVS: - Patch by: Olivier Crete <tester at tester dot ca> - * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), - (new_ssrc_pad_found): - Ref caps when inserting into the cache. - Don't leak pads. - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_get_clock_rate), - (gst_rtp_jitter_buffer_query): - Avoid a caps leak. - Don't leak refcount in query. - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_get_caps), - (gst_rtp_pt_demux_chain): - Avoid caps leaks. - * gst/rtpmanager/gstrtpsession.c: (source_get_sdes_structure), - (gst_rtp_session_init), (return_true), - (gst_rtp_session_clear_pt_map), (gst_rtp_session_cache_caps), - (gst_rtp_session_clock_rate): - Ref caps when inserting into the cache. - Fix some more caps leaks. Fixes #528245. - -2008-04-18 18:51:08 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/icles/metadata_editor.c: Add cast to placate gcc 4.1.2. - Original commit message from CVS: - * tests/icles/metadata_editor.c: - Add cast to placate gcc 4.1.2. - -2008-04-17 23:01:11 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: 0.10.6.3 pre-release - Original commit message from CVS: - * configure.ac: - 0.10.6.3 pre-release - -2008-04-17 18:28:05 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: Revert patch that added a loop timeout. - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - Revert patch that added a loop timeout. - Fixes #528614. - -2008-04-17 07:31:44 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Unset GValues after g_signal_emitv so that we avoid a refcount leak. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (get_pt_map), (free_client), - (gst_rtp_bin_associate), (gst_rtp_bin_get_free_pad_name): - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_get_clock_rate): - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_get_caps): - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_clock_rate): - Unset GValues after g_signal_emitv so that we avoid a refcount leak. - Don't leak a padname. - Don't leak client streams list. - Lock rtpbin when associating streams. Fixes #528245. - -2008-04-16 09:50:17 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/Makefile.am: Don't inlcude dc1394src in the generic/states test as it requires special hardware. Fixes bu... - Original commit message from CVS: - * tests/check/Makefile.am: - Don't inlcude dc1394src in the generic/states test as it requires - special hardware. Fixes bug #528011. - -2008-04-16 09:48:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/ofa.c: Only check if the generated fingerprints are valid Base64. The fingerprints are different... - Original commit message from CVS: - * tests/check/elements/ofa.c: (bus_handler), (GST_START_TEST): - Only check if the generated fingerprints are valid Base64. The - fingerprints are different when running on different architectures - which is a) no problem because the fingerprints are tolerant enough - and b) is caused by libofa. Fixes bug #528266. - -2008-04-16 09:45:30 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/timidity/Makefile.am: Dist all source files, no matter if only timidity or wildmidi or nothing is found by config... - Original commit message from CVS: - * ext/timidity/Makefile.am: - Dist all source files, no matter if only timidity or wildmidi or - nothing is found by configure. Fixes bug #528000. - -2008-04-14 20:09:24 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst-plugins-bad.spec.in: Remove souphttpsrc plugin from spec files, it's moved to -good. - Original commit message from CVS: - * gst-plugins-bad.spec.in: - Remove souphttpsrc plugin from spec files, it's moved to -good. - -2008-04-13 23:11:09 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - tests/check/Makefile.am: Remove soup test certificates from the dist. - Original commit message from CVS: - * tests/check/Makefile.am: - Remove soup test certificates from the dist. - -2008-04-13 20:54:52 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/dirac/gstdiracenc.cc: Fix compilation by casting string constants. - Original commit message from CVS: - * ext/dirac/gstdiracenc.cc: - Fix compilation by casting string constants. - * sys/Makefile.am: - Fix WININET_DIR variable reference. - -2008-04-12 23:32:14 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Remove soup plugin that's moved to -good (#523124) - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-soup.xml: - * ext/Makefile.am: - * ext/soup/Makefile.am: - * ext/soup/gstsouphttpsrc.c: - * ext/soup/gstsouphttpsrc.h: - * tests/check/Makefile.am: - * tests/check/elements/souphttpsrc.c: - * tests/check/test-cert.pem: - * tests/check/test-key.pem: - Remove soup plugin that's moved to -good (#523124) - -2008-04-11 23:19:21 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/flv/gstflvparse.c: Handle NULL returns from FLV_GET_STRING() more gracefully. Fixes crash caused by a strlen on a... - Original commit message from CVS: - * gst/flv/gstflvparse.c: (gst_flv_parse_metadata_item), - (gst_flv_parse_tag_script): - Handle NULL returns from FLV_GET_STRING() more gracefully. Fixes - crash caused by a strlen on a NULL string (#527622). - -2008-04-11 19:33:53 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - sys/dshowsrcwrapper/gstdshowvideosrc.*: Don't increase latency by queuing buffers in an async queue when the streamin... - Original commit message from CVS: - Patch by: Ole André Vadla Ravnås <ole.andre.ravnas at tandberg com> - * sys/dshowsrcwrapper/gstdshowvideosrc.c: (PROP_DEVICE_NAME), - (gst_dshowvideosrc_class_init), (gst_dshowvideosrc_init), - (gst_dshowvideosrc_dispose), (gst_dshowvideosrc_stop), - (gst_dshowvideosrc_unlock), (gst_dshowvideosrc_unlock_stop), - (gst_dshowvideosrc_create), (gst_dshowvideosrc_push_buffer): - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - Don't increase latency by queuing buffers in an async queue when - the streaming thread can't keep up or isn't scheduled often - enough for some other reason, but just drop the previous buffer - in that case. Also implement GstBaseSrc::unlock for faster - unlocking when shutting down. (#520892). - -2008-04-11 18:46:31 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/icles/metadata_editor.*: Remove GstXOverlay stuff and use gdkpixbufsink plus some rather crude drawing/scaling ... - Original commit message from CVS: - * tests/icles/metadata_editor.c: (ENC_UNKNOWN), (last_pixbuf), - (draw_pixbuf), (change_tag_list), (update_draw_pixbuf), - (ui_drawing_size_allocate_cb), (on_drawingMain_expose_event), - (on_buttonSaveFile_clicked), (ui_create), (me_gst_bus_callback_view), - (me_gst_setup_view_pipeline), (process_file): - * tests/icles/metadata_editor.glade: - Remove GstXOverlay stuff and use gdkpixbufsink plus some rather crude - drawing/scaling logic to make this compile and work on all platforms. - Fixes #518227. - -2008-04-11 13:57:03 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Bump core/base requirements to released versions to avoid confusion. - Original commit message from CVS: - * configure.ac: - Bump core/base requirements to released versions to avoid - confusion. - * gst/deinterlace/gstdeinterlace.c: (deinterlace_debug), - (GST_CAT_DEFAULT), (gst_deinterlace_base_init), - (gst_deinterlace_set_caps), (plugin_init): - Add debug category, use _set_element_details_simple and - remove special code path for Y42B to calculate offsets and - strides; libgstvideo knows how to handle this format now. - -2008-04-11 13:08:24 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/cdxaparse/: Port VCD parser (formerly cdxastrip) from 0.8 to 0.10. Doesn't do anything the 0.8 version didn't do ... - Original commit message from CVS: - * gst/cdxaparse/Makefile.am: - * gst/cdxaparse/gstcdxaparse.c: - * gst/cdxaparse/gstcdxastrip.c: - * gst/cdxaparse/gstcdxastrip.h: - * gst/cdxaparse/gstvcdparse.c: - * gst/cdxaparse/gstvcdparse.h: - Port VCD parser (formerly cdxastrip) from 0.8 to 0.10. Doesn't do - anything the 0.8 version didn't do though. - -2008-04-11 08:13:22 +0000 Julien Moutte <julien@moutte.net> - - sys/oss4/: Fix arguments format in debug statements. - Original commit message from CVS: - 2008-04-11 Julien Moutte <julien@fluendo.com> - * sys/oss4/oss4-mixer-enum.c: - (gst_oss4_mixer_enum_get_values_locked): - * sys/oss4/oss4-source.c: (gst_oss4_source_delay): Fix arguments - format in debug statements. - -2008-04-10 15:29:44 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - Add wininetsrc for basic http/ftp support on windows (#520897). - Original commit message from CVS: - Patch by: Ole André Vadla Ravnås <ole.andre.ravnas at tandberg com> - * configure.ac: - * sys/Makefile.am: - * sys/wininet/Makefile.am: - * sys/wininet/gstwininetsrc.c: - * sys/wininet/gstwininetsrc.h: - Add wininetsrc for basic http/ftp support on windows (#520897). - -2008-04-10 10:01:48 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/nsf/nsf.h: Change prototype of process function here too to avoid 'incompatible assignment' warnings. - Original commit message from CVS: - * gst/nsf/nsf.h: - Change prototype of process function here too to avoid - 'incompatible assignment' warnings. - -2008-04-10 07:11:51 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/souphttpsrc.c: Increase the timeout for the internet tests to 250 seconds and check for NULL cap... - Original commit message from CVS: - * tests/check/elements/souphttpsrc.c: (got_buffer), - (souphttpsrc_suite): - Increase the timeout for the internet tests to 250 seconds - and check for NULL caps instead of just crashing. - The real fix would be to implement an shoutcast server for the unit test - instead of relying on a working internet connection. - Fixes bug #521749. - -2008-04-09 22:27:50 +0000 Peter Kjellerstedt <pkj@axis.com> - - gst/rtpmanager/: Avoid leaking pads in the RTP manager. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (free_session): - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_finalize): - Avoid leaking pads in the RTP manager. - -2008-04-09 13:43:51 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/nsf/nes_apu.*: Don't do void pointer arithmetic - it's a gcc extension. - Original commit message from CVS: - * gst/nsf/nes_apu.c: (apu_process): - * gst/nsf/nes_apu.h: - Don't do void pointer arithmetic - it's a gcc extension. - -2008-04-06 20:18:16 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/jack/gstjackaudiosink.c: Work around missing bits of thread-safety on older GLibs some more to avoid assertions w... - Original commit message from CVS: - * ext/jack/gstjackaudiosink.c: (gst_jack_audio_sink_class_init): - Work around missing bits of thread-safety on older GLibs some - more to avoid assertions when starting up multiple playbin - objects concurrently (see #512382). - -2008-04-06 09:01:42 +0000 Sjoerd Simons <sjoerd@luon.net> - - ext/soup/gstsouphttpsrc.c: Only ignore actual redirects not all responses when in state - Original commit message from CVS: - Patch by: Sjoerd Simons <sjoerd at luon dot net> - * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_response_cb): - Only ignore actual redirects not all responses when in state - GST_SOUP_HTTP_SRC_SESSION_IO_STATUS_RUNNING. Fixes bug #526337. - -2008-04-06 08:58:39 +0000 Damien Lespiau <damien.lespiau@gmail.com> - - configure.ac: Actually build dlls when cross-compiling with mingw32. - Original commit message from CVS: - Patch by: Damien Lespiau <damien dot lespiau at gmail dot com> - * configure.ac: - Actually build dlls when cross-compiling with mingw32. - Fixes bug #526247. - -2008-04-05 11:03:13 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/ofa.c: Also check that we have processed at least 135 seconds of audio until we stop and calcula... - Original commit message from CVS: - * tests/check/elements/ofa.c: (GST_START_TEST): - Also check that we have processed at least 135 seconds of audio - until we stop and calculated a fingerprint. - -2008-04-04 20:43:18 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/subenc/gstsrtenc.*: GstSrtenc => GstSrtEnc and gst_srtenc_ => gst_srt_enc_. - Original commit message from CVS: - * gst/subenc/gstsrtenc.c: - * gst/subenc/gstsrtenc.h: - GstSrtenc => GstSrtEnc and gst_srtenc_ => gst_srt_enc_. - -2008-04-04 19:18:36 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/: Add simple unit tests for the OFA plugin. - Original commit message from CVS: - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/ofa.c: (bus_handler), (GST_START_TEST), - (ofa_suite), (main): - Add simple unit tests for the OFA plugin. - -2008-04-03 14:23:47 +0000 Christian Schaller <uraeus@gnome.org> - - * common: - * gst-plugins-bad.spec.in: - update spec file with new ossv4 plugin - Original commit message from CVS: - update spec file with new ossv4 plugin - -2008-04-02 20:18:58 +0000 Tim-Philipp Müller <tim@centricular.net> - - Add initial support for OSSv4. Mixer still needs a bit more love, but even magic has its limits. - Original commit message from CVS: - * configure.ac: - * sys/Makefile.am: - * sys/oss4/Makefile.am: - * sys/oss4/oss4-audio.c: - * sys/oss4/oss4-audio.h: - * sys/oss4/oss4-mixer-enum.c: - * sys/oss4/oss4-mixer-enum.h: - * sys/oss4/oss4-mixer-slider.c: - * sys/oss4/oss4-mixer-slider.h: - * sys/oss4/oss4-mixer-switch.c: - * sys/oss4/oss4-mixer-switch.h: - * sys/oss4/oss4-mixer.c: - * sys/oss4/oss4-mixer.h: - * sys/oss4/oss4-property-probe.c: - * sys/oss4/oss4-property-probe.h: - * sys/oss4/oss4-sink.c: - * sys/oss4/oss4-sink.h: - * sys/oss4/oss4-soundcard.h: - * sys/oss4/oss4-source.c: - * sys/oss4/oss4-source.h: - Add initial support for OSSv4. Mixer still needs a bit more love, - but even magic has its limits. - -2008-04-01 22:40:49 +0000 Tim-Philipp Müller <tim@centricular.net> - - Rename new srtenc plugin to subenc. - Original commit message from CVS: - * configure.ac: - * gst-plugins-bad.spec.in: - * gst/srtenc/Makefile.am: - * gst/srtenc/gstsrtenc.c: - * gst/srtenc/gstsrtenc.h: - * gst/subenc/Makefile.am: - * gst/subenc/gstsrtenc.c: (plugin_init): - Rename new srtenc plugin to subenc. - -2008-04-01 20:33:19 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - fix spec'a'lec - Original commit message from CVS: - fix spec'a'lec - -2008-04-01 19:53:53 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtspacketizer.c: Cable delivery subsystem descriptors' frequency's bcd is measured in 100Hz units ... - Original commit message from CVS: - * gst/mpegtsparse/mpegtspacketizer.c: - Cable delivery subsystem descriptors' frequency's bcd - is measured in 100Hz units so adjust multiplier accordingly. - -2008-04-01 13:42:55 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - Add srt subtitle encoder - Original commit message from CVS: - * configure.ac: - * gst/srtenc/Makefile.am: - * gst/srtenc/gstsrtenc.c: - * gst/srtenc/gstsrtenc.h: - Add srt subtitle encoder - -2008-03-31 16:24:42 +0000 kapil <kapil@fluendo.com> - - ext/gsm/gstgsmdec.*: Increase the allowed samplerates for the ms-gsm format. - Original commit message from CVS: - Patch by: kapil <kapil at fluendo dot com> - * ext/gsm/gstgsmdec.c: (gst_gsmdec_sink_setcaps), - (gst_gsmdec_chain): - * ext/gsm/gstgsmdec.h: - Increase the allowed samplerates for the ms-gsm format. - Fixes #481354. - -2008-03-30 21:06:58 +0000 Jan de Groot <jan@jgc.homeip.net> - - configure.ac: Fix build with --disable-external (#525100). - Original commit message from CVS: - Patch by: Jan de Groot <jan at jgc homeip net> - * configure.ac: - Fix build with --disable-external (#525100). - -2008-03-28 09:48:27 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: Repeat diseqc call to allow for some diseqc switches. - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - Repeat diseqc call to allow for some diseqc switches. - -2008-03-27 16:32:27 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - ext/Makefile.am: Dist ofa correctly! Fixes non-uninstalled build. - Original commit message from CVS: - * ext/Makefile.am: - Dist ofa correctly! Fixes non-uninstalled build. - -2008-03-27 15:57:14 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: Make diseqc work more reliably. - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - Make diseqc work more reliably. - -2008-03-26 07:40:58 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/nsf/: Remove memguard again and apply hopefully all previously dropped local patches. Should be really better tha... - Original commit message from CVS: - * gst/nsf/Makefile.am: - * gst/nsf/fds_snd.c: - * gst/nsf/mmc5_snd.c: - * gst/nsf/nsf.c: - * gst/nsf/types.h: - * gst/nsf/vrc7_snd.c: - * gst/nsf/vrcvisnd.c: - * gst/nsf/memguard.c: - * gst/nsf/memguard.h: - Remove memguard again and apply hopefully all previously dropped - local patches. Should be really better than the old version now. - -2008-03-25 16:58:53 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/nsf/: Unbreak compilation by disabling memguard and doing some dirty hack fixes to make it compile on 64bits. - Original commit message from CVS: - * gst/nsf/memguard.c: (_my_free): - * gst/nsf/types.h: - Unbreak compilation by disabling memguard and doing some dirty hack - fixes to make it compile on 64bits. - -2008-03-25 15:56:13 +0000 Andreas Henriksson <andreas@fatal.set> - - gst/nsf/: Update our internal nosefart to nosefart-2.7-mls to fix segfaults on some files. Fixes bug #498237. - Original commit message from CVS: - Patch by: Andreas Henriksson <andreas at fatal dot set> - * gst/nsf/Makefile.am: - * gst/nsf/dis6502.h: - * gst/nsf/fds_snd.c: - * gst/nsf/fds_snd.h: - * gst/nsf/fmopl.c: - * gst/nsf/fmopl.h: - * gst/nsf/gstnsf.c: - * gst/nsf/log.c: - * gst/nsf/log.h: - * gst/nsf/memguard.c: - * gst/nsf/memguard.h: - * gst/nsf/mmc5_snd.c: - * gst/nsf/mmc5_snd.h: - * gst/nsf/nes6502.c: - * gst/nsf/nes6502.h: - * gst/nsf/nes_apu.c: - * gst/nsf/nes_apu.h: - * gst/nsf/nsf.c: - * gst/nsf/nsf.h: - * gst/nsf/osd.h: - * gst/nsf/types.h: - * gst/nsf/vrc7_snd.c: - * gst/nsf/vrc7_snd.h: - * gst/nsf/vrcvisnd.c: - * gst/nsf/vrcvisnd.h: - Update our internal nosefart to nosefart-2.7-mls to fix segfaults - on some files. Fixes bug #498237. - Remove some // comments, fix some compiler warnings and use pow() - instead of a slow, selfmade implementation. - -2008-03-25 15:17:58 +0000 Ed Catmur <ed@catmur.co.uk> - - configure.ac: Add support for neon 0.28, which didn't change API. Fixes bug #524035. - Original commit message from CVS: - Patch by: Ed Catmur <ed at catmur dot co dot uk> - * configure.ac: - Add support for neon 0.28, which didn't change API. Fixes bug #524035. - -2008-03-24 12:32:59 +0000 Rene Stadler <mail@renestadler.de> - - Make rganalysis and rglimiter elements GAP-flag aware. - Original commit message from CVS: - * gst/replaygain/gstrganalysis.c (gst_rg_analysis_init), - (gst_rg_analysis_transform_ip): - * gst/replaygain/gstrglimiter.c (gst_rg_limiter_init), - (gst_rg_limiter_transform_ip): - Make rganalysis and rglimiter elements GAP-flag aware. - * tests/check/elements/rganalysis.c: (test_gap_buffers), - (rganalysis_suite): - * tests/check/elements/rglimiter.c (test_gap), (rglimiter_suite): - Add tests to verify gap-awareness. - -2008-03-22 19:26:04 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/soup/gstsouphttpsrc.c: Don't autoplug souphttpsrc for dav/davs. This is better handled by - Original commit message from CVS: - * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_got_headers_cb), - (gst_soup_http_src_chunk_allocator), - (gst_soup_http_src_got_chunk_cb), - (gst_soup_http_src_uri_get_protocols): - Don't autoplug souphttpsrc for dav/davs. This is better handled by - GIO and GnomeVFS as they provide authentication. - Don't leak the icy caps if we already set them and get a new - icy-metaint header. - Try harder to set the icy caps on the output buffer to have correct - caps for the first buffer already. - * tests/check/elements/souphttpsrc.c: (got_buffer), - (GST_START_TEST): - Check that we get a buffer with application/x-icy caps if iradio-mode - is enabled and we have an icecast URL. - -2008-03-22 18:18:46 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/soup/gstsouphttpsrc.c: Actually set the icy caps on our src pad if we have icecast data. - Original commit message from CVS: - * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_chunk_allocator): - Actually set the icy caps on our src pad if we have icecast data. - Fixes bug #523854. - -2008-03-22 15:00:47 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Use G_PARAM_STATIC_STRINGS everywhere for GParamSpecs that use static strings (i.e. all). This gives us less memory u... - Original commit message from CVS: - * configure.ac: - * ext/alsa/gstalsamixerelement.c: - (gst_alsa_mixer_element_class_init): - * ext/alsa/gstalsasink.c: (gst_alsasink_class_init): - * ext/alsa/gstalsasrc.c: (gst_alsasrc_class_init): - * ext/cdparanoia/gstcdparanoiasrc.c: - (gst_cd_paranoia_src_class_init): - * ext/gio/gstgiosink.c: (gst_gio_sink_class_init): - * ext/gio/gstgiosrc.c: (gst_gio_src_class_init): - * ext/gio/gstgiostreamsink.c: (gst_gio_stream_sink_class_init): - * ext/gio/gstgiostreamsrc.c: (gst_gio_stream_src_class_init): - * ext/gnomevfs/gstgnomevfssink.c: (gst_gnome_vfs_sink_class_init): - * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_class_init): - * ext/ogg/gstoggmux.c: (gst_ogg_mux_class_init): - * ext/pango/gsttextoverlay.c: (gst_text_overlay_class_init): - * ext/pango/gsttextrender.c: (gst_text_render_class_init): - * ext/theora/theoradec.c: (gst_theora_dec_class_init): - * ext/theora/theoraenc.c: (gst_theora_enc_class_init): - * ext/theora/theoraparse.c: (gst_theora_parse_class_init): - * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_class_init): - * gst-libs/gst/audio/gstaudiofiltertemplate.c: - (gst_audio_filter_template_class_init): - * gst-libs/gst/audio/gstbaseaudiosink.c: - (gst_base_audio_sink_class_init): - * gst-libs/gst/audio/gstbaseaudiosrc.c: - (gst_base_audio_src_class_init): - * gst-libs/gst/cdda/gstcddabasesrc.c: - (gst_cdda_base_src_class_init): - * gst-libs/gst/interfaces/mixertrack.c: - (gst_mixer_track_class_init): - * gst-libs/gst/rtp/gstbasertpdepayload.c: - (gst_base_rtp_depayload_class_init): - * gst-libs/gst/rtp/gstbasertppayload.c: - (gst_basertppayload_class_init): - * gst/audioconvert/gstaudioconvert.c: - (gst_audio_convert_class_init): - * gst/audiorate/gstaudiorate.c: (gst_audio_rate_class_init): - * gst/audioresample/gstaudioresample.c: - (gst_audioresample_class_init): - * gst/audiotestsrc/gstaudiotestsrc.c: - (gst_audio_test_src_class_init): - * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init): - * gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init): - * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), - (preroll_unlinked): - * gst/playback/gstplaybin.c: (gst_play_bin_class_init): - * gst/playback/gstplaybin2.c: (gst_play_bin_class_init): - * gst/playback/gstplaysink.c: (gst_play_sink_class_init): - * gst/playback/gstqueue2.c: (gst_queue_class_init): - * gst/playback/gststreaminfo.c: (gst_stream_info_class_init): - * gst/playback/gststreamselector.c: (gst_selector_pad_class_init), - (gst_stream_selector_class_init): - * gst/playback/gsturidecodebin.c: (gst_uri_decode_bin_class_init): - * gst/subparse/gstsubparse.c: (gst_sub_parse_class_init): - * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init): - * gst/tcp/gsttcpclientsink.c: (gst_tcp_client_sink_class_init): - * gst/tcp/gsttcpclientsrc.c: (gst_tcp_client_src_class_init): - * gst/tcp/gsttcpserversink.c: (gst_tcp_server_sink_class_init): - * gst/tcp/gsttcpserversrc.c: (gst_tcp_server_src_class_init): - * gst/videorate/gstvideorate.c: (gst_video_rate_class_init): - * gst/videoscale/gstvideoscale.c: (gst_video_scale_class_init): - * gst/videotestsrc/gstvideotestsrc.c: - (gst_video_test_src_class_init): - * gst/volume/gstvolume.c: (gst_volume_class_init): - * sys/v4l/gstv4lelement.c: (gst_v4lelement_class_init): - * sys/v4l/gstv4lmjpegsink.c: (gst_v4lmjpegsink_class_init): - * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_class_init): - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_class_init): - * sys/ximage/ximagesink.c: (gst_ximagesink_class_init): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_class_init): - Use G_PARAM_STATIC_STRINGS everywhere for GParamSpecs that use - static strings (i.e. all). This gives us less memory usage, - fewer allocations and thus less memory defragmentation. Depend - on core CVS for this. Fixes bug #523806. - -2008-03-21 14:50:41 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Check if the compiler supports do { } while (0) macros. This fixes a warning when compiling with g++ 4.... - Original commit message from CVS: - * configure.ac: - Check if the compiler supports do { } while (0) macros. This fixes - a warning when compiling with g++ 4.3, resulting in a build failure - because of -Werror. - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - * ext/mplex/gstmplex.cc: - Include <string.h> for memcpy and friends to fix the build with - gcc 4.3. - * tests/check/Makefile.am: - Remove trailing backslash. - -2008-03-20 18:10:29 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/selector/gstinputselector.c: Do g_object_notify() only when not holding the lock to get the property because othe... - Original commit message from CVS: - * gst/selector/gstinputselector.c: - (gst_input_selector_set_active_pad), (gst_input_selector_switch): - Do g_object_notify() only when not holding the lock to get the property - because otherwise we run into a deadlock with the deep-notify handlers - that are possibly installed. - -2008-03-20 17:48:49 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/selector/gstinputselector.c: Release the selector lock when pad alloc happens on a non selected pad. - Original commit message from CVS: - * gst/selector/gstinputselector.c: (gst_selector_pad_class_init), - (gst_selector_pad_event), (gst_selector_pad_bufferalloc), - (gst_selector_pad_chain), (gst_input_selector_set_active_pad): - Release the selector lock when pad alloc happens on a non selected pad. - -2008-03-20 17:07:07 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/selector/gstinputselector.c: Add pad property to configure behaviour of the unselected pad, it can return OK or N... - Original commit message from CVS: - * gst/selector/gstinputselector.c: (gst_selector_pad_class_init), - (gst_selector_pad_init), (gst_selector_pad_set_property), - (gst_selector_pad_get_property), (gst_selector_pad_event), - (gst_selector_pad_bufferalloc), (gst_selector_pad_chain), - (gst_input_selector_set_active_pad): - Add pad property to configure behaviour of the unselected pad, it can - return OK or NOT_LINKED, based on the use case. - -2008-03-20 16:48:46 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/selector/gstinputselector.*: Figure out the locking a bit more. - Original commit message from CVS: - * gst/selector/gstinputselector.c: - (gst_selector_pad_get_running_time), (gst_selector_pad_reset), - (gst_selector_pad_event), (gst_selector_pad_bufferalloc), - (gst_input_selector_wait), (gst_selector_pad_chain), - (gst_input_selector_class_init), (gst_input_selector_init), - (gst_input_selector_dispose), (gst_segment_set_start), - (gst_input_selector_set_active_pad), - (gst_input_selector_set_property), - (gst_input_selector_get_property), - (gst_input_selector_get_linked_pad), - (gst_input_selector_is_active_sinkpad), - (gst_input_selector_activate_sinkpad), - (gst_input_selector_request_new_pad), - (gst_input_selector_release_pad), - (gst_input_selector_change_state), (gst_input_selector_block), - (gst_input_selector_switch): - * gst/selector/gstinputselector.h: - Figure out the locking a bit more. - Mark buffers with discont after switching. - Fix initial segment forwarding, make sure to only forward one segment - regardless of what the sequence of buffers/segments is. See #522203. - Improve flushing when blocked. - Return NOT_LINKED when a stream is not selected. - Not API change for the switch signal in the docs. - Fix start/time/accum values of the new segment. - Correctly unlock and flush a blocking selector when going to READY. - -2008-03-20 15:54:23 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/ladspa/: Add some thoughts and FIXME's. - Original commit message from CVS: - * ext/ladspa/gstladspa.c: - * ext/ladspa/gstsignalprocessor.c: - Add some thoughts and FIXME's. - -2008-03-20 15:49:22 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/bayer/gstbayer2rgb.c: Include stdlib.h for abs. - Original commit message from CVS: - * gst/bayer/gstbayer2rgb.c: - Include stdlib.h for abs. - -2008-03-19 19:56:59 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/freeze/: Add example to source code documentation blob and remove the 3 line - Original commit message from CVS: - * gst/freeze/FAQ: - * gst/freeze/Makefile.am: - * gst/freeze/gstfreeze.c: - Add example to source code documentation blob and remove the 3 line - FAQ. - * gst/interleave/interleave.c: - Add a source code documentation blob. - -2008-03-19 18:44:51 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/ofa/gstofa.c: Improve debugging, clean up a bit and really generate the fingerprint after 135 seconds. - Original commit message from CVS: - * ext/ofa/gstofa.c: (create_fingerprint), (gst_ofa_event), - (gst_ofa_transform_ip), (plugin_init): - Improve debugging, clean up a bit and really generate the fingerprint - after 135 seconds. - -2008-03-19 18:19:12 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/ofa/gstofa.c: Use GPL as license, the plugin itself is LGPL but libofa is GPL. - Original commit message from CVS: - * ext/ofa/gstofa.c: - Use GPL as license, the plugin itself is LGPL but libofa is GPL. - -2008-03-19 18:14:17 +0000 Eric Buehl <eric.buehl@gmail.com> - - Add an OFA element, the successor of MusicBrainz TRM fingerprinting. - Original commit message from CVS: - Based on a patch by: Eric Buehl <eric dot buehl at gmail dot com> - * configure.ac: - * ext/ofa/Makefile.am: - * ext/ofa/gstofa.c: (gst_ofa_base_init), (gst_ofa_finalize), - (gst_ofa_class_init), (create_fingerprint), (gst_ofa_event), - (gst_ofa_init), (gst_ofa_transform_ip), (gst_ofa_get_property), - (plugin_init): - * ext/ofa/gstofa.h: - Add an OFA element, the successor of MusicBrainz TRM fingerprinting. - Fixes bug #351309. - -2008-03-18 10:12:40 +0000 Andy Wingo <wingo@pobox.com> - - ext/faad/gstfaad.c (gst_faad_chain): Fix a bad format argument, and a potential int overflow. - Original commit message from CVS: - 2008-03-18 Andy Wingo <wingo@pobox.com> - * ext/faad/gstfaad.c (gst_faad_chain): Fix a bad format argument, - and a potential int overflow. - * ext/faad/gstfaad.h: Include <neaacdec.h> if faad is neaac. - Avoids a #warning about an ignored #pragma. - -2008-03-17 15:51:08 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - examples/switch/switcher.c: Update switch example to use input selector. - Original commit message from CVS: - * examples/switch/switcher.c: - Update switch example to use input selector. - -2008-03-17 09:02:43 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/neon/gstneonhttpsrc.c: Handle HTTP status code 303 (See Other) the same way as 302 (Found). Not sure what to do a... - Original commit message from CVS: - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_class_init), - (gst_neonhttp_src_send_request_and_redirect): - Handle HTTP status code 303 (See Other) the same way - as 302 (Found). Not sure what to do about all the other 3xx - redirect status codes. Fixes bug #522884. - -2008-03-14 21:48:37 +0000 Edward Hervey <bilboed@bilboed.com> - - gst-libs/gst/dshow/Makefile.am: Make sure the dshow helper library headers get distributed in the next release. - Original commit message from CVS: - * gst-libs/gst/dshow/Makefile.am: - Make sure the dshow helper library headers get distributed in the next - release. - -2008-03-14 17:38:10 +0000 William M. Brack <wbrack@mmm.hk> - - gst/bayer/gstbayer2rgb.c: Significant improvements. Fixes #521392. - Original commit message from CVS: - Patch by: William M. Brack - * gst/bayer/gstbayer2rgb.c: Significant improvements. Fixes #521392. - -2008-03-14 17:22:21 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/selector/gstinputselector.c: Add lots of debugging. - Original commit message from CVS: - * gst/selector/gstinputselector.c: (gst_selector_pad_event), - (gst_selector_pad_bufferalloc), (gst_selector_pad_chain), - (gst_input_selector_class_init), - (gst_input_selector_set_active_pad), - (gst_input_selector_set_property), - (gst_input_selector_push_pending_stop): - Add lots of debugging. - Fix time member in the newsegment event. - -2008-03-13 16:46:04 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/selector/gstinputselector.*: Various cleanups. - Original commit message from CVS: - * gst/selector/gstinputselector.c: (gst_selector_pad_class_init), - (gst_selector_pad_finalize), (gst_selector_pad_get_property), - (gst_selector_pad_event), (gst_input_selector_class_init), - (gst_input_selector_init), (gst_input_selector_set_active_pad), - (gst_input_selector_set_property), - (gst_input_selector_get_property), - (gst_input_selector_request_new_pad), - (gst_input_selector_release_pad), - (gst_input_selector_push_pending_stop), - (gst_input_selector_switch): - * gst/selector/gstinputselector.h: - Various cleanups. - Added tags to the pads. - Select active pad based on the pad object instead of its name. - Fix refcount in set_active_pad. - Add property to get the number of pads. - * gst/selector/gstoutputselector.c: - (gst_output_selector_class_init), - (gst_output_selector_set_property), - (gst_output_selector_get_property): - Various cleanups. - Select the active pad based on the pad object instead of its name. - Fix locking when setting the active pad. - * gst/selector/gstselector-marshal.list: - * tests/check/elements/selector.c: (cleanup_pad), - (selector_set_active_pad), (run_input_selector_buffer_count): - Fixes for pad instead of padname for pad selection. - -2008-03-13 14:25:20 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Use GST_LICENSE, GST_PACKAGE_NAME and GST_PACKAGE_ORIGIN instead of hardcoding values where possible. Fixes bug #522212. - Original commit message from CVS: - * ext/alsaspdif/alsaspdifsink.c: - * ext/gsm/gstgsm.c: - * ext/jack/gstjack.c: - * ext/libmms/gstmms.c: - * ext/neon/gstneonhttpsrc.c: - * ext/shout/gstshout.c: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * gst/nuvdemux/gstnuvdemux.c: - * gst/tta/gsttta.c: - Use GST_LICENSE, GST_PACKAGE_NAME and GST_PACKAGE_ORIGIN instead - of hardcoding values where possible. Fixes bug #522212. - -2008-03-13 09:45:09 +0000 Wouter Cloetens <wouter@mind.be> - - ext/soup/gstsouphttpsrc.*: Try to resume on server disconnect. Fixes bug #522134. - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_init), - (gst_soup_http_src_finished_cb), (gst_soup_http_src_response_cb), - (gst_soup_http_src_build_message), (gst_soup_http_src_create): - * ext/soup/gstsouphttpsrc.h: - Try to resume on server disconnect. Fixes bug #522134. - -2008-03-12 18:44:58 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/xvid/gstxvidenc.c: Set correct pixel aspect ratio for the encoder. - Original commit message from CVS: - * ext/xvid/gstxvidenc.c: (gst_xvidenc_chain): - Set correct pixel aspect ratio for the encoder. - -2008-03-11 12:40:58 +0000 Olivier Crete <tester@tester.ca> - - gst/rtpmanager/rtpsession.*: Implement collision and loop detection in rtpmanager. - Original commit message from CVS: - Patch by: Olivier Crete <tester at tester dot ca> - * gst/rtpmanager/rtpsession.c: (find_add_conflicting_addresses), - (check_collision), (obtain_source), (rtp_session_create_new_ssrc), - (rtp_session_create_source), (rtp_session_process_rtp), - (rtp_session_process_sr), (rtp_session_process_rr), - (rtp_session_process_sdes), (rtp_session_process_bye), - (rtp_session_send_bye_locked), (rtp_session_send_bye), - (rtp_session_on_timeout): - * gst/rtpmanager/rtpsession.h: - Implement collision and loop detection in rtpmanager. - Fixes #520626. - * gst/rtpmanager/rtpsource.c: (rtp_source_reset), - (rtp_source_init): - * gst/rtpmanager/rtpsource.h: - Add method to reset stats. - -2008-03-11 11:36:03 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - gst/rtpmanager/gstrtpsession.c: Avoid a deadlock when joining the RTCP thread in PAUSED because it might be blocked d... - Original commit message from CVS: - Based on patch by: Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_init), - (rtcp_thread), (start_rtcp_thread), (stop_rtcp_thread), - (join_rtcp_thread), (gst_rtp_session_change_state): - Avoid a deadlock when joining the RTCP thread in PAUSED because it might - be blocked downstream. Also avoid spawning multiple rtcp threads. - Fixes #520894. - -2008-03-11 10:43:32 +0000 Stefan Kost <ensonic@users.sf.net> - - gst/rtpmanager/rtpjitterbuffer.c: Don't try to reset the clock skew when we have no timestamps. - Original commit message from CVS: - Patch by: Stefan Kost <ensonic@users.sf.net> - * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew): - Don't try to reset the clock skew when we have no timestamps. - Fixes #519005. - -2008-03-08 04:27:03 +0000 Sjoerd Simons <sjoerd@luon.net> - - ext/faad/gstfaad.c: Improve the header checking to look for what faad2 looks for too. Fixes playback of same apple tr... - Original commit message from CVS: - Patch by: Sjoerd Simons <sjoerd at luon dot net> - * ext/faad/gstfaad.c: (looks_like_valid_header): - Improve the header checking to look for what faad2 looks - for too. Fixes playback of same apple trailers. - Fixes bug #469979. - -2008-03-07 13:28:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Really check for libdc1394 >= 2.0.0, pkg-config thinks that 2.0.0-rcX is newer than 2.0.0 so we check f... - Original commit message from CVS: - * configure.ac: - Really check for libdc1394 >= 2.0.0, pkg-config thinks that - 2.0.0-rcX is newer than 2.0.0 so we check for this too. - -2008-03-06 07:03:09 +0000 David Schleef <ds@schleef.org> - - ext/dirac/gstdiracenc.cc: Add a bunch of properties cribbed from the encoder program in dirac. - Original commit message from CVS: - * ext/dirac/gstdiracenc.cc: Add a bunch of properties cribbed - from the encoder program in dirac. - -2008-03-06 03:16:13 +0000 David Schleef <ds@schleef.org> - - Rewrite Dirac encoder plugin based on Schroedinger gstreamer elements. - Original commit message from CVS: - * configure.ac: - * ext/Makefile.am: - * ext/dirac/Makefile.am: - * ext/dirac/gstdirac.cc: - * ext/dirac/gstdiracenc.cc: - Rewrite Dirac encoder plugin based on Schroedinger gstreamer - elements. - -2008-03-05 06:03:03 +0000 Mark Nauwelaerts <manauw@skynet.be> - - Port mplex element to 0.10. Fixes bug #520329. - Original commit message from CVS: - Patch by: Mark Nauwelaerts <manauw at skynet dot be> - * configure.ac: - * ext/Makefile.am: - * ext/mplex/Makefile.am: - * ext/mplex/gstmplex.cc: - * ext/mplex/gstmplex.hh: - * ext/mplex/gstmplexibitstream.cc: - * ext/mplex/gstmplexibitstream.hh: - * ext/mplex/gstmplexjob.cc: - * ext/mplex/gstmplexjob.hh: - * ext/mplex/gstmplexoutputstream.cc: - * ext/mplex/gstmplexoutputstream.hh: - Port mplex element to 0.10. Fixes bug #520329. - * tests/check/Makefile.am: - * tests/check/elements/mplex.c: (test_sink_event), (setup_src_pad), - (teardown_src_pad), (setup_mplex), (cleanup_mplex), - (GST_START_TEST), (mplex_suite), (main): - Add unit test for the mplex element. - -2008-03-05 05:38:06 +0000 Mark Nauwelaerts <manauw@skynet.be> - - configure.ac: Clean up detection of different mjpegtoolsAPI versions. - Original commit message from CVS: - Patch by: Mark Nauwelaerts <manauw at skynet dot be> - * configure.ac: - Clean up detection of different mjpegtoolsAPI versions. - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mpeg2enc/gstmpeg2enc.hh: - * ext/mpeg2enc/gstmpeg2encoder.cc: - * ext/mpeg2enc/gstmpeg2encoptions.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.hh: - * ext/mpeg2enc/gstmpeg2encstreamwriter.cc: - * ext/mpeg2enc/gstmpeg2encstreamwriter.hh: - Streamline conditional code for evolving mjpegtools API, - optimize and fix/prevent crash in log handling, use - names/nicks for enums in the usual way andm inor updates - in code and properties/settings. Partially fixes bug #520329. - -2008-03-04 17:49:15 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/: Add parsing of cable delivery system descriptor. - Original commit message from CVS: - * gst/mpegtsparse/gstmpegdesc.h: - * gst/mpegtsparse/mpegtspacketizer.c: - Add parsing of cable delivery system descriptor. - -2008-03-03 12:48:56 +0000 Peter Kjellerstedt <pkj@axis.com> - - configure.ac: Use AG_GST_CHECK_PLUGIN and AG_GST_DISABLE_PLUGIN to simplify which plug-ins are included/excluded. (#4... - Original commit message from CVS: - * configure.ac: - Use AG_GST_CHECK_PLUGIN and AG_GST_DISABLE_PLUGIN to simplify which - plug-ins are included/excluded. (#498222) - -2008-03-03 06:04:02 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Correct all relevant warnings found by the sparse semantic code analyzer. This include marking several symbols static... - Original commit message from CVS: - * ext/alsa/gstalsamixertrack.c: (gst_alsa_mixer_track_get_type): - * ext/alsa/gstalsasink.c: (set_hwparams): - * ext/alsa/gstalsasrc.c: (set_hwparams): - * ext/gio/gstgio.c: (gst_gio_uri_handler_get_uri): - * ext/ogg/gstoggmux.h: - * ext/ogg/gstogmparse.c: - * gst-libs/gst/audio/audio.c: - * gst-libs/gst/fft/kiss_fft_f64.c: (kiss_fft_f64_alloc): - * gst-libs/gst/pbutils/missing-plugins.c: - (gst_missing_uri_sink_message_new), - (gst_missing_element_message_new), - (gst_missing_decoder_message_new), - (gst_missing_encoder_message_new): - * gst-libs/gst/rtp/gstbasertppayload.c: - * gst-libs/gst/rtp/gstrtcpbuffer.c: - (gst_rtcp_packet_bye_get_reason): - * gst/audioconvert/gstaudioconvert.c: - * gst/audioresample/gstaudioresample.c: - * gst/ffmpegcolorspace/imgconvert.c: - * gst/playback/test.c: (gen_video_element), (gen_audio_element): - * gst/typefind/gsttypefindfunctions.c: - * gst/videoscale/vs_4tap.c: - * gst/videoscale/vs_4tap.h: - * sys/v4l/gstv4lelement.c: - * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_get_any_caps): - * sys/v4l/v4l_calls.c: - * sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_capture_init), - (gst_v4lsrc_try_capture): - * sys/ximage/ximagesink.c: (gst_ximagesink_check_xshm_calls), - (gst_ximagesink_ximage_new): - * sys/xvimage/xvimagesink.c: (gst_xvimagesink_check_xshm_calls), - (gst_xvimagesink_xvimage_new): - * tests/check/elements/audioconvert.c: - * tests/check/elements/audioresample.c: - (fail_unless_perfect_stream): - * tests/check/elements/audiotestsrc.c: (setup_audiotestsrc): - * tests/check/elements/decodebin.c: - * tests/check/elements/gdpdepay.c: (setup_gdpdepay), - (setup_gdpdepay_streamheader): - * tests/check/elements/gdppay.c: (setup_gdppay), (GST_START_TEST), - (setup_gdppay_streamheader): - * tests/check/elements/gnomevfssink.c: (setup_gnomevfssink): - * tests/check/elements/multifdsink.c: (setup_multifdsink): - * tests/check/elements/textoverlay.c: - * tests/check/elements/videorate.c: (setup_videorate): - * tests/check/elements/videotestsrc.c: (setup_videotestsrc): - * tests/check/elements/volume.c: (setup_volume): - * tests/check/elements/vorbisdec.c: (setup_vorbisdec): - * tests/check/elements/vorbistag.c: - * tests/check/generic/clock-selection.c: - * tests/check/generic/states.c: (setup), (teardown): - * tests/check/libs/cddabasesrc.c: - * tests/check/libs/video.c: - * tests/check/pipelines/gio.c: - * tests/check/pipelines/oggmux.c: - * tests/check/pipelines/simple-launch-lines.c: - (simple_launch_lines_suite): - * tests/check/pipelines/streamheader.c: - * tests/check/pipelines/theoraenc.c: - * tests/check/pipelines/vorbisdec.c: - * tests/check/pipelines/vorbisenc.c: - * tests/examples/seek/scrubby.c: - * tests/examples/seek/seek.c: (query_positions_elems), - (query_positions_pads): - * tests/icles/stress-xoverlay.c: (myclock): - Correct all relevant warnings found by the sparse semantic code - analyzer. This include marking several symbols static, using - NULL instead of 0 for pointers and using "foo (void)" instead - of "foo ()" for declarations. - * win32/common/libgstrtp.def: - Add gst_rtp_buffer_set_extension_data to the symbol definition file. - -2008-03-03 04:39:48 +0000 Jens Granseuer <jensgr@gmx.net> - - gst/mve/gstmvedemux.c: Fix audio discontinuity that happens when silent chunks are followed by real data again. Fixes... - Original commit message from CVS: - Patch by: Jens Granseuer <jensgr at gmx dot net> - * gst/mve/gstmvedemux.c: (gst_mve_audio_data), - (gst_mve_demux_get_type): - Fix audio discontinuity that happens when silent chunks are - followed by real data again. Fixes bug #519905. - -2008-03-01 12:49:13 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/: Add DVB-C support. Special thanks to Christian Schaller for a testing ground. - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/parsechannels.c: - Add DVB-C support. Special thanks to Christian Schaller - for a testing ground. - -2008-02-28 13:22:24 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtsparse.c: Only send PMTs to program pads that the PMT is for even if on same pid. - Original commit message from CVS: - * gst/mpegtsparse/mpegtsparse.c: - Only send PMTs to program pads that the PMT is for even if - on same pid. - As a by-product, we now no longer hardcode any psi pid numbers. - Also remove pcr stream from old pmt when we apply a new pmt. + * gst-libs/gst/codecs/gstav1decoder.c: + cdoecs: av1: Copy system_frame_number in duplicate_picture + The system_frame_number is notably used by V4L2 decoder as a unique + indentifier for the frame that was decoded. This value is used to tell driver + which frame to reference, as V4L2 does not have an efficient mechanism to + otherwise pass back the frames. + For this reason, and because it is more ligical, copy the original + system_frame_number into the duplicate picture instead of using the current + frame. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1992> -2008-02-28 10:41:56 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-03-21 22:03:53 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * ext/metadata/TODO: - * ext/metadata/metadata_mapping.htm: - * ext/metadata/metadataexif.c: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - * tests/icles/metadata_editor.c: - Map Date-Time and GPS tags and Convert from EXIF to XMP Datatime as local time (those changes has been done in previo... - Original commit message from CVS: - Map Date-Time and GPS tags and Convert from EXIF to XMP Datatime as local time (those changes has been done in previous comit but had to be revert in 2008-02-10 due to frozen) - -2008-02-27 23:29:44 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/camutils.c: Remove the G_VALUE_HOLDS_BOXED checks. They were only added to help debug the data corruption. - Original commit message from CVS: - * sys/dvb/camutils.c: - Remove the G_VALUE_HOLDS_BOXED checks. They were - only added to help debug the data corruption. - -2008-02-27 19:41:13 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/camutils.c: Don't free the program descriptors, this structure containing them is stills tored after. - Original commit message from CVS: - * sys/dvb/camutils.c: - Don't free the program descriptors, this structure - containing them is stills tored after. - Fixes data corruption. - -2008-02-27 12:34:00 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/camutils.c: Extra checks to prevent data corruption/segfaults. - Original commit message from CVS: - * sys/dvb/camutils.c: - Extra checks to prevent data corruption/segfaults. - -2008-02-26 15:13:54 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - update spec file - Original commit message from CVS: - update spec file - -2008-02-26 12:04:21 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/nas/nassink.c: Fix build warning by using portable API. - Original commit message from CVS: - * ext/nas/nassink.c: - Fix build warning by using portable API. - -2008-02-26 12:01:37 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/selector/gstoutputselector.c: Fix changing to same pad twice before a chain call. - Original commit message from CVS: - * gst/selector/gstoutputselector.c: - Fix changing to same pad twice before a chain call. - -2008-02-26 05:54:26 +0000 Daniel Fischer <dan@f3c.com> - - Add support for libdc1394 2.0.0 and above and require this version now. Fixes bug #514964. - Original commit message from CVS: - Patch by: Daniel Fischer <dan at f3c dot com> - * configure.ac: - * ext/dc1394/gstdc1394.c: (gst_dc1394_change_state), - (gst_dc1394_get_cam_caps), (gst_dc1394_open_cam_with_best_caps): - * ext/dc1394/gstdc1394.h: - Add support for libdc1394 2.0.0 and above and require this version - now. Fixes bug #514964. - -2008-02-26 05:36:17 +0000 Wouter Cloetens <wouter@mind.be> - - Add support for specifying a list of cookies to be passed in the HTTP request. Fixes bug #518722. - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_class_init), - (gst_soup_http_src_init), (gst_soup_http_src_dispose), - (gst_soup_http_src_set_property), (gst_soup_http_src_get_property), - (gst_soup_http_src_create): - * ext/soup/gstsouphttpsrc.h: - * tests/check/elements/souphttpsrc.c: (run_test), (GST_START_TEST), - (souphttpsrc_suite): - Add support for specifying a list of cookies to be passed in - the HTTP request. Fixes bug #518722. - -2008-02-25 08:53:51 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/selector/gstinputselector.*: Added "select-all" property to make it work like aggregator in 0.8. - Original commit message from CVS: - * gst/selector/gstinputselector.c: - * gst/selector/gstinputselector.h: - Added "select-all" property to make it work like aggregator in 0.8. - * gst/selector/gstoutputselector.c: - Fix resend-latest behavoiur. - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/selector.c: - Add unit tests for selector. - -2008-02-25 06:29:12 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Remove midi typefinders and require base CVS as they moved there. - Original commit message from CVS: - * configure.ac: - * ext/timidity/gsttimidity.c: (plugin_init): - * ext/timidity/gstwildmidi.c: (plugin_init): - Remove midi typefinders and require base CVS as they moved there. - -2008-02-24 09:57:42 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/Makefile.am: Only disable the ext/timidity directory if both, wildmidi _and_ timidity are not available. - Original commit message from CVS: - * ext/Makefile.am: - Only disable the ext/timidity directory if both, wildmidi - _and_ timidity are not available. - -2008-02-24 04:24:20 +0000 Emilio Pozuelo Monfort <pochu@ubuntu.com> - - ext/Makefile.am: Build the wildmidi plugin if it's enabled and not only when both, the timidity and wildmidi plugin, ... - Original commit message from CVS: - Patch by: Emilio Pozuelo Monfort <pochu at ubuntu dot com> - * ext/Makefile.am: - Build the wildmidi plugin if it's enabled and not only when - both, the timidity and wildmidi plugin, are enabled. - -2008-02-23 15:01:32 +0000 Tim-Philipp Müller <tim@centricular.net> - - Check for and define ERROR_CXXFLAGS and GST_CXXFLAGS and use them when building C++ code. - Original commit message from CVS: - * configure.ac: - * ext/mpeg2enc/Makefile.am: - * ext/soundtouch/Makefile.am: - * gst/modplug/Makefile.am: - Check for and define ERROR_CXXFLAGS and GST_CXXFLAGS and use them - when building C++ code. - -2008-02-23 11:56:41 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: Add initial support for multiproto driver (not yet merged into v4l-dvb mainline yet). - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - Add initial support for multiproto driver (not yet merged into - v4l-dvb mainline yet). - Only works for DVB-S not DVB-S2, DVB-T, DVB-C or other. - -2008-02-22 10:18:27 +0000 Tim-Philipp Müller <tim@centricular.net> - - docs/plugins/inspect/: Update to version 0.10.6.1. - Original commit message from CVS: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-app.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-flvdemux.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-interleave.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegtsparse.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-speexresample.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-tremor.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - Update to version 0.10.6.1. - -2008-02-22 09:56:49 +0000 Tim-Philipp Müller <tim@centricular.net> - - docs/plugins/: Remove docs for elements that have moved to other modules or been renamed. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-quicktime.xml: - * docs/plugins/inspect/plugin-switch.xml: - * docs/plugins/inspect/plugin-videocrop.xml: - Remove docs for elements that have moved to other modules - or been renamed. - -2008-02-22 07:20:03 +0000 Wouter Cloetens <wouter@mind.be> - - Implement zero-copy and make the buffer size configurable. - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * configure.ac: - * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_cancel_message), - (gst_soup_http_src_finished_cb), (gst_soup_http_src_chunk_free), - (gst_soup_http_src_chunk_allocator), - (gst_soup_http_src_got_chunk_cb), (gst_soup_http_src_create), - (gst_soup_http_src_start), (gst_soup_http_src_set_proxy): - * ext/soup/gstsouphttpsrc.h: - Implement zero-copy and make the buffer size configurable. - Prefix proxy URIs with "http://" if they don't start with it - already and catch errors earlier, fixes hanging in some situations. - Fixes bug #514948. - -2008-02-22 06:42:28 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/gst-plugins-bad.supp: Add suppressions for SoundTouch valgrind warnings and a valgrind warning caused by ... - Original commit message from CVS: - * tests/check/gst-plugins-bad.supp: - Add suppressions for SoundTouch valgrind warnings and - a valgrind warning caused by the LADSPA sine plugin and - happening on every exit(). - Remove GIO suppressions as it's now in -base. - -2008-02-22 06:33:49 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/mythtv/gstmythtvsrc.c: Don't allocate and copy the data to a new place but instead put the data from gmyth (which... - Original commit message from CVS: - * ext/mythtv/gstmythtvsrc.c: (gst_mythtv_src_create): - Don't allocate and copy the data to a new place but instead - put the data from gmyth (which we own) into the buffers that - are passed downstream. - -2008-02-22 06:31:44 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/timidity/gstwildmidi.c: If WILDMIDI_CFG is not defined, define it to the default timidity configure file. - Original commit message from CVS: - * ext/timidity/gstwildmidi.c: - If WILDMIDI_CFG is not defined, define it to the default - timidity configure file. - -2008-02-22 06:12:07 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Remove hack to work with mjpegtools 1.9.0rc3 and above and instead use mjpeg_loglev_t() for getting the log levels. C... - Original commit message from CVS: - Based on a patch by: - Hans de Goede <j dot w dot r dot degoede at hhs dot nl> - * configure.ac: - * ext/mpeg2enc/gstmpeg2enc.cc: - Remove hack to work with mjpegtools 1.9.0rc3 and above and instead - use mjpeg_loglev_t() for getting the log levels. Check for this - function in configure.ac as the pkg-config file doesn't tell us - which release candidate we have. Fixes bug #517896. - -2008-02-22 05:48:33 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Check for X for the nas plugin to make it possible to build it again. Fixes bug #517895. - Original commit message from CVS: - * configure.ac: - Check for X for the nas plugin to make it possible to build it - again. Fixes bug #517895. - -2008-02-22 05:42:16 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/Makefile.am: Ignore some more elements for the states unit test, like dfbvideosink which produces a segfa... - Original commit message from CVS: - * tests/check/Makefile.am: - Ignore some more elements for the states unit test, like - dfbvideosink which produces a segfault. Fixes bug #517854. - -2008-02-22 05:33:59 +0000 Jens Granseuer <jensgr@gmx.net> - - Some C89 fixes, moving variable declarations to the beginning of a block. Fixes bug #517937. - Original commit message from CVS: - Patch by: Jens Granseuer <jensgr at gmx dot net> - * gst/librfb/gstrfbsrc.c: (gst_rfb_property_set_version): - * gst/librfb/rfbdecoder.c: (rfb_decoder_message_set_encodings), - (rfb_decoder_state_set_encodings): - * gst/mpegtsparse/mpegtspacketizer.c: - (mpegts_packetizer_parse_nit), (mpegts_packetizer_parse_sdt), - (mpegts_packetizer_parse_eit): - * sys/fbdev/gstfbdevsink.c: (gst_fbdevsink_getcaps), - (gst_fbdevsink_setcaps), (gst_fbdevsink_render): - Some C89 fixes, moving variable declarations to the beginning - of a block. Fixes bug #517937. - -2008-02-21 23:50:31 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Back to development... - Original commit message from CVS: - * configure.ac: - Back to development... + * sys/va/meson.build: + meson: va: Define GST_USE_UNSTABLE_API + Remove extra_c_args which is not defined in this meson file at all, + and define GST_USE_UNSTABLE_API to avoid build warnings + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1999> -=== release 0.10.6 === +2022-03-16 13:17:21 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> -2008-02-21 00:13:31 +0000 Jan Schmidt <thaytan@mad.scientist.com> + * gst-libs/gst/codecparsers/gstav1parser.c: + * gst-libs/gst/codecparsers/gstav1parser.h: + * gst-libs/gst/codecs/gstav1decoder.c: + codecs: av1: Fix state when we show existing keyframe + Showing existing keyframe have special meaning in AV1. All the references + frame will be refreshed with the original keyframe information. The refresh + process (7.20) is implemented by saving data from the frame_header into the + state. To fix this special case, load all the relevant information into the + frame_header. + As there is nothing happening in between this and the loading of the key-frame + into the state, this patch also remove the separate API function, using it + internally instead. + Fixes #1090 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1971> - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-app.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-flvdemux.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-interleave.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegtsparse.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-speexresample.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-tremor.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - * gst-plugins-bad.doap: - * po/LINGUAS: - * win32/common/config.h: - Release 0.10.6 - A Big Deep Breath - Original commit message from CVS: - Release 0.10.6 - A Big Deep Breath - -2008-02-20 23:35:19 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - * po/af.po: - * po/az.po: - * po/bg.po: - * po/cs.po: - * po/da.po: - * po/en_GB.po: - * po/es.po: - * po/fi.po: - * po/hu.po: - * po/it.po: - * po/ky.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/pl.po: - * po/pt_BR.po: - * po/sk.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - * po/zh_CN.po: - Update .po files - Original commit message from CVS: - Update .po files - -2008-02-20 16:04:32 +0000 Bastien Nocera <hadess@hadess.net> - - ext/mythtv/gstmythtvsrc.c: Using the wrong GstFormat for the filesize, and fail seek properly on anything but _BYTES ... - Original commit message from CVS: - 2008-02-20 Bastien Nocera <hadess@hadess.net> - * ext/mythtv/gstmythtvsrc.c: (gst_mythtv_src_do_seek), - (gst_mythtv_src_start): Using the wrong GstFormat for the filesize, - and fail seek properly on anything but _BYTES format - Fixes bug #517684 - -2008-02-20 09:33:25 +0000 Olivier Crete <tester@tester.ca> - - gst/rtpmanager/gstrtpbin.c: Fix small memory leak, leaking caps. Fixes #bug 517571. - Original commit message from CVS: - Patch by: Olivier Crete <tester at tester dot ca> - * gst/rtpmanager/gstrtpbin.c: (new_ssrc_pad_found): - Fix small memory leak, leaking caps. Fixes #bug 517571. - -2008-02-19 11:50:45 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - change gmyth-1.0 to gmyth - Original commit message from CVS: - change gmyth-1.0 to gmyth - -2008-02-19 10:51:34 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/tta/Makefile.am: Link tta plugin with libm. Fixes bug #517391. - Original commit message from CVS: - * gst/tta/Makefile.am: - Link tta plugin with libm. Fixes bug #517391. - -2008-02-14 17:09:38 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/camutils.c: Do not assume "descriptors" property in the pmt structure is present. - Original commit message from CVS: - * sys/dvb/camutils.c: - Do not assume "descriptors" property in the pmt structure - is present. - Fixes #516499. - -2008-02-14 16:25:51 +0000 Olivier Crete <tester@tester.ca> - - gst/rtpmanager/gstrtpbin.c: Ignore streams that did not receive an SR packet when doing synchronisation. Fixes #516160. - Original commit message from CVS: - Patch by: Olivier Crete <tester@tester.ca> - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate): - Ignore streams that did not receive an SR packet when doing - synchronisation. Fixes #516160. - -2008-02-14 14:33:27 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/dvdspu/gstdvdspu.c: Set n_line_ctrl_i to 0 whenever we free line_ctrl_i. Patch based on an idea by Jan Schmidt, f... - Original commit message from CVS: - * gst/dvdspu/gstdvdspu.c: (gst_dvd_spu_handle_new_spu_buf): - Set n_line_ctrl_i to 0 whenever we free line_ctrl_i. Patch based - on an idea by Jan Schmidt, fixes bug #516436. - -2008-02-14 14:22:57 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/: Make sure the gstmpegdesc debug lines do not critical when GST_DEBUG is enabled and also actually o... - Original commit message from CVS: - * gst/mpegtsparse/gstmpegdesc.c: - * gst/mpegtsparse/gstmpegdesc.h: - * gst/mpegtsparse/mpegtsparse.c: - Make sure the gstmpegdesc debug lines do not critical - when GST_DEBUG is enabled and also actually output. - Thanks to Alessandro Decina for spotting. - Fixes #516448 - -2008-02-13 23:52:42 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Also add dshow pieces to the disted subdirs to fix distcheck. - Original commit message from CVS: - * gst-libs/gst/Makefile.am: - * sys/Makefile.am: - Also add dshow pieces to the disted subdirs to fix distcheck. - -2008-02-13 14:40:33 +0000 Josep Torra Valles <josep@fluendo.com> - - gst/h264parse/gsth264parse.c: Fix potential buffer leak in reverse mode. Re-Fixes #516061. - Original commit message from CVS: - Patch by: Josep Torra Valles <josep@fluendo.com> - * gst/h264parse/gsth264parse.c: (gst_h264_parse_chain_reverse): - Fix potential buffer leak in reverse mode. Re-Fixes #516061. - -2008-02-13 11:22:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Allow gmyth versions from 0.4 up to 0.7.99, the API didn't change until 0.7 fortunately. - Original commit message from CVS: - * configure.ac: - Allow gmyth versions from 0.4 up to 0.7.99, the API didn't change - until 0.7 fortunately. - -2008-02-12 23:16:21 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Generate the directshow Makefiles so that the directories get disted. Still needs some configure time d... - Original commit message from CVS: - * configure.ac: - Generate the directshow Makefiles so that the directories - get disted. Still needs some configure time detection to enable - building them under MingW. - -2008-02-12 23:13:55 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/metadata/Makefile.am: Don't install a header file. We will have to merge these tags into libgsttag after the rele... - Original commit message from CVS: - * ext/metadata/Makefile.am: - Don't install a header file. We will have to merge these - tags into libgsttag after the release and use them from there. - Fixes: #515860 - -2008-02-12 22:10:39 +0000 Sébastien Moutte <sebastien@moutte.net> - - Add Makefiles to win32 plugins and lib. - Original commit message from CVS: - * gst-libs/gst/dshow/Makefile.am: - * sys/dshowdecwrapper/Makefile.am: - * sys/dshowsrcwrapper/Makefile.am: - Add Makefiles to win32 plugins and lib. - They will need to be tested and probably fixed by developers - working with mingw. This is a first step to include source files - with releases. - -2008-02-12 21:31:57 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/dvbbasebin.c: Fix leak of location string returned from gst_uri_get_location. - Original commit message from CVS: - * sys/dvb/dvbbasebin.c: - Fix leak of location string returned from gst_uri_get_location. - Fixes bug #516114 - -2008-02-12 21:01:17 +0000 David Schleef <ds@schleef.org> - - Remove glimagesink, as it's been moved to gst-plugins-gl. - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/inspect/plugin-glimagesink.xml: - * sys/Makefile.am: - * sys/glsink/BUGS: - * sys/glsink/Makefile.am: - * sys/glsink/color_matrix.c: - * sys/glsink/glextensions.c: - * sys/glsink/glextensions.h: - * sys/glsink/glimagesink.c: - * sys/glsink/glimagesink.h: - * sys/glsink/gltestsrc.c: - * sys/glsink/gltestsrc.h: - * sys/glsink/gstglbuffer.c: - * sys/glsink/gstglbuffer.h: - * sys/glsink/gstglconvert.c: - * sys/glsink/gstgldisplay.c: - * sys/glsink/gstgldisplay.h: - * sys/glsink/gstgldownload.c: - * sys/glsink/gstglfilter.c: - * sys/glsink/gstglfilter.h: - * sys/glsink/gstglfilterexample.c: - * sys/glsink/gstgltestsrc.c: - * sys/glsink/gstgltestsrc.h: - * sys/glsink/gstglupload.c: - * sys/glsink/gstopengl.c: - Remove glimagesink, as it's been moved to gst-plugins-gl. - Fixes #516094. - -2008-02-12 18:29:29 +0000 Josep Torra Valles <josep@fluendo.com> - - gst/h264parse/gsth264parse.c: Fix potential buffer leak in reverse mode. Fixes #516061. - Original commit message from CVS: - Patch by: Josep Torra Valles <josep@fluendo.com> - * gst/h264parse/gsth264parse.c: (gst_h264_parse_chain_reverse): - Fix potential buffer leak in reverse mode. Fixes #516061. - -2008-02-12 11:08:27 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - sys/dshowdecwrapper/: Chain up dispose methods properly. Fixes bug #515970. - Original commit message from CVS: - * sys/dshowdecwrapper/gstdshowaudiodec.c: - (gst_dshowaudiodec_dispose): - * sys/dshowdecwrapper/gstdshowvideodec.c: - (gst_dshowvideodec_dispose): - Chain up dispose methods properly. Fixes bug #515970. +2022-03-18 13:04:59 +0100 Jakub Adam <jakub.adam@collabora.com> -2008-02-12 11:02:37 +0000 Jan Schmidt <thaytan@mad.scientist.com> + * sys/d3d11/gstd3d11screencapture.cpp: + d3d11: Fix some typos + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1985> - * ChangeLog: - Changelog surgery: mention bug 515919 fixed in my previous commit - Original commit message from CVS: - Changelog surgery: mention bug 515919 fixed in my previous commit - -2008-02-12 10:57:27 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/mpegvideoparse/mpegvideoparse.c: Fix leaking caps. - Original commit message from CVS: - * gst/mpegvideoparse/mpegvideoparse.c: - (mpegvideoparse_handle_sequence), (mpegvideoparse_drain_avail), - (gst_mpegvideoparse_change_state): - Fix leaking caps. - Fix potential buffer leak in forward mode. - Cleanup queues when going to READY. Fixes #515815. - -2008-02-12 10:24:03 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - docs/plugins/: Remove documentation for the GIO plugin as it was moved to gst-plugins-base. Fixes bug #515964. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-gio.xml: - Remove documentation for the GIO plugin as it was moved to - gst-plugins-base. Fixes bug #515964. - -2008-02-12 10:22:42 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Fix some finalize leaks by chaining up to the parent method. - Original commit message from CVS: - * ext/xvid/gstxvidenc.c: - * gst/vmnc/vmncdec.c: - * sys/glsink/glimagesink.c: - * sys/glsink/gstgldisplay.c: - Fix some finalize leaks by chaining up to the parent method. - -2008-02-12 05:21:46 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/souphttpsrc.c: Include glib/gprintf.h for g_vasprintf(). Fixes bug #515564. - Original commit message from CVS: - * tests/check/elements/souphttpsrc.c: - Include glib/gprintf.h for g_vasprintf(). Fixes bug #515564. - -2008-02-12 05:19:05 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/librfb/gstrfbsrc.c: Free the rfb decoder on finalize. Fixes bug #515721. - Original commit message from CVS: - * gst/librfb/gstrfbsrc.c: (gst_rfb_src_dispose): - Free the rfb decoder on finalize. Fixes bug #515721. - -2008-02-11 13:34:47 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - sys/fbdev/gstfbdevsink.c: Free the device string in finalize. Fixes bug #515722. - Original commit message from CVS: - * sys/fbdev/gstfbdevsink.c: (gst_fbdevsink_class_init), - (gst_fbdevsink_finalize): - Free the device string in finalize. Fixes bug #515722. - -2008-02-11 13:33:10 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/xvid/gstxvidenc.c: Unset GValues after using them. Fixes bug #515720. - Original commit message from CVS: - * ext/xvid/gstxvidenc.c: (gst_xvidenc_init): - Unset GValues after using them. Fixes bug #515720. - -2008-02-11 05:11:27 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/Makefile.am: Disable the dvb plugin for the states test. Fixes bug #515567. - Original commit message from CVS: - * tests/check/Makefile.am: - Disable the dvb plugin for the states test. Fixes bug #515567. +2022-03-18 13:42:27 +0530 Nirbheek Chauhan <nirbheek@centricular.com> -2008-02-10 21:03:54 +0000 Edgard Lima <edgard.lima@indt.org.br> + * meson.build: + meson: Bump all meson requirements to 0.60 + Lots of new warnings ever since + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1934 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1977> - * ChangeLog: - * ext/metadata/TODO: - * ext/metadata/metadata_mapping.htm: - * ext/metadata/metadataexif.c: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - * tests/icles/metadata_editor.c: - Revert changes to 2008-02-09 due to frozen. - Original commit message from CVS: - Revert changes to 2008-02-09 due to frozen. +2022-03-18 13:37:30 +0530 Nirbheek Chauhan <nirbheek@centricular.com> -2008-02-10 19:44:50 +0000 Jan Schmidt <thaytan@mad.scientist.com> + * ext/openexr/gstopenexrdec.cpp: + openexr: Fix some warnings + ``` + ../subprojects/gst-plugins-bad/ext/openexr/gstopenexrdec.cpp:46:24: warning: ‘Imf_3_1::Int64’ is deprecated: use uint64_t -Wdeprecated-declarations + 46 | virtual Int64 tellg (); + | ^ + In file included from ../subprojects/gst-plugins-bad/ext/openexr/gstopenexrdec.cpp:32: + /usr/include/OpenEXR/ImfInt64.h:23:32: note: declared here + 23 | typedef IMATH_NAMESPACE::Int64 Int64; + | ^~~~~ + ../subprojects/gst-plugins-bad/ext/openexr/gstopenexrdec.cpp:47:32: warning: ‘Imf_3_1::Int64’ is deprecated: use uint64_t -Wdeprecated-declarations + 47 | virtual void seekg (Int64 pos); + | ^ + In file included from ../subprojects/gst-plugins-bad/ext/openexr/gstopenexrdec.cpp:32: + /usr/include/OpenEXR/ImfInt64.h:23:32: note: declared here + 23 | typedef IMATH_NAMESPACE::Int64 Int64; + | ^~~~~ + ../subprojects/gst-plugins-bad/ext/openexr/gstopenexrdec.cpp:67:26: warning: ‘Imf_3_1::Int64’ is deprecated: use uint64_t -Wdeprecated-declarations + 67 | Int64 MemIStream::tellg () + | ^ + In file included from ../subprojects/gst-plugins-bad/ext/openexr/gstopenexrdec.cpp:32: + /usr/include/OpenEXR/ImfInt64.h:23:32: note: declared here + 23 | typedef IMATH_NAMESPACE::Int64 Int64; + | ^~~~~ + ../subprojects/gst-plugins-bad/ext/openexr/gstopenexrdec.cpp:73:29: warning: ‘Imf_3_1::Int64’ is deprecated: use uint64_t -Wdeprecated-declarations + 73 | MemIStream::seekg (Int64 pos) + | ^ + In file included from ../subprojects/gst-plugins-bad/ext/openexr/gstopenexrdec.cpp:32: + /usr/include/OpenEXR/ImfInt64.h:23:32: note: declared here + 23 | typedef IMATH_NAMESPACE::Int64 Int64; + | ^~~~~ + ``` + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1977> - * ChangeLog: - Fix Josep's surname in the previous few commits - Original commit message from CVS: - Fix Josep's surname in the previous few commits - -2008-02-10 19:01:43 +0000 Josep Torre Valles <josep@fluendo.com> - - ext/ivorbis/vorbisfile.c: Trivial fix for build warning. - Original commit message from CVS: - * ext/ivorbis/vorbisfile.c: - Trivial fix for build warning. - Patch by: Josep Torre Valles <josep@fluendo.com> - Fixes: #515588 +2022-03-18 09:48:46 +0800 He Junyan <junyan.he@intel.com> -2008-02-10 18:36:46 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst-libs/gst/codecparsers/gstav1parser.h: + codecparsers: av1parser: Fix a typo in FilmGrainParams comment. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1974> - * ChangeLog: - * ext/metadata/TODO: - * ext/metadata/metadataexif.c: - Convert from EXIF to XMP DataTime as local time. - Original commit message from CVS: - Convert from EXIF to XMP DataTime as local time. +2022-03-10 17:37:26 +0100 Jakub Adam <jakub.adam@collabora.com> -2008-02-10 04:36:12 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/d3d11/gstd3d11screencapture.cpp: + * sys/d3d11/gstd3d11screencapture.h: + * sys/d3d11/gstd3d11screencapturesrc.cpp: + d3d11screencapturesrc: Allow capturing screen sub-area + Adds crop-x, crop-y, crop-width, crop-height properties specifying the + screen area to capture. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1932> - * ChangeLog: - * ext/metadata/TODO: - * ext/metadata/metadata_mapping.htm: - * ext/metadata/metadataexif.c: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - * tests/icles/metadata_editor.c: - Map Date-Time and GPS tags. - Original commit message from CVS: - Map Date-Time and GPS tags. - -2008-02-09 03:37:40 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/selector/Makefile.am: Listing the marshal.h in the nodist_HEADERS breaks distcheck, so let's not do that - Original commit message from CVS: - * gst/selector/Makefile.am: - Listing the marshal.h in the nodist_HEADERS breaks distcheck, so - let's not do that - * tests/check/Makefile.am: - Disable the crashing cdaudio plugin from the states test so I can make - pre-releases. - -2008-02-09 02:33:06 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - win32/vs6/: Convert to DOS line endings, and set -kb - Original commit message from CVS: - * win32/vs6/libgstdshowdecwrapper.dsp: - * win32/vs6/libgstflv.dsp: - Convert to DOS line endings, and set -kb - -2008-02-08 18:22:08 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/: Add URI Handler for dvb. - Original commit message from CVS: - * sys/dvb/Makefile.am: - * sys/dvb/dvbbasebin.c: - Add URI Handler for dvb. - Re-order pad templates to workaround a bug in playbasebin. - * sys/dvb/parsechannels.c: - * sys/dvb/parsechannels.h: - Add code to parse channels from zap-style channels.conf files. - -2008-02-08 04:22:06 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Remove multifile plugin, which has moved to -good - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-multifile.xml: - * gst/multifile/Makefile.am: - * gst/multifile/gstmultifile.c: - * gst/multifile/gstmultifilesink.c: - * gst/multifile/gstmultifilesink.h: - * gst/multifile/gstmultifilesrc.c: - * gst/multifile/gstmultifilesrc.h: - * gst/multifile/multifile.vproj: - * tests/check/Makefile.am: - * tests/check/elements/multifile.c: - Remove multifile plugin, which has moved to -good - -2008-02-08 03:44:12 +0000 David Schleef <ds@schleef.org> - - gst/multifile/: Use g_file_sget_contents() instead of using stdio functions. - Original commit message from CVS: - * gst/multifile/gstmultifilesink.c: - * gst/multifile/gstmultifilesrc.c: - Use g_file_sget_contents() instead of using stdio functions. - Should be less error prone. - * tests/check/elements/multifile.c: - Create a temporary directory using standard functions instead of - creating a directory in the current dir. - -2008-02-08 03:27:14 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Remove spectrum plugin, which has moved to -good - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-spectrum.xml: - * gst/spectrum/.cvsignore: - * gst/spectrum/Makefile.am: - * gst/spectrum/README: - * gst/spectrum/demo-audiotest.c: - * gst/spectrum/demo-osssrc.c: - * gst/spectrum/gstspectrum.c: - * gst/spectrum/gstspectrum.h: - * gst/spectrum/spectrum.vcproj: - * tests/check/Makefile.am: - * tests/check/elements/spectrum.c: - Remove spectrum plugin, which has moved to -good - -2008-02-08 02:48:54 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - docs/plugins/gst-plugins-bad-plugins.*: Remove equalizer plugin docs - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - Remove equalizer plugin docs - * tests/check/Makefile.am: - Add GST_OPTION_CFLAGS, to get -Werror -Wall into the tests as for - other modules. - * tests/check/elements/multifile.c: - * tests/check/elements/rganalysis.c: - * tests/check/elements/rglimiter.c: - Fix compiler warnings from -Wall -Werror - -2008-02-08 02:00:49 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Remove the equalizer plugin, which has moved to -good - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-equalizer.xml: - * gst/equalizer/.cvsignore: - * gst/equalizer/Makefile.am: - * gst/equalizer/demo.c: - * gst/equalizer/gstiirequalizer.c: - * gst/equalizer/gstiirequalizer.h: - * gst/equalizer/gstiirequalizer10bands.c: - * gst/equalizer/gstiirequalizer10bands.h: - * gst/equalizer/gstiirequalizer3bands.c: - * gst/equalizer/gstiirequalizer3bands.h: - * gst/equalizer/gstiirequalizernbands.c: - * gst/equalizer/gstiirequalizernbands.h: - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/equalizer.c: - Remove the equalizer plugin, which has moved to -good - -2008-02-08 01:12:09 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Make DISABLE_DEPRECATED defined *only* during CVS, not during pre-releases or releases. - Original commit message from CVS: - * configure.ac: - Make DISABLE_DEPRECATED defined *only* during CVS, not during - pre-releases or releases. - -2008-02-08 00:48:30 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - docs/plugins/Makefile.am: Don't scan deleted xingmux header. - Original commit message from CVS: - * docs/plugins/Makefile.am: - Don't scan deleted xingmux header. - -2008-02-08 00:40:34 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Remove the xingmux plugin, as the element has moved into mpegaudioparse in -ugly. - Original commit message from CVS: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-xingheader.xml: - * gst/xingheader/Makefile.am: - * gst/xingheader/gstxingmux.c: - * gst/xingheader/gstxingmux.h: - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/xingmux.c: - * tests/check/elements/xingmux_testdata.h: - Remove the xingmux plugin, as the element has moved into - mpegaudioparse in -ugly. - -2008-02-07 23:37:32 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - docs/plugins/Makefile.am: Remove mention of non-existent headers to fix the build. - Original commit message from CVS: - * docs/plugins/Makefile.am: - Remove mention of non-existent headers to fix the build. - -2008-02-07 23:30:45 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Remove GIO plugin which has now moved to -base. - Original commit message from CVS: - * configure.ac: - * ext/Makefile.am: - * ext/gio/Makefile.am: - * ext/gio/gstgio.c: - * ext/gio/gstgio.h: - * ext/gio/gstgiobasesink.c: - * ext/gio/gstgiobasesink.h: - * ext/gio/gstgiobasesrc.c: - * ext/gio/gstgiobasesrc.h: - * ext/gio/gstgiosink.c: - * ext/gio/gstgiosink.h: - * ext/gio/gstgiosrc.c: - * ext/gio/gstgiosrc.h: - * ext/gio/gstgiostreamsink.c: - * ext/gio/gstgiostreamsink.h: - * ext/gio/gstgiostreamsrc.c: - * ext/gio/gstgiostreamsrc.h: - * tests/check/Makefile.am: - * tests/check/pipelines/.cvsignore: - * tests/check/pipelines/gio.c: - Remove GIO plugin which has now moved to -base. - -2008-02-07 21:53:39 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Remove lpwsinc and bpwsinc elements - they've become audiowsinclimit and audiowsincband respectively, in the gst-plug... - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * gst/filter/Makefile.am: - * gst/filter/filter.vcproj: - * gst/filter/gstbpwsinc.c: - * gst/filter/gstbpwsinc.h: - * gst/filter/gstfilter.c: - * gst/filter/gstfilter.h: - * gst/filter/gstlpwsinc.c: - * gst/filter/gstlpwsinc.h: - * tests/check/Makefile.am: - * tests/check/elements/bpwsinc.c: - * tests/check/elements/lpwsinc.c: - Remove lpwsinc and bpwsinc elements - they've become - audiowsinclimit and audiowsincband respectively, in the - gst-plugins-good audiofx plugin. - -2008-02-07 21:02:19 +0000 Sébastien Moutte <sebastien@moutte.net> - - ext\neon\gstneonhttpsrc.c: Include unistd.h only if _HAVE_UNISTD_H is defined - Original commit message from CVS: - * ext\neon\gstneonhttpsrc.c: - Include unistd.h only if _HAVE_UNISTD_H is defined - * gst\mpegvideoparse\mpegvideoparse.c: - Use G_GUINT64_CONSTANT GLIB macro for constant - * sys\dshowsrcwrapper\gstdshowaudiosrc.c: - * sys\dshowsrcwrapper\gstdshowvideosrc.c: - * sys\dshowdecwrapper\gstdshowaudiodec.c: - * sys\dshowdecwrapper\gstdshowaudiodec.h: - * sys\dshowdecwrapper\gstdshowdecwrapper.c: - * sys\dshowdecwrapper\gstdshowdecwrapper.h: - * sys\dshowdecwrapper\gstdshowvideodec.c - * sys\dshowdecwrapper\gstdshowvideodec.h: - Add a DirectShow decoder wrapper. - * win32\MANIFEST: - Add new win32 files to MANIFEST - * win32\vs6\gst_plugins_bad.dsw: - * win32\vs6\libgstdshow.dsp: - * win32\vs6\libgstdshowdecwrapper.dsp: - * win32\vs6\libgstflv.dsp: - Add new projects to bad workspace - -2008-02-07 14:45:06 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtspacketizer.c: Parse component descriptor. - Original commit message from CVS: - * gst/mpegtsparse/mpegtspacketizer.c: - Parse component descriptor. - * gst/mpegtsparse/mpegtsparse.c: - Add SI pids to every program (but hardcoded currently). +2022-03-15 17:01:59 +0530 Nirbheek Chauhan <nirbheek@centricular.com> -2008-02-07 13:59:41 +0000 Edgard Lima <edgard.lima@indt.org.br> + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: Warn when offer didn't intersect with transceiver caps + We were silently falling back to creating a recvonly offer if the caps + didn't intersect. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1864> - * ChangeLog: - * ext/metadata/metadata_mapping.htm: - * ext/metadata/metadataexif.c: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - * tests/icles/metadata_editor.c: - * tests/icles/metadata_editor.glade: - Add more tags. Improve test app. - Original commit message from CVS: - Add more tags. Improve test app. - -2008-02-07 13:48:20 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/multifile/gstmultifilesink.c: Add a fixme comment. - Original commit message from CVS: - * gst/multifile/gstmultifilesink.c: - Add a fixme comment. - * gst/selector/gstoutputselector.c: - Fix same leak as in input-selector. - * tests/icles/output-selector-test.c: - Improve the test. - -2008-02-07 13:41:11 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/gstspectrum.c: Improve the docs. - Original commit message from CVS: - * gst/spectrum/gstspectrum.c: - Improve the docs. - -2008-02-07 12:05:44 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: The dc1394 plugin seems to use API that was removed or changed before the final 2.0.0 release, so only ... - Original commit message from CVS: - * configure.ac: - The dc1394 plugin seems to use API that was removed or changed - before the final 2.0.0 release, so only build it if 2.0.0-rc5 - is available. Someone needs to port it to the final API. - * ext/dc1394/gstdc1394.c: (gst_dc1394_change_camera_transmission): - Include string.h for memcpy and use g_usleep instead of usleep. - -2008-02-07 10:04:01 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/gstlpwsinc.c: Fix typo in the long description of the element. - Original commit message from CVS: - * gst/filter/gstlpwsinc.c: - Fix typo in the long description of the element. - -2008-02-07 02:06:19 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/xingheader/Makefile.am: Put CFLAGS and LIBS in the right order - Original commit message from CVS: - * gst/xingheader/Makefile.am: - Put CFLAGS and LIBS in the right order - -2008-02-06 18:56:40 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: ximagesrc has moved to -good, so no need to check for the required X libs here any more. - Original commit message from CVS: - * configure.ac: - ximagesrc has moved to -good, so no need to check for - the required X libs here any more. - -2008-02-06 11:07:47 +0000 Wouter Cloetens <wouter@mind.be> - - ext/soup/gstsouphttpsrc.c: Fix memory leak and improve debugging a bit. - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_got_chunk_cb), - (gst_soup_http_src_create): - Fix memory leak and improve debugging a bit. +2022-03-17 13:36:25 +1100 Matthew Waters <matthew@centricular.com> -2008-02-05 17:10:11 +0000 Edgard Lima <edgard.lima@indt.org.br> + * ext/closedcaption/gstccconverter.c: + ccconverter: drop data with a warning if scratch buffers overflow + Instead of asserting which could bring down the entire application. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1972> - * ChangeLog: - * ext/metadata/metadata_mapping.htm: - * ext/metadata/metadataexif.c: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - Add more tags mapping. - Original commit message from CVS: - Add more tags mapping. - -2008-02-05 12:19:46 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtsparse.c: Handle latency queries in src pads. - Original commit message from CVS: - * gst/mpegtsparse/mpegtsparse.c: - Handle latency queries in src pads. - -2008-02-05 11:40:43 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtspacketizer.c: Add flag to both sdt and nit structures to say whether the table is for the actua... - Original commit message from CVS: - * gst/mpegtsparse/mpegtspacketizer.c: - Add flag to both sdt and nit structures to say - whether the table is for the actual network/ts - or not. - -2008-02-05 11:30:49 +0000 Josep Torre Valles <josep@fluendo.com> - - gst/mpegvideoparse/mpegvideoparse.c: Flush packetizer too. - Original commit message from CVS: - Patch by: Josep Torre Valles <josep@fluendo.com> - * gst/mpegvideoparse/mpegvideoparse.c: (gst_mpegvideoparse_flush): - Flush packetizer too. - -2008-02-04 19:15:39 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/ladspa/gstladspa.c: Don't use GST_BOILERPLATE as the stuff generated from it is not used anyway and can't be used. - Original commit message from CVS: - * ext/ladspa/gstladspa.c: (gst_ladspa_base_init), - (gst_ladspa_class_init), (ladspa_describe_plugin), (plugin_init): - Don't use GST_BOILERPLATE as the stuff generated from it is not used - anyway and can't be used. - Store the class struct of the correct type in parent_class. - Pass the LADSPA_Descriptor as class_data to the class_init function - as preparation for the time, when we can add pad templates and friends - in class_init and add a FIXME for that. - Don't use a custom hash table for passing the LADSPA_Descriptors to - base_init but use g_type_set_qdata and g_type_get_qdata. - -2008-02-04 16:22:11 +0000 Edward Hervey <bilboed@bilboed.com> - - ext/mpeg2enc/gstmpeg2encpicturereader.cc: Really fix the build. - Original commit message from CVS: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - Really fix the build. - TODO : Apply spankOmatic2000 on thaytan's rear end. - -2008-02-04 13:12:09 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/mpeg2enc/gstmpeg2encpicturereader.cc: Fix compilation with libmjpegtools 1.8.x. - Original commit message from CVS: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - (GstMpeg2EncPictureReader.StreamPictureParams): - Fix compilation with libmjpegtools 1.8.x. - -2008-02-04 11:48:50 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/ladspa/gstsignalprocessor.c: Don't unref the pad template after adding it. gst_element_class_add_pad_template tak... - Original commit message from CVS: - * ext/ladspa/gstsignalprocessor.c: - (gst_signal_processor_class_add_pad_template): - Don't unref the pad template after adding it. - gst_element_class_add_pad_template takes ownership of it. - -2008-02-03 18:22:18 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/mpeg2enc/gstmpeg2encpicturereader.cc: Use the incoming pixel-aspect-ratio if provided to infer a default aspect r... - Original commit message from CVS: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - Use the incoming pixel-aspect-ratio if provided to infer a - default aspect ratio, which can be overridden using the 'aspect' - property. - Fixes: #499008 - -2008-02-03 17:47:25 +0000 Andrzej Mendel <andrzej.mendel@gmail.com> - - configure.ac: Fix variable naming to make it possible to build the glimagesink plugin. Fixes bug #514093. - Original commit message from CVS: - Patch by: Andrzej Mendel <andrzej dot mendel at gmail dot com> - * configure.ac: - Fix variable naming to make it possible to build the glimagesink - plugin. Fixes bug #514093. - -2008-02-02 23:25:10 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/metadata/gstmetadatademux.c: Demote metadatademux to GST_RANK_NONE for the release, it's not ready to be autoplug... - Original commit message from CVS: - * ext/metadata/gstmetadatademux.c: - Demote metadatademux to GST_RANK_NONE for the release, it's not - ready to be autoplugged yet. - * tests/icles/metadata_editor.c: - Fix printf format warning for GType on ppc32 by removing it, - since it doesn't make sense to print the GType value anyway. +2022-03-11 17:02:55 +0000 Philippe Normand <philn@igalia.com> -2008-02-02 20:22:19 +0000 Edgard Lima <edgard.lima@indt.org.br> + * ext/wpe/WPEThreadedView.cpp: + wpe: Reintroduce persistent WebContext + A WebContext leak was introduced in MR + https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2252. + If we wanted one WebContext per WebView we should also unref the + WebKitWebContext when destroying the WebView. + This patch reintroduces the persistent WebContext, initially part of + https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1484. + Fixes #1084 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1933> - * ChangeLog: - * common: - * ext/metadata/TODO: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/metadata_mapping.htm: - * ext/metadata/metadataexif.c: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - Map more Exif tags. - Original commit message from CVS: - Map more Exif tags. - -2008-02-01 17:08:18 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/selector/gstinputselector.c: Don't leak event on pads that are not linked. Fixes #512826. - Original commit message from CVS: - * gst/selector/gstinputselector.c: (gst_selector_pad_event): - Don't leak event on pads that are not linked. Fixes #512826. - -2008-02-01 13:02:53 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Bump core/base requirements to released versions, to avoid confusion. - Original commit message from CVS: - * configure.ac: - Bump core/base requirements to released versions, to avoid confusion. - * gst/deinterlace/Makefile.am: - * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_set_caps): - Use the new GstVideoFormat API to get strides, plane offsets etc.. - For Y42B we still need to calculate these ourselves, since the lib - in -base doesn't know about this format yet and we can't bump the - requirement to CVS right now. Fix the Y42B stride, offset and size - calculations for odd widths and heights while we're at it though - (to match those in videotestsrc). +2022-03-16 00:05:19 +0100 Mathieu Duponchelle <mathieu@centricular.com> -2008-01-31 21:55:44 +0000 Edgard Lima <edgard.lima@indt.org.br> + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: fix deadlock when setting up FEC encoder + We bind transceivers' fec_percentage property to the FEC encoder + percentage property, and with the binding bidirectional a deadlock + was introduced by the latest changes from !1762: + We take hold of the transceiver's object lock, then add the binding + and set the property to its initial value on the encoder, which causes + set_property to deadlock in the transceiver when the binding kicks in. + Changing the binding type to DEFAULT (source to target) is enough + to address the deadlock and still serves the original intent. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1967> - * ChangeLog: - * ext/metadata/metadata_mapping.htm: - * ext/metadata/metadataexif.c: - * ext/metadata/metadataiptc.c: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - * ext/metadata/metadataxmp.c: - Add documentation. - Original commit message from CVS: - Add documentation. - -2008-01-31 17:20:41 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/metadata/metadataparsejpeg.c: Fix compilation. - Original commit message from CVS: - * ext/metadata/metadataparsejpeg.c: (metadataparse_jpeg_reading): - Fix compilation. - -2008-01-31 17:18:46 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst-libs/gst/app/gstappsink.c: Really clean up the queue instead of just unreffing all buffers in it. - Original commit message from CVS: - * gst-libs/gst/app/gstappsink.c: (gst_app_sink_dispose): - Really clean up the queue instead of just unreffing all buffers - in it. - * gst-libs/gst/app/gstappsrc.c: (gst_app_src_base_init), - (gst_app_src_class_init), (gst_app_src_init), - (gst_app_src_dispose), (gst_app_src_finalize): - Fix dispose/finalize. - -2008-01-31 15:52:18 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/faad/gstfaad.c: Fix compiler warning by making the function signature match what everyone is passing in... - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_chanpos_to_gst): - Fix compiler warning by making the function signature match what - everyone is passing in... - * tests/icles/Makefile.am: - Fix the build on Solaris by removing GNU ld specific flags that - look unnecessary. - -2008-01-31 10:16:46 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/metadata/Makefile.am: Add some relevant variables to CFLAGS and LIBADD, for example our compiler warnings paramters. - Original commit message from CVS: - * ext/metadata/Makefile.am: - Add some relevant variables to CFLAGS and LIBADD, for example our - compiler warnings paramters. - * ext/metadata/gstbasemetadata.c: - (gst_base_metadata_strip_push_buffer), - (gst_base_metadata_calculate_offsets), - (gst_base_metadata_src_event), (gst_base_metadata_sink_activate): - * ext/metadata/gstmetadatademux.c: (gst_metadata_demux_init), - (gst_metadata_demux_set_property), (gst_metadata_demux_dispose): - * ext/metadata/gstmetadatamux.c: (gst_metadata_mux_init), - (gst_metadata_mux_set_property), (gst_metadata_mux_get_property), - (gst_metadata_mux_dispose), - (gst_metadata_mux_create_chunks_from_tags): - * ext/metadata/metadata.c: (metadata_dispose): - * ext/metadata/metadataexif.c: - (metadataparse_exif_content_foreach_entry_func), - (metadatamux_exif_for_each_tag_in_list): - * ext/metadata/metadataiptc.c: - (metadatamux_iptc_for_each_tag_in_list): - * ext/metadata/metadatamuxjpeg.c: (metadatamux_jpeg_lazy_update), - (metadatamux_jpeg_reading): - * ext/metadata/metadatamuxpng.c: (metadatamux_png_reading): - * ext/metadata/metadataparsejpeg.c: (metadataparse_jpeg_reading): - * ext/metadata/metadataparsepng.c: - * ext/metadata/metadataparseutil.h: - * ext/metadata/metadataxmp.c: (metadataparse_xmp_tag_list_add), - (metadatamux_xmp_create_chunk_from_tag_list): - Fix a million warnings that showed up after the above change. - -2008-01-31 09:50:31 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/soup/gstsouphttpsrc.c: Add changes to gstsouphttpsrc.c that were missing from last commit. - Original commit message from CVS: - * ext/soup/gstsouphttpsrc.c: (_do_init), - (gst_soup_http_src_base_init), (gst_soup_http_src_class_init), - (gst_soup_http_src_init), (gst_soup_http_src_dispose), - (gst_soup_http_src_set_property), (gst_soup_http_src_get_property), - (gst_soup_http_src_unicodify), (gst_soup_http_src_cancel_message), - (gst_soup_http_src_queue_message), - (gst_soup_http_src_add_range_header), - (gst_soup_http_src_session_unpause_message), - (gst_soup_http_src_session_pause_message), - (gst_soup_http_src_session_close), - (gst_soup_http_src_got_headers_cb), - (gst_soup_http_src_got_body_cb), (gst_soup_http_src_finished_cb), - (gst_soup_http_src_got_chunk_cb), (gst_soup_http_src_response_cb), - (gst_soup_http_src_parse_status), (gst_soup_http_src_create), - (gst_soup_http_src_start), (gst_soup_http_src_stop), - (gst_soup_http_src_unlock), (gst_soup_http_src_unlock_stop), - (gst_soup_http_src_get_size), (gst_soup_http_src_is_seekable), - (gst_soup_http_src_do_seek), (gst_soup_http_src_set_location), - (gst_soup_http_src_set_proxy), (gst_soup_http_src_uri_get_type), - (gst_soup_http_src_uri_get_protocols), - (gst_soup_http_src_uri_get_uri), (gst_soup_http_src_uri_set_uri), - (gst_soup_http_src_uri_handler_init), (plugin_init): - Add changes to gstsouphttpsrc.c that were missing from last commit. - -2008-01-31 08:57:16 +0000 Wouter Cloetens <wouter@mind.be> - - Make coding style more consistent, including class renaming. - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/inspect/plugin-soup.xml: - (gst_soup_http_src_base_init), (gst_soup_http_src_class_init), - (gst_soup_http_src_init), (gst_soup_http_src_dispose), - (gst_soup_http_src_set_property), (gst_soup_http_src_get_property), - (gst_soup_http_src_unicodify), (gst_soup_http_src_cancel_message), - (gst_soup_http_src_queue_message), - (gst_soup_http_src_add_range_header), - (gst_soup_http_src_session_unpause_message), - (gst_soup_http_src_session_pause_message), - (gst_soup_http_src_session_close), - (gst_soup_http_src_got_headers_cb), - (gst_soup_http_src_got_body_cb), (gst_soup_http_src_finished_cb), - (gst_soup_http_src_got_chunk_cb), (gst_soup_http_src_response_cb), - (gst_soup_http_src_parse_status), (gst_soup_http_src_create), - (gst_soup_http_src_start), (gst_soup_http_src_stop), - (gst_soup_http_src_unlock), (gst_soup_http_src_unlock_stop), - (gst_soup_http_src_get_size), (gst_soup_http_src_is_seekable), - (gst_soup_http_src_do_seek), (gst_soup_http_src_set_location), - (gst_soup_http_src_set_proxy), (gst_soup_http_src_uri_get_type), - (gst_soup_http_src_uri_get_protocols), - (gst_soup_http_src_uri_get_uri), (gst_soup_http_src_uri_set_uri), - (gst_soup_http_src_uri_handler_init), (plugin_init): - * ext/soup/gstsouphttpsrc.h: - Make coding style more consistent, including class renaming. - -2008-01-30 20:55:58 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Fix configure check for soundtouch to not produce syntax errors. - Original commit message from CVS: - * configure.ac: - Fix configure check for soundtouch to not produce syntax errors. - -2008-01-30 19:19:33 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Fix build with exempi >= 1.99.5 and fix the include path for exempi. - Original commit message from CVS: - * configure.ac: - * ext/metadata/metadataxmp.c: - (metadatamux_xmp_for_each_tag_in_list): - Fix build with exempi >= 1.99.5 and fix the include - path for exempi. +2022-03-10 19:22:52 +0900 Sangchul Lee <sc11.lee@samsung.com> -2008-01-30 16:53:40 +0000 Edgard Lima <edgard.lima@indt.org.br> + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: Check data channel transport for notifying 'ice-gathering-state' + Previously, it did not care about data channel's. It is fixed by adding + some conditions. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1957> - * ChangeLog: - * ext/metadata/TODO: - Just uptade the ToDo list. - Original commit message from CVS: - Just uptade the ToDo list. +2022-03-14 01:19:53 +0900 Seungha Yang <seungha@centricular.com> -2008-01-30 16:05:24 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstcudamemorycopy.c: + * sys/nvcodec/gstcudautils.c: + * sys/nvcodec/gstcudautils.h: + nvcodec: Move CUDA <-> GL, D3D11, NVMM copy function to utils + This method can be used in other elements as well. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1945> - * ChangeLog: - * ext/metadata/gstbasemetadata.c: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadatamuxpng.c: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadatatypes.c: - * ext/metadata/metadatatypes.h: - * ext/metadata/metadataxmp.c: - Add documentation. Speed up a bit png muxer. Fix xmp muxer. - Original commit message from CVS: - Add documentation. Speed up a bit png muxer. Fix xmp muxer. - -2008-01-30 15:40:44 +0000 Wouter Cloetens <wouter@mind.be> - - ext/soup/gstsouphttpsrc.c: Update documentation a bit. - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * ext/soup/gstsouphttpsrc.c: - Update documentation a bit. - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-glimagesink.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-quicktime.xml: - * docs/plugins/inspect/plugin-rawparse.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-soup.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-spectrum.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-speexresample.xml: - * docs/plugins/inspect/plugin-switch.xml: - * docs/plugins/inspect/plugin-videocrop.xml: - Regenerate everything for the documentation changes we had. - -2008-01-30 15:34:25 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/gio/: Use async variants of the close stream functions to prevent blocking for a long time there and add some mor... - Original commit message from CVS: - * ext/gio/gstgiobasesink.c: (close_stream_cb), - (gst_gio_base_sink_stop), (gst_gio_base_sink_event), - (gst_gio_base_sink_render), (gst_gio_base_sink_set_stream): - * ext/gio/gstgiobasesrc.c: (close_stream_cb), - (gst_gio_base_src_stop), (gst_gio_base_src_create), - (gst_gio_base_src_set_stream): - Use async variants of the close stream functions to prevent blocking - for a long time there and add some more sanity checks for a correct - stream. - -2008-01-30 13:38:58 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/icles/Makefile.am: Move -Wl parameter from _LDADD to _LDFLAGS to fix autogen.sh. - Original commit message from CVS: - * tests/icles/Makefile.am: - Move -Wl parameter from _LDADD to _LDFLAGS to fix autogen.sh. - -2008-01-30 13:29:15 +0000 Wouter Cloetens <wouter@mind.be> - - ext/soup/gstsouphttpsrc.c: Let the proxy property default to the content of the $http_proxy environment variable. - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_init): - Let the proxy property default to the content of the $http_proxy - environment variable. - -2008-01-30 13:08:45 +0000 Wouter Cloetens <wouter@mind.be> - - tests/check/: Add missing files for the unit test. - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * tests/check/test-cert.pem: - * tests/check/test-key.pem: - Add missing files for the unit test. - -2008-01-30 13:06:01 +0000 Wouter Cloetens <wouter@mind.be> - - docs/plugins/: Add souphttpsrc to the docs. - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - Add souphttpsrc to the docs. - * configure.ac: - * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_class_init), - (gst_souphttp_src_init), (gst_souphttp_src_dispose), - (gst_souphttp_src_set_property), (gst_souphttp_src_get_property), - (gst_souphttp_src_cancel_message), - (gst_souphttp_src_queue_message), - (gst_souphttp_src_add_range_header), - (gst_souphttp_src_session_unpause_message), - (gst_souphttp_src_session_pause_message), - (gst_souphttp_src_session_close), - (gst_souphttp_src_got_headers_cb), (gst_souphttp_src_got_body_cb), - (gst_souphttp_src_finished_cb), (gst_souphttp_src_got_chunk_cb), - (gst_souphttp_src_response_cb), (gst_souphttp_src_parse_status), - (gst_souphttp_src_create), (gst_souphttp_src_start), - (gst_souphttp_src_stop), (gst_souphttp_src_unlock), - (gst_souphttp_src_unlock_stop), (gst_souphttp_src_get_size), - (gst_souphttp_src_is_seekable), (gst_souphttp_src_do_seek), - (gst_souphttp_src_set_location), (gst_souphttp_src_set_proxy), - (plugin_init): - * ext/soup/gstsouphttpsrc.h: - Add support for libsoup2.4 and require it. Also implement redirection - and manual proxy specification. Fixes bug #510708. - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/souphttpsrc.c: - Add unit test for souphttpsrc. +2022-03-12 01:12:25 +0900 Seungha Yang <seungha@centricular.com> -2008-01-30 12:56:51 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstnvh265dec.c: + nvh265sldec: Add support for delayed output + Delay 4 frames in case of non-live to improve throughput + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1937> - * ChangeLog: - * ext/Makefile.am: - * ext/metadata/TODO: - * ext/metadata/gstbasemetadata.c: - * ext/metadata/gstbasemetadata.h: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadatamuxjpeg.h: - * ext/metadata/metadatamuxpng.c: - * ext/metadata/metadatamuxpng.h: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsepng.c: - * tests/icles/Makefile.am: - Add documentation. Fix test app compilation. Fix pull mode. - Original commit message from CVS: - Add documentation. Fix test app compilation. Fix pull mode. - -2008-01-29 18:57:27 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Try to get the new clock-rate from the buffer caps when we receive a new payload... - Original commit message from CVS: - Patch by: Thijs Vermeir <thijsvermeir at gmail dot com> - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_chain): - Try to get the new clock-rate from the buffer caps when we receive a new - payload type instead of always firing the signal. Fixes #512774. - -2008-01-29 18:05:01 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/mpeg2enc/gstmpeg2enc.cc: Define LOG_NONE and friends if they're not defined yet. mjpegtools 1.9.0rc3 removed thei... - Original commit message from CVS: - * ext/mpeg2enc/gstmpeg2enc.cc: - Define LOG_NONE and friends if they're not defined yet. mjpegtools - 1.9.0rc3 removed their definitions but without it doesn't make much - sense to write a log handler. - -2008-01-29 11:32:27 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/: Add base classes for metadata and equalizer (no introspection yet). - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.types: - Add base classes for metadata and equalizer (no introspection yet). - -2008-01-29 07:43:28 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/metadata/README: Formatting. - Original commit message from CVS: - * ext/metadata/README: - Formatting. - * tests/icles/metadata_editor.c: - Include stdlib.h. - -2008-01-29 07:38:31 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Replace the switch plugin with the selector plugin. Add output- selector as the opposite of input-selectoo (was switc... - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-selector.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-switch.xml: - * gst/selector/.cvsignore: - * gst/selector/Makefile.am: - * gst/selector/gstinputselector.c: - * gst/selector/gstinputselector.h: - * gst/selector/gstoutputselector.c: - * gst/selector/gstoutputselector.h: - * gst/selector/gstselector-marshal.list: - * gst/selector/gstselector.c: - * gst/selector/selector.vcproj: - * gst/switch/.cvsignore: - * gst/switch/Makefile.am: - * gst/switch/gstswitch-marshal.list: - * gst/switch/gstswitch.c: - * gst/switch/gstswitch.h: - * gst/switch/switch.vcproj: - * tests/icles/.cvsignore: - * tests/icles/Makefile.am: - * tests/icles/output-selector-test.c: - Replace the switch plugin with the selector plugin. Add output- - selector as the opposite of input-selectoo (was switch). Add a test - for output-selector. Add docs for the elements. The vcproj needs - update. Fixes #500142. - -2008-01-28 23:18:44 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/h264parse/gsth264parse.c: Try to avoid 'unused variable' compiler warning if debugging is disabled (not bullet pr... - Original commit message from CVS: - * gst/h264parse/gsth264parse.c: (gst_h264_parse_chain_forward): - Try to avoid 'unused variable' compiler warning if debugging is - disabled (not bullet proof, but seems to do for now). (#512654) - -2008-01-28 11:47:18 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/soundtouch/gstbpmdetect.cc: Clean up a bit and only allocate a temporary buffer for the data if processing stereo... - Original commit message from CVS: - * ext/soundtouch/gstbpmdetect.cc: - Clean up a bit and only allocate a temporary buffer for the data - if processing stereo data as BPMDetect downmixes from stereo to - mono and stores the result in the input data. Thanks to - Stefan Kost for the suggestions. - -2008-01-27 17:02:24 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/soundtouch/gstpitch.cc: Cast a double to a GstClockTimeDiff to fix a compiler warning. - Original commit message from CVS: - * ext/soundtouch/gstpitch.cc: - Cast a double to a GstClockTimeDiff to fix a compiler warning. - -2008-01-27 16:12:45 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/icles/metadata_editor.c: Printf format fix. - Original commit message from CVS: - * tests/icles/metadata_editor.c: - Printf format fix. - -2008-01-27 07:51:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/soundtouch/gstpitch.cc: Don't send a LATENCY event for now until we get the usage right. - Original commit message from CVS: - * ext/soundtouch/gstpitch.cc: - Don't send a LATENCY event for now until we get the usage right. - -2008-01-27 07:37:40 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/soundtouch/gstpitch.*: Implement LATENCY query and notify about latency changes. - Original commit message from CVS: - * ext/soundtouch/gstpitch.cc: - * ext/soundtouch/gstpitch.hh: - Implement LATENCY query and notify about latency changes. - Unfortunately we don't have a fixed latency but it changes - a bit with each buffer so we only send an LATENCY event with - the maximum latency if it changes. - Always calculate the timestamp, duration, etc from the sample - rate instead of using a pre-calculated duration for one sample - to prevent large rounding errors. - -2008-01-27 07:32:19 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add support for building against mjpegtools 1.9 while keeping compatiblity with older versions. - Original commit message from CVS: - Based on a patch by: - Hans de Goede <j dot w dot r dot degoede at hhs dot nl> - * configure.ac: - * ext/mpeg2enc/gstmpeg2encoder.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.hh: - Add support for building against mjpegtools 1.9 while keeping - compatiblity with older versions. - -2008-01-27 06:31:52 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/soundtouch/gstbpmdetect.cc: Only consider a BPM value above 1.0 as valid. - Original commit message from CVS: - * ext/soundtouch/gstbpmdetect.cc: - Only consider a BPM value above 1.0 as valid. - -2008-01-27 05:56:04 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/soundtouch/: Add BPM detection plugin based on SoundTouch's libBPM. - Original commit message from CVS: - * ext/soundtouch/Makefile.am: - * ext/soundtouch/gstbpmdetect.cc: - * ext/soundtouch/gstbpmdetect.hh: - * ext/soundtouch/plugin.c: (plugin_init): - Add BPM detection plugin based on SoundTouch's libBPM. - * ext/soundtouch/gstpitch.cc: - Allow sample rates until MAX instead of only 48kHz and remove the - buffer-frames field from that caps. - Clear the remaining samples completely when necessary to get into - a clean state again. - -2008-01-26 16:19:26 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/: Don't implement get_unit_size() ourselves, the GstAudioFilter base class already does this for us. - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init): - * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init): - Don't implement get_unit_size() ourselves, the GstAudioFilter base - class already does this for us. - -2008-01-26 15:12:50 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/soundtouch/gstpitch.cc: Allow seeking only in TIME and DEFAULT format, other formats will not work as expected. A... - Original commit message from CVS: - * ext/soundtouch/gstpitch.cc: - Allow seeking only in TIME and DEFAULT format, other formats will - not work as expected. Also handle a stop position of -1 correctly - for seeks, newsegment events and the queries. This fixes playback - with the pitch element if upstream doesn't know the duration or has - -1 as stop position in NEWSEGMENT events for other reasons. Before - simply nothing was played as the segment was going from 0 to 0. - Send a GST_MESSAGE_DURATION whenever the rate or tempo is changed - so applications can update their cached duration. Fixes bug #503308. - Some random cleanup and memory leak closing. - -2008-01-26 14:35:22 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/musepack/: First include the libmpcdec headers before everything else as they #define TRUE and FALSE unconditiona... - Original commit message from CVS: - * ext/musepack/gstmusepackdec.h: - * ext/musepack/gstmusepackreader.c: - First include the libmpcdec headers before everything else as they - #define TRUE and FALSE unconditionally and we otherwise get conflicts - with the ones that GLib defines. - -2008-01-26 13:24:17 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add support for libsoundtouch 1.3.1 and add an ugly workaround for the header definined PACKAGE and other variables f... - Original commit message from CVS: - * configure.ac: - * ext/soundtouch/gstpitch.cc: - Add support for libsoundtouch 1.3.1 and add an ugly workaround for - the header definined PACKAGE and other variables for which we need - our own values from config.h. - -2008-01-26 12:11:47 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Check for libglade-2.0, for the metadata-editor example. - Original commit message from CVS: - * configure.ac: - Check for libglade-2.0, for the metadata-editor example. - * tests/icles/Makefile.am: - Only try to build the metadata-editor example if we have gtk and - glade (otherwise the build would just fail ...); fix build in - uninstalled setup. - * tests/icles/metadata_editor.c: (on_cell_edited), (ui_add_columns): - Fix compiler warnings (use GLib macros to cast pointer <-> int). +2022-03-12 21:54:45 +0900 Seungha Yang <seungha@centricular.com> -2008-01-25 17:45:28 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst-libs/gst/codecs/gsth265decoder.c: + * gst-libs/gst/codecs/gsth265decoder.h: + h265decoder: Add support for delayed output + Functionally identical to the other decoder baseclasses. + Delayed output can improve throughput depending on decoding APIs. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1937> - * ChangeLog: - * ext/metadata/TODO: - * ext/metadata/gstbasemetadata.c: - * ext/metadata/metadata.c: - * ext/metadata/metadata.h: - * ext/metadata/metadataexif.c: - * ext/metadata/metadataexif.h: - * ext/metadata/metadataiptc.c: - * ext/metadata/metadataiptc.h: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsejpeg.h: - * ext/metadata/metadataparsepng.c: - * ext/metadata/metadataparsepng.h: - * ext/metadata/metadataparseutil.c: - * ext/metadata/metadataparseutil.h: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - * ext/metadata/metadatatypes.c: - * ext/metadata/metadatatypes.h: - * ext/metadata/metadataxmp.c: - * ext/metadata/metadataxmp.h: - * ext/metadata/test/Makefile: - * tests/icles/Makefile.am: - * tests/icles/metadata_editor.c: - * tests/icles/metadata_editor.glade: - Add lot of documentation. - Original commit message from CVS: - Add lot of documentation. - -2008-01-25 17:35:46 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: Open frontend in NULL->READY so caps about dvb adapter can be seen by the app. - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - Open frontend in NULL->READY so caps about dvb adapter can be - seen by the app. - -2008-01-25 16:58:00 +0000 Olivier Crete <tester@tester.ca> - - gst/rtpmanager/gstrtpbin.c: Also handle lip-sync when the clock-rate is not provided with caps but with a signal. - Original commit message from CVS: - Patch by: Olivier Crete <tester@tester.ca> - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate), - (create_stream), (payload_type_change), (new_ssrc_pad_found): - Also handle lip-sync when the clock-rate is not provided with caps but - with a signal. - -2008-01-25 16:00:52 +0000 Olivier Crete <tester@tester.ca> - - gst/rtpmanager/: Remove the fixed clock-rate from the jitterbuffer and extend it so that a clock-rate can be provided... - Original commit message from CVS: - Patch by: Olivier Crete <tester@tester.ca> - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_chain): - * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew), - (rtp_jitter_buffer_insert): - * gst/rtpmanager/rtpjitterbuffer.h: - Remove the fixed clock-rate from the jitterbuffer and extend it so that - a clock-rate can be provided with each buffer instead. Fixes #511686. - -2008-01-25 15:49:55 +0000 Olivier Crete <tester@tester.ca> - - gst/rtpmanager/gstrtpjitterbuffer.c: Remove old unused variable. - Original commit message from CVS: - Patch by: Olivier Crete <tester@tester.ca> - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_init), (gst_rtp_jitter_buffer_change_state), - (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): - Remove old unused variable. - Track pt on input buffers and get the clock-rate when it changes. - Ignore packets with unknown clock-rate. See #511686. - -2008-01-25 12:48:40 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: Post bus message about adapter type and it's capabilities, when opening the frontend. - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - Post bus message about adapter type and it's capabilities, - when opening the frontend. - After failing to read from the dvr, post a bus message to - inform the app. - -2008-01-25 09:50:07 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtspacketizer.c: The logic for the guard interval calculation was totally wrong. - Original commit message from CVS: - * gst/mpegtsparse/mpegtspacketizer.c: - The logic for the guard interval calculation was totally wrong. - Fixed. - -2008-01-25 01:44:27 +0000 Olivier Crete <tester@tester.ca> - - gst/rtpmanager/rtpsource.c: Fix unref of buffer using the wrong function. Fixes #511920 - Original commit message from CVS: - Patch by: Olivier Crete <tester@tester.ca> - * gst/rtpmanager/rtpsource.c: Fix unref of buffer using the - wrong function. Fixes #511920 - -2008-01-24 13:23:03 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/: Now we have full hierarchy. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - Now we have full hierarchy. - * docs/plugins/inspect/plugin-metadata.xml: - Regenerate. - * ext/amrwb/gstamrwbdec.h: - Add doc blob for object instance. - -2008-01-24 10:15:34 +0000 Tim-Philipp Müller <tim@centricular.net> - - docs/plugins/: Update this too, hopefully fixes the docs build (does at least for me, after make clean in docs/plugins). - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-metadata.xml: - Update this too, hopefully fixes the docs build (does at least - for me, after make clean in docs/plugins). - -2008-01-24 08:12:29 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/: Fix network name descriptor, the length is actually the descriptor length not stored in the byte af... - Original commit message from CVS: - * gst/mpegtsparse/gstmpegdesc.h: - * gst/mpegtsparse/mpegtspacketizer.c: - Fix network name descriptor, the length is actually the - descriptor length not stored in the byte after. - Fix bounds checking to be more correct. - -2008-01-24 00:22:17 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/: Parse and add to relevant bus messages the terrestrial delivery system descriptor and the logical c... - Original commit message from CVS: - * gst/mpegtsparse/gstmpegdesc.h: - * gst/mpegtsparse/mpegtspacketizer.c: - Parse and add to relevant bus messages the terrestrial delivery - system descriptor and the logical channel descriptor. - Do bounds checking on data stored in descriptor before use. +2022-03-12 00:53:04 +0900 Seungha Yang <seungha@centricular.com> -2008-01-23 16:35:34 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst-libs/gst/codecs/gsth265decoder.h: + h265decoder: Update documentation + Sync up with other baseclasses + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1937> - * ChangeLog: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/metadata/TODO: - * ext/metadata/gstbasemetadata.c: - * ext/metadata/gstbasemetadata.h: - * ext/metadata/gstmetadatademux.c: - * ext/metadata/gstmetadatademux.h: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadatamux.h: - * ext/metadata/metadatatags.c: - Add some documentation. - Original commit message from CVS: - Add some documentation. - -2008-01-23 15:51:20 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add support for building against libdca (with the libdts compat header). Fixes bug #511530. - Original commit message from CVS: - * configure.ac: - * ext/dts/gstdtsdec.c: - Add support for building against libdca (with the libdts compat - header). Fixes bug #511530. - Should probably be ported to libdca as some points as it's the - successor of libdts. - -2008-01-23 14:59:47 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: Do not go on forever if problem with reading from dvr, rather return NULL. - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - Do not go on forever if problem with reading from dvr, rather - return NULL. - Handle some cleanup issues of closing filedescriptors when - failing to tune or similar. +2022-03-12 04:45:22 +0900 Seungha Yang <seungha@centricular.com> -2008-01-23 13:18:24 +0000 Christian Schaller <uraeus@gnome.org> + * gst-libs/gst/codecs/gsth265decoder.c: + * gst-libs/gst/codecs/gsth265picture.h: + h265decoder: Drain decoder on new_sequence() + Holding previously decoded but not outputted pictures even after + new_sequence is not a safe approach in various aspect. + However, we cannot drain out DPB on new_sequence() unconditionally, + because there is a case where decoder should drop decoded pictures + if NoOutputOfPriorPicsFlag is set. + To detect NoOutputOfPriorPicsFlag before the new_sequence() call, + this patch splits decoding process into two path, one for nal unit parsing + in order to detect NoOutputOfPriorPicsFlag and then each nal unit + will be decoded. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1937> - * ChangeLog: - * gst-plugins-bad.spec.in: - * gst/rawparse/Makefile.am: - Add missing no_inst header files to Makefile.am so disting still works - Original commit message from CVS: - Add missing no_inst header files to Makefile.am so disting still works - Update spec file with latest changes - -2008-01-23 10:34:40 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add documentation for the xingheader plugin. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/xingheader/gstxingmux.c: - * gst/xingheader/gstxingmux.h: - Add documentation for the xingheader plugin. - * tests/check/elements/xingmux.c: (GST_START_TEST): - Set element state to PLAYING before doing something else. - -2008-01-23 10:11:44 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/: Add simple unit test for the xingmux element. - Original commit message from CVS: - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/xingmux.c: (setup_xingmux), - (cleanup_xingmux), (GST_START_TEST), (xingmux_suite), (main): - * tests/check/elements/xingmux_testdata.h: - Add simple unit test for the xingmux element. - * gst/xingheader/gstxingmux.c: (generate_xing_header), - (gst_xing_mux_finalize), (xing_reset): - Fix a memleak and invalid seek tables with less than 100 MP3 frames. - -2008-01-23 09:49:27 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/: Parsed the satellite delivery system descriptor and added into nit's transport structure for delive... - Original commit message from CVS: - * gst/mpegtsparse/gstmpegdesc.h: - * gst/mpegtsparse/mpegtspacketizer.c: - Parsed the satellite delivery system descriptor and - added into nit's transport structure for delivery - over the bus. - -2008-01-22 20:27:28 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtspacketizer.c: Parsed and added network name to the nit structure sent in the bus message. - Original commit message from CVS: - * gst/mpegtsparse/mpegtspacketizer.c: - Parsed and added network name to the nit structure sent - in the bus message. - -2008-01-22 19:59:39 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtspacketizer.c: Remove leaks introduced by not freeing g_strndup'd strings. - Original commit message from CVS: - * gst/mpegtsparse/mpegtspacketizer.c: - Remove leaks introduced by not freeing g_strndup'd strings. - Fix start_time and duration parsing in EIT. - -2008-01-22 18:40:16 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtspacketizer.c: Add event name and description to the eit structure sent in the bus message. - Original commit message from CVS: - * gst/mpegtsparse/mpegtspacketizer.c: - Add event name and description to the eit structure - sent in the bus message. - -2008-01-22 18:08:01 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtsparse.c: Revert const removal from previous commit. - Original commit message from CVS: - * gst/mpegtsparse/mpegtsparse.c: - Revert const removal from previous commit. - -2008-01-22 18:04:04 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/: Added descriptor searching infrastructure from Fluendo TS demuxer. - Original commit message from CVS: - * gst/mpegtsparse/Makefile.am: - * gst/mpegtsparse/gstmpegdesc.c: - * gst/mpegtsparse/gstmpegdesc.h: - * gst/mpegtsparse/mpegtspacketizer.c: - * gst/mpegtsparse/mpegtsparse.c: - Added descriptor searching infrastructure from Fluendo TS demuxer. - Add channel name and provider to the sdt structure sent in the - bus message. - -2008-01-22 17:43:35 +0000 Julien Moutte <julien@moutte.net> - - gst/h264parse/gsth264parse.c: Parse NAL units in forward mode to mark delta units flags. - Original commit message from CVS: - 2008-01-22 Julien Moutte <julien@fluendo.com> - * gst/h264parse/gsth264parse.c: (gst_h264_parse_chain_forward): - Parse NAL units in forward mode to mark delta units flags. - -2008-01-22 12:06:19 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/: Regenerate. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-musepack.xml: - Regenerate. - * docs/plugins/inspect/plugin-tremor.xml: - Add vorbisidec aka trmor. - * ext/dc1394/gstdc1394.c: - Add short description. - -2008-01-22 09:55:23 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/Makefile.am: Add missing eol \ - Original commit message from CVS: - * docs/plugins/Makefile.am: - Add missing eol \ - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - Place object names to standard sectionas plugin dont document those. - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - regenerate. - * ext/ivorbis/vorbisdec.c: - * ext/ivorbis/vorbisdec.h: - Mark private vars and add short desc. - * ext/mythtv/gstmythtvsrc.c: - * ext/theora/theoradec.c: - Add short desc. - -2008-01-21 14:33:11 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - One less to do. Its 'nuv' not 'nvu'. As an extra bonus I mention what it actually is. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/nuvdemux/gstnuvdemux.c: - One less to do. Its 'nuv' not 'nvu'. As an extra bonus I mention what - it actually is. - -2008-01-21 14:19:32 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/: Update lists again. Those whole can build ivorbisdec, mythtvsrc, nvudemux and theoradecexp, please com... - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - Update lists again. Those whole can build ivorbisdec, mythtvsrc, - nvudemux and theoradecexp, please commit the inspect/plugin-xxx.xml. - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-rawparse.xml - * docs/plugins/inspect/plugin-videoparse.xml: - Replace videoparse with rawparse. - * gst/dvdspu/gstdvdspu.h: - Help gtk-doc to recognize the object struct. - -2008-01-21 12:42:09 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/librfb/rfbdecoder.*: Don't use gtk-doc comment style for non gtk-doc comments. - Original commit message from CVS: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - Don't use gtk-doc comment style for non gtk-doc comments. - Make one static function static. - -2008-01-21 12:19:13 +0000 Gabriel Bouvigne <bouvigne@mp3-tech.org> - - gst/deinterlace/gstdeinterlace.*: Provide 4:2:2 support - Original commit message from CVS: - Patch by: Gabriel Bouvigne <bouvigne at mp3-tech dot org> - * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_class_init), - (gst_deinterlace_init), (gst_deinterlace_set_caps), - (gst_deinterlace_transform_ip), (gst_deinterlace_set_property), - (gst_deinterlace_get_property): - * gst/deinterlace/gstdeinterlace.h: - Provide 4:2:2 support - Also deinterlace chroma planes - Allow to turn on/off deinterlacing - Change of default thresholds, in order to provide acceptable results - with default params. Fixes #511001. - -2008-01-21 11:04:00 +0000 Tim-Philipp Müller <tim@centricular.net> - - docs/plugins/gst-plugins-bad-plugins-sections.txt: Update docs file too. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - Update docs file too. - -2008-01-21 11:01:30 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/dvdspu/: Fix up dvdspu element again after previous namespace mangling: rename debug category variable to old nam... - Original commit message from CVS: - * gst/dvdspu/gstdvdspu-render.c: (gst_dvd_spu_render_spu): - * gst/dvdspu/gstdvdspu.c: (dvdspu_debug), (GST_CAT_DEFAULT), - (subpic_sink_factory), (gst_dvd_spu_base_init), - (gst_dvd_spu_class_init), (gst_dvd_spu_init), (gst_dvd_spu_clear), - (gst_dvd_spu_dispose), (gst_dvd_spu_finalize), - (gst_dvd_spu_flush_spu_info), (gst_dvd_spu_buffer_alloc), - (gst_dvd_spu_src_event), (gst_dvd_spu_video_set_caps), - (gst_dvd_spu_video_proxy_getcaps), (gst_dvd_spu_video_event), - (gst_dvd_spu_video_chain), (dvspu_handle_vid_buffer), - (gst_dvd_spu_redraw_still), (gst_dvd_spu_parse_chg_colcon), - (gst_dvd_spu_exec_cmd_blk), (gst_dvd_spu_finish_spu_buf), - (gst_dvd_spu_setup_cmd_blk), (gst_dvd_spu_handle_new_spu_buf), - (gst_dvd_spu_handle_dvd_event), (gst_dvd_spu_advance_spu), - (gst_dvd_spu_check_still_updates), (gst_dvd_spu_subpic_chain), - (gst_dvd_spu_subpic_event), (gst_dvd_spu_change_state), - (gst_dvd_spu_plugin_init): - * gst/dvdspu/gstdvdspu.h: (GST_TYPE_DVD_SPU): - Fix up dvdspu element again after previous namespace mangling: - rename debug category variable to old name, matching that in - dvdspu-render.c, to avoid undefined symbol error when loading - the module; same for the _render function in dvdspu-render.c: - we must use the same name in both .c files; change functions - now called gstgst_* back to gst_* again; and while we're at it, - we may as well canonicalise the namespace properly, namely to - gst_dvd_spu_*. - -2008-01-21 10:06:08 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Coherent namespace usage and adding symbold from unused to sections. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/theora/theoradec.c: - * ext/theora/theoradec.h: - Coherent namespace usage and adding symbold from unused to sections. - -2008-01-21 09:57:07 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/: Add symbols from -unused.txt to the right place. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - Add symbols from -unused.txt to the right place. - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - Coherent namespace usage. - * gst/spectrum/gstspectrum.c: - Fix broken XML fragment in doc snippet even more. - -2008-01-21 07:54:02 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/Makefile.am: Update include list. - Original commit message from CVS: - * docs/plugins/Makefile.am: - Update include list. - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - Update xml includes. - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-amrwb.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-dvbsrc.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-equalizer.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-fbdevsink.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-flvdemux.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-interleave.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-metadata.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegtsparse.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-qtdemux.xml: - * docs/plugins/inspect/plugin-quicktime.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-spectrum.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-speexresample.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-switch.xml: - * docs/plugins/inspect/plugin-timidity.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-videocrop.xml: - * docs/plugins/inspect/plugin-videoparse.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-xingheader.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - Regenerate files. - * gst/spectrum/gstspectrum.c: - Fix broken XML fragment in doc snippet. - * tests/check/elements/.cvsignore: - Add test binary to ignores. - -2008-01-21 07:22:47 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/h264parse/gsth264parse.c: Fix the build. GST_TIME_ARGS takes a timestamp not a buffer. - Original commit message from CVS: - * gst/h264parse/gsth264parse.c: - Fix the build. GST_TIME_ARGS takes a timestamp not a buffer. - -2008-01-20 05:07:52 +0000 Wouter Cloetens <wouter@mind.be> - - ext/soup/gstsouphttpsrc.c: Report the size of the stream as the total size instead of the remaining Content-Length, w... - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * ext/soup/gstsouphttpsrc.c: (soup_got_headers): - Report the size of the stream as the total size instead of - the remaining Content-Length, which is wrong after a seek. - -2008-01-19 16:13:31 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/rawparse/gstrawparse.c: Handle framesizes > 4096 with multiple frames per buffer correctly in pull mode and handl... - Original commit message from CVS: - * gst/rawparse/gstrawparse.c: (gst_raw_parse_push_buffer), - (gst_raw_parse_loop): - Handle framesizes > 4096 with multiple frames per buffer correctly - in pull mode and handle short reads better. - Also put offset and offset_end on outgoing buffers. - -2008-01-19 15:53:38 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/rawparse/gstrawparse.c: Improve handling of unknown or too small upstream sizes in pull mode. - Original commit message from CVS: - * gst/rawparse/gstrawparse.c: (gst_raw_parse_loop): - Improve handling of unknown or too small upstream sizes in - pull mode. - -2008-01-19 15:39:45 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/rawparse/gstrawparse.c: Improve debugging a bit and for handling multiple frames per buffer in pull mode choose t... - Original commit message from CVS: - * gst/rawparse/gstrawparse.c: (gst_raw_parse_loop), - (gst_raw_parse_handle_seek_push): - Improve debugging a bit and for handling multiple frames per buffer - in pull mode choose the next smallest multiply of framesize below - 4096 instead of always handling 1024 frames. - -2008-01-19 14:34:50 +0000 Wouter Cloetens <wouter@mind.be> - - ext/soup/gstsouphttpsrc.c: Correctly set duration on the GstBaseSrc segment when we know it to fix failing the durati... - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * ext/soup/gstsouphttpsrc.c: (soup_got_headers): - Correctly set duration on the GstBaseSrc segment when we know it - to fix failing the duration query. - -2008-01-18 17:37:03 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/h264parse/gsth264parse.c: Set timestamps more correctly. - Original commit message from CVS: - * gst/h264parse/gsth264parse.c: (gst_h264_parse_flush_decode), - (gst_h264_parse_queue_buffer), (gst_h264_parse_chain_reverse): - Set timestamps more correctly. - -2008-01-18 16:56:19 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/rawparse/gstrawparse.*: Implement pull mode. - Original commit message from CVS: - * gst/rawparse/gstrawparse.c: (gst_raw_parse_class_init), - (gst_raw_parse_init), (gst_raw_parse_reset), - (gst_raw_parse_set_src_caps), (gst_raw_parse_push_buffer), - (gst_raw_parse_chain), (gst_raw_parse_loop), - (gst_raw_parse_sink_activate), (gst_raw_parse_sink_activatepull), - (gst_raw_parse_change_state), (gst_raw_parse_sink_event), - (gst_raw_parse_handle_seek_push), (gst_raw_parse_handle_seek_pull), - (gst_raw_parse_src_event), (gst_raw_parse_src_query): - * gst/rawparse/gstrawparse.h: - Implement pull mode. - -2008-01-18 10:05:53 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/multifile/gstmultifilesrc.c: Fix memory leak spotted by the unit test. - Original commit message from CVS: - * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_create): - Fix memory leak spotted by the unit test. - -2008-01-18 09:54:59 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/Makefile.am: Enable spectrum test again. - Original commit message from CVS: - * tests/check/Makefile.am: - Enable spectrum test again. - * tests/check/gst-plugins-bad.supp: - Add suppressions for a singleton in GIO that can't be freed. - -2008-01-18 08:49:59 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/: Add some minimal tests for the equalizer plugin. - Original commit message from CVS: - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/equalizer.c: (setup_equalizer), - (cleanup_equalizer), (GST_START_TEST), (equalizer_suite), (main): - Add some minimal tests for the equalizer plugin. - -2008-01-18 07:03:23 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/equalizer/gstiirequalizer.c: Unparent all bands from the equalizer when finalizing to stop leaking them. - Original commit message from CVS: - * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_finalize): - Unparent all bands from the equalizer when finalizing to stop - leaking them. - -2008-01-18 05:32:26 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/soup/gstsouphttpsrc.c: Add support for WebDAV. - Original commit message from CVS: - * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_uri_get_protocols): - Add support for WebDAV. - -2008-01-18 05:24:39 +0000 Wouter Cloetens <wouter@mind.be> - - ext/soup/gstsouphttpsrc.*: Add support for seeking to souphttpsrc. Fixes bug #502335. - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_class_init), - (gst_souphttp_src_init), (gst_souphttp_src_create), - (gst_souphttp_src_is_seekable), (gst_souphttp_src_do_seek), - (soup_add_range_header), (soup_got_headers), (soup_got_chunk): - * ext/soup/gstsouphttpsrc.h: - Add support for seeking to souphttpsrc. Fixes bug #502335. - -2008-01-17 18:39:24 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/h264parse/gsth264parse.*: Improve debugging. - Original commit message from CVS: - * gst/h264parse/gsth264parse.c: (gst_h264_parse_clear_queues), - (gst_h264_parse_flush_decode), (gst_h264_parse_queue_buffer), - (gst_h264_parse_find_start_reverse), - (gst_h264_parse_chain_reverse), (gst_h264_parse_chain): - * gst/h264parse/gsth264parse.h: - Improve debugging. - Fix buffer splitting at sync codes and leftover buffer after - scanning. +2022-03-12 03:15:48 +0900 Seungha Yang <seungha@centricular.com> -2008-01-17 16:10:48 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst-libs/gst/codecs/gsth265decoder.c: + * gst-libs/gst/codecs/gsth265picture.c: + * gst-libs/gst/codecs/gsth265picture.h: + h265decoder: Remove unused pts variable + We can know timestamp from associated GstVideoCodecFrame + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1937> - * ChangeLog: - * ext/metadata/TODO: - * ext/metadata/metadataexif.c: - * ext/metadata/metadataxmp.c: - Fixed adding EXIF tags to correct IFD. Mapped some XMP tags. - Original commit message from CVS: - Fixed adding EXIF tags to correct IFD. Mapped some XMP tags. - -2008-01-16 18:28:00 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/h264parse/gsth264parse.*: Add reverse playback support for containers that don't know how to properly send data b... - Original commit message from CVS: - * gst/h264parse/gsth264parse.c: (gst_nal_list_new), - (gst_nal_list_prepend_link), (gst_nal_list_delete_head), - (gst_nal_bs_init), (gst_nal_bs_read), (gst_nal_bs_eos), - (gst_nal_bs_read_ue), (gst_h264_parse_class_init), - (gst_h264_parse_init), (gst_h264_parse_set_property), - (gst_h264_parse_get_property), (gst_h264_parse_sink_setcaps), - (gst_h264_parse_clear_queues), (gst_h264_parse_chain_forward), - (gst_h264_parse_flush_decode), (gst_h264_parse_queue_buffer), - (gst_h264_parse_find_start_reverse), - (gst_h264_parse_chain_reverse), (gst_h264_parse_chain), - (gst_h264_parse_sink_event), (gst_h264_parse_change_state): - * gst/h264parse/gsth264parse.h: - Add reverse playback support for containers that don't know how to - properly send data between I-frames. - -2008-01-16 05:40:48 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Update for API changes in GIO and require GIO 2.15.2 for this. - Original commit message from CVS: - * configure.ac: - * tests/check/pipelines/gio.c: (GST_START_TEST): - Update for API changes in GIO and require GIO 2.15.2 for this. - -2008-01-14 10:52:20 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/xingheader/gstxingmux.c: Bitrate is 4 bits, not 8 so check for 0xe as maximum value instead of 0xfe. - Original commit message from CVS: - * gst/xingheader/gstxingmux.c: (generate_xing_header): - Bitrate is 4 bits, not 8 so check for 0xe as maximum value instead - of 0xfe. - -2008-01-14 09:09:49 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/xingheader/gstxingmux.c: Remove accidentially leftover debug printf. - Original commit message from CVS: - * gst/xingheader/gstxingmux.c: (generate_xing_header): - Remove accidentially leftover debug printf. - -2008-01-14 08:56:31 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/xingheader/gstxingmux.c: Choose smallest possible frame size for the Xing header, properly set the timestamp, dur... - Original commit message from CVS: - * gst/xingheader/gstxingmux.c: (has_xing_header), - (generate_xing_header), (gst_xing_mux_chain), - (gst_xing_mux_sink_event): - Choose smallest possible frame size for the Xing header, properly - set the timestamp, duration and offset on the outgoing buffers, - only send NEWSEGMENT events in BYTE format downstream and also - drop VBRI headers if already existing. - -2008-01-12 09:22:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/xingheader/: Major cleanup and rewrite of xingmux with less bugs and new features: - Original commit message from CVS: - * gst/xingheader/Makefile.am: - * gst/xingheader/gstxingmux.c: (parse_header), (get_xing_offset), - (has_xing_header), (generate_xing_header), - (gst_xing_mux_base_init), (gst_xing_mux_finalize), (xing_reset), - (gst_xing_mux_init), (gst_xing_mux_chain), - (gst_xing_mux_sink_event), (gst_xing_mux_change_state): - * gst/xingheader/gstxingmux.h: - Major cleanup and rewrite of xingmux with less bugs and new features: - - Handles other layers as 3 - - Write TOC - -2008-01-11 19:16:53 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/check/elements/: It's "endianness", not "endianess". Fixes unit tests. - Original commit message from CVS: - * tests/check/elements/rganalysis.c: (test_buffer_const_float_mono), - (test_buffer_const_float_stereo), (test_buffer_const_int16_mono), - (test_buffer_const_int16_stereo), (test_buffer_square_float_mono), - (test_buffer_square_float_stereo), (test_buffer_square_int16_mono), - (test_buffer_square_int16_stereo): - * tests/check/elements/rglimiter.c: (create_test_buffer): - * tests/check/elements/rgvolume.c: (test_buffer_new): - It's "endianness", not "endianess". Fixes unit tests. - -2008-01-11 17:02:30 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpsession.c: If we find the caps in the cache, use it to parse the clock-rate instead of returning... - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_clock_rate): - If we find the caps in the cache, use it to parse the clock-rate instead - of returning an error. Fixes a TODO as found by Youness Alaoui. - -2008-01-11 16:45:57 +0000 Youness Alaoui <youness.alaoui@collabora.co.uk> - - gst/rtpmanager/: Make it possible to use different user_data for each of the callbacks. - Original commit message from CVS: - Patch by: Youness Alaoui <youness dot alaoui at collabora dot co dot uk> - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_clock_rate): - * gst/rtpmanager/rtpsession.c: (rtp_session_set_callbacks), - (rtp_session_set_process_rtp_callback), - (rtp_session_set_send_rtp_callback), - (rtp_session_set_send_rtcp_callback), - (rtp_session_set_sync_rtcp_callback), - (rtp_session_set_clock_rate_callback), - (rtp_session_set_reconsider_callback), (source_push_rtp), - (source_clock_rate), (rtp_session_process_bye), - (rtp_session_process_rtcp), (rtp_session_send_bye), - (rtp_session_on_timeout): - * gst/rtpmanager/rtpsession.h: - Make it possible to use different user_data for each of the callbacks. - Fixes #508587. - -2008-01-11 15:58:15 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/mpegvideoparse/mpegpacketiser.c: Small meaningless cleanup. - Original commit message from CVS: - * gst/mpegvideoparse/mpegpacketiser.c: (mpeg_util_find_start_code): - Small meaningless cleanup. - * gst/mpegvideoparse/mpegvideoparse.c: (gst_mpegvideoparse_flush), - (mpegvideoparse_drain_avail), (gst_mpegvideoparse_chain_forward), - (scan_keyframe), (gst_mpegvideoparse_flush_decode), - (gst_mpegvideoparse_chain_reverse), (gst_mpegvideoparse_chain), - (mpv_parse_sink_event), (gst_mpegvideoparse_change_state): - * gst/mpegvideoparse/mpegvideoparse.h: - Track segment events. - Do the first part of reverse playback by sending data between two - I-frames to the decoder. - -2008-01-10 20:57:17 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Fix documentation for latest patch - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: - Fix documentation for latest patch - -2008-01-10 14:34:30 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Allow request_new_pad with name NULL (bug #508515) - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: - Allow request_new_pad with name NULL (bug #508515) - -2008-01-10 12:36:46 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - autogen.sh: Add -Wno-portability to the automake parameters to stop warnings about GNU make extensions being used. We... - Original commit message from CVS: - * autogen.sh: - Add -Wno-portability to the automake parameters to stop warnings - about GNU make extensions being used. We require GNU make in almost - every Makefile anyway. - * configure.ac: - Use AM_PROG_CC_C_O as a compiler that accepts both -c and -o - at the same time is required for per target flags. - -2008-01-09 14:39:44 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpsession.c: Don't set fixed caps, we can basically do everything the upsteam peer pad can renegot... - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: (create_send_rtp_sink): - Don't set fixed caps, we can basically do everything the upsteam peer - pad can renegotiate to. Fixes #507940. - -2008-01-09 13:53:21 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Makefile.am: Include lcov.mak to allow building coverage reports. Add top-level check targets similar to other gst pa... - Original commit message from CVS: - * Makefile.am: - Include lcov.mak to allow building coverage reports. Add top-level - check targets similar to other gst packages. - -2008-01-06 22:35:31 +0000 David Schleef <ds@schleef.org> - - ext/directfb/Makefile.am: Add GST_CFLAGS. Otherwise we don't get -Wall -Werror. - Original commit message from CVS: - * ext/directfb/Makefile.am: - Add GST_CFLAGS. Otherwise we don't get -Wall -Werror. - * ext/directfb/dfbvideosink.c: - Getting tired of directfb's chatter. Quiet it. - -2008-01-06 22:00:32 +0000 Sean D'Epagnier <sean@depagnier.com> - - Add fbdev-based video sink. Linux-only. See bug #506549. - Original commit message from CVS: - Patch by: Sean D'Epagnier <sean@depagnier.com> - * configure.ac: - * sys/Makefile.am: - * sys/fbdev/Makefile.am: - * sys/fbdev/gstfbdevsink.c: - * sys/fbdev/gstfbdevsink.h: - Add fbdev-based video sink. Linux-only. See bug #506549. - -2008-01-06 16:36:32 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Update to GMemoryInputStream API changes in GLib SVN and require gio-2.0 >= 2.15.1 for this. Fixes bug #507584. - Original commit message from CVS: - * configure.ac: - * ext/gio/gstgiobasesrc.c: (gst_gio_base_src_get_size): - * tests/check/pipelines/gio.c: (free_input), (GST_START_TEST): - Update to GMemoryInputStream API changes in GLib SVN and require - gio-2.0 >= 2.15.1 for this. Fixes bug #507584. - We can also report the duration for every GSeekable, not only - GFileInputStream and GMemoryInputStream. - -2008-01-06 03:01:39 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Handle xoverlay exposes correctly. This means glimagesink works correctly most of the time in totem (fu... - Original commit message from CVS: - * sys/glsink/glimagesink.c: - * sys/glsink/glimagesink.h: - * sys/glsink/gstglbuffer.h: - * sys/glsink/gstgldisplay.c: - * sys/glsink/gstgldisplay.h: - * sys/glsink/gstglupload.c: - Handle xoverlay exposes correctly. This means glimagesink works - correctly most of the time in totem (fullscreening being an - execption). Doesn't handle expose events directly to the GL - window. - -2008-01-06 01:19:48 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Reenable video/x-raw-rgb and x-raw-yuv for glimagesink. Enable vblank synchronization. Remove unused c... - Original commit message from CVS: - * sys/glsink/glextensions.c: - * sys/glsink/glextensions.h: - * sys/glsink/glimagesink.c: - * sys/glsink/glimagesink.h: - * sys/glsink/gstgldisplay.c: - * sys/glsink/gstgldisplay.h: - * sys/glsink/gstopengl.c: - Reenable video/x-raw-rgb and x-raw-yuv for glimagesink. Enable - vblank synchronization. Remove unused code. - -2008-01-04 18:47:57 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Don't unref the popped buffer when we don't have ownership. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_loop): - Don't unref the popped buffer when we don't have ownership. - Fixes #507020. - -2008-01-03 23:35:52 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/: Remove no longer needed files. - Original commit message from CVS: - * gst/mpegtsparse/Makefile.am: - * gst/mpegtsparse/flutspatinfo.c: - * gst/mpegtsparse/flutspatinfo.h: - * gst/mpegtsparse/flutspmtinfo.c: - * gst/mpegtsparse/flutspmtinfo.h: - * gst/mpegtsparse/flutspmtstreaminfo.c: - * gst/mpegtsparse/flutspmtstreaminfo.h: - Remove no longer needed files. - -2008-01-02 20:49:12 +0000 David Schleef <ds@schleef.org> - - tests/check/Makefile.am: Disable vcdsrc in states test because it takes too much time to get to PLAYING if it can fin... - Original commit message from CVS: - * tests/check/Makefile.am: - Disable vcdsrc in states test because it takes too much time - to get to PLAYING if it can find a device. - -2008-01-01 01:18:19 +0000 David Schleef <ds@schleef.org> - - ext/musicbrainz/gsttrm.c: Don't emit signiture when going to READY, because it might not be ready. - Original commit message from CVS: - * ext/musicbrainz/gsttrm.c: - Don't emit signiture when going to READY, because it might - not be ready. - * ext/nas/nassink.c: - Remove useless call that sleeps for 5 seconds. Yup, it calls - sleep(1) 5 times. Go NAS. - * gst/librfb/gstrfbsrc.c: - * gst/librfb/rfbdecoder.c: - Initialize our debug categories properly. - * gst/rawparse/gstrawparse.c: - Don't register element details for a non-element. Be much more - rude when subclass doesn't set a pad template (assert!). Don't - unref the pad template; we don't own it. - * gst/videosignal/gstvideoanalyse.c: - Initialize debug category. - * tests/check/Makefile.am: - Ignore nassink element in tests because it has unavoidable - long timeouts. - -2007-12-31 13:12:06 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpssrcdemux.c: Don't clean up pads when going to PAUSED. - Original commit message from CVS: - * gst/rtpmanager/gstrtpssrcdemux.c: - (gst_rtp_ssrc_demux_change_state): - Don't clean up pads when going to PAUSED. - -2007-12-31 07:55:23 +0000 David Schleef <ds@schleef.org> - - Switch to using pkgconfig to detect libGL. Since we use recent features added to Mesa, there's no point in adding a ... - Original commit message from CVS: - * configure.ac: - * sys/glsink/Makefile.am: - Switch to using pkgconfig to detect libGL. Since we use - recent features added to Mesa, there's no point in adding - a check for pre-pkgconfig versions. - -2007-12-29 17:31:49 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Fix 'xyz may be used uninitialized' compiler warnings caused by broken g_assert_not_reached() macro in GLib-2.15.x an... - Original commit message from CVS: - * ext/ladspa/gstladspa.c: (gst_ladspa_get_property): - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_show_frame): - * gst/mve/gstmvemux.c: (gst_mve_mux_request_new_pad): - * sys/dvb/dvbbasebin.c: (dvb_base_bin_class_init): - Fix 'xyz may be used uninitialized' compiler warnings caused - by broken g_assert_not_reached() macro in GLib-2.15.x and don't - abort() in any case but properly report the error. - -2007-12-29 17:29:17 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Update to latest API changes in GLib/GIO and require at least gio-2.0 2.15.0 for this. - Original commit message from CVS: - * configure.ac: - * ext/gio/gstgio.c: - * ext/gio/gstgio.h: - * ext/gio/gstgiobasesink.h: - * ext/gio/gstgiobasesrc.c: (gst_gio_base_src_get_size): - * ext/gio/gstgiobasesrc.h: - * ext/gio/gstgiosink.c: (gst_gio_sink_start): - * ext/gio/gstgiosink.h: - * ext/gio/gstgiosrc.h: - * ext/gio/gstgiostreamsink.h: - * ext/gio/gstgiostreamsrc.h: - * tests/check/pipelines/gio.c: - Update to latest API changes in GLib/GIO and require at least - gio-2.0 2.15.0 for this. - * ext/gio/Makefile.am: - Add GST_PLUGIN_LDFLAGS to LDFLAGS. - -2007-12-29 00:37:41 +0000 David Schleef <ds@schleef.org> - - Major cleanup of code. Convert glupload to BaseTransform. - Original commit message from CVS: - * configure.ac: - * sys/glsink/glextensions.c: - * sys/glsink/glextensions.h: - * sys/glsink/glimagesink.c: - * sys/glsink/glimagesink.h: - * sys/glsink/gstglbuffer.c: - * sys/glsink/gstglbuffer.h: - * sys/glsink/gstglconvert.c: - * sys/glsink/gstgldisplay.c: - * sys/glsink/gstgldisplay.h: - * sys/glsink/gstgldownload.c: - * sys/glsink/gstglfilter.c: - * sys/glsink/gstglfilter.h: - * sys/glsink/gstglfilterexample.c: - * sys/glsink/gstgltestsrc.c: - * sys/glsink/gstglupload.c: - Major cleanup of code. Convert glupload to BaseTransform. - Handle caps negotiation mostly correctly. Reenable in build. - -2007-12-28 11:44:28 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/soup/: Use gst_tag_freeform_string_to_utf8() and post radio station info as tags on the bus. - Original commit message from CVS: - * ext/soup/Makefile.am: - * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_get_property), - (gst_souphttp_src_unicodify), (soup_got_headers): - Use gst_tag_freeform_string_to_utf8() and post radio station - info as tags on the bus. - -2007-12-27 05:26:05 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Change glimagesink over to using GL buffers. This breaks glimagesink for normal operation, but should b... - Original commit message from CVS: - * sys/glsink/glimagesink.c: - * sys/glsink/gstglupload.c: - Change glimagesink over to using GL buffers. This breaks - glimagesink for normal operation, but should be fixed soon. - -2007-12-27 04:15:26 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Convert gldownload to BaseTransform. Make glfilterexample visually interesting. Add support for variou... - Original commit message from CVS: - * sys/glsink/gltestsrc.c: - * sys/glsink/gstglbuffer.c: - * sys/glsink/gstglbuffer.h: - * sys/glsink/gstgldownload.c: - * sys/glsink/gstglfilter.c: - * sys/glsink/gstglfilterexample.c: - * sys/glsink/gstgltestsrc.c: - * sys/glsink/gstglupload.c: - Convert gldownload to BaseTransform. Make glfilterexample - visually interesting. Add support for various formats to - downloading. Fix a few places where we leak GL state to - other elements (bad, but hard to prevent). - -2007-12-27 00:52:23 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Remove code that handles non-texture buffers. Add a - Original commit message from CVS: - * sys/glsink/BUGS: - * sys/glsink/Makefile.am: - * sys/glsink/gstglbuffer.c: - * sys/glsink/gstglbuffer.h: - * sys/glsink/gstglconvert.c: - * sys/glsink/gstgldisplay.c: - * sys/glsink/gstglfilter.c: - * sys/glsink/gstglfilter.h: - * sys/glsink/gstglfilterexample.c: - * sys/glsink/gstgltestsrc.c: - * sys/glsink/gstglupload.c: - * sys/glsink/gstopengl.c: - Remove code that handles non-texture buffers. Add a - GstGLBufferFormat type that corresponds to how to use the - texture, not the original video format. Convert gstflfilter.c - into a base class, add glfilterexample and glconvert elements. - * sys/glsink/color_matrix.c: - Minor ramblings about color conversion matrices. - -2007-12-25 00:34:14 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Add gltestsrc element, a duplicate of videotestsrc that uses - Original commit message from CVS: - * sys/glsink/Makefile.am: - * sys/glsink/gltestsrc.c: - * sys/glsink/gltestsrc.h: - * sys/glsink/gstgldisplay.c: - * sys/glsink/gstgldownload.c: - * sys/glsink/gstglfilter.c: - * sys/glsink/gstgltestsrc.c: - * sys/glsink/gstgltestsrc.h: - * sys/glsink/gstglupload.c: - * sys/glsink/gstopengl.c: - Add gltestsrc element, a duplicate of videotestsrc that uses - GL rendering to create images. More cleanup. - -2007-12-24 21:26:40 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Clean up code. Fix a few leaks. - Original commit message from CVS: - * sys/glsink/gstglbuffer.c: - * sys/glsink/gstgldownload.c: - * sys/glsink/gstglfilter.c: - Clean up code. Fix a few leaks. - -2007-12-24 21:04:46 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Rename glvideo.ch to gstgldisplay.ch. - Original commit message from CVS: - * sys/glsink/Makefile.am: - * sys/glsink/glimagesink.h: - * sys/glsink/glvideo.c: - * sys/glsink/glvideo.h: - * sys/glsink/gstglbuffer.c: - * sys/glsink/gstglbuffer.h: - * sys/glsink/gstgldisplay.c: - * sys/glsink/gstgldisplay.h: - Rename glvideo.ch to gstgldisplay.ch. - -2007-12-24 20:53:56 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Rewrite a bunch of code to use textures as the intermediate instead of renderbuffers. upload, download,... - Original commit message from CVS: - * sys/glsink/glimagesink.c: - * sys/glsink/glimagesink.h: - * sys/glsink/glvideo.c: - * sys/glsink/glvideo.h: - * sys/glsink/gstglbuffer.c: - * sys/glsink/gstglbuffer.h: - * sys/glsink/gstgldownload.c: - * sys/glsink/gstglfilter.c: - * sys/glsink/gstglupload.c: - Rewrite a bunch of code to use textures as the intermediate - instead of renderbuffers. upload, download, filtering all - work. - -2007-12-23 22:04:00 +0000 David Schleef <ds@schleef.org> - - gst/videoparse/: Remove videoparse element, because it was moved to gst/rawparse/ - Original commit message from CVS: - * gst/videoparse/Makefile.am: - * gst/videoparse/README: - * gst/videoparse/gstvideoparse.c: - Remove videoparse element, because it was moved to gst/rawparse/ - -2007-12-23 10:34:39 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/rawparse/gstrawparse.c: Always seek on frame boundaries, will produce nothing useful otherwise. - Original commit message from CVS: - * gst/rawparse/gstrawparse.c: (gst_raw_parse_src_event): - Always seek on frame boundaries, will produce nothing useful - otherwise. - -2007-12-23 06:22:32 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add new plugin rawparse that contains a base class for raw data parsers and the two elements audioparse and videopars... - Original commit message from CVS: - * configure.ac: - * gst/rawparse/Makefile.am: - * gst/rawparse/README: - * gst/rawparse/gstaudioparse.c: (gst_audio_parse_format_get_type), - (gst_audio_parse_endianness_get_type), (gst_audio_parse_base_init), - (gst_audio_parse_class_init), (gst_audio_parse_init), - (gst_audio_parse_set_property), (gst_audio_parse_get_property), - (gst_audio_parse_update_frame_size), (gst_audio_parse_get_caps): - * gst/rawparse/gstaudioparse.h: - * gst/rawparse/gstrawparse.c: (gst_raw_parse_base_init), - (gst_raw_parse_class_init), (gst_raw_parse_init), - (gst_raw_parse_dispose), - (gst_raw_parse_class_set_src_pad_template), - (gst_raw_parse_class_set_multiple_frames_per_buffer), - (gst_raw_parse_reset), (gst_raw_parse_chain), - (gst_raw_parse_convert), (gst_raw_parse_sink_event), - (gst_raw_parse_src_event), (gst_raw_parse_src_query_type), - (gst_raw_parse_src_query), (gst_raw_parse_set_framesize), - (gst_raw_parse_set_fps), (gst_raw_parse_get_fps), - (gst_raw_parse_is_negotiated): - * gst/rawparse/gstrawparse.h: - * gst/rawparse/gstvideoparse.c: (gst_video_parse_format_get_type), - (gst_video_parse_endianness_get_type), (gst_video_parse_base_init), - (gst_video_parse_class_init), (gst_video_parse_init), - (gst_video_parse_set_property), (gst_video_parse_get_property), - (gst_video_parse_format_to_fourcc), - (gst_video_parse_update_frame_size), (gst_video_parse_get_caps): - * gst/rawparse/gstvideoparse.h: - * gst/rawparse/plugin.c: (plugin_init): - Add new plugin rawparse that contains a base class for raw data - parsers and the two elements audioparse and videoparse that can - be used to parse raw audio and video. These are inspired by the - old videoparse element which the new rawparse plugin deprecates. - -2007-12-22 05:01:58 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: A careful read of the documentation reveals that I can't use renderbuffers as textures. Duh. Checkpoin... - Original commit message from CVS: - * sys/glsink/glextensions.c: - * sys/glsink/glextensions.h: - * sys/glsink/glvideo.c: - * sys/glsink/glvideo.h: - * sys/glsink/gstglbuffer.c: - * sys/glsink/gstgldownload.c: - * sys/glsink/gstglupload.c: - A careful read of the documentation reveals that I can't use - renderbuffers as textures. Duh. Checkpoint because I'm about - to rewrite a bunch of code. +2022-03-13 00:17:48 +0900 Seungha Yang <seungha@centricular.com> -2007-12-21 19:01:00 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstnvbaseenc.c: + nvenc: Fix deadlock because of too strict buffer pool size + The pool size might need to be larger than encoding surface pool size. + Also, because we always copy input frame into internal CUDA memory, + there's no reason to restrict max size of buffer pool. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1939> - * ChangeLog: - * ext/metadata/TODO: - * ext/metadata/gstbasemetadata.c: - * ext/metadata/gstbasemetadata.h: - * ext/metadata/metadata.h: - * ext/metadata/metadataiptc.c: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparseutil.c: - Some IPTC tags mapped. - Original commit message from CVS: - Some IPTC tags mapped. +2022-03-12 10:31:13 +0800 He Junyan <junyan.he@intel.com> -2007-12-21 09:45:56 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/va/gstvah264enc.c: + va: Fix a regression because of "Invert video codec frame dependency". + 1. Always set the according GstVaH264EncFrame pointer when GstVideoCodecFrame + pointer is assigned, which can make the logic safe. + 2. Fix the forgotten change in _sort_by_frame_num. Its input pointer now is + GstVideoCodecFrame type. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1935> - * ChangeLog: - * ext/metadata/Makefile.am: - * ext/metadata/TODO: - * ext/metadata/gstbasemetadata.c: - * ext/metadata/gstbasemetadata.h: - * ext/metadata/gstmetadatacommon.c: - * ext/metadata/gstmetadatacommon.h: - * ext/metadata/metadata.c: - * ext/metadata/metadata.h: - Removed gstmetadatacommon. - Original commit message from CVS: - Removed gstmetadatacommon. - -2007-12-21 00:03:11 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Switch to using framebuffer_objects instead of GLXPixmaps, because that's what my driver supports. Remo... - Original commit message from CVS: - * sys/glsink/Makefile.am: - * sys/glsink/glextensions.c: - * sys/glsink/glextensions.h: - * sys/glsink/glimagesink.c: - * sys/glsink/glimagesink.h: - * sys/glsink/glvideo.c: - * sys/glsink/glvideo.h: - * sys/glsink/gstglbuffer.c: - * sys/glsink/gstglbuffer.h: - * sys/glsink/gstgldownload.c: - * sys/glsink/gstglfilter.c: - * sys/glsink/gstglupload.c: - * sys/glsink/gstopengl.c: - Switch to using framebuffer_objects instead of GLXPixmaps, - because that's what my driver supports. Remove GLDrawable, - since GstGLDisplay now has a default drawable and context. - -2007-12-20 17:07:22 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/: Ignore more. - Original commit message from CVS: - * gst/equalizer/.cvsignore: - * gst/switch/.cvsignore: - Ignore more. +2022-03-09 03:45:18 +0900 Seungha Yang <seungha@centricular.com> -2007-12-19 09:50:47 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst-libs/gst/codecs/gstav1decoder.c: + * gst-libs/gst/codecs/gstav1picture.c: + * gst-libs/gst/codecs/gstav1picture.h: + * gst-libs/gst/codecs/gsth264decoder.c: + * gst-libs/gst/codecs/gsth264picture.c: + * gst-libs/gst/codecs/gsth264picture.h: + * gst-libs/gst/codecs/gsth265decoder.c: + * gst-libs/gst/codecs/gsth265picture.c: + * gst-libs/gst/codecs/gsth265picture.h: + * gst-libs/gst/codecs/gstmpeg2decoder.c: + * gst-libs/gst/codecs/gstmpeg2picture.c: + * gst-libs/gst/codecs/gstmpeg2picture.h: + * gst-libs/gst/codecs/gstvp8decoder.c: + * gst-libs/gst/codecs/gstvp8picture.h: + * gst-libs/gst/codecs/gstvp9decoder.c: + * gst-libs/gst/codecs/gstvp9picture.c: + * gst-libs/gst/codecs/gstvp9picture.h: + * sys/nvcodec/gstnvh264dec.c: + * sys/va/gstvah264dec.c: + codecs: Rename picture clear functions + Our convention for clear method is gst_clear_foo_bar(). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1897> - * ChangeLog: - * ext/metadata/Makefile.am: - * ext/metadata/TODO: - * ext/metadata/gstbasemetadata.c: - * ext/metadata/gstbasemetadata.h: - * ext/metadata/gstmetadatacommon.c: - * ext/metadata/gstmetadatacommon.h: - * ext/metadata/gstmetadatademux.c: - * ext/metadata/gstmetadatademux.h: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadatamux.h: - * ext/metadata/metadata.c: - * ext/metadata/metadata.h: - * ext/metadata/metadatatags.h: - * ext/metadata/test/metadata_editor.c: - New base class for metadata elements. - Original commit message from CVS: - New base class for metadata elements. - -2007-12-18 16:08:13 +0000 Andy Wingo <wingo@pobox.com> - - gst/switch/: gst/switch/gstswitch.c (enum, gst_selector_pad_class_init) (gst_selector_pad_get_property) (gst_selector... - Original commit message from CVS: - 2007-12-18 Andy Wingo <wingo@pobox.com> - * gst/switch/gstswitch-marshal.list: - * gst/switch/gstswitch.h (struct _GstStreamSelectorClass): - * gst/switch/gstswitch.c (enum, gst_selector_pad_class_init) - (gst_selector_pad_get_property) - (gst_selector_pad_get_running_time) - (gst_stream_selector_class_init, gst_segment_get_timestamp) - (gst_segment_set_stop, gst_segment_set_start) - (gst_stream_selector_set_active_pad, gst_stream_selector_block) - (gst_stream_selector_push_pending_stop) - (gst_stream_selector_switch): Change so that the signals and - properties deal in running time, not buffer time. Document the - signals more. Change uint64 in API to int64, to reflect what's in - GstSegment. - -2007-12-18 09:26:42 +0000 Tim-Philipp Müller <tim@centricular.net> - - Makefile.am: Include common/win32.mak for CRLF check of win32 project files (see #393626). - Original commit message from CVS: - * Makefile.am: - Include common/win32.mak for CRLF check of win32 project - files (see #393626). - * configure.ac: - Bump requirements to -base CVS for libgstvideo additions in - glimagesink. Disable glimagesink until the missing files get - checked in. - -2007-12-18 01:25:58 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Use new GstVideoFormat checked into -base. Add new glupload element to upload raw video into a GLXPixbu... - Original commit message from CVS: - * sys/glsink/Makefile.am: - * sys/glsink/glimagesink.c: - * sys/glsink/glimagesink.h: - * sys/glsink/glvideo.c: - * sys/glsink/glvideo.h: - * sys/glsink/gstopengl.c: - * sys/glsink/gstglupload.c: - Use new GstVideoFormat checked into -base. Add new glupload - element to upload raw video into a GLXPixbuf. Untested. Will - likely crash your motorcycle if you try it. - * sys/glsink/gstvideo-common.c: - * sys/glsink/gstvideo-common.h: - Remove. - -2007-12-17 21:12:28 +0000 David Schleef <ds@schleef.org> - - gst/multifile/gstmultifilesrc.*: When subsequent files are read, if the file doesn't exist, send an EOS instead of ca... - Original commit message from CVS: - * gst/multifile/gstmultifilesrc.c: - * gst/multifile/gstmultifilesrc.h: - When subsequent files are read, if the file doesn't exist, send - an EOS instead of causing an error. - -2007-12-17 15:09:17 +0000 Andy Wingo <wingo@pobox.com> - - gst/switch/gstswitch.c (gst_selector_pad_chain): Return OK when a buffer is ignored, not NOT_LINKED. No sense in maki... - Original commit message from CVS: - 2007-12-17 Andy Wingo <wingo@pobox.com> - * gst/switch/gstswitch.c (gst_selector_pad_chain): Return OK when - a buffer is ignored, not NOT_LINKED. No sense in making a source - element error out; at least fdsrc considers NOT_LINKED to be a - fatal error. Patch 11/12. There is no patch 12/12. Foo. - -2007-12-17 15:06:48 +0000 Andy Wingo <wingo@pobox.com> - - gst/switch/: gst/switch/gstswitch.c (gst_stream_selector_class_init) (gst_stream_selector_block): Make the block() si... - Original commit message from CVS: - 2007-12-17 Andy Wingo <wingo@pobox.com> - * gst/switch/gstswitch-marshal.list: - * gst/switch/gstswitch.h (struct _GstStreamSelectorClass): - * gst/switch/gstswitch.c (gst_stream_selector_class_init) - (gst_stream_selector_block): Make the block() signal return the - last stop time of the active pad. Patch 10/12. +2022-03-11 23:20:26 +0900 Seungha Yang <seungha@centricular.com> -2007-12-17 15:04:51 +0000 Andy Wingo <wingo@pobox.com> + * sys/nvcodec/gstnvh265dec.c: + nvh265sldec: Always fill SPS/PPS related parameters + Address compare was not a valid approach since it works + only if SPS/PPS id are changed. Otherwise it will always point to + the same address of member variables of h265parser. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1931> - * ChangeLog: - * gst/switch/gstswitch.c: - gst/switch/gstswitch.c (gst_selector_pad_get_property) (gst_selector_pad_class_init, gst_stream_selector_class_init) - Original commit message from CVS: - 2007-12-17 Andy Wingo <wingo@pobox.com> - * gst/switch/gstswitch.c (gst_selector_pad_get_property) - (gst_selector_pad_class_init, gst_stream_selector_class_init) - (gst_stream_selector_get_property): Expose 'last-stop-time' as a - pad property, not an element property. - (gst_selector_pad_chain): Mark the last_stop time as timestamp + - duration, not timestamp. Patch 9/12. +2022-03-11 19:32:59 +0900 Seungha Yang <seungha@centricular.com> -2007-12-17 15:01:55 +0000 Andy Wingo <wingo@pobox.com> + * gst-libs/gst/codecs/gsth264picture.c: + h264decoder: Fix invalid memory access + gst_h264_dpb_needs_bump() can be called with null picture + in case of live + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1928> - * ChangeLog: - * gst/switch/gstswitch.c: - gst/switch/gstswitch.c (gst_stream_selector_change_state) - Original commit message from CVS: - 2007-12-17 Andy Wingo <wingo@pobox.com> - * gst/switch/gstswitch.c (gst_stream_selector_change_state) - (gst_stream_selector_block, gst_stream_selector_switch): Use the - cond mechanism instead of blocked pads. Patch 8/12. - -2007-12-17 15:00:15 +0000 Andy Wingo <wingo@pobox.com> - - gst/switch/gstswitch.h (struct _GstStreamSelector): gst/switch/gstswitch.c (gst_stream_selector_wait) (gst_selector_p... - Original commit message from CVS: - 2007-12-17 Andy Wingo <wingo@pobox.com> - * gst/switch/gstswitch.h (struct _GstStreamSelector): - * gst/switch/gstswitch.c (gst_stream_selector_wait) - (gst_selector_pad_chain, gst_stream_selector_init) - (gst_stream_selector_dispose): Add infrastructure for new blocking - mechanism that does not use gst_pad_set_blocked, which does not - work on sink pads. Patch 7/12. +2022-02-10 08:01:02 +0100 Branko Subasic <branko@axis.com> -2007-12-17 14:58:18 +0000 Andy Wingo <wingo@pobox.com> + * docs/plugins/gst_plugins_cache.json: + * gst/onvif/gstrtponviftimestamp.c: + * gst/onvif/gstrtponviftimestamp.h: + * tests/check/elements/rtponviftimestamp.c: + rtponviftimestamp: add support for using reference timestamps + Make it posible to configure the element to obtain the timestamps from + reference timestamp meta data instead of using the ntp-offset property, + or estimating its own offset. Currently the only time format supported + is "timestamp/x-unix", i.e. UTC time expressed in the unix time epoch. + In addition the custom event GstNtpOffset has been renamed to + GstOnvifTimestamp, to reflect that it is not necessarily used to convey + the ntp-offset. As a consequence we had to modify a couple of files in + the rtsp-server as well. + Fixes #984 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1683> - * ChangeLog: - * gst/switch/gstswitch.c: - gst/switch/gstswitch.c (gst_stream_selector_class_init) - Original commit message from CVS: - 2007-12-17 Andy Wingo <wingo@pobox.com> - * gst/switch/gstswitch.c (gst_stream_selector_class_init) - (gst_stream_selector_get_property): Add last-stop-time readable - property. Patch 6/12. - -2007-12-17 14:55:54 +0000 Andy Wingo <wingo@pobox.com> - - gst/switch/gstswitch.h (struct _GstStreamSelector): Add some state variables. - Original commit message from CVS: - 2007-12-17 Andy Wingo <wingo@pobox.com> - * gst/switch/gstswitch.h (struct _GstStreamSelector): Add some - state variables. - * gst/switch/gstswitch.c (gst_stream_selector_push_pending_stop) - (gst_selector_pad_chain): Push any pending stop event. - (gst_stream_selector_set_active_pad) - (gst_stream_selector_set_property): Factor out setting the active - pad to a function. Close the segment of the previous active pad if - told to do so via a stop_time != GST_CLOCK_TIME_NONE. - (gst_stream_selector_switch): Implement switch vmethod. Patch 5/12. - -2007-12-17 14:52:14 +0000 Andy Wingo <wingo@pobox.com> - - gst/switch/gstswitch.c (gst_stream_selector_block): Implement the block() signal. This implementation will be replace... - Original commit message from CVS: - 2007-12-17 Andy Wingo <wingo@pobox.com> - * gst/switch/gstswitch.c (gst_stream_selector_block): Implement - the block() signal. This implementation will be replaced in future - patches, however. Patch 4/12. - -2007-12-17 14:48:26 +0000 Andy Wingo <wingo@pobox.com> - - gst/switch/gstswitch.h (struct _GstStreamSelectorClass): Fix vmethod prototypes. - Original commit message from CVS: - 2007-12-17 Andy Wingo <wingo@pobox.com> - * gst/switch/gstswitch.h (struct _GstStreamSelectorClass): Fix - vmethod prototypes. - * gst/switch/gstswitch.c (gst_stream_selector_class_init) - (gst_stream_selector_block, gst_stream_selector_switch): Add empty - vmethod definitions. Patch 3/12. - -2007-12-17 14:46:26 +0000 Andy Wingo <wingo@pobox.com> - - gst/switch/gstswitch.*: Add `block' and `switch' signals. - Original commit message from CVS: - 2007-12-17 Andy Wingo <wingo@pobox.com> - * gst/switch/gstswitch.h (struct _GstStreamSelectorClass): - * gst/switch/gstswitch.c (gst_stream_selector_class_init): Add - `block' and `switch' signals. - * gst/switch/Makefile.am: - * gst/switch/gstswitch-marshal.list: Add foo to generate a - marshaller for the `switch' signal. Patch 2/12. - -2007-12-17 14:43:04 +0000 Andy Wingo <wingo@pobox.com> - - gst/switch/gstswitch.*: Replace with files from gststreamselector.ch, registered as the "switch" plugin, with "GstS... - Original commit message from CVS: - 2007-12-17 Andy Wingo <wingo@pobox.com> - * gst/switch/gstswitch.h: - * gst/switch/gstswitch.c: Replace with files from - gststreamselector.ch, registered as the "switch" plugin, with - "GstSwitch" types. Patch 1/12. - -2007-12-17 14:37:39 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - add libsoup plugin to spec - Original commit message from CVS: - add libsoup plugin to spec +2022-03-10 18:40:12 +0000 Tim-Philipp Müller <tim@centricular.com> -2007-12-17 12:37:36 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst/sdp/gstsdpdemux.c: + sdpdemux: add media attributes to caps to fix ptp clock handling + Those are needed by rtpjitterbuffer to do the right thing, e.g. + a=ts-refclk:ptp=IEEE1588-2008:00-**-**-**-**-**-**-**:0 + a=mediaclk:direct=1266592257 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1924> - * ChangeLog: - * ext/metadata/TODO: - * ext/metadata/gstmetadatademux.c: - * ext/metadata/metadata.c: - * ext/metadata/metadata.h: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsejpeg.h: - * ext/metadata/metadataparsepng.c: - * ext/metadata/metadataparsepng.h: - * ext/metadata/test/MetadataEditorMain.glade: - * ext/metadata/test/metadata_editor.c: - Added "parse-only" property to metadatademux. - Original commit message from CVS: - Added "parse-only" property to metadatademux. - -2007-12-16 22:57:22 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Rename GLVideo* to GstGL*. - Original commit message from CVS: - * sys/glsink/glimagesink.c: - * sys/glsink/glimagesink.h: - * sys/glsink/glvideo.c: - * sys/glsink/glvideo.h: - Rename GLVideo* to GstGL*. - -2007-12-16 00:16:46 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Add vblank synchronization. Isn't really working on my driver. :( - Original commit message from CVS: - * sys/glsink/Makefile.am: - * sys/glsink/glextensions.c: - * sys/glsink/glextensions.h: - * sys/glsink/glvideo.c: - Add vblank synchronization. Isn't really working on my - driver. :( - -2007-12-15 19:31:23 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Add support for xRGB, xBGR, and AYUV. Re-add support for power-of-2 textures. - Original commit message from CVS: - * sys/glsink/Makefile.am: - * sys/glsink/glimagesink.c: - * sys/glsink/glvideo.c: - * sys/glsink/glvideo.h: - * sys/glsink/gstvideo-common.c: - * sys/glsink/gstvideo-common.h: - Add support for xRGB, xBGR, and AYUV. Re-add support for - power-of-2 textures. - -2007-12-15 17:52:46 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/videoparse/gstvideoparse.c: Free the adapter on dispose and correctly reset on newsegment events. - Original commit message from CVS: - * gst/videoparse/gstvideoparse.c: (gst_video_parse_dispose), - (gst_video_parse_sink_event): - Free the adapter on dispose and correctly reset on newsegment events. - -2007-12-15 13:10:00 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/videoparse/gstvideoparse.c: Improve duration query by first asking upstream and if it can't handle the query try ... - Original commit message from CVS: - * gst/videoparse/gstvideoparse.c: (gst_video_parse_sink_event), - (gst_video_parse_src_event), (gst_video_parse_src_query): - Improve duration query by first asking upstream and if it can't handle - the query try to get the duration in bytes from upstream and convert. - For seeks, try if upstream handles this already first and do our - conversion to byte format only if it doesn't and if we get a - newsegment event in time format keep it and only do our conversions - if the event has another format. - -2007-12-15 07:37:20 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/videoparse/gstvideoparse.c: Add support for video/x-raw-rgb and video/x-raw-gray. Also send downstream elements d... - Original commit message from CVS: - * gst/videoparse/gstvideoparse.c: - (gst_video_parse_format_get_type), - (gst_video_parse_endianness_get_type), - (gst_video_parse_class_init), (gst_video_parse_init), - (gst_video_parse_set_property), (gst_video_parse_get_property), - (gst_video_parse_format_to_fourcc), - (gst_video_parse_update_block_size), (gst_video_parse_chain), - (gst_video_parse_sink_event): - Add support for video/x-raw-rgb and video/x-raw-gray. Also send - downstream elements downstream, not upstream. - -2007-12-15 06:33:37 +0000 David Schleef <ds@schleef.org> - - sys/glsink/gstvideo-common.*: Pull together some common raw video functions into one location. - Original commit message from CVS: - * sys/glsink/gstvideo-common.c: - * sys/glsink/gstvideo-common.h: - Pull together some common raw video functions into one location. - This should eventually move to -base. - * sys/glsink/Makefile.am: - * sys/glsink/glimagesink.c: - * sys/glsink/glimagesink.h: - * sys/glsink/glvideo.c: - * sys/glsink/glvideo.h: - * sys/glsink/gstopengl.c: - Use the new video-common.h stuff. Readd support for RGB video. +2022-03-08 16:20:27 +0100 Corentin Damman <c.damman@intopix.com> -2007-12-14 18:18:37 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstcudaformat.h: + * sys/nvcodec/gstcudamemorycopy.c: + cudamemorycopy: add D3D11 resource support + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1807> - * ChangeLog: - * ext/metadata/Makefile.am: - * ext/metadata/TODO: - * ext/metadata/gstmetadata.c: - * ext/metadata/gstmetadatacommon.c: - * ext/metadata/gstmetadatacommon.h: - * ext/metadata/gstmetadatademux.c: - * ext/metadata/gstmetadatademux.h: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadatamux.h: - * ext/metadata/metadataexif.c: - * ext/metadata/metadatatags.c: - * ext/metadata/test/metadata_editor.c: - Added new module for common functions. Using GST_TYPE_FRACTION for Exif (S)Rational types. - Original commit message from CVS: - Added new module for common functions. Using GST_TYPE_FRACTION for Exif (S)Rational types. - -2007-12-14 17:51:49 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtspacketizer.*: Hash streams by pid again. Add a linked list inside each stream with a list of su... - Original commit message from CVS: - * gst/mpegtsparse/mpegtspacketizer.c: - * gst/mpegtsparse/mpegtspacketizer.h: - Hash streams by pid again. Add a linked list inside each - stream with a list of sub_tables. Fix multiple sections - as it was borked with my last commit. +2022-03-09 09:35:16 +0100 Corentin Damman <c.damman@intopix.com> -2007-12-14 16:23:06 +0000 Christian Schaller <uraeus@gnome.org> + * sys/nvcodec/gstcudacontext.c: + * sys/nvcodec/meson.build: + cudacontext: find associated DXGI Adapter LUID + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1807> - * ChangeLog: - * gst-plugins-bad.spec.in: - * gst/speexresample/Makefile.am: - * sys/glsink/Makefile.am: - update spec file and add two missing files for disting - Original commit message from CVS: - update spec file and add two missing files for disting +2022-02-28 14:40:51 +0100 Corentin Damman <c.damman@intopix.com> -2007-12-13 17:19:54 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstcudautils.c: + * sys/nvcodec/gstcudautils.h: + * sys/nvcodec/meson.build: + * sys/nvcodec/stub/cuda.h: + cudautils: add support of D3D11 resource as Cuda graphics resource type + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1807> - * ChangeLog: - * ext/metadata/TODO: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/metadata.c: - * ext/metadata/metadata.h: - * ext/metadata/metadataiptc.c: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadatamuxjpeg.h: - * ext/metadata/metadatamuxpng.c: - * ext/metadata/metadatamuxpng.h: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsejpeg.h: - * ext/metadata/metadataparsepng.c: - * ext/metadata/metadataparsepng.h: - * ext/metadata/metadataparseutil.c: - * ext/metadata/metadataparseutil.h: - * ext/metadata/metadatatypes.h: - * ext/metadata/metadataxmp.c: - Code documentation. - Original commit message from CVS: - Code documentation. +2022-02-28 11:24:31 +0100 Corentin Damman <c.damman@intopix.com> -2007-12-13 12:45:06 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstcudaloader.c: + * sys/nvcodec/gstcudaloader.h: + * sys/nvcodec/stub/cuda.h: + cudaloader: add D3D11 API + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1807> - * ChangeLog: - * common: - * configure.ac: - * ext/metadata/Makefile.am: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/metadataexif.c: - * ext/metadata/metadatatags.c: - * ext/metadata/test/Makefile: - * ext/metadata/test/MetadataEditorMain.glade: - * ext/metadata/test/metadata_editor.c: - Added a test application. Added some EXIF tags. Fixed a muxer bug. - Original commit message from CVS: - Added a test application. Added some EXIF tags. Fixed a muxer bug. - -2007-12-13 11:25:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/videoparse/gstvideoparse.c: Implement a query type function for the src pad, implement seeking and use ANY caps f... - Original commit message from CVS: - * gst/videoparse/gstvideoparse.c: (gst_video_parse_init), - (gst_video_parse_src_event), (gst_video_parse_src_query_type): - Implement a query type function for the src pad, implement seeking - and use ANY caps for the sink pad as the element doesn't care what - caps the input has and everything is handled via properties. - -2007-12-13 10:38:23 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/videoparse/gstvideoparse.c: Handle -1 values for the CONVERT query too. - Original commit message from CVS: - * gst/videoparse/gstvideoparse.c: (gst_video_parse_convert), - (gst_video_parse_sink_event): - Handle -1 values for the CONVERT query too. - -2007-12-13 10:16:48 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/videoparse/gstvideoparse.c: Add YV12 to the pad templates as it is supported too and allow - Original commit message from CVS: - * gst/videoparse/gstvideoparse.c: (gst_video_parse_sink_event): - Add YV12 to the pad templates as it is supported too and allow - -1 as stop position for NEWSEGMENT events. - -2007-12-13 08:54:08 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/videoparse/Makefile.am: Add $(GST_PLUGINS_BASE_CFLAGS) to CFLAGS to fix the build. - Original commit message from CVS: - * gst/videoparse/Makefile.am: - Add $(GST_PLUGINS_BASE_CFLAGS) to CFLAGS to fix the build. - * gst/videoparse/gstvideoparse.c: (gst_video_parse_init), - (gst_video_parse_set_property), (gst_video_parse_get_property): - Use g_value_sget_enum() for enum properties, g_value_sget_int() - gives a g_critical(). - -2007-12-13 04:43:58 +0000 David Schleef <ds@schleef.org> - - gst/videoparse/: Add a bunch of features: handle format specification, handle queries and conversion. Works much lik... - Original commit message from CVS: - * gst/videoparse/README: - * gst/videoparse/gstvideoparse.c: - Add a bunch of features: handle format specification, handle - queries and conversion. Works much like a normal parser now. - -2007-12-12 16:59:03 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Clean up the dynamic pads when going to READY. - Original commit message from CVS: - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_finalize), - (gst_rtp_pt_demux_setup), (gst_rtp_pt_demux_release), - (gst_rtp_pt_demux_change_state): - * gst/rtpmanager/gstrtpssrcdemux.c: (gst_rtp_ssrc_demux_reset), - (gst_rtp_ssrc_demux_dispose), (gst_rtp_ssrc_demux_src_query), - (gst_rtp_ssrc_demux_change_state): - Clean up the dynamic pads when going to READY. - -2007-12-12 12:11:53 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Fix some leaks. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_finalize), - (gst_rtp_bin_set_sdes_string), (gst_rtp_bin_get_sdes_string), - (gst_rtp_bin_handle_message): - * gst/rtpmanager/rtpsession.c: (rtp_session_finalize), - (rtp_session_send_bye): - * gst/rtpmanager/rtpsource.c: (rtp_source_finalize): - Fix some leaks. - -2007-12-12 04:11:15 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/dts/gstdtsdec.*: Add support for "audio/x-private1-dts" as used by flupsparse. Most changes adapted from a52dec. - Original commit message from CVS: - * ext/dts/gstdtsdec.c: (gst_dtsdec_init), - (gst_dtsdec_sink_setcaps), (gst_dtsdec_chain_raw), - (gst_dtsdec_chain): - * ext/dts/gstdtsdec.h: - Add support for "audio/x-private1-dts" as used by flupsparse. Most - changes adapted from a52dec. - -2007-12-12 02:33:12 +0000 David Schleef <ds@schleef.org> - - sys/glsink/: Split out gl-related code into a separate file with a sensible API. Major cleanup. Still crashes occas... - Original commit message from CVS: - * sys/glsink/Makefile.am: - * sys/glsink/glimagesink.c: - * sys/glsink/glvideo.c: - * sys/glsink/glvideo.h: - Split out gl-related code into a separate file with a - sensible API. Major cleanup. Still crashes occasionally - due to different threads touching bits at the same time. - -2007-12-11 16:39:39 +0000 Wouter Cloetens <wouter@mind.be> - - ext/soup/gstsouphttpsrc.*: Do not try to unpause I/O in the "queued" state. - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * ext/soup/gstsouphttpsrc.c: (_do_init), - (gst_souphttp_src_class_init), (gst_souphttp_src_init), - (gst_souphttp_src_dispose), (gst_souphttp_src_set_property), - (gst_souphttp_src_get_property), (unicodify), - (gst_souphttp_src_unicodify), (gst_souphttp_src_create), - (gst_souphttp_src_start), (gst_souphttp_src_stop), - (gst_souphttp_src_unlock), (gst_souphttp_src_unlock_stop), - (gst_souphttp_src_get_size), (gst_souphttp_src_is_seekable), - (soup_got_headers), (soup_got_body), (soup_finished), - (soup_got_chunk), (soup_response), (soup_parse_status), - (gst_souphttp_src_uri_get_type), - (gst_souphttp_src_uri_get_protocols), - (gst_souphttp_src_uri_get_uri), (gst_souphttp_src_uri_set_uri), - (gst_souphttp_src_uri_handler_init): - * ext/soup/gstsouphttpsrc.h: - Do not try to unpause I/O in the "queued" state. - Reorganise a bunch of things and cleanups. - Uses G_GUINT64_FORMAT instead of hard-coding %llu. - See #502335. - -2007-12-11 16:26:07 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/x264/gstx264enc.c: Fix caps memleak. - Original commit message from CVS: - * ext/x264/gstx264enc.c: (gst_x264_enc_set_src_caps): - Fix caps memleak. - -2007-12-11 11:54:43 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/flv/gstflvparse.c: Don't strdup (and thus leak) codec name strings when passing them to gst_tag_list_add(). - Original commit message from CVS: - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video): - Don't strdup (and thus leak) codec name strings when passing - them to gst_tag_list_add(). - -2007-12-10 18:36:04 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Post a message when the SDES infor changes for a source. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init), - (gst_rtp_bin_handle_message): - * gst/rtpmanager/gstrtpsession.c: (source_get_sdes_structure), - (on_ssrc_sdes): - Post a message when the SDES infor changes for a source. - * gst/rtpmanager/rtpsession.c: - * gst/rtpmanager/rtpsource.c: - Update some comments. - -2007-12-10 17:18:35 +0000 mutex at runbox dot com <mutex@runbox.com> - - gst/videoparse/gstvideoparse.c: Forward the query upstream, the default element event handler does something differen... - Original commit message from CVS: - Based on patch by: <mutex at runbox dot com> - * gst/videoparse/gstvideoparse.c: (gst_video_parse_src_query): - Forward the query upstream, the default element event handler does - something different. Fixes #502879. - -2007-12-10 15:34:19 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Add signal to notify of an SDES change. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (on_ssrc_sdes), (create_session), - (gst_rtp_bin_class_init): - * gst/rtpmanager/gstrtpbin.h: - * gst/rtpmanager/gstrtpclient.c: - * gst/rtpmanager/gstrtpclient.h: - * gst/rtpmanager/gstrtpjitterbuffer.h: - * gst/rtpmanager/gstrtpmanager.c: - * gst/rtpmanager/gstrtpptdemux.c: - * gst/rtpmanager/gstrtpptdemux.h: - * gst/rtpmanager/gstrtpsession.c: (on_ssrc_sdes), - (gst_rtp_session_class_init), (gst_rtp_session_init): - * gst/rtpmanager/gstrtpsession.h: - * gst/rtpmanager/gstrtpssrcdemux.c: - * gst/rtpmanager/gstrtpssrcdemux.h: - * gst/rtpmanager/rtpjitterbuffer.c: - * gst/rtpmanager/rtpjitterbuffer.h: - * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), - (on_ssrc_sdes), (rtp_session_process_sdes): - * gst/rtpmanager/rtpsession.h: - * gst/rtpmanager/rtpsource.c: - * gst/rtpmanager/rtpsource.h: - * gst/rtpmanager/rtpstats.c: - * gst/rtpmanager/rtpstats.h: - Add signal to notify of an SDES change. - Fix object type in the signal callbacks. - -2007-12-10 14:03:32 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.*: Expose SDES items as properties and configure the session managers with them. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (create_session), - (gst_rtp_bin_class_init), (gst_rtp_bin_init), (sdes_type_to_name), - (gst_rtp_bin_set_sdes_string), (gst_rtp_bin_get_sdes_string), - (gst_rtp_bin_set_property), (gst_rtp_bin_get_property): - * gst/rtpmanager/gstrtpbin.h: - Expose SDES items as properties and configure the session managers with - them. - * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), - (rtp_source_set_property): - Fix SSRC property. - -2007-12-10 11:08:11 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Update comment. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (create_session): - * gst/rtpmanager/rtpjitterbuffer.c: - Update comment. - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), - (gst_rtp_session_set_property), (gst_rtp_session_get_property): - Define some GObject properties to set SDES and other configuration. - * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), - (rtp_session_init), (rtp_session_finalize), - (rtp_session_set_property), (rtp_session_get_property), - (on_ssrc_sdes), (rtp_session_set_bandwidth), - (rtp_session_get_bandwidth), (rtp_session_set_rtcp_fraction), - (rtp_session_get_rtcp_fraction), (rtp_session_set_sdes_string), - (rtp_session_get_sdes_string), (obtain_source), - (rtp_session_get_internal_source), (rtp_session_process_sdes), - (rtp_session_send_rtp), (rtp_session_next_timeout), (session_sdes), - (is_rtcp_time): - * gst/rtpmanager/rtpsession.h: - Add signal when new SDES infor has been found for a source. - Create properties for SDES and other info. - Simplify the SDES API. - Add method for getting the internal source object of the session. - * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), - (rtp_source_finalize), (rtp_source_set_property), - (rtp_source_get_property), (rtp_source_set_callbacks), - (rtp_source_get_ssrc), (rtp_source_set_as_csrc), - (rtp_source_is_as_csrc), (rtp_source_is_active), - (rtp_source_is_validated), (rtp_source_is_sender), - (rtp_source_received_bye), (rtp_source_get_bye_reason), - (rtp_source_set_sdes), (rtp_source_set_sdes_string), - (rtp_source_get_sdes), (rtp_source_get_sdes_string), - (rtp_source_get_new_sr), (rtp_source_get_new_rb): - * gst/rtpmanager/rtpsource.h: - Add GObject properties for various things. - Don't leak the bye reason. - -2007-12-09 19:37:53 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/flv/gstflvparse.c: Fix list of supported and known codecs. - Original commit message from CVS: - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video): - Fix list of supported and known codecs. - Emit tag with the codec name so it gets properly reported in totem and - other applications. - -2007-12-09 04:30:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Don't define GST_DISABLE_DEPRECATED for releases. Fixes #498181. - Original commit message from CVS: - * configure.ac: - Don't define GST_DISABLE_DEPRECATED for releases. Fixes #498181. - -2007-12-06 12:45:50 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/equalizer/gstiirequalizer.c: Fix compilation. - Original commit message from CVS: - * gst/equalizer/gstiirequalizer.c: - (gst_iir_equalizer_transform_ip): - Fix compilation. - -2007-12-06 12:42:11 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/equalizer/gstiirequalizer.c: Don't process buffers in passthrough mode. - Original commit message from CVS: - * gst/equalizer/gstiirequalizer.c: - (gst_iir_equalizer_transform_ip): - Don't process buffers in passthrough mode. - -2007-12-06 12:37:43 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/: The transform() methods are not called in passthrough mode so there's no need for checking if the elemen... - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: (bpwsinc_transform): - * gst/filter/gstlpwsinc.c: (lpwsinc_transform): - The transform() methods are not called in passthrough mode so - there's no need for checking if the element is in passthrough mode. - -2007-12-06 12:29:26 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/: Sync the GObject properties with the controller even in passthrough mode to get consistent property values. - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: (bpwsinc_transform): - * gst/filter/gstlpwsinc.c: (lpwsinc_transform): - Sync the GObject properties with the controller even in passthrough - mode to get consistent property values. - -2007-12-06 10:48:19 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/mpegtsparse/mpegtsparse.c: Mark crc values table as constant. - Original commit message from CVS: - * gst/mpegtsparse/mpegtsparse.c: (crc_tab): - Mark crc values table as constant. +2022-03-10 10:33:56 +0100 Edward Hervey <edward@centricular.com> -2007-12-05 17:00:59 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst/mpegtsdemux/mpegtsbase.c: + * gst/mpegtsdemux/mpegtsbase.h: + mpegts: Handle glib < 2.58 + By using a workaround to the lack of g_ptr_array_steal_index. + Fixes #1078 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1917> - * ChangeLog: - * ext/metadata/metadataexif.c: - * ext/metadata/metadataiptc.c: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - * ext/metadata/metadataxmp.c: - Added some tags to exif parser. - Original commit message from CVS: - Added some tags to exif parser. - -2007-12-05 12:40:05 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/: A sub table is identified by the pair table_id and sub_table_identifier, not by pid. So hash with t... - Original commit message from CVS: - * gst/mpegtsparse/mpegtspacketizer.c: - * gst/mpegtsparse/mpegtsparse.c: - A sub table is identified by the pair table_id and - sub_table_identifier, not by pid. So hash with that. - * sys/dvb/dvbbasebin.c: - Make sure initial pids are added properly to filter, - -2007-12-05 11:25:58 +0000 Andy Wingo <wingo@pobox.com> - - gst/switch/gstswitch.c (gst_switch_set_property): Don't push buffers from app thread when unsetting `queue-buffers', ... - Original commit message from CVS: - 2007-12-05 Andy Wingo <wingo@pobox.com> - * gst/switch/gstswitch.c (gst_switch_set_property): Don't push - buffers from app thread when unsetting `queue-buffers', it's - dangerous and the chain function will do it for us anyway. +2022-03-10 15:36:00 +1100 Matthew Waters <matthew@centricular.com> -2007-12-04 17:20:25 +0000 Edgard Lima <edgard.lima@indt.org.br> + * ext/webrtc/gstwebrtcbin.c: + webrtcbin: fix ulpfecenc passthrough pt + ulpfecenc uses a value of pt=255 for passthrough. + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1075 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1914> - * ChangeLog: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadataparsejpeg.c: - Now compiles even when libiptc is missing. - Original commit message from CVS: - Now compiles even when libiptc is missing. +2022-03-10 02:28:11 +0900 Seungha Yang <seungha@centricular.com> -2007-12-04 16:42:25 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstnvdec.c: + * sys/nvcodec/gstnvdec.h: + nvh264dec,nvh265dec: Fix broken key-unit trick and reverse playback + On GstVideoDecoder::{drain,flush}, we send null packet with + CUVID_PKT_ENDOFSTREAM flag to drain out decoder. Which will + reset CUVID parser as well. + To continue decoding after the drain, the next input buffer + should include sequence headers otherwise CUVID parser will + not report any decodeable frame. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1911> - * ChangeLog: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadatamux.h: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/gstmetadataparse.h: - * ext/metadata/metadata.c: - * ext/metadata/metadata.h: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadatamuxjpeg.h: - * ext/metadata/metadatamuxpng.c: - * ext/metadata/metadatamuxpng.h: - Fixed element properties and now muxer writes to png also. - Original commit message from CVS: - Fixed element properties and now muxer writes to png also. - -2007-12-03 18:28:32 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/: Remove signals for pat, pmt, nit, eit, sdt. Replace with bus messages. - Original commit message from CVS: - * gst/mpegtsparse/Makefile.am: - * gst/mpegtsparse/mpegtspacketizer.c: - * gst/mpegtsparse/mpegtsparse.c: - Remove signals for pat, pmt, nit, eit, sdt. Replace with bus - messages. - * sys/dvb/dvbbasebin.c: - Instead of attaching to signals, use the bus messages. - Also fix up so the dvbsrc starts only outputting the info tables - like PAT, CAT, NIT, SDT, EIT instead of the whole ts. +2021-11-02 09:20:55 +0100 Edward Hervey <edward@centricular.com> -2007-12-03 16:14:01 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst/mpegtsdemux/mpegtsbase.c: + tsbase: Handle more program updates + There could be a case where the new program has the same program number as the + previous one ... but is actually located on a PID previously used for elementary + stream. In that case the program is guaranteed to not be an update of the + previous program but a completely new one. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1893> - * ChangeLog: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadatamux.h: - * ext/metadata/metadataexif.c: - * ext/metadata/metadataexif.h: - * ext/metadata/metadataiptc.c: - * ext/metadata/metadataiptc.h: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadataxmp.c: - * ext/metadata/metadataxmp.h: - Muxer writes (in jpeg only) whole IPTC chunk sent as tag. Muxer implemets GstTagSetter interface. - Original commit message from CVS: - Muxer writes (in jpeg only) whole IPTC chunk sent as tag. Muxer implemets GstTagSetter interface. - -2007-12-03 13:08:26 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/rfbdecoder.c: Should fix the 64-bit build - Original commit message from CVS: - * gst/librfb/rfbdecoder.c: - Should fix the 64-bit build +2021-11-02 09:18:57 +0100 Edward Hervey <edward@centricular.com> -2007-11-30 18:30:12 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst/mpegtsdemux/mpegtsbase.c: + * gst/mpegtsdemux/mpegtsbase.h: + mpegtsbase: Use an array to track programs + We need to be able to look for programs by their PID also. Using a hash table + was a bit sub-par (and overkill) for storing a range of programs. + This is needed because there could potentially be two programs with the same + program id but different PMT PID (while one is being deactivated the new one + would "exist"). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1893> - * ChangeLog: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadatamux.h: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/gstmetadataparse.h: - * ext/metadata/metadataexif.c: - * ext/metadata/metadataexif.h: - * ext/metadata/metadataiptc.c: - * ext/metadata/metadataiptc.h: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadatamuxpng.c: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsepng.c: - * ext/metadata/metadataxmp.c: - * ext/metadata/metadataxmp.h: - Muxer writes (in jpeg only) whole EXIF and XMP chunks sent as tags. - Original commit message from CVS: - Muxer writes (in jpeg only) whole EXIF and XMP chunks sent as tags. - -2007-11-30 14:08:15 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/rfbdecoder.*: Add CoRRE encoding - Original commit message from CVS: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - Add CoRRE encoding - -2007-11-30 13:18:36 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/mpegtsparse.c: CRC check the psi pids. CRC checking code relicenced from MPL. - Original commit message from CVS: - * gst/mpegtsparse/mpegtsparse.c: - CRC check the psi pids. CRC checking code relicenced from MPL. - Thanks Fluendo. +2022-03-04 13:19:17 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> -2007-11-30 12:53:13 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/va/gstvah264enc.c: + vah264enc: Invert video codec frame dependency. + Instead of using GstMiniObject to hold H264 frame, now it uses a plain + structure. Besides, instead of holding a reference to + GstVideoCodecFrame, the H264 frame structure is set as a + GstVideoCodecFrame user data. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1856> + +2022-03-09 02:14:50 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstcudamemorycopy.c: + cudamemorycopy: Fix GL resource leak + Clear GL resources on stop() + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1896> - * ChangeLog: - * ext/metadata/Makefile.am: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadatamux.h: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/metadata.c: - * ext/metadata/metadata.h: - * ext/metadata/metadatamuxjpeg.c: - * ext/metadata/metadatamuxjpeg.h: - * ext/metadata/metadatamuxpng.c: - * ext/metadata/metadatamuxpng.h: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsejpeg.h: - * ext/metadata/metadataparsepng.c: - * ext/metadata/metadataparsepng.h: - * ext/metadata/metadatatypes.c: - * ext/metadata/metadatatypes.h: - Fixed get_range bug when injecting and stripping. And mux is almost done now. - Original commit message from CVS: - Fixed get_range bug when injecting and stripping. And mux is almost done now. - -2007-11-30 10:46:23 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/rfbdecoder.c: Use glib macro for swapping - Original commit message from CVS: - * gst/librfb/rfbdecoder.c: - Use glib macro for swapping - -2007-11-29 13:32:11 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/: Disable CopyRect encoding by default - Original commit message from CVS: - * gst/librfb/gstrfbsrc.c: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - Disable CopyRect encoding by default - Add RRE encoding - -2007-11-29 10:49:18 +0000 Wouter Cloetens <wouter@mind.be> - - configure.ac: Bump libsoup requirement as libsoup does not support async client operation prior to version 2.2.104 an... - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * configure.ac: - Bump libsoup requirement as libsoup does not support async client - operation prior to version 2.2.104 and it has some leaks. - * ext/soup/gstsouphttpsrc.c: (gst_souphttp_src_class_init), - (gst_souphttp_src_init), (gst_souphttp_src_dispose), - (gst_souphttp_src_set_property), (gst_souphttp_src_create), - (gst_souphttp_src_start), (gst_souphttp_src_stop), - (gst_souphttp_src_unlock), (gst_souphttp_src_unlock_stop), - (gst_souphttp_src_get_size), (soup_got_headers), (soup_got_body), - (soup_finished), (soup_got_chunk), (soup_response), - (soup_session_close): - * ext/soup/gstsouphttpsrc.h: - Implement unlock(). - Picks up the size from the Content-Length header and emit a duration - message. - Don't leak the GMainContext object. - Fixes #500099. - -2007-11-29 10:44:54 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/alsaspdif/alsaspdifsink.c: Don't free uninitialized data when we are in error. - Original commit message from CVS: - * ext/alsaspdif/alsaspdifsink.c: (alsaspdifsink_set_caps), - (alsaspdifsink_get_time), (alsaspdifsink_set_params), - (alsaspdifsink_find_pcm_device): - Don't free uninitialized data when we are in error. +2022-03-07 18:46:55 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2007-11-28 14:03:35 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst/mpegtsmux/gstbasetsmux.c: + mpegtsmux: Start last_ts with GST_CLOCK_TIME_NONE + And use the output segment position for the outgoing timestamp while it + is. This is needed to delay the calculation of `output_ts_offset` until + we actually have a usable timestamp, as tsmux will output a few initial + packets while `last_ts` is still unset. + Without this, the calculation would use the initial `0` value, which did + not have the intended effect of making VBR mode behave like CBR mode, + but always calculated an offset equal to the selected start time. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1884> - * ChangeLog: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/metadataexif.c: - * ext/metadata/metadataexif.h: - * ext/metadata/metadataiptc.c: - * ext/metadata/metadataiptc.h: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - * ext/metadata/metadataxmp.c: - * ext/metadata/metadataxmp.h: - Sending make and model individual tags and muxer now links fine. - Original commit message from CVS: - Sending make and model individual tags and muxer now links fine. +2022-03-07 18:46:08 +0100 Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com> -2007-11-28 08:13:52 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst/mpegtsmux/gstbasetsmux.c: + mpegtsmux: Use GST_CLOCK_STIME_NONE for output_ts_offset + It's a GstClockTimeDiff, thus GST_CLOCK_TIME_NONE isn't appropriate. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1884> - * ChangeLog: - * ext/metadata/Makefile.am: - * ext/metadata/gstmetadata.c: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadatamux.h: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/gstmetadataparse.h: - * ext/metadata/metadata.c: - * ext/metadata/metadata.h: - * ext/metadata/metadataexif.c: - * ext/metadata/metadataexif.h: - * ext/metadata/metadataiptc.c: - * ext/metadata/metadataiptc.h: - * ext/metadata/metadatatags.c: - * ext/metadata/metadatatags.h: - * ext/metadata/metadataxmp.c: - * ext/metadata/metadataxmp.h: - Small fixes in get_range and better structure for generic muxer and demuxer. - Original commit message from CVS: - Small fixes in get_range and better structure for generic muxer and demuxer. - -2007-11-26 13:19:48 +0000 Julien Moutte <julien@moutte.net> - - configure.ac: Add QuickTime Wrapper plug-in. - Original commit message from CVS: - 2007-11-26 Julien Moutte <julien@fluendo.com> - * configure.ac: Add QuickTime Wrapper plug-in. - * gst/speexresample/gstspeexresample.c: - (gst_speex_resample_push_drain), (gst_speex_resample_process): Fix - build on Mac OS X Leopard. Incorrect printf format arguments. - * sys/Makefile.am: - * sys/qtwrapper/Makefile.am: - * sys/qtwrapper/audiodecoders.c: - (qtwrapper_audio_decoder_base_init), - (qtwrapper_audio_decoder_class_init), - (qtwrapper_audio_decoder_init), - (clear_AudioStreamBasicDescription), (fill_indesc_mp3), - (fill_indesc_aac), (fill_indesc_samr), (fill_indesc_generic), - (make_samr_magic_cookie), (open_decoder), - (qtwrapper_audio_decoder_sink_setcaps), (process_buffer_cb), - (qtwrapper_audio_decoder_chain), - (qtwrapper_audio_decoder_sink_event), - (qtwrapper_audio_decoders_register): - * sys/qtwrapper/codecmapping.c: (audio_caps_from_string), - (fourcc_to_caps): - * sys/qtwrapper/codecmapping.h: - * sys/qtwrapper/imagedescription.c: (image_description_for_avc1), - (image_description_for_mp4v), (image_description_from_stsd_buffer), - (image_description_from_codec_data): - * sys/qtwrapper/imagedescription.h: - * sys/qtwrapper/qtutils.c: (get_name_info_from_component), - (get_output_info_from_component), (dump_avcc_atom), - (dump_image_description), (dump_codec_decompress_params), - (addSInt32ToDictionary), (dump_cvpixel_buffer), - (DestroyAudioBufferList), (AllocateAudioBufferList): - * sys/qtwrapper/qtutils.h: - * sys/qtwrapper/qtwrapper.c: (plugin_init): - * sys/qtwrapper/qtwrapper.h: - * sys/qtwrapper/videodecoders.c: - (qtwrapper_video_decoder_base_init), - (qtwrapper_video_decoder_class_init), - (qtwrapper_video_decoder_init), (qtwrapper_video_decoder_finalize), - (fill_image_description), (new_image_description), (close_decoder), - (open_decoder), (qtwrapper_video_decoder_sink_setcaps), - (decompressCb), (qtwrapper_video_decoder_chain), - (qtwrapper_video_decoder_sink_event), - (qtwrapper_video_decoders_register): Initial import of QuickTime - wrapper jointly developped by Songbird authors (Pioneers of the - Inevitable) and Fluendo. - -2007-11-26 10:08:20 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/gstspectrum.c: Use dispose and finalize. Dispose can be called multiple times. - Original commit message from CVS: - * gst/spectrum/gstspectrum.c: - Use dispose and finalize. Dispose can be called multiple times. +2022-03-08 01:26:50 +0900 Seungha Yang <seungha@centricular.com> -2007-11-26 09:38:24 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/decklink/linux/DeckLinkAPI.h: + * sys/decklink/linux/DeckLinkAPIConfiguration.h: + * sys/decklink/linux/DeckLinkAPIDeckControl.h: + * sys/decklink/linux/DeckLinkAPIDiscovery.h: + * sys/decklink/linux/DeckLinkAPIDispatch.cpp: + * sys/decklink/linux/DeckLinkAPIModes.h: + * sys/decklink/linux/DeckLinkAPITypes.h: + * sys/decklink/linux/DeckLinkAPIVersion.h: + * sys/decklink/linux/LinuxCOM.h: + * sys/decklink/osx/DeckLinkAPI.h: + * sys/decklink/osx/DeckLinkAPIConfiguration.h: + * sys/decklink/osx/DeckLinkAPIDeckControl.h: + * sys/decklink/osx/DeckLinkAPIDiscovery.h: + * sys/decklink/osx/DeckLinkAPIDispatch.cpp: + * sys/decklink/osx/DeckLinkAPIModes.h: + * sys/decklink/osx/DeckLinkAPIStreaming.h: + * sys/decklink/osx/DeckLinkAPITypes.h: + * sys/decklink/osx/DeckLinkAPIVersion.h: + * sys/decklink/win/DeckLinkAPI.h: + * sys/decklink/win/DeckLinkAPI_i.c: + decklink: Update SDK version to 12.2.2 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1883> - * ChangeLog: - * ext/metadata/gstmetadataparse.c: - Now works when get_range is not available upstream. - Original commit message from CVS: - Now works when get_range is not available upstream. - -2007-11-26 08:43:25 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/: Update speex resampler to latest SVN. We're now down to only the changes noted in README again. - Original commit message from CVS: - * gst/speexresample/README: - * gst/speexresample/arch.h: - * gst/speexresample/resample.c: (resampler_basic_direct_single), - (resampler_basic_direct_double), - (resampler_basic_interpolate_single), - (resampler_basic_interpolate_double), - (speex_resampler_process_native), (speex_resampler_process_float), - (speex_resampler_process_int), - (speex_resampler_process_interleaved_float), - (speex_resampler_process_interleaved_int), - (speex_resampler_get_input_latency), - (speex_resampler_get_output_latency): - * gst/speexresample/speex_resampler.h: - Update speex resampler to latest SVN. We're now down to only the - changes noted in README again. - * gst/speexresample/speex_resampler_wrapper.h: - * gst/speexresample/gstspeexresample.c: - (gst_speex_resample_push_drain), (gst_speex_resample_query): - Adjust to API changes. - -2007-11-25 10:45:09 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/flv/gstflvparse.c: Output segment with proper 'stop' value, makes flvdemux 100% compatible with gnonlin. - Original commit message from CVS: - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video): - Output segment with proper 'stop' value, makes flvdemux 100% compatible - with gnonlin. - -2007-11-25 10:12:09 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/dc1394/gstdc1394.c: Set initial structure name to fix assertion, due to recent caps name constraints. - Original commit message from CVS: - * ext/dc1394/gstdc1394.c: - Set initial structure name to fix assertion, due to recent caps name - constraints. - -2007-11-23 17:53:37 +0000 Alessandro Decina <alessandro@nnva.org> - - gst/mpegtsparse/: pat-info is now a signal not a GObject property that gets notified. - Original commit message from CVS: - patch by: Alessandro Decina - * gst/mpegtsparse/mpegtspacketizer.c: - * gst/mpegtsparse/mpegtspacketizer.h: - * gst/mpegtsparse/mpegtsparse.c: - * gst/mpegtsparse/mpegtsparse.h: - pat-info is now a signal not a GObject property that - gets notified. - pat-info, pmt-info now instead of passing a GObject as - a parameter, pass a GstStructure. - New signals: nit-info, sdt-info, eit-info for DVB SI information - * sys/dvb/camconditionalaccess.c: - * sys/dvb/camconditionalaccess.h: - * sys/dvb/camdevice.c: - * sys/dvb/camdevice.h: - * sys/dvb/camswclient.c: - * sys/dvb/camswclient.h: - * sys/dvb/camutils.c: - * sys/dvb/camutils.h: - Cam code now uses the pmt GstStructure passed from mpegtsparse - signals rather than the GObject. - * sys/dvb/dvbbasebin.c: - Use new signals in mpegtsparse and use GstStructures as per - mpegtsparse's modified API. +2022-03-08 03:45:01 +0900 Seungha Yang <seungha@centricular.com> -2007-11-23 17:35:21 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstcudamemorycopy.c: + cudamemorycopy: Remove texture-target caps field + It's GL specific field, and we can remove it unconditionally + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1865> + +2022-03-05 02:30:24 +0900 Seungha Yang <seungha@centricular.com> + + * sys/nvcodec/gstcudaformat.h: + * sys/nvcodec/gstcudamemorycopy.c: + * sys/nvcodec/gstcudanvmm.c: + * sys/nvcodec/gstcudanvmm.h: + * sys/nvcodec/meson.build: + * sys/nvcodec/plugin.c: + cudaupload,cudadownload: Add support for dGPU NVMM + Implement NVMM <-> CUDA, GL, SYSTEM memory conversion. Jetson is + not supported yet. Note that NVMM <-> GL interop on Jetson platform + is supported by GstGL + Some example pipelines are: + - Convert NVMM to GstGL memory + nvv4l2decoder ! "video/x-raw(memory:NVMM)" ! cudadownload ! "video/x-raw(memory:GLMemory)" ! glimagesink + - Upload system memory to NVMM and encode + video/x-raw,format=NV12 ! cudaupload ! "video/x-raw(memory:NVMM)" ! nvv4l2h264enc + - Convert NVMM to GstCUDA memory and encode + nvvideoconvert ! "video/x-raw(memory:NVMM)" ! cudaupload ! "video/x-raw(memory:CUDAMemory)" ! nvh264enc + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1865> + +2022-03-03 15:06:00 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvaencoder.c: + * sys/va/gstvaencoder.h: + * sys/va/gstvah264enc.c: + va: encoder: Don't preallocate reconstruct buffers. + It's not required by VA to register the reconstruct buffers at context + creation, just as in decoders. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1857> - * ChangeLog: - * ext/metadata/Makefile.am: - * ext/metadata/gstmetadata.c: - * ext/metadata/gstmetadatamux.c: - * ext/metadata/gstmetadatamux.h: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/gstmetadataparse.h: - * ext/metadata/metadataparse.c: - * ext/metadata/metadataparse.h: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsejpeg.h: - * ext/metadata/metadataparsepng.c: - * ext/metadata/metadataparsepng.h: - * ext/metadata/metadatatypes.c: - * ext/metadata/metadatatypes.h: - Now parser is generic (just add/remove a list of chunks). And a template of muxer has been created. - Original commit message from CVS: - Now parser is generic (just add/remove a list of chunks). And a template of muxer has been created. - -2007-11-23 10:21:31 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/gstspeexresample.c: Only post the latency message if we have a resampler state already. - Original commit message from CVS: - * gst/speexresample/gstspeexresample.c: - (gst_speex_resample_update_state): - Only post the latency message if we have a resampler state already. - -2007-11-23 10:21:11 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/audioresample/gstaudioresample.c: Implement latency query. - Original commit message from CVS: - * gst/audioresample/gstaudioresample.c: (gst_audioresample_init), - (audioresample_query), (audioresample_query_type), - (gst_audioresample_set_property): - Implement latency query. - -2007-11-23 10:01:33 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/gstspeexresample.c: Also post GST_MESSAGE_LATENCY if the latency changes. - Original commit message from CVS: - * gst/speexresample/gstspeexresample.c: - (gst_speex_resample_update_state): - Also post GST_MESSAGE_LATENCY if the latency changes. - -2007-11-23 08:48:50 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/: Add functions to push the remaining samples and to get the latency of the resampler. These will g... - Original commit message from CVS: - * gst/speexresample/resample.c: (speex_resampler_get_latency), - (speex_resampler_drain_float), (speex_resampler_drain_int), - (speex_resampler_drain_interleaved_float), - (speex_resampler_drain_interleaved_int): - * gst/speexresample/speex_resampler.h: - * gst/speexresample/speex_resampler_wrapper.h: - Add functions to push the remaining samples and to get the latency - of the resampler. These will get added to Speex SVN in this or a - slightly changed form at some point too and should get merged then - again. - * gst/speexresample/gstspeexresample.c: (gst_speex_resample_init), - (gst_speex_resample_init_state), - (gst_speex_resample_transform_size), - (gst_speex_resample_push_drain), (gst_speex_resample_event), - (gst_speex_fix_output_buffer), (gst_speex_resample_process), - (gst_speex_resample_query), (gst_speex_resample_query_type): - Drop the prepending zeroes and output the remaining samples on EOS. - Also properly implement the latency query for this. speexresample - should be completely ready for production use now. - -2007-11-22 09:08:27 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: jitterbuffer can buffer an unlimited amount of time and thus has no max_latency ... - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_query): - jitterbuffer can buffer an unlimited amount of time and thus has no - max_latency requirements. - -2007-11-21 10:18:56 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/README: Add README explaining where the resampling code was taken from and which changes were done. - Original commit message from CVS: - * gst/speexresample/README: - Add README explaining where the resampling code was taken from - and which changes were done. - * gst/speexresample/resample.c: (speex_alloc), (speex_realloc), - (speex_free): - Use g_malloc() and friends instead of malloc() to achieve higher - portability and define the functions inline. - * gst/speexresample/speex_resampler.h: - Add back some useless preprocessor stuff to keep the diff between - our version and the one from the Speex SVN repository lower. - -2007-11-21 09:56:54 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/: Post a GST_MESSAGE_LATENCY if the latency changes. - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: (bpwsinc_set_property): - * gst/filter/gstlpwsinc.c: (lpwsinc_set_property): - Post a GST_MESSAGE_LATENCY if the latency changes. - -2007-11-21 09:45:41 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/faac/gstfaac.c: Don't try to flush the decoder on EOS when it was not initialized. - Original commit message from CVS: - * ext/faac/gstfaac.c: (gst_faac_sink_event): - Don't try to flush the decoder on EOS when it was not initialized. - Fixes #498667 - -2007-11-21 09:40:08 +0000 Julien Moutte <julien@moutte.net> - - ext/sdl/sdlaudiosink.c: Fix build on Mac OS X. (missing format parameter) - Original commit message from CVS: - 2007-11-21 Julien Moutte <julien@fluendo.com> - * ext/sdl/sdlaudiosink.c: (gst_sdlaudio_sink_write): Fix build - on Mac OS X. (missing format parameter) - -2007-11-21 08:21:10 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/equalizer/: Remove preset iface again. We'll re-add this after its been released in -good. - Original commit message from CVS: - * gst/equalizer/gstiirequalizer10bands.c: - * gst/equalizer/gstiirequalizer3bands.c: - Remove preset iface again. We'll re-add this after its been released - in -good. - -2007-11-20 20:23:25 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/gstspeexresample.c: Some small cleanup and addition of a TODO item. - Original commit message from CVS: - * gst/speexresample/gstspeexresample.c: - (gst_speex_fix_output_buffer), (gst_speex_resample_transform): - Some small cleanup and addition of a TODO item. - -2007-11-20 12:56:00 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/Makefile.am: Add missing file. - Original commit message from CVS: - * gst/speexresample/Makefile.am: - Add missing file. - -2007-11-20 07:52:13 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - docs/plugins/inspect/: Add missing inspection files to CVS. - Original commit message from CVS: - * docs/plugins/inspect/plugin-app.xml: - * docs/plugins/inspect/plugin-bayer.xml: - * docs/plugins/inspect/plugin-cdaudio.xml: - * docs/plugins/inspect/plugin-dvb.xml: - * docs/plugins/inspect/plugin-dvbsrc.xml: - * docs/plugins/inspect/plugin-dvdspu.xml: - * docs/plugins/inspect/plugin-festival.xml: - * docs/plugins/inspect/plugin-flvdemux.xml: - * docs/plugins/inspect/plugin-gstinterlace.xml: - * docs/plugins/inspect/plugin-interleave.xml: - * docs/plugins/inspect/plugin-ladspa.xml: - * docs/plugins/inspect/plugin-mpeg4videoparse.xml: - * docs/plugins/inspect/plugin-mpegtsparse.xml: - * docs/plugins/inspect/plugin-mpegvideoparse.xml: - * docs/plugins/inspect/plugin-mve.xml: - * docs/plugins/inspect/plugin-nas.xml: - * docs/plugins/inspect/plugin-nuvdemux.xml: - * docs/plugins/inspect/plugin-quicktime.xml: - * docs/plugins/inspect/plugin-real.xml: - * docs/plugins/inspect/plugin-rfbsrc.xml: - * docs/plugins/inspect/plugin-sdp.xml: - * docs/plugins/inspect/plugin-sndfile.xml: - * docs/plugins/inspect/plugin-soup.xml: - * docs/plugins/inspect/plugin-speexresample.xml: - * docs/plugins/inspect/plugin-stereo.xml: - * docs/plugins/inspect/plugin-switch.xml: - * docs/plugins/inspect/plugin-vcdsrc.xml: - * docs/plugins/inspect/plugin-videocrop.xml: - * docs/plugins/inspect/plugin-videoparse.xml: - * docs/plugins/inspect/plugin-vmnc.xml: - * docs/plugins/inspect/plugin-x264.xml: - * docs/plugins/inspect/plugin-y4menc.xml: - Add missing inspection files to CVS. - -2007-11-20 07:47:27 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add speexresample to the docs and while at that do a make update. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-equalizer.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gio.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-spectrum.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-xingheader.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * gst/speexresample/gstspeexresample.h: - Add speexresample to the docs and while at that do a make update. - -2007-11-20 07:30:30 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/speexresample/gstspeexresample.c: If the resampler gives less output samples than expected adjust the output buff... - Original commit message from CVS: - * gst/speexresample/gstspeexresample.c: - (gst_speex_fix_output_buffer), (gst_speex_resample_process): - If the resampler gives less output samples than expected - adjust the output buffer and print a warning. - -2007-11-20 07:02:45 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add resample element based on the Speex resampling algorithm. - Original commit message from CVS: - * configure.ac: - * gst/speexresample/arch.h: - * gst/speexresample/fixed_generic.h: - * gst/speexresample/gstspeexresample.c: - (gst_speex_resample_base_init), (gst_speex_resample_class_init), - (gst_speex_resample_init), (gst_speex_resample_start), - (gst_speex_resample_stop), (gst_speex_resample_get_unit_size), - (gst_speex_resample_transform_caps), - (gst_speex_resample_init_state), (gst_speex_resample_update_state), - (gst_speex_resample_reset_state), (gst_speex_resample_parse_caps), - (gst_speex_resample_transform_size), (gst_speex_resample_set_caps), - (gst_speex_resample_event), (gst_speex_resample_check_discont), - (gst_speex_resample_process), (gst_speex_resample_transform), - (gst_speex_resample_set_property), - (gst_speex_resample_get_property), (plugin_init): - * gst/speexresample/gstspeexresample.h: - * gst/speexresample/resample.c: (speex_alloc), (speex_realloc), - (speex_free), (compute_func), (main), (sinc), (cubic_coef), - (resampler_basic_direct_single), (resampler_basic_direct_double), - (resampler_basic_interpolate_single), - (resampler_basic_interpolate_double), (update_filter), - (speex_resampler_init), (speex_resampler_init_frac), - (speex_resampler_destroy), (speex_resampler_process_native), - (speex_resampler_process_float), (speex_resampler_process_int), - (speex_resampler_process_interleaved_float), - (speex_resampler_process_interleaved_int), - (speex_resampler_set_rate), (speex_resampler_get_rate), - (speex_resampler_set_rate_frac), (speex_resampler_get_ratio), - (speex_resampler_set_quality), (speex_resampler_get_quality), - (speex_resampler_set_input_stride), - (speex_resampler_get_input_stride), - (speex_resampler_set_output_stride), - (speex_resampler_get_output_stride), (speex_resampler_skip_zeros), - (speex_resampler_reset_mem), (speex_resampler_strerror): - * gst/speexresample/speex_resampler.h: - * gst/speexresample/speex_resampler_float.c: - * gst/speexresample/speex_resampler_int.c: - * gst/speexresample/speex_resampler_wrapper.h: - Add resample element based on the Speex resampling algorithm. +2022-03-07 10:19:53 +0000 Philippe Normand <philn@igalia.com> -2007-11-19 22:09:36 +0000 Edgard Lima <edgard.lima@indt.org.br> + * tests/check/libs/play.c: + gstplay: tests: Keep track of errors/warnings + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1869> - * ChangeLog: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/gstmetadataparse.h: - Fixed buffer strip (safer wil pull and after seek). - Original commit message from CVS: - Fixed buffer strip (safer wil pull and after seek). - -2007-11-19 20:30:19 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/equalizer/: Activate preset iface and upload two presets here. - Original commit message from CVS: - * gst/equalizer/gstiirequalizer10bands.c: - * gst/equalizer/gstiirequalizer3bands.c: - Activate preset iface and upload two presets here. +2022-03-07 10:16:36 +0000 Philippe Normand <philn@igalia.com> -2007-11-19 13:05:23 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst-libs/gst/play/gstplay.c: + gstplay: Do not error out on message parsing failures + Specially when parsing errors and warnings, the details field can be NULL and + the gst_structure_get() call would return FALSE in such cases, triggering false + positive errors. + Follow-up for #1063 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1869> - * ChangeLog: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/gstmetadataparse.h: - Strip out in pull mode also. Seek and Query functions added. - Original commit message from CVS: - Strip out in pull mode also. Seek and Query functions added. +2022-03-07 10:14:43 +0000 Philippe Normand <philn@igalia.com> -2007-11-18 21:06:51 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst-libs/gst/play/gstplay.c: + * gst-libs/gst/play/gstplay.h: + gstplay: Fix warning parsing API + The GError is an out parameter, so should be a ** parameter, like the details + parameter. + See also #1063 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1869> - * ChangeLog: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/gstmetadataparse.h: - * ext/metadata/metadataparse.c: - * ext/metadata/metadataparse.h: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsejpeg.h: - * ext/metadata/metadataparsepng.c: - * ext/metadata/metadataparsepng.h: - * ext/metadata/metadataparsetypes.h: - Strip out metadata chunks. - Original commit message from CVS: - Strip out metadata chunks. - -2007-11-16 11:11:06 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - configure.ac: Als use AG_GST_PLUGIN_DOCS (see #344039). - Original commit message from CVS: - * configure.ac: - Als use AG_GST_PLUGIN_DOCS (see #344039). - -2007-11-15 19:03:33 +0000 Wai-Ming Ho <webregbox@yahoo.co.uk> - - gst/mpegtsparse/mpegtspacketizer.c: Ensure that the plugin does not crash when the property pat-info is queried befor... - Original commit message from CVS: - Patch by: Wai-Ming Ho <webregbox at yahoo dot co dot uk> - * gst/mpegtsparse/mpegtspacketizer.c: (foreach_stream_clear), - (remove_all), (mpegts_packetizer_clear): - Ensure that the plugin does not crash when the property pat-info is - queried before a PAT is available. It also ensures that the PAT info is - cleared when the changing from PLAYING to READY. - Fixes #487892. - -2007-11-15 18:53:56 +0000 Wouter Paesen <wouter@blue-gate.be> - - ext/soundtouch/gstpitch.cc: Handle seeking correctly. Fixes #461068. - Original commit message from CVS: - Patch by: Wouter Paesen <wouter at blue-gate dot be> - * ext/soundtouch/gstpitch.cc: - Handle seeking correctly. Fixes #461068. - -2007-11-15 18:41:31 +0000 Michael Kötter <m.koetter@oraise.de> - - ext/alsaspdif/alsaspdifsink.c: Fix sample rate and clocking. - Original commit message from CVS: - Patch by: Michael Kötter <m dot koetter at oraise dot de> - * ext/alsaspdif/alsaspdifsink.c: (alsaspdifsink_set_caps), - (alsaspdifsink_get_time), (alsaspdifsink_open), - (alsaspdifsink_set_params), (alsaspdifsink_delay), (plugin_init): - Fix sample rate and clocking. - Remove buffer_time and period_time as this seems to break on some - hardware. Fixes #485462. - -2007-11-15 17:26:25 +0000 Wouter Cloetens <wouter@mind.be> - - Added HTTP source based on libsoup. Fixes #497020. - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter at mind dot be> - * configure.ac: - * ext/Makefile.am: - * ext/soup/Makefile.am: - * ext/soup/gstsouphttpsrc.c: (_do_init), - (gst_souphttp_src_base_init), (gst_souphttp_src_class_init), - (gst_souphttp_src_init), (gst_souphttp_src_dispose), - (gst_souphttp_src_set_property), (gst_souphttp_src_get_property), - (gst_souphttp_src_create), (gst_souphttp_src_start), - (gst_souphttp_src_stop), (gst_souphttp_src_unlock), - (gst_souphttp_src_set_location), (soup_got_chunk), (soup_response), - (soup_session_close), (plugin_init): - * ext/soup/gstsouphttpsrc.h: - Added HTTP source based on libsoup. Fixes #497020. - -2007-11-15 15:32:47 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/gstrfbsrc.c: don't forget to handle the offset's - Original commit message from CVS: - * gst/librfb/gstrfbsrc.c: - don't forget to handle the offset's - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - precalculate some many used values - -2007-11-15 08:28:29 +0000 Armando Taffarel Neto <taffarel@solis.coop.br> - - gst/librfb/gstrfbsrc.c: Set the timestamp for the output buffers - Original commit message from CVS: - patch by: Armando Taffarel Neto <taffarel@solis.coop.br> - * gst/librfb/gstrfbsrc.c: - Set the timestamp for the output buffers - -2007-11-14 17:03:18 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/spectrum.c: Fix spectrum unit test for the latest spectrum changes. - Original commit message from CVS: - * tests/check/elements/spectrum.c: (GST_START_TEST): - Fix spectrum unit test for the latest spectrum changes. - -2007-11-12 21:07:31 +0000 René Stadler <mail@renestadler.de> - - gst/replaygain/rganalysis.c: Avoid slowdown from denormals when processing near-silence input data. - Original commit message from CVS: - Patch by: René Stadler <mail at renestadler dot de> - * gst/replaygain/rganalysis.c: (yule_filter): - Avoid slowdown from denormals when processing near-silence input data. - Spotted by Gabriel Bouvigne. Fixes #494499. - -2007-11-12 19:22:24 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/flv/gstflvparse.c: Add mapping for Nellymoser ASAO audio codec. - Original commit message from CVS: - * gst/flv/gstflvparse.c: - Add mapping for Nellymoser ASAO audio codec. - (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Make sure we - actually have data to read at the end of the tag. This avoids trying - to allocate negative buffers. +2022-03-07 18:59:37 +0900 Seungha Yang <seungha@centricular.com> -2007-11-12 17:27:03 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstcudamemorycopy.c: + cudamemorycopy: Fix build when gl is disabled + Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1707 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1868> + +2022-03-02 09:15:12 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> + + * sys/msdk/gstmsdkdec.c: + msdkdec: Fix to not trigger SFC scaling when vpp at downstream + When there is vpp scaling downstream, we need to make sure SFC is not + triggered because vpp may fall into passthrough mode which causes + the decoder negotiation to create src caps with vpp scaled width/height. + This patch includes bitstream's original size in first query with + downstream in gst_msdkdec_src_caps, which is the same for what we do for + color format in this query. This is to ensure SFC scaling starts to + work only when downstream directly asks for a different size instead of + through vpp. + Note that here SFC scaling follows the same behavior as msdkvpp: + if user only changes width or height, e.g. dec ! video/x-raw,width=xx !, + the height will be modified to the value which fits the original DAR. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1838> - * ChangeLog: - * ext/metadata/README: - Added a design proposal from metadata parse and mux. - Original commit message from CVS: - Added a design proposal from metadata parse and mux. - -2007-11-11 21:12:10 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/: Change the meaning of the magnitude values given in the - Original commit message from CVS: - * gst/equalizer/demo.c: (draw_spectrum): - * gst/spectrum/demo-audiotest.c: (draw_spectrum): - * gst/spectrum/demo-osssrc.c: (draw_spectrum): - * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init): - Change the meaning of the magnitude values given in the - GstMessages by spectrum to decibel instead of - decibel+threshold. - -2007-11-11 13:55:27 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/equalizer/: And continue to update docs. Also include some sample code for the n-band equalizer in the docs. - Original commit message from CVS: - * gst/equalizer/gstiirequalizer10bands.c: - * gst/equalizer/gstiirequalizer3bands.c: - * gst/equalizer/gstiirequalizernbands.c: - And continue to update docs. Also include some sample code - for the n-band equalizer in the docs. - -2007-11-11 12:54:31 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/equalizer/: Update docs and property ranges to the real values. - Original commit message from CVS: - * gst/equalizer/gstiirequalizer10bands.c: - (gst_iir_equalizer_10bands_class_init): - * gst/equalizer/gstiirequalizer3bands.c: - (gst_iir_equalizer_3bands_class_init): - * gst/equalizer/gstiirequalizernbands.c: - Update docs and property ranges to the real values. - -2007-11-09 17:27:00 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/spectrum/gstspectrum.c: Now do the scaling right for real. Also initialize a previously uninitialized variable. - Original commit message from CVS: - * gst/spectrum/gstspectrum.c: - Now do the scaling right for real. Also initialize a previously - uninitialized variable. +2022-03-06 19:18:20 +0900 Seungha Yang <seungha@centricular.com> -2007-11-09 15:53:13 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstcudautils.c: + nvcodec: Add missing null check in context sharing code + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1834> - * ChangeLog: - * ext/metadata/metadataparsexmp.c: - Extracting more detailed info from XMP. - Original commit message from CVS: - Extracting more detailed info from XMP. - -2007-11-08 15:56:46 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/equalizer/demo.c: Make default volume a bit less. Improve layout by giving more space to the slider with big-numb... - Original commit message from CVS: - * gst/equalizer/demo.c: - Make default volume a bit less. Improve layout by giving more space to - the slider with big-numbers and enable fill. - -2007-11-07 16:47:32 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Require GIO >= 0.1.2 and adjust unit test for an API change. - Original commit message from CVS: - * configure.ac: - * tests/check/pipelines/gio.c: (GST_START_TEST): - Require GIO >= 0.1.2 and adjust unit test for an API change. - -2007-11-07 15:36:59 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/icles/equalizer-test.c: Fix gain ranges for the latest equalizer changes. - Original commit message from CVS: - * tests/icles/equalizer-test.c: (do_slider_fiddling): - Fix gain ranges for the latest equalizer changes. - -2007-11-07 15:18:54 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/gio/gstgio.h: Add macro to check if a stream supports seeking. - Original commit message from CVS: - * ext/gio/gstgio.h: - Add macro to check if a stream supports seeking. - * ext/gio/Makefile.am: - * ext/gio/gstgiobasesink.c: (gst_gio_base_sink_base_init), - (gst_gio_base_sink_class_init), (gst_gio_base_sink_init), - (gst_gio_base_sink_finalize), (gst_gio_base_sink_start), - (gst_gio_base_sink_stop), (gst_gio_base_sink_unlock), - (gst_gio_base_sink_unlock_stop), (gst_gio_base_sink_event), - (gst_gio_base_sink_render), (gst_gio_base_sink_query), - (gst_gio_base_sink_set_stream): - * ext/gio/gstgiobasesink.h: - * ext/gio/gstgiobasesrc.c: (gst_gio_base_src_base_init), - (gst_gio_base_src_class_init), (gst_gio_base_src_init), - (gst_gio_base_src_finalize), (gst_gio_base_src_start), - (gst_gio_base_src_stop), (gst_gio_base_src_get_size), - (gst_gio_base_src_is_seekable), (gst_gio_base_src_unlock), - (gst_gio_base_src_unlock_stop), (gst_gio_base_src_check_get_range), - (gst_gio_base_src_create), (gst_gio_base_src_set_stream): - * ext/gio/gstgiobasesrc.h: - Refactor common GIO functions to GstGioBaseSink and GstGioBaseSrc - base classes that only require a GInputStream or GOutputStream to - work. - * ext/gio/gstgiosink.c: (gst_gio_sink_base_init), - (gst_gio_sink_class_init), (gst_gio_sink_init), - (gst_gio_sink_finalize), (gst_gio_sink_start): - * ext/gio/gstgiosink.h: - * ext/gio/gstgiosrc.c: (gst_gio_src_base_init), - (gst_gio_src_class_init), (gst_gio_src_init), - (gst_gio_src_finalize), (gst_gio_src_start): - * ext/gio/gstgiosrc.h: - Use the newly created base classes here. - * ext/gio/gstgio.c: (plugin_init): - * ext/gio/gstgiostreamsink.c: (gst_gio_stream_sink_base_init), - (gst_gio_stream_sink_class_init), (gst_gio_stream_sink_init), - (gst_gio_stream_sink_finalize), (gst_gio_stream_sink_set_property), - (gst_gio_stream_sink_get_property): - * ext/gio/gstgiostreamsink.h: - * ext/gio/gstgiostreamsrc.c: (gst_gio_stream_src_base_init), - (gst_gio_stream_src_class_init), (gst_gio_stream_src_init), - (gst_gio_stream_src_finalize), (gst_gio_stream_src_set_property), - (gst_gio_stream_src_get_property): - * ext/gio/gstgiostreamsrc.h: - Implement GstGioStreamSink and GstGioStreamSrc that have a property - to set the GInputStream/GOutputStream that should be used. - * tests/check/Makefile.am: - * tests/check/pipelines/.cvsignore: - * tests/check/pipelines/gio.c: (message_handler), (GST_START_TEST), - (gio_testsuite), (main): - Add unit test for giostreamsrc and giostreamsink. - -2007-11-07 11:48:09 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/gio/gstgio.c: Remove nowadays unnecessary workaround for a crash. - Original commit message from CVS: - * ext/gio/gstgio.c: (plugin_init): - Remove nowadays unnecessary workaround for a crash. - * ext/gio/gstgiosink.c: (gst_gio_sink_finalize), - (gst_gio_sink_start), (gst_gio_sink_stop), - (gst_gio_sink_unlock_stop): - * ext/gio/gstgiosink.h: - * ext/gio/gstgiosrc.c: (gst_gio_src_finalize), (gst_gio_src_start), - (gst_gio_src_stop), (gst_gio_src_unlock_stop): - * ext/gio/gstgiosrc.h: - Make the finalize function safer, clean up everything that could stay - around. - Reset the cancellable instead of creating a new one after cancelling - some operation. - Don't store the GFile in the element, it's only necessary for creating - the streams. - -2007-11-06 12:23:35 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/spectrum/demo-audiotest.c: Use autoaudiosink instead of alsasink and use a sine wave. - Original commit message from CVS: - * gst/spectrum/demo-audiotest.c: (main): - Use autoaudiosink instead of alsasink and use a sine wave. - * gst/spectrum/gstspectrum.c: - Fix the magnitude calculation. - -2007-11-04 11:04:28 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - gst-libs/gst/dshow/gstdshowfakesink.*: Fix crasher in constructor due to the base class's constructor not necessarily... - Original commit message from CVS: - Patch by: Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - * gst-libs/gst/dshow/gstdshowfakesink.cpp: - (CDshowFakeSink.CDshowFakeSink): - * gst-libs/gst/dshow/gstdshowfakesink.h: (CDshowFakeSink.m_hres): - Fix crasher in constructor due to the base class's constructor - not necessarily being NULL-safe (depends on the SDK version used - apparently; #492406). - * sys/dshowsrcwrapper/gstdshowaudiosrc.c: (gst_dshowaudiosrc_prepare): - * sys/dshowsrcwrapper/gstdshowvideosrc.c: (gst_dshowvideosrc_set_caps): - Fix a couple of MSVC compiler warnings (#492406). - -2007-11-03 19:50:11 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/equalizer/: Allow setting 0 as bandwidth and handle this correctly. - Original commit message from CVS: - * gst/equalizer/demo.c: (main): - * gst/equalizer/gstiirequalizer.c: - (gst_iir_equalizer_band_class_init), (setup_filter): - Allow setting 0 as bandwidth and handle this correctly. - Also handle a bandwidth of rate/2 properly. - * gst/equalizer/gstiirequalizernbands.c: - (gst_iir_equalizer_nbands_class_init): - Make it possible to generate a N-band equalizer with 1 bands. The - previous limit of 2 was caused by a nowadays replaced calculation - doing a division by zero if number of bands was 1. - -2007-11-02 21:45:38 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - - gst/rtpmanager/gstrtpsession.c: Fix bad function signatures (#492798). - Original commit message from CVS: - Patch by: Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com> - * gst/rtpmanager/gstrtpsession.c: - Fix bad function signatures (#492798). +2022-03-04 03:33:41 +0900 Seungha Yang <seungha@centricular.com> -2007-11-02 16:50:42 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstcudadownload.c: + * sys/nvcodec/gstcudadownload.h: + * sys/nvcodec/gstcudaformat.h: + * sys/nvcodec/gstcudamemorycopy.c: + * sys/nvcodec/gstcudamemorycopy.h: + * sys/nvcodec/gstcudaupload.c: + * sys/nvcodec/gstcudaupload.h: + * sys/nvcodec/meson.build: + * sys/nvcodec/plugin.c: + nvcodec: Refactor cudaupload/download and add support for GL memory + * Implement new baseclass GstCudaMemoryCopy to remove duplicated + cudaupload/download code + * Add support for CUDA <-> GL memory conversion via cudaupload/download + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1834> - * ChangeLog: - * ext/metadata/Makefile.am: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/gstmetadataparse.h: - * ext/metadata/metadataparse.c: - * ext/metadata/metadataparse.h: - * ext/metadata/metadataparseexif.c: - * ext/metadata/metadataparseexif.h: - * ext/metadata/metadataparseiptc.c: - * ext/metadata/metadataparseiptc.h: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsejpeg.h: - * ext/metadata/metadataparsepng.c: - * ext/metadata/metadataparsepng.h: - * ext/metadata/metadataparseutil.c: - * ext/metadata/metadataparseutil.h: - * ext/metadata/metadataparsexmp.c: - * ext/metadata/metadataparsexmp.h: - Added support for PNG/XMP. Indentation. And fixed pull mode to parse the file. - Original commit message from CVS: - Added support for PNG/XMP. Indentation. And fixed pull mode to parse the file. +2022-03-03 03:25:47 +0900 Seungha Yang <seungha@centricular.com> -2007-11-02 12:03:04 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/cuda-converter.c: + * sys/nvcodec/cuda-converter.h: + * sys/nvcodec/gstcudabasefilter.c: + * sys/nvcodec/gstcudabufferpool.c: + * sys/nvcodec/gstcudadownload.c: + * sys/nvcodec/gstcudamemory.c: + * sys/nvcodec/gstcudamemory.h: + * sys/nvcodec/gstcudaupload.c: + * sys/nvcodec/gstnvbaseenc.c: + * sys/nvcodec/gstnvdec.c: + * sys/nvcodec/gstnvdecoder.c: + * sys/nvcodec/plugin.c: + nvcodec: Refactor GstCudaMemory abstraction + * Hide GstCudaMemory member variables + * Make GstCudaAllocator object GstCudaContext independent + * Set offset/stride of memory correctly via video meta + * Drop GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT support. + This implementation actually does not support custom alignment + because we allocate device memory via cuMemAllocPitch + of which alignment is almost uncontrollable + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1834> - * ChangeLog: - * ext/metadata/gstmetadataparse.c: - Now metadataparse works in push or pull mode. - Original commit message from CVS: - Now metadataparse works in push or pull mode. +2022-03-02 22:03:54 +0900 Seungha Yang <seungha@centricular.com> -2007-11-01 16:04:29 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/cuda-converter.h: + * sys/nvcodec/gstcudabasefilter.c: + * sys/nvcodec/gstcudabasefilter.h: + * sys/nvcodec/gstcudabasetransform.c: + * sys/nvcodec/gstcudabasetransform.h: + * sys/nvcodec/gstcudaconvert.c: + * sys/nvcodec/gstcudadownload.c: + * sys/nvcodec/gstcudadownload.h: + * sys/nvcodec/gstcudaformat.h: + * sys/nvcodec/gstcudaupload.c: + * sys/nvcodec/gstcudaupload.h: + nvcodec: Refactor basetransform subclasses + * cudaupload/download + - Specify only formats actually we can deal with + nvcodec elements, not all video formats + - Supports CUDA output for download and input for upload in order + to make passthrough possible, like other upload/download elements. + * cudabasetransform + - Reset conversion element if upstream CUDA memory + holds different CUDA context and the element can accept it. + This is the same behavior as corresponding d3d11 filter elements. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1834> - * ChangeLog: - * configure.ac: - * ext/metadata/Makefile.am: - * ext/metadata/metadataparseexif.c: - * ext/metadata/metadataparseiptc.c: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparseutil.c: - * ext/metadata/metadataparseutil.h: - * ext/metadata/metadataparsexmp.c: - * ext/metadata/metadataparsexmp.h: - Some XMP stuff added. - Original commit message from CVS: - Some XMP stuff added. +2022-03-02 20:55:29 +0900 Seungha Yang <seungha@centricular.com> -2007-10-31 16:21:02 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstcudabufferpool.c: + * sys/nvcodec/gstcudabufferpool.h: + cudabufferpool: Move GstCudaContext object to public member + ... so that plugins can understand assosicated cuda context with the + pool. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1834> - * ChangeLog: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/gstmetadataparse.h: - * ext/metadata/metadataparseexif.c: - * ext/metadata/metadataparseexif.h: - * ext/metadata/metadataparseiptc.c: - * ext/metadata/metadataparseiptc.h: - * ext/metadata/metadataparsexmp.c: - * ext/metadata/metadataparsexmp.h: - Now sending iptc tag in whole chunk. Ready to also send exif and xmp in the same way (look at bug #486659). - Original commit message from CVS: - Now sending iptc tag in whole chunk. Ready to also send exif and xmp in the same way (look at bug #486659). - -2007-10-31 14:44:55 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/rfbdecoder.c: Some refactoring in RAW encoding - Original commit message from CVS: - * gst/librfb/rfbdecoder.c: - Some refactoring in RAW encoding - -2007-10-31 14:09:25 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/: Added copyrect encoding - Original commit message from CVS: - * gst/librfb/d3des.h: - * gst/librfb/gstrfbsrc.c: - * gst/librfb/gstrfbsrc.h: - * gst/librfb/rfbbuffer.h: - * gst/librfb/rfbcontext.h: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - * gst/librfb/rfbutil.h: - * gst/librfb/vncauth.h: - Added copyrect encoding - -2007-10-31 13:31:08 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/camswclient.c: Warn on failed write. - Original commit message from CVS: - * sys/dvb/camswclient.c: - Warn on failed write. - -2007-10-30 21:37:49 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/equalizer/: Add small demo application based on the spectrum demo applications that gets white noise as input, pu... - Original commit message from CVS: - * gst/equalizer/Makefile.am: - * gst/equalizer/demo.c: (on_window_destroy), (on_configure_event), - (on_gain_changed), (on_bandwidth_changed), (on_freq_changed), - (draw_spectrum), (message_handler), (main): - Add small demo application based on the spectrum demo applications - that gets white noise as input, pushes it through an equalizer and - paints the spectrum. For every equalizer band it's possible to set - gain, bandwidth and frequency. - * gst/equalizer/gstiirequalizer.c: (setup_filter): - Add some guarding against too large or too small frequencies and - bandwidths. Also improve debugging a bit. - -2007-10-30 21:18:45 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/equalizer/gstiirequalizer.c: Replace filters with a bit better filters for which we can actually find documentati... - Original commit message from CVS: - * gst/equalizer/gstiirequalizer.c: - (gst_iir_equalizer_band_set_property), - (gst_iir_equalizer_band_get_property), - (gst_iir_equalizer_band_class_init), (arg_to_scale), - (setup_filter), (gst_iir_equalizer_compute_frequencies): - Replace filters with a bit better filters for which we can actually - find documentation, which don't change anything on zero gain, etc. - Make the frequency property of the bands writable, rename the - band-width property to bandwidth and change the meaning to the - frequency difference between bandedges, change the meaning of the - gain property to dB instead of a weird scale between -1 and 1 that - has no real meaning. - -2007-10-30 20:55:27 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - sys/dvb/dvbbasebin.c: Fix the build. - Original commit message from CVS: - * sys/dvb/dvbbasebin.c: - Fix the build. +2022-03-03 02:48:17 +0900 Seungha Yang <seungha@centricular.com> -2007-10-30 18:21:22 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstcudacontext.c: + * sys/nvcodec/gstcudacontext.h: + * sys/nvcodec/gstcudautils.c: + cudacontext: Require explicit gpu id instead of auto (-1) + Sync up with GstD3D11Device implementation. The auto stuff should + be handled in context sharing step, not device creation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1834> - * ChangeLog: - * ext/metadata/.gitignore: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/metadataparse.c: - * ext/metadata/metadataparse.h: - Changed kclass to "Parser/Extracter/Metadata", changed caps to "image/jpeg, tags-extract=true/false" and changed prio... - Original commit message from CVS: - Changed kclass to "Parser/Extracter/Metadata", changed caps to "image/jpeg, tags-extract=true/false" and changed priority to GST_RANK_PRIMARY+1. Also, srcpad can only work in push mode until fixed to also work in pull mode. +2022-03-03 03:24:14 +0900 Seungha Yang <seungha@centricular.com> -2007-10-30 12:49:04 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/nvcodec/gstcudaloader.c: + * sys/nvcodec/gstcudamemory.c: + * sys/nvcodec/gstcudascale.c: + * sys/nvcodec/gstcuvidloader.c: + * sys/nvcodec/gstnvrtcloader.c: + nvcodec: Indent update + ... to prevent gnu indent version dependent diffs. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1834> - * ChangeLog: - * configure.ac: - * ext/Makefile.am: - * ext/metadata/Makefile.am: - * ext/metadata/gstmetadata.c: - * ext/metadata/gstmetadataparse.c: - * ext/metadata/gstmetadataparse.h: - * ext/metadata/metadataparse.c: - * ext/metadata/metadataparse.h: - * ext/metadata/metadataparseexif.c: - * ext/metadata/metadataparseexif.h: - * ext/metadata/metadataparseiptc.c: - * ext/metadata/metadataparseiptc.h: - * ext/metadata/metadataparsejpeg.c: - * ext/metadata/metadataparsejpeg.h: - * ext/metadata/metadataparsexmp.c: - * ext/metadata/metadataparsexmp.h: - Created new plugin ('medadata') and element ('metadataparse') that extract metadata from images (look at bug #486659). - Original commit message from CVS: - Created new plugin ('medadata') and element ('metadataparse') that extract metadata from images (look at bug #486659). - -2007-10-29 15:54:04 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/dvbbasebin.c: Uncomment the line that sets the pid filter. Wrong way to work-around driver issues. - Original commit message from CVS: - * sys/dvb/dvbbasebin.c: - Uncomment the line that sets the pid filter. Wrong way to - work-around driver issues. - -2007-10-28 15:22:06 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/faac/gstfaac.c: Fix bitrate ranges and change enum nick for low complexity profile from LOW to LC for consistency... - Original commit message from CVS: - * ext/faac/gstfaac.c: (gst_faac_profile_get_type), - (gst_faac_class_init), (gst_faac_init): - Fix bitrate ranges and change enum nick for low complexity - profile from LOW to LC for consistency (#490060). - -2007-10-27 16:04:48 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/interleave/interleave.c: Let's not call every request pad we create "sink%d", that'll create problems if there's ... - Original commit message from CVS: - * gst/interleave/interleave.c: (gst_interleave_request_new_pad): - Let's not call every request pad we create "sink%d", that'll - create problems if there's to be more than one pad. Fixes #490682. - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/interleave.c: - Add unit test for the above. - -2007-10-27 08:20:59 +0000 Julien Moutte <julien@moutte.net> - - gst/mpeg4videoparse/mpeg4videoparse.*: Improved version not damaging headers using a simple state machine. - Original commit message from CVS: - 2007-10-27 Julien MOUTTE <julien@moutte.net> - * gst/mpeg4videoparse/mpeg4videoparse.c: - (gst_mpeg4vparse_align), - (gst_mpeg4vparse_drain), (gst_mpeg4vparse_chain), - (gst_mpeg4vparse_sink_setcaps), (gst_mpeg4vparse_sink_event), - (gst_mpeg4vparse_cleanup), (gst_mpeg4vparse_change_state), - (gst_mpeg4vparse_dispose), (gst_mpeg4vparse_base_init), - (gst_mpeg4vparse_class_init), (gst_mpeg4vparse_init), - (plugin_init): - * gst/mpeg4videoparse/mpeg4videoparse.h: Improved version not - damaging headers using a simple state machine. - -2007-10-26 17:18:41 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/x264/gstx264enc.c: Fix build against the libx264 version that ships with debian stable. - Original commit message from CVS: - * ext/x264/gstx264enc.c: - Fix build against the libx264 version that ships with debian stable. - -2007-10-26 16:08:04 +0000 Julien Moutte <julien@moutte.net> - - Add a simple MPEG4 ES parser. - Original commit message from CVS: - 2007-10-26 Julien MOUTTE <julien@moutte.net> - * configure.ac: - * gst/mpeg4videoparse/Makefile.am: - * gst/mpeg4videoparse/mpeg4videoparse.c: - (gst_mpeg4vparse_drain), - (gst_mpeg4vparse_chain), (gst_mpeg4vparse_sink_setcaps), - (gst_mpeg4vparse_sink_event), (gst_mpeg4vparse_cleanup), - (gst_mpeg4vparse_change_state), (gst_mpeg4vparse_dispose), - (gst_mpeg4vparse_base_init), (gst_mpeg4vparse_class_init), - (gst_mpeg4vparse_init), (plugin_init): - * gst/mpeg4videoparse/mpeg4videoparse.h: Add a simple MPEG4 ES - parser. - -2007-10-25 23:42:52 +0000 David Schleef <ds@schleef.org> - - Improve documentation, write some tests for multifilesrc/sink for upcoming ->good review. - Original commit message from CVS: - * gst/multifile/Makefile.am: - * gst/multifile/gstmultifilesink.c: - * gst/multifile/gstmultifilesrc.c: - * tests/check/Makefile.am: - * tests/check/elements/multifile.c: - Improve documentation, write some tests for multifilesrc/sink - for upcoming ->good review. - -2007-10-23 13:08:26 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: Actually use the code-rate-hp parameter for DVB-S. - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: - Actually use the code-rate-hp parameter for DVB-S. - It turns out setting to AUTO does not always work ( - especially in diseq situations). Set by default to - FEC_AUTO. - -2007-10-22 15:45:49 +0000 Julien Moutte <julien@moutte.net> - - gst/flv/gstflvparse.c: Don't emit no-more-pads for single pad scenarios as the header is definitely not reliable. We ... - Original commit message from CVS: - 2007-10-22 Julien MOUTTE <julien@moutte.net> - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video), (gst_flv_parse_tag_type): Don't - emit no-more-pads for single pad scenarios as the header - is definitely not reliable. We emit them for 2 pads scenarios - though to speed up media discovery. - -2007-10-19 16:20:53 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/dvbbasebin.c: Added proxy property of diseqc-source - Original commit message from CVS: - * sys/dvb/dvbbasebin.c: - Added proxy property of diseqc-source - -2007-10-18 06:20:21 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/equalizer/gstiirequalizer.c: Add a missing break. - Original commit message from CVS: - * gst/equalizer/gstiirequalizer.c: - (gst_iir_equalizer_band_set_property): - Add a missing break. - -2007-10-18 06:14:42 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/equalizer/gstiirequalizer.*: Move bandwidth property to the separate bands and add float64 support. - Original commit message from CVS: - * gst/equalizer/gstiirequalizer.c: - (gst_iir_equalizer_band_set_property), - (gst_iir_equalizer_band_get_property), - (gst_iir_equalizer_band_class_init), (gst_iir_equalizer_band_init), - (gst_iir_equalizer_band_get_type), (gst_iir_equalizer_class_init), - (setup_filter), (gst_iir_equalizer_setup): - * gst/equalizer/gstiirequalizer.h: - Move bandwidth property to the separate bands and add float64 support. - -2007-10-17 14:43:25 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/cdaudio/Makefile.am: Add another missing GST_LIBS. - Original commit message from CVS: - * ext/cdaudio/Makefile.am: - Add another missing GST_LIBS. - -2007-10-17 14:33:03 +0000 Richard Hult <richard@imendio.com> - - gst/dvdspu/Makefile.am: Fix LIBS - we need to link against libgstreamer. - Original commit message from CVS: - Patch by: Richard Hult <richard imendio com> - * gst/dvdspu/Makefile.am: - Fix LIBS - we need to link against libgstreamer. - -2007-10-17 10:33:43 +0000 Tim-Philipp Müller <tim@centricular.net> - - sys/dvb/: Fix some warnings. - Original commit message from CVS: - * sys/dvb/camapplication.c: - * sys/dvb/camresourcemanager.c: - Fix some warnings. - -2007-10-16 19:24:31 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/rfbdecoder.c: Add the set encodings client message - Original commit message from CVS: - * gst/librfb/rfbdecoder.c: - Add the set encodings client message - -2007-10-16 18:33:44 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/: remove the rfbbytestream dead code - Original commit message from CVS: - * gst/librfb/Makefile.am: - * gst/librfb/rfb.h: - * gst/librfb/rfbbytestream.c: - * gst/librfb/rfbbytestream.h: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - remove the rfbbytestream dead code - -2007-10-16 17:38:05 +0000 Alessandro Decina <alessandro@nnva.org> - - sys/dvb/: Integrate SoC work done by Alessandro for the Freevo project. - Original commit message from CVS: - patch by: Alessandro Decina - * sys/dvb/Makefile.am: - * sys/dvb/cam.c: - * sys/dvb/cam.h: - * sys/dvb/camapplication.c: - * sys/dvb/camapplication.h: - * sys/dvb/camapplicationinfo.c: - * sys/dvb/camapplicationinfo.h: - * sys/dvb/camconditionalaccess.c: - * sys/dvb/camconditionalaccess.h: - * sys/dvb/camdevice.c: - * sys/dvb/camdevice.h: - * sys/dvb/camresourcemanager.c: - * sys/dvb/camresourcemanager.h: - * sys/dvb/camsession.c: - * sys/dvb/camsession.h: - * sys/dvb/camswclient.c: - * sys/dvb/camswclient.h: - * sys/dvb/camtransport.c: - * sys/dvb/camtransport.h: - * sys/dvb/camutils.c: - * sys/dvb/camutils.h: - * sys/dvb/dvbbasebin.c: - * sys/dvb/dvbbasebin.h: - * sys/dvb/gstdvb.c: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - Integrate SoC work done by Alessandro for the Freevo project. - Adds cam support to the dvb stack in GStreamer and a new - element (actually a bin) called dvbbasebin that integrates - dvbsrc and mpegtsparse to a) handle decryption and b) allow - acquiring multiple channels on same transponder without - knowing pid numbers. - -2007-10-16 16:51:23 +0000 Alessandro Decina <alessandro@nnva.org> - - gst/mpegtsparse/: Add request pad for getting the full transport stream coming in. - Original commit message from CVS: - patch by: Alessandro Decina - * gst/mpegtsparse/mpegtspacketizer.c: - * gst/mpegtsparse/mpegtsparse.c: - * gst/mpegtsparse/mpegtsparse.h: - Add request pad for getting the full transport stream coming in. - -2007-10-14 17:22:18 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Update the highest allowed neon version from 0.26.99 to 0.27.99. - Original commit message from CVS: - * configure.ac: - Update the highest allowed neon version from 0.26.99 to 0.27.99. - No code changes are required to work with the newest neon version. - -2007-10-10 11:44:01 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Require core CVS. This is implicit in the -base CVS requirement already, so we might just well spell i... - Original commit message from CVS: - * configure.ac: - Require core CVS. This is implicit in the -base CVS - requirement already, so we might just well spell it - out. Also, we do need at least 0.10.14 for - gst_element_class_set_details_simple(). Make check - for gmyth a bit more restrictive so things don't break - if the next version changes API. - * ext/alsaspdif/alsaspdifsink.c: - Work around alsa alloca macros triggering 'always evaluates to - true' warnings with gcc-4.2 and fix compilation with gcc-4.2. - Also don't leak the device string. - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/soundtouch/gstpitch.cc: - * gst/modplug/gstmodplug.cc: - Fix compilation with g++4.2 and -Wall -Werror (also needs plugin - define fix from core CVS). Fixes #462737. - -2007-10-09 10:01:39 +0000 Laurent Glayal <spglegle@yahoo.fr> - - gst/rtpmanager/gstrtpbin.c: Fix memleak. Fixes #484990. - Original commit message from CVS: - Patch by: Laurent Glayal <spglegle at yahoo dot fr> - * gst/rtpmanager/gstrtpbin.c: (create_stream), - (gst_rtp_bin_class_init): - Fix memleak. Fixes #484990. - -2007-10-08 17:46:45 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/: Fix compiler warnings shown by Forte. - Original commit message from CVS: - * gst/librfb/rfbbuffer.c: (rfb_buffer_new_and_alloc): - * gst/librfb/rfbbuffer.h: - * gst/librfb/rfbdecoder.c: (rfb_socket_get_buffer): - * gst/mpegvideoparse/mpegvideoparse.c: (gst_mpegvideoparse_chain): - * gst/nsf/nes6502.c: (nes6502_execute): - * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_setcaps): - * gst/real/gstrealvideodec.c: (open_library): - * gst/real/gstrealvideodec.h: - * gst/rtpmanager/gstrtpsession.c: (create_recv_rtp_sink), - (create_recv_rtcp_sink), (create_send_rtp_sink): - Fix compiler warnings shown by Forte. - -2007-10-08 10:39:35 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Fix caps refcounting for payload maps. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (get_pt_map), - (gst_rtp_bin_clear_pt_map), (gst_rtp_bin_class_init): - Fix caps refcounting for payload maps. - When clearing payload maps, also clear sessions and streams payload - maps. - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_get_caps), - (gst_rtp_pt_demux_clear_pt_map), (gst_rtp_pt_demux_chain), - (find_pad_for_pt): - Implement clearing the payload map. - * gst/rtpmanager/gstrtpsession.c: - (gst_rtp_session_event_send_rtp_sink): - Forward flush events instead of leaking them. - * gst/rtpmanager/gstrtpssrcdemux.c: - (gst_rtp_ssrc_demux_rtcp_sink_event): - Correctly refcount events before pushing them. - -2007-10-08 06:07:22 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/gio/gstgio.c: Use GIO function to get a list of supported URI schemes instead of hard coding something. - Original commit message from CVS: - * ext/gio/gstgio.c: (gst_gio_get_supported_protocols): - Use GIO function to get a list of supported URI schemes instead of - hard coding something. - -2007-10-05 17:26:14 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/rtpsession.c: When reconsidering RTCP timeouts, set the next timeout against the last report time inst... - Original commit message from CVS: - * gst/rtpmanager/rtpsession.c: (rtp_session_next_timeout), - When reconsidering RTCP timeouts, set the next timeout against the last - report time instead of the current clock time so that we don't end up - reconsidering forever. - -2007-10-05 12:07:37 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Only peek at the tail element instead of popping it off, which allows us to grea... - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): - Only peek at the tail element instead of popping it off, which allows - us to greatly simplify things when the tail element changes. - * gst/rtpmanager/gstrtpsession.c: - (gst_rtp_session_event_recv_rtp_sink): - * gst/rtpmanager/gstrtpssrcdemux.c: - (gst_rtp_ssrc_demux_sink_event): - Forward FLUSH events instead of leaking them. - * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew), - (calculate_skew), (rtp_jitter_buffer_insert): - * gst/rtpmanager/rtpjitterbuffer.h: - Remove the tail-changed callback in favour of a simple boolean when we - insert a buffer in the queue. - Add method to peek the tail of the buffer. - -2007-10-05 08:51:44 +0000 Gautier Portet <kassoulet@gmail.com> - - gst/xingheader/gstxingmux.c: The size of the Xing header is actually 417 as it's rounded to the next smaller integer.... - Original commit message from CVS: - Patch by: Gautier Portet <kassoulet at gmail dot com> - * gst/xingheader/gstxingmux.c: - The size of the Xing header is actually 417 as it's rounded to the - next smaller integer. Fixes #397759. - * gst/xingheader/gstxingmux.c: (xing_generate_header), - (xing_push_header): - Some random cleanup, add FIXMEs and TODOs and check if the newsegment - event to the beginning was successful before pushing the header again. - -2007-10-05 08:05:14 +0000 Wai-Ming Ho <webregbox@yahoo.co.uk> - - gst/mpegtsparse/mpegtspacketizer.c: Don't skip PAT with version number 0. Fixes #483400. - Original commit message from CVS: - Patch by: Wai-Ming Ho <webregbox at yahoo dot co dot uk> - * gst/mpegtsparse/mpegtspacketizer.c: - (mpegts_packetizer_stream_new): - Don't skip PAT with version number 0. Fixes #483400. - * gst/mpegtsparse/mpegtsparse.c: (mpegts_parse_apply_pat): - Make all values above 0 mark a referenced program as they can be - incremented and only 1 had marked a referenced program before, causing - actually referenced programs to be unreferenced. - -2007-10-02 10:29:46 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/sdp/gstsdpdemux.h: Change signature of pt to fix compilation on some platforms. - Original commit message from CVS: - * gst/sdp/gstsdpdemux.h: - Change signature of pt to fix compilation on some platforms. - -2007-10-02 10:27:45 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Remove some old unused variables. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_flush_start), - (gst_rtp_jitter_buffer_flush_stop), - (gst_rtp_jitter_buffer_change_state), (apply_offset), - (gst_rtp_jitter_buffer_loop): - Remove some old unused variables. - Don't add the latency to the skew corrected timestamp, latency is only - used to sync against the clock. - Improve debugging. - * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_init), - (rtp_jitter_buffer_reset_skew), (calculate_skew): - * gst/rtpmanager/rtpjitterbuffer.h: - Handle case where server timestamp goes backwards or wildly jumps by - temporarily pausing the skew correction. - Improve debugging. - -2007-10-02 10:12:40 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/sdp/Makefile.am: Forgot to commit makefile. - Original commit message from CVS: - * gst/sdp/Makefile.am: - Forgot to commit makefile. - -2007-10-02 07:43:57 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/gio/gstgiosink.c: Update to API changes in GIO. - Original commit message from CVS: - * ext/gio/gstgiosink.c: (gst_gio_sink_start): - Update to API changes in GIO. - -2007-10-01 14:01:40 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/sdp/gstsdpdemux.c: Use new function in -base to get the default clock-rate. - Original commit message from CVS: - * gst/sdp/gstsdpdemux.c: (gst_sdp_demux_media_to_caps): - Use new function in -base to get the default clock-rate. - -2007-10-01 11:43:09 +0000 Wim Taymans <wim.taymans@gmail.com> - - Added SDP demuxer element. Fixes #426657. - Original commit message from CVS: - * configure.ac: - * gst/sdp/gstsdpdemux.c: (_do_init), (gst_sdp_demux_base_init), - (gst_sdp_demux_class_init), (gst_sdp_demux_init), - (gst_sdp_demux_finalize), (gst_sdp_demux_set_property), - (gst_sdp_demux_get_property), (find_stream_by_id), - (find_stream_by_pt), (find_stream_by_udpsrc), (find_stream), - (gst_sdp_demux_stream_free), (gst_sdp_demux_create_stream), - (gst_sdp_demux_cleanup), (get_default_rate_for_pt), - (gst_sdp_demux_parse_rtpmap), (gst_sdp_demux_media_to_caps), - (new_session_pad), (request_pt_map), (gst_sdp_demux_do_stream_eos), - (on_bye_ssrc), (on_timeout), (gst_sdp_demux_configure_manager), - (gst_sdp_demux_stream_configure_udp), - (gst_sdp_demux_stream_configure_udp_sink), - (gst_sdp_demux_combine_flows), (gst_sdp_demux_stream_push_event), - (gst_sdp_demux_handle_message), (gst_sdp_demux_start), - (gst_sdp_demux_sink_event), (gst_sdp_demux_sink_chain), - (gst_sdp_demux_change_state): - * gst/sdp/gstsdpdemux.h: - * gst/sdp/gstsdpelem.c: (plugin_init): - Added SDP demuxer element. Fixes #426657. - -2007-10-01 09:21:19 +0000 mutex at runbox dot com <mutex@runbox.com> - - gst/mpegtsparse/: Remove useless src pad that only results in not linked errors, fix a broken pointer dereference and... - Original commit message from CVS: - Patch by: mutex at runbox dot com - * gst/mpegtsparse/mpegtspacketizer.c: - (mpegts_packetizer_parse_adaptation_field_control): - * gst/mpegtsparse/mpegtsparse.c: (mpegts_parse_base_init), - (mpegts_parse_init), (mpegts_parse_push): - * gst/mpegtsparse/mpegtsparse.h: - Remove useless src pad that only results in not linked errors, - fix a broken pointer dereference and make MAX_CONTINUITY constant - conform to the standard to stop outputting corrupted data. - Fixes #481276, #481279. - -2007-09-29 19:36:34 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/mythtv/gstmythtvsrc.c: Re-apply docs patch from #468039; fix tab. - Original commit message from CVS: - * ext/mythtv/gstmythtvsrc.c: - Re-apply docs patch from #468039; fix tab. - * gst/mpegtsparse/.cvsignore: - Ignore marshaller files generated at build time. - -2007-09-29 07:01:55 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/gio/: Some minor cleanup and allow setting the location only when the element is not playing or paused. - Original commit message from CVS: - * ext/gio/gstgiosink.c: (gst_gio_sink_base_init), - (gst_gio_sink_set_property), (gst_gio_sink_render): - * ext/gio/gstgiosrc.c: (gst_gio_src_base_init), - (gst_gio_src_set_property): - Some minor cleanup and allow setting the location only when the - element is not playing or paused. - -2007-09-29 05:26:54 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Update gio's pkg-config file name as currently in SVN. - Original commit message from CVS: - * configure.ac: - Update gio's pkg-config file name as currently in SVN. - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_set_location): - Remove special casing for a NULL query string. g_strjoin won't add - the separator if there's only one string. - -2007-09-28 14:51:58 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Fix crasher in dispose. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (free_client): - Fix crasher in dispose. - * gst/rtpmanager/rtpjitterbuffer.c: (calculate_skew): - Handle cases where input buffers have no timestamps so that no clock - skew can be calculated, in this case interpollate timestamps based on - rtp timestamp and assume a 0 clock skew. - -2007-09-28 11:17:35 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Remove jitter correction code, it's now in the lower level object. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: (apply_latency), - (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_query): - Remove jitter correction code, it's now in the lower level object. - Use new -core method for doing a peer query. - * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_init), - (calculate_skew), (rtp_jitter_buffer_insert): - * gst/rtpmanager/rtpjitterbuffer.h: - Move jitter correction to the lowlevel jitterbuffer. - Increase the max window size. - When filling the window, already start estimating the skew using a - parabolic weighting factor so that we have a much better startup - behaviour that gets more accurate with the more samples we have. - Increase the default weighting factor for the steady state to get - smoother timestamps. - -2007-09-28 11:07:34 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/neon/gstneonhttpsrc.c: Now that we require libneon >= 0.26 remove the neon 0.25 backward compatibility stuff. Als... - Original commit message from CVS: - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_set_proxy), - (gst_neonhttp_src_send_request_and_redirect): - Now that we require libneon >= 0.26 remove the neon 0.25 backward - compatibility stuff. Also fix the default location. - -2007-09-28 10:51:13 +0000 Wim Taymans <wim.taymans@gmail.com> - - configure.ac: We require libneon >= 26 now for the query field in ne_uri. - Original commit message from CVS: - * configure.ac: - We require libneon >= 26 now for the query field in ne_uri. - -2007-09-28 09:29:09 +0000 Wouter Cloetens <wouter@mind.be> - - ext/neon/gstneonhttpsrc.*: Don't discard GET parameters from URL if existing. - Original commit message from CVS: - Patch by: Wouter Cloetens <wouter@mind.be> - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_dispose), - (gst_neonhttp_src_set_location), - (gst_neonhttp_src_send_request_and_redirect): - * ext/neon/gstneonhttpsrc.h: - Don't discard GET parameters from URL if existing. - Fixes #481200. - -2007-09-27 14:52:58 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/gstrfbsrc.*: Added a property for incremental screen updates - Original commit message from CVS: - * gst/librfb/gstrfbsrc.c: - * gst/librfb/gstrfbsrc.h: - Added a property for incremental screen updates - -2007-09-27 13:02:58 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/xvid/gstxvidenc.*: Remove superfluous 'frame-encoded' signal (people can use an upstream identity's 'handoff' sig... - Original commit message from CVS: - * ext/xvid/gstxvidenc.c: - * ext/xvid/gstxvidenc.h: - Remove superfluous 'frame-encoded' signal (people can - use an upstream identity's 'handoff' signal or a pad - probe for this if they must know). - -2007-09-27 10:06:23 +0000 Julien Moutte <julien@moutte.net> - - gst/flv/gstflvparse.c: I got it wrong again, audio rate was not detected correctly in all cases. - Original commit message from CVS: - 2007-09-27 Julien MOUTTE <julien@moutte.net> - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video): I got it wrong again, audio rate - was not detected correctly in all cases. - -2007-09-26 20:08:28 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Fix cleanup crasher. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_dispose), - (gst_rtp_bin_finalize): - Fix cleanup crasher. - * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_init), - (calculate_skew): - * gst/rtpmanager/rtpjitterbuffer.h: - Dynamically adjust the skew calculation window so that we calculate it - over a period of around 2 seconds. - -2007-09-26 16:44:42 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/gstrfbsrc.c: fix bug from generic/states.gdb - Original commit message from CVS: - * gst/librfb/gstrfbsrc.c: - fix bug from generic/states.gdb - -2007-09-26 16:30:50 +0000 Julien Moutte <julien@moutte.net> - - gst/flv/gstflvparse.c: codec_data is needed for every tag not just the first one. (Fix a stupid bug i introduced with... - Original commit message from CVS: - 2007-09-26 Julien MOUTTE <julien@moutte.net> - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video): codec_data is needed for every tag - not just the first one. (Fix a stupid bug i introduced without - testing) - -2007-09-26 11:17:08 +0000 Julien Moutte <julien@moutte.net> - - gst/flv/gstflvparse.c: Fix bit masks operations to be sure we detect the codec_tags and sample rates correctly. - Original commit message from CVS: - 2007-09-26 Julien MOUTTE <julien@moutte.net> - * gst/flv/gstflvparse.c: (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video): Fix bit masks operations to be - sure we detect the codec_tags and sample rates correctly. - Fix raw audio caps generation. - -2007-09-24 10:53:37 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Massive leak fixing, plus code cleanups. - Original commit message from CVS: - * ext/audioresample/gstaudioresample.c: - * ext/x264/gstx264enc.c: - * gst/dvdspu/gstdvdspu.c: - * gst/dvdspu/gstdvdspu.h: - * gst/festival/gstfestival.c: - * gst/h264parse/gsth264parse.c: - * gst/mpegtsparse/mpegtspacketizer.c: - * gst/mpegtsparse/mpegtsparse.c: - * gst/multifile/gstmultifilesink.c: - * gst/multifile/gstmultifilesrc.c: - * gst/nuvdemux/gstnuvdemux.c: - * sys/dshowsrcwrapper/gstdshowaudiosrc.c: - * sys/dshowsrcwrapper/gstdshowvideosrc.c: - * sys/vcd/vcdsrc.c: - Massive leak fixing, plus code cleanups. - -2007-09-22 18:31:17 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - po/LINGUAS: Added translations. - Original commit message from CVS: - * po/LINGUAS: - Added translations. - -2007-09-22 18:29:49 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - po/pl.po: Added Polish translation. - Original commit message from CVS: - translated by: Jakub Bogusz <qboosh@pld-linux.org> - * po/pl.po: - Added Polish translation. - -2007-09-22 18:29:13 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - po/fi.po: Added Finnish translation. - Original commit message from CVS: - translated by: Ilkka Tuohela <hile@iki.fi> - * po/fi.po: - Added Finnish translation. - -2007-09-22 18:28:30 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - po/es.po: Added Spanish translation. - Original commit message from CVS: - translated by: Jorge González González <aloriel@gmail.com> - * po/es.po: - Added Spanish translation. - -2007-09-22 18:27:45 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - po/bg.po: Added Bulgarian translation. - Original commit message from CVS: - translated by: Alexander Shopov <ash@contact.bg> - * po/bg.po: - Added Bulgarian translation. - -2007-09-21 18:00:24 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - docs/plugins/gst-plugins-bad-plugins.hierarchy: Update hierarchy. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - Update hierarchy. - * ext/gio/gstgiosink.h: - * ext/gio/gstgiosrc.h: - Mark private fields of the instance structs private. - -2007-09-21 17:31:05 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - docs/plugins/: Add the GIO plugin to the docs and do a make update while doing that. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-equalizer.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gio.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-spectrum.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-xingheader.xml: - * docs/plugins/inspect/plugin-xvid.xml: - Add the GIO plugin to the docs and do a make update - while doing that. - * ext/gio/gstgiosrc.c: (gst_gio_src_start): - Fix a small memleak. - -2007-09-21 17:07:56 +0000 René Stadler <mail@renestadler.de> - - Add a GIO/GVFS plugin with source and sink elements. This will only be enabled when --enable-experimental is given to... - Original commit message from CVS: - Patch by: René Stadler <mail at renestadler dot de> - * configure.ac: - * ext/Makefile.am: - * ext/gio/Makefile.am: - * ext/gio/gstgio.c: (gst_gio_error), (gst_gio_seek), - (gst_gio_get_supported_protocols), - (gst_gio_uri_handler_get_type_sink), - (gst_gio_uri_handler_get_type_src), - (gst_gio_uri_handler_get_protocols), (gst_gio_uri_handler_get_uri), - (gst_gio_uri_handler_set_uri), (gst_gio_uri_handler_init), - (gst_gio_uri_handler_do_init), (plugin_init): - * ext/gio/gstgio.h: - * ext/gio/gstgiosink.c: (gst_gio_sink_base_init), - (gst_gio_sink_class_init), (gst_gio_sink_init), - (gst_gio_sink_finalize), (gst_gio_sink_set_property), - (gst_gio_sink_get_property), (gst_gio_sink_start), - (gst_gio_sink_stop), (gst_gio_sink_unlock), - (gst_gio_sink_unlock_stop), (gst_gio_sink_event), - (gst_gio_sink_render), (gst_gio_sink_query): - * ext/gio/gstgiosink.h: - * ext/gio/gstgiosrc.c: (gst_gio_src_base_init), - (gst_gio_src_class_init), (gst_gio_src_init), - (gst_gio_src_finalize), (gst_gio_src_set_property), - (gst_gio_src_get_property), (gst_gio_src_start), - (gst_gio_src_stop), (gst_gio_src_get_size), - (gst_gio_src_is_seekable), (gst_gio_src_unlock), - (gst_gio_src_unlock_stop), (gst_gio_src_check_get_range), - (gst_gio_src_create): - * ext/gio/gstgiosrc.h: - Add a GIO/GVFS plugin with source and sink elements. This will - only be enabled when --enable-experimental is given to configure - for now as the GIO API is not stable yet. Fixes #476916. - -2007-09-21 15:49:24 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - update spec file with various new plug-ins - Original commit message from CVS: - update spec file with various new plug-ins - -2007-09-21 14:55:19 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/: Added offset-x, offset-y, width and height property for selecting a region from the screen - Original commit message from CVS: - * gst/librfb/gstrfbsrc.c: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - Added offset-x, offset-y, width and height property - for selecting a region from the screen - -2007-09-21 10:27:02 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/gstrfbsrc.c: Minimum raw encoding is working now - Original commit message from CVS: - * gst/librfb/gstrfbsrc.c: - Minimum raw encoding is working now - * gst/librfb/rfbdecoder.c: - fix address while reading from stream - -2007-09-20 20:40:05 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/gstrfbsrc.c: raw encoding is working, but it looks like the ffmpegcolorspace plugin can't handle high reso... - Original commit message from CVS: - * gst/librfb/gstrfbsrc.c: - raw encoding is working, but it looks like the - ffmpegcolorspace plugin can't handle high resolutions - -2007-09-20 18:30:35 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/gstrfbsrc.c: bpp, depth and endianness are now set from the stream. - Original commit message from CVS: - * gst/librfb/gstrfbsrc.c: - bpp, depth and endianness are now set from the - stream. - -2007-09-20 17:38:10 +0000 Wim Taymans <wim.taymans@gmail.com> - - examples/app/appsrc_ex.c: Fix compilation after changing the name of a method. - Original commit message from CVS: - * examples/app/appsrc_ex.c: (main): - Fix compilation after changing the name of a method. - -2007-09-20 15:06:23 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Fix memory leaks. More to come. - Original commit message from CVS: - * ext/alsaspdif/alsaspdifsink.c: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * gst/mpegvideoparse/mpegvideoparse.c: - Fix memory leaks. More to come. - * tests/check/Makefile.am: - * tests/check/generic/states.c: - Improved state change unit test. - -2007-09-20 14:34:57 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Add notification of active SSRCs to various RTP elements. Fixes #478566. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (on_ssrc_active), (create_session), - (gst_rtp_bin_class_init): - * gst/rtpmanager/gstrtpbin.h: - * gst/rtpmanager/gstrtpsession.c: (on_ssrc_active), - (gst_rtp_session_class_init), (gst_rtp_session_init), - (gst_rtp_session_event_send_rtp_sink): - * gst/rtpmanager/gstrtpsession.h: - * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), - (on_ssrc_active), (rtp_session_process_rb): - * gst/rtpmanager/rtpsession.h: - Add notification of active SSRCs to various RTP elements. Fixes #478566. - -2007-09-20 13:59:50 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst-libs/gst/app/gstappsink.*: Add properties, signals and actions to access the element even without linking to the ... - Original commit message from CVS: - * gst-libs/gst/app/gstappsink.c: (gst_app_marshal_OBJECT__VOID), - (gst_app_sink_class_init), (gst_app_sink_init), - (gst_app_sink_dispose), (gst_app_sink_finalize), - (gst_app_sink_set_property), (gst_app_sink_get_property), - (gst_app_sink_flush_unlocked), (gst_app_sink_start), - (gst_app_sink_event), (gst_app_sink_getcaps), - (gst_app_sink_set_caps), (gst_app_sink_get_caps), - (gst_app_sink_is_eos), (gst_app_sink_pull_preroll), - (gst_app_sink_pull_buffer): - * gst-libs/gst/app/gstappsink.h: - Add properties, signals and actions to access the element even without - linking to the library. - Fix some method names and signatures. - -2007-09-19 21:18:27 +0000 Jonathan Matthew <jonathan@kaolin.wh9.net> - - ext/faad/gstfaad.c: Don't set channel positions on regular mono and stereo cases. - Original commit message from CVS: - Patch by: Jonathan Matthew <jonathan at kaolin wh9 net> - * ext/faad/gstfaad.c: (gst_faad_chanpos_to_gst), - (gst_faad_srcgetcaps), (gst_faad_update_caps): - Don't set channel positions on regular mono and stereo cases. - Fixes #476370. - -2007-09-19 20:55:43 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/: It is now possible to connect to a vncserver. there are still some issues with the ouput of the screen. ... - Original commit message from CVS: - * gst/librfb/gstrfbsrc.c: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - It is now possible to connect to a vncserver. - there are still some issues with the ouput of - the screen. Looks like some lines are confused - -2007-09-19 18:22:23 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Ignore registries in any format. - Original commit message from CVS: - * docs/plugins/.cvsignore: - * tests/check/.cvsignore: - Ignore registries in any format. - -2007-09-19 13:50:44 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/real/gstrealvideodec.*: Don't generate an error for occasional decoding errors. - Original commit message from CVS: - * gst/real/gstrealvideodec.c: (gst_real_video_dec_chain), - (open_library), (gst_real_video_dec_init), - (gst_real_video_dec_set_property), - (gst_real_video_dec_get_property), (gst_real_video_dec_class_init): - * gst/real/gstrealvideodec.h: - Don't generate an error for occasional decoding errors. - Add max-errors property. - Error out when we receive max-errors in a row. Fixes #478159. - -2007-09-19 13:06:17 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/gstrfbsrc.c: Add password property (write only) - Original commit message from CVS: - * gst/librfb/gstrfbsrc.c: - Add password property (write only) - * gst/librfb/rfbdecoder.c: - Read the reason on failure - Use the password property for authentication - * gst/librfb/rfbdecoder.h: - Add defines for version checking - -2007-09-19 12:50:27 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/directfb/dfbvideosink.c: When finalizing GstDfbSurface, a subclass of GstBuffer, correctly chain up to the parent... - Original commit message from CVS: - * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_surface_destroy), - (gst_dfbsurface_class_init): - When finalizing GstDfbSurface, a subclass of GstBuffer, correctly - chain up to the parent class to free everything, including caps. - -2007-09-19 12:50:05 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/directfb/dfbvideosink.c: When finalizing GstDfbSurface, a subclass of GstBuffer, correctly chain up to the parent... - Original commit message from CVS: - * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_surface_destroy), - (gst_dfbsurface_class_init): - When finalizing GstDfbSurface, a subclass of GstBuffer, correctly - chain up to the parent class to free everything, including caps. - -2007-09-19 08:35:13 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/: VNC Authentication should be working now temperaly with fake password 'testtest' - Original commit message from CVS: - * gst/librfb/Makefile.am: - * gst/librfb/d3des.c: - * gst/librfb/d3des.h: - * gst/librfb/rfbdecoder.c: - * gst/librfb/vncauth.c: - * gst/librfb/vncauth.h: - VNC Authentication should be working now - temperaly with fake password 'testtest' - -2007-09-18 16:32:19 +0000 Thijs Vermeir <thijsvermeir@gmail.com> - - gst/librfb/rfbdecoder.*: Added some documentation about security handling start implementing security handling for rf... - Original commit message from CVS: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - Added some documentation about security handling - start implementing security handling for rfb 3.3 - -2007-09-18 13:55:06 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/: Handling window resize. - Original commit message from CVS: - * gst/spectrum/demo-audiotest.c: - * gst/spectrum/demo-osssrc.c: - Handling window resize. - -2007-09-18 11:45:06 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ChangeLog: Add missing newline. - Original commit message from CVS: - * ChangeLog: - Add missing newline. - * gst/librfb/rfbdecoder.c: - Fix the build (missing stdlib.h). - * gst/spectrum/gstspectrum.c: - * gst/spectrum/gstspectrum.h: - Use basetransform segment so that it is correctly managed on flushes - and start/stop. Report message timestamp as stream time, which is what - an application can understand. (Yes these are adapted from wim recent - level element changes) +2022-03-02 05:01:42 +0900 Seungha Yang <seungha@centricular.com> -2007-09-17 21:12:17 +0000 Thijs Vermeir <thijsvermeir@gmail.com> + * sys/nvcodec/gstcudacontext.c: + cudacontext: Remove unnecessary cuInit() call + It's already called at plugin init time + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1834> - * gst/librfb/gstrfbsrc.c: - * gst/librfb/gstrfbsrc.h: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - Added a new property for the rfb version - Original commit message from CVS: - Added a new property for the rfb version - -2007-09-17 02:01:41 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Link to the right pads regardless of which one was created first in the ssrc demuxer. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (new_ssrc_pad_found): - Link to the right pads regardless of which one was created first in the - ssrc demuxer. - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_process_rtp), - (gst_rtp_session_chain_recv_rtp), (gst_rtp_session_chain_send_rtp): - * gst/rtpmanager/rtpsource.c: (calculate_jitter): - Improve debugging. - * gst/rtpmanager/gstrtpssrcdemux.c: (create_demux_pad_for_ssrc), - (gst_rtp_ssrc_demux_init), (gst_rtp_ssrc_demux_finalize), - (gst_rtp_ssrc_demux_sink_event), - (gst_rtp_ssrc_demux_rtcp_sink_event), (gst_rtp_ssrc_demux_chain), - (gst_rtp_ssrc_demux_rtcp_chain), - (gst_rtp_ssrc_demux_internal_links): - * gst/rtpmanager/gstrtpssrcdemux.h: - Fix race in creating the RTP and RTCP pads when a new SSRC is detected. - -2007-09-16 19:40:31 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Use lock to protect variable. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_set_property), - (gst_rtp_bin_get_property): - Use lock to protect variable. - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_class_init), - (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_chain), - (convert_rtptime_to_gsttime), (gst_rtp_jitter_buffer_loop): - Reconstruct GST timestamp from RTP timestamps based on measured clock - skew and sync offset. - * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_init), - (rtp_jitter_buffer_set_tail_changed), - (rtp_jitter_buffer_set_clock_rate), - (rtp_jitter_buffer_get_clock_rate), (calculate_skew), - (rtp_jitter_buffer_insert), (rtp_jitter_buffer_peek): - * gst/rtpmanager/rtpjitterbuffer.h: - Measure clock skew. - Add callback to be notfied when a new packet was inserted at the tail. - * gst/rtpmanager/rtpsource.c: (rtp_source_init), - (calculate_jitter), (rtp_source_send_rtp): - * gst/rtpmanager/rtpsource.h: - Remove clock skew detection, it's move to the jitterbuffer now. - -2007-09-16 07:28:18 +0000 Daniel Charles <dcharles@ti.com> - - ext/amrwb/gstamrwbenc.*: Add property to control bandmode. Fixes #477306. - Original commit message from CVS: - Patch by: Daniel Charles <dcharles at ti dot com> - * ext/amrwb/gstamrwbenc.c: (gst_amrwbenc_bandmode_get_type), - (gst_amrwbenc_set_property), (gst_amrwbenc_get_property), - (gst_amrwbenc_class_init), (gst_amrwbenc_chain): - * ext/amrwb/gstamrwbenc.h: - Add property to control bandmode. Fixes #477306. - -2007-09-15 18:48:03 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Also set NTP base time on new sessions. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (create_session): - Also set NTP base time on new sessions. - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_query), - (gst_rtp_jitter_buffer_set_property), - (gst_rtp_jitter_buffer_get_property): - Use the right lock to protect our variables. - Fix some comment. - * gst/rtpmanager/gstrtpsession.c: - (gst_rtp_session_getcaps_send_rtp), - (gst_rtp_session_chain_send_rtp), (create_send_rtp_sink): - Implement getcaps on the sender sinkpad so that payloaders can negotiate - the right SSRC. - -2007-09-12 21:23:47 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Various leak fixes. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (create_session), (free_session), - (get_client), (free_client), (gst_rtp_bin_associate), - (free_stream), (gst_rtp_bin_class_init), (gst_rtp_bin_dispose), - (gst_rtp_bin_finalize): - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_class_init), - (gst_rtp_jitter_buffer_finalize): - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_release): - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_finalize), - (gst_rtp_session_set_property), (gst_rtp_session_chain_recv_rtp), - (gst_rtp_session_chain_send_rtp): - * gst/rtpmanager/gstrtpssrcdemux.c: - (gst_rtp_ssrc_demux_class_init), (gst_rtp_ssrc_demux_dispose): - * gst/rtpmanager/rtpsession.c: (rtp_session_finalize): - * gst/rtpmanager/rtpsession.h: - Various leak fixes. - -2007-09-12 18:04:32 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Calculate and configure the NTP base time so that we can generate better - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (calc_ntp_ns_base), - (gst_rtp_bin_change_state), (new_payload_found), (create_send_rtp): - Calculate and configure the NTP base time so that we can generate better - NTP times in SR packets. - Set caps on new ghostpad. - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_loop): - Clean debug statement. - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), - (gst_rtp_session_init), (gst_rtp_session_set_property), - (gst_rtp_session_get_property), (get_current_ntp_ns_time), - (rtcp_thread), (gst_rtp_session_event_recv_rtp_sink), - (gst_rtp_session_internal_links), (gst_rtp_session_chain_recv_rtp), - (gst_rtp_session_event_send_rtp_sink), - (gst_rtp_session_chain_send_rtp), (create_recv_rtp_sink), - (create_send_rtp_sink): - * gst/rtpmanager/gstrtpsession.h: - Add ntp-ns-base property to convert running_time to NTP time. - Handle NEWSEGMENT events on send and recv RTP pads so that we can - calculate the running time and thus NTP time of the packets. - Simplify getting the current NTP time using the pipeline clock. - Implement internal links functions. - Use the buffer timestamp to calculate the NTP time instead of the clock. - * gst/rtpmanager/gstrtpssrcdemux.c: (create_demux_pad_for_ssrc), - (gst_rtp_ssrc_demux_init), (gst_rtp_ssrc_demux_sink_event), - (gst_rtp_ssrc_demux_chain), (gst_rtp_ssrc_demux_rtcp_chain), - (gst_rtp_ssrc_demux_internal_links), - (gst_rtp_ssrc_demux_src_query): - * gst/rtpmanager/gstrtpssrcdemux.h: - Implement internal links function. - Calculate the diff between different streams, this might be used later - to get the inter stream latency. - * gst/rtpmanager/rtpsession.c: (rtp_session_send_rtp): - Simple cleanup. - * gst/rtpmanager/rtpsource.c: (rtp_source_init), - (calculate_jitter), (rtp_source_send_rtp), (rtp_source_get_new_sr): - Make the clock skew window a little bigger. - Apply the clock skew to all buffers, not just one with a new timestamp. - Calculate and debug sender clock drift. - Use extended last timestamp to interpollate for SR reports. - -2007-09-12 08:38:22 +0000 Peter Kjellerstedt <pkj@axis.com> - - gst/: Printf format fixes (#476128). - Original commit message from CVS: - Patch by: Peter Kjellerstedt <pkj at axis com> - * gst-libs/gst/app/gstappsink.c: - * gst/flv/gstflvdemux.c: - * gst/flv/gstflvparse.c: - * gst/interleave/deinterleave.c: - * gst/switch/gstswitch.c: - Printf format fixes (#476128). - -2007-09-09 19:05:19 +0000 Thomas Green <tom78999@gmail.com> - - ext/neon/gstneonhttpsrc.c: With libneon 2.6, we need to set the NE_SESSFLAG_ICYPROTO flag if we want ICY streams to b... - Original commit message from CVS: - Patch by: Thomas Green <tom78999 gmail com> - * ext/neon/gstneonhttpsrc.c: - With libneon 2.6, we need to set the NE_SESSFLAG_ICYPROTO - flag if we want ICY streams to be handled too, otherwise - libneon will error out with a 'can't parse reponse' error. - Fixes #474696. - * tests/check/elements/neonhttpsrc.c: - Unit test for the above by Yours Truly. - -2007-09-09 18:22:53 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Use AC_TRY_COMPILE instead of AC_TRY_RUN for the faad and the xvid configure checks, so they still work... - Original commit message from CVS: - * configure.ac: - Use AC_TRY_COMPILE instead of AC_TRY_RUN for the faad and the - xvid configure checks, so they still work when cross-compiling. - Fixes #452009. - -2007-09-07 15:54:38 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/spectrum/gstspectrum.c: Use the correct parameter order for the memset calls. - Original commit message from CVS: - * gst/spectrum/gstspectrum.c: (gst_spectrum_start), - (gst_spectrum_transform_ip): - Use the correct parameter order for the memset calls. - Thanks to Christian Schaller for noticing. - -2007-09-06 20:37:56 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/mpegtsparse/mpegtsparse.c: Fix the build (missing stdlib.h). - Original commit message from CVS: - * gst/mpegtsparse/mpegtsparse.c: - Fix the build (missing stdlib.h). - -2007-09-06 07:26:45 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/spectrum/fix_fft.c: Remove fixed point FFT as it's not used anymore. - Original commit message from CVS: - * gst/spectrum/fix_fft.c: - Remove fixed point FFT as it's not used anymore. - -2007-09-06 07:21:22 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Port GstSpectrum to GstAudioFilter and libgstfft, add support for int32, float and double, use floats for the message... - Original commit message from CVS: - * configure.ac: - * gst/spectrum/Makefile.am: - * gst/spectrum/demo-audiotest.c: (draw_spectrum), - (message_handler), (main): - * gst/spectrum/demo-osssrc.c: (draw_spectrum), (message_handler): - * gst/spectrum/gstspectrum.c: (gst_spectrum_base_init), - (gst_spectrum_class_init), (gst_spectrum_init), - (gst_spectrum_dispose), (gst_spectrum_set_property), - (gst_spectrum_get_property), (gst_spectrum_start), - (gst_spectrum_setup), (gst_spectrum_message_new), - (gst_spectrum_transform_ip): - * gst/spectrum/gstspectrum.h: - Port GstSpectrum to GstAudioFilter and libgstfft, add support - for int32, float and double, use floats for the message contents, - average all FFTs done in one interval for better results, use - a better windowing function, allow posting the phase in the message - and actually do an FFT with the requested number of bands instead - of interpolating. - * tests/check/elements/spectrum.c: (GST_START_TEST), - (spectrum_suite): - Improve the units tests by checking for a 11025Hz sine wave - and add unit tests for all 4 supported sample types. - -2007-09-05 21:09:08 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/real/gstrealvideodec.c: Add some more debugging. - Original commit message from CVS: - * gst/real/gstrealvideodec.c: (gst_real_video_dec_chain), - (gst_real_video_dec_setcaps): - Add some more debugging. - Don't set LONG for width/height in caps. - Set correct output buffer size when caps changed. - The custom message sent to the decoder should not include the format and - subformat. Fixes #471554. - -2007-09-04 15:23:34 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/rtpmanager/gstrtpsession.c: Make compiler happy: fix compilation with -Wall -Werror (#473562). - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: - Make compiler happy: fix compilation with -Wall -Werror - (#473562). - -2007-09-04 02:22:20 +0000 Johan Dahlin <johan@gnome.org> - - * gst/nsf/gstnsf.c: - Nosefart -> NES Sound Format - Original commit message from CVS: - Nosefart -> NES Sound Format - -2007-09-04 02:16:53 +0000 Johan Dahlin <johan@gnome.org> - - gst/nsf/gstnsf.*: Add support for (very) basic tagging. - Original commit message from CVS: - 2007-09-03 Johan Dahlin <johan@gnome.org> - * gst/nsf/gstnsf.c: (gst_nsfdec_finalize), (start_play_tune): - * gst/nsf/gstnsf.h: - Add support for (very) basic tagging. - -2007-09-03 21:19:34 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Updated example pipelines in docs. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin-marshal.list: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_get_client), - (gst_rtp_bin_associate), (gst_rtp_bin_sync_chain), (create_stream), - (gst_rtp_bin_init), (caps_changed), (new_ssrc_pad_found), - (create_recv_rtp), (create_recv_rtcp), (create_send_rtp): - * gst/rtpmanager/gstrtpbin.h: - Updated example pipelines in docs. - Handle sync_rtcp buffers from the SSRC demuxer to perform lip-sync. - Set the default latency correctly. - Add some more points where we can get caps. - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_class_init), - (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_loop), - (gst_rtp_jitter_buffer_query), - (gst_rtp_jitter_buffer_set_property), - (gst_rtp_jitter_buffer_get_property): - Add ts-offset property to control timestamping. - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), - (gst_rtp_session_init), (gst_rtp_session_set_property), - (gst_rtp_session_get_property), (get_current_ntp_ns_time), - (rtcp_thread), (stop_rtcp_thread), (gst_rtp_session_change_state), - (gst_rtp_session_send_rtcp), (gst_rtp_session_sync_rtcp), - (gst_rtp_session_cache_caps), (gst_rtp_session_clock_rate), - (gst_rtp_session_sink_setcaps), (gst_rtp_session_chain_recv_rtp), - (gst_rtp_session_event_send_rtp_sink), - (gst_rtp_session_chain_send_rtp), (create_recv_rtp_sink), - (create_recv_rtcp_sink), (create_send_rtp_sink), - (create_send_rtcp_src): - Various cleanups. - Feed rtpsession manager with NTP time based on pipeline clock when - handling RTP packets and RTCP timeouts. - Perform all RTCP with the system clock. - Set caps on RTCP outgoing buffers. - * gst/rtpmanager/gstrtpssrcdemux.c: (find_demux_pad_for_ssrc), - (create_demux_pad_for_ssrc), (gst_rtp_ssrc_demux_base_init), - (gst_rtp_ssrc_demux_init), (gst_rtp_ssrc_demux_sink_event), - (gst_rtp_ssrc_demux_rtcp_sink_event), (gst_rtp_ssrc_demux_chain), - (gst_rtp_ssrc_demux_rtcp_chain): - * gst/rtpmanager/gstrtpssrcdemux.h: - Also demux RTCP messages. - * gst/rtpmanager/rtpsession.c: (rtp_session_set_callbacks), - (update_arrival_stats), (rtp_session_process_rtp), - (rtp_session_process_rb), (rtp_session_process_sr), - (rtp_session_process_rr), (rtp_session_process_rtcp), - (rtp_session_send_rtp), (rtp_session_send_bye), - (session_start_rtcp), (session_report_blocks), (session_cleanup), - (rtp_session_on_timeout): - * gst/rtpmanager/rtpsession.h: - Remove the get_time callback, the GStreamer part will feed us with - enough timing information. - Split sync timing and RTCP timing information. - Factor out common RB handling for SR and RR. - Send out SR RTCP packets for lip-sync. - Move SR and RR packet info generation to the source. - * gst/rtpmanager/rtpsource.c: (rtp_source_init), - (rtp_source_update_caps), (get_clock_rate), (calculate_jitter), - (rtp_source_process_rtp), (rtp_source_send_rtp), - (rtp_source_process_sr), (rtp_source_process_rb), - (rtp_source_get_new_sr), (rtp_source_get_new_rb), - (rtp_source_get_last_sr): - * gst/rtpmanager/rtpsource.h: - * gst/rtpmanager/rtpstats.h: - Use caps on incomming buffers to get timing information when they are - there. - Calculate clock scew of the receiver compared to the sender and adjust - the rtp timestamps. - Calculate the round trip in sources. - Do SR and RR calculations in the source. +2022-03-05 11:35:29 +0800 He Junyan <junyan.he@intel.com> -2007-09-03 20:07:17 +0000 Renato Filho <renato.filho@indt.org.br> + * gst/videoparsers/gstav1parse.c: + av1parse: Add a comment when the detection of TU fails. + Also update the print message. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1863> - * ChangeLog: - * configure.ac: - * ext/mythtv/gstmythtvsrc.c: - * ext/mythtv/gstmythtvsrc.h: - gmythsrc code rewrite; - Original commit message from CVS: - gmythsrc code rewrite; - -2007-08-31 15:26:14 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Use extended timestamp to release buffers from the jitterbuffer so that we can h... - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_flush_stop), - (gst_rtp_jitter_buffer_change_state), (gst_rtp_jitter_buffer_loop): - Use extended timestamp to release buffers from the jitterbuffer so that - we can handle the rtp wraparound correctly. - -2007-08-29 16:56:27 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Improve Comments. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_loop): - Improve Comments. - * gst/rtpmanager/gstrtpsession.c: (stop_rtcp_thread), - (gst_rtp_session_change_state), (gst_rtp_session_parse_caps), - (gst_rtp_session_clock_rate), (gst_rtp_session_sink_setcaps), - (gst_rtp_session_event_send_rtp_sink), (create_recv_rtp_sink), - (create_send_rtp_sink): - Also parse the sink caps for clock-rate instead of only relying on the - result of the signal. - * gst/rtpmanager/rtpsource.c: (rtp_source_send_rtp): - Make sure we fetch the clock rate for payloads we are sending out so - that we can use it for SR reports. - -2007-08-29 16:20:28 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/switch/gstswitch.c (gst_switch_chain, gst_switch_set_property): If all information is known at time of setting st... - Original commit message from CVS: - * gst/switch/gstswitch.c (gst_switch_chain, gst_switch_set_property): - If all information is known at time of setting start-time - property, send new segments then. - -2007-08-29 01:22:43 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpsession.*: Distribute synchronisation parameters to the session manager so that it can generate ... - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: (stop_rtcp_thread), - (gst_rtp_session_change_state), - (gst_rtp_session_event_send_rtp_sink): - * gst/rtpmanager/gstrtpsession.h: - Distribute synchronisation parameters to the session manager so that it - can generate correct SR packets for lip-sync. - * gst/rtpmanager/rtpsession.c: (rtp_session_set_base_time), - (rtp_session_set_timestamp_sync), (session_start_rtcp): - * gst/rtpmanager/rtpsession.h: - Add methods for setting sync parameters. - Set correct RTP time in SR packets using the sync params. - * gst/rtpmanager/rtpsource.c: (rtp_source_send_rtp): - * gst/rtpmanager/rtpsource.h: - Record last RTP <-> GST timestamp so that we can use them to convert NTP - to RTP timestamps in SR packets. - -2007-08-28 20:30:16 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Add some more advanced example pipelines. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_clear_pt_map): - Add some more advanced example pipelines. - * gst/rtpmanager/gstrtpsession.c: (rtcp_thread), - (stop_rtcp_thread), (gst_rtp_session_send_rtcp): - Add some debug and FIXME. - Release LOCK when performing session cleanup. - * gst/rtpmanager/rtpsession.c: (session_report_blocks): - Add some debug. - * gst/rtpmanager/rtpsource.c: (calculate_jitter), - (rtp_source_send_rtp): - Make sure we always send RTP packets with the session SSRC. - -2007-08-28 08:10:05 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/dvdspu/gstdvdspu.c: Don't need this include (fixes compilation in uninstalled setup). - Original commit message from CVS: - * gst/dvdspu/gstdvdspu.c: - Don't need this include (fixes compilation in uninstalled setup). - -2007-08-27 21:17:21 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: When synchronizing buffers, take peer latency into account. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_change_state), (gst_rtp_jitter_buffer_loop), - (gst_rtp_jitter_buffer_query): - When synchronizing buffers, take peer latency into account. - Don't try to add our latency to invalid peer max latency values. - -2007-08-27 14:56:05 +0000 Julien Moutte <julien@moutte.net> - - gst/flv/gstflvdemux.c: Make sure we initialize the seek result. - Original commit message from CVS: - 2007-08-27 Julien MOUTTE <julien@moutte.net> - * gst/flv/gstflvdemux.c: (gst_flv_demux_handle_seek_pull): - Make sure we initialize the seek result. - -2007-08-27 14:41:01 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/dvdspu/Makefile.am: Commit the makefile too. - Original commit message from CVS: - * gst/dvdspu/Makefile.am: - Commit the makefile too. - -2007-08-27 14:33:59 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - dvdspu element donated by Fluendo. It implements a DVD Sub-Picture - Original commit message from CVS: - * configure.ac: - * gst/dvdspu/.cvsignore: - * gst/dvdspu/Notes.txt: - * gst/dvdspu/gstdvdspu-render.c: (dvdspu_recalc_palette), - (dvdspu_update_palettes), (dvdspu_clear_comp_buffers), - (dvdspu_get_nibble), (dvdspu_get_rle_code), (dvdspu_draw_rle_run), - (rle_end_x), (dvdspu_render_line), (dvdspu_update_chgcol), - (dvdspu_render_line_with_chgcol), (dvdspu_blend_comp_buffers), - (gstdvdspu_render_spu): - * gst/dvdspu/gstdvdspu.c: (dvdspu_base_init), (dvdspu_class_init), - (dvdspu_init), (dvdspu_clear), (dvdspu_dispose), (dvdspu_finalize), - (dvdspu_flush_spu_info), (dvdspu_buffer_alloc), (dvdspu_src_event), - (dvdspu_video_set_caps), (dvdspu_video_proxy_getcaps), - (dvdspu_video_event), (dvdspu_video_chain), - (dvspu_handle_vid_buffer), (dvdspu_redraw_still), - (gstdvdspu_parse_chg_colcon), (dvdspu_exec_cmd_blk), - (dvdspu_finish_spu_buf), (dvdspu_setup_cmd_blk), - (dvdspu_handle_new_spu_buf), (dvdspu_handle_dvd_event), - (dvdspu_dump_dcsq), (dvdspu_advance_spu), - (dvdspu_check_still_updates), (dvdspu_subpic_chain), - (dvdspu_subpic_event), (dvdspu_change_state), - (gstdvdspu_plugin_init): - * gst/dvdspu/gstdvdspu.h: - dvdspu element donated by Fluendo. It implements a DVD Sub-Picture - Unit, decoding and overlaying DVD subtitles and menu graphics. - * gst/mpeg2sub/.cvsignore: - * gst/mpeg2sub/Makefile.am: - * gst/mpeg2sub/Notes.txt: - * gst/mpeg2sub/gstmpeg2subt.c: - * gst/mpeg2sub/gstmpeg2subt.h: - * gst/mpeg2sub/mpeg2subt.vcproj: - Delete old and broken mpeg2subt element that was never ported from 0.8 - -2007-08-24 17:03:15 +0000 Julien Moutte <julien@moutte.net> - - gst/flv/gstflvdemux.c: Remove some useless ifdef. - Original commit message from CVS: - 2007-08-24 Julien MOUTTE <julien@moutte.net> - * gst/flv/gstflvdemux.c: (gst_flv_demux_flush), - (gst_flv_demux_chain), (gst_flv_demux_pull_tag), - (gst_flv_demux_find_offset), (gst_flv_demux_handle_seek_push), - (gst_flv_demux_handle_seek_pull), (gst_flv_demux_sink_event), - (gst_flv_demux_src_event): Remove some useless ifdef. - -2007-08-24 15:56:52 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - Make switch more reliable and also not lock up when sink pad caps change. - Original commit message from CVS: - * examples/switch/switcher.c (main): - * gst/switch/gstswitch.c (gst_switch_chain): - Make switch more reliable and also not lock up when - sink pad caps change. - -2007-08-24 15:31:26 +0000 Julien Moutte <julien@moutte.net> - - gst/flv/gstflvdemux.c: Implement seeking in push mode. - Original commit message from CVS: - 2007-08-24 Julien MOUTTE <julien@moutte.net> - * gst/flv/gstflvdemux.c: (gst_flv_demux_flush), - (gst_flv_demux_cleanup), (gst_flv_demux_chain), - (gst_flv_demux_pull_tag), (gst_flv_demux_find_offset), - (gst_flv_demux_handle_seek_push), - (gst_flv_demux_handle_seek_pull), - (gst_flv_demux_sink_event), (gst_flv_demux_src_event): Implement - seeking in push mode. - * gst/flv/gstflvdemux.h: - -2007-08-24 11:23:28 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/mpegtsparse/: Update licences to reflect LGPL-ness of these files also. - Original commit message from CVS: - * gst/mpegtsparse/flutspatinfo.c: - * gst/mpegtsparse/flutspatinfo.h: - * gst/mpegtsparse/flutspmtinfo.c: - * gst/mpegtsparse/flutspmtinfo.h: - Update licences to reflect LGPL-ness of these files also. - -2007-08-23 21:39:58 +0000 Tim-Philipp Müller <tim@centricular.net> - - Rename all GstRTPFoo structs to GstRtpFoo so that GST_BOILERPLATE registers a GType that's different than the GstRTPF... - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * gst/rtpmanager/gstrtpbin.c: - * gst/rtpmanager/gstrtpbin.h: - * gst/rtpmanager/gstrtpclient.c: - * gst/rtpmanager/gstrtpclient.h: - * gst/rtpmanager/gstrtpjitterbuffer.c: - * gst/rtpmanager/gstrtpjitterbuffer.h: - * gst/rtpmanager/gstrtpptdemux.c: - * gst/rtpmanager/gstrtpptdemux.h: - * gst/rtpmanager/gstrtpsession.c: - * gst/rtpmanager/gstrtpsession.h: - * gst/rtpmanager/gstrtpssrcdemux.c: - * gst/rtpmanager/gstrtpssrcdemux.h: - Rename all GstRTPFoo structs to GstRtpFoo so that GST_BOILERPLATE - registers a GType that's different than the GstRTPFoo types that - farsight registers (luckily GType names are case sensitive). Should - finally fix #430664. - -2007-08-23 17:21:23 +0000 Tim-Philipp Müller <tim@centricular.net> - - Automatically generate win32/common/config.h via configure (this ensures the win32 version of config.h is up-to-date ... - Original commit message from CVS: - * configure.ac: - * win32/common/config.h: - * win32/common/config.h.in: - Automatically generate win32/common/config.h via configure (this - ensures the win32 version of config.h is up-to-date when a release - is made, #433373). config.h.in file might need some more work. - -2007-08-23 13:24:33 +0000 Jonathan Matthew <jonathan@kaolin.wh9.net> - - Port festival plugin to GStreamer-0.10 (#461377). - Original commit message from CVS: - Patch by: Jonathan Matthew <jonathan at kaolin wh9 net> - * configure.ac: - * gst/festival/Makefile.am: - * gst/festival/gstfestival.c: - Port festival plugin to GStreamer-0.10 (#461377). - -2007-08-22 15:32:04 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/faad/gstfaad.c: Don't unref the buffer when it was clipped. - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_chain): - Don't unref the buffer when it was clipped. - -2007-08-22 14:50:51 +0000 Julien Moutte <julien@moutte.net> - - gst/flv/: Handle pixel aspect ratio through metadata tags like ASF does. Fluendo muxer supports this and - Original commit message from CVS: - 2007-08-22 Julien MOUTTE <julien@moutte.net> - * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), - (gst_flv_demux_pull_tag): - * gst/flv/gstflvdemux.h: - * gst/flv/gstflvparse.c: (gst_flv_parse_metadata_item), - (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video): Handle pixel aspect ratio through - metadata tags like ASF does. Fluendo muxer supports this and - Flash players can support it as well this way. - -2007-08-22 14:03:42 +0000 Julien Moutte <julien@moutte.net> - - gst/flv/: Make sure we don't try filling up the index if no times object was parsed. Fix the way we decide to push ta... - Original commit message from CVS: - 2007-08-22 Julien MOUTTE <julien@moutte.net> - * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_tag): - * gst/flv/gstflvparse.c: (gst_flv_parse_metadata_item), - (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), - (gst_flv_parse_tag_video): Make sure we don't try filling up the - index if no times object was parsed. Fix the way we decide to - push - tags and emit no-more-pads. Fix some printf typing in debugging. - -2007-08-21 17:18:29 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: When drop-on-latency is set but we have no latency configured, just push the buf... - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_chain), - (gst_rtp_jitter_buffer_set_property): - When drop-on-latency is set but we have no latency configured, just push - the buffer as fast as possible. - Fix typo in comment. - -2007-08-21 16:04:47 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/rtpjitterbuffer.*: Fix undefined overflow prone ts_diff handling. - Original commit message from CVS: - * gst/rtpmanager/rtpjitterbuffer.c: - (rtp_jitter_buffer_get_ts_diff): - * gst/rtpmanager/rtpjitterbuffer.h: - Fix undefined overflow prone ts_diff handling. - -2007-08-21 15:59:39 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/modplug/gstmodplug.cc: Fix compiler warning. - Original commit message from CVS: - * gst/modplug/gstmodplug.cc: - Fix compiler warning. - -2007-08-21 12:59:00 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/modplug/gstmodplug.cc: Don't use NULL caps for srcpad is not yet connected. - Original commit message from CVS: - * gst/modplug/gstmodplug.cc: - Don't use NULL caps for srcpad is not yet connected. - -2007-08-20 14:23:45 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - Add mpeg transport stream parser written by: - Original commit message from CVS: - * configure.ac: - * gst/mpegtsparse/Makefile.am: - * gst/mpegtsparse/flutspatinfo.c: - * gst/mpegtsparse/flutspatinfo.h: - * gst/mpegtsparse/flutspmtinfo.c: - * gst/mpegtsparse/flutspmtinfo.h: - * gst/mpegtsparse/flutspmtstreaminfo.c: - * gst/mpegtsparse/flutspmtstreaminfo.h: - * gst/mpegtsparse/mpegtspacketizer.c: - * gst/mpegtsparse/mpegtspacketizer.h: - * gst/mpegtsparse/mpegtsparse.c: - * gst/mpegtsparse/mpegtsparse.h: - * gst/mpegtsparse/mpegtsparsemarshal.list: - Add mpeg transport stream parser written by: - Alessandro Decina. Includes a couple of files from the - Fluendo transport stream demuxer that Fluendo have - kindly allowed to be licenced under LGPL also. - -2007-08-20 09:13:47 +0000 Bastien Nocera <hadess@hadess.net> - - ext/mythtv/gstmythtvsrc.c: Add examples for live mythtv:// URIs to docs (#468039). - Original commit message from CVS: - Patch by: Bastien Nocera <hadess at hadess net> - * ext/mythtv/gstmythtvsrc.c: - Add examples for live mythtv:// URIs to docs (#468039). - Also convert some tabs into spaces. - -2007-08-19 19:16:33 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/: Add small comparision with the chebyshev filters in the docs. - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: - * gst/filter/gstlpwsinc.c: - Add small comparision with the chebyshev filters in the docs. - -2007-08-19 19:01:45 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/: Also test everything in 32 bit float mode. - Original commit message from CVS: - * tests/check/elements/bpwsinc.c: (GST_START_TEST), - (bpwsinc_suite): - * tests/check/elements/lpwsinc.c: (GST_START_TEST), - (lpwsinc_suite): - Also test everything in 32 bit float mode. - -2007-08-17 15:05:17 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Use generator macros for the process functions for the different sample types, add lower upper boundaries for the GOb... - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init), - (bpwsinc_set_property), (bpwsinc_get_property): - * gst/filter/gstbpwsinc.h: - * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init), - (gst_lpwsinc_init), (lpwsinc_build_kernel), (lpwsinc_set_property), - (lpwsinc_get_property): - * gst/filter/gstlpwsinc.h: - * tests/check/elements/lpwsinc.c: (GST_START_TEST): - Use generator macros for the process functions for the different - sample types, add lower upper boundaries for the GObject properties - so automatically generated UIs can use sliders and change frequency - properties to floats to save a bit of memory, even ints would in - theory be enough. Also rename frequency to cutoff for consistency - reasons. - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - Regenerated for the above changes. - -2007-08-17 06:55:37 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/amrwb/gstamrwbparse.c: Don't leak the adapter. - Original commit message from CVS: - * ext/amrwb/gstamrwbparse.c: - Don't leak the adapter. - -2007-08-16 19:22:48 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/gstbpwsinc.*: Implement latency query and only forward those samples downstream that actually contain the ... - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init), - (gst_bpwsinc_init), (process_32), (process_64), - (bpwsinc_build_kernel), (bpwsinc_push_residue), - (bpwsinc_transform), (bpwsinc_start), (bpwsinc_query), - (bpwsinc_query_type), (bpwsinc_event), (bpwsinc_set_property): - * gst/filter/gstbpwsinc.h: - Implement latency query and only forward those samples downstream - that actually contain the data we want, i.e. drop kernel_length/2 - in the beginning and append kernel_length/2 (created by convolving - the filter kernel with zeroes) to the end. - * tests/check/elements/bpwsinc.c: (GST_START_TEST): - Adjust the unit test for this slightly changed behaviour. - * gst/filter/gstlpwsinc.c: (lpwsinc_build_kernel): - Reset residue length only when actually creating a residue. - -2007-08-16 17:11:48 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst-libs/gst/app/gstappsink.c: Override the preroll vmethod instead of overriding the render method twice. - Original commit message from CVS: - * gst-libs/gst/app/gstappsink.c: (gst_app_sink_class_init): - Override the preroll vmethod instead of overriding the render method - twice. - -2007-08-16 11:40:16 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Fix EOS handling. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_sink_event), (gst_rtp_jitter_buffer_chain), - (gst_rtp_jitter_buffer_loop): - Fix EOS handling. - Convert some DEBUG into WARNINGs. - Pause task when flushing. - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), - (rtcp_thread), (gst_rtp_session_event_recv_rtcp_sink): - Use system clock for RTCP session management timeouts. - * gst/rtpmanager/rtpsession.c: (on_new_ssrc), (on_ssrc_collision), - (on_ssrc_validated), (on_bye_ssrc), (on_bye_timeout), (on_timeout): - Release the session lock when emiting signals. - -2007-08-16 11:34:54 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/faad/gstfaad.c: Add some debug info. - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_setcaps), - (gst_faad_chanpos_to_gst): - Add some debug info. - -2007-08-16 09:48:27 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/gstlpwsinc.*: Implement latency query and only forward those samples downstream that actually contain the ... - Original commit message from CVS: - * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init), - (gst_lpwsinc_init), (process_32), (process_64), - (lpwsinc_build_kernel), (lpwsinc_push_residue), - (lpwsinc_transform), (lpwsinc_start), (lpwsinc_query), - (lpwsinc_query_type), (lpwsinc_event), (lpwsinc_set_property): - * gst/filter/gstlpwsinc.h: - Implement latency query and only forward those samples downstream - that actually contain the data we want, i.e. drop kernel_length/2 - in the beginning and append kernel_length/2 (created by convolving - the filter kernel with zeroes) to the end. - * tests/check/elements/lpwsinc.c: (GST_START_TEST): - Adjust the unit test for this slightly changed behaviour. - -2007-08-16 07:07:41 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/ladspa/gstladspa.c: Don't leak like hell. - Original commit message from CVS: - * ext/ladspa/gstladspa.c: - Don't leak like hell. - -2007-08-16 06:49:39 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/check/: Add generic state-change test suite to help to fi leaks. - Original commit message from CVS: - * tests/check/Makefile.am: - * tests/check/generic/.cvsignore: - * tests/check/generic/states.c: - Add generic state-change test suite to help to fi leaks. +2022-03-04 16:48:54 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> -2007-08-15 13:28:39 +0000 Stefan Kost <ensonic@users.sourceforge.net> + * gst/camerabin2/gstwrappercamerabinsrc.c: + camerabin: Remove drain query + This was to support very old V4L2 kernel. As we moved to DMABuf and can now + detach buffers on renegotiation, the buffer it tries to fix no longer exist. + The risk to blocking indefinitly the application does still exist though. + Fixes #1070 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1861> - * ChangeLog: - ChangeLog surgery - Original commit message from CVS: - ChangeLog surgery - -2007-08-15 13:26:57 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/timidity/gstwildmidi.*: - Original commit message from CVS: - reviewed by: <delete if not using a buddy> - patch by: <delete if not someone else's patch> - * ext/timidity/gstwildmidi.c: - * ext/timidity/gstwildmidi.h: - -2007-08-14 17:47:34 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst-libs/gst/app/gstappsink.c: Don't use new API. - Original commit message from CVS: - * gst-libs/gst/app/gstappsink.c: (gst_app_sink_flush_unlocked): - Don't use new API. - -2007-08-14 17:38:05 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst-libs/gst/app/gstappsink.*: Make love to appsink. - Original commit message from CVS: - * gst-libs/gst/app/gstappsink.c: (gst_app_sink_base_init), - (gst_app_sink_class_init), (gst_app_sink_dispose), - (gst_app_sink_flush_unlocked), (gst_app_sink_start), - (gst_app_sink_stop), (gst_app_sink_event), (gst_app_sink_preroll), - (gst_app_sink_render), (gst_app_sink_get_caps), - (gst_app_sink_set_caps), (gst_app_sink_end_of_stream), - (gst_app_sink_pull_preroll), (gst_app_sink_pull_buffer): - * gst-libs/gst/app/gstappsink.h: - Make love to appsink. - Make it support pulling of the preroll buffer. - Add docs and debug statements. - Fix some races wrt to EOS handling and stopping. - Implement getcaps. - Implement FLUSHING. - API: gst_app_sink_pull_preroll() - -2007-08-14 14:56:20 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/flv/gstflvdemux.c: Fix locking and refcounting on the index. - Original commit message from CVS: - * gst/flv/gstflvdemux.c: (gst_flv_demux_set_index), - (gst_flv_demux_get_index): - Fix locking and refcounting on the index. - -2007-08-14 14:22:09 +0000 Julien Moutte <julien@moutte.net> - - gst/flv/gstflvdemux.c: First method for seeking in pull mode using the index built step by step or coming from metadata. - Original commit message from CVS: - 2007-08-14 Julien MOUTTE <julien@moutte.net> - * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), - (gst_flv_demux_adapter_flush), (gst_flv_demux_chain), - (gst_flv_demux_pull_tag), (gst_flv_demux_do_seek), - (gst_flv_demux_handle_seek), (gst_flv_demux_sink_event), - (gst_flv_demux_src_event), (gst_flv_demux_query), - (gst_flv_demux_change_state), (gst_flv_demux_set_index), - (gst_flv_demux_get_index), (gst_flv_demux_dispose), - (gst_flv_demux_class_init): First method for seeking in pull - mode using the index built step by step or coming from metadata. - * gst/flv/gstflvdemux.h: - * gst/flv/gstflvparse.c: (FLV_GET_STRING), - (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), - (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video): Parse - more metadata types and keyframes index. - -2007-08-13 13:50:39 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add docs for lpwsinc and bpwsinc and integrate them into the build system. While doing that also update all other doc... - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-spectrum.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-xingheader.xml: - * docs/plugins/inspect/plugin-xvid.xml: - * gst/filter/gstbpwsinc.c: - * gst/filter/gstbpwsinc.h: - * gst/filter/gstlpwsinc.c: - * gst/filter/gstlpwsinc.h: - Add docs for lpwsinc and bpwsinc and integrate them - into the build system. While doing that also update - all other docs via make update in docs/plugins. - -2007-08-13 06:16:40 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/rtpmanager/rtpjitterbuffer.c: Include stdlib. - Original commit message from CVS: - * gst/rtpmanager/rtpjitterbuffer.c: - Include stdlib. - -2007-08-12 20:55:01 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/elements/bpwsinc.c: Make one test constraint a bit stricter. - Original commit message from CVS: - * tests/check/elements/bpwsinc.c: (GST_START_TEST): - Make one test constraint a bit stricter. - -2007-08-12 20:53:11 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/: Add unit tests for bpwsinc, testing fundamental functionality again. - Original commit message from CVS: - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/bpwsinc.c: (setup_bpwsinc), - (cleanup_bpwsinc), (GST_START_TEST), (bpwsinc_suite), (main): - Add unit tests for bpwsinc, testing fundamental functionality again. - -2007-08-12 20:19:37 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/: Add unit tests for lpwsinc, testing fundamental functionality. - Original commit message from CVS: - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/lpwsinc.c: (setup_lpwsinc), - (cleanup_lpwsinc), (GST_START_TEST), (lpwsinc_suite), (main): - Add unit tests for lpwsinc, testing fundamental functionality. - -2007-08-12 15:41:57 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/: Improve debugging a bit. - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: (bpwsinc_build_kernel): - * gst/filter/gstlpwsinc.c: (lpwsinc_build_kernel): - Improve debugging a bit. - -2007-08-12 12:46:20 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/: Reset the residue in BaseTransform::start to get a clean residue on stream changes. - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init), - (bpwsinc_start): - * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init), - (lpwsinc_start): - Reset the residue in BaseTransform::start to get a clean residue - on stream changes. +2022-03-03 23:00:41 +0800 He Junyan <junyan.he@intel.com> -2007-08-11 21:30:03 +0000 Sebastian Dröge <slomo@circular-chaos.org> + * gst/videoparsers/gstav1parse.c: + av1parse: check the error return when parse_alignment_from_caps() + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1837> - * ChangeLog: - Changelog surgery - Original commit message from CVS: - Changelog surgery - -2007-08-11 15:58:30 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/: Fix processing with buffer sizes that are larger than the filter kernel size. - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: (process_32), (process_64): - * gst/filter/gstlpwsinc.c: (process_32), (process_64): - Fix processing with buffer sizes that are larger than the filter - kernel size. - -2007-08-10 17:16:53 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Remove complicated async queue and replace with more simple jitterbuffer code while also fixing some... - Original commit message from CVS: - * gst/rtpmanager/Makefile.am: - * gst/rtpmanager/async_jitter_queue.c: - * gst/rtpmanager/async_jitter_queue.h: - * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_class_init), - (rtp_jitter_buffer_init), (rtp_jitter_buffer_finalize), - (rtp_jitter_buffer_new), (compare_seqnum), - (rtp_jitter_buffer_insert), (rtp_jitter_buffer_pop), - (rtp_jitter_buffer_flush), (rtp_jitter_buffer_num_packets), - (rtp_jitter_buffer_get_ts_diff): - * gst/rtpmanager/rtpjitterbuffer.h: - Remove complicated async queue and replace with more simple jitterbuffer - code while also fixing some bugs. - * gst/rtpmanager/gstrtpbin-marshal.list: - * gst/rtpmanager/gstrtpbin.c: (on_new_ssrc), (on_ssrc_collision), - (on_ssrc_validated), (on_bye_ssrc), (on_bye_timeout), (on_timeout), - (create_session), (gst_rtp_bin_class_init), (create_recv_rtp), - (create_send_rtp): - * gst/rtpmanager/gstrtpbin.h: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_init), (gst_rtp_jitter_buffer_dispose), - (gst_jitter_buffer_sink_parse_caps), - (gst_rtp_jitter_buffer_flush_start), - (gst_rtp_jitter_buffer_flush_stop), - (gst_rtp_jitter_buffer_change_state), - (gst_rtp_jitter_buffer_sink_event), (gst_rtp_jitter_buffer_chain), - (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_set_property): - * gst/rtpmanager/gstrtpsession.c: (on_new_ssrc), - (on_ssrc_collision), (on_ssrc_validated), (on_bye_ssrc), - (on_bye_timeout), (on_timeout), (gst_rtp_session_class_init), - (gst_rtp_session_init): - * gst/rtpmanager/gstrtpsession.h: - * gst/rtpmanager/rtpsession.c: (on_bye_ssrc), (session_cleanup): - Use new jitterbuffer code. - Expose some new signals in preparation for handling EOS. - -2007-08-10 05:51:40 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/gstbpwsinc.c: Fix a segfault with more than one channel and don't rebuild the kernel & residue with every ... - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: (bpwsinc_build_kernel): - Fix a segfault with more than one channel and don't rebuild - the kernel & residue with every buffer. - -2007-08-10 05:35:25 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/gstbpwsinc.*: Add support for a bandreject mode and allow specifying the window function that should be used. - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: (gst_bpwsinc_mode_get_type), - (gst_bpwsinc_window_get_type), (gst_bpwsinc_class_init), - (gst_bpwsinc_init), (bpwsinc_build_kernel), (bpwsinc_set_property), - (bpwsinc_get_property): - * gst/filter/gstbpwsinc.h: - Add support for a bandreject mode and allow specifying the window - function that should be used. - * gst/filter/gstlpwsinc.c: - And another small formatting fix. - -2007-08-10 05:20:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/gstbpwsinc.*: Apply the same changes to the bandpass filter: - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init), - (gst_bpwsinc_init), (process_32), (process_64), - (bpwsinc_build_kernel), (bpwsinc_setup), (bpwsinc_get_unit_size), - (bpwsinc_transform), (bpwsinc_set_property), - (bpwsinc_get_property): - * gst/filter/gstbpwsinc.h: - Apply the same changes to the bandpass filter: - - Support double input - - Fix processing for input with >1 channels - - Specify frequency in Hz - - Specify actual filter kernel length - - Use transform instead of transform_ip as we're working - out of place anyway - - Factor out filter kernel generation and update the filter - kernel when the properties are set - Fix bandpass filter kernel generation to actually generate - a bandpass filter by creating a highpass instead of a second - lowpass. - * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init): - Small formatting fix. - -2007-08-10 04:44:43 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/gstlpwsinc.*: Specify the actual filter length instead of a weird 2N+1. Setting the property will round to... - Original commit message from CVS: - * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init), - (gst_lpwsinc_init), (process_32), (process_64), - (lpwsinc_build_kernel), (lpwsinc_set_property), - (lpwsinc_get_property): - * gst/filter/gstlpwsinc.h: - Specify the actual filter length instead of a weird - 2N+1. Setting the property will round to the next odd number. - Also remove now obsolete FIXMEs. - -2007-08-10 04:32:47 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/gstlpwsinc.*: Allow choosing between hamming and blackman window. The blackman window provides a better st... - Original commit message from CVS: - * gst/filter/gstlpwsinc.c: (gst_lpwsinc_window_get_type), - (gst_lpwsinc_class_init), (gst_lpwsinc_init), - (lpwsinc_build_kernel), (lpwsinc_set_property), - (lpwsinc_get_property): - * gst/filter/gstlpwsinc.h: - Allow choosing between hamming and blackman window. The blackman - window provides a better stopband attenuation but a bit slower - rolloff. - -2007-08-10 04:21:39 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/gstlpwsinc.*: Add a highpass mode. - Original commit message from CVS: - * gst/filter/gstlpwsinc.c: (gst_lpwsinc_mode_get_type), - (gst_lpwsinc_class_init), (process_32), (process_64), - (lpwsinc_build_kernel), (lpwsinc_set_property), - (lpwsinc_get_property): - * gst/filter/gstlpwsinc.h: - Add a highpass mode. - -2007-08-10 04:06:53 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/gstlpwsinc.c: Fix processing if the input has more than one channel. - Original commit message from CVS: - * gst/filter/gstlpwsinc.c: (process_32), (process_64), - (lpwsinc_build_kernel): - Fix processing if the input has more than one channel. - -2007-08-09 19:23:33 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/gstbpwsinc.c: "this" is a C++ keyword, use "self" instead. - Original commit message from CVS: - * gst/filter/gstbpwsinc.c: (gst_bpwsinc_dispose), - (gst_bpwsinc_init), (bpwsinc_setup), (bpwsinc_transform_ip), - (bpwsinc_set_property), (bpwsinc_get_property): - "this" is a C++ keyword, use "self" instead. - Add TODOs and FIXMEs and remove two wrong FIXMEs. - * gst/filter/gstlpwsinc.c: - Add FIXMEs and a new TODO. - -2007-08-09 18:08:05 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/gstlpwsinc.*: Add double support, replace "this" with "self" as the former is a C++ keyword. - Original commit message from CVS: - * gst/filter/gstlpwsinc.c: (gst_lpwsinc_dispose), - (gst_lpwsinc_class_init), (gst_lpwsinc_init), (process_32), - (process_64), (lpwsinc_build_kernel), (lpwsinc_setup), - (lpwsinc_get_unit_size), (lpwsinc_transform), - (lpwsinc_set_property), (lpwsinc_get_property): - * gst/filter/gstlpwsinc.h: - Add double support, replace "this" with "self" as the former - is a C++ keyword. - Implement the frequency property in Hz instead of fraction - of sampling frequency. - Remove some unecessary FIXMEs and add some TODOs, add some - required locking and refactor the kernel generation into a - separate function that is also called when the properties - change now. - And use BaseTransform::transform instead of transform_ip - as the convolution is done out of place anyway. Should - be done in place later. - -2007-08-09 17:39:47 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Port the stereo element to GStreamer 0.10. - Original commit message from CVS: - * configure.ac: - * gst/stereo/Makefile.am: - * gst/stereo/gststereo.c: (gst_stereo_base_init), - (gst_stereo_class_init), (gst_stereo_init), - (gst_stereo_transform_ip), (gst_stereo_set_property), - (gst_stereo_get_property): - * gst/stereo/gststereo.h: - Port the stereo element to GStreamer 0.10. - -2007-08-09 11:01:14 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - po/: Added Portuguese (Brazilian) translation. - Original commit message from CVS: - submitted by: Raphael Higino <phhigino@gmail.com> - * po/LINGUAS: - * po/pt_BR.po: - Added Portuguese (Brazilian) translation. - -2007-08-09 11:00:03 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - po/: Updated translations. - Original commit message from CVS: - * po/uk.po: - * po/vi.po: - Updated translations. - -2007-08-08 20:47:33 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - gst/filter/: Use GstAudioFilter as base class and don't leak the memory of the filter kernel and residue. - Original commit message from CVS: - * gst/filter/Makefile.am: - * gst/filter/gstbpwsinc.c: (gst_bpwsinc_dispose), - (gst_bpwsinc_base_init), (gst_bpwsinc_class_init), - (gst_bpwsinc_init), (bpwsinc_setup): - * gst/filter/gstbpwsinc.h: - * gst/filter/gstlpwsinc.c: (gst_lpwsinc_dispose), - (gst_lpwsinc_base_init), (gst_lpwsinc_class_init), - (gst_lpwsinc_init), (lpwsinc_setup): - * gst/filter/gstlpwsinc.h: - Use GstAudioFilter as base class and don't leak the memory - of the filter kernel and residue. - -2007-08-08 15:15:56 +0000 Josep Torre Valles <josep@fluendo.com> - - Add connection speed property to libmms. Fixes #464678. - Original commit message from CVS: - Patch by: Josep Torre Valles <josep@fluendo.com> - * docs/plugins/gst-plugins-bad-plugins.args: - * ext/libmms/gstmms.c: (gst_mms_class_init), (gst_mms_init), - (gst_mms_start), (gst_mms_set_property), (gst_mms_get_property): - * ext/libmms/gstmms.h: - Add connection speed property to libmms. Fixes #464678. - -2007-08-07 15:21:17 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/real/gstrealvideodec.*: Remove some old unused vars. - Original commit message from CVS: - * gst/real/gstrealvideodec.c: (gst_real_video_dec_chain), - (gst_real_video_dec_activate_push), (open_library), - (gst_real_video_dec_init), (gst_real_video_dec_finalize): - * gst/real/gstrealvideodec.h: - Remove some old unused vars. - -2007-08-07 10:51:59 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/real/gstrealaudiodec.c: Small cleanups. - Original commit message from CVS: - * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_setcaps): - Small cleanups. - * gst/real/gstrealvideodec.c: (gst_real_video_dec_chain), - (open_library): - Remove fragment and timestamp correction code from the decoder to make - the caps and buffer contents compatible with matroska/ffdec_rvx0/... - -2007-07-30 12:43:12 +0000 Tim-Philipp Müller <tim@centricular.net> - - po/POTFILES.skip: Add POTFILES.skip with list of source files that aren't disted at the moment but contain translatab... - Original commit message from CVS: - * po/POTFILES.skip: - Add POTFILES.skip with list of source files that aren't disted at the - moment but contain translatable strings. Should hopefully pacify - broken tools and make it clearer that these files are left out - intentionally (#461601 and others). - -2007-07-30 09:52:36 +0000 Ian Munro <imunro@netspace.net.au> - - gst/bayer/gstbayer2rgb.c: Include our own "_stdint.h" instead of <stdint.h> (which may not be available). - Original commit message from CVS: - Patch by: Ian Munro <imunro at netspace net au> - * gst/bayer/gstbayer2rgb.c: - Include our own "_stdint.h" instead of <stdint.h> (which may not - be available). - * gst/speed/gstspeed.h: - Native HP-UX compiler dosn't seem to like enum typedefs before the - actual enum was defined. - * gst/vmnc/vmncdec.c: - Fix wrong usage of GST_ELEMENT_ERROR macro (#461373). - -2007-07-26 16:16:01 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/real/gstrealaudiodec.c: Use the proper context variable when setting the password ! - Original commit message from CVS: - * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_setcaps): - Use the proper context variable when setting the password ! - LOG => WARNING for errors. - Give proper path when opening the codec (needs a '/' at the end). - -2007-07-25 18:10:04 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/real/Makefile.am: And dist the new header file too. - Original commit message from CVS: - * gst/real/Makefile.am: - And dist the new header file too. - -2007-07-25 14:36:25 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/real/gstreal.h: Add missing header file. - Original commit message from CVS: - * gst/real/gstreal.h: - Add missing header file. - -2007-07-25 13:29:04 +0000 Julien Moutte <julien@moutte.net> - - gst/flv/: Handle not linked pads, try to make it reusable, more safety checks. - Original commit message from CVS: - 2007-07-25 Julien MOUTTE <julien@moutte.net> - (gst_flv_demux_chain), (gst_flv_demux_pull_tag), - (gst_flv_demux_change_state), (gst_flv_demux_dispose), - (gst_flv_demux_init): - * gst/flv/gstflvdemux.h: - * gst/flv/gstflvparse.c: (FLV_GET_STRING), - (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), - (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), - (gst_flv_parse_header): - * gst/flv/gstflvparse.h: Handle not linked pads, try to make it - reusable, more safety checks. - -2007-07-25 05:55:00 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/timidity/gsttimidity.*: Don't initialize timidity in plugin_init for similar reason as below. - Original commit message from CVS: - * ext/timidity/gsttimidity.c: (gst_timidity_init), - (gst_timidity_change_state), (plugin_init): - * ext/timidity/gsttimidity.h: - Don't initialize timidity in plugin_init for similar reason as below. - -2007-07-24 15:13:44 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/timidity/gstwildmidi.*: Don't initialize wildmidi in plugin_init as it also setups audio filters which is slow. - Original commit message from CVS: - * ext/timidity/gstwildmidi.c: (wildmidi_open_config), - (gst_wildmidi_init), (gst_wildmidi_change_state), (plugin_init): - * ext/timidity/gstwildmidi.h: - Don't initialize wildmidi in plugin_init as it also setups audio - filters which is slow. - -2007-07-24 14:36:54 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/real/: Improved search algorithm for location of real .so files. - Original commit message from CVS: - reviewed by: Edward Hervey <bilboed@bilboed.com> - * gst/real/gstreal.c: (plugin_init): - * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_setcaps), - (gst_real_audio_dec_finalize), (gst_real_audio_dec_set_property), - (gst_real_audio_dec_get_property), (gst_real_audio_dec_class_init): - * gst/real/gstrealvideodec.c: (open_library), - (gst_real_video_dec_finalize), (gst_real_video_dec_set_property), - (gst_real_video_dec_get_property), (gst_real_video_dec_class_init): - * gst/real/gstrealvideodec.h: - Improved search algorithm for location of real .so files. - Fixes #393461 - -2007-07-24 05:15:41 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Use the new buffer clipping function from gstaudio here and require gst-plugins-base CVS. - Original commit message from CVS: - * configure.ac: - * ext/faad/gstfaad.c: (gst_faad_chain), (gst_faad_change_state): - Use the new buffer clipping function from gstaudio here and - require gst-plugins-base CVS. - -2007-07-23 09:13:42 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - configure.ac: Sync liboil check with plugins-base. - Original commit message from CVS: - * configure.ac: - Sync liboil check with plugins-base. - -2007-07-20 11:37:37 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/equalizer/: Better algorith for the center frequencies. Subtract band filters from input for negative gains. Rewo... - Original commit message from CVS: - * gst/equalizer/gstiirequalizer.c: - (gst_iir_equalizer_band_set_property), - (gst_iir_equalizer_child_proxy_get_child_by_index), - (gst_iir_equalizer_child_proxy_get_children_count), - (gst_iir_equalizer_child_proxy_interface_init), - (gst_iir_equalizer_class_init), (arg_to_scale), (setup_filter), - (gst_iir_equalizer_compute_frequencies): - * gst/equalizer/gstiirequalizer10bands.c: - (gst_iir_equalizer_10bands_class_init): - * gst/equalizer/gstiirequalizer3bands.c: - (gst_iir_equalizer_3bands_class_init): - * gst/equalizer/gstiirequalizernbands.c: - Better algorith for the center frequencies. Subtract band filters from - input for negative gains. Rework the gain mapping. - -2007-07-20 11:03:39 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/dirac/Makefile.am: Also include stdlib here. - Original commit message from CVS: - * ext/dirac/Makefile.am: - Also include stdlib here. - -2007-07-19 15:29:52 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - tests/check/elements/.cvsignore: Fix the buildbot with the cvsignore it wants. - Original commit message from CVS: - * tests/check/elements/.cvsignore: - Fix the buildbot with the cvsignore it wants. - -2007-07-19 15:05:30 +0000 Julien Moutte <julien@moutte.net> - - Adds a first draft of an FLV demuxer. - Original commit message from CVS: - 2007-07-19 Julien MOUTTE <julien@moutte.net> - * configure.ac: - * gst/flv/Makefile.am: - * gst/flv/gstflvdemux.c: (gst_flv_demux_flush), - (gst_flv_demux_cleanup), (gst_flv_demux_chain), - (gst_flv_demux_pull_tag), (gst_flv_demux_pull_header), - (gst_flv_demux_seek_to_prev_keyframe), (gst_flv_demux_loop), - (gst_flv_demux_sink_activate), - (gst_flv_demux_sink_activate_push), - (gst_flv_demux_sink_activate_pull), (gst_flv_demux_sink_event), - (gst_flv_demux_change_state), (gst_flv_demux_dispose), - (gst_flv_demux_base_init), (gst_flv_demux_class_init), - (gst_flv_demux_init), (plugin_init): - * gst/flv/gstflvdemux.h: - * gst/flv/gstflvparse.c: (FLV_GET_BEUI24), (FLV_GET_STRING), - (gst_flv_demux_query_types), (gst_flv_demux_query), - (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), - (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), - (gst_flv_parse_tag_type), (gst_flv_parse_header): - * gst/flv/gstflvparse.h: Adds a first draft of an FLV demuxer. - It does not do seeking yet, it supports pull and push mode so - YES - you can use it to play youtube videos directly from an HTTP uri. - Not so much testing done yet but it parses metadata, reply to - duration queries, etc... - -2007-07-19 09:08:30 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/check/Makefile.am: tests/check/elements/timidity.c (GST_START_TEST, timidity_suite, main): - Original commit message from CVS: - * tests/check/Makefile.am: - * tests/check/elements/timidity.c (GST_START_TEST, timidity_suite, - main): - Add typefind test for midi. - -2007-07-18 20:56:22 +0000 Michael Smith <msmith@xiph.org> - - ext/soundtouch/gstpitch.cc: If we receive a new segment event, don't try to push buffers out in response (without fir... - Original commit message from CVS: - * ext/soundtouch/gstpitch.cc: - If we receive a new segment event, don't try to push buffers out - in response (without first sending it on!). - Instead, flush internal buffers on receiving flush events. - Fixes playback after seeking. - -2007-07-18 08:00:06 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/bayer/gstbayer2rgb.c: Add basic docs. Use glibs mem routines. - Original commit message from CVS: - * gst/bayer/gstbayer2rgb.c: (gst_bayer2rgb_set_caps), - (gst_bayer2rgb_reset): - Add basic docs. Use glibs mem routines. - -2007-07-18 07:51:11 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/multifile/gstmultifilesrc.c: Add example to the docs. Fix buffer-offset-end and add some debug. - Original commit message from CVS: - * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_create): - Add example to the docs. Fix buffer-offset-end and add some debug. - -2007-07-18 07:42:47 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/jack/gstjackaudiosink.c: Add stdlib include here too. - Original commit message from CVS: - * ext/jack/gstjackaudiosink.c: (gst_jack_ring_buffer_open_device), - (gst_jack_ring_buffer_acquire): - Add stdlib include here too. - -2007-07-18 07:35:32 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Add stdlib include (free, atoi, exit). - Original commit message from CVS: - * examples/app/appsrc_ex.c: - * examples/switch/switcher.c: - * ext/neon/gstneonhttpsrc.c: - * ext/timidity/gstwildmidi.c: - * ext/x264/gstx264enc.c: - * gst/mve/mveaudioenc.c: (mve_compress_audio): - * gst/rtpmanager/gstrtpclient.c: - * gst/rtpmanager/gstrtpjitterbuffer.c: - * gst/spectrum/demo-audiotest.c: - * gst/spectrum/demo-osssrc.c: - * sys/dvb/gstdvbsrc.c: - Add stdlib include (free, atoi, exit). - -2007-07-16 09:19:14 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/faad/gstfaad.c: Fix buffer clipping to correctly clip to the segment stop. - Original commit message from CVS: - * ext/faad/gstfaad.c: (clip_outgoing_buffer): - Fix buffer clipping to correctly clip to the segment stop. - -2007-07-14 18:48:25 +0000 Hans de Goede <j.w.r.degoede@hhs.nl> - - gst/modplug/gstmodplug.cc: add several missing supported mime-types to the modplug plugin. - Original commit message from CVS: - Patch by: Hans de Goede <j.w.r.degoede at hhs dot nl> - * gst/modplug/gstmodplug.cc: - add several missing supported mime-types to the modplug plugin. - Fixes #456901. - -2007-07-13 16:46:00 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Remove bogus check for libcheck, since we check for gstreamer-check and it pulls in the required info from there, and... - Original commit message from CVS: - * configure.ac: - * tests/Makefile.am: - Remove bogus check for libcheck, since we check for - gstreamer-check and it pulls in the required info from there, and we - weren't actually _using_ the information for libcheck ourselves - anyway. - -2007-07-12 11:55:10 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - configure.ac: Use pkg-config to locate check. - Original commit message from CVS: - * configure.ac: - Use pkg-config to locate check. - -2007-07-11 23:43:25 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/: Fix build against core CVS. - Original commit message from CVS: - * gst/interleave/deinterleave.c: (gst_deinterleave_process): - * gst/vmnc/vmncdec.c: (vmnc_make_buffer): - Fix build against core CVS. - -2007-07-09 06:05:45 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - REQUIREMENTS: Sync with changes in -ugly. - Original commit message from CVS: - * REQUIREMENTS: - Sync with changes in -ugly. - -2007-07-08 19:06:48 +0000 Tim-Philipp Müller <tim@centricular.net> - - REQUIREMENTS: Add download location of libamrwb. - Original commit message from CVS: - * REQUIREMENTS: - Add download location of libamrwb. - -2007-07-06 21:07:21 +0000 Tim-Philipp Müller <tim@centricular.net> - - docs/plugins/inspect/: Add missing inspect files. Fixes build (#454313). - Original commit message from CVS: - * docs/plugins/inspect/plugin-amrwb.xml: - * docs/plugins/inspect/plugin-equalizer.xml: - * docs/plugins/inspect/plugin-multifile.xml: - * docs/plugins/inspect/plugin-timidity.xml: - * docs/plugins/inspect/plugin-wildmidi.xml: - Add missing inspect files. Fixes build (#454313). - * ext/timidity/gstwildmidi.c: (wildmidi_open_config): - Scream a bit louder when initialisation fails. - * gst-libs/README: - * gst-libs/ext/.cvsignore: - Remove some cruft. - -2007-07-05 22:28:04 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/ivorbis/Makefile.am: Dist header files. Fixes #454078. - Original commit message from CVS: - * ext/ivorbis/Makefile.am: - Dist header files. Fixes #454078. - -2007-07-05 08:45:32 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/Makefile.am: Simplify --extra-dir as gtkdoc scans recursively. - Original commit message from CVS: - * docs/plugins/Makefile.am: - Simplify --extra-dir as gtkdoc scans recursively. - * ext/amrwb/gstamrwbenc.c: - Fix comment start. - -2007-07-04 11:56:55 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c (dvbsrc_details, ARG_DVBSRC_ADAPTER, - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c (dvbsrc_details, ARG_DVBSRC_ADAPTER, - ARG_DVBSRC_FRONTEND, ARG_DVBSRC_DISEQC_SRC, ARG_DVBSRC_FREQUENCY, - ARG_DVBSRC_POLARITY, gst_dvbsrc_class_init, gst_dvbsrc_init, - gst_dvbsrc_set_property, gst_dvbsrc_get_property, - gst_dvbsrc_open_frontend, gst_dvbsrc_open_dvr, read_device, - gst_dvbsrc_create, gst_dvbsrc_set_pes_filters): - * sys/dvb/gstdvbsrc.h (adapter_number, frontend_number): - Removed property "device". Added properties "adapter" and "frontend". - Fixes #453636. - Rename freq property to frequency. - -2007-07-03 17:09:24 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/videosignal/gstvideodetect.c: Fix property descriptions. - Original commit message from CVS: - * gst/videosignal/gstvideodetect.c: (gst_video_detect_class_init): - Fix property descriptions. - -2007-07-03 09:18:22 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Also document AMR-WB elements. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * ext/amrwb/gstamrwbdec.c: - * ext/amrwb/gstamrwbenc.c: - * ext/amrwb/gstamrwbparse.c: - Also document AMR-WB elements. - -2007-07-03 08:16:15 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/: Cleanup the section file so that -unused is empty again (and useful to spot new docs). Add not yet add... - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - Cleanup the section file so that -unused is empty again (and useful to - spot new docs). Add not yet added docs to sgml file. Add more header - to Makefile.am to make them introspectable. - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-spectrum.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-xingheader.xml: - * docs/plugins/inspect/plugin-xvid.xml: - Update the doc blobs. - -2007-07-03 08:01:18 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/multifile/: Add .h files to be able to add it to the docs. - Original commit message from CVS: - * gst/multifile/Makefile.am: - * gst/multifile/gstmultifile.c: - * gst/multifile/gstmultifilesink.c: - * gst/multifile/gstmultifilesink.h: - * gst/multifile/gstmultifilesrc.c: - * gst/multifile/gstmultifilesrc.h: - Add .h files to be able to add it to the docs. - -2007-07-03 07:52:52 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/modplug/gstmodplug.cc: Activate doc section. - Original commit message from CVS: - * gst/modplug/gstmodplug.cc: - Activate doc section. - -2007-07-03 07:41:34 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/timidity/: Fix licence (both are GPL). Add element docs. - Original commit message from CVS: - * ext/timidity/gsttimidity.c: - * ext/timidity/gstwildmidi.c: - * ext/timidity/gstwildmidi.h: - Fix licence (both are GPL). Add element docs. - -2007-07-03 07:30:47 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/musicbrainz/gsttrm.h: Fix _get_type signature. - Original commit message from CVS: - * ext/musicbrainz/gsttrm.h: - Fix _get_type signature. - -2007-07-03 07:16:26 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/replaygain/gstrgvolume.h: Fix GObject macros. - Original commit message from CVS: - * gst/replaygain/gstrgvolume.h: - Fix GObject macros. - -2007-06-29 15:23:34 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/dc1394/gstdc1394.c: Make a bunch of functions static, and move variable declarations to the start of blocks to av... - Original commit message from CVS: - * ext/dc1394/gstdc1394.c: (gst_dc1394_src_fixate), - (gst_dc1394_create), (gst_dc1394_caps_set_format_vmode_caps), - (gst_dc1394_set_caps_framesize_range), - (gst_dc1394_caps_set_framerate_list), (gst_dc1394_get_cam_caps), - (gst_dc1394_framerate_frac_to_const), - (gst_dc1394_open_cam_with_best_caps): - Make a bunch of functions static, and move variable declarations - to the start of blocks to avoid problems on older gcc. - Make sure to unset value types. - -2007-06-29 14:48:59 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/dc1394/gstdc1394.c: The correct fourcc for the 4:1:1 packed format is 'IYU1'. - Original commit message from CVS: - * ext/dc1394/gstdc1394.c: (gst_dc1394_set_caps_color): - The correct fourcc for the 4:1:1 packed format is 'IYU1'. - With CVS of ffmpegcolorspace from plugins-base, I can now - get 30 fps from the iSight. - -2007-06-29 14:11:24 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/dc1394/gstdc1394.c: Change a g_print to a GST_DEBUG message. - Original commit message from CVS: - * ext/dc1394/gstdc1394.c: (gst_dc1394_set_caps_color): - Change a g_print to a GST_DEBUG message. +2022-03-03 22:38:56 +0800 He Junyan <junyan.he@intel.com> -2007-06-29 13:09:19 +0000 Jan Schmidt <thaytan@mad.scientist.com> + * gst/videoparsers/gstav1parse.c: + av1parse: Use the intersected caps to decide the alignment. + When we negotiate with downstream, We should use the intersected + caps of input and output to decide the alignment and stream format. + The current code just uses the input caps which may lack the stream + format. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1837> - * ChangeLog: - Oops, add an attribution for Antoine Tremblay too - the original patch author. - Original commit message from CVS: - Oops, add an attribution for Antoine Tremblay too - the original patch author. - -2007-06-29 13:03:27 +0000 Eric Jonas <jonas@mit.edu> - - Commit new dc1394src element. - Original commit message from CVS: - * configure.ac: - * ext/Makefile.am: - * ext/dc1394/Makefile.am: - * ext/dc1394/gstdc1394.c: (gst_dc1394_base_init), - (gst_dc1394_class_init), (gst_dc1394_init), - (gst_dc1394_src_fixate), (gst_dc1394_set_property), - (gst_dc1394_get_property), (gst_dc1394_getcaps), - (gst_dc1394_setcaps), (gst_dc1394_get_times), (gst_dc1394_create), - (gst_dc1394_parse_caps), (gst_dc1394_change_state), - (gst_dc1394_caps_set_format_vmode_caps), - (gst_dc1394_set_caps_color), (gst_dc1394_set_caps_framesize), - (gst_dc1394_set_caps_framesize_range), - (gst_dc1394_caps_set_framerate_list), - (gst_dc1394_framerate_const_to_frac), - (gst_dc1394_get_all_dc1394_caps), (gst_dc1394_get_cam_caps), - (gst_dc1394_framerate_frac_to_const), - (gst_dc1394_open_cam_with_best_caps), - (gst_dc1394_change_camera_transmission), (plugin_init): - * ext/dc1394/gstdc1394.h: - Commit new dc1394src element. - Patch By: Eric Jonas < jonas at mit dot edu > - Close: #387251 - -2007-06-28 10:40:16 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/videosignal/gstvideodetect.c: Register new property as well. - Original commit message from CVS: - * gst/videosignal/gstvideodetect.c: (gst_video_detect_class_init): - Register new property as well. - -2007-06-28 09:36:20 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/videosignal/gstvideodetect.*: Add property to adjust the center, sensitivity is now the distance from this center. - Original commit message from CVS: - * gst/videosignal/gstvideodetect.c: (gst_video_detect_420), - (gst_video_detect_set_property), (gst_video_detect_get_property): - * gst/videosignal/gstvideodetect.h: - Add property to adjust the center, sensitivity is now the distance from - this center. - -2007-06-27 15:33:26 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/videosignal/: Add left and bottom offset properties to control the position of the pattern. - Original commit message from CVS: - * gst/videosignal/gstvideodetect.c: (gst_video_detect_420), - (gst_video_detect_set_property), (gst_video_detect_get_property), - (gst_video_detect_class_init): - * gst/videosignal/gstvideodetect.h: - * gst/videosignal/gstvideomark.c: (gst_video_mark_draw_box), - (gst_video_mark_420), (gst_video_mark_set_property), - (gst_video_mark_get_property), (gst_video_mark_class_init): - * gst/videosignal/gstvideomark.h: - Add left and bottom offset properties to control the position of the - pattern. - -2007-06-25 12:47:43 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - docs/plugins/: Update docs with caps info. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-gdp.xml: - * docs/plugins/inspect/plugin-glimagesink.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-spectrum.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-xingheader.xml: - * docs/plugins/inspect/plugin-xvid.xml: - Update docs with caps info. - -2007-06-25 11:02:21 +0000 Tim-Philipp Müller <tim@centricular.net> - - gconf/: Remove dysfunctional directory (this stuff is in -good). - Original commit message from CVS: - * gconf/.cvsignore: - * gconf/Makefile.am: - * gconf/gstreamer.schemas.in: - Remove dysfunctional directory (this stuff is in -good). - * ext/sndfile/gstsf.c: (plugin_init): - * sys/dvb/gstdvbsrc.c: (plugin_init): - Add i18n bindtextdomain stuff. - * gst/nuvdemux/gstnuvdemux.c: (gst_nuv_demux_class_init), - (plugin_init): - Post an error message when returning GST_FLOW_ERROR; minor cleanups. - * po/POTFILES.in: - Add more source files with translatable strings (fixes #450605). - -2007-06-23 11:24:44 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - po/: Added Chinese (simplified) translation. - Original commit message from CVS: - Contributed by: Wenzheng Hu <db_lobster@163.com> - * po/LINGUAS: - * po/zh_CN.po: - Added Chinese (simplified) translation. - -2007-06-22 20:23:18 +0000 Jens Granseuer <jensgr@gmx.net> - - gst/: Build fixes for gcc-2.9x (no mid-block variable declarations etc.). - Original commit message from CVS: - Patch by: Jens Granseuer <jensgr at gmx net> - * gst/equalizer/gstiirequalizer.c: - * gst/equalizer/gstiirequalizer10bands.c: - * gst/equalizer/gstiirequalizer3bands.c: - * gst/equalizer/gstiirequalizernbands.c: - * gst/rtpmanager/async_jitter_queue.c: - (async_jitter_queue_push_sorted): - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_chain): - * gst/switch/gstswitch.c: (gst_switch_chain): - Build fixes for gcc-2.9x (no mid-block variable declarations etc.). - Fixes #450185. +2022-03-03 21:30:00 +0800 He Junyan <junyan.he@intel.com> -2007-06-22 15:30:00 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> + * gst/ivfparse/gstivfparse.c: + ivfparse: Set the alignment to tu for AV1 stream. + Just do the same as other demux. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1837> - * ChangeLog: - * examples/switch/switcher.c: - * gst/switch/gstswitch.c: - * gst/switch/gstswitch.h: - examples/switch/switcher.c (my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c (gst_... - Original commit message from CVS: - * examples/switch/switcher.c (my_bus_callback, switch_timer, - last_message_received, main): - * gst/switch/gstswitch.c (gst_switch_release_pad, - gst_switch_request_new_pad, gst_switch_chain, gst_switch_event, - gst_switch_set_property, gst_switch_get_property, - gst_switch_get_linked_pad, gst_switch_getcaps, - gst_switch_bufferalloc, gst_switch_dispose, gst_switch_init): - * gst/switch/gstswitch.h (switch_mutex, GST_SWITCH_LOCK, - GST_SWITCH_UNLOCK): - Add an extra lock to protect against certain variables instead of - using the object lock. Fix case where caps are different in the - sink pads causes deadlock. Update example to use different caps - on each sink pad. - -2007-06-22 14:27:40 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - MAINTAINERS: Updating all the maintainers files - Original commit message from CVS: - * MAINTAINERS: - Updating all the maintainers files - -2007-06-22 10:46:33 +0000 Edward Hervey <bilboed@bilboed.com> - - Fix leaks. - Original commit message from CVS: - * ext/amrwb/gstamrwbdec.c: (gst_amrwbdec_init): - * ext/amrwb/gstamrwbenc.c: (gst_amrwbenc_init): - * ext/amrwb/gstamrwbparse.c: (gst_amrwbparse_init): - * ext/audioresample/gstaudioresample.c: - * ext/bz2/gstbz2dec.c: (gst_bz2dec_init): - * ext/bz2/gstbz2enc.c: (gst_bz2enc_init): - * ext/divx/gstdivxdec.c: (gst_divxdec_init): - * ext/divx/gstdivxenc.c: (gst_divxenc_init): - * ext/faac/gstfaac.c: (gst_faac_init): - * ext/gsm/gstgsmdec.c: (gst_gsmdec_init): - * ext/gsm/gstgsmenc.c: (gst_gsmenc_init): - * ext/hermes/gsthermescolorspace.c: (gst_hermes_colorspace_init): - * ext/lcs/gstcolorspace.c: (gst_colorspace_init): - * ext/libfame/gstlibfame.c: (gst_fameenc_init): - * ext/snapshot/gstsnapshot.c: (gst_snapshot_init): - * ext/spc/gstspc.c: (gst_spc_dec_init): - * ext/swfdec/gstswfdec.c: (gst_swfdec_init): - * ext/xvid/gstxvidenc.c: (gst_xvidenc_init): - * gst/cdxaparse/gstcdxaparse.c: (gst_cdxa_parse_init): - * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_init): - * gst/chart/gstchart.c: (gst_chart_init): - * gst/colorspace/gstcolorspace.c: (gst_colorspace_init): - * gst/festival/gstfestival.c: (gst_festival_init): - * gst/freeze/gstfreeze.c: (gst_freeze_init): - * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_request_new_pad): - * gst/mpeg1sys/gstmpeg1systemencode.c: (gst_system_encode_init): - * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init): - * gst/nsf/gstnsf.c: (gst_nsfdec_init): - * gst/overlay/gstoverlay.c: (gst_overlay_init): - * gst/passthrough/gstpassthrough.c: (passthrough_init): - * gst/playondemand/gstplayondemand.c: (play_on_demand_init): - * gst/smooth/gstsmooth.c: (gst_smooth_init): - * gst/smoothwave/gstsmoothwave.c: (gst_smoothwave_init): - * gst/speed/gstspeed.c: (speed_init): - * gst/vbidec/gstvbidec.c: (gst_vbidec_init): - * gst/videodrop/gstvideodrop.c: (gst_videodrop_init): - * sys/dxr3/dxr3spusink.c: (dxr3spusink_init): - * sys/dxr3/dxr3videosink.c: (dxr3videosink_init): - * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_init): - Fix leaks. - -2007-06-21 18:41:17 +0000 Tim-Philipp Müller <tim@centricular.net> - - Re-enable VCD source and fix up release notes. - Original commit message from CVS: - * RELEASE: - * sys/Makefile.am: - Re-enable VCD source and fix up release notes. - -2007-06-20 10:15:00 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/equalizer/gstiirequalizer.c: Document parameter mapping. - Original commit message from CVS: - * gst/equalizer/gstiirequalizer.c: - Document parameter mapping. - -2007-06-20 08:56:17 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/gstspectrum.c: Fix leaking buffers. - Original commit message from CVS: - * gst/spectrum/gstspectrum.c: (gst_spectrum_event), - (gst_spectrum_transform_ip): - Fix leaking buffers. - * tests/check/Makefile.am: - * tests/check/elements/spectrum.c: (setup_spectrum), - (cleanup_spectrum), (GST_START_TEST), (spectrum_suite), (main): - Add simple test for spectrum element. - -2007-06-20 08:42:17 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/amrwb/: Add newsegment and discont handling. Some code cleanups. Don't leak the adapter, unref it in a new finali... - Original commit message from CVS: - * ext/amrwb/gstamrwbdec.c: (gst_amrwbdec_base_init), - (gst_amrwbdec_class_init), (gst_amrwbdec_finalize), - (gst_amrwbdec_event), (gst_amrwbdec_chain), - (gst_amrwbdec_state_change): - * ext/amrwb/gstamrwbdec.h: - * ext/amrwb/gstamrwbparse.c: (gst_amrwbparse_base_init), - (gst_amrwbparse_pull_header), (gst_amrwbparse_loop): - Add newsegment and discont handling. Some code cleanups. Don't leak - the adapter, unref it in a new finalize method instead. Sync the - parser with the amr-nb changes. - -2007-06-19 10:45:29 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Back to CVS. - Original commit message from CVS: - * configure.ac: - Back to CVS. - * gst-plugins-bad.doap: - Add 0.10.5 to the doap file. +2022-03-03 17:51:11 +0800 He Junyan <junyan.he@intel.com> -=== release 0.10.5 === + * gst/videoparsers/gstav1parse.c: + av1parse: Only detect the stream format when input alignment is tu. + The demux now outputs the AV1 stream in "tu" alignment, so we do not need + to detect the input alignment. But the annex b stream format is not recognized + by the demux, we still need to detect that stream format for the first input. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1837> -2007-06-19 10:32:38 +0000 Jan Schmidt <thaytan@mad.scientist.com> +2022-03-02 16:22:25 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-glimagesink.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-qtdemux.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spectrum.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-swfdec.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-videosignal.xml: - * docs/plugins/inspect/plugin-xingheader.xml: - * docs/plugins/inspect/plugin-xvid.xml: - Release 0.10.5 - Original commit message from CVS: - Release 0.10.5 - -2007-06-19 09:37:46 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - * po/af.po: - * po/az.po: - * po/cs.po: - * po/da.po: - * po/en_GB.po: - * po/hu.po: - * po/it.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - Update .po files - Original commit message from CVS: - Update .po files - -2007-06-15 09:27:52 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - win32/vs6/: Convert line endings to CRLF and mark as binary files. - Original commit message from CVS: - * win32/vs6/gst_plugins_bad.dsw: - * win32/vs6/libdshowsrcwrapper.dsp: - * win32/vs6/libgstdshow.dsp: - * win32/vs6/libgstmpegvideoparse.dsp: - * win32/vs6/libgstneon.dsp: - Convert line endings to CRLF and mark as binary files. - -2007-06-13 11:48:07 +0000 Wim Taymans <wim.taymans@gmail.com> - - sys/Makefile.am: Disable VCD build because we're frozen.. - Original commit message from CVS: - * sys/Makefile.am: - Disable VCD build because we're frozen.. - -2007-06-13 11:37:36 +0000 Wim Taymans <wim.taymans@gmail.com> - - Port VCD element. - Original commit message from CVS: - * configure.ac: - * sys/Makefile.am: - * sys/vcd/Makefile.am: - * sys/vcd/vcdsrc.c: (gst_vcdsrc_setup_interfaces), - (gst_vcdsrc_base_init), (gst_vcdsrc_class_init), (gst_vcdsrc_init), - (gst_vcdsrc_msf), (gst_vcdsrc_recalculate), - (gst_vcdsrc_set_property), (gst_vcdsrc_get_property), - (gst_vcdsrc_create), (gst_vcdsrc_start), (gst_vcdsrc_stop), - (gst_vcdsrc_uri_set_uri): - * sys/vcd/vcdsrc.h: - Port VCD element. - -2007-06-12 21:28:12 +0000 Sébastien Moutte <sebastien@moutte.net> - - win32/MANIFEST: Add megvideoparse, libdshow and dshowsrcwrapper to win32 - Original commit message from CVS: - * win32/MANIFEST: - Add megvideoparse, libdshow and dshowsrcwrapper to win32 - MANIFEST. - * win32/vs6/gst_plugins_bad.dsw: - Remove qtdemux, directdraw, directsound and waveform project files - from the workspace as they have been moved to -good. - -2007-06-12 20:22:23 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - po/POTFILES.in: Remove qtdemux from the translation list. - Original commit message from CVS: - * po/POTFILES.in: - Remove qtdemux from the translation list. - -2007-06-12 20:15:14 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Move videocrop and osxvideo to -good. - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-osxvideo.xml: - * docs/plugins/inspect/plugin-videocrop.xml: - * gst-plugins-bad.spec.in: - * gst/videocrop/Makefile.am: - * gst/videocrop/gstvideocrop.c: - * gst/videocrop/gstvideocrop.h: - * gst/videocrop/videocrop.vcproj: - * sys/Makefile.am: - * sys/osxvideo/Makefile.am: - * sys/osxvideo/cocoawindow.h: - * sys/osxvideo/cocoawindow.m: - * sys/osxvideo/osxvideosink.h: - * sys/osxvideo/osxvideosink.m: - * tests/check/Makefile.am: - * tests/check/elements/videocrop.c: - * tests/icles/Makefile.am: - * tests/icles/videocrop-test.c: - Move videocrop and osxvideo to -good. - -2007-06-12 19:36:11 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Move qtdemux to -good. - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/qtdemux/Makefile.am: - * gst/qtdemux/gstrtpxqtdepay.c: - * gst/qtdemux/gstrtpxqtdepay.h: - * gst/qtdemux/qtdemux.c: - * gst/qtdemux/qtdemux.h: - * gst/qtdemux/qtdemux.vcproj: - * gst/qtdemux/qtdemux_dump.c: - * gst/qtdemux/qtdemux_dump.h: - * gst/qtdemux/qtdemux_fourcc.h: - * gst/qtdemux/qtdemux_types.c: - * gst/qtdemux/qtdemux_types.h: - * gst/qtdemux/qtpalette.h: - * gst/qtdemux/quicktime.c: - * win32/MANIFEST: - * win32/vs6/libgstqtdemux.dsp: - Move qtdemux to -good. - * gst-plugins-bad.spec.in: - Update spec file to reflect wavpack & qtdemux moving to -good. - -2007-06-12 18:53:03 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Remove the waveform plugin now that it is in -good. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-waveform.xml: - * sys/waveform/gstwaveformplugin.c: - * sys/waveform/gstwaveformsink.c: - * sys/waveform/gstwaveformsink.h: - * win32/MANIFEST: - * win32/vs6/libgstwaveform.dsp: - Remove the waveform plugin now that it is in -good. - -2007-06-08 20:20:34 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - Move wavpack to good. - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-wavpack.xml: - * ext/Makefile.am: - * ext/wavpack/Makefile.am: - * ext/wavpack/gstwavpack.c: - * ext/wavpack/gstwavpackcommon.c: - * ext/wavpack/gstwavpackcommon.h: - * ext/wavpack/gstwavpackdec.c: - * ext/wavpack/gstwavpackdec.h: - * ext/wavpack/gstwavpackenc.c: - * ext/wavpack/gstwavpackenc.h: - * ext/wavpack/gstwavpackparse.c: - * ext/wavpack/gstwavpackparse.h: - * ext/wavpack/gstwavpackstreamreader.c: - * ext/wavpack/gstwavpackstreamreader.h: - * ext/wavpack/md5.c: - * ext/wavpack/md5.h: - * tests/check/Makefile.am: - * tests/check/elements/wavpackdec.c: - * tests/check/elements/wavpackenc.c: - * tests/check/elements/wavpackparse.c: - Move wavpack to good. - -2007-06-08 17:36:46 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Remove DirectDraw & DirectSound plugins, as they've moved to Good - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-directdraw.xml: - * docs/plugins/inspect/plugin-directsound.xml: - * sys/Makefile.am: - * sys/directdraw/Makefile.am: - * sys/directdraw/gstdirectdrawplugin.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - * sys/directsound/Makefile.am: - * sys/directsound/gstdirectsoundplugin.c: - * sys/directsound/gstdirectsoundsink.c: - * sys/directsound/gstdirectsoundsink.h: - * win32/MANIFEST: - * win32/gst.sln: - * win32/vs6/libgstdirectdraw.dsp: - * win32/vs6/libgstdirectsound.dsp: - * win32/vs7/libgstdirectdraw.vcproj: - * win32/vs7/libgstdirectsound.vcproj: - * win32/vs8/libgstdirectdraw.vcproj: - * win32/vs8/libgstdirectsound.vcproj: - Remove DirectDraw & DirectSound plugins, as they've moved to Good - -2007-06-08 16:49:41 +0000 Tim-Philipp Müller <tim@centricular.net> - - When driving the pipeline, also post an error when we get a not-linked flow return from downstream. - Original commit message from CVS: - * ext/timidity/gsttimidity.c: (gst_timidity_loop): - * ext/timidity/gstwildmidi.c: (gst_wildmidi_loop): - * gst/tta/gstttaparse.c: (gst_tta_parse_loop): - When driving the pipeline, also post an error when we get a - not-linked flow return from downstream. - -2007-06-08 16:31:15 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Rename the keep-aspect-ratio property to force-aspect-ratio to make it consistent with xvimagesink and ximagesink. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.args: - * sys/directdraw/gstdirectdrawsink.c: - (gst_directdraw_sink_class_init): - Rename the keep-aspect-ratio property to force-aspect-ratio to make - it consistent with xvimagesink and ximagesink. - -2007-06-08 08:12:43 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/icles/videocrop-test.c: Default to xvimagesink instead of autovideosink while autovideosink/ghostpads/whatever ... - Original commit message from CVS: - * tests/icles/videocrop-test.c: (main): - Default to xvimagesink instead of autovideosink while - autovideosink/ghostpads/whatever don't handle the way we use it in - the way we expect it to. - -2007-06-06 18:30:22 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Bump requirements to released versions of core and -base, and remove special-casing for equalizer and r... - Original commit message from CVS: - * configure.ac: - Bump requirements to released versions of core and -base, and remove - special-casing for equalizer and rtpmanager as it's not needed any - longer. - -2007-06-06 15:58:31 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - sys/glsink/glimagesink.c: Sprinkle in some XSync calls to avoid raciness with broken drivers (ATI) when re-using a si... - Original commit message from CVS: - * sys/glsink/glimagesink.c: (gst_glimage_sink_stop), - (gst_glimage_sink_create_window), (gst_glimage_sink_init_display): - Sprinkle in some XSync calls to avoid raciness with broken - drivers (ATI) when re-using a single glimagesink. - -2007-06-06 11:03:24 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/mpegvideoparse/: Fix some silly bugs with calculating the guard sizes. - Original commit message from CVS: - * gst/mpegvideoparse/mpegpacketiser.c: - (mpeg_util_parse_extension_packet), (mpeg_util_parse_sequence_hdr), - (mpeg_util_parse_picture_hdr): - * gst/mpegvideoparse/mpegvideoparse.c: - (mpegvideoparse_handle_sequence), (mpegvideoparse_drain_avail): - Fix some silly bugs with calculating the guard sizes. - Properly compare the old sequence header structure with the new one. - Don't error out on an invalid sequence - just ignore it. - -2007-06-06 09:11:31 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/real/gstrealvideodec.c: Printf fix in debug statement; also print the right number there. - Original commit message from CVS: - * gst/real/gstrealvideodec.c: (gst_real_video_dec_decode): - Printf fix in debug statement; also print the right number there. - -2007-06-06 08:06:44 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/sdl/: Add GST_CFLAGS, which apparently somehow fixes the build somewhere (#444499); initialise variable to avoid ... - Original commit message from CVS: - * ext/sdl/Makefile.am: - * ext/sdl/sdlvideosink.c: (gst_sdlv_process_events): - Add GST_CFLAGS, which apparently somehow fixes the build somewhere - (#444499); initialise variable to avoid false compiler warning. - -2007-06-05 14:17:36 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - fix up spec file - Original commit message from CVS: - fix up spec file - -2007-06-01 14:36:04 +0000 Wim Taymans <wim.taymans@gmail.com> - - Add plugin to generate a pattern detectable by videodetect. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-videosignal.xml: - * gst/videosignal/Makefile.am: - * gst/videosignal/gstvideomark.c: (gst_video_mark_set_caps), - (gst_video_mark_draw_box), (gst_video_mark_420), - (gst_video_mark_transform_ip), (gst_video_mark_set_property), - (gst_video_mark_get_property), (gst_video_mark_base_init), - (gst_video_mark_class_init), (gst_video_mark_init), - (gst_video_mark_get_type): - * gst/videosignal/gstvideomark.h: - * gst/videosignal/gstvideosignal.c: (plugin_init): - Add plugin to generate a pattern detectable by videodetect. - -2007-06-01 11:59:52 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/neon/gstneonhttpsrc.c: Don't leak buffer when returning an error. - Original commit message from CVS: - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_create): - Don't leak buffer when returning an error. - -2007-06-01 09:58:01 +0000 René Stadler <mail@renestadler.de> - - ext/neon/gstneonhttpsrc.*: Deprecated "uri" property. Clean up property descriptions. - Original commit message from CVS: - Patch by René Stadler <mail at renestadler dot de>: - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_class_init), - (gst_neonhttp_src_init), (gst_neonhttp_src_dispose), - (gst_neonhttp_src_set_property), (gst_neonhttp_src_get_property), - (gst_neonhttp_src_start), (gst_neonhttp_src_do_seek), - (gst_neonhttp_src_set_location), - (gst_neonhttp_src_send_request_and_redirect), - (gst_neonhttp_src_uri_get_uri), (gst_neonhttp_src_uri_set_uri): - * ext/neon/gstneonhttpsrc.h: - Deprecated "uri" property. Clean up property descriptions. - Change default User-Agent to the slightly more descriptive - "GStreamer neonhttpsrc". - Various other small cleanups, mostly property related. - -2007-05-31 19:12:37 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/libmms/gstmms.h: No reason to use gpointers instead of typed pointes here as far as I can see. - Original commit message from CVS: - * ext/libmms/gstmms.h: - No reason to use gpointers instead of typed pointes here as far as I - can see. - * ext/mythtv/gstmythtvsrc.c: - * ext/neon/gstneonhttpsrc.c: - * gst/switch/gstswitch.c: - Don't use gtk-doc magic markers for things that aren't meant to be - parsed by gtk-doc. Makes gtk-doc complain a bit less. - -2007-05-30 14:52:07 +0000 Wim Taymans <wim.taymans@gmail.com> - - Added videosignal plugin with two plugins to analyse video frames. - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-videosignal.xml: - * gst/videosignal/Makefile.am: - * gst/videosignal/gstvideoanalyse.c: (gst_video_analyse_set_caps), - (gst_video_analyse_post_message), (gst_video_analyse_420), - (gst_video_analyse_transform_ip), (gst_video_analyse_set_property), - (gst_video_analyse_get_property), (gst_video_analyse_base_init), - (gst_video_analyse_class_init), (gst_video_analyse_init), - (gst_video_analyse_get_type): - * gst/videosignal/gstvideoanalyse.h: - * gst/videosignal/gstvideodetect.c: (gst_video_detect_set_caps), - (gst_video_detect_post_message), - (gst_video_detect_calc_brightness), (gst_video_detect_420), - (gst_video_detect_transform_ip), (gst_video_detect_set_property), - (gst_video_detect_get_property), (gst_video_detect_base_init), - (gst_video_detect_class_init), (gst_video_detect_init), - (gst_video_detect_get_type): - * gst/videosignal/gstvideodetect.h: - * gst/videosignal/gstvideosignal.c: (plugin_init): - * gst/videosignal/gstvideosignal.h: - Added videosignal plugin with two plugins to analyse video frames. - Added videoanalyse to report about brightness and variance in video - frames. - Added videodetect to detect predefined patterns in a video signal. - -2007-05-30 09:30:52 +0000 Tim-Philipp Müller <tim@centricular.net> - - docs/plugins/gst-plugins-bad-plugins.*: More updates. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - More updates. - -2007-05-30 09:08:24 +0000 Tim-Philipp Müller <tim@centricular.net> - - docs/plugins/: Updates; update inspect info for rtpmanager => gstrtpmanager rename, hopefully that makes the build bo... - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-gstrtpmanager.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-rtpmanager.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-swfdec.xml: - Updates; update inspect info for rtpmanager => gstrtpmanager rename, - hopefully that makes the build bots happy again. - -2007-05-28 16:37:47 +0000 Wim Taymans <wim.taymans@gmail.com> - - Rename elements to avoid conflict with farsight elements with the same name. Fixes #430664. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/rtpmanager/gstrtpbin.c: (create_session), (create_stream), - (gst_rtp_bin_class_init), (create_recv_rtp), (create_recv_rtcp), - (create_send_rtp), (create_rtcp), (gst_rtp_bin_request_new_pad): - * gst/rtpmanager/gstrtpclient.c: (create_stream), - (gst_rtp_client_request_new_pad): - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_clear_pt_map), (gst_rtp_jitter_buffer_loop): - * gst/rtpmanager/gstrtpmanager.c: (plugin_init): - * gst/rtpmanager/gstrtpptdemux.c: - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), - (gst_rtp_session_request_new_pad): - * gst/rtpmanager/gstrtpssrcdemux.c: - Rename elements to avoid conflict with farsight elements with the same - name. Fixes #430664. - -2007-05-24 08:35:23 +0000 Vincent Torri <vtorri@univ-evry.fr> - - sys/directdraw/gstdirectdrawsink.*: Fix more warnings when compiling with MingW (#439914). - Original commit message from CVS: - Patch by: Vincent Torri <vtorri at univ-evry fr> - * sys/directdraw/gstdirectdrawsink.c: - (gst_directdraw_sink_buffer_alloc), - (gst_directdraw_sink_show_frame), - (gst_directdraw_sink_check_primary_surface), - (gst_directdraw_sink_check_offscreen_surface), - (EnumModesCallback2), (gst_directdraw_sink_get_ddrawcaps), - (gst_directdraw_sink_surface_create): - * sys/directdraw/gstdirectdrawsink.h: - Fix more warnings when compiling with MingW (#439914). - -2007-05-23 22:44:12 +0000 Sébastien Moutte <sebastien@moutte.net> - - docs/plugins/gst-plugins-bad-plugins.args: Remove directsoundsink property doc as this sink use the mixer interface now. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.args: - Remove directsoundsink property doc as this sink use the mixer - interface now. - * docs/plugins/gst-plugins-bad-plugins.interfaces: - Add interfaces implemented by Windows sinks. - * sys/directsound/gstdirectsoundsink.c: - * sys/directsound/gstdirectsoundsink.h: - Remove directsoundsink property and implement the mixer interface. - * win32/vs6/gst_plugins_bad.dsw: - * win32/vs6/libgstdirectsound.dsp: - Update project files. - * gst-libs/gst/dshow/gstdshow.cpp: - * gst-libs/gst/dshow/gstdshow.h: - * gst-libs/gst/dshow/gstdshowfakesink.cpp: - * gst-libs/gst/dshow/gstdshowfakesink.h: - * gst-libs/gst/dshow/gstdshowfakesrc.cpp: - * gst-libs/gst/dshow/gstdshowfakesrc.h: - * gst-libs/gst/dshow/gstdshowinterface.cpp: - * gst-libs/gst/dshow/gstdshowinterface.h: - * win32/common/libgstdshow.def: - * win32/vs6/libgstdshow.dsp: - Add a new gst library which allow to create internal Direct Show - graph (pipelines) to wrap Windows sources, decoders or encoders. - It includes a DirectShow fake source and sink and utility functions. - * sys/dshowsrcwrapper/gstdshowaudiosrc.c: - * sys/dshowsrcwrapper/gstdshowaudiosrc.h: - * sys/dshowsrcwrapper/gstdshowsrcwrapper.c: - * sys/dshowsrcwrapper/gstdshowsrcwrapper.h: - * sys/dshowsrcwrapper/gstdshowvideosrc.c: - * sys/dshowsrcwrapper/gstdshowvideosrc.h: - * win32/vs6/libdshowsrcwrapper.dsp: - Add a new plugin to wrap DirectShow sources on Windows. - It gets data from any webcam, dv cam, micro. We could add - tv tunner card later. - -2007-05-23 18:00:15 +0000 René Stadler <mail@renestadler.de> - - ext/sdl/sdlvideosink.c: Separate the authors by newlines instead of nothing. Fixes #440774. - Original commit message from CVS: - Patch by René Stadler <mail at renestadler dot de>: - * ext/sdl/sdlvideosink.c: - Separate the authors by newlines instead of nothing. Fixes #440774. - -2007-05-23 16:14:13 +0000 Wim Taymans <wim.taymans@gmail.com> - - docs/plugins/inspect/plugin-rtpmanager.xml: Add doc xml file. - Original commit message from CVS: - * docs/plugins/inspect/plugin-rtpmanager.xml: - Add doc xml file. - -2007-05-23 13:08:52 +0000 Wim Taymans <wim.taymans@gmail.com> - - Document stuff. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init): - * gst/rtpmanager/gstrtpbin.h: - * gst/rtpmanager/gstrtpclient.c: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_class_init), - (gst_rtp_jitter_buffer_clear_pt_map), (gst_rtp_jitter_buffer_loop): - * gst/rtpmanager/gstrtpjitterbuffer.h: - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_class_init), - (gst_rtp_pt_demux_clear_pt_map): - * gst/rtpmanager/gstrtpptdemux.h: - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), - (rtcp_thread), (gst_rtp_session_clear_pt_map): - * gst/rtpmanager/gstrtpsession.h: - * gst/rtpmanager/gstrtpssrcdemux.c: - (gst_rtp_ssrc_demux_class_init): - Document stuff. - Add clear-pt-map action signal where needed. - -2007-05-22 11:14:13 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - configure.ac: Depend on gstreamer-0.10.12.1. gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, _Gs... - Original commit message from CVS: - * configure.ac: - Depend on gstreamer-0.10.12.1. - * gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, - _GstIirEqualizerBand, object, _GstIirEqualizerBandClass, - parent_class, gst_iir_equalizer_band_set_property, - gst_iir_equalizer_band_class_init, gst_iir_equalizer_band_get_type, - gst_iir_equalizer_child_proxy_get_child_by_index, - gst_iir_equalizer_child_proxy_get_children_count, - gst_iir_equalizer_child_proxy_interface_init, setup_filter, - gst_iir_equalizer_compute_frequencies, - gst_iir_equalizer_set_property, gst_iir_equalizer_get_property, - plugin_init): - * gst/equalizer/gstiirequalizer.h (audiofilter): - * gst/equalizer/gstiirequalizernbands.c (ARG_NUM_BANDS, - gst_iir_equalizer_nbands_base_init, gst_iir_equalizer_nbands_init, - gst_iir_equalizer_nbands_set_property): - Use new locking macros. - * gst/filter/gstbpwsinc.c (bpwsinc_set_caps): - Add fixme. - * gst/spectrum/gstspectrum.c (SPECTRUM_WINDOW_BASE, - SPECTRUM_WINDOW_LEN, gst_spectrum_init, gst_spectrum_set_property, - gst_spectrum_event, gst_spectrum_transform_ip): - Use new locking macros. Turn two fixed values into #defines. - -2007-05-22 11:03:30 +0000 Edward Hervey <bilboed@bilboed.com> - - docs/plugins/Makefile.am: Also look for .m (objectivec) files. - Original commit message from CVS: - * docs/plugins/Makefile.am: - Also look for .m (objectivec) files. - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * sys/osxvideo/osxvideosink.m: - Add documentation for element and properties. - -2007-05-21 14:01:16 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ChangeLog: ChangeLog surgery. gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, _GstIirEqualizerBa... - Original commit message from CVS: - * ChangeLog: - ChangeLog surgery. - * gst/equalizer/gstiirequalizer.c (ARG_BAND_WIDTH, _do_init, ARG_GAIN, - _GstIirEqualizerBand, object, _GstIirEqualizerBandClass, - parent_class, gst_iir_equalizer_band_set_property, - gst_iir_equalizer_band_class_init, gst_iir_equalizer_band_get_type, - gst_iir_equalizer_child_proxy_get_child_by_index, - gst_iir_equalizer_child_proxy_get_children_count, - gst_iir_equalizer_child_proxy_interface_init, setup_filter, - gst_iir_equalizer_compute_frequencies, plugin_init): - * tests/icles/equalizer-test.c: - Add fixme and comment for example. + * gst/videoparsers/gstav1parse.c: + av1parse: Save the default alignment + Otherwise the transformation is not applied and decoders may not + get the appropriate format despite the caps being negotiated + correctly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1837> -2007-05-21 12:43:37 +0000 Stefan Kost <ensonic@users.sourceforge.net> +2022-03-02 16:20:31 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * ChangeLog: - * gst/spectrum/gstspectrum.c: - gst/spectrum/gstspectrum.c (gst_spectrum_set_property, gst_spectrum_event, gst_spectrum_transform_ip): - Original commit message from CVS: - * gst/spectrum/gstspectrum.c (gst_spectrum_set_property, - gst_spectrum_event, gst_spectrum_transform_ip): - Use lock to protect from concurrent access. - -2007-05-21 11:37:16 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackenc.c: Specify and use properties as unsigned int that are an unsigned int. - Original commit message from CVS: - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init), - (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property): - Specify and use properties as unsigned int that are an unsigned int. - -2007-05-21 11:17:21 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackenc.*: Fixup docs, make the bitrate property an int as it should be and allow to set the differ... - Original commit message from CVS: - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init), - (gst_wavpack_enc_init), (gst_wavpack_enc_set_wp_config), - (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property): - * ext/wavpack/gstwavpackenc.h: - Fixup docs, make the bitrate property an int as it should be and - allow to set the different extra processing modes instead of only - allowing none and the default one. - -2007-05-20 21:31:58 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackenc.c: Add missing audioconverts in the example pipelines of wavpackenc. As the wavpack stuff n... - Original commit message from CVS: - * ext/wavpack/gstwavpackenc.c: - Add missing audioconverts in the example pipelines of wavpackenc. As - the wavpack stuff now needs input with 32 bit width (and random depth) - this is needed now. The example pipelines for the parser and decoder - are still fine. - -2007-05-20 15:12:31 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - docs/plugins/: Fix docs build and hierarchy. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - Fix docs build and hierarchy. - -2007-05-20 14:59:46 +0000 Tim-Philipp Müller <tim@centricular.net> - - sys/directdraw/gstdirectdrawsink.c: Bunch of small fixes: remove static function that doesn't exist; declare another ... - Original commit message from CVS: - * sys/directdraw/gstdirectdrawsink.c: (gst_ddrawsurface_finalize), - (gst_directdraw_sink_buffer_alloc), - (gst_directdraw_sink_get_ddrawcaps), - (gst_directdraw_sink_surface_create): - Bunch of small fixes: remove static function that doesn't exist; - declare another one that does; printf format fix; use right macro - when specifying debug category; remove a bunch of unused variables; - #if 0 out an unused chunk of code (partially fixes #439914). - -2007-05-20 14:14:49 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/: Printf format fixes (#439910, #439911). - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_prepare_current_sample): - * gst/switch/gstswitch.c: (gst_switch_chain): - Printf format fixes (#439910, #439911). - -2007-05-19 10:06:02 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/check/Makefile.am: Remove bits for deinterleave check which isn't in CVS yet. - Original commit message from CVS: - * tests/check/Makefile.am: - Remove bits for deinterleave check which isn't in CVS yet. - -2007-05-19 10:01:45 +0000 René Stadler <mail@renestadler.de> - - Add replaygain playback elements (#412710). - Original commit message from CVS: - Patch by: René Stadler <mail at renestadler de> - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-replaygain.xml: - * gst/replaygain/Makefile.am: - * gst/replaygain/gstrganalysis.c: (gst_rg_analysis_class_init), - (gst_rg_analysis_start), (gst_rg_analysis_set_caps), - (gst_rg_analysis_transform_ip), (gst_rg_analysis_event), - (gst_rg_analysis_stop), (gst_rg_analysis_handle_tags), - (gst_rg_analysis_handle_eos), (gst_rg_analysis_track_result), - (gst_rg_analysis_album_result): - * gst/replaygain/gstrganalysis.h: - * gst/replaygain/gstrglimiter.c: (gst_rg_limiter_base_init), - (gst_rg_limiter_class_init), (gst_rg_limiter_init), - (gst_rg_limiter_set_property), (gst_rg_limiter_get_property), - (gst_rg_limiter_transform_ip): - * gst/replaygain/gstrglimiter.h: - * gst/replaygain/gstrgvolume.c: (gst_rg_volume_base_init), - (gst_rg_volume_class_init), (gst_rg_volume_init), - (gst_rg_volume_set_property), (gst_rg_volume_get_property), - (gst_rg_volume_dispose), (gst_rg_volume_change_state), - (gst_rg_volume_sink_event), (gst_rg_volume_tag_event), - (gst_rg_volume_reset), (gst_rg_volume_update_gain), - (gst_rg_volume_determine_gain): - * gst/replaygain/gstrgvolume.h: - * gst/replaygain/replaygain.c: (plugin_init): - * gst/replaygain/replaygain.h: - * gst/replaygain/rganalysis.h: - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/rganalysis.c: (send_eos_event), - (GST_START_TEST): - * tests/check/elements/rglimiter.c: (setup_rglimiter), - (cleanup_rglimiter), (set_playing_state), (create_test_buffer), - (verify_test_buffer), (GST_START_TEST), (rglimiter_suite), (main): - * tests/check/elements/rgvolume.c: (event_func), (setup_rgvolume), - (cleanup_rgvolume), (set_playing_state), (set_null_state), - (send_eos_event), (send_tag_event), (test_buffer_new), - (fail_unless_target_gain), (fail_unless_result_gain), - (fail_unless_gain), (GST_START_TEST), (rgvolume_suite), (main): - Add replaygain playback elements (#412710). - -2007-05-18 16:45:54 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - update - Original commit message from CVS: - update - -2007-05-18 12:39:49 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - sys/glsink/glimagesink.c: Update the cached caps after opening the display so that we report only the supported caps ... - Original commit message from CVS: - * sys/glsink/glimagesink.c: (gst_glimage_sink_init_display): - Update the cached caps after opening the display so that we report - only the supported caps formats, not just the template caps. - Fixes: #439405 + * gst/videoparsers/gstav1parse.c: + av1parse: Remove duplicated check + The case of both strings being empty is already checked in the + helper function. No functional changes. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1837> -2007-05-18 09:35:28 +0000 Stefan Kost <ensonic@users.sourceforge.net> +2022-03-04 10:02:56 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * ChangeLog: - * ext/amrwb/gstamrwbdec.c: - * ext/amrwb/gstamrwbenc.c: - * ext/amrwb/gstamrwbparse.c: - ext/amrwb/gstamrwbdec.c (gst_amrwbdec_debug, GST_CAT_DEFAULT, _do_init, gst_amrwbdec_base_init, gst_amrwbdec_class_in... - Original commit message from CVS: - * ext/amrwb/gstamrwbdec.c (gst_amrwbdec_debug, GST_CAT_DEFAULT, - _do_init, gst_amrwbdec_base_init, gst_amrwbdec_class_init): - * ext/amrwb/gstamrwbenc.c (gst_amrwbenc_debug, GST_CAT_DEFAULT, - _do_init, gst_amrwbenc_base_init, gst_amrwbenc_class_init): - * ext/amrwb/gstamrwbparse.c (gst_amrwbparse_debug, GST_CAT_DEFAULT, - _do_init, gst_amrwbparse_base_init, gst_amrwbparse_class_init): - First round of cleanups, that use GST_BOILERPLATE, GST_ELEMENT_DETAILS, - GST_DEBUG_FUNCPTR and add log-category. - -2007-05-17 10:59:00 +0000 Edward Hervey <bilboed@bilboed.com> - - sys/osxvideo/osxvideosink.*: Remove the event-loop-in-separate-thread modifications, because MacOSX is $#@(*%$# ! For... - Original commit message from CVS: - * sys/osxvideo/osxvideosink.h: - * sys/osxvideo/osxvideosink.m: - Remove the event-loop-in-separate-thread modifications, because MacOSX - is $#@(*%$# ! For those wondering, the event handling needs to be done - in the main thread after all.. + * gst/videoparsers/gstvp9parse.c: + vp9parse: Fix auto-plugging of HW frame decoder + Decoders that required frame aligmment and didn't have an associated + alpha decoder were skipped. This is because the parser was constructing + caps based on the software alpha decoder, which specify super-frame + alignment. + Iterate over the caps to filter the one that have a matching codec-alpha, with + the semantic the no codec-alpha field means codec-alpha=false. Then if + everything was removed, callback to the original, so that the first non-alpha + decoder will be picked. + Fixes #820 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1855> -2007-05-17 10:08:24 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> +2022-03-04 14:17:47 +0100 Edward Hervey <edward@centricular.com> - * ChangeLog: - * gst/switch/gstswitch.c: - * gst/switch/gstswitch.h: - gst/switch/gstswitch.c (ARG_0, ARG_NB_SOURCES, ARG_ACTIVE_SOURCE, - Original commit message from CVS: - * gst/switch/gstswitch.c (ARG_0, ARG_NB_SOURCES, ARG_ACTIVE_SOURCE, - ARG_START_VALUE, ARG_STOP_VALUE, ARG_LAST_TS, ARG_QUEUE_BUFFERS, - parent_class, gst_switch_release_pad, gst_switch_request_new_pad, - gst_switch_chain, gst_switch_event, gst_switch_set_property, - gst_switch_get_property, gst_switch_getcaps, gst_switch_dispose, - unref_buffer, unref_buffers_and_destroy_list, gst_switch_init, - gst_switch_base_init, gst_switch_class_init): - * gst/switch/gstswitch.h (need_to_send_newsegment, queue_buffers, - stop_value, start_value, current_start, last_ts, stored_buffers): - Add handling of application provided stop and start values, allowing - A/V sync across 2 switch elements. - -2007-05-17 09:41:48 +0000 Edward Hervey <bilboed@bilboed.com> - - sys/osxvideo/osxvideosink.*: Fix a stupid #if vs #ifdef bug. Should use the proper colorspace now. - Original commit message from CVS: - * sys/osxvideo/osxvideosink.h: - * sys/osxvideo/osxvideosink.m: - Fix a stupid #if vs #ifdef bug. Should use the proper colorspace now. - Use a separate thread/task for the cocoa event_loop, else it wouldn't - stop. - -2007-05-16 17:14:43 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/real/: Don't crash when we get a buffer and our input caps haven't been set yet; also, don't leak all the input b... - Original commit message from CVS: - * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_chain), - (gst_real_audio_dec_setcaps): - * gst/real/gstrealvideodec.c: (gst_real_video_dec_chain): - Don't crash when we get a buffer and our input caps haven't been set - yet; also, don't leak all the input buffers (realaudiodec only). - -2007-05-16 13:50:51 +0000 Stanislav Brabec <sbrabec@suse.cz> - - Use external shared libamrwb. Fixes #423741 (with lots of cleanup). - Original commit message from CVS: - patch by: Stanislav Brabec <sbrabec@suse.cz> - * configure.ac: - * ext/amrwb/Makefile.am: - * ext/amrwb/amrwb-code/Makefile.am: - * ext/amrwb/amrwb-code/amrwb/Makefile.am: - * ext/amrwb/amrwb-code/amrwb/README: - * ext/amrwb/gstamrwbdec.c: - * ext/amrwb/gstamrwbdec.h (__GST_AMRWBDEC_H__): - * ext/amrwb/gstamrwbenc.h (__GST_AMRWBENC_H__): - * ext/amrwb/gstamrwbparse.c: - * ext/amrwb/gstamrwbparse.h (__GST_AMRWBPARSE_H__): - * gst-libs/Makefile.am: - * gst-libs/ext/Makefile.am: - * gst-libs/ext/amrwb/Makefile.am: - * gst-libs/ext/amrwb/README: - Use external shared libamrwb. Fixes #423741 (with lots of cleanup). - -2007-05-15 21:23:53 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/x264/gstx264enc.c (gst_x264_enc_init_encoder): This needs a version check. - Original commit message from CVS: - * ext/x264/gstx264enc.c (gst_x264_enc_init_encoder): - This needs a version check. - * gst/bayer/Makefile.am: - Fix the build. - -2007-05-15 17:22:58 +0000 Tim-Philipp Müller <tim@centricular.net> - - Add DIRECTDRAW_CFLAGS and DIRECTSOUND_CFLAGS to Makefile.am; save and restore the various flags in the directdraw/dir... - Original commit message from CVS: - * configure.ac: - * sys/directdraw/Makefile.am: - * sys/directsound/Makefile.am: - Add DIRECTDRAW_CFLAGS and DIRECTSOUND_CFLAGS to Makefile.am; save - and restore the various flags in the directdraw/directsound - detection section. Apparently improves cross-compiling for win32 - with mingw32 under some circumstances (#437539). - -2007-05-15 13:29:53 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpptdemux.c: We always use fixed caps. - Original commit message from CVS: - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): - We always use fixed caps. - -2007-05-15 03:45:45 +0000 David Schleef <ds@schleef.org> - - gst/rtpmanager/gstrtpbin.c: g_hash_table_remove_all() only exists in 2.12. Work around. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: - g_hash_table_remove_all() only exists in 2.12. Work around. - -2007-05-15 02:54:52 +0000 David Schleef <ds@schleef.org> - - Add a Bayer-to-RGB converter. You know you want one, uh-huh. - Original commit message from CVS: - * configure.ac: - * gst/bayer/Makefile.am: - * gst/bayer/gstbayer.c: - * gst/bayer/gstbayer2rgb.c: - Add a Bayer-to-RGB converter. You know you want one, uh-huh. - Partial fix for #314160. + * gst/mpegtsdemux/tsdemux.c: + tsdemux: Handle PES headers bigger than a mpeg-ts packet + While the actual PES header parser could notify us that it needed more data, we + would never actually act on it. + This commit will accumulate incoming packets in such situation and re-attempt + the header parsing. + Fixes #1027 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1852> -2007-05-14 18:03:58 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> +2022-03-03 11:32:23 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * ChangeLog: - * gst/switch/gstswitch.c: - * gst/switch/gstswitch.h: - gst/switch/gstswitch.c (ARG_ACTIVE_SOURCE, ARG_STOP_VALUE, - Original commit message from CVS: - * gst/switch/gstswitch.c (ARG_ACTIVE_SOURCE, ARG_STOP_VALUE, - ARG_LAST_TS, parent_class, gst_switch_release_pad, - gst_switch_request_new_pad, gst_switch_chain, gst_switch_event, - gst_switch_set_property, gst_switch_get_property, gst_switch_getcaps, - gst_switch_dispose, gst_switch_init, gst_switch_class_init): - * gst/switch/gstswitch.h (previous_sinkpad, nb_sinkpads, stop_value, - current_start, last_ts): - Allow application to provide a stop timestamp, so a new segment - update can be sent before switching. - -2007-05-14 15:28:36 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/async_jitter_queue.c: Fix leak when flushing. - Original commit message from CVS: - * gst/rtpmanager/async_jitter_queue.c: - (async_jitter_queue_set_flushing_unlocked): - Fix leak when flushing. - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_clear_pt_map), - (gst_rtp_bin_class_init): - * gst/rtpmanager/gstrtpbin.h: - Add clear-pt-map signal. - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_flush_stop), - (gst_rtp_jitter_buffer_sink_event), (gst_rtp_jitter_buffer_loop): - Init clock-rate to -1 to mark unknow clock rate. - Fix flushing. - -2007-05-13 19:57:45 +0000 David Schleef <ds@schleef.org> - - gst/replaygain/rganalysis.c: Fix wrong ifdef for visual C++. Fixes: #437403. - Original commit message from CVS: - * gst/replaygain/rganalysis.c: - Fix wrong ifdef for visual C++. Fixes: #437403. - By Ali Sabil <ali.sabil@gmail.com>. - -2007-05-13 07:08:06 +0000 David Schleef <ds@schleef.org> - - ext/neon/gstneonhttpsrc.c: Make redirection the default behavior. Fixes #413818. - Original commit message from CVS: - * ext/neon/gstneonhttpsrc.c: - Make redirection the default behavior. Fixes #413818. - -2007-05-11 11:20:33 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - add latest plugin - Original commit message from CVS: - add latest plugin - -2007-05-10 14:02:07 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/qtdemux/qtdemux.c (gst_qtdemux_move_stream, gst_qtdemux_loop_state_header, gst_qtdemux_activate_segment, gst_qtde... - Original commit message from CVS: - * gst/qtdemux/qtdemux.c (gst_qtdemux_move_stream, - gst_qtdemux_loop_state_header, gst_qtdemux_activate_segment, - gst_qtdemux_prepare_current_sample, gst_qtdemux_combine_flows, - gst_qtdemux_loop_state_movie, gst_qtdemux_loop, - qtdemux_parse_segments, qtdemux_parse_trak): - * gst/rtpmanager/rtpsession.c (rtp_session_get_bandwidth, - rtp_session_get_rtcp_bandwidth, rtp_session_get_cname, - rtp_session_get_name, rtp_session_get_email, rtp_session_get_phone, - rtp_session_get_location, rtp_session_get_tool, - rtp_session_process_bye, session_report_blocks): - * gst/rtpmanager/rtpsource.c (rtp_source_process_rtp, - rtp_source_send_rtp, rtp_source_process_sr, rtp_source_process_rb): - More format arg fixing (spotted by Ali Sabil <ali.sabil@gmail.com>). - * gst/switch/Makefile.am: - Add require libraries(spotted by Ali Sabil <ali.sabil@gmail.com>). + * sys/va/gstvabasetransform.c: + va: basetransform: Add device-path read-only property. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1844> -2007-05-10 12:38:49 +0000 Stefan Kost <ensonic@users.sourceforge.net> +2022-03-03 11:05:36 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * ChangeLog: - * common: - * gst/rtpmanager/async_jitter_queue.c: - gst/rtpmanager/async_jitter_queue.c (tail_buffer_duration, async_jitter_queue_ref, async_jitter_queue_ref_unlocked, a... - Original commit message from CVS: - * gst/rtpmanager/async_jitter_queue.c (tail_buffer_duration, - async_jitter_queue_ref, async_jitter_queue_ref_unlocked, - async_jitter_queue_set_low_threshold, - async_jitter_queue_length_ts_units_unlocked, - async_jitter_queue_unref_and_unlock, async_jitter_queue_unref, - async_jitter_queue_lock, async_jitter_queue_push, - async_jitter_queue_push_unlocked, async_jitter_queue_push_sorted, - async_jitter_queue_pop_intern_unlocked, async_jitter_queue_pop, - async_jitter_queue_pop_unlocked, async_jitter_queue_length_unlocked, - async_jitter_queue_set_flushing_unlocked, - async_jitter_queue_unset_flushing_unlocked): - Format arg fix (spotted by Ali Sabil <ali.sabil@gmail.com>) - -2007-05-10 07:41:47 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - common/m4/gst-x11.m4: Restore CFLAGS and LIBS. - Original commit message from CVS: - * common/m4/gst-x11.m4: - Restore CFLAGS and LIBS. - * configure.ac: - Revert previous patch. - -2007-05-10 06:35:31 +0000 Ali Sabil <ali.sabil@gmail.com> - - configure.ac: Save and restore CFLAGS for OpenGL check. Fixes #437260. - Original commit message from CVS: - Patch by: Ali Sabil <ali.sabil@gmail.com> - * configure.ac: - Save and restore CFLAGS for OpenGL check. Fixes #437260. - -2007-05-09 20:01:21 +0000 Sébastien Moutte <sebastien@moutte.net> - - docs/plugins/gst-plugins-bad-plugins.args: Add directraw and directsound sinks properties. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.args: - Add directraw and directsound sinks properties. - -2007-05-09 17:58:07 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Fix --disable-external (hopefully). - Original commit message from CVS: - * configure.ac: - Fix --disable-external (hopefully). - -2007-05-09 11:24:22 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Pass queries upstream. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_query): - Pass queries upstream. - -2007-05-06 15:25:05 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/real/: Use GModule instead of using dlsym() directly. Fixes #430598. - Original commit message from CVS: - * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_setcaps), - (gst_real_audio_dec_finalize): - * gst/real/gstrealaudiodec.h: - * gst/real/gstrealvideodec.c: (open_library), (close_library): - * gst/real/gstrealvideodec.h: - Use GModule instead of using dlsym() directly. Fixes #430598. - -2007-05-04 21:02:58 +0000 Sébastien Moutte <sebastien@moutte.net> - - docs/plugins/: Add docs for Windows sinks. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - Add docs for Windows sinks. - -2007-05-04 17:20:31 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/speed/gstspeed.c: Fix event handling a bit by replacing completely dubious code written by someone else with comp... - Original commit message from CVS: - * gst/speed/gstspeed.c: (speed_src_event), (speed_sink_event), - (speed_chain), (speed_change_state): - Fix event handling a bit by replacing completely dubious code - written by someone else with completely dubious code written - by me. Should at least fix #412077 though. - -2007-05-04 16:11:46 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/speed/gstspeed.c: Add debug category; use gst_pad_query_peer_*() utility functions; use gst_util_scale*(); add gt... - Original commit message from CVS: - * gst/speed/gstspeed.c: (speed_src_query), (speed_chain), - (plugin_init): - Add debug category; use gst_pad_query_peer_*() utility functions; - use gst_util_scale*(); add gtk-doc blurb. - -2007-05-04 12:32:27 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Add some debug info. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_query): - Add some debug info. - * gst/rtpmanager/rtpsession.c: (rtp_session_init), - (rtp_session_send_rtp): - Store real user name in the session. - -2007-05-03 16:49:05 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c... - Original commit message from CVS: - * configure.ac: - * examples/Makefile.am: - * examples/switch/switcher.c (loop, my_bus_callback, switch_timer, - last_message_received, main): - * gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details, - gst_switch_src_factory, parent_class, gst_switch_release_pad, - gst_switch_request_new_pad, gst_switch_chain, gst_switch_event, - gst_switch_set_property, gst_switch_get_property, - gst_switch_get_linked_pad, gst_switch_getcaps, - gst_switch_bufferalloc, gst_switch_get_linked_pads, - gst_switch_dispose, gst_switch_init, gst_switch_base_init, - gst_switch_class_init): - * gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch, - element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events, - need_to_send_newsegment): - Port switch element and example program to 0.10. - -2007-05-02 18:31:16 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpack.c: Call bindtextdomain() to get localized strings. - Original commit message from CVS: - * ext/wavpack/gstwavpack.c: (plugin_init): - Call bindtextdomain() to get localized strings. - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), - (gst_wavpack_parse_handle_seek_event), - (gst_wavpack_parse_push_buffer), (gst_wavpack_parse_chain): - * ext/wavpack/gstwavpackparse.h: - Handle DISCONT buffers by correctly setting the DISCONT flag - on outgoing buffers when necessary. - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_handle_seek_event) - Send newsegment from the streaming thread. - -2007-05-02 16:58:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackparse.c: Remove old workaround that was needed when seeking after the last sample. With the fix... - Original commit message from CVS: - * ext/wavpack/gstwavpackparse.c: - (gst_wavpack_parse_handle_seek_event): - Remove old workaround that was needed when seeking after the last - sample. With the fixed error handling this works now as expected - without pushing the last sample although it wasn't requested. - -2007-05-02 16:45:43 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackparse.c: Handle segment seeks in the seek event handler, correctly work with stop position == -... - Original commit message from CVS: - * ext/wavpack/gstwavpackparse.c: - (gst_wavpack_parse_handle_seek_event): - Handle segment seeks in the seek event handler, correctly work with - stop position == -1 and instead of stopping the task on seek just - pause it. - -2007-05-02 16:19:58 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackparse.c: Add handling for segment seeks. - Original commit message from CVS: - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_loop): - Add handling for segment seeks. - -2007-05-02 15:13:04 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackparse.c: Correctly handle errors, especially in the loop function. Before it was easy to get th... - Original commit message from CVS: - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_pull_buffer), - (gst_wavpack_parse_create_src_pad), - (gst_wavpack_parse_resync_loop), (gst_wavpack_parse_loop), - (gst_wavpack_parse_chain): - Correctly handle errors, especially in the loop function. Before it - was easy to get the task paused but no error being posted on the bus. - -2007-04-30 15:39:09 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - update spec - Original commit message from CVS: - update spec - -2007-04-30 13:41:30 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/async_jitter_queue.c: Fix the case where the buffer underruns and does not block. - Original commit message from CVS: - * gst/rtpmanager/async_jitter_queue.c: (signal_waiting_threads), - (async_jitter_queue_pop_intern_unlocked): - Fix the case where the buffer underruns and does not block. - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_base_init), - (create_recv_rtcp), (create_send_rtp), (create_rtcp), - (gst_rtp_bin_request_new_pad): - Rename RTCP send pad, like in the session manager. - Allow getting an RTCP pad for receiving even if we don't receive RTP. - fix handling of send_rtp_src pad. - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): - When no pt map could be found, fall back to the sinkpad caps. - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_process_rtp), - (gst_rtp_session_send_rtp), (create_recv_rtp_sink), - (create_recv_rtcp_sink), (create_send_rtp_sink), - (create_send_rtcp_src): - Fix pad names. - * gst/rtpmanager/rtpsession.c: (source_push_rtp), - (rtp_session_create_source), (rtp_session_process_sr), - (rtp_session_send_rtp), (session_start_rtcp): - * gst/rtpmanager/rtpsession.h: - Unlock session when performing a callback. - Add callbacks for the internal session object. - Fix sending of RTP packets. - first attempt at adding NTP times in the SR packets. - Small debug and doc improvements. - * gst/rtpmanager/rtpsource.c: (rtp_source_send_rtp): - Update stats for SR reports. - -2007-04-29 14:46:27 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpsession.c: Remove debug. - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_send_rtcp): - Remove debug. - * gst/rtpmanager/rtpsession.c: (rtp_session_process_sr), - (rtp_session_process_sdes), (calculate_rtcp_interval), - (rtp_session_next_timeout), (session_report_blocks): - * gst/rtpmanager/rtpstats.c: (rtp_stats_calculate_rtcp_interval): - Improve debugging - Fix interval for BYE/RTCP packets. - -2007-04-29 14:01:05 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - docs/plugins/gst-plugins-bad-plugins.*: Commit result of running scanobj-update - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.signals: - Commit result of running scanobj-update - -2007-04-29 13:56:18 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * sys/directdraw/gstdirectdrawsink.c: - * sys/osxvideo/osxvideosink.m: - 80 char police - Original commit message from CVS: - 80 char police - -2007-04-29 13:53:17 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - autogen.sh: Require automake 1.7 - Original commit message from CVS: - * autogen.sh: - Require automake 1.7 - * ext/alsaspdif/Makefile.am: - * ext/divx/Makefile.am: - * ext/ivorbis/Makefile.am: - * ext/musicbrainz/Makefile.am: - * ext/neon/Makefile.am: - * ext/sdl/Makefile.am: - * ext/swfdec/Makefile.am: - * ext/theora/Makefile.am: - * ext/wavpack/Makefile.am: - * ext/xvid/Makefile.am: - * gst/modplug/Makefile.am: - Fix up Makefile.am accordingly. - -2007-04-29 13:49:02 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - docs/plugins/inspect/: Add jack and update. - Original commit message from CVS: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-glimagesink.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-jack.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spectrum.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-videocrop.xml: - * docs/plugins/inspect/plugin-wavpack.xml: - * docs/plugins/inspect/plugin-xingheader.xml: - * docs/plugins/inspect/plugin-xvid.xml: - Add jack and update. - -2007-04-28 12:46:47 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Don't build equalizer unless we have core from CVS (it won't work with earlier versions due to GstChild... - Original commit message from CVS: - * configure.ac: - Don't build equalizer unless we have core from CVS (it won't - work with earlier versions due to GstChildProxy brokeness). - Also up requirements to last released core/base. - -2007-04-27 15:33:46 +0000 Julien Moutte <julien@moutte.net> - - ext/theora/theoradec.c: Calculate buffer duration correctly to generate a perfect stream (#433888). - Original commit message from CVS: - 2007-04-27 Julien MOUTTE <julien@moutte.net> - * ext/theora/theoradec.c: (_theora_granule_time), - (theora_dec_push_forward), (theora_handle_data_packet), - (theora_dec_decode_buffer): Calculate buffer duration correctly - to generate a perfect stream (#433888). - * gst/audioresample/gstaudioresample.c: - (audioresample_check_discont): Glib provides ABS. - -2007-04-27 15:09:12 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpsession.c: Move reconsideration code to the rtpsession object. - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: (rtcp_thread), - (gst_rtp_session_send_rtcp), (gst_rtp_session_reconsider): - Move reconsideration code to the rtpsession object. - Simplify timout handling and add reconsideration. - * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), - (rtp_session_init), (rtp_session_finalize), (on_bye_ssrc), - (on_bye_timeout), (on_timeout), (rtp_session_set_callbacks), - (obtain_source), (rtp_session_create_source), - (update_arrival_stats), (rtp_session_process_rtp), - (rtp_session_process_sr), (rtp_session_process_rr), - (rtp_session_process_bye), (rtp_session_process_rtcp), - (calculate_rtcp_interval), (rtp_session_send_bye), - (rtp_session_next_timeout), (session_start_rtcp), - (session_report_blocks), (session_cleanup), (session_sdes), - (session_bye), (is_rtcp_time), (rtp_session_on_timeout): - * gst/rtpmanager/rtpsession.h: - Handle timeout of inactive sources and senders. - Implement BYE scheduling. - * gst/rtpmanager/rtpsource.c: (calculate_jitter), - (rtp_source_process_sr), (rtp_source_get_last_sr), - (rtp_source_get_last_rb): - * gst/rtpmanager/rtpsource.h: - Add members to check for timeouts. - * gst/rtpmanager/rtpstats.c: (rtp_stats_init_defaults), - (rtp_stats_calculate_rtcp_interval), (rtp_stats_add_rtcp_jitter), - (rtp_stats_calculate_bye_interval): - * gst/rtpmanager/rtpstats.h: - Use RFC algorithm for calculating the reporting interval. - -2007-04-26 14:31:32 +0000 Edward Hervey <bilboed@bilboed.com> - - docs/plugins/: Add documentation for osxvideo - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-osxvideo.xml: - Add documentation for osxvideo - -2007-04-25 16:38:03 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpsession.c: Implement forward and reverse reconsideration. - Original commit message from CVS: - * gst/rtpmanager/gstrtpsession.c: (rtcp_thread): - Implement forward and reverse reconsideration. - * gst/rtpmanager/rtpsession.c: (rtp_session_get_num_sources), - (rtp_session_get_num_active_sources), (rtp_session_process_sr), - (session_report_blocks): - * gst/rtpmanager/rtpsession.h: - Small cleanups. - -2007-04-25 15:48:46 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.*: Make default jitterbuffer latency configurable. - Original commit message from CVS: - reviewed by: <delete if not using a buddy> - * gst/rtpmanager/gstrtpbin.c: (create_stream), - (gst_rtp_bin_class_init), (gst_rtp_bin_set_property), - (gst_rtp_bin_get_property): - * gst/rtpmanager/gstrtpbin.h: - Make default jitterbuffer latency configurable. - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_class_init), - (gst_jitter_buffer_sink_parse_caps), (gst_rtp_jitter_buffer_loop), - (gst_rtp_jitter_buffer_set_property), - (gst_rtp_jitter_buffer_get_property): - Debuging cleanups. - -2007-04-25 13:19:36 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Report NO_PREROLL when going to PAUSED. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_change_state): - Report NO_PREROLL when going to PAUSED. - * gst/rtpmanager/gstrtpsession.c: (rtcp_thread): - Don't send RTCP right before we are shutting down. - * gst/rtpmanager/rtpsession.c: (rtp_session_process_rtp), - (rtp_session_process_sr), (session_report_blocks), - (rtp_session_perform_reporting): - Improve report blocks. - * gst/rtpmanager/rtpsource.c: (calculate_jitter), (init_seq), - (rtp_source_process_rtp), (rtp_source_process_sr), - (rtp_source_process_rb), (rtp_source_get_last_sr), - (rtp_source_get_last_rb): - * gst/rtpmanager/rtpsource.h: - * gst/rtpmanager/rtpstats.h: - Cleanups, add methods to access stats. - -2007-04-25 08:30:48 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: fix for pad name change - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (create_rtcp): - fix for pad name change - * gst/rtpmanager/gstrtpsession.c: (rtcp_thread), - (gst_rtp_session_send_rtcp), (gst_rtp_session_clock_rate): - Fix for renamed methods. - * gst/rtpmanager/rtpsession.c: (rtp_session_init), - (rtp_session_finalize), (rtp_session_set_cname), - (rtp_session_get_cname), (rtp_session_set_name), - (rtp_session_get_name), (rtp_session_set_email), - (rtp_session_get_email), (rtp_session_set_phone), - (rtp_session_get_phone), (rtp_session_set_location), - (rtp_session_get_location), (rtp_session_set_tool), - (rtp_session_get_tool), (rtp_session_set_note), - (rtp_session_get_note), (source_push_rtp), (obtain_source), - (rtp_session_add_source), (rtp_session_get_source_by_ssrc), - (rtp_session_create_source), (rtp_session_process_rtp), - (rtp_session_process_sr), (rtp_session_process_sdes), - (rtp_session_process_rtcp), (rtp_session_send_rtp), - (rtp_session_get_reporting_interval), (session_report_blocks), - (session_sdes), (rtp_session_perform_reporting): - * gst/rtpmanager/rtpsession.h: - Prepare for implementing SSRC sampling. - Create SSRC for the session. - Add methods to set the SDES entries. - fix accounting of senders/receivers. - Implement SR/RR/SDES RTCP reporting. - * gst/rtpmanager/rtpsource.c: (rtp_source_init), (init_seq), - (rtp_source_process_rtp), (rtp_source_process_sr): - * gst/rtpmanager/rtpsource.h: - Implement extended sequence number. - * gst/rtpmanager/rtpstats.c: (rtp_stats_calculate_rtcp_interval): - * gst/rtpmanager/rtpstats.h: - Rename some fields. - -2007-04-24 15:49:18 +0000 Tim-Philipp Müller <tim@centricular.net> - - Plug some leaks; try to make build bot happy again. - Original commit message from CVS: - * gst/y4m/gsty4mencode.c: (gst_y4m_encode_init), - (gst_y4m_encode_setcaps): - * tests/check/elements/y4menc.c: (GST_START_TEST): - Plug some leaks; try to make build bot happy again. - -2007-04-21 19:39:03 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/Makefile.am: Fix distcheck, hopefully (rtpmanager is already in GST_PLUGINS_ALL). - Original commit message from CVS: - * gst/Makefile.am: - Fix distcheck, hopefully (rtpmanager is already in GST_PLUGINS_ALL). - -2007-04-21 19:21:49 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/rtpmanager/rtpsession.c: Don't use GLib-2.10 API, we only require GLib 2.8 at the moment. - Original commit message from CVS: - * gst/rtpmanager/rtpsession.c: (rtp_session_finalize): - Don't use GLib-2.10 API, we only require GLib 2.8 at the moment. - -2007-04-21 14:14:24 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/audioresample/gstaudioresample.c: Make more functions static, just because we can. - Original commit message from CVS: - * gst/audioresample/gstaudioresample.c: - Make more functions static, just because we can. - -2007-04-21 13:54:39 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/check/elements/audioresample.c: Add unit test for audioresample shutdown crasher (#420106). - Original commit message from CVS: - * tests/check/elements/audioresample.c: - Add unit test for audioresample shutdown crasher (#420106). - -2007-04-20 15:31:32 +0000 Michael Smith <msmith@xiph.org> - - ext/faad/gstfaad.c: FAAD fails to decode low (e.g. 8 kHz) sample rate AAC data in quicktime because of sample rate mi... - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_open_decoder): - FAAD fails to decode low (e.g. 8 kHz) sample rate AAC data in - quicktime because of sample rate mismatches. - Reenable overriding the implicit SBR behaviour (accidently changed?) - to allow playback of these files. - -2007-04-19 15:43:26 +0000 David Schleef <ds@schleef.org> - - configure.ac: Change rtpmanager disabling to keep -bad releasable. - Original commit message from CVS: - * configure.ac: - Change rtpmanager disabling to keep -bad releasable. - -2007-04-18 19:45:32 +0000 David Schleef <ds@schleef.org> - - Fix wtay's hack. rtpmanager is disabled in configure.ac on line 268. - Original commit message from CVS: - * configure.ac: - * gst/Makefile.am: - Fix wtay's hack. rtpmanager is disabled in configure.ac on - line 268. - -2007-04-18 19:26:52 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/Makefile.am: Add rtpmanager dir to dist. - Original commit message from CVS: - * gst/Makefile.am: - Add rtpmanager dir to dist. - -2007-04-18 18:58:53 +0000 Wim Taymans <wim.taymans@gmail.com> - - configure.ac: Disable rtpmanager for now because it depends on CVS -base. - Original commit message from CVS: - * configure.ac: - Disable rtpmanager for now because it depends on CVS -base. - * gst/rtpmanager/Makefile.am: - Added new files for session manager. - * gst/rtpmanager/gstrtpjitterbuffer.h: - * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), - (create_stream), (pt_map_requested), (new_ssrc_pad_found): - Some cleanups. - the session manager can now also request a pt-map. - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_base_init), - (gst_rtp_session_class_init), (gst_rtp_session_init), - (gst_rtp_session_finalize), (rtcp_thread), (start_rtcp_thread), - (stop_rtcp_thread), (gst_rtp_session_change_state), - (gst_rtp_session_process_rtp), (gst_rtp_session_send_rtp), - (gst_rtp_session_send_rtcp), (gst_rtp_session_clock_rate), - (gst_rtp_session_get_time), (gst_rtp_session_event_recv_rtp_sink), - (gst_rtp_session_chain_recv_rtp), - (gst_rtp_session_event_recv_rtcp_sink), - (gst_rtp_session_chain_recv_rtcp), - (gst_rtp_session_event_send_rtp_sink), - (gst_rtp_session_chain_send_rtp), (create_send_rtcp_src), - (gst_rtp_session_request_new_pad): - * gst/rtpmanager/gstrtpsession.h: - We can ask for pt-map now too when the session manager needs it. - Hook up to the new session manager, implement the needed callbacks for - pushing data, getting clock time and requesting clock-rates. - Rename rtcp_src to send_rtcp_src to make it clear that this RTCP is to - be send to clients. - Add code to start and stop the thread that will schedule RTCP through - the session manager. - * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), - (rtp_session_init), (rtp_session_finalize), - (rtp_session_set_property), (rtp_session_get_property), - (on_new_ssrc), (on_ssrc_collision), (on_ssrc_validated), - (on_bye_ssrc), (rtp_session_new), (rtp_session_set_callbacks), - (rtp_session_set_bandwidth), (rtp_session_get_bandwidth), - (rtp_session_set_rtcp_bandwidth), (rtp_session_get_rtcp_bandwidth), - (source_push_rtp), (source_clock_rate), (check_collision), - (obtain_source), (rtp_session_add_source), - (rtp_session_get_num_sources), - (rtp_session_get_num_active_sources), - (rtp_session_get_source_by_ssrc), - (rtp_session_get_source_by_cname), (rtp_session_create_source), - (update_arrival_stats), (rtp_session_process_rtp), - (rtp_session_process_sr), (rtp_session_process_rr), - (rtp_session_process_sdes), (rtp_session_process_bye), - (rtp_session_process_app), (rtp_session_process_rtcp), - (rtp_session_send_rtp), (rtp_session_get_rtcp_interval), - (rtp_session_produce_rtcp): - * gst/rtpmanager/rtpsession.h: - The advanced beginnings of the main session manager that handles the - participant database of RTPSources, SSRC probation, SSRC collisions, - parse RTCP to update source stats. etc.. - * gst/rtpmanager/rtpsource.c: (rtp_source_class_init), - (rtp_source_init), (rtp_source_finalize), (rtp_source_new), - (rtp_source_set_callbacks), (rtp_source_set_as_csrc), - (rtp_source_set_rtp_from), (rtp_source_set_rtcp_from), - (push_packet), (get_clock_rate), (calculate_jitter), - (rtp_source_process_rtp), (rtp_source_process_bye), - (rtp_source_send_rtp), (rtp_source_process_sr), - (rtp_source_process_rb): - * gst/rtpmanager/rtpsource.h: - Object that encapsulates an SSRC and its state in the database. - Calculates the jitter and transit times of data packets. - * gst/rtpmanager/rtpstats.c: (rtp_stats_init_defaults), - (rtp_stats_calculate_rtcp_interval), (rtp_stats_add_rtcp_jitter): - * gst/rtpmanager/rtpstats.h: - Various stats regarding the session and sources. - Used to calculate the RTCP interval. - -2007-04-17 10:56:37 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/app/Makefile.am: Fix CFLAGS and hopefully #430594. - Original commit message from CVS: - * gst/app/Makefile.am: - Fix CFLAGS and hopefully #430594. - -2007-04-17 08:48:34 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/nsf/types.h: Rename #ifndef header guard symbol to something less generic, so types.h doesn't get skipped over wh... - Original commit message from CVS: - * gst/nsf/types.h: - Rename #ifndef header guard symbol to something less generic, so - types.h doesn't get skipped over when compiling on MingW. Include - GLib headers and use those to set the endianness and the basic - types so that this isn't entirely broken for non-x86 architectures. - -2007-04-17 08:04:43 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/mve/gstmvedemux.c: Use G_LITTLE_ENDIAN instead of LITTLE_ENDIAN, so stuff compiles on - Original commit message from CVS: - * gst/mve/gstmvedemux.c: (gst_mve_audio_init): - Use G_LITTLE_ENDIAN instead of LITTLE_ENDIAN, so stuff compiles on - MingW (no idea though why we add a BYTE_ORDER endianness field if - the audio is compressed). - -2007-04-16 22:20:03 +0000 Vincent Torri <vtorri@univ-evry.fr> - - ext/pango/gstclockoverlay.c: Fix unused variable warning if HAVE_LOCALTIME_R is undefinied - Original commit message from CVS: - Patch by: Vincent Torri <vtorri at univ-evry dot fr> - * ext/pango/gstclockoverlay.c: (gst_clock_overlay_render_time): - Fix unused variable warning if HAVE_LOCALTIME_R is undefinied - * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps): - * gst/audioresample/gstaudioresample.c: (audioresample_do_output): - Use the correct format strings for integer formats. - -2007-04-14 17:18:14 +0000 Sébastien Moutte <sebastien@moutte.net> - - docs/plugins/inspect/: Add xml doc files for Windows sinks - Original commit message from CVS: - * docs/plugins/inspect/plugin-directdraw.xml: - * docs/plugins/inspect/plugin-directsound.xml: - * docs/plugins/inspect/plugin-waveform.xml: - Add xml doc files for Windows sinks - * win32/vs6/libgstqtdemux.dsp: - * win32/vs6/libgstmpegvideoparse.dsp: - * win32/vs6/gst_plugins_bad.dsw: - Update projects files. - -2007-04-13 09:20:55 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Protect lists and structures with locks. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), - (gst_rtp_bin_init), (gst_rtp_bin_finalize), (new_ssrc_pad_found), - (create_recv_rtp), (gst_rtp_bin_request_new_pad): - * gst/rtpmanager/gstrtpbin.h: - * gst/rtpmanager/gstrtpclient.c: - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), - (gst_rtp_session_init), (gst_rtp_session_finalize), - (gst_rtp_session_event_recv_rtp_sink), - (gst_rtp_session_event_recv_rtcp_sink), - (gst_rtp_session_chain_recv_rtcp), - (gst_rtp_session_request_new_pad): - Protect lists and structures with locks. - Return FLOW_OK from RTCP messages for now. - -2007-04-12 10:52:02 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Make timescale 32 bits again so we don't screw up the pts_offset calculations. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: - Make timescale 32 bits again so we don't screw up the pts_offset - calculations. - -2007-04-12 08:18:32 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Emit pt map requests and cache results. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), - (create_stream), (gst_rtp_bin_class_init), (pt_map_requested): - Emit pt map requests and cache results. - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_class_init), - (gst_jitter_buffer_sink_parse_caps), - (gst_jitter_buffer_sink_setcaps), - (gst_rtp_jitter_buffer_get_clock_rate), - (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): - * gst/rtpmanager/gstrtpjitterbuffer.h: - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): - Emit request-pt-map signals. - -2007-04-11 13:49:54 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin-marshal.list: Some more custom marshallers. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin-marshal.list: - Some more custom marshallers. - * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), - (clock_rate_request), (create_stream), (gst_rtp_bin_class_init), - (pt_map_requested), (new_ssrc_pad_found), (create_recv_rtp): - * gst/rtpmanager/gstrtpbin.h: - Prepare for caching pt maps. - Connect to signals to collect pt maps. - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_class_init), - (gst_jitter_buffer_sink_setcaps), (gst_rtp_jitter_buffer_loop): - * gst/rtpmanager/gstrtpjitterbuffer.h: - Add request_clock_rate signal. - Use scale insteat of scale_int because the later does not deal with - negative numbers. - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_class_init), - (gst_rtp_pt_demux_chain): - * gst/rtpmanager/gstrtpptdemux.h: - Implement request-pt-map signal. - -2007-04-11 09:53:38 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/: Handle version 1 mdhd atoms to get extended precision durations. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), - (qtdemux_parse_samples), (qtdemux_parse_segments), - (qtdemux_parse_trak), (qtdemux_parse_tree): - * gst/qtdemux/qtdemux_dump.c: (qtdemux_dump_mdhd): - Handle version 1 mdhd atoms to get extended precision durations. - Fixes #426972. - -2007-04-10 09:14:07 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Added custom marshallers for signals. - Original commit message from CVS: - * gst/rtpmanager/.cvsignore: - * gst/rtpmanager/Makefile.am: - * gst/rtpmanager/gstrtpbin-marshal.list: - Added custom marshallers for signals. - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init): - * gst/rtpmanager/gstrtpbin.h: - Prepare for emiting pt map signals. - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_class_init): - * gst/rtpmanager/gstrtpssrcdemux.c: - (gst_rtp_ssrc_demux_class_init): - Fix signals. - -2007-04-06 12:28:29 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.*: Provide a clock. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_class_init), - (gst_rtp_bin_init), (gst_rtp_bin_provide_clock): - * gst/rtpmanager/gstrtpbin.h: - Provide a clock. - -2007-04-06 12:07:30 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.c: Fix pad template name parsing. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (create_rtcp): - Fix pad template name parsing. - -2007-04-05 16:10:24 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpjitterbuffer.c: Add some debug and comments. - Original commit message from CVS: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_jitter_buffer_sink_setcaps), (gst_rtp_jitter_buffer_chain), - (gst_rtp_jitter_buffer_loop): - Add some debug and comments. - Fix double unref() in error cases. - -2007-04-05 15:05:24 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/gstrtpxqtdepay.*: Try to recover from packet loss a little better. - Original commit message from CVS: - * gst/qtdemux/gstrtpxqtdepay.c: (gst_rtp_xqt_depay_process), - (gst_rtp_xqt_depay_change_state): - * gst/qtdemux/gstrtpxqtdepay.h: - Try to recover from packet loss a little better. - -2007-04-05 13:54:23 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/gstrtpbin.*: Add debugging category. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (find_session_by_id), - (create_session), (find_stream_by_ssrc), (create_stream), - (gst_rtp_bin_class_init), (new_payload_found), - (new_ssrc_pad_found), (create_recv_rtp), (create_recv_rtcp), - (create_send_rtp), (create_rtcp): - * gst/rtpmanager/gstrtpbin.h: - Add debugging category. - Added RTPStream to manage stream per SSRC, each with its own - jitterbuffer and ptdemux. - Added SSRCDemux. - Connect to various SSRC and PT signals and create ghostpads, link stuff. - * gst/rtpmanager/gstrtpmanager.c: (plugin_init): - Added rtpbin to elements. - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): - Fix caps and forward GstFlowReturn - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), - (gst_rtp_session_event_recv_rtp_sink), - (gst_rtp_session_chain_recv_rtp), - (gst_rtp_session_event_recv_rtcp_sink), - (gst_rtp_session_chain_recv_rtcp), - (gst_rtp_session_event_send_rtp_sink), - (gst_rtp_session_chain_send_rtp), (create_recv_rtp_sink), - (create_recv_rtcp_sink), (create_send_rtp_sink), (create_rtcp_src), - (gst_rtp_session_request_new_pad): - Add debug category. - Add event handling - * gst/rtpmanager/gstrtpssrcdemux.c: (find_rtp_pad_for_ssrc), - (create_rtp_pad_for_ssrc), (gst_rtp_ssrc_demux_class_init), - (gst_rtp_ssrc_demux_init), (gst_rtp_ssrc_demux_chain), - (gst_rtp_ssrc_demux_change_state): - * gst/rtpmanager/gstrtpssrcdemux.h: - Add debug category. - Add new-pt-pad signal. + * sys/va/gstvabasedec.c: + * sys/va/gstvabasedec.h: + va: basedec: Add device-path read-only property. + And elements will notify the used device-path if display is DRM. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1844> + +2022-03-04 13:34:50 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvah264enc.c: + vah264enc: Remove GST_PARAM_CONDITIONALLY_AVAILABLE. + Since it's used only when the property is conditionally installed, and + these parameters are always installed. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1845> + +2022-03-04 09:15:42 +0100 He Junyan <junyan.he@intel.com> + + * sys/va/gstvaencoder.c: + va: encoder: Clean dead code. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1845> + +2022-03-03 14:08:16 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvaencoder.c: + va: encoder: Fix error code path when open. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1845> + +2022-03-03 13:57:35 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvah264enc.c: + vah264enc: Remove preferred_output_delay. + In the current state of the encoder it's just dead code. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1845> + +2022-03-03 09:59:28 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvaencoder.c: + * sys/va/gstvaencoder.h: + * sys/va/gstvah264enc.c: + vah264enc: Avoid mapping coded buffer twice. + Currently for copying the coded buffer onto a GStreamer buffer, the + coded buffer is mapped two times: one for getting the size, and later + for do the actual copy. We can avoid this by doing directly in the + element rather than in the general encoder object. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1845> + +2022-03-02 20:53:16 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + + * sys/va/gstvaencoder.c: + * sys/va/gstvaencoder.h: + * sys/va/gstvah264enc.c: + vah264enc: Single parameter array per picture. + There's no need, at least in H.264, to hold a global parameter array, + since there's no need to submit SPS, trellis, hdr or quality in every + buffer, but only on IDR ones. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1845> -2007-04-05 13:49:21 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2022-03-02 20:06:01 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * po/nl.po: - update dutch - Original commit message from CVS: - update dutch - -2007-04-05 13:45:15 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - po/: Added Danish translation. - Original commit message from CVS: - submitted by: Mogens Jaeger <mogens@jaeger.tf> - * po/LINGUAS: - * po/da.po: - Added Danish translation. - -2007-04-04 10:23:15 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Added simple SSRC demuxer. - Original commit message from CVS: - * gst/rtpmanager/Makefile.am: - * gst/rtpmanager/gstrtpmanager.c: (plugin_init): - * gst/rtpmanager/gstrtpssrcdemux.c: (find_pad_for_ssrc), - (create_pad_for_ssrc), (gst_rtp_ssrc_demux_base_init), - (gst_rtp_ssrc_demux_class_init), (gst_rtp_ssrc_demux_init), - (gst_rtp_ssrc_demux_finalize), (gst_rtp_ssrc_demux_sink_event), - (gst_rtp_ssrc_demux_chain), (gst_rtp_ssrc_demux_src_event), - (gst_rtp_ssrc_demux_change_state): - * gst/rtpmanager/gstrtpssrcdemux.h: - Added simple SSRC demuxer. - -2007-04-04 07:36:28 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/jack/gstjackaudiosink.c: Try t better name clients. properly handle return codes when re- establishing links. - Original commit message from CVS: - * ext/jack/gstjackaudiosink.c: (gst_jack_ring_buffer_open_device), - (gst_jack_ring_buffer_acquire): - Try t better name clients. properly handle return codes when re- - establishing links. - -2007-04-03 22:36:47 +0000 David Schleef <ds@schleef.org> - - sys/glsink/glimagesink.c: Fix handling of video/x-raw-yuv. Add overlay handling. - Original commit message from CVS: - * sys/glsink/glimagesink.c: - Fix handling of video/x-raw-yuv. Add overlay handling. - -2007-04-03 13:27:21 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - update with rtp plugin - Original commit message from CVS: - update with rtp plugin - -2007-04-03 11:35:39 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/: Some more ghostpad magic. - Original commit message from CVS: - * gst/rtpmanager/gstrtpbin.c: (find_session_by_id), - (create_session), (gst_rtp_bin_base_init), (create_recv_rtp), - (create_recv_rtcp), (create_send_rtp), (create_rtcp), - (gst_rtp_bin_request_new_pad): - * gst/rtpmanager/gstrtpbin.h: - * gst/rtpmanager/gstrtpclient.c: - Some more ghostpad magic. - -2007-04-03 09:51:13 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/rtpmanager/Makefile.am: Add .h file so it can be disted properly. - Original commit message from CVS: - * gst/rtpmanager/Makefile.am: - Add .h file so it can be disted properly. - -2007-04-03 09:13:17 +0000 Wim Taymans <wim.taymans@gmail.com> - - Add RTP session management elements. Still in progress. - Original commit message from CVS: - * configure.ac: - * gst/rtpmanager/Makefile.am: - * gst/rtpmanager/async_jitter_queue.c: (async_jitter_queue_new), - (signal_waiting_threads), (async_jitter_queue_ref), - (async_jitter_queue_ref_unlocked), - (async_jitter_queue_set_low_threshold), - (async_jitter_queue_set_high_threshold), - (async_jitter_queue_set_max_queue_length), - (async_jitter_queue_get_g_queue), (calculate_ts_diff), - (async_jitter_queue_length_ts_units_unlocked), - (async_jitter_queue_unref_and_unlock), (async_jitter_queue_unref), - (async_jitter_queue_lock), (async_jitter_queue_unlock), - (async_jitter_queue_push), (async_jitter_queue_push_unlocked), - (async_jitter_queue_push_sorted), - (async_jitter_queue_push_sorted_unlocked), - (async_jitter_queue_insert_after_unlocked), - (async_jitter_queue_pop_intern_unlocked), (async_jitter_queue_pop), - (async_jitter_queue_pop_unlocked), (async_jitter_queue_length), - (async_jitter_queue_length_unlocked), - (async_jitter_queue_set_flushing_unlocked), - (async_jitter_queue_unset_flushing_unlocked), - (async_jitter_queue_set_blocking_unlocked): - * gst/rtpmanager/async_jitter_queue.h: - * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_base_init), - (gst_rtp_bin_class_init), (gst_rtp_bin_init), - (gst_rtp_bin_finalize), (gst_rtp_bin_set_property), - (gst_rtp_bin_get_property), (gst_rtp_bin_change_state), - (gst_rtp_bin_request_new_pad), (gst_rtp_bin_release_pad): - * gst/rtpmanager/gstrtpbin.h: - * gst/rtpmanager/gstrtpclient.c: (new_pad), (create_stream), - (free_stream), (find_stream_by_ssrc), (gst_rtp_client_base_init), - (gst_rtp_client_class_init), (gst_rtp_client_init), - (gst_rtp_client_finalize), (gst_rtp_client_set_property), - (gst_rtp_client_get_property), (gst_rtp_client_change_state), - (gst_rtp_client_request_new_pad), (gst_rtp_client_release_pad): - * gst/rtpmanager/gstrtpclient.h: - * gst/rtpmanager/gstrtpjitterbuffer.c: - (gst_rtp_jitter_buffer_base_init), - (gst_rtp_jitter_buffer_class_init), (gst_rtp_jitter_buffer_init), - (gst_rtp_jitter_buffer_dispose), (gst_rtp_jitter_buffer_getcaps), - (gst_jitter_buffer_sink_setcaps), (free_func), - (gst_rtp_jitter_buffer_flush_start), - (gst_rtp_jitter_buffer_flush_stop), - (gst_rtp_jitter_buffer_src_activate_push), - (gst_rtp_jitter_buffer_change_state), (priv_compare_rtp_seq_lt), - (compare_rtp_buffers_seq_num), (gst_rtp_jitter_buffer_sink_event), - (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop), - (gst_rtp_jitter_buffer_query), - (gst_rtp_jitter_buffer_set_property), - (gst_rtp_jitter_buffer_get_property): - * gst/rtpmanager/gstrtpjitterbuffer.h: - * gst/rtpmanager/gstrtpmanager.c: (plugin_init): - * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_base_init), - (gst_rtp_pt_demux_class_init), (gst_rtp_pt_demux_init), - (gst_rtp_pt_demux_finalize), (gst_rtp_pt_demux_chain), - (gst_rtp_pt_demux_getcaps), (find_pad_for_pt), - (gst_rtp_pt_demux_setup), (gst_rtp_pt_demux_release), - (gst_rtp_pt_demux_change_state): - * gst/rtpmanager/gstrtpptdemux.h: - * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_base_init), - (gst_rtp_session_class_init), (gst_rtp_session_init), - (gst_rtp_session_finalize), (gst_rtp_session_set_property), - (gst_rtp_session_get_property), (gst_rtp_session_change_state), - (gst_rtp_session_chain_recv_rtp), - (gst_rtp_session_chain_recv_rtcp), - (gst_rtp_session_chain_send_rtp), (create_recv_rtp_sink), - (create_recv_rtcp_sink), (create_send_rtp_sink), (create_rtcp_src), - (gst_rtp_session_request_new_pad), (gst_rtp_session_release_pad): - * gst/rtpmanager/gstrtpsession.h: - Add RTP session management elements. Still in progress. - -2007-03-30 04:50:11 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/: Don't play audioconvert. As wavpack wants/outputs all samples with width==32 and depth=1,32 accept th... - Original commit message from CVS: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_reset), - (gst_wavpack_dec_init), (gst_wavpack_dec_sink_set_caps), - (gst_wavpack_dec_clip_outgoing_buffer), - (gst_wavpack_dec_post_tags), (gst_wavpack_dec_chain): - * ext/wavpack/gstwavpackdec.h: - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_reset), - (gst_wavpack_enc_sink_set_caps), (gst_wavpack_enc_set_wp_config), - (gst_wavpack_enc_chain): - * ext/wavpack/gstwavpackenc.h: - * ext/wavpack/gstwavpackparse.c: - Don't play audioconvert. As wavpack wants/outputs all samples with - width==32 and depth=1,32 accept this and let audioconvert convert - to accepted formats instead of doing it in the element for n*8 depths. - This also adds support for non-n*8 depths and prevents some useless - memory allocations. Fixes #421598 - Also add a workaround for bug #421542 in wavpackenc for now... - * tests/check/elements/wavpackdec.c: (GST_START_TEST): - * tests/check/elements/wavpackenc.c: (GST_START_TEST): - * tests/check/elements/wavpackparse.c: (GST_START_TEST): - Consider the change above in the unit tests and test if the correct - caps are accepted and set. Also check for GST_BUFFER_OFFSET_END in - the wavpackparse unit test. - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_init), - (gst_wavpack_dec_sink_set_caps): - Set caps on the src pad as soon as possible. - * ext/wavpack/gstwavpackdec.h: - * ext/wavpack/gstwavpackcommon.h: - * ext/wavpack/gstwavpackenc.h: - * ext/wavpack/gstwavpackparse.h: - Fix indention. gst-indent is now called by cicl. - -2007-03-28 15:17:27 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/: Process 'ctts' atoms, which are present in AVC ISO files (.mov files with h264 video). - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_prepare_current_sample), - (gst_qtdemux_chain), (qtdemux_parse_samples): - * gst/qtdemux/qtdemux_dump.c: (qtdemux_dump_ctts): - * gst/qtdemux/qtdemux_dump.h: - * gst/qtdemux/qtdemux_fourcc.h: - * gst/qtdemux/qtdemux_types.c: - Process 'ctts' atoms, which are present in AVC ISO files (.mov files - with h264 video). - Use the offset present in 'ctts' to calculate the PTS for each packet - and set the PTS on outgoing buffers. - Fixes #423283 - -2007-03-27 18:00:56 +0000 Julien Moutte <julien@moutte.net> - - ext/xvid/gstxviddec.c: Add some debug log and fix a stupid output buffer duration bug. - Original commit message from CVS: - 2007-03-27 Julien MOUTTE <julien@moutte.net> - * ext/xvid/gstxviddec.c: (gst_xviddec_chain): Add some - debug log and fix a stupid output buffer duration bug. - -2007-03-26 14:49:47 +0000 Christian Schaller <uraeus@gnome.org> - - * common: - * gst-plugins-bad.spec.in: - update spec file for x264 encoder - Original commit message from CVS: - update spec file for x264 encoder - -2007-03-25 13:06:26 +0000 Michal Benes <michal.benes@itonis.tv> - - Add libx264-based h264 encoder plugin (#421110). Probably doesn't handle 'odd' widths and heights correctly yet. - Original commit message from CVS: - Patch by: Michal Benes <michal.benes at itonis tv> - Patch by: Josef Zlomek <josef.zlomek at itonis tv> - * configure.ac: - * ext/Makefile.am: - * ext/x264/Makefile.am: - * ext/x264/gstx264enc.c: (gst_x264_enc_me_get_type), - (gst_x264_enc_analyse_get_type), - (gst_x264_enc_timestamp_queue_init), - (gst_x264_enc_timestamp_queue_free), - (gst_x264_enc_timestamp_queue_put), - (gst_x264_enc_timestamp_queue_get), (gst_x264_enc_header_buf), - (gst_x264_enc_set_src_caps), (gst_x264_enc_sink_set_caps), - (gst_x264_enc_base_init), (gst_x264_enc_class_init), - (gst_x264_enc_init), (gst_x264_enc_init_encoder), - (gst_x264_enc_close_encoder), (gst_x264_enc_dispose), - (gst_x264_enc_sink_event), (gst_x264_enc_chain), - (gst_x264_enc_encode_frame), (gst_x264_enc_change_state), - (gst_x264_enc_set_property), (gst_x264_enc_get_property), - (plugin_init): - * ext/x264/gstx264enc.h: - Add libx264-based h264 encoder plugin (#421110). Probably doesn't - handle 'odd' widths and heights correctly yet. - -2007-03-24 19:46:59 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/interleave/deinterleave.c: Remove 'channel-positions' field when munging input caps into 1-channel output caps (I... - Original commit message from CVS: - * gst/interleave/deinterleave.c: (gst_deinterleave_sink_setcaps): - Remove 'channel-positions' field when munging input caps into - 1-channel output caps (I guess technically we should set the - position for each channel on the output caps if it's non-NONE, - but I'll save that as a task for another day). - -2007-03-23 18:41:52 +0000 Michael Smith <msmith@xiph.org> - - gst/vmnc/vmncdec.c: Redesign to include a parser for raw files (no timestamps in that mode yet, though). - Original commit message from CVS: - * gst/vmnc/vmncdec.c: (gst_vmnc_dec_class_init), - (gst_vmnc_dec_init), (vmnc_dec_finalize), (gst_vmnc_dec_reset), - (vmnc_handle_wmvi_rectangle), (render_colour_cursor), - (render_cursor), (vmnc_make_buffer), (vmnc_handle_wmvd_rectangle), - (vmnc_handle_wmve_rectangle), (vmnc_handle_wmvf_rectangle), - (vmnc_handle_wmvg_rectangle), (vmnc_handle_wmvh_rectangle), - (vmnc_handle_wmvj_rectangle), (render_raw_tile), (render_subrect), - (vmnc_handle_raw_rectangle), (vmnc_handle_copy_rectangle), - (vmnc_handle_hextile_rectangle), (vmnc_handle_packet), - (vmnc_dec_setcaps), (vmnc_dec_chain_frame), (vmnc_dec_chain), - (vmnc_dec_set_property), (vmnc_dec_get_property): - Redesign to include a parser for raw files (no timestamps in that - mode yet, though). - -2007-03-22 22:14:29 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/interleave/deinterleave.c: Don't leak input buffer in chain function; maintain our own list of source pads - ther... - Original commit message from CVS: - * gst/interleave/deinterleave.c: (gst_deinterleave_add_new_pads), - (gst_deinterleave_remove_pads), (gst_deinterleave_process), - (gst_deinterleave_chain): - Don't leak input buffer in chain function; maintain our own list of - source pads - there are no guarantees about the order of the list - in the GstElement struct, and we want a very specific order; lastly, - some more debugging. - -2007-03-22 21:07:02 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/neon/gstneonhttpsrc.c: Alloc user agent string only once. - Original commit message from CVS: - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_init): - Alloc user agent string only once. - -2007-03-22 16:25:56 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackparse.c: Revert last commit, preventing infinite plugging loops with ranks is no clean solution... - Original commit message from CVS: - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_plugin_init): - Revert last commit, preventing infinite plugging loops with ranks - is no clean solution and in general there's no reason why one wants - to parse framed wavpack data again. - -2007-03-22 15:52:51 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackenc.c: Send the new segment event in time format instead of bytes. This allows "wavpackenc ! wa... - Original commit message from CVS: - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_push_block): - Send the new segment event in time format instead of bytes. This - allows "wavpackenc ! wavpackdec ! someaudiosink" pipelines. - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_plugin_init): - Accept framed and non-framed input, wavpackparse doesn't care. To - prevent "wavpackparse ! wavpackparse ! ..." pipelines lower the - rank of wavpackparse by one. This allows "wavpackenc ! wavpackparse ! - ..." pipelines. - -2007-03-22 14:37:08 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst-libs/gst/app/Makefile.am: Use GST_ALL_LDFLAGS, which actually exists, but maybe David can confirm that was what h... - Original commit message from CVS: - * gst-libs/gst/app/Makefile.am: - Use GST_ALL_LDFLAGS, which actually exists, but maybe David - can confirm that was what he wanted. - -2007-03-22 11:08:03 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackdec.c: Revert to use gst_pad_alloc_buffer() here. We can and should use it. - Original commit message from CVS: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): - Revert to use gst_pad_alloc_buffer() here. We can and should use it. - Thanks to Jan and Mike for noticing my mistake. - -2007-03-22 00:17:41 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackenc.*: Put the write helpers into the GstWavpackEnc struct directly and not as a pointer to sav... - Original commit message from CVS: - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init), - (gst_wavpack_enc_init), (gst_wavpack_enc_chain), - (gst_wavpack_enc_rewrite_first_block): - * ext/wavpack/gstwavpackenc.h: - Put the write helpers into the GstWavpackEnc struct directly and not - as a pointer to save two small, but useless mallocs. This also makes - it possible to drop the finalize method. - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_push_buffer): - For consistency reasons also set GST_BUFFER_OFFSET_END on the outgoing - buffers the same way wavpackenc does it. - -2007-03-21 23:50:09 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackdec.c: Don't use gst_pad_alloc_buffer() as we might clip the buffer later and - Original commit message from CVS: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): - Don't use gst_pad_alloc_buffer() as we might clip the buffer later and - BaseTransform-based elements will likely break because of wrong - unit-size. Also plug a possible memleak that happens when decoding - fails for some reason. - -2007-03-18 17:57:48 +0000 Paul Davis <paul@linuxaudiosystems.com> - - ext/jack/gstjackaudioclient.c: Don't need to take the connection lock, it will not be used and could cause deadlocks. - Original commit message from CVS: - Based on patch by: Paul Davis <paul at linuxaudiosystems dot com> - * ext/jack/gstjackaudioclient.c: (gst_jack_audio_unref_connection): - Don't need to take the connection lock, it will not be used and could - cause deadlocks. - -2007-03-16 18:38:18 +0000 Edward Hervey <bilboed@bilboed.com> - - sys/osxvideo/osxvideosink.m: Fix previous commit, we want to pass the NSView in the message. - Original commit message from CVS: - * sys/osxvideo/osxvideosink.m: - Fix previous commit, we want to pass the NSView in the message. - -2007-03-16 16:27:20 +0000 Edward Hervey <bilboed@bilboed.com> - - sys/osxvideo/osxvideosink.m: Emit 'have-ns-view' message when working in embedded mode. The message will contain a po... - Original commit message from CVS: - * sys/osxvideo/osxvideosink.m: - Emit 'have-ns-view' message when working in embedded mode. The message - will contain a pointer to the newly created NSView. - -2007-03-16 11:22:47 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/mpegvideoparse/: Move the MPEG specific byte parsing into the mpegpacketiser code. - Original commit message from CVS: - * gst/mpegvideoparse/mpegpacketiser.c: (mpeg_util_find_start_code), - (collect_packets), (set_par_from_dar), (set_fps_from_code), - (mpeg_util_parse_extension_packet), (mpeg_util_parse_sequence_hdr), - (mpeg_util_parse_picture_hdr): - * gst/mpegvideoparse/mpegpacketiser.h: - * gst/mpegvideoparse/mpegvideoparse.c: - (mpegvideoparse_handle_sequence), (mpegvideoparse_handle_picture), - (mpegvideoparse_drain_avail), (gst_mpegvideoparse_chain), - (mpv_parse_sink_event), (plugin_init): - * gst/mpegvideoparse/mpegvideoparse.h: - Move the MPEG specific byte parsing into the mpegpacketiser code. - Add parsing of picture types, that just feeds into a debug message - for now. - Fix some 64-bit format strings. + * sys/va/plugin.c: + va: Fix log message + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1845> -2007-03-16 10:15:48 +0000 Stefan Kost <ensonic@users.sourceforge.net> +2022-03-04 09:57:02 +0000 Philippe Normand <philn@igalia.com> - * ChangeLog: - Changelog surgery - Original commit message from CVS: - Changelog surgery - -2007-03-16 09:57:40 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/equalizer/gstiirequalizer10bands.c: A 10 band EQ should be initialized to 1 bands and not to 3. - Original commit message from CVS: - * gst/equalizer/gstiirequalizer10bands.c: - (gst_iir_equalizer_10bands_init): - A 10 band EQ should be initialized to 1 bands and not to 3. - -2007-03-15 20:48:08 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Port mpeg1videoparse to 0.10 and give it rank SECONDARY-1, so that it's below existing decoders. - Original commit message from CVS: - * configure.ac: - * gst/mpeg1videoparse/Makefile.am: - * gst/mpeg1videoparse/gstmp1videoparse.c: - * gst/mpeg1videoparse/gstmp1videoparse.h: - * gst/mpeg1videoparse/mp1videoparse.vcproj: - * gst/mpegvideoparse/Makefile.am: - * gst/mpegvideoparse/mpegpacketiser.c: (mpeg_packetiser_init), - (mpeg_packetiser_free), (mpeg_packetiser_add_buf), - (mpeg_packetiser_flush), (mpeg_find_start_code), - (get_next_free_block), (complete_current_block), - (append_to_current_block), (start_new_block), (handle_packet), - (collect_packets), (mpeg_packetiser_handle_eos), - (mpeg_packetiser_get_block), (mpeg_packetiser_next_block): - * gst/mpegvideoparse/mpegpacketiser.h: - * gst/mpegvideoparse/mpegvideoparse.c: (mpegvideoparse_get_type), - (gst_mpegvideoparse_base_init), (gst_mpegvideoparse_class_init), - (mpv_parse_reset), (gst_mpegvideoparse_init), - (gst_mpegvideoparse_dispose), (set_par_from_dar), - (set_fps_from_code), (mpegvideoparse_parse_seq), - (gst_mpegvideoparse_time_code), (gst_mpegvideoparse_flush), - (mpegvideoparse_drain_avail), (gst_mpegvideoparse_chain), - (mpv_parse_sink_event), (gst_mpegvideoparse_change_state), - (plugin_init): - * gst/mpegvideoparse/mpegvideoparse.h: - * gst/mpegvideoparse/mpegvideoparse.vcproj: - Port mpeg1videoparse to 0.10 and give it rank SECONDARY-1, so - that it's below existing decoders. - Rename it to mpegvideoparse to reflect that it handles MPEG-1 and - MPEG-2 now. - Re-write the parsing code so that it collects packets differently - and timestamps Picture packets correctly. - Add a list of FIXME's at the top. - -2007-03-15 10:52:21 +0000 Michael Smith <msmith@xiph.org> - - gst/audioresample/gstaudioresample.c: Don't trigger discontinuities for very small imperfections; a filter flush will... - Original commit message from CVS: - * gst/audioresample/gstaudioresample.c: - (audioresample_check_discont), (audioresample_transform): - Don't trigger discontinuities for very small imperfections; a filter - flush will sound bad, and many plugins have rounding errors leading - to these. - -2007-03-14 17:16:30 +0000 Julien Moutte <julien@moutte.net> - - gst/audioresample/gstaudioresample.c: Handle discontinuous streams. - Original commit message from CVS: - 2007-03-14 Julien MOUTTE <julien@moutte.net> - * gst/audioresample/gstaudioresample.c: (gst_audioresample_init), - (audioresample_transform_size), (audioresample_do_output), - (audioresample_transform), (audioresample_pushthrough): Handle - discontinuous streams. - * gst/audioresample/gstaudioresample.h: - * tests/check/elements/audioresample.c: - (test_discont_stream_instance), (GST_START_TEST), - (audioresample_suite): Add a test for discontinuous streams. - * win32/common/config.h: Updated. - -2007-03-14 16:33:03 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/icles/equalizer-test.c: Port the example to new equalizer api. - Original commit message from CVS: - * tests/icles/equalizer-test.c: (equalizer_set_band_value), - (equalizer_set_all_band_values), - (equalizer_set_band_value_and_wait), - (equalizer_set_all_band_values_and_wait), (do_slider_fiddling), - (main): - Port the example to new equalizer api. - -2007-03-14 16:30:19 +0000 Edward Hervey <bilboed@bilboed.com> - - sys/osxvideo/: Fix leaks when running a NSApp. - Original commit message from CVS: - * sys/osxvideo/cocoawindow.h: - * sys/osxvideo/cocoawindow.m: - * sys/osxvideo/osxvideosink.h: - * sys/osxvideo/osxvideosink.m: - Fix leaks when running a NSApp. - Accept any kind of resolutions. - Works in fullscreen. Can maximize. - Only thing left before being able to move this to -good is documentation - and embedded window support. - -2007-03-14 15:33:25 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - po/: Updated translations. - Original commit message from CVS: - * po/hu.po: - * po/it.po: - * po/sv.po: - Updated translations. - -2007-03-14 14:48:12 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst/audioresample/: Since I really am not interested in a debug line for each sample being processed, move the librar... - Original commit message from CVS: - * gst/audioresample/debug.h: - * gst/audioresample/resample.c: (resample_init): - Since I really am not interested in a debug line for each sample - being processed, move the library's debugging to its own category, - libaudioresample - -2007-03-14 14:48:08 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/equalizer/: Add 3 and 10 band version and add missing gst_object_sync_values. - Original commit message from CVS: - * gst/equalizer/Makefile.am: - * gst/equalizer/gstiirequalizer.c: (_do_init), - (gst_iir_equalizer_band_set_property), - (gst_iir_equalizer_band_class_init), - (gst_iir_equalizer_band_get_type), - (gst_iir_equalizer_child_proxy_get_child_by_index), - (gst_iir_equalizer_child_proxy_get_children_count), - (gst_iir_equalizer_child_proxy_interface_init), (setup_filter), - (gst_iir_equalizer_compute_frequencies), - (gst_iir_equalizer_transform_ip), (plugin_init): - * gst/equalizer/gstiirequalizer10bands.c: - (gst_iir_equalizer_10bands_base_init), - (gst_iir_equalizer_10bands_class_init), - (gst_iir_equalizer_10bands_init), - (gst_iir_equalizer_10bands_set_property), - (gst_iir_equalizer_10bands_get_property): - * gst/equalizer/gstiirequalizer10bands.h: - * gst/equalizer/gstiirequalizer3bands.c: - (gst_iir_equalizer_3bands_base_init), - (gst_iir_equalizer_3bands_class_init), - (gst_iir_equalizer_3bands_init), - (gst_iir_equalizer_3bands_set_property), - (gst_iir_equalizer_3bands_get_property): - * gst/equalizer/gstiirequalizer3bands.h: - * gst/equalizer/gstiirequalizernbands.c: - (gst_iir_equalizer_nbands_base_init), - (gst_iir_equalizer_nbands_init): - Add 3 and 10 band version and add missing gst_object_sync_values. - * gst/spectrum/gstspectrum.c: (gst_spectrum_event), - (gst_spectrum_transform_ip): - Add some comments about float support. - -2007-03-14 14:09:21 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/audioresample/gstaudioresample.c: - add debugging and reformat docs - Original commit message from CVS: - add debugging and reformat docs - -2007-03-13 18:01:47 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/mpegaudioparse/: Remove bogus 2nd copy of mp3parse - it's actually in -ugly. - Original commit message from CVS: - * gst/mpegaudioparse/Makefile.am: - * gst/mpegaudioparse/gstmpegaudioparse.c: - * gst/mpegaudioparse/gstmpegaudioparse.h: - * gst/mpegaudioparse/mpegaudioparse.vcproj: - Remove bogus 2nd copy of mp3parse - it's actually - in -ugly. - -2007-03-12 11:47:42 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - examples/app/.cvsignore: The buildbot demands .cvsignore files, and I comply. - Original commit message from CVS: - * examples/app/.cvsignore: - The buildbot demands .cvsignore files, and I comply. - -2007-03-11 22:23:04 +0000 Sébastien Moutte <sebastien@moutte.net> - - sys/directdraw/gstdirectdrawsink.*: Handle display mode changes during playback. - Original commit message from CVS: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - Handle display mode changes during playback. - -2007-03-11 00:48:26 +0000 David Schleef <ds@schleef.org> - - Add appsrc/appsink example. - Original commit message from CVS: - * configure.ac: - * examples/Makefile.am: - * examples/app/Makefile.am: - * examples/app/appsrc_ex.c: - Add appsrc/appsink example. - * gst-libs/gst/app/Makefile.am: - * gst-libs/gst/app/gstapp.c: - * gst-libs/gst/app/gstappsink.c: - * gst-libs/gst/app/gstappsink.h: - * gst/app/gstapp.c: - Add appsink. - -2007-03-10 20:10:09 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/: Printf format string fixes. - Original commit message from CVS: - * ext/nas/nassink.c: (NAS_createFlow): - * ext/sndfile/gstsfsrc.c: (gst_sf_src_create): - Printf format string fixes. - -2007-03-09 08:58:26 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/equalizer/: Refactor plugin into a base class and a first subclass (nband eq). The nband eq uses GstChildProxy an... - Original commit message from CVS: - * gst/equalizer/Makefile.am: - * gst/equalizer/gstiirequalizer.c: (_do_init), - (gst_iir_equalizer_band_set_property), - (gst_iir_equalizer_band_get_property), - (gst_iir_equalizer_band_class_init), - (gst_iir_equalizer_band_get_type), - (gst_iir_equalizer_child_proxy_get_child_by_index), - (gst_iir_equalizer_child_proxy_get_children_count), - (gst_iir_equalizer_child_proxy_interface_init), - (gst_iir_equalizer_base_init), (gst_iir_equalizer_class_init), - (gst_iir_equalizer_finalize), (setup_filter), - (gst_iir_equalizer_compute_frequencies), - (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), - (gst_iir_equalizer_setup), (plugin_init): - * gst/equalizer/gstiirequalizer.h: - * gst/equalizer/gstiirequalizernbands.c: - (gst_iir_equalizer_nbands_base_init), - (gst_iir_equalizer_nbands_class_init), - (gst_iir_equalizer_nbands_init), - (gst_iir_equalizer_nbands_set_property), - (gst_iir_equalizer_nbands_get_property): - * gst/equalizer/gstiirequalizernbands.h: - Refactor plugin into a base class and a first subclass (nband eq). The - nband eq uses GstChildProxy and is controlable. More subclasses will - follow. - -2007-03-08 15:24:52 +0000 Paul Davis <paul@linuxaudiosystems.com> - - ext/jack/: Make an object to manage client connections to the jack server which we will use in the future to run sele... - Original commit message from CVS: - Includes patch by: Paul Davis <paul at linuxaudiosystems dot com> - * ext/jack/Makefile.am: - * ext/jack/gstjackaudioclient.c: (gst_jack_audio_client_init), - (jack_process_cb), (jack_sample_rate_cb), (jack_buffer_size_cb), - (jack_shutdown_cb), (connection_find), - (gst_jack_audio_make_connection), (gst_jack_audio_get_connection), - (gst_jack_audio_unref_connection), - (gst_jack_audio_connection_add_client), - (gst_jack_audio_connection_remove_client), - (gst_jack_audio_client_new), (gst_jack_audio_client_free), - (gst_jack_audio_client_get_client), - (gst_jack_audio_client_set_active): - * ext/jack/gstjackaudioclient.h: - Make an object to manage client connections to the jack server which we - will use in the future to run selected jack elements with the same jack - connection. - Make some stuff a bit more threadsafe. - Activate the jack client ASAP. - * ext/jack/gstjackaudiosink.c: - (gst_jack_audio_sink_allocate_channels), - (gst_jack_audio_sink_free_channels), (jack_process_cb), - (gst_jack_ring_buffer_open_device), - (gst_jack_ring_buffer_close_device), - (gst_jack_ring_buffer_acquire), (gst_jack_ring_buffer_release), - (gst_jack_audio_sink_class_init), (gst_jack_audio_sink_init), - (gst_jack_audio_sink_getcaps): - * ext/jack/gstjackaudiosink.h: - Use new client object to manage connections. - Don't remove and recreate all ports, try to reuse them. - -2007-03-07 12:07:07 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/: Use a general wavpack debug category for common code. - Original commit message from CVS: - * ext/wavpack/gstwavpack.c: (plugin_init): - * ext/wavpack/gstwavpackcommon.c: - Use a general wavpack debug category for common code. - * ext/wavpack/gstwavpackstreamreader.c: - (gst_wavpack_stream_reader_set_pos_abs), - (gst_wavpack_stream_reader_set_pos_rel), - (gst_wavpack_stream_reader_write_bytes): - Use the general wavpack debug category here too and add debug - output to the functions that should not be called at all by - the wavpack library. - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_plugin_init): - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_plugin_init): - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_plugin_init): - Change debugging category names to conform to the conventions. - -2007-03-07 11:37:23 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.*: Share qtdemux debug category across all files, otherwise all debugging in files other than qtd... - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: - * gst/qtdemux/qtdemux.h: - Share qtdemux debug category across all files, otherwise all debugging - in files other than qtdemux.c would end up in the default category. - -2007-03-07 11:23:20 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/gstspectrum.*: One FIXME less, by resolving message timestamps against the playback segment. - Original commit message from CVS: - * gst/spectrum/gstspectrum.c: (gst_spectrum_start), - (gst_spectrum_event), (gst_spectrum_transform_ip): - * gst/spectrum/gstspectrum.h: - One FIXME less, by resolving message timestamps against the playback - segment. - -2007-03-06 13:57:55 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/spectrum/gstspectrum.c: Fix and cleanup default property values. - Original commit message from CVS: - * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), - (gst_spectrum_init), (gst_spectrum_set_property), - (gst_spectrum_transform_ip): - Fix and cleanup default property values. - Add FIXMEs for stuff that looks rather wrong. - -2007-03-05 08:30:52 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/: Remove two obsolete and confusing comments. - Original commit message from CVS: - * gst/spectrum/demo-audiotest.c: (message_handler): - * gst/spectrum/demo-osssrc.c: (message_handler): - Remove two obsolete and confusing comments. - -2007-03-04 21:36:50 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/nas/nassink.c: Some more cleanups/changes; use boilerplate macro. - Original commit message from CVS: - * ext/nas/nassink.c: (gst_nas_sink_class_init), - (gst_nas_sink_init), (gst_nas_sink_getcaps), - (gst_nas_sink_unprepare): - Some more cleanups/changes; use boilerplate macro. - -2007-03-04 20:35:26 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/nas/: Bunch of nassink clean-ups: make build by adding the right CFLAGS and LIBS to Makefile.am; rename structure... - Original commit message from CVS: - * ext/nas/Makefile.am: - * ext/nas/README: - * ext/nas/nassink.c: (gst_nas_sink_get_type), - (gst_nas_sink_base_init), (gst_nas_sink_class_init), - (gst_nas_sink_init), (gst_nas_sink_finalize), - (gst_nas_sink_getcaps), (gst_nas_sink_prepare), - (gst_nas_sink_unprepare), (gst_nas_sink_delay), - (gst_nas_sink_reset), (gst_nas_sink_write), - (gst_nas_sink_set_property), (gst_nas_sink_get_property), - (gst_nas_sink_open), (gst_nas_sink_close), (NAS_flush), - (NAS_sendData), (NAS_EventHandler), (gst_nas_sink_sink_get_format), - (NAS_createFlow), (plugin_init): - * ext/nas/nassink.h: - Bunch of nassink clean-ups: make build by adding the right CFLAGS - and LIBS to Makefile.am; rename structure, macros and functions - according to canonical naming scheme; move some things around a bit; - use GST_CAT_DEFAULT instead of GST_CAT_* everywhere; remove README - file that didn't really contain any useful information anyway (the - useful bits have been moved into the 'host' property description). - -2007-03-04 16:38:39 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/directfb/dfbvideosink.c: Chain up in finalize. - Original commit message from CVS: - * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_finalize): - Chain up in finalize. - -2007-03-03 22:28:03 +0000 Michael Smith <msmith@xiph.org> - - Fix up dist. - Original commit message from CVS: - * configure.ac: - * gst/vmnc/Makefile.am: - Fix up dist. - -2007-03-03 22:13:22 +0000 Michael Smith <msmith@xiph.org> - - Add VMnc decoder. - Original commit message from CVS: - * configure.ac: - * gst/vmnc/Makefile.am: - * gst/vmnc/vmncdec.c: (gst_vmnc_dec_base_init), - (gst_vmnc_dec_class_init), (gst_vmnc_dec_init), - (gst_vmnc_dec_reset), (vmnc_handle_wmvi_rectangle), - (render_colour_cursor), (render_cursor), (vmnc_make_buffer), - (vmnc_handle_wmvd_rectangle), (vmnc_handle_wmve_rectangle), - (vmnc_handle_wmvf_rectangle), (vmnc_handle_wmvg_rectangle), - (vmnc_handle_wmvh_rectangle), (vmnc_handle_wmvj_rectangle), - (render_raw_tile), (render_subrect), (vmnc_handle_raw_rectangle), - (vmnc_handle_hextile_rectangle), (vmnc_handle_packet), - (vmnc_dec_setcaps), (vmnc_dec_chain), (vmnc_dec_change_state), - (vmnc_dec_set_property), (vmnc_dec_get_property), (plugin_init): - Add VMnc decoder. - Still missing support for: - - rectangle types I didn't find in my samples (e.g. copy, RRE, - ZRLE) - - alpha-composited cursors - -2007-03-03 10:23:03 +0000 David Schleef <ds@schleef.org> - - gst-libs/gst/app/Makefile.am: Install the headers. - Original commit message from CVS: - * gst-libs/gst/app/Makefile.am: - Install the headers. - -2007-03-03 10:10:30 +0000 David Schleef <ds@schleef.org> - - gst-libs/gst/app/: Add GstAppBuffer that includes a callback and closure for proper handling of data chunks. - Original commit message from CVS: - * gst-libs/gst/app/Makefile.am: - * gst-libs/gst/app/gstappbuffer.c: - * gst-libs/gst/app/gstappbuffer.h: - * gst-libs/gst/app/gstappsrc.c: - Add GstAppBuffer that includes a callback and closure for - proper handling of data chunks. - -2007-03-03 09:06:06 +0000 David Schleef <ds@schleef.org> - - gst-libs/gst/app/gstappsrc.*: Hacking to address issues in 413418. - Original commit message from CVS: - * gst-libs/gst/app/gstappsrc.c: - * gst-libs/gst/app/gstappsrc.h: - Hacking to address issues in 413418. - -2007-03-03 08:16:57 +0000 David Schleef <ds@schleef.org> - - Move the app library to gst-libs/gst/app (duh!) - Original commit message from CVS: - * Makefile.am: - * configure.ac: - * ext/Makefile.am: - * gst-libs/gst/Makefile.am: - * gst-libs/gst/app/Makefile.am: - * gst-libs/gst/app/gstapp.c: - * gst-libs/gst/app/gstappsrc.c: - * gst-libs/gst/app/gstappsrc.h: - * gst/app/Makefile.am: - * gst/app/gstapp.c: - * gst/app/gstappsrc.c: - * gst/app/gstappsrc.h: - Move the app library to gst-libs/gst/app (duh!) + * gst-libs/gst/play/gstplay.c: + * gst-libs/gst/play/gstplay.h: + play: Fix error parsing API + The GError is an out parameter, so should be a ** parameter, like the details + parameter. + Fixes #1063 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1849> -2007-03-02 19:43:48 +0000 Christian Schaller <uraeus@gnome.org> +2021-08-03 12:14:49 +1000 Matthew Waters <matthew@centricular.com> - * ChangeLog: - * configure.ac: - * ext/Makefile.am: - * ext/nas/nassink.c: - * ext/nas/nassink.h: - Commit NAS Sink, closed bugzilla 345633 - Original commit message from CVS: - Commit NAS Sink, closed bugzilla 345633 - -2007-03-02 18:24:14 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/dts/gstdtsdec.c: A few small clean-ups. - Original commit message from CVS: - * ext/dts/gstdtsdec.c: (gst_dtsdec_init), (gst_dtsdec_sink_event): - A few small clean-ups. - * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_setcaps): - More debug output for failure cases. - -2007-03-02 18:10:06 +0000 Young-Ho Cha <ganadist@chollian.net> - - ext/dts/gstdtsdec.c: Don't do forced downmixing to stereo, but check what downstream can do and let libdts do the dow... - Original commit message from CVS: - Patch by: Young-Ho Cha <ganadist at chollian net> - * ext/dts/gstdtsdec.c: (gst_dtsdec_handle_frame), - (gst_dtsdec_change_state): - Don't do forced downmixing to stereo, but check what downstream - can do and let libdts do the downmixing based on that (#400555). + * ext/webrtc/gstwebrtcbin.c: + * ext/webrtc/transportstream.c: + * ext/webrtc/transportstream.h: + * ext/webrtc/webrtctransceiver.c: + * ext/webrtc/webrtctransceiver.h: + * tests/check/elements/webrtcbin.c: + webrtc: support renegotiating adding/removing RTX + We need to always add the RTX/RED/ULPFEC elements as rtpbin will only + call us once to request aux/fec senders/receivers. + We also need to regenerate the media section of the SDP instead of + blindly copying from the previous offer. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1762> + +2022-03-01 11:43:09 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> + + * sys/msdk/gstmsdkenc.c: + msdkenc: Change default ref frames number as 0 + When user does not set ref-frames in pipeline, we should let MediaSDK + decide the reference frame number via setting default value as 0 at + gstreamer side. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1839> + +2022-03-04 04:18:06 +0900 Seungha Yang <seungha@centricular.com> + + * sys/wic/meson.build: + meson: wic: Fix typo + Should check WIC build option, not MediaFoundation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1847> + +2022-03-03 04:22:15 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvdecoder.h: + * sys/qsv/gstqsvencoder.h: + * sys/qsv/gstqsvh264dec.cpp: + * sys/qsv/gstqsvh264enc.cpp: + * sys/qsv/gstqsvh265enc.cpp: + * sys/qsv/gstqsvvp9enc.cpp: + qsv: Remove strcpy for DRM device path + Simplify code. It's just one-time allocation, so don't need to worry + about leaking. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1835> -2007-03-02 13:33:39 +0000 Jan Schmidt <thaytan@mad.scientist.com> +2022-03-03 04:57:42 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - Remove spurious conflict marker - Original commit message from CVS: - Remove spurious conflict marker - -2007-03-02 12:04:02 +0000 Lutz Mueller <lutz@topfrose.de> - - ext/neon/gstneonhttpsrc.*: Simplify _set_uri() and _set_proxy() and remove the unused ishttp member (#388050). - Original commit message from CVS: - Patch by: Lutz Mueller <lutz topfrose de> - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_class_init), - (gst_neonhttp_src_init), (gst_neonhttp_src_set_property), - (gst_neonhttp_src_set_uri), (gst_neonhttp_src_set_proxy), - (gst_neonhttp_src_send_request_and_redirect), - (gst_neonhttp_src_uri_set_uri): - * ext/neon/gstneonhttpsrc.h: - Simplify _set_uri() and _set_proxy() and remove the unused ishttp - member (#388050). - * tests/check/elements/neonhttpsrc.c: (GST_START_TEST): - Fix bogus URI to something that actually exists, otherwise we just - bypass the test (and also to something that doesn't redirect, since - neonhttpsrc doesn't seem to handle this very gracefully yet) + * sys/msdk/gstmsdkcontext.c: + msdk: Don't print error log for missing DRM device path + It's expected in case that such DRM device is unavailable for some reasons, + specifically non-Intel platform or so + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1836> -2007-03-02 11:14:33 +0000 Christian Schaller <uraeus@gnome.org> +2022-01-30 03:11:37 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * configure.ac: - * ext/ivorbis/Makefile.am: - * ext/ivorbis/vorbis.c: - * ext/ivorbis/vorbisdec.c: - * ext/ivorbis/vorbisdec.h: - Add patch from Bug 357055 from Chris Lord, adding support for Vorbis streams - Original commit message from CVS: - Add patch from Bug 357055 from Chris Lord, adding support for Vorbis streams - -2007-03-01 17:27:34 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - tests/check/Makefile.am: Draw plugins in from the build tree sys/ dir, rather than picking up the already installed v... - Original commit message from CVS: - * tests/check/Makefile.am: - Draw plugins in from the build tree sys/ dir, rather than - picking up the already installed versions. - -2007-02-28 19:31:12 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - configure.ac: Convert to new AG_GST style. - Original commit message from CVS: - * configure.ac: - Convert to new AG_GST style. + * meson_options.txt: + * sys/meson.build: + * sys/wic/gstwicdecoder.cpp: + * sys/wic/gstwicdecoder.h: + * sys/wic/gstwicimagingfactory.cpp: + * sys/wic/gstwicimagingfactory.h: + * sys/wic/gstwicjpegdec.cpp: + * sys/wic/gstwicjpegdec.h: + * sys/wic/gstwicpngdec.cpp: + * sys/wic/gstwicpngdec.h: + * sys/wic/gstwicutils.cpp: + * sys/wic/gstwicutils.h: + * sys/wic/meson.build: + * sys/wic/plugin.cpp: + wic: Add support for JPEG and PNG decoding + Adding Windows Imaging Component (WIC) plugin with JPEG/PNG decoding + support. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1605> + +2022-03-02 06:17:22 +0900 Seungha Yang <seungha@centricular.com> + + * sys/directshow/gstdshow.cpp: + * sys/directshow/gstdshowvideodec.cpp: + directshow: Fix for division by zero + The AvgTimePerFrame value may be unknown. Use arbitrary + value (30 fps) instead of crashing. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1828> + +2022-02-20 03:59:32 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvallocator.cpp: + * sys/qsv/gstqsvallocator.h: + * sys/qsv/gstqsvallocator_d3d11.cpp: + * sys/qsv/gstqsvallocator_va.cpp: + * sys/qsv/gstqsvdecoder.cpp: + * sys/qsv/gstqsvdecoder.h: + * sys/qsv/gstqsvencoder.cpp: + * sys/qsv/gstqsvh264dec.cpp: + * sys/qsv/gstqsvh264dec.h: + * sys/qsv/gstqsvutils.h: + * sys/qsv/meson.build: + * sys/qsv/plugin.cpp: + qsv: Add H.264 decoder + Initial decoder implementation with baseclass + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1786> -2007-02-27 12:02:03 +0000 Christian Schaller <uraeus@gnome.org> +2022-02-21 10:49:15 +0100 Sebastian Fricke <sebastian.fricke@collabora.com> - * ChangeLog: - * sys/directdraw/gstdirectdrawplugin.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - * sys/directsound/gstdirectsoundplugin.c: - * sys/directsound/gstdirectsoundsink.c: - * sys/directsound/gstdirectsoundsink.h: - * sys/osxvideo/cocoawindow.h: - * sys/osxvideo/cocoawindow.m: - * sys/osxvideo/osxvideosink.h: - * sys/osxvideo/osxvideosink.m: - update copyright statements - Original commit message from CVS: - update copyright statements - -2007-02-27 11:30:19 +0000 Edward Hervey <bilboed@bilboed.com> - - sys/osxvideo/: Disable the cocoa event loop since it's a huge memory leak. Should only matter if the sink isn't used ... - Original commit message from CVS: - * sys/osxvideo/cocoawindow.h: - * sys/osxvideo/cocoawindow.m: - * sys/osxvideo/osxvideosink.h: - * sys/osxvideo/osxvideosink.m: - Disable the cocoa event loop since it's a huge memory leak. Should only - matter if the sink isn't used within an NSApp (which has already got - a coca event loop). - Remove all unused code. - -2007-02-26 21:01:03 +0000 David Schleef <ds@schleef.org> - - Add a new plugin/library to make it easy for apps to shove data into a pipeline. - Original commit message from CVS: - * configure.ac: - * gst/app/Makefile.am: - * gst/app/gstapp.c: - * gst/app/gstappsrc.c: - * gst/app/gstappsrc.h: - Add a new plugin/library to make it easy for apps to shove - data into a pipeline. - -2007-02-26 10:32:30 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/real/: Use gst_pad_use_fixed_caps() on source pads, to avoid negotiation errors in certain situations (e.g. dec !... - Original commit message from CVS: - * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_init): - * gst/real/gstrealvideodec.c: (gst_real_video_dec_init): - Use gst_pad_use_fixed_caps() on source pads, to avoid negotiation - errors in certain situations (e.g. dec ! cs ! ximagesink and the - imagesink window is resized); also, some minor clean-ups. - -2007-02-24 22:52:48 +0000 Tim-Philipp Müller <tim@centricular.net> - - Fix build with LDFLAGS='-Wl,-z,defs'. - Original commit message from CVS: - * configure.ac: - * ext/gsm/Makefile.am: - * ext/ladspa/Makefile.am: - * ext/wavpack/Makefile.am: - * gst/equalizer/Makefile.am: - * gst/filter/Makefile.am: - * gst/mve/Makefile.am: - * gst/nsf/Makefile.am: - * gst/replaygain/Makefile.am: - * gst/speed/Makefile.am: - Fix build with LDFLAGS='-Wl,-z,defs'. - -2007-02-20 21:34:00 +0000 Sébastien Moutte <sebastien@moutte.net> - - sys/directsound/gstdirectsoundsink.*: Remove include of unused headers. - Original commit message from CVS: - * sys/directsound/gstdirectsoundsink.c: - * sys/directsound/gstdirectsoundsink.h: - Remove include of unused headers. - * sys/waveform/gstwaveformplugin.c: - * sys/waveform/gstwaveformsink.c: - * sys/waveform/gstwaveformsink.h: - * win32/vs6/libgstwaveform.dsp: - Add a new waveform plugin which includes an audio sink - element using the WaveForm win32 API. - * win32/MANIFEST: - Add the new project file form waveform plugin. - -2007-02-18 18:00:51 +0000 Sébastien Moutte <sebastien@moutte.net> - - sys/directdraw/: Prepare the plugin to move to good: - Original commit message from CVS: - * sys/directdraw/gstdirectdrawplugin.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - Prepare the plugin to move to good: - Remove unused/untested code (rendering to an extern surface, - yuv format rendering).Use GST_(DEBUG/*)_OBJECT macros - Rename all functions from gst_directdrawsink to gst_directdraw_sink. - Add gtk doc section - Fix a bug in gst_directdraw_sink_show_frame, memcpy line by line - respecting destination surface stride. - * sys/directsound/gstdirectsoundplugin.c: - * sys/directsound/gstdirectsoundsink.c: - * sys/directsound/gstdirectsoundsink.h: - Prepare the plugin to move to good: - Rename all functions from gst_directsoundsink to gst_directsound_sink. - Add gtk doc section - * win32/common/config.h.in: - * win32/MANIFEST: - Add config.h.in - -2007-02-16 16:26:31 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - add equalizer plugin - Original commit message from CVS: - add equalizer plugin - -2007-02-13 14:22:53 +0000 Christian Schaller <uraeus@gnome.org> - - * ext/Makefile.am: - add missing \ in Makefile.am - Original commit message from CVS: - add missing \ in Makefile.am - -2007-02-13 09:44:20 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Add crossreferences to glib/gobject/gstream docs. Also fix typo in timidity.cfg check. - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - Add crossreferences to glib/gobject/gstream docs. Also fix typo in - timidity.cfg check. - * ext/timidity/gsttimidity.c: (plugin_init): - Also build if no config was detected at configure time. - -2007-02-11 15:46:24 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Add second midi renderer. Fix some double frees and leaks. Clean up logging. - Original commit message from CVS: - * configure.ac: - * ext/timidity/Makefile.am: - * ext/timidity/gsttimidity.c: (plugin_init): - * ext/timidity/gstwildmidi.c: (gst_wildmidi_base_init), - (gst_wildmidi_class_init), (gst_wildmidi_init), - (gst_wildmidi_src_convert), (gst_wildmidi_src_query), - (gst_wildmidi_get_upstream_size), (gst_wildmidi_get_segment), - (gst_wildmidi_get_new_segment_event), (gst_wildmidi_src_event), - (gst_wildmidi_activate), (gst_wildmidi_activatepull), - (gst_wildmidi_allocate_buffer), (gst_wildmidi_clip_buffer), - (gst_wildmidi_fill_buffer), (gst_wildmidi_get_buffer), - (gst_wildmidi_loop), (gst_wildmidi_change_state), - (gst_wildmidi_set_property), (gst_wildmidi_get_property), - (gst_wildmidi_typefind), (wildmidi_open_config), (plugin_init): - * ext/timidity/gstwildmidi.h: - Add second midi renderer. Fix some double frees and leaks. Clean up - logging. - -2007-02-11 15:26:49 +0000 Sébastien Moutte <sebastien@moutte.net> - - Makefile.am: Add win32 MANIFEST - Original commit message from CVS: - * Makefile.am: - Add win32 MANIFEST - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - Clear unused code and add comments. - Remove yuv from template caps, it only supports RGB - actually. - Implement XOverlay interface and remove window and fullscreen - properties. - Add debug logs. - Test for blit capabilities to return only the current colorspace if - the hardware can't blit for one colorspace to another. - * sys/directsound/gstdirectsoundsink.c: - Add some debugs. - * win32/MANIFEST: - Add VS7 project files and solution. - * win32/vs6/gst_plugins_bad.dsw: - * win32/vs6/libgstdirectdraw.dsp: - * win32/vs6/libgstdirectsound.dsp: - * win32/vs6/libgstqtdemux.dsp: - Update project files. - -2007-02-11 11:59:49 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/faad/gstfaad.c: Also update the comment that describes the hack. - Original commit message from CVS: - * ext/faad/gstfaad.c: - Also update the comment that describes the hack. - -2007-02-11 11:35:47 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - configure.ac: Tell the code which faad it is, so that we can adjust the hacks needed. - Original commit message from CVS: - * configure.ac: - Tell the code which faad it is, so that we can adjust the hacks - needed. - * ext/faad/gstfaad.c: - Make our hacks dependent on the fadd lib in use. - -2007-02-11 10:58:14 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - configure.ac: Fix faad detection to support also fadd with new symbol prefix. - Original commit message from CVS: - * configure.ac: - Fix faad detection to support also fadd with new symbol prefix. - ChangeLog surgery. - -2007-02-08 15:00:00 +0000 Wouter Paesen <wouter@blue-gate.be> - - Add timitity midi render plugin (#403992) - Original commit message from CVS: - Patch by: Wouter Paesen <wouter@blue-gate.be> - * configure.ac: - * ext/Makefile.am: - * ext/timidity/Makefile.am: - * ext/timidity/gsttimidity.c: (gst_timidity_base_init), - (gst_timidity_class_init), (gst_timidity_init), - (gst_timidity_set_song_options), (gst_timidity_src_convert), - (gst_timidity_src_query), (gst_timidity_get_upstream_size), - (gst_timidity_get_segment), (gst_timidity_get_new_segment_event), - (gst_timidity_src_event), (gst_timidity_activate), - (gst_timidity_activatepull), (gst_timidity_allocate_buffer), - (gst_timidity_clip_buffer), (gst_timidity_fill_buffer), - (gst_timidity_get_buffer), (gst_timidity_loop), - (gst_timidity_change_state), (gst_timidity_typefind), - (plugin_init): - * ext/timidity/gsttimidity.h: - Add timitity midi render plugin (#403992) - -2007-02-07 12:29:03 +0000 Edward Hervey <bilboed@bilboed.com> - - ext/amrwb/gstamrwbparse.c: GST_PAD_PARENT doesn't return a GstObject with an incremented refcount. - Original commit message from CVS: - * ext/amrwb/gstamrwbparse.c: (gst_amrwbparse_query): - GST_PAD_PARENT doesn't return a GstObject with an incremented refcount. - Switched to using gst_pad_get_parent(). - -2007-02-06 16:00:37 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/modplug/gstmodplug.cc: Remove superfluous gst_caps_get_structure() call. - Original commit message from CVS: - * gst/modplug/gstmodplug.cc: - Remove superfluous gst_caps_get_structure() call. - -2007-02-06 10:16:52 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Increase required libsndfile version to a version that's known to have the function sf_write_sync() to ... - Original commit message from CVS: - * configure.ac: - Increase required libsndfile version to a version that's known to - have the function sf_write_sync() to make the build bots happy. - -2007-02-06 09:39:16 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/sndfile/gstsfsrc.c: Fix build (installed setup). - Original commit message from CVS: - * ext/sndfile/gstsfsrc.c: - Fix build (installed setup). - -2007-02-05 18:42:45 +0000 Andy Wingo <wingo@pobox.com> - - ext/sndfile/: Port sfsrc to 0.10, pull or push, with random access woo. - Original commit message from CVS: - 2007-02-05 Andy Wingo <wingo@pobox.com> - * ext/sndfile/Makefile.am: - * ext/sndfile/gstsfsrc.h: - * ext/sndfile/gstsfsrc.c: Port sfsrc to 0.10, pull or push, with - random access woo. - -2007-02-03 23:35:26 +0000 Tim-Philipp Müller <tim@centricular.net> - - Fix up to use the newly ported (actually working) GstAudioFilter. - Original commit message from CVS: - * configure.ac: - * gst/equalizer/Makefile.am: - * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init), - (gst_iir_equalizer_class_init), (gst_iir_equalizer_init), - (setup_filter), (gst_iir_equalizer_compute_frequencies), - (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), - (gst_iir_equalizer_transform_ip), (gst_iir_equalizer_setup), - (plugin_init): - * gst/equalizer/gstiirequalizer.h: - Fix up to use the newly ported (actually working) GstAudioFilter. - Bump core/base requirements to CVS for this. - * tests/icles/.cvsignore: - * tests/icles/Makefile.am: - * tests/icles/equalizer-test.c: (check_bus), - (equalizer_set_band_value), (equalizer_set_all_band_values), - (equalizer_set_band_value_and_wait), - (equalizer_set_all_band_values_and_wait), (do_slider_fiddling), - (main): - Add brain-dead interactive test for equalizer. - -2007-02-02 18:36:28 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/equalizer/gstiirequalizer.c: Rename "values" property to "band-values" and change type into a - Original commit message from CVS: - * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_class_init), - (gst_iir_equalizer_set_property), (gst_iir_equalizer_get_property), - (gst_iir_equalizer_filter_inplace): - Rename "values" property to "band-values" and change type into a - GValueArray, so it's more easily bindable and the range of the - values passed in is defined and checked etc.; also do some - locking. - -2007-02-02 17:39:21 +0000 James Doc Livingston <doclivingston@gmail.com> - - Port equalizer plugin to 0.10 (#403572). - Original commit message from CVS: - Patch by: James "Doc" Livingston <doclivingston at gmail com> - * configure.ac: - * gst/equalizer/Makefile.am: - * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_get_type), - (gst_iir_equalizer_base_init), (gst_iir_equalizer_class_init), - (gst_iir_equalizer_compute_frequencies), - (gst_iir_equalizer_set_property), - (gst_iir_equalizer_filter_inplace), (gst_iir_equalizer_setup), - (plugin_init): - Port equalizer plugin to 0.10 (#403572). - -2007-02-02 13:28:05 +0000 Andy Wingo <wingo@pobox.com> - - configure.ac: ext/Makefile.am - Original commit message from CVS: - 2007-02-02 Andy Wingo <wingo@pobox.com> - * configure.ac: - * ext/Makefile.am - * ext/sndfile/Makefile.am: - * ext/sndfile/gstsf.c: - * ext/sndfile/gstsf.h: - * ext/sndfile/gstsfsink.c: - * ext/sndfile/gstsfsink.h: Port sfsink to 0.10. Works in pull or - push mode with interleaved float or int data. - -2007-02-02 11:09:50 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/alsaspdif/alsaspdifsink.c: Set rank to NONE so that it doesn't get autoplugged by autoaudiosink (which didn't hap... - Original commit message from CVS: - * ext/alsaspdif/alsaspdifsink.c: (plugin_init): - Set rank to NONE so that it doesn't get autoplugged by autoaudiosink - (which didn't happen previously because the klass string didn't - contain anything autoaudiosink was looking for). - -2007-01-31 10:02:05 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/real/: Fix classification in GstElementDetails. - Original commit message from CVS: - * gst/real/gstrealaudiodec.c: - * gst/real/gstrealvideodec.c: - Fix classification in GstElementDetails. - -2007-01-31 08:32:59 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackparse.c: Fix a off by one that leads to the duration reported as one sample less than it is - Original commit message from CVS: - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_src_query), - (gst_wavpack_parse_handle_seek_event), - (gst_wavpack_parse_create_src_pad): - Fix a off by one that leads to the duration reported as one - sample less than it is - -2007-01-31 08:16:59 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Fix classification in GstElementDetails. - Original commit message from CVS: - * ext/alsaspdif/alsaspdifsink.c: - * gst/nsf/gstnsf.c: - Fix classification in GstElementDetails. - * ext/ladspa/gstladspa.c: (gst_ladspa_base_init), - (gst_ladspa_class_init): - Improve Klassification and reduce code slighly. - -2007-01-30 17:19:33 +0000 Edward Hervey <bilboed@bilboed.com> - - configure.ac: Check for an Objective C compiler - Original commit message from CVS: - * configure.ac: - Check for an Objective C compiler - * sys/Makefile.am: - * sys/osxvideo/Makefile.am: - * sys/osxvideo/cocoawindow.h: - * sys/osxvideo/cocoawindow.m: - * sys/osxvideo/osxvideosink.h: - * sys/osxvideo/osxvideosink.m: - Port of osxvideo plugin to 0.10. Do NOT consider 100% stable ! - Fixes #402470 - -2007-01-29 20:51:02 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - update spec file - Original commit message from CVS: - update spec file - -2007-01-28 18:28:33 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/videocrop/gstvideocrop.c: Fix cropping for packed 4:2:2 formats YUYV/YUY2 and UYVY. - Original commit message from CVS: - * gst/videocrop/gstvideocrop.c: - (gst_video_crop_get_image_details_from_caps), - (gst_video_crop_transform_packed_complex): - Fix cropping for packed 4:2:2 formats YUYV/YUY2 and UYVY. - * tests/icles/videocrop-test.c: (check_bus_for_errors), - (test_with_caps), (main): - Block streaming thread before changing filter caps while the - pipeline is running so that we don't get random not-negotiated - errors just because GStreamer can't handle that yet. - -2007-01-28 17:35:13 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/ladspa/: add GstController support to ladspa - Original commit message from CVS: - * ext/ladspa/Makefile.am: - * ext/ladspa/gstladspa.c: (gst_ladspa_class_get_param_spec): - add GstController support to ladspa - -2007-01-28 13:01:02 +0000 Rosfran Borges <rosfran.borges@idnt.org.br> - - ext/mythtv/gstmythtvsrc.c: Remove sleep calls, they've been moved into the library now ... (#354451). - Original commit message from CVS: - Patch by: Rosfran Borges <rosfran dot borges at idnt org br> - * ext/mythtv/gstmythtvsrc.c: (gst_mythtv_src_start), - (gst_mythtv_src_next_program_chain): - Remove sleep calls, they've been moved into the library now ... - (#354451). - -2007-01-27 16:08:15 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/icles/videocrop-test.c: Catch errors while the test is running. - Original commit message from CVS: - * tests/icles/videocrop-test.c: (test_with_caps): - Catch errors while the test is running. - -2007-01-25 23:27:59 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackparse.c: Fix the SEEKING query. We can seek if we are in pull mode, not the other way around. A... - Original commit message from CVS: - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_src_query): - Fix the SEEKING query. We can seek if we are in pull mode, not the - other way around. Also set the correct format in the seeking query and - handle the case where the headers are not read yet and we can't say - anything about our seeking capabilities. - -2007-01-25 21:55:49 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/: Fix spelling in 2 places: It's called Wavpack, not WavePack. - Original commit message from CVS: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): - Fix spelling in 2 places: It's called Wavpack, not WavePack. - -2007-01-25 12:05:11 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/: Use proper print statements. - Original commit message from CVS: - * gst/multifile/gstmultifilesink.c: - (gst_multi_file_sink_class_init): - * gst/multifile/gstmultifilesrc.c: (gst_multi_file_src_class_init): - * gst/mve/gstmvedemux.c: (gst_mve_video_create_buffer), - (gst_mve_video_palette), (gst_mve_video_code_map), - (gst_mve_audio_init), (gst_mve_audio_data), (gst_mve_timer_create), - (gst_mve_demux_chain): - * gst/mve/gstmvemux.c: (gst_mve_mux_push_chunk): - * gst/mve/mveaudioenc.c: (mve_compress_audio): - * gst/mve/mvevideodec16.c: (ipvideo_copy_block): - * gst/mve/mvevideodec8.c: (ipvideo_copy_block): - * gst/mve/mvevideoenc16.c: (mve_encode_frame16): - * gst/mve/mvevideoenc8.c: (mve_encode_frame8): - Use proper print statements. - Fixes build on mac os x. - <wingo> oo look at me my name is edward i'm hacking on macos wooo - -2007-01-24 11:29:00 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/gstrtpxqtdepay.c: Fix caps on the depayloader. - Original commit message from CVS: - * gst/qtdemux/gstrtpxqtdepay.c: - Fix caps on the depayloader. - -2007-01-23 14:54:01 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst-libs/ext/amrwb/Makefile.am: - work if it's already there too - Original commit message from CVS: - work if it's already there too - -2007-01-17 17:29:04 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/mythtv/gstmythtvsrc.c: Use break here instead of goto. - Original commit message from CVS: - * ext/mythtv/gstmythtvsrc.c: (gst_mythtv_src_set_property): - Use break here instead of goto. - -2007-01-13 19:12:32 +0000 Andy Wingo <wingo@pobox.com> - - gst/interleave/deinterleave.c (gst_deinterleave_add_new_pads): Use fixed caps on src pads. - Original commit message from CVS: - 2007-01-13 Andy Wingo <wingo@pobox.com> - * gst/interleave/deinterleave.c (gst_deinterleave_add_new_pads): - Use fixed caps on src pads. - (gst_deinterleave_remove_pads): Remove src pads, not sink pads. I - seem to have reverse midas disease! - (gst_deinterleave_process): Proxy timestamps, offsets, durations, - and set caps on outgoing buffers. Fixes #395597, I think. - -2007-01-13 18:01:41 +0000 Andy Wingo <wingo@pobox.com> - - gst/interleave/interleave.c (gst_interleave_init): Init the activation mode properly. - Original commit message from CVS: - 2007-01-13 Andy Wingo <wingo@pobox.com> - * gst/interleave/interleave.c (gst_interleave_init): Init the - activation mode properly. - (gst_interleave_src_setcaps, gst_interleave_src_getcaps) - (gst_interleave_init): Set a setcaps and getcaps function on the - src pad, so that we can implement pull-mode negotiation. - (gst_interleave_sink_setcaps): Renamed from - gst_interleave_setcaps, as it only does the sink logic now. - Implement both for pull-mode and push-mode. - (gst_interleave_process): Set caps on our outgoing buffer. - (gst_interleave_src_activate_pull): Fix some more bogus casts. - What is up with this. - -2007-01-13 12:37:55 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/mythtv/gstmythtvsrc.c: Clean up a bit, mostly the debug statements; fix deadlock in _set_property() in the error ... - Original commit message from CVS: - * ext/mythtv/gstmythtvsrc.c: (do_read_request_response), - (gst_mythtv_src_create), (gst_mythtv_src_get_position), - (gst_mythtv_src_do_seek), (gst_mythtv_src_start), - (gst_mythtv_src_next_program_chain), (gst_mythtv_src_get_size), - (gst_mythtv_src_handle_event), (gst_mythtv_src_handle_query), - (gst_mythtv_src_change_state), (gst_mythtv_src_set_property), - (gst_mythtv_src_uri_get_type): - Clean up a bit, mostly the debug statements; fix deadlock in - _set_property() in the error cases; fix up query function. + * ext/wpe/WPEThreadedView.cpp: + * ext/wpe/gstwpe.cpp: + * ext/wpe/gstwpe.h: + Remove the uninstalled term + Remove the symbolic link `gst-uninstalled` which points to `gst-env`. + The `uninstalled` is the old name and the project should stick to a + single name for the procedure. + Remove the term from all the files, exceptions are variables from + dependencies like `uninstalled_variables` from pkgconfig and + `meson-uninstalled`. + Adjust mentions of the script in the documentation and README. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1743> -2007-01-12 21:58:43 +0000 Andy Wingo <wingo@pobox.com> +2022-02-23 11:10:11 +0100 Sebastian Fricke <sebastian.fricke@collabora.com> - * ChangeLog: - * ext/ladspa/gstsignalprocessor.c: - ext/ladspa/gstsignalprocessor.c (gst_signal_processor_fixate) - Original commit message from CVS: - 2007-01-12 Andy Wingo <wingo@pobox.com> - * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_fixate) - (gst_signal_processor_ouija_caps, gst_signal_processor_prepare): - Remove fixate/ouija stuff, thankfully, due to the new - part-negotiation.txt pull-mode negotiation scheme. - (gst_signal_processor_setcaps_pull) - (gst_signal_processor_setcaps): Implement upstream set_caps pull - proxying for pull mode. Now this works: ladspa-sine-fcac ! - audioconvert ! alsasink. + * README.md: + Maintain build instructions at a single location + Do not maintain similar build instructions within each gst-plugins-* + subproject and the subproject/gstreamer subproject. Use the build + instructions from the mono-repository and link to them via hyperlink. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1743> -2007-01-12 19:02:37 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-21 12:26:49 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * ChangeLog: - * configure.ac: - * ext/Makefile.am: - * ext/mythtv/Makefile.am: - * ext/mythtv/gstmythtvsrc.c: - * ext/mythtv/gstmythtvsrc.h: - * gst-plugins-bad.spec.in: - MythTV client source plugin created. - Original commit message from CVS: - MythTV client source plugin created. - -2007-01-12 17:16:51 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/: Add X-QT depayloader that will eventually share code with the demuxer. - Original commit message from CVS: - * gst/qtdemux/Makefile.am: - * gst/qtdemux/gstrtpxqtdepay.c: (gst_rtp_xqt_depay_base_init), - (gst_rtp_xqt_depay_class_init), (gst_rtp_xqt_depay_init), - (gst_rtp_xqt_depay_finalize), (gst_rtp_quicktime_parse_sd), - (gst_rtp_xqt_depay_setcaps), (gst_rtp_xqt_depay_process), - (gst_rtp_xqt_depay_set_property), (gst_rtp_xqt_depay_get_property), - (gst_rtp_xqt_depay_change_state), (gst_rtp_xqt_depay_plugin_init): - * gst/qtdemux/gstrtpxqtdepay.h: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_base_init), - (gst_qtdemux_loop_state_header), (gst_qtdemux_loop), - (qtdemux_parse_moov), (qtdemux_parse_container), - (qtdemux_parse_node), (gst_qtdemux_add_stream), - (qtdemux_parse_trak), (qtdemux_audio_caps): - * gst/qtdemux/qtdemux.h: - * gst/qtdemux/quicktime.c: (plugin_init): - Add X-QT depayloader that will eventually share code with the demuxer. - Make new plugin entry point with quicktime releated stuff. - -2007-01-12 12:10:19 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/Makefile.am: Dist all new files. - Original commit message from CVS: - * gst/qtdemux/Makefile.am: - Dist all new files. - -2007-01-12 10:27:25 +0000 Wim Taymans <wim.taymans@gmail.com> - - docs/plugins/: Activate docs for jack, sdl and qtdemux. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-qtdemux.xml: - Activate docs for jack, sdl and qtdemux. - -2007-01-12 10:25:40 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/jack/gstjackaudiosink.*: Improve docs. - Original commit message from CVS: - * ext/jack/gstjackaudiosink.c: (jack_sample_rate_cb), - (jack_buffer_size_cb), (jack_shutdown_cb), - (gst_jack_ring_buffer_acquire): - * ext/jack/gstjackaudiosink.h: - Improve docs. - -2007-01-12 10:24:29 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/gsm/gstgsmenc.c: Fix typo in docs. - Original commit message from CVS: - * ext/gsm/gstgsmenc.c: (gst_gsmenc_init): - Fix typo in docs. - -2007-01-12 10:22:16 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/: Cleanup and refactor to make the code more readable. - Original commit message from CVS: - * gst/qtdemux/Makefile.am: - * gst/qtdemux/qtdemux.c: (extract_initial_length_and_fourcc), - (gst_qtdemux_loop_state_header), (gst_qtdemux_combine_flows), - (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), - (gst_qtdemux_chain), (qtdemux_sink_activate_pull), - (qtdemux_inflate), (qtdemux_parse_moov), (qtdemux_parse_container), - (qtdemux_parse_node), (qtdemux_tree_get_child_by_type), - (qtdemux_tree_get_sibling_by_type), (gst_qtdemux_add_stream), - (qtdemux_parse_samples), (qtdemux_parse_segments), - (qtdemux_parse_trak), (qtdemux_tag_add_str), (qtdemux_tag_add_num), - (qtdemux_tag_add_date), (qtdemux_tag_add_gnre), - (qtdemux_parse_udta), (qtdemux_redirects_sort_func), - (qtdemux_process_redirects), (qtdemux_parse_redirects), - (qtdemux_parse_tree), (gst_qtdemux_handle_esds), - (qtdemux_video_caps), (qtdemux_audio_caps): - * gst/qtdemux/qtdemux.h: - * gst/qtdemux/qtdemux_dump.c: (qtdemux_dump_mvhd), - (qtdemux_dump_tkhd), (qtdemux_dump_elst), (qtdemux_dump_mdhd), - (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), (qtdemux_dump_dref), - (qtdemux_dump_stsd), (qtdemux_dump_stts), (qtdemux_dump_stss), - (qtdemux_dump_stsc), (qtdemux_dump_stsz), (qtdemux_dump_stco), - (qtdemux_dump_co64), (qtdemux_dump_dcom), (qtdemux_dump_cmvd), - (qtdemux_dump_unknown), (qtdemux_node_dump_foreach), - (qtdemux_node_dump): - * gst/qtdemux/qtdemux_dump.h: - * gst/qtdemux/qtdemux_fourcc.h: - * gst/qtdemux/qtdemux_types.c: (qtdemux_type_get): - * gst/qtdemux/qtdemux_types.h: - * gst/qtdemux/qtpalette.h: - Cleanup and refactor to make the code more readable. - Move debugging/tables into separate files. - Add 2/4/16 color palletee support. - Fix raw 15 bit RGB handling. - Use more FOURCC constants. - Add some docs. - -2007-01-11 19:51:04 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackenc.c: Minor clean-up: use enum values instead of hardcoded constants (#395536). - Original commit message from CVS: - Patch by: Sebastian Dröge <slomo@circular-chaos.org> - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_mode_get_type), - (gst_wavpack_enc_correction_mode_get_type), - (gst_wavpack_enc_joint_stereo_mode_get_type): - Minor clean-up: use enum values instead of hardcoded constants (#395536). - -2007-01-11 12:28:56 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/mve/gstmvedemux.c: Support SEEKING query (bad news now delivered properly!); add event function to source pads to... - Original commit message from CVS: - * gst/mve/gstmvedemux.c: (gst_mve_demux_get_src_query_types), - (gst_mve_demux_handle_src_query), (gst_mve_demux_handle_src_event), - (gst_mve_add_stream): - Support SEEKING query (bad news now delivered properly!); add event - function to source pads to make sure seeks aren't propagated - upstream, even if they aren't handled. - -2007-01-11 11:39:56 +0000 Jens Granseuer <jensgr@gmx.net> - - Add Interplay MVE format demuxer/decoder and muxer/encoder. Demuxer doesn't support seeking yet, but seems to work fi... - Original commit message from CVS: - Patch by: Jens Granseuer <jensgr at gmx net> - * configure.ac: - * gst/mve/Makefile.am: - * gst/mve/TODO: - * gst/mve/gstmve.c: - * gst/mve/gstmvedemux.c: - * gst/mve/gstmvedemux.h: - * gst/mve/gstmvemux.c: - * gst/mve/gstmvemux.h: - * gst/mve/mve.h: - * gst/mve/mveaudiodec.c: - * gst/mve/mveaudioenc.c: - * gst/mve/mvevideodec16.c: - * gst/mve/mvevideodec8.c: - * gst/mve/mvevideoenc16.c: - * gst/mve/mvevideoenc8.c: - Add Interplay MVE format demuxer/decoder and muxer/encoder. Demuxer - doesn't support seeking yet, but seems to work fine otherwise. - Closes #348973. - -2007-01-09 10:06:28 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/real/Makefile.am: Fix build (add LIBS and CFLAGS for gst-plugins-base stuff). - Original commit message from CVS: - * gst/real/Makefile.am: - Fix build (add LIBS and CFLAGS for gst-plugins-base stuff). - -2007-01-07 22:03:54 +0000 Andy Wingo <wingo@pobox.com> - - New elements interleave and deinterleave, implement channel interleaving and deinterleaving. - Original commit message from CVS: - 2007-01-07 Andy Wingo <wingo@pobox.com> - * configure.ac: - * gst/interleave/Makefile.am: - * gst/interleave/plugin.h: - * gst/interleave/plugin.c: - * gst/interleave/interleave.c: - * gst/interleave/deinterleave.c: New elements interleave and - deinterleave, implement channel interleaving and deinterleaving. - The interleaver can operate in pull or push mode but the - deinterleaver is more like a demuxer and can only operate in push - mode. - -2007-01-06 19:23:40 +0000 Edward Hervey <bilboed@bilboed.com> - - configure.ac: Properly detect the two architectures on which the real plugin can be built. - Original commit message from CVS: - * configure.ac: - Properly detect the two architectures on which the real plugin can be - built. - Fixes #393622 + * docs/plugins/gst_plugins_cache.json: + docs: Add vah264enc metadata. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1051> -2007-01-06 17:22:12 +0000 Andy Wingo <wingo@pobox.com> +2021-10-05 01:53:19 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * ext/ladspa/gstsignalprocessor.c: - ext/ladspa/gstsignalprocessor.c - Original commit message from CVS: - 2007-01-06 Andy Wingo <wingo@pobox.com> - * ext/ladspa/gstsignalprocessor.c - (gst_signal_processor_ouija_caps): Move around in the source - file... - (gst_signal_processor_prepare, gst_signal_processor_do_pulls): - Call ouija_caps in prepare() instead of do_pulls(), a bit earlier. - This allows us to have caps when we do the pad_alloc_buffer(). - (gst_pad_alloc_buffer_and_set_caps): Use self->caps instead of the - pad caps, which might not be set yet. - -2007-01-06 15:56:55 +0000 Andy Wingo <wingo@pobox.com> - - ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_add_pad_from_template) - Original commit message from CVS: - 2007-01-06 Andy Wingo <wingo@pobox.com> - * ext/ladspa/gstsignalprocessor.c: - (gst_signal_processor_add_pad_from_template) - (gst_signal_processor_fixate): Add a fixate function, to assist in - pathological ladspa-sine-fcac ! fakesink can-activate-pull=true - cases. - (gst_signal_processor_prepare, gst_signal_processor_process): Add - nframes args so that getrange can tell ladspa how many frames to - process. - (gst_signal_processor_ouija_caps): setcaps needs to be called - before processing, which normally happens when chaining a buffer - to a pad. However in getrange mode with no sinks we need to check - explicitly for this condition, guess some caps to use, and use - those to setcaps(). Hence this mystical function. - (gst_signal_processor_do_pulls): Pull in bytes, not samples. - Divine the caps if necessary. - (gst_signal_processor_getrange): Interpret the length as bytes, - not samples. - (gst_signal_processor_chain): nframes=G_MAXUINT, will be limited - by incoming buffer sizes. - -2007-01-06 14:08:26 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/real/gstrealaudiodec.c: Don't call the RAFreeDecoder since it randomly causes segfaults. - Original commit message from CVS: - * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_finalize): - Don't call the RAFreeDecoder since it randomly causes segfaults. - * gst/real/gstrealaudiodec.h: - indent properly. - -2007-01-06 10:58:13 +0000 Lutz Mueller <lutz@topfrose.de> - - gst/real/gstrealvideodec.*: Implement error recovery on setcaps failure. - Original commit message from CVS: - Patch by: Lutz Mueller <lutz@topfrose.de> - * gst/real/gstrealvideodec.c: (gst_real_video_dec_decode), - (gst_real_video_dec_setcaps), (open_library), (close_library), - (gst_real_video_dec_finalize): - * gst/real/gstrealvideodec.h: - Implement error recovery on setcaps failure. - -2007-01-06 10:41:46 +0000 Lutz Mueller <lutz@topfrose.de> - - gst/real/: Added RealAudio wrapper elementfactory. - Original commit message from CVS: - Patch by: Lutz Mueller <lutz@topfrose.de> - * gst/real/Makefile.am: - * gst/real/gstreal.c: (plugin_init): - * gst/real/gstrealaudiodec.c: (gst_real_audio_dec_chain), - (gst_real_audio_dec_setcaps), (gst_real_audio_dec_init), - (gst_real_audio_dec_base_init), (gst_real_audio_dec_change_state), - (gst_real_audio_dec_finalize), (gst_real_audio_dec_set_property), - (gst_real_audio_dec_get_property), (gst_real_audio_dec_class_init): - * gst/real/gstrealaudiodec.h: - Added RealAudio wrapper elementfactory. - Modified structures so it can also work on x86_64 using the - adequate .so . - -2007-01-05 18:32:03 +0000 Tim-Philipp Müller <tim@centricular.net> - - Check for zlib and if available pass it explicitly to the linker when linking qtdemux. If not available (or --disable... - Original commit message from CVS: - * configure.ac: - * gst/qtdemux/Makefile.am: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_moov): - Check for zlib and if available pass it explicitly to the linker - when linking qtdemux. If not available (or --disable-external has - been specified!), disable the bits in qtdemux that use it. Fixes - build on MingW (#392856). - -2007-01-05 18:15:52 +0000 Edward Hervey <bilboed@bilboed.com> - - configure.ac: Real video .so are now also available for x86_64, so we can build the - Original commit message from CVS: - * configure.ac: - Real video .so are now also available for x86_64, so we can build the - Real plugin on i386 AND x86_64. - * gst/real/Makefile.am: - * gst/real/gstreal.c: (plugin_init): - New plugin file for real .so wrapper plugins. - * gst/real/gstrealvideodec.c: (gst_real_video_dec_alloc_buffer), - (gst_real_video_dec_decode), (gst_real_video_dec_chain), - (gst_real_video_dec_activate_push), (gst_real_video_dec_setcaps), - (open_library), (close_library), (gst_real_video_dec_init), - (gst_real_video_dec_base_init), (gst_real_video_dec_finalize), - (gst_real_video_dec_set_property), - (gst_real_video_dec_get_property), (gst_real_video_dec_class_init): - * gst/real/gstrealvideodec.h: - Moved RealVideo element to separate file - Cleaned up code some more. - Make it work on x86_64. - Try several possible locations for .so - Separate opening/closing libraries in separate functions. - -2007-01-05 16:07:12 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/icles/videocrop-test.c: Call g_thread_init() right at the beginning. Remove superfluous gst_init() - we've alre... - Original commit message from CVS: - * tests/icles/videocrop-test.c: (main): - Call g_thread_init() right at the beginning. Remove superfluous - gst_init() - we've already been inited via the GOption stuff. - -2007-01-05 14:02:33 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Don't compile rfbsource if we don't have sys/socket.h. - Original commit message from CVS: - * configure.ac: - Don't compile rfbsource if we don't have sys/socket.h. - Should fix compilation on MingW. - -2007-01-04 16:39:38 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst-libs/ext/Makefile.am: - * gst-libs/ext/amrwb/Makefile.am: - * gst-libs/ext/amrwb/README: - add directories in the right place - Original commit message from CVS: - add directories in the right place + * sys/va/plugin.c: + va: enable the H264 encoder. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1051> -2007-01-04 16:32:43 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2021-10-05 01:51:48 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * configure.ac: - * ext/amrwb/Makefile.am: - * ext/amrwb/amrwb-code/Makefile.am: - * ext/amrwb/amrwb-code/amrwb/Makefile.am: - * ext/amrwb/amrwb-code/amrwb/README: - * ext/amrwb/amrwb-code/run.sh: - * gst-libs/Makefile.am: - move amrwb code - Original commit message from CVS: - move amrwb code - -2007-01-04 16:32:43 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * ext/amrwb/amrwb-code/Makefile.am: - move amrwb code - Original commit message from CVS: - move amrwb code - -2007-01-04 12:49:47 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - configure.ac: split out GST_CFLAGS into GST_PLUGINS_BASE_CFLAGS and GST_CFLAGS so that GST_BASE_CFLAGS can go inbetwe... - Original commit message from CVS: - * configure.ac: - split out GST_CFLAGS into GST_PLUGINS_BASE_CFLAGS and GST_CFLAGS - so that GST_BASE_CFLAGS can go inbetween them, making sure - we use uninstalled gst-libs headers - * docs/libs/Makefile.am: - * ext/alsa/Makefile.am: - * ext/cdparanoia/Makefile.am: - * ext/gnomevfs/Makefile.am: - * ext/libvisual/Makefile.am: - * ext/ogg/Makefile.am: - * ext/theora/Makefile.am: - * ext/vorbis/Makefile.am: - * gst-libs/gst/audio/Makefile.am: - * gst-libs/gst/cdda/Makefile.am: - * gst-libs/gst/interfaces/Makefile.am: - * gst-libs/gst/riff/Makefile.am: - * gst-libs/gst/rtp/Makefile.am: - * gst-libs/gst/tag/Makefile.am: - * gst/adder/Makefile.am: - * gst/audioconvert/Makefile.am: - * gst/audiorate/Makefile.am: - * gst/audioresample/Makefile.am: - * gst/playback/Makefile.am: - * gst/tcp/Makefile.am: - * gst/videoscale/Makefile.am: - * gst/volume/Makefile.am: - * sys/ximage/Makefile.am: - * sys/xvimage/Makefile.am: - * tests/icles/Makefile.am: - adapt - -2007-01-04 09:51:56 +0000 Julien Moutte <julien@moutte.net> - - ext/: Fix various compiler warnings that reveal potential bugs. - Original commit message from CVS: - 2007-01-04 Julien MOUTTE <julien@moutte.net> - * ext/directfb/dfbvideosink.c: - (gst_dfbvideosink_navigation_send_event), - (gst_dfbvideosink_get_type): - * ext/sdl/sdlaudiosink.c: (gst_sdlaudio_sink_open): - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_setcaps), - (gst_sdlvideosink_show_frame), - (gst_sdlvideosink_navigation_send_event): - * ext/sdl/sdlvideosink.h: Fix various compiler warnings that - reveal potential bugs. - -2007-01-04 09:44:57 +0000 Vincent Torri <vtorri@univ-evry.fr> - - Add directsoundsink to build and dist it, so it gets built when compiling with MingW on win32 and the required header... - Original commit message from CVS: - Patch by: Vincent Torri <vtorri at univ-evry fr> - * configure.ac: - * sys/Makefile.am: - * sys/directsound/Makefile.am: - * sys/directsound/gstdirectsoundsink.c: - (gst_directsoundsink_reset): - Add directsoundsink to build and dist it, so it gets built when - compiling with MingW on win32 and the required headers and libraries - are available (fixes: #392638). Also simplify DirectDraw check a bit. - * tests/check/elements/.cvsignore: - Fix CVS ignore for neonhttpsrc test binary. - -2007-01-03 19:54:33 +0000 Vincent Torri <vtorri@univ-evry.fr> - - Add directdrawsink to build and dist it, so it gets built when compiling with MingW on win32 and the required headers... - Original commit message from CVS: - Patch by: Vincent Torri <vtorri at univ-evry fr> - * configure.ac: - * sys/Makefile.am: - * sys/directdraw/Makefile.am: - Add directdrawsink to build and dist it, so it gets built when - compiling with MingW on win32 and the required headers and libraries - are available (fixes: #392313). - * sys/directdraw/gstdirectdrawsink.c: - (gst_directdrawsink_center_rect), (gst_directdrawsink_show_frame), - (gst_directdrawsink_setup_ddraw), - (gst_directdrawsink_surface_create): - Comment out some unused things and fix some printf format issues in - order to avoid warnings when buildling with MingW (#392313). - -2007-01-03 16:41:10 +0000 Jens Granseuer <jensgr@gmx.net> - - Fix build with gcc-2.x (declare variables at the beginning of a block etc.). Fixes #391971. - Original commit message from CVS: - Patch by: Jens Granseuer <jensgr at gmx net> - * ext/xvid/gstxvidenc.c: (gst_xvidenc_encode), - (gst_xvidenc_get_property): - * gst/filter/gstbpwsinc.c: (bpwsinc_transform_ip): - * gst/filter/gstfilter.c: (plugin_init): - * gst/filter/gstiir.c: (iir_transform_ip): - * gst/filter/gstlpwsinc.c: (lpwsinc_transform_ip): - * gst/modplug/gstmodplug.cc: - * gst/nuvdemux/gstnuvdemux.c: (gst_nuv_demux_header_load), - (gst_nuv_demux_stream_extend_header): - Fix build with gcc-2.x (declare variables at the beginning of a - block etc.). Fixes #391971. - -2007-01-02 11:06:48 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/real/gstreal.c: Use codec_data supplied in caps. - Original commit message from CVS: - reviewed by: Edward Hervey <edward@fluendo.com> - * gst/real/gstreal.c: - (gst_realdec_setcaps): Use codec_data supplied in caps. - (gst_realdec_get_property): Correctly return default path. - (gst_realdec_class_init): Remove unused state_change method. - -2007-01-01 18:06:01 +0000 Edward Hervey <bilboed@bilboed.com> - - configure.ac: Only build the plugin on 32bit x86 architectures. - Original commit message from CVS: - * configure.ac: - Only build the plugin on 32bit x86 architectures. - -2007-01-01 17:47:53 +0000 Edward Hervey <bilboed@bilboed.com> - - New plugin for decoding RealVideo Streams using the x86 32bit shared libraries. - Original commit message from CVS: - reviewed by: Edward Hervey <edward@fluendo.com> - * configure.ac: - * gst/real/Makefile.am: - * gst/real/gstreal.c: (gst_realdec_alloc_buffer), - (gst_realdec_decode), (gst_realdec_chain), - (gst_realdec_activate_push), (gst_realdec_setcaps), - (gst_realdec_init), (gst_realdec_base_init), - (gst_realdec_change_state), (gst_realdec_finalize), - (gst_realdec_set_property), (gst_realdec_get_property), - (gst_realdec_class_init), (plugin_init): - New plugin for decoding RealVideo Streams using the x86 32bit - shared libraries. - Closes #354174 - -2006-12-30 12:44:01 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/check/elements/videocrop.c: When we can't create an element needed for the test, print a message detailing whic... - Original commit message from CVS: - * tests/check/elements/videocrop.c: (GST_START_TEST), - (videocrop_test_cropping_init_context): - When we can't create an element needed for the test, print a message - detailing which element it actually is that's missing (#390673). + * sys/va/gstvah264enc.c: + * sys/va/gstvah264enc.h: + * sys/va/meson.build: + va: Add H264 encoder. + This a new VA-API implementation of a H264 encoder. + It can control the GOP and parameter settings, while the MV searching, + VCL and the rate control algorithm are implemented by VA drivers and HW. + It supports most of the common usage options in H264, but still lacks + of look ahead, field, B frame weighted prediction, etc. + Co-authored-by: Victor Jaquez <vjaquez@igalia.com> + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1051> -2006-12-22 16:23:32 +0000 Edgard Lima <edgard.lima@indt.org.br> +2021-10-05 01:50:07 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - Added seek support. - Original commit message from CVS: - Added seek support. - -2006-12-22 10:15:24 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/check/elements/: reapply consistent pad (de)activation - Original commit message from CVS: - * tests/check/elements/mpeg2enc.c: (setup_mpeg2enc), - (cleanup_mpeg2enc): - * tests/check/elements/rganalysis.c: (cleanup_rganalysis): - * tests/check/elements/wavpackdec.c: (setup_wavpackdec), - (cleanup_wavpackdec): - * tests/check/elements/wavpackenc.c: (setup_wavpackenc), - (cleanup_wavpackenc): - * tests/check/elements/y4menc.c: (setup_y4menc), (cleanup_y4menc): - reapply consistent pad (de)activation - -2006-12-21 17:05:44 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Back to CVS - Original commit message from CVS: - * configure.ac: - Back to CVS - * gst-plugins-bad.doap: - Add release section for 0.10.4 - -=== release 0.10.4 === - -2006-12-21 15:45:02 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: releasing 0.10.4, "Black Bugs" - Original commit message from CVS: - === release 0.10.4 === - 2006-12-21 Jan Schmidt <thaytan@mad.scientist.com> - * configure.ac: - releasing 0.10.4, "Black Bugs" - -2006-12-21 15:40:31 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - * po/af.po: - * po/az.po: - * po/cs.po: - * po/en_GB.po: - * po/hu.po: - * po/it.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - Update .po files - Original commit message from CVS: - Update .po files + * sys/va/gstvaencoder.c: + * sys/va/gstvaencoder.h: + * sys/va/meson.build: + va: Add a common encoder object. + As the counterpart of the va decoder, this class handles all the + common logic for the encoding routine and miscellaneous queries about + encoding. + Co-authored-by: Victor Jaquez <vjaquez@igalia.com> + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1051> -2006-12-21 14:07:02 +0000 Jan Schmidt <thaytan@mad.scientist.com> +2022-01-20 21:44:20 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - Remove duplicate changelog entry about reverting a previous commit - Original commit message from CVS: - Remove duplicate changelog entry about reverting a previous commit - -2006-12-21 14:03:42 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/check/elements/mpeg2enc.c: (setup_mpeg2enc) - Original commit message from CVS: - * tests/check/elements/mpeg2enc.c: (setup_mpeg2enc) - (cleanup_mpeg2enc): - * tests/check/elements/rganalysis.c: (cleanup_rganalysis): - * tests/check/elements/wavpackdec.c: (setup_wavpackdec), - (cleanup_wavpackdec): - * tests/check/elements/wavpackenc.c: (setup_wavpackenc), - (cleanup_wavpackenc): - * tests/check/elements/y4menc.c: (setup_y4menc), (cleanup_y4menc): - revert my freeze breakage - -2006-12-21 12:58:41 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/check/elements/: revert my freeze breakage - Original commit message from CVS: - * tests/check/elements/mpeg2enc.c: (setup_mpeg2enc), - (cleanup_mpeg2enc): - * tests/check/elements/rganalysis.c: (cleanup_rganalysis): - * tests/check/elements/wavpackdec.c: (setup_wavpackdec), - (cleanup_wavpackdec): - * tests/check/elements/wavpackenc.c: (setup_wavpackenc), - (cleanup_wavpackenc): - * tests/check/elements/y4menc.c: (setup_y4menc), (cleanup_y4menc): - revert my freeze breakage - -2006-12-21 08:20:10 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/check/elements/: consistent pad (de)activation - Original commit message from CVS: - * tests/check/elements/mpeg2enc.c: (setup_mpeg2enc), - (cleanup_mpeg2enc): - * tests/check/elements/rganalysis.c: (cleanup_rganalysis): - * tests/check/elements/wavpackdec.c: (setup_wavpackdec), - (cleanup_wavpackdec): - * tests/check/elements/wavpackenc.c: (setup_wavpackenc), - (cleanup_wavpackenc): - * tests/check/elements/y4menc.c: (setup_y4menc), (cleanup_y4menc): - consistent pad (de)activation - -2006-12-21 08:12:26 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/check/elements/: consistent pad (de)activation - Original commit message from CVS: - * tests/check/elements/audioresample.c: (cleanup_audioresample): - * tests/check/elements/audiotestsrc.c: (cleanup_audiotestsrc): - * tests/check/elements/gdpdepay.c: (setup_gdpdepay), - (cleanup_gdpdepay): - * tests/check/elements/gdppay.c: (setup_gdppay), (cleanup_gdppay): - * tests/check/elements/subparse.c: (teardown_subparse): - * tests/check/elements/textoverlay.c: (cleanup_textoverlay): - * tests/check/elements/videorate.c: (cleanup_videorate): - * tests/check/elements/videotestsrc.c: (cleanup_videotestsrc): - * tests/check/elements/volume.c: (cleanup_volume): - * tests/check/elements/vorbisdec.c: (setup_vorbisdec), - (cleanup_vorbisdec): - * tests/check/elements/vorbistag.c: (setup_vorbistag), - (cleanup_vorbistag): - consistent pad (de)activation - -2006-12-18 17:11:49 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Don't post BUFFERING messages in streaming mode if the stream headers are behind the movie dat... - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_post_progress), - (gst_qtdemux_chain): - Don't post BUFFERING messages in streaming mode if the stream - headers are behind the movie data; instead, post "progress" element - messages as a temporary solution. Apps might get confused and do - silly things to the pipeline state if they see buffering messages - from different sources and don't realize they come from different - sources (#387160). - -2006-12-18 16:47:23 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Move LADPSA plugin from -good for the release, as it's not quite ready to be enabled by default in the -good module yet. - Original commit message from CVS: - * configure.ac: - * ext/Makefile.am: - * ext/ladspa/*: - Move LADPSA plugin from -good for the release, as it's not quite - ready to be enabled by default in the -good module yet. - -2006-12-18 15:51:54 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/ladspa/gstsignalprocessor.c: Reset flow_state back to _OK after a flush stop so that we exit our error state afte... - Original commit message from CVS: - * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_setcaps), - (gst_signal_processor_event): - Reset flow_state back to _OK after a flush stop so that we exit our - error state after the flush. Fixes #374213 - -2006-12-18 13:40:34 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/qtdemux/qtdemux.c: Don't output g_warning for an unsupported format, just send a - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_chain), - (gst_qtdemux_add_stream): - Don't output g_warning for an unsupported format, just send a - GST_ELEMENT_WARNING and don't add the pad. - Fix the case where it doesn't check for a NULL pad in streaming mode. - Fixes #387137 - -2006-12-18 12:27:32 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Fix crash dereferencing NULL pointer if there's no stco atom. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): - Fix crash dereferencing NULL pointer if there's no stco atom. - Fixes #387122. - -2006-12-18 10:02:56 +0000 Sebastian Dröge <slomo@ubuntu.com> - - ext/wavpack/gstwavpackenc.h: Use local copy of md5.h, as it disappeared in recent wavpack installs. - Original commit message from CVS: - * ext/wavpack/gstwavpackenc.h: - Use local copy of md5.h, as it disappeared in recent wavpack - installs. - Patch by: Sebastian Dröge <slomo at ubuntu dot com> - Fixes: #387076 - -2006-12-17 20:19:43 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - * po/af.po: - * po/az.po: - * po/cs.po: - * po/en_GB.po: - * po/hu.po: - * po/it.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - Update .po files - Original commit message from CVS: - Update .po files + * sys/va/vacompat.h: + va: Add vacompat.h to wrap glib functions. + The g_queue_clear_full() and g_array_copy() functions in the glib + may not be available for the current glib version check, so we add + helper functions to wrap it. + This should be deleted after the glib version bumps. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1051> -2006-12-17 20:19:34 +0000 Jan Schmidt <thaytan@mad.scientist.com> +2021-10-21 22:56:23 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - Replace some email addresses with names+email addresses - Original commit message from CVS: - Replace some email addresses with names+email addresses - -2006-12-16 15:25:23 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: We don't support seeking in streaming mode, so don't even try. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_src_query_types), - (gst_qtdemux_handle_src_query), (gst_qtdemux_handle_src_event): - We don't support seeking in streaming mode, so don't even try. - Implement seeking query so apps can query seekability properly - (see #365414). Fix duration query. - -2006-12-15 12:18:21 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - add doap file - Original commit message from CVS: - * Makefile.am: - * gst-plugins-bad.doap: - * gst-plugins-bad.spec.in: - add doap file - -2006-12-15 09:34:31 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/libmms/gstmms.c: These debug statements should be using LOG level. - Original commit message from CVS: - * ext/libmms/gstmms.c: (gst_mms_create): - These debug statements should be using LOG level. - -2006-12-14 15:45:56 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/modplug/libmodplug/sndfile.cpp: Fix potential buffer overflow (CVE-2006-4192) (#385788). - Original commit message from CVS: - * gst/modplug/libmodplug/sndfile.cpp: - Fix potential buffer overflow (CVE-2006-4192) (#385788). - -2006-12-13 17:12:22 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Add AMR-WB to the list of supported formats. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), - (gst_qtdemux_handle_src_query), (qtdemux_parse_trak), - (qtdemux_audio_caps): - Add AMR-WB to the list of supported formats. - -2006-12-12 16:10:21 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/neon/gstneonhttpsrc.c: Fix minor mem leak in redirect code. - Original commit message from CVS: - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_create), - (send_request_and_redirect): - Fix minor mem leak in redirect code. - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/neonhttpsrc.c: (handoff_cb), - (GST_START_TEST), (neonhttpsrc_suite): - * tests/check/gst-plugins-bad.supp: - Add super-basic unit test for #384140. - -2006-12-12 12:46:23 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/neon/gstneonhttpsrc.c: Set offset on buffers pushed out (id3demux gets confused if the first buffer does not have... - Original commit message from CVS: - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_create), - (send_request_and_redirect): - Set offset on buffers pushed out (id3demux gets confused if the - first buffer does not have an offset of 0). Fixes #384140. - -2006-12-12 11:46:05 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/neon/gstneonhttpsrc.c: Minor clean-ups; remove newlines at end of debug statements. - Original commit message from CVS: - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_class_init), - (gst_neonhttp_src_create), (send_request_and_redirect), - (gst_neonhttp_src_start), (oom_callback): - Minor clean-ups; remove newlines at end of debug statements. - -2006-12-11 17:33:26 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Fix non-working redirects from inetfilm.com (handle 'alis' reference data type as well). Fixes... - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_tree): - Fix non-working redirects from inetfilm.com (handle 'alis' reference - data type as well). Fixes #378613. - -2006-12-11 09:51:17 +0000 Jonathan Matthew <jonathan@kaolin.wh9.net> - - gst/modplug/gstmodplug.cc: Fix modplug duration query. Fixes #384294. - Original commit message from CVS: - Patch by: Jonathan Matthew <jonathan at kaolin wh9 net>). - * gst/modplug/gstmodplug.cc: - Fix modplug duration query. Fixes #384294. - -2006-12-08 17:06:43 +0000 René Stadler <mail@renestadler.de> - - gst/qtdemux/qtdemux.c: Fix caps for 24 bit raw PCM audio (2). - Original commit message from CVS: - Patch by: René Stadler <mail at renestadler de> - * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), - (gst_qtdemux_handle_src_query), (qtdemux_parse_trak), - (qtdemux_audio_caps): - Fix caps for 24 bit raw PCM audio (2). - Fixes #383471. - -2006-12-07 11:35:41 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Handle more H263 variants. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), - (gst_qtdemux_handle_src_query), (qtdemux_parse_trak), - (qtdemux_video_caps): - Handle more H263 variants. - -2006-12-06 16:57:17 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/jack/.cvsignore: Ignore old files as requested by the build slave. - Original commit message from CVS: - * ext/jack/.cvsignore: - Ignore old files as requested by the build slave. - -2006-12-06 16:14:35 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Update the Jack requirement to the version where I think options_t appeared - Original commit message from CVS: - * configure.ac: - Update the Jack requirement to the version where I think options_t - appeared - -2006-12-01 10:35:39 +0000 Sergey Scobich <sergey.scobich@gmail.com> - - win32/MANIFEST: Fix compilation on win32 under VS8 - Original commit message from CVS: - * win32/MANIFEST: - Fix compilation on win32 under VS8 - Patch by: Sergey Scobich <sergey dot scobich at gmail dot com> - Partially fixes #381175 - -2006-11-30 15:08:08 +0000 René Stadler <mail@renestadler.de> - - gst/replaygain/gstrganalysis.c: Call the base class handler. Fixes #380610. - Original commit message from CVS: - Patch by: René Stadler <mail at renestadler de> - * gst/replaygain/gstrganalysis.c: (gst_rg_analysis_event): - Call the base class handler. Fixes #380610. - -2006-11-30 11:59:04 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/Makefile.am: Fix build. - Original commit message from CVS: - * ext/Makefile.am: - Fix build. - * ext/jack/gstjackaudiosink.c: (jack_process_cb), - (jack_sample_rate_cb), (jack_buffer_size_cb), (jack_shutdown_cb), - (gst_jack_ring_buffer_acquire): - Small cleanups. - -2006-11-30 11:49:36 +0000 Wim Taymans <wim.taymans@gmail.com> - - Added fully functional jackaudiosink. - Original commit message from CVS: - * configure.ac: - * ext/Makefile.am: - * ext/jack/Makefile.am: - * ext/jack/gstjack.c: (plugin_init): - * ext/jack/gstjack.h: - * ext/jack/gstjackaudiosink.c: (gst_jack_ring_buffer_get_type), - (gst_jack_ring_buffer_class_init), (jack_process_cb), - (jack_sample_rate_cb), (jack_buffer_size_cb), (jack_shutdown_cb), - (gst_jack_ring_buffer_init), (gst_jack_ring_buffer_dispose), - (gst_jack_ring_buffer_finalize), - (gst_jack_ring_buffer_open_device), - (gst_jack_ring_buffer_close_device), - (gst_jack_ring_buffer_acquire), (gst_jack_ring_buffer_release), - (gst_jack_ring_buffer_start), (gst_jack_ring_buffer_pause), - (gst_jack_ring_buffer_stop), (gst_jack_ring_buffer_delay), - (gst_jack_connect_get_type), (gst_jack_audio_sink_base_init), - (gst_jack_audio_sink_class_init), (gst_jack_audio_sink_init), - (gst_jack_audio_sink_set_property), - (gst_jack_audio_sink_get_property), (gst_jack_audio_sink_getcaps), - (gst_jack_audio_sink_create_ringbuffer): - * ext/jack/gstjackaudiosink.h: - Added fully functional jackaudiosink. - -2006-11-27 17:16:26 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Remove some asserts and replace them with a proper error message. Fixes #379261. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), - (gst_qtdemux_handle_src_query), (qtdemux_parse_trak): - Remove some asserts and replace them with a proper error - message. Fixes #379261. - -2006-11-26 17:23:14 +0000 Michael Smith <msmith@xiph.org> - - ext/theora/theoradec.c: Send events on the right pads, since they don't work very well if you send them in the wrong ... - Original commit message from CVS: - * ext/theora/theoradec.c: (theora_dec_src_query), - (theora_dec_src_event), (theora_handle_data_packet), - (theora_dec_chain): - Send events on the right pads, since they don't work very well if - you send them in the wrong direction. - -2006-11-24 09:05:39 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - remove obsolete _factory_init protos and functions - Original commit message from CVS: - * ext/audiofile/gstafsink.c: - * ext/polyp/plugin.c: (plugin_init): - * ext/polyp/polypsink.c: - * ext/polyp/polypsink.h: - * sys/dxr3/dxr3audiosink.h: - * sys/dxr3/dxr3spusink.h: - * sys/dxr3/dxr3videosink.h: - remove obsolete _factory_init protos and functions - -2006-11-21 13:00:08 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - add rfbsrc plugin - Original commit message from CVS: - add rfbsrc plugin - -2006-11-19 12:02:13 +0000 Michael Smith <msmith@xiph.org> - - gst/librfb/Makefile.am: Compile with appropriate cflags. Fixes build. - Original commit message from CVS: - * gst/librfb/Makefile.am: - Compile with appropriate cflags. Fixes build. - -2006-11-17 18:51:58 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: Actually set the TONE parameter for DVB-S when we should. - Original commit message from CVS: - 2006-11-17 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * sys/dvb/gstdvbsrc.c: (gst_dvbsrc_tune): - Actually set the TONE parameter for DVB-S when we should. - -2006-11-17 03:51:04 +0000 David Schleef <ds@schleef.org> - - gst/librfb/rfbdecoder.c: Fixes for 64-bit architectures. - Original commit message from CVS: - * gst/librfb/rfbdecoder.c: Fixes for 64-bit architectures. - -2006-11-17 03:29:32 +0000 David Schleef <ds@schleef.org> - - gst/librfb/gstrfbsrc.h: Oops, add this file. - Original commit message from CVS: - * gst/librfb/gstrfbsrc.h: Oops, add this file. - -2006-11-17 03:15:40 +0000 Andre Moreira Magalhaes <andrunko@gmail.com> - - Port librfb to 0.10 (#376106). - Original commit message from CVS: - Patch by: Andre Moreira Magalhaes <andrunko@gmail.com> - * configure.ac: - * gst/librfb/Makefile.am: - * gst/librfb/gstrfbsrc.c: - * gst/librfb/rfb.c: - * gst/librfb/rfb.h: - * gst/librfb/rfbbuffer.c: - * gst/librfb/rfbbuffer.h: - * gst/librfb/rfbbytestream.c: - * gst/librfb/rfbbytestream.h: - * gst/librfb/rfbcontext.h: - * gst/librfb/rfbdecoder.c: - * gst/librfb/rfbdecoder.h: - * gst/librfb/rfbutil.h: - Port librfb to 0.10 (#376106). - -2006-11-16 18:22:37 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/spc/gstspc.c: Fix build with disabled gst-debug. - Original commit message from CVS: - * ext/spc/gstspc.c: (spc_play): - Fix build with disabled gst-debug. - -2006-11-15 16:19:56 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - update spec file with latest changes - Original commit message from CVS: - update spec file with latest changes - -2006-11-15 12:35:46 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/: Some small clean-ups: use enums instead of hard-coded numbers, const-ify element details, re-factor som... - Original commit message from CVS: - Patch by: Sebastian Dröge <slomo@circular-chaos.org> - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_reset), - (gst_wavpack_dec_init), (gst_wavpack_dec_change_state): - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_base_init), - (gst_wavpack_enc_class_init), (gst_wavpack_enc_reset), - (gst_wavpack_enc_init), (gst_wavpack_enc_set_wp_config), - (gst_wavpack_enc_change_state): - * ext/wavpack/gstwavpackparse.c: - Some small clean-ups: use enums instead of hard-coded numbers, - const-ify element details, re-factor some code into _reset() - functions (#352605). - -2006-11-14 15:04:52 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - add missing files from SPEC - Original commit message from CVS: - add missing files from SPEC - -2006-11-14 12:33:33 +0000 Tim-Philipp Müller <tim@centricular.net> - - sys/dvb/gstdvbsrc.*: Fix minor printf format issue; remove overly paranoid checks in create function; fix GObject boi... - Original commit message from CVS: - * sys/dvb/gstdvbsrc.c: (gst_dvbsrc_create): - * sys/dvb/gstdvbsrc.h: - Fix minor printf format issue; remove overly paranoid checks in - create function; fix GObject boilerplate macros. - -2006-11-14 11:43:40 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Don't parse extra sample params for raw pcm. Fixes #374914. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), - (gst_qtdemux_handle_src_query), (qtdemux_parse_trak): - Don't parse extra sample params for raw pcm. Fixes #374914. - -2006-11-14 11:39:39 +0000 Wim Taymans <wim.taymans@gmail.com> - - tests/check/elements/.cvsignore: Add cdaudio to ignore. - Original commit message from CVS: - * tests/check/elements/.cvsignore: - Add cdaudio to ignore. - -2006-11-14 10:52:52 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/Makefile.am: dist cdaudio dir. - Original commit message from CVS: - * ext/Makefile.am: - dist cdaudio dir. - -2006-11-14 10:42:19 +0000 Wim Taymans <wim.taymans@gmail.com> - - Fix cdaudio build. - Original commit message from CVS: - * configure.ac: - * ext/Makefile.am: - Fix cdaudio build. + * sys/va/gstvaprofile.c: + * sys/va/gstvaprofile.h: + va: Add the profile string name into the profile_map. + We also add a helper function of gst_va_profile_from_name to get + the VA profile value by its profile string name. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1051> -2006-11-14 10:31:29 +0000 Wim Taymans <wim.taymans@gmail.com> +2021-10-05 01:53:47 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - give credit - Original commit message from CVS: - give credit - -2006-11-14 10:25:16 +0000 Wim Taymans <wim.taymans@gmail.com> - - tests/check/: Added y4m test. Fixes #372243. - Original commit message from CVS: - * tests/check/Makefile.am: - * tests/check/elements/y4menc.c: (setup_y4menc), (cleanup_y4menc), - (GST_START_TEST), (y4menc_suite), (main): - Added y4m test. Fixes #372243. - -2006-11-13 18:55:57 +0000 Mark Nauwelaerts <manauw@skynet.be> - - configure.ac: Enable cdaudio and y4m. - Original commit message from CVS: - Patch by: Mark Nauwelaerts <manauw at skynet be> - * configure.ac: - Enable cdaudio and y4m. - * gst/y4m/Makefile.am: - * gst/y4m/gsty4mencode.c: (gst_y4m_encode_base_init), - (gst_y4m_encode_class_init), (gst_y4m_encode_init), - (gst_y4m_encode_reset), (gst_y4m_encode_setcaps), - (gst_y4m_encode_get_stream_header), - (gst_y4m_encode_get_frame_header), (gst_y4m_encode_chain), - (gst_y4m_encode_set_property), (gst_y4m_encode_get_property), - (gst_y4m_encode_change_state), (plugin_init): - * gst/y4m/gsty4mencode.h: - Port of y4mencode to 0.10. - -2006-11-11 00:22:24 +0000 David Schleef <ds@schleef.org> - - A little pluggy to make sense out of the random chunks we get from multifilesrc. - Original commit message from CVS: - * configure.ac: - * gst/videoparse/Makefile.am: - * gst/videoparse/gstvideoparse.c: - A little pluggy to make sense out of the random chunks we get - from multifilesrc. - -2006-11-10 19:18:33 +0000 David Schleef <ds@schleef.org> - - gst/multifile/Makefile.am: Let's not depend on a file that doesn't exist. - Original commit message from CVS: - * gst/multifile/Makefile.am: - Let's not depend on a file that doesn't exist. - -2006-11-10 19:07:43 +0000 David Schleef <ds@schleef.org> - - gst/multifilesink/: Remove the old one. - Original commit message from CVS: - * gst/multifilesink/Makefile.am: - * gst/multifilesink/gstmultifilesink.c: - * gst/multifilesink/gstmultifilesink.h: - * gst/multifilesink/multifilesink.vcproj: - Remove the old one. - -2006-11-10 18:51:10 +0000 David Schleef <ds@schleef.org> - - Revive multifilesrc|sink. - Original commit message from CVS: - * configure.ac: - * gst/multifile/Makefile.am: - * gst/multifile/gstmultifile.c: - * gst/multifile/gstmultifilesink.c: - * gst/multifile/gstmultifilesrc.c: - * gst/multifile/multifile.vproj: - Revive multifilesrc|sink. - -2006-11-09 14:00:34 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: (gst_dvbsrc_set_property) - Original commit message from CVS: - 2006-11-09 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * sys/dvb/gstdvbsrc.c: (gst_dvbsrc_set_property) - (gst_dvbsrc_create), (gst_dvbsrc_output_frontend_stats), - (gst_dvbsrc_tune), (gst_dvbsrc_set_pes_filters): - Rename set_pes_filter to set_pes_filters for consistency. - Do run-time pid filtering. - -2006-11-08 11:27:16 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.c: Do not call output_frontend_stats from a method that does not have the gstdvbsrc object. - Original commit message from CVS: - 2006-11-08 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * sys/dvb/gstdvbsrc.c: (read_device): - Do not call output_frontend_stats from a method that does not - have the gstdvbsrc object. - This fixes the build, sorry guys! - -2006-11-07 14:46:56 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/gstdvbsrc.*: Force PAT to always be in the filter. - Original commit message from CVS: - 2006-11-07 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * sys/dvb/gstdvbsrc.c: (read_device), (gst_dvbsrc_create), - (gst_dvbsrc_output_frontend_stats), (gst_dvbsrc_tune), - (gst_dvbsrc_set_pes_filter): - * sys/dvb/gstdvbsrc.h: - Force PAT to always be in the filter. - Try to continue reading after failing 10 times. - -2006-11-04 13:26:41 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - po/POTFILES.in: add dvbsrc - Original commit message from CVS: - * po/POTFILES.in: - add dvbsrc - * sys/dvb/gstdvbsrc.c: (gst_dvbsrc_class_init), (gst_dvbsrc_init), - (gst_dvbsrc_set_property), (gst_dvbsrc_get_property), - (gst_dvbsrc_open_frontend), (gst_dvbsrc_open_dvr), - (gst_dvbsrc_finalize), (read_device), (gst_dvbsrc_create), - (gst_dvbsrc_start), (gst_dvbsrc_frontend_status), - (gst_dvbsrc_tune), (gst_dvbsrc_unset_pes_filters), - (gst_dvbsrc_set_pes_filter): - * sys/dvb/gstdvbsrc.h: - adapter-prefix is a terrible name for a device, so replace it. - strerror should be used immediately after the syscall related to it. - Actually throw a reasonable GST_ELEMENT_ERROR if we fail to open - (pretty easy to trigger by opening the same device twice). - Use _OBJECT macros where it makes sense. - This element is going to need some work before it moves. - -2006-11-02 20:13:26 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Fix enum nicks; only emit no-more-pads once; add support for very fast encoding mode in upcoming 4.40.0 release (#369... - Original commit message from CVS: - Patch by: Sebastian Dröge <slomo at circular-chaos.org> - * configure.ac: - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_mode_get_type), - (gst_wavpack_enc_correction_mode_get_type), - (gst_wavpack_enc_joint_stereo_mode_get_type), - (gst_wavpack_enc_init), (gst_wavpack_enc_set_wp_config): - Fix enum nicks; only emit no-more-pads once; add support for very - fast encoding mode in upcoming 4.40.0 release (#369539). - -2006-11-01 10:19:18 +0000 Sergey Scobich <sergey.scobich@gmail.com> - - sys/: Wait until the window is created before using it; guard unistd.h includes with HAVE_UNISTD_H. (#366523) - Original commit message from CVS: - Patch by: Sergey Scobich <sergey dot scobich at gmail com> - * sys/directdraw/gstdirectdrawsink.c: - (gst_directdrawsink_window_thread), - (gst_directdrawsink_create_default_window): - * sys/directdraw/gstdirectdrawsink.h: - * sys/directsound/gstdirectsoundsink.c: - Wait until the window is created before using it; guard unistd.h - includes with HAVE_UNISTD_H. (#366523) - * win32/vs8/libgstdirectdraw.vcproj: - * win32/vs8/libgstdirectsound.vcproj: - Update project files. - -2006-10-31 10:31:18 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Handle unbounded length streams a bit better. Fixes #367696. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), - (gst_qtdemux_handle_src_query), (qtdemux_parse_tree), - (qtdemux_parse_trak): - Handle unbounded length streams a bit better. Fixes #367696. - -2006-10-29 19:08:01 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/dts/gstdtsdec.c: Fix flow handling and buffer refcounting (gst_pad_push() takes ownership of the buffer passed to... - Original commit message from CVS: - * ext/dts/gstdtsdec.c: (gst_dtsdec_handle_frame): - Fix flow handling and buffer refcounting (gst_pad_push() takes - ownership of the buffer passed to it, the buffer does not have - to be unreffed no matter what flow value gst_pad_push() returns). - -2006-10-28 16:00:51 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/audioresample/gstaudioresample.c: Another typo fix (#366212). - Original commit message from CVS: - * gst/audioresample/gstaudioresample.c: (gst_audioresample_init): - Another typo fix (#366212). + * sys/va/gstvaprofile.c: + va: Change the H264 profile string order in the profile_map. + The first one should be the one that matches the VA profile's name + most precisely. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1051> -2006-10-26 14:07:08 +0000 Edgard Lima <edgard.lima@indt.org.br> +2021-10-05 01:45:25 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * gst/nuvdemux/gstnuvdemux.c: - * gst/nuvdemux/gstnuvdemux.h: - Fixed bug for files with timestamps less than 0. - Original commit message from CVS: - Fixed bug for files with timestamps less than 0. - -2006-10-21 22:56:03 +0000 David Schleef <ds@schleef.org> - - I copied over filesink a while ago and modified it to work as multifilesink. Might as well check it in. This could ... - Original commit message from CVS: - * configure.ac: - * gst/multifilesink/Makefile.am: - * gst/multifilesink/gstmultifilesink.c: - * gst/multifilesink/gstmultifilesink.h: - I copied over filesink a while ago and modified it to work - as multifilesink. Might as well check it in. This could - use some work before being declared useful. - -2006-10-17 15:16:47 +0000 Tim-Philipp Müller <tim@centricular.net> - - Activate pads before adding them to running element. - Original commit message from CVS: - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_set_wp_config): - * ext/wavpack/gstwavpackparse.c: - (gst_wavpack_parse_create_src_pad): - * gst/nuvdemux/gstnuvdemux.c: (gst_nuv_demux_create_pads): - * tests/check/elements/wavpackparse.c: (wavpackparse_found_pad): - Activate pads before adding them to running element. - -2006-10-17 14:57:17 +0000 Josep Torra Valles <josep@fluendo.com> - - gst/qtdemux/qtdemux.c: Make compile with Forte compiler, mostly don't do pointer arithmetic with void pointers (#3626... - Original commit message from CVS: - Patch by: Josep Torra Valles <josep at fluendo com> - * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), - (next_entry_size), (qtdemux_inflate), (qtdemux_parse_moov), - (qtdemux_parse_tree), (qtdemux_parse_trak), (qtdemux_tag_add_str), - (qtdemux_tag_add_num), (qtdemux_tag_add_date), - (qtdemux_tag_add_gnre): - Make compile with Forte compiler, mostly don't do pointer arithmetic - with void pointers (#362626). + * sys/va/gstvacaps.c: + * sys/va/gstvacaps.h: + va: caps: Expose gst_va_create_coded_caps as helper function. + And allow free indentation for array declaration. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1051> -2006-10-17 14:40:20 +0000 Edgard Lima <edgard.lima@indt.org.br> +2021-10-05 01:43:28 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * gst/nuvdemux/gstnuvdemux.c: - Just a cast to make it compile oos big_endian systems. - Original commit message from CVS: - Just a cast to make it compile oos big_endian systems. + * tests/check/libs/h264bitwriter.c: + * tests/check/meson.build: + test: Add test cases for the H264 bitwriter. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1051> -2006-10-17 14:24:18 +0000 Edgard Lima <edgard.lima@indt.org.br> +2021-10-05 01:42:41 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * configure.ac: - * gst/nuvdemux/Makefile.am: - * gst/nuvdemux/gstnuvdemux.c: - * gst/nuvdemux/gstnuvdemux.h: - Created new element nuvdemux. - Original commit message from CVS: - Created new element nuvdemux. - -2006-10-17 11:04:14 +0000 Josep Torra Valles <josep@fluendo.com> - - gst/nsf/: Fix some things the Forte compiler warns about (#362626). - Original commit message from CVS: - Patch by: Josep Torra Valles <josep at fluendo com> - * gst/nsf/fds_snd.c: - * gst/nsf/mmc5_snd.c: - * gst/nsf/nsf.c: - * gst/nsf/vrc7_snd.c: - * gst/nsf/vrcvisnd.c: - Fix some things the Forte compiler warns about (#362626). - -2006-10-17 10:59:55 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.*: Avoid void pointer usage, better use guint8 * instead. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_moov), (qtdemux_parse), - (qtdemux_node_dump_foreach), (qtdemux_dump_mvhd), - (qtdemux_dump_tkhd), (qtdemux_dump_elst), (qtdemux_dump_mdhd), - (qtdemux_dump_hdlr), (qtdemux_dump_vmhd), (qtdemux_dump_dref), - (qtdemux_dump_stsd), (qtdemux_dump_stts), (qtdemux_dump_stss), - (qtdemux_dump_stsc), (qtdemux_dump_stsz), (qtdemux_dump_stco), - (qtdemux_dump_co64), (qtdemux_dump_dcom), (qtdemux_dump_cmvd), - (qtdemux_dump_unknown), (qtdemux_tree_get_child_by_type), - (qtdemux_tree_get_sibling_by_type): - * gst/qtdemux/qtdemux.h: - Avoid void pointer usage, better use guint8 * instead. - -2006-10-11 20:33:48 +0000 Tim-Philipp Müller <tim@centricular.net> - - Port simple deinterlacer from 0.8. Use at your own risk, don't blame me for anything it does or does not do to your p... - Original commit message from CVS: - * configure.ac: - * gst/deinterlace/Makefile.am: - * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_base_init), - (gst_deinterlace_class_init), (gst_deinterlace_init), - (gst_deinterlace_stop), (gst_deinterlace_transform_caps), - (gst_deinterlace_set_caps), (gst_deinterlace_transform_ip), - (gst_deinterlace_set_property), (gst_deinterlace_get_property): - * gst/deinterlace/gstdeinterlace.h: - Port simple deinterlacer from 0.8. Use at your own risk, don't blame - me for anything it does or does not do to your precious pictures. - -2006-10-11 13:49:26 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: Add some fourcc for DV format. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): - Add some fourcc for DV format. - -2006-10-10 18:54:05 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Printf format fixes. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (extract_initial_length_and_fourcc), - (gst_qtdemux_loop_state_header): - Printf format fixes. - * sys/dvb/gstdvbsrc.c: - Use "_stdint.h". - -2006-10-10 16:09:58 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/dvb/: Remove these files, not needed use system files. - Original commit message from CVS: - 2006-10-10 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * sys/dvb/Makefile.am: - * sys/dvb/dvb-api/Makefile.am: - * sys/dvb/dvb-api/audio.h: - * sys/dvb/dvb-api/ca.h: - * sys/dvb/dvb-api/dmx.h: - * sys/dvb/dvb-api/frontend.h: - * sys/dvb/dvb-api/net.h: - * sys/dvb/dvb-api/osd.h: - * sys/dvb/dvb-api/version.h: - * sys/dvb/dvb-api/video.h: - Remove these files, not needed use system files. - * sys/dvb/gstdvbsrc.c: (gst_dvbsrc_set_property), - (gst_dvbsrc_create), (gst_dvbsrc_output_frontend_stats), - (gst_dvbsrc_tune): - Fix warnings, uint16_t etc. is in stdint.h. - Use system includes not our local ones. - -2006-10-10 15:55:25 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * po/.gitignore: - Buildbot, I do as you command. http://build.fluendo.com:8080/gen64-bad-full/builds/475/cvs%20ignore/1 - Original commit message from CVS: - Buildbot, I do as you command. - http://build.fluendo.com:8080/gen64-bad-full/builds/475/cvs%20ignore/1 - -2006-10-10 15:47:49 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - Add dvb detection and allow dvbsrc to be built. - Original commit message from CVS: - 2006-10-10 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * configure.ac: - * sys/Makefile.am: - Add dvb detection and allow dvbsrc to be built. - -2006-10-10 15:05:32 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - Initial import of dvbsrc. - Original commit message from CVS: - 2006-10-10 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * configure.ac: - * sys/Makefile.am: - * sys/dvb/AUTHORS: - * sys/dvb/Makefile.am: - * sys/dvb/README: - * sys/dvb/dvb-api/Makefile.am: - * sys/dvb/dvb-api/audio.h: - * sys/dvb/dvb-api/ca.h: - * sys/dvb/dvb-api/dmx.h: - * sys/dvb/dvb-api/frontend.h: - * sys/dvb/dvb-api/net.h: - * sys/dvb/dvb-api/osd.h: - * sys/dvb/dvb-api/version.h: - * sys/dvb/dvb-api/video.h: - * sys/dvb/gstdvbsrc.c: - * sys/dvb/gstdvbsrc.h: - Initial import of dvbsrc. - Currently won't be built. - -2006-10-10 12:49:02 +0000 Josep Torre Valles <josep@fluendo.com> - - ext/gnomevfs/: Fix URI interface implementation return type. - Original commit message from CVS: - 2006-10-10 Zaheer Abbas Merali <zaheerabbas at merali dot org> - Patch by: Josep Torre Valles <josep@fluendo.com> - * ext/gnomevfs/gstgnomevfssink.c: - * ext/gnomevfs/gstgnomevfssrc.c: - Fix URI interface implementation return type. - * ext/pango/gsttextoverlay.c: (gst_text_overlay_set_property): - Fix what looks like a copy/paste issue when assigning values. - * gst-libs/gst/audio/gstaudiofiltertemplate.c: - (gst_audio_filter_template_get_type): - Cast to prevent Forte warnings. - * gst-libs/gst/cdda/gstcddabasesrc.c: (gst_cdda_base_src_create): - Fix URI interface implementation return type. - gst_pad_query_position requires a signed integer pointer as - 3rd parameter, GstClockTime is unsigned. - * gst/audioconvert/audioconvert.c: - Fix integer overflow when treated as signed. - * gst/audioresample/resample.c: (resample_add_input_data): - Cast to prevent warnings on Forte. - * gst/ffmpegcolorspace/imgconvert.c: (build_rgb_palette): - Fix integer overflow when treated as signed. - * gst/ffmpegcolorspace/imgconvert_template.h: - Fix integer overflow when treated as signed. RGBA_OUT shifts bits. - * gst/playback/gstdecodebin.c: (queue_filled_cb), - (cleanup_decodebin): - Who initialises a guint to -1! - Cast function pointers to prevent warnings on Forte. - * gst/playback/gstplaybasebin.c: (queue_deadlock_check), - (queue_threshold_reached): - Cast function pointers correctly to prevent warnings on Forte. - * gst/playback/gststreaminfo.c: (gst_stream_info_dispose): - Cast function pointers correctly to prevent warnings on Forte. - * gst/subparse/gstssaparse.c: (gst_ssa_parse_setcaps): - Obvious change to unsigned, 0xEF > max signed char. - * gst/tcp/gstmultifdsink.c: (get_buffers_max), (count_burst_unit): - GstClockTime is unsigned, initialise correctly. - * gst/tcp/gsttcp.c: (gst_tcp_socket_write): - Cast so pointer arithemetic doesn't cause warnings on Forte. - * gst/videorate/gstvideorate.c: - Use correct return value. - * tests/examples/seek/scrubby.c: - GstClockTime is unsigned, initialise correctly. - -2006-10-10 09:57:19 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Reorganise some stuff. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), - (gst_qtdemux_push_event), (gst_qtdemux_do_seek), - (gst_qtdemux_change_state), (extract_initial_length_and_fourcc), - (gst_qtdemux_loop_state_header), (gst_qtdemux_activate_segment), - (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), - (gst_qtdemux_post_buffering), (gst_qtdemux_chain), - (gst_qtdemux_add_stream), (qtdemux_process_redirects), - (qtdemux_parse_tree), (qtdemux_parse_trak): - Reorganise some stuff. - Parse RTSP redirection URLS. - -2006-10-07 11:37:59 +0000 Tim-Philipp Müller <tim@centricular.net> - - docs/plugins/: Add/update docs stuff. - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/inspect/plugin-dtsdec.xml: - * docs/plugins/inspect/plugin-mms.xml: - * docs/plugins/inspect/plugin-mpeg2enc.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-replaygain.xml: - * docs/plugins/inspect/plugin-soundtouch.xml: - * docs/plugins/inspect/plugin-spcdec.xml: - * docs/plugins/inspect/plugin-swfdec.xml: - * docs/plugins/inspect/plugin-videocrop.xml: - * docs/plugins/inspect/plugin-wavpack.xml: - Add/update docs stuff. - -2006-10-06 15:56:01 +0000 René Stadler <mail@renestadler.de> - - Add ReplayGain analysis element (#357069). - Original commit message from CVS: - Patch by: René Stadler <mail at renestadler de> - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/replaygain/Makefile.am: - * gst/replaygain/gstrganalysis.c: (gst_rg_analysis_base_init), - (gst_rg_analysis_class_init), (gst_rg_analysis_init), - (gst_rg_analysis_set_property), (gst_rg_analysis_get_property), - (gst_rg_analysis_start), (gst_rg_analysis_set_caps), - (gst_rg_analysis_transform_ip), (gst_rg_analysis_event), - (gst_rg_analysis_stop), (gst_rg_analysis_handle_tags), - (gst_rg_analysis_handle_eos), (gst_rg_analysis_track_result), - (gst_rg_analysis_album_result), (plugin_init): - * gst/replaygain/gstrganalysis.h: - * gst/replaygain/rganalysis.c: (yule_filter), (butter_filter), - (apply_filters), (reset_filters), (accumulator_add), - (accumulator_clear), (accumulator_result), (rg_analysis_new), - (rg_analysis_set_sample_rate), (rg_analysis_destroy), - (rg_analysis_analyze_mono_float), - (rg_analysis_analyze_stereo_float), - (rg_analysis_analyze_mono_int16), - (rg_analysis_analyze_stereo_int16), (rg_analysis_analyze), - (rg_analysis_track_result), (rg_analysis_album_result), - (rg_analysis_reset_album), (rg_analysis_reset): - * gst/replaygain/rganalysis.h: - Add ReplayGain analysis element (#357069). - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/rganalysis.c: (get_expected_gain), - (setup_rganalysis), (cleanup_rganalysis), (set_playing_state), - (send_eos_event), (send_tag_event), (poll_eos), (poll_tags), - (fail_unless_track_gain), (fail_unless_track_peak), - (fail_unless_album_gain), (fail_unless_album_peak), - (fail_if_track_tags), (fail_if_album_tags), - (fail_unless_num_tracks), (test_buffer_const_float_mono), - (test_buffer_const_float_stereo), (test_buffer_const_int16_mono), - (test_buffer_const_int16_stereo), (test_buffer_square_float_mono), - (test_buffer_square_float_stereo), (test_buffer_square_int16_mono), - (test_buffer_square_int16_stereo), (push_buffer), (GST_START_TEST), - (rganalysis_suite), (main): - Unit tests for the new replaygain element. - -2006-10-06 15:49:39 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/faad/gstfaad.c: Some cleanups. - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_setcaps), (gst_faad_chain), - (gst_faad_close_decoder): - Some cleanups. - Added some more debugging. - Don't ever ignore unlinked, we're not a demuxer. - * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream): - Activate pad before adding it to the element. - -2006-10-06 12:02:09 +0000 Michael Smith <msmith@xiph.org> - - ext/theora/theoradec.*: Port lots of changes from theoradec to theoraexpdec. - Original commit message from CVS: - * ext/theora/theoradec.c: (gst_theoradec_reset), - (theora_get_query_types), (theora_dec_src_query), - (theora_dec_src_event), (theora_dec_sink_event), - (theora_handle_comment_packet), (theora_handle_type_packet), - (theora_handle_header_packet), (clip_buffer), (theora_dec_push), - (theora_handle_422_image), (theora_handle_420_image), - (theora_handle_data_packet), (theora_dec_chain), - (theora_dec_change_state): - * ext/theora/theoradec.h: - Port lots of changes from theoradec to theoraexpdec. - This catches this plugin up to theoradec. Note that duplicate frames - are broken in theoradec at the moment. - -2006-10-06 11:31:11 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/spectrum/gstspectrum.c: Fix mem leak, avoid unnecessary memcpy. - Original commit message from CVS: - * gst/spectrum/gstspectrum.c: (gst_spectrum_transform_ip): - Fix mem leak, avoid unnecessary memcpy. - -2006-10-06 02:29:35 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/gstspectrum.c: Removed cruft code that was just commented out. Removed some obsolete debug logs statements. - Original commit message from CVS: - * gst/spectrum/gstspectrum.c: (gst_spectrum_init), - (gst_spectrum_transform_ip): - Removed cruft code that was just commented out. Removed some obsolete - debug logs statements. - -2006-10-05 18:14:46 +0000 Tim-Philipp Müller <tim@centricular.net> - - Another batch of printf format fixes. - Original commit message from CVS: - * ext/dts/gstdtsdec.c: (gst_dtsdec_chain): - * ext/musicbrainz/gsttrm.c: (gst_trm_setcaps): - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_sink_set_caps): - * gst/qtdemux/qtdemux.c: (gst_qtdemux_chain), (qtdemux_parse), - (qtdemux_parse_trak): - * gst/spectrum/gstspectrum.c: (gst_spectrum_transform_ip): - Another batch of printf format fixes. - -2006-10-05 15:55:20 +0000 Tim-Philipp Müller <tim@centricular.net> - - Printf format fixes. - Original commit message from CVS: - * ext/alsa/gstalsadeviceprobe.c: - (gst_alsa_device_property_probe_get_values): - * ext/alsa/gstalsasink.c: (set_hwparams): - * ext/ogg/gstoggdemux.c: (gst_ogg_demux_chain_elem_pad), - (gst_ogg_chain_new_stream), (gst_ogg_demux_read_chain): - * ext/ogg/gstoggmux.c: (gst_ogg_mux_send_headers), - (gst_ogg_mux_process_best_pad): - * ext/ogg/gstoggparse.c: (gst_ogg_parse_new_stream), - (gst_ogg_parse_chain): - * ext/ogg/gstogmparse.c: (gst_ogm_parse_stream_header): - * ext/vorbis/vorbisdec.c: (vorbis_handle_data_packet): - * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_setup), - (gst_vorbis_enc_buffer_check_discontinuous): - * ext/vorbis/vorbisparse.c: (vorbis_parse_src_query): - * gst-libs/gst/audio/gstbaseaudiosink.c: - (gst_base_audio_sink_render): - * gst-libs/gst/cdda/gstcddabasesrc.c: - (gst_cdda_base_src_handle_track_seek): - * gst-libs/gst/rtp/gstbasertpdepayload.c: - (gst_base_rtp_depayload_push_full): - * gst-libs/gst/rtp/gstbasertppayload.c: (gst_basertppayload_push): - * gst/audioresample/resample.c: (resample_input_pushthrough): - * gst/playback/gstplaybasebin.c: (queue_out_of_data): - * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_handle_clients): - * gst/typefind/gsttypefindfunctions.c: (mp3_type_find_at_offset), - (wavpack_type_find): - * gst/videotestsrc/gstvideotestsrc.c: (gst_video_test_src_create): - * sys/xvimage/xvimagesink.c: (gst_xvimage_buffer_destroy), - (gst_xvimagesink_check_xshm_calls), (gst_xvimagesink_xvimage_new): - * tests/check/elements/volume.c: (GST_START_TEST): - Printf format fixes. - -2006-10-04 22:37:07 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/videocrop/gstvideocrop.*: Handle packed YUV formats (UYVY, YUY2, YUYV) separately; also, fix passthrough mode; la... - Original commit message from CVS: - * gst/videocrop/gstvideocrop.c: (gst_video_crop_class_init), - (gst_video_crop_init), - (gst_video_crop_get_image_details_from_caps), - (gst_video_crop_transform_packed_complex), - (gst_video_crop_transform_packed_simple), - (gst_video_crop_transform), (gst_video_crop_transform_caps), - (gst_video_crop_set_caps), - (gst_videocrop_clear_negotiated_caps_locked), - (gst_video_crop_set_property): - * gst/videocrop/gstvideocrop.h: - Handle packed YUV formats (UYVY, YUY2, YUYV) separately; also, fix - passthrough mode; lastly, clear negotiated basetransform caps when - the cropping changes in order to force renegotiation. - -2006-10-04 20:05:07 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/icles/: Visual test for videocrop, shows that packed yuv doesn't work right yet. --with-ffmpegcolorspace option... - Original commit message from CVS: - * tests/icles/.cvsignore: - * tests/icles/Makefile.am: - * tests/icles/videocrop-test.c: (quit_mainloop), (tick_cb), - (test_with_caps), (video_crop_get_test_caps), (main): - Visual test for videocrop, shows that packed yuv doesn't work right - yet. --with-ffmpegcolorspace option doesn't work yet for unknown - reasons (another basetransform issue?) - -2006-10-04 10:55:21 +0000 Tim-Philipp Müller <tim@centricular.net> - - Remove more v4l2 stuff, hopefully fixing 'make distcheck' again. - Original commit message from CVS: - * po/POTFILES.in: - * sys/v4l2/.cvsignore: - Remove more v4l2 stuff, hopefully fixing 'make distcheck' again. - -2006-10-04 10:29:22 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - removed v4l2 - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-video4linux2.xml: - * gst-plugins-bad.spec.in: - removed v4l2 - -2006-10-03 18:32:31 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * tests/icles/Makefile.am: - * tests/icles/v4l2src-test.c: - removing icle for v4l2 - Original commit message from CVS: - removing icle for v4l2 - -2006-10-03 18:27:57 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * configure.ac: - remove last cond - Original commit message from CVS: - remove last cond - -2006-10-03 18:23:21 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - moved to gst-plugins-good - Original commit message from CVS: - * configure.ac: - * sys/Makefile.am: - * sys/v4l2/Makefile.am: - * sys/v4l2/README: - * sys/v4l2/gstv4l2.c: - * sys/v4l2/gstv4l2colorbalance.c: - * sys/v4l2/gstv4l2colorbalance.h: - * sys/v4l2/gstv4l2object.c: - * sys/v4l2/gstv4l2object.h: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/gstv4l2tuner.c: - * sys/v4l2/gstv4l2tuner.h: - * sys/v4l2/gstv4l2vidorient.c: - * sys/v4l2/gstv4l2vidorient.h: - * sys/v4l2/gstv4l2xoverlay.c: - * sys/v4l2/gstv4l2xoverlay.h: - * sys/v4l2/v4l2_calls.c: - * sys/v4l2/v4l2_calls.h: - * sys/v4l2/v4l2src_calls.c: - * sys/v4l2/v4l2src_calls.h: - moved to gst-plugins-good - -2006-10-03 13:47:10 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * sys/v4l2/gstv4l2object.c: - comment out the notifies for removed properties - Original commit message from CVS: - comment out the notifies for removed properties - -2006-10-03 13:30:48 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - sys/v4l2/gstv4l2object.c: comment out the properties that are already part of the tuner interface. - Original commit message from CVS: - * sys/v4l2/gstv4l2object.c: - (gst_v4l2_object_install_properties_helper): - comment out the properties that are already part of the tuner - interface. - -2006-10-03 13:18:59 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/v4l2/gstv4l2src.c: Improve docs. - Original commit message from CVS: - 2006-10-03 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * sys/v4l2/gstv4l2src.c: - Improve docs. - -2006-10-02 13:28:49 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/xvid/gstxvid.c: Set rank of xviddec to NONE until someone fixes it (too many crasher bug reports against totem, p... - Original commit message from CVS: - * ext/xvid/gstxvid.c: (plugin_init): - Set rank of xviddec to NONE until someone fixes it (too many crasher - bug reports against totem, people should use gst-ffmpeg). - -2006-09-28 17:08:47 +0000 Wim Taymans <wim.taymans@gmail.com> - - sys/v4l2/: Framerate can be 0/1 too. - Original commit message from CVS: - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_all_caps), - (gst_v4l2src_get_caps): - * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): - Framerate can be 0/1 too. - Init framerate to 0/1 before querying it so that we can detect - devices that don't know about a framerate. - Add some more debugging info. - -2006-09-28 14:31:41 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Add support for 'yv12' fourcc. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): - Add support for 'yv12' fourcc. + * gst-libs/gst/codecparsers/gsth264bitwriter.c: + * gst-libs/gst/codecparsers/gsth264bitwriter.h: + * gst-libs/gst/codecparsers/meson.build: + codecparsers: bitwriter: Add the common bit writer functions for H264. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1051> -2006-09-27 17:47:57 +0000 Edgard Lima <edgard.lima@indt.org.br> +2021-10-05 01:41:07 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/gstv4l2src.h: - * tests/icles/v4l2src-test.c: - Removed set-undef-fps. - Original commit message from CVS: - Removed set-undef-fps. - -2006-09-27 17:04:22 +0000 Wim Taymans <wim.taymans@gmail.com> - - sys/v4l2/: Renamed some properties to match the tuner interface naming. - Original commit message from CVS: - * sys/v4l2/gstv4l2object.c: - (gst_v4l2_object_install_properties_helper), (gst_v4l2_object_new), - (gst_v4l2_object_set_property_helper), - (gst_v4l2_object_get_property_helper), (gst_v4l2_set_defaults): - * sys/v4l2/gstv4l2object.h: - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init), - (gst_v4l2src_create): - * sys/v4l2/gstv4l2tuner.c: (gst_v4l2_tuner_contains_channel), - (gst_v4l2_tuner_list_channels), - (gst_v4l2_tuner_set_channel_and_notify), - (gst_v4l2_tuner_get_channel), (gst_v4l2_tuner_contains_norm), - (gst_v4l2_tuner_list_norms), (gst_v4l2_tuner_set_norm_and_notify), - (gst_v4l2_tuner_get_norm): - * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), - (gst_v4l2_fill_lists), (gst_v4l2_empty_lists): - * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_get_fps): - Renamed some properties to match the tuner interface naming. - -2006-09-27 16:14:18 +0000 Wim Taymans <wim.taymans@gmail.com> - - Small cleanups. - Original commit message from CVS: - * sys/v4l2/gstv4l2object.c: (gst_v4l2_object_set_property_helper), - (gst_v4l2_set_defaults): - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read), - (gst_v4l2src_create): - * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_open): - * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), - (gst_v4l2_fill_lists), (gst_v4l2_open), (gst_v4l2_set_norm), - (gst_v4l2_get_frequency), (gst_v4l2_set_frequency), - (gst_v4l2_signal_strength), (gst_v4l2_get_attribute), - (gst_v4l2_set_attribute), (gst_v4l2_get_input), - (gst_v4l2_set_input): - * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), - (gst_v4l2src_grab_frame), (gst_v4l2src_get_capture), - (gst_v4l2src_set_capture), (gst_v4l2src_capture_init), - (gst_v4l2src_capture_start), (gst_v4l2src_capture_stop), - (gst_v4l2src_buffer_new): - * tests/icles/v4l2src-test.c: (my_bus_callback), (main): - Small cleanups. - Fix error messages. - Use locks when getting timestamps. - Fix leaks in test. - Add licensing header to tests. + * gst-libs/gst/codecparsers/nalutils.c: + * gst-libs/gst/codecparsers/nalutils.h: + codecparsers: nalutils: Add nal_writer_reset_and_get_data help function. + We not only want to create a NAL gstmemory, but also need to create and + get the raw data of a NAL writer for the later usage. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1051> -2006-09-27 15:14:07 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-28 16:33:23 +0100 Guillaume Desmottes <guillaume.desmottes@onestream.live> - * ChangeLog: - * sys/v4l2/gstv4l2object.c: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/gstv4l2tuner.c: - * sys/v4l2/v4l2_calls.c: - * sys/v4l2/v4l2src_calls.c: - * tests/icles/v4l2src-test.c: - Some cleanups and comments. - Original commit message from CVS: - Some cleanups and comments. - -2006-09-26 14:17:54 +0000 Wim Taymans <wim.taymans@gmail.com> - - docs/plugins/: Add v4l2 plugin to the docs. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - Add v4l2 plugin to the docs. - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read), - (gst_v4l2src_get_mmap), (gst_v4l2src_create): - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/gstv4l2vidorient.c: - Fix docs. - Remove some more externs. - -2006-09-26 13:18:06 +0000 Wim Taymans <wim.taymans@gmail.com> - - sys/v4l2/Makefile.am: Fix makefile, list libs in stack order. - Original commit message from CVS: - * sys/v4l2/Makefile.am: - Fix makefile, list libs in stack order. - * sys/v4l2/gstv4l2colorbalance.c: - * sys/v4l2/gstv4l2colorbalance.h: - * sys/v4l2/gstv4l2object.c: (gst_v4l2_device_get_type), - (gst_v4l2_object_install_properties_helper): - * sys/v4l2/gstv4l2object.h: - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_get_read), - (gst_v4l2src_get_mmap), (gst_v4l2src_create): - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/gstv4l2tuner.h: - * sys/v4l2/gstv4l2vidorient.h: - * sys/v4l2/gstv4l2xoverlay.h: - * sys/v4l2/v4l2_calls.h: - * sys/v4l2/v4l2src_calls.h: - Fix coding style: - - Remove extern from functions. - - Fix header indentation. - Fix Flags, add defaults for properties. - Remove unused enums. - Fix TOO_LAZY in error messages. - -2006-09-26 11:06:17 +0000 Wim Taymans <wim.taymans@gmail.com> - - sys/v4l2/: Fix pass at code cleanups, move errors cases out of the normal flow for additional code clarity. - Original commit message from CVS: - * sys/v4l2/gstv4l2object.c: (gst_v4l2_class_probe_devices), - (gst_v4l2_probe_needs_probe), - (gst_v4l2_object_install_properties_helper), (gst_v4l2_object_new), - (gst_v4l2_object_destroy), (gst_v4l2_object_set_property_helper), - (gst_v4l2_object_get_property_helper), (gst_v4l2_set_defaults), - (gst_v4l2_object_start), (gst_v4l2_object_stop): - * sys/v4l2/gstv4l2object.h: - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init), - (gst_v4l2src_init), (gst_v4l2src_dispose), - (gst_v4l2src_set_property), (gst_v4l2src_get_property), - (gst_v4l2src_fixate), (gst_v4l2src_get_caps), - (gst_v4l2src_set_caps), (gst_v4l2src_get_read), - (gst_v4l2src_get_mmap), (gst_v4l2src_create): - * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), - (gst_v4l2_open), (gst_v4l2_close), (gst_v4l2_get_norm), - (gst_v4l2_set_norm), (gst_v4l2_get_frequency), - (gst_v4l2_set_frequency), (gst_v4l2_signal_strength), - (gst_v4l2_get_attribute), (gst_v4l2_set_attribute), - (gst_v4l2_get_input), (gst_v4l2_set_input): - * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), - (gst_v4l2src_queue_frame), (gst_v4l2src_grab_frame), - (gst_v4l2src_get_capture), (gst_v4l2src_set_capture), - (gst_v4l2src_capture_init), (gst_v4l2src_capture_start), - (gst_v4l2src_capture_stop), (gst_v4l2src_capture_deinit), - (gst_v4l2src_get_size_limits), (gst_v4l2src_set_fps), - (gst_v4l2src_get_fps), (gst_v4l2src_buffer_finalize), - (gst_v4l2src_buffer_new): - Fix pass at code cleanups, move errors cases out of the normal - flow for additional code clarity. - -2006-09-23 13:21:43 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/cdaudio/gstcdaudio.c: Port to 0.10. - Original commit message from CVS: - * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init), - (gst_cdaudio_init), (gst_cdaudio_set_property), - (gst_cdaudio_get_property), (gst_cdaudio_change_state), - (gst_cdaudio_send_event), (gst_cdaudio_get_query_types), - (gst_cdaudio_query), (cdaudio_uri_set_uri): - Port to 0.10. - -2006-09-23 00:28:35 +0000 David Schleef <ds@schleef.org> - - sys/glsink/glimagesink.c: Fix problems when the element cannot open the display. (fixes #357212) - Original commit message from CVS: - * sys/glsink/glimagesink.c: - Fix problems when the element cannot open the display. - (fixes #357212) - -2006-09-22 16:08:38 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Up requirements to -base CVS and core CVS (the format for the video orientation interface used by v4l2s... - Original commit message from CVS: - * configure.ac: - Up requirements to -base CVS and core CVS (the format for the - video orientation interface used by v4l2src and the latter - since that's what -base CVS requires). - -2006-09-22 15:59:59 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/directfb/dfbvideosink.c: Lower rank from SECONDARY to MARGINAL. Plugins in -bad that might be autoplugged shouldn... - Original commit message from CVS: - * ext/directfb/dfbvideosink.c: (plugin_init): - Lower rank from SECONDARY to MARGINAL. Plugins in -bad that might - be autoplugged shouldn't trump plugins in -base, -good or -ugly - (in this case ximagesink). - * sys/glsink/glimagesink.c: (plugin_init): - Set rank to NONE to prevent it from being autoplugged until - errors are handled properly (see #357212). + * ext/gs/meson.build: + gs: look for google_cloud_cpp_storage.pc + storage_client.pc was legacy and has been removed: + https://github.com/googleapis/google-cloud-cpp/commit/df6fa3611cdfbc37d40e1451afa91fd7d2e7d5f7#diff-bc35ad7c2fe631fd5578a06092412dba81c7ddd27bb25df7e17bb13771799afcL743 + No need to keep looking for storage_client.pc as a fallback as 1.25.0, + our minimum version, already ships google_cloud_cpp_storage.pc + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1815> -2006-09-21 14:01:18 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-25 15:00:05 +0800 jinsl00000 <jinsl00000@msn.cn> - * ChangeLog: - * ext/neon/Makefile.am: - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - Reverted previous commit (2006-09-19 - Allow internal codes from last.fm). As dicussed on #gstreamer it should be don... - Original commit message from CVS: - Reverted previous commit (2006-09-19 - Allow internal codes from last.fm). As dicussed on #gstreamer it should be done in separete element. - -2006-09-21 13:41:42 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/faac/gstfaac.c: Add decoder specific info on the caps. - Original commit message from CVS: - * ext/faac/gstfaac.c: (gst_faac_configure_source_pad), - (gst_faac_chain): - Add decoder specific info on the caps. - Some cleanups here and there. + * sys/ipcpipeline/gstipcpipelinecomm.c: + * sys/ipcpipeline/meson.build: + ipcpipeline: fix crash and error on windows with SOCKET or _pipe() + The fd was in different meanings on windows: + POSIX read and write use the fd as a file descriptor. + The gst_poll use the fd as a WSASocket. + This patch use WSASocket as default on windows. This is a temporary measure, because IPC has many different implement. There may be a better way in the future. + See #1044 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1791> -2006-09-19 21:49:52 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-14 16:15:46 +0800 Wu Tong <tong1.wu@intel.com> - * ChangeLog: - * ext/neon/Makefile.am: - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - Allow internal codes from last.fm - Original commit message from CVS: - Allow internal codes from last.fm + * sys/msdk/gstmsdkcontextutil.c: + * sys/msdk/gstmsdkenc.c: + MSDK: Add _context_query() and avoid compile error on Windows + To avoid compile error on Windows, macro definitions are added to suppress va + variables. In the meantime, add function _context_query() to query + context on Windows. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1693> -2006-09-19 16:24:10 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-24 20:26:46 +0530 Sanchayan Maity <sanchayan@asymptotic.io> - * ChangeLog: - * tests/icles/v4l2src-test.c: - Just a small fix to the app options. - Original commit message from CVS: - Just a small fix to the app options. + * ext/ldac/gstldacenc.c: + ldac: Set eqmid in caps + We set the eqmid in caps to be usable downstream by rtpldacpay for + knowing the frame count. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1797> -2006-09-19 13:08:35 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-01-31 16:13:32 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - * ChangeLog: - * sys/v4l2/Makefile.am: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/gstv4l2vidorient.c: - * sys/v4l2/gstv4l2vidorient.h: - * tests/icles/v4l2src-test.c: - Add Video Orientation interface support to v4l2src. - Original commit message from CVS: - Add Video Orientation interface support to v4l2src. - -2006-09-19 10:10:12 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/gsm/gstgsmdec.*: Handle WAV49 variant (GSM in WAV). - Original commit message from CVS: - * ext/gsm/gstgsmdec.c: (gst_gsmdec_init), - (gst_gsmdec_sink_setcaps), (gst_gsmdec_sink_event), - (gst_gsmdec_chain): - * ext/gsm/gstgsmdec.h: - Handle WAV49 variant (GSM in WAV). - Some small cleanups. + * gst/mpegtsmux/gstbasetsmux.c: + tsmux: Skip empty buffers + They can be created e.g. by aggregator when there is a gap. Such buffers + should not be muxed at all. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1611> -2006-09-18 15:36:14 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-21 11:37:26 -0500 Xavier Claessens <xavier.claessens@collabora.com> - * ChangeLog: - * sys/v4l2/v4l2src_calls.c: - Fix GST_BUFFER_DURATION. - Original commit message from CVS: - Fix GST_BUFFER_DURATION. - -2006-09-16 22:30:50 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - tests/check/: Fix big batch of compiler warnings. - Original commit message from CVS: - * tests/check/elements/audioresample.c: (GST_START_TEST): - * tests/check/elements/videotestsrc.c: (check_rgb_buf): - * tests/check/elements/volume.c: (GST_START_TEST): - * tests/check/elements/vorbisdec.c: (GST_START_TEST): - * tests/check/pipelines/oggmux.c: (validate_ogg_page), (eos_watch), - (test_pipeline), (GST_START_TEST): - * tests/check/pipelines/theoraenc.c: (GST_START_TEST): - * tests/check/pipelines/vorbisenc.c: (GST_START_TEST): - Fix big batch of compiler warnings. - -2006-09-16 22:14:36 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - More G_OBJECT macro fixing. - Original commit message from CVS: - * ext/hermes/gsthermescolorspace.c: - * ext/ivorbis/vorbisfile.c: - * ext/lcs/gstcolorspace.c: - * ext/wavpack/gstwavpackenc.h: - * ext/xine/xineaudiodec.c: - * ext/xine/xineaudiosink.c: - * ext/xine/xineinput.c: - * gst/chart/gstchart.c: - * gst/equalizer/gstiirequalizer.c: - * gst/games/gstpuzzle.c: - * gst/librfb/gstrfbsrc.c: - * gst/mixmatrix/mixmatrix.c: - * gst/nsf/gstnsf.h: - * gst/vbidec/gstvbidec.c: - * gst/virtualdub/gstxsharpen.c: - More G_OBJECT macro fixing. + * data/meson.build: + * ext/voamrwbenc/meson.build: + * gst/freeverb/meson.build: + devenv: Add some missing GStreamer specific env variables + This should make "meson devenv" closer to what "gst-env.py" sets. + - GST_VALIDATE_SCENARIOS_PATH + - GST_VALIDATE_APPS_DIR + - GST_OMX_CONFIG_DIR + - GST_ENCODING_TARGET_PATH + - GST_PRESET_PATH + - GST_PLUGIN_SCANNER + - GST_PTP_HELPER + - _GI_OVERRIDES_PATH + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1768> -2006-09-15 19:11:00 +0000 Edgard Lima <edgard.lima@indt.org.br> +2018-12-05 01:22:48 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - * ChangeLog: - * common: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/gstv4l2xoverlay.c: - * sys/v4l2/v4l2_calls.c: - * sys/v4l2/v4l2src_calls.c: - * tests/icles/v4l2src-test.c: - The test application and the plgind error messages has been improved. - Original commit message from CVS: - The test application and the plgind error messages has been improved. - -2006-09-12 20:18:55 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/gstspectrum.c: Implements stop() to clear the adapter and event() to clear the adapter on FLUSH_STOP and... - Original commit message from CVS: - * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), - (gst_spectrum_start), (gst_spectrum_stop), (gst_spectrum_event): - Implements stop() to clear the adapter and event() to clear the - adapter on FLUSH_STOP and EOS. - -2006-09-11 18:23:59 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/gstspectrum.*: Fix type mixup in spectrum->interval (gdouble<->guint64). Spotted by - Original commit message from CVS: - * gst/spectrum/gstspectrum.c: (gst_spectrum_init), - (gst_spectrum_set_property): - * gst/spectrum/gstspectrum.h: - Fix type mixup in spectrum->interval (gdouble<->guint64). Spotted by - René Stadler - -2006-09-11 18:02:39 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/demo-osssrc.c: Use more defines - Original commit message from CVS: - * gst/spectrum/demo-osssrc.c: (draw_spectrum), (main): - Use more defines - * gst/spectrum/gstspectrum.c: (gst_spectrum_init), - (gst_spectrum_dispose), (gst_spectrum_set_caps), - (gst_spectrum_transform_ip): - * gst/spectrum/gstspectrum.h: - Apply some of the spectrum cleanup changes suggested in #348085. - -2006-09-08 16:47:46 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Bump requirements of -base (videocrop test case needs this). - Original commit message from CVS: - * configure.ac: - Bump requirements of -base (videocrop test case needs this). - * gst/videocrop/gstvideocrop.c: - Document sloppy handling of subsampled chroma planes if - left/top cropping is an odd number. - * tests/check/elements/videocrop.c: (handoff_cb), - (videocrop_test_cropping_init_context), - (videocrop_test_cropping_deinit_context), - (videocrop_test_cropping), (check_1x1_buffer), (GST_START_TEST), - (videocrop_suite), (main): - Add another unit test that crops the input to 1x1 (and checks - that that pixel has the expected values in a number of formats). - -2006-09-08 11:04:24 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/videocrop/: Some quick tests indicate that it doesn't make a great deal of sense to use liboil here, at least not... - Original commit message from CVS: - * gst/videocrop/Makefile.am: - * gst/videocrop/gstvideocrop.c: (gst_video_crop_class_init), - (gst_video_crop_transform_packed), - (gst_video_crop_transform_planar): - Some quick tests indicate that it doesn't make a great deal - of sense to use liboil here, at least not for the memcpy()s - we do, so remove liboil usage until there is clear evidence - it actually makes a positive difference somewhere. - -2006-09-03 21:12:36 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * ext/soundtouch/Makefile.am: - higher up first - Original commit message from CVS: - higher up first - -2006-09-03 10:46:17 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/check/elements/videocrop.c: More tests: check passthrough mode and caps transform in both directions with fixed... - Original commit message from CVS: - * tests/check/elements/videocrop.c: (handoff_cb), - (buffer_probe_cb), (test_caps_transform), (test_passthrough), - (notgst_value_list_get_nth_int), (videocrop_suite): - More tests: check passthrough mode and caps transform in - both directions with fixed values, ranges and lists. - -2006-09-02 18:49:01 +0000 Tim-Philipp Müller <tim@centricular.net> - - docs/plugins/: Add videocrop to docs. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - Add videocrop to docs. - * gst/videocrop/Makefile.am: - * gst/videocrop/gstvideocrop.c: - * gst/videocrop/gstvideocrop.h: - Move boilerplate stuff and structures into a header file. - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/videocrop.c: (video_crop_get_test_caps), - (test_unit_sizes), (videocrop_test_cropping_init_context), - (videocrop_test_cropping_deinit_context), - (videocrop_test_cropping), (test_cropping), (videocrop_suite): - Add unit tests for videocrop. - -2006-09-02 15:30:45 +0000 Tim-Philipp Müller <tim@centricular.net> - - Port/rewrite videocrop from scratch for GStreamer-0.10, and make it support all formats videoscale supports (#345653). - Original commit message from CVS: - * configure.ac: - * gst/videocrop/Makefile.am: - * gst/videocrop/gstvideocrop.c: (gst_video_crop_base_init), - (gst_video_crop_class_init), (gst_video_crop_init), - (gst_video_crop_get_image_details_from_caps), - (gst_video_crop_get_unit_size), (gst_video_crop_transform_packed), - (gst_video_crop_transform_planar), (gst_video_crop_transform), - (gst_video_crop_transform_dimension), - (gst_video_crop_transform_dimension_value), - (gst_video_crop_transform_caps), (gst_video_crop_set_caps), - (gst_video_crop_set_property), (gst_video_crop_get_property), - (plugin_init): - Port/rewrite videocrop from scratch for GStreamer-0.10, and make - it support all formats videoscale supports (#345653). - -2006-09-02 14:45:04 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - sys/v4l2/: Whitespace cleanups, dashify property-names. - Original commit message from CVS: - * sys/v4l2/gstv4l2.c: - * sys/v4l2/gstv4l2colorbalance.c: - * sys/v4l2/gstv4l2object.c: - (gst_v4l2_object_install_properties_helper): - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_class_init): - * sys/v4l2/gstv4l2src.h: - Whitespace cleanups, dashify property-names. - -2006-09-02 14:28:55 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - sys/v4l2/: Cleanup error messages and unify header comments - Original commit message from CVS: - * sys/v4l2/gstv4l2.c: - * sys/v4l2/gstv4l2colorbalance.c: - * sys/v4l2/gstv4l2colorbalance.h: - * sys/v4l2/gstv4l2object.c: - * sys/v4l2/gstv4l2object.h: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/gstv4l2tuner.c: - * sys/v4l2/gstv4l2tuner.h: - * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_open): - * sys/v4l2/gstv4l2xoverlay.h: - * sys/v4l2/v4l2_calls.c: (gst_v4l2_get_capabilities), - (gst_v4l2_open): - * sys/v4l2/v4l2_calls.h: - * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_queue_frame), - (gst_v4l2src_capture_init): - * sys/v4l2/v4l2src_calls.h: - Cleanup error messages and unify header comments - -2006-08-31 13:01:15 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/nsf/Makefile.am: Add missing GST_LIBS - Original commit message from CVS: - * gst/nsf/Makefile.am: - Add missing GST_LIBS + * ext/fdkaac/gstfdkaacdec.c: + * ext/fdkaac/gstfdkaacdec.h: + fdkaacdec: Support arbitrary channel configs + Try to match the config to GStreamer positions. If something doesn't + fit, fall back to a set of unpositioned channels. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1561> -2006-08-30 18:01:52 +0000 Edgard Lima <edgard.lima@indt.org.br> +2018-12-05 01:07:19 +0100 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> - * ChangeLog: - * sys/v4l2/gstv4l2src.c: - Another small fix to set_caps function. - Original commit message from CVS: - Another small fix to set_caps function. + * ext/fdkaac/gstfdkaacdec.c: + * ext/fdkaac/gstfdkaacdec.h: + fdkaacdec: Use predefined channel layouts + This limits the decoder to the layouts predefined for the encoder + (including the MPEG standard layouts) but greatly simplifies the + implementation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1561> -2006-08-30 13:30:13 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-01 14:51:27 +0200 Vivia Nikolaidou <vivia@ahiru.eu> - * ChangeLog: - * sys/v4l2/gstv4l2src.c: - Send new_segment in GST_FORMAT_TIME instead of in GST_FORMAT_BYTES. - Original commit message from CVS: - Send new_segment in GST_FORMAT_TIME instead of in GST_FORMAT_BYTES. + * gst/mpegtsmux/gstbasetsmux.c: + * gst/mpegtsmux/gstbasetsmux.h: + tsmux: Lock mux->tsmux, the programs hash table, and pad streams + They contain implementations that are not thread-safe (e.g. GList, GHashTable). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1616> -2006-08-30 11:36:06 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-17 15:16:40 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - * ChangeLog: - * sys/v4l2/gstv4l2src.c: - A small fix to set_caps function. - Original commit message from CVS: - A small fix to set_caps function. - -2006-08-30 11:27:40 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: Reset each streams last_flow to GST_FLOW_OK. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: - (gst_qtdemux_do_seek): - Reset each streams last_flow to GST_FLOW_OK. - (gst_qtdemux_activate_segment): - Removing mystic modifications for good. - -2006-08-30 11:07:37 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/qtdemux/qtdemux.c: put back 'segment start<=stop' change that was mystically reverted by the last commit - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment), - (qtdemux_parse_tree): - put back 'segment start<=stop' change that was mystically reverted by - the last commit - -2006-08-30 10:43:53 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/qtdemux/qtdemux.c: Fix the build for disabled debug - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment), - (qtdemux_parse_tree): - Fix the build for disabled debug + * sys/msdk/gstmsdkdec.c: + msdkdec: Fix uninitialized variables + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1731> -2006-08-29 20:59:47 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-17 15:12:52 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - * ChangeLog: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/v4l2src_calls.c: - * sys/v4l2/v4l2src_calls.h: - Fixed framerate negotiation. - Original commit message from CVS: - Fixed framerate negotiation. - -2006-08-29 12:07:38 +0000 Andrew Andkjar <enki@goodship.net> - - ext/sdl/: Only de-init the subsystem we previously initialised. Avoids borkage when both sdlvideosink and sdlaudiosin... - Original commit message from CVS: - Patch by: Andrew Andkjar <enki at goodship net> - * ext/sdl/sdlaudiosink.c: (gst_sdlaudio_sink_close): - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_supported), - (gst_sdlvideosink_deinitsdl): - Only de-init the subsystem we previously initialised. Avoids - borkage when both sdlvideosink and sdlaudiosink are used - at the same time and one is shut down. - -2006-08-28 17:47:29 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Make sure segment start<=stop in weird quicktime files. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment), - (gst_qtdemux_add_stream), (qtdemux_parse_trak), - (qtdemux_video_caps): - Make sure segment start<=stop in weird quicktime files. - -2006-08-28 14:59:05 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - sys/v4l2/v4l2_calls.c: add comments and more debug logging - Original commit message from CVS: - * sys/v4l2/v4l2_calls.c: (gst_v4l2_fill_lists): - add comments and more debug logging - -2006-08-24 09:24:11 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackdec.c: Post audio codec and average bitrate tags on bus (#344472). - Original commit message from CVS: - Patch by: Sebastian Dröge <slomo at circular-chaos.org> - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_post_tags), - (gst_wavpack_dec_chain): - Post audio codec and average bitrate tags on bus (#344472). - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init), - (gst_wavpack_parse_src_query): - Forward queries in other formats (BYTE format in particular) - upstream; add Sebastian to authors. + * sys/msdk/gstmsdkdec.c: + * sys/msdk/gstmsdkvpp.c: + msdk: Fix unchecked return values + There are several calls of gst_video_info_from_caps and gst_video_frame_copy + without checks for the returned values. This patch adds all necessary + function return checks. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1738> -2006-08-24 00:40:07 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-22 05:19:51 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/v4l2src_calls.c: - * sys/v4l2/v4l2src_calls.h: - Fix set_caps to set width and height to the values the driver is really working with. - Original commit message from CVS: - Fix set_caps to set width and height to the values the driver is really working with. - -2006-08-23 10:30:31 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/wavpack/gstwavpackenc.c: Fix mem leak, send newsegment event on correction pad as well (#352476). - Original commit message from CVS: - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_push_block): - Fix mem leak, send newsegment event on correction pad - as well (#352476). - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): - Restore original author (on Sebastian's request). - * tests/check/Makefile.am: - * tests/check/gst-plugins-bad.supp: - Add (so far empty) suppression file for -bad. Remove - wavpackenc test from VALGRIND_TO_FIX now that the leak - is fixed. - -2006-08-23 09:22:07 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - tests/check/: Add unit tests for wavpack elements (#352476). - Original commit message from CVS: - Patch by: Sebastian Dröge <slomo at circular-chaos.org> - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/wavpackdec.c: (setup_wavpackdec), - (cleanup_wavpackdec), (GST_START_TEST), (wavpackdec_suite), (main): - * tests/check/elements/wavpackenc.c: (setup_wavpackenc), - (cleanup_wavpackenc), (GST_START_TEST), (wavpackenc_suite), (main): - * tests/check/elements/wavpackparse.c: (wavpackparse_found_pad), - (setup_wavpackparse), (cleanup_wavpackparse), (GST_START_TEST), - (wavpackparse_suite), (main): - Add unit tests for wavpack elements (#352476). - -2006-08-23 08:52:50 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - Add docs for wavpack elements (#352476). - Original commit message from CVS: - Patch by: Sebastian Dröge <slomo at circular-chaos.org> - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-wavpack.xml: - * ext/wavpack/gstwavpackdec.c: - * ext/wavpack/gstwavpackdec.h: - * ext/wavpack/gstwavpackenc.c: - * ext/wavpack/gstwavpackenc.h: - * ext/wavpack/gstwavpackparse.c: - * ext/wavpack/gstwavpackparse.h: - Add docs for wavpack elements (#352476). + * sys/qsv/gstqsvencoder.cpp: + qsvencoder: Fix caps leak in Linux build + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1769> -2006-08-22 20:39:26 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-22 05:15:04 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/v4l2src_calls.c: - Fixed query size to work with drivers that uses intermediate step like "width * height" to find closest size. - Original commit message from CVS: - Fixed query size to work with drivers that uses intermediate step like "width * height" to find closest size. - -2006-08-21 19:02:13 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - move gdp plugin to good. - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * gst/gdp/Makefile.am: - * gst/gdp/gstgdp.c: - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdpdepay.h: - * gst/gdp/gstgdppay.c: - * gst/gdp/gstgdppay.h: - * tests/check/Makefile.am: - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - move gdp plugin to good. - -2006-08-21 16:24:28 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Some more constification. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), (qtdemux_parse), - (qtdemux_node_dump_foreach), (qtdemux_parse_trak), - (qtdemux_video_caps), (qtdemux_audio_caps): - Some more constification. - Fix some paletted data formats again. - Fix ulaw/alaw in qt. - Set correct caps for raw RGB. - Add support for yuv2, which is like Yuv2. - Add support for raw audio with the NONE fourcc, which is like raw. - -2006-08-21 16:21:03 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/gsm/gstgsm.c: Make rank PRIMARY now that GSM seems to work fine. - Original commit message from CVS: - * ext/gsm/gstgsm.c: (plugin_init): - Make rank PRIMARY now that GSM seems to work fine. - -2006-08-21 13:59:52 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/wavpack/: More clean-ups: use shorter variable names to make code easier to read; prefix structures we define wit... - Original commit message from CVS: - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_init), - (gst_wavpack_enc_finalize), (gst_wavpack_enc_sink_set_caps), - (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_format_samples), - (gst_wavpack_enc_push_block), (gst_wavpack_enc_chain), - (gst_wavpack_enc_rewrite_first_block), - (gst_wavpack_enc_sink_event), (gst_wavpack_enc_change_state), - (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property): - * ext/wavpack/gstwavpackenc.h: - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), - (gst_wavpack_parse_src_query), (gst_wavpack_parse_src_event), - (gst_wavpack_parse_init), (gst_wavpack_parse_get_upstream_length), - (gst_wavpack_parse_loop): - More clean-ups: use shorter variable names to make code easier to - read; prefix structures we define with 'Gst' to make it clearer - where they come from. - -2006-08-21 13:26:37 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/wavpack/gstwavpackenc.c: Fix caps set on buffers and template caps (output is framed) and make them match (#35166... - Original commit message from CVS: - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_init), - (gst_wavpack_enc_set_wp_config), (gst_wavpack_enc_push_block), - (gst_wavpack_enc_chain), (gst_wavpack_enc_rewrite_first_block), - (gst_wavpack_enc_sink_event): - Fix caps set on buffers and template caps (output is framed) - and make them match (#351663); use GST_WARNING_OBJECT instead of - GST_ELEMENT_WARNING; simplify push_block(); do some small - clean-ups here and there; fix memleak (#351663). - -2006-08-20 13:05:43 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/audioconvert/gstaudioconvert.c: Lower debug, use g_assert in _get_unit_size - Original commit message from CVS: - * gst/audioconvert/gstaudioconvert.c: - (gst_audio_convert_get_unit_size), (set_structure_widths): - Lower debug, use g_assert in _get_unit_size - * gst/audioresample/gstaudioresample.c: - (audioresample_get_unit_size): - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcsp_get_unit_size): - * gst/videoscale/gstvideoscale.c: (gst_video_scale_get_unit_size): - use g_assert in _get_unit_size - -2006-08-18 21:39:00 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackparse.c: Fix resyncing in push mode not stopping re-syncing at embedded zeroes; skip garbage be... - Original commit message from CVS: - Based on patch by: Sebastian Dröge <slomo at circular-chaos.org> - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_sink_event), - (gst_wavpack_parse_get_upstream_length), - (gst_wavpack_parse_find_marker), (gst_wavpack_parse_resync_loop), - (gst_wavpack_parse_loop), (gst_wavpack_parse_resync_adapter): - Fix resyncing in push mode not stopping re-syncing at embedded - zeroes; skip garbage between frames in pull mode as well if - necessary; use gst_pad_query_peer_duration(); push EOS and - NEWSEGMENT event in right direction (#351659). - -2006-08-16 16:50:00 +0000 Andy Wingo <wingo@pobox.com> - - ext/ladspa/gstsignalprocessor.c: Make ladspa elements reusable. Fixes #350006. - Original commit message from CVS: - Patch by: Andy Wingo <wingo at pobox dot com> - * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_setup), - (gst_signal_processor_start), (gst_signal_processor_stop), - (gst_signal_processor_cleanup), (gst_signal_processor_setcaps), - (gst_signal_processor_pen_buffer), (gst_signal_processor_flush), - (gst_signal_processor_do_pulls), (gst_signal_processor_do_pushes), - (gst_signal_processor_change_state): - Make ladspa elements reusable. Fixes #350006. - -2006-08-16 15:33:12 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/ladspa/gstladspa.c: Convert ' ' into '_'. Try to keep as many characters in the padtemplate names as possible. - Original commit message from CVS: - * ext/ladspa/gstladspa.c: (gst_ladspa_base_init): - Convert ' ' into '_'. Try to keep as many characters in the padtemplate - names as possible. - -2006-08-16 14:47:50 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/ladspa/gstsignalprocessor.c: A push() gives away our refcount so we should not use the buffer on the pen anymore. - Original commit message from CVS: - * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_flush), - (gst_signal_processor_do_pushes): - A push() gives away our refcount so we should not use the buffer on the - pen anymore. - -2006-08-16 10:40:04 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/: In push mode, re-sync to next wavpack header if sync is lost (#351557). Also use hyphens instead of und... - Original commit message from CVS: - Patch by: Sebastian Dröge <slomo at circular-chaos.org> - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init): - * ext/wavpack/gstwavpackparse.c: - (gst_wavpack_parse_resync_adapter), (gst_wavpack_parse_chain): - In push mode, re-sync to next wavpack header if sync is lost - (#351557). Also use hyphens instead of underscores in - GObject property names. - -2006-08-15 20:29:45 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackparse.*: Make wavpackparse also work in push-mode (not seekable yet though); some small clean-u... - Original commit message from CVS: - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_class_init), - (gst_wavpack_parse_reset), (gst_wavpack_parse_get_src_query_types), - (gst_wavpack_parse_src_query), - (gst_wavpack_parse_handle_seek_event), - (gst_wavpack_parse_sink_event), (gst_wavpack_parse_init), - (gst_wavpack_parse_create_src_pad), - (gst_wavpack_parse_push_buffer), (gst_wavpack_parse_loop), - (gst_wavpack_parse_chain), (gst_wavpack_parse_sink_activate), - (gst_wavpack_parse_sink_activate_pull): - * ext/wavpack/gstwavpackparse.h: - Patch by: Sebastian Dröge <slomo at circular-chaos.org> - Make wavpackparse also work in push-mode (not seekable yet though); - some small clean-ups along the way; add support for SEEKING query - and query types function. (#351495). - -2006-08-15 19:29:58 +0000 Tim-Philipp Müller <tim@centricular.net> - - Fix leaks (#351502). - Original commit message from CVS: - * ext/libfame/gstlibfame.c: (gst_fameenc_get_property): - * sys/glsink/glimagesink.c: (gst_glimage_sink_get_property): - Fix leaks (#351502). - -2006-08-14 10:06:55 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Extract all references/redirections if there is more than one and sort them; also extract mini... - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_redirects_sort_func), - (qtdemux_process_redirects), (qtdemux_parse_tree): - Extract all references/redirections if there is more - than one and sort them; also extract minimum required - bitrate information if available. (#350399) - -2006-08-10 17:09:10 +0000 Michal Benes <michal.benes@itonis.tv> - - ext/faac/gstfaac.c: Bitrate in the faac structure is per output channel, not total bitrate (#350741). - Original commit message from CVS: - Patch by: Michal Benes <michal.benes at itonis tv> - * ext/faac/gstfaac.c: (gst_faac_configure_source_pad): - Bitrate in the faac structure is per output channel, - not total bitrate (#350741). - -2006-08-09 17:41:26 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/xvid/gstxvidenc.c: Fix GST_ELEMENT_ERROR usage. - Original commit message from CVS: - * ext/xvid/gstxvidenc.c: (gst_xvidenc_chain): - Fix GST_ELEMENT_ERROR usage. - -2006-08-09 10:45:32 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - fixed up and cleaned up the -bad spec file to have proper tests for whats installed and items put in correct categories. - Original commit message from CVS: - fixed up and cleaned up the -bad spec file to have proper tests for whats installed and items put in correct categories. - -2006-08-08 14:55:53 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Fix silly typo. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_tree): - Fix silly typo. - -2006-08-08 13:57:29 +0000 Edward Hervey <bilboed@bilboed.com> - - tests/check/elements/gdpdepay.c: I forgot to include the file containing the #define :) - Original commit message from CVS: - * tests/check/elements/gdpdepay.c: (gdpdepay_suite): - I forgot to include the file containing the #define :) - Now includes "config.h" - -2006-08-08 13:45:44 +0000 Edward Hervey <bilboed@bilboed.com> - - tests/check/elements/gdpdepay.c: Ignore test known to fail on PPC64. See #348114. - Original commit message from CVS: - * tests/check/elements/gdpdepay.c: (gdpdepay_suite): - Ignore test known to fail on PPC64. See #348114. + * sys/qsv/plugin.cpp: + qsv: Fix debug category name of qsvallocator + Remove gst prefix to make $env:GST_DEBUG="qsv*:6" work for qsvallocator + as well + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1769> -2006-08-04 21:04:55 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-21 16:45:50 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - * ChangeLog: - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - Allow HTTP redirect (HTTP status code 302). - Original commit message from CVS: - Allow HTTP redirect (HTTP status code 302). - -2006-08-04 13:20:23 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/gdp/gstgdpdepay.c: Fix event parsing by gdpdepay. Fixes #349916. - Original commit message from CVS: - 2006-08-04 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain): - Fix event parsing by gdpdepay. Fixes #349916. - -2006-08-04 11:38:54 +0000 Andy Wingo <wingo@pobox.com> - - ext/ladspa/gstsignalprocessor.h: Add infrastructure for storing whether a processor can work in place or not, and for... - Original commit message from CVS: - 2006-08-04 Andy Wingo <wingo@pobox.com> - * ext/ladspa/gstsignalprocessor.h: Add infrastructure for storing - whether a processor can work in place or not, and for keeping - track of its state. Change the FlowReturn instance variable from - "state" to "flow_state", all callers changed. - * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_setup) - (gst_signal_processor_start, gst_signal_processor_stop) - (gst_signal_processor_cleanup): New functions to manage the - processor's state. - (gst_signal_processor_setcaps): start() as well as setup() here. - (gst_signal_processor_prepare): Respect CAN_PROCESS_IN_PLACE. - (gst_signal_processor_change_state): Stop and cleanup the - processor as we go to NULL. - * ext/ladspa/gstladspa.c (gst_ladspa_base_init): Reuse buffers if - INPLACE_BROKEN is not set. - * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_prepare): - Do the alloc_buffer in bytes, not frames. - -2006-08-04 09:20:26 +0000 Andy Wingo <wingo@pobox.com> - - * ext/ladspa/gstsignalprocessor.c: - BPB - Original commit message from CVS: - (gst_signal_processor_src_activate_pull): BPB - -2006-08-04 09:05:53 +0000 Andy Wingo <wingo@pobox.com> - - * ext/ladspa/gstsignalprocessor.c: - ext/ladspa/gstsignalprocessor.c (gst_signal_processor_setcaps) (gst_signal_processor_prepare) (gst_signal_processor_u... - Original commit message from CVS: - 2006-08-04 Andy Wingo <wingo@pobox.com> - * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_setcaps) - (gst_signal_processor_prepare) - (gst_signal_processor_update_inputs) - (gst_signal_processor_process, gst_signal_processor_pen_buffer) - (gst_signal_processor_flush) - (gst_signal_processor_sink_activate_push) - (gst_signal_processor_src_activate_pull) - (gst_signal_processor_change_state): Remove the last of the code - that assumes that we process whole buffers at a time. Fix some - debugging. Seems to work now in some cases. - -2006-08-03 14:48:22 +0000 cascardo at holoscopio dot com <cascardo@holoscopio.com> - - ext/Makefile.am: Use right variables when USE_SPC is defined. - Original commit message from CVS: - Patch by: cascardo at holoscopio dot com - * ext/Makefile.am: - Use right variables when USE_SPC is defined. - -2006-08-02 16:56:19 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/gdp/gstgdpdepay.c: Disable seeking. - Original commit message from CVS: - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_init), - (gst_gdp_depay_finalize), (gst_gdp_depay_sink_event), - (gst_gdp_depay_src_event), (gst_gdp_depay_chain), - (gst_gdp_depay_change_state): - Disable seeking. - Small cleanups. - Clear adapter on disconts. - Clear caps when going to READY instead of NULL - * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init), - (gst_gdp_pay_init), (gst_gdp_pay_finalize), (gst_gdp_pay_reset), - (gst_gdp_buffer_from_caps), (gst_gdp_pay_buffer_from_buffer), - (gst_gdp_buffer_from_event), (gst_gdp_pay_reset_streamheader), - (gst_gdp_queue_buffer), (gst_gdp_pay_chain), - (gst_gdp_pay_sink_event), (gst_gdp_pay_src_event), - (gst_gdp_pay_change_state): - * gst/gdp/gstgdppay.h: - Reset payloader when going to READY. - Fix leaked buffers in ->queue on push errors. - Disable seeking. - Code cleanups. - Create packetizer in _init, free in _finalize. - -2006-07-31 22:27:22 +0000 Andy Wingo <wingo@pobox.com> - - ext/ladspa/gstsignalprocessor.c (gst_signal_processor_process): Fix nframes-choosing. - Original commit message from CVS: - 2006-08-01 Andy Wingo <wingo@pobox.com> - * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_process): - Fix nframes-choosing. - (gst_signal_processor_init): Init pending_in and pending_out. - -2006-07-31 22:03:09 +0000 Andy Wingo <wingo@pobox.com> - - ext/ladspa/gstsignalprocessor.c (gst_signal_processor_init): No more default sample rate, although we never check tha... - Original commit message from CVS: - 2006-08-01 Andy Wingo <wingo@pobox.com> - * ext/ladspa/gstsignalprocessor.c (gst_signal_processor_init): No - more default sample rate, although we never check that the sample - rate actually gets set. Something for the future. - (gst_signal_processor_setcaps): Some refcount fixes, flow fixes. - (gst_signal_processor_event): Refcount fixen. - (gst_signal_processor_process): Pull the number of frames to - process from the sizes of the buffers in the input pens. - (gst_signal_processor_pen_buffer): Remove an incorrect FIXME :) - (gst_signal_processor_do_pulls): Add an nframes argument, and use - it instead of buffer_frames. - (gst_signal_processor_getrange): Refcount fixen, pass nframes on - to do_pulls. - (gst_signal_processor_chain) - (gst_signal_processor_sink_activate_push) - (gst_signal_processor_src_activate_pull): Refcount fixen. - * ext/ladspa/gstsignalprocessor.h: No more buffer_frames, yay. - -2006-07-31 19:44:18 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/ladspa/gstsignalprocessor.c: don't query buffer-frames from caps, add lots of debug-log, try fix for assert (#349... - Original commit message from CVS: - * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_setcaps), - (gst_signal_processor_process): - don't query buffer-frames from caps, add lots of debug-log, - try fix for assert (#349189) - -2006-07-31 17:29:22 +0000 Julien Moutte <julien@moutte.net> - - ext/directfb/dfbvideosink.c: Post an error message. - Original commit message from CVS: - 2006-07-31 Julien MOUTTE <julien@moutte.net> - * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_change_state), - (gst_dfbvideosink_buffer_alloc): Post an error message. - -2006-07-31 16:50:27 +0000 Julien Moutte <julien@moutte.net> - - ext/directfb/dfbvideosink.c: Don't try allocating if we are not setup yet. Fail changing state if setup fails. - Original commit message from CVS: - 2006-07-31 Julien MOUTTE <julien@moutte.net> - * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_change_state), - (gst_dfbvideosink_buffer_alloc): Don't try allocating if we are - not - setup yet. Fail changing state if setup fails. - -2006-07-31 08:48:36 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/gdp/gstgdpdepay.c: Consume all events except EOS because we generate events from the gdp payload instead. Fixes #... - Original commit message from CVS: - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_init), - (gst_gdp_depay_sink_event), (gst_gdp_depay_chain): - Consume all events except EOS because we generate events from - the gdp payload instead. Fixes #349204 - -2006-07-29 16:32:26 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/ladspa/gstsignalprocessor.c: Add debugs logs here and there, add more error handling, add some - Original commit message from CVS: - * ext/ladspa/gstsignalprocessor.c: - (gst_signal_processor_add_pad_from_template), - (gst_signal_processor_init), (gst_signal_processor_setcaps), - (gst_signal_processor_process), (gst_signal_processor_pen_buffer), - (gst_signal_processor_do_pulls), (gst_signal_processor_getrange), - (gst_signal_processor_sink_activate_push), - (gst_signal_processor_src_activate_pull), - (gst_signal_processor_change_state): - Add debugs logs here and there, add more error handling, add some - FIXME comments, filed #349189 - -2006-07-28 17:17:24 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/audioresample/gstaudioresample.c: Don't leak references to the incoming caps. Clean them up when stopping. - Original commit message from CVS: - * gst/audioresample/gstaudioresample.c: (audioresample_stop), - (audioresample_set_caps): - Don't leak references to the incoming caps. Clean them up when - stopping. - * gst/videoscale/gstvideoscale.c: (gst_video_scale_class_init), - (gst_video_scale_finalize): - Don't leak our temporary pixel buffer. - * tests/check/Makefile.am: - * tests/check/pipelines/simple-launch-lines.c: (run_pipeline), - (GST_START_TEST), (simple_launch_lines_suite): - Fix leaks and re-enable the test for valgrind checking. - -2006-07-28 12:14:06 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/xvid/gstxviddec.*: Clean-ups and code reflows. Pass return value from gst_pad_alloc_buffer() upstream among other... - Original commit message from CVS: - * ext/xvid/gstxviddec.c: (gst_xviddec_init), (gst_xviddec_reset), - (gst_xviddec_unset), (gst_xviddec_handle_sink_event), - (gst_xviddec_setup), (gst_xviddec_negotiate), (gst_xviddec_chain), - (gst_xviddec_flush_buffers), (gst_xviddec_src_getcaps), - (gst_xviddec_setcaps), (gst_xviddec_change_state): - * ext/xvid/gstxviddec.h: - Clean-ups and code reflows. Pass return value from - gst_pad_alloc_buffer() upstream among other things. Also check - for NULL GValue before using GST_VALUE_TYPE macro (#348976). - Mass rename of xviddec -> dec variable for better - code readability. - -2006-07-28 10:19:02 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/xvid/gstxvid.c: Fix size calculation for I420/YV12. Fixes #348976. - Original commit message from CVS: - * ext/xvid/gstxvid.c: (gst_xvid_image_fill): - Fix size calculation for I420/YV12. Fixes #348976. - -2006-07-27 10:50:39 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/gsm/: Fix negotiation. - Original commit message from CVS: - * ext/gsm/gstgsmdec.c: (gst_gsmdec_init), - (gst_gsmdec_sink_setcaps), (gst_gsmdec_sink_event): - * ext/gsm/gstgsmenc.c: (gst_gsmenc_init), (gst_gsmenc_setcaps): - Fix negotiation. - -2006-07-26 10:52:05 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst/gdp/gstgdpdepay.c: proxying get/set caps is the wrong thing to do, since we really do change caps quite fundament... - Original commit message from CVS: - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_init): - proxying get/set caps is the wrong thing to do, since we really - do change caps quite fundamentally - * tests/check/elements/gdpdepay.c: - * tests/check/elements/gdppay.c: - remove declaration of buffers, it's already done in gstcheck.h - -2006-07-24 21:43:06 +0000 Sébastien Moutte <sebastien@moutte.net> - - sys/directsound/gstdirectsoundsink.*: Add an attenuation property that will directly attenuate the directsound buffer. - Original commit message from CVS: - * sys/directsound/gstdirectsoundsink.h: - * sys/directsound/gstdirectsoundsink.c: - Add an attenuation property that will directly attenuate the - directsound buffer. - Change the size of the directsound secondary buffer to a half second. - Add more debug logs. - Add a lock to protect dsound buffer write access. - Fix a bad implementation of reset. - * sys/directsound/gstdirectdrawsink.c: - * sys/directsound/gstdirectdrawsink.h: - Add a keep_aspect_ratio property. - Do not use overlay if not supported. - Add more debug logs. - Remove overwrite of WM_ERASEBKGND message handling. It was not - redrawing border when keep_aspect_ratio was enabled. - * win32/common/config.h: - update version waiting an auto-generated config.h - -2006-07-23 11:52:34 +0000 Chris Lee <clee@kde.org> - - Add libopenspc-based SPC decoder element (#348220). - Original commit message from CVS: - Patch by: Chris Lee <clee at kde org> - * configure.ac: - * ext/Makefile.am: - * ext/spc/Makefile.am: - * ext/spc/gstspc.c: (spc_negotiate), (gst_spc_dec_base_init), - (gst_spc_dec_class_init), (gst_spc_dec_init), (gst_spc_dec_chain), - (gst_spc_dec_sink_event), (gst_spc_dec_src_event), - (gst_spc_dec_src_query), (spc_play), (spc_setup), - (gst_spc_dec_change_state), (plugin_init): - * ext/spc/gstspc.h: - Add libopenspc-based SPC decoder element (#348220). - -2006-07-19 14:36:00 +0000 Martin Szulecki <compiz@sukimashita.com> - - sys/v4l2/gstv4l2object.c: If "device-name" is requested and the device is not open, try to temporarily open it to obt... - Original commit message from CVS: - Patch by: Martin Szulecki - * sys/v4l2/gstv4l2object.c: (gst_v4l2_object_get_property_helper): - If "device-name" is requested and the device is not - open, try to temporarily open it to obtain this - information (#342494). - -2006-07-19 11:47:20 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - update spec file - Original commit message from CVS: - update spec file - -2006-07-19 11:43:50 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/nsf/nsf.c: Really fix compilation. Apparently it's not enough to just check the return value for errors, but we n... - Original commit message from CVS: - * gst/nsf/nsf.c: (nsf_load): - Really fix compilation. Apparently it's not enough to - just check the return value for errors, but we need to - check for short reads as well (now if only we handled - them too ...). Fixes #347935. - -2006-07-18 18:05:15 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/wavpack/gstwavpackdec.c: Fix caps after previous change to byte order endianness. - Original commit message from CVS: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_chain): - Fix caps after previous change to byte order endianness. - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), - (gst_wavpack_parse_sink_event), (gst_wavpack_parse_init), - (gst_wavpack_parse_loop): - * ext/wavpack/gstwavpackparse.h: - Queue incoming events if there's no source pad yet and - send them downstream later when the pad is there. - -2006-07-18 16:47:25 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/wavpack/gstwavpackdec.*: Output audio in native byte order (which is also how we get samples from wavpack); outpu... - Original commit message from CVS: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_init), - (gst_wavpack_dec_format_samples), - (gst_wavpack_dec_clip_outgoing_buffer), (gst_wavpack_dec_chain), - (gst_wavpack_dec_change_state): - * ext/wavpack/gstwavpackdec.h: - Output audio in native byte order (which is also how we get - samples from wavpack); output samples with 21-24 bit depth - with 32 bit width (makes things easier for us). - -2006-07-18 15:53:35 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/wavpack/gstwavpackdec.*: More clean-ups: remove most of the disfunctional correction pad stuff for now, if it eve... - Original commit message from CVS: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init), - (gst_wavpack_dec_class_init), (gst_wavpack_dec_init), - (gst_wavpack_dec_finalize), (gst_wavpack_dec_format_samples), - (gst_wavpack_dec_clip_outgoing_buffer), (gst_wavpack_dec_chain), - (gst_wavpack_dec_sink_event), (gst_wavpack_dec_change_state): - * ext/wavpack/gstwavpackdec.h: - More clean-ups: remove most of the disfunctional correction - pad stuff for now, if it ever gets implemented a lot of stuff - will have to be rewritten anyway; redo chain function, move - errors to end, error out instead of g_assert()ing. Also rename - overly long variable 'wavpackdec' to just 'dec'; miscellaneous - other small stuff. - -2006-07-18 14:08:06 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - configure.ac: Check for wavpack version and define WAVPACK_OLD_API if necessary. - Original commit message from CVS: - Patch by: Sebastian Dröge <slomo at circular-chaos.org> - * configure.ac: - Check for wavpack version and define WAVPACK_OLD_API if - necessary. - * ext/wavpack/Makefile.am: - * ext/wavpack/gstwavpackcommon.c: (gst_wavpack_read_header), - (gst_wavpack_read_metadata): - * ext/wavpack/gstwavpackcommon.h: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init), - (gst_wavpack_dec_class_init), (gst_wavpack_dec_init), - (gst_wavpack_dec_finalize), (gst_wavpack_dec_format_samples), - (gst_wavpack_dec_clip_outgoing_buffer), (gst_wavpack_dec_chain), - (gst_wavpack_dec_sink_event), (gst_wavpack_dec_change_state), - (gst_wavpack_dec_request_new_pad), (gst_wavpack_dec_plugin_init): - * ext/wavpack/gstwavpackdec.h: - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init), - (gst_wavpack_enc_init), (gst_wavpack_enc_finalize), - (gst_wavpack_enc_set_wp_config): - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init), - (gst_wavpack_parse_finalize), (gst_wavpack_parse_class_init), - (gst_wavpack_parse_index_get_entry_from_sample), - (gst_wavpack_parse_scan_to_find_sample), - (gst_wavpack_parse_handle_seek_event), - (gst_wavpack_parse_create_src_pad): - * ext/wavpack/gstwavpackstreamreader.c: - * ext/wavpack/gstwavpackstreamreader.h: - Port to new/official wavpack API, don't use API that was exported - in wavpack header files and in the lib but meant to be private, at - least not for recent wavpack versions; misc. 'cleanups' (#347443). - -2006-07-18 09:36:46 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/nsf/nsf.c: Fix compilation by not ignoring return values of fread. - Original commit message from CVS: - * gst/nsf/nsf.c: (nsf_load): - Fix compilation by not ignoring return values of fread. - -2006-07-17 15:09:31 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - docs/plugins/inspect/: adding more inspect docs - Original commit message from CVS: - * docs/plugins/inspect/plugin-alsaspdif.xml: - * docs/plugins/inspect/plugin-filter.xml: - * docs/plugins/inspect/plugin-h264parse.xml: - * docs/plugins/inspect/plugin-musepack.xml: - * docs/plugins/inspect/plugin-nsfdec.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-spectrum.xml: - adding more inspect docs - -2006-07-17 14:43:55 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - docs/plugins/inspect/plugin-gdp.xml: actually commit inspectation of gdp element - Original commit message from CVS: - * docs/plugins/inspect/plugin-gdp.xml: - actually commit inspectation of gdp element - -2006-07-17 14:17:45 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst/gdp/: remove parent_class setting, BOILERPLATE does this fix typo in comment - Original commit message from CVS: - 2006-07-17 Thomas Vander Stichele <thomas at apestaart dot org> - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_class_init): - * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init), - remove parent_class setting, BOILERPLATE does this - (gst_gdp_pay_reset_streamheader): - fix typo in comment - -2006-07-17 10:25:57 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Store duration in uint64 too instead of clipping. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_perform_seek), - (gst_qtdemux_prepare_current_sample), - (gst_qtdemux_loop_state_movie): - Store duration in uint64 too instead of clipping. - When we do a keyframe seek and the requested time is at the - keyframe, don't seek back to the beginning of the keyframe. - Fixes #347439. - -2006-07-16 14:46:02 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/faad/gstfaad.c: Don't crash on small buffers. - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_setcaps), (gst_faad_sync): - Don't crash on small buffers. - -2006-07-15 11:57:00 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ext/ivorbis/vorbisfile.c: Reset adapter. - Original commit message from CVS: - * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_sink_activate): - Reset adapter. - -2006-07-15 11:50:25 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/: Do not use deprecated gtk functions. - Original commit message from CVS: - * gst/spectrum/demo-audiotest.c: (main): - * gst/spectrum/demo-osssrc.c: (main): - Do not use deprecated gtk functions. - -2006-07-14 10:34:36 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/Makefile.am: - build as a plugin, not a lib - Original commit message from CVS: - build as a plugin, not a lib - -2006-07-14 09:11:11 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/nsf/: Remove crack malloc/free replacement. - Original commit message from CVS: - * gst/nsf/Makefile.am: - * gst/nsf/memguard.c: - * gst/nsf/memguard.h: - * gst/nsf/types.h: - Remove crack malloc/free replacement. - -2006-07-13 15:25:58 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - docs/plugins/: add more plugins and elements to docs - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - add more plugins and elements to docs - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain): - fix segfaults due to wrong g_free - add example - * gst/gdp/gstgdppay.c: - add example - -2006-07-13 15:22:36 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/nsf/Makefile.am: Fix build. - Original commit message from CVS: - * gst/nsf/Makefile.am: - Fix build. - -2006-07-13 15:22:20 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-glimagesink.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-qtdemux.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-sdlvideosink.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-video4linux2.xml: - * docs/plugins/inspect/plugin-wavpack.xml: - * docs/plugins/inspect/plugin-xingheader.xml: - * docs/plugins/inspect/plugin-xvid.xml: - remove sdlvideosink plugin and update the rest - Original commit message from CVS: - remove sdlvideosink plugin and update the rest - -2006-07-13 15:07:28 +0000 Wim Taymans <wim.taymans@gmail.com> - - Added NSF decoder plugin. Fixes 151192. - Original commit message from CVS: - Based on patches by: Johan Dahlin <johan at gnome dot org> - Ronald Bultje <rbultje at ronald dot bitfreak dot net> - * configure.ac: - * gst/nsf/Makefile.am: - * gst/nsf/dis6502.h: - * gst/nsf/fds_snd.c: - * gst/nsf/fds_snd.h: - * gst/nsf/fmopl.c: - * gst/nsf/fmopl.h: - * gst/nsf/gstnsf.c: - * gst/nsf/gstnsf.h: - * gst/nsf/log.c: - * gst/nsf/log.h: - * gst/nsf/memguard.c: - * gst/nsf/memguard.h: - * gst/nsf/mmc5_snd.c: - * gst/nsf/mmc5_snd.h: - * gst/nsf/nes6502.c: - * gst/nsf/nes6502.h: - * gst/nsf/nes_apu.c: - * gst/nsf/nes_apu.h: - * gst/nsf/nsf.c: - * gst/nsf/nsf.h: - * gst/nsf/osd.h: - * gst/nsf/types.h: - * gst/nsf/vrc7_snd.c: - * gst/nsf/vrc7_snd.h: - * gst/nsf/vrcvisnd.c: - * gst/nsf/vrcvisnd.h: - Added NSF decoder plugin. Fixes 151192. - -2006-07-13 12:42:29 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/check/Makefile.am: Only run mpeg2enc unit test if we built the mpeg2enc plugin. - Original commit message from CVS: - * tests/check/Makefile.am: - Only run mpeg2enc unit test if we built the mpeg2enc plugin. - -2006-07-13 12:24:58 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Don't error out in configure if mjpegtools dev is not there. - Original commit message from CVS: - * configure.ac: - Don't error out in configure if mjpegtools dev is not there. - -2006-07-13 11:06:45 +0000 Mark Nauwelaerts <manauw@skynet.be> - - Port mpeg2enc to 0.10 (#343184). - Original commit message from CVS: - Patch by: Mark Nauwelaerts <manauw at skynet be> - * configure.ac: - * ext/Makefile.am: - * ext/mpeg2enc/Makefile.am: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mpeg2enc/gstmpeg2enc.hh: - * ext/mpeg2enc/gstmpeg2encoder.cc: - * ext/mpeg2enc/gstmpeg2encoder.hh: - * ext/mpeg2enc/gstmpeg2encoptions.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.cc: - * ext/mpeg2enc/gstmpeg2encpicturereader.hh: - * ext/mpeg2enc/gstmpeg2encstreamwriter.cc: - * ext/mpeg2enc/gstmpeg2encstreamwriter.hh: - Port mpeg2enc to 0.10 (#343184). - * tests/check/Makefile.am: - * tests/check/elements/.cvsignore: - * tests/check/elements/mpeg2enc.c: - Add unit test for mpeg2enc. - * tests/icles/.cvsignore: - Ignore pitch-test. - -2006-07-12 09:28:46 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/spectrum/gstspectrum.c: Fix typo in property nick. - Original commit message from CVS: - * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init): - Fix typo in property nick. - -2006-07-10 14:49:46 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/filter/: Don't forget new files. - Original commit message from CVS: - * gst/filter/gstbpwsinc.h: - * gst/filter/gstiir.h: - * gst/filter/gstlpwsinc.h: - Don't forget new files. + * docs/plugins/gst_plugins_cache.json: + bad:docs: Add vaav1dec in documentation + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1773> -2006-07-10 14:43:35 +0000 Wim Taymans <wim.taymans@gmail.com> +2022-02-21 14:17:11 +0200 Sebastian Dröge <sebastian@centricular.com> - * ChangeLog: - I'm too lazy to comment this - Original commit message from CVS: - *** empty log message *** - -2006-07-10 14:42:15 +0000 Mathis Hofer <mathis.hofer@dreamlab.net> - - Ported the gstfilter plugin to GStreamer 0.10. - Original commit message from CVS: - Patch by: Mathis Hofer <mathis dot hofer at dreamlab dot net> - * configure.ac: - * gst/filter/Makefile.am: - * gst/filter/gstbpwsinc.c: (gst_bpwsinc_dispose), - (gst_bpwsinc_base_init), (gst_bpwsinc_class_init), - (gst_bpwsinc_init), (bpwsinc_set_caps), (bpwsinc_transform_ip), - (bpwsinc_set_property), (bpwsinc_get_property): - * gst/filter/gstfilter.c: (plugin_init): - * gst/filter/gstfilter.h: - * gst/filter/gstiir.c: (gst_iir_dispose), (gst_iir_base_init), - (gst_iir_class_init), (gst_iir_init), (iir_set_caps), - (iir_transform_ip), (iir_set_property), (iir_get_property): - * gst/filter/gstlpwsinc.c: (gst_lpwsinc_dispose), - (gst_lpwsinc_base_init), (gst_lpwsinc_class_init), - (gst_lpwsinc_init), (lpwsinc_set_caps), (lpwsinc_transform_ip), - (lpwsinc_set_property), (lpwsinc_get_property): - Ported the gstfilter plugin to GStreamer 0.10. - -2006-07-10 09:57:26 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Extract comment information!! - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta): - Extract comment information!! - -2006-07-10 09:46:25 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Extract year/date information (fixes #347079). - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta), - (qtdemux_tag_add_date): - Extract year/date information (fixes #347079). - -2006-07-07 14:30:26 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Don't crash on twos/sowt/raw audio. #345830. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): - Don't crash on twos/sowt/raw audio. #345830. - -2006-07-07 11:44:05 +0000 Lutz Mueller <lutz@topfrose.de> - - ext/neon/gstneonhttpsrc.*: Remove unlock function. start/stop will do everything needed - Original commit message from CVS: - Patch by: Lutz Mueller <lutz at topfrose dot de> - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_class_init), - (gst_neonhttp_src_init), (gst_neonhttp_src_finalize), - (request_dispatch), (gst_neonhttp_src_create), - (gst_neonhttp_src_start), (gst_neonhttp_src_get_size), - (gst_neonhttp_src_stop), (set_proxy), (set_uri), - (gst_neonhttp_src_set_property), (gst_neonhttp_src_get_property), - (gst_neonhttp_src_uri_set_uri), (size_header_handler): - * ext/neon/gstneonhttpsrc.h: - Remove unlock function. start/stop will do everything needed - Removed code that was never called. - Use gst_pad_alloc_buffer. Don't send EOS - parent class does that for us. - Do not escape path. Fixes #346723. - Additional code cleanups. - -2006-07-03 20:02:56 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Fix silly crasher in state change function; add - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), - (gst_qtdemux_loop_state_header), (qtdemux_video_caps): - Fix silly crasher in state change function; add - IV41 fourcc (see bug #171111); don't output confusing - debug message when skipping atoms. - -2006-06-23 09:09:44 +0000 Tim-Philipp Müller <tim@centricular.net> - - Use GST_DEBUG_CATEGORY_STATIC where possible (#342503) and fix one GObject boilerplate macro. - Original commit message from CVS: - * ext/directfb/dfbvideosink.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmenc.c: - * ext/libmms/gstmms.c: - * ext/neon/gstneonhttpsrc.c: - * ext/theora/theoradec.c: - * gst/freeze/gstfreeze.c: - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.c: - * sys/glsink/glimagesink.c: - Use GST_DEBUG_CATEGORY_STATIC where possible (#342503) - and fix one GObject boilerplate macro. - -2006-06-22 10:10:51 +0000 Cody Russell <bratsche@gnome.org> - - gst/: Avoid unnecessary class cast check in class_init functions (#337747). - Original commit message from CVS: - Patch by: Cody Russell <bratsche at gnome org> - * gst/audioresample/gstaudioresample.c: - (gst_audioresample_class_init): - * gst/playback/gststreamselector.c: - (gst_stream_selector_class_init): - * gst/subparse/gstsubparse.c: (gst_sub_parse_class_init): - * gst/tcp/gstmultifdsink.c: (gst_multi_fd_sink_class_init): - * gst/tcp/gsttcpclientsink.c: (gst_tcp_client_sink_class_init): - * gst/tcp/gsttcpclientsrc.c: (gst_tcp_client_src_class_init): - * gst/tcp/gsttcpserversink.c: (gst_tcp_server_sink_class_init): - * gst/tcp/gsttcpserversrc.c: (gst_tcp_server_src_class_init): - * gst/videoscale/gstvideoscale.c: (gst_video_scale_class_init): - * gst/videotestsrc/gstvideotestsrc.c: - (gst_video_test_src_class_init): - * gst/volume/gstvolume.c: (gst_volume_class_init): - Avoid unnecessary class cast check in class_init - functions (#337747). - -2006-06-20 11:07:02 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/modplug/libmodplug/stdafx.h: Fix modplug on AMD64. Fixes #345336. - Original commit message from CVS: - * gst/modplug/libmodplug/stdafx.h: - Fix modplug on AMD64. Fixes #345336. - -2006-06-19 14:07:24 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Fix check so that future libneon API changes won't break the build. - Original commit message from CVS: - * configure.ac: - Fix check so that future libneon API changes won't break the build. - * ext/neon/gstneonhttpsrc.c: - Fix build with libneon-0.26.x (#345182). - -2006-06-19 13:17:57 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - add latest plugins - Original commit message from CVS: - add latest plugins - -2006-06-17 15:09:39 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Fix --disable-external (can't set conditionals conditionally, #343602). - Original commit message from CVS: - * configure.ac: - Fix --disable-external (can't set conditionals conditionally, - #343602). - -2006-06-16 15:43:23 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/check/elements/audioresample.c: Add test case for bug #342789 fixed below. - Original commit message from CVS: - * tests/check/elements/audioresample.c: (test_reuse), - (audioresample_suite): - Add test case for bug #342789 fixed below. - -2006-06-16 15:17:44 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/audioresample/gstaudioresample.c: Implement GstBaseTransform::start and ::stop so that audioresample can clear it... - Original commit message from CVS: - * gst/audioresample/gstaudioresample.c: - (gst_audioresample_class_init), (gst_audioresample_init), - (audioresample_start), (audioresample_stop), - (gst_audioresample_set_property), (gst_audioresample_get_property): - Implement GstBaseTransform::start and ::stop so that audioresample - can clear its internal state properly and be reused insted of - causing non-negotiated errors with playbin under some circumstances - (#342789). - * tests/check/elements/audioresample.c: (setup_audioresample), - (cleanup_audioresample): - Need to set element state here so that ::start and ::stop are - called. - -2006-06-16 12:35:08 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - gst/spectrum/Makefile.am: Fix build. - Original commit message from CVS: - 2006-06-16 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * gst/spectrum/Makefile.am: - Fix build. - -2006-06-16 09:49:07 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/: port to use message to get results, cleanly exit when closing the window - Original commit message from CVS: - * gst/spectrum/demo-audiotest.c: (on_window_destroy), - (draw_spectrum), (message_handler), (main): - * gst/spectrum/demo-osssrc.c: (on_window_destroy), (draw_spectrum), - (message_handler), (main): - port to use message to get results, cleanly exit when closing the window - * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), - (gst_spectrum_init), (gst_spectrum_dispose), - (gst_spectrum_set_property), (gst_spectrum_get_property), - (gst_spectrum_set_caps), (gst_spectrum_start), - (gst_spectrum_message_new), (gst_spectrum_transform_ip): - * gst/spectrum/gstspectrum.h: - port to derive from basetransform and send results via messages - (like level element) - -2006-06-15 15:58:09 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Combine return values from src pad pushes. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_perform_seek), - (gst_qtdemux_combine_flows), (gst_qtdemux_loop_state_movie), - (gst_qtdemux_loop), (gst_qtdemux_chain), (qtdemux_parse_trak): - Combine return values from src pad pushes. - -2006-06-15 08:50:09 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Don't crash on files with 0 samples, EOS immediatly instead. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_header), - (gst_qtdemux_prepare_current_sample), (gst_qtdemux_advance_sample), - (gst_qtdemux_add_stream): - Don't crash on files with 0 samples, EOS immediatly instead. - Fixes #344944. - -2006-06-14 18:07:51 +0000 Wouter Paesen <wouter@kangaroot.net> - - ext/soundtouch/: Make pitch element controllable via GstController interface (#344821). - Original commit message from CVS: - Patch by: Wouter Paesen <wouter at kangaroot net> - * ext/soundtouch/Makefile.am: - * ext/soundtouch/gstpitch.cc: - Make pitch element controllable via GstController interface - (#344821). - * configure.ac: - Up core requirements to 0.10.8.1/CVS because earlier - GstControllers can't handle float properties correctly. - Check for GstController CFLAGS and LIBS. - * tests/icles/Makefile.am: - * tests/icles/pitch-test.c: (main): - Add small test program for the above (welcome to the 80s!). - -2006-06-14 09:32:27 +0000 Sebastian Dröge <slomo@circular-chaos.org> - - ext/wavpack/gstwavpackenc.*: Use bitrate property solely for bitrates and add new bits-per-sample property for the ot... - Original commit message from CVS: - Patch by: Sebastian Dröge <slomo at circular-chaos org> - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_base_init), - (gst_wavpack_enc_class_init), (gst_wavpack_enc_set_wp_config), - (gst_wavpack_enc_chain), (gst_wavpack_enc_sink_event), - (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property): - * ext/wavpack/gstwavpackenc.h: - Use bitrate property solely for bitrates and add new - bits-per-sample property for the other stuff. Set duration - to 'unknown' in initial header and resend header with proper - duration on EOS; update Sebastian's e-mail address. - -2006-06-12 11:30:08 +0000 Tim-Philipp Müller <tim@centricular.net> - - ex/: #define red green - Original commit message from CVS: - * examples/directfb/.cvsignore: - * ext/directfb/.cvsignore: - #define red green - -2006-06-12 11:04:59 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/spectrum/.cvsignore: Ignore more. - Original commit message from CVS: - * gst/spectrum/.cvsignore: - Ignore more. - -2006-06-12 10:53:26 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/libmms/gstmms.c: Set caps on outgoing buffers. - Original commit message from CVS: - * ext/libmms/gstmms.c: (gst_mms_create): - Set caps on outgoing buffers. - * sys/directdraw/gstdirectdrawsink.c: (gst_directdrawsink_init): - Comment out unused global instance variable. - -2006-06-11 22:37:07 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * .gitignore: - * tests/check/elements/.gitignore: - moap ignore - Original commit message from CVS: - moap ignore - -2006-06-11 13:57:19 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - autogen.sh: require am17 - Original commit message from CVS: - * autogen.sh: - require am17 - * configure.ac: - * ext/annodex/Makefile.am: - * ext/cdio/Makefile.am: - * ext/dv/Makefile.am: - * ext/esd/Makefile.am: - * ext/flac/Makefile.am: - * ext/gdk_pixbuf/Makefile.am: - * ext/ladspa/Makefile.am: - * ext/libcaca/Makefile.am: - * ext/speex/Makefile.am: - * ext/taglib/Makefile.am: - * sys/oss/Makefile.am: - * sys/sunaudio/Makefile.am: - * sys/ximage/Makefile.am: - clean up build further - -2006-06-10 15:33:18 +0000 Sebastian Dröge <mail@slomosnail.de> - - ext/wavpack/: Add wavpack encoder element (#343131). - Original commit message from CVS: - Patch by: Sebastian Dröge <mail at slomosnail de> - * ext/wavpack/Makefile.am: - * ext/wavpack/gstwavpack.c: (plugin_init): - * ext/wavpack/gstwavpackcommon.h: - * ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_mode_get_type), - (gst_wavpack_enc_correction_mode_get_type), - (gst_wavpack_enc_joint_stereo_mode_get_type), - (gst_wavpack_enc_base_init), (gst_wavpack_enc_class_init), - (gst_wavpack_enc_init), (gst_wavpack_enc_dispose), - (gst_wavpack_enc_sink_set_caps), (gst_wavpack_enc_set_wp_config), - (gst_wavpack_enc_format_samples), (gst_wavpack_enc_push_block), - (gst_wavpack_enc_chain), (gst_wavpack_enc_rewrite_first_block), - (gst_wavpack_enc_sink_event), (gst_wavpack_enc_change_state), - (gst_wavpack_enc_set_property), (gst_wavpack_enc_get_property), - (gst_wavpack_enc_plugin_init): - * ext/wavpack/gstwavpackenc.h: - * ext/wavpack/md5.c: - * ext/wavpack/md5.h: - Add wavpack encoder element (#343131). - -2006-06-09 17:38:20 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Check for X before using X_CFLAGS in the check for opengl (#343866). - Original commit message from CVS: - * configure.ac: - Check for X before using X_CFLAGS in the check for opengl (#343866). - * ext/musepack/Makefile.am: - * ext/wavpack/Makefile.am: - * gst/speed/Makefile.am: - Add missing GST_LIBS, fixes build on cygwin (#343866). - -2006-06-06 16:26:59 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/gstgdppay.c: - adapt to new api - Original commit message from CVS: - adapt to new api - -2006-06-06 16:14:52 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * configure.ac: - * gst/Makefile.am: - build gdp plugins - Original commit message from CVS: - build gdp plugins - -2006-06-06 15:16:15 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * tests/icles/.gitignore: - ignore more - Original commit message from CVS: - ignore more - -2006-06-06 14:39:15 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - configure.ac: enable building of GDP elements - Original commit message from CVS: - * configure.ac: - enable building of GDP elements - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain): - * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init), - (gst_gdp_pay_init), (gst_gdp_buffer_from_caps), - (gst_gdp_pay_buffer_from_buffer), (gst_gdp_buffer_from_event), - (gst_gdp_pay_reset_streamheader), (gst_gdp_pay_sink_event), - (gst_gdp_pay_set_property), (gst_gdp_pay_get_property), - (gst_gdp_pay_change_state): - * gst/gdp/gstgdppay.h: - add version 1.0 - -2006-06-02 17:01:01 +0000 Michael Smith <msmith@xiph.org> - - tests/check/: Don't busy-wait in tests; this was causing test timeouts very frequently when running under valgrind. - Original commit message from CVS: - * tests/check/elements/audioconvert.c: (set_channel_positions), - (get_float_mc_caps), (get_int_mc_caps): - * tests/check/elements/audioresample.c: - * tests/check/elements/audiotestsrc.c: (GST_START_TEST): - * tests/check/elements/videorate.c: - * tests/check/elements/videotestsrc.c: (GST_START_TEST): - * tests/check/elements/volume.c: - * tests/check/elements/vorbisdec.c: - * tests/check/pipelines/vorbisenc.c: (GST_START_TEST): - Don't busy-wait in tests; this was causing test timeouts very - frequently when running under valgrind. - -2006-06-02 16:45:59 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/gdp/gstgdpdepay.c: - * gst/gdp/gstgdppay.h: - small fixes - Original commit message from CVS: - small fixes - -2006-06-02 13:43:24 +0000 Michael Smith <msmith@xiph.org> - - ext/theora/theoradec.c: Theora 4:4:4 pixel format support. - Original commit message from CVS: - * ext/theora/theoradec.c: (theora_dec_src_convert), - (theora_handle_type_packet), (theora_handle_422_image), - (theora_handle_444_image), (theora_handle_420_image), - (theora_handle_data_packet): - Theora 4:4:4 pixel format support. - -2006-06-02 10:28:32 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst/gdp/gstgdppay.c: add crc-header and crc-payload properties don't error out on some things that are recoverable - Original commit message from CVS: - * gst/gdp/gstgdppay.c: (gst_gdp_pay_class_init), - (gst_gdp_pay_init), (gst_gdp_buffer_from_caps), - (gst_gdp_pay_buffer_from_buffer), (gst_gdp_buffer_from_event), - (gst_gdp_pay_reset_streamheader), (gst_gdp_pay_chain), - (gst_gdp_pay_sink_event), (gst_gdp_pay_set_property), - (gst_gdp_pay_get_property): - add crc-header and crc-payload properties - don't error out on some things that are recoverable - * tests/check/elements/gdppay.c: (GST_START_TEST), (gdppay_suite): - add test for crc - -2006-06-01 22:00:26 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass - Original commit message from CVS: - * ext/alsaspdif/alsaspdifsink.h: - * ext/amrwb/gstamrwbdec.h: - * ext/amrwb/gstamrwbenc.h: - * ext/amrwb/gstamrwbparse.h: - * ext/arts/gst_arts.h: - * ext/artsd/gstartsdsink.h: - * ext/audiofile/gstafparse.h: - * ext/audiofile/gstafsink.h: - * ext/audiofile/gstafsrc.h: - * ext/audioresample/gstaudioresample.h: - * ext/bz2/gstbz2dec.h: - * ext/bz2/gstbz2enc.h: - * ext/dirac/gstdiracdec.h: - * ext/directfb/dfbvideosink.h: - * ext/divx/gstdivxdec.h: - * ext/divx/gstdivxenc.h: - * ext/dts/gstdtsdec.h: - * ext/faac/gstfaac.h: - * ext/gsm/gstgsmdec.h: - * ext/gsm/gstgsmenc.h: - * ext/ivorbis/vorbisenc.h: - * ext/libfame/gstlibfame.h: - * ext/nas/nassink.h: - * ext/neon/gstneonhttpsrc.h: - * ext/polyp/polypsink.h: - * ext/sdl/sdlaudiosink.h: - * ext/sdl/sdlvideosink.h: - * ext/shout/gstshout.h: - * ext/snapshot/gstsnapshot.h: - * ext/sndfile/gstsf.h: - * ext/swfdec/gstswfdec.h: - * ext/tarkin/gsttarkindec.h: - * ext/tarkin/gsttarkinenc.h: - * ext/theora/theoradec.h: - * ext/wavpack/gstwavpackdec.h: - * ext/wavpack/gstwavpackparse.h: - * ext/xine/gstxine.h: - * ext/xvid/gstxviddec.h: - * ext/xvid/gstxvidenc.h: - * gst/cdxaparse/gstcdxaparse.h: - * gst/cdxaparse/gstcdxastrip.h: - * gst/colorspace/gstcolorspace.h: - * gst/festival/gstfestival.h: - * gst/freeze/gstfreeze.h: - * gst/gdp/gstgdpdepay.h: - * gst/gdp/gstgdppay.h: - * gst/modplug/gstmodplug.h: - * gst/mpeg1sys/gstmpeg1systemencode.h: - * gst/mpeg1videoparse/gstmp1videoparse.h: - * gst/mpeg2sub/gstmpeg2subt.h: - * gst/mpegaudioparse/gstmpegaudioparse.h: - * gst/multifilesink/gstmultifilesink.h: - * gst/overlay/gstoverlay.h: - * gst/playondemand/gstplayondemand.h: - * gst/qtdemux/qtdemux.h: - * gst/rtjpeg/gstrtjpegdec.h: - * gst/rtjpeg/gstrtjpegenc.h: - * gst/smooth/gstsmooth.h: - * gst/smoothwave/gstsmoothwave.h: - * gst/spectrum/gstspectrum.h: - * gst/speed/gstspeed.h: - * gst/stereo/gststereo.h: - * gst/switch/gstswitch.h: - * gst/tta/gstttadec.h: - * gst/tta/gstttaparse.h: - * gst/videodrop/gstvideodrop.h: - * gst/xingheader/gstxingmux.h: - * sys/directdraw/gstdirectdrawsink.h: - * sys/directsound/gstdirectsoundsink.h: - * sys/dxr3/dxr3audiosink.h: - * sys/dxr3/dxr3spusink.h: - * sys/dxr3/dxr3videosink.h: - * sys/qcam/gstqcamsrc.h: - * sys/vcd/vcdsrc.h: - Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass - -2006-06-01 19:19:50 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass - Original commit message from CVS: - * ext/alsa/gstalsamixerelement.h: - * ext/alsa/gstalsamixeroptions.h: - * ext/alsa/gstalsamixertrack.h: - * ext/gnomevfs/gstgnomevfssink.h: - * ext/gnomevfs/gstgnomevfssrc.h: - * ext/theora/gsttheoradec.h: - * ext/theora/gsttheoraenc.h: - * ext/theora/gsttheoraparse.h: - * ext/vorbis/vorbisparse.h: - * gst-libs/gst/audio/gstaudioclock.h: - * gst-libs/gst/audio/gstaudiofilter.h: - * gst-libs/gst/rtp/gstbasertpaudiopayload.h: - * gst/audioconvert/gstaudioconvert.h: - * gst/audioresample/gstaudioresample.h: - * gst/audiotestsrc/gstaudiotestsrc.h: - * gst/ffmpegcolorspace/gstffmpegcolorspace.h: - * gst/playback/gststreamselector.h: - * gst/tcp/gstmultifdsink.h: - * gst/tcp/gsttcpclientsink.h: - * gst/tcp/gsttcpclientsrc.h: - * gst/tcp/gsttcpserversink.h: - * gst/tcp/gsttcpserversrc.h: - * gst/videorate/gstvideorate.h: - * gst/videoscale/gstvideoscale.h: - * gst/videotestsrc/gstvideotestsrc.h: - * gst/volume/gstvolume.h: - * sys/v4l/gstv4ljpegsrc.h: - * sys/v4l/gstv4lmjpegsink.h: - * sys/v4l/gstv4lmjpegsrc.h: - * sys/v4l/gstv4lsrc.h: - * sys/ximage/ximagesink.h: - * sys/xvimage/xvimagesink.h: - * tests/old/testsuite/alsa/sinesrc.h: - Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass - -2006-05-31 19:26:24 +0000 Edward Hervey <bilboed@bilboed.com> - - ext/faad/gstfaad.h: Forgot to commit the header file too. - Original commit message from CVS: - * ext/faad/gstfaad.h: - Forgot to commit the header file too. - -2006-05-31 13:37:27 +0000 Edward Hervey <bilboed@bilboed.com> - - ext/faad/gstfaad.c: Added GstSegment to control segments. - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_class_init), (gst_faad_init), - (gst_faad_dispose), (gst_faad_sink_event), (clip_outgoing_buffer), - (gst_faad_chain), (gst_faad_change_state): - Added GstSegment to control segments. - Added clipping/dropping of outgoing buffers in order to have accurate - seeking working properly. - -2006-05-28 17:08:17 +0000 Lutz Müller <lutz@topfrose.de> - - ext/bz2/: Use gst_type_find_helper_* functions for typefinding; use correct caps with gst_pad_alloc_buffer(); add sta... - Original commit message from CVS: - Patch by: Lutz Müller <lutz at topfrose de> - * ext/bz2/Makefile.am: - * ext/bz2/gstbz2dec.c: (gst_bz2dec_chain), (gst_bz2dec_init), - (gst_bz2dec_change_state), (gst_bz2dec_class_init): - Use gst_type_find_helper_* functions for typefinding; use - correct caps with gst_pad_alloc_buffer(); add state change - function and reset decoder in it; don't unref buffer if - pad_push fails; use fixed caps on source pad. (#341524). - -2006-05-26 22:35:00 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/: added another example - Original commit message from CVS: - * gst/spectrum/Makefile.am: - * gst/spectrum/demo-audiotest.c: (on_frequency_changed), - (spectrum_chain), (main): - * gst/spectrum/demo-osssrc.c: - added another example - * sys/v4l2/gstv4l2src.c: - fix typo - -2006-05-26 13:16:54 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: Clip the outputed NEWSEGMENT stop time to the configured segment stop time. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_activate_segment): - Clip the outputed NEWSEGMENT stop time to the configured segment stop - time. - -2006-05-26 11:48:44 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Don't clear the running variable in the seek code. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_do_seek): - Don't clear the running variable in the seek code. - -2006-05-24 11:56:43 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Detect QCELP in mp4a descriptors. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_esds): - Detect QCELP in mp4a descriptors. - -2006-05-22 18:00:52 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: po/POTFILES.in: - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), (plugin_init): - po/POTFILES.in: - Throw an error when the file is encrypted. Move plugin_init stuff - to the end of the file, add stuff for i18n, make debug category - static. - -2006-05-22 16:24:12 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * tests/check/Makefile.am: - sigh, really don't build these - Original commit message from CVS: - sigh, really don't build these - -2006-05-22 16:08:34 +0000 Michal Benes <michal.benes@xeris.cz> - - New plugin: h264parse (#340638) - Original commit message from CVS: - Patch by: Michal Benes <michal dot benes at xeris dot cz> - * configure.ac: - * gst/h264parse/Makefile.am: - * gst/h264parse/gsth264parse.c: (gst_h264_parse_base_init), - (gst_h264_parse_finalize), (gst_h264_parse_class_init), - (gst_h264_parse_init), (gst_h264_parse_chain), - (gst_h264_parse_handle_event), (plugin_init): - * gst/h264parse/gsth264parse.h: - New plugin: h264parse (#340638) - -2006-05-22 15:53:07 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst/gdp/: Handle error cases when calling functions do downwards state change after parent's change_state - Original commit message from CVS: - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_chain), - (gst_gdp_depay_change_state): - * gst/gdp/gstgdpdepay.h: - * gst/gdp/gstgdppay.c: (gst_gdp_pay_reset_streamheader), - (gst_gdp_pay_chain), (gst_gdp_pay_sink_event), - (gst_gdp_pay_change_state): - * gst/gdp/gstgdppay.h: - Handle error cases when calling functions - do downwards state change after parent's change_state - * tests/check/elements/gdpdepay.c: (GST_START_TEST): - * tests/check/elements/gdppay.c: (GST_START_TEST): - clean up more - -2006-05-22 14:37:41 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * tests/check/Makefile.am: - don't build these yet - Original commit message from CVS: - don't build these yet - -2006-05-22 13:40:28 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * tests/check/Makefile.am: - don't build these yet - Original commit message from CVS: - don't build these yet - -2006-05-22 13:25:52 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - adding GDP payloader and depayloader. Build integration will follow later when the GDP issues for core are sorted out. - Original commit message from CVS: - * gst/gdp/Makefile.am: - * gst/gdp/gstgdp.c: (plugin_init): - * gst/gdp/gstgdpdepay.c: (gst_gdp_depay_base_init), - (gst_gdp_depay_class_init), (gst_gdp_depay_init), - (gst_gdp_depay_finalize), (gst_gdp_depay_chain), - (gst_gdp_depay_change_state), (gst_gdp_depay_plugin_init): - * gst/gdp/gstgdpdepay.h: - * gst/gdp/gstgdppay.c: (gst_gdp_pay_base_init), - (gst_gdp_pay_class_init), (gst_gdp_pay_init), - (gst_gdp_pay_dispose), (gst_gdp_stamp_buffer), - (gst_gdp_buffer_from_caps), (gst_gdp_pay_buffer_from_buffer), - (gst_gdp_buffer_from_event), (gst_gdp_pay_reset_streamheader), - (gst_gdp_queue_buffer), (gst_gdp_pay_chain), - (gst_gdp_pay_sink_event), (gst_gdp_pay_change_state), - (gst_gdp_pay_plugin_init): - * gst/gdp/gstgdppay.h: - * tests/check/Makefile.am: - * tests/check/elements/gdpdepay.c: (setup_gdpdepay), - (cleanup_gdpdepay), (gdpdepay_push_per_byte), (GST_START_TEST), - (setup_gdpdepay_streamheader), (gdpdepay_suite), (main): - * tests/check/elements/gdppay.c: (setup_gdppay), (cleanup_gdppay), - (GST_START_TEST), (setup_gdppay_streamheader), (gdppay_suite), - (main): - adding GDP payloader and depayloader. Build integration will - follow later when the GDP issues for core are sorted out. - -2006-05-21 16:41:44 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/gstspectrum.c: Use boilerplate macro, fix strings to match plugin-moval-requirements - Original commit message from CVS: - * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), - (gst_spectrum_init), (gst_spectrum_set_sink_caps), - (gst_spectrum_get_sink_caps), (gst_spectrum_chain): - Use boilerplate macro, fix strings to match plugin-moval-requirements - -2006-05-21 16:23:23 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/spectrum/Makefile.am: Link to base libraries - Original commit message from CVS: - * gst/spectrum/Makefile.am: - Link to base libraries - * gst/spectrum/demo-osssrc.c: (main): - use new threshhold property - * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init), - (gst_spectrum_init), (gst_spectrum_dispose), - (gst_spectrum_set_property), (gst_spectrum_set_sink_caps), - (gst_spectrum_get_sink_caps), (gst_spectrum_chain), - (gst_spectrum_change_state): - * gst/spectrum/gstspectrum.h: - Use gst_adapter, support multiple-channels, add threshold property for - result, add docs, fix resulting spectrum range (was including mirrored - results) - -2006-05-20 22:42:15 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Initial port of the spectrum element - Original commit message from CVS: - * configure.ac: - * gst/spectrum/demo-osssrc.c: (spectrum_chain), (main): - * gst/spectrum/fix_fft.c: (gst_spectrum_fix_dot): - * gst/spectrum/gstspectrum.c: (gst_spectrum_get_type), - (gst_spectrum_base_init), (gst_spectrum_class_init), - (gst_spectrum_init), (gst_spectrum_dispose), - (gst_spectrum_set_property), (gst_spectrum_chain): - * gst/spectrum/gstspectrum.h: - Initial port of the spectrum element + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.h: + d3d11: Remove non-existing gst_d3d11_memory_get_type() API from header + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1764> -2006-05-19 18:58:05 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-14 23:30:45 +0300 Dmitry Osipenko <dmitry.osipenko@collabora.com> - * ChangeLog: - * sys/v4l2/gstv4l2xoverlay.c: - I forget to add sys/v4l2/gstv4l2xoverlay.c in las commit - Original commit message from CVS: - I forget to add sys/v4l2/gstv4l2xoverlay.c in las commit + * sys/v4l2codecs/gstv4l2format.c: + * sys/v4l2codecs/gstv4l2format.h: + v4l2codecs: Support YUV420M format + YUV420M format of V4L essentially is I420 with separate memory planes. + It's used by NVIDIA Tegra V4L decoder. Support this format by v4l2codecs. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1727> -2006-05-19 18:31:25 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-20 23:59:46 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * sys/v4l2/gstv4l2.c: - * sys/v4l2/gstv4l2object.c: - * sys/v4l2/gstv4l2object.h: - * sys/v4l2/gstv4l2src.c: - Some clean-ups requested by wingo in bug #338818. - Original commit message from CVS: - Some clean-ups requested by wingo in bug #338818. - -2006-05-19 14:17:04 +0000 Michael Smith <msmith@xiph.org> - - ext/alsaspdif/alsaspdifsink.*: Use sampling rate from set_caps. Comment out some more unused code. - Original commit message from CVS: - * ext/alsaspdif/alsaspdifsink.c: (alsaspdifsink_base_init), - (alsaspdifsink_class_init), (alsaspdifsink_init), - (alsaspdifsink_dispose), (alsaspdifsink_set_property), - (alsaspdifsink_get_property), (alsaspdifsink_set_caps), - (alsaspdifsink_get_time), (alsaspdifsink_open), - (alsaspdifsink_close), (alsaspdifsink_find_pcm_device), - (alsaspdifsink_write_frame), (alsaspdifsink_event), - (alsaspdifsink_get_times), (alsaspdifsink_current_delay), - (generate_iec958_zero_frame), (alsaspdifsink_render), - (ignore_alsa_err), (alsaspdifsink_change_state), (plugin_init): - * ext/alsaspdif/alsaspdifsink.h: - Use sampling rate from set_caps. Comment out some more unused code. - -2006-05-18 19:34:47 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - configure.ac: Check for X11 - Original commit message from CVS: - * configure.ac: - Check for X11 - * sys/v4l2/gstv4l2object.c: (gst_v4l2_class_probe_devices): - * sys/v4l2/gstv4l2object.h: - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_iface_supported): - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/gstv4l2xoverlay.c: (gst_v4l2_xoverlay_open): - * sys/v4l2/gstv4l2xoverlay.h: - Code cleanups, fix debug macros - -2006-05-18 13:12:19 +0000 Michael Smith <msmith@xiph.org> - - ext/Makefile.am: Fix distcheck? - Original commit message from CVS: - * ext/Makefile.am: - Fix distcheck? - -2006-05-18 12:51:01 +0000 Michael Smith <msmith@xiph.org> - - Add an alsa plugin to output IEC958 frames over S/PDIF - Original commit message from CVS: - * configure.ac: - * ext/Makefile.am: - * ext/alsaspdif/Makefile.am: - * ext/alsaspdif/alsaspdifsink.c: (alsaspdifsink_base_init), - (alsaspdifsink_class_init), (alsaspdifsink_init), - (alsaspdifsink_dispose), (alsaspdifsink_set_property), - (alsaspdifsink_get_property), (alsaspdifsink_provide_clock), - (alsaspdifsink_get_time), (alsaspdifsink_open), - (alsaspdifsink_close), (alsaspdifsink_find_pcm_device), - (alsaspdifsink_write_frame), (alsaspdifsink_event), - (alsaspdifsink_get_times), (alsaspdifsink_current_delay), - (generate_iec958_zero_frame), (alsaspdifsink_render), - (ignore_alsa_err), (alsaspdifsink_change_state), (plugin_init): - * ext/alsaspdif/alsaspdifsink.h: - Add an alsa plugin to output IEC958 frames over S/PDIF - -2006-05-17 09:39:53 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/faad/gstfaad.c: Remove unused caps cruft from chain function altogether. - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_update_caps), (gst_faad_chain): - Remove unused caps cruft from chain function altogether. - -2006-05-17 09:15:55 +0000 Edward Hervey <bilboed@bilboed.com> - - ext/faad/gstfaad.c: There's no guarantee that caps was set to something, and if it did, the function called to fill t... - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_chain): - There's no guarantee that caps was set to something, and if it did, the - function called to fill that variable actually sets the caps on the - sourcpad, so we call gst_pad_alloc_buffer_and_set_caps() using - GST_PAD_CAPS(faad->srcpad). - -2006-05-15 10:10:08 +0000 Christian Schaller <uraeus@gnome.org> - - * common: - * gst-plugins-bad.spec.in: - latest changes with additions and removals - Original commit message from CVS: - latest changes with additions and removals - -2006-05-13 18:39:13 +0000 Young-Ho Cha <ganadist@chollian.net> - - ext/faad/gstfaad.*: If we encounter a decoding error, don't error out immediately, but try to resync (or see if we ha... - Original commit message from CVS: - Patch by: Young-Ho Cha <ganadist chollian net> - * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chain), - (gst_faad_change_state): - * ext/faad/gstfaad.h: - If we encounter a decoding error, don't error out immediately, - but try to resync (or see if we have better luck with the next - buffer in case of framed input). Only error out after five - consecutive errors. Fixes #341563. - -2006-05-12 10:43:49 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/xvid/gstxvidenc.c: Compile fixes. - Original commit message from CVS: - * ext/xvid/gstxvidenc.c: (gst_xvidenc_class_init), - (gst_xvidenc_init), (gst_xvidenc_finalize), - (gst_xvidenc_handle_sink_event), (gst_xvidenc_setup), - (gst_xvidenc_setcaps), (gst_xvidenc_encode), (gst_xvidenc_chain), - (gst_xvidenc_flush_buffers), (gst_xvidenc_set_property), - (gst_xvidenc_get_property): - Compile fixes. - -2006-05-12 09:28:15 +0000 Mark Nauwelaerts <manauw@skynet.be> - - ext/xvid/: xvid plugin to support more capabilities of XviD codec. - Original commit message from CVS: - Patch by: Mark Nauwelaerts <manauw at skynet dot be> - * ext/xvid/gstxvid.c: (gst_xvid_init), (gst_xvid_structure_to_csp), - (gst_xvid_csp_to_caps), (gst_xvid_image_get_size), - (gst_xvid_image_fill): - * ext/xvid/gstxvid.h: - * ext/xvid/gstxviddec.c: (gst_xviddec_class_init), - (gst_xviddec_init), (gst_xviddec_reset), (gst_xviddec_unset), - (gst_xviddec_handle_sink_event), (gst_xviddec_setup), - (gst_xviddec_add_par), (gst_xviddec_negotiate), - (gst_xviddec_decode), (gst_xviddec_chain), - (gst_xviddec_flush_buffers), (gst_xviddec_src_getcaps), - (gst_xviddec_src_link), (gst_xviddec_setcaps), - (gst_xviddec_change_state): - * ext/xvid/gstxviddec.h: - * ext/xvid/gstxvidenc.c: (gst_xvidenc_profile_get_type), - (gst_xvidenc_quant_type_get_type), (gst_xvidenc_pass_get_type), - (gst_xvidenc_get_type), (gst_xvidenc_base_init), - (gst_xvidenc_class_init), (gst_xvidenc_init), - (gst_xvidenc_finalize), (gst_xvidenc_handle_sink_event), - (gst_xvidenc_setup), (gst_xvidenc_setcaps), (gst_xvidenc_encode), - (gst_xvidenc_chain), (gst_xvidenc_flush_buffers), - (gst_xvidenc_set_property), (gst_xvidenc_get_property), - (gst_xvidenc_change_state): - * ext/xvid/gstxvidenc.h: - xvid plugin to support more capabilities of XviD codec. - Fixes #339462. - Some more cleanups here and there. - -2006-05-11 20:47:50 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * configure.ac: - put back -no-undefined - Original commit message from CVS: - put back -no-undefined + * sys/d3d11/gstd3d11screencapturesrc.cpp: + d3d11screencapturesrc: Use staging buffer pool for performance + By using staging pool/buffer, we can avoid per frame + staging texture -> system memory copy. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1756> -2006-05-11 17:59:59 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-20 15:20:07 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * ChangeLog: - * sys/v4l2/Makefile.am: - * sys/v4l2/gstv4l2.c: - * sys/v4l2/gstv4l2colorbalance.c: - * sys/v4l2/gstv4l2colorbalance.h: - * sys/v4l2/gstv4l2element.c: - * sys/v4l2/gstv4l2element.h: - * sys/v4l2/gstv4l2object.c: - * sys/v4l2/gstv4l2object.h: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/gstv4l2tuner.c: - * sys/v4l2/gstv4l2tuner.h: - * sys/v4l2/gstv4l2xoverlay.c: - * sys/v4l2/gstv4l2xoverlay.h: - * sys/v4l2/v4l2_calls.c: - * sys/v4l2/v4l2_calls.h: - * sys/v4l2/v4l2src_calls.c: - * sys/v4l2/v4l2src_calls.h: - Changes proposed by Wingo in bug #338818. - Original commit message from CVS: - Changes proposed by Wingo in bug #338818. - -2006-05-11 09:09:49 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Figure out the real audio type in mp4a boxes by parsing the optional descriptors in the option... - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse), (qtdemux_parse_trak), - (gst_qtdemux_handle_esds): - Figure out the real audio type in mp4a boxes by parsing the - optional descriptors in the optional esds box. Promote the - default AAC to mp3 when indicated. Fixes #330632. - -2006-05-10 17:44:50 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Parse version 2 sample descriptions. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse), (qtdemux_dump_unknown), - (qtdemux_parse_trak), (gst_qtdemux_handle_esds): - Parse version 2 sample descriptions. - Don't #define gst_util_dump_mem(), use something more - specific instead to avoid confusion. + * docs/plugins/gst_plugins_cache.json: + doc: Add NV12_16L32S into the cache + Autogenerated by CI + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1567> -2006-05-08 19:21:18 +0000 Martin Rubli <martin_rubli@logitech.com> +2022-01-26 13:39:40 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * ChangeLog: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/v4l2src_calls.c: - Fix fourcc name printed out. Patch from Martin Rubli. - Original commit message from CVS: - Fix fourcc name printed out. Patch from Martin Rubli. - -2006-05-08 15:20:10 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Don't cause side effects in a debugging function. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_src_query), - (qtdemux_dump_mvhd): - Don't cause side effects in a debugging function. - Also report duration in push mode since we can. - -2006-05-08 11:55:02 +0000 Edward Hervey <bilboed@bilboed.com> - - autogen.sh: libtoolize on Darwin/MacOSX is called glibtoolize - Original commit message from CVS: - * autogen.sh: (CONFIGURE_DEF_OPT): - libtoolize on Darwin/MacOSX is called glibtoolize + * sys/v4l2codecs/gstv4l2format.c: + * sys/v4l2codecs/gstv4l2format.h: + v4l2codecs: Enable MediaTek MM21 (NV12_16L32S) + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1567> -2006-05-06 00:15:59 +0000 Maciej Katafiasz <mathrick@mathrick.org> +2022-01-19 15:53:05 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * ChangeLog: - * ext/amrwb/gstamrwbdec.c: - * ext/amrwb/gstamrwbenc.c: - * ext/sdl/sdlaudiosink.c: - * ext/sdl/sdlvideosink.c: - * ext/wavpack/gstwavpackdec.c: - * ext/xine/xine.c: - * ext/xine/xineaudiodec.c: - * ext/xine/xineaudiosink.c: - * ext/xine/xineinput.c: - * gst/cdxaparse/gstcdxaparse.c: - * gst/freeze/gstfreeze.c: - Add semicolons after GST_BOILERPLATE_FULL so that indent doesn't mess up following lines. - Original commit message from CVS: - Add semicolons after GST_BOILERPLATE_FULL so that indent doesn't mess up following lines. + * sys/v4l2codecs/gstv4l2format.c: + v4l2codecs: Add support for multi planar buffers + V4L2 have some pixel formats that produces 2 dmabuf, this add + support for these format. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1567> -2006-05-05 20:12:59 +0000 Martin Rubli <martin_rubli@logitech.com> +2022-01-25 14:08:47 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * ChangeLog: - * sys/v4l2/gstv4l2element.c: - * sys/v4l2/gstv4l2element.h: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/gstv4l2tuner.c: - * sys/v4l2/gstv4l2tuner.h: - * sys/v4l2/v4l2_calls.c: - * sys/v4l2/v4l2_calls.h: - * sys/v4l2/v4l2src_calls.c: - * sys/v4l2/v4l2src_calls.h: - * tests/icles/v4l2src-test.c: - Some changes proposed by wingo in bug #338818 (but not everything yet). Patch from Martin Rubli to fix framerate dete... - Original commit message from CVS: - Some changes proposed by wingo in bug #338818 (but not everything yet). Patch from Martin Rubli to fix framerate detection. - -2006-05-05 15:50:10 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/sdl/sdlaudiosink.c: Use (NULL) instead of just NULL in GST_ELEMENT_ERROR macro. - Original commit message from CVS: - * ext/sdl/sdlaudiosink.c: (gst_sdlaudio_sink_prepare): - Use (NULL) instead of just NULL in GST_ELEMENT_ERROR macro. - -2006-05-04 15:32:10 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Back to CVS - Original commit message from CVS: - * configure.ac: - Back to CVS - -=== release 0.10.3 === - -2006-05-04 15:28:53 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-glimagesink.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-qtdemux.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-video4linux2.xml: - * docs/plugins/inspect/plugin-wavpack.xml: - * docs/plugins/inspect/plugin-xingheader.xml: - * docs/plugins/inspect/plugin-xvid.xml: - Really release 0.10.3 this time - Original commit message from CVS: - Really release 0.10.3 this time + * ext/wayland/wlshmallocator.c: + * sys/kms/gstkmsallocator.c: + * sys/v4l2codecs/gstv4l2format.c: + Port plugins to gst_video_format_info_extrapolate_stride() + This reduces code duplication and simplify addition of new + pixel formats into related plugins. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1567> -2006-05-04 15:09:13 +0000 Jan Schmidt <thaytan@mad.scientist.com> +2022-02-20 06:36:45 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * configure.ac: - Perform version number surgery to correctly release tarballs of 0.10.3 - Original commit message from CVS: - Perform version number surgery to correctly release tarballs of 0.10.3 - -2006-05-04 14:52:55 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Back to CVS - Original commit message from CVS: - * configure.ac: - Back to CVS + * sys/winscreencap/dxgicapture.c: + * sys/winscreencap/dxgicapture.h: + * sys/winscreencap/gstdxgiscreencapsrc.c: + * sys/winscreencap/gstdxgiscreencapsrc.h: + * sys/winscreencap/gstwinscreencap.c: + * sys/winscreencap/meson.build: + winscreencap: Remove dxgiscreencapsrc element + We have the d3d11screencapturesrc element in d3d11 plugin + which is obviously better than this element in terms of performance + and design, so we don't need to make people be confused by two separate elements. + Let's pick the better implementation and remove unnecessary one. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1750> -2006-05-04 14:51:06 +0000 Jan Schmidt <thaytan@mad.scientist.com> +2022-02-08 15:23:17 +0100 Jan Alexander Steffens (heftig) <heftig@archlinux.org> - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-glimagesink.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * docs/plugins/inspect/plugin-qtdemux.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-video4linux2.xml: - * docs/plugins/inspect/plugin-wavpack.xml: - * docs/plugins/inspect/plugin-xingheader.xml: - * docs/plugins/inspect/plugin-xvid.xml: - Release 0.10.3 - Original commit message from CVS: - Release 0.10.3 - -2006-05-04 09:29:24 +0000 Julien Moutte <julien@moutte.net> - - tests/icles/Makefile.am: Fix build. - Original commit message from CVS: - 2006-05-04 Julien MOUTTE <julien@moutte.net> - * tests/icles/Makefile.am: Fix build. - -2006-05-03 21:48:22 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - * po/af.po: - * po/az.po: - * po/cs.po: - * po/en_GB.po: - * po/hu.po: - * po/it.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - Update .po files - Original commit message from CVS: - Update .po files - -2006-05-03 16:54:32 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/musicbrainz/Makefile.am: Add GST_PLUGINS_BASE_CFLAGS to CFLAGS for gst/tag/tag.h - Original commit message from CVS: - * ext/musicbrainz/Makefile.am: - Add GST_PLUGINS_BASE_CFLAGS to CFLAGS for gst/tag/tag.h - -2006-05-03 14:30:21 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/qtdemux/qtdemux.c: Clean up one piece of logic slightly and remove a dead code block. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): - Clean up one piece of logic slightly and remove a - dead code block. - -2006-05-03 13:20:41 +0000 Tim-Philipp Müller <tim@centricular.net> - - Everybody loves docs - add docs for musicbrainz plugin. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/inspect/plugin-musicbrainz.xml: - * ext/musicbrainz/gsttrm.c: - * ext/musicbrainz/gsttrm.h: - Everybody loves docs - add docs for musicbrainz plugin. - -2006-05-03 12:01:43 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/Makefile.am: Add musicbrainz dir to DIST_SUBDIRS as well (fixes distcheck). - Original commit message from CVS: - * ext/Makefile.am: - Add musicbrainz dir to DIST_SUBDIRS as well (fixes distcheck). - -2006-05-03 11:34:31 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/Makefile.am: Forgot to commit this one. - Original commit message from CVS: - * ext/Makefile.am: - Forgot to commit this one. - -2006-05-03 11:27:42 +0000 James Doc Livingston <doclivingston@gmail.com> - - Port MusicBrainz TRM plugin (#336898). - Original commit message from CVS: - Patch by: James "Doc" Livingston <doclivingston gmail com> - * configure.ac: - * ext/musicbrainz/Makefile.am: - * ext/musicbrainz/gsttrm.c: (gst_trm_base_init), - (gst_trm_class_init), (gst_trm_init), (gst_trm_setcaps), - (gst_trm_chain), (gst_trm_emit_signature), (gst_trm_set_property), - (gst_trm_get_property), (gst_trm_change_state), (plugin_init): - * ext/musicbrainz/gsttrm.h: - Port MusicBrainz TRM plugin (#336898). - -2006-05-03 10:25:46 +0000 Michael Smith <msmith@xiph.org> - - ext/faad/gstfaad.c: Fix #334748: use fake_codec_data if the first bytes of the first buffer we process doesn't look l... - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_setcaps), - (looks_like_valid_header), (gst_faad_chain): - Fix #334748: use fake_codec_data if the first bytes of the first - buffer we process doesn't look like plausible AAC data (e.g. - reserved values for rate, or channels). Fixes playback of Apple's - movie trailers. + * ext/wpe/meson.build: + wpe: Clean up build script + Use feature.require to check for gstgl and exit early if 'wpe' is + disabled (don't even check for wpe-webkit-1.1). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1668> + +2022-02-19 00:37:34 +0900 Seungha Yang <seungha@centricular.com> + + * sys/directshow/dshowvideosink.cpp: + * sys/directshow/gstdshowaudiodec.h: + directshow: Fix build warnings + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1744> + +2022-02-19 00:14:38 +0900 Seungha Yang <seungha@centricular.com> + + * sys/directshow/dshowdecwrapper/gstdshowdecwrapper.cpp: + * sys/directshow/dshowdecwrapper/gstdshowdecwrapper.h: + * sys/directshow/dshowdecwrapper/meson.build: + * sys/directshow/dshowdeviceprovider.cpp: + * sys/directshow/dshowdeviceprovider.h: + * sys/directshow/dshowsinkwrapper/meson.build: + * sys/directshow/dshowsrcwrapper/meson.build: + * sys/directshow/dshowvideofakesrc.cpp: + * sys/directshow/dshowvideofakesrc.h: + * sys/directshow/dshowvideosink.cpp: + * sys/directshow/dshowvideosink.h: + * sys/directshow/gstdshow.cpp: + * sys/directshow/gstdshow.h: + * sys/directshow/gstdshowaudiodec.cpp: + * sys/directshow/gstdshowaudiodec.h: + * sys/directshow/gstdshowaudiosrc.cpp: + * sys/directshow/gstdshowaudiosrc.h: + * sys/directshow/gstdshowfakesink.cpp: + * sys/directshow/gstdshowfakesink.h: + * sys/directshow/gstdshowfakesrc.cpp: + * sys/directshow/gstdshowfakesrc.h: + * sys/directshow/gstdshowutil.cpp: + * sys/directshow/gstdshowutil.h: + * sys/directshow/gstdshowvideodec.cpp: + * sys/directshow/gstdshowvideodec.h: + * sys/directshow/gstdshowvideosrc.cpp: + * sys/directshow/gstdshowvideosrc.h: + * sys/directshow/meson.build: + * sys/directshow/plugin.cpp: + directshow: Merge plugins into single directshow plugin + ... and lower rank of dshowvideosink and dshowdeviceprovider + to GST_RANK_MARGINAL since we don't prefer this plugin + by default + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1744> + +2022-02-19 00:12:55 +0900 Seungha Yang <seungha@centricular.com> + + * sys/directshow/dshowdecwrapper/gstdshowaudiodec.cpp: + * sys/directshow/dshowdecwrapper/gstdshowaudiodec.h: + * sys/directshow/dshowdecwrapper/gstdshowfakesrc.cpp: + * sys/directshow/dshowdecwrapper/gstdshowfakesrc.h: + * sys/directshow/dshowdecwrapper/gstdshowutil.cpp: + * sys/directshow/dshowdecwrapper/gstdshowutil.h: + * sys/directshow/dshowdecwrapper/gstdshowvideodec.cpp: + * sys/directshow/dshowdecwrapper/gstdshowvideodec.h: + * sys/directshow/dshowsinkwrapper/dshowvideofakesrc.cpp: + * sys/directshow/dshowsinkwrapper/dshowvideosink.cpp: + * sys/directshow/dshowsinkwrapper/dshowvideosink.h: + * sys/directshow/dshowsrcwrapper/gstdshow.h: + * sys/directshow/dshowsrcwrapper/gstdshowaudiosrc.h: + * sys/directshow/dshowsrcwrapper/gstdshowsrcwrapper.cpp: + * sys/directshow/dshowsrcwrapper/gstdshowvideosrc.cpp: + * sys/directshow/dshowsrcwrapper/gstdshowvideosrc.h: + directshow: Remove white spaces + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1744> -2006-05-02 21:52:48 +0000 Edgard Lima <edgard.lima@indt.org.br> +2021-10-19 16:10:06 -0300 Martin Reboredo <yakoyoku@gmail.com> - * ChangeLog: - * sys/v4l2/gstv4l2src.c: - Fix get_caps func to work when no framerate is available and the caps isn't simple. - Original commit message from CVS: - Fix get_caps func to work when no framerate is available and the caps isn't simple. + * docs/plugins/gst_plugins_cache.json: + * ext/vulkan/gstvulkan.c: + * ext/vulkan/gstvulkanelements.h: + * ext/vulkan/meson.build: + * ext/vulkan/vkshaderspv.c: + * ext/vulkan/vkshaderspv.h: + vulkanshaderspv: SPIRV based filter + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1197> -2006-05-01 21:37:51 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-18 16:23:09 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * ChangeLog: - * sys/v4l2/Makefile.am: - * sys/v4l2/gstv4l2colorbalance.c: - * sys/v4l2/gstv4l2xoverlay.c: - * sys/v4l2/v4l2_calls.c: - * tests/icles/Makefile.am: - * tests/icles/v4l2src-test.c: - Few improvements to move to good. - Original commit message from CVS: - Few improvements to move to good. - -2006-05-01 17:58:38 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - moved to good. Closes #336110 - Original commit message from CVS: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/inspect/plugin-taglib.xml: - * ext/Makefile.am: - * ext/taglib/Makefile.am: - * ext/taglib/gstid3v2mux.cc: - * ext/taglib/gstid3v2mux.h: - * ext/taglib/gsttaglib.cc: - * ext/taglib/gsttaglib.h: - * tests/check/Makefile.am: - * tests/check/elements/tagid3v2mux.c: - moved to good. Closes #336110 - -2006-04-30 16:16:59 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * ext/taglib/gstid3v2mux.cc: - * ext/taglib/gsttaglib.cc: - small cleanups - Original commit message from CVS: - small cleanups - -2006-04-30 15:32:13 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * ext/taglib/gstid3v2mux.cc: - fix docs - Original commit message from CVS: - fix docs - -2006-04-30 15:13:49 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.signals: - updated element properties and signals - Original commit message from CVS: - updated element properties and signals - -2006-04-30 15:11:46 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * docs/plugins/.gitignore: - * docs/plugins/inspect/plugin-faac.xml: - * docs/plugins/inspect/plugin-wavpack.xml: - * docs/plugins/inspect/plugin-xvid.xml: - ignore more; add new inspect files - Original commit message from CVS: - ignore more; add new inspect files - -2006-04-30 14:59:39 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * docs/plugins/gst-plugins-bad-plugins-decl-list.txt: - * docs/plugins/gst-plugins-bad-plugins-decl.txt: - * docs/plugins/gst-plugins-bad-plugins-undocumented.txt: - remove files that should not be in cvs - Original commit message from CVS: - remove files that should not be in cvs - -2006-04-30 14:58:29 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - docs/plugins/: Fix up docs for taglib plugin - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-decl-list.txt: - * docs/plugins/gst-plugins-bad-plugins-decl.txt: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins-undocumented.txt: - Fix up docs for taglib plugin - Also scan .cc files - -2006-04-30 14:55:15 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-qtdemux.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-taglib.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/plugins/inspect/plugin-xingheader.xml: - update to latest version - Original commit message from CVS: - update to latest version - -2006-04-29 18:46:36 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/taglib/gsttaglib.cc: Post an error message on the bus in the (extremely unlikely) case of an error. - Original commit message from CVS: - * ext/taglib/gsttaglib.cc: - Post an error message on the bus in the (extremely unlikely) - case of an error. - -2006-04-29 18:18:24 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/taglib/: Split the actual ID3v2 tag rendering code into its own subclass. - Original commit message from CVS: - * ext/taglib/Makefile.am: - * ext/taglib/gstid3v2mux.cc: - * ext/taglib/gstid3v2mux.h: - * ext/taglib/gsttaglib.cc: - * ext/taglib/gsttaglib.h: - Split the actual ID3v2 tag rendering code into - its own subclass. - -2006-04-29 15:36:16 +0000 Sébastien Moutte <sebastien@moutte.net> - - ext/neon/gstneonhttpsrc.*: added iradio-mode support as in gnomevfssrc to enable connections with icydemux that will ... - Original commit message from CVS: - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - added iradio-mode support as in gnomevfssrc to enable - connections with icydemux that will send title tag messages on - shoutcast/icecast streams. I've also added iradio properties - iradio-name, iradio-genre, iradio-url. - added user-agent property because some shoutcast streams don't return - data if the GET requests don't have a User-Agent. - * win32/common/libgstneon.dsp: - use debug version of libneon in debug mode - -2006-04-28 21:43:07 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * tests/check/elements/tagid3v2mux.c: - element renamed - Original commit message from CVS: - element renamed - -2006-04-28 19:46:36 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - make GstElementDetails const - Original commit message from CVS: - * ext/alsa/gstalsamixerelement.c: - * ext/alsa/gstalsasrc.c: - * ext/cdparanoia/gstcdparanoiasrc.c: - * ext/gnomevfs/gstgnomevfssink.c: - * ext/gnomevfs/gstgnomevfssrc.c: - * ext/ogg/gstoggdemux.c: - * ext/ogg/gstoggmux.c: - * ext/ogg/gstoggparse.c: - * ext/ogg/gstogmparse.c: - * ext/pango/gstclockoverlay.c: - * ext/pango/gsttextoverlay.c: - * ext/pango/gsttextrender.c: - * ext/pango/gsttimeoverlay.c: - * ext/theora/theoradec.c: - * ext/theora/theoraenc.c: - * ext/vorbis/vorbisdec.c: - * ext/vorbis/vorbisenc.c: - * gst-libs/gst/audio/gstaudiofilter.c: - * gst-libs/gst/audio/gstaudiofiltertemplate.c: - * gst/audioconvert/gstaudioconvert.c: - * gst/audiorate/gstaudiorate.c: - * gst/audioresample/gstaudioresample.c: - * gst/audiotestsrc/gstaudiotestsrc.c: - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - * gst/playback/gstdecodebin.c: - * gst/playback/gstplaybin.c: - * gst/playback/gststreamselector.c: - * gst/subparse/gstsubparse.c: - * gst/tcp/gstmultifdsink.c: - * gst/tcp/gsttcpclientsink.c: - * gst/tcp/gsttcpclientsrc.c: - * gst/tcp/gsttcpserversink.c: - * gst/tcp/gsttcpserversrc.c: - * gst/typefind/gsttypefindfunctions.c: (plugin_init): - * gst/videorate/gstvideorate.c: - * gst/videoscale/gstvideoscale.c: - * gst/videotestsrc/gstvideotestsrc.c: - * gst/volume/gstvolume.c: - * sys/v4l/gstv4ljpegsrc.c: - * sys/v4l/gstv4lmjpegsink.c: - * sys/v4l/gstv4lmjpegsrc.c: - * sys/v4l/gstv4lsrc.c: - * sys/ximage/ximagesink.c: - * sys/xvimage/xvimagesink.c: - * tests/check/libs/cddabasesrc.c: - make GstElementDetails const - -2006-04-28 19:24:40 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * docs/plugins/inspect/plugin-ximagesrc.xml: - removed plugin doc - Original commit message from CVS: - removed plugin doc + * sys/v4l2codecs/gstv4l2codecvp9dec.c: + v4l2codecs: vp9: Fix reset_frame_context parameter + It was assumed that the kernel parameters would match with the bitstream value + but instead the author when with another set of value. Surprisingly, this + makes no difference with the resulting fluster score. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1748> -2006-04-28 19:23:20 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2022-02-18 16:02:27 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * ChangeLog: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-decl-list.txt: - * docs/plugins/gst-plugins-bad-plugins-decl.txt: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-undocumented.txt: - * sys/Makefile.am: - * sys/ximagesrc/Makefile.am: - * sys/ximagesrc/ximagesrc.c: - * sys/ximagesrc/ximagesrc.h: - * sys/ximagesrc/ximageutil.c: - * sys/ximagesrc/ximageutil.h: - * tests/Makefile.am: - * tests/icles/.gitignore: - * tests/icles/Makefile.am: - * tests/icles/ximagesrc-test.c: - moved ximagesrc to good - Original commit message from CVS: - moved ximagesrc to good - -2006-04-28 16:51:33 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * sys/ximagesrc/ximagesrc.c: - * sys/ximagesrc/ximagesrc.h: - borgify naming - Original commit message from CVS: - borgify naming - -2006-04-28 16:46:52 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * sys/ximagesrc/ximagesrc.c: - doc tweaks - Original commit message from CVS: - doc tweaks - -2006-04-28 16:15:20 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * sys/ximagesrc/Makefile.am: - * sys/ximagesrc/ximagesrc.c: - clean up Makefile.am - Original commit message from CVS: - clean up Makefile.am - -2006-04-28 15:33:09 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * ext/taglib/gsttaglib.cc: - * ext/taglib/gsttaglib.h: - pedantic cleanups - Original commit message from CVS: - pedantic cleanups - -2006-04-28 14:17:00 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/audioresample/gstaudioresample.c: Add support for other formats audioresample can handle such as 32 bits in and f... - Original commit message from CVS: - * gst/audioresample/gstaudioresample.c: (gst_audioresample_init), - (resample_set_state_from_caps): - Add support for other formats audioresample can handle such as - 32 bits in and float and 64 bits float. Fixes #301759 - -2006-04-28 11:04:12 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/faad/gstfaad.*: If we run into a decoding error, try re-opening the decoder with faacDecInit2() using fake codec ... - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_init), (aac_rate_idx), - (gst_faad_setcaps), (gst_faad_chain), (gst_faad_open_decoder), - (gst_faad_close_decoder), (gst_faad_change_state): - * ext/faad/gstfaad.h: - If we run into a decoding error, try re-opening the decoder - with faacDecInit2() using fake codec data created from the - data the demuxer gave us. Should fix a whole bunch of - GStreamer-faad problems incl. 'channel coupling not - implemented', 'maximum number of scalefactor bands exceeded' - etc. (#173007, #332892). - -2006-04-25 21:56:38 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Define GstElementDetails as const and also static (when defined as global) - Original commit message from CVS: - * ext/amrwb/gstamrwbdec.c: - * ext/amrwb/gstamrwbenc.c: - * ext/amrwb/gstamrwbparse.c: - * ext/arts/gst_arts.c: - * ext/artsd/gstartsdsink.c: - * ext/audiofile/gstafparse.c: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsrc.c: - * ext/audioresample/gstaudioresample.c: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2enc.c: - * ext/cdaudio/gstcdaudio.c: - * ext/directfb/dfbvideosink.c: - * ext/divx/gstdivxdec.c: - * ext/divx/gstdivxenc.c: - * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init): - * ext/faac/gstfaac.c: (gst_faac_base_init): - * ext/faad/gstfaad.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmenc.c: - * ext/hermes/gsthermescolorspace.c: - * ext/ivorbis/vorbisfile.c: - * ext/lcs/gstcolorspace.c: - * ext/libfame/gstlibfame.c: - * ext/libmms/gstmms.c: (gst_mms_base_init): - * ext/musepack/gstmusepackdec.c: (gst_musepackdec_base_init): - * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): - * ext/nas/nassink.c: (gst_nassink_base_init): - * ext/neon/gstneonhttpsrc.c: - * ext/sdl/sdlaudiosink.c: - * ext/sdl/sdlvideosink.c: - * ext/shout/gstshout.c: - * ext/snapshot/gstsnapshot.c: - * ext/sndfile/gstsf.c: - * ext/swfdec/gstswfdec.c: - * ext/tarkin/gsttarkindec.c: - * ext/tarkin/gsttarkinenc.c: - * ext/theora/theoradec.c: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxvidenc.c: - * gst/cdxaparse/gstcdxaparse.c: (gst_cdxa_parse_base_init): - * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_base_init): - * gst/chart/gstchart.c: - * gst/colorspace/gstcolorspace.c: - * gst/deinterlace/gstdeinterlace.c: - * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init): - * gst/festival/gstfestival.c: - * gst/filter/gstbpwsinc.c: - * gst/filter/gstiir.c: - * gst/filter/gstlpwsinc.c: - * gst/freeze/gstfreeze.c: - * gst/games/gstpuzzle.c: (gst_puzzle_base_init): - * gst/librfb/gstrfbsrc.c: - * gst/mixmatrix/mixmatrix.c: - * gst/mpeg1sys/gstmpeg1systemencode.c: - * gst/mpeg1videoparse/gstmp1videoparse.c: - * gst/mpeg2sub/gstmpeg2subt.c: - * gst/mpegaudioparse/gstmpegaudioparse.c: - * gst/multifilesink/gstmultifilesink.c: - * gst/overlay/gstoverlay.c: - * gst/passthrough/gstpassthrough.c: - * gst/playondemand/gstplayondemand.c: - * gst/qtdemux/qtdemux.c: - * gst/rtjpeg/gstrtjpegdec.c: - * gst/rtjpeg/gstrtjpegenc.c: - * gst/smooth/gstsmooth.c: - * gst/smoothwave/gstsmoothwave.c: - * gst/spectrum/gstspectrum.c: - * gst/speed/gstspeed.c: - * gst/stereo/gststereo.c: - * gst/switch/gstswitch.c: - * gst/tta/gstttadec.c: (gst_tta_dec_base_init): - * gst/tta/gstttaparse.c: (gst_tta_parse_base_init): - * gst/vbidec/gstvbidec.c: - * gst/videocrop/gstvideocrop.c: - * gst/videodrop/gstvideodrop.c: - * gst/virtualdub/gstxsharpen.c: - * gst/xingheader/gstxingmux.c: (gst_xing_mux_base_init): - * gst/y4m/gsty4mencode.c: - * sys/cdrom/gstcdplayer.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directsound/gstdirectsoundsink.c: - * sys/glsink/glimagesink.c: - * sys/qcam/gstqcamsrc.c: - * sys/v4l2/gstv4l2src.c: - * sys/vcd/vcdsrc.c: (gst_vcdsrc_base_init): - * sys/ximagesrc/ximagesrc.c: - Define GstElementDetails as const and also static (when defined as - global) - -2006-04-20 18:02:07 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/musepack/gstmusepackdec.c: Add support for segment seeks. - Original commit message from CVS: - * ext/musepack/gstmusepackdec.c: - (gst_musepackdec_handle_seek_event), (gst_musepackdec_loop): - Add support for segment seeks. + * sys/v4l2codecs/gstv4l2codecvp9dec.c: + v4l2codecs: vp9: Only fill compressed headers if needed + Fixes: 13944cf3ee871722 ("v4l2codecs: vp9: Make compressed hdr control optional") + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1748> -2006-04-20 17:29:56 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-01-14 23:42:27 -0600 Tim Mooney <Tim.Mooney@ndsu.edu> - * ChangeLog: - * sys/v4l2/gstv4l2src.c: - Added a couple of ifdefs to make it compile with other kernels. - Original commit message from CVS: - Added a couple of ifdefs to make it compile with other kernels. - -2006-04-20 09:48:05 +0000 j^ <j@bootlab.org> - - gst/qtdemux/qtdemux.c: Never treat video streams as an audio stream. - Original commit message from CVS: - Patch by: j^ <j at bootlab dot org> - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), - (qtdemux_video_caps): - Never treat video streams as an audio stream. - Add qtdrw mime type. - Fixes #339041 - -2006-04-19 09:27:00 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: For VBR audio, don't try to calculate the samples_per_frame. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): - For VBR audio, don't try to calculate the samples_per_frame. - Fixes #338935. + * sys/v4l2codecs/linux/types-compat.h: + v4l2: include <sys/ioccom.h> on Illumos + Needed for _IOR/_IORW + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1524> -2006-04-17 19:43:32 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-01-26 21:06:45 +0100 Loic Le Page <llepage@fluendo.com> - * ChangeLog: - * sys/v4l2/gstv4l2src.c: - Just added a gtk-doc comment. - Original commit message from CVS: - Just added a gtk-doc comment. - -2006-04-17 18:44:48 +0000 Michael Smith <msmith@xiph.org> - - ext/theora/theoradec.*: Apply fix from j^ for API change in libtheoradec. - Original commit message from CVS: - * ext/theora/theoradec.c: (theora_dec_src_convert), - (theora_handle_type_packet), (theora_handle_422_image), - (theora_handle_420_image), (theora_handle_data_packet): - * ext/theora/theoradec.h: - Apply fix from j^ for API change in libtheoradec. - Implement 4:2:2 pixel format. Untested at the moment. - -2006-04-14 13:12:58 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/musepack/gstmusepackdec.c: Fix track/album peak tag values; use GST_DEBUG_FUNCPTR and gst_pad_new_from_static_tem... - Original commit message from CVS: - * ext/musepack/gstmusepackdec.c: (gst_musepackdec_init), - (gst_musepack_stream_init): - Fix track/album peak tag values; use GST_DEBUG_FUNCPTR and - gst_pad_new_from_static_template(). + * sys/directshow/dshowsinkwrapper/dshowvideofakesrc.cpp: + * sys/directshow/dshowsinkwrapper/dshowvideofakesrc.h: + * sys/directshow/dshowsinkwrapper/dshowvideosink.cpp: + * sys/directshow/dshowsinkwrapper/dshowvideosink.h: + * sys/directshow/dshowsinkwrapper/meson.build: + * sys/directshow/dshowvideosink/README: + * sys/directshow/meson.build: + Add build files and fix build for gst-plugins-bad dshowsinkwrapper plugin + dshowsinkwrapper plugin is the old dshowvideosink plugin that has been + renamed to be compliant with the actuel plugin name in the source code. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1577> + +2022-01-26 21:03:10 +0100 Loic Le Page <llepage@fluendo.com> + + * sys/directshow/dshowsrcwrapper/BUILD.txt: + * sys/directshow/dshowsrcwrapper/CMakeLists.txt: + * sys/directshow/dshowsrcwrapper/gstdshowvideosrc.cpp: + * sys/directshow/dshowsrcwrapper/meson.build: + * sys/directshow/meson.build: + Add build files and fix build for gst-plugins-bad dshowsrcwrapper plugin + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1577> + +2022-01-26 20:58:12 +0100 Loic Le Page <llepage@fluendo.com> + + * sys/directshow/dshowdecwrapper/CMakeLists.txt: + * sys/directshow/dshowdecwrapper/gstdshowvideodec.cpp: + * sys/directshow/dshowdecwrapper/meson.build: + * sys/directshow/meson.build: + Add build files and fix build for gst-plugins-bad dshowdecwrapper plugin + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1577> + +2022-01-26 20:43:09 +0100 Loic Le Page <llepage@fluendo.com> + + * meson_options.txt: + * sys/directshow/meson.build: + * sys/directshow/strmbase/LICENSE: + * sys/directshow/strmbase/baseclasses/amextra.cpp: + * sys/directshow/strmbase/baseclasses/amextra.h: + * sys/directshow/strmbase/baseclasses/amfilter.cpp: + * sys/directshow/strmbase/baseclasses/amfilter.h: + * sys/directshow/strmbase/baseclasses/amvideo.cpp: + * sys/directshow/strmbase/baseclasses/arithutil.cpp: + * sys/directshow/strmbase/baseclasses/cache.h: + * sys/directshow/strmbase/baseclasses/checkbmi.h: + * sys/directshow/strmbase/baseclasses/combase.cpp: + * sys/directshow/strmbase/baseclasses/combase.h: + * sys/directshow/strmbase/baseclasses/cprop.cpp: + * sys/directshow/strmbase/baseclasses/cprop.h: + * sys/directshow/strmbase/baseclasses/ctlutil.cpp: + * sys/directshow/strmbase/baseclasses/ctlutil.h: + * sys/directshow/strmbase/baseclasses/ddmm.cpp: + * sys/directshow/strmbase/baseclasses/ddmm.h: + * sys/directshow/strmbase/baseclasses/dllentry.cpp: + * sys/directshow/strmbase/baseclasses/dllsetup.cpp: + * sys/directshow/strmbase/baseclasses/dllsetup.h: + * sys/directshow/strmbase/baseclasses/dxmperf.h: + * sys/directshow/strmbase/baseclasses/fourcc.h: + * sys/directshow/strmbase/baseclasses/measure.h: + * sys/directshow/strmbase/baseclasses/msgthrd.h: + * sys/directshow/strmbase/baseclasses/mtype.cpp: + * sys/directshow/strmbase/baseclasses/mtype.h: + * sys/directshow/strmbase/baseclasses/outputq.cpp: + * sys/directshow/strmbase/baseclasses/outputq.h: + * sys/directshow/strmbase/baseclasses/perflog.cpp: + * sys/directshow/strmbase/baseclasses/perflog.h: + * sys/directshow/strmbase/baseclasses/perfstruct.h: + * sys/directshow/strmbase/baseclasses/pstream.cpp: + * sys/directshow/strmbase/baseclasses/pstream.h: + * sys/directshow/strmbase/baseclasses/pullpin.cpp: + * sys/directshow/strmbase/baseclasses/pullpin.h: + * sys/directshow/strmbase/baseclasses/refclock.cpp: + * sys/directshow/strmbase/baseclasses/refclock.h: + * sys/directshow/strmbase/baseclasses/reftime.h: + * sys/directshow/strmbase/baseclasses/renbase.cpp: + * sys/directshow/strmbase/baseclasses/renbase.h: + * sys/directshow/strmbase/baseclasses/schedule.cpp: + * sys/directshow/strmbase/baseclasses/schedule.h: + * sys/directshow/strmbase/baseclasses/seekpt.cpp: + * sys/directshow/strmbase/baseclasses/seekpt.h: + * sys/directshow/strmbase/baseclasses/source.cpp: + * sys/directshow/strmbase/baseclasses/source.h: + * sys/directshow/strmbase/baseclasses/streams.h: + * sys/directshow/strmbase/baseclasses/strmctl.cpp: + * sys/directshow/strmbase/baseclasses/strmctl.h: + * sys/directshow/strmbase/baseclasses/sysclock.cpp: + * sys/directshow/strmbase/baseclasses/sysclock.h: + * sys/directshow/strmbase/baseclasses/transfrm.cpp: + * sys/directshow/strmbase/baseclasses/transfrm.h: + * sys/directshow/strmbase/baseclasses/transip.cpp: + * sys/directshow/strmbase/baseclasses/transip.h: + * sys/directshow/strmbase/baseclasses/videoctl.cpp: + * sys/directshow/strmbase/baseclasses/videoctl.h: + * sys/directshow/strmbase/baseclasses/vtrans.cpp: + * sys/directshow/strmbase/baseclasses/vtrans.h: + * sys/directshow/strmbase/baseclasses/winctrl.cpp: + * sys/directshow/strmbase/baseclasses/winctrl.h: + * sys/directshow/strmbase/baseclasses/winutil.cpp: + * sys/directshow/strmbase/baseclasses/winutil.h: + * sys/directshow/strmbase/baseclasses/wxdebug.cpp: + * sys/directshow/strmbase/baseclasses/wxdebug.h: + * sys/directshow/strmbase/baseclasses/wxlist.cpp: + * sys/directshow/strmbase/baseclasses/wxlist.h: + * sys/directshow/strmbase/baseclasses/wxutil.cpp: + * sys/directshow/strmbase/baseclasses/wxutil.h: + * sys/directshow/strmbase/meson.build: + * sys/meson.build: + Add directshow strmbase library source code from Microsoft repo + Original repo is here: + https://github.com/microsoft/Windows-classic-samples + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1577> + +2022-02-16 14:53:12 +0100 Loïc Le Page <llepage@fluendo.com> + + * sys/directshow/dshowdecwrapper/CMakeLists.txt: + * sys/directshow/dshowdecwrapper/gstdshowaudiodec.cpp: + * sys/directshow/dshowdecwrapper/gstdshowaudiodec.h: + * sys/directshow/dshowdecwrapper/gstdshowdecwrapper.cpp: + * sys/directshow/dshowdecwrapper/gstdshowdecwrapper.h: + * sys/directshow/dshowdecwrapper/gstdshowfakesrc.cpp: + * sys/directshow/dshowdecwrapper/gstdshowfakesrc.h: + * sys/directshow/dshowdecwrapper/gstdshowutil.cpp: + * sys/directshow/dshowdecwrapper/gstdshowutil.h: + * sys/directshow/dshowdecwrapper/gstdshowvideodec.cpp: + * sys/directshow/dshowdecwrapper/gstdshowvideodec.h: + * sys/directshow/dshowsrcwrapper/BUILD.txt: + * sys/directshow/dshowsrcwrapper/CMakeLists.txt: + * sys/directshow/dshowsrcwrapper/dshowdeviceprovider.cpp: + * sys/directshow/dshowsrcwrapper/dshowdeviceprovider.h: + * sys/directshow/dshowsrcwrapper/gstdshow.cpp: + * sys/directshow/dshowsrcwrapper/gstdshow.h: + * sys/directshow/dshowsrcwrapper/gstdshowaudiosrc.cpp: + * sys/directshow/dshowsrcwrapper/gstdshowaudiosrc.h: + * sys/directshow/dshowsrcwrapper/gstdshowfakesink.cpp: + * sys/directshow/dshowsrcwrapper/gstdshowfakesink.h: + * sys/directshow/dshowsrcwrapper/gstdshowsrcwrapper.cpp: + * sys/directshow/dshowsrcwrapper/gstdshowvideosrc.cpp: + * sys/directshow/dshowsrcwrapper/gstdshowvideosrc.h: + * sys/directshow/dshowvideosink/README: + * sys/directshow/dshowvideosink/dshowvideofakesrc.cpp: + * sys/directshow/dshowvideosink/dshowvideofakesrc.h: + * sys/directshow/dshowvideosink/dshowvideosink.cpp: + * sys/directshow/dshowvideosink/dshowvideosink.h: + Move all directshow plugins to the same sub-folder + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1577> -2006-04-13 21:45:57 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-01-15 00:04:05 -0600 Tim Mooney <Tim.Mooney@ndsu.edu> - * ChangeLog: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/v4l2src_calls.c: - Fixed some memory leaks. - Original commit message from CVS: - Fixed some memory leaks. + * ext/curl/meson.build: + * gst/festival/meson.build: + * meson.build: + * sys/shm/meson.build: + meson: check for libsocket and libnsl + If present, add '-lsocket' and '-lnsl' to network_deps. + ext/curl/meson.build: add network_deps to dependencies + gst/festival/meson.build: same + sys/shm/meson.build: same + Fixes linking issues on Illumos distros. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1525> -2006-04-12 21:57:02 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-14 22:59:01 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * sys/v4l2/gstv4l2src.c: - Fix to work in read mode. - Original commit message from CVS: - Fix to work in read mode. - -2006-04-11 16:18:13 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - fix versioning macro and add translation files - Original commit message from CVS: - fix versioning macro and add translation files - -2006-04-10 17:16:09 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Fix parsing of newer stsd chunks again. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): - Fix parsing of newer stsd chunks again. - -2006-04-10 14:20:41 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Fix framerate calculation. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), - (qtdemux_parse_trak): - Fix framerate calculation. - -2006-04-10 13:58:17 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/swfdec/gstswfdec.c: Fix build (class_init declaration/definition mismatch). - Original commit message from CVS: - * ext/swfdec/gstswfdec.c: (gst_swfdecbuffer_class_init): - Fix build (class_init declaration/definition mismatch). - -2006-04-10 08:31:40 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: force mono 8000 Hz on AMR samples. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): - force mono 8000 Hz on AMR samples. - -2006-04-09 18:30:51 +0000 Sébastien Moutte <sebastien@moutte.net> - - ext/neon/gstneonhttpsrc.c: remove atoll by using g_ascii_strtoull (atoll is not supported on WIN32) - Original commit message from CVS: - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_start): - remove atoll by using g_ascii_strtoull (atoll is not supported on WIN32) - * sys/directdraw/gstdirectdrawsink.c: - * sys/directsound/gstdirectsoundsink.c: - done some cleans in sources - * win32/vs6: - add project files for neon, qtdemux - -2006-04-09 17:14:22 +0000 Sébastien Moutte <sebastien@moutte.net> - - gst/audioresample/debug.h: replace debug macros with variable number of parameters by a simple alias to gstreamer sta... - Original commit message from CVS: - * gst/audioresample/debug.h: - replace debug macros with variable number of parameters - by a simple alias to gstreamer standard debug macros - (#define RESAMPLE_ERROR GST_ERROR, __VA_ARGS__ is not - supported by MSVC 6.0 and 7.1) - * gst/audioresample/resample.h: - define M_PI and rint for WIN32 - * win32/common/libgstaudio.def: - * win32/common/libgstriff.def: - * win32/common/libgsttag.def: - * win32/common/libgstvideo.def: - add new exported functions - * win32/vs6: - update project files - -2006-04-08 21:48:01 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) - Original commit message from CVS: - * ext/amrwb/gstamrwbdec.c: (gst_amrwbdec_class_init): - * ext/amrwb/gstamrwbenc.c: (gst_amrwbenc_class_init): - * ext/amrwb/gstamrwbparse.c: (gst_amrwbparse_class_init): - * ext/arts/gst_arts.c: (gst_arts_class_init): - * ext/artsd/gstartsdsink.c: (gst_artsdsink_class_init): - * ext/audiofile/gstafsink.c: (gst_afsink_class_init): - * ext/audiofile/gstafsrc.c: (gst_afsrc_class_init): - * ext/audioresample/gstaudioresample.c: - * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_class_init): - * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_class_init): - * ext/divx/gstdivxdec.c: (gst_divxdec_class_init): - * ext/hermes/gsthermescolorspace.c: - (gst_hermes_colorspace_class_init): - * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_class_init): - * ext/jack/gstjack.c: (gst_jack_class_init): - * ext/jack/gstjackbin.c: (gst_jack_bin_class_init): - * ext/lcs/gstcolorspace.c: (gst_colorspace_class_init): - * ext/libfame/gstlibfame.c: (gst_fameenc_class_init): - * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_class_init): - * ext/nas/nassink.c: (gst_nassink_class_init): - * ext/shout/gstshout.c: (gst_icecastsend_class_init): - * ext/snapshot/gstsnapshot.c: (gst_snapshot_class_init): - * ext/sndfile/gstsf.c: (gst_sf_class_init): - * ext/swfdec/gstswfdec.c: (gst_swfdecbuffer_class_init), - (gst_swfdec_class_init): - * ext/tarkin/gsttarkindec.c: (gst_tarkindec_class_init): - * ext/tarkin/gsttarkinenc.c: (gst_tarkinenc_class_init): - * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_class_init): - * gst/chart/gstchart.c: (gst_chart_class_init): - * gst/colorspace/gstcolorspace.c: (gst_colorspace_class_init): - * gst/deinterlace/gstdeinterlace.c: (gst_deinterlace_class_init): - * gst/festival/gstfestival.c: (gst_festival_class_init): - * gst/filter/gstbpwsinc.c: (gst_bpwsinc_class_init): - * gst/filter/gstiir.c: (gst_iir_class_init): - * gst/filter/gstlpwsinc.c: (gst_lpwsinc_class_init): - * gst/librfb/gstrfbsrc.c: (gst_rfbsrc_class_init): - * gst/mixmatrix/mixmatrix.c: (gst_mixmatrix_class_init): - * gst/mpeg1sys/gstmpeg1systemencode.c: - (gst_system_encode_class_init): - * gst/mpeg1videoparse/gstmp1videoparse.c: - (gst_mp1videoparse_class_init): - * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_class_init): - * gst/mpegaudioparse/gstmpegaudioparse.c: - (gst_mp3parse_class_init): - * gst/overlay/gstoverlay.c: (gst_overlay_class_init): - * gst/passthrough/gstpassthrough.c: (passthrough_class_init): - * gst/playondemand/gstplayondemand.c: (play_on_demand_class_init): - * gst/rtjpeg/gstrtjpegdec.c: (gst_rtjpegdec_class_init): - * gst/rtjpeg/gstrtjpegenc.c: (gst_rtjpegenc_class_init): - * gst/smooth/gstsmooth.c: (gst_smooth_class_init): - * gst/smoothwave/gstsmoothwave.c: (gst_smoothwave_class_init): - * gst/spectrum/gstspectrum.c: (gst_spectrum_class_init): - * gst/stereo/gststereo.c: (gst_stereo_class_init): - * gst/switch/gstswitch.c: (gst_switch_class_init): - * gst/tta/gstttadec.c: (gst_tta_dec_class_init): - * gst/tta/gstttaparse.c: (gst_tta_parse_class_init): - * gst/vbidec/gstvbidec.c: (gst_vbidec_class_init): - * gst/videocrop/gstvideocrop.c: (gst_video_crop_class_init): - * gst/virtualdub/gstxsharpen.c: (gst_xsharpen_class_init): - * gst/y4m/gsty4mencode.c: (gst_y4mencode_class_init): - * sys/cdrom/gstcdplayer.c: (cdplayer_class_init): - * sys/directsound/gstdirectsoundsink.c: - (gst_directsoundsink_class_init): - * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_class_init): - * sys/dxr3/dxr3spusink.c: (dxr3spusink_class_init): - * sys/dxr3/dxr3videosink.c: (dxr3videosink_class_init): - * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_class_init): - * sys/v4l2/gstv4l2colorbalance.c: - (gst_v4l2_color_balance_channel_class_init): - * sys/v4l2/gstv4l2tuner.c: (gst_v4l2_tuner_channel_class_init), - (gst_v4l2_tuner_norm_class_init): - * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_class_init): - Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent) - -2006-04-08 19:04:01 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/: Fix more broken GObject macros - Original commit message from CVS: - * gst/colorspace/gstcolorspace.h: - * gst/deinterlace/gstdeinterlace.h: - * gst/passthrough/gstpassthrough.h: - * gst/y4m/gsty4mencode.h: - Fix more broken GObject macros - -2006-04-08 18:41:07 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Fix broken GObject macros - Original commit message from CVS: - * ext/xine/gstxine.h: - * gst-libs/gst/play/play.h: - * sys/v4l2/gstv4l2element.h: - * sys/ximagesrc/ximageutil.h: - Fix broken GObject macros - -2006-04-08 18:25:55 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - Fix broken GObject macros - Original commit message from CVS: - * ext/annodex/gstcmmldec.h: - * ext/annodex/gstcmmlenc.h: - * ext/annodex/gstcmmltag.h: - * ext/cairo/gsttextoverlay.h: - * ext/ladspa/gstsignalprocessor.h: - * gst/matroska/ebml-read.h: - * gst/matroska/ebml-write.h: - * sys/osxaudio/gstosxaudioelement.h: - Fix broken GObject macros - -2006-04-08 18:23:04 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Don't make rounding errors in timestamp/duration calculations. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_prepare_current_sample), - (gst_qtdemux_chain), (gst_qtdemux_add_stream), (qtdemux_dump_stsz), - (qtdemux_dump_stco), (qtdemux_parse_trak): - Don't make rounding errors in timestamp/duration calculations. - Fix timestamps for AMR and IMA4. Fixes (#337436). - Create a dummy segment even when there is no edit list. - -2006-04-07 16:59:15 +0000 Julien Moutte <julien@moutte.net> - - docs/plugins/gst-plugins-bad-plugins-decl-list.txt: Updates. - Original commit message from CVS: - 2006-04-07 Julien MOUTTE <julien@moutte.net> - * docs/plugins/gst-plugins-bad-plugins-decl-list.txt: Updates. - * examples/directfb/Makefile.am: Add example resource files to - dist. - -2006-04-07 15:53:43 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - Typo fix, s/XFree86/X11 and added doc blurb saying that it fixates to 25fps - Original commit message from CVS: - 2006-04-07 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * ext/amrwb/amrwb-code/Makefile.am: - * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_recalc), - (gst_ximagesrc_create), (gst_ximagesrc_set_property): - Typo fix, s/XFree86/X11 and added doc blurb saying that it fixates to - 25fps - -2006-04-07 15:47:27 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - tests/icles/ximagesrc-test.c: Actually assert that pipeline goes to playing - Original commit message from CVS: - 2006-04-07 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * tests/icles/ximagesrc-test.c: (main): - Actually assert that pipeline goes to playing - -2006-04-07 15:27:40 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/ximagesrc/ximagesrc.c: Fix typo, C++ style comments and other small cleanups - Original commit message from CVS: - 2006-04-07 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_recalc), - (composite_pixel), (gst_ximagesrc_ximage_get), - (gst_ximagesrc_create), (gst_ximagesrc_set_property): - Fix typo, C++ style comments and other small cleanups - -2006-04-06 19:16:02 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Added full edit list support. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), - (gst_qtdemux_handle_src_query), (gst_qtdemux_find_index), - (gst_qtdemux_find_keyframe), (gst_qtdemux_find_segment), - (gst_qtdemux_move_stream), (gst_qtdemux_perform_seek), - (gst_qtdemux_do_seek), (gst_qtdemux_change_state), - (gst_qtdemux_activate_segment), - (gst_qtdemux_prepare_current_sample), (gst_qtdemux_advance_sample), - (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), - (qtdemux_parse_trak): - Added full edit list support. - Avoid overflows in prologue image detection code. - Avoid roundoff errors in timestamp calculations. - -2006-04-06 14:20:27 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * ext/Makefile.am: - * ext/xine/Makefile.am: - more distcheck fixes - Original commit message from CVS: - more distcheck fixes - -2006-04-06 14:08:08 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - configure.ac: clean up so report properly on missing stuff fix modplug detection - Original commit message from CVS: - * configure.ac: - clean up so report properly on missing stuff - fix modplug detection - -2006-04-06 12:52:22 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - ext/: don't dist amr wb source code - Original commit message from CVS: - * ext/Makefile.am: - * ext/amrwb/amrwb-code/Makefile.am: - don't dist amr wb source code - -2006-04-06 11:35:26 +0000 j^ <j@bootlab.org> - - Unify the long descriptions in the plugin details (#337263). - Original commit message from CVS: - Patch by: j^ <j at bootlab dot org> - * ext/amrwb/gstamrwbdec.c: - * ext/amrwb/gstamrwbenc.c: - * ext/amrwb/gstamrwbparse.c: - * ext/arts/gst_arts.c: - * ext/artsd/gstartsdsink.c: - * ext/audiofile/gstafparse.c: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsrc.c: - * ext/cdaudio/gstcdaudio.c: - * ext/directfb/dfbvideosink.c: - * ext/divx/gstdivxdec.c: - * ext/divx/gstdivxenc.c: - * ext/dts/gstdtsdec.c: (gst_dtsdec_base_init): - * ext/faac/gstfaac.c: (gst_faac_base_init): - * ext/faad/gstfaad.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmenc.c: - * ext/hermes/gsthermescolorspace.c: - * ext/ivorbis/vorbisfile.c: - * ext/lcs/gstcolorspace.c: - * ext/libfame/gstlibfame.c: - * ext/libmms/gstmms.c: (gst_mms_base_init): - * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_base_init): - * ext/nas/nassink.c: (gst_nassink_base_init): - * ext/neon/gstneonhttpsrc.c: - * ext/polyp/polypsink.c: (gst_polypsink_base_init): - * ext/sdl/sdlaudiosink.c: - * ext/sdl/sdlvideosink.c: - * ext/shout/gstshout.c: - * ext/snapshot/gstsnapshot.c: - * ext/sndfile/gstsf.c: - * ext/tarkin/gsttarkindec.c: - * ext/tarkin/gsttarkinenc.c: - * ext/theora/theoradec.c: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_base_init): - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init): - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxvidenc.c: - * gst/cdxaparse/gstcdxaparse.c: (gst_cdxa_parse_base_init): - * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_base_init): - * gst/chart/gstchart.c: - * gst/equalizer/gstiirequalizer.c: (gst_iir_equalizer_base_init): - * gst/festival/gstfestival.c: - * gst/filter/gstiir.c: - * gst/filter/gstlpwsinc.c: - * gst/freeze/gstfreeze.c: - * gst/games/gstpuzzle.c: (gst_puzzle_base_init): - * gst/mixmatrix/mixmatrix.c: - * gst/mpeg1sys/gstmpeg1systemencode.c: - * gst/mpeg1videoparse/gstmp1videoparse.c: - * gst/mpeg2sub/gstmpeg2subt.c: - * gst/mpegaudioparse/gstmpegaudioparse.c: - * gst/multifilesink/gstmultifilesink.c: - * gst/overlay/gstoverlay.c: - * gst/passthrough/gstpassthrough.c: - * gst/playondemand/gstplayondemand.c: - * gst/qtdemux/qtdemux.c: - * gst/rtjpeg/gstrtjpegdec.c: - * gst/rtjpeg/gstrtjpegenc.c: - * gst/smooth/gstsmooth.c: - * gst/tta/gstttadec.c: (gst_tta_dec_base_init): - * gst/tta/gstttaparse.c: (gst_tta_parse_base_init): - * gst/videocrop/gstvideocrop.c: - * gst/videodrop/gstvideodrop.c: - * gst/virtualdub/gstxsharpen.c: - * gst/xingheader/gstxingmux.c: (gst_xing_mux_base_init): - * gst/y4m/gsty4mencode.c: - Unify the long descriptions in the plugin details (#337263). - -2006-04-06 09:37:21 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/neon/gstneonhttpsrc.c: Add back "uri" property and mark it as deprecated; undoes - Original commit message from CVS: - * ext/neon/gstneonhttpsrc.c: (gst_neonhttp_src_class_init), - (gst_neonhttp_src_set_property), (gst_neonhttp_src_get_property): - Add back "uri" property and mark it as deprecated; undoes - API/ABI breakage from 2006-02-24. - -2006-04-05 08:36:55 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: Use duration as segment stop position if none is explicitly configured. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_perform_seek), - (gst_qtdemux_do_seek), (gst_qtdemux_loop_state_movie), - (gst_qtdemux_loop): - Use duration as segment stop position if none is - explicitly configured. - Also perform EOS when we run past the segment stop. - -2006-04-04 11:20:58 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: More cleanups, added comments. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_go_back), - (gst_qtdemux_perform_seek), (gst_qtdemux_do_seek), - (gst_qtdemux_loop_state_movie), (gst_qtdemux_loop), - (gst_qtdemux_chain), (qtdemux_parse_tree), (qtdemux_parse_trak): - More cleanups, added comments. - Mark discontinuities on outgoing buffers. - Post better errors when something goes wrong. - Handle EOS and segment end properly. + * gst-libs/gst/d3d11/gstd3d11_private.h: + * gst-libs/gst/d3d11/gstd3d11device.cpp: + * gst-libs/gst/d3d11/gstd3d11format.h: + * sys/d3d11/gstd3d11converter.cpp: + * tests/check/elements/d3d11colorconvert.c: + d3d11: Add support for AYUV, AYUV64, and RGBA64_LE formats + Note that AYUV and AYUV64 formats will be used to expand format + support, especially some packed YUV formats (e.g., Y410, YUY2) + are common DXGI formats used for hardware decoder/encoder on Windows + but those formats cannot be used as a render target. We need to handle + them differently without pixel shader help, using compute shader + for example. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1699> -2006-04-04 08:40:52 +0000 Wim Taymans <wim.taymans@gmail.com> +2022-02-13 20:32:48 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - Mark latest change as fixing a bug. - Original commit message from CVS: - Mark latest change as fixing a bug. - -2006-04-04 08:31:10 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.*: Handle stss boxes so we can mark and find keyframes. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), - (gst_qtdemux_push_event), (gst_qtdemux_go_back), - (gst_qtdemux_perform_seek), (gst_qtdemux_do_seek), - (gst_qtdemux_handle_src_event), (plugin_init), - (gst_qtdemux_change_state), (gst_qtdemux_loop_state_movie), - (gst_qtdemux_loop), (gst_qtdemux_chain), - (qtdemux_sink_activate_pull), (gst_qtdemux_add_stream), - (qtdemux_parse), (qtdemux_parse_tree), (qtdemux_parse_trak), - (qtdemux_parse_udta), (qtdemux_tag_add_str), (qtdemux_tag_add_num), - (qtdemux_tag_add_gnre), (gst_qtdemux_handle_esds): - * gst/qtdemux/qtdemux.h: - Handle stss boxes so we can mark and find keyframes. - Implement correct accurate and keyframe seeking. - Use _DEBUG_OBJECT when possible. - -2006-04-03 11:08:44 +0000 Tim-Philipp Müller <tim@centricular.net> - - tests/check/Makefile.am: Only run the id3v2mux check if taglib is available and the taglib plugin has been built. - Original commit message from CVS: - * tests/check/Makefile.am: - Only run the id3v2mux check if taglib is available and - the taglib plugin has been built. - -2006-04-03 10:57:18 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/swfdec/Makefile.am: Don't set plugindir. - Original commit message from CVS: - * ext/swfdec/Makefile.am: - Don't set plugindir. - * ext/swfdec/gstswfdec.c: - GST_PLUGIN_DEFINE_STATIC isn't a good idea for installed plugins. - -2006-04-03 10:51:54 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Add AX_CREATE_STDINT_H to create _stdint.h, needed by the dts plugin. - Original commit message from CVS: - * configure.ac: - Add AX_CREATE_STDINT_H to create _stdint.h, needed by - the dts plugin. - -2006-04-03 10:34:54 +0000 Tim-Philipp Müller <tim@centricular.net> - - GST_ORIGIN => GST_PACKAGE_ORIGIN - Original commit message from CVS: - * ext/soundtouch/gstpitch.cc: - * ext/theora/theoradec.c: - * gst/modplug/gstmodplug.cc: - GST_ORIGIN => GST_PACKAGE_ORIGIN - GST_PACKAGE => GST_PACKAGE_NAME - -2006-04-02 10:42:32 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - docs/plugins/: add more plugins to docs - Original commit message from CVS: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/inspect/plugin-bz2.xml: - * docs/plugins/inspect/plugin-cdxaparse.xml: - * docs/plugins/inspect/plugin-freeze.xml: - * docs/plugins/inspect/plugin-glimagesink.xml: - * docs/plugins/inspect/plugin-modplug.xml: - * docs/plugins/inspect/plugin-neon.xml: - * docs/plugins/inspect/plugin-sdl.xml: - * docs/plugins/inspect/plugin-video4linux2.xml: - * docs/plugins/inspect/plugin-ximagesrc.xml: - * docs/plugins/inspect/plugin-xingheader.xml: - add more plugins to docs - -2006-04-02 09:33:12 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * configure.ac: - the alphabet, a tricky concept - Original commit message from CVS: - the alphabet, a tricky concept - -2006-04-02 09:17:23 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * configure.ac: - add liboil check, dts uses it - Original commit message from CVS: - add liboil check, dts uses it + * gst-libs/gst/d3d11/gstd3d11_private.h: + * gst-libs/gst/d3d11/gstd3d11bufferpool.cpp: + * gst-libs/gst/d3d11/gstd3d11device.cpp: + * gst-libs/gst/d3d11/gstd3d11format.cpp: + * gst-libs/gst/d3d11/gstd3d11format.h: + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * gst-libs/gst/d3d11/gstd3d11stagingbufferpool.cpp: + d3d11: Reorganize format mapping table + ... and handle GST <-> D3D11 format mapping in a single place to + make adding format easier + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1699> -2006-04-01 16:50:49 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2022-02-13 04:36:39 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * configure.ac: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-decl-list.txt: - * docs/plugins/gst-plugins-bad-plugins-decl.txt: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins-undocumented.txt: - * docs/plugins/inspect/plugin-qtdemux.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-taglib.xml: - * docs/plugins/inspect/plugin-tta.xml: - * ext/taglib/gsttaglib.cc: - * sys/dxr3/ac3_padder.h: - * tests/Makefile.am: - * tests/check/.gitignore: - * tests/check/Makefile.am: - * tests/check/elements/.gitignore: - * tests/check/elements/tagid3v2mux.c: - add taglib checks and docs - Original commit message from CVS: - add taglib checks and docs - -2006-04-01 15:36:25 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * common: - * configure.ac: - don't use AS_LIBTOOL_TAGS, it doesn't work - Original commit message from CVS: - don't use AS_LIBTOOL_TAGS, it doesn't work - -2006-04-01 10:16:28 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * .gitignore: - * docs/.gitignore: - * docs/plugins/.gitignore: - ignore more - Original commit message from CVS: - ignore more - -2006-04-01 10:15:33 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * tests/icles/ximagesrc-test.c: - 5 second timeout - Original commit message from CVS: - 5 second timeout - -2006-04-01 10:14:26 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * tests/icles/.gitignore: - * tests/icles/Makefile.am: - * tests/icles/ximagesrc-test.c: - rename test - Original commit message from CVS: - rename test + * gst-libs/gst/d3d11/gstd3d11bufferpool.cpp: + * gst-libs/gst/d3d11/gstd3d11device.cpp: + * gst-libs/gst/d3d11/gstd3d11device.h: + * gst-libs/gst/d3d11/gstd3d11format.cpp: + * gst-libs/gst/d3d11/gstd3d11format.h: + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.h: + * gst-libs/gst/d3d11/gstd3d11stagingbufferpool.cpp: + * sys/d3d11/gstd3d11convert.cpp: + * sys/d3d11/gstd3d11converter.cpp: + * sys/d3d11/gstd3d11decoder.cpp: + * sys/d3d11/gstd3d11pluginutils.cpp: + * sys/d3d11/gstd3d11upload.cpp: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window_dummy.cpp: + * sys/mediafoundation/plugin.cpp: + d3d11: Store device format in struct + Holding pointer to struct was unsafe approach because + the pointer to d3d11 format will be invalidated once d3d11 device + object is released + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1699> -2006-04-01 10:09:11 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2021-10-01 20:27:28 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * Makefile.am: - * common: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-decl-list.txt: - * ext/amrwb/gstamrwb.c: - * ext/arts/gst_arts.c: - * ext/artsd/gstartsdsink.c: - * ext/audiofile/gstaf.c: - * ext/audioresample/gstaudioresample.c: - * ext/bz2/gstbz2.c: - * ext/cdaudio/gstcdaudio.c: - * ext/directfb/dfbvideosink.c: - * ext/dts/gstdtsdec.c: - * ext/faac/gstfaac.c: - * ext/faad/gstfaad.c: - * ext/hermes/gsthermescolorspace.c: - * ext/ivorbis/vorbis.c: - * ext/jack/gstjack.c: - * ext/lcs/gstcolorspace.c: - * ext/musepack/gstmusepackdec.c: - * ext/musicbrainz/gsttrm.c: - * ext/nas/nassink.c: - * ext/sdl/gstsdl.c: - * ext/snapshot/gstsnapshot.c: - * ext/sndfile/gstsf.c: - * ext/swfdec/gstswfdec.c: - * ext/tarkin/gsttarkin.c: - * ext/xine/xine.c: - * ext/xvid/gstxvid.c: - * gst/cdxaparse/gstcdxaparse.c: - * gst/chart/gstchart.c: - * gst/colorspace/gstcolorspace.c: - * gst/deinterlace/gstdeinterlace.c: - * gst/equalizer/gstiirequalizer.c: + * gst-libs/gst/vulkan/win32/gstvkwindow_win32.c: * gst/festival/gstfestival.c: - * gst/filter/gstfilter.c: - * gst/freeze/gstfreeze.c: - * gst/games/gstpuzzle.c: - * gst/librfb/gstrfbsrc.c: - * gst/mixmatrix/mixmatrix.c: - * gst/mpeg1sys/gstmpeg1systemencode.c: - * gst/mpeg1videoparse/gstmp1videoparse.c: - * gst/mpeg2sub/gstmpeg2subt.c: - * gst/mpegaudioparse/gstmpegaudioparse.c: - * gst/multifilesink/gstmultifilesink.c: - * gst/overlay/gstoverlay.c: - * gst/passthrough/gstpassthrough.c: - * gst/playondemand/gstplayondemand.c: - * gst/qtdemux/qtdemux.c: - * gst/rtjpeg/gstrtjpeg.c: - * gst/smooth/gstsmooth.c: - * gst/smoothwave/gstsmoothwave.c: - * gst/spectrum/gstspectrum.c: - * gst/speed/gstspeed.c: - * gst/stereo/gststereo.c: - * gst/switch/gstswitch.c: - * gst/vbidec/gstvbidec.c: - * gst/videocrop/gstvideocrop.c: - * gst/videodrop/gstvideodrop.c: - * gst/virtualdub/gstvirtualdub.c: - * gst/xingheader/gstxingmux.c: - * gst/y4m/gsty4mencode.c: - * po/POTFILES.in: - * po/af.po: - * po/az.po: - * po/cs.po: - * po/en_GB.po: - * po/hu.po: - * po/it.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - * sys/cdrom/gstcdplayer.c: - * sys/directdraw/gstdirectdrawplugin.c: - * sys/directsound/gstdirectsoundplugin.c: - * sys/dxr3/dxr3init.c: - * sys/glsink/glimagesink.c: - * sys/qcam/gstqcamsrc.c: - * sys/v4l2/gstv4l2.c: - * sys/vcd/vcdsrc.c: - * sys/ximagesrc/ximagesrc.c: - rework build; add translations for v4l2 - Original commit message from CVS: - rework build; add translations for v4l2 - -2006-03-31 17:52:36 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - Add tests and fix PAR caps issue to ximagesrc - Original commit message from CVS: - 2006-03-31 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * Makefile.am: - * configure.ac: - * sys/ximagesrc/ximagesrc.c: - (gst_ximagesrc_ximage_get), - (gst_ximagesrc_get_caps), (gst_ximagesrc_class_init): - * sys/ximagesrc/ximageutil.c: - * tests/Makefile.am: - * tests/icles/Makefile.am: - * tests/icles/ximagesrc-test.c: (terminate_playback), (main): - Add tests and fix PAR caps issue to ximagesrc - -2006-03-31 16:32:47 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/ximagesrc/ximagesrc.c: Add docs to ximagesrc - Original commit message from CVS: - 2006-03-31 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * sys/ximagesrc/ximagesrc.c: - Add docs to ximagesrc - -2006-03-31 15:21:35 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - sys/ximagesrc/: Fix ximagesrc so a) the cursor doesnt trail and b) there are no yellow rectangles with the cursor - Original commit message from CVS: - 2006-03-31 Zaheer Abbas Merali <zaheerabbas at merali dot org> - * sys/ximagesrc/ximagesrc.c: (composite_pixel), - (gst_ximagesrc_ximage_get), (gst_ximagesrc_set_property), - (gst_ximagesrc_get_caps), (gst_ximagesrc_class_init): - * sys/ximagesrc/ximagesrc.h: - * sys/ximagesrc/ximageutil.c: (ximageutil_xcontext_get): - * sys/ximagesrc/ximageutil.h: - Fix ximagesrc so a) the cursor doesnt trail and b) there are no - yellow rectangles with the cursor - -2006-03-31 14:26:05 +0000 Michael Smith <msmith@xiph.org> - - configure.ac: Add autoconfery for theoradec. - Original commit message from CVS: - * configure.ac: - Add autoconfery for theoradec. - * ext/Makefile.am: - Add theora directory. - * ext/theora/Makefile.am: - * ext/theora/theoradec.c: (gst_theoradec_base_init), - (gst_theoradec_class_init), (gst_theoradec_init), - (gst_theoradec_reset), (inc_granulepos), (theora_get_query_types), - (gst_theoradec_granule_clocktime), (theora_dec_src_convert), - (theora_dec_sink_convert), (theora_dec_src_query), - (theora_dec_sink_query), (theora_dec_src_event), - (theora_dec_sink_event), (theora_handle_comment_packet), - (theora_handle_type_packet), (theora_handle_header_packet), - (theora_dec_push), (theora_handle_data_packet), (theora_dec_chain), - (theora_dec_change_state), (plugin_init): - * ext/theora/theoradec.h: - Add theora plugin for theora-exp decoder. Very heavily based on the - existing theora decoder plugin. - -2006-03-29 16:54:12 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/gsm/: Cleanups, fix leaks. - Original commit message from CVS: - * ext/gsm/gstgsmdec.c: (gst_gsmdec_class_init), (gst_gsmdec_init), - (gst_gsmdec_finalize), (gst_gsmdec_sink_event), (gst_gsmdec_chain): - * ext/gsm/gstgsmdec.h: - * ext/gsm/gstgsmenc.c: (gst_gsmenc_class_init), (gst_gsmenc_init), - (gst_gsmenc_finalize), (gst_gsmenc_chain): - Cleanups, fix leaks. - Handle events and DISCONT. - Use adapter in the decoder. - -2006-03-29 16:50:08 +0000 Renato Araujo Oliveira Filho <renatox@gmail.com> - - Added new plugin amrwb parse. - Original commit message from CVS: - Patch by: Renato Araujo Oliveira Filho <renatox at gmail dot com> - * configure.ac: - * ext/Makefile.am: - * ext/amrwb/Makefile.am: - * ext/amrwb/README: - * ext/amrwb/amrwb-code/Makefile.am: - * ext/amrwb/amrwb-code/run.sh: - * ext/amrwb/gstamrwb.c: (plugin_init): - * ext/amrwb/gstamrwbdec.c: (gst_amrwbdec_base_init), - (gst_amrwbdec_class_init), (gst_amrwbdec_init), - (gst_amrwbdec_setcaps), (gst_amrwbdec_event), (gst_amrwbdec_chain), - (gst_amrwbdec_state_change): - * ext/amrwb/gstamrwbdec.h: - * ext/amrwb/gstamrwbenc.c: (gst_amrwbenc_base_init), - (gst_amrwbenc_class_init), (gst_amrwbenc_init), - (gst_amrwbenc_finalize), (gst_amrwbenc_setcaps), - (gst_amrwbenc_chain), (gst_amrwbenc_state_change): - * ext/amrwb/gstamrwbenc.h: - * ext/amrwb/gstamrwbparse.c: (gst_amrwbparse_base_init), - (gst_amrwbparse_class_init), (gst_amrwbparse_init), - (gst_amrwbparse_querytypes), (gst_amrwbparse_query), - (gst_amrwbparse_chain), (gst_amrwbparse_read_header), - (gst_amrwbparse_loop), (gst_amrwbparse_sink_activate), - (gst_amrwbparse_sink_activate_pull), (gst_amrwbparse_state_change): - * ext/amrwb/gstamrwbparse.h: - Added new plugin amrwb parse. - Renamed audio/AMR to audio/AMR-WB as per spec. - Fixes #333307 - -2006-03-27 17:06:45 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * sys/v4l2/v4l2src_calls.c: - Small fix, now pwc driver can tell about its buffers. - Original commit message from CVS: - Small fix, now pwc driver can tell about its buffers. - -2006-03-27 10:13:47 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Remove CXX tag from AS_LIBTOOL_TAGS, just like we did for -good and -ugly. Fixes build on some systems ... - Original commit message from CVS: - * configure.ac: - Remove CXX tag from AS_LIBTOOL_TAGS, just like we - did for -good and -ugly. Fixes build on some systems - and doesn't seem to be required for C++ code. - -2006-03-26 19:56:37 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/taglib/gsttaglib.*: Fix newsegment event handling a bit. We need to cache the first newsegment event, because we ... - Original commit message from CVS: - * ext/taglib/gsttaglib.cc: - * ext/taglib/gsttaglib.h: - Fix newsegment event handling a bit. We need to - cache the first newsegment event, because we can't - adjust offsets yet when we get it, as we don't - know the size of the tag yet for sure at that point. - Also do some minor cleaning up here and there and add - some debug statements. - -2006-03-25 21:57:24 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/taglib/gsttaglib.cc: We do not want to proxy the caps on the sink pad; our source pad should have application/x-i... - Original commit message from CVS: - * ext/taglib/gsttaglib.cc: - We do not want to proxy the caps on the sink pad; our - source pad should have application/x-id3 caps; also, - don't use already-freed strings in debug messages; - finally, adjust buffer offsets on buffers sent out. - -2006-03-25 13:02:55 +0000 Tim-Philipp Müller <tim@centricular.net> - - sys/v4l2/gstv4l2src.c: Older kernels don't seem to have this particular v4l2 format, so comment out until this gets f... - Original commit message from CVS: - * sys/v4l2/gstv4l2src.c: - Older kernels don't seem to have this particular v4l2 format, - so comment out until this gets fixed properly (and make - buildbots happy). - -2006-03-25 05:31:28 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * common: - * sys/v4l2/gstv4l2colorbalance.c: - * sys/v4l2/gstv4l2colorbalance.h: - * sys/v4l2/gstv4l2element.c: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/gstv4l2tuner.c: - * sys/v4l2/v4l2_calls.c: - * sys/v4l2/v4l2src_calls.c: - * sys/v4l2/v4l2src_calls.h: - Just make few things more robust and also some identation. - Original commit message from CVS: - Just make few things more robust and also some identation. - -2006-03-23 09:15:09 +0000 Mark Nauwelaerts <manauw@skynet.be> - - ext/xvid/gstxvidenc.c: Patch to mark outgoing encoded buffers as delta-units (or not). - Original commit message from CVS: - Patch by: Mark Nauwelaerts <manauw at skynet dot be> - * ext/xvid/gstxvidenc.c: (gst_xvidenc_init), (gst_xvidenc_setup), - (gst_xvidenc_chain): - Patch to mark outgoing encoded buffers as delta-units (or not). - Note that this patch also patches: - - the setting of fincr and fbase in xvid-encoder creation based on - caps framerate - - makes 0, rather than 2, the default max_b_frames, as the current - xvidenc does not seem "fully prepared" to handle b-frame - "effects", such as encoder returning 0 encoded bytes, etc. - Fixes #335585 - -2006-03-22 19:51:29 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - add latest plugins additions - Original commit message from CVS: - add latest plugins additions - -2006-03-22 17:13:32 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/modplug/libmodplug/: Try that again (not only should it be MODPLUG_ instead of MODFILE, also that define is alrea... - Original commit message from CVS: - * gst/modplug/libmodplug/Makefile.am: - * gst/modplug/libmodplug/load_it.cpp: - Try that again (not only should it be MODPLUG_ instead - of MODFILE, also that define is already set in stdafx.h; - what we really need is some more #ifndefs). - -2006-03-22 15:02:58 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/modplug/libmodplug/Makefile.am: More gcc-4.1 fixes (we don't need file saving, so just define MODPLUG_NO_FILESAVE... - Original commit message from CVS: - * gst/modplug/libmodplug/Makefile.am: - More gcc-4.1 fixes (we don't need file saving, so just - define MODPLUG_NO_FILESAVE. That way, the compiler won't - complain about modplug ignoring the return value of fwrite - any longer and we might even save a few bytes as well). - -2006-03-22 14:31:47 +0000 Wouter Paeson <wouter@kangaroot.net> - - Add new libsoundtouch-based pitch plugin (#331335). - Original commit message from CVS: - Patch by: Wouter Paeson <wouter at kangaroot dot net> - * configure.ac: - * ext/Makefile.am: - * ext/soundtouch/Makefile.am: - * ext/soundtouch/gstpitch.cc: - * ext/soundtouch/gstpitch.hh: - Add new libsoundtouch-based pitch plugin (#331335). - -2006-03-21 16:02:09 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/modplug/libmodplug/load_ptm.cpp: Fix compilation with gcc-4.1 and -Werror (#327355). - Original commit message from CVS: - * gst/modplug/libmodplug/load_ptm.cpp: - Fix compilation with gcc-4.1 and -Werror (#327355). - -2006-03-20 08:59:29 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/taglib/gsttaglib.h: Fix left-over gst_my_filter_get_type. - Original commit message from CVS: - * ext/taglib/gsttaglib.h: - Fix left-over gst_my_filter_get_type. - -2006-03-17 16:34:36 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org> - - * ChangeLog: - * sys/ximagesrc/ximagesrc.c: - Have a show mouse pointer property and use it if we can - Original commit message from CVS: - Have a show mouse pointer property and use it if we can - -2006-03-15 15:08:20 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: Let's not forget to chain up to the parent dispose. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_dispose): - Let's not forget to chain up to the parent dispose. - -2006-03-15 14:39:25 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: Series of memleak fixes: - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_class_init), - (gst_qtdemux_init), (gst_qtdemux_dispose), - (gst_qtdemux_add_stream), (qtdemux_parse_trak): - Series of memleak fixes: - - Unref the GstAdapter in finalize. - - Use gst_pad_new_from_static_template(), shorter and safer. - - Free unused QtDemuxStream when not used. - -2006-03-14 17:24:03 +0000 Edward Hervey <bilboed@bilboed.com> - - sys/v4l2/gstv4l2src.c: Initialization of the debugging category should be as early as possible, moving it from _class... - Original commit message from CVS: - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_base_init), - (gst_v4l2src_class_init): - Initialization of the debugging category should be as early as possible, - moving it from _class_init() to beginning of _base_init(). - -2006-03-13 17:22:19 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/taglib/gsttaglib.cc: Add gtk-doc blurb (unused for the time being); match registered plugin name to the filename ... - Original commit message from CVS: - * ext/taglib/gsttaglib.cc: - Add gtk-doc blurb (unused for the time being); match registered - plugin name to the filename of the plugin (taglibmux => taglib) - -2006-03-13 12:14:18 +0000 Mikhail Zabaluev <mhz@altlinux.org> - - autogen.sh: Don't check for file that only exists in CVS but isn't disted (#334417) - Original commit message from CVS: - Patch by: Mikhail Zabaluev <mhz altlinux org> - * autogen.sh: - Don't check for file that only exists in CVS but isn't - disted (#334417) - -2006-03-13 10:05:09 +0000 Julien Moutte <julien@moutte.net> - - Fix build of v4l2 (sigh) - Original commit message from CVS: - 2006-03-13 Julien MOUTTE <julien@moutte.net> - * docs/plugins/gst-plugins-bad-plugins-decl-list.txt: - * sys/v4l2/Makefile.am: Fix build of v4l2 (sigh) - -2006-03-12 23:56:47 +0000 Tim-Philipp Müller <tim@centricular.net> - - Fix distcheck. - Original commit message from CVS: - * Makefile.am: - * configure.ac: - Fix distcheck. - -2006-03-12 15:33:00 +0000 Edward Hervey <bilboed@bilboed.com> - - sys/v4l2/v4l2src_calls.c: g_atomic_int_set is only available in glib-0.10, use gst_atomic_int_et instead. - Original commit message from CVS: - * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_capture_init), - (gst_v4l2src_buffer_pool_free): - g_atomic_int_set is only available in glib-0.10, use gst_atomic_int_et - instead. - -2006-03-12 15:25:51 +0000 Edward Hervey <bilboed@bilboed.com> - - sys/v4l2/gstv4l2element.h: Remove tim's addition of "_stdint.h" since it doesn't make the PPC buildbot happy. - Original commit message from CVS: - * sys/v4l2/gstv4l2element.h: - Remove tim's addition of "_stdint.h" since it doesn't make the PPC - buildbot happy. - I will just use the same comment Ronald used when he added these lines: - Yet Another Hack (tm) for kernel header borkedness. - -2006-03-12 15:02:02 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/taglib/: Add support for writing MusicBrainz IDs. - Original commit message from CVS: - * ext/taglib/Makefile.am: - * ext/taglib/gsttaglib.cc: - * ext/taglib/gsttaglib.h: - Add support for writing MusicBrainz IDs. - -2006-03-12 14:43:57 +0000 Tim-Philipp Müller <tim@centricular.net> - - sys/v4l2/gstv4l2element.h: Include "_stdint.h" in an attempt to make the - Original commit message from CVS: - * sys/v4l2/gstv4l2element.h: - Include "_stdint.h" in an attempt to make the - PPC-buildbot happy. - -2006-03-11 22:50:03 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * configure.ac: - * sys/Makefile.am: - * sys/v4l2/Makefile.am: - * sys/v4l2/gstv4l2.c: - * sys/v4l2/gstv4l2colorbalance.h: - * sys/v4l2/gstv4l2element.c: - * sys/v4l2/gstv4l2element.h: - * sys/v4l2/gstv4l2src.c: - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/gstv4l2tuner.c: - * sys/v4l2/gstv4l2tuner.h: - * sys/v4l2/gstv4l2xoverlay.c: - * sys/v4l2/gstv4l2xoverlay.h: - * sys/v4l2/v4l2_calls.c: - * sys/v4l2/v4l2_calls.h: - * sys/v4l2/v4l2src_calls.c: - * sys/v4l2/v4l2src_calls.h: - V4L2 ported to 0.10. - Original commit message from CVS: - V4L2 ported to 0.10. - -2006-03-11 17:08:31 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Only compile the taglib plugin if a C++ compiler is present. Use GST_DEFAULT_ELEMENTS macro from common... - Original commit message from CVS: - * configure.ac: - Only compile the taglib plugin if a C++ compiler is - present. Use GST_DEFAULT_ELEMENTS macro from common/ - for all the defaults stuff. - -2006-03-11 11:12:30 +0000 Christophe Fergeau <teuf@gnome.org> - - added new element to add Xing headers to MP3 files (this allows decoder to figure out the length of VBR files) - Original commit message from CVS: - 2006-03-11 Christophe Fergeau <teuf@gnome.org> - Reviewed by: Tim-Philipp Müller <tim at centricular dot net> - * configure.ac: - * gst/xingheader/Makefile.am: - * gst/xingheader/gstxingmux.c: - * gst/xingheader/gstxingmux.h: added new element to add Xing headers - to MP3 files (this allows decoder to figure out the length of VBR - files) - -2006-03-11 10:58:08 +0000 Alex Lancaster <alexlan@fedoraproject.org> - - ext/taglib/gsttaglib.cc: and add support for TCOP (copyright) - Original commit message from CVS: - 2006-03-11 Christophe Fergeau <teuf@gnome.org> - Patch by: Alex Lancaster - * ext/taglib/gsttaglib.cc: fix writing of TPOS tags (album number), - and add support for TCOP (copyright) - -2006-03-10 22:41:14 +0000 Julien Moutte <julien@moutte.net> - - gst/modplug/: Fix modplug compilation. - Original commit message from CVS: - 2006-03-10 Julien MOUTTE <julien@moutte.net> - * gst/modplug/Makefile.am: - * gst/modplug/gstmodplug.cc: Fix modplug compilation. - -2006-03-10 17:10:09 +0000 Tim-Philipp Müller <tim@centricular.net> - - * ChangeLog: - * configure.ac: - * gst/modplug/Makefile.am: - * gst/modplug/gstmodplug.cc: - * gst/modplug/gstmodplug.h: - * gst/modplug/libmodplug/sndfile.cpp: - * gst/modplug/libmodplug/sndfile.h: - Original commit message from CVS: * configure.ac: * gst/modplug/Makefile.am: * gst/modplug/gstmodplug.cc: * gst/modplug/gstmodplug.h: * gst/modplug/libmodplug/sndfile.cpp: * gst/modplug/libmodplug/sndfile.h: modplug plugin ported to 0.10 (#332598, patch by: Jonathan Matthew <jonathan at kaolin wh9 net>). - -2006-03-10 13:49:23 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/libmms/gstmms.*: Some clean-ups; more debug output; use blocksize property of GstBaseSrc instead of re-registerin... - Original commit message from CVS: - * ext/libmms/gstmms.c: (gst_mms_urihandler_init), - (gst_mms_base_init), (gst_mms_class_init), (gst_mms_init), - (gst_mms_finalize), (gst_mms_create), (gst_mms_start), - (gst_mms_set_property), (gst_mms_get_property), - (gst_mms_uri_get_uri): - * ext/libmms/gstmms.h: - Some clean-ups; more debug output; use blocksize property - of GstBaseSrc instead of re-registering our own; make debug - category actually be used. - -2006-03-09 20:02:44 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Fix build with gcc-4.1 (#327355). - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_send_event): - Fix build with gcc-4.1 (#327355). - -2006-03-09 17:44:17 +0000 Christophe Fergeau <teuf@gnome.org> - - new id3v2 muxer based on TagLib - Original commit message from CVS: - 2006-03-09 Christophe Fergeau <teuf@gnome.org> - reviewed by: Tim-Philipp Müller <tim at centricular dot net> - * configure.ac: - * ext/Makefile.am: - * ext/taglib/Makefile.am: - * ext/taglib/gsttaglib.cc: - * ext/taglib/gsttaglib.h: new id3v2 muxer based on TagLib - -2006-03-08 12:16:14 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Extract disc number and count from files that use 'disk' instead of 'disc' as node identifier ... - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta): - Extract disc number and count from files that use - 'disk' instead of 'disc' as node identifier for that - (fixes #332066). - -2006-03-06 13:15:04 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/musepack/: Forgot those two. - Original commit message from CVS: - * ext/musepack/gstmusepackdec.h: - * ext/musepack/gstmusepackreader.c: (gst_musepack_reader_peek): - Forgot those two. - -2006-03-06 13:13:44 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/musepack/gstmusepackdec.c: Some cleanups; pause task when push fails. - Original commit message from CVS: - * ext/musepack/gstmusepackdec.c: (gst_musepackdec_base_init), - (gst_musepackdec_init), (gst_musepackdec_send_newsegment), - (gst_musepackdec_handle_seek_event), - (gst_musepackdec_get_src_query_types), (gst_musepackdec_src_query), - (gst_musepack_stream_init), (gst_musepackdec_sink_activate), - (gst_musepackdec_sink_activate_pull), (gst_musepackdec_loop), - (gst_musepackdec_change_state): - Some cleanups; pause task when push fails. - -2006-03-05 13:03:40 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Add support for '3IVD' fourcc (#333403). - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): - Add support for '3IVD' fourcc (#333403). - -2006-03-04 20:04:11 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/faad/gstfaad.c: Add query function for position/duration querying (mostly for raw AAC streams); make seeking in r... - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_send_tags), - (gst_faad_setcaps), (gst_faad_do_raw_seek), (gst_faad_src_event), - (gst_faad_sink_event), (gst_faad_src_convert), - (gst_faad_src_query), (gst_faad_chain), (gst_faad_change_state): - Add query function for position/duration querying (mostly for - raw AAC streams); make seeking in raw AAC streams work; post - tags with codec name if this is a raw AAC stream. - -2006-03-03 23:45:23 +0000 Sébastien Moutte <sebastien@moutte.net> - - sys/: sinks are now using GST_RANK_PRIMARY to be used with autodectection - Original commit message from CVS: - * sys/directdraw: - * sys/directsound: - sinks are now using GST_RANK_PRIMARY to be used with autodectection - * win32/vs6: - project files updated to fix some bugs - * win32/vs7: - * win32/vs8: - vs7 and vs8 project files added - -2006-03-03 18:10:12 +0000 Jens Granseuer <jensgr@gmx.net> - - ext/xvid/gstxviddec.c: Declare variable at the beginning of the block and make gcc-2.9x - Original commit message from CVS: - * ext/xvid/gstxviddec.c: (gst_xviddec_chain): - Declare variable at the beginning of the block and make gcc-2.9x - happy (fixes #333283; patch by: Jens Granseuer). - -2006-03-03 11:07:41 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: Use GST_WARNING instead of GST_ERROR for all the too short/long atoms when parsing. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse), (qtdemux_parse_trak): - Use GST_WARNING instead of GST_ERROR for all the too short/long atoms - when parsing. - Also let's be a bit less vulgar in our warning messages :) - -2006-03-02 18:23:55 +0000 Wim Taymans <wim.taymans@gmail.com> - - docs/plugins/: Add audioresample to docs. - Original commit message from CVS: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-base-plugins-docs.sgml: - * docs/plugins/gst-plugins-base-plugins-sections.txt: - Add audioresample to docs. - * gst/audioconvert/gstaudioconvert.c: - Add revision date. - * gst/audioresample/gstaudioresample.c: - (gst_audioresample_base_init), (gst_audioresample_class_init), - (gst_audioresample_init), (gst_audioresample_dispose), - (audioresample_get_unit_size), (audioresample_transform_caps), - (resample_set_state_from_caps), (audioresample_transform_size), - (audioresample_set_caps), (audioresample_event), - (audioresample_do_output), (audioresample_transform), - (audioresample_pushthrough), (gst_audioresample_set_property), - (gst_audioresample_get_property), (plugin_init): - * gst/audioresample/gstaudioresample.h: - Added docs. - Small code cleanups. - -2006-02-28 11:59:49 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Can't divide through zero (suppress warning in case of stream with one single still picture) (... - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): - Can't divide through zero (suppress warning in case of - stream with one single still picture) (see #327083) - -2006-02-25 21:40:08 +0000 Julien Moutte <julien@moutte.net> - - sys/glsink/glimagesink.c: It doesn't seem we need GLU.h - Original commit message from CVS: - 2006-02-25 Julien MOUTTE <julien@moutte.net> - * sys/glsink/glimagesink.c: It doesn't seem we need GLU.h - -2006-02-24 19:49:32 +0000 Fabrizio Gennari <fabrizio.ge@tiscali.it> - - gst/qtdemux/qtdemux.c: Add support for palettised Apple SMC videos (#327075, based on - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream), - (qtdemux_parse_trak), (qtdemux_video_caps): - Add support for palettised Apple SMC videos (#327075, based on - patch by: Fabrizio Gennari <fabrizio dot ge at tiscali dot it>). - -2006-02-24 17:15:35 +0000 Michael Smith <msmith@xiph.org> - - autogen.sh: Allow automake 1.9 - Original commit message from CVS: - * autogen.sh: - Allow automake 1.9 - -2006-02-24 17:02:08 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * ext/neon/gstneonhttpsrc.c: - Changed property name from "uri" to "location". - Original commit message from CVS: - Changed property name from "uri" to "location". - -2006-02-22 14:37:20 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Cygwin Ports maintainer. - Original commit message from CVS: - * configure.ac: - * sys/glsink/Makefile.am: - Merge patch from #317048 for building on Cygwin. Patch by - Cygwin Ports maintainer. - * sys/glsink/glimagesink.c: (gst_glimage_sink_init_display): - Move normal debug output to LOG level not ERROR. - -2006-02-22 09:33:25 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: Add 'dvsd' and 'dv25' to list of possible fourcc values for DV Video. - Original commit message from CVS: - Reviewed by : Edward Hervey <edward@fluendo.com> - * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): - Add 'dvsd' and 'dv25' to list of possible fourcc values for DV Video. - Add image/png for fourcc 'png ' - -2006-02-21 15:44:05 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Surely this is supposed to be >= a.b, not == a.b - Original commit message from CVS: - * configure.ac: - Surely this is supposed to be >= a.b, not == a.b - -2006-02-20 21:19:59 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Port ximagesrc to 0.10 (Closes #304795) - Original commit message from CVS: - * configure.ac: - * sys/Makefile.am: - * sys/ximagesrc/Makefile.am: - * sys/ximagesrc/ximagesrc.c: (gst_ximagesrc_return_buf), - (gst_ximagesrc_open_display), (gst_ximagesrc_start), - (gst_ximagesrc_stop), (gst_ximagesrc_unlock), - (gst_ximagesrc_recalc), (composite_pixel), - (gst_ximagesrc_ximage_get), (gst_ximagesrc_create), - (gst_ximagesrc_set_property), (gst_ximagesrc_get_property), - (gst_ximagesrc_clear_bufpool), (gst_ximagesrc_base_init), - (gst_ximagesrc_dispose), (gst_ximagesrc_finalize), - (gst_ximagesrc_get_caps), (gst_ximagesrc_set_caps), - (gst_ximagesrc_fixate), (gst_ximagesrc_class_init), - (gst_ximagesrc_init), (plugin_init): - * sys/ximagesrc/ximagesrc.h: - * sys/ximagesrc/ximageutil.c: (ximageutil_handle_xerror), - (ximageutil_check_xshm_calls), (ximageutil_xcontext_get), - (ximageutil_xcontext_clear), - (ximageutil_calculate_pixel_aspect_ratio), - (gst_ximagesrc_buffer_finalize), (gst_ximage_buffer_free), - (gst_ximagesrc_buffer_init), (gst_ximagesrc_buffer_class_init), - (gst_ximagesrc_buffer_get_type), (gst_ximageutil_ximage_new), - (gst_ximageutil_ximage_destroy): - * sys/ximagesrc/ximageutil.h: - Port ximagesrc to 0.10 (Closes #304795) - -2006-02-20 20:52:02 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * gst/freeze/gstfreeze.c: - * gst/freeze/gstfreeze.h: - I'm too lazy to comment this - Original commit message from CVS: - Some event handling added by Renato Filho <renato.filho@indt.org.br> - -2006-02-20 19:13:36 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Back to CVS nano - Original commit message from CVS: - * configure.ac: - Back to CVS nano - -=== release 0.10.1 === - -2006-02-20 19:12:10 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: releasing 0.10.1, "Slimy - yet satisfying" - Original commit message from CVS: - 2006-02-20 Jan Schmidt <thaytan@mad.scientist.com> - * configure.ac: - releasing 0.10.1, "Slimy - yet satisfying" - -2006-02-20 13:08:50 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/ladspa/gstsignalprocessor.c: Fix compilation of LADPSA. It doesn't seem to work, and isn't enabled for the build,... - Original commit message from CVS: - * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_event), - (gst_signal_processor_process): - Fix compilation of LADPSA. It doesn't seem to work, and isn't - enabled for the build, but it helps me win the feature-count - competitions ooh yeah. - -2006-02-19 23:45:56 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Release 0.10.0.3 - pre-release for 0.10.1 - Original commit message from CVS: - * configure.ac: - Release 0.10.0.3 - pre-release for 0.10.1 - -2006-02-19 20:00:12 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/bz2/: Add proper copyright headers identifying Lutz Müller as the author and copyright holder (#331600). - Original commit message from CVS: - * ext/bz2/gstbz2.c: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2dec.h: - * ext/bz2/gstbz2enc.c: - * ext/bz2/gstbz2enc.h: - Add proper copyright headers identifying Lutz Müller - as the author and copyright holder (#331600). - -2006-02-17 18:25:42 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Don't GST_LOG timestamps from nonexistent index entries (#331582). - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_movie): - Don't GST_LOG timestamps from nonexistent index - entries (#331582). - -2006-02-17 16:28:29 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: Check that the size of the returned buffer is of the correct size because the parser assumes t... - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_state_header): - Check that the size of the returned buffer is of the correct size - because the parser assumes that. - Fixes #331543. - -2006-02-17 16:00:12 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - configure.ac: Release 0.10.0.2 - pre-release for 0.10.1 - Original commit message from CVS: - * configure.ac: - Release 0.10.0.2 - pre-release for 0.10.1 - -2006-02-17 15:03:12 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - latest updates - Original commit message from CVS: - latest updates - -2006-02-16 14:02:57 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: Don't stop the task if the pad isn't linked. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_src_event), - (gst_qtdemux_loop), (qtdemux_sink_activate_pull): - Don't stop the task if the pad isn't linked. - -2006-02-15 12:13:47 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: It appears 100% equals 1/1 and not 100/1 ... - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_chain): - It appears 100% equals 1/1 and not 100/1 ... - -2006-02-15 09:45:27 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: When buffering MDAT data, show the user something is happening by posting 'buffering' messages... - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_post_buffering), - (gst_qtdemux_chain): - When buffering MDAT data, show the user something is - happening by posting 'buffering' messages on the bus. - -2006-02-14 18:50:13 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.*: Make push-based work if mdat atom is before moov atom. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), - (gst_qtdemux_handle_src_query), (gst_qtdemux_change_state), - (next_entry_size), (gst_qtdemux_chain): - * gst/qtdemux/qtdemux.h: - Make push-based work if mdat atom is before moov atom. - Don't answer duration query. This should be transformed into replying - FALSE to seek events. - -2006-02-14 12:26:20 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/libmms/gstmms.c: Return FLOW_UNEXPECTED on EOS, not FLOW_ERROR. Also, no need to push our own EOS event on EOS, t... - Original commit message from CVS: - * ext/libmms/gstmms.c: (gst_mms_class_init), (gst_mms_create), - (gst_mms_start): - Return FLOW_UNEXPECTED on EOS, not FLOW_ERROR. Also, no need to - push our own EOS event on EOS, the base class will do that for us; - fix bogus query code; post semi-decent errors on the bus when an - error occurs in ::start(), otherwise the user will get to see - whatever cryptic default message GstBaseSrc comes up with. - -2006-02-14 11:36:30 +0000 Andy Wingo <wingo@pobox.com> - - sys/glsink/glimagesink.c (gst_glimage_sink_init): Come on schleef, don't break me gst-inspect -a. - Original commit message from CVS: - 2006-02-14 Andy Wingo <wingo@pobox.com> - * sys/glsink/glimagesink.c (gst_glimage_sink_init): Come on - schleef, don't break me gst-inspect -a. - -2006-02-14 11:24:53 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: Handle the case where data atoms are before moov atoms in push-based mode. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (next_entry_size), (gst_qtdemux_chain): - Handle the case where data atoms are before moov atoms in push-based mode. - Errors out gracefully. - -2006-02-13 22:04:42 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/: QtDemux can now work push-based. - Original commit message from CVS: - * gst/qtdemux/Makefile.am: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), - (gst_qtdemux_handle_sink_event), (gst_qtdemux_change_state), - (extract_initial_length_and_fourcc), - (gst_qtdemux_loop_state_header), (gst_qtdemux_loop_state_movie), - (gst_qtdemux_loop_header), (next_entry_size), (gst_qtdemux_chain), - (qtdemux_sink_activate), (qtdemux_sink_activate_pull), - (qtdemux_sink_activate_push), (qtdemux_parse_trak): - * gst/qtdemux/qtdemux.h: - QtDemux can now work push-based. - It still needs some love for seeking. - -2006-02-13 17:02:09 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * common: - * configure.ac: - * gst/freeze/FAQ: - * gst/freeze/Makefile.am: - * gst/freeze/gstfreeze.c: - * gst/freeze/gstfreeze.h: - I'm too lazy to comment this - Original commit message from CVS: - freeze plugin ported to 0.10 by Renato Filho <renato.filho@indt.org.br> - -2006-02-10 17:41:18 +0000 Tim-Philipp Müller <tim@centricular.net> - - Port cdxaparse, makes VCD playback work. - Original commit message from CVS: - * configure.ac: - * gst/cdxaparse/Makefile.am: - * gst/cdxaparse/gstcdxaparse.c: - * gst/cdxaparse/gstcdxaparse.h: - Port cdxaparse, makes VCD playback work. - -2006-02-10 13:16:49 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - update spec file - Original commit message from CVS: - update spec file - -2006-02-07 18:31:31 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/qtdemux/qtdemux.c: - remove unused var - Original commit message from CVS: - remove unused var - -2006-02-07 18:01:17 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst/qtdemux/qtdemux.c: use the correct variable to check if we can calculate the last chunk. Looks like an obvious b... - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (qtdemux_parse_trak): - use the correct variable to check if we can calculate - the last chunk. Looks like an obvious bug, and makes - the dump of offsets comparable to other tools - -2006-02-07 17:55:33 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * docs/plugins/gst-plugins-bad-plugins-decl.txt: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-gsm.xml: - doc updates - Original commit message from CVS: - doc updates - -2006-02-07 17:54:42 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - gst/qtdemux/qtdemux.c: clean up some debugging, using _OBJECT, moving recurring messages to LOG level - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (qtdemux_parse_trak): - clean up some debugging, using _OBJECT, moving recurring - messages to LOG level - -2006-02-06 20:51:49 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * configure.ac: - * ext/neon/gstneonhttpsrc.c: - Now it uses libneon 0.25.5 that supports shoutcast. - Original commit message from CVS: - Now it uses libneon 0.25.5 that supports shoutcast. - -2006-02-06 18:21:53 +0000 Edward Hervey <bilboed@bilboed.com> - - ext/bz2/gstbz2enc.c: Accepd "ANY" caps. Use "x-bzip" instead of "x-bz2". - Original commit message from CVS: - Reviewed by: Edward Hervey <edward@fluendo.com> - * ext/bz2/gstbz2enc.c: Accepd "ANY" caps. Use "x-bzip" instead of - "x-bz2". - * ext/bz2/gstbz2dec.c: Use "x-bzip" instead of "x-bz2". Initial - caps are "ANY". - (gst_bz2dec_chain): Configure the source pad if we can figure out - the mime type of the decompressed data. - (gst_bz2dec_get,set_property): - (gst_bz2dec_class_init: New property "first_buffer_size". - -2006-02-06 15:41:25 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.*: Some QT demux loving. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_src_query), - (gst_qtdemux_handle_src_event), (gst_qtdemux_loop_header), - (qtdemux_inflate), (qtdemux_parse), (qtdemux_parse_trak), - (qtdemux_parse_udta), (qtdemux_tag_add_str), (qtdemux_tag_add_num), - (qtdemux_tag_add_gnre), (gst_qtdemux_handle_esds), - (qtdemux_video_caps), (qtdemux_audio_caps): - * gst/qtdemux/qtdemux.h: - Some QT demux loving. - Handle seeking in a less broken way. - Fix AMR caps to match the AMR decoder. - Set first timestamp on AMR samples to 0 for now. - Remove some \n in DEBUG strings. - Use _scale_int for maximum precision. - -2006-02-06 12:56:00 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/apetag/: Remove old files, apetag is in gst-plugins-good now. - Original commit message from CVS: - * gst/apetag/Makefile.am: - * gst/apetag/apedemux.c: - * gst/apetag/apedemux.h: - * gst/apetag/apetag.c: - Remove old files, apetag is in gst-plugins-good now. - -2006-02-06 09:54:55 +0000 Andy Wingo <wingo@pobox.com> - - ext/bz2/: No need to init parent_class, the boilerplate does it for you. - Original commit message from CVS: - 2006-02-06 Andy Wingo <wingo@pobox.com> - * ext/bz2/gstbz2enc.c (gst_bz2enc_class_init): - * ext/bz2/gstbz2dec.c (gst_bz2dec_class_init): No need to init - parent_class, the boilerplate does it for you. - -2006-02-06 09:40:09 +0000 Andy Wingo <wingo@pobox.com> - - Hook it up. - Original commit message from CVS: - 2006-02-05 Lutz Mueller <lutz@topfrose.de> - reviewed by: Andy Wingo <wingo@pobox.com> - * configure.ac: - * ext/Makefile.am: Hook it up. - * ext/bz2/gstbz2.c: - * ext/bz2/gstbz2dec.h: - * ext/bz2/gstbz2dec.c: - * ext/bz2/gstbz2enc.h: - * ext/bz2/gstbz2enc.c: New plugin, implements bz2 encoding and - decoding (#303167). - -2006-02-03 10:13:22 +0000 Christian Schaller <uraeus@gnome.org> - - * common: - * gst-plugins-bad.spec.in: - add opengl plugin - Original commit message from CVS: - add opengl plugin - -2006-01-30 15:47:47 +0000 Andy Wingo <wingo@pobox.com> - - * ChangeLog: - * common: - * sys/glsink/Makefile.am: - sys/glsink/Makefile.am (libgstglimagesink_la_LIBADD) - Original commit message from CVS: - 2006-01-30 Andy Wingo <wingo@pobox.com> - * sys/glsink/Makefile.am (libgstglimagesink_la_LIBADD) - (libgstglimagesink_la_CFLAGS): Add PLUGINS_BASE cflags and libs. - -2006-01-29 20:07:49 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/wavpack/gstwavpackdec.c: Add debug category, use boilerplate macros, fix handling of widths of 32 bits. - Original commit message from CVS: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_setcaps), - (gst_wavpack_dec_base_init), (gst_wavpack_dec_dispose), - (gst_wavpack_dec_class_init), (gst_wavpack_dec_sink_event), - (gst_wavpack_dec_init), (gst_wavpack_dec_format_samples), - (gst_wavpack_dec_chain), (gst_wavpack_dec_plugin_init): - Add debug category, use boilerplate macros, fix handling - of widths of 32 bits. - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init), - (gst_wavpack_parse_dispose), (gst_wavpack_parse_class_init), - (gst_wavpack_parse_index_get_last_entry), - (gst_wavpack_parse_index_get_entry_from_sample), - (gst_wavpack_parse_index_append_entry), (gst_wavpack_parse_reset), - (gst_wavpack_parse_src_query), - (gst_wavpack_parse_scan_to_find_sample), - (gst_wavpack_parse_send_newsegment), - (gst_wavpack_parse_handle_seek_event), - (gst_wavpack_parse_src_event), (gst_wavpack_parse_init), - (gst_wavpack_parse_get_upstream_length), - (gst_wavpack_parse_pull_buffer), - (gst_wavpack_parse_create_src_pad), (gst_wavpack_parse_loop), - (gst_wavpack_parse_change_state), - (gst_wavepack_parse_sink_activate), - (gst_wavepack_parse_sink_activate_pull), - (gst_wavpack_parse_plugin_init): - * ext/wavpack/gstwavpackparse.h: - Rewrite a bit, mostly to fix flow logic and to make seeking work. - Fix buffer/event refcounting. Add some debug statements. Add - width of 32 to source pad template caps. Use boilerplate macros. - -2006-01-28 12:45:54 +0000 Edward Hervey <bilboed@bilboed.com> - - sys/glsink/Makefile.am: glimagesink.h is dead, long live glimagesink.h - Original commit message from CVS: - * sys/glsink/Makefile.am: - glimagesink.h is dead, long live glimagesink.h - -2006-01-28 04:39:18 +0000 David Schleef <ds@schleef.org> - - revival of glimagesink. Kind of works. - Original commit message from CVS: - * configure.ac: - * sys/Makefile.am: - * sys/glsink/Makefile.am: - * sys/glsink/glimagesink.c: - * sys/glsink/glimagesink.h: - revival of glimagesink. Kind of works. - -2006-01-27 12:47:12 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/faad/gstfaad.c: Handle 'framed' field in caps; Port syncing for raw streams from 0.8 branch (for AAC+ radio strea... - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_setcaps), - (gst_faad_chanpos_to_gst), (gst_faad_sync), (gst_faad_chain): - Handle 'framed' field in caps; Port syncing for raw streams - from 0.8 branch (for AAC+ radio streams) (#328722). - -2006-01-27 01:31:12 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/sdl/sdlvideosink.*: Fix output stride copying, so that it displays correctly on framebuffer devices that don't ma... - Original commit message from CVS: - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_supported), - (gst_sdlvideosink_xoverlay_set_xwindow_id), - (gst_sdlvideosink_deinitsdl), (gst_sdlv_process_events), - (gst_sdlvideosink_event_thread), (gst_sdlvideosink_initsdl), - (gst_sdlvideosink_destroy), (gst_sdlvideosink_create), - (gst_sdlvideosink_setcaps), (gst_sdlvideosink_show_frame), - (gst_sdlvideosink_change_state), - (gst_sdlvideosink_navigation_send_event): - * ext/sdl/sdlvideosink.h: - Fix output stride copying, so that it displays correctly on - framebuffer devices that don't match our implict GStreamer stride - arrangement. - Fix locking things. Offer XOverlay only when SDL is running against - X. Make non-scaled (and ugly) embedding work via X Overlay. It can't - actually match the embedded window size because there's no way to - figure out what size that should be from the XOverlay interface. - See comment in sdlvideosink.c - -2006-01-26 16:23:42 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Fix wrong memcpy source pointer. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak): - Fix wrong memcpy source pointer. - -2006-01-25 14:44:05 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * ext/libmms/gstmms.c: - * ext/neon/gstneonhttpsrc.c: - Just chain up finalize calls (calling parent_class->finalize). - Original commit message from CVS: - Just chain up finalize calls (calling parent_class->finalize). - -2006-01-25 14:20:04 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * ext/libmms/gstmms.c: - Finalize method has been created and others small changes. - Original commit message from CVS: - Finalize method has been created and others small changes. - -2006-01-24 21:33:25 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/musepack/: Fix seeking in musepack files (it's still incredibly slow, but I don't think that is our plugin's faul... - Original commit message from CVS: - * ext/musepack/gstmusepackdec.c: (gst_musepackdec_base_init), - (gst_musepackdec_class_init), (gst_musepackdec_init), - (gst_musepackdec_send_newsegment), - (gst_musepackdec_handle_seek_event), (gst_musepackdec_src_event), - (gst_musepackdec_src_query), (gst_musepackdec_src_convert), - (gst_musepack_stream_init), (gst_musepackdec_sink_activate_pull), - (gst_musepackdec_loop), (gst_musepackdec_change_state): - * ext/musepack/gstmusepackdec.h: - * ext/musepack/gstmusepackreader.c: (gst_musepack_reader_peek), - (gst_musepack_reader_seek), (gst_musepack_reader_tell), - (gst_musepack_reader_get_size): - * ext/musepack/gstmusepackreader.h: - Fix seeking in musepack files (it's still incredibly slow, but I - don't think that is our plugin's fault). Clean up code and get - rid of old cruft. Post tags with all kind of neat information like - replay gain and such on the bus, if it is available. Add a - 'musepackdec' debug category. - -2006-01-24 11:58:53 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: More coherent framerate setting on caps. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (gst_qtdemux_add_stream), (qtdemux_parse_trak): - More coherent framerate setting on caps. - If sample_size is available, use that for the samples' duration in - the index. This enables single frame streams to work (and I imagine - fixes some other cases). - Tested on testsuite, no regression. - -2006-01-23 15:10:55 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: Added codec recognition for: _ VP31 : video/x-vp3 _ AVDJ : image/jpeg _ dvcp, dvc : video/x-d... - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), - (qtdemux_video_caps), (qtdemux_audio_caps): - Added codec recognition for: - _ VP31 : video/x-vp3 - _ AVDJ : image/jpeg - _ dvcp, dvc : video/x-dv, systemstream=(boolean)false - _ 0x6d730017 : audio/x-adpcm, layout=(string)quicktime - -2006-01-21 18:35:29 +0000 David Schleef <ds@schleef.org> - - Update from swfdec. - Original commit message from CVS: - * configure.ac: - * ext/swfdec/gstswfdec.c: Update from swfdec. - -2006-01-21 11:43:53 +0000 Fabrizio <fabrizio.ge@tiscali.it> - - gst/qtdemux/qtdemux.c: 'twos' and 'sowt' fourcc can be 16bit or 8bit audio. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak), - (qtdemux_audio_caps): - 'twos' and 'sowt' fourcc can be 16bit or 8bit audio. - Fix 8bit case (#327133, based on patch by: Fabrizio - Gennari <fabrizio dot ge at tiscali dot it>). - Also, "G_LITTLE_ENDIAN" and "G_BIG_ENDIAN" are not - valid literals for endianness in caps strings, - only "LITTLE_ENDIAN" and "BIG_ENDIAN" are valid. - -2006-01-20 17:04:38 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * common: - * ext/ivorbis/vorbisfile.c: - * ext/neon/gstneonhttpsrc.c: - Fixed state transictions PLAYING->NULL->PLAYING. - Original commit message from CVS: - Fixed state transictions PLAYING->NULL->PLAYING. - -2006-01-19 16:49:29 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * ext/ivorbis/vorbisfile.c: - Some minor improvements on log messages. - Original commit message from CVS: - Some minor improvements on log messages. - -2006-01-18 18:54:02 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * gst/qtdemux/qtdemux.c: - Ronald's patch applied. see bug #326318. - Original commit message from CVS: - Ronald's patch applied. see bug #326318. - -2006-01-17 16:45:43 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.*: Fix seeking for quicktime files. Could still use some more love and sophistication. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), - (gst_qtdemux_send_event), (gst_qtdemux_handle_src_event), - (gst_qtdemux_change_state), (gst_qtdemux_loop_header): - * gst/qtdemux/qtdemux.h: - Fix seeking for quicktime files. Could still use some more - love and sophistication. - -2006-01-17 13:14:08 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - fixing versioning - Original commit message from CVS: - fixing versioning - -2006-01-16 12:30:41 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * ext/libmms/gstmms.c: - * ext/neon/gstneonhttpsrc.c: - * ext/sdl/sdlaudiosink.c: - Removed gst_base_src_set_live from mms and neon, and now calling parent_class->dispose in dispose on sdlaudio. - Original commit message from CVS: - Removed gst_base_src_set_live from mms and neon, and now calling parent_class->dispose in dispose on sdlaudio. - -2006-01-11 20:59:39 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * ChangeLog: - * ext/sdl/sdlvideosink.c: - Now implementing navigation interface and using GST_BOILER_PLATE_FULL. - Original commit message from CVS: - Now implementing navigation interface and using GST_BOILER_PLATE_FULL. + * meson.build: + * sys/ipcpipeline/gstipcpipelinecomm.c: + * sys/mediafoundation/gstmfvideoencoder.cpp: + * tests/examples/nvcodec/nvcodec.c: + meson: Do hard build error for some MSVC warnings + Handle various MSVC warnings as errors for development version. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1006> -2006-01-11 15:34:52 +0000 Christian Schaller <uraeus@gnome.org> +2022-02-14 16:18:54 +0300 Dmitry Osipenko <dmitry.osipenko@collabora.com> - * ChangeLog: - * sys/Makefile.am: - * sys/sunaudio/Makefile.am: - * sys/sunaudio/gstsunaudio.c: - * sys/sunaudio/gstsunaudiosrc.c: - * sys/sunaudio/gstsunaudiosrc.h: - * sys/sunaudio/gstsunelement.c: - * sys/sunaudio/gstsunelement.h: - * sys/sunaudio/gstsunmixer.c: - * sys/sunaudio/gstsunmixer.h: - remove old (broken) sunaudio plugin from bad as there is a new working one in -good - Original commit message from CVS: - remove old (broken) sunaudio plugin from bad as there is a new working one - in -good + * sys/v4l2codecs/gstv4l2codech264dec.c: + v4l2codecs: h264: Correct scaling matrix ABI check + Scaling matrix V4L UAPI control not presents on NVIDIA Tegra, the default + matrix should be used in this case. Mark scaling matrix presence optional. + Fixes: 47bfa71530c ("v4l2codecs: h264: Improve ABI check ") + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1726> -2006-01-11 14:41:24 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-01-21 15:32:09 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - * ChangeLog: - * ext/sdl/sdlaudiosink.c: - Replaced wrong style code by GST_BOILERPLATE. - Original commit message from CVS: - Replaced wrong style code by GST_BOILERPLATE. - -2006-01-11 11:04:03 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: Add support for Indeo3 video in Quicktime files. - Original commit message from CVS: - reviewed by: Edward Hervey <edward@fluendo.com> - * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): - Add support for Indeo3 video in Quicktime files. - Closes #326524 + * sys/msdk/gstmsdkdec.c: + * sys/msdk/gstmsdkdec.h: + msdkdec: Enable SFC scaling for AVC and HEVC + Decoder SFC only supports down-scaling at most to 1/8. + For example, given a 4K bistream, SFC can scale it to 1080p via: + "msdkh265dec ! video/x-raw,width=1920,height=1080 ! glimagesink" + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1444> -2006-01-09 18:20:56 +0000 Edgard Lima <edgard.lima@indt.org.br> +2021-12-15 11:49:40 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - * ChangeLog: - * common: - * configure.ac: - * ext/sdl/Makefile.am: - * ext/sdl/gstsdl.c: - * ext/sdl/sdlaudiosink.c: - * ext/sdl/sdlaudiosink.h: - * ext/sdl/sdlvideosink.c: - Created new element, sdlaudiosink. - Original commit message from CVS: - Created new element, sdlaudiosink. + * sys/msdk/gstmsdkdec.c: + * sys/msdk/gstmsdkh264dec.c: + * sys/msdk/gstmsdkh265dec.c: + msdkdec: Enable SFC csc for AVC and HEVC + Decoder SFC will be triggered when default output format is not accept at + downstream. One use case below can work without using msdkvpp: + "! msdkh265dec ! "video/x-raw,format=BGRA" ! glimagesink", + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1444> -2006-01-05 23:17:44 +0000 Sébastien Moutte <sebastien@moutte.net> +2021-11-17 17:05:09 +0800 Mengkejiergeli Ba <mengkejiergeli.ba@intel.com> - * ChangeLog: - * sys/directdraw/gstdirectdrawplugin.c: - * sys/directdraw/gstdirectdrawsink.c: - * sys/directdraw/gstdirectdrawsink.h: - * sys/directsound/gstdirectsoundplugin.c: - * sys/directsound/gstdirectsoundsink.c: - * sys/directsound/gstdirectsoundsink.h: - * win32/common/config.h: - * win32/vs6/gst_plugins_bad.dsw: - * win32/vs6/libgstdirectdraw.dsp: - * win32/vs6/libgstdirectsound.dsp: - added sys/directdraw added sys/directsound added win32/vs6/gst_plugins_bad.dsw added win32/vs6/libgstdirectsound.dsp ... - Original commit message from CVS: - 2006-01-05 Sebastien Moutte <sebastien@moutte.net> - * added sys/directdraw - * added sys/directsound - * added win32/vs6/gst_plugins_bad.dsw - * added win32/vs6/libgstdirectsound.dsp - * added win32/vs6/libgstdirectdraw.dsp - * added win32/common/config.h - -2006-01-05 17:03:15 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - gst/games/gstpuzzle.c: call oil_init() when using liboil - Original commit message from CVS: - * gst/games/gstpuzzle.c: (plugin_init): - call oil_init() when using liboil + * sys/msdk/gstmsdkdec.c: + * sys/msdk/gstmsdkdec.h: + msdkdec: Add SFC codes + SFC refers to Scaler Format Converter, more details here: + https://01.org/sites/default/files/documentation/intel-gfx-prm-osrc-kbl-vol15-sfc.pdf + By attaching mfxExtDecVideoProcessing buffer to mfxVideoParam, decoder + can do SFC for csc and scaling. + MSDK will check if surface bitdepth equals to input when no SFC is + triggered, which means in the case of SFC, there is no need to update + surface bitdepth via gst_msdk_update_mfx_frame_info_from_mfx_video_param. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1444> -2006-01-04 19:39:10 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-16 02:23:58 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - Some improvements in cancellation and debug messages. - Original commit message from CVS: - Some improvements in cancellation and debug messages. + * sys/d3d11/gstd3d11converter.cpp: + d3d11converter: Fix for missing GRAY conversion + Add missing Y410 -> GRAY and GRAY -> semi-planar conversion + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1724> -2006-01-04 13:26:35 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-16 02:11:53 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * common: - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - Removed not need thread and changed to push out blocksize bytes. - Original commit message from CVS: - Removed not need thread and changed to push out blocksize bytes. - -=== release 0.10.2 === - -2006-01-03 17:33:16 +0000 Michael Smith <msmith@xiph.org> - - gst/audioresample/resample.h: As before, but for o_buf - Original commit message from CVS: - * gst/audioresample/resample.h: - As before, but for o_buf - -2006-01-03 17:27:13 +0000 Michael Smith <msmith@xiph.org> - - gst/audioresample/resample.h: Declare struct _ResampleState.buffer as unsigned char *, not void *, since we do arithm... - Original commit message from CVS: - * gst/audioresample/resample.h: - Declare struct _ResampleState.buffer as unsigned char *, not void *, - since we do arithmetic on it. - -2006-01-02 15:05:09 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - add neon plugin to spec file - Original commit message from CVS: - add neon plugin to spec file - -2005-12-30 15:41:21 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * ext/smoothwave/.gitignore: - * ext/smoothwave/Makefile.am: - * ext/smoothwave/README: - * ext/smoothwave/demo-osssrc.c: - * ext/smoothwave/gstsmoothwave.c: - * ext/smoothwave/gstsmoothwave.h: - move smoothwave to gst - Original commit message from CVS: - move smoothwave to gst + * sys/d3d11/gstd3d11converter.cpp: + d3d11converter: Don't use FIXME_OBJECT for non-GstObject + ... and print ERROR messages for unexpected input/output formats + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1724> -2005-12-28 21:07:17 +0000 Edgard Lima <edgard.lima@indt.org.br> +2021-11-10 15:18:24 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * configure.ac: - * ext/Makefile.am: - * ext/neon/Makefile.am: - * ext/neon/gstneonhttpsrc.c: - * ext/neon/gstneonhttpsrc.h: - Created new element neonhttpsrc. - Original commit message from CVS: - Created new element neonhttpsrc. - -2005-12-19 15:19:44 +0000 Edward Hervey <bilboed@bilboed.com> - - ext/swfdec/gstswfdec.c: Add debugging category and return GstFlowReturn in the right places - Original commit message from CVS: - * ext/swfdec/gstswfdec.c: (gst_swfdec_class_init), - (gst_swfdec_chain), (gst_swfdec_render): - Add debugging category and return GstFlowReturn in the right places - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_link): - Get something from the peer pad once we've checked if there is a peer pad. - * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state), - (qtdemux_tree_get_child_by_type), (qtdemux_parse_trak), - (qtdemux_video_caps): - Couple of fixes + * gst-libs/gst/va/gstvadisplay.c: + * gst-libs/gst/va/gstvadisplay.h: + * sys/va/gstvacaps.c: + * sys/va/gstvadecoder.c: + * sys/va/gstvadisplay_priv.c: + * sys/va/gstvafilter.c: + * sys/va/gstvasurfacecopy.c: + * sys/va/vasurfaceimage.c: + va: Delete the display lock/unlock when we call VA-API. + According to the VA-API's description, they are MT-safe, we do not + need to care about that in our middleware layer. The lock/unlock + operations have overhead and make the performance lower. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1333> -2005-12-19 14:58:47 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-08 15:22:39 +0100 Jan Alexander Steffens (heftig) <heftig@archlinux.org> - * ChangeLog: - * ext/divx/Makefile.am: - just a small fix. I have to pay more attention when commiting ;-) - Original commit message from CVS: - just a small fix. I have to pay more attention when commiting ;-) + * ext/openaptx/gstopenaptxdec.h: + * ext/openaptx/gstopenaptxenc.h: + * ext/openaptx/meson.build: + openaptx: Support libfreeaptx + libfreeaptx1 is a fork of libopenapt 0.2.0, used by pipewire. + 1: https://github.com/iamthehorker/libfreeaptx + Fixes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1642 + Closes: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1589 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1667> -2005-12-19 14:40:22 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-15 02:26:46 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * configure.ac: - * ext/Makefile.am: - * ext/divx/Makefile.am: - * ext/divx/gstdivxdec.c: - * ext/divx/gstdivxdec.h: - * ext/divx/gstdivxenc.c: - * ext/divx/gstdivxenc.h: - divxdec and divxenc ported to 0.10 - Original commit message from CVS: - divxdec and divxenc ported to 0.10 - -2005-12-18 21:06:47 +0000 Julien Moutte <julien@moutte.net> - - Some more refactoring, handle exotic DirectFB row stride. - Original commit message from CVS: - 2005-12-18 Julien MOUTTE <julien@moutte.net> - * docs/plugins/gst-plugins-bad-plugins-decl.txt: - * ext/directfb/dfbvideosink.c: - (gst_dfbvideosink_surface_create), - (gst_dfbvideosink_event_thread), - (gst_dfbvideosink_enum_devices), - (gst_dfbvideosink_setup), (gst_dfbvideosink_cleanup), - (gst_dfbvideosink_can_blit_from_format), - (gst_dfbvideosink_getcaps), (gst_dfbvideosink_setcaps), - (gst_dfbvideosink_show_frame), (gst_dfbvideosink_buffer_alloc), - (gst_dfbsurface_finalize), - (gst_dfbvideosink_navigation_send_event), - (gst_dfbvideosink_update_colorbalance), - (gst_dfbvideosink_set_property), (gst_dfbvideosink_init): Some - more refactoring, handle exotic DirectFB row stride. - -2005-12-18 10:58:44 +0000 Julien Moutte <julien@moutte.net> - - docs/plugins/: Updates. - Original commit message from CVS: - 2005-12-18 Julien MOUTTE <julien@moutte.net> - * docs/plugins/gst-plugins-bad-plugins-decl.txt: - * docs/plugins/gst-plugins-bad-plugins-undocumented.txt: - Updates. - * ext/directfb/dfbvideosink.c: - (gst_dfbvideosink_surface_create), - (gst_dfbvideosink_event_thread), - (gst_dfbvideosink_enum_devices), - (gst_dfbvideosink_setup), (gst_dfbvideosink_cleanup), - (gst_dfbvideosink_can_blit_from_format), - (gst_dfbvideosink_getcaps), (gst_dfbvideosink_setcaps), - (gst_dfbvideosink_show_frame), (gst_dfbvideosink_buffer_alloc), - (gst_dfbsurface_finalize), - (gst_dfbvideosink_navigation_send_event), - (gst_dfbvideosink_update_colorbalance), - (gst_dfbvideosink_set_property), - (gst_dfbvideosink_get_property), - (gst_dfbvideosink_finalize), (gst_dfbvideosink_init), - (gst_dfbvideosink_class_init): - * ext/directfb/dfbvideosink.h: Implement pixel-aspect-ratio. - This should work both for hardware accelerated scaling and - reverse caps negotiation with a scaling element. - -2005-12-17 17:48:38 +0000 Julien Moutte <julien@moutte.net> - - docs/plugins/: Updates. - Original commit message from CVS: - 2005-12-17 Julien MOUTTE <julien@moutte.net> - * docs/plugins/gst-plugins-bad-plugins-decl.txt: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-undocumented.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/plugins/inspect/plugin-qtdemux.xml: - * docs/plugins/inspect/plugin-sdlvideosink.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-tta.xml: Updates. - * ext/directfb/dfbvideosink.c: - (gst_dfbvideosink_surface_create), - (gst_dfbvideosink_event_thread), (gst_dfbvideosink_enum_vmodes), - (gst_dfbvideosink_enum_devices), (gst_dfbvideosink_setup), - (gst_dfbvideosink_cleanup), - (gst_dfbvideosink_can_blit_from_format), - (gst_dfbvideosink_get_best_vmode), (gst_dfbvideosink_getcaps), - (gst_dfbvideosink_setcaps), (gst_dfbvideosink_show_frame), - (gst_dfbvideosink_buffer_alloc), (gst_dfbsurface_finalize), - (gst_dfbvideosink_interface_supported), - (gst_dfbvideosink_navigation_send_event), - (gst_dfbvideosink_update_colorbalance), - (gst_dfbvideosink_colorbalance_list_channels), - (gst_dfbvideosink_colorbalance_set_value), - (gst_dfbvideosink_colorbalance_get_value), - (gst_dfbvideosink_colorbalance_init), - (gst_dfbvideosink_set_property), - (gst_dfbvideosink_get_property), - (gst_dfbvideosink_init), (gst_dfbvideosink_class_init): - * ext/directfb/dfbvideosink.h: Implement vertical sync and - color balance interface. - -2005-12-16 21:55:18 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - don't use doc comments for non-docs change some char* into char - Original commit message from CVS: - * ext/artsd/gstartsdsink.c: (gst_artsdsink_open_audio): - * gst/festival/gstfestival.c: (socket_receive_file_to_buff): - * gst/vbidec/vbidata.c: - * gst/vbidec/vbidata.h: - * gst/vbidec/vbiscreen.c: - * sys/dxr3/ac3_padder.c: - don't use doc comments for non-docs - change some char* into char - -2005-12-16 14:47:59 +0000 Julien Moutte <julien@moutte.net> - - ext/directfb/dfbvideosink.c: Always prefer the primary layer. - Original commit message from CVS: - 2005-12-16 Julien MOUTTE <julien@moutte.net> - * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_enum_layers), - (gst_dfbvideosink_init): Always prefer the primary layer. - -2005-12-16 12:25:38 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/wavpack/gstwavpackdec.c: Oops, remove trailing comma from caps string. - Original commit message from CVS: - * ext/wavpack/gstwavpackdec.c: - Oops, remove trailing comma from caps string. - -2005-12-16 09:59:21 +0000 gcocatre@gmail.com <gcocatre@gmail.com> - - ext/wavpack/: Wavpack supports samplerates from 6-192kHz, fix pad template remove buffer-frames from caps, they are g... - Original commit message from CVS: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_link): - * ext/wavpack/gstwavpackparse.c: - Wavpack supports samplerates from 6-192kHz, fix pad template - caps (fixes #322973; patch by: gcocatre@gmail.com). Also - remove buffer-frames from caps, they are gone in 0.10. + * sys/d3d11/gstd3d11converter.cpp: + d3d11converter: Fix RGB to GRAY conversion + Fix typo in shader code + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1697> -2005-12-15 14:39:00 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-14 12:57:44 +0100 Stéphane Cerveau <scerveau@collabora.com> - * ChangeLog: - * ext/xvid/Makefile.am: - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxvidenc.c: - Fixed some mem-leaks in xvid. - Original commit message from CVS: - Fixed some mem-leaks in xvid. - -2005-12-15 10:30:14 +0000 Michael Smith <msmith@xiph.org> - - gst/audioresample/gstaudioresample.c: Don't leak all input buffers to audioresample. - Original commit message from CVS: - * gst/audioresample/gstaudioresample.c: - Don't leak all input buffers to audioresample. + * gst/mpegtsdemux/tsdemux.c: + tsdemux: unlock mutex on -1 start_offfset + Closing #1013 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1694> -2005-12-15 08:54:26 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2022-02-13 22:39:46 +0900 Seungha Yang <seungha@centricular.com> - * ext/directfb/dfbvideosink.c: - doesn't use liboil - Original commit message from CVS: - doesn't use liboil + * sys/d3d11/gstd3d11download.cpp: + d3d11download: Fix decide_allocation + Caps should be parsed in any cases. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1691> -2005-12-14 22:41:47 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-13 10:49:31 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * configure.ac: - * ext/Makefile.am: - * ext/xvid/gstxvid.c: - * ext/xvid/gstxvid.h: - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxviddec.h: - * ext/xvid/gstxvidenc.c: - * ext/xvid/gstxvidenc.h: - xviddec and xvideenc ported to 0.10 - Original commit message from CVS: - xviddec and xvideenc ported to 0.10 + * sys/va/meson.build: + meson: va: Add va option check into plugin's build. + Because the liblibgstva is built unconditionally, we now move the + va option check into va plugin's build. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1685> -2005-12-14 20:54:06 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-13 10:39:37 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * configure.ac: - * ext/Makefile.am: - * ext/dts/Makefile.am: - * ext/dts/gstdtsdec.c: - * ext/dts/gstdtsdec.h: - dtsdec ported to 0.10 - Original commit message from CVS: - dtsdec ported to 0.10 - -2005-12-12 10:40:42 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/: GstObjects must be unref'ed with gst_object_unref() instead of g_object_unref(), otherwise things break for GLi... - Original commit message from CVS: - * ext/ivorbis/vorbisfile.c: (gst_ivorbisfile_loop): - * ext/libmms/gstmms.c: (gst_mms_src_query), (gst_mms_create): - * ext/musepack/gstmusepackdec.c: (gst_musepackdec_src_query), - (gst_musepackdec_loop): - * ext/swfdec/gstswfdec.c: (gst_swfdec_video_link), - (gst_swfdec_src_query): - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_src_query): - GstObjects must be unref'ed with gst_object_unref() instead of - g_object_unref(), otherwise things break for GLib-2.6 users. - -2005-12-12 09:29:21 +0000 David Schleef <ds@schleef.org> - - ext/swfdec/gstswfdec.c: Add a subclass of GstBuffer that wraps SwfdecBuffers. Fix a massive memleak because the vide... - Original commit message from CVS: - * ext/swfdec/gstswfdec.c: (gst_swfdecbuffer_get_type), - (gst_swfdecbuffer_class_init), (gst_swfdecbuffer_finalize), - (gst_swfdec_buffer_from_swf), (gst_swfdec_render): Add a subclass - of GstBuffer that wraps SwfdecBuffers. Fix a massive memleak - because the video buffers previously never got freed. + * gst-libs/gst/va/meson.build: + meson: va: Remove va option check from gst-libs + Building libgstva-1.0 unconditionally for the va implementation can be + used by non-va plugins such as MSDK even when va plugin is disabled + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1685> -2005-12-11 23:54:56 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-12 10:05:11 +0000 Philippe Normand <philn@igalia.com> - * ChangeLog: - * ext/libmms/gstmms.c: - Just removed a weird printf ;-) - Original commit message from CVS: - Just removed a weird printf ;-) + * gst-libs/gst/webrtc/dtlstransport.c: + dtlstransport: Notify ICE transport property changes + The application might track the underlying ICE transport, so not notifying + changes might lead to use-after-free issues. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1688> -2005-12-11 23:09:21 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-12 14:51:51 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * configure.ac: - * ext/libmms/gstmms.c: - * ext/libmms/gstmms.h: - Added suport to mmsh. There's still a sucks msg "ERROR: Pipeline cant PREROOL..." to be fixed. - Original commit message from CVS: - Added suport to mmsh. There's still a sucks msg "ERROR: Pipeline cant PREROOL..." to be fixed. - -2005-12-09 15:30:21 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/faad/gstfaad.c: Assume that an unknown channel mapping with 2 channels is stereo and play it that way instead of ... - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_chanpos_to_gst), - (gst_faad_update_caps): - Assume that an unknown channel mapping with 2 channels - is stereo and play it that way instead of erroring. - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (gst_qtdemux_add_stream), (qtdemux_parse_trak): - Handle e.g. jpeg streams with 0 duration frames as having 0 framerate. - Debug fixes. Some 64 bit variable fixes + * sys/va/gstvavpp.c: + vavpp: Fix the caps leak in the transform_caps() function. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1689> -2005-12-09 04:15:02 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-12 00:51:56 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * configure.ac: - * ext/Makefile.am: - * ext/swfdec/Makefile.am: - * ext/swfdec/gstswfdec.c: - * ext/swfdec/gstswfdec.h: - swfdec Ported to 0.10. - Original commit message from CVS: - swfdec Ported to 0.10. - -2005-12-07 11:46:15 +0000 Edward Hervey <bilboed@bilboed.com> - - gst/qtdemux/qtdemux.c: Memleak fixes. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (gst_qtdemux_add_stream): - Memleak fixes. - Send out EOS for valid reasons (couldn't pull_range() from upstream - for example). + * gst-libs/gst/d3d11/meson.build: + meson: d3d11: Remove d3d11 option check from gst-libs + Build gstd3d11-1.0 unconditionally for d3d11 implementation can be used + by non-d3d11 plugins even when d3d11 plugin is disabled + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1684> -2005-12-06 19:55:58 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2022-02-10 22:31:06 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * docs/plugins/gst-plugins-bad-plugins-undocumented.txt: - * ext/audiofile/gstafparse.h: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsink.h: - * ext/audiofile/gstafsrc.c: - * ext/audiofile/gstafsrc.h: - * ext/cdaudio/gstcdaudio.c: - * ext/divx/gstdivxenc.c: - * ext/dts/gstdtsdec.h: - * ext/faac/gstfaac.h: - * ext/ivorbis/vorbisenc.h: - * ext/ivorbis/vorbisfile.c: - * ext/musepack/gstmusepackdec.h: - * ext/nas/nassink.c: - * ext/snapshot/gstsnapshot.c: - * ext/sndfile/gstsf.h: - * ext/tarkin/gsttarkindec.h: - * ext/tarkin/gsttarkinenc.h: - * ext/xine/gstxine.h: - * ext/xine/xinecaps.c: - * ext/xvid/gstxvid.h: - * gst-libs/gst/play/play.h: - * gst/apetag/apedemux.h: - * gst/cdxaparse/gstcdxaparse.h: - * gst/cdxaparse/gstcdxastrip.h: - * gst/cdxaparse/gstvcdparse.h: - * gst/colorspace/yuv2rgb.c: - * gst/colorspace/yuv2rgb.h: - * gst/equalizer/gstiirequalizer.c: - * gst/festival/gstfestival.h: - * gst/games/gstpuzzle.c: - * gst/games/gstvideoimage.c: - * gst/games/gstvideoimage.h: - * gst/modplug/gstmodplug.h: - * gst/modplug/libmodplug/it_defs.h: - * gst/modplug/libmodplug/modplug.h: - * gst/modplug/libmodplug/sndfile.h: - * gst/modplug/libmodplug/stdafx.h: - * gst/mpeg1sys/buffer.c: - * gst/mpeg1sys/gstmpeg1systemencode.h: - * gst/mpeg1sys/main.h: - * gst/mpeg1sys/systems.c: - * gst/mpeg1videoparse/gstmp1videoparse.h: - * gst/mpeg2sub/gstmpeg2subt.h: - * gst/mpegaudioparse/gstmpegaudioparse.c: - * gst/mpegaudioparse/gstmpegaudioparse.h: - * gst/multifilesink/gstmultifilesink.h: - * gst/overlay/gstoverlay.h: - * gst/qtdemux/qtdemux.c: - * gst/qtdemux/qtdemux.h: - * gst/rtjpeg/RTjpeg.c: - * gst/rtjpeg/RTjpeg.h: - * gst/tta/crc32.h: - * gst/tta/filters.h: - * gst/tta/ttadec.h: - * gst/videodrop/gstvideodrop.h: - * sys/cdrom/gstcdplayer.h: - * sys/cdrom/gstcdplayer_ioctl.c: - * sys/cdrom/gstcdplayer_ioctl.h: - * sys/cdrom/gstcdplayer_ioctl_bsd.h: - * sys/cdrom/gstcdplayer_ioctl_irix.h: - * sys/cdrom/gstcdplayer_ioctl_solaris.h: - * sys/dxr3/dxr3audiosink.c: - * sys/dxr3/dxr3audiosink.h: - * sys/dxr3/dxr3spusink.c: - * sys/dxr3/dxr3spusink.h: - * sys/dxr3/dxr3videosink.c: - * sys/dxr3/dxr3videosink.h: - * sys/qcam/dark.c: - * sys/qcam/gstqcamsrc.c: - * sys/v4l2/gstv4l2colorbalance.h: - * sys/v4l2/gstv4l2element.h: - * sys/v4l2/gstv4l2src.h: - * sys/v4l2/gstv4l2tuner.h: - * sys/v4l2/gstv4l2xoverlay.h: - * sys/v4l2/v4l2_calls.c: - * sys/v4l2/v4l2_calls.h: - * sys/v4l2/v4l2src_calls.c: - * sys/v4l2/v4l2src_calls.h: - * sys/vcd/vcdsrc.h: - expand tabs - Original commit message from CVS: - expand tabs - -2005-12-06 19:44:48 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * ext/ladspa/gstsignalprocessor.h: - * ext/ladspa/search.c: - * ext/ladspa/utils.h: - expand tabs - Original commit message from CVS: - expand tabs - -2005-12-06 19:42:02 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/audioresample/buffer.h: - * gst/audioresample/functable.h: - * gst/audioresample/gstaudioresample.c: - * gst/audioresample/resample.h: - * tests/check/elements/audioresample.c: - expand tabs - Original commit message from CVS: - expand tabs - -2005-12-05 18:11:32 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * configure.ac: - back to HEAD - Original commit message from CVS: - back to HEAD + * gst-libs/gst/d3d11/gstd3d11_fwd.h: + * gst-libs/gst/d3d11/gstd3d11_private.h: + * gst-libs/gst/d3d11/gstd3d11bufferpool.cpp: + * gst-libs/gst/d3d11/gstd3d11config.h.meson: + * gst-libs/gst/d3d11/gstd3d11device.cpp: + * gst-libs/gst/d3d11/gstd3d11format.cpp: + * gst-libs/gst/d3d11/gstd3d11stagingbufferpool.cpp: + * gst-libs/gst/d3d11/meson.build: + * sys/d3d11/gstd3d11convert.cpp: + * sys/d3d11/gstd3d11pluginutils.cpp: + * sys/d3d11/gstd3d11pluginutils.h: + * sys/d3d11/gstd3d11screencapturedevice.h: + * sys/d3d11/gstd3d11videoprocessor.cpp: + * sys/d3d11/gstd3d11videoprocessor.h: + * sys/d3d11/gstd3d11window.cpp: + * sys/d3d11/gstd3d11window_dummy.cpp: + * sys/d3d11/gstd3d11window_win32.cpp: + * sys/d3d11/meson.build: + * sys/d3d11/plugin.cpp: + * sys/mediafoundation/plugin.cpp: + d3d11: Update build-time dependency + Remove all the d3d11 and dxgi header version dependent ifdef + and bump the minimum requirement to d3d11_4.h and dxgi1_6.h. + We are already failing support old Visual Studio (Windows SDK actually) + such as Visual Studio 2015. Note that our MinGW toolchain satisfies + the requirement. + From runtime point of view, this change should be fine since + we are checking OS version with IUnknown::QueryInterface() + everywhere in order to check API availability + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1684> -=== release 0.10.0 === +2021-05-08 17:54:34 +0800 He Junyan <junyan.he@intel.com> -2005-12-05 18:01:48 +0000 Thomas Vander Stichele <thomas@apestaart.org> + * sys/msdk/gstmsdkenc.c: + * sys/msdk/gstmsdkenc.h: + * sys/msdk/gstmsdkh265enc.c: + * sys/msdk/gstmsdkvp9enc.c: + * sys/msdk/msdk.h: + MSDK: Import VA surface as encoder's input. + We make all MSDK encoders declare "memory:VAMemory" feature. Then + the pipeline such as: + gst-launch-1.0 -vf filesrc location=xxx.h264 ! h264parse ! \ + vah264dec ! msdkh265enc ! fakesink + will choose VA memory caps between the VA decoder and MSDK encoder. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1087> + +2021-05-08 17:26:27 +0800 He Junyan <junyan.he@intel.com> + + * sys/msdk/gstmsdk_va.c: + * sys/msdk/gstmsdk_va.h: + * sys/msdk/meson.build: + MSDK: Add helper function to peek VA surface of VA kind gstbuffer. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1087> + +2021-05-08 15:51:11 +0800 He Junyan <junyan.he@intel.com> + + * sys/msdk/gstmsdkenc.c: + MSDK: Handle context query into the encoder's query function. + The MSDK encoder's query function is not set and it just forwards + all query to its base class. We now need to answer the context + query correctly. Other VA plugins need to query the VA display. + By the way, the current query of "gst.msdk.Context" is also missing. + The other MSDK elements must depend on the bin's context message( + sent in context_propagate()) to set their MsdkContext correctly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1087> + +2021-08-17 22:36:59 +0800 He Junyan <junyan.he@intel.com> + + * sys/msdk/gstmsdkvpp.c: + MSDK: Handle context query into the VPP's query function. + The MSDK VPP's query function is not set and it just forwards + all query to its base class. We now need to answer the context + query correctly. Other VA plugins need to query the VA display. + By the way, the current query of "gst.msdk.Context" is also missing. + The other MSDK elements must depend on the bin's context message( + sent in context_propagate()) to set their MsdkContext correctly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1087> + +2021-08-17 22:34:43 +0800 He Junyan <junyan.he@intel.com> + + * sys/msdk/gstmsdkdec.c: + MSDK: Handle context query into the decoder's query function. + The MSDK decoder's query function is not set and it just forwards + all query to its base class. We now need to answer the context + query correctly. Other VA plugins need to query the VA display. + By the way, the current query of "gst.msdk.Context" is also missing. + The other MSDK elements must depend on the bin's context message( + sent in context_propagate()) to set their MsdkContext correctly. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1087> - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-qtdemux.xml: - * docs/plugins/inspect/plugin-sdlvideosink.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-tta.xml: - releasing 0.10.0 - Original commit message from CVS: - releasing 0.10.0 - -2005-12-05 13:04:22 +0000 Andy Wingo <wingo@pobox.com> - - Update for alloc_buffer changes. - Original commit message from CVS: - 2005-12-05 Andy Wingo <wingo@pobox.com> - * ext/faac/gstfaac.c: (gst_faac_sink_event), (gst_faac_chain): - * ext/faad/gstfaad.c: (gst_faad_chain): - * ext/hermes/gsthermescolorspace.c: (gst_hermes_colorspace_chain): - * ext/lcs/gstcolorspace.c: (gst_colorspace_chain): - * ext/xine/xineinput.c: (gst_xine_input_get): - * gst/colorspace/gstcolorspace.c: (gst_colorspace_chain): - * gst/speed/gstspeed.c: (speed_chain): - * gst/videocrop/gstvideocrop.c: (gst_video_crop_chain): Update for - alloc_buffer changes. - -2005-12-05 13:02:58 +0000 Andy Wingo <wingo@pobox.com> - - Update for alloc_buffer changes. - Original commit message from CVS: - 2005-12-05 Andy Wingo <wingo@pobox.com> - * ext/dv/gstdvdec.c: (gst_dvdec_chain): - * ext/flac/gstflacdec.c: (gst_flacdec_write): - * ext/flac/gstflacenc.c: (gst_flacenc_write_callback): - * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): - * ext/gdk_pixbuf/pixbufscale.c: (gst_pixbufscale_chain): - * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_chain): - * ext/jpeg/gstjpegenc.c: (gst_jpegenc_chain): - * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_process): - * ext/libpng/gstpngdec.c: (user_info_callback), (gst_pngdec_task): - * ext/speex/gstspeexdec.c: (speex_dec_chain): - * ext/speex/gstspeexenc.c: (gst_speexenc_chain): - * gst/auparse/gstauparse.c: (gst_auparse_chain): - * gst/flx/gstflxdec.c: (gst_flxdec_chain): - * gst/goom/gstgoom.c: (gst_goom_chain): - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_push_vorbis_codec_priv_data), - (gst_matroska_demux_add_wvpk_header): - * gst/multipart/multipartdemux.c: (gst_multipart_demux_chain): - * gst/multipart/multipartmux.c: (gst_multipart_mux_collected): - * gst/videomixer/videomixer.c: (gst_videomixer_collected): - * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): Update for - alloc_buffer changes. - -2005-12-04 22:46:34 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - update spec file - Original commit message from CVS: - update spec file - -2005-12-02 11:34:50 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/audioresample/: Fix audioresample, seek torture, new segments, reverse negotiation etc.. work fine. - Original commit message from CVS: - * gst/audioresample/buffer.c: (audioresample_buffer_queue_flush): - * gst/audioresample/buffer.h: - * gst/audioresample/gstaudioresample.c: - * gst/audioresample/gstaudioresample.h: - * gst/audioresample/resample.c: (resample_input_flush), - (resample_input_pushthrough), (resample_input_eos), - (resample_get_output_size_for_input), - (resample_get_input_size_for_output), (resample_get_output_size), - (resample_get_output_data): - * gst/audioresample/resample.h: - * gst/audioresample/resample_ref.c: (resample_scale_ref): - Fix audioresample, seek torture, new segments, reverse negotiation - etc.. work fine. - -2005-12-02 09:32:21 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/Makefile.am: Add missing $(WAVPACK_DIR) (#322962). - Original commit message from CVS: - * ext/Makefile.am: - Add missing $(WAVPACK_DIR) (#322962). - -2005-12-01 19:17:34 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * configure.ac: - back to HEAD - Original commit message from CVS: - back to HEAD +2021-08-17 22:33:18 +0800 He Junyan <junyan.he@intel.com> -=== release 0.9.7 === + * sys/msdk/gstmsdkcontextutil.c: + * sys/msdk/gstmsdkcontextutil.h: + MSDK: Add a handle_context_query() helper function. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1087> -2005-12-01 19:13:20 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2021-08-17 21:51:58 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * NEWS: - * RELEASE: - * common: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-undocumented.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-qtdemux.xml: - * docs/plugins/inspect/plugin-sdlvideosink.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-tta.xml: - * docs/random/LICENSE: - * docs/random/PORTED_09: - releasing 0.9.7 - Original commit message from CVS: - releasing 0.9.7 + * sys/msdk/gstmsdkcontextutil.c: + * sys/msdk/gstmsdkcontextutil.h: + * sys/msdk/gstmsdkdec.c: + * sys/msdk/gstmsdkenc.c: + * sys/msdk/gstmsdkvpp.c: + MSDK: Improve the GstContext setting logic. + We now can use the gst va lib's display to create our MSDK context, + and use its helper functions to simplify our code. The improved logic + is like this: + 1. Every MSDK element should use gst_msdk_context_find() to find a MSDK + context from neighbour. If valid, reuse it. + 2. Use gst_msdk_ensure_new_context(). It will first query neighbours + about the GstVaDisplay, if found(e.g. some VA element is connected), + use gst_msdk_context_from_external_display() to create a MSDK context. + 3. Then, creating the MSDK context from scratch. It creates both the + display and MSDK context. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1087> -2005-11-29 02:55:18 +0000 Edgard Lima <edgard.lima@indt.org.br> +2021-05-08 13:49:23 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * PORTED_09: - * common: - * configure.ac: - * ext/Makefile.am: - * ext/libmms/Makefile.am: - * ext/libmms/gstmms.c: - * ext/libmms/gstmms.h: - libmm ported to 0.9. It works fine, but print some error messages. I'll fix them soon. Tested with mmssrc location=m... - Original commit message from CVS: - libmm ported to 0.9. It works fine, but print some error messages. I'll fix them soon. Tested with mmssrc location=mms:// ! filesink. + * sys/msdk/gstmsdkcontext.c: + * sys/msdk/gstmsdkcontext.h: + MSDK: Add new_with_va_display() helper function to create context. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1087> -2005-11-28 21:22:39 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2021-05-08 11:44:57 +0800 He Junyan <junyan.he@intel.com> - * common: - * ext/directfb/dfbvideosink.h: - fix header - Original commit message from CVS: - fix header - -2005-11-28 17:47:27 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * ext/sdl/sdlvideosink.h: - fix include - Original commit message from CVS: - fix include - -2005-11-28 15:43:29 +0000 Edward Hervey <bilboed@bilboed.com> - - ext/faad/gstfaad.c: Handle gracefully the consequence of "Maximum number of scalefactor bands exceeded", which result... - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_srcgetcaps): - Handle gracefully the consequence of "Maximum number of scalefactor - bands exceeded", which results in 0 channels with samplerates of 0. - * gst/qtdemux/qtdemux.c: (gst_qtdemux_change_state): - Do upward transitions, then call parent state_change, then do - downward transitions. - -2005-11-28 15:19:33 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * ext/Makefile.am: - fix makefile - Original commit message from CVS: - fix makefile - -2005-11-28 14:50:44 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - ext/Makefile.am: alphabets, so hard to master. Should fix distcheck. - Original commit message from CVS: - * ext/Makefile.am: - alphabets, so hard to master. Should fix distcheck. - -2005-11-27 14:35:27 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * Makefile.am: - * common: - * gst-plugins-bad.spec.in: - add ACLOCAL_AMFLAGS; remove old stuff from spec changelog - Original commit message from CVS: - add ACLOCAL_AMFLAGS; remove old stuff from spec changelog + * sys/msdk/gstmsdkcontext.c: + * sys/msdk/gstmsdkcontext.h: + MSDK: Use the VA display object to replace the raw display handle. + The VA display object from VA lib is a common defined object. which + contain the whole display things. It is easier to use, and more important, + we can share it with the other VA plugins and keep all the VA related + plugins working on the same GPU device. + We also delete the useless gst_msdk_context_get_fd() API. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1087> -2005-11-25 19:58:19 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-11 11:11:03 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * PORTED_09: - * configure.ac: - * ext/Makefile.am: - * ext/wavpack/Makefile.am: - * ext/wavpack/gstwavpackdec.c: - * ext/wavpack/gstwavpackdec.h: - * ext/wavpack/gstwavpackparse.c: - * ext/wavpack/gstwavpackparse.h: - Wavpack ported to 0.9. No support for correction file yet. - Original commit message from CVS: - Wavpack ported to 0.9. No support for correction file yet. - -2005-11-25 18:15:51 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - ext/wavpack/: put back wavpack - still needs porting - Original commit message from CVS: - * ext/wavpack/gstwavpackcommon.h: - * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_link), - (gst_wavpack_dec_wvclink), (gst_wavpack_dec_get_type), - (gst_wavpack_dec_base_init), (gst_wavpack_dec_dispose), - (gst_wavpack_dec_class_init), (gst_wavpack_dec_src_query), - (gst_wavpack_dec_init), (gst_wavpack_dec_setup_context), - (gst_wavpack_dec_format_samples), (gst_wavpack_dec_loop), - (gst_wavpack_dec_plugin_init): - * ext/wavpack/gstwavpackdec.h: - * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_get_type), - (gst_wavpack_parse_base_init), (gst_wavpack_parse_dispose), - (gst_wavpack_parse_class_init), (gst_wavpack_parse_src_query), - (gst_wavpack_parse_src_event), (find_header), (find_sample), - (gst_wavpack_parse_seek), (gst_wavpack_parse_init), - (gst_wavpack_parse_handle_event), (gst_wavpack_parse_loop), - (gst_wavpack_parse_change_state), (gst_wavpack_parse_plugin_init): - * ext/wavpack/gstwavpackparse.h: - put back wavpack - still needs porting - -2005-11-23 21:27:20 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * Makefile.am: - add a torture target - Original commit message from CVS: - add a torture target + * sys/msdk/meson.build: + MSDK: Add the gst va lib into MSDK's dependency. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1087> -2005-11-23 20:06:09 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2022-02-10 12:52:30 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * configure.ac: - back to HEAD - Original commit message from CVS: - back to HEAD + * gst/videoparsers/gstav1parse.c: + av1parse: Add temporal unit check when TD is absent. + The current manner for deciding the new temporal unit is based on + temporal delimiter(TD) OBU. We only start a new temporal unit when + the TD comes. + But some streams do not have TD at all, which makes the output "TU" + alignment fail to work. We now add check based on the relationship + between the different layers and it can successfully judge the TU edge. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1634> -=== release 0.9.6 === +2022-02-04 17:12:15 +0800 He Junyan <junyan.he@intel.com> -2005-11-23 19:57:49 +0000 Thomas Vander Stichele <thomas@apestaart.org> + * gst/videoparsers/gstav1parse.c: + av1parse: let the parse continue when MISSING_OBU_REFERENCE error. + Some streams may have verbose OBUs before a valid sequence header. We + should let the parse continue rather than return a error. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1634> - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/inspect/plugin-faad.xml: - * docs/plugins/inspect/plugin-gsm.xml: - * docs/plugins/inspect/plugin-qtdemux.xml: - * docs/plugins/inspect/plugin-sdlvideosink.xml: - * docs/plugins/inspect/plugin-speed.xml: - * docs/plugins/inspect/plugin-tta.xml: - releasing 0.9.6 - Original commit message from CVS: - releasing 0.9.6 - -2005-11-23 18:05:16 +0000 Julien Moutte <julien@moutte.net> - - Use fraction for framerate, various fixes. - Original commit message from CVS: - 2005-11-23 Julien MOUTTE <julien@moutte.net> - * docs/plugins/gst-plugins-bad-plugins-decl.txt: - * ext/directfb/dfb-example.c: (main): - * ext/directfb/dfbvideosink.c: - (gst_dfbvideosink_surface_destroy), - (gst_dfbvideosink_event_thread), (gst_dfbvideosink_setup), - (gst_dfbvideosink_getcaps), (gst_dfbvideosink_setcaps), - (gst_dfbvideosink_change_state), (gst_dfbvideosink_get_times), - (gst_dfbvideosink_bufferpool_clear), - (gst_dfbvideosink_buffer_alloc), (gst_dfbsurface_finalize), - (gst_dfbvideosink_navigation_send_event), - (gst_dfbvideosink_finalize), (gst_dfbvideosink_init), - (gst_dfbvideosink_class_init): - * ext/directfb/dfbvideosink.h: Use fraction for framerate, - various - fixes. - -2005-11-23 15:36:08 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - ext/sdl/sdlvideosink.*: Updates for fractional framerates and XOverlay interface changes - Original commit message from CVS: - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_base_init), - (gst_sdlvideosink_get_times), (gst_sdlvideosink_init), - (gst_sdlvideosink_setcaps), (gst_sdlvideosink_change_state): - * ext/sdl/sdlvideosink.h: - Updates for fractional framerates and XOverlay interface changes - -2005-11-23 11:57:51 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - gst/qtdemux/qtdemux.c: Convert to fractional framerates - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (gst_qtdemux_add_stream), (qtdemux_dump_mvhd), - (qtdemux_parse_trak): - Convert to fractional framerates - -2005-11-23 00:28:12 +0000 Edward Hervey <bilboed@bilboed.com> - - ext/musepack/gstmusepackdec.c: Fix for latest API changes - Original commit message from CVS: - * ext/musepack/gstmusepackdec.c: (gst_musepackdec_loop): - Fix for latest API changes +2022-02-04 11:40:18 +0800 He Junyan <junyan.he@intel.com> -2005-11-22 15:09:28 +0000 Edgard Lima <edgard.lima@indt.org.br> + * gst/videoparsers/gstav1parse.c: + av1parse: Continue when we fail to detect the alignment. + Some streams may have problematic OBUs at the beginning, which causes + the parse fail to detect the alignment and return error. For example, + there may be verbose OBUs before a valid sequence, which should be + discarded until we meet a valid sequence. We should let the parse + continue when we meet such cases, rather than just return error. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1634> - * ChangeLog: - * PORTED_09: - * configure.ac: - * ext/Makefile.am: - * ext/musepack/gstmusepackdec.c: - * ext/musepack/gstmusepackdec.h: - * ext/musepack/gstmusepackreader.c: - * ext/musepack/gstmusepackreader.h: - Musepackdec ported to 0.9. There is still a small problem to be solved, after the end of file, the pipeline doens't s... - Original commit message from CVS: - Musepackdec ported to 0.9. There is still a small problem to be solved, after the end of file, the pipeline doens't stop. +2021-03-30 19:23:12 +0900 Seungha Yang <seungha@centricular.com> -2005-11-22 11:57:51 +0000 Andy Wingo <wingo@pobox.com> + * gst/ivfparse/gstivfparse.c: + ivfparse: Don't set zero resolution on caps + It could be zero if the information is not available at ivfparse + side, or not implemented. In that case, simply don't set + width/height on caps, otherwise downstream would be confused + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1649> - * ChangeLog: - * ext/faad/gstfaad.c: - * ext/ivorbis/vorbisfile.c: - * gst/qtdemux/qtdemux.c: - * gst/speed/gstspeed.c: - * gst/tta/gstttaparse.c: - ext/faad/gstfaad.c (gst_faad_event) ext/ivorbis/vorbisfile.c (gst_ivorbisfile_loop) gst/qtdemux/qtdemux.c (gst_qtdemu... - Original commit message from CVS: - 2005-11-22 Andy Wingo <wingo@pobox.com> - * ext/faad/gstfaad.c (gst_faad_event) - * ext/ivorbis/vorbisfile.c (gst_ivorbisfile_loop) - * gst/qtdemux/qtdemux.c (gst_qtdemux_loop_header) - * gst/speed/gstspeed.c (speed_sink_event) - * gst/tta/gstttaparse.c (gst_tta_parse_src_event) - (gst_tta_parse_parse_header): Run update-funcnames. - -2005-11-21 18:45:54 +0000 Michael Smith <msmith@xiph.org> - - ext/faad/gstfaad.c: Don't take STREAM_LOCK in sink event handlers any more. - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_setcaps), (gst_faad_event): - Don't take STREAM_LOCK in sink event handlers any more. - -2005-11-21 18:09:01 +0000 Tim-Philipp Müller <tim@centricular.net> - - Update for stream lock API changes: don't take stream log in sink event handlers any longer and change GST_STREAM_LOC... - Original commit message from CVS: - * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_sink_event): - * ext/flac/gstflacdec.c: (gst_flacdec_loop), - (gst_flacdec_src_event): - * ext/flac/gstflacenc.c: (gst_flacenc_sink_event): - * ext/ladspa/gstsignalprocessor.c: (gst_signal_processor_event), - (gst_signal_processor_getrange), (gst_signal_processor_chain): - * gst/avi/gstavidemux.c: (gst_avi_demux_handle_seek): - * gst/flx/gstflxdec.c: (gst_flxdec_src_event_handler), - (gst_flxdec_sink_event_handler): - * gst/matroska/matroska-demux.c: - (gst_matroska_demux_handle_seek_event): - * gst/wavparse/gstwavparse.c: (gst_wavparse_handle_seek): - Update for stream lock API changes: don't take stream log - in sink event handlers any longer and change GST_STREAM_LOCK - to GST_PAD_STREAM_LOCK. Don't leak references in flxdec event - functions. - -2005-11-21 17:37:41 +0000 Wim Taymans <wim.taymans@gmail.com> - - Fix for stream lock updates. - Original commit message from CVS: - * ext/faac/gstfaac.c: (gst_faac_sink_event): - * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_src_event): - * gst/tta/gstttaparse.c: (gst_tta_parse_src_event): - Fix for stream lock updates. - -2005-11-21 17:14:02 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/: Segment update fix. - Original commit message from CVS: - * gst-libs/gst/audio/gstbaseaudiosink.c: - (gst_base_audio_sink_class_init), (gst_base_audio_sink_init), - (gst_base_audio_sink_provide_clock), - (gst_base_audio_sink_set_clock), (gst_base_audio_sink_render), - (gst_base_audio_sink_change_state): - * gst/audioresample/gstaudioresample.c: - Segment update fix. - -2005-11-21 16:45:46 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: j@bootlab.org, #321903). - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): - Add DX50, DIVX and DIV3 fourccs (patch by - j@bootlab.org, #321903). - -2005-11-21 16:37:18 +0000 Andy Wingo <wingo@pobox.com> - - *.*: Ran scripts/update-macros. Oh yes. - Original commit message from CVS: - 2005-11-21 Andy Wingo <wingo@pobox.com> - * *.h: - * *.c: Ran scripts/update-macros. Oh yes. - -2005-11-21 14:39:04 +0000 Tim-Philipp Müller <tim@centricular.net> - - Update for GST_FOURCC_FORMAT API change. - Original commit message from CVS: - * ext/directfb/dfbvideosink.c: - (gst_dfbvideosink_get_format_from_caps): - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_create): - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), - (qtdemux_parse), (qtdemux_type_get), (qtdemux_node_dump_foreach), - (qtdemux_dump_hdlr), (qtdemux_dump_dref), (qtdemux_dump_stsd), - (qtdemux_dump_dcom), (qtdemux_parse_trak), (qtdemux_video_caps), - (qtdemux_audio_caps): - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_v4l2fourcc_to_caps): - * sys/v4l2/v4l2src_calls.c: (gst_v4l2src_fill_format_list), - (gst_v4l2src_capture_init), (gst_v4l2src_get_size_limits): - Update for GST_FOURCC_FORMAT API change. - -2005-11-21 14:33:11 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - Rename gst_caps_structure_fixate_* to gst_structure_fixate_* (#322027) - Original commit message from CVS: - * ext/audioresample/gstaudioresample.c: - * ext/polyp/polypsink.c: (gst_polypsink_sink_fixate): - * gst/librfb/gstrfbsrc.c: (gst_rfbsrc_fixate): - * gst/modplug/gstmodplug.cc: - * sys/glsink/glimagesink.c: (gst_glimagesink_fixate): - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_fixate): - Rename gst_caps_structure_fixate_* to gst_structure_fixate_* - (#322027) +2022-01-29 01:52:26 +0900 Seungha Yang <seungha@centricular.com> -2005-11-21 03:21:04 +0000 Edgard Lima <edgard.lima@indt.org.br> + * sys/mediafoundation/gstmfmp3dec.cpp: + * sys/mediafoundation/gstmfmp3dec.h: + * sys/mediafoundation/meson.build: + * sys/mediafoundation/plugin.cpp: + mediafoundation: Add support for MP3 decoding + See also + https://docs.microsoft.com/en-us/windows/win32/medfound/windows-media-mp3-decoder + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1596> - * ChangeLog: - * common: - * ext/ivorbis/Makefile.am: - * ext/ivorbis/vorbisfile.c: - Now it works in push-mode. Tested with gnomevfssrc location=http://.. ! tremor ! alsasink. - Original commit message from CVS: - Now it works in push-mode. Tested with gnomevfssrc location=http://.. ! tremor ! alsasink. - Some issues to be solved yet: - 1- set correct timestamps - 2- seek is forced to disabled in pull-mode - -2005-11-16 17:26:10 +0000 Christian Schaller <uraeus@gnome.org> - - * common: - * gst-plugins-bad.spec.in: - make it work - Original commit message from CVS: - make it work - -2005-11-15 16:50:18 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/faac/gstfaac.c: Set proper caps on source pad (#320532). - Original commit message from CVS: - * ext/faac/gstfaac.c: (gst_faac_base_init), (gst_faac_init), - (gst_faac_sink_setcaps), (gst_faac_configure_source_pad), - (gst_faac_chain): - Set proper caps on source pad (#320532). - * ext/faad/gstfaad.c: - Don't use gtk-doc markers for comment block. - -2005-11-15 08:38:16 +0000 Christian Schaller <uraeus@gnome.org> - - * ext/ivorbis/vorbis.c: - set rank to secondary as you never want this to be used instead of normal oggdemux etc. - Original commit message from CVS: - set rank to secondary as you never want this to be used instead of normal oggdemux etc. - -2005-11-14 17:11:55 +0000 Andy Wingo <wingo@pobox.com> - - configure.ac (GST_PLUGIN_LDFLAGS): -no-undefined for better debugging, allows dll builds on windows. Fixes #316076. - Original commit message from CVS: - 2005-11-14 Andy Wingo <wingo@pobox.com> - * configure.ac (GST_PLUGIN_LDFLAGS): -no-undefined for better - debugging, allows dll builds on windows. Fixes #316076. +2022-01-27 02:20:37 +0900 Seungha Yang <seungha@centricular.com> -2005-11-14 02:13:26 +0000 Thomas Vander Stichele <thomas@apestaart.org> + * sys/mediafoundation/gstmfaacdec.cpp: + * sys/mediafoundation/gstmfaacdec.h: + * sys/mediafoundation/gstmfaudiodecoder.cpp: + * sys/mediafoundation/gstmfaudiodecoder.h: + * sys/mediafoundation/gstmfutils.cpp: + * sys/mediafoundation/gstmfutils.h: + * sys/mediafoundation/meson.build: + * sys/mediafoundation/plugin.cpp: + mediafoundation: Add support for AAC decoding + See also + https://docs.microsoft.com/en-us/windows/win32/medfound/aac-decoder + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1596> - * common: - * ext/ladspa/gstladspa.c: - rework configure.ac; make asterisk rtp stuff compile on mingw - Original commit message from CVS: - rework configure.ac; make asterisk rtp stuff compile on mingw +2022-01-28 01:45:30 +0900 Seungha Yang <seungha@centricular.com> -2005-11-11 19:39:17 +0000 Thomas Vander Stichele <thomas@apestaart.org> + * sys/mediafoundation/gstmfaacenc.cpp: + * sys/mediafoundation/gstmfaudioencoder.cpp: + * sys/mediafoundation/gstmfaudioencoder.h: + * sys/mediafoundation/gstmfh264enc.cpp: + * sys/mediafoundation/gstmfh265enc.cpp: + * sys/mediafoundation/gstmfmp3enc.cpp: + * sys/mediafoundation/gstmfsourcereader.cpp: + * sys/mediafoundation/gstmftransform.cpp: + * sys/mediafoundation/gstmfvideoencoder.cpp: + * sys/mediafoundation/gstmfvideoencoder.h: + * sys/mediafoundation/gstmfvp9enc.cpp: + * sys/mediafoundation/meson.build: + * sys/mediafoundation/plugin.cpp: + mediafoundation: Cosmetic changes + Rename baseclass to be consistent with other Windows plugins + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1596> - * ChangeLog: - * configure.ac: - back to head - Original commit message from CVS: - back to head +2022-01-27 02:26:02 +0900 Seungha Yang <seungha@centricular.com> -=== release 0.9.5 === + * sys/mediafoundation/gstmfaudioenc.cpp: + * sys/mediafoundation/gstmftransform.cpp: + * sys/mediafoundation/gstmfvideoenc.cpp: + mediafoundation: Use & operator instead of GetAddressOf() + Use shorter expression + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1596> -2005-11-11 19:38:17 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2022-01-24 02:41:29 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - releasing 0.9.5 - Original commit message from CVS: - releasing 0.9.5 + * sys/mediafoundation/gstmfaacenc.cpp: + * sys/mediafoundation/gstmfaudioenc.cpp: + * sys/mediafoundation/gstmfcapturewinrt.cpp: + * sys/mediafoundation/gstmfdevice.cpp: + * sys/mediafoundation/gstmfh264enc.cpp: + * sys/mediafoundation/gstmfh265enc.cpp: + * sys/mediafoundation/gstmfmp3enc.cpp: + * sys/mediafoundation/gstmfplatloader.cpp: + * sys/mediafoundation/gstmfsourceobject.cpp: + * sys/mediafoundation/gstmfsourcereader.cpp: + * sys/mediafoundation/gstmftransform.cpp: + * sys/mediafoundation/gstmfutils.cpp: + * sys/mediafoundation/gstmfvideobuffer.cpp: + * sys/mediafoundation/gstmfvideoenc.cpp: + * sys/mediafoundation/gstmfvideosrc.cpp: + * sys/mediafoundation/gstmfvp9enc.cpp: + * sys/mediafoundation/gstwin32devicewatcher.cpp: + * sys/mediafoundation/mediacapturewrapper.cpp: + * sys/mediafoundation/meson.build: + * sys/mediafoundation/plugin.cpp: + mediafoundation: Port to C++ + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1596> -2005-11-11 18:54:14 +0000 Michael Smith <msmith@xiph.org> +2022-02-09 03:27:41 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * ext/faad/gstfaad.c: - Fix compile on systems with broken faad headers. - Original commit message from CVS: - Fix compile on systems with broken faad headers. - -2005-11-11 18:17:22 +0000 Michael Smith <msmith@xiph.org> - - ext/faad/gstfaad.c: Call functions with the correct API. Unfortunately, unless your distribution patches upstream, th... - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_setcaps), (gst_faad_chain): - Call functions with the correct API. Unfortunately, unless your - distribution patches upstream, the public header file for FAAD - doesn't actually declare the API accurately. So, some nastiness - ensues... - -2005-11-10 12:34:26 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Add support for custom genre tags. - Original commit message from CVS: - Reviewed by: Tim-Philipp Müller <tim at centricular dot net> - * gst/qtdemux/qtdemux.c: (qtdemux_parse_udta): - Add support for custom genre tags. - -2005-11-09 01:04:05 +0000 Tim-Philipp Müller <tim@centricular.net> - - Don't use gtk-doc markers for normal comments. Fix gtk-doc formatting where required. - Original commit message from CVS: - * ext/tarkin/wavelet.c: - * ext/tarkin/wavelet.h: - * gst/mpegaudioparse/gstmpegaudioparse.c: - * gst/vbidec/vbidata.c: - * gst/vbidec/vbiscreen.h: - * sys/dxr3/ac3_padder.c: - * sys/dxr3/dxr3audiosink.c: - * sys/dxr3/dxr3spusink.c: - * sys/dxr3/dxr3videosink.c: - * sys/qcam/dark.c: - Don't use gtk-doc markers for normal comments. Fix - gtk-doc formatting where required. - -2005-11-08 14:20:50 +0000 Christian Schaller <uraeus@gnome.org> - - * configure.ac: - * ext/Makefile.am: - remove wrong mpegstream addition - Original commit message from CVS: - remove wrong mpegstream addition - -2005-11-08 14:17:03 +0000 Christian Schaller <uraeus@gnome.org> - - * configure.ac: - * gst-plugins-bad.spec.in: - add tremor plugins to needed buildscripts - Original commit message from CVS: - add tremor plugins to needed buildscripts + * sys/d3d11/plugin.cpp: + d3d11decoder: Promote rank to primary except for mpeg2 + Our D3D11/DXVA codecs implementation has been verified + during 1.18 and 1.20 development cycle and also via the Fluster + test framework. Similar to the case of nvdec and vtdec, + we can prefer hardware over software in most cases + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1672> -2005-11-08 13:55:13 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-09 15:05:14 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * ChangeLog: - * PORTED_09: - * configure.ac: - * ext/Makefile.am: - * ext/ivorbis/vorbis.c: - * ext/ivorbis/vorbisfile.c: - Ported to 0.9. Some issues to be solved yet: 1- set correct timestamps 2- seg fault when eos 3- seek is now disabled - Original commit message from CVS: - Ported to 0.9. Some issues to be solved yet: - 1- set correct timestamps - 2- seg fault when eos - 3- seek is now disabled - -2005-11-06 22:28:33 +0000 Julien Moutte <julien@moutte.net> - - examples/Makefile.am: Cleanup non existing examples. - Original commit message from CVS: - 2005-11-06 Julien MOUTTE <julien@moutte.net> - * examples/Makefile.am: Cleanup non existing - examples. - -2005-11-06 22:23:07 +0000 Julien Moutte <julien@moutte.net> - - docs/plugins/inspect.stamp: Add missing files. - Original commit message from CVS: - 2005-11-06 Julien MOUTTE <julien@moutte.net> - * docs/plugins/inspect.stamp: Add missing files. - -2005-11-06 22:19:05 +0000 Julien Moutte <julien@moutte.net> - - examples/Makefile.am: Make buildbot happy. - Original commit message from CVS: - 2005-11-06 Julien MOUTTE <julien@moutte.net> - * examples/Makefile.am: Make buildbot happy. - -2005-11-06 22:16:27 +0000 Julien Moutte <julien@moutte.net> - - Makefile.am: examples in dist subdirs. - Original commit message from CVS: - 2005-11-06 Julien MOUTTE <julien@moutte.net> - * Makefile.am: examples in dist subdirs. - * configure.ac: enable parameter for building - examples. - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * examples/Makefile.am: Updates. - -2005-11-06 21:55:01 +0000 Julien Moutte <julien@moutte.net> - - Enable documentation. - Original commit message from CVS: - 2005-11-06 Julien MOUTTE <julien@moutte.net> - * Makefile.am: - * autogen.sh: - * configure.ac: - * docs/Makefile.am: - * docs/plugins/.cvsignore: - * docs/plugins/Makefile.am: - * docs/plugins/gst-plugins-bad-plugins-decl-list.txt: - * docs/plugins/gst-plugins-bad-plugins-decl.txt: - * docs/plugins/gst-plugins-bad-plugins-docs.sgml: - * docs/plugins/gst-plugins-bad-plugins-sections.txt: - * docs/plugins/gst-plugins-bad-plugins-undocumented.txt: - * docs/plugins/gst-plugins-bad-plugins.args: - * docs/plugins/gst-plugins-bad-plugins.hierarchy: - * docs/plugins/gst-plugins-bad-plugins.interfaces: - * docs/plugins/gst-plugins-bad-plugins.prerequisites: - * docs/plugins/gst-plugins-bad-plugins.signals: - * docs/plugins/gst-plugins-bad-plugins.types: - * docs/plugins/inspect/plugin-dfbvideosink.xml: - * docs/version.entities.in: Enable documentation. - * examples/Makefile.am: - * examples/directfb/Makefile.am: - * examples/directfb/decker.ttf: - * examples/directfb/dfblogo.png: - * examples/directfb/gstdfb.c: (myclock), (dynamic_link), - (size_changed), (setup_dynamic_link), (main): Add an example - application for DirectFB. - -2005-11-05 23:36:20 +0000 Julien Moutte <julien@moutte.net> - - ext/directfb/Makefile.am: Add the example application. - Original commit message from CVS: - 2005-11-06 Julien MOUTTE <julien@moutte.net> - * ext/directfb/Makefile.am: Add the example application. - * ext/directfb/dfb-example.c: (get_me_out), (main): - Here is an example application that runs videotestsrc for 20 - seconds. It's included in the documentation. - * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_enum_layers), - (gst_dfbvideosink_setup), - (gst_dfbvideosink_can_blit_from_format), - (gst_dfbvideosink_getcaps), (gst_dfbvideosink_buffer_alloc): - More fixes, calculate new size of the buffer when renegotiating. - This completely breaks ffmpegcolorspace but i need to discuss - that with Wim on monday. Add documentation. - -2005-11-05 19:55:12 +0000 Julien Moutte <julien@moutte.net> - - ext/directfb/dfbvideosink.c: Make acceleration detection work, better, add safety checks and ARGB support for cards t... - Original commit message from CVS: - 2005-11-05 Julien MOUTTE <julien@moutte.net> - * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_enum_layers), - (gst_dfbvideosink_setup), - (gst_dfbvideosink_can_blit_from_format), - (gst_dfbvideosink_getcaps): Make acceleration detection work, - better, add safety checks and ARGB support for cards that - support it. - -2005-11-04 18:28:56 +0000 Julien Moutte <julien@moutte.net> - - ext/directfb/dfbvideosink.*: Now does clipping when surface is too small, handles upstream elements that are not call... - Original commit message from CVS: - 2005-11-04 Julien MOUTTE <julien@moutte.net> - * ext/directfb/dfbvideosink.c: - (gst_dfbvideosink_surface_create), - (gst_dfbvideosink_surface_destroy), - (gst_dfbvideosink_get_best_vmode), (gst_dfbvideosink_getcaps), - (gst_dfbvideosink_center_rect), (gst_dfbvideosink_show_frame), - (gst_dfbvideosink_buffer_alloc): - * ext/directfb/dfbvideosink.h: Now does clipping when surface - is too small, handles upstream elements that are not calling - gst_pad_alloc_buffer, fixes a lot of bugs. - -2005-11-03 22:36:42 +0000 Julien Moutte <julien@moutte.net> - - ext/directfb/Makefile.am: Prepare for liboil usage. - Original commit message from CVS: - 2005-11-03 Julien MOUTTE <julien@moutte.net> - * ext/directfb/Makefile.am: Prepare for liboil usage. - * ext/directfb/dfbvideosink.c: (gst_dfbvideosink_show_frame), - (gst_dfbvideosink_buffer_alloc): Prepare for liboil, handle - rendering in external surface correctly. Will commit a neat - example soon. + * sys/v4l2codecs/gstv4l2codecvp9dec.c: + v4l2codecs: vp9: Fix duplicating a duplicated picture + Duplicating a picture what was already a dup was leading to a crash. Rename + the custom picture flags as HOLDS_BUFFER to make its meaning clear. Then save + then ref and store the picture as userdata, so it can be obtained when + duplicating. Finally, mark the doplicated as HOLDS_BUFFER to avoid thinking it + holds a request. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1681> -2005-11-03 16:59:20 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-10 01:48:23 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * ext/sdl/sdlvideosink.c: - * ext/sdl/sdlvideosink.h: - Add support to exit when 'Esc' key is pressed. - Original commit message from CVS: - Add support to exit when 'Esc' key is pressed. - -2005-11-02 17:12:31 +0000 Julien Moutte <julien@moutte.net> - - configure.ac: Requires DirectFB 0.9.24 - Original commit message from CVS: - 2005-11-02 Julien MOUTTE <julien@moutte.net> - * configure.ac: Requires DirectFB 0.9.24 - -2005-11-02 12:53:00 +0000 Christian Schaller <uraeus@gnome.org> - - * ext/Makefile.am: - add directfb to distdir - Original commit message from CVS: - add directfb to distdir - -2005-11-02 12:43:03 +0000 Julien Moutte <julien@moutte.net> - - Complete rewrite/port of - Original commit message from CVS: - 2005-11-02 Julien MOUTTE <julien@moutte.net> - * configure.ac: - * ext/Makefile.am: - * ext/directfb/Makefile.am: - * ext/directfb/dfbvideosink.c: - (gst_dfbvideosink_get_format_name), - (gst_dfbvideosink_surface_create), - (gst_dfbvideosink_surface_destroy), - (gst_dfbvideosink_event_thread), (gst_dfbvideosink_enum_layers), - (gst_dfbvideosink_enum_vmodes), (gst_dfbvideosink_enum_devices), - (gst_dfbvideosink_setup), (gst_dfbvideosink_cleanup), - (gst_dfbvideosink_get_format_from_caps), - (gst_dfbvideosink_get_caps_from_format), - (gst_dfbvideosink_can_blit_from_format), - (gst_dfbvideosink_get_best_vmode), (gst_dfbvideosink_getcaps), - (gst_dfbvideosink_setcaps), (gst_dfbvideosink_change_state), - (gst_dfbvideosink_get_times), (gst_dfbvideosink_center_rect), - (gst_dfbvideosink_show_frame), - (gst_dfbvideosink_bufferpool_clear), - (gst_dfbvideosink_buffer_alloc), (gst_dfbsurface_finalize), - (gst_dfbsurface_init), (gst_dfbsurface_class_init), - (gst_dfbsurface_get_type), - (gst_dfbvideosink_interface_supported), - (gst_dfbvideosink_interface_init), - (gst_dfbvideosink_navigation_send_event), - (gst_dfbvideosink_navigation_init), - (gst_dfbvideosink_set_property), - (gst_dfbvideosink_get_property), - (gst_dfbvideosink_init), (gst_dfbvideosink_base_init), - (gst_dfbvideosink_class_init), (gst_dfbvideosink_get_type), - (plugin_init): - * ext/directfb/dfbvideosink.h: - * ext/directfb/directfbvideosink.c: - * ext/directfb/directfbvideosink.h: Complete rewrite/port of - DirectFB video sink to 0.9. Handles reverse negotiation, - hardware - scaling, navigation, buffer allocation from video memory etc... + * sys/mediafoundation/gstmfaudioenc.cpp: + mfaudioenc: Handle empty IMFMediaBuffer + IMFMediaBuffer may not hold encoded data, which seems to happen + while draining. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1679> -2005-10-31 20:57:42 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-03 10:10:44 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * ChangeLog: - * ext/sdl/sdlvideosink.c: - Changed property full-screen to fullscreen, using SDL_SWSURFACE instead of SDL_HWSURFACE when in full screen mode. - Original commit message from CVS: - Changed property full-screen to fullscreen, using SDL_SWSURFACE instead of SDL_HWSURFACE when in full screen mode. + * sys/va/gstvadecoder.c: + va: decoder: Log profile name. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1675> -2005-10-31 18:07:30 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-01-24 16:25:18 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * ChangeLog: - * common: - * ext/sdl/sdlvideosink.c: - * ext/sdl/sdlvideosink.h: - Added a property that allows full-screen. - Original commit message from CVS: - Added a property that allows full-screen. - -2005-10-28 15:11:18 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/sdl/sdlvideosink.*: Fix I420 output on some machines (not very nice, but should work). - Original commit message from CVS: - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_base_init), - (gst_sdlvideosink_class_init), - (gst_sdlvideosink_get_sdl_from_fourcc), (gst_sdlvideosink_setcaps), - (gst_sdlvideosink_show_frame): - * ext/sdl/sdlvideosink.h: - Fix I420 output on some machines (not very nice, but should work). - Add an 'sdlvideosink' debug category. Disable formats that do - not work. Fix some vararg function issues. - -2005-10-27 20:16:40 +0000 Wim Taymans <wim.taymans@gmail.com> - - ext/sdl/sdlvideosink.c: Fix SDL videosink and did some cleanups. - Original commit message from CVS: - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_finalize), - (gst_sdlvideosink_get_times), (gst_sdlvideosink_class_init), - (gst_sdlvideosink_init), (gst_sdlvideosink_lock), - (gst_sdlvideosink_initsdl), (gst_sdlvideosink_create), - (gst_sdlvideosink_show_frame), (gst_sdlvideosink_set_property), - (gst_sdlvideosink_get_property), (gst_sdlvideosink_change_state): - Fix SDL videosink and did some cleanups. + * sys/va/gstvafilter.c: + va: filter: Log the added filter name. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1675> -2005-10-27 19:36:18 +0000 Edgard Lima <edgard.lima@indt.org.br> +2021-10-25 13:41:49 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * ChangeLog: - * ext/sdl/sdlvideosink.c: - * ext/sdl/sdlvideosink.h: - Trying to fix videos out of sync (not fixed yet) - Original commit message from CVS: - Trying to fix videos out of sync (not fixed yet) - -2005-10-27 16:16:00 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - removed unused language stuff - Original commit message from CVS: - removed unused language stuff - -2005-10-27 12:49:54 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * Makefile.am: - * configure.ac: - don't do po until something wants to be translated - Original commit message from CVS: - don't do po until something wants to be translated - -2005-10-27 11:27:53 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.h: Remove got_redirect from class structure as well. - Original commit message from CVS: - * gst/qtdemux/qtdemux.h: - Remove got_redirect from class structure as well. - -2005-10-27 11:25:19 +0000 Tim-Philipp Müller <tim@centricular.net> - - gst/qtdemux/qtdemux.c: Remove 'got-redirect' signal and post element message on the bus instead. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_class_init), - (qtdemux_parse_tree): - Remove 'got-redirect' signal and post element message - on the bus instead. + * sys/va/gstvafilter.c: + * sys/va/gstvafilter.h: + * sys/va/gstvavpp.c: + vapostproc: Process HDR caps + This patch adds a new parameter: hdr-tone-mapping (same as + vaapipostproc), if the HDR capabilites are availabe in driver, and + it's disabled by default. + If hdr-tone-mapping is enabled then HDR fields in sink caps are + processed in frames from HDR to SDR, removing those hdr fields in + source pad caps too. + hdr-tone-mapping is not enabled if a color conversion is also + requested, since it fails to process in the iHD driver, so far. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1258> -2005-10-26 15:45:11 +0000 Zeeshan Ali <zeenix@gmail.com> +2021-09-30 17:42:19 +0200 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * ChangeLog: - * ext/gsm/gstgsm.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmdec.h: - * ext/gsm/gstgsmenc.c: - Fixing stuff as wingo pointed out. - Original commit message from CVS: - Fixing stuff as wingo pointed out. - -2005-10-26 13:40:33 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * po/POTFILES.in: - * po/af.po: - * po/az.po: - * po/cs.po: - * po/en_GB.po: - * po/hu.po: - * po/it.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - fix distcheck - Original commit message from CVS: - fix distcheck - -2005-10-26 13:01:20 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * gst/tta/gstttaparse.c: - don't put crap in user-visible strings - Original commit message from CVS: - don't put crap in user-visible strings + * gst-libs/gst/va/meson.build: + * sys/msdk/meson.build: + build: Add libva dependency fallback. + Then libva can be subproject and used by either gstreamer-vaapi, + va and msdk in gst-plugins-bad. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1397> -2005-10-25 16:12:03 +0000 Zeeshan Ali <zeenix@gmail.com> +2022-02-06 23:20:32 +0900 Sangchul Lee <sc11.lee@samsung.com> - * ChangeLog: - * ext/gsm/gstgsm.c: - * ext/gsm/gstgsmdec.c: - * ext/gsm/gstgsmdec.h: - * ext/gsm/gstgsmenc.c: - * ext/gsm/gstgsmenc.h: - Over-writing Wim's gsm plugins (currently not working) with that from the farsight repo. Also made sure that they wor... - Original commit message from CVS: - Over-writing Wim's gsm plugins (currently not working) with that from the farsight repo. Also made sure that they work with the RTP (de)payloader. + * ext/webrtc/gstwebrtcice.c: + webrtcice: Fix memory leaks in gst_webrtc_ice_add_candidate() + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1646> -2005-10-25 13:31:09 +0000 Flavio Oliveira <flavio.oliveira@indt.org.br> +2022-01-28 14:49:42 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * ChangeLog: - * ext/gsm/gstgsmenc.c: - * ext/gsm/gstgsmenc.h: - Fixed event handling in gsmenc. - Original commit message from CVS: - Fixed event handling in gsmenc. + * sys/v4l2codecs/gstv4l2codecvp9dec.c: + * sys/v4l2codecs/gstv4l2decoder.c: + v4l2codecs: vp9: Make compressed hdr control optional + This is to supported by Mediatek VP9 driver. Mediatek handles + the forward probabilities in hardware hence does not need and + does not implement support for + V4L2_CID_STATELESS_VP9_COMPRESSED_HDR. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1600> -2005-10-24 13:02:32 +0000 Christian Schaller <uraeus@gnome.org> +2022-02-07 12:34:53 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * ChangeLog: - * configure.ac: - port over plugin listing from base - Original commit message from CVS: - port over plugin listing from base + * gst-libs/gst/va/meson.build: + va: Fix and simplify build recipe. + 1. Use api_version variable rather than static string. + 2. Remove pkgconfig generation since currently the library + is not installed, only used internally. + 3. Rely on dependency "required" to abort compilation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1650> -2005-10-23 23:07:02 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2022-02-07 11:27:57 +0100 Víctor Manuel Jáquez Leal <vjaquez@igalia.com> - * ChangeLog: - * configure.ac: - back to HEAD - Original commit message from CVS: - back to HEAD + * gst-libs/gst/va/meson.build: + * sys/va/meson.build: + va: Remove libgudev crumbs in library. + In commit e699aaeb we moved linking of libgudev to the plugin rather + the library, because it's only used in the plugin. But the dependency + check is still done in library. + This patch removes the dependency check in library, and updates the + dependency check in plugin. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1650> -=== release 0.9.4 === +2022-02-08 04:51:24 +0900 Seungha Yang <seungha@centricular.com> -2005-10-23 22:46:40 +0000 Thomas Vander Stichele <thomas@apestaart.org> + * sys/msdk/msdk.c: + * sys/msdk/msdk.h: + msdk: Fix for MFXUnload symbol re-definition build error + Fix for libgstreamer-full build + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1408> + +2021-12-25 00:13:04 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvh265enc.cpp: + * sys/qsv/gstqsvh265enc.h: + * sys/qsv/meson.build: + * sys/qsv/plugin.cpp: + qsv: Add support for HEVC encoding + main and main-10 profiles are supported for now + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1408> + +2021-12-19 21:39:53 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/gstqsvallocator.cpp: + * sys/qsv/gstqsvallocator_d3d11.cpp: + * sys/qsv/gstqsvvp9enc.cpp: + * sys/qsv/gstqsvvp9enc.h: + * sys/qsv/meson.build: + * sys/qsv/plugin.cpp: + qsv: Add support for VP9 encoding and more video formats + Add VP9 encoder with 4:2:0 8 bits and 4:4:4 8/10 bits formats support + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1408> - * ChangeLog: - * NEWS: - * RELEASE: - * configure.ac: - * po/af.po: - * po/az.po: - * po/cs.po: - * po/en_GB.po: - * po/hu.po: - * po/it.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - releasing 0.9.4 - Original commit message from CVS: - releasing 0.9.4 - -2005-10-23 14:38:00 +0000 Julien Moutte <julien@moutte.net> - - gst/tta/gstttaparse.c: STOPPED->FAILED. - Original commit message from CVS: - 2005-10-23 Julien MOUTTE <julien@moutte.net> - * gst/tta/gstttaparse.c: (gst_tta_parse_loop): STOPPED->FAILED. - -2005-10-21 16:11:53 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - latest updates - Original commit message from CVS: - latest updates - -2005-10-20 15:08:14 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/faad/gstfaad.*: Do some timestamp smoothing (matroskademux apparently sends multiple buffers in a row with the sa... - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_base_init), (gst_faad_class_init), - (gst_faad_init), (gst_faad_srcgetcaps), (gst_faad_event), - (gst_faad_chain), (gst_faad_change_state): - * ext/faad/gstfaad.h: - Do some timestamp smoothing (matroskademux apparently sends - multiple buffers in a row with the same timestamp); fix - duration on outgoing buffers; fix change state function; use - GST_DEBUG_FUNCPTR for pad functions. - -2005-10-19 15:58:01 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/: API change fix. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_src_query_types), - (gst_qtdemux_handle_src_query): - * gst/speed/gstspeed.c: (speed_get_query_types), (speed_src_query): - * gst/tta/gstttaparse.c: (gst_tta_parse_src_event), - (gst_tta_parse_get_query_types), (gst_tta_parse_query): - API change fix. - -2005-10-19 12:41:49 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: All the cool kids use GST_DOCBOOK_CHECK now. - Original commit message from CVS: - * configure.ac: - All the cool kids use GST_DOCBOOK_CHECK now. - -2005-10-18 08:39:41 +0000 Julien Moutte <julien@moutte.net> - - gst/speed/Makefile.am: Fix build of speed. - Original commit message from CVS: - 2005-10-18 Julien MOUTTE <julien@moutte.net> - * gst/speed/Makefile.am: Fix build of speed. +2022-02-06 21:34:43 +0900 Seungha Yang <seungha@centricular.com> -2005-10-17 20:48:35 +0000 Edgard Lima <edgard.lima@indt.org.br> + * meson_options.txt: + * sys/meson.build: + * sys/qsv/gstqsvallocator.cpp: + * sys/qsv/gstqsvallocator.h: + * sys/qsv/gstqsvallocator_d3d11.cpp: + * sys/qsv/gstqsvallocator_d3d11.h: + * sys/qsv/gstqsvallocator_va.cpp: + * sys/qsv/gstqsvallocator_va.h: + * sys/qsv/gstqsvencoder.cpp: + * sys/qsv/gstqsvencoder.h: + * sys/qsv/gstqsvh264enc.cpp: + * sys/qsv/gstqsvh264enc.h: + * sys/qsv/gstqsvutils.cpp: + * sys/qsv/gstqsvutils.h: + * sys/qsv/libmfx/meson.build: + * sys/qsv/meson.build: + * sys/qsv/plugin.cpp: + qsv: Introduce H.264 Intel Quick Sync Video Encoder + A new implementation of Intel Quick Sync Video plugin. + This plugin supports both Windows and Linux but optimization for + VA/DMABuf is not implemented yet. + This new plugin has some notable differences compared with existing + MSDK plugin. + * Encoder will expose formats which can be natively supported + without internal conversion. This will make encoder + control/negotiation flow much simpler and cleaner than + that of MSDK plugin. + * This plugin includes QSV specific library loading helper, + called dispatcher, with QSV SDK headers as a part of this plugin. + So, there will be no more SDK version dependent #ifdef in the code + and also there will be no more build-time MSDK/oneVPL SDK + dependency. + * Memory allocator interop between GStreamer and QSV is re-designed + and decoupled. Instead of implementing QSV specific allocator/bufferpool, + this plugin will make use of generic GStreamer memory + allocator/bufferpool (e.g., GstD3D11Allocator and GstD3D11BufferPool). + Specifically, GstQsvAllocator object will help interop between + GstMemory and mfxFrameAllocator memory abstraction layers. + Note that because of the design decision, VA/DMABuf support is not made + as a part of this initial commit. We can add the optimization for Linux + later once GstVA library exposes allocator/bufferpool implementation as + an API like GstD3D11. + * Initial encoder implementation supports interop with GstD3D11 + infrastructure, including zero-copy encoding with upstream D3D11 element. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1408> + +2021-12-01 22:18:42 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/libmfx/dispatcher/windows/mfx_dxva2_device.h: + qsv: Remove unnecessary pargma message + We know what we are doing, just remove noisy build warnings + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1408> + +2021-12-01 22:18:04 +0900 Seungha Yang <seungha@centricular.com> + + * sys/qsv/libmfx/api/vpl/mfx.h: + * sys/qsv/libmfx/api/vpl/mfxadapter.h: + * sys/qsv/libmfx/api/vpl/mfxbrc.h: + * sys/qsv/libmfx/api/vpl/mfxcommon.h: + * sys/qsv/libmfx/api/vpl/mfxdefs.h: + * sys/qsv/libmfx/api/vpl/mfxdispatcher.h: + * sys/qsv/libmfx/api/vpl/mfxdispatcherprefixedfunctions.h: + * sys/qsv/libmfx/api/vpl/mfximplcaps.h: + * sys/qsv/libmfx/api/vpl/mfxjpeg.h: + * sys/qsv/libmfx/api/vpl/mfxmvc.h: + * sys/qsv/libmfx/api/vpl/mfxpcp.h: + * sys/qsv/libmfx/api/vpl/mfxsession.h: + * sys/qsv/libmfx/api/vpl/mfxstructures.h: + * sys/qsv/libmfx/api/vpl/mfxsurfacepool.h: + * sys/qsv/libmfx/api/vpl/mfxvideo++.h: + * sys/qsv/libmfx/api/vpl/mfxvideo.h: + * sys/qsv/libmfx/api/vpl/mfxvp8.h: + * sys/qsv/libmfx/dispatcher/linux/device_ids.h: + * sys/qsv/libmfx/dispatcher/linux/libvpl.map: + * sys/qsv/libmfx/dispatcher/linux/mfxloader.cpp: + * sys/qsv/libmfx/dispatcher/linux/mfxloader.h: + * sys/qsv/libmfx/dispatcher/linux/mfxvideo_functions.h: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl.cpp: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl.h: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_config.cpp: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_loader.cpp: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_log.cpp: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_log.h: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_lowlatency.cpp: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_msdk.cpp: + * sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_win.h: + * sys/qsv/libmfx/dispatcher/windows/libmfx.def: + * sys/qsv/libmfx/dispatcher/windows/main.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_critical_section.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_critical_section.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher_defs.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher_log.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher_log.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_driver_store_loader.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_driver_store_loader.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_dxva2_device.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_dxva2_device.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_exposed_functions_list.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_function_table.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_library_iterator.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_library_iterator.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_load_dll.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_load_dll.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_vector.h: + * sys/qsv/libmfx/dispatcher/windows/mfx_win_reg_key.cpp: + * sys/qsv/libmfx/dispatcher/windows/mfx_win_reg_key.h: + * sys/qsv/libmfx/dispatcher/windows/mfxvideo++.h: + * sys/qsv/libmfx/dispatcher/windows/version.rc.in: + qsv: Import libmfx API and dispatch code from oneVPL project + Copied from oneVPL project (https://github.com/oneapi-src/oneVPL) + v2022.0.3 tag at the commit of efc259f8b7ee5c334bca1a904a503186038bbbdd + This is corresponding to MFX API version 2.6 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1408> - * ChangeLog: - * common: - * configure.ac: - * gst/speed/gstspeed.c: - * gst/speed/gstspeed.h: - Fixed Speed - Recovered featured missed since version 1.37, and changed other minor things. - Original commit message from CVS: - Fixed Speed - Recovered featured missed since version 1.37, and changed other - minor things. - -2005-10-16 17:08:26 +0000 Tim-Philipp Müller <tim@centricular.net> - - configure.ac: Fix glib check - Original commit message from CVS: - * configure.ac: - Fix glib check - -2005-10-16 13:54:38 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * common: - * gst/audioresample/gstaudioresample.c: - restructure configure.ac, use correct libtool LDFLAGS, fix up defines - Original commit message from CVS: - restructure configure.ac, use correct libtool LDFLAGS, fix up defines - -2005-10-13 15:31:20 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - ex/: and more typos fixed - Original commit message from CVS: - * examples/stats/mp2ogg.c: - * ext/tarkin/tarkin.c: (tarkin_analysis_framein), - (tarkin_synthesis_packetin): - and more typos fixed - -2005-10-13 11:37:39 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/faac/gstfaac.c: Gst09-ize code a little bit more: use gst_pad_alloc_buffer(), move event handling from chain func... - Original commit message from CVS: - * ext/faac/gstfaac.c: (gst_faac_class_init), (gst_faac_init), - (gst_faac_sink_setcaps), (gst_faac_src_setcaps), - (gst_faac_sink_event), (gst_faac_chain), (gst_faac_set_property), - (gst_faac_get_property), (gst_faac_change_state): - Gst09-ize code a little bit more: use gst_pad_alloc_buffer(), - move event handling from chain function into an event function, - add some locks here and there, do some cleanups; disable 32-bit - integer and float input formats until we're sure that those - actually work (couldn't play back the produced files with - anything). - -2005-10-12 14:29:55 +0000 Stefan Kost <ensonic@users.sourceforge.net> - - renamed GST_FLAGS macros to GST_OBJECT_FLAGS moved bitshift from macro to enum definition - Original commit message from CVS: - * examples/indexing/indexmpeg.c: (main): - * ext/artsd/gstartsdsink.c: (gst_artsdsink_open_audio), - (gst_artsdsink_close_audio), (gst_artsdsink_change_state): - * ext/artsd/gstartsdsink.h: - * ext/audiofile/gstafparse.c: (gst_afparse_open_file), - (gst_afparse_close_file): - * ext/audiofile/gstafparse.h: - * ext/audiofile/gstafsink.c: (gst_afsink_open_file), - (gst_afsink_close_file), (gst_afsink_chain), - (gst_afsink_change_state): - * ext/audiofile/gstafsink.h: - * ext/audiofile/gstafsrc.c: (gst_afsrc_open_file), - (gst_afsrc_close_file), (gst_afsrc_change_state): - * ext/audiofile/gstafsrc.h: - * ext/cdaudio/gstcdaudio.c: (gst_cdaudio_init): - * ext/directfb/directfbvideosink.c: (gst_directfbvideosink_init): - * ext/dts/gstdtsdec.c: (gst_dtsdec_init): - * ext/jack/gstjack.h: - * ext/jack/gstjackbin.c: (gst_jack_bin_init), - (gst_jack_bin_change_state): - * ext/musepack/gstmusepackdec.c: (gst_musepackdec_init): - * ext/musicbrainz/gsttrm.c: (gst_musicbrainz_init): - * ext/nas/nassink.c: (gst_nassink_open_audio), - (gst_nassink_close_audio), (gst_nassink_change_state): - * ext/nas/nassink.h: - * ext/polyp/polypsink.c: (gst_polypsink_init): - * ext/sdl/sdlvideosink.c: (gst_sdlvideosink_change_state): - * ext/sdl/sdlvideosink.h: - * ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init): - * ext/sndfile/gstsf.c: (gst_sf_set_property), - (gst_sf_change_state), (gst_sf_release_request_pad), - (gst_sf_open_file), (gst_sf_close_file), (gst_sf_loop): - * ext/sndfile/gstsf.h: - * ext/swfdec/gstswfdec.c: (gst_swfdec_init): - * ext/tarkin/gsttarkindec.c: (gst_tarkindec_init): - * gst/apetag/apedemux.c: (gst_ape_demux_init): - * gst/cdxaparse/gstcdxaparse.c: (gst_cdxaparse_init): - * gst/cdxaparse/gstcdxastrip.c: (gst_cdxastrip_init): - * gst/festival/gstfestival.c: (gst_festival_change_state): - * gst/festival/gstfestival.h: - * gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init): - * gst/multifilesink/gstmultifilesink.c: (gst_multifilesink_init), - (gst_multifilesink_set_location), (gst_multifilesink_open_file), - (gst_multifilesink_close_file), (gst_multifilesink_next_file), - (gst_multifilesink_pad_query), (gst_multifilesink_handle_event), - (gst_multifilesink_chain), (gst_multifilesink_change_state): - * gst/multifilesink/gstmultifilesink.h: - * gst/videodrop/gstvideodrop.c: (gst_videodrop_init): - * sys/cdrom/gstcdplayer.c: (cdplayer_init): - * sys/dxr3/dxr3audiosink.c: (dxr3audiosink_init), - (dxr3audiosink_open), (dxr3audiosink_close), - (dxr3audiosink_chain_pcm), (dxr3audiosink_chain_ac3), - (dxr3audiosink_change_state): - * sys/dxr3/dxr3audiosink.h: - * sys/dxr3/dxr3spusink.c: (dxr3spusink_init), (dxr3spusink_open), - (dxr3spusink_close), (dxr3spusink_chain), - (dxr3spusink_change_state): - * sys/dxr3/dxr3spusink.h: - * sys/dxr3/dxr3videosink.c: (dxr3videosink_init), - (dxr3videosink_open), (dxr3videosink_close), - (dxr3videosink_write_data), (dxr3videosink_change_state): - * sys/dxr3/dxr3videosink.h: - * sys/glsink/glimagesink.c: (gst_glimagesink_init): - * sys/qcam/gstqcamsrc.c: (gst_qcamsrc_change_state), - (gst_qcamsrc_open), (gst_qcamsrc_close): - * sys/qcam/gstqcamsrc.h: - * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init): - * sys/vcd/vcdsrc.c: (gst_vcdsrc_set_property), (gst_vcdsrc_get), - (gst_vcdsrc_open_file), (gst_vcdsrc_close_file), - (gst_vcdsrc_change_state), (gst_vcdsrc_recalculate): - * sys/vcd/vcdsrc.h: - renamed GST_FLAGS macros to GST_OBJECT_FLAGS - moved bitshift from macro to enum definition - -2005-10-12 13:54:34 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/faac/gstfaac.c: Fix depth/width handling for float audio (#318659). - Original commit message from CVS: - Reviewed by: Tim-Philipp Müller <tim at centricular dot net> - * ext/faac/gstfaac.c: (gst_faac_sink_setcaps): - Fix depth/width handling for float audio (#318659). - -2005-10-12 12:53:07 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/faac/gstfaac.c: Refcount fixes (#318659) - Original commit message from CVS: - Reviewed by: Tim-Philipp Müller <tim at centricular dot net> - * ext/faac/gstfaac.c: (gst_faac_sink_setcaps), - (gst_faac_src_setcaps), (gst_faac_chain): - Refcount fixes (#318659) - -2005-10-12 09:15:40 +0000 Julien Moutte <julien@moutte.net> - - ext/Makefile.am: libvisual and snapshot are not here anymore. - Original commit message from CVS: - 2005-10-12 Julien MOUTTE <julien@moutte.net> - * ext/Makefile.am: libvisual and snapshot are not here anymore. - Makes - automake-1.7 happy again. - -2005-10-11 23:03:09 +0000 Tim-Philipp Müller <tim@centricular.net> - - ext/faad/gstfaad.c: newsegment API update - Original commit message from CVS: - * ext/faad/gstfaad.c: (gst_faad_event): - newsegment API update - -2005-10-11 16:34:36 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/: newsegment API update. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): - * gst/tta/gstttaparse.c: (gst_tta_parse_src_event), - (gst_tta_parse_parse_header): - newsegment API update. - -2005-10-07 15:24:24 +0000 Andy Wingo <wingo@pobox.com> - - ext/raw1394/gstdv1394src.c: Make interruptible, so it won't block forever in a read(). - Original commit message from CVS: - 2005-10-07 Andy Wingo <wingo@pobox.com> - * ext/raw1394/gstdv1394src.c: Make interruptible, so it won't - block forever in a read(). - -2005-10-04 15:49:35 +0000 Christian Schaller <uraeus@gnome.org> - - * gst-plugins-bad.spec.in: - fix spec file - Original commit message from CVS: - fix spec file +2021-12-07 21:29:05 +0900 Seungha Yang <seungha@centricular.com> -2005-10-03 18:00:32 +0000 Thomas Vander Stichele <thomas@apestaart.org> + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + d3d11memory: Inform subresource index via GstMapInfo::user_data + By using this way, caller does not need to call another method + gst_d3d11_memory_get_subresource_index() + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1408> - * ChangeLog: - * configure.ac: - back to head - Original commit message from CVS: - back to head +2022-02-06 21:36:28 +0900 Seungha Yang <seungha@centricular.com> -=== release 0.9.3 === + * gst-libs/gst/d3d11/gstd3d11bufferpool.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.cpp: + * gst-libs/gst/d3d11/gstd3d11memory.h: + * gst-libs/gst/d3d11/gstd3d11stagingbufferpool.cpp: + * sys/d3d11/gstd3d11pluginutils.cpp: + d3d11memory: Add support for ID3D11Buffer + Allow wrap ID3D11Buffer via GstD3D11Memory object + At the moment, only staging ID3D11Buffer is supported. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1408> -2005-10-03 17:50:21 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2022-02-01 00:50:53 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * NEWS: - * RELEASE: - * common: - * configure.ac: - * po/af.po: - * po/az.po: - * po/cs.po: - * po/en_GB.po: - * po/hu.po: - * po/it.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - release time - Original commit message from CVS: - release time - -2005-09-28 13:38:02 +0000 Wim Taymans <wim.taymans@gmail.com> - - gst/qtdemux/qtdemux.c: No need to take stream lock here. - Original commit message from CVS: - * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header): - No need to take stream lock here. - -2005-09-26 17:57:56 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * configure.ac: - fix build - Original commit message from CVS: - fix build + * sys/nvcodec/gstnvh265dec.c: + nvh265sldec: Fix for decoding 12bits stream + We've been exposing main-444-12 profile as a supported profile + in its sinkpad template but not actaully. Adding code to + covert 12 and 16 bits as well. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1612> -2005-09-26 15:19:38 +0000 Christian Schaller <uraeus@gnome.org> +2022-02-01 00:12:06 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * common: - * configure.ac: - * gst/librfb/Makefile.am: - some disting and build fixes - Original commit message from CVS: - some disting and build fixes + * sys/nvcodec/gstnvdecoder.c: + * sys/nvcodec/gstnvdecoder.h: + * sys/nvcodec/gstnvh264dec.c: + * sys/nvcodec/gstnvh265dec.c: + * sys/nvcodec/gstnvvp8dec.c: + * sys/nvcodec/gstnvvp9dec.c: + nvdecoder: Fix for HEVC 4:4:4 format decoding + Map chroma_format_idc == 3 (which means 4:4:4 subsampling) correctly, + also pass coded bitdepth for decoder initialization instead of + inferring it from output format since they can be different. + Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/949 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1612> -2005-09-23 17:05:29 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-07 22:38:02 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * PORTED_09: - * ext/gsm/Makefile.am: - * ext/gsm/gstgsm.c: - * ext/gsm/gstgsmdec.c: - Gsmdec ported to 0.9. Tested with filesrc ! gsmdec ! alsasink and osssink. - Original commit message from CVS: - Gsmdec ported to 0.9. Tested with filesrc ! gsmdec ! alsasink and osssink. - -2005-09-23 16:40:27 +0000 David Schleef <ds@schleef.org> - - gst/audioresample/: Convert to using gst debugging - Original commit message from CVS: - * gst/audioresample/Makefile.am: - * gst/audioresample/debug.h: - * gst/audioresample/gstaudioresample.c: - * gst/audioresample/resample.c: Convert to using gst debugging - -2005-09-23 04:22:54 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * ext/ladspa/Makefile.am: - fix build and use of GST_LIBS - Original commit message from CVS: - fix build and use of GST_LIBS + * gst-libs/gst/d3d11/gstd3d11stagingbufferpool.cpp: + d3d11stagingbufferpool: Fix typo in texture description + Fixing typo, it should be height + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1652> -2005-09-22 11:17:26 +0000 Arwed v. Merkatz <v.merkatz@gmx.net> +2021-10-27 11:08:39 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * configure.ac: - * gst/tta/gstttadec.c: - * gst/tta/gstttaparse.c: - * gst/tta/gstttaparse.h: - tta plugin ported to 0.9 - Original commit message from CVS: - tta plugin ported to 0.9 + * gst-libs/gst/va/gstva.h: + * gst-libs/gst/va/meson.build: + * sys/va/gstvaallocator.h: + * sys/va/gstvabasedec.c: + * sys/va/gstvabasetransform.c: + * sys/va/gstvacaps.h: + * sys/va/gstvadecoder.c: + * sys/va/gstvadecoder.h: + * sys/va/gstvadeinterlace.c: + * sys/va/gstvadevice.h: + * sys/va/gstvafilter.h: + * sys/va/gstvasurfacecopy.h: + * sys/va/gstvavpp.c: + * sys/va/vasurfaceimage.h: + * tests/examples/va/main.c: + * tests/examples/va/multiple-vpp.c: + va: Add a gstva.h to include all va lib header files. + And replacing all va lib headers with this new header files + when including. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1256> -2005-09-21 20:33:42 +0000 Flavio Oliveira <flavio.oliveira@indt.org.br> +2021-10-07 14:31:28 +0800 He Junyan <junyan.he@intel.com> - * ChangeLog: - * ext/gsm/gstgsmenc.c: - Setting caps on the outgoing buffers. - Original commit message from CVS: - Setting caps on the outgoing buffers. - -2005-09-20 19:25:12 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * ext/sdl/Makefile.am: - fix Makefile.am ugh - Original commit message from CVS: - fix Makefile.am ugh + * gst-libs/gst/va/gstvautils.c: + * gst-libs/gst/va/gstvautils.h: + * gst-libs/gst/va/meson.build: + * sys/va/gstvabasedec.c: + * sys/va/gstvabasetransform.c: + * sys/va/gstvadeinterlace.c: + * sys/va/gstvavpp.c: + * sys/va/meson.build: + va: Move the vautils into the gst va lib. + The context query and handle are common logic for all va related + elements. So we move it from va plugins to the common gst va lib. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1256> -2005-09-20 18:49:05 +0000 Edgard Lima <edgard.lima@indt.org.br> +2021-10-24 22:07:38 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * common: - * configure.ac: - * ext/sdl/Makefile.am: - Fixed configure.ac and ext/sdl/Makefile.am for sdl port to 0.9. - Original commit message from CVS: - Fixed configure.ac and ext/sdl/Makefile.am for sdl port to 0.9. + * gst-libs/gst/codecs/gsth264decoder.h: + * gst-libs/gst/codecs/gstmpeg2decoder.h: + * sys/d3d11/gstd3d11h264dec.cpp: + * sys/d3d11/gstd3d11mpeg2dec.cpp: + * sys/nvcodec/gstnvh264dec.c: + * sys/v4l2codecs/gstv4l2codech264dec.c: + * sys/va/gstvah264dec.c: + * sys/va/gstvampeg2dec.c: + codecs: Stop claiming constness for refcounted object + It's almost pointless and makes little sense as subclass might + want to modify refcount of the object or so. And all subclasses + are already casting them to non-const version as well. + In a general sense, we need to avoid passing refcounted object + with const qualifier. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1238> -2005-09-19 21:51:02 +0000 Edgard Lima <edgard.lima@indt.org.br> +2022-02-06 01:06:36 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - sdlvideosink ported to 0.9 and tested with filesrc ! mpeg2dec - Original commit message from CVS: - sdlvideosink ported to 0.9 and tested with filesrc ! mpeg2dec - -2005-09-19 21:47:54 +0000 Edgard Lima <edgard.lima@indt.org.br> - - * PORTED_09: - * configure.ac: - * ext/Makefile.am: - * ext/sdl/Makefile.am: - * ext/sdl/sdlvideosink.c: - sdlvideosink ported to 0.9 and tested with filesrc ! mpeg2dec - Original commit message from CVS: - sdlvideosink ported to 0.9 and tested with filesrc ! mpeg2dec - -2005-09-19 16:44:37 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * Makefile.am: - * common: - add check-valgrind target - Original commit message from CVS: - add check-valgrind target - -2005-09-09 17:53:47 +0000 Jan Schmidt <thaytan@mad.scientist.com> - - check/: Add extra tests for basetransform based components. - Original commit message from CVS: - * check/Makefile.am: - * check/pipelines/simple_launch_lines.c: (setup_pipeline), - (run_pipeline), (GST_START_TEST), (simple_launch_lines_suite): - Add extra tests for basetransform based components. - Comment out the test_element_negotiation test until we decide - if it's testing correct behaviour. - * ext/libvisual/visual.c: (gst_visual_init), (get_buffer), - (gst_visual_chain), (gst_visual_change_state): - Slightly more correct but still bogus timestamping. - Fix state change function. - * gst/audioconvert/gstaudioconvert.c: - (gst_audio_convert_class_init): - * gst/audioresample/gstaudioresample.c: - * gst/ffmpegcolorspace/gstffmpegcolorspace.c: - (gst_ffmpegcsp_class_init): - * gst/videoscale/gstvideoscale.c: (gst_videoscale_class_init), - (gst_videoscale_prepare_size), (gst_videoscale_set_caps), - (gst_videoscale_prepare_image): - * gst/volume/gstvolume.c: (gst_volume_class_init), - (volume_transform_ip): - Basetransform updates. Enable passthrough modes. - * sys/ximage/ximagesink.c: (gst_ximage_buffer_init), - (gst_ximagesink_renegotiate_size), (gst_ximagesink_xcontext_get), - (gst_ximagesink_setcaps), (gst_ximagesink_buffer_alloc): - Negotiation fix that allows the window to return to the original - size and renegotiate passthrough upstream. Extra debug output. + * sys/d3d11/gstd3d11videosink.cpp: + d3d11videosink: Use staging buffer pool for non-d3d11 upstream + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1643> -2005-09-08 15:56:38 +0000 Flavio Oliveira <flavio.oliveira@indt.org.br> +2022-02-06 00:53:34 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * PORTED_09: - * configure.ac: - * gst/speed/Makefile.am: - * gst/speed/gstspeed.c: - Ported speed Plugin to GStreamer 0.9 - Original commit message from CVS: - Ported speed Plugin to GStreamer 0.9 + * sys/d3d11/gstd3d11download.cpp: + * sys/d3d11/gstd3d11upload.cpp: + d3d11upload,d3d11download: Use staging buffer pool + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1643> -2005-09-06 14:06:55 +0000 Thomas Vander Stichele <thomas@apestaart.org> +2022-02-05 23:25:12 +0900 Seungha Yang <seungha@centricular.com> - * configure.ac: - back to HEAD - Original commit message from CVS: - back to HEAD + * sys/d3d11/gstd3d11decoder.cpp: + d3d11decoder: Use staging buffer pool for non-d3d11 downstream + In specific condition, this can show about 10% ~ 30% + performance gain with non-d3d11 downstream element. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1643> -=== release 0.9.1 === +2022-02-05 23:08:48 +0900 Seungha Yang <seungha@centricular.com> -2005-09-06 14:05:50 +0000 Thomas Vander Stichele <thomas@apestaart.org> + * gst-libs/gst/d3d11/gstd3d11.h: + * gst-libs/gst/d3d11/gstd3d11_fwd.h: + * gst-libs/gst/d3d11/gstd3d11stagingbufferpool.cpp: + * gst-libs/gst/d3d11/gstd3d11stagingbufferpool.h: + * gst-libs/gst/d3d11/meson.build: + d3d11: Add new buffer pool implementation for staging texture + staging buffer pool will allocate staging d3d11 texture + for upload/download optimization. By using staging buffer, + we can avoid per frame staging -> system memory copy operation. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1643> - * ChangeLog: - * Makefile.am: - * NEWS: - * README: - * RELEASE: - * autogen.sh: - * common: - * configure.ac: - * gst-plugins.spec.in: - * po/af.po: - * po/az.po: - * po/cs.po: - * po/en_GB.po: - * po/hu.po: - * po/it.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - releasing 0.9.1 - Original commit message from CVS: - releasing 0.9.1 +2022-02-02 00:15:34 -0300 Martin Reboredo <yakoyoku@gmail.com> -2005-09-05 17:20:29 +0000 Jan Schmidt <thaytan@mad.scientist.com> + * gst-libs/gst/vulkan/gstvkerror.c: + * gst-libs/gst/vulkan/gstvkerror.h: + gstvulkan: Expose gst_vulkan_result_to_string + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1623> - * ChangeLog: - * examples/gstplay/player.c: - * examples/stats/mp2ogg.c: - * ext/artsd/gstartsdsink.c: - * ext/audiofile/gstafsink.c: - * ext/audiofile/gstafsrc.c: - * ext/cdaudio/gstcdaudio.c: - * ext/dirac/gstdiracdec.cc: - * ext/directfb/directfbvideosink.c: - * ext/dts/gstdtsdec.c: - * ext/faac/gstfaac.c: - * ext/hermes/gsthermescolorspace.c: - * ext/ivorbis/vorbisfile.c: - * ext/jack/gstjack.c: - * ext/jack/gstjackbin.c: - * ext/lcs/gstcolorspace.c: - * ext/libmms/gstmms.c: - * ext/mpeg2enc/gstmpeg2enc.cc: - * ext/mplex/gstmplex.cc: - * ext/musepack/gstmusepackdec.c: - * ext/musicbrainz/gsttrm.c: - * ext/nas/nassink.c: - * ext/polyp/polypsink.c: - * ext/sdl/sdlvideosink.c: - * ext/shout/gstshout.c: - * ext/smoothwave/gstsmoothwave.c: - * ext/sndfile/gstsf.c: - * ext/swfdec/gstswfdec.c: - * ext/tarkin/gsttarkindec.c: - * ext/xine/xine.c: - * ext/xine/xineaudiodec.c: - * ext/xine/xineaudiosink.c: - * ext/xine/xineinput.c: - * ext/xvid/gstxviddec.c: - * ext/xvid/gstxvidenc.c: - * gst/apetag/apedemux.c: - * gst/cdxaparse/gstcdxaparse.c: - * gst/cdxaparse/gstcdxastrip.c: - * gst/cdxaparse/gstvcdparse.c: - * gst/colorspace/gstcolorspace.c: - * gst/festival/gstfestival.c: - * gst/librfb/gstrfbsrc.c: - * gst/modplug/gstmodplug.cc: - * gst/mpeg1videoparse/gstmp1videoparse.c: - * gst/mpegaudioparse/gstmpegaudioparse.c: - * gst/multifilesink/gstmultifilesink.c: - * gst/smoothwave/gstsmoothwave.c: - * gst/speed/gstspeed.c: - * gst/switch/gstswitch.c: - * gst/videocrop/gstvideocrop.c: - * gst/videodrop/gstvideodrop.c: - * gst/y4m/gsty4mencode.c: - * po/af.po: - * po/az.po: - * po/cs.po: - * po/en_GB.po: - * po/hu.po: - * po/it.po: - * po/nb.po: - * po/nl.po: - * po/or.po: - * po/sq.po: - * po/sr.po: - * po/sv.po: - * po/uk.po: - * po/vi.po: - * sys/cdrom/gstcdplayer.c: - * sys/dxr3/dxr3audiosink.c: - * sys/dxr3/dxr3spusink.c: - * sys/dxr3/dxr3videosink.c: - * sys/glsink/glimagesink.c: - * sys/qcam/gstqcamsrc.c: - * sys/sunaudio/gstsunaudio.c: - * sys/sunaudio/gstsunaudiosrc.c: - * sys/sunaudio/gstsunelement.c: - * sys/v4l2/gstv4l2element.c: - * sys/v4l2/gstv4l2src.c: - * sys/vcd/vcdsrc.c: - Fix up all the state change functions. - Original commit message from CVS: - Fix up all the state change functions. - -2005-09-05 15:10:18 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - * Makefile.am: - * configure.ac: - * ext/faad/gstfaad.c: - * gst-plugins-bad.spec.in: - * gst/qtdemux/qtdemux.c: - * po/POTFILES.in: - cleaning up bad - Original commit message from CVS: - cleaning up bad +2022-02-05 17:36:41 +0300 Igor V. Kovalenko <igor.v.kovalenko@gmail.com> -2005-09-05 13:49:41 +0000 Thomas Vander Stichele <thomas@apestaart.org> + * meson_options.txt: + qroverlay: move to plugins that need external deps + qroverlay requires libqrencode dependency, move it next to similar plugins. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1642> - * ChangeLog: - * common: - * docs/random/ChangeLog-0.8: - * ext/Makefile.am: - created gst-plugins-bad - Original commit message from CVS: - created gst-plugins-bad - -=== release 0.9.2 === - -2005-09-04 10:38:45 +0000 Thomas Vander Stichele <thomas@apestaart.org> - - fix distcheck - Original commit message from CVS: - * common/gtk-doc-plugins.mak: - * docs/plugins/Makefile.am: - fix distcheck - * gst/audioresample/resample.c: - fix wrong docstring +2022-02-04 11:15:47 +0000 Tim-Philipp Müller <tim@centricular.com> -2005-09-02 20:21:17 +0000 Flavio Oliveira <flavio.oliveira@indt.org.br> + * meson.build: + Back to development + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1635> - * ChangeLog: - * PORTED_09: - * configure.ac: - * ext/Makefile.am: - * ext/gsm/Makefile.am: - * ext/gsm/gstgsm.c: - * ext/gsm/gstgsmenc.c: - Ported GSM Encoder to GStreamer 0.9 - Original commit message from CVS: - Ported GSM Encoder to GStreamer 0.9 - -2005-09-02 15:44:44 +0000 Andy Wingo <wingo@pobox.com> - - * ext/ladspa/gstsignalprocessor.c: - All plugins updated for element state changes. - Original commit message from CVS: - 2005-09-02 Andy Wingo <wingo@pobox.com> - * All plugins updated for element state changes. - -2005-09-02 15:43:14 +0000 Andy Wingo <wingo@pobox.com> - - * common: - * tests/check/elements/audioresample.c: - All plugins updated for element state changes. - Original commit message from CVS: - 2005-09-02 Andy Wingo <wingo@pobox.com> - * All plugins updated for element state changes. - -2005-09-01 19:53:12 +0000 Flavio Oliveira <flavio.oliveira@indt.org.br> - - * PORTED_09: - update PORTED_09 file - Original commit message from CVS: - update PORTED_09 file +=== release 1.20.0 ===
View file
gst-plugins-bad-1.20.5.tar.xz/NEWS -> gst-plugins-bad-1.22.0.tar.xz/NEWS
Changed
@@ -1,14 +1,11 @@ -GStreamer 1.20 Release Notes +GStreamer 1.22 Release Notes -GStreamer 1.20.0 was originally released on 3 February 2022. +GStreamer 1.22.0 was originally released on 23 January 2023. -The latest bug-fix release in the 1.20 series is 1.20.5 and was released -on 19 December 2022. - -See https://gstreamer.freedesktop.org/releases/1.20/ for the latest +See https://gstreamer.freedesktop.org/releases/1.22/ for the latest version of this document. -Last updated: Monday 19 December 2022, 19:00 UTC (log) +Last updated: Monday 23 January 2023, 17:00 UTC (log) Introduction @@ -21,3038 +18,1222 @@ Highlights -- Development in GitLab was switched to a single git repository - containing all the modules -- GstPlay: new high-level playback library, replaces GstPlayer -- WebM Alpha decoding support -- Encoding profiles can now be tweaked with additional - application-specified element properties -- Compositor: multi-threaded video conversion and mixing -- RTP header extensions: unified support in RTP depayloader and - payloader base classes -- SMPTE 2022-1 2-D Forward Error Correction support -- Smart encoding (pass through) support for VP8, VP9, H.265 in - encodebin and transcodebin -- Runtime compatibility support for libsoup2 and libsoup3 (libsoup3 - support experimental) -- Video decoder subframe support -- Video decoder automatic packet-loss, data corruption, and keyframe - request handling for RTP / WebRTC / RTSP -- mp4 and Matroska muxers now support profile/level/resolution changes - for H.264/H.265 input streams (i.e. codec data changing on the fly) -- mp4 muxing mode that initially creates a fragmented mp4 which is - converted to a regular mp4 on EOS -- Audio support for the WebKit Port for Embedded (WPE) web page source - element -- CUDA based video color space convert and rescale elements and - upload/download elements -- NVIDIA memory:NVMM support for OpenGL glupload and gldownload - elements -- Many WebRTC improvements -- The new VA-API plugin implementation fleshed out with more decoders - and new postproc elements -- AppSink API to retrieve events in addition to buffers and buffer - lists -- AppSrc gained more configuration options for the internal queue - (leakiness, limits in buffers and time, getters to read current - levels) -- Updated Rust bindings and many new Rust plugins -- Improved support for custom minimal GStreamer builds -- Support build against FFmpeg 5.0 -- Linux Stateless CODEC support gained MPEG-2 and VP9 -- Windows Direct3D11/DXVA decoder gained AV1 and MPEG-2 support +- AV1 video codec support improvements +- New HLS, DASH and Microsoft Smooth Streaming adaptive streaming + clients +- Qt6 support for rendering video inside a QML scene +- Minimal builds optimised for binary size, including only the + individual elements needed +- Playbin3, Decodebin3, UriDecodebin3, Parsebin enhancements and + stabilisation +- WebRTC simulcast support and support for Google Congestion Control +- WebRTC-based media server ingestion/egress (WHIP/WHEP) support +- New easy to use batteries-included WebRTC sender plugin +- Easy RTP sender timestamp reconstruction for RTP and RTSP +- ONVIF timed metadata support +- New fragmented MP4 muxer and non-fragmented MP4 muxer +- New plugins for Amazon AWS storage and audio transcription services +- New gtk4paintablesink and gtkwaylandsink renderers +- New videocolorscale element that can convert and scale in one go for + better performance +- High bit-depth video improvements +- Touchscreen event support in navigation API +- Rust plugins now shipped in macOS and Windows/MSVC binary packages +- H.264/H.265 timestamp correction elements for PTS/DTS reconstruction + before muxers +- Improved design for DMA buffer sharing and modifier handling for + hardware-accelerated video decoders/encoders/filters and + capturing/rendering on Linux +- Video4Linux2 hardware accelerated decoder improvements +- CUDA integration and Direct3D11 integration and plugin improvements +- New H.264 / AVC, H.265 / HEVC and AV1 hardware-accelerated video + encoders for AMD GPUs using the Advanced Media Framework (AMF) SDK +- applemedia: H.265 / HEVC video encoding + decoding support +- androidmedia: H.265 / HEVC video encoding support +- New “force-live” property for audiomixer, compositor, glvideomixer, + d3d11compositor etc. - Lots of new plugins, features, performance improvements and bug fixes Major new features and changes -Noteworthy new features and API +AV1 video codec support improvements -- gst_element_get_request_pad() has been deprecated in favour of the - newly-added gst_element_request_pad_simple() which does the exact - same thing but has a less confusing name that hopefully makes clear - that the function request a new pad rather than just retrieves an - already-existing request pad. - -Development in GitLab was switched to a single git repository containing all the modules - -The GStreamer multimedia framework is a set of libraries and plugins -split into a number of distinct modules which are released independently -and which have so far been developed in separate git repositories in -freedesktop.org GitLab. - -In addition to these separate git repositories there was a gst-build -module that would use the Meson build system’s subproject feature to -download each individual module and then build everything in one go. It -would also provide an uninstalled development environment that made it -easy to work on GStreamer and use or test versions other than the -system-installed GStreamer version. - -All of these modules have now (as of 28 September 2021) been merged into -a single git repository (“Mono repository” or “monorepo”) which should -simplify development workflows and continuous integration, especially -where changes need to be made to multiple modules at once. - -This mono repository merge will primarily affect GStreamer developers -and contributors and anyone who has workflows based on the GStreamer git -repositories. - -The Rust bindings and Rust plugins modules have not been merged into the -mono repository at this time because they follow a different release -cycle. - -The mono repository lives in the existing GStreamer core git repository -in GitLab in the new main branch and all future development will happen -on this branch. - -Modules will continue to be released as separate tarballs. - -For more details, please see the GStreamer mono repository FAQ. - -GstPlay: new high-level playback library replacing GstPlayer - -- GstPlay is a new high-level playback library that replaces the older - GstPlayer API. It is basically the same API as GstPlayer but - refactored to use bus messages for application notifications instead - of GObject signals. There is still a signal adapter object for those - who prefer signals. Since the existing GstPlayer API is already in - use in various applications, it didn’t seem like a good idea to - break it entirely. Instead a new API was added, and it is expected - that this new GstPlay API will be moved to gst-plugins-base in - future. +AV1 is a royalty free next-generation video codec by AOMedia and a free +alternative to H.265/HEVC. -- The existing GstPlayer API is scheduled for deprecation and will be - removed at some point in the future (e.g. in GStreamer 1.24), so - application developers are urged to migrate to the new GstPlay API - at their earliest convenience. - -WebM alpha decoding - -- Implement WebM alpha decoding (VP8/VP9 with alpha), which required - support and additions in various places. This is supported both with - software decoders and hardware-accelerated decoders. - -- VP8/VP9 don’t support alpha components natively in the codec, so the - way this is implemented in WebM is by encoding the alpha plane with - transparency data as a separate VP8/VP9 stream. Inside the WebM - container (a variant of Matroska) this is coded as a single video - track with the “normal” VP8/VP9 video data making up the main video - data and each frame of video having an encoded alpha frame attached - to it as extra data ("BlockAdditional"). - -- matroskademux has been extended extract this per-frame alpha side - data and attach it in form of a GstVideoCodecAlphaMeta to the - regular video buffers. Note that this new meta is specific to this - VP8/VP9 alpha support and can’t be used to just add alpha support to - other codecs that don’t support it. Lastly, matroskademux also - advertises the fact that the streams contain alpha in the caps. - -- The new codecalpha plugin contains various bits of infrastructure to - support autoplugging and debugging: - - - codecalphademux splits out the alpha stream from the metas on - the regular VP8/VP9 buffers - - alphacombine takes two decoded raw video streams (one alpha, one - the regular video) and combines it into a video stream with - alpha - - vp8alphadecodebin + vp9alphadecodebin are wrapper bins that use - the regular vp8dec and vp9dec software decoders to decode - regular and alpha streams and combine them again. To decodebin - these look like regular decoders. - - The V4L2 CODEC plugin has stateless VP8/VP9 decoders that can - decode both alpha and non-alpha stream with a single decoder - instance - -- A new AV12 video format was added which is basically NV12 with an - alpha plane, which is more convenient for many hardware-accelerated - decoders. - -- Watch Nicolas Dufresne’s LCA 2022 talk “Bringing WebM Alpha support - to GStreamer” for all the details and a demo. - -RTP Header Extensions Base Class and Automatic Header Extension Handling in RTP Payloaders and Depayloaders - -- RTP Header Extensions are specified in RFC 5285 and provide a way to - add small pieces of data to RTP packets in between the RTP header - and the RTP payload. This is often used for per-frame metadata, - extended timestamps or other application-specific extra data. There - are several commonly-used extensions specified in various RFCs, but - senders are free to put any kind of data in there, as long as sender - and receiver both know what that data is. Receivers that don’t know - about the header extensions will just skip the extra data without - ever looking at it. These header extensions can often be combined - with any kind of payload format, so may need to be supported by many - RTP payloader and depayloader elements. - -- Inserting and extracting RTP header extension data has so far been a - bit inconvenient in GStreamer: There are functions to add and - retrieve RTP header extension data from RTP packets, but nothing - works automatically, even for common extensions. People would have - to do the insertion/extraction either in custom elements - before/after the RTP payloader/depayloader, or inside pad probes, - which isn’t very nice. - -- This release adds various pieces of new infrastructure for generic - RTP header extension handling, as well as some implementations for - common extensions: - - - GstRTPHeaderExtension is a new helper base class for reading and - writing RTP header extensions. Nominally this subclasses - GstElement, but only so these extensions are stored in the - registry where they can be looked up by URI or name. They don’t - have pads and don’t get added to the pipeline graph as an - element. - - - "add-extension" and "clear-extension" action signals on RTP - payloaders and depayloaders for manual extension management - - - The "request-extension" signal will be emitted if an extension - is encountered that requires explicit mapping by the application - - - new "auto-header-extension" property on RTP payloaders and - depayloaders for automatic handling of known header extensions. - This is enabled by default. The extensions must be signalled via - caps / SDP. - - - RTP header extension implementations: - - - rtphdrextclientaudiolevel: Client-to-Mixer Audio Level - Indication (RFC 6464) (also see below) - - rtphdrextcolorspace: Color Space extension, extends RTP - packets with color space and high dynamic range (HDR) - information - - rtphdrexttwcc: Transport Wide Congestion Control support - -- gst_rtp_buffer_remove_extension_data() is a new helper function to - remove an RTP header extension from an RTP buffer - -- The existing gst_rtp_buffer_set_extension_data() now also supports - shrinking the extension data in size - -AppSink and AppSrc improvements - -- appsink: new API to pull events out of appsink in addition to - buffers and buffer lists. - - There was previously no way for users to receive incoming events - from appsink properly serialised with the data flow, even if they - are serialised events. The reason for that is that the only way to - intercept events was via a pad probe on the appsink sink pad, but - there is also internal queuing inside of appsink, so it’s difficult - to ascertain the right order of everything in all cases. - - There is now a new "new-serialized-event" signal which will be - emitted when there’s a new event pending (just like the existing - "new-sample" signal). The "emit-signals" property must be set to - TRUE in order to activate this (but it’s also fine to just pull from - the application thread without using the signals). - - gst_app_sink_pull_object() and gst_app_sink_try_pull_object() can be - used to pull out either an event or a new sample carrying a buffer - or buffer list, whatever is next in the queue. - - EOS events will be filtered and will not be returned. EOS handling - can be done the usual way, same as with _pull_sample(). - -- appsrc: allow configuration of internal queue limits in time and - buffers and add leaky mode. - - There is internal queuing inside appsrc so the application thread - can push data into the element which will then be picked up by the - source element’s streaming thread and pushed into the pipeline from - that streaming thread. This queue is unlimited by default and until - now it was only possible to set a maximum size limit in bytes. When - that byte limit is reached, the pushing thread (application thread) - would be blocked until more space becomes available. - - A limit in bytes is not particularly useful for many use cases, so - now it is possible to also configure limits in time and buffers - using the new "max-time" and "max-buffers" properties. Of course - there are also matching new read-only"current-level-buffers" and - "current-level-time properties" properties to query the current fill - level of the internal queue in time and buffers. - - And as if that wasn’t enough the internal queue can also be - configured as leaky using the new "leaky-type" property. That way - when the queue is full the application thread won’t be blocked when - it tries to push in more data, but instead either the new buffer - will be dropped or the oldest data in the queue will be dropped. - -Better string serialization of nested GstCaps and GstStructures - -- New string serialisation format for structs and caps that can handle - nested structs and caps properly by using brackets to delimit nested - items (e.g. some-struct, some-field=nested-struct, nested=true). - Unlike the default format the new variant can also support more than - one level of nesting. For backwards-compatibility reasons the old - format is still output by default when serialising caps and structs - using the existing API. The new functions gst_caps_serialize() and - gst_structure_serialize() can be used to output strings in the new - format. - -Convenience API for custom GstMetas - -- New convenience API to register and create custom GstMetas: - gst_meta_register_custom() and gst_buffer_add_custom_meta(). Such - custom meta is backed by a GstStructure and does not require that - users of the API expose their GstMeta implementation as public API - for other components to make use of it. In addition, it provides a - simpler interface by ignoring the impl vs. api distinction that the - regular API exposes. This new API is meant to be the meta - counterpart to custom events and messages, and to be more convenient - than the lower-level API when the absolute best performance isn’t a - requirement. The reason it’s less performant than a “proper” meta is - that a proper meta is just a C struct in the end whereas this goes - through the GstStructure API which has a bit more overhead, which - for most scenarios is negligible however. This new API is useful for - experimentation or proprietary metas, but also has some limitations: - it can only be used if there’s a single producer of these metas; - registering the same custom meta multiple times or from multiple - places is not allowed. - -Additional Element Properties on Encoding Profiles - -- GstEncodingProfile: The new "element-properties" and - gst_encoding_profile_set_element_properties() API allows - applications to set additional element properties on encoding - profiles to configure muxers and encoders. So far the encoding - profile template was the only place where this could be specified, - but often what applications want to do is take a ready-made encoding - profile shipped by GStreamer or the application and then tweak the - settings on top of that, which is now possible with this API. Since - applications can’t always know in advance what encoder element will - be used in the end, it’s even possible to specify properties on a - per-element basis. - - Encoding Profiles are used in the encodebin, transcodebin and - camerabin elements and APIs to configure output formats (containers - and elementary streams). - -Audio Level Indication Meta for RFC 6464 - -- New GstAudioLevelMeta containing Audio Level Indication as per RFC - 6464 - -- The level element has been updated to add GstAudioLevelMeta on - buffers if the "audio-level-meta" property is set to TRUE. This can - then in turn be picked up by RTP payloaders to signal the audio - level to receivers through RTP header extensions (see above). - -- New Client-to-Mixer Audio Level Indication (RFC6464) RTP Header - Extension which should be automatically created and used by RTP - payloaders and depayloaders if their "auto-header-extension" - property is enabled and if the extension is part of the RTP caps. - -Automatic packet loss, data corruption and keyframe request handling for video decoders - -- The GstVideoDecoder base class has gained various new APIs to - automatically handle packet loss and data corruption better by - default, especially in RTP, RTSP and WebRTC streaming scenarios, and - to give subclasses more control about how they want to handle - missing data: - - - Video decoder subclasses can mark output frames as corrupted via - the new GST_VIDEO_CODEC_FRAME_FLAG_CORRUPTED flag - - - A new "discard-corrupted-frames" property allows applications to - configure decoders so that corrupted frames are directly - discarded instead of being forwarded inside the pipeline. This - is a replacement for the "output-corrupt" property of the FFmpeg - decoders. - - - RTP depayloaders can now signal to decoders that data is missing - when sending GAP events for lost packets. GAP events can be sent - for various reason in a GStreamer pipeline. Often they are just - used to let downstream elements know that there isn’t a buffer - available at the moment, so downstream elements can move on - instead of waiting for one. They are also sent by RTP - depayloaders in the case that packets are missing, however, and - so far a decoder was not able to differentiate the two cases. - This has been remedied now: GAP events can be decorated with - gst_event_set_gap_flags() and GST_GAP_FLAG_MISSING_DATA to let - decoders now what happened, and decoders can then use that in - some cases to handle missing data better. - - - The GstVideoDecoder::handle_missing_data vfunc was added to - inform subclasses about packet loss or missing data and let them - handle it in their own way if they like. - - - gst_video_decoder_set_needs_sync_point() lets subclasses signal - that they need the stream to start with a sync point. If - enabled, the base class will discard all non-sync point frames - in the beginning and after a flush and does not pass them to the - subclass. Furthermore, if the first frame is not a sync point, - the base class will try and request a sync frame from upstream - by sending a force-key-unit event (see next items). - - - New "automatic-request-sync-points" and - "automatic-request-sync-point-flags" properties to automatically - request sync points when needed, e.g. on packet loss or if the - first frame is not a keyframe. Applications may want to enable - this on decoders operating in e.g. RTP/WebRTC/RTSP receiver - pipelines. - - - The new "min-force-key-unit-interval" property can be used to - ensure there’s a minimal interval between keyframe requests to - upstream (and/or the sender) and we’re not flooding the sender - with key unit requests. - - - gst_video_decoder_request_sync_point() allows subclasses to - request a new sync point (e.g. if they choose to do their own - missing data handling). This will still honour the - "min-force-key-unit-interval" property if set. - -Improved support for custom minimal GStreamer builds - -- Element registration and registration of other plugin features - inside plugin init functions has been improved in order to - facilitate minimal custom GStreamer builds. - -- A number of new macros have been added to declare and create - per-element and per-plugin feature register functions in all - plugins, and then call those from the per-plugin plugin_init - functions: - - - GST_ELEMENT_REGISTER_DEFINE, - GST_DEVICE_PROVIDER_REGISTER_DEFINE, - GST_DYNAMIC_TYPE_REGISTER_DEFINE, GST_TYPE_FIND_REGISTER_DEFINE - for the actual registration call with GStreamer - - GST_ELEMENT_REGISTER, GST_DEVICE_PROVIDER_REGISTER, - GST_DYNAMIC_TYPE_REGISTER, GST_PLUGIN_STATIC_REGISTER, - GST_TYPE_FIND_REGISTER to call the registration function defined - by the REGISTER_DEFINE macro - - GST_ELEMENT_REGISTER_DECLARE, - GST_DEVICE_PROVIDER_REGISTER_DECLARE, - GST_DYNAMIC_TYPE_REGISTER_DECLARE, - GST_TYPE_FIND_REGISTER_DECLARE to declare the registration - function defined by the REGISTER_DEFINE macro - - and various variants for advanced use cases. - -- This means that applications can call the per-element and per-plugin - feature registration functions for only the elements they need - instead of registering plugins as a whole with all kinds of elements - that may not be required (e.g. encoder and decoder instead of just - decoder). In case of static linking all unused functions and their - dependencies would be removed in this case by the linker, which - helps minimise binary size for custom builds. - -- gst_init() will automatically call a gst_init_static_plugins() - function if one exists. - -- See the GStreamer static build documentation and Stéphane’s blog - post Generate a minimal GStreamer build, tailored to your needs for - more details. - -New elements - -- New aesdec and aesenc elements for AES encryption and decryption in - a custom format. - -- New encodebin2 element with dynamic/sometimes source pads in order - to support the option of doing the muxing outside of encodebin, - e.g. in combination with a splitmuxsink. - -- New fakeaudiosink and videocodectestsink elements for testing and - debugging (see below for more details) - -- rtpisacpay, rtpisacdepay: new RTP payloader and depayloader for iSAC - audio codec - -- rtpst2022-1-fecdec, rtpst2022-1-fecenc: new elements providing SMPTE - 2022-1 2-D Forward Error Correction. More details in Mathieu’s blog - post. - -- isac: new plugin wrapping the Internet Speech Audio Codec reference - encoder and decoder from the WebRTC project. - -- asio: plugin for Steinberg ASIO (Audio Streaming Input/Output) API - -- gssrc, gssink: add source and sink for Google Cloud Storage - -- onnx: new plugin to apply ONNX neural network models to video - -- openaptx: aptX and aptX-HD codecs using libopenaptx (v0.2.0) - -- qroverlay, debugqroverlay: new elements that allow overlaying data - on top of video in the form of a QR code - -- cvtracker: new OpenCV-based tracker element - -- av1parse, vp9parse: new parsers for AV1 and VP9 video - -- va: work on the new VA-API plugin implementation for - hardware-accelerated video decoding and encoding has continued at - pace, with various new decoders and filters having joined the - initial vah264dec: - - - vah265dec: VA-API H.265 decoder - - vavp8dec: VA-API VP8 decoder - - vavp9dec: VA-API VP9 decoder - - vaav1dec: VA-API AV1 decoder - - vampeg2dec: VA-API MPEG-2 decoder - - vadeinterlace: : VA-API deinterlace filter - - vapostproc: : VA-API postproc filter (color conversion, - resizing, cropping, color balance, video rotation, skin tone - enhancement, denoise, sharpen) - - See Víctor’s blog post “GstVA in GStreamer 1.20” for more details - and what’s coming up next. - -- vaapiav1dec: new AV1 decoder element (in gstreamer-vaapi) - -- msdkav1dec: hardware-accelerated AV1 decoder using the Intel Media - SDK / oneVPL - -- nvcodec plugin for NVIDIA NVCODEC API for hardware-accelerated video - encoding and decoding: - - - cudaconvert, cudascale: new CUDA based video color space convert - and rescale elements - - cudaupload, cudadownload: new helper elements for memory - transfer between CUDA and system memory spaces - - nvvp8sldec, nvvp9sldec: new GstCodecs-based VP8/VP9 decoders - -- Various new hardware-accelerated elements for Windows: - - - d3d11screencapturesrc: new desktop capture element, including a - GstDeviceProvider implementation to enumerate/select target - monitors for capture. - - d3d11av1dec and d3d11mpeg2dec: AV1 and MPEG-2 decoders - - d3d11deinterlace: deinterlacing filter - - d3d11compositor: video composing element - - see Windows section below for more details - -- new Rust plugins: - - - audiornnoise: Removes noise from an audio stream - - awstranscribeparse: Parses AWS audio transcripts into timed text - buffers - - ccdetect: Detects if valid closed captions are present in a - closed captions stream - - cea608tojson: Converts CEA-608 Closed Captions to a JSON - representation - - cmafmux: CMAF fragmented mp4 muxer - - dashmp4mux: DASH fragmented mp4 muxer - - isofmp4mux: ISO fragmented mp4 muxer - - ebur128level: EBU R128 Loudness Level Measurement - - ffv1dec: FFV1 video decoder - - gtk4paintablesink: GTK4 video sink, which provides a - GdkPaintable that can be rendered in various widgets - - hlssink3: HTTP Live Streaming sink - - hrtfrender: Head-Related Transfer Function (HRTF) renderer - - hsvdetector: HSV colorspace detector - - hsvfilter: HSV colorspace filter - - jsongstenc: Wraps buffers containing any valid top-level JSON - structures into higher level JSON objects, and outputs those as - ndjson - - jsongstparse: Parses ndjson as output by jsongstenc - - jsontovtt: converts JSON to WebVTT subtitles - - regex: Applies regular expression operations on text - - roundedcorners: Adds rounded corners to video - - spotifyaudiosrc: Spotify source - - textahead: Display upcoming text buffers ahead (e.g. for - Karaoke) - - transcriberbin: passthrough bin that transcribes raw audio to - closed captions using awstranscriber and puts the captions as - metas onto the video - - tttojson: Converts timed text to a JSON representation - - uriplaylistbin: Playlist source bin - - webpdec-rs: WebP image decoder with animation support - -- New plugin codecalpha with elements to assist with WebM Alpha - decoding - - - codecalphademux: Split stream with GstVideoCodecAlphaMeta into - two streams - - alphacombine: Combine two raw video stream (I420 or NV12) as one - stream with alpha channel (A420 or AV12) - - vp8alphadecodebin: A bin to handle software decoding of VP8 with - alpha - - vp9alphadecodebin: A bin to handle software decoding of VP9 with - alpha - -- New hardware accelerated elements for Linux: - - - v4l2slmpeg2dec: Support for Linux Stateless MPEG-2 decoders - - v4l2slvp9dec: Support for Linux Stateless VP9 decoders - - v4l2slvp8alphadecodebin: Support HW accelerated VP8 with alpha - layer decoding - - v4l2slvp9alphadecodebin: Support HW accelerated VP9 with alpha - layer decoding +While supported in earlier versions of GStreamer already, this release +saw a lot of improvements across the board: -New element features and additions +- Support for hardware encoding and decoding via VAAPI/VA, AMF, D3D11, + NVCODEC, QSV and Intel MediaSDK. Hardware codecs for AV1 are slowly + becoming available in embedded systems and desktop GPUs (AMD, Intel, + NVIDIA), and these can now be used via GStreamer. + +- New AV1 RTP payloader and depayloader elements. + +- New encoder settings in the AOM reference encoder-based av1enc + element. + +- Various improvements in the AV1 parser and in the MP4/Matroska/WebM + muxers/demuxers. + +- dav1d and rav1e based software decoder/encoder elements shipped as + part of the binaries. + +- AV1 parser improvements and various bugfixes all over the place. + +Touchscreen event support in Navigation API + +The Navigation API supports the sending of key press events and mouse +events through a GStreamer pipeline. Typically these will be picked up +by a video sink on which these events happen and then the event is +transmitted into the pipeline so it can be handled by elements inside +the pipeline if it wasn’t handled by the application. + +This has traditionally been used for DVD menu support, but can also be +used to forward such inputs to source elements that render a web page +using a browser engine such as WebKit or Chromium. + +This API has now gained support for touchscreen events, and this has +been implemented in various plugins such as the GTK, Qt, XV, and x11 +video sinks as well as the wpevideosrc element. + +GStreamer CUDA integration + +- New gst-cuda library +- integration with D3D11 and NVIDIA dGPU NVMM elements +- new cudaconvertscale element + +GStreamer Direct3D11 integration + +- New gst-d3d11 public library + - gst-d3d11 library is not integrated with GStreamer documentation + system yet. Please refer to the examples +- d3d11screencapture: Add Windows Graphics Capture API based capture + mode, including Win32 application window capturing +- d3d11videosink and d3d11convert can support flip/rotation and crop + meta +- d3d11videosink: New emit-present property and present signal so that + applications can overlay an image on Direct3D11 swapchain’s + backbuffer via Direct3D/Direct2D APIs. See also C++ and Rust + examples +- d3d11compositor supports YUV blending/composing without intermediate + RGB(A) conversion to improve performance +- Direct3D11 video decoders are promoted to GST_RANK_PRIMARY or + higher, except for the MPEG2 decoder + +H.264/H.265 timestamp correction elements + +- Muxers are often picky and need proper PTS/DTS timestamps set on the + input buffers, but that can be a problem if the encoded input media + stream comes from a source that doesn’t provide proper signalling of + DTS, such as is often the case for RTP, RTSP and WebRTC streams or + Matroska container files. Theoretically parsers should be able to + fix this up, but it would probably require fairly invasive changes + in the parsers, so two new elements h264timestamper and + h265timestamper bridge the gap in the meantime and can reconstruct + missing PTS/DTS. + +Easy sender timestamp reconstruction for RTP and RTSP + +- it was always possible to reconstruct and retrieve the original RTP + sender timestamps in GStreamer, but required a fair bit of + understanding of the internal mechanisms and the right property + configuration and clock setup. + +- rtspsrc and rtpjitterbuffer gained a new + “add-reference-timestamp-meta” property that if set puts the + original absolute reconstructed sender timestamps on the output + buffers via a meta. This is particularly useful if the sender is + synced to an NTP clock or PTP clock. The original sender timestamps + are either based on the RTCP NTP times, NTP RTP header extensions + (RFC6051) or RFC7273-style clock signalling. + +Qt6 support + +- new qml6glsink element for Qt6 similar to the existing Qt5 element. + Matching source and overlay elements will hopefully follow in the + near future. + +OpenGL + Video library enhancements + +- Support for new video formats (NV12_4L4, NV12_16L32S, NV12_8L128, + NV12_10BE_8L128) and dmabuf import in more formats (Y410, Y212_LE, + Y212_BE, Y210, NV21, NV61) + +- Improved support for tiled formats with arbitrary tile dimensions, + as needed by certain hardware decoders/encoders + +- glvideomixer: New “crop-left,”crop-right, “crop-top” and + “crop-bottom” pad properties for cropping inputs + +- OpenGL support for gst_video_sample_convert(): + + - Used for video snapshotting and thumbnailing, to convert buffers + retrieved from appsinks or sink “last-sample” properties in + JPG/PNG thumbnails. + - This function can now take samples and buffers backed by GL + textures as input and will automatically plug a gldownload + element in that case. + +High bit-depth support (10, 12, 16 bits per component value) improvements + +- compositor can now handle any supported input format and also mix + high-bitdepth (10-16 bit) formats (naively) + +- videoflip has gained support for higher bit depth formats. + +- vp9enc, vp9dec now support 12-bit formats and also 10-bit 4:4:4 + +WebRTC + +- Allow insertion of bandwidth estimation elements e.g. for Google + Congestion Control (GCC) support + +- Initial support for sending or receiving simulcast streams + +- Support for asynchronous host resolution for STUN/TURN servers + +- GstWebRTCICE was split into base classes and implementation to make + it possible to plug custom ICE implementations + +- webrtcsink: batteries-included WebRTC sender (Rust) + +- whipsink: WebRTC HTTP ingest (WHIP) to a MediaServer (Rust) + +- whepsrc: WebRTC HTTP egress (WHEP) from a MediaServer (Rust) + +- Many other improvements and bug fixes + +New HLS, DASH and MSS adaptive streaming clients + +A new set of “adaptive demuxers” to support HLS, DASH and MSS adaptive +streaming protocols has been added. They provide improved performance, +new features and better stream compatibility compared to the previous +elements. These new elements require a “streams-aware” pipeline such as +playbin3, uridecodebin3 or urisourcebin. + +The previous elements’ design prevented implementing several use-cases +and fixing long-standing issues. The new elements were re-designed from +scratch to tackle those: + +- Scheduling Only 3 threads are present, regardless of the number of + streams selected. One in charge of downloading fragments and + manifests, one in charge of outputting parsed data downstream, and + one in charge of scheduling. This improves performance, resource + usage and latency. + +- Better download control The elements now directly control the + scheduling and download of manifests and fragments using libsoup + directly instead of depending on external elements for downloading. + +- Stream selection, only the selected streams are downloaded. This + improves bandwith usage. Switching stream is done in such a way to + ensure there are no gaps, meaning the new stream will be switched to + only once enough data for it has been downloaded. + +- Internal parsing, the downloaded streams are parsed internally. This + allows the element to fully respect the various specifications and + offer accurate buffering, seeking and playback. This is especially + important for HLS streams which require parsing for proper + positioning of streams. + +- Buffering and adaptive rate switching, the new elements handle + buffering internally which allows them to have a more accurate + visibility of which bandwith variant to switch to. + +Playbin3, Decodebin3, UriDecodebin3, Parsebin improvements + +The “new” playback elements introduced in 1.18 (playbin3 and its various +components) have been refactored to allow more use-cases and improve +performance. They are no longer considered experimental, so applications +using the legacy playback elements (playbin and (uri)decodebin) can +migrate to the new components to benefit from these improvements. + +- Gapless The “gapless” feature allows files and streams to be + fetched, buffered and decoded in order to provide a “gapless” + output. This feature has been refactored extensively in the new + components: + - A single (uri)decodebin3 (and therefore a single set of + decoders) is used. This improves memory and cpu usage, since on + identical codecs a single decoder will be used. + - The “next” stream to play will be pre-rolled “just-in-time” + thanks to the buffering improvements in urisourcebin (see below) + - This feature is now handled at the uridecodebin3 level. + Applications that wish to have a “gapless” stream and process it + (instead of just outputting it, for example for transcoding, + retransmission, …) can now use uridecodebin3 directly. Note that + a streamsynchronizer element is required in that case. +- Buffering improvements The urisourcebin element is in charge of + fetching and (optionally) buffering/downloading the stream. It has + been extended and improved: + - When the parse-streams property is used (by default in + uridecodebin3 and playbin3), compatible streams will be demuxed + and parsed (via parsebin) and buffering will be done on the + elementary streams. This provides a more accurate handling of + buffering. Previously buffering was done on a best-effort basis + and was mostly wrong (i.e. downloading more than needed). + - Applications can use urisourcebin with this property as a + convenient way of getting elementary streams from a given URI. + - Elements can handle buffering themselves (such as the new + adaptive demuxers) by answering the GST_QUERY_BUFFERING query. + In that case urisourcebin will not handle it. +- Stream Selection Efficient stream selection was previously only + possible within decodebin3. The downside is that this meant that + upstream elements had to provide all the streams from which to chose + from, which is inefficient. With the addition of the + GST_QUERY_SELECTABLE query, this can now be handled by elements + upstream (i.e. sources) + - Elements that can handle stream selection internally (such as + the new adaptive demuxer elements) answer that query, and handle + the stream selection events themselves. + - In this case, decodebin3 will always process all streams that + are provided to it. +- Instant URI switching This new feature allows switching URIs + “instantly” in playbin3 (and uridecodebin3) without having to change + states. This mimics switching channels on a television. + - If compatible, decoders will be re-used, providing lower + latency/cpu/memory than by switching states. + - This is enabled by setting the instant-uri property to true, + setting the URI to switch to immediately, and then disabling the + instant-uri property again afterwards. +- playbin3, decodebin3, uridecodebin3, parsebin, and urisrc are no + longer experimental + - They were originally marked as ‘technology preview’ but have + since seen extensive usage in production settings, so are + considered ready for general use now. + +Fraunhofer AAC audio encoder HE-AAC and AAC-LD profile support + +- fdkaacenc: + - Support for encoding to HE-AACv1 and HE-AACv2 profile + - Support for encoding to AAC Low Delay (LD) profile + - Advanced bitrate control options via new “rate-control”, + “vbr-preset”, “peak-bitrate”, and “afterburner” properties + +RTP rapid synchronization support in the RTP stack (RFC6051) + +RTP provides several mechanisms how streams can be synchronized relative +to each other, and how absolute sender times for RTP packets can be +obtained. One of these mechanisms is via RTCP, which has the +disadvantage that the synchronization information is only distributed +out-of-band and usually some time after the start. + +GStreamer’s RTP stack, specifically the rtpbin, rtpsession and +rtpjitterbuffer elements, now also have support for retrieving and +sending the same synchronization information in-band via RTP header +extensions according to RFC6051 (Rapid Synchronisation of RTP Flows). +Only 64-bit timestamps are supported currently. + +This provides per packet synchronization information from the very +beginning of a stream and allows accurate inter-stream, and (depending +on setup) inter-device, synchronization at the receiver side. + +ONVIF XML Timed Metadata support + +The ONVIF standard implemented by various security cameras also +specifies a format for timed metadata that is transmitted together with +the audio/video streams, usually over RTSP. + +Support for this timed metadata is implemented in the MP4 demuxer now as +well as the new fragmented MP4 muxer and the new non-fragmented MP4 +muxer from the GStreamer Rust plugins. Additionally, the new onvif +plugin ‒ which is part of the GStreamer Rust plugins ‒ provides general +elements for handling the metadata and e.g. overlaying certain parts of +it over a video stream. + +As part of this support for absolute UTC times was also implemented +according to the requirements of the ONVIF standards in the +corresponding elements. + +MP3 gapless playback support + +While MP3 can probably considered a legacy format at this point, a new +feature was added with this release. + +When playing back plain MP3 files, i.e. outside a container format, +switches between files can now be completely gapless if the required +metadata is provided inside the file. There is no standardized metadata +for this, but the LAME MP3 encoder writes metadata that can be parsed by +the mpegaudioparse element now and forwarded to decoders for ensuring +removal of padding samples at the front and end of MP3 files. + +“force-live” property for audio + video aggregators + +This is a quality of life fix for playout and streaming applications +where it is common to have audio and video mixer elements that should +operate in live mode from the start and produce output continuously. + +Often one would start a pipeline without any inputs hooked up to these +mixers in the beginning, and up until now there was no way to easily +force these elements into live mode from the start. One would have to +add an initial live video or audio test source as dummy input to achieve +this. + +The new “force-live” property makes these audio and video aggregators +start in live mode without the need for any dummy inputs, which is +useful for scenarios where inputs are only added after starting the +pipeline. + +This new property should usually be used in connection with the +“min-upstream-latency” property, i.e. you should always set a non-0 +minimum upstream latency then. + +This is now supported in all GstAudioAggregator and GstVideoAggregator +subclasses such as audiomixer, audiointerleave, compositor, +glvideomixer, d3d11compositor, etc. + +New elements and plugins + +- new cudaconvertscale element that can convert and scale in one pass + +- new gtkwaylandsink element based on gtksink, but similar to + waylandsink and uses Wayland APIs directly instead of rendering with + Gtk/Cairo primitives. This approach is only compatible with Gtk3, + and like gtksink this element only supports Gtk3. + +- new h264timestamper and h265timestamper elements to reconstruct + missing pts/dts from inputs that might not provide them such as + e.g. RTP/RTSP/WebRTC inputs (see above) + +- mfaacdec, mfmp3dec: Windows MediaFoundation AAC and MP3 decoders + +- new msdkav1enc AV1 video encoder element + +- new nvcudah264enc, nvcudah265enc, nvd3d11h264enc, and nvd3d11h265enc + NVIDIA GPU encoder elements to support zero-copy encoding, via CUDA + and Direct3D11 APIs, respectively + +- new nvautogpuh264enc and nvautogpuh265enc NVIDIA GPU encoder + elements: The auto GPU elements will automatically select a target + GPU instance in case multiple NVIDIA desktop GPUs are present, also + taking into account the input memory. On Windows CUDA or Direct3D11 + mode will be determined by the elements automatically as well. Those + new elements are useful if target GPU and/or API mode (either CUDA + or Direct3D11 in case of Windows) is undeterminable from the encoder + point of view at the time when pipeline is configured, and therefore + lazy target GPU and/or API selection are required in order to avoid + unnecessary memory copy operations. + +- new nvav1dec AV1 NVIDIA desktop GPU decoder element + +- new qml6glsink element to render video with Qt6 + +- qsv: New Intel OneVPL/MediaSDK (a.k.a Intel Quick Sync) based + decoder and encoder elements, with gst-d3d11 (on Windows) and gst-va + (on Linux) integration + + - Support multi-GPU environment, for example, concurrent video + encoding using Intel iGPU and dGPU in a single pipeline + - H.264 / H.265 / VP9 and JPEG decoders + - H.264 / H.265 / VP9 / AV1 / JPEG encoders with dynamic encoding + bitrate update + - New plugin does not require external SDK for building on Windows + +- vulkanoverlaycompositor: new vulkan overlay compositor element to + overlay upstream GstVideoOverlayCompositonMeta onto the video + stream. + +- vulkanshaderspv: performs operations with SPIRV shaders in Vulkan -- assrender: handle more font mime types; better interaction with - matroskademux for embedded fonts +- win32ipcvideosink, win32ipcvideosrc: new shared memory videosrc/sink + elements for Windows -- audiobuffersplit: Add support for specifying output buffer size in - bytes (not just duration) +- wicjpegdec, wicpngdec: Windows Imaging Component (WIC) based JPEG + and PNG decoder elements. -- audiolatency: new "samplesperbuffer" property so users can configure - the number of samples per buffer. The default value is 240 samples - which is equivalent to 5ms latency with a sample rate of 48000, - which might be larger than actual buffer size of audio capture - device. - -- audiomixer, audiointerleave, GstAudioAggregator: now keep a count of - samples that are dropped or processed as statistic and can be made - to post QoS messages on the bus whenever samples are dropped by - setting the "qos-messages" property on input pads. - -- audiomixer, compositor: improved handling of new inputs added at - runtime. New API was added to the GstAggregator base class to allow - subclasses to opt into an aggregation mode where inactive pads are - ignored when processing input buffers - (gst_aggregator_set_ignore_inactive_pads(), - gst_aggregator_pad_is_inactive()). An “inactive pad” in this context - is a pad which, in live mode, hasn’t yet received a first buffer, - but has been waited on at least once. What would happen usually in - this case is that the aggregator would wait for data on this pad - every time, up to the maximum configured latency. This would - inadvertently push mixer elements in live mode to the configured - latency envelope and delay processing when new inputs are added at - runtime until these inputs have actually produced data. This is - usually undesirable. With this new API, new inputs can be added - (requested) and configured and they won’t delay the data processing. - Applications can opt into this new behaviour by setting the - "ignore-inactive-pads" property on compositor, audiomixer or other - GstAudioAggregator-based elements. - -- cccombiner: implement “scheduling” of captions. So far cccombiner’s - behaviour was essentially that of a funnel: it strictly looked at - input timestamps to associate together video and caption buffers. - Now it will try to smoothly schedule caption buffers in order to - have exactly one per output video buffer. This might involve - rewriting input captions, for example when the input is CDP then - sequence counters are rewritten, time codes are dropped and - potentially re-injected if the input video frame had a time code - meta. This can also lead to the input drifting from synchronisation, - when there isn’t enough padding in the input stream to catch up. In - that case the element will start dropping old caption buffers once - the number of buffers in its internal queue reaches a certain limit - (configurable via the "max-scheduled" property). The new original - funnel-like behaviour can be restored by setting the "scheduling" - property to FALSE. - -- ccconverter: new "cdp-mode" property to specify which sections to - include in CDP packets (timecode, CC data, service info). Various - software, including FFmpeg’s Decklink support, fails parsing CDP - packets that contain anything but CC data in the CDP packets. - -- clocksync: new "sync-to-first" property for automatic timestamp - offset setup: if set clocksync will set up the "ts-offset" value - based on the first buffer and the pipeline’s running time when the - first buffer arrived. The newly configured "ts-offset" in this case - would be the value that allows outputting the first buffer without - waiting on the clock. This is useful for example to feed a non-live - input into an already-running pipeline. - -- compositor: - - - multi-threaded input conversion and compositing. Set the - "max-threads" property to activate this. - - new "sizing-policy" property to support display aspect ratio - (DAR)-aware scaling. By default the image is scaled to fill the - configured destination rectangle without padding and without - keeping the aspect ratio. With sizing-policy=keep-aspect-ratio - the input image is scaled to fit the destination rectangle - specified by GstCompositorPad:{xpos, ypos, width, height} - properties preserving the aspect ratio. As a result, the image - will be centered in the destination rectangle with padding if - necessary. - - new "zero-size-is-unscaled" property on input pads. By default - pad width=0 or pad height=0 mean that the stream should not be - scaled in that dimension. But if the "zero-size-is-unscaled" - property is set to FALSE a width or height of 0 is instead - interpreted to mean that the input image on that pad should not - be composited, which is useful when creating animations where an - input image is made smaller and smaller until it disappears. - - improved handling of new inputs at runtime via - "ignore-inactive-pads"property (see above for details) - - allow output format with alpha even if none of the inputs have - alpha (also glvideomixer and other GstVideoAggregator - subclasses) - -- dashsink: add H.265 codec support and signals for allowing custom - playlist/fragment output - -- decodebin3: - - - improved decoder selection, especially for hardware decoders - - make input activation “atomic” when adding inputs dynamically - - better interleave handling: take into account decoder latency - for interleave size - -- decklink: - - - Updated DeckLink SDK to 11.2 to support DeckLink 8K Pro - - decklinkvideosrc: - - More accurate and stable capture timestamps: use the - hardware reference clock time when the frame was finished - being captured instead of a clock time much further down the - road. - - Automatically detect widescreen vs. normal NTSC/PAL - -- encodebin: - - - add “smart encoding” support for H.265, VP8 and VP9 (i.e. only - re-encode where needed and otherwise pass through encoded video - as-is). - - H.264/H.265 smart encoding improvements: respect user-specified - stream-format, but if not specified default to avc3/hvc1 with - in-band SPS/PPS/VPS signalling for more flexibility. - - new encodebin2 element with dynamic/sometimes source pads in - order to support the option of doing the muxing outside of - encodebin, e.g. in combination with splitmuxsink. - - add APIs to set element properties on encoding profiles (see - below) - -- errorignore: new "ignore-eos" property to also ignore FLOW_EOS from - downstream elements - -- giosrc: add support for growing source files: applications can - specify that the underlying file being read is growing by setting - the "is-growing" property. If set, the source won’t EOS when it - reaches the end of the file, but will instead start monitoring it - and will start reading data again whenever a change is detected. The - new "waiting-data" and "done-waiting-data" signals keep the - application informed about the current state. - -- gtksink, gtkglsink: - - - scroll event support: forwarded as navigation events into the - pipeline - - "video-aspect-ratio-override" property to force a specific - aspect ratio - - "rotate-method" property and support automatic rotation based on - image tags - -- identity: new "stats" property allows applications to retrieve the - number of bytes and buffers that have passed through so far. - -- interlace: add support for more formats, esp 10-bit, 12-bit and - 16-bit ones - -- jack: new "low-latency" property for automatic latency-optimized - setting and "port-names" property to select ports explicitly - -- jpegdec: support output conversion to RGB using libjpeg-turbo (for - certain input files) - -- line21dec: - - - "mode" property to control whether and how detected closed - captions should be inserted in the list of existing close - caption metas on the input frame (if any): add, drop, or - replace. - - "ntsc-only" property to only look for captions if video has NTSC - resolution - -- line21enc: new "remove-caption-meta" to remove metas from output - buffers after encoding the captions into the video data; support for - CDP closed captions - -- matroskademux, matroskamux: Add support for ffv1, a lossless - intra-frame video coding format. - -- matroskamux: accept in-band SPS/PPS/VPS for H.264 and H.265 - (i.e. stream-format avc3 and hev1) which allows on-the-fly - profile/level changes, and from 1.20.4 onwards also resolution - changes. - -- matroskamux: new "cluster-timestamp-offset" property, useful for use - cases where the container timestamps should map to some absolute - wall clock time, for example. - -- rtpsrc: add "caps" property to allow explicit setting of the caps - where needed - -- mpegts: support SCTE-35 pass-through via new "send-scte35-events" - property on MPEG-TS demuxer tsdemux. When enabled, SCTE 35 sections - (e.g. ad placement opportunities) are forwarded as events downstream - where they can be picked up again by mpegtsmux. This required a - semantic change in the SCTE-35 section API: timestamps are now in - running time instead of muxer pts. - -- tsdemux: Handle PCR-less MPEG-TS streams; more robust timestamp - handling in certain corner cases and for poorly muxed streams. - -- mpegtsmux: - - - More conformance improvements to make MPEG-TS analysers happy: - - PCR timing accuracy: Improvements to the way mpegtsmux - outputs PCR observations in CBR mode, so that a PCR - observation is always inserted when needed, so that we never - miss the configured pcr-interval, as that triggers various - MPEG-TS analyser errors. - - Improved PCR/SI scheduling - - Don’t write PCR until PAT/PMT are output to make sure streams - start cleanly with a PAT/PMT. - - Allow overriding the automatic PMT PID selection via - application-supplied PMT_%d fields in the prog-map - structure/property. - -- mp4mux: - - - new "first-moov-then-finalise" mode for fragmented output where - the output will start with a self-contained moov atom for the - first fragment, and then produce regular fragments. Then at the - end when the file is finalised, the initial moov is invalidated - and a new moov is written covering the entire file. This way the - file is a “fragmented mp4” file while it is still being written - out, and remains playable at all times, but at the end it is - turned into a regular mp4 file (with former fragment headers - remaining as unused junk data in the file). - - support H.264 avc3 and H.265 hvc1 stream formats as input where - the codec data is signalled in-band inside the bitstream instead - of caps/file headers. - - support profile/level/resolution changes for H.264/H.265 input - streams (i.e. codec data changing on the fly). Each codec_data - is put into its own SampleTableEntry inside the stsd, unless the - input is in avc3 stream format in which case it’s written - in-band and not in the headers. - -- multifilesink: new ""min-keyframe-distance"" property to make - minimum distance between keyframes in next-file=key-frame mode - configurable instead of hard-coding it to 10 seconds. - -- mxfdemux has seen a big refactoring to support non-frame wrappings - and more accurate timestamp/seek handling for some formats - -- msdk plugin for hardware-accelerated video encoding and decoding - using the Intel Media SDK: - - - oneVPL support (Intel oneAPI Video Processing Library) - - AV1 decoding support - - H.264 decoder now supports constrained-high and progressive-high - profiles - - H.264 encoder: - - more configuration options (properties): - "intra-refresh-type", "min-qp" , "max-qp", "p-pyramid", - "dblk-idc" - - H.265 encoder: - - can output main-still-picture profile - - now inserts HDR SEIs (mastering display colour volume and - content light level) - - more configuration options (properties): - "intra-refresh-type", "min-qp" , "max-qp", "p-pyramid", - "b-pyramid", "dblk-idc", "transform-skip" - - support for RGB 10bit format - - External bitrate control in encoders - - Video post proc element msdkvpp gained support for 12-bit pixel - formats P012_LE, Y212_LE and Y412_LE - -- nvh264sldec: interlaced stream support - -- openh264enc: support main, high, constrained-high and - progressive-high profiles - -- openjpeg: support for multithreaded decoding and encoding - -- rtspsrc: now supports IPv6 also for tunneled mode (RTSP-over-HTTP); - new "ignore-x-server-reply" property to ignore the - x-server-ip-address server header reply in case of HTTP tunneling, - as it is often broken. - -- souphttpsrc: Runtime compatibility support for libsoup2 and - libsoup3. libsoup3 is the latest major version of libsoup, but - libsoup2 and libsoup3 can’t co-exist in the same process because - there is no namespacing or versioning for GObject types. As a - result, it would be awkward if the GStreamer souphttpsrc plugin - linked to a specific version of libsoup, because it would only work - with applications that use the same version of libsoup. To make this - work, the soup plugin now tries to determine the libsoup version - used by the application (and its other dependencies) at runtime on - systems where GStreamer is linked dynamically. libsoup3 support is - still considered somewhat experimental at this point. Distro - packagers please take note of the souphttpsrc plugin dependency - changes mentioned in the build and dependencies section below. - -- srtsrc, srtsink: add signals for the application to accept/reject - incoming connections - -- timeoverlay: new elapsed-running-time time mode which shows the - running time since the first running time (and each flush-stop). - -- udpsrc: new timestamping mode to retrieve packet receive timestamps - from the kernel via socket control messages (SO_TIMESTAMPNS) on - supported platforms - -- uritranscodebin: new setup-source and element-setup signals for - applications to configure elements used - -- v4l2codecs plugin gained support for 4x4 and 32x32 tile formats - enabling some platforms or direct renders. Important memory usage - improvement. - -- v4l2slh264dec now implements the final Linux uAPI as shipped on - Linux 5.11 and later. - -- valve: add "drop-mode" property and provide two new modes of - operation: in drop-mode=forward-sticky-events sticky events - (stream-start, segment, tags, caps, etc.) are forwarded downstream - even when dropping is enabled; drop-mode=transform-to-gap will in - addition also convert buffers into gap events when dropping is - enabled, which lets downstream elements know that time is advancing - and might allow for preroll in many scenarios. By default all events - and all buffers are dropped when dropping is enabled, which can - cause problems with caps negotiation not progressing or branches not - prerolling when dropping is enabled. - -- videocrop: support for many more pixel formats, e.g. planar YUV - formats with > 8bits and GBR* video formats; can now also accept - video not backed by system memory as long as downstream supports the - GstCropMeta - -- videotestsrc: new smpte-rp-219 pattern for SMPTE75 RP-219 conformant - color bars - -- vp8enc: finish support for temporal scalability: two new properties - ("temporal-scalability-layer-flags", - "temporal-scalability-layer-sync-flags") and a unit change on the - "temporal-scalability-target-bitrate” property (now expects bps); - also make temporal scalability details available to RTP payloaders - as buffer metadata. - -- vp9enc: new properties to tweak encoder performance: - - - "aq-mode" to configure adaptive quantization modes - - "frame-parallel-decoding" to configure whether to create a - bitstream that reduces decoding dependencies between frames - which allows staged parallel processing of more than one video - frames in the decoder. (Defaults to TRUE) - - "row-mt", "tile-columns" and "tile-rows" so multithreading can - be enabled on a per-tile basis, instead of on a per tile-column - basis. In combination with the new "tile-rows" property, this - allows the encoder to make much better use of the available CPU - power. - -- vp9dec, vp9enc: add support for 10-bit 4:2:0 and 4:2:2 YUV, as well - as 8-bit 4:4:4 - -- vp8enc, vp9enc now default to “good quality” for the deadline - property rather then “best quality”. Having the deadline set to best - quality causes the encoder to be absurdly slow, most real-life users - will prefer good-enough quality with better performance instead. - -- wpesrc: - - - implement audio support: a new sometimes source pad will be - created for each audio stream created by the web engine. - - move wpesrc to wpevideosrc and add a wrapper bin wpesrc to also - support audio - - also handles web:// URIs now (same as cefsrc) - - post messages with the estimated load progress on the bus - -- x265enc: add negative DTS support, which means timestamps are now - offset by 1h same as with x264enc - -RTP Payloaders and Depayloaders - -- rtpisacpay, rtpisacdepay: new RTP payloader and depayloader for iSAC - audio codec - -- rtph264depay: - - - new "request-keyframe" property to make the depayloader - automatically request a new keyframe from the sender on packet - loss, consistent with the new property on rtpvp8depay. - - new "wait-for-keyframe" property to make depayloader wait for a - new keyframe at the beginning and after packet loss (only - effective if the depayloader outputs AUs), consistent with the - existing property on rtpvp8depay. - -- rtpopuspay, rtpopusdepay: support libwebrtc-compatible multichannel - audio in addition to the previously supported multichannel audio - modes - -- rtpopuspay: add DTX (Discontinuous Transmission) support - -- rtpvp8depay: new "request-keyframe" property to make the depayloader - automatically request a new keyframe from the sender on packet loss. - -- rtpvp8pay: temporal scaling support - -- rtpvp9depay: Improved SVC handling (aggregate all layers) - -RTP Infrastructure - -- rtpst2022-1-fecdec, rtpst2022-1-fecenc: new elements providing SMPTE - 2022-1 2-D Forward Error Correction. More details in Mathieu’s blog - post. +- Many exciting new Rust elements, see Rust section below -- rtpreddec: BUNDLE support +New element features and additions -- rtpredenc, rtpulpfecenc: add support for Transport-wide Congestion - Control (TWCC) +- audioconvert: Dithering now uses a slightly slower, less biased PRNG + which results in better quality output. Also dithering can now be + enabled via the new “dithering-threshold” property for target bit + depths of more than 20 bits. -- rtpsession: new "twcc-feedback-interval" property to allow RTCP TWCC - reports to be scheduled on a timer instead of per marker-bit. +- av1enc: Add “keyframe-max-dist” property for controlling max + distance between keyframes, as well as “enc-pass”, “keyframe-mode”, + “lag-in-frames” and “usage-profile” properties. -Plugin and library moves +- cccombiner: new “output-padding” property -- There were no plugin moves or library moves in this cycle. +- decklink: Add support for 4k DCI, 8k/UHD2 and 8k DCI modes -Plugin removals +- dvbsubenc: Support for >SD resolutions is working correctly now. -The following elements or plugins have been removed: +- fdkaacenc: Add HE-AAC / HE-AACv2 profile support -- The ofa audio fingerprinting plugin has been removed. The MusicIP - database has been defunct for years so this plugin is likely neither - useful nor used by anyone. - -- The mms plugin containing mmssrc has been removed. It seems unlikely - anyone still needs this or that there are even any streams left out - there. The MMS protocol was deprecated in 2003 (in favour of RTSP) - and support for it was dropped with Microsoft Media Services 2008, - and Windows Media Player apparently also does not support it any - more. +- glvideomixer: New “crop-left,”crop-right, “crop-top” and + “crop-bottom” pad properties for cropping inputs -Miscellaneous API additions +- gssink: new ‘content-type’ property. Useful when one wants to upload + a video as video/mp4 instead of ’video/quicktime` for example. -Core +- jpegparse: Rewritten using the common parser library -- gst_buffer_new_memdup() is a convenience function for the - widely-used gst_buffer_new_wrapped(g_memdup(data,size),size) - pattern. - -- gst_caps_features_new_single() creates a new single GstCapsFeatures, - avoiding the need to use the vararg function with NULL terminator - for simple cases. - -- gst_element_type_set_skip_documentation() can be used by plugins to - signal that certain elements should not be included in the GStreamer - plugin documentation. This is useful for plugins where elements are - registered dynamically based on hardware capabilities and/or where - the available plugins and properties vary from system to system. - This is used in the d3d11 plugin for example to ensure that only the - list of default elements is advertised in the documentation. - -- gst_type_find_suggest_empty_simple() is a new convenience function - for typefinders for cases where there’s only a media type and no - other fields. - -- New API to create elements and set properties at construction time, - which is not only convenient, but also allows GStreamer elements to - have construct-only properties: gst_element_factory_make_full(), - gst_element_factory_make_valist(), - gst_element_factory_make_with_properties(), - gst_element_factory_create_full(), - gst_element_factory_create_valist(), - gst_element_factory_create_with_properties(). - -- GstSharedTaskPool: new “shared” task pool subclass with slightly - different default behaviour than the existing GstTaskPool which - would create unlimited number of threads for new tasks. The shared - task pool creates up to N threads (default: 1) and then distributes - pending tasks to those threads round-robin style, and blocks if no - thread is available. It is possible to join tasks. This can be used - by plugins to implement simple multi-threaded processing and is used - for the new multi-threaded video conversion and compositing done in - GstVideoAggregator, videoconverter and compositor. - -Plugins Base Utils library - -- GstDiscoverer: - - - gst_discoverer_container_info_get_tags() was added to retrieve - global/container tags (vs. per-stream tags). Per-Stream tags can - be retrieved via the existing - gst_discoverer_stream_info_get_tags(). - gst_discoverer_info_get_tags(), which for many files returns a - confusing mix of stream and container tags, has been deprecated - in favour of the container/stream-specific functions. - - gst_discoverer_stream_info_get_stream_number() returns a unique - integer identifier for a given stream within the given - GstDiscoverer context. (If this matches the stream number inside - the container bitstream that’s by coincidence and not by - design.) - -- gst_pb_utils_get_caps_description_flags() can be used to query - whether certain caps represent a container, audio, video, image, - subtitles, tags, or something else. This only works for formats - known to GStreamer. - -- gst_pb_utils_get_file_extension_from_caps() returns a possible file - extension for given caps. - -- gst_codec_utils_h264_get_profile_flags_level(): Parses profile, - flags, and level from H.264 AvcC codec_data. The format of H.264 - AVCC extradata/sequence_header is documented in the ITU-T H.264 - specification section 7.3.2.1.1 as well as in ISO/IEC 14496-15 - section 5.3.3.1.2. - -- gst_codec_utils_caps_get_mime_codec() to convert caps to a RFC 6381 - compatible MIME codec string codec. Useful for providing the codecs - field inside the Content-Type HTTP header for container formats, - such as mp4 or Matroska. - -GStreamer OpenGL integration library and plugins - -- glcolorconvert: added support for converting the video formats A420, - AV12, BGR, BGRA, RGBP and BGRP. - -- Added support to GstGLBuffer for persistent buffer mappings where a - Pixel Buffer Object (PBO) can be mapped by both the CPU and the GPU. - This removes a memcpy() when uploading textures or vertices - particularly when software decoders (e.g. libav) are direct - rendering into our memory. Improves transfer performance - significantly. Requires OpenGL 4.4, GL_ARB_buffer_storage or - GL_EXT_buffer_storage - -- Added various helper functions for handling 4x4 matrices of affine - transformations as used by GstVideoAffineTransformationMeta. - -- Add support to GstGLContext for allowing the application to control - the config (EGLConfig, GLXConfig, etc) used when creating the OpenGL - context. This allows the ability to choose between RGB16 or RGB10A2 - or RGBA8 back/front buffer configurations that were previously - hardcoded. GstGLContext also supports retrieving the configuration - it was created with or from an externally provide OpenGL context - handle. This infrastructure is also used to create a compatible - config from an application/externally provided OpenGL context in - order to improve compatibility with other OpenGL frameworks and GUI - toolkits. A new environment variable GST_GL_CONFIG was also added to - be able to request a specific configuration from the command line. - Note: different platforms will have different functionality - available. - -- Add support for choosing between EGL and WGL at runtime when running - on Windows. Previously this was a build-time switch. Allows use in - e.g. Gtk applications on Windows that target EGL/ANGLE without - recompiling GStreamer. gst_gl_display_new_with_type() can be used by - applications to choose a specific display type to use. - -- Build fixes to explicitly check for Broadcom-specific libraries on - older versions of the Raspberry Pi platform. The Broadcom OpenGL ES - and EGL libraries have different filenames. Using the vc4 Mesa - driver on the Raspberry Pi is not affected. - -- Added support to glupload and gldownload for transferring RGBA - buffers using the memory:NVMM available on the Nvidia Tegra family - of embedded devices. - -- Added support for choosing libOpenGL and libGLX as used in a GLVND - environment on unix-based platforms. This allows using desktop - OpenGL and EGL without pulling in any GLX symbols as would be - required with libGL. - -Video library - -- New raw video formats: - - - AV12 (NV12 with alpha plane) - - RGBP and BGRP (planar RGB formats) - - ARGB64 variants with specified endianness instead of host - endianness: - - ARGB64_LE, ARGB64_BE - - RGBA64_BE, RGBA64_LE - - BGRA64_BE, BGRA64_LE - - ABGR64_BE, ABGR64_LE - -- gst_video_orientation_from_tag() is new convenience API to parse the - image orientation from a GstTagList. - -- GstVideoDecoder subframe support (see below) - -- GstVideoCodecState now also carries some HDR metadata - -- Ancillary video data: implement transform functions for AFD/Bar - metas, so they will be forwarded in more cases - -MPEG-TS library - -This library only handles section parsing and such, see above for -changes to the actual mpegtsmux and mpegtsdemux elements. - -- many additions and improvements to SCTE-35 section parsing -- new API for fetching extended descriptors: - gst_mpegts_find_descriptor_with_extension() -- add support for SIT sections (Selection Information Tables) -- expose event-from-section constructor gst_event_new_mpegts_section() -- parse Audio Preselection Descriptor needed for Dolby AC-4 - -GstWebRTC library + webrtcbin - -- Change the way in which sink pads and transceivers are matched - together to support easier usage. If a pad is created without a - specific index (i.e. using sink_%u as the pad template), then an - available compatible transceiver will be searched for. If a specific - index is requested (i.e. sink_1) then if a transceiver for that - m-line already exists, that transceiver must match the new sink pad - request. If there is no transceiver available in either scenario, a - new transceiver is created. If a mixture of both sink_1 and sink_%u - requests result in an impossible situation, an error will be - produced at pad request time or from create offer/answer. - -- webrtcbin now uses regular ICE nomination instead of libnice’s - default of aggressive ICE nomination. Regular ICE nomination is the - default recommended by various relevant standards and improves - connectivity in specific network scenarios. - -- Add support for limiting the port range used for RTP with the - addition of the min-rtp-port and max-rtp-port properties on the ICE - object. - -- Expose the SCTP transport as a property on webrtcbin to more closely - match the WebRTC specification. - -- Added support for taking into account the data channel transport - state when determining the value of the "connection-state" property. - Previous versions of the WebRTC spec did not include the data - channel state when computing this value. - -- Add configuration for choosing the size of the underlying sockets - used for transporting media data - -- Always advertise support for the transport-cc RTCP feedback protocol - as rtpbin supports it. For full support, the configured caps (input - or through codec-preferences) need to include the relevant RTP - header extension. - -- Numerous fixes to caps and media handling to fail-fast when an - incompatible situation is detected. - -- Improved support for attaching the required media after a remote - offer has been set. - -- Add support for dynamically changing the amount of FEC used for a - particular stream. - -- webrtcbin now stops further SDP processing at the first error it - encounters. - -- Completed support for either local or the remote closing a data - channel. - -- Various fixes when performing BUNDLEing of the media streams in - relation to RTX and FEC usage. - -- Add support for writing out QoS DSCP marking on outgoing packets to - improve reliability in some network scenarios. - -- Improvements to the statistics returned by the get-stats signal - including the addition of the raw statistics from the internal - RTPSource, the TWCC stats when available. - -- The webrtc library does not expose any objects anymore with public - fields. Instead properties have been added to replace that - functionality. If you are accessing such fields in your application, - switch to the corresponding properties. - -GstCodecs and Video Parsers - -- Support for render delays to improve throughput across all CODECs - (used with NVDEC and V4L2). -- lots of improvements to parsers and the codec parsing decoder base - classes (H.264, H.265, VP8, VP9, AV1, MPEG-2) used for various - hardware-accelerated decoder APIs. - -Bindings support - -- gst_allocation_params_new() allocates a GstAllocationParams struct - on the heap. This should only be used by bindings (and freed via - gst_allocation_params_free() afterwards). In C code you would - allocate this on the stack and only init it in place. - -- gst_debug_log_literal() can be used to log a string to the debug log - without going through any printf format expansion and associated - overhead. This is mostly useful for bindings such as the Rust - bindings which may have done their own formatting already . - -- Provide non-inlined versions of refcounting APIs for various - GStreamer mini objects, so that they can be consumed by bindings - (e.g. gstreamer-sharp): gst_buffer_ref, gst_buffer_unref, - gst_clear_buffer, gst_buffer_copy, gst_buffer_replace, - gst_buffer_list_ref, gst_buffer_list_unref, gst_clear_buffer_list, - gst_buffer_list_copy, gst_buffer_list_replace, gst_buffer_list_take, - gst_caps_ref, gst_caps_unref, gst_clear_caps, gst_caps_replace, - gst_caps_take, gst_context_ref, gst_context_unref, gst_context_copy, - gst_context_replace, gst_event_replace, gst_event_steal, - gst_event_take, gst_event_ref, gst_event_unref, gst_clear_event, - gst_event_copy, gst_memory_ref, gst_memory_unref, gst_message_ref, - gst_message_unref, gst_clear_message, gst_message_copy, - gst_message_replace, gst_message_take, gst_promise_ref, - gst_promise_unref, gst_query_ref, gst_query_unref, gst_clear_query, - gst_query_copy, gst_query_replace, gst_query_take, gst_sample_ref, - gst_sample_unref, gst_sample_copy, gst_tag_list_ref, - gst_tag_list_unref, gst_clear_tag_list, gst_tag_list_replace, - gst_tag_list_take, gst_uri_copy, gst_uri_ref, gst_uri_unref, - gst_clear_uri. - -- expose a GType for GstMiniObject - -- gst_device_provider_probe() now returns non-floating device object - -API Deprecations - -- gst_element_get_request_pad() has been deprecated in favour of the - newly-added gst_element_request_pad_simple() which does the exact - same thing but has a less confusing name that hopefully makes clear - that the function request a new pad rather than just retrieves an - already-existing request pad. - -- gst_discoverer_info_get_tags(), which for many files returns a - confusing mix of stream and container tags, has been deprecated in - favour of the container-specific and stream-specific functions, - gst_discoverer_container_info_get_tags() and - gst_discoverer_stream_info_get_tags(). - -- gst_video_sink_center_rect() was deprecated in favour of the more - generic newly-added gst_video_center_rect(). - -- The GST_MEMORY_FLAG_NO_SHARE flag has been deprecated, as it tends - to cause problems and prevents sub-buffering. If pooling or lifetime - tracking is required, memories should be allocated through a custom - GstAllocator instead of relying on the lifetime of the buffers the - memories were originally attached to, which is fragile anyway. - -- The GstPlayer high-level playback library is being replaced with the - new GstPlay library (see above). GstPlayer should be considered - deprecated at this point and will be marked as such in the next - development cycle. Applications should be ported to GstPlay. - -- Gstreamer Editing Services: ges_video_transition_set_border(), - ges_video_transition_get_border() - ges_video_transition_set_inverted() - ges_video_transition_is_inverted() have been deprecated, use - ges_timeline_element_set_children_properties() instead. +- msdk: -Miscellaneous performance, latency and memory optimisations + - new msdkav1enc AV1 video encoder element + - msdk decoders: Add support for Scaler Format Converter (SFC) on + supported Intel platforms for hardware accelerated conversion + and scaling + - msdk encoders: support import of dmabuf, va memory and D3D11 + memory + - msdk encoders: add properties for low delay bitrate control and + max frame sizes for I/P frames + - msdkh264enc, msdkh265enc: more properties to control intra + refresh + - note that on systems with multi GPUs the Windows D3D11 + integration might only work reliably if the Intel GPU is the + primary GPU -More video conversion fast paths +- mxfdemux: Add support for Canon XF-HEVC -- v210 ↔ I420, YV12, Y42B, UYVY and YUY2 -- A420 → RGB +- openaptx: Support the freeaptx library -Less jitter when waiting on the system clock +- qroverlay: -- Better system clock wait accuracy, less jitter: where available, - clock_nanosleep is used for higher accuracy for waits below 500 - usecs, and waits below 2ms will first use the regular waiting system - and then clock_nanosleep for the remainder. The various wait - implementation have a latency ranging from 50 to 500+ microseconds. - While this is not a major issue when dealing with a low number of - waits per second (for ex: video), it does introduce a non-negligible - jitter for synchronisation of higher packet rate systems. - -Video decoder subframe support - -- The GstVideoDecoder base class gained API to process input at the - sub-frame level. That way video decoders can start decoding slices - before they have received the full input frame in its entirety (to - the extent this is supported by the codec, of course). This helps - with CPU utilisation and reduces latency. - -- This functionality is now being used in the OpenJPEG JPEG 2000 - decoder, the FFmpeg H.264 decoder (in case of NAL-aligned input) and - the OpenMAX H.264/H.265 decoders (in case of NAL-aligned input). + - new “qrcode-case-sensitive” property allows encoding case + sensitive strings like wifi SSIDs or passwords. + - added the ability to pick up data to render from an + upstream-provided custom GstQROverlay meta -Miscellaneous other changes and enhancements +- qtdemux: Add support for ONVIF XML Timed MetaData and AVC-Intra + video -- GstDeviceMonitor no longer fails to start just because one of the - device providers failed to start. That could happen for example on - systems where the pulseaudio device provider is installed, but - pulseaudio isn’t actually running but ALSA is used for audio - instead. In the same vein the device monitor now keeps track of - which providers have been started (via the new - gst_device_provider_is_started()) and only stops actually running - device providers when stopping the device monitor. - -- On embedded systems it can be useful to create a registry that can - be shared and read by multiple processes running as different users. - It is now possible to set the new GST_REGISTRY_MODE environment - variable to specify the file mode for the registry file, which by - default is set to be only user readable/writable. - -- GstNetClientClock will signal lost sync in case the remote time - resets (e.g. because device power cycles), by emitting the “synced” - signal with synced=FALSE parameter, so applications can take action. - -- gst_value_deserialize_with_pspec() allows deserialisation with a - hint for what the target GType should be. This allows for example - passing arrays of flags through the command line or - gst_util_set_object_arg(), eg: foo="<bar,bar+baz>". - -- It’s now possible to create an empty GstVideoOverlayComposition - without any rectangles by passing a NULL rectangle to - gst_video_overlay_composition_new(). This is useful for bindings and - simplifies application code in some places. - -Tracing framework, debugging and testing improvements - -- New factories tracer to list loaded elements (and other plugin - features). This can be useful to collect a list of elements needed - for an application, which in turn can be used to create a tailored - minimal GStreamer build that contains just the elements needed and - nothing else. -- New plugin-feature-loaded tracing hook for use by tracers like the - new factories tracer - -- GstHarness: Add gst_harness_set_live() so that harnesses can be set - to non-live and return is-live=false in latency queries if needed. - Default behaviour is to always return is-live=true in latency - queries. - -- navseek: new "hold-eos" property. When enabled, the element will - hold back an EOS event until the next keystroke (via navigation - events). This can be used to keep a video sink showing the last - frame of a video pipeline until a key is pressed instead of tearing - it down immediately on EOS. - -- New fakeaudiosink element: mimics an audio sink and can be used for - testing and CI pipelines on systems where no audio system is - installed or running. It differs from fakesink in that it only - support audio caps and syncs to the clock by default like a normal - audio sink. It also implements the GstStreamVolume interface like - most audio sinks do. - -- New videocodectestsink element for video codec conformance testing: - Calculates MD5 checksums for video frames and skips any padding - whilst doing so. Can optionally also write back the video data with - padding removed into a file for easy byte-by-byte comparison with - reference data. +- rfbsrc now supports the uri handler interface, so applications can + use RFB/VNC sources in uridecodebin(3) and playbin, with + e.g. rfb://:password@10.1.2.3:5903?shared=1 + +- rtponviftimestamp: Add support for using reference timestamps + +- rtpvp9depay now has the same keyframe-related properties as + rtpvp8depay and rtph264depay: “request-keyframe” and + “wait-for-keyframe” + +- rtspsrc: Various RTSP servers are using invalid URL operations for + constructing the control URL. Until GStreamer 1.16 these worked + correctly because GStreamer was just appending strings itself to + construct the control URL, but starting version 1.18 the correct URL + operations were used. With GStreamer 1.22, rtspsrc now first tries + with the correct control URL and if that fails it will retry with + the wrongly constructed control URL to restore support for such + servers. + +- rtspsrc and rtpjitterbuffer gained a new + “add-reference-timestamp-meta” property that makes them put the + unmodified original sender timestamp on output buffers for NTP or + PTP clock synced senders + +- srtsrc, srtsink: new “auto-reconnect” property to make it possible + to disable automatic reconnects (in caller mode) and make the + elements post an error immediately instead; also stats improvements -Tools +- srtsrc: new “keep-listening” property to avoid EOS on disconnect and + keep the source running while it waits for a new connection. -gst-inspect-1.0 +- videocodectestsink: added YUV 4:2:2 support -- Can sort the list of plugins by passing --sort=name as command line - option +- wasapi2src: Add support for process loopback capture -gst-launch-1.0 +- wpesrc: Add support for modifiers in key/touch/pointer events -- will now error out on top-level properties that don’t exist and - which were silently ignored before -- On Windows the high-resolution clock is enabled now, which provides - better clock and timer performance on Windows (see Windows section - below for more details). +Plugin and library moves -gst-play-1.0 +- The xingmux plugin has been moved from gst-plugins-ugly into + gst-plugins-good. -- New --start-position command line argument to start playback from - the specified position -- Audio can be muted/unmuted in interactive mode by pressing the m - key. -- On Windows the high-resolution clock is enabled now (see Windows - section below for more details) +- The various Windows directshow plugins in gst-plugins-bad have been + unified into a single directshow plugin. -gst-device-monitor-1.0 +Plugin removals -- New --include-hidden command line argument to also show “hidden” - device providers +- The dxgiscreencapsrc element has been removed, use + d3d11screencapturesrc instead -ges-launch-1.0 +Miscellaneous API additions -- New interactive mode that allows seeking and such. Can be disabled - by passing the --no-interactive argument on the command line. -- Option to forward tags -- Allow using an existing clip to determine the rendering format (both - topology and profile) via new --profile-from command line argument. +- GST_AUDIO_FORMAT_INFO_IS_VALID_RAW() and + GST_VIDEO_FORMAT_INFO_IS_VALID_RAW() can be used to check if a + GstAudioFormatInfo or GstVideoFormatInfo has been initialised to a + valid raw format. -GStreamer RTSP server +- Video SEI meta: new GstVideoSEIUserDataUnregisteredMeta to carry + H.264 and H.265 metadata from SEI User Data Unregistered messages. -- GstRTSPMediaFactory gained API to disable RTCP - (gst_rtsp_media_factory_set_enable_rtcp(), "enable-rtcp" property). - Previously RTCP was always allowed for all RTSP medias. With this - change it is possible to disable RTCP completely, irrespective of - whether the client wants to do RTCP or not. +- vulkan: Expose gst_vulkan_result_to_string() -- Make a mount point of / work correctly. While not allowed by the - RTSP 2 spec, the RTSP 1 spec is silent on this and it is used in the - wild. It is now possible to use / as a mount path in - gst-rtsp-server, e.g. rtsp://example.com/ would work with this now. - Note that query/fragment parts of the URI are not necessarily - correctly handled, and behaviour will differ between various - client/server implementations; so use it if you must but don’t bug - us if it doesn’t work with third party clients as you’d hoped. +Miscellaneous performance, latency and memory optimisations -- multithreading fixes (races, refcounting issues, deadlocks) +- liborc 0.4.33 adds support for aarch64 (64-bit ARM) architecture + (not enabled by default on Windows yet though) and improvements for + 32-bit ARM and should greatly enhance performance for certain + operations that use ORC. -- ONVIF audio backchannel fixes +- as always there have been plenty of performance, latency and memory + optimisations all over the place. -- ONVIF trick mode optimisations +Miscellaneous other changes and enhancements -- rtspclientsink: new "update-sdp" signal that allows updating the SDP - before sending it to the server via ANNOUNCE. This can be used to - add additional metadata to the SDP, for example. The order and - number of medias must not be changed, however. +- the audio/video decoder base classes will not consider decoding + errors a hard error by default anymore but will continue trying to + decode. Previously more than 10 consecutive errors were considered a + hard error but this caused various partially broken streams to fail. + The threshold is configurable via the “max-errors” property. -GStreamer VAAPI +- compatibility of the GStreamer PTP clock implementation with + different PTP server implementations was improved, and + synchronization is achieved successfully in various scenarios that + failed before. -- new AV1 decoder element (vaapiav1dec) +Tracing framework and debugging improvements -- H.264 decoder: handle stereoscopic 3D video with frame packing - arrangement SEI messages +New tracers -- H.265 encoder: added Screen Content Coding extensions support +- buffer-lateness: Records lateness of buffers and the reported + latency for each pad in a CSV file. Comes with a script for + visualisation. -- H.265 decoder: gained MAIN_444_12 profile support (decoded to - Y412_LE), and 4:2:2 12-bits support (decoded to Y212_LE) +- pipeline-snapshot: Creates a .dot file of all pipelines in the + application whenever requested via SIGUSR1 (on UNIX systems) -- vaapipostproc: gained BT2020 color standard support +- queue-levels: Records queue levels for each queue in a CSV file. + Comes with a script for visualisation. -- vaapidecode: now generates caps templates dynamically at runtime in - order to advertise actually supported caps instead of all - theoretically supported caps. +Debug logging system improvements -- GST_VAAPI_DRM_DEVICE environment variable to force a specified DRM - device when a DRM display is used. It is ignored when other types of - displays are used. By default /dev/dri/renderD128 is used for DRM - display. +- new log macros GST_LOG_ID, GST_DEBUG_ID, GST_INFO_ID, + GST_WARNING_ID, GST_ERROR_ID, and GST_TRACE_ID allow passing a + string identifier instead of a GObject. This makes it easier to log + non-gobject-based items and also has performance benefits. -GStreamer OMX +Tools -- subframe support in H.264/H.265 decoders +- gst-play-1.0 gained a --no-position command line option to suppress + position/duration queries, which can be useful to reduce debug log + noise. -GStreamer Editing Services and NLE +GStreamer FFMPEG wrapper -- framepositioner: new "operator" property to access blending modes in - the compositor -- timeline: Implement snapping to markers -- smart-mixer: Add support for d3d11compositor and glvideomixer -- titleclip: add "draw-shadow" child property -- ges:// URI support to define a timeline from a description. -- command-line-formatter - - Add track management to timeline description - - Add keyframe support -- ges-launch-1.0: - - Add an interactive mode where we can seek etc… - - Add option to forward tags - - Allow using an existing clip to determine the rendering format - (both topology and profile) via new --profile-from command line - argument. -- Fix static build +- Fixed bitrate management and timestamp inaccuracies for video + encoders -GStreamer validate +- Fix synchronization issues and errors created by the (wrong) + forwarding of upstream segment events by ffmpeg demuxers. -- report: Add a way to force backtraces on reports even if not a - critical issue (GST_VALIDATE_ISSUE_FLAGS_FORCE_BACKTRACE) -- Add a flag to gst_validate_replace_variables_in_string() allow - defining how to resolve variables in structs -- Add gst_validate_bin_monitor_get_scenario() to get the bin monitor - scenario, which is useful for applications that use Validate - directly. -- Add an expected-values parameter to wait, message-type=XX allowing - more precise filtering of the message we are waiting for. -- Add config file support: each test can now use a config file for the - given media file used to test. -- Add support to check properties of object properties -- scenario: Add an "action-done" signal to signal when an action is - done -- scenario: Add a "run-command" action type -- scenario: Allow forcing running action on idle from scenario file -- scenario: Allow iterating over arrays in foreach -- scenario: Rename ‘interlaced’ action to ‘non-blocking’ -- scenario: Add a non-blocking flag to the wait signal +- Clipping meta support for gapless mp3 playback -GStreamer Python Bindings +GStreamer RTSP server -- Fixes for Python 3.10 -- Various build fixes -- at least one known breaking change caused by g-i annotation changes - (see below) +- Add RFC5576 Source-specific media attribute to the SDP media for + signalling the CNAME -GStreamer C# Bindings +- Add support for adjusting request response on pipeline errors -- Fix GstDebugGraphDetails enum -- Updated to latest GtkSharp -- Updated to include GStreamer 1.20 API + - Give the application the possibility to adjust the error code + when responding to a request. For that purpose the pipeline’s + bus messages are emitted to subscribers through a + “handle-message” signal. The subscribers can then check those + messages for errors and adjust the response error code by + overriding the virtual method + GstRTSPClientClass::adjust_error_code(). -GStreamer Rust Bindings and Rust Plugins +- Add gst_rtsp_context_set_token() method to make it possible to set + the RTSPToken on some RTSPContext from bindings such as the Python + bindings. -- The GStreamer Rust bindings are released separately with a different - release cadence that’s tied to gtk-rs, but the latest release has - already been updated for the upcoming new GStreamer 1.20 API (v1_20 - feature). - -- gst-plugins-rs, the module containing GStreamer plugins written in - Rust, has also seen lots of activity with many new elements and - plugins. See the New Elements section above for a list of new Rust - elements. +- rtspclientsink gained a “publish-clock-mode” property to configure + whether the pipeline clock should be published according to RFC7273 + (RTP Clock Source Signalling), similar to the same API on + GstRTSPMedia. -Build and Dependencies +GStreamer VA-API support -- Meson 0.59 or newer is now required to build GStreamer. +- Development activity has shifted towards the new va plugin, with + gstreamer-vaapi now basically in maintenance-only mode. Most of the + below refers to the va plugin (not gstreamer-vaapi). -- The GLib requirement has been bumped to GLib 2.56 or newer (from - March 2018). +- new gst-va library for GStreamer VA-API integration -- The wpe plugin now requires wpe >= 2.28 and wpebackend-fdo >= 1.8 +- vajpegdec: new JPEG decoder -- The souphttpsrc plugin is no longer linked against libsoup but - instead tries to pick up either libsoup2 or libsoup3 dynamically at - runtime. Distro packagers please ensure to add a dependency on one - of the libsoup runtimes to the gst-plugins-good package so that - there is actually a libsoup for the plugin to find! +- vah264enc, vah265enc: new H.264/H.265 encoders -Explicit opt-in required for build of certain plugins with (A)GPL dependencies +- vah264lpenc, vah265lpenc: new low power mode encoders -Some plugins have GPL- or AGPL-licensed dependencies and those plugins -will no longer be built by default unless you have explicitly opted in -to allow (A)GPL-licensed dependencies by passing -Dgpl=enabled to Meson, -even if the required dependencies are available. +- vah265enc: Add extended formats support such as 10/12 bits, 4:2:2 + and 4:4:4 -See Building plugins with (A)GPL-licensed dependencies for more details -and a non-exhaustive list of plugins affected. +- Support encoder reconfiguration -gst-build: replaced by mono repository +- vacompositor: Add new compositor element using the VA-API VPP + interface -See mono repository section above and the GStreamer mono repository FAQ. +- vapostproc: -Cerbero + - new “scale-method” property + - Process HDR caps if supported + - parse video orientation from tags -Cerbero is a meta build system used to build GStreamer plus dependencies -on platforms where dependencies are not readily available, such as -Windows, Android, iOS and macOS. +- vaapipostproc: Enable the use of DMA-Buf import and export + (gstreamer-vaapi) -General Cerbero improvements +GStreamer Video4Linux2 support -- Plugin removed: libvisual -- New plugins: rtpmanagerbad and rist +- Added support for Mediatek Stateless CODEC (VP8, H.264, VP9) -macOS / iOS specific Cerbero improvements +- Stateless H.264 interlaced decoder support -- XCode 12 support -- macOS OS release support is now future-proof, similar to iOS -- macOS Apple Silicon (ARM64) cross-compile support has been added, - including Universal binaries. There is a known bug regarding this on - ARM64. -- Running Cerbero itself on macOS Apple Silicon (ARM64) is currently - experimental and is known to have bugs - -Windows specific Cerbero improvements - -- Visual Studio 2022 support has been added -- bootstrap is faster since it requires building fewer build-tools - recipes on Windows -- package is faster due to better scheduling of recipe stages and - elimination of unnecessary autotools regeneration -- The following plugins are no longer built on Windows: - - a52dec (another decoder is still available in libav) - - dvdread - - resindvd +- Stateless H.265 decoder support -Windows MSI installer +- Stateful decoder support for driver resolution change events -- no major changes +- Stateful decoding support fixes for NXP/Amphion driver -Linux specific Cerbero improvements +- Support for hardware crop in v4l2src -- Fedora, Debian OS release support is now more future-proof -- Amazon Linux 2 support has been added +- Conformance test improvement for stateful decoders -Android specific Cerbero improvements +- Fixes for Raspberry Pi CODEC -- no major changes +GStreamer OMX -Platform-specific changes and improvements +- There were no changes in this module -Android +GStreamer Editing Services and NLE -- No major changes +- Handle compositors that are bins around the actual compositor + implementation (like glvideomixers which wraps several elements) -macOS and iOS +- Add a mode to disable timeline editing API so the user can be in + full control of its layout (meaning that the user is responsible for + ensuring its validity/coherency) -- applemedia: add ProRes support to vtenc and vtdec +- Add a new fade-in transition type -- The GStreamer.framework location is now relocatable and is not - required to be /Library/Frameworks/ +- Add support for non-1/1 PAR source videos -- Cerbero now supports cross-compiling to macOS running on Apple - Silicon (ARM64), and Universal binaries are now available that can - be used on both X86_64 and ARM64 macOS. +- Fix frame accuracy when working with very low framerate streams -Windows +GStreamer validate -- On Windows the high-resolution clock is enabled now in the - gst-launch-1.0 and gst-play-1.0 command line tools, which provides - better clock and timer performance on Windows, at the cost of higher - power consumption. By default, without the high-resolution clock - enabled, the timer precision on Windows is system-dependent and may - be as bad as 15ms which is not good enough for many multimedia - applications. Developers may want to do the same in their Windows - applications if they think it’s a good idea for their application - use case, and depending on the Windows version they target. This is - not done automatically by GStreamer because on older Windows - versions (pre-Windows 10) this affects a global Windows setting and - also there’s a power consumption vs. performance trade-off that may - differ from application to application. - -- dxgiscreencapsrc now supports resolution changes - -- The wasapi2 audio plugin was rewritten and now has a higher rank - than the old wasapi plugin since it has a number of additional - features such as automatic stream routing, and no - known-but-hard-to-fix issues. The plugin is always built if the - Windows 10 SDK is available now. - -- The wasapi device providers now detect and notify dynamic device - additions/removals - -- d3d11screencapturesrc: new desktop capture element, including - GstDeviceProvider implementation to enumerate/select target monitors - for capture. - -- Direct3D11/DXVA decoder now supports AV1 and MPEG-2 codecs - (d3d11av1dec, d3d11mpeg2dec) - -- VP9 decoding got more reliable and stable thanks to a newly written - codec parser - -- Support for decoding interlaced H.264/AVC streams - -- Hardware-accelerated video deinterlacing (d3d11deinterlace) and - video mixing (d3d11compositor) - -- Video mixing with the Direct3D11 API (d3d11compositor) - -- MediaFoundation API based hardware encoders gained the ability to - receive Direct3D11 textures as an input - -- Seungha’s blog post “GStreamer ❤ Windows: A primer on the cool stuff - you’ll find in the 1.20 release” describes many of the - Windows-related improvements in more detail +- Clean up and stabilize API so we can now generate rust bindings -Linux +- Enhance the appsrc-push action type allowing to find tune the + buffers more in details -- bluez: LDAC Bluetooth audio codec support in a2dpsink and avdtpsink, - as well as an LDAC RTP payloader (rtpldacpay) and an LDAC audio - encoder (ldacenc) +- Add an action type to verify currently configured pad caps -- kmssink: gained support for NV24, NV61, RGB16/BGR16 formats; - auto-detect NVIDIA Tegra driver +- Add a way to run checks from any thread after executing a ‘wait’ + action. This is useful when waiting on a signal and want to check + the value of a property right when it is emited for example. -Documentation improvements +GStreamer Python Bindings -- hardware-accelerated GPU plugins will now no longer always list all - the element variants for all available GPUs, since those are - system-dependent and it’s confusing for users to see those in the - documentation just because the GStreamer developer who generated the - docs had multiple GPUs to play with at the time. Instead just show - the default elements. - -Possibly Breaking and Other Noteworthy Behavioural Changes - -- gst_parse_launch(), gst_parse_bin_from_description() and friends - will now error out when setting properties that don’t exist on - top-level bins. They were silently ignored before. - -- The GstWebRTC library does not expose any objects anymore with - public fields. Instead properties have been added to replace that - functionality. If you are accessing such fields in your application, - switch to the corresponding properties. - -- playbin and uridecodebin now emit the source-setup signal before the - element is added to the bin and linked so that the source element is - already configured before any scheduling query comes in, which is - useful for elements such as appsrc or giostreamsrc. - -- The source element inside urisourcebin (used inside uridecodebin3 - which is used inside playbin3) is no longer called "source". This - shouldn’t affect anyone hopefully, because there’s a "setup-source" - signal to configure the source element and no one should rely on - names of internal elements anyway. - -- The vp8enc element now expects bps (bits per second) for the - "temporal-scalability-target-bitrate” property, which is consistent - with the "target-bitrate" property. Since additional configuration - is required with modern libvpx to make temporal scaling work anyway, - chances are that very few people will have been using this property - -- vp8enc and vp9enc now default to “good quality” for the "deadline" - property rather then “best quality”. Having the deadline set to best - quality causes the encoder to be absurdly slow, most real-life users - will want the good quality tradeoff instead. - -- The experimental GstTranscoder library API in gst-plugins-bad was - changed from a GObject signal-based notification mechanism to a - GstBus/message-based mechanism akin to GstPlayer/GstPlay. - -- MPEG-TS SCTE-35 API: semantic change for SCTE-35 splice commands: - timestamps passed by the application should be in running time now, - since users of the API can’t really be expected to predict the local - PTS of the muxer. - -- The GstContext used by souphttpsrc to share the session between - multiple element instances has changed. Previously it provided - direct access to the internal SoupSession object, now it only - provides access to an opaque, internal type. This change is - necessary because SoupSession is not thread-safe at all and can’t be - shared safely between arbitrary external code and souphttpsrc. - -- Python bindings: GObject-introspection related Annotation fixes have - led to a case of a GstVideo.VideoInfo-related function signature - changing in the Python bindings (possibly one or two other cases - too). This is for a function that should never have been exposed in - the first place though, so the bindings are being updated to throw - an exception in that case, and the correct replacement API has been - added in form of an override. +- Add a Gst.init_python() function to be called from plugins which + will initialise everything needed for the GStreamer Python bindings + but not call Gst.init() again since this will have been called + already. -Known Issues +- Add support for the GstURIHandlerInterface that allows elements to + advertise what URI protocols they support. -- GStreamer may fail to build the hotdoc documentation with the Meson - 0.64.0 release owing to a Meson bug. This should only affect systems - where hotdoc is installed, and will be fixed in Meson 0.64.1 by this - Meson PR in combination with this GStreamer MR. In the meantime, - users can pass -Ddoc=disabledor downgrade to an older Meson version - (< 0.64.0). +GStreamer C# Bindings -- nothing in particular at this point (but also see possibly breaking - changes section above) +- Fix AppSrc and AppSink constructors -Contributors +- The C# bindings have yet to be updated to include new 1.22 API, + which requires improvements in various places in the bindings / + binding generator stack. See issue #1718 in GitLab for more + information and to track progress. -Aaron Boxer, Adam Leppky, Adam Williamson, Alba Mendez, Alejandro -González, Aleksandr Slobodeniuk, Alexander Vandenbulcke, Alex Ashley, -Alicia Boya García, Andika Triwidada, Andoni Morales Alastruey, Andrew -Wesie, Andrey Moiseev, Antonio Ospite, Antonio Rojas, Arthur Crippa -Búrigo, Arun Raghavan, Ashley Brighthope, Axel Kellermann, Baek, Bastien -Nocera, Bastien Reboulet, Benjamin Gaignard, Bing Song, Binh Truong, -Biswapriyo Nath, Brad Hards, Brad Smith, Brady J. Garvin, Branko -Subasic, Camilo Celis Guzman, Chris Bass, ChrisDuncanAnyvision, Chris -White, Corentin Damman, Daniel Almeida, Daniel Knobe, Daniel Stone, -david, David Fernandez, David Keijser, David Phung, Devarsh Thakkar, -Dinesh Manajipet, Dmitry Samoylov, Dmitry Shusharin, Dominique Martinet, -Doug Nazar, Ederson de Souza, Edward Hervey, Emmanuel Gil Peyrot, -Enrique Ocaña González, Ezequiel Garcia, Fabian Orccon, Fabrice -Fontaine, Fernando Jimenez Moreno, Florian Karydes, Francisco Javier -Velázquez-García, François Laignel, Frederich Munch, Fredrik Pålsson, -George Kiagiadakis, Georg Lippitsch, Göran Jönsson, Guido Günther, -Guillaume Desmottes, Guiqin Zou, Haakon Sporsheim, Haelwenn (lanodan) -Monnier, Haihao Xiang, Haihua Hu, Havard Graff, He Junyan, Helmut -Januschka, Henry Wilkes, Hosang Lee, Hou Qi, Ignacio Casal Quinteiro, -Igor Kovalenko, Ilya Kreymer, Imanol Fernandez, Jacek Tomaszewski, Jade -Macho, Jakub Adam, Jakub Janků, Jan Alexander Steffens (heftig), Jan -Schmidt, Jason Carrete, Jason Pereira, Jay Douglass, Jeongki Kim, Jérôme -Laheurte, Jimmi Holst Christensen, Johan Sternerup, John Hassell, John -Lindgren, John-Mark Bell, Jonathan Matthew, Jordan Petridis, Jose -Quaresma, Julian Bouzas, Julien, Kai Uwe Broulik, Kasper Steensig -Jensen, Kellermann Axel, Kevin Song, Khem Raj, Knut Inge Hvidsten, Knut -Saastad, Kristofer Björkström, Lars Lundqvist, Lawrence Troup, Lim Siew -Hoon, Lucas Stach, Ludvig Rappe, Luis Paulo Fernandes de Barros, Luke -Yelavich, Mads Buvik Sandvei, Marc Leeman, Marco Felsch, Marek Vasut, -Marian Cichy, Marijn Suijten, Marius Vlad, Markus Ebner, Mart Raudsepp, -Matej Knopp, Mathieu Duponchelle, Matthew Waters, Matthieu De Beule, -Mengkejiergeli Ba, Michael de Gans, Michael Olbrich, Michael Tretter, -Michal Dzik, Miguel Paris, Mikhail Fludkov, mkba, Nazar Mokrynskyi, -Nicholas Jackson, Nicola Murino, Nicolas Dufresne, Niklas Hambüchen, -Nikolay Sivov, Nirbheek Chauhan, Olivier Blin, Olivier Crete, Olivier -Crête, Paul Goulpié, Per Förlin, Peter Boba, P H, Philippe Normand, -Philipp Zabel, Pieter Willem Jordaan, Piotrek Brzeziński, Rafał -Dzięgiel, Rafostar, raghavendra, Raghavendra, Raju Babannavar, Raleigh -Littles III, Randy Li, Randy Li (ayaka), Ratchanan Srirattanamet, Raul -Tambre, reed.lawrence, Ricky Tang, Robert Rosengren, Robert Swain, Robin -Burchell, Roman Sivriver, R S Nikhil Krishna, Ruben Gonzalez, Ruslan -Khamidullin, Sanchayan Maity, Scott Moreau, Sebastian Dröge, Sergei -Kovalev, Seungha Yang, Sid Sethupathi, sohwan.park, Sonny Piers, Staz M, -Stefan Brüns, Stéphane Cerveau, Stephan Hesse, Stian Selnes, Stirling -Westrup, Théo MAILLART, Thibault Saunier, Tim, Timo Wischer, Tim-Philipp -Müller, Tim Schneider, Tobias Ronge, Tom Schoonjans, Tulio Beloqui, -tyler-aicradle, U. Artie Eoff, Ung, Val Doroshchuk, VaL Doroshchuk, -Víctor Manuel Jáquez Leal, Vivek R, Vivia Nikolaidou, Vivienne -Watermeier, Vladimir Menshakov, Will Miller, Wim Taymans, Xabier -Rodriguez Calvar, Xavier Claessens, Xℹ Ruoyao, Yacine Bandou, Yinhang -Liu, youngh.lee, youngsoo.lee, yychao, Zebediah Figura, Zhang yuankun, -Zhang Yuankun, Zhao, Zhao Zhili, , Aleksandar Topic, Antonio Ospite, -Bastien Nocera, Benjamin Gaignard, Brad Hards, Carlos Falgueras García, -Célestin Marot, Corentin Damman, Corentin Noël, Daniel Almeida, Daniel -Knobe, Danny Smith, Dave Piché, Dmitry Osipenko, Fabrice Fontaine, -fjmax, Florian Zwoch, Guillaume Desmottes, Haihua Hu, Heinrich Kruger, -He Junyan, Jakub Adam, James Cowgill, Jan Alexander Steffens (heftig), -Jean Felder, Jeongki Kim, Jiri Uncovsky, Joe Todd, Jordan Petridis, -Krystian Wojtas, Marc-André Lureau, Marcin Kolny, Marc Leeman, Mark -Nauwelaerts, Martin Reboredo, Mathieu Duponchelle, Matthew Waters, -Mengkejiergeli Ba, Michael Gruner, Nicolas Dufresne, Nirbheek Chauhan, -Olivier Crête, Philippe Normand, Rafał Dzięgiel, Ralf Sippl, Robert -Mader, Sanchayan Maity, Sangchul Lee, Sebastian Dröge, Seungha Yang, -Stéphane Cerveau, Teh Yule Kim, Thibault Saunier, Thomas Klausner, Timo -Wischer, Tim-Philipp Müller, Tobias Reineke, Tomasz Andrzejak, Trung Do, -Tyler Compton, Ung, Víctor Manuel Jáquez Leal, Vivia Nikolaidou, Wim -Taymans, wngecn, Wonchul Lee, wuchang li, Xavier Claessens, Xi Ruoyao, -Yoshiharu Hirose, Zhao, +GStreamer Rust Bindings and Rust Plugins -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. +The GStreamer Rust bindings are released separately with a different +release cadence that’s tied to gtk-rs, but the latest release has +already been updated for the new GStreamer 1.22 API. Check the bindings +release notes for details of the changes since 0.18, which was released +around GStreamer 1.20. + +gst-plugins-rs, the module containing GStreamer plugins written in Rust, +has also seen lots of activity with many new elements and plugins. A +list of all Rust plugins and elements provided with the 0.9 release can +be found in the repository. + +- 33% of GStreamer commits are now in Rust (bindings + plugins), and + the Rust plugins module is also where most of the new plugins are + added these days. + +- The Rust plugins are now shipped as part of the Windows MSVC + macOS + binary packages. See below for the list of shipped plugins and the + status of Rust support in cerbero. + +- The Rust plugins are also part of the documentation on the GStreamer + website now. + +- Rust plugins can be used from any programming language. To the + outside they look just like a plugin written in C or C++. + +New Rust plugins and elements + +- rtpav1pay / rtpav1depay: RTP (de)payloader for the AV1 video codec +- gtk4paintablesink: a GTK4 video sink that provides a GdkPaintable + for rendering a video in any place inside a GTK UI. Supports + zero-copy rendering via OpenGL on Linux and macOS. +- ndi: source, sink and device provider for NewTek NDI protocol +- onvif: Various elements for parsing, RTP (de)payloading, overlaying + of ONVIF timed metadata. +- livesync: Element for converting a live stream into a continuous + stream without gaps and timestamp jumps while preserving live + latency requirements. +- raptorq: Encoder/decoder elements for the RaptorQ FEC mechanism that + can be used for RTP streams (RFC6330). + +WebRTC elements + +- webrtcsink: a WebRTC sink (batteries included WebRTC sender with + specific signalling) +- whipsink: WebRTC HTTP ingest (WHIP) to MediaServer +- whepsrc: WebRTC HTTP egress (WHEP) from MediaServer +- rtpgccbwe: RTP bandwidth estimator based on the Google Congestion + Control algorithm (GCC), used by webrtcsink + +Amazon AWS services + +- awss3src / awss3sink: A source and sink element to talk to the + Amazon S3 object storage system. +- awss3hlssink: A sink element to store HLS streams on Amazon S3. +- awstranscriber: an element wrapping the AWS Transcriber service. +- awstranscribeparse: an element parsing the packets of the AWS + Transcriber service. + +Video Effects (videofx) + +- roundedcorners: Element to make the corners of a video rounded via + the alpha channel. +- colordetect: A pass-through filter able to detect the dominant + color(s) on incoming frames, using color-thief. +- videocompare: Compare similarity of video frames. The element can + use different hashing algorithms like Blockhash, DSSIM, and others. + +New MP4 muxer + Fragmented MP4 muxer + +- fmp4mux: New fragmented MP4/ISOBMFF/CMAF muxer for generating + e.g. DASH/HLS media fragments. +- isomp4mux: New non-fragmented, normal MP4 muxer. + +Both plugins provides elements that replace the existing qtmux/mp4mux +element from gst-plugins-good. While not feature-equivalent yet, the new +codebase and using separate elements for the fragment and non-fragmented +case allows for easier extensability in the future. + +Cerbero Rust support + +- Starting this release, cerbero has support for building and shipping + Rust code on Linux, Windows (MSVC) and macOS. The Windows (MSVC) and + macOS binaries also ship the GStreamer Rust plugins in this release. + Only dynamic plugins are built and shipped currently. + +- Preliminary support for Android, iOS and Windows (MinGW) exists but + more work is needed. Check the tracker issue for more details about + future work. + +- The following plugins are included currently: audiofx, aws, cdg, + claxon, closedcaption, dav1d, fallbackswitch, ffv1, fmp4, gif, + hlssink3, hsv, json, livesync, lewton, mp4, ndi, onvif, rav1e, + regex, reqwest, raptorq, png, rtp, textahead, textwrap, threadshare, + togglerecord, tracers, uriplaylistbin, videofx, webrtc, webrtchttp. -Stable 1.20 branch +Build and Dependencies -After the 1.20.0 release there will be several 1.20.x bug-fix releases -which will contain bug fixes which have been deemed suitable for a -stable branch, but no new features or intrusive changes will be added to -a bug-fix release usually. The 1.20.x bug-fix releases will be made from -the git 1.20 branch, which will be a stable branch. +- meson 0.62 or newer is required -1.20.0 +- GLib >= 2.62 is now required (but GLib >= 2.64 is strongly + recommended) -1.20.0 was released on 3 February 2022. +- libnice >= 0.1.21 is now required and contains important fixes for + GStreamer’s WebRTC stack. -1.20.1 +- liborc >= 0.4.33 is recommended for 64-bit ARM support and 32-bit + ARM improvements -The first 1.20 bug-fix release (1.20.1) was released on 14 March 2022. - -This release only contains bugfixes and it should be safe to update from -1.20.0. - -Highlighted bugfixes in 1.20.1 - -- deinterlace: various bug fixes for yadif and greedy methods -- gtk video sink: Fix rotation not being applied when paused -- gst-play-1.0: Fix trick-mode handling in keyboard shortcut -- jpegdec: fix RGB conversion handling -- matroskademux: improved ProRes video handling -- matroskamux: Handle multiview-mode/flags/pixel-aspect-ratio caps - fields correctly when checking caps equality on input caps changes -- videoaggregator fixes (negative rate handling, current position - rounding) -- soup http plugin: Lookup libsoup dylib files on Apple platforms & - fix Cerbero static build on Android and iOS -- Support build against libfreeaptx in openaptx plugin -- Fix linking issues on Illumos distros -- GstPlay: Fix new error + warning parsing API (was unusuable before) -- mpegtsmux: VBR muxing fixes -- nvdecoder: Various fixes for 4:4:4 and high-bitdepth decoding -- Support build against libfreeaptx in openaptx plugin -- webrtc: Various fixes to the webrtc-sendrecv python example -- macOS: support a relocatable GStreamer.framework on macOS (see below - for details) -- macOS: fix applemedia plugin failing to load on ARM64 macOS -- windows: ship wavpack library -- gst-python: Fix build with Python 3.11 -- various bug fixes, memory leak fixes, and other stability and - reliability improvements - -gstreamer - -- plugin loader: show the reason when spawning of gst-plugin-scanner - fails -- registry, plugin loading: fix dynamic relocation if - GST_PLUGIN_SUBDIR (libdir) is not a single subdirectory; improve - GST_PLUGIN_SUBDIR handling -- context: fix transfer annotation on gst_context_writable_structure() - for bindings -- baseparse: Don’t truncate the duration to milliseconds in - gst_base_parse_convert_default() -- bufferpool: Deactivate pool and get rid of references to other - objects from dispose instead of finalize - -gst-plugins-base - -- typefindfunctions: Fix WebVTT format detection for very short files -- gldisplay: Reorder GST_GL_WINDOW check for egl-device -- rtpbasepayload: Copy all buffer metadata instead of just GstMetas - for the input meta buffer -- codec-utils: Avoid out-of-bounds error -- navigation: Fix Since markers for mouse scroll events -- videoaggregator: Fix for unhandled negative rate -- videoaggregator: Use floor() to calculate current position -- video-color: Fix for missing clipping in PQ EOTF function -- gst-play-1.0: Fix trick-mode handling in keyboard shortcut -- audiovisualizer: shader: Fix out of bound write - -gst-plugins-good - -- deinterlace: various bug fixes for yadif method -- deinterlace: Refactor greedyh and fix planar formats -- deinterlace: Prevent race between method configuration and latency - query -- gtk video sink: Fix rotation not being applied when paused -- jpegdec: fix RGB conversion handling -- matroskademux: improved ProRes video handling -- matroskamux: Handle multiview-mode/flags/pixel-aspect-ratio caps - fields correctly when checking caps equality on input caps changes -- rtprtx: don’t access type-system per buffer (performance - optimisation); code cleanups -- rtpulpfecenc: fix unmatched g_slice_free() -- rtpvp8depay: fix crash when making GstRTPPacketLost custom event -- qtmux: Don’t post an error message if pushing a sample failed with - FLUSHING (e.g. on pipeline shutdown) -- soup: Lookup libsoup dylib files on Apple platforms & fix Cerbero - static build on Android and iOS -- souphttpsrc: element not present on iOS after 1.20.0 update -- v4l2tuner: return NULL if no norm set -- v4l2bufferpool: Fix race condition between qbuf and pool streamoff -- meson: Don’t build lame plugin with -Dlame=disabled - -gst-plugins-bad - -- GstPlay: Fix new error + warning parsing API (was unusuable before) -- av1parse: let the parser continue on verbose OBUs -- d3d11converter: Fix RGB to GRAY conversion, broken debug messages, - and add missing GRAY conversion -- gs: look for google_cloud_cpp_storage.pc -- ipcpipeline: fix crash and error on windows with SOCKET or _pipe() -- ivfparse: Don’t set zero resolution on caps -- mpegtsdemux: Handle PES headers bigger than a mpeg-ts packet; fix - locking in error code path; handle more program updates -- mpegtsmux: Start last_ts with GST_CLOCK_TIME_NONE to fix VBR muxing - behaviour -- mpegtsmux: Thread safety fixes: lock mux->tsmux, the programs hash - table, and pad streams -- mpegtsmux: Skip empty buffers -- osxaudiodeviceprovider: Add initial support for duplex devices on - OSX -- rtpldacpay: Fix missing payload information -- sdpdemux: add media attributes to caps, fixes ptp clock handling -- mfaudioenc: Handle empty IMFMediaBuffer -- nvdecoder: Various fixes for 4:4:4 and high-bitdepth decoding -- nvenc: Fix deadlock because of too strict buffer pool size -- va: fix library build issues, caps leaks in the vpp transform - function, and add vaav1dec to documentation -- v4l2codecs: vp9: Minor fixes -- v4l2codecs: h264: Correct scaling matrix ABI check -- dtlstransport: Notify ICE transport property changes -- webrtc: Various fixes to the webrtc-sendrecv python example -- webrtc-ice: Fix memory leaks in gst_webrtc_ice_add_candidate() -- Support build against libfreeaptx in openaptx plugin -- Fix linking issues on Illumos distros - -gst-plugins-ugly - -- x264enc: fix plugin long-name and description - -gst-libav - -- No changes - -gst-rtsp-server - -- Fix race in rtsp-client when tunneling over HTTP - -gstreamer-vaapi - -- No changes - -gstreamer-sharp - -- No changes - -gst-omx - -- No changes - -gst-python - -- Fix build with Python 3.11 - -gst-editing-services - -- Update validate test scenarios for videoaggregator rounding - behaviour change - -gst-integration-testsuites - -- Update validate test scenarios for videoaggregator rounding - behaviour change - -Development build environment - -- gst-env: various clean-ups and documentation improvements - -Cerbero build tool and packaging changes in 1.20.1 - -- Fix nasm version check -- Disable certificate checking on RHEL/CentOS 7 -- packages: Ship wavpack.dll for Windows -- osx/universal: make the library name relocatable -- macOS: In order to support a relocatable GStreamer.framework on - macOS, an application may now need to add an rpath entry to the - location of the GStreamer.framework (which could be bundled with the - application itself). Some build systems will do this for you by - default. -- Disable MoltenVK on macOS arm64 to fix applemedia plugin loading -- Fix applemedia plugin failing to load on ARM64 macOS - -Contributors to 1.20.1 - -Bastien Nocera, Branko Subasic, David Svensson Fors, Dmitry Osipenko, -Edward Hervey, Guillaume Desmottes, Havard Graff, Heiko Becker, He -Junyan, Igor V. Kovalenko, Jan Alexander Steffens (heftig), Jan Schmidt, -jinsl00000, Joseph Donofry, Jose Quaresma, Marek Vasut, Matthew Waters, -Mengkejiergeli Ba, Nicolas Dufresne, Nirbheek Chauhan, Philippe Normand, -Qi Hou, Rouven Czerwinski, Ruben Gonzalez, Sanchayan Maity, Sangchul -Lee, Sebastian Dröge, Sebastian Fricke, Sebastian Groß, Sebastian -Mueller, Sebastian Wick, Seungha Yang, Stéphane Cerveau, Thibault -Saunier, Tim Mooney, Tim-Philipp Müller, Víctor Manuel Jáquez Leal, -Vivia Nikolaidou, Zebediah Figura, +- onnx: OnnxRT >= 1.13.1 is now required -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. Thank you all! +- openaptx: can now be built against libfreeaptx -List of merge requests and issues fixed in 1.20.1 +- opencv: allow building against any 4.x version -- List of Merge Requests applied in 1.20.1 -- List of Issues fixed in 1.20.1 +- shout: libshout >= 2.4.3 is now required -1.20.2 +- gstreamer-vaapi’s Meson build options have been switched from a + custom combo type (yes/no/auto) to the built-in Meson feature type + (enabled/disabled/auto) -The second 1.20 bug-fix release (1.20.2) was released on 2 May 2022. - -This release only contains bugfixes and it should be safe to update from -1.20.x. - -Highlighted bugfixes in 1.20.2 - -- avviddec: Remove vc1/wmv3 override and fix crashes on WMV files with - FFMPEG 5.0+ -- macOS: fix plugin discovery for GStreamer installed via brew and fix - loading of Rust plugins -- rtpbasepayload: various header extension handling fixes -- rtpopusdepay: fix regression in stereo input handling if - sprop-stereo is not advertised -- rtspclientsink: fix possible shutdown deadlock -- mpegts: gracefully handle “empty” program maps and fix AC-4 - detection -- mxfdemux: Handle empty VANC packets and fix EOS handling -- playbin3: various playbin3, uridecodebin3, and playsink fixes -- ptpclock: fix initial sync-up with certain devices -- gltransformation: let graphene alloc its structures memory aligned -- webrtcbin fixes and webrtc sendrecv example improvements -- video4linux2: various fixes including some fixes for Raspberry Pi - users -- videorate segment handling fixes and other fixes -- nvh264dec, nvh265dec: Fix broken key-unit trick modes and reverse - playback -- wpe: Reintroduce persistent WebContext -- cerbero: Make it easier to consume 1.20.1 macOS GStreamer .pkgs -- build fixes and gobject annotation fixes -- bug fixes, security fixes, memory leak fixes, and other stability - and reliability improvements - -gstreamer - -- devicemonitor: clean up signal handlers and hidden providers list -- Leaks tracer: fix pthread_atfork return value check leading to bogus - warning in log -- Rust plugins: Not picked up by the plugin loader on macOS -- Failed to use plugins of latest GStreamer version 1.20.x installed - by brew on macOS -- ptpclock: Allow at least 100ms delay between Sync/Follow_Up and - Delay_Req/Delay_Resp messages. Fixes problems acquiring initial sync - with certain devices -- meson: Add -Wl,-rpath,${libdir} on macOS -- registry: skip Rust dep builddirs when searching for plugins - recursively - -gst-plugins-base - -- appsrc: Clarify buffer ref semantics in signals documentation -- appsrc: fix annotations for bindings -- typefind: Skip extension parsing for data:// URIs, fixing regression - with mp4 files serialised to data uris -- playbin3: various fixes -- playbin3: fix missing lock when unknown stream type in pad-removed - cb -- decodebin3: fix collection leaks -- decodebin3: Don’t duplicate stream selections -- discoverer: chain up to parent finalize methods in all our types to - fix memory leaks -- glmixerbin: slightly better pad/element creation -- gltransformation: let graphene alloc its structures memory aligned -- ogg: fix possible buffer overrun -- rtpbasepayload: Don’t write header extensions if there’s no - corresponding… -- rtpbasepayload: always store input buffer meta before negotiation -- rtpbasepayload: fix transfer annotation for push and push_list -- subparse: don’t try to index string with -1 -- riff-media: fix memory leak after usage for g_strjoin() -- playbin/playbin3: Allow setting a NULL URI -- playsink: Complete reconfiguration on pad release. -- parsebin: Expose streams of unknown type -- pbutils: Fix wmv screen description detection -- subparse: don’t deref a potentially NULL variable -- rawvideoparse: set format from caps in - gst_raw_video_parse_set_config_from_caps -- videodecoder: release stream lock after handling gap events -- videorate: fix assertion when pushing last and only buffer without - duration -- videorate: Revert “don’t reset on segment update” to fix segment - handling regressions -- gst-play-1.0, gst-launch-1.0: Enable win32 high-resolution timer - also for MinGW build - -gst-plugins-good - -- deinterlace: silence unused-but-set werror from imported code -- qtdemux: fix leak of channel_mapping -- rtpopusdepay: missing sprop-stereo should not assume mono -- rtpjitterbuffer: Fix invalid memory access in - rtp_jitter_buffer_pop() -- rtpptdemux: fix leak of caps when ignoring a pt -- rtpredenc: quieten warning about ignoring header extensions -- soup: Fix pre-processor macros in souploader for libsoup-3.0 -- twcc: Note that twcc-stats packet loss counts reordering as loss + - add some logging -- video4linux2: Manual backports for RPi users -- wavparse: handle URI query in any parse state, fixing audio track - selection issue in GES -- wavparse: Unset DISCONT buffer flag for divided into multiple - buffers in push mode - -gst-plugins-bad - -- av1parse: Fix several issues about the colorimetry. -- av1parse: fix up various possible logic errors -- dashsink: fix missing mutex unlock in error code path when failing - to get content -- d3d11videosink: Fix for unhandled mouse double click events -- interlace: Also handle a missing “interlace-mode” field as - progressive -- msdk: fix build with MSVC -- mxfdemux: Fix issues at EOS -- mxfdemux: Handle empty VANC packets -- nvh264dec, nvh265dec: Fix broken key-unit trick and reverse playback -- nvvp9sldec: Increase DPB size to cover render delay -- rvsg: fix cairo include -- tsdemux: Fix AC-4 detection in MPEG-TS -- tsdemux: Handle “empty” PMT gracefully -- va: pool: don’t advertise the GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT - option any more -- v4l2codecs: Fix memory leak -- v4l2videodec: set frame duration according to framerate -- webrtcbin: Update documentation of ‘get-stats’ action signal -- webrtcbin: Check data channel transport for notifying - ‘ice-gathering-state’ -- webrtcbin: Avoid access of freed memory -- wpe: Reintroduce persistent WebContext -- Build: use CMake to find some openssl and exr deps -- Fix multiple “unused-but-set variable” compiler warnings - -gst-plugins-ugly - -- x264enc: Don’t try to fixate ANY allowed caps - -gst-libav - -- video decoders: fix frame leak on negotiation error -- Fix build on systems without C++ compiler -- avviddec: Remove vc1/wmv3 override (fixing crash with FFmpeg 5 -- Segfaults on ASF/WMV files with FFMPEG 5.0+ - -gst-rtsp-server - -- rtspclientsink: fix possible shutdown deadlock in collect_streams() -- Minor spelling fixes - -gstreamer-vaapi - -- No changes - -gstreamer-sharp - -- No changes - -gst-omx - -- No changes - -gst-python - -- Fix build on systems without C++ compiler - -gst-editing-services - -- License clarification: GES is released under the LGPL2+ license - -gst-examples: - -- Fix build on macOS with gtk+-quartz-3.0 -- player android: add missing dummy.cpp -- player android: update for android changes -- webrtc_sendrecv.py: Link pads instead of elements -- webrtc_sendrecv.py: Implement all negotiation modes + bugfixes - -Development build environment + gst-full build - -- meson: provide gobject-cast-checks, glib-checks and glib-asserts - options at top level as well - -Cerbero build tool and packaging changes in 1.20.2 - -- macOS: Make it easier to consume 1.20.1 GStreamer .pkgs -- Android: fix text relocation regression on Android (x86/ x86_64 - platforms) - -Bindings - -- appsrc: fix annotations for bindings -- bindings: The out args for gst_rtp_buffer_get_extension_data*() are - optional -- rtpbasepayload: fix transfer annotation for push and push_list - -Contributors to 1.20.2 - -Bastian Krause, Benjamin Gaignard, Camilo Celis Guzman, Chun-wei Fan, -Corentin Damman, Daniel Stone, Dongil Park, Edward Hervey, Fabrice -Fontaine, Guillaume Desmottes, Havard Graff, He Junyan, Hoonhee Lee, Hou -Qi, Jan Schmidt, Marc Leeman, Mathieu Duponchelle, Matthew Waters, -Nicolas Dufresne, Nirbheek Chauhan, Philippe Normand, Pierre Bourré, -Sangchul Lee, Sebastian Dröge, Seungha Yang, Stéphane Cerveau, Thibault -Saunier, Tim-Philipp Müller, Tong Wu, Tristan Matthews, Tulio Beloqui, -Wonchul Lee, Zhao Zhili, +- The GStreamer Rust plugins module gst-plugins-rs is now considered + an essential part of the GStreamer plugin offering and packagers and + distributors are strongly encouraged to package and ship those + plugins alongside the existing plugin modules. -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. Thank you all! +- we now make use of Meson’s install tags feature which allows + selective installation of installl components and might be useful + for packagers. -List of merge requests and issues fixed in 1.20.2 +Monorepo build (gst-build) -- List of Merge Requests applied in 1.20.2 -- List of Issues fixed in 1.20.2 +- new “orc-source” build option to allow build against a + system-installed liborc instead of forcing the use of orc as a + subproject. -1.20.3 +- GStreamer command line tools can now be linked to the gstreamer-full + library if it’s built -The third 1.20 bug-fix release (1.20.3) was released on 15 June 2022. - -This release only contains bugfixes and it should be safe to upgrade -from 1.20.x. - -Highlighted bugfixes in 1.20.3 - -- Security fixes in Matroska, MP4 and AVI demuxers -- Fix scrambled video playback with hardware-accelerated VA-API - decoders on certain Intel hardware -- playbin3/decodebin3 regression fix for unhandled streams -- Fragmented MP4 playback fixes -- Android H.265 encoder mapping -- Playback of MXF files produced by FFmpeg before March 2022 -- Fix rtmp2sink crashes on 32-bit platforms -- WebRTC improvements -- D3D11 video decoder and screen recorder fixes -- Performance improvements -- Support for building against OpenCV 4.6 and other build fixes -- Miscellaneous bug fixes, memory leak fixes, and other stability and - reliability improvements - -gstreamer - -- clock: Avoid creating a weakref with every entry (performance - improvement) -- plugin: add Apache 2 license to list of known licenses to avoid - warning -- gst_plugin_load_file: force plugin reload if filename differs -- Add support for LoongArch - -Base Libraries - -- aggregator: Only send events up to CAPS event from - gst_aggregator_set_src_caps(), don’t send multiple caps events with - the same caps and fix negotiation in muxers -- basetransform: handle gst_base_transform_query_caps() returning NULL -- basetransform: fix critical if transform_caps() returned NULL -- queuearray: Fix potential heap overflow when expanding GstQueueArray - -Core Elements - -- multiqueue: fix potential crash on shutdown -- multiqueue: fix warning: ‘is_query’ may be used uninitialized in - this function -- multiqueue: SegFault during flushing with gcc11 - -gst-plugins-base - -- audioconvert: If no channel-mask can be fixated then use a NONE - channel layout -- playbin3: Configure combiner on pad-added if needed -- parsebin: Fix assertions/regression when dealing with un-handled - streams (fixes regression in 1.20.2) -- appsink: Fix race condition on caps handling -- oggdemux: Protect against invalid framerates -- rtcpbuffer: Allow padding on first reduced size packets -- gl: check for xlib-xcb.h header to fix build of tests on macOS with - homebrew -- videoaggregator: unref temporary caps -- v4l2videoenc: Setup crop rectangle if needed +Cerbero -Tools +Cerbero is a meta build system used to build GStreamer plus dependencies +on platforms where dependencies are not readily available, such as +Windows, Android, iOS, and macOS. -- gst-play-1.0: Print position even if duration is unknown -- gst-device-monitor-1.0: Print string property as-is without - additional escaping - -gst-plugins-good - -- aacparse: Avoid mismatch between src_caps and output_header_type -- avidemux: Fix integer overflow resulting in heap corruption in DIB - buffer inversion code (Security fix) -- deinterlace: Clean up error handling code -- flvdemux: Actually make use of the debug category -- gtkglsink: Fix double-free when OpenGL can’t be initialised -- jack: Add support for detecting libjack on Windows -- matroskademux: Avoid integer-overflow resulting in heap corruption - in WavPack header handling code (Security fix) -- matroskademux, qtdemux: Fix integer overflows in zlib/bz2/etc - decompression code (Security fix) -- qtdemux: Don’t use tfdt for parsing subsequent trun boxes -- rtpbin: Avoid holding GST_RTP_BIN_LOCK when emitting pad-added - signal (to avoid deadlocks) -- rtpptdemux: Don’t GST_FLOW_ERROR when ignoring invalid packets -- smpte: Fix integer overflow with possible heap corruption in GstMask - creation. (Security fix) -- smpte: integer overflow with possible heap corruption in GstMask - creation (Security fix) -- soup: fix soup debug category initialisation -- soup: Fix plugin/element init -- v4l2: Reset transfer in gst_v4l2_object_acquire_format() -- vpxenc: fix crash if encoder produces unmatching timestamp -- wavparse: ensure that any pending segment is sent before an EOS - event is sent - -gst-plugins-bad - -- androidmedia: Add H.265 encoder mapping -- avfvideosrc: fix wrong framerate selected for caps -- d3d11decoder: Fix for alternate interlacing signalling -- d3d11decoder: Do not preallocate texture using downstream d3d11 - buffer pool -- d3d11decoder: Copy HDR10 related caps field manually -- d3d11decoder: Work around Intel DXVA driver crash -- d3d11screencapture: Set viewport when drawing mouse cursor -- d3d11screencapture: Fix missing/outdated cursor shape -- d3d11screencapturesrc: Fix crash when d3d11 device is different from - owned one -- h264decoder: Fix for unhandled low-delay decoding case -- matroskademux, qtdemux: Fix integer overflows in zlib/bz2/etc - decompression code (Security fix) -- mpegtsmux: Make sure to set srcpad caps under all conditions before - outputting the first buffer -- mpegtsmux: sends segment before caps -- mxfdemux: Handle files produced by legacy FFmpeg -- nvh264dec,nvh265dec: Don’t realloc bitstream buffer per slice -- nvcodec: cuda-converter: fix nvrtc compilation on non-English locale - systems -- opencv: Allow building against 4.6.x -- pcapparse: Set timestamp in DTS, not PTS -- rtmp2: fix allocation of GstRtmpMeta which caused crashes on 32-bit - platforms -- rtmp2sink crash on Android arm 32 - cerbero 1.20.2.0 -- sdpdemux: Release request pads from rtpbin when freeing a stream -- va: Add O_CLOEXEC flag at opening drm device (so subprocesses won’t - have access to it) -- webrtcbin: Reject answers that don’t contain the same number of - m-line as offer -- webrtc: datachannel: Notify low buffered amount according to spec - -gst-plugins-ugly - -- No changes - -gst-libav - -- No changes - -gst-rtsp-server - -- No changes - -gstreamer-vaapi - -- vaapi: Do not disable the whole vpp when some va operations not - available -- vaapidecode, vaapipostproc: Disable DMAbuf from caps negotiation -- scrambled video with some Intel graphics cards - -gstreamer-sharp - -- No changes - -gst-omx - -- No changes - -gst-python - -- No changes - -gst-editing-services - -- ges/videourisource: handle non-1/1 PAR source videos - -gst-examples: - -- No changes - -Development build environment + gst-full build - -- Update libnice subproject wrap to 0.1.19 -- meson: use better zlib dependency fallback -- meson: Fix deprecation warnings - -Cerbero build tool and packaging changes in 1.20.3 - -- Set GSTREAMER_1_0_ROOT_MSVC_X86_64 root environment variable in - System section (not User section) -- bootstrap: Add perl-FindBin dep needed by openssl (which is not - installed by default on RedHat systems) -- Also add build-tools/local/bin to PATH on Linux -- Add a variant to control building of the JACK plugin -- libnice: update to 0.1.19 (fixes some WebRTC issues) -- zlib: update to 1.2.12 - -Bindings - -- No changes - -Contributors to 1.20.3 - -Adam Doupe, Alicia Boya García, Bastien Nocera, Corentin Damman, Damian -Hobson-Garcia, Diogo Goncalves, Edward Hervey, Eli Schwartz, Erwann -Gouesbet, Guillaume Desmottes, He Junyan, Hou Qi, Jakub Adam, James -Hilliard, Jan Alexander Steffens (heftig), Jan Schmidt, Matthew Waters, -Nicolas Dufresne, Nirbheek Chauhan, Olivier Crête, Philippe Normand, -Rabindra Harlalka, Ruben Gonzalez, Sebastian Dröge, Seungha Yang, -Stéphane Cerveau, Thibault Saunier, Tim-Philipp Müller, Tom Schuring, U. -Artie Eoff, Víctor Manuel Jáquez Leal, WANG Xuerui, Xavier Claessens, +General improvements -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. Thank you all! +- Rust support was added for all support configurations, controlled by + the rust variant; see above for more details +- All pkgconfig files are now reliably relocatable without requiring + pkg-config --define-prefix. This also fixes statically linking with + GStreamer plugins using the corresponding pkgconfig files. +- New documentation on how to build a custom GStreamer repository + using Cerbero, please see the README +- HTTPS certificate checking is enabled for downloads on all platforms + now +- Fetching now automatically retries on error for robustness against + transient errors +- Support for building the new Qt6 plugin was added +- pkgconfig files for various recipes were fixed +- Several recipes were updated to newer versions +- New plugins: adaptivedemux2 aes codectimestamper dav1d +- New libraries: cuda webrtcnice + +macOS / iOS + +- Added support for running Cerbero on ARM64 macOS +- GStreamer.framework and all libraries in it are now relocatable, + which means they use LC_RPATH entries to find dependencies instead + of using an absolute path. If you link to GStreamer using the + pkgconfig files, no action is necessary. However, if you use the + framework directly or link to the libraries inside the framework by + hand, then you need to pass -Wl,-rpath,<path_to_libdir> to the + linker. +- Apple bitcode support was dropped, since Apple has deprecated it +- macOS installer now correctly advertises support for both x86_64 and + arm64 +- macOS framework now ships the gst-rtsp-server-1.0 library +- Various fixes were made to make static linking to gstreamer + libraries and plugins work correctly on macOS +- When statically linking to the applemedia plugin using Xcode 13, you + will need to pass -fno-objc-msgsend-selector-stubs which works + around a backwards-incompatible change in Xcode 14. This is not + required for the rest of GStreamer at present, but will be in the + future. +- macOS installer now shows the GStreamer logo correctly -List of merge requests and issues fixed in 1.20.3 +Windows -- List of Merge Requests applied in 1.20.3 -- List of Issues fixed in 1.20.3 +- MSVC is now required by default on Windows, and the Visual Studio + variant is enabled by default + - To build with MinGW, use the mingw variant +- Visual Studio props files were updated for newer Visual Studio + versions +- Visual Studio 2015 support was dropped +- MSYS2 is now supported as the base instead of MSYS. Please see the + README for more details. Some advantages include: + - Faster build times, since parallel make works + - Faster bootstrap, since some tools are provided by MSYS2 + - Other speed-ups due to using MSYS2 tools instead of MSYS +- Faster download by using powershell instead of hand-rolled Python + code +- Many recipes were ported from Autotools to Meson, speeding up the + build +- Universal Windows Platform is no longer supported, and binaries are + no longer shipped for it +- New documentation on how to force a specific Visual Studio + installation in Cerbero, please see the README +- New plugins: qsv wavpack directshow amfcodec wic win32ipc +- New libraries: d3d11 -1.20.4 +Windows MSI installer -The fourth 1.20 bug-fix release (1.20.4) was released on 12 October -2022. - -This release only contains bugfixes and it should be safe to upgrade -from 1.20.x. - -Highlighted bugfixes in 1.20.4 - -- avaudiodec: fix playback issue with WMA files, would throw an error - at EOS with FFmpeg 5.x -- Fix deadlock when loading gst-editing-services plugin -- Fix input buffering capacity in live mode for aggregator, - video/audio aggregator subclasses, muxers -- glimagesink: fix crash on Android -- subtitle handling and subtitle overlay fixes -- matroska-mux: allow width + height changes for avc3|hev1|vp8|vp9 -- rtspsrc: fix control url handling for spec compliant servers and add - fallback for incompliant servers -- WebRTC fixes -- RTP retransmission fixes -- video: fixes for formats with 4x subsampling and horizontal co-sited - chroma (Y41B, YUV9, YVU9 and IYU9) -- macOS build and packaging fixes, in particular fix finding of gio - modules on macOS for https/TLS support -- Fix consuming of the macOS package as a framework in XCode -- Performance improvements -- Miscellaneous bug fixes, memory leak fixes, and other stability and - reliability improvements - -gstreamer - -- buffer: drop parent meta in deep copy/foreach_metadata -- devicemonitor: Use a sync bus handler for the provider to avoid - accumulating all messages until the provider is stopped -- element: Fix requesting of pads with string templates -- gst: Protect initialization state with a recursive mutex -- gst: add missing define guard for build without gstreamer debug - logging support -- gst_init: Initialize static plugins just before dynamic plugins -- info: Parse “NONE” as a valid level name -- meta: Set the parent refcount of the GstStructure correctly -- pluginloader: Don’t hang on short reads/writes -- tracers: leaks: fix potentially invalid memory access when trying to - detect object type -- tracers: leaks: fix object-refings.class flags -- uri: When setting the same string again do nothing -- value: Don’t loop forever when serializing invalid flag - -Base Libraries - -- aggregator: fix input buffering in live mode (was too low before in - many cases) -- aggregator: fix reversed active/flushing arguments in debug log - output -- aggregator: Reset EOS flag after receiving a stream-start event - -Core Elements - -- queue2: Hold the lock when modifying sinkresult -- queue2: Fix deadlock when deactivate is called in pull mode - -gst-plugins-base - -- decodebin3: fix mutex leaks -- decodebin3: Fix memory issues with active selection list -- decodebin3, uridecodebin3, urisourcebin: Event handling fixes -- decodebin3: fix EOS event sequence -- parsebin: Avoid crash with unknown streams -- parsebin: SIGSEGV during HLS stream using souphttpsrc -- glimagesink: only allow setting the GL display/context if it is a - valid value -- glimagesink: segfault on android devices -- gstgl: Fix several memory leaks in macOS -- opusenc: improve inband-fec property documentation -- playsink: Hold a reference to the soft volume element -- pbutils: descriptions: fix gst_pb_utils_get_caps_description_flags() -- rtspurl: Use gst_uri_join_strings() in - gst_rtsp_url_get_request_uri_with_control() instead of a - hand-crafted, wrong version -- rtspconnection: protect cancellable by a mutex -- sdpmessage: Don’t set SDP medias from caps without - media/payload/clock-rate fields -- samiparse: fix handling of self-closing tags -- ssaparse: include required system headers for isspace() and sscanf() - functions -- subparse: fix crash when parsing invalid timestamps in mpl2 -- subparse fixes -- textoverlay: Don’t miscalculate text running times -- videoaggregator: always convert when user provides converter-config -- video: Fix scaling in 4x horizontal co-sited chroma (Y41B, YUV9, - YVU9 and IYU9) -- xmptag: register musicbrainz tags during init to fix critical in - jpegparse -- xvimagesink: fix image leaks in error code path -- tests: skip unit tests for dependency-less elements that have been - disabled +- Universal Windows Platform prebuilt binaries are no longer available -Tools +Linux -- No changes +- Various fixes for RHEL/CentOS 7 support +- Added support for running on Linux ARM64 -gst-plugins-good +Android -- alpha: fix stride issue when out buffer has padding on right -- isoff: Fix earliest pts field parse issue -- matroska-mux: allow width + height changes for avc3|hev1|vp8|vp9 -- qt: Fix another instance of Qt/GStreamer both defining GLsync - differently -- qtdemux: Avoid crash on reconfiguring. -- qtdemux: guard against timestamp calculation overflow in gap event - loop -- qtdemux: Don’t use invalid values from failed trex parsing -- qtdemux: possible endless loop -- rtpjitterbuffer: Only unschedule timers for late packets if they’re - not RTX packets and only once -- rtpjitterbuffer: remove lost timer for out of order packets -- rtspsrc: SETUP generates 400 Bad Request -- rtspsrc: Retry SETUP with non-compliant URL resolution on “Bad - Request” and “Not found” -- rtpst2022-1-fecenc: Drain column packets on EOS -- rtpvp8depay: If configured to wait for keyframes after packet loss, - also do that if incomplete frames are detected -- splitmuxsink: Don’t crash on EOS without buffer -- splitmuxsrc: Stop pad task before cleanup -- splitmuxsrc: don’t consider unlinked pads when deactivating part -- soup: libsoup3 makes audio streaming stop -- v4l2: fix critical when unreferencign buffer with no data -- v4l2bufferpool: Fix debug trace -- v4l2object: Add support for Apple’s full-range bt709 colorspace - variant 1:3:5:1 -- v4l2videocodec: workaround for failure to fully drain frames - preceding MIDSTREAM renegotiation -- v4l2allocator: Fix invalid imported dmabuf fd -- videoflip: Fix caps negotiation when method is selected -- build failure trying to build jack examples -- examples: don’t try and build jack examples if jack was disabled -- tests: skip unit tests for dependency-less elements that have been - disabled - -gst-plugins-bad - -- amcvideodec: fix GstAmcSurfaceTexture segfault -- audiobuffersplit: Fix drift that was introduced by wrong - calculations in gapless mode -- avfvideosrc: Fix wrong default framerate value -- audiovisualizer: fix buffer mapping to not increase refcount -- d3d11decoder: Check 16K resolution support -- d3d11videosink: Fix for force-aspect-ratio setting when rendering on - shared texture -- mxfdemux: Always calculate BlockAlign of raw audio to work around - files with broken BlockAlign field in the headers -- nvdec: Fix for HEVC decoding when coded resolution is larger than - display resolution -- openh264: Register debug categories earlier -- openh264enc: Fix constrained-high encoding -- openmpt: update from now deprecated api -- GstPlay: missing cleanup for g_autoptr -- player/play: Fix object construction and various leaks -- player: Plug a memory leak -- proxysink: Make sure stream-start and caps events are forwarded, and - fix memory leak -- tsdemux: Don’t trigger a program change when falling back to - ignore-pcr behaviour -- va: allocator: Fix translation of VADRMPRIMESurfaceDescriptor -- va: h265dec: Fix a crash because of missing reference frame. -- vah265dec: Decoder segfaults on seek -- wasapi: Implement default audio channel mask -- wasapi2: Fix initial mute/volume setting -- webrtcbin: Limit sink query to sink pads -- webrtcbin: Fix pointer dereference before null check -- webrtc: Make sure to return NULL when validating TURN server fails -- tests: skip unit tests for dependency-less elements that have been - disabled - -gst-plugins-ugly - -- tests: skip unit tests for dependency-less elements that have been - disabled - -gst-libav - -- avauddec: fix regression with WMA files, would throw an error at EOS -- avauddec: fix unnecessary reconfiguration if the audio layout isn’t - specified -- libav: Fix for APNG encoder property registration -- Failure to decode end of WMA file - -gst-rtsp-server - -- gst-rtsp-server: Fix pushing backlog to client -- rtsp-server: stream: Don’t loop forever if binding to the multicast - address fails - -gstreamer-vaapi - -- vaapi: Handle when no encoders/decoders available. -- vaapi: Crash in gst_vaapidecode_class_init() when no - decoders/encoders available - -gstreamer-sharp - -- No changes - -gst-omx - -- No changes - -gst-python - -- python: Do not call gst_init when it is already is_initialized - -gst-editing-services - -- Deadlock in ges because of recursive gst_init() call -- ges/gstframepositioner: don’t create one compositor per frame meta -- nle: clear seek event properly - -gst-examples: - -- examples/webrtc/signalling: Fix compatibility with Python 3.10 - -Development build environment + gst-full build - -- build: Fix some compiler warnings by upgrading wraps -- dv, opusparse: fix duplicate symbols in static build -- Fix fedora 36 warnings - OpenSSL 3.0 deprecations + GLib 2.72 - tls-validation deprecations -- Various macOS build fixes -- meson: Improve certifi documentation on macOS - -Cerbero build tool and packaging changes in 1.20.4 - -- Add Ubuntu 22.04 Jammy Jellyfish -- Add gst-rtsp-server library to the macOS framework -- cerbero: Quick fix for gen-cache breakage -- macos: Fix the install_name for the GStreamer framework -- Download using powershell on Windows and rework download func -- macos: Add arm64 to the metadata for the installer -- cerbero: Allow building on Linux ARM64 -- pkg-config.recipe: Add to core platform files list -- git: Fix issue with last security patch -- distros: Fix CentOS allowance -- cerbero: Print working directory for commands that are run -- cerbero: Fix license property usage example -- Fix issue getting distro_version in Debian Bookworm -- glib: Fix gio modules loading on macOS -- cmake: Fix macOS ARM64 -> x86_64 cross-compilation -- Fix logo display in macOS installer -- openssl.recipe: Fix segfault on latest macOS -- msvc: Fix for broken CRT linking at application project because of - MSVCRT linking -- cerbero: Do not add rpaths that already exist on macOS -- android: fix build with android gradle plugin 7.2 -- macOS framework is unusable starting from 1.18.0 - -Contributors to 1.20.4 - -Adrian Fiergolski, Aleksandr Slobodeniuk, Andoni Morales Alastruey, -Andrew Pritchard, Bruce Liang, Corentin Damman, Daniel Morin, Edward -Hervey, Elliot Chen, Fabian Orccon, fduncanh, Guillaume Desmottes, -Haihua Hu, He Junyan, Ignazio Pillai, James Cowgill, James Hilliard, Jan -Alexander Steffens (heftig), Jan Schmidt, Jianhui Dai, Jonas Danielsson, -Jordan Petridis, Khem Raj, Krystian Wojtas, Martin Dørum, Mart Raudsepp, -Mathieu Duponchelle, Matthew Waters, Matthias Clasen, Nicolas Dufresne, -Nirbheek Chauhan, Olivier Crête, Paweł Stawicki, Philippe Normand, -Philipp Zabel, Piotr Brzeziński, Rafael Caricio, Rafael Sobral, Raul -Tambre, Ruben Gonzalez, Sangchul Lee, Sebastian Dröge, Seungha Yang, -Stéphane Cerveau, Thibault Saunier, Tim-Philipp Müller, Tristan -Matthews, Víctor Manuel Jáquez Leal, Xavier Claessens, Zhiyuan Liu, +- Android support now requires Android API version 21 (Lollipop) +- Support for Android Gradle plugin 7.2 -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. Thank you all! +Platform-specific changes and improvements -List of merge requests and issues fixed in 1.20.4 +Android -- List of Merge Requests applied in 1.20.4 -- List of Issues fixed in 1.20.4 +- Android SDK 21 is required now as minimum SDK version -1.20.5 +- androidmedia: Add H.265 / HEVC video encoder mapping -The fifth 1.20 bug-fix release (1.20.5) was released on 19 December -2022. - -This release only contains bugfixes and it should be safe to upgrade -from 1.20.x. - -Highlighted bugfixes in 1.20.5 - -- systemclock waiting fixes for certain 32-bit platforms/libcs -- alphacombine: robustness improvements for corner case scenarios -- avfvideosrc: Report latency when doing screen capture -- d3d11videosink: various thread-safety and stability fixes -- decklink: fix performance issue when HDMI signal has been lost for a - long time -- flacparse: Fix handling of headers advertising 32 bits per sample -- mpegts: Handle when iconv doesn’t support ISO 6937 (e.g. musl libc) -- opengl: fix automatic dispmanx detection for rpi4 and fix usage of - eglCreate/DestroyImage -- opusdec: Various channel-related fixes -- textrender: event handling fixes, esp. for GAP event -- subparse: Fix non-closed tag handling -- videoscale: fix handling of unknown buffer metas -- videosink: reverse playback handling fixes -- qtmux: Prefill mode fixes, especially for raw audio -- multiudpsink: allow binding to IPv6 address -- rtspsrc: Fix usage of IPv6 connections in SETUP -- rtspsrc: Only EOS on timeout if all streams are timed out/EOS -- splitmuxsrc: fix playback stall if there are unlinked pads -- v4l2: Fix SIGSEGV on state change during format changes -- wavparse robustness fixes -- Fix static linking on macOS (opengl, vulkan) -- gstreamer-vaapi: fix headless build against mesa >= 22.3.0 -- GStreamer Editing Services library: Fix build with tools disabled -- webrtc example/demo fixes -- unit test fixes for aesdec and rtpjitterbuffer -- Cerbero: Fix ios cross-compile with cmake on M1; some recipe updates - and other build fixes -- Binary packages: pkg-config file fixes for various recipes (ffmpeg, - taglib, gstreamer) -- Binary packages: Enable high bitdepth support for libvpx (VP8/VP9 - encoding/decoding) -- Binary packages: ship aes plugin -- Miscellaneous bug fixes, memory leak fixes, and other stability and - reliability improvements -- Performance improvements - -gstreamer - -- allocator: Copy allocator name in gst_allocator_register() -- miniobject: support higher refcount values -- pads: Fix non-serialized sticky event push, e.g. instant change rate - events -- padtemplate: Fix annotations -- systemclock: Use futex_time64 syscall on x32 and other platforms - that always… -- Fix build of 1.20 branch with Meson 0.64.1 for those who have hotdoc - installed on their system. -- meson: fix check for pthread_setname_np() -- -Wimplicit-function-declaration in pthread_setname_np check (missing - _GNU_SOURCE) -- gst-inspect: Don’t leak list - -Core Elements - -- concat: Properly propagate EOS seqnum -- fakesrc: avoid time overflow with datarate - -gst-plugins-base - -- audioconvert, audioresample, audiofilter: fix divide by 0 for input - buffer without caps -- cdparanoia: Ignore compiler warning coming from the cdparanoia - header -- oggdemux, parsebin: More leak fixes -- opengl: fix automatic dispmanx detection for rpi4 -- opengl: Fix usage of eglCreate/DestroyImage -- opengl: Fix static linking on macOS -- opusdec: Various channel-related fixes -- textrender: Negotiate caps on a GAP event if none were negotiated - yet -- textrender: Don’t blindly forward all events and don’t blindly - forward all events -- timeoverlay: fix pad leak -- oggdemux: Don’t leak incoming EOS event -- subparse: Fix non-closed tag handling. -- videodecoder: Only post latency message if it changed -- videoscale: buffer meta handling fixes (NULL-terminate array of - valid meta tags) -- videosink: Don’t return unknown end-time from get_times() -- Bump core requirement in 1.20 branch to 1.20.4 +- Implement JNI_OnLoad() to register static plugins etc. automatically + in case GStreamer is loaded from Java using System.loadLibrary(), + which is also useful for the gst-full deployment scenario. + +Apple macOS and iOS + +- The GLib version shipped with the GStreamer binaries does not + initialize an NSApp and does not run a NSRunLoop on the main thread + anymore. This was a custom GLib patch and caused it to behave + different from the GLib shipped by Homebrew or anybody else. + + The change was originally introduced because various macOS APIs + require a NSRunLoop to run on the main thread to function correctly + but as this change will never get merged into GLib and it was + reverted for 1.22. Applications that relied on this behaviour should + move to the new gst_macos_main() function, which also does not + require the usage of a GMainLoop. + + See e.g. gst-play.c for an example for the usage of + gst_macos_main(). + +- GStreamer.framework and all libraries in it are now relocatable, + which means they use LC_RPATH entries to find dependencies instead + of using an absolute path. If you link to GStreamer using the + pkgconfig files, no action is necessary. However, if you use the + framework directly or link to the libraries inside the framework by + hand, then you need to pass -Wl,-rpath,<path_to_libdir> to the + linker. + +- avfvideosrc: Allow specifying crop coordinates during screen capture + +- vtenc, vtdec: H.265 / HEVC video encoding + decoding support + +- osxaudiosrc: Support a device as both input and output + + - osxaudiodeviceprovider now probes devices more than once to + determine if the device can function as both an input AND and + output device. Previously, if the device provider detected that + a device had any output capabilities, it was treated solely as + an Audio/Sink. This caused issues for devices that have both + input and output capabilities (for example, USB interfaces for + professional audio have both input and output channels). Such + devicesare now listed as both an Audio/Sink as well as an + Audio/Source. + +- osxaudio: support hidden devices on macOS + + - These are devices that will not be shown in the macOS UIs and + that cannot be retrieved without having the specific UID of the + hidden device. There are cases when you might want to have a + hidden device, for example when having a virtual speaker that + forwards the data to a virtual hidden input device from which + you can then grab the audio. The blackhole project supports + these hidden devices and this change provides a way that if the + device id is a hidden device it will use it instead of checkinf + the hardware list of devices to understand if the device is + valid. -Tools +Windows -- gst-play: Don’t leak the stream collection +- win32ipcvideosink, win32ipcvideosrc: new shared memory videosrc/sink + elements -gst-plugins-good +- wasapi2: Add support for process loopback capture for a specified + PID (requires Windows 11/Windows Server 2022) -- flacparse: Fix handling of headers advertising 32bps -- qt5: deactivate context if fill_info fails -- qt5: initialize GError properly in gst_qt_get_gl_wrapcontext() -- qtdemux: check return value from gst_structure_get in PIFF box -- qtdemux: use unsigned int types to store result of QT_UINT32 -- qtmux: Prefill mode fixes -- oss4: Fix debug category initialization -- multiudpsink: allow binding to IPv6 address -- rtpjitterbuffer tests: Cast drop-messages-interval type properly - (fixing it on 32-bit architectures) -- rtspsrc: fix seek event leaks -- rtspsrc: Don’t replace 404 errors with “no auth protocol found” -- rtspsrc: Only EOS on timeout if all streams are timed out/EOS -- rtspsrc: Fix usage of IPv6 connections in SETUP -- splitmuxsrc: don’t queue data on unlinked pads -- v4l2: Fix SIGSEGV on ‘change state’ during ‘format change’ -- v4l2videodec: Fix activation of internal pool -- wavparse: Avoid occasional crash due to referencing freed buffer. -- wavparse: Fix crash that occurs in push mode when header chunks are - corrupted in certain ways. - -gst-plugins-bad - -- aesdec: Fix padding removal for per-buffer-padding=FALSE -- aesdec test failing in gst-plugins-bad -- alphacombine: Add missing query handler for gaps -- avfdeviceprovider: do not leak the properties -- avfvideosrc: Report latency when doing screen capture -- d3d11screencapturesrc: Specify PAR 1/1 to template caps -- d3d11videosink: Fixing focus lost on desktop layout change -- d3d11videosink: Call ShowWindow() from window thread -- d3d11videosink: Fix deadlock when parent window is busy -- d3d11videosink: Always clear back buffer on resize -- decklink: reset calculation of time_mapping to fix clipping HDMI - video -- directshow: Fix build error with glib 2.75 and newer -- dvbsubenc: Forward GAP events as-is if we wouldn’t produce an end - packet and… -- dvbsubenc: Write Display Definition Segment if a non-default - width/height is used -- h265decoder: Do not abort when failed to prepare ref pic set -- h264parser: Fix a typo in pred_weight_table parsing. -- mediafoundation, d3d11: Fix memory leak and make leak tracer happy -- mpegts: Handle when iconv doesn’t support ISO 6937 (e.g. musl libc) -- mpegts: Check continuity counter on section streams -- mpegts: Revert “mpegtspacketizer: memcmp potentially seen_before - data” -- mpegtspacketizer: memcmp potentially seen_before data -- mpegtsdemux: Always clear packetizer on DISCONT push mode -- srt: various fixes - improve stats and error handling -- rtmp2: Improve error messages -- rtmp2sink: Correctly return GST_FLOW_ERROR on error -- vulkan: Fix static linking on macOS -- webrtcbin: also add rtcp-fb ccm fir for video mlines by default -- webrtc/nice: fix small leak of split strings +- The Windows universal UWP build is currently non-functional and will + need updating after the recent GLib upgrade. It is unclear if anyone + is using these binaries, so if you are please make yourself known. -gst-plugins-ugly +- wicjpegdec, wicpngdec: Windows Imaging Component (WIC) based JPEG + and PNG decoder elements. -- No changes +- mfaacdec, mfmp3dec: Windows MediaFoundation AAC and MP3 decoders -gst-libav +- The uninstalled development environment supports PowerShell 7 now -- avdec_h265: Fix endless renegotiation with alternate interlacing -- avviddec: Avoid flushing on framerate changes +Linux -gst-rtsp-server +- Improved design for DMA buffer sharing and modifier handling for + hardware-accelerated video decoders/encoders/filters and + capture/rendering on Linux and Linux-like system. + +- kmssink + + - new “fd” property which allows an application to provide their + own opened DRM device fd handle to kmssink. That way an + application can lease multiple fd’s from a DRM master to display + on different CRTC outputs at the same time with multiple kmssink + instances, for example. + - new “skip-vsync” property to achieve full framerate with legacy + emulation in drivers. + - HDR10 infoframe support + +- va plugin and gstreamer-vaapi improvements (see above) + +- waylandsink: Add “rotate-method” property and “render-rectangle” + property + +- new gtkwaylandsink element based on gtksink, but similar to + waylandsink and uses Wayland APIs directly instead of rendering with + Gtk/Cairo primitives. This approach is only compatible with Gtk3, + and like gtksink this element only supports Gtk3. -- rtsp-server: Free client if no connection could be created +Documentation improvements -gstreamer-vaapi +- The GStreamer Rust plugins are now included and documented in the + plugin documentation. -- vaapi: prefix internal USE_X11 define to fix build with mesa 22.3.0 -- vaapi: libs: context: use queried value for attrib -- gstreamer-vaapi cannot be built without X11 with recent mesa +Possibly Breaking Changes -gstreamer-sharp +- the Opus audio RTP payloader and depayloader no longer accept the + lower case encoding-format=multiopus but instead produce and accept + only the upper case variant encoding-format=MULTIOPUS, since those + should always be upper case in GStreamer (caps fields are always + case sensitive). This should hopefully only affect applications + where RTP caps are set manually and multi-channel audio (>= 3 + channels) is used. + +- wpesrc: the URI handler protocols changed from wpe:// and web:// to + web+http://, web+https://, and web+file:// which means URIs are RFC + 3986 compliant and the source can simply strip the prefix from the + protocol. + +- The Windows screen capture element dxgiscreencapsrc has been + removed, please use d3d11screencapturesrc instead. + +- On Android the minimum supported Android API version is now version + 21 and has been increased from 16. + +- On macOS, the GLib version shipped with the GStreamer binaries will + no longer initialize an NSApp or run an NSRunLoop on the main + thread. See macOS/iOS section above for details. + +- decklink: The decklink plugin is now using the 12.2.2 version of the + SDK and will not work with drivers older than version 12. + +- On iOS Apple Bitcode support was removed from the binaries. This + feature is deprecated since XCode 14 and not used on the App Store + anymore. + +- The MP4/Matroska/WebM muxers now require the “stream-format” to be + provided as part of the AV1 caps as only the original “obu-stream” + format is supported in these containers and not the “annexb” format. -- No changes +Known Issues -gst-omx +- The Windows UWP build in Cerbero needs fixing after the recent GLib + upgrade (see above) -- No changes +- The C# bindings have not been updated to include new 1.22 API yet + (see above) -gst-python +Statistics -- No changes +- 4072 commits -gst-editing-services +- 2224 Merge Requests -- Fix building ges with tools disabled -- Fix leaks and minor races in GES +- 716 Issues -gst-examples: +- 200+ Contributors -- webrtc: Fix double free in webrtc-recvonly-h264 demo -- webrtc: Fix critical in webrtc-recvonly-h264 example -- webrtc/signalling examples: Fix compatibility with Python 3.10 +- ~33% of all commits and Merge Requests were in Rust modules -Development build environment + gst-full build +- 4747 files changed -- No major changes +- 469633 lines added -Cerbero build tool and packaging changes in 1.20.5 +- 209842 lines deleted -- oven: output status line at least every minute -- Unconditionally set CMAKE_SYSTEM_NAME on Windows -- Fix ios cross-compile with cmake on M1 -- Speed up downloads on Windows drastically -- Fix tar usage on bsdtar and print progress while compressing -- Actually print the sha for which the cache was not found +- 259791 lines added (net) -Recipes +Contributors -- ffmpeg: add patch to generate the pc files properly -- taglib: add patch to generate the pc files properly -- fontconfig: update to 2.14.1 -- Windows: Crash on GStreamer 1.20.x x86_64 MSVC + MS-Windows due to - libfontconfig fonts.conf file invalid. -- openssl: Fix compile errors on upgrades -- moltenvk: Also ship the static library on macOS -- gstreamer: Add some missing pkgconfig files -- gst-plugins-good: Fix post_install failure when qt5 is enabled -- gst-plugins-bad: Ship AES plugin -- libvpx: Enable high bitdepth support -- openssl: update to 1.1.1s -- glib: Update patch to auto-detect modules on macOS +Ádám Balázs, Adam Doupe, Adrian Fiergolski, Adrian Perez de Castro, Alba +Mendez, Aleix Conchillo Flaqué, Aleksandr Slobodeniuk, Alicia Boya +García, Alireza Miryazdi, Andoni Morales Alastruey, Andrew Pritchard, +Arun Raghavan, A. Wilcox, Bastian Krause, Bastien Nocera, Benjamin +Gaignard, Bill Hofmann, Bo Elmgreen, Boyuan Zhang, Brad Hards, Branko +Subasic, Bruce Liang, Bunio FH, byran77, Camilo Celis Guzman, Carlos +Falgueras García, Carlos Rafael Giani, Célestin Marot, Christian Wick, +Christopher Obbard, Christoph Reiter, Chris Wiggins, Chun-wei Fan, Colin +Kinloch, Corentin Damman, Corentin Noël, Damian Hobson-Garcia, Daniel +Almeida, Daniel Morin, Daniel Stone, Daniels Umanovskis, Danny Smith, +David Svensson Fors, Devin Anderson, Diogo Goncalves, Dmitry Osipenko, +Dongil Park, Doug Nazar, Edward Hervey, ekwange, Eli Schwartz, Elliot +Chen, Enrique Ocaña González, Eric Knapp, Erwann Gouesbet, Evgeny +Pavlov, Fabian Orccon, Fabrice Fontaine, Fan F He, F. Duncanh, Filip +Hanes, Florian Zwoch, François Laignel, Fuga Kato, George Kiagiadakis, +Guillaume Desmottes, Gu Yanjie, Haihao Xiang, Haihua Hu, Havard Graff, +Heiko Becker, He Junyan, Henry Hoegelow, Hiero32, Hoonhee Lee, Hosang +Lee, Hou Qi, Hugo Svirak, Ignacio Casal Quinteiro, Ignazio Pillai, Igor +V. Kovalenko, Jacek Skiba, Jakub Adam, James Cowgill, James Hilliard, +Jan Alexander Steffens (heftig), Jan Lorenz, Jan Schmidt, Jianhui Dai, +jinsl00000, Johan Sternerup, Jonas Bonn, Jonas Danielsson, Jordan +Petridis, Joseph Donofry, Jose Quaresma, Julian Bouzas, Junsoo Park, +Justin Chadwell, Khem Raj, Krystian Wojtas, László Károlyi, Linus +Svensson, Loïc Le Page, Ludvig Rappe, Marc Leeman, Marek Olejnik, Marek +Vasut, Marijn Suijten, Mark Nauwelaerts, Martin Dørum, Martin Reboredo, +Mart Raudsepp, Mathieu Duponchelle, Matt Crane, Matthew Waters, Matthias +Clasen, Matthias Fuchs, Mengkejiergeli Ba, MGlolenstine, Michael Gruner, +Michiel Konstapel, Mikhail Fludkov, Ming Qian, Mingyang Ma, Myles +Inglis, Nicolas Dufresne, Nirbheek Chauhan, Olivier Crête, Pablo Marcos +Oltra, Patricia Muscalu, Patrick Griffis, Paweł Stawicki, Peter +Stensson, Philippe Normand, Philipp Zabel, Pierre Bourré, Piotr +Brzeziński, Rabindra Harlalka, Rafael Caricio, Rafael Sobral, Rafał +Dzięgiel, Raul Tambre, Robert Mader, Robert Rosengren, Rodrigo +Bernardes, Rouven Czerwinski, Ruben Gonzalez, Sam Van Den Berge, +Sanchayan Maity, Sangchul Lee, Sebastian Dröge, Sebastian Fricke, +Sebastian Groß, Sebastian Mueller, Sebastian Wick, Sergei Kovalev, +Seungha Yang, Seungmin Kim, sezanzeb, Sherrill Lin, Shingo Kitagawa, +Stéphane Cerveau, Talha Khan, Taruntej Kanakamalla, Thibault Saunier, +Tim Mooney, Tim-Philipp Müller, Tomasz Andrzejak, Tom Schuring, Tong Wu, +toor, Tristan Matthews, Tulio Beloqui, U. Artie Eoff, Víctor Manuel +Jáquez Leal, Vincent Cheah Beng Keat, Vivia Nikolaidou, Vivienne +Watermeier, WANG Xuerui, Wojciech Kapsa, Wonchul Lee, Wu Tong, Xabier +Rodriguez Calvar, Xavier Claessens, Yatin Mann, Yeongjin Jeong, Zebediah +Figura, Zhao Zhili, Zhiyuaniu, مهدي شينون (Mehdi Chinoune), -Contributors to 1.20.5 +… and many others who have contributed bug reports, translations, sent +suggestions or helped testing. -Aleksandr Slobodeniuk, Arun Raghavan, A. Wilcox, Bo Elmgreen, Boyuan -Zhang, Bunio FH, Célestin Marot, Devin Anderson, Edward Hervey, He -Junyan, Ignacio Casal Quinteiro, Jacek Skiba, Jan Alexander Steffens -(heftig), Jan Schmidt, Jonas Bonn, Jordan Petridis, Justin Chadwell, -Linus Svensson, Marek Olejnik, Mathieu Duponchelle, Matthew Waters, -Nicolas Dufresne, Nirbheek Chauhan, Patrick Griffis, Pawel Stawicki, -Philippe Normand, Ruben Gonzalez, Sam Van Den Berge, Sebastian Dröge, -Seungha Yang, Stéphane Cerveau, Tim-Philipp Müller, Vivia Nikolaidou, -Wojciech Kapsa, Xavier Claessens, +Stable 1.22 branch -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. Thank you all! +After the 1.22.0 release there will be several 1.22.x bug-fix releases +which will contain bug fixes which have been deemed suitable for a +stable branch, but no new features or intrusive changes will be added to +a bug-fix release usually. The 1.22.x bug-fix releases will be made from +the git 1.22 branch, which will be a stable branch. -List of merge requests and issues fixed in 1.20.5 +1.22.0 -- List of Merge Requests applied in 1.20.5 -- List of Issues fixed in 1.20.5 +1.22.0 was originally released on 23 January 2023. -Schedule for 1.22 +Schedule for 1.24 -Our next major feature release will be 1.22, and 1.21 will be the -unstable development version leading up to the stable 1.22 release. The -development of 1.21/1.22 will happen in the git main branch. +Our next major feature release will be 1.24, and 1.23 will be the +unstable development version leading up to the stable 1.24 release. The +development of 1.23/1.24 will happen in the git main branch of the +GStreamer mono repository. -The plan for the 1.22 development cycle is now confirmed, and we aim for -a 1.22.0 release in December 2022 or early January 2023. +The plan for the 1.24 development cycle is yet to be confirmed. -1.22 will be backwards-compatible to the stable 1.20, 1.18, 1.16, 1.14, -1.12, 1.10, 1.8, 1.6, 1.4, 1.2 and 1.0 release series. +1.24 will be backwards-compatible to the stable 1.22, 1.20, 1.18, 1.16, +1.14, 1.12, 1.10, 1.8, 1.6, 1.4, 1.2 and 1.0 release series. ------------------------------------------------------------------------ These release notes have been prepared by Tim-Philipp Müller with -contributions from Matthew Waters, Nicolas Dufresne, Nirbheek Chauhan, -Sebastian Dröge and Seungha Yang. +contributions from Edward Hervey, Matthew Waters, Nicolas Dufresne, +Nirbheek Chauhan, Olivier Crête, Sebastian Dröge, Seungha Yang, and +Thibault Saunier. License: CC BY-SA 4.0
View file
gst-plugins-bad-1.20.5.tar.xz/RELEASE -> gst-plugins-bad-1.22.0.tar.xz/RELEASE
Changed
@@ -1,4 +1,4 @@ -This is GStreamer gst-plugins-bad 1.20.5. +This is GStreamer gst-plugins-bad 1.22.0. The GStreamer team is thrilled to announce a new major feature release of your favourite cross-platform multimedia framework! @@ -6,12 +6,12 @@ As always, this release is again packed with new features, bug fixes and other improvements. -The 1.20 release series adds new features on top of the 1.18 series and is +The 1.22 release series adds new features on top of the 1.20 series and is part of the API and ABI-stable 1.x release series. Full release notes can be found at: - https://gstreamer.freedesktop.org/releases/1.20/ + https://gstreamer.freedesktop.org/releases/1.22/ Binaries for Android, iOS, Mac OS X and Windows will usually be provided shortly after the release. @@ -53,6 +53,9 @@ - gst-editing-services: library an plugins for non-linear editing + - gst-plugins-rs: an exciting collection of well-maintained plugins written + in the Rust programming language (usable from any language) + ==== Download ==== You can find source releases of gstreamer in the download @@ -80,7 +83,8 @@ For help and support, please subscribe to and send questions to the gstreamer-devel mailing list (see below for details). -There is also a #gstreamer IRC channel on the OFTC IRC network. +There is also a #gstreamer IRC channel on the OFTC IRC network, which is +also bridged into the Matrix network. Please do not submit support requests in GitLab, we only use it for bug tracking and merge requests review.
View file
gst-plugins-bad-1.20.5.tar.xz/data/meson.build -> gst-plugins-bad-1.22.0.tar.xz/data/meson.build
Changed
@@ -16,8 +16,15 @@ 'device', 'targets/device/dvd.gep',, +srcdirs = + foreach path_targets : encoding_targets dir = join_paths(encoding_targetsdir, path_targets.get(0)) etargets = path_targets.get(1) install_data(sources: etargets, install_dir: dir) + srcdirs += meson.current_source_dir() / 'targets' / path_targets.get(0) endforeach + +env = environment() +env.prepend('GST_ENCODING_TARGET_PATH', srcdirs) +meson.add_devenv(env)
View file
gst-plugins-bad-1.22.0.tar.xz/docs/libs/cuda
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/docs/libs/cuda/index.md
Added
@@ -0,0 +1,7 @@ +# Cuda library + +This library should be linked to by getting cflags and libs from +gstreamer-cuda-{{ gst_api_version.md }}.pc + +> NOTE: This library API is considered *unstable* +
View file
gst-plugins-bad-1.22.0.tar.xz/docs/libs/cuda/sitemap.txt
Added
@@ -0,0 +1,1 @@ +gi-index
View file
gst-plugins-bad-1.22.0.tar.xz/docs/libs/va
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/docs/libs/va/index.md
Added
@@ -0,0 +1,11 @@ +# VA library + +Library for sharing and handling VADisplay inside GStreamer's pipelines. + +This library should be linked to by getting cflags and libs from +gstreamer-va{{ gst_api_version.md }}.pc + +More information about VA-API +http://intel.github.io/libva/index.html(http://intel.github.io/libva/index.html) + +> NOTE: This library API is considered *unstable*
View file
gst-plugins-bad-1.22.0.tar.xz/docs/libs/va/sitemap.txt
Added
@@ -0,0 +1,1 @@ +gi-index
View file
gst-plugins-bad-1.20.5.tar.xz/docs/meson.build -> gst-plugins-bad-1.22.0.tar.xz/docs/meson.build
Changed
@@ -40,7 +40,7 @@ if plugins.length() == 0 message('All bad plugins have been disabled') elif plugins_cache_generator.found() - plugins_doc_dep = custom_target('bad-plugins-doc-cache', + gst_plugins_doc_dep = custom_target('bad-plugins-doc-cache', command: plugins_cache_generator, plugins_cache, '@OUTPUT@', '@INPUT@', input: plugins, output: 'gst_plugins_cache.json', @@ -102,9 +102,15 @@ 'ext/closedcaption/raw_decoder.ch', 'ext/closedcaption/sampling_par.ch', 'ext/closedcaption/sliced.ch', - 'ext/*/*.h', - 'sys/*/*.h', - 'gst/*/*.h', + 'ext/lv2/gstlv2utils.h', + 'ext/closedcaption/hamm.h', + 'ext/closedcaption/io-sim.h', + 'ext/avtp/gstavtpcrfbase.h', + 'sys/nvcodec/nvEncodeAPI.h', + 'sys/nvcodec/cuviddec.h', + 'sys/nvcodec/nvcuvid.h', + 'sys/winks/ksvideohelpers.h', + 'gst/videoparsers/gstjpeg2000parse.h', 'gst-libs/gst/*/*-prelude.h', 'gst-libs/gst/vulkan/vulkan_fwd.h' @@ -125,6 +131,7 @@ {'name': 'audio', 'gir': audio_gir, 'lib': gstbadaudio_dep, 'prefix': 'bad-'}, {'name': 'transcoder', 'gir': transcoder_gir, 'lib': gst_transcoder_dep}, {'name': 'codecs', 'gir': codecs_gir, 'lib': gstcodecs_dep}, + {'name': 'cuda', 'gir': gst_cuda_gir, 'lib': gstcuda_dep}, if gstopencv_dep.found() @@ -133,6 +140,10 @@ endif + if gstva_dep.found() + libs += {'name': 'va', 'gir': va_gir, 'lib': gstva_dep, 'suffix': 'lib'} + endif + if gstvulkan_dep.found() libs += {'name': 'vulkan', 'gir': vulkan_gir, 'lib': gstvulkan_dep, 'suffix': 'lib'}, @@ -187,6 +198,7 @@ dependencies: lib, gir, c_flags: '-DGST_USE_UNSTABLE_API', install: false, + depends: gir0, ) endif else @@ -240,7 +252,7 @@ join_paths(root_rel, 'gst/*/*.ch'), join_paths(root_rel, 'gst/rtmp2/*/*.ch'), , - dependencies: gst_dep, plugins, + dependencies: gst_dep, install: false, disable_incremental_build: true, gst_cache_file: plugins_cache,
View file
gst-plugins-bad-1.20.5.tar.xz/docs/plugins/gst_plugins_cache.json -> gst-plugins-bad-1.22.0.tar.xz/docs/plugins/gst_plugins_cache.json
Changed
@@ -456,6 +456,645 @@ "tracers": {}, "url": "Unknown package origin" }, + "amfcodec": { + "description": "AMD AMF Codec plugin", + "elements": { + "amfh264enc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Encode H.264 video streams using AMF API", + "hierarchy": + "GstAmfH264Enc", + "GstAmfEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: NV12\n width: 128, 4096 \n height: 128, 4096 \nvideo/x-raw:\n format: NV12\n width: 128, 4096 \n height: 128, 4096 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-h264:\n width: 128, 4096 \n height: 128, 4096 \n profile: { (string)main, (string)high, (string)constrained-baseline, (string)baseline }\n stream-format: { (string)avc, (string)byte-stream }\n alignment: au\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "adapter-luid": { + "blurb": "DXGI Adapter LUID (Locally Unique Identifier) of associated GPU", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "9223372036854775807", + "min": "-9223372036854775808", + "mutable": "null", + "readable": true, + "type": "gint64", + "writable": false + }, + "aud": { + "blurb": "Use AU (Access Unit) delimiter", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "bitrate": { + "blurb": "Target bitrate in kbit/sec (0: USAGE default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "cabac": { + "blurb": "Enable CABAC entropy coding", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "gop-size": { + "blurb": "Number of pictures within a GOP (-1: USAGE default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "2147483647", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-bitrate": { + "blurb": "Maximum bitrate in kbit/sec (0: USAGE default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp": { + "blurb": "Maximum allowed QP value (-1: USAGE default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp": { + "blurb": "Minimum allowed QP value (-1: USAGE default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "preset": { + "blurb": "Preset", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "default (-1)", + "mutable": "playing", + "readable": true, + "type": "GstAmfH264EncPreset", + "writable": true + }, + "qp-i": { + "blurb": "Constant QP for I frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "22", + "max": "51", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-p": { + "blurb": "Constant QP for P frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "22", + "max": "51", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "rate-control": { + "blurb": "Rate Control Method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "default (-1)", + "mutable": "playing", + "readable": true, + "type": "GstAmfH264EncRateControl", + "writable": true + }, + "ref-frames": { + "blurb": "Number of reference frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "1", + "max": "16", + "min": "1", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "usage": { + "blurb": "Target usage", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "transcoding (0)", + "mutable": "playing", + "readable": true, + "type": "GstAmfH264EncUsage", + "writable": true + } + }, + "rank": "primary" + }, + "amfh265enc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Encode H.265 video streams using AMF API", + "hierarchy": + "GstAmfH265Enc", + "GstAmfEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: NV12\n width: 128, 4096 \n height: 128, 4096 \nvideo/x-raw:\n format: NV12\n width: 128, 4096 \n height: 128, 4096 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-h265:\n width: 128, 4096 \n height: 128, 4096 \n profile: main\n stream-format: byte-stream\n alignment: au\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "adapter-luid": { + "blurb": "DXGI Adapter LUID (Locally Unique Identifier) of associated GPU", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "9223372036854775807", + "min": "-9223372036854775808", + "mutable": "null", + "readable": true, + "type": "gint64", + "writable": false + }, + "aud": { + "blurb": "Use AU (Access Unit) delimiter", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "bitrate": { + "blurb": "Target bitrate in kbit/sec (0: USAGE default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "gop-size": { + "blurb": "Number of pictures within a GOP", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "30", + "max": "2147483647", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "max-bitrate": { + "blurb": "Maximum bitrate in kbit/sec (0: USAGE default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp-i": { + "blurb": "Maximum allowed QP value for I frames (-1: USAGE default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-qp-p": { + "blurb": "Maximum allowed QP value for P frames (-1: USAGE default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-i": { + "blurb": "Minimum allowed QP value for I frames (-1: USAGE default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-p": { + "blurb": "Minimum allowed QP value for P frames (-1: USAGE default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "preset": { + "blurb": "Preset", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "default (-1)", + "mutable": "playing", + "readable": true, + "type": "GstAmfH265EncPreset", + "writable": true + }, + "qp-i": { + "blurb": "Constant QP for I frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "26", + "max": "51", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-p": { + "blurb": "Constant QP for P frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "26", + "max": "51", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "rate-control": { + "blurb": "Rate Control Method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "default (-1)", + "mutable": "playing", + "readable": true, + "type": "GstAmfH265EncRateControl", + "writable": true + }, + "ref-frames": { + "blurb": "Number of reference frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "1", + "max": "16", + "min": "1", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "usage": { + "blurb": "Target usage", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "transcoding (0)", + "mutable": "playing", + "readable": true, + "type": "GstAmfH265EncUsage", + "writable": true + } + }, + "rank": "primary" + } + }, + "filename": "gstamfcodec", + "license": "LGPL", + "other-types": { + "GstAmfEncoder": { + "hierarchy": + "GstAmfEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "kind": "object" + }, + "GstAmfH264EncPreset": { + "kind": "enum", + "values": + { + "desc": "Default, depends on USAGE", + "name": "default", + "value": "-1" + }, + { + "desc": "Balanced", + "name": "balanced", + "value": "0" + }, + { + "desc": "Speed", + "name": "speed", + "value": "1" + }, + { + "desc": "Quality", + "name": "quality", + "value": "2" + } + + }, + "GstAmfH264EncRateControl": { + "kind": "enum", + "values": + { + "desc": "Default, depends on Usage", + "name": "default", + "value": "-1" + }, + { + "desc": "Constant QP", + "name": "cqp", + "value": "0" + }, + { + "desc": "Constant Bitrate", + "name": "cbr", + "value": "1" + }, + { + "desc": "Peak Constrained VBR", + "name": "vbr", + "value": "2" + }, + { + "desc": "Latency Constrained VBR", + "name": "lcvbr", + "value": "3" + } + + }, + "GstAmfH264EncUsage": { + "kind": "enum", + "values": + { + "desc": "Transcoding", + "name": "transcoding", + "value": "0" + }, + { + "desc": "Ultra Low Latency", + "name": "ultra-low-latency", + "value": "1" + }, + { + "desc": "Low Latency", + "name": "low-latency", + "value": "2" + }, + { + "desc": "Webcam", + "name": "webcam", + "value": "3" + } + + }, + "GstAmfH265EncPreset": { + "kind": "enum", + "values": + { + "desc": "Default, depends on USAGE", + "name": "default", + "value": "-1" + }, + { + "desc": "Quality", + "name": "quality", + "value": "0" + }, + { + "desc": "Balanced", + "name": "balanced", + "value": "5" + }, + { + "desc": "Speed", + "name": "speed", + "value": "10" + } + + }, + "GstAmfH265EncRateControl": { + "kind": "enum", + "values": + { + "desc": "Default, depends on Usage", + "name": "default", + "value": "-1" + }, + { + "desc": "Constant QP", + "name": "cqp", + "value": "0" + }, + { + "desc": "Latency Constrained VBR", + "name": "lcvbr", + "value": "1" + }, + { + "desc": "Peak Constrained VBR", + "name": "vbr", + "value": "2" + }, + { + "desc": "Constant Bitrate", + "name": "cbr", + "value": "3" + } + + }, + "GstAmfH265EncUsage": { + "kind": "enum", + "values": + { + "desc": "Transcoding", + "name": "transcoding", + "value": "0" + }, + { + "desc": "Ultra Low Latency", + "name": "ultra-low-latency", + "value": "1" + }, + { + "desc": "Low Latency", + "name": "low-latency", + "value": "2" + }, + { + "desc": "Webcam", + "name": "webcam", + "value": "3" + } + + } + }, + "package": "GStreamer Bad Plug-ins", + "source": "gst-plugins-bad", + "tracers": {}, + "url": "Unknown package origin" + }, "aom": { "description": "AOM plugin library", "elements": { @@ -485,7 +1124,7 @@ } }, "properties": {}, - "rank": "primary" + "rank": "secondary" }, "av1enc": { "author": "Sean DuBois <sean@siobud.com>", @@ -510,7 +1149,7 @@ "presence": "always" }, "src": { - "caps": "video/x-av1:\n", + "caps": "video/x-av1:\n alignment: tu\n", "direction": "src", "presence": "always" } @@ -565,7 +1204,7 @@ "construct-only": false, "controllable": false, "default": "0", - "max": "5", + "max": "10", "min": "0", "mutable": "null", "readable": true, @@ -586,6 +1225,18 @@ "type": "guint", "writable": true }, + "enc-pass": { + "blurb": "Current phase for multi-pass encoding or @GST_AV1_ENC_ONE_PASS for single pass", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "one-pass (0)", + "mutable": "null", + "readable": true, + "type": "GstAV1EncEncPass", + "writable": true + }, "end-usage": { "blurb": "Rate control algorithm to use, indicates the end usage of this stream", "conditionally-available": false, @@ -598,6 +1249,46 @@ "type": "GstAV1EncEndUsageMode", "writable": true }, + "keyframe-max-dist": { + "blurb": "Maximum distance between keyframes (number of frames)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "30", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + }, + "keyframe-mode": { + "blurb": "Determines whether keyframes are placed automatically by the encoder", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "auto (1)", + "mutable": "null", + "readable": true, + "type": "GstAV1EncKFMode", + "writable": true + }, + "lag-in-frames": { + "blurb": "Maximum number of future frames the encoder is allowed to consume before producing the current output frame. Set value to 0 for disabling lagged encoding.", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "-1", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, "max-quantizer": { "blurb": "Maximum (worst quality) quantizer", "conditionally-available": false, @@ -829,6 +1520,18 @@ "readable": true, "type": "guint", "writable": true + }, + "usage-profile": { + "blurb": "Usage profile is used to guide the default config for the encoder", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "good-quality (0)", + "mutable": "null", + "readable": true, + "type": "GstAV1EncUsageProfile", + "writable": true } }, "rank": "primary" @@ -837,6 +1540,31 @@ "filename": "gstaom", "license": "LGPL", "other-types": { + "GstAV1EncEncPass": { + "kind": "enum", + "values": + { + "desc": "Single pass mode", + "name": "one-pass", + "value": "0" + }, + { + "desc": "First pass of multi-pass mode", + "name": "first-pass", + "value": "1" + }, + { + "desc": "Second pass of multi-pass mode", + "name": "second-pass", + "value": "2" + }, + { + "desc": "Third pass of multi-pass mode", + "name": "third-pass", + "value": "3" + } + + }, "GstAV1EncEndUsageMode": { "kind": "enum", "values": @@ -862,6 +1590,21 @@ } }, + "GstAV1EncKFMode": { + "kind": "enum", + "values": + { + "desc": "Encoder determines optimal keyframe placement automatically", + "name": "auto", + "value": "1" + }, + { + "desc": "Encoder does not place keyframes", + "name": "disabled", + "value": "0" + } + + }, "GstAV1EncResizeMode": { "kind": "enum", "values": @@ -906,6 +1649,26 @@ "value": "3" } + }, + "GstAV1EncUsageProfile": { + "kind": "enum", + "values": + { + "desc": "Good Quality profile", + "name": "good-quality", + "value": "0" + }, + { + "desc": "Realtime profile", + "name": "realtime", + "value": "1" + }, + { + "desc": "All Intra profile", + "name": "all-intra", + "value": "2" + } + } }, "package": "GStreamer Bad Plug-ins", @@ -1858,7 +2621,7 @@ "long-name": "ASS/SSA Render", "pad-templates": { "src": { - "caps": "video/x-raw:\n format: { BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw:\n format: { BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" }, @@ -1868,7 +2631,7 @@ "presence": "always" }, "video_sink": { - "caps": "video/x-raw:\n format: { BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw:\n format: { BGRx, RGBx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, I420, YV12, AYUV, YUY2, UYVY, v308, Y41B, Y42B, Y444, NV12, NV21, A420, YUV9, YVU9, IYU1, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" } @@ -4199,12 +4962,12 @@ "presence": "always" }, "src": { - "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" }, "video_sink": { - "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" } @@ -4311,6 +5074,18 @@ "type": "guint", "writable": true }, + "output-padding": { + "blurb": "Whether to output padding packets when schedule=true", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "ready", + "readable": true, + "type": "gboolean", + "writable": true + }, "schedule": { "blurb": "Schedule caption buffers so that exactly one is output per video frame", "conditionally-available": false, @@ -4735,6 +5510,83 @@ "tracers": {}, "url": "Unknown package origin" }, + "codectimestamper": { + "description": "codectimestamper", + "elements": { + "h264timestamper": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Timestamp H.264 streams", + "hierarchy": + "GstH264Timestamper", + "GstCodecTimestamper", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Video", + "long-name": "H.264 timestamper", + "pad-templates": { + "sink": { + "caps": "video/x-h264:\n alignment: au\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-h264:\n alignment: au\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "none" + }, + "h265timestamper": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Timestamp H.265 streams", + "hierarchy": + "GstH265Timestamper", + "GstCodecTimestamper", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Video", + "long-name": "H.265 timestamper", + "pad-templates": { + "sink": { + "caps": "video/x-h265:\n alignment: au\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-h265:\n alignment: au\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "none" + } + }, + "filename": "gstcodectimestamper", + "license": "LGPL", + "other-types": { + "GstCodecTimestamper": { + "hierarchy": + "GstCodecTimestamper", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "kind": "object" + } + }, + "package": "GStreamer Bad Plug-ins", + "source": "gst-plugins-bad", + "tracers": {}, + "url": "Unknown package origin" + }, "coloreffects": { "description": "Color Look-up Table filters", "elements": { @@ -5221,7 +6073,7 @@ }, "properties": { "content-type": { - "blurb": "The mime type of the body of the request", + "blurb": "Content Type to use for the Content-Type header. If not set, detected mime type will be used", "conditionally-available": false, "construct": false, "construct-only": false, @@ -6421,7 +7273,7 @@ "elements": { "d3dvideosink": { "author": "David Hoyt <dhoyt@hoytsoft.org>, Roland Krikava <info@bluedigits.com>", - "description": "Display data using a Direct3D video renderer", + "description": "Display data using a Direct3D9 video renderer", "hierarchy": "GstD3DVideoSink", "GstVideoSink", @@ -6521,15 +7373,14 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "Direct3D11/DXVA AV1 NVIDIA GeForce RTX 3060 Laptop GPU Decoder", "pad-templates": { "sink": { - "caps": "video/x-av1:\n alignment: frame\n profile: 0\n width: 1, 8192 \n height: 1, 8192 \n", + "caps": "video/x-av1:\n width: 1, 16384 \n height: 1, 16384 \n alignment: frame\n profile: main\n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE }\n width: 1, 8192 \n height: 1, 8192 \nvideo/x-raw:\n format: { NV12, P010_10LE }\n width: 1, 8192 \n height: 1, 8192 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE }\n width: 1, 16384 \n height: 1, 16384 \nvideo/x-raw:\n format: { NV12, P010_10LE }\n width: 1, 16384 \n height: 1, 16384 \n", "direction": "src", "presence": "always" } @@ -6541,7 +7392,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "59071", + "default": "0", "max": "9223372036854775807", "min": "-9223372036854775808", "mutable": "null", @@ -6555,7 +7406,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "9504", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -6569,7 +7420,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "4318", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -6578,7 +7429,7 @@ "writable": false } }, - "rank": "secondary" + "rank": "primary + 1" }, "d3d11colorconvert": { "author": "Seungha Yang <seungha@centricular.com>", @@ -6594,159 +7445,47 @@ "GObject" , "klass": "Filter/Converter/Video/Hardware", - "long-name": "Direct3D11 colorspace converter", "pad-templates": { "sink": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" } }, - "rank": "none" - }, - "d3d11compositor": { - "author": "Seungha Yang <seungha@centricular.com>", - "description": "A Direct3D11 compositor bin", - "hierarchy": - "GstD3D11CompositorBin", - "GstBin", - "GstElement", - "GstObject", - "GInitiallyUnowned", - "GObject" - , - "interfaces": - "GstChildProxy" - , - "klass": "Filter/Editor/Video/Compositor", - "long-name": "Direct3D11 Compositor Bin", - "pad-templates": { - "sink_%%u": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", - "direction": "sink", - "presence": "request", - "type": "GstD3D11CompositorBinInput" - }, - "src": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", - "direction": "src", - "presence": "always", - "type": "GstD3D11CompositorBinPad" - } - }, "properties": { - "adapter": { - "blurb": "Adapter index for creating device (-1 for default)", + "gamma-mode": { + "blurb": "Gamma conversion mode", "conditionally-available": false, "construct": false, "construct-only": false, "controllable": false, - "default": "0", - "max": "2147483647", - "min": "-1", - "mutable": "ready", - "readable": true, - "type": "gint", - "writable": true - }, - "background": { - "blurb": "Background type", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "checker (0)", - "mutable": "null", - "readable": true, - "type": "GstD3D11CompositorBackground", - "writable": true - }, - "emit-signals": { - "blurb": "Send signals", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "false", - "mutable": "null", - "readable": true, - "type": "gboolean", - "writable": true - }, - "latency": { - "blurb": "Additional latency in live mode to allow upstream to take longer to produce buffers for the current position (in nanoseconds)", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "0", - "max": "18446744073709551615", - "min": "0", - "mutable": "null", - "readable": true, - "type": "guint64", - "writable": true - }, - "min-upstream-latency": { - "blurb": "When sources with a higher latency are expected to be plugged in dynamically after the aggregator has started playing, this allows overriding the minimum latency reported by the initial source(s). This is only taken into account when larger than the actually reported minimum latency. (nanoseconds)", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "0", - "max": "18446744073709551615", - "min": "0", - "mutable": "null", - "readable": true, - "type": "guint64", - "writable": true - }, - "mixer": { - "blurb": "The d3d11 mixer chain to use", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "mutable": "null", - "readable": true, - "type": "GstElement", - "writable": false - }, - "start-time": { - "blurb": "Start time to use if start-time-selection=set", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "18446744073709551615", - "max": "18446744073709551615", - "min": "0", - "mutable": "null", + "default": "none (0)", + "mutable": "playing", "readable": true, - "type": "guint64", + "type": "GstVideoGammaMode", "writable": true }, - "start-time-selection": { - "blurb": "Decides which start time is output", + "primaries-mode": { + "blurb": "Primaries conversion mode", "conditionally-available": false, "construct": false, "construct-only": false, "controllable": false, - "default": "zero (0)", - "mutable": "null", + "default": "none (0)", + "mutable": "playing", "readable": true, - "type": "GstAggregatorStartTimeSelection", + "type": "GstVideoPrimariesMode", "writable": true } }, - "rank": "secondary" + "rank": "none" }, - "d3d11compositorelement": { + "d3d11compositor": { "author": "Seungha Yang <seungha@centricular.com>", "description": "A Direct3D11 compositor", "hierarchy": @@ -6762,16 +7501,15 @@ "GstChildProxy" , "klass": "Filter/Editor/Video/Compositor", - "long-name": "Direct3D11 Compositor", "pad-templates": { "sink_%%u": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA, BGRA }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "request", "type": "GstD3D11CompositorPad" }, "src": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA, BGRA }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, Y42B, Y444, Y444_16LE, GRAY8, GRAY16_LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, Y42B, Y444, Y444_16LE, GRAY8, GRAY16_LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always", "type": "GstAggregatorPad" @@ -6805,7 +7543,7 @@ "writable": true } }, - "rank": "none" + "rank": "secondary" }, "d3d11convert": { "author": "Seungha Yang <seungha.yang@navercorp.com>, Jeongki Kim <jeongki.kim@jeongki.kim>", @@ -6820,16 +7558,18 @@ "GInitiallyUnowned", "GObject" , - "klass": "Filter/Converter/Scaler/Video/Hardware", - "long-name": "Direct3D11 colorspace converter and scaler", + "interfaces": + "GstVideoDirection" + , + "klass": "Filter/Converter/Scaler/Effect/Video/Hardware", "pad-templates": { "sink": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" } @@ -6846,6 +7586,44 @@ "readable": true, "type": "gboolean", "writable": true + }, + "border-color": { + "blurb": "Border color to use in ARGB64 format", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "18446462598732840960", + "max": "18446744073709551615", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint64", + "writable": true + }, + "gamma-mode": { + "blurb": "Gamma conversion mode", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "none (0)", + "mutable": "playing", + "readable": true, + "type": "GstVideoGammaMode", + "writable": true + }, + "primaries-mode": { + "blurb": "Primaries conversion mode", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "none (0)", + "mutable": "playing", + "readable": true, + "type": "GstVideoPrimariesMode", + "writable": true } }, "rank": "none" @@ -6865,15 +7643,14 @@ "GstChildProxy" , "klass": "Filter/Effect/Video/Deinterlace/Hardware", - "long-name": "Direct3D11 Intel(R) Iris(R) Plus Graphics Deinterlacer Bin", "pad-templates": { "sink": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 64, 8192 \n height: 64, 8192 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 64, 8192 \n height: 64, 8192 \nvideo/x-raw:\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 64, 8192 \n height: 64, 8192 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 64, 8192 \n height: 64, 8192 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \nvideo/x-raw:\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE }\n width: 64, 8192 \n height: 64, 8192 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE }\n width: 64, 8192 \n height: 64, 8192 \nvideo/x-raw:\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE }\n width: 64, 8192 \n height: 64, 8192 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE }\n width: 64, 8192 \n height: 64, 8192 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE }\n width: 1, 16384 \n height: 1, 16384 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE }\n width: 1, 16384 \n height: 1, 16384 \nvideo/x-raw:\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE }\n width: 1, 16384 \n height: 1, 16384 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE }\n width: 1, 16384 \n height: 1, 16384 \n", "direction": "src", "presence": "always" } @@ -6899,7 +7676,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "35410", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -6913,7 +7690,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "bob", + "default": "mocomp+adaptive+bob+blend", "mutable": "ready", "readable": true, "type": "GstD3D11DeinterlaceMethod", @@ -6949,7 +7726,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "32902", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -6972,15 +7749,14 @@ "GObject" , "klass": "Filter/Effect/Video/Deinterlace/Hardware", - "long-name": "Direct3D11 Intel(R) Iris(R) Plus Graphics Deinterlacer", "pad-templates": { "sink": { - "caps": "video/x-raw(memory:D3D11Memory):\n width: 64, 8192 \n height: 64, 8192 \n format: { NV12 }\n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n width: 64, 8192 \n height: 64, 8192 \n format: { NV12 }\n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE }\n width: 1, 16384 \n height: 1, 16384 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { NV12, P010_10LE }\n width: 1, 16384 \n height: 1, 16384 \n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw(memory:D3D11Memory):\n width: 64, 8192 \n height: 64, 8192 \n format: { NV12 }\n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n width: 64, 8192 \n height: 64, 8192 \n format: { NV12 }\n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE }\n width: 1, 16384 \n height: 1, 16384 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { NV12, P010_10LE }\n width: 1, 16384 \n height: 1, 16384 \n", "direction": "src", "presence": "always" } @@ -7006,7 +7782,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "35410", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -7020,7 +7796,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "bob", + "default": "mocomp+adaptive+bob+blend", "mutable": "ready", "readable": true, "type": "GstD3D11DeinterlaceMethod", @@ -7044,7 +7820,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "32902", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -7068,15 +7844,14 @@ "GObject" , "klass": "Filter/Video", - "long-name": "Direct3D11 downloader", "pad-templates": { "sink": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" } @@ -7096,10 +7871,9 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "Direct3D11/DXVA H.264 Intel(R) Iris(R) Plus Graphics Decoder", "pad-templates": { "sink": { - "caps": "video/x-h264:\n stream-format: { (string)avc, (string)avc3, (string)byte-stream }\n alignment: au\n profile: { (string)high, (string)progressive-high, (string)constrained-high, (string)main, (string)constrained-baseline, (string)baseline }\n width: 1, 4096 \n height: 1, 4096 \n", + "caps": "video/x-h264:\n width: 1, 4096 \n height: 1, 4096 \n stream-format: { (string)avc, (string)avc3, (string)byte-stream }\n alignment: au\n profile: { (string)high, (string)progressive-high, (string)constrained-high, (string)main, (string)constrained-baseline, (string)baseline }\n", "direction": "sink", "presence": "always" }, @@ -7116,7 +7890,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "86670", + "default": "0", "max": "9223372036854775807", "min": "-9223372036854775808", "mutable": "null", @@ -7130,7 +7904,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "35410", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -7144,7 +7918,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "32902", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -7153,7 +7927,7 @@ "writable": false } }, - "rank": "secondary" + "rank": "primary + 1" }, "d3d11h265dec": { "author": "Seungha Yang <seungha.yang@navercorp.com>", @@ -7168,15 +7942,14 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "Direct3D11/DXVA H.265 Intel(R) Iris(R) Plus Graphics Decoder", "pad-templates": { "sink": { - "caps": "video/x-h265:\n stream-format: { (string)hev1, (string)hvc1, (string)byte-stream }\n alignment: au\n profile: { (string)main, (string)main-10 }\n width: 1, 8192 \n height: 1, 8192 \n", + "caps": "video/x-h265:\n width: 1, 16384 \n height: 1, 16384 \n stream-format: { (string)hev1, (string)hvc1, (string)byte-stream }\n alignment: au\n profile: { (string)main, (string)main-10 }\n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw:\n format: { NV12, P010_10LE }\n width: 1, 8192 \n height: 1, 8192 \n\nvideo/x-raw(format:Interlaced):\n format: { NV12, P010_10LE }\n width: 1, 8192 \n height: 1, 8192 \n interlace-mode: alternate\n\nvideo/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE }\n width: 1, 8192 \n height: 1, 8192 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE }\n width: 1, 16384 \n height: 1, 16384 \nvideo/x-raw:\n format: { NV12, P010_10LE }\n width: 1, 16384 \n height: 1, 16384 \n", "direction": "src", "presence": "always" } @@ -7188,7 +7961,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "86670", + "default": "0", "max": "9223372036854775807", "min": "-9223372036854775808", "mutable": "null", @@ -7202,7 +7975,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "35410", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -7216,7 +7989,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "32902", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -7225,7 +7998,7 @@ "writable": false } }, - "rank": "secondary" + "rank": "primary + 1" }, "d3d11mpeg2dec": { "author": "Seungha Yang <seungha@centricular.com>", @@ -7240,10 +8013,9 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "Direct3D11/DXVA MPEG2 Intel(R) Iris(R) Plus Graphics Decoder", "pad-templates": { "sink": { - "caps": "video/mpeg:\n mpegversion: 2\n systemstream: false\n profile: { (string)main, (string)simple }\n width: 1, 1920 \n height: 1, 1920 \n", + "caps": "video/mpeg:\n width: 1, 1920 \n height: 1, 1920 \n mpegversion: 2\n systemstream: false\n profile: { (string)main, (string)simple }\n", "direction": "sink", "presence": "always" }, @@ -7260,7 +8032,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "86670", + "default": "0", "max": "9223372036854775807", "min": "-9223372036854775808", "mutable": "null", @@ -7274,7 +8046,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "35410", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -7288,7 +8060,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "32902", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -7313,15 +8085,14 @@ "GObject" , "klass": "Filter/Converter/Video/Scaler/Hardware", - "long-name": "Direct3D11 scaler", "pad-templates": { "sink": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" } @@ -7338,13 +8109,27 @@ "readable": true, "type": "gboolean", "writable": true + }, + "border-color": { + "blurb": "Border color to use in ARGB64 format", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "18446462598732840960", + "max": "18446744073709551615", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint64", + "writable": true } }, "rank": "none" }, "d3d11screencapturesrc": { "author": "Seungha Yang <seungha@centricular.com>", - "description": "Capture desktop image by using Desktop Duplication API", + "description": "Captures desktop screen", "hierarchy": "GstD3D11ScreenCaptureSrc", "GstBaseSrc", @@ -7354,15 +8139,96 @@ "GObject" , "klass": "Source/Video", - "long-name": "Direct3D11 screen capture src", "pad-templates": { "src": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: BGRA\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: BGRA\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: BGRA\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \npixel-aspect-ratio: 1/1\nvideo/x-raw:\n format: BGRA\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \npixel-aspect-ratio: 1/1\n", "direction": "src", "presence": "always" } }, "properties": { + "adapter": { + "blurb": "DXGI Adapter index for creating device when WGC mode is selected (-1 for default)", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "2147483647", + "min": "-1", + "mutable": "ready", + "readable": true, + "type": "gint", + "writable": true + }, + "capture-api": { + "blurb": "Capture API to use", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "dxgi (0)", + "mutable": "ready", + "readable": true, + "type": "GstD3D11ScreenCaptureAPI", + "writable": true + }, + "crop-height": { + "blurb": "Height of screen capture area (0 = maximum)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "-1", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "crop-width": { + "blurb": "Width of screen capture area (0 = maximum)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "-1", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "crop-x": { + "blurb": "Horizontal coordinate of top left corner for the screen capture area", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "-1", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "crop-y": { + "blurb": "Vertical coordinate of top left corner for the screen capture area", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "-1", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, "monitor-handle": { "blurb": "A HMONITOR handle of monitor to capture", "conditionally-available": false, @@ -7391,6 +8257,18 @@ "type": "gint", "writable": true }, + "show-border": { + "blurb": "Show border lines to capture area when WGC mode is selected", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, "show-cursor": { "blurb": "Whether to show mouse cursor", "conditionally-available": false, @@ -7402,6 +8280,81 @@ "readable": true, "type": "gboolean", "writable": true + }, + "window-handle": { + "blurb": "A HWND handle of window to capture", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "18446744073709551615", + "min": "0", + "mutable": "ready", + "readable": true, + "type": "guint64", + "writable": true + } + }, + "rank": "none" + }, + "d3d11testsrc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Creates a test video stream", + "hierarchy": + "GstD3D11TestSrc", + "GstBaseSrc", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Source/Video", + "pad-templates": { + "src": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "adapter": { + "blurb": "DXGI Adapter index (-1 for any device)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "2147483647", + "min": "-1", + "mutable": "ready", + "readable": true, + "type": "gint", + "writable": true + }, + "is-live": { + "blurb": "Whether to act as a live source", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "pattern": { + "blurb": "Type of test pattern to generate", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "smpte (0)", + "mutable": "ready", + "readable": true, + "type": "GstD3D11TestSrcPattern", + "writable": true } }, "rank": "none" @@ -7419,15 +8372,14 @@ "GObject" , "klass": "Filter/Video", - "long-name": "Direct3D11 uploader", "pad-templates": { "sink": { - "caps": "video/x-raw:\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw:\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" } @@ -7451,10 +8403,9 @@ "GstNavigation" , "klass": "Sink/Video", - "long-name": "Direct3D11 video sink", "pad-templates": { "sink": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, Y410 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition):\n format: { RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, GBRA, GBRA_10LE, GBRA_12LE, Y410, YUY2 }\n width: 1, 16384 \n height: 1, 16384 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" } @@ -7474,6 +8425,18 @@ "type": "gint", "writable": true }, + "display-format": { + "blurb": "Swapchain display format", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "unknown (0)", + "mutable": "ready", + "readable": true, + "type": "GstD3D11VideoSinkDisplayFormat", + "writable": true + }, "draw-on-shared-texture": { "blurb": "Draw on user provided shared texture instead of window. When enabled, user can pass application's own texture to sink by using \"draw\" action signal on \"begin-draw\" signal handler, so that sink can draw video data on application's texture. Supported texture formats for user texture are DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, and DXGI_FORMAT_R10G10B10A2_UNORM.", "conditionally-available": false, @@ -7486,6 +8449,18 @@ "type": "gboolean", "writable": true }, + "emit-present": { + "blurb": "Emits present signal", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "ready", + "readable": true, + "type": "gboolean", + "writable": true + }, "enable-navigation-events": { "blurb": "When enabled, navigation events are sent upstream", "conditionally-available": false, @@ -7533,6 +8508,42 @@ "readable": true, "type": "GstD3D11WindowFullscreenToggleMode", "writable": true + }, + "gamma-mode": { + "blurb": "Gamma conversion mode", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "none (0)", + "mutable": "ready", + "readable": true, + "type": "GstVideoGammaMode", + "writable": true + }, + "primaries-mode": { + "blurb": "Primaries conversion mode", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "none (0)", + "mutable": "ready", + "readable": true, + "type": "GstVideoPrimariesMode", + "writable": true + }, + "rotate-method": { + "blurb": "Rotate method to use", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "identity (0)", + "mutable": "null", + "readable": true, + "type": "GstVideoOrientationMethod", + "writable": true } }, "rank": "primary", @@ -7564,6 +8575,20 @@ , "return-type": "gboolean", "when": "last" + }, + "present": { + "args": + { + "name": "arg0", + "type": "GstObject" + }, + { + "name": "arg1", + "type": "gpointer" + } + , + "return-type": "void", + "when": "last" } } }, @@ -7580,7 +8605,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "Direct3D11/DXVA VP8 Intel(R) Iris(R) Plus Graphics Decoder", "pad-templates": { "sink": { "caps": "video/x-vp8:\n width: 1, 4096 \n height: 1, 4096 \n", @@ -7600,7 +8624,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "86670", + "default": "0", "max": "9223372036854775807", "min": "-9223372036854775808", "mutable": "null", @@ -7614,7 +8638,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "35410", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -7628,7 +8652,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "32902", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -7637,7 +8661,7 @@ "writable": false } }, - "rank": "secondary" + "rank": "primary" }, "d3d11vp9dec": { "author": "Seungha Yang <seungha.yang@navercorp.com>", @@ -7652,15 +8676,14 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "Direct3D11/DXVA VP9 Intel(R) Iris(R) Plus Graphics Decoder", "pad-templates": { "sink": { - "caps": "video/x-vp9:\n alignment: frame\n profile: { (string)0, (string)2 }\n width: 1, 8192 \n height: 1, 8192 \n", + "caps": "video/x-vp9:\n width: 1, 16384 \n height: 1, 16384 \n alignment: frame\n profile: { (string)0, (string)2 }\n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE }\n width: 1, 8192 \n height: 1, 8192 \nvideo/x-raw:\n format: { NV12, P010_10LE }\n width: 1, 8192 \n height: 1, 8192 \n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE }\n width: 1, 16384 \n height: 1, 16384 \nvideo/x-raw:\n format: { NV12, P010_10LE }\n width: 1, 16384 \n height: 1, 16384 \n", "direction": "src", "presence": "always" } @@ -7672,7 +8695,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "86670", + "default": "0", "max": "9223372036854775807", "min": "-9223372036854775808", "mutable": "null", @@ -7686,7 +8709,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "35410", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -7700,7 +8723,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "32902", + "default": "0", "max": "-1", "min": "0", "mutable": "null", @@ -7709,7 +8732,7 @@ "writable": false } }, - "rank": "secondary" + "rank": "primary" } }, "filename": "gstd3d11", @@ -7779,12 +8802,26 @@ } }, - "GstD3D11CompositorBinInput": { + "GstD3D11CompositorOperator": { + "kind": "enum", + "values": + { + "desc": "Source", + "name": "source", + "value": "0" + }, + { + "desc": "Over", + "name": "over", + "value": "1" + } + + }, + "GstD3D11CompositorPad": { "hierarchy": - "GstD3D11CompositorBinInput", - "GstD3D11CompositorBinPad", - "GstGhostPad", - "GstProxyPad", + "GstD3D11CompositorPad", + "GstVideoAggregatorPad", + "GstAggregatorPad", "GstPad", "GstObject", "GInitiallyUnowned", @@ -7798,7 +8835,7 @@ "construct": false, "construct-only": false, "controllable": true, - "default": "0", + "default": "1", "max": "1", "min": "0", "mutable": "null", @@ -7806,132 +8843,16 @@ "type": "gdouble", "writable": true }, - "blend-dest-alpha": { - "blurb": "Blend factor for destination alpha, \"*-color\" values are not allowed", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "zero (0)", - "mutable": "null", - "readable": true, - "type": "GstD3D11CompositorBlend", - "writable": true - }, - "blend-dest-rgb": { - "blurb": "Blend factor for destination RGB", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "zero (0)", - "mutable": "null", - "readable": true, - "type": "GstD3D11CompositorBlend", - "writable": true - }, - "blend-factor-alpha": { - "blurb": "Blend factor for alpha component when blend type is \"blend-factor\" or \"inv-blend-factor\"", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "0", - "max": "1", - "min": "0", - "mutable": "null", - "readable": true, - "type": "gfloat", - "writable": true - }, - "blend-factor-blue": { - "blurb": "Blend factor for blue component when blend type is \"blend-factor\" or \"inv-blend-factor\"", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "0", - "max": "1", - "min": "0", - "mutable": "null", - "readable": true, - "type": "gfloat", - "writable": true - }, - "blend-factor-green": { - "blurb": "Blend factor for green component when blend type is \"blend-factor\" or \"inv-blend-factor\"", + "gamma-mode": { + "blurb": "Gamma conversion mode", "conditionally-available": false, "construct": false, "construct-only": false, "controllable": true, - "default": "0", - "max": "1", - "min": "0", - "mutable": "null", - "readable": true, - "type": "gfloat", - "writable": true - }, - "blend-factor-red": { - "blurb": "Blend factor for red component when blend type is \"blend-factor\" or \"inv-blend-factor\"", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "0", - "max": "1", - "min": "0", - "mutable": "null", - "readable": true, - "type": "gfloat", - "writable": true - }, - "blend-op-alpha": { - "blurb": "Blend equation for alpha", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "add (0)", - "mutable": "null", - "readable": true, - "type": "GstD3D11CompositorBlendOperation", - "writable": true - }, - "blend-op-rgb": { - "blurb": "Blend equation for RGB", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "add (0)", - "mutable": "null", - "readable": true, - "type": "GstD3D11CompositorBlendOperation", - "writable": true - }, - "blend-src-alpha": { - "blurb": "Blend factor for source alpha, \"*-color\" values are not allowed", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "zero (0)", - "mutable": "null", - "readable": true, - "type": "GstD3D11CompositorBlend", - "writable": true - }, - "blend-src-rgb": { - "blurb": "Blend factor for source RGB", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "zero (0)", + "default": "none (0)", "mutable": "null", "readable": true, - "type": "GstD3D11CompositorBlend", + "type": "GstVideoGammaMode", "writable": true }, "height": { @@ -7948,30 +8869,28 @@ "type": "gint", "writable": true }, - "max-last-buffer-repeat": { - "blurb": "Repeat last buffer for time (in ns, -1=until EOS), behaviour on EOS is not affected", + "operator": { + "blurb": "Blending operator to use for blending this pad over the previous ones", "conditionally-available": false, "construct": false, "construct-only": false, - "controllable": false, - "default": "0", - "max": "18446744073709551615", - "min": "0", - "mutable": "playing", + "controllable": true, + "default": "over (1)", + "mutable": "null", "readable": true, - "type": "guint64", + "type": "GstD3D11CompositorOperator", "writable": true }, - "repeat-after-eos": { - "blurb": "Repeat the last frame after EOS until all pads are EOS", + "primaries-mode": { + "blurb": "Primaries conversion mode", "conditionally-available": false, "construct": false, "construct-only": false, "controllable": true, - "default": "false", + "default": "none (0)", "mutable": "null", "readable": true, - "type": "gboolean", + "type": "GstVideoPrimariesMode", "writable": true }, "sizing-policy": { @@ -8027,422 +8946,146 @@ "readable": true, "type": "gint", "writable": true - }, - "zorder": { - "blurb": "Z Order of the picture", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "0", - "max": "-1", - "min": "0", - "mutable": "null", - "readable": true, - "type": "guint", - "writable": true } } }, - "GstD3D11CompositorBinPad": { - "hierarchy": - "GstD3D11CompositorBinPad", - "GstGhostPad", - "GstProxyPad", - "GstPad", - "GstObject", - "GInitiallyUnowned", - "GObject" - , - "kind": "object", - "properties": { - "emit-signals": { - "blurb": "Send signals to signal data consumption", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "false", - "mutable": "null", - "readable": true, - "type": "gboolean", - "writable": true - } - }, - "signals": { - "buffer-consumed": { - "args": - { - "name": "arg0", - "type": "GstBuffer" - } - , - "return-type": "void", - "when": "first" - } - } - }, - "GstD3D11CompositorBlend": { + "GstD3D11CompositorSizingPolicy": { "kind": "enum", "values": { - "desc": "The blend factor is (0, 0, 0, 0)", - "name": "zero", + "desc": "None: Image is scaled to fill configured destination rectangle without padding or keeping the aspect ratio", + "name": "none", "value": "0" }, { - "desc": "The blend factor is (1, 1, 1, 1)", - "name": "one", + "desc": "Keep Aspect Ratio: Image is scaled to fit destination rectangle specified by GstCompositorPad:{xpos, ypos, width, height} with preserved aspect ratio. Resulting image will be centered in the destination rectangle with padding if necessary", + "name": "keep-aspect-ratio", "value": "1" - }, - { - "desc": "The blend factor is (Rs, Gs, Bs, As)", - "name": "src-color", - "value": "2" - }, - { - "desc": "The blend factor is (1 - Rs, 1 - Gs, 1 - Bs, 1 - As)", - "name": "inv-src-color", - "value": "3" - }, - { - "desc": "The blend factor is (As, As, As, As)", - "name": "src-alpha", - "value": "4" - }, - { - "desc": "The blend factor is (1 - As, 1 - As, 1 - As, 1 - As)", - "name": "inv-src-alpha", - "value": "5" - }, - { - "desc": "The blend factor is (Ad, Ad, Ad, Ad)", - "name": "dest-alpha", - "value": "6" - }, + } + + }, + "GstD3D11DeinterlaceMethod": { + "kind": "flags", + "values": { - "desc": "The blend factor is (1 - Ad, 1 - Ad, 1 - Ad, 1 - Ad)", - "name": "inv-dest-alpha", - "value": "7" + "desc": "Blend: Blending top/bottom field pictures into one frame. Framerate will be preserved (e.g., 60i -> 30p)", + "name": "blend", + "value": "0x00000001" }, { - "desc": "The blend factor is (Rd, Gd, Bd, Ad)", - "name": "dest-color", - "value": "8" + "desc": "Bob: Interpolating missing lines by using the adjacent lines. Framerate will be doubled (e,g, 60i -> 60p)", + "name": "bob", + "value": "0x00000002" }, { - "desc": "The blend factor is (1 - Rd, 1 - Gd, 1 - Bd, 1 - Ad)", - "name": "inv-dest-color", - "value": "9" + "desc": "Adaptive: Interpolating missing lines by using spatial/temporal references. Framerate will be doubled (e,g, 60i -> 60p)", + "name": "adaptive", + "value": "0x00000004" }, { - "desc": "The blend factor is (f, f, f, 1); where f = min(As, 1 - Ad)", - "name": "src-alpha-sat", - "value": "10" - }, + "desc": "Motion Compensation: Recreating missing lines by using motion vector. Framerate will be doubled (e,g, 60i -> 60p)", + "name": "mocomp", + "value": "0x00000008" + } + + }, + "GstD3D11ScreenCaptureAPI": { + "kind": "enum", + "values": { - "desc": "User defined blend factor", - "name": "blend-factor", - "value": "11" + "desc": "DXGI Desktop Duplication", + "name": "dxgi", + "value": "0" }, { - "desc": "Inverse of user defined blend factor", - "name": "inv-blend-factor", - "value": "12" + "desc": "Windows Graphics Capture", + "name": "wgc", + "value": "1" } }, - "GstD3D11CompositorBlendOperation": { + "GstD3D11TestSrcPattern": { "kind": "enum", "values": { - "desc": "Add source and background", - "name": "add", + "desc": "SMPTE 100%% color bars", + "name": "smpte", "value": "0" }, { - "desc": "Subtract source from background", - "name": "subtract", + "desc": "Random (television snow)", + "name": "snow", "value": "1" }, { - "desc": "Subtract background from source", - "name": "rev-subtract", + "desc": "100%% Black", + "name": "black", "value": "2" }, { - "desc": "Minimum of source and background", - "name": "min", + "desc": "100%% White", + "name": "white", "value": "3" }, { - "desc": "Maximum of source and background", - "name": "max", + "desc": "Red", + "name": "red", "value": "4" - } - - }, - "GstD3D11CompositorPad": { - "hierarchy": - "GstD3D11CompositorPad", - "GstVideoAggregatorPad", - "GstAggregatorPad", - "GstPad", - "GstObject", - "GInitiallyUnowned", - "GObject" - , - "kind": "object", - "properties": { - "alpha": { - "blurb": "Alpha of the picture", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "1", - "max": "1", - "min": "0", - "mutable": "null", - "readable": true, - "type": "gdouble", - "writable": true }, - "blend-dest-alpha": { - "blurb": "Blend factor for destination alpha, \"*-color\" values are not allowed", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "inv-src-alpha (5)", - "mutable": "null", - "readable": true, - "type": "GstD3D11CompositorBlend", - "writable": true - }, - "blend-dest-rgb": { - "blurb": "Blend factor for destination RGB", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "inv-src-alpha (5)", - "mutable": "null", - "readable": true, - "type": "GstD3D11CompositorBlend", - "writable": true - }, - "blend-factor-alpha": { - "blurb": "Blend factor for alpha component when blend type is \"blend-factor\" or \"inv-blend-factor\"", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "1", - "max": "1", - "min": "0", - "mutable": "null", - "readable": true, - "type": "gfloat", - "writable": true - }, - "blend-factor-blue": { - "blurb": "Blend factor for blue component when blend type is \"blend-factor\" or \"inv-blend-factor\"", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "1", - "max": "1", - "min": "0", - "mutable": "null", - "readable": true, - "type": "gfloat", - "writable": true - }, - "blend-factor-green": { - "blurb": "Blend factor for green component when blend type is \"blend-factor\" or \"inv-blend-factor\"", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "1", - "max": "1", - "min": "0", - "mutable": "null", - "readable": true, - "type": "gfloat", - "writable": true - }, - "blend-factor-red": { - "blurb": "Blend factor for red component when blend type is \"blend-factor\" or \"inv-blend-factor\"", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "1", - "max": "1", - "min": "0", - "mutable": "null", - "readable": true, - "type": "gfloat", - "writable": true - }, - "blend-op-alpha": { - "blurb": "Blend equation for alpha", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "add (0)", - "mutable": "null", - "readable": true, - "type": "GstD3D11CompositorBlendOperation", - "writable": true - }, - "blend-op-rgb": { - "blurb": "Blend equation for RGB", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "add (0)", - "mutable": "null", - "readable": true, - "type": "GstD3D11CompositorBlendOperation", - "writable": true - }, - "blend-src-alpha": { - "blurb": "Blend factor for source alpha, \"*-color\" values are not allowed", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "one (1)", - "mutable": "null", - "readable": true, - "type": "GstD3D11CompositorBlend", - "writable": true - }, - "blend-src-rgb": { - "blurb": "Blend factor for source RGB", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "src-alpha (4)", - "mutable": "null", - "readable": true, - "type": "GstD3D11CompositorBlend", - "writable": true - }, - "height": { - "blurb": "Height of the picture", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "0", - "max": "2147483647", - "min": "-2147483648", - "mutable": "null", - "readable": true, - "type": "gint", - "writable": true + { + "desc": "Green", + "name": "green", + "value": "5" }, - "sizing-policy": { - "blurb": "Sizing policy to use for image scaling", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "none (0)", - "mutable": "null", - "readable": true, - "type": "GstD3D11CompositorSizingPolicy", - "writable": true + { + "desc": "Blue", + "name": "blue", + "value": "6" }, - "width": { - "blurb": "Width of the picture", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "0", - "max": "2147483647", - "min": "-2147483648", - "mutable": "null", - "readable": true, - "type": "gint", - "writable": true + { + "desc": "Checkers 1px", + "name": "checkers-1", + "value": "7" }, - "xpos": { - "blurb": "X position of the picture", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "0", - "max": "2147483647", - "min": "-2147483648", - "mutable": "null", - "readable": true, - "type": "gint", - "writable": true + { + "desc": "Checkers 2px", + "name": "checkers-2", + "value": "8" }, - "ypos": { - "blurb": "Y position of the picture", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": true, - "default": "0", - "max": "2147483647", - "min": "-2147483648", - "mutable": "null", - "readable": true, - "type": "gint", - "writable": true - } - } - }, - "GstD3D11CompositorSizingPolicy": { - "kind": "enum", - "values": { - "desc": "None: Image is scaled to fill configured destination rectangle without padding or keeping the aspect ratio", - "name": "none", - "value": "0" + "desc": "Checkers 4px", + "name": "checkers-4", + "value": "9" }, { - "desc": "Keep Aspect Ratio: Image is scaled to fit destination rectangle specified by GstCompositorPad:{xpos, ypos, width, height} with preserved aspect ratio. Resulting image will be centered in the destination rectangle with padding if necessary", - "name": "keep-aspect-ratio", - "value": "1" + "desc": "Checkers 8px", + "name": "checkers-8", + "value": "10" } }, - "GstD3D11DeinterlaceMethod": { - "kind": "flags", + "GstD3D11VideoSinkDisplayFormat": { + "kind": "enum", "values": { - "desc": "Blend: Blending top/bottom field pictures into one frame. Framerate will be preserved (e.g., 60i -> 30p)", - "name": "blend", - "value": "0x00000001" + "desc": "DXGI_FORMAT_UNKNOWN", + "name": "unknown", + "value": "0" }, { - "desc": "Bob: Interpolating missing lines by using the adjacent lines. Framerate will be doubled (e,g, 60i -> 60p)", - "name": "bob", - "value": "0x00000002" + "desc": "DXGI_FORMAT_R10G10B10A2_UNORM", + "name": "r10g10b10a2-unorm", + "value": "24" }, { - "desc": "Adaptive: Interpolating missing lines by using spatial/temporal references. Framerate will be doubled (e,g, 60i -> 60p)", - "name": "adaptive", - "value": "0x00000004" + "desc": "DXGI_FORMAT_R8G8B8A8_UNORM", + "name": "r8g8b8a8-unorm", + "value": "28" }, { - "desc": "Motion Compensation: Recreating missing lines by using motion vector. Framerate will be doubled (e,g, 60i -> 60p)", - "name": "mocomp", - "value": "0x00000008" + "desc": "DXGI_FORMAT_B8G8R8A8_UNORM", + "name": "b8g8r8a8-unorm", + "value": "87" } }, @@ -9724,7 +10367,7 @@ "default": "none (0)", "mutable": "null", "readable": true, - "type": "GstFakeSinkStateError", + "type": "GstFakeAudioSinkStateError", "writable": true }, "stats": { @@ -9794,7 +10437,37 @@ "writable": true } }, - "rank": "none" + "rank": "none", + "signals": { + "handoff": { + "args": + { + "name": "arg0", + "type": "GstBuffer" + }, + { + "name": "arg1", + "type": "GstPad" + } + , + "return-type": "void", + "when": "last" + }, + "preroll-handoff": { + "args": + { + "name": "arg0", + "type": "GstBuffer" + }, + { + "name": "arg1", + "type": "GstPad" + } + , + "return-type": "void", + "when": "last" + } + } }, "fakevideosink": { "author": "Nicolas Dufresne <nicolas.dufresne@collabora.com>", @@ -9814,7 +10487,7 @@ "long-name": "Fake Video Sink", "pad-templates": { "sink": { - "caps": "video/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" } @@ -10056,7 +10729,7 @@ "default": "none (0)", "mutable": "null", "readable": true, - "type": "GstFakeSinkStateError", + "type": "GstFakeVideoSinkStateError", "writable": true }, "stats": { @@ -10112,7 +10785,37 @@ "writable": true } }, - "rank": "none" + "rank": "none", + "signals": { + "handoff": { + "args": + { + "name": "arg0", + "type": "GstBuffer" + }, + { + "name": "arg1", + "type": "GstPad" + } + , + "return-type": "void", + "when": "last" + }, + "preroll-handoff": { + "args": + { + "name": "arg0", + "type": "GstBuffer" + }, + { + "name": "arg1", + "type": "GstPad" + } + , + "return-type": "void", + "when": "last" + } + } }, "fpsdisplaysink": { "author": "Zeeshan Ali <zeeshan.ali@nokia.com>, Stefan Kost <stefan.kost@nokia.com>", @@ -10332,6 +11035,18 @@ } }, "properties": { + "expose-sources-async": { + "blurb": " Whether to expose sources at random time to simulate a source that is reading a file and exposing the srcpads later.", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, "stream-types": { "blurb": "String describing the stream types to expose, eg. \"video+audio\".", "conditionally-available": false, @@ -10363,7 +11078,7 @@ "long-name": "Video CODEC Test Sink", "pad-templates": { "sink": { - "caps": "video/x-raw:\n format: { I420, I420_10LE, NV12 }\n", + "caps": "video/x-raw:\n format: { Y444_12LE, I422_12LE, I420_12LE, Y444_10LE, I422_10LE, I420_10LE, Y444, Y42B, I420, NV12 }\n", "direction": "sink", "presence": "always" } @@ -10506,7 +11221,7 @@ } }, - "GstFakeSinkStateError": { + "GstFakeAudioSinkStateError": { "kind": "enum", "values": { @@ -10560,6 +11275,46 @@ "value": "0x00000002" } + }, + "GstFakeVideoSinkStateError": { + "kind": "enum", + "values": + { + "desc": "No state change errors", + "name": "none", + "value": "0" + }, + { + "desc": "Fail state change from NULL to READY", + "name": "null-to-ready", + "value": "1" + }, + { + "desc": "Fail state change from READY to PAUSED", + "name": "ready-to-paused", + "value": "2" + }, + { + "desc": "Fail state change from PAUSED to PLAYING", + "name": "paused-to-playing", + "value": "3" + }, + { + "desc": "Fail state change from PLAYING to PAUSED", + "name": "playing-to-paused", + "value": "4" + }, + { + "desc": "Fail state change from PAUSED to READY", + "name": "paused-to-ready", + "value": "5" + }, + { + "desc": "Fail state change from READY to NULL", + "name": "ready-to-null", + "value": "6" + } + } }, "package": "GStreamer Bad Plug-ins", @@ -10658,6 +11413,20 @@ "readable": true, "type": "gchararray", "writable": false + }, + "persistent-id": { + "blurb": "Output device instance to use. Higher priority than \"device-number\".", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "18446744073709551615", + "max": "9223372036854775807", + "min": "-1", + "mutable": "null", + "readable": true, + "type": "gint64", + "writable": true } }, "rank": "none" @@ -10775,6 +11544,20 @@ "readable": true, "type": "gchararray", "writable": false + }, + "persistent-id": { + "blurb": "Output device instance to use. Higher priority than \"device-number\".", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "18446744073709551615", + "max": "9223372036854775807", + "min": "-1", + "mutable": "null", + "readable": true, + "type": "gint64", + "writable": true } }, "rank": "none" @@ -10794,7 +11577,7 @@ "long-name": "Decklink Video Sink", "pad-templates": { "sink": { - "caps": "video/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\n", + "caps": "video/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 0/1, 2147483647/1 \n format: BGRA\n", "direction": "sink", "presence": "always" } @@ -10880,6 +11663,18 @@ "type": "GstDecklinkKeyerMode", "writable": true }, + "mapping-format": { + "blurb": "3G-SDI Mapping Format (Level A/B)", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "default (0)", + "mutable": "null", + "readable": true, + "type": "GstDecklinkMappingFormat", + "writable": true + }, "mode": { "blurb": "Video Mode to use for playback", "conditionally-available": false, @@ -10892,6 +11687,20 @@ "type": "GstDecklinkModes", "writable": true }, + "persistent-id": { + "blurb": "Output device instance to use. Higher priority than \"device-number\".", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "18446744073709551615", + "max": "9223372036854775807", + "min": "-1", + "mutable": "null", + "readable": true, + "type": "gint64", + "writable": true + }, "profile": { "blurb": "Certain DeckLink devices such as the DeckLink 8K Pro, the DeckLink Quad 2 and the DeckLink Duo 2 support multiple profiles to configure the capture and playback behavior of its sub-devices.For the DeckLink Duo 2 and DeckLink Quad 2, a profile is shared between any 2 sub-devices that utilize the same connectors. For the DeckLink 8K Pro, a profile is shared between all 4 sub-devices. Any sub-devices that share a profile are considered to be part of the same profile group.DeckLink Duo 2 support configuration of the duplex mode of individual sub-devices.", "conditionally-available": false, @@ -10947,7 +11756,7 @@ "long-name": "Decklink Video Source", "pad-templates": { "src": { - "caps": "video/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 30000/1001\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 30000/1001\n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 30000/1001\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 30000/1001\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: top-field-first\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: top-field-first\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: top-field-first\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: top-field-first\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30/1\n field-order: top-field-first\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30/1\n field-order: top-field-first\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30/1\n field-order: top-field-first\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30/1\n field-order: top-field-first\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: BGRA\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: v210\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: ARGB\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: BGRA\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: v210\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: ARGB\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: BGRA\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: v210\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: ARGB\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 30000/1001\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 30000/1001\n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 30000/1001\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 30000/1001\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\n", + "caps": "video/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 30000/1001\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 30000/1001\n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 30000/1001\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 10/11\n interlace-mode: progressive\n framerate: 30000/1001\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 12/11\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: top-field-first\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: top-field-first\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: top-field-first\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: top-field-first\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30/1\n field-order: top-field-first\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30/1\n field-order: top-field-first\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30/1\n field-order: top-field-first\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: interleaved\n framerate: 30/1\n field-order: top-field-first\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: BGRA\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: v210\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: ARGB\nvideo/x-raw:\n width: 1920\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: BGRA\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: v210\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: ARGB\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: BGRA\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: v210\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: ARGB\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: BGRA\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: v210\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: ARGB\nvideo/x-raw:\n width: 1280\n height: 720\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1556\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: BGRA\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: UYVY\n colorimetry: bt709\n chroma-site: mpeg2\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: v210\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: ARGB\nvideo/x-raw:\n width: 2048\n height: 1080\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: BGRA\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: v210\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: ARGB\nvideo/x-raw:\n width: 3840\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 30000/1001\n field-order: bottom-field-first\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: interleaved\n framerate: 24000/1001\n field-order: bottom-field-first\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: interleaved\n framerate: 25/1\n field-order: top-field-first\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 30000/1001\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 30000/1001\n format: v210\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 30000/1001\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 486\npixel-aspect-ratio: 40/33\n interlace-mode: progressive\n framerate: 30000/1001\n format: BGRA\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt601\n chroma-site: mpeg2\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 720\n height: 576\npixel-aspect-ratio: 16/11\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: BGRA\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: v210\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: ARGB\nvideo/x-raw:\n width: 4096\n height: 2160\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: BGRA\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: v210\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: ARGB\nvideo/x-raw:\n width: 7680\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24000/1001\n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 24/1\n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 25/1\n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30000/1001\n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 30/1\n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 50/1\n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60000/1001\n format: BGRA\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: UYVY\n colorimetry: bt2020\n chroma-site: mpeg2\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: v210\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: ARGB\nvideo/x-raw:\n width: 8192\n height: 4320\npixel-aspect-ratio: 1/1\n interlace-mode: progressive\n framerate: 60/1\n format: BGRA\n", "direction": "src", "presence": "always" } @@ -11065,6 +11874,20 @@ "type": "gboolean", "writable": true }, + "persistent-id": { + "blurb": "Output device instance to use. Higher priority than \"device-number\".", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "18446744073709551615", + "max": "9223372036854775807", + "min": "-1", + "mutable": "null", + "readable": true, + "type": "gint64", + "writable": true + }, "profile": { "blurb": "Certain DeckLink devices such as the DeckLink 8K Pro, the DeckLink Quad 2 and the DeckLink Duo 2 support multiple profiles to configure the capture and playback behavior of its sub-devices.For the DeckLink Duo 2 and DeckLink Quad 2, a profile is shared between any 2 sub-devices that utilize the same connectors. For the DeckLink 8K Pro, a profile is shared between all 4 sub-devices. Any sub-devices that share a profile are considered to be part of the same profile group.DeckLink Duo 2 support configuration of the duplex mode of individual sub-devices.", "conditionally-available": false, @@ -11254,6 +12077,26 @@ } }, + "GstDecklinkMappingFormat": { + "kind": "enum", + "values": + { + "desc": "Default, don't change mapping format", + "name": "default", + "value": "0" + }, + { + "desc": "Level A", + "name": "level-a", + "value": "1" + }, + { + "desc": "Level B", + "name": "level-b", + "value": "2" + } + + }, "GstDecklinkModes": { "kind": "enum", "values": @@ -11476,6 +12319,126 @@ "desc": "PAL SD 50p Widescreen", "name": "pal-p-widescreen", "value": "43" + }, + { + "desc": "4k dci 23.98p", + "name": "4kdcip2398", + "value": "44" + }, + { + "desc": "4k dci 24p", + "name": "4kdcip24", + "value": "45" + }, + { + "desc": "4k dci 25p", + "name": "4kdcip25", + "value": "46" + }, + { + "desc": "4k dci 29.97p", + "name": "4kdcip2997", + "value": "47" + }, + { + "desc": "4k dci 30p", + "name": "4kdcip30", + "value": "48" + }, + { + "desc": "4k dci 50p", + "name": "4kdcip50", + "value": "49" + }, + { + "desc": "4k dci 59.94p", + "name": "4kdcip5994", + "value": "50" + }, + { + "desc": "4k dci 60p", + "name": "4kdcip60", + "value": "51" + }, + { + "desc": "8k 23.98p", + "name": "8kp2398", + "value": "52" + }, + { + "desc": "8k 24p", + "name": "8kp24", + "value": "53" + }, + { + "desc": "8k 25p", + "name": "8kp25", + "value": "54" + }, + { + "desc": "8k 29.97p", + "name": "8kp2997", + "value": "55" + }, + { + "desc": "8k 30p", + "name": "8kp30", + "value": "56" + }, + { + "desc": "8k 50p", + "name": "8kp50", + "value": "57" + }, + { + "desc": "8k 59.94p", + "name": "8kp5994", + "value": "58" + }, + { + "desc": "8k 60p", + "name": "8kp60", + "value": "59" + }, + { + "desc": "8k dci 23.98p", + "name": "8kdcip2398", + "value": "60" + }, + { + "desc": "8k dci 24p", + "name": "8kdcip24", + "value": "61" + }, + { + "desc": "8k dci 25p", + "name": "8kdcip25", + "value": "62" + }, + { + "desc": "8k dci 29.97p", + "name": "8kdcip2997", + "value": "63" + }, + { + "desc": "8k dci 30p", + "name": "8kdcip30", + "value": "64" + }, + { + "desc": "8k dci 50p", + "name": "8kdcip50", + "value": "65" + }, + { + "desc": "8k dci 59.94p", + "name": "8kdcip5994", + "value": "66" + }, + { + "desc": "8k dci 60p", + "name": "8kdcip60", + "value": "67" } }, @@ -11936,6 +12899,808 @@ "tracers": {}, "url": "Unknown package origin" }, + "directshow": { + "description": "DirectShow plugin", + "elements": { + "dshowadec_mp3": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow MPEG Layer 3 Audio Decoder Wrapper", + "hierarchy": + "dshowadec_mp3", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Audio", + "pad-templates": { + "sink": { + "caps": "audio/mpeg:\n mpegversion: 1\n layer: 3\n rate: 8000, 48000 \n channels: 1, 2 \n parsed: true\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: { F64LE, F64BE, F32LE, F32BE, S32LE, S32BE, U32LE, U32BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, S16LE, S16BE, U16LE, U16BE, S8, U8 }\n rate: 1, 2147483647 \n channels: 1, 2147483647 \n layout: interleaved\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowadec_mpeg_1_2": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow MPEG Layer 1,2 Audio Decoder Wrapper", + "hierarchy": + "dshowadec_mpeg_1_2", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Audio", + "pad-templates": { + "sink": { + "caps": "audio/mpeg:\n mpegversion: 1\n layer: 1, 2 \n rate: 8000, 48000 \n channels: 1, 2 \n parsed: true\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: { F64LE, F64BE, F32LE, F32BE, S32LE, S32BE, U32LE, U32BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, S16LE, S16BE, U16LE, U16BE, S8, U8 }\n rate: 1, 2147483647 \n channels: 1, 2147483647 \n layout: interleaved\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowadec_wma1": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Windows Media Audio 7 Decoder Wrapper", + "hierarchy": + "dshowadec_wma1", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Audio", + "pad-templates": { + "sink": { + "caps": "audio/x-wma:\n wmaversion: 1\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: { F64LE, F64BE, F32LE, F32BE, S32LE, S32BE, U32LE, U32BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, S16LE, S16BE, U16LE, U16BE, S8, U8 }\n rate: 1, 2147483647 \n channels: 1, 2147483647 \n layout: interleaved\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowadec_wma2": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Windows Media Audio 8 Decoder Wrapper", + "hierarchy": + "dshowadec_wma2", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Audio", + "pad-templates": { + "sink": { + "caps": "audio/x-wma:\n wmaversion: 2\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: { F64LE, F64BE, F32LE, F32BE, S32LE, S32BE, U32LE, U32BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, S16LE, S16BE, U16LE, U16BE, S8, U8 }\n rate: 1, 2147483647 \n channels: 1, 2147483647 \n layout: interleaved\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowadec_wma3": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Windows Media Audio 9 Professional Decoder Wrapper", + "hierarchy": + "dshowadec_wma3", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Audio", + "pad-templates": { + "sink": { + "caps": "audio/x-wma:\n wmaversion: 3\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: { F64LE, F64BE, F32LE, F32BE, S32LE, S32BE, U32LE, U32BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, S16LE, S16BE, U16LE, U16BE, S8, U8 }\n rate: 1, 2147483647 \n channels: 1, 2147483647 \n layout: interleaved\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowadec_wma4": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Windows Media Audio 9 Lossless Decoder Wrapper", + "hierarchy": + "dshowadec_wma4", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Audio", + "pad-templates": { + "sink": { + "caps": "audio/x-wma:\n wmaversion: 4\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: { F64LE, F64BE, F32LE, F32BE, S32LE, S32BE, U32LE, U32BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, S16LE, S16BE, U16LE, U16BE, S8, U8 }\n rate: 1, 2147483647 \n channels: 1, 2147483647 \n layout: interleaved\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowadec_wms": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Windows Media Audio Voice v9 Decoder Wrapper", + "hierarchy": + "dshowadec_wms", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Audio", + "pad-templates": { + "sink": { + "caps": "audio/x-wms:\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: { F64LE, F64BE, F32LE, F32BE, S32LE, S32BE, U32LE, U32BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, S16LE, S16BE, U16LE, U16BE, S8, U8 }\n rate: 1, 2147483647 \n channels: 1, 2147483647 \n layout: interleaved\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowaudiosrc": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "Receive data from a directshow audio capture graph", + "hierarchy": + "GstDshowAudioSrc", + "GstAudioSrc", + "GstAudioBaseSrc", + "GstPushSrc", + "GstBaseSrc", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Source/Audio", + "pad-templates": { + "src": { + "caps": "audio/x-raw:\n format: { S16LE, U16LE, S8LE, U8LE }\n rate: 1, 2147483647 \n channels: 1, 2 \n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "device": { + "blurb": "Directshow device reference (classID/name)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": true + }, + "device-index": { + "blurb": "Index of the enumerated audio device", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + }, + "device-name": { + "blurb": "Human-readable name of the sound device", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": true + } + }, + "rank": "none" + }, + "dshowvdec_cinepak": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Cinepack Decoder Wrapper", + "hierarchy": + "dshowvdec_cinepak", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-cinepak:\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: RGB\n bpp: 32\n depth: 24\n endianness: 4321\n red_mask: 65280\n green_mask: 16711680\n blue_mask: -16777216\n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_divx3": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow DIVX 3.0 Video Decoder Wrapper", + "hierarchy": + "dshowvdec_divx3", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-divx:\n divxversion: 3\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_divx4": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow DIVX 4.0 Video Decoder Wrapper", + "hierarchy": + "dshowvdec_divx4", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-divx:\n divxversion: 4\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_divx5": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow DIVX 5.0 Video Decoder Wrapper", + "hierarchy": + "dshowvdec_divx5", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-divx:\n divxversion: 5\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_mpeg1": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow MPEG-1 Video Decoder Wrapper", + "hierarchy": + "dshowvdec_mpeg1", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/mpeg:\n mpegversion: 1\n parsed: true\n systemstream: false\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_mpeg4": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow MPEG-4 Video Decoder Wrapper", + "hierarchy": + "dshowvdec_mpeg4", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/mpeg:\n msmpegversion: 4\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_msmpeg4": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Microsoft ISO MPEG-4 version 1.1 Decoder Wrapper", + "hierarchy": + "dshowvdec_msmpeg4", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-msmpeg:\n msmpegversion: 4\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_msmpeg41": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Microsoft ISO MPEG-4 version 1 Decoder Wrapper", + "hierarchy": + "dshowvdec_msmpeg41", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-msmpeg:\n msmpegversion: 41\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_msmpeg42": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Microsoft ISO MPEG-4 version 2 Decoder Wrapper", + "hierarchy": + "dshowvdec_msmpeg42", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-msmpeg:\n msmpegversion: 42\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_msmpeg43": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Microsoft ISO MPEG-4 version 3 Decoder Wrapper", + "hierarchy": + "dshowvdec_msmpeg43", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-msmpeg:\n msmpegversion: 43\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_wmv1": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Windows Media Video 7 Decoder Wrapper", + "hierarchy": + "dshowvdec_wmv1", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-wmv:\n wmvversion: 1\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_wmv2": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Windows Media Video 8 Decoder Wrapper", + "hierarchy": + "dshowvdec_wmv2", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-wmv:\n wmvversion: 2\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_wmv3": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Windows Media Video 9 Decoder Wrapper", + "hierarchy": + "dshowvdec_wmv3", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-wmv:\n wmvversion: 3\n format: WMV3\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_wmva": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Windows Media Video 9 Advanced Decoder Wrapper", + "hierarchy": + "dshowvdec_wmva", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-wmv:\n wmvversion: 3\n format: WMVA\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_wmvp": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Windows Media Video 9 Image Decoder Wrapper", + "hierarchy": + "dshowvdec_wmvp", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-wmv:\n wmvversion: 3\n format: { WMVP, MSS1 }\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvdec_wvc1": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow Windows Media VC1 video Decoder Wrapper", + "hierarchy": + "dshowvdec_wvc1", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-wmv:\n wmvversion: 3\n format: WVC1\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal + 2" + }, + "dshowvdec_xvid": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "DirectShow XVID Video Decoder Wrapper", + "hierarchy": + "dshowvdec_xvid", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video", + "pad-templates": { + "sink": { + "caps": "video/x-xvid:\n width: 16, 4096 \n height: 16, 4096 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: YUY2\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "dshowvideosink": { + "author": "Pioneers of the Inevitable <songbird@songbirdnest.com>, FLUENDO S.A. <support@fluendo.com>", + "description": "Display data using a DirectShow video renderer", + "hierarchy": + "GstDshowVideoSink", + "GstVideoSink", + "GstBaseSink", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstVideoOverlay", + "GstNavigation" + , + "klass": "Sink/Video", + "pad-templates": { + "sink": { + "caps": "video/x-raw:\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n format: { YUY2, UYVY, YV12 }\n", + "direction": "sink", + "presence": "always" + } + }, + "properties": { + "force-aspect-ratio": { + "blurb": "When enabled, scaling will respect original aspect ratio", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "fullscreen": { + "blurb": "Use full-screen mode (not available when using XOverlay)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "renderer": { + "blurb": "Force usage of specific DirectShow renderer (EVR, VMR9 or VMR7)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": true + } + }, + "rank": "marginal" + }, + "dshowvideosrc": { + "author": "Sebastien Moutte <sebastien@moutte.net>", + "description": "Receive data from a directshow video capture graph", + "hierarchy": + "GstDshowVideoSrc", + "GstPushSrc", + "GstBaseSrc", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Source/Video", + "pad-templates": { + "src": { + "caps": "video/x-raw:\n format: { I420, BGR, YUY2, UYVY, BGRx, BGR16, BGR15, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nvideo/x-dv:\n format: DVSD\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n systemstream: { (boolean)true, (boolean)false }\nimage/jpeg:\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nvideo/x-h264:\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "device": { + "blurb": "Directshow device path (@..classID/name)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": true + }, + "device-index": { + "blurb": "Index of the enumerated video device", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + }, + "device-name": { + "blurb": "Human-readable name of the video device", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": true + } + }, + "rank": "none" + } + }, + "filename": "gstdirectshow", + "license": "LGPL", + "other-types": {}, + "package": "GStreamer Bad Plug-ins", + "source": "gst-plugins-bad", + "tracers": {}, + "url": "Unknown package origin" + }, "directsoundsrc": { "description": "Direct Sound Source plugin library", "elements": { @@ -14547,7 +16312,7 @@ "long-name": "DVB Subtitles Overlay", "pad-templates": { "src": { - "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" }, @@ -14557,7 +16322,7 @@ "presence": "always" }, "video_sink": { - "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" } @@ -15067,14 +16832,26 @@ "presence": "always" }, "src": { - "caps": "audio/mpeg:\n mpegversion: 4\n rate: { (int)8000, (int)11025, (int)12000, (int)16000, (int)22050, (int)24000, (int)32000, (int)44100, (int)48000, (int)64000, (int)88200, (int)96000 }\n channels: { (int)1, (int)2, (int)3, (int)4, (int)5, (int)6, (int)8 }\n stream-format: { (string)adts, (string)adif, (string)raw }\n base-profile: lc\n framed: true\n", + "caps": "audio/mpeg:\n mpegversion: 4\n rate: { (int)8000, (int)11025, (int)12000, (int)16000, (int)22050, (int)24000, (int)32000, (int)44100, (int)48000, (int)64000, (int)88200, (int)96000 }\n channels: { (int)1, (int)2, (int)3, (int)4, (int)5, (int)6, (int)8 }\n stream-format: { (string)adts, (string)adif, (string)raw }\n profile: { (string)lc, (string)he-aac-v1, (string)he-aac-v2, (string)ld }\n framed: true\n", "direction": "src", "presence": "always" } }, "properties": { + "afterburner": { + "blurb": "Additional quality control parameter. Can cause workload increase.", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, "bitrate": { - "blurb": "Target Audio Bitrate (0 = fixed value based on sample rate and channel count)", + "blurb": "Target Audio Bitrate. Only applicable if rate-control=cbr. (0 = fixed value based on sample rate and channel count)", "conditionally-available": false, "construct": false, "construct-only": false, @@ -15086,6 +16863,44 @@ "readable": true, "type": "gint", "writable": true + }, + "peak-bitrate": { + "blurb": "Peak Bitrate to adjust maximum bits per audio frame. Bitrate is in bits/second. Only applicable if rate-control=vbr. (0 = Not set)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + }, + "rate-control": { + "blurb": "Whether Constant or Variable Bitrate should be used.", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "cbr (0)", + "mutable": "null", + "readable": true, + "type": "GstFdkAacRateControl", + "writable": true + }, + "vbr-preset": { + "blurb": "AAC Variable Bitrate configurations. Requires rate-control as vbr.", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "medium (3)", + "mutable": "null", + "readable": true, + "type": "GstFdkAacVbrPreset", + "writable": true } }, "rank": "primary" @@ -15093,7 +16908,53 @@ }, "filename": "gstfdkaac", "license": "LGPL", - "other-types": {}, + "other-types": { + "GstFdkAacRateControl": { + "kind": "enum", + "values": + { + "desc": "Constant Bitrate", + "name": "cbr", + "value": "0" + }, + { + "desc": "Variable Bitrate", + "name": "vbr", + "value": "1" + } + + }, + "GstFdkAacVbrPreset": { + "kind": "enum", + "values": + { + "desc": "Very Low Variable Bitrate", + "name": "very-low", + "value": "1" + }, + { + "desc": "Low Variable Bitrate", + "name": "low", + "value": "2" + }, + { + "desc": "Medium Variable Bitrate", + "name": "medium", + "value": "3" + }, + { + "desc": "High Variable Bitrate", + "name": "high", + "value": "4" + }, + { + "desc": "Very High Variable Bitrate", + "name": "very-high", + "value": "5" + } + + } + }, "package": "GStreamer Bad Plug-ins", "source": "gst-plugins-bad", "tracers": {}, @@ -27573,6 +29434,69 @@ "tracers": {}, "url": "Unknown package origin" }, + "gtkwayland": { + "description": "Gtk+ wayland sink", + "elements": { + "gtkwaylandsink": { + "author": "George Kiagiadakis <george.kiagiadakis@collabora.com>", + "description": "A video sink that renders to a GtkWidget using Wayland API", + "hierarchy": + "GstGtkWaylandSink", + "GstVideoSink", + "GstBaseSink", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstNavigation" + , + "klass": "Sink/Video", + "long-name": "Gtk Wayland Video Sink", + "pad-templates": { + "sink": { + "caps": "video/x-raw:\n format: { BGRx, BGRA, RGBx, xBGR, xRGB, RGBA, ABGR, ARGB, RGB, BGR, RGB16, BGR16, YUY2, YVYU, UYVY, AYUV, NV12, NV21, NV16, NV61, YUV9, YVU9, Y41B, I420, YV12, Y42B, v308 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:DMABuf):\n format: { BGRx, BGRA, RGBx, xBGR, xRGB, RGBA, ABGR, ARGB, RGB, BGR, RGB16, BGR16, YUY2, YVYU, UYVY, AYUV, NV12, NV21, NV16, NV61, YUV9, YVU9, Y41B, I420, YV12, Y42B, v308 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + } + }, + "properties": { + "rotate-method": { + "blurb": "rotate method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "identity (0)", + "mutable": "null", + "readable": true, + "type": "GstVideoOrientationMethod", + "writable": true + }, + "widget": { + "blurb": "The GtkWidget to place in the widget hierarchy (must only be get from the GTK main thread)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "mutable": "null", + "readable": true, + "type": "GtkWidget", + "writable": false + } + }, + "rank": "marginal" + } + }, + "filename": "gstgtkwayland", + "license": "LGPL", + "other-types": {}, + "package": "GStreamer Bad Plug-ins", + "source": "gst-plugins-bad", + "tracers": {}, + "url": "Unknown package origin" + }, "hls": { "description": "HTTP Live Streaming (HLS)", "elements": { @@ -28164,7 +30088,7 @@ "long-name": "Internal video sink", "pad-templates": { "sink": { - "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" } @@ -28200,7 +30124,7 @@ "long-name": "Internal video source", "pad-templates": { "src": { - "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" } @@ -28919,7 +30843,7 @@ "rank": "secondary" }, "jpegparse": { - "author": "Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>", + "author": "Víctor Jáquez <vjaquez@igalia.com>", "description": "Parse JPEG images into single-frame buffers", "hierarchy": "GstJpegParse", @@ -28929,7 +30853,7 @@ "GInitiallyUnowned", "GObject" , - "klass": "Video/Parser", + "klass": "Codec/Parser/Image", "long-name": "JPEG stream parser", "pad-templates": { "sink": { @@ -28938,7 +30862,7 @@ "presence": "always" }, "src": { - "caps": "image/jpeg:\n format: { I420, Y41B, UYVY, YV12 }\n width: 0, 2147483647 \n height: 0, 2147483647 \n framerate: 0/1, 2147483647/1 \n parsed: true\n", + "caps": "image/jpeg:\n framerate: 0/1, 2147483647/1 \n parsed: true\n", "direction": "src", "presence": "always" } @@ -29439,6 +31363,20 @@ "type": "gchararray", "writable": true }, + "fd": { + "blurb": "DRM file descriptor", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "2147483647", + "min": "-1", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + }, "force-modesetting": { "blurb": "When enabled, the sink try to configure the display mode", "conditionally-available": false, @@ -29498,6 +31436,18 @@ "readable": true, "type": "gboolean", "writable": true + }, + "skip-vsync": { + "blurb": "When enabled will not wait internally for vsync. Should be used for atomic drivers to avoid double vsync.", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true } }, "rank": "secondary" @@ -209685,12 +211635,39 @@ "mediafoundation": { "description": "Microsoft Media Foundation plugin", "elements": { + "mfaacdec": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Microsoft Media Foundation AAC Decoder", + "hierarchy": + "GstMFAacDec", + "GstMFAudioDecoder", + "GstAudioDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Audio", + "pad-templates": { + "sink": { + "caps": "audio/mpeg:\n mpegversion: { (int)2, (int)4 }\n stream-format: raw\n framed: true\n channels: 1, 6 \n rate: 8000, 48000 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: S16LE\n layout: interleaved\n channels: 1, 6 \n rate: 8000, 48000 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "secondary" + }, "mfaacenc": { "author": "Seungha Yang <seungha@centricular.com>", "description": "Microsoft Media Foundation AAC Encoder", "hierarchy": "GstMFAacEnc", - "GstMFAudioEnc", + "GstMFAudioEncoder", "GstAudioEncoder", "GstElement", "GstObject", @@ -209701,7 +211678,6 @@ "GstPreset" , "klass": "Codec/Encoder/Audio", - "long-name": "Media Foundation Microsoft AAC Audio Encoder MFT", "pad-templates": { "sink": { "caps": "audio/x-raw:\n layout: interleaved\n format: S16LE\n channels: { (int)1, (int)2, (int)6 }\n rate: { (int)44100, (int)48000 }\n", @@ -209737,7 +211713,7 @@ "description": "Microsoft Media Foundation H.264 Encoder", "hierarchy": "GstMFH264Enc", - "GstMFVideoEnc", + "GstMFVideoEncoder", "GstVideoEncoder", "GstElement", "GstObject", @@ -209748,15 +211724,14 @@ "GstPreset" , "klass": "Codec/Encoder/Video/Hardware", - "long-name": "Media Foundation Intel® Quick Sync Video H.264 Encoder MFT", "pad-templates": { "sink": { - "caps": "video/x-raw:\n width: 64, 8192 \n height: 64, 8192 \n format: { NV12 }\n\nvideo/x-raw(memory:D3D11Memory):\n width: 64, 8192 \n height: 64, 8192 \n format: { NV12 }\n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: NV12\n width: 64, 8192 \n height: 64, 8192 \nvideo/x-raw:\n format: NV12\n width: 64, 8192 \n height: 64, 8192 \n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-h264:\n stream-format: byte-stream\n alignment: au\n profile: { (string)high, (string)main, (string)constrained-baseline, (string)baseline }\n width: 64, 8192 \n height: 64, 8192 \n", + "caps": "video/x-h264:\n width: 64, 8192 \n height: 64, 8192 \n stream-format: byte-stream\n alignment: au\n profile: { (string)high, (string)main, (string)constrained-baseline, (string)baseline }\n", "direction": "src", "presence": "always" } @@ -209768,7 +211743,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "86670", + "default": "0", "max": "9223372036854775807", "min": "-9223372036854775808", "mutable": "null", @@ -209776,6 +211751,18 @@ "type": "gint64", "writable": false }, + "adaptive-mode": { + "blurb": "Adaptive Mode", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "none (0)", + "mutable": "null", + "readable": true, + "type": "GstMFH264EncAdaptiveMode", + "writable": true + }, "bframes": { "blurb": "The maximum number of consecutive B frames", "conditionally-available": true, @@ -209868,6 +211855,34 @@ "type": "guint", "writable": true }, + "max-qp": { + "blurb": "The maximum allowed QP applied to all rc-mode", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "51", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "min-qp": { + "blurb": "The minimum allowed QP applied to all rc-mode", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, "qp": { "blurb": "QP applied when rc-mode is \"qvbr\"", "conditionally-available": true, @@ -209986,7 +212001,7 @@ "description": "Microsoft Media Foundation H.265 Encoder", "hierarchy": "GstMFH265Enc", - "GstMFVideoEnc", + "GstMFVideoEncoder", "GstVideoEncoder", "GstElement", "GstObject", @@ -209997,15 +212012,14 @@ "GstPreset" , "klass": "Codec/Encoder/Video/Hardware", - "long-name": "Media Foundation Intel® Hardware H265 Encoder MFT", "pad-templates": { "sink": { - "caps": "video/x-raw:\n width: 64, 8192 \n height: 64, 8192 \n format: { NV12, P010_10LE }\n\nvideo/x-raw(memory:D3D11Memory):\n width: 64, 8192 \n height: 64, 8192 \n format: { NV12, P010_10LE }\n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE }\n width: 64, 8192 \n height: 64, 8192 \nvideo/x-raw:\n format: { NV12, P010_10LE }\n width: 64, 8192 \n height: 64, 8192 \n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-h265:\n stream-format: byte-stream\n alignment: au\n profile: { (string)main, (string)main-10 }\n width: 64, 8192 \n height: 64, 8192 \n", + "caps": "video/x-h265:\n width: 64, 8192 \n height: 64, 8192 \n stream-format: byte-stream\n alignment: au\n profile: { (string)main, (string)main-10 }\n", "direction": "src", "presence": "always" } @@ -210017,7 +212031,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "86670", + "default": "0", "max": "9223372036854775807", "min": "-9223372036854775808", "mutable": "null", @@ -210105,6 +212119,34 @@ "type": "guint", "writable": true }, + "max-qp": { + "blurb": "The maximum allowed QP applied to all rc-mode", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "51", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "min-qp": { + "blurb": "The minimum allowed QP applied to all rc-mode", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, "qp": { "blurb": "QP applied when rc-mode is \"qvbr\"", "conditionally-available": true, @@ -210187,6 +212229,20 @@ "type": "GstMFH265EncRCMode", "writable": true }, + "ref": { + "blurb": "The number of reference frames", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "2", + "max": "16", + "min": "1", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, "vbv-buffer-size": { "blurb": "VBV(HRD) Buffer Size in bytes (0 = MFT default)", "conditionally-available": true, @@ -210204,12 +212260,39 @@ }, "rank": "secondary" }, + "mfmp3dec": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Microsoft Media Foundation MP3 Decoder", + "hierarchy": + "GstMFMp3Dec", + "GstMFAudioDecoder", + "GstAudioDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Audio", + "pad-templates": { + "sink": { + "caps": "audio/mpeg:\n mpegversion: 1\n layer: 3\n channels: 1, 2 \n rate: 8000, 48000 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "audio/x-raw:\n format: S16LE\n layout: interleaved\n channels: 1, 2 \n rate: 8000, 48000 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "secondary" + }, "mfmp3enc": { "author": "Seungha Yang <seungha@centricular.com>", "description": "Microsoft Media Foundation MP3 Encoder", "hierarchy": "GstMFMp3Enc", - "GstMFAudioEnc", + "GstMFAudioEncoder", "GstAudioEncoder", "GstElement", "GstObject", @@ -210220,7 +212303,6 @@ "GstPreset" , "klass": "Codec/Encoder/Audio", - "long-name": "Media Foundation MP3 Encoder ACM Wrapper MFT", "pad-templates": { "sink": { "caps": "audio/x-raw:\n format: S16LE\n layout: interleaved\n channels: 1, 2 \n rate: { (int)8000, (int)11025, (int)12000, (int)16000, (int)22050, (int)24000, (int)32000, (int)44100, (int)48000 }\n", @@ -210264,7 +212346,6 @@ "GObject" , "klass": "Source/Video/Hardware", - "long-name": "Media Foundation Video Source", "pad-templates": { "src": { "caps": "video/x-raw:\n format: { BGRx, BGRA, BGR, RGB15, RGB16, VUYA, YUY2, YVYU, UYVY, NV12, YV12, I420, P010, P016, v210, v216, GRAY16_LE }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nimage/jpeg:\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", @@ -210330,7 +212411,7 @@ "description": "Microsoft Media Foundation VP9 Encoder", "hierarchy": "GstMFVP9Enc", - "GstMFVideoEnc", + "GstMFVideoEncoder", "GstVideoEncoder", "GstElement", "GstObject", @@ -210341,10 +212422,9 @@ "GstPreset" , "klass": "Codec/Encoder/Video/Hardware", - "long-name": "Media Foundation Intel® Hardware VP9 Encoder MFT", "pad-templates": { "sink": { - "caps": "video/x-raw:\n width: 64, 8192 \n height: 64, 8192 \n format: { NV12 }\n\nvideo/x-raw(memory:D3D11Memory):\n width: 64, 8192 \n height: 64, 8192 \n format: { NV12 }\n", + "caps": "video/x-raw(memory:D3D11Memory):\n format: NV12\n width: 64, 8192 \n height: 64, 8192 \nvideo/x-raw:\n format: NV12\n width: 64, 8192 \n height: 64, 8192 \n", "direction": "sink", "presence": "always" }, @@ -210361,7 +212441,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "86670", + "default": "0", "max": "9223372036854775807", "min": "-9223372036854775808", "mutable": "null", @@ -210454,9 +212534,20 @@ "filename": "gstmediafoundation", "license": "LGPL", "other-types": { - "GstMFAudioEnc": { + "GstMFAudioDecoder": { + "hierarchy": + "GstMFAudioDecoder", + "GstAudioDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "kind": "object" + }, + "GstMFAudioEncoder": { "hierarchy": - "GstMFAudioEnc", + "GstMFAudioEncoder", "GstAudioEncoder", "GstElement", "GstObject", @@ -210468,6 +212559,21 @@ , "kind": "object" }, + "GstMFH264EncAdaptiveMode": { + "kind": "enum", + "values": + { + "desc": "None", + "name": "none", + "value": "0" + }, + { + "desc": "Adaptively change the frame rate", + "name": "framerate", + "value": "1" + } + + }, "GstMFH264EncRCMode": { "kind": "enum", "values": @@ -210523,9 +212629,9 @@ } }, - "GstMFVideoEnc": { + "GstMFVideoEncoder": { "hierarchy": - "GstMFVideoEnc", + "GstMFVideoEncoder", "GstVideoEncoder", "GstElement", "GstObject", @@ -212385,6 +214491,88 @@ "properties": {}, "rank": "none" }, + "msdkav1enc": { + "author": "Haihao Xiang <haihao.xiang@intel.com>, Mengkejiergeli Ba <mengkejiergeli.ba@intel.com>", + "description": "AV1 video encoder based on Intel oneVPL", + "hierarchy": + "GstMsdkAV1Enc", + "GstMsdkEnc", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Encoder/Video/Hardware", + "long-name": "Intel MSDK AV1 encoder", + "pad-templates": { + "sink": { + "caps": "video/x-raw\n format: { NV12, P010_10LE }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \ninterlace-mode: progressive\nvideo/x-raw(memory:DMABuf)\n format: { NV12, P010_10LE }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \ninterlace-mode: progressive\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-av1\n framerate: 0/1, 2147483647/1 \n width: 1, 2147483647 \n height: 1, 2147483647 \n profile: { (string)main }\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "b-pyramid": { + "blurb": "Enable B-Pyramid Reference structure", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "num-tile-cols": { + "blurb": "number of columns for tiled encoding", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "1", + "max": "64", + "min": "1", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "num-tile-rows": { + "blurb": "number of rows for tiled encoding", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "1", + "max": "64", + "min": "1", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "p-pyramid": { + "blurb": "Enable P-Pyramid Reference structure", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + } + }, + "rank": "none" + }, "msdkh264dec": { "author": "Scott D Phillips <scott.d.phillips@intel.com>", "description": "H264 video decoder based on Intel Media SDK", @@ -214783,7 +216971,7 @@ "description": "Converts video from one colorspace to another using CUDA", "hierarchy": "GstCudaConvert", - "GstCudaBaseFilter", + "GstCudaBaseConvert", "GstCudaBaseTransform", "GstBaseTransform", "GstElement", @@ -214792,26 +216980,68 @@ "GObject" , "klass": "Filter/Converter/Video/Hardware", - "long-name": "CUDA Colorspace converter", "pad-templates": { "sink": { - "caps": "video/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" } }, "rank": "none" }, + "cudaconvertscale": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Resizes video and allow color conversion using CUDA", + "hierarchy": + "GstCudaConvertScale", + "GstCudaBaseConvert", + "GstCudaBaseTransform", + "GstBaseTransform", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Filter/Converter/Video/Scaler/Colorspace/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "add-borders": { + "blurb": "Add black borders if necessary to keep the display aspect ratio", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + } + }, + "rank": "none" + }, "cudadownload": { "author": "Seungha Yang <seungha.yang@navercorp.com>", "description": "Downloads data from NVIDA GPU via CUDA APIs", "hierarchy": "GstCudaDownload", + "GstCudaMemoryCopy", "GstCudaBaseTransform", "GstBaseTransform", "GstElement", @@ -214820,15 +217050,14 @@ "GObject" , "klass": "Filter/Video", - "long-name": "CUDA downloader", "pad-templates": { "sink": { - "caps": "video/x-raw(memory:CUDAMemory):\nvideo/x-raw:\n", + "caps": "video/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, YUY2, UYVY, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, YUY2, UYVY, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw:\n", + "caps": "video/x-raw:\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, YUY2, UYVY, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:GLMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, Y444, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, YUY2, UYVY, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory):\n format: { I420, YV12, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, BGRx, RGBx, Y42B, I422_10LE, I422_12LE }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, YUY2, UYVY, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" } @@ -214837,10 +217066,10 @@ }, "cudascale": { "author": "Seungha Yang <seungha.yang@navercorp.com>", - "description": "Resizes Video using CUDA", + "description": "Resize video using CUDA", "hierarchy": "GstCudaScale", - "GstCudaBaseFilter", + "GstCudaBaseConvert", "GstCudaBaseTransform", "GstBaseTransform", "GstElement", @@ -214849,19 +217078,32 @@ "GObject" , "klass": "Filter/Converter/Video/Scaler/Hardware", - "long-name": "CUDA Video scaler", "pad-templates": { "sink": { - "caps": "video/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" } }, + "properties": { + "add-borders": { + "blurb": "Add black borders if necessary to keep the display aspect ratio", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + } + }, "rank": "none" }, "cudaupload": { @@ -214869,6 +217111,7 @@ "description": "Uploads data into NVIDA GPU via CUDA APIs", "hierarchy": "GstCudaUpload", + "GstCudaMemoryCopy", "GstCudaBaseTransform", "GstBaseTransform", "GstElement", @@ -214877,19 +217120,2693 @@ "GObject" , "klass": "Filter/Video", - "long-name": "CUDA uploader", "pad-templates": { "sink": { - "caps": "video/x-raw:\n\nvideo/x-raw(memory:CUDAMemory):\n", + "caps": "video/x-raw:\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, YUY2, UYVY, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:GLMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, Y444, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, YUY2, UYVY, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:D3D11Memory):\n format: { I420, YV12, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, BGRx, RGBx, Y42B, I422_10LE, I422_12LE }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, YUY2, UYVY, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw(memory:CUDAMemory):\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, YUY2, UYVY, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, Y42B, I422_10LE, I422_12LE, YUY2, UYVY, RGBP, BGRP, GBR, GBRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "none" + }, + "nvautogpuh264enc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Encode H.264 video streams using NVCODEC API auto GPU select Mode", + "hierarchy": + "GstNvAutoGpuH264Enc", + "GstNvEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:CUDAMemory):\n format: { NV12, Y444 }\n width: 160, 4096 \n height: 64, 4096 \n interlace-mode: progressive\n\nvideo/x-raw(memory:D3D11Memory):\n format: { NV12, Y444 }\n width: 160, 4096 \n height: 64, 4096 \n interlace-mode: progressive\nvideo/x-raw:\n format: { NV12, Y444 }\n width: 160, 4096 \n height: 64, 4096 \n interlace-mode: progressive\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-h264:\n width: 160, 4096 \n height: 64, 4096 \n profile: { (string)main, (string)high, (string)constrained-high, (string)constrained-baseline, (string)baseline, (string)high-4:4:4 }\n stream-format: { (string)avc, (string)byte-stream }\n alignment: au\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "adapter-luid": { + "blurb": "DXGI Adapter LUID (Locally Unique Identifier) to use", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "9223372036854775807", + "min": "-9223372036854775808", + "mutable": "playing", + "readable": true, + "type": "gint64", + "writable": true + }, + "aq-strength": { + "blurb": "Adaptive Quantization Strength when spatial-aq is enabled from 1 (low) to 15 (aggressive), (0 = autoselect)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "15", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "aud": { + "blurb": "Use AU (Access Unit) delimiter", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-adapt": { + "blurb": "Enable adaptive B-frame insert when lookahead is enabled", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-frames": { + "blurb": "Number of B-frames between I and P", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "4", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "bitrate": { + "blurb": "Bitrate in kbit/sec (0 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "cabac": { + "blurb": "Enable CABAC entropy coding", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "const-quality": { + "blurb": "Target Constant Quality level for VBR mode (0 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "gdouble", + "writable": true + }, + "cuda-device-id": { + "blurb": "CUDA device ID to use", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "gop-size": { + "blurb": "Number of frames between intra frames (-1 = infinite)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "30", + "max": "2147483647", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "i-adapt": { + "blurb": "Enable adaptive I-frame insert when lookahead is enabled", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "max-bitrate": { + "blurb": "Maximum Bitrate in kbit/sec (ignored in CBR mode)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp-b": { + "blurb": "Maximum QP value for B frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-qp-i": { + "blurb": "Maximum QP value for I frame, (-1 = disabled)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-qp-p": { + "blurb": "Maximum QP value for P frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-b": { + "blurb": "Minimum QP value for B frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-i": { + "blurb": "Minimum QP value for I frame, (-1 = disabled)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-p": { + "blurb": "Minimum QP value for P frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "nonref-p": { + "blurb": "Automatic insertion of non-reference P-frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "preset": { + "blurb": "Encoding Preset", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "default (0)", + "mutable": "playing", + "readable": true, + "type": "GstNvEncoderPreset", + "writable": true + }, + "qp-b": { + "blurb": "Constant QP value for B frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "qp-i": { + "blurb": "Constant QP value for I frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "qp-p": { + "blurb": "Constant QP value for P frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "rate-control": { + "blurb": "Rate Control Method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "vbr (1)", + "mutable": "playing", + "readable": true, + "type": "GstNvEncoderRCMode", + "writable": true + }, + "rc-lookahead": { + "blurb": "Number of frames for frame type lookahead", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "32", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "repeat-sequence-header": { + "blurb": "Insert sequence headers (SPS/PPS) per IDR", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "spatial-aq": { + "blurb": "Spatial Adaptive Quantization", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "strict-gop": { + "blurb": "Minimize GOP-to-GOP rate fluctuations", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "temporal-aq": { + "blurb": "Temporal Adaptive Quantization", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "vbv-buffer-size": { + "blurb": "VBV(HRD) Buffer Size in kbits (0 = NVENC default)", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "-1", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "weighted-pred": { + "blurb": "Enables Weighted Prediction", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "zero-reorder-delay": { + "blurb": "Zero latency operation (i.e., num_reorder_frames = 0)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + } + }, + "rank": "none" + }, + "nvautogpuh265enc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Encode H.265 video streams using NVCODEC API auto GPU select Mode", + "hierarchy": + "GstNvAutoGpuH265Enc", + "GstNvEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:CUDAMemory):\n format: { NV12, P010_10LE, Y444, Y444_16LE }\n width: 144, 8192 \n height: 48, 8192 \n interlace-mode: progressive\n\nvideo/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE, Y444, Y444_16LE }\n width: 144, 8192 \n height: 48, 8192 \n interlace-mode: progressive\nvideo/x-raw:\n format: { NV12, P010_10LE, Y444, Y444_16LE }\n width: 144, 8192 \n height: 48, 8192 \n interlace-mode: progressive\n", "direction": "sink", "presence": "always" }, "src": { - "caps": "video/x-raw(memory:CUDAMemory):\n", + "caps": "video/x-h265:\n width: 144, 8192 \n height: 48, 8192 \n profile: { (string)main, (string)main-10, (string)main-444, (string)main-444-10 }\n stream-format: { (string)hvc1, (string)hev1, (string)byte-stream }\n alignment: au\n", "direction": "src", "presence": "always" } }, + "properties": { + "adapter-luid": { + "blurb": "DXGI Adapter LUID (Locally Unique Identifier) to use", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "9223372036854775807", + "min": "-9223372036854775808", + "mutable": "playing", + "readable": true, + "type": "gint64", + "writable": true + }, + "aq-strength": { + "blurb": "Adaptive Quantization Strength when spatial-aq is enabled from 1 (low) to 15 (aggressive), (0 = autoselect)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "15", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "aud": { + "blurb": "Use AU (Access Unit) delimiter", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-adapt": { + "blurb": "Enable adaptive B-frame insert when lookahead is enabled", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-frames": { + "blurb": "Number of B-frames between I and P", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "5", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "bitrate": { + "blurb": "Bitrate in kbit/sec (0 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "const-quality": { + "blurb": "Target Constant Quality level for VBR mode (0 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "gdouble", + "writable": true + }, + "cuda-device-id": { + "blurb": "CUDA device ID to use", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "gop-size": { + "blurb": "Number of frames between intra frames (-1 = infinite)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "30", + "max": "2147483647", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "i-adapt": { + "blurb": "Enable adaptive I-frame insert when lookahead is enabled", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "max-bitrate": { + "blurb": "Maximum Bitrate in kbit/sec (ignored in CBR mode)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp-b": { + "blurb": "Maximum QP value for B frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-qp-i": { + "blurb": "Maximum QP value for I frame, (-1 = disabled)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-qp-p": { + "blurb": "Maximum QP value for P frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-b": { + "blurb": "Minimum QP value for B frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-i": { + "blurb": "Minimum QP value for I frame, (-1 = disabled)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-p": { + "blurb": "Minimum QP value for P frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "nonref-p": { + "blurb": "Automatic insertion of non-reference P-frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "preset": { + "blurb": "Encoding Preset", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "default (0)", + "mutable": "playing", + "readable": true, + "type": "GstNvEncoderPreset", + "writable": true + }, + "qp-b": { + "blurb": "Constant QP value for B frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "qp-i": { + "blurb": "Constant QP value for I frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "qp-p": { + "blurb": "Constant QP value for P frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "rate-control": { + "blurb": "Rate Control Method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "vbr (1)", + "mutable": "playing", + "readable": true, + "type": "GstNvEncoderRCMode", + "writable": true + }, + "rc-lookahead": { + "blurb": "Number of frames for frame type lookahead", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "32", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "repeat-sequence-header": { + "blurb": "Insert sequence headers (SPS/PPS) per IDR, ignored if negotiated stream-format is \"hvc1\"", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "spatial-aq": { + "blurb": "Spatial Adaptive Quantization", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "strict-gop": { + "blurb": "Minimize GOP-to-GOP rate fluctuations", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "temporal-aq": { + "blurb": "Temporal Adaptive Quantization", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "vbv-buffer-size": { + "blurb": "VBV(HRD) Buffer Size in kbits (0 = NVENC default)", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "-1", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "weighted-pred": { + "blurb": "Enables Weighted Prediction", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "zero-reorder-delay": { + "blurb": "Zero latency operation (i.e., num_reorder_frames = 0)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + } + }, + "rank": "none" + }, + "nvav1dec": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "NVIDIA AV1 video decoder", + "hierarchy": + "GstNvAV1Dec", + "GstAV1Decoder", + "GstVideoDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-av1:\n alignment: frame\n width: 128, 8192 \n height: 128, 8192 \n profile: { (string)main }\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n width: 128, 8192 \n height: 128, 8192 \n framerate: 0/1, 2147483647/1 \n format: { NV12, P010_10LE }\n\nvideo/x-raw(memory:GLMemory):\n width: 128, 8192 \n height: 128, 8192 \n framerate: 0/1, 2147483647/1 \n format: { NV12, P010_10LE }\n\nvideo/x-raw(memory:CUDAMemory):\n width: 128, 8192 \n height: 128, 8192 \n framerate: 0/1, 2147483647/1 \n format: { NV12, P010_10LE }\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "cuda-device-id": { + "blurb": "Assigned CUDA device id", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": false + } + }, + "rank": "primary" + }, + "nvcudah264enc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Encode H.264 video streams using NVCODEC API CUDA Mode", + "hierarchy": + "GstNvCudaH264Enc", + "GstNvEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:CUDAMemory):\n format: { NV12, Y444 }\n width: 160, 4096 \n height: 64, 4096 \n interlace-mode: progressive\nvideo/x-raw:\n format: { NV12, Y444 }\n width: 160, 4096 \n height: 64, 4096 \n interlace-mode: progressive\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-h264:\n width: 160, 4096 \n height: 64, 4096 \n profile: { (string)main, (string)high, (string)constrained-baseline, (string)baseline, (string)high-4:4:4 }\n stream-format: { (string)avc, (string)byte-stream }\n alignment: au\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "aq-strength": { + "blurb": "Adaptive Quantization Strength when spatial-aq is enabled from 1 (low) to 15 (aggressive), (0 = autoselect)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "15", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "aud": { + "blurb": "Use AU (Access Unit) delimiter", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-adapt": { + "blurb": "Enable adaptive B-frame insert when lookahead is enabled", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-frames": { + "blurb": "Number of B-frames between I and P", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "4", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "bitrate": { + "blurb": "Bitrate in kbit/sec (0 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "cabac": { + "blurb": "Enable CABAC entropy coding", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "const-quality": { + "blurb": "Target Constant Quality level for VBR mode (0 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "gdouble", + "writable": true + }, + "cuda-device-id": { + "blurb": "CUDA device ID of associated GPU", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": false + }, + "gop-size": { + "blurb": "Number of frames between intra frames (-1 = infinite)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "30", + "max": "2147483647", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "i-adapt": { + "blurb": "Enable adaptive I-frame insert when lookahead is enabled", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "max-bitrate": { + "blurb": "Maximum Bitrate in kbit/sec (ignored in CBR mode)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp-b": { + "blurb": "Maximum QP value for B frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-qp-i": { + "blurb": "Maximum QP value for I frame, (-1 = disabled)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-qp-p": { + "blurb": "Maximum QP value for P frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-b": { + "blurb": "Minimum QP value for B frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-i": { + "blurb": "Minimum QP value for I frame, (-1 = disabled)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-p": { + "blurb": "Minimum QP value for P frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "nonref-p": { + "blurb": "Automatic insertion of non-reference P-frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "preset": { + "blurb": "Encoding Preset", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "default (0)", + "mutable": "playing", + "readable": true, + "type": "GstNvEncoderPreset", + "writable": true + }, + "qp-b": { + "blurb": "Constant QP value for B frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "qp-i": { + "blurb": "Constant QP value for I frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "qp-p": { + "blurb": "Constant QP value for P frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "rate-control": { + "blurb": "Rate Control Method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "vbr (1)", + "mutable": "playing", + "readable": true, + "type": "GstNvEncoderRCMode", + "writable": true + }, + "rc-lookahead": { + "blurb": "Number of frames for frame type lookahead", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "32", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "repeat-sequence-header": { + "blurb": "Insert sequence headers (SPS/PPS) per IDR", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "spatial-aq": { + "blurb": "Spatial Adaptive Quantization", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "strict-gop": { + "blurb": "Minimize GOP-to-GOP rate fluctuations", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "temporal-aq": { + "blurb": "Temporal Adaptive Quantization", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "vbv-buffer-size": { + "blurb": "VBV(HRD) Buffer Size in kbits (0 = NVENC default)", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "-1", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "weighted-pred": { + "blurb": "Enables Weighted Prediction", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "zero-reorder-delay": { + "blurb": "Zero latency operation (i.e., num_reorder_frames = 0)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + } + }, + "rank": "none" + }, + "nvcudah265enc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Encode H.265 video streams using NVCODEC API CUDA Mode", + "hierarchy": + "GstNvCudaH265Enc", + "GstNvEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:CUDAMemory):\n format: { NV12, P010_10LE, Y444, Y444_16LE }\n width: 144, 8192 \n height: 48, 8192 \n interlace-mode: progressive\nvideo/x-raw:\n format: { NV12, P010_10LE, Y444, Y444_16LE }\n width: 144, 8192 \n height: 48, 8192 \n interlace-mode: progressive\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-h265:\n width: 144, 8192 \n height: 48, 8192 \n profile: { (string)main, (string)main-10, (string)main-444, (string)main-444-10 }\n stream-format: { (string)hvc1, (string)hev1, (string)byte-stream }\n alignment: au\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "aq-strength": { + "blurb": "Adaptive Quantization Strength when spatial-aq is enabled from 1 (low) to 15 (aggressive), (0 = autoselect)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "15", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "aud": { + "blurb": "Use AU (Access Unit) delimiter", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-adapt": { + "blurb": "Enable adaptive B-frame insert when lookahead is enabled", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-frames": { + "blurb": "Number of B-frames between I and P", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "5", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "bitrate": { + "blurb": "Bitrate in kbit/sec (0 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "const-quality": { + "blurb": "Target Constant Quality level for VBR mode (0 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "gdouble", + "writable": true + }, + "cuda-device-id": { + "blurb": "CUDA device ID of associated GPU", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": false + }, + "gop-size": { + "blurb": "Number of frames between intra frames (-1 = infinite)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "30", + "max": "2147483647", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "i-adapt": { + "blurb": "Enable adaptive I-frame insert when lookahead is enabled", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "max-bitrate": { + "blurb": "Maximum Bitrate in kbit/sec (ignored in CBR mode)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp-b": { + "blurb": "Maximum QP value for B frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-qp-i": { + "blurb": "Maximum QP value for I frame, (-1 = disabled)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-qp-p": { + "blurb": "Maximum QP value for P frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-b": { + "blurb": "Minimum QP value for B frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-i": { + "blurb": "Minimum QP value for I frame, (-1 = disabled)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-p": { + "blurb": "Minimum QP value for P frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "nonref-p": { + "blurb": "Automatic insertion of non-reference P-frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "preset": { + "blurb": "Encoding Preset", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "default (0)", + "mutable": "playing", + "readable": true, + "type": "GstNvEncoderPreset", + "writable": true + }, + "qp-b": { + "blurb": "Constant QP value for B frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "qp-i": { + "blurb": "Constant QP value for I frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "qp-p": { + "blurb": "Constant QP value for P frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "rate-control": { + "blurb": "Rate Control Method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "vbr (1)", + "mutable": "playing", + "readable": true, + "type": "GstNvEncoderRCMode", + "writable": true + }, + "rc-lookahead": { + "blurb": "Number of frames for frame type lookahead", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "32", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "repeat-sequence-header": { + "blurb": "Insert sequence headers (SPS/PPS) per IDR, ignored if negotiated stream-format is \"hvc1\"", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "spatial-aq": { + "blurb": "Spatial Adaptive Quantization", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "strict-gop": { + "blurb": "Minimize GOP-to-GOP rate fluctuations", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "temporal-aq": { + "blurb": "Temporal Adaptive Quantization", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "vbv-buffer-size": { + "blurb": "VBV(HRD) Buffer Size in kbits (0 = NVENC default)", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "-1", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "weighted-pred": { + "blurb": "Enables Weighted Prediction", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "zero-reorder-delay": { + "blurb": "Zero latency operation (i.e., num_reorder_frames = 0)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + } + }, + "rank": "none" + }, + "nvd3d11h264enc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Encode H.264 video streams using NVCODEC API Direct3D11 Mode", + "hierarchy": + "GstNvD3D11H264Enc", + "GstNvEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, Y444 }\n width: 160, 4096 \n height: 64, 4096 \n interlace-mode: progressive\nvideo/x-raw:\n format: { NV12, Y444 }\n width: 160, 4096 \n height: 64, 4096 \n interlace-mode: progressive\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-h264:\n width: 160, 4096 \n height: 64, 4096 \n profile: { (string)main, (string)high, (string)constrained-high, (string)constrained-baseline, (string)baseline, (string)high-4:4:4 }\n stream-format: { (string)avc, (string)byte-stream }\n alignment: au\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "adapter-luid": { + "blurb": "DXGI Adapter LUID (Locally Unique Identifier) of associated GPU", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "9223372036854775807", + "min": "-9223372036854775808", + "mutable": "null", + "readable": true, + "type": "gint64", + "writable": false + }, + "aq-strength": { + "blurb": "Adaptive Quantization Strength when spatial-aq is enabled from 1 (low) to 15 (aggressive), (0 = autoselect)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "15", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "aud": { + "blurb": "Use AU (Access Unit) delimiter", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-adapt": { + "blurb": "Enable adaptive B-frame insert when lookahead is enabled", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-frames": { + "blurb": "Number of B-frames between I and P", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "4", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "bitrate": { + "blurb": "Bitrate in kbit/sec (0 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "cabac": { + "blurb": "Enable CABAC entropy coding", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "const-quality": { + "blurb": "Target Constant Quality level for VBR mode (0 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "gdouble", + "writable": true + }, + "gop-size": { + "blurb": "Number of frames between intra frames (-1 = infinite)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "30", + "max": "2147483647", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "i-adapt": { + "blurb": "Enable adaptive I-frame insert when lookahead is enabled", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "max-bitrate": { + "blurb": "Maximum Bitrate in kbit/sec (ignored in CBR mode)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp-b": { + "blurb": "Maximum QP value for B frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-qp-i": { + "blurb": "Maximum QP value for I frame, (-1 = disabled)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-qp-p": { + "blurb": "Maximum QP value for P frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-b": { + "blurb": "Minimum QP value for B frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-i": { + "blurb": "Minimum QP value for I frame, (-1 = disabled)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-p": { + "blurb": "Minimum QP value for P frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "nonref-p": { + "blurb": "Automatic insertion of non-reference P-frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "preset": { + "blurb": "Encoding Preset", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "default (0)", + "mutable": "playing", + "readable": true, + "type": "GstNvEncoderPreset", + "writable": true + }, + "qp-b": { + "blurb": "Constant QP value for B frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "qp-i": { + "blurb": "Constant QP value for I frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "qp-p": { + "blurb": "Constant QP value for P frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "rate-control": { + "blurb": "Rate Control Method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "vbr (1)", + "mutable": "playing", + "readable": true, + "type": "GstNvEncoderRCMode", + "writable": true + }, + "rc-lookahead": { + "blurb": "Number of frames for frame type lookahead", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "32", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "repeat-sequence-header": { + "blurb": "Insert sequence headers (SPS/PPS) per IDR", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "spatial-aq": { + "blurb": "Spatial Adaptive Quantization", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "strict-gop": { + "blurb": "Minimize GOP-to-GOP rate fluctuations", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "temporal-aq": { + "blurb": "Temporal Adaptive Quantization", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "vbv-buffer-size": { + "blurb": "VBV(HRD) Buffer Size in kbits (0 = NVENC default)", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "-1", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "weighted-pred": { + "blurb": "Enables Weighted Prediction", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "zero-reorder-delay": { + "blurb": "Zero latency operation (i.e., num_reorder_frames = 0)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + } + }, + "rank": "none" + }, + "nvd3d11h265enc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Encode H.265 video streams using NVCODEC API Direct3D11 Mode", + "hierarchy": + "GstNvD3D11H265Enc", + "GstNvEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE, Y444, Y444_16LE }\n width: 144, 8192 \n height: 48, 8192 \n interlace-mode: progressive\nvideo/x-raw:\n format: { NV12, P010_10LE, Y444, Y444_16LE }\n width: 144, 8192 \n height: 48, 8192 \n interlace-mode: progressive\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-h265:\n width: 144, 8192 \n height: 48, 8192 \n profile: { (string)main, (string)main-10, (string)main-444, (string)main-444-10 }\n stream-format: { (string)hvc1, (string)hev1, (string)byte-stream }\n alignment: au\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "adapter-luid": { + "blurb": "DXGI Adapter LUID (Locally Unique Identifier) of associated GPU", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "9223372036854775807", + "min": "-9223372036854775808", + "mutable": "null", + "readable": true, + "type": "gint64", + "writable": false + }, + "aq-strength": { + "blurb": "Adaptive Quantization Strength when spatial-aq is enabled from 1 (low) to 15 (aggressive), (0 = autoselect)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "15", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "aud": { + "blurb": "Use AU (Access Unit) delimiter", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-adapt": { + "blurb": "Enable adaptive B-frame insert when lookahead is enabled", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-frames": { + "blurb": "Number of B-frames between I and P", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "5", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "bitrate": { + "blurb": "Bitrate in kbit/sec (0 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "const-quality": { + "blurb": "Target Constant Quality level for VBR mode (0 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "gdouble", + "writable": true + }, + "gop-size": { + "blurb": "Number of frames between intra frames (-1 = infinite)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "30", + "max": "2147483647", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "i-adapt": { + "blurb": "Enable adaptive I-frame insert when lookahead is enabled", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "max-bitrate": { + "blurb": "Maximum Bitrate in kbit/sec (ignored in CBR mode)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp-b": { + "blurb": "Maximum QP value for B frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-qp-i": { + "blurb": "Maximum QP value for I frame, (-1 = disabled)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "max-qp-p": { + "blurb": "Maximum QP value for P frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-b": { + "blurb": "Minimum QP value for B frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-i": { + "blurb": "Minimum QP value for I frame, (-1 = disabled)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "min-qp-p": { + "blurb": "Minimum QP value for P frame, (-1 = automatic)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "nonref-p": { + "blurb": "Automatic insertion of non-reference P-frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "preset": { + "blurb": "Encoding Preset", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "default (0)", + "mutable": "playing", + "readable": true, + "type": "GstNvEncoderPreset", + "writable": true + }, + "qp-b": { + "blurb": "Constant QP value for B frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "qp-i": { + "blurb": "Constant QP value for I frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "qp-p": { + "blurb": "Constant QP value for P frame (-1 = default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "-1", + "max": "51", + "min": "-1", + "mutable": "playing", + "readable": true, + "type": "gint", + "writable": true + }, + "rate-control": { + "blurb": "Rate Control Method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "vbr (1)", + "mutable": "playing", + "readable": true, + "type": "GstNvEncoderRCMode", + "writable": true + }, + "rc-lookahead": { + "blurb": "Number of frames for frame type lookahead", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "32", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "repeat-sequence-header": { + "blurb": "Insert sequence headers (SPS/PPS) per IDR, ignored if negotiated stream-format is \"hvc1\"", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "spatial-aq": { + "blurb": "Spatial Adaptive Quantization", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "strict-gop": { + "blurb": "Minimize GOP-to-GOP rate fluctuations", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "temporal-aq": { + "blurb": "Temporal Adaptive Quantization", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "vbv-buffer-size": { + "blurb": "VBV(HRD) Buffer Size in kbits (0 = NVENC default)", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "-1", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "weighted-pred": { + "blurb": "Enables Weighted Prediction", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, + "zero-reorder-delay": { + "blurb": "Zero latency operation (i.e., num_reorder_frames = 0)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + } + }, "rank": "none" }, "nvh264dec": { @@ -214905,7 +219822,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "NVDEC h264 Video Decoder", "pad-templates": { "sink": { "caps": "video/x-h264:\n stream-format: byte-stream\n alignment: au\n profile: { (string)constrained-baseline, (string)baseline, (string)main, (string)high, (string)constrained-high, (string)progressive-high }\n width: 48, 4096 \n height: 16, 4096 \n", @@ -214937,7 +219853,6 @@ "GstPreset" , "klass": "Codec/Encoder/Video/Hardware", - "long-name": "NVENC H.264 Video Encoder", "pad-templates": { "sink": { "caps": "video/x-raw:\n format: { NV12, YV12, I420, BGRA, RGBA, Y444, VUYA }\n width: 145, 4096 \n height: 49, 4096 \n framerate: 0/1, 2147483647/1 \n interlace-mode: { (string)progressive }\n\nvideo/x-raw(memory:GLMemory):\n format: { NV12, YV12, I420, BGRA, RGBA, Y444, VUYA }\n width: 145, 4096 \n height: 49, 4096 \n framerate: 0/1, 2147483647/1 \n interlace-mode: { (string)progressive }\n\nvideo/x-raw(memory:CUDAMemory):\n format: { NV12, YV12, I420, BGRA, RGBA, Y444, VUYA }\n width: 145, 4096 \n height: 49, 4096 \n framerate: 0/1, 2147483647/1 \n interlace-mode: { (string)progressive }\n", @@ -215046,10 +219961,9 @@ }, "nvh264sldec": { "author": "Seungha Yang <seungha@centricular.com>", - "description": "Nvidia H.264 video decoder", + "description": "NVIDIA H.264 video decoder", "hierarchy": - "GstNvH264StatelessDec", - "GstNvH264Dec", + "GstNvH264SLDec", "GstH264Decoder", "GstVideoDecoder", "GstElement", @@ -215058,7 +219972,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "NVDEC H.264 Stateless Decoder", "pad-templates": { "sink": { "caps": "video/x-h264:\n stream-format: { (string)avc, (string)avc3, (string)byte-stream }\n alignment: au\n profile: { (string)high, (string)main, (string)constrained-high, (string)constrained-baseline, (string)baseline }\n framerate: 0/1, 2147483647/1 \n width: 48, 4096 \n height: 16, 4096 \n", @@ -215071,6 +219984,22 @@ "presence": "always" } }, + "properties": { + "cuda-device-id": { + "blurb": "Assigned CUDA device id", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": false + } + }, "rank": "secondary" }, "nvh265dec": { @@ -215086,7 +220015,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "NVDEC h265 Video Decoder", "pad-templates": { "sink": { "caps": "video/x-h265:\n stream-format: byte-stream\n alignment: au\n profile: { (string)main, (string)main-10, (string)main-12, (string)main-444, (string)main-444-10, (string)main-444-12 }\n width: 144, 8192 \n height: 144, 8192 \n", @@ -215118,7 +220046,6 @@ "GstPreset" , "klass": "Codec/Encoder/Video/Hardware", - "long-name": "NVENC HEVC Video Encoder", "pad-templates": { "sink": { "caps": "video/x-raw:\n format: { NV12, P010_10LE, P016_LE, Y444, Y444_16LE, Y444_16LE }\n width: 144, 8192 \n height: 144, 8192 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:GLMemory):\n format: { NV12, P010_10LE, P016_LE, Y444, Y444_16LE, Y444_16LE }\n width: 144, 8192 \n height: 144, 8192 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:CUDAMemory):\n format: { NV12, P010_10LE, P016_LE, Y444, Y444_16LE, Y444_16LE }\n width: 144, 8192 \n height: 144, 8192 \n framerate: 0/1, 2147483647/1 \n", @@ -215227,10 +220154,9 @@ }, "nvh265sldec": { "author": "Seungha Yang <seungha@centricular.com>", - "description": "Nvidia H.265 video decoder", + "description": "NVIDIA H.265 video decoder", "hierarchy": - "GstNvH265StatelessDec", - "GstNvH265Dec", + "GstNvH265SLDec", "GstH265Decoder", "GstVideoDecoder", "GstElement", @@ -215239,7 +220165,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "NVDEC H.265 Stateless Decoder", "pad-templates": { "sink": { "caps": "video/x-h265:\n stream-format: { (string)hev1, (string)hvc1, (string)byte-stream }\n alignment: au\n profile: { (string)main, (string)main-10, (string)main-12, (string)main-444, (string)main-444-10, (string)main-444-12 }\n width: 144, 8192 \n height: 144, 8192 \n", @@ -215252,6 +220177,22 @@ "presence": "always" } }, + "properties": { + "cuda-device-id": { + "blurb": "Assigned CUDA device id", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": false + } + }, "rank": "secondary" }, "nvjpegdec": { @@ -215267,7 +220208,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "NVDEC jpeg Video Decoder", "pad-templates": { "sink": { "caps": "image/jpeg:\n width: 64, 32768 \n height: 64, 16384 \n", @@ -215295,7 +220235,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "NVDEC mpeg2video Video Decoder", "pad-templates": { "sink": { "caps": "video/mpeg:\n mpegversion: 2\n systemstream: false\n width: 48, 4080 \n height: 16, 4080 \n", @@ -215323,7 +220262,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "NVDEC mpeg4video Video Decoder", "pad-templates": { "sink": { "caps": "video/mpeg:\n mpegversion: 4\n systemstream: false\n width: 48, 2032 \n height: 16, 2032 \n", @@ -215351,7 +220289,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "NVDEC mpegvideo Video Decoder", "pad-templates": { "sink": { "caps": "video/mpeg:\n mpegversion: 1\n systemstream: false\n width: 48, 4080 \n height: 16, 4080 \n", @@ -215379,7 +220316,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "NVDEC vp8 Video Decoder", "pad-templates": { "sink": { "caps": "video/x-vp8:\n width: 48, 4096 \n height: 16, 4096 \n", @@ -215398,8 +220334,7 @@ "author": "Seungha Yang <seungha@centricular.com>", "description": "NVIDIA VP8 video decoder", "hierarchy": - "GstNvVP8StatelessDec", - "GstNvVp8Dec", + "GstNvVp8SLDec", "GstVp8Decoder", "GstVideoDecoder", "GstElement", @@ -215408,7 +220343,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "NVDEC VP8 Stateless Decoder", "pad-templates": { "sink": { "caps": "video/x-vp8:\n width: 48, 4096 \n height: 16, 4096 \n", @@ -215421,6 +220355,22 @@ "presence": "always" } }, + "properties": { + "cuda-device-id": { + "blurb": "Assigned CUDA device id", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": false + } + }, "rank": "secondary" }, "nvvp9dec": { @@ -215436,7 +220386,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "NVDEC vp9 Video Decoder", "pad-templates": { "sink": { "caps": "video/x-vp9:\n width: 128, 8192 \n height: 128, 8192 \n profile: { (string)0, (string)2 }\n", @@ -215455,8 +220404,7 @@ "author": "Seungha Yang <seungha@centricular.com>", "description": "NVIDIA VP9 video decoder", "hierarchy": - "GstNvVP9StatelessDec", - "GstNvVp9Dec", + "GstNvVp9SLDec", "GstVp9Decoder", "GstVideoDecoder", "GstElement", @@ -215465,7 +220413,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "NVDEC VP9 Stateless Decoder", "pad-templates": { "sink": { "caps": "video/x-vp9:\n width: 128, 8192 \n height: 128, 8192 \n profile: { (string)0, (string)2 }\n alignment: frame\n", @@ -215478,15 +220425,31 @@ "presence": "always" } }, + "properties": { + "cuda-device-id": { + "blurb": "Assigned CUDA device id", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": false + } + }, "rank": "secondary" } }, "filename": "gstnvcodec", "license": "LGPL", "other-types": { - "GstCudaBaseFilter": { + "GstCudaBaseConvert": { "hierarchy": - "GstCudaBaseFilter", + "GstCudaBaseConvert", "GstCudaBaseTransform", "GstBaseTransform", "GstElement", @@ -215523,6 +220486,18 @@ } } }, + "GstCudaMemoryCopy": { + "hierarchy": + "GstCudaMemoryCopy", + "GstCudaBaseTransform", + "GstBaseTransform", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "kind": "object" + }, "GstNvBaseEnc": { "hierarchy": "GstNvBaseEnc", @@ -215886,6 +220861,20 @@ , "kind": "object", "properties": { + "cuda-device-id": { + "blurb": "Assigned CUDA device id", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": false + }, "max-display-delay": { "blurb": "Improves pipelining of decode with display, 0 means no delay (auto = -1)", "conditionally-available": false, @@ -215932,30 +220921,100 @@ , "kind": "object" }, - "GstNvH264Dec": { + "GstNvEncoder": { "hierarchy": - "GstNvH264Dec", - "GstH264Decoder", - "GstVideoDecoder", + "GstNvEncoder", + "GstVideoEncoder", "GstElement", "GstObject", "GInitiallyUnowned", "GObject" , - "kind": "object" - }, - "GstNvH265Dec": { - "hierarchy": - "GstNvH265Dec", - "GstH265Decoder", - "GstVideoDecoder", - "GstElement", - "GstObject", - "GInitiallyUnowned", - "GObject" + "interfaces": + "GstPreset" , "kind": "object" }, + "GstNvEncoderPreset": { + "kind": "enum", + "values": + { + "desc": "Default", + "name": "default", + "value": "0" + }, + { + "desc": "High Performance", + "name": "hp", + "value": "1" + }, + { + "desc": "High Quality", + "name": "hq", + "value": "2" + }, + { + "desc": "Low Latency", + "name": "low-latency", + "value": "3" + }, + { + "desc": "Low Latency, High Quality", + "name": "low-latency-hq", + "value": "4" + }, + { + "desc": "Low Latency, High Performance", + "name": "low-latency-hp", + "value": "5" + }, + { + "desc": "Lossless", + "name": "lossless", + "value": "6" + }, + { + "desc": "Lossless, High Performance", + "name": "lossless-hp", + "value": "7" + } + + }, + "GstNvEncoderRCMode": { + "kind": "enum", + "values": + { + "desc": "Constant Quantization", + "name": "cqp", + "value": "0" + }, + { + "desc": "Variable Bit Rate", + "name": "vbr", + "value": "1" + }, + { + "desc": "Constant Bit Rate", + "name": "cbr", + "value": "2" + }, + { + "desc": "Low-Delay CBR, High Quality", + "name": "cbr-ld-hq", + "value": "3" + }, + { + "desc": "CBR, High Quality (slower)", + "name": "cbr-hq", + "value": "4" + }, + { + "desc": "VBR, High Quality (slower)", + "name": "vbr-hq", + "value": "5" + } + + }, "GstNvPreset": { "kind": "enum", "values": @@ -216045,30 +221104,6 @@ "value": "7" } - }, - "GstNvVp8Dec": { - "hierarchy": - "GstNvVp8Dec", - "GstVp8Decoder", - "GstVideoDecoder", - "GstElement", - "GstObject", - "GInitiallyUnowned", - "GObject" - , - "kind": "object" - }, - "GstNvVp9Dec": { - "hierarchy": - "GstNvVp9Dec", - "GstVp9Decoder", - "GstVideoDecoder", - "GstElement", - "GstObject", - "GInitiallyUnowned", - "GObject" - , - "kind": "object" } }, "package": "GStreamer Bad Plug-ins", @@ -220336,6 +225371,1424 @@ "tracers": {}, "url": "Unknown package origin" }, + "qsv": { + "description": "Intel Quick Sync Video plugin", + "elements": { + "qsvav1enc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Intel Quick Sync Video AV1 Encoder", + "hierarchy": + "GstQsvAV1Enc", + "GstQsvEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE }\n width: 16, 8192 \n height: 16, 8192 \n\nvideo/x-raw(memory:VAMemory):\n format: { NV12, P010_10LE }\n width: 16, 8192 \n height: 16, 8192 \nvideo/x-raw:\n format: { NV12, P010_10LE }\n width: 16, 8192 \n height: 16, 8192 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-av1:\n width: 16, 8192 \n height: 16, 8192 \n alignment: tu\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "bitrate": { + "blurb": "Target bitrate in kbit/sec, Ignored when selected rate-control mode is constant QP variants (i.e., \"cqp\" and \"icq\")", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "2000", + "max": "65535", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "gop-size": { + "blurb": "Number of pictures within a GOP (0: unspecified)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "max-bitrate": { + "blurb": "Maximum bitrate in kbit/sec, Ignored when selected rate-control mode is constant QP variants (i.e., \"cqp\" and \"icq\")", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "65535", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-i": { + "blurb": "Constant quantizer for I frames (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "255", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-p": { + "blurb": "Constant quantizer for P frames (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "255", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "rate-control": { + "blurb": "Rate Control Method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "vbr (2)", + "mutable": "null", + "readable": true, + "type": "GstQsvAV1EncRateControl", + "writable": true + }, + "ref-frames": { + "blurb": "Number of reference frames (0: unspecified)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "1", + "max": "3", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + } + }, + "rank": "primary" + }, + "qsvh264dec": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Intel Quick Sync Video H.264 Decoder", + "hierarchy": + "GstQsvH264Dec", + "GstQsvDecoder", + "GstVideoDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-h264:\n width: 1, 4096 \n height: 1, 4096 \n stream-format: { (string)byte-stream, (string)avc, (string)avc3 }\n alignment: au\n profile: { (string)high, (string)progressive-high, (string)constrained-high, (string)main, (string)constrained-baseline, (string)baseline }\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: NV12\n width: 1, 4096 \n height: 1, 4096 \nvideo/x-raw:\n format: NV12\n width: 1, 4096 \n height: 1, 4096 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "qsvh264enc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Intel Quick Sync Video H.264 Encoder", + "hierarchy": + "GstQsvH264Enc", + "GstQsvEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: NV12\n width: 16, 8192 \n height: 16, 8192 \n\nvideo/x-raw(memory:VAMemory):\n format: NV12\n width: 16, 8192 \n height: 16, 8192 \nvideo/x-raw:\n format: NV12\n width: 16, 8192 \n height: 16, 8192 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-h264:\n width: 16, 8192 \n height: 16, 8192 \n stream-format: { (string)avc, (string)byte-stream }\n alignment: au\n profile: { (string)high, (string)main, (string)constrained-baseline, (string)progressive-high, (string)constrained-high, (string)baseline }\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "avbr-accuracy": { + "blurb": "AVBR Accuracy in the unit of tenth of percent", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "65535", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "avbr-convergence": { + "blurb": "AVBR Convergence in the unit of 100 frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "65535", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "b-frames": { + "blurb": "Number of B frames between I and P frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "65535", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "bitrate": { + "blurb": "Target bitrate in kbit/sec, Ignored when selected rate-control mode is constant QP variants (i.e., \"cqp\", \"icq\", and \"la_icq\")", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "2000", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "cabac": { + "blurb": "Enables CABAC entropy coding", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "unknown (0)", + "mutable": "null", + "readable": true, + "type": "GstQsvCodingOption", + "writable": true + }, + "cc-insert": { + "blurb": "Closed Caption Insert mode. Only CEA-708 RAW format is supported for now", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "insert (0)", + "mutable": "null", + "readable": true, + "type": "GstQsvH264EncSeiInsertMode", + "writable": true + }, + "disable-hrd-conformance": { + "blurb": "Allow NAL HRD non-conformant stream", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "gop-size": { + "blurb": "Number of pictures within a GOP (0: unspecified)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "30", + "max": "65535", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "icq-quality": { + "blurb": "Intelligent Constant Quality for \"icq\" rate-control (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "idr-interval": { + "blurb": "IDR-frame interval in terms of I-frames. 0: every I-frame is an IDR frame, N: \"N\" I-frames are inserted between IDR-frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "65535", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "max-bitrate": { + "blurb": "Maximum bitrate in kbit/sec, Ignored when selected rate-control mode is constant QP variants (i.e., \"cqp\", \"icq\", and \"la_icq\")", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp-b": { + "blurb": "Maximum allowed QP value for B-frame types (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp-i": { + "blurb": "Maximum allowed QP value for I-frame types (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp-p": { + "blurb": "Maximum allowed QP value for P-frame types (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "min-qp-b": { + "blurb": "Minimum allowed QP value for B-frame types (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "min-qp-i": { + "blurb": "Minimum allowed QP value for I-frame types (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "min-qp-p": { + "blurb": "Minimum allowed QP value for P-frame types (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-b": { + "blurb": "Constant quantizer for B frames (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-i": { + "blurb": "Constant quantizer for I frames (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-p": { + "blurb": "Constant quantizer for P frames (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qvbr-quality": { + "blurb": "Quality level used for \"qvbr\" rate-control mode (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "rate-control": { + "blurb": "Rate Control Method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "vbr (2)", + "mutable": "null", + "readable": true, + "type": "GstQsvH264EncRateControl", + "writable": true + }, + "rc-lookahead": { + "blurb": "Number of frames to look ahead for Rate Control, used for \"la_vbr\", \"la_icq\", and \"la_hrd\" rate-control modes", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "10", + "max": "100", + "min": "10", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "rc-lookahead-ds": { + "blurb": "Downsampling method in look-ahead rate control", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "unknown (0)", + "mutable": "null", + "readable": true, + "type": "GstQsvH264EncRCLookAheadDS", + "writable": true + }, + "ref-frames": { + "blurb": "Number of reference frames (0: unspecified)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "2", + "max": "16", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + } + }, + "rank": "primary" + }, + "qsvh265dec": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Intel Quick Sync Video H.265 Decoder", + "hierarchy": + "GstQsvH265Dec", + "GstQsvDecoder", + "GstVideoDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-h265:\n width: 1, 16384 \n height: 1, 16384 \n stream-format: { (string)byte-stream, (string)hev1, (string)hvc1 }\n alignment: au\n profile: { (string)main, (string)main-10 }\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: NV12\n width: 1, 16384 \n height: 1, 16384 \nvideo/x-raw:\n format: NV12\n width: 1, 16384 \n height: 1, 16384 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "qsvh265enc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Intel Quick Sync Video H.265 Encoder", + "hierarchy": + "GstQsvH265Enc", + "GstQsvEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE }\n width: 16, 8192 \n height: 16, 8192 \n\nvideo/x-raw(memory:VAMemory):\n format: { NV12, P010_10LE }\n width: 16, 8192 \n height: 16, 8192 \nvideo/x-raw:\n format: { NV12, P010_10LE }\n width: 16, 8192 \n height: 16, 8192 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-h265:\n width: 16, 8192 \n height: 16, 8192 \n stream-format: byte-stream\n alignment: au\n profile: { (string)main, (string)main-10 }\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "b-frames": { + "blurb": "Number of B frames between I and P frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "65535", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "bitrate": { + "blurb": "Target bitrate in kbit/sec, Ignored when selected rate-control mode is constant QP variants (i.e., \"cqp\" and \"icq\")", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "2000", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "cc-insert": { + "blurb": "Closed Caption Insert mode. Only CEA-708 RAW format is supported for now", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "insert (0)", + "mutable": "null", + "readable": true, + "type": "GstQsvH265EncSeiInsertMode", + "writable": true + }, + "disable-hrd-conformance": { + "blurb": "Allow NAL HRD non-conformant stream", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "gop-size": { + "blurb": "Number of pictures within a GOP (0: unspecified)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "30", + "max": "65535", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "icq-quality": { + "blurb": "Intelligent Constant Quality for \"icq\" rate-control (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "idr-interval": { + "blurb": "IDR-frame interval in terms of I-frames. 0: only first I-frame is is an IDR frame, 1: every I-frame is an IDR frame, N: \"N - 1\" I-frames are inserted between IDR-frames", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "1", + "max": "65535", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "max-bitrate": { + "blurb": "Maximum bitrate in kbit/sec, Ignored when selected rate-control mode is constant QP variants (i.e., \"cqp\" and \"icq\")", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp-b": { + "blurb": "Maximum allowed QP value for B-frame types (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp-i": { + "blurb": "Maximum allowed QP value for I-frame types (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp-p": { + "blurb": "Maximum allowed QP value for P-frame types (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "min-qp-b": { + "blurb": "Minimum allowed QP value for B-frame types (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "min-qp-i": { + "blurb": "Minimum allowed QP value for I-frame types (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "min-qp-p": { + "blurb": "Minimum allowed QP value for P-frame types (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-b": { + "blurb": "Constant quantizer for B frames (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-i": { + "blurb": "Constant quantizer for I frames (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-p": { + "blurb": "Constant quantizer for P frames (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qvbr-quality": { + "blurb": "Quality level used for \"qvbr\" rate-control mode (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "rate-control": { + "blurb": "Rate Control Method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "vbr (2)", + "mutable": "null", + "readable": true, + "type": "GstQsvH265EncRateControl", + "writable": true + }, + "ref-frames": { + "blurb": "Number of reference frames (0: unspecified)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "2", + "max": "16", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + } + }, + "rank": "primary" + }, + "qsvjpegdec": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Intel Quick Sync Video JPEG Decoder", + "hierarchy": + "GstQsvJpegDec", + "GstQsvDecoder", + "GstVideoDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "image/jpeg:\n width: 1, 16384 \n height: 1, 16384 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, YUY2, BGRA }\n width: 1, 16384 \n height: 1, 16384 \nvideo/x-raw:\n format: { NV12, YUY2, BGRA }\n width: 1, 16384 \n height: 1, 16384 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "secondary" + }, + "qsvjpegenc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Intel Quick Sync Video JPEG Encoder", + "hierarchy": + "GstQsvJpegEnc", + "GstQsvEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, YUY2, BGRA }\n width: 16, 16384 \n height: 16, 16384 \n\nvideo/x-raw(memory:VAMemory):\n format: { NV12, YUY2, BGRA }\n width: 16, 16384 \n height: 16, 16384 \nvideo/x-raw:\n format: { NV12, YUY2, BGRA }\n width: 16, 16384 \n height: 16, 16384 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "image/jpeg:\n width: 16, 16384 \n height: 16, 16384 \n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "quality": { + "blurb": "Encoding quality, 100 for best quality", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "85", + "max": "100", + "min": "1", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + } + }, + "rank": "primary" + }, + "qsvvp9dec": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Intel Quick Sync Video VP9 Decoder", + "hierarchy": + "GstQsvVP9Dec", + "GstQsvDecoder", + "GstVideoDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-vp9:\n width: 1, 16384 \n height: 1, 16384 \n alignment: frame\n profile: { (string)0, (string)2 }\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE, P016_LE }\n width: 1, 16384 \n height: 1, 16384 \nvideo/x-raw:\n format: { NV12, P010_10LE, P016_LE }\n width: 1, 16384 \n height: 1, 16384 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "marginal" + }, + "qsvvp9enc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Intel Quick Sync Video VP9 Encoder", + "hierarchy": + "GstQsvVP9Enc", + "GstQsvEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:D3D11Memory):\n format: { NV12, P010_10LE, VUYA, Y410 }\n width: 16, 8192 \n height: 16, 8192 \n\nvideo/x-raw(memory:VAMemory):\n format: { NV12, P010_10LE, VUYA, Y410 }\n width: 16, 8192 \n height: 16, 8192 \nvideo/x-raw:\n format: { NV12, P010_10LE, VUYA, Y410 }\n width: 16, 8192 \n height: 16, 8192 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-vp9:\n width: 16, 8192 \n height: 16, 8192 \n profile: { (string)0, (string)2, (string)1, (string)3 }\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "bitrate": { + "blurb": "Target bitrate in kbit/sec, Ignored when selected rate-control mode is constant QP variants (i.e., \"cqp\" and \"icq\")", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "2000", + "max": "65535", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "gop-size": { + "blurb": "Number of pictures within a GOP (0: unspecified)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "icq-quality": { + "blurb": "Intelligent Constant Quality for \"icq\" rate-control (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "255", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "max-bitrate": { + "blurb": "Maximum bitrate in kbit/sec, Ignored when selected rate-control mode is constant QP variants (i.e., \"cqp\" and \"icq\")", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "65535", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-i": { + "blurb": "Constant quantizer for I frames (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "255", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qp-p": { + "blurb": "Constant quantizer for P frames (0: default)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "255", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "rate-control": { + "blurb": "Rate Control Method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "vbr (2)", + "mutable": "null", + "readable": true, + "type": "GstQsvVP9EncRateControl", + "writable": true + }, + "ref-frames": { + "blurb": "Number of reference frames (0: unspecified)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "1", + "max": "3", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + } + }, + "rank": "primary" + } + }, + "filename": "gstqsv", + "license": "LGPL", + "other-types": { + "GstQsvAV1EncRateControl": { + "kind": "enum", + "values": + { + "desc": "Constant Bitrate", + "name": "cbr", + "value": "1" + }, + { + "desc": "Variable Bitrate", + "name": "vbr", + "value": "2" + }, + { + "desc": "Constant Quantizer", + "name": "cqp", + "value": "3" + } + + }, + "GstQsvCodingOption": { + "kind": "enum", + "values": + { + "desc": "Unknown", + "name": "unknown", + "value": "0" + }, + { + "desc": "On", + "name": "on", + "value": "16" + }, + { + "desc": "Off", + "name": "off", + "value": "32" + } + + }, + "GstQsvDecoder": { + "hierarchy": + "GstQsvDecoder", + "GstVideoDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "kind": "object", + "properties": { + "adapter-luid": { + "blurb": "DXGI Adapter LUID (Locally Unique Identifier) of created device", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "9223372036854775807", + "min": "-9223372036854775808", + "mutable": "null", + "readable": true, + "type": "gint64", + "writable": false + } + } + }, + "GstQsvEncoder": { + "hierarchy": + "GstQsvEncoder", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "kind": "object", + "properties": { + "adapter-luid": { + "blurb": "DXGI Adapter LUID (Locally Unique Identifier) of created device", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "9223372036854775807", + "min": "-9223372036854775808", + "mutable": "null", + "readable": true, + "type": "gint64", + "writable": false + }, + "low-latency": { + "blurb": "Enables low-latency encoding", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "target-usage": { + "blurb": "1: Best quality, 4: Balanced, 7: Best speed", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "4", + "max": "7", + "min": "1", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + } + } + }, + "GstQsvH264EncRCLookAheadDS": { + "kind": "enum", + "values": + { + "desc": "Unknown", + "name": "unknown", + "value": "0" + }, + { + "desc": "Do not use down sampling", + "name": "off", + "value": "1" + }, + { + "desc": "Down sample frames two times before estimation", + "name": "2x", + "value": "2" + }, + { + "desc": "Down sample frames four times before estimation", + "name": "4x", + "value": "3" + } + + }, + "GstQsvH264EncRateControl": { + "kind": "enum", + "values": + { + "desc": "Constant Bitrate", + "name": "cbr", + "value": "1" + }, + { + "desc": "Variable Bitrate", + "name": "vbr", + "value": "2" + }, + { + "desc": "Constant Quantizer", + "name": "cqp", + "value": "3" + }, + { + "desc": "Average Variable Bitrate", + "name": "avbr", + "value": "4" + }, + { + "desc": "VBR with look ahead (Non HRD compliant)", + "name": "la-vbr", + "value": "8" + }, + { + "desc": "Intelligent CQP", + "name": "icq", + "value": "9" + }, + { + "desc": "Video Conferencing Mode (Non HRD compliant)", + "name": "vcm", + "value": "10" + }, + { + "desc": "Intelligent CQP with LA (Non HRD compliant)", + "name": "la-icq", + "value": "11" + }, + { + "desc": "HRD compliant LA", + "name": "la-hrd", + "value": "13" + }, + { + "desc": "VBR with CQP", + "name": "qvbr", + "value": "14" + } + + }, + "GstQsvH264EncSeiInsertMode": { + "kind": "enum", + "values": + { + "desc": "Insert SEI", + "name": "insert", + "value": "0" + }, + { + "desc": "Insert SEI and remove corresponding meta from output buffer", + "name": "insert-and-drop", + "value": "1" + }, + { + "desc": "Disable SEI insertion", + "name": "disabled", + "value": "2" + } + + }, + "GstQsvH265EncRateControl": { + "kind": "enum", + "values": + { + "desc": "Constant Bitrate", + "name": "cbr", + "value": "1" + }, + { + "desc": "Variable Bitrate", + "name": "vbr", + "value": "2" + }, + { + "desc": "Constant Quantizer", + "name": "cqp", + "value": "3" + }, + { + "desc": "Intelligent CQP", + "name": "icq", + "value": "9" + }, + { + "desc": "Video Conferencing Mode (Non HRD compliant)", + "name": "vcm", + "value": "10" + }, + { + "desc": "VBR with CQP", + "name": "qvbr", + "value": "14" + } + + }, + "GstQsvH265EncSeiInsertMode": { + "kind": "enum", + "values": + { + "desc": "Insert SEI", + "name": "insert", + "value": "0" + }, + { + "desc": "Insert SEI and remove corresponding meta from output buffer", + "name": "insert-and-drop", + "value": "1" + }, + { + "desc": "Disable SEI insertion", + "name": "disabled", + "value": "2" + } + + }, + "GstQsvVP9EncRateControl": { + "kind": "enum", + "values": + { + "desc": "Constant Bitrate", + "name": "cbr", + "value": "1" + }, + { + "desc": "Variable Bitrate", + "name": "vbr", + "value": "2" + }, + { + "desc": "Constant Quantizer", + "name": "cqp", + "value": "3" + }, + { + "desc": "Intelligent CQP", + "name": "icq", + "value": "9" + } + + } + }, + "package": "GStreamer Bad Plug-ins", + "source": "gst-plugins-bad", + "tracers": {}, + "url": "Unknown package origin" + }, "removesilence": { "description": "Removes silence from an audio stream", "elements": { @@ -220501,7 +226954,7 @@ "presence": "sometimes" }, "video": { - "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "sometimes" } @@ -220547,6 +227000,9 @@ "GInitiallyUnowned", "GObject" , + "interfaces": + "GstURIHandler" + , "klass": "Source/Video", "long-name": "Rfb source", "pad-templates": { @@ -220661,6 +227117,18 @@ "type": "gboolean", "writable": true }, + "uri": { + "blurb": "URI in the form of rfb://host:port?query", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "rfb://127.0.0.1:5900", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": true + }, "use-copyrect": { "blurb": "Use copyrect encoding", "conditionally-available": false, @@ -222573,6 +229041,18 @@ "readable": true, "type": "gboolean", "writable": true + }, + "use-reference-timestamps": { + "blurb": "Whether the element should use reference UTC timestamps from the buffers instead of using the ntp-offset mechanism.", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "ready", + "readable": true, + "type": "gboolean", + "writable": true } }, "rank": "none" @@ -224626,7 +231106,7 @@ "construct": false, "construct-only": false, "controllable": false, - "default": "application/x-srtp-decoder-stats, streams=(int)< >;", + "default": "application/x-srtp-decoder-stats, streams=(int)< >, recv-count=(uint)0, recv-drop-count=(uint)0;", "mutable": "null", "readable": true, "type": "GstStructure", @@ -226240,7 +232720,7 @@ "long-name": "TTML subtitle renderer", "pad-templates": { "src": { - "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" }, @@ -226250,7 +232730,7 @@ "presence": "always" }, "video_sink": { - "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "sink", "presence": "always" } @@ -226364,12 +232844,12 @@ "presence": "always" }, "vfsrc": { - "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nimage/jpeg:\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nimage/jpeg:\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", "direction": "src", "presence": "always" }, "vidsrc": { - "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_64Z32, NV12_4L4, NV12_32L32, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nimage/jpeg:\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nvideo/x-h264:\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n stream-format: { (string)byte-stream, (string)avc }\n alignment: au\n profile: { (string)high, (string)main, (string)baseline, (string)constrained-baseline }\n", + "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nimage/jpeg:\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nvideo/x-h264:\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n stream-format: { (string)byte-stream, (string)avc }\n alignment: au\n profile: { (string)high, (string)main, (string)baseline, (string)constrained-baseline }\n", "direction": "src", "presence": "always" } @@ -226981,7 +233461,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "VA-API AV1 Decoder", "pad-templates": { "sink": { "caps": "video/x-av1:\n", @@ -226994,6 +233473,78 @@ "presence": "always" } }, + "properties": { + "device-path": { + "blurb": "DRM device path", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": false + } + }, + "rank": "none" + }, + "vacompositor": { + "author": "U. Artie Eoff <ullysses.a.eoff@intel.com>", + "description": "VA-API based video compositor", + "hierarchy": + "GstVaCompositor", + "GstVideoAggregator", + "GstAggregator", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstChildProxy" + , + "klass": "Filter/Editor/Video/Compositor/Hardware", + "pad-templates": { + "sink_%%u": { + "caps": "video/x-raw(memory:VAMemory):\n format: { NV12, I420, YV12, YUY2, RGBA, BGRA, P010_10LE, ARGB, ABGR }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { VUYA, GRAY8, NV12, NV21, YUY2, UYVY, YV12, I420, P010_10LE, RGBA, BGRA, ARGB, ABGR }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "request", + "type": "GstVaCompositorPad" + }, + "src": { + "caps": "video/x-raw(memory:VAMemory):\n format: { NV12, I420, YV12, YUY2, RGBA, BGRA, P010_10LE, ARGB, ABGR }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { VUYA, GRAY8, NV12, NV21, YUY2, UYVY, YV12, I420, P010_10LE, RGBA, BGRA, ARGB, ABGR }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always", + "type": "GstAggregatorPad" + } + }, + "properties": { + "device-path": { + "blurb": "DRM device path", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": false + }, + "scale-method": { + "blurb": "Scale method to use", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "default (0)", + "mutable": "null", + "readable": true, + "type": "GstVaScaleMethod", + "writable": true + } + }, "rank": "none" }, "vadeinterlace": { @@ -227009,7 +233560,6 @@ "GObject" , "klass": "Filter/Effect/Video/Deinterlace", - "long-name": "VA-API Deinterlacer", "pad-templates": { "sink": { "caps": "video/x-raw(memory:VAMemory):\n format: { NV12, I420, YV12, YUY2, RGBA, BGRA, P010_10LE, ARGB, ABGR }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { VUYA, GRAY8, NV12, NV21, YUY2, UYVY, YV12, I420, P010_10LE, RGBA, BGRA, ARGB, ABGR }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", @@ -227051,7 +233601,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "VA-API H.264 Decoder", "pad-templates": { "sink": { "caps": "video/x-h264:\n", @@ -227064,6 +233613,332 @@ "presence": "always" } }, + "properties": { + "device-path": { + "blurb": "DRM device path", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": false + } + }, + "rank": "none" + }, + "vah264enc": { + "author": "He Junyan <junyan.he@intel.com>", + "description": "VA-API based H.264 video encoder", + "hierarchy": + "GstVaH264Enc", + "GstVaBaseEnc", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "klass": "Codec/Encoder/Video/Hardware", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:VAMemory):\n format: { NV12 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { NV12 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-h264:\n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "aud": { + "blurb": "Insert AU (Access Unit) delimeter for each frame", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "b-frames": { + "blurb": "Number of B frames between I and P reference frames", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "31", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "b-pyramid": { + "blurb": "Enable the b-pyramid reference structure in the GOP", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "bitrate": { + "blurb": "The desired bitrate expressed in kbps (0: auto-calculate)", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "cabac": { + "blurb": "Enable CABAC entropy coding mode", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "cc-insert": { + "blurb": "Insert CEA-708 Closed Captions", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "cpb-size": { + "blurb": "The desired max CPB size in Kb (0: auto-calculate)", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "2048000", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "dct8x8": { + "blurb": "Enable adaptive use of 8x8 transforms in I-frames", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "true", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + }, + "i-frames": { + "blurb": "Force the number of I frames insertion within one GOP, not including the first IDR frame", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "1023", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "key-int-max": { + "blurb": "The maximal distance between two keyframes. It decides the size of GOP (0: auto-calculate)", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "1024", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "max-qp": { + "blurb": "Maximum quantizer value for each frame", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "51", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "mbbrc": { + "blurb": "Macroblock level Bitrate Control. It is not compatible with CQP", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "disabled (0)", + "mutable": "null", + "readable": true, + "type": "GstVaFeature", + "writable": true + }, + "min-qp": { + "blurb": "Minimum quantizer value for each frame", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "1", + "max": "51", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "num-slices": { + "blurb": "Number of slices per frame", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "1", + "max": "200", + "min": "1", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "qpb": { + "blurb": "The quantizer value for B frame. This is available only in CQP mode", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "26", + "max": "51", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "qpi": { + "blurb": "The quantizer value for I frame. In CQP mode, it specifies the QP of I frame, in other mode, it specifies the init QP of all frames", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "26", + "max": "51", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "qpp": { + "blurb": "The quantizer value for P frame. This is available only in CQP mode", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "26", + "max": "51", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "ref-frames": { + "blurb": "Number of reference frames, including both the forward and the backward", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "3", + "max": "16", + "min": "0", + "mutable": "null", + "readable": true, + "type": "guint", + "writable": true + }, + "target-percentage": { + "blurb": "The percentage for 'target bitrate'/'maximum bitrate' (Only in VBR)", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "66", + "max": "100", + "min": "50", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "target-usage": { + "blurb": "The target usage to control and balance the encoding speed/quality", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "4", + "max": "7", + "min": "1", + "mutable": "playing", + "readable": true, + "type": "guint", + "writable": true + }, + "trellis": { + "blurb": "Enable the trellis quantization method", + "conditionally-available": false, + "construct": true, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "null", + "readable": true, + "type": "gboolean", + "writable": true + } + }, "rank": "none" }, "vah265dec": { @@ -227079,7 +233954,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "VA-API H.265 Decoder", "pad-templates": { "sink": { "caps": "video/x-h265:\n", @@ -227092,13 +233966,68 @@ "presence": "always" } }, + "properties": { + "device-path": { + "blurb": "DRM device path", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": false + } + }, + "rank": "none" + }, + "vajpegdec": { + "author": "Víctor Jáquez <vjaquez@igalia.com>", + "description": "VA-API based JPEG image decoder", + "hierarchy": + "GstVaJpegDec", + "GstJpegDecoder", + "GstVideoDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Image/Hardware", + "pad-templates": { + "sink": { + "caps": "image/jpeg:\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw(memory:VAMemory):\n format: { NV12 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { NV12 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "device-path": { + "blurb": "DRM device path", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": false + } + }, "rank": "none" }, "vampeg2dec": { "author": "He Junyan <junyan.he@intel.com>", "description": "VA-API based Mpeg2 video decoder", "hierarchy": - "GstVaMpeg2dec", + "GstVaMpeg2Dec", "GstMpeg2Decoder", "GstVideoDecoder", "GstElement", @@ -227107,7 +234036,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "VA-API Mpeg2 Decoder", "pad-templates": { "sink": { "caps": "video/x-mpeg2:\n", @@ -227120,6 +234048,20 @@ "presence": "always" } }, + "properties": { + "device-path": { + "blurb": "DRM device path", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": false + } + }, "rank": "none" }, "vapostproc": { @@ -227137,8 +234079,7 @@ "interfaces": "GstColorBalance" , - "klass": "Filter/Converter/Video/Scaler/Hardware", - "long-name": "VA-API Video Postprocessor", + "klass": "Effect/Converter/Filter/Colorspace/Scaler/Video/Hardware", "pad-templates": { "sink": { "caps": "video/x-raw(memory:VAMemory):\n format: { NV12, I420, YV12, YUY2, RGBA, BGRA, P010_10LE, ARGB, ABGR }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \nvideo/x-raw:\n format: { VUYA, GRAY8, NV12, NV21, YUY2, UYVY, YV12, I420, P010_10LE, RGBA, BGRA, ARGB, ABGR }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", @@ -227152,6 +234093,18 @@ } }, "properties": { + "add-borders": { + "blurb": "Add black borders if necessary to keep the display aspect ratio", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "false", + "mutable": "playing", + "readable": true, + "type": "gboolean", + "writable": true + }, "disable-passthrough": { "blurb": "Forces passing buffers through the postprocessor", "conditionally-available": false, @@ -227163,6 +234116,18 @@ "readable": true, "type": "gboolean", "writable": true + }, + "scale-method": { + "blurb": "Scale method to use", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "default (0)", + "mutable": "playing", + "readable": true, + "type": "GstVaScaleMethod", + "writable": true } }, "rank": "none" @@ -227171,7 +234136,7 @@ "author": "He Junyan <junyan.he@intel.com>", "description": "VA-API based VP8 video decoder", "hierarchy": - "GstVaVp8dec", + "GstVaVp8Dec", "GstVp8Decoder", "GstVideoDecoder", "GstElement", @@ -227180,7 +234145,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "VA-API VP8 Decoder", "pad-templates": { "sink": { "caps": "video/x-vp8:\n", @@ -227193,6 +234157,20 @@ "presence": "always" } }, + "properties": { + "device-path": { + "blurb": "DRM device path", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": false + } + }, "rank": "none" }, "vavp9dec": { @@ -227208,7 +234186,6 @@ "GObject" , "klass": "Codec/Decoder/Video/Hardware", - "long-name": "VA-API VP9 Decoder", "pad-templates": { "sink": { "caps": "video/x-vp9:\n", @@ -227221,12 +234198,65 @@ "presence": "always" } }, + "properties": { + "device-path": { + "blurb": "DRM device path", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": false + } + }, "rank": "none" } }, "filename": "gstva", "license": "LGPL", "other-types": { + "GstJpegDecoder": { + "hierarchy": + "GstJpegDecoder", + "GstVideoDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "kind": "object" + }, + "GstVaBaseEnc": { + "hierarchy": + "GstVaBaseEnc", + "GstVideoEncoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "interfaces": + "GstPreset" + , + "kind": "object", + "properties": { + "device-path": { + "blurb": "DRM device path", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": false + } + } + }, "GstVaBaseTransform": { "hierarchy": "GstVaBaseTransform", @@ -227236,7 +234266,105 @@ "GInitiallyUnowned", "GObject" , - "kind": "object" + "kind": "object", + "properties": { + "device-path": { + "blurb": "DRM device path", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": false + } + } + }, + "GstVaCompositorPad": { + "hierarchy": + "GstVaCompositorPad", + "GstVideoAggregatorPad", + "GstAggregatorPad", + "GstPad", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "kind": "object", + "properties": { + "alpha": { + "blurb": "Alpha of the picture", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": true, + "default": "1", + "max": "1", + "min": "0", + "mutable": "null", + "readable": true, + "type": "gdouble", + "writable": true + }, + "height": { + "blurb": "Height of the picture (0, to use the height of the input frame)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": true, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + }, + "width": { + "blurb": "Width of the picture (0, to use the width of the input frame)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": true, + "default": "0", + "max": "2147483647", + "min": "0", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + }, + "xpos": { + "blurb": "X Position of the picture", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": true, + "default": "0", + "max": "2147483647", + "min": "-2147483648", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + }, + "ypos": { + "blurb": "Y Position of the picture", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": true, + "default": "0", + "max": "2147483647", + "min": "-2147483648", + "mutable": "null", + "readable": true, + "type": "gint", + "writable": true + } + } }, "GstVaDeinterlaceMethods": { "kind": "enum", @@ -227257,6 +234385,26 @@ "value": "4" } + }, + "GstVaScaleMethod": { + "kind": "enum", + "values": + { + "desc": "Default scaling method", + "name": "default", + "value": "0" + }, + { + "desc": "Fast scaling method", + "name": "fast", + "value": "256" + }, + { + "desc": "High quality scaling method", + "name": "hq", + "value": "512" + } + } }, "package": "GStreamer Bad Plug-ins", @@ -228535,6 +235683,110 @@ "properties": {}, "rank": "none" }, + "vulkanoverlaycompositor": { + "author": "Matthew Waters <matthew@centricular.com>", + "description": "Vulkan Overlay Composition element", + "hierarchy": + "GstVulkanOverlayCompositor", + "GstVulkanVideoFilter", + "GstBaseTransform", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Filter/Video", + "long-name": "Vulkan Overlay Compositor", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:VulkanImage, meta:GstVideoOverlayComposition):\n format: { BGRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:VulkanImage):\n format: { BGRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { BGRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw(memory:VulkanImage, meta:GstVideoOverlayComposition):\n format: { BGRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(memory:VulkanImage):\n format: { BGRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n\nvideo/x-raw(ANY):\n format: { BGRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "none" + }, + "vulkanshaderspv": { + "author": "Martin Reboredo <yakoyoku@gmail.com>", + "description": "Performs operations with SPIRV shaders in Vulkan", + "hierarchy": + "GstVulkanShaderSpv", + "GstVulkanVideoFilter", + "GstBaseTransform", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Filter/Video", + "long-name": "Vulkan Shader SPV", + "pad-templates": { + "sink": { + "caps": "video/x-raw(memory:VulkanImage):\n format: { BGRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw(memory:VulkanImage):\n format: { BGRA }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "fragment": { + "blurb": "SPIRV fragment binary", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "mutable": "null", + "readable": true, + "type": "GBytes", + "writable": true + }, + "fragment-location": { + "blurb": "SPIRV fragment source", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": true + }, + "vertex": { + "blurb": "SPIRV vertex binary", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "mutable": "null", + "readable": true, + "type": "GBytes", + "writable": true + }, + "vertex-location": { + "blurb": "SPIRV vertex source", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": true + } + }, + "rank": "none" + }, "vulkansink": { "author": "Matthew Waters <matthew@centricular.com>", "description": "A videosink based on Vulkan", @@ -229132,6 +236384,32 @@ "type": "gboolean", "writable": true }, + "loopback-mode": { + "blurb": "Loopback mode to use", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "default (0)", + "mutable": "ready", + "readable": true, + "type": "GstWasapi2SrcLoopbackMode", + "writable": true + }, + "loopback-target-pid": { + "blurb": "Process ID to be recorded or excluded for process loopback mode", + "conditionally-available": true, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0", + "max": "-1", + "min": "0", + "mutable": "ready", + "readable": true, + "type": "guint", + "writable": true + }, "low-latency": { "blurb": "Optimize all settings for lowest latency. Always safe to enable.", "conditionally-available": false, @@ -229176,7 +236454,28 @@ }, "filename": "gstwasapi2", "license": "LGPL", - "other-types": {}, + "other-types": { + "GstWasapi2SrcLoopbackMode": { + "kind": "enum", + "values": + { + "desc": "Default", + "name": "default", + "value": "0" + }, + { + "desc": "Include process and its child processes", + "name": "include-process-tree", + "value": "1" + }, + { + "desc": "Exclude process and its child processes", + "name": "exclude-process-tree", + "value": "2" + } + + } + }, "package": "GStreamer Bad Plug-ins", "source": "gst-plugins-bad", "tracers": {}, @@ -229198,8 +236497,7 @@ "GObject" , "interfaces": - "GstVideoOverlay", - "GstWaylandVideo" + "GstVideoOverlay" , "klass": "Sink/Video", "long-name": "wayland video sink", @@ -229234,6 +236532,29 @@ "readable": true, "type": "gboolean", "writable": true + }, + "render-rectangle": { + "blurb": "The render rectangle ('<x, y, width, height>')", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "mutable": "null", + "readable": false, + "type": "GstValueArray", + "writable": true + }, + "rotate-method": { + "blurb": "rotate method", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "identity (0)", + "mutable": "null", + "readable": true, + "type": "GstVideoOrientationMethod", + "writable": true } }, "rank": "marginal" @@ -229241,15 +236562,7 @@ }, "filename": "gstwaylandsink", "license": "LGPL", - "other-types": { - "GstWaylandVideo": { - "hierarchy": - "GstWaylandVideo", - "GInterface" - , - "kind": "interface" - } - }, + "other-types": {}, "package": "GStreamer Bad Plug-ins", "source": "gst-plugins-bad", "tracers": {}, @@ -229476,12 +236789,13 @@ "caps": "application/x-rtp:\n", "direction": "sink", "presence": "request", - "type": "GstWebRTCBinPad" + "type": "GstWebRTCBinSinkPad" }, "src_%%u": { "caps": "application/x-rtp:\n", "direction": "src", - "presence": "sometimes" + "presence": "sometimes", + "type": "GstWebRTCBinSrcPad" } }, "properties": { @@ -229531,16 +236845,28 @@ "type": "GstWebRTCSessionDescription", "writable": false }, + "http-proxy": { + "blurb": "A HTTP proxy for use with TURN/TCP of the form http://username:password@hostname:port", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "NULL", + "mutable": "null", + "readable": true, + "type": "gchararray", + "writable": true + }, "ice-agent": { "blurb": "The WebRTC ICE agent", "conditionally-available": false, "construct": false, - "construct-only": false, + "construct-only": true, "controllable": false, "mutable": "null", "readable": true, "type": "GstWebRTCICE", - "writable": false + "writable": true }, "ice-connection-state": { "blurb": "The collective connection state of all ICETransport's", @@ -229672,7 +236998,7 @@ "writable": true }, "turn-server": { - "blurb": "The TURN server of the form turn(s)://username:password@host:port. This is a convenience property, use #GstWebRTCBin::add-turn-server if you wish to use multiple TURN servers", + "blurb": "The TURN server of the form turn(s)://username:password@host:port. To use time-limited credentials, the form must be turn(s)://timestamp:username:password@host:port. Please note that the ':' character of the 'timestamp:username' and the 'password' encoded by base64 should be escaped to be parsed properly. This is a convenience property, use #GstWebRTCBin::add-turn-server if you wish to use multiple TURN servers", "conditionally-available": false, "construct": false, "construct-only": false, @@ -229843,6 +237169,30 @@ "return-type": "void", "when": "last" }, + "prepare-data-channel": { + "args": + { + "name": "arg0", + "type": "GstWebRTCDataChannel" + }, + { + "name": "arg1", + "type": "gboolean" + } + , + "return-type": "void", + "when": "last" + }, + "request-aux-sender": { + "args": + { + "name": "arg0", + "type": "GstWebRTCDTLSTransport" + } + , + "return-type": "GstElement", + "when": "last" + }, "set-local-description": { "action": true, "args": @@ -229904,90 +237254,57 @@ } } }, - "GstWebRTCICE": { + "GstWebRTCBinSinkPad": { "hierarchy": - "GstWebRTCICE", + "GstWebRTCBinSinkPad", + "GstWebRTCBinPad", + "GstGhostPad", + "GstProxyPad", + "GstPad", "GstObject", "GInitiallyUnowned", "GObject" , "kind": "object", "properties": { - "agent": { - "blurb": "ICE agent in use by this object. WARNING! Accessing this property may have disastrous consequences for the operation of webrtcbin. Other ICE implementations may not have the same interface.", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "mutable": "null", - "readable": true, - "type": "NiceAgent", - "writable": false - }, - "ice-tcp": { - "blurb": "Whether the agent should use ICE-TCP when gathering candidates", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "true", - "mutable": "null", - "readable": true, - "type": "gboolean", - "writable": true - }, - "ice-udp": { - "blurb": "Whether the agent should use ICE-UDP when gathering candidates", + "msid": { + "blurb": "Local MediaStream ID to use for this pad (NULL = unset)", "conditionally-available": false, "construct": false, "construct-only": false, "controllable": false, - "default": "true", - "mutable": "null", - "readable": true, - "type": "gboolean", - "writable": true - }, - "max-rtp-port": { - "blurb": "Maximum port for local rtp port range. max-rtp-port must be >= min-rtp-port", - "conditionally-available": false, - "construct": true, - "construct-only": false, - "controllable": false, - "default": "65535", - "max": "65535", - "min": "0", + "default": "NULL", "mutable": "null", "readable": true, - "type": "guint", + "type": "gchararray", "writable": true - }, - "min-rtp-port": { - "blurb": "Minimum port for local rtp port range. min-rtp-port must be <= max-rtp-port", + } + } + }, + "GstWebRTCBinSrcPad": { + "hierarchy": + "GstWebRTCBinSrcPad", + "GstWebRTCBinPad", + "GstGhostPad", + "GstProxyPad", + "GstPad", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "kind": "object", + "properties": { + "msid": { + "blurb": "Remote MediaStream ID in use for this pad (NULL = not advertised)", "conditionally-available": false, "construct": false, "construct-only": false, "controllable": false, - "default": "0", - "max": "65535", - "min": "0", + "default": "NULL", "mutable": "null", "readable": true, - "type": "guint", - "writable": true - } - }, - "signals": { - "add-local-ip-address": { - "action": true, - "args": - { - "name": "arg0", - "type": "gchararray" - } - , - "return-type": "gboolean", - "when": "last" + "type": "gchararray", + "writable": false } } } @@ -230378,6 +237695,84 @@ "tracers": {}, "url": "Unknown package origin" }, + "wic": { + "description": "Windows Imaging Component (WIC) plugin", + "elements": { + "wicjpegdec": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Jpeg image decoder using Windows Imaging Component API", + "hierarchy": + "GstWicJpegDec", + "GstWicDecoder", + "GstVideoDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Image", + "pad-templates": { + "sink": { + "caps": "image/jpeg:\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: { BGR, GRAY8, NV12, Y42B, Y444 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "secondary" + }, + "wicpngdec": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Png image decoder using Windows Imaging Component API", + "hierarchy": + "GstWicPngDec", + "GstWicDecoder", + "GstVideoDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Codec/Decoder/Image", + "pad-templates": { + "sink": { + "caps": "image/png:\n", + "direction": "sink", + "presence": "always" + }, + "src": { + "caps": "video/x-raw:\n format: { RGBA64_LE, BGRA, RGBA, BGR, RGB, GRAY8, GRAY16_BE }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "rank": "secondary" + } + }, + "filename": "gstwic", + "license": "LGPL", + "other-types": { + "GstWicDecoder": { + "hierarchy": + "GstWicDecoder", + "GstVideoDecoder", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "kind": "object" + } + }, + "package": "GStreamer Bad Plug-ins", + "source": "gst-plugins-bad", + "tracers": {}, + "url": "Unknown package origin" + }, "wildmidi": { "description": "WildMidi-based MIDI playback plugin", "elements": { @@ -230469,6 +237864,102 @@ "tracers": {}, "url": "Unknown package origin" }, + "win32ipc": { + "description": "Windows IPC plugin", + "elements": { + "win32ipcvideosink": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Send video frames to win32ipcvideosrc elements", + "hierarchy": + "GstWin32IpcVideoSink", + "GstBaseSink", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Sink/Video", + "pad-templates": { + "sink": { + "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "sink", + "presence": "always" + } + }, + "properties": { + "pipe-name": { + "blurb": "The name of Win32 named pipe to communicate with clients. Validation of the pipe name is caller's responsibility", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "\\\\.\\pipe\\gst.win32.ipc.video", + "mutable": "ready", + "readable": true, + "type": "gchararray", + "writable": true + } + }, + "rank": "none" + }, + "win32ipcvideosrc": { + "author": "Seungha Yang <seungha@centricular.com>", + "description": "Receive video frames from the win32ipcvideosink", + "hierarchy": + "GstWin32IpcVideoSrc", + "GstBaseSrc", + "GstElement", + "GstObject", + "GInitiallyUnowned", + "GObject" + , + "klass": "Source/Video", + "pad-templates": { + "src": { + "caps": "video/x-raw:\n format: { ABGR64_LE, BGRA64_LE, AYUV64, ARGB64_LE, ARGB64, RGBA64_LE, ABGR64_BE, BGRA64_BE, ARGB64_BE, RGBA64_BE, GBRA_12LE, GBRA_12BE, Y412_LE, Y412_BE, A444_10LE, GBRA_10LE, A444_10BE, GBRA_10BE, A422_10LE, A422_10BE, A420_10LE, A420_10BE, RGB10A2_LE, BGR10A2_LE, Y410, GBRA, ABGR, VUYA, BGRA, AYUV, ARGB, RGBA, A420, AV12, Y444_16LE, Y444_16BE, v216, P016_LE, P016_BE, Y444_12LE, GBR_12LE, Y444_12BE, GBR_12BE, I422_12LE, I422_12BE, Y212_LE, Y212_BE, I420_12LE, I420_12BE, P012_LE, P012_BE, Y444_10LE, GBR_10LE, Y444_10BE, GBR_10BE, r210, I422_10LE, I422_10BE, NV16_10LE32, Y210, v210, UYVP, I420_10LE, I420_10BE, P010_10LE, NV12_10LE32, NV12_10LE40, P010_10BE, NV12_10BE_8L128, Y444, RGBP, GBR, BGRP, NV24, xBGR, BGRx, xRGB, RGBx, BGR, IYU2, v308, RGB, Y42B, NV61, NV16, VYUY, UYVY, YVYU, YUY2, I420, YV12, NV21, NV12, NV12_8L128, NV12_64Z32, NV12_4L4, NV12_32L32, NV12_16L32S, Y41B, IYU1, YVU9, YUV9, RGB16, BGR16, RGB15, BGR15, RGB8P, GRAY16_LE, GRAY16_BE, GRAY10_LE32, GRAY8 }\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", + "direction": "src", + "presence": "always" + } + }, + "properties": { + "pipe-name": { + "blurb": "The name of Win32 named pipe to communicate with server. Validation of the pipe name is caller's responsibility", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "\\\\.\\pipe\\gst.win32.ipc.video", + "mutable": "ready", + "readable": true, + "type": "gchararray", + "writable": true + }, + "processing-deadline": { + "blurb": "Maximum processing time for a buffer in nanoseconds", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "20000000", + "max": "18446744073709551615", + "min": "0", + "mutable": "playing", + "readable": true, + "type": "guint64", + "writable": true + } + }, + "rank": "none" + } + }, + "filename": "gstwin32ipc", + "license": "LGPL", + "other-types": {}, + "package": "GStreamer Bad Plug-ins", + "source": "gst-plugins-bad", + "tracers": {}, + "url": "Unknown package origin" + }, "winks": { "description": "Windows kernel streaming plugin", "elements": { @@ -230645,125 +238136,6 @@ "mutable": "null", "readable": true, "type": "gint", - "writable": true - }, - "width": { - "blurb": "Width of screen capture area (0 = maximum)", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "0", - "max": "2147483647", - "min": "0", - "mutable": "null", - "readable": true, - "type": "gint", - "writable": true - }, - "x": { - "blurb": "Horizontal coordinate of top left corner for the screen capture area", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "0", - "max": "2147483647", - "min": "0", - "mutable": "null", - "readable": true, - "type": "gint", - "writable": true - }, - "y": { - "blurb": "Vertical coordinate of top left corner for the screen capture area", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "0", - "max": "2147483647", - "min": "0", - "mutable": "null", - "readable": true, - "type": "gint", - "writable": true - } - }, - "rank": "none" - }, - "dxgiscreencapsrc": { - "author": "OKADA Jun-ichi <okada@abt.jp>", - "description": "Captures screen", - "hierarchy": - "GstDXGIScreenCapSrc", - "GstPushSrc", - "GstBaseSrc", - "GstElement", - "GstObject", - "GInitiallyUnowned", - "GObject" - , - "klass": "Source/Video", - "long-name": "DirectX DXGI screen capture source", - "pad-templates": { - "src": { - "caps": "video/x-raw:\n format: BGRA\n width: 1, 2147483647 \n height: 1, 2147483647 \n framerate: 0/1, 2147483647/1 \n", - "direction": "src", - "presence": "always" - } - }, - "properties": { - "cursor": { - "blurb": "Whether to show mouse cursor (default off)", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "false", - "mutable": "null", - "readable": true, - "type": "gboolean", - "writable": true - }, - "device-name": { - "blurb": "Which monitor to use by device name (e.g. \"\\\\\\\\.\\\\DISPLAY1\")", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "NULL", - "mutable": "null", - "readable": true, - "type": "gchararray", - "writable": true - }, - "height": { - "blurb": "Height of screen capture area (0 = maximum)", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "0", - "max": "2147483647", - "min": "0", - "mutable": "null", - "readable": true, - "type": "gint", - "writable": true - }, - "monitor": { - "blurb": "Which monitor to use (-1 = primary monitor and default)", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "-1", - "max": "2147483647", - "min": "-1", - "mutable": "null", - "readable": true, - "type": "gint", "writable": true }, "width": {
View file
gst-plugins-bad-1.20.5.tar.xz/ext/aes/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/aes/meson.build
Changed
@@ -23,6 +23,5 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstaes, install_dir : plugins_pkgconfig_install_dir) plugins += gstaes aes_dep = declare_dependency(include_directories : include_directories('.'))
View file
gst-plugins-bad-1.20.5.tar.xz/ext/aom/gstav1dec.c -> gst-plugins-bad-1.22.0.tar.xz/ext/aom/gstav1dec.c
Changed
@@ -94,7 +94,7 @@ #define gst_av1_dec_parent_class parent_class G_DEFINE_TYPE (GstAV1Dec, gst_av1_dec, GST_TYPE_VIDEO_DECODER); -GST_ELEMENT_REGISTER_DEFINE (av1dec, "av1dec", GST_RANK_PRIMARY, +GST_ELEMENT_REGISTER_DEFINE (av1dec, "av1dec", GST_RANK_SECONDARY, GST_TYPE_AV1_DEC); static void
View file
gst-plugins-bad-1.20.5.tar.xz/ext/aom/gstav1enc.c -> gst-plugins-bad-1.22.0.tar.xz/ext/aom/gstav1enc.c
Changed
@@ -116,6 +116,63 @@ return end_usage_mode_type; } +#define GST_TYPE_KF_MODE (gst_kf_mode_get_type()) +static GType +gst_kf_mode_get_type (void) +{ + static GType kf_mode_type = 0; + static const GEnumValue kf_mode = { + {GST_AV1_ENC_KF_AUTO, + "Encoder determines optimal keyframe placement automatically", + "auto"}, + {GST_AV1_ENC_KF_DISABLED, "Encoder does not place keyframes", "disabled"}, + {0, NULL, NULL}, + }; + + if (!kf_mode_type) { + kf_mode_type = g_enum_register_static ("GstAV1EncKFMode", kf_mode); + } + return kf_mode_type; +} + +#define GST_TYPE_ENC_PASS (gst_enc_pass_get_type()) +static GType +gst_enc_pass_get_type (void) +{ + static GType enc_pass_type = 0; + static const GEnumValue enc_pass = { + {GST_AV1_ENC_ONE_PASS, "Single pass mode", "one-pass"}, + {GST_AV1_ENC_FIRST_PASS, "First pass of multi-pass mode", "first-pass"}, + {GST_AV1_ENC_SECOND_PASS, "Second pass of multi-pass mode", "second-pass"}, + {GST_AV1_ENC_THIRD_PASS, "Third pass of multi-pass mode", "third-pass"}, + {0, NULL, NULL}, + }; + + if (!enc_pass_type) { + enc_pass_type = g_enum_register_static ("GstAV1EncEncPass", enc_pass); + } + return enc_pass_type; +} + +#define GST_TYPE_USAGE_PROFILE (gst_usage_profile_get_type()) +static GType +gst_usage_profile_get_type (void) +{ + static GType usage_profile_type = 0; + static const GEnumValue usage_profile = { + {GST_AV1_ENC_USAGE_GOOD_QUALITY, "Good Quality profile", "good-quality"}, + {GST_AV1_ENC_USAGE_REALTIME, "Realtime profile", "realtime"}, + {GST_AV1_ENC_USAGE_ALL_INTRA, "All Intra profile", "all-intra"}, + {0, NULL, NULL}, + }; + + if (!usage_profile_type) { + usage_profile_type = + g_enum_register_static ("GstAV1EncUsageProfile", usage_profile); + } + return usage_profile_type; +} + enum { LAST_SIGNAL @@ -146,7 +203,12 @@ PROP_THREADS, PROP_ROW_MT, PROP_TILE_COLUMNS, - PROP_TILE_ROWS + PROP_TILE_ROWS, + PROP_KF_MODE, + PROP_ENC_PASS, + PROP_USAGE_PROFILE, + PROP_LAG_IN_FRAMES, + PROP_KEYFRAME_MAX_DIST }; /* From av1/av1_cx_iface.c */ @@ -171,12 +233,17 @@ #define DEFAULT_BUF_INITIAL_SZ 4000 #define DEFAULT_BUF_OPTIMAL_SZ 5000 #define DEFAULT_TIMEBASE_N 1 -#define DEFAULT_TIMEBASE_D 30 +#define DEFAULT_TIMEBASE_D 90000 #define DEFAULT_BIT_DEPTH AOM_BITS_8 #define DEFAULT_THREADS 0 #define DEFAULT_ROW_MT TRUE #define DEFAULT_TILE_COLUMNS 0 #define DEFAULT_TILE_ROWS 0 +#define DEFAULT_KF_MODE GST_AV1_ENC_KF_AUTO +#define DEFAULT_ENC_PASS GST_AV1_ENC_ONE_PASS +#define DEFAULT_USAGE_PROFILE GST_AV1_ENC_USAGE_GOOD_QUALITY +#define DEFAULT_LAG_IN_FRAMES 0 +#define DEFAULT_KEYFRAME_MAX_DIST 30 static void gst_av1_enc_finalize (GObject * object); static void gst_av1_enc_set_property (GObject * object, guint prop_id, @@ -218,7 +285,7 @@ GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-av1") + GST_STATIC_CAPS ("video/x-av1, alignment = (string) tu") ); static void @@ -259,7 +326,7 @@ g_object_class_install_property (gobject_class, PROP_CPU_USED, g_param_spec_int ("cpu-used", "CPU Used", "CPU Used. A Value greater than 0 will increase encoder speed at the expense of quality.", - 0, 5, DEFAULT_CPU_USED, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + 0, 10, DEFAULT_CPU_USED, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /* Rate control configurations */ g_object_class_install_property (gobject_class, PROP_DROP_FRAME, @@ -400,9 +467,70 @@ "can enable parallel encoding", 0, 6, DEFAULT_TILE_ROWS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * av1enc:keyframe-mode: + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_KF_MODE, + g_param_spec_enum ("keyframe-mode", "Keyframe placement mode", + "Determines whether keyframes are placed automatically by the encoder", + GST_TYPE_KF_MODE, DEFAULT_KF_MODE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * av1enc:enc-pass: + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_ENC_PASS, + g_param_spec_enum ("enc-pass", "Multi-pass Encoding Pass", + "Current phase for multi-pass encoding or @GST_AV1_ENC_ONE_PASS for single pass", + GST_TYPE_ENC_PASS, DEFAULT_ENC_PASS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * av1enc:usage-profile: + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_USAGE_PROFILE, + g_param_spec_enum ("usage-profile", "Usage value", + "Usage profile is used to guide the default config for the encoder", + GST_TYPE_USAGE_PROFILE, DEFAULT_USAGE_PROFILE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * av1enc:lag-in-frames: + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_LAG_IN_FRAMES, + g_param_spec_uint ("lag-in-frames", "Allow lagged encoding", + "Maximum number of future frames the encoder is allowed to consume " + "before producing the current output frame. " + "Set value to 0 for disabling lagged encoding.", + 0, G_MAXUINT, DEFAULT_LAG_IN_FRAMES, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * av1enc:keyframe-max-dist: + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_KEYFRAME_MAX_DIST, + g_param_spec_int ("keyframe-max-dist", "Keyframe max distance", + "Maximum distance between keyframes (number of frames)", + 0, G_MAXINT, DEFAULT_KEYFRAME_MAX_DIST, + (GParamFlags) (G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | GST_PARAM_DOC_SHOW_DEFAULT))); + gst_type_mark_as_plugin_api (GST_TYPE_END_USAGE_MODE, 0); gst_type_mark_as_plugin_api (GST_TYPE_RESIZE_MODE, 0); gst_type_mark_as_plugin_api (GST_TYPE_SUPERRES_MODE, 0); + gst_type_mark_as_plugin_api (GST_TYPE_KF_MODE, 0); + gst_type_mark_as_plugin_api (GST_TYPE_ENC_PASS, 0); + gst_type_mark_as_plugin_api (GST_TYPE_USAGE_PROFILE, 0); } static void @@ -420,7 +548,6 @@ av1enc->encoder_inited = FALSE; - av1enc->keyframe_dist = 30; av1enc->cpu_used = DEFAULT_CPU_USED; av1enc->format = AOM_IMG_FMT_I420; av1enc->threads = DEFAULT_THREADS; @@ -435,6 +562,7 @@ av1enc->aom_cfg.fixed_qp_offsets3 = -1; av1enc->aom_cfg.fixed_qp_offsets4 = -1; #endif + av1enc->aom_cfg.kf_max_dist = DEFAULT_KEYFRAME_MAX_DIST; av1enc->aom_cfg.rc_dropframe_thresh = DEFAULT_DROP_FRAME; av1enc->aom_cfg.rc_resize_mode = DEFAULT_RESIZE_MODE; av1enc->aom_cfg.rc_resize_denominator = DEFAULT_RESIZE_DENOMINATOR; @@ -457,6 +585,10 @@ av1enc->aom_cfg.g_timebase.den = DEFAULT_TIMEBASE_D; av1enc->aom_cfg.g_bit_depth = DEFAULT_BIT_DEPTH; av1enc->aom_cfg.g_input_bit_depth = (unsigned int) DEFAULT_BIT_DEPTH; + av1enc->aom_cfg.kf_mode = (enum aom_kf_mode) DEFAULT_KF_MODE; + av1enc->aom_cfg.g_pass = (enum aom_enc_pass) DEFAULT_ENC_PASS; + av1enc->aom_cfg.g_usage = (unsigned int) DEFAULT_USAGE_PROFILE; + av1enc->aom_cfg.g_lag_in_frames = DEFAULT_LAG_IN_FRAMES; g_mutex_init (&av1enc->encoder_lock); } @@ -700,8 +832,13 @@ av1enc->aom_cfg.g_h = GST_VIDEO_INFO_HEIGHT (info); /* Recommended method is to set the timebase to that of the parent * container or multimedia framework (ex: 1/1000 for ms, as in FLV) */ - av1enc->aom_cfg.g_timebase.num = GST_VIDEO_INFO_FPS_D (info); - av1enc->aom_cfg.g_timebase.den = GST_VIDEO_INFO_FPS_N (info); + if (GST_VIDEO_INFO_FPS_D (info) != 0 && GST_VIDEO_INFO_FPS_N (info) != 0) { + av1enc->aom_cfg.g_timebase.num = GST_VIDEO_INFO_FPS_D (info); + av1enc->aom_cfg.g_timebase.den = GST_VIDEO_INFO_FPS_N (info); + } else { + av1enc->aom_cfg.g_timebase.num = DEFAULT_TIMEBASE_N; + av1enc->aom_cfg.g_timebase.den = DEFAULT_TIMEBASE_D; + } av1enc->aom_cfg.g_error_resilient = AOM_ERROR_RESILIENT_DEFAULT; if (av1enc->threads == DEFAULT_THREADS) @@ -810,6 +947,9 @@ int flags = 0; GstFlowReturn ret = GST_FLOW_OK; GstVideoFrame vframe; + aom_codec_pts_t scaled_pts; + GstClockTime pts_rt; + unsigned long duration; if (!aom_img_alloc (&raw, av1enc->format, av1enc->aom_cfg.g_w, av1enc->aom_cfg.g_h, 1)) { @@ -822,19 +962,54 @@ gst_av1_enc_fill_image (av1enc, &vframe, &raw); gst_video_frame_unmap (&vframe); - if (av1enc->keyframe_dist >= 30) { - av1enc->keyframe_dist = 0; - flags |= AOM_EFLAG_FORCE_KF; + // aom_codec_encode requires pts to be strictly increasing + pts_rt = + gst_segment_to_running_time (&encoder->input_segment, + GST_FORMAT_TIME, frame->pts); + + if (GST_CLOCK_TIME_IS_VALID (av1enc->next_pts) + && pts_rt <= av1enc->next_pts) { + GST_WARNING_OBJECT (av1enc, + "decreasing pts %" GST_TIME_FORMAT " previous buffer was %" + GST_TIME_FORMAT " enforce increasing pts", GST_TIME_ARGS (pts_rt), + GST_TIME_ARGS (av1enc->next_pts)); + pts_rt = av1enc->next_pts + 1; } - av1enc->keyframe_dist++; - g_mutex_lock (&av1enc->encoder_lock); - if (aom_codec_encode (&av1enc->encoder, &raw, frame->pts, 1, flags) + av1enc->next_pts = pts_rt; + + // Convert the pts from nanoseconds to timebase units + scaled_pts = + gst_util_uint64_scale_int (pts_rt, + av1enc->aom_cfg.g_timebase.den, + av1enc->aom_cfg.g_timebase.num * (GstClockTime) GST_SECOND); + + if (frame->duration != GST_CLOCK_TIME_NONE) { + duration = + gst_util_uint64_scale (frame->duration, av1enc->aom_cfg.g_timebase.den, + av1enc->aom_cfg.g_timebase.num * (GstClockTime) GST_SECOND); + + if (duration > 0) { + av1enc->next_pts += frame->duration; + } else { + /* We force the path ignoring the duration if we end up with a zero + * value for duration after scaling (e.g. duration value too small) */ + GST_WARNING_OBJECT (av1enc, + "Ignoring too small frame duration %" GST_TIME_FORMAT, + GST_TIME_ARGS (frame->duration)); + duration = 1; + av1enc->next_pts += 1; + } + } else { + duration = 1; + av1enc->next_pts += 1; + } + + if (aom_codec_encode (&av1enc->encoder, &raw, scaled_pts, duration, flags) != AOM_CODEC_OK) { gst_av1_codec_error (&av1enc->encoder, "Failed to encode frame"); ret = GST_FLOW_ERROR; } - g_mutex_unlock (&av1enc->encoder_lock); aom_img_free (&raw); gst_video_codec_frame_unref (frame); @@ -855,11 +1030,21 @@ { GstFlowReturn ret = GST_FLOW_OK; GstAV1Enc *av1enc = GST_AV1_ENC_CAST (encoder); + aom_codec_pts_t scaled_pts; + GstClockTime pts = 0; while (ret == GST_FLOW_OK) { GST_DEBUG_OBJECT (encoder, "Calling finish"); g_mutex_lock (&av1enc->encoder_lock); - if (aom_codec_encode (&av1enc->encoder, NULL, 0, 1, 0) + + if (GST_CLOCK_TIME_IS_VALID (av1enc->next_pts)) + pts = av1enc->next_pts; + scaled_pts = + gst_util_uint64_scale (pts, + av1enc->aom_cfg.g_timebase.den, + av1enc->aom_cfg.g_timebase.num * (GstClockTime) GST_SECOND); + + if (aom_codec_encode (&av1enc->encoder, NULL, scaled_pts, 1, 0) != AOM_CODEC_OK) { gst_av1_codec_error (&av1enc->encoder, "Failed to encode frame"); ret = GST_FLOW_ERROR; @@ -884,6 +1069,9 @@ aom_codec_destroy (&av1enc->encoder); av1enc->encoder_inited = FALSE; } + + av1enc->next_pts = GST_CLOCK_TIME_NONE; + g_mutex_unlock (&av1enc->encoder_lock); } @@ -1007,6 +1195,26 @@ GST_AV1_ENC_APPLY_CODEC_CONTROL (av1enc, AV1E_SET_TILE_ROWS, av1enc->tile_rows); break; + case PROP_KF_MODE: + av1enc->aom_cfg.kf_mode = g_value_get_enum (value); + global = TRUE; + break; + case PROP_ENC_PASS: + av1enc->aom_cfg.g_pass = g_value_get_enum (value); + global = TRUE; + break; + case PROP_USAGE_PROFILE: + av1enc->aom_cfg.g_usage = g_value_get_enum (value); + global = TRUE; + break; + case PROP_LAG_IN_FRAMES: + av1enc->aom_cfg.g_lag_in_frames = g_value_get_uint (value); + global = TRUE; + break; + case PROP_KEYFRAME_MAX_DIST: + av1enc->aom_cfg.kf_max_dist = g_value_get_int (value); + global = TRUE; + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1102,6 +1310,21 @@ case PROP_TILE_ROWS: g_value_set_uint (value, av1enc->tile_rows); break; + case PROP_KF_MODE: + g_value_set_enum (value, av1enc->aom_cfg.kf_mode); + break; + case PROP_ENC_PASS: + g_value_set_enum (value, av1enc->aom_cfg.g_pass); + break; + case PROP_USAGE_PROFILE: + g_value_set_enum (value, av1enc->aom_cfg.g_usage); + break; + case PROP_LAG_IN_FRAMES: + g_value_set_uint (value, av1enc->aom_cfg.g_lag_in_frames); + break; + case PROP_KEYFRAME_MAX_DIST: + g_value_set_int (value, av1enc->aom_cfg.kf_max_dist); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break;
View file
gst-plugins-bad-1.20.5.tar.xz/ext/aom/gstav1enc.h -> gst-plugins-bad-1.22.0.tar.xz/ext/aom/gstav1enc.h
Changed
@@ -62,11 +62,10 @@ GST_AV1_ENC_RESIZE_NONE = 0, GST_AV1_ENC_RESIZE_FIXED = 1, GST_AV1_ENC_RESIZE_RANDOM = 2, - GST_AV1_ENC_RESIZE_MODES } GstAV1EncResizeMode; /** - * GstAV1EncSuperresMode + * GstAV1EncSuperresMode: * @GST_AV1_ENC_SUPERRES_NONE: No frame superres allowed * @GST_AV1_ENC_SUPERRES_FIXED: All frames are coded at the specified scale and * super-resolved @@ -81,11 +80,10 @@ GST_AV1_ENC_SUPERRES_FIXED = 1, GST_AV1_ENC_SUPERRES_RANDOM = 2, GST_AV1_ENC_SUPERRES_QTHRESH = 3, - GST_AV1_ENC_SUPERRES_MODES } GstAV1EncSuperresMode; /** - * GstAV1EncEndUsageMode + * GstAV1EncEndUsageMode: * @GST_AV1_ENC_END_USAGE_VBR: Variable Bit Rate Mode * @GST_AV1_ENC_END_USAGE_CBR: Constant Bit Rate Mode * @GST_AV1_ENC_END_USAGE_CQ: Constrained Quality Mode @@ -100,15 +98,66 @@ GST_AV1_ENC_END_USAGE_CBR = 1, GST_AV1_ENC_END_USAGE_CQ = 2, GST_AV1_ENC_END_USAGE_Q = 3, - GST_AV1_ENC_END_USAGE_MODES } GstAV1EncEndUsageMode; +/** + * GstAV1EncKFMode: + * @GST_AV1_ENC_KF_DISABLED: Encoder does not place keyframes + * @GST_AV1_ENC_KF_AUTO: Encoder determines optimal keyframe placement automatically + * + * Determines whether keyframes are placed automatically by the encoder + * + * Since: 1.22 + */ + +typedef enum +{ + GST_AV1_ENC_KF_DISABLED = 0, + GST_AV1_ENC_KF_AUTO = 1, +} GstAV1EncKFMode; + +/** + * GstAV1EncEncPass: + * @GST_AV1_ENC_ONE_PASS: Single pass mode + * @GST_AV1_ENC_FIRST_PASS: First pass of multi-pass mode + * @GST_AV1_ENC_SECOND_PASS: Second pass of multi-pass mode + * @GST_AV1_ENC_THIRD_PASS: Third pass of multi-pass mode + * Current phase for multi-pass encoding or @GST_AV1_ENC_ONE_PASS for single pass + * + * Since: 1.22 + */ + +typedef enum +{ + GST_AV1_ENC_ONE_PASS = 0, + GST_AV1_ENC_FIRST_PASS = 1, + GST_AV1_ENC_SECOND_PASS = 2, + GST_AV1_ENC_THIRD_PASS = 3, +} GstAV1EncEncPass; + +/** + * GstAV1EncUsageProfile: + * @GST_AV1_ENC_USAGE_GOOD_QUALITY: Good Quality profile + * @GST_AV1_ENC_USAGE_REALTIME: Realtime profile + * @GST_AV1_ENC_USAGE_ALL_INTRA: All Intra profile + * + * Usage profile is used to guide the default config for the encoder + * + * Since: 1.22 + */ + +typedef enum +{ + GST_AV1_ENC_USAGE_GOOD_QUALITY = 0, + GST_AV1_ENC_USAGE_REALTIME = 1, + GST_AV1_ENC_USAGE_ALL_INTRA = 2, +} GstAV1EncUsageProfile; + struct _GstAV1Enc { GstVideoEncoder base_video_encoder; /* properties */ - guint keyframe_dist; gint cpu_used; gint threads; gboolean row_mt; @@ -123,6 +172,9 @@ aom_img_fmt_t format; GMutex encoder_lock; + /* next pts, in running time */ + GstClockTime next_pts; + gboolean target_bitrate_set; };
View file
gst-plugins-bad-1.20.5.tar.xz/ext/aom/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/aom/meson.build
Changed
@@ -8,6 +8,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstaom, install_dir : plugins_pkgconfig_install_dir) plugins += gstaom endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/assrender/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/assrender/meson.build
Changed
@@ -9,6 +9,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstassrender, install_dir : plugins_pkgconfig_install_dir) plugins += gstassrender endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/avtp/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/avtp/meson.build
Changed
@@ -37,6 +37,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstavtp, install_dir : plugins_pkgconfig_install_dir) plugins += gstavtp endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/bs2b/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/bs2b/meson.build
Changed
@@ -12,6 +12,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstbs2b, install_dir : plugins_pkgconfig_install_dir) plugins += gstbs2b endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/bz2/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/bz2/meson.build
Changed
@@ -15,6 +15,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstbz2, install_dir : plugins_pkgconfig_install_dir) plugins += gstbz2 endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/chromaprint/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/chromaprint/meson.build
Changed
@@ -9,6 +9,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstchromaprint, install_dir : plugins_pkgconfig_install_dir) plugins += gstchromaprint endif
View file
gst-plugins-bad-1.22.0.tar.xz/ext/closedcaption/ccutils.c
Added
@@ -0,0 +1,999 @@ +/* + * GStreamer + * Copyright (C) 2022 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <gst/base/base.h> + +#include "ccutils.h" + +#define GST_CAT_DEFAULT ccutils_debug_cat +GST_DEBUG_CATEGORY (GST_CAT_DEFAULT); + +typedef struct cdp_fps_entry cdp_fps_entry; + +#define VAL_OR_0(v) ((v) ? (*(v)) : 0) + +static const struct cdp_fps_entry cdp_fps_table = { + {0x1f, 24000, 1001, 25, 22, 3 /* FIXME: alternating max cea608 count! */ }, + {0x2f, 24, 1, 25, 22, 2}, + {0x3f, 25, 1, 24, 22, 2}, + {0x4f, 30000, 1001, 20, 18, 2}, + {0x5f, 30, 1, 20, 18, 2}, + {0x6f, 50, 1, 12, 11, 1}, + {0x7f, 60000, 1001, 10, 9, 1}, + {0x8f, 60, 1, 10, 9, 1}, +}; +const struct cdp_fps_entry null_fps_entry = { 0, 0, 0, 0 }; + +const struct cdp_fps_entry * +cdp_fps_entry_from_fps (guint fps_n, guint fps_d) +{ + int i; + for (i = 0; i < G_N_ELEMENTS (cdp_fps_table); i++) { + if (cdp_fps_tablei.fps_n == fps_n && cdp_fps_tablei.fps_d == fps_d) + return &cdp_fps_tablei; + } + return &null_fps_entry; +} + +const struct cdp_fps_entry * +cdp_fps_entry_from_id (guint8 id) +{ + int i; + for (i = 0; i < G_N_ELEMENTS (cdp_fps_table); i++) { + if (cdp_fps_tablei.fps_idx == id) + return &cdp_fps_tablei; + } + return &null_fps_entry; +} + +/* Converts raw CEA708 cc_data and an optional timecode into CDP */ +guint +convert_cea708_cc_data_to_cdp (GstObject * dbg_obj, GstCCCDPMode cdp_mode, + guint16 cdp_hdr_sequence_cntr, const guint8 * cc_data, guint cc_data_len, + guint8 * cdp, guint cdp_len, const GstVideoTimeCode * tc, + const cdp_fps_entry * fps_entry) +{ + GstByteWriter bw; + guint8 flags, checksum; + guint i, len; + + GST_DEBUG_OBJECT (dbg_obj, "writing out cdp packet from cc_data with " + "length %u", cc_data_len); + + gst_byte_writer_init_with_data (&bw, cdp, cdp_len, FALSE); + gst_byte_writer_put_uint16_be_unchecked (&bw, 0x9669); + /* Write a length of 0 for now */ + gst_byte_writer_put_uint8_unchecked (&bw, 0); + + gst_byte_writer_put_uint8_unchecked (&bw, fps_entry->fps_idx); + + if (cc_data_len / 3 > fps_entry->max_cc_count) { + GST_WARNING_OBJECT (dbg_obj, "Too many cc_data triplets for framerate: %u. " + "Truncating to %u", cc_data_len / 3, fps_entry->max_cc_count); + cc_data_len = 3 * fps_entry->max_cc_count; + } + + /* caption_service_active */ + flags = 0x02; + + /* ccdata_present */ + if ((cdp_mode & GST_CC_CDP_MODE_CC_DATA)) + flags |= 0x40; + + /* time_code_present */ + if ((cdp_mode & GST_CC_CDP_MODE_TIME_CODE) && tc && tc->config.fps_n > 0) + flags |= 0x80; + + /* reserved */ + flags |= 0x01; + + gst_byte_writer_put_uint8_unchecked (&bw, flags); + + gst_byte_writer_put_uint16_be_unchecked (&bw, cdp_hdr_sequence_cntr); + + if ((cdp_mode & GST_CC_CDP_MODE_TIME_CODE) && tc && tc->config.fps_n > 0) { + guint8 u8; + + gst_byte_writer_put_uint8_unchecked (&bw, 0x71); + /* reserved 11 - 2 bits */ + u8 = 0xc0; + /* tens of hours - 2 bits */ + u8 |= ((tc->hours / 10) & 0x3) << 4; + /* units of hours - 4 bits */ + u8 |= (tc->hours % 10) & 0xf; + gst_byte_writer_put_uint8_unchecked (&bw, u8); + + /* reserved 1 - 1 bit */ + u8 = 0x80; + /* tens of minutes - 3 bits */ + u8 |= ((tc->minutes / 10) & 0x7) << 4; + /* units of minutes - 4 bits */ + u8 |= (tc->minutes % 10) & 0xf; + gst_byte_writer_put_uint8_unchecked (&bw, u8); + + /* field flag - 1 bit */ + u8 = tc->field_count < 2 ? 0x00 : 0x80; + /* tens of seconds - 3 bits */ + u8 |= ((tc->seconds / 10) & 0x7) << 4; + /* units of seconds - 4 bits */ + u8 |= (tc->seconds % 10) & 0xf; + gst_byte_writer_put_uint8_unchecked (&bw, u8); + + /* drop frame flag - 1 bit */ + u8 = (tc->config.flags & GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME) ? 0x80 : + 0x00; + /* reserved0 - 1 bit */ + /* tens of frames - 2 bits */ + u8 |= ((tc->frames / 10) & 0x3) << 4; + /* units of frames 4 bits */ + u8 |= (tc->frames % 10) & 0xf; + gst_byte_writer_put_uint8_unchecked (&bw, u8); + } + + if ((cdp_mode & GST_CC_CDP_MODE_CC_DATA)) { + gst_byte_writer_put_uint8_unchecked (&bw, 0x72); + gst_byte_writer_put_uint8_unchecked (&bw, 0xe0 | fps_entry->max_cc_count); + gst_byte_writer_put_data_unchecked (&bw, cc_data, cc_data_len); + while (fps_entry->max_cc_count > cc_data_len / 3) { + gst_byte_writer_put_uint8_unchecked (&bw, 0xfa); + gst_byte_writer_put_uint8_unchecked (&bw, 0x00); + gst_byte_writer_put_uint8_unchecked (&bw, 0x00); + cc_data_len += 3; + } + } + + gst_byte_writer_put_uint8_unchecked (&bw, 0x74); + gst_byte_writer_put_uint16_be_unchecked (&bw, cdp_hdr_sequence_cntr); + /* We calculate the checksum afterwards */ + gst_byte_writer_put_uint8_unchecked (&bw, 0); + + len = gst_byte_writer_get_pos (&bw); + gst_byte_writer_set_pos (&bw, 2); + gst_byte_writer_put_uint8_unchecked (&bw, len); + + checksum = 0; + for (i = 0; i < len; i++) { + checksum += cdpi; + } + checksum &= 0xff; + checksum = 256 - checksum; + cdplen - 1 = checksum; + + return len; +} + +/* Converts CDP into raw CEA708 cc_data */ +guint +convert_cea708_cdp_to_cc_data (GstObject * dbg_obj, + const guint8 * cdp, guint cdp_len, guint8 * cc_data, + GstVideoTimeCode * tc, const cdp_fps_entry ** out_fps_entry) +{ + GstByteReader br; + guint16 u16; + guint8 u8; + guint8 flags; + guint len = 0; + const struct cdp_fps_entry *fps_entry; + + *out_fps_entry = &null_fps_entry; + memset (tc, 0, sizeof (*tc)); + + /* Header + footer length */ + if (cdp_len < 11) { + GST_WARNING_OBJECT (dbg_obj, "cdp packet too short (%u). expected at " + "least %u", cdp_len, 11); + return 0; + } + + gst_byte_reader_init (&br, cdp, cdp_len); + u16 = gst_byte_reader_get_uint16_be_unchecked (&br); + if (u16 != 0x9669) { + GST_WARNING_OBJECT (dbg_obj, "cdp packet does not have initial magic bytes " + "of 0x9669"); + return 0; + } + + u8 = gst_byte_reader_get_uint8_unchecked (&br); + if (u8 != cdp_len) { + GST_WARNING_OBJECT (dbg_obj, "cdp packet length (%u) does not match passed " + "in value (%u)", u8, cdp_len); + return 0; + } + + u8 = gst_byte_reader_get_uint8_unchecked (&br); + fps_entry = cdp_fps_entry_from_id (u8); + if (!fps_entry || fps_entry->fps_n == 0) { + GST_WARNING_OBJECT (dbg_obj, "cdp packet does not have a valid framerate " + "id (0x%02x", u8); + return 0; + } + + flags = gst_byte_reader_get_uint8_unchecked (&br); + /* No cc_data? */ + if ((flags & 0x40) == 0) { + GST_DEBUG_OBJECT (dbg_obj, "cdp packet does have any cc_data"); + return 0; + } + + /* cdp_hdr_sequence_cntr */ + gst_byte_reader_skip_unchecked (&br, 2); + + /* time_code_present */ + if (flags & 0x80) { + guint8 hours, minutes, seconds, frames, fields; + gboolean drop_frame; + + if (gst_byte_reader_get_remaining (&br) < 5) { + GST_WARNING_OBJECT (dbg_obj, "cdp packet does not have enough data to " + "contain a timecode (%u). Need at least 5 bytes", + gst_byte_reader_get_remaining (&br)); + return 0; + } + u8 = gst_byte_reader_get_uint8_unchecked (&br); + if (u8 != 0x71) { + GST_WARNING_OBJECT (dbg_obj, "cdp packet does not have timecode start " + "byte of 0x71, found 0x%02x", u8); + return 0; + } + + u8 = gst_byte_reader_get_uint8_unchecked (&br); + if ((u8 & 0xc0) != 0xc0) { + GST_WARNING_OBJECT (dbg_obj, "reserved bits are not 0xc0, found 0x%02x", + u8); + return 0; + } + + hours = ((u8 >> 4) & 0x3) * 10 + (u8 & 0xf); + + u8 = gst_byte_reader_get_uint8_unchecked (&br); + if ((u8 & 0x80) != 0x80) { + GST_WARNING_OBJECT (dbg_obj, "reserved bit is not 0x80, found 0x%02x", + u8); + return 0; + } + minutes = ((u8 >> 4) & 0x7) * 10 + (u8 & 0xf); + + u8 = gst_byte_reader_get_uint8_unchecked (&br); + if (u8 & 0x80) + fields = 2; + else + fields = 1; + seconds = ((u8 >> 4) & 0x7) * 10 + (u8 & 0xf); + + u8 = gst_byte_reader_get_uint8_unchecked (&br); + if (u8 & 0x40) { + GST_WARNING_OBJECT (dbg_obj, "reserved bit is not 0x0, found 0x%02x", u8); + return 0; + } + + drop_frame = !(!(u8 & 0x80)); + frames = ((u8 >> 4) & 0x3) * 10 + (u8 & 0xf); + + gst_video_time_code_init (tc, fps_entry->fps_n, fps_entry->fps_d, NULL, + drop_frame ? GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME : + GST_VIDEO_TIME_CODE_FLAGS_NONE, hours, minutes, seconds, frames, + fields); + } + + /* ccdata_present */ + if (flags & 0x40) { + guint8 cc_count; + + if (gst_byte_reader_get_remaining (&br) < 2) { + GST_WARNING_OBJECT (dbg_obj, "not enough data to contain valid cc_data"); + return 0; + } + u8 = gst_byte_reader_get_uint8_unchecked (&br); + if (u8 != 0x72) { + GST_WARNING_OBJECT (dbg_obj, "missing cc_data start code of 0x72, " + "found 0x%02x", u8); + return 0; + } + + cc_count = gst_byte_reader_get_uint8_unchecked (&br); + if ((cc_count & 0xe0) != 0xe0) { + GST_WARNING_OBJECT (dbg_obj, "reserved bits are not 0xe0, found 0x%02x", + u8); + return 0; + } + cc_count &= 0x1f; + + len = 3 * cc_count; + if (gst_byte_reader_get_remaining (&br) < len) { + GST_WARNING_OBJECT (dbg_obj, "not enough bytes (%u) left for the " + "number of byte triples (%u)", gst_byte_reader_get_remaining (&br), + cc_count); + return 0; + } + + memcpy (cc_data, gst_byte_reader_get_data_unchecked (&br, len), len); + } + + *out_fps_entry = fps_entry; + + /* skip everything else we don't care about */ + return len; +} + +#define CC_DATA_EXTRACT_TOO_MANY_FIELD1 -2 +#define CC_DATA_EXTRACT_TOO_MANY_FIELD2 -3 + +static gint +cc_data_extract_cea608 (const guint8 * cc_data, guint cc_data_len, + guint8 * cea608_field1, guint * cea608_field1_len, + guint8 * cea608_field2, guint * cea608_field2_len) +{ + guint i, field_1_len = 0, field_2_len = 0; + + if (cea608_field1_len) { + field_1_len = *cea608_field1_len; + *cea608_field1_len = 0; + } + if (cea608_field2_len) { + field_2_len = *cea608_field2_len; + *cea608_field2_len = 0; + } + + if (cc_data_len % 3 != 0) { + GST_WARNING ("Invalid cc_data buffer size %u. Truncating to a multiple " + "of 3", cc_data_len); + cc_data_len = cc_data_len - (cc_data_len % 3); + } + + for (i = 0; i < cc_data_len / 3; i++) { + guint8 byte0 = cc_datai * 3 + 0; + guint8 byte1 = cc_datai * 3 + 1; + guint8 byte2 = cc_datai * 3 + 2; + gboolean cc_valid = (byte0 & 0x04) == 0x04; + guint8 cc_type = byte0 & 0x03; + + GST_TRACE ("0x%02x 0x%02x 0x%02x, valid: %u, type: 0b%u%u", byte0, byte1, + byte2, cc_valid, (cc_type & 0x2) == 0x2, (cc_type & 0x1) == 0x1); + + if (cc_type == 0x00) { + if (!cc_valid) + continue; + + if (cea608_field1 && cea608_field1_len) { + if (*cea608_field1_len + 2 > field_1_len) { + GST_WARNING ("Too many cea608 input bytes %u for field 1", + *cea608_field1_len + 2); + return CC_DATA_EXTRACT_TOO_MANY_FIELD1; + } + + if (byte1 != 0x80 || byte2 != 0x80) { + cea608_field1(*cea608_field1_len)++ = byte1; + cea608_field1(*cea608_field1_len)++ = byte2; + } + } + } else if (cc_type == 0x01) { + if (!cc_valid) + continue; + + if (cea608_field2 && cea608_field2_len) { + if (*cea608_field2_len + 2 > field_2_len) { + GST_WARNING ("Too many cea608 input bytes %u for field 2", + *cea608_field2_len + 2); + return CC_DATA_EXTRACT_TOO_MANY_FIELD2; + } + if (byte1 != 0x80 || byte2 != 0x80) { + cea608_field2(*cea608_field2_len)++ = byte1; + cea608_field2(*cea608_field2_len)++ = byte2; + } + } + } else { + /* all cea608 packets must be at the beginning of a cc_data */ + break; + } + } + + g_assert_cmpint (i * 3, <=, cc_data_len); + + GST_LOG ("Extracted cea608-1 of length %u and cea608-2 of length %u, " + "ccp_offset %i", VAL_OR_0 (cea608_field1_len), + VAL_OR_0 (cea608_field2_len), i * 3); + + return i * 3; +} + +gint +drop_ccp_from_cc_data (guint8 * cc_data, guint cc_data_len) +{ + return cc_data_extract_cea608 (cc_data, cc_data_len, NULL, NULL, NULL, NULL); +} + +#define DEFAULT_MAX_BUFFER_TIME (100 * GST_MSECOND) + +struct _CCBuffer +{ + GstObject parent; + GArray *cea608_1; + GArray *cea608_2; + GArray *cc_data; + /* used for tracking which field to write across output buffer boundaries */ + gboolean last_cea608_written_was_field1; + + /* properties */ + GstClockTime max_buffer_time; + gboolean output_padding; +}; + +G_DEFINE_TYPE (CCBuffer, cc_buffer, G_TYPE_OBJECT); + +CCBuffer * +cc_buffer_new (void) +{ + return g_object_new (cc_buffer_get_type (), NULL); +} + +static void +cc_buffer_init (CCBuffer * buf) +{ + buf->cea608_1 = g_array_new (FALSE, FALSE, sizeof (guint8)); + buf->cea608_2 = g_array_new (FALSE, FALSE, sizeof (guint8)); + buf->cc_data = g_array_new (FALSE, FALSE, sizeof (guint8)); + + buf->max_buffer_time = DEFAULT_MAX_BUFFER_TIME; + buf->output_padding = TRUE; +} + +static void +cc_buffer_finalize (GObject * object) +{ + CCBuffer *buf = GST_CC_BUFFER (object); + + g_array_unref (buf->cea608_1); + buf->cea608_1 = NULL; + g_array_unref (buf->cea608_2); + buf->cea608_2 = NULL; + g_array_unref (buf->cc_data); + buf->cc_data = NULL; + + G_OBJECT_CLASS (cc_buffer_parent_class)->finalize (object); +} + +static void +cc_buffer_class_init (CCBufferClass * buf_class) +{ + GObjectClass *gobject_class = (GObjectClass *) buf_class; + + gobject_class->finalize = cc_buffer_finalize; +} + +/* remove padding bytes from a cc_data packet. Returns the length of the new + * data in @cc_data */ +static guint +compact_cc_data (guint8 * cc_data, guint cc_data_len) +{ + gboolean started_ccp = FALSE; + guint out_len = 0; + guint i; + + if (cc_data_len % 3 != 0) { + GST_WARNING ("Invalid cc_data buffer size"); + cc_data_len = cc_data_len - (cc_data_len % 3); + } + + for (i = 0; i < cc_data_len / 3; i++) { + gboolean cc_valid = (cc_datai * 3 & 0x04) == 0x04; + guint8 cc_type = cc_datai * 3 & 0x03; + + if (!started_ccp && (cc_type == 0x00 || cc_type == 0x01)) { + if (cc_valid) { + /* copy over valid 608 data */ + cc_dataout_len++ = cc_datai * 3; + cc_dataout_len++ = cc_datai * 3 + 1; + cc_dataout_len++ = cc_datai * 3 + 2; + } + continue; + } + + if (cc_type & 0x10) + started_ccp = TRUE; + + if (!cc_valid) + continue; + + if (cc_type == 0x00 || cc_type == 0x01) { + GST_WARNING ("Invalid cc_data. cea608 bytes after cea708"); + return 0; + } + + cc_dataout_len++ = cc_datai * 3; + cc_dataout_len++ = cc_datai * 3 + 1; + cc_dataout_len++ = cc_datai * 3 + 2; + } + + GST_LOG ("compacted cc_data from %u to %u", cc_data_len, out_len); + + return out_len; +} + +static guint +calculate_n_cea608_doubles_from_time_ceil (CCBuffer * buf, GstClockTime ns) +{ + /* cea608 has a maximum bitrate of 60000/1001 * 2 bytes/s */ + guint ret = gst_util_uint64_scale_ceil (ns, 120000, 1001 * GST_SECOND); + + return GST_ROUND_UP_2 (ret); +} + +static guint +calculate_n_cea708_doubles_from_time_ceil (CCBuffer * buf, GstClockTime ns) +{ + /* ccp has a maximum bitrate of 9600000/1001 bits/s */ + guint ret = gst_util_uint64_scale_ceil (ns, 9600000 / 8, 1001 * GST_SECOND); + + return GST_ROUND_UP_2 (ret); +} + +static void +push_internal (CCBuffer * buf, const guint8 * cea608_1, + guint cea608_1_len, const guint8 * cea608_2, guint cea608_2_len, + const guint8 * cc_data, guint cc_data_len) +{ + guint max_cea608_bytes; + + GST_DEBUG_OBJECT (buf, "pushing cea608-1: %u cea608-2: %u ccp: %u", + cea608_1_len, cea608_2_len, cc_data_len); + max_cea608_bytes = + calculate_n_cea608_doubles_from_time_ceil (buf, buf->max_buffer_time); + + if (cea608_1_len > 0) { + if (cea608_1_len + buf->cea608_1->len > max_cea608_bytes) { + GST_WARNING_OBJECT (buf, "cea608 field 1 overflow, dropping all " + "previous data, max %u, attempted to hold %u", max_cea608_bytes, + cea608_1_len + buf->cea608_1->len); + g_array_set_size (buf->cea608_1, 0); + } + g_array_append_vals (buf->cea608_1, cea608_1, cea608_1_len); + } + if (cea608_2_len > 0) { + if (cea608_2_len + buf->cea608_2->len > max_cea608_bytes) { + GST_WARNING_OBJECT (buf, "cea608 field 2 overflow, dropping all " + "previous data, max %u, attempted to hold %u", max_cea608_bytes, + cea608_2_len + buf->cea608_2->len); + g_array_set_size (buf->cea608_2, 0); + } + g_array_append_vals (buf->cea608_2, cea608_2, cea608_2_len); + } + if (cc_data_len > 0) { + guint max_cea708_bytes = + calculate_n_cea708_doubles_from_time_ceil (buf, buf->max_buffer_time); + if (cc_data_len + buf->cc_data->len > max_cea708_bytes) { + GST_WARNING_OBJECT (buf, "ccp data overflow, dropping all " + "previous data, max %u, attempted to hold %u", max_cea708_bytes, + cc_data_len + buf->cc_data->len); + g_array_set_size (buf->cea608_2, 0); + } + g_array_append_vals (buf->cc_data, cc_data, cc_data_len); + } +} + +gboolean +cc_buffer_push_separated (CCBuffer * buf, const guint8 * cea608_1, + guint cea608_1_len, const guint8 * cea608_2, guint cea608_2_len, + const guint8 * cc_data, guint cc_data_len) +{ + guint8 cea608_1_copyMAX_CEA608_LEN; + guint8 cea608_2_copyMAX_CEA608_LEN; + guint8 cc_data_copyMAX_CDP_PACKET_LEN; + guint i; + + if (cea608_1 && cea608_1_len > 0) { + guint out_i = 0; + for (i = 0; i < cea608_1_len / 2; i++) { + if (cea608_1i != 0x80 || cea608_1i + 1 != 0x80) { + cea608_1_copyout_i++ = cea608_1i; + cea608_1_copyout_i++ = cea608_1i + 1; + } + } + cea608_1_len = out_i; + } else { + cea608_1_len = 0; + } + + if (cea608_2 && cea608_2_len > 0) { + guint out_i = 0; + for (i = 0; i < cea608_2_len / 2; i++) { + if (cea608_2i != 0x80 || cea608_2i + 1 != 0x80) { + cea608_2_copyout_i++ = cea608_2i; + cea608_2_copyout_i++ = cea608_2i + 1; + } + } + cea608_2_len = out_i; + } else { + cea608_2_len = 0; + } + + if (cc_data && cc_data_len > 0) { + memcpy (cc_data_copy, cc_data, cc_data_len); + cc_data_len = compact_cc_data (cc_data_copy, cc_data_len); + } else { + cc_data_len = 0; + } + + push_internal (buf, cea608_1_copy, cea608_1_len, cea608_2_copy, + cea608_2_len, cc_data_copy, cc_data_len); + + return cea608_1_len > 0 || cea608_2_len > 0 || cc_data_len > 0; +} + +gboolean +cc_buffer_push_cc_data (CCBuffer * buf, const guint8 * cc_data, + guint cc_data_len) +{ + guint8 cea608_1MAX_CEA608_LEN; + guint8 cea608_2MAX_CEA608_LEN; + guint8 cc_data_copyMAX_CDP_PACKET_LEN; + guint cea608_1_len = MAX_CEA608_LEN; + guint cea608_2_len = MAX_CEA608_LEN; + int ccp_offset; + + memcpy (cc_data_copy, cc_data, cc_data_len); + + cc_data_len = compact_cc_data (cc_data_copy, cc_data_len); + + ccp_offset = cc_data_extract_cea608 (cc_data_copy, cc_data_len, cea608_1, + &cea608_1_len, cea608_2, &cea608_2_len); + + if (ccp_offset < 0) { + GST_WARNING_OBJECT (buf, "Failed to extract cea608 from cc_data"); + return FALSE; + } + + push_internal (buf, cea608_1, cea608_1_len, cea608_2, + cea608_2_len, &cc_data_copyccp_offset, cc_data_len - ccp_offset); + + return cea608_1_len > 0 || cea608_2_len > 0 || cc_data_len - ccp_offset > 0; +} + +void +cc_buffer_get_stored_size (CCBuffer * buf, guint * cea608_1_len, + guint * cea608_2_len, guint * cc_data_len) +{ + if (cea608_1_len) + *cea608_1_len = buf->cea608_1->len; + if (cea608_2_len) + *cea608_2_len = buf->cea608_2->len; + if (cc_data_len) + *cc_data_len = buf->cc_data->len; +} + +void +cc_buffer_discard (CCBuffer * buf) +{ + g_array_set_size (buf->cea608_1, 0); + g_array_set_size (buf->cea608_2, 0); + g_array_set_size (buf->cc_data, 0); +} + +#if 0 +void +cc_buffer_peek (CCBuffer * buf, guint8 ** cea608_1, guint * cea608_1_len, + guint8 ** cea608_2, guint * cea608_2_len, guint8 ** cc_data, + guint * cc_data_len) +{ + if (cea608_1_len) { + if (cea608_1) { + *cea608_1 = (guint8 *) buf->cea608_1->data; + } + *cea608_1_len = buf->cea608_1->len; + } + if (cea608_1_len) { + if (cea608_2) { + *cea608_2 = (guint8 *) buf->cea608_2->data; + } + *cea608_2_len = buf->cea608_2->len; + } + if (cc_data_len) { + if (cc_data) { + *cc_data = (guint8 *) buf->cc_data->data; + } + *cc_data_len = buf->cc_data->len; + } +} +#endif +static void +cc_buffer_get_out_sizes (CCBuffer * buf, const struct cdp_fps_entry *fps_entry, + guint * cea608_1_len, guint * field1_padding, guint * cea608_2_len, + guint * field2_padding, guint * cc_data_len) +{ + gint extra_ccp = 0, extra_cea608_1 = 0, extra_cea608_2 = 0; + gint write_ccp_size = 0, write_cea608_1_size = 0, write_cea608_2_size = 0; + gboolean wrote_first = FALSE; + + if (buf->cc_data->len) { + extra_ccp = buf->cc_data->len - 3 * fps_entry->max_ccp_count; + extra_ccp = MAX (0, extra_ccp); + write_ccp_size = buf->cc_data->len - extra_ccp; + } + + extra_cea608_1 = buf->cea608_1->len; + extra_cea608_2 = buf->cea608_2->len; + *field1_padding = 0; + *field2_padding = 0; + + wrote_first = !buf->last_cea608_written_was_field1; + /* try to push data into the packets. Anything 'extra' will be + * stored for later */ + while (TRUE) { + gint avail_1, avail_2; + + avail_1 = buf->cea608_1->len - extra_cea608_1 + *field1_padding; + avail_2 = buf->cea608_2->len - extra_cea608_2 + *field2_padding; + if (avail_1 + avail_2 >= 2 * fps_entry->max_cea608_count) + break; + + if (wrote_first) { + if (extra_cea608_1 > 0) { + extra_cea608_1 -= 2; + g_assert_cmpint (extra_cea608_1, >=, 0); + write_cea608_1_size += 2; + g_assert_cmpint (write_cea608_1_size, <=, buf->cea608_1->len); + } else { + *field1_padding += 2; + } + } + + avail_1 = buf->cea608_1->len - extra_cea608_1 + *field1_padding; + avail_2 = buf->cea608_2->len - extra_cea608_2 + *field2_padding; + if (avail_1 + avail_2 >= 2 * fps_entry->max_cea608_count) + break; + + if (extra_cea608_2 > 0) { + extra_cea608_2 -= 2; + g_assert_cmpint (extra_cea608_2, >=, 0); + write_cea608_2_size += 2; + g_assert_cmpint (write_cea608_2_size, <=, buf->cea608_2->len); + } else { + /* we need to insert field 2 padding if we don't have data and are + * requested to start with field2 */ + *field2_padding += 2; + } + wrote_first = TRUE; + } + + if (!buf->output_padding && write_cea608_1_size == 0 + && write_cea608_2_size == 0) { + *field1_padding = 0; + *field2_padding = 0; + } + + GST_TRACE_OBJECT (buf, "allocated sizes ccp:%u, cea608-1:%u (pad:%u), " + "cea608-2:%u (pad:%u)", write_ccp_size, write_cea608_1_size, + *field1_padding, write_cea608_2_size, *field2_padding); + + *cea608_1_len = write_cea608_1_size; + *cea608_2_len = write_cea608_2_size; + *cc_data_len = write_ccp_size; +} + +void +cc_buffer_take_separated (CCBuffer * buf, + const struct cdp_fps_entry *fps_entry, guint8 * cea608_1, + guint * cea608_1_len, guint8 * cea608_2, guint * cea608_2_len, + guint8 * cc_data, guint * cc_data_len) +{ + guint write_cea608_1_size, write_cea608_2_size, write_ccp_size; + guint field1_padding, field2_padding; + + cc_buffer_get_out_sizes (buf, fps_entry, &write_cea608_1_size, + &field1_padding, &write_cea608_2_size, &field2_padding, &write_ccp_size); + + if (cea608_1_len) { + if (*cea608_1_len < write_cea608_1_size + field1_padding) { + GST_WARNING_OBJECT (buf, "output cea608 field 1 buffer (%u) is too " + "small to hold output (%u)", *cea608_1_len, + write_cea608_1_size + field1_padding); + *cea608_1_len = 0; + } else if (cea608_1) { + memcpy (cea608_1, buf->cea608_1->data, write_cea608_1_size); + memset (&cea608_1write_cea608_1_size, 0x80, field1_padding); + *cea608_1_len = write_cea608_1_size + field1_padding; + } else { + *cea608_1_len = 0; + } + } + if (cea608_2_len) { + if (*cea608_2_len < write_cea608_2_size + field2_padding) { + GST_WARNING_OBJECT (buf, "output cea608 field 2 buffer (%u) is too " + "small to hold output (%u)", *cea608_2_len, write_cea608_2_size); + *cea608_2_len = 0; + } else if (cea608_2) { + memcpy (cea608_2, buf->cea608_2->data, write_cea608_2_size); + memset (&cea608_2write_cea608_2_size, 0x80, field2_padding); + *cea608_2_len = write_cea608_2_size + field2_padding; + } else { + *cea608_2_len = 0; + } + } + if (cc_data_len) { + if (*cc_data_len < write_ccp_size) { + GST_WARNING_OBJECT (buf, "output ccp buffer (%u) is too " + "small to hold output (%u)", *cc_data_len, write_ccp_size); + *cc_data_len = 0; + } else if (cc_data) { + memcpy (cc_data, buf->cc_data->data, write_ccp_size); + *cc_data_len = write_ccp_size; + } else { + *cc_data_len = 0; + } + } + + g_array_remove_range (buf->cea608_1, 0, write_cea608_1_size); + g_array_remove_range (buf->cea608_2, 0, write_cea608_2_size); + g_array_remove_range (buf->cc_data, 0, write_ccp_size); + + GST_LOG_OBJECT (buf, "bytes currently stored, cea608-1:%u, cea608-2:%u " + "ccp:%u", buf->cea608_1->len, buf->cea608_2->len, buf->cc_data->len); +} + +void +cc_buffer_take_cc_data (CCBuffer * buf, + const struct cdp_fps_entry *fps_entry, guint8 * cc_data, + guint * cc_data_len) +{ + guint write_cea608_1_size, write_cea608_2_size, write_ccp_size; + guint field1_padding, field2_padding; + gboolean wrote_first; + + cc_buffer_get_out_sizes (buf, fps_entry, &write_cea608_1_size, + &field1_padding, &write_cea608_2_size, &field2_padding, &write_ccp_size); + + { + guint cea608_1_i = 0, cea608_2_i = 0; + guint out_i = 0; + guint8 *cea608_1 = (guint8 *) buf->cea608_1->data; + guint8 *cea608_2 = (guint8 *) buf->cea608_2->data; + guint cea608_output_count = + write_cea608_1_size + write_cea608_2_size + field1_padding + + field2_padding; + + wrote_first = !buf->last_cea608_written_was_field1; + while (cea608_1_i + cea608_2_i < cea608_output_count) { + if (wrote_first) { + if (cea608_1_i < write_cea608_1_size) { + cc_dataout_i++ = 0xfc; + cc_dataout_i++ = cea608_1cea608_1_i; + cc_dataout_i++ = cea608_1cea608_1_i + 1; + cea608_1_i += 2; + buf->last_cea608_written_was_field1 = TRUE; + } else if (cea608_1_i < write_cea608_1_size + field1_padding) { + cc_dataout_i++ = 0xf8; + cc_dataout_i++ = 0x80; + cc_dataout_i++ = 0x80; + cea608_1_i += 2; + buf->last_cea608_written_was_field1 = TRUE; + } + } + + if (cea608_2_i < write_cea608_2_size) { + cc_dataout_i++ = 0xfd; + cc_dataout_i++ = cea608_2cea608_2_i; + cc_dataout_i++ = cea608_2cea608_2_i + 1; + cea608_2_i += 2; + buf->last_cea608_written_was_field1 = FALSE; + } else if (cea608_2_i < write_cea608_2_size + field2_padding) { + cc_dataout_i++ = 0xf9; + cc_dataout_i++ = 0x80; + cc_dataout_i++ = 0x80; + cea608_2_i += 2; + buf->last_cea608_written_was_field1 = FALSE; + } + + wrote_first = TRUE; + } + + if (write_ccp_size > 0) + memcpy (&cc_dataout_i, buf->cc_data->data, write_ccp_size); + *cc_data_len = out_i + write_ccp_size; + } + + g_array_remove_range (buf->cea608_1, 0, write_cea608_1_size); + g_array_remove_range (buf->cea608_2, 0, write_cea608_2_size); + g_array_remove_range (buf->cc_data, 0, write_ccp_size); + + GST_LOG_OBJECT (buf, "bytes currently stored, cea608-1:%u, cea608-2:%u " + "ccp:%u", buf->cea608_1->len, buf->cea608_2->len, buf->cc_data->len); +} + +void +cc_buffer_take_cea608_field1 (CCBuffer * buf, + const struct cdp_fps_entry *fps_entry, guint8 * cea608_1, + guint * cea608_1_len) +{ + guint write_cea608_1_size, field1_padding; + guint write_cea608_2_size, field2_padding; + guint cc_data_len; + + cc_buffer_get_out_sizes (buf, fps_entry, &write_cea608_1_size, + &field1_padding, &write_cea608_2_size, &field2_padding, &cc_data_len); + + if (*cea608_1_len < write_cea608_1_size + field1_padding) { + GST_WARNING_OBJECT (buf, + "Not enough output space to write cea608 field 1 data"); + *cea608_1_len = 0; + return; + } + + if (write_cea608_1_size > 0) { + memcpy (cea608_1, buf->cea608_1->data, write_cea608_1_size); + g_array_remove_range (buf->cea608_1, 0, write_cea608_1_size); + } + *cea608_1_len = write_cea608_1_size; + if (buf->output_padding && field1_padding > 0) { + memset (&cea608_1write_cea608_1_size, 0x80, field1_padding); + *cea608_1_len += field1_padding; + } +} + +void +cc_buffer_take_cea608_field2 (CCBuffer * buf, + const struct cdp_fps_entry *fps_entry, guint8 * cea608_2, + guint * cea608_2_len) +{ + guint write_cea608_1_size, field1_padding; + guint write_cea608_2_size, field2_padding; + guint cc_data_len; + + cc_buffer_get_out_sizes (buf, fps_entry, &write_cea608_1_size, + &field1_padding, &write_cea608_2_size, &field2_padding, &cc_data_len); + + if (*cea608_2_len < write_cea608_2_size + field2_padding) { + GST_WARNING_OBJECT (buf, + "Not enough output space to write cea608 field 2 data"); + *cea608_2_len = 0; + return; + } + + if (write_cea608_2_size > 0) { + memcpy (cea608_2, buf->cea608_2->data, write_cea608_2_size); + g_array_remove_range (buf->cea608_2, 0, write_cea608_2_size); + } + *cea608_2_len = write_cea608_2_size; + if (buf->output_padding && field1_padding > 0) { + memset (&cea608_2write_cea608_2_size, 0x80, field2_padding); + *cea608_2_len += field2_padding; + } +} + +gboolean +cc_buffer_is_empty (CCBuffer * buf) +{ + return buf->cea608_1->len == 0 && buf->cea608_2->len == 0 + && buf->cc_data->len == 0; +} + +void +cc_buffer_set_max_buffer_time (CCBuffer * buf, GstClockTime max_time) +{ + buf->max_buffer_time = max_time; +} + +void +cc_buffer_set_output_padding (CCBuffer * buf, gboolean output_padding) +{ + buf->output_padding = output_padding; +}
View file
gst-plugins-bad-1.22.0.tar.xz/ext/closedcaption/ccutils.h
Added
@@ -0,0 +1,136 @@ +/* + * GStreamer + * Copyright (C) 2022 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include <gst/gst.h> +#include <gst/video/video.h> + +#ifndef __CCUTILS_H__ +#define __CCUTILS_H__ + +G_BEGIN_DECLS + +GST_DEBUG_CATEGORY_EXTERN(ccutils_debug_cat); + +struct cdp_fps_entry +{ + guint8 fps_idx; /* value stored in cdp */ + guint fps_n, fps_d; + guint max_cc_count; + guint max_ccp_count; + guint max_cea608_count; +}; + +G_GNUC_INTERNAL +const struct cdp_fps_entry * cdp_fps_entry_from_fps (guint fps_n, guint fps_d); +G_GNUC_INTERNAL +const struct cdp_fps_entry * cdp_fps_entry_from_id (guint8 id); + +extern const struct cdp_fps_entry null_fps_entry; + +typedef enum { + GST_CC_CDP_MODE_TIME_CODE = (1<<0), + GST_CC_CDP_MODE_CC_DATA = (1<<1), + GST_CC_CDP_MODE_CC_SVC_INFO = (1<<2) +} GstCCCDPMode; + +G_GNUC_INTERNAL +guint convert_cea708_cc_data_to_cdp (GstObject * dbg_obj, + GstCCCDPMode cdp_mode, + guint16 cdp_hdr_sequence_cntr, + const guint8 * cc_data, + guint cc_data_len, + guint8 * cdp, + guint cdp_len, + const GstVideoTimeCode * tc, + const struct cdp_fps_entry *fps_entry); + +G_GNUC_INTERNAL +guint convert_cea708_cdp_to_cc_data (GstObject * dbg_obj, + const guint8 * cdp, + guint cdp_len, + guint8 *cc_data, + GstVideoTimeCode * tc, + const struct cdp_fps_entry **out_fps_entry); +G_GNUC_INTERNAL +gint drop_ccp_from_cc_data (guint8 * cc_data, + guint cc_data_len); + +#define MAX_CDP_PACKET_LEN 256 +#define MAX_CEA608_LEN 32 + +G_DECLARE_FINAL_TYPE (CCBuffer, cc_buffer, GST, CC_BUFFER, GObject); + +G_GNUC_INTERNAL +CCBuffer * cc_buffer_new (void); +G_GNUC_INTERNAL +void cc_buffer_get_stored_size (CCBuffer * buf, + guint * cea608_1_len, + guint * cea608_2_len, + guint * cc_data_len); +G_GNUC_INTERNAL +gboolean cc_buffer_push_separated (CCBuffer * buf, + const guint8 * cea608_1, + guint cea608_1_len, + const guint8 * cea608_2, + guint cea608_2_len, + const guint8 * cc_data, + guint cc_data_len); +G_GNUC_INTERNAL +gboolean cc_buffer_push_cc_data (CCBuffer * buf, + const guint8 * cc_data, + guint cc_data_len); +G_GNUC_INTERNAL +void cc_buffer_take_cc_data (CCBuffer * buf, + const struct cdp_fps_entry * fps_entry, + guint8 * cc_data, + guint * cc_data_len); +G_GNUC_INTERNAL +void cc_buffer_take_separated (CCBuffer * buf, + const struct cdp_fps_entry * fps_entry, + guint8 * cea608_1, + guint * cea608_1_len, + guint8 * cea608_2, + guint * cea608_2_len, + guint8 * cc_data, + guint * cc_data_len); +G_GNUC_INTERNAL +void cc_buffer_take_cea608_field1 (CCBuffer * buf, + const struct cdp_fps_entry * fps_entry, + guint8 * cea608_1, + guint * cea608_1_len); +G_GNUC_INTERNAL +void cc_buffer_take_cea608_field2 (CCBuffer * buf, + const struct cdp_fps_entry * fps_entry, + guint8 * cea608_2, + guint * cea608_2_len); +G_GNUC_INTERNAL +gboolean cc_buffer_is_empty (CCBuffer * buf); +G_GNUC_INTERNAL +void cc_buffer_discard (CCBuffer * buf); +G_GNUC_INTERNAL +void cc_buffer_set_max_buffer_time (CCBuffer * buf, + GstClockTime max_time); +G_GNUC_INTERNAL +void cc_buffer_set_output_padding (CCBuffer * buf, + gboolean output_padding); + +G_END_DECLS + +#endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/closedcaption/gstcccombiner.c -> gst-plugins-bad-1.22.0.tar.xz/ext/closedcaption/gstcccombiner.c
Changed
@@ -28,6 +28,7 @@ #include <gst/video/video.h> #include <string.h> +#include "ccutils.h" #include "gstcccombiner.h" GST_DEBUG_CATEGORY_STATIC (gst_cc_combiner_debug); @@ -60,11 +61,13 @@ { PROP_0, PROP_SCHEDULE, + PROP_OUTPUT_PADDING, PROP_MAX_SCHEDULED, }; #define DEFAULT_MAX_SCHEDULED 30 #define DEFAULT_SCHEDULE TRUE +#define DEFAULT_OUTPUT_PADDING TRUE typedef struct { @@ -86,235 +89,49 @@ } static void -clear_scheduled (CaptionQueueItem * item) -{ - gst_buffer_unref (item->buffer); -} - -static void gst_cc_combiner_finalize (GObject * object) { GstCCCombiner *self = GST_CCCOMBINER (object); - gst_queue_array_free (self->scheduled0); - gst_queue_array_free (self->scheduled1); g_array_unref (self->current_frame_captions); self->current_frame_captions = NULL; + gst_clear_object (&self->cc_buffer); + G_OBJECT_CLASS (parent_class)->finalize (object); } #define GST_FLOW_NEED_DATA GST_FLOW_CUSTOM_SUCCESS -static const guint8 * -extract_cdp (const guint8 * cdp, guint cdp_len, guint * cc_data_len) +static guint +extract_cdp (GstCCCombiner * self, const guint8 * cdp, guint cdp_len, + guint8 * cc_data) { - GstByteReader br; - guint16 u16; - guint8 u8; - guint8 flags; - guint len = 0; - const guint8 *cc_data = NULL; - - *cc_data_len = 0; - - /* Header + footer length */ - if (cdp_len < 11) { - goto done; - } - - gst_byte_reader_init (&br, cdp, cdp_len); - u16 = gst_byte_reader_get_uint16_be_unchecked (&br); - if (u16 != 0x9669) { - goto done; - } - - u8 = gst_byte_reader_get_uint8_unchecked (&br); - if (u8 != cdp_len) { - goto done; - } - - gst_byte_reader_skip_unchecked (&br, 1); - - flags = gst_byte_reader_get_uint8_unchecked (&br); - - /* No cc_data? */ - if ((flags & 0x40) == 0) { - goto done; - } - - /* cdp_hdr_sequence_cntr */ - gst_byte_reader_skip_unchecked (&br, 2); - - /* time_code_present */ - if (flags & 0x80) { - if (gst_byte_reader_get_remaining (&br) < 5) { - goto done; - } - gst_byte_reader_skip_unchecked (&br, 5); - } - - /* ccdata_present */ - if (flags & 0x40) { - guint8 cc_count; - - if (gst_byte_reader_get_remaining (&br) < 2) { - goto done; - } - u8 = gst_byte_reader_get_uint8_unchecked (&br); - if (u8 != 0x72) { - goto done; - } - - cc_count = gst_byte_reader_get_uint8_unchecked (&br); - if ((cc_count & 0xe0) != 0xe0) { - goto done; - } - cc_count &= 0x1f; - - if (cc_count == 0) - return 0; - - len = 3 * cc_count; - if (gst_byte_reader_get_remaining (&br) < len) - goto done; + const struct cdp_fps_entry *out_fps_entry; + GstVideoTimeCode tc = GST_VIDEO_TIME_CODE_INIT; - cc_data = gst_byte_reader_get_data_unchecked (&br, len); - *cc_data_len = len; - } - -done: - return cc_data; + return convert_cea708_cdp_to_cc_data (GST_OBJECT (self), cdp, cdp_len, + cc_data, &tc, &out_fps_entry); } -#define MAX_CDP_PACKET_LEN 256 #define MAX_CEA608_LEN 32 - -static const struct cdp_fps_entry cdp_fps_table = { - {0x1f, 24000, 1001, 25, 22, 3 /* FIXME: alternating max cea608 count! */ }, - {0x2f, 24, 1, 25, 22, 2}, - {0x3f, 25, 1, 24, 22, 2}, - {0x4f, 30000, 1001, 20, 18, 2}, - {0x5f, 30, 1, 20, 18, 2}, - {0x6f, 50, 1, 12, 11, 1}, - {0x7f, 60000, 1001, 10, 9, 1}, - {0x8f, 60, 1, 10, 9, 1}, -}; -static const struct cdp_fps_entry null_fps_entry = { 0, 0, 0, 0 }; - -static const struct cdp_fps_entry * -cdp_fps_entry_from_fps (guint fps_n, guint fps_d) -{ - int i; - for (i = 0; i < G_N_ELEMENTS (cdp_fps_table); i++) { - if (cdp_fps_tablei.fps_n == fps_n && cdp_fps_tablei.fps_d == fps_d) - return &cdp_fps_tablei; - } - return &null_fps_entry; -} - +#define CDP_MODE (GST_CC_CDP_MODE_CC_DATA | GST_CC_CDP_MODE_TIME_CODE) static GstBuffer * -make_cdp (GstCCCombiner * self, const guint8 * cc_data, guint cc_data_len, - const struct cdp_fps_entry *fps_entry, const GstVideoTimeCode * tc) +make_cdp_buffer (GstCCCombiner * self, const guint8 * cc_data, + guint cc_data_len, const struct cdp_fps_entry *fps_entry, + const GstVideoTimeCode * tc) { - GstByteWriter bw; - guint8 flags, checksum; - guint i, len; + guint len; GstBuffer *ret = gst_buffer_new_allocate (NULL, MAX_CDP_PACKET_LEN, NULL); GstMapInfo map; gst_buffer_map (ret, &map, GST_MAP_WRITE); - gst_byte_writer_init_with_data (&bw, map.data, MAX_CDP_PACKET_LEN, FALSE); - gst_byte_writer_put_uint16_be_unchecked (&bw, 0x9669); - /* Write a length of 0 for now */ - gst_byte_writer_put_uint8_unchecked (&bw, 0); - - gst_byte_writer_put_uint8_unchecked (&bw, fps_entry->fps_idx); - - /* caption_service_active */ - flags = 0x02; - - /* ccdata_present */ - flags |= 0x40; - - if (tc && tc->config.fps_n > 0) - flags |= 0x80; - - /* reserved */ - flags |= 0x01; - - gst_byte_writer_put_uint8_unchecked (&bw, flags); - - gst_byte_writer_put_uint16_be_unchecked (&bw, self->cdp_hdr_sequence_cntr); - - if (tc && tc->config.fps_n > 0) { - guint8 u8; - - gst_byte_writer_put_uint8_unchecked (&bw, 0x71); - /* reserved 11 - 2 bits */ - u8 = 0xc0; - /* tens of hours - 2 bits */ - u8 |= ((tc->hours / 10) & 0x3) << 4; - /* units of hours - 4 bits */ - u8 |= (tc->hours % 10) & 0xf; - gst_byte_writer_put_uint8_unchecked (&bw, u8); - - /* reserved 1 - 1 bit */ - u8 = 0x80; - /* tens of minutes - 3 bits */ - u8 |= ((tc->minutes / 10) & 0x7) << 4; - /* units of minutes - 4 bits */ - u8 |= (tc->minutes % 10) & 0xf; - gst_byte_writer_put_uint8_unchecked (&bw, u8); - - /* field flag - 1 bit */ - u8 = tc->field_count < 2 ? 0x00 : 0x80; - /* tens of seconds - 3 bits */ - u8 |= ((tc->seconds / 10) & 0x7) << 4; - /* units of seconds - 4 bits */ - u8 |= (tc->seconds % 10) & 0xf; - gst_byte_writer_put_uint8_unchecked (&bw, u8); - - /* drop frame flag - 1 bit */ - u8 = (tc->config.flags & GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME) ? 0x80 : - 0x00; - /* reserved0 - 1 bit */ - /* tens of frames - 2 bits */ - u8 |= ((tc->frames / 10) & 0x3) << 4; - /* units of frames 4 bits */ - u8 |= (tc->frames % 10) & 0xf; - gst_byte_writer_put_uint8_unchecked (&bw, u8); - } - - gst_byte_writer_put_uint8_unchecked (&bw, 0x72); - gst_byte_writer_put_uint8_unchecked (&bw, 0xe0 | fps_entry->max_cc_count); - gst_byte_writer_put_data_unchecked (&bw, cc_data, cc_data_len); - while (fps_entry->max_cc_count > cc_data_len / 3) { - gst_byte_writer_put_uint8_unchecked (&bw, 0xfa); - gst_byte_writer_put_uint8_unchecked (&bw, 0x00); - gst_byte_writer_put_uint8_unchecked (&bw, 0x00); - cc_data_len += 3; - } - - gst_byte_writer_put_uint8_unchecked (&bw, 0x74); - gst_byte_writer_put_uint16_be_unchecked (&bw, self->cdp_hdr_sequence_cntr); + len = convert_cea708_cc_data_to_cdp (GST_OBJECT (self), CDP_MODE, + self->cdp_hdr_sequence_cntr, cc_data, cc_data_len, map.data, map.size, + tc, fps_entry); self->cdp_hdr_sequence_cntr++; - /* We calculate the checksum afterwards */ - gst_byte_writer_put_uint8_unchecked (&bw, 0); - - len = gst_byte_writer_get_pos (&bw); - gst_byte_writer_set_pos (&bw, 2); - gst_byte_writer_put_uint8_unchecked (&bw, len); - - checksum = 0; - for (i = 0; i < len; i++) { - checksum += map.datai; - } - checksum &= 0xff; - checksum = 256 - checksum; - map.datalen - 1 = checksum; gst_buffer_unmap (ret, &map); @@ -324,157 +141,79 @@ } static GstBuffer * -make_padding (GstCCCombiner * self, const GstVideoTimeCode * tc, guint field) +make_buffer (GstCCCombiner * self, const guint8 * cc_data, guint cc_data_len) { - GstBuffer *ret = NULL; - - switch (self->caption_type) { - case GST_VIDEO_CAPTION_TYPE_CEA708_CDP: - { - const guint8 cc_data6 = { 0xfc, 0x80, 0x80, 0xf9, 0x80, 0x80 }; - - ret = make_cdp (self, cc_data, 6, self->cdp_fps_entry, tc); - break; - } - case GST_VIDEO_CAPTION_TYPE_CEA708_RAW: - { - GstMapInfo map; - - ret = gst_buffer_new_allocate (NULL, 3, NULL); - - gst_buffer_map (ret, &map, GST_MAP_WRITE); - - map.data0 = 0xfc | (field & 0x01); - map.data1 = 0x80; - map.data2 = 0x80; - - gst_buffer_unmap (ret, &map); - break; - } - case GST_VIDEO_CAPTION_TYPE_CEA608_S334_1A: - { - GstMapInfo map; - - ret = gst_buffer_new_allocate (NULL, 3, NULL); - - gst_buffer_map (ret, &map, GST_MAP_WRITE); - - map.data0 = field == 0 ? 0x80 : 0x00; - map.data1 = 0x80; - map.data2 = 0x80; + GstBuffer *ret = gst_buffer_new_allocate (NULL, cc_data_len, NULL); + gst_buffer_fill (ret, 0, cc_data, cc_data_len); + return ret; +} - gst_buffer_unmap (ret, &map); - break; - } - case GST_VIDEO_CAPTION_TYPE_CEA608_RAW: - { - GstMapInfo map; +static void +write_cc_data_to (GstCCCombiner * self, GstBuffer * buffer) +{ + GstMapInfo map; + guint len; - ret = gst_buffer_new_allocate (NULL, 2, NULL); + gst_buffer_map (buffer, &map, GST_MAP_WRITE); + len = map.size; + cc_buffer_take_cc_data (self->cc_buffer, self->cdp_fps_entry, map.data, &len); + gst_buffer_unmap (buffer, &map); + gst_buffer_set_size (buffer, len); +} - gst_buffer_map (ret, &map, GST_MAP_WRITE); +static void +prepend_s334_to_cea608 (guint field, guint8 * data, guint * len, + guint alloc_len) +{ + int i; - map.data0 = 0x80; - map.data1 = 0x80; + g_assert (*len / 2 * 3 <= alloc_len); - gst_buffer_unmap (ret, &map); - break; - } - default: - break; + for (i = *len / 2; i >= 0; i--) { + datai * 3 + 0 = field == 0 ? 0x80 : 0x00; + datai * 3 + 1 = datai * 2 + 0; + datai * 3 + 2 = datai * 2 + 1; } - - return ret; } static void -queue_caption (GstCCCombiner * self, GstBuffer * scheduled, guint field) +take_s334_both_fields (GstCCCombiner * self, GstBuffer * buffer) { - GstAggregatorPad *caption_pad; - CaptionQueueItem item; - - if (self->progressive && field == 1) { - gst_buffer_unref (scheduled); - return; + GstMapInfo out = GST_MAP_INFO_INIT; + guint s334_len, cc_data_len, i; + + gst_buffer_map (buffer, &out, GST_MAP_READWRITE); + + cc_data_len = out.size; + cc_buffer_take_cc_data (self->cc_buffer, self->cdp_fps_entry, out.data, + &cc_data_len); + s334_len = drop_ccp_from_cc_data (out.data, cc_data_len); + if (s334_len < 0) { + s334_len = 0; + goto out; } - caption_pad = - GST_AGGREGATOR_PAD_CAST (gst_element_get_static_pad (GST_ELEMENT_CAST - (self), "caption")); - - g_assert (gst_queue_array_get_length (self->scheduledfield) <= - self->max_scheduled); - - if (gst_queue_array_get_length (self->scheduledfield) == - self->max_scheduled) { - CaptionQueueItem *dropped = - gst_queue_array_pop_tail_struct (self->scheduledfield); - - GST_WARNING_OBJECT (self, - "scheduled queue runs too long, dropping %" GST_PTR_FORMAT, dropped); - - gst_element_post_message (GST_ELEMENT_CAST (self), - gst_message_new_qos (GST_OBJECT_CAST (self), FALSE, - dropped->running_time, dropped->stream_time, - GST_BUFFER_PTS (dropped->buffer), GST_BUFFER_DURATION (dropped))); - - gst_buffer_unref (dropped->buffer); + for (i = 0; i < s334_len / 3; i++) { + guint byte = out.datai * 3; + /* We have to assume a line offset of 0 */ + out.datai * 3 = (byte == 0xfc || byte == 0xf8) ? 0x80 : 0x00; } - gst_object_unref (caption_pad); - - item.buffer = scheduled; - item.running_time = - gst_segment_to_running_time (&caption_pad->segment, GST_FORMAT_TIME, - GST_BUFFER_PTS (scheduled)); - item.stream_time = - gst_segment_to_stream_time (&caption_pad->segment, GST_FORMAT_TIME, - GST_BUFFER_PTS (scheduled)); - - gst_queue_array_push_tail_struct (self->scheduledfield, &item); +out: + gst_buffer_unmap (buffer, &out); + gst_buffer_set_size (buffer, s334_len); } static void schedule_cdp (GstCCCombiner * self, const GstVideoTimeCode * tc, const guint8 * data, guint len, GstClockTime pts, GstClockTime duration) { - const guint8 *cc_data; + guint8 cc_dataMAX_CDP_PACKET_LEN; guint cc_data_len; - gboolean inject = FALSE; - - if ((cc_data = extract_cdp (data, len, &cc_data_len))) { - guint8 i; - - for (i = 0; i < cc_data_len / 3; i++) { - gboolean cc_valid = (cc_datai * 3 & 0x04) == 0x04; - guint8 cc_type = cc_datai * 3 & 0x03; - - if (!cc_valid) - continue; - - if (cc_type == 0x00 || cc_type == 0x01) { - if (cc_datai * 3 + 1 != 0x80 || cc_datai * 3 + 2 != 0x80) { - inject = TRUE; - break; - } - continue; - } else { - inject = TRUE; - break; - } - } - } - - if (inject) { - GstBuffer *buf = - make_cdp (self, cc_data, cc_data_len, self->cdp_fps_entry, tc); - - /* We only set those for QoS reporting purposes */ - GST_BUFFER_PTS (buf) = pts; - GST_BUFFER_DURATION (buf) = duration; - queue_caption (self, buf, 0); - } + cc_data_len = extract_cdp (self, data, len, cc_data); + if (cc_buffer_push_cc_data (self->cc_buffer, cc_data, cc_data_len)) + self->current_scheduled++; } static void @@ -484,7 +223,6 @@ guint8 field0_data3, field1_data3; guint field0_len = 0, field1_len = 0; guint i; - gboolean field0_608 = FALSE, field1_608 = FALSE; if (len % 3 != 0) { GST_WARNING ("Invalid cc_data buffer size %u. Truncating to a multiple " @@ -494,158 +232,40 @@ for (i = 0; i < len / 3; i++) { if (datai * 3 & 0x80) { - if (field0_608) - continue; - - field0_608 = TRUE; - if (datai * 3 + 1 == 0x80 && datai * 3 + 2 == 0x80) continue; - field0_datafield0_len++ = datai * 3; field0_datafield0_len++ = datai * 3 + 1; field0_datafield0_len++ = datai * 3 + 2; } else { - if (field1_608) - continue; - - field1_608 = TRUE; - if (datai * 3 + 1 == 0x80 && datai * 3 + 2 == 0x80) continue; - field1_datafield1_len++ = datai * 3; field1_datafield1_len++ = datai * 3 + 1; field1_datafield1_len++ = datai * 3 + 2; } } - if (field0_len > 0) { - GstBuffer *buf = gst_buffer_new_allocate (NULL, field0_len, NULL); - - gst_buffer_fill (buf, 0, field0_data, field0_len); - GST_BUFFER_PTS (buf) = pts; - GST_BUFFER_DURATION (buf) = duration; - - queue_caption (self, buf, 0); - } - - if (field1_len > 0) { - GstBuffer *buf = gst_buffer_new_allocate (NULL, field1_len, NULL); - - gst_buffer_fill (buf, 0, field1_data, field1_len); - GST_BUFFER_PTS (buf) = pts; - GST_BUFFER_DURATION (buf) = duration; - - queue_caption (self, buf, 1); - } + if (cc_buffer_push_separated (self->cc_buffer, field0_data, field0_len, + field1_data, field1_len, NULL, 0)) + self->current_scheduled++; } static void schedule_cea708_raw (GstCCCombiner * self, guint8 * data, guint len, GstClockTime pts, GstClockTime duration) { - guint8 field0_dataMAX_CDP_PACKET_LEN, field1_data3; - guint field0_len = 0, field1_len = 0; - guint i; - gboolean field0_608 = FALSE, field1_608 = FALSE; - gboolean started_ccp = FALSE; - - if (len % 3 != 0) { - GST_WARNING ("Invalid cc_data buffer size %u. Truncating to a multiple " - "of 3", len); - len = len - (len % 3); - } - - for (i = 0; i < len / 3; i++) { - gboolean cc_valid = (datai * 3 & 0x04) == 0x04; - guint8 cc_type = datai * 3 & 0x03; - - if (!started_ccp) { - if (cc_type == 0x00) { - if (!cc_valid) - continue; - - if (field0_608) - continue; - - field0_608 = TRUE; - - if (datai * 3 + 1 == 0x80 && datai * 3 + 2 == 0x80) - continue; - - field0_datafield0_len++ = datai * 3; - field0_datafield0_len++ = datai * 3 + 1; - field0_datafield0_len++ = datai * 3 + 2; - } else if (cc_type == 0x01) { - if (!cc_valid) - continue; - - if (field1_608) - continue; - - field1_608 = TRUE; - - if (datai * 3 + 1 == 0x80 && datai * 3 + 2 == 0x80) - continue; - - field1_datafield1_len++ = datai * 3; - field1_datafield1_len++ = datai * 3 + 1; - field1_datafield1_len++ = datai * 3 + 2; - } - - continue; - } - - if (cc_type & 0x10) - started_ccp = TRUE; - - if (!cc_valid) - continue; - - if (cc_type == 0x00 || cc_type == 0x01) - continue; - - field0_datafield0_len++ = datai * 3; - field0_datafield0_len++ = datai * 3 + 1; - field0_datafield0_len++ = datai * 3 + 2; - } - - if (field0_len > 0) { - GstBuffer *buf = gst_buffer_new_allocate (NULL, field0_len, NULL); - - gst_buffer_fill (buf, 0, field0_data, field0_len); - GST_BUFFER_PTS (buf) = pts; - GST_BUFFER_DURATION (buf) = duration; - - queue_caption (self, buf, 0); - } - - if (field1_len > 0) { - GstBuffer *buf = gst_buffer_new_allocate (NULL, field1_len, NULL); - - gst_buffer_fill (buf, 0, field1_data, field1_len); - GST_BUFFER_PTS (buf) = pts; - GST_BUFFER_DURATION (buf) = duration; - - queue_caption (self, buf, 1); - } + if (cc_buffer_push_cc_data (self->cc_buffer, data, len)) + self->current_scheduled++; } static void -schedule_cea608_raw (GstCCCombiner * self, guint8 * data, guint len, - GstBuffer * buffer) +schedule_cea608_raw (GstCCCombiner * self, guint8 * data, guint len) { - if (len < 2) { - return; - } - - if (data0 != 0x80 || data1 != 0x80) { - queue_caption (self, gst_buffer_ref (buffer), 0); - } + if (cc_buffer_push_separated (self->cc_buffer, data, len, NULL, 0, NULL, 0)) + self->current_scheduled++; } - static void schedule_caption (GstCCCombiner * self, GstBuffer * caption_buf, const GstVideoTimeCode * tc) @@ -656,6 +276,34 @@ pts = GST_BUFFER_PTS (caption_buf); duration = GST_BUFFER_DURATION (caption_buf); + if (self->current_scheduled + 1 >= self->max_scheduled) { + GstClockTime stream_time, running_time; + GstAggregatorPad *caption_pad; + + caption_pad = + GST_AGGREGATOR_PAD_CAST (gst_element_get_static_pad (GST_ELEMENT_CAST + (self), "caption")); + + GST_WARNING_OBJECT (self, + "scheduled queue runs too long, discarding stored"); + + running_time = + gst_segment_to_running_time (&caption_pad->segment, GST_FORMAT_TIME, + pts); + stream_time = + gst_segment_to_stream_time (&caption_pad->segment, GST_FORMAT_TIME, + pts); + + gst_element_post_message (GST_ELEMENT_CAST (self), + gst_message_new_qos (GST_OBJECT_CAST (self), FALSE, + running_time, stream_time, pts, duration)); + + cc_buffer_discard (self->cc_buffer); + self->current_scheduled = 0; + + gst_clear_object (&caption_pad); + } + gst_buffer_map (caption_buf, &map, GST_MAP_READ); switch (self->caption_type) { @@ -669,7 +317,7 @@ schedule_cea608_s334_1a (self, map.data, map.size, pts, duration); break; case GST_VIDEO_CAPTION_TYPE_CEA608_RAW: - schedule_cea608_raw (self, map.data, map.size, caption_buf); + schedule_cea608_raw (self, map.data, map.size); break; default: break; @@ -679,54 +327,120 @@ } static void -dequeue_caption_one_field (GstCCCombiner * self, const GstVideoTimeCode * tc, - guint field, gboolean drain) +dequeue_caption (GstCCCombiner * self, GstVideoTimeCode * tc, gboolean drain) { - CaptionQueueItem *scheduled; + guint8 cea608_1MAX_CEA608_LEN, cea608_2MAX_CEA608_LEN; + guint8 cc_dataMAX_CDP_PACKET_LEN; + guint cea608_1_len = MAX_CEA608_LEN, cea608_2_len = MAX_CEA608_LEN; + guint cc_data_len = MAX_CDP_PACKET_LEN; CaptionData caption_data; - if ((scheduled = gst_queue_array_pop_head_struct (self->scheduledfield))) { - caption_data.buffer = scheduled->buffer; - caption_data.caption_type = self->caption_type; - g_array_append_val (self->current_frame_captions, caption_data); - } else if (!drain) { - caption_data.caption_type = self->caption_type; - caption_data.buffer = make_padding (self, tc, field); - g_array_append_val (self->current_frame_captions, caption_data); - } -} - -static void -dequeue_caption_both_fields (GstCCCombiner * self, const GstVideoTimeCode * tc, - gboolean drain) -{ - CaptionQueueItem *field0_scheduled, *field1_scheduled; - GstBuffer *field0_buffer, *field1_buffer; - CaptionData caption_data; - - field0_scheduled = gst_queue_array_pop_head_struct (self->scheduled0); - field1_scheduled = gst_queue_array_pop_head_struct (self->scheduled1); + g_assert (self->current_frame_captions->len == 0); - if (drain && !field0_scheduled && !field1_scheduled) { + if (drain && cc_buffer_is_empty (self->cc_buffer)) return; - } - - if (field0_scheduled) { - field0_buffer = field0_scheduled->buffer; - } else { - field0_buffer = make_padding (self, tc, 0); - } - - if (field1_scheduled) { - field1_buffer = field1_scheduled->buffer; - } else { - field1_buffer = make_padding (self, tc, 1); - } caption_data.caption_type = self->caption_type; - caption_data.buffer = gst_buffer_append (field0_buffer, field1_buffer); - - g_array_append_val (self->current_frame_captions, caption_data); + switch (self->caption_type) { + case GST_VIDEO_CAPTION_TYPE_CEA708_CDP: + { + /* Only relevant in alternate and mixed mode, no need to look at the caps */ + if (GST_BUFFER_FLAG_IS_SET (self->current_video_buffer, + GST_VIDEO_BUFFER_FLAG_INTERLACED)) { + if (!GST_VIDEO_BUFFER_IS_BOTTOM_FIELD (self->current_video_buffer)) { + cc_buffer_take_cc_data (self->cc_buffer, self->cdp_fps_entry, cc_data, + &cc_data_len); + caption_data.buffer = + make_cdp_buffer (self, cc_data, cc_data_len, self->cdp_fps_entry, + tc); + g_array_append_val (self->current_frame_captions, caption_data); + } + } else { + cc_buffer_take_cc_data (self->cc_buffer, self->cdp_fps_entry, cc_data, + &cc_data_len); + caption_data.buffer = + make_cdp_buffer (self, cc_data, cc_data_len, self->cdp_fps_entry, + tc); + g_array_append_val (self->current_frame_captions, caption_data); + } + break; + } + case GST_VIDEO_CAPTION_TYPE_CEA708_RAW: + { + /* Only relevant in alternate and mixed mode, no need to look at the caps */ + if (GST_BUFFER_FLAG_IS_SET (self->current_video_buffer, + GST_VIDEO_BUFFER_FLAG_INTERLACED)) { + if (!GST_VIDEO_BUFFER_IS_BOTTOM_FIELD (self->current_video_buffer)) { + caption_data.buffer = + gst_buffer_new_allocate (NULL, MAX_CDP_PACKET_LEN, NULL); + write_cc_data_to (self, caption_data.buffer); + g_array_append_val (self->current_frame_captions, caption_data); + } + } else { + caption_data.buffer = + gst_buffer_new_allocate (NULL, MAX_CDP_PACKET_LEN, NULL); + write_cc_data_to (self, caption_data.buffer); + g_array_append_val (self->current_frame_captions, caption_data); + } + break; + } + case GST_VIDEO_CAPTION_TYPE_CEA608_S334_1A: + { + if (self->progressive) { + cc_buffer_take_separated (self->cc_buffer, self->cdp_fps_entry, + cea608_1, &cea608_1_len, cea608_2, &cea608_2_len, cc_data, + &cc_data_len); + prepend_s334_to_cea608 (0, cea608_1, &cea608_1_len, sizeof (cea608_1)); + caption_data.buffer = make_buffer (self, cea608_1, cea608_1_len); + g_array_append_val (self->current_frame_captions, caption_data); + } else if (GST_BUFFER_FLAG_IS_SET (self->current_video_buffer, + GST_VIDEO_BUFFER_FLAG_INTERLACED) && + GST_BUFFER_FLAG_IS_SET (self->current_video_buffer, + GST_VIDEO_BUFFER_FLAG_ONEFIELD)) { + cc_buffer_take_separated (self->cc_buffer, self->cdp_fps_entry, + cea608_1, &cea608_1_len, cea608_2, &cea608_2_len, cc_data, + &cc_data_len); + if (GST_VIDEO_BUFFER_IS_TOP_FIELD (self->current_video_buffer)) { + prepend_s334_to_cea608 (0, cea608_1, &cea608_1_len, + sizeof (cea608_1)); + caption_data.buffer = make_buffer (self, cea608_1, cea608_1_len); + } else { + prepend_s334_to_cea608 (1, cea608_2, &cea608_2_len, + sizeof (cea608_2)); + caption_data.buffer = make_buffer (self, cea608_2, cea608_2_len); + } + g_array_append_val (self->current_frame_captions, caption_data); + } else { + caption_data.buffer = + gst_buffer_new_allocate (NULL, MAX_CDP_PACKET_LEN, NULL); + take_s334_both_fields (self, caption_data.buffer); + g_array_append_val (self->current_frame_captions, caption_data); + } + break; + } + case GST_VIDEO_CAPTION_TYPE_CEA608_RAW: + { + cc_buffer_take_separated (self->cc_buffer, self->cdp_fps_entry, + cea608_1, &cea608_1_len, cea608_2, &cea608_2_len, cc_data, + &cc_data_len); + if (self->progressive) { + caption_data.buffer = make_buffer (self, cea608_1, cea608_1_len); + g_array_append_val (self->current_frame_captions, caption_data); + } else if (GST_BUFFER_FLAG_IS_SET (self->current_video_buffer, + GST_VIDEO_BUFFER_FLAG_INTERLACED)) { + if (!GST_VIDEO_BUFFER_IS_BOTTOM_FIELD (self->current_video_buffer)) { + caption_data.buffer = make_buffer (self, cea608_1, cea608_1_len); + g_array_append_val (self->current_frame_captions, caption_data); + } + } else { + caption_data.buffer = make_buffer (self, cea608_1, cea608_1_len); + g_array_append_val (self->current_frame_captions, caption_data); + } + break; + } + default: + break; + } } static GstFlowReturn @@ -876,60 +590,8 @@ } } while (TRUE); - /* FIXME pad correctly according to fps */ if (self->schedule) { - g_assert (self->current_frame_captions->len == 0); - - switch (self->caption_type) { - case GST_VIDEO_CAPTION_TYPE_CEA708_CDP: - { - /* Only relevant in alternate and mixed mode, no need to look at the caps */ - if (GST_BUFFER_FLAG_IS_SET (self->current_video_buffer, - GST_VIDEO_BUFFER_FLAG_INTERLACED)) { - if (!GST_VIDEO_BUFFER_IS_BOTTOM_FIELD (self->current_video_buffer)) { - dequeue_caption_one_field (self, tc, 0, caption_pad_is_eos); - } - } else { - dequeue_caption_one_field (self, tc, 0, caption_pad_is_eos); - } - break; - } - case GST_VIDEO_CAPTION_TYPE_CEA708_RAW: - case GST_VIDEO_CAPTION_TYPE_CEA608_S334_1A: - { - if (self->progressive) { - dequeue_caption_one_field (self, tc, 0, caption_pad_is_eos); - } else if (GST_BUFFER_FLAG_IS_SET (self->current_video_buffer, - GST_VIDEO_BUFFER_FLAG_INTERLACED) && - GST_BUFFER_FLAG_IS_SET (self->current_video_buffer, - GST_VIDEO_BUFFER_FLAG_ONEFIELD)) { - if (GST_VIDEO_BUFFER_IS_TOP_FIELD (self->current_video_buffer)) { - dequeue_caption_one_field (self, tc, 0, caption_pad_is_eos); - } else { - dequeue_caption_one_field (self, tc, 1, caption_pad_is_eos); - } - } else { - dequeue_caption_both_fields (self, tc, caption_pad_is_eos); - } - break; - } - case GST_VIDEO_CAPTION_TYPE_CEA608_RAW: - { - if (self->progressive) { - dequeue_caption_one_field (self, tc, 0, caption_pad_is_eos); - } else if (GST_BUFFER_FLAG_IS_SET (self->current_video_buffer, - GST_VIDEO_BUFFER_FLAG_INTERLACED)) { - if (!GST_VIDEO_BUFFER_IS_BOTTOM_FIELD (self->current_video_buffer)) { - dequeue_caption_one_field (self, tc, 0, caption_pad_is_eos); - } - } else { - dequeue_caption_one_field (self, tc, 0, caption_pad_is_eos); - } - break; - } - default: - break; - } + dequeue_caption (self, tc, caption_pad_is_eos); } gst_aggregator_selected_samples (GST_AGGREGATOR_CAST (self), @@ -943,6 +605,9 @@ if (self->current_frame_captions->len > 0) { guint i; + if (self->schedule) + self->current_scheduled = MAX (1, self->current_scheduled) - 1; + video_buf = gst_buffer_make_writable (self->current_video_buffer); self->current_video_buffer = NULL; @@ -1164,6 +829,15 @@ self->video_fps_d = fps_d; self->cdp_fps_entry = cdp_fps_entry_from_fps (fps_n, fps_d); + if (!self->cdp_fps_entry || self->cdp_fps_entry->fps_n == 0) { + GST_WARNING_OBJECT (self, "Missing valid caption framerate in " + "video caps"); + + GST_ELEMENT_WARNING (self, CORE, NEGOTIATION, (NULL), + ("Missing valid caption framerate in video caps")); + + self->cdp_fps_entry = cdp_fps_entry_from_fps (60, 1); + } gst_aggregator_set_src_caps (aggregator, caps); } @@ -1200,8 +874,8 @@ g_array_set_size (self->current_frame_captions, 0); self->caption_type = GST_VIDEO_CAPTION_TYPE_UNKNOWN; - gst_queue_array_clear (self->scheduled0); - gst_queue_array_clear (self->scheduled1); + cc_buffer_discard (self->cc_buffer); + self->current_scheduled = 0; self->cdp_fps_entry = &null_fps_entry; return TRUE; @@ -1223,8 +897,9 @@ src_pad->segment.position = GST_CLOCK_TIME_NONE; self->cdp_hdr_sequence_cntr = 0; - gst_queue_array_clear (self->scheduled0); - gst_queue_array_clear (self->scheduled1); + + cc_buffer_discard (self->cc_buffer); + self->current_scheduled = 0; return GST_FLOW_OK; } @@ -1419,6 +1094,9 @@ case GST_STATE_CHANGE_READY_TO_PAUSED: self->schedule = self->prop_schedule; self->max_scheduled = self->prop_max_scheduled; + self->output_padding = self->prop_output_padding; + cc_buffer_set_max_buffer_time (self->cc_buffer, GST_CLOCK_TIME_NONE); + cc_buffer_set_output_padding (self->cc_buffer, self->prop_output_padding); break; default: break; @@ -1440,6 +1118,9 @@ case PROP_MAX_SCHEDULED: self->prop_max_scheduled = g_value_get_uint (value); break; + case PROP_OUTPUT_PADDING: + self->prop_output_padding = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1459,6 +1140,9 @@ case PROP_MAX_SCHEDULED: g_value_set_uint (value, self->prop_max_scheduled); break; + case PROP_OUTPUT_PADDING: + g_value_set_boolean (value, self->prop_output_padding); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1536,6 +1220,23 @@ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY)); + /** + * GstCCCombiner:output-padding: + * + * When #GstCCCombiner:schedule is %TRUE, this property controls + * whether the output closed caption meta stream will be padded. + * + * Since: 1.22 + */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_OUTPUT_PADDING, g_param_spec_boolean ("output-padding", + "Output padding", + "Whether to output padding packets when schedule=true", + DEFAULT_OUTPUT_PADDING, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_PARAM_MUTABLE_READY)); + + gst_element_class_add_static_pad_template_with_gtype (gstelement_class, &sinktemplate, GST_TYPE_AGGREGATOR_PAD); gst_element_class_add_static_pad_template_with_gtype (gstelement_class, @@ -1585,14 +1286,10 @@ self->prop_schedule = DEFAULT_SCHEDULE; self->prop_max_scheduled = DEFAULT_MAX_SCHEDULED; - self->scheduled0 = - gst_queue_array_new_for_struct (sizeof (CaptionQueueItem), 0); - self->scheduled1 = - gst_queue_array_new_for_struct (sizeof (CaptionQueueItem), 0); - gst_queue_array_set_clear_func (self->scheduled0, - (GDestroyNotify) clear_scheduled); - gst_queue_array_set_clear_func (self->scheduled1, - (GDestroyNotify) clear_scheduled); + self->prop_output_padding = DEFAULT_OUTPUT_PADDING; self->cdp_hdr_sequence_cntr = 0; self->cdp_fps_entry = &null_fps_entry; + + self->cc_buffer = cc_buffer_new (); + cc_buffer_set_max_buffer_time (self->cc_buffer, GST_CLOCK_TIME_NONE); }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/closedcaption/gstcccombiner.h -> gst-plugins-bad-1.22.0.tar.xz/ext/closedcaption/gstcccombiner.h
Changed
@@ -25,6 +25,8 @@ #include <gst/base/base.h> #include <gst/video/video.h> +#include "ccutils.h" + G_BEGIN_DECLS #define GST_TYPE_CCCOMBINER \ (gst_cc_combiner_get_type()) @@ -40,15 +42,6 @@ typedef struct _GstCCCombiner GstCCCombiner; typedef struct _GstCCCombinerClass GstCCCombinerClass; -struct cdp_fps_entry -{ - guint8 fps_idx; - guint fps_n, fps_d; - guint max_cc_count; - guint max_ccp_count; - guint max_cea608_count; -}; - struct _GstCCCombiner { GstAggregator parent; @@ -65,11 +58,14 @@ gboolean prop_schedule; guint prop_max_scheduled; + gboolean prop_output_padding; gboolean schedule; guint max_scheduled; - /* One queue per field */ - GstQueueArray *scheduled2; + gboolean output_padding; + guint current_scheduled; + + CCBuffer *cc_buffer; guint16 cdp_hdr_sequence_cntr; const struct cdp_fps_entry *cdp_fps_entry; };
View file
gst-plugins-bad-1.20.5.tar.xz/ext/closedcaption/gstccconverter.c -> gst-plugins-bad-1.22.0.tar.xz/ext/closedcaption/gstccconverter.c
Changed
@@ -28,6 +28,7 @@ #include <gst/video/video.h> #include <string.h> +#include "ccutils.h" #include "gstccconverter.h" GST_DEBUG_CATEGORY_STATIC (gst_cc_converter_debug); @@ -79,11 +80,11 @@ gst_cc_converter_cdp_mode_get_type (void) { static const GFlagsValue values = { - {GST_CC_CONVERTER_CDP_MODE_TIME_CODE, + {GST_CC_CDP_MODE_TIME_CODE, "Store time code information in CDP packets", "time-code"}, - {GST_CC_CONVERTER_CDP_MODE_CC_DATA, "Store CC data in CDP packets", + {GST_CC_CDP_MODE_CC_DATA, "Store CC data in CDP packets", "cc-data"}, - {GST_CC_CONVERTER_CDP_MODE_CC_SVC_INFO, + {GST_CC_CDP_MODE_CC_SVC_INFO, "Store CC service information in CDP packets", "cc-svc-info"}, {0, NULL, NULL} }; @@ -471,49 +472,6 @@ } } -struct cdp_fps_entry -{ - guint8 fps_idx; - guint fps_n, fps_d; - guint max_cc_count; - guint max_ccp_count; - guint max_cea608_count; -}; - -static const struct cdp_fps_entry cdp_fps_table = { - {0x1f, 24000, 1001, 25, 22, 3 /* FIXME: alternating max cea608 count! */ }, - {0x2f, 24, 1, 25, 22, 2}, - {0x3f, 25, 1, 24, 22, 2}, - {0x4f, 30000, 1001, 20, 18, 2}, - {0x5f, 30, 1, 20, 18, 2}, - {0x6f, 50, 1, 12, 11, 1}, - {0x7f, 60000, 1001, 10, 9, 1}, - {0x8f, 60, 1, 10, 9, 1}, -}; -static const struct cdp_fps_entry null_fps_entry = { 0, 0, 0, 0 }; - -static const struct cdp_fps_entry * -cdp_fps_entry_from_id (guint8 id) -{ - int i; - for (i = 0; i < G_N_ELEMENTS (cdp_fps_table); i++) { - if (cdp_fps_tablei.fps_idx == id) - return &cdp_fps_tablei; - } - return &null_fps_entry; -} - -static const struct cdp_fps_entry * -cdp_fps_entry_from_fps (guint fps_n, guint fps_d) -{ - int i; - for (i = 0; i < G_N_ELEMENTS (cdp_fps_table); i++) { - if (cdp_fps_tablei.fps_n == fps_n && cdp_fps_tablei.fps_d == fps_d) - return &cdp_fps_tablei; - } - return &null_fps_entry; -} - static void get_framerate_output_scale (GstCCConverter * self, const struct cdp_fps_entry *in_fps_entry, gint * scale_n, gint * scale_d) @@ -541,7 +499,6 @@ guint output_frame; GstVideoTimeCodeFlags flags; - g_return_val_if_fail (tc != NULL, FALSE); g_return_val_if_fail (out != NULL, FALSE); /* out_n/d can only be 0 if scale_n/d are 1/1 */ g_return_val_if_fail ((scale_n == 1 && scale_d == 1) || (out_fps_n != 0 @@ -598,878 +555,79 @@ return TRUE; } -/* remove padding bytes from a cc_data packet. Returns the length of the new - * data in @cc_data */ -static guint -compact_cc_data (guint8 * cc_data, guint cc_data_len) -{ - gboolean started_ccp = FALSE; - guint out_len = 0; - guint i; - - if (cc_data_len % 3 != 0) { - GST_WARNING ("Invalid cc_data buffer size"); - cc_data_len = cc_data_len - (cc_data_len % 3); - } - - for (i = 0; i < cc_data_len / 3; i++) { - gboolean cc_valid = (cc_datai * 3 & 0x04) == 0x04; - guint8 cc_type = cc_datai * 3 & 0x03; - - if (!started_ccp && (cc_type == 0x00 || cc_type == 0x01)) { - if (cc_valid) { - /* copy over valid 608 data */ - cc_dataout_len++ = cc_datai * 3; - cc_dataout_len++ = cc_datai * 3 + 1; - cc_dataout_len++ = cc_datai * 3 + 2; - } - continue; - } - - if (cc_type & 0x10) - started_ccp = TRUE; - - if (!cc_valid) - continue; - - if (cc_type == 0x00 || cc_type == 0x01) { - GST_WARNING ("Invalid cc_data. cea608 bytes after cea708"); - return 0; - } - - cc_dataout_len++ = cc_datai * 3; - cc_dataout_len++ = cc_datai * 3 + 1; - cc_dataout_len++ = cc_datai * 3 + 2; - } - - GST_LOG ("compacted cc_data from %u to %u", cc_data_len, out_len); - - return out_len; -} - -static gint -cc_data_extract_cea608 (guint8 * cc_data, guint cc_data_len, - guint8 * cea608_field1, guint * cea608_field1_len, - guint8 * cea608_field2, guint * cea608_field2_len) -{ - guint i, field_1_len = 0, field_2_len = 0; - - if (cea608_field1_len) { - field_1_len = *cea608_field1_len; - *cea608_field1_len = 0; - } - if (cea608_field2_len) { - field_2_len = *cea608_field2_len; - *cea608_field2_len = 0; - } - - if (cc_data_len % 3 != 0) { - GST_WARNING ("Invalid cc_data buffer size %u. Truncating to a multiple " - "of 3", cc_data_len); - cc_data_len = cc_data_len - (cc_data_len % 3); - } - - for (i = 0; i < cc_data_len / 3; i++) { - gboolean cc_valid = (cc_datai * 3 & 0x04) == 0x04; - guint8 cc_type = cc_datai * 3 & 0x03; - - GST_TRACE ("0x%02x 0x%02x 0x%02x, valid: %u, type: 0b%u%u", - cc_datai * 3 + 0, cc_datai * 3 + 1, cc_datai * 3 + 2, cc_valid, - cc_type & 0x2, cc_type & 0x1); - - if (cc_type == 0x00) { - if (!cc_valid) - continue; - - if (cea608_field1 && cea608_field1_len) { - if (*cea608_field1_len + 2 > field_1_len) { - GST_WARNING ("Too many cea608 input bytes %u for field 1", - *cea608_field1_len + 2); - return -1; - } - cea608_field1(*cea608_field1_len)++ = cc_datai * 3 + 1; - cea608_field1(*cea608_field1_len)++ = cc_datai * 3 + 2; - } - } else if (cc_type == 0x01) { - if (!cc_valid) - continue; - - if (cea608_field2 && cea608_field2_len) { - if (*cea608_field2_len + 2 > field_2_len) { - GST_WARNING ("Too many cea608 input bytes %u for field 2", - *cea608_field2_len + 2); - return -1; - } - cea608_field2(*cea608_field2_len)++ = cc_datai * 3 + 1; - cea608_field2(*cea608_field2_len)++ = cc_datai * 3 + 2; - } - } else { - /* all cea608 packets must be at the beginning of a cc_data */ - break; - } - } - - g_assert_cmpint (i * 3, <=, cc_data_len); - - GST_LOG ("Extracted cea608-1 of length %u and cea608-2 of length %u", - VAL_OR_0 (cea608_field1_len), VAL_OR_0 (cea608_field2_len)); - - return i * 3; -} - -static void -store_cc_data (GstCCConverter * self, const guint8 * ccp_data, - guint ccp_data_len, const guint8 * cea608_1, guint cea608_1_len, - const guint8 * cea608_2, guint cea608_2_len) -{ - GST_DEBUG_OBJECT (self, "holding data of len ccp:%u, cea608 1:%u, " - "cea608 2:%u until next input buffer", ccp_data_len, cea608_1_len, - cea608_2_len); - - if (ccp_data && ccp_data_len > 0) { - memcpy (self->scratch_ccp, ccp_data, ccp_data_len); - self->scratch_ccp_len = ccp_data_len; - } else { - self->scratch_ccp_len = 0; - } - g_assert_cmpint (self->scratch_ccp_len, <, sizeof (self->scratch_ccp)); - - if (cea608_1 && cea608_1_len > 0) { - memcpy (self->scratch_cea608_1, cea608_1, cea608_1_len); - self->scratch_cea608_1_len = cea608_1_len; - } else { - self->scratch_cea608_1_len = 0; - } - g_assert_cmpint (self->scratch_cea608_1_len, <, - sizeof (self->scratch_cea608_1)); - - if (cea608_2 && cea608_2_len > 0) { - memcpy (self->scratch_cea608_2, cea608_2, cea608_2_len); - self->scratch_cea608_2_len = cea608_2_len; - } else { - self->scratch_cea608_2_len = 0; - } - g_assert_cmpint (self->scratch_cea608_2_len, <, - sizeof (self->scratch_cea608_2)); -} - static gboolean -combine_cc_data (GstCCConverter * self, gboolean pad_cea608, - const struct cdp_fps_entry *out_fps_entry, const guint8 * ccp_data, - guint ccp_data_len, const guint8 * cea608_1, guint cea608_1_len, - const guint8 * cea608_2, guint cea608_2_len, guint8 * out, guint * out_size) -{ - guint i = 0, out_i = 0, max_size = 0, cea608_1_i = 0, cea608_2_i = 0; - guint cea608_output_count; - guint total_cea608_1_count, total_cea608_2_count; - - g_assert (out); - g_assert (out_size); - g_assert (!ccp_data || ccp_data_len % 3 == 0); - g_assert (!cea608_1 || cea608_1_len % 2 == 0); - g_assert (!cea608_2 || cea608_2_len % 2 == 0); - cea608_1_len /= 2; - cea608_2_len /= 2; -#if 0 - /* FIXME: if cea608 field 2 is generated, field 1 needs to be generated, - * However that is not possible for 60fps (where only one cea608 field fits) - * without adding previous output buffer tracking */ - g_assert_cmpint (cea608_1_len >= cea608_2_len); -#endif - g_assert_cmpint (cea608_1_len + cea608_2_len, <=, - out_fps_entry->max_cea608_count); - - total_cea608_1_count = cea608_1_len; - total_cea608_2_count = cea608_2_len; - -#if 0 - /* FIXME: if cea608 field 2 is generated, field 1 needs to be generated. */ - if (cea608_1_len < cea608_2_len) - total_cea608_1_count += cea608_2_len - cea608_1_len; -#endif - - max_size = ccp_data_len + (total_cea608_1_count + total_cea608_2_count) * 3; - if (*out_size < max_size) { - GST_WARNING_OBJECT (self, "Output data too small (%u < %u)", *out_size, - max_size); - return FALSE; - } - - /* FIXME: interlacing, tff, rff, ensuring cea608 field1 is generated if - * field2 exists even across packets */ - - cea608_output_count = cea608_1_len + cea608_2_len; - if (pad_cea608) { - for (i = total_cea608_1_count + total_cea608_2_count; - i < out_fps_entry->max_cea608_count; i++) { - /* try to pad evenly */ - if (i > cea608_1_len / 2) - total_cea608_1_count++; - else - total_cea608_2_count++; - cea608_output_count++; - } - } - - GST_LOG ("writing %u cea608-1 fields and %u cea608-2 fields", - total_cea608_1_count, total_cea608_2_count); - g_assert_cmpint (total_cea608_1_count + total_cea608_2_count, <=, - out_fps_entry->max_cea608_count); - - while (cea608_1_i + cea608_2_i < cea608_output_count) { - if (cea608_1_i < cea608_1_len) { - outout_i++ = 0xfc; - outout_i++ = cea608_1cea608_1_i * 2; - outout_i++ = cea608_1cea608_1_i * 2 + 1; - cea608_1_i++; - i++; - } else if (cea608_1_i < total_cea608_1_count) { - outout_i++ = 0xf8; - outout_i++ = 0x80; - outout_i++ = 0x80; - cea608_1_i++; - i++; - } - - if (cea608_2_i < cea608_2_len) { - outout_i++ = 0xfd; - outout_i++ = cea608_2cea608_2_i * 2; - outout_i++ = cea608_2cea608_2_i * 2 + 1; - cea608_2_i++; - i++; - } else if (cea608_2_i < total_cea608_2_count) { - outout_i++ = 0xf9; - outout_i++ = 0x80; - outout_i++ = 0x80; - cea608_2_i++; - i++; - } - } - - g_assert_cmpint (out_i / 3, <=, out_fps_entry->max_cea608_count); - - *out_size = out_i; - - if (ccp_data) { - memcpy (&outout_i, ccp_data, ccp_data_len); - *out_size += ccp_data_len; - } - - g_assert_cmpint (*out_size, <, MAX_CDP_PACKET_LEN); - - return TRUE; -} - -/* takes cc_data cea608_1, cea608_2 and attempts to fit it into a hypothetical - * output packet. Any leftover data is stored for later addition. Returns - * whether any output can be generated. @ccp_data_len, @cea608_1_len, - * @cea608_2_len are also updated to reflect the size of that data to add to - * the output packet */ -static gboolean -fit_and_scale_cc_data (GstCCConverter * self, +can_take_buffer (GstCCConverter * self, const struct cdp_fps_entry *in_fps_entry, - const struct cdp_fps_entry *out_fps_entry, const guint8 * ccp_data, - guint * ccp_data_len, const guint8 * cea608_1, guint * cea608_1_len, - const guint8 * cea608_2, guint * cea608_2_len, const GstVideoTimeCode * tc) + const struct cdp_fps_entry *out_fps_entry, + const GstVideoTimeCode * in_tc, GstVideoTimeCode * out_tc) { - if (!in_fps_entry || in_fps_entry->fps_n == 0) { - in_fps_entry = cdp_fps_entry_from_fps (self->in_fps_n, self->in_fps_d); - if (!in_fps_entry || in_fps_entry->fps_n == 0) - g_assert_not_reached (); - } - - /* This is slightly looser than checking for the exact framerate as the cdp - * spec allow for 0.1% difference between framerates to be considered equal */ - if (in_fps_entry->max_cc_count == out_fps_entry->max_cc_count) { - if (tc && tc->config.fps_n != 0) - interpolate_time_code_with_framerate (self, tc, out_fps_entry->fps_n, - out_fps_entry->fps_d, 1, 1, &self->current_output_timecode); - - self->scratch_ccp_len = 0; - self->scratch_cea608_1_len = 0; - self->scratch_cea608_2_len = 0; - self->input_frames = 0; - self->output_frames = 0; - } else { - int input_frame_n, input_frame_d, output_frame_n, output_frame_d; - int output_time_cmp, scale_n, scale_d, rate_cmp; + int input_frame_n, input_frame_d, output_frame_n, output_frame_d; + int output_time_cmp, scale_n, scale_d; - /* TODO: handle input discont */ + /* TODO: handle input discont */ + if (self->in_fps_n == 0) { + input_frame_n = self->input_frames; + input_frame_d = 1; + } else { /* compute the relative frame count for each */ if (!gst_util_fraction_multiply (self->in_fps_d, self->in_fps_n, self->input_frames, 1, &input_frame_n, &input_frame_d)) /* we should never overflow */ g_assert_not_reached (); + } + if (self->in_fps_n == 0) { + output_frame_n = self->output_frames; + output_frame_d = 1; + } else { if (!gst_util_fraction_multiply (self->out_fps_d, self->out_fps_n, self->output_frames, 1, &output_frame_n, &output_frame_d)) /* we should never overflow */ g_assert_not_reached (); + } - output_time_cmp = gst_util_fraction_compare (input_frame_n, input_frame_d, - output_frame_n, output_frame_d); - - /* compute the relative rates of the two framerates */ - get_framerate_output_scale (self, in_fps_entry, &scale_n, &scale_d); - - rate_cmp = gst_util_fraction_compare (scale_n, scale_d, 1, 1); - - GST_TRACE_OBJECT (self, "performing framerate conversion at scale %d/%d " - "of cc data of with sizes, ccp:%u, cea608-1:%u, cea608-2:%u", scale_n, - scale_d, VAL_OR_0 (ccp_data_len), VAL_OR_0 (cea608_1_len), - VAL_OR_0 (cea608_2_len)); - - if (rate_cmp == 0) { - /* we are not scaling. Should never happen with current conditions - * above */ - g_assert_not_reached (); - } else if (output_time_cmp < 0) { - /* we can't generate an output yet */ - guint cd_len = ccp_data_len ? *ccp_data_len : 0; - guint c1_len = cea608_1_len ? *cea608_1_len : 0; - guint c2_len = cea608_2_len ? *cea608_2_len : 0; - - store_cc_data (self, ccp_data, cd_len, cea608_1, c1_len, cea608_2, - c2_len); - if (ccp_data_len) - *ccp_data_len = 0; - if (cea608_1_len) - *cea608_1_len = 0; - if (cea608_2_len) - *cea608_2_len = 0; - return FALSE; - } else if (rate_cmp != 0) { - /* we are changing the framerate and may overflow the max output packet - * size. Split them where necessary. */ - gint extra_ccp = 0, extra_cea608_1 = 0, extra_cea608_2 = 0; - gint ccp_off = 0, cea608_1_off = 0, cea608_2_off = 0; - - if (output_time_cmp == 0) { - /* we have completed a cycle and can reset our counters to avoid - * overflow. Anything that fits into the output packet will be written */ - GST_LOG_OBJECT (self, "cycle completed, resetting frame counters"); - self->scratch_ccp_len = 0; - self->scratch_cea608_1_len = 0; - self->scratch_cea608_2_len = 0; - self->input_frames = 0; - self->output_frames = 0; - } - - if (ccp_data_len) { - extra_ccp = *ccp_data_len - 3 * out_fps_entry->max_ccp_count; - extra_ccp = MAX (0, extra_ccp); - ccp_off = *ccp_data_len - extra_ccp; - } + output_time_cmp = gst_util_fraction_compare (input_frame_n, input_frame_d, + output_frame_n, output_frame_d); - if (cea608_1_len) { - extra_cea608_1 = *cea608_1_len - 2 * out_fps_entry->max_cea608_count; - extra_cea608_1 = MAX (0, extra_cea608_1); - cea608_1_off = *cea608_1_len - extra_cea608_1; - } + in_fps_entry = cdp_fps_entry_from_fps (self->in_fps_n, self->in_fps_d); + if (!in_fps_entry || in_fps_entry->fps_n == 0) + g_assert_not_reached (); - if (cea608_2_len) { - /* this prefers using field1 data first. This may not be quite correct */ - if (extra_cea608_1 > 0) { - /* all the cea608 space is for field 1 */ - extra_cea608_2 = *cea608_2_len; - cea608_2_off = 0; - } else if (cea608_1_len) { - /* cea608 space is shared between field 1 and field 2 */ - extra_cea608_2 = - *cea608_1_len + *cea608_2_len - - 2 * out_fps_entry->max_cea608_count; - extra_cea608_2 = MAX (0, extra_cea608_2); - cea608_2_off = *cea608_2_len - extra_cea608_2; - } else { - /* all of the cea608 space is for field 2 */ - extra_cea608_2 = *cea608_2_len - 2 * out_fps_entry->max_cea608_count; - extra_cea608_2 = MAX (0, extra_cea608_2); - cea608_2_off = *cea608_2_len - extra_cea608_2; - } - } + /* compute the relative rates of the two framerates */ + get_framerate_output_scale (self, in_fps_entry, &scale_n, &scale_d); - if (extra_ccp > 0 || extra_cea608_1 > 0 || extra_cea608_2 > 0) { - /* packet would overflow, push extra bytes into the next packet */ - GST_DEBUG_OBJECT (self, "buffer would overflow by %u ccp bytes, " - "%u cea608 field 1 bytes, or %u cea608 field 2 bytes", extra_ccp, - extra_cea608_1, extra_cea608_2); - store_cc_data (self, &ccp_dataccp_off, extra_ccp, - &cea608_1cea608_1_off, extra_cea608_1, &cea608_2cea608_2_off, - extra_cea608_2); - if (ccp_data_len) - *ccp_data_len = MIN (*ccp_data_len, ccp_off); - if (cea608_1_len) - *cea608_1_len = MIN (*cea608_1_len, cea608_1_off); - if (cea608_2_len) - *cea608_2_len = MIN (*cea608_2_len, cea608_2_off); - } else { - GST_DEBUG_OBJECT (self, "section sizes of %u ccp bytes, " - "%u cea608 field 1 bytes, and %u cea608 field 2 bytes fit within " - "output packet", VAL_OR_0 (ccp_data_len), VAL_OR_0 (cea608_1_len), - VAL_OR_0 (cea608_2_len)); - self->scratch_ccp_len = 0; - self->scratch_cea608_1_len = 0; - self->scratch_cea608_2_len = 0; - } - } else { - g_assert_not_reached (); - } + GST_TRACE_OBJECT (self, "performing conversion at scale %d/%d, " + "time comparison %i", scale_n, scale_d, output_time_cmp); - if (tc && tc->config.fps_n != 0) - interpolate_time_code_with_framerate (self, tc, out_fps_entry->fps_n, - out_fps_entry->fps_d, scale_n, scale_d, - &self->current_output_timecode); + if (output_time_cmp < 0) { + /* we can't generate an output yet */ + return FALSE; + } else { + interpolate_time_code_with_framerate (self, in_tc, out_fps_entry->fps_n, + out_fps_entry->fps_d, scale_n, scale_d, out_tc); + return TRUE; } - - g_assert_cmpint (VAL_OR_0 (ccp_data_len) + (VAL_OR_0 (cea608_1_len) + - VAL_OR_0 (cea608_2_len)) / 2 * 3, <=, - 3 * out_fps_entry->max_cc_count); - - GST_DEBUG_OBJECT (self, "write out packet with lengths ccp:%u, cea608-1:%u, " - "cea608-2:%u", VAL_OR_0 (ccp_data_len), VAL_OR_0 (cea608_1_len), - VAL_OR_0 (cea608_2_len)); - - return TRUE; } -/* Converts raw CEA708 cc_data and an optional timecode into CDP */ static guint convert_cea708_cc_data_cea708_cdp_internal (GstCCConverter * self, const guint8 * cc_data, guint cc_data_len, guint8 * cdp, guint cdp_len, const GstVideoTimeCode * tc, const struct cdp_fps_entry *fps_entry) { - GstByteWriter bw; - guint8 flags, checksum; - guint i, len; - - GST_DEBUG_OBJECT (self, "writing out cdp packet from cc_data with length %u", - cc_data_len); - - gst_byte_writer_init_with_data (&bw, cdp, cdp_len, FALSE); - gst_byte_writer_put_uint16_be_unchecked (&bw, 0x9669); - /* Write a length of 0 for now */ - gst_byte_writer_put_uint8_unchecked (&bw, 0); - - gst_byte_writer_put_uint8_unchecked (&bw, fps_entry->fps_idx); - - if (cc_data_len / 3 > fps_entry->max_cc_count) { - GST_WARNING_OBJECT (self, "Too many cc_data triplets for framerate: %u. " - "Truncating to %u", cc_data_len / 3, fps_entry->max_cc_count); - cc_data_len = 3 * fps_entry->max_cc_count; - } + guint ret; - /* caption_service_active */ - flags = 0x02; - - /* ccdata_present */ - if ((self->cdp_mode & GST_CC_CONVERTER_CDP_MODE_CC_DATA)) - flags |= 0x40; - - /* time_code_present */ - if ((self->cdp_mode & GST_CC_CONVERTER_CDP_MODE_TIME_CODE) && tc - && tc->config.fps_n > 0) - flags |= 0x80; - - /* reserved */ - flags |= 0x01; - - gst_byte_writer_put_uint8_unchecked (&bw, flags); - - gst_byte_writer_put_uint16_be_unchecked (&bw, self->cdp_hdr_sequence_cntr); - - if ((self->cdp_mode & GST_CC_CONVERTER_CDP_MODE_TIME_CODE) && tc - && tc->config.fps_n > 0) { - guint8 u8; - - gst_byte_writer_put_uint8_unchecked (&bw, 0x71); - /* reserved 11 - 2 bits */ - u8 = 0xc0; - /* tens of hours - 2 bits */ - u8 |= ((tc->hours / 10) & 0x3) << 4; - /* units of hours - 4 bits */ - u8 |= (tc->hours % 10) & 0xf; - gst_byte_writer_put_uint8_unchecked (&bw, u8); - - /* reserved 1 - 1 bit */ - u8 = 0x80; - /* tens of minutes - 3 bits */ - u8 |= ((tc->minutes / 10) & 0x7) << 4; - /* units of minutes - 4 bits */ - u8 |= (tc->minutes % 10) & 0xf; - gst_byte_writer_put_uint8_unchecked (&bw, u8); - - /* field flag - 1 bit */ - u8 = tc->field_count < 2 ? 0x00 : 0x80; - /* tens of seconds - 3 bits */ - u8 |= ((tc->seconds / 10) & 0x7) << 4; - /* units of seconds - 4 bits */ - u8 |= (tc->seconds % 10) & 0xf; - gst_byte_writer_put_uint8_unchecked (&bw, u8); - - /* drop frame flag - 1 bit */ - u8 = (tc->config.flags & GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME) ? 0x80 : - 0x00; - /* reserved0 - 1 bit */ - /* tens of frames - 2 bits */ - u8 |= ((tc->frames / 10) & 0x3) << 4; - /* units of frames 4 bits */ - u8 |= (tc->frames % 10) & 0xf; - gst_byte_writer_put_uint8_unchecked (&bw, u8); - } - - if ((self->cdp_mode & GST_CC_CONVERTER_CDP_MODE_CC_DATA)) { - gst_byte_writer_put_uint8_unchecked (&bw, 0x72); - gst_byte_writer_put_uint8_unchecked (&bw, 0xe0 | fps_entry->max_cc_count); - gst_byte_writer_put_data_unchecked (&bw, cc_data, cc_data_len); - while (fps_entry->max_cc_count > cc_data_len / 3) { - gst_byte_writer_put_uint8_unchecked (&bw, 0xfa); - gst_byte_writer_put_uint8_unchecked (&bw, 0x00); - gst_byte_writer_put_uint8_unchecked (&bw, 0x00); - cc_data_len += 3; - } - } - - gst_byte_writer_put_uint8_unchecked (&bw, 0x74); - gst_byte_writer_put_uint16_be_unchecked (&bw, self->cdp_hdr_sequence_cntr); + ret = convert_cea708_cc_data_to_cdp (GST_OBJECT (self), + (GstCCCDPMode) self->cdp_mode, self->cdp_hdr_sequence_cntr, cc_data, + cc_data_len, cdp, cdp_len, tc, fps_entry); self->cdp_hdr_sequence_cntr++; - /* We calculate the checksum afterwards */ - gst_byte_writer_put_uint8_unchecked (&bw, 0); - - len = gst_byte_writer_get_pos (&bw); - gst_byte_writer_set_pos (&bw, 2); - gst_byte_writer_put_uint8_unchecked (&bw, len); - - checksum = 0; - for (i = 0; i < len; i++) { - checksum += cdpi; - } - checksum &= 0xff; - checksum = 256 - checksum; - cdplen - 1 = checksum; - - return len; -} - -/* Converts CDP into raw CEA708 cc_data */ -static guint -convert_cea708_cdp_cea708_cc_data_internal (GstCCConverter * self, - const guint8 * cdp, guint cdp_len, guint8 cc_dataMAX_CDP_PACKET_LEN, - GstVideoTimeCode * tc, const struct cdp_fps_entry **out_fps_entry) -{ - GstByteReader br; - guint16 u16; - guint8 u8; - guint8 flags; - guint len = 0; - const struct cdp_fps_entry *fps_entry; - - *out_fps_entry = &null_fps_entry; - memset (tc, 0, sizeof (*tc)); - - /* Header + footer length */ - if (cdp_len < 11) { - GST_WARNING_OBJECT (self, "cdp packet too short (%u). expected at " - "least %u", cdp_len, 11); - return 0; - } - - gst_byte_reader_init (&br, cdp, cdp_len); - u16 = gst_byte_reader_get_uint16_be_unchecked (&br); - if (u16 != 0x9669) { - GST_WARNING_OBJECT (self, "cdp packet does not have initial magic bytes " - "of 0x9669"); - return 0; - } - - u8 = gst_byte_reader_get_uint8_unchecked (&br); - if (u8 != cdp_len) { - GST_WARNING_OBJECT (self, "cdp packet length (%u) does not match passed " - "in value (%u)", u8, cdp_len); - return 0; - } - - u8 = gst_byte_reader_get_uint8_unchecked (&br); - fps_entry = cdp_fps_entry_from_id (u8); - if (!fps_entry || fps_entry->fps_n == 0) { - GST_WARNING_OBJECT (self, "cdp packet does not have a valid framerate " - "id (0x%02x", u8); - return 0; - } - - flags = gst_byte_reader_get_uint8_unchecked (&br); - /* No cc_data? */ - if ((flags & 0x40) == 0) { - GST_DEBUG_OBJECT (self, "cdp packet does have any cc_data"); - return 0; - } - - /* cdp_hdr_sequence_cntr */ - gst_byte_reader_skip_unchecked (&br, 2); - - /* time_code_present */ - if (flags & 0x80) { - guint8 hours, minutes, seconds, frames, fields; - gboolean drop_frame; - - if (gst_byte_reader_get_remaining (&br) < 5) { - GST_WARNING_OBJECT (self, "cdp packet does not have enough data to " - "contain a timecode (%u). Need at least 5 bytes", - gst_byte_reader_get_remaining (&br)); - return 0; - } - u8 = gst_byte_reader_get_uint8_unchecked (&br); - if (u8 != 0x71) { - GST_WARNING_OBJECT (self, "cdp packet does not have timecode start byte " - "of 0x71, found 0x%02x", u8); - return 0; - } - - u8 = gst_byte_reader_get_uint8_unchecked (&br); - if ((u8 & 0xc0) != 0xc0) { - GST_WARNING_OBJECT (self, "reserved bits are not 0xc0, found 0x%02x", u8); - return 0; - } - - hours = ((u8 >> 4) & 0x3) * 10 + (u8 & 0xf); - - u8 = gst_byte_reader_get_uint8_unchecked (&br); - if ((u8 & 0x80) != 0x80) { - GST_WARNING_OBJECT (self, "reserved bit is not 0x80, found 0x%02x", u8); - return 0; - } - minutes = ((u8 >> 4) & 0x7) * 10 + (u8 & 0xf); - - u8 = gst_byte_reader_get_uint8_unchecked (&br); - if (u8 & 0x80) - fields = 2; - else - fields = 1; - seconds = ((u8 >> 4) & 0x7) * 10 + (u8 & 0xf); - - u8 = gst_byte_reader_get_uint8_unchecked (&br); - if (u8 & 0x40) { - GST_WARNING_OBJECT (self, "reserved bit is not 0x0, found 0x%02x", u8); - return 0; - } - - drop_frame = ! !(u8 & 0x80); - frames = ((u8 >> 4) & 0x3) * 10 + (u8 & 0xf); - - gst_video_time_code_init (tc, fps_entry->fps_n, fps_entry->fps_d, NULL, - drop_frame ? GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME : - GST_VIDEO_TIME_CODE_FLAGS_NONE, hours, minutes, seconds, frames, - fields); - } - - /* ccdata_present */ - if (flags & 0x40) { - guint8 cc_count; - - if (gst_byte_reader_get_remaining (&br) < 2) { - GST_WARNING_OBJECT (self, "not enough data to contain valid cc_data"); - return 0; - } - u8 = gst_byte_reader_get_uint8_unchecked (&br); - if (u8 != 0x72) { - GST_WARNING_OBJECT (self, "missing cc_data start code of 0x72, " - "found 0x%02x", u8); - return 0; - } - - cc_count = gst_byte_reader_get_uint8_unchecked (&br); - if ((cc_count & 0xe0) != 0xe0) { - GST_WARNING_OBJECT (self, "reserved bits are not 0xe0, found 0x%02x", u8); - return 0; - } - cc_count &= 0x1f; - - len = 3 * cc_count; - if (gst_byte_reader_get_remaining (&br) < len) - return 0; - - memcpy (cc_data, gst_byte_reader_get_data_unchecked (&br, len), len); - } - - *out_fps_entry = fps_entry; - - /* skip everything else we don't care about */ - return len; -} - -static gboolean -copy_from_stored_data (GstCCConverter * self, guint8 * out_ccp, - guint * ccp_size, guint8 * cea608_1, guint * cea608_1_len, - guint8 * cea608_2, guint * cea608_2_len) -{ - guint ccp_in_size = 0, cea608_1_in_size = 0, cea608_2_in_size = 0; - - g_assert ((out_ccp && ccp_size) || (!out_ccp && !ccp_size)); - g_assert ((cea608_1 && cea608_1_len) || (!cea608_1 && !cea608_1_len)); - g_assert ((cea608_2 && cea608_2_len) || (!cea608_2 && !cea608_2_len)); - - if (ccp_size) { - ccp_in_size = *ccp_size; - *ccp_size = 0; - } - if (cea608_1_len) { - cea608_1_in_size = *cea608_1_len; - *cea608_1_len = 0; - } - if (cea608_2_len) { - cea608_2_in_size = *cea608_2_len; - *cea608_2_len = 0; - } - - if (out_ccp && self->scratch_ccp_len > 0) { - GST_DEBUG_OBJECT (self, "copying from previous scratch ccp buffer of " - "%u bytes", self->scratch_ccp_len); - if (ccp_in_size < *ccp_size + self->scratch_ccp_len) { - GST_WARNING_OBJECT (self, "output buffer too small %u < %u", ccp_in_size, - *ccp_size + self->scratch_ccp_len); - goto fail; - } - memcpy (&out_ccp*ccp_size, self->scratch_ccp, self->scratch_ccp_len); - *ccp_size += self->scratch_ccp_len; - } - - if (cea608_1 && self->scratch_cea608_1_len > 0) { - GST_DEBUG_OBJECT (self, "copying from previous scratch cea608 field 1 " - "buffer of %u bytes", self->scratch_cea608_1_len); - if (cea608_1_in_size < *cea608_1_len + self->scratch_cea608_1_len) { - GST_WARNING_OBJECT (self, "output buffer too small %u < %u", - cea608_1_in_size, *cea608_1_len + self->scratch_cea608_1_len); - goto fail; - } - memcpy (&cea608_1*cea608_1_len, self->scratch_cea608_1, - self->scratch_cea608_1_len); - *cea608_1_len += self->scratch_cea608_1_len; - } - - if (cea608_2 && self->scratch_cea608_2_len > 0) { - GST_DEBUG_OBJECT (self, "copying from previous scratch cea608 field 2 " - "buffer of %u bytes", self->scratch_cea608_2_len); - if (cea608_2_in_size < *cea608_2_len + self->scratch_cea608_2_len) { - GST_WARNING_OBJECT (self, "output buffer too small %u < %u", - cea608_2_in_size, *cea608_2_len + self->scratch_cea608_2_len); - goto fail; - } - memcpy (&cea608_2*cea608_2_len, self->scratch_cea608_2, - self->scratch_cea608_2_len); - *cea608_2_len += self->scratch_cea608_2_len; - } - - return TRUE; - -fail: - if (ccp_size) - *ccp_size = 0; - if (cea608_1_len) - *cea608_1_len = 0; - if (cea608_2_len) - *cea608_2_len = 0; - return FALSE; -} - -static gboolean -cc_data_to_cea608_ccp (GstCCConverter * self, guint8 * cc_data, - guint cc_data_len, guint8 * out_ccp, guint * ccp_size, guint8 * cea608_1, - guint * cea608_1_len, guint8 * cea608_2, guint * cea608_2_len, - const struct cdp_fps_entry *in_fps_entry) -{ - guint ccp_in_size = 0, cea608_1_in_size = 0, cea608_2_in_size = 0; - - g_assert (cc_data || cc_data_len == 0); - - if (ccp_size) - ccp_in_size = *ccp_size; - if (cea608_1_len) - cea608_1_in_size = *cea608_1_len; - if (cea608_2_len) - cea608_2_in_size = *cea608_2_len; - - if (!copy_from_stored_data (self, out_ccp, ccp_size, cea608_1, cea608_1_len, - cea608_2, cea608_2_len)) - goto fail; - - if (cc_data) { - gint ccp_offset = 0; - guint new_cea608_1_len = 0, new_cea608_2_len = 0; - guint8 *new_cea608_1 = cea608_1, *new_cea608_2 = cea608_2; - - if (cea608_1_len) { - new_cea608_1_len = cea608_1_in_size - *cea608_1_len; - new_cea608_1 = &cea608_1*cea608_1_len; - } - if (cea608_2_len) { - new_cea608_2_len = cea608_2_in_size - *cea608_2_len; - new_cea608_2 = &cea608_2*cea608_2_len; - } - - cc_data_len = compact_cc_data (cc_data, cc_data_len); - - if (cc_data_len / 3 > in_fps_entry->max_cc_count) { - GST_WARNING_OBJECT (self, "Too many cc_data triples in CDP packet %u. " - "Truncating to %u", cc_data_len / 3, in_fps_entry->max_cc_count); - cc_data_len = 3 * in_fps_entry->max_cc_count; - } - ccp_offset = cc_data_extract_cea608 (cc_data, cc_data_len, new_cea608_1, - &new_cea608_1_len, new_cea608_2, &new_cea608_2_len); - if (ccp_offset < 0) { - GST_WARNING_OBJECT (self, "Failed to extract cea608 from cc_data"); - goto fail; - } - - if ((new_cea608_1_len + new_cea608_2_len) / 2 > - in_fps_entry->max_cea608_count) { - GST_WARNING_OBJECT (self, "Too many cea608 triples in CDP packet %u. " - "Truncating to %u", (new_cea608_1_len + new_cea608_2_len) / 2, - in_fps_entry->max_cea608_count); - if ((new_cea608_1_len + new_cea608_2_len) / 2 > - in_fps_entry->max_cea608_count) { - new_cea608_1_len = 2 * in_fps_entry->max_cea608_count; - new_cea608_2_len = 0; - } else { - new_cea608_2_len = - 2 * in_fps_entry->max_cea608_count - new_cea608_1_len; - } - } - - if (cea608_1_len) - *cea608_1_len += new_cea608_1_len; - if (cea608_2_len) - *cea608_2_len += new_cea608_2_len; - - if (out_ccp) { - if (ccp_in_size < *ccp_size + cc_data_len - ccp_offset) { - GST_WARNING_OBJECT (self, "output buffer too small %u < %u", - ccp_in_size, *ccp_size + cc_data_len - ccp_offset); - goto fail; - } - memcpy (&out_ccp*ccp_size, &cc_dataccp_offset, - cc_data_len - ccp_offset); - *ccp_size += cc_data_len - ccp_offset; - } - } - - return TRUE; - -fail: - if (ccp_size) - *ccp_size = 0; - if (cea608_1_len) - *cea608_1_len = 0; - if (cea608_2_len) - *cea608_2_len = 0; - return FALSE; + return ret; } static gboolean -cdp_to_cea608_cc_data (GstCCConverter * self, GstBuffer * inbuf, - guint8 * out_ccp, guint * ccp_size, guint8 * cea608_1, guint * cea608_1_len, - guint8 * cea608_2, guint * cea608_2_len, GstVideoTimeCode * out_tc, - const struct cdp_fps_entry **in_fps_entry) +push_cdp_buffer (GstCCConverter * self, GstBuffer * inbuf, + GstVideoTimeCode * out_tc, const struct cdp_fps_entry **in_fps_entry) { guint8 cc_dataMAX_CDP_PACKET_LEN; guint cc_data_len = 0; @@ -1479,16 +637,16 @@ gst_buffer_map (inbuf, &in, GST_MAP_READ); cc_data_len = - convert_cea708_cdp_cea708_cc_data_internal (self, in.data, in.size, + convert_cea708_cdp_to_cc_data (GST_OBJECT (self), in.data, in.size, cc_data, out_tc, in_fps_entry); + cc_buffer_push_cc_data (self->cc_buffer, cc_data, cc_data_len); + gst_buffer_unmap (inbuf, &in); self->input_frames++; } - return cc_data_to_cea608_ccp (self, inbuf ? cc_data : NULL, cc_data_len, - out_ccp, ccp_size, cea608_1, cea608_1_len, cea608_2, cea608_2_len, - inbuf ? *in_fps_entry : NULL); + return TRUE; } static GstFlowReturn @@ -1580,16 +738,12 @@ GstMapInfo in, out; const struct cdp_fps_entry *in_fps_entry, *out_fps_entry; guint cc_data_len = MAX_CDP_PACKET_LEN; - guint cea608_1_len = MAX_CDP_PACKET_LEN; - guint8 cc_dataMAX_CDP_PACKET_LEN, cea608_1MAX_CEA608_LEN; + guint8 cc_dataMAX_CDP_PACKET_LEN; in_fps_entry = cdp_fps_entry_from_fps (self->in_fps_n, self->in_fps_d); if (!in_fps_entry || in_fps_entry->fps_n == 0) g_assert_not_reached (); - if (!copy_from_stored_data (self, NULL, 0, cea608_1, &cea608_1_len, NULL, 0)) - goto drop; - if (inbuf) { guint n = 0; @@ -1609,9 +763,9 @@ } gst_buffer_map (inbuf, &in, GST_MAP_READ); - memcpy (&cea608_1cea608_1_len, in.data, n * 2); + cc_buffer_push_separated (self->cc_buffer, in.data, in.size, NULL, 0, NULL, + 0); gst_buffer_unmap (inbuf, &in); - cea608_1_len += n * 2; self->input_frames++; } @@ -1619,13 +773,12 @@ if (!out_fps_entry || out_fps_entry->fps_n == 0) g_assert_not_reached (); - if (!fit_and_scale_cc_data (self, in_fps_entry, out_fps_entry, NULL, 0, - cea608_1, &cea608_1_len, NULL, 0, tc_meta ? &tc_meta->tc : NULL)) + if (!can_take_buffer (self, in_fps_entry, out_fps_entry, + tc_meta ? &tc_meta->tc : NULL, &self->current_output_timecode)) goto drop; - if (!combine_cc_data (self, TRUE, out_fps_entry, NULL, 0, cea608_1, - cea608_1_len, NULL, 0, cc_data, &cc_data_len)) - goto drop; + cc_buffer_take_cc_data (self->cc_buffer, out_fps_entry, cc_data, + &cc_data_len); gst_buffer_map (outbuf, &out, GST_MAP_WRITE); cc_data_len = @@ -1728,7 +881,7 @@ GstMapInfo in, out; const struct cdp_fps_entry *in_fps_entry, *out_fps_entry; guint cc_data_len = MAX_CDP_PACKET_LEN; - guint cea608_1_len = MAX_CDP_PACKET_LEN, cea608_2_len = MAX_CDP_PACKET_LEN; + guint cea608_1_len = 0, cea608_2_len = 0; guint8 cc_dataMAX_CDP_PACKET_LEN; guint8 cea608_1MAX_CEA608_LEN, cea608_2MAX_CEA608_LEN; guint i, n; @@ -1737,10 +890,6 @@ if (!in_fps_entry || in_fps_entry->fps_n == 0) g_assert_not_reached (); - if (!copy_from_stored_data (self, NULL, 0, cea608_1, &cea608_1_len, - cea608_2, &cea608_2_len)) - goto drop; - if (inbuf) { n = gst_buffer_get_size (inbuf); if (n % 3 != 0) { @@ -1758,15 +907,25 @@ gst_buffer_map (inbuf, &in, GST_MAP_READ); for (i = 0; i < n; i++) { + guint byte1 = in.datai * 3 + 1; + guint byte2 = in.datai * 3 + 2; + if (in.datai * 3 & 0x80) { - cea608_1cea608_1_len++ = in.datai * 3 + 1; - cea608_1cea608_1_len++ = in.datai * 3 + 2; + if (byte1 != 0x80 || byte2 != 0x80) { + cea608_1cea608_1_len++ = byte1; + cea608_1cea608_1_len++ = byte2; + } } else { - cea608_2cea608_2_len++ = in.datai * 3 + 1; - cea608_2cea608_2_len++ = in.datai * 3 + 2; + if (byte1 != 0x80 || byte2 != 0x80) { + cea608_2cea608_2_len++ = byte1; + cea608_2cea608_2_len++ = byte2; + } } } gst_buffer_unmap (inbuf, &in); + + cc_buffer_push_separated (self->cc_buffer, cea608_1, cea608_1_len, + cea608_2, cea608_2_len, NULL, 0); self->input_frames++; } @@ -1774,16 +933,12 @@ if (!out_fps_entry || out_fps_entry->fps_n == 0) g_assert_not_reached (); - if (!fit_and_scale_cc_data (self, in_fps_entry, out_fps_entry, NULL, 0, - cea608_1, &cea608_1_len, cea608_2, &cea608_2_len, - tc_meta ? &tc_meta->tc : NULL)) { + if (!can_take_buffer (self, in_fps_entry, out_fps_entry, + tc_meta ? &tc_meta->tc : NULL, &self->current_output_timecode)) goto drop; - } - if (!combine_cc_data (self, TRUE, out_fps_entry, NULL, 0, cea608_1, - cea608_1_len, cea608_2, cea608_2_len, cc_data, &cc_data_len)) { - goto drop; - } + cc_buffer_take_cc_data (self->cc_buffer, out_fps_entry, cc_data, + &cc_data_len); gst_buffer_map (outbuf, &out, GST_MAP_WRITE); cc_data_len = @@ -1895,10 +1050,8 @@ GstMapInfo in, out; const struct cdp_fps_entry *in_fps_entry, *out_fps_entry; guint in_cc_data_len; - guint cc_data_len = MAX_CDP_PACKET_LEN, ccp_data_len = MAX_CDP_PACKET_LEN; - guint cea608_1_len = MAX_CEA608_LEN, cea608_2_len = MAX_CEA608_LEN; - guint8 cc_dataMAX_CDP_PACKET_LEN, ccp_dataMAX_CDP_PACKET_LEN; - guint8 cea608_1MAX_CEA608_LEN, cea608_2MAX_CEA608_LEN; + guint cc_data_len = MAX_CDP_PACKET_LEN; + guint8 cc_dataMAX_CDP_PACKET_LEN; guint8 *in_cc_data; if (inbuf) { @@ -1919,26 +1072,16 @@ if (!out_fps_entry || out_fps_entry->fps_n == 0) g_assert_not_reached (); - if (!cc_data_to_cea608_ccp (self, in_cc_data, in_cc_data_len, ccp_data, - &ccp_data_len, cea608_1, &cea608_1_len, cea608_2, &cea608_2_len, - in_fps_entry)) { - if (inbuf) - gst_buffer_unmap (inbuf, &in); - goto drop; - } - + cc_buffer_push_cc_data (self->cc_buffer, in_cc_data, in_cc_data_len); if (inbuf) gst_buffer_unmap (inbuf, &in); - if (!fit_and_scale_cc_data (self, in_fps_entry, out_fps_entry, ccp_data, - &ccp_data_len, cea608_1, &cea608_1_len, cea608_2, &cea608_2_len, - tc_meta ? &tc_meta->tc : NULL)) + if (!can_take_buffer (self, in_fps_entry, out_fps_entry, + tc_meta ? &tc_meta->tc : NULL, &self->current_output_timecode)) goto drop; - if (!combine_cc_data (self, TRUE, out_fps_entry, ccp_data, ccp_data_len, - cea608_1, cea608_1_len, cea608_2, cea608_2_len, cc_data, - &cc_data_len)) - goto drop; + cc_buffer_take_cc_data (self->cc_buffer, out_fps_entry, cc_data, + &cc_data_len); gst_buffer_map (outbuf, &out, GST_MAP_WRITE); cc_data_len = @@ -1966,10 +1109,7 @@ guint cea608_1_len; const struct cdp_fps_entry *in_fps_entry = NULL, *out_fps_entry; - gst_buffer_map (outbuf, &out, GST_MAP_WRITE); - cea608_1_len = (guint) out.size; - if (!cdp_to_cea608_cc_data (self, inbuf, NULL, NULL, out.data, &cea608_1_len, - NULL, NULL, &tc, &in_fps_entry)) { + if (!push_cdp_buffer (self, inbuf, &tc, &in_fps_entry)) { gst_buffer_set_size (outbuf, 0); return GST_FLOW_OK; } @@ -1978,15 +1118,16 @@ if (!out_fps_entry || out_fps_entry->fps_n == 0) out_fps_entry = in_fps_entry; - if (fit_and_scale_cc_data (self, in_fps_entry, out_fps_entry, NULL, 0, - out.data, &cea608_1_len, NULL, NULL, &tc)) { - self->output_frames++; - } else { - cea608_1_len = 0; - } - gst_buffer_unmap (outbuf, &out); + if (!can_take_buffer (self, in_fps_entry, out_fps_entry, &tc, + &self->current_output_timecode)) + goto drop; - gst_buffer_set_size (outbuf, cea608_1_len); + gst_buffer_map (outbuf, &out, GST_MAP_WRITE); + cea608_1_len = out.size; + cc_buffer_take_separated (self->cc_buffer, out_fps_entry, out.data, + &cea608_1_len, NULL, 0, NULL, 0); + gst_buffer_unmap (outbuf, &out); + self->output_frames++; if (self->current_output_timecode.config.fps_n != 0 && !tc_meta) { gst_buffer_add_video_time_code_meta (outbuf, @@ -1994,7 +1135,13 @@ gst_video_time_code_increment_frame (&self->current_output_timecode); } +out: + gst_buffer_set_size (outbuf, cea608_1_len); return GST_FLOW_OK; + +drop: + cea608_1_len = 0; + goto out; } static GstFlowReturn @@ -2004,39 +1151,40 @@ GstMapInfo out; GstVideoTimeCode tc = GST_VIDEO_TIME_CODE_INIT; const struct cdp_fps_entry *in_fps_entry = NULL, *out_fps_entry; - guint8 cea608_1MAX_CEA608_LEN, cea608_2MAX_CEA608_LEN; - guint cea608_1_len = MAX_CEA608_LEN, cea608_2_len = MAX_CEA608_LEN; - guint i, cc_data_len; + guint cc_data_len; + int s334_len; + guint i; - if (!cdp_to_cea608_cc_data (self, inbuf, NULL, NULL, cea608_1, &cea608_1_len, - cea608_2, &cea608_2_len, &tc, &in_fps_entry)) + if (!push_cdp_buffer (self, inbuf, &tc, &in_fps_entry)) goto drop; out_fps_entry = cdp_fps_entry_from_fps (self->out_fps_n, self->out_fps_d); if (!out_fps_entry || out_fps_entry->fps_n == 0) out_fps_entry = in_fps_entry; - if (!fit_and_scale_cc_data (self, in_fps_entry, out_fps_entry, NULL, 0, - cea608_1, &cea608_1_len, cea608_2, &cea608_2_len, &tc)) + if (!can_take_buffer (self, in_fps_entry, out_fps_entry, &tc, + &self->current_output_timecode)) goto drop; - cc_data_len = gst_buffer_get_sizes (outbuf, NULL, NULL); - gst_buffer_map (outbuf, &out, GST_MAP_READWRITE); - if (!combine_cc_data (self, FALSE, out_fps_entry, NULL, 0, cea608_1, - cea608_1_len, cea608_2, cea608_2_len, out.data, &cc_data_len)) { - gst_buffer_unmap (outbuf, &out); + + cc_data_len = out.size; + cc_buffer_take_cc_data (self->cc_buffer, out_fps_entry, out.data, + &cc_data_len); + s334_len = drop_ccp_from_cc_data (out.data, cc_data_len); + if (s334_len < 0) goto drop; - } - for (i = 0; i < cc_data_len / 3; i++) + for (i = 0; i < s334_len / 3; i++) { + guint byte = out.datai * 3; /* We have to assume a line offset of 0 */ - out.datai * 3 = out.datai * 3 == 0xfc ? 0x80 : 0x00; + out.datai * 3 = (byte == 0xfc || byte == 0xf8) ? 0x80 : 0x00; + } gst_buffer_unmap (outbuf, &out); self->output_frames++; - gst_buffer_set_size (outbuf, cc_data_len); + gst_buffer_set_size (outbuf, s334_len); if (self->current_output_timecode.config.fps_n != 0 && !tc_meta) { gst_buffer_add_video_time_code_meta (outbuf, @@ -2058,32 +1206,22 @@ GstMapInfo out; GstVideoTimeCode tc = GST_VIDEO_TIME_CODE_INIT; const struct cdp_fps_entry *in_fps_entry = NULL, *out_fps_entry; - guint8 cea608_1MAX_CEA608_LEN, cea608_2MAX_CEA608_LEN; - guint8 ccp_dataMAX_CDP_PACKET_LEN; - guint cea608_1_len = MAX_CEA608_LEN, cea608_2_len = MAX_CEA608_LEN; - guint ccp_data_len = MAX_CDP_PACKET_LEN; guint out_len = 0; - if (!cdp_to_cea608_cc_data (self, inbuf, ccp_data, &ccp_data_len, - cea608_1, &cea608_1_len, cea608_2, &cea608_2_len, &tc, &in_fps_entry)) + if (!push_cdp_buffer (self, inbuf, &tc, &in_fps_entry)) goto out; out_fps_entry = cdp_fps_entry_from_fps (self->out_fps_n, self->out_fps_d); if (!out_fps_entry || out_fps_entry->fps_n == 0) out_fps_entry = in_fps_entry; - if (!fit_and_scale_cc_data (self, in_fps_entry, out_fps_entry, ccp_data, - &ccp_data_len, cea608_1, &cea608_1_len, cea608_2, &cea608_2_len, &tc)) + if (!can_take_buffer (self, in_fps_entry, out_fps_entry, &tc, + &self->current_output_timecode)) goto out; gst_buffer_map (outbuf, &out, GST_MAP_WRITE); out_len = (guint) out.size; - if (!combine_cc_data (self, FALSE, out_fps_entry, ccp_data, ccp_data_len, - cea608_1, cea608_1_len, cea608_2, cea608_2_len, out.data, &out_len)) { - gst_buffer_unmap (outbuf, &out); - out_len = 0; - goto out; - } + cc_buffer_take_cc_data (self->cc_buffer, out_fps_entry, out.data, &out_len); gst_buffer_unmap (outbuf, &out); self->output_frames++; @@ -2107,29 +1245,23 @@ GstMapInfo out; GstVideoTimeCode tc = GST_VIDEO_TIME_CODE_INIT; const struct cdp_fps_entry *in_fps_entry = NULL, *out_fps_entry; - guint8 cea608_1MAX_CEA608_LEN, cea608_2MAX_CEA608_LEN; - guint8 ccp_dataMAX_CDP_PACKET_LEN, cc_dataMAX_CDP_PACKET_LEN; - guint cea608_1_len = MAX_CEA608_LEN, cea608_2_len = MAX_CEA608_LEN; - guint ccp_data_len = MAX_CDP_PACKET_LEN, cc_data_len = MAX_CDP_PACKET_LEN; + guint8 cc_dataMAX_CDP_PACKET_LEN; + guint cc_data_len = MAX_CDP_PACKET_LEN; guint out_len = 0; - if (!cdp_to_cea608_cc_data (self, inbuf, ccp_data, &ccp_data_len, - cea608_1, &cea608_1_len, cea608_2, &cea608_2_len, &tc, &in_fps_entry)) + if (!push_cdp_buffer (self, inbuf, &tc, &in_fps_entry)) goto out; out_fps_entry = cdp_fps_entry_from_fps (self->out_fps_n, self->out_fps_d); if (!out_fps_entry || out_fps_entry->fps_n == 0) out_fps_entry = in_fps_entry; - if (!fit_and_scale_cc_data (self, in_fps_entry, out_fps_entry, ccp_data, - &ccp_data_len, cea608_1, &cea608_1_len, cea608_2, &cea608_2_len, &tc)) + if (!can_take_buffer (self, in_fps_entry, out_fps_entry, &tc, + &self->current_output_timecode)) goto out; - if (!combine_cc_data (self, TRUE, out_fps_entry, ccp_data, ccp_data_len, - cea608_1, cea608_1_len, cea608_2, cea608_2_len, cc_data, - &cc_data_len)) { - goto out; - } + cc_buffer_take_cc_data (self->cc_buffer, out_fps_entry, cc_data, + &cc_data_len); gst_buffer_map (outbuf, &out, GST_MAP_WRITE); out_len = @@ -2332,13 +1464,11 @@ static void reset_counters (GstCCConverter * self) { - self->scratch_ccp_len = 0; - self->scratch_cea608_1_len = 0; - self->scratch_cea608_2_len = 0; self->input_frames = 0; self->output_frames = 1; gst_video_time_code_clear (&self->current_output_timecode); gst_clear_buffer (&self->previous_buffer); + cc_buffer_discard (self->cc_buffer); } static GstFlowReturn @@ -2347,9 +1477,13 @@ GstBaseTransformClass *bclass = GST_BASE_TRANSFORM_GET_CLASS (self); GstBaseTransform *trans = GST_BASE_TRANSFORM (self); GstFlowReturn ret = GST_FLOW_OK; + guint cea608_1_len, cea608_2_len, ccp_len; - while (self->scratch_ccp_len > 0 || self->scratch_cea608_1_len > 0 - || self->scratch_cea608_2_len > 0 || can_generate_output (self)) { + cc_buffer_get_stored_size (self->cc_buffer, &cea608_1_len, &cea608_2_len, + &ccp_len); + + while (ccp_len > 0 || cea608_1_len > 0 || cea608_2_len > 0 + || can_generate_output (self)) { GstBuffer *outbuf; if (!self->previous_buffer) { @@ -2369,6 +1503,8 @@ } ret = gst_cc_converter_transform (self, NULL, outbuf); + cc_buffer_get_stored_size (self->cc_buffer, &cea608_1_len, &cea608_2_len, + &ccp_len); if (gst_buffer_get_size (outbuf) <= 0) { /* try to move the output along */ self->input_frames++; @@ -2481,11 +1617,7 @@ /* Resetting this is not really needed but makes debugging easier */ self->cdp_hdr_sequence_cntr = 0; self->current_output_timecode = (GstVideoTimeCode) GST_VIDEO_TIME_CODE_INIT; - self->input_frames = 0; - self->output_frames = 1; - self->scratch_ccp_len = 0; - self->scratch_cea608_1_len = 0; - self->scratch_cea608_2_len = 0; + reset_counters (self); return TRUE; } @@ -2534,6 +1666,16 @@ } static void +gst_cc_converter_finalize (GObject * object) +{ + GstCCConverter *self = GST_CCCONVERTER (object); + + gst_clear_object (&self->cc_buffer); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void gst_cc_converter_class_init (GstCCConverterClass * klass) { GObjectClass *gobject_class; @@ -2546,6 +1688,7 @@ gobject_class->set_property = gst_cc_converter_set_property; gobject_class->get_property = gst_cc_converter_get_property; + gobject_class->finalize = gst_cc_converter_finalize; /** * GstCCConverter:cdp-mode @@ -2600,4 +1743,5 @@ gst_cc_converter_init (GstCCConverter * self) { self->cdp_mode = DEFAULT_CDP_MODE; + self->cc_buffer = cc_buffer_new (); }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/closedcaption/gstccconverter.h -> gst-plugins-bad-1.22.0.tar.xz/ext/closedcaption/gstccconverter.h
Changed
@@ -25,6 +25,8 @@ #include <gst/base/base.h> #include <gst/video/video.h> +#include "ccutils.h" + G_BEGIN_DECLS #define GST_TYPE_CCCONVERTER \ (gst_cc_converter_get_type()) @@ -40,9 +42,6 @@ typedef struct _GstCCConverter GstCCConverter; typedef struct _GstCCConverterClass GstCCConverterClass; -#define MAX_CDP_PACKET_LEN 256 -#define MAX_CEA608_LEN 32 - typedef enum { GST_CC_CONVERTER_CDP_MODE_TIME_CODE = (1<<0), GST_CC_CONVERTER_CDP_MODE_CC_DATA = (1<<1), @@ -67,12 +66,7 @@ /* for framerate differences, we need to keep previous/next frames in order * to split/merge data across multiple input or output buffers. The data is * stored as cc_data */ - guint8 scratch_cea608_1MAX_CEA608_LEN; - guint scratch_cea608_1_len; - guint8 scratch_cea608_2MAX_CEA608_LEN; - guint scratch_cea608_2_len; - guint8 scratch_ccpMAX_CDP_PACKET_LEN; - guint scratch_ccp_len; + CCBuffer *cc_buffer; guint input_frames; guint output_frames;
View file
gst-plugins-bad-1.20.5.tar.xz/ext/closedcaption/gstclosedcaption.c -> gst-plugins-bad-1.22.0.tar.xz/ext/closedcaption/gstclosedcaption.c
Changed
@@ -31,12 +31,16 @@ #include "gstline21dec.h" #include "gstceaccoverlay.h" #include "gstline21enc.h" +#include "ccutils.h" static gboolean closedcaption_init (GstPlugin * plugin) { gboolean ret = FALSE; + GST_DEBUG_CATEGORY_INIT (ccutils_debug_cat, "ccutils", 0, + "Closed caption utilities"); + ret |= GST_ELEMENT_REGISTER (cccombiner, plugin); ret |= GST_ELEMENT_REGISTER (ccconverter, plugin); ret |= GST_ELEMENT_REGISTER (ccextractor, plugin);
View file
gst-plugins-bad-1.20.5.tar.xz/ext/closedcaption/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/closedcaption/meson.build
Changed
@@ -12,7 +12,7 @@ if closedcaption_dep.found() gstclosedcaption = library('gstclosedcaption', 'gstcccombiner.c', 'gstccextractor.c', 'gstccconverter.c', 'gstclosedcaption.c', - 'gstline21dec.c', 'gstcea708decoder.c', 'gstceaccoverlay.c', 'gstline21enc.c', + 'gstline21dec.c', 'gstcea708decoder.c', 'gstceaccoverlay.c', 'gstline21enc.c', 'ccutils.c', zvbi_sources, c_args : gst_plugins_bad_args, link_args : noseh_link_args, @@ -21,6 +21,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstclosedcaption, install_dir : plugins_pkgconfig_install_dir) plugins += gstclosedcaption endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/colormanagement/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/colormanagement/meson.build
Changed
@@ -9,6 +9,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstcolormanagement, install_dir : plugins_pkgconfig_install_dir) plugins += gstcolormanagement endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/curl/gstcurlbasesink.c -> gst-plugins-bad-1.22.0.tar.xz/ext/curl/gstcurlbasesink.c
Changed
@@ -144,6 +144,7 @@ static void gst_curl_base_sink_data_sent_notify (GstCurlBaseSink * sink); static void gst_curl_base_sink_wait_for_response (GstCurlBaseSink * sink); static void gst_curl_base_sink_got_response_notify (GstCurlBaseSink * sink); +static void gst_curl_base_sink_transfer_thread_close (GstCurlBaseSink * sink); static void handle_transfer (GstCurlBaseSink * sink); static size_t transfer_data_buffer (void *curl_ptr, TransferBuffer * buf, @@ -295,7 +296,7 @@ g_cond_signal (&sink->transfer_cond->cond); } -void +static void gst_curl_base_sink_transfer_thread_close (GstCurlBaseSink * sink) { GST_OBJECT_LOCK (sink);
View file
gst-plugins-bad-1.20.5.tar.xz/ext/curl/gstcurlbasesink.h -> gst-plugins-bad-1.22.0.tar.xz/ext/curl/gstcurlbasesink.h
Changed
@@ -111,7 +111,6 @@ void gst_curl_base_sink_transfer_thread_notify_unlocked (GstCurlBaseSink * sink); -void gst_curl_base_sink_transfer_thread_close (GstCurlBaseSink * sink); void gst_curl_base_sink_set_live (GstCurlBaseSink * sink, gboolean live); gboolean gst_curl_base_sink_is_live (GstCurlBaseSink * sink);
View file
gst-plugins-bad-1.20.5.tar.xz/ext/curl/gstcurlelement.c -> gst-plugins-bad-1.22.0.tar.xz/ext/curl/gstcurlelement.c
Changed
@@ -20,7 +20,7 @@ #include <config.h> #endif -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "gstcurlelements.h"
View file
gst-plugins-bad-1.20.5.tar.xz/ext/curl/gstcurlhttpsink.c -> gst-plugins-bad-1.22.0.tar.xz/ext/curl/gstcurlhttpsink.c
Changed
@@ -98,6 +98,7 @@ const GValue * value, GParamSpec * pspec); static void gst_curl_http_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); +static gboolean gst_curl_http_sink_stop (GstBaseSink * bsink); static void gst_curl_http_sink_finalize (GObject * gobject); static gboolean gst_curl_http_sink_set_header_unlocked (GstCurlBaseSink * bcsink); @@ -123,6 +124,7 @@ { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstCurlBaseSinkClass *gstcurlbasesink_class = (GstCurlBaseSinkClass *) klass; + GstBaseSinkClass *gstbasesink_class = (GstBaseSinkClass *) klass; GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GST_DEBUG_CATEGORY_INIT (gst_curl_http_sink_debug, "curlhttpsink", 0, @@ -144,6 +146,7 @@ gstcurlbasesink_class->transfer_prepare_poll_wait = gst_curl_http_sink_transfer_prepare_poll_wait; + gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_curl_http_sink_stop); gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_curl_http_sink_finalize); gobject_class->set_property = gst_curl_http_sink_set_property; @@ -171,7 +174,8 @@ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CONTENT_TYPE, g_param_spec_string ("content-type", "Content type", - "The mime type of the body of the request", NULL, + "Content Type to use for the Content-Type header. If not set, " + "detected mime type will be used", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } @@ -181,6 +185,7 @@ sink->header_list = NULL; sink->use_content_length = DEFAULT_USE_CONTENT_LENGTH; sink->content_type = NULL; + sink->discovered_content_type = NULL; sink->proxy_port = DEFAULT_PROXY_PORT; sink->proxy_headers_set = FALSE; @@ -200,6 +205,7 @@ g_free (this->proxy_user); g_free (this->proxy_passwd); g_free (this->content_type); + g_free (this->discovered_content_type); if (this->header_list) { curl_slist_free_all (this->header_list); @@ -319,6 +325,8 @@ { GstCurlHttpSink *sink = GST_CURL_HTTP_SINK (bcsink); gchar *tmp; + const gchar *used_content_type; + CURLcode res; if (sink->header_list) { @@ -352,9 +360,20 @@ "Transfer-Encoding: chunked"); } - tmp = g_strdup_printf ("Content-Type: %s", sink->content_type); - sink->header_list = curl_slist_append (sink->header_list, tmp); - g_free (tmp); + if (sink->content_type) + used_content_type = sink->content_type; + else + used_content_type = sink->discovered_content_type; + + if (used_content_type) { + tmp = g_strdup_printf ("Content-Type: %s", used_content_type); + sink->header_list = curl_slist_append (sink->header_list, tmp); + g_free (tmp); + } else { + GST_WARNING_OBJECT (sink, + "No content-type available to set in header, continue without it"); + } + set_headers: @@ -474,19 +493,32 @@ structure = gst_caps_get_structure (caps, 0); mime_type = gst_structure_get_name (structure); - g_free (sink->content_type); + g_free (sink->discovered_content_type); if (!g_strcmp0 (mime_type, "multipart/form-data") && gst_structure_has_field_typed (structure, "boundary", G_TYPE_STRING)) { const gchar *boundary; boundary = gst_structure_get_string (structure, "boundary"); - sink->content_type = g_strconcat (mime_type, "; boundary=", boundary, NULL); + sink->discovered_content_type = + g_strconcat (mime_type, "; boundary=", boundary, NULL); } else { - sink->content_type = g_strdup (mime_type); + sink->discovered_content_type = g_strdup (mime_type); } } static gboolean +gst_curl_http_sink_stop (GstBaseSink * bsink) +{ + gboolean ret; + GstCurlHttpSink *sink = GST_CURL_HTTP_SINK (bsink); + ret = GST_BASE_SINK_CLASS (parent_class)->stop (bsink); + + g_clear_pointer (&sink->discovered_content_type, g_free); + + return ret; +} + +static gboolean proxy_setup (GstCurlBaseSink * bcsink) { GstCurlHttpSink *sink = GST_CURL_HTTP_SINK (bcsink);
View file
gst-plugins-bad-1.20.5.tar.xz/ext/curl/gstcurlhttpsink.h -> gst-plugins-bad-1.22.0.tar.xz/ext/curl/gstcurlhttpsink.h
Changed
@@ -51,6 +51,7 @@ gchar *proxy_passwd; gboolean use_content_length; gchar *content_type; + gchar *discovered_content_type; gboolean use_proxy; gboolean proxy_headers_set; gboolean proxy_auth;
View file
gst-plugins-bad-1.20.5.tar.xz/ext/curl/gstcurlhttpsrc.c -> gst-plugins-bad-1.22.0.tar.xz/ext/curl/gstcurlhttpsrc.c
Changed
@@ -116,7 +116,7 @@ #include <config.h> #endif -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "gstcurlelements.h" #include "gstcurlhttpsrc.h"
View file
gst-plugins-bad-1.20.5.tar.xz/ext/curl/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/curl/meson.build
Changed
@@ -27,6 +27,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstcurl, install_dir : plugins_pkgconfig_install_dir) plugins += gstcurl endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dash/gstdashdemux.c -> gst-plugins-bad-1.22.0.tar.xz/ext/dash/gstdashdemux.c
Changed
@@ -285,7 +285,7 @@ #include <gst/base/gsttypefindhelper.h> #include <gst/tag/tag.h> #include <gst/net/gstnet.h> -#include "gst/gst-i18n-plugin.h" +#include <glib/gi18n-lib.h> #include "gstdashdemux.h" #include "gstdash_debug.h" @@ -844,6 +844,14 @@ stream = (GstDashDemuxStream *) gst_adaptive_demux_stream_new (GST_ADAPTIVE_DEMUX_CAST (demux), srcpad); stream->active_stream = active_stream; + + if (active_stream->cur_representation) { + stream->last_representation_id = + g_strdup (stream->active_stream->cur_representation->id); + } else { + stream->last_representation_id = NULL; + } + s = gst_caps_get_structure (caps, 0); stream->allow_sidx = gst_mpd_client_has_isoff_ondemand_profile (demux->client); @@ -1332,6 +1340,43 @@ if (gst_mpd_client_get_next_fragment_timestamp (dashdemux->client, dashstream->index, &ts)) { + /* For live streams, check whether the underlying representation changed + * (due to a manifest update with no matching representation) */ + if (gst_mpd_client_is_live (dashdemux->client) + && !GST_ADAPTIVE_DEMUX_STREAM_NEED_HEADER (stream)) { + if (dashstream->active_stream + && dashstream->active_stream->cur_representation) { + /* id specifies an identifier for this Representation. The + * identifier shall be unique within a Period unless the + * Representation is functionally identically to another + * Representation in the same Period. */ + if (g_strcmp0 (dashstream->active_stream->cur_representation->id, + dashstream->last_representation_id)) { + GstCaps *caps; + stream->need_header = TRUE; + + GST_INFO_OBJECT (dashdemux, + "Representation changed from %s to %s - updating to bitrate %d", + GST_STR_NULL (dashstream->last_representation_id), + GST_STR_NULL (dashstream->active_stream->cur_representation->id), + dashstream->active_stream->cur_representation->bandwidth); + + caps = + gst_dash_demux_get_input_caps (dashdemux, + dashstream->active_stream); + gst_adaptive_demux_stream_set_caps (stream, caps); + + /* Update the stored last representation id */ + g_free (dashstream->last_representation_id); + dashstream->last_representation_id = + g_strdup (dashstream->active_stream->cur_representation->id); + } + } else { + g_free (dashstream->last_representation_id); + dashstream->last_representation_id = NULL; + } + } + if (GST_ADAPTIVE_DEMUX_STREAM_NEED_HEADER (stream)) { gst_adaptive_demux_stream_fragment_clear (&stream->fragment); gst_dash_demux_stream_update_headers_info (stream); @@ -1751,7 +1796,7 @@ /* The goal here is to figure out, once we have pushed a keyframe downstream, * what the next ideal keyframe to download is. - * + * * This is done based on: * * the current internal position (i.e. actual_position) * * the reported downstream position (QoS feedback) @@ -2236,6 +2281,10 @@ gst_adaptive_demux_stream_set_caps (stream, caps); ret = TRUE; + /* Update the stored last representation id */ + g_free (dashstream->last_representation_id); + dashstream->last_representation_id = + g_strdup (active_stream->cur_representation->id); } else { GST_WARNING_OBJECT (demux, "Can not switch representation, aborting..."); } @@ -2468,7 +2517,8 @@ streams = demux->streams; } - /* update the streams to play from the next segment */ + /* update the streams to preserve the current representation if there is one, + * and to play from the next segment */ for (iter = streams, streams_iter = new_client->active_streams; iter && streams_iter; iter = g_list_next (iter), streams_iter = g_list_next (streams_iter)) { @@ -2485,6 +2535,37 @@ return GST_FLOW_EOS; } + if (new_stream->cur_adapt_set + && demux_stream->last_representation_id != NULL) { + + GList *rep_list = new_stream->cur_adapt_set->Representations; + GstMPDRepresentationNode *rep_node = + gst_mpd_client_get_representation_with_id (rep_list, + demux_stream->last_representation_id); + if (rep_node != NULL) { + if (gst_mpd_client_setup_representation (new_client, new_stream, + rep_node)) { + GST_DEBUG_OBJECT (GST_ADAPTIVE_DEMUX_STREAM_PAD (demux_stream), + "Found and set up matching representation %s in new manifest", + demux_stream->last_representation_id); + } else { + GST_ERROR_OBJECT (GST_ADAPTIVE_DEMUX_STREAM_PAD (demux_stream), + "Failed to set up representation %s in new manifest", + demux_stream->last_representation_id); + gst_mpd_client_free (new_client); + gst_buffer_unmap (buffer, &mapinfo); + return GST_FLOW_EOS; + } + } else { + /* If we failed to find the current representation, + * then update_fragment_info() will reconfigure to the + * new settings after the current download finishes */ + GST_WARNING_OBJECT (GST_ADAPTIVE_DEMUX_STREAM_PAD (demux_stream), + "Failed to find representation %s in new manifest", + demux_stream->last_representation_id); + } + } + if (gst_mpd_client_get_next_fragment_timestamp (dashdemux->client, demux_stream->index, &ts) || gst_mpd_client_get_last_fragment_timestamp_end (dashdemux->client, @@ -3560,6 +3641,7 @@ gst_isoff_moof_box_free (dash_stream->moof); if (dash_stream->moof_sync_samples) g_array_free (dash_stream->moof_sync_samples, TRUE); + g_free (dash_stream->last_representation_id); } static GstDashDemuxClockDrift * @@ -3671,7 +3753,7 @@ /* Parse an RFC5322 (section 3.3) date-time from the Date: field in the - HTTP response. + HTTP response. See https://tools.ietf.org/html/rfc5322#section-3.3 */ static GstDateTime *
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dash/gstdashdemux.h -> gst-plugins-bad-1.22.0.tar.xz/ext/dash/gstdashdemux.h
Changed
@@ -112,6 +112,8 @@ GstClockTime target_time; /* Average skip-ahead time (only in trickmode-key-units) */ GstClockTime average_skip_size; + + gchar *last_representation_id; }; /**
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dash/gstmpdclient.c -> gst-plugins-bad-1.22.0.tar.xz/ext/dash/gstmpdclient.c
Changed
@@ -79,7 +79,7 @@ return NULL; } -static GstMPDNode * +GstMPDRepresentationNode * gst_mpd_client_get_representation_with_id (GList * representations, gchar * rep_id) { @@ -89,11 +89,24 @@ for (list = g_list_first (representations); list; list = g_list_next (list)) { representation = (GstMPDRepresentationNode *) list->data; if (!g_strcmp0 (representation->id, rep_id)) - return GST_MPD_NODE (representation); + return GST_MPD_REPRESENTATION_NODE (representation); } return NULL; } +static GstMPDNode * +gst_mpd_client_get_representation_with_id_filter (GList * representations, + gchar * rep_id) +{ + GstMPDRepresentationNode *representation = + gst_mpd_client_get_representation_with_id (representations, rep_id); + + if (representation != NULL) + return GST_MPD_NODE (representation); + + return NULL; +} + static gchar * _generate_new_string_id (GList * list, const gchar * tuple, MpdClientStringIDFilter filter) @@ -1692,7 +1705,10 @@ GstClockTime chunk_time; selectedChunk = segment; - repeat_index = (ts - segment->start) / segment->duration; + repeat_index = + ((ts - segment->start) + + ((GstMediaSegment *) stream->segments->pdata0)->start) / + segment->duration; chunk_time = segment->start + segment->duration * repeat_index; @@ -2025,9 +2041,7 @@ GST_DEBUG ("currentChunk->SegmentURL = %p", currentChunk->SegmentURL); if (currentChunk->SegmentURL != NULL) { - mediaURL = - g_strdup (gst_mpdparser_get_mediaURL (stream, - currentChunk->SegmentURL)); + mediaURL = gst_mpdparser_get_mediaURL (stream, currentChunk->SegmentURL); indexURL = g_strdup (currentChunk->SegmentURL->index); } else if (stream->cur_seg_template != NULL) { mediaURL = @@ -2299,9 +2313,8 @@ *uri = NULL; if (stream->cur_segment_base) { if (stream->cur_segment_base->Initialization) { - *uri = - g_strdup (gst_mpdparser_get_initializationURL (stream, - stream->cur_segment_base->Initialization)); + *uri = gst_mpdparser_get_initializationURL (stream, + stream->cur_segment_base->Initialization); if (stream->cur_segment_base->Initialization->range) { *range_start = stream->cur_segment_base->Initialization->range->first_byte_pos; @@ -2309,9 +2322,8 @@ stream->cur_segment_base->Initialization->range->last_byte_pos; } } else if (stream->cur_segment_base->indexRange) { - *uri = - g_strdup (gst_mpdparser_get_initializationURL (stream, - stream->cur_segment_base->Initialization)); + *uri = gst_mpdparser_get_initializationURL (stream, + stream->cur_segment_base->Initialization); *range_start = 0; *range_end = stream->cur_segment_base->indexRange->first_byte_pos - 1; } @@ -2346,9 +2358,8 @@ GST_DEBUG ("Looking for current representation index"); *uri = NULL; if (stream->cur_segment_base && stream->cur_segment_base->indexRange) { - *uri = - g_strdup (gst_mpdparser_get_initializationURL (stream, - stream->cur_segment_base->RepresentationIndex)); + *uri = gst_mpdparser_get_initializationURL (stream, + stream->cur_segment_base->RepresentationIndex); *range_start = stream->cur_segment_base->indexRange->first_byte_pos; *range_end = stream->cur_segment_base->indexRange->last_byte_pos; } else if (stream->cur_seg_template && stream->cur_seg_template->index) { @@ -3243,8 +3254,8 @@ (period_node->AdaptationSets, adaptation_set_id)); g_return_val_if_fail (adap_set_node != NULL, NULL); rep_node = - GST_MPD_REPRESENTATION_NODE (gst_mpd_client_get_representation_with_id - (adap_set_node->Representations, representation_id)); + gst_mpd_client_get_representation_with_id (adap_set_node->Representations, + representation_id); if (!rep_node) { rep_node = gst_mpd_representation_node_new (); if (representation_id) @@ -3252,7 +3263,8 @@ else rep_node->id = _generate_new_string_id (adap_set_node->Representations, - "representation_%.2d", gst_mpd_client_get_representation_with_id); + "representation_%.2d", + gst_mpd_client_get_representation_with_id_filter); GST_DEBUG_OBJECT (client, "Add a new representation with id %s", rep_node->id); adap_set_node->Representations = @@ -3289,8 +3301,8 @@ g_return_val_if_fail (adaptation_set != NULL, FALSE); representation = - GST_MPD_REPRESENTATION_NODE (gst_mpd_client_get_representation_with_id - (adaptation_set->Representations, rep_id)); + gst_mpd_client_get_representation_with_id + (adaptation_set->Representations, rep_id); if (!representation->SegmentList) { representation->SegmentList = gst_mpd_segment_list_node_new (); } @@ -3326,8 +3338,8 @@ g_return_val_if_fail (adaptation_set != NULL, FALSE); representation = - GST_MPD_REPRESENTATION_NODE (gst_mpd_client_get_representation_with_id - (adaptation_set->Representations, rep_id)); + gst_mpd_client_get_representation_with_id + (adaptation_set->Representations, rep_id); if (!representation->SegmentTemplate) { representation->SegmentTemplate = gst_mpd_segment_template_node_new (); } @@ -3365,8 +3377,8 @@ g_return_val_if_fail (adaptation_set != NULL, FALSE); representation = - GST_MPD_REPRESENTATION_NODE (gst_mpd_client_get_representation_with_id - (adaptation_set->Representations, rep_id)); + gst_mpd_client_get_representation_with_id + (adaptation_set->Representations, rep_id); if (!representation->SegmentList) { representation->SegmentList = gst_mpd_segment_list_node_new ();
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dash/gstmpdclient.h -> gst-plugins-bad-1.22.0.tar.xz/ext/dash/gstmpdclient.h
Changed
@@ -99,6 +99,8 @@ /* Representation selection */ gint gst_mpd_client_get_rep_idx_with_max_bandwidth (GList *Representations, gint64 max_bandwidth, gint max_video_width, gint max_video_height, gint max_video_framerate_n, gint max_video_framerate_d); gint gst_mpd_client_get_rep_idx_with_min_bandwidth (GList * Representations); +GstMPDRepresentationNode* gst_mpd_client_get_representation_with_id (GList * representations, gchar * rep_id); + GstDateTime * gst_mpd_client_get_availability_start_time (GstMPDClient * client);
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dash/gstmpdparser.c -> gst-plugins-bad-1.22.0.tar.xz/ext/dash/gstmpdparser.c
Changed
@@ -1366,34 +1366,56 @@ } } -const gchar * +static gchar * +get_base_url_with_query (GstActiveStream * stream) +{ + GstUri *uri; + gchar *uri_str; + + if (!stream->queryURL) + return g_strdup (stream->baseURL); + + uri = gst_uri_from_string (stream->baseURL); + gst_uri_set_query_string (uri, stream->queryURL); + uri_str = gst_uri_to_string (uri); + + gst_uri_unref (uri); + return uri_str; +} + +/* + * gst_mpdparser_get_initializationURL: + * + * Returns: (transfer full): stream initializationURL if available, + * baseURL combined with queryURL otherwise. + */ +gchar * gst_mpdparser_get_initializationURL (GstActiveStream * stream, GstMPDURLTypeNode * InitializationURL) { - const gchar *url_prefix; - g_return_val_if_fail (stream != NULL, NULL); - url_prefix = (InitializationURL - && InitializationURL->sourceURL) ? InitializationURL->sourceURL : stream-> - baseURL; - - return url_prefix; + return (InitializationURL && InitializationURL->sourceURL) + ? g_strdup (InitializationURL->sourceURL) + : get_base_url_with_query (stream); } +/* + * gst_mpdparser_get_mediaURL: + * + * Returns: (transfer full): stream mediaURL if available, + * baseURL combined with queryURL otherwise. + */ gchar * gst_mpdparser_get_mediaURL (GstActiveStream * stream, GstMPDSegmentURLNode * segmentURL) { - const gchar *url_prefix; - g_return_val_if_fail (stream != NULL, NULL); g_return_val_if_fail (segmentURL != NULL, NULL); - url_prefix = segmentURL->media ? segmentURL->media : stream->baseURL; - g_return_val_if_fail (url_prefix != NULL, NULL); - - return segmentURL->media; + return (segmentURL->media) + ? g_strdup (segmentURL->media) + : get_base_url_with_query (stream); } /* navigation functions */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dash/gstmpdparser.h -> gst-plugins-bad-1.22.0.tar.xz/ext/dash/gstmpdparser.h
Changed
@@ -162,7 +162,7 @@ /* Active stream methods*/ void gst_mpdparser_init_active_stream_segments (GstActiveStream * stream); gchar *gst_mpdparser_get_mediaURL (GstActiveStream * stream, GstMPDSegmentURLNode * segmentURL); -const gchar *gst_mpdparser_get_initializationURL (GstActiveStream * stream, GstMPDURLTypeNode * InitializationURL); +gchar *gst_mpdparser_get_initializationURL (GstActiveStream * stream, GstMPDURLTypeNode * InitializationURL); gchar *gst_mpdparser_build_URL_from_template (const gchar * url_template, const gchar * id, guint number, guint bandwidth, guint64 time); G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dash/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/dash/meson.build
Changed
@@ -35,7 +35,7 @@ xml2_dep = dependency('libxml-2.0', version : '>= 2.8', - fallback : 'libxml2', 'xml2lib_dep', + fallback : 'libxml2', required : get_option('dash') ) @@ -51,6 +51,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstdashdemux, install_dir : plugins_pkgconfig_install_dir) plugins += gstdashdemux endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dc1394/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/dc1394/meson.build
Changed
@@ -8,6 +8,5 @@ install: true, install_dir: plugins_install_dir, ) - pkgconfig.generate(gstdc1394, install_dir: plugins_pkgconfig_install_dir) plugins += gstdc1394 endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/directfb/dfbvideosink.c -> gst-plugins-bad-1.22.0.tar.xz/ext/directfb/dfbvideosink.c
Changed
@@ -605,8 +605,10 @@ default: GST_DEBUG_OBJECT (dfbvideosink, "key press event %c !", event.input.key_symbol); - gst_navigation_send_key_event (GST_NAVIGATION (dfbvideosink), - "key-press", "prout"); + gst_dfbvideosink_navigation_send_event + (GST_NAVIGATION (dfbvideosink), + gst_navigation_event_new_key_press ("prout", + GST_NAVIGATION_MODIFIER_NONE)); } } else if (event.input.type == DIET_BUTTONPRESS) { gint x, y; @@ -616,8 +618,10 @@ GST_DEBUG_OBJECT (dfbvideosink, "button %d pressed at %dx%d", event.input.button, x, y); - gst_navigation_send_mouse_event (GST_NAVIGATION (dfbvideosink), - "mouse-button-press", event.input.button, x, y); + gst_dfbvideosink_navigation_send_event + (GST_NAVIGATION (dfbvideosink), + gst_navigation_event_new_mouse_button_press (event.input.button, + x, y, GST_NAVIGATION_MODIFIER_NONE)); } else if (event.input.type == DIET_BUTTONRELEASE) { gint x, y; @@ -626,14 +630,18 @@ GST_DEBUG_OBJECT (dfbvideosink, "button %d released at %dx%d", event.input.button, x, y); - gst_navigation_send_mouse_event (GST_NAVIGATION (dfbvideosink), - "mouse-button-release", event.input.button, x, y); + gst_dfbvideosink_navigation_send_event + (GST_NAVIGATION (dfbvideosink), + gst_navigation_event_new_mouse_button_release (event.input.button, + x, y, GST_NAVIGATION_MODIFIER_NONE)); } else if (event.input.type == DIET_AXISMOTION) { gint x, y; dfbvideosink->layer->GetCursorPosition (dfbvideosink->layer, &x, &y); - gst_navigation_send_mouse_event (GST_NAVIGATION (dfbvideosink), - "mouse-move", 0, x, y); + gst_dfbvideosink_navigation_send_event + (GST_NAVIGATION (dfbvideosink), + gst_navigation_event_new_mouse_move (x, y, + GST_NAVIGATION_MODIFIER_NONE)); } else { GST_WARNING_OBJECT (dfbvideosink, "unhandled event type %d", event.input.type); @@ -1983,10 +1991,9 @@ static void gst_dfbvideosink_navigation_send_event (GstNavigation * navigation, - GstStructure * structure) + GstEvent * event) { GstDfbVideoSink *dfbvideosink = GST_DFBVIDEOSINK (navigation); - GstEvent *event; GstVideoRectangle dst = { 0, }; GstVideoRectangle src = { 0, }; GstVideoRectangle result; @@ -1999,13 +2006,14 @@ dst.h = dfbvideosink->out_height; gst_video_sink_center_rect (src, dst, &result, dfbvideosink->hw_scaling); - event = gst_event_new_navigation (structure); + event = gst_event_make_writable (event); /* Our coordinates can be wrong here if we centered the video */ /* Converting pointer coordinates to the non scaled geometry */ - if (gst_structure_get_double (structure, "pointer_x", &old_x)) { + if (gst_navigation_event_get_coordinates (event, &old_x, &old_y)) { x = old_x; + y = old_y; if (x >= result.x && x <= (result.x + result.w)) { x -= result.x; @@ -2014,13 +2022,6 @@ } else { x = 0; } - GST_DEBUG_OBJECT (dfbvideosink, "translated navigation event x " - "coordinate from %f to %f", old_x, x); - gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, x, NULL); - } - if (gst_structure_get_double (structure, "pointer_y", &old_y)) { - y = old_y; - if (y >= result.y && y <= (result.y + result.h)) { y -= result.y; y *= dfbvideosink->video_height; @@ -2028,14 +2029,17 @@ } else { y = 0; } + + GST_DEBUG_OBJECT (dfbvideosink, "translated navigation event x " + "coordinate from %f to %f", old_x, x); GST_DEBUG_OBJECT (dfbvideosink, "translated navigation event y " "coordinate from %fd to %fd", old_y, y); - gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, y, NULL); + gst_navigation_event_set_coordinates (event, x, y); } pad = gst_pad_get_peer (GST_VIDEO_SINK_PAD (dfbvideosink)); - if (GST_IS_PAD (pad) && GST_IS_EVENT (event)) { + if (GST_IS_PAD (pad)) { if (!gst_pad_send_event (pad, gst_event_ref (event))) { /* If upstream didn't handle the event we'll post a message with it * for the application in case it wants to do something with it */ @@ -2051,7 +2055,7 @@ static void gst_dfbvideosink_navigation_init (GstNavigationInterface * iface) { - iface->send_event = gst_dfbvideosink_navigation_send_event; + iface->send_event_simple = gst_dfbvideosink_navigation_send_event; } static void
View file
gst-plugins-bad-1.20.5.tar.xz/ext/directfb/dfbvideosink.h -> gst-plugins-bad-1.22.0.tar.xz/ext/directfb/dfbvideosink.h
Changed
@@ -156,6 +156,10 @@ GType gst_dfbvideosink_get_type (void); GType gst_dfb_buffer_pool_get_type (void); +static void +gst_dfbvideosink_navigation_send_event (GstNavigation * navigation, + GstEvent * event); + GST_ELEMENT_REGISTER_DECLARE (dfbvideosink); G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/ext/directfb/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/directfb/meson.build
Changed
@@ -9,6 +9,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstdirectfb, install_dir : plugins_pkgconfig_install_dir) plugins += gstdirectfb endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dtls/gstdtlsagent.c -> gst-plugins-bad-1.22.0.tar.xz/ext/dtls/gstdtlsagent.c
Changed
@@ -58,7 +58,7 @@ GstDtlsCertificate *certificate; }; -G_DEFINE_TYPE_WITH_PRIVATE (GstDtlsAgent, gst_dtls_agent, G_TYPE_OBJECT); +G_DEFINE_TYPE_WITH_PRIVATE (GstDtlsAgent, gst_dtls_agent, GST_TYPE_OBJECT); static void gst_dtls_agent_finalize (GObject * gobject); static void gst_dtls_agent_set_property (GObject *, guint prop_id,
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dtls/gstdtlsagent.h -> gst-plugins-bad-1.22.0.tar.xz/ext/dtls/gstdtlsagent.h
Changed
@@ -28,7 +28,7 @@ #include "gstdtlscertificate.h" -#include <glib-object.h> +#include <gst/gst.h> G_BEGIN_DECLS @@ -52,13 +52,13 @@ * GstDtlsAgent needs to be constructed with the "certificate" property set. */ struct _GstDtlsAgent { - GObject parent_instance; + GstObject parent_instance; GstDtlsAgentPrivate *priv; }; struct _GstDtlsAgentClass { - GObjectClass parent_class; + GstObjectClass parent_class; }; GType gst_dtls_agent_get_type(void) G_GNUC_CONST;
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dtls/gstdtlsconnection.c -> gst-plugins-bad-1.22.0.tar.xz/ext/dtls/gstdtlsconnection.c
Changed
@@ -107,8 +107,8 @@ GThreadPool *thread_pool; }; -G_DEFINE_TYPE_WITH_CODE (GstDtlsConnection, gst_dtls_connection, G_TYPE_OBJECT, - G_ADD_PRIVATE (GstDtlsConnection) +G_DEFINE_TYPE_WITH_CODE (GstDtlsConnection, gst_dtls_connection, + GST_TYPE_OBJECT, G_ADD_PRIVATE (GstDtlsConnection) GST_DEBUG_CATEGORY_INIT (gst_dtls_connection_debug, "dtlsconnection", 0, "DTLS Connection"));
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dtls/gstdtlsconnection.h -> gst-plugins-bad-1.22.0.tar.xz/ext/dtls/gstdtlsconnection.h
Changed
@@ -85,13 +85,13 @@ * Once the DTLS handshake is completed, on-encoder-key and on-decoder-key will be signalled. */ struct _GstDtlsConnection { - GObject parent_instance; + GstObject parent_instance; GstDtlsConnectionPrivate *priv; }; struct _GstDtlsConnectionClass { - GObjectClass parent_class; + GstObjectClass parent_class; }; GType gst_dtls_connection_get_type(void) G_GNUC_CONST;
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dtls/gstdtlssrtpdec.c -> gst-plugins-bad-1.22.0.tar.xz/ext/dtls/gstdtlssrtpdec.c
Changed
@@ -62,7 +62,7 @@ #define gst_dtls_srtp_dec_parent_class parent_class G_DEFINE_TYPE_WITH_CODE (GstDtlsSrtpDec, gst_dtls_srtp_dec, GST_TYPE_DTLS_SRTP_BIN, GST_DEBUG_CATEGORY_INIT (gst_dtls_srtp_dec_debug, - "dtlssrtpdec", 0, "DTLS Decoder")); + "dtlssrtpdec", 0, "DTLS-SRTP Decoder")); GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (dtlssrtpdec, "dtlssrtpdec", GST_RANK_NONE, GST_TYPE_DTLS_SRTP_DEC, dtls_element_init (plugin));
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dtls/gstdtlssrtpenc.c -> gst-plugins-bad-1.22.0.tar.xz/ext/dtls/gstdtlssrtpenc.c
Changed
@@ -63,8 +63,9 @@ #define gst_dtls_srtp_enc_parent_class parent_class G_DEFINE_TYPE_WITH_CODE (GstDtlsSrtpEnc, gst_dtls_srtp_enc, - GST_TYPE_DTLS_SRTP_BIN, GST_DEBUG_CATEGORY_INIT (gst_dtls_srtp_enc_debug, - "dtlssrtpenc", 0, "DTLS Decoder")); + GST_TYPE_DTLS_SRTP_BIN, + GST_DEBUG_CATEGORY_INIT (gst_dtls_srtp_enc_debug, + "dtlssrtpenc", 0, "DTLS-SRTP Encoder")); GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (dtlssrtpenc, "dtlssrtpenc", GST_RANK_NONE, GST_TYPE_DTLS_SRTP_ENC, dtls_element_init (plugin));
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dtls/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/dtls/meson.build
Changed
@@ -24,6 +24,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstdtls, install_dir : plugins_pkgconfig_install_dir) plugins += gstdtls endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/dts/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/dts/meson.build
Changed
@@ -36,6 +36,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstdtsdec, install_dir : plugins_pkgconfig_install_dir) plugins += gstdtsdec endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/faac/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/faac/meson.build
Changed
@@ -13,6 +13,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstfaac, install_dir : plugins_pkgconfig_install_dir) plugins += gstfaac endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/faad/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/faad/meson.build
Changed
@@ -28,6 +28,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstfaad, install_dir : plugins_pkgconfig_install_dir) plugins += gstfaad endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/fdkaac/gstfdkaacdec.c -> gst-plugins-bad-1.22.0.tar.xz/ext/fdkaac/gstfdkaacdec.c
Changed
@@ -21,6 +21,7 @@ #include "config.h" #endif +#include "gstfdkaac.h" #include "gstfdkaacdec.h" #include <gst/pbutils/pbutils.h> @@ -78,6 +79,9 @@ GST_DEBUG_OBJECT (self, "start"); + gst_audio_info_init (&self->info); + self->sample_rate = 0; + return TRUE; } @@ -175,15 +179,374 @@ return FALSE; } - /* 8 channels * 2 bytes per sample * 2048 samples */ + /* 64 channels * 2048 samples * 2 bytes per sample */ if (!self->decode_buffer) { - self->decode_buffer_size = 8 * 2048; + self->decode_buffer_size = 64 * 2048; self->decode_buffer = g_new (gint16, self->decode_buffer_size); } return TRUE; } +static gboolean +gst_fdkaacdec_map_channels (GstFdkAacDec * self, const CStreamInfo * in, + gboolean * updated) +{ + GstAudioChannelPosition *positions = self->positions; + AUDIO_CHANNEL_TYPE *channel_types = in->pChannelType; + UCHAR *channel_indices = in->pChannelIndices; + INT i, channels = in->numChannels; + guint64 mask_mapped = 0; + +#define DEF_CHANSET(name, max) \ + GstAudioChannelPosition *set_ ## namemax = {NULL}; \ + guint n_ ## name = 0, mapped_ ## name = 0 + +#define PUSH_CHAN(name, index, pos_index) G_STMT_START { \ + if ((index) >= G_N_ELEMENTS (set_ ## name)) { \ + GST_WARNING_OBJECT (self, "Too many %s channels (%d)", \ + #name, (gint) (index)); \ + goto error; \ + } else if (set_ ## nameindex != NULL) { \ + GST_WARNING_OBJECT (self, "Channel %s%d already mapped", \ + #name, (gint) (index)); \ + goto error; \ + } else { \ + GST_DEBUG_OBJECT (self, "Mapping channel %s%d to %d", \ + #name, (gint) (index), (gint) pos_index); \ + set_ ## nameindex = &positionspos_index; \ + n_ ## name = MAX (n_ ## name, (index) + 1); \ + } \ + } G_STMT_END + +#define SHIFT_CHAN(name, pos) G_STMT_START { \ + if (mask_mapped & GST_AUDIO_CHANNEL_POSITION_MASK (pos)) { \ + GST_WARNING_OBJECT (self, "Position %s already mapped", #pos); \ + goto error; \ + } else if (set_ ## namemapped_ ## name == NULL) { \ + GST_WARNING_OBJECT (self, "Channel %s%u is a hole", \ + #name, mapped_ ## name); \ + goto error; \ + } else { \ + GST_DEBUG_OBJECT (self, "Mapping channel %s%u to %s", \ + #name, mapped_ ## name, #pos); \ + *set_ ## namemapped_ ## name ++ = GST_AUDIO_CHANNEL_POSITION_ ## pos; \ + mask_mapped |= GST_AUDIO_CHANNEL_POSITION_MASK (pos); \ + } \ + } G_STMT_END + + DEF_CHANSET (front, 7); + DEF_CHANSET (side, 2); + DEF_CHANSET (rear, 3); + DEF_CHANSET (lfe, 2); + DEF_CHANSET (top_front, 3); + DEF_CHANSET (top_center, 3); + DEF_CHANSET (top_rear, 3); + DEF_CHANSET (bottom_front, 3); + + if (self->channels == channels && + memcmp (self->channel_types, channel_types, + channels * sizeof *channel_types) == 0 && + memcmp (self->channel_indices, channel_indices, + channels * sizeof *channel_indices) == 0) { + GST_TRACE_OBJECT (self, "Reusing cached positions for %d channels", + channels); + return TRUE; + } + + self->channels = channels; + memcpy (self->channel_types, channel_types, channels * sizeof *channel_types); + memcpy (self->channel_indices, channel_indices, + channels * sizeof *channel_indices); + *updated = TRUE; + + for (i = 0; i < channels; i++) { + guint8 type = in->pChannelTypei; + guint8 index = in->pChannelIndicesi; + + switch (type) { + case ACT_FRONT: + PUSH_CHAN (front, index, i); + break; + case ACT_SIDE: + PUSH_CHAN (side, index, i); + break; + case ACT_BACK: + PUSH_CHAN (rear, index, i); + break; + case ACT_LFE: + PUSH_CHAN (lfe, index, i); + break; + case ACT_FRONT_TOP: + PUSH_CHAN (top_front, index, i); + break; + case ACT_SIDE_TOP: + PUSH_CHAN (top_center, index, i); + break; + case ACT_BACK_TOP: + PUSH_CHAN (top_rear, index, i); + break; +#ifdef HAVE_FDK_AAC_0_1_4 + case ACT_FRONT_BOTTOM: + PUSH_CHAN (bottom_front, index, i); + break; +#endif + case ACT_NONE: + GST_INFO_OBJECT (self, "Channel %d is unpositioned", i); + goto error; + default: + GST_ERROR_OBJECT (self, "Channel %d has unknown type %d", i, type); + goto error; + } + } + + /* Outwards from the front center, following ISO/IEC 13818-7 8.5.2.2 + * "Explicit channel mapping using a program_config_element()" */ + switch (n_front) { + case 7: + SHIFT_CHAN (front, FRONT_CENTER); + case 6: + SHIFT_CHAN (front, FRONT_LEFT_OF_CENTER); + SHIFT_CHAN (front, FRONT_RIGHT_OF_CENTER); + SHIFT_CHAN (front, FRONT_LEFT); + SHIFT_CHAN (front, FRONT_RIGHT); + SHIFT_CHAN (front, WIDE_LEFT); + SHIFT_CHAN (front, WIDE_RIGHT); + break; + + case 5: + SHIFT_CHAN (front, FRONT_CENTER); + case 4: + SHIFT_CHAN (front, FRONT_LEFT_OF_CENTER); + SHIFT_CHAN (front, FRONT_RIGHT_OF_CENTER); + SHIFT_CHAN (front, WIDE_LEFT); + SHIFT_CHAN (front, WIDE_RIGHT); + break; + + case 3: + SHIFT_CHAN (front, FRONT_CENTER); + case 2: + SHIFT_CHAN (front, FRONT_LEFT); + SHIFT_CHAN (front, FRONT_RIGHT); + break; + + case 1: + SHIFT_CHAN (front, FRONT_CENTER); + break; + } + + /* Front to rear */ + switch (n_side) { + case 2: + SHIFT_CHAN (side, SIDE_LEFT); + SHIFT_CHAN (side, SIDE_RIGHT); + break; + + case 1: + GST_ERROR_OBJECT (self, "Single side channel not supported"); + goto error; + } + + /* Inwards to the rear center */ + switch (n_rear) { + case 5: + SHIFT_CHAN (rear, SURROUND_LEFT); + SHIFT_CHAN (rear, SURROUND_RIGHT); + SHIFT_CHAN (rear, REAR_LEFT); + SHIFT_CHAN (rear, REAR_RIGHT); + SHIFT_CHAN (rear, REAR_CENTER); + break; + + case 4: + SHIFT_CHAN (rear, SURROUND_LEFT); + SHIFT_CHAN (rear, SURROUND_RIGHT); + SHIFT_CHAN (rear, REAR_LEFT); + SHIFT_CHAN (rear, REAR_RIGHT); + break; + + case 3: + SHIFT_CHAN (rear, SURROUND_LEFT); + SHIFT_CHAN (rear, SURROUND_RIGHT); + SHIFT_CHAN (rear, REAR_CENTER); + break; + + case 2: + SHIFT_CHAN (rear, SURROUND_LEFT); + SHIFT_CHAN (rear, SURROUND_RIGHT); + break; + + case 1: + SHIFT_CHAN (rear, REAR_CENTER); + break; + } + + switch (n_lfe) { + case 2: + SHIFT_CHAN (lfe, LFE1); + SHIFT_CHAN (lfe, LFE2); + break; + + case 1: + SHIFT_CHAN (lfe, LFE1); + break; + } + + switch (n_top_front) { + case 3: + SHIFT_CHAN (top_front, TOP_FRONT_CENTER); + case 2: + SHIFT_CHAN (top_front, TOP_FRONT_LEFT); + SHIFT_CHAN (top_front, TOP_FRONT_RIGHT); + break; + + case 1: + SHIFT_CHAN (top_front, TOP_FRONT_CENTER); + break; + } + + switch (n_top_center) { + case 3: + SHIFT_CHAN (top_center, TOP_CENTER); + case 2: + SHIFT_CHAN (top_center, TOP_SIDE_LEFT); + SHIFT_CHAN (top_center, TOP_SIDE_RIGHT); + break; + + case 1: + SHIFT_CHAN (top_center, TOP_CENTER); + break; + } + + switch (n_top_rear) { + case 3: + SHIFT_CHAN (top_rear, TOP_REAR_LEFT); + SHIFT_CHAN (top_rear, TOP_REAR_RIGHT); + SHIFT_CHAN (top_rear, TOP_REAR_CENTER); + break; + + case 2: + SHIFT_CHAN (top_rear, TOP_REAR_LEFT); + SHIFT_CHAN (top_rear, TOP_REAR_RIGHT); + break; + + case 1: + SHIFT_CHAN (top_rear, TOP_REAR_CENTER); + break; + } + + switch (n_bottom_front) { + case 3: + SHIFT_CHAN (bottom_front, BOTTOM_FRONT_CENTER); + case 2: + SHIFT_CHAN (bottom_front, BOTTOM_FRONT_LEFT); + SHIFT_CHAN (bottom_front, BOTTOM_FRONT_RIGHT); + break; + + case 1: + SHIFT_CHAN (bottom_front, BOTTOM_FRONT_CENTER); + break; + } + + if (mask_mapped != 0) { + GST_INFO_OBJECT (self, "Mapped %d front, %d side, %d rear, %d lfe," + " %d top front, %d top center, %d top rear, %d bottom front channels", + mapped_front, mapped_side, mapped_rear, mapped_lfe, mapped_top_front, + mapped_top_center, mapped_top_rear, mapped_bottom_front); + return TRUE; + } + + if (channels == 1) { + GST_INFO_OBJECT (self, "Mapped a mono channel"); + positions0 = GST_AUDIO_CHANNEL_POSITION_MONO; + return TRUE; + } + +error: + if (channels > 0) { + GST_WARNING_OBJECT (self, "Mapped %d channels, without positions", + channels); + for (i = 0; i < channels; i++) + positionsi = GST_AUDIO_CHANNEL_POSITION_NONE; + return TRUE; + } + + GST_ERROR_OBJECT (self, "No channels to map"); + return FALSE; + +#undef DEF_CHANSET +#undef PUSH_CHAN +#undef SHIFT_CHAN +} + +static gboolean +gst_fdkaacdec_map_channel_config (GstFdkAacDec * self, const CStreamInfo * in, + gboolean * updated) +{ + const GstFdkAacChannelLayout *layout; + CHANNEL_MODE config = in->channelConfig; + INT channels = in->numChannels; + + if (config == 0) { + return gst_fdkaacdec_map_channels (self, in, updated); + } + + if (self->config == config && self->channels == channels) { + GST_TRACE_OBJECT (self, + "Reusing cached positions for channelConfig %d (%d channels)", + config, channels); + return TRUE; + } + + self->config = config; + self->channels = channels; + *updated = TRUE; + + for (layout = channel_layouts; layout->channels; layout++) { + if (layout->mode == config && layout->channels == channels) + break; + } + + if (!layout->channels) { + GST_WARNING_OBJECT (self, "Unknown channelConfig %d (%d channels)", + config, channels); + return gst_fdkaacdec_map_channels (self, in, updated); + } + + GST_INFO_OBJECT (self, "Known channelConfig %d (%d channels)", + config, channels); + memcpy (self->positions, layout->positions, + channels * sizeof *self->positions); + + return TRUE; +} + +static gboolean +gst_fdkaacdec_update_info (GstFdkAacDec * self) +{ + GstAudioChannelPosition positions64; + GstAudioInfo *info = &self->info; + gint channels = self->channels; + + memcpy (positions, self->positions, channels * sizeof *positions); + + if (!gst_audio_channel_positions_to_valid_order (positions, channels)) { + GST_ERROR_OBJECT (self, "Failed to reorder channels"); + return FALSE; + } + + gst_audio_info_set_format (info, GST_AUDIO_FORMAT_S16, self->sample_rate, + channels, positions); + + if (!gst_audio_decoder_set_output_format (GST_AUDIO_DECODER (self), info)) { + GST_ERROR_OBJECT (self, "Failed to set output format"); + return FALSE; + } + + self->need_reorder = memcmp (positions, self->positions, + channels * sizeof *positions) != 0; + return TRUE; +} + static GstFlowReturn gst_fdkaacdec_handle_frame (GstAudioDecoder * dec, GstBuffer * inbuf) { @@ -192,12 +555,10 @@ GstBuffer *outbuf; GstMapInfo imap; AAC_DECODER_ERROR err; + UINT flags = 0; guint size, valid; CStreamInfo *stream_info; - GstAudioInfo info; - guint flags = 0, i; - GstAudioChannelPosition pos64, gst_pos64; - gboolean need_reorder; + gboolean updated = FALSE; if (inbuf) { gst_buffer_ref (inbuf); @@ -224,6 +585,15 @@ ret = GST_FLOW_OK; outbuf = NULL; goto finish; + } else if ((err != AAC_DEC_OK) && (flags & AACDEC_FLUSH)) { + /* + * A flush/drain was requested when set_format got called. When a flush + * gets requested, aacDecoder_DecodeFrame may not return AAC_DEC_OK. Do + * not report a decoding error with GST_AUDIO_DECODER_ERROR for this case. + */ + GST_LOG_OBJECT (self, "Decoder flush was requested"); + ret = GST_FLOW_OK; + goto out; } else if (err != AAC_DEC_OK) { GST_AUDIO_DECODER_ERROR (self, 1, STREAM, DECODE, (NULL), ("decoding error: %d", err), ret); @@ -237,176 +607,33 @@ goto out; } - /* FIXME: Don't recalculate this on every buffer */ - if (stream_info->numChannels == 1) { - pos0 = GST_AUDIO_CHANNEL_POSITION_MONO; - } else { - gint n_front = 0, n_back = 0, n_lfe = 0; - - /* FIXME: Can this be simplified somehow? */ - for (i = 0; i < stream_info->numChannels; i++) { - if (stream_info->pChannelTypei == ACT_FRONT) { - n_front++; - } else if (stream_info->pChannelTypei == ACT_BACK) { - n_back++; - } else if (stream_info->pChannelTypei == ACT_LFE) { - n_lfe++; - } else { - GST_ERROR_OBJECT (self, "Channel type %d not supported", - stream_info->pChannelTypei); - ret = GST_FLOW_NOT_NEGOTIATED; - goto out; - } - } - - for (i = 0; i < stream_info->numChannels; i++) { - if (stream_info->pChannelTypei == ACT_FRONT) { - if (stream_info->pChannelIndicesi == 0) { - if (n_front & 1) - posi = GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER; - else if (n_front > 2) - posi = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER; - else - posi = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT; - } else if (stream_info->pChannelIndicesi == 1) { - if ((n_front & 1) && n_front > 3) - posi = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER; - else if (n_front & 1) - posi = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT; - else if (n_front > 2) - posi = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER; - else - posi = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT; - } else if (stream_info->pChannelIndicesi == 2) { - if ((n_front & 1) && n_front > 3) - posi = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER; - else if (n_front & 1) - posi = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT; - else if (n_front > 2) - posi = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT; - else - g_assert_not_reached (); - } else if (stream_info->pChannelIndicesi == 3) { - if ((n_front & 1) && n_front > 3) - posi = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT; - else if (n_front & 1) - g_assert_not_reached (); - else if (n_front > 2) - posi = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT; - else - g_assert_not_reached (); - } else if (stream_info->pChannelIndicesi == 4) { - if ((n_front & 1) && n_front > 2) - posi = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT; - else if (n_front & 1) - g_assert_not_reached (); - else if (n_front > 2) - g_assert_not_reached (); - else - g_assert_not_reached (); - } else { - GST_ERROR_OBJECT (self, "Front channel index %d not supported", - stream_info->pChannelIndicesi); - ret = GST_FLOW_NOT_NEGOTIATED; - goto out; - } - } else if (stream_info->pChannelTypei == ACT_BACK) { - if (stream_info->pChannelIndicesi == 0) { - if (n_back & 1) - posi = GST_AUDIO_CHANNEL_POSITION_REAR_CENTER; - else if (n_back > 2) - posi = GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT; - else - posi = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT; - } else if (stream_info->pChannelIndicesi == 1) { - if ((n_back & 1) && n_back > 3) - posi = GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT; - else if (n_back & 1) - posi = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT; - else if (n_back > 2) - posi = GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT; - else - posi = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT; - } else if (stream_info->pChannelIndicesi == 2) { - if ((n_back & 1) && n_back > 3) - posi = GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT; - else if (n_back & 1) - posi = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT; - else if (n_back > 2) - posi = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT; - else - g_assert_not_reached (); - } else if (stream_info->pChannelIndicesi == 3) { - if ((n_back & 1) && n_back > 3) - posi = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT; - else if (n_back & 1) - g_assert_not_reached (); - else if (n_back > 2) - posi = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT; - else - g_assert_not_reached (); - } else if (stream_info->pChannelIndicesi == 4) { - if ((n_back & 1) && n_back > 3) - posi = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT; - else if (n_back & 1) - g_assert_not_reached (); - else if (n_back > 2) - g_assert_not_reached (); - else - g_assert_not_reached (); - } else { - GST_ERROR_OBJECT (self, "Side channel index %d not supported", - stream_info->pChannelIndicesi); - ret = GST_FLOW_NOT_NEGOTIATED; - goto out; - } - } else if (stream_info->pChannelTypei == ACT_LFE) { - if (stream_info->pChannelIndicesi == 0) { - posi = GST_AUDIO_CHANNEL_POSITION_LFE1; - } else { - GST_ERROR_OBJECT (self, "LFE channel index %d not supported", - stream_info->pChannelIndicesi); - ret = GST_FLOW_NOT_NEGOTIATED; - goto out; - } - } else { - GST_ERROR_OBJECT (self, "Channel type %d not supported", - stream_info->pChannelTypei); - ret = GST_FLOW_NOT_NEGOTIATED; - goto out; - } - } + if (stream_info->sampleRate != self->sample_rate) { + self->sample_rate = stream_info->sampleRate; + updated = TRUE; } - memcpy (gst_pos, pos, - sizeof (GstAudioChannelPosition) * stream_info->numChannels); - if (!gst_audio_channel_positions_to_valid_order (gst_pos, - stream_info->numChannels)) { + if (!gst_fdkaacdec_map_channel_config (self, stream_info, &updated)) { ret = GST_FLOW_NOT_NEGOTIATED; goto out; } - need_reorder = - memcmp (pos, gst_pos, - sizeof (GstAudioChannelPosition) * stream_info->numChannels) != 0; - - gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_S16, - stream_info->sampleRate, stream_info->numChannels, gst_pos); - if (!gst_audio_decoder_set_output_format (dec, &info)) { - GST_ERROR_OBJECT (self, "Failed to set output format"); + if (updated && !gst_fdkaacdec_update_info (self)) { ret = GST_FLOW_NOT_NEGOTIATED; goto out; } outbuf = gst_audio_decoder_allocate_output_buffer (dec, - stream_info->frameSize * GST_AUDIO_INFO_BPF (&info)); + stream_info->frameSize * GST_AUDIO_INFO_BPF (&self->info)); + gst_buffer_fill (outbuf, 0, self->decode_buffer, gst_buffer_get_size (outbuf)); - if (need_reorder) { - gst_audio_buffer_reorder_channels (outbuf, GST_AUDIO_INFO_FORMAT (&info), - GST_AUDIO_INFO_CHANNELS (&info), pos, gst_pos); + if (self->need_reorder) { + gst_audio_buffer_reorder_channels (outbuf, + GST_AUDIO_INFO_FORMAT (&self->info), + GST_AUDIO_INFO_CHANNELS (&self->info), + self->positions, self->info.position); } finish:
View file
gst-plugins-bad-1.20.5.tar.xz/ext/fdkaac/gstfdkaacdec.h -> gst-plugins-bad-1.22.0.tar.xz/ext/fdkaac/gstfdkaacdec.h
Changed
@@ -47,6 +47,16 @@ HANDLE_AACDECODER dec; gint16 *decode_buffer; gint decode_buffer_size; + + INT sample_rate; + CHANNEL_MODE config; + INT channels; + AUDIO_CHANNEL_TYPE channel_types64; + UCHAR channel_indices64; + GstAudioChannelPosition positions64; + + gboolean need_reorder; + GstAudioInfo info; }; struct _GstFdkAacDecClass {
View file
gst-plugins-bad-1.20.5.tar.xz/ext/fdkaac/gstfdkaacenc.c -> gst-plugins-bad-1.22.0.tar.xz/ext/fdkaac/gstfdkaacenc.c
Changed
@@ -30,7 +30,6 @@ /* TODO: * - Add support for other AOT / profiles - * - Expose more properties, e.g. afterburner and vbr * - Signal encoder delay * - LOAS / LATM support */ @@ -38,10 +37,17 @@ enum { PROP_0, - PROP_BITRATE + PROP_AFTERBURNER, + PROP_BITRATE, + PROP_PEAK_BITRATE, + PROP_RATE_CONTROL, + PROP_VBR_PRESET, }; #define DEFAULT_BITRATE (0) +#define DEFAULT_PEAK_BITRATE (0) +#define DEFAULT_RATE_CONTROL (GST_FDK_AAC_RATE_CONTROL_CONSTANT_BITRATE) +#define DEFAULT_VBR_PRESET (GST_FDK_AAC_VBR_PRESET_MEDIUM) #define SAMPLE_RATES " 8000, " \ "11025, " \ @@ -74,7 +80,8 @@ "rate = (int) { " SAMPLE_RATES " }, " "channels = (int) {1, 2, 3, 4, 5, 6, 8}, " "stream-format = (string) { adts, adif, raw }, " - "base-profile = (string) lc, " "framed = (boolean) true") + "profile = (string) { lc, he-aac-v1, he-aac-v2, ld }, " + "framed = (boolean) true") ); GST_DEBUG_CATEGORY_STATIC (gst_fdkaacenc_debug); @@ -98,6 +105,46 @@ GST_ELEMENT_REGISTER_DEFINE (fdkaacenc, "fdkaacenc", GST_RANK_PRIMARY, GST_TYPE_FDKAACENC); +#define GST_FDK_AAC_VBR_PRESET (gst_fdk_aac_vbr_preset_get_type ()) +static GType +gst_fdk_aac_vbr_preset_get_type (void) +{ + static GType fdk_aac_vbr_preset_type = 0; + static const GEnumValue vbr_preset_types = { + {GST_FDK_AAC_VBR_PRESET_VERY_LOW, "Very Low Variable Bitrate", "very-low"}, + {GST_FDK_AAC_VBR_PRESET_LOW, "Low Variable Bitrate", "low"}, + {GST_FDK_AAC_VBR_PRESET_MEDIUM, "Medium Variable Bitrate", "medium"}, + {GST_FDK_AAC_VBR_PRESET_HIGH, "High Variable Bitrate", "high"}, + {GST_FDK_AAC_VBR_PRESET_VERY_HIGH, "Very High Variable Bitrate", + "very-high"}, + {0, NULL, NULL} + }; + + if (!fdk_aac_vbr_preset_type) + fdk_aac_vbr_preset_type = + g_enum_register_static ("GstFdkAacVbrPreset", vbr_preset_types); + + return fdk_aac_vbr_preset_type; +} + +#define GST_FDK_AAC_RATE_CONTROL (gst_fdk_aac_rate_control_get_type ()) +static GType +gst_fdk_aac_rate_control_get_type (void) +{ + static GType fdk_aac_rate_control_type = 0; + static const GEnumValue rate_control_types = { + {GST_FDK_AAC_RATE_CONTROL_CONSTANT_BITRATE, "Constant Bitrate", "cbr"}, + {GST_FDK_AAC_RATE_CONTROL_VARIABLE_BITRATE, "Variable Bitrate", "vbr"}, + {0, NULL, NULL} + }; + + if (!fdk_aac_rate_control_type) + fdk_aac_rate_control_type = + g_enum_register_static ("GstFdkAacRateControl", rate_control_types); + + return fdk_aac_rate_control_type; +} + static void gst_fdkaacenc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -108,6 +155,18 @@ case PROP_BITRATE: self->bitrate = g_value_get_int (value); break; + case PROP_AFTERBURNER: + self->afterburner = g_value_get_boolean (value); + break; + case PROP_PEAK_BITRATE: + self->peak_bitrate = g_value_get_int (value); + break; + case PROP_RATE_CONTROL: + self->rate_control = g_value_get_enum (value); + break; + case PROP_VBR_PRESET: + self->vbr_preset = g_value_get_enum (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -125,6 +184,18 @@ case PROP_BITRATE: g_value_set_int (value, self->bitrate); break; + case PROP_AFTERBURNER: + g_value_set_boolean (value, self->afterburner); + break; + case PROP_PEAK_BITRATE: + g_value_set_int (value, self->peak_bitrate); + break; + case PROP_RATE_CONTROL: + g_value_set_enum (value, self->rate_control); + break; + case PROP_VBR_PRESET: + g_value_set_enum (value, self->vbr_preset); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -162,14 +233,34 @@ gst_fdkaacenc_get_caps (GstAudioEncoder * enc, GstCaps * filter) { const GstFdkAacChannelLayout *layout; - GstCaps *res, *caps; + GstCaps *res, *caps, *allowed_caps; + gboolean allow_mono = TRUE; + + allowed_caps = gst_pad_get_allowed_caps (GST_AUDIO_ENCODER_SRC_PAD (enc)); + GST_DEBUG_OBJECT (enc, "allowed caps %" GST_PTR_FORMAT, allowed_caps); + + /* We need at least 2 channels if Parametric Stereo is in use. */ + if (allowed_caps && gst_caps_get_size (allowed_caps) > 0) { + GstStructure *s = gst_caps_get_structure (allowed_caps, 0); + const gchar *profile = NULL; + + if ((profile = gst_structure_get_string (s, "profile")) + && strcmp (profile, "he-aac-v2") == 0) { + allow_mono = FALSE; + } + } + gst_clear_caps (&allowed_caps); caps = gst_caps_new_empty (); for (layout = channel_layouts; layout->channels; layout++) { + GstCaps *tmp; gint channels = layout->channels; - GstCaps *tmp = - gst_caps_make_writable (gst_pad_get_pad_template_caps + + if (channels == 1 && !allow_mono) + continue; + + tmp = gst_caps_make_writable (gst_pad_get_pad_template_caps (GST_AUDIO_ENCODER_SINK_PAD (enc))); if (channels == 1) { @@ -199,11 +290,14 @@ GstCaps *allowed_caps; GstCaps *src_caps; AACENC_ERROR err; - gint transmux = 0, aot = AOT_AAC_LC; + gint transmux = 0; gint mpegversion = 4; + gint aot = AOT_AAC_LC; + const gchar *profile_str = "lc"; CHANNEL_MODE channel_mode; AACENC_InfoStruct enc_info = { 0 }; - gint bitrate; + gint bitrate, signaling_mode; + guint bitrate_mode; if (self->enc && !self->is_drained) { /* drain */ @@ -233,6 +327,26 @@ } } + if ((str = gst_structure_get_string (s, "profile"))) { + if (strcmp (str, "lc") == 0) { + GST_DEBUG_OBJECT (self, "using AAC-LC profile for output"); + aot = AOT_AAC_LC; + profile_str = "lc"; + } else if (strcmp (str, "he-aac-v1") == 0) { + GST_DEBUG_OBJECT (self, "using SBR (HE-AACv1) profile for output"); + aot = AOT_SBR; + profile_str = "he-aac-v1"; + } else if (strcmp (str, "he-aac-v2") == 0) { + GST_DEBUG_OBJECT (self, "using PS (HE-AACv2) profile for output"); + aot = AOT_PS; + profile_str = "he-aac-v2"; + } else if (strcmp (str, "ld") == 0) { + GST_DEBUG_OBJECT (self, "using AAC-LD profile for output"); + aot = AOT_ER_AAC_LD; + profile_str = "ld"; + } + } + gst_structure_get_int (s, "mpegversion", &mpegversion); } if (allowed_caps) @@ -244,13 +358,25 @@ return FALSE; } - aot = AOT_AAC_LC; - if ((err = aacEncoder_SetParam (self->enc, AACENC_AOT, aot)) != AACENC_OK) { GST_ERROR_OBJECT (self, "Unable to set AOT %d: %d", aot, err); return FALSE; } + /* Use explicit hierarchical signaling (2) with raw output stream-format + * and implicit signaling (0) with ADTS/ADIF */ + if (transmux == 0) + signaling_mode = 2; + else + signaling_mode = 0; + + if ((err = aacEncoder_SetParam (self->enc, AACENC_SIGNALING_MODE, + signaling_mode)) != AACENC_OK) { + GST_ERROR_OBJECT (self, "Unable to set signaling mode %d: %d", + signaling_mode, err); + return FALSE; + } + if ((err = aacEncoder_SetParam (self->enc, AACENC_SAMPLERATE, GST_AUDIO_INFO_RATE (info))) != AACENC_OK) { GST_ERROR_OBJECT (self, "Unable to set sample rate %d: %d", @@ -372,6 +498,44 @@ return FALSE; } + if (self->rate_control == GST_FDK_AAC_RATE_CONTROL_CONSTANT_BITRATE) { + /* + * Note that the `bitrate` property is honoured only when using + * constant bit rate. + */ + bitrate_mode = 0; // Constant Bitrate + } else { + bitrate_mode = self->vbr_preset; + } + + if ((err = aacEncoder_SetParam (self->enc, AACENC_BITRATEMODE, + bitrate_mode)) != AACENC_OK) { + GST_ERROR_OBJECT (self, "Unable to set bitrate mode %d: %d", + bitrate_mode, err); + return FALSE; + } + + if (self->peak_bitrate) { + if ((err = aacEncoder_SetParam (self->enc, AACENC_PEAK_BITRATE, + self->peak_bitrate)) != AACENC_OK) { + GST_ERROR_OBJECT (self, "Unable to set peak bitrate %d: %d", + self->peak_bitrate, err); + return FALSE; + } + + GST_INFO_OBJECT (self, "Setting peak bitrate to %d", self->peak_bitrate); + } + + if (self->afterburner) { + if ((err = + aacEncoder_SetParam (self->enc, AACENC_AFTERBURNER, + 1)) != AACENC_OK) { + GST_ERROR_OBJECT (self, "Could not enable afterburner: %d", err); + return FALSE; + } + + GST_INFO_OBJECT (self, "Afterburner enabled"); + } if ((err = aacEncEncode (self->enc, NULL, NULL, NULL, NULL)) != AACENC_OK) { GST_ERROR_OBJECT (self, "Unable to initialize encoder: %d", err); return FALSE; @@ -415,6 +579,17 @@ gst_codec_utils_aac_caps_set_level_and_profile (src_caps, enc_info.confBuf, enc_info.confSize); + /* The above only parses the "base" profile, which is always going to be LC. + * Set actual profile. */ + gst_caps_set_simple (src_caps, "profile", G_TYPE_STRING, profile_str, NULL); + + /* An AAC-LC-only decoder will not decode a stream that uses explicit + * hierarchical signaling */ + if (signaling_mode == 2 && aot != AOT_AAC_LC) { + gst_structure_remove_field (gst_caps_get_structure (src_caps, 0), + "base-profile"); + } + ret = gst_audio_encoder_set_output_format (enc, src_caps); gst_caps_unref (src_caps); @@ -547,6 +722,10 @@ self->bitrate = DEFAULT_BITRATE; self->enc = NULL; self->is_drained = TRUE; + self->afterburner = FALSE; + self->peak_bitrate = DEFAULT_PEAK_BITRATE; + self->rate_control = DEFAULT_RATE_CONTROL; + self->vbr_preset = DEFAULT_VBR_PRESET; gst_audio_encoder_set_drainable (GST_AUDIO_ENCODER (self), TRUE); } @@ -571,11 +750,64 @@ g_object_class_install_property (object_class, PROP_BITRATE, g_param_spec_int ("bitrate", "Bitrate", - "Target Audio Bitrate (0 = fixed value based on " - " sample rate and channel count)", + "Target Audio Bitrate. Only applicable if rate-control=cbr. " + "(0 = fixed value based on sample rate and channel count)", 0, G_MAXINT, DEFAULT_BITRATE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstFdkAacEnc:peak-bitrate: + * + * Peak Bitrate to adjust maximum bits per audio frame. + * + * Since: 1.22 + */ + g_object_class_install_property (object_class, PROP_PEAK_BITRATE, + g_param_spec_int ("peak-bitrate", + "Peak Bitrate", + "Peak Bitrate to adjust maximum bits per audio frame. " + "Bitrate is in bits/second. Only applicable if rate-control=vbr. (0 = Not set)", + 0, G_MAXINT, DEFAULT_PEAK_BITRATE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstFdkAacEnc:afterburner: + * + * Afterburner - Quality Parameter. + * + * Since: 1.22 + */ + g_object_class_install_property (object_class, PROP_AFTERBURNER, + g_param_spec_boolean ("afterburner", "Afterburner - Quality Parameter", + "Additional quality control parameter. Can cause workload increase.", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstFdkAacEnc:rate-control: + * + * Rate Control. + * + * Since: 1.22 + */ + g_object_class_install_property (object_class, PROP_RATE_CONTROL, + g_param_spec_enum ("rate-control", "Rate Control", + "Whether Constant or Variable Bitrate should be used.", + GST_FDK_AAC_RATE_CONTROL, DEFAULT_RATE_CONTROL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstFdkAacEnc:vbr-preset: + * + * AAC Variable Bitrate configurations. + * + * Since: 1.22 + */ + g_object_class_install_property (object_class, PROP_VBR_PRESET, + g_param_spec_enum ("vbr-preset", "Variable Bitrate Preset", + "AAC Variable Bitrate configurations. Requires rate-control as vbr.", + GST_FDK_AAC_VBR_PRESET, DEFAULT_VBR_PRESET, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); @@ -585,4 +817,7 @@ GST_DEBUG_CATEGORY_INIT (gst_fdkaacenc_debug, "fdkaacenc", 0, "fdkaac encoder"); + + gst_type_mark_as_plugin_api (GST_FDK_AAC_VBR_PRESET, 0); + gst_type_mark_as_plugin_api (GST_FDK_AAC_RATE_CONTROL, 0); }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/fdkaac/gstfdkaacenc.h -> gst-plugins-bad-1.22.0.tar.xz/ext/fdkaac/gstfdkaacenc.h
Changed
@@ -41,6 +41,38 @@ typedef struct _GstFdkAacEnc GstFdkAacEnc; typedef struct _GstFdkAacEncClass GstFdkAacEncClass; +/** + * GstFdkAacVbrPreset: + * @GST_FDK_AAC_VBR_PRESET_VERY_LOW: Very Low Variable Bitrate. + * @GST_FDK_AAC_VBR_PRESET_LOW: Low Variable Bitrate. + * @GST_FDK_AAC_VBR_PRESET_MEDIUM: Medium Variable Bitrate. + * @GST_FDK_AAC_VBR_PRESET_HIGH: High Variable Bitrate. + * @GST_FDK_AAC_VBR_PRESET_VERY_HIGH: Very High Variable Bitrate. + * + * Since: 1.22 + */ +typedef enum +{ + GST_FDK_AAC_VBR_PRESET_VERY_LOW = 1, + GST_FDK_AAC_VBR_PRESET_LOW, + GST_FDK_AAC_VBR_PRESET_MEDIUM, + GST_FDK_AAC_VBR_PRESET_HIGH, + GST_FDK_AAC_VBR_PRESET_VERY_HIGH +} GstFdkAacVbrPreset; + +/** + * GstFdkAacRateControl: + * @GST_FDK_AAC_RATE_CONTROL_CONSTANT_BITRATE: Constant Bitrate. + * @GST_FDK_AAC_RATE_CONTROL_VARIABLE_BITRATE: Variable Bitrate. + * + * Since: 1.22 + */ +typedef enum +{ + GST_FDK_AAC_RATE_CONTROL_CONSTANT_BITRATE = 0, + GST_FDK_AAC_RATE_CONTROL_VARIABLE_BITRATE, +} GstFdkAacRateControl; + struct _GstFdkAacEnc { GstAudioEncoder element; @@ -51,6 +83,12 @@ gboolean need_reorder; const GstAudioChannelPosition *aac_positions; gboolean is_drained; + + guint peak_bitrate; + gboolean afterburner; + + GstFdkAacRateControl rate_control; + GstFdkAacVbrPreset vbr_preset; }; struct _GstFdkAacEncClass {
View file
gst-plugins-bad-1.20.5.tar.xz/ext/fdkaac/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/fdkaac/meson.build
Changed
@@ -21,6 +21,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstfdkaac, install_dir : plugins_pkgconfig_install_dir) plugins += gstfdkaac endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/flite/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/flite/meson.build
Changed
@@ -35,6 +35,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstflite, install_dir : plugins_pkgconfig_install_dir) plugins += gstflite endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/fluidsynth/gstfluiddec.c -> gst-plugins-bad-1.22.0.tar.xz/ext/fluidsynth/gstfluiddec.c
Changed
@@ -62,6 +62,11 @@ GST_DEBUG_CATEGORY_STATIC (gst_fluid_dec_debug); #define GST_CAT_DEFAULT gst_fluid_dec_debug +#if !GST_HAVE_FLUIDSYNTH_VERSION(2, 2, 0) +#define fluid_synth_chorus_on(synth,fx_group,on) fluid_synth_set_chorus_on(synth,on) +#define fluid_synth_reverb_on(synth,fx_group,on) fluid_synth_set_reverb_on(synth,on) +#endif + enum { /* FILL ME */ @@ -200,8 +205,8 @@ filter->synth = new_fluid_synth (filter->settings); filter->sf = -1; - fluid_synth_set_chorus_on (filter->synth, filter->synth_chorus); - fluid_synth_set_reverb_on (filter->synth, filter->synth_reverb); + fluid_synth_chorus_on (filter->synth, -1, filter->synth_chorus); + fluid_synth_reverb_on (filter->synth, -1, filter->synth_reverb); fluid_synth_set_gain (filter->synth, filter->synth_gain); fluid_synth_set_polyphony (filter->synth, filter->synth_polyphony); } @@ -634,11 +639,11 @@ break; case PROP_SYNTH_CHORUS: fluiddec->synth_chorus = g_value_get_boolean (value); - fluid_synth_set_chorus_on (fluiddec->synth, fluiddec->synth_chorus); + fluid_synth_chorus_on (fluiddec->synth, -1, fluiddec->synth_chorus); break; case PROP_SYNTH_REVERB: fluiddec->synth_reverb = g_value_get_boolean (value); - fluid_synth_set_reverb_on (fluiddec->synth, fluiddec->synth_reverb); + fluid_synth_reverb_on (fluiddec->synth, -1, fluiddec->synth_reverb); break; case PROP_SYNTH_GAIN: fluiddec->synth_gain = g_value_get_double (value); @@ -736,16 +741,6 @@ fluid_set_log_function (FLUID_DBG, NULL, NULL); #endif -#if GST_HAVE_FLUIDSYNTH_VERSION(1, 1, 9) - { - /* Disable all audio drivers so new_fluid_settings() does not probe them. - * This can crash if FluidSynth is already in use. */ - const char *empty = { NULL }; - if (fluid_audio_driver_register (empty) != FLUID_OK) { - GST_WARNING ("Failed to clear audio drivers"); - } - } -#endif return gst_element_register (plugin, "fluiddec", GST_RANK_SECONDARY, GST_TYPE_FLUID_DEC); }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/fluidsynth/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/fluidsynth/meson.build
Changed
@@ -1,4 +1,4 @@ -fluidsynth_dep = dependency('fluidsynth', version : '>= 1.0', required : get_option('fluidsynth')) +fluidsynth_dep = dependency('fluidsynth', version : '>= 2.1', required : get_option('fluidsynth')) if fluidsynth_dep.found() gstfluidsynth = library('gstfluidsynthmidi', @@ -9,6 +9,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstfluidsynth, install_dir : plugins_pkgconfig_install_dir) plugins += gstfluidsynth endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/gme/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/gme/meson.build
Changed
@@ -17,7 +17,6 @@ install: true, install_dir: plugins_install_dir, ) - pkgconfig.generate(gstgme, install_dir: plugins_pkgconfig_install_dir) plugins += gstgme elif get_option('gme').enabled() error('libgme plugin was enabled but required dependencies not found.')
View file
gst-plugins-bad-1.20.5.tar.xz/ext/gs/gstgscommon.cpp -> gst-plugins-bad-1.22.0.tar.xz/ext/gs/gstgscommon.cpp
Changed
@@ -25,37 +25,6 @@ namespace gcs = google::cloud::storage; -namespace { - -#if !GLIB_CHECK_VERSION(2, 62, 0) -static inline gchar* g_date_time_format_iso8601(GDateTime* datetime) { - GString* outstr = NULL; - gchar* main_date = NULL; - gint64 offset; - - // Main date and time. - main_date = g_date_time_format(datetime, "%Y-%m-%dT%H:%M:%S"); - outstr = g_string_new(main_date); - g_free(main_date); - - // Timezone. Format it as `%:::z` unless the offset is zero, in which case - // we can simply use `Z`. - offset = g_date_time_get_utc_offset(datetime); - - if (offset == 0) { - g_string_append_c(outstr, 'Z'); - } else { - gchar* time_zone = g_date_time_format(datetime, "%:::z"); - g_string_append(outstr, time_zone); - g_free(time_zone); - } - - return g_string_free(outstr, FALSE); -} -#endif - -} // namespace - std::unique_ptr<google::cloud::storage::Client> gst_gs_create_client( const gchar* service_account_email, const gchar* service_account_credentials,
View file
gst-plugins-bad-1.20.5.tar.xz/ext/gs/gstgssink.cpp -> gst-plugins-bad-1.22.0.tar.xz/ext/gs/gstgssink.cpp
Changed
@@ -112,6 +112,7 @@ PROP_START_DATE, PROP_SERVICE_ACCOUNT_CREDENTIALS, PROP_METADATA, + PROP_CONTENT_TYPE, }; class GSWriteStream; @@ -131,6 +132,7 @@ gboolean post_messages; GstGsSinkNext next_file; const gchar* content_type; + gchar* content_type_prop; size_t nb_percent_format; gboolean percent_s_is_first; GstStructure* metadata; @@ -333,6 +335,23 @@ (GParamFlags)(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY))); + /** + * GstGsSink:content-type: + * + * The Content-Type of the object. + * If not set we use the name of the input caps. + * + * Since: 1.22 + */ + g_object_class_install_property( + gobject_class, PROP_CONTENT_TYPE, + g_param_spec_string( + "content-type", "Content-Type", + "The Content-Type of the object", + NULL, + (GParamFlags)(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_PARAM_MUTABLE_READY))); + gobject_class->finalize = gst_gs_sink_finalize; gstbasesink_class->start = GST_DEBUG_FUNCPTR(gst_gs_sink_start); @@ -365,6 +384,7 @@ sink->start_date = NULL; sink->next_file = DEFAULT_NEXT_FILE; sink->content_type = NULL; + sink->content_type_prop = NULL; sink->nb_percent_format = 0; sink->percent_s_is_first = FALSE; @@ -391,6 +411,7 @@ sink->start_date = NULL; } sink->content_type = NULL; + g_clear_pointer(&sink->content_type_prop, g_free); g_clear_pointer(&sink->metadata, gst_structure_free); G_OBJECT_CLASS(parent_class)->finalize(object); @@ -489,6 +510,10 @@ g_clear_pointer(&sink->metadata, gst_structure_free); sink->metadata = (GstStructure*)g_value_dup_boxed(value); break; + case PROP_CONTENT_TYPE: + g_clear_pointer(&sink->content_type_prop, g_free); + sink->content_type_prop = g_value_dup_string(value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -529,6 +554,9 @@ case PROP_METADATA: g_value_set_boxed(value, sink->metadata); break; + case PROP_CONTENT_TYPE: + g_value_set_string(value, sink->content_type_prop); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -691,12 +719,18 @@ GstMapInfo map = {0}; gchar* object_name = NULL; gchar* buffer_date = NULL; + const gchar* content_type; if (!gst_buffer_map(buffer, &map, GST_MAP_READ)) return GST_FLOW_ERROR; + if (sink->content_type_prop) + content_type = sink->content_type_prop; + else + content_type = sink->content_type; + gcs::ObjectMetadata metadata = - gcs::ObjectMetadata().set_content_type(sink->content_type); + gcs::ObjectMetadata().set_content_type(content_type); if (sink->metadata) { struct AddMetadataIter it = {sink, &metadata}; @@ -861,7 +895,9 @@ sink->content_type = gst_structure_get_name(s); - GST_INFO_OBJECT(sink, "Content type: %s", sink->content_type); + /* TODO: we could automatically convert some caps such as 'video/quicktime,variant=iso' to 'video/mp4' */ + + GST_INFO_OBJECT(sink, "Content-Type: caps: %s property: %s", sink->content_type, sink->content_type_prop); return TRUE; }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/gs/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/gs/meson.build
Changed
@@ -17,6 +17,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstgs, install_dir : plugins_pkgconfig_install_dir) plugins += gstgs endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/gsm/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/gsm/meson.build
Changed
@@ -24,6 +24,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstgsm, install_dir : plugins_pkgconfig_install_dir) plugins += gstgsm endif
View file
gst-plugins-bad-1.22.0.tar.xz/ext/gtk
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/ext/gtk/gstgtkutils.c
Added
@@ -0,0 +1,71 @@ +/* + * GStreamer + * Copyright (C) 2015 Matthew Waters <matthew@centricular.com> + * Copyright (C) 2015 Thibault Saunier <tsaunier@gnome.org> + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "gstgtkutils.h" + +struct invoke_context +{ + GThreadFunc func; + gpointer data; + GMutex lock; + GCond cond; + gboolean fired; + + gpointer res; +}; + +static gboolean +gst_gtk_invoke_func (struct invoke_context *info) +{ + g_mutex_lock (&info->lock); + info->res = info->func (info->data); + info->fired = TRUE; + g_cond_signal (&info->cond); + g_mutex_unlock (&info->lock); + + return G_SOURCE_REMOVE; +} + +gpointer +gst_gtk_invoke_on_main (GThreadFunc func, gpointer data) +{ + GMainContext *main_context = g_main_context_default (); + struct invoke_context info; + + g_mutex_init (&info.lock); + g_cond_init (&info.cond); + info.fired = FALSE; + info.func = func; + info.data = data; + + g_main_context_invoke (main_context, (GSourceFunc) gst_gtk_invoke_func, + &info); + + g_mutex_lock (&info.lock); + while (!info.fired) + g_cond_wait (&info.cond, &info.lock); + g_mutex_unlock (&info.lock); + + g_mutex_clear (&info.lock); + g_cond_clear (&info.cond); + + return info.res; +}
View file
gst-plugins-bad-1.22.0.tar.xz/ext/gtk/gstgtkutils.h
Added
@@ -0,0 +1,29 @@ +/* + * GStreamer + * Copyright (C) 2015 Matthew Waters <matthew@centricular.com> + * Copyright (C) 2015 Thibault Saunier <tsaunier@gnome.org> + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_GTK_UTILS_H__ +#define __GST_GTK_UTILS_H__ + +#include <glib.h> + +gpointer gst_gtk_invoke_on_main (GThreadFunc func, gpointer data); + +#endif /* __GST_GTK_UTILS_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/ext/gtk/gstgtkwaylandsink.c
Added
@@ -0,0 +1,1247 @@ +/* + * GStreamer + * Copyright (C) 2015 Matthew Waters <matthew@centricular.com> + * Copyright (C) 2021 Collabora Ltd. + * @author George Kiagiadakis <george.kiagiadakis@collabora.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstgtkwaylandsink.h" + +#include <gdk/gdk.h> +#include <gst/wayland/wayland.h> + +#include "gstgtkutils.h" +#include "gtkgstwaylandwidget.h" + +#ifdef GDK_WINDOWING_WAYLAND +#include <gdk/gdkwayland.h> +#else +#error "Wayland is not supported in GTK+" +#endif + +#define GST_CAT_DEFAULT gst_debug_gtk_wayland_sink +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +#ifndef GST_CAPS_FEATURE_MEMORY_DMABUF +#define GST_CAPS_FEATURE_MEMORY_DMABUF "memory:DMABuf" +#endif + +#define WL_VIDEO_FORMATS \ + "{ BGRx, BGRA, RGBx, xBGR, xRGB, RGBA, ABGR, ARGB, RGB, BGR, " \ + "RGB16, BGR16, YUY2, YVYU, UYVY, AYUV, NV12, NV21, NV16, NV61, " \ + "YUV9, YVU9, Y41B, I420, YV12, Y42B, v308 }" + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (WL_VIDEO_FORMATS) ";" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_DMABUF, + WL_VIDEO_FORMATS)) + ); + +static void gst_gtk_wayland_sink_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static void gst_gtk_wayland_sink_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_gtk_wayland_sink_finalize (GObject * object); + +static GstStateChangeReturn gst_gtk_wayland_sink_change_state (GstElement * + element, GstStateChange transition); + +static gboolean gst_gtk_wayland_sink_event (GstBaseSink * sink, + GstEvent * event); +static GstCaps *gst_gtk_wayland_sink_get_caps (GstBaseSink * bsink, + GstCaps * filter); +static gboolean gst_gtk_wayland_sink_set_caps (GstBaseSink * bsink, + GstCaps * caps); +static gboolean gst_gtk_wayland_sink_propose_allocation (GstBaseSink * bsink, + GstQuery * query); +static GstFlowReturn gst_gtk_wayland_sink_show_frame (GstVideoSink * bsink, + GstBuffer * buffer); +static void gst_gtk_wayland_sink_set_rotate_method (GstGtkWaylandSink * self, + GstVideoOrientationMethod method, gboolean from_tag); + +static void +gst_gtk_wayland_sink_navigation_interface_init (GstNavigationInterface * iface); + +static void +calculate_adjustment (GtkWidget * start_widget, GtkAllocation * allocation); + +enum +{ + PROP_0, + PROP_WIDGET, + PROP_DISPLAY, + PROP_ROTATE_METHOD +}; + +typedef struct _GstGtkWaylandSinkPrivate +{ + GtkWidget *gtk_widget; + GtkWidget *gtk_window; + gulong gtk_window_destroy_id; + + /* from GstWaylandSink */ + GMutex display_lock; + GstWlDisplay *display; + + GstWlWindow *wl_window; + gboolean is_wl_window_sync; + + GstBufferPool *pool; + GstBuffer *last_buffer; + gboolean use_dmabuf; + + gboolean video_info_changed; + GstVideoInfo video_info; + + gboolean redraw_pending; + GMutex render_lock; + + GstVideoOrientationMethod sink_rotate_method; + GstVideoOrientationMethod tag_rotate_method; + GstVideoOrientationMethod current_rotate_method; + + struct wl_callback *callback; +} GstGtkWaylandSinkPrivate; + +#define gst_gtk_wayland_sink_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstGtkWaylandSink, gst_gtk_wayland_sink, + GST_TYPE_VIDEO_SINK, G_ADD_PRIVATE (GstGtkWaylandSink) + G_IMPLEMENT_INTERFACE (GST_TYPE_NAVIGATION, + gst_gtk_wayland_sink_navigation_interface_init) + GST_DEBUG_CATEGORY_INIT (gst_debug_gtk_wayland_sink, + "gtkwaylandsink", 0, "Gtk Wayland Video sink"); + ); +GST_ELEMENT_REGISTER_DEFINE (gtkwaylandsink, "gtkwaylandsink", + GST_RANK_MARGINAL, GST_TYPE_GTK_WAYLAND_SINK); + +static void +gst_gtk_wayland_sink_class_init (GstGtkWaylandSinkClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstElementClass *gstelement_class = (GstElementClass *) klass; + GstBaseSinkClass *gstbasesink_class = (GstBaseSinkClass *) klass; + GstVideoSinkClass *gstvideosink_class = (GstVideoSinkClass *) klass; + + gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_gtk_wayland_sink_finalize); + gobject_class->get_property = + GST_DEBUG_FUNCPTR (gst_gtk_wayland_sink_get_property); + gobject_class->set_property = + GST_DEBUG_FUNCPTR (gst_gtk_wayland_sink_set_property); + + g_object_class_install_property (gobject_class, PROP_WIDGET, + g_param_spec_object ("widget", "Gtk Widget", + "The GtkWidget to place in the widget hierarchy " + "(must only be get from the GTK main thread)", + GTK_TYPE_WIDGET, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | + GST_PARAM_DOC_SHOW_DEFAULT)); + + g_object_class_install_property (gobject_class, PROP_ROTATE_METHOD, + g_param_spec_enum ("rotate-method", + "rotate method", + "rotate method", + GST_TYPE_VIDEO_ORIENTATION_METHOD, GST_VIDEO_ORIENTATION_IDENTITY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_gtk_wayland_sink_change_state); + + gst_element_class_set_metadata (gstelement_class, "Gtk Wayland Video Sink", + "Sink/Video", + "A video sink that renders to a GtkWidget using Wayland API", + "George Kiagiadakis <george.kiagiadakis@collabora.com>"); + + gst_element_class_add_static_pad_template (gstelement_class, &sink_template); + + gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_gtk_wayland_sink_event); + gstbasesink_class->get_caps = + GST_DEBUG_FUNCPTR (gst_gtk_wayland_sink_get_caps); + gstbasesink_class->set_caps = + GST_DEBUG_FUNCPTR (gst_gtk_wayland_sink_set_caps); + gstbasesink_class->propose_allocation = + GST_DEBUG_FUNCPTR (gst_gtk_wayland_sink_propose_allocation); + + gstvideosink_class->show_frame = + GST_DEBUG_FUNCPTR (gst_gtk_wayland_sink_show_frame); +} + +static void +gst_gtk_wayland_sink_init (GstGtkWaylandSink * self) +{ + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + + g_mutex_init (&priv->display_lock); + g_mutex_init (&priv->render_lock); +} + +static void +gst_gtk_wayland_sink_finalize (GObject * object) +{ + GstGtkWaylandSink *self = GST_GTK_WAYLAND_SINK (object); + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + + g_clear_object (&priv->gtk_widget); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +widget_destroy_cb (GtkWidget * widget, GstGtkWaylandSink * self) +{ + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + + GST_OBJECT_LOCK (self); + g_clear_object (&priv->gtk_widget); + GST_OBJECT_UNLOCK (self); +} + +static void +window_destroy_cb (GtkWidget * widget, GstGtkWaylandSink * self) +{ + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + + GST_OBJECT_LOCK (self); + priv->gtk_window = NULL; + GST_OBJECT_UNLOCK (self); + + GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, ("Window was closed"), (NULL)); +} + +static gboolean +widget_size_allocate_cb (GtkWidget * widget, GtkAllocation * allocation, + gpointer user_data) +{ + GstGtkWaylandSink *self = user_data; + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + struct wl_subsurface *window_subsurface; + + g_mutex_lock (&priv->render_lock); + + priv->is_wl_window_sync = TRUE; + + window_subsurface = gst_wl_window_get_subsurface (priv->wl_window); + if (window_subsurface) + wl_subsurface_set_sync (window_subsurface); + + calculate_adjustment (priv->gtk_widget, allocation); + + GST_DEBUG_OBJECT (self, "window geometry changed to (%d, %d) %d x %d", + allocation->x, allocation->y, allocation->width, allocation->height); + gst_wl_window_set_render_rectangle (priv->wl_window, allocation->x, + allocation->y, allocation->width, allocation->height); + + g_mutex_unlock (&priv->render_lock); + + return FALSE; +} + +static gboolean +window_after_after_paint_cb (GtkWidget * widget, gpointer user_data) +{ + GstGtkWaylandSink *self = user_data; + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + + g_mutex_lock (&priv->render_lock); + + if (priv->is_wl_window_sync) { + struct wl_subsurface *window_subsurface; + + priv->is_wl_window_sync = FALSE; + + window_subsurface = gst_wl_window_get_subsurface (priv->wl_window); + if (window_subsurface) + wl_subsurface_set_desync (window_subsurface); + } + + g_mutex_unlock (&priv->render_lock); + + return FALSE; +} + +static GtkWidget * +gst_gtk_wayland_sink_get_widget (GstGtkWaylandSink * self) +{ + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + + if (priv->gtk_widget != NULL) + return g_object_ref (priv->gtk_widget); + + /* Ensure GTK is initialized, this has no side effect if it was already + * initialized. Also, we do that lazily, so the application can be first */ + if (!gtk_init_check (NULL, NULL)) { + GST_INFO_OBJECT (self, "Could not ensure GTK initialization."); + return NULL; + } + + priv->gtk_widget = gtk_gst_wayland_widget_new (); + gtk_gst_base_widget_set_element (GTK_GST_BASE_WIDGET (priv->gtk_widget), + GST_ELEMENT (self)); + + /* Take the floating ref, other wise the destruction of the container will + * make this widget disappear possibly before we are done. */ + g_object_ref_sink (priv->gtk_widget); + g_signal_connect_object (priv->gtk_widget, "destroy", + G_CALLBACK (widget_destroy_cb), self, 0); + + return g_object_ref (priv->gtk_widget); +} + +static GtkWidget * +gst_gtk_wayland_sink_acquire_widget (GstGtkWaylandSink * self) +{ + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + gpointer widget = NULL; + + GST_OBJECT_LOCK (self); + if (priv->gtk_widget != NULL) + widget = g_object_ref (priv->gtk_widget); + GST_OBJECT_UNLOCK (self); + + if (!widget) + widget = + gst_gtk_invoke_on_main ((GThreadFunc) gst_gtk_wayland_sink_get_widget, + self); + + return widget; +} + +static gboolean +gst_gtk_wayland_sink_event (GstBaseSink * sink, GstEvent * event) +{ + GstGtkWaylandSink *self = GST_GTK_WAYLAND_SINK (sink); + GstTagList *taglist; + GstVideoOrientationMethod method; + gboolean ret; + + GST_DEBUG_OBJECT (self, "handling %s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_TAG: + gst_event_parse_tag (event, &taglist); + + if (gst_video_orientation_from_tag (taglist, &method)) { + gst_gtk_wayland_sink_set_rotate_method (self, method, TRUE); + } + + break; + default: + break; + } + + ret = GST_BASE_SINK_CLASS (parent_class)->event (sink, event); + + return ret; +} + +static void +gst_gtk_wayland_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstGtkWaylandSink *self = GST_GTK_WAYLAND_SINK (object); + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + + switch (prop_id) { + case PROP_WIDGET: + g_value_take_object (value, gst_gtk_wayland_sink_acquire_widget (self)); + break; + case PROP_ROTATE_METHOD: + g_value_set_enum (value, priv->current_rotate_method); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_gtk_wayland_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstGtkWaylandSink *self = GST_GTK_WAYLAND_SINK (object); + + switch (prop_id) { + case PROP_ROTATE_METHOD: + gst_gtk_wayland_sink_set_rotate_method (self, g_value_get_enum (value), + FALSE); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +calculate_adjustment (GtkWidget * widget, GtkAllocation * allocation) +{ + GdkWindow *window; + gint wx, wy; + + window = gtk_widget_get_window (widget); + gdk_window_get_origin (window, &wx, &wy); + + allocation->x = wx; + allocation->y = wy; +} + +static gboolean +scrollable_window_adjustment_changed_cb (GtkAdjustment * adjustment, + gpointer user_data) +{ + GstGtkWaylandSink *self = user_data; + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + GtkAllocation allocation; + + gtk_widget_get_allocation (priv->gtk_widget, &allocation); + calculate_adjustment (priv->gtk_widget, &allocation); + gst_wl_window_set_render_rectangle (priv->wl_window, allocation.x, + allocation.y, allocation.width, allocation.height); + + return FALSE; +} + +static void +setup_wl_window (GstGtkWaylandSink * self) +{ + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + GdkWindow *gdk_window; + GdkFrameClock *gdk_frame_clock; + GtkAllocation allocation; + GtkWidget *widget; + + g_mutex_lock (&priv->render_lock); + + gdk_window = gtk_widget_get_window (priv->gtk_widget); + g_assert (gdk_window); + + if (!priv->wl_window) { + struct wl_surface *wl_surface; + + wl_surface = gdk_wayland_window_get_wl_surface (gdk_window); + + GST_INFO_OBJECT (self, "setting window handle"); + + priv->wl_window = gst_wl_window_new_in_surface (priv->display, + wl_surface, &priv->render_lock); + gst_wl_window_set_rotate_method (priv->wl_window, + priv->current_rotate_method); + } + + /* In order to position the subsurface correctly within a scrollable widget, + * we can not rely on the allocation alone but need to take the window + * origin into account + */ + widget = priv->gtk_widget; + do { + if (GTK_IS_SCROLLABLE (widget)) { + GtkAdjustment *hadjustment; + GtkAdjustment *vadjustment; + + hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (widget)); + vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (widget)); + + g_signal_connect (hadjustment, "value-changed", + G_CALLBACK (scrollable_window_adjustment_changed_cb), self); + g_signal_connect (vadjustment, "value-changed", + G_CALLBACK (scrollable_window_adjustment_changed_cb), self); + } + } while ((widget = gtk_widget_get_parent (widget))); + + gtk_widget_get_allocation (priv->gtk_widget, &allocation); + calculate_adjustment (priv->gtk_widget, &allocation); + gst_wl_window_set_render_rectangle (priv->wl_window, allocation.x, + allocation.y, allocation.width, allocation.height); + + /* Make subsurfaces syncronous during resizes. + * Unfortunately GTK/GDK does not provide easier to use signals. + */ + g_signal_connect (priv->gtk_widget, "size-allocate", + G_CALLBACK (widget_size_allocate_cb), self); + gdk_frame_clock = gdk_window_get_frame_clock (gdk_window); + g_signal_connect_after (gdk_frame_clock, "after-paint", + G_CALLBACK (window_after_after_paint_cb), self); + + /* Ensure the base widget is initialized */ + gtk_gst_base_widget_set_buffer (GTK_GST_BASE_WIDGET (priv->gtk_widget), NULL); + + g_mutex_unlock (&priv->render_lock); +} + +static void +window_initial_map_cb (GtkWidget * widget, gpointer user_data) +{ + GstGtkWaylandSink *self = user_data; + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + + setup_wl_window (self); + g_signal_handlers_disconnect_by_func (priv->gtk_widget, + window_initial_map_cb, self); +} + +static void +gst_gtk_wayland_sink_navigation_send_event (GstNavigation * navigation, + GstEvent * event) +{ + GstGtkWaylandSink *self = GST_GTK_WAYLAND_SINK (navigation); + GstPad *pad; + gdouble x, y; + + event = gst_event_make_writable (event); + + if (gst_navigation_event_get_coordinates (event, &x, &y)) { + GtkGstBaseWidget *widget = + GTK_GST_BASE_WIDGET (gst_gtk_wayland_sink_get_widget (self)); + gdouble stream_x, stream_y; + + if (widget == NULL) { + GST_ERROR_OBJECT (self, "Could not ensure GTK initialization."); + return; + } + + gtk_gst_base_widget_display_size_to_stream_size (widget, + x, y, &stream_x, &stream_y); + gst_navigation_event_set_coordinates (event, stream_x, stream_y); + } + + pad = gst_pad_get_peer (GST_VIDEO_SINK_PAD (self)); + + GST_TRACE_OBJECT (self, "navigation event %" GST_PTR_FORMAT, + gst_event_get_structure (event)); + + if (GST_IS_PAD (pad) && GST_IS_EVENT (event)) { + if (!gst_pad_send_event (pad, gst_event_ref (event))) { + /* If upstream didn't handle the event we'll post a message with it + * for the application in case it wants to do something with it */ + gst_element_post_message (GST_ELEMENT_CAST (self), + gst_navigation_message_new_event (GST_OBJECT_CAST (self), event)); + } + gst_event_unref (event); + gst_object_unref (pad); + } +} + +static void +gst_gtk_wayland_sink_navigation_interface_init (GstNavigationInterface * iface) +{ + iface->send_event_simple = gst_gtk_wayland_sink_navigation_send_event; +} + + +static gboolean +gst_gtk_wayland_sink_start_on_main (GstGtkWaylandSink * self) +{ + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + GtkWidget *toplevel; + GdkDisplay *gdk_display; + struct wl_display *wl_display; + + if ((toplevel = gst_gtk_wayland_sink_get_widget (self)) == NULL) { + GST_ERROR_OBJECT (self, "Could not ensure GTK initialization."); + return FALSE; + } + g_object_unref (toplevel); + + /* After this point, priv->gtk_widget will always be set */ + + gdk_display = gtk_widget_get_display (priv->gtk_widget); + if (!GDK_IS_WAYLAND_DISPLAY (gdk_display)) { + GST_ERROR_OBJECT (self, "GDK is not using its wayland backend."); + return FALSE; + } + wl_display = gdk_wayland_display_get_wl_display (gdk_display); + priv->display = gst_wl_display_new_existing (wl_display, FALSE, NULL); + + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (priv->gtk_widget)); + if (!gtk_widget_is_toplevel (toplevel)) { + /* User did not add widget its own UI, let's popup a new GtkWindow to + * make gst-launch-1.0 work. */ + priv->gtk_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size (GTK_WINDOW (priv->gtk_window), 640, 480); + gtk_window_set_title (GTK_WINDOW (priv->gtk_window), + "Gst GTK Wayland Sink"); + gtk_container_add (GTK_CONTAINER (priv->gtk_window), toplevel); + priv->gtk_window_destroy_id = g_signal_connect (priv->gtk_window, "destroy", + G_CALLBACK (window_destroy_cb), self); + + g_signal_connect (priv->gtk_widget, "map", + G_CALLBACK (window_initial_map_cb), self); + } else { + if (gtk_widget_get_mapped (priv->gtk_widget)) { + setup_wl_window (self); + } else { + g_signal_connect (priv->gtk_widget, "map", + G_CALLBACK (window_initial_map_cb), self); + } + } + + return TRUE; +} + +static gboolean +gst_gtk_wayland_sink_stop_on_main (GstGtkWaylandSink * self) +{ + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + + if (priv->gtk_window) { + if (priv->gtk_window_destroy_id) + g_signal_handler_disconnect (priv->gtk_window, + priv->gtk_window_destroy_id); + priv->gtk_window_destroy_id = 0; + gtk_widget_destroy (priv->gtk_window); + priv->gtk_window = NULL; + } + + if (priv->gtk_widget) { + GtkWidget *widget; + GdkWindow *gdk_window; + + g_signal_handlers_disconnect_by_func (priv->gtk_widget, + widget_size_allocate_cb, self); + + widget = priv->gtk_widget; + do { + if (GTK_IS_SCROLLABLE (widget)) { + GtkAdjustment *hadjustment; + GtkAdjustment *vadjustment; + + hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (widget)); + vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (widget)); + + g_signal_handlers_disconnect_by_func (hadjustment, + scrollable_window_adjustment_changed_cb, self); + g_signal_handlers_disconnect_by_func (vadjustment, + scrollable_window_adjustment_changed_cb, self); + } + } while ((widget = gtk_widget_get_parent (widget))); + + gdk_window = gtk_widget_get_window (priv->gtk_widget); + if (gdk_window) { + GdkFrameClock *gdk_frame_clock; + + gdk_frame_clock = gdk_window_get_frame_clock (gdk_window); + g_signal_handlers_disconnect_by_func (gdk_frame_clock, + window_after_after_paint_cb, self); + } + } + + return TRUE; +} + +static void +gst_gtk_widget_show_all_and_unref (GtkWidget * widget) +{ + gtk_widget_show_all (widget); + g_object_unref (widget); +} + +static GstStateChangeReturn +gst_gtk_wayland_sink_change_state (GstElement * element, + GstStateChange transition) +{ + GstGtkWaylandSink *self = GST_GTK_WAYLAND_SINK (element); + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!gst_gtk_invoke_on_main ((GThreadFunc) + gst_gtk_wayland_sink_start_on_main, element)) + return GST_STATE_CHANGE_FAILURE; + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + { + GtkWindow *window = NULL; + + GST_OBJECT_LOCK (self); + if (priv->gtk_window) + window = g_object_ref (GTK_WINDOW (priv->gtk_window)); + GST_OBJECT_UNLOCK (self); + + if (window) + gst_gtk_invoke_on_main ((GThreadFunc) gst_gtk_widget_show_all_and_unref, + window); + + break; + } + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + if (ret != GST_STATE_CHANGE_SUCCESS) + return ret; + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + case GST_STATE_CHANGE_NULL_TO_NULL: + gst_gtk_invoke_on_main ((GThreadFunc) + gst_gtk_wayland_sink_stop_on_main, element); + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_buffer_replace (&priv->last_buffer, NULL); + if (priv->wl_window) { + /* remove buffer from surface, show nothing */ + gst_wl_window_render (priv->wl_window, NULL, NULL); + } + + g_mutex_lock (&priv->render_lock); + if (priv->callback) { + wl_callback_destroy (priv->callback); + priv->callback = NULL; + } + priv->redraw_pending = FALSE; + g_mutex_unlock (&priv->render_lock); + break; + default: + break; + } + + return ret; +} + +static GstCaps * +gst_gtk_wayland_sink_get_caps (GstBaseSink * bsink, GstCaps * filter) +{ + GstGtkWaylandSink *self = GST_GTK_WAYLAND_SINK (bsink); + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + GstCaps *caps; + + caps = gst_pad_get_pad_template_caps (GST_VIDEO_SINK_PAD (self)); + caps = gst_caps_make_writable (caps); + + g_mutex_lock (&priv->display_lock); + + if (priv->display) { + GValue shm_list = G_VALUE_INIT, dmabuf_list = G_VALUE_INIT; + GValue value = G_VALUE_INIT; + GArray *formats; + gint i; + guint fmt; + GstVideoFormat gfmt; + + g_value_init (&shm_list, GST_TYPE_LIST); + g_value_init (&dmabuf_list, GST_TYPE_LIST); + + /* Add corresponding shm formats */ + formats = gst_wl_display_get_shm_formats (priv->display); + for (i = 0; i < formats->len; i++) { + fmt = g_array_index (formats, uint32_t, i); + gfmt = gst_wl_shm_format_to_video_format (fmt); + if (gfmt != GST_VIDEO_FORMAT_UNKNOWN) { + g_value_init (&value, G_TYPE_STRING); + g_value_set_static_string (&value, gst_video_format_to_string (gfmt)); + gst_value_list_append_and_take_value (&shm_list, &value); + } + } + + gst_structure_take_value (gst_caps_get_structure (caps, 0), "format", + &shm_list); + + /* Add corresponding dmabuf formats */ + formats = gst_wl_display_get_dmabuf_formats (priv->display); + for (i = 0; i < formats->len; i++) { + fmt = g_array_index (formats, uint32_t, i); + gfmt = gst_wl_dmabuf_format_to_video_format (fmt); + if (gfmt != GST_VIDEO_FORMAT_UNKNOWN) { + g_value_init (&value, G_TYPE_STRING); + g_value_set_static_string (&value, gst_video_format_to_string (gfmt)); + gst_value_list_append_and_take_value (&dmabuf_list, &value); + } + } + + gst_structure_take_value (gst_caps_get_structure (caps, 1), "format", + &dmabuf_list); + + GST_DEBUG_OBJECT (self, "display caps: %" GST_PTR_FORMAT, caps); + } + + g_mutex_unlock (&priv->display_lock); + + if (filter) { + GstCaps *intersection; + + intersection = + gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (caps); + caps = intersection; + } + + return caps; +} + +static GstBufferPool * +gst_gtk_wayland_create_pool (GstGtkWaylandSink * self, GstCaps * caps) +{ + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + GstBufferPool *pool = NULL; + GstStructure *structure; + gsize size = priv->video_info.size; + GstAllocator *alloc; + + pool = gst_wl_video_buffer_pool_new (); + + structure = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_params (structure, caps, size, 2, 0); + + alloc = gst_wl_shm_allocator_get (); + gst_buffer_pool_config_set_allocator (structure, alloc, NULL); + if (!gst_buffer_pool_set_config (pool, structure)) { + g_object_unref (pool); + pool = NULL; + } + g_object_unref (alloc); + + return pool; +} + +static gboolean +gst_gtk_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps) +{ + GstGtkWaylandSink *self = GST_GTK_WAYLAND_SINK (bsink); + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + gboolean use_dmabuf; + GstVideoFormat format; + + GST_DEBUG_OBJECT (self, "set caps %" GST_PTR_FORMAT, caps); + + /* extract info from caps */ + if (!gst_video_info_from_caps (&priv->video_info, caps)) + goto invalid_format; + + format = GST_VIDEO_INFO_FORMAT (&priv->video_info); + priv->video_info_changed = TRUE; + + /* create a new pool for the new caps */ + if (priv->pool) + gst_object_unref (priv->pool); + priv->pool = gst_gtk_wayland_create_pool (self, caps); + + use_dmabuf = gst_caps_features_contains (gst_caps_get_features (caps, 0), + GST_CAPS_FEATURE_MEMORY_DMABUF); + + /* validate the format base on the memory type. */ + if (use_dmabuf) { + if (!gst_wl_display_check_format_for_dmabuf (priv->display, format)) + goto unsupported_format; + } else if (!gst_wl_display_check_format_for_shm (priv->display, format)) { + goto unsupported_format; + } + + GST_OBJECT_LOCK (self); + + if (priv->gtk_widget == NULL) { + GST_OBJECT_UNLOCK (self); + GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, + ("Output widget was destroyed"), (NULL)); + return FALSE; + } + + if (!gtk_gst_base_widget_set_format (GTK_GST_BASE_WIDGET (priv->gtk_widget), + &priv->video_info)) { + GST_OBJECT_UNLOCK (self); + return FALSE; + } + GST_OBJECT_UNLOCK (self); + + priv->use_dmabuf = use_dmabuf; + + return TRUE; + +invalid_format: + { + GST_ERROR_OBJECT (self, + "Could not locate image format from caps %" GST_PTR_FORMAT, caps); + return FALSE; + } +unsupported_format: + { + GST_ERROR_OBJECT (self, "Format %s is not available on the display", + gst_video_format_to_string (format)); + return FALSE; + } +} + +static gboolean +gst_gtk_wayland_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query) +{ + GstGtkWaylandSink *self = GST_GTK_WAYLAND_SINK (bsink); + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + GstCaps *caps; + GstBufferPool *pool = NULL; + gboolean need_pool; + GstAllocator *alloc; + + gst_query_parse_allocation (query, &caps, &need_pool); + + if (need_pool) + pool = gst_gtk_wayland_create_pool (self, caps); + + gst_query_add_allocation_pool (query, pool, priv->video_info.size, 2, 0); + if (pool) + g_object_unref (pool); + + alloc = gst_wl_shm_allocator_get (); + gst_query_add_allocation_param (query, alloc, NULL); + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + g_object_unref (alloc); + + return TRUE; +} + +static void +frame_redraw_callback (void *data, struct wl_callback *callback, uint32_t time) +{ + GstGtkWaylandSink *self = data; + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + + GST_LOG_OBJECT (self, "frame_redraw_cb"); + + g_mutex_lock (&priv->render_lock); + priv->redraw_pending = FALSE; + + if (priv->callback) { + wl_callback_destroy (callback); + priv->callback = NULL; + } + g_mutex_unlock (&priv->render_lock); +} + +static const struct wl_callback_listener frame_callback_listener = { + frame_redraw_callback +}; + +/* must be called with the render lock */ +static void +render_last_buffer (GstGtkWaylandSink * self, gboolean redraw) +{ + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + GstWlBuffer *wlbuffer; + const GstVideoInfo *info = NULL; + struct wl_surface *surface; + struct wl_callback *callback; + + wlbuffer = gst_buffer_get_wl_buffer (priv->display, priv->last_buffer); + surface = gst_wl_window_get_wl_surface (priv->wl_window); + + priv->redraw_pending = TRUE; + callback = wl_surface_frame (surface); + priv->callback = callback; + wl_callback_add_listener (callback, &frame_callback_listener, self); + + if (G_UNLIKELY (priv->video_info_changed && !redraw)) { + info = &priv->video_info; + priv->video_info_changed = FALSE; + } + gst_wl_window_render (priv->wl_window, wlbuffer, info); +} + +static GstFlowReturn +gst_gtk_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer) +{ + GstGtkWaylandSink *self = GST_GTK_WAYLAND_SINK (vsink); + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + GstBuffer *to_render; + GstWlBuffer *wlbuffer; + GstVideoMeta *vmeta; + GstVideoFormat format; + GstVideoInfo old_vinfo; + GstMemory *mem; + struct wl_buffer *wbuf = NULL; + + GstFlowReturn ret = GST_FLOW_OK; + + g_mutex_lock (&priv->render_lock); + + GST_LOG_OBJECT (self, "render buffer %" GST_PTR_FORMAT "", buffer); + + if (!priv->wl_window) { + GST_LOG_OBJECT (self, + "buffer %" GST_PTR_FORMAT " dropped (waiting for window)", buffer); + goto done; + } + + /* drop buffers until we get a frame callback */ + if (priv->redraw_pending) { + GST_LOG_OBJECT (self, "buffer %" GST_PTR_FORMAT " dropped (redraw pending)", + buffer); + goto done; + } + + /* make sure that the application has called set_render_rectangle() */ + if (G_UNLIKELY (gst_wl_window_get_render_rectangle (priv->wl_window)->w == 0)) + goto no_window_size; + + wlbuffer = gst_buffer_get_wl_buffer (priv->display, buffer); + + if (G_LIKELY (wlbuffer && + gst_wl_buffer_get_display (wlbuffer) == priv->display)) { + GST_LOG_OBJECT (self, + "buffer %" GST_PTR_FORMAT " has a wl_buffer from our display, " + "writing directly", buffer); + to_render = buffer; + goto render; + } + + /* update video info from video meta */ + mem = gst_buffer_peek_memory (buffer, 0); + + old_vinfo = priv->video_info; + vmeta = gst_buffer_get_video_meta (buffer); + if (vmeta) { + gint i; + + for (i = 0; i < vmeta->n_planes; i++) { + priv->video_info.offseti = vmeta->offseti; + priv->video_info.stridei = vmeta->stridei; + } + priv->video_info.size = gst_buffer_get_size (buffer); + } + + GST_LOG_OBJECT (self, + "buffer %" GST_PTR_FORMAT " does not have a wl_buffer from our " + "display, creating it", buffer); + + format = GST_VIDEO_INFO_FORMAT (&priv->video_info); + if (gst_wl_display_check_format_for_dmabuf (priv->display, format)) { + guint i, nb_dmabuf = 0; + + for (i = 0; i < gst_buffer_n_memory (buffer); i++) + if (gst_is_dmabuf_memory (gst_buffer_peek_memory (buffer, i))) + nb_dmabuf++; + + if (nb_dmabuf && (nb_dmabuf == gst_buffer_n_memory (buffer))) + wbuf = gst_wl_linux_dmabuf_construct_wl_buffer (buffer, priv->display, + &priv->video_info); + } + + if (!wbuf && gst_wl_display_check_format_for_shm (priv->display, format)) { + if (gst_buffer_n_memory (buffer) == 1 && gst_is_fd_memory (mem)) + wbuf = gst_wl_shm_memory_construct_wl_buffer (mem, priv->display, + &priv->video_info); + + /* If nothing worked, copy into our internal pool */ + if (!wbuf) { + GstVideoFrame src, dst; + GstVideoInfo src_info = priv->video_info; + + /* rollback video info changes */ + priv->video_info = old_vinfo; + + /* we don't know how to create a wl_buffer directly from the provided + * memory, so we have to copy the data to shm memory that we know how + * to handle... */ + + GST_LOG_OBJECT (self, + "buffer %" GST_PTR_FORMAT " cannot have a wl_buffer, " + "copying to wl_shm memory", buffer); + + /* priv->pool always exists (created in set_caps), but it may not + * be active if upstream is not using it */ + if (!gst_buffer_pool_is_active (priv->pool)) { + GstStructure *config; + GstCaps *caps; + + config = gst_buffer_pool_get_config (priv->pool); + gst_buffer_pool_config_get_params (config, &caps, NULL, NULL, NULL); + + /* revert back to default strides and offsets */ + gst_video_info_from_caps (&priv->video_info, caps); + gst_buffer_pool_config_set_params (config, caps, priv->video_info.size, + 2, 0); + + /* This is a video pool, it should not fail with basic settings */ + if (!gst_buffer_pool_set_config (priv->pool, config) || + !gst_buffer_pool_set_active (priv->pool, TRUE)) + goto activate_failed; + } + + ret = gst_buffer_pool_acquire_buffer (priv->pool, &to_render, NULL); + if (ret != GST_FLOW_OK) + goto no_buffer; + + wlbuffer = gst_buffer_get_wl_buffer (priv->display, to_render); + + /* attach a wl_buffer if there isn't one yet */ + if (G_UNLIKELY (!wlbuffer)) { + mem = gst_buffer_peek_memory (to_render, 0); + wbuf = gst_wl_shm_memory_construct_wl_buffer (mem, priv->display, + &priv->video_info); + + if (G_UNLIKELY (!wbuf)) + goto no_wl_buffer_shm; + + wlbuffer = gst_buffer_add_wl_buffer (to_render, wbuf, priv->display); + } + + if (!gst_video_frame_map (&dst, &priv->video_info, to_render, + GST_MAP_WRITE)) + goto dst_map_failed; + + if (!gst_video_frame_map (&src, &src_info, buffer, GST_MAP_READ)) { + gst_video_frame_unmap (&dst); + goto src_map_failed; + } + + gst_video_frame_copy (&dst, &src); + + gst_video_frame_unmap (&src); + gst_video_frame_unmap (&dst); + + goto render; + } + } + + if (!wbuf) + goto no_wl_buffer; + + wlbuffer = gst_buffer_add_wl_buffer (buffer, wbuf, priv->display); + to_render = buffer; + +render: + /* drop double rendering */ + if (G_UNLIKELY (wlbuffer == + gst_buffer_get_wl_buffer (priv->display, priv->last_buffer))) { + GST_LOG_OBJECT (self, "Buffer already being rendered"); + goto done; + } + + gst_buffer_replace (&priv->last_buffer, to_render); + render_last_buffer (self, FALSE); + + if (buffer != to_render) + gst_buffer_unref (to_render); + goto done; + +no_window_size: + { + GST_ELEMENT_ERROR (self, RESOURCE, WRITE, + ("Window has no size set"), + ("Make sure you set the size after calling set_window_handle")); + ret = GST_FLOW_ERROR; + goto done; + } +no_buffer: + { + GST_WARNING_OBJECT (self, "could not create buffer"); + goto done; + } +no_wl_buffer_shm: + { + GST_ERROR_OBJECT (self, "could not create wl_buffer out of wl_shm memory"); + ret = GST_FLOW_ERROR; + goto done; + } +no_wl_buffer: + { + GST_ERROR_OBJECT (self, + "buffer %" GST_PTR_FORMAT " cannot have a wl_buffer", buffer); + ret = GST_FLOW_ERROR; + goto done; + } +activate_failed: + { + GST_ERROR_OBJECT (self, "failed to activate bufferpool."); + ret = GST_FLOW_ERROR; + goto done; + } +src_map_failed: + { + GST_ELEMENT_ERROR (self, RESOURCE, READ, + ("Video memory can not be read from userspace."), (NULL)); + ret = GST_FLOW_ERROR; + goto done; + } +dst_map_failed: + { + GST_ELEMENT_ERROR (self, RESOURCE, WRITE, + ("Video memory can not be written from userspace."), (NULL)); + ret = GST_FLOW_ERROR; + goto done; + } +done: + { + g_mutex_unlock (&priv->render_lock); + return ret; + } +} + +static void +gst_gtk_wayland_sink_set_rotate_method (GstGtkWaylandSink * self, + GstVideoOrientationMethod method, gboolean from_tag) +{ + GstGtkWaylandSinkPrivate *priv = + gst_gtk_wayland_sink_get_instance_private (self); + GstVideoOrientationMethod new_method; + + if (method == GST_VIDEO_ORIENTATION_CUSTOM) { + GST_WARNING_OBJECT (self, "unsupported custom orientation"); + return; + } + + GST_OBJECT_LOCK (self); + if (from_tag) + priv->tag_rotate_method = method; + else + priv->sink_rotate_method = method; + + if (priv->sink_rotate_method == GST_VIDEO_ORIENTATION_AUTO) + new_method = priv->tag_rotate_method; + else + new_method = priv->sink_rotate_method; + + if (new_method != priv->current_rotate_method) { + GST_DEBUG_OBJECT (priv, "Changing method from %d to %d", + priv->current_rotate_method, new_method); + + if (priv->wl_window) { + g_mutex_lock (&priv->render_lock); + gst_wl_window_set_rotate_method (priv->wl_window, new_method); + g_mutex_unlock (&priv->render_lock); + } + + priv->current_rotate_method = new_method; + } + GST_OBJECT_UNLOCK (self); +}
View file
gst-plugins-bad-1.22.0.tar.xz/ext/gtk/gstgtkwaylandsink.h
Added
@@ -0,0 +1,47 @@ +/* + * GStreamer + * Copyright (C) 2021 Collabora Ltd. + * @author George Kiagiadakis <george.kiagiadakis@collabora.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gtk/gtk.h> +#include <gst/gst.h> +#include <gst/video/video.h> + +G_BEGIN_DECLS + +#define GST_TYPE_GTK_WAYLAND_SINK gst_gtk_wayland_sink_get_type () +G_DECLARE_FINAL_TYPE (GstGtkWaylandSink, gst_gtk_wayland_sink, GST, GTK_WAYLAND_SINK, GstVideoSink); + +/** + * GstGtkWaylandSink: + * + * Opaque #GstGtkWaylandSink object + * + * Since: 1.22 + */ +struct _GstGtkWaylandSink +{ + GstVideoSink parent; +}; + +GST_ELEMENT_REGISTER_DECLARE (gtkwaylandsink); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/ext/gtk/gstplugin.c
Added
@@ -0,0 +1,48 @@ +/* + * GStreamer + * Copyright (C) 2015 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/** + * plugin-gtkwayland: + * + * Since: 1.22 + */ + +#include "gstgtkwaylandsink.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gboolean ret = FALSE; + + ret |= GST_ELEMENT_REGISTER (gtkwaylandsink, plugin); + + return ret; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + gtkwayland, + "Gtk+ wayland sink", + plugin_init, PACKAGE_VERSION, GST_LICENSE, GST_PACKAGE_NAME, + GST_PACKAGE_ORIGIN)
View file
gst-plugins-bad-1.22.0.tar.xz/ext/gtk/gtkgstbasewidget.c
Added
@@ -0,0 +1,670 @@ +/* + * GStreamer + * Copyright (C) 2015 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdio.h> +#include <math.h> + +#include "gtkgstbasewidget.h" + +GST_DEBUG_CATEGORY (gst_debug_gtk_base_widget); +#define GST_CAT_DEFAULT gst_debug_gtk_base_widget + +#define DEFAULT_FORCE_ASPECT_RATIO TRUE +#define DEFAULT_DISPLAY_PAR_N 0 +#define DEFAULT_DISPLAY_PAR_D 1 +#define DEFAULT_VIDEO_PAR_N 0 +#define DEFAULT_VIDEO_PAR_D 1 +#define DEFAULT_IGNORE_ALPHA TRUE + +enum +{ + PROP_0, + PROP_FORCE_ASPECT_RATIO, + PROP_PIXEL_ASPECT_RATIO, + PROP_IGNORE_ALPHA, + PROP_VIDEO_ASPECT_RATIO_OVERRIDE, +}; + +static gboolean +_calculate_par (GtkGstBaseWidget * widget, GstVideoInfo * info) +{ + gboolean ok; + gint width, height; + gint par_n, par_d; + gint display_par_n, display_par_d; + + width = GST_VIDEO_INFO_WIDTH (info); + height = GST_VIDEO_INFO_HEIGHT (info); + if (width == 0 || height == 0) + return FALSE; + + /* get video's PAR */ + if (widget->video_par_n != 0 && widget->video_par_d != 0) { + par_n = widget->video_par_n; + par_d = widget->video_par_d; + } else { + par_n = GST_VIDEO_INFO_PAR_N (info); + par_d = GST_VIDEO_INFO_PAR_D (info); + } + + if (!par_n) + par_n = 1; + + /* get display's PAR */ + if (widget->par_n != 0 && widget->par_d != 0) { + display_par_n = widget->par_n; + display_par_d = widget->par_d; + } else { + display_par_n = 1; + display_par_d = 1; + } + + + ok = gst_video_calculate_display_ratio (&widget->display_ratio_num, + &widget->display_ratio_den, width, height, par_n, par_d, display_par_n, + display_par_d); + + if (ok) { + GST_LOG ("PAR: %u/%u DAR:%u/%u", par_n, par_d, display_par_n, + display_par_d); + return TRUE; + } + + return FALSE; +} + +static void +_apply_par (GtkGstBaseWidget * widget) +{ + guint display_ratio_num, display_ratio_den; + gint width, height; + + width = GST_VIDEO_INFO_WIDTH (&widget->v_info); + height = GST_VIDEO_INFO_HEIGHT (&widget->v_info); + + if (!width || !height) + return; + + display_ratio_num = widget->display_ratio_num; + display_ratio_den = widget->display_ratio_den; + + if (height % display_ratio_den == 0) { + GST_DEBUG ("keeping video height"); + widget->display_width = (guint) + gst_util_uint64_scale_int (height, display_ratio_num, + display_ratio_den); + widget->display_height = height; + } else if (width % display_ratio_num == 0) { + GST_DEBUG ("keeping video width"); + widget->display_width = width; + widget->display_height = (guint) + gst_util_uint64_scale_int (width, display_ratio_den, display_ratio_num); + } else { + GST_DEBUG ("approximating while keeping video height"); + widget->display_width = (guint) + gst_util_uint64_scale_int (height, display_ratio_num, + display_ratio_den); + widget->display_height = height; + } + + GST_DEBUG ("scaling to %dx%d", widget->display_width, widget->display_height); +} + +static gboolean +_queue_draw (GtkGstBaseWidget * widget) +{ + GTK_GST_BASE_WIDGET_LOCK (widget); + widget->draw_id = 0; + + if (widget->pending_resize) { + widget->pending_resize = FALSE; + + widget->v_info = widget->pending_v_info; + widget->negotiated = TRUE; + + _apply_par (widget); + + gtk_widget_queue_resize (GTK_WIDGET (widget)); + } else { + gtk_widget_queue_draw (GTK_WIDGET (widget)); + } + + GTK_GST_BASE_WIDGET_UNLOCK (widget); + + return G_SOURCE_REMOVE; +} + +static void +_update_par (GtkGstBaseWidget * widget) +{ + GTK_GST_BASE_WIDGET_LOCK (widget); + if (widget->pending_resize) { + GTK_GST_BASE_WIDGET_UNLOCK (widget); + return; + } + + if (!_calculate_par (widget, &widget->v_info)) { + GTK_GST_BASE_WIDGET_UNLOCK (widget); + return; + } + + widget->pending_resize = TRUE; + if (!widget->draw_id) { + widget->draw_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE + 10, + (GSourceFunc) _queue_draw, widget, NULL); + } + GTK_GST_BASE_WIDGET_UNLOCK (widget); +} + +static void +gtk_gst_base_widget_get_preferred_width (GtkWidget * widget, gint * min, + gint * natural) +{ + GtkGstBaseWidget *gst_widget = (GtkGstBaseWidget *) widget; + gint video_width = gst_widget->display_width; + + if (!gst_widget->negotiated) + video_width = 10; + + if (min) + *min = 1; + if (natural) + *natural = video_width; +} + +static void +gtk_gst_base_widget_get_preferred_height (GtkWidget * widget, gint * min, + gint * natural) +{ + GtkGstBaseWidget *gst_widget = (GtkGstBaseWidget *) widget; + gint video_height = gst_widget->display_height; + + if (!gst_widget->negotiated) + video_height = 10; + + if (min) + *min = 1; + if (natural) + *natural = video_height; +} + +static void +gtk_gst_base_widget_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GtkGstBaseWidget *gtk_widget = GTK_GST_BASE_WIDGET (object); + + switch (prop_id) { + case PROP_FORCE_ASPECT_RATIO: + gtk_widget->force_aspect_ratio = g_value_get_boolean (value); + break; + case PROP_PIXEL_ASPECT_RATIO: + gtk_widget->par_n = gst_value_get_fraction_numerator (value); + gtk_widget->par_d = gst_value_get_fraction_denominator (value); + _update_par (gtk_widget); + break; + case PROP_VIDEO_ASPECT_RATIO_OVERRIDE: + gtk_widget->video_par_n = gst_value_get_fraction_numerator (value); + gtk_widget->video_par_d = gst_value_get_fraction_denominator (value); + _update_par (gtk_widget); + break; + case PROP_IGNORE_ALPHA: + gtk_widget->ignore_alpha = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gtk_gst_base_widget_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GtkGstBaseWidget *gtk_widget = GTK_GST_BASE_WIDGET (object); + + switch (prop_id) { + case PROP_FORCE_ASPECT_RATIO: + g_value_set_boolean (value, gtk_widget->force_aspect_ratio); + break; + case PROP_PIXEL_ASPECT_RATIO: + gst_value_set_fraction (value, gtk_widget->par_n, gtk_widget->par_d); + break; + case PROP_VIDEO_ASPECT_RATIO_OVERRIDE: + gst_value_set_fraction (value, gtk_widget->video_par_n, + gtk_widget->video_par_d); + break; + case PROP_IGNORE_ALPHA: + g_value_set_boolean (value, gtk_widget->ignore_alpha); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static const gchar * +_gdk_key_to_navigation_string (guint keyval) +{ + /* TODO: expand */ + switch (keyval) { +#define KEY(key) case GDK_KEY_ ## key: return G_STRINGIFY(key) + KEY (Up); + KEY (Down); + KEY (Left); + KEY (Right); + KEY (Home); + KEY (End); +#undef KEY + default: + return NULL; + } +} + +static gboolean +gtk_gst_base_widget_key_event (GtkWidget * widget, GdkEventKey * event) +{ + GtkGstBaseWidget *base_widget = GTK_GST_BASE_WIDGET (widget); + GstElement *element; + + if ((element = g_weak_ref_get (&base_widget->element))) { + if (GST_IS_NAVIGATION (element)) { + const gchar *str = _gdk_key_to_navigation_string (event->keyval); + + if (!str) + str = event->string; + + gst_navigation_send_event_simple (GST_NAVIGATION (element), + (event->type == GDK_KEY_PRESS) ? + gst_navigation_event_new_key_press (str, event->state) : + gst_navigation_event_new_key_release (str, event->state)); + } + g_object_unref (element); + } + + return FALSE; +} + +static void +_fit_stream_to_allocated_size (GtkGstBaseWidget * base_widget, + GtkAllocation * allocation, GstVideoRectangle * result) +{ + if (base_widget->force_aspect_ratio) { + GstVideoRectangle src, dst; + + src.x = 0; + src.y = 0; + src.w = base_widget->display_width; + src.h = base_widget->display_height; + + dst.x = 0; + dst.y = 0; + dst.w = allocation->width; + dst.h = allocation->height; + + gst_video_sink_center_rect (src, dst, result, TRUE); + } else { + result->x = 0; + result->y = 0; + result->w = allocation->width; + result->h = allocation->height; + } +} + +void +gtk_gst_base_widget_display_size_to_stream_size (GtkGstBaseWidget * base_widget, + gdouble x, gdouble y, gdouble * stream_x, gdouble * stream_y) +{ + gdouble stream_width, stream_height; + GtkAllocation allocation; + GstVideoRectangle result; + + gtk_widget_get_allocation (GTK_WIDGET (base_widget), &allocation); + _fit_stream_to_allocated_size (base_widget, &allocation, &result); + + stream_width = (gdouble) GST_VIDEO_INFO_WIDTH (&base_widget->v_info); + stream_height = (gdouble) GST_VIDEO_INFO_HEIGHT (&base_widget->v_info); + + /* from display coordinates to stream coordinates */ + if (result.w > 0) + *stream_x = (x - result.x) / result.w * stream_width; + else + *stream_x = 0.; + + /* clip to stream size */ + if (*stream_x < 0.) + *stream_x = 0.; + if (*stream_x > GST_VIDEO_INFO_WIDTH (&base_widget->v_info)) + *stream_x = GST_VIDEO_INFO_WIDTH (&base_widget->v_info); + + /* same for y-axis */ + if (result.h > 0) + *stream_y = (y - result.y) / result.h * stream_height; + else + *stream_y = 0.; + + if (*stream_y < 0.) + *stream_y = 0.; + if (*stream_y > GST_VIDEO_INFO_HEIGHT (&base_widget->v_info)) + *stream_y = GST_VIDEO_INFO_HEIGHT (&base_widget->v_info); + + GST_TRACE ("transform %fx%f into %fx%f", x, y, *stream_x, *stream_y); +} + +static gboolean +gtk_gst_base_widget_button_event (GtkWidget * widget, GdkEventButton * event) +{ + GtkGstBaseWidget *base_widget = GTK_GST_BASE_WIDGET (widget); + GstElement *element; + + if ((element = g_weak_ref_get (&base_widget->element))) { + if (GST_IS_NAVIGATION (element)) { + gst_navigation_send_event_simple (GST_NAVIGATION (element), + (event->type == GDK_BUTTON_PRESS) ? + gst_navigation_event_new_mouse_button_press (event->button, + event->x, event->y, event->state) : + gst_navigation_event_new_mouse_button_release (event->button, + event->x, event->y, event->state)); + } + g_object_unref (element); + } + + return FALSE; +} + +static gboolean +gtk_gst_base_widget_motion_event (GtkWidget * widget, GdkEventMotion * event) +{ + GtkGstBaseWidget *base_widget = GTK_GST_BASE_WIDGET (widget); + GstElement *element; + + if ((element = g_weak_ref_get (&base_widget->element))) { + if (GST_IS_NAVIGATION (element)) { + gst_navigation_send_event_simple (GST_NAVIGATION (element), + gst_navigation_event_new_mouse_move (event->x, event->y, + event->state)); + } + g_object_unref (element); + } + + return FALSE; +} + +static gboolean +gtk_gst_base_widget_scroll_event (GtkWidget * widget, GdkEventScroll * event) +{ + GtkGstBaseWidget *base_widget = GTK_GST_BASE_WIDGET (widget); + GstElement *element; + + if ((element = g_weak_ref_get (&base_widget->element))) { + if (GST_IS_NAVIGATION (element)) { + gdouble x, y, delta_x, delta_y; + + gtk_gst_base_widget_display_size_to_stream_size (base_widget, event->x, + event->y, &x, &y); + + if (!gdk_event_get_scroll_deltas ((GdkEvent *) event, &delta_x, &delta_y)) { + gdouble offset = 20; + + delta_x = event->delta_x; + delta_y = event->delta_y; + + switch (event->direction) { + case GDK_SCROLL_UP: + delta_y = offset; + break; + case GDK_SCROLL_DOWN: + delta_y = -offset; + break; + case GDK_SCROLL_LEFT: + delta_x = -offset; + break; + case GDK_SCROLL_RIGHT: + delta_x = offset; + break; + default: + break; + } + } + gst_navigation_send_event_simple (GST_NAVIGATION (element), + gst_navigation_event_new_mouse_scroll (x, y, delta_x, delta_y, + event->state)); + } + g_object_unref (element); + } + return FALSE; +} + +static gboolean +gtk_gst_base_widget_touch_event (GtkWidget * widget, GdkEventTouch * event) +{ + GtkGstBaseWidget *base_widget = GTK_GST_BASE_WIDGET (widget); + GstElement *element; + + if ((element = g_weak_ref_get (&base_widget->element))) { + if (GST_IS_NAVIGATION (element)) { + GstEvent *nav_event; + gdouble x, y, p; + guint id, i; + + id = GPOINTER_TO_UINT (event->sequence); + gtk_gst_base_widget_display_size_to_stream_size (base_widget, event->x, + event->y, &x, &y); + + p = NAN; + for (i = 0; i < gdk_device_get_n_axes (event->device); i++) { + if (gdk_device_get_axis_use (event->device, i) == GDK_AXIS_PRESSURE) { + p = event->axesi; + break; + } + } + + switch (event->type) { + case GDK_TOUCH_BEGIN: + nav_event = + gst_navigation_event_new_touch_down (id, x, y, p, event->state); + break; + case GDK_TOUCH_UPDATE: + nav_event = + gst_navigation_event_new_touch_motion (id, x, y, p, event->state); + break; + case GDK_TOUCH_END: + case GDK_TOUCH_CANCEL: + nav_event = + gst_navigation_event_new_touch_up (id, x, y, event->state); + break; + default: + nav_event = NULL; + break; + } + + if (nav_event) + gst_navigation_send_event_simple (GST_NAVIGATION (element), nav_event); + } + g_object_unref (element); + } + + return FALSE; +} + + +void +gtk_gst_base_widget_class_init (GtkGstBaseWidgetClass * klass) +{ + GObjectClass *gobject_klass = (GObjectClass *) klass; + GtkWidgetClass *widget_klass = (GtkWidgetClass *) klass; + + gobject_klass->set_property = gtk_gst_base_widget_set_property; + gobject_klass->get_property = gtk_gst_base_widget_get_property; + + g_object_class_install_property (gobject_klass, PROP_FORCE_ASPECT_RATIO, + g_param_spec_boolean ("force-aspect-ratio", + "Force aspect ratio", + "When enabled, scaling will respect original aspect ratio", + DEFAULT_FORCE_ASPECT_RATIO, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_PARAM_MUTABLE_PLAYING)); + + g_object_class_install_property (gobject_klass, PROP_PIXEL_ASPECT_RATIO, + gst_param_spec_fraction ("pixel-aspect-ratio", "Pixel Aspect Ratio", + "The pixel aspect ratio of the device", + 0, 1, G_MAXINT, G_MAXINT, DEFAULT_DISPLAY_PAR_N, + DEFAULT_DISPLAY_PAR_D, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_PARAM_MUTABLE_PLAYING)); + + g_object_class_install_property (gobject_klass, + PROP_VIDEO_ASPECT_RATIO_OVERRIDE, + gst_param_spec_fraction ("video-aspect-ratio-override", + "Video Pixel Aspect Ratio", + "The pixel aspect ratio of the video (0/1 = follow stream)", 0, + G_MAXINT, G_MAXINT, 1, DEFAULT_VIDEO_PAR_N, DEFAULT_VIDEO_PAR_D, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_PARAM_MUTABLE_PLAYING)); + + g_object_class_install_property (gobject_klass, PROP_IGNORE_ALPHA, + g_param_spec_boolean ("ignore-alpha", "Ignore Alpha", + "When enabled, alpha will be ignored and converted to black", + DEFAULT_IGNORE_ALPHA, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + widget_klass->get_preferred_width = gtk_gst_base_widget_get_preferred_width; + widget_klass->get_preferred_height = gtk_gst_base_widget_get_preferred_height; + widget_klass->key_press_event = gtk_gst_base_widget_key_event; + widget_klass->key_release_event = gtk_gst_base_widget_key_event; + widget_klass->button_press_event = gtk_gst_base_widget_button_event; + widget_klass->button_release_event = gtk_gst_base_widget_button_event; + widget_klass->motion_notify_event = gtk_gst_base_widget_motion_event; + widget_klass->scroll_event = gtk_gst_base_widget_scroll_event; + widget_klass->touch_event = gtk_gst_base_widget_touch_event; + + GST_DEBUG_CATEGORY_INIT (gst_debug_gtk_base_widget, "gtkbasewidget", 0, + "Gtk Video Base Widget"); +} + +void +gtk_gst_base_widget_init (GtkGstBaseWidget * widget) +{ + int event_mask; + + widget->force_aspect_ratio = DEFAULT_FORCE_ASPECT_RATIO; + widget->par_n = DEFAULT_DISPLAY_PAR_N; + widget->par_d = DEFAULT_DISPLAY_PAR_D; + widget->video_par_n = DEFAULT_VIDEO_PAR_N; + widget->video_par_d = DEFAULT_VIDEO_PAR_D; + widget->ignore_alpha = DEFAULT_IGNORE_ALPHA; + + gst_video_info_init (&widget->v_info); + gst_video_info_init (&widget->pending_v_info); + + g_weak_ref_init (&widget->element, NULL); + g_mutex_init (&widget->lock); + + gtk_widget_set_can_focus (GTK_WIDGET (widget), TRUE); + event_mask = gtk_widget_get_events (GTK_WIDGET (widget)); + event_mask |= GDK_KEY_PRESS_MASK + | GDK_KEY_RELEASE_MASK + | GDK_BUTTON_PRESS_MASK + | GDK_BUTTON_RELEASE_MASK + | GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK | GDK_SCROLL_MASK + | GDK_TOUCH_MASK; + gtk_widget_set_events (GTK_WIDGET (widget), event_mask); +} + +void +gtk_gst_base_widget_finalize (GObject * object) +{ + GtkGstBaseWidget *widget = GTK_GST_BASE_WIDGET (object); + + gst_buffer_replace (&widget->pending_buffer, NULL); + gst_buffer_replace (&widget->buffer, NULL); + g_mutex_clear (&widget->lock); + g_weak_ref_clear (&widget->element); + + if (widget->draw_id) + g_source_remove (widget->draw_id); +} + +void +gtk_gst_base_widget_set_element (GtkGstBaseWidget * widget, + GstElement * element) +{ + g_weak_ref_set (&widget->element, element); +} + +gboolean +gtk_gst_base_widget_set_format (GtkGstBaseWidget * widget, + GstVideoInfo * v_info) +{ + GTK_GST_BASE_WIDGET_LOCK (widget); + + if (gst_video_info_is_equal (&widget->pending_v_info, v_info)) { + GTK_GST_BASE_WIDGET_UNLOCK (widget); + return TRUE; + } + + if (!_calculate_par (widget, v_info)) { + GTK_GST_BASE_WIDGET_UNLOCK (widget); + return FALSE; + } + + widget->pending_resize = TRUE; + widget->pending_v_info = *v_info; + + GTK_GST_BASE_WIDGET_UNLOCK (widget); + + return TRUE; +} + +void +gtk_gst_base_widget_set_buffer (GtkGstBaseWidget * widget, GstBuffer * buffer) +{ + /* As we have no type, this is better then no check */ + g_return_if_fail (GTK_IS_WIDGET (widget)); + + GTK_GST_BASE_WIDGET_LOCK (widget); + + gst_buffer_replace (&widget->pending_buffer, buffer); + + if (!widget->draw_id) { + widget->draw_id = g_idle_add_full (G_PRIORITY_DEFAULT, + (GSourceFunc) _queue_draw, widget, NULL); + } + + GTK_GST_BASE_WIDGET_UNLOCK (widget); +} + +void +gtk_gst_base_widget_queue_draw (GtkGstBaseWidget * widget) +{ + /* As we have no type, this is better then no check */ + g_return_if_fail (GTK_IS_WIDGET (widget)); + + GTK_GST_BASE_WIDGET_LOCK (widget); + + if (!widget->draw_id) { + widget->draw_id = g_idle_add_full (G_PRIORITY_DEFAULT, + (GSourceFunc) _queue_draw, widget, NULL); + } + + GTK_GST_BASE_WIDGET_UNLOCK (widget); +}
View file
gst-plugins-bad-1.22.0.tar.xz/ext/gtk/gtkgstbasewidget.h
Added
@@ -0,0 +1,102 @@ +/* + * GStreamer + * Copyright (C) 2015 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GTK_GST_BASE_WIDGET_H__ +#define __GTK_GST_BASE_WIDGET_H__ + +#include <gtk/gtk.h> +#include <gst/gst.h> +#include <gst/video/video.h> + +#define GTK_GST_BASE_WIDGET(w) ((GtkGstBaseWidget *)(w)) +#define GTK_GST_BASE_WIDGET_CLASS(k) ((GtkGstBaseWidgetClass *)(k)) +#define GTK_GST_BASE_WIDGET_LOCK(w) g_mutex_lock(&((GtkGstBaseWidget*)(w))->lock) +#define GTK_GST_BASE_WIDGET_UNLOCK(w) g_mutex_unlock(&((GtkGstBaseWidget*)(w))->lock) + +G_BEGIN_DECLS + +typedef struct _GtkGstBaseWidget GtkGstBaseWidget; +typedef struct _GtkGstBaseWidgetClass GtkGstBaseWidgetClass; + +struct _GtkGstBaseWidget +{ + union { + GtkDrawingArea drawing_area; +#if GTK_CHECK_VERSION(3, 15, 0) + GtkGLArea gl_area; +#endif + } parent; + + /* properties */ + gboolean force_aspect_ratio; + gint par_n, par_d; + gint video_par_n, video_par_d; + gboolean ignore_alpha; + + gint display_width; + gint display_height; + + gboolean negotiated; + GstBuffer *pending_buffer; + GstBuffer *buffer; + GstVideoInfo v_info; + + /* resize */ + gboolean pending_resize; + GstVideoInfo pending_v_info; + guint display_ratio_num; + guint display_ratio_den; + + /*< private >*/ + GMutex lock; + GWeakRef element; + + /* Pending draw idles callback */ + guint draw_id; +}; + +struct _GtkGstBaseWidgetClass +{ + union { + GtkDrawingAreaClass drawing_area_class; +#if GTK_CHECK_VERSION(3, 15, 0) + GtkGLAreaClass gl_area_class; +#endif + } parent_class; +}; + +/* For implementer */ +void gtk_gst_base_widget_class_init (GtkGstBaseWidgetClass * klass); +void gtk_gst_base_widget_init (GtkGstBaseWidget * widget); + +void gtk_gst_base_widget_finalize (GObject * object); + +/* API */ +gboolean gtk_gst_base_widget_set_format (GtkGstBaseWidget * widget, GstVideoInfo * v_info); +void gtk_gst_base_widget_set_buffer (GtkGstBaseWidget * widget, GstBuffer * buffer); +void gtk_gst_base_widget_queue_draw (GtkGstBaseWidget * widget); +void gtk_gst_base_widget_set_element (GtkGstBaseWidget * widget, GstElement * element); +void gtk_gst_base_widget_display_size_to_stream_size (GtkGstBaseWidget * base_widget, + gdouble x, gdouble y, + gdouble * stream_x, gdouble * stream_y); + +G_END_DECLS + +#endif /* __GTK_GST_BASE_WIDGET_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/ext/gtk/gtkgstwaylandwidget.c
Added
@@ -0,0 +1,66 @@ +/* + * GStreamer + * Copyright (C) 2015 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gtkgstwaylandwidget.h" + +/** + * SECTION:gtkgstwidget + * @title: GtkGstWaylandWidget + * @short_description: a #GtkWidget that renders GStreamer video #GstBuffers + * @see_also: #GtkDrawingArea, #GstBuffer + * + * #GtkGstWaylandWidget is an #GtkWidget that renders GStreamer video buffers. + */ + +G_DEFINE_TYPE (GtkGstWaylandWidget, gtk_gst_wayland_widget, + GTK_TYPE_DRAWING_AREA); + +static void +gtk_gst_wayland_widget_finalize (GObject * object) +{ + gtk_gst_base_widget_finalize (object); + + G_OBJECT_CLASS (gtk_gst_wayland_widget_parent_class)->finalize (object); +} + +static void +gtk_gst_wayland_widget_class_init (GtkGstWaylandWidgetClass * klass) +{ + GObjectClass *gobject_klass = (GObjectClass *) klass; + + gtk_gst_base_widget_class_init (GTK_GST_BASE_WIDGET_CLASS (klass)); + gobject_klass->finalize = gtk_gst_wayland_widget_finalize; +} + +static void +gtk_gst_wayland_widget_init (GtkGstWaylandWidget * widget) +{ + gtk_gst_base_widget_init (GTK_GST_BASE_WIDGET (widget)); +} + +GtkWidget * +gtk_gst_wayland_widget_new (void) +{ + return (GtkWidget *) g_object_new (GTK_TYPE_GST_WAYLAND_WIDGET, NULL); +}
View file
gst-plugins-bad-1.22.0.tar.xz/ext/gtk/gtkgstwaylandwidget.h
Added
@@ -0,0 +1,46 @@ +/* + * GStreamer + * Copyright (C) 2015 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gtk/gtk.h> +#include <gst/gst.h> + +#include "gtkgstbasewidget.h" + +G_BEGIN_DECLS + +#define GTK_TYPE_GST_WAYLAND_WIDGET gtk_gst_wayland_widget_get_type () +G_DECLARE_FINAL_TYPE (GtkGstWaylandWidget, gtk_gst_wayland_widget, GTK, GST_WAYLAND_WIDGET, GtkDrawingArea); + +/** + * GtkGstWaylandWidget: + * + * Opaque #GtkGstWaylandWidget object + */ +struct _GtkGstWaylandWidget +{ + /* <private> */ + GtkGstBaseWidget parent; +}; + +GtkWidget * gtk_gst_wayland_widget_new (void); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/ext/gtk/meson.build
Added
@@ -0,0 +1,22 @@ +gtkwayland_sources = + 'gstplugin.c', + 'gstgtkutils.c', + 'gstgtkwaylandsink.c', + 'gtkgstbasewidget.c', + 'gtkgstwaylandwidget.c', + + +gtk_dep = dependency('gtk+-3.0', required : get_option('gtk3')) +gtk_wayland_dep = dependency('gtk+-wayland-3.0', required : get_option('gtk3')) + +if gtk_dep.found() and gtk_wayland_dep.found() and use_wayland + gstgtkwayland = library('gstgtkwayland', + gtkwayland_sources, + c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', + include_directories : configinc, + dependencies : gtk_dep, gstvideo_dep, gstwayland_dep, + install : true, + install_dir : plugins_install_dir, + ) + plugins += gstgtkwayland +endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/hls/gsthlsdemux.c -> gst-plugins-bad-1.22.0.tar.xz/ext/hls/gsthlsdemux.c
Changed
@@ -1166,6 +1166,13 @@ buffer = tmp_buffer; } + if (hlsdemux->prog_dt) { + gst_adaptive_demux_stream_set_tags (stream, + gst_tag_list_new (GST_TAG_DATE_TIME, hlsdemux->prog_dt, NULL)); + gst_date_time_unref (hlsdemux->prog_dt); + hlsdemux->prog_dt = NULL; + } + return gst_hls_demux_handle_buffer (demux, stream, buffer, FALSE); } @@ -1247,7 +1254,9 @@ m3u8 = gst_hls_demux_stream_get_m3u8 (hlsdemux_stream); forward = (stream->demux->segment.rate > 0); - file = gst_m3u8_get_next_fragment (m3u8, forward, &sequence_pos, &discont); + file = + gst_m3u8_get_next_fragment (m3u8, forward, &sequence_pos, + &hlsdemux->prog_dt, &discont); if (file == NULL) { GST_INFO_OBJECT (hlsdemux, "This playlist doesn't contain more fragments"); @@ -1359,6 +1368,12 @@ GST_DEBUG_OBJECT (demux, "Streams aware : %d", demux->streams_aware); gst_hls_demux_clear_all_pending_data (demux); + + if (demux->prog_dt) { + gst_date_time_unref (demux->prog_dt); + demux->prog_dt = NULL; + } + GST_M3U8_CLIENT_UNLOCK (hlsdemux->client); }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/hls/gsthlsdemux.h -> gst-plugins-bad-1.22.0.tar.xz/ext/hls/gsthlsdemux.h
Changed
@@ -141,6 +141,8 @@ GHashTable *keys; GMutex keys_lock; + GstDateTime *prog_dt; + /* FIXME: check locking, protected automatically by manifest_lock already? */ /* The master playlist with the available variant streams */ GstHLSMasterPlaylist *master;
View file
gst-plugins-bad-1.20.5.tar.xz/ext/hls/m3u8.c -> gst-plugins-bad-1.22.0.tar.xz/ext/hls/m3u8.c
Changed
@@ -32,7 +32,8 @@ #define GST_CAT_DEFAULT hls_debug static GstM3U8MediaFile *gst_m3u8_media_file_new (gchar * uri, - gchar * title, GstClockTime duration, guint sequence); + gchar * title, GstClockTime duration, guint sequence, + GstDateTime * program_dt); static void gst_m3u8_init_file_unref (GstM3U8InitFile * self); static gchar *uri_join (const gchar * uri, const gchar * path); @@ -116,7 +117,7 @@ static GstM3U8MediaFile * gst_m3u8_media_file_new (gchar * uri, gchar * title, GstClockTime duration, - guint sequence) + guint sequence, GstDateTime * program_dt) { GstM3U8MediaFile *file; @@ -126,6 +127,7 @@ file->duration = duration; file->sequence = sequence; file->ref_count = 1; + file->program_dt = program_dt; return file; } @@ -150,6 +152,8 @@ g_free (self->title); g_free (self->uri); g_free (self->key); + if (self->program_dt) + gst_date_time_unref (self->program_dt); g_free (self); } } @@ -483,6 +487,7 @@ gst_m3u8_update (GstM3U8 * self, gchar * data) { gint val; + GstDateTime *program_dt = NULL; GstClockTime duration; gchar *title, *end; gboolean discontinuity = FALSE; @@ -558,7 +563,10 @@ data = uri_join (self->base_uri ? self->base_uri : self->uri, data); if (data != NULL) { GstM3U8MediaFile *file; - file = gst_m3u8_media_file_new (data, title, duration, mediasequence++); + file = + gst_m3u8_media_file_new (data, title, duration, + mediasequence++, program_dt); + program_dt = NULL; /* set encryption params */ file->key = current_key ? g_strdup (current_key) : NULL; @@ -647,8 +655,12 @@ self->discont_sequence++; discontinuity = TRUE; } else if (g_str_has_prefix (data_ext_x, "PROGRAM-DATE-TIME:")) { - /* <YYYY-MM-DDThh:mm:ssZ> */ - GST_DEBUG ("FIXME parse date"); + if (program_dt) + gst_date_time_unref (program_dt); + program_dt = gst_date_time_new_from_iso8601_string (data + 25); + if (!program_dt) { + GST_WARNING ("Could not parse program date/time"); + } } else if (g_str_has_prefix (data_ext_x, "ALLOW-CACHE:")) { self->allowcache = g_ascii_strcasecmp (data + 19, "YES") == 0; } else if (g_str_has_prefix (data_ext_x, "KEY:")) { @@ -767,6 +779,11 @@ g_free (current_key); current_key = NULL; + if (program_dt) { + gst_date_time_unref (program_dt); + program_dt = NULL; + } + self->files = g_list_reverse (self->files); if (last_init_file) @@ -919,7 +936,8 @@ GstM3U8MediaFile * gst_m3u8_get_next_fragment (GstM3U8 * m3u8, gboolean forward, - GstClockTime * sequence_position, gboolean * discont) + GstClockTime * sequence_position, GstDateTime ** program_dt, + gboolean * discont) { GstM3U8MediaFile *file = NULL; @@ -945,6 +963,11 @@ if (sequence_position) *sequence_position = m3u8->sequence_position; + + if (program_dt) + *program_dt = + file->program_dt ? gst_date_time_ref (file->program_dt) : NULL; + if (discont) *discont = file->discont || (m3u8->sequence != file->sequence);
View file
gst-plugins-bad-1.20.5.tar.xz/ext/hls/m3u8.h -> gst-plugins-bad-1.22.0.tar.xz/ext/hls/m3u8.h
Changed
@@ -99,6 +99,7 @@ gchar *key; guint8 iv16; gint64 offset, size; + GstDateTime *program_dt; /* program date time */ gint ref_count; /* ATOMIC */ GstM3U8InitFile *init_file; /* Media Initialization (hold ref) */ }; @@ -127,6 +128,7 @@ GstM3U8MediaFile * gst_m3u8_get_next_fragment (GstM3U8 * m3u8, gboolean forward, GstClockTime * sequence_position, + GstDateTime ** program_dt, gboolean * discont); gboolean gst_m3u8_has_next_fragment (GstM3U8 * m3u8,
View file
gst-plugins-bad-1.20.5.tar.xz/ext/hls/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/hls/meson.build
Changed
@@ -63,6 +63,5 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gsthls, install_dir : plugins_pkgconfig_install_dir) plugins += gsthls hls_dep = declare_dependency(include_directories : include_directories('.'))
View file
gst-plugins-bad-1.20.5.tar.xz/ext/iqa/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/iqa/meson.build
Changed
@@ -15,7 +15,6 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstiqa, install_dir : plugins_pkgconfig_install_dir) plugins += gstiqa endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/isac/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/isac/meson.build
Changed
@@ -15,6 +15,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstisac, install_dir : plugins_pkgconfig_install_dir) plugins += gstisac endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/kate/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/kate/meson.build
Changed
@@ -22,6 +22,5 @@ dependencies : gstbase_dep, gstvideo_dep, gsttag_dep, kate_dep, install : true, install_dir : plugins_install_dir) - pkgconfig.generate(gstkate, install_dir : plugins_pkgconfig_install_dir) plugins += gstkate endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/ladspa/gstladspa.c -> gst-plugins-bad-1.22.0.tar.xz/ext/ladspa/gstladspa.c
Changed
@@ -115,7 +115,7 @@ #include "gstladspafilter.h" #include "gstladspasource.h" #include "gstladspasink.h" -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include <string.h> #include <ladspa.h> @@ -250,9 +250,10 @@ "control-out", G_TYPE_UINT, control_out, NULL); g_value_init (&value, GST_TYPE_STRUCTURE); - g_value_set_boxed (&value, ladspa_meta); + g_value_take_boxed (&value, ladspa_meta); gst_structure_set_value (ladspa_meta_all, type_name, &value); g_value_unset (&value); + g_free (type_name); } }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/ladspa/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/ladspa/meson.build
Changed
@@ -33,6 +33,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstladspa, install_dir : plugins_pkgconfig_install_dir) plugins += gstladspa endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/ldac/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/ldac/meson.build
Changed
@@ -14,6 +14,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstldac, install_dir : plugins_pkgconfig_install_dir) plugins += gstldac endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/libde265/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/libde265/meson.build
Changed
@@ -14,6 +14,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstde265, install_dir : plugins_pkgconfig_install_dir) plugins += gstde265 endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/lv2/gstlv2.c -> gst-plugins-bad-1.22.0.tar.xz/ext/lv2/gstlv2.c
Changed
@@ -236,7 +236,7 @@ "can-do-presets", G_TYPE_BOOLEAN, can_do_presets, NULL); g_value_init (&value, GST_TYPE_STRUCTURE); - g_value_set_boxed (&value, lv2_meta); + g_value_take_boxed (&value, lv2_meta); gst_structure_set_value (lv2_meta_all, type_name, &value); g_value_unset (&value);
View file
gst-plugins-bad-1.20.5.tar.xz/ext/lv2/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/lv2/meson.build
Changed
@@ -16,6 +16,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstlv2, install_dir : plugins_pkgconfig_install_dir) plugins += gstlv2 endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/mdns/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/mdns/meson.build
Changed
@@ -12,6 +12,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstmicrodns, install_dir : plugins_pkgconfig_install_dir) plugins += gstmicrodns endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/meson.build
Changed
@@ -21,6 +21,7 @@ subdir('gme') subdir('gs') subdir('gsm') +subdir('gtk') subdir('hls') subdir('iqa') subdir('isac')
View file
gst-plugins-bad-1.20.5.tar.xz/ext/modplug/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/modplug/meson.build
Changed
@@ -13,6 +13,5 @@ install: true, install_dir: plugins_install_dir, ) - pkgconfig.generate(gstmodplug, install_dir: plugins_pkgconfig_install_dir) plugins += gstmodplug endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/mpeg2enc/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/mpeg2enc/meson.build
Changed
@@ -34,6 +34,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstmpeg2enc, install_dir : plugins_pkgconfig_install_dir) plugins += gstmpeg2enc endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/mplex/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/mplex/meson.build
Changed
@@ -20,6 +20,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstmplex2, install_dir : plugins_pkgconfig_install_dir) plugins += gstmplex2 endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/musepack/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/musepack/meson.build
Changed
@@ -10,7 +10,6 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstmusepack, install_dir : plugins_pkgconfig_install_dir) plugins += gstmusepack elif get_option('musepack').enabled() error('Could not find libmpcdec header files, but Musepack was enabled via options')
View file
gst-plugins-bad-1.20.5.tar.xz/ext/neon/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/neon/meson.build
Changed
@@ -9,6 +9,5 @@ dependencies : gstbase_dep, neon_dep, install : true, install_dir : plugins_install_dir) - pkgconfig.generate(gstneon, install_dir : plugins_pkgconfig_install_dir) plugins += gstneon endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/onnx/gstonnxclient.cpp -> gst-plugins-bad-1.22.0.tar.xz/ext/onnx/gstonnxclient.cpp
Changed
@@ -73,6 +73,7 @@ GstOnnxClient::~GstOnnxClient () { + outputNames.clear(); delete session; deletedest; } @@ -115,6 +116,10 @@ case GST_ML_OUTPUT_NODE_FUNCTION_CLASS: return "label"; break; + case GST_ML_OUTPUT_NODE_NUMBER_OF: + g_assert_not_reached(); + GST_WARNING("Invalid parameter"); + break; }; return ""; @@ -130,9 +135,16 @@ return inputImageFormat; } -std::vector < const char *>GstOnnxClient::getOutputNodeNames (void) +std::vector< const char *> GstOnnxClient::getOutputNodeNames (void) { - return outputNames; + if (!outputNames.empty() && outputNamesRaw.size() != outputNames.size()) { + outputNamesRaw.resize(outputNames.size()); + for (size_t i = 0; i < outputNamesRaw.size(); i++) { + outputNamesRawi = outputNamesi.get(); + } + } + + return outputNamesRaw; } void GstOnnxClient::setOutputNodeIndex (GstMlOutputNodeFunction node, @@ -227,11 +239,13 @@ GST_DEBUG ("Number of Output Nodes: %d", (gint) session->GetOutputCount ()); Ort::AllocatorWithDefaultOptions allocator; - GST_DEBUG ("Input name: %s", session->GetInputName (0, allocator)); + auto input_name = session->GetInputNameAllocated (0, allocator); + GST_DEBUG ("Input name: %s", input_name.get()); for (size_t i = 0; i < session->GetOutputCount (); ++i) { - auto output_name = session->GetOutputName (i, allocator); - outputNames.push_back (output_name); + auto output_name = session->GetOutputNameAllocated (i, allocator); + GST_DEBUG("Output name %lu:%s", i, output_name.get()); + outputNames.push_back (std::move(output_name)); auto type_info = session->GetOutputTypeInfo (i); auto tensor_info = type_info.GetTensorTypeAndShapeInfo (); @@ -278,7 +292,7 @@ parseDimensions (vmeta); Ort::AllocatorWithDefaultOptions allocator; - auto inputName = session->GetInputName (0, allocator); + auto inputName = session->GetInputNameAllocated (0, allocator); auto inputTypeInfo = session->GetInputTypeInfo (0); std::vector < int64_t > inputDims = inputTypeInfo.GetTensorTypeAndShapeInfo ().GetShape (); @@ -366,11 +380,11 @@ std::vector < Ort::Value > inputTensors; inputTensors.push_back (Ort::Value::CreateTensor < uint8_t > (memoryInfo, dest, inputTensorSize, inputDims.data (), inputDims.size ())); - std::vector < const char *>inputNames { inputName }; + std::vector < const char *>inputNames { inputName.get () }; std::vector < Ort::Value > modelOutput = session->Run (Ort::RunOptions { nullptr}, inputNames.data (), - inputTensors.data (), 1, outputNames.data (), outputNames.size ()); + inputTensors.data (), 1, outputNamesRaw.data (), outputNamesRaw.size ()); auto numDetections = modelOutputgetOutputNodeIndex
View file
gst-plugins-bad-1.20.5.tar.xz/ext/onnx/gstonnxclient.h -> gst-plugins-bad-1.22.0.tar.xz/ext/onnx/gstonnxclient.h
Changed
@@ -108,7 +108,8 @@ GstMlOutputNodeInfo outputNodeInfoGST_ML_OUTPUT_NODE_NUMBER_OF; // !! indexed by array index size_t outputNodeIndexToFunctionGST_ML_OUTPUT_NODE_NUMBER_OF; - std::vector < const char *>outputNames; + std::vector < const char *> outputNamesRaw; + std::vector < Ort::AllocatedStringPtr > outputNames; GstMlModelInputImageFormat inputImageFormat; bool fixedInputImageSize; };
View file
gst-plugins-bad-1.20.5.tar.xz/ext/onnx/gstonnxobjectdetector.cpp -> gst-plugins-bad-1.22.0.tar.xz/ext/onnx/gstonnxobjectdetector.cpp
Changed
@@ -55,16 +55,24 @@ * * ## Example launch command: * - * (note: an object detection model has 3 or 4 output nodes, but there is no naming convention - * to indicate which node outputs the bounding box, which node outputs the label, etc. - * So, the `onnxobjectdetector` element has properties to map each node's functionality to its - * respective node index in the specified model ) + * (note: an object detection model has 3 or 4 output nodes, but there is no + * naming convention to indicate which node outputs the bounding box, which + * node outputs the label, etc. So, the `onnxobjectdetector` element has + * properties to map each node's functionality to its respective node index in + * the specified model. Image resolution also need to be adapted to the model. + * The videoscale in the pipeline below will scale the image, using padding if + * required, to 640x383 resolution required by the model.) + * + * model.onnx can be found here: + * https://github.com/zoq/onnx-runtime-examples/raw/main/data/models/model.onnx * * ``` * GST_DEBUG=objectdetector:5 gst-launch-1.0 multifilesrc \ * location=000000088462.jpg caps=image/jpeg,framerate=\(fraction\)30/1 ! jpegdec ! \ * videoconvert ! \ - * onnxobjectdetector \ + * videoscale ! \ + * 'video/x-raw,width=640,height=383' ! \ + * onnxobjectdetector ! \ * box-node-index=0 \ * class-node-index=1 \ * score-node-index=2 \
View file
gst-plugins-bad-1.20.5.tar.xz/ext/onnx/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/onnx/meson.build
Changed
@@ -3,7 +3,7 @@ endif -onnxrt_dep = dependency('libonnxruntime',required : get_option('onnx')) +onnxrt_dep = dependency('libonnxruntime', version : '>= 1.13.1', required : get_option('onnx')) if onnxrt_dep.found() onnxrt_include_root = onnxrt_dep.get_variable('includedir') @@ -27,6 +27,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstonnx, install_dir : plugins_pkgconfig_install_dir) plugins += gstonnx endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/openal/gstopenal.c -> gst-plugins-bad-1.22.0.tar.xz/ext/openal/gstopenal.c
Changed
@@ -28,7 +28,7 @@ #include "gstopenalelements.h" -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> static gboolean
View file
gst-plugins-bad-1.20.5.tar.xz/ext/openal/gstopenalelement.c -> gst-plugins-bad-1.22.0.tar.xz/ext/openal/gstopenalelement.c
Changed
@@ -30,7 +30,7 @@ #include "gstopenalsink.h" #include "gstopenalsrc.h" -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> GST_DEBUG_CATEGORY (openal_debug);
View file
gst-plugins-bad-1.20.5.tar.xz/ext/openal/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/openal/meson.build
Changed
@@ -9,6 +9,5 @@ install: true, install_dir: plugins_install_dir, ) - pkgconfig.generate(gstopenal, install_dir: plugins_pkgconfig_install_dir) plugins += gstopenal endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/openaptx/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/openaptx/meson.build
Changed
@@ -26,6 +26,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstopenaptx, install_dir : plugins_pkgconfig_install_dir) plugins += gstopenaptx endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/opencv/gsthanddetect.cpp -> gst-plugins-bad-1.22.0.tar.xz/ext/opencv/gsthanddetect.cpp
Changed
@@ -122,7 +122,7 @@ static void gst_handdetect_navigation_interface_init (GstNavigationInterface * iface); static void gst_handdetect_navigation_send_event (GstNavigation * navigation, - GstStructure * structure); + GstEvent * event); G_DEFINE_TYPE_WITH_CODE (GstHanddetect, gst_handdetect, GST_TYPE_OPENCV_VIDEO_FILTER, @@ -136,7 +136,7 @@ static void gst_handdetect_navigation_interface_init (GstNavigationInterface * iface) { - iface->send_event = gst_handdetect_navigation_send_event; + iface->send_event_simple = gst_handdetect_navigation_send_event; } /* FIXME: this function used to parse the region of interests coordinates @@ -146,14 +146,12 @@ */ static void gst_handdetect_navigation_send_event (GstNavigation * navigation, - GstStructure * structure) + GstEvent * event) { GstHanddetect *filter = GST_HANDDETECT (navigation); GstPad *peer; if ((peer = gst_pad_get_peer (GST_BASE_TRANSFORM_CAST (filter)->sinkpad))) { - GstEvent *event; - event = gst_event_new_navigation (structure); gst_pad_send_event (peer, event); gst_object_unref (peer); } @@ -481,11 +479,10 @@ * !!! this will CHANGE in the future !!! * !!! by adding gst_navigation_send_hand_detect_event() in navigation.c !!! */ - gst_navigation_send_mouse_event (GST_NAVIGATION (filter), - "mouse-move", - 0, - (double) (filter->best_r->x + filter->best_r->width * 0.5), - (double) (filter->best_r->y + filter->best_r->height * 0.5)); + gst_handdetect_navigation_send_event (GST_NAVIGATION (filter), + gst_navigation_event_new_mouse_move ( + (double) (filter->best_r->x + filter->best_r->width * 0.5), + (double) (filter->best_r->y + filter->best_r->height * 0.5), GST_NAVIGATION_MODIFIER_NONE)); #endif } @@ -571,11 +568,10 @@ * !!! this will CHANGE in the future !!! * !!! by adding gst_navigation_send_hand_detect_event() in navigation.c !!! */ - gst_navigation_send_mouse_event (GST_NAVIGATION (filter), - "mouse-move", - 0, - (double) (filter->best_r->x + filter->best_r->width * 0.5), - (double) (filter->best_r->y + filter->best_r->height * 0.5)); + gst_handdetect_navigation_send_event (GST_NAVIGATION (filter), + gst_navigation_event_new_mouse_move ( + (double) (filter->best_r->x + filter->best_r->width * 0.5), + (double) (filter->best_r->y + filter->best_r->height * 0.5), GST_NAVIGATION_MODIFIER_NONE)); /* or use another way to send upstream navigation event for debug *
View file
gst-plugins-bad-1.20.5.tar.xz/ext/opencv/gsttemplatematch.cpp -> gst-plugins-bad-1.22.0.tar.xz/ext/opencv/gsttemplatematch.cpp
Changed
@@ -60,7 +60,7 @@ # include <config.h> #endif -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "gsttemplatematch.h" #include <opencv2/imgproc.hpp> #include <opencv2/imgcodecs.hpp>
View file
gst-plugins-bad-1.20.5.tar.xz/ext/opencv/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/opencv/meson.build
Changed
@@ -71,7 +71,7 @@ endif if not opencv_found - opencv_dep = dependency('opencv4', version : '>= 4.0.0', '< 4.7.0', required : false) + opencv_dep = dependency('opencv4', version : '>= 4.0.0', required : false) opencv_found = opencv_dep.found() if opencv_found foreach h : libopencv4_headers @@ -124,7 +124,6 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstopencv, install_dir : plugins_pkgconfig_install_dir) plugins += gstopencv elif get_option('opencv').enabled() error('OpenCV support enabled but required dependencies were not found.')
View file
gst-plugins-bad-1.20.5.tar.xz/ext/openexr/gstopenexrdec.cpp -> gst-plugins-bad-1.22.0.tar.xz/ext/openexr/gstopenexrdec.cpp
Changed
@@ -26,10 +26,10 @@ #include <gst/base/base.h> #include <string.h> +#include <stdint.h> #include <ImfRgbaFile.h> #include <ImfIO.h> -#include <ImfInt64.h> using namespace Imf; using namespace Imath; @@ -43,8 +43,8 @@ } virtual bool read (char c, int n); - virtual Int64 tellg (); - virtual void seekg (Int64 pos); + virtual uint64_t tellg (); + virtual void seekg (uint64_t pos); virtual void clear (); private: @@ -64,13 +64,13 @@ return (offset == size); } -Int64 MemIStream::tellg () +uint64_t MemIStream::tellg () { return offset; } void -MemIStream::seekg (Int64 pos) +MemIStream::seekg (uint64_t pos) { offset = pos; if (offset > size)
View file
gst-plugins-bad-1.20.5.tar.xz/ext/openexr/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/openexr/meson.build
Changed
@@ -33,6 +33,5 @@ install: true, install_dir: plugins_install_dir, ) - pkgconfig.generate(gstopenexr, install_dir: plugins_pkgconfig_install_dir) plugins += gstopenexr endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/openh264/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/openh264/meson.build
Changed
@@ -19,6 +19,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstopenh264, install_dir : plugins_pkgconfig_install_dir) plugins += gstopenh264 endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/openjpeg/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/openjpeg/meson.build
Changed
@@ -22,6 +22,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstopenjpeg, install_dir : plugins_pkgconfig_install_dir) plugins += gstopenjpeg endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/openmpt/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/openmpt/meson.build
Changed
@@ -8,6 +8,5 @@ install: true, install_dir: plugins_install_dir, ) - pkgconfig.generate(gstopenmpt, install_dir: plugins_pkgconfig_install_dir) plugins += gstopenmpt endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/openni2/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/openni2/meson.build
Changed
@@ -13,6 +13,5 @@ install: true, install_dir: plugins_install_dir, ) - pkgconfig.generate(gstopenni2, install_dir: plugins_pkgconfig_install_dir) plugins += gstopenni2 endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/opus/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/opus/meson.build
Changed
@@ -17,6 +17,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstopus, install_dir : plugins_pkgconfig_install_dir) plugins += gstopus endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/qroverlay/gstbaseqroverlay.c -> gst-plugins-bad-1.22.0.tar.xz/ext/qroverlay/gstbaseqroverlay.c
Changed
@@ -51,6 +51,7 @@ PROP_Y_AXIS, PROP_PIXEL_SIZE, PROP_QRCODE_ERROR_CORRECTION, + PROP_CASE_SENSITIVE, }; typedef struct _GstBaseQROverlayPrivate GstBaseQROverlayPrivate; @@ -65,6 +66,7 @@ GstElement *overlaycomposition; GstVideoInfo info; gboolean valid; + gboolean case_sensitive; GstPad *sinkpad, *srcpad; GstVideoOverlayComposition *prev_overlay; @@ -91,6 +93,7 @@ #define DEFAULT_PROP_QUALITY 1 #define DEFAULT_PROP_PIXEL_SIZE 3 +#define DEFAULT_PROP_CASE_SENSITIVE FALSE #define GST_TYPE_QRCODE_QUALITY (gst_qrcode_quality_get_type()) static GType @@ -234,7 +237,8 @@ } else if (content) { GST_INFO_OBJECT (self, "String will be encoded : %s", content); qrcode = - QRcode_encodeString (content, 0, priv->qrcode_quality, QR_MODE_8, 0); + QRcode_encodeString (content, 0, priv->qrcode_quality, QR_MODE_8, + priv->case_sensitive); if (qrcode) { GST_DEBUG_OBJECT (self, "String encoded"); @@ -299,6 +303,19 @@ "qrcode-error-correction", GST_TYPE_QRCODE_QUALITY, DEFAULT_PROP_QUALITY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstBaseQROverlay::case-sensitive: + * + * Strings to encode are case sensitive (e.g. passwords or SSIDs). + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_CASE_SENSITIVE, + g_param_spec_boolean ("case-sensitive", "Case Sensitive", + "Strings to encode are case sensitive (e.g. passwords or SSIDs)", + DEFAULT_PROP_CASE_SENSITIVE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_element_class_add_pad_template (gstelement_class, gst_static_pad_template_get (&src_template)); gst_element_class_add_pad_template (gstelement_class, @@ -319,6 +336,7 @@ priv->x_percent = 50.0; priv->y_percent = 50.0; priv->qrcode_quality = DEFAULT_PROP_QUALITY; + priv->case_sensitive = DEFAULT_PROP_CASE_SENSITIVE; priv->span_frame = 0; priv->qrcode_size = DEFAULT_PROP_PIXEL_SIZE; priv->overlaycomposition = @@ -366,6 +384,9 @@ case PROP_QRCODE_ERROR_CORRECTION: priv->qrcode_quality = g_value_get_enum (value); break; + case PROP_CASE_SENSITIVE: + priv->case_sensitive = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -391,6 +412,9 @@ case PROP_QRCODE_ERROR_CORRECTION: g_value_set_enum (value, priv->qrcode_quality); break; + case PROP_CASE_SENSITIVE: + g_value_set_boolean (value, priv->case_sensitive); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break;
View file
gst-plugins-bad-1.20.5.tar.xz/ext/qroverlay/gstqroverlay.c -> gst-plugins-bad-1.22.0.tar.xz/ext/qroverlay/gstqroverlay.c
Changed
@@ -30,6 +30,15 @@ * ``` bash * gst-launch -v -m videotestsrc ! qroverlay ! fakesink silent=TRUE * ``` + * Since 1.22 the `qroverlay` element also supports a #GstCustomMeta called + * `GstQROverlayMeta` which allows upstream elements to set the data to be + * rendered on the buffers that flow through it. This custom meta + * #GstStructure has the following fields: + * + * * #gchar* `data` (**mandatory**): The data to use to render the qrcode. + * * #gboolean `keep_data` (**mandatory**): Set to %TRUE if the data from that + * metadata should be used as #qroverlay:data + * * * Since: 1.20 */ @@ -76,9 +85,38 @@ gchar *content; GstQROverlay *self = GST_QR_OVERLAY (base); + GstCustomMeta *meta = gst_buffer_get_custom_meta (buf, "GstQROverlayMeta"); + if (meta) { + gchar *data; + GstStructure *structure = + gst_custom_meta_get_structure ((GstCustomMeta *) meta); + + if (gst_structure_get (structure, "data", G_TYPE_STRING, &data, NULL)) { + gboolean keep_data; + + GST_OBJECT_LOCK (self); + self->data_changed = TRUE; + if (gst_structure_get_boolean (structure, "keep_data", &keep_data) + && keep_data) { + g_free (self->data); + self->data = g_strdup (self->data); + } + GST_OBJECT_UNLOCK (self); + + *reuse_prev = FALSE; + + return data; + } + + GST_WARNING_OBJECT (self, + "Got a GstQROverlayMeta without a 'data' field in its struct"); + } + + GST_OBJECT_LOCK (self); content = g_strdup (self->data); *reuse_prev = self->data_changed; + self->data_changed = FALSE; GST_OBJECT_UNLOCK (self); return content; @@ -124,10 +162,12 @@ { GObjectClass *gobject_class; GstElementClass *gstelement_class; + static const gchar *tags = { NULL }; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; + gobject_class->set_property = gst_qr_overlay_set_property; gobject_class->get_property = gst_qr_overlay_get_property; @@ -137,6 +177,8 @@ "Overlay Qrcodes over each buffer with data passed in", "Thibault Saunier <tsaunier@igalia.com>"); + gst_meta_register_custom ("GstQROverlayMeta", tags, NULL, NULL, NULL); + g_object_class_install_property (gobject_class, PROP_DATA, g_param_spec_string ("data", "Data",
View file
gst-plugins-bad-1.20.5.tar.xz/ext/qroverlay/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/qroverlay/meson.build
Changed
@@ -9,7 +9,6 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstqroverlay, install_dir : plugins_pkgconfig_install_dir) plugins += gstqroverlay endif endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/resindvd/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/resindvd/meson.build
Changed
@@ -29,6 +29,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstresindvd, install_dir : plugins_pkgconfig_install_dir) plugins += gstresindvd endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/resindvd/resindvdbin.c -> gst-plugins-bad-1.22.0.tar.xz/ext/resindvd/resindvdbin.c
Changed
@@ -28,7 +28,7 @@ #include <gst/pbutils/missing-plugins.h> #include <gst/video/video.h> #include <gst/audio/audio.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "resindvdbin.h" #include "resindvdsrc.h"
View file
gst-plugins-bad-1.20.5.tar.xz/ext/resindvd/resindvdsrc.c -> gst-plugins-bad-1.22.0.tar.xz/ext/resindvd/resindvdsrc.c
Changed
@@ -28,7 +28,7 @@ #include <gmodule.h> #include <gst/gst.h> #include <gst/glib-compat-private.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include <gst/video/video.h> #include <gst/video/navigation.h> #include <gst/tag/tag.h>
View file
gst-plugins-bad-1.20.5.tar.xz/ext/rsvg/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/rsvg/meson.build
Changed
@@ -15,6 +15,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstrsvg, install_dir : plugins_pkgconfig_install_dir) plugins += gstrsvg endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/rtmp/gstrtmpsrc.c -> gst-plugins-bad-1.22.0.tar.xz/ext/rtmp/gstrtmpsrc.c
Changed
@@ -53,7 +53,7 @@ #include "config.h" #endif -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "gstrtmpelements.h" #include "gstrtmpsrc.h"
View file
gst-plugins-bad-1.20.5.tar.xz/ext/rtmp/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/rtmp/meson.build
Changed
@@ -16,6 +16,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstrtmp, install_dir : plugins_pkgconfig_install_dir) plugins += gstrtmp endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/sbc/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/sbc/meson.build
Changed
@@ -15,6 +15,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstsbc, install_dir : plugins_pkgconfig_install_dir) plugins += gstsbc endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/sctp/gstsctpdec.c -> gst-plugins-bad-1.22.0.tar.xz/ext/sctp/gstsctpdec.c
Changed
@@ -629,8 +629,14 @@ srcpad = gst_element_get_static_pad (GST_ELEMENT (self), pad_name); g_free (pad_name); if (!srcpad) { - GST_WARNING_OBJECT (self, "Reset called on stream without a srcpad"); - return; + /* This can happen if a stream is created but the peer never sends any data. + * We still need to signal the reset by removing the relevant pad. To do + * that, we need to add the relevant pad first. */ + srcpad = get_pad_for_stream_id (self, stream_id); + if (!srcpad) { + GST_WARNING_OBJECT (self, "Reset called on stream without a srcpad"); + return; + } } remove_pad (self, srcpad); gst_object_unref (srcpad);
View file
gst-plugins-bad-1.20.5.tar.xz/ext/sctp/gstsctpenc.c -> gst-plugins-bad-1.22.0.tar.xz/ext/sctp/gstsctpenc.c
Changed
@@ -103,6 +103,7 @@ GMutex lock; GCond cond; gboolean flushing; + gboolean clear_to_send; }; G_DEFINE_TYPE (GstSctpEncPad, gst_sctp_enc_pad, GST_TYPE_PAD); @@ -132,6 +133,7 @@ g_mutex_init (&self->lock); g_cond_init (&self->cond); self->flushing = FALSE; + self->clear_to_send = FALSE; } static void gst_sctp_enc_finalize (GObject * object); @@ -563,6 +565,7 @@ { GstSctpEnc *self = GST_SCTP_ENC (parent); GstSctpEncPad *sctpenc_pad = GST_SCTP_ENC_PAD (pad); + GstSctpEncPad *sctpenc_pad_next = NULL; GstMapInfo map; guint32 ppid; gboolean ordered; @@ -574,6 +577,7 @@ GstFlowReturn flow_ret = GST_FLOW_ERROR; const guint8 *data; guint32 length; + gboolean clear_to_send; GST_OBJECT_LOCK (self); if (self->src_ret != GST_FLOW_OK) { @@ -629,7 +633,21 @@ data = map.data; length = map.size; + GST_OBJECT_LOCK (self); + clear_to_send = g_queue_is_empty (&self->pending_pads); + g_queue_push_tail (&self->pending_pads, sctpenc_pad); + GST_OBJECT_UNLOCK (self); + g_mutex_lock (&sctpenc_pad->lock); + + if (clear_to_send) { + sctpenc_pad->clear_to_send = TRUE; + } + + while (!sctpenc_pad->flushing && !sctpenc_pad->clear_to_send) { + g_cond_wait (&sctpenc_pad->cond, &sctpenc_pad->lock); + } + while (!sctpenc_pad->flushing) { guint32 bytes_sent; @@ -658,15 +676,8 @@ length -= bytes_sent; /* The buffer was probably full. Retry in a while */ - GST_OBJECT_LOCK (self); - g_queue_push_tail (&self->pending_pads, sctpenc_pad); - GST_OBJECT_UNLOCK (self); - g_cond_wait_until (&sctpenc_pad->cond, &sctpenc_pad->lock, end_time); - GST_OBJECT_LOCK (self); - g_queue_remove (&self->pending_pads, sctpenc_pad); - GST_OBJECT_UNLOCK (self); } else if (bytes_sent == length) { GST_DEBUG_OBJECT (pad, "Successfully sent buffer"); sctpenc_pad->bytes_sent += bytes_sent; @@ -676,8 +687,21 @@ flow_ret = sctpenc_pad->flushing ? GST_FLOW_FLUSHING : GST_FLOW_OK; out: + sctpenc_pad->clear_to_send = FALSE; g_mutex_unlock (&sctpenc_pad->lock); + GST_OBJECT_LOCK (self); + g_queue_remove (&self->pending_pads, sctpenc_pad); + sctpenc_pad_next = g_queue_peek_head (&self->pending_pads); + GST_OBJECT_UNLOCK (self); + + if (sctpenc_pad_next) { + g_mutex_lock (&sctpenc_pad_next->lock); + sctpenc_pad_next->clear_to_send = TRUE; + g_cond_signal (&sctpenc_pad_next->cond); + g_mutex_unlock (&sctpenc_pad_next->lock); + } + gst_buffer_unmap (buffer, &map); error: gst_buffer_unref (buffer); @@ -890,7 +914,6 @@ GstSctpEnc *self = user_data; GstBuffer *gstbuf; GstDataQueueItem *item; - GList *pending_pads, *l; GstSctpEncPad *sctpenc_pad; GST_DEBUG_OBJECT (self, "Received output packet of size %" G_GSIZE_FORMAT, @@ -909,21 +932,22 @@ GST_DEBUG_OBJECT (self, "Failed to push item because we're flushing"); } - /* Wake up pads in the order they waited, oldest pad first */ + /* Wake up the oldest pad which is the one that needs to finish first */ GST_OBJECT_LOCK (self); - pending_pads = NULL; - while ((sctpenc_pad = g_queue_pop_tail (&self->pending_pads))) { - pending_pads = g_list_prepend (pending_pads, sctpenc_pad); - } - GST_OBJECT_UNLOCK (self); + sctpenc_pad = g_queue_peek_head (&self->pending_pads); + if (sctpenc_pad) { + gst_object_ref (sctpenc_pad); + + GST_OBJECT_UNLOCK (self); - for (l = pending_pads; l; l = l->next) { - sctpenc_pad = l->data; g_mutex_lock (&sctpenc_pad->lock); g_cond_signal (&sctpenc_pad->cond); g_mutex_unlock (&sctpenc_pad->lock); + + gst_object_unref (sctpenc_pad); + } else { + GST_OBJECT_UNLOCK (self); } - g_list_free (pending_pads); } static void
View file
gst-plugins-bad-1.20.5.tar.xz/ext/sctp/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/sctp/meson.build
Changed
@@ -57,6 +57,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstsctp, install_dir : plugins_pkgconfig_install_dir) plugins += gstsctp endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/sctp/usrsctp/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/sctp/usrsctp/meson.build
Changed
@@ -76,7 +76,6 @@ if compiler.get_id() == 'gcc' compile_args += compiler.get_supported_arguments( '-Wno-format', - '-D_WIN32_WINNT=0x601', # Enables inet_ntop and friends ) endif else
View file
gst-plugins-bad-1.20.5.tar.xz/ext/smoothstreaming/gstmssdemux.c -> gst-plugins-bad-1.22.0.tar.xz/ext/smoothstreaming/gstmssdemux.c
Changed
@@ -67,7 +67,7 @@ #include "config.h" #endif -#include "gst/gst-i18n-plugin.h" +#include <glib/gi18n-lib.h> #include <stdio.h> #include <stdlib.h>
View file
gst-plugins-bad-1.20.5.tar.xz/ext/smoothstreaming/gstsmoothstreaming-plugin.c -> gst-plugins-bad-1.22.0.tar.xz/ext/smoothstreaming/gstsmoothstreaming-plugin.c
Changed
@@ -23,7 +23,7 @@ #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include "gst/gst-i18n-plugin.h" +#include <glib/gi18n-lib.h> #include <gst/gst.h> #include "gstmssdemux.h"
View file
gst-plugins-bad-1.20.5.tar.xz/ext/smoothstreaming/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/smoothstreaming/meson.build
Changed
@@ -18,6 +18,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstmss, install_dir : plugins_pkgconfig_install_dir) plugins += gstmss endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/sndfile/gstsf.c -> gst-plugins-bad-1.22.0.tar.xz/ext/sndfile/gstsf.c
Changed
@@ -22,7 +22,7 @@ #include "config.h" #endif -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include <string.h> #include "gstsfelements.h"
View file
gst-plugins-bad-1.20.5.tar.xz/ext/sndfile/gstsfdec.c -> gst-plugins-bad-1.22.0.tar.xz/ext/sndfile/gstsfdec.c
Changed
@@ -22,7 +22,7 @@ #endif #include <stdlib.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include <gst/audio/audio.h> #include "gstsfelements.h"
View file
gst-plugins-bad-1.20.5.tar.xz/ext/sndfile/gstsfelement.c -> gst-plugins-bad-1.22.0.tar.xz/ext/sndfile/gstsfelement.c
Changed
@@ -22,7 +22,7 @@ #include "config.h" #endif -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include <string.h> #include "gstsfelements.h"
View file
gst-plugins-bad-1.20.5.tar.xz/ext/sndfile/gstsfsink.c -> gst-plugins-bad-1.22.0.tar.xz/ext/sndfile/gstsfsink.c
Changed
@@ -24,7 +24,7 @@ #include <gst/audio/audio.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "gstsfsink.h"
View file
gst-plugins-bad-1.20.5.tar.xz/ext/sndfile/gstsfsrc.c -> gst-plugins-bad-1.22.0.tar.xz/ext/sndfile/gstsfsrc.c
Changed
@@ -25,7 +25,7 @@ # include "config.h" #endif -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "gstsfsrc.h"
View file
gst-plugins-bad-1.20.5.tar.xz/ext/sndfile/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/sndfile/meson.build
Changed
@@ -9,6 +9,5 @@ install: true, install_dir: plugins_install_dir, ) - pkgconfig.generate(gstsndfile, install_dir: plugins_pkgconfig_install_dir) plugins += gstsndfile endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/soundtouch/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/soundtouch/meson.build
Changed
@@ -39,6 +39,5 @@ dependencies : gstaudio_dep, soundtouch_dep, gnustl_dep, install : true, install_dir : plugins_install_dir) - pkgconfig.generate(gstsoundtouch, install_dir : plugins_pkgconfig_install_dir) plugins += gstsoundtouch endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/spandsp/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/spandsp/meson.build
Changed
@@ -19,6 +19,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstspandsp, install_dir : plugins_pkgconfig_install_dir) plugins += gstspandsp endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/srt/gstsrtobject.c -> gst-plugins-bad-1.22.0.tar.xz/ext/srt/gstsrtobject.c
Changed
@@ -69,6 +69,7 @@ PROP_WAIT_FOR_CONNECTION, PROP_STREAMID, PROP_AUTHENTICATION, + PROP_AUTO_RECONNECT, PROP_LAST }; @@ -353,6 +354,7 @@ srtobject->listener_poll_id = SRT_ERROR; srtobject->sent_headers = FALSE; srtobject->wait_for_connection = GST_SRT_DEFAULT_WAIT_FOR_CONNECTION; + srtobject->auto_reconnect = GST_SRT_DEFAULT_AUTO_RECONNECT; g_cond_init (&srtobject->sock_cond); return srtobject; @@ -424,6 +426,8 @@ break; case PROP_AUTHENTICATION: srtobject->authentication = g_value_get_boolean (value); + case PROP_AUTO_RECONNECT: + srtobject->auto_reconnect = g_value_get_boolean (value); break; default: goto err; @@ -531,6 +535,10 @@ break; case PROP_AUTHENTICATION: g_value_set_boolean (value, srtobject->authentication); + case PROP_AUTO_RECONNECT: + GST_OBJECT_LOCK (srtobject->element); + g_value_set_boolean (value, srtobject->auto_reconnect); + GST_OBJECT_UNLOCK (srtobject->element); break; default: return FALSE; @@ -692,6 +700,22 @@ "Authentication", "Authenticate a connection", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstSRTSrc:auto-reconnect: + * + * Boolean to choose whether to automatically reconnect. If TRUE, an element + * in caller mode will try to reconnect instead of reporting an error. + * + * Since: 1.22 + * + */ + g_object_class_install_property (gobject_class, PROP_AUTO_RECONNECT, + g_param_spec_boolean ("auto-reconnect", + "Automatic reconnect", + "Automatically reconnect when connection fails", + GST_SRT_DEFAULT_AUTO_RECONNECT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void @@ -771,7 +795,7 @@ { SrtOption *option = srt_options; - for (; option; ++option) { + for (; option->name; ++option) { if (g_str_equal (key, option->name)) { switch (option->gtype) { case G_TYPE_INT: @@ -1453,6 +1477,7 @@ gint poll_timeout; GstSRTConnectionMode connection_mode = GST_SRT_CONNECTION_MODE_NONE; gint poll_id = SRT_ERROR; + gboolean auto_reconnect; /* Only source element can read data */ g_return_val_if_fail (gst_uri_handler_get_uri_type (GST_URI_HANDLER @@ -1468,6 +1493,8 @@ poll_timeout = GST_SRT_DEFAULT_POLL_TIMEOUT; } + auto_reconnect = srtobject->auto_reconnect; + GST_OBJECT_UNLOCK (srtobject->element); if (connection_mode == GST_SRT_CONNECTION_MODE_LISTENER) { @@ -1523,6 +1550,13 @@ return 0; } + if (!auto_reconnect) { + g_set_error (error, GST_RESOURCE_ERROR, + GST_RESOURCE_ERROR_NOT_AUTHORIZED, + "Failed to authenticate: %" REASON_FORMAT, REASON_ARGS (reason)); + return -1; + } + GST_ELEMENT_WARNING (srtobject->element, RESOURCE, NOT_AUTHORIZED, ("Failed to authenticate: %" REASON_FORMAT ". Trying to reconnect", REASON_ARGS (reason)), (NULL)); @@ -1532,6 +1566,12 @@ return 0; } + if (!auto_reconnect) { + g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_READ, + "Error on SRT socket: %" REASON_FORMAT, REASON_ARGS (reason)); + return -1; + } + GST_ELEMENT_WARNING (srtobject->element, RESOURCE, READ, ("Error on SRT socket: %" REASON_FORMAT ". Trying to reconnect", REASON_ARGS (reason)), (NULL)); @@ -1735,10 +1775,12 @@ gint poll_timeout; const guint8 *msg = mapinfo->data; gint payload_size, optlen = sizeof (payload_size); - gboolean wait_for_connection; + gboolean wait_for_connection, auto_reconnect; GST_OBJECT_LOCK (srtobject->element); wait_for_connection = srtobject->wait_for_connection; + auto_reconnect = srtobject->auto_reconnect; + if (!gst_structure_get_int (srtobject->parameters, "poll-timeout", &poll_timeout)) { poll_timeout = GST_SRT_DEFAULT_POLL_TIMEOUT; @@ -1796,10 +1838,23 @@ gint reason = srt_getrejectreason (wsock); if (reason == SRT_REJ_BADSECRET || reason == SRT_REJ_UNSECURE) { + if (!auto_reconnect) { + g_set_error (error, GST_RESOURCE_ERROR, + GST_RESOURCE_ERROR_NOT_AUTHORIZED, + "Failed to authenticate: %" REASON_FORMAT, REASON_ARGS (reason)); + return -1; + } + GST_ELEMENT_WARNING (srtobject->element, RESOURCE, NOT_AUTHORIZED, ("Failed to authenticate: %" REASON_FORMAT ". Trying to reconnect", REASON_ARGS (reason)), (NULL)); } else { + if (!auto_reconnect) { + g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_WRITE, + "Error on SRT socket: %" REASON_FORMAT, REASON_ARGS (reason)); + return -1; + } + GST_ELEMENT_WARNING (srtobject->element, RESOURCE, WRITE, ("Error on SRT socket: %" REASON_FORMAT ". Trying to reconnect", REASON_ARGS (reason)), (NULL));
View file
gst-plugins-bad-1.20.5.tar.xz/ext/srt/gstsrtobject.h -> gst-plugins-bad-1.22.0.tar.xz/ext/srt/gstsrtobject.h
Changed
@@ -42,6 +42,7 @@ #define GST_SRT_DEFAULT_LATENCY 125 #define GST_SRT_DEFAULT_MSG_SIZE 1316 #define GST_SRT_DEFAULT_WAIT_FOR_CONNECTION (TRUE) +#define GST_SRT_DEFAULT_AUTO_RECONNECT (TRUE) typedef struct _GstSRTObject GstSRTObject; @@ -69,6 +70,7 @@ GList *callers; gboolean wait_for_connection; + gboolean auto_reconnect; gboolean authentication;
View file
gst-plugins-bad-1.20.5.tar.xz/ext/srt/gstsrtsrc.c -> gst-plugins-bad-1.22.0.tar.xz/ext/srt/gstsrtsrc.c
Changed
@@ -65,6 +65,11 @@ LAST_SIGNAL }; +enum +{ + PROP_KEEP_LISTENING = 128 +}; + static guint signalsLAST_SIGNAL = { 0 }; static void gst_srt_src_uri_handler_init (gpointer g_iface, @@ -110,10 +115,6 @@ GstSRTSrc *self = GST_SRT_SRC (bsrc); GError *error = NULL; gboolean ret = FALSE; - GstSRTConnectionMode connection_mode = GST_SRT_CONNECTION_MODE_NONE; - - gst_structure_get_enum (self->srtobject->parameters, "mode", - GST_TYPE_SRT_CONNECTION_MODE, (gint *) & connection_mode); ret = gst_srt_object_open (self->srtobject, self->cancellable, &error); @@ -155,6 +156,7 @@ int64_t srt_time; SRT_MSGCTRL mctrl; +retry: if (g_cancellable_is_cancelled (self->cancellable)) { ret = GST_FLOW_FLUSHING; } @@ -206,8 +208,17 @@ g_clear_error (&err); goto out; } else if (recv_len == 0) { - ret = GST_FLOW_EOS; - goto out; + gst_srt_src_stop (GST_BASE_SRC (self)); + if (self->keep_listening && gst_srt_src_start (GST_BASE_SRC (self))) { + /* FIXME: Should send GAP event(s) downstream */ + gst_element_post_message (GST_ELEMENT_CAST (self), + gst_message_new_element (GST_OBJECT_CAST (self), + gst_structure_new_empty ("connection-removed"))); + goto retry; + } else { + ret = GST_FLOW_EOS; + goto out; + } } /* Detect discontinuities */ @@ -315,7 +326,13 @@ if (!gst_srt_object_set_property_helper (self->srtobject, prop_id, value, pspec)) { - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + switch (prop_id) { + case PROP_KEEP_LISTENING: + self->keep_listening = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } } } @@ -327,7 +344,13 @@ if (!gst_srt_object_get_property_helper (self->srtobject, prop_id, value, pspec)) { - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + switch (prop_id) { + case PROP_KEEP_LISTENING: + g_value_set_boolean (value, self->keep_listening); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } } } @@ -426,6 +449,22 @@ gst_srt_object_install_properties_helper (gobject_class); + /** + * GstSRTSrc:keep-listening: + * + * If FALSE, the element will return GST_FLOW_EOS when the remote client disconnects. + * If TRUE, the element will keep waiting for the client to reconnect. An element + * message named 'connection-removed' will be sent on disconnection. + * + * Since: 1.22 + * + */ + g_object_class_install_property (gobject_class, PROP_KEEP_LISTENING, + g_param_spec_boolean ("keep-listening", + "Keep listening", + "Toggle keep-listening for connection reuse", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_element_class_add_static_pad_template (gstelement_class, &src_template); gst_element_class_set_metadata (gstelement_class, "SRT source", "Source/Network",
View file
gst-plugins-bad-1.20.5.tar.xz/ext/srt/gstsrtsrc.h -> gst-plugins-bad-1.22.0.tar.xz/ext/srt/gstsrtsrc.h
Changed
@@ -51,6 +51,7 @@ GCancellable *cancellable; guint32 next_pktseq; + gboolean keep_listening; }; struct _GstSRTSrcClass {
View file
gst-plugins-bad-1.20.5.tar.xz/ext/srt/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/srt/meson.build
Changed
@@ -34,6 +34,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstsrt, install_dir : plugins_pkgconfig_install_dir) plugins += gstsrt endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/srtp/gstsrtpdec.c -> gst-plugins-bad-1.22.0.tar.xz/ext/srtp/gstsrtpdec.c
Changed
@@ -229,6 +229,8 @@ GstSrtpCipherType rtcp_cipher; GstSrtpAuthType rtcp_auth; GArray *keys; + guint recv_count; + guint recv_drop_count; }; #ifdef HAVE_SRTP2 @@ -435,10 +437,11 @@ if (filter->session) { GHashTableIter iter; - gpointer key; + gpointer key, value; g_hash_table_iter_init (&iter, filter->streams); - while (g_hash_table_iter_next (&iter, &key, NULL)) { + while (g_hash_table_iter_next (&iter, &key, &value)) { + GstSrtpDecSsrcStream *stream = value; GstStructure *ss; guint32 ssrc = GPOINTER_TO_UINT (key); srtp_err_status_t status; @@ -450,7 +453,9 @@ } ss = gst_structure_new ("application/x-srtp-stream", - "ssrc", G_TYPE_UINT, ssrc, "roc", G_TYPE_UINT, roc, NULL); + "ssrc", G_TYPE_UINT, ssrc, "roc", G_TYPE_UINT, roc, "recv-count", + G_TYPE_UINT, stream->recv_count, "recv-drop-count", G_TYPE_UINT, + stream->recv_drop_count, NULL); g_value_take_boxed (&v, ss); gst_value_array_append_value (&va, &v); @@ -458,6 +463,11 @@ } gst_structure_take_value (s, "streams", &va); + gst_structure_set (s, "recv-count", G_TYPE_UINT, filter->recv_count, NULL); + gst_structure_set (s, "recv-drop-count", G_TYPE_UINT, + filter->recv_drop_count, NULL); + GST_LOG_OBJECT (filter, "stats: recv-count %u recv-drop-count %u", + filter->recv_count, filter->recv_drop_count); g_value_unset (&v); return s; @@ -1325,11 +1335,12 @@ GstMapInfo map; srtp_err_status_t err; gint size; + GstSrtpDecSsrcStream *stream; GST_LOG_OBJECT (pad, "Received %s buffer of size %" G_GSIZE_FORMAT " with SSRC = %u", is_rtcp ? "RTCP" : "RTP", gst_buffer_get_size (buf), ssrc); - + filter->recv_count++; /* Change buffer to remove protection */ buf = gst_buffer_make_writable (buf); @@ -1342,7 +1353,7 @@ if (is_rtcp) { #ifdef HAVE_SRTP2 - GstSrtpDecSsrcStream *stream = find_stream_by_ssrc (filter, ssrc); + stream = find_stream_by_ssrc (filter, ssrc); err = srtp_unprotect_rtcp_mki (filter->session, map.data, &size, stream && stream->keys); @@ -1381,7 +1392,7 @@ #ifdef HAVE_SRTP2 { - GstSrtpDecSsrcStream *stream = find_stream_by_ssrc (filter, ssrc); + stream = find_stream_by_ssrc (filter, ssrc); err = srtp_unprotect_mki (filter->session, map.data, &size, stream && stream->keys); @@ -1390,7 +1401,12 @@ err = srtp_unprotect (filter->session, map.data, &size); #endif } - + stream = find_stream_by_ssrc (filter, ssrc); + if (stream == NULL) { + GST_WARNING_OBJECT (filter, "Could not find matching stream, dropping"); + goto err; + } + stream->recv_count++; /* Signal user depending on type of error */ switch (err) { case srtp_err_status_ok: @@ -1399,20 +1415,14 @@ case srtp_err_status_replay_fail: GST_DEBUG_OBJECT (filter, "Dropping replayed packet, probably retransmission"); + stream->recv_drop_count++; goto err; case srtp_err_status_replay_old: GST_DEBUG_OBJECT (filter, "Dropping replayed old packet, probably retransmission"); + stream->recv_drop_count++; goto err; case srtp_err_status_key_expired:{ - GstSrtpDecSsrcStream *stream; - - /* Check we have an existing stream to rekey */ - stream = find_stream_by_ssrc (filter, ssrc); - if (stream == NULL) { - GST_WARNING_OBJECT (filter, "Could not find matching stream, dropping"); - goto err; - } GST_OBJECT_UNLOCK (filter); stream = request_key_with_signal (filter, ssrc, SIGNAL_HARD_LIMIT); @@ -1428,21 +1438,24 @@ } case srtp_err_status_auth_fail: GST_WARNING_OBJECT (filter, "Error authentication packet, dropping"); + stream->recv_drop_count++; goto err; case srtp_err_status_cipher_fail: GST_WARNING_OBJECT (filter, "Error while decrypting packet, dropping"); + stream->recv_drop_count++; goto err; default: GST_WARNING_OBJECT (pad, "Unable to unprotect buffer (unprotect failed code %d)", err); + stream->recv_drop_count++; goto err; } - gst_buffer_unmap (buf, &map); gst_buffer_set_size (buf, size); return TRUE; err: + filter->recv_drop_count++; gst_buffer_unmap (buf, &map); return FALSE; } @@ -1541,6 +1554,8 @@ filter->rtp_has_segment = FALSE; filter->rtcp_has_segment = FALSE; + filter->recv_count = 0; + filter->recv_drop_count = 0; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; @@ -1560,7 +1575,6 @@ gst_srtp_dec_clear_streams (filter); g_hash_table_unref (filter->streams); filter->streams = NULL; - #ifndef HAVE_SRTP2 g_hash_table_unref (filter->streams_roc_changed); filter->streams_roc_changed = NULL;
View file
gst-plugins-bad-1.20.5.tar.xz/ext/srtp/gstsrtpdec.h -> gst-plugins-bad-1.22.0.tar.xz/ext/srtp/gstsrtpdec.h
Changed
@@ -82,6 +82,8 @@ gboolean rtp_has_segment; gboolean rtcp_has_segment; + guint recv_count; + guint recv_drop_count; #ifndef HAVE_SRTP2 GHashTable *streams_roc_changed;
View file
gst-plugins-bad-1.20.5.tar.xz/ext/srtp/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/srtp/meson.build
Changed
@@ -8,6 +8,7 @@ srtp_cargs = if get_option('srtp').disabled() + srtp_dep = dependency('', required : false) subdir_done() endif @@ -39,6 +40,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstsrtp, install_dir : plugins_pkgconfig_install_dir) plugins += gstsrtp endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/svthevcenc/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/svthevcenc/meson.build
Changed
@@ -13,6 +13,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstsvthevcenc, install_dir : plugins_pkgconfig_install_dir) plugins += gstsvthevcenc endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/teletextdec/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/teletextdec/meson.build
Changed
@@ -10,6 +10,5 @@ install: true, install_dir: plugins_install_dir, ) - pkgconfig.generate(gstteletext, install_dir: plugins_pkgconfig_install_dir) plugins += gstteletext endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/ttml/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/ttml/meson.build
Changed
@@ -18,6 +18,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstttmlsubs, install_dir : plugins_pkgconfig_install_dir) plugins += gstttmlsubs endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/voaacenc/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/voaacenc/meson.build
Changed
@@ -12,6 +12,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstbz2, install_dir : plugins_pkgconfig_install_dir) plugins += gstbz2 endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/voamrwbenc/gstvoamrwbenc.c -> gst-plugins-bad-1.22.0.tar.xz/ext/voamrwbenc/gstvoamrwbenc.c
Changed
@@ -40,6 +40,8 @@ #include "gstvoamrwbenc.h" +#include <string.h> + #define MR660 0 #define MR885 1 #define MR1265 2 @@ -289,18 +291,22 @@ gst_buffer_map (buffer, &map, GST_MAP_READ); - if (G_UNLIKELY (map.size < buffer_size)) { - GST_DEBUG_OBJECT (amrwbenc, "discarding trailing data %d", (gint) map.size); - gst_buffer_unmap (buffer, &map); - ret = gst_audio_encoder_finish_frame (benc, NULL, -1); - goto done; - } - out = gst_buffer_new_and_alloc (buffer_size); gst_buffer_map (out, &omap, GST_MAP_WRITE); + /* encode */ - outsize = E_IF_encode (amrwbenc->handle, amrwbenc->bandmode, - (const short *) map.data, (unsigned char *) omap.data, 0); + if (G_UNLIKELY (map.size < buffer_size)) { + short input_bufferL_FRAME16k = { 0, }; + + GST_DEBUG_OBJECT (amrwbenc, "add silence to packet of size %d", + (gint) map.size); + memcpy ((void *) input_buffer, map.data, map.size); + outsize = E_IF_encode (amrwbenc->handle, amrwbenc->bandmode, + (const short *) input_buffer, (unsigned char *) omap.data, 0); + } else { + outsize = E_IF_encode (amrwbenc->handle, amrwbenc->bandmode, + (const short *) map.data, (unsigned char *) omap.data, 0); + } GST_LOG_OBJECT (amrwbenc, "encoded to %d bytes", outsize); gst_buffer_unmap (out, &omap);
View file
gst-plugins-bad-1.20.5.tar.xz/ext/voamrwbenc/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/voamrwbenc/meson.build
Changed
@@ -10,8 +10,10 @@ install: true, install_dir: plugins_install_dir, ) - pkgconfig.generate(gstvoamrwbenc, install_dir: plugins_pkgconfig_install_dir) plugins += gstvoamrwbenc install_data('GstVoAmrwbEnc.prs', install_dir: presetdir) + env = environment() + env.prepend('GST_PRESET_PATH', meson.current_source_dir()) + meson.add_devenv(env) endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/vulkan/gstvulkan.c -> gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/gstvulkan.c
Changed
@@ -33,10 +33,12 @@ #include "vkupload.h" #include "vkimageidentity.h" #include "vkcolorconvert.h" +#include "vkshaderspv.h" #include "vkdownload.h" #include "vkviewconvert.h" #include "vkdeviceprovider.h" #include "gstvulkanelements.h" +#include "vkoverlaycompositor.h" static gboolean @@ -56,8 +58,12 @@ ret |= GST_ELEMENT_REGISTER (vulkanimageidentity, plugin); + ret |= GST_ELEMENT_REGISTER (vulkanshaderspv, plugin); + ret |= GST_ELEMENT_REGISTER (vulkanviewconvert, plugin); + ret |= GST_ELEMENT_REGISTER (vulkanoverlaycompositor, plugin); + return ret; }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/vulkan/gstvulkanelements.h -> gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/gstvulkanelements.h
Changed
@@ -29,13 +29,4 @@ void vulkan_element_init (GstPlugin * plugin); -GST_ELEMENT_REGISTER_DECLARE (vulkancolorconvert); -GST_ELEMENT_REGISTER_DECLARE (vulkandownload); -GST_ELEMENT_REGISTER_DECLARE (vulkanimageidentity); -GST_ELEMENT_REGISTER_DECLARE (vulkansink); -GST_ELEMENT_REGISTER_DECLARE (vulkanupload); -GST_ELEMENT_REGISTER_DECLARE (vulkanviewconvert); -GST_DEVICE_PROVIDER_REGISTER_DECLARE (vulkandeviceprovider); - - #endif /* __GST_VULKAN_ELEMENTS_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/vulkan/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/meson.build
Changed
@@ -22,9 +22,11 @@ 'vkdownload.c', 'vkdeviceprovider.c', 'vkimageidentity.c', + 'vkshaderspv.c', 'vksink.c', 'vkupload.c', 'vkviewconvert.c', + 'vkoverlaycompositor.c', vulkan_plugin_enum_headers = @@ -45,9 +47,8 @@ objc_args : gst_plugins_bad_args, link_args : noseh_link_args, include_directories : configinc, - dependencies : gstvideo_dep, gstbase_dep, gstvulkan_dep, vulkan_dep, + dependencies : gstvideo_dep, gstbase_dep, gstvulkan_dep, vulkan_dep, gio_dep, install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstvulkan_plugin, install_dir : plugins_pkgconfig_install_dir) plugins += gstvulkan_plugin
View file
gst-plugins-bad-1.20.5.tar.xz/ext/vulkan/vkcolorconvert.h -> gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/vkcolorconvert.h
Changed
@@ -70,6 +70,8 @@ GType gst_vulkan_color_convert_get_type(void); +GST_ELEMENT_REGISTER_DECLARE (vulkancolorconvert); + G_END_DECLS #endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/vulkan/vkdeviceprovider.h -> gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/vkdeviceprovider.h
Changed
@@ -85,6 +85,8 @@ GType gst_vulkan_device_object_get_type (void); +GST_DEVICE_PROVIDER_REGISTER_DECLARE (vulkandeviceprovider); + G_END_DECLS #endif /* __GST_VULKAN_DEVICE_PROVIDER_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/vulkan/vkdownload.h -> gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/vkdownload.h
Changed
@@ -82,6 +82,8 @@ GType gst_vulkan_download_get_type(void); +GST_ELEMENT_REGISTER_DECLARE (vulkandownload); + G_END_DECLS #endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/vulkan/vkimageidentity.h -> gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/vkimageidentity.h
Changed
@@ -51,6 +51,8 @@ GType gst_vulkan_image_identity_get_type(void); +GST_ELEMENT_REGISTER_DECLARE (vulkanimageidentity); + G_END_DECLS #endif
View file
gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/vkoverlaycompositor.c
Added
@@ -0,0 +1,794 @@ +/* + * GStreamer + * Copyright (C) 2022 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-vulkanoverlaycompositor + * @title: vulkanoverlaycompositor + * + * `vulkanoverlaycompositor` overlays upstream `GstVideoOverlayCompositonMeta` + * onto the video stream. + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <string.h> + +#include "gstvulkanelements.h" +#include "vkoverlaycompositor.h" + +#include "shaders/identity.vert.h" +#include "shaders/swizzle.frag.h" + +GST_DEBUG_CATEGORY (gst_debug_vulkan_overlay_compositor); +#define GST_CAT_DEFAULT gst_debug_vulkan_overlay_compositor + +struct vk_overlay +{ + GstBuffer *buffer; + GstVideoOverlayComposition *composition; + GstVideoOverlayRectangle *rectangle; + GstVulkanFullScreenQuad *quad; +}; + +static void +vk_overlay_clear (struct vk_overlay *overlay) +{ + gst_clear_buffer (&overlay->buffer); + overlay->rectangle = NULL; + if (overlay->composition) + gst_video_overlay_composition_unref (overlay->composition); + overlay->composition = NULL; + + gst_clear_object (&overlay->quad); +} + +static void +vk_overlay_init (struct vk_overlay *overlay, GstVulkanQueue * queue, + GstBuffer * buffer, GstVideoOverlayComposition * comp, + GstVideoOverlayRectangle * rectangle, GstVulkanHandle * vert, + GstVulkanHandle * frag) +{ + GstVideoOverlayFormatFlags flags; + + memset (overlay, 0, sizeof (*overlay)); + + flags = gst_video_overlay_rectangle_get_flags (rectangle); + + overlay->buffer = gst_buffer_ref (buffer); + overlay->composition = gst_video_overlay_composition_ref (comp); + overlay->rectangle = rectangle; + overlay->quad = gst_vulkan_full_screen_quad_new (queue); + gst_vulkan_full_screen_quad_enable_clear (overlay->quad, FALSE); + gst_vulkan_full_screen_quad_set_shaders (overlay->quad, vert, frag); + gst_vulkan_full_screen_quad_enable_blend (overlay->quad, TRUE); + gst_vulkan_full_screen_quad_set_blend_operation (overlay->quad, + VK_BLEND_OP_ADD, VK_BLEND_OP_ADD); + if (flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA) { + gst_vulkan_full_screen_quad_set_blend_factors (overlay->quad, + VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, + VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA); + } else { + gst_vulkan_full_screen_quad_set_blend_factors (overlay->quad, + VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, + VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA); + } +} + +struct Vertex +{ + float x, y, z; + float s, t; +}; + +struct swizzle_uniforms +{ + int in_reorder_index4; + int out_reorder_index4; +}; + +static gboolean +vk_overlay_upload (struct vk_overlay *overlay, GstVideoInfo * out_info, + GError ** error) +{ + GstBuffer *overlay_buffer, *vk_gst_buffer = NULL; + GstVideoMeta *vmeta; + GstVideoInfo vinfo; + GstVideoFrame vframe; + GstVulkanBufferMemory *buf_mem; + GstVulkanImageMemory *img_mem; + GstMemory *vkbuffer = NULL, *vkimage = NULL, *vkvertices = NULL; + GstMemory *vkuniforms = NULL; + VkFormat vk_format; + GstMapInfo map_info; + GstVulkanFence *fence = NULL; + GstVulkanCommandBuffer *cmd_buf = NULL; + VkBufferMemoryBarrier buffer_memory_barrier; + VkImageMemoryBarrier image_memory_barrier; + VkBufferImageCopy region; + VkResult err; + struct Vertex vertices4; + struct swizzle_uniforms uniforms; + + overlay_buffer = + gst_video_overlay_rectangle_get_pixels_unscaled_argb + (overlay->rectangle, GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE); + + vmeta = gst_buffer_get_video_meta (overlay_buffer); + gst_video_info_set_format (&vinfo, vmeta->format, vmeta->width, + vmeta->height); + vinfo.stride0 = vmeta->stride0; + + if (!gst_vulkan_full_screen_quad_set_info (overlay->quad, out_info, out_info)) + goto error; + + if (!gst_video_frame_map (&vframe, &vinfo, overlay_buffer, GST_MAP_READ)) { + g_set_error_literal (error, GST_TYPE_RESOURCE_ERROR, + GST_RESOURCE_ERROR_READ, "Cannot map overlay buffer for reading"); + return FALSE; + } + + vkbuffer = + gst_vulkan_buffer_memory_alloc (overlay->quad->queue->device, + GST_VIDEO_INFO_COMP_STRIDE (&vinfo, 0) * + GST_VIDEO_INFO_COMP_HEIGHT (&vinfo, 0), + VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); + buf_mem = (GstVulkanBufferMemory *) vkbuffer; + + if (!gst_memory_map (vkbuffer, &map_info, GST_MAP_WRITE)) { + g_set_error_literal (error, GST_TYPE_RESOURCE_ERROR, + GST_RESOURCE_ERROR_WRITE, + "Cannot map staging vulkan buffer for writing"); + gst_video_frame_unmap (&vframe); + goto error; + } + + memcpy (map_info.data, vframe.data0, vframe.info.size); + + gst_memory_unmap (vkbuffer, &map_info); + gst_video_frame_unmap (&vframe); + + vk_format = gst_vulkan_format_from_video_info (&vinfo, 0); + vkimage = + gst_vulkan_image_memory_alloc (overlay->quad->queue->device, vk_format, + GST_VIDEO_INFO_COMP_WIDTH (&vinfo, 0), + GST_VIDEO_INFO_COMP_HEIGHT (&vinfo, 0), + VK_IMAGE_TILING_OPTIMAL, + VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | + VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + img_mem = (GstVulkanImageMemory *) vkimage; + + /* *INDENT-OFF* */ + region = (VkBufferImageCopy) { + .bufferOffset = 0, + .bufferRowLength = GST_VIDEO_INFO_COMP_WIDTH (&vinfo, 0), + .bufferImageHeight = GST_VIDEO_INFO_COMP_HEIGHT (&vinfo, 0), + .imageSubresource = { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .mipLevel = 0, + .baseArrayLayer = 0, + .layerCount = 1, + }, + .imageOffset = { .x = 0, .y = 0, .z = 0, }, + .imageExtent = { + .width = GST_VIDEO_INFO_COMP_WIDTH (&vinfo, 0), + .height = GST_VIDEO_INFO_COMP_HEIGHT (&vinfo, 0), + .depth = 1, + } + }; + + buffer_memory_barrier = (VkBufferMemoryBarrier) { + .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + .pNext = NULL, + .srcAccessMask = buf_mem->barrier.parent.access_flags, + .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT, + /* FIXME: implement exclusive transfers */ + .srcQueueFamilyIndex = 0, + .dstQueueFamilyIndex = 0, + .buffer = buf_mem->buffer, + .offset = region.bufferOffset, + .size = region.bufferRowLength * region.bufferImageHeight, + }; + + image_memory_barrier = (VkImageMemoryBarrier) { + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, + .pNext = NULL, + .srcAccessMask = img_mem->barrier.parent.access_flags, + .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, + .oldLayout = img_mem->barrier.image_layout, + .newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + /* FIXME: implement exclusive transfers */ + .srcQueueFamilyIndex = 0, + .dstQueueFamilyIndex = 0, + .image = img_mem->image, + .subresourceRange = img_mem->barrier.subresource_range, + }; + /* *INDENT-ON* */ + + if (!(cmd_buf = + gst_vulkan_command_pool_create (overlay->quad->cmd_pool, error))) + goto error; + + { + /* *INDENT-OFF* */ + VkCommandBufferBeginInfo cmd_buf_info = { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, + .pNext = NULL, + .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, + .pInheritanceInfo = NULL + }; + /* *INDENT-ON* */ + + gst_vulkan_command_buffer_lock (cmd_buf); + err = vkBeginCommandBuffer (cmd_buf->cmd, &cmd_buf_info); + if (gst_vulkan_error_to_g_error (err, error, "vkBeginCommandBuffer") < 0) { + gst_vulkan_command_buffer_unlock (cmd_buf); + goto error; + } + } + + vkCmdPipelineBarrier (cmd_buf->cmd, + buf_mem->barrier.parent.pipeline_stages | img_mem->barrier. + parent.pipeline_stages, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 1, + &buffer_memory_barrier, 1, &image_memory_barrier); + + buf_mem->barrier.parent.pipeline_stages = VK_PIPELINE_STAGE_TRANSFER_BIT; + buf_mem->barrier.parent.access_flags = buffer_memory_barrier.dstAccessMask; + + img_mem->barrier.parent.pipeline_stages = VK_PIPELINE_STAGE_TRANSFER_BIT; + img_mem->barrier.parent.access_flags = image_memory_barrier.dstAccessMask; + img_mem->barrier.image_layout = image_memory_barrier.newLayout; + + vkCmdCopyBufferToImage (cmd_buf->cmd, buf_mem->buffer, img_mem->image, + img_mem->barrier.image_layout, 1, ®ion); + + err = vkEndCommandBuffer (cmd_buf->cmd); + gst_vulkan_command_buffer_unlock (cmd_buf); + if (gst_vulkan_error_to_g_error (err, error, "vkEndCommandBuffer") < 0) { + goto error; + } + + { + VkSubmitInfo submit_info = { 0, }; + + /* *INDENT-OFF* */ + submit_info = (VkSubmitInfo) { + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, + .pNext = NULL, + .waitSemaphoreCount = 0, + .pWaitSemaphores = NULL, + .pWaitDstStageMask = NULL, + .commandBufferCount = 1, + .pCommandBuffers = &cmd_buf->cmd, + .signalSemaphoreCount = 0, + .pSignalSemaphores = NULL, + }; + /* *INDENT-ON* */ + + fence = + gst_vulkan_device_create_fence (overlay->quad->queue->device, error); + if (!fence) + goto error; + + gst_vulkan_queue_submit_lock (overlay->quad->queue); + err = + vkQueueSubmit (overlay->quad->queue->queue, 1, &submit_info, + GST_VULKAN_FENCE_FENCE (fence)); + gst_vulkan_queue_submit_unlock (overlay->quad->queue); + if (gst_vulkan_error_to_g_error (err, error, "vkQueueSubmit") < 0) + goto error; + + gst_vulkan_trash_list_add (overlay->quad->trash_list, + gst_vulkan_trash_list_acquire (overlay->quad->trash_list, fence, + gst_vulkan_trash_mini_object_unref, + GST_MINI_OBJECT_CAST (cmd_buf))); + cmd_buf = NULL; + gst_vulkan_trash_list_add (overlay->quad->trash_list, + gst_vulkan_trash_list_acquire (overlay->quad->trash_list, fence, + gst_vulkan_trash_mini_object_unref, + GST_MINI_OBJECT_CAST (vkbuffer))); + vkbuffer = NULL; + gst_vulkan_trash_list_add (overlay->quad->trash_list, + gst_vulkan_trash_list_acquire (overlay->quad->trash_list, fence, + gst_vulkan_trash_mini_object_unref, + GST_MINI_OBJECT_CAST (gst_memory_ref (vkimage)))); + gst_vulkan_trash_list_gc (overlay->quad->trash_list); + gst_vulkan_fence_unref (fence); + fence = NULL; + } + + vk_gst_buffer = gst_buffer_new (); + gst_buffer_append_memory (vk_gst_buffer, vkimage); + vkimage = NULL; + + if (!gst_vulkan_full_screen_quad_set_input_buffer (overlay->quad, + vk_gst_buffer, error)) + goto error; + + gst_clear_buffer (&vk_gst_buffer); + + { + int xpos, ypos; + guint width, height, out_width, out_height; + float xl, xr, yt, yb; + + if (!gst_video_overlay_rectangle_get_render_rectangle (overlay->rectangle, + &xpos, &ypos, &width, &height)) + goto error; + + out_width = GST_VIDEO_INFO_WIDTH (out_info); + out_height = GST_VIDEO_INFO_HEIGHT (out_info); + + xl = 2.0 * (float) xpos / (float) out_width - 1.0; + yt = 2.0 * (float) ypos / (float) out_height - 1.0; + xr = xl + 2.0 * (float) width / (float) out_width; + yb = yt + 2.0 * (float) height / (float) out_height; + + GST_LOG_OBJECT (overlay->quad, "rectangle %ux%u+%d,%d placed in %ux%u at " + "%fx%f+%f,%f", width, height, xpos, ypos, out_width, out_height, + xr - xl, yb - yt, xl, yt); + + /* top-left */ + vertices0.x = xl; + vertices0.y = yt; + vertices0.z = 0.0; + vertices0.s = 0.0; + vertices0.t = 0.0; + /* top-right */ + vertices1.x = xr; + vertices1.y = yt; + vertices1.z = 0.0; + vertices1.s = 1.0; + vertices1.t = 0.0; + /* bottom-right */ + vertices2.x = xr; + vertices2.y = yb; + vertices2.z = 0.0; + vertices2.s = 1.0; + vertices2.t = 1.0; + /* bottom-left */ + vertices3.x = xl; + vertices3.y = yb; + vertices3.z = 0.0; + vertices3.s = 0.0; + vertices3.t = 1.0; + } + + vkvertices = + gst_vulkan_buffer_memory_alloc (overlay->quad->queue->device, + sizeof (vertices), + VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + + if (!gst_memory_map (vkvertices, &map_info, GST_MAP_WRITE)) + goto error; + memcpy (map_info.data, vertices, sizeof (vertices)); + gst_memory_unmap (vkvertices, &map_info); + + if (!gst_vulkan_full_screen_quad_set_vertex_buffer (overlay->quad, + vkvertices, error)) + goto error; + + gst_clear_mini_object ((GstMiniObject **) & vkvertices); + + uniforms.in_reorder_index0 = 0; + uniforms.in_reorder_index1 = 1; + uniforms.in_reorder_index2 = 2; + uniforms.in_reorder_index3 = 3; + uniforms.out_reorder_index0 = 0; + uniforms.out_reorder_index1 = 1; + uniforms.out_reorder_index2 = 2; + uniforms.out_reorder_index3 = 3; + + vkuniforms = + gst_vulkan_buffer_memory_alloc (overlay->quad->queue->device, + sizeof (uniforms), + VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + + if (!gst_memory_map (vkuniforms, &map_info, GST_MAP_WRITE)) + goto error; + memcpy (map_info.data, &uniforms, sizeof (uniforms)); + gst_memory_unmap (vkuniforms, &map_info); + + if (!gst_vulkan_full_screen_quad_set_uniform_buffer (overlay->quad, + vkuniforms, error)) + goto error; + gst_clear_mini_object ((GstMiniObject **) & vkuniforms); + + return TRUE; + +error: + gst_clear_mini_object ((GstMiniObject **) & vkimage); + gst_clear_mini_object ((GstMiniObject **) & vkbuffer); + gst_clear_mini_object ((GstMiniObject **) & vkvertices); + gst_clear_mini_object ((GstMiniObject **) & vkuniforms); + if (cmd_buf) + gst_vulkan_command_buffer_unref (cmd_buf); + if (fence) + gst_vulkan_fence_unref (fence); + gst_clear_buffer (&vk_gst_buffer); + gst_clear_buffer (&overlay_buffer); + + return FALSE; +} + +static gboolean gst_vulkan_overlay_compositor_start (GstBaseTransform * bt); +static gboolean gst_vulkan_overlay_compositor_stop (GstBaseTransform * bt); +static GstCaps *gst_vulkan_overlay_compositor_transform_caps (GstBaseTransform * + bt, GstPadDirection direction, GstCaps * caps, GstCaps * filter); +static gboolean gst_vulkan_overlay_compositor_set_caps (GstBaseTransform * + bt, GstCaps * incaps, GstCaps * outcaps); +static GstFlowReturn +gst_vulkan_overlay_compositor_transform_ip (GstBaseTransform * bt, + GstBuffer * inbuf); + +#define IMAGE_FORMATS " { BGRA }" + +static GstStaticPadTemplate gst_vulkan_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES + (GST_CAPS_FEATURE_MEMORY_VULKAN_IMAGE "," + GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION, + IMAGE_FORMATS) "; " + GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_VULKAN_IMAGE, + IMAGE_FORMATS) "; " GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("ANY", + IMAGE_FORMATS))); + +static GstStaticPadTemplate gst_vulkan_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES + (GST_CAPS_FEATURE_MEMORY_VULKAN_IMAGE "," + GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION, + IMAGE_FORMATS) "; " + GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_VULKAN_IMAGE, + IMAGE_FORMATS) "; " GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("ANY", + IMAGE_FORMATS))); + +enum +{ + PROP_0, +}; + +typedef struct _GstVulkanOverlayCompositor GstVulkanOverlayCompositor; + +struct _GstVulkanOverlayCompositor +{ + GstVulkanVideoFilter parent; + + GstVulkanHandle *vert; + GstVulkanHandle *frag; + GArray *overlays; + + gboolean render_overlays; +}; + +#define gst_vulkan_overlay_compositor_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstVulkanOverlayCompositor, + gst_vulkan_overlay_compositor, GST_TYPE_VULKAN_VIDEO_FILTER, + GST_DEBUG_CATEGORY_INIT (gst_debug_vulkan_overlay_compositor, + "vulkanoverlaycompositor", 0, "Vulkan Overlay Compositor")); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (vulkanoverlaycompositor, + "vulkanoverlaycompositor", GST_RANK_NONE, + GST_TYPE_VULKAN_OVERLAY_COMPOSITOR, vulkan_element_init (plugin)); + +static void +gst_vulkan_overlay_compositor_class_init (GstVulkanOverlayCompositorClass * + klass) +{ + GstElementClass *gstelement_class; + GstBaseTransformClass *gstbasetransform_class; + + gstelement_class = (GstElementClass *) klass; + gstbasetransform_class = (GstBaseTransformClass *) klass; + + gst_element_class_set_metadata (gstelement_class, "Vulkan Overlay Compositor", + "Filter/Video", "Vulkan Overlay Composition element", + "Matthew Waters <matthew@centricular.com>"); + + gst_element_class_add_static_pad_template (gstelement_class, + &gst_vulkan_sink_template); + gst_element_class_add_static_pad_template (gstelement_class, + &gst_vulkan_src_template); + + gstbasetransform_class->start = + GST_DEBUG_FUNCPTR (gst_vulkan_overlay_compositor_start); + gstbasetransform_class->stop = + GST_DEBUG_FUNCPTR (gst_vulkan_overlay_compositor_stop); + gstbasetransform_class->transform_caps = + GST_DEBUG_FUNCPTR (gst_vulkan_overlay_compositor_transform_caps); + gstbasetransform_class->set_caps = + GST_DEBUG_FUNCPTR (gst_vulkan_overlay_compositor_set_caps); + gstbasetransform_class->transform_ip = + GST_DEBUG_FUNCPTR (gst_vulkan_overlay_compositor_transform_ip); +} + +static void +gst_vulkan_overlay_compositor_init (GstVulkanOverlayCompositor * vk_overlay) +{ +} + +static gboolean +gst_vulkan_overlay_compositor_start (GstBaseTransform * bt) +{ + GstVulkanOverlayCompositor *vk_overlay = GST_VULKAN_OVERLAY_COMPOSITOR (bt); + GstVulkanVideoFilter *vfilter = GST_VULKAN_VIDEO_FILTER (vk_overlay); + GError *error = NULL; + + if (!GST_BASE_TRANSFORM_CLASS (parent_class)->start (bt)) + return FALSE; + + if (!(vk_overlay->vert = + gst_vulkan_create_shader (vfilter->device, identity_vert, + identity_vert_size, &error))) + goto error; + if (!(vk_overlay->frag = + gst_vulkan_create_shader (vfilter->device, swizzle_frag, + swizzle_frag_size, &error))) { + gst_clear_vulkan_handle (&vk_overlay->vert); + goto error; + } + + vk_overlay->overlays = g_array_new (FALSE, TRUE, sizeof (struct vk_overlay)); + g_array_set_clear_func (vk_overlay->overlays, + (GDestroyNotify) vk_overlay_clear); + + return TRUE; + +error: + GST_ELEMENT_ERROR (bt, RESOURCE, NOT_FOUND, ("%s", error->message), (NULL)); + return FALSE; +} + +static gboolean +gst_vulkan_overlay_compositor_stop (GstBaseTransform * bt) +{ + GstVulkanOverlayCompositor *vk_overlay = GST_VULKAN_OVERLAY_COMPOSITOR (bt); + + if (vk_overlay->overlays) { + g_array_set_size (vk_overlay->overlays, 0); + g_array_unref (vk_overlay->overlays); + } + vk_overlay->overlays = NULL; + + gst_clear_vulkan_handle (&vk_overlay->vert); + gst_clear_vulkan_handle (&vk_overlay->frag); + + return GST_BASE_TRANSFORM_CLASS (parent_class)->stop (bt); +} + +static struct vk_overlay * +find_by_rectangle (GstVulkanOverlayCompositor * vk_overlay, + GstVideoOverlayRectangle * rectangle) +{ + int i; + + for (i = 0; i < vk_overlay->overlays->len; i++) { + struct vk_overlay *over = + &g_array_index (vk_overlay->overlays, struct vk_overlay, i); + + if (over->rectangle == rectangle) + return over; + } + + return NULL; +} + +static gboolean +overlay_in_rectangles (struct vk_overlay *over, + GstVideoOverlayComposition * composition) +{ + int i, n; + + n = gst_video_overlay_composition_n_rectangles (composition); + for (i = 0; i < n; i++) { + GstVideoOverlayRectangle *rect; + + rect = gst_video_overlay_composition_get_rectangle (composition, i); + + if (over->rectangle == rect) + return TRUE; + } + + return FALSE; +} + +static GstCaps * +gst_vulkan_overlay_compositor_transform_caps (GstBaseTransform * bt, + GstPadDirection direction, GstCaps * caps, GstCaps * filter) +{ + GstCaps *ret; + + /* add/remove the composition overlay meta as necessary */ + if (direction == GST_PAD_SRC) { + GstCaps *composition_caps; + int i; + + composition_caps = gst_caps_copy (caps); + + for (i = 0; i < gst_caps_get_size (composition_caps); i++) { + GstCapsFeatures *f = gst_caps_get_features (composition_caps, i); + if (!gst_caps_features_is_any (f)) + gst_caps_features_add (f, + GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION); + } + + ret = gst_caps_merge (composition_caps, gst_caps_copy (caps)); + } else { + guint i, n; + GstCaps *removed; + + ret = gst_caps_copy (caps); + removed = gst_caps_copy (caps); + n = gst_caps_get_size (removed); + for (i = 0; i < n; i++) { + GstCapsFeatures *feat = gst_caps_get_features (removed, i); + + if (feat && gst_caps_features_contains (feat, + GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION)) { + feat = gst_caps_features_copy (feat); + /* prefer the passthrough case */ + gst_caps_features_remove (feat, + GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION); + gst_caps_set_features (removed, i, feat); + } + } + + ret = gst_caps_merge (ret, removed); + } + + if (filter) { + GstCaps *tmp = gst_caps_intersect (ret, filter); + gst_clear_caps (&ret); + ret = tmp; + } + + return ret; +} + +static gboolean +gst_vulkan_overlay_compositor_set_caps (GstBaseTransform * bt, GstCaps * incaps, + GstCaps * outcaps) +{ + GstVulkanOverlayCompositor *vk_overlay = GST_VULKAN_OVERLAY_COMPOSITOR (bt); + GstCapsFeatures *in_features, *out_features; + + GST_DEBUG_OBJECT (bt, " incaps %" GST_PTR_FORMAT, incaps); + GST_DEBUG_OBJECT (bt, "outcaps %" GST_PTR_FORMAT, outcaps); + + if (!GST_BASE_TRANSFORM_CLASS (parent_class)->set_caps (bt, incaps, outcaps)) + return FALSE; + + in_features = gst_caps_get_features (incaps, 0); + out_features = gst_caps_get_features (outcaps, 0); + + if (gst_caps_features_contains (in_features, + GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION) && + !gst_caps_features_contains (out_features, + GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION)) { + GST_INFO_OBJECT (bt, "caps say to render GstVideoOverlayCompositionMeta"); + vk_overlay->render_overlays = TRUE; + } else { + GST_INFO_OBJECT (bt, + "caps say to not render GstVideoOverlayCompositionMeta"); + vk_overlay->render_overlays = FALSE; + } + + return TRUE; +} + +static GstFlowReturn +gst_vulkan_overlay_compositor_transform_ip (GstBaseTransform * bt, + GstBuffer * buffer) +{ + GstVulkanOverlayCompositor *vk_overlay = GST_VULKAN_OVERLAY_COMPOSITOR (bt); + GstVideoOverlayCompositionMeta *ometa; + GstVideoOverlayComposition *comp = NULL; + GError *error = NULL; + int i, n; + + if (!vk_overlay->render_overlays) { + GST_LOG_OBJECT (bt, + "caps don't say to render GstVideoOverlayCompositionMeta, passthrough"); + return GST_FLOW_OK; + } + + ometa = gst_buffer_get_video_overlay_composition_meta (buffer); + if (!ometa) { + GST_LOG_OBJECT (bt, + "no GstVideoOverlayCompositionMeta on buffer, passthrough"); + return GST_FLOW_OK; + } + + comp = gst_video_overlay_composition_ref (ometa->overlay); + gst_buffer_remove_meta (buffer, (GstMeta *) ometa); + + n = gst_video_overlay_composition_n_rectangles (comp); + if (n == 0) { + GST_LOG_OBJECT (bt, + "GstVideoOverlayCompositionMeta has 0 rectangles, passthrough"); + return GST_FLOW_OK; + } + + GST_LOG_OBJECT (bt, + "rendering GstVideoOverlayCompositionMeta with %u rectangles", n); + for (i = 0; i < n; i++) { + GstVideoOverlayRectangle *rectangle; + struct vk_overlay *over; + + rectangle = gst_video_overlay_composition_get_rectangle (comp, i); + + over = find_by_rectangle (vk_overlay, rectangle); + if (!over) { + struct vk_overlay new_overlay = { 0, }; + + vk_overlay_init (&new_overlay, vk_overlay->parent.queue, buffer, comp, + rectangle, vk_overlay->vert, vk_overlay->frag); + + if (!vk_overlay_upload (&new_overlay, &vk_overlay->parent.out_info, + &error)) + goto error; + + g_array_append_val (vk_overlay->overlays, new_overlay); + } + } + + n = vk_overlay->overlays->len; + for (i = 0; i < n;) { + struct vk_overlay *over = + &g_array_index (vk_overlay->overlays, struct vk_overlay, i); + + if (!overlay_in_rectangles (over, ometa->overlay)) { + g_array_remove_index (vk_overlay->overlays, i); + continue; + } + + if (!gst_vulkan_full_screen_quad_set_output_buffer (over->quad, buffer, + &error)) + goto error; + + if (!gst_vulkan_full_screen_quad_draw (over->quad, &error)) + goto error; + + i++; + } + + if (comp) + gst_video_overlay_composition_unref (comp); + + return GST_FLOW_OK; + +error: + GST_ELEMENT_ERROR (bt, LIBRARY, FAILED, ("%s", error->message), (NULL)); + g_clear_error (&error); + if (comp) + gst_video_overlay_composition_unref (comp); + return GST_FLOW_ERROR; +}
View file
gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/vkoverlaycompositor.h
Added
@@ -0,0 +1,36 @@ +/* + * GStreamer + * Copyright (C) 2022 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef _VK_OVERLAY_COMPOSITOR_H_ +#define _VK_OVERLAY_COMPOSITOR_H_ + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/vulkan/vulkan.h> + +G_BEGIN_DECLS + +#define GST_TYPE_VULKAN_OVERLAY_COMPOSITOR (gst_vulkan_overlay_compositor_get_type()) +G_DECLARE_FINAL_TYPE(GstVulkanOverlayCompositor, gst_vulkan_overlay_compositor, GST, VULKAN_OVERLAY_COMPOSITOR, GstVulkanVideoFilter); +GST_ELEMENT_REGISTER_DECLARE (vulkanoverlaycompositor); + +G_END_DECLS + +#endif
View file
gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/vkshaderspv.c
Added
@@ -0,0 +1,591 @@ +/* + * GStreamer + * Copyright (C) 2022 Martin Reboredo <yakoyoku@gmail.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-vulkanshaderspv + * @title: vulkanshaderspv + * + * Vulkan image shader filter. + * + * ## Examples + * ``` + * gst-launch-1.0 videotestsrc ! vulkanupload ! vulkanshader fragment-location="myshader.f.spv" ! vulkanimagesink + * ``` + * The following is a simple Vulkan passthrough shader with the required inputs. + * Compile it with `glslc --target-env=vulkan1.0 myshader.frag -o myshader.f.spv`. + * ``` glsl + * #version 450 + * + * layout(location = 0) in vec2 inTexCoord; + * + * layout(set = 0, binding = 0) uniform ShaderFilter { + * float time; + * float width; + * float height; + * }; + * layout(set = 0, binding = 1) uniform sampler2D inTexture; + * + * layout(location = 0) out vec4 outColor; + * + * void main () { + * outColor = texture (inTexture, inTexCoord); + * } + * ``` + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <string.h> + +#include <gio/gio.h> + +#include "gstvulkanelements.h" +#include "vkshaderspv.h" + +#include "shaders/identity.vert.h" +#include "shaders/identity.frag.h" + +GST_DEBUG_CATEGORY (gst_debug_vulkan_shader_spv); +#define GST_CAT_DEFAULT gst_debug_vulkan_shader_spv + +static void gst_vulkan_shader_spv_finalize (GObject * object); +static void gst_vulkan_shader_spv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_vulkan_shader_spv_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_vulkan_shader_spv_start (GstBaseTransform * bt); +static gboolean gst_vulkan_shader_spv_stop (GstBaseTransform * bt); + +static GstFlowReturn gst_vulkan_shader_spv_transform (GstBaseTransform * bt, + GstBuffer * inbuf, GstBuffer * outbuf); +static gboolean gst_vulkan_shader_spv_set_caps (GstBaseTransform * bt, + GstCaps * in_caps, GstCaps * out_caps); + +#define IMAGE_FORMATS " { BGRA }" + +static GstStaticPadTemplate gst_vulkan_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES + (GST_CAPS_FEATURE_MEMORY_VULKAN_IMAGE, + IMAGE_FORMATS))); + +static GstStaticPadTemplate gst_vulkan_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES + (GST_CAPS_FEATURE_MEMORY_VULKAN_IMAGE, + IMAGE_FORMATS))); + +enum +{ + PROP_0, + PROP_VERTEX, + PROP_FRAGMENT, + PROP_VERTEX_PATH, + PROP_FRAGMENT_PATH, +}; + +enum +{ + SIGNAL_0, + LAST_SIGNAL +}; + +/* static guint gst_vulkan_shader_spv_signalsLAST_SIGNAL = { 0 }; */ + +#define gst_vulkan_shader_spv_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstVulkanShaderSpv, gst_vulkan_shader_spv, + GST_TYPE_VULKAN_VIDEO_FILTER, + GST_DEBUG_CATEGORY_INIT (gst_debug_vulkan_shader_spv, + "vulkanshaderspv", 0, "Vulkan Image identity")); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (vulkanshaderspv, + "vulkanshaderspv", GST_RANK_NONE, GST_TYPE_VULKAN_SHADER_SPV, + vulkan_element_init (plugin)); + +static void +gst_vulkan_shader_spv_class_init (GstVulkanShaderSpvClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseTransformClass *gstbasetransform_class; + + gobject_class = G_OBJECT_CLASS (klass); + gstelement_class = GST_ELEMENT_CLASS (klass); + gstbasetransform_class = GST_BASE_TRANSFORM_CLASS (klass); + + gobject_class->finalize = gst_vulkan_shader_spv_finalize; + gobject_class->set_property = gst_vulkan_shader_spv_set_property; + gobject_class->get_property = gst_vulkan_shader_spv_get_property; + + g_object_class_install_property (gobject_class, PROP_VERTEX, + g_param_spec_boxed ("vertex", "Vertex Binary", + "SPIRV vertex binary", G_TYPE_BYTES, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_FRAGMENT, + g_param_spec_boxed ("fragment", "Fragment Binary", + "SPIRV fragment binary", G_TYPE_BYTES, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_VERTEX_PATH, + g_param_spec_string ("vertex-location", "Vertex Source", + "SPIRV vertex source", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_FRAGMENT_PATH, + g_param_spec_string ("fragment-location", "Fragment Source", + "SPIRV fragment source", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gst_element_class_set_metadata (gstelement_class, "Vulkan Shader SPV", + "Filter/Video", "Performs operations with SPIRV shaders in Vulkan", + "Martin Reboredo <yakoyoku@gmail.com>"); + + gst_element_class_add_static_pad_template (gstelement_class, + &gst_vulkan_sink_template); + gst_element_class_add_static_pad_template (gstelement_class, + &gst_vulkan_src_template); + + gstbasetransform_class->start = + GST_DEBUG_FUNCPTR (gst_vulkan_shader_spv_start); + gstbasetransform_class->stop = GST_DEBUG_FUNCPTR (gst_vulkan_shader_spv_stop); + gstbasetransform_class->set_caps = gst_vulkan_shader_spv_set_caps; + gstbasetransform_class->transform = gst_vulkan_shader_spv_transform; +} + +static void +gst_vulkan_shader_spv_init (GstVulkanShaderSpv * vk_shader) +{ + vk_shader->vert = g_bytes_new (NULL, 0); + vk_shader->frag = g_bytes_new (NULL, 0); +} + +static void +gst_vulkan_shader_spv_finalize (GObject * object) +{ + GstVulkanShaderSpv *filter = GST_VULKAN_SHADER_SPV (object); + + g_bytes_unref (filter->vert); + filter->vert = NULL; + + g_bytes_unref (filter->frag); + filter->frag = NULL; + + g_free (filter->vert_path); + filter->vert_path = NULL; + + g_free (filter->frag_path); + filter->frag_path = NULL; + + if (filter->uniforms) + gst_memory_unref (filter->uniforms); + filter->uniforms = NULL; + + G_OBJECT_CLASS (gst_vulkan_shader_spv_parent_class)->finalize (object); +} + +#define SPIRV_MAGIC_NUMBER_NE 0x07230203 +#define SPIRV_MAGIC_NUMBER_OE 0x03022307 + +static GBytes * +gst_vulkan_shader_spv_check_shader_binary (const GValue * value) +{ + GBytes *bytes = NULL; + gsize len; + const gchar *data; + gint32 first_word; + + bytes = g_value_dup_boxed (value); + if (!bytes) + return NULL; + data = g_bytes_get_data (bytes, &len); + if (len == 0 || len & 0x03) { + g_bytes_unref (bytes); + return NULL; + } + first_word = data0 | data1 << 8 | data2 << 16 | data3 << 24; + if (first_word != SPIRV_MAGIC_NUMBER_NE && + first_word != SPIRV_MAGIC_NUMBER_OE) { + g_bytes_unref (bytes); + return NULL; + } + return bytes; +} + +static void +gst_vulkan_shader_spv_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVulkanShaderSpv *filter = GST_VULKAN_SHADER_SPV (object); + GBytes *bytes = NULL; + + switch (prop_id) { + case PROP_VERTEX: + GST_OBJECT_LOCK (filter); + if (!(bytes = gst_vulkan_shader_spv_check_shader_binary (value))) + goto wrong_format; + g_bytes_unref (filter->vert); + filter->vert = bytes; + GST_OBJECT_UNLOCK (filter); + break; + case PROP_FRAGMENT: + GST_OBJECT_LOCK (filter); + if (!(bytes = gst_vulkan_shader_spv_check_shader_binary (value))) + goto wrong_format; + g_bytes_unref (filter->frag); + filter->frag = bytes; + GST_OBJECT_UNLOCK (filter); + break; + case PROP_VERTEX_PATH: + GST_OBJECT_LOCK (filter); + g_free (filter->vert_path); + filter->vert_path = g_value_dup_string (value); + GST_OBJECT_UNLOCK (filter); + break; + case PROP_FRAGMENT_PATH: + GST_OBJECT_LOCK (filter); + g_free (filter->frag_path); + filter->frag_path = g_value_dup_string (value); + GST_OBJECT_UNLOCK (filter); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + return; + +wrong_format: + { + g_critical ("Badly formatted byte sequence, must have a nonzero length" + " that is a multiple of four and start with the SPIRV magic number"); + GST_OBJECT_UNLOCK (filter); + return; + } +} + +static void +gst_vulkan_shader_spv_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstVulkanShaderSpv *filter = GST_VULKAN_SHADER_SPV (object); + + switch (prop_id) { + case PROP_VERTEX: + GST_OBJECT_LOCK (filter); + g_value_set_boxed (value, filter->vert); + GST_OBJECT_UNLOCK (filter); + break; + case PROP_FRAGMENT: + GST_OBJECT_LOCK (filter); + g_value_set_boxed (value, filter->frag); + GST_OBJECT_UNLOCK (filter); + break; + case PROP_VERTEX_PATH: + GST_OBJECT_LOCK (filter); + g_value_set_string (value, filter->vert_path); + GST_OBJECT_UNLOCK (filter); + break; + case PROP_FRAGMENT_PATH: + GST_OBJECT_LOCK (filter); + g_value_set_string (value, filter->frag_path); + GST_OBJECT_UNLOCK (filter); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_vulkan_shader_spv_set_caps (GstBaseTransform * bt, GstCaps * in_caps, + GstCaps * out_caps) +{ + GstVulkanVideoFilter *vfilter = GST_VULKAN_VIDEO_FILTER (bt); + GstVulkanShaderSpv *vk_identity = GST_VULKAN_SHADER_SPV (bt); + + if (!GST_BASE_TRANSFORM_CLASS (parent_class)->set_caps (bt, in_caps, + out_caps)) + return FALSE; + + if (!gst_vulkan_full_screen_quad_set_info (vk_identity->quad, + &vfilter->in_info, &vfilter->out_info)) + return FALSE; + + return TRUE; +} + +static GstVulkanHandle * +gst_vulkan_shader_spv_create_shader (GstVulkanShaderSpv * shader, + GBytes * binary, const char *path, const gchar * identity, + gsize identity_size, GError ** error) +{ + GstVulkanVideoFilter *vfilter = GST_VULKAN_VIDEO_FILTER (shader); + const gchar *data; + gsize len; + GstVulkanHandle *handle; + + data = g_bytes_get_data (binary, &len); + if (data) { + if (!(handle = + gst_vulkan_create_shader (vfilter->device, data, len, error))) + return NULL; + } else if (path) { + GFile *file; + GFileInfo *info; + GFileInputStream *istream; + GBytes *res; + const gchar *data; + gsize len = 35648; + + file = g_file_new_for_path (path); + if (!(istream = g_file_read (file, NULL, error))) { + g_object_unref (file); + return NULL; + } + if ((info = + g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_SIZE, + G_FILE_QUERY_INFO_NONE, NULL, NULL))) { + len = g_file_info_get_size (info); + g_object_unref (info); + } + if (!(res = + g_input_stream_read_bytes (G_INPUT_STREAM (istream), len, NULL, + error))) { + g_input_stream_close (G_INPUT_STREAM (istream), NULL, NULL); + g_object_unref (file); + return NULL; + } + data = g_bytes_get_data (res, &len); + if (!(handle = + gst_vulkan_create_shader (vfilter->device, data, len, error))) { + g_bytes_unref (res); + g_input_stream_close (G_INPUT_STREAM (istream), NULL, NULL); + g_object_unref (file); + return NULL; + } + g_bytes_unref (res); + g_input_stream_close (G_INPUT_STREAM (istream), NULL, NULL); + g_object_unref (file); + } else { + if (!(handle = gst_vulkan_create_shader (vfilter->device, identity, + identity_size, error))) + return NULL; + } + + return handle; +} + +static gboolean +gst_vulkan_shader_spv_start (GstBaseTransform * bt) +{ + GstVulkanShaderSpv *vk_shader = GST_VULKAN_SHADER_SPV (bt); + GstVulkanVideoFilter *vfilter = GST_VULKAN_VIDEO_FILTER (vk_shader); + GstVulkanHandle *vert, *frag; + GError *error = NULL; + + if (!GST_BASE_TRANSFORM_CLASS (parent_class)->start (bt)) + return FALSE; + + GST_OBJECT_LOCK (vfilter); + + vk_shader->quad = gst_vulkan_full_screen_quad_new (vfilter->queue); + + if (!(vert = gst_vulkan_shader_spv_create_shader (vk_shader, vk_shader->vert, + vk_shader->vert_path, identity_vert, identity_vert_size, + &error))) { + goto error; + } + + if (!(frag = gst_vulkan_shader_spv_create_shader (vk_shader, vk_shader->frag, + vk_shader->frag_path, identity_frag, identity_frag_size, + &error))) { + gst_vulkan_handle_unref (vert); + goto error; + } + + if (!gst_vulkan_full_screen_quad_set_shaders (vk_shader->quad, vert, frag)) { + gst_vulkan_handle_unref (vert); + gst_vulkan_handle_unref (frag); + g_set_error (&error, GST_VULKAN_WINDOW_ERROR, FALSE, + "Failed to set shaders in full screen quad"); + goto error; + } + + gst_vulkan_handle_unref (vert); + gst_vulkan_handle_unref (frag); + + GST_OBJECT_UNLOCK (vfilter); + + return TRUE; + +error: + GST_OBJECT_UNLOCK (vfilter); + if (error->domain == GST_VULKAN_ERROR) { + GST_ELEMENT_ERROR (bt, RESOURCE, NOT_FOUND, ("Failed to create shader: %s", + gst_vulkan_result_to_string (error->code)), (NULL)); + GST_DEBUG ("%s", error->message); + } else { + GST_ELEMENT_ERROR (bt, RESOURCE, NOT_FOUND, ("Failed to create shader: %s", + error->message), (NULL)); + } + return FALSE; +} + +static gboolean +gst_vulkan_shader_spv_stop (GstBaseTransform * bt) +{ + GstVulkanShaderSpv *vk_shader = GST_VULKAN_SHADER_SPV (bt); + + gst_clear_object (&vk_shader->quad); + + return GST_BASE_TRANSFORM_CLASS (parent_class)->stop (bt); +} + +struct ShaderUpdateData +{ + float time; + float width; + float height; +}; + +static inline gboolean +_gst_clock_time_to_double (GstClockTime time, gint64 * result) +{ + if (!GST_CLOCK_TIME_IS_VALID (time)) + return FALSE; + + *result = time; + + return TRUE; +} + +static inline gboolean +_gint64_time_val_to_double (gint64 time, gint64 * result) +{ + if (time == -1) + return FALSE; + + *result = time / GST_SECOND; + + return TRUE; +} + +static gboolean +shader_spv_update_time (GstVulkanShaderSpv * shader_spv, GstBuffer * inbuf) +{ + GstMapInfo map_info; + gint64 time = 0; + + if (!_gst_clock_time_to_double (GST_BUFFER_PTS (inbuf), &time)) { + if (!_gst_clock_time_to_double (GST_BUFFER_DTS (inbuf), &time)) + _gint64_time_val_to_double (g_get_monotonic_time (), &time); + } + + if (!gst_memory_map (shader_spv->uniforms, &map_info, GST_MAP_WRITE)) + return FALSE; + + ((struct ShaderUpdateData *) map_info.data)->time = (float) time / GST_SECOND; + gst_memory_unmap (shader_spv->uniforms, &map_info); + + return TRUE; +} + +static GstMemory * +shader_spv_create_uniform (GstVulkanShaderSpv * shader_spv) +{ + GstVulkanVideoFilter *vfilter = GST_VULKAN_VIDEO_FILTER (shader_spv); + + if (shader_spv->uniforms) { + return shader_spv->uniforms; + } else { + struct ShaderUpdateData data = { 0.0f, + GST_VIDEO_INFO_WIDTH (&shader_spv->quad->in_info), + GST_VIDEO_INFO_HEIGHT (&shader_spv->quad->in_info), + }; + GstMapInfo map_info; + GstMemory *uniforms; + + uniforms = + gst_vulkan_buffer_memory_alloc (vfilter->device, + sizeof (struct ShaderUpdateData), + VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + + if (!gst_memory_map (uniforms, &map_info, GST_MAP_WRITE)) + return NULL; + + memcpy (map_info.data, &data, sizeof (data)); + gst_memory_unmap (uniforms, &map_info); + + shader_spv->uniforms = uniforms; + return uniforms; + } +} + +static GstFlowReturn +gst_vulkan_shader_spv_transform (GstBaseTransform * bt, GstBuffer * inbuf, + GstBuffer * outbuf) +{ + GstVulkanShaderSpv *vk_shader = GST_VULKAN_SHADER_SPV (bt); + GError *error = NULL; + GstMemory *uniforms; + + if (!gst_vulkan_full_screen_quad_set_input_buffer (vk_shader->quad, inbuf, + &error)) + goto error; + if (!gst_vulkan_full_screen_quad_set_output_buffer (vk_shader->quad, outbuf, + &error)) + goto error; + + if (!(uniforms = shader_spv_create_uniform (vk_shader))) + goto error; + + shader_spv_update_time (vk_shader, inbuf); + if (!gst_vulkan_full_screen_quad_set_uniform_buffer (vk_shader->quad, + uniforms, &error)) + goto error; + + if (!gst_vulkan_full_screen_quad_draw (vk_shader->quad, &error)) + goto error; + + return GST_FLOW_OK; + +error: + if (error->domain == GST_VULKAN_ERROR) { + GST_ELEMENT_ERROR (bt, LIBRARY, FAILED, ("Failed to apply shader: %s", + gst_vulkan_result_to_string (error->code)), (NULL)); + GST_DEBUG ("%s", error->message); + } else { + GST_ELEMENT_ERROR (bt, LIBRARY, FAILED, ("Failed to apply shader: %s", + error->message), (NULL)); + } + g_clear_error (&error); + return GST_FLOW_ERROR; +}
View file
gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/vkshaderspv.h
Added
@@ -0,0 +1,65 @@ +/* + * GStreamer + * Copyright (C) 2021 Martin Reboredo <yakoyoku@gmail.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef _VK_SHADER_SPV_H_ +#define _VK_SHADER_SPV_H_ + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/vulkan/vulkan.h> + +G_BEGIN_DECLS + +#define GST_TYPE_VULKAN_SHADER_SPV (gst_vulkan_shader_spv_get_type()) +#define GST_VULKAN_SHADER_SPV(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VULKAN_SHADER_SPV,GstVulkanShaderSpv)) +#define GST_VULKAN_SHADER_SPV_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VULKAN_SHADER_SPV,GstVulkanShaderSpvClass)) +#define GST_IS_VULKAN_SHADER_SPV(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VULKAN_SHADER_SPV)) +#define GST_IS_VULKAN_SHADER_SPV_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VULKAN_SHADER_SPV)) + +typedef struct _GstVulkanShaderSpv GstVulkanShaderSpv; +typedef struct _GstVulkanShaderSpvClass GstVulkanShaderSpvClass; + +struct _GstVulkanShaderSpv +{ + GstVulkanVideoFilter filter; + + GBytes *vert; + GBytes *frag; + gchararray vert_path; + gchararray frag_path; + + GstVulkanFullScreenQuad *quad; + GstMemory *uniforms; + + gboolean period; +}; + +struct _GstVulkanShaderSpvClass +{ + GstVulkanVideoFilterClass parent_class; +}; + +GType gst_vulkan_shader_spv_get_type(void); + +GST_ELEMENT_REGISTER_DECLARE (vulkanshaderspv); + +G_END_DECLS + +#endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/vulkan/vksink.c -> gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/vksink.c
Changed
@@ -632,69 +632,91 @@ static void gst_vulkan_sink_navigation_send_event (GstNavigation * navigation, - GstStructure * structure) + GstEvent * event) { GstVulkanSink *vk_sink = GST_VULKAN_SINK (navigation); GstVideoRectangle display_rect; - GstEvent *event = NULL; + gboolean handled; gdouble x, y; if (!vk_sink->swapper || !vk_sink->swapper->window) { - gst_structure_free (structure); + gst_event_unref (event); return; } + event = gst_event_make_writable (event); + gst_vulkan_swapper_get_surface_rectangles (vk_sink->swapper, NULL, NULL, &display_rect); /* Converting pointer coordinates to the non scaled geometry */ if (display_rect.w != 0 && display_rect.h != 0 - && gst_structure_get_double (structure, "pointer_x", &x) - && gst_structure_get_double (structure, "pointer_y", &y)) { + && gst_navigation_event_get_coordinates (event, &x, &y)) { gdouble stream_x, stream_y; _display_size_to_stream_size (vk_sink, &display_rect, x, y, &stream_x, &stream_y); - - gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, - stream_x, "pointer_y", G_TYPE_DOUBLE, stream_y, NULL); + gst_navigation_event_set_coordinates (event, stream_x, stream_y); } - event = gst_event_new_navigation (structure); - if (event) { - gboolean handled; - - gst_event_ref (event); - handled = gst_pad_push_event (GST_VIDEO_SINK_PAD (vk_sink), event); + gst_event_ref (event); + handled = gst_pad_push_event (GST_VIDEO_SINK_PAD (vk_sink), event); - if (!handled) - gst_element_post_message ((GstElement *) vk_sink, - gst_navigation_message_new_event ((GstObject *) vk_sink, event)); + if (!handled) + gst_element_post_message ((GstElement *) vk_sink, + gst_navigation_message_new_event ((GstObject *) vk_sink, event)); - gst_event_unref (event); - } + gst_event_unref (event); } static void gst_vulkan_sink_navigation_interface_init (GstNavigationInterface * iface) { - iface->send_event = gst_vulkan_sink_navigation_send_event; + iface->send_event_simple = gst_vulkan_sink_navigation_send_event; } static void gst_vulkan_sink_key_event_cb (GstVulkanWindow * window, char *event_name, char *key_string, GstVulkanSink * vk_sink) { + GstEvent *event = NULL; + GST_DEBUG_OBJECT (vk_sink, "event %s key %s pressed", event_name, key_string); - gst_navigation_send_key_event (GST_NAVIGATION (vk_sink), - event_name, key_string); + /* FIXME: Add support for modifiers */ + if (0 == g_strcmp0 ("key-press", event_name)) + event = + gst_navigation_event_new_key_press (key_string, + GST_NAVIGATION_MODIFIER_NONE); + else if (0 == g_strcmp0 ("key-release", event_name)) + event = + gst_navigation_event_new_key_release (key_string, + GST_NAVIGATION_MODIFIER_NONE); + + if (event) + gst_navigation_send_event_simple (GST_NAVIGATION (vk_sink), event); } static void gst_vulkan_sink_mouse_event_cb (GstVulkanWindow * window, char *event_name, int button, double posx, double posy, GstVulkanSink * vk_sink) { + GstEvent *event = NULL; + + /* FIXME: Add support for modifiers */ GST_DEBUG_OBJECT (vk_sink, "event %s at %g, %g", event_name, posx, posy); - gst_navigation_send_mouse_event (GST_NAVIGATION (vk_sink), - event_name, button, posx, posy); + if (0 == g_strcmp0 ("mouse-button-press", event_name)) + event = + gst_navigation_event_new_mouse_button_press (button, posx, posy, + GST_NAVIGATION_MODIFIER_NONE); + else if (0 == g_strcmp0 ("mouse-button-release", event_name)) + event = + gst_navigation_event_new_mouse_button_release (button, posx, posy, + GST_NAVIGATION_MODIFIER_NONE); + else if (0 == g_strcmp0 ("mouse-move", event_name)) + event = + gst_navigation_event_new_mouse_move (posx, posy, + GST_NAVIGATION_MODIFIER_NONE); + + if (event) + gst_navigation_send_event_simple (GST_NAVIGATION (vk_sink), event); }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/vulkan/vksink.h -> gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/vksink.h
Changed
@@ -71,6 +71,8 @@ GType gst_vulkan_sink_get_type(void); +GST_ELEMENT_REGISTER_DECLARE (vulkansink); + G_END_DECLS #endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/vulkan/vkupload.h -> gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/vkupload.h
Changed
@@ -82,6 +82,8 @@ GType gst_vulkan_upload_get_type(void); +GST_ELEMENT_REGISTER_DECLARE (vulkanupload); + G_END_DECLS #endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/vulkan/vkviewconvert.h -> gst-plugins-bad-1.22.0.tar.xz/ext/vulkan/vkviewconvert.h
Changed
@@ -67,6 +67,8 @@ GType gst_vulkan_view_convert_get_type(void); +GST_ELEMENT_REGISTER_DECLARE (vulkanviewconvert); + G_END_DECLS #endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/gstwaylandsink.c -> gst-plugins-bad-1.22.0.tar.xz/ext/wayland/gstwaylandsink.c
Changed
@@ -43,12 +43,8 @@ #endif #include "gstwaylandsink.h" -#include "wlvideoformat.h" -#include "wlbuffer.h" -#include "wlshmallocator.h" -#include "wllinuxdmabuf.h" +#include <gst/allocators/allocators.h> -#include <gst/wayland/wayland.h> #include <gst/video/videooverlay.h> /* signals */ @@ -63,7 +59,9 @@ { PROP_0, PROP_DISPLAY, - PROP_FULLSCREEN + PROP_FULLSCREEN, + PROP_ROTATE_METHOD, + PROP_LAST }; GST_DEBUG_CATEGORY (gstwayland_debug); @@ -93,12 +91,13 @@ static void gst_wayland_sink_set_context (GstElement * element, GstContext * context); +static gboolean gst_wayland_sink_event (GstBaseSink * bsink, GstEvent * event); static GstCaps *gst_wayland_sink_get_caps (GstBaseSink * bsink, GstCaps * filter); static gboolean gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps); static gboolean gst_wayland_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query); -static GstFlowReturn gst_wayland_sink_show_frame (GstVideoSink * bsink, +static GstFlowReturn gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer); /* VideoOverlay interface */ @@ -110,60 +109,13 @@ gint x, gint y, gint w, gint h); static void gst_wayland_sink_expose (GstVideoOverlay * overlay); -/* WaylandVideo interface */ -static void gst_wayland_sink_waylandvideo_init (GstWaylandVideoInterface * - iface); -static void gst_wayland_sink_begin_geometry_change (GstWaylandVideo * video); -static void gst_wayland_sink_end_geometry_change (GstWaylandVideo * video); - #define gst_wayland_sink_parent_class parent_class G_DEFINE_TYPE_WITH_CODE (GstWaylandSink, gst_wayland_sink, GST_TYPE_VIDEO_SINK, G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_OVERLAY, - gst_wayland_sink_videooverlay_init) - G_IMPLEMENT_INTERFACE (GST_TYPE_WAYLAND_VIDEO, - gst_wayland_sink_waylandvideo_init)); + gst_wayland_sink_videooverlay_init)); GST_ELEMENT_REGISTER_DEFINE (waylandsink, "waylandsink", GST_RANK_MARGINAL, GST_TYPE_WAYLAND_SINK); -/* A tiny GstVideoBufferPool subclass that modify the options to remove - * VideoAlignment. To support VideoAlignment we would need to pass the padded - * width/height + stride and use the viewporter interface to crop, a bit like - * we use to do with XV. It would still be quite limited. It's a bit retro, - * hopefully there will be a better Wayland interface in the future. */ - -GType gst_wayland_pool_get_type (void); - -typedef struct -{ - GstVideoBufferPool parent; -} GstWaylandPool; - -typedef struct -{ - GstVideoBufferPoolClass parent; -} GstWaylandPoolClass; - -G_DEFINE_TYPE (GstWaylandPool, gst_wayland_pool, GST_TYPE_VIDEO_BUFFER_POOL); - -static const gchar ** -gst_wayland_pool_get_options (GstBufferPool * pool) -{ - static const gchar *options = { GST_BUFFER_POOL_OPTION_VIDEO_META, NULL }; - return options; -} - -static void -gst_wayland_pool_class_init (GstWaylandPoolClass * klass) -{ - GstBufferPoolClass *pool_class = GST_BUFFER_POOL_CLASS (klass); - pool_class->get_options = gst_wayland_pool_get_options; -} - -static void -gst_wayland_pool_init (GstWaylandPool * pool) -{ -} - static void gst_wayland_sink_class_init (GstWaylandSinkClass * klass) { @@ -194,6 +146,7 @@ gstelement_class->set_context = GST_DEBUG_FUNCPTR (gst_wayland_sink_set_context); + gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_wayland_sink_event); gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_wayland_sink_get_caps); gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_wayland_sink_set_caps); gstbasesink_class->propose_allocation = @@ -212,44 +165,106 @@ "Whether the surface should be made fullscreen ", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - gst_type_mark_as_plugin_api (GST_TYPE_WAYLAND_VIDEO, 0); + /** + * waylandsink:rotate-method: + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_ROTATE_METHOD, + g_param_spec_enum ("rotate-method", + "rotate method", + "rotate method", + GST_TYPE_VIDEO_ORIENTATION_METHOD, GST_VIDEO_ORIENTATION_IDENTITY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * waylandsink:render-rectangle: + * + * This helper installs the "render-rectangle" property into the + * class. + * + * Since: 1.22 + */ + gst_video_overlay_install_properties (gobject_class, PROP_LAST); } static void -gst_wayland_sink_init (GstWaylandSink * sink) +gst_wayland_sink_init (GstWaylandSink * self) { - g_mutex_init (&sink->display_lock); - g_mutex_init (&sink->render_lock); + g_mutex_init (&self->display_lock); + g_mutex_init (&self->render_lock); +} + +static void +gst_wayland_sink_set_fullscreen (GstWaylandSink * self, gboolean fullscreen) +{ + if (fullscreen == self->fullscreen) + return; + + g_mutex_lock (&self->render_lock); + self->fullscreen = fullscreen; + gst_wl_window_ensure_fullscreen (self->window, fullscreen); + g_mutex_unlock (&self->render_lock); } static void -gst_wayland_sink_set_fullscreen (GstWaylandSink * sink, gboolean fullscreen) +gst_wayland_sink_set_rotate_method (GstWaylandSink * self, + GstVideoOrientationMethod method, gboolean from_tag) { - if (fullscreen == sink->fullscreen) + GstVideoOrientationMethod new_method; + + if (method == GST_VIDEO_ORIENTATION_CUSTOM) { + GST_WARNING_OBJECT (self, "unsupported custom orientation"); return; + } + + GST_OBJECT_LOCK (self); + if (from_tag) + self->tag_rotate_method = method; + else + self->sink_rotate_method = method; + + if (self->sink_rotate_method == GST_VIDEO_ORIENTATION_AUTO) + new_method = self->tag_rotate_method; + else + new_method = self->sink_rotate_method; + + if (new_method != self->current_rotate_method) { + GST_DEBUG_OBJECT (self, "Changing method from %d to %d", + self->current_rotate_method, new_method); + + if (self->window) { + g_mutex_lock (&self->render_lock); + gst_wl_window_set_rotate_method (self->window, new_method); + g_mutex_unlock (&self->render_lock); + } - g_mutex_lock (&sink->render_lock); - sink->fullscreen = fullscreen; - gst_wl_window_ensure_fullscreen (sink->window, fullscreen); - g_mutex_unlock (&sink->render_lock); + self->current_rotate_method = new_method; + } + GST_OBJECT_UNLOCK (self); } static void gst_wayland_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { - GstWaylandSink *sink = GST_WAYLAND_SINK (object); + GstWaylandSink *self = GST_WAYLAND_SINK (object); switch (prop_id) { case PROP_DISPLAY: - GST_OBJECT_LOCK (sink); - g_value_set_string (value, sink->display_name); - GST_OBJECT_UNLOCK (sink); + GST_OBJECT_LOCK (self); + g_value_set_string (value, self->display_name); + GST_OBJECT_UNLOCK (self); break; case PROP_FULLSCREEN: - GST_OBJECT_LOCK (sink); - g_value_set_boolean (value, sink->fullscreen); - GST_OBJECT_UNLOCK (sink); + GST_OBJECT_LOCK (self); + g_value_set_boolean (value, self->fullscreen); + GST_OBJECT_UNLOCK (self); + break; + case PROP_ROTATE_METHOD: + GST_OBJECT_LOCK (self); + g_value_set_enum (value, self->current_rotate_method); + GST_OBJECT_UNLOCK (self); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -261,18 +276,22 @@ gst_wayland_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { - GstWaylandSink *sink = GST_WAYLAND_SINK (object); + GstWaylandSink *self = GST_WAYLAND_SINK (object); switch (prop_id) { case PROP_DISPLAY: - GST_OBJECT_LOCK (sink); - sink->display_name = g_value_dup_string (value); - GST_OBJECT_UNLOCK (sink); + GST_OBJECT_LOCK (self); + self->display_name = g_value_dup_string (value); + GST_OBJECT_UNLOCK (self); break; case PROP_FULLSCREEN: - GST_OBJECT_LOCK (sink); - gst_wayland_sink_set_fullscreen (sink, g_value_get_boolean (value)); - GST_OBJECT_UNLOCK (sink); + GST_OBJECT_LOCK (self); + gst_wayland_sink_set_fullscreen (self, g_value_get_boolean (value)); + GST_OBJECT_UNLOCK (self); + break; + case PROP_ROTATE_METHOD: + gst_wayland_sink_set_rotate_method (self, g_value_get_enum (value), + FALSE); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -283,40 +302,40 @@ static void gst_wayland_sink_finalize (GObject * object) { - GstWaylandSink *sink = GST_WAYLAND_SINK (object); + GstWaylandSink *self = GST_WAYLAND_SINK (object); - GST_DEBUG_OBJECT (sink, "Finalizing the sink.."); + GST_DEBUG_OBJECT (self, "Finalizing the sink.."); - if (sink->last_buffer) - gst_buffer_unref (sink->last_buffer); - if (sink->display) - g_object_unref (sink->display); - if (sink->window) - g_object_unref (sink->window); - if (sink->pool) - gst_object_unref (sink->pool); + if (self->last_buffer) + gst_buffer_unref (self->last_buffer); + if (self->display) + g_object_unref (self->display); + if (self->window) + g_object_unref (self->window); + if (self->pool) + gst_object_unref (self->pool); - g_free (sink->display_name); + g_free (self->display_name); - g_mutex_clear (&sink->display_lock); - g_mutex_clear (&sink->render_lock); + g_mutex_clear (&self->display_lock); + g_mutex_clear (&self->render_lock); G_OBJECT_CLASS (parent_class)->finalize (object); } /* must be called with the display_lock */ static void -gst_wayland_sink_set_display_from_context (GstWaylandSink * sink, +gst_wayland_sink_set_display_from_context (GstWaylandSink * self, GstContext * context) { struct wl_display *display; GError *error = NULL; - display = gst_wayland_display_handle_context_get_handle (context); - sink->display = gst_wl_display_new_existing (display, FALSE, &error); + display = gst_wl_display_handle_context_get_handle (context); + self->display = gst_wl_display_new_existing (display, FALSE, &error); if (error) { - GST_ELEMENT_WARNING (sink, RESOURCE, OPEN_READ_WRITE, + GST_ELEMENT_WARNING (self, RESOURCE, OPEN_READ_WRITE, ("Could not set display handle"), ("Failed to use the external wayland display: '%s'", error->message)); g_error_free (error); @@ -324,7 +343,7 @@ } static gboolean -gst_wayland_sink_find_display (GstWaylandSink * sink) +gst_wayland_sink_find_display (GstWaylandSink * self) { GstQuery *query; GstMessage *msg; @@ -332,36 +351,36 @@ GError *error = NULL; gboolean ret = TRUE; - g_mutex_lock (&sink->display_lock); + g_mutex_lock (&self->display_lock); - if (!sink->display) { + if (!self->display) { /* first query upstream for the needed display handle */ - query = gst_query_new_context (GST_WAYLAND_DISPLAY_HANDLE_CONTEXT_TYPE); - if (gst_pad_peer_query (GST_VIDEO_SINK_PAD (sink), query)) { + query = gst_query_new_context (GST_WL_DISPLAY_HANDLE_CONTEXT_TYPE); + if (gst_pad_peer_query (GST_VIDEO_SINK_PAD (self), query)) { gst_query_parse_context (query, &context); - gst_wayland_sink_set_display_from_context (sink, context); + gst_wayland_sink_set_display_from_context (self, context); } gst_query_unref (query); - if (G_LIKELY (!sink->display)) { + if (G_LIKELY (!self->display)) { /* now ask the application to set the display handle */ - msg = gst_message_new_need_context (GST_OBJECT_CAST (sink), - GST_WAYLAND_DISPLAY_HANDLE_CONTEXT_TYPE); + msg = gst_message_new_need_context (GST_OBJECT_CAST (self), + GST_WL_DISPLAY_HANDLE_CONTEXT_TYPE); - g_mutex_unlock (&sink->display_lock); - gst_element_post_message (GST_ELEMENT_CAST (sink), msg); + g_mutex_unlock (&self->display_lock); + gst_element_post_message (GST_ELEMENT_CAST (self), msg); /* at this point we expect gst_wayland_sink_set_context - * to get called and fill sink->display */ - g_mutex_lock (&sink->display_lock); + * to get called and fill self->display */ + g_mutex_lock (&self->display_lock); - if (!sink->display) { + if (!self->display) { /* if the application didn't set a display, let's create it ourselves */ - GST_OBJECT_LOCK (sink); - sink->display = gst_wl_display_new (sink->display_name, &error); - GST_OBJECT_UNLOCK (sink); + GST_OBJECT_LOCK (self); + self->display = gst_wl_display_new (self->display_name, &error); + GST_OBJECT_UNLOCK (self); if (error) { - GST_ELEMENT_WARNING (sink, RESOURCE, OPEN_READ_WRITE, + GST_ELEMENT_WARNING (self, RESOURCE, OPEN_READ_WRITE, ("Could not initialise Wayland output"), ("Failed to create GstWlDisplay: '%s'", error->message)); g_error_free (error); @@ -371,7 +390,7 @@ } } - g_mutex_unlock (&sink->display_lock); + g_mutex_unlock (&self->display_lock); return ret; } @@ -379,12 +398,12 @@ static GstStateChangeReturn gst_wayland_sink_change_state (GstElement * element, GstStateChange transition) { - GstWaylandSink *sink = GST_WAYLAND_SINK (element); + GstWaylandSink *self = GST_WAYLAND_SINK (element); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: - if (!gst_wayland_sink_find_display (sink)) + if (!gst_wayland_sink_find_display (self)) return GST_STATE_CHANGE_FAILURE; break; default: @@ -397,26 +416,26 @@ switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: - gst_buffer_replace (&sink->last_buffer, NULL); - if (sink->window) { - if (gst_wl_window_is_toplevel (sink->window)) { - g_clear_object (&sink->window); + gst_buffer_replace (&self->last_buffer, NULL); + if (self->window) { + if (gst_wl_window_is_toplevel (self->window)) { + g_clear_object (&self->window); } else { /* remove buffer from surface, show nothing */ - gst_wl_window_render (sink->window, NULL, NULL); + gst_wl_window_render (self->window, NULL, NULL); } } - g_mutex_lock (&sink->render_lock); - if (sink->callback) { - wl_callback_destroy (sink->callback); - sink->callback = NULL; + g_mutex_lock (&self->render_lock); + if (self->callback) { + wl_callback_destroy (self->callback); + self->callback = NULL; } - sink->redraw_pending = FALSE; - g_mutex_unlock (&sink->render_lock); + self->redraw_pending = FALSE; + g_mutex_unlock (&self->render_lock); break; case GST_STATE_CHANGE_READY_TO_NULL: - g_mutex_lock (&sink->display_lock); + g_mutex_lock (&self->display_lock); /* If we had a toplevel window, we most likely have our own connection * to the display too, and it is a good idea to disconnect and allow * potentially the application to embed us with GstVideoOverlay @@ -427,11 +446,11 @@ * to avoid requesting them again from the application if/when we are * restarted (GstVideoOverlay behaves like that in other sinks) */ - if (sink->display && !sink->window) /* -> the window was toplevel */ - g_clear_object (&sink->display); + if (self->display && !self->window) /* -> the window was toplevel */ + g_clear_object (&self->display); - g_mutex_unlock (&sink->display_lock); - g_clear_object (&sink->pool); + g_mutex_unlock (&self->display_lock); + g_clear_object (&self->pool); break; default: break; @@ -443,39 +462,65 @@ static void gst_wayland_sink_set_context (GstElement * element, GstContext * context) { - GstWaylandSink *sink = GST_WAYLAND_SINK (element); + GstWaylandSink *self = GST_WAYLAND_SINK (element); if (gst_context_has_context_type (context, - GST_WAYLAND_DISPLAY_HANDLE_CONTEXT_TYPE)) { - g_mutex_lock (&sink->display_lock); - if (G_LIKELY (!sink->display)) { - gst_wayland_sink_set_display_from_context (sink, context); + GST_WL_DISPLAY_HANDLE_CONTEXT_TYPE)) { + g_mutex_lock (&self->display_lock); + if (G_LIKELY (!self->display)) { + gst_wayland_sink_set_display_from_context (self, context); } else { GST_WARNING_OBJECT (element, "changing display handle is not supported"); - g_mutex_unlock (&sink->display_lock); + g_mutex_unlock (&self->display_lock); return; } - g_mutex_unlock (&sink->display_lock); + g_mutex_unlock (&self->display_lock); } if (GST_ELEMENT_CLASS (parent_class)->set_context) GST_ELEMENT_CLASS (parent_class)->set_context (element, context); } +static gboolean +gst_wayland_sink_event (GstBaseSink * bsink, GstEvent * event) +{ + GstWaylandSink *self = GST_WAYLAND_SINK (bsink); + GstTagList *taglist; + GstVideoOrientationMethod method; + gboolean ret; + + GST_DEBUG_OBJECT (self, "handling %s event", GST_EVENT_TYPE_NAME (event)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_TAG: + gst_event_parse_tag (event, &taglist); + + if (gst_video_orientation_from_tag (taglist, &method)) { + gst_wayland_sink_set_rotate_method (self, method, TRUE); + } + + break; + default: + break; + } + + ret = GST_BASE_SINK_CLASS (parent_class)->event (bsink, event); + + return ret; +} + static GstCaps * gst_wayland_sink_get_caps (GstBaseSink * bsink, GstCaps * filter) { - GstWaylandSink *sink; + GstWaylandSink *self = GST_WAYLAND_SINK (bsink);; GstCaps *caps; - sink = GST_WAYLAND_SINK (bsink); - - caps = gst_pad_get_pad_template_caps (GST_VIDEO_SINK_PAD (sink)); + caps = gst_pad_get_pad_template_caps (GST_VIDEO_SINK_PAD (self)); caps = gst_caps_make_writable (caps); - g_mutex_lock (&sink->display_lock); + g_mutex_lock (&self->display_lock); - if (sink->display) { + if (self->display) { GValue shm_list = G_VALUE_INIT, dmabuf_list = G_VALUE_INIT; GValue value = G_VALUE_INIT; GArray *formats; @@ -487,7 +532,7 @@ g_value_init (&dmabuf_list, GST_TYPE_LIST); /* Add corresponding shm formats */ - formats = sink->display->shm_formats; + formats = gst_wl_display_get_shm_formats (self->display); for (i = 0; i < formats->len; i++) { fmt = g_array_index (formats, uint32_t, i); gfmt = gst_wl_shm_format_to_video_format (fmt); @@ -502,7 +547,7 @@ &shm_list); /* Add corresponding dmabuf formats */ - formats = sink->display->dmabuf_formats; + formats = gst_wl_display_get_dmabuf_formats (self->display); for (i = 0; i < formats->len; i++) { fmt = g_array_index (formats, uint32_t, i); gfmt = gst_wl_dmabuf_format_to_video_format (fmt); @@ -516,10 +561,10 @@ gst_structure_take_value (gst_caps_get_structure (caps, 1), "format", &dmabuf_list); - GST_DEBUG_OBJECT (sink, "display caps: %" GST_PTR_FORMAT, caps); + GST_DEBUG_OBJECT (self, "display caps: %" GST_PTR_FORMAT, caps); } - g_mutex_unlock (&sink->display_lock); + g_mutex_unlock (&self->display_lock); if (filter) { GstCaps *intersection; @@ -534,14 +579,14 @@ } static GstBufferPool * -gst_wayland_create_pool (GstWaylandSink * sink, GstCaps * caps) +gst_wayland_create_pool (GstWaylandSink * self, GstCaps * caps) { GstBufferPool *pool = NULL; GstStructure *structure; - gsize size = sink->video_info.size; + gsize size = self->video_info.size; GstAllocator *alloc; - pool = g_object_new (gst_wayland_pool_get_type (), NULL); + pool = gst_wl_video_buffer_pool_new (); structure = gst_buffer_pool_get_config (pool); gst_buffer_pool_config_set_params (structure, caps, size, 2, 0); @@ -560,50 +605,48 @@ static gboolean gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps) { - GstWaylandSink *sink; + GstWaylandSink *self = GST_WAYLAND_SINK (bsink);; gboolean use_dmabuf; GstVideoFormat format; - sink = GST_WAYLAND_SINK (bsink); - - GST_DEBUG_OBJECT (sink, "set caps %" GST_PTR_FORMAT, caps); + GST_DEBUG_OBJECT (self, "set caps %" GST_PTR_FORMAT, caps); /* extract info from caps */ - if (!gst_video_info_from_caps (&sink->video_info, caps)) + if (!gst_video_info_from_caps (&self->video_info, caps)) goto invalid_format; - format = GST_VIDEO_INFO_FORMAT (&sink->video_info); - sink->video_info_changed = TRUE; + format = GST_VIDEO_INFO_FORMAT (&self->video_info); + self->video_info_changed = TRUE; /* create a new pool for the new caps */ - if (sink->pool) - gst_object_unref (sink->pool); - sink->pool = gst_wayland_create_pool (sink, caps); + if (self->pool) + gst_object_unref (self->pool); + self->pool = gst_wayland_create_pool (self, caps); use_dmabuf = gst_caps_features_contains (gst_caps_get_features (caps, 0), GST_CAPS_FEATURE_MEMORY_DMABUF); /* validate the format base on the memory type. */ if (use_dmabuf) { - if (!gst_wl_display_check_format_for_dmabuf (sink->display, format)) + if (!gst_wl_display_check_format_for_dmabuf (self->display, format)) goto unsupported_format; - } else if (!gst_wl_display_check_format_for_shm (sink->display, format)) { + } else if (!gst_wl_display_check_format_for_shm (self->display, format)) { goto unsupported_format; } - sink->use_dmabuf = use_dmabuf; + self->use_dmabuf = use_dmabuf; return TRUE; invalid_format: { - GST_ERROR_OBJECT (sink, + GST_ERROR_OBJECT (self, "Could not locate image format from caps %" GST_PTR_FORMAT, caps); return FALSE; } unsupported_format: { - GST_ERROR_OBJECT (sink, "Format %s is not available on the display", + GST_ERROR_OBJECT (self, "Format %s is not available on the display", gst_video_format_to_string (format)); return FALSE; } @@ -612,7 +655,7 @@ static gboolean gst_wayland_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query) { - GstWaylandSink *sink = GST_WAYLAND_SINK (bsink); + GstWaylandSink *self = GST_WAYLAND_SINK (bsink); GstCaps *caps; GstBufferPool *pool = NULL; gboolean need_pool; @@ -621,9 +664,9 @@ gst_query_parse_allocation (query, &caps, &need_pool); if (need_pool) - pool = gst_wayland_create_pool (sink, caps); + pool = gst_wayland_create_pool (self, caps); - gst_query_add_allocation_pool (query, pool, sink->video_info.size, 2, 0); + gst_query_add_allocation_pool (query, pool, self->video_info.size, 2, 0); if (pool) g_object_unref (pool); @@ -638,18 +681,18 @@ static void frame_redraw_callback (void *data, struct wl_callback *callback, uint32_t time) { - GstWaylandSink *sink = data; + GstWaylandSink *self = data; - GST_LOG ("frame_redraw_cb"); + GST_LOG_OBJECT (self, "frame_redraw_cb"); - g_mutex_lock (&sink->render_lock); - sink->redraw_pending = FALSE; + g_mutex_lock (&self->render_lock); + self->redraw_pending = FALSE; - if (sink->callback) { + if (self->callback) { wl_callback_destroy (callback); - sink->callback = NULL; + self->callback = NULL; } - g_mutex_unlock (&sink->render_lock); + g_mutex_unlock (&self->render_lock); } static const struct wl_callback_listener frame_callback_listener = { @@ -658,42 +701,42 @@ /* must be called with the render lock */ static void -render_last_buffer (GstWaylandSink * sink, gboolean redraw) +render_last_buffer (GstWaylandSink * self, gboolean redraw) { GstWlBuffer *wlbuffer; const GstVideoInfo *info = NULL; struct wl_surface *surface; struct wl_callback *callback; - wlbuffer = gst_buffer_get_wl_buffer (sink->display, sink->last_buffer); - surface = gst_wl_window_get_wl_surface (sink->window); + wlbuffer = gst_buffer_get_wl_buffer (self->display, self->last_buffer); + surface = gst_wl_window_get_wl_surface (self->window); - sink->redraw_pending = TRUE; + self->redraw_pending = TRUE; callback = wl_surface_frame (surface); - sink->callback = callback; - wl_callback_add_listener (callback, &frame_callback_listener, sink); + self->callback = callback; + wl_callback_add_listener (callback, &frame_callback_listener, self); - if (G_UNLIKELY (sink->video_info_changed && !redraw)) { - info = &sink->video_info; - sink->video_info_changed = FALSE; + if (G_UNLIKELY (self->video_info_changed && !redraw)) { + info = &self->video_info; + self->video_info_changed = FALSE; } - gst_wl_window_render (sink->window, wlbuffer, info); + gst_wl_window_render (self->window, wlbuffer, info); } static void on_window_closed (GstWlWindow * window, gpointer user_data) { - GstWaylandSink *sink = GST_WAYLAND_SINK (user_data); + GstWaylandSink *self = GST_WAYLAND_SINK (user_data); /* Handle window closure by posting an error on the bus */ - GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, + GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, ("Output window was closed"), (NULL)); } static GstFlowReturn gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer) { - GstWaylandSink *sink = GST_WAYLAND_SINK (vsink); + GstWaylandSink *self = GST_WAYLAND_SINK (vsink); GstBuffer *to_render; GstWlBuffer *wlbuffer; GstVideoMeta *vmeta; @@ -704,40 +747,45 @@ GstFlowReturn ret = GST_FLOW_OK; - g_mutex_lock (&sink->render_lock); + g_mutex_lock (&self->render_lock); - GST_LOG_OBJECT (sink, "render buffer %p", buffer); + GST_LOG_OBJECT (self, "render buffer %" GST_PTR_FORMAT "", buffer); - if (G_UNLIKELY (!sink->window)) { + if (G_UNLIKELY (!self->window)) { /* ask for window handle. Unlock render_lock while doing that because * set_window_handle & friends will lock it in this context */ - g_mutex_unlock (&sink->render_lock); - gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (sink)); - g_mutex_lock (&sink->render_lock); + g_mutex_unlock (&self->render_lock); + gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (self)); + g_mutex_lock (&self->render_lock); - if (!sink->window) { + if (!self->window) { /* if we were not provided a window, create one ourselves */ - sink->window = gst_wl_window_new_toplevel (sink->display, - &sink->video_info, sink->fullscreen, &sink->render_lock); - g_signal_connect_object (sink->window, "closed", - G_CALLBACK (on_window_closed), sink, 0); + self->window = gst_wl_window_new_toplevel (self->display, + &self->video_info, self->fullscreen, &self->render_lock); + g_signal_connect_object (self->window, "closed", + G_CALLBACK (on_window_closed), self, 0); + gst_wl_window_set_rotate_method (self->window, + self->current_rotate_method); } } /* drop buffers until we get a frame callback */ - if (sink->redraw_pending) { - GST_LOG_OBJECT (sink, "buffer %p dropped (redraw pending)", buffer); + if (self->redraw_pending) { + GST_LOG_OBJECT (self, "buffer %" GST_PTR_FORMAT " dropped (redraw pending)", + buffer); goto done; } /* make sure that the application has called set_render_rectangle() */ - if (G_UNLIKELY (sink->window->render_rectangle.w == 0)) + if (G_UNLIKELY (gst_wl_window_get_render_rectangle (self->window)->w == 0)) goto no_window_size; - wlbuffer = gst_buffer_get_wl_buffer (sink->display, buffer); + wlbuffer = gst_buffer_get_wl_buffer (self->display, buffer); - if (G_LIKELY (wlbuffer && wlbuffer->display == sink->display)) { - GST_LOG_OBJECT (sink, "buffer %p has a wl_buffer from our display, " + if (G_LIKELY (wlbuffer && + gst_wl_buffer_get_display (wlbuffer) == self->display)) { + GST_LOG_OBJECT (self, + "buffer %" GST_PTR_FORMAT " has a wl_buffer from our display, " "writing directly", buffer); to_render = buffer; goto render; @@ -746,23 +794,24 @@ /* update video info from video meta */ mem = gst_buffer_peek_memory (buffer, 0); - old_vinfo = sink->video_info; + old_vinfo = self->video_info; vmeta = gst_buffer_get_video_meta (buffer); if (vmeta) { gint i; for (i = 0; i < vmeta->n_planes; i++) { - sink->video_info.offseti = vmeta->offseti; - sink->video_info.stridei = vmeta->stridei; + self->video_info.offseti = vmeta->offseti; + self->video_info.stridei = vmeta->stridei; } - sink->video_info.size = gst_buffer_get_size (buffer); + self->video_info.size = gst_buffer_get_size (buffer); } - GST_LOG_OBJECT (sink, "buffer %p does not have a wl_buffer from our " + GST_LOG_OBJECT (self, + "buffer %" GST_PTR_FORMAT " does not have a wl_buffer from our " "display, creating it", buffer); - format = GST_VIDEO_INFO_FORMAT (&sink->video_info); - if (gst_wl_display_check_format_for_dmabuf (sink->display, format)) { + format = GST_VIDEO_INFO_FORMAT (&self->video_info); + if (gst_wl_display_check_format_for_dmabuf (self->display, format)) { guint i, nb_dmabuf = 0; for (i = 0; i < gst_buffer_n_memory (buffer); i++) @@ -770,69 +819,70 @@ nb_dmabuf++; if (nb_dmabuf && (nb_dmabuf == gst_buffer_n_memory (buffer))) - wbuf = gst_wl_linux_dmabuf_construct_wl_buffer (buffer, sink->display, - &sink->video_info); + wbuf = gst_wl_linux_dmabuf_construct_wl_buffer (buffer, self->display, + &self->video_info); } - if (!wbuf && gst_wl_display_check_format_for_shm (sink->display, format)) { + if (!wbuf && gst_wl_display_check_format_for_shm (self->display, format)) { if (gst_buffer_n_memory (buffer) == 1 && gst_is_fd_memory (mem)) - wbuf = gst_wl_shm_memory_construct_wl_buffer (mem, sink->display, - &sink->video_info); + wbuf = gst_wl_shm_memory_construct_wl_buffer (mem, self->display, + &self->video_info); /* If nothing worked, copy into our internal pool */ if (!wbuf) { GstVideoFrame src, dst; - GstVideoInfo src_info = sink->video_info; + GstVideoInfo src_info = self->video_info; /* rollback video info changes */ - sink->video_info = old_vinfo; + self->video_info = old_vinfo; /* we don't know how to create a wl_buffer directly from the provided * memory, so we have to copy the data to shm memory that we know how * to handle... */ - GST_LOG_OBJECT (sink, "buffer %p cannot have a wl_buffer, " + GST_LOG_OBJECT (self, + "buffer %" GST_PTR_FORMAT " cannot have a wl_buffer, " "copying to wl_shm memory", buffer); - /* sink->pool always exists (created in set_caps), but it may not + /* self->pool always exists (created in set_caps), but it may not * be active if upstream is not using it */ - if (!gst_buffer_pool_is_active (sink->pool)) { + if (!gst_buffer_pool_is_active (self->pool)) { GstStructure *config; GstCaps *caps; - config = gst_buffer_pool_get_config (sink->pool); + config = gst_buffer_pool_get_config (self->pool); gst_buffer_pool_config_get_params (config, &caps, NULL, NULL, NULL); /* revert back to default strides and offsets */ - gst_video_info_from_caps (&sink->video_info, caps); - gst_buffer_pool_config_set_params (config, caps, sink->video_info.size, + gst_video_info_from_caps (&self->video_info, caps); + gst_buffer_pool_config_set_params (config, caps, self->video_info.size, 2, 0); /* This is a video pool, it should not fail with basic settings */ - if (!gst_buffer_pool_set_config (sink->pool, config) || - !gst_buffer_pool_set_active (sink->pool, TRUE)) + if (!gst_buffer_pool_set_config (self->pool, config) || + !gst_buffer_pool_set_active (self->pool, TRUE)) goto activate_failed; } - ret = gst_buffer_pool_acquire_buffer (sink->pool, &to_render, NULL); + ret = gst_buffer_pool_acquire_buffer (self->pool, &to_render, NULL); if (ret != GST_FLOW_OK) goto no_buffer; - wlbuffer = gst_buffer_get_wl_buffer (sink->display, to_render); + wlbuffer = gst_buffer_get_wl_buffer (self->display, to_render); /* attach a wl_buffer if there isn't one yet */ if (G_UNLIKELY (!wlbuffer)) { mem = gst_buffer_peek_memory (to_render, 0); - wbuf = gst_wl_shm_memory_construct_wl_buffer (mem, sink->display, - &sink->video_info); + wbuf = gst_wl_shm_memory_construct_wl_buffer (mem, self->display, + &self->video_info); if (G_UNLIKELY (!wbuf)) goto no_wl_buffer_shm; - wlbuffer = gst_buffer_add_wl_buffer (to_render, wbuf, sink->display); + wlbuffer = gst_buffer_add_wl_buffer (to_render, wbuf, self->display); } - if (!gst_video_frame_map (&dst, &sink->video_info, to_render, + if (!gst_video_frame_map (&dst, &self->video_info, to_render, GST_MAP_WRITE)) goto dst_map_failed; @@ -853,19 +903,19 @@ if (!wbuf) goto no_wl_buffer; - wlbuffer = gst_buffer_add_wl_buffer (buffer, wbuf, sink->display); + wlbuffer = gst_buffer_add_wl_buffer (buffer, wbuf, self->display); to_render = buffer; render: /* drop double rendering */ if (G_UNLIKELY (wlbuffer == - gst_buffer_get_wl_buffer (sink->display, sink->last_buffer))) { - GST_LOG_OBJECT (sink, "Buffer already being rendered"); + gst_buffer_get_wl_buffer (self->display, self->last_buffer))) { + GST_LOG_OBJECT (self, "Buffer already being rendered"); goto done; } - gst_buffer_replace (&sink->last_buffer, to_render); - render_last_buffer (sink, FALSE); + gst_buffer_replace (&self->last_buffer, to_render); + render_last_buffer (self, FALSE); if (buffer != to_render) gst_buffer_unref (to_render); @@ -873,7 +923,7 @@ no_window_size: { - GST_ELEMENT_ERROR (sink, RESOURCE, WRITE, + GST_ELEMENT_ERROR (self, RESOURCE, WRITE, ("Window has no size set"), ("Make sure you set the size after calling set_window_handle")); ret = GST_FLOW_ERROR; @@ -881,44 +931,45 @@ } no_buffer: { - GST_WARNING_OBJECT (sink, "could not create buffer"); + GST_WARNING_OBJECT (self, "could not create buffer"); goto done; } no_wl_buffer_shm: { - GST_ERROR_OBJECT (sink, "could not create wl_buffer out of wl_shm memory"); + GST_ERROR_OBJECT (self, "could not create wl_buffer out of wl_shm memory"); ret = GST_FLOW_ERROR; goto done; } no_wl_buffer: { - GST_ERROR_OBJECT (sink, "buffer %p cannot have a wl_buffer", buffer); + GST_ERROR_OBJECT (self, + "buffer %" GST_PTR_FORMAT " cannot have a wl_buffer", buffer); ret = GST_FLOW_ERROR; goto done; } activate_failed: { - GST_ERROR_OBJECT (sink, "failed to activate bufferpool."); + GST_ERROR_OBJECT (self, "failed to activate bufferpool."); ret = GST_FLOW_ERROR; goto done; } src_map_failed: { - GST_ELEMENT_ERROR (sink, RESOURCE, READ, + GST_ELEMENT_ERROR (self, RESOURCE, READ, ("Video memory can not be read from userspace."), (NULL)); ret = GST_FLOW_ERROR; goto done; } dst_map_failed: { - GST_ELEMENT_ERROR (sink, RESOURCE, WRITE, + GST_ELEMENT_ERROR (self, RESOURCE, WRITE, ("Video memory can not be written from userspace."), (NULL)); ret = GST_FLOW_ERROR; goto done; } done: { - g_mutex_unlock (&sink->render_lock); + g_mutex_unlock (&self->render_lock); return ret; } } @@ -934,126 +985,85 @@ static void gst_wayland_sink_set_window_handle (GstVideoOverlay * overlay, guintptr handle) { - GstWaylandSink *sink = GST_WAYLAND_SINK (overlay); + GstWaylandSink *self = GST_WAYLAND_SINK (overlay); struct wl_surface *surface = (struct wl_surface *) handle; - g_return_if_fail (sink != NULL); + g_return_if_fail (self != NULL); - if (sink->window != NULL) { - GST_WARNING_OBJECT (sink, "changing window handle is not supported"); + if (self->window != NULL) { + GST_WARNING_OBJECT (self, "changing window handle is not supported"); return; } - g_mutex_lock (&sink->render_lock); + g_mutex_lock (&self->render_lock); - GST_DEBUG_OBJECT (sink, "Setting window handle %" GST_PTR_FORMAT, + GST_DEBUG_OBJECT (self, "Setting window handle %" GST_PTR_FORMAT, (void *) handle); - g_clear_object (&sink->window); + g_clear_object (&self->window); if (handle) { - if (G_LIKELY (gst_wayland_sink_find_display (sink))) { + if (G_LIKELY (gst_wayland_sink_find_display (self))) { /* we cannot use our own display with an external window handle */ - if (G_UNLIKELY (sink->display->own_display)) { - GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_READ_WRITE, + if (G_UNLIKELY (gst_wl_display_has_own_display (self->display))) { + GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ_WRITE, ("Application did not provide a wayland display handle"), ("waylandsink cannot use an externally-supplied surface without " "an externally-supplied display handle. Consider providing a " "display handle from your application with GstContext")); } else { - sink->window = gst_wl_window_new_in_surface (sink->display, surface, - &sink->render_lock); + self->window = gst_wl_window_new_in_surface (self->display, surface, + &self->render_lock); + gst_wl_window_set_rotate_method (self->window, + self->current_rotate_method); } } else { - GST_ERROR_OBJECT (sink, "Failed to find display handle, " + GST_ERROR_OBJECT (self, "Failed to find display handle, " "ignoring window handle"); } } - g_mutex_unlock (&sink->render_lock); + g_mutex_unlock (&self->render_lock); } static void gst_wayland_sink_set_render_rectangle (GstVideoOverlay * overlay, gint x, gint y, gint w, gint h) { - GstWaylandSink *sink = GST_WAYLAND_SINK (overlay); + GstWaylandSink *self = GST_WAYLAND_SINK (overlay); - g_return_if_fail (sink != NULL); + g_return_if_fail (self != NULL); - g_mutex_lock (&sink->render_lock); - if (!sink->window) { - g_mutex_unlock (&sink->render_lock); - GST_WARNING_OBJECT (sink, + g_mutex_lock (&self->render_lock); + if (!self->window) { + g_mutex_unlock (&self->render_lock); + GST_WARNING_OBJECT (self, "set_render_rectangle called without window, ignoring"); return; } - GST_DEBUG_OBJECT (sink, "window geometry changed to (%d, %d) %d x %d", + GST_DEBUG_OBJECT (self, "window geometry changed to (%d, %d) %d x %d", x, y, w, h); - gst_wl_window_set_render_rectangle (sink->window, x, y, w, h); + gst_wl_window_set_render_rectangle (self->window, x, y, w, h); - g_mutex_unlock (&sink->render_lock); + g_mutex_unlock (&self->render_lock); } static void gst_wayland_sink_expose (GstVideoOverlay * overlay) { - GstWaylandSink *sink = GST_WAYLAND_SINK (overlay); - - g_return_if_fail (sink != NULL); - - GST_DEBUG_OBJECT (sink, "expose"); - - g_mutex_lock (&sink->render_lock); - if (sink->last_buffer && !sink->redraw_pending) { - GST_DEBUG_OBJECT (sink, "redrawing last buffer"); - render_last_buffer (sink, TRUE); - } - g_mutex_unlock (&sink->render_lock); -} - -static void -gst_wayland_sink_waylandvideo_init (GstWaylandVideoInterface * iface) -{ - iface->begin_geometry_change = gst_wayland_sink_begin_geometry_change; - iface->end_geometry_change = gst_wayland_sink_end_geometry_change; -} + GstWaylandSink *self = GST_WAYLAND_SINK (overlay); -static void -gst_wayland_sink_begin_geometry_change (GstWaylandVideo * video) -{ - GstWaylandSink *sink = GST_WAYLAND_SINK (video); - g_return_if_fail (sink != NULL); - - g_mutex_lock (&sink->render_lock); - if (!sink->window || !sink->window->area_subsurface) { - g_mutex_unlock (&sink->render_lock); - GST_INFO_OBJECT (sink, - "begin_geometry_change called without window, ignoring"); - return; - } + g_return_if_fail (self != NULL); - wl_subsurface_set_sync (sink->window->area_subsurface); - g_mutex_unlock (&sink->render_lock); -} + GST_DEBUG_OBJECT (self, "expose"); -static void -gst_wayland_sink_end_geometry_change (GstWaylandVideo * video) -{ - GstWaylandSink *sink = GST_WAYLAND_SINK (video); - g_return_if_fail (sink != NULL); - - g_mutex_lock (&sink->render_lock); - if (!sink->window || !sink->window->area_subsurface) { - g_mutex_unlock (&sink->render_lock); - GST_INFO_OBJECT (sink, - "end_geometry_change called without window, ignoring"); - return; + g_mutex_lock (&self->render_lock); + if (self->last_buffer && !self->redraw_pending) { + GST_DEBUG_OBJECT (self, "redrawing last buffer"); + render_last_buffer (self, TRUE); } - - wl_subsurface_set_desync (sink->window->area_subsurface); - g_mutex_unlock (&sink->render_lock); + g_mutex_unlock (&self->render_lock); } static gboolean @@ -1062,8 +1072,6 @@ GST_DEBUG_CATEGORY_INIT (gstwayland_debug, "waylandsink", 0, " wayland video sink"); - gst_wl_shm_allocator_register (); - return GST_ELEMENT_REGISTER (waylandsink, plugin); }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/gstwaylandsink.h -> gst-plugins-bad-1.22.0.tar.xz/ext/wayland/gstwaylandsink.h
Changed
@@ -19,16 +19,11 @@ * Boston, MA 02110-1301 USA. */ -#ifndef __GST_WAYLAND_VIDEO_SINK_H__ -#define __GST_WAYLAND_VIDEO_SINK_H__ +#pragma once #include <gst/gst.h> #include <gst/video/video.h> - -#include <wayland-client.h> - -#include "wldisplay.h" -#include "wlwindow.h" +#include <gst/wayland/wayland.h> G_BEGIN_DECLS @@ -68,6 +63,10 @@ GMutex render_lock; GstBuffer *last_buffer; + GstVideoOrientationMethod sink_rotate_method; + GstVideoOrientationMethod tag_rotate_method; + GstVideoOrientationMethod current_rotate_method; + struct wl_callback *callback; }; @@ -81,5 +80,3 @@ GST_ELEMENT_REGISTER_DECLARE (waylandsink); G_END_DECLS - -#endif /* __GST_WAYLAND_VIDEO_SINK_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wayland/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/wayland/meson.build
Changed
@@ -1,51 +1,16 @@ wl_sources = - 'gstwaylandsink.c', - 'wlshmallocator.c', - 'wlbuffer.c', - 'wldisplay.c', - 'wlwindow.c', - 'wlvideoformat.c', - 'wllinuxdmabuf.c' + 'gstwaylandsink.c' -libdrm_dep = dependency('libdrm', version: '>= 2.4.55', required:get_option('wayland')) - if use_wayland - protocols_datadir = wl_protocol_dep.get_variable('pkgdatadir') - - protocol_defs = - '/stable/viewporter/viewporter.xml', 'viewporter-protocol.c', 'viewporter-client-protocol.h', - '/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml', - 'linux-dmabuf-unstable-v1-protocol.c', 'linux-dmabuf-unstable-v1-client-protocol.h', - '/unstable/fullscreen-shell/fullscreen-shell-unstable-v1.xml', - 'fullscreen-shell-unstable-v1-protocol.c', 'fullscreen-shell-unstable-v1-client-protocol.h', - '/stable/xdg-shell/xdg-shell.xml', 'xdg-shell-protocol.c', 'xdg-shell-client-protocol.h', - - protocols_files = - - foreach protodef: protocol_defs - xmlfile = protocols_datadir + protodef.get(0) - - protocols_files += custom_target(protodef.get(1), - output : protodef.get(1), - input : xmlfile, - command : wl_scanner, 'code', '@INPUT@', '@OUTPUT@') - - protocols_files += custom_target(protodef.get(2), - output : protodef.get(2), - input : xmlfile, - command : wl_scanner, 'client-header', '@INPUT@', '@OUTPUT@') - endforeach gstwaylandsink = library('gstwaylandsink', - wl_sources + protocols_files, + wl_sources, c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', include_directories : configinc, - dependencies : gst_dep, gstvideo_dep, gstwayland_dep, gstallocators_dep, - wl_client_dep, wl_protocol_dep, libdrm_dep, + dependencies : gst_dep, gstvideo_dep, gstwayland_dep, install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstwaylandsink, install_dir : plugins_pkgconfig_install_dir) plugins += gstwaylandsink endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webp/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/webp/meson.build
Changed
@@ -15,6 +15,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstwebp, install_dir : plugins_pkgconfig_install_dir) plugins += gstwebp endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/fwd.h -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/fwd.h
Changed
@@ -29,18 +29,6 @@ typedef struct _GstWebRTCBinClass GstWebRTCBinClass; typedef struct _GstWebRTCBinPrivate GstWebRTCBinPrivate; -typedef struct _GstWebRTCICE GstWebRTCICE; -typedef struct _GstWebRTCICEClass GstWebRTCICEClass; -typedef struct _GstWebRTCICEPrivate GstWebRTCICEPrivate; - -typedef struct _GstWebRTCICEStream GstWebRTCICEStream; -typedef struct _GstWebRTCICEStreamClass GstWebRTCICEStreamClass; -typedef struct _GstWebRTCICEStreamPrivate GstWebRTCICEStreamPrivate; - -typedef struct _GstWebRTCNiceTransport GstWebRTCNiceTransport; -typedef struct _GstWebRTCNiceTransportClass GstWebRTCNiceTransportClass; -typedef struct _GstWebRTCNiceTransportPrivate GstWebRTCNiceTransportPrivate; - typedef struct _GstWebRTCSCTPTransport GstWebRTCSCTPTransport; typedef struct _GstWebRTCSCTPTransportClass GstWebRTCSCTPTransportClass; typedef struct _GstWebRTCSCTPTransportPrivate GstWebRTCSCTPTransportPrivate;
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/gstwebrtcbin.c -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/gstwebrtcbin.c
Changed
@@ -32,7 +32,7 @@ #include "webrtcsctptransport.h" #include "gst/webrtc/webrtc-priv.h" - +#include <gst/webrtc/nice/nice.h> #include <gst/rtp/rtp.h> #include <stdio.h> @@ -66,6 +66,10 @@ #define DEFAULT_JB_LATENCY 200 +#define RTPHDREXT_MID GST_RTP_HDREXT_BASE "sdes:mid" +#define RTPHDREXT_STREAM_ID GST_RTP_HDREXT_BASE "sdes:rtp-stream-id" +#define RTPHDREXT_REPAIRED_STREAM_ID GST_RTP_HDREXT_BASE "sdes:repaired-rtp-stream-id" + /** * SECTION: element-webrtcbin * title: webrtcbin @@ -212,6 +216,21 @@ return TRUE; } +static gboolean +_gst_element_accumulator (GSignalInvocationHint * ihint, + GValue * return_accu, const GValue * handler_return, gpointer dummy) +{ + GstElement *element; + + element = g_value_get_object (handler_return); + GST_DEBUG ("got element %" GST_PTR_FORMAT, element); + + g_value_set_object (return_accu, element); + + /* stop emission if we have an element */ + return (element == NULL); +} + G_DEFINE_TYPE (GstWebRTCBinPad, gst_webrtc_bin_pad, GST_TYPE_GHOST_PAD); static void @@ -235,13 +254,9 @@ { GstWebRTCBinPad *pad = GST_WEBRTC_BIN_PAD (object); - if (pad->trans) - gst_object_unref (pad->trans); - pad->trans = NULL; - - if (pad->received_caps) - gst_caps_unref (pad->received_caps); - pad->received_caps = NULL; + gst_clear_object (&pad->trans); + gst_clear_caps (&pad->received_caps); + g_clear_pointer (&pad->msid, g_free); G_OBJECT_CLASS (gst_webrtc_bin_pad_parent_class)->finalize (object); } @@ -263,18 +278,21 @@ } static void -gst_webrtc_bin_pad_update_ssrc_event (GstWebRTCBinPad * wpad) +gst_webrtc_bin_pad_update_tos_event (GstWebRTCBinPad * wpad) { - if (wpad->received_caps) { - WebRTCTransceiver *trans = (WebRTCTransceiver *) wpad->trans; + WebRTCTransceiver *trans = (WebRTCTransceiver *) wpad->trans; + + if (wpad->received_caps && trans->parent.mid) { GstPad *pad = GST_PAD (wpad); - gst_event_take (&trans->ssrc_event, + gst_event_take (&trans->tos_event, gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM_STICKY, - gst_structure_new ("GstWebRtcBinUpdateTos", "ssrc", G_TYPE_UINT, - trans->current_ssrc, NULL))); + gst_structure_new ("GstWebRtcBinUpdateTos", "mid", G_TYPE_STRING, + trans->parent.mid, NULL))); - gst_pad_send_event (pad, gst_event_ref (trans->ssrc_event)); + GST_DEBUG_OBJECT (pad, "sending new tos event %" GST_PTR_FORMAT, + trans->tos_event); + gst_pad_send_event (pad, gst_event_ref (trans->tos_event)); } } @@ -311,12 +329,7 @@ GST_PTR_FORMAT, pad, check_negotiation, caps); if (check_negotiation) { - WebRTCTransceiver *trans = WEBRTC_TRANSCEIVER (wpad->trans); - const GstStructure *s; - - s = gst_caps_get_structure (caps, 0); - gst_structure_get_uint (s, "ssrc", &trans->current_ssrc); - gst_webrtc_bin_pad_update_ssrc_event (wpad); + gst_webrtc_bin_pad_update_tos_event (wpad); } /* A remote description might have been set while the pad hadn't @@ -439,66 +452,176 @@ { } -static GstPadProbeReturn -webrtc_bin_pad_buffer_cb (GstPad * pad, GstPadProbeInfo * info, - gpointer user_data) +static GstWebRTCBinPad * +gst_webrtc_bin_pad_new (const gchar * name, GstPadDirection direction, + char *msid) { - GstWebRTCBinPad *wpad; - GstBuffer *buf; - GstRTPBuffer rtpbuf = GST_RTP_BUFFER_INIT; + GstWebRTCBinPad *pad; + GstPadTemplate *template; + GType pad_type; - if (info->type & GST_PAD_PROBE_TYPE_BUFFER) { - buf = GST_PAD_PROBE_INFO_BUFFER (info); + if (direction == GST_PAD_SINK) { + template = gst_static_pad_template_get (&sink_template); + pad_type = GST_TYPE_WEBRTC_BIN_SINK_PAD; + } else if (direction == GST_PAD_SRC) { + template = gst_static_pad_template_get (&src_template); + pad_type = GST_TYPE_WEBRTC_BIN_SRC_PAD; } else { - GstBufferList *list; + g_assert_not_reached (); + } + + pad = + g_object_new (pad_type, "name", name, "direction", + direction, "template", template, NULL); + gst_object_unref (template); - list = GST_PAD_PROBE_INFO_BUFFER_LIST (info); - buf = gst_buffer_list_get (list, 0); + pad->msid = msid; + + GST_DEBUG_OBJECT (pad, "new visible pad with direction %s", + direction == GST_PAD_SRC ? "src" : "sink"); + return pad; +} + +enum +{ + PROP_SINK_PAD_MSID = 1, +}; + +/** + * GstWebRTCBinSinkPad: + * + * Since: 1.22 + */ +struct _GstWebRTCBinSinkPad +{ + GstWebRTCBinPad pad; +}; + +G_DEFINE_TYPE (GstWebRTCBinSinkPad, gst_webrtc_bin_sink_pad, + GST_TYPE_WEBRTC_BIN_PAD); + +static void +gst_webrtc_bin_sink_pad_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstWebRTCBinPad *pad = GST_WEBRTC_BIN_PAD (object); + + switch (prop_id) { + case PROP_SINK_PAD_MSID: + g_value_set_string (value, pad->msid); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; } +} - if (buf == NULL) - return GST_PAD_PROBE_OK; +static void +gst_webrtc_bin_sink_pad_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstWebRTCBinPad *pad = GST_WEBRTC_BIN_PAD (object); - if (!gst_rtp_buffer_map (buf, GST_MAP_READ, &rtpbuf)) - return GST_PAD_PROBE_OK; + switch (prop_id) { + case PROP_SINK_PAD_MSID: + g_free (pad->msid); + pad->msid = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} - wpad = GST_WEBRTC_BIN_PAD (pad); - wpad->last_ssrc = gst_rtp_buffer_get_ssrc (&rtpbuf); +static void +gst_webrtc_bin_sink_pad_class_init (GstWebRTCBinSinkPadClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; - gst_rtp_buffer_unmap (&rtpbuf); + gobject_class->get_property = gst_webrtc_bin_sink_pad_get_property; + gobject_class->set_property = gst_webrtc_bin_sink_pad_set_property; - return GST_PAD_PROBE_OK; + /** + * GstWebRTCBinSinkPad:msid: + * + * The MediaStream Identifier to use for this pad (MediaStreamTrack). + * Fallback is the RTP SDES cname value if not provided. + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, + PROP_SINK_PAD_MSID, + g_param_spec_string ("msid", "MSID", + "Local MediaStream ID to use for this pad (NULL = unset)", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } -static GstWebRTCBinPad * -gst_webrtc_bin_pad_new (const gchar * name, GstPadDirection direction) +static void +gst_webrtc_bin_sink_pad_init (GstWebRTCBinSinkPad * pad) { - GstWebRTCBinPad *pad; - GstPadTemplate *template; + gst_pad_set_event_function (GST_PAD (pad), gst_webrtcbin_sink_event); + gst_pad_set_query_function (GST_PAD (pad), gst_webrtcbin_sink_query); +} - if (direction == GST_PAD_SINK) - template = gst_static_pad_template_get (&sink_template); - else if (direction == GST_PAD_SRC) - template = gst_static_pad_template_get (&src_template); - else - g_assert_not_reached (); +enum +{ + PROP_SRC_PAD_MSID = 1, +}; - pad = - g_object_new (gst_webrtc_bin_pad_get_type (), "name", name, "direction", - direction, "template", template, NULL); - gst_object_unref (template); +/** + * GstWebRTCBinSrcPad: + * + * Since: 1.22 + */ +struct _GstWebRTCBinSrcPad +{ + GstWebRTCBinPad pad; +}; - if (direction == GST_PAD_SINK) { - gst_pad_set_event_function (GST_PAD (pad), gst_webrtcbin_sink_event); - gst_pad_set_query_function (GST_PAD (pad), gst_webrtcbin_sink_query); +G_DEFINE_TYPE (GstWebRTCBinSrcPad, gst_webrtc_bin_src_pad, + GST_TYPE_WEBRTC_BIN_PAD); + +static void +gst_webrtc_bin_src_pad_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstWebRTCBinPad *pad = GST_WEBRTC_BIN_PAD (object); + + switch (prop_id) { + case PROP_SRC_PAD_MSID: + g_value_set_string (value, pad->msid); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; } +} - gst_pad_add_probe (GST_PAD (pad), GST_PAD_PROBE_TYPE_BUFFER | - GST_PAD_PROBE_TYPE_BUFFER_LIST, webrtc_bin_pad_buffer_cb, NULL, NULL); +static void +gst_webrtc_bin_src_pad_class_init (GstWebRTCBinSrcPadClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; - GST_DEBUG_OBJECT (pad, "new visible pad with direction %s", - direction == GST_PAD_SRC ? "src" : "sink"); - return pad; + gobject_class->get_property = gst_webrtc_bin_src_pad_get_property; + + /** + * GstWebRTCBinSrcPad:msid: + * + * The MediaStream Identifier the remote peer used for this pad (MediaStreamTrack). + * Will be NULL if not advertised in the remote SDP. + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, + PROP_SRC_PAD_MSID, + g_param_spec_string ("msid", "MSID", + "Remote MediaStream ID in use for this pad (NULL = not advertised)", + NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_webrtc_bin_src_pad_init (GstWebRTCBinSrcPad * pad) +{ } #define gst_webrtc_bin_parent_class parent_class @@ -525,6 +648,8 @@ ADD_TURN_SERVER_SIGNAL, CREATE_DATA_CHANNEL_SIGNAL, ON_DATA_CHANNEL_SIGNAL, + PREPARE_DATA_CHANNEL_SIGNAL, + REQUEST_AUX_SENDER, LAST_SIGNAL, }; @@ -548,6 +673,7 @@ PROP_ICE_AGENT, PROP_LATENCY, PROP_SCTP_TRANSPORT, + PROP_HTTP_PROXY }; static guint gst_webrtc_bin_signalsLAST_SIGNAL = { 0 }; @@ -612,7 +738,7 @@ } static gboolean -match_for_mid (GstWebRTCRTPTransceiver * trans, const gchar * mid) +transceiver_match_for_mid (GstWebRTCRTPTransceiver * trans, const gchar * mid) { return g_strcmp0 (trans->mid, mid) == 0; } @@ -641,6 +767,20 @@ return trans; } +static GstWebRTCRTPTransceiver * +_find_transceiver_for_mid (GstWebRTCBin * webrtc, const char *mid) +{ + GstWebRTCRTPTransceiver *trans; + + trans = _find_transceiver (webrtc, mid, + (FindTransceiverFunc) transceiver_match_for_mid); + + GST_TRACE_OBJECT (webrtc, "Found transceiver %" GST_PTR_FORMAT " for " + "mid %s", trans, mid); + + return trans; +} + typedef gboolean (*FindTransportFunc) (TransportStream * p1, gconstpointer data); @@ -764,12 +904,23 @@ GST_OBJECT_UNLOCK (webrtc); } -static void +static gboolean _remove_pending_pad (GstWebRTCBin * webrtc, GstWebRTCBinPad * pad) { + gboolean ret = FALSE; + GList *l; + GST_OBJECT_LOCK (webrtc); - webrtc->priv->pending_pads = g_list_remove (webrtc->priv->pending_pads, pad); + l = g_list_find (webrtc->priv->pending_pads, pad); + if (l) { + webrtc->priv->pending_pads = + g_list_remove_link (webrtc->priv->pending_pads, l); + g_list_free (l); + ret = TRUE; + } GST_OBJECT_UNLOCK (webrtc); + + return ret; } static void @@ -835,17 +986,82 @@ #if 0 static gboolean -match_for_ssrc (GstWebRTCBinPad * pad, guint * ssrc) +match_for_pad (GstWebRTCBinPad * pad, GstWebRTCBinPad * other) { - return pad->ssrc == *ssrc; + return pad == other; } +#endif + +struct SsrcMatch +{ + GstWebRTCRTPTransceiverDirection direction; + guint32 ssrc; +}; static gboolean -match_for_pad (GstWebRTCBinPad * pad, GstWebRTCBinPad * other) +mid_ssrc_match_for_ssrc (SsrcMapItem * entry, const struct SsrcMatch *match) { - return pad == other; + return entry->direction == match->direction && entry->ssrc == match->ssrc; +} + +static gboolean +mid_ssrc_remove_ssrc (SsrcMapItem * item, const struct SsrcMatch *match) +{ + return !mid_ssrc_match_for_ssrc (item, match); +} + +static SsrcMapItem * +find_mid_ssrc_for_ssrc (GstWebRTCBin * webrtc, + GstWebRTCRTPTransceiverDirection direction, guint rtp_session, guint ssrc) +{ + TransportStream *stream = _find_transport_for_session (webrtc, rtp_session); + struct SsrcMatch m = { direction, ssrc }; + + if (!stream) + return NULL; + + return transport_stream_find_ssrc_map_item (stream, &m, + (FindSsrcMapFunc) mid_ssrc_match_for_ssrc); +} + +static SsrcMapItem * +find_or_add_ssrc_map_item (GstWebRTCBin * webrtc, + GstWebRTCRTPTransceiverDirection direction, guint rtp_session, guint ssrc, + guint media_idx) +{ + TransportStream *stream = _find_transport_for_session (webrtc, rtp_session); + struct SsrcMatch m = { direction, ssrc }; + SsrcMapItem *item; + + if (!stream) + return NULL; + + if ((item = transport_stream_find_ssrc_map_item (stream, &m, + (FindSsrcMapFunc) mid_ssrc_match_for_ssrc))) + return item; + + return transport_stream_add_ssrc_map_item (stream, direction, ssrc, + media_idx); +} + +static void +remove_ssrc_entry_by_ssrc (GstWebRTCBin * webrtc, guint rtp_session, guint ssrc) +{ + TransportStream *stream; + + stream = _find_transport_for_session (webrtc, rtp_session); + if (stream) { + struct SsrcMatch m = + { GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY, ssrc }; + + transport_stream_filter_ssrc_map_item (stream, &m, + (FindSsrcMapFunc) mid_ssrc_remove_ssrc); + + m.direction = GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDONLY; + transport_stream_filter_ssrc_map_item (stream, &m, + (FindSsrcMapFunc) mid_ssrc_remove_ssrc); + } } -#endif static gboolean _unlock_pc_thread (GMutex * lock) @@ -1366,7 +1582,7 @@ } if (new_state != webrtc->ice_gathering_state) { - gchar *old_s, *new_s; + const gchar *old_s, *new_s; old_s = _enum_value_to_string (GST_TYPE_WEBRTC_ICE_GATHERING_STATE, old_state); @@ -1374,8 +1590,6 @@ new_state); GST_INFO_OBJECT (webrtc, "ICE gathering state change from %s(%u) to %s(%u)", old_s, old_state, new_s, new_state); - g_free (old_s); - g_free (new_s); webrtc->ice_gathering_state = new_state; PC_UNLOCK (webrtc); @@ -1402,7 +1616,7 @@ new_state = _collate_ice_connection_states (webrtc); if (new_state != old_state) { - gchar *old_s, *new_s; + const gchar *old_s, *new_s; old_s = _enum_value_to_string (GST_TYPE_WEBRTC_ICE_CONNECTION_STATE, old_state); @@ -1411,8 +1625,6 @@ GST_INFO_OBJECT (webrtc, "ICE connection state change from %s(%u) to %s(%u)", old_s, old_state, new_s, new_state); - g_free (old_s); - g_free (new_s); webrtc->ice_connection_state = new_state; PC_UNLOCK (webrtc); @@ -1439,7 +1651,7 @@ new_state = _collate_peer_connection_states (webrtc); if (new_state != old_state) { - gchar *old_s, *new_s; + const gchar *old_s, *new_s; old_s = _enum_value_to_string (GST_TYPE_WEBRTC_PEER_CONNECTION_STATE, old_state); @@ -1448,8 +1660,6 @@ GST_INFO_OBJECT (webrtc, "Peer connection state change from %s(%u) to %s(%u)", old_s, old_state, new_s, new_state); - g_free (old_s); - g_free (new_s); webrtc->peer_connection_state = new_state; PC_UNLOCK (webrtc); @@ -1515,7 +1725,7 @@ GST_LOG_OBJECT (webrtc, "checking if negotiation is needed"); /* We can't negotiate until we have received caps on all our sink pads, - * as we will need the ssrcs in our offer / answer */ + * as we will need the formats in our offer / answer */ if (!_all_sinks_have_caps (webrtc)) { GST_LOG_OBJECT (webrtc, "no negotiation possible until caps have been received on all sink pads"); @@ -1597,26 +1807,11 @@ * nor answer matches t's direction, return "true". */ if (local_dir != trans->direction && remote_dir != trans->direction) { - gchar *local_str, *remote_str, *dir_str; - - local_str = - _enum_value_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION, - local_dir); - remote_str = - _enum_value_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION, - remote_dir); - dir_str = - _enum_value_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION, - trans->direction); - GST_LOG_OBJECT (webrtc, "transceiver direction (%s) doesn't match " - "description (local %s remote %s)", dir_str, local_str, - remote_str); - - g_free (dir_str); - g_free (local_str); - g_free (remote_str); - + "description (local %s remote %s)", + gst_webrtc_rtp_transceiver_direction_to_string (trans->direction), + gst_webrtc_rtp_transceiver_direction_to_string (local_dir), + gst_webrtc_rtp_transceiver_direction_to_string (remote_dir)); return TRUE; } } else if (webrtc->current_local_description->type == @@ -1632,30 +1827,12 @@ intersect_dir = _intersect_answer_directions (remote_dir, local_dir); if (intersect_dir != trans->direction) { - gchar *local_str, *remote_str, *inter_str, *dir_str; - - local_str = - _enum_value_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION, - local_dir); - remote_str = - _enum_value_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION, - remote_dir); - dir_str = - _enum_value_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION, - trans->direction); - inter_str = - _enum_value_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION, - intersect_dir); - GST_LOG_OBJECT (webrtc, "transceiver direction (%s) doesn't match " "description intersected direction %s (local %s remote %s)", - dir_str, local_str, inter_str, remote_str); - - g_free (dir_str); - g_free (local_str); - g_free (remote_str); - g_free (inter_str); - + gst_webrtc_rtp_transceiver_direction_to_string (trans->direction), + gst_webrtc_rtp_transceiver_direction_to_string (local_dir), + gst_webrtc_rtp_transceiver_direction_to_string (intersect_dir), + gst_webrtc_rtp_transceiver_direction_to_string (remote_dir)); return TRUE; } } @@ -1868,7 +2045,7 @@ if (caps) { if (trans) - gst_caps_replace (&trans->last_configured_caps, caps); + gst_caps_replace (&trans->last_retrieved_caps, caps); ret = caps; } @@ -1877,8 +2054,8 @@ if (!ret) { if (codec_preferences) ret = gst_caps_ref (codec_preferences); - else if (trans->last_configured_caps) - ret = gst_caps_ref (trans->last_configured_caps); + else if (trans->last_retrieved_caps) + ret = gst_caps_ref (trans->last_retrieved_caps); } out: @@ -1953,14 +2130,6 @@ } static gboolean -match_ssrc (GstWebRTCRTPTransceiver * rtp_trans, gconstpointer data) -{ - WebRTCTransceiver *trans = (WebRTCTransceiver *) rtp_trans; - - return (trans->current_ssrc == GPOINTER_TO_UINT (data)); -} - -static gboolean _on_sending_rtcp (GObject * internal_session, GstBuffer * buffer, gboolean early, gpointer user_data) { @@ -1974,17 +2143,28 @@ if (gst_rtcp_buffer_get_first_packet (&rtcp, &packet)) { if (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_SR) { guint32 ssrc; - GstWebRTCRTPTransceiver *rtp_trans; + GstWebRTCRTPTransceiver *rtp_trans = NULL; WebRTCTransceiver *trans; + guint rtp_session; + SsrcMapItem *mid; gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, NULL, NULL, NULL, NULL); - - rtp_trans = _find_transceiver (webrtc, GUINT_TO_POINTER (ssrc), - match_ssrc); + rtp_session = + GPOINTER_TO_UINT (g_object_get_data (internal_session, + "GstWebRTCBinRTPSessionID")); + + mid = find_mid_ssrc_for_ssrc (webrtc, + GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDONLY, rtp_session, ssrc); + if (mid && mid->mid) { + rtp_trans = _find_transceiver_for_mid (webrtc, mid->mid); + GST_LOG_OBJECT (webrtc, "found %" GST_PTR_FORMAT " from mid entry " + "using rtp session %u ssrc %u -> mid \'%s\'", rtp_trans, + rtp_session, ssrc, mid->mid); + } trans = (WebRTCTransceiver *) rtp_trans; - if (rtp_trans && rtp_trans->sender && trans->ssrc_event) { + if (rtp_trans && rtp_trans->sender && trans->tos_event) { GstPad *pad; gchar *pad_name = NULL; @@ -1994,7 +2174,7 @@ pad = gst_element_get_static_pad (webrtc->rtpbin, pad_name); g_free (pad_name); if (pad) { - gst_pad_push_event (pad, gst_event_ref (trans->ssrc_event)); + gst_pad_push_event (pad, gst_event_ref (trans->tos_event)); gst_object_unref (pad); } } @@ -2017,6 +2197,8 @@ session_id, &internal_session); if (internal_session) { + g_object_set_data (internal_session, "GstWebRTCBinRTPSessionID", + GUINT_TO_POINTER (session_id)); g_signal_connect (internal_session, "on-sending-rtcp", G_CALLBACK (_on_sending_rtcp), webrtc); g_object_unref (internal_session); @@ -2044,14 +2226,13 @@ gst_event_get_structure (GST_PAD_PROBE_INFO_EVENT (info)); if (gst_structure_has_name (s, "GstWebRtcBinUpdateTos")) { - guint ssrc; + const char *mid; gint priority; - if (gst_structure_get_uint (s, "ssrc", &ssrc)) { + if ((mid = gst_structure_get_string (s, "mid"))) { GstWebRTCRTPTransceiver *rtp_trans; - rtp_trans = _find_transceiver (webrtc, GUINT_TO_POINTER (ssrc), - match_ssrc); + rtp_trans = _find_transceiver_for_mid (webrtc, mid); if (rtp_trans) { WebRTCTransceiver *trans = WEBRTC_TRANSCEIVER (rtp_trans); GstWebRTCICEStream *stream = _find_ice_stream_for_session (webrtc, @@ -2227,6 +2408,11 @@ /* FIXME: We don't support stopping transceiver yet so they're always not stopped */ rtp_trans->stopped = FALSE; + GST_LOG_OBJECT (webrtc, "created new transceiver %" GST_PTR_FORMAT " with " + "direction %s (%d), mline %u, kind %s (%d)", rtp_trans, + gst_webrtc_rtp_transceiver_direction_to_string (direction), direction, + mline, gst_webrtc_kind_to_string (kind), kind); + g_signal_connect_object (sender, "notify::priority", G_CALLBACK (gst_webrtc_bin_attach_tos), webrtc, G_CONNECT_SWAPPED); @@ -2359,11 +2545,14 @@ channel->parent.id = stream_id; channel->webrtcbin = webrtc; - gst_bin_add (GST_BIN (webrtc), channel->appsrc); - gst_bin_add (GST_BIN (webrtc), channel->appsink); + g_signal_emit (webrtc, gst_webrtc_bin_signalsPREPARE_DATA_CHANNEL_SIGNAL, + 0, channel, FALSE); + + gst_bin_add (GST_BIN (webrtc), channel->src_bin); + gst_bin_add (GST_BIN (webrtc), channel->sink_bin); - gst_element_sync_state_with_parent (channel->appsrc); - gst_element_sync_state_with_parent (channel->appsink); + gst_element_sync_state_with_parent (channel->src_bin); + gst_element_sync_state_with_parent (channel->sink_bin); webrtc_data_channel_link_to_sctp (channel, webrtc->priv->sctp_transport); @@ -2374,7 +2563,7 @@ g_signal_connect (channel, "notify::ready-state", G_CALLBACK (_on_data_channel_ready_state), webrtc); - sink_pad = gst_element_get_static_pad (channel->appsink, "sink"); + sink_pad = gst_element_get_static_pad (channel->sink_bin, "sink"); if (gst_pad_link (pad, sink_pad) != GST_PAD_LINK_OK) GST_WARNING_OBJECT (channel, "Failed to link sctp pad %s with channel %" GST_PTR_FORMAT, GST_PAD_NAME (pad), channel); @@ -2590,38 +2779,92 @@ return _get_or_create_rtp_transport_channel (webrtc, session_id); } -static guint -g_array_find_uint (GArray * array, guint val) +struct media_payload_map_item +{ + guint media_pt; + guint red_pt; + guint ulpfec_pt; + guint rtx_pt; + guint red_rtx_pt; +}; + +static void +media_payload_map_item_init (struct media_payload_map_item *item, + guint media_pt) +{ + item->media_pt = media_pt; + item->red_pt = G_MAXUINT; + item->rtx_pt = G_MAXUINT; + item->ulpfec_pt = G_MAXUINT; + item->red_rtx_pt = G_MAXUINT; +} + +static struct media_payload_map_item * +find_payload_map_for_media_pt (GArray * media_mapping, guint media_pt) { guint i; - for (i = 0; i < array->len; i++) { - if (g_array_index (array, guint, i) == val) - return i; + for (i = 0; i < media_mapping->len; i++) { + struct media_payload_map_item *item; + + item = &g_array_index (media_mapping, struct media_payload_map_item, i); + + if (item->media_pt == media_pt) + return item; } - return G_MAXUINT; + return NULL; +} + +static struct media_payload_map_item * +find_or_create_payload_map_for_media_pt (GArray * media_mapping, guint media_pt) +{ + struct media_payload_map_item new_item; + struct media_payload_map_item *item; + + if ((item = find_payload_map_for_media_pt (media_mapping, media_pt))) + return item; + + media_payload_map_item_init (&new_item, media_pt); + g_array_append_val (media_mapping, new_item); + return &g_array_index (media_mapping, struct media_payload_map_item, + media_mapping->len - 1); } static gboolean -_pick_available_pt (GArray * reserved_pts, guint * i) +_pick_available_pt (GArray * media_mapping, guint * ret) { - gboolean ret = FALSE; + int i; - for (*i = 96; *i <= 127; (*i)++) { - if (g_array_find_uint (reserved_pts, *i) == G_MAXUINT) { - g_array_append_val (reserved_pts, *i); - ret = TRUE; - break; + for (i = 96; i <= 127; i++) { + gboolean available = TRUE; + int j; + + for (j = 0; j < media_mapping->len; j++) { + struct media_payload_map_item *item; + + item = &g_array_index (media_mapping, struct media_payload_map_item, j); + + if (item->media_pt == i || item->red_pt == i || item->rtx_pt == i + || item->ulpfec_pt == i || item->red_rtx_pt == i) { + available = FALSE; + break; + } + } + + if (available) { + *ret = i; + return TRUE; } } - return ret; + *ret = G_MAXUINT; + return FALSE; } static gboolean _pick_fec_payload_types (GstWebRTCBin * webrtc, WebRTCTransceiver * trans, - GArray * reserved_pts, gint clockrate, gint * rtx_target_pt, + GArray * media_mapping, gint clockrate, gint media_pt, gint * rtx_target_pt, GstSDPMedia * media) { gboolean ret = TRUE; @@ -2630,30 +2873,35 @@ goto done; if (trans->fec_type == GST_WEBRTC_FEC_TYPE_ULP_RED && clockrate != -1) { - guint pt; + struct media_payload_map_item *item; gchar *str; - if (!(ret = _pick_available_pt (reserved_pts, &pt))) - goto done; + item = find_or_create_payload_map_for_media_pt (media_mapping, media_pt); + if (item->red_pt == G_MAXUINT) { + if (!(ret = _pick_available_pt (media_mapping, &item->red_pt))) + goto done; + } /* https://tools.ietf.org/html/rfc5109#section-14.1 */ - str = g_strdup_printf ("%u", pt); + str = g_strdup_printf ("%u", item->red_pt); gst_sdp_media_add_format (media, str); g_free (str); - str = g_strdup_printf ("%u red/%d", pt, clockrate); + str = g_strdup_printf ("%u red/%d", item->red_pt, clockrate); gst_sdp_media_add_attribute (media, "rtpmap", str); g_free (str); - *rtx_target_pt = pt; + *rtx_target_pt = item->red_pt; - if (!(ret = _pick_available_pt (reserved_pts, &pt))) - goto done; + if (item->ulpfec_pt == G_MAXUINT) { + if (!(ret = _pick_available_pt (media_mapping, &item->ulpfec_pt))) + goto done; + } - str = g_strdup_printf ("%u", pt); + str = g_strdup_printf ("%u", item->ulpfec_pt); gst_sdp_media_add_format (media, str); g_free (str); - str = g_strdup_printf ("%u ulpfec/%d", pt, clockrate); + str = g_strdup_printf ("%u ulpfec/%d", item->ulpfec_pt, clockrate); gst_sdp_media_add_attribute (media, "rtpmap", str); g_free (str); } @@ -2662,10 +2910,37 @@ return ret; } +static void +add_rtx_to_media (WebRTCTransceiver * trans, gint clockrate, gint rtx_pt, + gint rtx_target_pt, guint target_ssrc, GstSDPMedia * media) +{ + char *str; + + /* https://tools.ietf.org/html/rfc4588#section-8.6 */ + if (target_ssrc != -1) { + str = g_strdup_printf ("%u", target_ssrc); + gst_structure_set (trans->local_rtx_ssrc_map, str, G_TYPE_UINT, + g_random_int (), NULL); + g_free (str); + } + + str = g_strdup_printf ("%u", rtx_pt); + gst_sdp_media_add_format (media, str); + g_free (str); + + str = g_strdup_printf ("%u rtx/%d", rtx_pt, clockrate); + gst_sdp_media_add_attribute (media, "rtpmap", str); + g_free (str); + + str = g_strdup_printf ("%u apt=%d", rtx_pt, rtx_target_pt); + gst_sdp_media_add_attribute (media, "fmtp", str); + g_free (str); +} + static gboolean _pick_rtx_payload_types (GstWebRTCBin * webrtc, WebRTCTransceiver * trans, - GArray * reserved_pts, gint clockrate, gint target_pt, guint target_ssrc, - GstSDPMedia * media) + GArray * media_mapping, gint clockrate, gint media_pt, gint target_pt, + guint target_ssrc, GstSDPMedia * media) { gboolean ret = TRUE; @@ -2676,30 +2951,26 @@ gst_structure_new_empty ("application/x-rtp-ssrc-map"); if (trans->do_nack) { - guint pt; - gchar *str; - - if (!(ret = _pick_available_pt (reserved_pts, &pt))) - goto done; - - /* https://tools.ietf.org/html/rfc4588#section-8.6 */ - - str = g_strdup_printf ("%u", target_ssrc); - gst_structure_set (trans->local_rtx_ssrc_map, str, G_TYPE_UINT, - g_random_int (), NULL); - g_free (str); + struct media_payload_map_item *item; - str = g_strdup_printf ("%u", pt); - gst_sdp_media_add_format (media, str); - g_free (str); + item = find_or_create_payload_map_for_media_pt (media_mapping, media_pt); + if (item->rtx_pt == G_MAXUINT) { + if (!(ret = _pick_available_pt (media_mapping, &item->rtx_pt))) + goto done; + } - str = g_strdup_printf ("%u rtx/%d", pt, clockrate); - gst_sdp_media_add_attribute (media, "rtpmap", str); - g_free (str); + add_rtx_to_media (trans, clockrate, item->rtx_pt, media_pt, target_ssrc, + media); - str = g_strdup_printf ("%u apt=%d", pt, target_pt); - gst_sdp_media_add_attribute (media, "fmtp", str); - g_free (str); + if (item->red_pt != G_MAXUINT) { + /* Workaround chrome bug: https://bugs.chromium.org/p/webrtc/issues/detail?id=6196 */ + if (item->red_rtx_pt == G_MAXUINT) { + if (!(ret = _pick_available_pt (media_mapping, &item->red_rtx_pt))) + goto done; + } + add_rtx_to_media (trans, clockrate, item->red_rtx_pt, item->red_pt, + target_ssrc, media); + } } done: @@ -2736,15 +3007,27 @@ gchar *str; GstStructure *sdes; const gchar *cname; + GstWebRTCBinPad *sink_pad; + const char *msid = NULL; g_object_get (data->webrtc->rtpbin, "sdes", &sdes, NULL); /* http://www.freesoft.org/CIE/RFC/1889/24.htm */ cname = gst_structure_get_string (sdes, "cname"); + sink_pad = + _find_pad_for_transceiver (data->webrtc, GST_PAD_SINK, + GST_WEBRTC_RTP_TRANSCEIVER (data->trans)); + if (sink_pad) + msid = sink_pad->msid; + /* fallback to cname if no msid provided */ + if (!msid) + msid = cname; + /* https://tools.ietf.org/html/draft-ietf-mmusic-msid-16 */ + /* FIXME: the ssrc is not present in RFC8830, do we still need that? */ str = g_strdup_printf ("%u msid:%s %s", g_value_get_uint (value), - cname, GST_OBJECT_NAME (data->trans)); + msid, GST_OBJECT_NAME (data->trans)); gst_sdp_media_add_attribute (data->media, "ssrc", str); g_free (str); @@ -2752,6 +3035,7 @@ gst_sdp_media_add_attribute (data->media, "ssrc", str); g_free (str); + gst_clear_object (&sink_pad); gst_structure_free (sdes); return TRUE; @@ -2780,10 +3064,22 @@ if (gst_structure_get_uint (s, "ssrc", &ssrc)) { gchar *str; + GstWebRTCBinPad *sink_pad; + const char *msid = NULL; + + sink_pad = + _find_pad_for_transceiver (webrtc, GST_PAD_SINK, + GST_WEBRTC_RTP_TRANSCEIVER (trans)); + if (sink_pad) + msid = sink_pad->msid; + /* fallback to cname if no msid provided */ + if (!msid) + msid = cname; /* https://tools.ietf.org/html/draft-ietf-mmusic-msid-16 */ + /* FIXME: the ssrc is not present in RFC8830, do we still need that? */ str = - g_strdup_printf ("%u msid:%s %s", ssrc, cname, + g_strdup_printf ("%u msid:%s %s", ssrc, msid, GST_OBJECT_NAME (trans)); gst_sdp_media_add_attribute (media, "ssrc", str); g_free (str); @@ -2791,6 +3087,8 @@ str = g_strdup_printf ("%u cname:%s", ssrc, cname); gst_sdp_media_add_attribute (media, "ssrc", str); g_free (str); + + gst_clear_object (&sink_pad); } } @@ -2953,6 +3251,70 @@ return edata.extmap; } +struct hdrext_id +{ + const char *rtphdrext_uri; + guint ext_id; +}; + +static gboolean +structure_value_get_rtphdrext_id (GQuark field_id, const GValue * value, + gpointer user_data) +{ + struct hdrext_id *rtphdrext = user_data; + const char *field_name = g_quark_to_string (field_id); + + if (g_str_has_prefix (field_name, "extmap-")) { + const char *val = NULL; + + if (GST_VALUE_HOLDS_ARRAY (value) && gst_value_array_get_size (value) >= 2) { + value = gst_value_array_get_value (value, 1); + } + if (G_VALUE_HOLDS_STRING (value)) { + val = g_value_get_string (value); + } + + if (g_strcmp0 (val, rtphdrext->rtphdrext_uri) == 0) { + gint64 id = g_ascii_strtoll (&field_namestrlen ("extmap-"), NULL, 10); + + if (id > 0 && id < 256) + rtphdrext->ext_id = id; + + return FALSE; + } + } + + return TRUE; +} + +// Returns -1 when not found +static guint +caps_get_rtp_header_extension_id (const GstCaps * caps, + const char *rtphdrext_uri) +{ + guint i, n; + + n = gst_caps_get_size (caps); + for (i = 0; i < n; i++) { + const GstStructure *s = gst_caps_get_structure (caps, i); + struct hdrext_id data = { rtphdrext_uri, -1 }; + + gst_structure_foreach (s, structure_value_get_rtphdrext_id, &data); + + if (data.ext_id != -1) + return data.ext_id; + } + + return -1; +} + +static gboolean +caps_contain_rtp_header_extension (const GstCaps * caps, + const char *rtphdrext_uri) +{ + return caps_get_rtp_header_extension_id (caps, rtphdrext_uri) != -1; +} + static gboolean _copy_field (GQuark field_id, const GValue * value, GstStructure * s) { @@ -2964,10 +3326,10 @@ /* based off https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-18#section-5.2.1 */ static gboolean sdp_media_from_transceiver (GstWebRTCBin * webrtc, GstSDPMedia * media, - GstWebRTCRTPTransceiver * trans, guint media_idx, - GString * bundled_mids, guint bundle_idx, gchar * bundle_ufrag, - gchar * bundle_pwd, GArray * reserved_pts, GHashTable * all_mids, - GError ** error) + const GstSDPMedia * last_media, GstWebRTCRTPTransceiver * trans, + guint media_idx, GString * bundled_mids, guint bundle_idx, + gchar * bundle_ufrag, gchar * bundle_pwd, GArray * media_mapping, + GHashTable * all_mids, gboolean * no_more_mlines, GError ** error) { /* TODO: * rtp header extensions @@ -2980,23 +3342,79 @@ * multiple dtls fingerprints https://tools.ietf.org/html/draft-ietf-mmusic-4572-update-05 */ GstSDPMessage *last_offer = _get_latest_self_generated_sdp (webrtc); - gchar *direction, *sdp_mid, *ufrag, *pwd; + gchar *ufrag, *pwd, *mid = NULL; gboolean bundle_only; + guint rtp_session_idx; GstCaps *caps; GstStructure *extmap; int i; - if (trans->direction == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_NONE - || trans->direction == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_INACTIVE) + if (trans->direction == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_NONE) return FALSE; g_assert (trans->mline == -1 || trans->mline == media_idx); + rtp_session_idx = bundled_mids ? bundle_idx : media_idx; + bundle_only = bundled_mids && bundle_idx != media_idx && webrtc->bundle_policy == GST_WEBRTC_BUNDLE_POLICY_MAX_BUNDLE; - /* mandated by JSEP */ - gst_sdp_media_add_attribute (media, "setup", "actpass"); + caps = _find_codec_preferences (webrtc, trans, media_idx, error); + caps = _add_supported_attributes_to_caps (webrtc, WEBRTC_TRANSCEIVER (trans), + caps); + + if (!caps || gst_caps_is_empty (caps) || gst_caps_is_any (caps)) { + gst_clear_caps (&caps); + + if (last_media) { + guint i, n; + + n = gst_sdp_media_formats_len (last_media); + if (n > 0) { + caps = gst_caps_new_empty (); + for (i = 0; i < n; i++) { + guint fmt = atoi (gst_sdp_media_get_format (last_media, i)); + GstCaps *tmp = gst_sdp_media_get_caps_from_media (last_media, fmt); + GstStructure *s = gst_caps_get_structure (tmp, 0); + gst_structure_set_name (s, "application/x-rtp"); + gst_caps_append_structure (caps, gst_structure_copy (s)); + gst_clear_caps (&tmp); + } + GST_DEBUG_OBJECT (webrtc, "using previously negotiated caps for " + "transceiver %" GST_PTR_FORMAT " %" GST_PTR_FORMAT, trans, caps); + } + } + + if (!caps) { + if (WEBRTC_TRANSCEIVER (trans)->mline_locked) { + GST_WARNING_OBJECT (webrtc, + "Transceiver <%s> with mid %s has locked mline %u, but no caps. " + "Can't add more lines after this one.", GST_OBJECT_NAME (trans), + trans->mid, trans->mline); + *no_more_mlines = TRUE; + } else { + GST_WARNING_OBJECT (webrtc, "no caps available for transceiver %" + GST_PTR_FORMAT ", skipping", trans); + } + return FALSE; + } + } + + if (last_media) { + const char *setup = gst_sdp_media_get_attribute_val (last_media, "setup"); + if (setup) { + gst_sdp_media_add_attribute (media, "setup", setup); + } else { + g_set_error (error, GST_WEBRTC_ERROR, + GST_WEBRTC_ERROR_INVALID_MODIFICATION, + "media %u cannot renegotiate without an existing a=setup line", + media_idx); + return FALSE; + } + } else { + /* mandated by JSEP */ + gst_sdp_media_add_attribute (media, "setup", "actpass"); + } /* FIXME: deal with ICE restarts */ if (last_offer && trans->mline != -1 && trans->mid) { @@ -3037,20 +3455,8 @@ gst_sdp_media_add_attribute (media, "rtcp-mux", ""); gst_sdp_media_add_attribute (media, "rtcp-rsize", NULL); - direction = - _enum_value_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION, - trans->direction); - gst_sdp_media_add_attribute (media, direction, ""); - g_free (direction); - - caps = _find_codec_preferences (webrtc, trans, media_idx, error); - - if (!caps || gst_caps_is_empty (caps) || gst_caps_is_any (caps)) { - GST_WARNING_OBJECT (webrtc, "no caps available for transceiver, skipping"); - if (caps) - gst_caps_unref (caps); - return FALSE; - } + gst_sdp_media_add_attribute (media, + gst_webrtc_rtp_transceiver_direction_to_string (trans->direction), ""); caps = gst_caps_make_writable (caps); @@ -3109,46 +3515,95 @@ const GstStructure *s = gst_caps_get_structure (caps, 0); gint clockrate = -1; gint rtx_target_pt; - gint original_rtx_target_pt; /* Workaround chrome bug: https://bugs.chromium.org/p/webrtc/issues/detail?id=6196 */ guint rtx_target_ssrc = -1; + gint media_pt; - if (gst_structure_get_int (s, "payload", &rtx_target_pt) && + if (gst_structure_get_int (s, "payload", &media_pt) && webrtc->bundle_policy == GST_WEBRTC_BUNDLE_POLICY_NONE) - g_array_append_val (reserved_pts, rtx_target_pt); + find_or_create_payload_map_for_media_pt (media_mapping, media_pt); - original_rtx_target_pt = rtx_target_pt; + rtx_target_pt = media_pt; if (!gst_structure_get_int (s, "clock-rate", &clockrate)) GST_WARNING_OBJECT (webrtc, "Caps %" GST_PTR_FORMAT " are missing clock-rate", caps); - if (!gst_structure_get_uint (s, "ssrc", &rtx_target_ssrc)) - GST_WARNING_OBJECT (webrtc, "Caps %" GST_PTR_FORMAT " are missing ssrc", - caps); - - _pick_fec_payload_types (webrtc, WEBRTC_TRANSCEIVER (trans), reserved_pts, - clockrate, &rtx_target_pt, media); - _pick_rtx_payload_types (webrtc, WEBRTC_TRANSCEIVER (trans), reserved_pts, - clockrate, rtx_target_pt, rtx_target_ssrc, media); - if (original_rtx_target_pt != rtx_target_pt) - _pick_rtx_payload_types (webrtc, WEBRTC_TRANSCEIVER (trans), reserved_pts, - clockrate, original_rtx_target_pt, rtx_target_ssrc, media); + if (!gst_structure_get_uint (s, "ssrc", &rtx_target_ssrc)) { + if (!caps_contain_rtp_header_extension (caps, RTPHDREXT_MID)) { + GST_WARNING_OBJECT (webrtc, "Caps %" GST_PTR_FORMAT " are missing ssrc", + caps); + } + } + + _pick_fec_payload_types (webrtc, WEBRTC_TRANSCEIVER (trans), media_mapping, + clockrate, media_pt, &rtx_target_pt, media); + _pick_rtx_payload_types (webrtc, WEBRTC_TRANSCEIVER (trans), media_mapping, + clockrate, media_pt, rtx_target_pt, rtx_target_ssrc, media); } _media_add_ssrcs (media, caps, webrtc, WEBRTC_TRANSCEIVER (trans)); /* Some identifier; we also add the media name to it so it's identifiable */ if (trans->mid) { - gst_sdp_media_add_attribute (media, "mid", trans->mid); - } else { + const char *media_mid = gst_sdp_media_get_attribute_val (media, "mid"); + + if (!media_mid) { + gst_sdp_media_add_attribute (media, "mid", trans->mid); + } else if (g_strcmp0 (media_mid, trans->mid) != 0) { + g_set_error (error, GST_WEBRTC_ERROR, + GST_WEBRTC_ERROR_INVALID_MODIFICATION, + "Cannot change media %u mid value from \'%s\' to \'%s\'", + media_idx, media_mid, trans->mid); + return FALSE; + } + mid = g_strdup (trans->mid); + g_hash_table_insert (all_mids, g_strdup (mid), NULL); + } + + if (mid == NULL) { + const GstStructure *s = gst_caps_get_structure (caps, 0); + + mid = g_strdup (gst_structure_get_string (s, "a-mid")); + if (mid) { + if (g_hash_table_contains (all_mids, (gpointer) mid)) { + g_set_error (error, GST_WEBRTC_ERROR, + GST_WEBRTC_ERROR_INTERNAL_FAILURE, + "Cannot re-use mid \'%s\' from the caps in m= line %u that has " + "already been used for a previous m= line in the SDP", mid, + media_idx); + return FALSE; + } + g_free (WEBRTC_TRANSCEIVER (trans)->pending_mid); + WEBRTC_TRANSCEIVER (trans)->pending_mid = g_strdup (mid); + g_hash_table_insert (all_mids, g_strdup (mid), NULL); + } + } + + if (mid == NULL) { + mid = g_strdup (WEBRTC_TRANSCEIVER (trans)->pending_mid); + if (mid) { + /* If it's already used, just ignore the pending one and generate + * a new one */ + if (g_hash_table_contains (all_mids, (gpointer) mid)) { + g_clear_pointer (&mid, free); + g_clear_pointer (&WEBRTC_TRANSCEIVER (trans)->pending_mid, free); + } else { + gst_sdp_media_add_attribute (media, "mid", mid); + g_hash_table_insert (all_mids, g_strdup (mid), NULL); + } + } + } + + if (mid == NULL) { /* Make sure to avoid mid collisions */ while (TRUE) { - sdp_mid = g_strdup_printf ("%s%u", gst_sdp_media_get_media (media), + mid = g_strdup_printf ("%s%u", gst_sdp_media_get_media (media), webrtc->priv->media_counter++); - if (g_hash_table_contains (all_mids, (gpointer) sdp_mid)) { - g_free (sdp_mid); + if (g_hash_table_contains (all_mids, (gpointer) mid)) { + g_free (mid); } else { - gst_sdp_media_add_attribute (media, "mid", sdp_mid); - g_hash_table_insert (all_mids, sdp_mid, NULL); + gst_sdp_media_add_attribute (media, "mid", mid); + g_hash_table_insert (all_mids, g_strdup (mid), NULL); + WEBRTC_TRANSCEIVER (trans)->pending_mid = g_strdup (mid); break; } } @@ -3162,9 +3617,7 @@ if (!trans->sender->transport) { TransportStream *item; - item = - _get_or_create_transport_stream (webrtc, - bundled_mids ? bundle_idx : media_idx, FALSE); + item = _get_or_create_transport_stream (webrtc, rtp_session_idx, FALSE); webrtc_transceiver_set_transport (WEBRTC_TRANSCEIVER (trans), item); } @@ -3173,42 +3626,43 @@ } if (bundled_mids) { - const gchar *mid = gst_sdp_media_get_attribute_val (media, "mid"); - g_assert (mid); g_string_append_printf (bundled_mids, " %s", mid); } + g_clear_pointer (&mid, g_free); + gst_caps_unref (caps); return TRUE; } static void -gather_pad_pt (GstWebRTCBinPad * pad, GArray * reserved_pts) +gather_pad_pt (GstWebRTCBinPad * pad, GArray * media_mapping) { if (pad->received_caps) { GstStructure *s = gst_caps_get_structure (pad->received_caps, 0); gint pt; if (gst_structure_get_int (s, "payload", &pt)) { - GST_TRACE_OBJECT (pad, "have reserved pt %u from received caps", pt); - g_array_append_val (reserved_pts, pt); + GST_TRACE_OBJECT (pad, "have media pt %u from received caps", pt); + find_or_create_payload_map_for_media_pt (media_mapping, pt); } } } static GArray * -gather_reserved_pts (GstWebRTCBin * webrtc) +gather_media_mapping (GstWebRTCBin * webrtc) { GstElement *element = GST_ELEMENT (webrtc); - GArray *reserved_pts = g_array_new (FALSE, FALSE, sizeof (guint)); + GArray *media_mapping = + g_array_new (FALSE, FALSE, sizeof (struct media_payload_map_item)); guint i; GST_OBJECT_LOCK (webrtc); - g_list_foreach (element->sinkpads, (GFunc) gather_pad_pt, reserved_pts); + g_list_foreach (element->sinkpads, (GFunc) gather_pad_pt, media_mapping); g_list_foreach (webrtc->priv->pending_pads, (GFunc) gather_pad_pt, - reserved_pts); + media_mapping); for (i = 0; i < webrtc->priv->transceivers->len; i++) { GstWebRTCRTPTransceiver *trans; @@ -3223,9 +3677,9 @@ for (j = 0; j < n; j++) { GstStructure *s = gst_caps_get_structure (trans->codec_preferences, j); if (gst_structure_get_int (s, "payload", &pt)) { - GST_TRACE_OBJECT (trans, "have reserved pt %u from codec preferences", + GST_TRACE_OBJECT (trans, "have media pt %u from codec preferences", pt); - g_array_append_val (reserved_pts, pt); + find_or_create_payload_map_for_media_pt (media_mapping, pt); } } } @@ -3233,7 +3687,7 @@ } GST_OBJECT_UNLOCK (webrtc); - return reserved_pts; + return media_mapping; } static gboolean @@ -3340,7 +3794,7 @@ GString *bundled_mids = NULL; gchar *bundle_ufrag = NULL; gchar *bundle_pwd = NULL; - GArray *reserved_pts = NULL; + GArray *media_mapping = NULL; GHashTable *all_mids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); @@ -3348,6 +3802,7 @@ GList *seen_transceivers = NULL; guint media_idx = 0; int i; + gboolean no_more_mlines = FALSE; gst_sdp_message_new (&ret); @@ -3379,7 +3834,7 @@ GStrv last_bundle = NULL; guint bundle_media_index; - reserved_pts = gather_reserved_pts (webrtc); + media_mapping = gather_media_mapping (webrtc); if (last_offer && _parse_bundle (last_offer, &last_bundle, NULL) && last_bundle && last_bundle0 && _get_bundle_index (last_offer, last_bundle, &bundle_media_index)) { @@ -3408,25 +3863,34 @@ || g_strcmp0 (gst_sdp_media_get_media (last_media), "video") == 0) { const gchar *last_mid; int j; + last_mid = gst_sdp_media_get_attribute_val (last_media, "mid"); for (j = 0; j < webrtc->priv->transceivers->len; j++) { + WebRTCTransceiver *wtrans; + const gchar *mid; + trans = g_ptr_array_index (webrtc->priv->transceivers, j); + wtrans = WEBRTC_TRANSCEIVER (trans); - if (trans->mid && g_strcmp0 (trans->mid, last_mid) == 0) { - GstSDPMedia *media; - const gchar *mid; - WebRTCTransceiver *wtrans = WEBRTC_TRANSCEIVER (trans); + if (trans->mid) + mid = trans->mid; + else + mid = wtrans->pending_mid; + + if (mid && g_strcmp0 (mid, last_mid) == 0) { + GstSDPMedia media; + + memset (&media, 0, sizeof (media)); g_assert (!g_list_find (seen_transceivers, trans)); if (wtrans->mline_locked && trans->mline != media_idx) { g_set_error (error, GST_WEBRTC_ERROR, GST_WEBRTC_ERROR_INTERNAL_FAILURE, - "Previous negotiatied transceiver %" - GST_PTR_FORMAT " with mid %s was in mline %d but transceiver" - " has locked mline %u", trans, trans->mid, media_idx, - trans->mline); + "Previous negotiatied transceiver <%s> with mid %s was in " + "mline %d but transceiver has locked mline %u", + GST_OBJECT_NAME (trans), trans->mid, media_idx, trans->mline); goto cancel_offer; } @@ -3434,30 +3898,37 @@ GST_PTR_FORMAT " with mid %s into media index %u", trans, trans->mid, media_idx); - /* FIXME: deal with format changes */ - gst_sdp_media_copy (last_media, &media); - _media_replace_direction (media, trans->direction); - - mid = gst_sdp_media_get_attribute_val (media, "mid"); - g_assert (mid); + if (webrtc->bundle_policy == GST_WEBRTC_BUNDLE_POLICY_NONE) { + media_mapping = + g_array_new (FALSE, FALSE, + sizeof (struct media_payload_map_item)); + } - if (g_hash_table_contains (all_mids, mid)) { - gst_sdp_media_free (media); - g_set_error (error, GST_WEBRTC_ERROR, - GST_WEBRTC_ERROR_INTERNAL_FAILURE, - "Duplicate mid %s when creating offer", mid); - goto cancel_offer; + gst_sdp_media_init (&media); + if (!sdp_media_from_transceiver (webrtc, &media, last_media, trans, + media_idx, bundled_mids, 0, bundle_ufrag, bundle_pwd, + media_mapping, all_mids, &no_more_mlines, error)) { + gst_sdp_media_uninit (&media); + if (!*error) + g_set_error_literal (error, GST_WEBRTC_ERROR, + GST_WEBRTC_ERROR_INTERNAL_FAILURE, + "Could not reuse transceiver"); } - g_hash_table_insert (all_mids, g_strdup (mid), NULL); + if (webrtc->bundle_policy == GST_WEBRTC_BUNDLE_POLICY_NONE) { + g_array_free (media_mapping, TRUE); + media_mapping = NULL; + } + if (*error) + goto cancel_offer; - if (bundled_mids) - g_string_append_printf (bundled_mids, " %s", mid); + mid = gst_sdp_media_get_attribute_val (&media, "mid"); + g_assert (mid && g_strcmp0 (last_mid, mid) == 0); - gst_sdp_message_add_media (ret, media); + gst_sdp_message_add_media (ret, &media); media_idx++; - gst_sdp_media_free (media); + gst_sdp_media_uninit (&media); seen_transceivers = g_list_prepend (seen_transceivers, trans); break; } @@ -3494,6 +3965,11 @@ } g_hash_table_insert (all_mids, g_strdup (trans->mid), NULL); + } else if (WEBRTC_TRANSCEIVER (trans)->pending_mid && + !g_hash_table_contains (all_mids, + WEBRTC_TRANSCEIVER (trans)->pending_mid)) { + g_hash_table_insert (all_mids, + g_strdup (WEBRTC_TRANSCEIVER (trans)->pending_mid), NULL); } } @@ -3507,9 +3983,11 @@ trans = _find_transceiver_for_mline (webrtc, media_idx); if (trans) { - /* We can't have seen it already, because it is locked to this line */ - g_assert (!g_list_find (seen_transceivers, trans)); - seen_transceivers = g_list_prepend (seen_transceivers, trans); + /* We can't have seen it already, because it is locked to this line, + * unless it's a no-more-mlines case + */ + if (!g_list_find (seen_transceivers, trans)) + seen_transceivers = g_list_prepend (seen_transceivers, trans); } else { /* Otherwise find a free transceiver */ for (i = 0; i < webrtc->priv->transceivers->len; i++) { @@ -3549,6 +4027,15 @@ gst_sdp_media_init (&media); if (_add_data_channel_offer (webrtc, ret, &media, bundled_mids, 0, bundle_ufrag, bundle_pwd, all_mids)) { + if (no_more_mlines) { + g_set_error (error, GST_WEBRTC_ERROR, + GST_WEBRTC_ERROR_INTERNAL_FAILURE, + "Trying to add data channel but there is a" + " transceiver locked to line %d which doesn't have caps", + media_idx); + gst_sdp_media_uninit (&media); + goto cancel_offer; + } gst_sdp_message_add_media (ret, &media); media_idx++; continue; @@ -3570,8 +4057,8 @@ g_set_error (error, GST_WEBRTC_ERROR, GST_WEBRTC_ERROR_INTERNAL_FAILURE, - "Tranceiver %" GST_PTR_FORMAT " with mid %s has locked mline %d" - " but the whole offer only has %u sections", trans, trans->mid, + "Tranceiver <%s> with mid %s has locked mline %d but the offer " + "only has %u sections", GST_OBJECT_NAME (trans), trans->mid, trans->mline, media_idx); goto cancel_offer; } @@ -3579,18 +4066,28 @@ } } + if (no_more_mlines) { + g_set_error (error, GST_WEBRTC_ERROR, + GST_WEBRTC_ERROR_INTERNAL_FAILURE, + "Trying to add transceiver at line %u but there is a transceiver " + "with a locked mline for this line which doesn't have caps", + media_idx); + goto cancel_offer; + } + gst_sdp_media_init (&media); if (webrtc->bundle_policy == GST_WEBRTC_BUNDLE_POLICY_NONE) { - reserved_pts = g_array_new (FALSE, FALSE, sizeof (guint)); + media_mapping = + g_array_new (FALSE, FALSE, sizeof (struct media_payload_map_item)); } GST_LOG_OBJECT (webrtc, "adding transceiver %" GST_PTR_FORMAT " at media " "index %u", trans, media_idx); - if (sdp_media_from_transceiver (webrtc, &media, trans, media_idx, - bundled_mids, 0, bundle_ufrag, bundle_pwd, reserved_pts, all_mids, - error)) { + if (sdp_media_from_transceiver (webrtc, &media, NULL, trans, media_idx, + bundled_mids, 0, bundle_ufrag, bundle_pwd, media_mapping, all_mids, + &no_more_mlines, error)) { /* as per JSEP, a=rtcp-mux-only is only added for new streams */ gst_sdp_media_add_attribute (&media, "rtcp-mux-only", ""); gst_sdp_message_add_media (ret, &media); @@ -3600,16 +4097,16 @@ } if (webrtc->bundle_policy == GST_WEBRTC_BUNDLE_POLICY_NONE) { - g_array_free (reserved_pts, TRUE); - reserved_pts = NULL; + g_array_free (media_mapping, TRUE); + media_mapping = NULL; } if (*error) goto cancel_offer; } if (webrtc->bundle_policy != GST_WEBRTC_BUNDLE_POLICY_NONE) { - g_array_free (reserved_pts, TRUE); - reserved_pts = NULL; + g_array_free (media_mapping, TRUE); + media_mapping = NULL; } webrtc->priv->max_sink_pad_serial = MAX (webrtc->priv->max_sink_pad_serial, @@ -3640,8 +4137,8 @@ } out: - if (reserved_pts) - g_array_free (reserved_pts, TRUE); + if (media_mapping) + g_array_free (media_mapping, TRUE); g_hash_table_unref (all_mids); @@ -3757,6 +4254,7 @@ str = g_strdup_printf ("%u", target_ssrc); gst_structure_set (trans->local_rtx_ssrc_map, str, G_TYPE_UINT, g_random_int (), NULL); + g_free (str); } } } @@ -3979,9 +4477,7 @@ offer_caps = _rtp_caps_from_media (offer_media); if (last_answer && i < gst_sdp_message_medias_len (last_answer) - && (rtp_trans = - _find_transceiver (webrtc, mid, - (FindTransceiverFunc) match_for_mid))) { + && (rtp_trans = _find_transceiver_for_mid (webrtc, mid))) { const GstSDPMedia *last_media = gst_sdp_message_get_media (last_answer, i); const gchar *last_mid = @@ -4107,7 +4603,7 @@ * that we cannot actually support */ if (trans_caps) { answer_caps = gst_caps_intersect (offer_caps, trans_caps); - gst_caps_unref (trans_caps); + gst_clear_caps (&trans_caps); } else { answer_caps = gst_caps_ref (offer_caps); } @@ -4119,23 +4615,28 @@ if (gst_caps_is_empty (answer_caps)) { GST_WARNING_OBJECT (webrtc, "Could not create caps for media"); - gst_caps_unref (answer_caps); - gst_caps_unref (offer_caps); + gst_clear_caps (&answer_caps); + gst_clear_caps (&offer_caps); goto rejected; } - if (!_update_transceiver_kind_from_caps (rtp_trans, answer_caps)) + if (!_update_transceiver_kind_from_caps (rtp_trans, answer_caps)) { + GstWebRTCKind caps_kind = webrtc_kind_from_caps (answer_caps); + GST_WARNING_OBJECT (webrtc, - "Trying to change transceiver %d kind from %d to %d", - rtp_trans->mline, rtp_trans->kind, - webrtc_kind_from_caps (answer_caps)); - - if (!trans->do_nack) { - answer_caps = gst_caps_make_writable (answer_caps); - for (k = 0; k < gst_caps_get_size (answer_caps); k++) { - GstStructure *s = gst_caps_get_structure (answer_caps, k); + "Trying to change kind of transceiver %" GST_PTR_FORMAT + " at m-line %d from %s (%d) to %s (%d)", trans, rtp_trans->mline, + gst_webrtc_kind_to_string (rtp_trans->kind), rtp_trans->kind, + gst_webrtc_kind_to_string (caps_kind), caps_kind); + } + + answer_caps = gst_caps_make_writable (answer_caps); + for (k = 0; k < gst_caps_get_size (answer_caps); k++) { + GstStructure *s = gst_caps_get_structure (answer_caps, k); + /* taken from the offer sdp already and already intersected above */ + gst_structure_remove_field (s, "a-mid"); + if (!trans->do_nack) gst_structure_remove_fields (s, "rtcp-fb-nack", NULL); - } } if (gst_sdp_media_set_media_from_caps (answer_caps, media) != GST_SDP_OK) { @@ -4363,7 +4864,7 @@ static GstWebRTCBinPad * _create_pad_for_sdp_media (GstWebRTCBin * webrtc, GstPadDirection direction, - GstWebRTCRTPTransceiver * trans, guint serial) + GstWebRTCRTPTransceiver * trans, guint serial, char *msid) { GstWebRTCBinPad *pad; gchar *pad_name; @@ -4372,13 +4873,13 @@ if (serial == G_MAXUINT) serial = webrtc->priv->max_sink_pad_serial++; } else { - serial = trans->mline; + serial = webrtc->priv->src_pad_counter++; } pad_name = g_strdup_printf ("%s_%u", direction == GST_PAD_SRC ? "src" : "sink", serial); - pad = gst_webrtc_bin_pad_new (pad_name, direction); + pad = gst_webrtc_bin_pad_new (pad_name, direction, msid); g_free (pad_name); pad->trans = gst_object_ref (trans); @@ -4398,9 +4899,7 @@ const GstSDPAttribute *attr = gst_sdp_media_get_attribute (media, i); if (g_strcmp0 (attr->key, "mid") == 0) { - if ((ret = - _find_transceiver (webrtc, attr->value, - (FindTransceiverFunc) match_for_mid))) + if ((ret = _find_transceiver_for_mid (webrtc, attr->value))) goto out; } } @@ -4416,12 +4915,10 @@ static GstElement * _build_fec_encoder (GstWebRTCBin * webrtc, WebRTCTransceiver * trans) { - GstElement *ret = NULL; - GstElement *prev = NULL; - guint ulpfec_pt = 0; - guint red_pt = 0; - GstPad *sinkpad = NULL; GstWebRTCRTPTransceiver *rtp_trans = GST_WEBRTC_RTP_TRANSCEIVER (trans); + guint ulpfec_pt = 0, red_pt = 0; + GstPad *sinkpad, *srcpad, *ghost; + GstElement *ret; if (trans->stream) { ulpfec_pt = @@ -4429,70 +4926,222 @@ red_pt = transport_stream_get_pt (trans->stream, "RED", rtp_trans->mline); } - if (ulpfec_pt || red_pt) - ret = gst_bin_new (NULL); + if (trans->ulpfecenc || trans->redenc) { + g_critical ("webrtcbin: duplicate call to create a fec encoder or " + "red encoder!"); + return NULL; + } - if (ulpfec_pt) { - GstElement *fecenc = gst_element_factory_make ("rtpulpfecenc", NULL); - GstCaps *caps = transport_stream_get_caps_for_pt (trans->stream, ulpfec_pt); + GST_DEBUG_OBJECT (webrtc, + "Creating ULPFEC encoder for mline %u with pt %d", rtp_trans->mline, + ulpfec_pt); + + ret = gst_bin_new (NULL); + + trans->ulpfecenc = gst_element_factory_make ("rtpulpfecenc", NULL); + gst_object_ref_sink (trans->ulpfecenc); + if (!gst_bin_add (GST_BIN (ret), trans->ulpfecenc)) + g_warn_if_reached (); + sinkpad = gst_element_get_static_pad (trans->ulpfecenc, "sink"); - GST_DEBUG_OBJECT (webrtc, - "Creating ULPFEC encoder for mline %u with pt %d", rtp_trans->mline, - ulpfec_pt); + g_object_bind_property (rtp_trans, "fec-percentage", trans->ulpfecenc, + "percentage", G_BINDING_DEFAULT); + + trans->redenc = gst_element_factory_make ("rtpredenc", NULL); + gst_object_ref_sink (trans->redenc); + + GST_DEBUG_OBJECT (webrtc, "Creating RED encoder for mline %u with pt %d", + rtp_trans->mline, red_pt); + + gst_bin_add (GST_BIN (ret), trans->redenc); + gst_element_link (trans->ulpfecenc, trans->redenc); + + ghost = gst_ghost_pad_new ("sink", sinkpad); + gst_clear_object (&sinkpad); + gst_element_add_pad (ret, ghost); + ghost = NULL; + + srcpad = gst_element_get_static_pad (trans->redenc, "src"); + ghost = gst_ghost_pad_new ("src", srcpad); + gst_clear_object (&srcpad); + gst_element_add_pad (ret, ghost); + ghost = NULL; + + return ret; +} + +static gboolean +_merge_structure (GQuark field_id, const GValue * value, gpointer user_data) +{ + GstStructure *s = user_data; + + gst_structure_id_set_value (s, field_id, value); + + return TRUE; +} + +#define GST_WEBRTC_PAYLOAD_TYPE "gst.webrtcbin.payload.type" + +static void +try_match_transceiver_with_fec_decoder (GstWebRTCBin * webrtc, + WebRTCTransceiver * trans) +{ + GList *l; - gst_bin_add (GST_BIN (ret), fecenc); - sinkpad = gst_element_get_static_pad (fecenc, "sink"); - g_object_set (fecenc, "pt", ulpfec_pt, "percentage", - trans->fec_percentage, NULL); + for (l = trans->stream->fecdecs; l; l = l->next) { + GstElement *fecdec = GST_ELEMENT (l->data); + gboolean found_transceiver = FALSE; + int original_pt; + guint i; - g_object_bind_property (rtp_trans, "fec-percentage", fecenc, "percentage", - G_BINDING_BIDIRECTIONAL); + original_pt = + GPOINTER_TO_INT (g_object_get_data (G_OBJECT (fecdec), + GST_WEBRTC_PAYLOAD_TYPE)); + if (original_pt <= 0) { + GST_WARNING_OBJECT (trans, "failed to match fec decoder with " + "transceiver, fec decoder %" GST_PTR_FORMAT " does not contain a " + "valid payload type", fecdec); + continue; + } - if (caps && !gst_caps_is_empty (caps)) { - const GstStructure *s = gst_caps_get_structure (caps, 0); - const gchar *media = gst_structure_get_string (s, "media"); + for (i = 0; i < trans->stream->ptmap->len; i++) { + PtMapItem *item = &g_array_index (trans->stream->ptmap, PtMapItem, i); - if (!g_strcmp0 (media, "video")) - g_object_set (fecenc, "multipacket", TRUE, NULL); + /* FIXME: this only works for a 1-1 original_pt->fec_pt mapping */ + if (original_pt == item->pt && item->media_idx != -1 + && item->media_idx == trans->parent.mline) { + if (trans->ulpfecdec) { + GST_FIXME_OBJECT (trans, "cannot"); + gst_clear_object (&trans->ulpfecdec); + } + trans->ulpfecdec = gst_object_ref (fecdec); + found_transceiver = TRUE; + break; + } } - prev = fecenc; + if (!found_transceiver) { + GST_WARNING_OBJECT (trans, "failed to match fec decoder with " + "transceiver"); + } } +} - if (red_pt) { - GstElement *redenc = gst_element_factory_make ("rtpredenc", NULL); +static void +_set_internal_rtpbin_element_props_from_stream (GstWebRTCBin * webrtc, + TransportStream * stream) +{ + GstStructure *merged_local_rtx_ssrc_map; + GstStructure *pt_map = gst_structure_new_empty ("application/x-rtp-pt-map"); + GValue red_pt_array = { 0, }; + gint *rtx_pt; + gsize rtx_count; + gsize i; - GST_DEBUG_OBJECT (webrtc, "Creating RED encoder for mline %u with pt %d", - rtp_trans->mline, red_pt); + gst_value_array_init (&red_pt_array, 0); - gst_bin_add (GST_BIN (ret), redenc); - if (prev) - gst_element_link (prev, redenc); - else - sinkpad = gst_element_get_static_pad (redenc, "sink"); + rtx_pt = transport_stream_get_all_pt (stream, "RTX", &rtx_count); + GST_DEBUG_OBJECT (stream, "have %" G_GSIZE_FORMAT " rtx payloads", rtx_count); - g_object_set (redenc, "pt", red_pt, "allow-no-red-blocks", TRUE, NULL); + for (i = 0; i < rtx_count; i++) { + GstCaps *rtx_caps = transport_stream_get_caps_for_pt (stream, rtx_pti); + const GstStructure *s = gst_caps_get_structure (rtx_caps, 0); + const gchar *apt = gst_structure_get_string (s, "apt"); - prev = redenc; + GST_LOG_OBJECT (stream, "setting rtx mapping: %s -> %u", apt, rtx_pti); + gst_structure_set (pt_map, apt, G_TYPE_UINT, rtx_pti, NULL); } - if (sinkpad) { - GstPad *ghost = gst_ghost_pad_new ("sink", sinkpad); - gst_object_unref (sinkpad); - gst_element_add_pad (ret, ghost); + GST_DEBUG_OBJECT (stream, "setting payload map on %" GST_PTR_FORMAT " : %" + GST_PTR_FORMAT " and %" GST_PTR_FORMAT, stream->rtxreceive, + stream->rtxsend, pt_map); + + if (stream->rtxreceive) + g_object_set (stream->rtxreceive, "payload-type-map", pt_map, NULL); + if (stream->rtxsend) + g_object_set (stream->rtxsend, "payload-type-map", pt_map, NULL); + + gst_structure_free (pt_map); + g_clear_pointer (&rtx_pt, g_free); + + merged_local_rtx_ssrc_map = + gst_structure_new_empty ("application/x-rtp-ssrc-map"); + + for (i = 0; i < webrtc->priv->transceivers->len; i++) { + GstWebRTCRTPTransceiver *rtp_trans = + g_ptr_array_index (webrtc->priv->transceivers, i); + WebRTCTransceiver *trans = WEBRTC_TRANSCEIVER (rtp_trans); + + if (trans->stream == stream) { + gint ulpfec_pt, red_pt = 0; + + ulpfec_pt = transport_stream_get_pt (stream, "ULPFEC", rtp_trans->mline); + if (ulpfec_pt <= 0) + ulpfec_pt = 0; + + red_pt = transport_stream_get_pt (stream, "RED", rtp_trans->mline); + if (red_pt <= 0) { + red_pt = -1; + } else { + GValue ptval = { 0, }; + + g_value_init (&ptval, G_TYPE_INT); + g_value_set_int (&ptval, red_pt); + gst_value_array_append_value (&red_pt_array, &ptval); + g_value_unset (&ptval); + } + + GST_DEBUG_OBJECT (webrtc, "stream %" GST_PTR_FORMAT " transceiver %" + GST_PTR_FORMAT " has FEC payload %d and RED payload %d", stream, + trans, ulpfec_pt, red_pt); + + if (trans->ulpfecenc) { + guint ulpfecenc_pt = ulpfec_pt; + + if (ulpfecenc_pt == 0) + ulpfecenc_pt = 255; + + g_object_set (trans->ulpfecenc, "pt", ulpfecenc_pt, "multipacket", + rtp_trans->kind == GST_WEBRTC_KIND_VIDEO, "percentage", + trans->fec_percentage, NULL); + } + + try_match_transceiver_with_fec_decoder (webrtc, trans); + if (trans->ulpfecdec) { + g_object_set (trans->ulpfecdec, "passthrough", ulpfec_pt == 0, "pt", + ulpfec_pt, NULL); + } + + if (trans->redenc) { + gboolean always_produce = TRUE; + if (red_pt == -1) { + /* passthrough settings */ + red_pt = 0; + always_produce = FALSE; + } + g_object_set (trans->redenc, "pt", red_pt, "allow-no-red-blocks", + always_produce, NULL); + } + + if (trans->local_rtx_ssrc_map) { + gst_structure_foreach (trans->local_rtx_ssrc_map, + _merge_structure, merged_local_rtx_ssrc_map); + } + } } - if (prev) { - GstPad *srcpad = gst_element_get_static_pad (prev, "src"); - GstPad *ghost = gst_ghost_pad_new ("src", srcpad); - gst_object_unref (srcpad); - gst_element_add_pad (ret, ghost); + if (stream->rtxsend) + g_object_set (stream->rtxsend, "ssrc-map", merged_local_rtx_ssrc_map, NULL); + gst_clear_structure (&merged_local_rtx_ssrc_map); + + if (stream->reddec) { + g_object_set_property (G_OBJECT (stream->reddec), "payloads", + &red_pt_array); } - return ret; + g_value_unset (&red_pt_array); } - static GstPad * _connect_input_stream (GstWebRTCBin * webrtc, GstWebRTCBinPad * pad) { @@ -4548,20 +5197,25 @@ gst_element_sync_state_with_parent (clocksync); srcpad = gst_element_get_static_pad (clocksync, "src"); - sinkpad = gst_element_get_static_pad (clocksync, "sink"); - if ((fec_encoder = _build_fec_encoder (webrtc, trans))) { - GstPad *fec_sink; + fec_encoder = _build_fec_encoder (webrtc, trans); + if (!fec_encoder) { + g_warn_if_reached (); + return NULL; + } - gst_bin_add (GST_BIN (webrtc), fec_encoder); - gst_element_sync_state_with_parent (fec_encoder); + _set_internal_rtpbin_element_props_from_stream (webrtc, trans->stream); - fec_sink = gst_element_get_static_pad (fec_encoder, "sink"); - gst_pad_link (srcpad, fec_sink); - gst_object_unref (srcpad); - gst_object_unref (fec_sink); - srcpad = gst_element_get_static_pad (fec_encoder, "src"); - } + gst_bin_add (GST_BIN (webrtc), fec_encoder); + gst_element_sync_state_with_parent (fec_encoder); + + sinkpad = gst_element_get_static_pad (fec_encoder, "sink"); + if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK) + g_warn_if_reached (); + gst_clear_object (&srcpad); + gst_clear_object (&sinkpad); + sinkpad = gst_element_get_static_pad (clocksync, "sink"); + srcpad = gst_element_get_static_pad (fec_encoder, "src"); if (!webrtc->rtpfunnel) { rtp_templ = @@ -4576,8 +5230,6 @@ gst_pad_link (srcpad, rtp_sink); gst_object_unref (rtp_sink); - gst_ghost_pad_set_target (GST_GHOST_PAD (pad), sinkpad); - pad_name = g_strdup_printf ("send_rtp_src_%u", pad->trans->mline); if (!gst_element_link_pads (GST_ELEMENT (webrtc->rtpbin), pad_name, GST_ELEMENT (trans->stream->send_bin), "rtp_sink")) @@ -4589,14 +5241,15 @@ gst_element_request_pad_simple (webrtc->rtpfunnel, pad_name); gst_pad_link (srcpad, funnel_sinkpad); - gst_ghost_pad_set_target (GST_GHOST_PAD (pad), sinkpad); g_free (pad_name); gst_object_unref (funnel_sinkpad); } - gst_object_unref (srcpad); - gst_object_unref (sinkpad); + gst_ghost_pad_set_target (GST_GHOST_PAD (pad), sinkpad); + + gst_clear_object (&srcpad); + gst_clear_object (&sinkpad); gst_element_sync_state_with_parent (GST_ELEMENT (trans->stream->send_bin)); @@ -4752,38 +5405,106 @@ return TRUE; } +static guint +transport_stream_ptmap_get_rtp_header_extension_id (TransportStream * stream, + const char *rtphdrext_uri) +{ + guint i; + + for (i = 0; i < stream->ptmap->len; i++) { + PtMapItem *item = &g_array_index (stream->ptmap, PtMapItem, i); + guint id; + + id = caps_get_rtp_header_extension_id (item->caps, rtphdrext_uri); + if (id != -1) + return id; + } + + return -1; +} + static void -_set_rtx_ptmap_from_stream (GstWebRTCBin * webrtc, TransportStream * stream) +ensure_rtx_hdr_ext (TransportStream * stream) { - gint *rtx_pt; - gsize rtx_count; + stream->rtphdrext_id_stream_id = + transport_stream_ptmap_get_rtp_header_extension_id (stream, + RTPHDREXT_STREAM_ID); + stream->rtphdrext_id_repaired_stream_id = + transport_stream_ptmap_get_rtp_header_extension_id (stream, + RTPHDREXT_REPAIRED_STREAM_ID); - rtx_pt = transport_stream_get_all_pt (stream, "RTX", &rtx_count); - GST_LOG_OBJECT (stream, "have %" G_GSIZE_FORMAT " rtx payloads", rtx_count); - if (rtx_pt) { - GstStructure *pt_map = gst_structure_new_empty ("application/x-rtp-pt-map"); - gsize i; - - for (i = 0; i < rtx_count; i++) { - GstCaps *rtx_caps = transport_stream_get_caps_for_pt (stream, rtx_pti); - const GstStructure *s = gst_caps_get_structure (rtx_caps, 0); - const gchar *apt = gst_structure_get_string (s, "apt"); - - GST_LOG_OBJECT (stream, "setting rtx mapping: %s -> %u", apt, rtx_pti); - gst_structure_set (pt_map, apt, G_TYPE_UINT, rtx_pti, NULL); - } - - GST_DEBUG_OBJECT (stream, "setting payload map on %" GST_PTR_FORMAT " : %" - GST_PTR_FORMAT " and %" GST_PTR_FORMAT, stream->rtxreceive, - stream->rtxsend, pt_map); - - if (stream->rtxreceive) - g_object_set (stream->rtxreceive, "payload-type-map", pt_map, NULL); - if (stream->rtxsend) - g_object_set (stream->rtxsend, "payload-type-map", pt_map, NULL); + /* TODO: removing header extensions usage from rtx on renegotiation */ + + if (stream->rtxsend) { + if (stream->rtphdrext_id_stream_id != -1 && !stream->rtxsend_stream_id) { + stream->rtxsend_stream_id = + gst_rtp_header_extension_create_from_uri (RTPHDREXT_STREAM_ID); + if (!stream->rtxsend_stream_id) + g_warn_if_reached (); + gst_rtp_header_extension_set_id (stream->rtxsend_stream_id, + stream->rtphdrext_id_stream_id); + + GST_DEBUG_OBJECT (stream, "adding rtp header extension %" GST_PTR_FORMAT + " with id %u to %" GST_PTR_FORMAT, stream->rtxsend_stream_id, + stream->rtphdrext_id_stream_id, stream->rtxsend); + + g_signal_emit_by_name (stream->rtxsend, "add-extension", + stream->rtxsend_stream_id); + } + + if (stream->rtphdrext_id_repaired_stream_id != -1 + && !stream->rtxsend_repaired_stream_id) { + stream->rtxsend_repaired_stream_id = + gst_rtp_header_extension_create_from_uri + (RTPHDREXT_REPAIRED_STREAM_ID); + if (!stream->rtxsend_repaired_stream_id) + g_warn_if_reached (); + gst_rtp_header_extension_set_id (stream->rtxsend_repaired_stream_id, + stream->rtphdrext_id_repaired_stream_id); + + GST_DEBUG_OBJECT (stream, "adding rtp header extension %" GST_PTR_FORMAT + " with id %u to %" GST_PTR_FORMAT, stream->rtxsend_repaired_stream_id, + stream->rtphdrext_id_repaired_stream_id, stream->rtxsend); + + g_signal_emit_by_name (stream->rtxsend, "add-extension", + stream->rtxsend_repaired_stream_id); + } + } + + if (stream->rtxreceive) { + if (stream->rtphdrext_id_stream_id != -1 && !stream->rtxreceive_stream_id) { + stream->rtxreceive_stream_id = + gst_rtp_header_extension_create_from_uri (RTPHDREXT_STREAM_ID); + if (!stream->rtxreceive_stream_id) + g_warn_if_reached (); + gst_rtp_header_extension_set_id (stream->rtxreceive_stream_id, + stream->rtphdrext_id_stream_id); + + GST_DEBUG_OBJECT (stream, "adding rtp header extension %" GST_PTR_FORMAT + " with id %u to %" GST_PTR_FORMAT, stream->rtxsend_stream_id, + stream->rtphdrext_id_stream_id, stream->rtxreceive); + + g_signal_emit_by_name (stream->rtxreceive, "add-extension", + stream->rtxreceive_stream_id); + } + + if (stream->rtphdrext_id_repaired_stream_id != -1 + && !stream->rtxreceive_repaired_stream_id) { + stream->rtxreceive_repaired_stream_id = + gst_rtp_header_extension_create_from_uri + (RTPHDREXT_REPAIRED_STREAM_ID); + if (!stream->rtxreceive_repaired_stream_id) + g_warn_if_reached (); + gst_rtp_header_extension_set_id (stream->rtxreceive_repaired_stream_id, + stream->rtphdrext_id_repaired_stream_id); + + GST_DEBUG_OBJECT (stream, "adding rtp header extension %" GST_PTR_FORMAT + " with id %u to %" GST_PTR_FORMAT, stream->rtxsend_repaired_stream_id, + stream->rtphdrext_id_repaired_stream_id, stream->rtxreceive); - gst_structure_free (pt_map); - g_free (rtx_pt); + g_signal_emit_by_name (stream->rtxreceive, "add-extension", + stream->rtxreceive_repaired_stream_id); + } } } @@ -4866,25 +5587,34 @@ WebRTCTransceiver *trans = WEBRTC_TRANSCEIVER (rtp_trans); GstWebRTCRTPTransceiverDirection prev_dir = rtp_trans->current_direction; GstWebRTCRTPTransceiverDirection new_dir; + const GstSDPMedia *local_media, *remote_media; const GstSDPMedia *media = gst_sdp_message_get_media (sdp, media_idx); GstWebRTCDTLSSetup new_setup; + char *local_msid = NULL; gboolean new_rtcp_rsize; ReceiveState receive_state = RECEIVE_STATE_UNSET; int i; + local_media = + gst_sdp_message_get_media (webrtc->current_local_description->sdp, + media_idx); + remote_media = + gst_sdp_message_get_media (webrtc->current_remote_description->sdp, + media_idx); + rtp_trans->mline = media_idx; if (!g_strcmp0 (gst_sdp_media_get_media (media), "audio")) { if (rtp_trans->kind == GST_WEBRTC_KIND_VIDEO) - GST_FIXME_OBJECT (webrtc, - "Updating video transceiver to audio, which isn't fully supported."); + GST_FIXME_OBJECT (webrtc, "Updating video transceiver %" GST_PTR_FORMAT + " to audio, which isn't fully supported.", rtp_trans); rtp_trans->kind = GST_WEBRTC_KIND_AUDIO; } if (!g_strcmp0 (gst_sdp_media_get_media (media), "video")) { if (rtp_trans->kind == GST_WEBRTC_KIND_AUDIO) - GST_FIXME_OBJECT (webrtc, - "Updating audio transceiver to video, which isn't fully supported."); + GST_FIXME_OBJECT (webrtc, "Updating audio transceiver %" GST_PTR_FORMAT + " to video, which isn't fully supported.", rtp_trans); rtp_trans->kind = GST_WEBRTC_KIND_VIDEO; } @@ -4898,17 +5628,9 @@ } { - const GstSDPMedia *local_media, *remote_media; GstWebRTCRTPTransceiverDirection local_dir, remote_dir; GstWebRTCDTLSSetup local_setup, remote_setup; - local_media = - gst_sdp_message_get_media (webrtc->current_local_description->sdp, - media_idx); - remote_media = - gst_sdp_message_get_media (webrtc->current_remote_description->sdp, - media_idx); - local_setup = _get_dtls_setup_from_media (local_media); remote_setup = _get_dtls_setup_from_media (remote_media); new_setup = _get_final_setup (local_setup, remote_setup); @@ -4970,22 +5692,12 @@ } if (new_dir != prev_dir) { - gchar *prev_dir_s, *new_dir_s; - - prev_dir_s = - _enum_value_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION, - prev_dir); - new_dir_s = - _enum_value_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION, - new_dir); + guint rtp_session_id = bundled ? bundle_idx : media_idx; GST_DEBUG_OBJECT (webrtc, "transceiver %" GST_PTR_FORMAT - " direction change from %s to %s", rtp_trans, prev_dir_s, new_dir_s); - - g_free (prev_dir_s); - prev_dir_s = NULL; - g_free (new_dir_s); - new_dir_s = NULL; + " direction change from %s to %s", rtp_trans, + gst_webrtc_rtp_transceiver_direction_to_string (prev_dir), + gst_webrtc_rtp_transceiver_direction_to_string (new_dir)); if (new_dir == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_INACTIVE) { GstWebRTCBinPad *pad; @@ -5011,15 +5723,30 @@ new_dir == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDRECV) { GstWebRTCBinPad *pad = _find_pad_for_transceiver (webrtc, GST_PAD_SINK, rtp_trans); + local_msid = _get_msid_from_media (local_media); + if (pad) { GST_DEBUG_OBJECT (webrtc, "found existing send pad %" GST_PTR_FORMAT - " for transceiver %" GST_PTR_FORMAT, pad, trans); + " for transceiver %" GST_PTR_FORMAT " with msid \'%s\'", pad, trans, + pad->msid); + if (g_strcmp0 (pad->msid, local_msid) != 0) { + GST_DEBUG_OBJECT (webrtc, "send pad %" GST_PTR_FORMAT + " transceiver %" GST_PTR_FORMAT " changing msid from \'%s\'" + " to \'%s\'", pad, trans, pad->msid, local_msid); + g_clear_pointer (&pad->msid, g_free); + pad->msid = local_msid; + g_object_notify (G_OBJECT (pad), "msid"); + local_msid = NULL; + } else { + g_clear_pointer (&local_msid, g_free); + } gst_object_unref (pad); } else { GST_DEBUG_OBJECT (webrtc, "creating new send pad for transceiver %" GST_PTR_FORMAT, trans); pad = _create_pad_for_sdp_media (webrtc, GST_PAD_SINK, rtp_trans, - G_MAXUINT); + G_MAXUINT, local_msid); + local_msid = NULL; _connect_input_stream (webrtc, pad); _add_pad (webrtc, pad); } @@ -5028,33 +5755,45 @@ new_dir == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDRECV) { GstWebRTCBinPad *pad = _find_pad_for_transceiver (webrtc, GST_PAD_SRC, rtp_trans); + char *remote_msid = _get_msid_from_media (remote_media); + if (pad) { GST_DEBUG_OBJECT (webrtc, "found existing receive pad %" GST_PTR_FORMAT - " for transceiver %" GST_PTR_FORMAT, pad, trans); + " for transceiver %" GST_PTR_FORMAT " with msid \'%s\'", pad, trans, + pad->msid); + if (g_strcmp0 (pad->msid, remote_msid) != 0) { + GST_DEBUG_OBJECT (webrtc, "receive pad %" GST_PTR_FORMAT + " transceiver %" GST_PTR_FORMAT " changing msid from \'%s\'" + " to \'%s\'", pad, trans, pad->msid, remote_msid); + g_clear_pointer (&pad->msid, g_free); + pad->msid = remote_msid; + remote_msid = NULL; + g_object_notify (G_OBJECT (pad), "msid"); + } else { + g_clear_pointer (&remote_msid, g_free); + } gst_object_unref (pad); } else { GST_DEBUG_OBJECT (webrtc, "creating new receive pad for transceiver %" GST_PTR_FORMAT, trans); pad = _create_pad_for_sdp_media (webrtc, GST_PAD_SRC, rtp_trans, - G_MAXUINT); + G_MAXUINT, remote_msid); + remote_msid = NULL; if (!trans->stream) { TransportStream *item; item = - _get_or_create_transport_stream (webrtc, - bundled ? bundle_idx : media_idx, FALSE); + _get_or_create_transport_stream (webrtc, rtp_session_id, FALSE); webrtc_transceiver_set_transport (trans, item); } - _connect_output_stream (webrtc, trans->stream, - bundled ? bundle_idx : media_idx); + _connect_output_stream (webrtc, trans->stream, rtp_session_id); /* delay adding the pad until rtpbin creates the recv output pad * to ghost to so queries/events travel through the pipeline correctly * as soon as the pad is added */ _add_pad_to_list (webrtc, pad); } - } rtp_trans->mline = media_idx; @@ -5063,7 +5802,7 @@ if (!bundled || bundle_idx == media_idx) { if (stream->rtxsend || stream->rtxreceive) { - _set_rtx_ptmap_from_stream (webrtc, stream); + _set_internal_rtpbin_element_props_from_stream (webrtc, stream); } g_object_set (stream, "dtls-client", @@ -5110,7 +5849,7 @@ } /* client must generate even ids, server must generate odd ids */ - if (new_id % 2 == ! !is_client) + if (new_id % 2 == !(!is_client)) continue; channel = _find_data_channel_for_id (webrtc, new_id); @@ -5239,10 +5978,9 @@ _connect_rtpfunnel (GstWebRTCBin * webrtc, guint session_id) { gchar *pad_name; - GstPad *queue_srcpad; + GstPad *srcpad; GstPad *rtp_sink; TransportStream *stream = _find_transport_for_session (webrtc, session_id); - GstElement *queue; g_assert (stream); @@ -5253,19 +5991,14 @@ gst_bin_add (GST_BIN (webrtc), webrtc->rtpfunnel); gst_element_sync_state_with_parent (webrtc->rtpfunnel); - queue = gst_element_factory_make ("queue", NULL); - gst_bin_add (GST_BIN (webrtc), queue); - gst_element_sync_state_with_parent (queue); - - gst_element_link (webrtc->rtpfunnel, queue); - - queue_srcpad = gst_element_get_static_pad (queue, "src"); + srcpad = gst_element_get_static_pad (webrtc->rtpfunnel, "src"); pad_name = g_strdup_printf ("send_rtp_sink_%d", session_id); rtp_sink = gst_element_request_pad_simple (webrtc->rtpbin, pad_name); g_free (pad_name); - gst_pad_link (queue_srcpad, rtp_sink); - gst_object_unref (queue_srcpad); + + gst_pad_link (srcpad, rtp_sink); + gst_object_unref (srcpad); gst_object_unref (rtp_sink); pad_name = g_strdup_printf ("send_rtp_src_%d", session_id); @@ -5315,6 +6048,7 @@ * parameters aren't set up properly for the bundled streams */ _update_transport_ptmap_from_media (webrtc, bundle_stream, sdp->sdp, i); } + ensure_rtx_hdr_ext (bundle_stream); _connect_rtpfunnel (webrtc, bundle_idx); } @@ -5343,6 +6077,7 @@ * bundling we need to do it now */ g_array_set_size (stream->ptmap, 0); _update_transport_ptmap_from_media (webrtc, stream, sdp->sdp, i); + ensure_rtx_hdr_ext (stream); } if (trans) @@ -5462,7 +6197,9 @@ rtp_trans->kind != GST_WEBRTC_KIND_AUDIO) { g_set_error (error, GST_WEBRTC_ERROR, GST_WEBRTC_ERROR_INTERNAL_FAILURE, - "m-line %d was locked to audio, but SDP has %s media", i, + "m-line %d with transceiver <%s> was locked to %s, but SDP has " + "%s media", i, GST_OBJECT_NAME (rtp_trans), + gst_webrtc_kind_to_string (rtp_trans->kind), gst_sdp_media_get_media (media)); return FALSE; } @@ -5471,7 +6208,9 @@ rtp_trans->kind != GST_WEBRTC_KIND_VIDEO) { g_set_error (error, GST_WEBRTC_ERROR, GST_WEBRTC_ERROR_INTERNAL_FAILURE, - "m-line %d was locked to video, but SDP has %s media", i, + "m-line %d with transceiver <%s> was locked to %s, but SDP has " + "%s media", i, GST_OBJECT_NAME (rtp_trans), + gst_webrtc_kind_to_string (rtp_trans->kind), gst_sdp_media_get_media (media)); return FALSE; } @@ -5553,17 +6292,15 @@ guint i; { - gchar *state = _enum_value_to_string (GST_TYPE_WEBRTC_SIGNALING_STATE, + const gchar *state = _enum_value_to_string (GST_TYPE_WEBRTC_SIGNALING_STATE, webrtc->signaling_state); - gchar *type_str = + const gchar *type_str = _enum_value_to_string (GST_TYPE_WEBRTC_SDP_TYPE, sd->sdp->type); gchar *sdp_text = gst_sdp_message_as_text (sd->sdp->sdp); GST_INFO_OBJECT (webrtc, "Attempting to set %s %s in the %s state", _sdp_source_to_string (sd->source), type_str, state); GST_TRACE_OBJECT (webrtc, "SDP contents\n%s", sdp_text); g_free (sdp_text); - g_free (state); - g_free (type_str); } if (!validate_sdp (webrtc->signaling_state, sd->source, sd->sdp, &error)) @@ -5814,10 +6551,11 @@ const GstSDPMedia *media = gst_sdp_message_get_media (sd->sdp->sdp, i); gchar *ufrag, *pwd; TransportStream *item; + guint rtp_session_id = bundled ? bundle_idx : i; item = - _get_or_create_transport_stream (webrtc, bundled ? bundle_idx : i, - _message_media_is_datachannel (sd->sdp->sdp, bundled ? bundle_idx : i)); + _get_or_create_transport_stream (webrtc, rtp_session_id, + _message_media_is_datachannel (sd->sdp->sdp, rtp_session_id)); if (sd->source == SDP_REMOTE) { guint j; @@ -5831,7 +6569,11 @@ if (split0 && sscanf (split0, "%u", &ssrc) && split1 && g_str_has_prefix (split1, "cname:")) { - g_ptr_array_add (item->remote_ssrcmap, ssrcmap_item_new (ssrc, i)); + if (!find_mid_ssrc_for_ssrc (webrtc, + GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY, + rtp_session_id, ssrc)) + transport_stream_add_ssrc_map_item (item, + GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY, ssrc, i); } g_strfreev (split); } @@ -5895,18 +6637,15 @@ * signalingstatechange at connection. */ if (signalling_state_changed) { - gchar *from = _enum_value_to_string (GST_TYPE_WEBRTC_SIGNALING_STATE, + const gchar *from = _enum_value_to_string (GST_TYPE_WEBRTC_SIGNALING_STATE, webrtc->signaling_state); - gchar *to = _enum_value_to_string (GST_TYPE_WEBRTC_SIGNALING_STATE, + const gchar *to = _enum_value_to_string (GST_TYPE_WEBRTC_SIGNALING_STATE, new_signaling_state); GST_TRACE_OBJECT (webrtc, "notify signaling-state from %s " "to %s", from, to); PC_UNLOCK (webrtc); g_object_notify (G_OBJECT (webrtc), "signaling-state"); PC_LOCK (webrtc); - - g_free (from); - g_free (to); } if (webrtc->signaling_state == GST_WEBRTC_SIGNALING_STATE_STABLE) { @@ -6417,11 +7156,14 @@ return ret; } - gst_bin_add (GST_BIN (webrtc), ret->appsrc); - gst_bin_add (GST_BIN (webrtc), ret->appsink); + g_signal_emit (webrtc, gst_webrtc_bin_signalsPREPARE_DATA_CHANNEL_SIGNAL, 0, + ret, TRUE); + + gst_bin_add (GST_BIN (webrtc), ret->src_bin); + gst_bin_add (GST_BIN (webrtc), ret->sink_bin); - gst_element_sync_state_with_parent (ret->appsrc); - gst_element_sync_state_with_parent (ret->appsink); + gst_element_sync_state_with_parent (ret->src_bin); + gst_element_sync_state_with_parent (ret->sink_bin); ret = gst_object_ref (ret); ret->webrtcbin = webrtc; @@ -6454,13 +7196,12 @@ GST_TRACE_OBJECT (webrtc, "new rtpbin pad %s", new_pad_name); if (g_str_has_prefix (new_pad_name, "recv_rtp_src_")) { guint32 session_id = 0, ssrc = 0, pt = 0; - GstWebRTCRTPTransceiver *rtp_trans; + SsrcMapItem *mid_entry; + GstWebRTCRTPTransceiver *rtp_trans = NULL; WebRTCTransceiver *trans; TransportStream *stream; GstWebRTCBinPad *pad; - guint media_idx = 0; - gboolean found_ssrc = FALSE; - guint i; + guint media_idx; if (sscanf (new_pad_name, "recv_rtp_src_%u_%u_%u", &session_id, &ssrc, &pt) != 3) { @@ -6468,44 +7209,70 @@ return; } + media_idx = session_id; + + PC_LOCK (webrtc); stream = _find_transport_for_session (webrtc, session_id); if (!stream) g_warn_if_reached (); - media_idx = session_id; - - for (i = 0; i < stream->remote_ssrcmap->len; i++) { - SsrcMapItem *item = g_ptr_array_index (stream->remote_ssrcmap, i); - if (item->ssrc == ssrc) { - media_idx = item->media_idx; - found_ssrc = TRUE; - break; + mid_entry = + find_mid_ssrc_for_ssrc (webrtc, + GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY, session_id, ssrc); + + if (mid_entry) { + if (mid_entry->mid) { + /* Can't use the mid_entry if the mid doesn't exist */ + rtp_trans = _find_transceiver_for_mid (webrtc, mid_entry->mid); + if (rtp_trans) { + g_assert_cmpint (rtp_trans->mline, ==, mid_entry->media_idx); + } } - } - if (!found_ssrc) { + if (mid_entry->media_idx != -1) + media_idx = mid_entry->media_idx; + } else { GST_WARNING_OBJECT (webrtc, "Could not find ssrc %u", ssrc); + /* TODO: connect up to fakesink and reconnect later when this information + * is known from RTCP SDES or RTP Header extension + */ } - rtp_trans = _find_transceiver_for_mline (webrtc, media_idx); + if (!rtp_trans) + rtp_trans = _find_transceiver_for_mline (webrtc, media_idx); if (!rtp_trans) g_warn_if_reached (); trans = WEBRTC_TRANSCEIVER (rtp_trans); g_assert (trans->stream == stream); pad = _find_pad_for_transceiver (webrtc, GST_PAD_SRC, rtp_trans); - GST_TRACE_OBJECT (webrtc, "found pad %" GST_PTR_FORMAT " for rtpbin pad name %s", pad, new_pad_name); + if (!_remove_pending_pad (webrtc, pad)) { + /* assumption here is that rtpbin doesn't duplicate pads and that if + * there is no pending pad, this is a duplicate stream for e.g. simulcast + * or somesuch */ + gst_clear_object (&pad); + pad = + _create_pad_for_sdp_media (webrtc, GST_PAD_SRC, rtp_trans, G_MAXUINT, + NULL); + GST_TRACE_OBJECT (webrtc, + "duplicate output ssrc? created new pad %" GST_PTR_FORMAT " for %" + GST_PTR_FORMAT " for rtp pad %s", pad, rtp_trans, new_pad_name); + gst_object_ref_sink (pad); + } + if (!pad) g_warn_if_reached (); gst_ghost_pad_set_target (GST_GHOST_PAD (pad), GST_PAD (new_pad)); if (webrtc->priv->running) gst_pad_set_active (GST_PAD (pad), TRUE); + + PC_UNLOCK (webrtc); + gst_pad_sticky_events_foreach (new_pad, copy_sticky_events, pad); gst_element_add_pad (GST_ELEMENT (webrtc), GST_PAD (pad)); - _remove_pending_pad (webrtc, pad); gst_object_unref (pad); } @@ -6523,6 +7290,7 @@ GST_DEBUG_OBJECT (webrtc, "getting pt map for pt %d in session %d", pt, session_id); + PC_LOCK (webrtc); stream = _find_transport_for_session (webrtc, session_id); if (!stream) goto unknown_session; @@ -6530,94 +7298,119 @@ if ((ret = transport_stream_get_caps_for_pt (stream, pt))) gst_caps_ref (ret); - GST_TRACE_OBJECT (webrtc, "Found caps %" GST_PTR_FORMAT " for pt %d in " + GST_DEBUG_OBJECT (webrtc, "Found caps %" GST_PTR_FORMAT " for pt %d in " "session %d", ret, pt, session_id); + PC_UNLOCK (webrtc); return ret; unknown_session: { + PC_UNLOCK (webrtc); GST_DEBUG_OBJECT (webrtc, "unknown session %d", session_id); return NULL; } } -static gboolean -_merge_structure (GQuark field_id, const GValue * value, gpointer user_data) -{ - GstStructure *s = user_data; - - gst_structure_id_set_value (s, field_id, value); - - return TRUE; -} - static GstElement * on_rtpbin_request_aux_sender (GstElement * rtpbin, guint session_id, GstWebRTCBin * webrtc) { TransportStream *stream; - gboolean have_rtx = FALSE; - GstElement *ret = NULL; + GstElement *ret, *rtx; + GstPad *pad; + char *name; + GstElement *aux_sender = NULL; stream = _find_transport_for_session (webrtc, session_id); + if (!stream) { + /* a rtp session without a stream is a webrtcbin bug */ + g_warn_if_reached (); + return NULL; + } - if (stream) - have_rtx = transport_stream_get_pt (stream, "RTX", -1) != 0; + if (stream->rtxsend) { + GST_WARNING_OBJECT (webrtc, "rtprtxsend already created! rtpbin bug?!"); + g_warn_if_reached (); + return NULL; + } - GST_LOG_OBJECT (webrtc, "requesting aux sender for stream %" GST_PTR_FORMAT, - stream); + GST_DEBUG_OBJECT (webrtc, "requesting aux sender for session %u " + "stream %" GST_PTR_FORMAT, session_id, stream); - if (have_rtx) { - GstElement *rtx; - GstPad *pad; - gchar *name; - GstStructure *merged_local_rtx_ssrc_map = - gst_structure_new_empty ("application/x-rtp-ssrc-map"); - guint i; + ret = gst_bin_new (NULL); + rtx = gst_element_factory_make ("rtprtxsend", NULL); + /* XXX: allow control from outside? */ + g_object_set (rtx, "max-size-packets", 500, NULL); - if (stream->rtxsend) { - GST_WARNING_OBJECT (webrtc, "rtprtxsend already created! rtpbin bug?!"); - goto out; - } + if (!gst_bin_add (GST_BIN (ret), rtx)) + g_warn_if_reached (); + ensure_rtx_hdr_ext (stream); - GST_INFO ("creating AUX sender"); - ret = gst_bin_new (NULL); - rtx = gst_element_factory_make ("rtprtxsend", NULL); - g_object_set (rtx, "max-size-packets", 500, NULL); - _set_rtx_ptmap_from_stream (webrtc, stream); + stream->rtxsend = gst_object_ref (rtx); + _set_internal_rtpbin_element_props_from_stream (webrtc, stream); - for (i = 0; i < webrtc->priv->transceivers->len; i++) { - WebRTCTransceiver *trans = - WEBRTC_TRANSCEIVER (g_ptr_array_index (webrtc->priv->transceivers, - i)); + name = g_strdup_printf ("src_%u", session_id); + pad = gst_element_get_static_pad (rtx, "src"); - if (trans->stream == stream && trans->local_rtx_ssrc_map) - gst_structure_foreach (trans->local_rtx_ssrc_map, - _merge_structure, merged_local_rtx_ssrc_map); - } - g_object_set (rtx, "ssrc-map", merged_local_rtx_ssrc_map, NULL); - gst_structure_free (merged_local_rtx_ssrc_map); + g_signal_emit (webrtc, gst_webrtc_bin_signalsREQUEST_AUX_SENDER, 0, + stream->transport, &aux_sender); + if (aux_sender) { + GstPadLinkReturn link_res; + GstPad *sinkpad = gst_element_get_static_pad (aux_sender, "sink"); + GstPad *srcpad = gst_element_get_static_pad (aux_sender, "src"); - gst_bin_add (GST_BIN (ret), rtx); + gst_object_ref_sink (aux_sender); - pad = gst_element_get_static_pad (rtx, "src"); - name = g_strdup_printf ("src_%u", session_id); - gst_element_add_pad (ret, gst_ghost_pad_new (name, pad)); - g_free (name); - gst_object_unref (pad); + if (!sinkpad || !srcpad) { + GST_ERROR_OBJECT (webrtc, + "Invalid pads for the aux sender %" GST_PTR_FORMAT + ". Skipping it.", aux_sender); + goto bwe_done; + } - pad = gst_element_get_static_pad (rtx, "sink"); - name = g_strdup_printf ("sink_%u", session_id); - gst_element_add_pad (ret, gst_ghost_pad_new (name, pad)); - g_free (name); - gst_object_unref (pad); + if (!gst_bin_add (GST_BIN (ret), aux_sender)) { + GST_ERROR_OBJECT (webrtc, + "Could not add aux sender %" GST_PTR_FORMAT, aux_sender); + goto bwe_done; + } + + link_res = gst_pad_link (pad, sinkpad); + if (link_res != GST_PAD_LINK_OK) { + GST_ERROR_OBJECT (webrtc, + "Could not link aux sender %" GST_PTR_FORMAT " %s", aux_sender, + gst_pad_link_get_name (link_res)); + goto bwe_done; + } - stream->rtxsend = gst_object_ref (rtx); + gst_clear_object (&pad); + pad = gst_object_ref (srcpad); + + bwe_done: + if (pad != srcpad) { + /* Failed using the provided aux sender */ + if (gst_object_has_as_parent (GST_OBJECT (aux_sender), GST_OBJECT (ret))) { + gst_bin_remove (GST_BIN (ret), aux_sender); + } + } + gst_clear_object (&aux_sender); + gst_clear_object (&srcpad); + gst_clear_object (&sinkpad); } -out: + if (!gst_element_add_pad (ret, gst_ghost_pad_new (name, pad))) + g_warn_if_reached (); + gst_clear_object (&pad); + g_clear_pointer (&name, g_free); + + name = g_strdup_printf ("sink_%u", session_id); + pad = gst_element_get_static_pad (rtx, "sink"); + if (!gst_element_add_pad (ret, gst_ghost_pad_new (name, pad))) + g_warn_if_reached (); + gst_clear_object (&pad); + g_clear_pointer (&name, g_free); + return ret; } @@ -6625,108 +7418,70 @@ on_rtpbin_request_aux_receiver (GstElement * rtpbin, guint session_id, GstWebRTCBin * webrtc) { - GstElement *ret = NULL; - GstElement *prev = NULL; - GstPad *sinkpad = NULL; TransportStream *stream; - gint rtx_pt = 0; - GValue red_pt_array = { 0, }; - gboolean have_red_pt = FALSE; - - g_value_init (&red_pt_array, GST_TYPE_ARRAY); + GstPad *pad, *ghost; + GstElement *ret; + char *name; stream = _find_transport_for_session (webrtc, session_id); - - if (stream) { - guint i = 0; - - for (i = 0; i < stream->ptmap->len; i++) { - PtMapItem *item = &g_array_index (stream->ptmap, PtMapItem, i); - - if (!gst_caps_is_empty (item->caps)) { - GstStructure *s = gst_caps_get_structure (item->caps, 0); - - if (!g_strcmp0 (gst_structure_get_string (s, "encoding-name"), "RED")) { - GValue ptval = { 0, }; - - g_value_init (&ptval, G_TYPE_INT); - g_value_set_int (&ptval, item->pt); - gst_value_array_append_value (&red_pt_array, &ptval); - g_value_unset (&ptval); - - have_red_pt = TRUE; - } - } - } - - rtx_pt = transport_stream_get_pt (stream, "RTX", -1); + if (!stream) { + /* no transport stream before the session has been created is a webrtcbin + * programming error! */ + g_warn_if_reached (); + return NULL; } - GST_LOG_OBJECT (webrtc, "requesting aux receiver for stream %" GST_PTR_FORMAT, - stream); - - if (have_red_pt || rtx_pt) - ret = gst_bin_new (NULL); - - if (rtx_pt) { - if (stream->rtxreceive) { - GST_WARNING_OBJECT (webrtc, - "rtprtxreceive already created! rtpbin bug?!"); - goto error; - } - - stream->rtxreceive = gst_element_factory_make ("rtprtxreceive", NULL); - _set_rtx_ptmap_from_stream (webrtc, stream); - - gst_bin_add (GST_BIN (ret), stream->rtxreceive); - - sinkpad = gst_element_get_static_pad (stream->rtxreceive, "sink"); + if (stream->rtxreceive) { + GST_WARNING_OBJECT (webrtc, "rtprtxreceive already created! rtpbin bug?!"); + g_warn_if_reached (); + return NULL; + } - prev = gst_object_ref (stream->rtxreceive); + if (stream->reddec) { + GST_WARNING_OBJECT (webrtc, "rtpreddec already created! rtpbin bug?!"); + g_warn_if_reached (); + return NULL; } - if (have_red_pt) { - GstElement *rtpreddec = gst_element_factory_make ("rtpreddec", NULL); + GST_DEBUG_OBJECT (webrtc, "requesting aux receiver for session %u " + "stream %" GST_PTR_FORMAT, session_id, stream); - GST_DEBUG_OBJECT (webrtc, "Creating RED decoder in session %u", session_id); + ret = gst_bin_new (NULL); - gst_bin_add (GST_BIN (ret), rtpreddec); + stream->rtxreceive = gst_element_factory_make ("rtprtxreceive", NULL); + gst_object_ref (stream->rtxreceive); + if (!gst_bin_add (GST_BIN (ret), stream->rtxreceive)) + g_warn_if_reached (); - g_object_set_property (G_OBJECT (rtpreddec), "payloads", &red_pt_array); + ensure_rtx_hdr_ext (stream); - if (prev) - gst_element_link (prev, rtpreddec); - else - sinkpad = gst_element_get_static_pad (rtpreddec, "sink"); + stream->reddec = gst_element_factory_make ("rtpreddec", NULL); + gst_object_ref (stream->reddec); + if (!gst_bin_add (GST_BIN (ret), stream->reddec)) + g_warn_if_reached (); - prev = rtpreddec; - } + _set_internal_rtpbin_element_props_from_stream (webrtc, stream); - if (sinkpad) { - gchar *name = g_strdup_printf ("sink_%u", session_id); - GstPad *ghost = gst_ghost_pad_new (name, sinkpad); - g_free (name); - gst_object_unref (sinkpad); - gst_element_add_pad (ret, ghost); - } + if (!gst_element_link (stream->rtxreceive, stream->reddec)) + g_warn_if_reached (); - if (prev) { - gchar *name = g_strdup_printf ("src_%u", session_id); - GstPad *srcpad = gst_element_get_static_pad (prev, "src"); - GstPad *ghost = gst_ghost_pad_new (name, srcpad); - g_free (name); - gst_object_unref (srcpad); - gst_element_add_pad (ret, ghost); - } + name = g_strdup_printf ("sink_%u", session_id); + pad = gst_element_get_static_pad (stream->rtxreceive, "sink"); + ghost = gst_ghost_pad_new (name, pad); + g_clear_pointer (&name, g_free); + gst_clear_object (&pad); + if (!gst_element_add_pad (ret, ghost)) + g_warn_if_reached (); -out: - g_value_unset (&red_pt_array); - return ret; + name = g_strdup_printf ("src_%u", session_id); + pad = gst_element_get_static_pad (stream->reddec, "src"); + ghost = gst_ghost_pad_new (name, pad); + g_clear_pointer (&name, g_free); + gst_clear_object (&pad); + if (!gst_element_add_pad (ret, ghost)) + g_warn_if_reached (); -error: - if (ret) - gst_object_unref (ret); - goto out; + return ret; } static GstElement * @@ -6735,10 +7490,14 @@ { TransportStream *stream; GstElement *ret = NULL; - gint fec_pt = 0; GObject *internal_storage; stream = _find_transport_for_session (webrtc, session_id); + if (!stream) { + /* a rtp session without a stream is a webrtcbin bug */ + g_warn_if_reached (); + return NULL; + } /* TODO: for now, we only support ulpfec, but once we support * more algorithms, if the remote may use more than one algorithm, @@ -6746,33 +7505,25 @@ * * + Return a bin here, with the relevant FEC decoders plugged in * and their payload type set to 0 - * + Enable the decoders by setting the payload type only when - * we detect it (by connecting to ptdemux:new-payload-type for - * example) */ - if (stream) { - guint i; + GST_DEBUG_OBJECT (webrtc, "Creating ULPFEC decoder for pt %d in session %u " + "stream %" GST_PTR_FORMAT, pt, session_id, stream); - for (i = 0; i < stream->ptmap->len; i++) { - PtMapItem *item = &g_array_index (stream->ptmap, PtMapItem, i); + ret = gst_element_factory_make ("rtpulpfecdec", NULL); - if (item->pt == pt) { - fec_pt = transport_stream_get_pt (stream, "ULPFEC", item->media_idx); - break; - } - } - } + g_signal_emit_by_name (webrtc->rtpbin, "get-internal-storage", session_id, + &internal_storage); - if (fec_pt) { - GST_DEBUG_OBJECT (webrtc, "Creating ULPFEC decoder for pt %d in session %u", - fec_pt, session_id); - ret = gst_element_factory_make ("rtpulpfecdec", NULL); - g_signal_emit_by_name (webrtc->rtpbin, "get-internal-storage", session_id, - &internal_storage); + g_object_set (ret, "storage", internal_storage, NULL); + g_clear_object (&internal_storage); - g_object_set (ret, "pt", fec_pt, "storage", internal_storage, NULL); - g_object_unref (internal_storage); - } + g_object_set_data (G_OBJECT (ret), GST_WEBRTC_PAYLOAD_TYPE, + GINT_TO_POINTER (pt)); + + PC_LOCK (webrtc); + stream->fecdecs = g_list_prepend (stream->fecdecs, gst_object_ref (ret)); + _set_internal_rtpbin_element_props_from_stream (webrtc, stream); + PC_UNLOCK (webrtc); return ret; } @@ -6782,6 +7533,10 @@ GstWebRTCBin * webrtc) { GST_INFO_OBJECT (webrtc, "session %u ssrc %u received bye", session_id, ssrc); + + PC_LOCK (webrtc); + remove_ssrc_entry_by_ssrc (webrtc, session_id, ssrc); + PC_UNLOCK (webrtc); } static void @@ -6789,6 +7544,10 @@ GstWebRTCBin * webrtc) { GST_INFO_OBJECT (webrtc, "session %u ssrc %u bye timeout", session_id, ssrc); + + PC_LOCK (webrtc); + remove_ssrc_entry_by_ssrc (webrtc, session_id, ssrc); + PC_UNLOCK (webrtc); } static void @@ -6797,6 +7556,10 @@ { GST_INFO_OBJECT (webrtc, "session %u ssrc %u sender timeout", session_id, ssrc); + + PC_LOCK (webrtc); + remove_ssrc_entry_by_ssrc (webrtc, session_id, ssrc); + PC_UNLOCK (webrtc); } static void @@ -6804,6 +7567,14 @@ GstWebRTCBin * webrtc) { GST_INFO_OBJECT (webrtc, "session %u ssrc %u new ssrc", session_id, ssrc); + + if (ssrc == 0) + return; + + PC_LOCK (webrtc); + find_or_add_ssrc_map_item (webrtc, + GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY, session_id, ssrc, -1); + PC_UNLOCK (webrtc); } static void @@ -6824,7 +7595,30 @@ on_rtpbin_ssrc_sdes (GstElement * rtpbin, guint session_id, guint ssrc, GstWebRTCBin * webrtc) { + GObject *session; + GST_INFO_OBJECT (webrtc, "session %u ssrc %u sdes", session_id, ssrc); + + g_signal_emit_by_name (rtpbin, "get-internal-session", session_id, &session); + if (session) { + GObject *source; + + g_signal_emit_by_name (session, "get-source-by-ssrc", ssrc, &source); + if (source) { + GstStructure *sdes; + + g_object_get (source, "sdes", &sdes, NULL); + + /* TODO: when the sdes contains the mid, use that to correlate streams + * as necessary */ + GST_DEBUG_OBJECT (webrtc, "session %u ssrc %u sdes %" GST_PTR_FORMAT, + session_id, ssrc, sdes); + + gst_clear_structure (&sdes); + gst_clear_object (&source); + } + g_clear_object (&session); + } } static void @@ -6839,14 +7633,72 @@ GstWebRTCBin * webrtc) { GST_INFO_OBJECT (webrtc, "session %u ssrc %u timeout", session_id, ssrc); + + PC_LOCK (webrtc); + remove_ssrc_entry_by_ssrc (webrtc, session_id, ssrc); + PC_UNLOCK (webrtc); } static void on_rtpbin_new_sender_ssrc (GstElement * rtpbin, guint session_id, guint ssrc, GstWebRTCBin * webrtc) { + SsrcMapItem *mid; + GST_INFO_OBJECT (webrtc, "session %u ssrc %u new sender ssrc", session_id, ssrc); + + PC_LOCK (webrtc); + mid = find_mid_ssrc_for_ssrc (webrtc, + GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDONLY, session_id, ssrc); + if (!mid) { + TransportStream *stream = _find_transport_for_session (webrtc, session_id); + transport_stream_add_ssrc_map_item (stream, + GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDONLY, ssrc, -1); + } else if (mid->mid) { + /* XXX: when peers support the sdes rtcp item, use this to send the mid rtcp + * sdes item. Requires being able to set the sdes on the rtpsource. */ +#if 0 + GObject *session; + + g_signal_emit_by_name (rtpbin, "get-internal-session", session_id, + &session, NULL); + if (session) { + GObject *source; + + g_signal_emit_by_name (session, "get-source-by-ssrc", ssrc, &source); + if (source) { + GstStructure *sdes; + const char *sdes_field_name; + + g_object_get (source, "sdes", &sdes, NULL); + GST_WARNING_OBJECT (webrtc, "session %u ssrc %u retrieve sdes %" + GST_PTR_FORMAT, session_id, ssrc, sdes); + sdes_field_name = gst_rtcp_sdes_type_to_name (GST_RTCP_SDES_MID); + g_assert (sdes_field_name); + gst_structure_set (sdes, sdes_field_name, G_TYPE_STRING, mid->mid, + NULL); + if (mid->rid) { + sdes_field_name = + gst_rtcp_sdes_type_to_name (GST_RTCP_SDES_RTP_STREAM_ID); + g_assert (sdes_field_name); + gst_structure_set (sdes, sdes_field_name, mid->rid, NULL); + // TODO: repaired-rtp-stream-id + } + // TODO: writable sdes? + g_object_set (source, "sdes", sdes, NULL); + GST_INFO_OBJECT (webrtc, + "session %u ssrc %u set sdes %" GST_PTR_FORMAT, session_id, ssrc, + sdes); + + gst_clear_structure (&sdes); + gst_clear_object (&source); + } + g_clear_object (&session); + } +#endif + } + PC_UNLOCK (webrtc); } static void @@ -6857,12 +7709,49 @@ ssrc); } +struct new_jb_args +{ + GstWebRTCBin *webrtc; + GstElement *jitterbuffer; + TransportStream *stream; + guint ssrc; +}; + +static gboolean +jitter_buffer_set_retransmission (SsrcMapItem * item, + const struct new_jb_args *data) +{ + GstWebRTCRTPTransceiver *trans; + gboolean do_nack; + + if (item->media_idx == -1) + return TRUE; + + trans = _find_transceiver_for_mline (data->webrtc, item->media_idx); + if (!trans) { + g_warn_if_reached (); + return TRUE; + } + + do_nack = WEBRTC_TRANSCEIVER (trans)->do_nack; + /* We don't set do-retransmission on rtpbin as we want per-session control */ + GST_LOG_OBJECT (data->webrtc, "setting do-nack=%s for transceiver %" + GST_PTR_FORMAT " with transport %" GST_PTR_FORMAT + " rtp session %u ssrc %u", do_nack ? "true" : "false", trans, + data->stream, data->stream->session_id, data->ssrc); + g_object_set (data->jitterbuffer, "do-retransmission", do_nack, NULL); + + g_weak_ref_set (&item->rtpjitterbuffer, data->jitterbuffer); + + return TRUE; +} + static void on_rtpbin_new_jitterbuffer (GstElement * rtpbin, GstElement * jitterbuffer, guint session_id, guint ssrc, GstWebRTCBin * webrtc) { TransportStream *stream; - guint i; + struct new_jb_args d = { 0, }; PC_LOCK (webrtc); GST_INFO_OBJECT (webrtc, "new jitterbuffer %" GST_PTR_FORMAT " for " @@ -6873,33 +7762,13 @@ goto out; } - /* XXX: this will fail with no ssrc in the remote sdp as used with e.g. simulcast - * newer SDP versions from chrome/firefox */ - for (i = 0; i < stream->remote_ssrcmap->len; i++) { - SsrcMapItem *item = g_ptr_array_index (stream->remote_ssrcmap, i); - - if (item->ssrc == ssrc) { - GstWebRTCRTPTransceiver *trans; - gboolean do_nack; - - trans = _find_transceiver_for_mline (webrtc, item->media_idx); - if (!trans) { - g_warn_if_reached (); - break; - } + d.webrtc = webrtc; + d.jitterbuffer = jitterbuffer; + d.stream = stream; + d.ssrc = ssrc; + transport_stream_filter_ssrc_map_item (stream, &d, + (FindSsrcMapFunc) jitter_buffer_set_retransmission); - do_nack = WEBRTC_TRANSCEIVER (trans)->do_nack; - /* We don't set do-retransmission on rtpbin as we want per-session control */ - GST_LOG_OBJECT (webrtc, "setting do-nack=%s for transceiver %" - GST_PTR_FORMAT " with transport %" GST_PTR_FORMAT - " rtp session %u ssrc %u", do_nack ? "true" : "false", trans, stream, - session_id, ssrc); - g_object_set (jitterbuffer, "do-retransmission", do_nack, NULL); - - g_weak_ref_set (&item->rtpjitterbuffer, jitterbuffer); - break; - } - } out: PC_UNLOCK (webrtc); } @@ -7030,6 +7899,91 @@ return GST_PAD_PROBE_OK; } +static void +peek_sink_buffer (GstWebRTCBin * webrtc, guint rtp_session_id, + guint media_idx, WebRTCTransceiver * trans, GstBuffer * buffer) +{ + GstRTPBuffer rtp = GST_RTP_BUFFER_INIT; + SsrcMapItem *item; + guint ssrc; + + if (!gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtp)) + return; + ssrc = gst_rtp_buffer_get_ssrc (&rtp); + gst_rtp_buffer_unmap (&rtp); + + if (!ssrc) { + GST_WARNING_OBJECT (webrtc, + "incoming buffer does not contain a valid ssrc"); + return; + } + + PC_LOCK (webrtc); + item = + find_or_add_ssrc_map_item (webrtc, + GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDONLY, rtp_session_id, ssrc, + media_idx); + if (item->media_idx == -1) { + char *str; + + GST_DEBUG_OBJECT (webrtc, "updating media idx of ssrc item %p to %u", item, + media_idx); + item->media_idx = media_idx; + + /* ensure that the rtx mapping contains a valid ssrc to use for rtx when + * used even when there are no ssrc's in the input/codec preferences caps */ + str = g_strdup_printf ("%u", ssrc); + if (!gst_structure_has_field_typed (trans->local_rtx_ssrc_map, str, + G_TYPE_UINT)) { + /* TODO: ssrc-collision? */ + gst_structure_set (trans->local_rtx_ssrc_map, str, G_TYPE_UINT, + g_random_int (), NULL); + _set_internal_rtpbin_element_props_from_stream (webrtc, trans->stream); + } + g_free (str); + } + PC_UNLOCK (webrtc); +} + +static GstPadProbeReturn +sink_pad_buffer_peek (GstPad * pad, GstPadProbeInfo * info, + GstWebRTCBin * webrtc) +{ + GstWebRTCBinPad *webrtc_pad = GST_WEBRTC_BIN_PAD (pad); + WebRTCTransceiver *trans; + guint rtp_session_id, media_idx; + + if (!webrtc_pad->trans) + return GST_PAD_PROBE_OK; + + trans = (WebRTCTransceiver *) webrtc_pad->trans; + if (!trans->stream) + return GST_PAD_PROBE_OK; + + rtp_session_id = trans->stream->session_id; + media_idx = webrtc_pad->trans->mline; + + if (media_idx != G_MAXUINT) + return GST_PAD_PROBE_OK; + + if (info->type & GST_PAD_PROBE_TYPE_BUFFER) { + GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info); + peek_sink_buffer (webrtc, rtp_session_id, media_idx, trans, buffer); + } else if (info->type & GST_PAD_PROBE_TYPE_BUFFER_LIST) { + GstBufferList *list = GST_PAD_PROBE_INFO_BUFFER_LIST (info); + guint i, n; + + n = gst_buffer_list_length (list); + for (i = 0; i < n; i++) { + GstBuffer *buffer = gst_buffer_list_get (list, i); + peek_sink_buffer (webrtc, rtp_session_id, media_idx, trans, buffer); + } + } else { + g_assert_not_reached (); + } + + return GST_PAD_PROBE_OK; +} static GstPad * gst_webrtc_bin_request_new_pad (GstElement * element, GstPadTemplate * templ, @@ -7070,13 +8024,10 @@ /* Reject transceivers that are only for receiving ... */ if (trans->direction == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY || trans->direction == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_INACTIVE) { - gchar *direction = - g_enum_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION, - trans->direction); GST_ERROR_OBJECT (element, "Tried to request a new sink pad %s for" " existing m-line %d, but the transceiver's direction is %s", - name, serial, direction); - g_free (direction); + name, serial, + gst_webrtc_rtp_transceiver_direction_to_string (trans->direction)); goto error_out; } @@ -7175,13 +8126,18 @@ GST_LOG_OBJECT (webrtc, "Using existing transceiver %" GST_PTR_FORMAT " for mline %u", trans, serial); if (caps) { - if (!_update_transceiver_kind_from_caps (trans, caps)) + if (!_update_transceiver_kind_from_caps (trans, caps)) { + GstWebRTCKind caps_kind = webrtc_kind_from_caps (caps); + GST_WARNING_OBJECT (webrtc, - "Trying to change transceiver %d kind from %d to %d", - serial, trans->kind, webrtc_kind_from_caps (caps)); + "Trying to change kind of transceiver %" GST_PTR_FORMAT + " at m-line %d from %s (%d) to %s (%d)", trans, serial, + gst_webrtc_kind_to_string (trans->kind), trans->kind, + gst_webrtc_kind_to_string (caps_kind), caps_kind); + } } } - pad = _create_pad_for_sdp_media (webrtc, GST_PAD_SINK, trans, serial); + pad = _create_pad_for_sdp_media (webrtc, GST_PAD_SINK, trans, serial, NULL); pad->block_id = gst_pad_add_probe (GST_PAD (pad), GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BUFFER_LIST, @@ -7190,6 +8146,10 @@ g_list_append (webrtc->priv->pending_sink_transceivers, gst_object_ref (pad)); + gst_pad_add_probe (GST_PAD (pad), + GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BUFFER_LIST, + (GstPadProbeCallback) sink_pad_buffer_peek, webrtc, NULL); + if (lock_mline) { WebRTCTransceiver *wtrans = WEBRTC_TRANSCEIVER (trans); wtrans->mline_locked = TRUE; @@ -7287,6 +8247,13 @@ webrtc->priv->jb_latency = g_value_get_uint (value); _update_rtpstorage_latency (webrtc); break; + case PROP_ICE_AGENT: + webrtc->priv->ice = g_value_get_object (value); + break; + case PROP_HTTP_PROXY: + gst_webrtc_ice_set_http_proxy (webrtc->priv->ice, + g_value_get_string (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -7364,6 +8331,10 @@ case PROP_SCTP_TRANSPORT: g_value_set_object (value, webrtc->priv->sctp_transport); break; + case PROP_HTTP_PROXY: + g_value_take_string (value, + gst_webrtc_ice_get_http_proxy (webrtc->priv->ice)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -7377,13 +8348,13 @@ GstWebRTCBin *webrtc = GST_WEBRTC_BIN (object); gchar *name; - name = g_strdup_printf ("%s:ice", GST_OBJECT_NAME (webrtc)); - webrtc->priv->ice = gst_webrtc_ice_new (name); - + if (!webrtc->priv->ice) { + name = g_strdup_printf ("%s:ice", GST_OBJECT_NAME (webrtc)); + webrtc->priv->ice = GST_WEBRTC_ICE (gst_webrtc_nice_new (name)); + g_free (name); + } gst_webrtc_ice_set_on_ice_candidate (webrtc->priv->ice, - (GstWebRTCIceOnCandidateFunc) _on_local_ice_candidate_cb, webrtc, NULL); - - g_free (name); + (GstWebRTCICEOnCandidateFunc) _on_local_ice_candidate_cb, webrtc, NULL); G_OBJECT_CLASS (parent_class)->constructed (object); } @@ -7491,8 +8462,9 @@ element_class->change_state = gst_webrtc_bin_change_state; gst_element_class_add_static_pad_template_with_gtype (element_class, - &sink_template, GST_TYPE_WEBRTC_BIN_PAD); - gst_element_class_add_static_pad_template (element_class, &src_template); + &sink_template, GST_TYPE_WEBRTC_BIN_SINK_PAD); + gst_element_class_add_static_pad_template_with_gtype (element_class, + &src_template, GST_TYPE_WEBRTC_BIN_SRC_PAD); gst_element_class_set_metadata (element_class, "WebRTC Bin", "Filter/Network/WebRTC", "A bin for webrtc connections", @@ -7570,6 +8542,10 @@ PROP_TURN_SERVER, g_param_spec_string ("turn-server", "TURN Server", "The TURN server of the form turn(s)://username:password@host:port. " + "To use time-limited credentials, the form must be turn(s)://timestamp:" + "username:password@host:port. Please note that the ':' character of " + "the 'timestamp:username' and the 'password' encoded by base64 should " + "be escaped to be parsed properly. " "This is a convenience property, use #GstWebRTCBin::add-turn-server " "if you wish to use multiple TURN servers", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -7626,7 +8602,8 @@ PROP_ICE_AGENT, g_param_spec_object ("ice-agent", "WebRTC ICE agent", "The WebRTC ICE agent", - GST_TYPE_WEBRTC_ICE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + GST_TYPE_WEBRTC_ICE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY)); /** * GstWebRTCBin:latency: @@ -7644,6 +8621,21 @@ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** + * GstWebRTCBin:http-proxy: + * + * A HTTP proxy for use with TURN/TCP of the form + * http://username:password@hostname:port + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, + PROP_HTTP_PROXY, + g_param_spec_string ("http-proxy", "HTTP Proxy", + "A HTTP proxy for use with TURN/TCP of the form " + "http://username:password@hostname:port", + NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** * GstWebRTCBin:sctp-transport: * * The WebRTC SCTP Transport @@ -7754,11 +8746,12 @@ * "ssrc" G_TYPE_STRING the rtp sequence src in use * "transport-id" G_TYPE_STRING identifier for the associated RTCTransportStats for this stream * "codec-id" G_TYPE_STRING identifier for the associated RTCCodecStats for this stream + * "kind" G_TYPE_STRING either "audio" or "video", depending on the associated transceiver (Since: 1.22) * * RTCReceivedStreamStats supported fields (https://w3c.github.io/webrtc-stats/#receivedrtpstats-dict*) * * "packets-received" G_TYPE_UINT64 number of packets received (only for local inbound) - * "packets-lost" G_TYPE_UINT64 number of packets lost + * "packets-lost" G_TYPE_INT64 number of packets lost * "packets-discarded" G_TYPE_UINT64 number of packets discarded * "packets-repaired" G_TYPE_UINT64 number of packets repaired * "jitter" G_TYPE_DOUBLE packet jitter measured in seconds @@ -7785,7 +8778,7 @@ * * RTCOutboundRTPStreamStats supported fields (https://w3c.github.io/webrtc-stats/#outboundrtpstats-dict*) * - * "remote-id" G_TYPE_STRING identifier for the associated RTCRemoteInboundRTPSTreamStats + * "remote-id" G_TYPE_STRING identifier for the associated RTCRemoteInboundRTPSTreamStats (optional since 1.22) * "fir-count" G_TYPE_UINT FIR packets received by the sender * "pli-count" G_TYPE_UINT PLI packets received by the sender * "nack-count" G_TYPE_UINT NACK packets received by the sender @@ -7795,6 +8788,21 @@ * "local-id" G_TYPE_STRING identifier for the associated RTCInboundRTPSTreamStats * "remote-timestamp" G_TYPE_DOUBLE remote timestamp the statistics were sent by the remote * + * RTCIceCandidateStats supported fields (https://www.w3.org/TR/webrtc-stats/#icecandidate-dict*) (Since: 1.22) + * + * "transport-id" G_TYPE_STRING identifier for the associated RTCTransportStats for this stream + * "address" G_TYPE_STRING address of the candidate, allowing for IPv4, IPv6 and FQDNs + * "port" G_TYPE_UINT port number of the candidate + * "candidate-type" G_TYPE_STRING RTCIceCandidateType + * "priority" G_TYPE_UINT64 calculated as defined in RFC 5245 + * "protocol" G_TYPE_STRING Either "udp" or "tcp". Based on the "transport" defined in RFC 5245 + * "relay-protocol" G_TYPE_STRING protocol used by the endpoint to communicate with the TURN server. Only present for local candidates. Either "udp", "tcp" or "tls" + * "url" G_TYPE_STRING URL of the ICE server from which the candidate was obtained. Only present for local candidates + * + * RTCIceCandidatePairStats supported fields (https://www.w3.org/TR/webrtc-stats/#candidatepair-dict*) (Since: 1.22) + * + * "local-candidate-id" G_TYPE_STRING unique identifier that is associated to the object that was inspected to produce the RTCIceCandidateStats for the local candidate associated with this candidate pair. + * "remote-candidate-id" G_TYPE_STRING unique identifier that is associated to the object that was inspected to produce the RTCIceCandidateStats for the remote candidate associated with this candidate pair. */ gst_webrtc_bin_signalsGET_STATS_SIGNAL = g_signal_new_class_handler ("get-stats", @@ -7834,7 +8842,7 @@ /** * GstWebRTCBin::on-data-channel: * @object: the #GstWebRTCBin - * @candidate: the new `GstWebRTCDataChannel` + * @channel: the new `GstWebRTCDataChannel` */ gst_webrtc_bin_signalsON_DATA_CHANNEL_SIGNAL = g_signal_new ("on-data-channel", G_TYPE_FROM_CLASS (klass), @@ -7842,6 +8850,39 @@ G_TYPE_NONE, 1, GST_TYPE_WEBRTC_DATA_CHANNEL); /** + * GstWebRTCBin::prepare-data-channel: + * @object: the #GstWebRTCBin + * @channel: the new `GstWebRTCDataChannel` + * @is_local: Whether this channel is local or remote + * + * Allows data-channel consumers to configure signal handlers on a newly + * created data-channel, before any data or state change has been notified. + * + * Since: 1.22 + */ + gst_webrtc_bin_signalsPREPARE_DATA_CHANNEL_SIGNAL = + g_signal_new ("prepare-data-channel", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 2, + GST_TYPE_WEBRTC_DATA_CHANNEL, G_TYPE_BOOLEAN); + + /** + * GstWebRTCBin::request-aux-sender: + * @object: the #GstWebRTCBin + * @dtls-transport: The #GstWebRTCDTLSTransport object for which the aux + * sender will be used. + * + * Request an AUX sender element for the given @dtls-transport. + * + * Returns: (transfer full): A new GStreamer element + * + * Since: 1.22 + */ + gst_webrtc_bin_signalsREQUEST_AUX_SENDER = + g_signal_new ("request-aux-sender", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, 0, _gst_element_accumulator, NULL, NULL, + GST_TYPE_ELEMENT, 1, GST_TYPE_WEBRTC_DTLS_TRANSPORT); + + /** * GstWebRTCBin::add-transceiver: * @object: the #webrtcbin * @direction: the direction of the new transceiver @@ -7922,7 +8963,8 @@ NULL, GST_TYPE_WEBRTC_DATA_CHANNEL, 2, G_TYPE_STRING, GST_TYPE_STRUCTURE); gst_type_mark_as_plugin_api (GST_TYPE_WEBRTC_BIN_PAD, 0); - gst_type_mark_as_plugin_api (GST_TYPE_WEBRTC_ICE, 0); + gst_type_mark_as_plugin_api (GST_TYPE_WEBRTC_BIN_SINK_PAD, 0); + gst_type_mark_as_plugin_api (GST_TYPE_WEBRTC_BIN_SRC_PAD, 0); } static void
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/gstwebrtcbin.h -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/gstwebrtcbin.h
Changed
@@ -22,7 +22,6 @@ #include <gst/sdp/sdp.h> #include "fwd.h" -#include "gstwebrtcice.h" #include "transportstream.h" #include "webrtcsctptransport.h" @@ -39,6 +38,8 @@ typedef struct _GstWebRTCBinPad GstWebRTCBinPad; typedef struct _GstWebRTCBinPadClass GstWebRTCBinPadClass; +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstWebRTCBinPad, gst_object_unref); + struct _GstWebRTCBinPad { GstGhostPad parent; @@ -46,9 +47,8 @@ GstWebRTCRTPTransceiver *trans; gulong block_id; - guint32 last_ssrc; - GstCaps *received_caps; + char *msid; }; struct _GstWebRTCBinPadClass @@ -56,6 +56,14 @@ GstGhostPadClass parent_class; }; +G_DECLARE_FINAL_TYPE (GstWebRTCBinSinkPad, gst_webrtc_bin_sink_pad, GST, + WEBRTC_BIN_SINK_PAD, GstWebRTCBinPad); +#define GST_TYPE_WEBRTC_BIN_SINK_PAD (gst_webrtc_bin_sink_pad_get_type()) + +G_DECLARE_FINAL_TYPE (GstWebRTCBinSrcPad, gst_webrtc_bin_src_pad, GST, + WEBRTC_BIN_SRC_PAD, GstWebRTCBinPad); +#define GST_TYPE_WEBRTC_BIN_SRC_PAD (gst_webrtc_bin_src_pad_get_type()) + GType gst_webrtc_bin_get_type(void); #define GST_TYPE_WEBRTC_BIN (gst_webrtc_bin_get_type()) #define GST_WEBRTC_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WEBRTC_BIN,GstWebRTCBin)) @@ -95,6 +103,7 @@ struct _GstWebRTCBinPrivate { guint max_sink_pad_serial; + guint src_pad_counter; gboolean bundle; GPtrArray *transceivers;
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/gstwebrtcstats.c -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/gstwebrtcstats.c
Changed
@@ -58,7 +58,7 @@ _set_base_stats (GstStructure * s, GstWebRTCStatsType type, double ts, const char *id) { - gchar *name = _enum_value_to_string (GST_TYPE_WEBRTC_STATS_TYPE, + const gchar *name = _enum_value_to_string (GST_TYPE_WEBRTC_STATS_TYPE, type); g_return_if_fail (name != NULL); @@ -66,8 +66,6 @@ gst_structure_set_name (s, name); gst_structure_set (s, "type", GST_TYPE_WEBRTC_STATS_TYPE, type, "timestamp", G_TYPE_DOUBLE, ts, "id", G_TYPE_STRING, id, NULL); - - g_free (name); } static GstStructure * @@ -107,7 +105,7 @@ static gboolean _get_stats_from_remote_rtp_source_stats (GstWebRTCBin * webrtc, TransportStream * stream, const GstStructure * source_stats, - guint ssrc, guint clock_rate, const gchar * codec_id, + guint ssrc, guint clock_rate, const gchar * codec_id, const gchar * kind, const gchar * transport_id, GstStructure * s) { gboolean have_rb = FALSE, internal = FALSE; @@ -137,12 +135,13 @@ gst_structure_set (r_in, "ssrc", G_TYPE_UINT, ssrc, NULL); gst_structure_set (r_in, "codec-id", G_TYPE_STRING, codec_id, NULL); gst_structure_set (r_in, "transport-id", G_TYPE_STRING, transport_id, NULL); - /* To be added: kind */ + if (kind) + gst_structure_set (r_in, "kind", G_TYPE_STRING, kind, NULL); /* RTCReceivedRtpStreamStats */ if (gst_structure_get_int (source_stats, "rb-packetslost", &lost)) - gst_structure_set (r_in, "packets-lost", G_TYPE_INT, lost, NULL); + gst_structure_set (r_in, "packets-lost", G_TYPE_INT64, (gint64) lost, NULL); if (clock_rate && gst_structure_get_uint (source_stats, "rb-jitter", &jitter)) gst_structure_set (r_in, "jitter", G_TYPE_DOUBLE, @@ -207,7 +206,8 @@ static void _get_stats_from_rtp_source_stats (GstWebRTCBin * webrtc, TransportStream * stream, const GstStructure * source_stats, - const gchar * codec_id, const gchar * transport_id, GstStructure * s) + const gchar * codec_id, const gchar * kind, const gchar * transport_id, + GstStructure * s) { guint ssrc, fir, pli, nack, jitter; int clock_rate; @@ -232,8 +232,8 @@ gst_structure_set (out, "ssrc", G_TYPE_UINT, ssrc, NULL); gst_structure_set (out, "codec-id", G_TYPE_STRING, codec_id, NULL); gst_structure_set (out, "transport-id", G_TYPE_STRING, transport_id, NULL); - /* To be added: kind */ - + if (kind) + gst_structure_set (out, "kind", G_TYPE_STRING, kind, NULL); /* RTCSentRtpStreamStats */ if (gst_structure_get_uint64 (source_stats, "octets-sent", &bytes)) @@ -321,10 +321,11 @@ gst_structure_get (source_stats, "have-sr", G_TYPE_BOOLEAN, &have_sr, NULL); - for (i = 0; i < stream->remote_ssrcmap->len; i++) { - SsrcMapItem *item = g_ptr_array_index (stream->remote_ssrcmap, i); + for (i = 0; i < stream->ssrcmap->len; i++) { + SsrcMapItem *item = g_ptr_array_index (stream->ssrcmap, i); - if (item->ssrc == ssrc) { + if (item->direction == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY + && item->ssrc == ssrc) { GObject *jb = g_weak_ref_get (&item->rtpjitterbuffer); if (jb) { @@ -351,15 +352,18 @@ gst_structure_set (in, "ssrc", G_TYPE_UINT, ssrc, NULL); gst_structure_set (in, "codec-id", G_TYPE_STRING, codec_id, NULL); gst_structure_set (in, "transport-id", G_TYPE_STRING, transport_id, NULL); - /* To be added: kind */ - + if (kind) + gst_structure_set (in, "kind", G_TYPE_STRING, kind, NULL); /* RTCReceivedRtpStreamStats */ if (gst_structure_get_uint64 (source_stats, "packets-received", &packets)) gst_structure_set (in, "packets-received", G_TYPE_UINT64, packets, NULL); - if (jb_stats) - gst_structure_set (in, "packets-lost", G_TYPE_UINT64, jb_lost, NULL); + if (jb_stats) { + gint64 packets_lost = jb_lost > G_MAXINT64 ? + G_MAXINT64 : (gint64) jb_lost; + gst_structure_set (in, "packets-lost", G_TYPE_INT64, packets_lost, NULL); + } if (gst_structure_get_uint (source_stats, "jitter", &jitter)) gst_structure_set (in, "jitter", G_TYPE_DOUBLE, CLOCK_RATE_VALUE_TO_SECONDS (jitter, clock_rate), NULL); @@ -560,67 +564,138 @@ } } +/* https://www.w3.org/TR/webrtc-stats/#icecandidate-dict* */ +static gchar * +_get_stats_from_ice_candidates (GstWebRTCBin * webrtc, + GstWebRTCICECandidateStats * can, const gchar * transport_id, + const gchar * candidate_tag, GstStructure * s) +{ + GstStructure *stats; + GstWebRTCStatsType type; + gchar *id; + double ts; + + gst_structure_get_double (s, "timestamp", &ts); + + id = g_strdup_printf ("ice-candidate-%s_%u_%s_%u", candidate_tag, + can->stream_id, can->ipaddr, can->port); + stats = gst_structure_new_empty (id); + + if (strcmp (candidate_tag, "local")) { + type = GST_WEBRTC_STATS_LOCAL_CANDIDATE; + } else if (strcmp (candidate_tag, "remote")) { + type = GST_WEBRTC_STATS_REMOTE_CANDIDATE; + } else { + GST_WARNING_OBJECT (webrtc, "Invalid ice candidate tag: %s", candidate_tag); + return NULL; + } + _set_base_stats (stats, type, ts, id); + + /* RTCIceCandidateStats + DOMString transportId; + DOMString address; + long port; + DOMString protocol; + RTCIceCandidateType candidateType; + long priority; + DOMString url; + DOMString relayProtocol; + */ + + if (transport_id) + gst_structure_set (stats, "transport-id", G_TYPE_STRING, transport_id, + NULL); + gst_structure_set (stats, "address", G_TYPE_STRING, can->ipaddr, NULL); + gst_structure_set (stats, "port", G_TYPE_UINT, can->port, NULL); + gst_structure_set (stats, "candidate-type", G_TYPE_STRING, can->type, NULL); + gst_structure_set (stats, "priority", G_TYPE_UINT, can->prio, NULL); + gst_structure_set (stats, "protocol", G_TYPE_STRING, can->proto, NULL); + if (can->relay_proto) + gst_structure_set (stats, "relay-protocol", G_TYPE_STRING, can->relay_proto, + NULL); + if (can->url) + gst_structure_set (stats, "url", G_TYPE_STRING, can->url, NULL); + + gst_structure_set (s, id, GST_TYPE_STRUCTURE, stats, NULL); + gst_structure_free (stats); + + return id; +} + /* https://www.w3.org/TR/webrtc-stats/#candidatepair-dict* */ static gchar * _get_stats_from_ice_transport (GstWebRTCBin * webrtc, - GstWebRTCICETransport * transport, const GstStructure * twcc_stats, + GstWebRTCICETransport * transport, GstWebRTCICEStream * stream, + const GstStructure * twcc_stats, const gchar * transport_id, GstStructure * s) { GstStructure *stats; gchar *id; + gchar *local_cand_id = NULL, *remote_cand_id = NULL; double ts; + GstWebRTCICECandidateStats *local_cand = NULL, *remote_cand = NULL; gst_structure_get_double (s, "timestamp", &ts); id = g_strdup_printf ("ice-candidate-pair_%s", GST_OBJECT_NAME (transport)); stats = gst_structure_new_empty (id); - _set_base_stats (stats, GST_WEBRTC_STATS_TRANSPORT, ts, id); - -/* XXX: RTCIceCandidatePairStats - DOMString transportId; - DOMString localCandidateId; - DOMString remoteCandidateId; - RTCStatsIceCandidatePairState state; - unsigned long long priority; - boolean nominated; - unsigned long packetsSent; - unsigned long packetsReceived; - unsigned long long bytesSent; - unsigned long long bytesReceived; - DOMHighResTimeStamp lastPacketSentTimestamp; - DOMHighResTimeStamp lastPacketReceivedTimestamp; - DOMHighResTimeStamp firstRequestTimestamp; - DOMHighResTimeStamp lastRequestTimestamp; - DOMHighResTimeStamp lastResponseTimestamp; - double totalRoundTripTime; - double currentRoundTripTime; - double availableOutgoingBitrate; - double availableIncomingBitrate; - unsigned long circuitBreakerTriggerCount; - unsigned long long requestsReceived; - unsigned long long requestsSent; - unsigned long long responsesReceived; - unsigned long long responsesSent; - unsigned long long retransmissionsReceived; - unsigned long long retransmissionsSent; - unsigned long long consentRequestsSent; - DOMHighResTimeStamp consentExpiredTimestamp; -*/ + _set_base_stats (stats, GST_WEBRTC_STATS_CANDIDATE_PAIR, ts, id); + + /* RTCIceCandidatePairStats + DOMString transportId; + DOMString localCandidateId; + DOMString remoteCandidateId; + + XXX: To be added: + + RTCStatsIceCandidatePairState state; + boolean nominated; + unsigned long packetsSent; + unsigned long packetsReceived; + unsigned long long bytesSent; + unsigned long long bytesReceived; + DOMHighResTimeStamp lastPacketSentTimestamp; + DOMHighResTimeStamp lastPacketReceivedTimestamp; + DOMHighResTimeStamp firstRequestTimestamp; + DOMHighResTimeStamp lastRequestTimestamp; + DOMHighResTimeStamp lastResponseTimestamp; + double totalRoundTripTime; + double currentRoundTripTime; + double availableOutgoingBitrate; + double availableIncomingBitrate; + unsigned long circuitBreakerTriggerCount; + unsigned long long requestsReceived; + unsigned long long requestsSent; + unsigned long long responsesReceived; + unsigned long long responsesSent; + unsigned long long retransmissionsReceived; + unsigned long long retransmissionsSent; + unsigned long long consentRequestsSent; + DOMHighResTimeStamp consentExpiredTimestamp; + unsigned long packetsDiscardedOnSend; + unsigned long long bytesDiscardedOnSend; + unsigned long long requestBytesSent; + unsigned long long consentRequestBytesSent; + unsigned long long responseBytesSent; + */ -/* XXX: RTCIceCandidateStats - DOMString transportId; - boolean isRemote; - RTCNetworkType networkType; - DOMString ip; - long port; - DOMString protocol; - RTCIceCandidateType candidateType; - long priority; - DOMString url; - DOMString relayProtocol; - boolean deleted = false; -}; -*/ + if (gst_webrtc_ice_get_selected_pair (webrtc->priv->ice, stream, + &local_cand, &remote_cand)) { + local_cand_id = + _get_stats_from_ice_candidates (webrtc, local_cand, transport_id, + "local", s); + remote_cand_id = + _get_stats_from_ice_candidates (webrtc, remote_cand, transport_id, + "remote", s); + + gst_structure_set (stats, "local-candidate-id", G_TYPE_STRING, + local_cand_id, NULL); + gst_structure_set (stats, "remote-candidate-id", G_TYPE_STRING, + remote_cand_id, NULL); + } else + GST_INFO_OBJECT (webrtc, + "No selected ICE candidate pair was found for transport %s", + GST_OBJECT_NAME (transport)); /* XXX: these stats are at the rtp session level but there isn't a specific * stats structure for that. The RTCIceCandidatePairStats is the closest with @@ -631,6 +706,13 @@ NULL); gst_structure_set (s, id, GST_TYPE_STRUCTURE, stats, NULL); + + g_free (local_cand_id); + g_free (remote_cand_id); + + gst_webrtc_ice_candidate_stats_free (local_cand); + gst_webrtc_ice_candidate_stats_free (remote_cand); + gst_structure_free (stats); return id; @@ -639,8 +721,8 @@ /* https://www.w3.org/TR/webrtc-stats/#dom-rtctransportstats */ static gchar * _get_stats_from_dtls_transport (GstWebRTCBin * webrtc, - GstWebRTCDTLSTransport * transport, const GstStructure * twcc_stats, - GstStructure * s) + GstWebRTCDTLSTransport * transport, GstWebRTCICEStream * stream, + const GstStructure * twcc_stats, GstStructure * s) { GstStructure *stats; gchar *id; @@ -673,95 +755,21 @@ DOMString issuerCertificateId; */ -/* XXX: RTCIceCandidateStats - DOMString transportId; - boolean isRemote; - DOMString ip; - long port; - DOMString protocol; - RTCIceCandidateType candidateType; - long priority; - DOMString url; - boolean deleted = false; -*/ + ice_id = + _get_stats_from_ice_transport (webrtc, transport->transport, stream, + twcc_stats, id, s); + if (ice_id) { + gst_structure_set (stats, "selected-candidate-pair-id", G_TYPE_STRING, + ice_id, NULL); + g_free (ice_id); + } gst_structure_set (s, id, GST_TYPE_STRUCTURE, stats, NULL); gst_structure_free (stats); - ice_id = - _get_stats_from_ice_transport (webrtc, transport->transport, twcc_stats, - s); - g_free (ice_id); - return id; } -static void -_get_stats_from_transport_channel (GstWebRTCBin * webrtc, - TransportStream * stream, const gchar * codec_id, guint ssrc, - guint clock_rate, GstStructure * s) -{ - GstWebRTCDTLSTransport *transport; - GObject *rtp_session; - GObject *gst_rtp_session; - GstStructure *rtp_stats, *twcc_stats; - GValueArray *source_stats; - gchar *transport_id; - double ts; - int i; - - gst_structure_get_double (s, "timestamp", &ts); - - transport = stream->transport; - if (!transport) - return; - - g_signal_emit_by_name (webrtc->rtpbin, "get-internal-session", - stream->session_id, &rtp_session); - g_object_get (rtp_session, "stats", &rtp_stats, NULL); - g_signal_emit_by_name (webrtc->rtpbin, "get-session", - stream->session_id, &gst_rtp_session); - g_object_get (gst_rtp_session, "twcc-stats", &twcc_stats, NULL); - - gst_structure_get (rtp_stats, "source-stats", G_TYPE_VALUE_ARRAY, - &source_stats, NULL); - - GST_DEBUG_OBJECT (webrtc, "retrieving rtp stream stats from transport %" - GST_PTR_FORMAT " rtp session %" GST_PTR_FORMAT " with %u rtp sources, " - "transport %" GST_PTR_FORMAT, stream, rtp_session, source_stats->n_values, - transport); - - transport_id = - _get_stats_from_dtls_transport (webrtc, transport, twcc_stats, s); - - /* construct stats objects */ - for (i = 0; i < source_stats->n_values; i++) { - const GstStructure *stats; - const GValue *val = g_value_array_get_nth (source_stats, i); - guint stats_ssrc = 0; - - stats = gst_value_get_structure (val); - - /* skip foreign sources */ - if (gst_structure_get_uint (stats, "ssrc", &stats_ssrc) && - ssrc == stats_ssrc) - _get_stats_from_rtp_source_stats (webrtc, stream, stats, codec_id, - transport_id, s); - else if (gst_structure_get_uint (stats, "rb-ssrc", &stats_ssrc) && - ssrc == stats_ssrc) - _get_stats_from_remote_rtp_source_stats (webrtc, stream, stats, ssrc, - clock_rate, codec_id, transport_id, s); - } - - g_object_unref (rtp_session); - g_object_unref (gst_rtp_session); - gst_structure_free (rtp_stats); - if (twcc_stats) - gst_structure_free (twcc_stats); - g_value_array_free (source_stats); - g_free (transport_id); -} - /* https://www.w3.org/TR/webrtc-stats/#codec-dict* */ static gboolean _get_codec_stats_from_pad (GstWebRTCBin * webrtc, GstPad * pad, @@ -859,33 +867,127 @@ return has_caps_ssrc; } +struct transport_stream_stats +{ + GstWebRTCBin *webrtc; + TransportStream *stream; + char *transport_id; + char *codec_id; + const char *kind; + guint clock_rate; + GValueArray *source_stats; + GstStructure *s; +}; + +static gboolean +webrtc_stats_get_from_transport (SsrcMapItem * entry, + struct transport_stream_stats *ts_stats) +{ + double ts; + int i; + + gst_structure_get_double (ts_stats->s, "timestamp", &ts); + + /* construct stats objects */ + for (i = 0; i < ts_stats->source_stats->n_values; i++) { + const GstStructure *stats; + const GValue *val = g_value_array_get_nth (ts_stats->source_stats, i); + guint stats_ssrc = 0; + + stats = gst_value_get_structure (val); + + /* skip foreign sources */ + if (gst_structure_get_uint (stats, "ssrc", &stats_ssrc) && + entry->ssrc == stats_ssrc) + _get_stats_from_rtp_source_stats (ts_stats->webrtc, ts_stats->stream, + stats, ts_stats->codec_id, ts_stats->kind, ts_stats->transport_id, + ts_stats->s); + else if (gst_structure_get_uint (stats, "rb-ssrc", &stats_ssrc) + && entry->ssrc == stats_ssrc) + _get_stats_from_remote_rtp_source_stats (ts_stats->webrtc, + ts_stats->stream, stats, entry->ssrc, ts_stats->clock_rate, + ts_stats->codec_id, ts_stats->kind, ts_stats->transport_id, + ts_stats->s); + } + + /* we want to look at all the entries */ + return FALSE; +} + static gboolean _get_stats_from_pad (GstWebRTCBin * webrtc, GstPad * pad, GstStructure * s) { GstWebRTCBinPad *wpad = GST_WEBRTC_BIN_PAD (pad); - TransportStream *stream; - gchar *codec_id; + struct transport_stream_stats ts_stats = { NULL, }; guint ssrc, clock_rate; - gboolean has_caps_ssrc; + GObject *rtp_session; + GObject *gst_rtp_session; + GstStructure *rtp_stats, *twcc_stats; + GstWebRTCKind kind; - has_caps_ssrc = _get_codec_stats_from_pad (webrtc, pad, s, &codec_id, &ssrc, + _get_codec_stats_from_pad (webrtc, pad, s, &ts_stats.codec_id, &ssrc, &clock_rate); if (!wpad->trans) goto out; - stream = WEBRTC_TRANSCEIVER (wpad->trans)->stream; - if (!stream) + g_object_get (wpad->trans, "kind", &kind, NULL); + switch (kind) { + case GST_WEBRTC_KIND_AUDIO: + ts_stats.kind = "audio"; + break; + case GST_WEBRTC_KIND_VIDEO: + ts_stats.kind = "video"; + break; + case GST_WEBRTC_KIND_UNKNOWN: + ts_stats.kind = NULL; + break; + }; + + ts_stats.stream = WEBRTC_TRANSCEIVER (wpad->trans)->stream; + if (!ts_stats.stream) + goto out; + + if (wpad->trans->mline == G_MAXUINT) + goto out; + + if (!ts_stats.stream->transport) goto out; - if (!has_caps_ssrc) - ssrc = wpad->last_ssrc; + g_signal_emit_by_name (webrtc->rtpbin, "get-internal-session", + ts_stats.stream->session_id, &rtp_session); + g_object_get (rtp_session, "stats", &rtp_stats, NULL); + g_signal_emit_by_name (webrtc->rtpbin, "get-session", + ts_stats.stream->session_id, &gst_rtp_session); + g_object_get (gst_rtp_session, "twcc-stats", &twcc_stats, NULL); + + gst_structure_get (rtp_stats, "source-stats", G_TYPE_VALUE_ARRAY, + &ts_stats.source_stats, NULL); + + ts_stats.transport_id = + _get_stats_from_dtls_transport (webrtc, ts_stats.stream->transport, + GST_WEBRTC_ICE_STREAM (ts_stats.stream->stream), twcc_stats, s); + + GST_DEBUG_OBJECT (webrtc, "retrieving rtp stream stats from transport %" + GST_PTR_FORMAT " rtp session %" GST_PTR_FORMAT " with %u rtp sources, " + "transport %" GST_PTR_FORMAT, ts_stats.stream, rtp_session, + ts_stats.source_stats->n_values, ts_stats.stream->transport); + + ts_stats.s = s; + + transport_stream_find_ssrc_map_item (ts_stats.stream, &ts_stats, + (FindSsrcMapFunc) webrtc_stats_get_from_transport); - _get_stats_from_transport_channel (webrtc, stream, codec_id, ssrc, - clock_rate, s); + g_clear_object (&rtp_session); + g_clear_object (&gst_rtp_session); + gst_clear_structure (&rtp_stats); + gst_clear_structure (&twcc_stats); + g_value_array_free (ts_stats.source_stats); + ts_stats.source_stats = NULL; + g_clear_pointer (&ts_stats.transport_id, g_free); out: - g_free (codec_id); + g_clear_pointer (&ts_stats.codec_id, g_free); return TRUE; }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/meson.build
Changed
@@ -1,9 +1,6 @@ webrtc_sources = 'gstwebrtc.c', - 'gstwebrtcice.c', 'gstwebrtcstats.c', - 'icestream.c', - 'nicetransport.c', 'webrtcsctptransport.c', 'gstwebrtcbin.c', 'transportreceivebin.c', @@ -15,20 +12,20 @@ 'webrtcdatachannel.c', -libnice_dep = dependency('nice', version : '>=0.1.17', required : get_option('webrtc'), - fallback : 'libnice', 'libnice_dep', - default_options: 'tests=disabled') - -if libnice_dep.found() - gstwebrtc_plugin = library('gstwebrtc', - webrtc_sources, - c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', - include_directories : configinc, - dependencies : gio_dep, libnice_dep, gstbase_dep, gstsdp_dep, - gstapp_dep, gstwebrtc_dep, gstsctp_dep, gstrtp_dep, - install : true, - install_dir : plugins_install_dir, - ) - pkgconfig.generate(gstwebrtc_plugin, install_dir : plugins_pkgconfig_install_dir) - plugins += gstwebrtc_plugin +webrtc_option = get_option('webrtc').require( + libgstwebrtcnice_dep.found(), error_message: 'webrtc plugin requires libgstwebrtcnice.') +if webrtc_option.disabled() + subdir_done() endif + +gstwebrtc_plugin = library('gstwebrtc', + webrtc_sources, + c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', + include_directories : configinc, + dependencies : gstbase_dep, gstsdp_dep, + gstapp_dep, gstwebrtc_dep, gstsctp_dep, gstrtp_dep, gio_dep, libgstwebrtcnice_dep, + install : true, + install_dir : plugins_install_dir, +) +plugins += gstwebrtc_plugin +
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/transportstream.c -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/transportstream.c
Changed
@@ -24,13 +24,17 @@ #include "transportstream.h" #include "transportsendbin.h" #include "transportreceivebin.h" -#include "gstwebrtcice.h" #include "gstwebrtcbin.h" #include "utils.h" #include "gst/webrtc/webrtc-priv.h" +#define GST_CAT_DEFAULT transport_stream_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + #define transport_stream_parent_class parent_class -G_DEFINE_TYPE (TransportStream, transport_stream, GST_TYPE_OBJECT); +G_DEFINE_TYPE_WITH_CODE (TransportStream, transport_stream, GST_TYPE_OBJECT, + GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "webrtctransportstream", 0, + "webrtctransportstream");); enum { @@ -59,7 +63,7 @@ guint media_idx) { guint i; - gint ret = 0; + gint ret = -1; for (i = 0; i < stream->ptmap->len; i++) { PtMapItem *item = &g_array_index (stream->ptmap, PtMapItem, i); @@ -165,25 +169,14 @@ { TransportStream *stream = TRANSPORT_STREAM (object); - if (stream->send_bin) - gst_object_unref (stream->send_bin); - stream->send_bin = NULL; - - if (stream->receive_bin) - gst_object_unref (stream->receive_bin); - stream->receive_bin = NULL; - - if (stream->transport) - gst_object_unref (stream->transport); - stream->transport = NULL; - - if (stream->rtxsend) - gst_object_unref (stream->rtxsend); - stream->rtxsend = NULL; - - if (stream->rtxreceive) - gst_object_unref (stream->rtxreceive); - stream->rtxreceive = NULL; + gst_clear_object (&stream->send_bin); + gst_clear_object (&stream->receive_bin); + gst_clear_object (&stream->transport); + gst_clear_object (&stream->rtxsend); + gst_clear_object (&stream->rtxreceive); + gst_clear_object (&stream->reddec); + g_list_free_full (stream->fecdecs, (GDestroyNotify) gst_object_unref); + stream->fecdecs = NULL; GST_OBJECT_PARENT (object) = NULL; @@ -196,7 +189,12 @@ TransportStream *stream = TRANSPORT_STREAM (object); g_array_free (stream->ptmap, TRUE); - g_ptr_array_free (stream->remote_ssrcmap, TRUE); + g_ptr_array_free (stream->ssrcmap, TRUE); + + gst_clear_object (&stream->rtxsend_stream_id); + gst_clear_object (&stream->rtxsend_repaired_stream_id); + gst_clear_object (&stream->rtxreceive_stream_id); + gst_clear_object (&stream->rtxreceive_repaired_stream_id); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -283,11 +281,13 @@ gst_caps_unref (item->caps); } -SsrcMapItem * -ssrcmap_item_new (guint32 ssrc, guint media_idx) +static SsrcMapItem * +ssrcmap_item_new (GstWebRTCRTPTransceiverDirection direction, guint32 ssrc, + guint media_idx) { - SsrcMapItem *ssrc_item = g_slice_new (SsrcMapItem); + SsrcMapItem *ssrc_item = g_new0 (SsrcMapItem, 1); + ssrc_item->direction = direction; ssrc_item->media_idx = media_idx; ssrc_item->ssrc = ssrc; g_weak_ref_init (&ssrc_item->rtpjitterbuffer, NULL); @@ -299,7 +299,66 @@ ssrcmap_item_free (SsrcMapItem * item) { g_weak_ref_clear (&item->rtpjitterbuffer); - g_slice_free (SsrcMapItem, item); + g_clear_pointer (&item->mid, g_free); + g_clear_pointer (&item->rid, g_free); + g_free (item); +} + +SsrcMapItem * +transport_stream_find_ssrc_map_item (TransportStream * stream, + gconstpointer data, FindSsrcMapFunc func) +{ + int i; + + for (i = 0; i < stream->ssrcmap->len; i++) { + SsrcMapItem *item = g_ptr_array_index (stream->ssrcmap, i); + + if (func (item, data)) + return item; + } + + return NULL; +} + +void +transport_stream_filter_ssrc_map_item (TransportStream * stream, + gconstpointer data, FindSsrcMapFunc func) +{ + int i; + + for (i = 0; i < stream->ssrcmap->len;) { + SsrcMapItem *item = g_ptr_array_index (stream->ssrcmap, i); + + if (!func (item, data)) { + GST_TRACE_OBJECT (stream, "removing ssrc %u", item->ssrc); + g_ptr_array_remove_index_fast (stream->ssrcmap, i); + } else { + i++; + } + } +} + +SsrcMapItem * +transport_stream_add_ssrc_map_item (TransportStream * stream, + GstWebRTCRTPTransceiverDirection direction, guint32 ssrc, guint media_idx) +{ + SsrcMapItem *ret = NULL; + + g_return_val_if_fail (direction == + GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY + || direction == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDONLY, NULL); + g_return_val_if_fail (ssrc != 0, NULL); + + GST_INFO_OBJECT (stream, "Adding mapping for rtp session %u media_idx %u " + "direction %s ssrc %u", stream->session_id, media_idx, + gst_webrtc_rtp_transceiver_direction_to_string (direction), ssrc); + + /* XXX: duplicates? */ + ret = ssrcmap_item_new (direction, ssrc, media_idx); + + g_ptr_array_add (stream->ssrcmap, ret); + + return ret; } static void @@ -307,8 +366,11 @@ { stream->ptmap = g_array_new (FALSE, TRUE, sizeof (PtMapItem)); g_array_set_clear_func (stream->ptmap, (GDestroyNotify) clear_ptmap_item); - stream->remote_ssrcmap = g_ptr_array_new_with_free_func ( + stream->ssrcmap = g_ptr_array_new_with_free_func ( (GDestroyNotify) ssrcmap_item_free); + + stream->rtphdrext_id_stream_id = -1; + stream->rtphdrext_id_repaired_stream_id = -1; } TransportStream *
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/transportstream.h -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/transportstream.h
Changed
@@ -21,6 +21,7 @@ #define __TRANSPORT_STREAM_H__ #include "fwd.h" +#include <gst/rtp/rtp.h> #include <gst/webrtc/rtptransceiver.h> G_BEGIN_DECLS @@ -40,14 +41,14 @@ typedef struct { + GstWebRTCRTPTransceiverDirection direction; guint32 ssrc; guint media_idx; + char *mid; + char *rid; GWeakRef rtpjitterbuffer; /* for stats */ } SsrcMapItem; -SsrcMapItem * ssrcmap_item_new (guint32 ssrc, - guint media_idx); - struct _TransportStream { GstObject parent; @@ -62,11 +63,20 @@ GstWebRTCDTLSTransport *transport; GArray *ptmap; /* array of PtMapItem's */ - GPtrArray *remote_ssrcmap; /* array of SsrcMapItem's */ + GPtrArray *ssrcmap; /* array of SsrcMapItem's */ gboolean output_connected; /* whether receive bin is connected to rtpbin */ + guint rtphdrext_id_stream_id; + guint rtphdrext_id_repaired_stream_id; GstElement *rtxsend; + GstRTPHeaderExtension *rtxsend_stream_id; + GstRTPHeaderExtension *rtxsend_repaired_stream_id; GstElement *rtxreceive; + GstRTPHeaderExtension *rtxreceive_stream_id; + GstRTPHeaderExtension *rtxreceive_repaired_stream_id; + + GstElement *reddec; + GList *fecdecs; }; struct _TransportStreamClass @@ -85,6 +95,21 @@ GstCaps * transport_stream_get_caps_for_pt (TransportStream * stream, guint pt); +typedef gboolean (*FindSsrcMapFunc) (SsrcMapItem * e1, gconstpointer data); + +SsrcMapItem * transport_stream_find_ssrc_map_item (TransportStream * stream, + gconstpointer data, + FindSsrcMapFunc func); + +void transport_stream_filter_ssrc_map_item (TransportStream * stream, + gconstpointer data, + FindSsrcMapFunc func); + +SsrcMapItem * transport_stream_add_ssrc_map_item (TransportStream * stream, + GstWebRTCRTPTransceiverDirection direction, + guint32 ssrc, + guint media_idx); + G_END_DECLS #endif /* __TRANSPORT_STREAM_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/utils.c -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/utils.c
Changed
@@ -132,18 +132,18 @@ g_free (block); } -gchar * +const gchar * _enum_value_to_string (GType type, guint value) { GEnumClass *enum_class; GEnumValue *enum_value; - gchar *str = NULL; + const gchar *str = NULL; enum_class = g_type_class_ref (type); enum_value = g_enum_get_value (enum_class, value); if (enum_value) - str = g_strdup (enum_value->value_nick); + str = enum_value->value_nick; g_type_class_unref (enum_class); @@ -223,3 +223,28 @@ return GST_WEBRTC_KIND_UNKNOWN; } + +char * +_get_msid_from_media (const GstSDPMedia * media) +{ + int i; + + for (i = 0; i < gst_sdp_media_attributes_len (media); i++) { + const GstSDPAttribute *attr = gst_sdp_media_get_attribute (media, i); + const char *start, *end; + + if (!attr->value) + continue; + + start = strstr (attr->value, "msid:"); + if (!start) + continue; + + start += strlen ("msid:"); + end = strstr (start, " "); + if (end) + return g_strndup (start, end - start); + } + + return NULL; +}
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/utils.h -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/utils.h
Changed
@@ -59,13 +59,18 @@ GDestroyNotify notify); G_GNUC_INTERNAL -gchar * _enum_value_to_string (GType type, guint value); +const gchar * _enum_value_to_string (GType type, guint value); G_GNUC_INTERNAL const gchar * _g_checksum_to_webrtc_string (GChecksumType type); G_GNUC_INTERNAL GstCaps * _rtp_caps_from_media (const GstSDPMedia * media); G_GNUC_INTERNAL GstWebRTCKind webrtc_kind_from_caps (const GstCaps * caps); +G_GNUC_INTERNAL +char * _get_msid_from_media (const GstSDPMedia * media); + +#define gst_webrtc_kind_to_string(kind) _enum_value_to_string(GST_TYPE_WEBRTC_KIND, kind) +#define gst_webrtc_rtp_transceiver_direction_to_string(dir) _enum_value_to_string(GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION, dir) G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/webrtcdatachannel.c -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/webrtcdatachannel.c
Changed
@@ -44,12 +44,150 @@ #define GST_CAT_DEFAULT webrtc_data_channel_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); +static void _close_procedure (WebRTCDataChannel * channel, gpointer user_data); + +typedef void (*ChannelTask) (GstWebRTCDataChannel * channel, + gpointer user_data); + +struct task +{ + GstWebRTCDataChannel *channel; + ChannelTask func; + gpointer user_data; + GDestroyNotify notify; +}; + +static GstStructure * +_execute_task (GstWebRTCBin * webrtc, struct task *task) +{ + if (task->func) + task->func (task->channel, task->user_data); + + return NULL; +} + +static void +_free_task (struct task *task) +{ + gst_object_unref (task->channel); + + if (task->notify) + task->notify (task->user_data); + g_free (task); +} + +static void +_channel_enqueue_task (WebRTCDataChannel * channel, ChannelTask func, + gpointer user_data, GDestroyNotify notify) +{ + struct task *task = g_new0 (struct task, 1); + + task->channel = gst_object_ref (channel); + task->func = func; + task->user_data = user_data; + task->notify = notify; + + gst_webrtc_bin_enqueue_task (channel->webrtcbin, + (GstWebRTCBinFunc) _execute_task, task, (GDestroyNotify) _free_task, + NULL); +} + +static void +_channel_store_error (WebRTCDataChannel * channel, GError * error) +{ + GST_WEBRTC_DATA_CHANNEL_LOCK (channel); + if (error) { + GST_WARNING_OBJECT (channel, "Error: %s", + error ? error->message : "Unknown"); + if (!channel->stored_error) + channel->stored_error = error; + else + g_clear_error (&error); + } + GST_WEBRTC_DATA_CHANNEL_UNLOCK (channel); +} + +struct _WebRTCErrorIgnoreBin +{ + GstBin bin; + + WebRTCDataChannel *data_channel; +}; + +G_DEFINE_TYPE (WebRTCErrorIgnoreBin, webrtc_error_ignore_bin, GST_TYPE_BIN); + +static void +webrtc_error_ignore_bin_handle_message (GstBin * bin, GstMessage * message) +{ + WebRTCErrorIgnoreBin *self = WEBRTC_ERROR_IGNORE_BIN (bin); + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR:{ + GError *error = NULL; + gst_message_parse_error (message, &error, NULL); + GST_DEBUG_OBJECT (bin, "handling error message from internal element"); + _channel_store_error (self->data_channel, error); + _channel_enqueue_task (self->data_channel, (ChannelTask) _close_procedure, + NULL, NULL); + break; + } + default: + GST_BIN_CLASS (webrtc_error_ignore_bin_parent_class)->handle_message (bin, + message); + break; + } +} + +static void +webrtc_error_ignore_bin_class_init (WebRTCErrorIgnoreBinClass * klass) +{ + GstBinClass *bin_class = (GstBinClass *) klass; + + bin_class->handle_message = webrtc_error_ignore_bin_handle_message; +} + +static void +webrtc_error_ignore_bin_init (WebRTCErrorIgnoreBin * bin) +{ +} + +static GstElement * +webrtc_error_ignore_bin_new (WebRTCDataChannel * data_channel, + GstElement * other) +{ + WebRTCErrorIgnoreBin *self; + GstPad *pad; + + self = g_object_new (webrtc_error_ignore_bin_get_type (), NULL); + self->data_channel = data_channel; + + gst_bin_add (GST_BIN (self), other); + + pad = gst_element_get_static_pad (other, "src"); + if (pad) { + GstPad *ghost_pad = gst_ghost_pad_new ("src", pad); + gst_element_add_pad (GST_ELEMENT (self), ghost_pad); + gst_clear_object (&pad); + } + pad = gst_element_get_static_pad (other, "sink"); + if (pad) { + GstPad *ghost_pad = gst_ghost_pad_new ("sink", pad); + gst_element_add_pad (GST_ELEMENT (self), ghost_pad); + gst_clear_object (&pad); + } + + return (GstElement *) self; +} + #define webrtc_data_channel_parent_class parent_class G_DEFINE_TYPE_WITH_CODE (WebRTCDataChannel, webrtc_data_channel, GST_TYPE_WEBRTC_DATA_CHANNEL, GST_DEBUG_CATEGORY_INIT (webrtc_data_channel_debug, "webrtcdatachannel", 0, "webrtcdatachannel");); +G_LOCK_DEFINE_STATIC (outstanding_channels_lock); +static GList *outstanding_channels; + typedef enum { DATA_CHANNEL_PPID_WEBRTC_CONTROL = 50, @@ -210,67 +348,6 @@ return buf; } -typedef void (*ChannelTask) (GstWebRTCDataChannel * channel, - gpointer user_data); - -struct task -{ - GstWebRTCDataChannel *channel; - ChannelTask func; - gpointer user_data; - GDestroyNotify notify; -}; - -static GstStructure * -_execute_task (GstWebRTCBin * webrtc, struct task *task) -{ - if (task->func) - task->func (task->channel, task->user_data); - - return NULL; -} - -static void -_free_task (struct task *task) -{ - gst_object_unref (task->channel); - - if (task->notify) - task->notify (task->user_data); - g_free (task); -} - -static void -_channel_enqueue_task (WebRTCDataChannel * channel, ChannelTask func, - gpointer user_data, GDestroyNotify notify) -{ - struct task *task = g_new0 (struct task, 1); - - task->channel = gst_object_ref (channel); - task->func = func; - task->user_data = user_data; - task->notify = notify; - - gst_webrtc_bin_enqueue_task (channel->webrtcbin, - (GstWebRTCBinFunc) _execute_task, task, (GDestroyNotify) _free_task, - NULL); -} - -static void -_channel_store_error (WebRTCDataChannel * channel, GError * error) -{ - GST_WEBRTC_DATA_CHANNEL_LOCK (channel); - if (error) { - GST_WARNING_OBJECT (channel, "Error: %s", - error ? error->message : "Unknown"); - if (!channel->stored_error) - channel->stored_error = error; - else - g_clear_error (&error); - } - GST_WEBRTC_DATA_CHANNEL_UNLOCK (channel); -} - static void _emit_on_open (WebRTCDataChannel * channel, gpointer user_data) { @@ -287,6 +364,10 @@ error = channel->stored_error; channel->stored_error = NULL; + GST_TRACE_OBJECT (channel, "transport closed, peer closed %u error %p " + "buffered %" G_GUINT64_FORMAT, channel->peer_closed, error, + channel->parent.buffered_amount); + both_sides_closed = channel->peer_closed && channel->parent.buffered_amount <= 0; if (both_sides_closed || error) { @@ -311,7 +392,7 @@ GST_INFO_OBJECT (channel, "Closing outgoing SCTP stream %i label \"%s\"", channel->parent.id, channel->parent.label); - pad = gst_element_get_static_pad (channel->appsrc, "src"); + pad = gst_element_get_static_pad (channel->src_bin, "src"); peer = gst_pad_get_peer (pad); gst_object_unref (pad); @@ -319,6 +400,7 @@ GstElement *sctpenc = gst_pad_get_parent_element (peer); if (sctpenc) { + GST_TRACE_OBJECT (channel, "removing sctpenc pad %" GST_PTR_FORMAT, peer); gst_element_release_request_pad (sctpenc, peer); gst_object_unref (sctpenc); } @@ -481,6 +563,8 @@ if (ret != GST_FLOW_OK) { g_set_error (error, GST_WEBRTC_ERROR, GST_WEBRTC_ERROR_DATA_CHANNEL_FAILURE, "Could not send ack packet"); + GST_WARNING_OBJECT (channel, "push returned %i, %s", ret, + gst_flow_get_name (ret)); return ret; } @@ -742,35 +826,30 @@ return size <= channel->sctp_transport->max_message_size; } -static void +static gboolean webrtc_data_channel_send_data (GstWebRTCDataChannel * base_channel, - GBytes * bytes) + GBytes * bytes, GError ** error) { WebRTCDataChannel *channel = WEBRTC_DATA_CHANNEL (base_channel); GstSctpSendMetaPartiallyReliability reliability; guint rel_param; guint32 ppid; GstBuffer *buffer; + gsize size = 0; GstFlowReturn ret; if (!bytes) { buffer = gst_buffer_new (); ppid = DATA_CHANNEL_PPID_WEBRTC_BINARY_EMPTY; } else { - gsize size; guint8 *data; data = (guint8 *) g_bytes_get_data (bytes, &size); - g_return_if_fail (data != NULL); + g_return_val_if_fail (data != NULL, FALSE); if (!_is_within_max_message_size (channel, size)) { - GError *error = NULL; - g_set_error (&error, GST_WEBRTC_ERROR, - GST_WEBRTC_ERROR_DATA_CHANNEL_FAILURE, + g_set_error (error, GST_WEBRTC_ERROR, GST_WEBRTC_ERROR_TYPE_ERROR, "Requested to send data that is too large"); - _channel_store_error (channel, error); - _channel_enqueue_task (channel, (ChannelTask) _close_procedure, NULL, - NULL); - return; + return FALSE; } buffer = gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, data, size, @@ -786,52 +865,63 @@ buffer); GST_WEBRTC_DATA_CHANNEL_LOCK (channel); - channel->parent.buffered_amount += gst_buffer_get_size (buffer); + if (channel->parent.ready_state == GST_WEBRTC_DATA_CHANNEL_STATE_OPEN) { + channel->parent.buffered_amount += size; + } else { + GST_WEBRTC_DATA_CHANNEL_UNLOCK (channel); + g_set_error (error, GST_WEBRTC_ERROR, + GST_WEBRTC_ERROR_INVALID_STATE, "channel is not open"); + return FALSE; + } GST_WEBRTC_DATA_CHANNEL_UNLOCK (channel); - g_object_notify (G_OBJECT (&channel->parent), "buffered-amount"); ret = gst_app_src_push_buffer (GST_APP_SRC (channel->appsrc), buffer); - - if (ret != GST_FLOW_OK) { - GError *error = NULL; - g_set_error (&error, GST_WEBRTC_ERROR, + if (ret == GST_FLOW_OK) { + g_object_notify (G_OBJECT (&channel->parent), "buffered-amount"); + } else { + g_set_error (error, GST_WEBRTC_ERROR, GST_WEBRTC_ERROR_DATA_CHANNEL_FAILURE, "Failed to send data"); - _channel_store_error (channel, error); + GST_WARNING_OBJECT (channel, "push returned %i, %s", ret, + gst_flow_get_name (ret)); + + GST_WEBRTC_DATA_CHANNEL_LOCK (channel); + channel->parent.buffered_amount -= size; + GST_WEBRTC_DATA_CHANNEL_UNLOCK (channel); + _channel_enqueue_task (channel, (ChannelTask) _close_procedure, NULL, NULL); + return FALSE; } + + return TRUE; } -static void +static gboolean webrtc_data_channel_send_string (GstWebRTCDataChannel * base_channel, - const gchar * str) + const gchar * str, GError ** error) { WebRTCDataChannel *channel = WEBRTC_DATA_CHANNEL (base_channel); GstSctpSendMetaPartiallyReliability reliability; guint rel_param; guint32 ppid; GstBuffer *buffer; + gsize size = 0; GstFlowReturn ret; if (!channel->parent.negotiated) - g_return_if_fail (channel->opened); - g_return_if_fail (channel->sctp_transport != NULL); + g_return_val_if_fail (channel->opened, FALSE); + g_return_val_if_fail (channel->sctp_transport != NULL, FALSE); if (!str) { buffer = gst_buffer_new (); ppid = DATA_CHANNEL_PPID_WEBRTC_STRING_EMPTY; } else { - gsize size = strlen (str); gchar *str_copy; + size = strlen (str); if (!_is_within_max_message_size (channel, size)) { - GError *error = NULL; - g_set_error (&error, GST_WEBRTC_ERROR, - GST_WEBRTC_ERROR_DATA_CHANNEL_FAILURE, + g_set_error (error, GST_WEBRTC_ERROR, GST_WEBRTC_ERROR_TYPE_ERROR, "Requested to send a string that is too large"); - _channel_store_error (channel, error); - _channel_enqueue_task (channel, (ChannelTask) _close_procedure, NULL, - NULL); - return; + return FALSE; } str_copy = g_strdup (str); @@ -849,19 +939,32 @@ buffer); GST_WEBRTC_DATA_CHANNEL_LOCK (channel); - channel->parent.buffered_amount += gst_buffer_get_size (buffer); + if (channel->parent.ready_state == GST_WEBRTC_DATA_CHANNEL_STATE_OPEN) { + channel->parent.buffered_amount += size; + } else { + GST_WEBRTC_DATA_CHANNEL_UNLOCK (channel); + g_set_error (error, GST_WEBRTC_ERROR, + GST_WEBRTC_ERROR_INVALID_STATE, "channel is not open"); + return FALSE; + } GST_WEBRTC_DATA_CHANNEL_UNLOCK (channel); - g_object_notify (G_OBJECT (&channel->parent), "buffered-amount"); ret = gst_app_src_push_buffer (GST_APP_SRC (channel->appsrc), buffer); - - if (ret != GST_FLOW_OK) { - GError *error = NULL; - g_set_error (&error, GST_WEBRTC_ERROR, + if (ret == GST_FLOW_OK) { + g_object_notify (G_OBJECT (&channel->parent), "buffered-amount"); + } else { + g_set_error (error, GST_WEBRTC_ERROR, GST_WEBRTC_ERROR_DATA_CHANNEL_FAILURE, "Failed to send string"); - _channel_store_error (channel, error); + + GST_WEBRTC_DATA_CHANNEL_LOCK (channel); + channel->parent.buffered_amount -= size; + GST_WEBRTC_DATA_CHANNEL_UNLOCK (channel); + _channel_enqueue_task (channel, (ChannelTask) _close_procedure, NULL, NULL); + return FALSE; } + + return TRUE; } static void @@ -877,13 +980,37 @@ } } +static WebRTCDataChannel * +ensure_channel_alive (WebRTCDataChannel * channel) +{ + /* ghetto impl of, does the channel still exist?. + * Needed because g_signal_handler_disconnect*() will not disconnect any + * running functions and _finalize() implementation can complete and + * invalidate channel */ + G_LOCK (outstanding_channels_lock); + if (g_list_find (outstanding_channels, channel)) { + g_object_ref (channel); + } else { + G_UNLOCK (outstanding_channels_lock); + return NULL; + } + G_UNLOCK (outstanding_channels_lock); + + return channel; +} + static void _on_sctp_notify_state (GObject * sctp_transport, GParamSpec * pspec, WebRTCDataChannel * channel) { + if (!(channel = ensure_channel_alive (channel))) + return; + GST_WEBRTC_DATA_CHANNEL_LOCK (channel); _on_sctp_notify_state_unlocked (sctp_transport, channel); GST_WEBRTC_DATA_CHANNEL_UNLOCK (channel); + + g_object_unref (channel); } static void @@ -939,10 +1066,15 @@ static void gst_webrtc_data_channel_constructed (GObject * object) { - WebRTCDataChannel *channel = WEBRTC_DATA_CHANNEL (object); + WebRTCDataChannel *channel; GstPad *pad; GstCaps *caps; + G_OBJECT_CLASS (parent_class)->constructed (object); + + channel = WEBRTC_DATA_CHANNEL (object); + GST_DEBUG ("New channel %p constructed", channel); + caps = gst_caps_new_any (); channel->appsrc = gst_element_factory_make ("appsrc", NULL); @@ -952,6 +1084,8 @@ channel->src_probe = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_DATA_BOTH, (GstPadProbeCallback) on_appsrc_data, channel, NULL); + channel->src_bin = webrtc_error_ignore_bin_new (channel, channel->appsrc); + channel->appsink = gst_element_factory_make ("appsink", NULL); gst_object_ref_sink (channel->appsink); g_object_set (channel->appsink, "sync", FALSE, "async", FALSE, "caps", caps, @@ -959,11 +1093,23 @@ gst_app_sink_set_callbacks (GST_APP_SINK (channel->appsink), &sink_callbacks, channel, NULL); + channel->sink_bin = webrtc_error_ignore_bin_new (channel, channel->appsink); + gst_object_unref (pad); gst_caps_unref (caps); } static void +gst_webrtc_data_channel_dispose (GObject * object) +{ + G_LOCK (outstanding_channels_lock); + outstanding_channels = g_list_remove (outstanding_channels, object); + G_UNLOCK (outstanding_channels_lock); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void gst_webrtc_data_channel_finalize (GObject * object) { WebRTCDataChannel *channel = WEBRTC_DATA_CHANNEL (object); @@ -993,6 +1139,7 @@ (GstWebRTCDataChannelClass *) klass; gobject_class->constructed = gst_webrtc_data_channel_constructed; + gobject_class->dispose = gst_webrtc_data_channel_dispose; gobject_class->finalize = gst_webrtc_data_channel_finalize; channel_class->send_data = webrtc_data_channel_send_data; @@ -1003,6 +1150,9 @@ static void webrtc_data_channel_init (WebRTCDataChannel * channel) { + G_LOCK (outstanding_channels_lock); + outstanding_channels = g_list_prepend (outstanding_channels, channel); + G_UNLOCK (outstanding_channels_lock); } static void @@ -1015,6 +1165,7 @@ GST_WEBRTC_DATA_CHANNEL_LOCK (channel); if (channel->sctp_transport) g_signal_handlers_disconnect_by_data (channel->sctp_transport, channel); + GST_TRACE_OBJECT (channel, "set sctp %p", sctp); gst_object_replace ((GstObject **) & channel->sctp_transport, GST_OBJECT (sctp)); @@ -1042,7 +1193,7 @@ _data_channel_set_sctp_transport (channel, sctp_transport); pad_name = g_strdup_printf ("sink_%u", id); - if (!gst_element_link_pads (channel->appsrc, "src", + if (!gst_element_link_pads (channel->src_bin, "src", channel->sctp_transport->sctpenc, pad_name)) g_warn_if_reached (); g_free (pad_name);
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/webrtcdatachannel.h -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/webrtcdatachannel.h
Changed
@@ -46,7 +46,9 @@ GstWebRTCDataChannel parent; WebRTCSCTPTransport *sctp_transport; + GstElement *src_bin; GstElement *appsrc; + GstElement *sink_bin; GstElement *appsink; GstWebRTCBin *webrtcbin; @@ -70,6 +72,8 @@ void webrtc_data_channel_link_to_sctp (WebRTCDataChannel *channel, WebRTCSCTPTransport *sctp_transport); +G_DECLARE_FINAL_TYPE (WebRTCErrorIgnoreBin, webrtc_error_ignore_bin, WEBRTC, ERROR_IGNORE_BIN, GstBin); + G_END_DECLS #endif /* __WEBRTC_DATA_CHANNEL_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/webrtcsctptransport.h -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/webrtcsctptransport.h
Changed
@@ -23,7 +23,7 @@ #include <gst/gst.h> #include <gst/webrtc/webrtc.h> #include <gst/webrtc/sctptransport.h> -#include "gstwebrtcice.h" +#include "fwd.h" #include "gst/webrtc/webrtc-priv.h"
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/webrtcsdp.c -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/webrtcsdp.c
Changed
@@ -81,15 +81,14 @@ return TRUE; { - gchar *state_str = _enum_value_to_string (GST_TYPE_WEBRTC_SIGNALING_STATE, + const gchar *state_str = + _enum_value_to_string (GST_TYPE_WEBRTC_SIGNALING_STATE, state); - gchar *type_str = _enum_value_to_string (GST_TYPE_WEBRTC_SDP_TYPE, type); - g_set_error (error, GST_WEBRTC_ERROR, - GST_WEBRTC_ERROR_INVALID_STATE, + const gchar *type_str = + _enum_value_to_string (GST_TYPE_WEBRTC_SDP_TYPE, type); + g_set_error (error, GST_WEBRTC_ERROR, GST_WEBRTC_ERROR_INVALID_STATE, "Not in the correct state (%s) for setting %s %s description", state_str, _sdp_source_to_string (source), type_str); - g_free (state_str); - g_free (type_str); } return FALSE; @@ -425,12 +424,10 @@ _media_replace_direction (GstSDPMedia * media, GstWebRTCRTPTransceiverDirection direction) { - gchar *dir_str; + const gchar *dir_str; int i; - dir_str = - _enum_value_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION, - direction); + dir_str = gst_webrtc_rtp_transceiver_direction_to_string (direction); for (i = 0; i < gst_sdp_media_attributes_len (media); i++) { const GstSDPAttribute *attr = gst_sdp_media_get_attribute (media, i); @@ -443,14 +440,12 @@ GST_TRACE ("replace %s with %s", attr->key, dir_str); gst_sdp_attribute_set (&new_attr, dir_str, ""); gst_sdp_media_replace_attribute (media, i, &new_attr); - g_free (dir_str); return; } } GST_TRACE ("add %s", dir_str); gst_sdp_media_add_attribute (media, dir_str, ""); - g_free (dir_str); } GstWebRTCRTPTransceiverDirection @@ -556,7 +551,7 @@ void _media_replace_setup (GstSDPMedia * media, GstWebRTCDTLSSetup setup) { - gchar *setup_str; + const gchar *setup_str; int i; setup_str = _enum_value_to_string (GST_TYPE_WEBRTC_DTLS_SETUP, setup); @@ -569,14 +564,12 @@ GST_TRACE ("replace setup:%s with setup:%s", attr->value, setup_str); gst_sdp_attribute_set (&new_attr, "setup", setup_str); gst_sdp_media_replace_attribute (media, i, &new_attr); - g_free (setup_str); return; } } GST_TRACE ("add setup:%s", setup_str); gst_sdp_media_add_attribute (media, "setup", setup_str); - g_free (setup_str); } GstWebRTCDTLSSetup
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/webrtctransceiver.c -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/webrtctransceiver.c
Changed
@@ -148,17 +148,21 @@ { WebRTCTransceiver *trans = WEBRTC_TRANSCEIVER (object); - if (trans->stream) - gst_object_unref (trans->stream); - trans->stream = NULL; + gst_clear_object (&trans->stream); + gst_clear_object (&trans->ulpfecdec); + gst_clear_object (&trans->ulpfecenc); + gst_clear_object (&trans->redenc); if (trans->local_rtx_ssrc_map) gst_structure_free (trans->local_rtx_ssrc_map); trans->local_rtx_ssrc_map = NULL; - gst_caps_replace (&trans->last_configured_caps, NULL); + gst_caps_replace (&trans->last_retrieved_caps, NULL); + gst_caps_replace (&trans->last_send_configured_caps, NULL); - gst_event_replace (&trans->ssrc_event, NULL); + g_free (trans->pending_mid); + + gst_event_replace (&trans->tos_event, NULL); G_OBJECT_CLASS (parent_class)->finalize (object); }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtc/webrtctransceiver.h -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtc/webrtctransceiver.h
Changed
@@ -40,17 +40,27 @@ TransportStream *stream; GstStructure *local_rtx_ssrc_map; - guint current_ssrc; - GstEvent *ssrc_event; + GstEvent *tos_event; /* Properties */ GstWebRTCFECType fec_type; guint fec_percentage; gboolean do_nack; - GstCaps *last_configured_caps; + /* The last caps that we put into to a SDP media section */ + GstCaps *last_retrieved_caps; + /* The last caps that we successfully configured from a valid + * set_local/remote description call. + */ + GstCaps *last_send_configured_caps; + + gchar *pending_mid; gboolean mline_locked; + + GstElement *ulpfecdec; + GstElement *ulpfecenc; + GstElement *redenc; }; struct _WebRTCTransceiverClass
View file
gst-plugins-bad-1.20.5.tar.xz/ext/webrtcdsp/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/webrtcdsp/meson.build
Changed
@@ -22,6 +22,5 @@ install_dir : plugins_install_dir, override_options : 'cpp_std=c++11', ) - pkgconfig.generate(gstwebrtcdsp, install_dir : plugins_pkgconfig_install_dir) plugins += gstwebrtcdsp endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wildmidi/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/wildmidi/meson.build
Changed
@@ -30,7 +30,6 @@ install: true, install_dir: plugins_install_dir, ) - pkgconfig.generate(gstwildmidi, install_dir: plugins_pkgconfig_install_dir) plugins += gstwildmidi elif get_option('wildmidi').enabled() error('WildMidi plugin explicitly enabled, but required library or headers not found.')
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wpe/WPEThreadedView.cpp -> gst-plugins-bad-1.22.0.tar.xz/ext/wpe/WPEThreadedView.cpp
Changed
@@ -695,6 +695,27 @@ }); } +static void s_runJavascriptFinished(GObject* object, GAsyncResult* result, gpointer user_data) +{ + WebKitJavascriptResult* js_result; + GError* error = NULL; + + js_result = webkit_web_view_run_javascript_finish(WEBKIT_WEB_VIEW(object), result, &error); + if (!js_result) { + GST_WARNING("Error running javascript: %s", error->message); + g_error_free(error); + return; + } + webkit_javascript_result_unref(js_result); +} + +void WPEView::runJavascript(const char* script) +{ + s_view->dispatch(&() { + webkit_web_view_run_javascript(webkit.view, script, nullptr, s_runJavascriptFinished, nullptr); + }); +} + void WPEView::loadData(GBytes* bytes) { s_view->dispatch(this, bytes = g_bytes_ref(bytes)() { @@ -857,3 +878,10 @@ wpe_view_backend_dispatch_axis_event(backend(), &wpe_event); }); } + +void WPEView::dispatchTouchEvent(struct wpe_input_touch_event& wpe_event) +{ + s_view->dispatch(&() { + wpe_view_backend_dispatch_touch_event(backend(), &wpe_event); + }); +}
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wpe/WPEThreadedView.h -> gst-plugins-bad-1.22.0.tar.xz/ext/wpe/WPEThreadedView.h
Changed
@@ -43,6 +43,7 @@ void resize(int width, int height); void loadUri(const gchar*); void loadData(GBytes*); + void runJavascript(const gchar*); void setDrawBackground(gboolean); GstEGLImage* image(); @@ -51,6 +52,7 @@ void dispatchKeyboardEvent(struct wpe_input_keyboard_event&); void dispatchPointerEvent(struct wpe_input_pointer_event&); void dispatchAxisEvent(struct wpe_input_axis_event&); + void dispatchTouchEvent(struct wpe_input_touch_event&); /* Used by WPEContextThread */ bool hasUri() const { return webkit.uri; }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wpe/gstwpe.h -> gst-plugins-bad-1.22.0.tar.xz/ext/wpe/gstwpe.h
Changed
@@ -21,4 +21,5 @@ #include <gst/gst.h> +#define DEFAULT_LOCATION "about:blank" const gchar *gst_wpe_get_devenv_extension_path (void);
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wpe/gstwpesrcbin.cpp -> gst-plugins-bad-1.22.0.tar.xz/ext/wpe/gstwpesrcbin.cpp
Changed
@@ -48,10 +48,14 @@ * ### Show the GStreamer website homepage as played with GstPlayer in a GTK+ window * * ``` - * gst-play-1.0 --videosink gtkglsink wpe://https://gstreamer.freedesktop.org + * export GST_PLUGIN_FEATURE_RANK="wpesrc:MAX" + * gst-play-1.0 --videosink gtkglsink web+https://gstreamer.freedesktop.org * ``` * - * The `web://` URI protocol is also supported, as an alias to `wpe://`. Since: 1.20 + * Until 1.20 the `web://` URI protocol was supported, along with `wpe://`. + * + * The supported URI protocols are `web+http://`, `web+https://` and `web+file://`. + * Since: 1.22 * * ### Composite WPE with a video stream in a single OpenGL scene * @@ -108,7 +112,7 @@ gst_wpe_audio_pad_init (GstWpeAudioPad * pad) { gst_audio_info_init (&pad->info); - pad->discont_pending = FALSE; + pad->discont_pending = TRUE; pad->buffer_time = 0; } @@ -134,7 +138,6 @@ GstElement *video_src; GHashTable *audio_src_pads; GstFlowCombiner *flow_combiner; - gchar *uri; }; enum @@ -147,6 +150,7 @@ enum { SIGNAL_LOAD_BYTES, + SIGNAL_RUN_JAVASCRIPT, LAST_SIGNAL }; @@ -339,6 +343,15 @@ } static void +gst_wpe_src_run_javascript (GstWpeVideoSrc * src, const gchar * script) +{ + GstWpeSrc *self = GST_WPE_SRC (src); + + if (self->video_src) + g_signal_emit_by_name (self->video_src, "run-javascript", script, NULL); +} + +static void gst_wpe_src_set_location (GstWpeSrc * src, const gchar * location) { g_object_set (src->video_src, "location", location, NULL); @@ -377,7 +390,7 @@ static const gchar *const * gst_wpe_src_get_protocols (GType) { - static const char *protocols = { "wpe", "web", NULL }; + static const gchar *protocols = {"web+http", "web+https", "web+file", NULL}; return protocols; } @@ -385,22 +398,36 @@ gst_wpe_src_get_uri (GstURIHandler * handler) { GstWpeSrc *src = GST_WPE_SRC (handler); + gchar *ret = NULL; + + g_object_get(src->video_src, "location", &ret, NULL); - return g_strdup (src->uri); + return ret; } static gboolean -gst_wpe_src_set_uri (GstURIHandler * handler, const gchar * uri, +gst_wpe_src_set_uri (GstURIHandler * handler, const gchar * uristr, GError ** error) { + gboolean res = TRUE; + gchar *location; GstWpeSrc *src = GST_WPE_SRC (handler); + const gchar *protocol; + GstUri *uri; - if (src->uri) { - g_free (src->uri); - } - src->uri = g_strdup (uri); - gst_wpe_src_set_location(src, uri + 6); - return TRUE; + protocol = gst_uri_get_protocol (uristr); + g_return_val_if_fail (g_str_has_prefix (protocol, "web+"), FALSE); + + uri = gst_uri_from_string (uristr); + gst_uri_set_scheme (uri, protocol + 4); + + location = gst_uri_to_string (uri); + gst_wpe_src_set_location (src, location); + + gst_uri_unref (uri); + g_free (location); + + return res; } static void @@ -484,7 +511,6 @@ g_hash_table_unref (src->audio_src_pads); gst_flow_combiner_free (src->flow_combiner); gst_object_unref (src->fd_allocator); - g_free (src->uri); GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object)); } @@ -500,7 +526,7 @@ gobject_class->finalize = gst_wpe_src_finalize; g_object_class_install_property (gobject_class, PROP_LOCATION, - g_param_spec_string ("location", "location", "The URL to display", "", + g_param_spec_string ("location", "location", "The URL to display", DEFAULT_LOCATION, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_DRAW_BACKGROUND, g_param_spec_boolean ("draw-background", "Draws the background", @@ -526,6 +552,21 @@ G_CALLBACK (gst_wpe_src_load_bytes), NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_BYTES); + /** + * GstWpeSrc::run-javascript: + * @src: the object which received the signal + * @script: the script to run + * + * Asynchronously run script in the context of the current page on the + * internal webView. + * + * Since: 1.22 + */ + gst_wpe_video_src_signalsSIGNAL_RUN_JAVASCRIPT = + g_signal_new_class_handler ("run-javascript", G_TYPE_FROM_CLASS (klass), + static_cast < GSignalFlags > (G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + G_CALLBACK (gst_wpe_src_run_javascript), NULL, NULL, NULL, G_TYPE_NONE, 1, + G_TYPE_STRING); element_class->change_state = GST_DEBUG_FUNCPTR (gst_wpe_src_change_state); gst_element_class_add_static_pad_template (element_class, &video_src_factory);
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wpe/gstwpevideosrc.cpp -> gst-plugins-bad-1.22.0.tar.xz/ext/wpe/gstwpevideosrc.cpp
Changed
@@ -53,7 +53,7 @@ * Saves the first 50 video frames generated for the GStreamer website as PNG files in /tmp. * * ```shell - * gst-play-1.0 --videosink gtkglsink wpe://https://gstreamer.freedesktop.org + * gst-play-1.0 --videosink gtkglsink web+https://gstreamer.freedesktop.org * ``` * Shows the GStreamer website homepage as played with GstPlayer in a GTK+ window. * @@ -84,6 +84,7 @@ #include <config.h> #endif +#include "gstwpe.h" #include "gstwpevideosrc.h" #include <gst/gl/gl.h> #include <gst/gl/egl/gstglmemoryegl.h> @@ -110,6 +111,7 @@ { SIGNAL_CONFIGURE_WEB_VIEW, SIGNAL_LOAD_BYTES, + SIGNAL_RUN_JAVASCRIPT, LAST_SIGNAL }; static guint gst_wpe_video_src_signalsLAST_SIGNAL = { 0 }; @@ -129,6 +131,9 @@ WPEView *view; + GArray *touch_points; + struct wpe_input_touch_event_raw *last_touch; + GMutex lock; }; @@ -456,6 +461,15 @@ } static void +gst_wpe_video_src_run_javascript (GstWpeVideoSrc * src, const gchar * script) +{ + if (src->view && GST_STATE (GST_ELEMENT_CAST (src)) > GST_STATE_NULL) { + GST_INFO_OBJECT (src, "running javascript"); + src->view->runJavascript (script); + } +} + +static void gst_wpe_video_src_load_bytes (GstWpeVideoSrc * src, GBytes * bytes) { if (src->view && GST_STATE (GST_ELEMENT_CAST (src)) > GST_STATE_NULL) { @@ -550,6 +564,49 @@ } } +static void +_set_touch_point (struct wpe_input_touch_event_raw * point, + GstEvent * event, enum wpe_input_touch_event_type type, guint id, gdouble x, + gdouble y) +{ + + point->time = GST_TIME_AS_MSECONDS (GST_EVENT_TIMESTAMP (event)); + point->type = type; + point->id = (int) id; + point->x = (int32_t) x; + point->y = (int32_t) y; +} + +static uint32_t +_gst_modifiers_to_wpe (GstEvent * ev) +{ + GstNavigationModifierType modifier_state; + uint32_t modifiers = 0; + + if (gst_navigation_event_parse_modifier_state (ev, &modifier_state)) { + if (modifier_state & GST_NAVIGATION_MODIFIER_CONTROL_MASK) + modifiers |= wpe_input_keyboard_modifier_control; + if (modifier_state & GST_NAVIGATION_MODIFIER_SHIFT_MASK) + modifiers |= wpe_input_keyboard_modifier_shift; + if (modifier_state & GST_NAVIGATION_MODIFIER_MOD1_MASK) + modifiers |= wpe_input_keyboard_modifier_alt; + if (modifier_state & GST_NAVIGATION_MODIFIER_META_MASK) + modifiers |= wpe_input_keyboard_modifier_meta; + if (modifier_state & GST_NAVIGATION_MODIFIER_BUTTON1_MASK) + modifiers |= wpe_input_pointer_modifier_button1; + if (modifier_state & GST_NAVIGATION_MODIFIER_BUTTON2_MASK) + modifiers |= wpe_input_pointer_modifier_button2; + if (modifier_state & GST_NAVIGATION_MODIFIER_BUTTON3_MASK) + modifiers |= wpe_input_pointer_modifier_button3; + if (modifier_state & GST_NAVIGATION_MODIFIER_BUTTON4_MASK) + modifiers |= wpe_input_pointer_modifier_button4; + if (modifier_state & GST_NAVIGATION_MODIFIER_BUTTON5_MASK) + modifiers |= wpe_input_pointer_modifier_button5; + } + + return modifiers; +} + static gboolean gst_wpe_video_src_event (GstBaseSrc * base_src, GstEvent * event) { @@ -559,6 +616,7 @@ if (src->view && GST_EVENT_TYPE (event) == GST_EVENT_NAVIGATION) { const gchar *key; gint button; + guint touch_id; gdouble x, y, delta_x, delta_y; GST_DEBUG_OBJECT (src, "Processing event %" GST_PTR_FORMAT, event); @@ -568,13 +626,23 @@ if (gst_navigation_event_parse_key_event (event, &key)) { /* FIXME: This is wrong... The GstNavigation API should pass hardware-level information, not high-level keysym strings */ - uint32_t keysym = + gunichar *unichar; + glong items_written; + uint32_t keysym; + struct wpe_input_keyboard_event wpe_event = { 0 }; + + unichar = g_utf8_to_ucs4_fast (key, -1, &items_written); + if (items_written == 1) + keysym = (uint32_t) xkb_utf32_to_keysym (*unichar); + else + keysym = (uint32_t) xkb_keysym_from_name (key, XKB_KEYSYM_NO_FLAGS); - struct wpe_input_keyboard_event wpe_event; + wpe_event.key_code = keysym; wpe_event.pressed = gst_navigation_event_get_type (event) == GST_NAVIGATION_EVENT_KEY_PRESS; + wpe_event.modifiers = _gst_modifiers_to_wpe (event); src->view->dispatchKeyboardEvent (wpe_event); ret = TRUE; } @@ -588,17 +656,7 @@ wpe_event.type = wpe_input_pointer_event_type_button; wpe_event.x = (int) x; wpe_event.y = (int) y; - if (button == 1) { - wpe_event.modifiers = wpe_input_pointer_modifier_button1; - } else if (button == 2) { - wpe_event.modifiers = wpe_input_pointer_modifier_button2; - } else if (button == 3) { - wpe_event.modifiers = wpe_input_pointer_modifier_button3; - } else if (button == 4) { - wpe_event.modifiers = wpe_input_pointer_modifier_button4; - } else if (button == 5) { - wpe_event.modifiers = wpe_input_pointer_modifier_button5; - } + wpe_event.modifiers = _gst_modifiers_to_wpe (event); wpe_event.button = button; wpe_event.state = gst_navigation_event_get_type (event) == @@ -614,6 +672,7 @@ wpe_event.type = wpe_input_pointer_event_type_motion; wpe_event.x = (int) x; wpe_event.y = (int) y; + wpe_event.modifiers = _gst_modifiers_to_wpe (event); src->view->dispatchPointerEvent (wpe_event); ret = TRUE; } @@ -637,10 +696,91 @@ ret = TRUE; } break; + case GST_NAVIGATION_EVENT_TOUCH_DOWN: + if (gst_navigation_event_parse_touch_event (event, &touch_id, &x, &y, + NULL)) { + struct wpe_input_touch_event_raw *point = g_new + (struct wpe_input_touch_event_raw, 1); + + _set_touch_point (point, event, wpe_input_touch_event_type_down, + touch_id, x, y); + src->touch_points = g_array_append_vals(src->touch_points, point, 1); + src->last_touch = point; + ret = TRUE; + } + break; + case GST_NAVIGATION_EVENT_TOUCH_MOTION: + if (gst_navigation_event_parse_touch_event (event, &touch_id, &x, &y, + NULL)) { + struct wpe_input_touch_event_raw *touch_points; + guint idx; + + touch_points = (struct wpe_input_touch_event_raw *) + src->touch_points->data; + for (idx = 0; idx < src->touch_points->len; idx++) { + if (touch_pointsidx.id == (int32_t) touch_id) { + _set_touch_point (&touch_pointsidx, event, + wpe_input_touch_event_type_motion, touch_id, x, y); + src->last_touch = &touch_pointsidx; + break; + } + } + ret = TRUE; + } + break; + case GST_NAVIGATION_EVENT_TOUCH_UP: + if (gst_navigation_event_parse_touch_up_event (event, &touch_id, &x, + &y)) { + struct wpe_input_touch_event_raw *touch_points; + guint idx; + + touch_points = (struct wpe_input_touch_event_raw *) + src->touch_points->data; + for (idx = 0; idx < src->touch_points->len; idx++) { + if (touch_pointsidx.id == (int32_t) touch_id) { + _set_touch_point (&touch_pointsidx, event, + wpe_input_touch_event_type_up, touch_id, x, y); + src->last_touch = &touch_pointsidx; + break; + } + } + ret = TRUE; + } + break; + case GST_NAVIGATION_EVENT_TOUCH_FRAME: + if (src->last_touch && src->touch_points->len > 0) + { + struct wpe_input_touch_event_raw *touch_points; + struct wpe_input_touch_event wpe_event; + guint idx; + + wpe_event.touchpoints = + (struct wpe_input_touch_event_raw *) src->touch_points->data; + wpe_event.touchpoints_length = src->touch_points->len; + wpe_event.type = src->last_touch->type; + wpe_event.id = src->last_touch->id; + wpe_event.modifiers = _gst_modifiers_to_wpe (event); + wpe_event.time = src->last_touch->time; + src->view->dispatchTouchEvent (wpe_event); + + touch_points = (struct wpe_input_touch_event_raw *) + src->touch_points->data; + for (idx = 0; idx < src->touch_points->len; idx++) { + if (touch_pointsidx.type == wpe_input_touch_event_type_up || + touch_pointsidx.type == wpe_input_touch_event_type_null) { + g_array_remove_index_fast(src->touch_points, idx); + idx--; + } + } + src->last_touch = NULL; + ret = TRUE; + } + break; + case GST_NAVIGATION_EVENT_TOUCH_CANCEL: + break; default: break; } - /* FIXME: No touch events handling support in GstNavigation */ } if (!ret) { @@ -655,9 +795,11 @@ gst_wpe_video_src_init (GstWpeVideoSrc * src) { src->draw_background = DEFAULT_DRAW_BACKGROUND; + src->location = g_strdup (DEFAULT_LOCATION); gst_base_src_set_live (GST_BASE_SRC_CAST (src), TRUE); + src->touch_points = g_array_sized_new (FALSE, FALSE, sizeof (void *), 10); g_mutex_init (&src->lock); } @@ -668,6 +810,7 @@ g_free (src->location); g_clear_pointer (&src->bytes, g_bytes_unref); + g_array_unref (src->touch_points); g_mutex_clear (&src->lock); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -690,7 +833,7 @@ g_object_class_install_property (gobject_class, PROP_LOCATION, g_param_spec_string ("location", "location", "The URL to display", - "", (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + DEFAULT_LOCATION, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_DRAW_BACKGROUND, g_param_spec_boolean ("draw-background", "Draws the background", "Whether to draw the WebView background", DEFAULT_DRAW_BACKGROUND, @@ -746,4 +889,20 @@ static_cast < GSignalFlags > (G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), G_CALLBACK (gst_wpe_video_src_load_bytes), NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_BYTES); + + /** + * GstWpeSrc::run-javascript: + * @src: the object which received the signal + * @script: the script to run + * + * Asynchronously run script in the context of the current page on the + * internal webView. + * + * Since: 1.22 + */ + gst_wpe_video_src_signalsSIGNAL_RUN_JAVASCRIPT = + g_signal_new_class_handler ("run-javascript", G_TYPE_FROM_CLASS (klass), + static_cast < GSignalFlags > (G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + G_CALLBACK (gst_wpe_video_src_run_javascript), NULL, NULL, NULL, + G_TYPE_NONE, 1, G_TYPE_STRING); }
View file
gst-plugins-bad-1.20.5.tar.xz/ext/wpe/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/wpe/meson.build
Changed
@@ -1,31 +1,35 @@ +building_wpe = false +wpe_feat = get_option('wpe').require(gstgl_dep.found(), + error_message : 'wpe plugin enabled but GL support was not detected') -if not gstgl_dep.found() - if get_option('wpe').enabled() - error('wpe plugin enabled but GL support was not detected') - endif +if not wpe_feat.allowed() subdir_done() endif wpe_dep = dependency('wpe-webkit-1.1', version : '>= 2.28', required : false) if not wpe_dep.found() - wpe_dep = dependency('wpe-webkit-1.0', version : '>= 2.28', required : get_option('wpe')) + wpe_dep = dependency('wpe-webkit-1.0', version : '>= 2.28', required : wpe_feat) endif -wpe_fdo_dep = dependency('wpebackend-fdo-1.0', version : '>= 1.8', required : get_option('wpe')) -egl_dep = dependency('egl', required : get_option('wpe')) -xkbcommon_dep = dependency('xkbcommon', version : '>= 0.8', required : get_option('wpe')) -wl_server_dep = dependency('wayland-server', required : get_option('wpe')) +wpe_fdo_dep = dependency('wpebackend-fdo-1.0', version : '>= 1.8', required : wpe_feat) +egl_dep = dependency('egl', required : wpe_feat) +xkbcommon_dep = dependency('xkbcommon', version : '>= 0.8', required : wpe_feat) +wl_server_dep = dependency('wayland-server', required : wpe_feat) -if not wpe_dep.found() or not wpe_fdo_dep.found() or not egl_dep.found() or not xkbcommon_dep.found() +if not (wpe_dep.found() and wpe_fdo_dep.found() and egl_dep.found() and xkbcommon_dep.found()) subdir_done() endif +giounix_dep = dependency('gio-unix-2.0', required: false) + wpe_extension_install_dir = get_option('prefix') / get_option('libdir') / meson.project_name() / 'wpe-extension' -giounix_dep = dependency('gio-unix-2.0', required: false) +building_wpe = true gstwpe = library('gstwpe', 'WPEThreadedView.cpp', 'gstwpe.cpp', 'gstwpevideosrc.cpp', 'gstwpesrcbin.cpp', - dependencies : egl_dep, wpe_dep, wpe_fdo_dep, gstallocators_dep, gstaudio_dep, gstvideo_dep, gstbase_dep, gstgl_dep, xkbcommon_dep, wl_server_dep, giounix_dep, - cpp_args : gst_plugins_bad_args + '-DHAVE_CONFIG_H=1', '-DWPE_EXTENSION_INSTALL_DIR=' + wpe_extension_install_dir, + dependencies : egl_dep, wpe_dep, wpe_fdo_dep, gstallocators_dep, gstaudio_dep, gstvideo_dep, + gstbase_dep, gstgl_dep, xkbcommon_dep, wl_server_dep, giounix_dep, + cpp_args : gst_plugins_bad_args + '-DHAVE_CONFIG_H=1', + '-DWPE_EXTENSION_INSTALL_DIR=' + wpe_extension_install_dir, include_directories : configinc, install : true, install_dir : plugins_install_dir) @@ -33,5 +37,5 @@ if giounix_dep.found() subdir('wpe-extension') endif -pkgconfig.generate(gstwpe, install_dir : plugins_pkgconfig_install_dir) + plugins += gstwpe
View file
gst-plugins-bad-1.20.5.tar.xz/ext/x265/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/x265/meson.build
Changed
@@ -13,6 +13,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstx265, install_dir : plugins_pkgconfig_install_dir) plugins += gstx265 endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/zbar/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/zbar/meson.build
Changed
@@ -8,6 +8,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstzbar, install_dir : plugins_pkgconfig_install_dir) plugins += gstzbar endif
View file
gst-plugins-bad-1.20.5.tar.xz/ext/zxing/gstzxing.cpp -> gst-plugins-bad-1.22.0.tar.xz/ext/zxing/gstzxing.cpp
Changed
@@ -368,7 +368,7 @@ auto result = ReadBarcode ({(unsigned char *)data, width, height, zxing->image_format}, hints); if (result.isValid ()) { GST_DEBUG_OBJECT (zxing, "Symbol found. Text: %s Format: %s", - TextUtfEncoding::ToUtf8 (result.text ()).c_str (), + result.text ().c_str (), ToString (result.format ())); } else { goto out; @@ -396,7 +396,7 @@ "running-time", G_TYPE_UINT64, running_time, "type", G_TYPE_STRING, ToString (result.format ()), "symbol", G_TYPE_STRING, - TextUtfEncoding::ToUtf8 (result.text ()).c_str (), NULL); + result.text ().c_str (), NULL); if (zxing->attach_frame) { /* create a sample from image */
View file
gst-plugins-bad-1.20.5.tar.xz/ext/zxing/meson.build -> gst-plugins-bad-1.22.0.tar.xz/ext/zxing/meson.build
Changed
@@ -2,17 +2,17 @@ 'gstzxing.cpp', 'gstzxingplugin.c', -zxing_dep = dependency('zxing', version : '>= 1.1.1', required : get_option('zxing')) +zxing_dep = dependency('zxing', version : '>= 1.4.0', required : get_option('zxing')) if zxing_dep.found() gstzxing = library('gstzxing', zxing_sources, c_args : gst_plugins_bad_args, + cpp_args: '-DZX_USE_UTF8', include_directories : configinc, dependencies : gstvideo_dep, zxing_dep, install : true, install_dir : plugins_install_dir, - override_options : 'cpp_std=c++11', + override_options : 'cpp_std=c++17', ) - pkgconfig.generate(gstzxing, install_dir : plugins_pkgconfig_install_dir) plugins += gstzxing endif
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/adaptivedemux/gstadaptivedemux.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
Changed
@@ -119,7 +119,7 @@ #endif #include "gstadaptivedemux.h" -#include "gst/gst-i18n-plugin.h" +#include <glib/gi18n-lib.h> #include <gst/base/gstadapter.h> GST_DEBUG_CATEGORY (adaptivedemux_debug); @@ -2379,7 +2379,7 @@ GstEvent *pending_caps = NULL, *pending_segment = NULL, *pending_tags = NULL; GList *pending_events = NULL; - /* FIXME : + /* FIXME : * This is duplicating *exactly* the same thing as what is done at the beginning * of _src_chain if starting_fragment is TRUE */ if (stream->first_fragment_buffer) { @@ -2661,7 +2661,7 @@ if (!stream->downloading_header && !stream->downloading_index) { /* If this is the first buffer of a fragment (not the headers or index) - * and we don't have a birate from the sub-class, then see if we + * and we don't have a bitrate from the sub-class, then see if we * can work it out from the fragment size and duration */ if (stream->fragment.bitrate == 0 && stream->fragment.duration != 0 &&
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/adaptivedemux/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/adaptivedemux/meson.build
Changed
@@ -12,7 +12,7 @@ install : true, dependencies : gstbase_dep, gsturidownloader_dep, ) -libraries += pkg_name, {'lib': gstadaptivedemux} +gst_libraries += pkg_name, {'lib': gstadaptivedemux} gstadaptivedemux_dep = declare_dependency(link_with : gstadaptivedemux, include_directories : libsinc,
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/audio/gstnonstreamaudiodecoder.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/audio/gstnonstreamaudiodecoder.c
Changed
@@ -2464,7 +2464,8 @@ * This function may only be called from within @load_from_buffer, * @load_from_custom, and @decode. * - * Returns: Newly allocated output buffer, or NULL if allocation failed + * Returns: (transfer full) (nullable): Newly allocated output buffer, or NULL + * if allocation failed */ GstBuffer * gst_nonstream_audio_decoder_allocate_output_buffer (GstNonstreamAudioDecoder *
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/audio/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/audio/meson.build
Changed
@@ -44,7 +44,7 @@ gen_sources += audio_gir endif endif -libraries += pkg_name, library_def +gst_libraries += pkg_name, library_def gstbadaudio_dep = declare_dependency(link_with : gstbadaudio, include_directories : libsinc,
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecparsers/gstav1parser.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gstav1parser.c
Changed
@@ -67,10 +67,6 @@ * should call gst_av1_parser_reference_frame_update() to update the parser's inside * state(such as reference information, global segmentation information, etc). * - * Note: If the frame is actived by show_existing_frame in #GST_AV1_OBU_FRAME_HEADER, - * the function of gst_av1_parser_reference_frame_loading() should be called before - * really showing that frame. - * * @since: 1.18.00 */ @@ -803,8 +799,7 @@ if (obu_length == 0) { /* An empty obu? let continue to the next */ - ret = GST_AV1_PARSER_DROP; - goto error; + return GST_AV1_PARSER_DROP; } } @@ -885,8 +880,7 @@ (parser->state.operating_point_idc >> (obu->header.obu_spatial_id + 8)) & 1; if (!inTemporalLayer || !inSpatialLayer) { - ret = GST_AV1_PARSER_DROP; - goto error; + return GST_AV1_PARSER_DROP; } } @@ -1239,7 +1233,7 @@ seq_header->operating_pointsi.idc = AV1_READ_BITS (br, 12); seq_header->operating_pointsi.seq_level_idx = AV1_READ_BITS (br, 5); if (!av1_seq_level_idx_is_valid - (seq_header->operating_points0.seq_level_idx)) { + (seq_header->operating_pointsi.seq_level_idx)) { GST_INFO ("The seq_level_idx is unsupported"); retval = GST_AV1_PARSER_BITSTREAM_ERROR; goto error; @@ -1453,9 +1447,7 @@ gst_av1_parse_reset_state (parser, FALSE); /* choose_operating_point() set the operating_point */ - if (parser->state.operating_point < 0 || - parser->state.operating_point > - seq_header->operating_points_cnt_minus_1) { + if (parser->state.operating_point > seq_header->operating_points_cnt_minus_1) { GST_WARNING ("Invalid operating_point %d set by user, just use 0", parser->state.operating_point); parser->state.operating_point_idc = seq_header->operating_points0.idc; @@ -3496,6 +3488,64 @@ frame_header->ref_frame_idxi = ref; } +/* 7.21 */ +static void +gst_av1_parser_reference_frame_loading (GstAV1Parser * parser, + GstAV1FrameHeaderOBU * frame_header) +{ + GstAV1ReferenceFrameInfo *ref_info = &(parser->state.ref_info); + gint idx = frame_header->frame_to_show_map_idx; + GstAV1TileInfo *ref_tile_info = &ref_info->entryidx.ref_tile_info; + const gint all_frames = (1 << GST_AV1_NUM_REF_FRAMES) - 1; + + /* copy the relevant frame information as these will be needed by + * all subclasses. */ + frame_header->frame_type = ref_info->entryidx.ref_frame_type; + frame_header->upscaled_width = ref_info->entryidx.ref_upscaled_width; + frame_header->frame_width = ref_info->entryidx.ref_frame_width; + frame_header->frame_height = ref_info->entryidx.ref_frame_height; + frame_header->render_width = ref_info->entryidx.ref_render_width; + frame_header->render_height = ref_info->entryidx.ref_render_height; + + if (parser->seq_header->film_grain_params_present) + frame_header->film_grain_params = + ref_info->entryidx.ref_film_grain_params; + + /* the remaining is only relevant to ensure proper state update and only + * keyframe updates the state. */ + if (frame_header->frame_type != GST_AV1_KEY_FRAME) + return; + + frame_header->refresh_frame_flags = all_frames; + frame_header->current_frame_id = ref_info->entryidx.ref_frame_id; + frame_header->order_hint = ref_info->entryidx.ref_order_hint; + frame_header->segmentation_params = + ref_info->entryidx.ref_segmentation_params; + frame_header->global_motion_params = + ref_info->entryidx.ref_global_motion_params; + frame_header->loop_filter_params = ref_info->entryidx.ref_lf_params; + frame_header->tile_info = *ref_tile_info; + + parser->state.current_frame_id = ref_info->entryidx.ref_frame_id; + parser->state.upscaled_width = ref_info->entryidx.ref_upscaled_width; + parser->state.frame_width = ref_info->entryidx.ref_frame_width; + parser->state.frame_height = ref_info->entryidx.ref_frame_height; + parser->state.render_width = ref_info->entryidx.ref_render_width; + parser->state.render_height = ref_info->entryidx.ref_render_height; + parser->state.mi_cols = ref_info->entryidx.ref_mi_cols; + parser->state.mi_rows = ref_info->entryidx.ref_mi_rows; + + memcpy (parser->state.mi_col_starts, ref_tile_info->mi_col_starts, + sizeof (guint32) * (GST_AV1_MAX_TILE_COLS + 1)); + memcpy (parser->state.mi_row_starts, ref_tile_info->mi_row_starts, + sizeof (guint32) * (GST_AV1_MAX_TILE_ROWS + 1)); + parser->state.tile_cols_log2 = ref_tile_info->tile_cols_log2; + parser->state.tile_cols = ref_tile_info->tile_cols; + parser->state.tile_rows_log2 = ref_tile_info->tile_rows_log2; + parser->state.tile_rows = ref_tile_info->tile_rows; + parser->state.tile_size_bytes = ref_tile_info->tile_size_bytes; +} + /* 5.9.2 */ static GstAV1ParserResult gst_av1_parse_uncompressed_frame_header (GstAV1Parser * parser, GstAV1OBU * obu, @@ -3581,16 +3631,7 @@ } } - frame_header->frame_type = - ref_info->entryframe_header->frame_to_show_map_idx.ref_frame_type; - if (frame_header->frame_type == GST_AV1_KEY_FRAME) { - frame_header->refresh_frame_flags = all_frames; - } - - /* just use the frame_to_show's grain_params - * if (seq_header->film_grain_params_present) - * load_grain_params () */ - + gst_av1_parser_reference_frame_loading (parser, frame_header); goto success; } @@ -4174,74 +4215,6 @@ return retval; } -/* 7.21 */ -/** - * gst_av1_parser_reference_frame_loading: - * @parser: the #GstAV1Parser - * @frame_header: a #GstAV1FrameHeaderOBU to load - * - * Load the context of @frame_header to parser's state. This function is - * used when we want to show already parsed frames before. - * - * Returns: The #GstAV1ParserResult. - * - * Since: 1.18 - */ -GstAV1ParserResult -gst_av1_parser_reference_frame_loading (GstAV1Parser * parser, - GstAV1FrameHeaderOBU * frame_header) -{ - GstAV1ReferenceFrameInfo *ref_info; - GstAV1TileInfo *ref_tile_info; - - g_return_val_if_fail (parser != NULL, GST_AV1_PARSER_INVALID_OPERATION); - g_return_val_if_fail (frame_header != NULL, GST_AV1_PARSER_INVALID_OPERATION); - - if (!parser->seq_header) { - GST_WARNING ("Missing OBU Reference: seq_header"); - return GST_AV1_PARSER_MISSING_OBU_REFERENCE; - } - - ref_info = &(parser->state.ref_info); - - if (frame_header->frame_to_show_map_idx > GST_AV1_NUM_REF_FRAMES - 1) - return GST_AV1_PARSER_BITSTREAM_ERROR; - - g_assert (ref_info->entryframe_header->frame_to_show_map_idx.ref_valid); - - parser->state.current_frame_id = - ref_info->entryframe_header->frame_to_show_map_idx.ref_frame_id; - parser->state.upscaled_width = - ref_info->entryframe_header->frame_to_show_map_idx.ref_upscaled_width; - parser->state.frame_width = - ref_info->entryframe_header->frame_to_show_map_idx.ref_frame_width; - parser->state.frame_height = - ref_info->entryframe_header->frame_to_show_map_idx.ref_frame_height; - parser->state.render_width = - ref_info->entryframe_header->frame_to_show_map_idx.ref_render_width; - parser->state.render_height = - ref_info->entryframe_header->frame_to_show_map_idx.ref_render_height; - parser->state.mi_cols = - ref_info->entryframe_header->frame_to_show_map_idx.ref_mi_cols; - parser->state.mi_rows = - ref_info->entryframe_header->frame_to_show_map_idx.ref_mi_rows; - - ref_tile_info = - &ref_info->entryframe_header->frame_to_show_map_idx.ref_tile_info; - - memcpy (parser->state.mi_col_starts, ref_tile_info->mi_col_starts, - sizeof (guint32) * (GST_AV1_MAX_TILE_COLS + 1)); - memcpy (parser->state.mi_row_starts, ref_tile_info->mi_row_starts, - sizeof (guint32) * (GST_AV1_MAX_TILE_ROWS + 1)); - parser->state.tile_cols_log2 = ref_tile_info->tile_cols_log2; - parser->state.tile_cols = ref_tile_info->tile_cols; - parser->state.tile_rows_log2 = ref_tile_info->tile_rows_log2; - parser->state.tile_rows = ref_tile_info->tile_rows; - parser->state.tile_size_bytes = ref_tile_info->tile_size_bytes; - - return GST_AV1_PARSER_OK; -} - /** * gst_av1_parser_reference_frame_update: * @parser: the #GstAV1Parser
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecparsers/gstav1parser.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gstav1parser.h
Changed
@@ -1421,7 +1421,7 @@ * of bitstream conformance that whenever @display_frame_id is read, the value matches * @ref_frame_id @frame_to_show_map_idx (the value of @current_frame_id at the time that the * frame indexed by @frame_to_show_map_idx was stored), and that - * @ref_valid @frame_to_show_map_idx is equjal to 1. It is a requirement of bitstream + * @ref_valid @frame_to_show_map_idx is equal to 1. It is a requirement of bitstream * conformance that the number of bits needed to read @display_frame_id does not exceed 16. * This is equivalent to the constraint that idLen <= 16 * @frame_type: specifies the type of the frame. @@ -1822,11 +1822,6 @@ GST_CODEC_PARSERS_API GstAV1ParserResult -gst_av1_parser_reference_frame_loading (GstAV1Parser * parser, - GstAV1FrameHeaderOBU * frame_header); - -GST_CODEC_PARSERS_API -GstAV1ParserResult gst_av1_parser_reference_frame_update (GstAV1Parser * parser, GstAV1FrameHeaderOBU * frame_header);
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gsth264bitwriter.c
Added
@@ -0,0 +1,1642 @@ +/* GStreamer + * Copyright (C) 2020 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the0 + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "gsth264bitwriter.h" +#include <gst/codecparsers/nalutils.h> +#include <gst/base/gstbitwriter.h> + +/******************************** Utils ********************************/ +#define SIGNED(val) (2 * ABS(val) - ((val) > 0)) + +/* Write an unsigned integer Exp-Golomb-coded syntax element. i.e. ue(v) */ +static gboolean +_bs_write_ue (GstBitWriter * bs, guint32 value) +{ + guint32 size_in_bits = 0; + guint32 tmp_value = ++value; + + while (tmp_value) { + ++size_in_bits; + tmp_value >>= 1; + } + if (size_in_bits > 1 + && !gst_bit_writer_put_bits_uint32 (bs, 0, size_in_bits - 1)) + return FALSE; + if (!gst_bit_writer_put_bits_uint32 (bs, value, size_in_bits)) + return FALSE; + return TRUE; +} + +#define WRITE_BITS_UNCHECK(bw, val, nbits) \ + (nbits <= 8 ? gst_bit_writer_put_bits_uint8 (bw, val, nbits) : \ + (nbits <= 16 ? gst_bit_writer_put_bits_uint16 (bw, val, nbits) : \ + (nbits <= 32 ? gst_bit_writer_put_bits_uint32 (bw, val, nbits) : \ + FALSE))) + +#define WRITE_BITS(bw, val, nbits) \ + if (!WRITE_BITS_UNCHECK (bw, val, nbits)) { \ + g_warning ("Unsupported bit size: %u", nbits); \ + have_space = FALSE; \ + goto error; \ + } + +#define WRITE_UE_UNCHECK(bw, val) _bs_write_ue (bw, val) + +#ifdef WRITE_UE +#undef WRITE_UE +#endif +#define WRITE_UE(bw, val) \ + if (!(have_space = WRITE_UE_UNCHECK (bw, val))) \ + goto error; \ + +#define WRITE_UE_MAX(bw, val, max) \ + if ((guint32) val > (max) || !(have_space = WRITE_UE_UNCHECK (bw, val))) \ + goto error; + +#define WRITE_SE(bw, val) WRITE_UE (bw, SIGNED (val)) + +#define WRITE_SE_RANGE(bw, val, min, max) \ + if (val > max || val < min || \ + !(have_space = WRITE_UE_UNCHECK (bw, SIGNED (val)))) \ + goto error; + +#define WRITE_BYTES_UNCHECK(bw, ptr, nbytes) \ + gst_bit_writer_put_bytes(bw, ptr, nbytes) + +#ifdef WRITE_BYTES +#undef WRITE_BYTES +#endif +#define WRITE_BYTES(bw, ptr, nbytes) \ + if (!(have_space = WRITE_BYTES_UNCHECK (bw, ptr, nbytes))) \ + goto error; + +/***************************** End of Utils ****************************/ + +/**** Default scaling_lists according to Table 7-2 *****/ +static const guint8 default_4x4_intra16 = { + 6, 13, 13, 20, 20, 20, 28, 28, 28, 28, 32, 32, + 32, 37, 37, 42 +}; + +static const guint8 default_4x4_inter16 = { + 10, 14, 14, 20, 20, 20, 24, 24, 24, 24, 27, 27, + 27, 30, 30, 34 +}; + +static const guint8 default_8x8_intra64 = { + 6, 10, 10, 13, 11, 13, 16, 16, 16, 16, 18, 18, + 18, 18, 18, 23, 23, 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, + 27, 27, 27, 27, 27, 29, 29, 29, 29, 29, 29, 29, 31, 31, 31, 31, 31, 31, 33, + 33, 33, 33, 33, 36, 36, 36, 36, 38, 38, 38, 40, 40, 42 +}; + +static const guint8 default_8x8_inter64 = { + 9, 13, 13, 15, 13, 15, 17, 17, 17, 17, 19, 19, + 19, 19, 19, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, + 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 28, + 28, 28, 28, 28, 30, 30, 30, 30, 32, 32, 32, 33, 33, 35 +}; + +static gboolean +_h264_bit_writer_scaling_list (GstBitWriter * bw, gboolean * space, + const guint8 scaling_lists_4x4616, + const guint8 scaling_lists_8x8664, const guint8 fallback_4x4_inter16, + const guint8 fallback_4x4_intra16, const guint8 fallback_8x8_inter64, + const guint8 fallback_8x8_intra64, guint8 n_lists) +{ + gboolean have_space = TRUE; + guint i, j; + + const guint8 *default_lists12 = { + fallback_4x4_intra, fallback_4x4_intra, fallback_4x4_intra, + fallback_4x4_inter, fallback_4x4_inter, fallback_4x4_inter, + fallback_8x8_intra, fallback_8x8_inter, + fallback_8x8_intra, fallback_8x8_inter, + fallback_8x8_intra, fallback_8x8_inter + }; + + GST_DEBUG ("writing scaling lists"); + + for (i = 0; i < 12; i++) { + if (i < n_lists) { + guint8 scaling_list_present_flag = FALSE; + const guint8 *scaling_list; + guint size; + + if (i < 6) { + scaling_list = scaling_lists_4x4i; + size = 16; + } else { + scaling_list = scaling_lists_8x8i - 6; + size = 64; + } + + if (memcmp (scaling_list, default_listsi, size)) + scaling_list_present_flag = TRUE; + + WRITE_BITS (bw, scaling_list_present_flag, 1); + if (scaling_list_present_flag) { + guint8 last_scale, next_scale; + gint8 delta_scale; + + for (j = 0; j < size; j++) { + last_scale = next_scale = 8; + + for (j = 0; j < size; j++) { + if (next_scale != 0) { + delta_scale = (gint8) (scaling_listj - last_scale); + + WRITE_SE (bw, delta_scale); + + next_scale = scaling_listj; + } + last_scale = (next_scale == 0) ? last_scale : next_scale; + } + } + } + } + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write scaling lists"); + + *space = have_space; + return FALSE; +} + +static gboolean +_h264_bit_writer_hrd_parameters (const GstH264HRDParams * hrd, + GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + guint sched_sel_idx; + + GST_DEBUG ("writing \"HRD Parameters\""); + + WRITE_UE_MAX (bw, hrd->cpb_cnt_minus1, 31); + WRITE_BITS (bw, hrd->bit_rate_scale, 4); + WRITE_BITS (bw, hrd->cpb_size_scale, 4); + + for (sched_sel_idx = 0; sched_sel_idx <= hrd->cpb_cnt_minus1; sched_sel_idx++) { + WRITE_UE (bw, hrd->bit_rate_value_minus1sched_sel_idx); + WRITE_UE (bw, hrd->cpb_size_value_minus1sched_sel_idx); + WRITE_BITS (bw, hrd->cbr_flagsched_sel_idx, 1); + } + + WRITE_BITS (bw, hrd->initial_cpb_removal_delay_length_minus1, 5); + WRITE_BITS (bw, hrd->cpb_removal_delay_length_minus1, 5); + WRITE_BITS (bw, hrd->dpb_output_delay_length_minus1, 5); + WRITE_BITS (bw, hrd->time_offset_length, 5); + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write \"HRD Parameters\""); + + *space = have_space; + return FALSE; +} + +#define EXTENDED_SAR 255 + +static gboolean +_h264_bit_writer_vui_parameters (const GstH264SPS * sps, GstBitWriter * bw, + gboolean * space) +{ + gboolean have_space = TRUE; + const GstH264VUIParams *vui = &sps->vui_parameters; + + GST_DEBUG ("writing \"VUI Parameters\""); + + WRITE_BITS (bw, vui->aspect_ratio_info_present_flag, 1); + if (vui->aspect_ratio_info_present_flag) { + WRITE_BITS (bw, vui->aspect_ratio_idc, 8); + if (vui->aspect_ratio_idc == EXTENDED_SAR) { + WRITE_BITS (bw, vui->sar_width, 16); + WRITE_BITS (bw, vui->sar_height, 16); + } + } + + WRITE_BITS (bw, vui->overscan_info_present_flag, 1); + if (vui->overscan_info_present_flag) + WRITE_BITS (bw, vui->overscan_appropriate_flag, 1); + + WRITE_BITS (bw, vui->video_signal_type_present_flag, 1); + if (vui->video_signal_type_present_flag) { + WRITE_BITS (bw, vui->video_format, 3); + WRITE_BITS (bw, vui->video_full_range_flag, 1); + WRITE_BITS (bw, vui->colour_description_present_flag, 1); + if (vui->colour_description_present_flag) { + WRITE_BITS (bw, vui->colour_primaries, 8); + WRITE_BITS (bw, vui->transfer_characteristics, 8); + WRITE_BITS (bw, vui->matrix_coefficients, 8); + } + } + + WRITE_BITS (bw, vui->chroma_loc_info_present_flag, 1); + if (vui->chroma_loc_info_present_flag) { + WRITE_UE_MAX (bw, vui->chroma_sample_loc_type_top_field, 5); + WRITE_UE_MAX (bw, vui->chroma_sample_loc_type_bottom_field, 5); + } + + WRITE_BITS (bw, vui->timing_info_present_flag, 1); + if (vui->timing_info_present_flag) { + WRITE_BITS (bw, vui->num_units_in_tick, 32); + if (vui->num_units_in_tick == 0) + GST_WARNING ("num_units_in_tick = 0 write to stream " + "(incompliant to H.264 E.2.1)."); + + WRITE_BITS (bw, vui->time_scale, 32); + if (vui->time_scale == 0) + GST_WARNING ("time_scale = 0 write to stream " + "(incompliant to H.264 E.2.1)."); + + WRITE_BITS (bw, vui->fixed_frame_rate_flag, 1); + } + + WRITE_BITS (bw, vui->nal_hrd_parameters_present_flag, 1); + if (vui->nal_hrd_parameters_present_flag) { + if (!_h264_bit_writer_hrd_parameters (&vui->nal_hrd_parameters, bw, + &have_space)) + goto error; + } + + WRITE_BITS (bw, vui->vcl_hrd_parameters_present_flag, 1); + if (vui->vcl_hrd_parameters_present_flag) { + if (!_h264_bit_writer_hrd_parameters (&vui->vcl_hrd_parameters, bw, + &have_space)) + goto error; + } + + if (vui->nal_hrd_parameters_present_flag || + vui->vcl_hrd_parameters_present_flag) + WRITE_BITS (bw, vui->low_delay_hrd_flag, 1); + + WRITE_BITS (bw, vui->pic_struct_present_flag, 1); + WRITE_BITS (bw, vui->bitstream_restriction_flag, 1); + if (vui->bitstream_restriction_flag) { + WRITE_BITS (bw, vui->motion_vectors_over_pic_boundaries_flag, 1); + WRITE_UE (bw, vui->max_bytes_per_pic_denom); + WRITE_UE_MAX (bw, vui->max_bits_per_mb_denom, 16); + WRITE_UE_MAX (bw, vui->log2_max_mv_length_horizontal, 16); + WRITE_UE_MAX (bw, vui->log2_max_mv_length_vertical, 16); + WRITE_UE (bw, vui->num_reorder_frames); + WRITE_UE (bw, vui->max_dec_frame_buffering); + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write \"VUI Parameters\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h264_bit_writer_sps (const GstH264SPS * sps, GstBitWriter * bw, + gboolean * space) +{ + gboolean have_space = TRUE; + + GST_DEBUG ("writing SPS"); + + WRITE_BITS (bw, sps->profile_idc, 8); + WRITE_BITS (bw, sps->constraint_set0_flag, 1); + WRITE_BITS (bw, sps->constraint_set1_flag, 1); + WRITE_BITS (bw, sps->constraint_set2_flag, 1); + WRITE_BITS (bw, sps->constraint_set3_flag, 1); + WRITE_BITS (bw, sps->constraint_set4_flag, 1); + WRITE_BITS (bw, sps->constraint_set5_flag, 1); + /* reserved_zero_2bits */ + WRITE_BITS (bw, 0, 2); + + WRITE_BITS (bw, sps->level_idc, 8); + + WRITE_UE_MAX (bw, sps->id, GST_H264_MAX_SPS_COUNT - 1); + + if (sps->profile_idc == 100 || sps->profile_idc == 110 || + sps->profile_idc == 122 || sps->profile_idc == 244 || + sps->profile_idc == 44 || sps->profile_idc == 83 || + sps->profile_idc == 86 || sps->profile_idc == 118 || + sps->profile_idc == 128 || sps->profile_idc == 138 || + sps->profile_idc == 139 || sps->profile_idc == 134 || + sps->profile_idc == 135) { + WRITE_UE_MAX (bw, sps->chroma_format_idc, 3); + if (sps->chroma_format_idc == 3) + WRITE_BITS (bw, sps->separate_colour_plane_flag, 1); + + WRITE_UE_MAX (bw, sps->bit_depth_luma_minus8, 6); + WRITE_UE_MAX (bw, sps->bit_depth_chroma_minus8, 6); + WRITE_BITS (bw, sps->qpprime_y_zero_transform_bypass_flag, 1); + + WRITE_BITS (bw, sps->scaling_matrix_present_flag, 1); + if (sps->scaling_matrix_present_flag) { + guint8 n_lists; + + n_lists = (sps->chroma_format_idc != 3) ? 8 : 12; + if (!_h264_bit_writer_scaling_list (bw, &have_space, + sps->scaling_lists_4x4, sps->scaling_lists_8x8, + default_4x4_inter, default_4x4_intra, + default_8x8_inter, default_8x8_intra, n_lists)) + goto error; + } + } + + WRITE_UE_MAX (bw, sps->log2_max_frame_num_minus4, 12); + + WRITE_UE_MAX (bw, sps->pic_order_cnt_type, 2); + if (sps->pic_order_cnt_type == 0) { + WRITE_UE_MAX (bw, sps->log2_max_pic_order_cnt_lsb_minus4, 12); + } else if (sps->pic_order_cnt_type == 1) { + guint i; + + WRITE_BITS (bw, sps->delta_pic_order_always_zero_flag, 1); + WRITE_SE (bw, sps->offset_for_non_ref_pic); + WRITE_SE (bw, sps->offset_for_top_to_bottom_field); + WRITE_UE_MAX (bw, sps->num_ref_frames_in_pic_order_cnt_cycle, 255); + + for (i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; i++) + WRITE_SE (bw, sps->offset_for_ref_framei); + } + + WRITE_UE (bw, sps->num_ref_frames); + WRITE_BITS (bw, sps->gaps_in_frame_num_value_allowed_flag, 1); + WRITE_UE (bw, sps->pic_width_in_mbs_minus1); + WRITE_UE (bw, sps->pic_height_in_map_units_minus1); + WRITE_BITS (bw, sps->frame_mbs_only_flag, 1); + + if (!sps->frame_mbs_only_flag) + WRITE_BITS (bw, sps->mb_adaptive_frame_field_flag, 1); + + WRITE_BITS (bw, sps->direct_8x8_inference_flag, 1); + WRITE_BITS (bw, sps->frame_cropping_flag, 1); + if (sps->frame_cropping_flag) { + WRITE_UE (bw, sps->frame_crop_left_offset); + WRITE_UE (bw, sps->frame_crop_right_offset); + WRITE_UE (bw, sps->frame_crop_top_offset); + WRITE_UE (bw, sps->frame_crop_bottom_offset); + } + + WRITE_BITS (bw, sps->vui_parameters_present_flag, 1); + if (sps->vui_parameters_present_flag) + if (!_h264_bit_writer_vui_parameters (sps, bw, &have_space)) + goto error; + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write sps"); + + *space = have_space; + return FALSE; +} + +/** + * gst_h264_bit_writer_sps: + * @sps: the sps of #GstH264SPS to write + * @start_code: whether adding the nal start code + * @data: (out): the bit stream generated by the sps + * @size: (inout): the size in bytes of the input and output + * + * Generating the according h264 bit stream by providing the sps. + * + * Returns: a #GstH264BitWriterResult + * + * Since: 1.22 + **/ +GstH264BitWriterResult +gst_h264_bit_writer_sps (const GstH264SPS * sps, gboolean start_code, + guint8 * data, guint * size) +{ + gboolean have_space = TRUE; + GstBitWriter bw; + + g_return_val_if_fail (sps != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (data != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (size != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (*size > 0, GST_H264_BIT_WRITER_ERROR); + + gst_bit_writer_init_with_data (&bw, data, *size, FALSE); + + if (start_code) + WRITE_BITS (&bw, 0x00000001, 32); + + /* nal header */ + /* forbidden_zero_bit */ + WRITE_BITS (&bw, 0, 1); + /* nal_ref_idc */ + WRITE_BITS (&bw, 1, 2); + /* nal_unit_type */ + WRITE_BITS (&bw, GST_H264_NAL_SPS, 5); + + if (!_h264_bit_writer_sps (sps, &bw, &have_space)) + goto error; + + /* Add trailings. */ + WRITE_BITS (&bw, 1, 1); + if (!gst_bit_writer_align_bytes (&bw, 0)) { + have_space = FALSE; + goto error; + } + + *size = (gst_bit_writer_get_size (&bw)) / 8; + gst_bit_writer_reset (&bw); + + return GST_H264_BIT_WRITER_OK; + +error: + gst_bit_writer_reset (&bw); + *size = 0; + + return have_space ? GST_H264_BIT_WRITER_INVALID_DATA : + GST_H264_BIT_WRITER_NO_MORE_SPACE; +} + +static gboolean +_h264_bit_writer_pps (const GstH264PPS * pps, GstBitWriter * bw, + gboolean * space) +{ + gboolean have_space = TRUE; + gint qp_bd_offset; + + GST_DEBUG ("writing SPS"); + + qp_bd_offset = 6 * (pps->sequence->bit_depth_luma_minus8 + + pps->sequence->separate_colour_plane_flag); + + WRITE_UE_MAX (bw, pps->id, GST_H264_MAX_PPS_COUNT - 1); + WRITE_UE_MAX (bw, pps->sequence->id, GST_H264_MAX_SPS_COUNT - 1); + + WRITE_BITS (bw, pps->entropy_coding_mode_flag, 1); + WRITE_BITS (bw, pps->pic_order_present_flag, 1); + + WRITE_UE_MAX (bw, pps->num_slice_groups_minus1, 7); + if (pps->num_slice_groups_minus1 > 0) { + WRITE_UE_MAX (bw, pps->slice_group_map_type, 6); + + if (pps->slice_group_map_type == 0) { + gint i; + + for (i = 0; i <= pps->num_slice_groups_minus1; i++) + WRITE_UE (bw, pps->run_length_minus1i); + } else if (pps->slice_group_map_type == 2) { + gint i; + + for (i = 0; i < pps->num_slice_groups_minus1; i++) { + WRITE_UE (bw, pps->top_lefti); + WRITE_UE (bw, pps->bottom_righti); + } + } else if (pps->slice_group_map_type >= 3 && pps->slice_group_map_type <= 5) { + WRITE_BITS (bw, pps->slice_group_change_direction_flag, 1); + WRITE_UE (bw, pps->slice_group_change_rate_minus1); + } else if (pps->slice_group_map_type == 6) { + gint bits; + gint i; + + WRITE_UE (bw, pps->pic_size_in_map_units_minus1); + bits = g_bit_storage (pps->num_slice_groups_minus1); + + g_assert (pps->slice_group_id); + for (i = 0; i <= pps->pic_size_in_map_units_minus1; i++) + WRITE_BITS (bw, pps->slice_group_idi, bits); + } + } + + WRITE_UE_MAX (bw, pps->num_ref_idx_l0_active_minus1, 31); + WRITE_UE_MAX (bw, pps->num_ref_idx_l1_active_minus1, 31); + WRITE_BITS (bw, pps->weighted_pred_flag, 1); + WRITE_BITS (bw, pps->weighted_bipred_idc, 2); + WRITE_SE_RANGE (bw, pps->pic_init_qp_minus26, -(26 + qp_bd_offset), 25); + WRITE_SE_RANGE (bw, pps->pic_init_qs_minus26, -26, 25); + WRITE_SE_RANGE (bw, pps->chroma_qp_index_offset, -12, 12); + + WRITE_BITS (bw, pps->deblocking_filter_control_present_flag, 1); + WRITE_BITS (bw, pps->constrained_intra_pred_flag, 1); + WRITE_BITS (bw, pps->redundant_pic_cnt_present_flag, 1); + + /* A.2.1 Baseline profile, A.2.2 Main profile and + A.2.3 Extended profile: + The syntax elements transform_8x8_mode_flag, + pic_scaling_matrix_present_flag, second_chroma_qp_index_offset + shall not be present in picture parameter sets. */ + if (pps->sequence->profile_idc == 66 || + pps->sequence->profile_idc == 77 || pps->sequence->profile_idc == 88) + return TRUE; + + WRITE_BITS (bw, pps->transform_8x8_mode_flag, 1); + + WRITE_BITS (bw, pps->pic_scaling_matrix_present_flag, 1); + + if (pps->pic_scaling_matrix_present_flag) { + guint8 n_lists; + + n_lists = 6 + ((pps->sequence->chroma_format_idc != 3) ? 2 : 6) * + pps->transform_8x8_mode_flag; + + if (pps->sequence->scaling_matrix_present_flag) { + if (!_h264_bit_writer_scaling_list (bw, &have_space, + pps->scaling_lists_4x4, pps->scaling_lists_8x8, + pps->sequence->scaling_lists_4x43, + pps->sequence->scaling_lists_4x40, + pps->sequence->scaling_lists_8x83, + pps->sequence->scaling_lists_8x80, n_lists)) + goto error; + } else { + if (!_h264_bit_writer_scaling_list (bw, &have_space, + pps->scaling_lists_4x4, pps->scaling_lists_8x8, + default_4x4_inter, default_4x4_intra, + default_8x8_inter, default_8x8_intra, n_lists)) + goto error; + } + } + + WRITE_SE_RANGE (bw, ((gint) pps->second_chroma_qp_index_offset), -12, 12); + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write pps"); + + *space = have_space; + return FALSE; +} + +/** + * gst_h264_bit_writer_pps: + * @pps: the pps of #GstH264PPS to write + * @start_code: whether adding the nal start code + * @data: (out): the bit stream generated by the pps + * @size: (inout): the size in bytes of the input and output + * + * Generating the according h264 bit stream by providing the pps. + * + * Returns: a #GstH264BitWriterResult + * + * Since: 1.22 + **/ +GstH264BitWriterResult +gst_h264_bit_writer_pps (const GstH264PPS * pps, gboolean start_code, + guint8 * data, guint * size) +{ + gboolean have_space = TRUE; + GstBitWriter bw; + + g_return_val_if_fail (pps != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (pps->sequence != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (data != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (size != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (*size > 0, GST_H264_BIT_WRITER_ERROR); + + gst_bit_writer_init_with_data (&bw, data, *size, FALSE); + + if (start_code) + WRITE_BITS (&bw, 0x00000001, 32); + + /* nal header */ + /* forbidden_zero_bit */ + WRITE_BITS (&bw, 0, 1); + /* nal_ref_idc */ + WRITE_BITS (&bw, 1, 2); + /* nal_unit_type */ + WRITE_BITS (&bw, GST_H264_NAL_PPS, 5); + + if (!_h264_bit_writer_pps (pps, &bw, &have_space)) + goto error; + + /* Add trailings. */ + WRITE_BITS (&bw, 1, 1); + if (!gst_bit_writer_align_bytes (&bw, 0)) { + have_space = FALSE; + goto error; + } + + *size = (gst_bit_writer_get_size (&bw)) / 8; + gst_bit_writer_reset (&bw); + return GST_H264_BIT_WRITER_OK; + +error: + gst_bit_writer_reset (&bw); + *size = 0; + + return have_space ? GST_H264_BIT_WRITER_INVALID_DATA : + GST_H264_BIT_WRITER_NO_MORE_SPACE; +} + +static gboolean +_h264_slice_bit_writer_ref_pic_list_modification_1 (const GstH264SliceHdr * + slice, guint list, gboolean is_mvc, GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + const GstH264RefPicListModification *entries; + guint8 ref_pic_list_modification_flag = 0; + guint i; + + if (list == 0) { + entries = slice->ref_pic_list_modification_l0; + ref_pic_list_modification_flag = slice->ref_pic_list_modification_flag_l0; + } else { + entries = slice->ref_pic_list_modification_l1; + ref_pic_list_modification_flag = slice->ref_pic_list_modification_flag_l1; + } + + WRITE_BITS (bw, ref_pic_list_modification_flag, 1); + if (ref_pic_list_modification_flag) { + i = 0; + do { + g_assert (i < 32); + + WRITE_UE (bw, entriesi.modification_of_pic_nums_idc); + if (entriesi.modification_of_pic_nums_idc == 0 || + entriesi.modification_of_pic_nums_idc == 1) { + WRITE_UE_MAX (bw, entriesi.value.abs_diff_pic_num_minus1, + slice->max_pic_num - 1); + } else if (entriesi.modification_of_pic_nums_idc == 2) { + WRITE_UE (bw, entriesi.value.long_term_pic_num); + } else if (is_mvc && (entriesi.modification_of_pic_nums_idc == 4 || + entriesi.modification_of_pic_nums_idc == 5)) { + WRITE_UE (bw, entriesi.value.abs_diff_view_idx_minus1); + } + } while (entriesi++.modification_of_pic_nums_idc != 3); + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write \"Reference picture list %u modification\"", + list); + + *space = have_space; + return FALSE; +} + +static gboolean +_h264_slice_bit_writer_ref_pic_list_modification (const GstH264SliceHdr * + slice, gboolean is_mvc, GstBitWriter * bw, gboolean * space) +{ + if (!GST_H264_IS_I_SLICE (slice) && !GST_H264_IS_SI_SLICE (slice)) { + if (!_h264_slice_bit_writer_ref_pic_list_modification_1 (slice, 0, + is_mvc, bw, space)) + return FALSE; + } + + if (GST_H264_IS_B_SLICE (slice)) { + if (!_h264_slice_bit_writer_ref_pic_list_modification_1 (slice, 1, + is_mvc, bw, space)) + return FALSE; + } + + *space = TRUE; + return TRUE; +} + +static gboolean +_h264_slice_bit_writer_pred_weight_table (const GstH264SliceHdr * slice, + guint8 chroma_array_type, GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + const GstH264PredWeightTable *p; + gint i; + gint16 default_luma_weight, default_chroma_weight; + + GST_DEBUG ("writing \"Prediction weight table\""); + + p = &slice->pred_weight_table; + default_luma_weight = 1 << p->luma_log2_weight_denom; + default_chroma_weight = 1 << p->chroma_log2_weight_denom; + + WRITE_UE_MAX (bw, p->luma_log2_weight_denom, 7); + + if (chroma_array_type != 0) + WRITE_UE_MAX (bw, p->chroma_log2_weight_denom, 7); + + for (i = 0; i <= slice->num_ref_idx_l0_active_minus1; i++) { + guint8 luma_weight_l0_flag = 0; + + if (p->luma_weight_l0i != default_luma_weight || + p->luma_offset_l0i != 0) + luma_weight_l0_flag = 1; + + WRITE_BITS (bw, luma_weight_l0_flag, 1); + if (luma_weight_l0_flag) { + WRITE_SE_RANGE (bw, p->luma_weight_l0i, -128, 127); + WRITE_SE_RANGE (bw, p->luma_offset_l0i, -128, 127); + } + if (chroma_array_type != 0) { + guint8 chroma_weight_l0_flag = 0; + gint j; + + for (j = 0; j < 2; j++) { + if (p->chroma_weight_l0ij != default_chroma_weight || + p->chroma_offset_l0ij != 0) + chroma_weight_l0_flag = 1; + } + + WRITE_BITS (bw, chroma_weight_l0_flag, 1); + if (chroma_weight_l0_flag) { + for (j = 0; j < 2; j++) { + WRITE_SE_RANGE (bw, p->chroma_weight_l0ij, -128, 127); + WRITE_SE_RANGE (bw, p->chroma_offset_l0ij, -128, 127); + } + } + } + } + + if (GST_H264_IS_B_SLICE (slice)) { + for (i = 0; i <= slice->num_ref_idx_l1_active_minus1; i++) { + guint8 luma_weight_l1_flag = 0; + + if (p->luma_weight_l1i != default_luma_weight || + p->luma_offset_l1i != 0) + luma_weight_l1_flag = 1; + + WRITE_BITS (bw, luma_weight_l1_flag, 1); + if (luma_weight_l1_flag) { + WRITE_SE_RANGE (bw, p->luma_weight_l1i, -128, 127); + WRITE_SE_RANGE (bw, p->luma_offset_l1i, -128, 127); + } + if (chroma_array_type != 0) { + guint8 chroma_weight_l1_flag = 0; + gint j; + + for (j = 0; j < 2; j++) { + if (p->chroma_weight_l1ij != default_chroma_weight || + p->chroma_offset_l1ij != 0) + chroma_weight_l1_flag = 1; + } + + WRITE_BITS (bw, chroma_weight_l1_flag, 1); + if (chroma_weight_l1_flag) { + for (j = 0; j < 2; j++) { + WRITE_SE_RANGE (bw, p->chroma_weight_l1ij, -128, 127); + WRITE_SE_RANGE (bw, p->chroma_offset_l1ij, -128, 127); + } + } + } + } + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write \"Prediction weight table\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h264_bit_writer_slice_dec_ref_pic_marking (const GstH264SliceHdr * slice, + guint32 nal_type, GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + + GST_DEBUG ("writing \"Dec Ref Pic Marking\""); + + if (nal_type == GST_H264_NAL_SLICE_IDR) { + WRITE_BITS (bw, slice->dec_ref_pic_marking.no_output_of_prior_pics_flag, 1); + WRITE_BITS (bw, slice->dec_ref_pic_marking.long_term_reference_flag, 1); + } else { + WRITE_BITS (bw, + slice->dec_ref_pic_marking.adaptive_ref_pic_marking_mode_flag, 1); + + if (slice->dec_ref_pic_marking.adaptive_ref_pic_marking_mode_flag) { + const GstH264RefPicMarking *refpicmarking; + guint i; + + for (i = 0; i < slice->dec_ref_pic_marking.n_ref_pic_marking; i++) { + refpicmarking = &slice->dec_ref_pic_marking.ref_pic_markingi; + + WRITE_UE_MAX (bw, + refpicmarking->memory_management_control_operation, 6); + + if (refpicmarking->memory_management_control_operation == 0) + break; + + if (refpicmarking->memory_management_control_operation == 1 + || refpicmarking->memory_management_control_operation == 3) + WRITE_UE (bw, refpicmarking->difference_of_pic_nums_minus1); + + if (refpicmarking->memory_management_control_operation == 2) + WRITE_UE (bw, refpicmarking->long_term_pic_num); + + if (refpicmarking->memory_management_control_operation == 3 + || refpicmarking->memory_management_control_operation == 6) + WRITE_UE (bw, refpicmarking->long_term_frame_idx); + + if (refpicmarking->memory_management_control_operation == 4) + WRITE_UE (bw, refpicmarking->max_long_term_frame_idx_plus1); + } + } + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write \"Dec Ref Pic Marking\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h264_bit_writer_slice_hdr (const GstH264SliceHdr * slice, guint32 nal_type, + guint32 ext_type, gboolean is_ref, GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + + GST_DEBUG ("writing slice header"); + + WRITE_UE (bw, slice->first_mb_in_slice); + WRITE_UE (bw, slice->type); + + WRITE_UE_MAX (bw, slice->pps->id, GST_H264_MAX_PPS_COUNT - 1); + + if (slice->pps->sequence->separate_colour_plane_flag) + WRITE_BITS (bw, slice->colour_plane_id, 2); + + WRITE_BITS (bw, slice->frame_num, + slice->pps->sequence->log2_max_frame_num_minus4 + 4); + + if (!slice->pps->sequence->frame_mbs_only_flag) { + WRITE_BITS (bw, slice->field_pic_flag, 1); + if (slice->field_pic_flag) + WRITE_BITS (bw, slice->bottom_field_flag, 1); + } + + if (nal_type == GST_H264_NAL_SLICE_IDR) + WRITE_UE_MAX (bw, slice->idr_pic_id, G_MAXUINT16); + + if (slice->pps->sequence->pic_order_cnt_type == 0) { + WRITE_BITS (bw, slice->pic_order_cnt_lsb, + slice->pps->sequence->log2_max_pic_order_cnt_lsb_minus4 + 4); + + if (slice->pps->pic_order_present_flag && !slice->field_pic_flag) + WRITE_SE (bw, slice->delta_pic_order_cnt_bottom); + } + + if (slice->pps->sequence->pic_order_cnt_type == 1 + && !slice->pps->sequence->delta_pic_order_always_zero_flag) { + WRITE_SE (bw, slice->delta_pic_order_cnt0); + if (slice->pps->pic_order_present_flag && !slice->field_pic_flag) + WRITE_SE (bw, slice->delta_pic_order_cnt1); + } + + if (slice->pps->redundant_pic_cnt_present_flag) + WRITE_UE_MAX (bw, slice->redundant_pic_cnt, G_MAXINT8); + + if (GST_H264_IS_B_SLICE (slice)) + WRITE_BITS (bw, slice->direct_spatial_mv_pred_flag, 1); + + if (GST_H264_IS_P_SLICE (slice) || GST_H264_IS_SP_SLICE (slice) || + GST_H264_IS_B_SLICE (slice)) { + WRITE_BITS (bw, slice->num_ref_idx_active_override_flag, 1); + if (slice->num_ref_idx_active_override_flag) { + WRITE_UE_MAX (bw, slice->num_ref_idx_l0_active_minus1, 31); + + if (GST_H264_IS_B_SLICE (slice)) + WRITE_UE_MAX (bw, slice->num_ref_idx_l1_active_minus1, 31); + } + } + + if (!_h264_slice_bit_writer_ref_pic_list_modification (slice, + ext_type == GST_H264_NAL_EXTENSION_MVC, bw, &have_space)) + goto error; + + if ((slice->pps->weighted_pred_flag && (GST_H264_IS_P_SLICE (slice) + || GST_H264_IS_SP_SLICE (slice))) + || (slice->pps->weighted_bipred_idc == 1 && GST_H264_IS_B_SLICE (slice))) { + if (!_h264_slice_bit_writer_pred_weight_table (slice, + slice->pps->sequence->chroma_array_type, bw, &have_space)) + goto error; + } + + if (is_ref) { + if (!_h264_bit_writer_slice_dec_ref_pic_marking (slice, nal_type, bw, + &have_space)) + goto error; + } + + if (slice->pps->entropy_coding_mode_flag && !GST_H264_IS_I_SLICE (slice) && + !GST_H264_IS_SI_SLICE (slice)) + WRITE_UE_MAX (bw, slice->cabac_init_idc, 2); + + WRITE_SE_RANGE (bw, slice->slice_qp_delta, -87, 77); + + if (GST_H264_IS_SP_SLICE (slice) || GST_H264_IS_SI_SLICE (slice)) { + if (GST_H264_IS_SP_SLICE (slice)) + WRITE_BITS (bw, slice->sp_for_switch_flag, 1); + + WRITE_SE_RANGE (bw, slice->slice_qs_delta, -51, 51); + } + + if (slice->pps->deblocking_filter_control_present_flag) { + WRITE_UE_MAX (bw, slice->disable_deblocking_filter_idc, 2); + if (slice->disable_deblocking_filter_idc != 1) { + WRITE_SE_RANGE (bw, slice->slice_alpha_c0_offset_div2, -6, 6); + WRITE_SE_RANGE (bw, slice->slice_beta_offset_div2, -6, 6); + } + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write slice header"); + + *space = have_space; + return FALSE; +} + +/** + * gst_h264_bit_writer_slice_hdr: + * @slice: the slice header of #GstH264SliceHdr to write + * @start_code: whether adding the nal start code + * @nal_type: the slice's nal type of #GstH264NalUnitType + * @is_ref: whether the slice is a reference + * @data: (out): the bit stream generated by the slice header + * @size: (inout): the size in bytes of the input and output + * @trail_bits_num: (out): the trail bits number which is not byte aligned. + * + * Generating the according h264 bit stream by providing the slice header. + * + * Returns: a #GstH264BitWriterResult + * + * Since: 1.22 + **/ +GstH264BitWriterResult +gst_h264_bit_writer_slice_hdr (const GstH264SliceHdr * slice, + gboolean start_code, GstH264NalUnitType nal_type, gboolean is_ref, + guint8 * data, guint * size, guint * trail_bits_num) +{ + gboolean have_space = TRUE; + GstBitWriter bw; + + g_return_val_if_fail (slice != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (slice->pps != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (slice->pps->sequence != NULL, + GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (nal_type >= GST_H264_NAL_SLICE + && nal_type <= GST_H264_NAL_SLICE_IDR, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (data != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (size != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (*size > 0, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (trail_bits_num != NULL, GST_H264_BIT_WRITER_ERROR); + + if (nal_type == GST_H264_NAL_SLICE_IDR) + g_return_val_if_fail (is_ref, GST_H264_BIT_WRITER_ERROR); + + gst_bit_writer_init_with_data (&bw, data, *size, FALSE); + + if (start_code) + WRITE_BITS (&bw, 0x00000001, 32); + + /* nal header */ + /* forbidden_zero_bit */ + WRITE_BITS (&bw, 0, 1); + /* nal_ref_idc, zero for non-reference picture */ + WRITE_BITS (&bw, is_ref, 2); + /* nal_unit_type */ + WRITE_BITS (&bw, nal_type, 5); + + if (!_h264_bit_writer_slice_hdr (slice, nal_type, + GST_H264_NAL_EXTENSION_NONE, is_ref, &bw, &have_space)) + goto error; + + /* We do not add trailing bits here, the slice data should follow it. */ + + *size = gst_bit_writer_get_size (&bw) / 8; + *trail_bits_num = gst_bit_writer_get_size (&bw) % 8; + gst_bit_writer_reset (&bw); + return GST_H264_BIT_WRITER_OK; + +error: + gst_bit_writer_reset (&bw); + *size = 0; + + return have_space ? GST_H264_BIT_WRITER_INVALID_DATA : + GST_H264_BIT_WRITER_NO_MORE_SPACE; +} + +static gboolean +_h264_bit_writer_sei_registered_user_data (const GstH264RegisteredUserData * + rud, GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + + GST_DEBUG ("Writing \"Registered user data\""); + + WRITE_BITS (bw, rud->country_code, 8); + if (rud->country_code == 0xff) + WRITE_BITS (bw, rud->country_code_extension, 8); + + WRITE_BYTES (bw, rud->data, rud->size); + + *space = TRUE; + return TRUE; + +error:GST_WARNING ("Failed to write \"Registered user data\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h264_bit_writer_sei_frame_packing (const GstH264FramePacking * + frame_packing, GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + + GST_DEBUG ("Writing \"Frame packing\""); + + WRITE_UE (bw, frame_packing->frame_packing_id); + WRITE_BITS (bw, frame_packing->frame_packing_cancel_flag, 1); + + if (!frame_packing->frame_packing_cancel_flag) { + WRITE_BITS (bw, frame_packing->frame_packing_type, 7); + WRITE_BITS (bw, frame_packing->quincunx_sampling_flag, 1); + WRITE_BITS (bw, frame_packing->content_interpretation_type, 6); + WRITE_BITS (bw, frame_packing->spatial_flipping_flag, 1); + WRITE_BITS (bw, frame_packing->frame0_flipped_flag, 1); + WRITE_BITS (bw, frame_packing->field_views_flag, 1); + WRITE_BITS (bw, frame_packing->current_frame_is_frame0_flag, 1); + WRITE_BITS (bw, frame_packing->frame0_self_contained_flag, 1); + WRITE_BITS (bw, frame_packing->frame1_self_contained_flag, 1); + + if (!frame_packing->quincunx_sampling_flag && + frame_packing->frame_packing_type != + GST_H264_FRAME_PACKING_TEMPORAL_INTERLEAVING) { + WRITE_BITS (bw, frame_packing->frame0_grid_position_x, 4); + WRITE_BITS (bw, frame_packing->frame0_grid_position_y, 4); + WRITE_BITS (bw, frame_packing->frame1_grid_position_x, 4); + WRITE_BITS (bw, frame_packing->frame1_grid_position_y, 4); + } + + /* frame_packing_arrangement_reserved_byte */ + WRITE_BITS (bw, 0, 8); + WRITE_UE (bw, frame_packing->frame_packing_repetition_period); + } + + /* frame_packing_arrangement_extension_flag */ + WRITE_BITS (bw, 0, 1); + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("Failed to write \"Frame packing\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h264_bit_writer_sei_mastering_display_colour_volume (const + GstH264MasteringDisplayColourVolume * mdcv, GstBitWriter * bw, + gboolean * space) +{ + gboolean have_space = TRUE; + gint i; + + GST_DEBUG ("Wrtiting \"Mastering display colour volume\""); + + for (i = 0; i < 3; i++) { + WRITE_BITS (bw, mdcv->display_primaries_xi, 16); + WRITE_BITS (bw, mdcv->display_primaries_yi, 16); + } + + WRITE_BITS (bw, mdcv->white_point_x, 16); + WRITE_BITS (bw, mdcv->white_point_y, 16); + WRITE_BITS (bw, mdcv->max_display_mastering_luminance, 32); + WRITE_BITS (bw, mdcv->min_display_mastering_luminance, 32); + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("Failed to write \"Mastering display colour volume\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h264_bit_writer_sei_content_light_level_info (const + GstH264ContentLightLevel * cll, GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + + GST_DEBUG ("Writing \"Content light level\""); + + WRITE_BITS (bw, cll->max_content_light_level, 16); + WRITE_BITS (bw, cll->max_pic_average_light_level, 16); + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("Failed to write \"Content light level\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h264_bit_writer_sei_pic_timing (const GstH264PicTiming * tim, + GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + + GST_DEBUG ("Writing \"Picture timing\""); + + if (tim->CpbDpbDelaysPresentFlag) { + WRITE_BITS (bw, tim->cpb_removal_delay, + tim->cpb_removal_delay_length_minus1 + 1); + WRITE_BITS (bw, tim->dpb_output_delay, + tim->dpb_output_delay_length_minus1 + 1); + } + + if (tim->pic_struct_present_flag) { + const guint8 num_clock_ts_table9 = { + 1, 1, 1, 2, 2, 3, 3, 2, 3 + }; + guint8 num_clock_num_ts; + guint i; + + WRITE_BITS (bw, tim->pic_struct, 4); + + num_clock_num_ts = num_clock_ts_tabletim->pic_struct; + for (i = 0; i < num_clock_num_ts; i++) { + WRITE_BITS (bw, tim->clock_timestamp_flagi, 1); + if (tim->clock_timestamp_flagi) { + const GstH264ClockTimestamp *timestamp = &tim->clock_timestampi; + + WRITE_BITS (bw, timestamp->ct_type, 2); + WRITE_BITS (bw, timestamp->nuit_field_based_flag, 1); + WRITE_BITS (bw, timestamp->counting_type, 5); + WRITE_BITS (bw, timestamp->full_timestamp_flag, 1); + WRITE_BITS (bw, timestamp->discontinuity_flag, 1); + WRITE_BITS (bw, timestamp->cnt_dropped_flag, 1); + WRITE_BITS (bw, timestamp->n_frames, 8); + + if (timestamp->full_timestamp_flag) { + if (!timestamp->seconds_flag || !timestamp->minutes_flag + || !timestamp->hours_flag) + goto error; + + WRITE_BITS (bw, timestamp->seconds_value, 6); + WRITE_BITS (bw, timestamp->minutes_value, 6); + WRITE_BITS (bw, timestamp->hours_value, 5); + } else { + WRITE_BITS (bw, timestamp->seconds_flag, 1); + if (timestamp->seconds_flag) { + WRITE_BITS (bw, timestamp->seconds_value, 6); + WRITE_BITS (bw, timestamp->minutes_flag, 1); + if (timestamp->minutes_flag) { + WRITE_BITS (bw, timestamp->minutes_value, 6); + WRITE_BITS (bw, timestamp->hours_flag, 1); + if (timestamp->hours_flag) + WRITE_BITS (bw, timestamp->hours_value, 5); + } + } + } + + if (tim->time_offset_length > 0) { + WRITE_BITS (bw, timestamp->time_offset, tim->time_offset_length); + } + } + } + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("Failed to write \"Picture timing\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h264_bit_writer_sei_buffering_period (const GstH264BufferingPeriod * per, + GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + + GST_DEBUG ("Writing \"Buffering period\""); + + if (!per->sps) + goto error; + + WRITE_UE_MAX (bw, per->sps->id, GST_H264_MAX_SPS_COUNT - 1); + + if (per->sps->vui_parameters_present_flag) { + GstH264VUIParams *vui = &per->sps->vui_parameters; + + if (vui->nal_hrd_parameters_present_flag) { + GstH264HRDParams *hrd = &vui->nal_hrd_parameters; + const guint8 nbits = hrd->initial_cpb_removal_delay_length_minus1 + 1; + guint8 sched_sel_idx; + + for (sched_sel_idx = 0; sched_sel_idx <= hrd->cpb_cnt_minus1; + sched_sel_idx++) { + WRITE_BITS (bw, per->nal_initial_cpb_removal_delaysched_sel_idx, + nbits); + WRITE_BITS (bw, + per->nal_initial_cpb_removal_delay_offsetsched_sel_idx, nbits); + } + } + + if (vui->vcl_hrd_parameters_present_flag) { + GstH264HRDParams *hrd = &vui->vcl_hrd_parameters; + const guint8 nbits = hrd->initial_cpb_removal_delay_length_minus1 + 1; + guint8 sched_sel_idx; + + for (sched_sel_idx = 0; sched_sel_idx <= hrd->cpb_cnt_minus1; + sched_sel_idx++) { + WRITE_BITS (bw, per->vcl_initial_cpb_removal_delaysched_sel_idx, + nbits); + WRITE_BITS (bw, + per->vcl_initial_cpb_removal_delay_offsetsched_sel_idx, nbits); + } + } + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("Failed to write \"Buffering period\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h264_bit_writer_sei_message (const GstH264SEIMessage * msg, + GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + + GST_DEBUG ("writing SEI message"); + + switch (msg->payloadType) { + case GST_H264_SEI_REGISTERED_USER_DATA: + if (!_h264_bit_writer_sei_registered_user_data + (&msg->payload.registered_user_data, bw, &have_space)) + goto error; + break; + case GST_H264_SEI_FRAME_PACKING: + if (!_h264_bit_writer_sei_frame_packing + (&msg->payload.frame_packing, bw, &have_space)) + goto error; + break; + case GST_H264_SEI_MASTERING_DISPLAY_COLOUR_VOLUME: + if (!_h264_bit_writer_sei_mastering_display_colour_volume + (&msg->payload.mastering_display_colour_volume, bw, &have_space)) + goto error; + break; + case GST_H264_SEI_CONTENT_LIGHT_LEVEL: + if (!_h264_bit_writer_sei_content_light_level_info + (&msg->payload.content_light_level, bw, &have_space)) + goto error; + break; + case GST_H264_SEI_PIC_TIMING: + if (!_h264_bit_writer_sei_pic_timing (&msg->payload.pic_timing, bw, + &have_space)) + goto error; + break; + case GST_H264_SEI_BUF_PERIOD: + if (!_h264_bit_writer_sei_buffering_period + (&msg->payload.buffering_period, bw, &have_space)) + goto error; + break; + default: + break; + } + + /* Add trailings. */ + WRITE_BITS (bw, 1, 1); + gst_bit_writer_align_bytes_unchecked (bw, 0); + + *space = TRUE; + + return TRUE; + +error: + GST_WARNING ("error to write SEI message"); + + *space = have_space; + return FALSE; +} + +/** + * gst_h264_bit_writer_sei: + * @sei_messages: An array of #GstH264SEIMessage to write + * @start_code: whether adding the nal start code + * @data: (out): the bit stream generated by the sei messages + * @size: (inout): the size in bytes of the input and output + * + * Generating the according h264 bit stream by providing sei messages. + * + * Returns: a #GstH264BitWriterResult + * + * Since: 1.22 + **/ +GstH264BitWriterResult +gst_h264_bit_writer_sei (GArray * sei_messages, gboolean start_code, + guint8 * data, guint * size) +{ + gboolean have_space = TRUE; + GstBitWriter bw; + GstBitWriter bw_msg; + GstH264SEIMessage *sei; + gboolean have_written_data = FALSE; + guint i; + + g_return_val_if_fail (sei_messages != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (data != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (size != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (*size > 0, GST_H264_BIT_WRITER_ERROR); + + gst_bit_writer_init_with_data (&bw, data, *size, FALSE); + + if (start_code) + WRITE_BITS (&bw, 0x00000001, 32); + + /* nal header */ + /* forbidden_zero_bit */ + WRITE_BITS (&bw, 0, 1); + /* nal_ref_idc, zero for sei nalu */ + WRITE_BITS (&bw, 0, 2); + /* nal_unit_type */ + WRITE_BITS (&bw, GST_H264_NAL_SEI, 5); + + for (i = 0; i < sei_messages->len; i++) { + guint32 payload_size_data; + guint32 payload_type_data; + guint32 sz; + + gst_bit_writer_init (&bw_msg); + + sei = &g_array_index (sei_messages, GstH264SEIMessage, i); + if (!_h264_bit_writer_sei_message (sei, &bw_msg, &have_space)) + goto error; + + if (gst_bit_writer_get_size (&bw_msg) == 0) { + GST_FIXME ("Unsupported SEI type %d", sei->payloadType); + continue; + } + + have_written_data = TRUE; + + g_assert (gst_bit_writer_get_size (&bw_msg) % 8 == 0); + payload_size_data = gst_bit_writer_get_size (&bw_msg) / 8; + payload_type_data = sei->payloadType; + + /* write payload type bytes */ + while (payload_type_data >= 0xff) { + WRITE_BITS (&bw, 0xff, 8); + payload_type_data -= 0xff; + } + WRITE_BITS (&bw, payload_type_data, 8); + + /* write payload size bytes */ + sz = payload_size_data; + while (sz >= 0xff) { + WRITE_BITS (&bw, 0xff, 8); + sz -= 0xff; + } + WRITE_BITS (&bw, sz, 8); + + if (payload_size_data > 0) + WRITE_BYTES (&bw, gst_bit_writer_get_data (&bw_msg), payload_size_data); + + gst_bit_writer_reset (&bw_msg); + } + + if (!have_written_data) { + GST_WARNING ("No written sei data"); + goto error; + } + + /* Add trailings. */ + WRITE_BITS (&bw, 1, 1); + if (!gst_bit_writer_align_bytes (&bw, 0)) { + have_space = FALSE; + goto error; + } + + *size = (gst_bit_writer_get_size (&bw)) / 8; + gst_bit_writer_reset (&bw); + return GST_H264_BIT_WRITER_OK; + +error: + gst_bit_writer_reset (&bw); + *size = 0; + + return have_space ? GST_H264_BIT_WRITER_INVALID_DATA : + GST_H264_BIT_WRITER_NO_MORE_SPACE; +} + +/** + * gst_h264_bit_writer_aud: + * @primary_pic_type: indicate the possible slice types list just + * as the H264 spec defines + * @start_code: whether adding the nal start code + * @data: (out): the bit stream generated by the aud + * @size: (inout): the size in bytes of the input and output + * + * Generating the according h264 bit stream of an aud. + * + * Returns: a #GstH264BitWriterResult + * + * Since: 1.22 + **/ +GstH264BitWriterResult +gst_h264_bit_writer_aud (guint8 primary_pic_type, gboolean start_code, + guint8 * data, guint * size) +{ + gboolean have_space = TRUE; + GstBitWriter bw; + + g_return_val_if_fail (primary_pic_type >= 0 + && primary_pic_type <= 7, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (data != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (size != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (*size > 0, GST_H264_BIT_WRITER_ERROR); + + gst_bit_writer_init_with_data (&bw, data, *size, FALSE); + + if (start_code) + WRITE_BITS (&bw, 0x00000001, 32); + + /* nal header */ + /* forbidden_zero_bit */ + WRITE_BITS (&bw, 0, 1); + /* nal_ref_idc */ + WRITE_BITS (&bw, 0, 2); + /* nal_unit_type */ + WRITE_BITS (&bw, GST_H264_NAL_AU_DELIMITER, 5); + + WRITE_BITS (&bw, primary_pic_type, 3); + + /* Add trailings. */ + WRITE_BITS (&bw, 1, 1); + if (!gst_bit_writer_align_bytes (&bw, 0)) { + goto error; + } + + *size = (gst_bit_writer_get_size (&bw)) / 8; + gst_bit_writer_reset (&bw); + + return GST_H264_BIT_WRITER_OK; + +error: + gst_bit_writer_reset (&bw); + *size = 0; + + return have_space ? GST_H264_BIT_WRITER_INVALID_DATA : + GST_H264_BIT_WRITER_NO_MORE_SPACE; +} + +/** + * gst_h264_bit_writer_convert_to_nal: + * @nal_prefix_size: the size in bytes for the prefix of a nal, may + * be 2, 3 or 4 + * @packetized: whether to write the bit stream in packetized format, + * which does not have the start code but has a @nal_prefix_size bytes' + * size prepending to the real nal data + * @has_startcode: whether the input already has a start code + * @add_trailings: whether to add rbsp trailing bits to make the output + * aligned to byte + * @raw_data: the input bit stream + * @raw_size: the size in bits of the input bit stream + * @nal_data: (out): the output bit stream converted to a real nal + * @nal_size: (inout): the size in bytes of the output + * + * Converting a bit stream into a real nal packet. If the bit stream already + * has a start code, it will be replaced by the new one specified by the + * @nal_prefix_size and @packetized. It is assured that the output aligns to + * the byte and the all the emulations are inserted. + * + * Returns: a #GstH264BitWriterResult + * + * Since: 1.22 + **/ +GstH264BitWriterResult +gst_h264_bit_writer_convert_to_nal (guint nal_prefix_size, gboolean packetized, + gboolean has_startcode, gboolean add_trailings, const guint8 * raw_data, + gsize raw_size, guint8 * nal_data, guint * nal_size) +{ + NalWriter nw; + guint8 *data; + guint32 size = 0; + gboolean need_more_space = FALSE; + + g_return_val_if_fail ( + (packetized && nal_prefix_size > 1 && nal_prefix_size < 5) || + (!packetized && (nal_prefix_size == 3 || nal_prefix_size == 4)), + GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (raw_data != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (raw_size > 0, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (nal_data != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (nal_size != NULL, GST_H264_BIT_WRITER_ERROR); + g_return_val_if_fail (*nal_size > 0, GST_H264_BIT_WRITER_ERROR); + + if (has_startcode) { + /* Skip the start code, the NalWriter will add it automatically. */ + if (raw_size >= 4 && raw_data0 == 0 + && raw_data1 == 0 && raw_data2 == 0 && raw_data3 == 0x01) { + raw_data += 4; + raw_size -= 4 * 8; + } else if (raw_size >= 3 && raw_data0 == 0 && raw_data1 == 0 + && raw_data2 == 0x01) { + raw_data += 3; + raw_size -= 3 * 8; + } else { + /* Fail to find the start code. */ + g_return_val_if_reached (GST_H264_BIT_WRITER_ERROR); + } + } + + /* If no RBSP trailing needed, it must align to byte. We assume + that the rbsp trailing bits are already added. */ + if (!add_trailings) + g_return_val_if_fail (raw_size % 8 == 0, GST_H264_BIT_WRITER_ERROR); + + nal_writer_init (&nw, nal_prefix_size, packetized); + + if (!nal_writer_put_bytes (&nw, raw_data, raw_size / 8)) + goto error; + + if (raw_size % 8) { + guint8 data = *(raw_data + raw_size / 8); + + if (!nal_writer_put_bits_uint8 (&nw, + data >> (8 - raw_size % 8), raw_size % 8)) + goto error; + } + + if (add_trailings) { + if (!nal_writer_do_rbsp_trailing_bits (&nw)) + goto error; + } + + data = nal_writer_reset_and_get_data (&nw, &size); + if (!data) + goto error; + + if (size > *nal_size) { + need_more_space = TRUE; + g_free (data); + goto error; + } + + memcpy (nal_data, data, size); + *nal_size = size; + g_free (data); + nal_writer_reset (&nw); + return GST_H264_BIT_WRITER_OK; + +error: + nal_writer_reset (&nw); + *nal_size = 0; + + GST_WARNING ("Failed to convert nal data"); + + return need_more_space ? GST_H264_BIT_WRITER_INVALID_DATA : + GST_H264_BIT_WRITER_NO_MORE_SPACE; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gsth264bitwriter.h
Added
@@ -0,0 +1,88 @@ +/* GStreamer + * Copyright (C) 2020 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the0 + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_H264_BIT_WRITER_H__ +#define __GST_H264_BIT_WRITER_H__ + +#include <gst/codecparsers/codecparsers-prelude.h> +#include <gst/codecparsers/gsth264parser.h> + +G_BEGIN_DECLS + +/** + * GstH264BitWriterResult: + * @GST_H264_BIT_WRITER_OK: The writing succeeded + * @GST_H264_BIT_WRITER_INVALID_DATA: The input data to write is invalid + * @GST_H264_BIT_WRITER_NO_MORE_SPACE: The output does not have enough size + * @GST_H264_BIT_WRITER_ERROR: An general error occurred when writing + * + * The result of writing H264 data into bit stream. + * + * Since: 1.22 + */ +typedef enum +{ + GST_H264_BIT_WRITER_OK, + GST_H264_BIT_WRITER_INVALID_DATA, + GST_H264_BIT_WRITER_NO_MORE_SPACE, + GST_H264_BIT_WRITER_ERROR +} GstH264BitWriterResult; + +GST_CODEC_PARSERS_API +GstH264BitWriterResult gst_h264_bit_writer_sps (const GstH264SPS * sps, + gboolean start_code, + guint8 * data, + guint * size); +GST_CODEC_PARSERS_API +GstH264BitWriterResult gst_h264_bit_writer_pps (const GstH264PPS * pps, + gboolean start_code, + guint8 * data, + guint * size); +GST_CODEC_PARSERS_API +GstH264BitWriterResult gst_h264_bit_writer_slice_hdr (const GstH264SliceHdr * slice, + gboolean start_code, + GstH264NalUnitType nal_type, + gboolean is_ref, + guint8 * data, + guint * size, + guint * trail_bits_num); +GST_CODEC_PARSERS_API +GstH264BitWriterResult gst_h264_bit_writer_sei (GArray * sei_messages, + gboolean start_code, + guint8 * data, + guint * size); +GST_CODEC_PARSERS_API +GstH264BitWriterResult gst_h264_bit_writer_aud (guint8 primary_pic_type, + gboolean start_code, + guint8 * data, + guint * size); +GST_CODEC_PARSERS_API +GstH264BitWriterResult gst_h264_bit_writer_convert_to_nal (guint nal_prefix_size, + gboolean packetized, + gboolean has_startcode, + gboolean add_trailings, + const guint8 * raw_data, + gsize raw_size, + guint8 * nal_data, + guint * nal_size); + +G_END_DECLS + +#endif /* __GST_H264_BIT_WRITER_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecparsers/gsth264parser.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gsth264parser.c
Changed
@@ -1089,6 +1089,48 @@ } static GstH264ParserResult +gst_h264_parser_parse_user_data_unregistered (GstH264NalParser * nalparser, + GstH264UserDataUnregistered * urud, NalReader * nr, guint payload_size) +{ + guint8 *data = NULL; + gint i; + + if (payload_size < 16) { + GST_WARNING ("Too small payload size %d", payload_size); + return GST_H264_PARSER_BROKEN_DATA; + } + + for (int i = 0; i < 16; i++) { + READ_UINT8 (nr, urud->uuidi, 8); + --payload_size; + } + + urud->size = payload_size; + + data = g_malloc0 (payload_size); + for (i = 0; i < payload_size; ++i) { + READ_UINT8 (nr, datai, 8); + } + + if (payload_size < 1) { + GST_WARNING ("No more remaining payload data to store"); + g_clear_pointer (&data, g_free); + return GST_H264_PARSER_BROKEN_DATA; + } + + urud->data = data; + GST_MEMDUMP ("SEI user data unregistered", data, payload_size); + return GST_H264_PARSER_OK; + +error: + { + GST_WARNING ("error parsing \"User Data Unregistered\""); + g_clear_pointer (&data, g_free); + return GST_H264_PARSER_ERROR; + } +} + +static GstH264ParserResult gst_h264_parser_parse_recovery_point (GstH264NalParser * nalparser, GstH264RecoveryPoint * rp, NalReader * nr) { @@ -1310,6 +1352,10 @@ res = gst_h264_parser_parse_registered_user_data (nalparser, &sei->payload.registered_user_data, nr, payload_size >> 3); break; + case GST_H264_SEI_USER_DATA_UNREGISTERED: + res = gst_h264_parser_parse_user_data_unregistered (nalparser, + &sei->payload.user_data_unregistered, nr, payload_size >> 3); + break; case GST_H264_SEI_RECOVERY_POINT: res = gst_h264_parser_parse_recovery_point (nalparser, &sei->payload.recovery_point, nr); @@ -2469,6 +2515,13 @@ rud->data = NULL; break; } + case GST_H264_SEI_USER_DATA_UNREGISTERED:{ + GstH264UserDataUnregistered *udu = &sei->payload.user_data_unregistered; + + g_free ((guint8 *) udu->data); + udu->data = NULL; + break; + } case GST_H264_SEI_UNHANDLED_PAYLOAD:{ GstH264SEIUnhandledPayload *payload = &sei->payload.unhandled_payload; @@ -3410,3 +3463,229 @@ return gst_h264_parser_insert_sei_internal (nalparser, nal_length_size, TRUE, au, sei); } + +static GstH264DecoderConfigRecord * +gst_h264_decoder_config_record_new (void) +{ + GstH264DecoderConfigRecord *config; + + config = g_new0 (GstH264DecoderConfigRecord, 1); + config->sps = g_array_new (FALSE, FALSE, sizeof (GstH264NalUnit)); + config->pps = g_array_new (FALSE, FALSE, sizeof (GstH264NalUnit)); + config->sps_ext = g_array_new (FALSE, FALSE, sizeof (GstH264NalUnit)); + + return config; +} + +/** + * gst_h264_decoder_config_record_free: + * @config: (nullable): a #GstH264DecoderConfigRecord data + * + * Free @config data + * + * Since: 1.22 + */ +void +gst_h264_decoder_config_record_free (GstH264DecoderConfigRecord * config) +{ + if (!config) + return; + + if (config->sps) + g_array_unref (config->sps); + + if (config->pps) + g_array_unref (config->pps); + + if (config->sps_ext) + g_array_unref (config->sps_ext); + + g_free (config); +} + +/** + * gst_h264_parser_parse_decoder_config_record: + * @nalparser: a #GstH264NalParser + * @data: the data to parse + * @size: the size of @data + * @config: (out): parsed #GstH264DecoderConfigRecord data + * + * Parses AVCDecoderConfigurationRecord data and fill into @config. + * The caller must free @config via gst_h264_decoder_config_record_free() + * + * This method does not parse SPS and PPS and therefore the caller needs to + * parse each NAL unit via appropriate parsing method. + * + * Returns: a #GstH264ParserResult + * + * Since: 1.22 + */ +GstH264ParserResult +gst_h264_parser_parse_decoder_config_record (GstH264NalParser * nalparser, + const guint8 * data, gsize size, GstH264DecoderConfigRecord ** config) +{ + GstH264DecoderConfigRecord *ret; + GstBitReader br; + GstH264ParserResult result = GST_H264_PARSER_OK; + guint8 num_sps, num_pps, i; + guint offset; + + g_return_val_if_fail (nalparser != NULL, GST_H264_PARSER_ERROR); + g_return_val_if_fail (data != NULL, GST_H264_PARSER_ERROR); + g_return_val_if_fail (config != NULL, GST_H264_PARSER_ERROR); + +#define READ_CONFIG_UINT8(val, nbits) G_STMT_START { \ + if (!gst_bit_reader_get_bits_uint8 (&br, &val, nbits)) { \ + GST_WARNING ("Failed to read " G_STRINGIFY (val)); \ + result = GST_H264_PARSER_ERROR; \ + goto error; \ + } \ +} G_STMT_END; + +#define SKIP_CONFIG_BITS(nbits) G_STMT_START { \ + if (!gst_bit_reader_skip (&br, nbits)) { \ + GST_WARNING ("Failed to skip %d bits", nbits); \ + result = GST_H264_PARSER_ERROR; \ + goto error; \ + } \ +} G_STMT_END; + + *config = NULL; + + if (size < 7) { + GST_WARNING ("Too small size avcC"); + return GST_H264_PARSER_ERROR; + } + + gst_bit_reader_init (&br, data, size); + + ret = gst_h264_decoder_config_record_new (); + + READ_CONFIG_UINT8 (ret->configuration_version, 8); + /* Keep parsing, caller can decide whether this data needs to be discarded + * or not */ + if (ret->configuration_version != 1) { + GST_WARNING ("Wrong configurationVersion %d", ret->configuration_version); + result = GST_H264_PARSER_ERROR; + goto error; + } + + READ_CONFIG_UINT8 (ret->profile_indication, 8); + READ_CONFIG_UINT8 (ret->profile_compatibility, 8); + READ_CONFIG_UINT8 (ret->level_indication, 8); + /* reserved 6bits */ + SKIP_CONFIG_BITS (6); + READ_CONFIG_UINT8 (ret->length_size_minus_one, 2); + if (ret->length_size_minus_one == 2) { + /* "length_size_minus_one + 1" should be 1, 2, or 4 */ + GST_WARNING ("Wrong nal-length-size"); + result = GST_H264_PARSER_ERROR; + goto error; + } + + /* reserved 3bits */ + SKIP_CONFIG_BITS (3); + + READ_CONFIG_UINT8 (num_sps, 5); + offset = gst_bit_reader_get_pos (&br); + + g_assert (offset % 8 == 0); + offset /= 8; + for (i = 0; i < num_sps; i++) { + GstH264NalUnit nalu; + + result = gst_h264_parser_identify_nalu_avc (nalparser, + data, offset, size, 2, &nalu); + if (result != GST_H264_PARSER_OK) + goto error; + + g_array_append_val (ret->sps, nalu); + offset = nalu.offset + nalu.size; + } + + if (!gst_bit_reader_set_pos (&br, offset * 8)) { + result = GST_H264_PARSER_ERROR; + goto error; + } + + READ_CONFIG_UINT8 (num_pps, 8); + offset = gst_bit_reader_get_pos (&br); + + g_assert (offset % 8 == 0); + offset /= 8; + for (i = 0; i < num_pps; i++) { + GstH264NalUnit nalu; + + result = gst_h264_parser_identify_nalu_avc (nalparser, + data, offset, size, 2, &nalu); + if (result != GST_H264_PARSER_OK) + goto error; + + g_array_append_val (ret->pps, nalu); + offset = nalu.offset + nalu.size; + } + + /* Parse chroma format and SPS ext data. We will silently ignore any + * error while parsing below data since it's not essential data for + * decoding */ + if (ret->profile_indication == 100 || ret->profile_indication == 110 || + ret->profile_indication == 122 || ret->profile_indication == 144) { + guint8 num_sps_ext; + + if (!gst_bit_reader_set_pos (&br, offset * 8)) + goto out; + + if (!gst_bit_reader_skip (&br, 6)) + goto out; + + if (!gst_bit_reader_get_bits_uint8 (&br, &ret->chroma_format, 2)) + goto out; + + if (!gst_bit_reader_skip (&br, 5)) + goto out; + + if (!gst_bit_reader_get_bits_uint8 (&br, &ret->bit_depth_luma_minus8, 3)) + goto out; + + if (!gst_bit_reader_skip (&br, 5)) + goto out; + + if (!gst_bit_reader_get_bits_uint8 (&br, &ret->bit_depth_chroma_minus8, 3)) + goto out; + + if (!gst_bit_reader_get_bits_uint8 (&br, &num_sps_ext, 8)) + goto out; + + offset = gst_bit_reader_get_pos (&br); + + g_assert (offset % 8 == 0); + offset /= 8; + for (i = 0; i < num_sps_ext; i++) { + GstH264NalUnit nalu; + + result = gst_h264_parser_identify_nalu_avc (nalparser, + data, offset, size, 2, &nalu); + if (result != GST_H264_PARSER_OK) + goto out; + + g_array_append_val (ret->sps_ext, nalu); + offset = nalu.offset + nalu.size; + } + + ret->chroma_format_present = TRUE; + } + +out: + { + *config = ret; + return GST_H264_PARSER_OK; + } +error: + { + gst_h264_decoder_config_record_free (ret); + return result; + } + +#undef READ_CONFIG_UINT8 +#undef SKIP_CONFIG_BITS +}
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecparsers/gsth264parser.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gsth264parser.h
Changed
@@ -218,7 +218,8 @@ * @GST_H264_FRAME_PACKING_COLUMN_INTERLEAVING: Column based interleaving * @GST_H264_FRAME_PACKING_ROW_INTERLEAVING: Row based interleaving * @GST_H264_FRAME_PACKING_SIDE_BY_SIDE: Side-by-side packing - * @GST_H264_FRMAE_PACKING_TOP_BOTTOM: Top-Bottom packing + * @GST_H264_FRMAE_PACKING_TOP_BOTTOM: Deprecated; use GST_H264_FRAME_PACKING_TOP_BOTTOM instead + * @GST_H264_FRAME_PACKING_TOP_BOTTOM: Top-Bottom packing (Since: 1.22) * @GST_H264_FRAME_PACKING_TEMPORAL_INTERLEAVING: Temporal interleaving * * Frame packing arrangement types. @@ -233,6 +234,15 @@ GST_H264_FRAME_PACKING_ROW_INTERLEAVING = 2, GST_H264_FRAME_PACKING_SIDE_BY_SIDE = 3, GST_H264_FRMAE_PACKING_TOP_BOTTOM = 4, + + /** + * GST_H264_FRAME_PACKING_TOP_BOTTOM: + * + * Top-Bottom packing + * + * Since: 1.22 + */ + GST_H264_FRAME_PACKING_TOP_BOTTOM = 4, GST_H264_FRAME_PACKING_TEMPORAL_INTERLEAVING = 5 } GstH264FramePackingType; @@ -253,11 +263,20 @@ * * The type of SEI message. */ +/** + * GST_H264_SEI_USER_DATA_UNREGISTERED: + * + * User Data Unregistered (D.2.6) + * + * Since: 1.22 + */ + typedef enum { GST_H264_SEI_BUF_PERIOD = 0, GST_H264_SEI_PIC_TIMING = 1, GST_H264_SEI_REGISTERED_USER_DATA = 4, + GST_H264_SEI_USER_DATA_UNREGISTERED = 5, GST_H264_SEI_RECOVERY_POINT = 6, GST_H264_SEI_STEREO_VIDEO_INFO = 21, GST_H264_SEI_FRAME_PACKING = 45, @@ -357,6 +376,7 @@ typedef struct _GstH264ClockTimestamp GstH264ClockTimestamp; typedef struct _GstH264PicTiming GstH264PicTiming; typedef struct _GstH264RegisteredUserData GstH264RegisteredUserData; +typedef struct _GstH264UserDataUnregistered GstH264UserDataUnregistered; typedef struct _GstH264BufferingPeriod GstH264BufferingPeriod; typedef struct _GstH264RecoveryPoint GstH264RecoveryPoint; typedef struct _GstH264StereoVideoInfo GstH264StereoVideoInfo; @@ -365,6 +385,7 @@ typedef struct _GstH264ContentLightLevel GstH264ContentLightLevel; typedef struct _GstH264SEIUnhandledPayload GstH264SEIUnhandledPayload; typedef struct _GstH264SEIMessage GstH264SEIMessage; +typedef struct _GstH264DecoderConfigRecord GstH264DecoderConfigRecord; /** * GstH264NalUnitExtensionMVC: @@ -1111,6 +1132,23 @@ guint size; }; +/** + * GstH264UserDataUnregistered: + * @uuid: an uuid_iso_iec_11578. + * @data: the data of user_data_payload_byte + * @size: the size of @data in bytes + * + * The User data unregistered SEI message syntax. + * + * Since: 1.22 + */ +struct _GstH264UserDataUnregistered +{ + guint8 uuid16; + const guint8 *data; + guint size; +}; + struct _GstH264BufferingPeriod { GstH264SPS *sps; @@ -1185,6 +1223,13 @@ guint size; }; +/** + * _GstH264SEIMessage.payload.user_data_unregistered: + * + * User Data Unregistered + * + * Since: 1.22 + */ struct _GstH264SEIMessage { GstH264SEIPayloadType payloadType; @@ -1199,11 +1244,112 @@ GstH264MasteringDisplayColourVolume mastering_display_colour_volume; GstH264ContentLightLevel content_light_level; GstH264SEIUnhandledPayload unhandled_payload; + GstH264UserDataUnregistered user_data_unregistered; /* ... could implement more */ } payload; }; /** + * GstH264DecoderConfigRecord: + * + * Contains AVCDecoderConfigurationRecord data as defined in ISO/IEC 14496-15 + * + * Since: 1.22 + */ +struct _GstH264DecoderConfigRecord +{ + /** + * GstH264DecoderConfigRecord.configuration_version: + * + * Indicates configurationVersion, must be 1 + */ + guint8 configuration_version; + + /** + * GstH264DecoderConfigRecord.profile_indication: + * + * H.264 profile indication + */ + guint8 profile_indication; + + /** + * GstH264DecoderConfigRecord.profile_compatibility: + * + * H.264 profile compatibility + */ + guint8 profile_compatibility; + + /** + * GstH264DecoderConfigRecord.level_indication: + * + * H.264 level indiction + */ + guint8 level_indication; + + /** + * GstH264DecoderConfigRecord.length_size_minus_one: + * + * Indicates the length in bytes of the NAL unit length field + */ + guint8 length_size_minus_one; + + /** + * GstH264DecoderConfigRecord.sps + * + * Array of identified #GstH264NalUnit from sequenceParameterSetNALUnit. + * This array may contain non-SPS nal units such as SEI message + */ + GArray *sps; + + /** + * GstH264DecoderConfigRecord.pps + * + * Array of identified #GstH264NalUnit from pictureParameterSetNALUnit. + * This array may contain non-PPS nal units such as SEI message + */ + GArray *pps; + + /** + * GstH264DecoderConfigRecord.chroma_format_present + * + * %TRUE if chroma information is present. Otherwise below values + * have no meaning + */ + gboolean chroma_format_present; + + /** + * GstH264DecoderConfigRecord.chroma_format + * + * chroma_format_idc defined in ISO/IEC 14496-10 + */ + guint8 chroma_format; + + /** + * GstH264DecoderConfigRecord.bit_depth_luma_minus8 + * + * Indicates bit depth of luma component + */ + guint8 bit_depth_luma_minus8; + + /** + * GstH264DecoderConfigRecord.bit_depth_chroma_minus8 + * + * Indicates bit depth of chroma component + */ + guint8 bit_depth_chroma_minus8; + + /** + * GstH264DecoderConfigRecord.sps_ext + * + * Array of identified #GstH264NalUnit from sequenceParameterSetExtNALUnit. + */ + GArray *sps_ext; + + /*< private >*/ + gpointer _gst_reservedGST_PADDING; +}; + +/** * GstH264NalParser: * * H264 NAL Parser (opaque structure). @@ -1331,6 +1477,15 @@ GstBuffer * au, GstMemory * sei); +GST_CODEC_PARSERS_API +void gst_h264_decoder_config_record_free (GstH264DecoderConfigRecord * config); + +GST_CODEC_PARSERS_API +GstH264ParserResult gst_h264_parser_parse_decoder_config_record (GstH264NalParser * nalparser, + const guint8 * data, + gsize size, + GstH264DecoderConfigRecord ** config); + G_END_DECLS #endif
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gsth265bitwriter.c
Added
@@ -0,0 +1,2307 @@ +/* GStreamer + * Copyright (C) 2021 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the0 + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gsth265bitwriter.h" +#include <gst/codecparsers/nalutils.h> +#include <gst/base/gstbitwriter.h> +#include <math.h> + +/******************************** Utils ********************************/ +#define SIGNED(val) (2 * ABS(val) - ((val) > 0)) + +/* Write an unsigned integer Exp-Golomb-coded syntax element. i.e. ue(v) */ +static gboolean +_bs_write_ue (GstBitWriter * bs, guint32 value) +{ + guint32 size_in_bits = 0; + guint32 tmp_value = ++value; + + while (tmp_value) { + ++size_in_bits; + tmp_value >>= 1; + } + if (size_in_bits > 1 + && !gst_bit_writer_put_bits_uint32 (bs, 0, size_in_bits - 1)) + return FALSE; + if (!gst_bit_writer_put_bits_uint32 (bs, value, size_in_bits)) + return FALSE; + return TRUE; +} + +#define WRITE_BITS_UNCHECK(bw, val, nbits) \ + (nbits <= 8 ? gst_bit_writer_put_bits_uint8 (bw, val, nbits) : \ + (nbits <= 16 ? gst_bit_writer_put_bits_uint16 (bw, val, nbits) : \ + (nbits <= 32 ? gst_bit_writer_put_bits_uint32 (bw, val, nbits) : \ + FALSE))) + +#define WRITE_BITS(bw, val, nbits) \ + if (!WRITE_BITS_UNCHECK (bw, val, nbits)) { \ + g_warning ("Unsupported bit size: %u", nbits); \ + have_space = FALSE; \ + goto error; \ + } + +#define WRITE_UE_UNCHECK(bw, val) _bs_write_ue (bw, val) + +#ifdef WRITE_UE +#undef WRITE_UE +#endif +#define WRITE_UE(bw, val) \ + if (!(have_space = WRITE_UE_UNCHECK (bw, val))) \ + goto error; \ + +#define WRITE_UE_MAX(bw, val, max) \ + if ((guint32) val > (max) || !(have_space = WRITE_UE_UNCHECK (bw, val))) \ + goto error; + +#define WRITE_SE(bw, val) WRITE_UE (bw, SIGNED (val)) + +#define WRITE_SE_RANGE(bw, val, min, max) \ + if (val > max || val < min || \ + !(have_space = WRITE_UE_UNCHECK (bw, SIGNED (val)))) \ + goto error; + +#define WRITE_BYTES_UNCHECK(bw, ptr, nbytes) \ + gst_bit_writer_put_bytes(bw, ptr, nbytes) + +#ifdef WRITE_BYTES +#undef WRITE_BYTES +#endif +#define WRITE_BYTES(bw, ptr, nbytes) \ + if (!(have_space = WRITE_BYTES_UNCHECK (bw, ptr, nbytes))) \ + goto error; + +/***************************** End of Utils ****************************/ + +#define EXTENDED_SAR 255 + +/**** Default scaling_lists according to Table 7-5 and 7-6 *****/ +/* Table 7-5 */ +static const guint8 default_scaling_list016 = { + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16 +}; + +/* Combined the values in Table 7-6 to make the calculation easier + * Default scaling list of 8x8 and 16x16 matrices for matrixId = 0, 1 and 2 + * Default scaling list of 32x32 matrix for matrixId = 0 + */ +static const guint8 default_scaling_list164 = { + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 16, + 17, 16, 17, 18, 17, 18, 18, 17, 18, 21, 19, 20, + 21, 20, 19, 21, 24, 22, 22, 24, 24, 22, 22, 24, + 25, 25, 27, 30, 27, 25, 25, 29, 31, 35, 35, 31, + 29, 36, 41, 44, 41, 36, 47, 54, 54, 47, 65, 70, + 65, 88, 88, 115 +}; + +/* Combined the values in Table 7-6 to make the calculation easier + * Default scaling list of 8x8 and 16x16 matrices for matrixId = 3, 4 and 5 + * Default scaling list of 32x32 matrix for matrixId = 1 + */ +static const guint8 default_scaling_list264 = { + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, + 17, 17, 17, 18, 18, 18, 18, 18, 18, 20, 20, 20, + 20, 20, 20, 20, 24, 24, 24, 24, 24, 24, 24, 24, + 25, 25, 25, 25, 25, 25, 25, 28, 28, 28, 28, 28, + 28, 33, 33, 33, 33, 33, 41, 41, 41, 41, 54, 54, + 54, 71, 71, 91 +}; + +static gboolean +_h265_bit_writer_profile_tier_level (const GstH265ProfileTierLevel * ptl, + guint8 maxNumSubLayersMinus1, GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + guint i, j; + + GST_DEBUG ("writing profile_tier_level"); + + WRITE_BITS (bw, ptl->profile_space, 2); + WRITE_BITS (bw, ptl->tier_flag, 1); + WRITE_BITS (bw, ptl->profile_idc, 5); + + for (j = 0; j < 32; j++) + WRITE_BITS (bw, ptl->profile_compatibility_flagj, 1); + + WRITE_BITS (bw, ptl->progressive_source_flag, 1); + WRITE_BITS (bw, ptl->interlaced_source_flag, 1); + WRITE_BITS (bw, ptl->non_packed_constraint_flag, 1); + WRITE_BITS (bw, ptl->frame_only_constraint_flag, 1); + + if (ptl->profile_idc == 4 || ptl->profile_compatibility_flag4 || + ptl->profile_idc == 5 || ptl->profile_compatibility_flag5 || + ptl->profile_idc == 6 || ptl->profile_compatibility_flag6 || + ptl->profile_idc == 7 || ptl->profile_compatibility_flag7 || + ptl->profile_idc == 8 || ptl->profile_compatibility_flag8 || + ptl->profile_idc == 9 || ptl->profile_compatibility_flag9 || + ptl->profile_idc == 10 || ptl->profile_compatibility_flag10 || + ptl->profile_idc == 11 || ptl->profile_compatibility_flag11) { + WRITE_BITS (bw, ptl->max_12bit_constraint_flag, 1); + WRITE_BITS (bw, ptl->max_10bit_constraint_flag, 1); + WRITE_BITS (bw, ptl->max_8bit_constraint_flag, 1); + WRITE_BITS (bw, ptl->max_422chroma_constraint_flag, 1); + WRITE_BITS (bw, ptl->max_420chroma_constraint_flag, 1); + WRITE_BITS (bw, ptl->max_monochrome_constraint_flag, 1); + WRITE_BITS (bw, ptl->intra_constraint_flag, 1); + WRITE_BITS (bw, ptl->one_picture_only_constraint_flag, 1); + WRITE_BITS (bw, ptl->lower_bit_rate_constraint_flag, 1); + + if (ptl->profile_idc == 5 || ptl->profile_compatibility_flag5 || + ptl->profile_idc == 9 || ptl->profile_compatibility_flag9 || + ptl->profile_idc == 10 || ptl->profile_compatibility_flag10 || + ptl->profile_idc == 11 || ptl->profile_compatibility_flag11) { + WRITE_BITS (bw, ptl->max_14bit_constraint_flag, 1); + /* general_reserved_zero_33bits */ + WRITE_BITS (bw, 0, 32); + WRITE_BITS (bw, 0, 1); + } else { + /* general_reserved_zero_34bits */ + WRITE_BITS (bw, 0, 32); + WRITE_BITS (bw, 0, 2); + } + } else if (ptl->profile_idc == 2 || ptl->profile_compatibility_flag2) { + /* general_reserved_zero_7bits */ + WRITE_BITS (bw, 0, 7); + WRITE_BITS (bw, ptl->one_picture_only_constraint_flag, 1); + /* general_reserved_zero_35bits */ + WRITE_BITS (bw, 0, 32); + WRITE_BITS (bw, 0, 3); + } else { + /* general_reserved_zero_43bits */ + WRITE_BITS (bw, 0, 32); + WRITE_BITS (bw, 0, 11); + } + + /* general_inbld_flag, just set to 0 */ + WRITE_BITS (bw, 0, 1); + + WRITE_BITS (bw, ptl->level_idc, 8); + + for (j = 0; j < maxNumSubLayersMinus1; j++) { + if (ptl->sub_layer_profile_present_flagj) { + GST_WARNING ("sub layer profile does not supported now"); + goto error; + } + WRITE_BITS (bw, ptl->sub_layer_profile_present_flagj, 1); + + if (ptl->sub_layer_level_present_flagj) { + GST_WARNING ("sub layer level does not supported now"); + goto error; + } + WRITE_BITS (bw, ptl->sub_layer_level_present_flagj, 1); + } + + if (maxNumSubLayersMinus1 > 0) { + for (i = maxNumSubLayersMinus1; i < 8; i++) + /* reserved_zero_2bits */ + WRITE_BITS (bw, 0, 2); + } + + /* TODO: Add sub layers profiles. */ + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write profile_tier_level"); + + *space = have_space; + return FALSE; +} + +static gboolean +_h265_bit_writer_sub_layer_hrd_parameters (const GstH265SubLayerHRDParams * + sub_hrd, guint8 CpbCnt, guint8 sub_pic_hrd_params_present_flag, + GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + guint i; + + GST_DEBUG ("writing \"subLayer HRD Parameters\""); + + for (i = 0; i <= CpbCnt; i++) { + WRITE_UE_MAX (bw, sub_hrd->bit_rate_value_minus1i, G_MAXUINT32 - 1); + WRITE_UE_MAX (bw, sub_hrd->cpb_size_value_minus1i, G_MAXUINT32 - 1); + + if (sub_pic_hrd_params_present_flag) { + WRITE_UE_MAX (bw, sub_hrd->cpb_size_du_value_minus1i, G_MAXUINT32 - 1); + WRITE_UE_MAX (bw, sub_hrd->bit_rate_du_value_minus1i, G_MAXUINT32 - 1); + } + + WRITE_BITS (bw, sub_hrd->cbr_flagi, 1); + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write \"subLayer HRD Parameters \""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h265_bit_writer_hrd_parameters (const GstH265HRDParams * hrd, + guint8 commonInfPresentFlag, guint8 maxNumSubLayersMinus1, + GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + guint i; + + GST_DEBUG ("writing \"HRD Parameters\""); + + if (commonInfPresentFlag) { + WRITE_BITS (bw, hrd->nal_hrd_parameters_present_flag, 1); + WRITE_BITS (bw, hrd->vcl_hrd_parameters_present_flag, 1); + + if (hrd->nal_hrd_parameters_present_flag + || hrd->vcl_hrd_parameters_present_flag) { + WRITE_BITS (bw, hrd->sub_pic_hrd_params_present_flag, 1); + + if (hrd->sub_pic_hrd_params_present_flag) { + WRITE_BITS (bw, hrd->tick_divisor_minus2, 8); + WRITE_BITS (bw, hrd->du_cpb_removal_delay_increment_length_minus1, 5); + WRITE_BITS (bw, hrd->sub_pic_cpb_params_in_pic_timing_sei_flag, 1); + WRITE_BITS (bw, hrd->dpb_output_delay_du_length_minus1, 5); + } + + WRITE_BITS (bw, hrd->bit_rate_scale, 4); + WRITE_BITS (bw, hrd->cpb_size_scale, 4); + + if (hrd->sub_pic_hrd_params_present_flag) + WRITE_BITS (bw, hrd->cpb_size_du_scale, 4); + + WRITE_BITS (bw, hrd->initial_cpb_removal_delay_length_minus1, 5); + WRITE_BITS (bw, hrd->au_cpb_removal_delay_length_minus1, 5); + WRITE_BITS (bw, hrd->dpb_output_delay_length_minus1, 5); + } + } + + for (i = 0; i <= maxNumSubLayersMinus1; i++) { + WRITE_BITS (bw, hrd->fixed_pic_rate_general_flagi, 1); + + if (!hrd->fixed_pic_rate_general_flagi) { + WRITE_BITS (bw, hrd->fixed_pic_rate_within_cvs_flagi, 1); + } else { + if (hrd->fixed_pic_rate_within_cvs_flagi == 0) + goto error; + } + + if (hrd->fixed_pic_rate_within_cvs_flagi) { + WRITE_UE_MAX (bw, hrd->elemental_duration_in_tc_minus1i, 2047); + } else { + WRITE_BITS (bw, hrd->low_delay_hrd_flagi, 1); + } + + if (!hrd->low_delay_hrd_flagi) + WRITE_UE_MAX (bw, hrd->cpb_cnt_minus1i, 31); + + if (hrd->nal_hrd_parameters_present_flag) + if (!_h265_bit_writer_sub_layer_hrd_parameters + (&hrd->sublayer_hrd_paramsi, hrd->cpb_cnt_minus1i, + hrd->sub_pic_hrd_params_present_flag, bw, &have_space)) + goto error; + + /* TODO: need to separate nal and vcl from hrd_parameters. */ + if (hrd->vcl_hrd_parameters_present_flag) + if (!_h265_bit_writer_sub_layer_hrd_parameters + (&hrd->sublayer_hrd_paramsi, hrd->cpb_cnt_minus1i, + hrd->sub_pic_hrd_params_present_flag, bw, &have_space)) + goto error; + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write \"HRD Parameters\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h265_bit_writer_vps (const GstH265VPS * vps, GstBitWriter * bw, + gboolean * space) +{ + gboolean have_space = TRUE; + guint i, j; + + GST_DEBUG ("writing VPS"); + + WRITE_BITS (bw, vps->id, 4); + + WRITE_BITS (bw, vps->base_layer_internal_flag, 1); + WRITE_BITS (bw, vps->base_layer_available_flag, 1); + + WRITE_BITS (bw, vps->max_layers_minus1, 6); + WRITE_BITS (bw, vps->max_sub_layers_minus1, 3); + WRITE_BITS (bw, vps->temporal_id_nesting_flag, 1); + + /* reserved_0xffff_16bits */ + WRITE_BITS (bw, 0xffff, 16); + + if (!_h265_bit_writer_profile_tier_level (&vps->profile_tier_level, + vps->max_sub_layers_minus1, bw, &have_space)) + goto error; + + WRITE_BITS (bw, vps->sub_layer_ordering_info_present_flag, 1); + + for (i = (vps->sub_layer_ordering_info_present_flag ? 0 : + vps->max_sub_layers_minus1); i <= vps->max_sub_layers_minus1; i++) { + WRITE_UE (bw, vps->max_dec_pic_buffering_minus1i); + WRITE_UE_MAX (bw, vps->max_num_reorder_picsi, + vps->max_dec_pic_buffering_minus1i); + WRITE_UE_MAX (bw, vps->max_latency_increase_plus1i, G_MAXUINT32 - 1); + } + + /* max_layer_id should be <63, but only support 1 layer now. */ + if (vps->max_layer_id > 1) { + GST_WARNING ("multi layers are not supported now"); + goto error; + } + + WRITE_BITS (bw, vps->max_layer_id, 6); + + if (vps->num_layer_sets_minus1 >= 1) { + GST_WARNING ("layer set is not supported now"); + goto error; + } + WRITE_UE_MAX (bw, vps->num_layer_sets_minus1, 1023); + + /* TODO: support multi-layer. */ + for (i = 1; i <= vps->num_layer_sets_minus1; i++) { + for (j = 0; j <= vps->max_layer_id; j++) { + /* layer_id_included_flagij */ + WRITE_BITS (bw, 0, 1); + } + } + + WRITE_BITS (bw, vps->timing_info_present_flag, 1); + if (vps->timing_info_present_flag) { + WRITE_BITS (bw, vps->num_units_in_tick, 32); + WRITE_BITS (bw, vps->time_scale, 32); + WRITE_BITS (bw, vps->poc_proportional_to_timing_flag, 1); + + if (vps->poc_proportional_to_timing_flag) + WRITE_UE_MAX (bw, vps->num_ticks_poc_diff_one_minus1, G_MAXUINT32 - 1); + + /* TODO: VPS can have multiple hrd parameters, and therefore hrd_params + * should be an array (like Garray). Just support 1 hdr parameter now. + */ + if (vps->num_hrd_parameters > 1) { + GST_WARNING ("HRD parameters > 1 is not supported now"); + goto error; + } + WRITE_UE_MAX (bw, vps->num_hrd_parameters, vps->num_layer_sets_minus1 + 1); + + if (vps->num_hrd_parameters) { + WRITE_UE_MAX (bw, vps->hrd_layer_set_idx, vps->num_layer_sets_minus1); + + if (!_h265_bit_writer_hrd_parameters (&vps->hrd_params, + vps->cprms_present_flag, vps->max_sub_layers_minus1, + bw, &have_space)) + goto error; + } + + } + + if (vps->vps_extension) { + GST_WARNING ("vps extension is not supported now"); + goto error; + } + WRITE_BITS (bw, 0, 1); + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("failed to write VPS"); + + *space = have_space; + return FALSE; +} + +/** + * gst_h265_bit_writer_vps: + * @vps: the vps of #GstH265VPS to write + * @start_code: whether adding the nal start code + * @data: (out): the bit stream generated by the sps + * @size: (inout): the size in bytes of the input and output + * + * Generating the according h265 bit stream by providing the vps. + * + * Returns: a #GstH265BitWriterResult + * + * Since: 1.22 + **/ +GstH265BitWriterResult +gst_h265_bit_writer_vps (const GstH265VPS * vps, gboolean start_code, + guint8 * data, guint * size) +{ + gboolean have_space = TRUE; + GstBitWriter bw; + + g_return_val_if_fail (vps != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (data != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (size != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (*size > 0, GST_H265_BIT_WRITER_ERROR); + + gst_bit_writer_init_with_data (&bw, data, *size, FALSE); + + if (start_code) + WRITE_BITS (&bw, 0x00000001, 32); + + /* NAL unit header */ + /* forbidden_zero_bit */ + WRITE_BITS (&bw, 0, 1); + /* nal_unit_type */ + WRITE_BITS (&bw, GST_H265_NAL_VPS, 6); + /* nuh_layer_id, only support 0 now */ + WRITE_BITS (&bw, 0, 6); + /* nuh_temporal_id_plus1, only support 1 now */ + WRITE_BITS (&bw, 1, 3); + + if (!_h265_bit_writer_vps (vps, &bw, &have_space)) + goto error; + + /* Add trailings. */ + WRITE_BITS (&bw, 1, 1); + if (!gst_bit_writer_align_bytes (&bw, 0)) { + have_space = FALSE; + goto error; + } + + *size = gst_bit_writer_get_size (&bw) / 8; + gst_bit_writer_reset (&bw); + + return GST_H265_BIT_WRITER_OK; + +error: + gst_bit_writer_reset (&bw); + *size = 0; + + if (!have_space) + return GST_H265_BIT_WRITER_NO_MORE_SPACE; + return GST_H265_BIT_WRITER_INVALID_DATA; +} + +static gboolean +_get_scaling_list_params (const GstH265ScalingList * dest_scaling_list, + guint8 sizeId, guint8 matrixId, const guint8 ** sl, guint8 * size, + gint16 * scaling_list_dc_coef_minus8) +{ + switch (sizeId) { + case GST_H265_QUANT_MATIX_4X4: + *sl = dest_scaling_list->scaling_lists_4x4matrixId; + if (size) + *size = 16; + break; + case GST_H265_QUANT_MATIX_8X8: + *sl = dest_scaling_list->scaling_lists_8x8matrixId; + if (size) + *size = 64; + break; + case GST_H265_QUANT_MATIX_16X16: + *sl = dest_scaling_list->scaling_lists_16x16matrixId; + if (size) + *size = 64; + if (scaling_list_dc_coef_minus8) + *scaling_list_dc_coef_minus8 = + dest_scaling_list->scaling_list_dc_coef_minus8_16x16matrixId; + break; + case GST_H265_QUANT_MATIX_32X32: + *sl = dest_scaling_list->scaling_lists_32x32matrixId; + if (size) + *size = 64; + if (scaling_list_dc_coef_minus8) + *scaling_list_dc_coef_minus8 = + dest_scaling_list->scaling_list_dc_coef_minus8_32x32matrixId; + break; + default: + g_assert_not_reached (); + return FALSE; + } + + return TRUE; +} + +static const guint8 * +_get_default_scaling_lists (GstH265QuantMatrixSize sizeId, guint8 matrixId) +{ + const guint8 *sl; + + switch (sizeId) { + case GST_H265_QUANT_MATIX_4X4: + sl = default_scaling_list0; + break; + + case GST_H265_QUANT_MATIX_8X8: + case GST_H265_QUANT_MATIX_16X16: + if (matrixId <= 2) { + sl = default_scaling_list1; + } else { + sl = default_scaling_list2; + } + break; + + case GST_H265_QUANT_MATIX_32X32: + if (matrixId == 0) { + sl = default_scaling_list1; + } else { + sl = default_scaling_list2; + } + break; + + default: + g_assert_not_reached (); + return NULL; + } + + return sl; +} + +static gboolean +_compare_scaling_list_matrix (GstH265QuantMatrixSize sizeId, + const guint8 * sl0, const guint8 * sl1, + gint16 dc_coef_minus8_0, gint16 dc_coef_minus8_1) +{ + guint size = sizeId == GST_H265_QUANT_MATIX_4X4 ? 16 : 64; + + if (memcmp (sl0, sl1, size * sizeof (guint8))) + return FALSE; + + if (sizeId <= GST_H265_QUANT_MATIX_8X8) + return TRUE; + + return dc_coef_minus8_0 == dc_coef_minus8_1; +} + +static gboolean +_h265_bit_writer_scaling_lists (const GstH265ScalingList * src_scaling_list, + GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + GstH265QuantMatrixSize sizeId; + guint8 matrixId; + guint8 scaling_list_pred_mode_flag = 0; + guint8 size, i, j; + + GST_DEBUG ("writing scaling lists"); + + for (sizeId = 0; sizeId <= GST_H265_QUANT_MATIX_32X32; sizeId++) { + for (matrixId = 0; + matrixId < ((sizeId == GST_H265_QUANT_MATIX_32X32) ? 2 : 6); + matrixId++) { + gint16 scaling_list_dc_coef_minus8 = 8; + const guint8 *sl; + const guint8 *default_sl; + guint8 nextCoef; + gint8 coef_val; + guint8 scaling_list_pred_matrix_id_delta; + + if (!_get_scaling_list_params (src_scaling_list, sizeId, matrixId, + &sl, &size, &scaling_list_dc_coef_minus8)) + goto error; + + /* Check whether it is the default matrix. */ + default_sl = _get_default_scaling_lists (sizeId, matrixId); + if (_compare_scaling_list_matrix (sizeId, sl, default_sl, + scaling_list_dc_coef_minus8, 8)) { + scaling_list_pred_mode_flag = 0; + WRITE_BITS (bw, scaling_list_pred_mode_flag, 1); + scaling_list_pred_matrix_id_delta = 0; + WRITE_UE_MAX (bw, scaling_list_pred_matrix_id_delta, matrixId); + continue; + } + + /* If some previous matrix is the same, just ref it. */ + scaling_list_pred_matrix_id_delta = 0; + for (j = 0; j < matrixId; j++) { + gboolean ret; + guint8 size2; + const guint8 *sl2; + gint16 scaling_list_dc_coef_minus8_2 = 8; + + ret = _get_scaling_list_params (src_scaling_list, sizeId, j, + &sl2, &size2, &scaling_list_dc_coef_minus8_2); + g_assert (ret); + g_assert (size == size2); + + if (_compare_scaling_list_matrix (sizeId, sl, sl2, + scaling_list_dc_coef_minus8, scaling_list_dc_coef_minus8_2)) { + scaling_list_pred_matrix_id_delta = matrixId - j; + break; + } + } + + if (scaling_list_pred_matrix_id_delta > 0) { + scaling_list_pred_mode_flag = 0; + WRITE_BITS (bw, scaling_list_pred_mode_flag, 1); + WRITE_UE_MAX (bw, scaling_list_pred_matrix_id_delta, matrixId); + continue; + } + + /* Just explicitly signal all matrix coef. */ + scaling_list_pred_mode_flag = 1; + WRITE_BITS (bw, scaling_list_pred_mode_flag, 1); + + nextCoef = 8; + + if (sizeId > 1) { + WRITE_SE_RANGE (bw, scaling_list_dc_coef_minus8, -7, 247); + nextCoef = scaling_list_dc_coef_minus8 + 8; + } + + for (i = 0; i < size; i++) { + coef_val = sli - nextCoef; + nextCoef = sli; + + if (coef_val > 127) { + coef_val = coef_val - 256; + } + if (coef_val < -128) { + coef_val = coef_val + 256; + } + + WRITE_SE_RANGE (bw, coef_val, -128, 127); + } + } + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write scaling lists"); + + *space = have_space; + return FALSE; +} + +static gboolean +_h265_bit_writer_short_term_ref_pic_set (const GstH265ShortTermRefPicSet * + stRPS, guint8 stRpsIdx, const GstH265SPS * sps, + GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + gint32 prev; + gint i = 0; + + GST_DEBUG ("writing \"ShortTermRefPicSetParameter\""); + + if (stRPS->inter_ref_pic_set_prediction_flag) { + /* TODO */ + GST_WARNING ("inter_ref_pic_set_prediction_flag mode not supported"); + goto error; + } + + if (stRpsIdx != 0) + WRITE_BITS (bw, stRPS->inter_ref_pic_set_prediction_flag, 1); + + if (stRPS->NumNegativePics + stRPS->NumPositivePics != stRPS->NumDeltaPocs) + goto error; + + /* 7-49 */ + WRITE_UE_MAX (bw, stRPS->NumNegativePics, + sps->max_dec_pic_buffering_minus1sps->max_sub_layers_minus1); + /* 7-50 */ + WRITE_UE_MAX (bw, stRPS->NumPositivePics, + (sps->max_dec_pic_buffering_minus1sps->max_sub_layers_minus1 - + stRPS->NumNegativePics)); + + prev = 0; + for (i = 0; i < stRPS->NumNegativePics; i++) { + WRITE_UE_MAX (bw, prev - stRPS->DeltaPocS0i - 1, 32767); + prev = stRPS->DeltaPocS0i; + /* 7-51 */ + WRITE_BITS (bw, stRPS->UsedByCurrPicS0i, 1); + } + + prev = 0; + for (i = 0; i < stRPS->NumPositivePics; i++) { + WRITE_UE_MAX (bw, stRPS->DeltaPocS1i - prev - 1, 32767); + prev = stRPS->DeltaPocS1i; + /* 7-52 */ + WRITE_BITS (bw, stRPS->UsedByCurrPicS1i, 1); + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write \"ShortTermRefPicSet Parameters\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h265_bit_writer_vui_parameters (const GstH265SPS * sps, + GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + const GstH265VUIParams *vui = &sps->vui_params; + + GST_DEBUG ("writing \"VUI Parameters\""); + + WRITE_BITS (bw, vui->aspect_ratio_info_present_flag, 1); + if (vui->aspect_ratio_info_present_flag) { + WRITE_BITS (bw, vui->aspect_ratio_idc, 8); + if (vui->aspect_ratio_idc == EXTENDED_SAR) { + WRITE_BITS (bw, vui->sar_width, 16); + WRITE_BITS (bw, vui->sar_height, 16); + } + } + + WRITE_BITS (bw, vui->overscan_info_present_flag, 1); + if (vui->overscan_info_present_flag) + WRITE_BITS (bw, vui->overscan_appropriate_flag, 1); + + WRITE_BITS (bw, vui->video_signal_type_present_flag, 1); + if (vui->video_signal_type_present_flag) { + WRITE_BITS (bw, vui->video_format, 3); + WRITE_BITS (bw, vui->video_full_range_flag, 1); + WRITE_BITS (bw, vui->colour_description_present_flag, 1); + if (vui->colour_description_present_flag) { + WRITE_BITS (bw, vui->colour_primaries, 8); + WRITE_BITS (bw, vui->transfer_characteristics, 8); + WRITE_BITS (bw, vui->matrix_coefficients, 8); + } + } + + WRITE_BITS (bw, vui->chroma_loc_info_present_flag, 1); + if (vui->chroma_loc_info_present_flag) { + WRITE_UE_MAX (bw, vui->chroma_sample_loc_type_top_field, 5); + WRITE_UE_MAX (bw, vui->chroma_sample_loc_type_bottom_field, 5); + } + + WRITE_BITS (bw, vui->neutral_chroma_indication_flag, 1); + WRITE_BITS (bw, vui->field_seq_flag, 1); + WRITE_BITS (bw, vui->frame_field_info_present_flag, 1); + + WRITE_BITS (bw, vui->default_display_window_flag, 1); + if (vui->default_display_window_flag) { + WRITE_UE (bw, vui->def_disp_win_left_offset); + WRITE_UE (bw, vui->def_disp_win_right_offset); + WRITE_UE (bw, vui->def_disp_win_top_offset); + WRITE_UE (bw, vui->def_disp_win_bottom_offset); + } + + WRITE_BITS (bw, vui->timing_info_present_flag, 1); + if (vui->timing_info_present_flag) { + if (vui->num_units_in_tick == 0) + GST_WARNING ("num_units_in_tick = 0 (incompliant to H.265 E.2.1)."); + WRITE_BITS (bw, vui->num_units_in_tick, 32); + + if (vui->time_scale == 0) + GST_WARNING ("time_scale = 0 (incompliant to H.265 E.2.1)."); + WRITE_BITS (bw, vui->time_scale, 32); + + WRITE_BITS (bw, vui->poc_proportional_to_timing_flag, 1); + if (vui->poc_proportional_to_timing_flag) + WRITE_UE_MAX (bw, vui->num_ticks_poc_diff_one_minus1, G_MAXUINT32 - 1); + + WRITE_BITS (bw, vui->hrd_parameters_present_flag, 1); + if (vui->hrd_parameters_present_flag) + if (!_h265_bit_writer_hrd_parameters (&vui->hrd_params, 1, + sps->max_sub_layers_minus1, bw, &have_space)) + goto error; + } + + WRITE_BITS (bw, vui->bitstream_restriction_flag, 1); + if (vui->bitstream_restriction_flag) { + WRITE_BITS (bw, vui->tiles_fixed_structure_flag, 1); + WRITE_BITS (bw, vui->motion_vectors_over_pic_boundaries_flag, 1); + WRITE_BITS (bw, vui->restricted_ref_pic_lists_flag, 1); + WRITE_UE_MAX (bw, vui->min_spatial_segmentation_idc, 4096); + WRITE_UE_MAX (bw, vui->max_bytes_per_pic_denom, 16); + WRITE_UE_MAX (bw, vui->max_bits_per_min_cu_denom, 16); + WRITE_UE_MAX (bw, vui->log2_max_mv_length_horizontal, 16); + WRITE_UE_MAX (bw, vui->log2_max_mv_length_vertical, 15); + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write \"VUI Parameters\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h265_bit_writer_sps (const GstH265SPS * sps, + GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + guint i; + + GST_DEBUG ("writing SPS"); + + WRITE_BITS (bw, sps->vps->id, 4); + + WRITE_BITS (bw, sps->max_sub_layers_minus1, 3); + WRITE_BITS (bw, sps->temporal_id_nesting_flag, 1); + + if (!_h265_bit_writer_profile_tier_level (&sps->profile_tier_level, + sps->max_sub_layers_minus1, bw, &have_space)) + goto error; + + WRITE_UE_MAX (bw, sps->id, GST_H265_MAX_SPS_COUNT - 1); + + WRITE_UE_MAX (bw, sps->chroma_format_idc, 3); + if (sps->chroma_format_idc == 3) + WRITE_BITS (bw, sps->separate_colour_plane_flag, 1); + + if (sps->pic_width_in_luma_samples < 1) + goto error; + WRITE_UE_MAX (bw, sps->pic_width_in_luma_samples, 16888); + + if (sps->pic_height_in_luma_samples < 1) + goto error; + WRITE_UE_MAX (bw, sps->pic_height_in_luma_samples, 16888); + + WRITE_BITS (bw, sps->conformance_window_flag, 1); + if (sps->conformance_window_flag) { + WRITE_UE (bw, sps->conf_win_left_offset); + WRITE_UE (bw, sps->conf_win_right_offset); + WRITE_UE (bw, sps->conf_win_top_offset); + WRITE_UE (bw, sps->conf_win_bottom_offset); + } + + WRITE_UE_MAX (bw, sps->bit_depth_luma_minus8, 6); + WRITE_UE_MAX (bw, sps->bit_depth_chroma_minus8, 6); + WRITE_UE_MAX (bw, sps->log2_max_pic_order_cnt_lsb_minus4, 12); + + WRITE_BITS (bw, sps->sub_layer_ordering_info_present_flag, 1); + for (i = (sps->sub_layer_ordering_info_present_flag ? 0 : + sps->max_sub_layers_minus1); i <= sps->max_sub_layers_minus1; i++) { + WRITE_UE_MAX (bw, sps->max_dec_pic_buffering_minus1i, 16); + WRITE_UE_MAX (bw, sps->max_num_reorder_picsi, + sps->max_dec_pic_buffering_minus1i); + WRITE_UE (bw, sps->max_latency_increase_plus1i); + } + + /* The limits are calculted based on the profile_tier_level constraint + * in Annex-A: CtbLog2SizeY = 4 to 6 */ + WRITE_UE_MAX (bw, sps->log2_min_luma_coding_block_size_minus3, 3); + WRITE_UE_MAX (bw, sps->log2_diff_max_min_luma_coding_block_size, 6); + WRITE_UE_MAX (bw, sps->log2_min_transform_block_size_minus2, 3); + WRITE_UE_MAX (bw, sps->log2_diff_max_min_transform_block_size, 3); + WRITE_UE_MAX (bw, sps->max_transform_hierarchy_depth_inter, 4); + WRITE_UE_MAX (bw, sps->max_transform_hierarchy_depth_intra, 4); + + WRITE_BITS (bw, sps->scaling_list_enabled_flag, 1); + if (sps->scaling_list_enabled_flag) { + WRITE_BITS (bw, sps->scaling_list_data_present_flag, 1); + + if (sps->scaling_list_data_present_flag) + if (!_h265_bit_writer_scaling_lists (&sps->scaling_list, bw, &have_space)) + goto error; + } + + WRITE_BITS (bw, sps->amp_enabled_flag, 1); + WRITE_BITS (bw, sps->sample_adaptive_offset_enabled_flag, 1); + WRITE_BITS (bw, sps->pcm_enabled_flag, 1); + + if (sps->pcm_enabled_flag) { + WRITE_BITS (bw, sps->pcm_sample_bit_depth_luma_minus1, 4); + WRITE_BITS (bw, sps->pcm_sample_bit_depth_chroma_minus1, 4); + WRITE_UE_MAX (bw, sps->log2_min_pcm_luma_coding_block_size_minus3, 2); + WRITE_UE_MAX (bw, sps->log2_diff_max_min_pcm_luma_coding_block_size, 2); + WRITE_BITS (bw, sps->pcm_loop_filter_disabled_flag, 1); + } + + WRITE_UE_MAX (bw, sps->num_short_term_ref_pic_sets, 64); + for (i = 0; i < sps->num_short_term_ref_pic_sets; i++) { + if (!_h265_bit_writer_short_term_ref_pic_set + (&sps->short_term_ref_pic_seti, i, sps, bw, &have_space)) + goto error; + } + + WRITE_BITS (bw, sps->long_term_ref_pics_present_flag, 1); + if (sps->long_term_ref_pics_present_flag) { + WRITE_UE_MAX (bw, sps->num_long_term_ref_pics_sps, 32); + for (i = 0; i < sps->num_long_term_ref_pics_sps; i++) { + WRITE_BITS (bw, sps->lt_ref_pic_poc_lsb_spsi, + sps->log2_max_pic_order_cnt_lsb_minus4 + 4); + WRITE_BITS (bw, sps->used_by_curr_pic_lt_sps_flagi, 1); + } + } + + WRITE_BITS (bw, sps->temporal_mvp_enabled_flag, 1); + WRITE_BITS (bw, sps->strong_intra_smoothing_enabled_flag, 1); + WRITE_BITS (bw, sps->vui_parameters_present_flag, 1); + + if (sps->vui_parameters_present_flag) { + if (!_h265_bit_writer_vui_parameters (sps, bw, &have_space)) + goto error; + } + + WRITE_BITS (bw, sps->sps_extension_flag, 1); + + if (sps->sps_extension_flag) { + WRITE_BITS (bw, sps->sps_range_extension_flag, 1); + WRITE_BITS (bw, sps->sps_multilayer_extension_flag, 1); + WRITE_BITS (bw, sps->sps_3d_extension_flag, 1); + WRITE_BITS (bw, sps->sps_scc_extension_flag, 1); + WRITE_BITS (bw, sps->sps_extension_4bits, 4); + } + + if (sps->sps_range_extension_flag) { + WRITE_BITS (bw, + sps->sps_extension_params.transform_skip_rotation_enabled_flag, 1); + WRITE_BITS (bw, + sps->sps_extension_params.transform_skip_context_enabled_flag, 1); + WRITE_BITS (bw, sps->sps_extension_params.implicit_rdpcm_enabled_flag, 1); + WRITE_BITS (bw, sps->sps_extension_params.explicit_rdpcm_enabled_flag, 1); + WRITE_BITS (bw, + sps->sps_extension_params.extended_precision_processing_flag, 1); + WRITE_BITS (bw, sps->sps_extension_params.intra_smoothing_disabled_flag, 1); + WRITE_BITS (bw, + sps->sps_extension_params.high_precision_offsets_enabled_flag, 1); + WRITE_BITS (bw, + sps->sps_extension_params.persistent_rice_adaptation_enabled_flag, 1); + WRITE_BITS (bw, + sps->sps_extension_params.cabac_bypass_alignment_enabled_flag, 1); + } + + if (sps->sps_multilayer_extension_flag) { + GST_WARNING ("do not support multilayer extension"); + goto error; + } + if (sps->sps_3d_extension_flag) { + GST_WARNING ("do not support 3d extension"); + goto error; + } + + if (sps->sps_scc_extension_flag) { + const GstH265SPSSccExtensionParams *scc_params = + &sps->sps_scc_extension_params; + + WRITE_BITS (bw, scc_params->sps_curr_pic_ref_enabled_flag, 1); + WRITE_BITS (bw, scc_params->palette_mode_enabled_flag, 1); + if (scc_params->palette_mode_enabled_flag) { + WRITE_UE_MAX (bw, scc_params->palette_max_size, 64); + WRITE_UE_MAX (bw, scc_params->delta_palette_max_predictor_size, + 128 - scc_params->palette_max_size); + + WRITE_BITS (bw, + scc_params->sps_palette_predictor_initializers_present_flag, 1); + if (scc_params->sps_palette_predictor_initializers_present_flag) { + guint comp; + WRITE_UE_MAX (bw, + scc_params->sps_num_palette_predictor_initializer_minus1, + scc_params->palette_max_size + + scc_params->delta_palette_max_predictor_size - 1); + + for (comp = 0; comp < (sps->chroma_format_idc == 0 ? 1 : 3); comp++) { + guint num_bits; + guint num = + scc_params->sps_num_palette_predictor_initializer_minus1 + 1; + + num_bits = (comp == 0 ? sps->bit_depth_luma_minus8 + 8 : + sps->bit_depth_chroma_minus8 + 8); + for (i = 0; i < num; i++) + WRITE_BITS (bw, + scc_params->sps_palette_predictor_initializercompi, + num_bits); + } + } + } + + WRITE_BITS (bw, scc_params->motion_vector_resolution_control_idc, 2); + WRITE_BITS (bw, scc_params->intra_boundary_filtering_disabled_flag, 1); + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("failed to write SPS"); + + *space = have_space; + return FALSE; +} + +/** + * gst_h265_bit_writer_sps: + * @sps: the sps of #GstH265SPS to write + * @start_code: whether adding the nal start code + * @data: (out): the bit stream generated by the sps + * @size: (inout): the size in bytes of the input and output + * + * Generating the according h265 bit stream by providing the sps. + * + * Returns: a #GstH265BitWriterResult + * + * Since: 1.22 + **/ +GstH265BitWriterResult +gst_h265_bit_writer_sps (const GstH265SPS * sps, gboolean start_code, + guint8 * data, guint * size) +{ + gboolean have_space = TRUE; + GstBitWriter bw; + + g_return_val_if_fail (sps != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (sps->vps != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (data != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (size != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (*size > 0, GST_H265_BIT_WRITER_ERROR); + + gst_bit_writer_init_with_data (&bw, data, *size, FALSE); + + if (start_code) + WRITE_BITS (&bw, 0x00000001, 32); + + /* NAL unit header */ + /* forbidden_zero_bit */ + WRITE_BITS (&bw, 0, 1); + /* nal_unit_type */ + WRITE_BITS (&bw, GST_H265_NAL_SPS, 6); + /* nuh_layer_id, only support 0 now */ + WRITE_BITS (&bw, 0, 6); + /* nuh_temporal_id_plus1, only support 1 now */ + WRITE_BITS (&bw, 1, 3); + + if (!_h265_bit_writer_sps (sps, &bw, &have_space)) + goto error; + + /* Add trailings. */ + WRITE_BITS (&bw, 1, 1); + if (!gst_bit_writer_align_bytes (&bw, 0)) { + have_space = FALSE; + goto error; + } + + *size = gst_bit_writer_get_size (&bw) / 8; + gst_bit_writer_reset (&bw); + + return GST_H265_BIT_WRITER_OK; + +error: + gst_bit_writer_reset (&bw); + *size = 0; + + if (!have_space) + return GST_H265_BIT_WRITER_NO_MORE_SPACE; + return GST_H265_BIT_WRITER_INVALID_DATA; +} + +static gboolean +_h265_bit_writer_pps (const GstH265PPS * pps, GstBitWriter * bw, + gboolean * space) +{ + gboolean have_space = TRUE; + + GST_DEBUG ("writing PPS"); + + WRITE_UE_MAX (bw, pps->id, GST_H265_MAX_PPS_COUNT - 1); + WRITE_UE_MAX (bw, pps->sps->id, GST_H265_MAX_SPS_COUNT - 1); + + WRITE_BITS (bw, pps->dependent_slice_segments_enabled_flag, 1); + WRITE_BITS (bw, pps->output_flag_present_flag, 1); + WRITE_BITS (bw, pps->num_extra_slice_header_bits, 3); + WRITE_BITS (bw, pps->sign_data_hiding_enabled_flag, 1); + WRITE_BITS (bw, pps->cabac_init_present_flag, 1); + + WRITE_UE_MAX (bw, pps->num_ref_idx_l0_default_active_minus1, 14); + WRITE_UE_MAX (bw, pps->num_ref_idx_l1_default_active_minus1, 14); + WRITE_SE_RANGE (bw, pps->init_qp_minus26, + -(26 + 6 * pps->sps->bit_depth_luma_minus8), 25); + + WRITE_BITS (bw, pps->constrained_intra_pred_flag, 1); + WRITE_BITS (bw, pps->transform_skip_enabled_flag, 1); + + WRITE_BITS (bw, pps->cu_qp_delta_enabled_flag, 1); + if (pps->cu_qp_delta_enabled_flag) + WRITE_UE_MAX (bw, pps->diff_cu_qp_delta_depth, + pps->sps->log2_diff_max_min_luma_coding_block_size); + + WRITE_SE_RANGE (bw, pps->cb_qp_offset, -12, 12); + WRITE_SE_RANGE (bw, pps->cr_qp_offset, -12, 12); + + WRITE_BITS (bw, pps->slice_chroma_qp_offsets_present_flag, 1); + WRITE_BITS (bw, pps->weighted_pred_flag, 1); + WRITE_BITS (bw, pps->weighted_bipred_flag, 1); + WRITE_BITS (bw, pps->transquant_bypass_enabled_flag, 1); + WRITE_BITS (bw, pps->tiles_enabled_flag, 1); + WRITE_BITS (bw, pps->entropy_coding_sync_enabled_flag, 1); + + if (pps->tiles_enabled_flag) { + if (pps->num_tile_columns_minus1 + 1 > + G_N_ELEMENTS (pps->column_width_minus1)) { + GST_WARNING ("Invalid \"num_tile_columns_minus1\" %d", + pps->num_tile_columns_minus1); + goto error; + } + + if (pps->num_tile_rows_minus1 + 1 > G_N_ELEMENTS (pps->row_height_minus1)) { + GST_WARNING ("Invalid \"num_tile_rows_minus1\" %d", + pps->num_tile_rows_minus1); + goto error; + } + + WRITE_UE_MAX (bw, pps->num_tile_columns_minus1, pps->PicWidthInCtbsY - 1); + WRITE_UE_MAX (bw, pps->num_tile_rows_minus1, pps->PicHeightInCtbsY - 1); + + WRITE_BITS (bw, pps->uniform_spacing_flag, 1); + + /* 6.5.1, 6-4, 6-5, 7.4.3.3.1 */ + if (!pps->uniform_spacing_flag) { + guint i; + + for (i = 0; i < pps->num_tile_columns_minus1; i++) + WRITE_UE (bw, pps->column_width_minus1i); + + for (i = 0; i < pps->num_tile_rows_minus1; i++) + WRITE_UE (bw, pps->row_height_minus1i); + } + WRITE_BITS (bw, pps->loop_filter_across_tiles_enabled_flag, 1); + } + + WRITE_BITS (bw, pps->loop_filter_across_slices_enabled_flag, 1); + + WRITE_BITS (bw, pps->deblocking_filter_control_present_flag, 1); + if (pps->deblocking_filter_control_present_flag) { + WRITE_BITS (bw, pps->deblocking_filter_override_enabled_flag, 1); + + WRITE_BITS (bw, pps->deblocking_filter_disabled_flag, 1); + if (!pps->deblocking_filter_disabled_flag) { + WRITE_SE_RANGE (bw, pps->beta_offset_div2, -6, 6); + WRITE_SE_RANGE (bw, pps->tc_offset_div2, -6, +6); + } + } + + WRITE_BITS (bw, pps->scaling_list_data_present_flag, 1); + if (pps->scaling_list_data_present_flag) + if (!_h265_bit_writer_scaling_lists (&pps->scaling_list, bw, &have_space)) + goto error; + + WRITE_BITS (bw, pps->lists_modification_present_flag, 1); + WRITE_UE_MAX (bw, pps->log2_parallel_merge_level_minus2, 4); + + /* TODO: slice_segment_header */ + if (pps->slice_segment_header_extension_present_flag) { + GST_WARNING + ("slice_segment_header_extension_present_flag is not supported"); + goto error; + } + WRITE_BITS (bw, pps->slice_segment_header_extension_present_flag, 1); + + WRITE_BITS (bw, pps->pps_extension_flag, 1); + + if (pps->pps_extension_flag) { + WRITE_BITS (bw, pps->pps_range_extension_flag, 1); + WRITE_BITS (bw, pps->pps_multilayer_extension_flag, 1); + WRITE_BITS (bw, pps->pps_3d_extension_flag, 1); + WRITE_BITS (bw, pps->pps_scc_extension_flag, 1); + WRITE_BITS (bw, pps->pps_extension_4bits, 4); + } + + if (pps->pps_range_extension_flag) { + guint i; + guint32 MaxBitDepthY, MaxBitDepthC; + + if (pps->transform_skip_enabled_flag) + WRITE_UE (bw, + pps->pps_extension_params.log2_max_transform_skip_block_size_minus2); + + WRITE_BITS (bw, + pps->pps_extension_params.cross_component_prediction_enabled_flag, 1); + WRITE_BITS (bw, + pps->pps_extension_params.chroma_qp_offset_list_enabled_flag, 1); + + if (pps->pps_extension_params.chroma_qp_offset_list_enabled_flag) { + WRITE_UE_MAX (bw, + pps->pps_extension_params.diff_cu_chroma_qp_offset_depth, + pps->sps->log2_diff_max_min_luma_coding_block_size); + + WRITE_UE_MAX (bw, + pps->pps_extension_params.chroma_qp_offset_list_len_minus1, 5); + for (i = 0; + i <= pps->pps_extension_params.chroma_qp_offset_list_len_minus1; + i++) { + WRITE_SE_RANGE (bw, pps->pps_extension_params.cb_qp_offset_listi, + -12, 12); + WRITE_SE_RANGE (bw, pps->pps_extension_params.cr_qp_offset_listi, + -12, 12); + } + } + + MaxBitDepthY = pps->sps->bit_depth_luma_minus8 > 2 ? + pps->sps->bit_depth_luma_minus8 - 2 : 0; + MaxBitDepthC = pps->sps->bit_depth_chroma_minus8 > 2 ? + pps->sps->bit_depth_chroma_minus8 - 2 : 0; + WRITE_UE_MAX (bw, pps->pps_extension_params.log2_sao_offset_scale_luma, + MaxBitDepthY); + WRITE_UE_MAX (bw, pps->pps_extension_params.log2_sao_offset_scale_chroma, + MaxBitDepthC); + } + + if (pps->pps_multilayer_extension_flag) { + GST_WARNING ("do not support multilayer extension"); + goto error; + } + + if (pps->pps_3d_extension_flag) { + GST_WARNING ("do not support 3d extension"); + goto error; + } + + if (pps->pps_scc_extension_flag) { + const GstH265PPSSccExtensionParams *pps_scc = + &pps->pps_scc_extension_params; + + WRITE_BITS (bw, pps_scc->pps_curr_pic_ref_enabled_flag, 1); + WRITE_BITS (bw, + pps_scc->residual_adaptive_colour_transform_enabled_flag, 1); + if (pps_scc->residual_adaptive_colour_transform_enabled_flag) { + WRITE_BITS (bw, pps_scc->pps_slice_act_qp_offsets_present_flag, 1); + WRITE_SE_RANGE (bw, (gint8) pps_scc->pps_act_y_qp_offset_plus5, -7, 17); + WRITE_SE_RANGE (bw, (gint8) pps_scc->pps_act_cb_qp_offset_plus5, -7, 17); + WRITE_SE_RANGE (bw, (gint8) pps_scc->pps_act_cr_qp_offset_plus3, -9, 15); + } + + WRITE_BITS (bw, + pps_scc->pps_palette_predictor_initializers_present_flag, 1); + if (pps_scc->pps_palette_predictor_initializers_present_flag) { + guint i; + + WRITE_UE_MAX (bw, + pps_scc->pps_num_palette_predictor_initializer, + pps->sps->sps_scc_extension_params.palette_max_size + + pps->sps->sps_scc_extension_params.delta_palette_max_predictor_size); + if (pps_scc->pps_num_palette_predictor_initializer > 0) { + guint comp; + + WRITE_BITS (bw, pps_scc->monochrome_palette_flag, 1); + /* It is a requirement of bitstream conformance that the value of + luma_bit_depth_entry_minus8 shall be equal to the value of + bit_depth_luma_minus8 */ + WRITE_UE_MAX (bw, pps_scc->luma_bit_depth_entry_minus8, + pps->sps->bit_depth_luma_minus8); + if (!pps_scc->monochrome_palette_flag) { + /* It is a requirement of bitstream conformance that the value + of chroma_bit_depth_entry_minus8 shall be equal to the value + of bit_depth_chroma_minus8. */ + WRITE_UE_MAX (bw, pps_scc->chroma_bit_depth_entry_minus8, + pps->sps->bit_depth_chroma_minus8); + } + + for (comp = 0; comp < (pps_scc->monochrome_palette_flag ? 1 : 3); + comp++) { + guint num_bits; + guint num = pps_scc->pps_num_palette_predictor_initializer; + + num_bits = (comp == 0 ? + pps_scc->luma_bit_depth_entry_minus8 + 8 : + pps_scc->chroma_bit_depth_entry_minus8 + 8); + for (i = 0; i < num; i++) + WRITE_BITS (bw, + pps_scc->pps_palette_predictor_initializercompi, num_bits); + } + } + } + } + + return TRUE; + +error: + GST_WARNING ("failed to write PPS"); + return FALSE; +} + +/** + * gst_h265_bit_writer_pps: + * @pps: the pps of #GstH265PPS to write + * @start_code: whether adding the nal start code + * @data: (out): the bit stream generated by the pps + * @size: (inout): the size in bytes of the input and output + * + * Generating the according h265 bit stream by providing the pps. + * + * Returns: a #GstH265BitWriterResult + * + * Since: 1.22 + **/ +GstH265BitWriterResult +gst_h265_bit_writer_pps (const GstH265PPS * pps, gboolean start_code, + guint8 * data, guint * size) +{ + gboolean have_space = TRUE; + GstBitWriter bw; + + g_return_val_if_fail (pps != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (pps->sps != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (data != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (size != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (*size > 0, GST_H265_BIT_WRITER_ERROR); + + gst_bit_writer_init_with_data (&bw, data, *size, FALSE); + + if (start_code) + WRITE_BITS (&bw, 0x00000001, 32); + + /* NAL unit header */ + /* forbidden_zero_bit */ + WRITE_BITS (&bw, 0, 1); + /* nal_unit_type */ + WRITE_BITS (&bw, GST_H265_NAL_PPS, 6); + /* nuh_layer_id, only support 0 now */ + WRITE_BITS (&bw, 0, 6); + /* nuh_temporal_id_plus1, only support 1 now */ + WRITE_BITS (&bw, 1, 3); + + if (!_h265_bit_writer_pps (pps, &bw, &have_space)) + goto error; + + /* Add trailings. */ + WRITE_BITS (&bw, 1, 1); + if (!gst_bit_writer_align_bytes (&bw, 0)) { + have_space = FALSE; + goto error; + } + + *size = gst_bit_writer_get_size (&bw) / 8; + gst_bit_writer_reset (&bw); + + return GST_H265_BIT_WRITER_OK; + +error: + gst_bit_writer_reset (&bw); + *size = 0; + + if (!have_space) + return GST_H265_BIT_WRITER_NO_MORE_SPACE; + return GST_H265_BIT_WRITER_INVALID_DATA; +} + +static gboolean +_h265_slice_bit_writer_ref_pic_list_modification (const GstH265SliceHdr * + slice, gint NumPocTotalCurr, GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + guint i; + const GstH265RefPicListModification *rpl_mod = + &slice->ref_pic_list_modification; + const guint n = ceil_log2 (NumPocTotalCurr); + + WRITE_BITS (bw, rpl_mod->ref_pic_list_modification_flag_l0, 1); + + if (rpl_mod->ref_pic_list_modification_flag_l0) { + for (i = 0; i <= slice->num_ref_idx_l0_active_minus1; i++) { + WRITE_BITS (bw, rpl_mod->list_entry_l0i, n); + } + } + + if (GST_H265_IS_B_SLICE (slice)) { + WRITE_BITS (bw, rpl_mod->ref_pic_list_modification_flag_l1, 1); + + if (rpl_mod->ref_pic_list_modification_flag_l1) + for (i = 0; i <= slice->num_ref_idx_l1_active_minus1; i++) { + WRITE_BITS (bw, rpl_mod->list_entry_l1i, n); + } + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write \"Reference picture list modifications\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h265_slice_bit_writer_pred_weight_table (const GstH265SliceHdr * slice, + GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + const GstH265PredWeightTable *p; + const GstH265PPS *pps = slice->pps; + const GstH265SPS *sps = pps->sps; + gint i, j; + + GST_DEBUG ("writing \"Prediction weight table\""); + + p = &slice->pred_weight_table; + + WRITE_UE_MAX (bw, p->luma_log2_weight_denom, 7); + + if (sps->chroma_format_idc != 0) { + WRITE_SE_RANGE (bw, p->delta_chroma_log2_weight_denom, + (0 - p->luma_log2_weight_denom), (7 - p->luma_log2_weight_denom)); + } + + for (i = 0; i <= slice->num_ref_idx_l0_active_minus1; i++) + WRITE_BITS (bw, p->luma_weight_l0_flagi, 1); + + if (sps->chroma_format_idc != 0) + for (i = 0; i <= slice->num_ref_idx_l0_active_minus1; i++) + WRITE_BITS (bw, p->chroma_weight_l0_flagi, 1); + + for (i = 0; i <= slice->num_ref_idx_l0_active_minus1; i++) { + if (p->luma_weight_l0_flagi) { + WRITE_SE_RANGE (bw, p->delta_luma_weight_l0i, -128, 127); + WRITE_SE_RANGE (bw, p->luma_offset_l0i, -128, 127); + } + if (p->chroma_weight_l0_flagi) + for (j = 0; j < 2; j++) { + WRITE_SE_RANGE (bw, p->delta_chroma_weight_l0ij, -128, 127); + WRITE_SE_RANGE (bw, p->delta_chroma_offset_l0ij, -512, 511); + } + } + + if (GST_H265_IS_B_SLICE (slice)) { + for (i = 0; i <= slice->num_ref_idx_l1_active_minus1; i++) + WRITE_BITS (bw, p->luma_weight_l1_flagi, 1); + + if (sps->chroma_format_idc != 0) + for (i = 0; i <= slice->num_ref_idx_l1_active_minus1; i++) + WRITE_BITS (bw, p->chroma_weight_l1_flagi, 1); + + for (i = 0; i <= slice->num_ref_idx_l1_active_minus1; i++) { + if (p->luma_weight_l1_flagi) { + WRITE_SE_RANGE (bw, p->delta_luma_weight_l1i, -128, 127); + WRITE_SE_RANGE (bw, p->luma_offset_l1i, -128, 127); + } + if (p->chroma_weight_l1_flagi) + for (j = 0; j < 2; j++) { + WRITE_SE_RANGE (bw, p->delta_chroma_weight_l1ij, -128, 127); + WRITE_SE_RANGE (bw, p->delta_chroma_offset_l1ij, -512, 511); + } + } + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write \"Prediction weight table\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h265_bit_writer_slice_header (const GstH265SliceHdr * slice, + guint32 nal_type, GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + guint i; + const GstH265SPS *sps = slice->pps->sps; + const GstH265PPSSccExtensionParams *pps_scc_extension_params = + &slice->pps->pps_scc_extension_params; + const GstH265PPSExtensionParams *pps_extension_params = + &slice->pps->pps_extension_params; + + GST_DEBUG ("writing slice header"); + + WRITE_BITS (bw, slice->first_slice_segment_in_pic_flag, 1); + + if (GST_H265_IS_NAL_TYPE_IRAP (nal_type)) + WRITE_BITS (bw, slice->no_output_of_prior_pics_flag, 1); + + WRITE_UE_MAX (bw, slice->pps->id, GST_H265_MAX_PPS_COUNT - 1); + + if (!slice->first_slice_segment_in_pic_flag) { + guint32 PicSizeInCtbsY; + guint32 PicWidthInCtbsY; + guint32 PicHeightInCtbsY; + guint32 CtbSizeY, MinCbLog2SizeY, CtbLog2SizeY; + guint n; + + /* We can not directly use slice->pps->PicWidthInCtbsY/PicHeightInCtbsY, + they are calculated value when parsing but may not have value here. */ + MinCbLog2SizeY = sps->log2_min_luma_coding_block_size_minus3 + 3; + CtbLog2SizeY = + MinCbLog2SizeY + sps->log2_diff_max_min_luma_coding_block_size; + CtbSizeY = 1 << CtbLog2SizeY; + PicHeightInCtbsY = + ceil ((gdouble) sps->pic_height_in_luma_samples / (gdouble) CtbSizeY); + PicWidthInCtbsY = + ceil ((gdouble) sps->pic_width_in_luma_samples / (gdouble) CtbSizeY); + PicSizeInCtbsY = PicWidthInCtbsY * PicHeightInCtbsY; + + n = ceil_log2 (PicSizeInCtbsY); + + if (slice->pps->dependent_slice_segments_enabled_flag) + WRITE_BITS (bw, slice->dependent_slice_segment_flag, 1); + /* sice_segment_address parsing */ + WRITE_BITS (bw, slice->segment_address, n); + } + + if (!slice->dependent_slice_segment_flag) { + for (i = 0; i < slice->pps->num_extra_slice_header_bits; i++) { + /* slice_reserved_flag */ + WRITE_BITS (bw, 0, 1); + } + + WRITE_UE_MAX (bw, slice->type, 63); + + if (slice->pps->output_flag_present_flag) + WRITE_BITS (bw, slice->pic_output_flag, 1); + + if (sps->separate_colour_plane_flag == 1) + WRITE_BITS (bw, slice->colour_plane_id, 2); + + if (!GST_H265_IS_NAL_TYPE_IDR (nal_type)) { + WRITE_BITS (bw, slice->pic_order_cnt_lsb, + (sps->log2_max_pic_order_cnt_lsb_minus4 + 4)); + + WRITE_BITS (bw, slice->short_term_ref_pic_set_sps_flag, 1); + if (!slice->short_term_ref_pic_set_sps_flag) { + if (!_h265_bit_writer_short_term_ref_pic_set + (&slice->short_term_ref_pic_sets, sps->num_short_term_ref_pic_sets, + slice->pps->sps, bw, &have_space)) + goto error; + } else if (sps->num_short_term_ref_pic_sets > 1) { + const guint n = ceil_log2 (sps->num_short_term_ref_pic_sets); + + if (slice->short_term_ref_pic_set_idx > + sps->num_short_term_ref_pic_sets - 1) + goto error; + + WRITE_BITS (bw, slice->short_term_ref_pic_set_idx, n); + } + + if (sps->long_term_ref_pics_present_flag) { + guint32 limit; + + if (sps->num_long_term_ref_pics_sps > 0) + WRITE_UE_MAX (bw, slice->num_long_term_sps, + sps->num_long_term_ref_pics_sps); + + WRITE_UE_MAX (bw, slice->num_long_term_pics, 16); + limit = slice->num_long_term_sps + slice->num_long_term_pics; + for (i = 0; i < limit; i++) { + if (i < slice->num_long_term_sps) { + if (sps->num_long_term_ref_pics_sps > 1) { + const guint n = ceil_log2 (sps->num_long_term_ref_pics_sps); + WRITE_BITS (bw, slice->lt_idx_spsi, n); + } + } else { + WRITE_BITS (bw, slice->poc_lsb_lti, + (sps->log2_max_pic_order_cnt_lsb_minus4 + 4)); + WRITE_BITS (bw, slice->used_by_curr_pic_lt_flagi, 1); + } + + WRITE_BITS (bw, slice->delta_poc_msb_present_flagi, 1); + if (slice->delta_poc_msb_present_flagi) + WRITE_UE (bw, slice->delta_poc_msb_cycle_lti); + } + } + + if (sps->temporal_mvp_enabled_flag) + WRITE_BITS (bw, slice->temporal_mvp_enabled_flag, 1); + } + + if (sps->sample_adaptive_offset_enabled_flag) { + gboolean ChromaArrayType = + sps->separate_colour_plane_flag == 0 ? sps->chroma_format_idc : 0; + + WRITE_BITS (bw, slice->sao_luma_flag, 1); + if (ChromaArrayType) + WRITE_BITS (bw, slice->sao_chroma_flag, 1); + } + + if (GST_H265_IS_B_SLICE (slice) || GST_H265_IS_P_SLICE (slice)) { + WRITE_BITS (bw, slice->num_ref_idx_active_override_flag, 1); + + if (slice->num_ref_idx_active_override_flag) { + WRITE_UE_MAX (bw, slice->num_ref_idx_l0_active_minus1, 14); + if (GST_H265_IS_B_SLICE (slice)) + WRITE_UE_MAX (bw, slice->num_ref_idx_l1_active_minus1, 14); + } + + if (slice->pps->lists_modification_present_flag + && slice->NumPocTotalCurr > 1) { + if (!_h265_slice_bit_writer_ref_pic_list_modification (slice, + slice->NumPocTotalCurr, bw, &have_space)) + goto error; + } + + if (GST_H265_IS_B_SLICE (slice)) + WRITE_BITS (bw, slice->mvd_l1_zero_flag, 1); + + if (slice->pps->cabac_init_present_flag) + WRITE_BITS (bw, slice->cabac_init_flag, 1); + + if (slice->temporal_mvp_enabled_flag) { + if (GST_H265_IS_B_SLICE (slice)) + WRITE_BITS (bw, slice->collocated_from_l0_flag, 1); + + if ((slice->collocated_from_l0_flag + && slice->num_ref_idx_l0_active_minus1 > 0) + || (!slice->collocated_from_l0_flag + && slice->num_ref_idx_l1_active_minus1 > 0)) { + if ((GST_H265_IS_P_SLICE (slice)) + || ((GST_H265_IS_B_SLICE (slice)) + && (slice->collocated_from_l0_flag))) { + WRITE_UE_MAX (bw, slice->collocated_ref_idx, + slice->num_ref_idx_l0_active_minus1); + } else if ((GST_H265_IS_B_SLICE (slice)) + && (!slice->collocated_from_l0_flag)) { + WRITE_UE_MAX (bw, slice->collocated_ref_idx, + slice->num_ref_idx_l1_active_minus1); + } + } + } + + if ((slice->pps->weighted_pred_flag && GST_H265_IS_P_SLICE (slice)) || + (slice->pps->weighted_bipred_flag && GST_H265_IS_B_SLICE (slice))) + if (!_h265_slice_bit_writer_pred_weight_table (slice, bw, &have_space)) + goto error; + + WRITE_UE_MAX (bw, slice->five_minus_max_num_merge_cand, 4); + + if (sps->sps_scc_extension_params.motion_vector_resolution_control_idc + == 2) + WRITE_BITS (bw, slice->use_integer_mv_flag, 1); + } + + WRITE_SE_RANGE (bw, slice->qp_delta, -87, 77); + if (slice->pps->slice_chroma_qp_offsets_present_flag) { + WRITE_SE_RANGE (bw, slice->cb_qp_offset, -12, 12); + WRITE_SE_RANGE (bw, slice->cr_qp_offset, -12, 12); + } + + if (pps_scc_extension_params->pps_slice_act_qp_offsets_present_flag) { + WRITE_SE_RANGE (bw, slice->slice_act_y_qp_offset, -12, 12); + WRITE_SE_RANGE (bw, slice->slice_act_cb_qp_offset, -12, 12); + WRITE_SE_RANGE (bw, slice->slice_act_cr_qp_offset, -12, 12); + } + + if (pps_extension_params->chroma_qp_offset_list_enabled_flag) + WRITE_BITS (bw, slice->cu_chroma_qp_offset_enabled_flag, 1); + + if (slice->pps->deblocking_filter_override_enabled_flag) + WRITE_BITS (bw, slice->deblocking_filter_override_flag, 1); + + if (slice->deblocking_filter_override_flag) { + WRITE_BITS (bw, slice->deblocking_filter_disabled_flag, 1); + + if (!slice->deblocking_filter_disabled_flag) { + WRITE_SE_RANGE (bw, slice->beta_offset_div2, -6, 6); + WRITE_SE_RANGE (bw, slice->tc_offset_div2, -6, 6); + } + } + + if (slice->pps->loop_filter_across_slices_enabled_flag && + (slice->sao_luma_flag || slice->sao_chroma_flag || + !slice->deblocking_filter_disabled_flag)) + WRITE_BITS (bw, slice->loop_filter_across_slices_enabled_flag, 1); + } + + if (slice->pps->tiles_enabled_flag + || slice->pps->entropy_coding_sync_enabled_flag) { + guint32 offset_max; + + if (!slice->pps->tiles_enabled_flag + && slice->pps->entropy_coding_sync_enabled_flag) { + offset_max = slice->pps->PicHeightInCtbsY - 1; + } else if (slice->pps->tiles_enabled_flag + && !slice->pps->entropy_coding_sync_enabled_flag) { + offset_max = + (slice->pps->num_tile_columns_minus1 + + 1) * (slice->pps->num_tile_rows_minus1 + 1) - 1; + } else { + offset_max = + (slice->pps->num_tile_columns_minus1 + + 1) * slice->pps->PicHeightInCtbsY - 1; + } + + WRITE_UE_MAX (bw, slice->num_entry_point_offsets, offset_max); + if (slice->num_entry_point_offsets > 0) { + WRITE_UE_MAX (bw, slice->offset_len_minus1, 31); + for (i = 0; i < slice->num_entry_point_offsets; i++) + WRITE_BITS (bw, slice->entry_point_offset_minus1i, + (slice->offset_len_minus1 + 1)); + } + } + + /* TODO */ + if (slice->pps->slice_segment_header_extension_present_flag) { + GST_WARNING + ("slice_segment_header_extension_present_flag is not supported"); + goto error; + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("error to write slice header"); + + *space = have_space; + return FALSE; +} + +/** + * gst_h265_bit_writer_slice_hdr: + * @slice: the slice header of #GstH265SliceHdr to write + * @start_code: whether adding the nal start code + * @nal_type: the slice's nal type of #GstH265NalUnitType + * @data: (out): the bit stream generated by the slice header + * @size: (inout): the size in bytes of the input and output + * + * Generating the according h265 bit stream by providing the slice header. + * + * Returns: a #GstH265BitWriterResult + * + * Since: 1.22 + **/ +GstH265BitWriterResult +gst_h265_bit_writer_slice_hdr (const GstH265SliceHdr * slice, + gboolean start_code, guint32 nal_type, guint8 * data, guint * size) +{ + gboolean have_space = TRUE; + GstBitWriter bw; + + g_return_val_if_fail (slice != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (slice->pps != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (slice->pps->sps != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (data != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (size != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (*size > 0, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (nal_type >= GST_H265_NAL_SLICE_TRAIL_N && + nal_type <= GST_H265_NAL_SLICE_CRA_NUT, GST_H265_BIT_WRITER_ERROR); + + gst_bit_writer_init_with_data (&bw, data, *size, FALSE); + + if (start_code) + WRITE_BITS (&bw, 0x00000001, 32); + + /* NAL unit header */ + /* forbidden_zero_bit */ + WRITE_BITS (&bw, 0, 1); + /* nal_unit_type */ + WRITE_BITS (&bw, nal_type, 6); + /* nuh_layer_id, only support 0 now */ + WRITE_BITS (&bw, 0, 6); + /* nuh_temporal_id_plus1, only support 1 now */ + WRITE_BITS (&bw, 1, 3); + + if (!_h265_bit_writer_slice_header (slice, nal_type, &bw, &have_space)) + goto error; + + /* Add trailings. */ + WRITE_BITS (&bw, 1, 1); + if (!gst_bit_writer_align_bytes (&bw, 0)) { + have_space = FALSE; + goto error; + } + + *size = gst_bit_writer_get_size (&bw) / 8; + gst_bit_writer_reset (&bw); + return GST_H265_BIT_WRITER_OK; + +error: + gst_bit_writer_reset (&bw); + *size = 0; + + if (!have_space) + return GST_H265_BIT_WRITER_NO_MORE_SPACE; + return GST_H265_BIT_WRITER_INVALID_DATA; +} + + +static gboolean +_h265_bit_writer_sei_registered_user_data (const GstH265RegisteredUserData * + rud, GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + + GST_DEBUG ("Writing \"Registered user data\""); + + WRITE_BITS (bw, rud->country_code, 8); + if (rud->country_code == 0xff) + WRITE_BITS (bw, rud->country_code_extension, 8); + + WRITE_BYTES (bw, rud->data, rud->size); + + *space = TRUE; + return TRUE; + +error: + GST_DEBUG ("Failed to write \"Registered user data\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h265_bit_writer_sei_time_code (const GstH265TimeCode * tc, + GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + gint i; + + GST_DEBUG ("Wrtiting \"Time code\""); + + WRITE_BITS (bw, tc->num_clock_ts, 2); + + for (i = 0; i < tc->num_clock_ts; i++) { + WRITE_BITS (bw, tc->clock_timestamp_flagi, 1); + if (tc->clock_timestamp_flagi) { + WRITE_BITS (bw, tc->units_field_based_flagi, 1); + WRITE_BITS (bw, tc->counting_typei, 5); + WRITE_BITS (bw, tc->full_timestamp_flagi, 1); + WRITE_BITS (bw, tc->discontinuity_flagi, 1); + WRITE_BITS (bw, tc->cnt_dropped_flagi, 1); + WRITE_BITS (bw, tc->n_framesi, 9); + + if (tc->full_timestamp_flagi) { + WRITE_BITS (bw, tc->seconds_valuei, 6); + WRITE_BITS (bw, tc->minutes_valuei, 6); + WRITE_BITS (bw, tc->hours_valuei, 5); + } else { + WRITE_BITS (bw, tc->seconds_flagi, 1); + if (tc->seconds_flagi) { + WRITE_BITS (bw, tc->seconds_valuei, 6); + WRITE_BITS (bw, tc->minutes_flagi, 1); + if (tc->minutes_flagi) { + WRITE_BITS (bw, tc->minutes_valuei, 6); + WRITE_BITS (bw, tc->hours_flagi, 1); + if (tc->hours_flagi) { + WRITE_BITS (bw, tc->hours_valuei, 5); + } + } + } + } + } + + WRITE_BITS (bw, tc->time_offset_lengthi, 5); + + if (tc->time_offset_lengthi > 0) + WRITE_BITS (bw, tc->time_offset_valuei, tc->time_offset_lengthi); + } + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("Failed to write \"Time code\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h265_bit_writer_sei_mastering_display_colour_volume (const + GstH265MasteringDisplayColourVolume * mdcv, GstBitWriter * bw, + gboolean * space) +{ + gboolean have_space = TRUE; + gint i; + + GST_DEBUG ("Wrtiting \"Mastering display colour volume\""); + + for (i = 0; i < 3; i++) { + WRITE_BITS (bw, mdcv->display_primaries_xi, 16); + WRITE_BITS (bw, mdcv->display_primaries_yi, 16); + } + + WRITE_BITS (bw, mdcv->white_point_x, 16); + WRITE_BITS (bw, mdcv->white_point_y, 16); + WRITE_BITS (bw, mdcv->max_display_mastering_luminance, 32); + WRITE_BITS (bw, mdcv->min_display_mastering_luminance, 32); + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("Failed to write \"Mastering display colour volume\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h265_bit_writer_sei_content_light_level_info (const + GstH265ContentLightLevel * cll, GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + + GST_DEBUG ("Writing \"Content light level\""); + + WRITE_BITS (bw, cll->max_content_light_level, 16); + WRITE_BITS (bw, cll->max_pic_average_light_level, 16); + + *space = TRUE; + return TRUE; + +error: + GST_WARNING ("Failed to write \"Content light level\""); + + *space = have_space; + return FALSE; +} + +static gboolean +_h265_bit_writer_sei_message (const GstH265SEIMessage * msg, + GstBitWriter * bw, gboolean * space) +{ + gboolean have_space = TRUE; + + GST_DEBUG ("writing SEI message"); + + switch (msg->payloadType) { + case GST_H265_SEI_REGISTERED_USER_DATA: + if (!_h265_bit_writer_sei_registered_user_data + (&msg->payload.registered_user_data, bw, &have_space)) + goto error; + break; + case GST_H265_SEI_TIME_CODE: + if (!_h265_bit_writer_sei_time_code + (&msg->payload.time_code, bw, &have_space)) + goto error; + break; + case GST_H265_SEI_MASTERING_DISPLAY_COLOUR_VOLUME: + if (!_h265_bit_writer_sei_mastering_display_colour_volume + (&msg->payload.mastering_display_colour_volume, bw, &have_space)) + goto error; + break; + case GST_H265_SEI_CONTENT_LIGHT_LEVEL: + if (!_h265_bit_writer_sei_content_light_level_info + (&msg->payload.content_light_level, bw, &have_space)) + goto error; + break; + default: + break; + } + + /* Add trailings. */ + WRITE_BITS (bw, 1, 1); + gst_bit_writer_align_bytes_unchecked (bw, 0); + + *space = TRUE; + + return TRUE; + +error: + GST_WARNING ("error to write SEI message"); + + *space = have_space; + return FALSE; +} + +/** + * gst_h265_bit_writer_sei: + * @sei_messages: An array of #GstH265SEIMessage to write + * @start_code: whether adding the nal start code + * @data: (out): the bit stream generated by the sei messages + * @size: (inout): the size in bytes of the input and output + * + * Generating the according h265 bit stream by providing sei messages. + * + * Returns: a #GstH265BitWriterResult + * + * Since: 1.22 + **/ +GstH265BitWriterResult +gst_h265_bit_writer_sei (GArray * sei_messages, + GstH265NalUnitType nal_type, gboolean start_code, guint8 * data, + guint * size) +{ + gboolean have_space = TRUE; + GstBitWriter bw; + GstH265SEIMessage *sei; + gboolean have_written_data = FALSE; + guint i; + + g_return_val_if_fail (sei_messages != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (nal_type == GST_H265_NAL_PREFIX_SEI + || nal_type == GST_H265_NAL_SUFFIX_SEI, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (data != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (size != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (*size > 0, GST_H265_BIT_WRITER_ERROR); + + if (nal_type == GST_H265_NAL_PREFIX_SEI) { + GST_WARNING ("prefix sei is not supported"); + return GST_H265_BIT_WRITER_ERROR; + } + + gst_bit_writer_init_with_data (&bw, data, *size, FALSE); + + if (start_code) + WRITE_BITS (&bw, 0x00000001, 32); + + /* NAL unit header */ + /* forbidden_zero_bit */ + WRITE_BITS (&bw, 0, 1); + /* nal_unit_type */ + WRITE_BITS (&bw, nal_type, 6); + /* nuh_layer_id, only support 0 now */ + WRITE_BITS (&bw, 0, 6); + /* nuh_temporal_id_plus1, only support 1 now */ + WRITE_BITS (&bw, 1, 3); + + for (i = 0; i < sei_messages->len; i++) { + guint32 payload_size_data; + guint32 payload_type_data; + + gst_bit_writer_init (&bw); + + sei = &g_array_index (sei_messages, GstH265SEIMessage, i); + if (!_h265_bit_writer_sei_message (sei, &bw, &have_space)) + goto error; + + if (gst_bit_writer_get_size (&bw) == 0) { + GST_FIXME ("Unsupported SEI type %d", sei->payloadType); + continue; + } + + have_written_data = TRUE; + + g_assert (gst_bit_writer_get_size (&bw) % 8 == 0); + payload_size_data = (gst_bit_writer_get_size (&bw) + 7) / 8; + payload_type_data = sei->payloadType; + + /* write payload type bytes */ + while (payload_type_data >= 0xff) { + WRITE_BITS (&bw, 0xff, 8); + payload_type_data -= -0xff; + } + WRITE_BITS (&bw, payload_type_data, 8); + + /* write payload size bytes */ + while (payload_size_data >= 0xff) { + WRITE_BITS (&bw, 0xff, 8); + payload_size_data -= -0xff; + } + WRITE_BITS (&bw, payload_size_data, 8); + + if (gst_bit_writer_get_size (&bw) / 8) + WRITE_BYTES (&bw, gst_bit_writer_get_data (&bw), + gst_bit_writer_get_size (&bw) / 8); + + gst_bit_writer_reset (&bw); + } + + if (!have_written_data) { + GST_WARNING ("No written sei data"); + goto error; + } + + /* Add trailings. */ + WRITE_BITS (&bw, 1, 1); + if (!gst_bit_writer_align_bytes (&bw, 0)) { + have_space = FALSE; + goto error; + } + + *size = gst_bit_writer_get_size (&bw) / 8; + gst_bit_writer_reset (&bw); + return GST_H265_BIT_WRITER_OK; + +error: + gst_bit_writer_reset (&bw); + *size = 0; + + if (!have_space) + return GST_H265_BIT_WRITER_NO_MORE_SPACE; + return GST_H265_BIT_WRITER_INVALID_DATA; +} + +/** + * gst_h265_bit_writer_aud: + * @pic_type: indicate the possible slice types list just + * as the H265 spec Table 7-2 defines + * @start_code: whether adding the nal start code + * @data: (out): the bit stream generated by the aud + * @size: (inout): the size in bytes of the input and output + * + * Generating the according h265 bit stream of an aud. + * + * Returns: a #GstH265BitWriterResult + * + * Since: 1.22 + **/ +GstH265BitWriterResult +gst_h265_bit_writer_aud (guint8 pic_type, gboolean start_code, + guint8 * data, guint * size) +{ + gboolean have_space = TRUE; + GstBitWriter bw; + + g_return_val_if_fail (pic_type <= 2, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (data != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (size != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (*size > 0, GST_H265_BIT_WRITER_ERROR); + + gst_bit_writer_init_with_data (&bw, data, *size, FALSE); + + if (start_code) + WRITE_BITS (&bw, 0x00000001, 32); + + /* NAL unit header */ + /* forbidden_zero_bit */ + WRITE_BITS (&bw, 0, 1); + /* nal_unit_type */ + WRITE_BITS (&bw, GST_H265_NAL_AUD, 6); + /* nuh_layer_id, only support 0 now */ + WRITE_BITS (&bw, 0, 6); + /* nuh_temporal_id_plus1, only support 1 now */ + WRITE_BITS (&bw, 1, 3); + + WRITE_BITS (&bw, pic_type, 3); + + /* Add trailings. */ + WRITE_BITS (&bw, 1, 1); + if (!gst_bit_writer_align_bytes (&bw, 0)) { + goto error; + } + + *size = gst_bit_writer_get_size (&bw) / 8; + gst_bit_writer_reset (&bw); + + return GST_H265_BIT_WRITER_OK; + +error: + gst_bit_writer_reset (&bw); + *size = 0; + + if (!have_space) + return GST_H265_BIT_WRITER_NO_MORE_SPACE; + return GST_H265_BIT_WRITER_INVALID_DATA; +} + +/** + * gst_h265_bit_writer_convert_to_nal: + * @nal_prefix_size: the size in bytes for the prefix of a nal, may + * be 2, 3 or 4 + * @packetized: whether to write the bit stream in packetized format, + * which does not have the start code but has a @nal_prefix_size bytes' + * size prepending to the real nal data + * @has_startcode: whether the input already has a start code + * @add_trailings: whether to add rbsp trailing bits to make the output + * aligned to byte + * @raw_data: the input bit stream + * @raw_size: the size in bits of the input bit stream + * @nal_data: (out): the output bit stream converted to a real nal + * @nal_size: (inout): the size in bytes of the output + * + * Converting a bit stream into a real nal packet. If the bit stream already + * has a start code, it will be replaced by the new one specified by the + * @nal_prefix_size and @packetized. It is assured that the output aligns to + * the byte and the all the emulations are inserted. + * + * Returns: a #GstH265BitWriterResult + * + * Since: 1.22 + **/ +GstH265BitWriterResult +gst_h265_bit_writer_convert_to_nal (guint nal_prefix_size, + gboolean packetized, gboolean has_startcode, gboolean add_trailings, + const guint8 * raw_data, gsize raw_size, guint8 * nal_data, + guint * nal_size) +{ + NalWriter nw; + guint8 *data; + guint32 size = 0; + gboolean need_more_space = FALSE; + + g_return_val_if_fail ( + (packetized && nal_prefix_size > 1 && nal_prefix_size < 5) || + (!packetized && (nal_prefix_size == 3 || nal_prefix_size == 4)), + GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (raw_data != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (raw_size > 0, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (nal_data != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (nal_size != NULL, GST_H265_BIT_WRITER_ERROR); + g_return_val_if_fail (*nal_size > 0, GST_H265_BIT_WRITER_ERROR); + + if (has_startcode) { + /* Skip the start code, the NalWriter will add it automatically. */ + if (raw_size >= 4 && raw_data0 == 0 + && raw_data1 == 0 && raw_data2 == 0 && raw_data3 == 0x01) { + raw_data += 4; + raw_size -= 4 * 8; + } else if (raw_size >= 3 && raw_data0 == 0 && raw_data1 == 0 + && raw_data2 == 0x01) { + raw_data += 3; + raw_size -= 3 * 8; + } else { + /* Fail to find the start code. */ + g_return_val_if_reached (GST_H265_BIT_WRITER_ERROR); + } + } + + /* If no RBSP trailing needed, it must align to byte. We assume + that the rbsp trailing bits are already added. */ + if (!add_trailings) + g_return_val_if_fail (raw_size % 8 == 0, GST_H265_BIT_WRITER_ERROR); + + nal_writer_init (&nw, nal_prefix_size, packetized); + + if (!nal_writer_put_bytes (&nw, raw_data, raw_size / 8)) + goto error; + + if (raw_size % 8) { + guint8 data = *(raw_data + raw_size / 8); + + if (!nal_writer_put_bits_uint8 (&nw, + data >> (8 - raw_size % 8), raw_size % 8)) + goto error; + } + + if (add_trailings) { + if (!nal_writer_do_rbsp_trailing_bits (&nw)) + goto error; + } + + data = nal_writer_reset_and_get_data (&nw, &size); + if (!data) + goto error; + + if (size > *nal_size) { + need_more_space = TRUE; + g_free (data); + goto error; + } + + memcpy (nal_data, data, size); + *nal_size = size; + g_free (data); + nal_writer_reset (&nw); + return GST_H265_BIT_WRITER_OK; + +error: + nal_writer_reset (&nw); + *nal_size = 0; + + GST_WARNING ("Failed to convert nal data"); + + if (need_more_space) + return GST_H265_BIT_WRITER_NO_MORE_SPACE; + return GST_H265_BIT_WRITER_INVALID_DATA; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gsth265bitwriter.h
Added
@@ -0,0 +1,93 @@ +/* GStreamer + * Copyright (C) 2021 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the0 + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_H265_BIT_WRITER_H__ +#define __GST_H265_BIT_WRITER_H__ + +#include <gst/codecparsers/gsth265parser.h> +#include <gst/codecparsers/codecparsers-prelude.h> + +G_BEGIN_DECLS + +/** + * GstH265BitWriterResult: + * @GST_H265_BIT_WRITER_OK: The writing succeeded + * @GST_H265_BIT_WRITER_INVALID_DATA: The input data to write is invalid + * @GST_H265_BIT_WRITER_NO_MORE_SPACE: The output does not have enough size + * @GST_H265_BIT_WRITER_ERROR: An general error occurred when writing + * + * The result of writing H265 data into bit stream. + * + * Since: 1.22 + */ +typedef enum +{ + GST_H265_BIT_WRITER_OK, + GST_H265_BIT_WRITER_INVALID_DATA, + GST_H265_BIT_WRITER_NO_MORE_SPACE, + GST_H265_BIT_WRITER_ERROR +} GstH265BitWriterResult; + +GST_CODEC_PARSERS_API +GstH265BitWriterResult gst_h265_bit_writer_vps (const GstH265VPS * vps, + gboolean start_code, + guint8 * data, + guint * size); +GST_CODEC_PARSERS_API +GstH265BitWriterResult gst_h265_bit_writer_sps (const GstH265SPS * sps, + gboolean start_code, + guint8 * data, + guint * size); +GST_CODEC_PARSERS_API +GstH265BitWriterResult gst_h265_bit_writer_pps (const GstH265PPS * pps, + gboolean start_code, + guint8 * data, + guint * size); +GST_CODEC_PARSERS_API +GstH265BitWriterResult gst_h265_bit_writer_slice_hdr (const GstH265SliceHdr * slice, + gboolean start_code, + guint32 nal_type, + guint8 * data, + guint * size); +GST_CODEC_PARSERS_API +GstH265BitWriterResult gst_h265_bit_writer_sei (GArray * sei_messages, + GstH265NalUnitType nal_type, + gboolean start_code, + guint8 * data, + guint * size); + +GST_CODEC_PARSERS_API +GstH265BitWriterResult gst_h265_bit_writer_aud (guint8 pic_type, + gboolean start_code, + guint8 * data, + guint * size); + +GST_CODEC_PARSERS_API +GstH265BitWriterResult gst_h265_bit_writer_convert_to_nal (guint nal_prefix_size, + gboolean packetized, + gboolean has_startcode, + gboolean add_trailings, + const guint8 * raw_data, + gsize raw_size, + guint8 * nal_data, + guint * nal_size); +G_END_DECLS + +#endif /* __GST_H265_BIT_WRITER_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecparsers/gsth265parser.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gsth265parser.c
Changed
@@ -597,10 +597,12 @@ READ_UE_MAX (nr, vui->log2_max_mv_length_vertical, 15); } + vui->parsed = TRUE; return TRUE; error: GST_WARNING ("error parsing \"VUI Parameters\""); + vui->parsed = FALSE; return FALSE; } @@ -1582,6 +1584,179 @@ } /** + * gst_h265_parser_identify_and_split_nalu_hevc: + * @parser: a #GstH265Parser + * @data: The data to parse, must be the beging of the Nal unit + * @offset: the offset from which to parse @data + * @size: the size of @data + * @nal_length_size: the size in bytes of the HEVC nal length prefix. + * @nalus: a caller allocated GArray of #GstH265NalUnit where to store parsed nal headers + * @consumed: the size of consumed bytes + * + * Parses @data for packetized (e.g., hvc1/hev1) bitstream and + * sets @nalus. In addition to nal identifying process, + * this method scans start-code prefix to split malformed packet into + * actual nal chunks. + * + * Returns: a #GstH265ParserResult + * + * Since: 1.22 + */ +GstH265ParserResult +gst_h265_parser_identify_and_split_nalu_hevc (GstH265Parser * parser, + const guint8 * data, guint offset, gsize size, guint8 nal_length_size, + GArray * nalus, gsize * consumed) +{ + GstBitReader br; + guint nalu_size; + guint remaining; + guint off; + guint sc_size; + + g_return_val_if_fail (data != NULL, GST_H265_PARSER_ERROR); + g_return_val_if_fail (nalus != NULL, GST_H265_PARSER_ERROR); + g_return_val_if_fail (nal_length_size > 0 && nal_length_size < 5, + GST_H265_PARSER_ERROR); + + g_array_set_size (nalus, 0); + + if (consumed) + *consumed = 0; + + /* Would overflow guint below otherwise: the callers needs to ensure that + * this never happens */ + if (offset > G_MAXUINT32 - nal_length_size) { + GST_WARNING ("offset + nal_length_size overflow"); + return GST_H265_PARSER_BROKEN_DATA; + } + + if (size < offset + nal_length_size) { + GST_DEBUG ("Can't parse, buffer has too small size %" G_GSIZE_FORMAT + ", offset %u", size, offset); + return GST_H265_PARSER_ERROR; + } + + /* Read nal unit size and unwrap the size field */ + gst_bit_reader_init (&br, data + offset, size - offset); + nalu_size = gst_bit_reader_get_bits_uint32_unchecked (&br, + nal_length_size * 8); + + if (nalu_size < 2) { + GST_WARNING ("too small nal size %d", nalu_size); + return GST_H265_PARSER_BROKEN_DATA; + } + + if (size < (gsize) nalu_size + nal_length_size) { + GST_WARNING ("larger nalu size %d than data size %" G_GSIZE_FORMAT, + nalu_size + nal_length_size, size); + return GST_H265_PARSER_BROKEN_DATA; + } + + if (consumed) + *consumed = nalu_size + nal_length_size; + + off = offset + nal_length_size; + remaining = nalu_size; + sc_size = nal_length_size; + + /* Drop trailing start-code since it will not be scanned */ + if (remaining >= 3) { + if (dataoff + remaining - 1 == 0x01 && dataoff + remaining - 2 == 0x00 + && dataoff + remaining - 3 == 0x00) { + remaining -= 3; + + /* 4 bytes start-code */ + if (remaining > 0 && dataoff + remaining - 1 == 0x00) + remaining--; + } + } + + /* Looping to split malformed nal units. nal-length field was dropped above + * so expected bitstream structure are: + * + * <complete nalu> + * | nalu | + * sc scan result will be -1 and handled in CONDITION-A + * + * <nalu with startcode prefix> + * | SC | nalu | + * Hit CONDITION-C first then terminated in CONDITION-A + * + * <first nal has no startcode but others have> + * | nalu | SC | nalu | ... + * CONDITION-B handles those cases + */ + do { + GstH265NalUnit nalu; + gint sc_offset = -1; + guint skip_size = 0; + + memset (&nalu, 0, sizeof (GstH265NalUnit)); + + /* startcode 3 bytes + minimum nal size 2 */ + if (remaining >= 5) + sc_offset = scan_for_start_codes (data + off, remaining); + + if (sc_offset < 0) { + if (remaining >= 2) { + /* CONDITION-A */ + /* Last chunk */ + nalu.size = remaining; + nalu.sc_offset = off - sc_size; + nalu.offset = off; + nalu.data = (guint8 *) data; + nalu.valid = TRUE; + + gst_h265_parse_nalu_header (&nalu); + g_array_append_val (nalus, nalu); + } + break; + } else if ((sc_offset == 2 && dataoff + sc_offset - 1 != 0) + || sc_offset > 2) { + /* CONDITION-B */ + /* Found trailing startcode prefix */ + + nalu.size = sc_offset; + if (dataoff + sc_offset - 1 == 0) { + /* 4 bytes start code */ + nalu.size--; + } + + nalu.sc_offset = off - sc_size; + nalu.offset = off; + nalu.data = (guint8 *) data; + nalu.valid = TRUE; + + gst_h265_parse_nalu_header (&nalu); + g_array_append_val (nalus, nalu); + } else { + /* CONDITION-C */ + /* startcode located at beginning of this chunk without actual nal data. + * skip this start code */ + } + + skip_size = sc_offset + 3; + if (skip_size >= remaining) + break; + + /* no more nal-length bytes but 3bytes startcode */ + sc_size = 3; + if (sc_offset > 0 && dataoff + sc_offset - 1 == 0) + sc_size++; + + remaining -= skip_size; + off += skip_size; + } while (remaining >= 2); + + if (nalus->len > 0) + return GST_H265_PARSER_OK; + + GST_WARNING ("No nal found"); + + return GST_H265_PARSER_BROKEN_DATA; +} + +/** * gst_h265_parser_parse_nal: * @parser: a #GstH265Parser * @nalu: The #GstH265NalUnit to parse @@ -1825,12 +2000,9 @@ GstH265SPS * sps, gboolean parse_vui_params) { NalReader nr; - GstH265VPS *vps; - guint8 vps_id; guint i; guint subwc = { 1, 2, 2, 1, 1 }; guint subhc = { 1, 2, 1, 1, 1 }; - GstH265VUIParams *vui = NULL; GST_DEBUG ("parsing SPS"); @@ -1839,13 +2011,7 @@ memset (sps, 0, sizeof (*sps)); - READ_UINT8 (&nr, vps_id, 4); - vps = gst_h265_parser_get_vps (parser, vps_id); - if (!vps) { - GST_DEBUG ("couldn't find associated video parameter set with id: %d", - vps_id); - } - sps->vps = vps; + READ_UINT8 (&nr, sps->vps_id, 4); READ_UINT8 (&nr, sps->max_sub_layers_minus1, 3); READ_UINT8 (&nr, sps->temporal_id_nesting_flag, 1); @@ -1946,11 +2112,9 @@ READ_UINT8 (&nr, sps->strong_intra_smoothing_enabled_flag, 1); READ_UINT8 (&nr, sps->vui_parameters_present_flag, 1); - if (sps->vui_parameters_present_flag && parse_vui_params) { + if (sps->vui_parameters_present_flag && parse_vui_params) if (!gst_h265_parse_vui_parameters (sps, &nr)) goto error; - vui = &sps->vui_params; - } READ_UINT8 (&nr, sps->sps_extension_flag, 1); @@ -1964,20 +2128,21 @@ if (sps->sps_range_extension_flag) { READ_UINT8 (&nr, - sps->sps_extnsion_params.transform_skip_rotation_enabled_flag, 1); + sps->sps_extension_params.transform_skip_rotation_enabled_flag, 1); READ_UINT8 (&nr, - sps->sps_extnsion_params.transform_skip_context_enabled_flag, 1); - READ_UINT8 (&nr, sps->sps_extnsion_params.implicit_rdpcm_enabled_flag, 1); - READ_UINT8 (&nr, sps->sps_extnsion_params.explicit_rdpcm_enabled_flag, 1); + sps->sps_extension_params.transform_skip_context_enabled_flag, 1); + READ_UINT8 (&nr, sps->sps_extension_params.implicit_rdpcm_enabled_flag, 1); + READ_UINT8 (&nr, sps->sps_extension_params.explicit_rdpcm_enabled_flag, 1); READ_UINT8 (&nr, - sps->sps_extnsion_params.extended_precision_processing_flag, 1); - READ_UINT8 (&nr, sps->sps_extnsion_params.intra_smoothing_disabled_flag, 1); + sps->sps_extension_params.extended_precision_processing_flag, 1); + READ_UINT8 (&nr, sps->sps_extension_params.intra_smoothing_disabled_flag, + 1); READ_UINT8 (&nr, - sps->sps_extnsion_params.high_precision_offsets_enabled_flag, 1); + sps->sps_extension_params.high_precision_offsets_enabled_flag, 1); READ_UINT8 (&nr, - sps->sps_extnsion_params.persistent_rice_adaptation_enabled_flag, 1); + sps->sps_extension_params.persistent_rice_adaptation_enabled_flag, 1); READ_UINT8 (&nr, - sps->sps_extnsion_params.cabac_bypass_alignment_enabled_flag, 1); + sps->sps_extension_params.cabac_bypass_alignment_enabled_flag, 1); } if (sps->sps_multilayer_extension_flag) { @@ -2002,22 +2167,25 @@ 128 - sps->sps_scc_extension_params.palette_max_size); READ_UINT8 (&nr, - sps->sps_scc_extension_params. - sps_palette_predictor_initializers_present_flag, 1); - if (sps->sps_scc_extension_params. - sps_palette_predictor_initializers_present_flag) { + sps-> + sps_scc_extension_params.sps_palette_predictor_initializers_present_flag, + 1); + if (sps-> + sps_scc_extension_params.sps_palette_predictor_initializers_present_flag) + { guint comp; READ_UE_MAX (&nr, - sps->sps_scc_extension_params. - sps_num_palette_predictor_initializer_minus1, + sps-> + sps_scc_extension_params.sps_num_palette_predictor_initializer_minus1, sps->sps_scc_extension_params.palette_max_size + sps->sps_scc_extension_params.delta_palette_max_predictor_size - 1); for (comp = 0; comp < (sps->chroma_format_idc == 0 ? 1 : 3); comp++) { guint num_bits; guint num = - sps->sps_scc_extension_params. - sps_num_palette_predictor_initializer_minus1 + 1; + sps-> + sps_scc_extension_params.sps_num_palette_predictor_initializer_minus1 + + 1; num_bits = (comp == 0 ? sps->bit_depth_luma_minus8 + 8 : sps->bit_depth_chroma_minus8 + 8); @@ -2068,24 +2236,6 @@ sps->fps_num = 0; sps->fps_den = 1; - if (vui && vui->timing_info_present_flag) { - /* derive framerate for progressive stream if the pic_struct - * syntax element is not present in picture timing SEI messages */ - /* Fixme: handle other cases also */ - if (parse_vui_params && vui->timing_info_present_flag - && !vui->field_seq_flag && !vui->frame_field_info_present_flag) { - sps->fps_num = vui->time_scale; - sps->fps_den = vui->num_units_in_tick; - GST_LOG ("framerate %d/%d in VUI", sps->fps_num, sps->fps_den); - } - } else if (vps && vps->timing_info_present_flag) { - sps->fps_num = vps->time_scale; - sps->fps_den = vps->num_units_in_tick; - GST_LOG ("framerate %d/%d in VPS", sps->fps_num, sps->fps_den); - } else { - GST_LOG ("No VUI, unknown framerate"); - } - sps->valid = TRUE; return GST_H265_PARSER_OK; @@ -2110,11 +2260,8 @@ gst_h265_parse_pps (GstH265Parser * parser, GstH265NalUnit * nalu, GstH265PPS * pps) { + guint32 MaxBitDepthY, MaxBitDepthC; NalReader nr; - GstH265SPS *sps; - gint sps_id; - gint qp_bd_offset; - guint32 CtbSizeY, MinCbLog2SizeY, CtbLog2SizeY, MaxBitDepthY, MaxBitDepthC; guint8 i; GST_DEBUG ("parsing PPS"); @@ -2125,24 +2272,7 @@ memset (pps, 0, sizeof (*pps)); READ_UE_MAX (&nr, pps->id, GST_H265_MAX_PPS_COUNT - 1); - READ_UE_MAX (&nr, sps_id, GST_H265_MAX_SPS_COUNT - 1); - - sps = gst_h265_parser_get_sps (parser, sps_id); - if (!sps) { - GST_WARNING ("couldn't find associated sequence parameter set with id: %d", - sps_id); - return GST_H265_PARSER_BROKEN_LINK; - } - pps->sps = sps; - qp_bd_offset = 6 * sps->bit_depth_luma_minus8; - - MinCbLog2SizeY = sps->log2_min_luma_coding_block_size_minus3 + 3; - CtbLog2SizeY = MinCbLog2SizeY + sps->log2_diff_max_min_luma_coding_block_size; - CtbSizeY = 1 << CtbLog2SizeY; - pps->PicHeightInCtbsY = - ceil ((gdouble) sps->pic_height_in_luma_samples / (gdouble) CtbSizeY); - pps->PicWidthInCtbsY = - ceil ((gdouble) sps->pic_width_in_luma_samples / (gdouble) CtbSizeY); + READ_UE_MAX (&nr, pps->sps_id, GST_H265_MAX_SPS_COUNT - 1); /* set default values for fields that might not be present in the bitstream and have valid defaults */ @@ -2157,15 +2287,21 @@ READ_UE_MAX (&nr, pps->num_ref_idx_l0_default_active_minus1, 14); READ_UE_MAX (&nr, pps->num_ref_idx_l1_default_active_minus1, 14); - READ_SE_ALLOWED (&nr, pps->init_qp_minus26, -(26 + qp_bd_offset), 25); + + /* The value of init_qp_minus26 shall be in the range of + * −( 26 + QpBdOffsetY ) to +25, inclusive. + * QpBdOffsetY = 6 * bit_depth_luma_minus8 (7-5) + * and bit_depth_luma_minus8 shall be in the range of 0 to 8, inclusive. + * so the minimum possible value of init_qp_minus26 is -(26 + 6*8) */ + READ_SE_ALLOWED (&nr, pps->init_qp_minus26, -(26 + 6 * 8), 25); READ_UINT8 (&nr, pps->constrained_intra_pred_flag, 1); READ_UINT8 (&nr, pps->transform_skip_enabled_flag, 1); READ_UINT8 (&nr, pps->cu_qp_delta_enabled_flag, 1); - if (pps->cu_qp_delta_enabled_flag) - READ_UE_MAX (&nr, pps->diff_cu_qp_delta_depth, - sps->log2_diff_max_min_luma_coding_block_size); + if (pps->cu_qp_delta_enabled_flag) { + READ_UE_MAX (&nr, pps->diff_cu_qp_delta_depth, 6); + } READ_SE_ALLOWED (&nr, pps->cb_qp_offset, -12, 12); READ_SE_ALLOWED (&nr, pps->cr_qp_offset, -12, 12); @@ -2178,6 +2314,26 @@ READ_UINT8 (&nr, pps->entropy_coding_sync_enabled_flag, 1); if (pps->tiles_enabled_flag) { + GstH265SPS *sps; + guint32 CtbSizeY, MinCbLog2SizeY, CtbLog2SizeY; + + sps = gst_h265_parser_get_sps (parser, pps->sps_id); + if (!sps) { + GST_WARNING + ("couldn't find associated sequence parameter set with id: %d", + pps->sps_id); + return GST_H265_PARSER_BROKEN_LINK; + } + + MinCbLog2SizeY = sps->log2_min_luma_coding_block_size_minus3 + 3; + CtbLog2SizeY = + MinCbLog2SizeY + sps->log2_diff_max_min_luma_coding_block_size; + CtbSizeY = 1 << CtbLog2SizeY; + pps->PicHeightInCtbsY = + ceil ((gdouble) sps->pic_height_in_luma_samples / (gdouble) CtbSizeY); + pps->PicWidthInCtbsY = + ceil ((gdouble) sps->pic_width_in_luma_samples / (gdouble) CtbSizeY); + READ_UE_ALLOWED (&nr, pps->num_tile_columns_minus1, 0, pps->PicWidthInCtbsY - 1); READ_UE_ALLOWED (&nr, @@ -2248,10 +2404,6 @@ if (pps->scaling_list_data_present_flag) if (!gst_h265_parser_parse_scaling_lists (&nr, &pps->scaling_list, FALSE)) goto error; - if (sps->scaling_list_enabled_flag && !sps->scaling_list_data_present_flag - && !pps->scaling_list_data_present_flag) - if (!gst_h265_parser_parse_scaling_lists (&nr, &pps->scaling_list, TRUE)) - goto error; READ_UINT8 (&nr, pps->lists_modification_present_flag, 1); READ_UE_MAX (&nr, pps->log2_parallel_merge_level_minus2, 4); @@ -2267,6 +2419,16 @@ } if (pps->pps_range_extension_flag) { + GstH265SPS *sps; + + sps = gst_h265_parser_get_sps (parser, pps->sps_id); + if (!sps) { + GST_WARNING + ("couldn't find associated sequence parameter set with id: %d", + pps->sps_id); + return GST_H265_PARSER_BROKEN_LINK; + } + if (pps->transform_skip_enabled_flag) READ_UE (&nr, pps->pps_extension_params.log2_max_transform_skip_block_size_minus2); @@ -2311,13 +2473,25 @@ } if (pps->pps_scc_extension_flag) { + GstH265SPS *sps; + + sps = gst_h265_parser_get_sps (parser, pps->sps_id); + if (!sps) { + GST_WARNING + ("couldn't find associated sequence parameter set with id: %d", + pps->sps_id); + return GST_H265_PARSER_BROKEN_LINK; + } + READ_UINT8 (&nr, pps->pps_scc_extension_params.pps_curr_pic_ref_enabled_flag, 1); READ_UINT8 (&nr, - pps->pps_scc_extension_params. - residual_adaptive_colour_transform_enabled_flag, 1); - if (pps->pps_scc_extension_params. - residual_adaptive_colour_transform_enabled_flag) { + pps-> + pps_scc_extension_params.residual_adaptive_colour_transform_enabled_flag, + 1); + if (pps-> + pps_scc_extension_params.residual_adaptive_colour_transform_enabled_flag) + { READ_UINT8 (&nr, pps->pps_scc_extension_params.pps_slice_act_qp_offsets_present_flag, 1); @@ -2330,10 +2504,12 @@ } READ_UINT8 (&nr, - pps->pps_scc_extension_params. - pps_palette_predictor_initializers_present_flag, 1); - if (pps->pps_scc_extension_params. - pps_palette_predictor_initializers_present_flag) { + pps-> + pps_scc_extension_params.pps_palette_predictor_initializers_present_flag, + 1); + if (pps-> + pps_scc_extension_params.pps_palette_predictor_initializers_present_flag) + { READ_UE_MAX (&nr, pps->pps_scc_extension_params.pps_num_palette_predictor_initializer, sps->sps_scc_extension_params.palette_max_size + @@ -2364,8 +2540,8 @@ comp++) { guint num_bits; guint num = - pps->pps_scc_extension_params. - pps_num_palette_predictor_initializer; + pps-> + pps_scc_extension_params.pps_num_palette_predictor_initializer; num_bits = (comp == 0 ? pps->pps_scc_extension_params.luma_bit_depth_entry_minus8 + 8 : @@ -2414,6 +2590,90 @@ return res; } +static GstH265ParserResult +gst_h265_parser_fill_sps (GstH265Parser * parser, GstH265SPS * sps) +{ + GstH265VPS *vps; + GstH265VUIParams *vui = &sps->vui_params; + GstH265ParserResult ret = GST_H265_PARSER_OK; + + vps = gst_h265_parser_get_vps (parser, sps->vps_id); + if (!vps) { + GST_DEBUG ("couldn't find associated video parameter set with id: %d", + sps->vps_id); + return GST_H265_PARSER_BROKEN_LINK; + } + sps->vps = vps; + + if (vui && vui->timing_info_present_flag) { + /* derive framerate for progressive stream if the pic_struct + * syntax element is not present in picture timing SEI messages */ + /* Fixme: handle other cases also */ + if (vui->parsed && vui->timing_info_present_flag + && !vui->field_seq_flag && !vui->frame_field_info_present_flag) { + sps->fps_num = vui->time_scale; + sps->fps_den = vui->num_units_in_tick; + GST_LOG ("framerate %d/%d in VUI", sps->fps_num, sps->fps_den); + } + } else if (vps && vps->timing_info_present_flag) { + sps->fps_num = vps->time_scale; + sps->fps_den = vps->num_units_in_tick; + GST_LOG ("framerate %d/%d in VPS", sps->fps_num, sps->fps_den); + } else { + GST_LOG ("No VUI, unknown framerate"); + } + + return ret; +} + +static GstH265ParserResult +gst_h265_parser_fill_pps (GstH265Parser * parser, GstH265PPS * pps) +{ + GstH265SPS *sps; + gint qp_bd_offset; + guint32 CtbSizeY, MinCbLog2SizeY, CtbLog2SizeY; + GstH265ParserResult ret = GST_H265_PARSER_OK; + + sps = gst_h265_parser_get_sps (parser, pps->sps_id); + if (!sps) { + GST_WARNING ("couldn't find associated sequence parameter set with id: %d", + pps->sps_id); + return GST_H265_PARSER_BROKEN_LINK; + } + + ret = gst_h265_parser_fill_sps (parser, sps); + if (ret != GST_H265_PARSER_OK) { + GST_WARNING ("couldn't fill sps id: %d", pps->sps_id); + return ret; + } + + pps->sps = sps; + qp_bd_offset = 6 * sps->bit_depth_luma_minus8; + + MinCbLog2SizeY = sps->log2_min_luma_coding_block_size_minus3 + 3; + CtbLog2SizeY = MinCbLog2SizeY + sps->log2_diff_max_min_luma_coding_block_size; + CtbSizeY = 1 << CtbLog2SizeY; + pps->PicHeightInCtbsY = + ceil ((gdouble) sps->pic_height_in_luma_samples / (gdouble) CtbSizeY); + pps->PicWidthInCtbsY = + ceil ((gdouble) sps->pic_width_in_luma_samples / (gdouble) CtbSizeY); + + if (pps->init_qp_minus26 < -(26 + qp_bd_offset)) + return GST_H265_PARSER_BROKEN_LINK; + + if (sps->scaling_list_enabled_flag && !sps->scaling_list_data_present_flag + && !pps->scaling_list_data_present_flag) + if (!gst_h265_parser_parse_scaling_lists (NULL, &pps->scaling_list, TRUE)) + return GST_H265_PARSER_BROKEN_LINK; + + if (pps->cu_qp_delta_enabled_flag) + if (pps->diff_cu_qp_delta_depth > + sps->log2_diff_max_min_luma_coding_block_size) + return GST_H265_PARSER_BROKEN_LINK; + + return ret; +} + /** * gst_h265_parser_parse_slice_hdr: * @parser: a #GstH265Parser @@ -2439,6 +2699,7 @@ guint32 UsedByCurrPicLt16; guint32 PicSizeInCtbsY; gint NumPocTotalCurr = 0; + GstH265ParserResult err; memset (slice, 0, sizeof (*slice)); @@ -2465,6 +2726,12 @@ return GST_H265_PARSER_BROKEN_LINK; } + err = gst_h265_parser_fill_pps (parser, pps); + if (err != GST_H265_PARSER_OK) { + GST_WARNING ("couldn't fill pps id: %d", pps_id); + return err; + } + slice->pps = pps; sps = pps->sps; if (!sps) { @@ -2499,7 +2766,6 @@ nal_reader_skip (&nr, 1); READ_UE_MAX (&nr, slice->type, 63); - if (pps->output_flag_present_flag) READ_UINT8 (&nr, slice->pic_output_flag, 1); if (sps->separate_colour_plane_flag == 1) @@ -2512,12 +2778,16 @@ READ_UINT8 (&nr, slice->short_term_ref_pic_set_sps_flag, 1); if (!slice->short_term_ref_pic_set_sps_flag) { guint pos = nal_reader_get_pos (&nr); + guint epb_pos = nal_reader_get_epb_count (&nr); + if (!gst_h265_parser_parse_short_term_ref_pic_sets (&slice->short_term_ref_pic_sets, &nr, sps->num_short_term_ref_pic_sets, sps)) goto error; - slice->short_term_ref_pic_set_size = nal_reader_get_pos (&nr) - pos; + slice->short_term_ref_pic_set_size = + (nal_reader_get_pos (&nr) - pos) - + (8 * (nal_reader_get_epb_count (&nr) - epb_pos)); } else if (sps->num_short_term_ref_pic_sets > 1) { const guint n = ceil_log2 (sps->num_short_term_ref_pic_sets); READ_UINT8 (&nr, slice->short_term_ref_pic_set_idx, n); @@ -2527,6 +2797,8 @@ if (sps->long_term_ref_pics_present_flag) { guint32 limit; + guint pos = nal_reader_get_pos (&nr); + guint epb_pos = nal_reader_get_epb_count (&nr); if (sps->num_long_term_ref_pics_sps > 0) READ_UE_MAX (&nr, slice->num_long_term_sps, @@ -2556,6 +2828,10 @@ if (slice->delta_poc_msb_present_flagi) READ_UE (&nr, slice->delta_poc_msb_cycle_lti); } + + slice->long_term_ref_pic_set_size = + (nal_reader_get_pos (&nr) - pos) - + (8 * (nal_reader_get_epb_count (&nr) - epb_pos)); } if (sps->temporal_mvp_enabled_flag) READ_UINT8 (&nr, slice->temporal_mvp_enabled_flag, 1);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecparsers/gsth265parser.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gsth265parser.h
Changed
@@ -788,6 +788,7 @@ /** * GstH265VUIParams: + * @parsed: %TRUE indicate that VUI parameters have been parsed (Since: 1.22) * @aspect_ratio_info_present_flag: %TRUE specifies that aspect_ratio_idc is present. * %FALSE specifies that aspect_ratio_idc is not present * @aspect_ratio_idc specifies the value of the sample aspect ratio of the luma samples @@ -856,6 +857,14 @@ */ struct _GstH265VUIParams { + /** + * _GstH265VUIParams.parsed: + * + * %TRUE indicate that VUI parameters have been parsed. + * + * Since: 1.22 + */ + gboolean parsed; guint8 aspect_ratio_info_present_flag; guint8 aspect_ratio_idc; /* if aspect_ratio_idc == 255 */ @@ -1102,6 +1111,14 @@ { guint8 id; + /** + * _GstH265SPS.vps_id: + * + * The ID of the VPS. This is used to store the ID until the VPS is + * parsed in case its placed after the SPS. + * Since: 1.22 + */ + guint8 vps_id; GstH265VPS *vps; guint8 max_sub_layers_minus1; @@ -1166,7 +1183,7 @@ guint8 strong_intra_smoothing_enabled_flag; guint8 vui_parameters_present_flag; - /* if vui_parameters_present_flat */ + /* if vui_parameters_present_flag */ GstH265VUIParams vui_params; guint8 sps_extension_flag; @@ -1179,7 +1196,12 @@ guint8 sps_extension_4bits; /* if sps_range_extension_flag */ - GstH265SPSExtensionParams sps_extnsion_params; + /** + * _GstH265SPS.sps_extension_params: + * + * Since: 1.22 + */ + GstH265SPSExtensionParams sps_extension_params; /* if sps_scc_extension_flag */ GstH265SPSSccExtensionParams sps_scc_extension_params; @@ -1201,6 +1223,15 @@ { guint id; + /** + * _GstH265PPS.sps_id: + * + * The ID of the SPS. This is used to store the ID until the SPS is + * parsed in case its placed after the PPS. + * + * Since: 1.22 + */ + guint sps_id; GstH265SPS *sps; guint8 dependent_slice_segments_enabled_flag; @@ -1384,6 +1415,9 @@ * in this slice_header\() * @short_term_ref_pic_set_size: the calculated size of short_term_ref_pic_set\() * in bits. (Since: 1.18) + * @long_term_ref_pic_set_size: the calculated size of the branch + * `if( long_term_ref_pics_present_flag )` `inside slice_segment_header()` syntax + * in bits. (Since: 1.22) */ struct _GstH265SliceHdr { @@ -1460,8 +1494,19 @@ /* Number of emulation prevention bytes (EPB) in this slice_header() */ guint n_emulation_prevention_bytes; - /* Size of short_term_ref_pic_set() in bits */ + /* Size of short_term_ref_pic_set() after emulation preventation bytes are + * removed, in bits */ guint short_term_ref_pic_set_size; + + /** + * _GstH265SliceHdr.long_term_ref_pic_set_size: + * + * The calculated size of the branch `if( long_term_ref_pics_present_flag )` + * inside `slice_segment_header()` syntax in bits. + * + * Since: 1.22 + */ + guint long_term_ref_pic_set_size; }; struct _GstH265PicTiming @@ -1653,6 +1698,15 @@ GstH265NalUnit * nalu); GST_CODEC_PARSERS_API +GstH265ParserResult gst_h265_parser_identify_and_split_nalu_hevc (GstH265Parser * parser, + const guint8 * data, + guint offset, + gsize size, + guint8 nal_length_size, + GArray * nalus, + gsize * consumed); + +GST_CODEC_PARSERS_API GstH265ParserResult gst_h265_parser_parse_nal (GstH265Parser * parser, GstH265NalUnit * nalu);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecparsers/gstvp9parser.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/gstvp9parser.c
Changed
@@ -646,6 +646,7 @@ return NULL; parser->priv = priv; + parser->subsampling_x = parser->subsampling_y = -1; return parser; }
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecparsers/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/meson.build
Changed
@@ -15,7 +15,9 @@ 'dboolhuff.c', 'vp8utils.c', 'gstmpegvideometa.c', - 'gstav1parser.c' + 'gstav1parser.c', + 'gsth264bitwriter.c', + 'gsth265bitwriter.c', ) codecparser_headers = 'codecparsers-prelude.h', @@ -30,7 +32,7 @@ 'gstjpegparser.h', 'gstmpegvideometa.h', 'gstvp9parser.h', - 'gstav1parser.h' + 'gstav1parser.h', install_headers(codecparser_headers, subdir : 'gstreamer-1.0/gst/codecparsers') @@ -67,5 +69,5 @@ include_directories : libsinc, dependencies : gstbase_dep) -libraries += pkg_name, {'lib': gstcodecparsers} +gst_libraries += pkg_name, {'lib': gstcodecparsers} meson.override_dependency(pkg_name, gstcodecparsers_dep)
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecparsers/nalutils.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/nalutils.c
Changed
@@ -345,29 +345,15 @@ return TRUE; } -GstMemory * -nal_writer_reset_and_get_memory (NalWriter * nw) +static gpointer +nal_writer_create_nal_data (NalWriter * nw, guint32 * ret_size) { GstBitWriter bw; gint i; guint8 *src, *dst; gsize size; - GstMemory *ret = NULL; gpointer data; - g_return_val_if_fail (nw != NULL, NULL); - - if ((GST_BIT_WRITER_BIT_SIZE (&nw->bw) >> 3) == 0) { - GST_WARNING ("No written byte"); - goto done; - } - - if ((GST_BIT_WRITER_BIT_SIZE (&nw->bw) & 0x7) != 0) { - GST_WARNING ("Written stream is not byte aligned"); - if (!nal_writer_do_rbsp_trailing_bits (nw)) - goto done; - } - /* scan to put emulation_prevention_three_byte */ size = GST_BIT_WRITER_BIT_SIZE (&nw->bw) >> 3; src = GST_BIT_WRITER_DATA (&nw->bw); @@ -388,44 +374,104 @@ gst_bit_writer_put_bits_uint8 (&bw, srci, 8); } - size = bw.bit_size >> 3; + *ret_size = bw.bit_size >> 3; data = gst_bit_writer_reset_and_get_data (&bw); - ret = gst_memory_new_wrapped (0, data, size, 0, size, data, g_free); if (nw->packetized) { - GstMapInfo info; - - gst_memory_map (ret, &info, GST_MAP_WRITE); - - size = info.size - nw->nal_prefix_size; + size = *ret_size - nw->nal_prefix_size; switch (nw->nal_prefix_size) { case 1: - GST_WRITE_UINT8 (info.data, size); + GST_WRITE_UINT8 (data, size); break; case 2: - GST_WRITE_UINT16_BE (info.data, size); + GST_WRITE_UINT16_BE (data, size); break; case 3: - GST_WRITE_UINT24_BE (info.data, size); + GST_WRITE_UINT24_BE (data, size); break; case 4: - GST_WRITE_UINT32_BE (info.data, size); + GST_WRITE_UINT32_BE (data, size); break; default: g_assert_not_reached (); break; } + } - gst_memory_unmap (ret, &info); + return data; +} + +GstMemory * +nal_writer_reset_and_get_memory (NalWriter * nw) +{ + guint32 size = 0; + GstMemory *ret = NULL; + gpointer data; + + g_return_val_if_fail (nw != NULL, NULL); + + if ((GST_BIT_WRITER_BIT_SIZE (&nw->bw) >> 3) == 0) { + GST_WARNING ("No written byte"); + goto done; } + if ((GST_BIT_WRITER_BIT_SIZE (&nw->bw) & 0x7) != 0) { + GST_WARNING ("Written stream is not byte aligned"); + if (!nal_writer_do_rbsp_trailing_bits (nw)) + goto done; + } + + data = nal_writer_create_nal_data (nw, &size); + if (!data) { + GST_WARNING ("Failed to create nal data"); + goto done; + } + + ret = gst_memory_new_wrapped (0, data, size, 0, size, data, g_free); + done: gst_bit_writer_reset (&nw->bw); return ret; } +guint8 * +nal_writer_reset_and_get_data (NalWriter * nw, guint32 * ret_size) +{ + guint32 size = 0; + guint8 *data = NULL; + + g_return_val_if_fail (nw != NULL, NULL); + g_return_val_if_fail (ret_size != NULL, NULL); + + *ret_size = 0; + + if ((GST_BIT_WRITER_BIT_SIZE (&nw->bw) >> 3) == 0) { + GST_WARNING ("No written byte"); + goto done; + } + + if ((GST_BIT_WRITER_BIT_SIZE (&nw->bw) & 0x7) != 0) { + GST_WARNING ("Written stream is not byte aligned"); + if (!nal_writer_do_rbsp_trailing_bits (nw)) + goto done; + } + + data = nal_writer_create_nal_data (nw, &size); + if (!data) { + GST_WARNING ("Failed to create nal data"); + goto done; + } + + *ret_size = size; + +done: + gst_bit_writer_reset (&nw->bw); + + return data; +} + gboolean nal_writer_put_bits_uint8 (NalWriter * nw, guint8 value, guint nbits) {
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecparsers/nalutils.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecparsers/nalutils.h
Changed
@@ -209,6 +209,9 @@ GstMemory * nal_writer_reset_and_get_memory (NalWriter * nw); G_GNUC_INTERNAL +guint8 * nal_writer_reset_and_get_data (NalWriter * nw, guint32 * ret_size); + +G_GNUC_INTERNAL gboolean nal_writer_put_bits_uint8 (NalWriter * nw, guint8 value, guint nbits); G_GNUC_INTERNAL
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstav1decoder.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstav1decoder.c
Changed
@@ -29,6 +29,7 @@ #include <config.h> #endif +#include <gst/base/base.h> #include "gstav1decoder.h" GST_DEBUG_CATEGORY (gst_av1_decoder_debug); @@ -43,8 +44,23 @@ GstAV1Dpb *dpb; GstAV1Picture *current_picture; GstVideoCodecFrame *current_frame; + + guint preferred_output_delay; + GstQueueArray *output_queue; + gboolean is_live; + + gboolean input_state_changed; }; +typedef struct +{ + /* Holds ref */ + GstVideoCodecFrame *frame; + GstAV1Picture *picture; + /* Without ref */ + GstAV1Decoder *self; +} GstAV1DecoderOutputFrame; + #define parent_class gst_av1_decoder_parent_class G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstAV1Decoder, gst_av1_decoder, GST_TYPE_VIDEO_DECODER, @@ -64,43 +80,63 @@ return s - 1; } +static void gst_av1_decoder_finalize (GObject * object); static gboolean gst_av1_decoder_start (GstVideoDecoder * decoder); static gboolean gst_av1_decoder_stop (GstVideoDecoder * decoder); static gboolean gst_av1_decoder_set_format (GstVideoDecoder * decoder, GstVideoCodecState * state); +static gboolean gst_av1_decoder_negotiate (GstVideoDecoder * decoder); static GstFlowReturn gst_av1_decoder_finish (GstVideoDecoder * decoder); static gboolean gst_av1_decoder_flush (GstVideoDecoder * decoder); static GstFlowReturn gst_av1_decoder_drain (GstVideoDecoder * decoder); static GstFlowReturn gst_av1_decoder_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame); - -static GstAV1Picture *gst_av1_decoder_duplicate_picture_default (GstAV1Decoder * - decoder, GstAV1Picture * picture); +static void +gst_av1_decoder_clear_output_frame (GstAV1DecoderOutputFrame * output_frame); static void gst_av1_decoder_class_init (GstAV1DecoderClass * klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_CLASS (klass); + object_class->finalize = gst_av1_decoder_finalize; + decoder_class->start = GST_DEBUG_FUNCPTR (gst_av1_decoder_start); decoder_class->stop = GST_DEBUG_FUNCPTR (gst_av1_decoder_stop); decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_av1_decoder_set_format); + decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_av1_decoder_negotiate); decoder_class->finish = GST_DEBUG_FUNCPTR (gst_av1_decoder_finish); decoder_class->flush = GST_DEBUG_FUNCPTR (gst_av1_decoder_flush); decoder_class->drain = GST_DEBUG_FUNCPTR (gst_av1_decoder_drain); decoder_class->handle_frame = GST_DEBUG_FUNCPTR (gst_av1_decoder_handle_frame); - - klass->duplicate_picture = - GST_DEBUG_FUNCPTR (gst_av1_decoder_duplicate_picture_default); } static void gst_av1_decoder_init (GstAV1Decoder * self) { + GstAV1DecoderPrivate *priv; + gst_video_decoder_set_packetized (GST_VIDEO_DECODER (self), TRUE); - self->priv = gst_av1_decoder_get_instance_private (self); + self->priv = priv = gst_av1_decoder_get_instance_private (self); + + priv->output_queue = + gst_queue_array_new_for_struct (sizeof (GstAV1DecoderOutputFrame), 1); + gst_queue_array_set_clear_func (priv->output_queue, + (GDestroyNotify) gst_av1_decoder_clear_output_frame); +} + +static void +gst_av1_decoder_finalize (GObject * object) +{ + GstAV1Decoder *self = GST_AV1_DECODER (object); + GstAV1DecoderPrivate *priv = self->priv; + + gst_queue_array_free (priv->output_queue); + + G_OBJECT_CLASS (parent_class)->finalize (object); } static void @@ -108,9 +144,11 @@ { GstAV1DecoderPrivate *priv = self->priv; + self->highest_spatial_layer = 0; + priv->max_width = 0; priv->max_height = 0; - gst_av1_picture_clear (&priv->current_picture); + gst_clear_av1_picture (&priv->current_picture); priv->current_frame = NULL; priv->profile = GST_AV1_PROFILE_UNDEFINED; @@ -118,6 +156,8 @@ gst_av1_dpb_clear (priv->dpb); if (priv->parser) gst_av1_parser_reset (priv->parser, FALSE); + + gst_queue_array_clear (priv->output_queue); } static gboolean @@ -149,15 +189,33 @@ return TRUE; } +static void +gst_av1_decoder_clear_output_frame (GstAV1DecoderOutputFrame * output_frame) +{ + if (!output_frame) + return; + + if (output_frame->frame) { + gst_video_decoder_release_frame (GST_VIDEO_DECODER (output_frame->self), + output_frame->frame); + output_frame->frame = NULL; + } + + gst_clear_av1_picture (&output_frame->picture); +} + static gboolean gst_av1_decoder_set_format (GstVideoDecoder * decoder, GstVideoCodecState * state) { GstAV1Decoder *self = GST_AV1_DECODER (decoder); GstAV1DecoderPrivate *priv = self->priv; + GstQuery *query; GST_DEBUG_OBJECT (decoder, "Set format"); + priv->input_state_changed = TRUE; + if (self->input_state) gst_video_codec_state_unref (self->input_state); @@ -166,17 +224,58 @@ priv->max_width = GST_VIDEO_INFO_WIDTH (&state->info); priv->max_height = GST_VIDEO_INFO_HEIGHT (&state->info); + priv->is_live = FALSE; + query = gst_query_new_latency (); + if (gst_pad_peer_query (GST_VIDEO_DECODER_SINK_PAD (self), query)) + gst_query_parse_latency (query, &priv->is_live, NULL, NULL); + gst_query_unref (query); + return TRUE; } +static gboolean +gst_av1_decoder_negotiate (GstVideoDecoder * decoder) +{ + GstAV1Decoder *self = GST_AV1_DECODER (decoder); + + /* output state must be updated by subclass using new input state already */ + self->priv->input_state_changed = FALSE; + + return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); +} + +static void +gst_av1_decoder_drain_output_queue (GstAV1Decoder * self, + guint num, GstFlowReturn * ret) +{ + GstAV1DecoderClass *klass = GST_AV1_DECODER_GET_CLASS (self); + GstAV1DecoderPrivate *priv = self->priv; + + g_assert (klass->output_picture); + + while (gst_queue_array_get_length (priv->output_queue) > num) { + GstAV1DecoderOutputFrame *output_frame = (GstAV1DecoderOutputFrame *) + gst_queue_array_pop_head_struct (priv->output_queue); + GstFlowReturn flow_ret = klass->output_picture (self, + output_frame->frame, output_frame->picture); + + if (*ret == GST_FLOW_OK) + *ret = flow_ret; + } +} + static GstFlowReturn gst_av1_decoder_finish (GstVideoDecoder * decoder) { + GstAV1Decoder *self = GST_AV1_DECODER (decoder); + GstFlowReturn ret = GST_FLOW_OK; + GST_DEBUG_OBJECT (decoder, "finish"); - gst_av1_decoder_reset (GST_AV1_DECODER (decoder)); + gst_av1_decoder_drain_output_queue (self, 0, &ret); + gst_av1_decoder_reset (self); - return GST_FLOW_OK; + return ret; } static gboolean @@ -192,22 +291,15 @@ static GstFlowReturn gst_av1_decoder_drain (GstVideoDecoder * decoder) { - GST_DEBUG_OBJECT (decoder, "drain"); - - gst_av1_decoder_reset (GST_AV1_DECODER (decoder)); - - return GST_FLOW_OK; -} + GstAV1Decoder *self = GST_AV1_DECODER (decoder); + GstFlowReturn ret = GST_FLOW_OK; -static GstAV1Picture * -gst_av1_decoder_duplicate_picture_default (GstAV1Decoder * decoder, - GstAV1Picture * picture) -{ - GstAV1Picture *new_picture; + GST_DEBUG_OBJECT (decoder, "drain"); - new_picture = gst_av1_picture_new (); + gst_av1_decoder_drain_output_queue (self, 0, &ret); + gst_av1_decoder_reset (self); - return new_picture; + return ret; } static const gchar * @@ -290,7 +382,33 @@ priv->max_width, priv->max_height, seq_header.max_frame_width_minus_1 + 1, seq_header.max_frame_height_minus_1 + 1); - ret = klass->new_sequence (self, &seq_header); + gst_av1_decoder_drain_output_queue (self, 0, &ret); + gst_av1_dpb_clear (priv->dpb); + + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (self, "Draining for new sequence returned %s", + gst_flow_get_name (ret)); + return ret; + } + + if (klass->get_preferred_output_delay) { + priv->preferred_output_delay = + klass->get_preferred_output_delay (self, priv->is_live); + } else { + priv->preferred_output_delay = 0; + } + + if (priv->parser->state.operating_point_idc) { + self->highest_spatial_layer = + _floor_log2 (priv->parser->state.operating_point_idc >> 8); + GST_INFO_OBJECT (self, "set highest spatial layer to %d", + self->highest_spatial_layer); + } else { + self->highest_spatial_layer = 0; + } + + ret = klass->new_sequence (self, &seq_header, + GST_AV1_TOTAL_REFS_PER_FRAME + priv->preferred_output_delay); if (ret != GST_FLOW_OK) { GST_ERROR_OBJECT (self, "subclass does not want accept new sequence"); return ret; @@ -299,7 +417,6 @@ priv->profile = seq_header.seq_profile; priv->max_width = seq_header.max_frame_width_minus_1 + 1; priv->max_height = seq_header.max_frame_height_minus_1 + 1; - gst_av1_dpb_clear (priv->dpb); return GST_FLOW_OK; } @@ -339,7 +456,7 @@ static GstFlowReturn gst_av1_decoder_decode_frame_header (GstAV1Decoder * self, - GstAV1FrameHeaderOBU * frame_header) + GstAV1OBU * obu, GstAV1FrameHeaderOBU * frame_header) { GstAV1DecoderPrivate *priv = self->priv; GstAV1DecoderClass *klass = GST_AV1_DECODER_GET_CLASS (self); @@ -363,25 +480,17 @@ return GST_FLOW_ERROR; } - if (gst_av1_parser_reference_frame_loading (priv->parser, - &ref_picture->frame_hdr) != GST_AV1_PARSER_OK) { - GST_WARNING_OBJECT (self, "load the reference frame failed"); - return GST_FLOW_ERROR; - } - - /* FIXME: duplicate picture might be optional feature like that of VP9 - * decoder baseclass */ + /* The duplicated picture, if a key frame, will be placed in the DPB and + * for this reason is not optional. */ g_assert (klass->duplicate_picture); - picture = klass->duplicate_picture (self, ref_picture); + picture = klass->duplicate_picture (self, priv->current_frame, ref_picture); if (!picture) { GST_ERROR_OBJECT (self, "subclass didn't provide duplicated picture"); return GST_FLOW_ERROR; } - picture->system_frame_number = priv->current_frame->system_frame_number; + picture->system_frame_number = ref_picture->system_frame_number; picture->frame_hdr = *frame_header; - picture->frame_hdr.render_width = ref_picture->frame_hdr.render_width; - picture->frame_hdr.render_height = ref_picture->frame_hdr.render_height; priv->current_picture = picture; } else { picture = gst_av1_picture_new (); @@ -391,6 +500,11 @@ picture->showable_frame = frame_header->showable_frame; picture->apply_grain = frame_header->film_grain_params.apply_grain; picture->system_frame_number = priv->current_frame->system_frame_number; + picture->temporal_id = obu->header.obu_temporal_id; + picture->spatial_id = obu->header.obu_spatial_id; + + g_assert (picture->spatial_id <= self->highest_spatial_layer); + g_assert (self->highest_spatial_layer < GST_AV1_MAX_NUM_SPATIAL_LAYERS); if (!frame_header->show_frame && !frame_header->showable_frame) GST_VIDEO_CODEC_FRAME_FLAG_SET (priv->current_frame, @@ -433,7 +547,7 @@ return GST_FLOW_ERROR; } - return gst_av1_decoder_decode_frame_header (self, &frame_header); + return gst_av1_decoder_decode_frame_header (self, obu, &frame_header); } static GstFlowReturn @@ -466,7 +580,7 @@ return GST_FLOW_ERROR; } - ret = gst_av1_decoder_decode_frame_header (self, &frame.frame_header); + ret = gst_av1_decoder_decode_frame_header (self, obu, &frame.frame_header); if (ret != GST_FLOW_OK) return ret; @@ -581,6 +695,11 @@ while (total_consumed < map.size) { res = gst_av1_parser_identify_one_obu (priv->parser, map.data + total_consumed, map.size, &obu, &consumed); + if (res == GST_AV1_PARSER_DROP) { + total_consumed += consumed; + continue; + } + if (res != GST_AV1_PARSER_OK) { ret = GST_FLOW_ERROR; goto out; @@ -600,6 +719,15 @@ goto out; } + if (priv->current_picture->spatial_id > self->highest_spatial_layer) { + ret = GST_FLOW_ERROR; + GST_VIDEO_DECODER_ERROR (self, 1, STREAM, DECODE, + ("current picture spatial_id %d should not be higher than " + "highest spatial layer %d", priv->current_picture->spatial_id, + self->highest_spatial_layer), (NULL), ret); + goto out; + } + if (!priv->current_picture->frame_hdr.show_existing_frame) { if (klass->end_picture) { ret = klass->end_picture (self, priv->current_picture); @@ -621,15 +749,25 @@ /* Only output one frame with the highest spatial id from each TU * when there are multiple spatial layers. */ - if (priv->parser->state.operating_point_idc && - obu.header.obu_spatial_id < - _floor_log2 (priv->parser->state.operating_point_idc >> 8)) { + if (obu.header.obu_spatial_id < self->highest_spatial_layer) { gst_av1_picture_unref (priv->current_picture); gst_video_decoder_release_frame (decoder, frame); } else { - g_assert (klass->output_picture); - /* transfer ownership of frame and picture */ - ret = klass->output_picture (self, frame, priv->current_picture); + GstAV1DecoderOutputFrame output_frame; + + /* If subclass didn't update output state at this point, + * marking this picture as a discont and stores current input state */ + if (priv->input_state_changed) { + priv->current_picture->discont_state = + gst_video_codec_state_ref (self->input_state); + priv->input_state_changed = FALSE; + } + + output_frame.frame = frame; + output_frame.picture = priv->current_picture; + output_frame.self = self; + + gst_queue_array_push_tail_struct (priv->output_queue, &output_frame); } } else { GST_LOG_OBJECT (self, "Decode only picture %p", priv->current_picture); @@ -644,6 +782,8 @@ gst_video_decoder_drop_frame (decoder, frame); } + gst_av1_decoder_drain_output_queue (self, priv->preferred_output_delay, &ret); + priv->current_picture = NULL; priv->current_frame = NULL;
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstav1decoder.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstav1decoder.h
Changed
@@ -53,6 +53,7 @@ /*< protected >*/ GstVideoCodecState * input_state; + guint highest_spatial_layer; /*< private >*/ GstAV1DecoderPrivate *priv; @@ -70,13 +71,16 @@ * GstAV1DecoderClass::new_sequence: * @decoder: a #GstAV1Decoder * @seq_hdr: a #GstAV1SequenceHeaderOBU + * @max_dpb_size: the size of dpb including preferred output delay + * by subclass reported via get_preferred_output_delay method. * * Notifies subclass of SPS update * * Since: 1.20 */ GstFlowReturn (*new_sequence) (GstAV1Decoder * decoder, - const GstAV1SequenceHeaderOBU * seq_hdr); + const GstAV1SequenceHeaderOBU * seq_hdr, + gint max_dpb_size); /** * GstAV1DecoderClass::new_picture: * @decoder: a #GstAV1Decoder @@ -96,13 +100,16 @@ * GstAV1DecoderClass::duplicate_picture: * @decoder: a #GstAV1Decoder * @picture: (transfer none): a #GstAV1Picture + * @frame: (transfer none): the current #GstVideoCodecFrame * - * Optional. Called when need to duplicate an existing - * #GstAV1Picture. + * Called when need to duplicate an existing #GstAV1Picture. As + * duplicated key-frame will populate the DPB, this virtual + * function is not optional. * - * Since: 1.20 + * Since: 1.22 */ GstAV1Picture * (*duplicate_picture) (GstAV1Decoder * decoder, + GstVideoCodecFrame * frame, GstAV1Picture * picture); /** * GstAV1DecoderClass::start_picture: @@ -159,6 +166,21 @@ GstVideoCodecFrame * frame, GstAV1Picture * picture); + /** + * GstAV1DecoderClass::get_preferred_output_delay: + * @decoder: a #GstAV1Decoder + * @live: whether upstream is live or not + * + * Optional. Called by baseclass to query whether delaying output is + * preferred by subclass or not. + * + * Returns: the number of perferred delayed output frame + * + * Since: 1.22 + */ + guint (*get_preferred_output_delay) (GstAV1Decoder * decoder, + gboolean live); + /*< private >*/ gpointer paddingGST_PADDING_LARGE; };
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstav1picture.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstav1picture.c
Changed
@@ -36,6 +36,9 @@ if (picture->notify) picture->notify (picture->user_data); + if (picture->discont_state) + gst_video_codec_state_unref (picture->discont_state); + g_free (picture); } @@ -160,7 +163,7 @@ g_return_if_fail (dpb != NULL); for (i = 0; i < GST_AV1_NUM_REF_FRAMES; i++) - gst_av1_picture_clear (&dpb->pic_listi); + gst_clear_av1_picture (&dpb->pic_listi); } /**
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstav1picture.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstav1picture.h
Changed
@@ -22,6 +22,7 @@ #include <gst/codecs/codecs-prelude.h> #include <gst/codecparsers/gstav1parser.h> +#include <gst/video/video.h> G_BEGIN_DECLS @@ -66,6 +67,7 @@ */ struct _GstAV1Picture { + /*< private >*/ GstMiniObject parent; /* From GstVideoCodecFrame */ @@ -73,12 +75,19 @@ GstAV1FrameHeaderOBU frame_hdr; + /* from OBU header */ + guint8 temporal_id; + guint8 spatial_id; + /* copied from parser */ guint32 display_frame_id; gboolean show_frame; gboolean showable_frame; gboolean apply_grain; + /* decoder input state if this picture is discont point */ + GstVideoCodecState *discont_state; + gpointer user_data; GDestroyNotify notify; }; @@ -110,7 +119,7 @@ } static inline void -gst_av1_picture_clear (GstAV1Picture ** picture) +gst_clear_av1_picture (GstAV1Picture ** picture) { if (picture && *picture) { gst_av1_picture_unref (*picture);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gsth264decoder.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gsth264decoder.c
Changed
@@ -85,8 +85,6 @@ guint8 profile_idc; gint width, height; - /* input codec_data, if any */ - GstBuffer *codec_data; guint nal_length_size; /* state */ @@ -152,6 +150,8 @@ /* For delayed output */ GstQueueArray *output_queue; + + gboolean input_state_changed; }; typedef struct @@ -181,6 +181,7 @@ static gboolean gst_h264_decoder_stop (GstVideoDecoder * decoder); static gboolean gst_h264_decoder_set_format (GstVideoDecoder * decoder, GstVideoCodecState * state); +static gboolean gst_h264_decoder_negotiate (GstVideoDecoder * decoder); static GstFlowReturn gst_h264_decoder_finish (GstVideoDecoder * decoder); static gboolean gst_h264_decoder_flush (GstVideoDecoder * decoder); static GstFlowReturn gst_h264_decoder_drain (GstVideoDecoder * decoder); @@ -309,6 +310,7 @@ decoder_class->start = GST_DEBUG_FUNCPTR (gst_h264_decoder_start); decoder_class->stop = GST_DEBUG_FUNCPTR (gst_h264_decoder_stop); decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_h264_decoder_set_format); + decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_h264_decoder_negotiate); decoder_class->finish = GST_DEBUG_FUNCPTR (gst_h264_decoder_finish); decoder_class->flush = GST_DEBUG_FUNCPTR (gst_h264_decoder_flush); decoder_class->drain = GST_DEBUG_FUNCPTR (gst_h264_decoder_drain); @@ -346,32 +348,32 @@ priv->ref_pic_list_p0 = g_array_sized_new (FALSE, TRUE, sizeof (GstH264Picture *), 32); g_array_set_clear_func (priv->ref_pic_list_p0, - (GDestroyNotify) gst_h264_picture_clear); + (GDestroyNotify) gst_clear_h264_picture); priv->ref_pic_list_b0 = g_array_sized_new (FALSE, TRUE, sizeof (GstH264Picture *), 32); g_array_set_clear_func (priv->ref_pic_list_b0, - (GDestroyNotify) gst_h264_picture_clear); + (GDestroyNotify) gst_clear_h264_picture); priv->ref_pic_list_b1 = g_array_sized_new (FALSE, TRUE, sizeof (GstH264Picture *), 32); g_array_set_clear_func (priv->ref_pic_list_b1, - (GDestroyNotify) gst_h264_picture_clear); + (GDestroyNotify) gst_clear_h264_picture); priv->ref_frame_list_0_short_term = g_array_sized_new (FALSE, TRUE, sizeof (GstH264Picture *), 32); g_array_set_clear_func (priv->ref_frame_list_0_short_term, - (GDestroyNotify) gst_h264_picture_clear); + (GDestroyNotify) gst_clear_h264_picture); priv->ref_frame_list_1_short_term = g_array_sized_new (FALSE, TRUE, sizeof (GstH264Picture *), 32); g_array_set_clear_func (priv->ref_frame_list_1_short_term, - (GDestroyNotify) gst_h264_picture_clear); + (GDestroyNotify) gst_clear_h264_picture); priv->ref_frame_list_long_term = g_array_sized_new (FALSE, TRUE, sizeof (GstH264Picture *), 32); g_array_set_clear_func (priv->ref_frame_list_long_term, - (GDestroyNotify) gst_h264_picture_clear); + (GDestroyNotify) gst_clear_h264_picture); priv->ref_pic_list0 = g_array_sized_new (FALSE, TRUE, sizeof (GstH264Picture *), 32); @@ -408,11 +410,10 @@ { GstH264DecoderPrivate *priv = self->priv; - gst_clear_buffer (&priv->codec_data); g_clear_pointer (&self->input_state, gst_video_codec_state_unref); g_clear_pointer (&priv->parser, gst_h264_nal_parser_free); g_clear_pointer (&priv->dpb, gst_h264_dpb_free); - gst_h264_picture_clear (&priv->last_field); + gst_clear_h264_picture (&priv->last_field); priv->profile_idc = 0; priv->width = 0; @@ -456,7 +457,7 @@ output_frame->frame = NULL; } - gst_h264_picture_clear (&output_frame->picture); + gst_clear_h264_picture (&output_frame->picture); } static void @@ -481,7 +482,7 @@ gst_queue_array_clear (priv->output_queue); gst_h264_decoder_clear_ref_pic_lists (self); - gst_h264_picture_clear (&priv->last_field); + gst_clear_h264_picture (&priv->last_field); gst_h264_dpb_clear (priv->dpb); priv->last_output_poc = G_MININT32; } @@ -569,7 +570,7 @@ } gst_video_decoder_drop_frame (decoder, frame); - gst_h264_picture_clear (&priv->current_picture); + gst_clear_h264_picture (&priv->current_picture); priv->current_frame = NULL; return decode_ret; @@ -652,82 +653,48 @@ gsize size) { GstH264DecoderPrivate *priv = self->priv; - guint num_sps, num_pps; - guint off; - gint i; - GstH264ParserResult pres; - GstH264NalUnit nalu; + GstH264DecoderConfigRecord *config = NULL; GstFlowReturn ret = GST_FLOW_OK; -#ifndef GST_DISABLE_GST_DEBUG - guint profile; -#endif + GstH264NalUnit *nalu; + guint i; - /* parse the avcC data */ - if (size < 7) { /* when numSPS==0 and numPPS==0, length is 7 bytes */ + if (gst_h264_parser_parse_decoder_config_record (priv->parser, data, size, + &config) != GST_H264_PARSER_OK) { + GST_WARNING_OBJECT (self, "Failed to parse codec-data"); return GST_FLOW_ERROR; } - /* parse the version, this must be 1 */ - if (data0 != 1) { - return GST_FLOW_ERROR; - } -#ifndef GST_DISABLE_GST_DEBUG - /* AVCProfileIndication */ - /* profile_compat */ - /* AVCLevelIndication */ - profile = (data1 << 16) | (data2 << 8) | data3; - GST_DEBUG_OBJECT (self, "profile %06x", profile); -#endif - - /* 6 bits reserved | 2 bits lengthSizeMinusOne */ - /* this is the number of bytes in front of the NAL units to mark their - * length */ - priv->nal_length_size = (data4 & 0x03) + 1; - GST_DEBUG_OBJECT (self, "nal length size %u", priv->nal_length_size); - - num_sps = data5 & 0x1f; - off = 6; - for (i = 0; i < num_sps; i++) { - pres = gst_h264_parser_identify_nalu_avc (priv->parser, - data, off, size, 2, &nalu); - if (pres != GST_H264_PARSER_OK) { - GST_WARNING_OBJECT (self, "Failed to identify SPS nalu"); - return GST_FLOW_ERROR; - } + priv->nal_length_size = config->length_size_minus_one + 1; + for (i = 0; i < config->sps->len; i++) { + nalu = &g_array_index (config->sps, GstH264NalUnit, i); + + /* TODO: handle subset sps for SVC/MVC. That would need to be stored in + * separate array instead of putting SPS/subset-SPS into a single array */ + if (nalu->type != GST_H264_NAL_SPS) + continue; - ret = gst_h264_decoder_parse_sps (self, &nalu); + ret = gst_h264_decoder_parse_sps (self, nalu); if (ret != GST_FLOW_OK) { GST_WARNING_OBJECT (self, "Failed to parse SPS"); - return ret; + goto out; } - off = nalu.offset + nalu.size; } - if (off >= size) { - GST_WARNING_OBJECT (self, "Too small avcC"); - return GST_FLOW_ERROR; - } - - num_pps = dataoff; - off++; - - for (i = 0; i < num_pps; i++) { - pres = gst_h264_parser_identify_nalu_avc (priv->parser, - data, off, size, 2, &nalu); - if (pres != GST_H264_PARSER_OK) { - GST_WARNING_OBJECT (self, "Failed to identify PPS nalu"); - return GST_FLOW_ERROR; - } + for (i = 0; i < config->pps->len; i++) { + nalu = &g_array_index (config->pps, GstH264NalUnit, i); + if (nalu->type != GST_H264_NAL_PPS) + continue; - ret = gst_h264_decoder_parse_pps (self, &nalu); + ret = gst_h264_decoder_parse_pps (self, nalu); if (ret != GST_FLOW_OK) { GST_WARNING_OBJECT (self, "Failed to parse PPS"); - return ret; + goto out; } - off = nalu.offset + nalu.size; } - return GST_FLOW_OK; +out: + gst_h264_decoder_config_record_free (config); + return ret; } static gboolean @@ -823,6 +790,7 @@ other_field->ref = picture->ref; other_field->nonexisting = picture->nonexisting; other_field->system_frame_number = picture->system_frame_number; + other_field->field_pic_flag = picture->field_pic_flag; return other_field; } @@ -862,7 +830,7 @@ priv->last_field, priv->last_field->pic_order_cnt, picture, picture->pic_order_cnt); - gst_h264_picture_clear (&priv->last_field); + gst_clear_h264_picture (&priv->last_field); flow_ret = GST_FLOW_ERROR; goto output; } @@ -884,7 +852,7 @@ gst_h264_decoder_do_output_picture (self, out_pic, &flow_ret); } - gst_h264_picture_clear (&picture); + gst_clear_h264_picture (&picture); UPDATE_FLOW_RETURN (ret, flow_ret); } @@ -1059,6 +1027,14 @@ g_assert (priv->active_sps != NULL); g_assert (priv->active_pps != NULL); + /* If subclass didn't update output state at this point, + * marking this picture as a discont and stores current input state */ + if (priv->input_state_changed) { + priv->current_picture->discont_state = + gst_video_codec_state_ref (self->input_state); + priv->input_state_changed = FALSE; + } + sps = priv->active_sps; priv->max_frame_num = sps->max_frame_num; @@ -1216,7 +1192,7 @@ error: if (!in_dpb) { - gst_h264_picture_clear (&priv->last_field); + gst_clear_h264_picture (&priv->last_field); } else { /* FIXME: implement fill gap field picture if it is already in DPB */ } @@ -1405,6 +1381,8 @@ GST_DEBUG_OBJECT (decoder, "Set format"); + priv->input_state_changed = TRUE; + if (self->input_state) gst_video_codec_state_unref (self->input_state); @@ -1421,26 +1399,14 @@ GST_DEBUG_OBJECT (self, "Live source, will run on low-latency mode"); if (state->caps) { - GstStructure *str; - const GValue *codec_data_value; GstH264DecoderFormat format; GstH264DecoderAlign align; gst_h264_decoder_format_from_caps (self, state->caps, &format, &align); - str = gst_caps_get_structure (state->caps, 0); - codec_data_value = gst_structure_get_value (str, "codec_data"); - - if (GST_VALUE_HOLDS_BUFFER (codec_data_value)) { - gst_buffer_replace (&priv->codec_data, - gst_value_get_buffer (codec_data_value)); - } else { - gst_buffer_replace (&priv->codec_data, NULL); - } - if (format == GST_H264_DECODER_FORMAT_NONE) { /* codec_data implies avc */ - if (codec_data_value != NULL) { + if (state->codec_data) { GST_WARNING_OBJECT (self, "video/x-h264 caps with codec_data but no stream-format=avc"); format = GST_H264_DECODER_FORMAT_AVC; @@ -1454,7 +1420,7 @@ if (format == GST_H264_DECODER_FORMAT_AVC) { /* AVC requires codec_data, AVC3 might have one and/or SPS/PPS inline */ - if (codec_data_value == NULL) { + if (!state->codec_data) { /* Try it with size 4 anyway */ priv->nal_length_size = 4; GST_WARNING_OBJECT (self, @@ -1466,33 +1432,41 @@ align = GST_H264_DECODER_ALIGN_AU; } - if (format == GST_H264_DECODER_FORMAT_BYTE) { - if (codec_data_value != NULL) { - GST_WARNING_OBJECT (self, "bytestream with codec data"); - } - } + if (format == GST_H264_DECODER_FORMAT_BYTE && state->codec_data) + GST_WARNING_OBJECT (self, "bytestream with codec data"); priv->in_format = format; priv->align = align; } - if (priv->codec_data) { + if (state->codec_data) { GstMapInfo map; - gst_buffer_map (priv->codec_data, &map, GST_MAP_READ); + gst_buffer_map (state->codec_data, &map, GST_MAP_READ); if (gst_h264_decoder_parse_codec_data (self, map.data, map.size) != GST_FLOW_OK) { /* keep going without error. * Probably inband SPS/PPS might be valid data */ GST_WARNING_OBJECT (self, "Failed to handle codec data"); } - gst_buffer_unmap (priv->codec_data, &map); + gst_buffer_unmap (state->codec_data, &map); } return TRUE; } static gboolean +gst_h264_decoder_negotiate (GstVideoDecoder * decoder) +{ + GstH264Decoder *self = GST_H264_DECODER (decoder); + + /* output state must be updated by subclass using new input state already */ + self->priv->input_state_changed = FALSE; + + return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); +} + +static gboolean gst_h264_decoder_fill_picture_from_slice (GstH264Decoder * self, const GstH264Slice * slice, GstH264Picture * picture) { @@ -1515,6 +1489,8 @@ picture->idr = slice->nalu.idr_pic_flag; picture->dec_ref_pic_marking = slice_hdr->dec_ref_pic_marking; + picture->field_pic_flag = slice_hdr->field_pic_flag; + if (picture->idr) picture->idr_pic_id = slice_hdr->idr_pic_id; @@ -1899,7 +1875,7 @@ gst_h264_decoder_drain_output_queue (self, 0, &ret); - gst_h264_picture_clear (&priv->last_field); + gst_clear_h264_picture (&priv->last_field); gst_h264_dpb_clear (priv->dpb); priv->last_output_poc = G_MININT32; @@ -3309,7 +3285,7 @@ * Retrive DPB and return a #GstH264Picture corresponding to * the @system_frame_number * - * Returns: (transfer full): a #GstH264Picture if successful, or %NULL otherwise + * Returns: (transfer full) (nullable): a #GstH264Picture if successful, or %NULL otherwise * * Since: 1.18 */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gsth264decoder.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gsth264decoder.h
Changed
@@ -151,7 +151,7 @@ * Since: 1.20 */ GstFlowReturn (*new_field_picture) (GstH264Decoder * decoder, - const GstH264Picture * first_field, + GstH264Picture * first_field, GstH264Picture * second_field); /**
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gsth264picture.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gsth264picture.c
Changed
@@ -35,6 +35,9 @@ if (picture->notify) picture->notify (picture->user_data); + if (picture->discont_state) + gst_video_codec_state_unref (picture->discont_state); + g_free (picture); } @@ -66,7 +69,7 @@ /** * gst_h264_picture_set_user_data: * @picture: a #GstH264Picture - * @user_data: private data + * @user_data: (nullable): private data * @notify: (closure user_data): a #GDestroyNotify * * Sets @user_data on the picture and the #GDestroyNotify that will be called when @@ -95,7 +98,7 @@ * Gets private data set on the picture via * gst_h264_picture_set_user_data() previously. * - * Returns: (transfer none): The previously set user_data + * Returns: (transfer none) (nullable): The previously set user_data */ gpointer gst_h264_picture_get_user_data (GstH264Picture * picture) @@ -142,7 +145,7 @@ g_array_sized_new (FALSE, TRUE, sizeof (GstH264Picture *), GST_H264_DPB_MAX_SIZE); g_array_set_clear_func (dpb->pic_list, - (GDestroyNotify) gst_h264_picture_clear); + (GDestroyNotify) gst_clear_h264_picture); return dpb; } @@ -461,7 +464,7 @@ * * Find a short term reference picture which has the lowest frame_num_wrap * - * Returns: (transfer full): a #GstH264Picture + * Returns: (transfer full) (nullable): a #GstH264Picture */ GstH264Picture * gst_h264_dpb_get_lowest_frame_num_short_ref (GstH264Dpb * dpb) @@ -593,7 +596,7 @@ * @dpb: a #GstH264Dpb * @system_frame_number The system frame number * - * Returns: (transfer full): the picture identified with the specified + * Returns: (transfer full) (nullable): the picture identified with the specified * @system_frame_number, or %NULL if DPB does not contain a #GstH264Picture * corresponding to the @system_frame_number *
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gsth264picture.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gsth264picture.h
Changed
@@ -142,6 +142,7 @@ gint nal_ref_idc; gboolean idr; gint idr_pic_id; + gboolean field_pic_flag; GstH264PictureReference ref; /* Whether a reference picture. */ gboolean ref_pic; @@ -160,6 +161,9 @@ GstVideoBufferFlags buffer_flags; + /* decoder input state if this picture is discont point */ + GstVideoCodecState *discont_state; + gpointer user_data; GDestroyNotify notify; }; @@ -206,7 +210,7 @@ } static inline void -gst_h264_picture_clear (GstH264Picture ** picture) +gst_clear_h264_picture (GstH264Picture ** picture) { if (picture && *picture) { gst_h264_picture_unref (*picture);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gsth265decoder.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gsth265decoder.c
Changed
@@ -30,6 +30,7 @@ #include <config.h> #endif +#include <gst/base/base.h> #include "gsth265decoder.h" GST_DEBUG_CATEGORY (gst_h265_decoder_debug); @@ -60,8 +61,6 @@ gint crop_rect_x; gint crop_rect_y; - /* input codec_data, if any */ - GstBuffer *codec_data; guint nal_length_size; /* state */ @@ -82,6 +81,8 @@ guint8 cur_source_scan_type; guint8 cur_duplicate_flag; + gboolean no_output_of_prior_pics_flag; + /* vps/sps/pps of the current slice */ const GstH265VPS *active_vps; const GstH265SPS *active_sps; @@ -123,8 +124,39 @@ GArray *ref_pic_list_tmp; GArray *ref_pic_list0; GArray *ref_pic_list1; + + GArray *nalu; + + /* Split packetized data into actual nal chunks (for malformed stream) */ + GArray *split_nalu; + + /* For delayed output */ + guint preferred_output_delay; + gboolean is_live; + GstQueueArray *output_queue; + + gboolean input_state_changed; }; +typedef struct +{ + union + { + GstH265SPS sps; + GstH265Slice slice; + } unit; + gboolean is_slice; +} GstH265DecoderNalUnit; + +typedef struct +{ + /* Holds ref */ + GstVideoCodecFrame *frame; + GstH265Picture *picture; + /* Without ref */ + GstH265Decoder *self; +} GstH265DecoderOutputFrame; + #define UPDATE_FLOW_RETURN(ret,new_ret) G_STMT_START { \ if (*(ret) == GST_FLOW_OK) \ *(ret) = new_ret; \ @@ -143,6 +175,7 @@ static gboolean gst_h265_decoder_stop (GstVideoDecoder * decoder); static gboolean gst_h265_decoder_set_format (GstVideoDecoder * decoder, GstVideoCodecState * state); +static gboolean gst_h265_decoder_negotiate (GstVideoDecoder * decoder); static GstFlowReturn gst_h265_decoder_finish (GstVideoDecoder * decoder); static gboolean gst_h265_decoder_flush (GstVideoDecoder * decoder); static GstFlowReturn gst_h265_decoder_drain (GstVideoDecoder * decoder); @@ -156,6 +189,9 @@ static GstFlowReturn gst_h265_decoder_drain_internal (GstH265Decoder * self); static GstFlowReturn gst_h265_decoder_start_current_picture (GstH265Decoder * self); +static void gst_h265_decoder_clear_nalu (GstH265DecoderNalUnit * nalu); +static void +gst_h265_decoder_clear_output_frame (GstH265DecoderOutputFrame * output_frame); static void gst_h265_decoder_class_init (GstH265DecoderClass * klass) @@ -168,6 +204,7 @@ decoder_class->start = GST_DEBUG_FUNCPTR (gst_h265_decoder_start); decoder_class->stop = GST_DEBUG_FUNCPTR (gst_h265_decoder_stop); decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_h265_decoder_set_format); + decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_h265_decoder_negotiate); decoder_class->finish = GST_DEBUG_FUNCPTR (gst_h265_decoder_finish); decoder_class->flush = GST_DEBUG_FUNCPTR (gst_h265_decoder_flush); decoder_class->drain = GST_DEBUG_FUNCPTR (gst_h265_decoder_drain); @@ -192,6 +229,15 @@ sizeof (GstH265Picture *), 32); priv->ref_pic_list1 = g_array_sized_new (FALSE, TRUE, sizeof (GstH265Picture *), 32); + priv->nalu = g_array_sized_new (FALSE, TRUE, sizeof (GstH265DecoderNalUnit), + 8); + priv->split_nalu = g_array_new (FALSE, FALSE, sizeof (GstH265NalUnit)); + g_array_set_clear_func (priv->nalu, + (GDestroyNotify) gst_h265_decoder_clear_nalu); + priv->output_queue = + gst_queue_array_new_for_struct (sizeof (GstH265DecoderOutputFrame), 1); + gst_queue_array_set_clear_func (priv->output_queue, + (GDestroyNotify) gst_h265_decoder_clear_output_frame); } static void @@ -203,6 +249,9 @@ g_array_unref (priv->ref_pic_list_tmp); g_array_unref (priv->ref_pic_list0); g_array_unref (priv->ref_pic_list1); + g_array_unref (priv->nalu); + g_array_unref (priv->split_nalu); + gst_queue_array_free (priv->output_queue); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -232,8 +281,6 @@ self->input_state = NULL; } - gst_clear_buffer (&priv->codec_data); - if (priv->parser) { gst_h265_parser_free (priv->parser); priv->parser = NULL; @@ -249,22 +296,19 @@ return TRUE; } -static GstFlowReturn -gst_h265_decoder_parse_vps (GstH265Decoder * self, GstH265NalUnit * nalu) +static void +gst_h265_decoder_clear_output_frame (GstH265DecoderOutputFrame * output_frame) { - GstH265DecoderPrivate *priv = self->priv; - GstH265VPS vps; - GstH265ParserResult pres; + if (!output_frame) + return; - pres = gst_h265_parser_parse_vps (priv->parser, nalu, &vps); - if (pres != GST_H265_PARSER_OK) { - GST_WARNING_OBJECT (self, "Failed to parse VPS, result %d", pres); - return GST_FLOW_ERROR; + if (output_frame->frame) { + gst_video_decoder_release_frame (GST_VIDEO_DECODER (output_frame->self), + output_frame->frame); + output_frame->frame = NULL; } - GST_LOG_OBJECT (self, "VPS parsed"); - - return GST_FLOW_OK; + gst_clear_h265_picture (&output_frame->picture); } static gboolean @@ -286,6 +330,97 @@ return FALSE; } +static void +gst_h265_decoder_drain_output_queue (GstH265Decoder * self, guint num, + GstFlowReturn * ret) +{ + GstH265DecoderPrivate *priv = self->priv; + GstH265DecoderClass *klass = GST_H265_DECODER_GET_CLASS (self); + + g_assert (klass->output_picture); + g_assert (ret != NULL); + + while (gst_queue_array_get_length (priv->output_queue) > num) { + GstH265DecoderOutputFrame *output_frame = (GstH265DecoderOutputFrame *) + gst_queue_array_pop_head_struct (priv->output_queue); + GstFlowReturn flow_ret = klass->output_picture (self, output_frame->frame, + output_frame->picture); + + UPDATE_FLOW_RETURN (ret, flow_ret); + } +} + +static void +gst_h265_decoder_set_latency (GstH265Decoder * self, const GstH265SPS * sps, + gint max_dpb_size) +{ + GstH265DecoderPrivate *priv = self->priv; + GstCaps *caps; + GstClockTime min, max; + GstStructure *structure; + gint fps_d = 1, fps_n = 0; + guint frames_delay; + + caps = gst_pad_get_current_caps (GST_VIDEO_DECODER_SRC_PAD (self)); + if (!caps) + return; + + structure = gst_caps_get_structure (caps, 0); + if (gst_structure_get_fraction (structure, "framerate", &fps_n, &fps_d)) { + if (fps_n == 0) { + /* variable framerate: see if we have a max-framerate */ + gst_structure_get_fraction (structure, "max-framerate", &fps_n, &fps_d); + } + } + gst_caps_unref (caps); + + /* if no fps or variable, then 25/1 */ + if (fps_n == 0) { + fps_n = 25; + fps_d = 1; + } + + /* Minimum possible latency could be calculated based on C.5.2.3 + * 1) # of pictures (marked as "needed for output") in DPB > sps_max_num_reorder_pics + * - We will assume all pictures in DPB are marked as "needed for output" + * 2) sps_max_latency_increase_plus1 != 0 and + * PicLatencyCount >= SpsMaxLatencyPictures + * - SpsMaxLatencyPictures is equal to + * "sps_max_num_reorder_pics + sps_max_latency_increase_plus1 - 1" + * and PicLatencyCount of each picture in DPB is increased by 1 per + * decoding loop. Note that PicLatencyCount of the currently decoded + * picture is zero. So, in case that all pictures in DPB are marked as + * "needed for output", Only condition 1) will have an effect + * regardless of sps_max_latency_increase_plus1. + * + * For example, assume sps_max_num_reorder_pics is 2 and + * sps_max_latency_increase_plus1 is 1, then SpsMaxLatencyPictures is 2. + * For a picture in DPB to have PicLatencyCount >= SpsMaxLatencyPictures, + * there must be at least 3 pictures including current picture in DPB + * (current picture's PicLatencyCount is zero). + * This is already covered by the condition 1). So, this condition 2) + * will have effect only when there are pictures marked as + * "not needed for output" in DPB. + * + * Thus, we can take sps_max_num_reorder_pics as a min latency value + */ + frames_delay = sps->max_num_reorder_picssps->max_sub_layers_minus1; + + /* Consider output delay wanted by subclass */ + frames_delay += priv->preferred_output_delay; + + min = gst_util_uint64_scale_int (frames_delay * GST_SECOND, fps_d, fps_n); + max = gst_util_uint64_scale_int ((max_dpb_size + priv->preferred_output_delay) + * GST_SECOND, fps_d, fps_n); + + GST_DEBUG_OBJECT (self, + "latency min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT + " min-frames-delay %d", GST_TIME_ARGS (min), GST_TIME_ARGS (max), + frames_delay); + + gst_video_decoder_set_latency (GST_VIDEO_DECODER (self), min, max); +} + static GstFlowReturn gst_h265_decoder_process_sps (GstH265Decoder * self, GstH265SPS * sps) { @@ -338,9 +473,26 @@ priv->progressive_source_flag, progressive_source_flag, priv->interlaced_source_flag, interlaced_source_flag); - g_assert (klass->new_sequence); + if (priv->no_output_of_prior_pics_flag) { + gst_h265_decoder_drain_output_queue (self, 0, &ret); + gst_h265_decoder_clear_dpb (self, FALSE); + } else { + ret = gst_h265_decoder_drain_internal (self); + } - ret = klass->new_sequence (self, sps, max_dpb_size); + if (ret != GST_FLOW_OK) + return ret; + + if (klass->get_preferred_output_delay) { + priv->preferred_output_delay = + klass->get_preferred_output_delay (self, priv->is_live); + } else { + priv->preferred_output_delay = 0; + } + + g_assert (klass->new_sequence); + ret = klass->new_sequence (self, + sps, max_dpb_size + priv->preferred_output_delay); if (ret != GST_FLOW_OK) { GST_WARNING_OBJECT (self, "subclass does not want accept new sequence"); return ret; @@ -358,66 +510,23 @@ priv->interlaced_source_flag = interlaced_source_flag; gst_h265_dpb_set_max_num_pics (priv->dpb, max_dpb_size); + gst_h265_decoder_set_latency (self, sps, max_dpb_size); + + GST_DEBUG_OBJECT (self, "Set DPB max size %d", max_dpb_size); } if (sps->max_latency_increase_plus1sps->max_sub_layers_minus1) { priv->SpsMaxLatencyPictures = sps->max_num_reorder_picssps->max_sub_layers_minus1 + sps->max_latency_increase_plus1sps->max_sub_layers_minus1 - 1; + } else { + priv->SpsMaxLatencyPictures = 0; } - GST_DEBUG_OBJECT (self, "Set DPB max size %d", max_dpb_size); - - return GST_FLOW_OK; -} - -static GstFlowReturn -gst_h265_decoder_parse_sps (GstH265Decoder * self, GstH265NalUnit * nalu) -{ - GstH265DecoderPrivate *priv = self->priv; - GstH265SPS sps; - GstH265ParserResult pres; - GstFlowReturn ret = GST_FLOW_OK; - - pres = gst_h265_parse_sps (priv->parser, nalu, &sps, TRUE); - if (pres != GST_H265_PARSER_OK) { - GST_WARNING_OBJECT (self, "Failed to parse SPS, result %d", pres); - return GST_FLOW_ERROR; - } - - GST_LOG_OBJECT (self, "SPS parsed"); - - ret = gst_h265_decoder_process_sps (self, &sps); - if (ret != GST_FLOW_OK) { - GST_WARNING_OBJECT (self, "Failed to process SPS"); - } else if (gst_h265_parser_update_sps (priv->parser, - &sps) != GST_H265_PARSER_OK) { - GST_WARNING_OBJECT (self, "Failed to update SPS"); - ret = GST_FLOW_ERROR; - } - - return ret; -} - -static GstFlowReturn -gst_h265_decoder_parse_pps (GstH265Decoder * self, GstH265NalUnit * nalu) -{ - GstH265DecoderPrivate *priv = self->priv; - GstH265PPS pps; - GstH265ParserResult pres; - - pres = gst_h265_parser_parse_pps (priv->parser, nalu, &pps); - if (pres != GST_H265_PARSER_OK) { - GST_WARNING_OBJECT (self, "Failed to parse PPS, result %d", pres); - return GST_FLOW_ERROR; - } - - GST_LOG_OBJECT (self, "PPS parsed"); - return GST_FLOW_OK; } -static GstFlowReturn +static GstH265ParserResult gst_h265_decoder_parse_sei (GstH265Decoder * self, GstH265NalUnit * nalu) { GstH265DecoderPrivate *priv = self->priv; @@ -432,7 +541,7 @@ /* XXX: Ignore error from SEI parsing, it might be malformed bitstream, * or our fault. But shouldn't be critical */ g_clear_pointer (&messages, g_array_unref); - return GST_FLOW_OK; + return GST_H265_PARSER_OK; } for (i = 0; i < messages->len; i++) { @@ -457,7 +566,7 @@ g_array_free (messages, TRUE); GST_LOG_OBJECT (self, "SEI parsed"); - return GST_FLOW_OK; + return GST_H265_PARSER_OK; } static void @@ -480,11 +589,11 @@ if (GST_H265_IS_I_SLICE (&slice->header)) return; - /* Inifinit loop prevention */ + /* Infinite loop prevention */ if (self->NumPocStCurrBefore == 0 && self->NumPocStCurrAfter == 0 && self->NumPocLtCurr == 0 && !scc_ext->pps_curr_pic_ref_enabled_flag) { GST_WARNING_OBJECT (self, - "Expected references, got none, preventing infinit loop."); + "Expected references, got none, preventing infinite loop."); return; } @@ -492,7 +601,7 @@ tmp_refs = priv->ref_pic_list_tmp; /* (8-8) - * Deriving l0 consist of appending in loop RefPicSetStCurrBefore, + * Deriving l0 consists of appending in loop RefPicSetStCurrBefore, * RefPicSetStCurrAfter and RefPicSetLtCurr until NumRpsCurrTempList0 item * has been reached. */ @@ -515,7 +624,7 @@ } /* (8-9) - * If needed, apply the modificaiton base on the lookup table found in the + * If needed, apply the modification based on the lookup table found in the * slice header (list_entry_l0). */ for (i = 0; i <= slice->header.num_ref_idx_l0_active_minus1; i++) { @@ -542,8 +651,8 @@ /* 8.3.4 Deriving l1 */ /* (8-10) - * Deriving l1 consist of appending in loop RefPicSetStCurrAfter, - * RefPicSetStCurrBefore and RefPicSetLtCurr until NumRpsCurrTempList0 item + * Deriving l1 consists of appending in loop RefPicSetStCurrAfter, + * RefPicSetStCurrBefore and RefPicSetLtCurr until NumRpsCurrTempList1 items * has been reached. */ @@ -565,7 +674,7 @@ } /* (8-11) - * If needed, apply the modificaiton base on the lookup table found in the + * If needed, apply the modification based on the lookup table found in the * slice header (list_entry_l1). */ for (i = 0; i <= slice->header.num_ref_idx_l1_active_minus1; i++) { @@ -631,32 +740,12 @@ } static GstFlowReturn -gst_h265_decoder_parse_slice (GstH265Decoder * self, GstH265NalUnit * nalu, - GstClockTime pts) +gst_h265_decoder_process_slice (GstH265Decoder * self, GstH265Slice * slice) { GstH265DecoderPrivate *priv = self->priv; - GstH265ParserResult pres = GST_H265_PARSER_OK; GstFlowReturn ret = GST_FLOW_OK; - memset (&priv->current_slice, 0, sizeof (GstH265Slice)); - - pres = gst_h265_parser_parse_slice_hdr (priv->parser, nalu, - &priv->current_slice.header); - - if (pres != GST_H265_PARSER_OK) { - GST_ERROR_OBJECT (self, "Failed to parse slice header, ret %d", pres); - memset (&priv->current_slice, 0, sizeof (GstH265Slice)); - - return GST_FLOW_ERROR; - } - - /* NOTE: gst_h265_parser_parse_slice_hdr() allocates array - * GstH265SliceHdr::entry_point_offset_minus1 but we don't use it - * in this h265decoder baseclass at the moment - */ - gst_h265_slice_hdr_free (&priv->current_slice.header); - - priv->current_slice.nalu = *nalu; + priv->current_slice = *slice; if (priv->current_slice.header.dependent_slice_segment_flag) { GstH265SliceHdr *slice_hdr = &priv->current_slice.header; @@ -674,6 +763,15 @@ if (ret != GST_FLOW_OK) return ret; + /* The used SPS may not be the latest parsed one, make + * sure we have updated it before decode the frame */ + ret = gst_h265_decoder_process_sps (self, + priv->current_slice.header.pps->sps); + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (self, "Failed to process sps"); + return ret; + } + priv->active_pps = priv->current_slice.header.pps; priv->active_sps = priv->active_pps->sps; @@ -685,7 +783,6 @@ g_assert (priv->current_frame); picture = gst_h265_picture_new (); - picture->pts = pts; /* This allows accessing the frame from the picture. */ picture->system_frame_number = priv->current_frame->system_frame_number; @@ -715,25 +812,99 @@ return gst_h265_decoder_decode_slice (self); } -static GstFlowReturn -gst_h265_decoder_decode_nal (GstH265Decoder * self, GstH265NalUnit * nalu, - GstClockTime pts) +static GstH265ParserResult +gst_h265_decoder_parse_slice (GstH265Decoder * self, GstH265NalUnit * nalu) { GstH265DecoderPrivate *priv = self->priv; - GstFlowReturn ret = GST_FLOW_OK; + GstH265ParserResult pres; + GstH265Slice slice; + GstH265DecoderNalUnit decoder_nalu; + + memset (&slice, 0, sizeof (GstH265Slice)); + + pres = gst_h265_parser_parse_slice_hdr (priv->parser, nalu, &slice.header); + if (pres != GST_H265_PARSER_OK) + return pres; + + /* NOTE: gst_h265_parser_parse_slice_hdr() allocates array + * GstH265SliceHdr::entry_point_offset_minus1 but we don't use it + * in this h265decoder baseclass at the moment + */ + gst_h265_slice_hdr_free (&slice.header); + slice.nalu = *nalu; + + if (nalu->type >= GST_H265_NAL_SLICE_BLA_W_LP && + nalu->type <= GST_H265_NAL_SLICE_CRA_NUT) { + slice.rap_pic_flag = TRUE; + } + + /* NoRaslOutputFlag == 1 if the current picture is + * 1) an IDR picture + * 2) a BLA picture + * 3) a CRA picture that is the first access unit in the bitstream + * 4) first picture that follows an end of sequence NAL unit in decoding order + * 5) has HandleCraAsBlaFlag == 1 (set by external means, so not considering ) + */ + if (GST_H265_IS_NAL_TYPE_IDR (nalu->type) || + GST_H265_IS_NAL_TYPE_BLA (nalu->type) || + (GST_H265_IS_NAL_TYPE_CRA (nalu->type) && priv->new_bitstream) || + priv->prev_nal_is_eos) { + slice.no_rasl_output_flag = TRUE; + } + + if (GST_H265_IS_NAL_TYPE_IRAP (nalu->type)) { + slice.intra_pic_flag = TRUE; + + if (slice.no_rasl_output_flag && !priv->new_bitstream) { + /* C 3.2 */ + slice.clear_dpb = TRUE; + if (nalu->type == GST_H265_NAL_SLICE_CRA_NUT) { + slice.no_output_of_prior_pics_flag = TRUE; + } else { + slice.no_output_of_prior_pics_flag = + slice.header.no_output_of_prior_pics_flag; + } + } + } + + if (slice.no_output_of_prior_pics_flag) + priv->no_output_of_prior_pics_flag = TRUE; + + decoder_nalu.unit.slice = slice; + decoder_nalu.is_slice = TRUE; + g_array_append_val (priv->nalu, decoder_nalu); + + return GST_H265_PARSER_OK; +} + +static GstH265ParserResult +gst_h265_decoder_parse_nalu (GstH265Decoder * self, GstH265NalUnit * nalu) +{ + GstH265DecoderPrivate *priv = self->priv; + GstH265VPS vps; + GstH265SPS sps; + GstH265PPS pps; + GstH265ParserResult ret = GST_H265_PARSER_OK; + GstH265DecoderNalUnit decoder_nalu; GST_LOG_OBJECT (self, "Parsed nal type: %d, offset %d, size %d", nalu->type, nalu->offset, nalu->size); switch (nalu->type) { case GST_H265_NAL_VPS: - ret = gst_h265_decoder_parse_vps (self, nalu); + ret = gst_h265_parser_parse_vps (priv->parser, nalu, &vps); break; case GST_H265_NAL_SPS: - ret = gst_h265_decoder_parse_sps (self, nalu); + ret = gst_h265_parser_parse_sps (priv->parser, nalu, &sps, TRUE); + if (ret != GST_H265_PARSER_OK) + break; + + memset (&decoder_nalu, 0, sizeof (GstH265DecoderNalUnit)); + decoder_nalu.unit.sps = sps; + g_array_append_val (priv->nalu, decoder_nalu); break; case GST_H265_NAL_PPS: - ret = gst_h265_decoder_parse_pps (self, nalu); + ret = gst_h265_parser_parse_pps (priv->parser, nalu, &pps); break; case GST_H265_NAL_PREFIX_SEI: case GST_H265_NAL_SUFFIX_SEI: @@ -755,7 +926,7 @@ case GST_H265_NAL_SLICE_IDR_W_RADL: case GST_H265_NAL_SLICE_IDR_N_LP: case GST_H265_NAL_SLICE_CRA_NUT: - ret = gst_h265_decoder_parse_slice (self, nalu, pts); + ret = gst_h265_decoder_parse_slice (self, nalu); priv->new_bitstream = FALSE; priv->prev_nal_is_eos = FALSE; break; @@ -772,6 +943,16 @@ return ret; } +static GstFlowReturn +gst_h265_decoder_decode_nalu (GstH265Decoder * self, + GstH265DecoderNalUnit * nalu) +{ + if (nalu->is_slice) + return gst_h265_decoder_process_slice (self, &nalu->unit.slice); + + return GST_FLOW_OK; +} + static void gst_h265_decoder_format_from_caps (GstH265Decoder * self, GstCaps * caps, GstH265DecoderFormat * format, GstH265DecoderAlign * align) @@ -825,7 +1006,9 @@ guint num_nals, i, j; GstH265ParserResult pres; GstH265NalUnit nalu; - GstFlowReturn ret = GST_FLOW_OK; + GstH265VPS vps; + GstH265SPS sps; + GstH265PPS pps; /* parse the hvcC data */ if (size < 23) { @@ -863,24 +1046,24 @@ switch (nalu.type) { case GST_H265_NAL_VPS: - ret = gst_h265_decoder_parse_vps (self, &nalu); - if (ret != GST_FLOW_OK) { + pres = gst_h265_parser_parse_vps (priv->parser, &nalu, &vps); + if (pres != GST_H265_PARSER_OK) { GST_WARNING_OBJECT (self, "Failed to parse VPS"); - return ret; + return GST_FLOW_ERROR; } break; case GST_H265_NAL_SPS: - ret = gst_h265_decoder_parse_sps (self, &nalu); - if (ret != GST_FLOW_OK) { + pres = gst_h265_parser_parse_sps (priv->parser, &nalu, &sps, TRUE); + if (pres != GST_H265_PARSER_OK) { GST_WARNING_OBJECT (self, "Failed to parse SPS"); - return ret; + return GST_FLOW_ERROR; } break; case GST_H265_NAL_PPS: - ret = gst_h265_decoder_parse_pps (self, &nalu); - if (ret != GST_FLOW_OK) { + pres = gst_h265_parser_parse_pps (priv->parser, &nalu, &pps); + if (pres != GST_H265_PARSER_OK) { GST_WARNING_OBJECT (self, "Failed to parse PPS"); - return ret; + return GST_FLOW_ERROR; } break; default: @@ -900,35 +1083,32 @@ { GstH265Decoder *self = GST_H265_DECODER (decoder); GstH265DecoderPrivate *priv = self->priv; + GstQuery *query; GST_DEBUG_OBJECT (decoder, "Set format"); + priv->input_state_changed = TRUE; + if (self->input_state) gst_video_codec_state_unref (self->input_state); self->input_state = gst_video_codec_state_ref (state); + priv->is_live = FALSE; + query = gst_query_new_latency (); + if (gst_pad_peer_query (GST_VIDEO_DECODER_SINK_PAD (self), query)) + gst_query_parse_latency (query, &priv->is_live, NULL, NULL); + gst_query_unref (query); + if (state->caps) { - GstStructure *str; - const GValue *codec_data_value; GstH265DecoderFormat format; GstH265DecoderAlign align; gst_h265_decoder_format_from_caps (self, state->caps, &format, &align); - str = gst_caps_get_structure (state->caps, 0); - codec_data_value = gst_structure_get_value (str, "codec_data"); - - if (GST_VALUE_HOLDS_BUFFER (codec_data_value)) { - gst_buffer_replace (&priv->codec_data, - gst_value_get_buffer (codec_data_value)); - } else { - gst_buffer_replace (&priv->codec_data, NULL); - } - if (format == GST_H265_DECODER_FORMAT_NONE) { /* codec_data implies packetized */ - if (codec_data_value != NULL) { + if (state->codec_data) { GST_WARNING_OBJECT (self, "video/x-h265 caps with codec_data but no stream-format=hev1 or hvc1"); format = GST_H265_DECODER_FORMAT_HEV1; @@ -942,7 +1122,7 @@ if (format == GST_H265_DECODER_FORMAT_HEV1 || format == GST_H265_DECODER_FORMAT_HVC1) { - if (codec_data_value == NULL) { + if (!state->codec_data) { /* Try it with size 4 anyway */ priv->nal_length_size = 4; GST_WARNING_OBJECT (self, @@ -954,33 +1134,41 @@ align = GST_H265_DECODER_ALIGN_AU; } - if (format == GST_H265_DECODER_FORMAT_BYTE) { - if (codec_data_value != NULL) { - GST_WARNING_OBJECT (self, "bytestream with codec data"); - } - } + if (format == GST_H265_DECODER_FORMAT_BYTE && state->codec_data) + GST_WARNING_OBJECT (self, "bytestream with codec data"); priv->in_format = format; priv->align = align; } - if (priv->codec_data) { + if (state->codec_data) { GstMapInfo map; - gst_buffer_map (priv->codec_data, &map, GST_MAP_READ); + gst_buffer_map (state->codec_data, &map, GST_MAP_READ); if (gst_h265_decoder_parse_codec_data (self, map.data, map.size) != GST_FLOW_OK) { /* keep going without error. * Probably inband SPS/PPS might be valid data */ GST_WARNING_OBJECT (self, "Failed to handle codec data"); } - gst_buffer_unmap (priv->codec_data, &map); + gst_buffer_unmap (state->codec_data, &map); } return TRUE; } static gboolean +gst_h265_decoder_negotiate (GstVideoDecoder * decoder) +{ + GstH265Decoder *self = GST_H265_DECODER (decoder); + + /* output state must be updated by subclass using new input state already */ + self->priv->input_state_changed = FALSE; + + return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); +} + +static gboolean gst_h265_decoder_flush (GstVideoDecoder * decoder) { GstH265Decoder *self = GST_H265_DECODER (decoder); @@ -1013,26 +1201,11 @@ const GstH265SliceHdr *slice_hdr = &slice->header; const GstH265NalUnit *nalu = &slice->nalu; - if (nalu->type >= GST_H265_NAL_SLICE_BLA_W_LP && - nalu->type <= GST_H265_NAL_SLICE_CRA_NUT) - picture->RapPicFlag = TRUE; - - /* NoRaslOutputFlag == 1 if the current picture is - * 1) an IDR picture - * 2) a BLA picture - * 3) a CRA picture that is the first access unit in the bitstream - * 4) first picture that follows an end of sequence NAL unit in decoding order - * 5) has HandleCraAsBlaFlag == 1 (set by external means, so not considering ) - */ - if (GST_H265_IS_NAL_TYPE_IDR (nalu->type) || - GST_H265_IS_NAL_TYPE_BLA (nalu->type) || - (GST_H265_IS_NAL_TYPE_CRA (nalu->type) && priv->new_bitstream) || - priv->prev_nal_is_eos) { - picture->NoRaslOutputFlag = TRUE; - } - - if (GST_H265_IS_NAL_TYPE_IRAP (nalu->type)) { - picture->IntraPicFlag = TRUE; + picture->RapPicFlag = slice->rap_pic_flag; + picture->NoRaslOutputFlag = slice->no_rasl_output_flag; + picture->IntraPicFlag = slice->intra_pic_flag; + picture->NoOutputOfPriorPicsFlag = slice->no_output_of_prior_pics_flag; + if (picture->IntraPicFlag) { priv->associated_irap_NoRaslOutputFlag = picture->NoRaslOutputFlag; } @@ -1083,8 +1256,6 @@ gint32 MaxPicOrderCntLsb = 1 << (sps->log2_max_pic_order_cnt_lsb_minus4 + 4); gboolean is_irap; - GST_DEBUG_OBJECT (self, "decode PicOrderCntVal"); - priv->prev_poc_lsb = priv->poc_lsb; priv->prev_poc_msb = priv->poc_msb; @@ -1130,7 +1301,7 @@ priv->prev_tid0pic_poc_msb = 0; } - GST_DEBUG_OBJECT (self, + GST_LOG_OBJECT (self, "PicOrderCntVal %d, (lsb %d)", picture->pic_order_cnt, picture->pic_order_cnt_lsb); @@ -1475,8 +1646,8 @@ GstH265Picture * picture, GstFlowReturn * ret) { GstH265DecoderPrivate *priv = self->priv; - GstH265DecoderClass *klass; GstVideoCodecFrame *frame = NULL; + GstH265DecoderOutputFrame output_frame; GstFlowReturn flow_ret = GST_FLOW_OK; g_assert (ret != NULL); @@ -1505,11 +1676,13 @@ return; } - klass = GST_H265_DECODER_GET_CLASS (self); - - g_assert (klass->output_picture); - flow_ret = klass->output_picture (self, frame, picture); + output_frame.frame = frame; + output_frame.picture = picture; + output_frame.self = self; + gst_queue_array_push_tail_struct (priv->output_queue, &output_frame); + gst_h265_decoder_drain_output_queue (self, priv->preferred_output_delay, + &flow_ret); UPDATE_FLOW_RETURN (ret, flow_ret); } @@ -1533,6 +1706,7 @@ } } + gst_queue_array_clear (priv->output_queue); gst_h265_dpb_clear (priv->dpb); priv->last_output_poc = G_MININT32; } @@ -1547,6 +1721,8 @@ while ((picture = gst_h265_dpb_bump (priv->dpb, TRUE)) != NULL) gst_h265_decoder_do_output_picture (self, picture, &ret); + gst_h265_decoder_drain_output_queue (self, 0, &ret); + gst_h265_dpb_clear (priv->dpb); priv->last_output_poc = G_MININT32; @@ -1559,23 +1735,15 @@ GstH265Picture * picture) { GstH265DecoderPrivate *priv = self->priv; - const GstH265SliceHdr *slice_hdr = &slice->header; - const GstH265NalUnit *nalu = &slice->nalu; const GstH265SPS *sps = priv->active_sps; GstH265Picture *to_output; GstFlowReturn ret = GST_FLOW_OK; /* C 3.2 */ - if (GST_H265_IS_NAL_TYPE_IRAP (nalu->type) && picture->NoRaslOutputFlag - && !priv->new_bitstream) { - if (nalu->type == GST_H265_NAL_SLICE_CRA_NUT) - picture->NoOutputOfPriorPicsFlag = TRUE; - else - picture->NoOutputOfPriorPicsFlag = - slice_hdr->no_output_of_prior_pics_flag; - + if (slice->clear_dpb) { if (picture->NoOutputOfPriorPicsFlag) { GST_DEBUG_OBJECT (self, "Clear dpb"); + gst_h265_decoder_drain_output_queue (self, 0, &ret); gst_h265_decoder_clear_dpb (self, FALSE); } else { gst_h265_dpb_delete_unused (priv->dpb); @@ -1635,10 +1803,18 @@ return GST_FLOW_OK; } + /* If subclass didn't update output state at this point, + * marking this picture as a discont and stores current input state */ + if (priv->input_state_changed) { + priv->current_picture->discont_state = + gst_video_codec_state_ref (self->input_state); + priv->input_state_changed = FALSE; + } + if (!gst_h265_decoder_prepare_rps (self, &priv->current_slice, priv->current_picture)) { GST_WARNING_OBJECT (self, "Failed to prepare ref pic set"); - gst_h265_picture_clear (&priv->current_picture); + gst_clear_h265_picture (&priv->current_picture); return GST_FLOW_ERROR; } @@ -1750,6 +1926,9 @@ priv->cur_pic_struct = GST_H265_SEI_PIC_STRUCT_FRAME; priv->cur_source_scan_type = 2; priv->cur_duplicate_flag = 0; + priv->no_output_of_prior_pics_flag = FALSE; + priv->current_frame = NULL; + g_array_set_size (priv->nalu, 0); } static GstFlowReturn @@ -1763,16 +1942,17 @@ GstH265ParserResult pres; GstMapInfo map; GstFlowReturn decode_ret = GST_FLOW_OK; + guint i; GST_LOG_OBJECT (self, "handle frame, PTS: %" GST_TIME_FORMAT ", DTS: %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_PTS (in_buf)), GST_TIME_ARGS (GST_BUFFER_DTS (in_buf))); - priv->current_frame = frame; - gst_h265_decoder_reset_frame_state (self); + priv->current_frame = frame; + if (!gst_buffer_map (in_buf, &map, GST_MAP_READ)) { GST_ELEMENT_ERROR (self, RESOURCE, READ, ("Failed to map memory for reading"), (NULL)); @@ -1781,17 +1961,29 @@ if (priv->in_format == GST_H265_DECODER_FORMAT_HVC1 || priv->in_format == GST_H265_DECODER_FORMAT_HEV1) { - pres = gst_h265_parser_identify_nalu_hevc (priv->parser, - map.data, 0, map.size, priv->nal_length_size, &nalu); + guint offset = 0; + gsize consumed; + + do { + pres = gst_h265_parser_identify_and_split_nalu_hevc (priv->parser, + map.data, offset, map.size, priv->nal_length_size, priv->split_nalu, + &consumed); + if (pres != GST_H265_PARSER_OK) + break; - while (pres == GST_H265_PARSER_OK && decode_ret == GST_FLOW_OK) { - decode_ret = gst_h265_decoder_decode_nal (self, - &nalu, GST_BUFFER_PTS (in_buf)); + for (i = 0; i < priv->split_nalu->len; i++) { + GstH265NalUnit *nl = + &g_array_index (priv->split_nalu, GstH265NalUnit, i); + pres = gst_h265_decoder_parse_nalu (self, nl); + if (pres != GST_H265_PARSER_OK) + break; + } - pres = gst_h265_parser_identify_nalu_hevc (priv->parser, - map.data, nalu.offset + nalu.size, map.size, priv->nal_length_size, - &nalu); - } + if (pres != GST_H265_PARSER_OK) + break; + + offset += consumed; + } while (pres == GST_H265_PARSER_OK); } else { pres = gst_h265_parser_identify_nalu (priv->parser, map.data, 0, map.size, &nalu); @@ -1799,20 +1991,26 @@ if (pres == GST_H265_PARSER_NO_NAL_END) pres = GST_H265_PARSER_OK; - while (pres == GST_H265_PARSER_OK && decode_ret == GST_FLOW_OK) { - decode_ret = gst_h265_decoder_decode_nal (self, - &nalu, GST_BUFFER_PTS (in_buf)); + while (pres == GST_H265_PARSER_OK) { + pres = gst_h265_decoder_parse_nalu (self, &nalu); + if (pres != GST_H265_PARSER_OK) + break; pres = gst_h265_parser_identify_nalu (priv->parser, map.data, nalu.offset + nalu.size, map.size, &nalu); - if (pres == GST_H265_PARSER_NO_NAL_END) pres = GST_H265_PARSER_OK; } } + for (i = 0; i < priv->nalu->len && decode_ret == GST_FLOW_OK; i++) { + GstH265DecoderNalUnit *decoder_nalu = + &g_array_index (priv->nalu, GstH265DecoderNalUnit, i); + decode_ret = gst_h265_decoder_decode_nalu (self, decoder_nalu); + } + gst_buffer_unmap (in_buf, &map); - priv->current_frame = NULL; + gst_h265_decoder_reset_frame_state (self); if (decode_ret != GST_FLOW_OK) { if (decode_ret == GST_FLOW_ERROR) { @@ -1821,7 +2019,7 @@ } gst_video_decoder_drop_frame (decoder, frame); - gst_h265_picture_clear (&priv->current_picture); + gst_clear_h265_picture (&priv->current_picture); return decode_ret; } @@ -1842,6 +2040,15 @@ return decode_ret; } +static void +gst_h265_decoder_clear_nalu (GstH265DecoderNalUnit * nalu) +{ + if (!nalu) + return; + + memset (nalu, 0, sizeof (GstH265DecoderNalUnit)); +} + /** * gst_h265_decoder_set_process_ref_pic_lists: * @decoder: a #GstH265Decoder @@ -1866,7 +2073,7 @@ * Retrive DPB and return a #GstH265Picture corresponding to * the @system_frame_number * - * Returns: (transfer full): a #GstH265Picture if successful, or %NULL otherwise + * Returns: (transfer full) (nullable): a #GstH265Picture if successful, or %NULL otherwise * * Since: 1.20 */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gsth265decoder.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gsth265decoder.h
Changed
@@ -73,63 +73,114 @@ /** * GstH265DecoderClass: - * @new_sequence: Notifies subclass of SPS update - * @new_picture: Optional. - * Called whenever new #GstH265Picture is created. - * Subclass can set implementation specific user data - * on the #GstH265Picture via gst_h265_picture_set_user_data() - * @start_picture: Optional. - * Called per one #GstH265Picture to notify subclass to prepare - * decoding process for the #GstH265Picture - * @decode_slice: Provides per slice data with parsed slice header and - * required raw bitstream for subclass to decode it - * @end_picture: Optional. - * Called per one #GstH265Picture to notify subclass to finish - * decoding process for the #GstH265Picture - * @output_picture: Called with a #GstH265Picture which is required to be outputted. - * The #GstVideoCodecFrame must be consumed by subclass via - * gst_video_decoder_{finish,drop,release}_frame(). + * + * The opaque #GstH265DecoderClass data structure. */ struct _GstH265DecoderClass { GstVideoDecoderClass parent_class; + /** + * GstH265DecoderClass::new_sequence: + * @decoder: a #GstH265Decoder + * @sps: a #GstH265SPS + * @max_dpb_size: the size of dpb including preferred output delay + * by subclass reported via get_preferred_output_delay method. + * + * Notifies subclass of video sequence update + */ GstFlowReturn (*new_sequence) (GstH265Decoder * decoder, const GstH265SPS * sps, gint max_dpb_size); + /** - * GstH265Decoder:new_picture: + * GstH265DecoderClass::new_picture: * @decoder: a #GstH265Decoder * @frame: (transfer none): a #GstVideoCodecFrame * @picture: (transfer none): a #GstH265Picture + * + * Optional. Called whenever new #GstH265Picture is created. + * Subclass can set implementation specific user data + * on the #GstH265Picture via gst_h265_picture_set_user_data() */ GstFlowReturn (*new_picture) (GstH265Decoder * decoder, GstVideoCodecFrame * frame, GstH265Picture * picture); + /** + * GstH265DecoderClass::start_picture: + * @decoder: a #GstH265Decoder + * @picture: (transfer none): a #GstH265Picture + * @slice: (transfer none): a #GstH265Slice + * @dpb: (transfer none): a #GstH265Dpb + * + * Optional. Called per one #GstH265Picture to notify subclass to prepare + * decoding process for the #GstH265Picture + */ GstFlowReturn (*start_picture) (GstH265Decoder * decoder, GstH265Picture * picture, GstH265Slice * slice, GstH265Dpb * dpb); + /** + * GstH265DecoderClass::decode_slice: + * @decoder: a #GstH265Decoder + * @picture: (transfer none): a #GstH265Picture + * @slice: (transfer none): a #GstH265Slice + * @ref_pic_list0: (element-type GstH265Picture) (transfer none): + * an array of #GstH265Picture pointers + * @ref_pic_list1: (element-type GstH265Picture) (transfer none): + * an array of #GstH265Picture pointers + * + * Provides per slice data with parsed slice header and required raw bitstream + * for subclass to decode it. If gst_h265_decoder_set_process_ref_pic_lists() + * is called with %TRUE by the subclass, @ref_pic_list0 and @ref_pic_list1 + * are non-%NULL. + */ GstFlowReturn (*decode_slice) (GstH265Decoder * decoder, GstH265Picture * picture, GstH265Slice * slice, GArray * ref_pic_list0, GArray * ref_pic_list1); + /** + * GstH265DecoderClass::end_picture: + * @decoder: a #GstH265Decoder + * @picture: (transfer none): a #GstH265Picture + * + * Optional. Called per one #GstH265Picture to notify subclass to finish + * decoding process for the #GstH265Picture + */ GstFlowReturn (*end_picture) (GstH265Decoder * decoder, GstH265Picture * picture); + /** - * GstH265Decoder:output_picture: + * GstH265DecoderClass:output_picture: * @decoder: a #GstH265Decoder * @frame: (transfer full): a #GstVideoCodecFrame * @picture: (transfer full): a #GstH265Picture + * + * Called with a #GstH265Picture which is required to be outputted. */ GstFlowReturn (*output_picture) (GstH265Decoder * decoder, GstVideoCodecFrame * frame, GstH265Picture * picture); + /** + * GstH265DecoderClass::get_preferred_output_delay: + * @decoder: a #GstH265Decoder + * @live: whether upstream is live or not + * + * Optional. Called by baseclass to query whether delaying output is + * preferred by subclass or not. + * + * Returns: the number of perferred delayed output frame + * + * Since: 1.22 + */ + guint (*get_preferred_output_delay) (GstH265Decoder * decoder, + gboolean live); + /*< private >*/ gpointer paddingGST_PADDING_LARGE; };
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gsth265picture.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gsth265picture.c
Changed
@@ -34,6 +34,9 @@ if (picture->notify) picture->notify (picture->user_data); + if (picture->discont_state) + gst_video_codec_state_unref (picture->discont_state); + g_free (picture); } @@ -51,7 +54,6 @@ pic = g_new0 (GstH265Picture, 1); - pic->pts = GST_CLOCK_TIME_NONE; pic->pic_struct = GST_H265_SEI_PIC_STRUCT_FRAME; /* 0: interlaced, 1: progressive, 2: unspecified, 3: reserved, can be * interpreted as 2 */ @@ -68,7 +70,7 @@ /** * gst_h265_picture_set_user_data: * @picture: a #GstH265Picture - * @user_data: private data + * @user_data: (nullable): private data * @notify: (closure user_data): a #GDestroyNotify * * Sets @user_data on the picture and the #GDestroyNotify that will be called when @@ -97,7 +99,7 @@ * Gets private data set on the picture via * gst_h265_picture_set_user_data() previously. * - * Returns: (transfer none): The previously set user_data + * Returns: (transfer none) (nullable): The previously set user_data */ gpointer gst_h265_picture_get_user_data (GstH265Picture * picture) @@ -130,7 +132,7 @@ g_array_sized_new (FALSE, TRUE, sizeof (GstH265Picture *), GST_H265_DPB_MAX_SIZE); g_array_set_clear_func (dpb->pic_list, - (GDestroyNotify) gst_h265_picture_clear); + (GDestroyNotify) gst_clear_h265_picture); return dpb; } @@ -455,7 +457,7 @@ * @dpb: a #GstH265Dpb * @system_frame_number The system frame number * - * Returns: (transfer full): the picture identified with the specified + * Returns: (transfer full) (nullable): the picture identified with the specified * @system_frame_number, or %NULL if DPB does not contain a #GstH265Picture * corresponding to the @system_frame_number *
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gsth265picture.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gsth265picture.h
Changed
@@ -48,6 +48,13 @@ /* parsed nal unit (doesn't take ownership of raw data) */ GstH265NalUnit nalu; + + /*< private >*/ + gboolean rap_pic_flag; + gboolean no_rasl_output_flag; + gboolean no_output_of_prior_pics_flag; + gboolean clear_dpb; + gboolean intra_pic_flag; }; struct _GstH265Picture @@ -57,7 +64,6 @@ GstH265SliceType type; - GstClockTime pts; /* From GstVideoCodecFrame */ guint32 system_frame_number; @@ -84,6 +90,9 @@ GstVideoBufferFlags buffer_flags; + /* decoder input state if this picture is discont point */ + GstVideoCodecState *discont_state; + gpointer user_data; GDestroyNotify notify; }; @@ -115,7 +124,7 @@ } static inline void -gst_h265_picture_clear (GstH265Picture ** picture) +gst_clear_h265_picture (GstH265Picture ** picture) { if (picture && *picture) { gst_h265_picture_unref (*picture);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstmpeg2decoder.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstmpeg2decoder.c
Changed
@@ -267,6 +267,8 @@ GstQueueArray *output_queue; /* used for low-latency vs. high throughput mode decision */ gboolean is_live; + + gboolean input_state_changed; }; #define UPDATE_FLOW_RETURN(ret,new_ret) G_STMT_START { \ @@ -293,6 +295,7 @@ static gboolean gst_mpeg2_decoder_stop (GstVideoDecoder * decoder); static gboolean gst_mpeg2_decoder_set_format (GstVideoDecoder * decoder, GstVideoCodecState * state); +static gboolean gst_mpeg2_decoder_negotiate (GstVideoDecoder * decoder); static GstFlowReturn gst_mpeg2_decoder_finish (GstVideoDecoder * decoder); static gboolean gst_mpeg2_decoder_flush (GstVideoDecoder * decoder); static GstFlowReturn gst_mpeg2_decoder_drain (GstVideoDecoder * decoder); @@ -314,6 +317,7 @@ decoder_class->start = GST_DEBUG_FUNCPTR (gst_mpeg2_decoder_start); decoder_class->stop = GST_DEBUG_FUNCPTR (gst_mpeg2_decoder_stop); decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_mpeg2_decoder_set_format); + decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_mpeg2_decoder_negotiate); decoder_class->finish = GST_DEBUG_FUNCPTR (gst_mpeg2_decoder_finish); decoder_class->flush = GST_DEBUG_FUNCPTR (gst_mpeg2_decoder_flush); decoder_class->drain = GST_DEBUG_FUNCPTR (gst_mpeg2_decoder_drain); @@ -379,6 +383,8 @@ GST_DEBUG_OBJECT (decoder, "Set format"); + priv->input_state_changed = TRUE; + if (self->input_state) gst_video_codec_state_unref (self->input_state); @@ -395,6 +401,17 @@ return TRUE; } +static gboolean +gst_mpeg2_decoder_negotiate (GstVideoDecoder * decoder) +{ + GstMpeg2Decoder *self = GST_MPEG2_DECODER (decoder); + + /* output state must be updated by subclass using new input state already */ + self->priv->input_state_changed = FALSE; + + return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); +} + static GstFlowReturn gst_mpeg2_decoder_drain (GstVideoDecoder * decoder) { @@ -741,6 +758,8 @@ GstMpegVideoPictureHdr pic_hdr = { 0, }; GstMpeg2DecoderClass *klass = GST_MPEG2_DECODER_GET_CLASS (decoder); + g_assert (klass->new_sequence); + if (!_is_valid_state (decoder, GST_MPEG2_DECODER_STATE_VALID_SEQ_HEADERS)) { GST_ERROR_OBJECT (decoder, "no sequence before parsing picture header"); return GST_FLOW_ERROR; @@ -767,24 +786,27 @@ priv->need_to_drain = FALSE; } - if (klass->get_preferred_output_delay) + if (klass->get_preferred_output_delay) { priv->preferred_output_delay = klass->get_preferred_output_delay (decoder, priv->is_live); + } else { + priv->preferred_output_delay = 0; + } priv->seq_changed = FALSE; - if (klass->new_sequence) { - ret = klass->new_sequence (decoder, &priv->seq_hdr, - _seq_ext_is_valid (&priv->seq_ext) ? &priv->seq_ext : NULL, - _seq_display_ext_is_valid (&priv->seq_display_ext) ? - &priv->seq_display_ext : NULL, - _seq_scalable_ext_is_valid (&priv->seq_scalable_ext) ? - &priv->seq_scalable_ext : NULL); + ret = klass->new_sequence (decoder, &priv->seq_hdr, + _seq_ext_is_valid (&priv->seq_ext) ? &priv->seq_ext : NULL, + _seq_display_ext_is_valid (&priv->seq_display_ext) ? + &priv->seq_display_ext : NULL, + _seq_scalable_ext_is_valid (&priv->seq_scalable_ext) ? + &priv->seq_scalable_ext : NULL, + /* previous/next 2 pictures */ + 2 + priv->preferred_output_delay); - if (ret != GST_FLOW_OK) { - GST_WARNING_OBJECT (decoder, "new sequence error"); - return ret; - } + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (decoder, "new sequence error"); + return ret; } } @@ -812,6 +834,14 @@ GstMpeg2Picture *prev_picture, *next_picture; GstFlowReturn ret; + /* If subclass didn't update output state at this point, + * marking this picture as a discont and stores current input state */ + if (priv->input_state_changed) { + priv->current_picture->discont_state = + gst_video_codec_state_ref (decoder->input_state); + priv->input_state_changed = FALSE; + } + if (!klass->start_picture) return GST_FLOW_OK; @@ -856,7 +886,7 @@ if (priv->first_field) { GST_WARNING_OBJECT (decoder, "An unmatched first field"); - gst_mpeg2_picture_clear (&priv->first_field); + gst_clear_mpeg2_picture (&priv->first_field); } picture = gst_mpeg2_picture_new (); @@ -955,7 +985,7 @@ priv->current_picture, priv->current_picture->structure == GST_MPEG_VIDEO_PICTURE_STRUCTURE_FRAME ? " a field" : "the first field"); - gst_mpeg2_picture_clear (&priv->current_picture); + gst_clear_mpeg2_picture (&priv->current_picture); } return GST_FLOW_OK; @@ -1191,7 +1221,7 @@ output_frame->frame = NULL; } - gst_mpeg2_picture_clear (&output_frame->picture); + gst_clear_mpeg2_picture (&output_frame->picture); } static GstFlowReturn @@ -1259,8 +1289,8 @@ } ret = gst_mpeg2_decoder_output_current_picture (self); - gst_mpeg2_picture_clear (&priv->current_picture); - gst_mpeg2_picture_clear (&priv->first_field); + gst_clear_mpeg2_picture (&priv->current_picture); + gst_clear_mpeg2_picture (&priv->first_field); gst_video_codec_frame_unref (priv->current_frame); priv->current_frame = NULL; return ret; @@ -1274,8 +1304,8 @@ } gst_video_decoder_drop_frame (decoder, frame); - gst_mpeg2_picture_clear (&priv->current_picture); - gst_mpeg2_picture_clear (&priv->first_field); + gst_clear_mpeg2_picture (&priv->current_picture); + gst_clear_mpeg2_picture (&priv->first_field); priv->current_frame = NULL; return ret;
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstmpeg2decoder.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstmpeg2decoder.h
Changed
@@ -73,6 +73,8 @@ * @decoder: a #GstMpeg2Decoder * @seq: a #GstMpegVideoSequenceHdr * @seq_ext: a #GstMpegVideoSequenceExt + * @max_dpb_size: the size of dpb including preferred output delay + * by subclass reported via get_preferred_output_delay method. * * Notifies subclass of SPS update * @@ -82,7 +84,8 @@ const GstMpegVideoSequenceHdr * seq, const GstMpegVideoSequenceExt * seq_ext, const GstMpegVideoSequenceDisplayExt * seq_display_ext, - const GstMpegVideoSequenceScalableExt * seq_scalable_ext); + const GstMpegVideoSequenceScalableExt * seq_scalable_ext, + gint max_dpb_size); /** * GstMpeg2DecoderClass::new_picture: @@ -113,7 +116,7 @@ * Since: 1.20 */ GstFlowReturn (*new_field_picture) (GstMpeg2Decoder * decoder, - const GstMpeg2Picture * first_field, + GstMpeg2Picture * first_field, GstMpeg2Picture * second_field); /**
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstmpeg2picture.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstmpeg2picture.c
Changed
@@ -40,6 +40,9 @@ if (picture->notify) picture->notify (picture->user_data); + if (picture->discont_state) + gst_video_codec_state_unref (picture->discont_state); + g_free (picture); } @@ -153,11 +156,11 @@ g_return_if_fail (dpb != NULL); - gst_mpeg2_picture_clear (&dpb->new_pic); + gst_clear_mpeg2_picture (&dpb->new_pic); g_assert (dpb->num_ref_pictures <= 2); for (i = 0; i < dpb->num_ref_pictures; i++) - gst_mpeg2_picture_clear (&dpb->ref_pic_listi); + gst_clear_mpeg2_picture (&dpb->ref_pic_listi); g_free (dpb); } @@ -177,11 +180,11 @@ g_return_if_fail (dpb != NULL); - gst_mpeg2_picture_clear (&dpb->new_pic); + gst_clear_mpeg2_picture (&dpb->new_pic); g_assert (dpb->num_ref_pictures <= 2); for (i = 0; i < dpb->num_ref_pictures; i++) - gst_mpeg2_picture_clear (&dpb->ref_pic_listi); + gst_clear_mpeg2_picture (&dpb->ref_pic_listi); dpb->num_ref_pictures = 0; } @@ -289,13 +292,13 @@ /* Then, replace the reference if needed. */ if (dpb->new_pic && GST_MPEG2_PICTURE_IS_REF (dpb->new_pic)) { _dpb_add_to_reference (dpb, dpb->new_pic); - gst_mpeg2_picture_clear (&dpb->new_pic); + gst_clear_mpeg2_picture (&dpb->new_pic); } if (pic) { pic->needed_for_output = FALSE; if (pic == dpb->new_pic) - gst_mpeg2_picture_clear (&dpb->new_pic); + gst_clear_mpeg2_picture (&dpb->new_pic); } return pic;
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstmpeg2picture.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstmpeg2picture.h
Changed
@@ -94,6 +94,9 @@ GstMpegVideoPictureStructure structure; GstMpegVideoPictureType type; + /* decoder input state if this picture is discont point */ + GstVideoCodecState *discont_state; + gpointer user_data; GDestroyNotify notify; }; @@ -137,7 +140,7 @@ } static inline void -gst_mpeg2_picture_clear (GstMpeg2Picture ** picture) +gst_clear_mpeg2_picture (GstMpeg2Picture ** picture) { if (picture && *picture) { gst_mpeg2_picture_unref (*picture);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstvp8decoder.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstvp8decoder.c
Changed
@@ -47,6 +47,8 @@ /* for delayed output */ GstQueueArray *output_queue; gboolean is_live; + + gboolean input_state_changed; }; typedef struct @@ -67,6 +69,7 @@ static gboolean gst_vp8_decoder_stop (GstVideoDecoder * decoder); static gboolean gst_vp8_decoder_set_format (GstVideoDecoder * decoder, GstVideoCodecState * state); +static gboolean gst_vp8_decoder_negotiate (GstVideoDecoder * decoder); static GstFlowReturn gst_vp8_decoder_finish (GstVideoDecoder * decoder); static gboolean gst_vp8_decoder_flush (GstVideoDecoder * decoder); static GstFlowReturn gst_vp8_decoder_drain (GstVideoDecoder * decoder); @@ -87,6 +90,7 @@ decoder_class->start = GST_DEBUG_FUNCPTR (gst_vp8_decoder_start); decoder_class->stop = GST_DEBUG_FUNCPTR (gst_vp8_decoder_stop); decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_vp8_decoder_set_format); + decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_vp8_decoder_negotiate); decoder_class->finish = GST_DEBUG_FUNCPTR (gst_vp8_decoder_finish); decoder_class->flush = GST_DEBUG_FUNCPTR (gst_vp8_decoder_flush); decoder_class->drain = GST_DEBUG_FUNCPTR (gst_vp8_decoder_drain); @@ -124,9 +128,9 @@ { GstVp8DecoderPrivate *priv = self->priv; - gst_vp8_picture_clear (&self->last_picture); - gst_vp8_picture_clear (&self->golden_ref_picture); - gst_vp8_picture_clear (&self->alt_ref_picture); + gst_clear_vp8_picture (&self->last_picture); + gst_clear_vp8_picture (&self->golden_ref_picture); + gst_clear_vp8_picture (&self->alt_ref_picture); priv->wait_keyframe = TRUE; gst_queue_array_clear (priv->output_queue); @@ -178,14 +182,18 @@ priv->had_sequence = TRUE; - if (klass->get_preferred_output_delay) + if (klass->get_preferred_output_delay) { priv->preferred_output_delay = klass->get_preferred_output_delay (self, priv->is_live); - else + } else { priv->preferred_output_delay = 0; + } - if (klass->new_sequence) - ret = klass->new_sequence (self, frame_hdr); + g_assert (klass->new_sequence); + + ret = klass->new_sequence (self, frame_hdr, + /* last/golden/alt 3 pictures */ + 3 + priv->preferred_output_delay); } return ret; @@ -201,6 +209,8 @@ GST_DEBUG_OBJECT (decoder, "Set format"); + priv->input_state_changed = TRUE; + if (self->input_state) gst_video_codec_state_unref (self->input_state); @@ -218,6 +228,17 @@ } static gboolean +gst_vp8_decoder_negotiate (GstVideoDecoder * decoder) +{ + GstVp8Decoder *self = GST_VP8_DECODER (decoder); + + /* output state must be updated by subclass using new input state already */ + self->priv->input_state_changed = FALSE; + + return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); +} + +static gboolean gst_vp8_decoder_update_reference (GstVp8Decoder * self, GstVp8Picture * picture) { GstVp8FrameHdr *frame_hdr = &picture->frame_hdr; @@ -288,9 +309,9 @@ GstVp8DecoderPrivate *priv = self->priv; gst_vp8_decoder_drain_output_queue (self, 0, &ret); - gst_vp8_picture_clear (&self->last_picture); - gst_vp8_picture_clear (&self->golden_ref_picture); - gst_vp8_picture_clear (&self->alt_ref_picture); + gst_clear_vp8_picture (&self->last_picture); + gst_clear_vp8_picture (&self->golden_ref_picture); + gst_clear_vp8_picture (&self->alt_ref_picture); priv->wait_keyframe = wait_keyframe; @@ -337,7 +358,7 @@ output_frame->frame = NULL; } - gst_vp8_picture_clear (&output_frame->picture); + gst_clear_vp8_picture (&output_frame->picture); } static GstFlowReturn @@ -448,6 +469,13 @@ ret = gst_video_decoder_finish_frame (GST_VIDEO_DECODER (self), frame); } else { + /* If subclass didn't update output state at this point, + * marking this picture as a discont and stores current input state */ + if (priv->input_state_changed) { + picture->discont_state = gst_video_codec_state_ref (self->input_state); + priv->input_state_changed = FALSE; + } + output_frame.frame = frame; output_frame.picture = picture; output_frame.self = self;
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstvp8decoder.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstvp8decoder.h
Changed
@@ -89,7 +89,8 @@ GstVideoDecoderClass parent_class; GstFlowReturn (*new_sequence) (GstVp8Decoder * decoder, - const GstVp8FrameHdr * frame_hdr); + const GstVp8FrameHdr * frame_hdr, + gint max_dpb_size); /** * GstVp8DecoderClass:new_picture:
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstvp8picture.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstvp8picture.c
Changed
@@ -36,6 +36,9 @@ if (picture->notify) picture->notify (picture->user_data); + if (picture->discont_state) + gst_video_codec_state_unref (picture->discont_state); + g_free (picture); }
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstvp8picture.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstvp8picture.h
Changed
@@ -22,6 +22,7 @@ #include <gst/codecs/codecs-prelude.h> #include <gst/codecparsers/gstvp8parser.h> +#include <gst/video/video.h> G_BEGIN_DECLS @@ -34,6 +35,7 @@ struct _GstVp8Picture { + /*< private >*/ GstMiniObject parent; GstClockTime pts; @@ -46,6 +48,9 @@ const guint8 * data; gsize size; + /* decoder input state if this picture is discont point */ + GstVideoCodecState *discont_state; + gpointer user_data; GDestroyNotify notify; }; @@ -77,7 +82,7 @@ } static inline void -gst_vp8_picture_clear (GstVp8Picture ** picture) +gst_clear_vp8_picture (GstVp8Picture ** picture) { if (picture && *picture) { gst_vp8_picture_unref (*picture);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstvp9decoder.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstvp9decoder.c
Changed
@@ -84,6 +84,8 @@ guint preferred_output_delay; GstQueueArray *output_queue; gboolean is_live; + + gboolean input_state_changed; }; typedef struct @@ -104,6 +106,7 @@ static gboolean gst_vp9_decoder_stop (GstVideoDecoder * decoder); static gboolean gst_vp9_decoder_set_format (GstVideoDecoder * decoder, GstVideoCodecState * state); +static gboolean gst_vp9_decoder_negotiate (GstVideoDecoder * decoder); static GstFlowReturn gst_vp9_decoder_finish (GstVideoDecoder * decoder); static gboolean gst_vp9_decoder_flush (GstVideoDecoder * decoder); static GstFlowReturn gst_vp9_decoder_drain (GstVideoDecoder * decoder); @@ -125,6 +128,7 @@ decoder_class->start = GST_DEBUG_FUNCPTR (gst_vp9_decoder_start); decoder_class->stop = GST_DEBUG_FUNCPTR (gst_vp9_decoder_stop); decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_vp9_decoder_set_format); + decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_vp9_decoder_negotiate); decoder_class->finish = GST_DEBUG_FUNCPTR (gst_vp9_decoder_finish); decoder_class->flush = GST_DEBUG_FUNCPTR (gst_vp9_decoder_flush); decoder_class->drain = GST_DEBUG_FUNCPTR (gst_vp9_decoder_drain); @@ -216,6 +220,8 @@ GstVp9DecoderClass *klass = GST_VP9_DECODER_GET_CLASS (self); GstFlowReturn ret = GST_FLOW_OK; + g_assert (klass->new_sequence); + if (priv->had_sequence && !gst_vp9_decoder_is_format_change (self, frame_hdr)) { return GST_FLOW_OK; } @@ -243,8 +249,8 @@ priv->preferred_output_delay = 0; } - if (klass->new_sequence) - ret = klass->new_sequence (self, frame_hdr); + ret = klass->new_sequence (self, frame_hdr, + GST_VP9_REF_FRAMES + priv->preferred_output_delay); if (ret != GST_FLOW_OK) priv->had_sequence = FALSE; @@ -262,6 +268,8 @@ GST_DEBUG_OBJECT (decoder, "Set format"); + priv->input_state_changed = TRUE; + if (self->input_state) gst_video_codec_state_unref (self->input_state); @@ -275,6 +283,17 @@ return TRUE; } +static gboolean +gst_vp9_decoder_negotiate (GstVideoDecoder * decoder) +{ + GstVp9Decoder *self = GST_VP9_DECODER (decoder); + + /* output state must be updated by subclass using new input state already */ + self->priv->input_state_changed = FALSE; + + return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); +} + static void gst_vp9_decoder_reset (GstVp9Decoder * self) { @@ -340,7 +359,7 @@ output_frame->frame = NULL; } - gst_vp9_picture_clear (&output_frame->picture); + gst_clear_vp9_picture (&output_frame->picture); } static GstFlowReturn @@ -459,6 +478,7 @@ GST_VIDEO_CODEC_FRAME_SET_DECODE_ONLY (frame); gst_video_decoder_finish_frame (GST_VIDEO_DECODER (self), frame); + return GST_FLOW_OK; } pic_to_dup = priv->dpb->pic_listframe_hdr.frame_to_show_map_idx; @@ -468,6 +488,8 @@ GST_ERROR_OBJECT (self, "subclass didn't provide duplicated picture"); goto unmap_and_error; } + + picture->system_frame_number = pic_to_dup->system_frame_number; } else { picture = gst_vp9_picture_new (); picture->frame_hdr = frame_hdr; @@ -524,6 +546,13 @@ ret = gst_video_decoder_finish_frame (GST_VIDEO_DECODER (self), frame); } else { + /* If subclass didn't update output state at this point, + * marking this picture as a discont and stores current input state */ + if (priv->input_state_changed) { + picture->discont_state = gst_video_codec_state_ref (self->input_state); + priv->input_state_changed = FALSE; + } + output_frame.frame = frame; output_frame.picture = picture; output_frame.self = self;
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstvp9decoder.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstvp9decoder.h
Changed
@@ -67,6 +67,10 @@ /** * GstVp9DecoderClass::new_sequence: + * @decoder: a #GstVp9Decoder + * @frame_hdr: a #GstVp9FrameHeader + * @max_dpb_size: the size of dpb including preferred output delay + * by subclass reported via get_preferred_output_delay method. * * Notifies subclass of video sequence update such as resolution, bitdepth, * profile. @@ -74,7 +78,8 @@ * Since: 1.18 */ GstFlowReturn (*new_sequence) (GstVp9Decoder * decoder, - const GstVp9FrameHeader *frame_hdr); + const GstVp9FrameHeader *frame_hdr, + gint max_dpb_size); /** * GstVp9DecoderClass::new_picture: @@ -108,7 +113,7 @@ * current #GstVideoCodecFrame without additional processing for the current * frame. * - * Returns: (transfer full): a #GstVp9Picture or %NULL if failed to duplicate + * Returns: (transfer full) (nullable): a #GstVp9Picture or %NULL if failed to duplicate * @picture. * * Since: 1.18
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstvp9picture.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstvp9picture.c
Changed
@@ -36,6 +36,9 @@ if (picture->notify) picture->notify (picture->user_data); + if (picture->discont_state) + gst_video_codec_state_unref (picture->discont_state); + g_free (picture); } @@ -148,7 +151,7 @@ g_return_if_fail (dpb != NULL); for (i = 0; i < GST_VP9_REF_FRAMES; i++) - gst_vp9_picture_clear (&dpb->pic_listi); + gst_clear_vp9_picture (&dpb->pic_listi); } /**
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/gstvp9picture.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/gstvp9picture.h
Changed
@@ -22,6 +22,7 @@ #include <gst/codecs/codecs-prelude.h> #include <gst/codecs/gstvp9statefulparser.h> +#include <gst/video/video.h> G_BEGIN_DECLS @@ -46,6 +47,9 @@ const guint8 * data; gsize size; + /* decoder input state if this picture is discont point */ + GstVideoCodecState *discont_state; + gpointer user_data; GDestroyNotify notify; }; @@ -77,7 +81,7 @@ } static inline void -gst_vp9_picture_clear (GstVp9Picture ** picture) +gst_clear_vp9_picture (GstVp9Picture ** picture) { if (picture && *picture) { gst_vp9_picture_unref (*picture);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/codecs/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/codecs/meson.build
Changed
@@ -75,7 +75,7 @@ gen_sources += codecs_gir endif endif -libraries += pkg_name, library_def +gst_libraries += pkg_name, library_def gstcodecs_dep = declare_dependency(link_with : gstcodecs, include_directories : libsinc,
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/cuda-gst.h
Added
@@ -0,0 +1,214 @@ +#pragma once + +#include "cuda-prelude.h" +#include <cuda.h> +#include <cudaGL.h> + +#ifdef G_OS_WIN32 +#ifndef INITGUID +#include <initguid.h> +#endif /* INITGUID */ + +#include <d3d11.h> +#include <dxgi.h> +#include <cudaD3D11.h> +#endif /* G_OS_WIN32 */ + +G_BEGIN_DECLS + +/* cuda.h */ +GST_CUDA_API +CUresult CUDAAPI CuInit (unsigned int Flags); + +GST_CUDA_API +CUresult CUDAAPI CuGetErrorName (CUresult error, + const char **pStr); + +GST_CUDA_API +CUresult CUDAAPI CuGetErrorString (CUresult error, + const char **pStr); + +GST_CUDA_API +CUresult CUDAAPI CuCtxCreate (CUcontext * pctx, + unsigned int flags, + CUdevice dev); + +GST_CUDA_API +CUresult CUDAAPI CuCtxDestroy (CUcontext ctx); + +GST_CUDA_API +CUresult CUDAAPI CuCtxPopCurrent (CUcontext * pctx); + +GST_CUDA_API +CUresult CUDAAPI CuCtxPushCurrent (CUcontext ctx); + +GST_CUDA_API +CUresult CUDAAPI CuCtxEnablePeerAccess (CUcontext peerContext, + unsigned int Flags); + +GST_CUDA_API +CUresult CUDAAPI CuCtxDisablePeerAccess (CUcontext peerContext); + +GST_CUDA_API +CUresult CUDAAPI CuGraphicsMapResources (unsigned int count, + CUgraphicsResource * resources, + CUstream hStream); + +GST_CUDA_API +CUresult CUDAAPI CuGraphicsUnmapResources (unsigned int count, + CUgraphicsResource * resources, + CUstream hStream); + +GST_CUDA_API +CUresult CUDAAPI CuGraphicsSubResourceGetMappedArray (CUarray * pArray, + CUgraphicsResource resource, + unsigned int arrayIndex, + unsigned int mipLevel); + +GST_CUDA_API +CUresult CUDAAPI CuGraphicsResourceGetMappedPointer (CUdeviceptr * pDevPtr, + size_t * pSize, + CUgraphicsResource resource); + +GST_CUDA_API +CUresult CUDAAPI CuGraphicsUnregisterResource (CUgraphicsResource resource); + +GST_CUDA_API +CUresult CUDAAPI CuMemAlloc (CUdeviceptr * dptr, + unsigned int bytesize); + +GST_CUDA_API +CUresult CUDAAPI CuMemAllocPitch (CUdeviceptr * dptr, + size_t * pPitch, + size_t WidthInBytes, + size_t Height, + unsigned int ElementSizeBytes); + +GST_CUDA_API +CUresult CUDAAPI CuMemAllocHost (void **pp, + unsigned int bytesize); + +GST_CUDA_API +CUresult CUDAAPI CuMemcpy2D (const CUDA_MEMCPY2D * pCopy); + +GST_CUDA_API +CUresult CUDAAPI CuMemcpy2DAsync (const CUDA_MEMCPY2D *pCopy, CUstream hStream); + +GST_CUDA_API +CUresult CUDAAPI CuMemFree (CUdeviceptr dptr); + +GST_CUDA_API +CUresult CUDAAPI CuMemFreeHost (void *p); + +GST_CUDA_API +CUresult CUDAAPI CuStreamCreate (CUstream *phStream, + unsigned int Flags); + +GST_CUDA_API +CUresult CUDAAPI CuStreamDestroy (CUstream hStream); + +GST_CUDA_API +CUresult CUDAAPI CuStreamSynchronize (CUstream hStream); + +GST_CUDA_API +CUresult CUDAAPI CuDeviceGet (CUdevice * device, + int ordinal); + +GST_CUDA_API +CUresult CUDAAPI CuDeviceGetCount (int *count); + +GST_CUDA_API +CUresult CUDAAPI CuDeviceGetName (char *name, + int len, + CUdevice dev); + +GST_CUDA_API +CUresult CUDAAPI CuDeviceGetAttribute (int *pi, + CUdevice_attribute attrib, + CUdevice dev); + +GST_CUDA_API +CUresult CUDAAPI CuDeviceCanAccessPeer (int *canAccessPeer, + CUdevice dev, + CUdevice peerDev); + +GST_CUDA_API +CUresult CUDAAPI CuDriverGetVersion (int * driverVersion); + +GST_CUDA_API +CUresult CUDAAPI CuModuleLoadData (CUmodule* module, + const void *image); + +GST_CUDA_API +CUresult CUDAAPI CuModuleUnload (CUmodule module); + +GST_CUDA_API +CUresult CUDAAPI CuModuleGetFunction (CUfunction* hfunc, + CUmodule hmod, + const char* name); + +GST_CUDA_API +CUresult CUDAAPI CuTexObjectCreate (CUtexObject *pTexObject, + const CUDA_RESOURCE_DESC *pResDesc, + const CUDA_TEXTURE_DESC *pTexDesc, + const CUDA_RESOURCE_VIEW_DESC *pResViewDesc); + +GST_CUDA_API +CUresult CUDAAPI CuTexObjectDestroy (CUtexObject texObject); + +GST_CUDA_API +CUresult CUDAAPI CuLaunchKernel (CUfunction f, + unsigned int gridDimX, + unsigned int gridDimY, + unsigned int gridDimZ, + unsigned int blockDimX, + unsigned int blockDimY, + unsigned int blockDimZ, + unsigned int sharedMemBytes, + CUstream hStream, + void **kernelParams, + void **extra); + +/* cudaGL.h */ +GST_CUDA_API +CUresult CUDAAPI CuGraphicsGLRegisterImage (CUgraphicsResource * pCudaResource, + unsigned int image, + unsigned int target, + unsigned int Flags); + +GST_CUDA_API +CUresult CUDAAPI CuGraphicsGLRegisterBuffer (CUgraphicsResource * pCudaResource, + unsigned int buffer, + unsigned int Flags); + +GST_CUDA_API +CUresult CUDAAPI CuGraphicsResourceSetMapFlags (CUgraphicsResource resource, + unsigned int flags); + +GST_CUDA_API +CUresult CUDAAPI CuGLGetDevices (unsigned int * pCudaDeviceCount, + CUdevice * pCudaDevices, + unsigned int cudaDeviceCount, + CUGLDeviceList deviceList); + + +#ifdef G_OS_WIN32 +/* cudaD3D11.h */ +GST_CUDA_API +CUresult CUDAAPI CuGraphicsD3D11RegisterResource(CUgraphicsResource * pCudaResource, + ID3D11Resource * pD3DResource, + unsigned int Flags); + +GST_CUDA_API +CUresult CUDAAPI CuD3D11GetDevice(CUdevice * device, + IDXGIAdapter * pAdapter); + +GST_CUDA_API +CUresult CUDAAPI CuD3D11GetDevices(unsigned int * pCudaDeviceCount, + CUdevice* pCudaDevices, + unsigned int cudaDeviceCount, + ID3D11Device * pD3D11Device, + CUd3d11DeviceList deviceList); +#endif + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/cuda-prelude.h
Added
@@ -0,0 +1,36 @@ +/* GStreamer Cuda Library + * Copyright (C) 2021 GStreamer developers + * + * -prelude.h: prelude include header for gst-cuda library + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_CUDA_PRELUDE_H__ +#define __GST_CUDA_PRELUDE_H__ + +#include <gst/gst.h> + +#ifndef GST_CUDA_API +# ifdef BUILDING_GST_CUDA +# define GST_CUDA_API GST_API_EXPORT /* from config.h */ +# else +# define GST_CUDA_API GST_API_IMPORT +# endif +#endif + +#endif /* __GST_CUDA_PRELUDE_H__ */ +
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/gstcuda-private.h
Added
@@ -0,0 +1,52 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "cuda-prelude.h" +#include "cuda-gst.h" + +#include <gst/video/video.h> + +G_BEGIN_DECLS + +typedef enum +{ + GST_CUDA_BUFFER_COPY_SYSTEM, + GST_CUDA_BUFFER_COPY_CUDA, + GST_CUDA_BUFFER_COPY_GL, + GST_CUDA_BUFFER_COPY_D3D11, + GST_CUDA_BUFFER_COPY_NVMM, +} GstCudaBufferCopyType; + +GST_CUDA_API +const gchar * gst_cuda_buffer_copy_type_to_string (GstCudaBufferCopyType type); + +GST_CUDA_API +gboolean gst_cuda_buffer_copy (GstBuffer * dst, + GstCudaBufferCopyType dst_type, + const GstVideoInfo * dst_info, + GstBuffer * src, + GstCudaBufferCopyType src_type, + const GstVideoInfo * src_info, + GstCudaContext * context, + CUstream stream); + +G_END_DECLS +
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/gstcudabufferpool.c
Added
@@ -0,0 +1,192 @@ +/* GStreamer + * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstcudabufferpool.h" +#include "gstcudacontext.h" +#include "gstcudamemory.h" + +GST_DEBUG_CATEGORY_STATIC (gst_cuda_buffer_pool_debug); +#define GST_CAT_DEFAULT gst_cuda_buffer_pool_debug + +struct _GstCudaBufferPoolPrivate +{ + GstCudaAllocator *allocator; + GstVideoInfo info; +}; + +#define gst_cuda_buffer_pool_parent_class parent_class +G_DEFINE_TYPE_WITH_PRIVATE (GstCudaBufferPool, gst_cuda_buffer_pool, + GST_TYPE_BUFFER_POOL); + +static const gchar ** +gst_cuda_buffer_pool_get_options (GstBufferPool * pool) +{ + static const gchar *options = { GST_BUFFER_POOL_OPTION_VIDEO_META, NULL + }; + + return options; +} + +static gboolean +gst_cuda_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config) +{ + GstCudaBufferPool *self = GST_CUDA_BUFFER_POOL (pool); + GstCudaBufferPoolPrivate *priv = self->priv; + GstCaps *caps = NULL; + guint size, min_buffers, max_buffers; + GstVideoInfo info; + GstMemory *mem; + GstCudaMemory *cmem; + + if (!gst_buffer_pool_config_get_params (config, &caps, &size, &min_buffers, + &max_buffers)) { + GST_WARNING_OBJECT (self, "invalid config"); + return FALSE; + } + + if (!caps) { + GST_WARNING_OBJECT (pool, "no caps in config"); + return FALSE; + } + + if (!gst_video_info_from_caps (&info, caps)) { + GST_WARNING_OBJECT (self, "Failed to convert caps to video-info"); + return FALSE; + } + + gst_clear_object (&priv->allocator); + priv->allocator = (GstCudaAllocator *) + gst_allocator_find (GST_CUDA_MEMORY_TYPE_NAME); + if (!priv->allocator) { + GST_WARNING_OBJECT (self, "CudaAllocator is unavailable"); + return FALSE; + } + + mem = gst_cuda_allocator_alloc (priv->allocator, self->context, &info); + if (!mem) { + GST_WARNING_OBJECT (self, "Failed to allocate memory"); + return FALSE; + } + + cmem = GST_CUDA_MEMORY_CAST (mem); + + gst_buffer_pool_config_set_params (config, caps, + GST_VIDEO_INFO_SIZE (&cmem->info), min_buffers, max_buffers); + + priv->info = info; + + gst_memory_unref (mem); + + return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config); +} + +static GstFlowReturn +gst_cuda_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer, + GstBufferPoolAcquireParams * params) +{ + GstCudaBufferPool *self = GST_CUDA_BUFFER_POOL_CAST (pool); + GstCudaBufferPoolPrivate *priv = self->priv; + GstVideoInfo *info = &priv->info; + GstBuffer *buf; + GstMemory *mem; + GstCudaMemory *cmem; + + mem = gst_cuda_allocator_alloc (priv->allocator, self->context, &priv->info); + if (!mem) { + GST_WARNING_OBJECT (pool, "Cannot create CUDA memory"); + return GST_FLOW_ERROR; + } + + cmem = GST_CUDA_MEMORY_CAST (mem); + + buf = gst_buffer_new (); + + gst_buffer_append_memory (buf, mem); + + GST_DEBUG_OBJECT (pool, "adding GstVideoMeta"); + gst_buffer_add_video_meta_full (buf, GST_VIDEO_FRAME_FLAG_NONE, + GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_WIDTH (info), + GST_VIDEO_INFO_HEIGHT (info), GST_VIDEO_INFO_N_PLANES (info), + cmem->info.offset, cmem->info.stride); + + *buffer = buf; + + return GST_FLOW_OK; +} + +/** + * gst_cuda_buffer_pool_new: + * @context: The #GstCudaContext to use for the new buffer pool + * + * Returns: A newly created #GstCudaBufferPool + * + * Since: 1.22 + */ +GstBufferPool * +gst_cuda_buffer_pool_new (GstCudaContext * context) +{ + GstCudaBufferPool *self; + + g_return_val_if_fail (GST_IS_CUDA_CONTEXT (context), NULL); + + self = g_object_new (GST_TYPE_CUDA_BUFFER_POOL, NULL); + gst_object_ref_sink (self); + + self->context = gst_object_ref (context); + + return GST_BUFFER_POOL_CAST (self); +} + +static void +gst_cuda_buffer_pool_dispose (GObject * object) +{ + GstCudaBufferPool *self = GST_CUDA_BUFFER_POOL_CAST (object); + GstCudaBufferPoolPrivate *priv = self->priv; + + gst_clear_object (&priv->allocator); + gst_clear_object (&self->context); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_cuda_buffer_pool_class_init (GstCudaBufferPoolClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBufferPoolClass *bufferpool_class = (GstBufferPoolClass *) klass; + + gobject_class->dispose = gst_cuda_buffer_pool_dispose; + + bufferpool_class->get_options = gst_cuda_buffer_pool_get_options; + bufferpool_class->set_config = gst_cuda_buffer_pool_set_config; + bufferpool_class->alloc_buffer = gst_cuda_buffer_pool_alloc; + + GST_DEBUG_CATEGORY_INIT (gst_cuda_buffer_pool_debug, "cudabufferpool", 0, + "CUDA Buffer Pool"); +} + +static void +gst_cuda_buffer_pool_init (GstCudaBufferPool * pool) +{ + pool->priv = gst_cuda_buffer_pool_get_instance_private (pool); +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/gstcudabufferpool.h
Added
@@ -0,0 +1,83 @@ +/* GStreamer + * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_CUDA_BUFFER_POOL_H__ +#define __GST_CUDA_BUFFER_POOL_H__ + +#ifndef GST_USE_UNSTABLE_API +#warning "The Cuda library from gst-plugins-bad is unstable API and may change in future." +#warning "You can define GST_USE_UNSTABLE_API to avoid this warning." +#endif + +#include "cuda-prelude.h" +#include <gst/video/gstvideometa.h> +#include <gst/video/gstvideopool.h> + +#include "gstcudamemory.h" + +G_BEGIN_DECLS + +#define GST_TYPE_CUDA_BUFFER_POOL (gst_cuda_buffer_pool_get_type ()) +#define GST_CUDA_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),GST_TYPE_CUDA_BUFFER_POOL,GstCudaBufferPool)) +#define GST_CUDA_BUFFER_POOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_CUDA_BUFFER_POOL,GstCudaBufferPoolClass)) +#define GST_CUDA_BUFFER_POOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CUDA_BUFFER_POOL,GstCudaBufferPoolClass)) +#define GST_IS_CUDA_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),GST_TYPE_CUDA_BUFFER_POOL)) +#define GST_IS_CUDA_BUFFER_POOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CUDA_BUFFER_POOL)) +/** + * GST_CUDA_BUFFER_POOL_CAST: + * + * Since: 1.22 + */ +#define GST_CUDA_BUFFER_POOL_CAST(obj) ((GstCudaBufferPool*)(obj)) + +typedef struct _GstCudaBufferPool GstCudaBufferPool; +typedef struct _GstCudaBufferPoolClass GstCudaBufferPoolClass; +typedef struct _GstCudaBufferPoolPrivate GstCudaBufferPoolPrivate; + +/** + * GstCudaBufferPool: + * + * Since: 1.22 + */ +struct _GstCudaBufferPool +{ + GstBufferPool parent; + + GstCudaContext *context; + + GstCudaBufferPoolPrivate *priv; +}; + +/* + * GstCudaBufferPoolClass: + */ +struct _GstCudaBufferPoolClass +{ + GstBufferPoolClass parent_class; +}; + +GST_CUDA_API +GType gst_cuda_buffer_pool_get_type (void); + +GST_CUDA_API +GstBufferPool * gst_cuda_buffer_pool_new (GstCudaContext * context); + +G_END_DECLS + +#endif /* __GST_CUDA_BUFFER_POOL_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/gstcudacontext.c
Added
@@ -0,0 +1,581 @@ +/* GStreamer + * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstcudaloader.h" +#include "gstcudacontext.h" +#include "gstcudautils.h" + +#ifdef GST_CUDA_HAS_D3D +#include <gst/d3d11/gstd3d11.h> +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_cuda_context_debug); +#define GST_CAT_DEFAULT gst_cuda_context_debug + +/* store all context object with weak ref */ +static GList *context_list = NULL; +G_LOCK_DEFINE_STATIC (list_lock); + +enum +{ + PROP_0, + PROP_DEVICE_ID, + PROP_DXGI_ADAPTER_LUID, +}; + +struct _GstCudaContextPrivate +{ + CUcontext context; + CUdevice device; + guint device_id; + gint64 dxgi_adapter_luid; + + gint tex_align; + + GHashTable *accessible_peer; + gboolean owns_context; +}; + +#define gst_cuda_context_parent_class parent_class +G_DEFINE_TYPE_WITH_PRIVATE (GstCudaContext, gst_cuda_context, GST_TYPE_OBJECT); + +static void gst_cuda_context_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_cuda_context_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_cuda_context_finalize (GObject * object); +static void gst_cuda_context_weak_ref_notify (gpointer data, + GstCudaContext * context); +static void gst_cuda_context_enable_peer_access (GstCudaContext * context, + GstCudaContext * peer); + +static void +gst_cuda_context_class_init (GstCudaContextClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = gst_cuda_context_set_property; + gobject_class->get_property = gst_cuda_context_get_property; + gobject_class->finalize = gst_cuda_context_finalize; + + /** + * GstCudaContext::cuda-device-id: + * + * The GPU index to use for the context. + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_DEVICE_ID, + g_param_spec_uint ("cuda-device-id", "Cuda Device ID", + "Set the GPU device to use for operations", + 0, G_MAXUINT, 0, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + +#ifdef GST_CUDA_HAS_D3D + g_object_class_install_property (gobject_class, PROP_DXGI_ADAPTER_LUID, + g_param_spec_int64 ("dxgi-adapter-luid", "DXGI Adapter LUID", + "Associated DXGI Adapter LUID (Locally Unique Identifier) ", + G_MININT64, G_MAXINT64, 0, + GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); +#endif +} + +static void +gst_cuda_context_init (GstCudaContext * context) +{ + GstCudaContextPrivate *priv = gst_cuda_context_get_instance_private (context); + + priv->accessible_peer = g_hash_table_new (g_direct_hash, g_direct_equal); + + context->priv = priv; +} + +static void +gst_cuda_context_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstCudaContext *context = GST_CUDA_CONTEXT (object); + GstCudaContextPrivate *priv = context->priv; + + switch (prop_id) { + case PROP_DEVICE_ID: + priv->device_id = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_cuda_context_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstCudaContext *context = GST_CUDA_CONTEXT (object); + GstCudaContextPrivate *priv = context->priv; + + switch (prop_id) { + case PROP_DEVICE_ID: + g_value_set_uint (value, priv->device_id); + break; + case PROP_DXGI_ADAPTER_LUID: + g_value_set_int64 (value, priv->dxgi_adapter_luid); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +#ifdef GST_CUDA_HAS_D3D +static gint64 +gst_cuda_context_find_dxgi_adapter_luid (CUdevice cuda_device) +{ + gint64 ret = 0; + HRESULT hr; + IDXGIFactory1 *factory = NULL; + guint i; + + hr = CreateDXGIFactory1 (&IID_IDXGIFactory1, (void **) &factory); + if (FAILED (hr)) + return 0; + + for (i = 0;; i++) { + IDXGIAdapter1 *adapter; + DXGI_ADAPTER_DESC desc; + CUdevice other_dev = 0; + CUresult cuda_ret; + + hr = IDXGIFactory1_EnumAdapters1 (factory, i, &adapter); + if (FAILED (hr)) + break; + + hr = IDXGIAdapter1_GetDesc (adapter, &desc); + if (FAILED (hr)) { + IDXGIAdapter1_Release (adapter); + continue; + } + + if (desc.VendorId != 0x10de) { + IDXGIAdapter1_Release (adapter); + continue; + } + + cuda_ret = CuD3D11GetDevice (&other_dev, (IDXGIAdapter *) adapter); + IDXGIAdapter1_Release (adapter); + + if (cuda_ret == CUDA_SUCCESS && other_dev == cuda_device) { + ret = gst_d3d11_luid_to_int64 (&desc.AdapterLuid); + break; + } + } + + IDXGIFactory1_Release (factory); + + return ret; +} +#endif +static gboolean +init_cuda_ctx (void) +{ + gboolean ret = TRUE; + + static gsize once = 0; + + if (g_once_init_enter (&once)) { + if (CuInit (0) != CUDA_SUCCESS) { + GST_ERROR ("Failed to cuInit"); + ret = FALSE; + } + GST_DEBUG_CATEGORY_INIT (gst_cuda_context_debug, + "cudacontext", 0, "CUDA Context"); + g_once_init_leave (&once, ret); + } + + return ret; +} + +static gboolean +gst_create_cucontext (guint * device_id, CUcontext * context) +{ + CUcontext cuda_ctx; + CUdevice cdev = 0, cuda_dev = -1; + gint dev_count = 0; + gchar name256; + gint min = 0, maj = 0; + gint i; + + + if (!init_cuda_ctx ()) + return FALSE; + + if (!gst_cuda_result (CuDeviceGetCount (&dev_count)) || dev_count == 0) { + GST_WARNING ("No CUDA devices detected"); + return FALSE; + } + + for (i = 0; i < dev_count; ++i) { + if (gst_cuda_result (CuDeviceGet (&cdev, i)) && + gst_cuda_result (CuDeviceGetName (name, sizeof (name), cdev)) && + gst_cuda_result (CuDeviceGetAttribute (&maj, + CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, cdev)) && + gst_cuda_result (CuDeviceGetAttribute (&min, + CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, cdev))) { + GST_INFO ("GPU #%d supports NVENC: %s (%s) (Compute SM %d.%d)", i, + (((maj << 4) + min) >= 0x30) ? "yes" : "no", name, maj, min); + if (*device_id == -1 || *device_id == cdev) { + *device_id = cuda_dev = cdev; + break; + } + } + } + + if (cuda_dev == -1) { + GST_WARNING ("Device with id %d does not exist", *device_id); + return FALSE; + } + + if (!gst_cuda_result (CuDeviceGet (&cdev, *device_id))) { + GST_WARNING ("Failed to get device for id %d", *device_id); + return FALSE; + } + + if (!gst_cuda_result (CuCtxCreate (&cuda_ctx, 0, cuda_dev))) { + GST_WARNING ("Failed to create CUDA context for cuda device %d", cuda_dev); + return FALSE; + } + + GST_INFO ("Created CUDA context %p with device-id %d", cuda_ctx, *device_id); + + *context = cuda_ctx; + + return TRUE; +} + +/* must be called with list_lock taken */ +static void +gst_cuda_context_enable_peer_access (GstCudaContext * context, + GstCudaContext * peer) +{ + GstCudaContextPrivate *priv = context->priv; + GstCudaContextPrivate *peer_priv = peer->priv; + CUdevice device = priv->device; + CUdevice other_dev = peer_priv->device; + CUresult cuda_ret; + gint can_access = 0; + + cuda_ret = CuDeviceCanAccessPeer (&can_access, device, other_dev); + + if (!gst_cuda_result (cuda_ret) || !can_access) { + GST_DEBUG_OBJECT (context, + "Peer access to %" GST_PTR_FORMAT " is not allowed", peer); + return; + } + + gst_cuda_context_push (context); + if (gst_cuda_result (CuCtxEnablePeerAccess (peer_priv->context, 0))) { + GST_DEBUG_OBJECT (context, "Enable peer access to %" GST_PTR_FORMAT, peer); + g_hash_table_add (priv->accessible_peer, peer); + } + + gst_cuda_context_pop (NULL); +} + +static void +gst_cuda_context_weak_ref_notify (gpointer data, GstCudaContext * context) +{ + GList *iter; + + G_LOCK (list_lock); + context_list = g_list_remove (context_list, context); + + /* disable self -> peer access */ + if (context->priv->accessible_peer) { + GHashTableIter iter; + gpointer key; + g_hash_table_iter_init (&iter, context->priv->accessible_peer); + if (gst_cuda_context_push (context)) { + while (g_hash_table_iter_next (&iter, &key, NULL)) { + GstCudaContext *peer = GST_CUDA_CONTEXT (key); + CUcontext peer_handle = gst_cuda_context_get_handle (peer); + GST_DEBUG_OBJECT (context, + "Disable peer access to %" GST_PTR_FORMAT, peer); + gst_cuda_result (CuCtxDisablePeerAccess (peer_handle)); + } + gst_cuda_context_pop (NULL); + } + + g_hash_table_destroy (context->priv->accessible_peer); + context->priv->accessible_peer = NULL; + } + + /* disable peer -> self access */ + for (iter = context_list; iter; iter = g_list_next (iter)) { + GstCudaContext *other = (GstCudaContext *) iter->data; + GstCudaContextPrivate *other_priv = other->priv; + CUcontext self_handle; + + if (!other_priv->accessible_peer) + continue; + + if (g_hash_table_lookup (other_priv->accessible_peer, context)) { + if (gst_cuda_context_push (other)) { + self_handle = gst_cuda_context_get_handle (context); + GST_DEBUG_OBJECT (other, + "Disable peer access to %" GST_PTR_FORMAT, context); + gst_cuda_result (CuCtxDisablePeerAccess (self_handle)); + gst_cuda_context_pop (NULL); + } + + g_hash_table_remove (other_priv->accessible_peer, context); + } + } + G_UNLOCK (list_lock); +} + +static void +gst_cuda_context_finalize (GObject * object) +{ + GstCudaContext *context = GST_CUDA_CONTEXT_CAST (object); + GstCudaContextPrivate *priv = context->priv; + + if (priv->context && priv->owns_context) { + GST_DEBUG_OBJECT (context, "Destroying CUDA context %p", priv->context); + gst_cuda_result (CuCtxDestroy (priv->context)); + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +/** + * gst_cuda_context_new: + * @device_id: device-id for creating #GstCudaContext + * + * Create #GstCudaContext with given device_id + * + * Returns: (transfer full) (nullable): a new #GstCudaContext or %NULL on + * failure + * + * Since: 1.22 + */ +GstCudaContext * +gst_cuda_context_new (guint device_id) +{ + CUcontext old_ctx; + CUcontext ctx; + GstCudaContext *self; + + if (!gst_create_cucontext (&device_id, &ctx)) { + return NULL; + } + + self = gst_cuda_context_new_wrapped (ctx, device_id); + if (!self) { + CuCtxDestroy (ctx); + return NULL; + } + + self->priv->owns_context = TRUE; + + if (!gst_cuda_result (CuCtxPopCurrent (&old_ctx))) { + GST_ERROR ("Could not pop current context"); + g_object_unref (self); + + return NULL; + } + + return self; +} + +/** + * gst_cuda_context_push: + * @ctx: a #GstCudaContext to push current thread + * + * Pushes the given @ctx onto the CPU thread's stack of current contexts. + * The specified context becomes the CPU thread's current context, + * so all CUDA functions that operate on the current context are affected. + * + * Returns: %TRUE if @ctx was pushed without error. + * + * Since: 1.22 + */ +gboolean +gst_cuda_context_push (GstCudaContext * ctx) +{ + g_return_val_if_fail (ctx, FALSE); + g_return_val_if_fail (GST_IS_CUDA_CONTEXT (ctx), FALSE); + + return gst_cuda_result (CuCtxPushCurrent (ctx->priv->context)); +} + +/** + * gst_cuda_context_pop: + * + * Pops the current CUDA context from CPU thread + * + * Returns: %TRUE if @ctx was pushed without error. + * + * Since: 1.22 + */ +gboolean +gst_cuda_context_pop (CUcontext * cuda_ctx) +{ + return gst_cuda_result (CuCtxPopCurrent (cuda_ctx)); +} + +/** + * gst_cuda_context_get_handle: + * @ctx: a #GstCudaContext + * + * Get CUDA device context. Caller must not modify and/or destroy + * returned device context. + * + * Returns: the `CUcontext` of @ctx + * + * Since: 1.22 + */ +gpointer +gst_cuda_context_get_handle (GstCudaContext * ctx) +{ + g_return_val_if_fail (ctx, NULL); + g_return_val_if_fail (GST_IS_CUDA_CONTEXT (ctx), NULL); + + return ctx->priv->context; +} + +/** + * gst_cuda_context_get_texture_alignment: + * @ctx: a #GstCudaContext + * + * Get required texture alignment by device + * + * Returns: the `CUcontext` of @ctx + * + * Since: 1.22 + */ +gint +gst_cuda_context_get_texture_alignment (GstCudaContext * ctx) +{ + g_return_val_if_fail (ctx, 0); + g_return_val_if_fail (GST_IS_CUDA_CONTEXT (ctx), 0); + + return ctx->priv->tex_align; +} + +/** + * gst_cuda_context_can_access_peer: + * @ctx: a #GstCudaContext + * @peer: a #GstCudaContext + * + * Query whether @ctx can access any memory which belongs to @peer directly. + * + * Returns: %TRUE if @ctx can access @peer directly + * + * Since: 1.22 + */ +gboolean +gst_cuda_context_can_access_peer (GstCudaContext * ctx, GstCudaContext * peer) +{ + gboolean ret = FALSE; + + g_return_val_if_fail (GST_IS_CUDA_CONTEXT (ctx), FALSE); + g_return_val_if_fail (GST_IS_CUDA_CONTEXT (peer), FALSE); + + G_LOCK (list_lock); + if (ctx->priv->accessible_peer && + g_hash_table_lookup (ctx->priv->accessible_peer, peer)) { + ret = TRUE; + } + G_UNLOCK (list_lock); + + return ret; +} + + +/** + * gst_cuda_context_new_wrapped: + * @handler: A + * CUcontext(https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__TYPES.html#group__CUDA__TYPES_1gf9f5bd81658f866613785b3a0bb7d7d9) + * to wrap + * @device: A + * CUDevice(https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__TYPES.html#group__CUDA__TYPES_1gf9f5bd81658f866613785b3a0bb7d7d9) + * to wrap + * + * Note: The caller is responsible for ensuring that the CUcontext and CUdevice + * represented by @handle and @device stay alive while the returned + * #GstCudaContext is active. + * + * Returns: (transfer full) (nullable): A newly created #GstCudaContext + * + * Since: 1.22 + */ +GstCudaContext * +gst_cuda_context_new_wrapped (CUcontext handler, CUdevice device) +{ + GList *iter; + gint tex_align = 0; + + GstCudaContext *self; + + g_return_val_if_fail (handler, NULL); + g_return_val_if_fail (device >= 0, NULL); + + if (!init_cuda_ctx ()) + return NULL; + + if (!gst_cuda_result (CuDeviceGetAttribute (&tex_align, + CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT, device))) { + GST_ERROR ("Could not get texture alignment for %d", device); + + return NULL; + } + + self = g_object_new (GST_TYPE_CUDA_CONTEXT, "cuda-device-id", device, NULL); + self->priv->context = handler; + self->priv->device = device; + self->priv->tex_align = tex_align; + gst_object_ref_sink (self); + +#ifdef GST_CUDA_HAS_D3D + self->priv->dxgi_adapter_luid = + gst_cuda_context_find_dxgi_adapter_luid (self->priv->device); +#endif + + + G_LOCK (list_lock); + g_object_weak_ref (G_OBJECT (self), + (GWeakNotify) gst_cuda_context_weak_ref_notify, NULL); + for (iter = context_list; iter; iter = g_list_next (iter)) { + GstCudaContext *peer = (GstCudaContext *) iter->data; + + /* EnablePeerAccess is unidirectional */ + gst_cuda_context_enable_peer_access (self, peer); + gst_cuda_context_enable_peer_access (peer, self); + } + + context_list = g_list_append (context_list, self); + G_UNLOCK (list_lock); + + return self; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/gstcudacontext.h
Added
@@ -0,0 +1,104 @@ +/* GStreamer + * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_CUDA_CONTEXT_H__ +#define __GST_CUDA_CONTEXT_H__ + +#ifndef GST_USE_UNSTABLE_API +#warning "The Cuda library from gst-plugins-bad is unstable API and may change in future." +#warning "You can define GST_USE_UNSTABLE_API to avoid this warning." +#endif + +#include "cuda-prelude.h" +#include <gst/gst.h> +#include "cuda.h" + +G_BEGIN_DECLS + +#define GST_TYPE_CUDA_CONTEXT (gst_cuda_context_get_type()) +#define GST_CUDA_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_CUDA_CONTEXT,GstCudaContext)) +#define GST_CUDA_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CUDA_CONTEXT,GstCudaContextClass)) +#define GST_CUDA_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CUDA_CONTEXT,GstCudaContextClass)) +#define GST_IS_CUDA_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),GST_TYPE_CUDA_CONTEXT)) +#define GST_IS_CUDA_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CUDA_CONTEXT)) + +/** + * GST_CUDA_CONTEXT_CAST: + * + * Since: 1.22 + */ +#define GST_CUDA_CONTEXT_CAST(obj) ((GstCudaContext*)(obj)) + +/** + * GST_CUDA_CONTEXT_TYPE: + * + * Since: 1.22 + */ +#define GST_CUDA_CONTEXT_TYPE "gst.cuda.context" + +typedef struct _GstCudaContext GstCudaContext; +typedef struct _GstCudaContextClass GstCudaContextClass; +typedef struct _GstCudaContextPrivate GstCudaContextPrivate; + +/** + * GstCudaContext: + * + * Since: 1.22 + */ +struct _GstCudaContext +{ + GstObject object; + + /*< private >*/ + GstCudaContextPrivate *priv; +}; + +struct _GstCudaContextClass +{ + GstObjectClass parent_class; +}; + +GST_CUDA_API +GType gst_cuda_context_get_type (void); + +GST_CUDA_API +GstCudaContext * gst_cuda_context_new (guint device_id); + +GST_CUDA_API +GstCudaContext * gst_cuda_context_new_wrapped (CUcontext handler, CUdevice device); + +GST_CUDA_API +gboolean gst_cuda_context_push (GstCudaContext * ctx); + +GST_CUDA_API +gboolean gst_cuda_context_pop (CUcontext * cuda_ctx); + +GST_CUDA_API +gpointer gst_cuda_context_get_handle (GstCudaContext * ctx); + +GST_CUDA_API +gint gst_cuda_context_get_texture_alignment (GstCudaContext * ctx); + +GST_CUDA_API +gboolean gst_cuda_context_can_access_peer (GstCudaContext * ctx, + GstCudaContext * peer); + +G_END_DECLS + +#endif /* __GST_CUDA_CONTEXT_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/gstcudaloader.c
Added
@@ -0,0 +1,624 @@ +/* GStreamer + * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "cuda-gst.h" +#include "gstcudaloader.h" +#include <gmodule.h> + +GST_DEBUG_CATEGORY (gst_cudaloader_debug); +#define GST_CAT_DEFAULT gst_cudaloader_debug + +#ifndef G_OS_WIN32 +#define CUDA_LIBNAME "libcuda.so.1" +#else +#define CUDA_LIBNAME "nvcuda.dll" +#endif + +#define LOAD_SYMBOL(name,func) G_STMT_START { \ + if (!g_module_symbol (module, G_STRINGIFY (name), (gpointer *) &vtable->func)) { \ + GST_ERROR ("Failed to load '%s' from %s, %s", G_STRINGIFY (name), filename, g_module_error()); \ + goto error; \ + } \ +} G_STMT_END; + +/* *INDENT-OFF* */ +typedef struct _GstNvCodecCudaVTable +{ + gboolean loaded; + + CUresult (CUDAAPI * CuInit) (unsigned int Flags); + CUresult (CUDAAPI * CuGetErrorName) (CUresult error, const char **pStr); + CUresult (CUDAAPI * CuGetErrorString) (CUresult error, const char **pStr); + + CUresult (CUDAAPI * CuCtxCreate) (CUcontext * pctx, unsigned int flags, + CUdevice dev); + CUresult (CUDAAPI * CuCtxDestroy) (CUcontext ctx); + CUresult (CUDAAPI * CuCtxPopCurrent) (CUcontext * pctx); + CUresult (CUDAAPI * CuCtxPushCurrent) (CUcontext ctx); + + CUresult (CUDAAPI * CuCtxEnablePeerAccess) (CUcontext peerContext, + unsigned int Flags); + CUresult (CUDAAPI * CuCtxDisablePeerAccess) (CUcontext peerContext); + CUresult (CUDAAPI * CuGraphicsMapResources) (unsigned int count, + CUgraphicsResource * resources, CUstream hStream); + CUresult (CUDAAPI * CuGraphicsUnmapResources) (unsigned int count, + CUgraphicsResource * resources, CUstream hStream); + CUresult (CUDAAPI * + CuGraphicsResourceSetMapFlags) (CUgraphicsResource resource, + unsigned int flags); + CUresult (CUDAAPI * CuGraphicsSubResourceGetMappedArray) (CUarray * pArray, + CUgraphicsResource resource, unsigned int arrayIndex, + unsigned int mipLevel); + CUresult (CUDAAPI * CuGraphicsResourceGetMappedPointer) (CUdeviceptr * + pDevPtr, size_t * pSize, CUgraphicsResource resource); + CUresult (CUDAAPI * + CuGraphicsUnregisterResource) (CUgraphicsResource resource); + + CUresult (CUDAAPI * CuMemAlloc) (CUdeviceptr * dptr, unsigned int bytesize); + CUresult (CUDAAPI * CuMemAllocPitch) (CUdeviceptr * dptr, size_t * pPitch, + size_t WidthInBytes, size_t Height, unsigned int ElementSizeBytes); + CUresult (CUDAAPI * CuMemAllocHost) (void **pp, unsigned int bytesize); + CUresult (CUDAAPI * CuMemcpy2D) (const CUDA_MEMCPY2D * pCopy); + CUresult (CUDAAPI * CuMemcpy2DAsync) (const CUDA_MEMCPY2D * pCopy, + CUstream hStream); + + CUresult (CUDAAPI * CuMemFree) (CUdeviceptr dptr); + CUresult (CUDAAPI * CuMemFreeHost) (void *p); + + CUresult (CUDAAPI * CuStreamCreate) (CUstream * phStream, + unsigned int Flags); + CUresult (CUDAAPI * CuStreamDestroy) (CUstream hStream); + CUresult (CUDAAPI * CuStreamSynchronize) (CUstream hStream); + + CUresult (CUDAAPI * CuDeviceGet) (CUdevice * device, int ordinal); + CUresult (CUDAAPI * CuDeviceGetCount) (int *count); + CUresult (CUDAAPI * CuDeviceGetName) (char *name, int len, CUdevice dev); + CUresult (CUDAAPI * CuDeviceGetAttribute) (int *pi, + CUdevice_attribute attrib, CUdevice dev); + CUresult (CUDAAPI * CuDeviceCanAccessPeer) (int *canAccessPeer, + CUdevice dev, CUdevice peerDev); + CUresult (CUDAAPI * CuDriverGetVersion) (int *driverVersion); + + CUresult (CUDAAPI * CuModuleLoadData) (CUmodule * module, + const void *image); + CUresult (CUDAAPI * CuModuleUnload) (CUmodule module); + CUresult (CUDAAPI * CuModuleGetFunction) (CUfunction * hfunc, + CUmodule hmod, const char *name); + CUresult (CUDAAPI * CuTexObjectCreate) (CUtexObject * pTexObject, + const CUDA_RESOURCE_DESC * pResDesc, const CUDA_TEXTURE_DESC * pTexDesc, + const CUDA_RESOURCE_VIEW_DESC * pResViewDesc); + CUresult (CUDAAPI * CuTexObjectDestroy) (CUtexObject texObject); + CUresult (CUDAAPI * CuLaunchKernel) (CUfunction f, unsigned int gridDimX, + unsigned int gridDimY, unsigned int gridDimZ, + unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ, + unsigned int sharedMemBytes, CUstream hStream, void **kernelParams, + void **extra); + + CUresult (CUDAAPI * CuGraphicsGLRegisterImage) (CUgraphicsResource * + pCudaResource, unsigned int image, unsigned int target, + unsigned int Flags); + CUresult (CUDAAPI * CuGraphicsGLRegisterBuffer) (CUgraphicsResource * + pCudaResource, unsigned int buffer, unsigned int Flags); + CUresult (CUDAAPI * CuGLGetDevices) (unsigned int *pCudaDeviceCount, + CUdevice * pCudaDevices, unsigned int cudaDeviceCount, + CUGLDeviceList deviceList); + +#ifdef G_OS_WIN32 + CUresult (CUDAAPI * CuGraphicsD3D11RegisterResource) (CUgraphicsResource * + pCudaResource, ID3D11Resource * pD3DResource, unsigned int Flags); + CUresult (CUDAAPI * CuD3D11GetDevice) (CUdevice * device, + IDXGIAdapter * pAdapter); + CUresult (CUDAAPI * CuD3D11GetDevices) (unsigned int *pCudaDeviceCount, + CUdevice * pCudaDevices, unsigned int cudaDeviceCount, + ID3D11Device * pD3D11Device, CUd3d11DeviceList deviceList); +#endif +} GstNvCodecCudaVTable; +/* *INDENT-ON* */ + +static GstNvCodecCudaVTable gst_cuda_vtable = { 0, }; + +/** + * gst_cuda_load_library: + * + * Loads the cuda library + * + * Returns: %TRUE if the libcuda could be loaded %FALSE otherwise + * + * Since: 1.22 + */ +gboolean +gst_cuda_load_library (void) +{ + GModule *module; + const gchar *filename = CUDA_LIBNAME; + GstNvCodecCudaVTable *vtable; + static gsize debug_initialized = FALSE; + + if (g_once_init_enter (&debug_initialized)) { + GST_DEBUG_CATEGORY_INIT (gst_cudaloader_debug, "cudaloader", 0, + "cudaloader"); + + g_once_init_leave (&debug_initialized, TRUE); + } + + if (gst_cuda_vtable.loaded) + return TRUE; + + module = g_module_open (filename, G_MODULE_BIND_LAZY); + if (module == NULL) { + GST_WARNING ("Could not open library %s, %s", filename, g_module_error ()); + return FALSE; + } + + vtable = &gst_cuda_vtable; + + /* cuda.h */ + LOAD_SYMBOL (cuInit, CuInit); + LOAD_SYMBOL (cuGetErrorName, CuGetErrorName); + LOAD_SYMBOL (cuGetErrorString, CuGetErrorString); + LOAD_SYMBOL (cuCtxCreate, CuCtxCreate); + LOAD_SYMBOL (cuCtxDestroy, CuCtxDestroy); + LOAD_SYMBOL (cuCtxPopCurrent, CuCtxPopCurrent); + LOAD_SYMBOL (cuCtxPushCurrent, CuCtxPushCurrent); + LOAD_SYMBOL (cuCtxEnablePeerAccess, CuCtxEnablePeerAccess); + LOAD_SYMBOL (cuCtxDisablePeerAccess, CuCtxDisablePeerAccess); + + LOAD_SYMBOL (cuGraphicsMapResources, CuGraphicsMapResources); + LOAD_SYMBOL (cuGraphicsUnmapResources, CuGraphicsUnmapResources); + LOAD_SYMBOL (cuGraphicsResourceSetMapFlags, CuGraphicsResourceSetMapFlags); + LOAD_SYMBOL (cuGraphicsSubResourceGetMappedArray, + CuGraphicsSubResourceGetMappedArray); + LOAD_SYMBOL (cuGraphicsResourceGetMappedPointer, + CuGraphicsResourceGetMappedPointer); + LOAD_SYMBOL (cuGraphicsUnregisterResource, CuGraphicsUnregisterResource); + + LOAD_SYMBOL (cuMemAlloc, CuMemAlloc); + LOAD_SYMBOL (cuMemAllocPitch, CuMemAllocPitch); + LOAD_SYMBOL (cuMemAllocHost, CuMemAllocHost); + LOAD_SYMBOL (cuMemcpy2D, CuMemcpy2D); + LOAD_SYMBOL (cuMemcpy2DAsync, CuMemcpy2DAsync); + + LOAD_SYMBOL (cuMemFree, CuMemFree); + LOAD_SYMBOL (cuMemFreeHost, CuMemFreeHost); + + LOAD_SYMBOL (cuStreamCreate, CuStreamCreate); + LOAD_SYMBOL (cuStreamDestroy, CuStreamDestroy); + LOAD_SYMBOL (cuStreamSynchronize, CuStreamSynchronize); + + LOAD_SYMBOL (cuDeviceGet, CuDeviceGet); + LOAD_SYMBOL (cuDeviceGetCount, CuDeviceGetCount); + LOAD_SYMBOL (cuDeviceGetName, CuDeviceGetName); + LOAD_SYMBOL (cuDeviceGetAttribute, CuDeviceGetAttribute); + LOAD_SYMBOL (cuDeviceCanAccessPeer, CuDeviceCanAccessPeer); + + LOAD_SYMBOL (cuDriverGetVersion, CuDriverGetVersion); + + LOAD_SYMBOL (cuModuleLoadData, CuModuleLoadData); + LOAD_SYMBOL (cuModuleUnload, CuModuleUnload); + LOAD_SYMBOL (cuModuleGetFunction, CuModuleGetFunction); + LOAD_SYMBOL (cuTexObjectCreate, CuTexObjectCreate); + LOAD_SYMBOL (cuTexObjectDestroy, CuTexObjectDestroy); + LOAD_SYMBOL (cuLaunchKernel, CuLaunchKernel); + + /* cudaGL.h */ + LOAD_SYMBOL (cuGraphicsGLRegisterImage, CuGraphicsGLRegisterImage); + LOAD_SYMBOL (cuGraphicsGLRegisterBuffer, CuGraphicsGLRegisterBuffer); + LOAD_SYMBOL (cuGLGetDevices, CuGLGetDevices); + +#ifdef G_OS_WIN32 + /* cudaD3D11.h */ + LOAD_SYMBOL (cuGraphicsD3D11RegisterResource, + CuGraphicsD3D11RegisterResource); + LOAD_SYMBOL (cuD3D11GetDevice, CuD3D11GetDevice); + LOAD_SYMBOL (cuD3D11GetDevices, CuD3D11GetDevices); +#endif + + vtable->loaded = TRUE; + + return TRUE; + +error: + g_module_close (module); + + return FALSE; +} + +CUresult CUDAAPI +CuInit (unsigned int Flags) +{ + g_assert (gst_cuda_vtable.CuInit != NULL); + + return gst_cuda_vtable.CuInit (Flags); +} + +CUresult CUDAAPI +CuGetErrorName (CUresult error, const char **pStr) +{ + g_assert (gst_cuda_vtable.CuGetErrorName != NULL); + + return gst_cuda_vtable.CuGetErrorName (error, pStr); +} + +CUresult CUDAAPI +CuGetErrorString (CUresult error, const char **pStr) +{ + g_assert (gst_cuda_vtable.CuGetErrorString != NULL); + + return gst_cuda_vtable.CuGetErrorString (error, pStr); +} + +CUresult CUDAAPI +CuCtxCreate (CUcontext * pctx, unsigned int flags, CUdevice dev) +{ + g_assert (gst_cuda_vtable.CuCtxCreate != NULL); + + return gst_cuda_vtable.CuCtxCreate (pctx, flags, dev); +} + +CUresult CUDAAPI +CuCtxDestroy (CUcontext ctx) +{ + g_assert (gst_cuda_vtable.CuCtxDestroy != NULL); + + return gst_cuda_vtable.CuCtxDestroy (ctx); +} + +CUresult CUDAAPI +CuCtxPopCurrent (CUcontext * pctx) +{ + g_assert (gst_cuda_vtable.CuCtxPopCurrent != NULL); + + return gst_cuda_vtable.CuCtxPopCurrent (pctx); +} + +CUresult CUDAAPI +CuCtxPushCurrent (CUcontext ctx) +{ + g_assert (gst_cuda_vtable.CuCtxPushCurrent != NULL); + + return gst_cuda_vtable.CuCtxPushCurrent (ctx); +} + +CUresult CUDAAPI +CuCtxEnablePeerAccess (CUcontext peerContext, unsigned int Flags) +{ + g_assert (gst_cuda_vtable.CuCtxEnablePeerAccess != NULL); + + return gst_cuda_vtable.CuCtxEnablePeerAccess (peerContext, Flags); +} + +CUresult CUDAAPI +CuCtxDisablePeerAccess (CUcontext peerContext) +{ + g_assert (gst_cuda_vtable.CuCtxDisablePeerAccess != NULL); + + return gst_cuda_vtable.CuCtxDisablePeerAccess (peerContext); +} + +CUresult CUDAAPI +CuGraphicsMapResources (unsigned int count, CUgraphicsResource * resources, + CUstream hStream) +{ + g_assert (gst_cuda_vtable.CuGraphicsMapResources != NULL); + + return gst_cuda_vtable.CuGraphicsMapResources (count, resources, hStream); +} + +CUresult CUDAAPI +CuGraphicsUnmapResources (unsigned int count, CUgraphicsResource * resources, + CUstream hStream) +{ + g_assert (gst_cuda_vtable.CuGraphicsUnmapResources != NULL); + + return gst_cuda_vtable.CuGraphicsUnmapResources (count, resources, hStream); +} + +CUresult CUDAAPI +CuGraphicsResourceSetMapFlags (CUgraphicsResource resource, unsigned int flags) +{ + g_assert (gst_cuda_vtable.CuGraphicsResourceSetMapFlags != NULL); + + return gst_cuda_vtable.CuGraphicsResourceSetMapFlags (resource, flags); +} + +CUresult CUDAAPI +CuGraphicsSubResourceGetMappedArray (CUarray * pArray, + CUgraphicsResource resource, unsigned int arrayIndex, unsigned int mipLevel) +{ + g_assert (gst_cuda_vtable.CuGraphicsSubResourceGetMappedArray != NULL); + + return gst_cuda_vtable.CuGraphicsSubResourceGetMappedArray (pArray, resource, + arrayIndex, mipLevel); +} + +/* *INDENT-OFF* */ +CUresult CUDAAPI +CuGraphicsResourceGetMappedPointer (CUdeviceptr * pDevPtr, size_t * pSize, + CUgraphicsResource resource) +{ + g_assert (gst_cuda_vtable.CuGraphicsResourceGetMappedPointer != NULL); + + return gst_cuda_vtable.CuGraphicsResourceGetMappedPointer (pDevPtr, pSize, + resource); +} +/* *INDENT-ON* */ + +CUresult CUDAAPI +CuGraphicsUnregisterResource (CUgraphicsResource resource) +{ + g_assert (gst_cuda_vtable.CuGraphicsUnregisterResource != NULL); + + return gst_cuda_vtable.CuGraphicsUnregisterResource (resource); +} + +CUresult CUDAAPI +CuMemAlloc (CUdeviceptr * dptr, unsigned int bytesize) +{ + g_assert (gst_cuda_vtable.CuMemAlloc != NULL); + + return gst_cuda_vtable.CuMemAlloc (dptr, bytesize); +} + +/* *INDENT-OFF* */ +CUresult CUDAAPI +CuMemAllocPitch (CUdeviceptr * dptr, size_t * pPitch, size_t WidthInBytes, + size_t Height, unsigned int ElementSizeBytes) +{ + g_assert (gst_cuda_vtable.CuMemAllocPitch != NULL); + + return gst_cuda_vtable.CuMemAllocPitch (dptr, pPitch, WidthInBytes, Height, + ElementSizeBytes); +} +/* *INDENT-ON* */ + +CUresult CUDAAPI +CuMemAllocHost (void **pp, unsigned int bytesize) +{ + g_assert (gst_cuda_vtable.CuMemAllocHost != NULL); + + return gst_cuda_vtable.CuMemAllocHost (pp, bytesize); +} + +CUresult CUDAAPI +CuMemcpy2D (const CUDA_MEMCPY2D * pCopy) +{ + g_assert (gst_cuda_vtable.CuMemcpy2D != NULL); + + return gst_cuda_vtable.CuMemcpy2D (pCopy); +} + +CUresult CUDAAPI +CuMemcpy2DAsync (const CUDA_MEMCPY2D * pCopy, CUstream hStream) +{ + g_assert (gst_cuda_vtable.CuMemcpy2DAsync != NULL); + + return gst_cuda_vtable.CuMemcpy2DAsync (pCopy, hStream); +} + +CUresult CUDAAPI +CuMemFree (CUdeviceptr dptr) +{ + g_assert (gst_cuda_vtable.CuMemFree != NULL); + + return gst_cuda_vtable.CuMemFree (dptr); +} + +CUresult CUDAAPI +CuMemFreeHost (void *p) +{ + g_assert (gst_cuda_vtable.CuMemFreeHost != NULL); + + return gst_cuda_vtable.CuMemFreeHost (p); +} + +CUresult CUDAAPI +CuStreamCreate (CUstream * phStream, unsigned int Flags) +{ + g_assert (gst_cuda_vtable.CuStreamCreate != NULL); + + return gst_cuda_vtable.CuStreamCreate (phStream, Flags); +} + +CUresult CUDAAPI +CuStreamDestroy (CUstream hStream) +{ + g_assert (gst_cuda_vtable.CuStreamDestroy != NULL); + + return gst_cuda_vtable.CuStreamDestroy (hStream); +} + +CUresult CUDAAPI +CuStreamSynchronize (CUstream hStream) +{ + g_assert (gst_cuda_vtable.CuStreamSynchronize != NULL); + + return gst_cuda_vtable.CuStreamSynchronize (hStream); +} + +CUresult CUDAAPI +CuDeviceGet (CUdevice * device, int ordinal) +{ + g_assert (gst_cuda_vtable.CuDeviceGet != NULL); + + return gst_cuda_vtable.CuDeviceGet (device, ordinal); +} + +CUresult CUDAAPI +CuDeviceGetCount (int *count) +{ + g_assert (gst_cuda_vtable.CuDeviceGetCount != NULL); + + return gst_cuda_vtable.CuDeviceGetCount (count); +} + +CUresult CUDAAPI +CuDeviceGetName (char *name, int len, CUdevice dev) +{ + g_assert (gst_cuda_vtable.CuDeviceGetName != NULL); + + return gst_cuda_vtable.CuDeviceGetName (name, len, dev); +} + +CUresult CUDAAPI +CuDeviceGetAttribute (int *pi, CUdevice_attribute attrib, CUdevice dev) +{ + g_assert (gst_cuda_vtable.CuDeviceGetAttribute != NULL); + + return gst_cuda_vtable.CuDeviceGetAttribute (pi, attrib, dev); +} + +CUresult CUDAAPI +CuDeviceCanAccessPeer (int *canAccessPeer, CUdevice dev, CUdevice peerDev) +{ + g_assert (gst_cuda_vtable.CuDeviceCanAccessPeer != NULL); + + return gst_cuda_vtable.CuDeviceCanAccessPeer (canAccessPeer, dev, peerDev); +} + +CUresult CUDAAPI +CuDriverGetVersion (int *driverVersion) +{ + g_assert (gst_cuda_vtable.CuDriverGetVersion != NULL); + + return gst_cuda_vtable.CuDriverGetVersion (driverVersion); +} + +CUresult CUDAAPI +CuModuleLoadData (CUmodule * module, const void *image) +{ + g_assert (gst_cuda_vtable.CuModuleLoadData != NULL); + + return gst_cuda_vtable.CuModuleLoadData (module, image); +} + +CUresult CUDAAPI +CuModuleUnload (CUmodule module) +{ + g_assert (gst_cuda_vtable.CuModuleUnload != NULL); + + return gst_cuda_vtable.CuModuleUnload (module); +} + +CUresult CUDAAPI +CuModuleGetFunction (CUfunction * hfunc, CUmodule hmod, const char *name) +{ + g_assert (gst_cuda_vtable.CuModuleGetFunction != NULL); + + return gst_cuda_vtable.CuModuleGetFunction (hfunc, hmod, name); +} + +CUresult CUDAAPI +CuTexObjectCreate (CUtexObject * pTexObject, + const CUDA_RESOURCE_DESC * pResDesc, const CUDA_TEXTURE_DESC * pTexDesc, + const CUDA_RESOURCE_VIEW_DESC * pResViewDesc) +{ + g_assert (gst_cuda_vtable.CuTexObjectCreate != NULL); + + return gst_cuda_vtable.CuTexObjectCreate (pTexObject, pResDesc, pTexDesc, + pResViewDesc); +} + +CUresult CUDAAPI +CuTexObjectDestroy (CUtexObject texObject) +{ + g_assert (gst_cuda_vtable.CuTexObjectDestroy != NULL); + + return gst_cuda_vtable.CuTexObjectDestroy (texObject); +} + +CUresult CUDAAPI +CuLaunchKernel (CUfunction f, unsigned int gridDimX, + unsigned int gridDimY, unsigned int gridDimZ, + unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ, + unsigned int sharedMemBytes, CUstream hStream, void **kernelParams, + void **extra) +{ + g_assert (gst_cuda_vtable.CuLaunchKernel != NULL); + + return gst_cuda_vtable.CuLaunchKernel (f, gridDimX, gridDimY, gridDimZ, + blockDimX, blockDimY, blockDimZ, sharedMemBytes, hStream, kernelParams, + extra); +} + +/* cudaGL.h */ +CUresult CUDAAPI +CuGraphicsGLRegisterImage (CUgraphicsResource * pCudaResource, + unsigned int image, unsigned int target, unsigned int Flags) +{ + g_assert (gst_cuda_vtable.CuGraphicsGLRegisterImage != NULL); + + return gst_cuda_vtable.CuGraphicsGLRegisterImage (pCudaResource, image, + target, Flags); +} + +CUresult CUDAAPI +CuGraphicsGLRegisterBuffer (CUgraphicsResource * pCudaResource, + unsigned int buffer, unsigned int Flags) +{ + g_assert (gst_cuda_vtable.CuGraphicsGLRegisterBuffer != NULL); + + return gst_cuda_vtable.CuGraphicsGLRegisterBuffer (pCudaResource, buffer, + Flags); +} + +CUresult CUDAAPI +CuGLGetDevices (unsigned int *pCudaDeviceCount, CUdevice * pCudaDevices, + unsigned int cudaDeviceCount, CUGLDeviceList deviceList) +{ + g_assert (gst_cuda_vtable.CuGLGetDevices != NULL); + + return gst_cuda_vtable.CuGLGetDevices (pCudaDeviceCount, pCudaDevices, + cudaDeviceCount, deviceList); +} + +/* cudaD3D11.h */ +#ifdef G_OS_WIN32 +CUresult CUDAAPI +CuGraphicsD3D11RegisterResource (CUgraphicsResource * pCudaResource, + ID3D11Resource * pD3DResource, unsigned int Flags) +{ + g_assert (gst_cuda_vtable.CuGraphicsD3D11RegisterResource != NULL); + + return gst_cuda_vtable.CuGraphicsD3D11RegisterResource (pCudaResource, + pD3DResource, Flags); +} + +CUresult CUDAAPI +CuD3D11GetDevice (CUdevice * device, IDXGIAdapter * pAdapter) +{ + g_assert (gst_cuda_vtable.CuD3D11GetDevice != NULL); + + return gst_cuda_vtable.CuD3D11GetDevice (device, pAdapter); +} + +CUresult CUDAAPI +CuD3D11GetDevices (unsigned int *pCudaDeviceCount, + CUdevice * pCudaDevices, unsigned int cudaDeviceCount, + ID3D11Device * pD3D11Device, CUd3d11DeviceList deviceList) +{ + g_assert (gst_cuda_vtable.CuD3D11GetDevices != NULL); + + return gst_cuda_vtable.CuD3D11GetDevices (pCudaDeviceCount, pCudaDevices, + cudaDeviceCount, pD3D11Device, deviceList); +} +#endif
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/gstcudaloader.h
Added
@@ -0,0 +1,40 @@ +/* GStreamer + * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_CUDA_LOADER_H__ +#define __GST_CUDA_LOADER_H__ + +#ifndef GST_USE_UNSTABLE_API +#warning "The Cuda library from gst-plugins-bad is unstable API and may change in future." +#warning "You can define GST_USE_UNSTABLE_API to avoid this warning." +#endif + +#include "cuda.h" +#include "cudaGL.h" + +#include "cuda-prelude.h" +#include <gst/gst.h> + +G_BEGIN_DECLS + +GST_CUDA_API +gboolean gst_cuda_load_library (void); + +G_END_DECLS +#endif /* __GST_CUDA_LOADER_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/gstcudamemory.c
Added
@@ -0,0 +1,546 @@ +/* GStreamer + * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstcudamemory.h" +#include "gstcudautils.h" + +#include <string.h> + +GST_DEBUG_CATEGORY_STATIC (cuda_allocator_debug); +#define GST_CAT_DEFAULT cuda_allocator_debug + +static GstAllocator *_gst_cuda_allocator = NULL; + +struct _GstCudaMemoryPrivate +{ + CUdeviceptr data; + void *staging; + + /* params used for cuMemAllocPitch */ + gsize pitch; + guint width_in_bytes; + guint height; + + GMutex lock; +}; + +#define gst_cuda_allocator_parent_class parent_class +G_DEFINE_TYPE (GstCudaAllocator, gst_cuda_allocator, GST_TYPE_ALLOCATOR); + +static void gst_cuda_allocator_free (GstAllocator * allocator, + GstMemory * memory); + +static gpointer cuda_mem_map (GstMemory * mem, gsize maxsize, + GstMapFlags flags); +static void cuda_mem_unmap_full (GstMemory * mem, GstMapInfo * info); +static GstMemory *cuda_mem_copy (GstMemory * mem, gssize offset, gssize size); + +static GstMemory * +gst_cuda_allocator_dummy_alloc (GstAllocator * allocator, gsize size, + GstAllocationParams * params) +{ + g_return_val_if_reached (NULL); +} + +static void +gst_cuda_allocator_class_init (GstCudaAllocatorClass * klass) +{ + GstAllocatorClass *allocator_class = GST_ALLOCATOR_CLASS (klass); + + allocator_class->alloc = GST_DEBUG_FUNCPTR (gst_cuda_allocator_dummy_alloc); + allocator_class->free = GST_DEBUG_FUNCPTR (gst_cuda_allocator_free); + + GST_DEBUG_CATEGORY_INIT (cuda_allocator_debug, "cudaallocator", 0, + "CUDA Allocator"); +} + +static void +gst_cuda_allocator_init (GstCudaAllocator * allocator) +{ + GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator); + + GST_DEBUG_OBJECT (allocator, "init"); + + alloc->mem_type = GST_CUDA_MEMORY_TYPE_NAME; + + alloc->mem_map = cuda_mem_map; + alloc->mem_unmap_full = cuda_mem_unmap_full; + alloc->mem_copy = cuda_mem_copy; + + GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC); +} + +static GstMemory * +gst_cuda_allocator_alloc_internal (GstCudaAllocator * self, + GstCudaContext * context, const GstVideoInfo * info, + guint width_in_bytes, guint alloc_height) +{ + GstCudaMemoryPrivate *priv; + GstCudaMemory *mem; + CUdeviceptr data; + gboolean ret = FALSE; + gsize pitch; + guint height = GST_VIDEO_INFO_HEIGHT (info); + GstVideoInfo *alloc_info; + + if (!gst_cuda_context_push (context)) + return NULL; + + ret = gst_cuda_result (CuMemAllocPitch (&data, &pitch, width_in_bytes, + alloc_height, 16)); + gst_cuda_context_pop (NULL); + + if (!ret) { + GST_ERROR_OBJECT (self, "Failed to allocate CUDA memory"); + return NULL; + } + + mem = g_new0 (GstCudaMemory, 1); + mem->priv = priv = g_new0 (GstCudaMemoryPrivate, 1); + + priv->data = data; + priv->pitch = pitch; + priv->width_in_bytes = width_in_bytes; + priv->height = alloc_height; + g_mutex_init (&priv->lock); + + mem->context = gst_object_ref (context); + mem->info = *info; + mem->info.size = pitch * alloc_height; + + alloc_info = &mem->info; + gst_memory_init (GST_MEMORY_CAST (mem), 0, GST_ALLOCATOR_CAST (self), + NULL, alloc_info->size, 0, 0, alloc_info->size); + + switch (GST_VIDEO_INFO_FORMAT (info)) { + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_I420_10LE: + /* we are wasting space yes, but required so that this memory + * can be used in kernel function */ + alloc_info->stride0 = pitch; + alloc_info->stride1 = pitch; + alloc_info->stride2 = pitch; + alloc_info->offset0 = 0; + alloc_info->offset1 = alloc_info->stride0 * height; + alloc_info->offset2 = alloc_info->offset1 + + alloc_info->stride1 * height / 2; + break; + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_I422_12LE: + alloc_info->stride0 = pitch; + alloc_info->stride1 = pitch; + alloc_info->stride2 = pitch; + alloc_info->offset0 = 0; + alloc_info->offset1 = alloc_info->stride0 * height; + alloc_info->offset2 = alloc_info->offset1 + + alloc_info->stride1 * height; + break; + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_NV21: + case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P016_LE: + alloc_info->stride0 = pitch; + alloc_info->stride1 = pitch; + alloc_info->offset0 = 0; + alloc_info->offset1 = alloc_info->stride0 * height; + break; + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y444_16LE: + case GST_VIDEO_FORMAT_RGBP: + case GST_VIDEO_FORMAT_BGRP: + case GST_VIDEO_FORMAT_GBR: + alloc_info->stride0 = pitch; + alloc_info->stride1 = pitch; + alloc_info->stride2 = pitch; + alloc_info->offset0 = 0; + alloc_info->offset1 = alloc_info->stride0 * height; + alloc_info->offset2 = alloc_info->offset1 * 2; + break; + case GST_VIDEO_FORMAT_GBRA: + alloc_info->stride0 = pitch; + alloc_info->stride1 = pitch; + alloc_info->stride2 = pitch; + alloc_info->stride3 = pitch; + alloc_info->offset0 = 0; + alloc_info->offset1 = alloc_info->stride0 * height; + alloc_info->offset2 = alloc_info->offset1 * 2; + alloc_info->offset3 = alloc_info->offset1 * 3; + break; + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_RGBx: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_ARGB: + case GST_VIDEO_FORMAT_ABGR: + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_BGR: + case GST_VIDEO_FORMAT_BGR10A2_LE: + case GST_VIDEO_FORMAT_RGB10A2_LE: + case GST_VIDEO_FORMAT_YUY2: + case GST_VIDEO_FORMAT_UYVY: + alloc_info->stride0 = pitch; + alloc_info->offset0 = 0; + break; + default: + GST_ERROR_OBJECT (self, "Unexpected format %s", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info))); + g_assert_not_reached (); + gst_memory_unref (GST_MEMORY_CAST (mem)); + return NULL; + } + + return GST_MEMORY_CAST (mem); +} + +static void +gst_cuda_allocator_free (GstAllocator * allocator, GstMemory * memory) +{ + GstCudaMemory *mem = GST_CUDA_MEMORY_CAST (memory); + GstCudaMemoryPrivate *priv = mem->priv; + + gst_cuda_context_push (mem->context); + if (priv->data) + gst_cuda_result (CuMemFree (priv->data)); + + if (priv->staging) + gst_cuda_result (CuMemFreeHost (priv->staging)); + gst_cuda_context_pop (NULL); + + gst_object_unref (mem->context); + + g_mutex_clear (&priv->lock); + g_free (mem->priv); + g_free (mem); +} + +static gboolean +gst_cuda_memory_upload (GstCudaAllocator * self, GstCudaMemory * mem) +{ + GstCudaMemoryPrivate *priv = mem->priv; + gboolean ret = TRUE; + CUDA_MEMCPY2D param = { 0, }; + + if (!priv->staging || + !GST_MEMORY_FLAG_IS_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_UPLOAD)) { + return TRUE; + } + + if (!gst_cuda_context_push (mem->context)) { + GST_ERROR_OBJECT (self, "Failed to push cuda context"); + return FALSE; + } + + param.srcMemoryType = CU_MEMORYTYPE_HOST; + param.srcHost = priv->staging; + param.srcPitch = priv->pitch; + + param.dstMemoryType = CU_MEMORYTYPE_DEVICE; + param.dstDevice = (CUdeviceptr) priv->data; + param.dstPitch = priv->pitch; + param.WidthInBytes = priv->width_in_bytes; + param.Height = priv->height; + + ret = gst_cuda_result (CuMemcpy2D (¶m)); + gst_cuda_context_pop (NULL); + + if (!ret) + GST_ERROR_OBJECT (self, "Failed to upload memory"); + + return ret; +} + +static gboolean +gst_cuda_memory_download (GstCudaAllocator * self, GstCudaMemory * mem) +{ + GstCudaMemoryPrivate *priv = mem->priv; + gboolean ret = TRUE; + CUDA_MEMCPY2D param = { 0, }; + + if (!GST_MEMORY_FLAG_IS_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD)) + return TRUE; + + if (!gst_cuda_context_push (mem->context)) { + GST_ERROR_OBJECT (self, "Failed to push cuda context"); + return FALSE; + } + + if (!priv->staging) { + ret = gst_cuda_result (CuMemAllocHost (&priv->staging, + GST_MEMORY_CAST (mem)->size)); + if (!ret) { + GST_ERROR_OBJECT (self, "Failed to allocate staging memory"); + gst_cuda_context_pop (NULL); + return FALSE; + } + } + + param.srcMemoryType = CU_MEMORYTYPE_DEVICE; + param.srcDevice = (CUdeviceptr) priv->data; + param.srcPitch = priv->pitch; + + param.dstMemoryType = CU_MEMORYTYPE_HOST; + param.dstHost = priv->staging; + param.dstPitch = priv->pitch; + param.WidthInBytes = priv->width_in_bytes; + param.Height = priv->height; + + ret = gst_cuda_result (CuMemcpy2D (¶m)); + gst_cuda_context_pop (NULL); + + if (!ret) + GST_ERROR_OBJECT (self, "Failed to upload memory"); + + return ret; +} + +static gpointer +cuda_mem_map (GstMemory * mem, gsize maxsize, GstMapFlags flags) +{ + GstCudaAllocator *self = GST_CUDA_ALLOCATOR (mem->allocator); + GstCudaMemory *cmem = GST_CUDA_MEMORY_CAST (mem); + GstCudaMemoryPrivate *priv = cmem->priv; + gpointer ret = NULL; + + g_mutex_lock (&priv->lock); + if ((flags & GST_MAP_CUDA) == GST_MAP_CUDA) { + if (!gst_cuda_memory_upload (self, cmem)) + goto out; + + GST_MEMORY_FLAG_UNSET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_UPLOAD); + + if ((flags & GST_MAP_WRITE) == GST_MAP_WRITE) + GST_MINI_OBJECT_FLAG_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD); + + ret = (gpointer) priv->data; + goto out; + } + + /* First CPU access, must be downloaded */ + if (!priv->staging) + GST_MINI_OBJECT_FLAG_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD); + + if (!gst_cuda_memory_download (self, cmem)) + goto out; + + ret = priv->staging; + + if ((flags & GST_MAP_WRITE) == GST_MAP_WRITE) + GST_MINI_OBJECT_FLAG_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_UPLOAD); + + GST_MEMORY_FLAG_UNSET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD); + +out: + g_mutex_unlock (&priv->lock); + + return ret; +} + +static void +cuda_mem_unmap_full (GstMemory * mem, GstMapInfo * info) +{ + GstCudaMemory *cmem = GST_CUDA_MEMORY_CAST (mem); + GstCudaMemoryPrivate *priv = cmem->priv; + + g_mutex_lock (&priv->lock); + if ((info->flags & GST_MAP_CUDA) == GST_MAP_CUDA) { + if ((info->flags & GST_MAP_WRITE) == GST_MAP_WRITE) + GST_MINI_OBJECT_FLAG_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD); + + goto out; + } + + if ((info->flags & GST_MAP_WRITE) == GST_MAP_WRITE) + GST_MINI_OBJECT_FLAG_SET (mem, GST_CUDA_MEMORY_TRANSFER_NEED_UPLOAD); + +out: + g_mutex_unlock (&priv->lock); + + return; +} + +static GstMemory * +cuda_mem_copy (GstMemory * mem, gssize offset, gssize size) +{ + GstCudaAllocator *self = GST_CUDA_ALLOCATOR (mem->allocator); + GstCudaMemory *src_mem = GST_CUDA_MEMORY_CAST (mem); + GstCudaContext *context = src_mem->context; + GstMapInfo src_info, dst_info; + CUDA_MEMCPY2D param = { 0, }; + GstMemory *copy; + gboolean ret; + + /* offset and size are ignored */ + copy = gst_cuda_allocator_alloc_internal (self, context, + &src_mem->info, src_mem->priv->width_in_bytes, src_mem->priv->height); + + if (!copy) { + GST_ERROR_OBJECT (self, "Failed to allocate memory for copying"); + return NULL; + } + + if (!gst_memory_map (mem, &src_info, GST_MAP_READ | GST_MAP_CUDA)) { + GST_ERROR_OBJECT (self, "Failed to map src memory"); + gst_memory_unref (copy); + return NULL; + } + + if (!gst_memory_map (copy, &dst_info, GST_MAP_WRITE | GST_MAP_CUDA)) { + GST_ERROR_OBJECT (self, "Failed to map dst memory"); + gst_memory_unmap (mem, &src_info); + gst_memory_unref (copy); + return NULL; + } + + if (!gst_cuda_context_push (context)) { + GST_ERROR_OBJECT (self, "Failed to push cuda context"); + gst_memory_unmap (mem, &src_info); + gst_memory_unmap (copy, &dst_info); + + return NULL; + } + + param.srcMemoryType = CU_MEMORYTYPE_DEVICE; + param.srcDevice = (CUdeviceptr) src_info.data; + param.srcPitch = src_mem->priv->pitch; + + param.dstMemoryType = CU_MEMORYTYPE_DEVICE; + param.dstDevice = (CUdeviceptr) dst_info.data; + param.dstPitch = src_mem->priv->pitch; + param.WidthInBytes = src_mem->priv->width_in_bytes; + param.Height = src_mem->priv->height; + + ret = gst_cuda_result (CuMemcpy2D (¶m)); + gst_cuda_context_pop (NULL); + + gst_memory_unmap (mem, &src_info); + gst_memory_unmap (copy, &dst_info); + + if (!ret) { + GST_ERROR_OBJECT (self, "Failed to copy memory"); + gst_memory_unref (copy); + return NULL; + } + + return copy; +} + +/** + * gst_cuda_memory_init_once: + * + * Ensures that the #GstCudaAllocator is initialized and ready to be used. + * + * Since: 1.22 + */ +void +gst_cuda_memory_init_once (void) +{ + static gsize _init = 0; + + if (g_once_init_enter (&_init)) { + _gst_cuda_allocator = + (GstAllocator *) g_object_new (GST_TYPE_CUDA_ALLOCATOR, NULL); + gst_object_ref_sink (_gst_cuda_allocator); + + gst_allocator_register (GST_CUDA_MEMORY_TYPE_NAME, _gst_cuda_allocator); + g_once_init_leave (&_init, 1); + } +} + +/** + * gst_is_cuda_memory: + * @mem: A #GstMemory + * + * Check if @mem is a cuda memory + * + * Since: 1.22 + */ +gboolean +gst_is_cuda_memory (GstMemory * mem) +{ + return mem != NULL && mem->allocator != NULL && + GST_IS_CUDA_ALLOCATOR (mem->allocator); +} + +/** + * gst_cuda_allocator_alloc: + * + * Since: 1.22 + */ +GstMemory * +gst_cuda_allocator_alloc (GstCudaAllocator * allocator, + GstCudaContext * context, const GstVideoInfo * info) +{ + guint alloc_height; + + g_return_val_if_fail (GST_IS_CUDA_ALLOCATOR (allocator), NULL); + g_return_val_if_fail (GST_IS_CUDA_CONTEXT (context), NULL); + g_return_val_if_fail (info != NULL, NULL); + + alloc_height = GST_VIDEO_INFO_HEIGHT (info); + + /* make sure valid height for subsampled formats */ + switch (GST_VIDEO_INFO_FORMAT (info)) { + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P016_LE: + case GST_VIDEO_FORMAT_I420_10LE: + alloc_height = GST_ROUND_UP_2 (alloc_height); + break; + default: + break; + } + + switch (GST_VIDEO_INFO_FORMAT (info)) { + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_I420_10LE: + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_NV21: + case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P016_LE: + alloc_height *= 2; + break; + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_I422_12LE: + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y444_16LE: + case GST_VIDEO_FORMAT_RGBP: + case GST_VIDEO_FORMAT_BGRP: + case GST_VIDEO_FORMAT_GBR: + alloc_height *= 3; + break; + case GST_VIDEO_FORMAT_GBRA: + alloc_height *= 4; + break; + default: + break; + } + + return gst_cuda_allocator_alloc_internal (allocator, context, + info, info->stride0, alloc_height); +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/gstcudamemory.h
Added
@@ -0,0 +1,162 @@ +/* GStreamer + * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_CUDA_MEMORY_H__ +#define __GST_CUDA_MEMORY_H__ + +#ifndef GST_USE_UNSTABLE_API +#warning "The Cuda library from gst-plugins-bad is unstable API and may change in future." +#warning "You can define GST_USE_UNSTABLE_API to avoid this warning." +#endif + +#include "cuda-prelude.h" +#include <gst/gst.h> +#include <gst/gstallocator.h> +#include <gst/video/video.h> +#include "gstcudaloader.h" +#include "gstcudacontext.h" + +G_BEGIN_DECLS + +#define GST_TYPE_CUDA_ALLOCATOR (gst_cuda_allocator_get_type()) +#define GST_CUDA_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CUDA_ALLOCATOR,GstCudaAllocator)) +#define GST_CUDA_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CUDA_ALLOCATOR,GstCudaAllocatorClass)) +#define GST_CUDA_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CUDA_ALLOCATOR,GstCudaAllocatorClass)) +#define GST_IS_CUDA_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CUDA_ALLOCATOR)) +#define GST_IS_CUDA_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CUDA_ALLOCATOR)) +/** + * GST_CUDA_ALLOCATOR_CAST: + * + * Since: 1.22 + */ +#define GST_CUDA_ALLOCATOR_CAST(obj) ((GstCudaAllocator *)(obj)) +/** + * GST_CUDA_MEMORY_CAST: + * + * Since: 1.22 + */ +#define GST_CUDA_MEMORY_CAST(mem) ((GstCudaMemory *) (mem)) + +/** + * GstCudaAllocator: + * + * A #GstAllocator subclass for cuda memory + * + * Since: 1.22 + */ +typedef struct _GstCudaAllocator GstCudaAllocator; +typedef struct _GstCudaAllocatorClass GstCudaAllocatorClass; + +typedef struct _GstCudaMemory GstCudaMemory; +typedef struct _GstCudaMemoryPrivate GstCudaMemoryPrivate; + +/** + * GST_MAP_CUDA: + * + * Flag indicating that we should map the CUDA device memory + * instead of to system memory. + * + * Combining #GST_MAP_CUDA with #GST_MAP_WRITE has the same semantics as though + * you are writing to CUDA device/host memory. + * Conversely, combining #GST_MAP_CUDA with + * #GST_MAP_READ has the same semantics as though you are reading from + * CUDA device/host memory + * + * Since: 1.22 + */ +#define GST_MAP_CUDA (GST_MAP_FLAG_LAST << 1) + +/** + * GST_CUDA_MEMORY_TYPE_NAME: + * + * Name of cuda memory type + * + * Since: 1.22 + */ +#define GST_CUDA_MEMORY_TYPE_NAME "gst.cuda.memory" + +/** + * GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY: + * + * Name of the caps feature for indicating the use of #GstCudaMemory + * + * Since: 1.22 + */ +#define GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY "memory:CUDAMemory" + +/** + * GstCudaMemoryTransfer: + * @GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD: the device memory needs downloading + * to the staging memory + * @GST_CUDA_MEMORY_TRANSFER_NEED_UPLOAD: the staging memory needs uploading + * to the device memory + * + * Since: 1.22 + */ +typedef enum +{ + GST_CUDA_MEMORY_TRANSFER_NEED_DOWNLOAD = (GST_MEMORY_FLAG_LAST << 0), + GST_CUDA_MEMORY_TRANSFER_NEED_UPLOAD = (GST_MEMORY_FLAG_LAST << 1) +} GstCudaMemoryTransfer; + +/** + * GstCudaMemory: + * + * Since: 1.22 + */ +struct _GstCudaMemory +{ + GstMemory mem; + + /*< public >*/ + GstCudaContext *context; + GstVideoInfo info; + + /*< private >*/ + GstCudaMemoryPrivate *priv; + gpointer _gst_reservedGST_PADDING; +}; + +struct _GstCudaAllocator +{ + GstAllocator parent; +}; + +struct _GstCudaAllocatorClass +{ + GstAllocatorClass parent_class; +}; + +GST_CUDA_API +void gst_cuda_memory_init_once (void); + +GST_CUDA_API +gboolean gst_is_cuda_memory (GstMemory * mem); + +GST_CUDA_API +GType gst_cuda_allocator_get_type (void); + +GST_CUDA_API +GstMemory * gst_cuda_allocator_alloc (GstCudaAllocator * allocator, + GstCudaContext * context, + const GstVideoInfo * info); + +G_END_DECLS + +#endif /* __GST_CUDA_MEMORY_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/gstcudanvrtc.c
Added
@@ -0,0 +1,343 @@ +/* GStreamer + * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "cuda-gst.h" +#include "gstcudanvrtc.h" +#include "gstcudaloader.h" +#include <nvrtc.h> +#include <gmodule.h> + +GST_DEBUG_CATEGORY_STATIC (gst_cuda_nvrtc_debug); +#define GST_CAT_DEFAULT gst_cuda_nvrtc_debug + +#ifndef G_OS_WIN32 +#define NVRTC_LIBNAME "libnvrtc.so" +#else +#define NVRTC_LIBNAME "nvrtc64_%d%d_0.dll" +#endif + +#define LOAD_SYMBOL(name,func) G_STMT_START { \ + if (!g_module_symbol (module, G_STRINGIFY (name), (gpointer *) &vtable->func)) { \ + GST_ERROR ("Failed to load '%s', %s", G_STRINGIFY (name), g_module_error()); \ + goto error; \ + } \ +} G_STMT_END; + +/* *INDENT-OFF* */ +typedef struct _GstCudaNvrtcVTable +{ + gboolean loaded; + + nvrtcResult (*NvrtcCompileProgram) (nvrtcProgram prog, int numOptions, + const char **options); + nvrtcResult (*NvrtcCreateProgram) (nvrtcProgram * prog, const char *src, + const char *name, int numHeaders, const char **headers, + const char **includeNames); + nvrtcResult (*NvrtcDestroyProgram) (nvrtcProgram * prog); + nvrtcResult (*NvrtcGetPTX) (nvrtcProgram prog, char *ptx); + nvrtcResult (*NvrtcGetPTXSize) (nvrtcProgram prog, size_t * ptxSizeRet); + nvrtcResult (*NvrtcGetProgramLog) (nvrtcProgram prog, char *log); + nvrtcResult (*NvrtcGetProgramLogSize) (nvrtcProgram prog, + size_t * logSizeRet); +} GstCudaNvrtcVTable; +/* *INDENT-ON* */ + +static GstCudaNvrtcVTable gst_cuda_nvrtc_vtable = { 0, }; + +#ifdef G_OS_WIN32 +static GModule * +gst_cuda_nvrtc_load_library_once_win32 (void) +{ + gchar *dll_name = NULL; + GModule *module = NULL; + gint cuda_version; + gint cuda_major_version; + gint cuda_minor_version; + gint major, minor; + CUresult rst; + + rst = CuDriverGetVersion (&cuda_version); + if (rst != CUDA_SUCCESS) { + GST_WARNING ("Couldn't get driver version, 0x%x", (guint) rst); + return NULL; + } + + cuda_major_version = cuda_version / 1000; + cuda_minor_version = (cuda_version % 1000) / 10; + + GST_INFO ("CUDA version %d / %d", cuda_major_version, cuda_minor_version); + + /* First path for searching nvrtc library using system CUDA version */ + for (minor = cuda_minor_version; minor >= 0; minor--) { + g_clear_pointer (&dll_name, g_free); + dll_name = g_strdup_printf (NVRTC_LIBNAME, cuda_major_version, minor); + module = g_module_open (dll_name, G_MODULE_BIND_LAZY); + if (module) { + GST_INFO ("%s is available", dll_name); + g_free (dll_name); + return module; + } + + GST_DEBUG ("Couldn't open library %s", dll_name); + } + + /* CUDA is a part for driever installation, but nvrtc library is a part of + * CUDA-toolkit. So CUDA-toolkit version may be lower than + * CUDA version. Do search the dll again */ + for (major = cuda_major_version; major >= 9; major--) { + for (minor = 5; minor >= 0; minor--) { + g_clear_pointer (&dll_name, g_free); + dll_name = g_strdup_printf (NVRTC_LIBNAME, major, minor); + module = g_module_open (dll_name, G_MODULE_BIND_LAZY); + if (module) { + GST_INFO ("%s is available", dll_name); + g_free (dll_name); + return module; + } + + GST_DEBUG ("Couldn't open library %s", dll_name); + } + } + + g_free (dll_name); + + return NULL; +} +#endif + +static gboolean +gst_cuda_nvrtc_load_library_once (void) +{ + GModule *module = NULL; + const gchar *filename_env; + GstCudaNvrtcVTable *vtable; + + filename_env = g_getenv ("GST_CUDA_NVRTC_LIBNAME"); + if (filename_env) + module = g_module_open (filename_env, G_MODULE_BIND_LAZY); + + if (!module) { +#ifndef G_OS_WIN32 + module = g_module_open (NVRTC_LIBNAME, G_MODULE_BIND_LAZY); +#else + module = gst_cuda_nvrtc_load_library_once_win32 (); +#endif + } + + if (module == NULL) { + GST_WARNING ("Could not open nvrtc library %s", g_module_error ()); + return FALSE; + } + + vtable = &gst_cuda_nvrtc_vtable; + + LOAD_SYMBOL (nvrtcCompileProgram, NvrtcCompileProgram); + LOAD_SYMBOL (nvrtcCreateProgram, NvrtcCreateProgram); + LOAD_SYMBOL (nvrtcDestroyProgram, NvrtcDestroyProgram); + LOAD_SYMBOL (nvrtcGetPTX, NvrtcGetPTX); + LOAD_SYMBOL (nvrtcGetPTXSize, NvrtcGetPTXSize); + LOAD_SYMBOL (nvrtcGetProgramLog, NvrtcGetProgramLog); + LOAD_SYMBOL (nvrtcGetProgramLogSize, NvrtcGetProgramLogSize); + + vtable->loaded = TRUE; + + return TRUE; + +error: + g_module_close (module); + + return FALSE; +} + +/** + * gst_cuda_nvrtc_load_library: + * + * Loads the nvrtc library. + * + * Returns: %TRUE if the library could be loaded, %FALSE otherwise + * + * Since: 1.22 + */ +gboolean +gst_cuda_nvrtc_load_library (void) +{ + static gsize init_once = 0; + + if (g_once_init_enter (&init_once)) { + GST_DEBUG_CATEGORY_INIT (gst_cuda_nvrtc_debug, "cudanvrtc", 0, + "CUDA runtime compiler"); + if (gst_cuda_load_library ()) + gst_cuda_nvrtc_load_library_once (); + g_once_init_leave (&init_once, 1); + } + + return gst_cuda_nvrtc_vtable.loaded; +} + +/* *INDENT-OFF* */ +static nvrtcResult +NvrtcCompileProgram (nvrtcProgram prog, int numOptions, const char **options) +{ + g_assert (gst_cuda_nvrtc_vtable.NvrtcCompileProgram != NULL); + + return gst_cuda_nvrtc_vtable.NvrtcCompileProgram (prog, numOptions, options); +} + +static nvrtcResult +NvrtcCreateProgram (nvrtcProgram * prog, const char *src, const char *name, + int numHeaders, const char **headers, const char **includeNames) +{ + g_assert (gst_cuda_nvrtc_vtable.NvrtcCreateProgram != NULL); + + return gst_cuda_nvrtc_vtable.NvrtcCreateProgram (prog, src, name, numHeaders, + headers, includeNames); +} + +static nvrtcResult +NvrtcDestroyProgram (nvrtcProgram * prog) +{ + g_assert (gst_cuda_nvrtc_vtable.NvrtcDestroyProgram != NULL); + + return gst_cuda_nvrtc_vtable.NvrtcDestroyProgram (prog); +} + +static nvrtcResult +NvrtcGetPTX (nvrtcProgram prog, char *ptx) +{ + g_assert (gst_cuda_nvrtc_vtable.NvrtcGetPTX != NULL); + + return gst_cuda_nvrtc_vtable.NvrtcGetPTX (prog, ptx); +} + +static nvrtcResult +NvrtcGetPTXSize (nvrtcProgram prog, size_t *ptxSizeRet) +{ + g_assert (gst_cuda_nvrtc_vtable.NvrtcGetPTXSize != NULL); + + return gst_cuda_nvrtc_vtable.NvrtcGetPTXSize (prog, ptxSizeRet); +} + +static nvrtcResult +NvrtcGetProgramLog (nvrtcProgram prog, char *log) +{ + g_assert (gst_cuda_nvrtc_vtable.NvrtcGetProgramLog != NULL); + + return gst_cuda_nvrtc_vtable.NvrtcGetProgramLog (prog, log); +} + +static nvrtcResult +NvrtcGetProgramLogSize (nvrtcProgram prog, size_t *logSizeRet) +{ + g_assert (gst_cuda_nvrtc_vtable.NvrtcGetProgramLogSize != NULL); + + return gst_cuda_nvrtc_vtable.NvrtcGetProgramLogSize (prog, logSizeRet); +} +/* *INDENT-ON* */ + +/** + * gst_cuda_nvrtc_compile: + * @source: Source code to compile + * + * Since: 1.22 + */ +gchar * +gst_cuda_nvrtc_compile (const gchar * source) +{ + nvrtcProgram prog; + nvrtcResult ret; + CUresult curet; + const gchar *opts = { "--gpu-architecture=compute_30" }; + gsize ptx_size; + gchar *ptx = NULL; + int driverVersion; + + g_return_val_if_fail (source != NULL, NULL); + + if (!gst_cuda_nvrtc_load_library ()) { + return NULL; + } + + GST_TRACE ("CUDA kernel source \n%s", source); + + curet = CuDriverGetVersion (&driverVersion); + if (curet != CUDA_SUCCESS) { + GST_ERROR ("Failed to query CUDA Driver version, ret %d", curet); + return NULL; + } + + GST_DEBUG ("CUDA Driver Version %d.%d", driverVersion / 1000, + (driverVersion % 1000) / 10); + + ret = NvrtcCreateProgram (&prog, source, NULL, 0, NULL, NULL); + if (ret != NVRTC_SUCCESS) { + GST_ERROR ("couldn't create nvrtc program, ret %d", ret); + return NULL; + } + + /* Starting from CUDA 11, the lowest supported architecture is 5.2 */ + if (driverVersion >= 11000) + opts0 = "--gpu-architecture=compute_52"; + + ret = NvrtcCompileProgram (prog, 1, opts); + if (ret != NVRTC_SUCCESS) { + gsize log_size; + + GST_ERROR ("couldn't compile nvrtc program, ret %d", ret); + if (NvrtcGetProgramLogSize (prog, &log_size) == NVRTC_SUCCESS && + log_size > 0) { + gchar *compile_log = g_alloca (log_size); + if (NvrtcGetProgramLog (prog, compile_log) == NVRTC_SUCCESS) { + GST_ERROR ("nvrtc compile log %s", compile_log); + } + } + + goto error; + } + + ret = NvrtcGetPTXSize (prog, &ptx_size); + if (ret != NVRTC_SUCCESS) { + GST_ERROR ("unknown ptx size, ret %d", ret); + + goto error; + } + + ptx = g_malloc0 (ptx_size); + ret = NvrtcGetPTX (prog, ptx); + if (ret != NVRTC_SUCCESS) { + GST_ERROR ("couldn't get ptx, ret %d", ret); + g_free (ptx); + + goto error; + } + + NvrtcDestroyProgram (&prog); + + GST_TRACE ("compiled CUDA PTX %s\n", ptx); + + return ptx; + +error: + NvrtcDestroyProgram (&prog); + + return NULL; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/gstcudanvrtc.h
Added
@@ -0,0 +1,41 @@ +/* GStreamer + * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_CUDA_NVRTC_H__ +#define __GST_CUDA_NVRTC_H__ + +#ifndef GST_USE_UNSTABLE_API +#warning "The Cuda library from gst-plugins-bad is unstable API and may change in future." +#warning "You can define GST_USE_UNSTABLE_API to avoid this warning." +#endif + +#include "cuda-prelude.h" +#include <gst/gst.h> + +G_BEGIN_DECLS + +GST_CUDA_API +gboolean gst_cuda_nvrtc_load_library (void); + +GST_CUDA_API +gchar * gst_cuda_nvrtc_compile (const gchar * source); + +G_END_DECLS + +#endif /* __GST_CUDA_NVRTC_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/gstcudautils.c
Added
@@ -0,0 +1,1621 @@ +/* GStreamer + * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstcudautils.h" +#include "gstcudacontext.h" +#include "gstcuda-private.h" + +#ifdef HAVE_NVCODEC_GST_GL +#include <gst/gl/gl.h> +#include <gst/gl/gstglfuncs.h> +#endif + +#ifdef GST_CUDA_HAS_D3D +#include <gst/d3d11/gstd3d11.h> +#endif + +#ifdef HAVE_NVCODEC_NVMM +#include "gstcudanvmm.h" +#endif + +#include "gstcudamemory.h" + +GST_DEBUG_CATEGORY_STATIC (gst_cuda_utils_debug); +#define GST_CAT_DEFAULT gst_cuda_utils_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_CONTEXT); + +static void +_init_debug (void) +{ + static gsize once_init = 0; + + if (g_once_init_enter (&once_init)) { + + GST_DEBUG_CATEGORY_INIT (gst_cuda_utils_debug, "cudautils", 0, + "CUDA utils"); + GST_DEBUG_CATEGORY_GET (GST_CAT_CONTEXT, "GST_CONTEXT"); + g_once_init_leave (&once_init, 1); + } +} + +static gboolean +pad_query (const GValue * item, GValue * value, gpointer user_data) +{ + GstPad *pad = g_value_get_object (item); + GstQuery *query = user_data; + gboolean res; + + res = gst_pad_peer_query (pad, query); + + if (res) { + g_value_set_boolean (value, TRUE); + return FALSE; + } + + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, pad, "pad peer query failed"); + return TRUE; +} + +static gboolean +run_query (GstElement * element, GstQuery * query, GstPadDirection direction) +{ + GstIterator *it; + GstIteratorFoldFunction func = pad_query; + GValue res = { 0 }; + + g_value_init (&res, G_TYPE_BOOLEAN); + g_value_set_boolean (&res, FALSE); + + /* Ask neighbor */ + if (direction == GST_PAD_SRC) + it = gst_element_iterate_src_pads (element); + else + it = gst_element_iterate_sink_pads (element); + + while (gst_iterator_fold (it, func, &res, query) == GST_ITERATOR_RESYNC) + gst_iterator_resync (it); + + gst_iterator_free (it); + + return g_value_get_boolean (&res); +} + +static void +find_cuda_context (GstElement * element, GstCudaContext ** cuda_ctx) +{ + GstQuery *query; + GstContext *ctxt; + + /* 1) Query downstream with GST_QUERY_CONTEXT for the context and + * check if upstream already has a context of the specific type + * 2) Query upstream as above. + */ + query = gst_query_new_context (GST_CUDA_CONTEXT_TYPE); + if (run_query (element, query, GST_PAD_SRC)) { + gst_query_parse_context (query, &ctxt); + if (ctxt) { + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, + "found context (%p) in downstream query", ctxt); + gst_element_set_context (element, ctxt); + } + } + + /* although we found cuda context above, the element does not want + * to use the context. Then try to find from the other direction */ + if (*cuda_ctx == NULL && run_query (element, query, GST_PAD_SINK)) { + gst_query_parse_context (query, &ctxt); + if (ctxt) { + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, + "found context (%p) in upstream query", ctxt); + gst_element_set_context (element, ctxt); + } + } + + if (*cuda_ctx == NULL) { + /* 3) Post a GST_MESSAGE_NEED_CONTEXT message on the bus with + * the required context type and afterwards check if a + * usable context was set now. The message could + * be handled by the parent bins of the element and the + * application. + */ + GstMessage *msg; + + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, + "posting need context message"); + msg = gst_message_new_need_context (GST_OBJECT_CAST (element), + GST_CUDA_CONTEXT_TYPE); + gst_element_post_message (element, msg); + } + + /* + * Whomever responds to the need-context message performs a + * GstElement::set_context() with the required context in which the element + * is required to update the cuda_ctx or call gst_cuda_handle_set_context(). + */ + + gst_query_unref (query); +} + +static void +context_set_cuda_context (GstContext * context, GstCudaContext * cuda_ctx) +{ + GstStructure *s; + guint device_id; + + g_return_if_fail (context != NULL); + + g_object_get (G_OBJECT (cuda_ctx), "cuda-device-id", &device_id, NULL); + + GST_CAT_LOG (GST_CAT_CONTEXT, + "setting GstCudaContext(%" GST_PTR_FORMAT + ") with cuda-device-id %d on context(%" GST_PTR_FORMAT ")", + cuda_ctx, device_id, context); + + s = gst_context_writable_structure (context); + gst_structure_set (s, GST_CUDA_CONTEXT_TYPE, GST_TYPE_CUDA_CONTEXT, + cuda_ctx, "cuda-device-id", G_TYPE_UINT, device_id, NULL); +} + +/** + * gst_cuda_ensure_element_context: + * @element: the #GstElement running the query + * @device_id: preferred device-id, pass device_id >=0 when + * the device_id explicitly required. Otherwise, set -1. + * @cuda_ctx: (inout): the resulting #GstCudaContext + * + * Perform the steps necessary for retrieving a #GstCudaContext from the + * surrounding elements or from the application using the #GstContext mechanism. + * + * If the content of @cuda_ctx is not %NULL, then no #GstContext query is + * necessary for #GstCudaContext. + * + * Returns: whether a #GstCudaContext exists in @cuda_ctx + * + * Since: 1.22 + */ +gboolean +gst_cuda_ensure_element_context (GstElement * element, gint device_id, + GstCudaContext ** cuda_ctx) +{ + guint target_device_id = 0; + gboolean ret = TRUE; + static GRecMutex lock; + static gsize init_lock_once = 0; + + g_return_val_if_fail (element != NULL, FALSE); + g_return_val_if_fail (cuda_ctx != NULL, FALSE); + + _init_debug (); + if (g_once_init_enter (&init_lock_once)) { + g_rec_mutex_init (&lock); + g_once_init_leave (&init_lock_once, 1); + } + + g_rec_mutex_lock (&lock); + + if (*cuda_ctx) + goto out; + + find_cuda_context (element, cuda_ctx); + if (*cuda_ctx) + goto out; + + if (device_id > 0) + target_device_id = device_id; + + /* No available CUDA context in pipeline, create new one here */ + *cuda_ctx = gst_cuda_context_new (target_device_id); + + if (*cuda_ctx == NULL) { + GST_CAT_ERROR_OBJECT (GST_CAT_CONTEXT, element, + "Failed to create CUDA context with device-id %d", device_id); + ret = FALSE; + } else { + GstContext *context; + GstMessage *msg; + + /* Propagate new CUDA context */ + + context = gst_context_new (GST_CUDA_CONTEXT_TYPE, TRUE); + context_set_cuda_context (context, *cuda_ctx); + + gst_element_set_context (element, context); + + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, + "posting have context (%p) message with CUDA context (%p)", + context, *cuda_ctx); + msg = gst_message_new_have_context (GST_OBJECT_CAST (element), context); + gst_element_post_message (GST_ELEMENT_CAST (element), msg); + } + +out: + g_rec_mutex_unlock (&lock); + + return ret; +} + +/** + * gst_cuda_handle_set_context: + * @element: a #GstElement + * @context: a #GstContext + * @device_id: preferred device-id, pass device_id >=0 when + * the device_id explicitly required. Otherwise, set -1. + * @cuda_ctx: (inout) (transfer full): location of a #GstCudaContext + * + * Helper function for implementing #GstElementClass.set_context() in + * CUDA capable elements. + * + * Retrieves the #GstCudaContext in @context and places the result in @cuda_ctx. + * + * Returns: whether the @cuda_ctx could be set successfully + * + * Since: 1.22 + */ +gboolean +gst_cuda_handle_set_context (GstElement * element, + GstContext * context, gint device_id, GstCudaContext ** cuda_ctx) +{ + const gchar *context_type; + + g_return_val_if_fail (element != NULL, FALSE); + g_return_val_if_fail (cuda_ctx != NULL, FALSE); + + _init_debug (); + + if (!context) + return FALSE; + + context_type = gst_context_get_context_type (context); + if (g_strcmp0 (context_type, GST_CUDA_CONTEXT_TYPE) == 0) { + const GstStructure *str; + GstCudaContext *other_ctx = NULL; + guint other_device_id = 0; + + /* If we had context already, will not replace it */ + if (*cuda_ctx) + return TRUE; + + str = gst_context_get_structure (context); + if (gst_structure_get (str, GST_CUDA_CONTEXT_TYPE, GST_TYPE_CUDA_CONTEXT, + &other_ctx, NULL)) { + g_object_get (other_ctx, "cuda-device-id", &other_device_id, NULL); + + if (device_id == -1 || other_device_id == device_id) { + GST_CAT_DEBUG_OBJECT (GST_CAT_CONTEXT, element, "Found CUDA context"); + *cuda_ctx = other_ctx; + + return TRUE; + } + + gst_object_unref (other_ctx); + } + } + + return FALSE; +} + +/** + * gst_cuda_handle_context_query: + * @element: a #GstElement + * @query: a #GstQuery of type %GST_QUERY_CONTEXT + * @cuda_ctx: (transfer none) (nullable): a #GstCudaContext + * + * Returns: Whether the @query was successfully responded to from the passed + * @context. + * + * Since: 1.22 + */ +gboolean +gst_cuda_handle_context_query (GstElement * element, + GstQuery * query, GstCudaContext * cuda_ctx) +{ + const gchar *context_type; + GstContext *context, *old_context; + + g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE); + g_return_val_if_fail (GST_IS_QUERY (query), FALSE); + g_return_val_if_fail (cuda_ctx == NULL + || GST_IS_CUDA_CONTEXT (cuda_ctx), FALSE); + + _init_debug (); + + GST_CAT_LOG_OBJECT (GST_CAT_CONTEXT, element, + "handle context query %" GST_PTR_FORMAT, query); + gst_query_parse_context_type (query, &context_type); + + if (cuda_ctx && g_strcmp0 (context_type, GST_CUDA_CONTEXT_TYPE) == 0) { + gst_query_parse_context (query, &old_context); + + if (old_context) + context = gst_context_copy (old_context); + else + context = gst_context_new (GST_CUDA_CONTEXT_TYPE, TRUE); + + context_set_cuda_context (context, cuda_ctx); + gst_query_set_context (query, context); + gst_context_unref (context); + GST_CAT_DEBUG_OBJECT (GST_CAT_CONTEXT, element, + "successfully set %" GST_PTR_FORMAT " on %" GST_PTR_FORMAT, cuda_ctx, + query); + + return TRUE; + } + + return FALSE; +} + +/** + * gst_context_new_cuda_context: + * @cuda_ctx: (transfer none): a #GstCudaContext + * + * Returns: (transfer full): a new #GstContext embedding the @cuda_ctx + * + * Since: 1.22 + */ +GstContext * +gst_context_new_cuda_context (GstCudaContext * cuda_ctx) +{ + GstContext *context; + + g_return_val_if_fail (GST_IS_CUDA_CONTEXT (cuda_ctx), NULL); + + _init_debug (); + + context = gst_context_new (GST_CUDA_CONTEXT_TYPE, TRUE); + context_set_cuda_context (context, cuda_ctx); + + return context; +} + +static const gchar *gst_cuda_quark_strings = + { "GstCudaQuarkGraphicsResource" }; + +static GQuark gst_cuda_quark_tableGST_CUDA_QUARK_MAX; + +static void +init_cuda_quark_once (void) +{ + static gsize once_init = 0; + + if (g_once_init_enter (&once_init)) { + gint i; + + for (i = 0; i < GST_CUDA_QUARK_MAX; i++) + gst_cuda_quark_tablei = + g_quark_from_static_string (gst_cuda_quark_stringsi); + + g_once_init_leave (&once_init, 1); + } +} + +/** + * gst_cuda_quark_from_id: (skip) + * @id: a #GstCudaQuarkId + * + * Returns: the GQuark for given @id or 0 if @id is unknown value + * + * Since: 1.22 + */ +GQuark +gst_cuda_quark_from_id (GstCudaQuarkId id) +{ + g_return_val_if_fail (id < GST_CUDA_QUARK_MAX, 0); + + init_cuda_quark_once (); + _init_debug (); + + return gst_cuda_quark_tableid; +} + +/** + * gst_cuda_graphics_resource_new: (skip) + * @context: (transfer none): a #GstCudaContext + * @graphics_context: (transfer none) (nullable): a graphics API specific context object + * @type: a #GstCudaGraphicsResourceType of resource registration + * + * Create new #GstCudaGraphicsResource with given @context and @type + * + * Returns: a new #GstCudaGraphicsResource. + * Free with gst_cuda_graphics_resource_free + * + * Since: 1.22 + */ +GstCudaGraphicsResource * +gst_cuda_graphics_resource_new (GstCudaContext * + context, GstObject * graphics_context, GstCudaGraphicsResourceType type) +{ + GstCudaGraphicsResource *resource; + + g_return_val_if_fail (GST_IS_CUDA_CONTEXT (context), NULL); + + _init_debug (); + + resource = g_new0 (GstCudaGraphicsResource, 1); + resource->cuda_context = gst_object_ref (context); + if (graphics_context) + resource->graphics_context = gst_object_ref (graphics_context); + + return resource; +} + +/** + * gst_cuda_graphics_resource_register_gl_buffer: (skip) + * @resource a #GstCudaGraphicsResource + * @buffer: a GL buffer object + * @flags: a `CUgraphicsRegisterFlags` + * + * Register the @buffer for access by CUDA. + * Must be called from the gl context thread with current cuda context was + * pushed on the current thread + * + * Returns: whether @buffer was registered or not + * + * Since: 1.22 + */ +gboolean +gst_cuda_graphics_resource_register_gl_buffer (GstCudaGraphicsResource * + resource, guint buffer, CUgraphicsRegisterFlags flags) +{ + CUresult cuda_ret; + + g_return_val_if_fail (resource != NULL, FALSE); + g_return_val_if_fail (resource->registered == FALSE, FALSE); + + _init_debug (); + + cuda_ret = CuGraphicsGLRegisterBuffer (&resource->resource, buffer, flags); + + if (!gst_cuda_result (cuda_ret)) + return FALSE; + + resource->registered = TRUE; + resource->type = GST_CUDA_GRAPHICS_RESOURCE_GL_BUFFER; + resource->flags = flags; + + return TRUE; +} + +#ifdef G_OS_WIN32 +/** + * gst_cuda_graphics_resource_register_d3d11_resource: (skip) + * @resource a #GstCudaGraphicsResource + * @d3d11_resource: a ID3D11Resource + * @flags: a CUgraphicsRegisterFlags + * + * Register the @d3d11_resource for accessing by CUDA. + * Must be called with d3d11 device lock with current cuda context was + * pushed on the current thread + * + * Returns: whether @d3d11_resource was registered or not + * + * Since: 1.22 + */ +gboolean +gst_cuda_graphics_resource_register_d3d11_resource (GstCudaGraphicsResource * + resource, ID3D11Resource * d3d11_resource, CUgraphicsRegisterFlags flags) +{ + CUresult cuda_ret; + + g_return_val_if_fail (resource != NULL, FALSE); + g_return_val_if_fail (resource->registered == FALSE, FALSE); + + _init_debug (); + + cuda_ret = CuGraphicsD3D11RegisterResource (&resource->resource, + d3d11_resource, flags); + + if (!gst_cuda_result (cuda_ret)) + return FALSE; + + resource->registered = TRUE; + resource->type = GST_CUDA_GRAPHICS_RESOURCE_D3D11_RESOURCE; + resource->flags = flags; + + return TRUE; +} +#endif + +/** + * gst_cuda_graphics_resource_unregister: (skip) + * @resource: a #GstCudaGraphicsResource + * + * Unregister previously registered resource. + * For GL resource, this method must be called from gl context thread. + * Also, current cuda context should be pushed on the current thread + * before calling this method. + * + * Since: 1.22 + */ +void +gst_cuda_graphics_resource_unregister (GstCudaGraphicsResource * resource) +{ + g_return_if_fail (resource != NULL); + + _init_debug (); + + if (!resource->registered) + return; + + gst_cuda_result (CuGraphicsUnregisterResource (resource->resource)); + resource->resource = NULL; + resource->registered = FALSE; + + return; +} + +/** + * gst_cuda_graphics_resource_map: (skip) + * @resource: a #GstCudaGraphicsResource + * @stream: a CUstream + * @flags: a CUgraphicsMapResourceFlags + * + * Map previously registered resource with map flags + * + * Returns: (nullable): the `CUgraphicsResource` if successful or %NULL when failed + * + * Since: 1.22 + */ +CUgraphicsResource +gst_cuda_graphics_resource_map (GstCudaGraphicsResource * resource, + CUstream stream, CUgraphicsMapResourceFlags flags) +{ + CUresult cuda_ret; + + g_return_val_if_fail (resource != NULL, NULL); + g_return_val_if_fail (resource->registered != FALSE, NULL); + + _init_debug (); + + cuda_ret = CuGraphicsResourceSetMapFlags (resource->resource, flags); + if (!gst_cuda_result (cuda_ret)) + return NULL; + + cuda_ret = CuGraphicsMapResources (1, &resource->resource, stream); + if (!gst_cuda_result (cuda_ret)) + return NULL; + + resource->mapped = TRUE; + + return resource->resource; +} + +/** + * gst_cuda_graphics_resource_unmap: (skip) + * @resource: a #GstCudaGraphicsResource + * @stream: a `CUstream` + * + * Unmap previously mapped resource + * + * Since: 1.22 + */ +void +gst_cuda_graphics_resource_unmap (GstCudaGraphicsResource * resource, + CUstream stream) +{ + g_return_if_fail (resource != NULL); + g_return_if_fail (resource->registered != FALSE); + + _init_debug (); + + if (!resource->mapped) + return; + + gst_cuda_result (CuGraphicsUnmapResources (1, &resource->resource, stream)); + + resource->mapped = FALSE; +} + +#ifdef HAVE_NVCODEC_GST_GL +static void +unregister_resource_from_gl_thread (GstGLContext * gl_context, + GstCudaGraphicsResource * resource) +{ + GstCudaContext *cuda_context = resource->cuda_context; + + if (!gst_cuda_context_push (cuda_context)) { + GST_WARNING_OBJECT (cuda_context, "failed to push CUDA context"); + return; + } + + gst_cuda_graphics_resource_unregister (resource); + + if (!gst_cuda_context_pop (NULL)) { + GST_WARNING_OBJECT (cuda_context, "failed to pop CUDA context"); + } +} +#endif + +#ifdef GST_CUDA_HAS_D3D +static void +unregister_d3d11_resource (GstCudaGraphicsResource * resource) +{ + GstCudaContext *cuda_context = resource->cuda_context; + GstD3D11Device *device = GST_D3D11_DEVICE (resource->graphics_context); + + if (!gst_cuda_context_push (cuda_context)) { + GST_WARNING_OBJECT (cuda_context, "failed to push CUDA context"); + return; + } + + gst_d3d11_device_lock (device); + gst_cuda_graphics_resource_unregister (resource); + gst_d3d11_device_unlock (device); + + if (!gst_cuda_context_pop (NULL)) { + GST_WARNING_OBJECT (cuda_context, "failed to pop CUDA context"); + } +} +#endif + +/** + * gst_cuda_graphics_resource_free: (skip) + * @resource: a #GstCudaGraphicsResource + * + * Free @resource + * + * Since: 1.22 + */ +void +gst_cuda_graphics_resource_free (GstCudaGraphicsResource * resource) +{ + g_return_if_fail (resource != NULL); + + if (resource->registered) { +#ifdef HAVE_NVCODEC_GST_GL + if (resource->type == GST_CUDA_GRAPHICS_RESOURCE_GL_BUFFER) { + gst_gl_context_thread_add ((GstGLContext *) resource->graphics_context, + (GstGLContextThreadFunc) unregister_resource_from_gl_thread, + resource); + } else +#endif +#ifdef GST_CUDA_HAS_D3D + if (resource->type == GST_CUDA_GRAPHICS_RESOURCE_D3D11_RESOURCE) { + unregister_d3d11_resource (resource); + } else +#endif + { + /* FIXME: currently only opengl & d3d11 */ + g_assert_not_reached (); + } + } + + gst_object_unref (resource->cuda_context); + if (resource->graphics_context) + gst_object_unref (resource->graphics_context); + g_free (resource); +} + +const gchar * +gst_cuda_buffer_copy_type_to_string (GstCudaBufferCopyType type) +{ + switch (type) { + case GST_CUDA_BUFFER_COPY_SYSTEM: + return "SYSTEM"; + case GST_CUDA_BUFFER_COPY_CUDA: + return "CUDA"; + case GST_CUDA_BUFFER_COPY_GL: + return "GL"; + case GST_CUDA_BUFFER_COPY_D3D11: + return "D3D11"; + case GST_CUDA_BUFFER_COPY_NVMM: + return "NVMM"; + default: + g_assert_not_reached (); + break; + } + + return "UNKNOWN"; +} + +static gboolean +gst_cuda_buffer_fallback_copy (GstBuffer * dst, const GstVideoInfo * dst_info, + GstBuffer * src, const GstVideoInfo * src_info) +{ + GstVideoFrame dst_frame, src_frame; + guint i, j; + + if (!gst_video_frame_map (&dst_frame, dst_info, dst, GST_MAP_WRITE)) { + GST_ERROR ("Failed to map dst buffer"); + return FALSE; + } + + if (!gst_video_frame_map (&src_frame, src_info, src, GST_MAP_READ)) { + gst_video_frame_unmap (&dst_frame); + GST_ERROR ("Failed to map src buffer"); + return FALSE; + } + + /* src and dst resolutions can be different, pick min value */ + for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (&dst_frame); i++) { + guint dst_width_in_bytes, src_width_in_bytes; + guint dst_height, src_height; + guint width_in_bytes, height; + guint dst_stride, src_stride; + guint8 *dst_data, *src_data; + + dst_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&dst_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&dst_frame, i); + src_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&src_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&src_frame, i); + + width_in_bytes = MIN (dst_width_in_bytes, src_width_in_bytes); + + dst_height = GST_VIDEO_FRAME_COMP_HEIGHT (&dst_frame, i); + src_height = GST_VIDEO_FRAME_COMP_HEIGHT (&src_frame, i); + + height = MIN (dst_height, src_height); + + dst_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&dst_frame, i); + src_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&src_frame, i); + + dst_data = GST_VIDEO_FRAME_PLANE_DATA (&dst_frame, i); + src_data = GST_VIDEO_FRAME_PLANE_DATA (&src_frame, i); + + for (j = 0; j < height; j++) { + memcpy (dst_data, src_data, width_in_bytes); + dst_data += dst_stride; + src_data += src_stride; + } + } + + gst_video_frame_unmap (&src_frame); + gst_video_frame_unmap (&dst_frame); + + return TRUE; +} + +static gboolean +map_buffer_and_fill_copy2d (GstBuffer * buf, const GstVideoInfo * info, + GstCudaBufferCopyType copy_type, GstVideoFrame * frame, + GstMapInfo * map_info, gboolean is_src, + CUDA_MEMCPY2D copy_paramsGST_VIDEO_MAX_PLANES) +{ + gboolean buffer_mapped = FALSE; + guint i; + +#ifdef HAVE_NVCODEC_NVMM + if (copy_type == GST_CUDA_BUFFER_COPY_NVMM) { + NvBufSurface *surface; + NvBufSurfaceParams *surface_params; + NvBufSurfacePlaneParams *plane_params; + + if (!gst_buffer_map (buf, map_info, GST_MAP_READ)) { + GST_ERROR ("Failed to map input NVMM buffer"); + memset (map_info, 0, sizeof (GstMapInfo)); + return FALSE; + } + + surface = (NvBufSurface *) map_info->data; + + GST_TRACE ("batch-size %d, num-filled %d, memType %d", + surface->batchSize, surface->numFilled, surface->memType); + + surface_params = surface->surfaceList; + buffer_mapped = TRUE; + if (!surface_params) { + GST_ERROR ("NVMM memory doesn't hold buffer"); + goto error; + } + + plane_params = &surface_params->planeParams; + if (plane_params->num_planes != GST_VIDEO_INFO_N_PLANES (info)) { + GST_ERROR ("num_planes mismatch, %d / %d", + plane_params->num_planes, GST_VIDEO_INFO_N_PLANES (info)); + goto error; + } + + switch (surface->memType) { + /* TODO: NVBUF_MEM_DEFAULT on jetson is SURFACE_ARRAY */ + case NVBUF_MEM_DEFAULT: + case NVBUF_MEM_CUDA_DEVICE: + { + for (i = 0; i < plane_params->num_planes; i++) { + if (is_src) { + copy_paramsi.srcMemoryType = CU_MEMORYTYPE_DEVICE; + copy_paramsi.srcDevice = (CUdeviceptr) + ((guint8 *) surface_params->dataPtr + plane_params->offseti); + copy_paramsi.srcPitch = plane_params->pitchi; + } else { + copy_paramsi.dstMemoryType = CU_MEMORYTYPE_DEVICE; + copy_paramsi.dstDevice = (CUdeviceptr) + ((guint8 *) surface_params->dataPtr + plane_params->offseti); + copy_paramsi.dstPitch = plane_params->pitchi; + } + } + break; + } + case NVBUF_MEM_CUDA_PINNED: + { + for (i = 0; i < plane_params->num_planes; i++) { + if (is_src) { + copy_paramsi.srcMemoryType = CU_MEMORYTYPE_HOST; + copy_paramsi.srcHost = + ((guint8 *) surface_params->dataPtr + plane_params->offseti); + copy_paramsi.srcPitch = plane_params->pitchi; + } else { + copy_paramsi.dstMemoryType = CU_MEMORYTYPE_HOST; + copy_paramsi.dstHost = + ((guint8 *) surface_params->dataPtr + plane_params->offseti); + copy_paramsi.dstPitch = plane_params->pitchi; + } + } + break; + } + case NVBUF_MEM_CUDA_UNIFIED: + { + for (i = 0; i < plane_params->num_planes; i++) { + if (is_src) { + copy_paramsi.srcMemoryType = CU_MEMORYTYPE_UNIFIED; + copy_paramsi.srcDevice = (CUdeviceptr) + ((guint8 *) surface_params->dataPtr + plane_params->offseti); + copy_paramsi.srcPitch = plane_params->pitchi; + } else { + copy_paramsi.dstMemoryType = CU_MEMORYTYPE_UNIFIED; + copy_paramsi.dstDevice = (CUdeviceptr) + ((guint8 *) surface_params->dataPtr + plane_params->offseti); + copy_paramsi.dstPitch = plane_params->pitchi; + } + } + break; + } + default: + GST_ERROR ("Unexpected NVMM memory type %d", surface->memType); + goto error; + } + + for (i = 0; i < plane_params->num_planes; i++) { + gsize width_in_bytes, height; + + width_in_bytes = plane_params->widthi * plane_params->bytesPerPixi; + height = plane_params->heighti; + + if (copy_paramsi.WidthInBytes == 0 || + width_in_bytes < copy_paramsi.WidthInBytes) { + copy_paramsi.WidthInBytes = width_in_bytes; + } + + if (copy_paramsi.Height == 0 || height < copy_paramsi.Height) { + copy_paramsi.Height = height; + } + } + } else +#endif + { + GstMapFlags map_flags; + + if (is_src) + map_flags = GST_MAP_READ; + else + map_flags = GST_MAP_WRITE; + + if (copy_type == GST_CUDA_BUFFER_COPY_CUDA) + map_flags |= GST_MAP_CUDA; + + if (!gst_video_frame_map (frame, info, buf, map_flags)) { + GST_ERROR ("Failed to map buffer"); + goto error; + } + + for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (frame); i++) { + gsize width_in_bytes, height; + + if (is_src) { + if (copy_type == GST_CUDA_BUFFER_COPY_CUDA) { + copy_paramsi.srcMemoryType = CU_MEMORYTYPE_DEVICE; + copy_paramsi.srcDevice = + (CUdeviceptr) GST_VIDEO_FRAME_PLANE_DATA (frame, i); + } else { + copy_paramsi.srcMemoryType = CU_MEMORYTYPE_HOST; + copy_paramsi.srcHost = GST_VIDEO_FRAME_PLANE_DATA (frame, i); + } + copy_paramsi.srcPitch = GST_VIDEO_FRAME_PLANE_STRIDE (frame, i); + } else { + if (copy_type == GST_CUDA_BUFFER_COPY_CUDA) { + copy_paramsi.dstMemoryType = CU_MEMORYTYPE_DEVICE; + copy_paramsi.dstDevice = + (CUdeviceptr) GST_VIDEO_FRAME_PLANE_DATA (frame, i); + } else { + copy_paramsi.dstMemoryType = CU_MEMORYTYPE_HOST; + copy_paramsi.dstHost = GST_VIDEO_FRAME_PLANE_DATA (frame, i); + } + copy_paramsi.dstPitch = GST_VIDEO_FRAME_PLANE_STRIDE (frame, i); + } + + width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (frame, i); + height = GST_VIDEO_FRAME_COMP_HEIGHT (frame, i); + + if (copy_paramsi.WidthInBytes == 0 || + width_in_bytes < copy_paramsi.WidthInBytes) { + copy_paramsi.WidthInBytes = width_in_bytes; + } + + if (copy_paramsi.Height == 0 || height < copy_paramsi.Height) { + copy_paramsi.Height = height; + } + } + } + + return TRUE; + +error: + if (buffer_mapped) { + gst_buffer_unmap (buf, map_info); + memset (map_info, 0, sizeof (GstMapInfo)); + } + + return FALSE; +} + +static void +unmap_buffer_or_frame (GstBuffer * buf, GstVideoFrame * frame, + GstMapInfo * map_info) +{ + if (frame->buffer) + gst_video_frame_unmap (frame); + + if (map_info->data) + gst_buffer_unmap (buf, map_info); +} + +static gboolean +gst_cuda_buffer_copy_internal (GstBuffer * dst_buf, + GstCudaBufferCopyType dst_type, const GstVideoInfo * dst_info, + GstBuffer * src_buf, GstCudaBufferCopyType src_type, + const GstVideoInfo * src_info, GstCudaContext * context, CUstream stream) +{ + GstVideoFrame dst_frame, src_frame; + gboolean ret = FALSE; + GstMapInfo dst_map, src_map; + guint i; + CUDA_MEMCPY2D copy_paramsGST_VIDEO_MAX_PLANES; + + memset (copy_params, 0, sizeof (copy_params)); + memset (&dst_frame, 0, sizeof (GstVideoFrame)); + memset (&src_frame, 0, sizeof (GstVideoFrame)); + memset (&dst_map, 0, sizeof (GstMapInfo)); + memset (&src_map, 0, sizeof (GstMapInfo)); + + if (!map_buffer_and_fill_copy2d (dst_buf, dst_info, + dst_type, &dst_frame, &dst_map, FALSE, copy_params)) { + GST_ERROR_OBJECT (context, "Failed to map output buffer"); + return FALSE; + } + + if (!map_buffer_and_fill_copy2d (src_buf, src_info, + src_type, &src_frame, &src_map, TRUE, copy_params)) { + GST_ERROR_OBJECT (context, "Failed to map input buffer"); + unmap_buffer_or_frame (dst_buf, &dst_frame, &dst_map); + return FALSE; + } + + if (!gst_cuda_context_push (context)) { + GST_ERROR_OBJECT (context, "Failed to push our context"); + goto unmap_and_out; + } + + for (i = 0; i < GST_VIDEO_INFO_N_PLANES (dst_info); i++) { + ret = gst_cuda_result (CuMemcpy2DAsync (©_paramsi, stream)); + if (!ret) { + GST_ERROR_OBJECT (context, "Failed to copy plane %d", i); + break; + } + } + + gst_cuda_result (CuStreamSynchronize (stream)); + gst_cuda_context_pop (NULL); + +unmap_and_out: + unmap_buffer_or_frame (dst_buf, &src_frame, &src_map); + unmap_buffer_or_frame (src_buf, &dst_frame, &dst_map); + + return ret; +} + +#ifdef HAVE_NVCODEC_GST_GL +static gboolean +ensure_gl_interop (void) +{ + guint device_count = 0; + CUdevice device_list1 = { 0, }; + CUresult cuda_ret; + + cuda_ret = CuGLGetDevices (&device_count, + device_list, 1, CU_GL_DEVICE_LIST_ALL); + + if (cuda_ret != CUDA_SUCCESS || device_count == 0) + return FALSE; + + return TRUE; +} + +typedef struct _GLCopyData +{ + GstBuffer *src_buf; + const GstVideoInfo *src_info; + GstBuffer *dst_buf; + const GstVideoInfo *dst_info; + + gboolean pbo_to_cuda; + GstCudaBufferCopyType copy_type; + GstCudaContext *context; + CUstream stream; + gboolean ret; +} GLCopyData; + +static GstCudaGraphicsResource * +ensure_cuda_gl_graphics_resource (GstCudaContext * context, GstMemory * mem) +{ + GQuark quark; + GstCudaGraphicsResource *ret = NULL; + + if (!gst_is_gl_memory_pbo (mem)) { + GST_WARNING_OBJECT (context, "memory is not GL PBO memory, %s", + mem->allocator->mem_type); + return NULL; + } + + quark = gst_cuda_quark_from_id (GST_CUDA_QUARK_GRAPHICS_RESOURCE); + ret = (GstCudaGraphicsResource *) + gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), quark); + + if (!ret) { + GstGLMemoryPBO *pbo; + GstGLBuffer *buf; + GstMapInfo info; + + ret = gst_cuda_graphics_resource_new (context, + GST_OBJECT (GST_GL_BASE_MEMORY_CAST (mem)->context), + GST_CUDA_GRAPHICS_RESOURCE_GL_BUFFER); + + if (!gst_memory_map (mem, &info, (GstMapFlags) (GST_MAP_READ | GST_MAP_GL))) { + GST_ERROR_OBJECT (context, "Failed to map gl memory"); + gst_cuda_graphics_resource_free (ret); + return NULL; + } + + pbo = (GstGLMemoryPBO *) mem; + buf = pbo->pbo; + + if (!gst_cuda_graphics_resource_register_gl_buffer (ret, + buf->id, CU_GRAPHICS_REGISTER_FLAGS_NONE)) { + GST_ERROR_OBJECT (context, "Failed to register gl buffer"); + gst_memory_unmap (mem, &info); + gst_cuda_graphics_resource_free (ret); + + return NULL; + } + + gst_memory_unmap (mem, &info); + + gst_mini_object_set_qdata (GST_MINI_OBJECT (mem), quark, ret, + (GDestroyNotify) gst_cuda_graphics_resource_free); + } + + return ret; +} + +static void +gl_copy_thread_func (GstGLContext * gl_context, GLCopyData * data) +{ + GstCudaGraphicsResource *resourcesGST_VIDEO_MAX_PLANES; + guint num_resources; + GstBuffer *gl_buf, *cuda_buf; + GstVideoFrame cuda_frame; + GstMapInfo cuda_map_info; + CUDA_MEMCPY2D copy_paramsGST_VIDEO_MAX_PLANES; + guint i; + GstCudaContext *context = data->context; + CUstream stream = data->stream; + + memset (copy_params, 0, sizeof (copy_params)); + memset (&cuda_frame, 0, sizeof (GstVideoFrame)); + memset (&cuda_map_info, 0, sizeof (GstMapInfo)); + + data->ret = FALSE; + + /* Incompatible gl context */ + if (!ensure_gl_interop ()) + return; + + if (data->pbo_to_cuda) { + gl_buf = data->src_buf; + cuda_buf = data->dst_buf; + + if (!map_buffer_and_fill_copy2d (cuda_buf, + data->dst_info, data->copy_type, &cuda_frame, &cuda_map_info, + FALSE, copy_params)) { + GST_ERROR_OBJECT (context, "Failed to map output CUDA buffer"); + return; + } + } else { + gl_buf = data->dst_buf; + cuda_buf = data->src_buf; + + if (!map_buffer_and_fill_copy2d (cuda_buf, + data->src_info, data->copy_type, &cuda_frame, &cuda_map_info, + TRUE, copy_params)) { + GST_ERROR_OBJECT (context, "Failed to map input CUDA buffer"); + return; + } + } + + num_resources = gst_buffer_n_memory (gl_buf); + g_assert (num_resources >= GST_VIDEO_INFO_N_PLANES (data->src_info)); + + if (!gst_cuda_context_push (context)) { + GST_ERROR_OBJECT (context, "Failed to push context"); + unmap_buffer_or_frame (cuda_buf, &cuda_frame, &cuda_map_info); + return; + } + + for (i = 0; i < GST_VIDEO_INFO_N_PLANES (data->src_info); i++) { + GstMemory *mem = gst_buffer_peek_memory (gl_buf, i); + GstGLMemoryPBO *pbo; + + resourcesi = ensure_cuda_gl_graphics_resource (context, mem); + if (!resourcesi) + goto out; + + pbo = (GstGLMemoryPBO *) mem; + if (!data->pbo_to_cuda) { + /* Need PBO -> texture */ + GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD); + + /* PBO -> sysmem */ + GST_MINI_OBJECT_FLAG_SET (pbo->pbo, + GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD); + } else { + /* get the texture into the PBO */ + gst_gl_memory_pbo_upload_transfer (pbo); + gst_gl_memory_pbo_download_transfer (pbo); + } + } + + for (i = 0; i < GST_VIDEO_INFO_N_PLANES (data->src_info); i++) { + CUgraphicsResource cuda_resource; + CUdeviceptr dev_ptr; + size_t size; + gboolean copy_ret; + gsize width_in_bytes, height; + + if (data->pbo_to_cuda) { + cuda_resource = + gst_cuda_graphics_resource_map (resourcesi, stream, + CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY); + } else { + cuda_resource = + gst_cuda_graphics_resource_map (resourcesi, stream, + CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD); + } + + if (!cuda_resource) { + GST_ERROR_OBJECT (context, "Failed to map graphics resource %d", i); + goto out; + } + + if (!gst_cuda_result (CuGraphicsResourceGetMappedPointer (&dev_ptr, &size, + cuda_resource))) { + gst_cuda_graphics_resource_unmap (resourcesi, stream); + GST_ERROR_OBJECT (context, "Failed to get mapped pointer"); + goto out; + } + + if (data->pbo_to_cuda) { + copy_paramsi.srcMemoryType = CU_MEMORYTYPE_DEVICE; + copy_paramsi.srcDevice = dev_ptr; + copy_paramsi.srcPitch = GST_VIDEO_INFO_PLANE_STRIDE (data->src_info, i); + + width_in_bytes = GST_VIDEO_INFO_COMP_WIDTH (data->src_info, i) * + GST_VIDEO_INFO_COMP_PSTRIDE (data->src_info, i); + height = GST_VIDEO_INFO_COMP_HEIGHT (data->src_info, i); + } else { + copy_paramsi.dstMemoryType = CU_MEMORYTYPE_DEVICE; + copy_paramsi.dstDevice = dev_ptr; + copy_paramsi.dstPitch = GST_VIDEO_INFO_PLANE_STRIDE (data->dst_info, i); + + width_in_bytes = GST_VIDEO_INFO_COMP_WIDTH (data->dst_info, i) * + GST_VIDEO_INFO_COMP_PSTRIDE (data->dst_info, i); + height = GST_VIDEO_INFO_COMP_HEIGHT (data->dst_info, i); + } + + if (width_in_bytes < copy_paramsi.WidthInBytes) + copy_paramsi.WidthInBytes = width_in_bytes; + + if (height < copy_paramsi.Height) + copy_paramsi.Height = height; + + copy_ret = gst_cuda_result (CuMemcpy2DAsync (©_paramsi, stream)); + gst_cuda_graphics_resource_unmap (resourcesi, stream); + + if (!copy_ret) { + GST_ERROR_OBJECT (context, "Failed to copy plane %d", i); + goto out; + } + } + + data->ret = TRUE; + +out: + gst_cuda_result (CuStreamSynchronize (stream)); + gst_cuda_context_pop (NULL); + unmap_buffer_or_frame (cuda_buf, &cuda_frame, &cuda_map_info); +} + +static gboolean +cuda_copy_gl_interop (GstBuffer * dst_buf, const GstVideoInfo * dst_info, + GstBuffer * src_buf, const GstVideoInfo * src_info, + GstGLContext * gl_context, GstCudaContext * context, CUstream stream, + gboolean pbo_to_cuda, GstCudaBufferCopyType copy_type) +{ + GLCopyData data; + + g_assert (copy_type == GST_CUDA_BUFFER_COPY_CUDA || + copy_type == GST_CUDA_BUFFER_COPY_NVMM); + + data.src_buf = src_buf; + data.src_info = src_info; + data.dst_buf = dst_buf; + data.dst_info = dst_info; + data.pbo_to_cuda = pbo_to_cuda; + data.copy_type = copy_type; + data.context = context; + data.stream = stream; + data.ret = FALSE; + + gst_gl_context_thread_add (gl_context, + (GstGLContextThreadFunc) gl_copy_thread_func, &data); + + return data.ret; +} +#endif + +#ifdef GST_CUDA_HAS_D3D +static gboolean +ensure_d3d11_interop (GstCudaContext * context, GstD3D11Device * device) +{ + guint device_count = 0; + guint cuda_device_id; + CUdevice device_list1 = { 0, }; + CUresult cuda_ret; + + g_object_get (context, "cuda-device-id", &cuda_device_id, NULL); + + cuda_ret = CuD3D11GetDevices (&device_count, + device_list, 1, gst_d3d11_device_get_device_handle (device), + CU_D3D11_DEVICE_LIST_ALL); + + if (cuda_ret != CUDA_SUCCESS || device_count == 0) + return FALSE; + + if (device_list0 != (CUdevice) cuda_device_id) + return FALSE; + + return TRUE; +} + +static GstCudaGraphicsResource * +ensure_cuda_d3d11_graphics_resource (GstCudaContext * context, GstMemory * mem) +{ + GQuark quark; + GstCudaGraphicsResource *ret = NULL; + + if (!gst_is_d3d11_memory (mem)) { + GST_WARNING_OBJECT (context, "memory is not D3D11 memory, %s", + mem->allocator->mem_type); + return NULL; + } + + quark = gst_cuda_quark_from_id (GST_CUDA_QUARK_GRAPHICS_RESOURCE); + ret = (GstCudaGraphicsResource *) + gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), quark); + + if (!ret) { + ret = gst_cuda_graphics_resource_new (context, + GST_OBJECT (GST_D3D11_MEMORY_CAST (mem)->device), + GST_CUDA_GRAPHICS_RESOURCE_D3D11_RESOURCE); + + if (!gst_cuda_graphics_resource_register_d3d11_resource (ret, + gst_d3d11_memory_get_resource_handle (GST_D3D11_MEMORY_CAST (mem)), + CU_GRAPHICS_REGISTER_FLAGS_SURFACE_LOAD_STORE)) { + GST_ERROR_OBJECT (context, "failed to register d3d11 resource"); + gst_cuda_graphics_resource_free (ret); + + return NULL; + } + + gst_mini_object_set_qdata (GST_MINI_OBJECT (mem), quark, ret, + (GDestroyNotify) gst_cuda_graphics_resource_free); + } + + return ret; +} + +static gboolean +cuda_copy_d3d11_interop (GstBuffer * dst_buf, const GstVideoInfo * dst_info, + GstBuffer * src_buf, const GstVideoInfo * src_info, GstD3D11Device * device, + GstCudaContext * context, CUstream stream, gboolean d3d11_to_cuda) +{ + GstCudaGraphicsResource *resourcesGST_VIDEO_MAX_PLANES; + D3D11_TEXTURE2D_DESC descGST_VIDEO_MAX_PLANES; + guint num_resources; + GstBuffer *d3d11_buf, *cuda_buf; + GstVideoFrame d3d11_frame, cuda_frame; + GstMapInfo cuda_map_info; + CUDA_MEMCPY2D copy_paramsGST_VIDEO_MAX_PLANES; + guint i; + gboolean ret = FALSE; + + memset (copy_params, 0, sizeof (copy_params)); + memset (&cuda_frame, 0, sizeof (GstVideoFrame)); + memset (&cuda_map_info, 0, sizeof (GstMapInfo)); + + /* Incompatible d3d11 device */ + if (!ensure_d3d11_interop (context, device)) + return FALSE; + + if (d3d11_to_cuda) { + d3d11_buf = src_buf; + cuda_buf = dst_buf; + if (!gst_video_frame_map (&d3d11_frame, src_info, d3d11_buf, + GST_MAP_READ | GST_MAP_D3D11)) { + GST_ERROR_OBJECT (context, "Failed to map input D3D11 buffer"); + return FALSE; + } + if (!map_buffer_and_fill_copy2d (cuda_buf, + dst_info, GST_CUDA_BUFFER_COPY_CUDA, &cuda_frame, &cuda_map_info, + FALSE, copy_params)) { + GST_ERROR_OBJECT (context, "Failed to map output CUDA buffer"); + gst_video_frame_unmap (&d3d11_frame); + return FALSE; + } + } else { + d3d11_buf = dst_buf; + cuda_buf = src_buf; + if (!gst_video_frame_map (&d3d11_frame, dst_info, d3d11_buf, + GST_MAP_WRITE | GST_MAP_D3D11)) { + GST_ERROR_OBJECT (context, "Failed to map output D3D11 buffer"); + return FALSE; + } + if (!map_buffer_and_fill_copy2d (cuda_buf, + src_info, GST_CUDA_BUFFER_COPY_CUDA, &cuda_frame, &cuda_map_info, + TRUE, copy_params)) { + GST_ERROR_OBJECT (context, "Failed to map input CUDA buffer"); + gst_video_frame_unmap (&d3d11_frame); + return FALSE; + } + } + + num_resources = gst_buffer_n_memory (d3d11_buf); + g_assert (num_resources >= GST_VIDEO_FRAME_N_PLANES (&d3d11_frame)); + + if (!gst_cuda_context_push (context)) { + GST_ERROR_OBJECT (context, "Failed to push context"); + gst_video_frame_unmap (&d3d11_frame); + unmap_buffer_or_frame (cuda_buf, &cuda_frame, &cuda_map_info); + return FALSE; + } + + for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (&d3d11_frame); i++) { + GstMemory *mem = gst_buffer_peek_memory (d3d11_buf, i); + + resourcesi = ensure_cuda_d3d11_graphics_resource (context, mem); + if (!resourcesi + || !gst_d3d11_memory_get_texture_desc (GST_D3D11_MEMORY_CAST (mem), + &desci)) + goto out; + } + + for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (&d3d11_frame); i++) { + CUgraphicsResource cuda_resource; + CUarray d3d11_array; + gboolean copy_ret; + + if (d3d11_to_cuda) { + cuda_resource = + gst_cuda_graphics_resource_map (resourcesi, stream, + CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY); + } else { + cuda_resource = + gst_cuda_graphics_resource_map (resourcesi, stream, + CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD); + } + + if (!cuda_resource) { + GST_ERROR_OBJECT (context, "Failed to map graphics resource %d", i); + goto out; + } + + if (!gst_cuda_result (CuGraphicsSubResourceGetMappedArray (&d3d11_array, + cuda_resource, 0, 0))) { + gst_cuda_graphics_resource_unmap (resourcesi, stream); + GST_ERROR_OBJECT (context, "Failed to get mapped array"); + goto out; + } + + if (d3d11_to_cuda) { + copy_paramsi.srcMemoryType = CU_MEMORYTYPE_ARRAY; + copy_paramsi.srcArray = d3d11_array; + copy_paramsi.srcPitch = + desci.Width * GST_VIDEO_FRAME_COMP_PSTRIDE (&d3d11_frame, i); + } else { + copy_paramsi.dstMemoryType = CU_MEMORYTYPE_ARRAY; + copy_paramsi.dstArray = d3d11_array; + copy_paramsi.dstPitch = + desci.Width * GST_VIDEO_FRAME_COMP_PSTRIDE (&d3d11_frame, i); + } + + copy_ret = gst_cuda_result (CuMemcpy2DAsync (©_paramsi, stream)); + gst_cuda_graphics_resource_unmap (resourcesi, stream); + + if (!copy_ret) { + GST_ERROR_OBJECT (context, "Failed to copy plane %d", i); + goto out; + } + } + + ret = TRUE; + +out: + gst_cuda_result (CuStreamSynchronize (stream)); + gst_cuda_context_pop (NULL); + gst_video_frame_unmap (&d3d11_frame); + unmap_buffer_or_frame (cuda_buf, &cuda_frame, &cuda_map_info); + + return ret; +} +#endif + +gboolean +gst_cuda_buffer_copy (GstBuffer * dst, GstCudaBufferCopyType dst_type, + const GstVideoInfo * dst_info, GstBuffer * src, + GstCudaBufferCopyType src_type, const GstVideoInfo * src_info, + GstCudaContext * context, CUstream stream) +{ + gboolean use_copy_2d = FALSE; + GstMemory *dst_mem, *src_mem; +#ifdef GST_CUDA_HAS_D3D + D3D11_TEXTURE2D_DESC desc; +#endif + GstCudaContext *cuda_context; + + g_return_val_if_fail (GST_IS_BUFFER (dst), FALSE); + g_return_val_if_fail (dst_info != NULL, FALSE); + g_return_val_if_fail (GST_IS_BUFFER (src), FALSE); + g_return_val_if_fail (src_info != NULL, FALSE); + g_return_val_if_fail (GST_IS_CUDA_CONTEXT (context), FALSE); + + _init_debug (); + + if (dst_type == GST_CUDA_BUFFER_COPY_NVMM && + src_type == GST_CUDA_BUFFER_COPY_NVMM) { + GST_ERROR_OBJECT (context, "Not supported copy NVMM -> NVMM"); + return FALSE; + } + + if (GST_VIDEO_INFO_FORMAT (dst_info) != GST_VIDEO_INFO_FORMAT (src_info)) { + GST_ERROR_OBJECT (context, + "Copy between different format is not supported"); + return FALSE; + } + + if (dst_type == GST_CUDA_BUFFER_COPY_CUDA || + dst_type == GST_CUDA_BUFFER_COPY_NVMM || + src_type == GST_CUDA_BUFFER_COPY_CUDA || + src_type == GST_CUDA_BUFFER_COPY_NVMM) { + use_copy_2d = TRUE; + } + + if (!use_copy_2d) { + GST_TRACE_OBJECT (context, "Not a device memory, use system memory copy"); + return gst_cuda_buffer_fallback_copy (dst, dst_info, src, src_info); + } + + dst_mem = gst_buffer_peek_memory (dst, 0); + src_mem = gst_buffer_peek_memory (src, 0); + +#ifdef HAVE_NVCODEC_GST_GL + if (src_type == GST_CUDA_BUFFER_COPY_GL && gst_is_gl_memory_pbo (src_mem)) { + GstGLMemory *gl_mem = (GstGLMemory *) src_mem; + GstGLContext *gl_context = gl_mem->mem.context; + GstCudaContext *cuda_context = context; + + if (dst_type == GST_CUDA_BUFFER_COPY_CUDA && gst_is_cuda_memory (dst_mem)) + cuda_context = GST_CUDA_MEMORY_CAST (dst_mem)->context; + + GST_TRACE_OBJECT (context, "GL -> %s", + gst_cuda_buffer_copy_type_to_string (dst_type)); + + return cuda_copy_gl_interop (dst, dst_info, src, src_info, gl_context, + cuda_context, stream, TRUE, dst_type); + } + + if (dst_type == GST_CUDA_BUFFER_COPY_GL && gst_is_gl_memory_pbo (dst_mem)) { + GstGLMemory *gl_mem = (GstGLMemory *) dst_mem; + GstGLContext *gl_context = gl_mem->mem.context; + GstCudaContext *cuda_context = context; + + if (src_type == GST_CUDA_BUFFER_COPY_CUDA && gst_is_cuda_memory (src_mem)) + cuda_context = GST_CUDA_MEMORY_CAST (src_mem)->context; + + GST_TRACE_OBJECT (context, "%s -> GL", + gst_cuda_buffer_copy_type_to_string (src_type)); + + return cuda_copy_gl_interop (dst, dst_info, src, src_info, gl_context, + cuda_context, stream, FALSE, src_type); + } +#endif + +#ifdef GST_CUDA_HAS_D3D + if (src_type == GST_CUDA_BUFFER_COPY_D3D11 && gst_is_d3d11_memory (src_mem) && + gst_d3d11_memory_get_texture_desc (GST_D3D11_MEMORY_CAST (src_mem), &desc) + && desc.Usage == D3D11_USAGE_DEFAULT && gst_is_cuda_memory (dst_mem)) { + GstD3D11Memory *dmem = GST_D3D11_MEMORY_CAST (src_mem); + GstD3D11Device *device = dmem->device; + GstCudaContext *cuda_context = GST_CUDA_MEMORY_CAST (dst_mem)->context; + gboolean ret; + + GST_TRACE_OBJECT (context, "D3D11 -> CUDA"); + + gst_d3d11_device_lock (device); + ret = cuda_copy_d3d11_interop (dst, dst_info, src, src_info, device, + cuda_context, stream, TRUE); + gst_d3d11_device_unlock (device); + + return ret; + } + + if (dst_type == GST_CUDA_BUFFER_COPY_D3D11 && gst_is_d3d11_memory (dst_mem) && + gst_d3d11_memory_get_texture_desc (GST_D3D11_MEMORY_CAST (dst_mem), &desc) + && desc.Usage == D3D11_USAGE_DEFAULT && gst_is_cuda_memory (src_mem)) { + GstD3D11Memory *dmem = GST_D3D11_MEMORY_CAST (dst_mem); + GstD3D11Device *device = dmem->device; + GstCudaContext *cuda_context = GST_CUDA_MEMORY_CAST (src_mem)->context; + gboolean ret; + + GST_TRACE_OBJECT (context, "CUDA -> D3D11"); + + gst_d3d11_device_lock (device); + ret = cuda_copy_d3d11_interop (dst, dst_info, src, src_info, device, + cuda_context, stream, FALSE); + gst_d3d11_device_unlock (device); + + return ret; + } +#endif + + if (gst_is_cuda_memory (dst_mem)) { + cuda_context = GST_CUDA_MEMORY_CAST (dst_mem)->context; + } else if (gst_is_cuda_memory (src_mem)) { + cuda_context = GST_CUDA_MEMORY_CAST (src_mem)->context; + } else { + cuda_context = context; + } + + GST_TRACE_OBJECT (context, "%s -> %s", + gst_cuda_buffer_copy_type_to_string (src_type), + gst_cuda_buffer_copy_type_to_string (dst_type)); + + return gst_cuda_buffer_copy_internal (dst, dst_type, dst_info, + src, src_type, src_info, cuda_context, stream); +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/gstcudautils.h
Added
@@ -0,0 +1,189 @@ +/* GStreamer + * Copyright (C) <2018-2019> Seungha Yang <seungha.yang@navercorp.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_CUDA_UTILS_H__ +#define __GST_CUDA_UTILS_H__ + +#ifndef GST_USE_UNSTABLE_API +#warning "The Cuda library from gst-plugins-bad is unstable API and may change in future." +#warning "You can define GST_USE_UNSTABLE_API to avoid this warning." +#endif + +#include "cuda-prelude.h" +#include <gst/gst.h> +#include <gst/video/video.h> +#include "cuda-gst.h" +#include "gstcudaloader.h" +#include "gstcudacontext.h" +#include "gstcudamemory.h" + +G_BEGIN_DECLS + +#ifndef GST_DISABLE_GST_DEBUG +static inline gboolean +_gst_cuda_debug(CUresult result, GstDebugCategory * category, + const gchar * file, const gchar * function, gint line) +{ + const gchar *_error_name, *_error_text; + if (result != CUDA_SUCCESS) { + CuGetErrorName (result, &_error_name); + CuGetErrorString (result, &_error_text); + gst_debug_log (category, GST_LEVEL_WARNING, file, function, line, + NULL, "CUDA call failed: %s, %s", _error_name, _error_text); + + return FALSE; + } + + return TRUE; +} + +/** + * gst_cuda_result: + * @result: CUDA device API return code `CUresult` + * + * Returns: %TRUE if CUDA device API call result is CUDA_SUCCESS + */ +#define gst_cuda_result(result) \ + _gst_cuda_debug(result, GST_CAT_DEFAULT, __FILE__, GST_FUNCTION, __LINE__) +#else + +static inline gboolean +_gst_cuda_debug(CUresult result, GstDebugCategory * category, + const gchar * file, const gchar * function, gint line) +{ + return result == CUDA_SUCCESS; +} + +/** + * gst_cuda_result: + * @result: CUDA device API return code `CUresult` + * + * Returns: %TRUE if CUDA device API call result is CUDA_SUCCESS + * + * Since: 1.22 + */ +#define gst_cuda_result(result) \ + _gst_cuda_debug(result, NULL, __FILE__, GST_FUNCTION, __LINE__) +#endif + +/** + * GstCudaQuarkId: + * + * Since: 1.22 + */ + +typedef enum +{ + GST_CUDA_QUARK_GRAPHICS_RESOURCE = 0, + + /* end of quark list */ + GST_CUDA_QUARK_MAX = 1 +} GstCudaQuarkId; + +/** + * GstCudaGraphicsResourceType: + * @GST_CUDA_GRAPHICS_RESSOURCE_NONE: Ressource represents a CUDA buffer. + * @GST_CUDA_GRAPHICS_RESSOURCE_GL_BUFFER: Ressource represents a GL buffer. + * @GST_CUDA_GRAPHICS_RESSOURCE_D3D11_RESOURCE: Ressource represents a D3D resource. + * + * Since: 1.22 + */ +typedef enum +{ + GST_CUDA_GRAPHICS_RESOURCE_NONE = 0, + GST_CUDA_GRAPHICS_RESOURCE_GL_BUFFER = 1, + GST_CUDA_GRAPHICS_RESOURCE_D3D11_RESOURCE = 2, +} GstCudaGraphicsResourceType; + +/** + * GstCudaGraphicsResource: + * + * Since: 1.22 + */ +typedef struct _GstCudaGraphicsResource +{ + GstCudaContext *cuda_context; + /* GL context or D3D11 device */ + GstObject *graphics_context; + + GstCudaGraphicsResourceType type; + CUgraphicsResource resource; + CUgraphicsRegisterFlags flags; + + gboolean registered; + gboolean mapped; +} GstCudaGraphicsResource; + +GST_CUDA_API +gboolean gst_cuda_ensure_element_context (GstElement * element, + gint device_id, + GstCudaContext ** cuda_ctx); + +GST_CUDA_API +gboolean gst_cuda_handle_set_context (GstElement * element, + GstContext * context, + gint device_id, + GstCudaContext ** cuda_ctx); + +GST_CUDA_API +gboolean gst_cuda_handle_context_query (GstElement * element, + GstQuery * query, + GstCudaContext * cuda_ctx); + +GST_CUDA_API +GstContext * gst_context_new_cuda_context (GstCudaContext * cuda_ctx); + +GST_CUDA_API +GQuark gst_cuda_quark_from_id (GstCudaQuarkId id); + +GST_CUDA_API +GstCudaGraphicsResource * gst_cuda_graphics_resource_new (GstCudaContext * context, + GstObject * graphics_context, + GstCudaGraphicsResourceType type); + +GST_CUDA_API +gboolean gst_cuda_graphics_resource_register_gl_buffer (GstCudaGraphicsResource * resource, + guint buffer, + CUgraphicsRegisterFlags flags); + +#ifdef G_OS_WIN32 +GST_CUDA_API +gboolean gst_cuda_graphics_resource_register_d3d11_resource (GstCudaGraphicsResource * resource, + ID3D11Resource * d3d11_resource, + CUgraphicsRegisterFlags flags); +#endif + +GST_CUDA_API +void gst_cuda_graphics_resource_unregister (GstCudaGraphicsResource * resource); + +GST_CUDA_API +CUgraphicsResource gst_cuda_graphics_resource_map (GstCudaGraphicsResource * resource, + CUstream stream, + CUgraphicsMapResourceFlags flags); + +GST_CUDA_API +void gst_cuda_graphics_resource_unmap (GstCudaGraphicsResource * resource, + CUstream stream); + +GST_CUDA_API +void gst_cuda_graphics_resource_free (GstCudaGraphicsResource * resource); + +G_END_DECLS + +#endif /* __GST_CUDA_UTILS_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/meson.build
Added
@@ -0,0 +1,119 @@ +cuda_sources = files( + 'gstcudaloader.c', + 'gstcudacontext.c', + 'gstcudautils.c', + 'gstcudamemory.c', + 'gstcudabufferpool.c', + 'gstcudanvrtc.c', +) + +cuda_headers = files( + 'cuda-prelude.h', + 'gstcudabufferpool.h', + 'gstcudacontext.h', + 'gstcudaloader.h', + 'gstcudamemory.h', + 'gstcudanvrtc.h', + 'gstcudautils.h', +) + +gstcuda_dep = dependency('', required : false) + +if host_system not in 'windows', 'linux' + subdir_done() +endif + +cuda_win32_headers = + 'initguid.h', + 'd3d11.h', + 'dxgi.h', + + +if host_system == 'windows' + foreach h : cuda_win32_headers + if not cc.has_header(h) + subdir_done() + endif + endforeach +endif + +cuda_stubinc = include_directories('./stub') +extra_c_args = '-DGST_USE_UNSTABLE_API' + +if gstgl_dep.found() + extra_c_args += '-DHAVE_NVCODEC_GST_GL=1' +endif + +if gstd3d11_dep.found() + extra_c_args += '-DGST_CUDA_HAS_D3D=1', '-DCOBJMACROS' +endif + +pkg_name = 'gstreamer-cuda-' + api_version +gstcuda= library('gstcuda-' + api_version, + cuda_sources, + c_args : gst_plugins_bad_args + extra_c_args + '-DGST_USE_UNSTABLE_API', '-DBUILDING_GST_CUDA', '-DG_LOG_DOMAIN="GStreamer-Cuda"', + cpp_args : gst_plugins_bad_args, + include_directories : configinc, libsinc, cuda_stubinc, + version : libversion, + soversion : soversion, + install : true, + dependencies : gstbase_dep, gmodule_dep, gstvideo_dep, gstglproto_dep, gstd3d11_dep +) + +gen_sources = +library_def = {'lib': gstcuda} +if build_gir + gir_includes = 'Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0', 'CudaGst-1.0' + if gstglproto_dep.found() + gir_includes += 'GstGL-1.0' + endif + cuda_gir = { + 'sources' : files('stub/cuda.h', 'stub/cudaGL.h'), + 'namespace' : 'CudaGst', + 'nsversion' : api_version, + 'identifier_prefix' : 'CU', + 'symbol_prefix' : 'cu', 'cuda', + 'includes' : , + 'install' : true, + 'extra_args' : , + 'dependencies' : , + } + gir = { + 'sources' : cuda_sources + cuda_headers, + 'namespace' : 'GstCuda', + 'nsversion' : api_version, + 'identifier_prefix' : 'Gst', + 'symbol_prefix' : 'gst', + 'export_packages' : pkg_name, + 'includes' : gir_includes, + 'install' : true, + 'extra_args' : gir_init_section + '-DGST_USE_UNSTABLE_API', '-I' + meson.current_source_dir() / 'stub', + 'dependencies' : gstbase_dep, gstvideo_dep, gstglproto_dep, + } + if not static_build + cudagst_gir = gnome.generate_gir(gstcuda, kwargs: cuda_gir) + + gir += {'includes': gir'includes' + cudagst_gir0} + gst_cuda_gir = gnome.generate_gir(gstcuda, kwargs: gir) + gen_sources += gst_cuda_gir + endif + + library_def += {'gir': gir, cuda_gir} +endif +gst_libraries += pkg_name, library_def + +pkgconfig.generate(gstcuda, + libraries : gstbase_dep, gmodule_dep, gstvideo_dep, gstglproto_dep, + variables : pkgconfig_variables, + subdirs : pkgconfig_subdirs, + name : pkg_name, + description : 'Unstable library to work with CUDA inside GStreamer', +) + +install_headers(cuda_headers + 'cuda-gst.h', subdir : 'gstreamer-1.0/gst/cuda') +gstcuda_dep = declare_dependency(link_with : gstcuda, + include_directories : libsinc, + dependencies : gstbase_dep, gmodule_dep, gstvideo_dep, gstglproto_dep, + sources: gen_sources) + +meson.override_dependency(pkg_name, gstcuda_dep)
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/stub
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/stub/cuda.h
Added
@@ -0,0 +1,221 @@ +/* CUDA stub header + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_CUDA_STUB_H__ +#define __GST_CUDA_STUB_H__ + +#include <glib.h> + +G_BEGIN_DECLS + +typedef gpointer CUcontext; +typedef gpointer CUgraphicsResource; +typedef gpointer CUstream; +typedef gpointer CUarray; +typedef gpointer CUmodule; +typedef gpointer CUfunction; +typedef gpointer CUmipmappedArray; + +typedef guint64 CUtexObject; +typedef guintptr CUdeviceptr; +typedef gint CUdevice; + +typedef enum +{ + CUDA_SUCCESS = 0, +} CUresult; + +typedef enum +{ + CU_MEMORYTYPE_HOST = 1, + CU_MEMORYTYPE_DEVICE = 2, + CU_MEMORYTYPE_ARRAY = 3, + CU_MEMORYTYPE_UNIFIED = 4, +} CUmemorytype; + +typedef enum +{ + CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT = 14, + CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR = 75, + CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR = 76, +} CUdevice_attribute; + +typedef enum +{ + CU_GRAPHICS_REGISTER_FLAGS_NONE = 0x00, + CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY = 0x01, + CU_GRAPHICS_REGISTER_FLAGS_WRITE_DISCARD = 0x02, + CU_GRAPHICS_REGISTER_FLAGS_SURFACE_LOAD_STORE = 0x04, + CU_GRAPHICS_REGISTER_FLAGS_TEXTURE_GATHER = 0x08, +} CUgraphicsRegisterFlags; + +typedef enum +{ + CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE = 0x00, + CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY = 0x01, + CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD = 0x02, +} CUgraphicsMapResourceFlags; + +typedef enum +{ + CU_STREAM_DEFAULT = 0x0, + CU_STREAM_NON_BLOCKING = 0x1 +} CUstream_flags; + +typedef enum +{ + CU_TR_FILTER_MODE_POINT = 0, + CU_TR_FILTER_MODE_LINEAR = 1 +} CUfilter_mode; + +typedef enum +{ + CU_TR_ADDRESS_MODE_WRAP = 0, + CU_TR_ADDRESS_MODE_CLAMP = 1, + CU_TR_ADDRESS_MODE_MIRROR = 2, + CU_TR_ADDRESS_MODE_BORDER = 3 +} CUaddress_mode; + +typedef enum +{ + CU_RESOURCE_TYPE_ARRAY = 0, + CU_RESOURCE_TYPE_MIPMAPPED_ARRAY = 1, + CU_RESOURCE_TYPE_LINEAR = 2, + CU_RESOURCE_TYPE_PITCH2D = 3 +} CUresourcetype; + +typedef enum +{ + CU_AD_FORMAT_UNSIGNED_INT8 = 1, + CU_AD_FORMAT_UNSIGNED_INT16 = 2, +} CUarray_format; + +typedef enum +{ + CU_RES_VIEW_FORMAT_NONE = 0, +} CUresourceViewFormat; + +typedef struct +{ + gsize srcXInBytes; + gsize srcY; + CUmemorytype srcMemoryType; + gconstpointer srcHost; + CUdeviceptr srcDevice; + CUarray srcArray; + gsize srcPitch; + + gsize dstXInBytes; + gsize dstY; + CUmemorytype dstMemoryType; + gpointer dstHost; + CUdeviceptr dstDevice; + CUarray dstArray; + gsize dstPitch; + + gsize WidthInBytes; + gsize Height; +} CUDA_MEMCPY2D; + +typedef struct +{ + CUaddress_mode addressMode3; + CUfilter_mode filterMode; + guint flags; + guint maxAnisotropy; + CUfilter_mode mipmapFilterMode; + gfloat mipmapLevelBias; + gfloat minMipmapLevelClamp; + gfloat maxMipmapLevelClamp; + gfloat borderColor4; + gint reserved12; +} CUDA_TEXTURE_DESC; + +typedef struct +{ + CUresourcetype resType; + + union { + struct { + CUarray hArray; + } array; + struct { + CUmipmappedArray hMipmappedArray; + } mipmap; + struct { + CUdeviceptr devPtr; + CUarray_format format; + guint numChannels; + gsize sizeInBytes; + } linear; + struct { + CUdeviceptr devPtr; + CUarray_format format; + guint numChannels; + gsize width; + gsize height; + gsize pitchInBytes; + } pitch2D; + struct { + gint reserved32; + } reserved; + } res; + + guint flags; +} CUDA_RESOURCE_DESC; + +typedef struct +{ + CUresourceViewFormat format; + gsize width; + gsize height; + gsize depth; + guint firstMipmapLevel; + guint lastMipmapLevel; + guint firstLayer; + guint lastLayer; + guint reserved16; +} CUDA_RESOURCE_VIEW_DESC; + +#define CUDA_VERSION 10000 + +#ifdef _WIN32 +#define CUDAAPI __stdcall +#else +#define CUDAAPI +#endif + +#define cuCtxCreate cuCtxCreate_v2 +#define cuCtxDestroy cuCtxDestroy_v2 +#define cuCtxPopCurrent cuCtxPopCurrent_v2 +#define cuCtxPushCurrent cuCtxPushCurrent_v2 +#define cuGraphicsResourceGetMappedPointer cuGraphicsResourceGetMappedPointer_v2 +#define cuGraphicsResourceSetMapFlags cuGraphicsResourceSetMapFlags_v2 + +#define cuMemAlloc cuMemAlloc_v2 +#define cuMemAllocPitch cuMemAllocPitch_v2 +#define cuMemAllocHost cuMemAllocHost_v2 +#define cuMemcpy2D cuMemcpy2D_v2 +#define cuMemcpy2DAsync cuMemcpy2DAsync_v2 +#define cuMemFree cuMemFree_v2 + +#define CU_TRSF_READ_AS_INTEGER 1 + +G_END_DECLS + +#endif /* __GST_CUDA_STUB_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/stub/cudaD3D11.h
Added
@@ -0,0 +1,14 @@ +#pragma once + +#include <glib.h> + +G_BEGIN_DECLS + +typedef enum +{ + CU_D3D11_DEVICE_LIST_ALL = 0x01, + CU_D3D11_DEVICE_LIST_CURRENT_FRAME = 0x02, + CU_D3D11_DEVICE_LIST_NEXT_FRAME = 0x03, +} CUd3d11DeviceList; + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/stub/cudaGL.h
Added
@@ -0,0 +1,16 @@ +#ifndef __GST_CUDA_GLSTUB_H__ +#define __GST_CUDA_GLSTUB_H__ + +#include <glib.h> + +G_BEGIN_DECLS +typedef enum +{ + CU_GL_DEVICE_LIST_ALL = 0x01, +} CUGLDeviceList; + +#define cuGLGetDevices cuGLGetDevices_v2 + +G_END_DECLS + +#endif /* __GST_CUDA_GLSTUB_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/cuda/stub/nvrtc.h
Changed
(renamed from sys/nvcodec/stub/nvrtc.h)
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/d3d11-prelude.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/d3d11-prelude.h
Changed
@@ -17,8 +17,7 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __GST_D3D11_PRELUDE_H__ -#define __GST_D3D11_PRELUDE_H__ +#pragma once #include <gst/gst.h> @@ -30,4 +29,3 @@ # endif #endif -#endif /* __GST_D3D11_PRELUDE_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11-private.h
Added
@@ -0,0 +1,251 @@ +/* GStreamer + * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <d3d11_4.h> +#include <dxgi1_6.h> + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/d3d11/gstd3d11format.h> +#include <gst/d3d11/gstd3d11device.h> + +G_BEGIN_DECLS + +#define GST_D3D11_COMMON_FORMATS \ + "RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, " \ + "P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, " \ + "Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, " \ + "GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, " \ + "GBRA, GBRA_10LE, GBRA_12LE" + +#define GST_D3D11_EXTRA_IN_FORMATS \ + "Y410, YUY2" + +#define GST_D3D11_SINK_FORMATS \ + "{ " GST_D3D11_COMMON_FORMATS " ," GST_D3D11_EXTRA_IN_FORMATS " }" + +#define GST_D3D11_SRC_FORMATS \ + "{ " GST_D3D11_COMMON_FORMATS " }" + +#define GST_D3D11_ALL_FORMATS \ + "{ " GST_D3D11_COMMON_FORMATS " ," GST_D3D11_EXTRA_IN_FORMATS " }" + +#define GST_TYPE_D3D11_FORMAT_SUPPORT (gst_d3d11_format_support_get_type()) +GType gst_d3d11_format_support_get_type (void); + +void gst_d3d11_device_d3d11_debug (GstD3D11Device * device, + const gchar * file, + const gchar * function, + gint line); + +void gst_d3d11_device_dxgi_debug (GstD3D11Device * device, + const gchar * file, + const gchar * function, + gint line); + +#define GST_D3D11_CLEAR_COM(obj) G_STMT_START { \ + if (obj) { \ + (obj)->Release (); \ + (obj) = NULL; \ + } \ + } G_STMT_END + + +#define MAKE_FORMAT_MAP_YUV(g,d,r0,r1,r2,r3) \ + { GST_VIDEO_FORMAT_ ##g, DXGI_FORMAT_ ##d, \ + { DXGI_FORMAT_ ##r0, DXGI_FORMAT_ ##r1, DXGI_FORMAT_ ##r2, DXGI_FORMAT_ ##r3 }, \ + { DXGI_FORMAT_ ##r0, DXGI_FORMAT_ ##r1, DXGI_FORMAT_ ##r2, DXGI_FORMAT_ ##r3 }, \ + (D3D11_FORMAT_SUPPORT) (D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) } + +#define MAKE_FORMAT_MAP_YUV_FULL(g,d,r0,r1,r2,r3,f) \ + { GST_VIDEO_FORMAT_ ##g, DXGI_FORMAT_ ##d, \ + { DXGI_FORMAT_ ##r0, DXGI_FORMAT_ ##r1, DXGI_FORMAT_ ##r2, DXGI_FORMAT_ ##r3 }, \ + { DXGI_FORMAT_ ##r0, DXGI_FORMAT_ ##r1, DXGI_FORMAT_ ##r2, DXGI_FORMAT_ ##r3 }, \ + (D3D11_FORMAT_SUPPORT) (f) } + +#define MAKE_FORMAT_MAP_RGB(g,d) \ + { GST_VIDEO_FORMAT_ ##g, DXGI_FORMAT_ ##d, \ + { DXGI_FORMAT_ ##d, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN }, \ + { DXGI_FORMAT_ ##d, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN }, \ + (D3D11_FORMAT_SUPPORT) (D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) } + +#define MAKE_FORMAT_MAP_RGBP(g,d,a) \ + { GST_VIDEO_FORMAT_ ##g, DXGI_FORMAT_UNKNOWN, \ + { DXGI_FORMAT_ ##d, DXGI_FORMAT_ ##d, DXGI_FORMAT_ ##d, DXGI_FORMAT_ ##a }, \ + { DXGI_FORMAT_ ##d, DXGI_FORMAT_ ##d, DXGI_FORMAT_ ##d, DXGI_FORMAT_ ##a }, \ + (D3D11_FORMAT_SUPPORT) (D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) } + +static const GstD3D11Format _gst_d3d11_default_format_map = { + MAKE_FORMAT_MAP_RGB (BGRA, B8G8R8A8_UNORM), + MAKE_FORMAT_MAP_RGB (RGBA, R8G8B8A8_UNORM), + MAKE_FORMAT_MAP_RGB (BGRx, B8G8R8A8_UNORM), + MAKE_FORMAT_MAP_RGB (RGBx, R8G8B8A8_UNORM), + MAKE_FORMAT_MAP_RGB (RGB10A2_LE, R10G10B10A2_UNORM), + MAKE_FORMAT_MAP_RGB (RGBA64_LE, R16G16B16A16_UNORM), + MAKE_FORMAT_MAP_YUV (AYUV, UNKNOWN, R8G8B8A8_UNORM, UNKNOWN, UNKNOWN, UNKNOWN), + MAKE_FORMAT_MAP_YUV (AYUV64, UNKNOWN, R16G16B16A16_UNORM, UNKNOWN, UNKNOWN, UNKNOWN), + MAKE_FORMAT_MAP_YUV (VUYA, AYUV, R8G8B8A8_UNORM, UNKNOWN, UNKNOWN, UNKNOWN), + MAKE_FORMAT_MAP_YUV (NV12, NV12, R8_UNORM, R8G8_UNORM, UNKNOWN, UNKNOWN), + MAKE_FORMAT_MAP_YUV (NV21, UNKNOWN, R8_UNORM, R8G8_UNORM, UNKNOWN, UNKNOWN), + MAKE_FORMAT_MAP_YUV (P010_10LE, P010, R16_UNORM, R16G16_UNORM, UNKNOWN, UNKNOWN), + MAKE_FORMAT_MAP_YUV (P012_LE, P016, R16_UNORM, R16G16_UNORM, UNKNOWN, UNKNOWN), + MAKE_FORMAT_MAP_YUV (P016_LE, P016, R16_UNORM, R16G16_UNORM, UNKNOWN, UNKNOWN), + MAKE_FORMAT_MAP_YUV (I420, UNKNOWN, R8_UNORM, R8_UNORM, R8_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_YUV (YV12, UNKNOWN, R8_UNORM, R8_UNORM, R8_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_YUV (I420_10LE, UNKNOWN, R16_UNORM, R16_UNORM, R16_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_YUV (I420_12LE, UNKNOWN, R16_UNORM, R16_UNORM, R16_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_YUV (Y42B, UNKNOWN, R8_UNORM, R8_UNORM, R8_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_YUV (I422_10LE, UNKNOWN, R16_UNORM, R16_UNORM, R16_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_YUV (I422_12LE, UNKNOWN, R16_UNORM, R16_UNORM, R16_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_YUV (Y444, UNKNOWN, R8_UNORM, R8_UNORM, R8_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_YUV (Y444_10LE, UNKNOWN, R16_UNORM, R16_UNORM, R16_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_YUV (Y444_12LE, UNKNOWN, R16_UNORM, R16_UNORM, R16_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_YUV (Y444_16LE, UNKNOWN, R16_UNORM, R16_UNORM, R16_UNORM, UNKNOWN), + /* GRAY */ + /* NOTE: To support conversion by using video processor, + * mark DXGI_FORMAT_{R8,R16}_UNORM formats as known dxgi_format. + * Otherwise, d3d11 elements will not try to use video processor for + * those formats */ + MAKE_FORMAT_MAP_RGB (GRAY8, R8_UNORM), + MAKE_FORMAT_MAP_RGB (GRAY16_LE, R16_UNORM), + MAKE_FORMAT_MAP_YUV_FULL (Y410, Y410, R10G10B10A2_UNORM, UNKNOWN, UNKNOWN, UNKNOWN, + D3D11_FORMAT_SUPPORT_SHADER_SAMPLE), + MAKE_FORMAT_MAP_YUV_FULL (YUY2, YUY2, R8G8B8A8_UNORM, UNKNOWN, UNKNOWN, UNKNOWN, + D3D11_FORMAT_SUPPORT_SHADER_SAMPLE), + MAKE_FORMAT_MAP_RGBP (RGBP, R8_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_RGBP (BGRP, R8_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_RGBP (GBR, R8_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_RGBP (GBR_10LE, R16_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_RGBP (GBR_12LE, R16_UNORM, UNKNOWN), + MAKE_FORMAT_MAP_RGBP (GBRA, R8_UNORM, R8_UNORM), + MAKE_FORMAT_MAP_RGBP (GBRA_10LE, R16_UNORM, R16_UNORM), + MAKE_FORMAT_MAP_RGBP (GBRA_12LE, R16_UNORM, R16_UNORM), +}; + +#undef MAKE_FORMAT_MAP_YUV +#undef MAKE_FORMAT_MAP_YUV_FULL +#undef MAKE_FORMAT_MAP_RGB + +#define GST_D3D11_N_FORMATS G_N_ELEMENTS(_gst_d3d11_default_format_map) + +typedef struct _GstD3D11ColorMatrix +{ + gdouble matrix33; + gdouble offset3; + gdouble min3; + gdouble max3; +} GstD3D11ColorMatrix; + +GST_D3D11_API +gchar * gst_d3d11_dump_color_matrix (GstD3D11ColorMatrix * matrix); + +GST_D3D11_API +gboolean gst_d3d11_color_range_adjust_matrix_unorm (const GstVideoInfo * in_info, + const GstVideoInfo * out_info, + GstD3D11ColorMatrix * matrix); + +GST_D3D11_API +gboolean gst_d3d11_yuv_to_rgb_matrix_unorm (const GstVideoInfo * in_yuv_info, + const GstVideoInfo * out_rgb_info, + GstD3D11ColorMatrix * matrix); + +GST_D3D11_API +gboolean gst_d3d11_rgb_to_yuv_matrix_unorm (const GstVideoInfo * in_rgb_info, + const GstVideoInfo * out_yuv_info, + GstD3D11ColorMatrix * matrix); + +GST_D3D11_API +gboolean gst_d3d11_color_primaries_matrix_unorm (const GstVideoColorPrimariesInfo * in_info, + const GstVideoColorPrimariesInfo * out_info, + GstD3D11ColorMatrix * matrix); + +G_END_DECLS + +#ifdef __cplusplus +#include <mutex> + +class GstD3D11DeviceLockGuard +{ +public: + explicit GstD3D11DeviceLockGuard(GstD3D11Device * device) : device_ (device) + { + gst_d3d11_device_lock (device_); + } + + ~GstD3D11DeviceLockGuard() + { + gst_d3d11_device_unlock (device_); + } + + GstD3D11DeviceLockGuard(const GstD3D11DeviceLockGuard&) = delete; + GstD3D11DeviceLockGuard& operator=(const GstD3D11DeviceLockGuard&) = delete; + +private: + GstD3D11Device *device_; +}; + +class GstD3D11CSLockGuard +{ +public: + explicit GstD3D11CSLockGuard(CRITICAL_SECTION * cs) : cs_ (cs) + { + EnterCriticalSection (cs_); + } + + ~GstD3D11CSLockGuard() + { + LeaveCriticalSection (cs_); + } + + GstD3D11CSLockGuard(const GstD3D11CSLockGuard&) = delete; + GstD3D11CSLockGuard& operator=(const GstD3D11CSLockGuard&) = delete; + +private: + CRITICAL_SECTION *cs_; +}; + +class GstD3D11SRWLockGuard +{ +public: + explicit GstD3D11SRWLockGuard(SRWLOCK * lock) : lock_ (lock) + { + AcquireSRWLockExclusive (lock_); + } + + ~GstD3D11SRWLockGuard() + { + ReleaseSRWLockExclusive (lock_); + } + + GstD3D11SRWLockGuard(const GstD3D11SRWLockGuard&) = delete; + GstD3D11SRWLockGuard& operator=(const GstD3D11SRWLockGuard&) = delete; + +private: + SRWLOCK *lock_; +}; + +#define GST_D3D11_CALL_ONCE_BEGIN \ + static std::once_flag __once_flag; \ + std::call_once (__once_flag, &() + +#define GST_D3D11_CALL_ONCE_END ) + +#endif /* __cplusplus */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11.h
Changed
@@ -17,8 +17,7 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __GST_D3D11_H__ -#define __GST_D3D11_H__ +#pragma once #ifndef GST_USE_UNSTABLE_API #pragma message ("The d3d11 library from gst-plugins-bad is unstable API and may change in future.") @@ -28,10 +27,11 @@ #include <gst/gst.h> #include <gst/d3d11/gstd3d11config.h> #include <gst/d3d11/gstd3d11_fwd.h> +#include <gst/d3d11/gstd3d11bufferpool.h> +#include <gst/d3d11/gstd3d11compile.h> +#include <gst/d3d11/gstd3d11converter.h> #include <gst/d3d11/gstd3d11device.h> +#include <gst/d3d11/gstd3d11format.h> #include <gst/d3d11/gstd3d11memory.h> -#include <gst/d3d11/gstd3d11bufferpool.h> #include <gst/d3d11/gstd3d11utils.h> -#include <gst/d3d11/gstd3d11format.h> -#endif /* __GST_D3D11_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11_fwd.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11_fwd.h
Changed
@@ -18,8 +18,7 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __GST_D3D11_FWD_H__ -#define __GST_D3D11_FWD_H__ +#pragma once #include <gst/gst.h> #include <gst/d3d11/gstd3d11config.h> @@ -29,31 +28,8 @@ #include <initguid.h> #endif -#if (GST_D3D11_HEADER_VERSION >= 4) -#include <d3d11_4.h> -#elif (GST_D3D11_HEADER_VERSION >= 3) -#include <d3d11_3.h> -#elif (GST_D3D11_HEADER_VERSION >= 2) -#include <d3d11_2.h> -#elif (GST_D3D11_HEADER_VERSION >= 1) -#include <d3d11_1.h> -#else #include <d3d11.h> -#endif - -#if (GST_D3D11_DXGI_HEADER_VERSION >= 6) -#include <dxgi1_6.h> -#elif (GST_D3D11_DXGI_HEADER_VERSION >= 5) -#include <dxgi1_5.h> -#elif (GST_D3D11_DXGI_HEADER_VERSION >= 4) -#include <dxgi1_4.h> -#elif (GST_D3D11_DXGI_HEADER_VERSION >= 3) -#include <dxgi1_3.h> -#elif (GST_D3D11_DXGI_HEADER_VERSION >= 2) -#include <dxgi1_2.h> -#else #include <dxgi.h> -#endif G_BEGIN_DECLS @@ -77,8 +53,18 @@ typedef struct _GstD3D11BufferPoolClass GstD3D11BufferPoolClass; typedef struct _GstD3D11BufferPoolPrivate GstD3D11BufferPoolPrivate; +typedef struct _GstD3D11StagingBufferPool GstD3D11StagingBufferPool; +typedef struct _GstD3D11StagingBufferPoolClass GstD3D11StagingBufferPoolClass; +typedef struct _GstD3D11StagingBufferPoolPrivate GstD3D11StagingBufferPoolPrivate; + typedef struct _GstD3D11Format GstD3D11Format; +typedef struct _GstD3D11Converter GstD3D11Converter; +typedef struct _GstD3D11ConverterClass GstD3D11ConverterClass; +typedef struct _GstD3D11ConverterPrivate GstD3D11ConverterPrivate; + +typedef struct _GstD3D11Fence GstD3D11Fence; +typedef struct _GstD3D11FencePrivate GstD3D11FencePrivate; + G_END_DECLS -#endif /* __GST_D3D11_FWD_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11bufferpool.cpp -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11bufferpool.cpp
Changed
@@ -26,18 +26,20 @@ #include "gstd3d11memory.h" #include "gstd3d11device.h" #include "gstd3d11utils.h" +#include "gstd3d11-private.h" #include <string.h> /** * SECTION:gstd3d11bufferpool * @title: GstD3D11BufferPool - * @short_description: buffer pool for #GstD3D11Memory objects - * @see_also: #GstBufferPool, #GstGLMemory + * @short_description: buffer pool for GstD3D11Memory object + * @see_also: #GstBufferPool, #GstD3D11Memory * - * a #GstD3D11BufferPool is an object that allocates buffers with #GstD3D11Memory + * This GstD3D11BufferPool is an object that allocates buffers + * with #GstD3D11Memory * - * A #GstGLBufferPool is created with gst_d3d11_buffer_pool_new() + * Since: 1.22 */ GST_DEBUG_CATEGORY_STATIC (gst_d3d11_buffer_pool_debug); @@ -146,6 +148,7 @@ D3D11_TEXTURE2D_DESC *desc; const GstD3D11Format *format; gsize offset = 0; + guint align = 0; gint i; if (!gst_buffer_pool_config_get_params (config, &caps, NULL, &min_buffers, @@ -175,30 +178,28 @@ /* allocate memory with resource format by default */ priv->d3d11_params = gst_d3d11_allocation_params_new (self->device, - &info, (GstD3D11AllocationFlags) 0, 0); + &info, GST_D3D11_ALLOCATION_FLAG_DEFAULT, 0, 0); } desc = priv->d3d11_params->desc; + align = gst_d3d11_dxgi_format_get_alignment (desc0.Format); /* resolution of semi-planar formats must be multiple of 2 */ - if (desc0.Format == DXGI_FORMAT_NV12 || desc0.Format == DXGI_FORMAT_P010 - || desc0.Format == DXGI_FORMAT_P016) { - if (desc0.Width % 2 || desc0.Height % 2) { - gint width, height; - GstVideoAlignment align; + if (align != 0 && (desc0.Width % align || desc0.Height % align)) { + gint width, height; + GstVideoAlignment video_align; - GST_WARNING_OBJECT (self, "Resolution %dx%d is not mutiple of 2, fixing", - desc0.Width, desc0.Height); + GST_WARNING_OBJECT (self, "Resolution %dx%d is not mutiple of %d, fixing", + desc0.Width, desc0.Height, align); - width = GST_ROUND_UP_2 (desc0.Width); - height = GST_ROUND_UP_2 (desc0.Height); + width = GST_ROUND_UP_N (desc0.Width, align); + height = GST_ROUND_UP_N (desc0.Height, align); - gst_video_alignment_reset (&align); - align.padding_right = width - desc0.Width; - align.padding_bottom = height - desc0.Height; + gst_video_alignment_reset (&video_align); + video_align.padding_right = width - desc0.Width; + video_align.padding_bottom = height - desc0.Height; - gst_d3d11_allocation_params_alignment (priv->d3d11_params, &align); - } + gst_d3d11_allocation_params_alignment (priv->d3d11_params, &video_align); } #ifndef GST_DISABLE_GST_DEBUG { @@ -278,7 +279,7 @@ return FALSE; } - if (!gst_d3d11_memory_get_texture_stride (GST_D3D11_MEMORY_CAST (mem), + if (!gst_d3d11_memory_get_resource_stride (GST_D3D11_MEMORY_CAST (mem), &stride) || stride < desci.Width) { GST_ERROR_OBJECT (self, "Failed to calculate stride"); @@ -298,8 +299,7 @@ gst_memory_unref (mem); } - g_assert (priv->d3d11_params->d3d11_format != NULL); - format = priv->d3d11_params->d3d11_format; + format = &priv->d3d11_params->d3d11_format; /* single texture semi-planar formats */ if (format->dxgi_format != DXGI_FORMAT_UNKNOWN && GST_VIDEO_INFO_N_PLANES (&info) == 2) { @@ -506,7 +506,7 @@ * * Returns: a #GstBufferPool that allocates buffers with #GstD3D11Memory * - * Since: 1.20 + * Since: 1.22 */ GstBufferPool * gst_d3d11_buffer_pool_new (GstD3D11Device * device) @@ -531,7 +531,7 @@ * #GstD3D11AllocationParams on @config or %NULL if @config doesn't contain * #GstD3D11AllocationParams * - * Since: 1.20 + * Since: 1.22 */ GstD3D11AllocationParams * gst_buffer_pool_config_get_d3d11_allocation_params (GstStructure * config) @@ -552,7 +552,7 @@ * * Sets @params on @config * - * Since: 1.20 + * Since: 1.22 */ void gst_buffer_pool_config_set_d3d11_allocation_params (GstStructure * config,
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11bufferpool.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11bufferpool.h
Changed
@@ -19,8 +19,7 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __GST_D3D11_BUFFER_POOL_H__ -#define __GST_D3D11_BUFFER_POOL_H__ +#pragma once #include <gst/gst.h> #include <gst/video/video.h> @@ -35,6 +34,13 @@ #define GST_IS_D3D11_BUFFER_POOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_D3D11_BUFFER_POOL)) #define GST_D3D11_BUFFER_POOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_D3D11_BUFFER_POOL, GstD3D11BufferPoolClass)) +/** + * GstD3D11BufferPool: + * + * Opaque GstD3D11BufferPool struct + * + * Since: 1.22 + */ struct _GstD3D11BufferPool { GstBufferPool parent; @@ -43,13 +49,19 @@ /*< private >*/ GstD3D11BufferPoolPrivate *priv; - gpointer _gst_reservedGST_PADDING; }; +/** + * GstD3D11BufferPoolClass: + * + * Opaque GstD3D11BufferPoolClass struct + * + * Since: 1.22 + */ struct _GstD3D11BufferPoolClass { - GstBufferPoolClass bufferpool_class; + GstBufferPoolClass parent_class; /*< private >*/ gpointer _gst_reservedGST_PADDING; @@ -70,4 +82,3 @@ G_END_DECLS -#endif /* __GST_D3D11_BUFFER_POOL_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11compile.cpp
Added
@@ -0,0 +1,320 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstd3d11compile.h" +#include "gstd3d11device.h" +#include "gstd3d11utils.h" +#include "gstd3d11-private.h" +#include <gmodule.h> +#include <wrl.h> +#include <string.h> + +/** + * SECTION:gstd3d11compile + * @title: GstD3D11Compile + * @short_description: HLSL compiler and utility + * + * A set of HLSL compile helper methods + * + * Since: 1.22 + */ + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +#ifndef GST_DISABLE_GST_DEBUG +#define GST_CAT_DEFAULT ensure_debug_category() +static GstDebugCategory * +ensure_debug_category (void) +{ + static GstDebugCategory *cat = nullptr; + + GST_D3D11_CALL_ONCE_BEGIN { + cat = _gst_debug_category_new ("d3d11compile", 0, "d3d11compile"); + } GST_D3D11_CALL_ONCE_END; + + return cat; +} +#else +#define ensure_debug_category() /* NOOP */ +#endif /* GST_DISABLE_GST_DEBUG */ + +static GModule *d3d_compiler_module = nullptr; +static pD3DCompile GstD3DCompileFunc = nullptr; + +/** + * gst_d3d11_compile_init: + * + * Loads HLSL compiler library + * + * Returns: %TRUE if HLSL compiler library is available + * + * Since: 1.22 + */ +gboolean +gst_d3d11_compile_init (void) +{ + GST_D3D11_CALL_ONCE_BEGIN { +#if GST_D3D11_WINAPI_ONLY_APP + /* Assuming that d3d compiler library is available */ + GstD3DCompileFunc = D3DCompile; +#else + static const gchar *d3d_compiler_names = { + "d3dcompiler_47.dll", + "d3dcompiler_46.dll", + "d3dcompiler_45.dll", + "d3dcompiler_44.dll", + "d3dcompiler_43.dll", + }; + for (guint i = 0; i < G_N_ELEMENTS (d3d_compiler_names); i++) { + d3d_compiler_module = + g_module_open (d3d_compiler_namesi, G_MODULE_BIND_LAZY); + + if (d3d_compiler_module) { + GST_INFO ("D3D compiler %s is available", d3d_compiler_namesi); + if (!g_module_symbol (d3d_compiler_module, "D3DCompile", + (gpointer *) & GstD3DCompileFunc)) { + GST_ERROR ("Cannot load D3DCompile symbol from %s", + d3d_compiler_namesi); + g_module_close (d3d_compiler_module); + d3d_compiler_module = nullptr; + GstD3DCompileFunc = nullptr; + } else { + break; + } + } + } + + if (!GstD3DCompileFunc) + GST_WARNING ("D3D11 compiler library is unavailable"); +#endif + } + GST_D3D11_CALL_ONCE_END; + + if (!GstD3DCompileFunc) + return FALSE; + + return TRUE; +} + +/** + * gst_d3d11_compile: + * @src_data: source data to compile + * @src_data_size: length of src_data + * @source_name: (nullable): used for strings that specify error messages + * @defines: (nullable): null-terminated array of D3D_SHADER_MACRO struct that defines shader macros + * @include: (nullable): a ID3DInclude + * @entry_point: (nullable): the name of entry point function + * @target: a string specifies the shader target + * @flags1: flags defined by D3DCOMPILE constants + * @flags2: flags defined by D3DCOMPILE_EFFECT constants + * @code: (out) (optional): a compiled code + * @error_msgs: (out) (optional) (nullable): compiler error messages + * + * Compiles HLSL code or an effect file into bytecode for a given target + * + * Returns: HRESULT return code + * + * Since: 1.22 + */ +HRESULT +gst_d3d11_compile (LPCVOID src_data, SIZE_T src_data_size, LPCSTR source_name, + CONST D3D_SHADER_MACRO * defines, ID3DInclude * include, LPCSTR entry_point, + LPCSTR target, UINT flags1, UINT flags2, ID3DBlob ** code, + ID3DBlob ** error_msgs) +{ + if (!gst_d3d11_compile_init ()) + return E_FAIL; + + return GstD3DCompileFunc (src_data, src_data_size, source_name, defines, + include, entry_point, target, flags1, flags2, code, error_msgs); +} + +/** + * gst_d3d11_create_pixel_shader_simple: + * @device: a #GstD3D11Device + * @source: a pixel shader code to compile + * @entry_point: the name of entry point function + * @shader: (out): a ID3D11PixelShader + + * Compiles pixel shader code and creates ID3D11PixelShader + * + * Returns: HRESULT return code + * + * Since: 1.22 + */ +HRESULT +gst_d3d11_create_pixel_shader_simple (GstD3D11Device * device, + const gchar * source, const gchar * entry_point, + ID3D11PixelShader ** shader) +{ + ID3D11Device *device_handle; + HRESULT hr; + ComPtr < ID3DBlob > ps_blob; + ComPtr < ID3DBlob > error_msg; + D3D_FEATURE_LEVEL feature_level; + const gchar *target; + + g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), E_INVALIDARG); + g_return_val_if_fail (source != nullptr, E_INVALIDARG); + g_return_val_if_fail (entry_point != nullptr, E_INVALIDARG); + g_return_val_if_fail (shader != nullptr, E_INVALIDARG); + + device_handle = gst_d3d11_device_get_device_handle (device); + feature_level = device_handle->GetFeatureLevel (); + + if (feature_level >= D3D_FEATURE_LEVEL_11_0) + target = "ps_5_0"; + else if (feature_level >= D3D_FEATURE_LEVEL_10_0) + target = "ps_4_0"; + else if (feature_level >= D3D_FEATURE_LEVEL_9_3) + target = "ps_4_0_level_9_3"; + else + target = "ps_4_0_level_9_1"; + + GST_DEBUG_OBJECT (device, "Compile code\n%s", source); + + hr = gst_d3d11_compile (source, strlen (source), nullptr, nullptr, nullptr, + entry_point, target, 0, 0, &ps_blob, &error_msg); + + if (!gst_d3d11_result (hr, device)) { + const gchar *err = nullptr; + + if (error_msg) + err = (const gchar *) error_msg->GetBufferPointer (); + + GST_ERROR_OBJECT (device, + "Couldn't compile code, hr: 0x%x, error detail: %s, source code: \n%s", + (guint) hr, GST_STR_NULL (err), source); + + return hr; + } + + if (error_msg) { + const gchar *err = (const gchar *) error_msg->GetBufferPointer (); + + GST_DEBUG_OBJECT (device, "HLSL compiler warning %s, shader code %s", + GST_STR_NULL (err), source); + } + + return device_handle->CreatePixelShader (ps_blob->GetBufferPointer (), + ps_blob->GetBufferSize (), nullptr, shader); +} + +/** + * gst_d3d11_create_vertex_shader_simple: + * @device: a #GstD3D11Device + * @source: a vertex shader code to compile + * @entry_point: the name of entry point function + * @input_desc: an array of D3D11_INPUT_ELEMENT_DESC + * @desc_len: length of input_desc + * @shader: (out): a ID3D11VertexShader + * @layout: (out): a ID3D11InputLayout + + * Compiles vertex shader code and creates ID3D11VertexShader and + * ID3D11InputLayout + * + * Returns: HRESULT return code + * + * Since: 1.22 + */ +HRESULT +gst_d3d11_create_vertex_shader_simple (GstD3D11Device * device, + const gchar * source, const gchar * entry_point, + const D3D11_INPUT_ELEMENT_DESC * input_desc, guint desc_len, + ID3D11VertexShader ** shader, ID3D11InputLayout ** layout) +{ + ID3D11Device *device_handle; + HRESULT hr; + ComPtr < ID3DBlob > vs_blob; + ComPtr < ID3DBlob > error_msg; + ComPtr < ID3D11VertexShader > vs; + ComPtr < ID3D11InputLayout > input_layout; + D3D_FEATURE_LEVEL feature_level; + const gchar *target; + + g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), E_INVALIDARG); + g_return_val_if_fail (source != nullptr, E_INVALIDARG); + g_return_val_if_fail (entry_point != nullptr, E_INVALIDARG); + g_return_val_if_fail (input_desc != nullptr, E_INVALIDARG); + g_return_val_if_fail (desc_len > 0, E_INVALIDARG); + g_return_val_if_fail (shader != nullptr, E_INVALIDARG); + g_return_val_if_fail (layout != nullptr, E_INVALIDARG); + + device_handle = gst_d3d11_device_get_device_handle (device); + feature_level = device_handle->GetFeatureLevel (); + + if (feature_level >= D3D_FEATURE_LEVEL_11_0) + target = "vs_5_0"; + else if (feature_level >= D3D_FEATURE_LEVEL_10_0) + target = "vs_4_0"; + else if (feature_level >= D3D_FEATURE_LEVEL_9_3) + target = "vs_4_0_level_9_3"; + else + target = "vs_4_0_level_9_1"; + + GST_DEBUG_OBJECT (device, "Compile code\n%s", source); + + hr = gst_d3d11_compile (source, strlen (source), nullptr, nullptr, nullptr, + entry_point, target, 0, 0, &vs_blob, &error_msg); + + if (!gst_d3d11_result (hr, device)) { + const gchar *err = nullptr; + + if (error_msg) + err = (const gchar *) error_msg->GetBufferPointer (); + + GST_ERROR_OBJECT (device, + "Couldn't compile code, hr: 0x%x, error detail: %s, source code: \n%s", + (guint) hr, GST_STR_NULL (err), source); + + return hr; + } + + if (error_msg) { + const gchar *err = (const gchar *) error_msg->GetBufferPointer (); + + GST_DEBUG_OBJECT (device, "HLSL compiler warning %s, shader code %s", + GST_STR_NULL (err), source); + } + + hr = device_handle->CreateVertexShader (vs_blob->GetBufferPointer (), + vs_blob->GetBufferSize (), nullptr, &vs); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (device, "Couldn't create vertex shader"); + return hr; + } + + hr = device_handle->CreateInputLayout (input_desc, desc_len, + vs_blob->GetBufferPointer (), vs_blob->GetBufferSize (), &input_layout); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (device, "Couldn't create input layout"); + return hr; + } + + *shader = vs.Detach (); + *layout = input_layout.Detach (); + + return hr; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11compile.h
Added
@@ -0,0 +1,59 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/d3d11/gstd3d11_fwd.h> +#include <d3dcompiler.h> + +G_BEGIN_DECLS + +GST_D3D11_API +gboolean gst_d3d11_compile_init (void); + +GST_D3D11_API +HRESULT gst_d3d11_compile (LPCVOID src_data, + SIZE_T src_data_size, + LPCSTR source_name, + CONST D3D_SHADER_MACRO * defines, + ID3DInclude * include, + LPCSTR entry_point, + LPCSTR target, + UINT flags1, + UINT flags2, + ID3DBlob ** code, + ID3DBlob ** error_msgs); + +GST_D3D11_API +HRESULT gst_d3d11_create_pixel_shader_simple (GstD3D11Device * device, + const gchar * source, + const gchar * entry_point, + ID3D11PixelShader ** shader); + +GST_D3D11_API +HRESULT gst_d3d11_create_vertex_shader_simple (GstD3D11Device * device, + const gchar * source, + const gchar * entry_point, + const D3D11_INPUT_ELEMENT_DESC * input_desc, + guint desc_len, + ID3D11VertexShader ** shader, + ID3D11InputLayout ** layout); + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11config.h.meson -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11config.h.meson
Changed
@@ -1,17 +1,10 @@ -/* gstd3d11config.h */ - -#ifndef __GST_D3D11_CONFIG_H__ -#define __GST_D3D11_CONFIG_H__ +#pragma once #include <gst/gst.h> G_BEGIN_DECLS -#mesondefine GST_D3D11_DXGI_HEADER_VERSION -#mesondefine GST_D3D11_HEADER_VERSION #mesondefine GST_D3D11_WINAPI_ONLY_APP #mesondefine GST_D3D11_WINAPI_APP G_END_DECLS - -#endif /* __GST_D3D11_CONFIG_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11converter.cpp
Added
@@ -0,0 +1,4308 @@ +/* GStreamer + * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> + * Copyright (C) <2019> Jeongki Kim <jeongki.kim@jeongki.kim> + * Copyright (C) <2022> Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "gstd3d11-private.h" +#include "gstd3d11converter.h" +#include "gstd3d11device.h" +#include "gstd3d11utils.h" +#include "gstd3d11memory.h" +#include "gstd3d11compile.h" +#include "gstd3d11bufferpool.h" +#include <wrl.h> +#include <string.h> +#include <math.h> + +/** + * SECTION:gstd3d11converter + * @title: GstD3D11Converter + * @short_description: Direct3D11 video converter object + * + * This object performs various video conversion operation + * via Direct3D11 API + * + * Since: 1.22 + */ + +GST_DEBUG_CATEGORY_STATIC (gst_d3d11_converter_debug); +#define GST_CAT_DEFAULT gst_d3d11_converter_debug + +DEFINE_ENUM_FLAG_OPERATORS (GstD3D11ConverterBackend); + +GType +gst_d3d11_converter_backend_get_type (void) +{ + static GType type = 0; + static const GFlagsValue values = { + {GST_D3D11_CONVERTER_BACKEND_SHADER, "GST_D3D11_CONVERTER_BACKEND_SHADER", + "shader"}, + {GST_D3D11_CONVERTER_BACKEND_VIDEO_PROCESSOR, + "GST_D3D11_CONVERTER_BACKEND_VIDEO_PROCESSOR", "video-processor"}, + {0, nullptr, nullptr} + }; + + GST_D3D11_CALL_ONCE_BEGIN { + type = g_flags_register_static ("GstD3D11ConverterBackend", values); + } GST_D3D11_CALL_ONCE_END; + + return type; +} + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +#define CONVERTER_MAX_QUADS 2 +#define GAMMA_LUT_SIZE 4096 + +/* undefined symbols in ancient MinGW headers */ +/* D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_METADATA_HDR10 */ +#define FEATURE_CAPS_METADATA_HDR10 (0x800) +/* D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_ROTATION */ +#define FEATURE_CAPS_ROTATION (0x40) +/* D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_MIRROR */ +#define PROCESSOR_FEATURE_CAPS_MIRROR (0x200) + +/* *INDENT-OFF* */ +typedef struct +{ + /* + 1 for 16bytes alignment */ + FLOAT coeffX4; + FLOAT coeffY4; + FLOAT coeffZ4; + FLOAT offset4; + FLOAT min4; + FLOAT max4; +} PSColorSpace; + +typedef struct +{ + PSColorSpace to_rgb_buf; + PSColorSpace to_yuv_buf; + PSColorSpace XYZ_convert_buf; + FLOAT alpha; + FLOAT padding3; +} PSConstBuffer; + +typedef struct +{ + struct { + FLOAT x; + FLOAT y; + FLOAT z; + } position; + struct { + FLOAT u; + FLOAT v; + } texture; +} VertexData; + +/* output struct */ +static const gchar templ_OUTPUT_SINGLE_PLANE = + "struct PS_OUTPUT\n" + "{\n" + " float4 Plane_0: SV_TARGET0;\n" + "};"; + +static const gchar templ_OUTPUT_TWO_PLANES = + "struct PS_OUTPUT\n" + "{\n" + " float4 Plane_0: SV_TARGET0;\n" + " float4 Plane_1: SV_TARGET1;\n" + "};"; + +static const gchar templ_OUTPUT_THREE_PLANES = + "struct PS_OUTPUT\n" + "{\n" + " float4 Plane_0: SV_TARGET0;\n" + " float4 Plane_1: SV_TARGET1;\n" + " float4 Plane_2: SV_TARGET2;\n" + "};"; + +static const gchar templ_OUTPUT_FOUR_PLANES = + "struct PS_OUTPUT\n" + "{\n" + " float4 Plane_0: SV_TARGET0;\n" + " float4 Plane_1: SV_TARGET1;\n" + " float4 Plane_2: SV_TARGET2;\n" + " float4 Plane_3: SV_TARGET3;\n" + "};"; + +typedef struct +{ + const gchar *output_template; + guint num_rtv; +} PSOutputType; + +enum +{ + OUTPUT_SINGLE_PLANE = 0, + OUTPUT_TWO_PLANES, + OUTPUT_THREE_PLANES, + OUTPUT_FOUR_PLANES, +}; + +static const PSOutputType output_types = { + {templ_OUTPUT_SINGLE_PLANE, 1}, + {templ_OUTPUT_TWO_PLANES, 2}, + {templ_OUTPUT_THREE_PLANES, 3}, + {templ_OUTPUT_FOUR_PLANES, 4}, +}; + +/* colorspace conversion */ +static const gchar templ_COLOR_SPACE_IDENTITY = + "{\n" + " return sample;\n" + "}"; + +static const gchar templ_COLOR_SPACE_CONVERT = + "{\n" + " float3 out_space;\n" + " out_space.x = dot (coeff.CoeffX, sample);\n" + " out_space.y = dot (coeff.CoeffY, sample);\n" + " out_space.z = dot (coeff.CoeffZ, sample);\n" + " out_space += coeff.Offset;\n" + " return clamp (out_space, coeff.Min, coeff.Max);\n" + "}"; + +static const gchar templ_COLOR_SPACE_CONVERT_LUMA = + "{\n" + " float3 out_space;\n" + " out_space.x = dot (coeff.CoeffX, sample) + coeff.Offset.x;\n" + " out_space.x = clamp (out_space.x, coeff.Min.x, coeff.Max.x);\n" + " out_space.y = 0.5;\n" + " out_space.z = 0.5;\n" + " return out_space;\n" + "}"; + +static const gchar templ_COLOR_SPACE_CONVERT_CHROMA = + "{\n" + " float3 out_space;\n" + " out_space.x = 0.0;\n" + " out_space.y = dot (coeff.CoeffY, sample) + coeff.Offset.y;\n" + " out_space.z = dot (coeff.CoeffZ, sample) + coeff.Offset.z;\n" + " return clamp (out_space, coeff.Min, coeff.Max);\n" + "}"; + +static const gchar templ_COLOR_SPACE_GRAY_TO_RGB = + "{\n" + " return float3 (sample.x, sample.x, sample.x);\n" + "}"; + +static const gchar templ_COLOR_SPACE_GRAY_TO_RGB_RANGE_ADJUST = + "{\n" + " float gray;\n" + " gray = coeff.CoeffX.x * sample.x + coeff.Offset.x;\n" + " gray = clamp (gray, coeff.Min.x, coeff.Max.x);\n" + " return float3 (gray, gray, gray);\n" + "}"; + +/* sampling */ +static const gchar templ_SAMPLE_DEFAULT = + "float4 sample_texture (float2 uv)\n" + "{\n" + " return shaderTexture0.Sample(samplerState, uv);\n" + "}"; + +static const gchar templ_SAMPLE_VUYA = + "float4 sample_texture (float2 uv)\n" + "{\n" + " return shaderTexture0.Sample(samplerState, uv).%c%c%c%c;\n" + "}"; + +static const gchar templ_SAMPLE_YUV_LUMA = + "float4 sample_texture (float2 uv)\n" + "{\n" + " float4 sample;\n" + " sample.x = shaderTexture0.Sample(samplerState, uv).x;\n" + " sample.y = 0.5;\n" + " sample.z = 0.5;\n" + " sample.a = 1.0;\n" + " return sample;\n" + "}"; + +static const gchar templ_SAMPLE_YUV_LUMA_SCALED = + "float4 sample_texture (float2 uv)\n" + "{\n" + " float4 sample;\n" + " sample.x = saturate (shaderTexture0.Sample(samplerState, uv).x * %d);\n" + " sample.y = 0.5;\n" + " sample.z = 0.5;\n" + " sample.a = 1.0;\n" + " return sample;\n" + "}"; + +static const gchar templ_SAMPLE_SEMI_PLANAR = + "float4 sample_texture (float2 uv)\n" + "{\n" + " float4 sample;\n" + " sample.x = shaderTexture0.Sample(samplerState, uv).x;\n" + " sample.yz = shaderTexture1.Sample(samplerState, uv).%c%c;\n" + " sample.a = 1.0;\n" + " return sample;\n" + "}"; + +static const gchar templ_SAMPLE_SEMI_PLANAR_CHROMA = + "float4 sample_texture (float2 uv)\n" + "{\n" + " float4 sample;\n" + " sample.x = 0.0;\n" + " sample.yz = shaderTexture1.Sample(samplerState, uv).%c%c;\n" + " sample.a = 1.0;\n" + " return sample;\n" + "}"; + +static const gchar templ_SAMPLE_PLANAR = + "float4 sample_texture (float2 uv)\n" + "{\n" + " float3 sample;\n" + " sample.%c = shaderTexture0.Sample(samplerState, uv).x;\n" + " sample.%c = shaderTexture1.Sample(samplerState, uv).x;\n" + " sample.%c = shaderTexture2.Sample(samplerState, uv).x;\n" + " return float4 (saturate(sample * %d), 1.0);\n" + "}"; + +static const gchar templ_SAMPLE_PLANAR_4 = + "float4 sample_texture (float2 uv)\n" + "{\n" + " float4 sample;\n" + " sample.%c = shaderTexture0.Sample(samplerState, uv).x;\n" + " sample.%c = shaderTexture1.Sample(samplerState, uv).x;\n" + " sample.%c = shaderTexture2.Sample(samplerState, uv).x;\n" + " sample.%c = shaderTexture3.Sample(samplerState, uv).x;\n" + " return saturate(sample * %d);\n" + "}"; + +static const gchar templ_SAMPLE_PLANAR_CHROMA = + "float4 sample_texture (float2 uv)\n" + "{\n" + " float3 sample;\n" + " sample.x = 0.0;\n" + " sample.%c = shaderTexture1.Sample(samplerState, uv).x;\n" + " sample.%c = shaderTexture2.Sample(samplerState, uv).x;\n" + " return float4 (saturate(sample * %d), 1.0);\n" + "}"; + +static const gchar templ_SAMPLE_YUV_PACKED = + "float4 sample_texture (float2 uv)\n" + "{\n" + " float4 sample;\n" + " sample.xyz = shaderTexture0.Sample(samplerState, uv).%c%c%c;\n" + " sample.a = 1.0;\n" + " return sample;\n" + "}"; + +static const gchar templ_SAMPLE_GRAY = + "float4 sample_texture (float2 uv)\n" + "{\n" + " float4 sample;\n" + " sample.x = shaderTexture0.Sample(samplerState, uv).x;\n" + " sample.y = 0.5;\n" + " sample.z = 0.5;\n" + " sample.a = 1.0;\n" + " return sample;\n" + "}"; + +static const gchar templ_SAMPLE_GRAY_CHROMA = + "float4 sample_texture (float2 uv)\n" + "{\n" + " return float4 (0.0, 0.5, 0.5, 1.0);\n" + "}"; + +/* building output */ +static const gchar templ_OUTPUT_DEFAULT = + "PS_OUTPUT build_output (float4 sample)\n" + "{\n" + " PS_OUTPUT output;\n" + " output.Plane_0 = sample;\n" + " return output;\n" + "}"; + +static const gchar templ_OUTPUT_VUYA = + "PS_OUTPUT build_output (float4 sample)\n" + "{\n" + " PS_OUTPUT output;\n" + " float4 vuya;\n" + " vuya.%c%c%c = sample.xyz;\n" + " vuya.%c = sample.a;\n" + " output.Plane_0 = vuya;\n" + " return output;\n" + "}"; + +static const gchar templ_OUTPUT_LUMA = + "PS_OUTPUT build_output (float4 sample)\n" + "{\n" + " PS_OUTPUT output;\n" + " output.Plane_0 = float4 (sample.x, 0.0, 0.0, 1.0);\n" + " return output;\n" + "}"; + +static const gchar templ_OUTPUT_CHROMA_SEMI_PLANAR = + "PS_OUTPUT build_output (float4 sample)\n" + "{\n" + " PS_OUTPUT output;\n" + " output.Plane_0 = float4 (sample.%c%c, 0.0, 1.0);\n" + " return output;\n" + "}"; + +static const gchar templ_OUTPUT_LUMA_SCALED = + "PS_OUTPUT build_output (float4 sample)\n" + "{\n" + " PS_OUTPUT output;\n" + " output.Plane_0 = float4 (sample.x / %d, 0.0, 0.0, 1.0);\n" + " return output;\n" + "}"; + +static const gchar templ_OUTPUT_CHROMA_PLANAR = + "PS_OUTPUT build_output (float4 sample)\n" + "{\n" + " PS_OUTPUT output;\n" + " output.Plane_0 = float4 (sample.%c, 0.0, 0.0, 1.0);\n" + " output.Plane_1 = float4 (sample.%c, 0.0, 0.0, 1.0);\n" + " return output;\n" + "}"; + +static const gchar templ_OUTPUT_CHROMA_PLANAR_SCALED = + "PS_OUTPUT build_output (float4 sample)\n" + "{\n" + " PS_OUTPUT output;\n" + " output.Plane_0 = float4 (sample.%c / %d, 0.0, 0.0, 1.0);\n" + " output.Plane_1 = float4 (sample.%c / %d, 0.0, 0.0, 1.0);\n" + " return output;\n" + "}"; + +static const gchar templ_OUTPUT_PLANAR = + "PS_OUTPUT build_output (float4 sample)\n" + "{\n" + " PS_OUTPUT output;\n" + " output.Plane_0 = float4 (sample.%c, 0.0, 0.0, 1.0);\n" + " output.Plane_1 = float4 (sample.%c, 0.0, 0.0, 1.0);\n" + " output.Plane_2 = float4 (sample.%c, 0.0, 0.0, 1.0);\n" + " return output;\n" + "}"; + +static const gchar templ_OUTPUT_PLANAR_SCALED = + "PS_OUTPUT build_output (float4 sample)\n" + "{\n" + " PS_OUTPUT output;\n" + " float3 scaled = sample.xyz / %d;\n" + " output.Plane_0 = float4 (scaled.%c, 0.0, 0.0, 1.0);\n" + " output.Plane_1 = float4 (scaled.%c, 0.0, 0.0, 1.0);\n" + " output.Plane_2 = float4 (scaled.%c, 0.0, 0.0, 1.0);\n" + " return output;\n" + "}"; + +static const gchar templ_OUTPUT_PLANAR_4 = + "PS_OUTPUT build_output (float4 sample)\n" + "{\n" + " PS_OUTPUT output;\n" + " output.Plane_0 = float4 (sample.%c, 0.0, 0.0, 1.0);\n" + " output.Plane_1 = float4 (sample.%c, 0.0, 0.0, 1.0);\n" + " output.Plane_2 = float4 (sample.%c, 0.0, 0.0, 1.0);\n" + " output.Plane_3 = float4 (sample.%c, 0.0, 0.0, 1.0);\n" + " return output;\n" + "}"; + +static const gchar templ_OUTPUT_PLANAR_4_SCALED = + "PS_OUTPUT build_output (float4 sample)\n" + "{\n" + " PS_OUTPUT output;\n" + " float4 scaled = sample / %d;\n" + " output.Plane_0 = float4 (scaled.%c, 0.0, 0.0, 1.0);\n" + " output.Plane_1 = float4 (scaled.%c, 0.0, 0.0, 1.0);\n" + " output.Plane_2 = float4 (scaled.%c, 0.0, 0.0, 1.0);\n" + " output.Plane_3 = float4 (scaled.%c, 0.0, 0.0, 1.0);\n" + " return output;\n" + "}"; + +/* gamma and XYZ convert */ +static const gchar templ_GAMMA_DECODE_IDENTITY = + "float3 gamma_decode (float3 sample)\n" + "{\n" + " return sample;\n" + "}"; + +static const gchar templ_GAMMA_DECODE = + "float3 gamma_decode (float3 sample)\n" + "{\n" + " float3 dec;\n" + " dec.x = gammaDecLUT.Sample (samplerState, sample.x);\n" + " dec.y = gammaDecLUT.Sample (samplerState, sample.y);\n" + " dec.z = gammaDecLUT.Sample (samplerState, sample.z);\n" + " return dec;\n" + "}"; + +static const gchar templ_GAMMA_ENCODE_IDENTITY = + "float3 gamma_encode (float3 sample)\n" + "{\n" + " return sample;\n" + "}"; + +static const gchar templ_GAMMA_ENCODE = + "float3 gamma_encode (float3 sample)\n" + "{\n" + " float3 enc;\n" + " enc.x = gammaEncLUT.Sample (samplerState, sample.x);\n" + " enc.y = gammaEncLUT.Sample (samplerState, sample.y);\n" + " enc.z = gammaEncLUT.Sample (samplerState, sample.z);\n" + " return enc;\n" + "}"; + +static const gchar templ_XYZ_CONVERT_IDENTITY = + "float3 XYZ_convert (float3 sample)\n" + "{\n" + " return sample;\n" + "}"; + +static const gchar templ_XYZ_CONVERT = + "float3 XYZ_convert (float3 sample)\n" + "{\n" + " float3 out_space;\n" + " out_space.x = dot (primariesCoeff.CoeffX, sample);\n" + " out_space.y = dot (primariesCoeff.CoeffY, sample);\n" + " out_space.z = dot (primariesCoeff.CoeffZ, sample);\n" + " return saturate (out_space);\n" + "}"; + +static const gchar templ_pixel_shader = + "struct PSColorSpace\n" + "{\n" + " float3 CoeffX;\n" + " float3 CoeffY;\n" + " float3 CoeffZ;\n" + " float3 Offset;\n" + " float3 Min;\n" + " float3 Max;\n" + " float padding;\n" + "};\n" + "cbuffer PsConstBuffer : register(b0)\n" + "{\n" + /* RGB <-> YUV conversion */ + " PSColorSpace toRGBCoeff;\n" + " PSColorSpace toYUVCoeff;\n" + " PSColorSpace primariesCoeff;\n" + " float AlphaMul;\n" + "};\n" + "Texture2D shaderTexture4 : register(t0);\n" + "Texture1D<float> gammaDecLUT: register(t4);\n" + "Texture1D<float> gammaEncLUT: register(t5);\n" + "SamplerState samplerState : register(s0);\n" + "struct PS_INPUT\n" + "{\n" + " float4 Position: SV_POSITION;\n" + " float2 Texture: TEXCOORD;\n" + "};\n" + /* struct PS_OUTPUT */ + "%s\n" + /* sample_texture() function */ + "%s\n" + "float3 to_rgb (float3 sample, PSColorSpace coeff)\n" + "%s\n" + "float3 to_yuv (float3 sample, PSColorSpace coeff)\n" + "%s\n" + /* build_output() function */ + "%s\n" + /* gamma_decode() function */ + "%s\n" + /* gamma_encode() function */ + "%s\n" + /* XYZ_convert() function */ + "%s\n" + "PS_OUTPUT main(PS_INPUT input)\n" + "{\n" + " float4 sample;\n" + " sample = sample_texture (input.Texture);\n" + " sample.a = saturate (sample.a * AlphaMul);\n" + " sample.xyz = to_rgb (sample.xyz, toRGBCoeff);\n" + " sample.xyz = gamma_decode (sample.xyz);\n" + " sample.xyz = XYZ_convert (sample.xyz);\n" + " sample.xyz = gamma_encode (sample.xyz);\n" + " sample.xyz = to_yuv (sample.xyz, toYUVCoeff);\n" + " return build_output (sample);\n" + "}\n"; + +static const gchar templ_vertex_shader = + "struct VS_INPUT\n" + "{\n" + " float4 Position : POSITION;\n" + " float2 Texture : TEXCOORD;\n" + "};\n" + "\n" + "struct VS_OUTPUT\n" + "{\n" + " float4 Position: SV_POSITION;\n" + " float2 Texture: TEXCOORD;\n" + "};\n" + "\n" + "VS_OUTPUT main(VS_INPUT input)\n" + "{\n" + " return input;\n" + "}\n"; +/* *INDENT-ON* */ + +typedef struct +{ + const PSOutputType *ps_outputCONVERTER_MAX_QUADS; + gchar *sample_texture_funcCONVERTER_MAX_QUADS; + const gchar *to_rgb_funcCONVERTER_MAX_QUADS; + const gchar *to_yuv_funcCONVERTER_MAX_QUADS; + gchar *build_output_funcCONVERTER_MAX_QUADS; + const gchar *gamma_decode_func; + const gchar *gamma_encode_func; + const gchar *XYZ_convert_func; +} ConvertInfo; + +enum +{ + PROP_0, + PROP_SRC_X, + PROP_SRC_Y, + PROP_SRC_WIDTH, + PROP_SRC_HEIGHT, + PROP_DEST_X, + PROP_DEST_Y, + PROP_DEST_WIDTH, + PROP_DEST_HEIGHT, + PROP_ALPHA, + PROP_BLEND_STATE, + PROP_BLEND_FACTOR_RED, + PROP_BLEND_FACTOR_GREEN, + PROP_BLEND_FACTOR_BLUE, + PROP_BLEND_FACTOR_ALPHA, + PROP_BLEND_SAMPLE_MASK, + PROP_FILL_BORDER, + PROP_BORDER_COLOR, + PROP_SRC_MASTERING_DISPLAY_INFO, + PROP_SRC_CONTENT_LIGHT_LEVEL, + PROP_DEST_MASTERING_DISPLAY_INFO, + PROP_DEST_CONTENT_LIGHT_LEVEL, + PROP_VIDEO_DIRECTION, +}; + +struct _GstD3D11ConverterPrivate +{ + GstVideoInfo in_info; + GstVideoInfo out_info; + + GstD3D11Format in_d3d11_format; + GstD3D11Format out_d3d11_format; + + guint num_input_view; + guint num_output_view; + + GstD3D11ConverterBackend supported_backend; + + ID3D11Buffer *vertex_buffer; + ID3D11Buffer *index_buffer; + ID3D11Buffer *const_buffer; + ID3D11VertexShader *vs; + ID3D11InputLayout *layout; + ID3D11SamplerState *linear_sampler; + ID3D11PixelShader *psCONVERTER_MAX_QUADS; + D3D11_VIEWPORT viewportGST_VIDEO_MAX_PLANES; + + ID3D11Texture1D *gamma_dec_lut; + ID3D11Texture1D *gamma_enc_lut; + ID3D11ShaderResourceView *gamma_dec_srv; + ID3D11ShaderResourceView *gamma_enc_srv; + + D3D11_BLEND_DESC blend_desc; + ID3D11BlendState *blend; + + gboolean fast_path; + gboolean do_primaries; + + gint input_texture_width; + gint input_texture_height; + gboolean update_src_rect; + gboolean update_dest_rect; + gboolean update_alpha; + + ConvertInfo convert_info; + PSConstBuffer const_data; + + gboolean clear_background; + FLOAT clear_color44; + GstD3D11ColorMatrix clear_color_matrix; + + GstVideoConverter *unpack_convert; + + /* video processor */ + D3D11_VIDEO_COLOR background_color; + ID3D11VideoDevice *video_device; + ID3D11VideoContext2 *video_context2; + ID3D11VideoContext1 *video_context; + ID3D11VideoProcessorEnumerator1 *enumerator; + ID3D11VideoProcessor *processor; + D3D11_VIDEO_PROCESSOR_CAPS processor_caps; + RECT src_rect; + RECT dest_rect; + RECT dest_full_rect; + gboolean processor_in_use; + gboolean processor_direction_not_supported; + gboolean enable_mirror; + gboolean flip_h; + gboolean flip_v; + gboolean enable_rotation; + D3D11_VIDEO_PROCESSOR_ROTATION rotation; + + /* HDR10 */ + gboolean have_in_hdr10; + gboolean have_out_hdr10; + gboolean in_hdr10_updated; + gboolean out_hdr10_updated; + DXGI_HDR_METADATA_HDR10 in_hdr10_meta; + DXGI_HDR_METADATA_HDR10 out_hdr10_meta; + gchar *in_mdcv_str; + gchar *out_mdcv_str; + gchar *in_cll_str; + gchar *out_cll_str; + + /* Fallback buffer and info, for shader */ + GstVideoInfo fallback_info; + GstBuffer *fallback_inbuf; + + /* Fallback buffer used for processor */ + GstVideoInfo piv_info; + GstBuffer *piv_inbuf; + + GstVideoOrientationMethod video_direction; + + SRWLOCK prop_lock; + + /* properties */ + gint src_x; + gint src_y; + gint src_width; + gint src_height; + gint dest_x; + gint dest_y; + gint dest_width; + gint dest_height; + gdouble alpha; + gfloat blend_factor4; + guint blend_sample_mask; + gboolean fill_border; + guint64 border_color; +}; + +static void gst_d3d11_converter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_d3d11_converter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_d3d11_converter_dispose (GObject * object); +static void gst_d3d11_converter_finalize (GObject * object); +static void +gst_d3d11_converter_calculate_border_color (GstD3D11Converter * self); + +#define gst_d3d11_converter_parent_class parent_class +G_DEFINE_TYPE_WITH_PRIVATE (GstD3D11Converter, gst_d3d11_converter, + GST_TYPE_OBJECT); + +static void +gst_d3d11_converter_class_init (GstD3D11ConverterClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GParamFlags param_flags = + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + object_class->set_property = gst_d3d11_converter_set_property; + object_class->get_property = gst_d3d11_converter_get_property; + object_class->dispose = gst_d3d11_converter_dispose; + object_class->finalize = gst_d3d11_converter_finalize; + + g_object_class_install_property (object_class, PROP_SRC_X, + g_param_spec_int ("src-x", "Src-X", + "Source x poisition to start conversion", G_MININT, G_MAXINT, 0, + param_flags)); + g_object_class_install_property (object_class, PROP_SRC_Y, + g_param_spec_int ("src-y", "Src-Y", + "Source y poisition to start conversion", G_MININT, G_MAXINT, 0, + param_flags)); + g_object_class_install_property (object_class, PROP_SRC_WIDTH, + g_param_spec_int ("src-width", "Src-Width", + "Source width to convert", 0, G_MAXINT, 0, param_flags)); + g_object_class_install_property (object_class, PROP_SRC_HEIGHT, + g_param_spec_int ("src-height", "Src-Height", + "Source height to convert", 0, G_MAXINT, 0, param_flags)); + g_object_class_install_property (object_class, PROP_DEST_X, + g_param_spec_int ("dest-x", "Dest-X", + "x poisition in the destination frame", G_MININT, G_MAXINT, 0, + param_flags)); + g_object_class_install_property (object_class, PROP_DEST_Y, + g_param_spec_int ("dest-y", "Dest-Y", + "y poisition in the destination frame", G_MININT, G_MAXINT, 0, + param_flags)); + g_object_class_install_property (object_class, PROP_DEST_WIDTH, + g_param_spec_int ("dest-width", "Dest-Width", + "Width in the destination frame", 0, G_MAXINT, 0, param_flags)); + g_object_class_install_property (object_class, PROP_DEST_HEIGHT, + g_param_spec_int ("dest-height", "Dest-Height", + "Height in the destination frame", 0, G_MAXINT, 0, param_flags)); + g_object_class_install_property (object_class, PROP_ALPHA, + g_param_spec_double ("alpha", "Alpha", + "The alpha color value to use", 0, 1.0, 1.0, param_flags)); + g_object_class_install_property (object_class, PROP_BLEND_STATE, + g_param_spec_pointer ("blend-state", "Blend State", + "ID3D11BlendState object to use", param_flags)); + g_object_class_install_property (object_class, PROP_BLEND_FACTOR_RED, + g_param_spec_float ("blend-factor-red", "Blend Factor Red", + "Blend factor for red component", 0, 1.0, 1.0, param_flags)); + g_object_class_install_property (object_class, PROP_BLEND_FACTOR_GREEN, + g_param_spec_float ("blend-factor-green", "Blend Factor Green", + "Blend factor for green component", 0, 1.0, 1.0, param_flags)); + g_object_class_install_property (object_class, PROP_BLEND_FACTOR_BLUE, + g_param_spec_float ("blend-factor-blue", "Blend Factor Blue", + "Blend factor for blue component", 0, 1.0, 1.0, param_flags)); + g_object_class_install_property (object_class, PROP_BLEND_FACTOR_ALPHA, + g_param_spec_float ("blend-factor-alpha", "Blend Factor Alpha", + "Blend factor for alpha component", 0, 1.0, 1.0, param_flags)); + g_object_class_install_property (object_class, PROP_BLEND_SAMPLE_MASK, + g_param_spec_uint ("blend-sample-mask", "Blend Sample Mask", + "Blend sample mask", 0, 0xffffffff, 0xffffffff, param_flags)); + g_object_class_install_property (object_class, PROP_FILL_BORDER, + g_param_spec_boolean ("fill-border", "Fill border", + "Fill border with \"border-color\" if destination rectangle does not " + "fill the complete destination image", FALSE, param_flags)); + g_object_class_install_property (object_class, PROP_BORDER_COLOR, + g_param_spec_uint64 ("border-color", "Border Color", + "ARGB representation of the border color to use", + 0, G_MAXUINT64, 0xffff000000000000, param_flags)); + g_object_class_install_property (object_class, + PROP_SRC_MASTERING_DISPLAY_INFO, + g_param_spec_string ("src-mastering-display-info", + "Src Mastering Display Info", + "String representation of GstVideoMasteringDisplayInfo for source", + nullptr, param_flags)); + g_object_class_install_property (object_class, PROP_SRC_CONTENT_LIGHT_LEVEL, + g_param_spec_string ("src-content-light-level", + "Src Content Light Level", + "String representation of GstVideoContentLightLevel for src", + nullptr, param_flags)); + g_object_class_install_property (object_class, + PROP_DEST_MASTERING_DISPLAY_INFO, + g_param_spec_string ("dest-mastering-display-info", + "Dest Mastering Display Info", + "String representation of GstVideoMasteringDisplayInfo for dest", + nullptr, param_flags)); + g_object_class_install_property (object_class, PROP_DEST_CONTENT_LIGHT_LEVEL, + g_param_spec_string ("dest-content-light-level", + "Src Content Light Level", + "String representation of GstVideoContentLightLevel for dest", + nullptr, param_flags)); + g_object_class_install_property (object_class, PROP_VIDEO_DIRECTION, + g_param_spec_enum ("video-direction", "Video Direction", + "Video direction", GST_TYPE_VIDEO_ORIENTATION_METHOD, + GST_VIDEO_ORIENTATION_IDENTITY, param_flags)); + + GST_DEBUG_CATEGORY_INIT (gst_d3d11_converter_debug, + "d3d11converter", 0, "d3d11converter"); +} + +static void +gst_d3d11_converter_init (GstD3D11Converter * self) +{ + self->priv = (GstD3D11ConverterPrivate *) + gst_d3d11_converter_get_instance_private (self); +} + +static void +gst_d3d11_converter_dispose (GObject * object) +{ + GstD3D11Converter *self = GST_D3D11_CONVERTER (object); + GstD3D11ConverterPrivate *priv = self->priv; + + GST_D3D11_CLEAR_COM (priv->vertex_buffer); + GST_D3D11_CLEAR_COM (priv->index_buffer); + GST_D3D11_CLEAR_COM (priv->const_buffer); + GST_D3D11_CLEAR_COM (priv->vs); + GST_D3D11_CLEAR_COM (priv->layout); + GST_D3D11_CLEAR_COM (priv->linear_sampler); + GST_D3D11_CLEAR_COM (priv->gamma_dec_lut); + GST_D3D11_CLEAR_COM (priv->gamma_dec_srv); + GST_D3D11_CLEAR_COM (priv->gamma_enc_lut); + GST_D3D11_CLEAR_COM (priv->gamma_enc_srv); + GST_D3D11_CLEAR_COM (priv->video_device); + GST_D3D11_CLEAR_COM (priv->video_context2); + GST_D3D11_CLEAR_COM (priv->video_context); + GST_D3D11_CLEAR_COM (priv->enumerator); + GST_D3D11_CLEAR_COM (priv->processor); + GST_D3D11_CLEAR_COM (priv->blend); + + for (guint i = 0; i < CONVERTER_MAX_QUADS; i++) + GST_D3D11_CLEAR_COM (priv->psi); + + gst_clear_buffer (&priv->fallback_inbuf); + gst_clear_buffer (&priv->piv_inbuf); + gst_clear_object (&self->device); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_d3d11_converter_finalize (GObject * object) +{ + GstD3D11Converter *self = GST_D3D11_CONVERTER (object); + GstD3D11ConverterPrivate *priv = self->priv; + + for (guint i = 0; i < CONVERTER_MAX_QUADS; i++) { + g_free (priv->convert_info.sample_texture_funci); + g_free (priv->convert_info.build_output_funci); + } + + g_free (priv->in_mdcv_str); + g_free (priv->out_mdcv_str); + g_free (priv->in_cll_str); + g_free (priv->out_cll_str); + + if (priv->unpack_convert) + gst_video_converter_free (priv->unpack_convert); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +update_src_rect (GstD3D11Converter * self, gint * old_val, + const GValue * new_val) +{ + GstD3D11ConverterPrivate *priv = self->priv; + gint tmp; + + tmp = g_value_get_int (new_val); + if (tmp != *old_val) { + priv->update_src_rect = TRUE; + *old_val = tmp; + } +} + +static void +update_dest_rect (GstD3D11Converter * self, gint * old_val, + const GValue * new_val) +{ + GstD3D11ConverterPrivate *priv = self->priv; + gint tmp; + + tmp = g_value_get_int (new_val); + if (tmp != *old_val) { + priv->update_dest_rect = TRUE; + *old_val = tmp; + } +} + +static void +update_alpha (GstD3D11Converter * self, gdouble * old_val, + const GValue * new_val) +{ + GstD3D11ConverterPrivate *priv = self->priv; + gdouble tmp; + + tmp = g_value_get_double (new_val); + if (tmp != *old_val) { + priv->update_alpha = TRUE; + *old_val = tmp; + } +} + +static void +gst_d3d11_converter_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstD3D11Converter *self = GST_D3D11_CONVERTER (object); + GstD3D11ConverterPrivate *priv = self->priv; + + GstD3D11SRWLockGuard (&priv->prop_lock); + switch (prop_id) { + case PROP_SRC_X: + update_src_rect (self, &priv->src_x, value); + break; + case PROP_SRC_Y: + update_src_rect (self, &priv->src_y, value); + break; + case PROP_SRC_WIDTH: + update_src_rect (self, &priv->src_width, value); + break; + case PROP_SRC_HEIGHT: + update_src_rect (self, &priv->src_height, value); + break; + case PROP_DEST_X: + update_dest_rect (self, &priv->dest_x, value); + break; + case PROP_DEST_Y: + update_dest_rect (self, &priv->dest_y, value); + break; + case PROP_DEST_WIDTH: + update_dest_rect (self, &priv->dest_width, value); + break; + case PROP_DEST_HEIGHT: + update_dest_rect (self, &priv->dest_height, value); + break; + case PROP_ALPHA: + update_alpha (self, &priv->alpha, value); + priv->const_data.alpha = priv->alpha; + break; + case PROP_BLEND_STATE:{ + ID3D11BlendState *blend = + (ID3D11BlendState *) g_value_get_pointer (value); + GST_D3D11_CLEAR_COM (priv->blend); + priv->blend = blend; + if (priv->blend) { + priv->blend->AddRef (); + priv->blend->GetDesc (&priv->blend_desc); + } + break; + } + case PROP_BLEND_FACTOR_RED: + priv->blend_factor0 = g_value_get_float (value); + break; + case PROP_BLEND_FACTOR_GREEN: + priv->blend_factor1 = g_value_get_float (value); + break; + case PROP_BLEND_FACTOR_BLUE: + priv->blend_factor2 = g_value_get_float (value); + break; + case PROP_BLEND_FACTOR_ALPHA: + priv->blend_factor3 = g_value_get_float (value); + break; + case PROP_BLEND_SAMPLE_MASK: + priv->blend_sample_mask = g_value_get_uint (value); + break; + case PROP_FILL_BORDER:{ + gboolean fill_border = g_value_get_boolean (value); + + if (fill_border != priv->fill_border) { + priv->update_dest_rect = TRUE; + priv->fill_border = fill_border; + } + break; + } + case PROP_BORDER_COLOR:{ + guint64 border_color = g_value_get_uint64 (value); + + if (border_color != priv->border_color) { + priv->border_color = border_color; + gst_d3d11_converter_calculate_border_color (self); + } + break; + } + case PROP_SRC_MASTERING_DISPLAY_INFO: + g_clear_pointer (&priv->in_mdcv_str, g_free); + priv->in_mdcv_str = g_value_dup_string (value); + priv->in_hdr10_updated = TRUE; + break; + case PROP_SRC_CONTENT_LIGHT_LEVEL: + g_clear_pointer (&priv->in_cll_str, g_free); + priv->in_cll_str = g_value_dup_string (value); + priv->in_hdr10_updated = TRUE; + break; + case PROP_DEST_MASTERING_DISPLAY_INFO: + g_clear_pointer (&priv->out_mdcv_str, g_free); + priv->out_mdcv_str = g_value_dup_string (value); + priv->out_hdr10_updated = TRUE; + break; + case PROP_DEST_CONTENT_LIGHT_LEVEL: + g_clear_pointer (&priv->out_cll_str, g_free); + priv->out_cll_str = g_value_dup_string (value); + priv->out_hdr10_updated = TRUE; + break; + case PROP_VIDEO_DIRECTION:{ + GstVideoOrientationMethod video_direction = + (GstVideoOrientationMethod) g_value_get_enum (value); + if (video_direction != priv->video_direction) { + priv->video_direction = video_direction; + priv->update_src_rect = TRUE; + } + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_d3d11_converter_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstD3D11Converter *self = GST_D3D11_CONVERTER (object); + GstD3D11ConverterPrivate *priv = self->priv; + + GstD3D11SRWLockGuard (&priv->prop_lock); + switch (prop_id) { + case PROP_SRC_X: + g_value_set_int (value, priv->src_x); + break; + case PROP_SRC_Y: + g_value_set_int (value, priv->src_y); + break; + case PROP_SRC_WIDTH: + g_value_set_int (value, priv->src_width); + break; + case PROP_SRC_HEIGHT: + g_value_set_int (value, priv->src_height); + break; + case PROP_DEST_X: + g_value_set_int (value, priv->dest_x); + break; + case PROP_DEST_Y: + g_value_set_int (value, priv->dest_y); + break; + case PROP_DEST_WIDTH: + g_value_set_int (value, priv->dest_width); + break; + case PROP_DEST_HEIGHT: + g_value_set_int (value, priv->dest_height); + break; + case PROP_ALPHA: + g_value_set_double (value, priv->alpha); + break; + case PROP_BLEND_STATE: + g_value_set_pointer (value, priv->blend); + break; + case PROP_BLEND_FACTOR_RED: + g_value_set_float (value, priv->blend_factor0); + break; + case PROP_BLEND_FACTOR_GREEN: + g_value_set_float (value, priv->blend_factor1); + break; + case PROP_BLEND_FACTOR_BLUE: + g_value_set_float (value, priv->blend_factor2); + break; + case PROP_BLEND_FACTOR_ALPHA: + g_value_set_float (value, priv->blend_factor3); + break; + case PROP_BLEND_SAMPLE_MASK: + g_value_set_uint (value, priv->blend_sample_mask); + break; + case PROP_FILL_BORDER: + g_value_set_boolean (value, priv->fill_border); + break; + case PROP_BORDER_COLOR: + g_value_set_uint64 (value, priv->border_color); + break; + case PROP_SRC_MASTERING_DISPLAY_INFO: + g_value_set_string (value, priv->in_mdcv_str); + break; + case PROP_SRC_CONTENT_LIGHT_LEVEL: + g_value_set_string (value, priv->in_cll_str); + break; + case PROP_DEST_MASTERING_DISPLAY_INFO: + g_value_set_string (value, priv->out_mdcv_str); + break; + case PROP_DEST_CONTENT_LIGHT_LEVEL: + g_value_set_string (value, priv->out_cll_str); + break; + case PROP_VIDEO_DIRECTION: + g_value_set_enum (value, priv->video_direction); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +get_packed_yuv_components (GstVideoFormat format, gchar * y, gchar * u, + gchar * v) +{ + switch (format) { + case GST_VIDEO_FORMAT_Y410: + *y = 'g'; + *u = 'r'; + *v = 'b'; + break; + default: + g_assert_not_reached (); + return FALSE; + } + + return TRUE; +} + +static void +get_planar_component (GstVideoFormat format, gchar * x, gchar * y, gchar * z, + gchar * w, guint * scale) +{ + switch (format) { + case GST_VIDEO_FORMAT_I420_10LE: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_GBR_10LE: + case GST_VIDEO_FORMAT_GBRA_10LE: + *scale = (1 << 6); + break; + case GST_VIDEO_FORMAT_I420_12LE: + case GST_VIDEO_FORMAT_I422_12LE: + case GST_VIDEO_FORMAT_Y444_12LE: + case GST_VIDEO_FORMAT_GBR_12LE: + case GST_VIDEO_FORMAT_GBRA_12LE: + *scale = (1 << 4); + break; + default: + *scale = 1; + break; + } + + switch (format) { + case GST_VIDEO_FORMAT_RGBP: + *x = 'x'; + *y = 'y'; + *z = 'z'; + break; + case GST_VIDEO_FORMAT_BGRP: + *x = 'z'; + *y = 'y'; + *z = 'x'; + break; + case GST_VIDEO_FORMAT_GBR: + case GST_VIDEO_FORMAT_GBR_10LE: + case GST_VIDEO_FORMAT_GBR_12LE: + *x = 'y'; + *y = 'z'; + *z = 'x'; + break; + case GST_VIDEO_FORMAT_GBRA: + case GST_VIDEO_FORMAT_GBRA_10LE: + case GST_VIDEO_FORMAT_GBRA_12LE: + *x = 'y'; + *y = 'z'; + *z = 'x'; + *w = 'w'; + break; + case GST_VIDEO_FORMAT_YV12: + *x = 'x'; + *y = 'z'; + *z = 'y'; + break; + default: + *x = 'x'; + *y = 'y'; + *z = 'z'; + break; + } +} + +static void +get_semi_planar_component (GstVideoFormat format, gchar * u, gchar * v, + gboolean is_sampling) +{ + if (format == GST_VIDEO_FORMAT_NV21) { + if (is_sampling) { + *u = 'y'; + *v = 'x'; + } else { + *u = 'z'; + *v = 'y'; + } + } else { + if (is_sampling) { + *u = 'x'; + *v = 'y'; + } else { + *u = 'y'; + *v = 'z'; + } + } +} + +static void +get_vuya_component (GstVideoFormat format, gchar * y, gchar * u, + gchar * v, gchar * a) +{ + switch (format) { + case GST_VIDEO_FORMAT_VUYA: + if (y) + *y = 'z'; + if (u) + *u = 'y'; + if (v) + *v = 'x'; + if (a) + *a = 'w'; + break; + case GST_VIDEO_FORMAT_AYUV: + case GST_VIDEO_FORMAT_AYUV64: + if (y) + *y = 'g'; + if (u) + *u = 'b'; + if (v) + *v = 'a'; + if (a) + *a = 'r'; + break; + default: + g_assert_not_reached (); + break; + } +} + +static gboolean +gst_d3d11_color_convert_setup_shader (GstD3D11Converter * self, + const GstVideoInfo * in_info, const GstVideoInfo * out_info) +{ + GstD3D11ConverterPrivate *priv = self->priv; + GstD3D11Device *device = self->device; + HRESULT hr; + D3D11_SAMPLER_DESC sampler_desc; + D3D11_INPUT_ELEMENT_DESC input_desc2; + D3D11_BUFFER_DESC buffer_desc; + D3D11_MAPPED_SUBRESOURCE map; + VertexData *vertex_data; + WORD *indices; + ID3D11Device *device_handle; + ID3D11DeviceContext *context_handle; + ConvertInfo *cinfo = &priv->convert_info; + ComPtr < ID3D11PixelShader > psCONVERTER_MAX_QUADS; + ComPtr < ID3D11VertexShader > vs; + ComPtr < ID3D11InputLayout > layout; + ComPtr < ID3D11SamplerState > linear_sampler; + ComPtr < ID3D11Buffer > const_buffer; + ComPtr < ID3D11Buffer > vertex_buffer; + ComPtr < ID3D11Buffer > index_buffer; + gint i; + + memset (&sampler_desc, 0, sizeof (sampler_desc)); + memset (input_desc, 0, sizeof (input_desc)); + memset (&buffer_desc, 0, sizeof (buffer_desc)); + + device_handle = gst_d3d11_device_get_device_handle (device); + context_handle = gst_d3d11_device_get_device_context_handle (device); + + /* bilinear filtering */ + sampler_desc.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT; + sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; + sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; + sampler_desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; + sampler_desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; + sampler_desc.MinLOD = 0; + sampler_desc.MaxLOD = D3D11_FLOAT32_MAX; + + hr = device_handle->CreateSamplerState (&sampler_desc, &linear_sampler); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, + "Couldn't create samplerState state, hr: 0x%x", (guint) hr); + return FALSE; + } + + for (i = 0; i < CONVERTER_MAX_QUADS; i++) { + gchar *shader_code = nullptr; + + if (cinfo->sample_texture_funci) { + g_assert (cinfo->ps_outputi != nullptr); + + shader_code = g_strdup_printf (templ_pixel_shader, + cinfo->ps_outputi->output_template, cinfo->sample_texture_funci, + cinfo->to_rgb_funci, cinfo->to_yuv_funci, + cinfo->build_output_funci, cinfo->gamma_decode_func, + cinfo->gamma_encode_func, cinfo->XYZ_convert_func); + + hr = gst_d3d11_create_pixel_shader_simple (device, + shader_code, "main", &psi); + g_free (shader_code); + if (!gst_d3d11_result (hr, device)) { + return FALSE; + } + } + } + + input_desc0.SemanticName = "POSITION"; + input_desc0.SemanticIndex = 0; + input_desc0.Format = DXGI_FORMAT_R32G32B32_FLOAT; + input_desc0.InputSlot = 0; + input_desc0.AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; + input_desc0.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + input_desc0.InstanceDataStepRate = 0; + + input_desc1.SemanticName = "TEXCOORD"; + input_desc1.SemanticIndex = 0; + input_desc1.Format = DXGI_FORMAT_R32G32_FLOAT; + input_desc1.InputSlot = 0; + input_desc1.AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; + input_desc1.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + input_desc1.InstanceDataStepRate = 0; + + hr = gst_d3d11_create_vertex_shader_simple (device, templ_vertex_shader, + "main", input_desc, G_N_ELEMENTS (input_desc), &vs, &layout); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Couldn't vertex pixel shader"); + return FALSE; + } + + /* const buffer */ + G_STATIC_ASSERT (sizeof (PSConstBuffer) % 16 == 0); + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (PSConstBuffer); + buffer_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &const_buffer); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, + "Couldn't create constant buffer, hr: 0x%x", (guint) hr); + return FALSE; + } + + /* setup vertext buffer and index buffer */ + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (VertexData) * 4; + buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &vertex_buffer); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, + "Couldn't create vertex buffer, hr: 0x%x", (guint) hr); + return FALSE; + } + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (WORD) * 6; + buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &index_buffer); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR ("Couldn't create index buffer, hr: 0x%x", (guint) hr); + return FALSE; + } + + GstD3D11DeviceLockGuard lk (device); + hr = context_handle->Map (const_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, + &map); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, + "Couldn't map constant buffer, hr: 0x%x", (guint) hr); + return FALSE; + } + + memcpy (map.pData, &priv->const_data, sizeof (PSConstBuffer)); + context_handle->Unmap (const_buffer.Get (), 0); + + hr = context_handle->Map (vertex_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, + &map); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Couldn't map vertex buffer, hr: 0x%x", (guint) hr); + return FALSE; + } + + vertex_data = (VertexData *) map.pData; + + hr = context_handle->Map (index_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, + &map); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Couldn't map index buffer, hr: 0x%x", (guint) hr); + context_handle->Unmap (vertex_buffer.Get (), 0); + return FALSE; + } + + indices = (WORD *) map.pData; + + /* bottom left */ + vertex_data0.position.x = -1.0f; + vertex_data0.position.y = -1.0f; + vertex_data0.position.z = 0.0f; + vertex_data0.texture.u = 0.0f; + vertex_data0.texture.v = 1.0f; + + /* top left */ + vertex_data1.position.x = -1.0f; + vertex_data1.position.y = 1.0f; + vertex_data1.position.z = 0.0f; + vertex_data1.texture.u = 0.0f; + vertex_data1.texture.v = 0.0f; + + /* top right */ + vertex_data2.position.x = 1.0f; + vertex_data2.position.y = 1.0f; + vertex_data2.position.z = 0.0f; + vertex_data2.texture.u = 1.0f; + vertex_data2.texture.v = 0.0f; + + /* bottom right */ + vertex_data3.position.x = 1.0f; + vertex_data3.position.y = -1.0f; + vertex_data3.position.z = 0.0f; + vertex_data3.texture.u = 1.0f; + vertex_data3.texture.v = 1.0f; + + /* clockwise indexing */ + indices0 = 0; /* bottom left */ + indices1 = 1; /* top left */ + indices2 = 2; /* top right */ + + indices3 = 3; /* bottom right */ + indices4 = 0; /* bottom left */ + indices5 = 2; /* top right */ + + context_handle->Unmap (vertex_buffer.Get (), 0); + context_handle->Unmap (index_buffer.Get (), 0); + + /* holds vertex buffer for crop rect update */ + priv->vertex_buffer = vertex_buffer.Detach (); + priv->index_buffer = index_buffer.Detach (); + priv->const_buffer = const_buffer.Detach (); + priv->vs = vs.Detach (); + priv->layout = layout.Detach (); + priv->linear_sampler = linear_sampler.Detach (); + priv->ps0 = ps0.Detach (); + if (ps1) + priv->ps1 = ps1.Detach (); + + priv->input_texture_width = GST_VIDEO_INFO_WIDTH (in_info); + priv->input_texture_height = GST_VIDEO_INFO_HEIGHT (in_info); + + priv->num_input_view = GST_VIDEO_INFO_N_PLANES (in_info); + priv->num_output_view = GST_VIDEO_INFO_N_PLANES (out_info); + + for (guint i = 0; i < GST_VIDEO_INFO_N_PLANES (out_info); i++) { + priv->viewporti.TopLeftX = 0; + priv->viewporti.TopLeftY = 0; + priv->viewporti.Width = GST_VIDEO_INFO_COMP_WIDTH (out_info, i); + priv->viewporti.Height = GST_VIDEO_INFO_COMP_HEIGHT (out_info, i); + priv->viewporti.MinDepth = 0.0f; + priv->viewporti.MaxDepth = 1.0f; + } + + return TRUE; +} + +static void +gst_d3d11_converter_apply_orientation (GstD3D11Converter * self, + VertexData * vertex_data, gfloat l, gfloat r, gfloat t, gfloat b) +{ + GstD3D11ConverterPrivate *priv = self->priv; + gfloat u4, v4; + + /* + * 1 (l, t) -- 2 (r, t) + * | | + * 0 (l, b) -- 3 (r, b) + */ + u0 = l; + u1 = l; + u2 = r; + u3 = r; + + v0 = b; + v1 = t; + v2 = t; + v3 = b; + + switch (priv->video_direction) { + case GST_VIDEO_ORIENTATION_IDENTITY: + case GST_VIDEO_ORIENTATION_AUTO: + case GST_VIDEO_ORIENTATION_CUSTOM: + default: + break; + case GST_VIDEO_ORIENTATION_90R: + /* + * 1 (l, t) -- 2 (r, t) 1 (l, b) -- 2 (l, t) + * | | -> | | + * 0 (l, b) -- 3 (r, b) 0 (r, b) -- 3 (r, t) + */ + u0 = r; + u1 = l; + u2 = l; + u3 = r; + + v0 = b; + v1 = b; + v2 = t; + v3 = t; + break; + case GST_VIDEO_ORIENTATION_180: + /* + * 1 (l, t) -- 2 (r, t) 1 (r, b) -- 2 (l, b) + * | | -> | | + * 0 (l, b) -- 3 (r, b) 0 (r, t) -- 3 (l, t) + */ + u0 = r; + u1 = r; + u2 = l; + u3 = l; + + v0 = t; + v1 = b; + v2 = b; + v3 = t; + break; + case GST_VIDEO_ORIENTATION_90L: + /* + * 1 (l, t) -- 2 (r, t) 1 (r, t) -- 2 (r, b) + * | | -> | | + * 0 (l, b) -- 3 (r, b) 0 (l, t) -- 3 (l, b) + */ + u0 = l; + u1 = r; + u2 = r; + u3 = l; + + v0 = t; + v1 = t; + v2 = b; + v3 = b; + break; + case GST_VIDEO_ORIENTATION_HORIZ: + /* + * 1 (l, t) -- 2 (r, t) 1 (r, t) -- 2 (l, t) + * | | -> | | + * 0 (l, b) -- 3 (r, b) 0 (r, b) -- 3 (l, b) + */ + u0 = r; + u1 = r; + u2 = l; + u3 = l; + + v0 = b; + v1 = t; + v2 = t; + v3 = b; + break; + case GST_VIDEO_ORIENTATION_VERT: + /* + * 1 (l, t) -- 2 (r, t) 1 (l, b) -- 2 (r, b) + * | | -> | | + * 0 (l, b) -- 3 (r, b) 0 (l, t) -- 3 (r, t) + */ + u0 = l; + u1 = l; + u2 = r; + u3 = r; + + v0 = t; + v1 = b; + v2 = b; + v3 = t; + break; + case GST_VIDEO_ORIENTATION_UL_LR: + /* + * 1 (l, t) -- 2 (r, t) 1 (l, t) -- 2 (l, b) + * | | -> | | + * 0 (l, b) -- 3 (r, b) 0 (r, t) -- 3 (r, b) + */ + u0 = r; + u1 = l; + u2 = l; + u3 = r; + + v0 = t; + v1 = t; + v2 = b; + v3 = b; + break; + case GST_VIDEO_ORIENTATION_UR_LL: + /* + * 1 (l, t) -- 2 (r, t) 1 (r, b) -- 2 (r, t) + * | | -> | | + * 0 (l, b) -- 3 (r, b) 0 (l, b) -- 3 (l, t) + */ + u0 = l; + u1 = r; + u2 = r; + u3 = l; + + v0 = b; + v1 = b; + v2 = t; + v3 = t; + break; + } + + for (guint i = 0; i < 4; i++) { + vertex_datai.texture.u = ui; + vertex_datai.texture.v = vi; + } +} + +static gboolean +gst_d3d11_converter_update_src_rect (GstD3D11Converter * self) +{ + GstD3D11ConverterPrivate *priv = self->priv; + D3D11_MAPPED_SUBRESOURCE map; + VertexData *vertex_data; + ID3D11DeviceContext *context_handle; + HRESULT hr; + FLOAT u0, u1, v0, v1, off_u, off_v; + gint texture_width = priv->input_texture_width; + gint texture_height = priv->input_texture_height; + + if (!priv->update_src_rect) + return TRUE; + + priv->update_src_rect = FALSE; + + priv->src_rect.left = priv->src_x; + priv->src_rect.top = priv->src_y; + priv->src_rect.right = priv->src_x + priv->src_width; + priv->src_rect.bottom = priv->src_y + priv->src_height; + + if ((priv->supported_backend & GST_D3D11_CONVERTER_BACKEND_VIDEO_PROCESSOR)) { + priv->processor_direction_not_supported = FALSE; + priv->enable_mirror = FALSE; + priv->flip_h = FALSE; + priv->flip_v = FALSE; + priv->enable_rotation = FALSE; + priv->rotation = D3D11_VIDEO_PROCESSOR_ROTATION_IDENTITY; + + /* filtering order is rotation -> mirror */ + switch (priv->video_direction) { + case GST_VIDEO_ORIENTATION_IDENTITY: + case GST_VIDEO_ORIENTATION_AUTO: + case GST_VIDEO_ORIENTATION_CUSTOM: + default: + break; + case GST_VIDEO_ORIENTATION_90R: + priv->enable_rotation = TRUE; + priv->rotation = D3D11_VIDEO_PROCESSOR_ROTATION_90; + break; + case GST_VIDEO_ORIENTATION_180: + priv->enable_rotation = TRUE; + priv->rotation = D3D11_VIDEO_PROCESSOR_ROTATION_180; + break; + case GST_VIDEO_ORIENTATION_90L: + priv->enable_rotation = TRUE; + priv->rotation = D3D11_VIDEO_PROCESSOR_ROTATION_270; + break; + case GST_VIDEO_ORIENTATION_HORIZ: + priv->enable_mirror = TRUE; + priv->flip_h = TRUE; + break; + case GST_VIDEO_ORIENTATION_VERT: + priv->enable_mirror = TRUE; + priv->flip_v = TRUE; + break; + case GST_VIDEO_ORIENTATION_UL_LR: + priv->enable_rotation = TRUE; + priv->rotation = D3D11_VIDEO_PROCESSOR_ROTATION_270; + priv->enable_mirror = TRUE; + priv->flip_v = TRUE; + break; + case GST_VIDEO_ORIENTATION_UR_LL: + priv->enable_rotation = TRUE; + priv->rotation = D3D11_VIDEO_PROCESSOR_ROTATION_90; + priv->enable_mirror = TRUE; + priv->flip_v = TRUE; + break; + } + + if (priv->enable_rotation && + (priv->processor_caps.FeatureCaps & FEATURE_CAPS_ROTATION) == 0) { + GST_WARNING_OBJECT (self, "Device does not support rotation"); + priv->processor_direction_not_supported = TRUE; + } + + if (priv->enable_mirror && + (priv->processor_caps.FeatureCaps & PROCESSOR_FEATURE_CAPS_MIRROR) == + 0) { + GST_WARNING_OBJECT (self, "Device does not support mirror"); + priv->processor_direction_not_supported = TRUE; + } + } + + if ((priv->supported_backend & GST_D3D11_CONVERTER_BACKEND_SHADER) == 0) + return TRUE; + + context_handle = gst_d3d11_device_get_device_context_handle (self->device); + + hr = context_handle->Map (priv->vertex_buffer, 0, D3D11_MAP_WRITE_DISCARD, + 0, &map); + + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Couldn't map vertex buffer, hr: 0x%x", (guint) hr); + return FALSE; + } + + GST_DEBUG_OBJECT (self, "Updating vertex buffer"); + + vertex_data = (VertexData *) map.pData; + /* + * (u0, v0) -- (u1, v0) + * | | + * (u0, v1) -- (u1, v1) + */ + off_u = 0.5f / texture_width; + off_v = 0.5f / texture_height; + + if (priv->src_x > 0) + u0 = (priv->src_x / (gfloat) texture_width) + off_u; + else + u0 = 0.0f; + + if ((priv->src_x + priv->src_width) != texture_width) + u1 = ((priv->src_x + priv->src_width) / (gfloat) texture_width) - off_u; + else + u1 = 1.0f; + + if (priv->src_y > 0) + v0 = (priv->src_y / (gfloat) texture_height) + off_v; + else + v0 = 0.0; + + if ((priv->src_y + priv->src_height) != texture_height) + v1 = ((priv->src_y + priv->src_height) / (gfloat) texture_height) - off_v; + else + v1 = 1.0f; + + /* bottom left */ + vertex_data0.position.x = -1.0f; + vertex_data0.position.y = -1.0f; + vertex_data0.position.z = 0.0f; + + /* top left */ + vertex_data1.position.x = -1.0f; + vertex_data1.position.y = 1.0f; + vertex_data1.position.z = 0.0f; + + /* top right */ + vertex_data2.position.x = 1.0f; + vertex_data2.position.y = 1.0f; + vertex_data2.position.z = 0.0f; + + /* bottom right */ + vertex_data3.position.x = 1.0f; + vertex_data3.position.y = -1.0f; + vertex_data3.position.z = 0.0f; + + gst_d3d11_converter_apply_orientation (self, vertex_data, u0, u1, v0, v1); + + context_handle->Unmap (priv->vertex_buffer, 0); + + return TRUE; +} + +static gboolean +gst_d3d11_converter_update_dest_rect (GstD3D11Converter * self) +{ + GstD3D11ConverterPrivate *priv = self->priv; + const GstVideoInfo *out_info = &priv->out_info; + + if (!priv->update_dest_rect) + return TRUE; + + priv->viewport0.TopLeftX = priv->dest_x; + priv->viewport0.TopLeftY = priv->dest_y; + priv->viewport0.Width = priv->dest_width; + priv->viewport0.Height = priv->dest_height; + + priv->dest_rect.left = priv->dest_x; + priv->dest_rect.top = priv->dest_y; + priv->dest_rect.right = priv->dest_x + priv->dest_width; + priv->dest_rect.bottom = priv->dest_y + priv->dest_height; + + GST_DEBUG_OBJECT (self, + "Update viewport, TopLeftX: %f, TopLeftY: %f, Width: %f, Height %f", + priv->viewport0.TopLeftX, priv->viewport0.TopLeftY, + priv->viewport0.Width, priv->viewport0.Height); + + if (priv->fill_border && (priv->dest_x != 0 || priv->dest_y != 0 || + priv->dest_width != out_info->width || + priv->dest_height != out_info->height)) { + GST_DEBUG_OBJECT (self, "Enable background color"); + priv->clear_background = TRUE; + } else { + GST_DEBUG_OBJECT (self, "Disable background color"); + priv->clear_background = FALSE; + } + + switch (GST_VIDEO_INFO_FORMAT (&priv->out_info)) { + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_NV21: + case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P012_LE: + case GST_VIDEO_FORMAT_P016_LE: + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_I420_10LE: + case GST_VIDEO_FORMAT_I420_12LE: + priv->viewport1.TopLeftX = priv->viewport0.TopLeftX / 2; + priv->viewport1.TopLeftY = priv->viewport0.TopLeftY / 2; + priv->viewport1.Width = priv->viewport0.Width / 2; + priv->viewport1.Height = priv->viewport0.Height / 2; + + for (guint i = 2; i < GST_VIDEO_INFO_N_PLANES (&priv->out_info); i++) + priv->viewporti = priv->viewport1; + + break; + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_I422_12LE: + priv->viewport1.TopLeftX = priv->viewport0.TopLeftX / 2; + priv->viewport1.TopLeftY = priv->viewport0.TopLeftY; + priv->viewport1.Width = priv->viewport0.Width / 2; + priv->viewport1.Height = priv->viewport0.Height; + + for (guint i = 2; i < GST_VIDEO_INFO_N_PLANES (&priv->out_info); i++) + priv->viewporti = priv->viewport1; + break; + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_Y444_12LE: + case GST_VIDEO_FORMAT_Y444_16LE: + case GST_VIDEO_FORMAT_RGBP: + case GST_VIDEO_FORMAT_BGRP: + case GST_VIDEO_FORMAT_GBR: + case GST_VIDEO_FORMAT_GBR_10LE: + case GST_VIDEO_FORMAT_GBR_12LE: + case GST_VIDEO_FORMAT_GBRA: + case GST_VIDEO_FORMAT_GBRA_10LE: + case GST_VIDEO_FORMAT_GBRA_12LE: + for (guint i = 1; i < GST_VIDEO_INFO_N_PLANES (&priv->out_info); i++) + priv->viewporti = priv->viewport0; + break; + default: + if (priv->num_output_view > 1) { + g_assert_not_reached (); + return FALSE; + } + break; + } + + priv->update_dest_rect = FALSE; + + return TRUE; +} + +static gboolean +gst_d3d11_converter_prepare_output (GstD3D11Converter * self, + const GstVideoInfo * info) +{ + GstD3D11ConverterPrivate *priv = self->priv; + GstVideoFormat format = GST_VIDEO_INFO_FORMAT (info); + ConvertInfo *cinfo = &priv->convert_info; + + switch (format) { + /* RGB */ + case GST_VIDEO_FORMAT_RGBA64_LE: + case GST_VIDEO_FORMAT_RGB10A2_LE: + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_RGBx: + cinfo->ps_output0 = &output_typesOUTPUT_SINGLE_PLANE; + cinfo->build_output_func0 = g_strdup (templ_OUTPUT_DEFAULT); + break; + /* VUYA */ + case GST_VIDEO_FORMAT_VUYA: + case GST_VIDEO_FORMAT_AYUV: + case GST_VIDEO_FORMAT_AYUV64:{ + gchar y, u, v, a; + + get_vuya_component (format, &y, &u, &v, &a); + cinfo->ps_output0 = &output_typesOUTPUT_SINGLE_PLANE; + cinfo->build_output_func0 = + g_strdup_printf (templ_OUTPUT_VUYA, y, u, v, a); + break; + } + /* semi-planar */ + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_NV21: + case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P012_LE: + case GST_VIDEO_FORMAT_P016_LE:{ + gchar u, v; + + get_semi_planar_component (format, &u, &v, FALSE); + cinfo->ps_output0 = &output_typesOUTPUT_SINGLE_PLANE; + cinfo->build_output_func0 = g_strdup (templ_OUTPUT_LUMA); + + cinfo->ps_output1 = &output_typesOUTPUT_SINGLE_PLANE; + cinfo->build_output_func1 = + g_strdup_printf (templ_OUTPUT_CHROMA_SEMI_PLANAR, u, v); + break; + } + /* planar */ + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_I420_10LE: + case GST_VIDEO_FORMAT_I420_12LE: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_I422_12LE:{ + gchar y, u, v, w; + guint scale; + + get_planar_component (format, &y, &u, &v, &w, &scale); + + cinfo->ps_output0 = &output_typesOUTPUT_SINGLE_PLANE; + cinfo->ps_output1 = &output_typesOUTPUT_TWO_PLANES; + + if (info->finfo->depth0 == 8) { + cinfo->build_output_func0 = g_strdup (templ_OUTPUT_LUMA); + cinfo->build_output_func1 = + g_strdup_printf (templ_OUTPUT_CHROMA_PLANAR, u, v); + } else { + cinfo->build_output_func0 = g_strdup_printf (templ_OUTPUT_LUMA_SCALED, + scale); + cinfo->build_output_func1 = + g_strdup_printf (templ_OUTPUT_CHROMA_PLANAR_SCALED, + u, scale, v, scale); + } + break; + } + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_Y444_12LE: + case GST_VIDEO_FORMAT_Y444_16LE: + case GST_VIDEO_FORMAT_RGBP: + case GST_VIDEO_FORMAT_BGRP: + case GST_VIDEO_FORMAT_GBR: + case GST_VIDEO_FORMAT_GBR_10LE: + case GST_VIDEO_FORMAT_GBR_12LE: + { + gchar x, y, z, w; + guint scale; + + get_planar_component (format, &x, &y, &z, &w, &scale); + + cinfo->ps_output0 = &output_typesOUTPUT_THREE_PLANES; + if (info->finfo->depth0 == 8) { + cinfo->build_output_func0 = g_strdup_printf (templ_OUTPUT_PLANAR, + x, y, z); + } else { + cinfo->build_output_func0 = + g_strdup_printf (templ_OUTPUT_PLANAR_SCALED, scale, x, y, z); + } + break; + } + case GST_VIDEO_FORMAT_GBRA: + case GST_VIDEO_FORMAT_GBRA_10LE: + case GST_VIDEO_FORMAT_GBRA_12LE: + { + gchar x, y, z, w; + guint scale; + + get_planar_component (format, &x, &y, &z, &w, &scale); + + cinfo->ps_output0 = &output_typesOUTPUT_FOUR_PLANES; + if (info->finfo->depth0 == 8) { + cinfo->build_output_func0 = g_strdup_printf (templ_OUTPUT_PLANAR_4, + x, y, z, w); + } else { + cinfo->build_output_func0 = + g_strdup_printf (templ_OUTPUT_PLANAR_4_SCALED, scale, x, y, z, w); + } + break; + } + case GST_VIDEO_FORMAT_GRAY8: + case GST_VIDEO_FORMAT_GRAY16_LE: + cinfo->ps_output0 = &output_typesOUTPUT_SINGLE_PLANE; + cinfo->build_output_func0 = g_strdup (templ_OUTPUT_LUMA); + break; + default: + g_assert_not_reached (); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_d3d11_converter_prepare_sample_texture (GstD3D11Converter * self, + const GstVideoInfo * in_info, const GstVideoInfo * out_info) +{ + GstD3D11ConverterPrivate *priv = self->priv; + GstVideoFormat format = GST_VIDEO_INFO_FORMAT (in_info); + gboolean out_rgb = GST_VIDEO_INFO_IS_RGB (out_info); + gboolean out_yuv = GST_VIDEO_INFO_IS_YUV (out_info); + gboolean out_gray = GST_VIDEO_INFO_IS_GRAY (out_info); + ConvertInfo *cinfo = &priv->convert_info; + + switch (format) { + /* RGB */ + case GST_VIDEO_FORMAT_RGBA64_LE: + case GST_VIDEO_FORMAT_RGB10A2_LE: + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_RGBx: + cinfo->sample_texture_func0 = g_strdup (templ_SAMPLE_DEFAULT); + if (cinfo->ps_output1) + cinfo->sample_texture_func1 = + g_strdup (cinfo->sample_texture_func0); + break; + /* VUYA */ + case GST_VIDEO_FORMAT_VUYA: + case GST_VIDEO_FORMAT_AYUV: + case GST_VIDEO_FORMAT_AYUV64:{ + gchar y, u, v, a; + + get_vuya_component (format, &y, &u, &v, &a); + cinfo->sample_texture_func0 = g_strdup_printf (templ_SAMPLE_VUYA, + y, u, v, a); + if (cinfo->ps_output1) { + cinfo->sample_texture_func1 = + g_strdup (cinfo->sample_texture_func0); + } + break; + } + /* semi-planar */ + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_NV21: + case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P012_LE: + case GST_VIDEO_FORMAT_P016_LE:{ + gchar u, v; + + get_semi_planar_component (format, &u, &v, TRUE); + if (out_rgb) { + cinfo->sample_texture_func0 = + g_strdup_printf (templ_SAMPLE_SEMI_PLANAR, u, v); + } else if (out_gray) { + cinfo->sample_texture_func0 = g_strdup (templ_SAMPLE_YUV_LUMA); + } else if (out_yuv) { + if (GST_VIDEO_INFO_N_PLANES (out_info) == 1 || + cinfo->ps_output0 == &output_typesOUTPUT_THREE_PLANES) { + /* YUV packed or Y444 */ + cinfo->sample_texture_func0 = + g_strdup_printf (templ_SAMPLE_SEMI_PLANAR, u, v); + } else { + if (priv->fast_path) { + cinfo->sample_texture_func0 = g_strdup (templ_SAMPLE_YUV_LUMA); + cinfo->sample_texture_func1 = + g_strdup_printf (templ_SAMPLE_SEMI_PLANAR_CHROMA, u, v); + } else { + cinfo->sample_texture_func0 = + g_strdup_printf (templ_SAMPLE_SEMI_PLANAR, u, v); + cinfo->sample_texture_func1 = + g_strdup (cinfo->sample_texture_func0); + } + } + } else { + g_assert_not_reached (); + return FALSE; + } + break; + } + /* planar */ + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_I420_10LE: + case GST_VIDEO_FORMAT_I420_12LE: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_I422_12LE: + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_Y444_12LE: + case GST_VIDEO_FORMAT_Y444_16LE: + { + gchar x, y, z, w; + guint scale; + + get_planar_component (format, &x, &y, &z, &w, &scale); + if (out_rgb) { + cinfo->sample_texture_func0 = g_strdup_printf (templ_SAMPLE_PLANAR, + x, y, z, scale); + } else if (out_gray) { + cinfo->sample_texture_func0 = + g_strdup_printf (templ_SAMPLE_YUV_LUMA_SCALED, scale); + } else if (out_yuv) { + if (GST_VIDEO_INFO_N_PLANES (out_info) == 1 || + cinfo->ps_output0 == &output_typesOUTPUT_THREE_PLANES) { + /* YUV packed or Y444 */ + cinfo->sample_texture_func0 = g_strdup_printf (templ_SAMPLE_PLANAR, + x, y, z, scale); + } else { + if (priv->fast_path) { + cinfo->sample_texture_func0 = + g_strdup_printf (templ_SAMPLE_YUV_LUMA_SCALED, scale); + cinfo->sample_texture_func1 = + g_strdup_printf (templ_SAMPLE_PLANAR_CHROMA, y, z, scale); + } else { + cinfo->sample_texture_func0 = + g_strdup_printf (templ_SAMPLE_PLANAR, x, y, z, scale); + cinfo->sample_texture_func1 = + g_strdup (cinfo->sample_texture_func0); + } + } + } else { + g_assert_not_reached (); + return FALSE; + } + break; + } + /* RGB planar */ + case GST_VIDEO_FORMAT_RGBP: + case GST_VIDEO_FORMAT_BGRP: + case GST_VIDEO_FORMAT_GBR: + case GST_VIDEO_FORMAT_GBR_10LE: + case GST_VIDEO_FORMAT_GBR_12LE: + case GST_VIDEO_FORMAT_GBRA: + case GST_VIDEO_FORMAT_GBRA_10LE: + case GST_VIDEO_FORMAT_GBRA_12LE: + { + gchar x, y, z, w; + guint scale; + + get_planar_component (format, &x, &y, &z, &w, &scale); + + if (GST_VIDEO_INFO_N_PLANES (in_info) == 4) { + cinfo->sample_texture_func0 = g_strdup_printf (templ_SAMPLE_PLANAR_4, + x, y, z, w, scale); + } else { + cinfo->sample_texture_func0 = g_strdup_printf (templ_SAMPLE_PLANAR, + x, y, z, scale); + } + + if (cinfo->ps_output1) { + cinfo->sample_texture_func1 = + g_strdup (cinfo->sample_texture_func0); + } + break; + } + /* yuv packed */ + case GST_VIDEO_FORMAT_Y410:{ + gchar y, u, v; + + get_packed_yuv_components (format, &y, &u, &v); + cinfo->sample_texture_func0 = g_strdup_printf (templ_SAMPLE_YUV_PACKED, + y, u, v); + if (cinfo->ps_output1) { + cinfo->sample_texture_func1 = + g_strdup (cinfo->sample_texture_func0); + } + break; + } + case GST_VIDEO_FORMAT_GRAY8: + case GST_VIDEO_FORMAT_GRAY16_LE: + cinfo->sample_texture_func0 = g_strdup (templ_SAMPLE_GRAY); + if (cinfo->ps_output1) + cinfo->sample_texture_func1 = g_strdup (templ_SAMPLE_GRAY_CHROMA); + break; + default: + g_assert_not_reached (); + return FALSE; + } + + return TRUE; +} + +static const gchar * +get_color_range_name (GstVideoColorRange range) +{ + switch (range) { + case GST_VIDEO_COLOR_RANGE_0_255: + return "FULL"; + case GST_VIDEO_COLOR_RANGE_16_235: + return "STUDIO"; + default: + break; + } + + return "UNKNOWN"; +} + +static void +convert_info_gray_to_yuv (const GstVideoInfo * gray, GstVideoInfo * yuv) +{ + GstVideoInfo tmp; + + if (GST_VIDEO_INFO_IS_YUV (gray)) { + *yuv = *gray; + return; + } + + if (gray->finfo->depth0 == 8) { + gst_video_info_set_format (&tmp, + GST_VIDEO_FORMAT_Y444, gray->width, gray->height); + } else { + gst_video_info_set_format (&tmp, + GST_VIDEO_FORMAT_Y444_16LE, gray->width, gray->height); + } + + tmp.colorimetry.range = gray->colorimetry.range; + if (tmp.colorimetry.range == GST_VIDEO_COLOR_RANGE_UNKNOWN) + tmp.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + + tmp.colorimetry.primaries = gray->colorimetry.primaries; + if (tmp.colorimetry.primaries == GST_VIDEO_COLOR_PRIMARIES_UNKNOWN) + tmp.colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709; + + tmp.colorimetry.transfer = gray->colorimetry.transfer; + if (tmp.colorimetry.transfer == GST_VIDEO_TRANSFER_UNKNOWN) + tmp.colorimetry.transfer = GST_VIDEO_TRANSFER_BT709; + + tmp.colorimetry.matrix = gray->colorimetry.matrix; + if (tmp.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_UNKNOWN) + tmp.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT709; + + *yuv = tmp; +} + +static void +convert_info_gray_to_rgb (const GstVideoInfo * gray, GstVideoInfo * rgb) +{ + GstVideoInfo tmp; + + if (GST_VIDEO_INFO_IS_RGB (gray)) { + *rgb = *gray; + return; + } + + if (gray->finfo->depth0 == 8) { + gst_video_info_set_format (&tmp, + GST_VIDEO_FORMAT_RGBA, gray->width, gray->height); + } else { + gst_video_info_set_format (&tmp, + GST_VIDEO_FORMAT_RGBA64_LE, gray->width, gray->height); + } + + tmp.colorimetry.range = gray->colorimetry.range; + if (tmp.colorimetry.range == GST_VIDEO_COLOR_RANGE_UNKNOWN) + tmp.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + + tmp.colorimetry.primaries = gray->colorimetry.primaries; + if (tmp.colorimetry.primaries == GST_VIDEO_COLOR_PRIMARIES_UNKNOWN) + tmp.colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709; + + tmp.colorimetry.transfer = gray->colorimetry.transfer; + if (tmp.colorimetry.transfer == GST_VIDEO_TRANSFER_UNKNOWN) + tmp.colorimetry.transfer = GST_VIDEO_TRANSFER_BT709; + + *rgb = tmp; +} + +static gboolean +gst_d3d11_converter_prepare_colorspace_fast (GstD3D11Converter * self, + const GstVideoInfo * in_info, const GstVideoInfo * out_info) +{ + GstD3D11ConverterPrivate *priv = self->priv; + const GstVideoColorimetry *in_color = &in_info->colorimetry; + const GstVideoColorimetry *out_color = &out_info->colorimetry; + ConvertInfo *cinfo = &priv->convert_info; + PSColorSpace *to_rgb_buf = &priv->const_data.to_rgb_buf; + PSColorSpace *to_yuv_buf = &priv->const_data.to_yuv_buf; + GstD3D11ColorMatrix to_rgb_matrix; + GstD3D11ColorMatrix to_yuv_matrix; + gchar *matrix_dump; + + memset (&to_rgb_matrix, 0, sizeof (GstD3D11ColorMatrix)); + memset (&to_yuv_matrix, 0, sizeof (GstD3D11ColorMatrix)); + + for (guint i = 0; i < 2; i++) { + cinfo->to_rgb_funci = templ_COLOR_SPACE_IDENTITY; + cinfo->to_yuv_funci = templ_COLOR_SPACE_IDENTITY; + } + + cinfo->gamma_decode_func = templ_GAMMA_DECODE_IDENTITY; + cinfo->gamma_encode_func = templ_GAMMA_ENCODE_IDENTITY; + cinfo->XYZ_convert_func = templ_XYZ_CONVERT_IDENTITY; + + if (GST_VIDEO_INFO_IS_RGB (in_info)) { + if (GST_VIDEO_INFO_IS_RGB (out_info)) { + if (in_color->range == out_color->range) { + GST_DEBUG_OBJECT (self, "RGB -> RGB without colorspace conversion"); + } else { + if (!gst_d3d11_color_range_adjust_matrix_unorm (in_info, out_info, + &to_rgb_matrix)) { + GST_ERROR_OBJECT (self, "Failed to get RGB range adjust matrix"); + return FALSE; + } + + matrix_dump = gst_d3d11_dump_color_matrix (&to_rgb_matrix); + GST_DEBUG_OBJECT (self, "RGB range adjust %s -> %s\n%s", + get_color_range_name (in_color->range), + get_color_range_name (out_color->range), matrix_dump); + g_free (matrix_dump); + + cinfo->to_rgb_func0 = templ_COLOR_SPACE_CONVERT; + } + } else { + GstVideoInfo yuv_info; + + convert_info_gray_to_yuv (out_info, &yuv_info); + + if (yuv_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_UNKNOWN || + yuv_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_RGB) { + GST_WARNING_OBJECT (self, "Invalid matrix is detected"); + yuv_info.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT709; + } + + if (!gst_d3d11_rgb_to_yuv_matrix_unorm (in_info, + &yuv_info, &to_yuv_matrix)) { + GST_ERROR_OBJECT (self, "Failed to get RGB -> YUV transform matrix"); + return FALSE; + } + + matrix_dump = gst_d3d11_dump_color_matrix (&to_yuv_matrix); + GST_DEBUG_OBJECT (self, "RGB -> YUV matrix:\n%s", matrix_dump); + g_free (matrix_dump); + + if (GST_VIDEO_INFO_IS_GRAY (out_info)) { + cinfo->to_yuv_func0 = templ_COLOR_SPACE_CONVERT_LUMA; + } else if (GST_VIDEO_INFO_N_PLANES (out_info) == 1 || + cinfo->ps_output0 == &output_typesOUTPUT_THREE_PLANES) { + /* YUV packed or Y444 */ + cinfo->to_yuv_func0 = templ_COLOR_SPACE_CONVERT; + } else { + cinfo->to_yuv_func0 = templ_COLOR_SPACE_CONVERT_LUMA; + cinfo->to_yuv_func1 = templ_COLOR_SPACE_CONVERT_CHROMA; + } + } + } else if (GST_VIDEO_INFO_IS_GRAY (in_info)) { + gboolean identity = TRUE; + GstD3D11ColorMatrix matrix; + + memset (&matrix, 0, sizeof (GstD3D11ColorMatrix)); + + if (in_color->range != out_color->range) { + GstVideoInfo in_tmp, out_tmp; + + if (GST_VIDEO_INFO_IS_RGB (out_info)) { + convert_info_gray_to_rgb (in_info, &in_tmp); + out_tmp = *out_info; + } else { + convert_info_gray_to_yuv (in_info, &in_tmp); + convert_info_gray_to_yuv (out_info, &out_tmp); + } + + identity = FALSE; + if (!gst_d3d11_color_range_adjust_matrix_unorm (&in_tmp, &out_tmp, + &matrix)) { + GST_ERROR_OBJECT (self, "Failed to get GRAY range adjust matrix"); + return FALSE; + } + + matrix_dump = gst_d3d11_dump_color_matrix (&matrix); + GST_DEBUG_OBJECT (self, "GRAY range adjust matrix:\n%s", matrix_dump); + g_free (matrix_dump); + } + + if (GST_VIDEO_INFO_IS_GRAY (out_info)) { + if (identity) { + GST_DEBUG_OBJECT (self, "GRAY to GRAY without range adjust"); + } else { + cinfo->to_yuv_func0 = templ_COLOR_SPACE_CONVERT_LUMA; + } + + to_yuv_matrix = matrix; + } else if (GST_VIDEO_INFO_IS_RGB (out_info)) { + if (identity) { + GST_DEBUG_OBJECT (self, "GRAY to RGB without range adjust"); + cinfo->to_rgb_func0 = templ_COLOR_SPACE_GRAY_TO_RGB; + } else { + cinfo->to_rgb_func0 = templ_COLOR_SPACE_GRAY_TO_RGB_RANGE_ADJUST; + } + + to_rgb_matrix = matrix; + } else if (GST_VIDEO_INFO_IS_YUV (out_info)) { + if (identity) { + GST_DEBUG_OBJECT (self, "GRAY to YUV without range adjust"); + } else { + cinfo->to_yuv_func0 = templ_COLOR_SPACE_CONVERT_LUMA; + cinfo->to_yuv_func1 = templ_COLOR_SPACE_CONVERT_LUMA; + } + + to_yuv_matrix = matrix; + } else { + g_assert_not_reached (); + return FALSE; + } + } else if (GST_VIDEO_INFO_IS_YUV (in_info)) { + if (GST_VIDEO_INFO_IS_RGB (out_info)) { + GstVideoInfo yuv_info = *in_info; + + if (yuv_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_UNKNOWN || + yuv_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_RGB) { + GST_WARNING_OBJECT (self, "Invalid matrix is detected"); + yuv_info.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT709; + } + + if (!gst_d3d11_yuv_to_rgb_matrix_unorm (&yuv_info, + out_info, &to_rgb_matrix)) { + GST_ERROR_OBJECT (self, "Failed to get YUV -> RGB transform matrix"); + return FALSE; + } + + matrix_dump = gst_d3d11_dump_color_matrix (&to_rgb_matrix); + GST_DEBUG_OBJECT (self, "YUV -> RGB matrix:\n%s", matrix_dump); + g_free (matrix_dump); + + cinfo->to_rgb_func0 = templ_COLOR_SPACE_CONVERT; + } else if (in_color->range != out_color->range) { + if (!gst_d3d11_color_range_adjust_matrix_unorm (in_info, out_info, + &to_yuv_matrix)) { + GST_ERROR_OBJECT (self, "Failed to get GRAY range adjust matrix"); + return FALSE; + } + + matrix_dump = gst_d3d11_dump_color_matrix (&to_yuv_matrix); + GST_DEBUG_OBJECT (self, "YUV range adjust matrix:\n%s", matrix_dump); + g_free (matrix_dump); + + if (GST_VIDEO_INFO_IS_GRAY (out_info)) { + cinfo->to_yuv_func0 = templ_COLOR_SPACE_CONVERT_LUMA; + } else if (GST_VIDEO_INFO_N_PLANES (out_info) == 1 || + cinfo->ps_output0 == &output_typesOUTPUT_THREE_PLANES) { + /* YUV packed or Y444 */ + cinfo->to_yuv_func0 = templ_COLOR_SPACE_CONVERT; + } else { + cinfo->to_yuv_func0 = templ_COLOR_SPACE_CONVERT_LUMA; + cinfo->to_yuv_func1 = templ_COLOR_SPACE_CONVERT_CHROMA; + } + } + } else { + g_assert_not_reached (); + return FALSE; + } + + for (guint i = 0; i < 3; i++) { + to_rgb_buf->coeffXi = to_rgb_matrix.matrix0i; + to_rgb_buf->coeffYi = to_rgb_matrix.matrix1i; + to_rgb_buf->coeffZi = to_rgb_matrix.matrix2i; + to_rgb_buf->offseti = to_rgb_matrix.offseti; + to_rgb_buf->mini = to_rgb_matrix.mini; + to_rgb_buf->maxi = to_rgb_matrix.maxi; + + to_yuv_buf->coeffXi = to_yuv_matrix.matrix0i; + to_yuv_buf->coeffYi = to_yuv_matrix.matrix1i; + to_yuv_buf->coeffZi = to_yuv_matrix.matrix2i; + to_yuv_buf->offseti = to_yuv_matrix.offseti; + to_yuv_buf->mini = to_yuv_matrix.mini; + to_yuv_buf->maxi = to_yuv_matrix.maxi; + } + + return TRUE; +} + +static gboolean +gst_d3d11_converter_prepare_colorspace (GstD3D11Converter * self, + const GstVideoInfo * in_info, const GstVideoInfo * out_info) +{ + GstD3D11ConverterPrivate *priv = self->priv; + const GstVideoColorimetry *in_color = &in_info->colorimetry; + const GstVideoColorimetry *out_color = &out_info->colorimetry; + ConvertInfo *cinfo = &priv->convert_info; + PSColorSpace *to_rgb_buf = &priv->const_data.to_rgb_buf; + PSColorSpace *to_yuv_buf = &priv->const_data.to_yuv_buf; + PSColorSpace *XYZ_convert_buf = &priv->const_data.XYZ_convert_buf; + GstD3D11ColorMatrix to_rgb_matrix; + GstD3D11ColorMatrix to_yuv_matrix; + GstD3D11ColorMatrix XYZ_convert_matrix; + gchar *matrix_dump; + GstVideoInfo in_rgb_info = *in_info; + GstVideoInfo out_rgb_info = *out_info; + + g_assert (GST_VIDEO_INFO_IS_RGB (in_info) || GST_VIDEO_INFO_IS_YUV (in_info)); + g_assert (GST_VIDEO_INFO_IS_RGB (out_info) + || GST_VIDEO_INFO_IS_YUV (out_info)); + + memset (&to_rgb_matrix, 0, sizeof (GstD3D11ColorMatrix)); + memset (&to_yuv_matrix, 0, sizeof (GstD3D11ColorMatrix)); + memset (&XYZ_convert_matrix, 0, sizeof (GstD3D11ColorMatrix)); + + for (guint i = 0; i < 2; i++) { + cinfo->to_rgb_funci = templ_COLOR_SPACE_IDENTITY; + cinfo->to_yuv_funci = templ_COLOR_SPACE_IDENTITY; + } + + cinfo->XYZ_convert_func = templ_XYZ_CONVERT_IDENTITY; + cinfo->gamma_decode_func = templ_GAMMA_DECODE; + cinfo->gamma_encode_func = templ_GAMMA_ENCODE; + + /* 1) convert input to 0..255 range RGB */ + if (GST_VIDEO_INFO_IS_RGB (in_info) && + in_color->range == GST_VIDEO_COLOR_RANGE_16_235) { + in_rgb_info.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + + if (!gst_d3d11_color_range_adjust_matrix_unorm (in_info, &in_rgb_info, + &to_rgb_matrix)) { + GST_ERROR_OBJECT (self, "Failed to get RGB range adjust matrix"); + return FALSE; + } + + matrix_dump = gst_d3d11_dump_color_matrix (&to_rgb_matrix); + GST_DEBUG_OBJECT (self, "Input RGB range adjust matrix\n%s", matrix_dump); + g_free (matrix_dump); + + cinfo->to_rgb_func0 = cinfo->to_rgb_func1 = templ_COLOR_SPACE_CONVERT; + } else if (GST_VIDEO_INFO_IS_YUV (in_info)) { + GstVideoInfo yuv_info; + GstVideoFormat rgb_format; + + yuv_info = *in_info; + if (yuv_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_UNKNOWN || + yuv_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_RGB) { + GST_WARNING_OBJECT (self, "Invalid matrix is detected"); + yuv_info.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT709; + } + + if (in_info->finfo->depth0 == 8) { + rgb_format = GST_VIDEO_FORMAT_RGBA; + } else { + rgb_format = GST_VIDEO_FORMAT_RGBA64_LE; + } + + gst_video_info_set_format (&in_rgb_info, rgb_format, in_info->width, + in_info->height); + in_rgb_info.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + in_rgb_info.colorimetry.transfer = in_color->transfer; + in_rgb_info.colorimetry.primaries = in_color->primaries; + + if (!gst_d3d11_yuv_to_rgb_matrix_unorm (&yuv_info, &in_rgb_info, + &to_rgb_matrix)) { + GST_ERROR_OBJECT (self, "Failed to get YUV -> RGB transform matrix"); + return FALSE; + } + + matrix_dump = gst_d3d11_dump_color_matrix (&to_rgb_matrix); + GST_DEBUG_OBJECT (self, "YUV -> RGB matrix:\n%s", matrix_dump); + g_free (matrix_dump); + + cinfo->to_rgb_func0 = cinfo->to_rgb_func1 = templ_COLOR_SPACE_CONVERT; + } + + /* 2) convert gamma/XYZ converted 0..255 RGB to output format */ + if (GST_VIDEO_INFO_IS_RGB (out_info) && + out_color->range == GST_VIDEO_COLOR_RANGE_16_235) { + out_rgb_info.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + + if (!gst_d3d11_color_range_adjust_matrix_unorm (&out_rgb_info, out_info, + &to_yuv_matrix)) { + GST_ERROR_OBJECT (self, "Failed to get RGB range adjust matrix"); + return FALSE; + } + + matrix_dump = gst_d3d11_dump_color_matrix (&to_yuv_matrix); + GST_DEBUG_OBJECT (self, "Output RGB range adjust matrix\n%s", matrix_dump); + g_free (matrix_dump); + + cinfo->to_yuv_func0 = cinfo->to_yuv_func1 = templ_COLOR_SPACE_CONVERT; + } else if (GST_VIDEO_INFO_IS_YUV (out_info)) { + GstVideoInfo yuv_info; + + yuv_info = *out_info; + if (yuv_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_UNKNOWN || + yuv_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_RGB) { + GST_WARNING_OBJECT (self, "Invalid matrix is detected"); + yuv_info.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT709; + } + + gst_video_info_set_format (&out_rgb_info, + GST_VIDEO_INFO_FORMAT (&in_rgb_info), out_info->width, + out_info->height); + out_rgb_info.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + out_rgb_info.colorimetry.transfer = out_color->transfer; + out_rgb_info.colorimetry.primaries = out_color->primaries; + + if (!gst_d3d11_rgb_to_yuv_matrix_unorm (&out_rgb_info, + &yuv_info, &to_yuv_matrix)) { + GST_ERROR_OBJECT (self, "Failed to get RGB -> YUV transform matrix"); + return FALSE; + } + + matrix_dump = gst_d3d11_dump_color_matrix (&to_yuv_matrix); + GST_DEBUG_OBJECT (self, "RGB -> YUV matrix:\n%s", matrix_dump); + g_free (matrix_dump); + + if (GST_VIDEO_INFO_N_PLANES (out_info) == 1 || + cinfo->ps_output0 == &output_typesOUTPUT_THREE_PLANES) { + /* YUV packed or Y444 */ + cinfo->to_yuv_func0 = templ_COLOR_SPACE_CONVERT; + } else { + cinfo->to_yuv_func0 = templ_COLOR_SPACE_CONVERT_LUMA; + cinfo->to_yuv_func1 = templ_COLOR_SPACE_CONVERT_CHROMA; + } + } + + /* TODO: handle HDR mastring display info */ + if (priv->do_primaries) { + const GstVideoColorPrimariesInfo *in_pinfo; + const GstVideoColorPrimariesInfo *out_pinfo; + + in_pinfo = gst_video_color_primaries_get_info (in_color->primaries); + out_pinfo = gst_video_color_primaries_get_info (out_color->primaries); + + if (!gst_d3d11_color_primaries_matrix_unorm (in_pinfo, out_pinfo, + &XYZ_convert_matrix)) { + GST_ERROR_OBJECT (self, "Failed to get primaries conversion matrix"); + return FALSE; + } + + matrix_dump = gst_d3d11_dump_color_matrix (&XYZ_convert_matrix); + GST_DEBUG_OBJECT (self, "Primaries conversion matrix:\n%s", matrix_dump); + g_free (matrix_dump); + + cinfo->XYZ_convert_func = templ_XYZ_CONVERT; + } + + for (guint i = 0; i < 3; i++) { + to_rgb_buf->coeffXi = to_rgb_matrix.matrix0i; + to_rgb_buf->coeffYi = to_rgb_matrix.matrix1i; + to_rgb_buf->coeffZi = to_rgb_matrix.matrix2i; + to_rgb_buf->offseti = to_rgb_matrix.offseti; + to_rgb_buf->mini = to_rgb_matrix.mini; + to_rgb_buf->maxi = to_rgb_matrix.maxi; + + to_yuv_buf->coeffXi = to_yuv_matrix.matrix0i; + to_yuv_buf->coeffYi = to_yuv_matrix.matrix1i; + to_yuv_buf->coeffZi = to_yuv_matrix.matrix2i; + to_yuv_buf->offseti = to_yuv_matrix.offseti; + to_yuv_buf->mini = to_yuv_matrix.mini; + to_yuv_buf->maxi = to_yuv_matrix.maxi; + + XYZ_convert_buf->coeffXi = XYZ_convert_matrix.matrix0i; + XYZ_convert_buf->coeffYi = XYZ_convert_matrix.matrix1i; + XYZ_convert_buf->coeffZi = XYZ_convert_matrix.matrix2i; + XYZ_convert_buf->offseti = XYZ_convert_matrix.offseti; + XYZ_convert_buf->mini = XYZ_convert_matrix.mini; + XYZ_convert_buf->maxi = XYZ_convert_matrix.maxi; + } + + return TRUE; +} + +static gboolean +gst_d3d11_converter_setup_lut (GstD3D11Converter * self, + const GstVideoInfo * in_info, const GstVideoInfo * out_info) +{ + GstD3D11ConverterPrivate *priv = self->priv; + GstD3D11Device *device = self->device; + ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device); + D3D11_TEXTURE1D_DESC desc; + D3D11_SUBRESOURCE_DATA subresource; + D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc; + HRESULT hr; + ComPtr < ID3D11Texture1D > gamma_dec_lut; + ComPtr < ID3D11Texture1D > gamma_enc_lut; + ComPtr < ID3D11ShaderResourceView > gamma_dec_srv; + ComPtr < ID3D11ShaderResourceView > gamma_enc_srv; + guint16 gamma_dec_tableGAMMA_LUT_SIZE; + guint16 gamma_enc_tableGAMMA_LUT_SIZE; + GstVideoTransferFunction in_trc = in_info->colorimetry.transfer; + GstVideoTransferFunction out_trc = out_info->colorimetry.transfer; + gdouble scale = (gdouble) 1 / (GAMMA_LUT_SIZE - 1); + + memset (&desc, 0, sizeof (D3D11_TEXTURE1D_DESC)); + memset (&subresource, 0, sizeof (D3D11_SUBRESOURCE_DATA)); + memset (&srv_desc, 0, sizeof (D3D11_SHADER_RESOURCE_VIEW_DESC)); + + for (guint i = 0; i < GAMMA_LUT_SIZE; i++) { + gdouble val = gst_video_transfer_function_decode (in_trc, i * scale); + val = rint (val * 65535); + val = CLAMP (val, 0, 65535); + gamma_dec_tablei = (guint16) val; + + val = gst_video_transfer_function_encode (out_trc, i * scale); + val = rint (val * 65535); + val = CLAMP (val, 0, 65535); + gamma_enc_tablei = (guint16) val; + } + + desc.Width = GAMMA_LUT_SIZE; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R16_UNORM; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + + subresource.pSysMem = gamma_dec_table; + subresource.SysMemPitch = GAMMA_LUT_SIZE * sizeof (guint16); + + srv_desc.Format = DXGI_FORMAT_R16_UNORM; + srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D; + srv_desc.Texture1D.MipLevels = 1; + + hr = device_handle->CreateTexture1D (&desc, &subresource, &gamma_dec_lut); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Failed to create gamma decode LUT"); + return FALSE; + } + + hr = device_handle->CreateShaderResourceView (gamma_dec_lut.Get (), &srv_desc, + &gamma_dec_srv); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Failed to create gamma decode LUT SRV"); + return FALSE; + } + + subresource.pSysMem = gamma_enc_table; + hr = device_handle->CreateTexture1D (&desc, &subresource, &gamma_enc_lut); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Failed to create gamma encode LUT"); + return FALSE; + } + + hr = device_handle->CreateShaderResourceView (gamma_enc_lut.Get (), &srv_desc, + &gamma_enc_srv); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (device, "Failed to create gamma decode LUT SRV"); + return FALSE; + } + + priv->gamma_dec_lut = gamma_dec_lut.Detach (); + priv->gamma_enc_lut = gamma_enc_lut.Detach (); + priv->gamma_dec_srv = gamma_dec_srv.Detach (); + priv->gamma_enc_srv = gamma_enc_srv.Detach (); + + return TRUE; +} + +static void +gst_d3d11_converter_calculate_border_color (GstD3D11Converter * self) +{ + GstD3D11ConverterPrivate *priv = self->priv; + GstD3D11ColorMatrix *m = &priv->clear_color_matrix; + const GstVideoInfo *out_info = &priv->out_info; + gdouble a; + gdouble rgb3; + gdouble converted3; + GstVideoFormat format = GST_VIDEO_INFO_FORMAT (out_info); + + a = ((priv->border_color & 0xffff000000000000) >> 48) / (gdouble) G_MAXUINT16; + rgb0 = + ((priv->border_color & 0x0000ffff00000000) >> 32) / (gdouble) G_MAXUINT16; + rgb1 = + ((priv->border_color & 0x00000000ffff0000) >> 16) / (gdouble) G_MAXUINT16; + rgb2 = (priv->border_color & 0x000000000000ffff) / (gdouble) G_MAXUINT16; + + for (guint i = 0; i < 3; i++) { + convertedi = 0; + for (guint j = 0; j < 3; j++) { + convertedi += m->matrixij * rgbj; + } + convertedi += m->offseti; + convertedi = CLAMP (convertedi, m->mini, m->maxi); + } + + GST_DEBUG_OBJECT (self, "Calculated background color ARGB: %f, %f, %f, %f", + a, converted0, converted1, converted2); + + /* background color for video processor */ + priv->background_color.RGBA.R = converted0; + priv->background_color.RGBA.G = converted1; + priv->background_color.RGBA.B = converted2; + priv->background_color.RGBA.A = a; + + /* scale down if output is planar high bitdepth format */ + switch (format) { + case GST_VIDEO_FORMAT_I420_10LE: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_GBR_10LE: + case GST_VIDEO_FORMAT_GBRA_10LE: + for (guint i = 0; i < 3; i++) { + convertedi /= 64.0; + } + a /= 64.0; + break; + case GST_VIDEO_FORMAT_I420_12LE: + case GST_VIDEO_FORMAT_I422_12LE: + case GST_VIDEO_FORMAT_Y444_12LE: + case GST_VIDEO_FORMAT_GBR_12LE: + case GST_VIDEO_FORMAT_GBRA_12LE: + for (guint i = 0; i < 3; i++) { + convertedi /= 16.0; + } + a /= 16.0; + break; + default: + break; + } + + if ((GST_VIDEO_INFO_IS_RGB (out_info) && + GST_VIDEO_INFO_N_PLANES (out_info) == 1) || + GST_VIDEO_INFO_IS_GRAY (out_info)) { + for (guint i = 0; i < 3; i++) + priv->clear_color0i = convertedi; + priv->clear_color03 = a; + } else { + switch (format) { + case GST_VIDEO_FORMAT_VUYA: + priv->clear_color00 = converted2; + priv->clear_color01 = converted1; + priv->clear_color02 = converted0; + priv->clear_color03 = a; + break; + case GST_VIDEO_FORMAT_AYUV: + case GST_VIDEO_FORMAT_AYUV64: + priv->clear_color00 = a; + priv->clear_color01 = converted0; + priv->clear_color02 = converted1; + priv->clear_color03 = converted2; + break; + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_NV21: + case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P012_LE: + case GST_VIDEO_FORMAT_P016_LE: + priv->clear_color00 = converted0; + priv->clear_color01 = 0; + priv->clear_color02 = 0; + priv->clear_color03 = 1.0; + if (format == GST_VIDEO_FORMAT_NV21) { + priv->clear_color10 = converted2; + priv->clear_color11 = converted1; + } else { + priv->clear_color10 = converted1; + priv->clear_color11 = converted2; + } + priv->clear_color12 = 0; + priv->clear_color13 = 1.0; + break; + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_I420_10LE: + case GST_VIDEO_FORMAT_I420_12LE: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_I422_12LE: + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_Y444_12LE: + case GST_VIDEO_FORMAT_Y444_16LE: + priv->clear_color00 = converted0; + priv->clear_color01 = 0; + priv->clear_color02 = 0; + priv->clear_color03 = 1.0; + if (format == GST_VIDEO_FORMAT_YV12) { + priv->clear_color10 = converted2; + priv->clear_color20 = converted1; + } else { + priv->clear_color10 = converted1; + priv->clear_color20 = converted2; + } + priv->clear_color11 = 0; + priv->clear_color12 = 0; + priv->clear_color13 = 1.0; + priv->clear_color21 = 0; + priv->clear_color22 = 0; + priv->clear_color23 = 1.0; + break; + case GST_VIDEO_FORMAT_RGBP: + priv->clear_color00 = converted0; + priv->clear_color10 = converted1; + priv->clear_color20 = converted2; + break; + case GST_VIDEO_FORMAT_BGRP: + priv->clear_color00 = converted2; + priv->clear_color10 = converted1; + priv->clear_color20 = converted0; + break; + case GST_VIDEO_FORMAT_GBR: + case GST_VIDEO_FORMAT_GBR_10LE: + case GST_VIDEO_FORMAT_GBR_12LE: + priv->clear_color00 = converted1; + priv->clear_color10 = converted2; + priv->clear_color20 = converted0; + break; + case GST_VIDEO_FORMAT_GBRA: + case GST_VIDEO_FORMAT_GBRA_10LE: + case GST_VIDEO_FORMAT_GBRA_12LE: + priv->clear_color00 = converted1; + priv->clear_color10 = converted2; + priv->clear_color20 = converted0; + priv->clear_color30 = a; + break; + default: + g_assert_not_reached (); + break; + } + } +} + +static gboolean +gst_d3d11_converter_setup_processor (GstD3D11Converter * self) +{ + GstD3D11ConverterPrivate *priv = self->priv; + GstD3D11Device *device = self->device; + ID3D11VideoDevice *video_device; + ID3D11VideoContext *video_context; + HRESULT hr; + D3D11_VIDEO_PROCESSOR_CONTENT_DESC desc; + ComPtr < ID3D11VideoContext1 > video_context1; + ComPtr < ID3D11VideoContext2 > video_context2; + ComPtr < ID3D11VideoProcessorEnumerator > enumerator; + ComPtr < ID3D11VideoProcessorEnumerator1 > enumerator1; + ComPtr < ID3D11VideoProcessor > processor; + UINT support_flags; + BOOL conversion_supported = TRUE; + DXGI_COLOR_SPACE_TYPE in_space, out_space; + DXGI_FORMAT in_dxgi_format = priv->in_d3d11_format.dxgi_format; + DXGI_FORMAT out_dxgi_format = priv->out_d3d11_format.dxgi_format; + UINT in_format_flags = priv->in_d3d11_format.format_support0; + UINT out_format_flags = priv->out_d3d11_format.format_support0; + + if (GST_VIDEO_INFO_IS_GRAY (&priv->in_info) || + GST_VIDEO_INFO_IS_GRAY (&priv->out_info)) { + return FALSE; + } + + /* Not a native DXGI format */ + if (in_dxgi_format == DXGI_FORMAT_UNKNOWN || + out_dxgi_format == DXGI_FORMAT_UNKNOWN) { + return FALSE; + } + + /* cannot bind to processor in/out view */ + if ((in_format_flags & D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_INPUT) == 0 || + (out_format_flags & D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_OUTPUT) == 0) { + return FALSE; + } + + if (!gst_video_info_to_dxgi_color_space (&priv->in_info, &in_space)) { + GST_WARNING_OBJECT (self, "Unknown input DXGI colorspace"); + return FALSE; + } + + if (!gst_video_info_to_dxgi_color_space (&priv->out_info, &out_space)) { + GST_WARNING_OBJECT (self, "Unknown output DXGI colorspace"); + return FALSE; + } + + video_device = gst_d3d11_device_get_video_device_handle (self->device); + if (!video_device) { + GST_DEBUG_OBJECT (self, "video device interface is not available"); + return FALSE; + } + + video_context = gst_d3d11_device_get_video_context_handle (self->device); + if (!video_context) { + GST_DEBUG_OBJECT (self, "video context interface is not available"); + return FALSE; + } + + hr = video_context->QueryInterface (IID_PPV_ARGS (&video_context1)); + if (!gst_d3d11_result (hr, device)) { + GST_DEBUG_OBJECT (self, "ID3D11VideoContext1 interface is not available"); + return FALSE; + } + + memset (&desc, 0, sizeof (D3D11_VIDEO_PROCESSOR_CONTENT_DESC)); + + desc.InputFrameFormat = D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE; + desc.InputWidth = priv->in_info.width; + desc.InputHeight = priv->in_info.height; + desc.OutputWidth = priv->out_info.width; + desc.OutputHeight = priv->out_info.height; + /* TODO: make option for this */ + desc.Usage = D3D11_VIDEO_USAGE_PLAYBACK_NORMAL; + + hr = video_device->CreateVideoProcessorEnumerator (&desc, &enumerator); + if (!gst_d3d11_result (hr, device)) { + GST_WARNING_OBJECT (self, "Failed to create enumerator"); + return FALSE; + } + + hr = enumerator.As (&enumerator1); + if (!gst_d3d11_result (hr, device)) { + GST_WARNING_OBJECT (self, + "ID3D11VideoProcessorEnumerator1 interface is not available"); + return FALSE; + } + + support_flags = 0; + hr = enumerator1->CheckVideoProcessorFormat (in_dxgi_format, &support_flags); + if (!gst_d3d11_result (hr, device) || (support_flags & 0x1) == 0) { + GST_DEBUG_OBJECT (self, "Input format is not supported"); + return FALSE; + } + + support_flags = 0; + hr = enumerator1->CheckVideoProcessorFormat (out_dxgi_format, &support_flags); + if (!gst_d3d11_result (hr, device) || (support_flags & 0x2) == 0) { + GST_DEBUG_OBJECT (self, "Output format is not supported"); + return FALSE; + } + + hr = enumerator1->CheckVideoProcessorFormatConversion (in_dxgi_format, + in_space, out_dxgi_format, out_space, &conversion_supported); + if (!gst_d3d11_result (hr, device) || !conversion_supported) { + GST_DEBUG_OBJECT (self, "Conversion is not supported"); + return FALSE; + } + + hr = enumerator1->GetVideoProcessorCaps (&priv->processor_caps); + if (!gst_d3d11_result (hr, device)) { + GST_WARNING_OBJECT (self, "Failed to query processor caps"); + return FALSE; + } + + hr = video_device->CreateVideoProcessor (enumerator1.Get (), 0, &processor); + if (!gst_d3d11_result (hr, device)) { + GST_WARNING_OBJECT (self, "Failed to create processor"); + return FALSE; + } + + GstD3D11DeviceLockGuard lk (device); + /* We don't want auto processing by driver */ + video_context1->VideoProcessorSetStreamAutoProcessingMode + (processor.Get (), 0, FALSE); + video_context1->VideoProcessorSetStreamColorSpace1 (processor.Get (), + 0, in_space); + video_context1->VideoProcessorSetOutputColorSpace1 (processor.Get (), + out_space); + + priv->video_device = video_device; + video_device->AddRef (); + priv->processor = processor.Detach (); + hr = video_context1.As (&video_context2); + if (SUCCEEDED (hr)) + priv->video_context2 = video_context2.Detach (); + priv->video_context = video_context1.Detach (); + priv->enumerator = enumerator1.Detach (); + + priv->src_rect.left = 0; + priv->src_rect.top = 0; + priv->src_rect.right = priv->in_info.width; + priv->src_rect.bottom = priv->in_info.height; + + priv->dest_rect.left = 0; + priv->dest_rect.top = 0; + priv->dest_rect.right = priv->out_info.width; + priv->dest_rect.bottom = priv->out_info.height; + + priv->dest_full_rect = priv->dest_rect; + + return TRUE; +} + +/** + * gst_d3d11_converter_new: + * @device: a #GstD3D11Device + * @in_info: a #GstVideoInfo + * @out_info: a #GstVideoInfo + * @method: (inout) (optional) (nullable): a #GstD3D11ConverterMethod + + * Create a new converter object to convert between @in_info and @out_info + * with @method. When @method is not specified, converter will configure + * conversion path for all available method. Otherwise, converter will configure + * conversion path only for specified method(s) and set @method will be updated + * with supported method. + * + * Returns: (transfer full) (nullable): a #GstD3D11Converter or %NULL if conversion is not possible + * + * Since: 1.22 + */ +GstD3D11Converter * +gst_d3d11_converter_new (GstD3D11Device * device, const GstVideoInfo * in_info, + const GstVideoInfo * out_info, GstStructure * config) +{ + GstD3D11Converter *self; + GstD3D11ConverterPrivate *priv; + GstD3D11Format in_d3d11_format; + GstD3D11Format out_d3d11_format; + guint wanted_backend = 0; + gboolean allow_gamma = FALSE; + gboolean allow_primaries = FALSE; + gchar *backend_str; + + g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), nullptr); + g_return_val_if_fail (in_info != nullptr, nullptr); + g_return_val_if_fail (out_info != nullptr, nullptr); + + self = (GstD3D11Converter *) g_object_new (GST_TYPE_D3D11_CONVERTER, nullptr); + gst_object_ref_sink (self); + priv = self->priv; + + if (config) { + gint value; + gst_structure_get_flags (config, GST_D3D11_CONVERTER_OPT_BACKEND, + GST_TYPE_D3D11_CONVERTER_BACKEND, &wanted_backend); + + if (gst_structure_get_enum (config, GST_D3D11_CONVERTER_OPT_GAMMA_MODE, + GST_TYPE_VIDEO_GAMMA_MODE, &value) && + (GstVideoGammaMode) value != GST_VIDEO_GAMMA_MODE_NONE) { + allow_gamma = TRUE; + } + + if (gst_structure_get_enum (config, GST_D3D11_CONVERTER_OPT_PRIMARIES_MODE, + GST_TYPE_VIDEO_PRIMARIES_MODE, &value) && + (GstVideoPrimariesMode) value != GST_VIDEO_PRIMARIES_MODE_NONE) { + allow_primaries = TRUE; + } + + gst_structure_free (config); + } + + if (!wanted_backend) { + wanted_backend = + GST_D3D11_CONVERTER_BACKEND_SHADER | + GST_D3D11_CONVERTER_BACKEND_VIDEO_PROCESSOR; + } + + backend_str = g_flags_to_string (GST_TYPE_D3D11_CONVERTER_BACKEND, + wanted_backend); + + GST_DEBUG_OBJECT (self, + "Setup converter with format %s -> %s, wanted backend: %s, " + "allow gamma conversion: %d, allow primaries conversion: %d ", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info)), + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info)), + backend_str, allow_gamma, allow_primaries); + g_free (backend_str); + + if (!gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (in_info), + &in_d3d11_format)) { + GST_ERROR_OBJECT (self, "%s couldn't be converted to d3d11 format", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info))); + gst_object_unref (self); + + return nullptr; + } + + if (!gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (out_info), + &out_d3d11_format)) { + GST_ERROR_OBJECT (self, "%s couldn't be converted to d3d11 format", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info))); + gst_object_unref (self); + + return nullptr; + } + + self->device = (GstD3D11Device *) gst_object_ref (device); + priv->fast_path = TRUE; + priv->const_data.alpha = 1.0; + priv->in_info = *in_info; + priv->fallback_info = *in_info; + priv->piv_info = *in_info; + priv->out_info = *out_info; + priv->in_d3d11_format = in_d3d11_format; + priv->out_d3d11_format = out_d3d11_format; + + /* Init properties */ + priv->src_width = GST_VIDEO_INFO_WIDTH (in_info); + priv->src_height = GST_VIDEO_INFO_HEIGHT (in_info); + priv->dest_width = GST_VIDEO_INFO_WIDTH (out_info); + priv->dest_height = GST_VIDEO_INFO_HEIGHT (out_info); + priv->alpha = 1.0; + for (guint i = 0; i < G_N_ELEMENTS (priv->blend_factor); i++) + priv->blend_factori = 1.0; + priv->blend_sample_mask = 0xffffffff; + priv->border_color = 0xffff000000000000; + + if (GST_VIDEO_INFO_IS_RGB (out_info)) { + GstVideoInfo rgb_info = *out_info; + rgb_info.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + gst_d3d11_color_range_adjust_matrix_unorm (&rgb_info, out_info, + &priv->clear_color_matrix); + } else { + GstVideoInfo rgb_info; + GstVideoInfo yuv_info; + + gst_video_info_set_format (&rgb_info, GST_VIDEO_FORMAT_RGBA64_LE, + out_info->width, out_info->height); + convert_info_gray_to_yuv (out_info, &yuv_info); + + if (yuv_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_UNKNOWN || + yuv_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_RGB) { + GST_WARNING_OBJECT (self, "Invalid matrix is detected"); + yuv_info.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT709; + } + + gst_d3d11_rgb_to_yuv_matrix_unorm (&rgb_info, + &yuv_info, &priv->clear_color_matrix); + } + + gst_d3d11_converter_calculate_border_color (self); + + if ((wanted_backend & GST_D3D11_CONVERTER_BACKEND_VIDEO_PROCESSOR) != 0) { + if (gst_d3d11_converter_setup_processor (self)) { + GST_DEBUG_OBJECT (self, "Video processor is available"); + priv->supported_backend |= GST_D3D11_CONVERTER_BACKEND_VIDEO_PROCESSOR; + } + } + + if ((wanted_backend & GST_D3D11_CONVERTER_BACKEND_SHADER) == 0) + goto out; + + if (!GST_VIDEO_INFO_IS_GRAY (in_info) && !GST_VIDEO_INFO_IS_GRAY (out_info)) { + if (in_info->colorimetry.transfer != GST_VIDEO_TRANSFER_UNKNOWN && + out_info->colorimetry.transfer != GST_VIDEO_TRANSFER_UNKNOWN && + !gst_video_transfer_function_is_equivalent (in_info-> + colorimetry.transfer, GST_VIDEO_INFO_COMP_DEPTH (in_info, 0), + out_info->colorimetry.transfer, GST_VIDEO_INFO_COMP_DEPTH (out_info, + 0))) { + if (allow_gamma) { + GST_DEBUG_OBJECT (self, "Different transfer function %d -> %d", + in_info->colorimetry.transfer, out_info->colorimetry.transfer); + priv->fast_path = FALSE; + } else { + GST_DEBUG_OBJECT (self, + "Different transfer function %d -> %d but gamma remap is disabled", + in_info->colorimetry.transfer, out_info->colorimetry.transfer); + } + } + + if (in_info->colorimetry.primaries != GST_VIDEO_COLOR_PRIMARIES_UNKNOWN && + out_info->colorimetry.primaries != GST_VIDEO_COLOR_PRIMARIES_UNKNOWN && + !gst_video_color_primaries_is_equivalent (in_info-> + colorimetry.primaries, out_info->colorimetry.primaries)) { + if (allow_primaries) { + GST_DEBUG_OBJECT (self, "Different primaries %d -> %d", + in_info->colorimetry.primaries, out_info->colorimetry.primaries); + priv->fast_path = FALSE; + priv->do_primaries = TRUE; + } else { + GST_DEBUG_OBJECT (self, + "Different primaries %d -> %d but chromatic adaptation is disabled", + in_info->colorimetry.primaries, out_info->colorimetry.primaries); + } + } + } + + if (!gst_d3d11_converter_prepare_output (self, out_info)) + goto out; + + /* XXX: hard to make sampling of packed 4:2:2 format, use software + * converter to convert YUV2 to Y42B */ + if (GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_FORMAT_YUY2) { + GstVideoInfo tmp_info; + + gst_video_info_set_interlaced_format (&tmp_info, GST_VIDEO_FORMAT_Y42B, + GST_VIDEO_INFO_INTERLACE_MODE (in_info), + GST_VIDEO_INFO_WIDTH (in_info), GST_VIDEO_INFO_HEIGHT (in_info)); + tmp_info.chroma_site = in_info->chroma_site; + tmp_info.colorimetry = in_info->colorimetry; + tmp_info.fps_n = in_info->fps_n; + tmp_info.fps_d = in_info->fps_d; + tmp_info.par_n = in_info->par_n; + tmp_info.par_d = in_info->par_d; + + priv->unpack_convert = + gst_video_converter_new (in_info, &tmp_info, nullptr); + if (!priv->unpack_convert) { + GST_ERROR_OBJECT (self, "Couldn't create unpack convert"); + priv->supported_backend = (GstD3D11ConverterBackend) 0; + goto out; + } + + priv->fallback_info = tmp_info; + in_info = &priv->fallback_info; + } + + if (!gst_d3d11_converter_prepare_sample_texture (self, in_info, out_info)) + goto out; + + if (priv->fast_path) { + if (!gst_d3d11_converter_prepare_colorspace_fast (self, in_info, out_info)) + goto out; + } else { + if (!gst_d3d11_converter_prepare_colorspace (self, in_info, out_info)) + goto out; + + if (!gst_d3d11_converter_setup_lut (self, in_info, out_info)) + goto out; + } + + if (!gst_d3d11_color_convert_setup_shader (self, in_info, out_info)) + goto out; + + priv->supported_backend |= GST_D3D11_CONVERTER_BACKEND_SHADER; + +out: + if (priv->supported_backend == 0) { + GST_ERROR_OBJECT (self, "Conversion %s to %s not supported", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info)), + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info))); + gst_object_unref (self); + return nullptr; + } + + return self; +} + +static gboolean +gst_d3d11_converter_convert_internal (GstD3D11Converter * self, + ID3D11ShaderResourceView * srvGST_VIDEO_MAX_PLANES, + ID3D11RenderTargetView * rtvGST_VIDEO_MAX_PLANES) +{ + GstD3D11ConverterPrivate *priv; + ComPtr < ID3D11Resource > resource; + ComPtr < ID3D11Texture2D > texture; + D3D11_TEXTURE2D_DESC desc; + ConvertInfo *cinfo; + ID3D11DeviceContext *context; + UINT offsets = 0; + UINT vertex_stride = sizeof (VertexData); + ID3D11ShaderResourceView *clear_viewGST_VIDEO_MAX_PLANES = { nullptr, }; + + priv = self->priv; + cinfo = &priv->convert_info; + context = gst_d3d11_device_get_device_context_handle (self->device); + + /* check texture resolution and update crop area */ + srv0->GetResource (&resource); + resource.As (&texture); + texture->GetDesc (&desc); + + if (desc.Width != (guint) priv->input_texture_width || + desc.Height != (guint) priv->input_texture_height) { + GST_DEBUG_OBJECT (self, "Update vertext buffer, texture resolution: %dx%d", + desc.Width, desc.Height); + + priv->input_texture_width = desc.Width; + priv->input_texture_height = desc.Height; + priv->update_src_rect = TRUE; + + if (!gst_d3d11_converter_update_src_rect (self)) { + GST_ERROR_OBJECT (self, "Cannot update src rect"); + return FALSE; + } + } + + if (priv->update_alpha) { + D3D11_MAPPED_SUBRESOURCE map; + PSConstBuffer *const_buffer; + HRESULT hr; + + hr = context->Map (priv->const_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &map); + + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, + "Couldn't map constant buffer, hr: 0x%x", (guint) hr); + return FALSE; + } + + const_buffer = (PSConstBuffer *) map.pData; + memcpy (const_buffer, &priv->const_data, sizeof (PSConstBuffer)); + + context->Unmap (priv->const_buffer, 0); + priv->update_alpha = FALSE; + } + + if (priv->clear_background) { + for (guint i = 0; i < priv->num_output_view; i++) + context->ClearRenderTargetView (rtvi, priv->clear_colori); + } + + context->IASetPrimitiveTopology (D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + context->IASetInputLayout (priv->layout); + context->IASetVertexBuffers (0, 1, &priv->vertex_buffer, &vertex_stride, + &offsets); + context->IASetIndexBuffer (priv->index_buffer, DXGI_FORMAT_R16_UINT, 0); + context->PSSetSamplers (0, 1, &priv->linear_sampler); + context->VSSetShader (priv->vs, nullptr, 0); + context->PSSetConstantBuffers (0, 1, &priv->const_buffer); + context->PSSetShaderResources (0, priv->num_input_view, srv); + if (!priv->fast_path) { + ID3D11ShaderResourceView *gamma_srv2; + gamma_srv0 = priv->gamma_dec_srv; + gamma_srv1 = priv->gamma_enc_srv; + context->PSSetShaderResources (4, 2, gamma_srv); + } + + context->PSSetShader (priv->ps0, nullptr, 0); + context->RSSetViewports (cinfo->ps_output0->num_rtv, priv->viewport); + context->OMSetRenderTargets (cinfo->ps_output0->num_rtv, rtv, nullptr); + if (priv->blend) { + context->OMSetBlendState (priv->blend, + priv->blend_factor, priv->blend_sample_mask); + } else { + context->OMSetBlendState (nullptr, nullptr, 0xffffffff); + } + context->DrawIndexed (6, 0, 0); + + if (priv->ps1) { + guint view_offset = cinfo->ps_output0->num_rtv; + + context->PSSetShader (priv->ps1, nullptr, 0); + context->RSSetViewports (cinfo->ps_output1->num_rtv, + &priv->viewportview_offset); + context->OMSetRenderTargets (cinfo->ps_output1->num_rtv, + &rtvview_offset, nullptr); + context->DrawIndexed (6, 0, 0); + } + + context->PSSetShaderResources (0, 4, clear_view); + context->OMSetRenderTargets (0, nullptr, nullptr); + + return TRUE; +} + +static gboolean +gst_d3d11_converter_check_bind_flags_for_piv (guint bind_flags) +{ + static const guint flags = (D3D11_BIND_DECODER | + D3D11_BIND_VIDEO_ENCODER | D3D11_BIND_RENDER_TARGET | + D3D11_BIND_UNORDERED_ACCESS); + + if (bind_flags == 0) + return TRUE; + + if ((bind_flags & flags) != 0) + return TRUE; + + return FALSE; +} + +static gboolean +gst_d3d11_converter_is_d3d11_buffer (GstD3D11Converter * self, + GstBuffer * buffer) +{ + if (gst_buffer_n_memory (buffer) == 0) { + GST_WARNING_OBJECT (self, "Empty buffer"); + return FALSE; + } + + for (guint i = 0; i < gst_buffer_n_memory (buffer); i++) { + GstMemory *mem = gst_buffer_peek_memory (buffer, i); + GstD3D11Memory *dmem; + + if (!gst_is_d3d11_memory (mem)) { + GST_LOG_OBJECT (self, "Memory at %d is not d3d11 memory", i); + return FALSE; + } + + dmem = GST_D3D11_MEMORY_CAST (mem); + if (dmem->device != self->device) { + GST_LOG_OBJECT (self, "Memory at %d belongs to different device", i); + return FALSE; + } + } + + return TRUE; +} + +static gboolean +gst_d3d11_converter_create_fallback_buffer (GstD3D11Converter * self) +{ + GstD3D11ConverterPrivate *priv = self->priv; + GstD3D11AllocationParams *params; + GstBufferPool *pool; + GstCaps *caps; + guint bind_flags = D3D11_BIND_SHADER_RESOURCE; + GstStructure *config; + + gst_clear_buffer (&priv->fallback_inbuf); + + params = gst_d3d11_allocation_params_new (self->device, &priv->fallback_info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, bind_flags, 0); + + caps = gst_video_info_to_caps (&priv->fallback_info); + pool = gst_d3d11_buffer_pool_new (self->device); + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_params (config, caps, priv->fallback_info.size, + 0, 0); + gst_buffer_pool_config_set_d3d11_allocation_params (config, params); + gst_caps_unref (caps); + gst_d3d11_allocation_params_free (params); + + if (!gst_buffer_pool_set_config (pool, config)) { + GST_ERROR_OBJECT (self, "Failed to set pool config"); + gst_object_unref (pool); + return FALSE; + } + + if (!gst_buffer_pool_set_active (pool, TRUE)) { + GST_ERROR_OBJECT (self, "Failed to set active"); + gst_object_unref (pool); + return FALSE; + } + + gst_buffer_pool_acquire_buffer (pool, &priv->fallback_inbuf, nullptr); + gst_buffer_pool_set_active (pool, FALSE); + gst_object_unref (pool); + + if (!priv->fallback_inbuf) { + GST_ERROR_OBJECT (self, "Failed to create fallback buffer"); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_d3d11_converter_upload_for_shader (GstD3D11Converter * self, + GstBuffer * in_buf) +{ + GstD3D11ConverterPrivate *priv = self->priv; + GstVideoFrame frame, fallback_frame; + GstVideoInfo *fallback_info = &priv->fallback_info; + gboolean ret = TRUE; + + if (!gst_video_frame_map (&frame, &priv->in_info, in_buf, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Failed to map input buffer"); + return FALSE; + } + + /* Probably cropped buffer */ + if (fallback_info->width != GST_VIDEO_FRAME_WIDTH (&frame) || + fallback_info->height != GST_VIDEO_FRAME_HEIGHT (&frame)) { + gst_clear_buffer (&priv->fallback_inbuf); + + if (GST_VIDEO_INFO_FORMAT (&priv->in_info) == GST_VIDEO_FORMAT_YUY2 && + priv->unpack_convert) { + gst_video_info_set_interlaced_format (fallback_info, + GST_VIDEO_FORMAT_Y42B, GST_VIDEO_INFO_INTERLACE_MODE (&frame.info), + GST_VIDEO_INFO_WIDTH (&frame.info), + GST_VIDEO_INFO_HEIGHT (&frame.info)); + fallback_info->chroma_site = frame.info.chroma_site; + fallback_info->colorimetry = frame.info.colorimetry; + fallback_info->fps_n = frame.info.fps_n; + fallback_info->fps_d = frame.info.fps_d; + fallback_info->par_n = frame.info.par_n; + fallback_info->par_d = frame.info.par_d; + + if (priv->unpack_convert) + gst_video_converter_free (priv->unpack_convert); + + priv->unpack_convert = + gst_video_converter_new (&frame.info, fallback_info, nullptr); + + g_assert (priv->unpack_convert); + } else { + *fallback_info = frame.info; + } + } + + if (!priv->fallback_inbuf && + !gst_d3d11_converter_create_fallback_buffer (self)) { + goto error; + } + + if (!gst_video_frame_map (&fallback_frame, + &priv->fallback_info, priv->fallback_inbuf, GST_MAP_WRITE)) { + GST_ERROR_OBJECT (self, "Couldn't map fallback buffer"); + goto error; + } + + if (priv->unpack_convert) { + gst_video_converter_frame (priv->unpack_convert, &frame, &fallback_frame); + } else { + ret = gst_video_frame_copy (&fallback_frame, &frame); + } + gst_video_frame_unmap (&fallback_frame); + gst_video_frame_unmap (&frame); + + return ret; + +error: + gst_video_frame_unmap (&frame); + return FALSE; +} + +static gboolean +gst_d3d11_converter_map_buffer (GstD3D11Converter * self, GstBuffer * buffer, + GstMapInfo infoGST_VIDEO_MAX_PLANES, GstMapFlags flags) +{ + GstMapFlags map_flags; + guint num_mapped = 0; + + map_flags = (GstMapFlags) (flags | GST_MAP_D3D11); + + for (num_mapped = 0; num_mapped < gst_buffer_n_memory (buffer); num_mapped++) { + GstMemory *mem = gst_buffer_peek_memory (buffer, num_mapped); + + if (!gst_memory_map (mem, &infonum_mapped, map_flags)) { + GST_WARNING_OBJECT (self, "Failed to map memory at %d", num_mapped); + goto error; + } + } + + return TRUE; + +error: + for (guint i = 0; i < num_mapped; i++) { + GstMemory *mem = gst_buffer_peek_memory (buffer, i); + gst_memory_unmap (mem, &infoi); + } + + return FALSE; +} + +static void +gst_d3d11_converter_unmap_buffer (GstD3D11Converter * self, GstBuffer * buffer, + GstMapInfo infoGST_VIDEO_MAX_PLANES) +{ + for (guint i = 0; i < gst_buffer_n_memory (buffer); i++) { + GstMemory *mem = gst_buffer_peek_memory (buffer, i); + + gst_memory_unmap (mem, &infoi); + } +} + +static guint +gst_d3d11_converter_get_srv (GstD3D11Converter * self, GstBuffer * buffer, + ID3D11ShaderResourceView * srvGST_VIDEO_MAX_PLANES) +{ + guint num_views = 0; + + for (guint i = 0; i < gst_buffer_n_memory (buffer); i++) { + GstD3D11Memory *mem = (GstD3D11Memory *) gst_buffer_peek_memory (buffer, i); + guint num_view_in_mem; + + num_view_in_mem = gst_d3d11_memory_get_shader_resource_view_size (mem); + if (!num_view_in_mem) + return 0; + + for (guint j = 0; j < num_view_in_mem; j++) { + if (num_views >= GST_VIDEO_MAX_PLANES) { + GST_ERROR_OBJECT (self, "Too many SRV"); + return 0; + } + + srvnum_views = gst_d3d11_memory_get_shader_resource_view (mem, j); + num_views++; + } + } + + return num_views; +} + +static guint +gst_d3d11_converter_get_rtv (GstD3D11Converter * self, GstBuffer * buffer, + ID3D11RenderTargetView * rtvGST_VIDEO_MAX_PLANES) +{ + guint num_views = 0; + + for (guint i = 0; i < gst_buffer_n_memory (buffer); i++) { + GstD3D11Memory *mem = (GstD3D11Memory *) gst_buffer_peek_memory (buffer, i); + guint num_view_in_mem; + + num_view_in_mem = gst_d3d11_memory_get_render_target_view_size (mem); + if (!num_view_in_mem) + return 0; + + for (guint j = 0; j < num_view_in_mem; j++) { + if (num_views >= GST_VIDEO_MAX_PLANES) { + GST_ERROR_OBJECT (self, "Too many SRV"); + return 0; + } + + rtvnum_views = gst_d3d11_memory_get_render_target_view (mem, j); + num_views++; + } + } + + return num_views; +} + +static gboolean +gst_d3d11_converter_ensure_fallback_inbuf (GstD3D11Converter * self, + GstBuffer * in_buf, GstMapInfo in_infoGST_VIDEO_MAX_PLANES) +{ + GstD3D11ConverterPrivate *priv = self->priv; + D3D11_TEXTURE2D_DESC descGST_VIDEO_MAX_PLANES; + gboolean same_size = TRUE; + ID3D11DeviceContext *context; + + for (guint i = 0; i < gst_buffer_n_memory (in_buf); i++) { + GstD3D11Memory *in_mem = + (GstD3D11Memory *) gst_buffer_peek_memory (in_buf, i); + + gst_d3d11_memory_get_texture_desc (in_mem, &desci); + + if (same_size && priv->fallback_inbuf) { + D3D11_TEXTURE2D_DESC prev_desc; + GstD3D11Memory *prev_mem = + (GstD3D11Memory *) gst_buffer_peek_memory (priv->fallback_inbuf, i); + + gst_d3d11_memory_get_texture_desc (prev_mem, &prev_desc); + + if (prev_desc.Width != desci.Width || + prev_desc.Height != desci.Height) { + same_size = FALSE; + } + } + } + + priv->fallback_info.width = desc0.Width; + priv->fallback_info.height = desc0.Height; + + if (priv->fallback_inbuf && !same_size) { + GST_DEBUG_OBJECT (self, + "Size of new buffer is different from previous fallback"); + gst_clear_buffer (&priv->fallback_inbuf); + } + + if (!priv->fallback_inbuf && + !gst_d3d11_converter_create_fallback_buffer (self)) { + return FALSE; + } + + context = gst_d3d11_device_get_device_context_handle (self->device); + for (guint i = 0; i < gst_buffer_n_memory (in_buf); i++) { + GstMemory *mem = gst_buffer_peek_memory (priv->fallback_inbuf, i); + GstD3D11Memory *dmem = GST_D3D11_MEMORY_CAST (mem); + GstMapInfo info; + ID3D11Resource *src_tex = (ID3D11Resource *) in_infoi.data; + guint src_subresource = GPOINTER_TO_UINT (in_infoi.user_data0); + ID3D11Resource *fallback_tex; + D3D11_TEXTURE2D_DESC fallback_desc; + D3D11_BOX src_box = { 0, }; + + if (!gst_memory_map (mem, &info, (GstMapFlags) + (GST_MAP_WRITE | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Couldn't map fallback memory"); + } + + fallback_tex = (ID3D11Resource *) info.data; + gst_d3d11_memory_get_texture_desc (dmem, &fallback_desc); + + src_box.left = 0; + src_box.top = 0; + src_box.front = 0; + src_box.back = 1; + src_box.right = MIN (fallback_desc.Width, desci.Width); + src_box.bottom = MIN (fallback_desc.Height, desci.Height); + + context->CopySubresourceRegion (fallback_tex, 0, 0, 0, 0, + src_tex, src_subresource, &src_box); + gst_memory_unmap (mem, &info); + } + + return TRUE; +} + +static void +gst_d3d11_converter_fill_hdr10_meta (const GstVideoMasteringDisplayInfo * mdcv, + const GstVideoContentLightLevel * cll, DXGI_HDR_METADATA_HDR10 * meta) +{ + meta->RedPrimary0 = mdcv->display_primaries0.x; + meta->RedPrimary1 = mdcv->display_primaries0.y; + meta->GreenPrimary0 = mdcv->display_primaries1.x; + meta->GreenPrimary1 = mdcv->display_primaries1.y; + meta->BluePrimary0 = mdcv->display_primaries2.x; + meta->BluePrimary1 = mdcv->display_primaries2.y; + meta->WhitePoint0 = mdcv->white_point.x; + meta->WhitePoint1 = mdcv->white_point.y; + meta->MaxMasteringLuminance = mdcv->max_display_mastering_luminance; + meta->MinMasteringLuminance = mdcv->min_display_mastering_luminance; + + meta->MaxContentLightLevel = cll->max_content_light_level; + meta->MaxFrameAverageLightLevel = cll->max_frame_average_light_level; +} + +/* called with prop lock */ +static void +gst_d3d11_converter_update_hdr10_meta (GstD3D11Converter * self) +{ + GstD3D11ConverterPrivate *priv = self->priv; + + if (priv->in_hdr10_updated) { + if (!priv->in_mdcv_str || !priv->in_cll_str) { + priv->have_in_hdr10 = FALSE; + } else { + GstVideoMasteringDisplayInfo mdcv; + GstVideoContentLightLevel cll; + + if (gst_video_mastering_display_info_from_string (&mdcv, + priv->in_mdcv_str) && + gst_video_content_light_level_from_string (&cll, priv->in_cll_str)) { + gst_d3d11_converter_fill_hdr10_meta (&mdcv, &cll, &priv->in_hdr10_meta); + priv->have_in_hdr10 = TRUE; + } else { + priv->have_in_hdr10 = FALSE; + } + } + + priv->in_hdr10_updated = FALSE; + } + + if (priv->out_hdr10_updated) { + if (!priv->in_mdcv_str || !priv->in_cll_str) { + priv->have_out_hdr10 = FALSE; + } else { + GstVideoMasteringDisplayInfo mdcv; + GstVideoContentLightLevel cll; + + if (gst_video_mastering_display_info_from_string (&mdcv, + priv->in_mdcv_str) && + gst_video_content_light_level_from_string (&cll, priv->in_cll_str)) { + gst_d3d11_converter_fill_hdr10_meta (&mdcv, &cll, &priv->in_hdr10_meta); + priv->have_out_hdr10 = TRUE; + } else { + priv->have_out_hdr10 = FALSE; + } + } + + priv->out_hdr10_updated = FALSE; + } +} + +static gboolean +gst_d3d11_converter_need_blend (GstD3D11Converter * self) +{ + GstD3D11ConverterPrivate *priv = self->priv; + + if (priv->blend && priv->blend_desc.RenderTarget0.BlendEnable) { + if (priv->alpha != 1.0) { + return TRUE; + } else if ((priv->blend_desc.RenderTarget0.SrcBlend == + D3D11_BLEND_BLEND_FACTOR + || priv->blend_desc.RenderTarget0.SrcBlend == + D3D11_BLEND_INV_BLEND_FACTOR) + && (priv->blend_factor0 != 1.0 || priv->blend_factor1 != 1.0 + || priv->blend_factor2 != 1.0 || priv->blend_factor3 != 1.0)) { + return TRUE; + } + } + + return FALSE; +} + +static gboolean +gst_d3d11_converter_processor_available (GstD3D11Converter * self) +{ + GstD3D11ConverterPrivate *priv = self->priv; + + if ((priv->supported_backend & + GST_D3D11_CONVERTER_BACKEND_VIDEO_PROCESSOR) == 0) + return FALSE; + + /* TODO: processor may be able to blend textures */ + if (gst_d3d11_converter_need_blend (self)) + return FALSE; + + /* flip/rotate is not supported by processor */ + if (priv->processor_direction_not_supported) + return FALSE; + + return TRUE; +} + +static gboolean +gst_d3d11_converter_piv_available (GstD3D11Converter * self, GstBuffer * in_buf) +{ + GstD3D11Memory *mem; + D3D11_TEXTURE2D_DESC desc; + + mem = (GstD3D11Memory *) gst_buffer_peek_memory (in_buf, 0); + gst_d3d11_memory_get_texture_desc (mem, &desc); + return gst_d3d11_converter_check_bind_flags_for_piv (desc.BindFlags); +} + +static gboolean +gst_d3d11_converter_create_piv_buffer (GstD3D11Converter * self) +{ + GstD3D11ConverterPrivate *priv = self->priv; + GstD3D11AllocationParams *params; + GstBufferPool *pool; + GstCaps *caps; + GstStructure *config; + + gst_clear_buffer (&priv->piv_inbuf); + + params = gst_d3d11_allocation_params_new (self->device, &priv->piv_info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, 0, 0); + + caps = gst_video_info_to_caps (&priv->piv_info); + pool = gst_d3d11_buffer_pool_new (self->device); + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_params (config, caps, priv->piv_info.size, 0, 0); + gst_buffer_pool_config_set_d3d11_allocation_params (config, params); + gst_caps_unref (caps); + gst_d3d11_allocation_params_free (params); + + if (!gst_buffer_pool_set_config (pool, config)) { + GST_ERROR_OBJECT (self, "Failed to set pool config"); + gst_object_unref (pool); + return FALSE; + } + + if (!gst_buffer_pool_set_active (pool, TRUE)) { + GST_ERROR_OBJECT (self, "Failed to set active"); + gst_object_unref (pool); + return FALSE; + } + + gst_buffer_pool_acquire_buffer (pool, &priv->piv_inbuf, nullptr); + gst_buffer_pool_set_active (pool, FALSE); + gst_object_unref (pool); + + if (!priv->piv_inbuf) { + GST_ERROR_OBJECT (self, "Failed to create PIV buffer"); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_d3d11_converter_upload_for_processor (GstD3D11Converter * self, + GstBuffer * in_buf) +{ + GstD3D11ConverterPrivate *priv = self->priv; + GstVideoFrame frame, fallback_frame; + GstVideoInfo *piv_info = &priv->piv_info; + gboolean ret = TRUE; + + if (!gst_video_frame_map (&frame, &priv->in_info, in_buf, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Failed to map input buffer"); + return FALSE; + } + + /* Probably cropped buffer */ + if (piv_info->width != GST_VIDEO_FRAME_WIDTH (&frame) || + piv_info->height != GST_VIDEO_FRAME_HEIGHT (&frame)) { + gst_clear_buffer (&priv->piv_inbuf); + + *piv_info = frame.info; + } + + if (!priv->piv_inbuf && !gst_d3d11_converter_create_piv_buffer (self)) { + goto error; + } + + if (!gst_video_frame_map (&fallback_frame, + &priv->piv_info, priv->piv_inbuf, GST_MAP_WRITE)) { + GST_ERROR_OBJECT (self, "Couldn't map fallback buffer"); + goto error; + } + + ret = gst_video_frame_copy (&fallback_frame, &frame); + gst_video_frame_unmap (&fallback_frame); + gst_video_frame_unmap (&frame); + + return ret; + +error: + gst_video_frame_unmap (&frame); + return FALSE; +} + +static gboolean +gst_d3d11_converter_do_processor_blt (GstD3D11Converter * self, + GstBuffer * in_buf, GstBuffer * out_buf) +{ + GstD3D11ConverterPrivate *priv = self->priv; + ID3D11VideoProcessorInputView *piv = nullptr; + ID3D11VideoProcessorOutputView *pov = nullptr; + ID3D11VideoContext1 *video_ctx = priv->video_context; + ID3D11VideoProcessor *proc = priv->processor; + D3D11_VIDEO_PROCESSOR_STREAM stream = { 0, }; + HRESULT hr; + GstMemory *in_mem, *out_mem; + GstD3D11Memory *in_dmem; + GstD3D11Memory *out_dmem; + GstMapInfo in_info, out_info; + gboolean ret = FALSE; + + g_assert (gst_buffer_n_memory (in_buf) == 1); + g_assert (gst_buffer_n_memory (out_buf) == 1); + + in_mem = gst_buffer_peek_memory (in_buf, 0); + out_mem = gst_buffer_peek_memory (out_buf, 0); + + if (!gst_memory_map (in_mem, &in_info, + (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Couldn't map input buffer"); + return FALSE; + } + + if (!gst_memory_map (out_mem, &out_info, + (GstMapFlags) (GST_MAP_WRITE | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Couldn't map output buffer"); + gst_memory_unmap (in_mem, &in_info); + return FALSE; + } + + in_dmem = GST_D3D11_MEMORY_CAST (in_mem); + out_dmem = GST_D3D11_MEMORY_CAST (out_mem); + + piv = gst_d3d11_memory_get_processor_input_view (in_dmem, + priv->video_device, priv->enumerator); + if (!piv) { + GST_ERROR_OBJECT (self, "PIV is unavailable"); + goto out; + } + + pov = gst_d3d11_memory_get_processor_output_view (out_dmem, + priv->video_device, priv->enumerator); + if (!pov) { + GST_ERROR_OBJECT (self, "POV is unavailable"); + goto out; + } + + video_ctx->VideoProcessorSetStreamSourceRect (proc, 0, TRUE, &priv->src_rect); + video_ctx->VideoProcessorSetStreamDestRect (proc, 0, TRUE, &priv->dest_rect); + + if (priv->clear_background) { + video_ctx->VideoProcessorSetOutputTargetRect (proc, + TRUE, &priv->dest_full_rect); + video_ctx->VideoProcessorSetOutputBackgroundColor (proc, + GST_VIDEO_INFO_IS_YUV (&priv->out_info), &priv->background_color); + } else { + video_ctx->VideoProcessorSetOutputTargetRect (proc, TRUE, &priv->dest_rect); + } + + if (priv->video_context2 && + (priv->processor_caps.FeatureCaps & FEATURE_CAPS_METADATA_HDR10) != 0) { + if (priv->have_in_hdr10) { + priv->video_context2->VideoProcessorSetStreamHDRMetaData (proc, 0, + DXGI_HDR_METADATA_TYPE_HDR10, sizeof (DXGI_HDR_METADATA_HDR10), + &priv->in_hdr10_meta); + } else { + priv->video_context2->VideoProcessorSetStreamHDRMetaData (proc, 0, + DXGI_HDR_METADATA_TYPE_NONE, 0, nullptr); + } + + if (priv->have_out_hdr10) { + priv->video_context2->VideoProcessorSetOutputHDRMetaData (proc, + DXGI_HDR_METADATA_TYPE_HDR10, sizeof (DXGI_HDR_METADATA_HDR10), + &priv->in_hdr10_meta); + } + } + + if ((priv->processor_caps.FeatureCaps & FEATURE_CAPS_ROTATION) != 0) { + video_ctx->VideoProcessorSetStreamRotation (proc, 0, + priv->enable_rotation, priv->rotation); + } + + if ((priv->processor_caps.FeatureCaps & PROCESSOR_FEATURE_CAPS_MIRROR) != 0) { + video_ctx->VideoProcessorSetStreamMirror (proc, 0, priv->enable_mirror, + priv->flip_h, priv->flip_v); + } + + stream.Enable = TRUE; + stream.pInputSurface = piv; + + GST_TRACE_OBJECT (self, "Converting using processor"); + + hr = video_ctx->VideoProcessorBlt (proc, pov, 0, 1, &stream); + ret = gst_d3d11_result (hr, self->device); + + priv->processor_in_use = ret; + +out: + gst_memory_unmap (out_mem, &out_info); + gst_memory_unmap (in_mem, &in_info); + + return ret; +} + +static gboolean +gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self, + GstBuffer * in_buf, GstBuffer * out_buf) +{ + GstD3D11ConverterPrivate *priv = self->priv; + ID3D11ShaderResourceView *srvGST_VIDEO_MAX_PLANES = { nullptr, }; + ID3D11RenderTargetView *rtvGST_VIDEO_MAX_PLANES = { nullptr, }; + GstD3D11Memory *in_dmem; + GstD3D11Memory *out_dmem; + GstMapInfo in_infoGST_VIDEO_MAX_PLANES; + GstMapInfo out_infoGST_VIDEO_MAX_PLANES; + D3D11_TEXTURE2D_DESC desc; + guint num_srv, num_rtv; + gboolean ret = FALSE; + gboolean in_d3d11; + + GstD3D11SRWLockGuard (&priv->prop_lock); + + /* Output buffer must be valid D3D11 buffer */ + if (!gst_d3d11_converter_is_d3d11_buffer (self, out_buf)) { + GST_ERROR_OBJECT (self, "Output is not d3d11 buffer"); + return FALSE; + } + + if (gst_buffer_n_memory (in_buf) == 0) { + GST_ERROR_OBJECT (self, "Empty input buffer"); + return FALSE; + } + + out_dmem = (GstD3D11Memory *) gst_buffer_peek_memory (out_buf, 0); + if (!gst_d3d11_memory_get_texture_desc (out_dmem, &desc)) { + GST_ERROR_OBJECT (self, "Failed to get output desc"); + return FALSE; + } + + if ((desc.BindFlags & D3D11_BIND_RENDER_TARGET) == 0) { + GST_ERROR_OBJECT (self, "Output is not bound to render target"); + return FALSE; + } + + gst_d3d11_converter_update_hdr10_meta (self); + /* Update in/out rect */ + if (!gst_d3d11_converter_update_dest_rect (self)) { + GST_ERROR_OBJECT (self, "Failed to update dest rect"); + return FALSE; + } + + if (!gst_d3d11_converter_update_src_rect (self)) { + GST_ERROR_OBJECT (self, "Failed to update src rect"); + return FALSE; + } + + in_d3d11 = gst_d3d11_converter_is_d3d11_buffer (self, in_buf); + if (gst_d3d11_converter_processor_available (self)) { + gboolean use_processor = FALSE; + gboolean piv_available = FALSE; + + if (in_d3d11) + piv_available = gst_d3d11_converter_piv_available (self, in_buf); + + if ((priv->supported_backend & GST_D3D11_CONVERTER_BACKEND_SHADER) != 0) { + /* processor only */ + use_processor = TRUE; + } else if (piv_available) { + in_dmem = (GstD3D11Memory *) gst_buffer_peek_memory (in_buf, 0); + + if (GST_VIDEO_INFO_FORMAT (&priv->in_info) == GST_VIDEO_FORMAT_YUY2) { + /* Always use processor for packed YUV */ + use_processor = TRUE; + } else if (!gst_d3d11_memory_get_shader_resource_view_size (in_dmem)) { + /* SRV is unavailable, use processor */ + use_processor = TRUE; + } else if (priv->video_context2 && + (priv->have_in_hdr10 || priv->have_out_hdr10)) { + /* HDR10 tonemap is needed */ + use_processor = TRUE; + } else if (priv->processor_in_use) { + use_processor = TRUE; + } + } + + if (use_processor) { + if (!piv_available) { + if (!gst_d3d11_converter_upload_for_processor (self, in_buf)) { + GST_ERROR_OBJECT (self, "Couldn't upload buffer"); + return FALSE; + } + + in_buf = priv->piv_inbuf; + } + + return gst_d3d11_converter_do_processor_blt (self, in_buf, out_buf); + } + } + + if ((priv->supported_backend & GST_D3D11_CONVERTER_BACKEND_SHADER) == 0) { + GST_ERROR_OBJECT (self, "Conversion is not supported"); + goto out; + } + + if (!in_d3d11 || + GST_VIDEO_INFO_FORMAT (&priv->in_info) == GST_VIDEO_FORMAT_YUY2) { + if (!gst_d3d11_converter_upload_for_shader (self, in_buf)) { + GST_ERROR_OBJECT (self, "Couldn't copy into fallback buffer"); + return FALSE; + } + + in_buf = priv->fallback_inbuf; + } + + if (!gst_d3d11_converter_map_buffer (self, in_buf, in_info, + (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Couldn't map input buffer"); + return FALSE; + } + + if (!gst_d3d11_converter_map_buffer (self, out_buf, out_info, + (GstMapFlags) (GST_MAP_WRITE | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Couldn't map output buffer"); + gst_d3d11_converter_unmap_buffer (self, in_buf, in_info); + return FALSE; + } + + num_rtv = gst_d3d11_converter_get_rtv (self, out_buf, rtv); + if (!num_rtv) { + GST_ERROR_OBJECT (self, "RTV is unavailable"); + goto out; + } + + num_srv = gst_d3d11_converter_get_srv (self, in_buf, srv); + if (!num_srv) { + if (in_buf == priv->fallback_inbuf) { + GST_ERROR_OBJECT (self, "Unable to get SRV from fallback buffer"); + goto out; + } else if (!gst_d3d11_converter_ensure_fallback_inbuf (self, + in_buf, in_info)) { + GST_ERROR_OBJECT (self, "Couldn't copy into fallback texture"); + goto out; + } + + gst_d3d11_converter_unmap_buffer (self, in_buf, in_info); + in_buf = priv->fallback_inbuf; + + if (!gst_d3d11_converter_map_buffer (self, + in_buf, in_info, (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Couldn't map fallback buffer"); + in_buf = nullptr; + goto out; + } + + num_srv = gst_d3d11_converter_get_srv (self, in_buf, srv); + if (!num_srv) { + GST_ERROR_OBJECT (self, "Couldn't get SRV from fallback input"); + goto out; + } + } + + GST_TRACE_OBJECT (self, "Converting using shader"); + + ret = gst_d3d11_converter_convert_internal (self, srv, rtv); + +out: + if (in_buf) + gst_d3d11_converter_unmap_buffer (self, in_buf, in_info); + gst_d3d11_converter_unmap_buffer (self, out_buf, out_info); + + return ret; +} + +/** + * gst_d3d11_converter_convert_buffer: + * @converter: a #GstD3D11Converter + * @in_buf: a #GstBuffer + * @out_buf: a #GstBuffer + * + * Converts @in_buf into @out_buf + * + * Returns: %TRUE if conversion is successful + * + * Since: 1.22 + */ +gboolean +gst_d3d11_converter_convert_buffer (GstD3D11Converter * converter, + GstBuffer * in_buf, GstBuffer * out_buf) +{ + g_return_val_if_fail (GST_IS_D3D11_CONVERTER (converter), FALSE); + g_return_val_if_fail (GST_IS_BUFFER (in_buf), FALSE); + g_return_val_if_fail (GST_IS_BUFFER (out_buf), FALSE); + + GstD3D11DeviceLockGuard lk (converter->device); + + return gst_d3d11_converter_convert_buffer_internal (converter, + in_buf, out_buf); +} + +/** + * gst_d3d11_converter_convert_buffer_unlocked: + * @converter: a #GstD3D11Converter + * @in_buf: a #GstBuffer + * @out_buf: a #GstBuffer + * + * Converts @in_buf into @out_buf. Caller should take d3d11 device lock + * in case that multiple threads can perform GPU processing using the + * same #GstD3D11Device + * + * Returns: %TRUE if conversion is successful + * + * Since: 1.22 + */ + +gboolean +gst_d3d11_converter_convert_buffer_unlocked (GstD3D11Converter * converter, + GstBuffer * in_buf, GstBuffer * out_buf) +{ + g_return_val_if_fail (GST_IS_D3D11_CONVERTER (converter), FALSE); + g_return_val_if_fail (GST_IS_BUFFER (in_buf), FALSE); + g_return_val_if_fail (GST_IS_BUFFER (out_buf), FALSE); + + return gst_d3d11_converter_convert_buffer_internal (converter, + in_buf, out_buf); +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11converter.h
Added
@@ -0,0 +1,136 @@ +/* GStreamer + * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> + * Copyright (C) <2022> Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/d3d11/gstd3d11_fwd.h> + +G_BEGIN_DECLS + +#define GST_TYPE_D3D11_CONVERTER (gst_d3d11_converter_get_type()) +#define GST_D3D11_CONVERTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_D3D11_CONVERTER,GstD3D11Converter)) +#define GST_D3D11_CONVERTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_D3D11_CONVERTER,GstD3D11ConverterClass)) +#define GST_D3D11_CONVERTER_GET_CLASS(obj) (GST_D3D11_CONVERTER_CLASS(G_OBJECT_GET_CLASS(obj))) +#define GST_IS_D3D11_CONVERTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_D3D11_CONVERTER)) +#define GST_IS_D3D11_CONVERTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_D3D11_CONVERTER)) +#define GST_D3D11_CONVERTER_CAST(obj) ((GstD3D11Converter*)(obj)) + +/** + * GstD3D11ConverterBackend: + * @GST_D3D11_CONVERTER_BACKEND_SHADER: Performs conversion using pixel shader + * @GST_D3D11_CONVERTER_BACKEND_VIDEO_PROCESSOR: Performs conversion using video processor + * + * Since: 1.22 + */ +typedef enum +{ + GST_D3D11_CONVERTER_BACKEND_SHADER = (1 << 0), + GST_D3D11_CONVERTER_BACKEND_VIDEO_PROCESSOR = (1 << 1), +} GstD3D11ConverterBackend; + +GST_D3D11_API +GType gst_d3d11_converter_backend_get_type (void); +#define GST_TYPE_D3D11_CONVERTER_BACKEND (gst_d3d11_converter_backend_get_type()) + +/** + * GST_D3D11_CONVERTER_OPT_BACKEND: + * + * #GstD3D11ConverterBackend, the conversion backend + * (e.g., pixel shader and/or video processor) to use + * + * Since: 1.22 + */ +#define GST_D3D11_CONVERTER_OPT_BACKEND "GstD3D11Converter.backend" + +/** + * GST_D3D11_CONVERTER_OPT_GAMMA_MODE: + * + * #GstVideoGammaMode, set the gamma mode. + * Default is #GST_VIDEO_GAMMA_MODE_NONE + * + * Since: 1.22 + */ +#define GST_D3D11_CONVERTER_OPT_GAMMA_MODE "GstD3D11Converter.gamma-mode" + +/** + * GST_D3D11_CONVERTER_OPT_PRIMARIES_MODE: + * + * #GstVideoPrimariesMode, set the primaries conversion mode. + * Default is #GST_VIDEO_PRIMARIES_MODE_NONE. + * + * Since: 1.22 + */ +#define GST_D3D11_CONVERTER_OPT_PRIMARIES_MODE "GstD3D11Converter.primaries-mode" + +/** + * GstD3D11Converter: + * + * Opaque GstD3D11Converter struct + * + * Since: 1.22 + */ +struct _GstD3D11Converter +{ + GstObject parent; + + GstD3D11Device *device; + + /*< private >*/ + GstD3D11ConverterPrivate *priv; + gpointer _gst_reservedGST_PADDING; +}; + +/** + * GstD3D11ConverterClass: + * + * Opaque GstD3D11ConverterClass struct + * + * Since: 1.22 + */ +struct _GstD3D11ConverterClass +{ + GstObjectClass parent_class; + + /*< private >*/ + gpointer _gst_reservedGST_PADDING; +}; + +GST_D3D11_API +GType gst_d3d11_converter_get_type (void); + +GST_D3D11_API +GstD3D11Converter * gst_d3d11_converter_new (GstD3D11Device * device, + const GstVideoInfo * in_info, + const GstVideoInfo * out_info, + GstStructure * config); + +GST_D3D11_API +gboolean gst_d3d11_converter_convert_buffer (GstD3D11Converter * converter, + GstBuffer * in_buf, + GstBuffer * out_buf); + +GST_D3D11_API +gboolean gst_d3d11_converter_convert_buffer_unlocked (GstD3D11Converter * converter, + GstBuffer * in_buf, + GstBuffer * out_buf); + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11device.cpp -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11device.cpp
Changed
@@ -25,7 +25,7 @@ #include "gstd3d11device.h" #include "gstd3d11utils.h" #include "gstd3d11format.h" -#include "gstd3d11_private.h" +#include "gstd3d11-private.h" #include "gstd3d11memory.h" #include <gmodule.h> #include <wrl.h> @@ -35,8 +35,8 @@ /** * SECTION:gstd3d11device - * @short_description: Direct3D11 device abstraction * @title: GstD3D11Device + * @short_description: Direct3D11 device abstraction * * #GstD3D11Device wraps ID3D11Device and ID3D11DeviceContext for GPU resources * to be able to be shared among various elements. Caller can get native @@ -54,7 +54,6 @@ #if HAVE_D3D11SDKLAYERS_H #include <d3d11sdklayers.h> -static GModule *d3d11_debug_module = NULL; /* mingw header does not define D3D11_RLDO_IGNORE_INTERNAL * D3D11_RLDO_SUMMARY = 0x1, @@ -68,8 +67,7 @@ #include <dxgidebug.h> typedef HRESULT (WINAPI * DXGIGetDebugInterface_t) (REFIID riid, void **ppDebug); -static GModule *dxgi_debug_module = NULL; -static DXGIGetDebugInterface_t GstDXGIGetDebugInterface = NULL; +static DXGIGetDebugInterface_t GstDXGIGetDebugInterface = nullptr; #endif @@ -94,8 +92,6 @@ #define DEFAULT_ADAPTER 0 #define DEFAULT_CREATE_FLAGS 0 -#define GST_D3D11_N_FORMATS 25 - struct _GstD3D11DevicePrivate { guint adapter; @@ -107,16 +103,20 @@ gint64 adapter_luid; ID3D11Device *device; + ID3D11Device5 *device5; ID3D11DeviceContext *device_context; + ID3D11DeviceContext4 *device_context4; ID3D11VideoDevice *video_device; ID3D11VideoContext *video_context; IDXGIFactory1 *factory; - GstD3D11Format format_tableGST_D3D11_N_FORMATS; + GArray *format_table; + + CRITICAL_SECTION extern_lock; + SRWLOCK resource_lock; - GRecMutex extern_lock; - GMutex resource_lock; + LARGE_INTEGER frequency; #if HAVE_D3D11SDKLAYERS_H ID3D11Debug *d3d11_debug; @@ -132,17 +132,14 @@ static void debug_init_once (void) { - static gsize init_once = 0; - - if (g_once_init_enter (&init_once)) { + GST_D3D11_CALL_ONCE_BEGIN { GST_DEBUG_CATEGORY_INIT (gst_d3d11_device_debug, "d3d11device", 0, "d3d11 device object"); #if defined(HAVE_D3D11SDKLAYERS_H) || defined(HAVE_DXGIDEBUG_H) GST_DEBUG_CATEGORY_INIT (gst_d3d11_debug_layer_debug, "d3d11debuglayer", 0, "native d3d11 and dxgi debug"); #endif - g_once_init_leave (&init_once, 1); - } + } GST_D3D11_CALL_ONCE_END; } #define gst_d3d11_device_parent_class parent_class @@ -158,26 +155,24 @@ static gboolean gst_d3d11_device_enable_d3d11_debug (void) { - static gsize _init = 0; - + static GModule *d3d11_debug_module = nullptr; /* If all below libraries are unavailable, d3d11 device would fail with * D3D11_CREATE_DEVICE_DEBUG flag */ - if (g_once_init_enter (&_init)) { - d3d11_debug_module = - g_module_open ("d3d11sdklayers.dll", G_MODULE_BIND_LAZY); - - if (!d3d11_debug_module) - d3d11_debug_module = - g_module_open ("d3d11_1sdklayers.dll", G_MODULE_BIND_LAZY); - if (!d3d11_debug_module) - d3d11_debug_module = - g_module_open ("d3d11_2sdklayers.dll", G_MODULE_BIND_LAZY); - if (!d3d11_debug_module) - d3d11_debug_module = - g_module_open ("d3d11_3sdklayers.dll", G_MODULE_BIND_LAZY); - - g_once_init_leave (&_init, 1); + static const gchar *sdk_dll_names = { + "d3d11sdklayers.dll", + "d3d11_1sdklayers.dll", + "d3d11_2sdklayers.dll", + "d3d11_3sdklayers.dll", + }; + + GST_D3D11_CALL_ONCE_BEGIN { + for (guint i = 0; i < G_N_ELEMENTS (sdk_dll_names); i++) { + d3d11_debug_module = g_module_open (sdk_dll_namesi, G_MODULE_BIND_LAZY); + if (d3d11_debug_module) + return; + } } + GST_D3D11_CALL_ONCE_END; if (d3d11_debug_module) return TRUE; @@ -263,27 +258,23 @@ static gboolean gst_d3d11_device_enable_dxgi_debug (void) { - static gsize _init = 0; - gboolean ret = FALSE; - - /* If all below libraries are unavailable, d3d11 device would fail with - * D3D11_CREATE_DEVICE_DEBUG flag */ - if (g_once_init_enter (&_init)) { #if (!GST_D3D11_WINAPI_ONLY_APP) + static GModule *dxgi_debug_module = nullptr; + + GST_D3D11_CALL_ONCE_BEGIN { dxgi_debug_module = g_module_open ("dxgidebug.dll", G_MODULE_BIND_LAZY); if (dxgi_debug_module) g_module_symbol (dxgi_debug_module, "DXGIGetDebugInterface", (gpointer *) & GstDXGIGetDebugInterface); - if (GstDXGIGetDebugInterface) - ret = TRUE; -#elif (GST_D3D11_DXGI_HEADER_VERSION >= 3) - ret = TRUE; -#endif - g_once_init_leave (&_init, 1); } + GST_D3D11_CALL_ONCE_END; - return ret; + if (!GstDXGIGetDebugInterface) + return FALSE; +#endif + + return TRUE; } static HRESULT @@ -292,12 +283,12 @@ #if (!GST_D3D11_WINAPI_ONLY_APP) if (GstDXGIGetDebugInterface) { return GstDXGIGetDebugInterface (riid, debug); + } else { + return E_NOINTERFACE; } -#elif (GST_D3D11_DXGI_HEADER_VERSION >= 3) +#else return DXGIGetDebugInterface1 (0, riid, debug); #endif - - return E_NOINTERFACE; } static inline GstDebugLevel @@ -415,9 +406,10 @@ priv = (GstD3D11DevicePrivate *) gst_d3d11_device_get_instance_private (self); priv->adapter = DEFAULT_ADAPTER; + priv->format_table = g_array_sized_new (FALSE, FALSE, + sizeof (GstD3D11Format), GST_D3D11_N_FORMATS); - g_rec_mutex_init (&priv->extern_lock); - g_mutex_init (&priv->resource_lock); + InitializeCriticalSection (&priv->extern_lock); self->priv = priv; } @@ -425,118 +417,196 @@ static gboolean is_windows_8_or_greater (void) { - static gsize version_once = 0; static gboolean ret = FALSE; - if (g_once_init_enter (&version_once)) { + GST_D3D11_CALL_ONCE_BEGIN { #if (!GST_D3D11_WINAPI_ONLY_APP) if (IsWindows8OrGreater ()) ret = TRUE; #else ret = TRUE; #endif - - g_once_init_leave (&version_once, 1); - } + } GST_D3D11_CALL_ONCE_END; return ret; } -inline D3D11_FORMAT_SUPPORT -operator | (D3D11_FORMAT_SUPPORT lhs, D3D11_FORMAT_SUPPORT rhs) -{ - return static_cast < D3D11_FORMAT_SUPPORT > (static_cast < UINT > - (lhs) | static_cast < UINT > (rhs)); -} - -inline D3D11_FORMAT_SUPPORT -operator |= (D3D11_FORMAT_SUPPORT lhs, D3D11_FORMAT_SUPPORT rhs) -{ - return lhs | rhs; -} - -static gboolean -can_support_format (GstD3D11Device * self, DXGI_FORMAT format, - D3D11_FORMAT_SUPPORT extra_flags) +static guint +check_format_support (GstD3D11Device * self, DXGI_FORMAT format) { GstD3D11DevicePrivate *priv = self->priv; ID3D11Device *handle = priv->device; HRESULT hr; - UINT supported; - D3D11_FORMAT_SUPPORT flags = D3D11_FORMAT_SUPPORT_TEXTURE2D; - - flags |= extra_flags; - - if (!is_windows_8_or_greater ()) { - GST_INFO_OBJECT (self, "DXGI format %d needs Windows 8 or greater", - (guint) format); - return FALSE; - } - - hr = handle->CheckFormatSupport (format, &supported); - if (FAILED (hr)) { - GST_DEBUG_OBJECT (self, "DXGI format %d is not supported by device", - (guint) format); - return FALSE; - } + UINT format_support; - if ((supported & flags) != flags) { - GST_DEBUG_OBJECT (self, - "DXGI format %d doesn't support flag 0x%x (supported flag 0x%x)", - (guint) format, (guint) supported, (guint) flags); - return FALSE; - } + hr = handle->CheckFormatSupport (format, &format_support); + if (FAILED (hr) || format_support == 0) + return 0; - GST_INFO_OBJECT (self, "Device supports DXGI format %d", (guint) format); + return format_support; +} - return TRUE; +static void +dump_format (GstD3D11Device * self, GstD3D11Format * format) +{ + gchar *format_support_str = g_flags_to_string (GST_TYPE_D3D11_FORMAT_SUPPORT, + format->format_support0); + + GST_LOG_OBJECT (self, "%s -> %s (%d), " + "resource format: %s (%d), %s (%d), %s (%d), %s (%d), flags (0x%x) %s", + gst_video_format_to_string (format->format), + gst_d3d11_dxgi_format_to_string (format->dxgi_format), + format->dxgi_format, + gst_d3d11_dxgi_format_to_string (format->resource_format0), + format->resource_format0, + gst_d3d11_dxgi_format_to_string (format->resource_format1), + format->resource_format1, + gst_d3d11_dxgi_format_to_string (format->resource_format2), + format->resource_format2, + gst_d3d11_dxgi_format_to_string (format->resource_format3), + format->resource_format3, format->format_support0, + format_support_str); + + g_free (format_support_str); } static void gst_d3d11_device_setup_format_table (GstD3D11Device * self) { GstD3D11DevicePrivate *priv = self->priv; - guint n_formats = 0; - /* RGB formats */ - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_BGRA; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_B8G8R8A8_UNORM; - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_B8G8R8A8_UNORM; - n_formats++; + for (guint i = 0; i < G_N_ELEMENTS (_gst_d3d11_default_format_map); i++) { + const GstD3D11Format *iter = &_gst_d3d11_default_format_mapi; + GstD3D11Format format; + guint supportGST_VIDEO_MAX_PLANES = { 0, }; + gboolean native = TRUE; + + switch (iter->format) { + /* RGB/GRAY */ + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_BGRx: + case GST_VIDEO_FORMAT_RGBA: + case GST_VIDEO_FORMAT_RGBx: + case GST_VIDEO_FORMAT_RGB10A2_LE: + case GST_VIDEO_FORMAT_RGBA64_LE: + case GST_VIDEO_FORMAT_GRAY8: + case GST_VIDEO_FORMAT_GRAY16_LE: + support0 = check_format_support (self, iter->dxgi_format); + if (!support0) { + const gchar *format_name = + gst_d3d11_dxgi_format_to_string (iter->dxgi_format); + GST_INFO_OBJECT (self, "DXGI_FORMAT_%s (%d) for %s is not supported", + format_name, (guint) iter->dxgi_format, + gst_video_format_to_string (iter->format)); + continue; + } + break; + /* YUV DXGI native formats */ + case GST_VIDEO_FORMAT_VUYA: + case GST_VIDEO_FORMAT_Y410: + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P012_LE: + case GST_VIDEO_FORMAT_P016_LE: + case GST_VIDEO_FORMAT_YUY2: + { + gboolean supported = TRUE; + + if (is_windows_8_or_greater ()) + support0 = check_format_support (self, iter->dxgi_format); + + if (!support0) { + GST_DEBUG_OBJECT (self, + "DXGI_FORMAT_%s (%d) for %s is not supported, " + "checking resource format", + gst_d3d11_dxgi_format_to_string (iter->dxgi_format), + (guint) iter->dxgi_format, + gst_video_format_to_string (iter->format)); + + native = FALSE; + for (guint j = 0; j < GST_VIDEO_MAX_PLANES; j++) { + if (iter->resource_formatj == DXGI_FORMAT_UNKNOWN) + break; + + supportj = check_format_support (self, iter->resource_formatj); + if (supportj == 0) { + supported = FALSE; + break; + } + } + + if (!supported) { + GST_INFO_OBJECT (self, "%s is not supported", + gst_video_format_to_string (iter->format)); + continue; + } + } + break; + } + /* non-DXGI native formats */ + case GST_VIDEO_FORMAT_NV21: + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_I420_10LE: + case GST_VIDEO_FORMAT_I420_12LE: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_I422_12LE: + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_Y444_12LE: + case GST_VIDEO_FORMAT_Y444_16LE: + case GST_VIDEO_FORMAT_AYUV: + case GST_VIDEO_FORMAT_AYUV64: + /* RGB planar formats */ + case GST_VIDEO_FORMAT_RGBP: + case GST_VIDEO_FORMAT_BGRP: + case GST_VIDEO_FORMAT_GBR: + case GST_VIDEO_FORMAT_GBR_10LE: + case GST_VIDEO_FORMAT_GBR_12LE: + case GST_VIDEO_FORMAT_GBRA: + case GST_VIDEO_FORMAT_GBRA_10LE: + case GST_VIDEO_FORMAT_GBRA_12LE: + { + gboolean supported = TRUE; + + native = FALSE; + for (guint j = 0; j < GST_VIDEO_MAX_PLANES; j++) { + if (iter->resource_formatj == DXGI_FORMAT_UNKNOWN) + break; + + supportj = check_format_support (self, iter->resource_formatj); + if (supportj == 0) { + supported = FALSE; + break; + } + } - /* Identical to BGRA, but alpha will be ignored */ - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_BGRx; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_B8G8R8A8_UNORM; - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_B8G8R8A8_UNORM; - n_formats++; + if (!supported) { + GST_INFO_OBJECT (self, "%s is not supported", + gst_video_format_to_string (iter->format)); + continue; + } + break; + } + default: + g_assert_not_reached (); + return; + } - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_RGBA; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R8G8B8A8_UNORM; - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_R8G8B8A8_UNORM; - n_formats++; + format = *iter; - /* Identical to RGBA, but alpha will be ignored */ - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_RGBx; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R8G8B8A8_UNORM; - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_R8G8B8A8_UNORM; - n_formats++; + if (!native) + format.dxgi_format = DXGI_FORMAT_UNKNOWN; - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_RGB10A2_LE; - priv->format_tablen_formats.resource_format0 = - DXGI_FORMAT_R10G10B10A2_UNORM; - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_R10G10B10A2_UNORM; - n_formats++; + for (guint j = 0; j < GST_VIDEO_MAX_PLANES; j++) + format.format_supportj = supportj; - /* YUV packed */ - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_VUYA; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R8G8B8A8_UNORM; - if (can_support_format (self, DXGI_FORMAT_AYUV, - D3D11_FORMAT_SUPPORT_RENDER_TARGET | - D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_AYUV; - else - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_UNKNOWN; - n_formats++; + if (gst_debug_category_get_threshold (GST_CAT_DEFAULT) >= GST_LEVEL_LOG) + dump_format (self, &format); + + g_array_append_val (priv->format_table, format); + } /* FIXME: d3d11 sampler doesn't support packed-and-subsampled formats * very well (and it's really poorly documented). @@ -592,153 +662,6 @@ priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_UNKNOWN; n_formats++; #endif - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_Y410; - priv->format_tablen_formats.resource_format0 = - DXGI_FORMAT_R10G10B10A2_UNORM; - if (can_support_format (self, DXGI_FORMAT_Y410, - D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_Y410; - else - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_UNKNOWN; - n_formats++; - - /* YUV semi-planar */ - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_NV12; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R8_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R8G8_UNORM; - if (can_support_format (self, DXGI_FORMAT_NV12, - D3D11_FORMAT_SUPPORT_RENDER_TARGET | - D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_NV12; - else - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_UNKNOWN; - n_formats++; - - /* no native format for NV21 */ - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_NV21; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R8_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R8G8_UNORM; - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_UNKNOWN; - n_formats++; - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_P010_10LE; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R16G16_UNORM; - if (can_support_format (self, DXGI_FORMAT_P010, - D3D11_FORMAT_SUPPORT_RENDER_TARGET | - D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_P010; - else - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_UNKNOWN; - n_formats++; - - /* P012 is identical to P016 from runtime point of view */ - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_P012_LE; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R16G16_UNORM; - if (can_support_format (self, DXGI_FORMAT_P016, - D3D11_FORMAT_SUPPORT_RENDER_TARGET | - D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_P016; - else - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_UNKNOWN; - n_formats++; - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_P016_LE; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R16G16_UNORM; - if (can_support_format (self, DXGI_FORMAT_P016, - D3D11_FORMAT_SUPPORT_RENDER_TARGET | - D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_P016; - else - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_UNKNOWN; - n_formats++; - - /* YUV planar */ - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_I420; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R8_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R8_UNORM; - priv->format_tablen_formats.resource_format2 = DXGI_FORMAT_R8_UNORM; - n_formats++; - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_YV12; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R8_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R8_UNORM; - priv->format_tablen_formats.resource_format2 = DXGI_FORMAT_R8_UNORM; - n_formats++; - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_I420_10LE; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format2 = DXGI_FORMAT_R16_UNORM; - n_formats++; - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_I420_12LE; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format2 = DXGI_FORMAT_R16_UNORM; - n_formats++; - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_Y42B; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R8_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R8_UNORM; - priv->format_tablen_formats.resource_format2 = DXGI_FORMAT_R8_UNORM; - n_formats++; - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_I422_10LE; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format2 = DXGI_FORMAT_R16_UNORM; - n_formats++; - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_I422_12LE; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format2 = DXGI_FORMAT_R16_UNORM; - n_formats++; - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_Y444; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R8_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R8_UNORM; - priv->format_tablen_formats.resource_format2 = DXGI_FORMAT_R8_UNORM; - n_formats++; - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_Y444_10LE; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format2 = DXGI_FORMAT_R16_UNORM; - n_formats++; - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_Y444_12LE; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format2 = DXGI_FORMAT_R16_UNORM; - n_formats++; - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_Y444_16LE; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format1 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.resource_format2 = DXGI_FORMAT_R16_UNORM; - n_formats++; - - /* GRAY */ - /* NOTE: To support conversion by using video processor, - * mark DXGI_FORMAT_{R8,R16}_UNORM formats as known dxgi_format. - * Otherwise, d3d11 elements will not try to use video processor for - * those formats */ - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_GRAY8; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R8_UNORM; - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_R8_UNORM; - n_formats++; - - priv->format_tablen_formats.format = GST_VIDEO_FORMAT_GRAY16_LE; - priv->format_tablen_formats.resource_format0 = DXGI_FORMAT_R16_UNORM; - priv->format_tablen_formats.dxgi_format = DXGI_FORMAT_R16_UNORM; - n_formats++; - - g_assert (n_formats == GST_D3D11_N_FORMATS); } static void @@ -781,6 +704,8 @@ GST_LOG_OBJECT (self, "dispose"); + GST_D3D11_CLEAR_COM (priv->device5); + GST_D3D11_CLEAR_COM (priv->device_context4); GST_D3D11_CLEAR_COM (priv->video_device); GST_D3D11_CLEAR_COM (priv->video_context); GST_D3D11_CLEAR_COM (priv->device); @@ -823,8 +748,8 @@ GST_LOG_OBJECT (self, "finalize"); - g_rec_mutex_clear (&priv->extern_lock); - g_mutex_clear (&priv->resource_lock); + g_array_unref (priv->format_table); + DeleteCriticalSection (&priv->extern_lock); g_free (priv->description); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -1028,7 +953,9 @@ ComPtr < IDXGIAdapter1 > adapter; ComPtr < IDXGIFactory1 > factory; ComPtr < ID3D11Device > device; + ComPtr < ID3D11Device5 > device5; ComPtr < ID3D11DeviceContext > device_context; + ComPtr < ID3D11DeviceContext4 > device_context4; HRESULT hr; UINT create_flags; guint adapter_index = 0; @@ -1048,7 +975,7 @@ hr = CreateDXGIFactory1 (IID_PPV_ARGS (&factory)); if (!gst_d3d11_result (hr, NULL)) { - GST_ERROR ("cannot create dxgi factory, hr: 0x%x", (guint) hr); + GST_WARNING ("cannot create dxgi factory, hr: 0x%x", (guint) hr); return nullptr; } @@ -1077,7 +1004,7 @@ hr = external_device->QueryInterface (IID_PPV_ARGS (&device)); if (FAILED (hr)) { - GST_ERROR ("Not a valid external ID3D11Device handle"); + GST_WARNING ("Not a valid external ID3D11Device handle"); return nullptr; } @@ -1134,7 +1061,7 @@ } case DEVICE_CONSTRUCT_FOR_ADAPTER_LUID: { - GST_ERROR ("Failed to create d3d11 device for adapter luid %" + GST_WARNING ("Failed to create d3d11 device for adapter luid %" G_GINT64_FORMAT " with flags 0x%x, hr: 0x%x", data->data.adapter_luid, create_flags, (guint) hr); return nullptr; @@ -1154,6 +1081,14 @@ priv = self->priv; + hr = device.As (&device5); + if (SUCCEEDED (hr)) + hr = device_context.As (&device_context4); + if (SUCCEEDED (hr)) { + priv->device5 = device5.Detach (); + priv->device_context4 = device_context4.Detach (); + } + priv->adapter = adapter_index; priv->device = device.Detach (); priv->device_context = device_context.Detach (); @@ -1176,6 +1111,9 @@ gst_d3d11_device_setup_format_table (self); gst_d3d11_device_setup_debug_layer (self); + BOOL ret = QueryPerformanceFrequency (&priv->frequency); + g_assert (ret); + return self; } @@ -1187,7 +1125,7 @@ * Returns: (transfer full) (nullable): a new #GstD3D11Device for @adapter_index * or %NULL when failed to create D3D11 device with given adapter index. * - * Since: 1.20 + * Since: 1.22 */ GstD3D11Device * gst_d3d11_device_new (guint adapter_index, guint flags) @@ -1209,7 +1147,7 @@ * Returns: (transfer full) (nullable): a new #GstD3D11Device for @adapter_luid * or %NULL when failed to create D3D11 device with given adapter luid. * - * Since: 1.20 + * Since: 1.22 */ GstD3D11Device * gst_d3d11_device_new_for_adapter_luid (gint64 adapter_luid, guint flags) @@ -1230,7 +1168,7 @@ * Returns: (transfer full) (nullable): a new #GstD3D11Device for @device * or %NULL if an error occurred * - * Since: 1.20 + * Since: 1.22 */ GstD3D11Device * gst_d3d11_device_new_wrapped (ID3D11Device * device) @@ -1255,7 +1193,7 @@ * * Returns: (transfer none): the ID3D11Device handle * - * Since: 1.20 + * Since: 1.22 */ ID3D11Device * gst_d3d11_device_get_device_handle (GstD3D11Device * device) @@ -1275,7 +1213,7 @@ * * Returns: (transfer none): the immeidate ID3D11DeviceContext handle * - * Since: 1.20 + * Since: 1.22 */ ID3D11DeviceContext * gst_d3d11_device_get_device_context_handle (GstD3D11Device * device) @@ -1294,7 +1232,7 @@ * * Returns: (transfer none): the IDXGIFactory1 handle * - * Since: 1.20 + * Since: 1.22 */ IDXGIFactory1 * gst_d3d11_device_get_dxgi_factory_handle (GstD3D11Device * device) @@ -1314,7 +1252,7 @@ * Returns: (nullable) (transfer none) : the ID3D11VideoDevice handle or %NULL * if ID3D11VideoDevice is unavailable. * - * Since: 1.20 + * Since: 1.22 */ ID3D11VideoDevice * gst_d3d11_device_get_video_device_handle (GstD3D11Device * device) @@ -1324,7 +1262,7 @@ g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL); priv = device->priv; - g_mutex_lock (&priv->resource_lock); + GstD3D11SRWLockGuard lk (&priv->resource_lock); if (!priv->video_device) { HRESULT hr; ID3D11VideoDevice *video_device = NULL; @@ -1333,7 +1271,6 @@ if (gst_d3d11_result (hr, device)) priv->video_device = video_device; } - g_mutex_unlock (&priv->resource_lock); return priv->video_device; } @@ -1348,7 +1285,7 @@ * Returns: (nullable) (transfer none): the ID3D11VideoContext handle or %NULL * if ID3D11VideoContext is unavailable. * - * Since: 1.20 + * Since: 1.22 */ ID3D11VideoContext * gst_d3d11_device_get_video_context_handle (GstD3D11Device * device) @@ -1358,7 +1295,7 @@ g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL); priv = device->priv; - g_mutex_lock (&priv->resource_lock); + GstD3D11SRWLockGuard lk (&priv->resource_lock); if (!priv->video_context) { HRESULT hr; ID3D11VideoContext *video_context = NULL; @@ -1367,7 +1304,6 @@ if (gst_d3d11_result (hr, device)) priv->video_context = video_context; } - g_mutex_unlock (&priv->resource_lock); return priv->video_context; } @@ -1380,7 +1316,7 @@ * protected by this method. This call must be paired with * gst_d3d11_device_unlock() * - * Since: 1.20 + * Since: 1.22 */ void gst_d3d11_device_lock (GstD3D11Device * device) @@ -1392,7 +1328,7 @@ priv = device->priv; GST_TRACE_OBJECT (device, "device locking"); - g_rec_mutex_lock (&priv->extern_lock); + EnterCriticalSection (&priv->extern_lock); GST_TRACE_OBJECT (device, "device locked"); } @@ -1403,7 +1339,7 @@ * Release lock for @device. This call must be paired with * gst_d3d11_device_lock() * - * Since: 1.20 + * Since: 1.22 */ void gst_d3d11_device_unlock (GstD3D11Device * device) @@ -1414,35 +1350,303 @@ priv = device->priv; - g_rec_mutex_unlock (&priv->extern_lock); + LeaveCriticalSection (&priv->extern_lock); GST_TRACE_OBJECT (device, "device unlocked"); } /** - * gst_d3d11_device_format_from_gst: + * gst_d3d11_device_get_format: * @device: a #GstD3D11Device * @format: a #GstVideoFormat + * @device_format: (out caller-allocates) (nullable): a #GstD3D11Format * - * Returns: (transfer none) (nullable): a pointer to #GstD3D11Format - * or %NULL if @format is not supported by @device + * Converts @format to #GstD3D11Format if the @format is supported + * by device * - * Since: 1.20 + * Returns: %TRUE if @format is supported by @device + * + * Since: 1.22 */ -const GstD3D11Format * -gst_d3d11_device_format_from_gst (GstD3D11Device * device, - GstVideoFormat format) +gboolean +gst_d3d11_device_get_format (GstD3D11Device * device, GstVideoFormat format, + GstD3D11Format * device_format) { GstD3D11DevicePrivate *priv; - guint i; - g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL); + g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), FALSE); + + priv = device->priv; + + for (guint i = 0; i < priv->format_table->len; i++) { + const GstD3D11Format *d3d11_fmt = + &g_array_index (priv->format_table, GstD3D11Format, i); + + if (d3d11_fmt->format != format) + continue; + + if (device_format) + *device_format = *d3d11_fmt; + + return TRUE; + } + + if (device_format) + gst_d3d11_format_init (device_format); + + return FALSE; +} + +GST_DEFINE_MINI_OBJECT_TYPE (GstD3D11Fence, gst_d3d11_fence); + +struct _GstD3D11FencePrivate +{ + UINT64 fence_value; + ID3D11Fence *fence; + ID3D11Query *query; + HANDLE event_handle; + gboolean signalled; + gboolean synced; +}; + +static void +_gst_d3d11_fence_free (GstD3D11Fence * fence) +{ + GstD3D11FencePrivate *priv = fence->priv; + + GST_D3D11_CLEAR_COM (priv->fence); + GST_D3D11_CLEAR_COM (priv->query); + if (priv->event_handle) + CloseHandle (priv->event_handle); + + gst_clear_object (&fence->device); + + g_free (priv); + g_free (fence); +} + +/** + * gst_d3d11_device_create_fence: + * @device: a #GstD3D11Device + * + * Creates fence object (i.e., ID3D11Fence) if available, otherwise + * ID3D11Query with D3D11_QUERY_EVENT is created. + * + * Returns: a #GstD3D11Fence object + * + * Since: 1.22 + */ +GstD3D11Fence * +gst_d3d11_device_create_fence (GstD3D11Device * device) +{ + GstD3D11DevicePrivate *priv; + ID3D11Fence *fence = nullptr; + HRESULT hr = S_OK; + GstD3D11Fence *self; + + g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), nullptr); priv = device->priv; - for (i = 0; i < G_N_ELEMENTS (priv->format_table); i++) { - if (priv->format_tablei.format == format) - return &priv->format_tablei; + if (priv->device5 && priv->device_context4) { + hr = priv->device5->CreateFence (0, D3D11_FENCE_FLAG_NONE, + IID_PPV_ARGS (&fence)); + + if (!gst_d3d11_result (hr, device)) + GST_WARNING_OBJECT (device, "Failed to create fence object"); + } + + self = g_new0 (GstD3D11Fence, 1); + self->device = (GstD3D11Device *) gst_object_ref (device); + self->priv = g_new0 (GstD3D11FencePrivate, 1); + self->priv->fence = fence; + if (fence) { + self->priv->event_handle = CreateEventEx (nullptr, nullptr, + 0, EVENT_ALL_ACCESS); + } + + gst_mini_object_init (GST_MINI_OBJECT_CAST (self), 0, + GST_TYPE_D3D11_FENCE, nullptr, nullptr, + (GstMiniObjectFreeFunction) _gst_d3d11_fence_free); + + return self; +} + +/** + * gst_d3d11_fence_signal: + * @fence: a #GstD3D11Fence + * + * Sets sync point to fence for waiting. + * Must be called with gst_d3d11_device_lock() held + * + * Returns: %TRUE if successful + * + * Since: 1.22 + */ +gboolean +gst_d3d11_fence_signal (GstD3D11Fence * fence) +{ + HRESULT hr = S_OK; + GstD3D11Device *device; + GstD3D11DevicePrivate *device_priv; + GstD3D11FencePrivate *priv; + + g_return_val_if_fail (GST_IS_D3D11_FENCE (fence), FALSE); + + device = fence->device; + device_priv = device->priv; + priv = fence->priv; + + priv->signalled = FALSE; + priv->synced = FALSE; + + if (priv->fence) { + priv->fence_value++; + + GST_LOG_OBJECT (device, "Signals with fence value %" G_GUINT64_FORMAT, + priv->fence_value); + + hr = device_priv->device_context4->Signal (priv->fence, priv->fence_value); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (device, "Failed to signal fence value %" + G_GUINT64_FORMAT, fence->priv->fence_value); + return FALSE; + } + } else { + D3D11_QUERY_DESC desc; + + GST_D3D11_CLEAR_COM (priv->query); + + desc.Query = D3D11_QUERY_EVENT; + desc.MiscFlags = 0; + + GST_LOG_OBJECT (device, "Creating query object"); + + hr = device_priv->device->CreateQuery (&desc, &priv->query); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (device, "Failed to create query object"); + return FALSE; + } + + device_priv->device_context->End (priv->query); + } + + priv->signalled = TRUE; + + return TRUE; +} + +/** + * gst_d3d11_fence_wait: + * @fence: a #GstD3D11Fence + * + * Waits until previously issued GPU commands have been completed + * Must be called with gst_d3d11_device_lock() held + * + * Returns: %TRUE if successful + * + * Since: 1.22 + */ +gboolean +gst_d3d11_fence_wait (GstD3D11Fence * fence) +{ + HRESULT hr = S_OK; + GstD3D11Device *device; + GstD3D11DevicePrivate *device_priv; + GstD3D11FencePrivate *priv; + BOOL timer_ret; + LARGE_INTEGER current_time, now; + + g_return_val_if_fail (GST_IS_D3D11_FENCE (fence), FALSE); + + device = fence->device; + device_priv = device->priv; + priv = fence->priv; + + if (!priv->signalled) { + GST_DEBUG_OBJECT (device, "Fence is not signalled, nothing to wait"); + return TRUE; + } + + if (priv->synced) { + GST_DEBUG_OBJECT (device, "Already synced"); + return TRUE; } - return NULL; + timer_ret = QueryPerformanceCounter (¤t_time); + g_assert (timer_ret); + + now = current_time; + + if (priv->fence) { + GST_LOG_OBJECT (device, "Waiting fence value %" G_GUINT64_FORMAT, + priv->fence_value); + + if (fence->priv->fence->GetCompletedValue () < fence->priv->fence_value) { + hr = fence->priv->fence->SetEventOnCompletion (fence->priv->fence_value, + fence->priv->event_handle); + if (!gst_d3d11_result (hr, device)) { + GST_WARNING_OBJECT (device, "Failed set event handle"); + return FALSE; + } + + /* 20 seconds should be sufficient time */ + DWORD ret = WaitForSingleObject (priv->event_handle, 20000); + if (ret != WAIT_OBJECT_0) { + GST_WARNING_OBJECT (device, + "Failed to wait object, ret 0x%x", (guint) ret); + return FALSE; + } + } + } else { + LONGLONG timeout; + BOOL sync_done = FALSE; + + g_assert (priv->query != nullptr); + + /* 20 sec timeout */ + timeout = now.QuadPart + 20 * device_priv->frequency.QuadPart; + + GST_LOG_OBJECT (device, "Waiting event"); + + while (now.QuadPart < timeout && !sync_done) { + hr = device_priv->device_context->GetData (priv->query, + &sync_done, sizeof (BOOL), 0); + if (FAILED (hr)) { + GST_WARNING_OBJECT (device, "Failed to get event data"); + return FALSE; + } + + if (sync_done) + break; + + g_thread_yield (); + timer_ret = QueryPerformanceCounter (&now); + g_assert (timer_ret); + } + + if (!sync_done) { + GST_WARNING_OBJECT (device, "Timeout"); + return FALSE; + } + + GST_D3D11_CLEAR_COM (priv->query); + } + +#ifndef GST_DISABLE_GST_DEBUG + if (gst_debug_category_get_threshold (GST_CAT_DEFAULT) >= GST_LEVEL_LOG) { + GstClockTime elapsed; + + QueryPerformanceCounter (&now); + elapsed = gst_util_uint64_scale (now.QuadPart - current_time.QuadPart, + GST_SECOND, device_priv->frequency.QuadPart); + + GST_LOG_OBJECT (device, "Wait done, elapsed %" GST_TIME_FORMAT, + GST_TIME_ARGS (elapsed)); + } +#endif + + priv->signalled = FALSE; + priv->synced = TRUE; + + return TRUE; }
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11device.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11device.h
Changed
@@ -18,8 +18,7 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __GST_D3D11_DEVICE_H__ -#define __GST_D3D11_DEVICE_H__ +#pragma once #include <gst/gst.h> #include <gst/video/video.h> @@ -35,18 +34,43 @@ #define GST_IS_D3D11_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_D3D11_DEVICE)) #define GST_D3D11_DEVICE_CAST(obj) ((GstD3D11Device*)(obj)) +#define GST_TYPE_D3D11_FENCE (gst_d3d11_fence_get_type()) +#define GST_IS_D3D11_FENCE(obj) (GST_IS_MINI_OBJECT_TYPE(obj, GST_TYPE_D3D11_FENCE)) +#define GST_D3D11_FENCE(obj) ((GstD3D11Fence *)obj) +#define GST_D3D11_FENCE_CAST(obj) (GST_D3D11_FENCE(obj)) + +/** + * GST_D3D11_DEVICE_HANDLE_CONTEXT_TYPE: + * + * The name used in #GstContext queries for requesting a #GstD3D11Device + * + * Since: 1.22 + */ #define GST_D3D11_DEVICE_HANDLE_CONTEXT_TYPE "gst.d3d11.device.handle" +/** + * GstD3D11Device: + * + * Opaque GstD3D11Device struct + * + * Since: 1.22 + */ struct _GstD3D11Device { GstObject parent; - GstD3D11DevicePrivate *priv; - /*< private >*/ + GstD3D11DevicePrivate *priv; gpointer _gst_reservedGST_PADDING; }; +/** + * GstD3D11DeviceClass: + * + * Opaque GstD3D11DeviceClass struct + * + * Since: 1.22 + */ struct _GstD3D11DeviceClass { GstObjectClass parent_class; @@ -91,9 +115,54 @@ void gst_d3d11_device_unlock (GstD3D11Device * device); GST_D3D11_API -const GstD3D11Format * gst_d3d11_device_format_from_gst (GstD3D11Device * device, - GstVideoFormat format); +gboolean gst_d3d11_device_get_format (GstD3D11Device * device, + GstVideoFormat format, + GstD3D11Format * device_format); + +/** + * GstD3D11Fence: + * + * An abstraction of the ID3D11Fence interface + * + * Since: 1.22 + */ +struct _GstD3D11Fence +{ + GstMiniObject parent; + + GstD3D11Device *device; + + /*< private >*/ + GstD3D11FencePrivate *priv; + gpointer _gst_reservedGST_PADDING; +}; + +GST_D3D11_API +GType gst_d3d11_fence_get_type (void); + +GST_D3D11_API +GstD3D11Fence * gst_d3d11_device_create_fence (GstD3D11Device * device); + +GST_D3D11_API +gboolean gst_d3d11_fence_signal (GstD3D11Fence * fence); + +GST_D3D11_API +gboolean gst_d3d11_fence_wait (GstD3D11Fence * fence); + +static inline void +gst_d3d11_fence_unref (GstD3D11Fence * fence) +{ + gst_mini_object_unref (GST_MINI_OBJECT_CAST (fence)); +} + +static inline void +gst_clear_d3d11_fence (GstD3D11Fence ** fence) +{ + if (fence && *fence) { + gst_d3d11_fence_unref (*fence); + *fence = NULL; + } +} G_END_DECLS -#endif /* __GST_D3D11_DEVICE_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11format.cpp -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11format.cpp
Changed
@@ -25,67 +25,93 @@ #include "gstd3d11utils.h" #include "gstd3d11device.h" #include "gstd3d11memory.h" +#include "gstd3d11-private.h" #include <string.h> +/** + * SECTION:gstd3d11format + * @title: GstD3D11Format + * @short_description: Bridge of Direct3D11 and GStreamer video format representation + * + * Since: 1.22 + */ + #ifndef GST_DISABLE_GST_DEBUG #define GST_CAT_DEFAULT ensure_debug_category() static GstDebugCategory * ensure_debug_category (void) { - static gsize cat_gonce = 0; - - if (g_once_init_enter (&cat_gonce)) { - gsize cat_done; - - cat_done = (gsize) _gst_debug_category_new ("d3d11format", 0, - "d3d11 specific formats"); + static GstDebugCategory *cat = nullptr; - g_once_init_leave (&cat_gonce, cat_done); - } + GST_D3D11_CALL_ONCE_BEGIN { + cat = _gst_debug_category_new ("d3d11format", 0, "d3d11 specific formats"); + } GST_D3D11_CALL_ONCE_END; - return (GstDebugCategory *) cat_gonce; + return cat; } #else #define ensure_debug_category() /* NOOP */ #endif /* GST_DISABLE_GST_DEBUG */ -/** - * gst_d3d11_dxgi_format_n_planes: - * @format: a DXGI_FORMAT - * - * Returns: the number of planes for @format - * - * Since: 1.20 - */ -guint -gst_d3d11_dxgi_format_n_planes (DXGI_FORMAT format) +GType +gst_d3d11_format_support_get_type (void) { - switch (format) { - case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R10G10B10A2_UNORM: - case DXGI_FORMAT_AYUV: - case DXGI_FORMAT_YUY2: - case DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT_R8G8_UNORM: - case DXGI_FORMAT_R16_UNORM: - case DXGI_FORMAT_R16G16_UNORM: - case DXGI_FORMAT_G8R8_G8B8_UNORM: - case DXGI_FORMAT_R8G8_B8G8_UNORM: - case DXGI_FORMAT_Y210: - case DXGI_FORMAT_Y410: - case DXGI_FORMAT_R16G16B16A16_UNORM: - return 1; - case DXGI_FORMAT_NV12: - case DXGI_FORMAT_P010: - case DXGI_FORMAT_P016: - return 2; - default: - break; - } + static GType support_type = 0; + static const GFlagsValue support_values = { + {D3D11_FORMAT_SUPPORT_BUFFER, "BUFFER", "buffer"}, + {D3D11_FORMAT_SUPPORT_IA_VERTEX_BUFFER, "IA_VERTEX_BUFFER", + "ia-vertex-buffer"}, + {D3D11_FORMAT_SUPPORT_IA_INDEX_BUFFER, "IA_INDEX_BUFFER", + "ia-index-buffer"}, + {D3D11_FORMAT_SUPPORT_SO_BUFFER, "SO_BUFFER", "so-buffer"}, + {D3D11_FORMAT_SUPPORT_TEXTURE1D, "TEXTURE1D", "texture1d"}, + {D3D11_FORMAT_SUPPORT_TEXTURE2D, "TEXTURE2D", "texture2d"}, + {D3D11_FORMAT_SUPPORT_TEXTURE3D, "TEXTURE3D", "texture3d"}, + {D3D11_FORMAT_SUPPORT_TEXTURECUBE, "TEXTURECUBE", "texturecube"}, + {D3D11_FORMAT_SUPPORT_SHADER_LOAD, "SHADER_LOAD", "shader-load"}, + {D3D11_FORMAT_SUPPORT_SHADER_SAMPLE, "SHADER_SAMPLE", "shader-sample"}, + {D3D11_FORMAT_SUPPORT_SHADER_SAMPLE_COMPARISON, "SHADER_COMPARISION", + "shader-comparision"}, + {D3D11_FORMAT_SUPPORT_SHADER_SAMPLE_MONO_TEXT, "SHADER_SAMPLE_MONO_TEXT", + "shader-sample-mono-text"}, + {D3D11_FORMAT_SUPPORT_MIP, "MIP", "mip"}, + {D3D11_FORMAT_SUPPORT_MIP_AUTOGEN, "MIP_AUTOGEN", "mip-autogen"}, + {D3D11_FORMAT_SUPPORT_RENDER_TARGET, "RENDER_TARGET", "render-target"}, + {D3D11_FORMAT_SUPPORT_BLENDABLE, "BLANDABLE", "blandable"}, + {D3D11_FORMAT_SUPPORT_DEPTH_STENCIL, "DEPTH_STENCIL", "depth-stencil"}, + {D3D11_FORMAT_SUPPORT_CPU_LOCKABLE, "CPU_LOCKABLE", "cpu-lockable"}, + {D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE, "MULTISAMPLE_RESOLVE", + "multisample-resolve"}, + {D3D11_FORMAT_SUPPORT_DISPLAY, "DISPLAY", "display"}, + {D3D11_FORMAT_SUPPORT_CAST_WITHIN_BIT_LAYOUT, "CAST_WITHIN_BIT_LAYOUT", + "cast-within-bit-layout"}, + {D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET, "MULTISAMPLE_RENDERTARGET", + "multisample-rendertarget"}, + {D3D11_FORMAT_SUPPORT_MULTISAMPLE_LOAD, "MULTISAMPLE_LOAD", + "multisample-load"}, + {D3D11_FORMAT_SUPPORT_SHADER_GATHER, "SHADER_GATHER", "shader-gether"}, + {D3D11_FORMAT_SUPPORT_BACK_BUFFER_CAST, "BACK_BUFFER_CAST", + "back-buffer-cast"}, + {D3D11_FORMAT_SUPPORT_TYPED_UNORDERED_ACCESS_VIEW, "UNORDERED_ACCESS_VIEW", + "unordered-access-view"}, + {D3D11_FORMAT_SUPPORT_SHADER_GATHER_COMPARISON, "SHADER_GATHER_COMPARISON", + "shader-gether-comparision"}, + {D3D11_FORMAT_SUPPORT_DECODER_OUTPUT, "DECODER_OUTPUT", "decoder-output"}, + {D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_OUTPUT, "VIDEO_PROCESSOR_OUTPUT", + "video-processor-output"}, + {D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_INPUT, "VIDEO_PROCESSOR_INPUT", + "video-processor-input"}, + {D3D11_FORMAT_SUPPORT_VIDEO_ENCODER, "VIDEO_ENCODER", "video-encoder"}, + {0, nullptr, nullptr} + }; - return 0; + GST_D3D11_CALL_ONCE_BEGIN { + support_type = g_flags_register_static ("GstD3D11FormatSupport", + support_values); + } GST_D3D11_CALL_ONCE_END; + + return support_type; } /** @@ -103,7 +129,7 @@ * * Returns: %TRUE if @size can be calculated with given information * - * Since: 1.20 + * Since: 1.22 */ gboolean gst_d3d11_dxgi_format_get_size (DXGI_FORMAT format, guint width, guint height, @@ -159,7 +185,7 @@ * * Returns: a #GstVideoFormat equivalent to @format * - * Since: 1.20 + * Since: 1.22 */ GstVideoFormat gst_d3d11_dxgi_format_to_gst (DXGI_FORMAT format) @@ -191,3 +217,1456 @@ return GST_VIDEO_FORMAT_UNKNOWN; } + +/** + * gst_d3d11_format_init: + * @format: (out caller-allocates): a #GstD3D11Format + * + * Initialize @format with default values. + * + * Since: 1.22 + */ +void +gst_d3d11_format_init (GstD3D11Format * format) +{ + g_return_if_fail (format != nullptr); + + memset (format, 0, sizeof (GstD3D11Format)); +} + +/** + * gst_d3d11_dxgi_format_get_resource_format: + * @format: a DXGI_FORMAT + * @resource_format: (out caller-allocats): Resource formats for each plane + * + * Returns: the number of planes for @format + * + * Since: 1.22 + */ +guint +gst_d3d11_dxgi_format_get_resource_format (DXGI_FORMAT format, + DXGI_FORMAT resource_formatGST_VIDEO_MAX_PLANES) +{ + for (guint i = 0; i < GST_VIDEO_MAX_PLANES; i++) + resource_formati = DXGI_FORMAT_UNKNOWN; + + if (format == DXGI_FORMAT_UNKNOWN) + return 0; + + for (guint i = 0; i < GST_D3D11_N_FORMATS; i++) { + const GstD3D11Format *fmt = &_gst_d3d11_default_format_mapi; + + if (fmt->dxgi_format == format) { + guint n_planes = 0; + + for (n_planes = 0; n_planes < GST_VIDEO_MAX_PLANES; n_planes++) { + if (fmt->resource_formatn_planes == DXGI_FORMAT_UNKNOWN) + break; + + resource_formatn_planes = fmt->resource_formatn_planes; + } + + return n_planes; + } + } + + resource_format0 = format; + return 1; +} + +/** + * gst_d3d11_dxgi_format_get_alignment: + * @format: a DXGI_FORMAT + * + * Returns: Width and height Alignment requirement for given @format + * + * Since: 1.22 + */ +guint +gst_d3d11_dxgi_format_get_alignment (DXGI_FORMAT format) +{ + switch (format) { + case DXGI_FORMAT_NV12: + case DXGI_FORMAT_P010: + case DXGI_FORMAT_P016: + return 2; + default: + break; + } + + return 0; +} + +/** + * gst_d3d11_dxgi_format_to_string: + * @format: a DXGI_FORMAT + * + * Converts @format enum value to its string representation + * + * Returns: a string representation of @format + * + * Since: 1.22 + */ +const gchar * +gst_d3d11_dxgi_format_to_string (DXGI_FORMAT format) +{ +#define CASE(f) \ + case DXGI_FORMAT_ ##f: \ + return G_STRINGIFY (f); + + switch (format) { + CASE (UNKNOWN); + CASE (R32G32B32A32_TYPELESS); + CASE (R32G32B32A32_FLOAT); + CASE (R32G32B32A32_UINT); + CASE (R32G32B32A32_SINT); + CASE (R32G32B32_TYPELESS); + CASE (R32G32B32_FLOAT); + CASE (R32G32B32_UINT); + CASE (R32G32B32_SINT); + CASE (R16G16B16A16_TYPELESS); + CASE (R16G16B16A16_FLOAT); + CASE (R16G16B16A16_UNORM); + CASE (R16G16B16A16_UINT); + CASE (R16G16B16A16_SNORM); + CASE (R16G16B16A16_SINT); + CASE (R32G32_TYPELESS); + CASE (R32G32_FLOAT); + CASE (R32G32_UINT); + CASE (R32G32_SINT); + CASE (R32G8X24_TYPELESS); + CASE (D32_FLOAT_S8X24_UINT); + CASE (R32_FLOAT_X8X24_TYPELESS); + CASE (X32_TYPELESS_G8X24_UINT); + CASE (R10G10B10A2_TYPELESS); + CASE (R10G10B10A2_UNORM); + CASE (R10G10B10A2_UINT); + CASE (R11G11B10_FLOAT); + CASE (R8G8B8A8_TYPELESS); + CASE (R8G8B8A8_UNORM); + CASE (R8G8B8A8_UNORM_SRGB); + CASE (R8G8B8A8_UINT); + CASE (R8G8B8A8_SNORM); + CASE (R8G8B8A8_SINT); + CASE (R16G16_TYPELESS); + CASE (R16G16_FLOAT); + CASE (R16G16_UNORM); + CASE (R16G16_UINT); + CASE (R16G16_SNORM); + CASE (R16G16_SINT); + CASE (R32_TYPELESS); + CASE (D32_FLOAT); + CASE (R32_FLOAT); + CASE (R32_UINT); + CASE (R32_SINT); + CASE (R24G8_TYPELESS); + CASE (D24_UNORM_S8_UINT); + CASE (R24_UNORM_X8_TYPELESS); + CASE (X24_TYPELESS_G8_UINT); + CASE (R8G8_TYPELESS); + CASE (R8G8_UNORM); + CASE (R8G8_UINT); + CASE (R8G8_SNORM); + CASE (R8G8_SINT); + CASE (R16_TYPELESS); + CASE (R16_FLOAT); + CASE (D16_UNORM); + CASE (R16_UNORM); + CASE (R16_UINT); + CASE (R16_SNORM); + CASE (R16_SINT); + CASE (R8_TYPELESS); + CASE (R8_UNORM); + CASE (R8_UINT); + CASE (R8_SNORM); + CASE (R8_SINT); + CASE (A8_UNORM); + CASE (R1_UNORM); + CASE (R9G9B9E5_SHAREDEXP); + CASE (R8G8_B8G8_UNORM); + CASE (G8R8_G8B8_UNORM); + CASE (BC1_TYPELESS); + CASE (BC1_UNORM); + CASE (BC1_UNORM_SRGB); + CASE (BC2_TYPELESS); + CASE (BC2_UNORM); + CASE (BC2_UNORM_SRGB); + CASE (BC3_TYPELESS); + CASE (BC3_UNORM); + CASE (BC3_UNORM_SRGB); + CASE (BC4_TYPELESS); + CASE (BC4_UNORM); + CASE (BC4_SNORM); + CASE (BC5_TYPELESS); + CASE (BC5_UNORM); + CASE (BC5_SNORM); + CASE (B5G6R5_UNORM); + CASE (B5G5R5A1_UNORM); + CASE (B8G8R8A8_UNORM); + CASE (B8G8R8X8_UNORM); + CASE (R10G10B10_XR_BIAS_A2_UNORM); + CASE (B8G8R8A8_TYPELESS); + CASE (B8G8R8A8_UNORM_SRGB); + CASE (B8G8R8X8_TYPELESS); + CASE (B8G8R8X8_UNORM_SRGB); + CASE (BC6H_TYPELESS); + CASE (BC6H_UF16); + CASE (BC6H_SF16); + CASE (BC7_TYPELESS); + CASE (BC7_UNORM); + CASE (BC7_UNORM_SRGB); + CASE (AYUV); + CASE (Y410); + CASE (Y416); + CASE (NV12); + CASE (P010); + CASE (P016); + case DXGI_FORMAT_420_OPAQUE: + return "420_OPAQUE"; + CASE (YUY2); + CASE (Y210); + CASE (Y216); + CASE (NV11); + CASE (AI44); + CASE (IA44); + CASE (P8); + CASE (A8P8); + CASE (B4G4R4A4_UNORM); + CASE (P208); + CASE (V208); + CASE (V408); + default: + break; + } +#undef CASE + + return "Unknown"; +} + +/* Some values are not defined in old MinGW toolchain */ +typedef enum +{ + GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 = 0, + GST_DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 = 1, + GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709 = 2, + GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020 = 3, + GST_DXGI_COLOR_SPACE_RESERVED = 4, + GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601 = 5, + GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601 = 6, + GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601 = 7, + GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 = 8, + GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709 = 9, + GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020 = 10, + GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020 = 11, + GST_DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 = 12, + GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020 = 13, + GST_DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020 = 14, + GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020 = 15, + GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020 = 16, + GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020 = 17, + GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020 = 18, + GST_DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020 = 19, + GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709 = 20, + GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020 = 21, + GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P709 = 22, + GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P2020 = 23, + GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_TOPLEFT_P2020 = 24, +} GST_DXGI_COLOR_SPACE_TYPE; + +static gboolean +rgb_to_colorspace (const GstVideoColorimetry * cinfo, + DXGI_COLOR_SPACE_TYPE * color_space) +{ + /* sRGB */ + GST_DXGI_COLOR_SPACE_TYPE type = GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; + + /* Defined DXGI RGB colorspace + * 1) DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 = 0 (sRGB) + * 2) DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 = 1 (scRGB) + * 3) DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709 = 2 (BT601/BT709 studio range) + * 4) DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020 = 3 (BT2020 SDR studio range) + * 5) DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 = 12 (HDR10 full range) + * 6) DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020 = 13 (HDR10 studio range) + * 7) DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020 = 17 (BT2020 SDR fullrange) + * 8) DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709 = 20 (unused) + * 9) DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020 = 21 (unused) + * + * Note that GStreamer does not define gamma2.4. So, 8) and 9) are excluded + */ + if (cinfo->transfer == GST_VIDEO_TRANSFER_GAMMA10) { + type = GST_DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709; + goto done; + } + + /* HLG RGB colorspace is not defined, approximated to HDR10 */ + if (cinfo->transfer == GST_VIDEO_TRANSFER_SMPTE2084 || + cinfo->transfer == GST_VIDEO_TRANSFER_ARIB_STD_B67) { + if (cinfo->range == GST_VIDEO_COLOR_RANGE_16_235) { + type = GST_DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020; + } else { + type = GST_DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020; + } + goto done; + } + + if (cinfo->primaries == GST_VIDEO_COLOR_PRIMARIES_BT2020) { + if (cinfo->range == GST_VIDEO_COLOR_RANGE_16_235) { + type = GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020; + } else { + type = GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020; + } + goto done; + } + + if (cinfo->range == GST_VIDEO_COLOR_RANGE_16_235) + type = GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709; + +done: + *color_space = (DXGI_COLOR_SPACE_TYPE) type; + + return TRUE; +} + +static gboolean +yuv_to_colorspace (const GstVideoColorimetry * cinfo, + GstVideoChromaSite chroma_site, DXGI_COLOR_SPACE_TYPE * color_space) +{ + /* BT709 */ + GST_DXGI_COLOR_SPACE_TYPE type = + GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709; + + /* Defined DXGI RGB colorspace + * 1) DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601 = 5 (common JPG) + * 2) DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601 = 6 (BT601 studio range) + * 3) DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601 = 7 (BT601 full range) + * 4) DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 = 8 (BT709 studio range) + * 5) DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709 = 9 (BT709 full range) + * 6) DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020 = 10 (BT2020 4:2:0 studio range) + * 7) DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020 = 11 (BT2020 full range) + * 8) DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020 = 13 (HDR10 4:2:0 studio range) + * 9) DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020 = 15 (BT2020 4:2:2 or 4:4:4: studio range) + * 10) DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020 = 16 (HDR10 4:2:2 or 4:4:4 studio range) + * 11) DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020 = 18 (HLG studio range) + * 12) DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020 = 19 (HLG full range) + * 13) DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P709 = 22 (unused) + * 14) DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P2020 = 23 (unused) + * 15) DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_TOPLEFT_P2020 = 24 (unused) + * + * Note that GStreamer does not define gamma2.4. So, 13) ~ 15) are excluded + */ + + /* HLG */ + if (cinfo->transfer == GST_VIDEO_TRANSFER_ARIB_STD_B67) { + if (cinfo->range == GST_VIDEO_COLOR_RANGE_0_255) { + type = GST_DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020; + } else { + type = GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020; + } + goto done; + } + + /* HDR10 */ + if (cinfo->transfer == GST_VIDEO_TRANSFER_SMPTE2084) { + if (chroma_site == GST_VIDEO_CHROMA_SITE_H_COSITED) { + type = GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020; + } else { + type = GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020; + } + goto done; + } + + /* BT2020 */ + if (cinfo->primaries == GST_VIDEO_COLOR_PRIMARIES_BT2020) { + if (cinfo->range == GST_VIDEO_COLOR_RANGE_0_255) { + type = GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020; + } else if (chroma_site == GST_VIDEO_CHROMA_SITE_H_COSITED) { + type = GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020; + } else { + type = GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020; + } + goto done; + } + + /* BT601/BT709 primaries are similar. Depends on RGB matrix */ + if (cinfo->matrix == GST_VIDEO_COLOR_MATRIX_BT601) { + if (cinfo->range == GST_VIDEO_COLOR_RANGE_0_255) { + if (cinfo->primaries == GST_VIDEO_COLOR_PRIMARIES_BT709) { + type = GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601; + } else { + type = GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601; + } + } else { + type = GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601; + } + goto done; + } + + if (cinfo->range == GST_VIDEO_COLOR_RANGE_0_255) + type = GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709; + +done: + *color_space = (DXGI_COLOR_SPACE_TYPE) type; + + return TRUE; +} + +/** + * gst_video_info_to_dxgi_color_space: + * @info: a #GstVideoInfo + * @color_space: (out): DXGI color space + * + * Derives DXGI_COLOR_SPACE_TYPE from @info + * + * Returns: %TRUE if successful + * + * Since: 1.22 + */ +gboolean +gst_video_info_to_dxgi_color_space (const GstVideoInfo * info, + DXGI_COLOR_SPACE_TYPE * color_space) +{ + const GstVideoColorimetry *cinfo; + GstVideoColorimetry c; + + g_return_val_if_fail (info != nullptr, FALSE); + g_return_val_if_fail (color_space != nullptr, FALSE); + + cinfo = &info->colorimetry; + + if (GST_VIDEO_INFO_IS_RGB (info)) { + /* ensure RGB matrix if format is already RGB */ + c.matrix = GST_VIDEO_COLOR_MATRIX_RGB; + } else if (GST_VIDEO_INFO_IS_YUV (info) && + cinfo->matrix == GST_VIDEO_COLOR_MATRIX_RGB) { + /* Invalid matrix */ + c.matrix = GST_VIDEO_COLOR_MATRIX_UNKNOWN; + } else { + c.matrix = cinfo->matrix; + } + + switch (cinfo->range) { + case GST_VIDEO_COLOR_RANGE_0_255: + c.range = GST_VIDEO_COLOR_RANGE_0_255; + break; + case GST_VIDEO_COLOR_RANGE_16_235: + c.range = GST_VIDEO_COLOR_RANGE_16_235; + break; + default: + if (c.matrix == GST_VIDEO_COLOR_MATRIX_RGB) + c.range = GST_VIDEO_COLOR_RANGE_0_255; + else + c.range = GST_VIDEO_COLOR_RANGE_16_235; + break; + } + + /* DXGI primaries: BT601, BT709, BT2020 */ + switch (cinfo->primaries) { + case GST_VIDEO_COLOR_PRIMARIES_BT2020: + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020; + break; + case GST_VIDEO_COLOR_PRIMARIES_SMPTE170M: + case GST_VIDEO_COLOR_PRIMARIES_SMPTE240M: + c.primaries = GST_VIDEO_COLOR_PRIMARIES_SMPTE170M; + break; + default: + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709; + break; + } + + /* DXGI gamma functions: linear (RGB only), gamma2.2, PQ, and HLG */ + switch (cinfo->transfer) { + case GST_VIDEO_TRANSFER_SMPTE2084: + c.transfer = GST_VIDEO_TRANSFER_SMPTE2084; + break; + case GST_VIDEO_TRANSFER_ARIB_STD_B67: + c.transfer = GST_VIDEO_TRANSFER_ARIB_STD_B67; + break; + case GST_VIDEO_TRANSFER_GAMMA10: + /* Only DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 supports linear gamma */ + if (c.matrix == GST_VIDEO_COLOR_MATRIX_RGB) { + c.transfer = GST_VIDEO_TRANSFER_GAMMA10; + c.range = GST_VIDEO_COLOR_RANGE_0_255; + } else { + c.transfer = GST_VIDEO_TRANSFER_GAMMA22; + } + break; + default: + /* Simply map the rest of values to gamma 2.2. We don't have any other + * choice */ + c.transfer = GST_VIDEO_TRANSFER_GAMMA22; + break; + } + + /* DXGI transform matrix: BT601, BT709, and BT2020 */ + switch (c.matrix) { + case GST_VIDEO_COLOR_MATRIX_RGB: + c.matrix = GST_VIDEO_COLOR_MATRIX_RGB; + break; + case GST_VIDEO_COLOR_MATRIX_FCC: + case GST_VIDEO_COLOR_MATRIX_BT601: + c.matrix = GST_VIDEO_COLOR_MATRIX_BT601; + break; + case GST_VIDEO_COLOR_MATRIX_BT2020: + c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020; + break; + default: + c.matrix = GST_VIDEO_COLOR_MATRIX_BT709; + break; + } + + if (c.matrix == GST_VIDEO_COLOR_MATRIX_RGB) + return rgb_to_colorspace (&c, color_space); + + return yuv_to_colorspace (&c, info->chroma_site, color_space); +} + +static gboolean +dxgi_color_space_is_rgb (GST_DXGI_COLOR_SPACE_TYPE color_space) +{ + switch (color_space) { + case GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709: + case GST_DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709: + case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709: + case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020: + case GST_DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020: + case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020: + case GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020: + case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709: + case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020: + return TRUE; + default: + break; + } + + return FALSE; +} + +/** + * gst_video_info_apply_dxgi_color_space: + * @color_space: DXGI color space + * @info: (inout): a #GstVideoInfo + * + * Updates color information of @info using @color_space + * + * Returns: %TRUE if successful + * + * Since: 1.22 + */ +gboolean +gst_video_info_apply_dxgi_color_space (DXGI_COLOR_SPACE_TYPE color_space, + GstVideoInfo * info) +{ + GST_DXGI_COLOR_SPACE_TYPE type; + GstVideoColorimetry c; + + g_return_val_if_fail (info != nullptr, FALSE); + + type = (GST_DXGI_COLOR_SPACE_TYPE) color_space; + + if (GST_VIDEO_INFO_IS_RGB (info) && !dxgi_color_space_is_rgb (type)) { + GST_WARNING ("Invalid DXGI color space mapping"); + return FALSE; + } + + switch (type) { + case GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709: + c.range = GST_VIDEO_COLOR_RANGE_0_255; + c.matrix = GST_VIDEO_COLOR_MATRIX_RGB; + c.transfer = GST_VIDEO_TRANSFER_SRGB; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709; + break; + case GST_DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709: + c.range = GST_VIDEO_COLOR_RANGE_0_255; + c.matrix = GST_VIDEO_COLOR_MATRIX_RGB; + c.transfer = GST_VIDEO_TRANSFER_GAMMA10; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709; + break; + case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709: + case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709: + c.range = GST_VIDEO_COLOR_RANGE_16_235; + c.matrix = GST_VIDEO_COLOR_MATRIX_RGB; + c.transfer = GST_VIDEO_TRANSFER_BT709; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709; + break; + case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020: + case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020: + c.range = GST_VIDEO_COLOR_RANGE_16_235; + c.matrix = GST_VIDEO_COLOR_MATRIX_RGB; + if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) >= 12) + c.transfer = GST_VIDEO_TRANSFER_BT2020_12; + else + c.transfer = GST_VIDEO_TRANSFER_BT2020_10; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020; + break; + case GST_DXGI_COLOR_SPACE_RESERVED: + GST_WARNING ("Reserved color space"); + return FALSE; + case GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601: + c.range = GST_VIDEO_COLOR_RANGE_0_255; + c.matrix = GST_VIDEO_COLOR_MATRIX_BT601; + c.transfer = GST_VIDEO_TRANSFER_BT601; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709; + break; + case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601: + c.range = GST_VIDEO_COLOR_RANGE_16_235; + c.matrix = GST_VIDEO_COLOR_MATRIX_BT601; + c.transfer = GST_VIDEO_TRANSFER_BT601; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_SMPTE170M; + break; + case GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601: + c.range = GST_VIDEO_COLOR_RANGE_0_255; + c.matrix = GST_VIDEO_COLOR_MATRIX_BT601; + c.transfer = GST_VIDEO_TRANSFER_BT601; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_SMPTE170M; + break; + case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709: + case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P709: + c.range = GST_VIDEO_COLOR_RANGE_16_235; + c.matrix = GST_VIDEO_COLOR_MATRIX_BT709; + c.transfer = GST_VIDEO_TRANSFER_BT709; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709; + break; + case GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709: + c.range = GST_VIDEO_COLOR_RANGE_0_255; + c.matrix = GST_VIDEO_COLOR_MATRIX_BT709; + c.transfer = GST_VIDEO_TRANSFER_BT709; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709; + break; + case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020: + case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P2020: + c.range = GST_VIDEO_COLOR_RANGE_16_235; + c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020; + if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) >= 12) + c.transfer = GST_VIDEO_TRANSFER_BT2020_12; + else + c.transfer = GST_VIDEO_TRANSFER_BT2020_10; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020; + break; + case GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020: + c.range = GST_VIDEO_COLOR_RANGE_0_255; + c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020; + if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) >= 12) + c.transfer = GST_VIDEO_TRANSFER_BT2020_12; + else + c.transfer = GST_VIDEO_TRANSFER_BT2020_10; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020; + break; + case GST_DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020: + c.range = GST_VIDEO_COLOR_RANGE_0_255; + c.matrix = GST_VIDEO_COLOR_MATRIX_RGB; + c.transfer = GST_VIDEO_TRANSFER_SMPTE2084; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020; + break; + case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020: + c.range = GST_VIDEO_COLOR_RANGE_16_235; + c.matrix = GST_VIDEO_COLOR_MATRIX_RGB; + c.transfer = GST_VIDEO_TRANSFER_SMPTE2084; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020; + break; + case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020: + c.range = GST_VIDEO_COLOR_RANGE_16_235; + c.matrix = GST_VIDEO_COLOR_MATRIX_RGB; + c.transfer = GST_VIDEO_TRANSFER_SMPTE2084; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020; + break; + case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020: + case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_TOPLEFT_P2020: + c.range = GST_VIDEO_COLOR_RANGE_16_235; + c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020; + if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) >= 12) + c.transfer = GST_VIDEO_TRANSFER_BT2020_12; + else + c.transfer = GST_VIDEO_TRANSFER_BT2020_10; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020; + break; + case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020: + c.range = GST_VIDEO_COLOR_RANGE_16_235; + c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020; + c.transfer = GST_VIDEO_TRANSFER_SMPTE2084; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020; + break; + case GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020: + c.range = GST_VIDEO_COLOR_RANGE_0_255; + c.matrix = GST_VIDEO_COLOR_MATRIX_RGB; + if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) >= 12) + c.transfer = GST_VIDEO_TRANSFER_BT2020_12; + else + c.transfer = GST_VIDEO_TRANSFER_BT2020_10; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020; + break; + case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020: + c.range = GST_VIDEO_COLOR_RANGE_16_235; + c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020; + c.transfer = GST_VIDEO_TRANSFER_ARIB_STD_B67; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020; + break; + case GST_DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020: + c.range = GST_VIDEO_COLOR_RANGE_0_255; + c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020; + c.transfer = GST_VIDEO_TRANSFER_ARIB_STD_B67; + c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020; + break; + default: + GST_WARNING ("Unknown DXGI color space %d", type); + return FALSE; + } + + info->colorimetry = c; + + return TRUE; +} + +gchar * +gst_d3d11_dump_color_matrix (GstD3D11ColorMatrix * matrix) +{ + /* *INDENT-OFF* */ + static const gchar format = + "MATRIX\n" + "|% .6f, % .6f, % .6f|\n" + "|% .6f, % .6f, % .6f|\n" + "|% .6f, % .6f, % .6f|\n" + "OFFSET\n" + "|% .6f, % .6f, % .6f|\n" + "MIN\n" + "|% .6f, % .6f, % .6f|\n" + "MAX\n" + "|% .6f, % .6f, % .6f|"; + /* *INDENT-ON* */ + + g_return_val_if_fail (matrix != nullptr, nullptr); + + return g_strdup_printf (format, + matrix->matrix00, matrix->matrix01, matrix->matrix02, + matrix->matrix10, matrix->matrix11, matrix->matrix12, + matrix->matrix20, matrix->matrix21, matrix->matrix22, + matrix->offset0, matrix->offset1, matrix->offset2, + matrix->min0, matrix->min1, matrix->min2, + matrix->max0, matrix->max1, matrix->max2); +} + +static void +color_matrix_copy (GstD3D11ColorMatrix * dst, const GstD3D11ColorMatrix * src) +{ + for (guint i = 0; i < 3; i++) { + for (guint j = 0; j < 3; j++) { + dst->matrixij = src->matrixij; + } + } +} + +static void +color_matrix_multiply (GstD3D11ColorMatrix * dst, GstD3D11ColorMatrix * a, + GstD3D11ColorMatrix * b) +{ + GstD3D11ColorMatrix tmp; + + for (guint i = 0; i < 3; i++) { + for (guint j = 0; j < 3; j++) { + gdouble val = 0; + for (guint k = 0; k < 3; k++) { + val += a->matrixik * b->matrixkj; + } + + tmp.matrixij = val; + } + } + + color_matrix_copy (dst, &tmp); +} + +static void +color_matrix_identity (GstD3D11ColorMatrix * m) +{ + for (guint i = 0; i < 3; i++) { + for (guint j = 0; j < 3; j++) { + if (i == j) + m->matrixij = 1.0; + else + m->matrixij = 0; + } + } +} + +static gboolean +color_matrix_invert (GstD3D11ColorMatrix * dst, GstD3D11ColorMatrix * src) +{ + GstD3D11ColorMatrix tmp; + gdouble det; + + color_matrix_identity (&tmp); + for (guint j = 0; j < 3; j++) { + for (guint i = 0; i < 3; i++) { + tmp.matrixji = + src->matrix(i + 1) % 3(j + 1) % 3 * + src->matrix(i + 2) % 3(j + 2) % 3 - + src->matrix(i + 1) % 3(j + 2) % 3 * + src->matrix(i + 2) % 3(j + 1) % 3; + } + } + + det = tmp.matrix00 * src->matrix00 + + tmp.matrix01 * src->matrix10 + + tmp.matrix02 * src->matrix20; + if (det == 0) + return FALSE; + + for (guint j = 0; j < 3; j++) { + for (guint i = 0; i < 3; i++) { + tmp.matrixij /= det; + } + } + + color_matrix_copy (dst, &tmp); + + return TRUE; +} + +/** + * gst_d3d11_color_range_adjust_matrix_unorm: + * @in_info: a #GstVideoInfo + * @out_info: a #GstVideoInfo + * @matrix: a #GstD3D11ColorMatrix + * + * Calculates matrix for color range adjustment. Both input and output + * signals are in normalized 0.0..1.0 space. + * + * Resulting values can be calculated by + * | Yout | | Yin | | matrix.offset0 | + * | Uout | = clamp ( matrix.matrix * | Uin | + | matrix.offset1 |, matrix.min, matrix.max ) + * | Vout | | Vin | | matrix.offset2 | + * + * Returns: %TRUE if successful + */ +gboolean +gst_d3d11_color_range_adjust_matrix_unorm (const GstVideoInfo * in_info, + const GstVideoInfo * out_info, GstD3D11ColorMatrix * matrix) +{ + gboolean in_rgb, out_rgb; + gint in_offsetGST_VIDEO_MAX_COMPONENTS; + gint in_scaleGST_VIDEO_MAX_COMPONENTS; + gint out_offsetGST_VIDEO_MAX_COMPONENTS; + gint out_scaleGST_VIDEO_MAX_COMPONENTS; + GstVideoColorRange in_range; + GstVideoColorRange out_range; + gdouble src_fullscale, dst_fullscale; + + g_return_val_if_fail (in_info != nullptr, FALSE); + g_return_val_if_fail (out_info != nullptr, FALSE); + g_return_val_if_fail (matrix != nullptr, FALSE); + + memset (matrix, 0, sizeof (GstD3D11ColorMatrix)); + for (guint i = 0; i < 3; i++) { + matrix->matrixii = 1.0; + matrix->matrixii = 1.0; + matrix->matrixii = 1.0; + matrix->maxi = 1.0; + } + + in_rgb = GST_VIDEO_INFO_IS_RGB (in_info); + out_rgb = GST_VIDEO_INFO_IS_RGB (out_info); + + if (in_rgb != out_rgb) { + GST_WARNING ("Invalid format conversion"); + return FALSE; + } + + in_range = in_info->colorimetry.range; + out_range = out_info->colorimetry.range; + + if (in_range == GST_VIDEO_COLOR_RANGE_UNKNOWN) { + GST_WARNING ("Unknown input color range"); + if (in_rgb || GST_VIDEO_INFO_IS_GRAY (in_info)) + in_range = GST_VIDEO_COLOR_RANGE_0_255; + else + in_range = GST_VIDEO_COLOR_RANGE_16_235; + } + + if (out_range == GST_VIDEO_COLOR_RANGE_UNKNOWN) { + GST_WARNING ("Unknown output color range"); + if (out_rgb || GST_VIDEO_INFO_IS_GRAY (out_info)) + out_range = GST_VIDEO_COLOR_RANGE_0_255; + else + out_range = GST_VIDEO_COLOR_RANGE_16_235; + } + + src_fullscale = (gdouble) ((1 << in_info->finfo->depth0) - 1); + dst_fullscale = (gdouble) ((1 << out_info->finfo->depth0) - 1); + + gst_video_color_range_offsets (in_range, in_info->finfo, in_offset, in_scale); + gst_video_color_range_offsets (out_range, + out_info->finfo, out_offset, out_scale); + + matrix->min0 = matrix->min1 = matrix->min2 = + (gdouble) out_offset0 / dst_fullscale; + + matrix->max0 = (out_scale0 + out_offset0) / dst_fullscale; + matrix->max1 = matrix->max2 = + (out_scale1 + out_offset0) / dst_fullscale; + + if (in_info->colorimetry.range == out_info->colorimetry.range) { + GST_DEBUG ("Same color range"); + return TRUE; + } + + /* Formula + * + * 1) Scales and offset compensates input to 0..1 range + * SRC_NORMi = (srci * src_fullscale - in_offseti) / in_scalei + * = (srci * src_fullscale / in_scalei) - in_offseti / in_scalei + * + * 2) Reverse to output UNIT scale + * DST_UINTi = SRC_NORMi * out_scalei + out_offseti + * = srci * src_fullscale * out_scalei / in_scalei + * - in_offseti * out_scalei / in_scalei + * + out_offseti + * + * 3) Back to 0..1 scale + * dsti = DST_UINTi / dst_fullscale + * = COEFFi * srci + OFFi + * where + * src_fullscale * out_scalei + * COEFFi = ------------------------------ + * dst_fullscale * in_scalei + * + * out_offseti in_offseti * out_scalei + * OFFi = -------------- - ------------------------------ + * dst_fullscale dst_fullscale * in_scalei + */ + for (guint i = 0; i < 3; i++) { + matrix->matrixii = (src_fullscale * out_scalei) / + (dst_fullscale * in_scalei); + matrix->offseti = (out_offseti / dst_fullscale) - + ((gdouble) in_offseti * out_scalei / (dst_fullscale * in_scalei)); + } + + return TRUE; +} + +/** + * gst_d3d11_yuv_to_rgb_matrix_unorm: + * @in_yuv_info: a #GstVideoInfo of input YUV signal + * @out_rgb_info: a #GstVideoInfo of output RGB signal + * @matrix: a #GstD3D11ColorMatrix + * + * Calculates transform matrix from YUV to RGB conversion. Both input and output + * signals are in normalized 0.0..1.0 space and additional gamma decoding + * or primary/transfer function transform is not performed by this matrix. + * + * Resulting non-linear RGB values can be calculated by + * | R' | | Y' | | matrix.offset0 | + * | G' | = clamp ( matrix.matrix * | Cb | + | matrix.offset1 | matrix.min, matrix.max ) + * | B' | | Cr | | matrix.offset2 | + * + * Returns: %TRUE if successful + */ +gboolean +gst_d3d11_yuv_to_rgb_matrix_unorm (const GstVideoInfo * in_yuv_info, + const GstVideoInfo * out_rgb_info, GstD3D11ColorMatrix * matrix) +{ + gint offset4, scale4; + gdouble Kr, Kb, Kg; + + g_return_val_if_fail (in_yuv_info != nullptr, FALSE); + g_return_val_if_fail (out_rgb_info != nullptr, FALSE); + g_return_val_if_fail (matrix != nullptr, FALSE); + + /* + * <Formula> + * + * Input: Unsigned normalized Y'CbCr(unorm), 0.0..1.0 range + * Output: Unsigned normalized non-linear R'G'B'(unorm), 0.0..1.0 range + * + * 1) Y'CbCr(unorm) to scaled Y'CbCr + * | Y' | | Y'(unorm) | + * | Cb | = S | Cb(unorm) | + * | Cb | | Cr(unorm) | + * where S = (2 ^ bitdepth) - 1 + * + * 2) Y'CbCr to YPbPr + * Y = (Y' - offsetY ) / scaleY + * Pb = (Cb - offsetCbCr) / scaleCbCr + * Pr = (Cr - offsetCrCr) / scaleCrCr + * => + * Y = Y'(unorm) * Sy + Oy + * Pb = Cb(unorm) * Suv + Ouv + * Pb = Cr(unorm) * Suv + Ouv + * where + * Sy = S / scaleY + * Suv = S / scaleCbCr + * Oy = -(offsetY / scaleY) + * Ouv = -(offsetCbCr / scaleCbCr) + * + * 3) YPbPr to R'G'B' + * | R' | | Y | + * | G' | = M *| Pb | + * | B' | | Pr | + * where + * | vecR | + * M = | vecG | + * | vecB | + * vecR = | 1, 0 , 2(1 - Kr) | + * vecG = | 1, -(Kb/Kg) * 2(1 - Kb), -(Kr/Kg) * 2(1 - Kr) | + * vecB = | 1, 2(1 - Kb) , 0 | + * => + * R' = dot(vecR, (Syuv * Y'CbCr(unorm))) + dot(vecR, Offset) + * G' = dot(vecG, (Svuy * Y'CbCr(unorm))) + dot(vecG, Offset) + * B' = dot(vecB, (Syuv * Y'CbCr(unorm)) + dot(vecB, Offset) + * where + * | Sy, 0, 0 | + * Syuv = | 0, Suv, 0 | + * | 0 0, Suv | + * + * | Oy | + * Offset = | Ouv | + * | Ouv | + * + * 4) YUV -> RGB matrix + * | R' | | Y'(unorm) | | offsetA | + * | G' | = Matrix * | Cb(unorm) | + | offsetB | + * | B' | | Cr(unorm) | | offsetC | + * + * where + * | vecR | + * Matrix = | vecG | * Syuv + * | vecB | + * + * offsetA = dot(vecR, Offset) + * offsetB = dot(vecG, Offset) + * offsetC = dot(vecB, Offset) + * + * 4) Consider 16-235 scale RGB + * RGBfull(0..255) -> RGBfull(16..235) matrix is represented by + * | Rs | | Rf | | Or | + * | Gs | = Ms | Gf | + | Og | + * | Bs | | Bf | | Ob | + * + * Combining all matrix into + * | Rs | | Y'(unorm) | | offsetA | | Or | + * | Gs | = Ms * ( Matrix * | Cb(unorm) | + | offsetB | ) + | Og | + * | Bs | | Cr(unorm) | | offsetC | | Ob | + * + * | Y'(unorm) | | offsetA | | Or | + * = Ms * Matrix * | Cb(unorm) | + Ms | offsetB | + | Og | + * | Cr(unorm) | | offsetC | | Ob | + */ + + memset (matrix, 0, sizeof (GstD3D11ColorMatrix)); + for (guint i = 0; i < 3; i++) + matrix->maxi = 1.0; + + gst_video_color_range_offsets (in_yuv_info->colorimetry.range, + in_yuv_info->finfo, offset, scale); + + if (gst_video_color_matrix_get_Kr_Kb (in_yuv_info->colorimetry.matrix, + &Kr, &Kb)) { + guint S; + gdouble Sy, Suv; + gdouble Oy, Ouv; + gdouble vecR3, vecG3, vecB3; + + Kg = 1.0 - Kr - Kb; + + vecR0 = 1.0; + vecR1 = 0; + vecR2 = 2 * (1 - Kr); + + vecG0 = 1.0; + vecG1 = -(Kb / Kg) * 2 * (1 - Kb); + vecG2 = -(Kr / Kg) * 2 * (1 - Kr); + + vecB0 = 1.0; + vecB1 = 2 * (1 - Kb); + vecB2 = 0; + + /* Assume all components has the same bitdepth */ + S = (1 << in_yuv_info->finfo->depth0) - 1; + Sy = (gdouble) S / scale0; + Suv = (gdouble) S / scale1; + Oy = -((gdouble) offset0 / scale0); + Ouv = -((gdouble) offset1 / scale1); + + matrix->matrix00 = Sy * vecR0; + matrix->matrix10 = Sy * vecG0; + matrix->matrix20 = Sy * vecB0; + + matrix->matrix01 = Suv * vecR1; + matrix->matrix11 = Suv * vecG1; + matrix->matrix21 = Suv * vecB1; + + matrix->matrix02 = Suv * vecR2; + matrix->matrix12 = Suv * vecG2; + matrix->matrix22 = Suv * vecB2; + + matrix->offset0 = vecR0 * Oy + vecR1 * Ouv + vecR2 * Ouv; + matrix->offset1 = vecG0 * Oy + vecG1 * Ouv + vecG2 * Ouv; + matrix->offset2 = vecB0 * Oy + vecB1 * Ouv + vecB2 * Ouv; + + /* Apply RGB range scale matrix */ + if (out_rgb_info->colorimetry.range == GST_VIDEO_COLOR_RANGE_16_235) { + GstD3D11ColorMatrix scale_matrix, rst; + GstVideoInfo full_rgb = *out_rgb_info; + + full_rgb.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + + if (gst_d3d11_color_range_adjust_matrix_unorm (&full_rgb, + out_rgb_info, &scale_matrix)) { + /* Ms * Matrix */ + color_matrix_multiply (&rst, &scale_matrix, matrix); + + /* Ms * transform offsets */ + for (guint i = 0; i < 3; i++) { + gdouble val = 0; + for (guint j = 0; j < 3; j++) { + val += scale_matrix.matrixij * matrix->offsetj; + } + rst.offseti = val + scale_matrix.offseti; + } + + /* copy back to output matrix */ + for (guint i = 0; i < 3; i++) { + for (guint j = 0; j < 3; j++) { + matrix->matrixij = rst.matrixij; + } + matrix->offseti = rst.offseti; + matrix->mini = scale_matrix.mini; + matrix->maxi = scale_matrix.maxi; + } + } + } + } else { + /* Unknown matrix */ + matrix->matrix00 = 1.0; + matrix->matrix11 = 1.0; + matrix->matrix22 = 1.0; + } + + return TRUE; +} + +/** + * gst_d3d11_rgb_to_yuv_matrix_unorm: + * @in_rgb_info: a #GstVideoInfo of input RGB signal + * @out_yuv_info: a #GstVideoInfo of output YUV signal + * @matrix: a #GstD3D11ColorMatrix + * + * Calculates transform matrix from RGB to YUV conversion. Both input and output + * signals are in normalized 0.0..1.0 space and additional gamma decoding + * or primary/transfer function transform is not performed by this matrix. + * + * Resulting RGB values can be calculated by + * | Y' | | R' | | matrix.offset0 | + * | Cb | = clamp ( matrix.matrix * | G' | + | matrix.offset1 |, matrix.min, matrix.max ) + * | Cr | | B' | | matrix.offset2 | + * + * Returns: %TRUE if successful + */ +gboolean +gst_d3d11_rgb_to_yuv_matrix_unorm (const GstVideoInfo * in_rgb_info, + const GstVideoInfo * out_yuv_info, GstD3D11ColorMatrix * matrix) +{ + gint offset4, scale4; + gdouble Kr, Kb, Kg; + + g_return_val_if_fail (in_rgb_info != nullptr, FALSE); + g_return_val_if_fail (out_yuv_info != nullptr, FALSE); + g_return_val_if_fail (matrix != nullptr, FALSE); + + /* + * <Formula> + * + * Input: Unsigned normalized non-linear R'G'B'(unorm), 0.0..1.0 range + * Output: Unsigned normalized Y'CbCr(unorm), 0.0..1.0 range + * + * 1) R'G'B' to YPbPr + * | Y | | R' | + * | Pb | = M *| G' | + * | Pr | | B' | + * where + * | vecY | + * M = | vecU | + * | vecV | + * vecY = | Kr , Kg , Kb | + * vecU = | -0.5*Kr/(1-Kb), -0.5*Kg/(1-Kb), 0.5 | + * vecV = | 0.5 , -0.5*Kg/(1-Kr), -0.5*Kb(1-Kr) | + * + * 2) YPbPr to Y'CbCr(unorm) + * Y'(unorm) = (Y * scaleY + offsetY) / S + * Cb(unorm) = (Pb * scaleCbCr + offsetCbCr) / S + * Cr(unorm) = (Pr * scaleCbCr + offsetCbCr) / S + * => + * Y'(unorm) = (Y * scaleY / S) + (offsetY / S) + * Cb(unorm) = (Pb * scaleCbCr / S) + (offsetCbCr / S) + * Cr(unorm) = (Pb * scaleCbCr / S) + (offsetCbCr / S) + * where S = (2 ^ bitdepth) - 1 + * + * 3) RGB -> YUV matrix + * | Y'(unorm) | | R' | | offsetA | + * | Cb(unorm) | = Matrix * | G' | + | offsetB | + * | Cr(unorm) | | B' | | offsetC | + * + * where + * | (scaleY/S) * vecY | + * Matrix = | (scaleCbCr/S) * vecU | + * | (scaleCbCr/S) * vecV | + * + * offsetA = offsetY / S + * offsetB = offsetCbCr / S + * offsetC = offsetCbCr / S + * + * 4) Consider 16-235 scale RGB + * RGBstudio(16..235) -> RGBfull(0..255) matrix is represented by + * | Rf | | Rs | | Or | + * | Gf | = Ms | Gs | + | Og | + * | Bf | | Bs | | Ob | + * + * Combining all matrix into + * | Y'(unorm) | | Rs | | Or | | offsetA | + * | Cb(unorm) | = Matrix * ( Ms | Gs | + | Og | ) + | offsetB | + * | Cr(unorm) | | Bs | | Ob | | offsetC | + * + * | Rs | | Or | | offsetA | + * = Matrix * Ms | Gs | + Matrix | Og | + | offsetB | + * | Bs | | Ob | | offsetB | + */ + + memset (matrix, 0, sizeof (GstD3D11ColorMatrix)); + for (guint i = 0; i < 3; i++) + matrix->maxi = 1.0; + + gst_video_color_range_offsets (out_yuv_info->colorimetry.range, + out_yuv_info->finfo, offset, scale); + + if (gst_video_color_matrix_get_Kr_Kb (out_yuv_info->colorimetry.matrix, + &Kr, &Kb)) { + guint S; + gdouble Sy, Suv; + gdouble Oy, Ouv; + gdouble vecY3, vecU3, vecV3; + + Kg = 1.0 - Kr - Kb; + + vecY0 = Kr; + vecY1 = Kg; + vecY2 = Kb; + + vecU0 = -0.5 * Kr / (1 - Kb); + vecU1 = -0.5 * Kg / (1 - Kb); + vecU2 = 0.5; + + vecV0 = 0.5; + vecV1 = -0.5 * Kg / (1 - Kr); + vecV2 = -0.5 * Kb / (1 - Kr); + + /* Assume all components has the same bitdepth */ + S = (1 << out_yuv_info->finfo->depth0) - 1; + Sy = (gdouble) scale0 / S; + Suv = (gdouble) scale1 / S; + Oy = (gdouble) offset0 / S; + Ouv = (gdouble) offset1 / S; + + for (guint i = 0; i < 3; i++) { + matrix->matrix0i = Sy * vecYi; + matrix->matrix1i = Suv * vecUi; + matrix->matrix2i = Suv * vecVi; + } + + matrix->offset0 = Oy; + matrix->offset1 = Ouv; + matrix->offset2 = Ouv; + + matrix->min0 = Oy; + matrix->min1 = Oy; + matrix->min2 = Oy; + + matrix->max0 = ((gdouble) scale0 + offset0) / S; + matrix->max1 = ((gdouble) scale1 + offset0) / S; + matrix->max2 = ((gdouble) scale1 + offset0) / S; + + /* Apply RGB range scale matrix */ + if (in_rgb_info->colorimetry.range == GST_VIDEO_COLOR_RANGE_16_235) { + GstD3D11ColorMatrix scale_matrix, rst; + GstVideoInfo full_rgb = *in_rgb_info; + + full_rgb.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + + if (gst_d3d11_color_range_adjust_matrix_unorm (in_rgb_info, + &full_rgb, &scale_matrix)) { + /* Matrix * Ms */ + color_matrix_multiply (&rst, matrix, &scale_matrix); + + /* Matrix * scale offsets */ + for (guint i = 0; i < 3; i++) { + gdouble val = 0; + for (guint j = 0; j < 3; j++) { + val += matrix->matrixij * scale_matrix.offsetj; + } + rst.offseti = val + matrix->offseti; + } + + /* copy back to output matrix */ + for (guint i = 0; i < 3; i++) { + for (guint j = 0; j < 3; j++) { + matrix->matrixij = rst.matrixij; + } + matrix->offseti = rst.offseti; + } + } + } + } else { + /* Unknown matrix */ + matrix->matrix00 = 1.0; + matrix->matrix11 = 1.0; + matrix->matrix22 = 1.0; + } + + return TRUE; +} + +static gboolean +rgb_to_xyz_matrix (const GstVideoColorPrimariesInfo * info, + GstD3D11ColorMatrix * matrix) +{ + GstD3D11ColorMatrix m, im; + gdouble Sr, Sg, Sb; + gdouble Xw, Yw, Zw; + + if (info->Rx == 0 || info->Gx == 0 || info->By == 0 || info->Wy == 0) + return FALSE; + + color_matrix_identity (&m); + + m.matrix00 = info->Rx / info->Ry; + m.matrix10 = 1.0; + m.matrix20 = (1.0 - info->Rx - info->Ry) / info->Ry; + + m.matrix01 = info->Gx / info->Gy; + m.matrix11 = 1.0; + m.matrix21 = (1.0 - info->Gx - info->Gy) / info->Gy; + + m.matrix02 = info->Bx / info->By; + m.matrix12 = 1.0; + m.matrix22 = (1.0 - info->Bx - info->By) / info->By; + + if (!color_matrix_invert (&im, &m)) + return FALSE; + + Xw = info->Wx / info->Wy; + Yw = 1.0; + Zw = (1.0 - info->Wx - info->Wy) / info->Wy; + + Sr = im.matrix00 * Xw + im.matrix01 * Yw + im.matrix02 * Zw; + Sg = im.matrix10 * Xw + im.matrix11 * Yw + im.matrix12 * Zw; + Sb = im.matrix20 * Xw + im.matrix21 * Yw + im.matrix22 * Zw; + + for (guint i = 0; i < 3; i++) { + m.matrixi0 *= Sr; + m.matrixi1 *= Sg; + m.matrixi2 *= Sb; + } + + color_matrix_copy (matrix, &m); + + return TRUE; +} + +/** + * gst_d3d11_color_primaries_matrix_unorm: + * @in_info: a #GstVideoColorPrimariesInfo of input signal + * @out_info: a #GstVideoColorPrimariesInfo of output signal + * @matrix: a #GstD3D11ColorMatrix + * + * Calculates color primaries conversion matrix + * + * Resulting RGB values can be calculated by + * | Rout | | Rin | + * | Gout | = saturate ( matrix.matrix * | Gin | ) + * | Bout | | Bin | + * + * Returns: %TRUE if successful + */ +gboolean +gst_d3d11_color_primaries_matrix_unorm (const GstVideoColorPrimariesInfo * + in_info, const GstVideoColorPrimariesInfo * out_info, + GstD3D11ColorMatrix * matrix) +{ + GstD3D11ColorMatrix Ms, invMd, ret; + + g_return_val_if_fail (in_info != nullptr, FALSE); + g_return_val_if_fail (out_info != nullptr, FALSE); + g_return_val_if_fail (matrix != nullptr, FALSE); + + /* + * <Formula> + * + * 1) RGB -> XYZ conversion + * | X | | R | + * | Y | = M | G | + * | Z | | B | + * where + * | SrXr, SgXg, SbXb | + * M = | SrYr, SgYg, SbYb | + * | SrZr, SgZg, SbZb | + * + * Xr = xr / yr + * Yr = 1 + * Zr = (1 - xr - yr) / yr + * xr and yr are xy coordinates of red primary in the CIE 1931 color space. + * And its applied to G and B components + * + * | Sr | | Xr, Xg, Xb | | Xw | + * | Sg | = inv( | Yr, Yg, Yb | ) * | Yw | + * | Sb | | Zr, Zg, Zb | | Zw | + * + * 2) XYZsrc -> XYZdst conversion + * Apply chromatic adaptation + * | Xdst | | Xsrc | + * | Ydst | = Mc | Ysrc | + * | Zdst | | Zsrc | + * where + * | Xwdst / Xwsrc, 0 , 0 | + * Mc = | 0 , Ywdst / Ywsrc, 0 | + * | 0 , 0 , Zwdst / Zwsrc | + * + * where + * + * 3) Final matrix + * | Rd | | Rs | + * | Gd | = inv (Md) * Mc * Ms | Gs | + * | Bd | | Bs | + */ + + memset (matrix, 0, sizeof (GstD3D11ColorMatrix)); + for (guint i = 0; i < 3; i++) + matrix->maxi = 1.0; + + if (!rgb_to_xyz_matrix (in_info, &Ms)) { + GST_WARNING ("Failed to get src XYZ matrix"); + return FALSE; + } + + if (!rgb_to_xyz_matrix (out_info, &invMd) || + !color_matrix_invert (&invMd, &invMd)) { + GST_WARNING ("Failed to get dst XYZ matrix"); + return FALSE; + } + + if (in_info->Wx != out_info->Wx || in_info->Wy != out_info->Wy) { + GstD3D11ColorMatrix Mc; + + color_matrix_identity (&Mc); + Mc.matrix00 = (out_info->Wx / out_info->Wy) / + (in_info->Wx / in_info->Wy); + /* Yw == 1.0 */ + Mc.matrix22 = ((1.0 - out_info->Wx - out_info->Wy) / out_info->Wy) / + ((1.0 - in_info->Wx - in_info->Wy) / in_info->Wy); + + color_matrix_multiply (&ret, &Mc, &Ms); + } else { + color_matrix_copy (&ret, &Ms); + } + + color_matrix_multiply (&ret, &invMd, &ret); + color_matrix_copy (matrix, &ret); + + return TRUE; +}
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11format.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11format.h
Changed
@@ -17,8 +17,7 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __GST_D3D11_FORMAT_H__ -#define __GST_D3D11_FORMAT_H__ +#pragma once #include <gst/gst.h> #include <gst/video/video.h> @@ -26,24 +25,13 @@ G_BEGIN_DECLS -#define GST_D3D11_COMMON_FORMATS \ - "BGRA, RGBA, RGB10A2_LE, BGRx, RGBx, VUYA, NV12, NV21, " \ - "P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, " \ - "Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, " \ - "GRAY8, GRAY16_LE" - -#define GST_D3D11_EXTRA_IN_FORMATS \ - "Y410" - -#define GST_D3D11_SINK_FORMATS \ - "{ " GST_D3D11_COMMON_FORMATS " ," GST_D3D11_EXTRA_IN_FORMATS " }" - -#define GST_D3D11_SRC_FORMATS \ - "{ " GST_D3D11_COMMON_FORMATS " }" - -#define GST_D3D11_ALL_FORMATS \ - "{ " GST_D3D11_COMMON_FORMATS " ," GST_D3D11_EXTRA_IN_FORMATS " }" - +/** + * GstD3D11Format: + * + * Represent video format information in Direct3D11 term. + * + * Since: 1.22 + */ struct _GstD3D11Format { GstVideoFormat format; @@ -54,14 +42,20 @@ /* formats for texture processing */ DXGI_FORMAT resource_formatGST_VIDEO_MAX_PLANES; + /* extra format used for unordered access view (unused) */ + DXGI_FORMAT uav_formatGST_VIDEO_MAX_PLANES; + + /* D3D11_FORMAT_SUPPORT flags */ + guint format_supportGST_VIDEO_MAX_PLANES; + + /* D3D11_FORMAT_SUPPORT2 flags (unused) */ + guint format_support2GST_VIDEO_MAX_PLANES; + /*< private >*/ - gpointer _gst_reservedGST_PADDING; + guint paddingGST_PADDING_LARGE; }; GST_D3D11_API -guint gst_d3d11_dxgi_format_n_planes (DXGI_FORMAT format); - -GST_D3D11_API gboolean gst_d3d11_dxgi_format_get_size (DXGI_FORMAT format, guint width, guint height, @@ -73,6 +67,26 @@ GST_D3D11_API GstVideoFormat gst_d3d11_dxgi_format_to_gst (DXGI_FORMAT format); +GST_D3D11_API +void gst_d3d11_format_init (GstD3D11Format * format); + +GST_D3D11_API +guint gst_d3d11_dxgi_format_get_resource_format (DXGI_FORMAT format, + DXGI_FORMAT resource_formatGST_VIDEO_MAX_PLANES); + +GST_D3D11_API +guint gst_d3d11_dxgi_format_get_alignment (DXGI_FORMAT format); + +GST_D3D11_API +const gchar * gst_d3d11_dxgi_format_to_string (DXGI_FORMAT format); + +GST_D3D11_API +gboolean gst_video_info_to_dxgi_color_space (const GstVideoInfo * info, + DXGI_COLOR_SPACE_TYPE * color_space); + +GST_D3D11_API +gboolean gst_video_info_apply_dxgi_color_space (DXGI_COLOR_SPACE_TYPE color_space, + GstVideoInfo * info); + G_END_DECLS -#endif /* __GST_D3D11_FORMAT_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11memory.cpp -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11memory.cpp
Changed
@@ -26,12 +26,79 @@ #include "gstd3d11memory.h" #include "gstd3d11device.h" #include "gstd3d11utils.h" -#include "gstd3d11_private.h" +#include "gstd3d11-private.h" + +/** + * SECTION:gstd3d11memory + * @title: GstD3D11Memory + * @short_description: Direct3D11 memory abstraction layer + * + * Since: 1.22 + */ GST_DEBUG_CATEGORY_STATIC (gst_d3d11_allocator_debug); #define GST_CAT_DEFAULT gst_d3d11_allocator_debug -static GstAllocator *_d3d11_memory_allocator; +static GstD3D11Allocator *_d3d11_memory_allocator; + +GType +gst_d3d11_allocation_flags_get_type (void) +{ + static GType type = 0; + static const GFlagsValue values = { + {GST_D3D11_ALLOCATION_FLAG_DEFAULT, "GST_D3D11_ALLOCATION_FLAG_DEFAULT", + "default"}, + {GST_D3D11_ALLOCATION_FLAG_TEXTURE_ARRAY, + "GST_D3D11_ALLOCATION_FLAG_TEXTURE_ARRAY", "texture-array"}, + {0, nullptr, nullptr} + }; + + GST_D3D11_CALL_ONCE_BEGIN { + type = g_flags_register_static ("GstD3D11AllocationFlags", values); + } GST_D3D11_CALL_ONCE_END; + + return type; +} + +GType +gst_d3d11_memory_transfer_get_type (void) +{ + static GType type = 0; + static const GFlagsValue values = { + {GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD, + "GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD", "need-download"}, + {GST_D3D11_MEMORY_TRANSFER_NEED_UPLOAD, + "GST_D3D11_MEMORY_TRANSFER_NEED_UPLOAD", "need-upload"}, + {0, nullptr, nullptr} + }; + + GST_D3D11_CALL_ONCE_BEGIN { + type = g_flags_register_static ("GstD3D11MemoryTransfer", values); + } GST_D3D11_CALL_ONCE_END; + + return type; +} + +GType +gst_d3d11_memory_native_type_get_type (void) +{ + static GType type = 0; + static const GEnumValue values = { + {GST_D3D11_MEMORY_NATIVE_TYPE_INVALID, + "GST_D3D11_MEMORY_NATIVE_TYPE_INVALID", "invalid"}, + {GST_D3D11_MEMORY_NATIVE_TYPE_BUFFER, "GST_D3D11_MEMORY_NATIVE_TYPE_BUFFER", + "buffer"}, + {GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D, + "GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D", "texture-2d"}, + {0, nullptr, nullptr} + }; + + GST_D3D11_CALL_ONCE_BEGIN { + type = g_enum_register_static ("GstD3D11MemoryNativeType", values); + } GST_D3D11_CALL_ONCE_END; + + return type; +} /* GstD3D11AllocationParams */ static void gst_d3d11_allocation_params_init (GType type); @@ -46,29 +113,30 @@ * @device: a #GstD3D11Device * @info: a #GstVideoInfo * @flags: a #GstD3D11AllocationFlags - * @bind_flags: D3D11_BIND_FLAG value used for creating Direct3D11 texture + * @bind_flags: D3D11_BIND_FLAG value used for creating texture + * @misc_flags: D3D11_RESOURCE_MISC_FLAG value used for creating texture * * Create #GstD3D11AllocationParams object which is used by #GstD3D11BufferPool * and #GstD3D11Allocator in order to allocate new ID3D11Texture2D * object with given configuration * - * Returns: a #GstD3D11AllocationParams or %NULL if @info is not supported + * Returns: (transfer full) (nullable): a #GstD3D11AllocationParams or %NULL if @info is not supported * - * Since: 1.20 + * Since: 1.22 */ GstD3D11AllocationParams * -gst_d3d11_allocation_params_new (GstD3D11Device * device, GstVideoInfo * info, - GstD3D11AllocationFlags flags, guint bind_flags) +gst_d3d11_allocation_params_new (GstD3D11Device * device, + const GstVideoInfo * info, GstD3D11AllocationFlags flags, guint bind_flags, + guint misc_flags) { GstD3D11AllocationParams *ret; - const GstD3D11Format *d3d11_format; + GstD3D11Format d3d11_format; guint i; g_return_val_if_fail (info != NULL, NULL); - d3d11_format = gst_d3d11_device_format_from_gst (device, - GST_VIDEO_INFO_FORMAT (info)); - if (!d3d11_format) { + if (!gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (info), + &d3d11_format)) { GST_WARNING ("Couldn't get d3d11 format"); return NULL; } @@ -93,30 +161,32 @@ */ /* If corresponding dxgi format is undefined, use resource format instead */ - if (d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) { + if (d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) { for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) { - g_assert (d3d11_format->resource_formati != DXGI_FORMAT_UNKNOWN); + g_assert (d3d11_format.resource_formati != DXGI_FORMAT_UNKNOWN); ret->desci.Width = GST_VIDEO_INFO_COMP_WIDTH (info, i); ret->desci.Height = GST_VIDEO_INFO_COMP_HEIGHT (info, i); ret->desci.MipLevels = 1; ret->desci.ArraySize = 1; - ret->desci.Format = d3d11_format->resource_formati; + ret->desci.Format = d3d11_format.resource_formati; ret->desci.SampleDesc.Count = 1; ret->desci.SampleDesc.Quality = 0; ret->desci.Usage = D3D11_USAGE_DEFAULT; ret->desci.BindFlags = bind_flags; + ret->desci.MiscFlags = misc_flags; } } else { ret->desc0.Width = GST_VIDEO_INFO_WIDTH (info); ret->desc0.Height = GST_VIDEO_INFO_HEIGHT (info); ret->desc0.MipLevels = 1; ret->desc0.ArraySize = 1; - ret->desc0.Format = d3d11_format->dxgi_format; + ret->desc0.Format = d3d11_format.dxgi_format; ret->desc0.SampleDesc.Count = 1; ret->desc0.SampleDesc.Quality = 0; ret->desc0.Usage = D3D11_USAGE_DEFAULT; ret->desc0.BindFlags = bind_flags; + ret->desc0.MiscFlags = misc_flags; } ret->flags = flags; @@ -134,11 +204,11 @@ * * Returns: %TRUE if alignment could be applied * - * Since: 1.20 + * Since: 1.22 */ gboolean gst_d3d11_allocation_params_alignment (GstD3D11AllocationParams * params, - GstVideoAlignment * align) + const GstVideoAlignment * align) { guint i; guint padding_width, padding_height; @@ -175,9 +245,9 @@ * gst_d3d11_allocation_params_copy: * @src: a #GstD3D11AllocationParams * - * Returns: a copy of @src + * Returns: (transfer full): a copy of @src * - * Since: 1.20 + * Since: 1.22 */ GstD3D11AllocationParams * gst_d3d11_allocation_params_copy (GstD3D11AllocationParams * src) @@ -198,7 +268,7 @@ * * Free @params * - * Since: 1.20 + * Since: 1.22 */ void gst_d3d11_allocation_params_free (GstD3D11AllocationParams * params) @@ -233,26 +303,26 @@ /* GstD3D11Memory */ #define GST_D3D11_MEMORY_GET_LOCK(m) (&(GST_D3D11_MEMORY_CAST(m)->priv->lock)) -#define GST_D3D11_MEMORY_LOCK(m) G_STMT_START { \ - GST_TRACE("Locking %p from thread %p", (m), g_thread_self()); \ - g_mutex_lock(GST_D3D11_MEMORY_GET_LOCK(m)); \ - GST_TRACE("Locked %p from thread %p", (m), g_thread_self()); \ -} G_STMT_END - -#define GST_D3D11_MEMORY_UNLOCK(m) G_STMT_START { \ - GST_TRACE("Unlocking %p from thread %p", (m), g_thread_self()); \ - g_mutex_unlock(GST_D3D11_MEMORY_GET_LOCK(m)); \ -} G_STMT_END struct _GstD3D11MemoryPrivate { ID3D11Texture2D *texture; - ID3D11Texture2D *staging; + ID3D11Buffer *buffer; + + GstD3D11MemoryNativeType native_type; D3D11_TEXTURE2D_DESC desc; + D3D11_BUFFER_DESC buffer_desc; guint subresource_index; + /* protected by device lock */ + ID3D11Resource *staging; + D3D11_MAPPED_SUBRESOURCE map; + gint cpu_map_count; + + /* protects resource objects */ + SRWLOCK lock; ID3D11ShaderResourceView *shader_resource_viewGST_VIDEO_MAX_PLANES; guint num_shader_resource_views; @@ -265,15 +335,10 @@ ID3D11VideoProcessorInputView *processor_input_view; ID3D11VideoProcessorOutputView *processor_output_view; - D3D11_MAPPED_SUBRESOURCE map; - - - GMutex lock; - gint cpu_map_count; + GDestroyNotify notify; + gpointer user_data; }; -GST_DEFINE_MINI_OBJECT_TYPE (GstD3D11Memory, gst_d3d11_memory); - static inline D3D11_MAP gst_d3d11_map_flags_to_d3d11 (GstMapFlags flags) { @@ -322,11 +387,10 @@ { GstD3D11MemoryPrivate *priv = dmem->priv; HRESULT hr; - ID3D11Resource *staging = (ID3D11Resource *) priv->staging; ID3D11DeviceContext *device_context = gst_d3d11_device_get_device_context_handle (dmem->device); - hr = device_context->Map (staging, 0, map_type, 0, &priv->map); + hr = device_context->Map (priv->staging, 0, map_type, 0, &priv->map); if (!gst_d3d11_result (hr, dmem->device)) { GST_ERROR_OBJECT (GST_MEMORY_CAST (dmem)->allocator, @@ -344,7 +408,7 @@ GstD3D11MemoryPrivate *priv = dmem->priv; ID3D11DeviceContext *device_context; - if (!priv->staging || priv->staging == priv->texture || + if (!priv->staging || !GST_MEMORY_FLAG_IS_SET (dmem, GST_D3D11_MEMORY_TRANSFER_NEED_UPLOAD)) return; @@ -360,7 +424,7 @@ GstD3D11MemoryPrivate *priv = dmem->priv; ID3D11DeviceContext *device_context; - if (!priv->staging || priv->staging == priv->texture || + if (!priv->staging || !GST_MEMORY_FLAG_IS_SET (dmem, GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD)) return; @@ -375,45 +439,54 @@ GstD3D11Memory *dmem = GST_D3D11_MEMORY_CAST (mem); GstD3D11MemoryPrivate *priv = dmem->priv; GstMapFlags flags = info->flags; - gpointer ret = NULL; + GstD3D11DeviceLockGuard lk (dmem->device); - gst_d3d11_device_lock (dmem->device); - GST_D3D11_MEMORY_LOCK (dmem); + memset (info->user_data, 0, sizeof (info->user_data)); + info->user_data0 = GUINT_TO_POINTER (dmem->priv->subresource_index); if ((flags & GST_MAP_D3D11) == GST_MAP_D3D11) { - gst_d3d11_memory_upload (dmem); - GST_MEMORY_FLAG_UNSET (dmem, GST_D3D11_MEMORY_TRANSFER_NEED_UPLOAD); + if (priv->native_type == GST_D3D11_MEMORY_NATIVE_TYPE_BUFFER) { + /* FIXME: handle non-staging buffer */ + g_assert (priv->buffer != nullptr); + return priv->buffer; + } else { + gst_d3d11_memory_upload (dmem); + GST_MEMORY_FLAG_UNSET (dmem, GST_D3D11_MEMORY_TRANSFER_NEED_UPLOAD); - if ((flags & GST_MAP_WRITE) == GST_MAP_WRITE) - GST_MINI_OBJECT_FLAG_SET (dmem, GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD); + if ((flags & GST_MAP_WRITE) == GST_MAP_WRITE) + GST_MINI_OBJECT_FLAG_SET (dmem, + GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD); - g_assert (priv->texture != NULL); - ret = priv->texture; - goto out; + g_assert (priv->texture != NULL); + return priv->texture; + } } if (priv->cpu_map_count == 0) { D3D11_MAP map_type; - /* Allocate staging texture for CPU access */ - if (!priv->staging) { - priv->staging = gst_d3d11_allocate_staging_texture (dmem->device, - &priv->desc); + /* FIXME: handle non-staging buffer */ + if (priv->native_type == GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D) { + /* Allocate staging texture for CPU access */ if (!priv->staging) { - GST_ERROR_OBJECT (mem->allocator, "Couldn't create staging texture"); - goto out; + priv->staging = gst_d3d11_allocate_staging_texture (dmem->device, + &priv->desc); + if (!priv->staging) { + GST_ERROR_OBJECT (mem->allocator, "Couldn't create staging texture"); + return nullptr; + } + + /* first memory, always need download to staging */ + GST_MINI_OBJECT_FLAG_SET (mem, GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD); } - /* first memory, always need download to staging */ - GST_MINI_OBJECT_FLAG_SET (mem, GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD); + gst_d3d11_memory_download (dmem); } - gst_d3d11_memory_download (dmem); map_type = gst_d3d11_map_flags_to_d3d11 (flags); - if (!gst_d3d11_memory_map_cpu_access (dmem, map_type)) { GST_ERROR_OBJECT (mem->allocator, "Couldn't map staging texture"); - goto out; + return nullptr; } } @@ -424,13 +497,7 @@ GST_MEMORY_FLAG_UNSET (mem, GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD); priv->cpu_map_count++; - ret = dmem->priv->map.pData; - -out: - GST_D3D11_MEMORY_UNLOCK (dmem); - gst_d3d11_device_unlock (dmem->device); - - return ret; + return dmem->priv->map.pData; } /* Must be called with d3d11 device lock */ @@ -438,11 +505,10 @@ gst_d3d11_memory_unmap_cpu_access (GstD3D11Memory * dmem) { GstD3D11MemoryPrivate *priv = dmem->priv; - ID3D11Resource *staging = (ID3D11Resource *) priv->staging; ID3D11DeviceContext *device_context = gst_d3d11_device_get_device_context_handle (dmem->device); - device_context->Unmap (staging, 0); + device_context->Unmap (priv->staging, 0); } static void @@ -450,15 +516,13 @@ { GstD3D11Memory *dmem = GST_D3D11_MEMORY_CAST (mem); GstD3D11MemoryPrivate *priv = dmem->priv; - - gst_d3d11_device_lock (dmem->device); - GST_D3D11_MEMORY_LOCK (dmem); + GstD3D11DeviceLockGuard lk (dmem->device); if ((info->flags & GST_MAP_D3D11) == GST_MAP_D3D11) { if ((info->flags & GST_MAP_WRITE) == GST_MAP_WRITE) GST_MINI_OBJECT_FLAG_SET (mem, GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD); - goto out; + return; } if ((info->flags & GST_MAP_WRITE) == GST_MAP_WRITE) @@ -466,13 +530,9 @@ priv->cpu_map_count--; if (priv->cpu_map_count > 0) - goto out; + return; gst_d3d11_memory_unmap_cpu_access (dmem); - -out: - GST_D3D11_MEMORY_UNLOCK (dmem); - gst_d3d11_device_unlock (dmem->device); } static GstMemory * @@ -491,7 +551,6 @@ gint strideGST_VIDEO_MAX_PLANES; gsize size; D3D11_TEXTURE2D_DESC *desc = &priv->desc; - gboolean ret = FALSE; if (!priv->staging) { priv->staging = gst_d3d11_allocate_staging_texture (dmem->device, @@ -500,11 +559,9 @@ GST_ERROR_OBJECT (mem->allocator, "Couldn't create staging texture"); return FALSE; } - - GST_MINI_OBJECT_FLAG_SET (mem, GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD); } - gst_d3d11_device_lock (dmem->device); + GstD3D11DeviceLockGuard lk (dmem->device); if (!gst_d3d11_memory_map_cpu_access (dmem, D3D11_MAP_READ_WRITE)) { GST_ERROR_OBJECT (mem->allocator, "Couldn't map staging texture"); return FALSE; @@ -515,15 +572,14 @@ if (!gst_d3d11_dxgi_format_get_size (desc->Format, desc->Width, desc->Height, priv->map.RowPitch, offset, stride, &size)) { GST_ERROR_OBJECT (mem->allocator, "Couldn't calculate memory size"); - goto out; + GST_D3D11_CLEAR_COM (priv->staging); + return FALSE; } + GST_D3D11_CLEAR_COM (priv->staging); mem->maxsize = mem->size = size; - ret = TRUE; -out: - gst_d3d11_device_unlock (dmem->device); - return ret; + return TRUE; } /** @@ -532,7 +588,7 @@ * * Returns: whether @mem is a #GstD3D11Memory * - * Since: 1.20 + * Since: 1.22 */ gboolean gst_is_d3d11_memory (GstMemory * mem) @@ -543,48 +599,72 @@ } /** + * gst_d3d11_memory_get_native_type: + * @mem: a #GstD3D11Memory + * + * Returns: a #GstD3D11MemoryNativeType + * + * Since: 1.22 + */ +GstD3D11MemoryNativeType +gst_d3d11_memory_get_native_type (GstD3D11Memory * mem) +{ + if (!gst_is_d3d11_memory (GST_MEMORY_CAST (mem))) + return GST_D3D11_MEMORY_NATIVE_TYPE_INVALID; + + return mem->priv->native_type; +} + +/** * gst_d3d11_memory_init_once: * * Initializes the Direct3D11 Texture allocator. It is safe to call * this function multiple times. This must be called before any other * GstD3D11Memory operation. * - * Since: 1.20 + * Since: 1.22 */ void gst_d3d11_memory_init_once (void) { - static gsize _init = 0; - - if (g_once_init_enter (&_init)) { - + GST_D3D11_CALL_ONCE_BEGIN { GST_DEBUG_CATEGORY_INIT (gst_d3d11_allocator_debug, "d3d11allocator", 0, "Direct3D11 Texture Allocator"); _d3d11_memory_allocator = - (GstAllocator *) g_object_new (GST_TYPE_D3D11_ALLOCATOR, NULL); + (GstD3D11Allocator *) g_object_new (GST_TYPE_D3D11_ALLOCATOR, NULL); gst_object_ref_sink (_d3d11_memory_allocator); + gst_object_ref (_d3d11_memory_allocator); - gst_allocator_register (GST_D3D11_MEMORY_NAME, _d3d11_memory_allocator); - g_once_init_leave (&_init, 1); - } + gst_allocator_register (GST_D3D11_MEMORY_NAME, + GST_ALLOCATOR_CAST (_d3d11_memory_allocator)); + } GST_D3D11_CALL_ONCE_END; } /** - * gst_d3d11_memory_get_texture_handle: + * gst_d3d11_memory_get_resource_handle: * @mem: a #GstD3D11Memory * - * Returns: (transfer none): a ID3D11Texture2D handle. Caller must not release + * Returns: (transfer none) (nullable): a ID3D11Resource handle. Caller must not release * returned handle. * - * Since: 1.20 + * Since: 1.22 */ -ID3D11Texture2D * -gst_d3d11_memory_get_texture_handle (GstD3D11Memory * mem) +ID3D11Resource * +gst_d3d11_memory_get_resource_handle (GstD3D11Memory * mem) { g_return_val_if_fail (gst_is_d3d11_memory (GST_MEMORY_CAST (mem)), NULL); - return mem->priv->texture; + switch (mem->priv->native_type) { + case GST_D3D11_MEMORY_NATIVE_TYPE_BUFFER: + return mem->priv->buffer; + case GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D: + return mem->priv->texture; + default: + break; + } + + return nullptr; } /** @@ -593,13 +673,16 @@ * * Returns: subresource index corresponding to @mem. * - * Since: 1.20 + * Since: 1.22 */ guint gst_d3d11_memory_get_subresource_index (GstD3D11Memory * mem) { g_return_val_if_fail (gst_is_d3d11_memory (GST_MEMORY_CAST (mem)), 0); + if (mem->priv->native_type != GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D) + return 0; + return mem->priv->subresource_index; } @@ -612,7 +695,7 @@ * * Returns: %TRUE if successeed * - * Since: 1.20 + * Since: 1.22 */ gboolean gst_d3d11_memory_get_texture_desc (GstD3D11Memory * mem, @@ -621,13 +704,51 @@ g_return_val_if_fail (gst_is_d3d11_memory (GST_MEMORY_CAST (mem)), FALSE); g_return_val_if_fail (desc != NULL, FALSE); + if (mem->priv->native_type != GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D) + return FALSE; + *desc = mem->priv->desc; return TRUE; } +/** + * gst_d3d11_memory_get_buffer_desc: + * @mem: a #GstD3D11Memory + * @desc: (out): a D3D11_BUFFER_DESC + * + * Fill @desc with D3D11_BUFFER_DESC for ID3D11Buffer + * + * Returns: %TRUE if successeed + * + * Since: 1.22 + */ +gboolean +gst_d3d11_memory_get_buffer_desc (GstD3D11Memory * mem, + D3D11_BUFFER_DESC * desc) +{ + g_return_val_if_fail (gst_is_d3d11_memory (GST_MEMORY_CAST (mem)), FALSE); + g_return_val_if_fail (desc != NULL, FALSE); + + if (mem->priv->native_type != GST_D3D11_MEMORY_NATIVE_TYPE_BUFFER) + return FALSE; + + *desc = mem->priv->buffer_desc; + + return TRUE; +} + +/** + * gst_d3d11_memory_get_resource_stride: + * @mem: a #GstD3D11Memory + * @stride: (out): stride of resource + * + * Returns: %TRUE if successeed + * + * Since: 1.22 + */ gboolean -gst_d3d11_memory_get_texture_stride (GstD3D11Memory * mem, guint * stride) +gst_d3d11_memory_get_resource_stride (GstD3D11Memory * mem, guint * stride) { g_return_val_if_fail (gst_is_d3d11_memory (GST_MEMORY_CAST (mem)), FALSE); g_return_val_if_fail (stride != NULL, FALSE); @@ -652,51 +773,16 @@ device_handle = gst_d3d11_device_get_device_handle (mem->device); - switch (priv->desc.Format) { - case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R10G10B10A2_UNORM: - case DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT_R8G8_UNORM: - case DXGI_FORMAT_R16_UNORM: - case DXGI_FORMAT_R16G16_UNORM: - case DXGI_FORMAT_G8R8_G8B8_UNORM: - case DXGI_FORMAT_R8G8_B8G8_UNORM: - case DXGI_FORMAT_R16G16B16A16_UNORM: - num_views = 1; - formats0 = priv->desc.Format; - break; - case DXGI_FORMAT_AYUV: - case DXGI_FORMAT_YUY2: - num_views = 1; - formats0 = DXGI_FORMAT_R8G8B8A8_UNORM; - break; - case DXGI_FORMAT_NV12: - num_views = 2; - formats0 = DXGI_FORMAT_R8_UNORM; - formats1 = DXGI_FORMAT_R8G8_UNORM; - break; - case DXGI_FORMAT_P010: - case DXGI_FORMAT_P016: - num_views = 2; - formats0 = DXGI_FORMAT_R16_UNORM; - formats1 = DXGI_FORMAT_R16G16_UNORM; - break; - case DXGI_FORMAT_Y210: - num_views = 1; - formats0 = DXGI_FORMAT_R16G16B16A16_UNORM; - break; - case DXGI_FORMAT_Y410: - num_views = 1; - formats0 = DXGI_FORMAT_R10G10B10A2_UNORM; - break; - default: - g_assert_not_reached (); - return FALSE; + num_views = gst_d3d11_dxgi_format_get_resource_format (priv->desc.Format, + formats); + if (!num_views) { + GST_ERROR_OBJECT (GST_MEMORY_CAST (mem)->allocator, + "Unknown resource formats for DXGI format %s (%d)", + gst_d3d11_dxgi_format_to_string (priv->desc.Format), priv->desc.Format); + return FALSE; } - if ((priv->desc.BindFlags & D3D11_BIND_SHADER_RESOURCE) == - D3D11_BIND_SHADER_RESOURCE) { + if ((priv->desc.BindFlags & D3D11_BIND_SHADER_RESOURCE) != 0) { resource_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; resource_desc.Texture2D.MipLevels = 1; @@ -707,7 +793,9 @@ if (!gst_d3d11_result (hr, mem->device)) { GST_ERROR_OBJECT (GST_MEMORY_CAST (mem)->allocator, - "Failed to create %dth resource view (0x%x)", i, (guint) hr); + "Failed to create resource DXGI format %s (%d) for plane %d" + " view (0x%x)", gst_d3d11_dxgi_format_to_string (formatsi), + formatsi, i, (guint) hr); goto error; } } @@ -732,7 +820,9 @@ gst_d3d11_memory_ensure_shader_resource_view (GstD3D11Memory * mem) { GstD3D11MemoryPrivate *priv = mem->priv; - gboolean ret = FALSE; + + if (mem->priv->native_type != GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D) + return FALSE; if (!(priv->desc.BindFlags & D3D11_BIND_SHADER_RESOURCE)) { GST_LOG_OBJECT (GST_MEMORY_CAST (mem)->allocator, @@ -740,18 +830,11 @@ return FALSE; } - GST_D3D11_MEMORY_LOCK (mem); - if (priv->num_shader_resource_views) { - ret = TRUE; - goto done; - } - - ret = create_shader_resource_views (mem); - -done: - GST_D3D11_MEMORY_UNLOCK (mem); + GstD3D11SRWLockGuard lk (GST_D3D11_MEMORY_GET_LOCK (mem)); + if (priv->num_shader_resource_views) + return TRUE; - return ret; + return create_shader_resource_views (mem); } /** @@ -761,7 +844,7 @@ * Returns: the number of ID3D11ShaderResourceView that can be used * for processing GPU operation with @mem * - * Since: 1.20 + * Since: 1.22 */ guint gst_d3d11_memory_get_shader_resource_view_size (GstD3D11Memory * mem) @@ -783,7 +866,7 @@ * ID3D11ShaderResourceView or %NULL if ID3D11ShaderResourceView is unavailable * for @index * - * Since: 1.20 + * Since: 1.22 */ ID3D11ShaderResourceView * gst_d3d11_memory_get_shader_resource_view (GstD3D11Memory * mem, guint index) @@ -820,39 +903,16 @@ device_handle = gst_d3d11_device_get_device_handle (mem->device); - switch (priv->desc.Format) { - case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R10G10B10A2_UNORM: - case DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT_R8G8_UNORM: - case DXGI_FORMAT_R16_UNORM: - case DXGI_FORMAT_R16G16_UNORM: - num_views = 1; - formats0 = priv->desc.Format; - break; - case DXGI_FORMAT_AYUV: - num_views = 1; - formats0 = DXGI_FORMAT_R8G8B8A8_UNORM; - break; - case DXGI_FORMAT_NV12: - num_views = 2; - formats0 = DXGI_FORMAT_R8_UNORM; - formats1 = DXGI_FORMAT_R8G8_UNORM; - break; - case DXGI_FORMAT_P010: - case DXGI_FORMAT_P016: - num_views = 2; - formats0 = DXGI_FORMAT_R16_UNORM; - formats1 = DXGI_FORMAT_R16G16_UNORM; - break; - default: - g_assert_not_reached (); - return FALSE; + num_views = gst_d3d11_dxgi_format_get_resource_format (priv->desc.Format, + formats); + if (!num_views) { + GST_ERROR_OBJECT (GST_MEMORY_CAST (mem)->allocator, + "Unknown resource formats for DXGI format %s (%d)", + gst_d3d11_dxgi_format_to_string (priv->desc.Format), priv->desc.Format); + return FALSE; } - if ((priv->desc.BindFlags & D3D11_BIND_RENDER_TARGET) == - D3D11_BIND_RENDER_TARGET) { + if ((priv->desc.BindFlags & D3D11_BIND_RENDER_TARGET) != 0) { render_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; render_desc.Texture2D.MipSlice = 0; @@ -863,7 +923,9 @@ &priv->render_target_viewi); if (!gst_d3d11_result (hr, mem->device)) { GST_ERROR_OBJECT (GST_MEMORY_CAST (mem)->allocator, - "Failed to create %dth render target view (0x%x)", i, (guint) hr); + "Failed to create resource DXGI format %s (%d) for plane %d" + " view (0x%x)", gst_d3d11_dxgi_format_to_string (formatsi), + formatsi, i, (guint) hr); goto error; } } @@ -888,7 +950,9 @@ gst_d3d11_memory_ensure_render_target_view (GstD3D11Memory * mem) { GstD3D11MemoryPrivate *priv = mem->priv; - gboolean ret = FALSE; + + if (mem->priv->native_type != GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D) + return FALSE; if (!(priv->desc.BindFlags & D3D11_BIND_RENDER_TARGET)) { GST_WARNING_OBJECT (GST_MEMORY_CAST (mem)->allocator, @@ -896,18 +960,11 @@ return FALSE; } - GST_D3D11_MEMORY_LOCK (mem); - if (priv->num_render_target_views) { - ret = TRUE; - goto done; - } - - ret = create_render_target_views (mem); - -done: - GST_D3D11_MEMORY_UNLOCK (mem); + GstD3D11SRWLockGuard lk (GST_D3D11_MEMORY_GET_LOCK (mem)); + if (priv->num_render_target_views) + return TRUE; - return ret; + return create_render_target_views (mem); } /** @@ -917,7 +974,7 @@ * Returns: the number of ID3D11RenderTargetView that can be used * for processing GPU operation with @mem * - * Since: 1.20 + * Since: 1.22 */ guint gst_d3d11_memory_get_render_target_view_size (GstD3D11Memory * mem) @@ -939,7 +996,7 @@ * ID3D11RenderTargetView or %NULL if ID3D11RenderTargetView is unavailable * for @index * - * Since: 1.20 + * Since: 1.22 */ ID3D11RenderTargetView * gst_d3d11_memory_get_render_target_view (GstD3D11Memory * mem, guint index) @@ -970,7 +1027,9 @@ GstD3D11Allocator *allocator; D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC desc; HRESULT hr; - gboolean ret = FALSE; + + if (mem->priv->native_type != GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D) + return FALSE; allocator = GST_D3D11_ALLOCATOR (GST_MEMORY_CAST (mem)->allocator); @@ -980,12 +1039,12 @@ return FALSE; } - GST_D3D11_MEMORY_LOCK (mem); + GstD3D11SRWLockGuard lk (GST_D3D11_MEMORY_GET_LOCK (mem)); if (dmem_priv->decoder_output_view) { dmem_priv->decoder_output_view->GetDesc (&desc); if (IsEqualGUID (desc.DecodeProfile, *decoder_profile) && dmem_priv->decoder_handle == decoder) { - goto succeeded; + return TRUE; } else { /* Shouldn't happen, but try again anyway */ GST_WARNING_OBJECT (allocator, @@ -995,9 +1054,6 @@ } } - if (dmem_priv->decoder_output_view) - goto succeeded; - desc.DecodeProfile = *decoder_profile; desc.ViewDimension = D3D11_VDOV_DIMENSION_TEXTURE2D; desc.Texture2D.ArraySlice = dmem_priv->subresource_index; @@ -1007,7 +1063,7 @@ if (!gst_d3d11_result (hr, mem->device)) { GST_ERROR_OBJECT (allocator, "Could not create decoder output view, hr: 0x%x", (guint) hr); - goto done; + return FALSE; } /* XXX: decoder output view is bound to video device, not decoder handle @@ -1016,13 +1072,7 @@ dmem_priv->decoder_handle = decoder; decoder->AddRef (); -succeeded: - ret = TRUE; - -done: - GST_D3D11_MEMORY_UNLOCK (mem); - - return ret; + return TRUE; } /** @@ -1036,7 +1086,7 @@ * ID3D11VideoDecoderOutputView or %NULL if ID3D11VideoDecoderOutputView is * unavailable * - * Since: 1.20 + * Since: 1.22 */ ID3D11VideoDecoderOutputView * gst_d3d11_memory_get_decoder_output_view (GstD3D11Memory * mem, @@ -1080,7 +1130,9 @@ GstD3D11Allocator *allocator; D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC desc; HRESULT hr; - gboolean ret = FALSE; + + if (mem->priv->native_type != GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D) + return FALSE; allocator = GST_D3D11_ALLOCATOR (GST_MEMORY_CAST (mem)->allocator); @@ -1090,9 +1142,9 @@ return FALSE; } - GST_D3D11_MEMORY_LOCK (mem); + GstD3D11SRWLockGuard lk (GST_D3D11_MEMORY_GET_LOCK (mem)); if (dmem_priv->processor_input_view) - goto succeeded; + return TRUE; desc.FourCC = 0; desc.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D; @@ -1104,16 +1156,10 @@ if (!gst_d3d11_result (hr, mem->device)) { GST_ERROR_OBJECT (allocator, "Could not create processor input view, hr: 0x%x", (guint) hr); - goto done; + return FALSE; } -succeeded: - ret = TRUE; - -done: - GST_D3D11_MEMORY_UNLOCK (mem); - - return ret; + return TRUE; } /** @@ -1126,7 +1172,7 @@ * ID3D11VideoProcessorInputView or %NULL if ID3D11VideoProcessorInputView is * unavailable * - * Since: 1.20 + * Since: 1.22 */ ID3D11VideoProcessorInputView * gst_d3d11_memory_get_processor_input_view (GstD3D11Memory * mem, @@ -1153,7 +1199,9 @@ GstD3D11Allocator *allocator; D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC desc; HRESULT hr; - gboolean ret; + + if (mem->priv->native_type != GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D) + return FALSE; memset (&desc, 0, sizeof (D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC)); @@ -1172,9 +1220,9 @@ return FALSE; } - GST_D3D11_MEMORY_LOCK (mem); + GstD3D11SRWLockGuard lk (GST_D3D11_MEMORY_GET_LOCK (mem)); if (priv->processor_output_view) - goto succeeded; + return TRUE; desc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D; desc.Texture2D.MipSlice = 0; @@ -1184,16 +1232,10 @@ if (!gst_d3d11_result (hr, mem->device)) { GST_ERROR_OBJECT (allocator, "Could not create processor input view, hr: 0x%x", (guint) hr); - goto done; + return FALSE; } -succeeded: - ret = TRUE; - -done: - GST_D3D11_MEMORY_UNLOCK (mem); - - return ret; + return TRUE; } /** @@ -1206,7 +1248,7 @@ * ID3D11VideoProcessorOutputView or %NULL if ID3D11VideoProcessorOutputView is * unavailable * - * Since: 1.20 + * Since: 1.22 */ ID3D11VideoProcessorOutputView * gst_d3d11_memory_get_processor_output_view (GstD3D11Memory * mem, @@ -1237,7 +1279,8 @@ static GstMemory *gst_d3d11_allocator_dummy_alloc (GstAllocator * allocator, gsize size, GstAllocationParams * params); static GstMemory *gst_d3d11_allocator_alloc_internal (GstD3D11Allocator * self, - GstD3D11Device * device, const D3D11_TEXTURE2D_DESC * desc); + GstD3D11Device * device, const D3D11_TEXTURE2D_DESC * desc, + ID3D11Texture2D * texture); static void gst_d3d11_allocator_free (GstAllocator * allocator, GstMemory * mem); @@ -1258,16 +1301,15 @@ GstD3D11Memory *dmem = GST_D3D11_MEMORY_CAST (mem); GstD3D11Memory *copy_dmem; GstD3D11Device *device = dmem->device; - ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device); ID3D11DeviceContext *device_context = gst_d3d11_device_get_device_context_handle (device); D3D11_TEXTURE2D_DESC dst_desc = { 0, }; D3D11_TEXTURE2D_DESC src_desc = { 0, }; GstMemory *copy = NULL; GstMapInfo info; - HRESULT hr; - UINT bind_flags = 0; - UINT supported_flags = 0; + + if (dmem->priv->native_type != GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D) + return priv->fallback_copy (mem, offset, size); /* non-zero offset or different size is not supported */ if (offset != 0 || (size != -1 && (gsize) size != mem->size)) { @@ -1275,10 +1317,10 @@ return priv->fallback_copy (mem, offset, size); } - gst_d3d11_device_lock (device); + GstD3D11DeviceLockGuard lk (device); + if (!gst_memory_map (mem, &info, (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { - gst_d3d11_device_unlock (device); GST_WARNING_OBJECT (alloc, "Failed to map memory, try fallback copy"); @@ -1293,25 +1335,11 @@ dst_desc.SampleDesc.Count = 1; dst_desc.ArraySize = 1; dst_desc.Usage = D3D11_USAGE_DEFAULT; + dst_desc.BindFlags = src_desc.BindFlags; - /* If supported, use bind flags for SRV/RTV */ - hr = device_handle->CheckFormatSupport (src_desc.Format, &supported_flags); - if (gst_d3d11_result (hr, device)) { - if ((supported_flags & D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) == - D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) { - bind_flags |= D3D11_BIND_SHADER_RESOURCE; - } - - if ((supported_flags & D3D11_FORMAT_SUPPORT_RENDER_TARGET) == - D3D11_FORMAT_SUPPORT_RENDER_TARGET) { - bind_flags |= D3D11_BIND_RENDER_TARGET; - } - } - - copy = gst_d3d11_allocator_alloc_internal (alloc, device, &dst_desc); + copy = gst_d3d11_allocator_alloc_internal (alloc, device, &dst_desc, nullptr); if (!copy) { gst_memory_unmap (mem, &info); - gst_d3d11_device_unlock (device); GST_WARNING_OBJECT (alloc, "Failed to allocate new d3d11 map memory, try fallback copy"); @@ -1324,7 +1352,6 @@ dmem->priv->texture, dmem->priv->subresource_index, NULL); copy->maxsize = copy->size = mem->maxsize; gst_memory_unmap (mem, &info); - gst_d3d11_device_unlock (device); /* newly allocated memory holds valid image data. We need download this * pixel data into staging memory for CPU access */ @@ -1380,17 +1407,21 @@ GST_D3D11_CLEAR_COM (dmem_priv->processor_output_view); GST_D3D11_CLEAR_COM (dmem_priv->texture); GST_D3D11_CLEAR_COM (dmem_priv->staging); + GST_D3D11_CLEAR_COM (dmem_priv->buffer); GST_D3D11_CLEAR_COM (dmem_priv->decoder_handle); gst_clear_object (&dmem->device); - g_mutex_clear (&dmem_priv->lock); + + if (dmem_priv->notify) + dmem_priv->notify (dmem_priv->user_data); + g_free (dmem->priv); g_free (dmem); } static GstMemory * -gst_d3d11_allocator_alloc_wrapped (GstD3D11Allocator * self, +gst_d3d11_allocator_alloc_wrapped_internal (GstD3D11Allocator * self, GstD3D11Device * device, const D3D11_TEXTURE2D_DESC * desc, ID3D11Texture2D * texture) { @@ -1401,48 +1432,104 @@ gst_memory_init (GST_MEMORY_CAST (mem), (GstMemoryFlags) 0, GST_ALLOCATOR_CAST (self), NULL, 0, 0, 0, 0); - g_mutex_init (&mem->priv->lock); mem->priv->texture = texture; mem->priv->desc = *desc; + mem->priv->native_type = GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D; mem->device = (GstD3D11Device *) gst_object_ref (device); - /* This is staging texture as well */ - if (desc->Usage == D3D11_USAGE_STAGING) { - mem->priv->staging = texture; - texture->AddRef (); - } - return GST_MEMORY_CAST (mem); } +typedef void (*GstD3D11ClearRTVFunc) (ID3D11DeviceContext * context_handle, + ID3D11RenderTargetView * rtv); + +static void +clear_rtv_chroma (ID3D11DeviceContext * context_handle, + ID3D11RenderTargetView * rtv) +{ + const FLOAT clear_color4 = { 0.5f, 0.5f, 0.5f, 1.0f }; + + context_handle->ClearRenderTargetView (rtv, clear_color); +} + +static void +clear_rtv_vuya (ID3D11DeviceContext * context_handle, + ID3D11RenderTargetView * rtv) +{ + const FLOAT clear_color4 = { 0.5f, 0.5f, 0.0f, 1.0f }; + + context_handle->ClearRenderTargetView (rtv, clear_color); +} + static GstMemory * gst_d3d11_allocator_alloc_internal (GstD3D11Allocator * self, - GstD3D11Device * device, const D3D11_TEXTURE2D_DESC * desc) + GstD3D11Device * device, const D3D11_TEXTURE2D_DESC * desc, + ID3D11Texture2D * texture) { - ID3D11Texture2D *texture = NULL; ID3D11Device *device_handle; + ID3D11DeviceContext *context_handle; HRESULT hr; + GstMemory *mem; + GstD3D11Memory *dmem; + ID3D11RenderTargetView *rtv = nullptr; + GstD3D11ClearRTVFunc clear_func = nullptr; device_handle = gst_d3d11_device_get_device_handle (device); - hr = device_handle->CreateTexture2D (desc, NULL, &texture); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR_OBJECT (self, "Couldn't create texture"); - return NULL; + if (!texture) { + hr = device_handle->CreateTexture2D (desc, nullptr, &texture); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Couldn't create texture"); + return nullptr; + } } - return gst_d3d11_allocator_alloc_wrapped (self, device, desc, texture); + mem = + gst_d3d11_allocator_alloc_wrapped_internal (self, device, desc, texture); + if (!mem) + return nullptr; + + /* Clear with YUV black if needed and possible + * TODO: do this using UAV if RTV is not allowed (e.g., packed YUV formats) */ + if ((desc->BindFlags & D3D11_BIND_RENDER_TARGET) == 0) + return mem; + + dmem = GST_D3D11_MEMORY_CAST (mem); + switch (desc->Format) { + case DXGI_FORMAT_NV12: + case DXGI_FORMAT_P010: + case DXGI_FORMAT_P016: + /* Y component will be zero already */ + rtv = gst_d3d11_memory_get_render_target_view (dmem, 1); + clear_func = (GstD3D11ClearRTVFunc) clear_rtv_chroma; + break; + case DXGI_FORMAT_AYUV: + rtv = gst_d3d11_memory_get_render_target_view (dmem, 0); + clear_func = (GstD3D11ClearRTVFunc) clear_rtv_vuya; + break; + default: + return mem; + } + + if (!rtv) + return mem; + + context_handle = gst_d3d11_device_get_device_context_handle (device); + GstD3D11DeviceLockGuard lk (device); + clear_func (context_handle, rtv); + + return mem; } /** * gst_d3d11_allocator_alloc: - * @allocator: a #GstD3D11Allocator - * @device: a #GstD3D11Device + * @allocator: (transfer none) (allow-none): a #GstD3D11Allocator + * @device: (transfer none): a #GstD3D11Device * @desc: a D3D11_TEXTURE2D_DESC struct * - * Returns: a newly allocated #GstD3D11Memory with given parameters. + * Returns: (transfer full) (nullable): a newly allocated #GstD3D11Memory with given parameters. * - * Since: 1.20 + * Since: 1.22 */ GstMemory * gst_d3d11_allocator_alloc (GstD3D11Allocator * allocator, @@ -1450,11 +1537,16 @@ { GstMemory *mem; + if (!allocator) { + gst_d3d11_memory_init_once (); + allocator = _d3d11_memory_allocator; + } + g_return_val_if_fail (GST_IS_D3D11_ALLOCATOR (allocator), NULL); g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL); g_return_val_if_fail (desc != NULL, NULL); - mem = gst_d3d11_allocator_alloc_internal (allocator, device, desc); + mem = gst_d3d11_allocator_alloc_internal (allocator, device, desc, nullptr); if (!mem) return NULL; @@ -1467,6 +1559,155 @@ return mem; } +/** + * gst_d3d11_allocator_alloc_buffer: + * @allocator: (transfer none) (allow-none): a #GstD3D11Allocator + * @device: (transfer none): a #GstD3D11Device + * @desc: a D3D11_BUFFER_DESC struct + * + * Returns: (transfer full) (nullable): a newly allocated #GstD3D11Memory with given parameters. + * + * Since: 1.22 + */ +GstMemory * +gst_d3d11_allocator_alloc_buffer (GstD3D11Allocator * allocator, + GstD3D11Device * device, const D3D11_BUFFER_DESC * desc) +{ + GstD3D11Memory *mem; + ID3D11Buffer *buffer; + ID3D11Device *device_handle; + HRESULT hr; + + if (!allocator) { + gst_d3d11_memory_init_once (); + allocator = _d3d11_memory_allocator; + } + + g_return_val_if_fail (GST_IS_D3D11_ALLOCATOR (allocator), nullptr); + g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), nullptr); + g_return_val_if_fail (desc != nullptr, nullptr); + + if (desc->Usage != D3D11_USAGE_STAGING) { + GST_FIXME_OBJECT (allocator, "Non staging buffer is not supported"); + return nullptr; + } + + device_handle = gst_d3d11_device_get_device_handle (device); + + hr = device_handle->CreateBuffer (desc, nullptr, &buffer); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (allocator, "Couldn't create buffer"); + return nullptr; + } + + mem = g_new0 (GstD3D11Memory, 1); + mem->priv = g_new0 (GstD3D11MemoryPrivate, 1); + + gst_memory_init (GST_MEMORY_CAST (mem), + (GstMemoryFlags) 0, GST_ALLOCATOR_CAST (allocator), nullptr, 0, 0, 0, 0); + mem->priv->buffer = buffer; + mem->priv->buffer_desc = *desc; + mem->priv->native_type = GST_D3D11_MEMORY_NATIVE_TYPE_BUFFER; + mem->device = (GstD3D11Device *) gst_object_ref (device); + + GST_MEMORY_CAST (mem)->maxsize = GST_MEMORY_CAST (mem)->size = + desc->ByteWidth; + + return GST_MEMORY_CAST (mem); +} + +/** + * gst_d3d11_allocator_alloc_wrapped: + * @allocator: (transfer none) (allow-none): a #GstD3D11Allocator + * @device: (transfer none): a #GstD3D11Device + * @texture: a ID3D11Texture2D + * @size: CPU accessible memory size + * @user_data: (allow-none): user data + * @notify: (allow-none): called with @user_data when the memory is freed + * + * Allocates memory object with @texture. The refcount of @texture + * will be increased by one. + * + * Caller should set valid CPU acessible memory value to @size + * (which is typically calculated by using staging texture and Map/Unmap) + * or zero is allowed. In that case, allocator will create a temporary staging + * texture to get the size and the temporary staging texture will be released. + * + * Caller must not be confused that @size is CPU accessible size, not raw + * texture size. + * + * Returns: (transfer full) (nullable): a newly allocated #GstD3D11Memory with given @texture + * if successful, or %NULL if @texture is not a valid handle or configuration + * is not supported. + * + * Since: 1.22 + */ +GstMemory * +gst_d3d11_allocator_alloc_wrapped (GstD3D11Allocator * allocator, + GstD3D11Device * device, ID3D11Texture2D * texture, gsize size, + gpointer user_data, GDestroyNotify notify) +{ + GstMemory *mem; + GstD3D11Memory *dmem; + D3D11_TEXTURE2D_DESC desc = { 0, }; + ID3D11Texture2D *tex = nullptr; + HRESULT hr; + + if (!allocator) { + gst_d3d11_memory_init_once (); + allocator = _d3d11_memory_allocator; + } + + g_return_val_if_fail (GST_IS_D3D11_ALLOCATOR (allocator), nullptr); + g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), nullptr); + g_return_val_if_fail (texture != nullptr, nullptr); + + hr = texture->QueryInterface (IID_PPV_ARGS (&tex)); + if (FAILED (hr)) { + GST_WARNING_OBJECT (allocator, "Not a valid texture handle"); + return nullptr; + } + + tex->GetDesc (&desc); + mem = gst_d3d11_allocator_alloc_internal (allocator, device, &desc, tex); + + if (!mem) + return nullptr; + + if (size == 0) { + if (!gst_d3d11_memory_update_size (mem)) { + GST_ERROR_OBJECT (allocator, "Failed to calculate size"); + gst_memory_unref (mem); + return nullptr; + } + } else { + mem->maxsize = mem->size = size; + } + + dmem = GST_D3D11_MEMORY_CAST (mem); + + dmem->priv->user_data = user_data; + dmem->priv->notify = notify; + + return mem; +} + +/** + * gst_d3d11_allocator_set_active: + * @allocator: a #GstD3D11Allocator + * @active: the new active state + * + * Controls the active state of @allocator. Default #GstD3D11Allocator is + * stateless and therefore active state is ignored, but subclass implementation + * (e.g., #GstD3D11PoolAllocator) will require explicit active state control + * for its internal resource management. + * + * This method is conceptually identical to gst_buffer_pool_set_active method. + * + * Returns: %TRUE if active state of @allocator was successfully updated. + * + * Since: 1.22 + */ gboolean gst_d3d11_allocator_set_active (GstD3D11Allocator * allocator, gboolean active) { @@ -1475,15 +1716,15 @@ g_return_val_if_fail (GST_IS_D3D11_ALLOCATOR (allocator), FALSE); klass = GST_D3D11_ALLOCATOR_GET_CLASS (allocator); - if (klass->set_actvie) - return klass->set_actvie (allocator, active); + if (klass->set_active) + return klass->set_active (allocator, active); return TRUE; } /* GstD3D11PoolAllocator */ -#define GST_D3D11_POOL_ALLOCATOR_LOCK(alloc) (g_rec_mutex_lock(&alloc->priv->lock)) -#define GST_D3D11_POOL_ALLOCATOR_UNLOCK(alloc) (g_rec_mutex_unlock(&alloc->priv->lock)) +#define GST_D3D11_POOL_ALLOCATOR_GET_LOCK(alloc) \ + (&(GST_D3D11_POOL_ALLOCATOR_CAST(alloc)->priv->lock)) #define GST_D3D11_POOL_ALLOCATOR_IS_FLUSHING(alloc) (g_atomic_int_get (&alloc->priv->flushing)) struct _GstD3D11PoolAllocatorPrivate @@ -1498,7 +1739,7 @@ /* This lock will protect all below variables apart from atomic ones * (identical to GstBufferPool::priv::rec_lock) */ - GRecMutex lock; + CRITICAL_SECTION lock; gboolean started; gboolean active; @@ -1514,7 +1755,6 @@ gsize mem_size; }; -static void gst_d3d11_pool_allocator_dispose (GObject * object); static void gst_d3d11_pool_allocator_finalize (GObject * object); static gboolean @@ -1535,10 +1775,9 @@ GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstD3D11AllocatorClass *d3d11alloc_class = GST_D3D11_ALLOCATOR_CLASS (klass); - gobject_class->dispose = gst_d3d11_pool_allocator_dispose; gobject_class->finalize = gst_d3d11_pool_allocator_finalize; - d3d11alloc_class->set_actvie = gst_d3d11_pool_allocator_set_active; + d3d11alloc_class->set_active = gst_d3d11_pool_allocator_set_active; } static void @@ -1548,7 +1787,8 @@ priv = allocator->priv = (GstD3D11PoolAllocatorPrivate *) gst_d3d11_pool_allocator_get_instance_private (allocator); - g_rec_mutex_init (&priv->lock); + + InitializeCriticalSection (&priv->lock); priv->poll = gst_poll_new_timer (); priv->queue = gst_atomic_queue_new (16); @@ -1563,16 +1803,6 @@ } static void -gst_d3d11_pool_allocator_dispose (GObject * object) -{ - GstD3D11PoolAllocator *self = GST_D3D11_POOL_ALLOCATOR (object); - - gst_clear_object (&self->device); - - G_OBJECT_CLASS (pool_alloc_parent_class)->dispose (object); -} - -static void gst_d3d11_pool_allocator_finalize (GObject * object) { GstD3D11PoolAllocator *self = GST_D3D11_POOL_ALLOCATOR (object); @@ -1583,10 +1813,12 @@ gst_d3d11_pool_allocator_stop (self); gst_atomic_queue_unref (priv->queue); gst_poll_free (priv->poll); - g_rec_mutex_clear (&priv->lock); + DeleteCriticalSection (&priv->lock); GST_D3D11_CLEAR_COM (priv->texture); + gst_clear_object (&self->device); + G_OBJECT_CLASS (pool_alloc_parent_class)->finalize (object); } @@ -1622,9 +1854,8 @@ GstMemory *mem; priv->texture->AddRef (); - mem = - gst_d3d11_allocator_alloc_wrapped (GST_D3D11_ALLOCATOR_CAST - (_d3d11_memory_allocator), self->device, &priv->desc, priv->texture); + mem = gst_d3d11_allocator_alloc_wrapped_internal (_d3d11_memory_allocator, + self->device, &priv->desc, priv->texture); if (i == 0) { if (!gst_d3d11_memory_update_size (mem)) { @@ -1690,14 +1921,16 @@ GST_LOG_OBJECT (self, "active %d", active); - GST_D3D11_POOL_ALLOCATOR_LOCK (self); + GstD3D11CSLockGuard lk (GST_D3D11_POOL_ALLOCATOR_GET_LOCK (self)); /* just return if we are already in the right state */ if (priv->active == active) - goto was_ok; + return TRUE; if (active) { - if (!gst_d3d11_pool_allocator_start (self)) - goto start_failed; + if (!gst_d3d11_pool_allocator_start (self)) { + GST_ERROR_OBJECT (self, "start failed"); + return FALSE; + } /* flush_stop may release memory objects, setting to active to avoid running * do_stop while activating the pool */ @@ -1716,35 +1949,16 @@ GST_LOG_OBJECT (self, "outstanding memories %d, (in queue %d)", outstanding, gst_atomic_queue_length (priv->queue)); if (outstanding == 0) { - if (!gst_d3d11_pool_allocator_stop (self)) - goto stop_failed; + if (!gst_d3d11_pool_allocator_stop (self)) { + GST_ERROR_OBJECT (self, "stop failed"); + return FALSE; + } } priv->active = FALSE; } - GST_D3D11_POOL_ALLOCATOR_UNLOCK (self); - return TRUE; - -was_ok: - { - GST_DEBUG_OBJECT (self, "allocator was in the right state"); - GST_D3D11_POOL_ALLOCATOR_UNLOCK (self); - return TRUE; - } -start_failed: - { - GST_ERROR_OBJECT (self, "start failed"); - GST_D3D11_POOL_ALLOCATOR_UNLOCK (self); - return FALSE; - } -stop_failed: - { - GST_ERROR_OBJECT (self, "stop failed"); - GST_D3D11_POOL_ALLOCATOR_UNLOCK (self); - return FALSE; - } } static void @@ -1817,13 +2031,11 @@ /* all memory objects are returned to the pool, see if we need to free them */ if (GST_D3D11_POOL_ALLOCATOR_IS_FLUSHING (self)) { /* take the lock so that set_active is not run concurrently */ - GST_D3D11_POOL_ALLOCATOR_LOCK (self); + GstD3D11CSLockGuard lk (GST_D3D11_POOL_ALLOCATOR_GET_LOCK (self)); /* now that we have the lock, check if we have been de-activated with * outstanding buffers */ if (!self->priv->active) gst_d3d11_pool_allocator_stop (self); - - GST_D3D11_POOL_ALLOCATOR_UNLOCK (self); } } } @@ -1836,12 +2048,13 @@ GST_MINI_OBJECT_CAST (mem)->dispose = NULL; mem->allocator = (GstAllocator *) gst_object_ref (_d3d11_memory_allocator); - gst_object_unref (self); /* keep it around in our queue */ gst_atomic_queue_push (self->priv->queue, mem); gst_poll_write_control (self->priv->poll); dec_outstanding (self); + + gst_object_unref (self); } static gboolean @@ -1883,9 +2096,8 @@ /* increment the allocation counter */ g_atomic_int_add (&priv->cur_mems, 1); - new_mem = - gst_d3d11_allocator_alloc_internal (GST_D3D11_ALLOCATOR_CAST - (_d3d11_memory_allocator), self->device, &priv->desc); + new_mem = gst_d3d11_allocator_alloc_internal (_d3d11_memory_allocator, + self->device, &priv->desc, nullptr); if (!new_mem) { GST_ERROR_OBJECT (self, "Failed to allocate new memory"); g_atomic_int_add (&priv->cur_mems, -1); @@ -2001,6 +2213,8 @@ * Creates a new #GstD3D11PoolAllocator instance. * * Returns: (transfer full): a new #GstD3D11PoolAllocator instance + * + * Since: 1.22 */ GstD3D11PoolAllocator * gst_d3d11_pool_allocator_new (GstD3D11Device * device, @@ -2026,7 +2240,7 @@ /** * gst_d3d11_pool_allocator_acquire_memory: * @allocator: a #GstD3D11PoolAllocator - * @memory: (transfer full): a #GstMemory + * @memory: (out): a #GstMemory * * Acquires a #GstMemory from @allocator. @memory should point to a memory * location that can hold a pointer to the new #GstMemory. @@ -2073,7 +2287,7 @@ * * Returns: %TRUE if the size of memory pool is known * - * Since: 1.20 + * Since: 1.22 */ gboolean gst_d3d11_pool_allocator_get_pool_size (GstD3D11PoolAllocator * allocator,
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11memory.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11memory.h
Changed
@@ -19,8 +19,7 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __GST_D3D11_MEMORY_H__ -#define __GST_D3D11_MEMORY_H__ +#pragma once #include <gst/gst.h> #include <gst/video/video.h> @@ -31,7 +30,6 @@ #define GST_TYPE_D3D11_ALLOCATION_PARAMS (gst_d3d11_allocation_params_get_type()) -#define GST_TYPE_D3D11_MEMORY (gst_d3d11_memory_get_type()) #define GST_D3D11_MEMORY_CAST(obj) ((GstD3D11Memory *)obj) #define GST_TYPE_D3D11_ALLOCATOR (gst_d3d11_allocator_get_type()) @@ -55,7 +53,7 @@ * * The name of the Direct3D11 memory * - * Since: 1.20 + * Since: 1.22 */ #define GST_D3D11_MEMORY_NAME "D3D11Memory" @@ -64,7 +62,7 @@ * * Name of the caps feature for indicating the use of #GstD3D11Memory * - * Since: 1.20 + * Since: 1.22 */ #define GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY "memory:D3D11Memory" @@ -73,24 +71,30 @@ * * Flag indicating that we should map the D3D11 resource instead of to system memory. * - * Since: 1.20 + * Since: 1.22 */ #define GST_MAP_D3D11 (GST_MAP_FLAG_LAST << 1) /** * GstD3D11AllocationFlags: + * @GST_D3D11_ALLOCATION_FLAG_DEFAULT: Default allocation behavior * @GST_D3D11_ALLOCATION_FLAG_TEXTURE_ARRAY: Indicates each allocated texture * should be array type. This type of * is used for D3D11/DXVA decoders * in general. * - * Since: 1.20 + * Since: 1.22 */ typedef enum { + GST_D3D11_ALLOCATION_FLAG_DEFAULT = 0, GST_D3D11_ALLOCATION_FLAG_TEXTURE_ARRAY = (1 << 0), } GstD3D11AllocationFlags; +GST_D3D11_API +GType gst_d3d11_allocation_flags_get_type (void); +#define GST_TYPE_D3D11_ALLOCATION_FLAGS (gst_d3d11_allocation_flags_get_type()) + /** * GstD3D11MemoryTransfer: * @GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD: the texture needs downloading @@ -98,7 +102,7 @@ * @GST_D3D11_MEMORY_TRANSFER_NEED_UPLOAD: the staging texture needs uploading * to the texture * - * Since: 1.20 + * Since: 1.22 */ typedef enum { @@ -106,19 +110,47 @@ GST_D3D11_MEMORY_TRANSFER_NEED_UPLOAD = (GST_MEMORY_FLAG_LAST << 1) } GstD3D11MemoryTransfer; +GST_D3D11_API +GType gst_d3d11_memory_transfer_get_type (void); +#define GST_TYPE_D3D11_MEMORY_TRANSFER (gst_d3d11_memory_transfer_get_type()) + +/** + * GstD3D11MemoryNativeType: + * @GST_D3D11_MEMORY_NATIVE_TYPE_INVALID: not a valid object type + * @GST_D3D11_MEMORY_OBJECT_TYPE_BUFFER: memory holds ID3D11Buffer object + * @GST_D3D11_MEMORY_OBJECT_TYPE_TEXTURE_2D: memory holds ID3D11Texture2D object + * + * Since: 1.22 + */ +typedef enum +{ + GST_D3D11_MEMORY_NATIVE_TYPE_INVALID = 0, + GST_D3D11_MEMORY_NATIVE_TYPE_BUFFER, + GST_D3D11_MEMORY_NATIVE_TYPE_TEXTURE_2D, +} GstD3D11MemoryNativeType; + +GST_D3D11_API +GType gst_d3d11_memory_native_type_get_type (void); +#define GST_TYPE_D3D11_MEMORY_NATIVE_TYPE (gst_d3d11_memory_native_type_get_type()) + +/** + * GstD3D11AllocationParams: + * + * Contains set of parameters for #GstD3D11Memory allocation + * + * Since: 1.22 + */ struct _GstD3D11AllocationParams { /* Texture description per plane */ D3D11_TEXTURE2D_DESC descGST_VIDEO_MAX_PLANES; - GstVideoInfo info; GstVideoInfo aligned_info; - const GstD3D11Format *d3d11_format; - + GstD3D11Format d3d11_format; GstD3D11AllocationFlags flags; /*< private >*/ - gpointer _gst_reservedGST_PADDING_LARGE; + gpointer _gst_reservedGST_PADDING; }; GST_D3D11_API @@ -126,9 +158,10 @@ GST_D3D11_API GstD3D11AllocationParams * gst_d3d11_allocation_params_new (GstD3D11Device * device, - GstVideoInfo * info, + const GstVideoInfo * info, GstD3D11AllocationFlags flags, - guint bind_flags); + guint bind_flags, + guint misc_flags); GST_D3D11_API GstD3D11AllocationParams * gst_d3d11_allocation_params_copy (GstD3D11AllocationParams * src); @@ -138,8 +171,15 @@ GST_D3D11_API gboolean gst_d3d11_allocation_params_alignment (GstD3D11AllocationParams * parms, - GstVideoAlignment * align); + const GstVideoAlignment * align); +/** + * GstD3D11Memory: + * + * Represents information about a Direct3D11 memory object + * + * Since: 1.22 + */ struct _GstD3D11Memory { GstMemory mem; @@ -153,24 +193,28 @@ }; GST_D3D11_API -GType gst_d3d11_memory_get_type (void); - -GST_D3D11_API void gst_d3d11_memory_init_once (void); GST_D3D11_API gboolean gst_is_d3d11_memory (GstMemory * mem); GST_D3D11_API -ID3D11Texture2D * gst_d3d11_memory_get_texture_handle (GstD3D11Memory * mem); +GstD3D11MemoryNativeType gst_d3d11_memory_get_native_type (GstD3D11Memory * mem); + +GST_D3D11_API +ID3D11Resource * gst_d3d11_memory_get_resource_handle (GstD3D11Memory * mem); GST_D3D11_API gboolean gst_d3d11_memory_get_texture_desc (GstD3D11Memory * mem, D3D11_TEXTURE2D_DESC * desc); GST_D3D11_API -gboolean gst_d3d11_memory_get_texture_stride (GstD3D11Memory * mem, - guint * stride); +gboolean gst_d3d11_memory_get_buffer_desc (GstD3D11Memory * mem, + D3D11_BUFFER_DESC * desc); + +GST_D3D11_API +gboolean gst_d3d11_memory_get_resource_stride (GstD3D11Memory * mem, + guint * stride); GST_D3D11_API guint gst_d3d11_memory_get_subresource_index (GstD3D11Memory * mem); @@ -205,21 +249,32 @@ ID3D11VideoDevice * video_device, ID3D11VideoProcessorEnumerator * enumerator); +/** + * GstD3D11Allocator: + * + * A Direct3D11 memory allocator + * + * Since: 1.22 + */ struct _GstD3D11Allocator { - GstAllocator allocator; + GstAllocator parent; /*< private >*/ GstD3D11AllocatorPrivate *priv; - gpointer _gst_reservedGST_PADDING; }; +/** + * GstD3D11AllocatorClass: + * + * Since: 1.22 + */ struct _GstD3D11AllocatorClass { - GstAllocatorClass allocator_class; + GstAllocatorClass parent_class; - gboolean (*set_actvie) (GstD3D11Allocator * allocator, + gboolean (*set_active) (GstD3D11Allocator * allocator, gboolean active); /*< private >*/ @@ -235,25 +290,51 @@ const D3D11_TEXTURE2D_DESC * desc); GST_D3D11_API +GstMemory * gst_d3d11_allocator_alloc_buffer (GstD3D11Allocator * allocator, + GstD3D11Device * device, + const D3D11_BUFFER_DESC * desc); + +GST_D3D11_API +GstMemory * gst_d3d11_allocator_alloc_wrapped (GstD3D11Allocator * allocator, + GstD3D11Device * device, + ID3D11Texture2D * texture, + gsize size, + gpointer user_data, + GDestroyNotify notify); + +GST_D3D11_API gboolean gst_d3d11_allocator_set_active (GstD3D11Allocator * allocator, gboolean active); +/** + * GstD3D11PoolAllocator: + * + * Allocates #GstD3D11Memory objects and pooling allocated memory + * + * Since: 1.22 + */ struct _GstD3D11PoolAllocator { - GstD3D11Allocator allocator; + GstD3D11Allocator parent; /*< public >*/ GstD3D11Device *device; /*< private >*/ GstD3D11PoolAllocatorPrivate *priv; - gpointer _gst_reservedGST_PADDING; }; +/** + * GstD3D11PoolAllocatorClass: + * + * Opaque GstD3D11PoolAllocatorClass struct + * + * Since: 1.22 + */ struct _GstD3D11PoolAllocatorClass { - GstD3D11AllocatorClass allocator_class; + GstD3D11AllocatorClass parent_class; /*< private >*/ gpointer _gst_reservedGST_PADDING; @@ -277,4 +358,3 @@ G_END_DECLS -#endif /* __GST_D3D11_MEMORY_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11utils.cpp -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11utils.cpp
Changed
@@ -23,10 +23,23 @@ #include "gstd3d11utils.h" #include "gstd3d11device.h" -#include "gstd3d11_private.h" +#include "gstd3d11-private.h" #include <windows.h> #include <versionhelpers.h> +#include <mutex> + +/** + * SECTION:gstd3d11utils + * @title: GstD3D11Utils + * @short_description: Direct3D11 specific utility methods + * + * Since: 1.22 + */ + +/* *INDENT-OFF* */ +static std::recursive_mutex _context_lock; +/* *INDENT-ON* */ GST_DEBUG_CATEGORY_STATIC (GST_CAT_CONTEXT); #ifndef GST_DISABLE_GST_DEBUG @@ -34,18 +47,13 @@ static GstDebugCategory * ensure_debug_category (void) { - static gsize cat_gonce = 0; - - if (g_once_init_enter (&cat_gonce)) { - gsize cat_done; - - cat_done = (gsize) _gst_debug_category_new ("d3d11utils", 0, - "d3d11 utility functions"); + static GstDebugCategory *cat = nullptr; - g_once_init_leave (&cat_gonce, cat_done); - } + GST_D3D11_CALL_ONCE_BEGIN { + cat = _gst_debug_category_new ("d3d11utils", 0, "d3d11 utility functions"); + } GST_D3D11_CALL_ONCE_END; - return (GstDebugCategory *) cat_gonce; + return cat; } #else #define ensure_debug_category() /* NOOP */ @@ -54,12 +62,9 @@ static void _init_context_debug (void) { - static gsize _init = 0; - - if (g_once_init_enter (&_init)) { + GST_D3D11_CALL_ONCE_BEGIN { GST_DEBUG_CATEGORY_GET (GST_CAT_CONTEXT, "GST_CONTEXT"); - g_once_init_leave (&_init, 1); - } + } GST_D3D11_CALL_ONCE_END; } /** @@ -78,7 +83,7 @@ * * Returns: whether the @device could be set successfully * - * Since: 1.20 + * Since: 1.22 */ gboolean gst_d3d11_handle_set_context (GstElement * element, GstContext * context, @@ -139,7 +144,7 @@ * * Returns: whether the @device could be set successfully * - * Since: 1.20 + * Since: 1.22 */ gboolean gst_d3d11_handle_set_context_for_adapter_luid (GstElement * element, @@ -227,7 +232,7 @@ * Returns: Whether the @query was successfully responded to from the passed * @device. * - * Since: 1.20 + * Since: 1.22 */ gboolean gst_d3d11_handle_context_query (GstElement * element, GstQuery * query, @@ -373,13 +378,16 @@ * * Returns: whether a #GstD3D11Device exists in @device * - * Since: 1.20 + * Since: 1.22 */ gboolean gst_d3d11_ensure_element_data (GstElement * element, gint adapter, GstD3D11Device ** device) { guint target_adapter = 0; + /* *INDENT-OFF* */ + std::lock_guard<std::recursive_mutex> lk (_context_lock); + /* *INDENT-ON* */ g_return_val_if_fail (element != NULL, FALSE); g_return_val_if_fail (device != NULL, FALSE); @@ -441,12 +449,16 @@ * * Returns: whether a #GstD3D11Device exists in @device * - * Since: 1.20 + * Since: 1.22 */ gboolean gst_d3d11_ensure_element_data_for_adapter_luid (GstElement * element, gint64 adapter_luid, GstD3D11Device ** device) { + /* *INDENT-OFF* */ + std::lock_guard<std::recursive_mutex> lk (_context_lock); + /* *INDENT-ON* */ + g_return_val_if_fail (element != NULL, FALSE); g_return_val_if_fail (device != NULL, FALSE); @@ -492,14 +504,37 @@ } /** + * gst_d3d11_context_new: + * @device: (transfer none): a #GstD3D11Device + * + * Creates a new #GstContext object with @device + * + * Returns: a #GstContext object + * + * Since: 1.22 + */ +GstContext * +gst_d3d11_context_new (GstD3D11Device * device) +{ + GstContext *context; + + g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), nullptr); + + context = gst_context_new (GST_D3D11_DEVICE_HANDLE_CONTEXT_TYPE, TRUE); + context_set_d3d11_device (context, device); + + return context; +} + +/** * gst_d3d11_luid_to_int64: * @luid: A pointer to LUID struct * - * Converts from a LUID to a 64-bit signed integer. + * Converts @luid to a 64-bit signed integer. * See also Int64FromLuid method defined in * windows.devices.display.core.interop.h Windows SDK header * - * Since: 1.20 + * Since: 1.22 */ gint64 gst_d3d11_luid_to_int64 (const LUID * luid) @@ -514,6 +549,21 @@ return val.QuadPart; } +/** + * _gst_d3d11_result: + * @result: HRESULT D3D11 API return code + * @device: (nullable): Associated #GstD3D11Device + * @cat: a #GstDebugCategory + * @file: the file that checking the result code + * @function: the function that checking the result code + * @line: the line that checking the result code + * + * Prints debug message if @result code indicates the operation was failed. + * + * Returns: %TRUE if D3D11 API call result is SUCCESS + * + * Since: 1.22 + */ gboolean _gst_d3d11_result (HRESULT hr, GstD3D11Device * device, GstDebugCategory * cat, const gchar * file, const gchar * function, gint line)
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/gstd3d11utils.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/gstd3d11utils.h
Changed
@@ -17,8 +17,7 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __GST_D3D11_UTILS_H__ -#define __GST_D3D11_UTILS_H__ +#pragma once #include <gst/gst.h> #include <gst/d3d11/gstd3d11_fwd.h> @@ -53,6 +52,9 @@ GstD3D11Device ** device); GST_D3D11_API +GstContext * gst_d3d11_context_new (GstD3D11Device * device); + +GST_D3D11_API gint64 gst_d3d11_luid_to_int64 (const LUID * luid); GST_D3D11_API @@ -69,11 +71,10 @@ * * Returns: %TRUE if D3D11 API call result is SUCCESS * - * Since: 1.20 + * Since: 1.22 */ #define gst_d3d11_result(result,device) \ _gst_d3d11_result (result, device, GST_CAT_DEFAULT, __FILE__, GST_FUNCTION, __LINE__) G_END_DECLS -#endif /* __GST_D3D11_UTILS_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/d3d11/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/d3d11/meson.build
Changed
@@ -1,36 +1,32 @@ d3d11_sources = 'gstd3d11bufferpool.cpp', + 'gstd3d11compile.cpp', + 'gstd3d11converter.cpp', 'gstd3d11device.cpp', 'gstd3d11format.cpp', 'gstd3d11memory.cpp', 'gstd3d11utils.cpp', -dxgi_headers = - 'dxgi1_6.h', 6, - 'dxgi1_5.h', 5, - 'dxgi1_4.h', 4, - 'dxgi1_3.h', 3, - 'dxgi1_2.h', 2, - 'dxgi.h', 1 - - d3d11_headers = - 'd3d11_4.h', 4, - 'd3d11_3.h', 3, - 'd3d11_2.h', 2, - 'd3d11_1.h', 1, - 'd3d11.h', 0 + 'd3d11-prelude.h', + 'gstd3d11_fwd.h', + 'gstd3d11.h', + 'gstd3d11bufferpool.h', + 'gstd3d11compile.h', + 'gstd3d11converter.h', + 'gstd3d11device.h', + 'gstd3d11format.h', + 'gstd3d11memory.h', + 'gstd3d11utils.h', gstd3d11_dep = dependency('', required : false) -d3d11_option = get_option('d3d11') -if host_system != 'windows' or d3d11_option.disabled() +if host_system != 'windows' subdir_done() endif -have_d3d11 = false extra_c_args = '-DCOBJMACROS', @@ -40,49 +36,31 @@ '-DG_LOG_DOMAIN="GStreamer-D3D11"', -have_dxgi_header = false -have_d3d11_header = false have_d3d11sdk_h = false have_dxgidebug_h = false -winapi_desktop = false -winapi_app = false +d3d11_winapi_app = false d3d11_conf = configuration_data() -d3d11_conf_options = - 'GST_D3D11_DXGI_HEADER_VERSION', - 'GST_D3D11_HEADER_VERSION', - 'GST_D3D11_WINAPI_ONLY_APP', - -foreach option : d3d11_conf_options - d3d11_conf.set10(option, false) -endforeach - -d3d11_lib = cc.find_library('d3d11', required : d3d11_option) -dxgi_lib = cc.find_library('dxgi', required : d3d11_option) -d3dcompiler_lib = cc.find_library('d3dcompiler', required: d3d11_option) +d3d11_lib = cc.find_library('d3d11', required : false) +dxgi_lib = cc.find_library('dxgi', required : false) +d3dcompiler_lib = cc.find_library('d3dcompiler', required: false) runtimeobject_lib = cc.find_library('runtimeobject', required : false) -foreach dxgi_h: dxgi_headers - if not have_dxgi_header and cc.has_header(dxgi_h0) - d3d11_conf.set('GST_D3D11_DXGI_HEADER_VERSION', dxgi_h1) - have_dxgi_header = true - endif -endforeach +if not d3d11_lib.found() or not dxgi_lib.found() + subdir_done() +endif -foreach d3d11_h: d3d11_headers - if not have_d3d11_header and cc.has_header(d3d11_h0) - d3d11_conf.set('GST_D3D11_HEADER_VERSION', d3d11_h1) - have_d3d11_header = true - endif -endforeach +sdk_headers = + 'd3d11_4.h', + 'dxgi1_6.h', + 'd3dcompiler.h' + -have_d3d11 = d3d11_lib.found() and dxgi_lib.found() and have_d3d11_header and have_dxgi_header -if not have_d3d11 - if d3d11_option.enabled() - error('The d3d11 was enabled explicitly, but required dependencies were not found.') +foreach h : sdk_headers + if not cc.has_header (h) + subdir_done () endif - subdir_done() -endif +endforeach d3d11_winapi_desktop = cxx.compiles('''#include <winapifamily.h> #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) @@ -96,8 +74,8 @@ #include <windows.applicationmodel.core.h> #include <wrl.h> #include <wrl/wrappers/corewrappers.h> - #include <d3d11.h> - #include <dxgi1_2.h> + #include <d3d11_4.h> + #include <dxgi1_6.h> #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) #error "not winrt" #endif @@ -109,9 +87,10 @@ endif if not d3d11_winapi_desktop and not d3d11_winapi_app - error('Neither Desktop partition nor App partition') + subdir_done() endif +extra_deps = d3d11_winapi_only_app = d3d11_winapi_app and not d3d11_winapi_desktop d3d11_conf.set10('GST_D3D11_WINAPI_ONLY_APP', d3d11_winapi_only_app) d3d11_conf.set10('GST_D3D11_WINAPI_APP', d3d11_winapi_app) @@ -173,6 +152,10 @@ extra_comm_args += '-DHAVE_DXGIDEBUG_H' endif +if d3d11_winapi_only_app + extra_deps += d3dcompiler_lib, runtimeobject_lib +endif + # MinGW 32bits compiler seems to be complaining about redundant-decls # when ComPtr is in use. Let's just disable the warning if cc.get_id() != 'msvc' @@ -184,7 +167,10 @@ endif configure_file( - output: 'gstd3d11config.h', + input : 'gstd3d11config.h.meson', + output : 'gstd3d11config.h', + install_dir : get_option('libdir') + '/gstreamer-1.0/include/gst/d3d11', + install_tag : 'devel', configuration: d3d11_conf, ) @@ -197,13 +183,47 @@ version : libversion, soversion : soversion, install : true, - dependencies : gstbase_dep, gstvideo_dep, gmodule_dep, d3d11_lib, dxgi_lib + dependencies : gstbase_dep, gstvideo_dep, gmodule_dep, d3d11_lib, dxgi_lib + extra_deps +) + +pkgconfig.generate(gstd3d11, + libraries : gstbase_dep, gstvideo_dep, d3d11_lib, dxgi_lib, + variables : pkgconfig_variables, + subdirs : pkgconfig_subdirs, + extra_cflags : '-I${libdir}/gstreamer-1.0/include', + name : pkg_name, + description : 'GStreamer Direct3D11 library', ) library_def = {'lib': gstd3d11} -libraries += pkg_name, library_def +if build_gir + gir_includes = 'Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0' + gir = { + 'sources' : d3d11_sources + d3d11_headers, + 'namespace' : 'GstD3D11', + 'nsversion' : api_version, + 'identifier_prefix' : 'Gst', + 'symbol_prefix' : 'gst', + 'export_packages' : pkg_name, + 'includes' : gir_includes, + 'install' : true, + 'extra_args' : gir_init_section + '-DGST_USE_UNSTABLE_API', + 'dependencies' : gstbase_dep, gstvideo_dep, d3d11_lib, dxgi_lib, + } + if not static_build + d3d11_gir = gnome.generate_gir(gstd3d11, kwargs: gir) + gen_sources += d3d11_gir + endif + + library_def += {'gir': gir} +endif +gst_libraries += pkg_name, library_def + +install_headers(d3d11_headers, subdir : 'gstreamer-1.0/gst/d3d11') -# Still non-public api, should not install headers gstd3d11_dep = declare_dependency(link_with : gstd3d11, include_directories : libsinc, - dependencies : gstbase_dep, gstvideo_dep, gmodule_dep, d3d11_lib, dxgi_lib) + dependencies : gstbase_dep, gstvideo_dep, d3d11_lib, dxgi_lib, + sources : gen_sources) + +meson.override_dependency(pkg_name, gstd3d11_dep)
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/insertbin/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/insertbin/meson.build
Changed
@@ -43,7 +43,7 @@ gen_sources += insertbin_gir endif endif -libraries += pkg_name, library_def +gst_libraries += pkg_name, library_def gstinsertbin_dep = declare_dependency(link_with : gstinsertbin, include_directories : libsinc,
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/interfaces/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/interfaces/meson.build
Changed
@@ -38,5 +38,5 @@ dependencies : gst_dep, sources : photoenum_h) -libraries += pkg_name, {'lib': gstphotography} +gst_libraries += pkg_name, {'lib': gstphotography} meson.override_dependency(pkg_name, gstphotography_dep)
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/meson.build
Changed
@@ -6,6 +6,8 @@ subdir('codecparsers') subdir('codecs') subdir('d3d11') +# cuda can depend on d3d11 +subdir('cuda') subdir('insertbin') subdir('interfaces') subdir('isoff')
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/mpegts/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/mpegts/meson.build
Changed
@@ -75,7 +75,7 @@ gen_sources += mpegts_gir endif endif -libraries += pkg_name, library_def +gst_libraries += pkg_name, library_def gstmpegts_dep = declare_dependency(link_with : gstmpegts, include_directories : libsinc,
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/opencv/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/opencv/meson.build
Changed
@@ -39,7 +39,7 @@ dependencies : gstbase_dep, gstvideo_dep, opencv_dep, ) - libraries += pkg_name, {'lib': gstopencv} + gst_libraries += pkg_name, {'lib': gstopencv} gstopencv_dep = declare_dependency(link_with: gstopencv, include_directories : libsinc, dependencies : gstvideo_dep, opencv_dep)
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/play/gstplay-signal-adapter.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/play/gstplay-signal-adapter.c
Changed
@@ -420,6 +420,14 @@ G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, NULL, G_TYPE_NONE, 0, G_TYPE_INVALID); + /** + * GstPlaySignalAdapter::error: + * @adapter: The #GstPlaySignalAdapter + * @error: The error + * @details: (nullable): Additional error details + * + * Emitted on errors. + */ signalsSIGNAL_ERROR = g_signal_new ("error", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, @@ -445,6 +453,14 @@ G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + /** + * GstPlaySignalAdapter::warning: + * @adapter: The #GstPlaySignalAdapter + * @error: The warning + * @details: (nullable): Additional warning details + * + * Emitted on warnings. + */ signalsSIGNAL_WARNING = g_signal_new ("warning", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL,
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/play/gstplay.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/play/gstplay.c
Changed
@@ -1058,12 +1058,18 @@ play_err = g_error_new_literal (GST_PLAY_ERROR, GST_PLAY_ERROR_FAILED, full_message); - GST_ERROR_OBJECT (self, "Warning: %s (%s, %d)", err->message, + GST_WARNING_OBJECT (self, "Warning: %s (%s, %d)", err->message, g_quark_to_string (err->domain), err->code); - api_bus_post_message (self, GST_PLAY_MESSAGE_WARNING, - GST_PLAY_MESSAGE_DATA_WARNING, G_TYPE_ERROR, play_err, - GST_PLAY_MESSAGE_DATA_WARNING_DETAILS, GST_TYPE_STRUCTURE, details, NULL); + if (details != NULL) { + api_bus_post_message (self, GST_PLAY_MESSAGE_WARNING, + GST_PLAY_MESSAGE_DATA_WARNING, G_TYPE_ERROR, play_err, + GST_PLAY_MESSAGE_DATA_WARNING_DETAILS, GST_TYPE_STRUCTURE, details, + NULL); + } else { + api_bus_post_message (self, GST_PLAY_MESSAGE_WARNING, + GST_PLAY_MESSAGE_DATA_WARNING, G_TYPE_ERROR, play_err, NULL); + } g_clear_error (&play_err); g_clear_error (&err); @@ -1756,7 +1762,7 @@ g_object_get (G_OBJECT (self->playbin), "current-suburi", &suburi, NULL); if (suburi) { - if (self->use_playbin3) { + if (self->use_playbin3 && self->subtitle_sid) { if (g_str_equal (self->subtitle_sid, stream_info->stream_id)) info->language = g_path_get_basename (suburi); } else {
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/play/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/play/meson.build
Changed
@@ -65,7 +65,7 @@ gen_sources += play_gir endif endif -libraries += pkg_name, library_def +gst_libraries += pkg_name, library_def gstplay_dep = declare_dependency(link_with : gstplay, include_directories : libsinc,
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/player/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/player/meson.build
Changed
@@ -68,7 +68,7 @@ gen_sources += player_gir endif endif -libraries += pkg_name, library_def +gst_libraries += pkg_name, library_def gstplayer_dep = declare_dependency(link_with : gstplayer, include_directories : libsinc,
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/sctp/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/sctp/meson.build
Changed
@@ -22,7 +22,7 @@ ) pkg_name = 'gstreamer-sctp-1.0' -libraries += pkg_name, {'lib': libgstsctp} +gst_libraries += pkg_name, {'lib': libgstsctp} pkgconfig.generate(libgstsctp, libraries : gst_dep, variables : pkgconfig_variables,
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/transcoder/gsttranscoder.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/transcoder/gsttranscoder.c
Changed
@@ -262,6 +262,7 @@ g_free (self->source_uri); g_free (self->dest_uri); g_cond_clear (&self->cond); + gst_object_unref (self->api_bus); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -942,6 +943,7 @@ if (data->loop) { g_main_loop_quit (data->loop); + g_main_loop_unref (data->loop); data->loop = NULL; } } @@ -951,6 +953,7 @@ { if (data->loop) { g_main_loop_quit (data->loop); + g_main_loop_unref (data->loop); data->loop = NULL; } } @@ -1457,8 +1460,8 @@ /** * gst_transcoder_message_parse_error: * @msg: A #GstMessage - * @error: (out): the resulting error - * @details: (out): (transfer none): A GstStructure containing extra details about the error + * @error: (out) (optional) (transfer full): the resulting error + * @details: (out): (transfer full): A GstStructure containing extra details about the error * * Parse the given error @msg and extract the corresponding #GError * @@ -1477,8 +1480,8 @@ /** * gst_transcoder_message_parse_warning: * @msg: A #GstMessage - * @error: (out): the resulting warning - * @details: (out): (transfer none): A GstStructure containing extra details about the warning + * @error: (out) (optional) (transfer full): the resulting warning + * @details: (out): (transfer full): A GstStructure containing extra details about the warning * * Parse the given error @msg and extract the corresponding #GError warning *
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/transcoder/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/transcoder/meson.build
Changed
@@ -56,7 +56,7 @@ transcoder_gen_sources += transcoder_gir endif endif -libraries += pkg_name, library_def +gst_libraries += pkg_name, library_def gst_transcoder_dep = declare_dependency(link_with: gst_transcoder, dependencies : gst_dep, gstpbutils_dep,
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/uridownloader/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/uridownloader/meson.build
Changed
@@ -26,5 +26,5 @@ include_directories : libsinc, dependencies : gstbase_dep) -libraries += pkg_name, {'lib': gsturidownloader} +gst_libraries += pkg_name, {'lib': gsturidownloader} meson.override_dependency(pkg_name, gsturidownloader_dep) \ No newline at end of file
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstva.h
Added
@@ -0,0 +1,58 @@ +/* GStreamer + * Copyright (C) 2021 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#ifndef GST_USE_UNSTABLE_API +#pragma message ("The va library from gst-plugins-bad is unstable API and may change in future.") +#pragma message ("You can define GST_USE_UNSTABLE_API to avoid this warning.") +#endif + +/** + * GstVaFeature: + * @GST_VA_FEATURE_DISABLED: The feature is disabled. + * @GST_VA_FEATURE_ENABLED: The feature is enabled. + * @GST_VA_FEATURE_AUTO: The feature is enabled automatically. + * + * Since: 1.22 + */ +typedef enum +{ + GST_VA_FEATURE_DISABLED, + GST_VA_FEATURE_ENABLED, + GST_VA_FEATURE_AUTO, +} GstVaFeature; + +enum +{ + /* jpeg decoder in i965 driver cannot create surfaces with fourcc */ + GST_VA_HACK_SURFACE_NO_FOURCC = 1 << 0, +}; + +#include <gst/va/va-prelude.h> +#include <gst/va/va-enumtypes.h> +#include <gst/va/gstvadisplay.h> +#include <gst/va/gstvadisplay_drm.h> +#include <gst/va/gstvadisplay_wrapped.h> + +#include <gst/va/gstvaallocator.h> +#include <gst/va/gstvapool.h> + +#include <gst/va/gstvautils.h>
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvaallocator.c
Added
@@ -0,0 +1,2154 @@ +/* GStreamer + * Copyright (C) 2020 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:gstvaallocator + * @title: VA allocators + * @short_description: VA allocators + * @sources: + * - gstvaallocator.h + * + * There are two types of VA allocators: + * + * * #GstVaAllocator + * * #GstVaDmabufAllocator + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstvaallocator.h" + +#include <sys/types.h> +#include <unistd.h> + +#include "gstvasurfacecopy.h" +#include "gstvavideoformat.h" +#include "vasurfaceimage.h" + +#define GST_CAT_DEFAULT gst_va_memory_debug +GST_DEBUG_CATEGORY (gst_va_memory_debug); + +static void +_init_debug_category (void) +{ +#ifndef GST_DISABLE_GST_DEBUG + static gsize _init = 0; + + if (g_once_init_enter (&_init)) { + GST_DEBUG_CATEGORY_INIT (gst_va_memory_debug, "vamemory", 0, "VA memory"); + g_once_init_leave (&_init, 1); + } +#endif +} + +/*=========================== Quarks for GstMemory ===========================*/ + +static GQuark +gst_va_buffer_surface_quark (void) +{ + static gsize surface_quark = 0; + + if (g_once_init_enter (&surface_quark)) { + GQuark quark = g_quark_from_string ("GstVaBufferSurface"); + g_once_init_leave (&surface_quark, quark); + } + + return surface_quark; +} + +static GQuark +gst_va_drm_mod_quark (void) +{ + static gsize drm_mod_quark = 0; + + if (g_once_init_enter (&drm_mod_quark)) { + GQuark quark = g_quark_from_string ("DRMModifier"); + g_once_init_leave (&drm_mod_quark, quark); + } + + return drm_mod_quark; +} + +static GQuark +gst_va_buffer_aux_surface_quark (void) +{ + static gsize surface_quark = 0; + + if (g_once_init_enter (&surface_quark)) { + GQuark quark = g_quark_from_string ("GstVaBufferAuxSurface"); + g_once_init_leave (&surface_quark, quark); + } + + return surface_quark; +} + +/*========================= GstVaBufferSurface ===============================*/ + +typedef struct _GstVaBufferSurface GstVaBufferSurface; +struct _GstVaBufferSurface +{ + GstVaDisplay *display; + VASurfaceID surface; + guint n_mems; + GstMemory *memsGST_VIDEO_MAX_PLANES; + gint ref_count; + gint ref_mems_count; +}; + +static void +gst_va_buffer_surface_unref (gpointer data) +{ + GstVaBufferSurface *buf = data; + + g_return_if_fail (buf && GST_IS_VA_DISPLAY (buf->display)); + + if (g_atomic_int_dec_and_test (&buf->ref_count)) { + GST_LOG_OBJECT (buf->display, "Destroying surface %#x", buf->surface); + va_destroy_surfaces (buf->display, &buf->surface, 1); + gst_clear_object (&buf->display); + g_slice_free (GstVaBufferSurface, buf); + } +} + +static GstVaBufferSurface * +gst_va_buffer_surface_new (VASurfaceID surface, GstVideoFormat format, + gint width, gint height) +{ + GstVaBufferSurface *buf = g_slice_new (GstVaBufferSurface); + + g_atomic_int_set (&buf->ref_count, 0); + g_atomic_int_set (&buf->ref_mems_count, 0); + buf->surface = surface; + buf->display = NULL; + buf->n_mems = 0; + + return buf; +} + +/*=========================== GstVaMemoryPool ================================*/ + +/* queue for disposed surfaces */ +typedef struct _GstVaMemoryPool GstVaMemoryPool; +struct _GstVaMemoryPool +{ + GstAtomicQueue *queue; + gint surface_count; + + GMutex lock; +}; + +#define GST_VA_MEMORY_POOL_CAST(obj) ((GstVaMemoryPool *)obj) +#define GST_VA_MEMORY_POOL_LOCK(obj) g_mutex_lock (&GST_VA_MEMORY_POOL_CAST(obj)->lock) +#define GST_VA_MEMORY_POOL_UNLOCK(obj) g_mutex_unlock (&GST_VA_MEMORY_POOL_CAST(obj)->lock) + +static void +gst_va_memory_pool_init (GstVaMemoryPool * self) +{ + self->queue = gst_atomic_queue_new (2); + + g_mutex_init (&self->lock); + + self->surface_count = 0; +} + +static void +gst_va_memory_pool_finalize (GstVaMemoryPool * self) +{ + g_mutex_clear (&self->lock); + + gst_atomic_queue_unref (self->queue); +} + +static void +gst_va_memory_pool_flush_unlocked (GstVaMemoryPool * self, + GstVaDisplay * display) +{ + GstMemory *mem; + GstVaBufferSurface *buf; + + while ((mem = gst_atomic_queue_pop (self->queue))) { + /* destroy the surface */ + buf = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), + gst_va_buffer_surface_quark ()); + if (buf) { + if (g_atomic_int_dec_and_test (&buf->ref_count)) { + GST_LOG ("Destroying surface %#x", buf->surface); + va_destroy_surfaces (display, &buf->surface, 1); + self->surface_count -= 1; /* GstVaDmabufAllocator */ + g_slice_free (GstVaBufferSurface, buf); + } + } else { + self->surface_count -= 1; /* GstVaAllocator */ + } + + GST_MINI_OBJECT_CAST (mem)->dispose = NULL; + /* when mem are pushed available queue its allocator is unref, + * then now it is required to ref the allocator here because + * memory's finalize will unref it again */ + gst_object_ref (mem->allocator); + gst_memory_unref (mem); + } +} + +static void +gst_va_memory_pool_flush (GstVaMemoryPool * self, GstVaDisplay * display) +{ + GST_VA_MEMORY_POOL_LOCK (self); + gst_va_memory_pool_flush_unlocked (self, display); + GST_VA_MEMORY_POOL_UNLOCK (self); +} + +static inline void +gst_va_memory_pool_push (GstVaMemoryPool * self, GstMemory * mem) +{ + gst_atomic_queue_push (self->queue, gst_memory_ref (mem)); +} + +static inline GstMemory * +gst_va_memory_pool_pop (GstVaMemoryPool * self) +{ + return gst_atomic_queue_pop (self->queue); +} + +static inline GstMemory * +gst_va_memory_pool_peek (GstVaMemoryPool * self) +{ + return gst_atomic_queue_peek (self->queue); +} + +static inline guint +gst_va_memory_pool_surface_count (GstVaMemoryPool * self) +{ + return g_atomic_int_get (&self->surface_count); +} + +static inline void +gst_va_memory_pool_surface_inc (GstVaMemoryPool * self) +{ + g_atomic_int_inc (&self->surface_count); +} + +/*=========================== GstVaDmabufAllocator ===========================*/ + +/** + * GstVaDmabufAllocator: + * + * A pooled memory allocator backed by the DMABufs exported from a + * VASurfaceID. Also it is possible to import DMAbufs into a + * VASurfaceID. + * + * Since: 1.22 + */ +typedef struct _GstVaDmabufAllocator GstVaDmabufAllocator; +typedef struct _GstVaDmabufAllocatorClass GstVaDmabufAllocatorClass; + +struct _GstVaDmabufAllocator +{ + GstDmaBufAllocator parent; + + GstVaDisplay *display; + + GstMemoryMapFunction parent_map; + GstMemoryCopyFunction parent_copy; + + GstVideoInfo info; + guint usage_hint; + + GstVaSurfaceCopy *copy; + + GstVaMemoryPool pool; +}; + +struct _GstVaDmabufAllocatorClass +{ + GstDmaBufAllocatorClass parent_class; +}; + +#define gst_va_dmabuf_allocator_parent_class dmabuf_parent_class +G_DEFINE_TYPE_WITH_CODE (GstVaDmabufAllocator, gst_va_dmabuf_allocator, + GST_TYPE_DMABUF_ALLOCATOR, _init_debug_category ()); + +static GstVaSurfaceCopy * +_ensure_surface_copy (GstVaSurfaceCopy ** old, GstVaDisplay * display, + GstVideoInfo * info) +{ + GstVaSurfaceCopy *surface_copy; + + surface_copy = g_atomic_pointer_get (old); + if (!surface_copy) { + surface_copy = gst_va_surface_copy_new (display, info); + + /* others create a new one and set it before us */ + if (surface_copy && + !g_atomic_pointer_compare_and_exchange (old, NULL, surface_copy)) { + gst_va_surface_copy_free (surface_copy); + surface_copy = g_atomic_pointer_get (old); + } + } + + return surface_copy; +} + +/* If a buffer contains multiple memories (dmabuf objects) its very + * difficult to provide a realiable way to fast-copy single memories: + * While VA API sees surfaces with dependant dmabufs, GStreamer only + * copies dmabufs in isolation; trying to solve it while keeping a + * reference of the copied buffer and dmabuf index is very fragile. */ +static GstMemory * +gst_va_dmabuf_mem_copy (GstMemory * gmem, gssize offset, gssize size) +{ + GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (gmem->allocator); + GstVaBufferSurface *buf; + guint64 *drm_mod; + gsize mem_size; + + buf = gst_mini_object_get_qdata (GST_MINI_OBJECT (gmem), + gst_va_buffer_surface_quark ()); + + drm_mod = gst_mini_object_get_qdata (GST_MINI_OBJECT (gmem), + gst_va_drm_mod_quark ()); + + /* 0 is DRM_FORMAT_MOD_LINEAR, we do not include its header now. */ + if (buf->n_mems > 1 && *drm_mod != 0) { + GST_ERROR_OBJECT (self, "Failed to copy multi-dmabuf because non-linear " + "modifier: %#" G_GINT64_MODIFIER "x.", *drm_mod); + return NULL; + } + + /* check if it's full memory copy */ + mem_size = gst_memory_get_sizes (gmem, NULL, NULL); + + if (size == -1) + size = mem_size > offset ? mem_size - offset : 0; + + /* @XXX: if one-memory buffer it's possible to copy */ + if (offset == 0 && size == mem_size && buf->n_mems == 1) { + GstVaBufferSurface *buf_copy = NULL; + GstMemory *copy; + GstVaSurfaceCopy *copy_func; + + GST_VA_MEMORY_POOL_LOCK (&self->pool); + copy = gst_va_memory_pool_pop (&self->pool); + GST_VA_MEMORY_POOL_UNLOCK (&self->pool); + + if (copy) { + gst_object_ref (copy->allocator); + + buf_copy = gst_mini_object_get_qdata (GST_MINI_OBJECT (copy), + gst_va_buffer_surface_quark ()); + + g_assert (g_atomic_int_get (&buf_copy->ref_mems_count) == 0); + + g_atomic_int_add (&buf_copy->ref_mems_count, 1); + } else { + GstBuffer *buffer = gst_buffer_new (); + + if (!gst_va_dmabuf_allocator_setup_buffer (gmem->allocator, buffer)) { + GST_WARNING_OBJECT (self, "Failed to create a new dmabuf memory"); + return NULL; + } + + copy = gst_buffer_get_memory (buffer, 0); + gst_buffer_unref (buffer); + + buf_copy = gst_mini_object_get_qdata (GST_MINI_OBJECT (copy), + gst_va_buffer_surface_quark ()); + } + + g_assert (buf_copy->n_mems == 1); + + copy_func = _ensure_surface_copy (&self->copy, self->display, &self->info); + if (copy_func && gst_va_surface_copy (copy_func, buf_copy->surface, + buf->surface)) + return copy; + + gst_memory_unref (copy); + + /* try system memory */ + } + + if (*drm_mod != 0) { + GST_ERROR_OBJECT (self, "Failed to copy dmabuf because non-linear " + "modifier: %#" G_GINT64_MODIFIER "x.", *drm_mod); + return NULL; + } + + /* fallback to system memory */ + return self->parent_copy (gmem, offset, size); + +} + +static gpointer +gst_va_dmabuf_mem_map (GstMemory * gmem, gsize maxsize, GstMapFlags flags) +{ + GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (gmem->allocator); + VASurfaceID surface = gst_va_memory_get_surface (gmem); + guint64 *drm_mod; + + drm_mod = gst_mini_object_get_qdata (GST_MINI_OBJECT (gmem), + gst_va_drm_mod_quark ()); + + /* 0 is DRM_FORMAT_MOD_LINEAR, we do not include its header now. */ + if (*drm_mod != 0) { + GST_ERROR_OBJECT (self, "Failed to map the dmabuf because the modifier " + "is: %#" G_GINT64_MODIFIER "x, which is not linear.", *drm_mod); + return NULL; + } + + va_sync_surface (self->display, surface); + + return self->parent_map (gmem, maxsize, flags); +} + +static void +gst_va_dmabuf_allocator_finalize (GObject * object) +{ + GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (object); + + g_clear_pointer (&self->copy, gst_va_surface_copy_free); + gst_va_memory_pool_finalize (&self->pool); + gst_clear_object (&self->display); + + G_OBJECT_CLASS (dmabuf_parent_class)->finalize (object); +} + +static void +gst_va_dmabuf_allocator_dispose (GObject * object) +{ + GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (object); + + gst_va_memory_pool_flush_unlocked (&self->pool, self->display); + if (gst_va_memory_pool_surface_count (&self->pool) != 0) { + GST_WARNING_OBJECT (self, "Surfaces leaked: %d", + gst_va_memory_pool_surface_count (&self->pool)); + } + + G_OBJECT_CLASS (dmabuf_parent_class)->dispose (object); +} + +static void +gst_va_dmabuf_allocator_class_init (GstVaDmabufAllocatorClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = gst_va_dmabuf_allocator_dispose; + object_class->finalize = gst_va_dmabuf_allocator_finalize; +} + +static void +gst_va_dmabuf_allocator_init (GstVaDmabufAllocator * self) +{ + GstAllocator *allocator = GST_ALLOCATOR (self); + + self->parent_map = allocator->mem_map; + allocator->mem_map = gst_va_dmabuf_mem_map; + self->parent_copy = allocator->mem_copy; + allocator->mem_copy = gst_va_dmabuf_mem_copy; + + gst_va_memory_pool_init (&self->pool); +} + +/** + * gst_va_dmabuf_allocator_new: + * @display: a #GstVaDisplay + * + * Instanciate a new pooled allocator backed with both DMABuf and + * VASurfaceID. + * + * Returns: a new allocated #GstAllocator + * + * Since: 1.22 + */ +GstAllocator * +gst_va_dmabuf_allocator_new (GstVaDisplay * display) +{ + GstVaDmabufAllocator *self; + + g_return_val_if_fail (GST_IS_VA_DISPLAY (display), NULL); + + self = g_object_new (GST_TYPE_VA_DMABUF_ALLOCATOR, NULL); + self->display = gst_object_ref (display); + gst_object_ref_sink (self); + + return GST_ALLOCATOR (self); +} + +static inline goffset +_get_fd_size (gint fd) +{ + return lseek (fd, 0, SEEK_END); +} + +static gboolean +gst_va_dmabuf_memory_release (GstMiniObject * mini_object) +{ + GstMemory *mem = GST_MEMORY_CAST (mini_object); + GstVaBufferSurface *buf; + GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (mem->allocator); + guint i; + + buf = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), + gst_va_buffer_surface_quark ()); + if (!buf) + return TRUE; /* free this unknown buffer */ + + /* if this is the last reference to the GstVaBufferSurface, iterates + * its array of memories to push them into the queue with thread + * safetly. */ + GST_VA_MEMORY_POOL_LOCK (&self->pool); + if (g_atomic_int_dec_and_test (&buf->ref_mems_count)) { + for (i = 0; i < buf->n_mems; i++) { + GST_LOG_OBJECT (self, "releasing %p: dmabuf %d, va surface %#x", + buf->memsi, gst_dmabuf_memory_get_fd (buf->memsi), buf->surface); + gst_va_memory_pool_push (&self->pool, buf->memsi); + } + } + GST_VA_MEMORY_POOL_UNLOCK (&self->pool); + + /* note: if ref_mem_count doesn't reach zero, that memory will + * "float" until it's pushed back into the pool by the last va + * buffer surface ref */ + + /* Keep last in case we are holding on the last allocator ref */ + gst_object_unref (mem->allocator); + + /* don't call mini_object's free */ + return FALSE; +} + +/* Creates an exported VASurfaceID and adds it as @buffer's memories + * qdata + * + * If @info is not NULL, a dummy (non-pooled) buffer is created to + * update offsets and strides, and it has to be unrefed immediately. + */ +static gboolean +gst_va_dmabuf_allocator_setup_buffer_full (GstAllocator * allocator, + GstBuffer * buffer, GstVideoInfo * info) +{ + GstVaBufferSurface *buf; + GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (allocator); + GstVideoFormat format; + VADRMPRIMESurfaceDescriptor desc = { 0, }; + VASurfaceAttribExternalBuffers *extbuf = NULL, ext_buf; + VASurfaceID surface; + guint32 i, fourcc, rt_format, export_flags; + GDestroyNotify buffer_destroy = NULL; + gsize object_offset4; + + g_return_val_if_fail (GST_IS_VA_DMABUF_ALLOCATOR (allocator), FALSE); + + format = GST_VIDEO_INFO_FORMAT (&self->info); + fourcc = gst_va_fourcc_from_video_format (format); + rt_format = gst_va_chroma_from_video_format (format); + if (fourcc == 0 || rt_format == 0) { + GST_ERROR_OBJECT (allocator, "Unsupported format: %s", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&self->info))); + return FALSE; + } + + /* HACK(victor): disable tiling for i965 driver for RGB formats */ + if (GST_VA_DISPLAY_IS_IMPLEMENTATION (self->display, INTEL_I965) + && GST_VIDEO_INFO_IS_RGB (&self->info)) { + /* *INDENT-OFF* */ + ext_buf = (VASurfaceAttribExternalBuffers) { + .width = GST_VIDEO_INFO_WIDTH (&self->info), + .height = GST_VIDEO_INFO_HEIGHT (&self->info), + .num_planes = GST_VIDEO_INFO_N_PLANES (&self->info), + .pixel_format = fourcc, + }; + /* *INDENT-ON* */ + + extbuf = &ext_buf; + } + + if (!va_create_surfaces (self->display, rt_format, fourcc, + GST_VIDEO_INFO_WIDTH (&self->info), + GST_VIDEO_INFO_HEIGHT (&self->info), self->usage_hint, extbuf, + &surface, 1)) + return FALSE; + + /* workaround for missing layered dmabuf formats in i965 */ + if (GST_VA_DISPLAY_IS_IMPLEMENTATION (self->display, INTEL_I965) + && (fourcc == VA_FOURCC_YUY2 || fourcc == VA_FOURCC_UYVY)) { + /* These are not representable as separate planes */ + export_flags = VA_EXPORT_SURFACE_COMPOSED_LAYERS; + } else { + /* Each layer will contain exactly one plane. For example, an NV12 + * surface will be exported as two layers */ + export_flags = VA_EXPORT_SURFACE_SEPARATE_LAYERS; + } + + export_flags |= VA_EXPORT_SURFACE_READ_WRITE; + + if (!va_export_surface_to_dmabuf (self->display, surface, export_flags, + &desc)) + goto failed; + + g_assert (GST_VIDEO_INFO_N_PLANES (&self->info) == desc.num_layers); + + if (fourcc != desc.fourcc) { + GST_ERROR ("Unsupported fourcc: %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (desc.fourcc)); + goto failed; + } + + if (desc.num_objects == 0) { + GST_ERROR ("Failed to export surface to dmabuf"); + goto failed; + } + + buf = gst_va_buffer_surface_new (surface, format, desc.width, desc.height); + if (G_UNLIKELY (info)) { + *info = self->info; + GST_VIDEO_INFO_SIZE (info) = 0; + } + + buf->n_mems = desc.num_objects; + + for (i = 0; i < desc.num_objects; i++) { + gint fd = desc.objectsi.fd; + /* don't rely on prime descriptor reported size since gallium drivers report + * different values */ + gsize size = _get_fd_size (fd); + GstMemory *mem = gst_dmabuf_allocator_alloc (allocator, fd, size); + guint64 *drm_mod = g_new (guint64, 1); + + if (size != desc.objectsi.size) { + GST_WARNING_OBJECT (self, "driver bug: fd size (%" G_GSIZE_FORMAT + ") differs from object descriptor size (%" G_GUINT32_FORMAT ")", + size, desc.objectsi.size); + } + + object_offseti = gst_buffer_get_size (buffer); + gst_buffer_append_memory (buffer, mem); + buf->memsi = mem; + + if (G_LIKELY (!info)) { + GST_MINI_OBJECT (mem)->dispose = gst_va_dmabuf_memory_release; + g_atomic_int_add (&buf->ref_mems_count, 1); + } else { + /* if no @info, surface will be destroyed as soon as buffer is + * destroyed (e.g. gst_va_dmabuf_allocator_try()) */ + buf->display = gst_object_ref (self->display); + buffer_destroy = gst_va_buffer_surface_unref; + } + + g_atomic_int_add (&buf->ref_count, 1); + gst_mini_object_set_qdata (GST_MINI_OBJECT (mem), + gst_va_buffer_surface_quark (), buf, buffer_destroy); + + *drm_mod = desc.objectsi.drm_format_modifier; + gst_mini_object_set_qdata (GST_MINI_OBJECT (mem), gst_va_drm_mod_quark (), + drm_mod, g_free); + + if (G_UNLIKELY (info)) + GST_VIDEO_INFO_PLANE_OFFSET (info, i) = GST_VIDEO_INFO_SIZE (info); + + GST_LOG_OBJECT (self, "buffer %p: new dmabuf %d / surface %#x %dx%d " + "size %" G_GSIZE_FORMAT " drm mod %#" G_GINT64_MODIFIER "x", + buffer, fd, surface, + GST_VIDEO_INFO_WIDTH (&self->info), GST_VIDEO_INFO_HEIGHT (&self->info), + size, *drm_mod); + } + + if (G_UNLIKELY (info)) { + GST_VIDEO_INFO_SIZE (info) = gst_buffer_get_size (buffer); + + for (i = 0; i < desc.num_layers; i++) { + g_assert (desc.layersi.num_planes == 1); + GST_VIDEO_INFO_PLANE_OFFSET (info, i) = + object_offsetdesc.layersi.object_index0 + + desc.layersi.offset0; + GST_VIDEO_INFO_PLANE_STRIDE (info, i) = desc.layersi.pitch0; + } + } else { + gst_va_memory_pool_surface_inc (&self->pool); + } + + return TRUE; + +failed: + { + va_destroy_surfaces (self->display, &surface, 1); + return FALSE; + } +} + +/** + * gst_va_dmabuf_allocator_setup_buffer: + * @allocator: a #GstAllocator + * @buffer: an empty #GstBuffer + * + * This funciton creates a new VASurfaceID and exposes its DMABufs, + * later it populates the @buffer with those DMABufs. + * + * Return: %TRUE if @buffer is populated correctly; %FALSE otherwise. + * + * Since: 1.22 + */ +gboolean +gst_va_dmabuf_allocator_setup_buffer (GstAllocator * allocator, + GstBuffer * buffer) +{ + return gst_va_dmabuf_allocator_setup_buffer_full (allocator, buffer, NULL); +} + +static VASurfaceID +gst_va_dmabuf_allocator_prepare_buffer_unlocked (GstVaDmabufAllocator * self, + GstBuffer * buffer) +{ + GstMemory *memsGST_VIDEO_MAX_PLANES = { 0, }; + GstVaBufferSurface *buf; + gint i, j, idx; + + mems0 = gst_va_memory_pool_pop (&self->pool); + if (!mems0) + return VA_INVALID_ID; + + buf = gst_mini_object_get_qdata (GST_MINI_OBJECT (mems0), + gst_va_buffer_surface_quark ()); + if (!buf) + return VA_INVALID_ID; + + if (buf->surface == VA_INVALID_ID) + return VA_INVALID_ID; + + for (idx = 1; idx < buf->n_mems; idx++) { + /* grab next memory from queue */ + { + GstMemory *mem; + GstVaBufferSurface *pbuf; + + mem = gst_va_memory_pool_peek (&self->pool); + if (!mem) + return VA_INVALID_ID; + + pbuf = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), + gst_va_buffer_surface_quark ()); + if (!pbuf) + return VA_INVALID_ID; + + if (pbuf->surface != buf->surface) { + GST_WARNING_OBJECT (self, + "expecting memory with surface %#x but got %#x: " + "possible memory interweaving", buf->surface, pbuf->surface); + return VA_INVALID_ID; + } + } + + memsidx = gst_va_memory_pool_pop (&self->pool); + }; + + /* append memories */ + for (i = 0; i < buf->n_mems; i++) { + gboolean found = FALSE; + + /* find next memory to append */ + for (j = 0; j < idx; j++) { + if (buf->memsi == memsj) { + found = TRUE; + break; + } + } + + /* if not found, free all the popped memories and bail */ + if (!found) { + if (!buf->display) + buf->display = gst_object_ref (self->display); + for (j = 0; j < idx; j++) { + gst_object_ref (buf->memsj->allocator); + GST_MINI_OBJECT (memsj)->dispose = NULL; + gst_memory_unref (memsj); + } + return VA_INVALID_ID; + } + + g_atomic_int_add (&buf->ref_mems_count, 1); + gst_object_ref (buf->memsi->allocator); + gst_buffer_append_memory (buffer, buf->memsi); + + GST_LOG ("bufer %p: memory %p - dmabuf %d / surface %#x", buffer, + buf->memsi, gst_dmabuf_memory_get_fd (buf->memsi), + gst_va_memory_get_surface (buf->memsi)); + } + + return buf->surface; +} + +/** + * gst_va_dmabuf_allocator_prepare_buffer: + * @allocator: a #GstAllocator + * @buffer: an empty #GstBuffer + * + * This method will populate @buffer with pooled VASurfaceID/DMABuf + * memories. It doesn't allocate new VASurfacesID. + * + * Returns: %TRUE if @buffer was populated correctly; %FALSE + * otherwise. + * + * Since: 1.22 + */ +gboolean +gst_va_dmabuf_allocator_prepare_buffer (GstAllocator * allocator, + GstBuffer * buffer) +{ + GstVaDmabufAllocator *self; + VASurfaceID surface; + + g_return_val_if_fail (GST_IS_VA_DMABUF_ALLOCATOR (allocator), FALSE); + + self = GST_VA_DMABUF_ALLOCATOR (allocator); + + GST_VA_MEMORY_POOL_LOCK (&self->pool); + surface = gst_va_dmabuf_allocator_prepare_buffer_unlocked (self, buffer); + GST_VA_MEMORY_POOL_UNLOCK (&self->pool); + + return (surface != VA_INVALID_ID); +} + +/** + * gst_va_dmabuf_allocator_flush: + * @allocator: a #GstAllocator + * + * Removes all the memories in @allocator's pool. + * + * Since: 1.22 + */ +void +gst_va_dmabuf_allocator_flush (GstAllocator * allocator) +{ + GstVaDmabufAllocator *self; + + g_return_if_fail (GST_IS_VA_DMABUF_ALLOCATOR (allocator)); + + self = GST_VA_DMABUF_ALLOCATOR (allocator); + + gst_va_memory_pool_flush (&self->pool, self->display); +} + +/** + * gst_va_dmabuf_allocator_try: + * @allocator: a #GstAllocator + * + * Try to allocate a test buffer in order to verify that the + * allocator's configuration is valid. + * + * Returns: %TRUE if the configuration is valid; %FALSE otherwise. + * + * Since: 1.22 + */ +static gboolean +gst_va_dmabuf_allocator_try (GstAllocator * allocator) +{ + GstBuffer *buffer; + GstVaDmabufAllocator *self; + GstVideoInfo info; + gboolean ret; + + g_return_val_if_fail (GST_IS_VA_DMABUF_ALLOCATOR (allocator), FALSE); + + self = GST_VA_DMABUF_ALLOCATOR (allocator); + info = self->info; + + buffer = gst_buffer_new (); + ret = gst_va_dmabuf_allocator_setup_buffer_full (allocator, buffer, &info); + gst_buffer_unref (buffer); + + if (ret) + self->info = info; + + return ret; +} + +/** + * gst_va_dmabuf_allocator_set_format: + * @allocator: a #GstAllocator + * @info: a #GstVideoInfo + * @usage_hint: VA usage hint + * + * Sets the configuration defined by @info and @usage_hint for + * @allocator, and it tries the configuration, if @allocator has not + * allocated memories yet. + * + * If @allocator has memory allocated already, and frame size and + * format in @info are the same as currently configured in @allocator, + * the rest of @info parameters are updated internally. + * + * Returns: %TRUE if the configuration is valid or updated; %FALSE if + * configuration is not valid or not updated. + * + * Since: 1.22 + */ +gboolean +gst_va_dmabuf_allocator_set_format (GstAllocator * allocator, + GstVideoInfo * info, guint usage_hint) +{ + GstVaDmabufAllocator *self; + gboolean ret; + + g_return_val_if_fail (GST_IS_VA_DMABUF_ALLOCATOR (allocator), FALSE); + g_return_val_if_fail (info, FALSE); + + self = GST_VA_DMABUF_ALLOCATOR (allocator); + + if (gst_va_memory_pool_surface_count (&self->pool) != 0) { + if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_INFO_FORMAT (&self->info) + && GST_VIDEO_INFO_WIDTH (info) == GST_VIDEO_INFO_WIDTH (&self->info) + && GST_VIDEO_INFO_HEIGHT (info) == GST_VIDEO_INFO_HEIGHT (&self->info) + && usage_hint == self->usage_hint) { + *info = self->info; /* update callee info (offset & stride) */ + return TRUE; + } + return FALSE; + } + + self->usage_hint = usage_hint; + self->info = *info; + + g_clear_pointer (&self->copy, gst_va_surface_copy_free); + + ret = gst_va_dmabuf_allocator_try (allocator); + + if (ret) + *info = self->info; + + return ret; +} + +/** + * gst_va_dmabuf_allocator_get_format: + * @allocator: a #GstAllocator + * @info: (out) (optional): a #GstVideoInfo + * @usage_hint: (out) (optional): VA usage hint + * + * Gets current internal configuration of @allocator. + * + * Returns: %TRUE if @allocator is already configured; %FALSE + * otherwise. + * + * Since: 1.22 + */ +gboolean +gst_va_dmabuf_allocator_get_format (GstAllocator * allocator, + GstVideoInfo * info, guint * usage_hint) +{ + GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (allocator); + + if (GST_VIDEO_INFO_FORMAT (&self->info) == GST_VIDEO_FORMAT_UNKNOWN) + return FALSE; + + if (info) + *info = self->info; + if (usage_hint) + *usage_hint = self->usage_hint; + + return TRUE; +} + +/** + * gst_va_dmabuf_memories_setup: + * @display: a #GstVaDisplay + * @info: a #GstVideoInfo + * @n_planes: number of planes + * @mem: (array fixed-size=4) (element-type GstMemory): Memories. One + * per plane. + * @fds: (array length=n_planes) (element-type uintptr_t): array of + * DMABuf file descriptors. + * @offset: (array fixed-size=4) (element-type gsize): array of memory + * offsets. + * @usage_hint: VA usage hint. + * + * It imports the array of @mem, representing a single frame, into a + * VASurfaceID and it's attached into every @mem. + * + * Returns: %TRUE if frame is imported correctly into a VASurfaceID; + * %FALSE otherwise. + * + * Since: 1.22 + */ +/* XXX: use a surface pool to control the created surfaces */ +/* XXX: remove n_planes argument and use GST_VIDEO_INFO_N_PLANES (info) */ +gboolean +gst_va_dmabuf_memories_setup (GstVaDisplay * display, GstVideoInfo * info, + guint n_planes, GstMemory * memGST_VIDEO_MAX_PLANES, + uintptr_t * fds, gsize offsetGST_VIDEO_MAX_PLANES, guint usage_hint) +{ + GstVideoFormat format; + GstVaBufferSurface *buf; + /* *INDENT-OFF* */ + VASurfaceAttribExternalBuffers ext_buf = { + .width = GST_VIDEO_INFO_WIDTH (info), + .height = GST_VIDEO_INFO_HEIGHT (info), + .data_size = GST_VIDEO_INFO_SIZE (info), + .num_planes = GST_VIDEO_INFO_N_PLANES (info), + .buffers = fds, + .num_buffers = GST_VIDEO_INFO_N_PLANES (info), + }; + /* *INDENT-ON* */ + VASurfaceID surface; + guint32 fourcc, rt_format; + guint i; + gboolean ret; + + g_return_val_if_fail (GST_IS_VA_DISPLAY (display), FALSE); + g_return_val_if_fail (n_planes > 0 + && n_planes <= GST_VIDEO_MAX_PLANES, FALSE); + + format = GST_VIDEO_INFO_FORMAT (info); + if (format == GST_VIDEO_FORMAT_UNKNOWN) + return FALSE; + + rt_format = gst_va_chroma_from_video_format (format); + if (rt_format == 0) + return FALSE; + + fourcc = gst_va_fourcc_from_video_format (format); + if (fourcc == 0) + return FALSE; + + ext_buf.pixel_format = fourcc; + + for (i = 0; i < n_planes; i++) { + ext_buf.pitchesi = GST_VIDEO_INFO_PLANE_STRIDE (info, i); + ext_buf.offsetsi = offseti; + } + + ret = va_create_surfaces (display, rt_format, ext_buf.pixel_format, + ext_buf.width, ext_buf.height, usage_hint, &ext_buf, &surface, 1); + if (!ret) + return FALSE; + + GST_LOG_OBJECT (display, "Created surface %#x %dx%d", surface, + ext_buf.width, ext_buf.height); + + buf = gst_va_buffer_surface_new (surface, rt_format, ext_buf.width, + ext_buf.height); + buf->display = gst_object_ref (display); + buf->n_mems = n_planes; + memcpy (buf->mems, mem, sizeof (buf->mems)); + + for (i = 0; i < n_planes; i++) { + g_atomic_int_add (&buf->ref_count, 1); + gst_mini_object_set_qdata (GST_MINI_OBJECT (memi), + gst_va_buffer_surface_quark (), buf, gst_va_buffer_surface_unref); + GST_INFO_OBJECT (display, "setting surface %#x to dmabuf fd %d", + buf->surface, gst_dmabuf_memory_get_fd (memi)); + } + + return TRUE; +} + +/*===================== GstVaAllocator / GstVaMemory =========================*/ + +/** + * GstVaAllocator: + * + * A pooled memory allocator backed by VASurfaceID. + * + * Since: 1.22 + */ +typedef struct _GstVaAllocator GstVaAllocator; +typedef struct _GstVaAllocatorClass GstVaAllocatorClass; + +struct _GstVaAllocator +{ + GstAllocator parent; + + GstVaDisplay *display; + + GstVaFeature feat_use_derived; + gboolean use_derived; + GArray *surface_formats; + + GstVideoFormat surface_format; + GstVideoFormat img_format; + guint32 fourcc; + guint32 rt_format; + + GstVideoInfo derived_info; + GstVideoInfo info; + guint usage_hint; + + guint32 hacks; + + GstVaSurfaceCopy *copy; + + GstVaMemoryPool pool; +}; + +struct _GstVaAllocatorClass +{ + GstAllocatorClass parent_class; +}; + +typedef struct _GstVaMemory GstVaMemory; +struct _GstVaMemory +{ + GstMemory mem; + + VASurfaceID surface; + GstVideoFormat surface_format; + VAImage image; + gpointer mapped_data; + + GstMapFlags prev_mapflags; + gint map_count; + + gboolean is_derived; + gboolean is_dirty; + GMutex lock; +}; + +G_DEFINE_TYPE_WITH_CODE (GstVaAllocator, gst_va_allocator, GST_TYPE_ALLOCATOR, + _init_debug_category ()); + +static gboolean _va_unmap (GstVaMemory * mem); + +static void +gst_va_allocator_finalize (GObject * object) +{ + GstVaAllocator *self = GST_VA_ALLOCATOR (object); + + g_clear_pointer (&self->copy, gst_va_surface_copy_free); + gst_va_memory_pool_finalize (&self->pool); + g_clear_pointer (&self->surface_formats, g_array_unref); + gst_clear_object (&self->display); + + G_OBJECT_CLASS (gst_va_allocator_parent_class)->finalize (object); +} + +static void +gst_va_allocator_dispose (GObject * object) +{ + GstVaAllocator *self = GST_VA_ALLOCATOR (object); + + gst_va_memory_pool_flush_unlocked (&self->pool, self->display); + if (gst_va_memory_pool_surface_count (&self->pool) != 0) { + GST_WARNING_OBJECT (self, "Surfaces leaked: %d", + gst_va_memory_pool_surface_count (&self->pool)); + } + + G_OBJECT_CLASS (gst_va_allocator_parent_class)->dispose (object); +} + +static void +_va_free (GstAllocator * allocator, GstMemory * mem) +{ + GstVaAllocator *self = GST_VA_ALLOCATOR (allocator); + GstVaMemory *va_mem = (GstVaMemory *) mem; + + if (va_mem->mapped_data) { + g_warning (G_STRLOC ":%s: Freeing memory %p still mapped", G_STRFUNC, + va_mem); + _va_unmap (va_mem); + } + + if (va_mem->surface != VA_INVALID_ID && mem->parent == NULL) { + GST_LOG_OBJECT (self, "Destroying surface %#x", va_mem->surface); + va_destroy_surfaces (self->display, &va_mem->surface, 1); + } + + g_mutex_clear (&va_mem->lock); + + g_slice_free (GstVaMemory, va_mem); +} + +static void +gst_va_allocator_class_init (GstVaAllocatorClass * klass) +{ + GstAllocatorClass *allocator_class = GST_ALLOCATOR_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = gst_va_allocator_dispose; + object_class->finalize = gst_va_allocator_finalize; + allocator_class->free = _va_free; +} + +static inline void +_clean_mem (GstVaMemory * mem) +{ + memset (&mem->image, 0, sizeof (mem->image)); + mem->image.image_id = VA_INVALID_ID; + mem->image.buf = VA_INVALID_ID; + + mem->is_derived = TRUE; + mem->is_dirty = FALSE; + mem->prev_mapflags = 0; + mem->mapped_data = NULL; +} + +static void +_reset_mem (GstVaMemory * mem, GstAllocator * allocator, gsize size) +{ + _clean_mem (mem); + g_atomic_int_set (&mem->map_count, 0); + g_mutex_init (&mem->lock); + + gst_memory_init (GST_MEMORY_CAST (mem), 0, allocator, NULL, size, + 0 /* align */ , 0 /* offset */ , size); +} + +static inline void +_update_info (GstVideoInfo * info, const VAImage * image) +{ + guint i; + + for (i = 0; i < image->num_planes; i++) { + GST_VIDEO_INFO_PLANE_OFFSET (info, i) = image->offsetsi; + GST_VIDEO_INFO_PLANE_STRIDE (info, i) = image->pitchesi; + } + + GST_VIDEO_INFO_SIZE (info) = image->data_size; +} + +static inline gboolean +_update_image_info (GstVaAllocator * va_allocator) +{ + VASurfaceID surface; + VAImage image = {.image_id = VA_INVALID_ID, }; + + /* Create a test surface first */ + if (!va_create_surfaces (va_allocator->display, va_allocator->rt_format, + va_allocator->fourcc, GST_VIDEO_INFO_WIDTH (&va_allocator->info), + GST_VIDEO_INFO_HEIGHT (&va_allocator->info), va_allocator->usage_hint, + NULL, &surface, 1)) { + GST_ERROR_OBJECT (va_allocator, "Failed to create a test surface"); + return FALSE; + } + + GST_DEBUG_OBJECT (va_allocator, "Created surface %#x %dx%d", surface, + GST_VIDEO_INFO_WIDTH (&va_allocator->info), + GST_VIDEO_INFO_HEIGHT (&va_allocator->info)); + + /* Try derived first, but different formats can never derive */ + if (va_allocator->feat_use_derived != GST_VA_FEATURE_DISABLED + && va_allocator->surface_format == va_allocator->img_format) { + if (va_get_derive_image (va_allocator->display, surface, &image)) { + va_allocator->use_derived = TRUE; + va_allocator->derived_info = va_allocator->info; + _update_info (&va_allocator->derived_info, &image); + va_destroy_image (va_allocator->display, image.image_id); + } + image.image_id = VA_INVALID_ID; /* reset it */ + } + + if (va_allocator->feat_use_derived == GST_VA_FEATURE_ENABLED + && !va_allocator->use_derived) { + GST_WARNING_OBJECT (va_allocator, "Derived images are disabled."); + va_allocator->feat_use_derived = GST_VA_FEATURE_DISABLED; + } + + /* Then we try to create a image. */ + if (!va_create_image (va_allocator->display, va_allocator->img_format, + GST_VIDEO_INFO_WIDTH (&va_allocator->info), + GST_VIDEO_INFO_HEIGHT (&va_allocator->info), &image)) { + va_destroy_surfaces (va_allocator->display, &surface, 1); + return FALSE; + } + + _update_info (&va_allocator->info, &image); + va_destroy_image (va_allocator->display, image.image_id); + va_destroy_surfaces (va_allocator->display, &surface, 1); + + return TRUE; +} + +static gpointer +_va_map_unlocked (GstVaMemory * mem, GstMapFlags flags) +{ + GstAllocator *allocator = GST_MEMORY_CAST (mem)->allocator; + GstVideoInfo *info; + GstVaAllocator *va_allocator; + GstVaDisplay *display; + gboolean use_derived; + + g_return_val_if_fail (mem->surface != VA_INVALID_ID, NULL); + g_return_val_if_fail (GST_IS_VA_ALLOCATOR (allocator), NULL); + + if (g_atomic_int_get (&mem->map_count) > 0) { + if (!(mem->prev_mapflags & flags) || !mem->mapped_data) + return NULL; + else + goto success; + } + + va_allocator = GST_VA_ALLOCATOR (allocator); + display = va_allocator->display; + + if (flags & GST_MAP_WRITE) { + mem->is_dirty = TRUE; + } else { /* GST_MAP_READ only */ + mem->is_dirty = FALSE; + } + + if (flags & GST_MAP_VA) { + mem->mapped_data = &mem->surface; + goto success; + } + + if (va_allocator->feat_use_derived == GST_VA_FEATURE_ENABLED) { + use_derived = TRUE; + } else if (va_allocator->feat_use_derived == GST_VA_FEATURE_DISABLED) { + use_derived = FALSE; + } else { + switch (gst_va_display_get_implementation (display)) { + case GST_VA_IMPLEMENTATION_INTEL_IHD: + /* On Gen7+ Intel graphics the memory is mappable but not + * cached, so normal memcpy() access is very slow to read, but + * it's ok for writing. So let's assume that users won't prefer + * direct-mapped memory if they request read access. */ + use_derived = va_allocator->use_derived && !(flags & GST_MAP_READ); + break; + case GST_VA_IMPLEMENTATION_INTEL_I965: + /* YUV derived images are tiled, so writing them is also + * problematic */ + use_derived = va_allocator->use_derived && !((flags & GST_MAP_READ) + || ((flags & GST_MAP_WRITE) + && GST_VIDEO_INFO_IS_YUV (&va_allocator->derived_info))); + break; + case GST_VA_IMPLEMENTATION_MESA_GALLIUM: + /* Reading RGB derived images, with non-standard resolutions, + * looks like tiled too. TODO(victor): fill a bug in Mesa. */ + use_derived = va_allocator->use_derived && !((flags & GST_MAP_READ) + && GST_VIDEO_INFO_IS_RGB (&va_allocator->derived_info)); + break; + default: + use_derived = va_allocator->use_derived; + break; + } + } + if (use_derived) + info = &va_allocator->derived_info; + else + info = &va_allocator->info; + + if (!va_ensure_image (display, mem->surface, info, &mem->image, use_derived)) + return NULL; + + mem->is_derived = use_derived; + + if (!mem->is_derived) { + if (!va_get_image (display, mem->surface, &mem->image)) + goto fail; + } + + if (!va_map_buffer (display, mem->image.buf, &mem->mapped_data)) + goto fail; + +success: + { + mem->prev_mapflags = flags; + g_atomic_int_add (&mem->map_count, 1); + return mem->mapped_data; + } + +fail: + { + va_destroy_image (display, mem->image.image_id); + _clean_mem (mem); + return NULL; + } +} + +static gpointer +_va_map (GstVaMemory * mem, gsize maxsize, GstMapFlags flags) +{ + gpointer data; + + g_mutex_lock (&mem->lock); + data = _va_map_unlocked (mem, flags); + g_mutex_unlock (&mem->lock); + + return data; +} + +static gboolean +_va_unmap_unlocked (GstVaMemory * mem) +{ + GstAllocator *allocator = GST_MEMORY_CAST (mem)->allocator; + GstVaDisplay *display; + gboolean ret = TRUE; + + if (!g_atomic_int_dec_and_test (&mem->map_count)) + return TRUE; + + if (mem->prev_mapflags & GST_MAP_VA) + goto bail; + + display = GST_VA_ALLOCATOR (allocator)->display; + + if (mem->image.image_id != VA_INVALID_ID) { + if (mem->is_dirty && !mem->is_derived) { + ret = va_put_image (display, mem->surface, &mem->image); + mem->is_dirty = FALSE; + } + /* XXX(victor): if is derived and is dirty, create another surface + * an replace it in mem */ + } + + ret &= va_unmap_buffer (display, mem->image.buf); + ret &= va_destroy_image (display, mem->image.image_id); + +bail: + _clean_mem (mem); + + return ret; +} + +static gboolean +_va_unmap (GstVaMemory * mem) +{ + gboolean ret; + + g_mutex_lock (&mem->lock); + ret = _va_unmap_unlocked (mem); + g_mutex_unlock (&mem->lock); + + return ret; +} + +static GstMemory * +_va_share (GstMemory * mem, gssize offset, gssize size) +{ + GstVaMemory *vamem = (GstVaMemory *) mem; + GstVaMemory *sub; + GstMemory *parent; + + GST_DEBUG ("%p: share %" G_GSSIZE_FORMAT ", %" G_GSIZE_FORMAT, mem, offset, + size); + + /* find real parent */ + if ((parent = vamem->mem.parent) == NULL) + parent = (GstMemory *) vamem; + + if (size == -1) + size = mem->maxsize - offset; + + sub = g_slice_new (GstVaMemory); + + /* the shared memory is alwyas readonly */ + gst_memory_init (GST_MEMORY_CAST (sub), GST_MINI_OBJECT_FLAGS (parent) | + GST_MINI_OBJECT_FLAG_LOCK_READONLY, vamem->mem.allocator, parent, + vamem->mem.maxsize, vamem->mem.align, vamem->mem.offset + offset, size); + + sub->surface = vamem->surface; + sub->surface_format = vamem->surface_format; + + _clean_mem (sub); + + g_atomic_int_set (&sub->map_count, 0); + g_mutex_init (&sub->lock); + + return GST_MEMORY_CAST (sub); +} + +/* XXX(victor): deep copy implementation. */ +static GstMemory * +_va_copy (GstMemory * mem, gssize offset, gssize size) +{ + GstMemory *copy; + GstMapInfo sinfo, dinfo; + GstVaAllocator *va_allocator = GST_VA_ALLOCATOR (mem->allocator); + GstVaMemory *va_copy, *va_mem = (GstVaMemory *) mem; + gsize mem_size; + + GST_DEBUG ("%p: copy %" G_GSSIZE_FORMAT ", %" G_GSIZE_FORMAT, mem, offset, + size); + + { + GST_VA_MEMORY_POOL_LOCK (&va_allocator->pool); + copy = gst_va_memory_pool_pop (&va_allocator->pool); + GST_VA_MEMORY_POOL_UNLOCK (&va_allocator->pool); + + if (!copy) { + copy = gst_va_allocator_alloc (mem->allocator); + if (!copy) { + GST_WARNING ("failed to allocate new memory"); + return NULL; + } + } else { + gst_object_ref (mem->allocator); + } + } + + va_copy = (GstVaMemory *) copy; + mem_size = gst_memory_get_sizes (mem, NULL, NULL); + + if (size == -1) + size = mem_size > offset ? mem_size - offset : 0; + + if (offset == 0 && size == mem_size) { + GstVaSurfaceCopy *copy_func; + + copy_func = _ensure_surface_copy (&va_allocator->copy, + va_allocator->display, &va_allocator->info); + if (copy_func + && gst_va_surface_copy (copy_func, va_copy->surface, va_mem->surface)) + return copy; + } + + if (!gst_memory_map (mem, &sinfo, GST_MAP_READ)) { + GST_WARNING ("failed to map memory to copy"); + return NULL; + } + + if (!gst_memory_map (copy, &dinfo, GST_MAP_WRITE)) { + GST_WARNING ("could not write map memory %p", copy); + gst_allocator_free (mem->allocator, copy); + gst_memory_unmap (mem, &sinfo); + return NULL; + } + + memcpy (dinfo.data, sinfo.data + offset, size); + gst_memory_unmap (copy, &dinfo); + gst_memory_unmap (mem, &sinfo); + + return copy; +} + +static void +gst_va_allocator_init (GstVaAllocator * self) +{ + GstAllocator *allocator = GST_ALLOCATOR (self); + + allocator->mem_type = GST_ALLOCATOR_VASURFACE; + allocator->mem_map = (GstMemoryMapFunction) _va_map; + allocator->mem_unmap = (GstMemoryUnmapFunction) _va_unmap; + allocator->mem_share = _va_share; + allocator->mem_copy = _va_copy; + + gst_va_memory_pool_init (&self->pool); + + self->feat_use_derived = GST_VA_FEATURE_AUTO; + + GST_OBJECT_FLAG_SET (self, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC); +} + +static gboolean +gst_va_memory_release (GstMiniObject * mini_object) +{ + GstMemory *mem = GST_MEMORY_CAST (mini_object); + GstVaAllocator *self = GST_VA_ALLOCATOR (mem->allocator); + + GST_LOG ("releasing %p: surface %#x", mem, gst_va_memory_get_surface (mem)); + + gst_va_memory_pool_push (&self->pool, mem); + + /* Keep last in case we are holding on the last allocator ref */ + gst_object_unref (mem->allocator); + + /* don't call mini_object's free */ + return FALSE; +} + +/** + * gst_va_allocator_alloc: + * @allocator: a #GstAllocator + * + * Allocate a new VASurfaceID backed #GstMemory. + * + * Returns: a #GstMemory backed with a VASurfaceID; %NULL, otherwise. + * + * Since: 1.22 + */ +GstMemory * +gst_va_allocator_alloc (GstAllocator * allocator) +{ + GstVaAllocator *self; + GstVaMemory *mem; + VASurfaceID surface; + + g_return_val_if_fail (GST_IS_VA_ALLOCATOR (allocator), NULL); + + self = GST_VA_ALLOCATOR (allocator); + + if (self->rt_format == 0) { + GST_ERROR_OBJECT (self, "Unknown fourcc or chroma format"); + return NULL; + } + + if (!va_create_surfaces (self->display, self->rt_format, self->fourcc, + GST_VIDEO_INFO_WIDTH (&self->info), + GST_VIDEO_INFO_HEIGHT (&self->info), self->usage_hint, NULL, + &surface, 1)) + return NULL; + + mem = g_slice_new (GstVaMemory); + + mem->surface = surface; + mem->surface_format = self->surface_format; + + _reset_mem (mem, allocator, GST_VIDEO_INFO_SIZE (&self->info)); + + GST_MINI_OBJECT (mem)->dispose = gst_va_memory_release; + gst_va_memory_pool_surface_inc (&self->pool); + + GST_LOG_OBJECT (self, "Created surface %#x %dx%d", mem->surface, + GST_VIDEO_INFO_WIDTH (&self->info), GST_VIDEO_INFO_HEIGHT (&self->info)); + + return GST_MEMORY_CAST (mem); +} + +/** + * gst_va_allocator_new: + * @display: a #GstVaDisplay + * @surface_formats: (element-type guint) (transfer full): a #GArray + * of valid #GstVideoFormat for surfaces in current VA context. + * + * Instanciate a new pooled #GstAllocator backed by VASurfaceID. + * + * Returns: a #GstVaDisplay + * + * Since: 1.22 + */ +GstAllocator * +gst_va_allocator_new (GstVaDisplay * display, GArray * surface_formats) +{ + GstVaAllocator *self; + + g_return_val_if_fail (GST_IS_VA_DISPLAY (display), NULL); + + self = g_object_new (GST_TYPE_VA_ALLOCATOR, NULL); + self->display = gst_object_ref (display); + self->surface_formats = surface_formats; + gst_object_ref_sink (self); + + return GST_ALLOCATOR (self); +} + +/** + * gst_va_allocator_setup_buffer: + * @allocator: a #GstAllocator + * @buffer: a #GstBuffer + * + * Populates an empty @buffer with a VASuface backed #GstMemory. + * + * Returns: %TRUE if @buffer is populated; %FALSE otherwise. + * + * Since: 1.22 + */ +gboolean +gst_va_allocator_setup_buffer (GstAllocator * allocator, GstBuffer * buffer) +{ + GstMemory *mem = gst_va_allocator_alloc (allocator); + if (!mem) + return FALSE; + + gst_buffer_append_memory (buffer, mem); + return TRUE; +} + +static VASurfaceID +gst_va_allocator_prepare_buffer_unlocked (GstVaAllocator * self, + GstBuffer * buffer) +{ + GstMemory *mem; + VASurfaceID surface; + + mem = gst_va_memory_pool_pop (&self->pool); + if (!mem) + return VA_INVALID_ID; + + gst_object_ref (mem->allocator); + surface = gst_va_memory_get_surface (mem); + gst_buffer_append_memory (buffer, mem); + + GST_LOG ("buffer %p: memory %p - surface %#x", buffer, mem, surface); + + return surface; +} + +/** + * gst_va_allocator_prepare_buffer: + * @allocator: a #GstAllocator + * @buffer: an empty #GstBuffer + * + * This method will populate @buffer with pooled VASurfaceID + * memories. It doesn't allocate new VASurfacesID. + * + * Returns: %TRUE if @buffer was populated correctly; %FALSE + * otherwise. + * + * Since: 1.22 + */ +gboolean +gst_va_allocator_prepare_buffer (GstAllocator * allocator, GstBuffer * buffer) +{ + GstVaAllocator *self; + VASurfaceID surface; + + g_return_val_if_fail (GST_IS_VA_ALLOCATOR (allocator), FALSE); + + self = GST_VA_ALLOCATOR (allocator); + + GST_VA_MEMORY_POOL_LOCK (&self->pool); + surface = gst_va_allocator_prepare_buffer_unlocked (self, buffer); + GST_VA_MEMORY_POOL_UNLOCK (&self->pool); + + return (surface != VA_INVALID_ID); +} + +/** + * gst_va_allocator_flush: + * @allocator: a #GstAllocator + * + * Removes all the memories in @allocator's pool. + * + * Since: 1.22 + */ +void +gst_va_allocator_flush (GstAllocator * allocator) +{ + GstVaAllocator *self; + + g_return_if_fail (GST_IS_VA_ALLOCATOR (allocator)); + + self = GST_VA_ALLOCATOR (allocator); + + gst_va_memory_pool_flush (&self->pool, self->display); +} + +/** + * gst_va_allocator_try: + * @allocator: a #GstAllocator + * + * Try to allocate a test buffer in order to verify that the + * allocator's configuration is valid. + * + * Returns: %TRUE if the configuration is valid; %FALSE otherwise. + * + * Since: 1.22 + */ +static gboolean +gst_va_allocator_try (GstAllocator * allocator) +{ + GstVaAllocator *self; + + g_return_val_if_fail (GST_IS_VA_ALLOCATOR (allocator), FALSE); + + self = GST_VA_ALLOCATOR (allocator); + + self->fourcc = 0; + self->rt_format = 0; + self->use_derived = FALSE; + self->img_format = GST_VIDEO_INFO_FORMAT (&self->info); + + self->surface_format = + gst_va_video_surface_format_from_image_format (self->img_format, + self->surface_formats); + if (self->surface_format == GST_VIDEO_FORMAT_UNKNOWN) { + /* try a surface without fourcc but rt_format only */ + self->fourcc = 0; + self->rt_format = gst_va_chroma_from_video_format (self->img_format); + } else { + if (G_LIKELY (!(self->hacks & GST_VA_HACK_SURFACE_NO_FOURCC))) + self->fourcc = gst_va_fourcc_from_video_format (self->surface_format); + self->rt_format = gst_va_chroma_from_video_format (self->surface_format); + } + + if (self->rt_format == 0) { + GST_ERROR_OBJECT (allocator, "Unsupported image format: %s", + gst_video_format_to_string (self->img_format)); + return FALSE; + } + + if (!_update_image_info (self)) { + GST_ERROR_OBJECT (allocator, "Failed to update allocator info"); + return FALSE; + } + + GST_INFO_OBJECT (self, + "va allocator info, surface format: %s, image format: %s, " + "use derived: %s, rt format: 0x%x, fourcc: %" GST_FOURCC_FORMAT, + (self->surface_format == GST_VIDEO_FORMAT_UNKNOWN) ? "unknown" + : gst_video_format_to_string (self->surface_format), + gst_video_format_to_string (self->img_format), + self->use_derived ? "true" : "false", self->rt_format, + GST_FOURCC_ARGS (self->fourcc)); + return TRUE; +} + +/** + * gst_va_allocator_set_format: + * @allocator: a #GstAllocator + * @info: (inout): a #GstVideoInfo + * @usage_hint: VA usage hint + * @use_derived: a #GstVaFeature + * + * Sets the configuration defined by @info, @usage_hint and + * @use_derived for @allocator, and it tries the configuration, if + * @allocator has not allocated memories yet. + * + * If @allocator has memory allocated already, and frame size and + * format in @info are the same as currently configured in @allocator, + * the rest of @info parameters are updated internally. + * + * Returns: %TRUE if the configuration is valid or updated; %FALSE if + * configuration is not valid or not updated. + * + * Since: 1.22 + */ +gboolean +gst_va_allocator_set_format (GstAllocator * allocator, GstVideoInfo * info, + guint usage_hint, GstVaFeature use_derived) +{ + GstVaAllocator *self; + gboolean ret; + + g_return_val_if_fail (GST_IS_VA_ALLOCATOR (allocator), FALSE); + g_return_val_if_fail (info, FALSE); + + self = GST_VA_ALLOCATOR (allocator); + + if (gst_va_memory_pool_surface_count (&self->pool) != 0) { + if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_INFO_FORMAT (&self->info) + && GST_VIDEO_INFO_WIDTH (info) == GST_VIDEO_INFO_WIDTH (&self->info) + && GST_VIDEO_INFO_HEIGHT (info) == GST_VIDEO_INFO_HEIGHT (&self->info) + && usage_hint == self->usage_hint + && use_derived == self->feat_use_derived) { + *info = self->info; /* update callee info (offset & stride) */ + return TRUE; + } + return FALSE; + } + + self->usage_hint = usage_hint; + self->feat_use_derived = use_derived; + self->info = *info; + + g_clear_pointer (&self->copy, gst_va_surface_copy_free); + + ret = gst_va_allocator_try (allocator); + if (ret) + *info = self->info; + + return ret; +} + +/** + * gst_va_allocator_get_format: + * @allocator: a #GstAllocator + * @info: (out) (optional): a #GstVideoInfo + * @usage_hint: (out) (optional): VA usage hint + * @use_derived: (out) (optional): a #GstVaFeature if derived images + * are used for buffer mapping. + * + * Gets current internal configuration of @allocator. + * + * Returns: %TRUE if @allocator is already configured; %FALSE + * otherwise. + * + * Since: 1.22 + */ +gboolean +gst_va_allocator_get_format (GstAllocator * allocator, GstVideoInfo * info, + guint * usage_hint, GstVaFeature * use_derived) +{ + GstVaAllocator *self; + + g_return_val_if_fail (GST_IS_VA_ALLOCATOR (allocator), FALSE); + self = GST_VA_ALLOCATOR (allocator); + + if (GST_VIDEO_INFO_FORMAT (&self->info) == GST_VIDEO_FORMAT_UNKNOWN) + return FALSE; + + if (info) + *info = self->info; + if (usage_hint) + *usage_hint = self->usage_hint; + if (use_derived) + *use_derived = self->feat_use_derived; + + return TRUE; +} + +/** + * gst_va_allocator_set_hacks: (skip) + * @allocator: a #GstAllocator + * @hacks: hacks id to set + * + * Internal method to set allocator specific logic changes. + * + * Since: 1.22 + */ +void +gst_va_allocator_set_hacks (GstAllocator * allocator, guint32 hacks) +{ + GstVaAllocator *self; + + g_return_if_fail (GST_IS_VA_ALLOCATOR (allocator)); + self = GST_VA_ALLOCATOR (allocator); + + self->hacks = hacks; +} + +/** + * gst_va_allocator_peek_display: + * @allocator: a #GstAllocator + * + * Returns: (transfer none): the display which this + * @allocator belongs to. The reference of the display is unchanged. + * + * Since: 1.22 + */ +GstVaDisplay * +gst_va_allocator_peek_display (GstAllocator * allocator) +{ + if (!allocator) + return NULL; + + if (GST_IS_VA_DMABUF_ALLOCATOR (allocator)) { + return GST_VA_DMABUF_ALLOCATOR (allocator)->display; + } else if (GST_IS_VA_ALLOCATOR (allocator)) { + return GST_VA_ALLOCATOR (allocator)->display; + } + + return NULL; +} + +/*============ Utilities =====================================================*/ + +/** + * gst_va_memory_get_surface: (skip) + * @mem: a #GstMemory + * + * Returns: (type guint): the VASurfaceID in @mem. + * + * Since: 1.22 + */ +VASurfaceID +gst_va_memory_get_surface (GstMemory * mem) +{ + VASurfaceID surface = VA_INVALID_ID; + + if (!mem->allocator) + return VA_INVALID_ID; + + if (GST_IS_DMABUF_ALLOCATOR (mem->allocator)) { + GstVaBufferSurface *buf; + + buf = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), + gst_va_buffer_surface_quark ()); + if (buf) + surface = buf->surface; + } else if (GST_IS_VA_ALLOCATOR (mem->allocator)) { + GstVaMemory *va_mem = (GstVaMemory *) mem; + surface = va_mem->surface; + } + + return surface; +} + +/** + * gst_va_memory_peek_display: + * @mem: a #GstMemory + * + * Returns: (transfer none): the display which + * this @mem belongs to. The reference of the display is unchanged. + * + * Since: 1.22 + */ +GstVaDisplay * +gst_va_memory_peek_display (GstMemory * mem) +{ + GstAllocator *allocator; + + if (!mem) + return NULL; + + allocator = GST_MEMORY_CAST (mem)->allocator; + /* no allocator, not VA kind memory. */ + if (!allocator) + return NULL; + + return gst_va_allocator_peek_display (allocator); +} + +/** + * gst_va_buffer_get_surface: (skip) + * @buffer: a #GstBuffer + * + * Returns: (type guint): the VASurfaceID in @buffer. + * + * Since: 1.22 + */ +VASurfaceID +gst_va_buffer_get_surface (GstBuffer * buffer) +{ + GstMemory *mem; + + mem = gst_buffer_peek_memory (buffer, 0); + if (!mem) + return VA_INVALID_ID; + + return gst_va_memory_get_surface (mem); +} + +/** + * gst_va_buffer_create_aux_surface: + * @buffer: a #GstBuffer + * + * Creates a new VASurfaceID with @buffer's allocator and attached it + * to it. + * + * *This method is used only by plugin's internal VA decoder.* + * + * Returns: %TRUE if the new VASurfaceID is attached to @buffer + * correctly; %FALSE, otherwise. + * + * Since: 1.22 + */ +gboolean +gst_va_buffer_create_aux_surface (GstBuffer * buffer) +{ + GstMemory *mem; + VASurfaceID surface = VA_INVALID_ID; + GstVaDisplay *display = NULL; + GstVideoFormat format; + gint width, height; + GstVaBufferSurface *surface_buffer; + + mem = gst_buffer_peek_memory (buffer, 0); + if (!mem) + return FALSE; + + /* Already created. */ + surface_buffer = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), + gst_va_buffer_aux_surface_quark ()); + if (surface_buffer) + return TRUE; + + if (!mem->allocator) + return FALSE; + + if (GST_IS_VA_DMABUF_ALLOCATOR (mem->allocator)) { + GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (mem->allocator); + guint32 fourcc, rt_format; + + format = GST_VIDEO_INFO_FORMAT (&self->info); + fourcc = gst_va_fourcc_from_video_format (format); + rt_format = gst_va_chroma_from_video_format (format); + if (fourcc == 0 || rt_format == 0) { + GST_ERROR_OBJECT (self, "Unsupported format: %s", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&self->info))); + return FALSE; + } + + display = self->display; + width = GST_VIDEO_INFO_WIDTH (&self->info); + height = GST_VIDEO_INFO_HEIGHT (&self->info); + if (!va_create_surfaces (self->display, rt_format, fourcc, + GST_VIDEO_INFO_WIDTH (&self->info), + GST_VIDEO_INFO_HEIGHT (&self->info), self->usage_hint, NULL, + &surface, 1)) + return FALSE; + } else if (GST_IS_VA_ALLOCATOR (mem->allocator)) { + GstVaAllocator *self = GST_VA_ALLOCATOR (mem->allocator); + + if (self->rt_format == 0) { + GST_ERROR_OBJECT (self, "Unknown fourcc or chroma format"); + return FALSE; + } + + display = self->display; + width = GST_VIDEO_INFO_WIDTH (&self->info); + height = GST_VIDEO_INFO_HEIGHT (&self->info); + format = GST_VIDEO_INFO_FORMAT (&self->info); + if (!va_create_surfaces (self->display, self->rt_format, self->fourcc, + GST_VIDEO_INFO_WIDTH (&self->info), + GST_VIDEO_INFO_HEIGHT (&self->info), self->usage_hint, NULL, + &surface, 1)) + return FALSE; + } else { + g_assert_not_reached (); + } + + if (!display || surface == VA_INVALID_ID) + return FALSE; + + surface_buffer = gst_va_buffer_surface_new (surface, format, width, height); + surface_buffer->display = gst_object_ref (display); + g_atomic_int_add (&surface_buffer->ref_count, 1); + + gst_mini_object_set_qdata (GST_MINI_OBJECT (mem), + gst_va_buffer_aux_surface_quark (), surface_buffer, + gst_va_buffer_surface_unref); + + return TRUE; +} + +/** + * gst_va_buffer_get_aux_surface: (skip) + * @buffer: a #GstBuffer + * + * Returns: (type guint): the VASurfaceID attached to + * @buffer. + * + * Since: 1.22 + */ +VASurfaceID +gst_va_buffer_get_aux_surface (GstBuffer * buffer) +{ + GstVaBufferSurface *surface_buffer; + GstMemory *mem; + + mem = gst_buffer_peek_memory (buffer, 0); + if (!mem) + return VA_INVALID_ID; + + surface_buffer = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), + gst_va_buffer_aux_surface_quark ()); + if (!surface_buffer) + return VA_INVALID_ID; + + /* No one increments it, and its lifetime is the same with the + gstmemory itself */ + g_assert (g_atomic_int_get (&surface_buffer->ref_count) == 1); + + return surface_buffer->surface; +} + +/** + * gst_va_buffer_peek_display: + * @buffer: a #GstBuffer + * + * Returns: (transfer none): the display which this + * @buffer belongs to. The reference of the display is unchanged. + * + * Since: 1.22 + */ +GstVaDisplay * +gst_va_buffer_peek_display (GstBuffer * buffer) +{ + GstMemory *mem; + + if (!buffer) + return NULL; + + mem = gst_buffer_peek_memory (buffer, 0); + /* Buffer without mem, not VA kind memory. */ + if (!mem) + return NULL; + + return gst_va_memory_peek_display (mem); +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvaallocator.h
Added
@@ -0,0 +1,138 @@ +/* GStreamer + * Copyright (C) 2020 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/allocators/allocators.h> +#include <gst/va/gstva.h> +#include <gst/video/video.h> +#include <stdint.h> +#include <va/va.h> + +G_BEGIN_DECLS + +#define GST_TYPE_VA_DMABUF_ALLOCATOR (gst_va_dmabuf_allocator_get_type()) +#define GST_VA_DMABUF_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_VA_DMABUF_ALLOCATOR, GstVaDmabufAllocator)) +#define GST_VA_DMABUF_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_VA_DMABUF_ALLOCATOR, GstVaDmabufAllocatorClass)) +#define GST_IS_VA_DMABUF_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_VA_DMABUF_ALLOCATOR)) +#define GST_IS_VA_DMABUF_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_VA_DMABUF_ALLOCATOR)) +#define GST_VA_DMABUF_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_VA_DMABUF_ALLOCATOR, GstVaDmabufAllocatorClass)) + +GST_VA_API +GType gst_va_dmabuf_allocator_get_type (void); +GST_VA_API +GstAllocator * gst_va_dmabuf_allocator_new (GstVaDisplay * display); +GST_VA_API +gboolean gst_va_dmabuf_allocator_setup_buffer (GstAllocator * allocator, + GstBuffer * buffer); +GST_VA_API +gboolean gst_va_dmabuf_allocator_prepare_buffer (GstAllocator * allocator, + GstBuffer * buffer); +GST_VA_API +void gst_va_dmabuf_allocator_flush (GstAllocator * allocator); +GST_VA_API +gboolean gst_va_dmabuf_allocator_set_format (GstAllocator * allocator, + GstVideoInfo * info, + guint usage_hint); +GST_VA_API +gboolean gst_va_dmabuf_allocator_get_format (GstAllocator * allocator, + GstVideoInfo * info, + guint * usage_hint); + +GST_VA_API +gboolean gst_va_dmabuf_memories_setup (GstVaDisplay * display, + GstVideoInfo * info, + guint n_planes, + GstMemory * memGST_VIDEO_MAX_PLANES, + uintptr_t * fds, + gsize offsetGST_VIDEO_MAX_PLANES, + guint usage_hint); + +#define GST_TYPE_VA_ALLOCATOR (gst_va_allocator_get_type()) +#define GST_VA_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_VA_ALLOCATOR, GstVaAllocator)) +#define GST_VA_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_VA_ALLOCATOR, GstVaAllocatorClass)) +#define GST_IS_VA_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_VA_ALLOCATOR)) +#define GST_IS_VA_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_VA_ALLOCATOR)) +#define GST_VA_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_VA_ALLOCATOR, GstVaAllocatorClass)) + +/** + * GST_ALLOCATOR_VASURFACE: + * + * Since: 1.22 + */ +#define GST_ALLOCATOR_VASURFACE "VAMemory" + +/** + * GST_MAP_VA: + * + * Flag indicating that we should map the VASurfaceID instead of to + * system memory, so users can use libva primitives to operate with + * that surface. + * + * Since: 1.22 + */ +#define GST_MAP_VA (GST_MAP_FLAG_LAST << 1) + +GST_VA_API +GType gst_va_allocator_get_type (void); +GST_VA_API +GstAllocator * gst_va_allocator_new (GstVaDisplay * display, + GArray * surface_formats); +GST_VA_API +GstMemory * gst_va_allocator_alloc (GstAllocator * allocator); +GST_VA_API +gboolean gst_va_allocator_setup_buffer (GstAllocator * allocator, + GstBuffer * buffer); +GST_VA_API +gboolean gst_va_allocator_prepare_buffer (GstAllocator * allocator, + GstBuffer * buffer); +GST_VA_API +void gst_va_allocator_flush (GstAllocator * allocator); +GST_VA_API +gboolean gst_va_allocator_set_format (GstAllocator * allocator, + GstVideoInfo * info, + guint usage_hint, + GstVaFeature use_derived); +GST_VA_API +gboolean gst_va_allocator_get_format (GstAllocator * allocator, + GstVideoInfo * info, + guint * usage_hint, + GstVaFeature * use_derived); +GST_VA_API +void gst_va_allocator_set_hacks (GstAllocator * allocator, + guint32 hacks); +GST_VA_API +GstVaDisplay * gst_va_allocator_peek_display (GstAllocator * allocator); + +GST_VA_API +VASurfaceID gst_va_memory_get_surface (GstMemory * mem); +GST_VA_API +GstVaDisplay * gst_va_memory_peek_display (GstMemory * mem); +GST_VA_API +VASurfaceID gst_va_buffer_get_surface (GstBuffer * buffer); + +GST_VA_API +gboolean gst_va_buffer_create_aux_surface (GstBuffer * buffer); +GST_VA_API +VASurfaceID gst_va_buffer_get_aux_surface (GstBuffer * buffer); +GST_VA_API +GstVaDisplay * gst_va_buffer_peek_display (GstBuffer * buffer); + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/va/gstvadisplay.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvadisplay.c
Changed
@@ -23,6 +23,7 @@ * @title: GstVaDisplay * @short_description: Generic VADisplay wrapper. * @sources: + * - gstva.h * - gstvadisplay.h * * It is a generic wrapper for VADisplay. To create new instances @@ -41,6 +42,7 @@ #endif #include "gstvadisplay.h" + #include <va/va.h> GST_DEBUG_CATEGORY (gst_va_display_debug); @@ -49,12 +51,12 @@ typedef struct _GstVaDisplayPrivate GstVaDisplayPrivate; struct _GstVaDisplayPrivate { - GRecMutex lock; VADisplay display; gboolean foreign; gboolean init; GstVaImplementation impl; + gchar *vendor_desc; }; #define gst_va_display_parent_class parent_class @@ -65,6 +67,7 @@ enum { PROP_VA_DISPLAY = 1, + PROP_DESC, N_PROPERTIES }; @@ -105,6 +108,7 @@ priv->foreign = TRUE; } priv->impl = _get_implementation (vendor); + priv->vendor_desc = g_strdup (vendor); return TRUE; } @@ -157,6 +161,9 @@ case PROP_VA_DISPLAY: g_value_set_pointer (value, priv->display); break; + case PROP_DESC: + g_value_set_string (value, priv->vendor_desc); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -193,7 +200,7 @@ { GstVaDisplayPrivate *priv = GET_PRIV (object); - g_rec_mutex_clear (&priv->lock); + g_free (priv->vendor_desc); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -213,6 +220,11 @@ g_param_spec_pointer ("va-display", "VADisplay", "VA Display handler", G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + g_propertiesPROP_DESC = + g_param_spec_string ("description", "Description", + "Vendor specific VA implementation description", NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (gobject_class, N_PROPERTIES, g_properties); } @@ -221,52 +233,9 @@ { GstVaDisplayPrivate *priv = GET_PRIV (self); - g_rec_mutex_init (&priv->lock); priv->impl = GST_VA_IMPLEMENTATION_INVALID; } -/** - * gst_va_display_lock: - * @self: a #GstVaDisplay - * - * Lock the display. It will be used before we call the - * VA API functions to serialize the VA commands. - * - * Since: 1.20 - **/ -void -gst_va_display_lock (GstVaDisplay * self) -{ - GstVaDisplayPrivate *priv; - - g_return_if_fail (GST_IS_VA_DISPLAY (self)); - - priv = GET_PRIV (self); - - g_rec_mutex_lock (&priv->lock); -} - -/** - * gst_va_display_unlock: - * @self: a #GstVaDisplay - * - * Unlock the display. It will be used after we call the - * VA API functions. - * - * Since: 1.20 - **/ -void -gst_va_display_unlock (GstVaDisplay * self) -{ - GstVaDisplayPrivate *priv; - - g_return_if_fail (GST_IS_VA_DISPLAY (self)); - - priv = GET_PRIV (self); - - g_rec_mutex_unlock (&priv->lock); -} - #ifndef GST_DISABLE_GST_DEBUG static gchar * _strip_msg (const char *message)
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/va/gstvadisplay.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvadisplay.h
Changed
@@ -20,9 +20,9 @@ #pragma once -#include <gst/va/va_fwd.h> -#include <gst/va/va-prelude.h> #include <gst/gst.h> +#include <gst/va/gstva.h> +#include <gst/va/va_fwd.h> G_BEGIN_DECLS @@ -122,10 +122,6 @@ GST_VA_API GType gst_va_display_get_type (void); GST_VA_API -void gst_va_display_lock (GstVaDisplay * self); -GST_VA_API -void gst_va_display_unlock (GstVaDisplay * self); -GST_VA_API gboolean gst_va_display_initialize (GstVaDisplay * self); GST_VA_API gpointer gst_va_display_get_va_dpy (GstVaDisplay * self);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/va/gstvadisplay_drm.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvadisplay_drm.c
Changed
@@ -33,6 +33,7 @@ #endif #include "gstvadisplay_drm.h" + #include <fcntl.h> #include <unistd.h> #include <sys/types.h>
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/va/gstvadisplay_drm.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvadisplay_drm.h
Changed
@@ -20,7 +20,8 @@ #pragma once -#include "gstvadisplay.h" +#include <gst/va/gstva.h> +#include <gst/va/va_fwd.h> G_BEGIN_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/va/gstvadisplay_wrapped.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvadisplay_wrapped.h
Changed
@@ -20,7 +20,8 @@ #pragma once -#include "gstvadisplay.h" +#include <gst/va/gstva.h> +#include <gst/va/va_fwd.h> G_BEGIN_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvapool.c
Added
@@ -0,0 +1,484 @@ +/* GStreamer + * Copyright (C) 2020 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:gstvapool + * @title: GstVaPool + * @short_description: VA Buffer pool + * @sources: + * - gstvapool.h + * + * @GstVaPool is a buffer pool for VA allocators. + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstvapool.h" + +GST_DEBUG_CATEGORY_STATIC (gst_va_pool_debug); +#define GST_CAT_DEFAULT gst_va_pool_debug + +/** + * GstVaPool: + * + * A buffer pool that uses either #GstVaAllocator or + * #GstVaDmabufAllocator to pre-allocate and recycle #GstBuffers. + * + * Since: 1.22 + */ +typedef struct _GstVaPool GstVaPool; +typedef struct _GstVaPoolClass GstVaPoolClass; + +struct _GstVaPool +{ + GstBufferPool parent; + + GstVideoInfo alloc_info; + GstVideoInfo caps_info; + GstAllocator *allocator; + gboolean force_videometa; + gboolean add_videometa; + gint crop_left; + gint crop_top; + + gboolean starting; +}; + +struct _GstVaPoolClass +{ + GstBufferPoolClass parent_class; +}; + +#define gst_va_pool_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstVaPool, gst_va_pool, GST_TYPE_BUFFER_POOL, + GST_DEBUG_CATEGORY_INIT (gst_va_pool_debug, "vapool", 0, "VA Pool")); + +static const gchar ** +gst_va_pool_get_options (GstBufferPool * pool) +{ + static const gchar *options = { GST_BUFFER_POOL_OPTION_VIDEO_META, NULL }; + return options; +} + +static inline gboolean +gst_buffer_pool_config_get_va_allocation_params (GstStructure * config, + guint32 * usage_hint, GstVaFeature * use_derived) +{ + if (!gst_structure_get (config, "usage-hint", G_TYPE_UINT, usage_hint, NULL)) { + *usage_hint = VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC; + } + + if (!gst_structure_get (config, "use-derived", GST_TYPE_VA_FEATURE, + use_derived, NULL)) { + *use_derived = GST_VA_FEATURE_AUTO; + } + + + return TRUE; +} + +static inline gboolean +gst_buffer_pool_config_get_va_alignment (GstStructure * config, + GstVideoAlignment * align) +{ + return gst_structure_get (config, + "va-padding-top", G_TYPE_UINT, &align->padding_top, + "va-padding-bottom", G_TYPE_UINT, &align->padding_bottom, + "va-padding-left", G_TYPE_UINT, &align->padding_left, + "va-padding-right", G_TYPE_UINT, &align->padding_right, NULL); +} + +static gboolean +gst_va_pool_set_config (GstBufferPool * pool, GstStructure * config) +{ + GstAllocator *allocator; + GstCaps *caps; + GstVaPool *vpool = GST_VA_POOL (pool); + GstVideoAlignment video_align = { 0, }; + GstVideoInfo caps_info, alloc_info; + gint width, height; + guint i, min_buffers, max_buffers; + guint32 usage_hint; + GstVaFeature use_derived; + gboolean has_alignment; + + if (!gst_buffer_pool_config_get_params (config, &caps, NULL, &min_buffers, + &max_buffers)) + goto wrong_config; + + if (!caps) + goto no_caps; + + if (!gst_video_info_from_caps (&caps_info, caps)) + goto wrong_caps; + + if (!gst_buffer_pool_config_get_allocator (config, &allocator, NULL)) + goto wrong_config; + + if (!(allocator && (GST_IS_VA_DMABUF_ALLOCATOR (allocator) + || GST_IS_VA_ALLOCATOR (allocator)))) + goto wrong_config; + + if (!gst_buffer_pool_config_get_va_allocation_params (config, &usage_hint, + &use_derived)) + goto wrong_config; + + width = GST_VIDEO_INFO_WIDTH (&caps_info); + height = GST_VIDEO_INFO_HEIGHT (&caps_info); + + GST_LOG_OBJECT (vpool, "%dx%d | %" GST_PTR_FORMAT, width, height, caps); + + /* enable metadata based on config of the pool */ + vpool->add_videometa = gst_buffer_pool_config_has_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_META); + + /* parse extra alignment info */ + has_alignment = gst_buffer_pool_config_get_va_alignment (config, + &video_align); + + if (has_alignment) { + width += video_align.padding_left + video_align.padding_right; + height += video_align.padding_bottom + video_align.padding_top; + + if (video_align.padding_left > 0) + vpool->crop_left = video_align.padding_left; + if (video_align.padding_top > 0) + vpool->crop_top = video_align.padding_top; + } + + /* update allocation info with aligned size */ + alloc_info = caps_info; + GST_VIDEO_INFO_WIDTH (&alloc_info) = width; + GST_VIDEO_INFO_HEIGHT (&alloc_info) = height; + + if (GST_IS_VA_DMABUF_ALLOCATOR (allocator)) { + if (!gst_va_dmabuf_allocator_set_format (allocator, &alloc_info, + usage_hint)) + goto failed_allocator; + } else if (GST_IS_VA_ALLOCATOR (allocator)) { + if (!gst_va_allocator_set_format (allocator, &alloc_info, usage_hint, + use_derived)) + goto failed_allocator; + } + + gst_object_replace ((GstObject **) & vpool->allocator, + GST_OBJECT (allocator)); + + vpool->caps_info = caps_info; + vpool->alloc_info = alloc_info; + + for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&caps_info); i++) { + if (GST_VIDEO_INFO_PLANE_STRIDE (&caps_info, i) != + GST_VIDEO_INFO_PLANE_STRIDE (&alloc_info, i) || + GST_VIDEO_INFO_PLANE_OFFSET (&caps_info, i) != + GST_VIDEO_INFO_PLANE_OFFSET (&alloc_info, i)) { + GST_INFO_OBJECT (vpool, "Video meta is required in buffer."); + vpool->force_videometa = TRUE; + break; + } + } + + gst_buffer_pool_config_set_params (config, caps, + GST_VIDEO_INFO_SIZE (&alloc_info), min_buffers, max_buffers); + + return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config); + + /* ERRORS */ +wrong_config: + { + GST_WARNING_OBJECT (vpool, "invalid config"); + return FALSE; + } +no_caps: + { + GST_WARNING_OBJECT (vpool, "no caps in config"); + return FALSE; + } +wrong_caps: + { + GST_WARNING_OBJECT (vpool, + "failed getting geometry from caps %" GST_PTR_FORMAT, caps); + return FALSE; + } +failed_allocator: + { + GST_WARNING_OBJECT (vpool, "Failed to set format to allocator"); + return FALSE; + } +} + +static GstFlowReturn +gst_va_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer, + GstBufferPoolAcquireParams * params) +{ + GstBuffer *buf; + GstVaPool *vpool = GST_VA_POOL (pool); + + buf = gst_buffer_new (); + + if (GST_IS_VA_DMABUF_ALLOCATOR (vpool->allocator)) { + if (vpool->starting) { + if (!gst_va_dmabuf_allocator_setup_buffer (vpool->allocator, buf)) + goto no_memory; + } else if (!gst_va_dmabuf_allocator_prepare_buffer (vpool->allocator, buf)) { + if (!gst_va_dmabuf_allocator_setup_buffer (vpool->allocator, buf)) + goto no_memory; + } + } else if (GST_IS_VA_ALLOCATOR (vpool->allocator)) { + if (vpool->starting) { + if (!gst_va_allocator_setup_buffer (vpool->allocator, buf)) + goto no_memory; + } else if (!gst_va_allocator_prepare_buffer (vpool->allocator, buf)) { + if (!gst_va_allocator_setup_buffer (vpool->allocator, buf)) + goto no_memory; + } + } else + goto no_memory; + + if (vpool->add_videometa) { + if (vpool->crop_left > 0 || vpool->crop_top > 0) { + GstVideoCropMeta *crop_meta; + + /* For video crop, its video meta's width and height should be + the full size of uncropped resolution. */ + gst_buffer_add_video_meta_full (buf, GST_VIDEO_FRAME_FLAG_NONE, + GST_VIDEO_INFO_FORMAT (&vpool->alloc_info), + GST_VIDEO_INFO_WIDTH (&vpool->alloc_info), + GST_VIDEO_INFO_HEIGHT (&vpool->alloc_info), + GST_VIDEO_INFO_N_PLANES (&vpool->alloc_info), + vpool->alloc_info.offset, vpool->alloc_info.stride); + + crop_meta = gst_buffer_add_video_crop_meta (buf); + crop_meta->x = vpool->crop_left; + crop_meta->y = vpool->crop_top; + crop_meta->width = GST_VIDEO_INFO_WIDTH (&vpool->caps_info); + crop_meta->height = GST_VIDEO_INFO_HEIGHT (&vpool->caps_info); + } else { + /* GstVaAllocator may update offset/stride given the physical + * memory */ + gst_buffer_add_video_meta_full (buf, GST_VIDEO_FRAME_FLAG_NONE, + GST_VIDEO_INFO_FORMAT (&vpool->caps_info), + GST_VIDEO_INFO_WIDTH (&vpool->caps_info), + GST_VIDEO_INFO_HEIGHT (&vpool->caps_info), + GST_VIDEO_INFO_N_PLANES (&vpool->caps_info), + vpool->alloc_info.offset, vpool->alloc_info.stride); + } + } + + *buffer = buf; + + return GST_FLOW_OK; + + /* ERROR */ +no_memory: + { + gst_buffer_unref (buf); + GST_WARNING_OBJECT (vpool, "can't create memory"); + return GST_FLOW_ERROR; + } +} + +static gboolean +gst_va_pool_start (GstBufferPool * pool) +{ + GstVaPool *vpool = GST_VA_POOL (pool); + gboolean ret; + + vpool->starting = TRUE; + ret = GST_BUFFER_POOL_CLASS (parent_class)->start (pool); + vpool->starting = FALSE; + + return ret; +} + +static gboolean +gst_va_pool_stop (GstBufferPool * pool) +{ + GstVaPool *vpool = GST_VA_POOL (pool); + gboolean ret; + + ret = GST_BUFFER_POOL_CLASS (parent_class)->stop (pool); + + if (GST_IS_VA_DMABUF_ALLOCATOR (vpool->allocator)) + gst_va_dmabuf_allocator_flush (vpool->allocator); + else if (GST_IS_VA_ALLOCATOR (vpool->allocator)) + gst_va_allocator_flush (vpool->allocator); + + return ret; +} + +static void +gst_va_pool_dispose (GObject * object) +{ + GstVaPool *pool = GST_VA_POOL (object); + + GST_LOG_OBJECT (pool, "finalize video buffer pool %p", pool); + + gst_clear_object (&pool->allocator); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_va_pool_class_init (GstVaPoolClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstBufferPoolClass *gstbufferpool_class = GST_BUFFER_POOL_CLASS (klass); + + gobject_class->dispose = gst_va_pool_dispose; + + gstbufferpool_class->get_options = gst_va_pool_get_options; + gstbufferpool_class->set_config = gst_va_pool_set_config; + gstbufferpool_class->alloc_buffer = gst_va_pool_alloc; + gstbufferpool_class->start = gst_va_pool_start; + gstbufferpool_class->stop = gst_va_pool_stop; +} + +static void +gst_va_pool_init (GstVaPool * self) +{ +} + +/** + * gst_va_pool_new: + * + * Returns: A new #GstBufferPool for VA allocators. + * + * Since: 1.22 + */ +GstBufferPool * +gst_va_pool_new (void) +{ + GstVaPool *pool; + + pool = g_object_new (GST_TYPE_VA_POOL, NULL); + gst_object_ref_sink (pool); + + GST_LOG_OBJECT (pool, "new va video buffer pool %p", pool); + + return GST_BUFFER_POOL_CAST (pool); +} + +/** + * gst_buffer_pool_config_set_va_allocation_params: + * @config: the #GstStructure with the pool's configuration. + * @usage_hint: the VA usage hint for new VASurfaceID. + * @use_derived: a #GstVaFeature for derived mapping (only used when + * VA allocator). + * + * Sets the usage hint for the buffers handled by the buffer pool. + * + * Since: 1.22 + */ +void +gst_buffer_pool_config_set_va_allocation_params (GstStructure * config, + guint usage_hint, GstVaFeature use_derived) +{ + gst_structure_set (config, "usage-hint", G_TYPE_UINT, usage_hint, + "use-derived", GST_TYPE_VA_FEATURE, use_derived, NULL); +} + +/** + * gst_buffer_pool_config_set_va_alignment: + * @config: the #GstStructure with the pool's configuration. + * @align: a #GstVideoAlignment + * + * Video alignment is not handled as expected by VA since it uses + * opaque surfaces, not directly mappable memory. Still, decoders + * might need to request bigger surfaces for coded size rather than + * display sizes. This method will set the coded size to bufferpool's + * configuration, out of the typical video aligment. + * + * Since: 1.20.2 + */ +void +gst_buffer_pool_config_set_va_alignment (GstStructure * config, + const GstVideoAlignment * align) +{ + gst_structure_set (config, + "va-padding-top", G_TYPE_UINT, align->padding_top, + "va-padding-bottom", G_TYPE_UINT, align->padding_bottom, + "va-padding-left", G_TYPE_UINT, align->padding_left, + "va-padding-right", G_TYPE_UINT, align->padding_right, NULL); +} + +/** + * gst_va_pool_requires_video_meta: + * @pool: the #GstBufferPool + * + * Retuns: %TRUE if @pool always add #GstVideoMeta to its + * buffers. Otherwise, %FALSE. + * + * Since: 1.22 + */ +gboolean +gst_va_pool_requires_video_meta (GstBufferPool * pool) +{ + + g_return_val_if_fail (GST_IS_VA_POOL (pool), FALSE); + + return GST_VA_POOL (pool)->force_videometa; +} + +/** + * gst_va_pool_new_with_config: + * @caps: the #GstCaps of the buffers handled by the new pool. + * @size: the size of the frames to hold. + * @min_buffers: minimum number of frames to create. + * @max_buffers: maximum number of frames to create. + * @usage_hint: VA usage hint + * @use_derived: a #GstVaFeature for derived mapping (only used when + * VA allocator). + * @allocator: the VA allocator to use. + * @alloc_params: #GstAllocationParams to use. + * + * Returns: a new #GstBufferPool that handles VASurfacesID-backed + * buffers. If the pool cannot be configured correctly, %NULL is + * returned. + * + * Since: 1.22 + */ +GstBufferPool * +gst_va_pool_new_with_config (GstCaps * caps, guint size, guint min_buffers, + guint max_buffers, guint usage_hint, GstVaFeature use_derived, + GstAllocator * allocator, GstAllocationParams * alloc_params) +{ + GstBufferPool *pool; + GstStructure *config; + + pool = gst_va_pool_new (); + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_params (config, caps, size, min_buffers, + max_buffers); + gst_buffer_pool_config_set_va_allocation_params (config, usage_hint, + use_derived); + gst_buffer_pool_config_set_allocator (config, allocator, alloc_params); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + + if (!gst_buffer_pool_set_config (pool, config)) + gst_clear_object (&pool); + + return pool; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvapool.h
Added
@@ -0,0 +1,59 @@ +/* GStreamer + * Copyright (C) 2020 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/va/gstva.h> + +G_BEGIN_DECLS + +#define GST_TYPE_VA_POOL (gst_va_pool_get_type()) +#define GST_VA_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_VA_POOL, GstVaPool)) +#define GST_VA_POOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_VA_POOL, GstVaPoolClass)) +#define GST_IS_VA_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_VA_POOL)) +#define GST_IS_VA_POOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_VA_POOL)) +#define GST_VA_POOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_VA_POOL, GstVaPoolClass)) + +GST_VA_API +GType gst_va_pool_get_type (void); +GST_VA_API +GstBufferPool * gst_va_pool_new (void); +GST_VA_API +gboolean gst_va_pool_requires_video_meta (GstBufferPool * pool); +GST_VA_API +void gst_buffer_pool_config_set_va_allocation_params (GstStructure * config, + guint usage_hint, + GstVaFeature use_derived); +GST_VA_API +void gst_buffer_pool_config_set_va_alignment (GstStructure * config, + const GstVideoAlignment * align); +GST_VA_API +GstBufferPool * gst_va_pool_new_with_config (GstCaps * caps, + guint size, + guint min_buffers, + guint max_buffers, + guint usage_hint, + GstVaFeature use_derived, + GstAllocator * allocator, + GstAllocationParams * alloc_params); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvasurfacecopy.c
Added
@@ -0,0 +1,120 @@ +/* GStreamer + * Copyright (C) 2021 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstvasurfacecopy.h" +#include "vasurfaceimage.h" + +#define GST_CAT_DEFAULT gst_va_memory_debug +GST_DEBUG_CATEGORY_EXTERN (gst_va_memory_debug); + +struct _GstVaSurfaceCopy +{ + GstVaDisplay *display; + + GstVideoInfo info; + gboolean has_copy; + + GRecMutex lock; +}; + +static gboolean +_has_copy (GstVaDisplay * display) +{ +#if VA_CHECK_VERSION (1, 12, 0) + VADisplay dpy; + VADisplayAttribute attr = { + .type = VADisplayAttribCopy, + .flags = VA_DISPLAY_ATTRIB_GETTABLE, + }; + VAStatus status; + + dpy = gst_va_display_get_va_dpy (display); + + status = vaGetDisplayAttributes (dpy, &attr, 1); + if (status != VA_STATUS_SUCCESS) { + GST_INFO ("vaGetDisplayAttribures: %s", vaErrorStr (status)); + return FALSE; + } + + return TRUE; +#else + return FALSE; +#endif +} + +GstVaSurfaceCopy * +gst_va_surface_copy_new (GstVaDisplay * display, GstVideoInfo * vinfo) +{ + GstVaSurfaceCopy *self; + + g_return_val_if_fail (GST_IS_VA_DISPLAY (display), NULL); + g_return_val_if_fail (vinfo != NULL, NULL); + + self = g_slice_new (GstVaSurfaceCopy); + self->display = gst_object_ref (display); + self->has_copy = _has_copy (display); + self->info = *vinfo; + g_rec_mutex_init (&self->lock); + + return self; +} + +void +gst_va_surface_copy_free (GstVaSurfaceCopy * self) +{ + g_return_if_fail (self && GST_IS_VA_DISPLAY (self->display)); + + gst_clear_object (&self->display); + + g_rec_mutex_clear (&self->lock); + + g_slice_free (GstVaSurfaceCopy, self); +} + +gboolean +gst_va_surface_copy (GstVaSurfaceCopy * self, VASurfaceID dst, VASurfaceID src) +{ + VAImage image = {.image_id = VA_INVALID_ID, }; + gboolean ret; + + g_return_val_if_fail (self && GST_IS_VA_DISPLAY (self->display), FALSE); + + if (self->has_copy && va_copy_surface (self->display, dst, src)) { + GST_LOG ("GPU copy of %#x to %#x", src, dst); + return TRUE; + } + + /* TODO: Add the VPP copy. */ + + if (!va_ensure_image (self->display, src, &self->info, &image, FALSE)) + return FALSE; + + if ((ret = va_put_image (self->display, dst, &image))) + GST_LOG ("shallow copy of %#x to %#x", src, dst); + + va_unmap_buffer (self->display, image.buf); + va_destroy_image (self->display, image.image_id); + + return ret; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvasurfacecopy.h
Added
@@ -0,0 +1,46 @@ +/* GStreamer + * Copyright (C) 2021 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/va/gstva.h> +#include <gst/va/va_fwd.h> +#include <gst/video/video.h> +#include <va/va.h> + +G_BEGIN_DECLS + +/** + * GstVaSurfaceCopy: + * + * Opaque object helper for copying surfaces. + * + * It's purpose is to avoid circular dependencies. + */ +typedef struct _GstVaSurfaceCopy GstVaSurfaceCopy; + +GstVaSurfaceCopy * gst_va_surface_copy_new (GstVaDisplay * display, + GstVideoInfo * vinfo); +void gst_va_surface_copy_free (GstVaSurfaceCopy * self); +gboolean gst_va_surface_copy (GstVaSurfaceCopy * self, + VASurfaceID dst, + VASurfaceID src); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvautils.c
Added
@@ -0,0 +1,461 @@ +/* GStreamer + * Copyright (C) 2020 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:gstvautils + * @title: GstVaUtils + * @short_description: Utility functions for context handling + * @sources: + * - gstvautils.h + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstvautils.h" + +#include <gst/va/gstvadisplay_drm.h> +#include <gst/va/gstvadisplay_wrapped.h> + +GST_DEBUG_CATEGORY_STATIC (GST_CAT_CONTEXT); + +static void +_init_context_debug (void) +{ +#ifndef GST_DISABLE_GST_DEBUG + static gsize _init = 0; + + if (g_once_init_enter (&_init)) { + GST_DEBUG_CATEGORY_GET (GST_CAT_CONTEXT, "GST_CONTEXT"); + g_once_init_leave (&_init, 1); + } +#endif +} + +static gboolean +gst_va_display_found (GstElement * element, GstVaDisplay * display) +{ + if (display) { + GST_CAT_LOG_OBJECT (GST_CAT_CONTEXT, element, "already have a display (%p)", + display); + return TRUE; + } + + return FALSE; +} + +static gboolean +pad_query (const GValue * item, GValue * value, gpointer user_data) +{ + GstPad *pad = g_value_get_object (item); + GstQuery *query = user_data; + gboolean res; + + res = gst_pad_peer_query (pad, query); + + if (res) { + g_value_set_boolean (value, TRUE); + return FALSE; + } + + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, pad, "pad peer query failed"); + return TRUE; +} + +static gboolean +_gst_va_run_query (GstElement * element, GstQuery * query, + GstPadDirection direction) +{ + GstIterator *it; + GstIteratorFoldFunction func = pad_query; + GValue res = G_VALUE_INIT; + + g_value_init (&res, G_TYPE_BOOLEAN); + g_value_set_boolean (&res, FALSE); + + if (direction == GST_PAD_SRC) + it = gst_element_iterate_src_pads (element); + else + it = gst_element_iterate_sink_pads (element); + + while (gst_iterator_fold (it, func, &res, query) == GST_ITERATOR_RESYNC) + gst_iterator_resync (it); + + gst_iterator_free (it); + + return g_value_get_boolean (&res); +} + +/** + * gst_va_context_query: + * @element: a #GstElement + * @context_type: the #gchar string specify the context type name + * + * Query the specified context type name. + * + * Since: 1.22 + **/ +void +gst_va_context_query (GstElement * element, const gchar * context_type) +{ + GstQuery *query; + GstContext *ctxt = NULL; + + _init_context_debug (); + + /* 2a) Query downstream with GST_QUERY_CONTEXT for the context and + * check if downstream already has a context of the specific type + * 2b) Query upstream as above. + */ + query = gst_query_new_context (context_type); + if (_gst_va_run_query (element, query, GST_PAD_SRC)) { + gst_query_parse_context (query, &ctxt); + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, + "found context (%p) in downstream query", ctxt); + gst_element_set_context (element, ctxt); + } else if (_gst_va_run_query (element, query, GST_PAD_SINK)) { + gst_query_parse_context (query, &ctxt); + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, + "found context (%p) in upstream query", ctxt); + gst_element_set_context (element, ctxt); + } else { + /* 3) Post a GST_MESSAGE_NEED_CONTEXT message on the bus with + * the required context type and afterwards check if a + * usable context was set now as in 1). The message could + * be handled by the parent bins of the element and the + * application. + */ + GstMessage *msg; + + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, + "posting need context message"); + msg = gst_message_new_need_context (GST_OBJECT_CAST (element), + context_type); + gst_element_post_message (element, msg); + } + + /* + * Whomever responds to the need-context message performs a + * GstElement::set_context() with the required context in which the element + * is required to update the display_ptr or call gst_va_handle_set_context(). + */ + + gst_query_unref (query); +} + +/** + * gst_va_element_propagate_display_context: + * @element: a #GstElement + * @display: the #GstVaDisplay to propagate + * + * Propagate @display by posting it as #GstContext in the pipeline's bus. + * + * Since: 1.22 + **/ +void +gst_va_element_propagate_display_context (GstElement * element, + GstVaDisplay * display) +{ + GstContext *ctxt; + GstMessage *msg; + + _init_context_debug (); + + if (!display) { + GST_ERROR_OBJECT (element, "Could not get VA display connection"); + return; + } + + /* 4) Create a context by itself and post a GST_MESSAGE_HAVE_CONTEXT + * message. + */ + ctxt = gst_context_new (GST_VA_DISPLAY_HANDLE_CONTEXT_TYPE_STR, TRUE); + gst_context_set_va_display (ctxt, display); + + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, + "post have context (%p) message with display (%p)", ctxt, display); + msg = gst_message_new_have_context (GST_OBJECT_CAST (element), ctxt); + gst_element_post_message (element, msg); +} + +/** + * gst_va_ensure_element_data: + * @element: a #GstElement + * @render_device_path: the #gchar string of render device path + * @display_ptr: (out) (transfer full): The #GstVaDisplay to ensure + * + * Called by the va element to ensure a valid #GstVaDisplay. + * + * Returns: whether a #GstVaDisplay exists in @display_ptr + * + * Since: 1.22 + **/ +gboolean +gst_va_ensure_element_data (gpointer element, const gchar * render_device_path, + GstVaDisplay ** display_ptr) +{ + GstVaDisplay *display; + + _init_context_debug (); + + g_return_val_if_fail (element, FALSE); + g_return_val_if_fail (render_device_path, FALSE); + g_return_val_if_fail (display_ptr, FALSE); + + /* 1) Check if the element already has a context of the specific + * type. + */ + if (gst_va_display_found (element, g_atomic_pointer_get (display_ptr))) + goto done; + + gst_va_context_query (element, GST_VA_DISPLAY_HANDLE_CONTEXT_TYPE_STR); + + /* Neighbour found and it updated the display. */ + if (gst_va_display_found (element, g_atomic_pointer_get (display_ptr))) + goto done; + + /* If no neighbor, or application not interested, use drm. */ + display = gst_va_display_drm_new_from_path (render_device_path); + + gst_object_replace ((GstObject **) display_ptr, (GstObject *) display); + + gst_va_element_propagate_display_context (element, display); + + gst_clear_object (&display); + +done: + return g_atomic_pointer_get (display_ptr) != NULL; +} + +/** + * gst_va_handle_set_context: + * @element: a #GstElement + * @context: a #GstContext may contain the display + * @render_device_path: the #gchar string of render device path + * @display_ptr: (out) (transfer full): The #GstVaDisplay to set + * + * Called by elements in their #GstElementClass::set_context vmethod. + * It gets a valid #GstVaDisplay if @context has it. + * + * Returns: whether the @display_ptr could be successfully set to a + * valid #GstVaDisplay in the @context + * + * Since: 1.22 + **/ +gboolean +gst_va_handle_set_context (GstElement * element, GstContext * context, + const gchar * render_device_path, GstVaDisplay ** display_ptr) +{ + GstVaDisplay *display_replacement = NULL; + const gchar *context_type, *type_name; + + _init_context_debug (); + + g_return_val_if_fail (display_ptr, FALSE); + + if (!context) + return FALSE; + + context_type = gst_context_get_context_type (context); + + if (g_strcmp0 (context_type, GST_VA_DISPLAY_HANDLE_CONTEXT_TYPE_STR) == 0) { + type_name = G_OBJECT_TYPE_NAME (element); + if (!gst_context_get_va_display (context, type_name, render_device_path, + &display_replacement)) { + GST_CAT_WARNING_OBJECT (GST_CAT_CONTEXT, element, + "Failed to get display from context"); + return FALSE; + } + } + + if (display_replacement) { + gst_object_replace ((GstObject **) display_ptr, + (GstObject *) display_replacement); + gst_object_unref (display_replacement); + } + + return TRUE; +} + +/** + * gst_va_handle_context_query: + * @element: a #GstElement + * @query: a #GstQuery to query the context + * @display: a #GstVaDisplay to answer the query + * + * Used by elements when processing their pad's queries, propagating + * element's #GstVaDisplay if the processed query requests it. + * + * Returns: whether we can handle the context query successfully + * + * Since: 1.22 + **/ +gboolean +gst_va_handle_context_query (GstElement * element, GstQuery * query, + GstVaDisplay * display) +{ + const gchar *context_type; + GstContext *ctxt, *old_ctxt; + + _init_context_debug (); + + g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE); + g_return_val_if_fail (GST_IS_QUERY (query), FALSE); + g_return_val_if_fail (!display || GST_IS_VA_DISPLAY (display), FALSE); + + GST_CAT_LOG_OBJECT (GST_CAT_CONTEXT, element, + "handle context query %" GST_PTR_FORMAT, query); + gst_query_parse_context_type (query, &context_type); + + if (!display + || g_strcmp0 (context_type, GST_VA_DISPLAY_HANDLE_CONTEXT_TYPE_STR) != 0) + return FALSE; + + gst_query_parse_context (query, &old_ctxt); + + if (old_ctxt) + ctxt = gst_context_copy (old_ctxt); + else + ctxt = gst_context_new (GST_VA_DISPLAY_HANDLE_CONTEXT_TYPE_STR, TRUE); + + gst_context_set_va_display (ctxt, display); + gst_query_set_context (query, ctxt); + gst_context_unref (ctxt); + GST_CAT_DEBUG_OBJECT (GST_CAT_CONTEXT, element, + "successfully %" GST_PTR_FORMAT " on %" GST_PTR_FORMAT, display, query); + + return TRUE; +} + +/** + * gst_context_get_va_display: + * @context: a #GstContext may contain the display + * @type_name: a #gchar string of the element type + * @render_device_path: the #gchar string of render device path + * @display_ptr: (out) (transfer full): the #GstVaDisplay we get + * + * Returns: whether we find a valid @display in the @context + * + * Since: 1.22 + **/ +gboolean +gst_context_get_va_display (GstContext * context, const gchar * type_name, + const gchar * render_device_path, GstVaDisplay ** display_ptr) +{ + const GstStructure *s; + GstVaDisplay *display = NULL; + gpointer dpy; + gboolean is_devnode; + + _init_context_debug (); + + g_return_val_if_fail (display_ptr, FALSE); + g_return_val_if_fail (context, FALSE); + + is_devnode = (g_strstr_len (type_name, -1, "renderD") != NULL); + + s = gst_context_get_structure (context); + if (gst_structure_get (s, "gst-display", GST_TYPE_OBJECT, &display, NULL)) { + gchar *device_path = NULL; + gboolean ret; + + if (GST_IS_VA_DISPLAY_DRM (display)) { + g_object_get (display, "path", &device_path, NULL); + ret = (g_strcmp0 (device_path, render_device_path) == 0); + g_free (device_path); + if (ret) + goto accept; + } else if (GST_IS_VA_DISPLAY (display) && !is_devnode) { + goto accept; + } + + /* let's try other fields */ + gst_clear_object (&display); + } + + /* if element is render device node specific, it doesn't accept + * VADisplay from users */ + if (!is_devnode + && gst_structure_get (s, "va-display", G_TYPE_POINTER, &dpy, NULL)) { + if ((display = gst_va_display_wrapped_new (dpy))) + goto accept; + } + + GST_CAT_DEBUG (GST_CAT_CONTEXT, "No valid GstVaDisplay from context (%p)", + context); + return FALSE; + +accept: + { + *display_ptr = display; + + GST_CAT_LOG (GST_CAT_CONTEXT, "got GstVaDisplay (%p) from context (%p)", + *display_ptr, context); + return TRUE; + } +} + +/** + * gst_context_set_va_display: + * @context: a #GstContext + * @display: the #GstVaDisplay we want to set + * + * Set the @display in the @context + * + * Since: 1.22 + */ +void +gst_context_set_va_display (GstContext * context, GstVaDisplay * display) +{ + GstStructure *s; + + _init_context_debug (); + + g_return_if_fail (context != NULL); + + s = gst_context_writable_structure (context); + gst_structure_set (s, "gst-display", GST_TYPE_OBJECT, display, NULL); + + if (display) { + GObjectClass *klass = G_OBJECT_GET_CLASS (display); + gchar *vendor_desc = NULL; + gchar *path = NULL; + + g_object_get (display, "description", &vendor_desc, NULL); + if (g_object_class_find_property (klass, "path")) + g_object_get (display, "path", &path, NULL); + + GST_CAT_LOG (GST_CAT_CONTEXT, + "setting GstVaDisplay (%" GST_PTR_FORMAT ") on context (%" + GST_PTR_FORMAT "), description: \"%s\", path: %s", display, context, + GST_STR_NULL (vendor_desc), GST_STR_NULL (path)); + + if (vendor_desc) { + gst_structure_set (s, "description", G_TYPE_STRING, vendor_desc, NULL); + g_free (vendor_desc); + } + + if (path) { + gst_structure_set (s, "path", G_TYPE_STRING, path, NULL); + g_free (path); + } + } +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvautils.h
Added
@@ -0,0 +1,57 @@ +/* GStreamer + * Copyright (C) 2020 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/va/gstva.h> +#include <gst/va/va_fwd.h> + +G_BEGIN_DECLS + +GST_VA_API +gboolean gst_va_ensure_element_data (gpointer element, + const gchar *render_device_path, + GstVaDisplay ** display_ptr); +GST_VA_API +void gst_va_context_query (GstElement * element, + const gchar * context_type); +GST_VA_API +gboolean gst_va_handle_set_context (GstElement * element, + GstContext * context, + const gchar *render_device_path, + GstVaDisplay ** display_ptr); +GST_VA_API +gboolean gst_va_handle_context_query (GstElement * element, + GstQuery * query, + GstVaDisplay * display); +GST_VA_API +void gst_va_element_propagate_display_context (GstElement * element, + GstVaDisplay * display); +GST_VA_API +gboolean gst_context_get_va_display (GstContext * context, + const gchar * type_name, + const gchar * render_device_path, + GstVaDisplay ** display_ptr); +GST_VA_API +void gst_context_set_va_display (GstContext * context, + GstVaDisplay * display); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvavideoformat.c
Added
@@ -0,0 +1,405 @@ +/* GStreamer + * Copyright (C) 2020 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstvavideoformat.h" + +#define GST_CAT_DEFAULT gst_va_display_debug +GST_DEBUG_CATEGORY_EXTERN (gst_va_display_debug); + +#define VA_NSB_FIRST 0 /* No Significant Bit */ + +/* *INDENT-OFF* */ +static struct FormatMap +{ + GstVideoFormat format; + guint va_rtformat; + VAImageFormat va_format; +} format_map = { +#define F(format, fourcc, rtformat, order, bpp, depth, r, g, b, a) { \ + G_PASTE (GST_VIDEO_FORMAT_, format), \ + G_PASTE (VA_RT_FORMAT_, rtformat), \ + { VA_FOURCC fourcc, G_PASTE (G_PASTE (VA_, order), _FIRST), \ + bpp, depth, r, g, b, a } } +#define G(format, fourcc, rtformat, order, bpp) \ + F (format, fourcc, rtformat, order, bpp, 0, 0, 0 ,0, 0) + G (NV12, ('N', 'V', '1', '2'), YUV420, NSB, 12), + G (NV21, ('N', 'V', '2', '1'), YUV420, NSB, 21), + G (VUYA, ('A', 'Y', 'U', 'V'), YUV444, LSB, 32), + F (RGBA, ('R', 'G', 'B', 'A'), RGB32, LSB, 32, 32, 0x000000ff, + 0x0000ff00, 0x00ff0000, 0xff000000), + F (RGBx, ('R', 'G', 'B', 'X'), RGB32, LSB, 32, 24, 0x000000ff, + 0x0000ff00, 0x00ff0000, 0x00000000), + F (BGRA, ('B', 'G', 'R', 'A'), RGB32, LSB, 32, 32, 0x00ff0000, + 0x0000ff00, 0x000000ff, 0xff000000), + F (ARGB, ('A', 'R', 'G', 'B'), RGB32, LSB, 32, 32, 0x0000ff00, + 0x00ff0000, 0xff000000, 0x000000ff), + F (xRGB, ('X', 'R', 'G', 'B'), RGB32, LSB, 32, 24, 0x0000ff00, + 0x00ff0000, 0xff000000, 0x00000000), + F (ABGR, ('A', 'B', 'G', 'R'), RGB32, LSB, 32, 32, 0xff000000, + 0x00ff0000, 0x0000ff00, 0x000000ff), + F (xBGR, ('X', 'B', 'G', 'R'), RGB32, LSB, 32, 24, 0xff000000, + 0x00ff0000, 0x0000ff00, 0x00000000), + F (BGRx, ('B', 'G', 'R', 'X'), RGB32, LSB, 32, 24, 0x00ff0000, + 0x0000ff00, 0x000000ff, 0x00000000), + G (UYVY, ('U', 'Y', 'V', 'Y'), YUV422, NSB, 16), + G (YUY2, ('Y', 'U', 'Y', '2'), YUV422, NSB, 16), + G (AYUV, ('A', 'Y', 'U', 'V'), YUV444, LSB, 32), + /* F (????, NV11), */ + G (YV12, ('Y', 'V', '1', '2'), YUV420, NSB, 12), + /* F (????, P208), */ + G (I420, ('I', '4', '2', '0'), YUV420, NSB, 12), + /* F (????, YV24), */ + /* F (????, YV32), */ + /* F (????, Y800), */ + /* F (????, IMC3), */ + /* F (????, 411P), */ + /* F (????, 411R), */ + G (Y42B, ('4', '2', '2', 'H'), YUV422, LSB, 16), + /* F (????, 422V), */ + /* F (????, 444P), */ + G (RGBP, ('R', 'G', 'B', 'P'), RGBP, LSB, 8), + /* F (????, BGRP), */ + /* F (????, RGB565), */ + /* F (????, BGR565), */ + G (Y210, ('Y', '2', '1', '0'), YUV422_10, NSB, 32), + /* F (????, Y216), */ + G (Y410, ('Y', '4', '1', '0'), YUV444_10, NSB, 32), + G (Y212_LE, ('Y', '2', '1', '2'), YUV422_12, NSB, 32), + G (Y412_LE, ('Y', '4', '1', '2'), YUV444_12, NSB, 32), + /* F (????, Y416), */ + /* F (????, YV16), */ + G (P010_10LE, ('P', '0', '1', '0'), YUV420_10, NSB, 24), + G (P012_LE, ('P', '0', '1', '2'), YUV420_12, NSB, 24), + /* F (P016_LE, P016, ????), */ + /* F (????, I010), */ + /* F (????, IYUV), */ + /* F (????, A2R10G10B10), */ + /* F (????, A2B10G10R10), */ + /* F (????, X2R10G10B10), */ + /* F (????, X2B10G10R10), */ + G (GRAY8, ('Y', '8', '0', '0'), YUV400, NSB, 8), + G (Y444, ('4', '4', '4', 'P'), YUV444, NSB, 24), + /* F (????, Y16), */ + /* G (VYUY, VYUY, YUV422), */ + /* G (YVYU, YVYU, YUV422), */ + /* F (ARGB64, ARGB64, ????), */ + /* F (????, ABGR64), */ + F (RGB16, ('R', 'G', '1', '6'), RGB16, NSB, 16, 16, 0x0000f800, + 0x000007e0, 0x0000001f, 0x00000000), + F (RGB, ('R', 'G', '2', '4'), RGB32, NSB, 32, 24, 0x00ff0000, + 0x0000ff00, 0x000000ff, 0x00000000), + F (BGR10A2_LE, ('A', 'R', '3', '0'), RGB32, LSB, 32, 30, 0x3ff00000, + 0x000ffc00, 0x000003ff, 0x30000000), +#undef F +#undef G +}; + +static const struct RBG32FormatMap +{ + GstVideoFormat format; + VAImageFormat va_format2; +} rgb32_format_map = { +#define F(fourcc, order, bpp, depth, r, g, b, a) \ + { VA_FOURCC fourcc, G_PASTE (G_PASTE (VA_, order), _FIRST), bpp, depth, r, g, b, a } +#define A(fourcc, order, r, g, b, a) F (fourcc, order, 32, 32, r, g, b, a) +#define X(fourcc, order, r, g, b) F (fourcc, order, 32, 24, r, g, b, 0x0) + { GST_VIDEO_FORMAT_ARGB, { + A (('B', 'G', 'R', 'A'), LSB, 0x0000ff00, 0x00ff0000, 0xff000000, 0x000000ff), + A (('A', 'R', 'G', 'B'), MSB, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000), + } }, + { GST_VIDEO_FORMAT_RGBA, { + A (('A', 'B', 'G', 'R'), LSB, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000), + A (('R', 'G', 'B', 'A'), MSB, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff), + } }, + { GST_VIDEO_FORMAT_ABGR, { + A (('R', 'G', 'B', 'A'), LSB, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff), + A (('A', 'B', 'G', 'R'), MSB, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000), + } }, + { GST_VIDEO_FORMAT_BGRA, { + A (('A', 'R', 'G', 'B'), LSB, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000), + A (('B', 'G', 'R', 'A'), MSB, 0x0000ff00, 0x00ff0000, 0xff000000, 0x000000ff), + } }, + { GST_VIDEO_FORMAT_xRGB, { + X (('B', 'G', 'R', 'X'), LSB, 0x0000ff00, 0x00ff0000, 0xff000000), + X (('X', 'R', 'G', 'B'), MSB, 0x00ff0000, 0x0000ff00, 0x000000ff), + } }, + { GST_VIDEO_FORMAT_RGBx, { + X (('X', 'B', 'G', 'R'), LSB, 0x000000ff, 0x0000ff00, 0x00ff0000), + X (('R', 'G', 'B', 'X'), MSB, 0xff000000, 0x00ff0000, 0x0000ff00), + } }, + { GST_VIDEO_FORMAT_xBGR, { + X (('R', 'G', 'B', 'X'), LSB, 0xff000000, 0x00ff0000, 0x0000ff00), + X (('X', 'B', 'G', 'R'), MSB, 0x000000ff, 0x0000ff00, 0x00ff0000), + } }, + { GST_VIDEO_FORMAT_BGRx, { + X (('X', 'R', 'G', 'B'), LSB, 0x00ff0000, 0x0000ff00, 0x000000ff), + X (('B', 'G', 'R', 'X'), MSB, 0x0000ff00, 0x00ff0000, 0xff000000), + } }, +#undef X +#undef A +#undef F +}; +/* *INDENT-ON* */ + +static const struct FormatMap * +get_format_map_from_va_fourcc (guint va_fourcc) +{ + int i; + + for (i = 0; i < G_N_ELEMENTS (format_map); i++) { + if (format_mapi.va_format.fourcc == va_fourcc) + return &format_mapi; + } + + return NULL; +} + +static struct FormatMap * +get_format_map_from_video_format (GstVideoFormat format) +{ + int i; + + for (i = 0; i < G_N_ELEMENTS (format_map); i++) { + if (format_mapi.format == format) + return &format_mapi; + } + + return NULL; +} + +static inline gboolean +va_format_is_rgb (const VAImageFormat * va_format) +{ + return va_format->depth != 0; +} + +static inline gboolean +va_format_is_same_rgb (const VAImageFormat * fmt1, const VAImageFormat * fmt2) +{ + return (fmt1->red_mask == fmt2->red_mask + && fmt1->green_mask == fmt2->green_mask + && fmt1->blue_mask == fmt2->blue_mask + && fmt1->alpha_mask == fmt2->alpha_mask); +} + +static inline gboolean +va_format_is_same (const VAImageFormat * fmt1, const VAImageFormat * fmt2) +{ + if (fmt1->fourcc != fmt2->fourcc) + return FALSE; + if (fmt1->byte_order != VA_NSB_FIRST + && fmt2->byte_order != VA_NSB_FIRST + && fmt1->byte_order != fmt2->byte_order) + return FALSE; + return va_format_is_rgb (fmt1) ? va_format_is_same_rgb (fmt1, fmt2) : TRUE; +} + +static const struct FormatMap * +get_format_map_from_va_image_format (const VAImageFormat * va_format) +{ + int i; + + for (i = 0; i < G_N_ELEMENTS (format_map); i++) { + if (va_format_is_same (&format_mapi.va_format, va_format)) + return &format_mapi; + } + + return NULL; +} + +GstVideoFormat +gst_va_video_format_from_va_fourcc (guint fourcc) +{ + const struct FormatMap *map = get_format_map_from_va_fourcc (fourcc); + + return map ? map->format : GST_VIDEO_FORMAT_UNKNOWN; +} + +guint +gst_va_fourcc_from_video_format (GstVideoFormat format) +{ + const struct FormatMap *map = get_format_map_from_video_format (format); + + return map ? map->va_format.fourcc : 0; +} + +guint +gst_va_chroma_from_video_format (GstVideoFormat format) +{ + const struct FormatMap *map = get_format_map_from_video_format (format); + + return map ? map->va_rtformat : 0; +} + +guint +gst_va_chroma_from_va_fourcc (guint va_fourcc) +{ + const struct FormatMap *map = get_format_map_from_va_fourcc (va_fourcc); + + return map ? map->va_rtformat : 0; +} + +const VAImageFormat * +gst_va_image_format_from_video_format (GstVideoFormat format) +{ + const struct FormatMap *map = get_format_map_from_video_format (format); + + return map ? &map->va_format : NULL; +} + +GstVideoFormat +gst_va_video_format_from_va_image_format (const VAImageFormat * va_format) +{ + const struct FormatMap *map = get_format_map_from_va_image_format (va_format); + + return map ? map->format : GST_VIDEO_FORMAT_UNKNOWN; +} + +/* + * XXX: Not all the surfaces formats can be converted into every image + * format when mapped. This funtion will return the #GstVideoFormat + * that a surface will map when it is asked for a @image_format. + * + * Current implementation only seeks for @image_format in + * @surface_formats. + */ +GstVideoFormat +gst_va_video_surface_format_from_image_format (GstVideoFormat image_format, + GArray * surface_formats) +{ + GstVideoFormat surface_format; + guint i, image_chroma; + + if (image_format == GST_VIDEO_FORMAT_UNKNOWN) + return GST_VIDEO_FORMAT_UNKNOWN; + + if (!surface_formats || surface_formats->len == 0) + return GST_VIDEO_FORMAT_UNKNOWN; + + image_chroma = gst_va_chroma_from_video_format (image_format); + if (image_chroma == 0) + return GST_VIDEO_FORMAT_UNKNOWN; + + for (i = 0; i < surface_formats->len; i++) { + surface_format = g_array_index (surface_formats, GstVideoFormat, i); + + if (surface_format == image_format) + return surface_format; + } + + return GST_VIDEO_FORMAT_UNKNOWN; +} + +static GstVideoFormat +find_gst_video_format_in_rgb32_map (VAImageFormat * image_format) +{ + guint i, j; + + for (i = 0; i < G_N_ELEMENTS (rgb32_format_map); i++) { + for (j = 0; j < G_N_ELEMENTS (rgb32_format_mapi.va_format); j++) { + if (va_format_is_same (&rgb32_format_mapi.va_formatj, image_format)) + return rgb32_format_mapi.format; + } + } + + return GST_VIDEO_FORMAT_UNKNOWN; +} + +struct ImageFormatArray +{ + VAImageFormat *image_formats; + gint len; +}; + +static gpointer +fix_map (gpointer data) +{ + struct ImageFormatArray *args = data; + GstVideoFormat format; + VAImageFormat *image_format; + struct FormatMap *map; + guint i; + + for (i = 0; i < args->len; i++) { + image_format = &args->image_formatsi; + if (!va_format_is_rgb (image_format)) + continue; + format = find_gst_video_format_in_rgb32_map (image_format); + if (format == GST_VIDEO_FORMAT_UNKNOWN) + continue; + map = get_format_map_from_video_format (format); + if (!map) + continue; + if (va_format_is_same (&map->va_format, image_format)) + continue; + + map->va_format = *image_format; + + GST_INFO ("GST_VIDEO_FORMAT_%s => { fourcc %" + GST_FOURCC_FORMAT ", %s, bpp %d, depth %d, R %#010x, G %#010x, " + "B %#010x, A %#010x }", gst_video_format_to_string (map->format), + GST_FOURCC_ARGS (map->va_format.fourcc), + (map->va_format.byte_order == 1) ? "LSB" : "MSB", + map->va_format.bits_per_pixel, map->va_format.depth, + map->va_format.red_mask, map->va_format.green_mask, + map->va_format.blue_mask, map->va_format.alpha_mask); + } + + return NULL; +} + +/* XXX: RGB32 LSB VAImageFormats don't map statically with GStreamer + * color formats. Each driver does what they want. + * + * For MSB, there is no ambiguity: same order in define, memory and + * CPU. For example, + * + * RGBA is RGBA in memory and RGBA with channel mask R:0xFF0000 + * G:0x00FF0000 B:0x0000FF00 A:0x000000FF in CPU. + * + * For LSB, CPU's perspective and memory's perspective are + * different. For example, + * + * From CPU's perspective, it's RGBA order in memory, but when it is + * stored in memory, because CPU's little endianness, it will be + * re-ordered, with mask R:0x000000FF G:0x0000FF00 B:0x00FF0000 + * A:0xFF000000. + * + * In other words, from memory's perspective, RGBA LSB is equal as + * ABGR MSB. + * + * These definitions are mixed used all over the media system and we + * need to correct the mapping form VA video format to GStreamer + * video format in both manners. + * + * https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/123 + */ +void +gst_va_video_format_fix_map (VAImageFormat * image_formats, gint num) +{ + static GOnce once = G_ONCE_INIT; + struct ImageFormatArray args = { image_formats, num }; + + g_once (&once, fix_map, &args); +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/gstvavideoformat.h
Added
@@ -0,0 +1,55 @@ +/* GStreamer + * Copyright (C) 2020 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/va/gstva.h> +#include <gst/video/video.h> +#include <va/va.h> + +G_BEGIN_DECLS + +GST_VA_API +GstVideoFormat gst_va_video_format_from_va_fourcc (guint fourcc); + +GST_VA_API +guint gst_va_fourcc_from_video_format (GstVideoFormat format); + +GST_VA_API +guint gst_va_chroma_from_video_format (GstVideoFormat format); + +GST_VA_API +guint gst_va_chroma_from_va_fourcc (guint va_fourcc); + +GST_VA_API +const VAImageFormat * gst_va_image_format_from_video_format (GstVideoFormat format); + +GST_VA_API +GstVideoFormat gst_va_video_format_from_va_image_format (const VAImageFormat * va_format); + +GST_VA_API +GstVideoFormat gst_va_video_surface_format_from_image_format (GstVideoFormat image_format, + GArray * surface_formats); +GST_VA_API +void gst_va_video_format_fix_map (VAImageFormat * image_formats, + gint num); + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/va/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/meson.build
Changed
@@ -1,27 +1,41 @@ -va_sources = +va_sources = files( + 'gstvaallocator.c', 'gstvadisplay.c', 'gstvadisplay_drm.c', 'gstvadisplay_wrapped.c', - + 'gstvapool.c', + 'gstvautils.c', +) + +va_sources_priv = files( + 'gstvasurfacecopy.c', + 'gstvavideoformat.c', + 'vasurfaceimage.c', +) -va_headers = +va_headers = files( + 'gstva.h', + 'gstvaallocator.h', 'gstvadisplay.h', 'gstvadisplay_drm.h', 'gstvadisplay_wrapped.h', - 'va_fwd.h', + 'gstvapool.h', + 'gstvautils.h', 'va-prelude.h', - + 'va_fwd.h', +) gstva_dep = dependency('', required : false) -va_option = get_option('va') -if va_option.disabled() or host_system != 'linux' +if host_system != 'linux' subdir_done() endif libva_req = '>= 1.6' -libva_dep = dependency('libva', version: libva_req, required: va_option) -libva_drm_dep = dependency('libva-drm', version: libva_req, required: va_option) +libva_dep = dependency('libva', version: libva_req, required: false, + fallback: 'libva', 'libva_dep') +libva_drm_dep = dependency('libva-drm', version: libva_req, required: false, + fallback: 'libva', 'libva_drm_dep') if not (libva_dep.found() and libva_drm_dep.found()) subdir_done() @@ -30,20 +44,65 @@ libdrm_dep = dependency('libdrm', required: false, fallback: 'libdrm', 'ext_libdrm') cdata.set10('HAVE_LIBDRM', libdrm_dep.found()) +va_enums = gnome.mkenums_simple('va-enumtypes', + sources: 'gstva.h', + decorator: 'GST_VA_API', + header_prefix: '#include <gst/va/va-prelude.h>', + body_prefix: '#ifdef HAVE_CONFIG_H\n#include "config.h"\n#endif', + install_header: true, + install_dir : join_paths(get_option('includedir'), 'gstreamer-1.0/gst/va'), +) + +va_enumtypes_h = va_enums1 +va_gen_sources = va_enumtypes_h + gstva = library('gstva-' + api_version, - va_sources, + va_sources, va_sources_priv, va_enums, c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', '-DBUILDING_GST_VA', '-DG_LOG_DOMAIN="GStreamer-VA"', include_directories : configinc, libsinc, version : libversion, soversion : soversion, install : true, - dependencies : gst_dep, libva_dep, libva_drm_dep, libdrm_dep, + dependencies : gst_dep, gstbase_dep, gstvideo_dep, gstallocators_dep, libva_dep, libva_drm_dep, libdrm_dep, ) +library_def = {'lib': gstva} pkg_name = 'gstreamer-va-' + api_version -libraries += pkg_name, {'lib': gstva} + +pkgconfig.generate(gstva, + libraries : gst_dep, gstvideo_dep, + variables : pkgconfig_variables, + subdirs : pkgconfig_subdirs, + name : pkg_name, + description : 'GStreamer VA support', +) + +if build_gir + gir = { + 'sources' : va_sources, va_headers, va_enums, + 'namespace' : 'GstVa', + 'nsversion' : api_version, + 'identifier_prefix' : 'Gst', + 'symbol_prefix' : 'gst', + 'export_packages' : pkg_name, + 'includes' : 'Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0', + 'install' : true, + 'extra_args' : gir_init_section + '-DGST_USE_UNSTABLE_API', + 'dependencies' : gst_dep, gstbase_dep, gstvideo_dep, gstallocators_dep, libva_dep, libva_drm_dep, libdrm_dep + } + library_def = {'lib': library_def'lib', 'gir': gir} + if not static_build + va_gir = gnome.generate_gir(gstva, kwargs: gir) + va_gen_sources += va_gir + endif +endif +gst_libraries += pkg_name, library_def + +install_headers(va_headers, subdir : 'gstreamer-1.0/gst/va/') gstva_dep = declare_dependency(link_with : gstva, include_directories : libsinc, - dependencies : gst_dep, libva_dep, libva_drm_dep, libdrm_dep) + dependencies : gst_dep, gstvideo_dep, gstallocators_dep, libva_dep, libva_drm_dep, libdrm_dep, + sources : va_gen_sources) + meson.override_dependency(pkg_name, gstva_dep)
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/vasurfaceimage.c
Added
@@ -0,0 +1,332 @@ +/* GStreamer + * Copyright (C) 2021 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vasurfaceimage.h" +#include "gstvavideoformat.h" +#include <va/va.h> + +/* XXX: find a better log category */ +#define GST_CAT_DEFAULT gst_va_display_debug +GST_DEBUG_CATEGORY_EXTERN (gst_va_display_debug); + +gboolean +va_destroy_surfaces (GstVaDisplay * display, VASurfaceID * surfaces, + gint num_surfaces) +{ + VADisplay dpy = gst_va_display_get_va_dpy (display); + VAStatus status; + + g_return_val_if_fail (num_surfaces > 0, FALSE); + + status = vaDestroySurfaces (dpy, surfaces, num_surfaces); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR ("vaDestroySurfaces: %s", vaErrorStr (status)); + return FALSE; + } + + return TRUE; +} + +gboolean +va_create_surfaces (GstVaDisplay * display, guint rt_format, guint fourcc, + guint width, guint height, gint usage_hint, + VASurfaceAttribExternalBuffers * ext_buf, VASurfaceID * surfaces, + guint num_surfaces) +{ + VADisplay dpy = gst_va_display_get_va_dpy (display); + /* *INDENT-OFF* */ + VASurfaceAttrib attrs5 = { + { + .type = VASurfaceAttribUsageHint, + .flags = VA_SURFACE_ATTRIB_SETTABLE, + .value.type = VAGenericValueTypeInteger, + .value.value.i = usage_hint, + }, + { + .type = VASurfaceAttribMemoryType, + .flags = VA_SURFACE_ATTRIB_SETTABLE, + .value.type = VAGenericValueTypeInteger, + .value.value.i = (ext_buf && ext_buf->num_buffers > 0) + ? VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME + : VA_SURFACE_ATTRIB_MEM_TYPE_VA, + }, + }; + /* *INDENT-ON* */ + VAStatus status; + guint num_attrs = 2; + + g_return_val_if_fail (num_surfaces > 0, FALSE); + + if (fourcc > 0) { + /* *INDENT-OFF* */ + attrsnum_attrs++ = (VASurfaceAttrib) { + .type = VASurfaceAttribPixelFormat, + .flags = VA_SURFACE_ATTRIB_SETTABLE, + .value.type = VAGenericValueTypeInteger, + .value.value.i = fourcc, + }; + /* *INDENT-ON* */ + } + + if (ext_buf) { + /* *INDENT-OFF* */ + attrsnum_attrs++ = (VASurfaceAttrib) { + .type = VASurfaceAttribExternalBufferDescriptor, + .flags = VA_SURFACE_ATTRIB_SETTABLE, + .value.type = VAGenericValueTypePointer, + .value.value.p = ext_buf, + }; + /* *INDENT-ON* */ + } + + status = vaCreateSurfaces (dpy, rt_format, width, height, surfaces, + num_surfaces, attrs, num_attrs); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR ("vaCreateSurfaces: %s", vaErrorStr (status)); + return FALSE; + } + + return TRUE; +} + +gboolean +va_export_surface_to_dmabuf (GstVaDisplay * display, VASurfaceID surface, + guint32 flags, VADRMPRIMESurfaceDescriptor * desc) +{ + VADisplay dpy = gst_va_display_get_va_dpy (display); + VAStatus status; + + status = vaExportSurfaceHandle (dpy, surface, + VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2, flags, desc); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR ("vaExportSurfaceHandle: %s", vaErrorStr (status)); + return FALSE; + } + + return TRUE; +} + +gboolean +va_destroy_image (GstVaDisplay * display, VAImageID image_id) +{ + VADisplay dpy = gst_va_display_get_va_dpy (display); + VAStatus status; + + status = vaDestroyImage (dpy, image_id); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR ("vaDestroyImage: %s", vaErrorStr (status)); + return FALSE; + } + return TRUE; +} + +gboolean +va_get_derive_image (GstVaDisplay * display, VASurfaceID surface, + VAImage * image) +{ + VADisplay dpy = gst_va_display_get_va_dpy (display); + VAStatus status; + + status = vaDeriveImage (dpy, surface, image); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING ("vaDeriveImage: %s", vaErrorStr (status)); + return FALSE; + } + + return TRUE; +} + +gboolean +va_create_image (GstVaDisplay * display, GstVideoFormat format, gint width, + gint height, VAImage * image) +{ + VADisplay dpy = gst_va_display_get_va_dpy (display); + const VAImageFormat *va_format; + VAStatus status; + + va_format = gst_va_image_format_from_video_format (format); + if (!va_format) + return FALSE; + + status = + vaCreateImage (dpy, (VAImageFormat *) va_format, width, height, image); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR ("vaCreateImage: %s", vaErrorStr (status)); + return FALSE; + } + return TRUE; +} + +gboolean +va_get_image (GstVaDisplay * display, VASurfaceID surface, VAImage * image) +{ + VADisplay dpy = gst_va_display_get_va_dpy (display); + VAStatus status; + + status = vaGetImage (dpy, surface, 0, 0, image->width, image->height, + image->image_id); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR ("vaGetImage: %s", vaErrorStr (status)); + return FALSE; + } + + return TRUE; +} + +gboolean +va_sync_surface (GstVaDisplay * display, VASurfaceID surface) +{ + VADisplay dpy = gst_va_display_get_va_dpy (display); + VAStatus status; + + status = vaSyncSurface (dpy, surface); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING ("vaSyncSurface: %s", vaErrorStr (status)); + return FALSE; + } + return TRUE; +} + +gboolean +va_map_buffer (GstVaDisplay * display, VABufferID buffer, gpointer * data) +{ + VADisplay dpy = gst_va_display_get_va_dpy (display); + VAStatus status; + + status = vaMapBuffer (dpy, buffer, data); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING ("vaMapBuffer: %s", vaErrorStr (status)); + return FALSE; + } + return TRUE; +} + +gboolean +va_unmap_buffer (GstVaDisplay * display, VABufferID buffer) +{ + VADisplay dpy = gst_va_display_get_va_dpy (display); + VAStatus status; + + status = vaUnmapBuffer (dpy, buffer); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING ("vaUnmapBuffer: %s", vaErrorStr (status)); + return FALSE; + } + return TRUE; +} + +gboolean +va_put_image (GstVaDisplay * display, VASurfaceID surface, VAImage * image) +{ + VADisplay dpy = gst_va_display_get_va_dpy (display); + VAStatus status; + + if (!va_sync_surface (display, surface)) + return FALSE; + + status = vaPutImage (dpy, surface, image->image_id, 0, 0, image->width, + image->height, 0, 0, image->width, image->height); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR ("vaPutImage: %s", vaErrorStr (status)); + return FALSE; + } + return TRUE; +} + +gboolean +va_ensure_image (GstVaDisplay * display, VASurfaceID surface, + GstVideoInfo * info, VAImage * image, gboolean derived) +{ + gboolean ret = TRUE; + + if (image->image_id != VA_INVALID_ID) + return TRUE; + + if (!va_sync_surface (display, surface)) + return FALSE; + + if (derived) { + ret = va_get_derive_image (display, surface, image); + } else { + ret = va_create_image (display, GST_VIDEO_INFO_FORMAT (info), + GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info), image); + } + + return ret; +} + +gboolean +va_check_surface (GstVaDisplay * display, VASurfaceID surface) +{ + VADisplay dpy = gst_va_display_get_va_dpy (display); + VAStatus status; + VASurfaceStatus state; + + status = vaQuerySurfaceStatus (dpy, surface, &state); + + if (status != VA_STATUS_SUCCESS) + GST_ERROR ("vaQuerySurfaceStatus: %s", vaErrorStr (status)); + + GST_LOG ("surface %#x status %d", surface, state); + + return (status == VA_STATUS_SUCCESS); +} + +gboolean +va_copy_surface (GstVaDisplay * display, VASurfaceID dst, VASurfaceID src) +{ +#if VA_CHECK_VERSION (1, 12, 0) + VADisplay dpy = gst_va_display_get_va_dpy (display); + /* *INDENT-OFF* */ + VACopyObject obj_src = { + .obj_type = VACopyObjectSurface, + .object = { + .surface_id = src, + }, + }; + VACopyObject obj_dst = { + .obj_type = VACopyObjectSurface, + .object = { + .surface_id = dst, + }, + }; + VACopyOption option = { + .bits = { + .va_copy_sync = VA_EXEC_SYNC, + .va_copy_mode = VA_EXEC_MODE_DEFAULT, + }, + }; + /* *INDENT-ON* */ + VAStatus status; + + status = vaCopy (dpy, &obj_dst, &obj_src, option); + if (status != VA_STATUS_SUCCESS) { + GST_INFO ("vaCopy: %s", vaErrorStr (status)); + return FALSE; + } + return TRUE; +#else + return FALSE; +#endif +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/va/vasurfaceimage.h
Added
@@ -0,0 +1,88 @@ +/* GStreamer + * Copyright (C) 2021 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/va/gstva.h> +#include <gst/video/video.h> +#include <va/va.h> +#include <va/va_drmcommon.h> + +G_BEGIN_DECLS + +/* surfaces */ +gboolean va_create_surfaces (GstVaDisplay * display, + guint rt_format, guint fourcc, + guint width, guint height, + gint usage_hint, + VASurfaceAttribExternalBuffers * ext_buf, + VASurfaceID * surfaces, + guint num_surfaces); +gboolean va_destroy_surfaces (GstVaDisplay * display, + VASurfaceID * surfaces, + gint num_surfaces); +gboolean va_export_surface_to_dmabuf (GstVaDisplay * display, + VASurfaceID surface, + guint32 flags, + VADRMPRIMESurfaceDescriptor * desc); + +GST_VA_API +gboolean va_sync_surface (GstVaDisplay * display, + VASurfaceID surface); +GST_VA_API +gboolean va_check_surface (GstVaDisplay * display, + VASurfaceID surface); + +gboolean va_copy_surface (GstVaDisplay * display, + VASurfaceID dst, + VASurfaceID src); + +/* images */ +gboolean va_create_image (GstVaDisplay * display, + GstVideoFormat format, + gint width, gint height, + VAImage * image); +gboolean va_destroy_image (GstVaDisplay * display, + VAImageID image_id); +gboolean va_get_image (GstVaDisplay * display, + VASurfaceID surface, + VAImage * image); +gboolean va_get_derive_image (GstVaDisplay * display, + VASurfaceID surface, + VAImage * image); +gboolean va_put_image (GstVaDisplay * display, + VASurfaceID surface, + VAImage * image); +gboolean va_ensure_image (GstVaDisplay * display, + VASurfaceID surface, + GstVideoInfo * info, + VAImage * image, + gboolean derived); + +/* mapping */ +GST_VA_API +gboolean va_map_buffer (GstVaDisplay * display, + VABufferID buffer, + gpointer * data); +GST_VA_API +gboolean va_unmap_buffer (GstVaDisplay * display, + VABufferID buffer); + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/android/gstvkdisplay_android.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/android/gstvkdisplay_android.c
Changed
@@ -64,7 +64,7 @@ * * Create a new #GstVulkanDisplayAndroid. * - * Returns: (transfer full): a new #GstVulkanDisplayAndroid or %NULL + * Returns: (transfer full): a new #GstVulkanDisplayAndroid */ GstVulkanDisplayAndroid * gst_vulkan_display_android_new (void)
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/cocoa/gstvkdisplay_cocoa.m -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/cocoa/gstvkdisplay_cocoa.m
Changed
@@ -221,7 +221,7 @@ * * Create a new #GstVulkanDisplayCocoa. * - * Returns: (transfer full): a new #GstVulkanDisplayCocoa or %NULL + * Returns: (transfer full): a new #GstVulkanDisplayCocoa */ GstVulkanDisplayCocoa * gst_vulkan_display_cocoa_new (void)
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkbuffermemory.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkbuffermemory.h
Changed
@@ -139,6 +139,8 @@ gpointer _reserved GST_PADDING; }; +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVulkanBufferMemoryAllocator, gst_object_unref); + GST_VULKAN_API void gst_vulkan_buffer_memory_init_once (void); GST_VULKAN_API
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkbufferpool.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkbufferpool.h
Changed
@@ -76,6 +76,8 @@ gpointer _paddingGST_PADDING; }; +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVulkanBufferPool, gst_object_unref); + GST_VULKAN_API GstBufferPool *gst_vulkan_buffer_pool_new (GstVulkanDevice * device);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkcommandbuffer.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkcommandbuffer.h
Changed
@@ -141,6 +141,8 @@ */ #define gst_vulkan_command_buffer_unlock(cmd) (gst_vulkan_command_pool_unlock((cmd)->pool)) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVulkanCommandBuffer, gst_vulkan_command_buffer_unref); + GST_VULKAN_API GstVulkanCommandBuffer * gst_vulkan_command_buffer_new_wrapped (VkCommandBuffer cmd, VkCommandBufferLevel level);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkcommandpool.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkcommandpool.c
Changed
@@ -118,7 +118,7 @@ { g_return_val_if_fail (GST_IS_VULKAN_COMMAND_POOL (pool), NULL); - return pool->queue ? gst_object_ref (pool->queue) : NULL; + return gst_object_ref (pool->queue); } static GstVulkanCommandBuffer *
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkdescriptorcache.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkdescriptorcache.c
Changed
@@ -68,7 +68,8 @@ * gst_vulkan_descriptor_cache_new: * @pool: a #GstVulkanDescriptorPool * @n_layouts: number of @layouts - * @layouts: list of #GstVulkanHandle containing descriptor set layouts + * @layouts: (array length=n_layouts): list of #GstVulkanHandle containing + * descriptor set layouts * * Returns: (transfer full): a new #GstVulkanDescriptorCache *
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkdescriptorpool.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkdescriptorpool.c
Changed
@@ -132,7 +132,7 @@ { g_return_val_if_fail (GST_IS_VULKAN_DESCRIPTOR_POOL (pool), NULL); - return pool->device ? gst_object_ref (pool->device) : NULL; + return gst_object_ref (pool->device); } /** @@ -196,6 +196,9 @@ /** * gst_vulkan_descriptor_pool_create: * @pool: a #GstVulkanDescriptorPool + * @n_layouts: number of @layouts + * @layouts: (array length=n_layouts): list of #GstVulkanHandle containing + * descriptor set layouts * @error: a #GError * * Returns: a new #GstVulkanDescriptorSet
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkdescriptorpool.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkdescriptorpool.h
Changed
@@ -66,6 +66,8 @@ gpointer _reserved GST_PADDING; }; +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVulkanDescriptorPool, gst_object_unref); + GST_VULKAN_API GstVulkanDescriptorPool * gst_vulkan_descriptor_pool_new_wrapped (GstVulkanDevice * device, VkDescriptorPool pool,
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkdescriptorset.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkdescriptorset.c
Changed
@@ -117,6 +117,9 @@ /** * gst_vulkan_descriptor_set_new_wrapped: * @set: a VkDescriptorSet + * @n_layouts: number of @layouts + * @layouts: (array length=n_layouts): list of #GstVulkanHandle containing + * descriptor set layouts * * Returns: (transfer full): a new #GstVulkanDescriptorSet *
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkdescriptorset.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkdescriptorset.h
Changed
@@ -131,6 +131,8 @@ guint n_layouts, GstVulkanHandle ** layouts); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVulkanDescriptorSet, gst_vulkan_descriptor_set_unref); + G_END_DECLS #endif /* _GST_VULKAN_DESCRIPTOR_SET_H_ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkdevice.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkdevice.c
Changed
@@ -424,7 +424,7 @@ * * Performs `vkGetDeviceProcAddr()` with @device and @name * - * Returns: the function pointer for @name or %NULL + * Returns: (nullable): the function pointer for @name or %NULL * * Since: 1.18 */ @@ -445,7 +445,7 @@ * gst_vulkan_device_get_instance: * @device: a #GstVulkanDevice * - * Returns: (transfer full): the #GstVulkanInstance used to create this @device + * Returns: (transfer full) (nullable): the #GstVulkanInstance used to create this @device * * Since: 1.18 */ @@ -454,7 +454,7 @@ { g_return_val_if_fail (GST_IS_VULKAN_DEVICE (device), NULL); - return device->instance ? gst_object_ref (device->instance) : NULL; + return gst_object_ref (device->instance); } /** @@ -629,7 +629,7 @@ * @device: a #GstVulkanDevice * @error: a #GError to fill on failure * - * Returns: a new #GstVulkanFence or %NULL + * Returns: (transfer full) (nullable): a new #GstVulkanFence or %NULL * * Since: 1.18 */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkdisplay.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkdisplay.c
Changed
@@ -206,8 +206,8 @@ * @instance: a #GstVulkanInstance * @type: the #GstVulkanDisplayType to create * - * Returns: (transfer full): a new #GstVulkanDisplay or %NULL if e.g. @type is - * unsupported + * Returns: (transfer full) (nullable): a new #GstVulkanDisplay or %NULL if + * e.g. @type is unsupported * * Since: 1.18 */ @@ -326,7 +326,8 @@ * gst_vulkan_display_create_window: * @display: a #GstVulkanDisplay * - * Returns: (transfer full): a new #GstVulkanWindow for @display or %NULL. + * Returns: (transfer full) (nullable): a new #GstVulkanWindow for @display or + * %NULL. * * Since: 1.18 */ @@ -400,8 +401,8 @@ * first argument to @compare_func is the #GstVulkanWindow being checked and the * second argument is @data. * - * Returns: (transfer full): The first #GstVulkanWindow that causes a match - * from @compare_func + * Returns: (transfer full) (nullable): The first #GstVulkanWindow that + * @compare_func matches, or %NULL * * Since: 1.18 */ @@ -633,8 +634,8 @@ * gst_vulkan_display_type_to_extension_string: * @type: a #GstVulkanDisplayType * - * Returns: the Vulkan extension string required for creating a VkSurfaceKHR - * using a window system handle or %NULL + * Returns: (nullable): the Vulkan extension string required for creating a + * VkSurfaceKHR using a window system handle or %NULL * * Since: 1.18 */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkerror.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkerror.c
Changed
@@ -39,7 +39,7 @@ VkResult result; const char *str; } vk_result_string_map = { - {VK_ERROR_OUT_OF_HOST_MEMORY, "Out Of host memory"}, + {VK_ERROR_OUT_OF_HOST_MEMORY, "Out of host memory"}, {VK_ERROR_OUT_OF_DEVICE_MEMORY, "Out of device memory"}, {VK_ERROR_INITIALIZATION_FAILED, "Initialization failed"}, {VK_ERROR_DEVICE_LOST, "Device lost"}, @@ -49,9 +49,9 @@ {VK_ERROR_FEATURE_NOT_PRESENT, "Feature not present"}, {VK_ERROR_INCOMPATIBLE_DRIVER, "Incompatible driver"}, {VK_ERROR_TOO_MANY_OBJECTS, "Too many objects"}, - {VK_ERROR_FORMAT_NOT_SUPPORTED, "format not supported"}, + {VK_ERROR_FORMAT_NOT_SUPPORTED, "Format not supported"}, {VK_ERROR_SURFACE_LOST_KHR, "Surface lost"}, - {VK_ERROR_OUT_OF_DATE_KHR, "out of date"}, + {VK_ERROR_OUT_OF_DATE_KHR, "Out of date"}, {VK_ERROR_INCOMPATIBLE_DISPLAY_KHR, "Incompatible display"}, {VK_ERROR_NATIVE_WINDOW_IN_USE_KHR, "Native window in use"}, }; @@ -63,8 +63,16 @@ return g_quark_from_static_string ("gst-vulkan-error"); } -static const char * -_vk_result_to_string (VkResult result) +/** + * gst_vulkan_result_to_string: (skip) + * @result: a VkResult + * + * Returns: a message that corresponds to @result + * + * Since: 1.22 + */ +const char * +gst_vulkan_result_to_string (VkResult result) { int i; @@ -82,7 +90,7 @@ /** * gst_vulkan_error_to_g_error: (skip) * @result: a VkResult - * @error: (inout) (optional): a #GError to fill + * @error: (out) (optional) (transfer full): a #GError to fill * @format: the printf-like format to write into the #GError * @...: arguments for @format * @@ -105,7 +113,7 @@ /* we don't have an error to set */ return result; - result_str = _vk_result_to_string (result); + result_str = gst_vulkan_result_to_string (result); if (result_str == NULL) { if (result < 0) { result_str = "Unknown";
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkerror.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkerror.h
Changed
@@ -42,6 +42,9 @@ GST_VULKAN_API GQuark gst_vulkan_error_quark (void); +GST_VULKAN_API +const char * gst_vulkan_result_to_string (VkResult result); + /** * GstVulkanError: * @GST_VULKAN_FAILED: undetermined error
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkfence.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkfence.c
Changed
@@ -87,9 +87,9 @@ /** * gst_vulkan_fence_new: * @device: the parent #GstVulkanDevice - * @error: a #GError for the failure condition + * @error: (optional): a #GError for the failure condition * - * Returns: whether a new #GstVulkanFence or %NULL on error + * Returns: a new #GstVulkanFence or %NULL on error * * Since: 1.18 */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkfence.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkfence.h
Changed
@@ -93,6 +93,8 @@ gst_mini_object_unref (GST_MINI_OBJECT_CAST (fence)); } +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVulkanFence, gst_vulkan_fence_unref); + GST_VULKAN_API GType gst_vulkan_fence_cache_get_type (void); #define GST_TYPE_VULKAN_FENCE_CACHE (gst_vulkan_fence_cache_get_type()) @@ -130,6 +132,8 @@ gpointer _reserved GST_PADDING; }; +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVulkanFenceCache, gst_object_unref); + GstVulkanFenceCache * gst_vulkan_fence_cache_new (GstVulkanDevice * device); /**
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkformat.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkformat.c
Changed
@@ -419,7 +419,7 @@ * gst_vulkan_format_get_info: * @format: a valid `VkFormat` * - * Returns: the #GstVulkanFormatInfo for @format or %NULL + * Returns: (nullable): the #GstVulkanFormatInfo for @format or %NULL * * Since: 1.18 */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkfullscreenquad.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkfullscreenquad.c
Changed
@@ -57,6 +57,16 @@ GstVulkanHandle *vert; GstVulkanHandle *frag; + + VkBool32 blend_enable; + VkBlendFactor src_blend_factor; + VkBlendFactor src_alpha_blend_factor; + VkBlendFactor dst_blend_factor; + VkBlendFactor dst_alpha_blend_factor; + VkBlendOp colour_blend_op; + VkBlendOp alpha_blend_op; + + gboolean enable_clear; }; G_DEFINE_TYPE_WITH_CODE (GstVulkanFullScreenQuad, gst_vulkan_full_screen_quad, @@ -278,6 +288,7 @@ static gboolean create_render_pass (GstVulkanFullScreenQuad * self, GError ** error) { + GstVulkanFullScreenQuadPrivate *priv = GET_PRIV (self); VkAttachmentDescription color_attachmentsGST_VIDEO_MAX_PLANES; VkAttachmentReference color_attachment_refsGST_VIDEO_MAX_PLANES; VkRenderPassCreateInfo render_pass_info; @@ -291,7 +302,7 @@ color_attachmentsi = (VkAttachmentDescription) { .format = gst_vulkan_format_from_video_info (&self->out_info, i), .samples = VK_SAMPLE_COUNT_1_BIT, - .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, + .loadOp = priv->enable_clear ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD, .storeOp = VK_ATTACHMENT_STORE_OP_STORE, .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, @@ -468,19 +479,43 @@ color_blend_attachments0 = (VkPipelineColorBlendAttachmentState) { .colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT, - .blendEnable = VK_FALSE + .srcColorBlendFactor = priv->src_blend_factor, + .dstColorBlendFactor = priv->dst_blend_factor, + .colorBlendOp = priv->colour_blend_op, + .srcAlphaBlendFactor = priv->src_alpha_blend_factor, + .dstAlphaBlendFactor = priv->dst_alpha_blend_factor, + .alphaBlendOp = priv->alpha_blend_op, + .blendEnable = priv->blend_enable }; color_blend_attachments1 = (VkPipelineColorBlendAttachmentState) { .colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT, - .blendEnable = VK_FALSE + .srcColorBlendFactor = priv->src_blend_factor, + .dstColorBlendFactor = priv->dst_blend_factor, + .colorBlendOp = priv->colour_blend_op, + .srcAlphaBlendFactor = priv->src_alpha_blend_factor, + .dstAlphaBlendFactor = priv->dst_alpha_blend_factor, + .alphaBlendOp = priv->alpha_blend_op, + .blendEnable = priv->blend_enable }; color_blend_attachments2 = (VkPipelineColorBlendAttachmentState) { .colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT, - .blendEnable = VK_FALSE + .srcColorBlendFactor = priv->src_blend_factor, + .dstColorBlendFactor = priv->dst_blend_factor, + .colorBlendOp = priv->colour_blend_op, + .srcAlphaBlendFactor = priv->src_alpha_blend_factor, + .dstAlphaBlendFactor = priv->dst_alpha_blend_factor, + .alphaBlendOp = priv->alpha_blend_op, + .blendEnable = priv->blend_enable }; color_blend_attachments3 = (VkPipelineColorBlendAttachmentState) { .colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT, - .blendEnable = VK_FALSE + .srcColorBlendFactor = priv->src_blend_factor, + .dstColorBlendFactor = priv->dst_blend_factor, + .colorBlendOp = priv->colour_blend_op, + .srcAlphaBlendFactor = priv->src_alpha_blend_factor, + .dstAlphaBlendFactor = priv->dst_alpha_blend_factor, + .alphaBlendOp = priv->alpha_blend_op, + .blendEnable = priv->blend_enable }; color_blending = (VkPipelineColorBlendStateCreateInfo) { @@ -768,7 +803,16 @@ void gst_vulkan_full_screen_quad_init (GstVulkanFullScreenQuad * self) { + GstVulkanFullScreenQuadPrivate *priv = GET_PRIV (self); + self->trash_list = gst_vulkan_trash_fence_list_new (); + + priv->src_blend_factor = VK_BLEND_FACTOR_ONE; + priv->src_alpha_blend_factor = VK_BLEND_FACTOR_ONE; + priv->dst_blend_factor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + priv->dst_alpha_blend_factor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + priv->colour_blend_op = VK_BLEND_OP_ADD; + priv->alpha_blend_op = VK_BLEND_OP_ADD; } /** @@ -783,11 +827,16 @@ gst_vulkan_full_screen_quad_new (GstVulkanQueue * queue) { GstVulkanFullScreenQuad *self; + GError *error = NULL; g_return_val_if_fail (GST_IS_VULKAN_QUEUE (queue), NULL); self = g_object_new (GST_TYPE_VULKAN_FULL_SCREEN_QUAD, NULL); self->queue = gst_object_ref (queue); + self->cmd_pool = gst_vulkan_queue_create_command_pool (queue, &error); + if (!self->cmd_pool) + GST_WARNING_OBJECT (self, "Failed to create command pool: %s", + error->message); gst_object_ref_sink (self); @@ -1178,6 +1227,134 @@ } /** + * gst_vulkan_full_screen_quad_enable_blend: + * @self: the #GstVulkanFullScreenQuad + * @enable_blend: whether to enable blending + * + * Enables blending of the input image to the output image. + * + * See also: gst_vulkan_full_screen_quad_set_blend_operation() and + * gst_vulkan_full_screen_quad_set_blend_factors(). + * + * Since: 1.22 + */ +void +gst_vulkan_full_screen_quad_enable_blend (GstVulkanFullScreenQuad * self, + gboolean enable_blend) +{ + GstVulkanFullScreenQuadPrivate *priv; + + g_return_if_fail (GST_IS_VULKAN_FULL_SCREEN_QUAD (self)); + + priv = GET_PRIV (self); + + if (priv->blend_enable == VK_TRUE && enable_blend) + return; + if (priv->blend_enable == VK_FALSE && !enable_blend) + return; + priv->blend_enable = enable_blend ? VK_TRUE : VK_FALSE; + + clear_graphics_pipeline (self); +} + +/** + * gst_vulkan_full_screen_quad_set_blend_factors: + * @self: the #GstVulkanFullScreenQuad + * @src_blend_factor: the `VkBlendFactor` for the source image for the colour + * components (RGB) + * @src_alpha_blend_factor: the `VkBlendFactor` for the source image for the + * alpha component. + * @dst_blend_factor: the `VkBlendFactor` for the destination image for the + * colour components (RGB) + * @dst_alpha_blend_factor: the `VkBlendFactor` for the destination image for + * the alpha component. + * + * You need to enable blend with gst_vulkan_full_screen_quad_enable_blend(). + * + * See also: gst_vulkan_full_screen_quad_set_blend_operation(). + * + * Since: 1.22 + */ +void +gst_vulkan_full_screen_quad_set_blend_factors (GstVulkanFullScreenQuad * self, + VkBlendFactor src_blend_factor, VkBlendFactor dst_blend_factor, + VkBlendFactor src_alpha_blend_factor, VkBlendFactor dst_alpha_blend_factor) +{ + GstVulkanFullScreenQuadPrivate *priv; + + g_return_if_fail (GST_IS_VULKAN_FULL_SCREEN_QUAD (self)); + + priv = GET_PRIV (self); + + if (priv->src_blend_factor == src_blend_factor + && priv->src_alpha_blend_factor == src_alpha_blend_factor + && priv->dst_blend_factor == dst_blend_factor + && priv->dst_alpha_blend_factor == dst_alpha_blend_factor) + return; + + priv->src_blend_factor = src_blend_factor; + priv->src_alpha_blend_factor = src_alpha_blend_factor; + priv->dst_blend_factor = dst_blend_factor; + priv->dst_alpha_blend_factor = dst_alpha_blend_factor; + + clear_graphics_pipeline (self); +} + +/** + * gst_vulkan_full_screen_quad_set_blend_operation: + * @self: the #GstVulkanFullScreenQuad + * @colour_blend_op: the `VkBlendOp` to use for blending colour (RGB) values + * @alpha_blend_op: the `VkBlendOp` to use for blending alpha values + * + * You need to enable blend with gst_vulkan_full_screen_quad_enable_blend(). + * + * See also: gst_vulkan_full_screen_quad_set_blend_factors(). + * + * Since: 1.22 + */ +void +gst_vulkan_full_screen_quad_set_blend_operation (GstVulkanFullScreenQuad * self, + VkBlendOp colour_blend_op, VkBlendOp alpha_blend_op) +{ + GstVulkanFullScreenQuadPrivate *priv; + + g_return_if_fail (GST_IS_VULKAN_FULL_SCREEN_QUAD (self)); + + priv = GET_PRIV (self); + + priv->colour_blend_op = colour_blend_op; + priv->alpha_blend_op = alpha_blend_op; + + clear_graphics_pipeline (self); +} + +/** + * gst_vulkan_full_screen_quad_enable_clear: + * @self: the #GstVulkanFullScreenQuad + * @enable_clear: whether to clear the framebuffer on load + * + * Since: 1.22 + */ +void +gst_vulkan_full_screen_quad_enable_clear (GstVulkanFullScreenQuad * self, + gboolean enable_clear) +{ + GstVulkanFullScreenQuadPrivate *priv; + + g_return_if_fail (GST_IS_VULKAN_FULL_SCREEN_QUAD (self)); + + priv = GET_PRIV (self); + + if (priv->enable_clear == enable_clear) + return; + + priv->enable_clear = enable_clear; + + clear_graphics_pipeline (self); + clear_render_pass (self); +} + +/** * gst_vulkan_full_screen_quad_prepare_draw: * @self: the #GstVulkanFullScreenQuad * @fence: a #GstVulkanFence that will be signalled after submission
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkfullscreenquad.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkfullscreenquad.h
Changed
@@ -119,6 +119,22 @@ gboolean gst_vulkan_full_screen_quad_set_input_buffer (GstVulkanFullScreenQuad * self, GstBuffer * buffer, GError ** error); GST_VULKAN_API gboolean gst_vulkan_full_screen_quad_set_output_buffer (GstVulkanFullScreenQuad * self, GstBuffer * buffer, GError ** error); +GST_VULKAN_API +void gst_vulkan_full_screen_quad_enable_blend (GstVulkanFullScreenQuad * self, + gboolean enable_blend); +GST_VULKAN_API +void gst_vulkan_full_screen_quad_set_blend_operation (GstVulkanFullScreenQuad * self, + VkBlendOp colour_blend_op, + VkBlendOp alpha_blend_op); +GST_VULKAN_API +void gst_vulkan_full_screen_quad_set_blend_factors (GstVulkanFullScreenQuad * self, + VkBlendFactor src_blend_factor, + VkBlendFactor dst_blend_factor, + VkBlendFactor src_alpha_blend_factor, + VkBlendFactor dst_alpha_blend_factor); +GST_VULKAN_API +void gst_vulkan_full_screen_quad_enable_clear (GstVulkanFullScreenQuad * self, + gboolean enable_clear); GST_VULKAN_API gboolean gst_vulkan_full_screen_quad_prepare_draw (GstVulkanFullScreenQuad * self, GstVulkanFence * fence, GError ** error);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkimagebufferpool.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkimagebufferpool.h
Changed
@@ -75,6 +75,8 @@ gpointer _reserved GST_PADDING; }; +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVulkanImageBufferPool, gst_object_unref); + GST_VULKAN_API GstBufferPool *gst_vulkan_image_buffer_pool_new (GstVulkanDevice * device);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkimagememory.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkimagememory.c
Changed
@@ -625,8 +625,8 @@ * @find_func: (scope call): #GstVulkanImageMemoryFindViewFunc to search with * @user_data: user data to call @finc_func with * - * Return: (transfer full): the first #GstVulkanImageView that @find_func - * returns %TRUE for, or %NULL + * Return: (transfer full) (nullable): the first #GstVulkanImageView that + * @find_func returns %TRUE for, or %NULL * * Since: 1.18 */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkimagememory.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkimagememory.h
Changed
@@ -158,6 +158,8 @@ gpointer _reserved GST_PADDING; }; +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVulkanImageMemoryAllocator, gst_object_unref); + GST_VULKAN_API void gst_vulkan_image_memory_init_once (void); GST_VULKAN_API
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkimageview.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkimageview.c
Changed
@@ -96,7 +96,7 @@ */ GstVulkanImageView * gst_vulkan_image_view_new (GstVulkanImageMemory * image, - VkImageViewCreateInfo * create_info) + const VkImageViewCreateInfo * create_info) { GstVulkanImageView *view; GError *error = NULL;
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkimageview.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkimageview.h
Changed
@@ -117,13 +117,11 @@ gst_clear_mini_object ((GstMiniObject **) view_ptr); } -#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVulkanImageView, gst_vulkan_image_view_unref) -#endif GST_VULKAN_API GstVulkanImageView * gst_vulkan_image_view_new (GstVulkanImageMemory * image, - VkImageViewCreateInfo * create_info); + const VkImageViewCreateInfo * create_info); G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkinstance.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkinstance.c
Changed
@@ -1071,7 +1071,7 @@ * * Performs `vkGetInstanceProcAddr()` with @instance and @name * - * Returns: the function pointer for @name or %NULL + * Returns: (nullable): the function pointer for @name or %NULL * * Since: 1.18 */ @@ -1095,6 +1095,7 @@ /** * gst_vulkan_instance_create_device: * @instance: a #GstVulkanInstance + * @error: (optional): a #GError * * Returns: (transfer full): a new #GstVulkanDevice * @@ -1300,9 +1301,9 @@ /** * gst_vulkan_instance_get_version: * @instance: a #GstVulkanInstance - * @major: major version - * @minor: minor version - * @patch: patch version + * @major: (out): major version + * @minor: (out): minor version + * @patch: (out): patch version * * Retrieve the vulkan instance configured version. Only returns the supported * API version by the instance without taking into account the requested API
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkmemory.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkmemory.h
Changed
@@ -123,6 +123,8 @@ gpointer _reserved GST_PADDING; }; +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVulkanMemoryAllocator, gst_object_unref); + GST_VULKAN_API void gst_vulkan_memory_init_once (void); GST_VULKAN_API
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkphysicaldevice.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkphysicaldevice.c
Changed
@@ -968,7 +968,7 @@ { g_return_val_if_fail (GST_IS_VULKAN_PHYSICAL_DEVICE (device), NULL); - return device->instance ? gst_object_ref (device->instance) : NULL; + return gst_object_ref (device->instance); } static gboolean
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkqueue.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkqueue.c
Changed
@@ -97,7 +97,7 @@ * gst_vulkan_queue_get_device * @queue: a #GstVulkanQueue * - * Returns: (transfer full): the #GstVulkanDevice for @queue + * Returns: (transfer full) (nullable): the #GstVulkanDevice for @queue * * Since: 1.18 */ @@ -106,15 +106,15 @@ { g_return_val_if_fail (GST_IS_VULKAN_QUEUE (queue), NULL); - return queue->device ? gst_object_ref (queue->device) : NULL; + return gst_object_ref (queue->device); } /** * gst_vulkan_queue_create_command_pool: * @queue: a #GstVulkanQueue - * @error: a #GError + * @error: (optional): a #GError * - * Returns: (transfer full): a new #GstVUlkanCommandPool or %NULL + * Returns: (transfer full): a new #GstVulkanCommandPool or %NULL * * Since: 1.18 */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkutils.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkutils.c
Changed
@@ -489,7 +489,7 @@ * @device: a #GstVulkanDevice * @code: the SPIR-V shader byte code * @size: length of @code. Must be a multiple of 4 - * @error: a #GError to fill on failure + * @error: (optional): a #GError to fill on failure * * Returns: (transfer full): a #GstVulkanHandle for @image matching the * original layout and format of @image or %NULL
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkvideofilter.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkvideofilter.h
Changed
@@ -83,6 +83,8 @@ gpointer _reserved GST_PADDING; }; +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVulkanVideoFilter, gst_object_unref); + G_END_DECLS #endif
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/gstvkwindow.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/gstvkwindow.c
Changed
@@ -484,6 +484,14 @@ } } +/** + * gst_vulkan_window_get_surface_dimensions: + * @window: a #GstVulkanWindow + * @width: (out): Current width of @window + * @height: (out): Current height of @window + * + * Since: 1.18 + */ void gst_vulkan_window_get_surface_dimensions (GstVulkanWindow * window, guint * width, guint * height)
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/ios/gstvkdisplay_ios.m -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/ios/gstvkdisplay_ios.m
Changed
@@ -65,7 +65,7 @@ * * Create a new #GstVulkanDisplayIos. * - * Returns: (transfer full): a new #GstVulkanDisplayIos or %NULL + * Returns: (transfer full): a new #GstVulkanDisplayIos */ GstVulkanDisplayIos * gst_vulkan_display_ios_new (void)
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/meson.build
Changed
@@ -359,7 +359,7 @@ gen_sources += vulkan_gir endif endif -libraries += pkg_name, library_def +gst_libraries += pkg_name, library_def gstvulkan_dep = declare_dependency(link_with : gstvulkan, include_directories : libsinc,
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/wayland/gstvkdisplay_wayland.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/wayland/gstvkdisplay_wayland.c
Changed
@@ -105,12 +105,12 @@ /** * gst_vulkan_display_wayland_new: - * @name: (allow-none): a display name + * @name: (nullable): a display name * * Create a new #GstVulkanDisplayWayland from the wayland display name. See `wl_display_connect`() * for details on what is a valid name. * - * Returns: (transfer full): a new #GstVulkanDisplayWayland or %NULL + * Returns: (transfer full) (nullable): a new #GstVulkanDisplayWayland or %NULL * * Since: 1.18 */ @@ -118,17 +118,20 @@ gst_vulkan_display_wayland_new (const gchar * name) { GstVulkanDisplayWayland *ret; + struct wl_display *display; - ret = g_object_new (GST_TYPE_VULKAN_DISPLAY_WAYLAND, NULL); - gst_object_ref_sink (ret); - ret->display = wl_display_connect (name); + display = wl_display_connect (name); - if (!ret->display) { + if (!display) { GST_ERROR ("Failed to open Wayland display connection with name, \'%s\'", name); return NULL; } + ret = g_object_new (GST_TYPE_VULKAN_DISPLAY_WAYLAND, NULL); + gst_object_ref_sink (ret); + ret->display = display; + /* connecting the listeners after attaching the event source will race with * the source and the source may eat an event that we're waiting for and * deadlock */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/win32/gstvkwindow_win32.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/win32/gstvkwindow_win32.c
Changed
@@ -67,6 +67,9 @@ static void gst_vulkan_window_win32_close (GstVulkanWindow * window); static void release_parent_win_id (GstVulkanWindowWin32 * window_win32); static void gst_vulkan_window_win32_show (GstVulkanWindowWin32 * window); +static gboolean +gst_vulkan_window_win32_create_window (GstVulkanWindowWin32 * window_win32, + GError ** error); static void gst_vulkan_window_win32_class_init (GstVulkanWindowWin32Class * klass)
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/vulkan/xcb/gstvkdisplay_xcb.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/vulkan/xcb/gstvkdisplay_xcb.c
Changed
@@ -82,12 +82,12 @@ /** * gst_vulkan_display_xcb_new: - * @name: (allow-none): a display name + * @name: (nullable): a display name * * Create a new #GstVulkanDisplayXCB from the xcb display name. See XOpenDisplay\() * for details on what is a valid name. * - * Returns: (transfer full): a new #GstVulkanDisplayXCB or %NULL + * Returns: (transfer full) (nullable): a new #GstVulkanDisplayXCB or %NULL * * Since: 1.18 */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwl_fwd.h
Added
@@ -0,0 +1,31 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2022 Collabora Ltd. + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +G_BEGIN_DECLS + +typedef struct _GstWlBuffer GstWlBuffer; +typedef struct _GstWlDisplay GstWlDisplay; +typedef struct _GstWlShmAllocator GstWlShmAllocator; +typedef struct _GstWlVideoBufferPool GstWlVideoBufferPool; +typedef struct _GstWlWindow GstWlWindow; + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwlbuffer.c
Added
@@ -0,0 +1,291 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2014 Collabora Ltd. + * + * 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., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +/* GstWlBuffer wraps wl_buffer and provides a mechanism for preventing + * buffers from being re-used while the compositor is using them. This + * is achieved by adding a reference to the GstBuffer as soon as its + * associated wl_buffer is sent to the compositor and by removing this + * reference as soon as the compositor sends a wl_buffer::release message. + * + * This mechanism is a bit complicated, though, because it adds cyclic + * references that can be dangerous. The reference cycles looks like: + * + * ---------------- + * | GstWlDisplay | ----------------------------> + * ---------------- | + * | + * V + * ----------------- ------------- --------------- + * | GstBufferPool | --> | GstBuffer | ==> | GstWlBuffer | + * | | <-- | | <-- | | + * ----------------- ------------- --------------- + * + * A GstBufferPool normally holds references to its GstBuffers and each buffer + * holds a reference to a GstWlBuffer (saved in the GstMiniObject weak ref data). + * When a GstBuffer is in use, it holds a reference back to the pool and the + * pool doesn't hold a reference to the GstBuffer. When the GstBuffer is unrefed + * externally, it returns back to the pool and the pool holds again a reference + * to the buffer. + * + * Now when the compositor is using a buffer, the GstWlBuffer also holds a ref + * to the GstBuffer, which prevents it from returning to the pool. When the + * last GstWlBuffer receives a release event and unrefs the last GstBuffer, + * the GstBufferPool will be able to stop and if no-one is holding a strong + * ref to it, it will be destroyed. This will destroy the pool's GstBuffers and + * also the GstWlBuffers. This will all happen in the same context of the last + * gst_buffer_unref, which will be called from the buffer_release() callback. + * + * The problem here lies in the fact that buffer_release() will be called + * from the event loop thread of GstWlDisplay, so it's as if the display + * holds a reference to the GstWlBuffer, but without having an actual reference. + * When we kill the display, there is no way for the GstWlBuffer, the associated + * GstBuffer and the GstBufferPool to get destroyed, so we are going to leak a + * fair amount of memory. + * + * Normally, this rarely happens, because the compositor releases buffers + * almost immediately and when waylandsink stops, they are already released. + * + * However, we want to be absolutely certain, so a solution is introduced + * by registering all the GstWlBuffers with the display and explicitly + * releasing all the buffer references as soon as the display is destroyed. + * + * When the GstWlDisplay is finalized, it takes a reference to all the + * registered GstWlBuffers and then calls gst_wl_buffer_force_release_and_unref, + * which releases the potential reference to the GstBuffer, destroys the + * underlying wl_buffer and removes the reference that GstWlDisplay is holding. + * At that point, either the GstBuffer is alive somewhere and still holds a ref + * to the GstWlBuffer, which it will release when it gets destroyed, or the + * GstBuffer was destroyed in the meantime and the GstWlBuffer gets destroyed + * as soon as we remove the reference that GstWlDisplay holds. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "gstwlbuffer.h" + +#define GST_CAT_DEFAULT gst_wl_buffer_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +typedef struct _GstWlBufferPrivate +{ + struct wl_buffer *wlbuffer; + GstBuffer *current_gstbuffer; + GstMemory *gstmem; + + GstWlDisplay *display; + + gboolean used_by_compositor; +} GstWlBufferPrivate; + +G_DEFINE_TYPE_WITH_CODE (GstWlBuffer, gst_wl_buffer, G_TYPE_OBJECT, + G_ADD_PRIVATE (GstWlBuffer) + GST_DEBUG_CATEGORY_INIT (gst_wl_buffer_debug, + "wlbuffer", 0, "wlbuffer library"); + ); + +static void +gst_wl_buffer_dispose (GObject * gobject) +{ + GstWlBuffer *self = GST_WL_BUFFER (gobject); + GstWlBufferPrivate *priv = gst_wl_buffer_get_instance_private (self); + + GST_TRACE_OBJECT (self, "dispose"); + + /* if the display is shutting down and we are trying to dipose + * the GstWlBuffer from another thread, unregister_buffer() will + * block and in the end the display will increase the refcount + * of this GstWlBuffer, so it will not be finalized */ + if (priv->display) { + gst_wl_display_unregister_buffer (priv->display, priv->gstmem); + } + + G_OBJECT_CLASS (gst_wl_buffer_parent_class)->dispose (gobject); +} + +static void +gst_wl_buffer_finalize (GObject * gobject) +{ + GstWlBuffer *self = GST_WL_BUFFER (gobject); + GstWlBufferPrivate *priv = gst_wl_buffer_get_instance_private (self); + + GST_TRACE_OBJECT (self, "finalize"); + + if (priv->wlbuffer) + wl_buffer_destroy (priv->wlbuffer); + + G_OBJECT_CLASS (gst_wl_buffer_parent_class)->finalize (gobject); +} + +static void +gst_wl_buffer_class_init (GstWlBufferClass * klass) +{ + GObjectClass *object_class = (GObjectClass *) klass; + + object_class->dispose = gst_wl_buffer_dispose; + object_class->finalize = gst_wl_buffer_finalize; +} + +static void +gst_wl_buffer_init (GstWlBuffer * self) +{ +} + +static void +buffer_release (void *data, struct wl_buffer *wl_buffer) +{ + GstWlBuffer *self = data; + GstWlBufferPrivate *priv = gst_wl_buffer_get_instance_private (self); + GstBuffer *buf = priv->current_gstbuffer; + + GST_LOG_OBJECT (self, "wl_buffer::release (GstBuffer: %p)", buf); + + priv->used_by_compositor = FALSE; + priv->current_gstbuffer = NULL; + + /* unref should be last, because it may end up destroying the GstWlBuffer */ + gst_buffer_unref (buf); +} + +static const struct wl_buffer_listener buffer_listener = { + buffer_release +}; + +static void +gstmemory_disposed (GstWlBuffer * self) +{ + GstWlBufferPrivate *priv = gst_wl_buffer_get_instance_private (self); + + g_assert (!priv->used_by_compositor); + + GST_TRACE_OBJECT (self, "owning GstMemory was finalized"); + + /* this will normally destroy the GstWlBuffer, unless the display is + * finalizing and it has taken an additional reference to it */ + g_object_unref (self); +} + +GstWlBuffer * +gst_buffer_add_wl_buffer (GstBuffer * gstbuffer, struct wl_buffer *wlbuffer, + GstWlDisplay * display) +{ + GstWlBuffer *self; + GstWlBufferPrivate *priv; + + self = g_object_new (GST_TYPE_WL_BUFFER, NULL); + priv = gst_wl_buffer_get_instance_private (self); + priv->current_gstbuffer = gstbuffer; + priv->wlbuffer = wlbuffer; + priv->display = display; + priv->gstmem = gst_buffer_peek_memory (gstbuffer, 0); + + gst_wl_display_register_buffer (priv->display, priv->gstmem, self); + + wl_buffer_add_listener (priv->wlbuffer, &buffer_listener, self); + + gst_mini_object_weak_ref (GST_MINI_OBJECT (priv->gstmem), + (GstMiniObjectNotify) gstmemory_disposed, self); + + + return self; +} + +GstWlBuffer * +gst_buffer_get_wl_buffer (GstWlDisplay * display, GstBuffer * gstbuffer) +{ + GstMemory *mem0; + GstWlBuffer *wlbuf; + + if (!gstbuffer) + return NULL; + + mem0 = gst_buffer_peek_memory (gstbuffer, 0); + + wlbuf = gst_wl_display_lookup_buffer (display, mem0); + if (wlbuf) { + GstWlBufferPrivate *priv = gst_wl_buffer_get_instance_private (wlbuf); + + priv->current_gstbuffer = gstbuffer; + } + + return wlbuf; +} + +void +gst_wl_buffer_force_release_and_unref (GstBuffer * buf, GstWlBuffer * self) +{ + GstWlBufferPrivate *priv = gst_wl_buffer_get_instance_private (self); + + /* Force a buffer release. + * At this point, the GstWlDisplay has killed its event loop, + * so we don't need to worry about buffer_release() being called + * at the same time from the event loop thread */ + if (priv->used_by_compositor) { + GST_DEBUG_OBJECT (self, "forcing wl_buffer::release (GstBuffer: %p)", + priv->current_gstbuffer); + priv->used_by_compositor = FALSE; + gst_buffer_unref (priv->current_gstbuffer); + } + + /* Finalize this GstWlBuffer early. + * This method has been called as a result of the display shutting down, + * so we need to stop using any wayland resources and disconnect from + * the display. The GstWlBuffer stays alive, though, to avoid race + * conditions with the GstBuffer being destroyed from another thread. + * The last reference is either owned by the GstBuffer or by us and + * it will be released at the end of this function. */ + GST_TRACE_OBJECT (self, "finalizing early"); + wl_buffer_destroy (priv->wlbuffer); + priv->wlbuffer = NULL; + priv->display = NULL; + priv->current_gstbuffer = NULL; + + /* remove the reference that the caller (GstWlDisplay) owns */ + g_object_unref (self); +} + +void +gst_wl_buffer_attach (GstWlBuffer * self, struct wl_surface *surface) +{ + GstWlBufferPrivate *priv = gst_wl_buffer_get_instance_private (self); + + if (priv->used_by_compositor) { + GST_DEBUG_OBJECT (self, "buffer used by compositor %p", + priv->current_gstbuffer); + return; + } + + wl_surface_attach (surface, priv->wlbuffer, 0, 0); + + /* Add a reference to the buffer. This represents the fact that + * the compositor is using the buffer and it should not return + * back to the pool and be re-used until the compositor releases it. */ + gst_buffer_ref (priv->current_gstbuffer); + priv->used_by_compositor = TRUE; +} + +GstWlDisplay * +gst_wl_buffer_get_display (GstWlBuffer * self) +{ + GstWlBufferPrivate *priv = gst_wl_buffer_get_instance_private (self); + + return priv->display; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwlbuffer.h
Added
@@ -0,0 +1,51 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2014 Collabora Ltd. + * + * 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., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#pragma once + +#include <gst/wayland/wayland.h> + +G_BEGIN_DECLS + +#define GST_TYPE_WL_BUFFER gst_wl_buffer_get_type () +G_DECLARE_FINAL_TYPE (GstWlBuffer, gst_wl_buffer, GST, WL_BUFFER, GObject); + +struct _GstWlBuffer +{ + GObject parent_instance; +}; + +GST_WL_API +GstWlBuffer * gst_buffer_add_wl_buffer (GstBuffer * gstbuffer, + struct wl_buffer * wlbuffer, GstWlDisplay * display); + +GST_WL_API +GstWlBuffer * gst_buffer_get_wl_buffer (GstWlDisplay * display, GstBuffer * gstbuffer); + +GST_WL_API +void gst_wl_buffer_force_release_and_unref (GstBuffer *buf, GstWlBuffer * self); + +GST_WL_API +void gst_wl_buffer_attach (GstWlBuffer * self, struct wl_surface *surface); + +GST_WL_API +GstWlDisplay *gst_wl_buffer_get_display (GstWlBuffer * self); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwlcontext.c
Added
@@ -0,0 +1,66 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2022 Collabora Ltd. + * + * 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., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "gstwlcontext.h" + +gboolean +gst_is_wl_display_handle_need_context_message (GstMessage * msg) +{ + const gchar *type = NULL; + + g_return_val_if_fail (GST_IS_MESSAGE (msg), FALSE); + + if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_NEED_CONTEXT && + gst_message_parse_context_type (msg, &type)) { + return !g_strcmp0 (type, GST_WL_DISPLAY_HANDLE_CONTEXT_TYPE); + } + + return FALSE; +} + +GstContext * +gst_wl_display_handle_context_new (struct wl_display * display) +{ + GstContext *context = + gst_context_new (GST_WL_DISPLAY_HANDLE_CONTEXT_TYPE, TRUE); + gst_structure_set (gst_context_writable_structure (context), + "display", G_TYPE_POINTER, display, NULL); + return context; +} + +struct wl_display * +gst_wl_display_handle_context_get_handle (GstContext * context) +{ + const GstStructure *s; + struct wl_display *display; + + g_return_val_if_fail (GST_IS_CONTEXT (context), NULL); + + s = gst_context_get_structure (context); + if (gst_structure_get (s, "display", G_TYPE_POINTER, &display, NULL)) + return display; + if (gst_structure_get (s, "handle", G_TYPE_POINTER, &display, NULL)) + return display; + return NULL; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwlcontext.h
Added
@@ -0,0 +1,42 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2022 Collabora Ltd. + * + * 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., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#pragma once + +#include <gst/wayland/wayland.h> + +G_BEGIN_DECLS + +/* The type of GstContext used to pass the wl_display pointer + * from the application to the sink */ +#define GST_WL_DISPLAY_HANDLE_CONTEXT_TYPE "GstWlDisplayHandleContextType" + +GST_WL_API +gboolean gst_is_wl_display_handle_need_context_message (GstMessage * msg); + +GST_WL_API +GstContext * +gst_wl_display_handle_context_new (struct wl_display * display); + +GST_WL_API +struct wl_display * +gst_wl_display_handle_context_get_handle (GstContext * context); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwldisplay.c
Added
@@ -0,0 +1,567 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2014 Collabora Ltd. + * + * 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., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "gstwldisplay.h" + +#include "fullscreen-shell-unstable-v1-client-protocol.h" +#include "linux-dmabuf-unstable-v1-client-protocol.h" +#include "viewporter-client-protocol.h" +#include "xdg-shell-client-protocol.h" + +#include <errno.h> + +#define GST_CAT_DEFAULT gst_wl_display_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +typedef struct _GstWlDisplayPrivate +{ + /* public objects */ + struct wl_display *display; + struct wl_display *display_wrapper; + struct wl_event_queue *queue; + + /* globals */ + struct wl_registry *registry; + struct wl_compositor *compositor; + struct wl_subcompositor *subcompositor; + struct xdg_wm_base *xdg_wm_base; + struct zwp_fullscreen_shell_v1 *fullscreen_shell; + struct wl_shm *shm; + struct wp_viewporter *viewporter; + struct zwp_linux_dmabuf_v1 *dmabuf; + GArray *shm_formats; + GArray *dmabuf_formats; + + /* private */ + gboolean own_display; + GThread *thread; + GstPoll *wl_fd_poll; + + GMutex buffers_mutex; + GHashTable *buffers; + gboolean shutting_down; +} GstWlDisplayPrivate; + +G_DEFINE_TYPE_WITH_CODE (GstWlDisplay, gst_wl_display, G_TYPE_OBJECT, + G_ADD_PRIVATE (GstWlDisplay) + GST_DEBUG_CATEGORY_INIT (gst_wl_display_debug, + "wldisplay", 0, "wldisplay library"); + ); + +static void gst_wl_display_finalize (GObject * gobject); + +static void +gst_wl_display_class_init (GstWlDisplayClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = gst_wl_display_finalize; +} + +static void +gst_wl_display_init (GstWlDisplay * self) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + priv->shm_formats = g_array_new (FALSE, FALSE, sizeof (uint32_t)); + priv->dmabuf_formats = g_array_new (FALSE, FALSE, sizeof (uint32_t)); + priv->wl_fd_poll = gst_poll_new (TRUE); + priv->buffers = g_hash_table_new (g_direct_hash, g_direct_equal); + g_mutex_init (&priv->buffers_mutex); + + gst_wl_linux_dmabuf_init_once (); + gst_wl_shm_allocator_init_once (); + gst_wl_videoformat_init_once (); +} + +static void +gst_wl_ref_wl_buffer (gpointer key, gpointer value, gpointer user_data) +{ + g_object_ref (value); +} + +static void +gst_wl_display_finalize (GObject * gobject) +{ + GstWlDisplay *self = GST_WL_DISPLAY (gobject); + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + gst_poll_set_flushing (priv->wl_fd_poll, TRUE); + if (priv->thread) + g_thread_join (priv->thread); + + /* to avoid buffers being unregistered from another thread + * at the same time, take their ownership */ + g_mutex_lock (&priv->buffers_mutex); + priv->shutting_down = TRUE; + g_hash_table_foreach (priv->buffers, gst_wl_ref_wl_buffer, NULL); + g_mutex_unlock (&priv->buffers_mutex); + + g_hash_table_foreach (priv->buffers, + (GHFunc) gst_wl_buffer_force_release_and_unref, NULL); + g_hash_table_remove_all (priv->buffers); + + g_array_unref (priv->shm_formats); + g_array_unref (priv->dmabuf_formats); + gst_poll_free (priv->wl_fd_poll); + g_hash_table_unref (priv->buffers); + g_mutex_clear (&priv->buffers_mutex); + + if (priv->viewporter) + wp_viewporter_destroy (priv->viewporter); + + if (priv->shm) + wl_shm_destroy (priv->shm); + + if (priv->dmabuf) + zwp_linux_dmabuf_v1_destroy (priv->dmabuf); + + if (priv->xdg_wm_base) + xdg_wm_base_destroy (priv->xdg_wm_base); + + if (priv->fullscreen_shell) + zwp_fullscreen_shell_v1_release (priv->fullscreen_shell); + + if (priv->compositor) + wl_compositor_destroy (priv->compositor); + + if (priv->subcompositor) + wl_subcompositor_destroy (priv->subcompositor); + + if (priv->registry) + wl_registry_destroy (priv->registry); + + if (priv->display_wrapper) + wl_proxy_wrapper_destroy (priv->display_wrapper); + + if (priv->queue) + wl_event_queue_destroy (priv->queue); + + if (priv->own_display) { + wl_display_flush (priv->display); + wl_display_disconnect (priv->display); + } + + G_OBJECT_CLASS (gst_wl_display_parent_class)->finalize (gobject); +} + +static void +shm_format (void *data, struct wl_shm *wl_shm, uint32_t format) +{ + GstWlDisplay *self = data; + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + g_array_append_val (priv->shm_formats, format); +} + +static const struct wl_shm_listener shm_listener = { + shm_format +}; + +static void +dmabuf_format (void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf, + uint32_t format) +{ + GstWlDisplay *self = data; + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + if (gst_wl_dmabuf_format_to_video_format (format) != GST_VIDEO_FORMAT_UNKNOWN) + g_array_append_val (priv->dmabuf_formats, format); +} + +static const struct zwp_linux_dmabuf_v1_listener dmabuf_listener = { + dmabuf_format, +}; + +gboolean +gst_wl_display_check_format_for_shm (GstWlDisplay * self, GstVideoFormat format) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + enum wl_shm_format shm_fmt; + GArray *formats; + guint i; + + shm_fmt = gst_video_format_to_wl_shm_format (format); + if (shm_fmt == (enum wl_shm_format) -1) + return FALSE; + + formats = priv->shm_formats; + for (i = 0; i < formats->len; i++) { + if (g_array_index (formats, uint32_t, i) == shm_fmt) + return TRUE; + } + + return FALSE; +} + +gboolean +gst_wl_display_check_format_for_dmabuf (GstWlDisplay * self, + GstVideoFormat format) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + GArray *formats; + guint i, dmabuf_fmt; + + if (!priv->dmabuf) + return FALSE; + + dmabuf_fmt = gst_video_format_to_wl_dmabuf_format (format); + if (dmabuf_fmt == (guint) - 1) + return FALSE; + + formats = priv->dmabuf_formats; + for (i = 0; i < formats->len; i++) { + if (g_array_index (formats, uint32_t, i) == dmabuf_fmt) + return TRUE; + } + + return FALSE; +} + +static void +handle_xdg_wm_base_ping (void *user_data, struct xdg_wm_base *xdg_wm_base, + uint32_t serial) +{ + xdg_wm_base_pong (xdg_wm_base, serial); +} + +static const struct xdg_wm_base_listener xdg_wm_base_listener = { + handle_xdg_wm_base_ping +}; + +static void +registry_handle_global (void *data, struct wl_registry *registry, + uint32_t id, const char *interface, uint32_t version) +{ + GstWlDisplay *self = data; + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + if (g_strcmp0 (interface, "wl_compositor") == 0) { + priv->compositor = wl_registry_bind (registry, id, &wl_compositor_interface, + MIN (version, 4)); + } else if (g_strcmp0 (interface, "wl_subcompositor") == 0) { + priv->subcompositor = + wl_registry_bind (registry, id, &wl_subcompositor_interface, 1); + } else if (g_strcmp0 (interface, "xdg_wm_base") == 0) { + priv->xdg_wm_base = + wl_registry_bind (registry, id, &xdg_wm_base_interface, 1); + xdg_wm_base_add_listener (priv->xdg_wm_base, &xdg_wm_base_listener, self); + } else if (g_strcmp0 (interface, "zwp_fullscreen_shell_v1") == 0) { + priv->fullscreen_shell = wl_registry_bind (registry, id, + &zwp_fullscreen_shell_v1_interface, 1); + } else if (g_strcmp0 (interface, "wl_shm") == 0) { + priv->shm = wl_registry_bind (registry, id, &wl_shm_interface, 1); + wl_shm_add_listener (priv->shm, &shm_listener, self); + } else if (g_strcmp0 (interface, "wp_viewporter") == 0) { + priv->viewporter = + wl_registry_bind (registry, id, &wp_viewporter_interface, 1); + } else if (g_strcmp0 (interface, "zwp_linux_dmabuf_v1") == 0) { + priv->dmabuf = + wl_registry_bind (registry, id, &zwp_linux_dmabuf_v1_interface, 1); + zwp_linux_dmabuf_v1_add_listener (priv->dmabuf, &dmabuf_listener, self); + } +} + +static void +registry_handle_global_remove (void *data, struct wl_registry *registry, + uint32_t name) +{ + /* temporarily do nothing */ +} + +static const struct wl_registry_listener registry_listener = { + registry_handle_global, + registry_handle_global_remove +}; + +static gpointer +gst_wl_display_thread_run (gpointer data) +{ + GstWlDisplay *self = data; + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + GstPollFD pollfd = GST_POLL_FD_INIT; + + pollfd.fd = wl_display_get_fd (priv->display); + gst_poll_add_fd (priv->wl_fd_poll, &pollfd); + gst_poll_fd_ctl_read (priv->wl_fd_poll, &pollfd, TRUE); + + /* main loop */ + while (1) { + while (wl_display_prepare_read_queue (priv->display, priv->queue) != 0) + wl_display_dispatch_queue_pending (priv->display, priv->queue); + wl_display_flush (priv->display); + + if (gst_poll_wait (priv->wl_fd_poll, GST_CLOCK_TIME_NONE) < 0) { + gboolean normal = (errno == EBUSY); + wl_display_cancel_read (priv->display); + if (normal) + break; + else + goto error; + } + if (wl_display_read_events (priv->display) == -1) + goto error; + wl_display_dispatch_queue_pending (priv->display, priv->queue); + } + + return NULL; + +error: + GST_ERROR ("Error communicating with the wayland server"); + return NULL; +} + +GstWlDisplay * +gst_wl_display_new (const gchar * name, GError ** error) +{ + struct wl_display *display; + + display = wl_display_connect (name); + + if (!display) { + *error = g_error_new (g_quark_from_static_string ("GstWlDisplay"), 0, + "Failed to connect to the wayland display '%s'", + name ? name : "(default)"); + return NULL; + } else { + return gst_wl_display_new_existing (display, TRUE, error); + } +} + +GstWlDisplay * +gst_wl_display_new_existing (struct wl_display * display, + gboolean take_ownership, GError ** error) +{ + GstWlDisplay *self; + GstWlDisplayPrivate *priv; + GError *err = NULL; + gint i; + + g_return_val_if_fail (display != NULL, NULL); + + self = g_object_new (GST_TYPE_WL_DISPLAY, NULL); + priv = gst_wl_display_get_instance_private (self); + priv->display = display; + priv->display_wrapper = wl_proxy_create_wrapper (display); + priv->own_display = take_ownership; + + priv->queue = wl_display_create_queue (priv->display); + wl_proxy_set_queue ((struct wl_proxy *) priv->display_wrapper, priv->queue); + priv->registry = wl_display_get_registry (priv->display_wrapper); + wl_registry_add_listener (priv->registry, ®istry_listener, self); + + /* we need exactly 2 roundtrips to discover global objects and their state */ + for (i = 0; i < 2; i++) { + if (wl_display_roundtrip_queue (priv->display, priv->queue) < 0) { + *error = g_error_new (g_quark_from_static_string ("GstWlDisplay"), 0, + "Error communicating with the wayland display"); + g_object_unref (self); + return NULL; + } + } + + /* verify we got all the required interfaces */ +#define VERIFY_INTERFACE_EXISTS(var, interface) \ + if (!priv->var) { \ + g_set_error (error, g_quark_from_static_string ("GstWlDisplay"), 0, \ + "Could not bind to " interface ". Either it is not implemented in " \ + "the compositor, or the implemented version doesn't match"); \ + g_object_unref (self); \ + return NULL; \ + } + + VERIFY_INTERFACE_EXISTS (compositor, "wl_compositor"); + VERIFY_INTERFACE_EXISTS (subcompositor, "wl_subcompositor"); + VERIFY_INTERFACE_EXISTS (shm, "wl_shm"); + +#undef VERIFY_INTERFACE_EXISTS + + /* We make the viewporter optional even though it may cause bad display. + * This is so one can test wayland display on older compositor or on + * compositor that don't implement this extension. */ + if (!priv->viewporter) { + g_warning ("Wayland compositor is missing the ability to scale, video " + "display may not work properly."); + } + + if (!priv->dmabuf) { + g_warning ("Could not bind to zwp_linux_dmabuf_v1"); + } + + if (!priv->xdg_wm_base && !priv->fullscreen_shell) { + /* If wl_surface and wl_display are passed via GstContext + * xdg_shell and zwp_fullscreen_shell are not used. + * In this case is correct to continue. + */ + g_warning ("Could not bind to either xdg_wm_base or zwp_fullscreen_shell, " + "video display may not work properly."); + } + + priv->thread = g_thread_try_new ("GstWlDisplay", gst_wl_display_thread_run, + self, &err); + if (err) { + g_propagate_prefixed_error (error, err, + "Failed to start thread for the display's events"); + g_object_unref (self); + return NULL; + } + + return self; +} + +void +gst_wl_display_register_buffer (GstWlDisplay * self, gpointer gstmem, + gpointer wlbuffer) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + g_assert (!priv->shutting_down); + + GST_TRACE_OBJECT (self, "registering GstWlBuffer %p to GstMem %p", + wlbuffer, gstmem); + + g_mutex_lock (&priv->buffers_mutex); + g_hash_table_replace (priv->buffers, gstmem, wlbuffer); + g_mutex_unlock (&priv->buffers_mutex); +} + +gpointer +gst_wl_display_lookup_buffer (GstWlDisplay * self, gpointer gstmem) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + gpointer wlbuffer; + + g_mutex_lock (&priv->buffers_mutex); + wlbuffer = g_hash_table_lookup (priv->buffers, gstmem); + g_mutex_unlock (&priv->buffers_mutex); + return wlbuffer; +} + +void +gst_wl_display_unregister_buffer (GstWlDisplay * self, gpointer gstmem) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + GST_TRACE_OBJECT (self, "unregistering GstWlBuffer owned by %p", gstmem); + + g_mutex_lock (&priv->buffers_mutex); + if (G_LIKELY (!priv->shutting_down)) + g_hash_table_remove (priv->buffers, gstmem); + g_mutex_unlock (&priv->buffers_mutex); +} + +struct wl_display * +gst_wl_display_get_display (GstWlDisplay * self) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + return priv->display; +} + +struct wl_event_queue * +gst_wl_display_get_event_queue (GstWlDisplay * self) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + return priv->queue; +} + +struct wl_compositor * +gst_wl_display_get_compositor (GstWlDisplay * self) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + return priv->compositor; +} + +struct wl_subcompositor * +gst_wl_display_get_subcompositor (GstWlDisplay * self) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + return priv->subcompositor; +} + +struct xdg_wm_base * +gst_wl_display_get_xdg_wm_base (GstWlDisplay * self) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + return priv->xdg_wm_base; +} + +struct zwp_fullscreen_shell_v1 * +gst_wl_display_get_fullscreen_shell_v1 (GstWlDisplay * self) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + return priv->fullscreen_shell; +} + +struct wp_viewporter * +gst_wl_display_get_viewporter (GstWlDisplay * self) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + return priv->viewporter; +} + +struct wl_shm * +gst_wl_display_get_shm (GstWlDisplay * self) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + return priv->shm; +} + +GArray * +gst_wl_display_get_shm_formats (GstWlDisplay * self) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + return priv->shm_formats; +} + +struct zwp_linux_dmabuf_v1 * +gst_wl_display_get_dmabuf_v1 (GstWlDisplay * self) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + return priv->dmabuf; +} + +GArray * +gst_wl_display_get_dmabuf_formats (GstWlDisplay * self) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + return priv->dmabuf_formats; +} + +gboolean +gst_wl_display_has_own_display (GstWlDisplay * self) +{ + GstWlDisplayPrivate *priv = gst_wl_display_get_instance_private (self); + + return priv->own_display; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwldisplay.h
Added
@@ -0,0 +1,100 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2014 Collabora Ltd. + * + * 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., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#pragma once + +#include <gst/wayland/wayland.h> + +#include <gst/video/video.h> +#include <gst/video/video-info.h> + +G_BEGIN_DECLS + +#define GST_TYPE_WL_DISPLAY (gst_wl_display_get_type ()) +G_DECLARE_FINAL_TYPE (GstWlDisplay, gst_wl_display, GST, WL_DISPLAY, GObject); + +struct _GstWlDisplay +{ + GObject parent_instance; +}; + +GST_WL_API +GstWlDisplay *gst_wl_display_new (const gchar * name, GError ** error); + +GST_WL_API +GstWlDisplay *gst_wl_display_new_existing (struct wl_display * display, + gboolean take_ownership, GError ** error); + +/* see wlbuffer.c for explanation */ +GST_WL_API +void gst_wl_display_register_buffer (GstWlDisplay * self, gpointer gstmem, + gpointer wlbuffer); + +GST_WL_API +void gst_wl_display_unregister_buffer (GstWlDisplay * self, gpointer gstmem); + +GST_WL_API +gpointer gst_wl_display_lookup_buffer (GstWlDisplay * self, gpointer gstmem); + +GST_WL_API +gboolean gst_wl_display_check_format_for_shm (GstWlDisplay * self, + GstVideoFormat format); + +GST_WL_API +gboolean gst_wl_display_check_format_for_dmabuf (GstWlDisplay * self, + GstVideoFormat format); + +GST_WL_API +struct wl_display *gst_wl_display_get_display (GstWlDisplay * self); + +GST_WL_API +struct wl_event_queue *gst_wl_display_get_event_queue (GstWlDisplay * self); + +GST_WL_API +struct wl_compositor *gst_wl_display_get_compositor (GstWlDisplay * self); + +GST_WL_API +struct wl_subcompositor *gst_wl_display_get_subcompositor (GstWlDisplay * self); + +GST_WL_API +struct xdg_wm_base *gst_wl_display_get_xdg_wm_base (GstWlDisplay * self); + +GST_WL_API +struct zwp_fullscreen_shell_v1 *gst_wl_display_get_fullscreen_shell_v1 (GstWlDisplay * self); + +GST_WL_API +struct wp_viewporter *gst_wl_display_get_viewporter (GstWlDisplay * self); + +GST_WL_API +struct wl_shm *gst_wl_display_get_shm (GstWlDisplay * self); + +GST_WL_API +GArray *gst_wl_display_get_shm_formats (GstWlDisplay * self); + +GST_WL_API +GArray *gst_wl_display_get_dmabuf_formats (GstWlDisplay * self); + +GST_WL_API +struct zwp_linux_dmabuf_v1 *gst_wl_display_get_dmabuf_v1 (GstWlDisplay * self); + +GST_WL_API +gboolean gst_wl_display_has_own_display (GstWlDisplay * self); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwllinuxdmabuf.c
Added
@@ -0,0 +1,178 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2016 STMicroelectronics SA + * Copyright (C) 2016 Fabien Dessenne <fabien.dessenne@st.com> + * Copyright (C) 2022 Collabora Ltd. + * + * 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., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "gstwllinuxdmabuf.h" + +#include "linux-dmabuf-unstable-v1-client-protocol.h" + +GST_DEBUG_CATEGORY (gst_wl_dmabuf_debug); +#define GST_CAT_DEFAULT gst_wl_dmabuf_debug + +void +gst_wl_linux_dmabuf_init_once (void) +{ + static gsize _init = 0; + + if (g_once_init_enter (&_init)) { + GST_DEBUG_CATEGORY_INIT (gst_wl_dmabuf_debug, "wl_dmabuf", 0, + "wl_dmabuf library"); + + g_once_init_leave (&_init, 1); + } +} + +typedef struct +{ + GMutex lock; + GCond cond; + struct wl_buffer *wbuf; +} ConstructBufferData; + +static void +create_succeeded (void *data, struct zwp_linux_buffer_params_v1 *params, + struct wl_buffer *new_buffer) +{ + ConstructBufferData *d = data; + + g_mutex_lock (&d->lock); + d->wbuf = new_buffer; + zwp_linux_buffer_params_v1_destroy (params); + g_cond_signal (&d->cond); + g_mutex_unlock (&d->lock); +} + +static void +create_failed (void *data, struct zwp_linux_buffer_params_v1 *params) +{ + ConstructBufferData *d = data; + + g_mutex_lock (&d->lock); + d->wbuf = NULL; + zwp_linux_buffer_params_v1_destroy (params); + g_cond_signal (&d->cond); + g_mutex_unlock (&d->lock); +} + +static const struct zwp_linux_buffer_params_v1_listener params_listener = { + create_succeeded, + create_failed +}; + +struct wl_buffer * +gst_wl_linux_dmabuf_construct_wl_buffer (GstBuffer * buf, + GstWlDisplay * display, const GstVideoInfo * info) +{ + GstMemory *mem; + int format; + guint i, width, height; + guint nplanes, flags = 0; + struct zwp_linux_buffer_params_v1 *params; + gint64 timeout; + ConstructBufferData data; + + g_return_val_if_fail (gst_wl_display_check_format_for_dmabuf (display, + GST_VIDEO_INFO_FORMAT (info)), NULL); + + mem = gst_buffer_peek_memory (buf, 0); + format = gst_video_format_to_wl_dmabuf_format (GST_VIDEO_INFO_FORMAT (info)); + + g_cond_init (&data.cond); + g_mutex_init (&data.lock); + g_mutex_lock (&data.lock); + + width = GST_VIDEO_INFO_WIDTH (info); + height = GST_VIDEO_INFO_HEIGHT (info); + nplanes = GST_VIDEO_INFO_N_PLANES (info); + + GST_DEBUG_OBJECT (display, "Creating wl_buffer from DMABuf of size %" + G_GSSIZE_FORMAT " (%d x %d), format %s", info->size, width, height, + gst_wl_dmabuf_format_to_string (format)); + + /* Creation and configuration of planes */ + params = zwp_linux_dmabuf_v1_create_params (gst_wl_display_get_dmabuf_v1 + (display)); + + for (i = 0; i < nplanes; i++) { + guint offset, stride, mem_idx, length; + gsize skip; + + offset = GST_VIDEO_INFO_PLANE_OFFSET (info, i); + stride = GST_VIDEO_INFO_PLANE_STRIDE (info, i); + if (gst_buffer_find_memory (buf, offset, 1, &mem_idx, &length, &skip)) { + GstMemory *m = gst_buffer_peek_memory (buf, mem_idx); + gint fd = gst_dmabuf_memory_get_fd (m); + zwp_linux_buffer_params_v1_add (params, fd, i, m->offset + skip, + stride, 0, 0); + } else { + GST_ERROR_OBJECT (mem->allocator, "memory does not seem to contain " + "enough data for the specified format"); + zwp_linux_buffer_params_v1_destroy (params); + data.wbuf = NULL; + goto out; + } + } + + if (GST_BUFFER_FLAG_IS_SET (buf, GST_VIDEO_BUFFER_FLAG_INTERLACED)) { + GST_DEBUG_OBJECT (mem->allocator, "interlaced buffer"); + flags = ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_INTERLACED; + + if (!GST_BUFFER_FLAG_IS_SET (buf, GST_VIDEO_BUFFER_FLAG_TFF)) { + GST_DEBUG_OBJECT (mem->allocator, "with bottom field first"); + flags |= ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_BOTTOM_FIRST; + } + } + + /* Request buffer creation */ + zwp_linux_buffer_params_v1_add_listener (params, ¶ms_listener, &data); + zwp_linux_buffer_params_v1_create (params, width, height, format, flags); + + /* Wait for the request answer */ + wl_display_flush (gst_wl_display_get_display (display)); + data.wbuf = (gpointer) 0x1; + timeout = g_get_monotonic_time () + G_TIME_SPAN_SECOND; + while (data.wbuf == (gpointer) 0x1) { + if (!g_cond_wait_until (&data.cond, &data.lock, timeout)) { + GST_ERROR_OBJECT (mem->allocator, "zwp_linux_buffer_params_v1 time out"); + zwp_linux_buffer_params_v1_destroy (params); + data.wbuf = NULL; + } + } + +out: + if (!data.wbuf) { + GST_ERROR_OBJECT (mem->allocator, "can't create linux-dmabuf buffer"); + } else { + GST_DEBUG_OBJECT (mem->allocator, "created linux_dmabuf wl_buffer (%p):" + "%dx%d, fmt=%.4s, %d planes", + data.wbuf, width, height, (char *) &format, nplanes); + } + + g_mutex_unlock (&data.lock); + g_mutex_clear (&data.lock); + g_cond_clear (&data.cond); + + return data.wbuf; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwllinuxdmabuf.h
Added
@@ -0,0 +1,42 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2016 STMicroelectronics SA + * Copyright (C) 2016 Fabien Dessenne <fabien.dessenne@st.com> + * Copyright (C) 2022 Collabora Ltd. + * + * 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., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#pragma once + +#include <gst/wayland/wayland.h> + +#include <gst/video/video.h> + +G_BEGIN_DECLS + +#ifndef GST_CAPS_FEATURE_MEMORY_DMABUF +#define GST_CAPS_FEATURE_MEMORY_DMABUF "memory:DMABuf" +#endif + +GST_WL_API +void gst_wl_linux_dmabuf_init_once (void); + +GST_WL_API +struct wl_buffer * gst_wl_linux_dmabuf_construct_wl_buffer (GstBuffer * buf, + GstWlDisplay * display, const GstVideoInfo * info); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwlshmallocator.c
Added
@@ -0,0 +1,235 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2012 Intel Corporation + * Copyright (C) 2012 Sreerenj Balachandran <sreerenj.balachandran@intel.com> + * Copyright (C) 2014 Collabora Ltd. + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "gstwlshmallocator.h" + +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/mman.h> +#include <sys/types.h> +#include <unistd.h> + +#define GST_CAT_DEFAULT gst_wl_shm_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +G_DEFINE_TYPE_WITH_CODE (GstWlShmAllocator, gst_wl_shm_allocator, + GST_TYPE_FD_ALLOCATOR, + GST_DEBUG_CATEGORY_INIT (gst_wl_shm_debug, "wlshm", 0, "wlshm library"); + ); + +static GstMemory * +gst_wl_shm_allocator_alloc (GstAllocator * allocator, gsize size, + GstAllocationParams * params) +{ + GstWlShmAllocator *self = GST_WL_SHM_ALLOCATOR (allocator); + char filename1024; + static int init = 0; + int fd; + GstMemory *mem; + GstMapInfo info; + + /* TODO: make use of the allocation params, if necessary */ + +#ifdef HAVE_MEMFD_CREATE + fd = memfd_create ("gst-wayland-shm", MFD_CLOEXEC | MFD_ALLOW_SEALING); + if (fd >= 0) { + /* We can add this seal before calling posix_fallocate(), as + * the file is currently zero-sized anyway. + * + * There is also no need to check for the return value, we + * couldn't do anything with it anyway. + */ + fcntl (fd, F_ADD_SEALS, F_SEAL_SHRINK); + } else +#endif + { + /* allocate shm pool */ + snprintf (filename, 1024, "%s/%s-%d-%s", g_get_user_runtime_dir (), + "wayland-shm", init++, "XXXXXX"); + + fd = g_mkstemp (filename); + if (fd < 0) { + GST_ERROR_OBJECT (self, "opening temp file %s failed: %s", filename, + strerror (errno)); + return NULL; + } + + unlink (filename); + } + + if (ftruncate (fd, size) < 0) { + GST_ERROR_OBJECT (self, "ftruncate failed: %s", strerror (errno)); + close (fd); + return NULL; + } + + mem = gst_fd_allocator_alloc (allocator, fd, size, + GST_FD_MEMORY_FLAG_KEEP_MAPPED); + if (G_UNLIKELY (!mem)) { + GST_ERROR_OBJECT (self, "GstFdMemory allocation failed"); + close (fd); + return NULL; + } + + /* we need to map the memory in order to unlink the file without losing it */ + if (!gst_memory_map (mem, &info, GST_MAP_READWRITE)) { + GST_ERROR_OBJECT (self, "GstFdMemory map failed"); + close (fd); + return NULL; + } + + /* unmap will not really munmap(), we just + * need it to release the miniobject lock */ + gst_memory_unmap (mem, &info); + + return mem; +} + +static void +gst_wl_shm_allocator_class_init (GstWlShmAllocatorClass * klass) +{ + GstAllocatorClass *alloc_class = (GstAllocatorClass *) klass; + + alloc_class->alloc = GST_DEBUG_FUNCPTR (gst_wl_shm_allocator_alloc); +} + +static void +gst_wl_shm_allocator_init (GstWlShmAllocator * self) +{ + GstAllocator *alloc = GST_ALLOCATOR_CAST (self); + + alloc->mem_type = GST_ALLOCATOR_WL_SHM; + + GST_OBJECT_FLAG_UNSET (self, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC); +} + +void +gst_wl_shm_allocator_init_once (void) +{ + static gsize _init = 0; + + if (g_once_init_enter (&_init)) { + GstAllocator *alloc; + + alloc = g_object_new (GST_TYPE_WL_SHM_ALLOCATOR, NULL); + gst_object_ref_sink (alloc); + gst_allocator_register (GST_ALLOCATOR_WL_SHM, alloc); + + g_once_init_leave (&_init, 1); + } +} + +GstAllocator * +gst_wl_shm_allocator_get (void) +{ + return gst_allocator_find (GST_ALLOCATOR_WL_SHM); +} + +gboolean +gst_is_wl_shm_memory (GstMemory * mem) +{ + return gst_memory_is_type (mem, GST_ALLOCATOR_WL_SHM); +} + +static gboolean +gst_wl_shm_validate_video_info (const GstVideoInfo * vinfo) +{ + gint height = GST_VIDEO_INFO_HEIGHT (vinfo); + gint base_stride = GST_VIDEO_INFO_PLANE_STRIDE (vinfo, 0); + gsize base_offs = GST_VIDEO_INFO_PLANE_OFFSET (vinfo, 0); + gint i; + gsize offs = 0; + + for (i = 0; i < GST_VIDEO_INFO_N_PLANES (vinfo); i++) { + guint32 estride; + + /* Overwrite the video info's stride and offset using the pitch calculcated + * by the kms driver. */ + estride = gst_video_format_info_extrapolate_stride (vinfo->finfo, i, + base_stride); + + if (estride != GST_VIDEO_INFO_PLANE_STRIDE (vinfo, i)) + return FALSE; + + if (GST_VIDEO_INFO_PLANE_OFFSET (vinfo, i) - base_offs != offs) + return FALSE; + + /* Note that we cannot negotiate special padding betweem each planes, + * hence using the display height here. */ + offs += + estride * GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (vinfo->finfo, i, height); + } + + if (vinfo->size < offs) + return FALSE; + + return TRUE; +} + +struct wl_buffer * +gst_wl_shm_memory_construct_wl_buffer (GstMemory * mem, GstWlDisplay * display, + const GstVideoInfo * info) +{ + gint width, height, stride; + gsize offset, size, memsize, maxsize; + enum wl_shm_format format; + struct wl_shm_pool *wl_pool; + struct wl_buffer *wbuffer; + + if (!gst_wl_shm_validate_video_info (info)) { + GST_DEBUG_OBJECT (display, "Unsupported strides and offsets."); + return NULL; + } + + width = GST_VIDEO_INFO_WIDTH (info); + height = GST_VIDEO_INFO_HEIGHT (info); + stride = GST_VIDEO_INFO_PLANE_STRIDE (info, 0); + size = GST_VIDEO_INFO_SIZE (info); + format = gst_video_format_to_wl_shm_format (GST_VIDEO_INFO_FORMAT (info)); + + memsize = gst_memory_get_sizes (mem, &offset, &maxsize); + offset += GST_VIDEO_INFO_PLANE_OFFSET (info, 0); + + g_return_val_if_fail (gst_is_fd_memory (mem), NULL); + g_return_val_if_fail (size <= memsize, NULL); + g_return_val_if_fail (gst_wl_display_check_format_for_shm (display, + GST_VIDEO_INFO_FORMAT (info)), NULL); + + GST_DEBUG_OBJECT (display, "Creating wl_buffer from SHM of size %" + G_GSSIZE_FORMAT " (%d x %d, stride %d), format %s", size, width, height, + stride, gst_wl_shm_format_to_string (format)); + + wl_pool = wl_shm_create_pool (gst_wl_display_get_shm (display), + gst_fd_memory_get_fd (mem), memsize); + wbuffer = wl_shm_pool_create_buffer (wl_pool, offset, width, height, stride, + format); + wl_shm_pool_destroy (wl_pool); + + return wbuffer; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwlshmallocator.h
Added
@@ -0,0 +1,55 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2012 Intel Corporation + * Copyright (C) 2012 Sreerenj Balachandran <sreerenj.balachandran@intel.com> + * Copyright (C) 2014 Collabora Ltd. + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/wayland/wayland.h> + +#include <gst/allocators/allocators.h> +#include <gst/video/video.h> + +G_BEGIN_DECLS + +#define GST_TYPE_WL_SHM_ALLOCATOR (gst_wl_shm_allocator_get_type ()) +G_DECLARE_FINAL_TYPE (GstWlShmAllocator, gst_wl_shm_allocator, GST, WL_SHM_ALLOCATOR, GstFdAllocator); + +#define GST_ALLOCATOR_WL_SHM "wl_shm" + +struct _GstWlShmAllocator +{ + GstFdAllocator parent_instance; +}; + +GST_WL_API +void gst_wl_shm_allocator_init_once (void); + +GST_WL_API +GstAllocator * gst_wl_shm_allocator_get (void); + +GST_WL_API +gboolean gst_is_wl_shm_memory (GstMemory * mem); + +GST_WL_API +struct wl_buffer * gst_wl_shm_memory_construct_wl_buffer (GstMemory * mem, + GstWlDisplay * display, const GstVideoInfo * info); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwlvideobufferpool.c
Added
@@ -0,0 +1,53 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2017 Collabora Ltd. + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "gstwlvideobufferpool.h" + +G_DEFINE_TYPE (GstWlVideoBufferPool, gst_wl_video_buffer_pool, + GST_TYPE_VIDEO_BUFFER_POOL); + +static const gchar ** +gst_wl_video_buffer_pool_get_options (GstBufferPool * pool) +{ + static const gchar *options = { GST_BUFFER_POOL_OPTION_VIDEO_META, NULL }; + return options; +} + +static void +gst_wl_video_buffer_pool_class_init (GstWlVideoBufferPoolClass * klass) +{ + GstBufferPoolClass *pool_class = GST_BUFFER_POOL_CLASS (klass); + pool_class->get_options = gst_wl_video_buffer_pool_get_options; +} + +static void +gst_wl_video_buffer_pool_init (GstWlVideoBufferPool * pool) +{ +} + +GstBufferPool * +gst_wl_video_buffer_pool_new (void) +{ + return (GstBufferPool *) g_object_new (GST_TYPE_WL_VIDEO_BUFFER_POOL, NULL); +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwlvideobufferpool.h
Added
@@ -0,0 +1,46 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2017 Collabora Ltd. + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/wayland/wayland.h> + +#include <gst/video/video.h> + +G_BEGIN_DECLS + +/* A tiny GstVideoBufferPool subclass that modify the options to remove + * VideoAlignment. To support VideoAlignment we would need to pass the padded + * width/height + stride and use the viewporter interface to crop, a bit like + * we use to do with XV. It would still be quite limited. It's a bit retro, + * hopefully there will be a better Wayland interface in the future. */ + +#define GST_TYPE_WL_VIDEO_BUFFER_POOL (gst_wl_video_buffer_pool_get_type ()) +G_DECLARE_FINAL_TYPE (GstWlVideoBufferPool, gst_wl_video_buffer_pool, GST, WL_VIDEO_BUFFER_POOL, GstVideoBufferPool); + +struct _GstWlVideoBufferPool +{ + GstVideoBufferPool parent; +}; + +GST_WL_API +GstBufferPool * gst_wl_video_buffer_pool_new (void); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwlvideoformat.c
Added
@@ -0,0 +1,148 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2011 Intel Corporation + * Copyright (C) 2011 Sreerenj Balachandran <sreerenj.balachandran@intel.com> + * Copyright (C) 2012 Wim Taymans <wim.taymans@gmail.com> + * Copyright (C) 2014 Collabora Ltd. + * + * 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., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "gstwlvideoformat.h" + +#include <drm_fourcc.h> + +#define GST_CAT_DEFAULT gst_wl_videoformat_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +void +gst_wl_videoformat_init_once (void) +{ + static gsize _init = 0; + + if (g_once_init_enter (&_init)) { + GST_DEBUG_CATEGORY_INIT (gst_wl_videoformat_debug, "wl_videoformat", 0, + "wl_videoformat library"); + + g_once_init_leave (&_init, 1); + } +} + +typedef struct +{ + enum wl_shm_format wl_shm_format; + guint dma_format; + GstVideoFormat gst_format; +} wl_VideoFormat; + +static const wl_VideoFormat wl_formats = { + {WL_SHM_FORMAT_XRGB8888, DRM_FORMAT_XRGB8888, GST_VIDEO_FORMAT_BGRx}, + {WL_SHM_FORMAT_ARGB8888, DRM_FORMAT_ARGB8888, GST_VIDEO_FORMAT_BGRA}, + {WL_SHM_FORMAT_XBGR8888, DRM_FORMAT_XBGR8888, GST_VIDEO_FORMAT_RGBx}, + {WL_SHM_FORMAT_RGBX8888, DRM_FORMAT_RGBX8888, GST_VIDEO_FORMAT_xBGR}, + {WL_SHM_FORMAT_BGRX8888, DRM_FORMAT_BGRX8888, GST_VIDEO_FORMAT_xRGB}, + {WL_SHM_FORMAT_ABGR8888, DRM_FORMAT_ABGR8888, GST_VIDEO_FORMAT_RGBA}, + {WL_SHM_FORMAT_RGBA8888, DRM_FORMAT_RGBA8888, GST_VIDEO_FORMAT_ABGR}, + {WL_SHM_FORMAT_BGRA8888, DRM_FORMAT_BGRA8888, GST_VIDEO_FORMAT_ARGB}, + {WL_SHM_FORMAT_RGB888, DRM_FORMAT_RGB888, GST_VIDEO_FORMAT_RGB}, + {WL_SHM_FORMAT_BGR888, DRM_FORMAT_BGR888, GST_VIDEO_FORMAT_BGR}, + {WL_SHM_FORMAT_RGB565, DRM_FORMAT_RGB565, GST_VIDEO_FORMAT_RGB16}, + {WL_SHM_FORMAT_BGR565, DRM_FORMAT_BGR565, GST_VIDEO_FORMAT_BGR16}, + + {WL_SHM_FORMAT_YUYV, DRM_FORMAT_YUYV, GST_VIDEO_FORMAT_YUY2}, + {WL_SHM_FORMAT_YVYU, DRM_FORMAT_YVYU, GST_VIDEO_FORMAT_YVYU}, + {WL_SHM_FORMAT_UYVY, DRM_FORMAT_UYVY, GST_VIDEO_FORMAT_UYVY}, + {WL_SHM_FORMAT_AYUV, DRM_FORMAT_AYUV, GST_VIDEO_FORMAT_AYUV}, + {WL_SHM_FORMAT_NV12, DRM_FORMAT_NV12, GST_VIDEO_FORMAT_NV12}, + {WL_SHM_FORMAT_NV21, DRM_FORMAT_NV21, GST_VIDEO_FORMAT_NV21}, + {WL_SHM_FORMAT_NV16, DRM_FORMAT_NV16, GST_VIDEO_FORMAT_NV16}, + {WL_SHM_FORMAT_NV61, DRM_FORMAT_NV61, GST_VIDEO_FORMAT_NV61}, + {WL_SHM_FORMAT_YUV410, DRM_FORMAT_YUV410, GST_VIDEO_FORMAT_YUV9}, + {WL_SHM_FORMAT_YVU410, DRM_FORMAT_YVU410, GST_VIDEO_FORMAT_YVU9}, + {WL_SHM_FORMAT_YUV411, DRM_FORMAT_YUV411, GST_VIDEO_FORMAT_Y41B}, + {WL_SHM_FORMAT_YUV420, DRM_FORMAT_YUV420, GST_VIDEO_FORMAT_I420}, + {WL_SHM_FORMAT_YVU420, DRM_FORMAT_YVU420, GST_VIDEO_FORMAT_YV12}, + {WL_SHM_FORMAT_YUV422, DRM_FORMAT_YUV422, GST_VIDEO_FORMAT_Y42B}, + {WL_SHM_FORMAT_YUV444, DRM_FORMAT_YUV444, GST_VIDEO_FORMAT_v308}, +}; + +enum wl_shm_format +gst_video_format_to_wl_shm_format (GstVideoFormat format) +{ + guint i; + + for (i = 0; i < G_N_ELEMENTS (wl_formats); i++) + if (wl_formatsi.gst_format == format) + return wl_formatsi.wl_shm_format; + + GST_WARNING ("wayland shm video format not found"); + return -1; +} + +gint +gst_video_format_to_wl_dmabuf_format (GstVideoFormat format) +{ + guint i; + + for (i = 0; i < G_N_ELEMENTS (wl_formats); i++) + if (wl_formatsi.gst_format == format) + return wl_formatsi.dma_format; + + GST_WARNING ("wayland dmabuf video format not found"); + return -1; +} + +GstVideoFormat +gst_wl_shm_format_to_video_format (enum wl_shm_format wl_format) +{ + guint i; + + for (i = 0; i < G_N_ELEMENTS (wl_formats); i++) + if (wl_formatsi.wl_shm_format == wl_format) + return wl_formatsi.gst_format; + + return GST_VIDEO_FORMAT_UNKNOWN; +} + +GstVideoFormat +gst_wl_dmabuf_format_to_video_format (guint wl_format) +{ + guint i; + + for (i = 0; i < G_N_ELEMENTS (wl_formats); i++) + if (wl_formatsi.dma_format == wl_format) + return wl_formatsi.gst_format; + + return GST_VIDEO_FORMAT_UNKNOWN; +} + +const gchar * +gst_wl_shm_format_to_string (enum wl_shm_format wl_format) +{ + return gst_video_format_to_string + (gst_wl_shm_format_to_video_format (wl_format)); +} + +const gchar * +gst_wl_dmabuf_format_to_string (guint wl_format) +{ + return gst_video_format_to_string + (gst_wl_dmabuf_format_to_video_format (wl_format)); +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwlvideoformat.h
Added
@@ -0,0 +1,53 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2011 Intel Corporation + * Copyright (C) 2011 Sreerenj Balachandran <sreerenj.balachandran@intel.com> + * Copyright (C) 2012 Wim Taymans <wim.taymans@gmail.com> + * Copyright (C) 2014 Collabora Ltd. + * + * 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., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#pragma once + +#include <gst/wayland/wayland.h> + +#include <gst/video/video.h> + +G_BEGIN_DECLS + +GST_WL_API +void gst_wl_videoformat_init_once (void); + +GST_WL_API +enum wl_shm_format gst_video_format_to_wl_shm_format (GstVideoFormat format); + +GST_WL_API +gint gst_video_format_to_wl_dmabuf_format (GstVideoFormat format); + +GST_WL_API +GstVideoFormat gst_wl_shm_format_to_video_format (enum wl_shm_format wl_format); + +GST_WL_API +GstVideoFormat gst_wl_dmabuf_format_to_video_format (guint wl_format); + +GST_WL_API +const gchar *gst_wl_shm_format_to_string (enum wl_shm_format wl_format); + +GST_WL_API +const gchar *gst_wl_dmabuf_format_to_string (guint wl_format); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwlwindow.c
Added
@@ -0,0 +1,677 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2011 Intel Corporation + * Copyright (C) 2011 Sreerenj Balachandran <sreerenj.balachandran@intel.com> + * Copyright (C) 2014 Collabora Ltd. + * + * 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., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "gstwlwindow.h" + +#include "fullscreen-shell-unstable-v1-client-protocol.h" +#include "viewporter-client-protocol.h" +#include "xdg-shell-client-protocol.h" + +#define GST_CAT_DEFAULT gst_wl_window_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +typedef struct _GstWlWindowPrivate +{ + GObject parent_instance; + + GMutex *render_lock; + + GstWlDisplay *display; + struct wl_surface *area_surface; + struct wl_surface *area_surface_wrapper; + struct wl_subsurface *area_subsurface; + struct wp_viewport *area_viewport; + struct wl_surface *video_surface; + struct wl_surface *video_surface_wrapper; + struct wl_subsurface *video_subsurface; + struct wp_viewport *video_viewport; + struct xdg_surface *xdg_surface; + struct xdg_toplevel *xdg_toplevel; + gboolean configured; + GCond configure_cond; + GMutex configure_mutex; + + /* the size and position of the area_(sub)surface */ + GstVideoRectangle render_rectangle; + + /* the size and position of the video_subsurface */ + GstVideoRectangle video_rectangle; + + /* the size of the video in the buffers */ + gint video_width, video_height; + + enum wl_output_transform buffer_transform; + + /* when this is not set both the area_surface and the video_surface are not + * visible and certain steps should be skipped */ + gboolean is_area_surface_mapped; +} GstWlWindowPrivate; + +G_DEFINE_TYPE_WITH_CODE (GstWlWindow, gst_wl_window, G_TYPE_OBJECT, + G_ADD_PRIVATE (GstWlWindow) + GST_DEBUG_CATEGORY_INIT (gst_wl_window_debug, + "wlwindow", 0, "wlwindow library"); + ); + +enum +{ + CLOSED, + LAST_SIGNAL +}; + +static guint signalsLAST_SIGNAL = { 0 }; + +static void gst_wl_window_finalize (GObject * gobject); + +static void gst_wl_window_update_borders (GstWlWindow * self); + +static void +handle_xdg_toplevel_close (void *data, struct xdg_toplevel *xdg_toplevel) +{ + GstWlWindow *self = data; + + GST_DEBUG ("XDG toplevel got a \"close\" event."); + g_signal_emit (self, signalsCLOSED, 0); +} + +static void +handle_xdg_toplevel_configure (void *data, struct xdg_toplevel *xdg_toplevel, + int32_t width, int32_t height, struct wl_array *states) +{ + GstWlWindow *self = data; + const uint32_t *state; + + GST_DEBUG ("XDG toplevel got a \"configure\" event, %d, %d .", + width, height); + + wl_array_for_each (state, states) { + switch (*state) { + case XDG_TOPLEVEL_STATE_FULLSCREEN: + case XDG_TOPLEVEL_STATE_MAXIMIZED: + case XDG_TOPLEVEL_STATE_RESIZING: + case XDG_TOPLEVEL_STATE_ACTIVATED: + break; + } + } + + if (width <= 0 || height <= 0) + return; + + gst_wl_window_set_render_rectangle (self, 0, 0, width, height); +} + +static const struct xdg_toplevel_listener xdg_toplevel_listener = { + handle_xdg_toplevel_configure, + handle_xdg_toplevel_close, +}; + +static void +handle_xdg_surface_configure (void *data, struct xdg_surface *xdg_surface, + uint32_t serial) +{ + GstWlWindow *self = data; + GstWlWindowPrivate *priv = gst_wl_window_get_instance_private (self); + + xdg_surface_ack_configure (xdg_surface, serial); + + g_mutex_lock (&priv->configure_mutex); + priv->configured = TRUE; + g_cond_signal (&priv->configure_cond); + g_mutex_unlock (&priv->configure_mutex); +} + +static const struct xdg_surface_listener xdg_surface_listener = { + handle_xdg_surface_configure, +}; + +static void +gst_wl_window_class_init (GstWlWindowClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = gst_wl_window_finalize; + + signalsCLOSED = g_signal_new ("closed", G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0); +} + +static void +gst_wl_window_init (GstWlWindow * self) +{ + GstWlWindowPrivate *priv = gst_wl_window_get_instance_private (self); + + priv->configured = TRUE; + g_cond_init (&priv->configure_cond); + g_mutex_init (&priv->configure_mutex); +} + +static void +gst_wl_window_finalize (GObject * gobject) +{ + GstWlWindow *self = GST_WL_WINDOW (gobject); + GstWlWindowPrivate *priv = gst_wl_window_get_instance_private (self); + + if (priv->xdg_toplevel) + xdg_toplevel_destroy (priv->xdg_toplevel); + if (priv->xdg_surface) + xdg_surface_destroy (priv->xdg_surface); + + if (priv->video_viewport) + wp_viewport_destroy (priv->video_viewport); + + wl_proxy_wrapper_destroy (priv->video_surface_wrapper); + wl_subsurface_destroy (priv->video_subsurface); + wl_surface_destroy (priv->video_surface); + + if (priv->area_subsurface) + wl_subsurface_destroy (priv->area_subsurface); + + if (priv->area_viewport) + wp_viewport_destroy (priv->area_viewport); + + wl_proxy_wrapper_destroy (priv->area_surface_wrapper); + wl_surface_destroy (priv->area_surface); + + g_clear_object (&priv->display); + + G_OBJECT_CLASS (gst_wl_window_parent_class)->finalize (gobject); +} + +static GstWlWindow * +gst_wl_window_new_internal (GstWlDisplay * display, GMutex * render_lock) +{ + GstWlWindow *self; + GstWlWindowPrivate *priv; + struct wl_compositor *compositor; + struct wl_event_queue *event_queue; + struct wl_region *region; + struct wp_viewporter *viewporter; + + self = g_object_new (GST_TYPE_WL_WINDOW, NULL); + priv = gst_wl_window_get_instance_private (self); + priv->display = g_object_ref (display); + priv->render_lock = render_lock; + g_cond_init (&priv->configure_cond); + + compositor = gst_wl_display_get_compositor (display); + priv->area_surface = wl_compositor_create_surface (compositor); + priv->video_surface = wl_compositor_create_surface (compositor); + + priv->area_surface_wrapper = wl_proxy_create_wrapper (priv->area_surface); + priv->video_surface_wrapper = wl_proxy_create_wrapper (priv->video_surface); + + event_queue = gst_wl_display_get_event_queue (display); + wl_proxy_set_queue ((struct wl_proxy *) priv->area_surface_wrapper, + event_queue); + wl_proxy_set_queue ((struct wl_proxy *) priv->video_surface_wrapper, + event_queue); + + /* embed video_surface in area_surface */ + priv->video_subsurface = + wl_subcompositor_get_subsurface (gst_wl_display_get_subcompositor + (display), priv->video_surface, priv->area_surface); + wl_subsurface_set_desync (priv->video_subsurface); + + viewporter = gst_wl_display_get_viewporter (display); + if (viewporter) { + priv->area_viewport = wp_viewporter_get_viewport (viewporter, + priv->area_surface); + priv->video_viewport = wp_viewporter_get_viewport (viewporter, + priv->video_surface); + } + + /* never accept input events on the video surface */ + region = wl_compositor_create_region (compositor); + wl_surface_set_input_region (priv->video_surface, region); + wl_region_destroy (region); + + return self; +} + +void +gst_wl_window_ensure_fullscreen (GstWlWindow * self, gboolean fullscreen) +{ + GstWlWindowPrivate *priv; + + g_return_if_fail (self); + + priv = gst_wl_window_get_instance_private (self); + if (fullscreen) + xdg_toplevel_set_fullscreen (priv->xdg_toplevel, NULL); + else + xdg_toplevel_unset_fullscreen (priv->xdg_toplevel); +} + +GstWlWindow * +gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info, + gboolean fullscreen, GMutex * render_lock) +{ + GstWlWindow *self; + GstWlWindowPrivate *priv; + struct xdg_wm_base *xdg_wm_base; + struct zwp_fullscreen_shell_v1 *fullscreen_shell; + + self = gst_wl_window_new_internal (display, render_lock); + priv = gst_wl_window_get_instance_private (self); + + xdg_wm_base = gst_wl_display_get_xdg_wm_base (display); + fullscreen_shell = gst_wl_display_get_fullscreen_shell_v1 (display); + + /* Check which protocol we will use (in order of preference) */ + if (xdg_wm_base) { + gint64 timeout; + + /* First create the XDG surface */ + priv->xdg_surface = xdg_wm_base_get_xdg_surface (xdg_wm_base, + priv->area_surface); + if (!priv->xdg_surface) { + GST_ERROR ("Unable to get xdg_surface"); + goto error; + } + xdg_surface_add_listener (priv->xdg_surface, &xdg_surface_listener, self); + + /* Then the toplevel */ + priv->xdg_toplevel = xdg_surface_get_toplevel (priv->xdg_surface); + if (!priv->xdg_toplevel) { + GST_ERROR ("Unable to get xdg_toplevel"); + goto error; + } + xdg_toplevel_add_listener (priv->xdg_toplevel, + &xdg_toplevel_listener, self); + + gst_wl_window_ensure_fullscreen (self, fullscreen); + + /* Finally, commit the xdg_surface state as toplevel */ + priv->configured = FALSE; + wl_surface_commit (priv->area_surface); + wl_display_flush (gst_wl_display_get_display (display)); + + g_mutex_lock (&priv->configure_mutex); + timeout = g_get_monotonic_time () + 100 * G_TIME_SPAN_MILLISECOND; + while (!priv->configured) { + if (!g_cond_wait_until (&priv->configure_cond, &priv->configure_mutex, + timeout)) { + GST_WARNING ("The compositor did not send configure event."); + break; + } + } + g_mutex_unlock (&priv->configure_mutex); + } else if (fullscreen_shell) { + zwp_fullscreen_shell_v1_present_surface (fullscreen_shell, + priv->area_surface, ZWP_FULLSCREEN_SHELL_V1_PRESENT_METHOD_ZOOM, NULL); + } else { + GST_ERROR ("Unable to use either xdg_wm_base or zwp_fullscreen_shell."); + goto error; + } + + /* render_rectangle is already set via toplevel_configure in + * xdg_shell fullscreen mode */ + if (!(xdg_wm_base && fullscreen)) { + /* set the initial size to be the same as the reported video size */ + gint width = + gst_util_uint64_scale_int_round (info->width, info->par_n, info->par_d); + gst_wl_window_set_render_rectangle (self, 0, 0, width, info->height); + } + + return self; + +error: + g_object_unref (self); + return NULL; +} + +GstWlWindow * +gst_wl_window_new_in_surface (GstWlDisplay * display, + struct wl_surface * parent, GMutex * render_lock) +{ + GstWlWindow *self; + GstWlWindowPrivate *priv; + struct wl_region *region; + + self = gst_wl_window_new_internal (display, render_lock); + priv = gst_wl_window_get_instance_private (self); + + /* do not accept input events on the area surface when embedded */ + region = + wl_compositor_create_region (gst_wl_display_get_compositor (display)); + wl_surface_set_input_region (priv->area_surface, region); + wl_region_destroy (region); + + /* embed in parent */ + priv->area_subsurface = + wl_subcompositor_get_subsurface (gst_wl_display_get_subcompositor + (display), priv->area_surface, parent); + wl_subsurface_set_desync (priv->area_subsurface); + + wl_surface_commit (parent); + + return self; +} + +GstWlDisplay * +gst_wl_window_get_display (GstWlWindow * self) +{ + GstWlWindowPrivate *priv; + + g_return_val_if_fail (self != NULL, NULL); + + priv = gst_wl_window_get_instance_private (self); + return g_object_ref (priv->display); +} + +struct wl_surface * +gst_wl_window_get_wl_surface (GstWlWindow * self) +{ + GstWlWindowPrivate *priv; + + g_return_val_if_fail (self != NULL, NULL); + + priv = gst_wl_window_get_instance_private (self); + return priv->video_surface_wrapper; +} + +struct wl_subsurface * +gst_wl_window_get_subsurface (GstWlWindow * self) +{ + GstWlWindowPrivate *priv; + + g_return_val_if_fail (self != NULL, NULL); + + priv = gst_wl_window_get_instance_private (self); + return priv->area_subsurface; +} + +gboolean +gst_wl_window_is_toplevel (GstWlWindow * self) +{ + GstWlWindowPrivate *priv; + + g_return_val_if_fail (self != NULL, FALSE); + + priv = gst_wl_window_get_instance_private (self); + return (priv->xdg_toplevel != NULL); +} + +static void +gst_wl_window_resize_video_surface (GstWlWindow * self, gboolean commit) +{ + GstWlWindowPrivate *priv = gst_wl_window_get_instance_private (self); + GstVideoRectangle src = { 0, }; + GstVideoRectangle dst = { 0, }; + GstVideoRectangle res; + + switch (priv->buffer_transform) { + case WL_OUTPUT_TRANSFORM_NORMAL: + case WL_OUTPUT_TRANSFORM_180: + case WL_OUTPUT_TRANSFORM_FLIPPED: + case WL_OUTPUT_TRANSFORM_FLIPPED_180: + src.w = priv->video_width; + src.h = priv->video_height; + break; + case WL_OUTPUT_TRANSFORM_90: + case WL_OUTPUT_TRANSFORM_270: + case WL_OUTPUT_TRANSFORM_FLIPPED_90: + case WL_OUTPUT_TRANSFORM_FLIPPED_270: + src.w = priv->video_height; + src.h = priv->video_width; + break; + } + + dst.w = priv->render_rectangle.w; + dst.h = priv->render_rectangle.h; + + /* center the video_subsurface inside area_subsurface */ + if (priv->video_viewport) { + gst_video_center_rect (&src, &dst, &res, TRUE); + wp_viewport_set_destination (priv->video_viewport, res.w, res.h); + } else { + gst_video_center_rect (&src, &dst, &res, FALSE); + } + + wl_subsurface_set_position (priv->video_subsurface, res.x, res.y); + wl_surface_set_buffer_transform (priv->video_surface_wrapper, + priv->buffer_transform); + + if (commit) + wl_surface_commit (priv->video_surface_wrapper); + + priv->video_rectangle = res; +} + +static void +gst_wl_window_set_opaque (GstWlWindow * self, const GstVideoInfo * info) +{ + GstWlWindowPrivate *priv = gst_wl_window_get_instance_private (self); + struct wl_compositor *compositor; + struct wl_region *region; + + /* Set area opaque */ + compositor = gst_wl_display_get_compositor (priv->display); + region = wl_compositor_create_region (compositor); + wl_region_add (region, 0, 0, G_MAXINT32, G_MAXINT32); + wl_surface_set_opaque_region (priv->area_surface, region); + wl_region_destroy (region); + + if (!GST_VIDEO_INFO_HAS_ALPHA (info)) { + /* Set video opaque */ + region = wl_compositor_create_region (compositor); + wl_region_add (region, 0, 0, G_MAXINT32, G_MAXINT32); + wl_surface_set_opaque_region (priv->video_surface, region); + wl_region_destroy (region); + } +} + +void +gst_wl_window_render (GstWlWindow * self, GstWlBuffer * buffer, + const GstVideoInfo * info) +{ + GstWlWindowPrivate *priv = gst_wl_window_get_instance_private (self); + + if (G_UNLIKELY (info)) { + priv->video_width = + gst_util_uint64_scale_int_round (info->width, info->par_n, info->par_d); + priv->video_height = info->height; + + wl_subsurface_set_sync (priv->video_subsurface); + gst_wl_window_resize_video_surface (self, FALSE); + gst_wl_window_set_opaque (self, info); + } + + if (G_LIKELY (buffer)) { + gst_wl_buffer_attach (buffer, priv->video_surface_wrapper); + wl_surface_damage_buffer (priv->video_surface_wrapper, 0, 0, G_MAXINT32, + G_MAXINT32); + wl_surface_commit (priv->video_surface_wrapper); + + if (!priv->is_area_surface_mapped) { + gst_wl_window_update_borders (self); + wl_surface_commit (priv->area_surface_wrapper); + priv->is_area_surface_mapped = TRUE; + } + } else { + /* clear both video and parent surfaces */ + wl_surface_attach (priv->video_surface_wrapper, NULL, 0, 0); + wl_surface_commit (priv->video_surface_wrapper); + wl_surface_attach (priv->area_surface_wrapper, NULL, 0, 0); + wl_surface_commit (priv->area_surface_wrapper); + priv->is_area_surface_mapped = FALSE; + } + + if (G_UNLIKELY (info)) { + /* commit also the parent (area_surface) in order to change + * the position of the video_subsurface */ + wl_surface_commit (priv->area_surface_wrapper); + wl_subsurface_set_desync (priv->video_subsurface); + } + + wl_display_flush (gst_wl_display_get_display (priv->display)); +} + +/* Update the buffer used to draw black borders. When we have viewporter + * support, this is a scaled up 1x1 image, and without we need an black image + * the size of the rendering areay. */ +static void +gst_wl_window_update_borders (GstWlWindow * self) +{ + GstWlWindowPrivate *priv = gst_wl_window_get_instance_private (self); + GstVideoFormat format; + GstVideoInfo info; + gint width, height; + GstBuffer *buf; + struct wl_buffer *wlbuf; + GstWlBuffer *gwlbuf; + GstAllocator *alloc; + + if (gst_wl_display_get_viewporter (priv->display)) { + wp_viewport_set_destination (priv->area_viewport, + priv->render_rectangle.w, priv->render_rectangle.h); + + if (priv->is_area_surface_mapped) { + /* The area_surface is already visible and only needed to get resized. + * We don't need to attach a new buffer and are done here. */ + return; + } + } + + if (gst_wl_display_get_viewporter (priv->display)) { + width = height = 1; + } else { + width = priv->render_rectangle.w; + height = priv->render_rectangle.h; + } + + /* we want WL_SHM_FORMAT_XRGB8888 */ + format = GST_VIDEO_FORMAT_BGRx; + + /* draw the area_subsurface */ + gst_video_info_set_format (&info, format, width, height); + + alloc = gst_wl_shm_allocator_get (); + + buf = gst_buffer_new_allocate (alloc, info.size, NULL); + gst_buffer_memset (buf, 0, 0, info.size); + wlbuf = + gst_wl_shm_memory_construct_wl_buffer (gst_buffer_peek_memory (buf, 0), + priv->display, &info); + gwlbuf = gst_buffer_add_wl_buffer (buf, wlbuf, priv->display); + gst_wl_buffer_attach (gwlbuf, priv->area_surface_wrapper); + wl_surface_damage_buffer (priv->area_surface_wrapper, 0, 0, G_MAXINT32, + G_MAXINT32); + + /* at this point, the GstWlBuffer keeps the buffer + * alive and will free it on wl_buffer::release */ + gst_buffer_unref (buf); + g_object_unref (alloc); +} + +static void +gst_wl_window_update_geometry (GstWlWindow * self) +{ + GstWlWindowPrivate *priv = gst_wl_window_get_instance_private (self); + + /* position the area inside the parent - needs a parent commit to apply */ + if (priv->area_subsurface) { + wl_subsurface_set_position (priv->area_subsurface, priv->render_rectangle.x, + priv->render_rectangle.y); + } + + if (priv->is_area_surface_mapped) + gst_wl_window_update_borders (self); + + if (!priv->configured) + return; + + if (priv->video_width != 0) { + wl_subsurface_set_sync (priv->video_subsurface); + gst_wl_window_resize_video_surface (self, TRUE); + } + + wl_surface_commit (priv->area_surface_wrapper); + + if (priv->video_width != 0) + wl_subsurface_set_desync (priv->video_subsurface); +} + +void +gst_wl_window_set_render_rectangle (GstWlWindow * self, gint x, gint y, + gint w, gint h) +{ + GstWlWindowPrivate *priv = gst_wl_window_get_instance_private (self); + + if (priv->render_rectangle.x == x && priv->render_rectangle.y == y && + priv->render_rectangle.w == w && priv->render_rectangle.h == h) + return; + + priv->render_rectangle.x = x; + priv->render_rectangle.y = y; + priv->render_rectangle.w = w; + priv->render_rectangle.h = h; + + gst_wl_window_update_geometry (self); +} + +const GstVideoRectangle * +gst_wl_window_get_render_rectangle (GstWlWindow * self) +{ + GstWlWindowPrivate *priv = gst_wl_window_get_instance_private (self); + + return &priv->render_rectangle; +} + +static enum wl_output_transform +output_transform_from_orientation_method (GstVideoOrientationMethod method) +{ + switch (method) { + case GST_VIDEO_ORIENTATION_IDENTITY: + return WL_OUTPUT_TRANSFORM_NORMAL; + case GST_VIDEO_ORIENTATION_90R: + return WL_OUTPUT_TRANSFORM_90; + case GST_VIDEO_ORIENTATION_180: + return WL_OUTPUT_TRANSFORM_180; + case GST_VIDEO_ORIENTATION_90L: + return WL_OUTPUT_TRANSFORM_270; + case GST_VIDEO_ORIENTATION_HORIZ: + return WL_OUTPUT_TRANSFORM_FLIPPED; + case GST_VIDEO_ORIENTATION_VERT: + return WL_OUTPUT_TRANSFORM_FLIPPED_180; + case GST_VIDEO_ORIENTATION_UL_LR: + return WL_OUTPUT_TRANSFORM_FLIPPED_90; + case GST_VIDEO_ORIENTATION_UR_LL: + return WL_OUTPUT_TRANSFORM_FLIPPED_270; + default: + g_assert_not_reached (); + } +} + +void +gst_wl_window_set_rotate_method (GstWlWindow * self, + GstVideoOrientationMethod method) +{ + GstWlWindowPrivate *priv = gst_wl_window_get_instance_private (self); + + priv->buffer_transform = output_transform_from_orientation_method (method); + + gst_wl_window_update_geometry (self); +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/gstwlwindow.h
Added
@@ -0,0 +1,75 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2014 Collabora Ltd. + * + * 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., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + */ + +#pragma once + +#include <gst/wayland/wayland.h> +#include <gst/video/video.h> + +G_BEGIN_DECLS + +#define GST_TYPE_WL_WINDOW (gst_wl_window_get_type ()) +G_DECLARE_FINAL_TYPE (GstWlWindow, gst_wl_window, GST, WL_WINDOW, GObject); + +struct _GstWlWindow +{ + GObject parent_instance; +}; + +GST_WL_API +void gst_wl_window_ensure_fullscreen (GstWlWindow * self, + gboolean fullscreen); + +GST_WL_API +GstWlWindow *gst_wl_window_new_toplevel (GstWlDisplay * display, + const GstVideoInfo * info, gboolean fullscreen, GMutex * render_lock); + +GST_WL_API +GstWlWindow *gst_wl_window_new_in_surface (GstWlDisplay * display, + struct wl_surface * parent, GMutex * render_lock); + +GST_WL_API +GstWlDisplay *gst_wl_window_get_display (GstWlWindow * self); + +GST_WL_API +struct wl_surface *gst_wl_window_get_wl_surface (GstWlWindow * self); + +GST_WL_API +struct wl_subsurface *gst_wl_window_get_subsurface (GstWlWindow * self); + +GST_WL_API +gboolean gst_wl_window_is_toplevel (GstWlWindow * self); + +GST_WL_API +void gst_wl_window_render (GstWlWindow * self, GstWlBuffer * buffer, + const GstVideoInfo * info); + +GST_WL_API +void gst_wl_window_set_render_rectangle (GstWlWindow * self, gint x, gint y, + gint w, gint h); + +GST_WL_API +const GstVideoRectangle *gst_wl_window_get_render_rectangle (GstWlWindow * self); + +GST_WL_API +void gst_wl_window_set_rotate_method (GstWlWindow *self, + GstVideoOrientationMethod rotate_method); + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/wayland/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/meson.build
Changed
@@ -7,19 +7,78 @@ use_wayland = wl_protocol_dep.found() and wl_client_dep.found() and wl_scanner.found() and libdrm_dep.found() if use_wayland + wl_sources = + 'gstwlbuffer.c', + 'gstwlcontext.c', + 'gstwldisplay.c', + 'gstwllinuxdmabuf.c', + 'gstwlshmallocator.c', + 'gstwlvideobufferpool.c', + 'gstwlvideoformat.c', + 'gstwlwindow.c', + + + wl_headers = + 'gstwl_fwd.h', + 'gstwlbuffer.h', + 'gstwlcontext.h', + 'gstwldisplay.h', + 'gstwllinuxdmabuf.h', + 'gstwlshmallocator.h', + 'gstwlvideobufferpool.h', + 'gstwlvideoformat.h', + 'gstwlwindow.h', + 'wayland.h', + 'wayland-prelude.h', + + + protocols_datadir = wl_protocol_dep.get_variable('pkgdatadir') + + protocol_defs = + '/stable/viewporter/viewporter.xml', 'viewporter-protocol.c', 'viewporter-client-protocol.h', + '/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml', + 'linux-dmabuf-unstable-v1-protocol.c', 'linux-dmabuf-unstable-v1-client-protocol.h', + '/unstable/fullscreen-shell/fullscreen-shell-unstable-v1.xml', + 'fullscreen-shell-unstable-v1-protocol.c', 'fullscreen-shell-unstable-v1-client-protocol.h', + '/stable/xdg-shell/xdg-shell.xml', 'xdg-shell-protocol.c', 'xdg-shell-client-protocol.h', + + protocols_files = + + foreach protodef: protocol_defs + xmlfile = protocols_datadir + protodef.get(0) + + protocols_files += custom_target(protodef.get(1), + output : protodef.get(1), + input : xmlfile, + command : wl_scanner, 'code', '@INPUT@', '@OUTPUT@') + + protocols_files += custom_target(protodef.get(2), + output : protodef.get(2), + input : xmlfile, + command : wl_scanner, 'client-header', '@INPUT@', '@OUTPUT@') + endforeach + + extra_c_args = + '-DGST_USE_UNSTABLE_API', + '-DBUILDING_GST_WL', + '-DG_LOG_DOMAIN="GStreamer-Wayland"', + '-D_GNU_SOURCE' + + gstwayland = library('gstwayland-' + api_version, - 'wayland.c', - c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', '-DBUILDING_GST_WAYLAND', '-DG_LOG_DOMAIN="GStreamer-Wayland"', + wl_sources + protocols_files, + c_args : gst_plugins_bad_args + extra_c_args, include_directories : configinc, libsinc, version : libversion, soversion : soversion, darwin_versions : osxversion, install : true, - dependencies : gst_dep, gstvideo_dep, wl_client_dep + dependencies : gst_dep, gstallocators_dep, gstvideo_dep, libdrm_dep, + wl_client_dep, wl_protocol_dep ) pkg_name = 'gstreamer-wayland-1.0' - libraries += pkg_name, {'lib': gstwayland} + gst_libraries += pkg_name, {'lib': gstwayland} pkgconfig.generate(gstwayland, libraries : gst_dep, gstvideo_dep, variables : pkgconfig_variables, @@ -30,8 +89,9 @@ gstwayland_dep = declare_dependency(link_with : gstwayland, include_directories : libsinc, - dependencies : gst_dep, gstvideo_dep) + dependencies : gst_dep, gstallocators_dep, gstvideo_dep, libdrm_dep, + wl_client_dep, wl_protocol_dep) - install_headers('wayland.h', subdir: 'gstreamer-1.0/gst/wayland') + install_headers(wl_headers, subdir: 'gstreamer-1.0/gst/wayland') meson.override_dependency(pkg_name, gstwayland_dep) endif
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/wayland-prelude.h
Added
@@ -0,0 +1,29 @@ +/* GStreamer Wayland Library + * + * Copyright (C) 2022 Collabora Ltd. + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> + +#ifdef BUILDING_GST_WL +# define GST_WL_API GST_API_EXPORT /* from config.h */ +#else +# define GST_WL_API GST_API_IMPORT +#endif
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/wayland/wayland.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/wayland/wayland.h
Changed
@@ -18,85 +18,22 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __GST_WAYLAND_H__ -#define __GST_WAYLAND_H__ +#pragma once #ifndef GST_USE_UNSTABLE_API #warning "The GStreamer wayland library is unstable API and may change in future." #warning "You can define GST_USE_UNSTABLE_API to avoid this warning." #endif -#include <gst/gst.h> #include <wayland-client.h> -#ifndef GST_WAYLAND_API -# ifdef BUILDING_GST_WAYLAND -# define GST_WAYLAND_API GST_API_EXPORT /* from config.h */ -# else -# define GST_WAYLAND_API GST_API_IMPORT -# endif -#endif - -G_BEGIN_DECLS - -/* The type of GstContext used to pass the wl_display pointer - * from the application to the sink */ -#define GST_WAYLAND_DISPLAY_HANDLE_CONTEXT_TYPE "GstWaylandDisplayHandleContextType" - -GST_WAYLAND_API -gboolean gst_is_wayland_display_handle_need_context_message (GstMessage * msg); - -GST_WAYLAND_API -GstContext * -gst_wayland_display_handle_context_new (struct wl_display * display); - -GST_WAYLAND_API -struct wl_display * -gst_wayland_display_handle_context_get_handle (GstContext * context); - - -#define GST_TYPE_WAYLAND_VIDEO \ - (gst_wayland_video_get_type ()) -#define GST_WAYLAND_VIDEO(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WAYLAND_VIDEO, GstWaylandVideo)) -#define GST_IS_WAYLAND_VIDEO(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WAYLAND_VIDEO)) -#define GST_WAYLAND_VIDEO_GET_INTERFACE(inst) \ - (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_WAYLAND_VIDEO, GstWaylandVideoInterface)) - -/** - * GstWaylandVideo: - * - * Opaque #GstWaylandVideo interface structure - */ -typedef struct _GstWaylandVideo GstWaylandVideo; -typedef struct _GstWaylandVideoInterface GstWaylandVideoInterface; - - -/** - * GstWaylandVideoInterface: - * @iface: parent interface type. - * - * #GstWaylandVideo interface - */ -struct _GstWaylandVideoInterface { - GTypeInterface iface; - - /* virtual functions */ - void (*begin_geometry_change) (GstWaylandVideo *video); - void (*end_geometry_change) (GstWaylandVideo *video); -}; - -GST_WAYLAND_API -GType gst_wayland_video_get_type (void); - -/* virtual function wrappers */ -GST_WAYLAND_API -void gst_wayland_video_begin_geometry_change (GstWaylandVideo * video); - -GST_WAYLAND_API -void gst_wayland_video_end_geometry_change (GstWaylandVideo * video); - -G_END_DECLS - -#endif /* __GST_WAYLAND_H__ */ +#include <gst/wayland/wayland-prelude.h> +#include <gst/wayland/gstwl_fwd.h> +#include <gst/wayland/gstwlbuffer.h> +#include <gst/wayland/gstwlcontext.h> +#include <gst/wayland/gstwldisplay.h> +#include <gst/wayland/gstwllinuxdmabuf.h> +#include <gst/wayland/gstwlshmallocator.h> +#include <gst/wayland/gstwlvideobufferpool.h> +#include <gst/wayland/gstwlvideoformat.h> +#include <gst/wayland/gstwlwindow.h>
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/webrtc/datachannel.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/datachannel.c
Changed
@@ -22,6 +22,8 @@ * SECTION:gstwebrtc-datachannel * @short_description: RTCDataChannel object * @title: GstWebRTCDataChannel + * @symbols: + * - GstWebRTCDataChannel * * <https://www.w3.org/TR/webrtc/#rtcdatachannel> * @@ -179,6 +181,8 @@ g_free (channel->protocol); channel->protocol = NULL; + g_mutex_clear (&channel->lock); + G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -259,7 +263,7 @@ "Ready State", "The Ready state of this data channel", GST_TYPE_WEBRTC_DATA_CHANNEL_STATE, - GST_WEBRTC_DATA_CHANNEL_STATE_NEW, + GST_WEBRTC_DATA_CHANNEL_STATE_CONNECTING, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, @@ -335,7 +339,7 @@ */ gst_webrtc_data_channel_signalsSIGNAL_SEND_DATA = g_signal_new_class_handler ("send-data", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION | G_SIGNAL_DEPRECATED, G_CALLBACK (gst_webrtc_data_channel_send_data), NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_BYTES); @@ -520,7 +524,31 @@ g_return_if_fail (GST_IS_WEBRTC_DATA_CHANNEL (channel)); klass = GST_WEBRTC_DATA_CHANNEL_GET_CLASS (channel); - klass->send_data (channel, data); + (void) klass->send_data (channel, data, NULL); +} + +/** + * gst_webrtc_data_channel_send_data_full: + * @channel: a #GstWebRTCDataChannel + * @data: (nullable): a #GBytes or %NULL + * @error: (nullable): location to a #GError or %NULL + * + * Send @data as a data message over @channel. + * + * Returns: TRUE if @channel is open and data could be queued + * + * Since: 1.22 + */ +gboolean +gst_webrtc_data_channel_send_data_full (GstWebRTCDataChannel * channel, + GBytes * data, GError ** error) +{ + GstWebRTCDataChannelClass *klass; + + g_return_val_if_fail (GST_IS_WEBRTC_DATA_CHANNEL (channel), FALSE); + + klass = GST_WEBRTC_DATA_CHANNEL_GET_CLASS (channel); + return klass->send_data (channel, data, error); } /** @@ -539,7 +567,30 @@ g_return_if_fail (GST_IS_WEBRTC_DATA_CHANNEL (channel)); klass = GST_WEBRTC_DATA_CHANNEL_GET_CLASS (channel); - klass->send_string (channel, str); + (void) klass->send_string (channel, str, NULL); +} + +/** + * gst_webrtc_data_channel_send_string_full: + * @channel: a #GstWebRTCDataChannel + * @str: (nullable): a string or %NULL + * + * Send @str as a string message over @channel. + * + * Returns: TRUE if @channel is open and data could be queued + * + * Since: 1.22 + */ +gboolean +gst_webrtc_data_channel_send_string_full (GstWebRTCDataChannel * channel, + const gchar * str, GError ** error) +{ + GstWebRTCDataChannelClass *klass; + + g_return_val_if_fail (GST_IS_WEBRTC_DATA_CHANNEL (channel), FALSE); + + klass = GST_WEBRTC_DATA_CHANNEL_GET_CLASS (channel); + return klass->send_string (channel, str, error); } /**
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/webrtc/datachannel.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/datachannel.h
Changed
@@ -37,14 +37,22 @@ #define GST_WEBRTC_DATA_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_DATA_CHANNEL,GstWebRTCDataChannelClass)) GST_WEBRTC_API -void gst_webrtc_data_channel_send_data (GstWebRTCDataChannel * channel, GBytes * data); +gboolean gst_webrtc_data_channel_send_data_full (GstWebRTCDataChannel * channel, GBytes * data, GError ** error); GST_WEBRTC_API -void gst_webrtc_data_channel_send_string (GstWebRTCDataChannel * channel, const gchar * str); +gboolean gst_webrtc_data_channel_send_string_full (GstWebRTCDataChannel * channel, const gchar * str, GError ** error); GST_WEBRTC_API void gst_webrtc_data_channel_close (GstWebRTCDataChannel * channel); +#ifndef GST_REMOVE_DEPRECATED +GST_WEBRTC_DEPRECATED_FOR(gst_webrtc_data_channel_send_data_full) +void gst_webrtc_data_channel_send_data (GstWebRTCDataChannel * channel, GBytes * data); + +GST_WEBRTC_DEPRECATED_FOR(gst_webrtc_data_channel_send_string_full) +void gst_webrtc_data_channel_send_string (GstWebRTCDataChannel * channel, const gchar * str); +#endif + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstWebRTCDataChannel, g_object_unref) G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/webrtc/dtlstransport.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/dtlstransport.c
Changed
@@ -22,6 +22,8 @@ * @short_description: RTCDtlsTransport object * @title: GstWebRTCDTLSTransport * @see_also: #GstWebRTCRTPSender, #GstWebRTCRTPReceiver, #GstWebRTCICETransport + * @symbols: + * - GstWebRTCDTLSTransport * * <https://www.w3.org/TR/webrtc/#rtcdtlstransport> */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/ice.c
Added
@@ -0,0 +1,622 @@ +/* GStreamer + * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +/** + * SECTION:gstwebrtcice + * @title: GstWebRTCICE + * @short_description: Base class WebRTC ICE handling + * @symbols: + * - GstWebRTCICE + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "ice.h" +#include "icestream.h" + +#include "webrtc-priv.h" + +#define GST_CAT_DEFAULT gst_webrtc_ice_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +enum +{ + SIGNAL_0, + ADD_LOCAL_IP_ADDRESS_SIGNAL, + LAST_SIGNAL, +}; + +enum +{ + PROP_0, + PROP_MIN_RTP_PORT, + PROP_MAX_RTP_PORT, +}; + +static guint gst_webrtc_ice_signalsLAST_SIGNAL = { 0 }; + +#define gst_webrtc_ice_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstWebRTCICE, gst_webrtc_ice, + GST_TYPE_OBJECT, GST_DEBUG_CATEGORY_INIT (gst_webrtc_ice_debug, + "webrtcice", 0, "webrtcice");); + +/** + * gst_webrtc_ice_add_stream: + * @ice: The #GstWebRTCICE + * @session_id: The session id + * + * Returns: (transfer full) (nullable): The #GstWebRTCICEStream, or %NULL + * + * Since: 1.22 + */ +GstWebRTCICEStream * +gst_webrtc_ice_add_stream (GstWebRTCICE * ice, guint session_id) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE (ice), NULL); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->add_stream); + + return GST_WEBRTC_ICE_GET_CLASS (ice)->add_stream (ice, session_id); +} + +/** + * gst_webrtc_ice_find_transport: + * @ice: The #GstWebRTCICE + * @stream: The #GstWebRTCICEStream + * @component: The #GstWebRTCICEComponent + * + * Returns: (transfer full) (nullable): The #GstWebRTCICETransport, or %NULL + * + * Since: 1.22 + */ +GstWebRTCICETransport * +gst_webrtc_ice_find_transport (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, GstWebRTCICEComponent component) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE (ice), NULL); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->find_transport); + + return GST_WEBRTC_ICE_GET_CLASS (ice)->find_transport (ice, stream, + component); +} + +/** + * gst_webrtc_ice_add_candidate: + * @ice: The #GstWebRTCICE + * @stream: The #GstWebRTCICEStream + * @candidate: The ICE candidate + * + * Since: 1.22 + */ +void +gst_webrtc_ice_add_candidate (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, const gchar * candidate) +{ + g_return_if_fail (GST_IS_WEBRTC_ICE (ice)); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->add_candidate); + + GST_WEBRTC_ICE_GET_CLASS (ice)->add_candidate (ice, stream, candidate); +} + +/** + * gst_webrtc_ice_set_remote_credentials: + * @ice: The #GstWebRTCICE + * @stream: The #GstWebRTCICEStream + * @ufrag: ICE username + * @pwd: ICE password + * + * Returns: FALSE on error, TRUE otherwise + * + * Since: 1.22 + */ +gboolean +gst_webrtc_ice_set_remote_credentials (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, const gchar * ufrag, const gchar * pwd) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE (ice), FALSE); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->set_remote_credentials); + + return GST_WEBRTC_ICE_GET_CLASS (ice)->set_remote_credentials (ice, stream, + ufrag, pwd); +} + +/** + * gst_webrtc_ice_add_turn_server: + * @ice: The #GstWebRTCICE + * @uri: URI of the TURN server + * + * Returns: FALSE on error, TRUE otherwise + * + * Since: 1.22 + */ +gboolean +gst_webrtc_ice_add_turn_server (GstWebRTCICE * ice, const gchar * uri) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE (ice), FALSE); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->add_turn_server); + + return GST_WEBRTC_ICE_GET_CLASS (ice)->add_turn_server (ice, uri); +} + +/** + * gst_webrtc_ice_set_local_credentials: + * @ice: The #GstWebRTCICE + * @stream: The #GstWebRTCICEStream + * @ufrag: ICE username + * @pwd: ICE password + * + * Returns: FALSE on error, TRUE otherwise + * + * Since: 1.22 + */ +gboolean +gst_webrtc_ice_set_local_credentials (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, const gchar * ufrag, const gchar * pwd) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE (ice), FALSE); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->set_local_credentials); + + return GST_WEBRTC_ICE_GET_CLASS (ice)->set_local_credentials (ice, stream, + ufrag, pwd); +} + +/** + * gst_webrtc_ice_gather_candidates: + * @ice: The #GstWebRTCICE + * @stream: The #GstWebRTCICEStream + * Returns: FALSE on error, TRUE otherwise + * + * Since: 1.22 + */ +gboolean +gst_webrtc_ice_gather_candidates (GstWebRTCICE * ice, + GstWebRTCICEStream * stream) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE (ice), FALSE); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->gather_candidates); + + return GST_WEBRTC_ICE_GET_CLASS (ice)->gather_candidates (ice, stream); +} + +/** + * gst_webrtc_ice_set_is_controller: + * @ice: The #GstWebRTCICE + * @controller: TRUE to set as controller + * + * Since: 1.22 + */ +void +gst_webrtc_ice_set_is_controller (GstWebRTCICE * ice, gboolean controller) +{ + g_return_if_fail (GST_IS_WEBRTC_ICE (ice)); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->set_is_controller); + + GST_WEBRTC_ICE_GET_CLASS (ice)->set_is_controller (ice, controller); +} + +/** + * gst_webrtc_ice_get_is_controller: + * @ice: The #GstWebRTCICE + * Returns: TRUE if set as controller, FALSE otherwise + * + * Since: 1.22 + */ +gboolean +gst_webrtc_ice_get_is_controller (GstWebRTCICE * ice) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE (ice), FALSE); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->get_is_controller); + + return GST_WEBRTC_ICE_GET_CLASS (ice)->get_is_controller (ice); +} + +/** + * gst_webrtc_ice_set_force_relay: + * @ice: The #GstWebRTCICE + * @force_relay: TRUE to enable force relay + * + * Since: 1.22 + */ +void +gst_webrtc_ice_set_force_relay (GstWebRTCICE * ice, gboolean force_relay) +{ + g_return_if_fail (GST_IS_WEBRTC_ICE (ice)); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->set_force_relay); + + GST_WEBRTC_ICE_GET_CLASS (ice)->set_force_relay (ice, force_relay); +} + +/** + * gst_webrtc_ice_set_tos: + * @ice: The #GstWebRTCICE + * @stream: The #GstWebRTCICEStream + * @tos: ToS to be set + * + * Since: 1.22 + */ +void +gst_webrtc_ice_set_tos (GstWebRTCICE * ice, GstWebRTCICEStream * stream, + guint tos) +{ + g_return_if_fail (GST_IS_WEBRTC_ICE (ice)); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->set_tos); + + GST_WEBRTC_ICE_GET_CLASS (ice)->set_tos (ice, stream, tos); +} + + +/** + * gst_webrtc_ice_get_local_candidates: + * @ice: The #GstWebRTCICE + * @stream: The #GstWebRTCICEStream + * Returns: (transfer full)(array zero-terminated=1): List of local candidates + * + * Since: 1.22 + */ +GstWebRTCICECandidateStats ** +gst_webrtc_ice_get_local_candidates (GstWebRTCICE * ice, + GstWebRTCICEStream * stream) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE (ice), NULL); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->get_local_candidates); + + return GST_WEBRTC_ICE_GET_CLASS (ice)->get_local_candidates (ice, stream); +} + + +/** + * gst_webrtc_ice_get_remote_candidates: + * @ice: The #GstWebRTCICE + * @stream: The #GstWebRTCICEStream + * Returns: (transfer full) (array zero-terminated=1): List of remote candidates + * + * Since: 1.22 + */ +GstWebRTCICECandidateStats ** +gst_webrtc_ice_get_remote_candidates (GstWebRTCICE * ice, + GstWebRTCICEStream * stream) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE (ice), NULL); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->get_remote_candidates); + + return GST_WEBRTC_ICE_GET_CLASS (ice)->get_remote_candidates (ice, stream); +} + +/** + * gst_webrtc_ice_get_selected_pair: + * @ice: The #GstWebRTCICE + * @stream: The #GstWebRTCICEStream + * @local_stats: (out) (transfer full): A pointer to #GstWebRTCICECandidateStats for local candidate + * @remote_stats: (out) (transfer full): pointer to #GstWebRTCICECandidateStats for remote candidate + * + * Returns: FALSE on failure, otherwise @local_stats @remote_stats will be set + * + * Since: 1.22 + */ +gboolean +gst_webrtc_ice_get_selected_pair (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, GstWebRTCICECandidateStats ** local_stats, + GstWebRTCICECandidateStats ** remote_stats) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE (ice), FALSE); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->get_selected_pair); + + return GST_WEBRTC_ICE_GET_CLASS (ice)->get_selected_pair (ice, stream, + local_stats, remote_stats); +} + +/** + * gst_webrtc_ice_candidate_stats_free: + * @stats: The #GstWebRTCICECandidateStats to be free'd + * + * Helper function to free #GstWebRTCICECandidateStats + * + * Since: 1.22 + */ +void +gst_webrtc_ice_candidate_stats_free (GstWebRTCICECandidateStats * stats) +{ + if (stats) { + g_free (stats->ipaddr); + g_free (stats->url); + } + + g_free (stats); +} + +/** + * gst_webrtc_ice_candidate_stats_copy: + * @stats: The #GstWebRTCICE + * + * Returns: (transfer full): A copy of @stats + * + * Since: 1.22 + */ +GstWebRTCICECandidateStats * +gst_webrtc_ice_candidate_stats_copy (GstWebRTCICECandidateStats * stats) +{ + GstWebRTCICECandidateStats *copy = + g_malloc (sizeof (GstWebRTCICECandidateStats)); + + *copy = *stats; + + copy->ipaddr = g_strdup (stats->ipaddr); + copy->url = g_strdup (stats->url); + + return copy; +} + +G_DEFINE_BOXED_TYPE (GstWebRTCICECandidateStats, gst_webrtc_ice_candidate_stats, + (GBoxedCopyFunc) gst_webrtc_ice_candidate_stats_copy, + (GBoxedFreeFunc) gst_webrtc_ice_candidate_stats_free); + +/** + * gst_webrtc_ice_set_on_ice_candidate: + * @ice: The #GstWebRTCICE + * @func: The #GstWebRTCICEOnCandidateFunc callback function + * @user_data: User data passed to the callback function + * @notify: a #GDestroyNotify when the candidate is no longer needed + * + * Since: 1.22 + */ +void +gst_webrtc_ice_set_on_ice_candidate (GstWebRTCICE * ice, + GstWebRTCICEOnCandidateFunc func, gpointer user_data, GDestroyNotify notify) +{ + g_return_if_fail (GST_IS_WEBRTC_ICE (ice)); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->set_on_ice_candidate); + + GST_WEBRTC_ICE_GET_CLASS (ice)->set_on_ice_candidate (ice, func, user_data, + notify); +} + +/** + * gst_webrtc_ice_set_stun_server: + * @ice: The #GstWebRTCICE + * @uri: (nullable): URI of the STUN server + * + * Since: 1.22 + */ +void +gst_webrtc_ice_set_stun_server (GstWebRTCICE * ice, const gchar * uri_s) +{ + g_return_if_fail (GST_IS_WEBRTC_ICE (ice)); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->set_stun_server); + + GST_WEBRTC_ICE_GET_CLASS (ice)->set_stun_server (ice, uri_s); +} + +/** + * gst_webrtc_ice_get_stun_server: + * @ice: The #GstWebRTCICE + * + * Returns: (nullable): URI of the STUN sever + * + * Since: 1.22 + */ +gchar * +gst_webrtc_ice_get_stun_server (GstWebRTCICE * ice) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE (ice), NULL); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->get_stun_server); + + return GST_WEBRTC_ICE_GET_CLASS (ice)->get_stun_server (ice); +} + +/** + * gst_webrtc_ice_set_turn_server: + * @ice: The #GstWebRTCICE + * @uri: (nullable): URI of the TURN sever + * + * Since: 1.22 + */ +void +gst_webrtc_ice_set_turn_server (GstWebRTCICE * ice, const gchar * uri_s) +{ + g_return_if_fail (GST_IS_WEBRTC_ICE (ice)); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->set_turn_server); + + GST_WEBRTC_ICE_GET_CLASS (ice)->set_turn_server (ice, uri_s); +} + +/** + * gst_webrtc_ice_get_turn_server: + * @ice: The #GstWebRTCICE + * + * Returns: (nullable): URI of the TURN sever + * + * Since: 1.22 + */ +gchar * +gst_webrtc_ice_get_turn_server (GstWebRTCICE * ice) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE (ice), NULL); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->get_turn_server); + + return GST_WEBRTC_ICE_GET_CLASS (ice)->get_turn_server (ice); +} + +/** + * gst_webrtc_ice_set_http_proxy: + * @ice: The #GstWebRTCICE + * @uri: (transfer none): URI of the HTTP proxy of the form + * http://username:password@hostname:port + * + * Set HTTP Proxy to be used when connecting to TURN server. + * + * Since: 1.22 + */ +void +gst_webrtc_ice_set_http_proxy (GstWebRTCICE * ice, const gchar * uri_s) +{ + g_return_if_fail (GST_IS_WEBRTC_ICE (ice)); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->set_http_proxy); + + GST_WEBRTC_ICE_GET_CLASS (ice)->set_http_proxy (ice, uri_s); +} + +/** + * gst_webrtc_ice_get_http_proxy: + * @ice: The #GstWebRTCICE + * + * Returns: (transfer full): URI of the HTTP proxy of the form + * http://username:password@hostname:port + * + * Get HTTP Proxy to be used when connecting to TURN server. + * + * Since: 1.22 + */ +gchar * +gst_webrtc_ice_get_http_proxy (GstWebRTCICE * ice) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE (ice), NULL); + g_assert (GST_WEBRTC_ICE_GET_CLASS (ice)->get_http_proxy); + + return GST_WEBRTC_ICE_GET_CLASS (ice)->get_http_proxy (ice); +} + + +static void +gst_webrtc_ice_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstWebRTCICE *ice = GST_WEBRTC_ICE (object); + + switch (prop_id) { + case PROP_MIN_RTP_PORT: + ice->min_rtp_port = g_value_get_uint (value); + if (ice->min_rtp_port > ice->max_rtp_port) + g_warning ("Set min-rtp-port to %u which is larger than" + " max-rtp-port %u", ice->min_rtp_port, ice->max_rtp_port); + break; + case PROP_MAX_RTP_PORT: + ice->max_rtp_port = g_value_get_uint (value); + if (ice->min_rtp_port > ice->max_rtp_port) + g_warning ("Set max-rtp-port to %u which is smaller than" + " min-rtp-port %u", ice->max_rtp_port, ice->min_rtp_port); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_webrtc_ice_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstWebRTCICE *ice = GST_WEBRTC_ICE (object); + + switch (prop_id) { + case PROP_MIN_RTP_PORT: + g_value_set_uint (value, ice->min_rtp_port); + break; + case PROP_MAX_RTP_PORT: + g_value_set_uint (value, ice->max_rtp_port); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_webrtc_ice_class_init (GstWebRTCICEClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + klass->add_stream = NULL; + klass->find_transport = NULL; + klass->gather_candidates = NULL; + klass->add_candidate = NULL; + klass->set_local_credentials = NULL; + klass->set_remote_credentials = NULL; + klass->add_turn_server = NULL; + klass->set_is_controller = NULL; + klass->get_is_controller = NULL; + klass->set_force_relay = NULL; + klass->set_stun_server = NULL; + klass->get_stun_server = NULL; + klass->set_turn_server = NULL; + klass->get_turn_server = NULL; + klass->get_http_proxy = NULL; + klass->set_http_proxy = NULL; + klass->set_tos = NULL; + klass->set_on_ice_candidate = NULL; + klass->get_local_candidates = NULL; + klass->get_remote_candidates = NULL; + klass->get_selected_pair = NULL; + + gobject_class->get_property = gst_webrtc_ice_get_property; + gobject_class->set_property = gst_webrtc_ice_set_property; + + /** + * GstWebRTCICE:min-rtp-port: + * + * Minimum port for local rtp port range. + * min-rtp-port must be <= max-rtp-port + * + * Since: 1.20 + */ + g_object_class_install_property (gobject_class, + PROP_MIN_RTP_PORT, + g_param_spec_uint ("min-rtp-port", "ICE RTP candidate min port", + "Minimum port for local rtp port range. " + "min-rtp-port must be <= max-rtp-port", + 0, 65535, 0, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + /** + * GstWebRTCICE:max-rtp-port: + * + * Maximum port for local rtp port range. + * min-rtp-port must be <= max-rtp-port + * + * Since: 1.20 + */ + g_object_class_install_property (gobject_class, + PROP_MAX_RTP_PORT, + g_param_spec_uint ("max-rtp-port", "ICE RTP candidate max port", + "Maximum port for local rtp port range. " + "max-rtp-port must be >= min-rtp-port", + 0, 65535, 65535, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + /** + * GstWebRTCICE::add-local-ip-address: + * @object: the #GstWebRTCICE + * @address: The local IP address + * + * Add a local IP address to use for ICE candidate gathering. If none + * are supplied, they will be discovered automatically. Calling this signal + * stops automatic ICE gathering. + * + * Returns: whether the address could be added. + */ + gst_webrtc_ice_signalsADD_LOCAL_IP_ADDRESS_SIGNAL = + g_signal_new_class_handler ("add-local-ip-address", + G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + NULL, NULL, NULL, + g_cclosure_marshal_generic, G_TYPE_BOOLEAN, 1, G_TYPE_STRING); +} + +static void +gst_webrtc_ice_init (GstWebRTCICE * ice) +{ +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/ice.h
Added
@@ -0,0 +1,261 @@ +/* GStreamer + * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_WEBRTC_ICE_H__ +#define __GST_WEBRTC_ICE_H__ + +#include <gst/webrtc/webrtc_fwd.h> + +G_BEGIN_DECLS + +GST_WEBRTC_API +GType gst_webrtc_ice_get_type(void); +#define GST_TYPE_WEBRTC_ICE (gst_webrtc_ice_get_type()) +#define GST_WEBRTC_ICE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WEBRTC_ICE,GstWebRTCICE)) +#define GST_IS_WEBRTC_ICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WEBRTC_ICE)) +#define GST_WEBRTC_ICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_WEBRTC_ICE,GstWebRTCICEClass)) +#define GST_IS_WEBRTC_ICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_WEBRTC_ICE)) +#define GST_WEBRTC_ICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_ICE,GstWebRTCICEClass)) + +struct _GstWebRTCICE +{ + GstObject parent; + + GstWebRTCICEGatheringState ice_gathering_state; + GstWebRTCICEConnectionState ice_connection_state; + + /*< protected >*/ + guint min_rtp_port; + guint max_rtp_port; + + gpointer _gst_reservedGST_PADDING; +}; + +struct _GstWebRTCICECandidateStats +{ + gchar *ipaddr; + guint port; + guint stream_id; + const gchar *type; + const gchar *proto; + const gchar *relay_proto; + guint prio; + gchar *url; + + gpointer _gst_reservedGST_PADDING_LARGE; +}; + +/** + * GstWebRTCICEOnCandidateFunc: + * @ice: The #GstWebRTCICE + * @stream_id: The stream id + * @candidate: The discovered candidate + * @user_data: User data that was set by #gst_webrtc_ice_set_on_ice_candidate + * + * Callback function to be triggered on discovery of a new candidate + * Since: 1.22 + */ +typedef void (*GstWebRTCICEOnCandidateFunc) (GstWebRTCICE * ice, guint stream_id, const gchar * candidate, gpointer user_data); + +struct _GstWebRTCICEClass { + GstObjectClass parent_class; + GstWebRTCICEStream * (*add_stream) (GstWebRTCICE * ice, + guint session_id); + GstWebRTCICETransport * (*find_transport) (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, + GstWebRTCICEComponent component); + gboolean (*gather_candidates) (GstWebRTCICE * ice, + GstWebRTCICEStream * stream); + void (*add_candidate) (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, + const gchar * candidate); + gboolean (*set_local_credentials) (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, + const gchar * ufrag, + const gchar * pwd); + gboolean (*set_remote_credentials) (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, + const gchar * ufrag, + const gchar * pwd); + gboolean (*add_turn_server) (GstWebRTCICE * ice, + const gchar * uri); + void (*set_is_controller) (GstWebRTCICE * ice, + gboolean controller); + gboolean (*get_is_controller) (GstWebRTCICE * ice); + void (*set_force_relay) (GstWebRTCICE * ice, + gboolean force_relay); + void (*set_stun_server) (GstWebRTCICE * ice, + const gchar * uri); + gchar * (*get_stun_server) (GstWebRTCICE * ice); + void (*set_turn_server) (GstWebRTCICE * ice, + const gchar * uri); + gchar * (*get_turn_server) (GstWebRTCICE * ice); + + /** + * GstWebRTCICEClass::set_http_proxy: + * @ice: a #GstWebRTCICE + * @uri: (transfer none): URI of the HTTP proxy of the form + * http://username:password@hostname:port + * + * Set HTTP Proxy to be used when connecting to TURN server. + * + * Since: 1.22 + */ + void (*set_http_proxy) (GstWebRTCICE * ice, + const gchar * uri); + + /** + * GstWebRTCICEClass::get_http_proxy: + * @ice: a #GstWebRTCICE + * + * Get HTTP Proxy to be used when connecting to TURN server. + * + * Returns: (transfer full): URI of the HTTP proxy of the form + * http://username:password@hostname:port + * + * Since: 1.22 + */ + gchar * (*get_http_proxy) (GstWebRTCICE * ice); + + void (*set_tos) (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, + guint tos); + void (*set_on_ice_candidate) (GstWebRTCICE * ice, + GstWebRTCICEOnCandidateFunc func, + gpointer user_data, + GDestroyNotify notify); + GstWebRTCICECandidateStats** (*get_local_candidates)(GstWebRTCICE * ice, + GstWebRTCICEStream * stream); + GstWebRTCICECandidateStats**(*get_remote_candidates)(GstWebRTCICE * ice, + GstWebRTCICEStream * stream); + gboolean (*get_selected_pair) (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, + GstWebRTCICECandidateStats ** local_stats, + GstWebRTCICECandidateStats ** remote_stats); + gpointer _gst_reservedGST_PADDING; +}; + +GST_WEBRTC_API +GstWebRTCICEStream * gst_webrtc_ice_add_stream (GstWebRTCICE * ice, + guint session_id); + +GST_WEBRTC_API +GstWebRTCICETransport * gst_webrtc_ice_find_transport (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, + GstWebRTCICEComponent component); + + +GST_WEBRTC_API +gboolean gst_webrtc_ice_gather_candidates (GstWebRTCICE * ice, + GstWebRTCICEStream * stream); + +/* FIXME: GstStructure-ize the candidate */ +GST_WEBRTC_API +void gst_webrtc_ice_add_candidate (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, + const gchar * candidate); + +GST_WEBRTC_API +gboolean gst_webrtc_ice_set_local_credentials (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, + const gchar * ufrag, + const gchar * pwd); + +GST_WEBRTC_API +gboolean gst_webrtc_ice_set_remote_credentials (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, + const gchar * ufrag, + const gchar * pwd); + +GST_WEBRTC_API +gboolean gst_webrtc_ice_add_turn_server (GstWebRTCICE * ice, + const gchar * uri); + + +GST_WEBRTC_API +void gst_webrtc_ice_set_is_controller (GstWebRTCICE * ice, + gboolean controller); + +GST_WEBRTC_API +gboolean gst_webrtc_ice_get_is_controller (GstWebRTCICE * ice); + +GST_WEBRTC_API +void gst_webrtc_ice_set_force_relay (GstWebRTCICE * ice, + gboolean force_relay); + +GST_WEBRTC_API +void gst_webrtc_ice_set_stun_server (GstWebRTCICE * ice, + const gchar * uri); + +GST_WEBRTC_API +gchar * gst_webrtc_ice_get_stun_server (GstWebRTCICE * ice); + +GST_WEBRTC_API +void gst_webrtc_ice_set_turn_server (GstWebRTCICE * ice, + const gchar * uri); + +GST_WEBRTC_API +gchar * gst_webrtc_ice_get_turn_server (GstWebRTCICE * ice); + +GST_WEBRTC_API +void gst_webrtc_ice_set_http_proxy (GstWebRTCICE * ice, + const gchar * uri); + +GST_WEBRTC_API +gchar * gst_webrtc_ice_get_http_proxy (GstWebRTCICE * ice); + +GST_WEBRTC_API +void gst_webrtc_ice_set_on_ice_candidate (GstWebRTCICE * ice, + GstWebRTCICEOnCandidateFunc func, + gpointer user_data, + GDestroyNotify notify); + +GST_WEBRTC_API +void gst_webrtc_ice_set_tos (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, + guint tos); + +GST_WEBRTC_API +GstWebRTCICECandidateStats** gst_webrtc_ice_get_local_candidates (GstWebRTCICE * ice, + GstWebRTCICEStream * stream); + +GST_WEBRTC_API +GstWebRTCICECandidateStats** gst_webrtc_ice_get_remote_candidates (GstWebRTCICE * ice, + GstWebRTCICEStream * stream); + +GST_WEBRTC_API +gboolean gst_webrtc_ice_get_selected_pair (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, + GstWebRTCICECandidateStats ** local_stats, + GstWebRTCICECandidateStats ** remote_stats); + +GST_WEBRTC_API +void gst_webrtc_ice_candidate_stats_free (GstWebRTCICECandidateStats * stats); + +GST_WEBRTC_API +GType gst_webrtc_ice_candidate_stats_get_type (void); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstWebRTCICE, gst_object_unref) + +GST_WEBRTC_API +GstWebRTCICECandidateStats * gst_webrtc_ice_candidate_stats_copy (GstWebRTCICECandidateStats *stats); + +G_END_DECLS + +#endif /* __GST_WEBRTC_ICE_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/icestream.c
Added
@@ -0,0 +1,137 @@ +/* GStreamer + * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +/** + * SECTION: icestream + * @short_description: IceStream object + * @title: GstIceStream + * @symbols: + * - GstWebRTCICEStream + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "icestream.h" + +#include "webrtc-priv.h" + +#define GST_CAT_DEFAULT gst_webrtc_ice_stream_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +enum +{ + PROP_0, + PROP_STREAM_ID, +}; + +#define gst_webrtc_ice_stream_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstWebRTCICEStream, gst_webrtc_ice_stream, + GST_TYPE_OBJECT, GST_DEBUG_CATEGORY_INIT (gst_webrtc_ice_stream_debug, + "webrtcicestream", 0, "webrtcicestream");); + +static void +gst_webrtc_ice_stream_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstWebRTCICEStream *stream = GST_WEBRTC_ICE_STREAM (object); + + switch (prop_id) { + case PROP_STREAM_ID: + stream->stream_id = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_webrtc_ice_stream_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstWebRTCICEStream *stream = GST_WEBRTC_ICE_STREAM (object); + + switch (prop_id) { + case PROP_STREAM_ID: + g_value_set_uint (value, stream->stream_id); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * gst_webrtc_ice_stream_find_transport: + * @stream: the #GstWebRTCICEStream + * @component: The #GstWebRTCICEComponent + * + * Returns: (transfer full) (nullable): the #GstWebRTCICETransport, or %NULL + * Since: 1.22 + */ +GstWebRTCICETransport * +gst_webrtc_ice_stream_find_transport (GstWebRTCICEStream * stream, + GstWebRTCICEComponent component) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE_STREAM (stream), NULL); + g_assert (GST_WEBRTC_ICE_STREAM_GET_CLASS (stream)->find_transport); + + return GST_WEBRTC_ICE_STREAM_GET_CLASS (stream)->find_transport (stream, + component); +} + +/** + * gst_webrtc_ice_stream_gather_candidates: + * @ice: the #GstWebRTCICEStream + * Returns: FALSE on error, TRUE otherwise + * Since: 1.22 + */ +gboolean +gst_webrtc_ice_stream_gather_candidates (GstWebRTCICEStream * stream) +{ + g_return_val_if_fail (GST_IS_WEBRTC_ICE_STREAM (stream), FALSE); + g_assert (GST_WEBRTC_ICE_STREAM_GET_CLASS (stream)->gather_candidates); + + return GST_WEBRTC_ICE_STREAM_GET_CLASS (stream)->gather_candidates (stream); +} + +static void +gst_webrtc_ice_stream_class_init (GstWebRTCICEStreamClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + klass->find_transport = NULL; + klass->gather_candidates = NULL; + + gobject_class->get_property = gst_webrtc_ice_stream_get_property; + gobject_class->set_property = gst_webrtc_ice_stream_set_property; + + g_object_class_install_property (gobject_class, + PROP_STREAM_ID, + g_param_spec_uint ("stream-id", + "ICE stream id", "ICE stream id associated with this stream", + 0, G_MAXUINT, 0, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_webrtc_ice_stream_init (GstWebRTCICEStream * stream) +{ +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/icestream.h
Added
@@ -0,0 +1,61 @@ +/* GStreamer + * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_WEBRTC_ICE_STREAM_H__ +#define __GST_WEBRTC_ICE_STREAM_H__ + +#include "ice.h" + +G_BEGIN_DECLS + +GST_WEBRTC_API +GType gst_webrtc_ice_stream_get_type(void); +#define GST_TYPE_WEBRTC_ICE_STREAM (gst_webrtc_ice_stream_get_type()) +#define GST_WEBRTC_ICE_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WEBRTC_ICE_STREAM,GstWebRTCICEStream)) +#define GST_IS_WEBRTC_ICE_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WEBRTC_ICE_STREAM)) +#define GST_WEBRTC_ICE_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_WEBRTC_ICE_STREAM,GstWebRTCICEStreamClass)) +#define GST_IS_WEBRTC_ICE_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_WEBRTC_ICE_STREAM)) +#define GST_WEBRTC_ICE_STREAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_ICE_STREAM,GstWebRTCICEStreamClass)) + +struct _GstWebRTCICEStream +{ + GstObject parent; + guint stream_id; +}; + +struct _GstWebRTCICEStreamClass +{ + GstObjectClass parent_class; + GstWebRTCICETransport * (*find_transport) (GstWebRTCICEStream * stream, + GstWebRTCICEComponent component); + gboolean (*gather_candidates) (GstWebRTCICEStream * ice); +}; + + +GST_WEBRTC_API +GstWebRTCICETransport * gst_webrtc_ice_stream_find_transport (GstWebRTCICEStream * stream, + GstWebRTCICEComponent component); +GST_WEBRTC_API +gboolean gst_webrtc_ice_stream_gather_candidates (GstWebRTCICEStream * ice); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstWebRTCICEStream, gst_object_unref) + +G_END_DECLS + +#endif /* __GST_WEBRTC_ICE_STREAM_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/webrtc/icetransport.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/icetransport.c
Changed
@@ -22,8 +22,10 @@ * @short_description: RTCIceTransport object * @title: GstWebRTCICETransport * @see_also: #GstWebRTCRTPSender, #GstWebRTCRTPReceiver, #GstWebRTCDTLSTransport + * @symbols: + * - GstWebRTCICETransport * - * <https://www.w3.org/TR/webrtc/#rtcicetransport> + * See the specification(https://www.w3.org/TR/webrtc/#rtcicetransport) */ #ifdef HAVE_CONFIG_H @@ -94,7 +96,7 @@ void gst_webrtc_ice_transport_new_candidate (GstWebRTCICETransport * ice, - guint stream_id, GstWebRTCICEComponent component, gchar * attr) + guint stream_id, GstWebRTCICEComponent component, const gchar * attr) { g_signal_emit (ice, gst_webrtc_ice_transport_signalsON_NEW_CANDIDATE_SIGNAL, stream_id, component, attr);
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/webrtc/icetransport.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/icetransport.h
Changed
@@ -20,7 +20,6 @@ #ifndef __GST_WEBRTC_ICE_TRANSPORT_H__ #define __GST_WEBRTC_ICE_TRANSPORT_H__ -#include <gst/gst.h> #include <gst/webrtc/webrtc_fwd.h> G_BEGIN_DECLS @@ -33,6 +32,42 @@ #define GST_WEBRTC_ICE_TRANSPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_WEBRTC_ICE_TRANSPORT,GstWebRTCICETransportClass)) #define GST_IS_WEBRTC_ICE_TRANSPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_WEBRTC_ICE_TRANSPORT)) #define GST_WEBRTC_ICE_TRANSPORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_ICE_TRANSPORT,GstWebRTCICETransportClass)) +struct _GstWebRTCICETransport +{ + GstObject parent; + /* <protected> */ + GstWebRTCICERole role; + GstWebRTCICEComponent component; + + GstWebRTCICEConnectionState state; + GstWebRTCICEGatheringState gathering_state; + + /* Filled by subclasses */ + GstElement *src; + GstElement *sink; + + gpointer _paddingGST_PADDING; +}; + +struct _GstWebRTCICETransportClass +{ + GstObjectClass parent_class; + + gboolean (*gather_candidates) (GstWebRTCICETransport * transport); + + gpointer _paddingGST_PADDING; +}; + +GST_WEBRTC_API +void gst_webrtc_ice_transport_connection_state_change (GstWebRTCICETransport * ice, + GstWebRTCICEConnectionState new_state); +GST_WEBRTC_API +void gst_webrtc_ice_transport_gathering_state_change (GstWebRTCICETransport * ice, + GstWebRTCICEGatheringState new_state); +GST_WEBRTC_API +void gst_webrtc_ice_transport_selected_pair_change (GstWebRTCICETransport * ice); +GST_WEBRTC_API +void gst_webrtc_ice_transport_new_candidate (GstWebRTCICETransport * ice, guint stream_id, GstWebRTCICEComponent component, const gchar * attr); G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstWebRTCICETransport, gst_object_unref)
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/webrtc/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/meson.build
Changed
@@ -1,5 +1,7 @@ webrtc_sources = files( 'dtlstransport.c', + 'ice.c', + 'icestream.c', 'icetransport.c', 'rtcsessiondescription.c', 'rtpreceiver.c', @@ -12,6 +14,8 @@ webrtc_headers = files( 'dtlstransport.h', + 'ice.h', + 'icestream.h', 'icetransport.h', 'rtcsessiondescription.h', 'rtpreceiver.h', @@ -25,6 +29,8 @@ webrtc_enumtypes_headers = files( 'dtlstransport.h', + 'ice.h', + 'icestream.h', 'icetransport.h', 'rtptransceiver.h', 'webrtc_fwd.h', @@ -85,7 +91,7 @@ webrtc_gen_sources += webrtc_gir endif endif -libraries += pkg_name, library_def +gst_libraries += pkg_name, library_def install_headers(webrtc_headers, subdir : 'gstreamer-1.0/gst/webrtc') @@ -95,3 +101,5 @@ dependencies: gstwebrtc_dependencies) meson.override_dependency(pkg_name, gstwebrtc_dep) + +subdir('nice') \ No newline at end of file
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/nice
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/nice/meson.build
Added
@@ -0,0 +1,51 @@ +libgstwebrtcnice_sources = files( + 'nice.c', + 'nicestream.c', + 'nicetransport.c', +) + +libgstwebrtcnice_headers = files( + 'nice_fwd.h', + 'nice.h', + 'nicestream.h', + 'nicetransport.h', +) + +libgstwebrtcnice_dep = dependency('', required : false) + +libnice_dep = dependency('nice', version : '>=0.1.20', required : get_option('webrtc'), + fallback : 'libnice', 'libnice_dep', + default_options: 'tests=disabled') + +deps = gstwebrtc_dep, libnice_dep + +if libnice_dep.found() + libnice_version = libnice_dep.version() + libnice_c_args = + libgstwebrtcnice = library('gstwebrtcnice-' + api_version, + libgstwebrtcnice_sources, libgstwebrtcnice_headers, + c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', '-DBUILDING_GST_WEBRTCNICE', '-DG_LOG_DOMAIN="GStreamer-webrtcnice"' + libnice_c_args, + include_directories: configinc, + version : libversion, + soversion : soversion, + darwin_versions : osxversion, + dependencies: deps, + install: true, + ) + + pkg_name = 'gstreamer-webrtc-nice-1.0' + gst_libraries += pkg_name, {'lib': libgstwebrtcnice} + pkgconfig.generate(libgstwebrtcnice, + libraries : deps, + variables : pkgconfig_variables, + subdirs : pkgconfig_subdirs, + name : pkg_name, + description : 'libnice based implementaion for GstWebRTCICE', + ) + + libgstwebrtcnice_dep = declare_dependency(link_with: libgstwebrtcnice, + dependencies: deps) + + install_headers(libgstwebrtcnice_headers, subdir : 'gstreamer-1.0/gst/webrtc/nice') + meson.override_dependency(pkg_name, libgstwebrtcnice_dep) +endif
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/nice/nice.c
Added
@@ -0,0 +1,1677 @@ +/* GStreamer + * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "nice.h" +#include "nicestream.h" +/* libnice */ +#include <agent.h> + +#define HTTP_PROXY_PORT_DEFAULT 3128 + +/* XXX: + * + * - are locally generated remote candidates meant to be readded to libnice? + */ + +static GstUri *_validate_turn_server (GstWebRTCNice * ice, const gchar * s); + +#define GST_CAT_DEFAULT gst_webrtc_nice_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +enum +{ + PROP_0, + PROP_AGENT, + PROP_ICE_TCP, + PROP_ICE_UDP, + PROP_MIN_RTP_PORT, + PROP_MAX_RTP_PORT, +}; + +struct _GstWebRTCNicePrivate +{ + NiceAgent *nice_agent; + + GArray *nice_stream_map; + + GThread *thread; + GMainContext *main_context; + GMainLoop *loop; + GMutex lock; + GCond cond; + + GstWebRTCICEOnCandidateFunc on_candidate; + gpointer on_candidate_data; + GDestroyNotify on_candidate_notify; + + GstUri *stun_server; + GstUri *turn_server; + + GHashTable *turn_servers; + + GstUri *http_proxy; +}; + +#define gst_webrtc_nice_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstWebRTCNice, gst_webrtc_nice, + GST_TYPE_WEBRTC_ICE, G_ADD_PRIVATE (GstWebRTCNice) + GST_DEBUG_CATEGORY_INIT (gst_webrtc_nice_debug, "webrtcnice", 0, + "webrtcnice");); + +static gboolean +_unlock_pc_thread (GMutex * lock) +{ + g_mutex_unlock (lock); + return G_SOURCE_REMOVE; +} + +static gpointer +_gst_nice_thread (GstWebRTCNice * ice) +{ + g_mutex_lock (&ice->priv->lock); + ice->priv->main_context = g_main_context_new (); + ice->priv->loop = g_main_loop_new (ice->priv->main_context, FALSE); + + g_cond_broadcast (&ice->priv->cond); + g_main_context_invoke (ice->priv->main_context, + (GSourceFunc) _unlock_pc_thread, &ice->priv->lock); + + g_main_loop_run (ice->priv->loop); + + g_mutex_lock (&ice->priv->lock); + g_main_context_unref (ice->priv->main_context); + ice->priv->main_context = NULL; + g_main_loop_unref (ice->priv->loop); + ice->priv->loop = NULL; + g_cond_broadcast (&ice->priv->cond); + g_mutex_unlock (&ice->priv->lock); + + return NULL; +} + +static void +_start_thread (GstWebRTCNice * ice) +{ + g_mutex_lock (&ice->priv->lock); + ice->priv->thread = g_thread_new (GST_OBJECT_NAME (ice), + (GThreadFunc) _gst_nice_thread, ice); + + while (!ice->priv->loop) + g_cond_wait (&ice->priv->cond, &ice->priv->lock); + g_mutex_unlock (&ice->priv->lock); +} + +static void +_stop_thread (GstWebRTCNice * ice) +{ + g_mutex_lock (&ice->priv->lock); + g_main_loop_quit (ice->priv->loop); + while (ice->priv->loop) + g_cond_wait (&ice->priv->cond, &ice->priv->lock); + g_mutex_unlock (&ice->priv->lock); + + g_thread_unref (ice->priv->thread); +} + +struct NiceStreamItem +{ + guint session_id; + guint nice_stream_id; + GstWebRTCICEStream *stream; +}; + +/* TRUE to continue, FALSE to stop */ +typedef gboolean (*NiceStreamItemForeachFunc) (struct NiceStreamItem * item, + gpointer user_data); + +static void +_nice_stream_item_foreach (GstWebRTCNice * ice, NiceStreamItemForeachFunc func, + gpointer data) +{ + int i, len; + + len = ice->priv->nice_stream_map->len; + for (i = 0; i < len; i++) { + struct NiceStreamItem *item = + &g_array_index (ice->priv->nice_stream_map, struct NiceStreamItem, + i); + + if (!func (item, data)) + break; + } +} + +/* TRUE for match, FALSE otherwise */ +typedef gboolean (*NiceStreamItemFindFunc) (struct NiceStreamItem * item, + gpointer user_data); + +struct nice_find +{ + NiceStreamItemFindFunc func; + gpointer data; + struct NiceStreamItem *ret; +}; + +static gboolean +_find_nice_item (struct NiceStreamItem *item, gpointer user_data) +{ + struct nice_find *f = user_data; + if (f->func (item, f->data)) { + f->ret = item; + return FALSE; + } + return TRUE; +} + +static struct NiceStreamItem * +_nice_stream_item_find (GstWebRTCNice * ice, NiceStreamItemFindFunc func, + gpointer data) +{ + struct nice_find f; + + f.func = func; + f.data = data; + f.ret = NULL; + + _nice_stream_item_foreach (ice, _find_nice_item, &f); + + return f.ret; +} + +#define NICE_MATCH_INIT { -1, -1, NULL } + +static gboolean +_match (struct NiceStreamItem *item, struct NiceStreamItem *m) +{ + if (m->session_id != -1 && m->session_id != item->session_id) + return FALSE; + if (m->nice_stream_id != -1 && m->nice_stream_id != item->nice_stream_id) + return FALSE; + if (m->stream != NULL && m->stream != item->stream) + return FALSE; + + return TRUE; +} + +static struct NiceStreamItem * +_find_item (GstWebRTCNice * ice, guint session_id, guint nice_stream_id, + GstWebRTCICEStream * stream) +{ + struct NiceStreamItem m = NICE_MATCH_INIT; + + m.session_id = session_id; + m.nice_stream_id = nice_stream_id; + m.stream = stream; + + return _nice_stream_item_find (ice, (NiceStreamItemFindFunc) _match, &m); +} + +static struct NiceStreamItem * +_create_nice_stream_item (GstWebRTCNice * ice, guint session_id) +{ + struct NiceStreamItem item; + + item.session_id = session_id; + item.nice_stream_id = nice_agent_add_stream (ice->priv->nice_agent, 1); + item.stream = + GST_WEBRTC_ICE_STREAM (gst_webrtc_nice_stream_new (GST_WEBRTC_ICE (ice), + item.nice_stream_id) + ); + + g_array_append_val (ice->priv->nice_stream_map, item); + + return _find_item (ice, item.session_id, item.nice_stream_id, item.stream); +} + +static void +_parse_userinfo (const gchar * userinfo, gchar ** user, gchar ** pass) +{ + const gchar *colon; + + if (!userinfo) { + *user = NULL; + *pass = NULL; + return; + } + + colon = g_strstr_len (userinfo, -1, ":"); + if (!colon) { + *user = g_uri_unescape_string (userinfo, NULL); + *pass = NULL; + return; + } + + /* Check that the first occurence is also the last occurence */ + if (colon != g_strrstr (userinfo, ":")) + GST_WARNING ("userinfo %s contains more than one ':', will assume that the " + "first ':' delineates user:pass. You should escape the user and pass " + "before adding to the URI.", userinfo); + + *user = g_uri_unescape_segment (userinfo, colon, NULL); + *pass = g_uri_unescape_string (&colon1, NULL); +} + +struct resolve_host_data +{ + GstWebRTCNice *ice; + char *host; + gboolean main_context_handled; + gpointer user_data; + GDestroyNotify notify; +}; + +static void +on_resolve_host (GResolver * resolver, GAsyncResult * res, gpointer user_data) +{ + GTask *task = user_data; + struct resolve_host_data *rh; + GError *error = NULL; + GList *addresses; + + rh = g_task_get_task_data (task); + + if (!(addresses = g_resolver_lookup_by_name_finish (resolver, res, &error))) { + GST_ERROR ("failed to resolve: %s", error->message); + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + GST_DEBUG_OBJECT (rh->ice, "Resolved %d addresses for host %s with data %p", + g_list_length (addresses), rh->host, rh); + + g_task_return_pointer (task, addresses, + (GDestroyNotify) g_resolver_free_addresses); + g_object_unref (task); +} + +static void +free_resolve_host_data (struct resolve_host_data *rh) +{ + GST_TRACE_OBJECT (rh->ice, "Freeing data %p for resolving host %s", rh, + rh->host); + + if (rh->notify) + rh->notify (rh->user_data); + + g_free (rh->host); + g_free (rh); +} + +static struct resolve_host_data * +resolve_host_data_new (GstWebRTCNice * ice, const char *host) +{ + struct resolve_host_data *rh = g_new0 (struct resolve_host_data, 1); + + rh->ice = ice; + rh->host = g_strdup (host); + + return rh; +} + +static gboolean +resolve_host_main_cb (gpointer user_data) +{ + GResolver *resolver = g_resolver_get_default (); + GTask *task = user_data; + struct resolve_host_data *rh; + + rh = g_task_get_task_data (task); + /* no need to error anymore if the main context disappears and this task is + * not run */ + rh->main_context_handled = TRUE; + + GST_DEBUG_OBJECT (rh->ice, "Resolving host %s", rh->host); + g_resolver_lookup_by_name_async (resolver, rh->host, NULL, + (GAsyncReadyCallback) on_resolve_host, g_object_ref (task)); + + return G_SOURCE_REMOVE; +} + +static void +error_task_if_unhandled (GTask * task) +{ + struct resolve_host_data *rh; + + rh = g_task_get_task_data (task); + + if (!rh->main_context_handled) { + GST_DEBUG_OBJECT (rh->ice, "host resolve for %s with data %p was never " + "executed, main context quit?", rh->host, rh); + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_CANCELLED, "%s", + "Cancelled"); + } + + g_object_unref (task); +} + +static void +resolve_host_async (GstWebRTCNice * ice, const gchar * host, + GAsyncReadyCallback cb, gpointer user_data, GDestroyNotify notify) +{ + struct resolve_host_data *rh = resolve_host_data_new (ice, host); + GTask *task; + + rh->user_data = user_data; + rh->notify = notify; + task = g_task_new (rh->ice, NULL, cb, user_data); + + g_task_set_task_data (task, rh, (GDestroyNotify) free_resolve_host_data); + + GST_TRACE_OBJECT (rh->ice, "invoking main context for resolving host %s " + "with data %p", host, rh); + g_main_context_invoke_full (ice->priv->main_context, G_PRIORITY_DEFAULT, + resolve_host_main_cb, task, (GDestroyNotify) error_task_if_unhandled); +} + +static GList * +resolve_host_finish (GstWebRTCNice * ice, GAsyncResult * res, GError ** error) +{ + g_return_val_if_fail (g_task_is_valid (res, ice), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} + +static void +_add_turn_server (GstWebRTCNice * ice, struct NiceStreamItem *item, + GstUri * turn_server) +{ + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + const gchar *host; + NiceRelayType relays4 = { 0, }; + gchar *user, *pass; + const gchar *userinfo, *transport, *scheme; + int i, relay_n = 0; + + host = gst_uri_get_host (turn_server); + if (!host) { + GST_ERROR_OBJECT (ice, "Turn server has no host"); + return; + } + + scheme = gst_uri_get_scheme (turn_server); + transport = gst_uri_get_query_value (turn_server, "transport"); + userinfo = gst_uri_get_userinfo (turn_server); + _parse_userinfo (userinfo, &user, &pass); + + if (g_strcmp0 (scheme, "turns") == 0) { + relaysrelay_n++ = NICE_RELAY_TYPE_TURN_TLS; + } else if (g_strcmp0 (scheme, "turn") == 0) { + if (!transport || g_strcmp0 (transport, "udp") == 0) + relaysrelay_n++ = NICE_RELAY_TYPE_TURN_UDP; + if (!transport || g_strcmp0 (transport, "tcp") == 0) + relaysrelay_n++ = NICE_RELAY_TYPE_TURN_TCP; + } + g_assert (relay_n < G_N_ELEMENTS (relays)); + + for (i = 0; i < relay_n; i++) { + if (!nice_agent_set_relay_info (nice->priv->nice_agent, + item->nice_stream_id, NICE_COMPONENT_TYPE_RTP, + gst_uri_get_host (turn_server), gst_uri_get_port (turn_server), + user, pass, relaysi)) { + gchar *uri_str = gst_uri_to_string (turn_server); + GST_ERROR_OBJECT (ice, "Could not set TURN server %s on libnice", + uri_str); + g_free (uri_str); + } + } + + g_free (user); + g_free (pass); + +} + +typedef struct +{ + GstWebRTCNice *ice; + struct NiceStreamItem *item; +} AddTurnServerData; + +static void +_add_turn_server_func (const gchar * uri, GstUri * turn_server, + AddTurnServerData * data) +{ + _add_turn_server (data->ice, data->item, turn_server); +} + +static void +_add_stun_server (GstWebRTCNice * ice, GstUri * stun_server) +{ + const gchar *msg = "must be of the form stun://<host>:<port>"; + const gchar *host; + gchar *s = NULL; + guint port; + + s = gst_uri_to_string (stun_server); + GST_DEBUG_OBJECT (ice, "adding stun server, %s", s); + + host = gst_uri_get_host (stun_server); + if (!host) { + GST_ERROR_OBJECT (ice, "Stun server '%s' has no host, %s", s, msg); + goto out; + } + + port = gst_uri_get_port (stun_server); + if (port == GST_URI_NO_PORT) { + GST_INFO_OBJECT (ice, "Stun server '%s' has no port, assuming 3478", s); + port = 3478; + gst_uri_set_port (stun_server, port); + } + + g_object_set (ice->priv->nice_agent, "stun-server", host, + "stun-server-port", port, NULL); + +out: + g_free (s); +} + +static GstWebRTCICEStream * +gst_webrtc_nice_add_stream (GstWebRTCICE * ice, guint session_id) +{ + struct NiceStreamItem m = NICE_MATCH_INIT; + struct NiceStreamItem *item; + AddTurnServerData add_data; + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + + m.session_id = session_id; + item = _nice_stream_item_find (nice, (NiceStreamItemFindFunc) _match, &m); + if (item) { + GST_ERROR_OBJECT (nice, "stream already added with session_id=%u", + session_id); + return 0; + } + + if (nice->priv->stun_server) { + _add_stun_server (nice, nice->priv->stun_server); + } + + item = _create_nice_stream_item (nice, session_id); + + if (nice->priv->turn_server) { + _add_turn_server (nice, item, nice->priv->turn_server); + } + + add_data.ice = nice; + add_data.item = item; + + g_hash_table_foreach (nice->priv->turn_servers, + (GHFunc) _add_turn_server_func, &add_data); + + return item->stream; +} + +static void +_on_new_candidate (NiceAgent * agent, NiceCandidate * candidate, + GstWebRTCNice * ice) +{ + struct NiceStreamItem *item; + gchar *attr; + + item = _find_item (ice, -1, candidate->stream_id, NULL); + if (!item) { + GST_WARNING_OBJECT (ice, "received signal for non-existent stream %u", + candidate->stream_id); + return; + } + + if (!candidate->username || !candidate->password) { + gboolean got_credentials; + gchar *ufrag, *password; + + got_credentials = nice_agent_get_local_credentials (ice->priv->nice_agent, + candidate->stream_id, &ufrag, &password); + g_warn_if_fail (got_credentials); + + if (!candidate->username) + candidate->username = ufrag; + else + g_free (ufrag); + + if (!candidate->password) + candidate->password = password; + else + g_free (password); + } + + attr = nice_agent_generate_local_candidate_sdp (agent, candidate); + + if (ice->priv->on_candidate) + ice->priv->on_candidate (GST_WEBRTC_ICE (ice), item->session_id, attr, + ice->priv->on_candidate_data); + + g_free (attr); +} + +static GstWebRTCICETransport * +gst_webrtc_nice_find_transport (GstWebRTCICE * ice, GstWebRTCICEStream * stream, + GstWebRTCICEComponent component) +{ + struct NiceStreamItem *item; + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + + item = _find_item (nice, -1, -1, stream); + g_return_val_if_fail (item != NULL, NULL); + + return gst_webrtc_ice_stream_find_transport (item->stream, component); +} + +#if 0 +/* TODO don't rely on libnice to (de)serialize candidates */ +static NiceCandidateType +_candidate_type_from_string (const gchar * s) +{ + if (g_strcmp0 (s, "host") == 0) { + return NICE_CANDIDATE_TYPE_HOST; + } else if (g_strcmp0 (s, "srflx") == 0) { + return NICE_CANDIDATE_TYPE_SERVER_REFLEXIVE; + } else if (g_strcmp0 (s, "prflx") == 0) { /* FIXME: is the right string? */ + return NICE_CANDIDATE_TYPE_PEER_REFLEXIVE; + } else if (g_strcmp0 (s, "relay") == 0) { + return NICE_CANDIDATE_TYPE_RELAY; + } else { + g_assert_not_reached (); + return 0; + } +} + +static const gchar * +_candidate_type_to_string (NiceCandidateType type) +{ + switch (type) { + case NICE_CANDIDATE_TYPE_HOST: + return "host"; + case NICE_CANDIDATE_TYPE_SERVER_REFLEXIVE: + return "srflx"; + case NICE_CANDIDATE_TYPE_PEER_REFLEXIVE: + return "prflx"; + case NICE_CANDIDATE_TYPE_RELAY: + return "relay"; + default: + g_assert_not_reached (); + return NULL; + } +} + +static NiceCandidateTransport +_candidate_transport_from_string (const gchar * s) +{ + if (g_strcmp0 (s, "UDP") == 0) { + return NICE_CANDIDATE_TRANSPORT_UDP; + } else if (g_strcmp0 (s, "TCP tcptype") == 0) { + return NICE_CANDIDATE_TRANSPORT_TCP_ACTIVE; + } else if (g_strcmp0 (s, "tcp-passive") == 0) { /* FIXME: is the right string? */ + return NICE_CANDIDATE_TRANSPORT_TCP_PASSIVE; + } else if (g_strcmp0 (s, "tcp-so") == 0) { + return NICE_CANDIDATE_TRANSPORT_TCP_SO; + } else { + g_assert_not_reached (); + return 0; + } +} + +static const gchar * +_candidate_type_to_string (NiceCandidateType type) +{ + switch (type) { + case NICE_CANDIDATE_TYPE_HOST: + return "host"; + case NICE_CANDIDATE_TYPE_SERVER_REFLEXIVE: + return "srflx"; + case NICE_CANDIDATE_TYPE_PEER_REFLEXIVE: + return "prflx"; + case NICE_CANDIDATE_TYPE_RELAY: + return "relay"; + default: + g_assert_not_reached (); + return NULL; + } +} +#endif + +/* parse the address for possible resolution */ +static gboolean +get_candidate_address (const gchar * candidate, gchar ** prefix, + gchar ** address, gchar ** postfix) +{ + char **tokens = NULL; + char *tmp_address = NULL; + + if (!g_str_has_prefix (candidate, "a=candidate:")) { + GST_ERROR ("candidate \"%s\" does not start with \"a=candidate:\"", + candidate); + goto failure; + } + + if (!(tokens = g_strsplit (candidate, " ", 6))) { + GST_ERROR ("candidate \"%s\" could not be tokenized", candidate); + goto failure; + } + + if (g_strv_length (tokens) < 6) { + GST_ERROR ("candidate \"%s\" tokenization resulted in not enough tokens", + candidate); + goto failure; + } + + tmp_address = tokens4; + if (address) + *address = g_strdup (tmp_address); + tokens4 = NULL; + + if (prefix) + *prefix = g_strjoinv (" ", tokens); + if (postfix) + *postfix = g_strdup (tokens5); + + tokens4 = tmp_address; + + g_strfreev (tokens); + return TRUE; + +failure: + if (tokens) + g_strfreev (tokens); + return FALSE; +} + +struct resolve_candidate_data +{ + guint nice_stream_id; + char *prefix; + char *postfix; +}; + +static void +free_resolve_candidate_data (struct resolve_candidate_data *rc) +{ + g_free (rc->prefix); + g_free (rc->postfix); + g_free (rc); +} + +static void +add_ice_candidate_to_libnice (GstWebRTCICE * ice, guint nice_stream_id, + NiceCandidate * cand) +{ + GSList *candidates = NULL; + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + + if (cand->component_id == 2) { + /* we only support rtcp-mux so rtcp candidates are useless for us */ + GST_INFO_OBJECT (ice, "Dropping RTCP candidate"); + return; + } + + candidates = g_slist_append (candidates, cand); + + nice_agent_set_remote_candidates (nice->priv->nice_agent, nice_stream_id, + cand->component_id, candidates); + + g_slist_free (candidates); +} + +static void +on_candidate_resolved (GstWebRTCICE * ice, GAsyncResult * res, + gpointer user_data) +{ + struct resolve_candidate_data *rc = user_data; + GError *error = NULL; + GList *addresses; + char *new_candv4 = { NULL, }; + char *new_addr, *new_candidate; + NiceCandidate *cand; + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + + if (!(addresses = resolve_host_finish (nice, res, &error))) { + GST_WARNING_OBJECT (ice, "Could not resolve candidate address: %s", + error->message); + g_clear_error (&error); + return; + } + + new_addr = g_inet_address_to_string (addresses->data); + + new_candv0 = rc->prefix; + new_candv1 = new_addr; + new_candv2 = rc->postfix; + new_candv3 = NULL; + new_candidate = g_strjoinv (" ", new_candv); + + GST_DEBUG_OBJECT (ice, "resolved to candidate %s", new_candidate); + + cand = + nice_agent_parse_remote_candidate_sdp (nice->priv->nice_agent, + rc->nice_stream_id, new_candidate); + g_free (new_candidate); + if (!cand) { + GST_WARNING_OBJECT (ice, "Could not parse candidate \'%s\'", new_candidate); + return; + } + + g_free (new_addr); + + add_ice_candidate_to_libnice (ice, rc->nice_stream_id, cand); + nice_candidate_free (cand); +} + +/* candidate must start with "a=candidate:" or be NULL*/ +static void +gst_webrtc_nice_add_candidate (GstWebRTCICE * ice, GstWebRTCICEStream * stream, + const gchar * candidate) +{ + struct NiceStreamItem *item; + NiceCandidate *cand; + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + + item = _find_item (nice, -1, -1, stream); + g_return_if_fail (item != NULL); + + if (candidate == NULL) { + nice_agent_peer_candidate_gathering_done (nice->priv->nice_agent, + item->nice_stream_id); + return; + } + + cand = + nice_agent_parse_remote_candidate_sdp (nice->priv->nice_agent, + item->nice_stream_id, candidate); + if (!cand) { + /* might be a .local candidate */ + char *prefix = NULL, *address = NULL, *postfix = NULL; + struct resolve_candidate_data *rc; + + if (!get_candidate_address (candidate, &prefix, &address, &postfix)) { + GST_WARNING_OBJECT (nice, "Failed to retrieve address from candidate %s", + candidate); + goto done; + } + + if (!g_str_has_suffix (address, ".local")) { + GST_WARNING_OBJECT (nice, "candidate address \'%s\' does not end " + "with \'.local\'", address); + goto done; + } + + rc = g_new0 (struct resolve_candidate_data, 1); + rc->nice_stream_id = item->nice_stream_id; + rc->prefix = prefix; + rc->postfix = postfix; + resolve_host_async (nice, address, + (GAsyncReadyCallback) on_candidate_resolved, rc, + (GDestroyNotify) free_resolve_candidate_data); + + prefix = NULL; + postfix = NULL; + + done: + g_clear_pointer (&address, g_free); + g_clear_pointer (&prefix, g_free); + g_clear_pointer (&postfix, g_free); + + return; + } + + add_ice_candidate_to_libnice (ice, item->nice_stream_id, cand); + nice_candidate_free (cand); +} + +static gboolean +gst_webrtc_nice_set_remote_credentials (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, const gchar * ufrag, const gchar * pwd) +{ + struct NiceStreamItem *item; + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + + g_return_val_if_fail (ufrag != NULL, FALSE); + g_return_val_if_fail (pwd != NULL, FALSE); + item = _find_item (nice, -1, -1, stream); + g_return_val_if_fail (item != NULL, FALSE); + + GST_DEBUG_OBJECT (nice, "Setting remote ICE credentials on " + "ICE stream %u ufrag:%s pwd:%s", item->nice_stream_id, ufrag, pwd); + + nice_agent_set_remote_credentials (nice->priv->nice_agent, + item->nice_stream_id, ufrag, pwd); + + return TRUE; +} + +typedef struct +{ + GstWebRTCNice *ice; + GstUri *turn_server; +} AddTurnServerToStreamData; + +static gboolean +_add_turn_server_foreach_stream_func (struct NiceStreamItem *item, + gpointer data) +{ + AddTurnServerToStreamData *add_data = (AddTurnServerToStreamData *) data; + _add_turn_server (add_data->ice, item, add_data->turn_server); + return TRUE; +} + +static gboolean +gst_webrtc_nice_add_turn_server (GstWebRTCICE * ice, const gchar * uri) +{ + gboolean ret = FALSE; + GstUri *valid_uri; + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + gboolean inserted; + AddTurnServerToStreamData add_data; + + if (!(valid_uri = _validate_turn_server (nice, uri))) + goto done; + + inserted = + g_hash_table_insert (nice->priv->turn_servers, g_strdup (uri), valid_uri); + + /* add the turn server to any streams that were already created */ + if (inserted) { + add_data.ice = nice; + add_data.turn_server = valid_uri; + _nice_stream_item_foreach (nice, _add_turn_server_foreach_stream_func, + &add_data); + } + + ret = TRUE; + +done: + return ret; +} + +static gboolean +gst_webrtc_nice_add_local_ip_address (GstWebRTCNice * ice, + const gchar * address) +{ + gboolean ret = FALSE; + NiceAddress nice_addr; + + nice_address_init (&nice_addr); + + ret = nice_address_set_from_string (&nice_addr, address); + + if (ret) { + ret = nice_agent_add_local_address (ice->priv->nice_agent, &nice_addr); + if (!ret) { + GST_ERROR_OBJECT (ice, "Failed to add local address to NiceAgent"); + } + } else { + GST_ERROR_OBJECT (ice, "Failed to initialize NiceAddress %s", address); + } + + return ret; +} + +static gboolean +gst_webrtc_nice_set_local_credentials (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, const gchar * ufrag, const gchar * pwd) +{ + struct NiceStreamItem *item; + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + + g_return_val_if_fail (ufrag != NULL, FALSE); + g_return_val_if_fail (pwd != NULL, FALSE); + item = _find_item (nice, -1, -1, stream); + g_return_val_if_fail (item != NULL, FALSE); + + GST_DEBUG_OBJECT (nice, "Setting local ICE credentials on " + "ICE stream %u ufrag:%s pwd:%s", item->nice_stream_id, ufrag, pwd); + + nice_agent_set_local_credentials (nice->priv->nice_agent, + item->nice_stream_id, ufrag, pwd); + + return TRUE; +} + +static gboolean +gst_webrtc_nice_gather_candidates (GstWebRTCICE * ice, + GstWebRTCICEStream * stream) +{ + struct NiceStreamItem *item; + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + + item = _find_item (nice, -1, -1, stream); + g_return_val_if_fail (item != NULL, FALSE); + + GST_DEBUG_OBJECT (nice, "gather candidates for stream %u", + item->nice_stream_id); + + return gst_webrtc_ice_stream_gather_candidates (stream); +} + +static void +gst_webrtc_nice_set_is_controller (GstWebRTCICE * ice, gboolean controller) +{ + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + g_object_set (G_OBJECT (nice->priv->nice_agent), "controlling-mode", + controller, NULL); +} + +static gboolean +gst_webrtc_nice_get_is_controller (GstWebRTCICE * ice) +{ + gboolean ret; + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + g_object_get (G_OBJECT (nice->priv->nice_agent), "controlling-mode", + &ret, NULL); + return ret; +} + +static void +gst_webrtc_nice_set_force_relay (GstWebRTCICE * ice, gboolean force_relay) +{ + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + g_object_set (G_OBJECT (nice->priv->nice_agent), "force-relay", force_relay, + NULL); +} + +static void +gst_webrtc_nice_set_on_ice_candidate (GstWebRTCICE * ice, + GstWebRTCICEOnCandidateFunc func, gpointer user_data, GDestroyNotify notify) +{ + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + if (nice->priv->on_candidate_notify) + nice->priv->on_candidate_notify (nice->priv->on_candidate_data); + nice->priv->on_candidate = NULL; + + nice->priv->on_candidate = func; + nice->priv->on_candidate_data = user_data; + nice->priv->on_candidate_notify = notify; +} + +static void +gst_webrtc_nice_set_tos (GstWebRTCICE * ice, GstWebRTCICEStream * stream, + guint tos) +{ + struct NiceStreamItem *item; + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + + item = _find_item (nice, -1, -1, stream); + g_return_if_fail (item != NULL); + + nice_agent_set_stream_tos (nice->priv->nice_agent, item->nice_stream_id, tos); +} + +static const gchar * +_relay_type_to_string (GstUri * turn_server) +{ + const gchar *scheme; + const gchar *transport; + + if (!turn_server) + return "none"; + + scheme = gst_uri_get_scheme (turn_server); + transport = gst_uri_get_query_value (turn_server, "transport"); + + if (g_strcmp0 (scheme, "turns") == 0) { + return "tls"; + } else if (g_strcmp0 (scheme, "turn") == 0) { + if (!transport || g_strcmp0 (transport, "udp") == 0) + return "udp"; + if (!transport || g_strcmp0 (transport, "tcp") == 0) + return "tcp"; + } + + return "none"; +} + +static gchar * +_get_server_url (GstWebRTCNice * ice, NiceCandidate * cand) +{ + switch (cand->type) { + case NICE_CANDIDATE_TYPE_RELAYED:{ + NiceAddress addr; + gchar ipaddrNICE_ADDRESS_STRING_LEN; + nice_candidate_relay_address (cand, &addr); + nice_address_to_string (&addr, ipaddr); + return g_strdup (ipaddr); + } + case NICE_CANDIDATE_TYPE_SERVER_REFLEXIVE:{ + NiceAddress addr; + gchar ipaddrNICE_ADDRESS_STRING_LEN; + if (nice_candidate_stun_server_address (cand, &addr)) { + nice_address_to_string (&addr, ipaddr); + return g_strdup (ipaddr); + } else { + return g_strdup (gst_uri_get_host (ice->priv->stun_server)); + } + return g_strdup (gst_uri_get_host (ice->priv->stun_server)); + } + default: + return g_strdup (""); + } +} + +/* TODO: replace it with nice_candidate_type_to_string() + * when it's ready for use + * https://libnice.freedesktop.org/libnice/NiceCandidate.html#nice-candidate-type-to-string + */ +static const gchar * +_candidate_type_to_string (NiceCandidateType type) +{ + switch (type) { + case NICE_CANDIDATE_TYPE_HOST: + return "host"; + case NICE_CANDIDATE_TYPE_SERVER_REFLEXIVE: + return "srflx"; + case NICE_CANDIDATE_TYPE_PEER_REFLEXIVE: + return "prflx"; + case NICE_CANDIDATE_TYPE_RELAYED: + return "relay"; + default: + g_assert_not_reached (); + return NULL; + } +} + +static void +_populate_candidate_stats (GstWebRTCNice * ice, NiceCandidate * cand, + GstWebRTCICEStream * stream, GstWebRTCICECandidateStats * stats, + gboolean is_local) +{ + gchar ipaddrINET6_ADDRSTRLEN; + + g_assert (cand != NULL); + + nice_address_to_string (&cand->addr, ipaddr); + stats->port = nice_address_get_port (&cand->addr); + stats->ipaddr = g_strdup (ipaddr); + stats->stream_id = stream->stream_id; + stats->type = _candidate_type_to_string (cand->type); + stats->prio = cand->priority; + stats->proto = + cand->transport == NICE_CANDIDATE_TRANSPORT_UDP ? "udp" : "tcp"; + if (is_local) { + if (cand->type == NICE_CANDIDATE_TYPE_RELAYED) + stats->relay_proto = _relay_type_to_string (ice->priv->turn_server); + stats->url = _get_server_url (ice, cand); + } +} + +static void +_populate_candidate_list_stats (GstWebRTCNice * ice, GSList * cands, + GstWebRTCICEStream * stream, GPtrArray * result, gboolean is_local) +{ + GSList *item; + + for (item = cands; item != NULL; item = item->next) { + GstWebRTCICECandidateStats *stats = + g_malloc0 (sizeof (GstWebRTCICECandidateStats)); + NiceCandidate *c = item->data; + _populate_candidate_stats (ice, c, stream, stats, is_local); + g_ptr_array_add (result, stats); + } + + g_ptr_array_add (result, NULL); +} + +static GstWebRTCICECandidateStats ** +gst_webrtc_nice_get_local_candidates (GstWebRTCICE * ice, + GstWebRTCICEStream * stream) +{ + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + GSList *cands = NULL; + + /* TODO: Use a g_ptr_array_new_null_terminated once when we depend on GLib 2.74 */ + GPtrArray *result = g_ptr_array_new (); + + cands = nice_agent_get_local_candidates (nice->priv->nice_agent, + stream->stream_id, NICE_COMPONENT_TYPE_RTP); + + _populate_candidate_list_stats (nice, cands, stream, result, TRUE); + g_slist_free_full (cands, (GDestroyNotify) nice_candidate_free); + + return (GstWebRTCICECandidateStats **) g_ptr_array_free (result, FALSE); +} + +static GstWebRTCICECandidateStats ** +gst_webrtc_nice_get_remote_candidates (GstWebRTCICE * ice, + GstWebRTCICEStream * stream) +{ + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + GSList *cands = NULL; + + /* TODO: Use a g_ptr_array_new_null_terminated once when we depend on GLib 2.74 */ + GPtrArray *result = g_ptr_array_new (); + + cands = nice_agent_get_remote_candidates (nice->priv->nice_agent, + stream->stream_id, NICE_COMPONENT_TYPE_RTP); + + _populate_candidate_list_stats (nice, cands, stream, result, FALSE); + g_slist_free_full (cands, (GDestroyNotify) nice_candidate_free); + + return (GstWebRTCICECandidateStats **) g_ptr_array_free (result, FALSE); +} + +static gboolean +gst_webrtc_nice_get_selected_pair (GstWebRTCICE * ice, + GstWebRTCICEStream * stream, GstWebRTCICECandidateStats ** local_stats, + GstWebRTCICECandidateStats ** remote_stats) +{ + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + NiceCandidate *local_cand = NULL; + NiceCandidate *remote_cand = NULL; + + + if (stream) { + if (nice_agent_get_selected_pair (nice->priv->nice_agent, stream->stream_id, + NICE_COMPONENT_TYPE_RTP, &local_cand, &remote_cand)) { + *local_stats = g_new0 (GstWebRTCICECandidateStats, 1); + _populate_candidate_stats (nice, local_cand, stream, *local_stats, TRUE); + + *remote_stats = g_new0 (GstWebRTCICECandidateStats, 1); + _populate_candidate_stats (nice, remote_cand, stream, *remote_stats, + FALSE); + + return TRUE; + } + } + + return FALSE; +} + +static void +_clear_ice_stream (struct NiceStreamItem *item) +{ + GstWebRTCNice *ice = NULL; + + if (!item) + return; + + if (item->stream) { + g_object_get (item->stream, "ice", &ice, NULL); + + if (ice != NULL) { + g_signal_handlers_disconnect_by_data (ice->priv->nice_agent, + item->stream); + gst_object_unref (ice); + } + gst_object_unref (item->stream); + } +} + +static GstUri * +_validate_turn_server (GstWebRTCNice * ice, const gchar * s) +{ + GstUri *uri = gst_uri_from_string_escaped (s); + const gchar *userinfo, *scheme; + GList *keys = NULL, *l; + gchar *user = NULL, *pass = NULL; + gboolean turn_tls = FALSE; + guint port; + + GST_DEBUG_OBJECT (ice, "validating turn server, %s", s); + + if (!uri) { + GST_ERROR_OBJECT (ice, "Could not parse turn server '%s'", s); + return NULL; + } + + scheme = gst_uri_get_scheme (uri); + if (g_strcmp0 (scheme, "turn") == 0) { + } else if (g_strcmp0 (scheme, "turns") == 0) { + turn_tls = TRUE; + } else { + GST_ERROR_OBJECT (ice, "unknown scheme '%s'", scheme); + goto out; + } + + keys = gst_uri_get_query_keys (uri); + for (l = keys; l; l = l->next) { + gchar *key = l->data; + + if (g_strcmp0 (key, "transport") == 0) { + const gchar *transport = gst_uri_get_query_value (uri, "transport"); + if (!transport) { + } else if (g_strcmp0 (transport, "udp") == 0) { + } else if (g_strcmp0 (transport, "tcp") == 0) { + } else { + GST_ERROR_OBJECT (ice, "unknown transport value, '%s'", transport); + goto out; + } + } else { + GST_ERROR_OBJECT (ice, "unknown query key, '%s'", key); + goto out; + } + } + + /* TODO: Implement error checking similar to the stun server below */ + userinfo = gst_uri_get_userinfo (uri); + _parse_userinfo (userinfo, &user, &pass); + if (!user) { + GST_ERROR_OBJECT (ice, "No username specified in '%s'", s); + goto out; + } + if (!pass) { + GST_ERROR_OBJECT (ice, "No password specified in '%s'", s); + goto out; + } + + port = gst_uri_get_port (uri); + + if (port == GST_URI_NO_PORT) { + if (turn_tls) { + gst_uri_set_port (uri, 5349); + } else { + gst_uri_set_port (uri, 3478); + } + } + + g_list_free (keys); + g_free (user); + g_free (pass); + + return uri; + +out: + g_list_free (keys); + g_free (user); + g_free (pass); + gst_uri_unref (uri); + + return NULL; +} + +static void +on_http_proxy_resolved (GstWebRTCICE * ice, GAsyncResult * res, + gpointer user_data) +{ + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + GstUri *uri = user_data; + GList *addresses; + GError *error = NULL; + const gchar *userinfo; + gchar *user = NULL; + gchar *pass = NULL; + gchar *ip = NULL; + guint port = GST_URI_NO_PORT; + + if (!(addresses = resolve_host_finish (nice, res, &error))) { + GST_WARNING_OBJECT (ice, "Failed to resolve http proxy: %s", + error->message); + g_clear_error (&error); + return; + } + + /* XXX: only the first IP is used */ + ip = g_inet_address_to_string (addresses->data); + + if (!ip) { + GST_ERROR_OBJECT (ice, "failed to resolve host for proxy"); + gst_uri_unref (uri); + return; + } + + port = gst_uri_get_port (uri); + if (port == GST_URI_NO_PORT) { + port = HTTP_PROXY_PORT_DEFAULT; + GST_DEBUG_OBJECT (ice, "Proxy server has no port, assuming %u", + HTTP_PROXY_PORT_DEFAULT); + } + + userinfo = gst_uri_get_userinfo (uri); + _parse_userinfo (userinfo, &user, &pass); + + g_object_set (nice->priv->nice_agent, + "proxy-ip", ip, "proxy-port", port, "proxy-type", NICE_PROXY_TYPE_HTTP, + "proxy-username", user, "proxy-password", pass, NULL); + + g_free (ip); + g_free (user); + g_free (pass); +} + +static GstUri * +_set_http_proxy (GstWebRTCICE * ice, const gchar * s) +{ + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + GstUri *uri = gst_uri_from_string_escaped (s); + const gchar *msg = + "must be of the form http://username:password@<host>:<port>"; + const gchar *host = NULL; + const gchar *userinfo; + gchar *user = NULL, *pass = NULL; + + GST_DEBUG_OBJECT (ice, "setting http proxy %s", s); + + if (!uri) { + GST_ERROR_OBJECT (ice, "Couldn't parse http proxy uri '%s', %s", s, msg); + return NULL; + } + + if (g_strcmp0 (gst_uri_get_scheme (uri), "http") != 0) { + GST_ERROR_OBJECT (ice, + "Couldn't parse uri scheme for http proxy server '%s', %s", s, msg); + gst_uri_unref (uri); + return NULL; + } + + host = gst_uri_get_host (uri); + if (!host) { + GST_ERROR_OBJECT (ice, "http proxy server '%s' has no host, %s", s, msg); + gst_uri_unref (uri); + return NULL; + } + + userinfo = gst_uri_get_userinfo (uri); + _parse_userinfo (userinfo, &user, &pass); + if ((pass && pass0 != '\0') && (!user || user0 == '\0')) { + GST_ERROR_OBJECT (ice, + "Password specified without user for http proxy '%s', %s", s, msg); + uri = NULL; + goto out; + } + + resolve_host_async (nice, host, (GAsyncReadyCallback) on_http_proxy_resolved, + gst_uri_ref (uri), (GDestroyNotify) gst_uri_unref); + +out: + g_free (user); + g_free (pass); + + return uri; +} + +static void +gst_webrtc_nice_set_stun_server (GstWebRTCICE * ice, const gchar * uri_s) +{ + GstUri *uri = gst_uri_from_string_escaped (uri_s); + const gchar *msg = "must be of the form stun://<host>:<port>"; + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + + GST_DEBUG_OBJECT (nice, "setting stun server, %s", uri_s); + + if (!uri) { + GST_ERROR_OBJECT (nice, "Couldn't parse stun server '%s', %s", uri_s, msg); + return; + } + + if (nice->priv->stun_server) + gst_uri_unref (nice->priv->stun_server); + nice->priv->stun_server = uri; +} + +static gchar * +gst_webrtc_nice_get_stun_server (GstWebRTCICE * ice) +{ + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + if (nice->priv->stun_server) + return gst_uri_to_string (nice->priv->stun_server); + else + return NULL; +} + +static void +gst_webrtc_nice_set_turn_server (GstWebRTCICE * ice, const gchar * uri_s) +{ + GstUri *uri; + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + uri = _validate_turn_server (nice, uri_s); + + if (uri) { + if (nice->priv->turn_server) + gst_uri_unref (nice->priv->turn_server); + nice->priv->turn_server = uri; + } +} + +static gchar * +gst_webrtc_nice_get_turn_server (GstWebRTCICE * ice) +{ + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + if (nice->priv->turn_server) + return gst_uri_to_string (nice->priv->turn_server); + else + return NULL; +} + +static void +gst_webrtc_nice_set_http_proxy (GstWebRTCICE * ice, const gchar * http_proxy) +{ + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + GstUri *uri = _set_http_proxy (ice, http_proxy); + + if (uri) { + if (nice->priv->http_proxy) + gst_uri_unref (nice->priv->http_proxy); + nice->priv->http_proxy = uri; + } +} + +static gchar * +gst_webrtc_nice_get_http_proxy (GstWebRTCICE * ice) +{ + GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + + if (nice->priv->http_proxy) + return gst_uri_to_string (nice->priv->http_proxy); + else + return NULL; +} + +static void +gst_webrtc_nice_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstWebRTCICE *ice = GST_WEBRTC_ICE (object); + GstWebRTCNice *nice = GST_WEBRTC_NICE (object); + + switch (prop_id) { + case PROP_ICE_TCP: + g_object_set_property (G_OBJECT (nice->priv->nice_agent), + "ice-tcp", value); + break; + case PROP_ICE_UDP: + g_object_set_property (G_OBJECT (nice->priv->nice_agent), + "ice-udp", value); + break; + case PROP_MIN_RTP_PORT: + ice->min_rtp_port = g_value_get_uint (value); + if (ice->min_rtp_port > ice->max_rtp_port) + g_warning ("Set min-rtp-port to %u which is larger than" + " max-rtp-port %u", ice->min_rtp_port, ice->max_rtp_port); + break; + case PROP_MAX_RTP_PORT: + ice->max_rtp_port = g_value_get_uint (value); + if (ice->min_rtp_port > ice->max_rtp_port) + g_warning ("Set max-rtp-port to %u which is smaller than" + " min-rtp-port %u", ice->max_rtp_port, ice->min_rtp_port); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_webrtc_nice_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstWebRTCICE *ice = GST_WEBRTC_ICE (object); + GstWebRTCNice *nice = GST_WEBRTC_NICE (object); + + switch (prop_id) { + case PROP_AGENT: + g_value_set_object (value, nice->priv->nice_agent); + break; + case PROP_ICE_TCP: + g_object_get_property (G_OBJECT (nice->priv->nice_agent), + "ice-tcp", value); + break; + case PROP_ICE_UDP: + g_object_get_property (G_OBJECT (nice->priv->nice_agent), + "ice-udp", value); + break; + case PROP_MIN_RTP_PORT: + g_value_set_uint (value, ice->min_rtp_port); + break; + case PROP_MAX_RTP_PORT: + g_value_set_uint (value, ice->max_rtp_port); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_webrtc_nice_finalize (GObject * object) +{ + GstWebRTCNice *ice = GST_WEBRTC_NICE (object); + + g_signal_handlers_disconnect_by_data (ice->priv->nice_agent, ice); + + _stop_thread (ice); + + if (ice->priv->on_candidate_notify) + ice->priv->on_candidate_notify (ice->priv->on_candidate_data); + ice->priv->on_candidate = NULL; + ice->priv->on_candidate_notify = NULL; + + if (ice->priv->turn_server) + gst_uri_unref (ice->priv->turn_server); + if (ice->priv->stun_server) + gst_uri_unref (ice->priv->stun_server); + if (ice->priv->http_proxy) + gst_uri_unref (ice->priv->http_proxy); + + g_mutex_clear (&ice->priv->lock); + g_cond_clear (&ice->priv->cond); + + g_array_free (ice->priv->nice_stream_map, TRUE); + + g_object_unref (ice->priv->nice_agent); + + g_hash_table_unref (ice->priv->turn_servers); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_webrtc_nice_constructed (GObject * object) +{ + GstWebRTCNice *ice = GST_WEBRTC_NICE (object); + NiceAgentOption options = 0; + + _start_thread (ice); + + options |= NICE_AGENT_OPTION_ICE_TRICKLE; + options |= NICE_AGENT_OPTION_REGULAR_NOMINATION; + + ice->priv->nice_agent = nice_agent_new_full (ice->priv->main_context, + NICE_COMPATIBILITY_RFC5245, options); + g_signal_connect (ice->priv->nice_agent, "new-candidate-full", + G_CALLBACK (_on_new_candidate), ice); + + G_OBJECT_CLASS (parent_class)->constructed (object); +} + +static void +gst_webrtc_nice_class_init (GstWebRTCNiceClass * klass) +{ + GstWebRTCICEClass *gst_webrtc_ice_class = GST_WEBRTC_ICE_CLASS (klass); + GObjectClass *gobject_class = (GObjectClass *) klass; + + // override virtual functions + gst_webrtc_ice_class->add_candidate = gst_webrtc_nice_add_candidate; + gst_webrtc_ice_class->add_stream = gst_webrtc_nice_add_stream; + gst_webrtc_ice_class->add_turn_server = gst_webrtc_nice_add_turn_server; + gst_webrtc_ice_class->find_transport = gst_webrtc_nice_find_transport; + gst_webrtc_ice_class->gather_candidates = gst_webrtc_nice_gather_candidates; + gst_webrtc_ice_class->get_is_controller = gst_webrtc_nice_get_is_controller; + gst_webrtc_ice_class->get_stun_server = gst_webrtc_nice_get_stun_server; + gst_webrtc_ice_class->get_turn_server = gst_webrtc_nice_get_turn_server; + gst_webrtc_ice_class->get_http_proxy = gst_webrtc_nice_get_http_proxy; + gst_webrtc_ice_class->set_force_relay = gst_webrtc_nice_set_force_relay; + gst_webrtc_ice_class->set_is_controller = gst_webrtc_nice_set_is_controller; + gst_webrtc_ice_class->set_local_credentials = + gst_webrtc_nice_set_local_credentials; + gst_webrtc_ice_class->set_remote_credentials = + gst_webrtc_nice_set_remote_credentials; + gst_webrtc_ice_class->set_stun_server = gst_webrtc_nice_set_stun_server; + gst_webrtc_ice_class->set_tos = gst_webrtc_nice_set_tos; + gst_webrtc_ice_class->set_turn_server = gst_webrtc_nice_set_turn_server; + gst_webrtc_ice_class->set_http_proxy = gst_webrtc_nice_set_http_proxy; + gst_webrtc_ice_class->set_on_ice_candidate = + gst_webrtc_nice_set_on_ice_candidate; + gst_webrtc_ice_class->get_local_candidates = + gst_webrtc_nice_get_local_candidates; + gst_webrtc_ice_class->get_remote_candidates = + gst_webrtc_nice_get_remote_candidates; + gst_webrtc_ice_class->get_selected_pair = gst_webrtc_nice_get_selected_pair; + + gobject_class->constructed = gst_webrtc_nice_constructed; + gobject_class->get_property = gst_webrtc_nice_get_property; + gobject_class->set_property = gst_webrtc_nice_set_property; + gobject_class->finalize = gst_webrtc_nice_finalize; + + g_object_class_install_property (gobject_class, + PROP_AGENT, + g_param_spec_object ("agent", "ICE agent", + "ICE agent in use by this object. WARNING! Accessing this property " + "may have disastrous consequences for the operation of webrtcbin. " + "Other ICE implementations may not have the same interface.", + NICE_TYPE_AGENT, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_ICE_TCP, + g_param_spec_boolean ("ice-tcp", "ICE TCP", + "Whether the agent should use ICE-TCP when gathering candidates", + TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_ICE_UDP, + g_param_spec_boolean ("ice-udp", "ICE UDP", + "Whether the agent should use ICE-UDP when gathering candidates", + TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_signal_override_class_handler ("add-local-ip-address", + G_TYPE_FROM_CLASS (klass), + G_CALLBACK (gst_webrtc_nice_add_local_ip_address)); +} + +static void +gst_webrtc_nice_init (GstWebRTCNice * ice) +{ + ice->priv = gst_webrtc_nice_get_instance_private (ice); + + g_mutex_init (&ice->priv->lock); + g_cond_init (&ice->priv->cond); + + ice->priv->turn_servers = + g_hash_table_new_full (g_str_hash, g_str_equal, g_free, + (GDestroyNotify) gst_uri_unref); + + ice->priv->nice_stream_map = + g_array_new (FALSE, TRUE, sizeof (struct NiceStreamItem)); + g_array_set_clear_func (ice->priv->nice_stream_map, + (GDestroyNotify) _clear_ice_stream); +} + +GstWebRTCNice * +gst_webrtc_nice_new (const gchar * name) +{ + return g_object_new (GST_TYPE_WEBRTC_NICE, "name", name, NULL); +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/nice/nice.h
Added
@@ -0,0 +1,67 @@ +/* GStreamer + * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_WEBRTC_NICE_H__ +#define __GST_WEBRTC_NICE_H__ + +#include "gst/webrtc/ice.h" + +#include "nicestream.h" +#include "nicetransport.h" + +#include "nice_fwd.h" + +G_BEGIN_DECLS + +GST_WEBRTCNICE_API +GType gst_webrtc_nice_get_type(void); +#define GST_TYPE_WEBRTC_NICE (gst_webrtc_nice_get_type()) +#define GST_WEBRTC_NICE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WEBRTC_NICE,GstWebRTCNice)) +#define GST_IS_WEBRTC_NICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WEBRTC_NICE)) +#define GST_WEBRTC_NICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_WEBRTC_NICE,GstWebRTCNiceClass)) +#define GST_IS_WEBRTC_NICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_WEBRTC_NICE)) +#define GST_WEBRTC_NICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_NICE,GstWebRTCNiceClass)) + +/** + * GstWebRTCNice: + */ +typedef struct _GstWebRTCNice GstWebRTCNice; +typedef struct _GstWebRTCNiceClass GstWebRTCNiceClass; +typedef struct _GstWebRTCNicePrivate GstWebRTCNicePrivate; + +struct _GstWebRTCNice +{ + GstWebRTCICE parent; + GstWebRTCNicePrivate *priv; + +}; + +struct _GstWebRTCNiceClass +{ + GstWebRTCICEClass parent_class; +}; + +GST_WEBRTCNICE_API +GstWebRTCNice * gst_webrtc_nice_new (const gchar * name); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstWebRTCNice, gst_object_unref) + +G_END_DECLS + +#endif /* __GST_WEBRTC_NICE_H__ */ \ No newline at end of file
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/nice/nice_fwd.h
Added
@@ -0,0 +1,17 @@ +#ifndef __GST_WEBRTCNICE_FWD_H__ +#define __GST_WEBRTCNICE_FWD_H__ + +#ifndef GST_USE_UNSTABLE_API +#warning "The GstWebRTCNice library from gst-plugins-bad is unstable API and may change in future." +#warning "You can define GST_USE_UNSTABLE_API to avoid this warning." +#endif + +#ifndef GST_WEBRTCNICE_API +# ifdef BUILDING_GST_WEBRTCNICE +# define GST_WEBRTCNICE_API GST_API_EXPORT /* from config.h */ +# else +# define GST_WEBRTCNICE_API GST_API_IMPORT +# endif +#endif + +#endif /* __GST_WEBRTCNICE_FWD_H__ */ \ No newline at end of file
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/nice/nicestream.c
Added
@@ -0,0 +1,334 @@ +/* GStreamer + * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "nicestream.h" +#include "nicetransport.h" + +#define GST_CAT_DEFAULT gst_webrtc_nice_stream_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +enum +{ + PROP_0, + PROP_ICE, +}; + +struct _GstWebRTCNiceStreamPrivate +{ + gboolean gathered; + GList *transports; + gboolean gathering_started; + gulong candidate_gathering_done_id; + GWeakRef ice_weak; +}; + +#define gst_webrtc_nice_stream_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstWebRTCNiceStream, gst_webrtc_nice_stream, + GST_TYPE_WEBRTC_ICE_STREAM, G_ADD_PRIVATE (GstWebRTCNiceStream) + GST_DEBUG_CATEGORY_INIT (gst_webrtc_nice_stream_debug, + "webrtcnicestream", 0, "webrtcnicestream");); + +static void +gst_webrtc_nice_stream_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstWebRTCNiceStream *stream = GST_WEBRTC_NICE_STREAM (object); + + switch (prop_id) { + case PROP_ICE: + g_weak_ref_set (&stream->priv->ice_weak, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_webrtc_nice_stream_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstWebRTCNiceStream *stream = GST_WEBRTC_NICE_STREAM (object); + + switch (prop_id) { + case PROP_ICE: + g_value_take_object (value, g_weak_ref_get (&stream->priv->ice_weak)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GWeakRef * +weak_new (gpointer object) +{ + GWeakRef *weak = g_new0 (GWeakRef, 1); + g_weak_ref_init (weak, object); + return weak; +} + +static void +weak_free (GWeakRef * weak) +{ + g_weak_ref_clear (weak); + g_free (weak); +} + +static void +gst_webrtc_nice_stream_finalize (GObject * object) +{ + GstWebRTCNiceStream *stream = GST_WEBRTC_NICE_STREAM (object); + GstWebRTCNice *ice = g_weak_ref_get (&stream->priv->ice_weak); + + if (ice) { + NiceAgent *agent; + g_object_get (ice, "agent", &agent, NULL); + + if (stream->priv->candidate_gathering_done_id != 0) { + g_signal_handler_disconnect (agent, + stream->priv->candidate_gathering_done_id); + } + + g_object_unref (agent); + gst_object_unref (ice); + } + + g_list_foreach (stream->priv->transports, (GFunc) weak_free, NULL); + g_list_free (stream->priv->transports); + stream->priv->transports = NULL; + + g_weak_ref_clear (&stream->priv->ice_weak); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GList * +_delete_transport (GList ** transports, GList * link) +{ + GList *next = link->next; + weak_free (link->data); + *transports = g_list_delete_link (*transports, link); + return next; +} + +static void +_on_candidate_gathering_done (NiceAgent * agent, guint stream_id, + GWeakRef * ice_weak) +{ + GstWebRTCNiceStream *ice = g_weak_ref_get (ice_weak); + GList *l; + + if (!ice) + return; + + if (stream_id != GST_WEBRTC_ICE_STREAM (ice)->stream_id) + goto cleanup; + + GST_DEBUG_OBJECT (ice, "%u gathering done", stream_id); + + ice->priv->gathered = TRUE; + + for (l = ice->priv->transports; l; l = l->next) { + GstWebRTCICETransport *trans = g_weak_ref_get (l->data); + + if (trans) { + gst_webrtc_ice_transport_gathering_state_change (trans, + GST_WEBRTC_ICE_GATHERING_STATE_COMPLETE); + g_object_unref (trans); + } else { + l = _delete_transport (&ice->priv->transports, l); + } + } + +cleanup: + gst_object_unref (ice); +} + +static GstWebRTCICETransport * +gst_webrtc_nice_stream_find_transport (GstWebRTCICEStream * stream, + GstWebRTCICEComponent component) +{ + GstWebRTCICEComponent trans_comp; + GstWebRTCICETransport *ret; + GList *l; + GstWebRTCNiceStream *nice_stream = GST_WEBRTC_NICE_STREAM (stream); + + for (l = nice_stream->priv->transports; l; l = l->next) { + GstWebRTCICETransport *trans = g_weak_ref_get (l->data); + if (trans) { + g_object_get (trans, "component", &trans_comp, NULL); + + if (component == trans_comp) + return trans; + else + gst_object_unref (trans); + } else { + l = _delete_transport (&nice_stream->priv->transports, l); + } + } + + ret = + GST_WEBRTC_ICE_TRANSPORT (gst_webrtc_nice_transport_new (nice_stream, + component)); + nice_stream->priv->transports = + g_list_prepend (nice_stream->priv->transports, weak_new (ret)); + + return ret; +} + +static void +gst_webrtc_nice_stream_constructed (GObject * object) +{ + GstWebRTCNiceStream *stream; + NiceAgent *agent; + GstWebRTCNice *ice; + + G_OBJECT_CLASS (parent_class)->constructed (object); + + stream = GST_WEBRTC_NICE_STREAM (object); + ice = g_weak_ref_get (&stream->priv->ice_weak); + + + g_assert (ice != NULL); + g_object_get (ice, "agent", &agent, NULL); + stream->priv->candidate_gathering_done_id = g_signal_connect_data (agent, + "candidate-gathering-done", G_CALLBACK (_on_candidate_gathering_done), + weak_new (stream), (GClosureNotify) weak_free, (GConnectFlags) 0); + + g_object_unref (agent); + gst_object_unref (ice); +} + +static gboolean +gst_webrtc_nice_stream_gather_candidates (GstWebRTCICEStream * stream) +{ + NiceAgent *agent; + GList *l; + GstWebRTCICE *ice; + gboolean ret = TRUE; + GstWebRTCNiceStream *nice_stream = GST_WEBRTC_NICE_STREAM (stream); + + GST_DEBUG_OBJECT (nice_stream, "start gathering candidates"); + + if (nice_stream->priv->gathered) + return TRUE; + + for (l = nice_stream->priv->transports; l; l = l->next) { + GstWebRTCICETransport *trans = g_weak_ref_get (l->data); + + if (trans) { + gst_webrtc_ice_transport_gathering_state_change (trans, + GST_WEBRTC_ICE_GATHERING_STATE_GATHERING); + g_object_unref (trans); + } else { + l = _delete_transport (&nice_stream->priv->transports, l); + } + } + + ice = GST_WEBRTC_ICE (g_weak_ref_get (&nice_stream->priv->ice_weak)); + g_assert (ice != NULL); + + g_object_get (ice, "agent", &agent, NULL); + + if (!nice_stream->priv->gathering_started) { + if (ice->min_rtp_port != 0 || ice->max_rtp_port != 65535) { + if (ice->min_rtp_port > ice->max_rtp_port) { + GST_ERROR_OBJECT (ice, + "invalid port range: min-rtp-port %d must be <= max-rtp-port %d", + ice->min_rtp_port, ice->max_rtp_port); + ret = FALSE; + goto cleanup; + } + + nice_agent_set_port_range (agent, stream->stream_id, + NICE_COMPONENT_TYPE_RTP, ice->min_rtp_port, ice->max_rtp_port); + } + /* mark as gathering started to prevent changing ports again */ + nice_stream->priv->gathering_started = TRUE; + } + + if (!nice_agent_gather_candidates (agent, stream->stream_id)) { + ret = FALSE; + goto cleanup; + } + + for (l = nice_stream->priv->transports; l; l = l->next) { + GstWebRTCNiceTransport *trans = g_weak_ref_get (l->data); + + if (trans) { + gst_webrtc_nice_transport_update_buffer_size (trans); + g_object_unref (trans); + } else { + l = _delete_transport (&nice_stream->priv->transports, l); + } + } + +cleanup: + if (agent) + g_object_unref (agent); + if (ice) + gst_object_unref (ice); + + return ret; +} + +static void +gst_webrtc_nice_stream_class_init (GstWebRTCNiceStreamClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GstWebRTCICEStreamClass *gst_webrtc_ice_stream_class = + GST_WEBRTC_ICE_STREAM_CLASS (klass); + + gst_webrtc_ice_stream_class->find_transport = + gst_webrtc_nice_stream_find_transport; + gst_webrtc_ice_stream_class->gather_candidates = + gst_webrtc_nice_stream_gather_candidates; + + gobject_class->constructed = gst_webrtc_nice_stream_constructed; + gobject_class->get_property = gst_webrtc_nice_stream_get_property; + gobject_class->set_property = gst_webrtc_nice_stream_set_property; + gobject_class->finalize = gst_webrtc_nice_stream_finalize; + + g_object_class_install_property (gobject_class, + PROP_ICE, + g_param_spec_object ("ice", + "ICE", "ICE agent associated with this stream", + GST_TYPE_WEBRTC_ICE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_webrtc_nice_stream_init (GstWebRTCNiceStream * stream) +{ + stream->priv = gst_webrtc_nice_stream_get_instance_private (stream); + + g_weak_ref_init (&stream->priv->ice_weak, NULL); +} + +GstWebRTCNiceStream * +gst_webrtc_nice_stream_new (GstWebRTCICE * ice, guint stream_id) +{ + return g_object_new (GST_TYPE_WEBRTC_NICE_STREAM, "ice", ice, + "stream-id", stream_id, NULL); +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/nice/nicestream.h
Added
@@ -0,0 +1,63 @@ +/* GStreamer + * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_WEBRTC_NICE_STREAM_H__ +#define __GST_WEBRTC_NICE_STREAM_H__ + +#include "gst/webrtc/icestream.h" + +#include "nice_fwd.h" + +G_BEGIN_DECLS + +GST_WEBRTCNICE_API +GType gst_webrtc_nice_stream_get_type(void); +#define GST_TYPE_WEBRTC_NICE_STREAM (gst_webrtc_nice_stream_get_type()) +#define GST_WEBRTC_NICE_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WEBRTC_NICE_STREAM,GstWebRTCNiceStream)) +#define GST_IS_WEBRTC_NICE_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WEBRTC_NICE_STREAM)) +#define GST_WEBRTC_NICE_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_WEBRTC_NICE_STREAM,GstWebRTCNiceStreamClass)) +#define GST_IS_WEBRTC_NICE_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_WEBRTC_NICE_STREAM)) +#define GST_WEBRTC_NICE_STREAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_NICE_STREAM,GstWebRTCNiceStreamClass)) + +/** + * GstWebRTCNiceStream: + */ +typedef struct _GstWebRTCNiceStream GstWebRTCNiceStream; +typedef struct _GstWebRTCNiceStreamClass GstWebRTCNiceStreamClass; +typedef struct _GstWebRTCNiceStreamPrivate GstWebRTCNiceStreamPrivate; + +struct _GstWebRTCNiceStream +{ + GstWebRTCICEStream parent; + GstWebRTCNiceStreamPrivate *priv; +}; + +struct _GstWebRTCNiceStreamClass +{ + GstWebRTCICEStreamClass parent_class; +}; + +GstWebRTCNiceStream * gst_webrtc_nice_stream_new (GstWebRTCICE * ice, + guint stream_id); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstWebRTCNiceStream, gst_object_unref) + +G_END_DECLS + +#endif /* __GST_WEBRTC_NICE_STREAM_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/nice/nicetransport.c
Added
@@ -0,0 +1,426 @@ +/* GStreamer + * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "nicestream.h" +#include "nicetransport.h" + +#define GST_CAT_DEFAULT gst_webrtc_nice_transport_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +enum +{ + SIGNAL_0, + LAST_SIGNAL, +}; + +enum +{ + PROP_0, + PROP_STREAM, + PROP_SEND_BUFFER_SIZE, + PROP_RECEIVE_BUFFER_SIZE +}; + +//static guint gst_webrtc_nice_transport_signalsLAST_SIGNAL = { 0 }; + +struct _GstWebRTCNiceTransportPrivate +{ + gboolean running; + + gint send_buffer_size; + gint receive_buffer_size; + gulong on_new_selected_pair_id; + gulong on_component_state_changed_id; +}; + +#define gst_webrtc_nice_transport_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstWebRTCNiceTransport, gst_webrtc_nice_transport, + GST_TYPE_WEBRTC_ICE_TRANSPORT, G_ADD_PRIVATE (GstWebRTCNiceTransport) + GST_DEBUG_CATEGORY_INIT (gst_webrtc_nice_transport_debug, + "webrtcnicetransport", 0, "webrtcnicetransport"); + ); + +static NiceComponentType +_gst_component_to_nice (GstWebRTCICEComponent component) +{ + switch (component) { + case GST_WEBRTC_ICE_COMPONENT_RTP: + return NICE_COMPONENT_TYPE_RTP; + case GST_WEBRTC_ICE_COMPONENT_RTCP: + return NICE_COMPONENT_TYPE_RTCP; + default: + g_assert_not_reached (); + return 0; + } +} + +static GstWebRTCICEComponent +_nice_component_to_gst (NiceComponentType component) +{ + switch (component) { + case NICE_COMPONENT_TYPE_RTP: + return GST_WEBRTC_ICE_COMPONENT_RTP; + case NICE_COMPONENT_TYPE_RTCP: + return GST_WEBRTC_ICE_COMPONENT_RTCP; + default: + g_assert_not_reached (); + return 0; + } +} + +static GstWebRTCICEConnectionState +_nice_component_state_to_gst (NiceComponentState state) +{ + switch (state) { + case NICE_COMPONENT_STATE_DISCONNECTED: + return GST_WEBRTC_ICE_CONNECTION_STATE_DISCONNECTED; + case NICE_COMPONENT_STATE_GATHERING: + return GST_WEBRTC_ICE_CONNECTION_STATE_NEW; + case NICE_COMPONENT_STATE_CONNECTING: + return GST_WEBRTC_ICE_CONNECTION_STATE_CHECKING; + case NICE_COMPONENT_STATE_CONNECTED: + return GST_WEBRTC_ICE_CONNECTION_STATE_CONNECTED; + case NICE_COMPONENT_STATE_READY: + return GST_WEBRTC_ICE_CONNECTION_STATE_COMPLETED; + case NICE_COMPONENT_STATE_FAILED: + return GST_WEBRTC_ICE_CONNECTION_STATE_FAILED; + default: + g_assert_not_reached (); + return 0; + } +} + +static void +gst_webrtc_nice_transport_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstWebRTCNiceTransport *nice = GST_WEBRTC_NICE_TRANSPORT (object); + + switch (prop_id) { + case PROP_STREAM: + if (nice->stream) + gst_object_unref (nice->stream); + nice->stream = g_value_dup_object (value); + break; + case PROP_SEND_BUFFER_SIZE: + nice->priv->send_buffer_size = g_value_get_int (value); + gst_webrtc_nice_transport_update_buffer_size (nice); + break; + case PROP_RECEIVE_BUFFER_SIZE: + nice->priv->receive_buffer_size = g_value_get_int (value); + gst_webrtc_nice_transport_update_buffer_size (nice); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_webrtc_nice_transport_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstWebRTCNiceTransport *nice = GST_WEBRTC_NICE_TRANSPORT (object); + + switch (prop_id) { + case PROP_STREAM: + g_value_set_object (value, nice->stream); + break; + case PROP_SEND_BUFFER_SIZE: + g_value_set_int (value, nice->priv->send_buffer_size); + break; + case PROP_RECEIVE_BUFFER_SIZE: + g_value_set_int (value, nice->priv->receive_buffer_size); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_webrtc_nice_transport_finalize (GObject * object) +{ + GstWebRTCNiceTransport *nice = GST_WEBRTC_NICE_TRANSPORT (object); + NiceAgent *agent; + GstWebRTCNice *webrtc_ice = NULL; + + g_object_get (nice->stream, "ice", &webrtc_ice, NULL); + + if (webrtc_ice) { + g_object_get (webrtc_ice, "agent", &agent, NULL); + + if (nice->priv->on_component_state_changed_id != 0) { + g_signal_handler_disconnect (agent, + nice->priv->on_component_state_changed_id); + } + + if (nice->priv->on_new_selected_pair_id != 0) { + g_signal_handler_disconnect (agent, nice->priv->on_new_selected_pair_id); + } + + g_object_unref (agent); + gst_object_unref (webrtc_ice); + } + + gst_object_unref (nice->stream); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +void +gst_webrtc_nice_transport_update_buffer_size (GstWebRTCNiceTransport * nice) +{ + NiceAgent *agent = NULL; + GPtrArray *sockets; + guint i; + GstWebRTCNice *webrtc_ice = NULL; + + g_object_get (nice->stream, "ice", &webrtc_ice, NULL); + + g_assert (webrtc_ice != NULL); + + g_object_get (webrtc_ice, "agent", &agent, NULL); + g_assert (agent != NULL); + + sockets = + nice_agent_get_sockets (agent, + GST_WEBRTC_ICE_STREAM (nice->stream)->stream_id, 1); + if (sockets == NULL) { + g_object_unref (agent); + gst_object_unref (webrtc_ice); + return; + } + + for (i = 0; i < sockets->len; i++) { + GSocket *gsocket = g_ptr_array_index (sockets, i); +#ifdef SO_SNDBUF + if (nice->priv->send_buffer_size != 0) { + GError *gerror = NULL; + if (!g_socket_set_option (gsocket, SOL_SOCKET, SO_SNDBUF, + nice->priv->send_buffer_size, &gerror)) + GST_WARNING_OBJECT (nice, "Could not set send buffer size : %s", + gerror->message); + g_clear_error (&gerror); + } +#endif +#ifdef SO_RCVBUF + if (nice->priv->receive_buffer_size != 0) { + GError *gerror = NULL; + if (!g_socket_set_option (gsocket, SOL_SOCKET, SO_RCVBUF, + nice->priv->receive_buffer_size, &gerror)) + GST_WARNING_OBJECT (nice, "Could not set send receive size : %s", + gerror->message); + g_clear_error (&gerror); + } +#endif + } + g_ptr_array_unref (sockets); + g_object_unref (agent); + gst_object_unref (webrtc_ice); +} + + +static void +_on_new_selected_pair (NiceAgent * agent, guint stream_id, + NiceComponentType component, NiceCandidate * lcandidate, + NiceCandidate * rcandidate, GWeakRef * nice_weak) +{ + GstWebRTCNiceTransport *nice = g_weak_ref_get (nice_weak); + GstWebRTCICETransport *ice; + GstWebRTCICEComponent comp = _nice_component_to_gst (component); + guint our_stream_id; + + if (!nice) + return; + + ice = GST_WEBRTC_ICE_TRANSPORT (nice); + + g_object_get (nice->stream, "stream-id", &our_stream_id, NULL); + + if (stream_id != our_stream_id) + goto cleanup; + if (comp != ice->component) + goto cleanup; + + gst_webrtc_ice_transport_selected_pair_change (ice); + +cleanup: + gst_object_unref (nice); +} + +static void +_on_component_state_changed (NiceAgent * agent, guint stream_id, + NiceComponentType component, NiceComponentState state, GWeakRef * nice_weak) +{ + GstWebRTCNiceTransport *nice = g_weak_ref_get (nice_weak); + GstWebRTCICETransport *ice; + GstWebRTCICEComponent comp = _nice_component_to_gst (component); + guint our_stream_id; + + if (!nice) + return; + + ice = GST_WEBRTC_ICE_TRANSPORT (nice); + + g_object_get (nice->stream, "stream-id", &our_stream_id, NULL); + + if (stream_id != our_stream_id) + goto cleanup; + if (comp != ice->component) + goto cleanup; + + GST_DEBUG_OBJECT (ice, "%u %u %s", stream_id, component, + nice_component_state_to_string (state)); + + gst_webrtc_ice_transport_connection_state_change (ice, + _nice_component_state_to_gst (state)); + +cleanup: + gst_object_unref (nice); +} + +static GWeakRef * +weak_new (GstWebRTCNiceTransport * nice) +{ + GWeakRef *weak = g_new0 (GWeakRef, 1); + g_weak_ref_init (weak, nice); + return weak; +} + +static void +weak_free (GWeakRef * weak) +{ + g_weak_ref_clear (weak); + g_free (weak); +} + +static void +gst_webrtc_nice_transport_constructed (GObject * object) +{ + GstWebRTCNiceTransport *nice; + GstWebRTCICETransport *ice; + NiceComponentType component; + gboolean controlling_mode; + guint our_stream_id; + NiceAgent *agent; + GstWebRTCNice *webrtc_ice = NULL; + + G_OBJECT_CLASS (parent_class)->constructed (object); + + nice = GST_WEBRTC_NICE_TRANSPORT (object); + ice = GST_WEBRTC_ICE_TRANSPORT (object); + component = _gst_component_to_nice (ice->component); + + g_object_get (nice->stream, "ice", &webrtc_ice, "stream-id", &our_stream_id, + NULL); + g_assert (webrtc_ice != NULL); + g_object_get (webrtc_ice, "agent", &agent, NULL); + + g_object_get (agent, "controlling-mode", &controlling_mode, NULL); + ice->role = + controlling_mode ? GST_WEBRTC_ICE_ROLE_CONTROLLING : + GST_WEBRTC_ICE_ROLE_CONTROLLED; + + nice->priv->on_component_state_changed_id = g_signal_connect_data (agent, + "component-state-changed", G_CALLBACK (_on_component_state_changed), + weak_new (nice), (GClosureNotify) weak_free, (GConnectFlags) 0); + nice->priv->on_new_selected_pair_id = g_signal_connect_data (agent, + "new-selected-pair-full", G_CALLBACK (_on_new_selected_pair), + weak_new (nice), (GClosureNotify) weak_free, (GConnectFlags) 0); + + ice->src = gst_element_factory_make ("nicesrc", NULL); + if (ice->src) { + g_object_set (ice->src, "agent", agent, "stream", our_stream_id, + "component", component, NULL); + } + ice->sink = gst_element_factory_make ("nicesink", NULL); + if (ice->sink) { + g_object_set (ice->sink, "agent", agent, "stream", our_stream_id, + "component", component, "async", FALSE, "enable-last-sample", FALSE, + "sync", FALSE, NULL); + } + + g_object_unref (agent); + gst_object_unref (webrtc_ice); +} + +static void +gst_webrtc_nice_transport_class_init (GstWebRTCNiceTransportClass * klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->constructed = gst_webrtc_nice_transport_constructed; + gobject_class->get_property = gst_webrtc_nice_transport_get_property; + gobject_class->set_property = gst_webrtc_nice_transport_set_property; + gobject_class->finalize = gst_webrtc_nice_transport_finalize; + + g_object_class_install_property (gobject_class, + PROP_STREAM, + g_param_spec_object ("stream", + "WebRTC ICE Stream", "ICE stream associated with this transport", + GST_TYPE_WEBRTC_NICE_STREAM, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * GstWebRTCNiceTransport:send-buffer-size: + * + * Size of the kernel send buffer in bytes, 0=default + * + * Since: 1.20 + */ + + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_SEND_BUFFER_SIZE, g_param_spec_int ("send-buffer-size", + "Send Buffer Size", + "Size of the kernel send buffer in bytes, 0=default", 0, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstWebRTCNiceTransport:receive-buffer-size: + * + * Size of the kernel receive buffer in bytes, 0=default + * + * Since: 1.20 + */ + + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_RECEIVE_BUFFER_SIZE, g_param_spec_int ("receive-buffer-size", + "Receive Buffer Size", + "Size of the kernel receive buffer in bytes, 0=default", 0, G_MAXINT, + 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_webrtc_nice_transport_init (GstWebRTCNiceTransport * nice) +{ + nice->priv = gst_webrtc_nice_transport_get_instance_private (nice); +} + +GstWebRTCNiceTransport * +gst_webrtc_nice_transport_new (GstWebRTCNiceStream * stream, + GstWebRTCICEComponent component) +{ + return g_object_new (GST_TYPE_WEBRTC_NICE_TRANSPORT, "stream", stream, + "component", component, NULL); +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/nice/nicetransport.h
Added
@@ -0,0 +1,71 @@ +/* GStreamer + * Copyright (C) 2017 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_WEBRTC_NICE_TRANSPORT_H__ +#define __GST_WEBRTC_NICE_TRANSPORT_H__ + +#include "nice.h" +#include "gst/webrtc/icetransport.h" +/* libnice */ +#include <agent.h> + +#include "nice_fwd.h" + +G_BEGIN_DECLS + +GST_WEBRTCNICE_API +GType gst_webrtc_nice_transport_get_type(void); +#define GST_TYPE_WEBRTC_NICE_TRANSPORT (gst_webrtc_nice_transport_get_type()) +#define GST_WEBRTC_NICE_TRANSPORT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WEBRTC_NICE_TRANSPORT,GstWebRTCNiceTransport)) +#define GST_IS_WEBRTC_NICE_TRANSPORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WEBRTC_NICE_TRANSPORT)) +#define GST_WEBRTC_NICE_TRANSPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_WEBRTC_NICE_TRANSPORT,GstWebRTCNiceTransportClass)) +#define GST_IS_WEBRTC_NICE_TRANSPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_WEBRTC_NICE_TRANSPORT)) +#define GST_WEBRTC_NICE_TRANSPORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_WEBRTC_NICE_TRANSPORT,GstWebRTCNiceTransportClass)) + +/** + * GstWebRTCNiceTransport: + */ +typedef struct _GstWebRTCNiceTransport GstWebRTCNiceTransport; +typedef struct _GstWebRTCNiceTransportClass GstWebRTCNiceTransportClass; +typedef struct _GstWebRTCNiceTransportPrivate GstWebRTCNiceTransportPrivate; + +struct _GstWebRTCNiceTransport +{ + GstWebRTCICETransport parent; + + GstWebRTCNiceStream *stream; + + GstWebRTCNiceTransportPrivate *priv; +}; + +struct _GstWebRTCNiceTransportClass +{ + GstWebRTCICETransportClass parent_class; +}; + +GstWebRTCNiceTransport * gst_webrtc_nice_transport_new (GstWebRTCNiceStream * stream, + GstWebRTCICEComponent component); + +void gst_webrtc_nice_transport_update_buffer_size (GstWebRTCNiceTransport * nice); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstWebRTCNiceTransport, gst_object_unref) + +G_END_DECLS + +#endif /* __GST_WEBRTC_NICE_TRANSPORT_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/webrtc/rtpreceiver.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/rtpreceiver.c
Changed
@@ -22,6 +22,8 @@ * @short_description: RTCRtpReceiver object * @title: GstWebRTCRTPReceiver * @see_also: #GstWebRTCRTPSender, #GstWebRTCRTPTransceiver + * @symbols: + * - GstWebRTCRTPReceiver * * <https://www.w3.org/TR/webrtc/#rtcrtpreceiver-interface> */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/webrtc/rtpsender.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/rtpsender.c
Changed
@@ -22,6 +22,8 @@ * @short_description: RTCRtpSender object * @title: GstWebRTCRTPSender * @see_also: #GstWebRTCRTPReceiver, #GstWebRTCRTPTransceiver + * @symbols: + * - GstWebRTCRTPSender * * <https://www.w3.org/TR/webrtc/#rtcrtpsender-interface> */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/webrtc/rtptransceiver.c -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/rtptransceiver.c
Changed
@@ -22,6 +22,8 @@ * @short_description: RTCRtpTransceiver object * @title: GstWebRTCRTPTransceiver * @see_also: #GstWebRTCRTPSender, #GstWebRTCRTPReceiver + * @symbols: + * - GstWebRTCRTPTransceiver * * <https://www.w3.org/TR/webrtc/#rtcrtptransceiver-interface> */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/webrtc/webrtc-priv.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/webrtc-priv.h
Changed
@@ -152,47 +152,6 @@ GST_WEBRTC_API GstWebRTCRTPReceiver * gst_webrtc_rtp_receiver_new (void); - -/** - * GstWebRTCICETransport: - */ -struct _GstWebRTCICETransport -{ - GstObject parent; - - GstWebRTCICERole role; - GstWebRTCICEComponent component; - - GstWebRTCICEConnectionState state; - GstWebRTCICEGatheringState gathering_state; - - /* Filled by subclasses */ - GstElement *src; - GstElement *sink; - - gpointer _paddingGST_PADDING; -}; - -struct _GstWebRTCICETransportClass -{ - GstObjectClass parent_class; - - gboolean (*gather_candidates) (GstWebRTCICETransport * transport); - - gpointer _paddingGST_PADDING; -}; - -GST_WEBRTC_API -void gst_webrtc_ice_transport_connection_state_change (GstWebRTCICETransport * ice, - GstWebRTCICEConnectionState new_state); -GST_WEBRTC_API -void gst_webrtc_ice_transport_gathering_state_change (GstWebRTCICETransport * ice, - GstWebRTCICEGatheringState new_state); -GST_WEBRTC_API -void gst_webrtc_ice_transport_selected_pair_change (GstWebRTCICETransport * ice); -GST_WEBRTC_API -void gst_webrtc_ice_transport_new_candidate (GstWebRTCICETransport * ice, guint stream_id, GstWebRTCICEComponent component, gchar * attr); - /** * GstWebRTCDTLSTransport: */ @@ -263,8 +222,8 @@ { GObjectClass parent_class; - void (*send_data) (GstWebRTCDataChannel * channel, GBytes *data); - void (*send_string) (GstWebRTCDataChannel * channel, const gchar *str); + gboolean (*send_data) (GstWebRTCDataChannel * channel, GBytes *data, GError ** error); + gboolean (*send_string) (GstWebRTCDataChannel * channel, const gchar *str, GError ** error); void (*close) (GstWebRTCDataChannel * channel); gpointer _paddingGST_PADDING;
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/webrtc/webrtc.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/webrtc.h
Changed
@@ -24,6 +24,8 @@ #include <gst/webrtc/webrtc_fwd.h> #include <gst/webrtc/webrtc-enumtypes.h> #include <gst/webrtc/dtlstransport.h> +#include <gst/webrtc/ice.h> +#include <gst/webrtc/icestream.h> #include <gst/webrtc/icetransport.h> #include <gst/webrtc/rtcsessiondescription.h> #include <gst/webrtc/rtpreceiver.h>
View file
gst-plugins-bad-1.20.5.tar.xz/gst-libs/gst/webrtc/webrtc_fwd.h -> gst-plugins-bad-1.22.0.tar.xz/gst-libs/gst/webrtc/webrtc_fwd.h
Changed
@@ -40,6 +40,20 @@ # endif #endif +/** + * GST_WEBRTC_DEPRECATED: (attributes doc.skip=true) + */ +/** + * GST_WEBRTC_DEPRECATED_FOR: (attributes doc.skip=true) + */ +#ifndef GST_DISABLE_DEPRECATED +#define GST_WEBRTC_DEPRECATED GST_WEBRTC_API +#define GST_WEBRTC_DEPRECATED_FOR(f) GST_WEBRTC_API +#else +#define GST_WEBRTC_DEPRECATED G_DEPRECATED GST_WEBRTC_API +#define GST_WEBRTC_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) GST_WEBRTC_API +#endif + #include <gst/webrtc/webrtc-enumtypes.h> /** @@ -49,6 +63,29 @@ typedef struct _GstWebRTCDTLSTransportClass GstWebRTCDTLSTransportClass; /** + * GstWebRTCICE: + * + * Since: 1.22 + */ +typedef struct _GstWebRTCICE GstWebRTCICE; +typedef struct _GstWebRTCICEClass GstWebRTCICEClass; + +/** + * GstWebRTCICECandidateStats: + * + * Since: 1.22 + */ +typedef struct _GstWebRTCICECandidateStats GstWebRTCICECandidateStats; + +/** + * GstWebRTCICEStream: + * + * Since: 1.22 + */ +typedef struct _GstWebRTCICEStream GstWebRTCICEStream; +typedef struct _GstWebRTCICEStreamClass GstWebRTCICEStreamClass; + +/** * GstWebRTCICETransport: */ typedef struct _GstWebRTCICETransport GstWebRTCICETransport; @@ -271,7 +308,7 @@ * @GST_WEBRTC_STATS_REMOTE_INBOUND_RTP: remote-inbound-rtp * @GST_WEBRTC_STATS_REMOTE_OUTBOUND_RTP: remote-outbound-rtp * @GST_WEBRTC_STATS_CSRC: csrc - * @GST_WEBRTC_STATS_PEER_CONNECTION: peer-connectiion + * @GST_WEBRTC_STATS_PEER_CONNECTION: peer-connection * @GST_WEBRTC_STATS_DATA_CHANNEL: data-channel * @GST_WEBRTC_STATS_STREAM: stream * @GST_WEBRTC_STATS_TRANSPORT: transport @@ -279,6 +316,8 @@ * @GST_WEBRTC_STATS_LOCAL_CANDIDATE: local-candidate * @GST_WEBRTC_STATS_REMOTE_CANDIDATE: remote-candidate * @GST_WEBRTC_STATS_CERTIFICATE: certificate + * + * See <https://w3c.github.io/webrtc-stats/#dom-rtcstatstype> */ typedef enum /*< underscore_name=gst_webrtc_stats_type >*/ { @@ -351,8 +390,7 @@ /** * GstWebRTCDataChannelState: - * @GST_WEBRTC_DATA_CHANNEL_STATE_NEW: new - * @GST_WEBRTC_DATA_CHANNEL_STATE_CONNECTING: connection + * @GST_WEBRTC_DATA_CHANNEL_STATE_CONNECTING: connecting * @GST_WEBRTC_DATA_CHANNEL_STATE_OPEN: open * @GST_WEBRTC_DATA_CHANNEL_STATE_CLOSING: closing * @GST_WEBRTC_DATA_CHANNEL_STATE_CLOSED: closed @@ -363,8 +401,7 @@ */ typedef enum /*< underscore_name=gst_webrtc_data_channel_state >*/ { - GST_WEBRTC_DATA_CHANNEL_STATE_NEW, - GST_WEBRTC_DATA_CHANNEL_STATE_CONNECTING, + GST_WEBRTC_DATA_CHANNEL_STATE_CONNECTING = 1, GST_WEBRTC_DATA_CHANNEL_STATE_OPEN, GST_WEBRTC_DATA_CHANNEL_STATE_CLOSING, GST_WEBRTC_DATA_CHANNEL_STATE_CLOSED, @@ -450,6 +487,20 @@ * * Since: 1.20 */ +/** + * GST_WEBRTC_ERROR_INVALID_MODIFICATION: + * + * invalid-modification (part of WebIDL specification) + * + * Since: 1.22 + */ +/** + * GST_WEBRTC_ERROR_TYPE_ERROR: + * + * type-error (maps to JavaScript TypeError) + * + * Since: 1.22 + */ typedef enum /*<underscore_name=gst_webrtc_error>*/ { GST_WEBRTC_ERROR_DATA_CHANNEL_FAILURE, @@ -460,8 +511,9 @@ GST_WEBRTC_ERROR_HARDWARE_ENCODER_NOT_AVAILABLE, GST_WEBRTC_ERROR_ENCODER_ERROR, GST_WEBRTC_ERROR_INVALID_STATE, - GST_WEBRTC_ERROR_INTERNAL_FAILURE + GST_WEBRTC_ERROR_INTERNAL_FAILURE, + GST_WEBRTC_ERROR_INVALID_MODIFICATION, + GST_WEBRTC_ERROR_TYPE_ERROR, } GstWebRTCError; - #endif /* __GST_WEBRTC_FWD_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst-plugins-bad.doap -> gst-plugins-bad-1.22.0.tar.xz/gst-plugins-bad.doap
Changed
@@ -35,51 +35,51 @@ <release> <Version> - <revision>1.20.5</revision> - <branch>1.20</branch> + <revision>1.22.0</revision> + <branch>main</branch> <name></name> - <created>2022-12-19</created> - <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.20.5.tar.xz" /> + <created>2023-01-23</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.22.0.tar.xz" /> </Version> </release> <release> <Version> - <revision>1.20.4</revision> - <branch>1.20</branch> + <revision>1.21.90</revision> + <branch>main</branch> <name></name> - <created>2022-10-12</created> - <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.20.4.tar.xz" /> + <created>2023-01-13</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.21.90.tar.xz" /> </Version> </release> <release> <Version> - <revision>1.20.3</revision> - <branch>1.20</branch> + <revision>1.21.3</revision> + <branch>main</branch> <name></name> - <created>2022-06-15</created> - <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.20.3.tar.xz" /> + <created>2022-12-05</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.21.3.tar.xz" /> </Version> </release> <release> <Version> - <revision>1.20.2</revision> - <branch>1.20</branch> + <revision>1.21.2</revision> + <branch>main</branch> <name></name> - <created>2022-05-02</created> - <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.20.2.tar.xz" /> + <created>2022-11-07</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.21.2.tar.xz" /> </Version> </release> <release> <Version> - <revision>1.20.1</revision> - <branch>1.20</branch> + <revision>1.21.1</revision> + <branch>main</branch> <name></name> - <created>2022-03-14</created> - <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.20.1.tar.xz" /> + <created>2022-10-04</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.21.1.tar.xz" /> </Version> </release>
View file
gst-plugins-bad-1.20.5.tar.xz/gst/accurip/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/accurip/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstaccurip, install_dir : plugins_pkgconfig_install_dir) plugins += gstaccurip
View file
gst-plugins-bad-1.20.5.tar.xz/gst/adpcmdec/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/adpcmdec/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstadpcmdec, install_dir : plugins_pkgconfig_install_dir) plugins += gstadpcmdec
View file
gst-plugins-bad-1.20.5.tar.xz/gst/adpcmenc/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/adpcmenc/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstadpcmenc, install_dir : plugins_pkgconfig_install_dir) plugins += gstadpcmenc
View file
gst-plugins-bad-1.20.5.tar.xz/gst/aiff/aiffparse.c -> gst-plugins-bad-1.22.0.tar.xz/gst/aiff/aiffparse.c
Changed
@@ -57,7 +57,7 @@ #include <gst/audio/audio.h> #include <gst/tag/tag.h> #include <gst/pbutils/descriptions.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> GST_DEBUG_CATEGORY (aiffparse_debug); #define GST_CAT_DEFAULT (aiffparse_debug)
View file
gst-plugins-bad-1.20.5.tar.xz/gst/aiff/gstaiffelement.c -> gst-plugins-bad-1.22.0.tar.xz/gst/aiff/gstaiffelement.c
Changed
@@ -24,7 +24,7 @@ #include <gst/tag/tag.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "aiffelements.h"
View file
gst-plugins-bad-1.20.5.tar.xz/gst/aiff/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/aiff/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstaiff, install_dir : plugins_pkgconfig_install_dir) plugins += gstaiff
View file
gst-plugins-bad-1.20.5.tar.xz/gst/asfmux/gstasfmux.c -> gst-plugins-bad-1.22.0.tar.xz/gst/asfmux/gstasfmux.c
Changed
@@ -75,7 +75,7 @@ #include <string.h> #include <stdio.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "gstasfmux.h" #define DEFAULT_SIMPLE_INDEX_TIME_INTERVAL G_GUINT64_CONSTANT (10000000)
View file
gst-plugins-bad-1.20.5.tar.xz/gst/asfmux/gstasfparse.c -> gst-plugins-bad-1.22.0.tar.xz/gst/asfmux/gstasfparse.c
Changed
@@ -25,7 +25,7 @@ #include "gstasfparse.h" /* FIXME add this include - * #include <gst/gst-i18n-plugin.h> */ + * #include <glib/gi18n-lib.h> */ GST_DEBUG_CATEGORY_STATIC (asfparse_debug); #define GST_CAT_DEFAULT asfparse_debug
View file
gst-plugins-bad-1.20.5.tar.xz/gst/asfmux/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/asfmux/meson.build
Changed
@@ -14,5 +14,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstasfmux, install_dir : plugins_pkgconfig_install_dir) plugins += gstasfmux
View file
gst-plugins-bad-1.20.5.tar.xz/gst/audiobuffersplit/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/audiobuffersplit/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstaudiobuffersplit, install_dir : plugins_pkgconfig_install_dir) plugins += gstaudiobuffersplit
View file
gst-plugins-bad-1.20.5.tar.xz/gst/audiofxbad/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/audiofxbad/meson.build
Changed
@@ -11,5 +11,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstaudiofxbad, install_dir : plugins_pkgconfig_install_dir) plugins += gstaudiofxbad
View file
gst-plugins-bad-1.20.5.tar.xz/gst/audiolatency/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/audiolatency/meson.build
Changed
@@ -6,5 +6,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstaudiolatency, install_dir : plugins_pkgconfig_install_dir) plugins += gstaudiolatency
View file
gst-plugins-bad-1.20.5.tar.xz/gst/audiomixmatrix/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/audiomixmatrix/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstaudiomixmatrix, install_dir : plugins_pkgconfig_install_dir) plugins += gstaudiomixmatrix
View file
gst-plugins-bad-1.20.5.tar.xz/gst/audiovisualizers/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/audiovisualizers/meson.build
Changed
@@ -14,5 +14,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstaudiovisualizers, install_dir : plugins_pkgconfig_install_dir) plugins += gstaudiovisualizers
View file
gst-plugins-bad-1.20.5.tar.xz/gst/autoconvert/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/autoconvert/meson.build
Changed
@@ -12,5 +12,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstautoconvert, install_dir : plugins_pkgconfig_install_dir) plugins += gstautoconvert
View file
gst-plugins-bad-1.20.5.tar.xz/gst/bayer/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/bayer/meson.build
Changed
@@ -32,5 +32,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstbayer, install_dir : plugins_pkgconfig_install_dir) plugins += gstbayer
View file
gst-plugins-bad-1.20.5.tar.xz/gst/camerabin2/camerabingeneral.c -> gst-plugins-bad-1.22.0.tar.xz/gst/camerabin2/camerabingeneral.c
Changed
@@ -35,7 +35,7 @@ #include <glib.h> #include <gst/basecamerabinsrc/gstbasecamerasrc.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "camerabingeneral.h"
View file
gst-plugins-bad-1.20.5.tar.xz/gst/camerabin2/gstcamerabin2.c -> gst-plugins-bad-1.22.0.tar.xz/gst/camerabin2/gstcamerabin2.c
Changed
@@ -146,7 +146,7 @@ #include <gst/basecamerabinsrc/gstbasecamerasrc.h> #include "gstcamerabin2.h" -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include <gst/pbutils/pbutils.h> #include <gst/glib-compat-private.h>
View file
gst-plugins-bad-1.20.5.tar.xz/gst/camerabin2/gstdigitalzoom.c -> gst-plugins-bad-1.22.0.tar.xz/gst/camerabin2/gstdigitalzoom.c
Changed
@@ -40,7 +40,7 @@ # include <config.h> #endif -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "gstdigitalzoom.h" enum
View file
gst-plugins-bad-1.20.5.tar.xz/gst/camerabin2/gstviewfinderbin.c -> gst-plugins-bad-1.22.0.tar.xz/gst/camerabin2/gstviewfinderbin.c
Changed
@@ -38,7 +38,7 @@ #include "camerabingeneral.h" #include <gst/pbutils/pbutils.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> GST_DEBUG_CATEGORY_STATIC (gst_viewfinder_bin_debug); #define GST_CAT_DEFAULT gst_viewfinder_bin_debug
View file
gst-plugins-bad-1.20.5.tar.xz/gst/camerabin2/gstwrappercamerabinsrc.c -> gst-plugins-bad-1.22.0.tar.xz/gst/camerabin2/gstwrappercamerabinsrc.c
Changed
@@ -33,7 +33,7 @@ #endif #include <gst/interfaces/photography.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "gstwrappercamerabinsrc.h" #include "gstdigitalzoom.h" @@ -237,10 +237,6 @@ gst_wrapper_camera_bin_src_set_output (GstWrapperCameraBinSrc * self, GstPad * old_pad, GstPad * output_pad) { - GstQuery *drain = gst_query_new_drain (); - gst_pad_peer_query (self->src_pad, drain); - gst_query_unref (drain); - if (old_pad) gst_ghost_pad_set_target (GST_GHOST_PAD (old_pad), NULL); if (output_pad)
View file
gst-plugins-bad-1.20.5.tar.xz/gst/camerabin2/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/camerabin2/meson.build
Changed
@@ -16,5 +16,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstcamerabin, install_dir : plugins_pkgconfig_install_dir) plugins += gstcamerabin
View file
gst-plugins-bad-1.20.5.tar.xz/gst/codecalpha/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/codecalpha/meson.build
Changed
@@ -15,5 +15,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstcodecalpha, install_dir : plugins_pkgconfig_install_dir) plugins += gstcodecalpha
View file
gst-plugins-bad-1.22.0.tar.xz/gst/codectimestamper
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/gst/codectimestamper/gstcodectimestamper.c
Added
@@ -0,0 +1,721 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/* TODO: + * Parse POC and correct PTS if it's is unknown + * Reverse playback support + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/base/base.h> +#include "gstcodectimestamper.h" +#include <string.h> + +GST_DEBUG_CATEGORY_STATIC (gst_codec_timestamper_debug); +#define GST_CAT_DEFAULT gst_codec_timestamper_debug + +typedef struct +{ + GstBuffer *buffer; + GList *events; + + GstClockTime pts; +} GstCodecTimestamperFrame; + +struct _GstCodecTimestamperPrivate +{ + GRecMutex lock; + + GstSegment in_segment; + + GList *current_frame_events; + GstQueueArray *queue; + GArray *timestamp_queue; + + gint fps_n; + gint fps_d; + + guint max_bframes; + guint max_dpb_frames; + guint max_reorder_frames; + gboolean interlaced; + guint window_size; + GstClockTime last_dts; + GstClockTime dts_offset; + GstClockTime time_adjustment; + GstClockTime last_pts; + + GstClockTime latency; +}; + +static void gst_codec_timestamper_class_init (GstCodecTimestamperClass * klass); +static void gst_codec_timestamper_init (GstCodecTimestamper * self, + GstCodecTimestamperClass * klass); +static void gst_codec_timestamper_finalize (GObject * object); + +static GstFlowReturn gst_codec_timestamper_chain (GstPad * pad, + GstObject * parent, GstBuffer * buffer); +static gboolean gst_codec_timestamper_sink_event (GstPad * pad, + GstObject * parent, GstEvent * event); +static gboolean gst_codec_timestamper_src_query (GstPad * pad, + GstObject * parent, GstQuery * query); +static GstStateChangeReturn +gst_codec_timestamper_change_state (GstElement * element, + GstStateChange transition); +static void +gst_codec_timestamper_clear_frame (GstCodecTimestamperFrame * frame); +static void gst_codec_timestamper_reset (GstCodecTimestamper * self); +static void gst_codec_timestamper_drain (GstCodecTimestamper * self); + +static GTypeClass *parent_class = NULL; +static gint private_offset = 0; + +/* we can't use G_DEFINE_ABSTRACT_TYPE because we need the klass in the _init + * method to get to the padtemplates */ +GType +gst_codec_timestamper_get_type (void) +{ + static gsize type = 0; + + if (g_once_init_enter (&type)) { + GType _type; + static const GTypeInfo info = { + sizeof (GstCodecTimestamperClass), + NULL, + NULL, + (GClassInitFunc) gst_codec_timestamper_class_init, + NULL, + NULL, + sizeof (GstCodecTimestamper), + 0, + (GInstanceInitFunc) gst_codec_timestamper_init, + }; + + _type = g_type_register_static (GST_TYPE_ELEMENT, + "GstCodecTimestamper", &info, G_TYPE_FLAG_ABSTRACT); + + private_offset = g_type_add_instance_private (_type, + sizeof (GstCodecTimestamperPrivate)); + + g_once_init_leave (&type, _type); + } + return type; +} + +static inline GstCodecTimestamperPrivate * +gst_codec_timestamper_get_instance_private (GstCodecTimestamper * self) +{ + return (G_STRUCT_MEMBER_P (self, private_offset)); +} + +static void +gst_codec_timestamper_class_init (GstCodecTimestamperClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + if (private_offset) + g_type_class_adjust_private_offset (klass, &private_offset); + + object_class->finalize = gst_codec_timestamper_finalize; + + element_class->change_state = + GST_DEBUG_FUNCPTR (gst_codec_timestamper_change_state); + + GST_DEBUG_CATEGORY_INIT (gst_codec_timestamper_debug, "codectimestamper", 0, + "codectimestamper"); + + /** + * GstCodecTimestamper: + * + * Since: 1.22 + */ + gst_type_mark_as_plugin_api (GST_TYPE_CODEC_TIMESTAMPER, 0); +} + +static void +gst_codec_timestamper_init (GstCodecTimestamper * self, + GstCodecTimestamperClass * klass) +{ + GstCodecTimestamperPrivate *priv; + GstPadTemplate *template; + + self->priv = priv = gst_codec_timestamper_get_instance_private (self); + + template = gst_element_class_get_pad_template (GST_ELEMENT_CLASS (klass), + "sink"); + self->sinkpad = gst_pad_new_from_template (template, "sink"); + gst_pad_set_chain_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_codec_timestamper_chain)); + gst_pad_set_event_function (self->sinkpad, + GST_DEBUG_FUNCPTR (gst_codec_timestamper_sink_event)); + GST_PAD_SET_PROXY_SCHEDULING (self->sinkpad); + gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); + + template = gst_element_class_get_pad_template (GST_ELEMENT_CLASS (klass), + "src"); + self->srcpad = gst_pad_new_from_template (template, "src"); + gst_pad_set_query_function (self->srcpad, + GST_DEBUG_FUNCPTR (gst_codec_timestamper_src_query)); + GST_PAD_SET_PROXY_SCHEDULING (self->srcpad); + + gst_element_add_pad (GST_ELEMENT (self), self->srcpad); + + priv->queue = + gst_queue_array_new_for_struct (sizeof (GstCodecTimestamperFrame), 16); + gst_queue_array_set_clear_func (priv->queue, + (GDestroyNotify) gst_codec_timestamper_clear_frame); + priv->timestamp_queue = + g_array_sized_new (FALSE, FALSE, sizeof (GstClockTime), 16); + + g_rec_mutex_init (&priv->lock); + gst_segment_init (&priv->in_segment, GST_FORMAT_TIME); +} + +static void +gst_codec_timestamper_finalize (GObject * object) +{ + GstCodecTimestamper *self = GST_CODEC_TIMESTAMPER (object); + GstCodecTimestamperPrivate *priv = self->priv; + + gst_queue_array_free (priv->queue); + g_array_unref (priv->timestamp_queue); + g_rec_mutex_clear (&priv->lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_codec_timestamper_set_caps (GstCodecTimestamper * self, GstCaps * caps) +{ + GstCodecTimestamperClass *klass = GST_CODEC_TIMESTAMPER_GET_CLASS (self); + GstCodecTimestamperPrivate *priv = self->priv; + GstStructure *s = gst_caps_get_structure (caps, 0); + + priv->fps_n = 0; + priv->fps_d = 1; + + gst_structure_get_fraction (s, "framerate", &priv->fps_n, &priv->fps_d); + + if (priv->fps_n <= 0 || priv->fps_d <= 0) { + GST_WARNING_OBJECT (self, "Unknown frame rate, assume 25/1"); + priv->fps_n = 25; + priv->fps_d = 1; + } + + if (!klass->set_caps (self, caps)) + return FALSE; + + return TRUE; +} + +static gboolean +gst_codec_timestamper_push_event (GstCodecTimestamper * self, GstEvent * event) +{ + GstCodecTimestamperPrivate *priv = self->priv; + + if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) { + GstSegment segment; + guint32 seqnum; + + gst_event_copy_segment (event, &segment); + + if (segment.format != GST_FORMAT_TIME) { + GST_ELEMENT_ERROR (self, CORE, EVENT, (NULL), + ("Non-time format segment")); + gst_event_unref (event); + return FALSE; + } + + if (priv->time_adjustment != GST_CLOCK_TIME_NONE) { + segment.start += priv->time_adjustment; + if (GST_CLOCK_TIME_IS_VALID (segment.position)) + segment.position += priv->time_adjustment; + if (GST_CLOCK_TIME_IS_VALID (segment.stop)) + segment.stop += priv->time_adjustment; + } + + seqnum = gst_event_get_seqnum (event); + + gst_event_unref (event); + event = gst_event_new_segment (&segment); + gst_event_set_seqnum (event, seqnum); + } + + return gst_pad_push_event (self->srcpad, event); +} + +static void +gst_codec_timestamper_flush_events (GstCodecTimestamper * self, GList ** events) +{ + GList *iter; + + for (iter = *events; iter; iter = g_list_next (iter)) { + GstEvent *ev = GST_EVENT (iter->data); + + if (GST_EVENT_IS_STICKY (ev) && GST_EVENT_TYPE (ev) != GST_EVENT_EOS && + GST_EVENT_TYPE (ev) != GST_EVENT_SEGMENT) { + gst_pad_store_sticky_event (self->srcpad, ev); + } + + gst_event_unref (ev); + } + + g_clear_pointer (events, g_list_free); +} + +static void +gst_codec_timestamper_flush (GstCodecTimestamper * self) +{ + GstCodecTimestamperPrivate *priv = self->priv; + + while (gst_queue_array_get_length (priv->queue) > 0) { + GstCodecTimestamperFrame *frame = (GstCodecTimestamperFrame *) + gst_queue_array_pop_head_struct (priv->queue); + + gst_codec_timestamper_flush_events (self, &frame->events); + gst_codec_timestamper_clear_frame (frame); + } + + gst_codec_timestamper_flush_events (self, &priv->current_frame_events); + + priv->time_adjustment = GST_CLOCK_TIME_NONE; + priv->last_dts = GST_CLOCK_TIME_NONE; + priv->last_pts = GST_CLOCK_TIME_NONE; + g_rec_mutex_lock (&priv->lock); + priv->latency = GST_CLOCK_TIME_NONE; + g_rec_mutex_unlock (&priv->lock); +} + +static gboolean +gst_codec_timestamper_sink_event (GstPad * pad, GstObject * parent, + GstEvent * event) +{ + GstCodecTimestamper *self = GST_CODEC_TIMESTAMPER (parent); + GstCodecTimestamperPrivate *priv = self->priv; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS:{ + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + gst_codec_timestamper_set_caps (self, caps); + break; + } + case GST_EVENT_SEGMENT:{ + GstSegment segment; + + gst_event_copy_segment (event, &segment); + if (segment.format != GST_FORMAT_TIME) { + GST_WARNING_OBJECT (self, "Not a time format segment"); + gst_event_unref (event); + return FALSE; + } + + if (segment.rate < 0) { + GST_WARNING_OBJECT (self, "Negative rate is not supported"); + gst_event_unref (event); + return FALSE; + } + + /* Drain on segment update */ + if (!gst_segment_is_equal (&priv->in_segment, &segment)) + gst_codec_timestamper_drain (self); + + priv->in_segment = segment; + break; + } + case GST_EVENT_EOS: + gst_codec_timestamper_drain (self); + if (priv->current_frame_events) { + GList *iter; + + for (iter = priv->current_frame_events; iter; iter = g_list_next (iter)) + gst_codec_timestamper_push_event (self, GST_EVENT (iter->data)); + + g_clear_pointer (&priv->current_frame_events, g_list_free); + } + break; + case GST_EVENT_FLUSH_STOP: + gst_codec_timestamper_flush (self); + break; + default: + break; + } + + if (!GST_EVENT_IS_SERIALIZED (event) || + GST_EVENT_TYPE (event) == GST_EVENT_EOS || + GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP) { + return gst_pad_event_default (pad, parent, event); + } + + /* Store event to serialize queued frames */ + priv->current_frame_events = g_list_append (priv->current_frame_events, + event); + + return TRUE; +} + +static void +gst_codec_timestamper_frame_init (GstCodecTimestamperFrame * frame) +{ + memset (frame, 0, sizeof (GstCodecTimestamperFrame)); + + frame->pts = GST_CLOCK_TIME_NONE; +} + +static void +gst_codec_timestamper_clear_frame (GstCodecTimestamperFrame * frame) +{ + if (!frame) + return; + + gst_clear_buffer (&frame->buffer); + if (frame->events) { + g_list_free_full (frame->events, (GDestroyNotify) gst_event_unref); + frame->events = NULL; + } +} + +static GstFlowReturn +gst_codec_timestamper_output_frame (GstCodecTimestamper * self, + GstCodecTimestamperFrame * frame) +{ + GstCodecTimestamperPrivate *priv = self->priv; + GList *iter; + GstFlowReturn ret; + GstClockTime dts = GST_CLOCK_TIME_NONE; + + for (iter = frame->events; iter; iter = g_list_next (iter)) { + GstEvent *event = GST_EVENT (iter->data); + + gst_codec_timestamper_push_event (self, event); + } + + g_clear_pointer (&frame->events, g_list_free); + + if (GST_CLOCK_TIME_IS_VALID (frame->pts)) { + g_assert (priv->timestamp_queue->len > 0); + dts = g_array_index (priv->timestamp_queue, GstClockTime, 0); + g_array_remove_index (priv->timestamp_queue, 0); + + if (GST_CLOCK_TIME_IS_VALID (priv->dts_offset)) + dts -= priv->dts_offset; + } + + if (GST_CLOCK_TIME_IS_VALID (dts)) { + if (!GST_CLOCK_TIME_IS_VALID (priv->last_dts)) + priv->last_dts = dts; + + /* make sure DTS <= PTS */ + if (GST_CLOCK_TIME_IS_VALID (frame->pts)) { + if (dts > frame->pts) { + if (frame->pts >= priv->last_dts) + dts = frame->pts; + else + dts = GST_CLOCK_TIME_NONE; + } + + if (GST_CLOCK_TIME_IS_VALID (dts)) + priv->last_dts = dts; + } + } + + frame->buffer = gst_buffer_make_writable (frame->buffer); + GST_BUFFER_PTS (frame->buffer) = frame->pts; + GST_BUFFER_DTS (frame->buffer) = dts; + + GST_TRACE_OBJECT (self, "Output %" GST_PTR_FORMAT, frame->buffer); + + ret = gst_pad_push (self->srcpad, g_steal_pointer (&frame->buffer)); + + return ret; +} + +static GstFlowReturn +gst_codec_timestamper_process_output_frame (GstCodecTimestamper * self) +{ + GstCodecTimestamperPrivate *priv = self->priv; + guint len; + GstCodecTimestamperFrame *frame; + + len = gst_queue_array_get_length (priv->queue); + if (len < priv->window_size) { + GST_TRACE_OBJECT (self, "Need more data, queued %d/%d", len, + priv->window_size); + return GST_FLOW_OK; + } + + frame = (GstCodecTimestamperFrame *) + gst_queue_array_pop_head_struct (priv->queue); + + return gst_codec_timestamper_output_frame (self, frame); +} + +static void +gst_codec_timestamper_drain (GstCodecTimestamper * self) +{ + GstCodecTimestamperPrivate *priv = self->priv; + + while (gst_queue_array_get_length (priv->queue) > 0) { + GstCodecTimestamperFrame *frame = (GstCodecTimestamperFrame *) + gst_queue_array_pop_head_struct (priv->queue); + gst_codec_timestamper_output_frame (self, frame); + } + + priv->time_adjustment = GST_CLOCK_TIME_NONE; + priv->last_dts = GST_CLOCK_TIME_NONE; + priv->last_pts = GST_CLOCK_TIME_NONE; +} + +static gint +pts_compare_func (const GstClockTime * a, const GstClockTime * b) +{ + return (*a) - (*b); +} + +static GstFlowReturn +gst_codec_timestamper_chain (GstPad * pad, GstObject * parent, + GstBuffer * buffer) +{ + GstCodecTimestamper *self = GST_CODEC_TIMESTAMPER (parent); + GstCodecTimestamperPrivate *priv = self->priv; + GstCodecTimestamperClass *klass = GST_CODEC_TIMESTAMPER_GET_CLASS (self); + GstClockTime pts, dts; + /* The same hack as x264 for negative DTS */ + static const GstClockTime min_pts = GST_SECOND * 60 * 60 * 1000; + GstCodecTimestamperFrame frame; + GstFlowReturn ret; + + gst_codec_timestamper_frame_init (&frame); + + GST_TRACE_OBJECT (self, "Handle %" GST_PTR_FORMAT, buffer); + + pts = GST_BUFFER_PTS (buffer); + dts = GST_BUFFER_DTS (buffer); + + if (!GST_CLOCK_TIME_IS_VALID (priv->time_adjustment)) { + GstClockTime start_time = GST_CLOCK_TIME_NONE; + + if (GST_CLOCK_TIME_IS_VALID (pts)) + start_time = MAX (pts, priv->in_segment.start); + else if (GST_CLOCK_TIME_IS_VALID (dts)) + start_time = MAX (dts, priv->in_segment.start); + else + start_time = priv->in_segment.start; + + if (start_time < min_pts) + priv->time_adjustment = min_pts - start_time; + } + + if (GST_CLOCK_TIME_IS_VALID (priv->time_adjustment)) { + if (GST_CLOCK_TIME_IS_VALID (pts)) + pts += priv->time_adjustment; + if (GST_CLOCK_TIME_IS_VALID (dts)) + dts += priv->time_adjustment; + } + + ret = klass->handle_buffer (self, buffer); + if (ret != GST_FLOW_OK) { + GST_INFO_OBJECT (self, "Handle buffer returned %s", + gst_flow_get_name (ret)); + + gst_buffer_unref (buffer); + return ret; + } + + /* workaround h264/5parse producing pts=NONE buffers when provided with + * the same timestamps on sequential buffers */ + if (GST_CLOCK_TIME_IS_VALID (pts)) { + priv->last_pts = pts; + } else if (GST_CLOCK_TIME_IS_VALID (priv->last_pts)) { + pts = priv->last_pts; + } + + frame.pts = pts; + frame.buffer = buffer; + frame.events = priv->current_frame_events; + priv->current_frame_events = NULL; + + gst_queue_array_push_tail_struct (priv->queue, &frame); + if (GST_CLOCK_TIME_IS_VALID (frame.pts)) { + g_array_append_val (priv->timestamp_queue, frame.pts); + g_array_sort (priv->timestamp_queue, (GCompareFunc) pts_compare_func); + } + + return gst_codec_timestamper_process_output_frame (self); +} + +static gboolean +gst_codec_timestamper_src_query (GstPad * pad, GstObject * parent, + GstQuery * query) +{ + GstCodecTimestamper *self = GST_CODEC_TIMESTAMPER (parent); + GstCodecTimestamperPrivate *priv = self->priv; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY:{ + gboolean ret; + + ret = gst_pad_peer_query (self->sinkpad, query); + if (ret) { + GstClockTime min, max; + gboolean live; + + gst_query_parse_latency (query, &live, &min, &max); + + g_rec_mutex_lock (&priv->lock); + if (GST_CLOCK_TIME_IS_VALID (priv->latency)) + min += priv->latency; + g_rec_mutex_unlock (&priv->lock); + + gst_query_set_latency (query, live, min, max); + } + + return ret; + } + default: + break; + } + + return gst_pad_query_default (pad, parent, query); +} + +static void +gst_codec_timestamper_reset (GstCodecTimestamper * self) +{ + GstCodecTimestamperPrivate *priv = self->priv; + + gst_queue_array_clear (priv->queue); + g_array_set_size (priv->timestamp_queue, 0); + priv->fps_n = 0; + priv->fps_d = 1; + priv->dts_offset = 0; + priv->time_adjustment = GST_CLOCK_TIME_NONE; + priv->latency = GST_CLOCK_TIME_NONE; + priv->window_size = 0; + priv->last_dts = GST_CLOCK_TIME_NONE; + priv->last_pts = GST_CLOCK_TIME_NONE; + + if (priv->current_frame_events) { + g_list_free_full (priv->current_frame_events, + (GDestroyNotify) gst_event_unref); + priv->current_frame_events = NULL; + } +} + +static gboolean +gst_codec_timestamper_start (GstCodecTimestamper * self) +{ + GstCodecTimestamperClass *klass = GST_CODEC_TIMESTAMPER_GET_CLASS (self); + + gst_codec_timestamper_reset (self); + + if (klass->start) + return klass->start (self); + + return TRUE; +} + +static gboolean +gst_codec_timestamper_stop (GstCodecTimestamper * self) +{ + GstCodecTimestamperClass *klass = GST_CODEC_TIMESTAMPER_GET_CLASS (self); + + gst_codec_timestamper_reset (self); + + if (klass->stop) + return klass->stop (self); + + return TRUE; +} + +static GstStateChangeReturn +gst_codec_timestamper_change_state (GstElement * element, + GstStateChange transition) +{ + GstCodecTimestamper *self = GST_CODEC_TIMESTAMPER (element); + GstStateChangeReturn ret; + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + gst_codec_timestamper_start (self); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_codec_timestamper_stop (self); + break; + default: + break; + } + + return ret; +} + +void +gst_codec_timestamper_set_window_size (GstCodecTimestamper * timestamper, + guint window_size) +{ + GstCodecTimestamperPrivate *priv = timestamper->priv; + gboolean updated = FALSE; + GstClockTime latency = 0; + + g_rec_mutex_lock (&priv->lock); + priv->dts_offset = 0; + priv->window_size = 0; + + if (window_size) { + priv->dts_offset = gst_util_uint64_scale_int (window_size * GST_SECOND, + priv->fps_d, priv->fps_n); + + /* Add margin to be robust against PTS errors and in order for boundary + * frames' PTS can be referenced */ + window_size += 2; + latency = gst_util_uint64_scale_int (window_size * GST_SECOND, + priv->fps_d, priv->fps_n); + + priv->window_size = window_size; + } + + if (priv->latency != latency) { + updated = TRUE; + priv->latency = latency; + } + + GST_DEBUG_OBJECT (timestamper, + "New window size %d, latency %" GST_TIME_FORMAT ", framerate %d/%d", + priv->window_size, GST_TIME_ARGS (latency), priv->fps_n, priv->fps_d); + g_rec_mutex_unlock (&priv->lock); + + if (updated) { + gst_codec_timestamper_drain (timestamper); + gst_element_post_message (GST_ELEMENT_CAST (timestamper), + gst_message_new_latency (GST_OBJECT_CAST (timestamper))); + } +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst/codectimestamper/gstcodectimestamper.h
Added
@@ -0,0 +1,68 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> + +G_BEGIN_DECLS + +#define GST_TYPE_CODEC_TIMESTAMPER (gst_codec_timestamper_get_type()) +#define GST_CODEC_TIMESTAMPER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CODEC_TIMESTAMPER,GstCodecTimestamper)) +#define GST_CODEC_TIMESTAMPER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CODEC_TIMESTAMPER,GstCodecTimestamperClass)) +#define GST_CODEC_TIMESTAMPER_GET_CLASS(obj) (GST_CODEC_TIMESTAMPER_CLASS(G_OBJECT_GET_CLASS(obj))) +#define GST_CODEC_TIMESTAMPER_CAST(obj) ((GstCodecTimestamper*)(obj)) + +typedef struct _GstCodecTimestamper GstCodecTimestamper; +typedef struct _GstCodecTimestamperClass GstCodecTimestamperClass; +typedef struct _GstCodecTimestamperPrivate GstCodecTimestamperPrivate; + +struct _GstCodecTimestamper +{ + GstElement parent; + + GstPad *sinkpad; + GstPad *srcpad; + + GstCodecTimestamperPrivate *priv; +}; + +struct _GstCodecTimestamperClass +{ + GstElementClass parent_class; + + gboolean (*start) (GstCodecTimestamper * timestamper); + + gboolean (*stop) (GstCodecTimestamper * timestamper); + + gboolean (*set_caps) (GstCodecTimestamper * timestamper, + GstCaps * caps); + + GstFlowReturn (*handle_buffer) (GstCodecTimestamper * timestamper, + GstBuffer * buffer); +}; + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstCodecTimestamper, gst_object_unref); + +GType gst_codec_timestamper_get_type (void); + +void gst_codec_timestamper_set_window_size (GstCodecTimestamper * timestamper, + guint window_size); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst/codectimestamper/gsth264timestamper.c
Added
@@ -0,0 +1,436 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-h264timestamper + * @title: h264timestamper + * @short_description: A timestamp correction element for H.264 streams + * + * `h264timestamper` updates the DTS (Decoding Time Stamp) of each frame + * based on H.264 SPS codec setup data, specifically the frame reordering + * information written in the SPS indicating the maximum number of B-frames + * allowed. + * + * In order to determine the DTS of each frame, this element may need to hold + * back a few frames in case the codec data indicates that frame reordering is + * allowed for the given stream. That means this element may introduce additional + * latency for the DTS decision. + * + * This element can be useful if downstream elements require correct DTS + * information but upstream elements either do not provide it at all or the + * upstream DTS information is unreliable. + * + * For example, mp4 muxers typically require both DTS and PTS on the input + * buffers, but in case where the input H.264 data comes from Matroska files or + * RTP/RTSP streams DTS timestamps may be absent and this element may need to + * be used to clean up the DTS timestamps before handing it to the mp4 muxer. + * + * This is particularly the case where the H.264 stream contains B-frames + * (i.e. frame reordering is required), as streams without correct DTS information + * will confuse the muxer element and will result in unexpected (or bogus) + * duration/framerate/timestamp values in the muxed container stream. + * + * ## Example launch line + * ``` + * gst-launch-1.0 filesrc location=video.mkv ! matroskademux ! h264parse ! h264timestamper ! mp4mux ! filesink location=output.mp4 + * ``` + * + * Since: 1.22 + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/base/base.h> +#include <gst/codecparsers/gsth264parser.h> +#include "gsth264timestamper.h" + +GST_DEBUG_CATEGORY_STATIC (gst_h264_timestamper_debug); +#define GST_CAT_DEFAULT gst_h264_timestamper_debug + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-h264, alignment=(string) au")); + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-h264, alignment=(string) au")); + +struct _GstH264Timestamper +{ + GstCodecTimestamper parent; + + GstH264NalParser *parser; + gboolean packetized; + guint nal_length_size; +}; + +static gboolean gst_h264_timestamper_start (GstCodecTimestamper * timestamper); +static gboolean gst_h264_timestamper_stop (GstCodecTimestamper * timestamper); +static gboolean gst_h264_timestamper_set_caps (GstCodecTimestamper * + timestamper, GstCaps * caps); +static GstFlowReturn gst_h264_timestamper_handle_buffer (GstCodecTimestamper * + timestamper, GstBuffer * buffer); +static void gst_h264_timestamper_process_nal (GstH264Timestamper * self, + GstH264NalUnit * nalu); + +G_DEFINE_TYPE (GstH264Timestamper, + gst_h264_timestamper, GST_TYPE_CODEC_TIMESTAMPER); + +GST_ELEMENT_REGISTER_DEFINE (h264timestamper, "h264timestamper", + GST_RANK_NONE, GST_TYPE_H264_TIMESTAMPER); + +static void +gst_h264_timestamper_class_init (GstH264TimestamperClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstCodecTimestamperClass *timestamper_class = + GST_CODEC_TIMESTAMPER_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &sinktemplate); + gst_element_class_add_static_pad_template (element_class, &srctemplate); + + gst_element_class_set_static_metadata (element_class, "H.264 timestamper", + "Codec/Video", "Timestamp H.264 streams", + "Seungha Yang <seungha@centricular.com>"); + + timestamper_class->start = GST_DEBUG_FUNCPTR (gst_h264_timestamper_start); + timestamper_class->stop = GST_DEBUG_FUNCPTR (gst_h264_timestamper_stop); + timestamper_class->set_caps = + GST_DEBUG_FUNCPTR (gst_h264_timestamper_set_caps); + timestamper_class->handle_buffer = + GST_DEBUG_FUNCPTR (gst_h264_timestamper_handle_buffer); + + GST_DEBUG_CATEGORY_INIT (gst_h264_timestamper_debug, "h264timestamper", 0, + "h264timestamper"); +} + +static void +gst_h264_timestamper_init (GstH264Timestamper * self) +{ +} + +static gboolean +gst_h264_timestamper_set_caps (GstCodecTimestamper * timestamper, + GstCaps * caps) +{ + GstH264Timestamper *self = GST_H264_TIMESTAMPER (timestamper); + GstStructure *s = gst_caps_get_structure (caps, 0); + const gchar *str; + gboolean found_format = FALSE; + const GValue *codec_data_val; + + self->packetized = FALSE; + self->nal_length_size = 4; + str = gst_structure_get_string (s, "stream-format"); + if (g_strcmp0 (str, "avc") == 0 || g_strcmp0 (str, "avc3") == 0) { + self->packetized = TRUE; + found_format = TRUE; + } else if (g_strcmp0 (str, "byte-stream") == 0) { + found_format = TRUE; + } + + codec_data_val = gst_structure_get_value (s, "codec_data"); + if (codec_data_val && GST_VALUE_HOLDS_BUFFER (codec_data_val)) { + GstBuffer *codec_data = gst_value_get_buffer (codec_data_val); + GstMapInfo map; + GstH264NalUnit *nalu; + GstH264ParserResult ret; + GstH264DecoderConfigRecord *config = NULL; + guint i; + + if (!gst_buffer_map (codec_data, &map, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Unable to map codec-data buffer"); + return FALSE; + } + + ret = gst_h264_parser_parse_decoder_config_record (self->parser, + map.data, map.size, &config); + if (ret != GST_H264_PARSER_OK) { + GST_WARNING_OBJECT (self, "Failed to parse codec-data"); + goto unmap; + } + + self->nal_length_size = config->length_size_minus_one + 1; + for (i = 0; i < config->sps->len; i++) { + nalu = &g_array_index (config->sps, GstH264NalUnit, i); + gst_h264_timestamper_process_nal (self, nalu); + } + + for (i = 0; i < config->pps->len; i++) { + nalu = &g_array_index (config->pps, GstH264NalUnit, i); + gst_h264_timestamper_process_nal (self, nalu); + } + + /* codec_data would mean packetized format */ + if (!found_format) + self->packetized = TRUE; + + unmap: + gst_buffer_unmap (codec_data, &map); + g_clear_pointer (&config, gst_h264_decoder_config_record_free); + } + + return TRUE; +} + +typedef enum +{ + GST_H264_LEVEL_L1 = 10, + GST_H264_LEVEL_L1B = 9, + GST_H264_LEVEL_L1_1 = 11, + GST_H264_LEVEL_L1_2 = 12, + GST_H264_LEVEL_L1_3 = 13, + GST_H264_LEVEL_L2_0 = 20, + GST_H264_LEVEL_L2_1 = 21, + GST_H264_LEVEL_L2_2 = 22, + GST_H264_LEVEL_L3 = 30, + GST_H264_LEVEL_L3_1 = 31, + GST_H264_LEVEL_L3_2 = 32, + GST_H264_LEVEL_L4 = 40, + GST_H264_LEVEL_L4_1 = 41, + GST_H264_LEVEL_L4_2 = 42, + GST_H264_LEVEL_L5 = 50, + GST_H264_LEVEL_L5_1 = 51, + GST_H264_LEVEL_L5_2 = 52, + GST_H264_LEVEL_L6 = 60, + GST_H264_LEVEL_L6_1 = 61, + GST_H264_LEVEL_L6_2 = 62, +} GstH264DecoderLevel; + +typedef struct +{ + GstH264DecoderLevel level; + + guint32 max_mbps; + guint32 max_fs; + guint32 max_dpb_mbs; + guint32 max_main_br; +} LevelLimits; + +static const LevelLimits level_limits_map = { + {GST_H264_LEVEL_L1, 1485, 99, 396, 64}, + {GST_H264_LEVEL_L1B, 1485, 99, 396, 128}, + {GST_H264_LEVEL_L1_1, 3000, 396, 900, 192}, + {GST_H264_LEVEL_L1_2, 6000, 396, 2376, 384}, + {GST_H264_LEVEL_L1_3, 11800, 396, 2376, 768}, + {GST_H264_LEVEL_L2_0, 11880, 396, 2376, 2000}, + {GST_H264_LEVEL_L2_1, 19800, 792, 4752, 4000}, + {GST_H264_LEVEL_L2_2, 20250, 1620, 8100, 4000}, + {GST_H264_LEVEL_L3, 40500, 1620, 8100, 10000}, + {GST_H264_LEVEL_L3_1, 108000, 3600, 18000, 14000}, + {GST_H264_LEVEL_L3_2, 216000, 5120, 20480, 20000}, + {GST_H264_LEVEL_L4, 245760, 8192, 32768, 20000}, + {GST_H264_LEVEL_L4_1, 245760, 8192, 32768, 50000}, + {GST_H264_LEVEL_L4_2, 522240, 8704, 34816, 50000}, + {GST_H264_LEVEL_L5, 589824, 22080, 110400, 135000}, + {GST_H264_LEVEL_L5_1, 983040, 36864, 184320, 240000}, + {GST_H264_LEVEL_L5_2, 2073600, 36864, 184320, 240000}, + {GST_H264_LEVEL_L6, 4177920, 139264, 696320, 240000}, + {GST_H264_LEVEL_L6_1, 8355840, 139264, 696320, 480000}, + {GST_H264_LEVEL_L6_2, 16711680, 139264, 696320, 800000} +}; + +static guint +h264_level_to_max_dpb_mbs (GstH264DecoderLevel level) +{ + gint i; + for (i = 0; i < G_N_ELEMENTS (level_limits_map); i++) { + if (level == level_limits_mapi.level) + return level_limits_mapi.max_dpb_mbs; + } + + return 0; +} + +static void +gst_h264_timestamper_process_sps (GstH264Timestamper * self, GstH264SPS * sps) +{ + guint8 level; + guint max_dpb_mbs; + guint width_mb, height_mb; + guint max_dpb_frames = 0; + guint max_reorder_frames = 0; + + /* Spec A.3.1 and A.3.2 + * For Baseline, Constrained Baseline and Main profile, the indicated level is + * Level 1b if level_idc is equal to 11 and constraint_set3_flag is equal to 1 + */ + level = sps->level_idc; + if (level == 11 && (sps->profile_idc == 66 || sps->profile_idc == 77) && + sps->constraint_set3_flag) { + /* Level 1b */ + level = 9; + } + + max_dpb_mbs = h264_level_to_max_dpb_mbs ((GstH264DecoderLevel) level); + if (sps->vui_parameters_present_flag + && sps->vui_parameters.bitstream_restriction_flag) { + max_dpb_frames = MAX (1, sps->vui_parameters.max_dec_frame_buffering); + } else if (max_dpb_mbs != 0) { + width_mb = sps->width / 16; + height_mb = sps->height / 16; + + max_dpb_frames = MIN (max_dpb_mbs / (width_mb * height_mb), 16); + } else { + GST_WARNING_OBJECT (self, "Unable to get MAX DPB MBs"); + max_dpb_frames = 16; + } + + GST_DEBUG_OBJECT (self, "Max DPB size %d", max_dpb_frames); + + max_reorder_frames = max_dpb_frames; + if (sps->vui_parameters_present_flag + && sps->vui_parameters.bitstream_restriction_flag) { + max_reorder_frames = sps->vui_parameters.num_reorder_frames; + if (max_reorder_frames > max_dpb_frames) { + GST_WARNING_OBJECT (self, "num_reorder_frames %d > dpb size %d", + max_reorder_frames, max_dpb_frames); + max_reorder_frames = max_dpb_frames; + } + } else { + if (sps->profile_idc == 66 || sps->profile_idc == 83) { + /* baseline, constrained baseline and scalable-baseline profiles + only contain I/P frames. */ + max_reorder_frames = 0; + } else if (sps->constraint_set3_flag) { + /* constraint_set3_flag may mean the -intra only profile. */ + switch (sps->profile_idc) { + case 44: + case 86: + case 100: + case 110: + case 122: + case 244: + max_reorder_frames = 0; + break; + default: + break; + } + } + } + + GST_DEBUG_OBJECT (self, "Max num reorder frames %d", max_reorder_frames); + + gst_codec_timestamper_set_window_size (GST_CODEC_TIMESTAMPER_CAST (self), + max_reorder_frames); +} + +static void +gst_h264_timestamper_process_nal (GstH264Timestamper * self, + GstH264NalUnit * nalu) +{ + GstH264ParserResult ret; + + switch (nalu->type) { + case GST_H264_NAL_SPS:{ + GstH264SPS sps; + ret = gst_h264_parser_parse_sps (self->parser, nalu, &sps); + if (ret != GST_H264_PARSER_OK) { + GST_WARNING_OBJECT (self, "Failed to parse SPS"); + break; + } + + gst_h264_timestamper_process_sps (self, &sps); + gst_h264_sps_clear (&sps); + break; + } + /* TODO: parse PPS/SLICE and correct PTS based on POC if needed */ + default: + break; + } +} + +static GstFlowReturn +gst_h264_timestamper_handle_buffer (GstCodecTimestamper * timestamper, + GstBuffer * buffer) +{ + GstH264Timestamper *self = GST_H264_TIMESTAMPER (timestamper); + GstMapInfo map; + + /* Ignore any error while parsing NAL */ + if (gst_buffer_map (buffer, &map, GST_MAP_READ)) { + GstH264ParserResult ret; + GstH264NalUnit nalu; + + if (self->packetized) { + ret = gst_h264_parser_identify_nalu_avc (self->parser, + map.data, 0, map.size, self->nal_length_size, &nalu); + + while (ret == GST_H264_PARSER_OK) { + gst_h264_timestamper_process_nal (self, &nalu); + + ret = gst_h264_parser_identify_nalu_avc (self->parser, + map.data, nalu.offset + nalu.size, map.size, self->nal_length_size, + &nalu); + } + } else { + ret = gst_h264_parser_identify_nalu (self->parser, + map.data, 0, map.size, &nalu); + + if (ret == GST_H264_PARSER_NO_NAL_END) + ret = GST_H264_PARSER_OK; + + while (ret == GST_H264_PARSER_OK) { + gst_h264_timestamper_process_nal (self, &nalu); + + ret = gst_h264_parser_identify_nalu (self->parser, + map.data, nalu.offset + nalu.size, map.size, &nalu); + + if (ret == GST_H264_PARSER_NO_NAL_END) + ret = GST_H264_PARSER_OK; + } + } + gst_buffer_unmap (buffer, &map); + } + + return GST_FLOW_OK; +} + +static void +gst_h264_timestamper_reset (GstH264Timestamper * self) +{ + g_clear_pointer (&self->parser, gst_h264_nal_parser_free); +} + +static gboolean +gst_h264_timestamper_start (GstCodecTimestamper * timestamper) +{ + GstH264Timestamper *self = GST_H264_TIMESTAMPER (timestamper); + + gst_h264_timestamper_reset (self); + + self->parser = gst_h264_nal_parser_new (); + + return TRUE; +} + +static gboolean +gst_h264_timestamper_stop (GstCodecTimestamper * timestamper) +{ + GstH264Timestamper *self = GST_H264_TIMESTAMPER (timestamper); + + gst_h264_timestamper_reset (self); + + return TRUE; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst/codectimestamper/gsth264timestamper.h
Added
@@ -0,0 +1,33 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include "gstcodectimestamper.h" + +G_BEGIN_DECLS + +#define GST_TYPE_H264_TIMESTAMPER (gst_h264_timestamper_get_type()) +G_DECLARE_FINAL_TYPE (GstH264Timestamper, gst_h264_timestamper, + GST, H264_TIMESTAMPER, GstCodecTimestamper); + +GST_ELEMENT_REGISTER_DECLARE (h264timestamper); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst/codectimestamper/gsth265timestamper.c
Added
@@ -0,0 +1,339 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-h265timestamper + * @title: h265timestamper + * @short_description: A timestamp correction element for H.265 streams + * + * `h265timestamper` updates the DTS (Decoding Time Stamp) of each frame + * based on H.265 SPS codec setup data, specifically the frame reordering + * information written in the SPS indicating the maximum number of B-frames + * allowed. + * + * In order to determine the DTS of each frame, this element may need to hold + * back a few frames in case the codec data indicates that frame reordering is + * allowed for the given stream. That means this element may introduce additional + * latency for the DTS decision. + * + * This element can be useful if downstream elements require correct DTS + * information but upstream elements either do not provide it at all or the + * upstream DTS information is unreliable. + * + * For example, mp4 muxers typically require both DTS and PTS on the input + * buffers, but in case where the input H.265 data comes from Matroska files or + * RTP/RTSP streams DTS timestamps may be absent and this element may need to + * be used to clean up the DTS timestamps before handing it to the mp4 muxer. + * + * This is particularly the case where the H.265 stream contains B-frames + * (i.e. frame reordering is required), as streams without correct DTS information + * will confuse the muxer element and will result in unexpected (or bogus) + * duration/framerate/timestamp values in the muxed container stream. + * + * ## Example launch line + * ``` + * gst-launch-1.0 filesrc location=video.mkv ! matroskademux ! h265parse ! h265timestamper ! mp4mux ! filesink location=output.mp4 + * ``` + * + * Since: 1.22 + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/base/base.h> +#include <gst/codecparsers/gsth265parser.h> +#include "gsth265timestamper.h" + +GST_DEBUG_CATEGORY_STATIC (gst_h265_timestamper_debug); +#define GST_CAT_DEFAULT gst_h265_timestamper_debug + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-h265, alignment=(string) au")); + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-h265, alignment=(string) au")); + +struct _GstH265Timestamper +{ + GstCodecTimestamper parent; + + GstH265Parser *parser; + gboolean packetized; + guint nal_length_size; +}; + +static gboolean gst_h265_timestamper_start (GstCodecTimestamper * timestamper); +static gboolean gst_h265_timestamper_stop (GstCodecTimestamper * timestamper); +static gboolean gst_h265_timestamper_set_caps (GstCodecTimestamper * + timestamper, GstCaps * caps); +static GstFlowReturn gst_h265_timestamper_handle_buffer (GstCodecTimestamper * + timestamper, GstBuffer * buffer); +static void gst_h265_timestamper_process_nal (GstH265Timestamper * self, + GstH265NalUnit * nalu); + +G_DEFINE_TYPE (GstH265Timestamper, + gst_h265_timestamper, GST_TYPE_CODEC_TIMESTAMPER); + +GST_ELEMENT_REGISTER_DEFINE (h265timestamper, "h265timestamper", + GST_RANK_NONE, GST_TYPE_H265_TIMESTAMPER); + +static void +gst_h265_timestamper_class_init (GstH265TimestamperClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstCodecTimestamperClass *timestamper_class = + GST_CODEC_TIMESTAMPER_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &sinktemplate); + gst_element_class_add_static_pad_template (element_class, &srctemplate); + + gst_element_class_set_static_metadata (element_class, "H.265 timestamper", + "Codec/Video", "Timestamp H.265 streams", + "Seungha Yang <seungha@centricular.com>"); + + timestamper_class->start = GST_DEBUG_FUNCPTR (gst_h265_timestamper_start); + timestamper_class->stop = GST_DEBUG_FUNCPTR (gst_h265_timestamper_stop); + timestamper_class->set_caps = + GST_DEBUG_FUNCPTR (gst_h265_timestamper_set_caps); + timestamper_class->handle_buffer = + GST_DEBUG_FUNCPTR (gst_h265_timestamper_handle_buffer); + + GST_DEBUG_CATEGORY_INIT (gst_h265_timestamper_debug, "h265timestamper", 0, + "h265timestamper"); +} + +static void +gst_h265_timestamper_init (GstH265Timestamper * self) +{ +} + +static gboolean +gst_h265_timestamper_set_caps (GstCodecTimestamper * timestamper, + GstCaps * caps) +{ + GstH265Timestamper *self = GST_H265_TIMESTAMPER (timestamper); + GstStructure *s = gst_caps_get_structure (caps, 0); + const gchar *str; + gboolean found_format = FALSE; + const GValue *codec_data_val; + + self->packetized = FALSE; + self->nal_length_size = 4; + str = gst_structure_get_string (s, "stream-format"); + if (g_strcmp0 (str, "hvc1") == 0 || g_strcmp0 (str, "hev1") == 0) { + self->packetized = TRUE; + found_format = TRUE; + } else if (g_strcmp0 (str, "byte-stream") == 0) { + found_format = TRUE; + } + + codec_data_val = gst_structure_get_value (s, "codec_data"); + if (codec_data_val && GST_VALUE_HOLDS_BUFFER (codec_data_val)) { + GstBuffer *codec_data = gst_value_get_buffer (codec_data_val); + GstH265Parser *parser = self->parser; + GstMapInfo map; + GstH265NalUnit nalu; + GstH265ParserResult pres; + guint num_nal_arrays; + guint off; + guint num_nals, i, j; + guint8 *data; + gsize size; + + if (!gst_buffer_map (codec_data, &map, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Unable to map codec-data buffer"); + return FALSE; + } + + data = map.data; + size = map.size; + + /* parse the hvcC data */ + if (size < 23) { + GST_WARNING_OBJECT (self, "hvcC too small"); + goto unmap; + } + + /* wrong hvcC version */ + if (data0 != 0 && data0 != 1) { + goto unmap; + } + + self->nal_length_size = (data21 & 0x03) + 1; + GST_DEBUG_OBJECT (self, "nal length size %u", self->nal_length_size); + + num_nal_arrays = data22; + off = 23; + + for (i = 0; i < num_nal_arrays; i++) { + if (off + 3 >= size) { + GST_WARNING_OBJECT (self, "hvcC too small"); + goto unmap; + } + + num_nals = GST_READ_UINT16_BE (data + off + 1); + off += 3; + for (j = 0; j < num_nals; j++) { + pres = gst_h265_parser_identify_nalu_hevc (parser, + data, off, size, 2, &nalu); + + if (pres != GST_H265_PARSER_OK) { + GST_WARNING_OBJECT (self, "hvcC too small"); + goto unmap; + } + + gst_h265_timestamper_process_nal (self, &nalu); + + off = nalu.offset + nalu.size; + } + } + /* codec_data would mean packetized format */ + if (!found_format) + self->packetized = TRUE; + + unmap: + gst_buffer_unmap (codec_data, &map); + } + + return TRUE; +} + +static void +gst_h265_timestamper_process_sps (GstH265Timestamper * self, GstH265SPS * sps) +{ + guint max_reorder_frames = + sps->max_num_reorder_picssps->max_sub_layers_minus1; + + GST_DEBUG_OBJECT (self, "Max num reorder frames %d", max_reorder_frames); + + gst_codec_timestamper_set_window_size (GST_CODEC_TIMESTAMPER_CAST (self), + max_reorder_frames); +} + +static void +gst_h265_timestamper_process_nal (GstH265Timestamper * self, + GstH265NalUnit * nalu) +{ + GstH265ParserResult ret; + + switch (nalu->type) { + case GST_H265_NAL_VPS:{ + GstH265VPS vps; + ret = gst_h265_parser_parse_vps (self->parser, nalu, &vps); + if (ret != GST_H265_PARSER_OK) + GST_WARNING_OBJECT (self, "Failed to parse SPS"); + break; + } + case GST_H265_NAL_SPS:{ + GstH265SPS sps; + ret = gst_h265_parser_parse_sps (self->parser, nalu, &sps, FALSE); + if (ret != GST_H265_PARSER_OK) { + GST_WARNING_OBJECT (self, "Failed to parse SPS"); + break; + } + + gst_h265_timestamper_process_sps (self, &sps); + break; + } + /* TODO: parse PPS/SLICE and correct PTS based on POC if needed */ + default: + break; + } +} + +static GstFlowReturn +gst_h265_timestamper_handle_buffer (GstCodecTimestamper * timestamper, + GstBuffer * buffer) +{ + GstH265Timestamper *self = GST_H265_TIMESTAMPER (timestamper); + GstMapInfo map; + + /* Ignore any error while parsing NAL */ + if (gst_buffer_map (buffer, &map, GST_MAP_READ)) { + GstH265ParserResult ret; + GstH265NalUnit nalu; + + if (self->packetized) { + ret = gst_h265_parser_identify_nalu_hevc (self->parser, + map.data, 0, map.size, self->nal_length_size, &nalu); + + while (ret == GST_H265_PARSER_OK) { + gst_h265_timestamper_process_nal (self, &nalu); + + ret = gst_h265_parser_identify_nalu_hevc (self->parser, + map.data, nalu.offset + nalu.size, map.size, self->nal_length_size, + &nalu); + } + } else { + ret = gst_h265_parser_identify_nalu (self->parser, + map.data, 0, map.size, &nalu); + + if (ret == GST_H265_PARSER_NO_NAL_END) + ret = GST_H265_PARSER_OK; + + while (ret == GST_H265_PARSER_OK) { + gst_h265_timestamper_process_nal (self, &nalu); + + ret = gst_h265_parser_identify_nalu (self->parser, + map.data, nalu.offset + nalu.size, map.size, &nalu); + + if (ret == GST_H265_PARSER_NO_NAL_END) + ret = GST_H265_PARSER_OK; + } + } + gst_buffer_unmap (buffer, &map); + } + + return GST_FLOW_OK; +} + +static void +gst_h265_timestamper_reset (GstH265Timestamper * self) +{ + g_clear_pointer (&self->parser, gst_h265_parser_free); +} + +static gboolean +gst_h265_timestamper_start (GstCodecTimestamper * timestamper) +{ + GstH265Timestamper *self = GST_H265_TIMESTAMPER (timestamper); + + gst_h265_timestamper_reset (self); + + self->parser = gst_h265_parser_new (); + + return TRUE; +} + +static gboolean +gst_h265_timestamper_stop (GstCodecTimestamper * timestamper) +{ + GstH265Timestamper *self = GST_H265_TIMESTAMPER (timestamper); + + gst_h265_timestamper_reset (self); + + return TRUE; +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst/codectimestamper/gsth265timestamper.h
Added
@@ -0,0 +1,33 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include "gstcodectimestamper.h" + +G_BEGIN_DECLS + +#define GST_TYPE_H265_TIMESTAMPER (gst_h265_timestamper_get_type()) +G_DECLARE_FINAL_TYPE (GstH265Timestamper, gst_h265_timestamper, + GST, H265_TIMESTAMPER, GstCodecTimestamper); + +GST_ELEMENT_REGISTER_DECLARE (h265timestamper); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/gst/codectimestamper/meson.build
Added
@@ -0,0 +1,17 @@ +codectimestamper_sources = + 'gstcodectimestamper.c', + 'gsth264timestamper.c', + 'gsth265timestamper.c', + 'plugin.c', + + +gstcodectimestamper = library('gstcodectimestamper', + codectimestamper_sources, + c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API' , + include_directories : configinc, + dependencies : gstcodecparsers_dep, gstbase_dep, gstvideo_dep, + install : true, + install_dir : plugins_install_dir, +) +pkgconfig.generate(gstcodectimestamper, install_dir : plugins_pkgconfig_install_dir) +plugins += gstcodectimestamper
View file
gst-plugins-bad-1.22.0.tar.xz/gst/codectimestamper/plugin.c
Added
@@ -0,0 +1,47 @@ +/* + * GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * plugin-codectimestamper: + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gsth264timestamper.h" +#include "gsth265timestamper.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_ELEMENT_REGISTER (h264timestamper, plugin); + GST_ELEMENT_REGISTER (h265timestamper, plugin); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + codectimestamper, + "codectimestamper", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
View file
gst-plugins-bad-1.20.5.tar.xz/gst/coloreffects/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/coloreffects/meson.build
Changed
@@ -12,5 +12,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstcoloreffects, install_dir : plugins_pkgconfig_install_dir) plugins += gstcoloreffects
View file
gst-plugins-bad-1.20.5.tar.xz/gst/debugutils/gstfakeaudiosink.c -> gst-plugins-bad-1.22.0.tar.xz/gst/debugutils/gstfakeaudiosink.c
Changed
@@ -43,14 +43,93 @@ #include <gst/audio/audio.h> +typedef enum +{ + FAKE_SINK_STATE_ERROR_NONE = 0, + FAKE_SINK_STATE_ERROR_NULL_READY, + FAKE_SINK_STATE_ERROR_READY_PAUSED, + FAKE_SINK_STATE_ERROR_PAUSED_PLAYING, + FAKE_SINK_STATE_ERROR_PLAYING_PAUSED, + FAKE_SINK_STATE_ERROR_PAUSED_READY, + FAKE_SINK_STATE_ERROR_READY_NULL +} GstFakeSinkStateError; + +#define DEFAULT_DROP_OUT_OF_SEGMENT TRUE +#define DEFAULT_STATE_ERROR FAKE_SINK_STATE_ERROR_NONE +#define DEFAULT_SILENT TRUE +#define DEFAULT_DUMP FALSE +#define DEFAULT_SIGNAL_HANDOFFS FALSE +#define DEFAULT_LAST_MESSAGE NULL +#define DEFAULT_CAN_ACTIVATE_PUSH TRUE +#define DEFAULT_CAN_ACTIVATE_PULL FALSE +#define DEFAULT_NUM_BUFFERS -1 + +/** + * GstFakeAudioSinkStateError: + * + * Proxy for GstFakeSinkError. + * + * Since: 1.22 + */ + +#define GST_TYPE_FAKE_AUDIO_SINK_STATE_ERROR (gst_fake_audio_sink_state_error_get_type()) +static GType +gst_fake_audio_sink_state_error_get_type (void) +{ + static GType fakeaudiosink_state_error_type = 0; + static const GEnumValue fakeaudiosink_state_error = { + {FAKE_SINK_STATE_ERROR_NONE, "No state change errors", "none"}, + {FAKE_SINK_STATE_ERROR_NULL_READY, + "Fail state change from NULL to READY", "null-to-ready"}, + {FAKE_SINK_STATE_ERROR_READY_PAUSED, + "Fail state change from READY to PAUSED", "ready-to-paused"}, + {FAKE_SINK_STATE_ERROR_PAUSED_PLAYING, + "Fail state change from PAUSED to PLAYING", "paused-to-playing"}, + {FAKE_SINK_STATE_ERROR_PLAYING_PAUSED, + "Fail state change from PLAYING to PAUSED", "playing-to-paused"}, + {FAKE_SINK_STATE_ERROR_PAUSED_READY, + "Fail state change from PAUSED to READY", "paused-to-ready"}, + {FAKE_SINK_STATE_ERROR_READY_NULL, + "Fail state change from READY to NULL", "ready-to-null"}, + {0, NULL, NULL}, + }; + + if (!fakeaudiosink_state_error_type) { + fakeaudiosink_state_error_type = + g_enum_register_static ("GstFakeAudioSinkStateError", + fakeaudiosink_state_error); + } + return fakeaudiosink_state_error_type; +} + + enum { PROP_0, PROP_VOLUME, PROP_MUTE, + PROP_STATE_ERROR, + PROP_SILENT, + PROP_DUMP, + PROP_SIGNAL_HANDOFFS, + PROP_DROP_OUT_OF_SEGMENT, + PROP_LAST_MESSAGE, + PROP_CAN_ACTIVATE_PUSH, + PROP_CAN_ACTIVATE_PULL, + PROP_NUM_BUFFERS, PROP_LAST }; +enum +{ + SIGNAL_HANDOFF, + SIGNAL_PREROLL_HANDOFF, + LAST_SIGNAL +}; + +static guint gst_fake_audio_sink_signalsLAST_SIGNAL = { 0 }; + +static GParamSpec *pspec_last_message = NULL; static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, @@ -58,20 +137,31 @@ GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE (GST_AUDIO_FORMATS_ALL))); G_DEFINE_TYPE_WITH_CODE (GstFakeAudioSink, gst_fake_audio_sink, GST_TYPE_BIN, - G_IMPLEMENT_INTERFACE (GST_TYPE_STREAM_VOLUME, NULL);); + G_IMPLEMENT_INTERFACE (GST_TYPE_STREAM_VOLUME, NULL); + ); GST_ELEMENT_REGISTER_DEFINE (fakeaudiosink, "fakeaudiosink", GST_RANK_NONE, gst_fake_audio_sink_get_type ()); static void -gst_fake_audio_sink_proxy_properties (GstFakeAudioSink * self, - GstElement * child) +gst_fake_audio_sink_proxy_handoff (GstElement * element, GstBuffer * buffer, + GstPad * pad, GstFakeAudioSink * self) { - static gsize initialized = 0; + g_signal_emit (self, gst_fake_audio_sink_signalsSIGNAL_HANDOFF, 0, + buffer, self->sinkpad); +} - if (g_once_init_enter (&initialized)) { - gst_fake_sink_proxy_properties (GST_ELEMENT_CAST (self), child, PROP_LAST); - g_once_init_leave (&initialized, 1); - } +static void +gst_fake_audio_sink_proxy_preroll_handoff (GstElement * element, + GstBuffer * buffer, GstPad * pad, GstFakeAudioSink * self) +{ + g_signal_emit (self, gst_fake_audio_sink_signalsSIGNAL_PREROLL_HANDOFF, 0, + buffer, self->sinkpad); +} + +static void +gst_fake_audio_sink_proxy_last_message (GstElement * element) +{ + g_object_notify_by_pspec ((GObject *) element, pspec_last_message); } static void @@ -94,14 +184,20 @@ gst_bin_add (GST_BIN_CAST (self), child); - ghost_pad = gst_ghost_pad_new_from_template ("sink", sink_pad, template); + self->sinkpad = ghost_pad = + gst_ghost_pad_new_from_template ("sink", sink_pad, template); gst_object_unref (template); gst_element_add_pad (GST_ELEMENT_CAST (self), ghost_pad); gst_object_unref (sink_pad); self->child = child; - gst_fake_audio_sink_proxy_properties (self, child); + g_signal_connect (child, "notify::last-message", + G_CALLBACK (gst_fake_audio_sink_proxy_last_message), self); + g_signal_connect (child, "handoff", + G_CALLBACK (gst_fake_audio_sink_proxy_handoff), self); + g_signal_connect (child, "preroll-handoff", + G_CALLBACK (gst_fake_audio_sink_proxy_preroll_handoff), self); } else { g_warning ("Check your GStreamer installation, " "core element 'fakesink' is missing."); @@ -151,6 +247,7 @@ { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); + GObjectClass *base_sink_class; object_class->get_property = gst_fake_audio_sink_get_property; object_class->set_property = gst_fake_audio_sink_set_property; @@ -180,8 +277,88 @@ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstFakeAudioSink::handoff: + * @fakeaudiosink: the fakeaudiosink instance + * @buffer: the buffer that just has been received + * @pad: the pad that received it + * + * This signal gets emitted before unreffing the buffer. + * + * Since: 1.22 + */ + gst_fake_audio_sink_signalsSIGNAL_HANDOFF = + g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstFakeAudioSinkClass, handoff), NULL, NULL, + NULL, G_TYPE_NONE, 2, GST_TYPE_BUFFER | G_SIGNAL_TYPE_STATIC_SCOPE, + GST_TYPE_PAD); + + /** + * GstFakeAudioSink::preroll-handoff: + * @fakeaudiosink: the fakeaudiosink instance + * @buffer: the buffer that just has been received + * @pad: the pad that received it + * + * This signal gets emitted before unreffing the buffer. + * + * Since: 1.22 + */ + gst_fake_audio_sink_signalsSIGNAL_PREROLL_HANDOFF = + g_signal_new ("preroll-handoff", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstFakeAudioSinkClass, + preroll_handoff), NULL, NULL, NULL, G_TYPE_NONE, 2, + GST_TYPE_BUFFER | G_SIGNAL_TYPE_STATIC_SCOPE, GST_TYPE_PAD); + + g_object_class_install_property (object_class, PROP_STATE_ERROR, + g_param_spec_enum ("state-error", "State Error", + "Generate a state change error", GST_TYPE_FAKE_AUDIO_SINK_STATE_ERROR, + DEFAULT_STATE_ERROR, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + pspec_last_message = g_param_spec_string ("last-message", "Last Message", + "The message describing current status", DEFAULT_LAST_MESSAGE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_LAST_MESSAGE, + pspec_last_message); + g_object_class_install_property (object_class, PROP_SIGNAL_HANDOFFS, + g_param_spec_boolean ("signal-handoffs", "Signal handoffs", + "Send a signal before unreffing the buffer", DEFAULT_SIGNAL_HANDOFFS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_DROP_OUT_OF_SEGMENT, + g_param_spec_boolean ("drop-out-of-segment", + "Drop out-of-segment buffers", + "Drop and don't render / hand off out-of-segment buffers", + DEFAULT_DROP_OUT_OF_SEGMENT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_SILENT, + g_param_spec_boolean ("silent", "Silent", + "Don't produce last_message events", DEFAULT_SILENT, + G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_DUMP, + g_param_spec_boolean ("dump", "Dump", "Dump buffer contents to stdout", + DEFAULT_DUMP, + G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_CAN_ACTIVATE_PUSH, + g_param_spec_boolean ("can-activate-push", "Can activate push", + "Can activate in push mode", DEFAULT_CAN_ACTIVATE_PUSH, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_CAN_ACTIVATE_PULL, + g_param_spec_boolean ("can-activate-pull", "Can activate pull", + "Can activate in pull mode", DEFAULT_CAN_ACTIVATE_PULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_NUM_BUFFERS, + g_param_spec_int ("num-buffers", "num-buffers", + "Number of buffers to accept going EOS", -1, G_MAXINT, + DEFAULT_NUM_BUFFERS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + base_sink_class = g_type_class_ref (GST_TYPE_BASE_SINK); + gst_util_proxy_class_properties (object_class, base_sink_class, PROP_LAST); + g_type_class_unref (base_sink_class); + gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_set_static_metadata (element_class, "Fake Audio Sink", "Audio/Sink", "Fake audio renderer", "Philippe Normand <philn@igalia.com>"); + + gst_type_mark_as_plugin_api (GST_TYPE_FAKE_AUDIO_SINK_STATE_ERROR, 0); }
View file
gst-plugins-bad-1.20.5.tar.xz/gst/debugutils/gstfakeaudiosink.h -> gst-plugins-bad-1.22.0.tar.xz/gst/debugutils/gstfakeaudiosink.h
Changed
@@ -47,6 +47,7 @@ { GstBin parent; GstElement *child; + GstPad *sinkpad; gdouble volume; gboolean mute; }; @@ -54,6 +55,10 @@ struct _GstFakeAudioSinkClass { GstBinClass parent; + + /* signals */ + void (*handoff) (GstElement *element, GstBuffer *buf, GstPad *pad); + void (*preroll_handoff) (GstElement *element, GstBuffer *buf, GstPad *pad); }; GType gst_fake_audio_sink_get_type (void);
View file
gst-plugins-bad-1.20.5.tar.xz/gst/debugutils/gstfakesinkutils.c -> gst-plugins-bad-1.22.0.tar.xz/gst/debugutils/gstfakesinkutils.c
Changed
@@ -24,22 +24,20 @@ /* TODO complete the types */ void -gst_fake_sink_proxy_properties (GstElement * self, - GstElement * child, guint property_id_offset) +gst_util_proxy_class_properties (GObjectClass * object_class, + GObjectClass * target_class, guint property_id_offset) { - GObjectClass *object_class; GParamSpec **properties; guint n_properties, i; - object_class = G_OBJECT_CLASS (GST_ELEMENT_GET_CLASS (self)); - properties = g_object_class_list_properties (G_OBJECT_GET_CLASS (child), + properties = g_object_class_list_properties (G_OBJECT_CLASS (target_class), &n_properties); for (i = 0; i < n_properties; i++) { guint property_id = i + property_id_offset; - if (propertiesi->owner_type != G_OBJECT_TYPE (child) && - propertiesi->owner_type != GST_TYPE_BASE_SINK) + if (propertiesi->owner_type == G_TYPE_OBJECT + || propertiesi->owner_type == GST_TYPE_OBJECT) continue; if (G_IS_PARAM_SPEC_BOOLEAN (propertiesi)) {
View file
gst-plugins-bad-1.20.5.tar.xz/gst/debugutils/gstfakesinkutils.h -> gst-plugins-bad-1.22.0.tar.xz/gst/debugutils/gstfakesinkutils.h
Changed
@@ -26,7 +26,10 @@ G_BEGIN_DECLS -void gst_fake_sink_proxy_properties (GstElement * self, GstElement * child, guint property_id_offset); +void +gst_util_proxy_class_properties (GObjectClass *object_class, + GObjectClass *target_class, + guint property_id_offset); G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/gst/debugutils/gstfakevideosink.c -> gst-plugins-bad-1.22.0.tar.xz/gst/debugutils/gstfakevideosink.c
Changed
@@ -70,13 +70,92 @@ return id; } +typedef enum +{ + FAKE_SINK_STATE_ERROR_NONE = 0, + FAKE_SINK_STATE_ERROR_NULL_READY, + FAKE_SINK_STATE_ERROR_READY_PAUSED, + FAKE_SINK_STATE_ERROR_PAUSED_PLAYING, + FAKE_SINK_STATE_ERROR_PLAYING_PAUSED, + FAKE_SINK_STATE_ERROR_PAUSED_READY, + FAKE_SINK_STATE_ERROR_READY_NULL +} GstFakeSinkStateError; + +#define DEFAULT_DROP_OUT_OF_SEGMENT TRUE +#define DEFAULT_STATE_ERROR FAKE_SINK_STATE_ERROR_NONE +#define DEFAULT_SILENT TRUE +#define DEFAULT_DUMP FALSE +#define DEFAULT_SIGNAL_HANDOFFS FALSE +#define DEFAULT_LAST_MESSAGE NULL +#define DEFAULT_CAN_ACTIVATE_PUSH TRUE +#define DEFAULT_CAN_ACTIVATE_PULL FALSE +#define DEFAULT_NUM_BUFFERS -1 + +/** + * GstFakeVideoSinkStateError: + * + * Proxy for GstFakeSinkError. + * + * Since: 1.22 + */ + +#define GST_TYPE_FAKE_VIDEO_SINK_STATE_ERROR (gst_fake_video_sink_state_error_get_type()) +static GType +gst_fake_video_sink_state_error_get_type (void) +{ + static GType fakevideosink_state_error_type = 0; + static const GEnumValue fakevideosink_state_error = { + {FAKE_SINK_STATE_ERROR_NONE, "No state change errors", "none"}, + {FAKE_SINK_STATE_ERROR_NULL_READY, + "Fail state change from NULL to READY", "null-to-ready"}, + {FAKE_SINK_STATE_ERROR_READY_PAUSED, + "Fail state change from READY to PAUSED", "ready-to-paused"}, + {FAKE_SINK_STATE_ERROR_PAUSED_PLAYING, + "Fail state change from PAUSED to PLAYING", "paused-to-playing"}, + {FAKE_SINK_STATE_ERROR_PLAYING_PAUSED, + "Fail state change from PLAYING to PAUSED", "playing-to-paused"}, + {FAKE_SINK_STATE_ERROR_PAUSED_READY, + "Fail state change from PAUSED to READY", "paused-to-ready"}, + {FAKE_SINK_STATE_ERROR_READY_NULL, + "Fail state change from READY to NULL", "ready-to-null"}, + {0, NULL, NULL}, + }; + + if (!fakevideosink_state_error_type) { + fakevideosink_state_error_type = + g_enum_register_static ("GstFakeVideoSinkStateError", + fakevideosink_state_error); + } + return fakevideosink_state_error_type; +} + enum { PROP_0, PROP_ALLOCATION_META_FLAGS, + PROP_STATE_ERROR, + PROP_SILENT, + PROP_DUMP, + PROP_SIGNAL_HANDOFFS, + PROP_DROP_OUT_OF_SEGMENT, + PROP_LAST_MESSAGE, + PROP_CAN_ACTIVATE_PUSH, + PROP_CAN_ACTIVATE_PULL, + PROP_NUM_BUFFERS, PROP_LAST }; +enum +{ + SIGNAL_HANDOFF, + SIGNAL_PREROLL_HANDOFF, + LAST_SIGNAL +}; + +static guint gst_fake_video_sink_signalsLAST_SIGNAL = { 0 }; + +static GParamSpec *pspec_last_message = NULL; + #define ALLOCATION_META_DEFAULT_FLAGS GST_ALLOCATION_FLAG_CROP_META | GST_ALLOCATION_FLAG_OVERLAY_COMPOSITION_META static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", @@ -128,15 +207,25 @@ } static void -gst_fake_video_sink_proxy_properties (GstFakeVideoSink * self, - GstElement * child) +gst_fake_video_sink_proxy_handoff (GstElement * element, GstBuffer * buffer, + GstPad * pad, GstFakeVideoSink * self) { - static gsize initialized = 0; + g_signal_emit (self, gst_fake_video_sink_signalsSIGNAL_HANDOFF, 0, + buffer, self->sinkpad); +} - if (g_once_init_enter (&initialized)) { - gst_fake_sink_proxy_properties (GST_ELEMENT_CAST (self), child, PROP_LAST); - g_once_init_leave (&initialized, 1); - } +static void +gst_fake_video_sink_proxy_last_message (GstElement * element) +{ + g_object_notify_by_pspec ((GObject *) element, pspec_last_message); +} + +static void +gst_fake_video_sink_proxy_preroll_handoff (GstElement * element, + GstBuffer * buffer, GstPad * pad, GstFakeVideoSink * self) +{ + g_signal_emit (self, gst_fake_video_sink_signalsSIGNAL_PREROLL_HANDOFF, 0, + buffer, self->sinkpad); } static void @@ -160,7 +249,8 @@ gst_bin_add (GST_BIN (self), child); - ghost_pad = gst_ghost_pad_new_from_template ("sink", sink_pad, template); + self->sinkpad = ghost_pad = + gst_ghost_pad_new_from_template ("sink", sink_pad, template); gst_object_unref (template); gst_element_add_pad (GST_ELEMENT (self), ghost_pad); gst_object_unref (sink_pad); @@ -169,7 +259,12 @@ self->child = child; - gst_fake_video_sink_proxy_properties (self, child); + g_signal_connect (child, "notify::last-message", + G_CALLBACK (gst_fake_video_sink_proxy_last_message), self); + g_signal_connect (child, "handoff", + G_CALLBACK (gst_fake_video_sink_proxy_handoff), self); + g_signal_connect (child, "preroll-handoff", + G_CALLBACK (gst_fake_video_sink_proxy_preroll_handoff), self); } else { g_warning ("Check your GStreamer installation, " "core element 'fakesink' is missing."); @@ -217,6 +312,7 @@ { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); + GObjectClass *base_sink_class; object_class->get_property = gst_fake_video_sink_get_property; object_class->set_property = gst_fake_video_sink_set_property; @@ -240,6 +336,85 @@ ALLOCATION_META_DEFAULT_FLAGS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstFakeVideoSink::handoff: + * @fakevideosink: the fakevideosink instance + * @buffer: the buffer that just has been received + * @pad: the pad that received it + * + * This signal gets emitted before unreffing the buffer. + * + * Since: 1.22 + */ + gst_fake_video_sink_signalsSIGNAL_HANDOFF = + g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstFakeVideoSinkClass, handoff), NULL, NULL, + NULL, G_TYPE_NONE, 2, GST_TYPE_BUFFER | G_SIGNAL_TYPE_STATIC_SCOPE, + GST_TYPE_PAD); + + /** + * GstFakeVideoSink::preroll-handoff: + * @fakevideosink: the fakevideosink instance + * @buffer: the buffer that just has been received + * @pad: the pad that received it + * + * This signal gets emitted before unreffing the buffer. + * + * Since: 1.22 + */ + gst_fake_video_sink_signalsSIGNAL_PREROLL_HANDOFF = + g_signal_new ("preroll-handoff", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstFakeVideoSinkClass, + preroll_handoff), NULL, NULL, NULL, G_TYPE_NONE, 2, + GST_TYPE_BUFFER | G_SIGNAL_TYPE_STATIC_SCOPE, GST_TYPE_PAD); + + g_object_class_install_property (object_class, PROP_STATE_ERROR, + g_param_spec_enum ("state-error", "State Error", + "Generate a state change error", GST_TYPE_FAKE_VIDEO_SINK_STATE_ERROR, + DEFAULT_STATE_ERROR, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + pspec_last_message = g_param_spec_string ("last-message", "Last Message", + "The message describing current status", DEFAULT_LAST_MESSAGE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_LAST_MESSAGE, + pspec_last_message); + g_object_class_install_property (object_class, PROP_SIGNAL_HANDOFFS, + g_param_spec_boolean ("signal-handoffs", "Signal handoffs", + "Send a signal before unreffing the buffer", DEFAULT_SIGNAL_HANDOFFS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_DROP_OUT_OF_SEGMENT, + g_param_spec_boolean ("drop-out-of-segment", + "Drop out-of-segment buffers", + "Drop and don't render / hand off out-of-segment buffers", + DEFAULT_DROP_OUT_OF_SEGMENT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_SILENT, + g_param_spec_boolean ("silent", "Silent", + "Don't produce last_message events", DEFAULT_SILENT, + G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_DUMP, + g_param_spec_boolean ("dump", "Dump", "Dump buffer contents to stdout", + DEFAULT_DUMP, + G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_CAN_ACTIVATE_PUSH, + g_param_spec_boolean ("can-activate-push", "Can activate push", + "Can activate in push mode", DEFAULT_CAN_ACTIVATE_PUSH, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_CAN_ACTIVATE_PULL, + g_param_spec_boolean ("can-activate-pull", "Can activate pull", + "Can activate in pull mode", DEFAULT_CAN_ACTIVATE_PULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_NUM_BUFFERS, + g_param_spec_int ("num-buffers", "num-buffers", + "Number of buffers to accept going EOS", -1, G_MAXINT, + DEFAULT_NUM_BUFFERS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + base_sink_class = g_type_class_ref (GST_TYPE_BASE_SINK); + gst_util_proxy_class_properties (object_class, base_sink_class, PROP_LAST); + g_type_class_unref (base_sink_class); + gst_type_mark_as_plugin_api (GST_TYPE_FAKE_VIDEO_SINK_ALLOCATION_META_FLAGS, 0); + gst_type_mark_as_plugin_api (GST_TYPE_FAKE_VIDEO_SINK_STATE_ERROR, 0); }
View file
gst-plugins-bad-1.20.5.tar.xz/gst/debugutils/gstfakevideosink.h -> gst-plugins-bad-1.22.0.tar.xz/gst/debugutils/gstfakevideosink.h
Changed
@@ -65,11 +65,16 @@ GstBin parent; GstElement *child; GstFakeVideoSinkAllocationMetaFlags allocation_meta_flags; + GstPad *sinkpad; }; struct _GstFakeVideoSinkClass { GstBinClass parent; + + /* signals */ + void (*handoff) (GstElement *element, GstBuffer *buf, GstPad *pad); + void (*preroll_handoff) (GstElement *element, GstBuffer *buf, GstPad *pad); }; GType gst_fake_video_sink_get_type (void);
View file
gst-plugins-bad-1.20.5.tar.xz/gst/debugutils/gsttestsrcbin.c -> gst-plugins-bad-1.22.0.tar.xz/gst/debugutils/gsttestsrcbin.c
Changed
@@ -23,17 +23,56 @@ * SECTION:element-testsrcbin * @title: testsrc * - * This is a simple GstBin source that wraps audiotestsrc/videotestsrc - * following specification passed in the URI (it implements the #GstURIHandler interface) + * This is a simple GstBin source that wraps audiotestsrc/videotestsrc following + * specification passed in the URI (it implements the #GstURIHandler interface) * in the form of `testbin://audio+video` or setting the "stream-types" property * with the same format. * - * This element also provides GstStream and GstStreamCollection and - * thus the element is useful for testing the new playbin3 infrastructure. + * This element also provides GstStream and GstStreamCollection and thus the + * element is useful for testing the new playbin3 infrastructure. + * + * ## The `uri` format + * + * `testbin://<stream1 definition>+<stream2 definition>` + * + * With **<stream definition>**: + * + * `<media-type>,<element-properties>,caps=<media caps>` + * + * where: + * + * - `<media-type>`: Adds a new source of type `<media-type>`. Supported + * values: + * * `video`: A #videotestsrc element will be used + * * `audio`: An #audiotestsrc will be used + * you can use it as many time as wanted to expose new streams. + * - `<element-properties>`: `key=value` list of properties to be set on the + * source element. See #videotestsrc properties for the video case and + * #audiotestsrc properties for the audio case. + * - `<media caps>`: Caps to be set in the #capsfilter that follows source elements + * for example to force the video source to output a full HD stream, you can use + * `video/x-raw,width=1920,height=1080`. + * + * Note that stream definitions are interpreted as serialized #GstStructure. + * + * ## Examples pipeline: + * + * ### One audio stream with volume=0.5 and a white video stream in full HD at 30fps + * + * ``` + * gst-launch-1.0 playbin3 uri="testbin://audio,volume=0.5+video,pattern=white,caps=video/x-raw,width=1920,height=1080,framerate=30/1" + * ``` + + * ### Single full HD stream + * + * ``` + * gst-launch-1.0 playbin3 uri="testbin://video,pattern=green,caps=video/x-raw,width=1920,height=1080,framerate=30/1" + * ``` + * + * ### Two audio streams * - * Example pipeline: * ``` - * gst-launch-1.0 playbin uri=testbin://audio,volume=0.5+video,pattern=white + * gst-launch-1.0 playbin3 uri="testbin://audio+audio" * ``` */ #include <gst/gst.h> @@ -73,16 +112,18 @@ GstBin parent; gchar *uri; - GstStreamCollection *collection; gint group_id; GstFlowCombiner *flow_combiner; GstCaps *streams_def; + GstCaps *next_streams_def; + gboolean expose_sources_async; }; enum { PROP_0, PROP_STREAM_TYPES, + PROP_EXPOSE_SOURCES_ASYNC, PROP_LAST }; @@ -200,6 +241,9 @@ if (property_id == g_quark_from_static_string ("__streamobj__")) return TRUE; + if (property_id == g_quark_from_static_string ("caps")) + return TRUE; + if (G_VALUE_HOLDS_STRING (value)) gst_util_set_object_arg (element, g_quark_to_string (property_id), g_value_get_string (value)); @@ -250,19 +294,64 @@ return gst_pad_event_default (pad, parent, event); } -static void +static gboolean gst_test_src_bin_setup_src (GstTestSrcBin * self, const gchar * srcfactory, GstStaticPadTemplate * template, GstStreamType stype, - GstStreamCollection * collection, gint * n_stream, GstStructure * props) + GstStreamCollection * collection, gint * n_stream, GstStructure * props, + GError ** error) { - GstElement *src = gst_element_factory_make (srcfactory, NULL); - GstPad *proxypad, *ghost, *pad = gst_element_get_static_pad (src, "src"); - gchar *stream_id = g_strdup_printf ("%s_stream_%d", srcfactory, *n_stream); - gchar *pad_name = g_strdup_printf (template->name_template, *n_stream); - GstStream *stream = gst_stream_new (stream_id, NULL, stype, + GstElement *src; + GstElement *capsfilter; + GstPad *proxypad, *ghost, *pad; + gchar *stream_id; + gchar *pad_name; + GstCaps *caps = NULL; + GstStream *stream; + GstEvent *stream_start; + GstPadTemplate *templ; + const GValue *caps_value = gst_structure_get_value (props, "caps"); + + if (caps_value) { + if (GST_VALUE_HOLDS_CAPS (caps_value)) { + caps = gst_caps_copy (gst_value_get_caps (caps_value)); + } else if (GST_VALUE_HOLDS_STRUCTURE (caps_value)) { + caps = + gst_caps_new_full (gst_structure_copy (gst_value_get_structure + (caps_value)), NULL); + } else if (G_VALUE_HOLDS_STRING (caps_value)) { + caps = gst_caps_from_string (g_value_get_string (caps_value)); + if (!caps) { + if (error) { + *error = + g_error_new (GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED, + "Invalid caps string: %s", g_value_get_string (caps_value)); + } + + return FALSE; + } + } else { + if (error) { + *error = + g_error_new (GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED, + "Invalid type %s for `caps`", G_VALUE_TYPE_NAME (caps_value)); + } + + return FALSE; + } + } + + capsfilter = gst_element_factory_make ("capsfilter", NULL); + if (caps) { + g_object_set (capsfilter, "caps", caps, NULL); + gst_caps_unref (caps); + } + + src = gst_element_factory_make (srcfactory, NULL); + pad = gst_element_get_static_pad (src, "src"); + stream_id = g_strdup_printf ("%s_stream_%d", srcfactory, *n_stream); + stream = gst_stream_new (stream_id, caps, stype, (*n_stream == 0) ? GST_STREAM_FLAG_SELECT : GST_STREAM_FLAG_UNSELECT); - GstEvent *stream_start = - gst_event_new_stream_start (gst_stream_get_stream_id (stream)); + stream_start = gst_event_new_stream_start (gst_stream_get_stream_id (stream)); gst_structure_foreach (props, (GstStructureForeachFunc) gst_test_src_bin_set_element_property, src); @@ -279,11 +368,21 @@ g_free (stream_id); - gst_bin_add (GST_BIN (self), src); + gst_bin_add_many (GST_BIN (self), src, capsfilter, NULL); + if (!gst_element_link (src, capsfilter)) { + g_error ("Could not link src with capsfilter?!"); + } + + gst_object_unref (pad); + + pad = gst_element_get_static_pad (capsfilter, "src"); + pad_name = g_strdup_printf (template->name_template, *n_stream); + templ = gst_static_pad_template_get (template); + ghost = gst_ghost_pad_new_from_template (pad_name, pad, templ); + gst_object_unref (templ); + g_free (pad_name); + gst_object_unref (pad); - ghost = - gst_ghost_pad_new_from_template (pad_name, pad, - gst_static_pad_template_get (template)); proxypad = GST_PAD (gst_proxy_pad_get_internal (GST_PROXY_PAD (ghost))); gst_flow_combiner_add_pad (self->flow_combiner, ghost); gst_pad_set_chain_function (proxypad, @@ -291,12 +390,17 @@ gst_pad_set_event_function (ghost, (GstPadEventFunction) gst_test_src_event_function); gst_object_unref (proxypad); + gst_pad_store_sticky_event (ghost, stream_start); gst_element_add_pad (GST_ELEMENT (self), ghost); - gst_object_unref (pad); + gst_element_sync_state_with_parent (capsfilter); gst_element_sync_state_with_parent (src); *n_stream += 1; gst_structure_set (props, "__src__", GST_TYPE_OBJECT, src, NULL); + + gst_clear_caps (&caps); + + return TRUE; } static void @@ -350,24 +454,22 @@ } static gboolean -gst_test_src_bin_uri_handler_set_uri (GstURIHandler * handler, - const gchar * uri, GError ** error) +gst_test_src_bin_create_sources (GstTestSrcBin * self) { - GstTestSrcBin *self = GST_TEST_SRC_BIN (handler); - gchar *tmp, *location = gst_uri_get_location (uri); gint i, n_audio = 0, n_video = 0; + GError *error = NULL; GstStreamCollection *collection = gst_stream_collection_new (NULL); - GstCaps *streams_def, *prev_streams = self->streams_def; - - for (tmp = location; *tmp != '\0'; tmp++) - if (*tmp == '+') - *tmp = ';'; + GstCaps *streams_def, *prev_streams_def; - streams_def = gst_caps_from_string (location); - g_free (location); + GST_OBJECT_LOCK (self); + streams_def = self->next_streams_def; + prev_streams_def = self->streams_def; + self->next_streams_def = NULL; + self->streams_def = NULL; + GST_OBJECT_UNLOCK (self); - if (!streams_def) - goto failed; + GST_INFO_OBJECT (self, "Create sources %" GST_PTR_FORMAT, + self->next_streams_def); self->group_id = gst_util_group_id_next (); for (i = 0; i < gst_caps_get_size (streams_def); i++) { @@ -375,7 +477,8 @@ GstStructure *stream_def = gst_caps_get_structure (streams_def, i); if ((stream = - gst_test_check_prev_stream_def (self, prev_streams, stream_def))) { + gst_test_check_prev_stream_def (self, prev_streams_def, + stream_def))) { GST_INFO_OBJECT (self, "Reusing already existing stream: %" GST_PTR_FORMAT, stream_def); gst_stream_collection_add_stream (collection, stream); @@ -386,43 +489,104 @@ continue; } - if (gst_structure_has_name (stream_def, "video")) - gst_test_src_bin_setup_src (self, "videotestsrc", &video_src_template, - GST_STREAM_TYPE_VIDEO, collection, &n_video, stream_def); - else if (gst_structure_has_name (stream_def, "audio")) - gst_test_src_bin_setup_src (self, "audiotestsrc", &audio_src_template, - GST_STREAM_TYPE_AUDIO, collection, &n_audio, stream_def); - else + if (gst_structure_has_name (stream_def, "video")) { + if (!gst_test_src_bin_setup_src (self, "videotestsrc", + &video_src_template, GST_STREAM_TYPE_VIDEO, collection, &n_video, + stream_def, &error)) { + goto failed; + } + } else if (gst_structure_has_name (stream_def, "audio")) { + if (!gst_test_src_bin_setup_src (self, "audiotestsrc", + &audio_src_template, GST_STREAM_TYPE_AUDIO, collection, &n_audio, + stream_def, &error)) { + goto failed; + } + } else { GST_ERROR_OBJECT (self, "Unknown type %s", gst_structure_get_name (stream_def)); + } } - self->streams_def = streams_def; - if (prev_streams) { - for (i = 0; i < gst_caps_get_size (prev_streams); i++) { - GstStructure *prev_stream = gst_caps_get_structure (prev_streams, i); + if (prev_streams_def) { + for (i = 0; i < gst_caps_get_size (prev_streams_def); i++) { + GstStructure *prev_stream = gst_caps_get_structure (prev_streams_def, i); GstElement *child; gst_structure_get (prev_stream, "__src__", GST_TYPE_OBJECT, &child, NULL); gst_test_src_bin_remove_child (GST_ELEMENT (self), child); } - gst_clear_caps (&prev_streams); + gst_clear_caps (&prev_streams_def); } - if (!n_video && !n_audio) + if (!n_video && !n_audio) { + GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, + ("No audio or video stream defined."), (NULL)); goto failed; + } + + GST_OBJECT_LOCK (self); + self->streams_def = streams_def; + GST_OBJECT_UNLOCK (self); - self->uri = g_strdup (uri); gst_element_post_message (GST_ELEMENT (self), gst_message_new_stream_collection (GST_OBJECT (self), collection)); + gst_object_unref (collection); + + gst_element_no_more_pads (GST_ELEMENT (self)); + + return TRUE; + +failed: + gst_element_post_message (GST_ELEMENT (self), + gst_message_new_error (GST_OBJECT (self), error, NULL) + ); + return FALSE; +} + +static gboolean +gst_test_src_bin_uri_handler_set_uri (GstURIHandler * handler, + const gchar * uri, GError ** error) +{ + GstTestSrcBin *self = GST_TEST_SRC_BIN (handler); + gchar *tmp, *location = gst_uri_get_location (uri); + GstCaps *streams_def; + + for (tmp = location; *tmp != '\0'; tmp++) + if (*tmp == '+') + *tmp = ';'; + + streams_def = gst_caps_from_string (location); + g_free (location); + + if (!streams_def) + goto failed; + + GST_OBJECT_LOCK (self); + gst_clear_caps (&self->next_streams_def); + self->next_streams_def = streams_def; + g_free (self->uri); + self->uri = g_strdup (uri); + + if (GST_STATE (self) >= GST_STATE_PAUSED) { + + if (self->expose_sources_async) { + GST_OBJECT_UNLOCK (self); + + gst_element_call_async (GST_ELEMENT (self), + (GstElementCallAsyncFunc) gst_test_src_bin_create_sources, + NULL, NULL); + } else { + GST_OBJECT_UNLOCK (self); + + gst_test_src_bin_create_sources (self); + } + } else { + GST_OBJECT_UNLOCK (self); + } return TRUE; failed: - if (error) - *error = - g_error_new_literal (GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED, - "No media type specified in the testbin:// URL."); return FALSE; } @@ -461,6 +625,13 @@ g_free (uri); break; } + case PROP_EXPOSE_SOURCES_ASYNC: + { + GST_OBJECT_LOCK (self); + self->expose_sources_async = g_value_get_boolean (value); + GST_OBJECT_UNLOCK (self); + break; + } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -485,6 +656,13 @@ } break; } + case PROP_EXPOSE_SOURCES_ASYNC: + { + GST_OBJECT_LOCK (self); + g_value_set_boolean (value, self->expose_sources_async); + GST_OBJECT_UNLOCK (self); + break; + } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -497,6 +675,21 @@ GstTestSrcBin *self = GST_TEST_SRC_BIN (element); GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE; + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED:{ + if (self->expose_sources_async) { + gst_element_call_async (element, + (GstElementCallAsyncFunc) gst_test_src_bin_create_sources, + NULL, NULL); + } else { + gst_test_src_bin_create_sources (self); + } + break; + } + default: + break; + } + result = GST_ELEMENT_CLASS (gst_test_src_bin_parent_class)->change_state (element, transition); @@ -518,9 +711,12 @@ { GstTestSrcBin *self = GST_TEST_SRC_BIN (object); + G_OBJECT_CLASS (gst_test_src_bin_parent_class)->finalize (object); + g_free (self->uri); gst_clear_caps (&self->streams_def); gst_flow_combiner_free (self->flow_combiner); + } static void @@ -540,7 +736,7 @@ gobject_class->set_property = gst_test_src_bin_set_property; /** - * GstTestSrcBin::stream-types: + * GstTestSrcBin:stream-types: * * String describing the stream types to expose, eg. "video+audio". */ @@ -549,6 +745,20 @@ "String describing the stream types to expose, eg. \"video+audio\".", NULL, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + /** + * GstTestSrcBin:expose-sources-async: + * + * Whether to expose sources at random time to simulate a source that is + * reading a file and exposing the srcpads later. + * + * Since: 1.20 + */ + g_object_class_install_property (gobject_class, PROP_EXPOSE_SOURCES_ASYNC, + g_param_spec_boolean ("expose-sources-async", "Expose Sources Async", + " Whether to expose sources at random time to simulate a source that is" + " reading a file and exposing the srcpads later.", + FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + gstelement_klass->change_state = GST_DEBUG_FUNCPTR (gst_test_src_bin_change_state); gst_element_class_add_pad_template (gstelement_klass,
View file
gst-plugins-bad-1.20.5.tar.xz/gst/debugutils/gstvideocodectestsink.c -> gst-plugins-bad-1.22.0.tar.xz/gst/debugutils/gstvideocodectestsink.c
Changed
@@ -79,7 +79,9 @@ GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-raw, format = { I420, I420_10LE, NV12 }")); + GST_STATIC_CAPS ("video/x-raw, format = { " + "Y444_12LE, I422_12LE, I420_12LE," + "Y444_10LE, I422_10LE, I420_10LE, Y444, Y42B, I420, NV12 }")); #define gst_video_codec_test_sink_parent_class parent_class G_DEFINE_TYPE (GstVideoCodecTestSink, gst_video_codec_test_sink, @@ -209,7 +211,7 @@ } static GstFlowReturn -gst_video_codec_test_sink_process_i420 (GstVideoCodecTestSink * self, +gst_video_codec_test_sink_process_i42x (GstVideoCodecTestSink * self, GstVideoFrame * frame) { guint plane; @@ -312,7 +314,14 @@ switch (GST_VIDEO_INFO_FORMAT (&self->vinfo)) { case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_I420_10LE: - self->process = gst_video_codec_test_sink_process_i420; + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_I420_12LE: + case GST_VIDEO_FORMAT_I422_12LE: + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_Y444_12LE: + self->process = gst_video_codec_test_sink_process_i42x; break; case GST_VIDEO_FORMAT_NV12: self->process = gst_video_codec_test_sink_process_nv12;
View file
gst-plugins-bad-1.20.5.tar.xz/gst/debugutils/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/debugutils/meson.build
Changed
@@ -23,5 +23,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstdebugutilsbad, install_dir : plugins_pkgconfig_install_dir) plugins += gstdebugutilsbad
View file
gst-plugins-bad-1.20.5.tar.xz/gst/dvbsubenc/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/dvbsubenc/meson.build
Changed
@@ -26,5 +26,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstdvbsubenc, install_dir : plugins_pkgconfig_install_dir) plugins += gstdvbsubenc
View file
gst-plugins-bad-1.20.5.tar.xz/gst/dvbsuboverlay/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/dvbsuboverlay/meson.build
Changed
@@ -11,5 +11,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstdvbsuboverlay, install_dir : plugins_pkgconfig_install_dir) plugins += gstdvbsuboverlay
View file
gst-plugins-bad-1.20.5.tar.xz/gst/dvdspu/gstdvdspu.c -> gst-plugins-bad-1.22.0.tar.xz/gst/dvdspu/gstdvdspu.c
Changed
@@ -32,7 +32,7 @@ # include <config.h> #endif -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include <gst/video/video.h> #include <string.h>
View file
gst-plugins-bad-1.20.5.tar.xz/gst/dvdspu/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/dvdspu/meson.build
Changed
@@ -14,5 +14,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstdvdspu, install_dir : plugins_pkgconfig_install_dir) plugins += gstdvdspu
View file
gst-plugins-bad-1.20.5.tar.xz/gst/faceoverlay/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/faceoverlay/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstfaceoverlay, install_dir : plugins_pkgconfig_install_dir) plugins += gstfaceoverlay
View file
gst-plugins-bad-1.20.5.tar.xz/gst/festival/gstfestival.c -> gst-plugins-bad-1.22.0.tar.xz/gst/festival/gstfestival.c
Changed
@@ -95,6 +95,8 @@ #ifdef G_OS_WIN32 #include <winsock2.h> #include <ws2tcpip.h> +/* dup, read, close */ +#include <io.h> #else #include <sys/socket.h> #include <netdb.h>
View file
gst-plugins-bad-1.20.5.tar.xz/gst/festival/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/festival/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstfestival, install_dir : plugins_pkgconfig_install_dir) plugins += gstfestival
View file
gst-plugins-bad-1.20.5.tar.xz/gst/fieldanalysis/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/fieldanalysis/meson.build
Changed
@@ -30,5 +30,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstfieldanalysis, install_dir : plugins_pkgconfig_install_dir) plugins += gstfieldanalysis
View file
gst-plugins-bad-1.20.5.tar.xz/gst/freeverb/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/freeverb/meson.build
Changed
@@ -10,7 +10,10 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstfreeverb, install_dir : plugins_pkgconfig_install_dir) plugins += gstfreeverb install_data('GstFreeverb.prs', install_dir: presetdir) + +env = environment() +env.prepend('GST_PRESET_PATH', meson.current_source_dir()) +meson.add_devenv(env)
View file
gst-plugins-bad-1.20.5.tar.xz/gst/frei0r/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/frei0r/meson.build
Changed
@@ -13,5 +13,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstfrei0r, install_dir : plugins_pkgconfig_install_dir) plugins += gstfrei0r
View file
gst-plugins-bad-1.20.5.tar.xz/gst/gaudieffects/gstgaussblur.c -> gst-plugins-bad-1.22.0.tar.xz/gst/gaudieffects/gstgaussblur.c
Changed
@@ -172,6 +172,7 @@ /* get stride */ gb->stride = GST_VIDEO_INFO_COMP_STRIDE (in_info, 0); n_elems = gb->stride * gb->height; + g_free (gb->tempim); gb->tempim = g_malloc (sizeof (gfloat) * n_elems); return TRUE;
View file
gst-plugins-bad-1.20.5.tar.xz/gst/gaudieffects/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/gaudieffects/meson.build
Changed
@@ -37,5 +37,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstgaudioeffects, install_dir : plugins_pkgconfig_install_dir) plugins += gstgaudioeffects
View file
gst-plugins-bad-1.20.5.tar.xz/gst/gdp/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/gdp/meson.build
Changed
@@ -14,5 +14,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstdgp, install_dir : plugins_pkgconfig_install_dir) plugins += gstdgp
View file
gst-plugins-bad-1.20.5.tar.xz/gst/geometrictransform/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/geometrictransform/meson.build
Changed
@@ -29,5 +29,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstgeometrictransform, install_dir : plugins_pkgconfig_install_dir) plugins += gstgeometrictransform
View file
gst-plugins-bad-1.20.5.tar.xz/gst/id3tag/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/id3tag/meson.build
Changed
@@ -11,5 +11,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstid3tag, install_dir : plugins_pkgconfig_install_dir) plugins += gstid3tag
View file
gst-plugins-bad-1.20.5.tar.xz/gst/inter/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/inter/meson.build
Changed
@@ -17,5 +17,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstinter, install_dir : plugins_pkgconfig_install_dir) plugins += gstinter
View file
gst-plugins-bad-1.20.5.tar.xz/gst/interlace/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/interlace/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstinterlace, install_dir : plugins_pkgconfig_install_dir) plugins += gstinterlace
View file
gst-plugins-bad-1.20.5.tar.xz/gst/ivfparse/gstivfparse.c -> gst-plugins-bad-1.22.0.tar.xz/gst/ivfparse/gstivfparse.c
Changed
@@ -238,6 +238,9 @@ ivf->fps_d, NULL); } + if (ivf->fourcc == GST_MAKE_FOURCC ('A', 'V', '0', '1')) + gst_caps_set_simple (caps, "alignment", G_TYPE_STRING, "tu", NULL); + gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (ivf), caps); gst_caps_unref (caps); }
View file
gst-plugins-bad-1.20.5.tar.xz/gst/ivfparse/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/ivfparse/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstivfparse, install_dir : plugins_pkgconfig_install_dir) plugins += gstivfparse
View file
gst-plugins-bad-1.20.5.tar.xz/gst/ivtc/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/ivtc/meson.build
Changed
@@ -11,5 +11,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstivtc, install_dir : plugins_pkgconfig_install_dir) plugins += gstivtc
View file
gst-plugins-bad-1.20.5.tar.xz/gst/jp2kdecimator/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/jp2kdecimator/meson.build
Changed
@@ -11,5 +11,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstjp2kdecimator, install_dir : plugins_pkgconfig_install_dir) plugins += gstjp2kdecimator
View file
gst-plugins-bad-1.20.5.tar.xz/gst/jpegformat/gstjifmux.c -> gst-plugins-bad-1.22.0.tar.xz/gst/jpegformat/gstjifmux.c
Changed
@@ -57,6 +57,7 @@ #include <string.h> #include <gst/base/gstbytereader.h> #include <gst/base/gstbytewriter.h> +#include <gst/codecparsers/gstjpegparser.h> #include <gst/tag/tag.h> #include <gst/tag/xmpwriter.h> @@ -281,20 +282,20 @@ goto error; switch (marker) { - case RST0: - case RST1: - case RST2: - case RST3: - case RST4: - case RST5: - case RST6: - case RST7: - case SOI: + case GST_JPEG_MARKER_RST0: + case GST_JPEG_MARKER_RST1: + case GST_JPEG_MARKER_RST2: + case GST_JPEG_MARKER_RST3: + case GST_JPEG_MARKER_RST4: + case GST_JPEG_MARKER_RST5: + case GST_JPEG_MARKER_RST6: + case GST_JPEG_MARKER_RST7: + case GST_JPEG_MARKER_SOI: GST_DEBUG_OBJECT (self, "marker = %x", marker); m = gst_jif_mux_new_marker (marker, 0, NULL, FALSE); self->markers = g_list_prepend (self->markers, m); break; - case EOI: + case GST_JPEG_MARKER_EOI: GST_DEBUG_OBJECT (self, "marker = %x", marker); m = gst_jif_mux_new_marker (marker, 0, NULL, FALSE); self->markers = g_list_prepend (self->markers, m); @@ -312,14 +313,15 @@ break; } - if (marker == SOS) { + if (marker == GST_JPEG_MARKER_SOS) { gint eoi_pos = -1; gint i; /* search the last 5 bytes for the EOI marker */ g_assert (map.size >= 5); for (i = 5; i >= 2; i--) { - if (map.datamap.size - i == 0xFF && map.datamap.size - i + 1 == EOI) { + if (map.datamap.size - i == 0xFF + && map.datamap.size - i + 1 == GST_JPEG_MARKER_EOI) { eoi_pos = map.size - i; break; } @@ -388,7 +390,7 @@ m = (GstJifMuxMarker *) node->data; switch (m->marker) { - case APP0: + case GST_JPEG_MARKER_APP0: if (m->size > 5 && !memcmp (m->data, "JFIF\0", 5)) { GST_DEBUG_OBJECT (self, "found APP0 JFIF"); colorspace |= COLORSPACE_GRAYSCALE | COLORSPACE_YUV; @@ -396,7 +398,7 @@ app0_jfif = node; } break; - case APP1: + case GST_JPEG_MARKER_APP1: if (m->size > 6 && (!memcmp (m->data, "EXIF\0\0", 6) || !memcmp (m->data, "Exif\0\0", 6))) { GST_DEBUG_OBJECT (self, "found APP1 EXIF"); @@ -409,7 +411,7 @@ app1_xmp = node; } break; - case APP14: + case GST_JPEG_MARKER_APP14: /* check if this contains RGB */ /* * This marker should have: @@ -441,32 +443,32 @@ } break; - case COM: + case GST_JPEG_MARKER_COM: GST_INFO_OBJECT (self, "found COM, will be replaced"); if (!com) com = node; break; - case DQT: - case SOF0: - case SOF1: - case SOF2: - case SOF3: - case SOF5: - case SOF6: - case SOF7: - case SOF9: - case SOF10: - case SOF11: - case SOF13: - case SOF14: - case SOF15: + case GST_JPEG_MARKER_DQT: + case GST_JPEG_MARKER_SOF0: + case GST_JPEG_MARKER_SOF1: + case GST_JPEG_MARKER_SOF2: + case GST_JPEG_MARKER_SOF3: + case GST_JPEG_MARKER_SOF5: + case GST_JPEG_MARKER_SOF6: + case GST_JPEG_MARKER_SOF7: + case GST_JPEG_MARKER_SOF9: + case GST_JPEG_MARKER_SOF10: + case GST_JPEG_MARKER_SOF11: + case GST_JPEG_MARKER_SOF13: + case GST_JPEG_MARKER_SOF14: + case GST_JPEG_MARKER_SOF15: if (!frame_hdr) frame_hdr = node; break; - case DAC: - case DHT: - case DRI: - case SOS: + case GST_JPEG_MARKER_DAC: + case GST_JPEG_MARKER_DHT: + case GST_JPEG_MARKER_DRI: + case GST_JPEG_MARKER_SOS: if (!scan_hdr) scan_hdr = node; break; @@ -477,6 +479,7 @@ /* check if we don't have JFIF APP0 */ if (!app0_jfif && (colorspace & (COLORSPACE_GRAYSCALE | COLORSPACE_YUV))) { /* build jfif header */ + /* *INDENT-OFF* */ static const struct { gchar id5; @@ -484,13 +487,16 @@ guint8 du; guint8 xd2, yd2; guint8 tw, th; - } jfif_data = { - "JFIF", { - 1, 2}, 0, { - 0, 1}, /* FIXME: check pixel-aspect from caps */ - { - 0, 1}, 0, 0}; - m = gst_jif_mux_new_marker (APP0, sizeof (jfif_data), + } jfif_data = { "JFIF", + { 1, 2 }, + 0, + { 0, 1 }, /* FIXME: check pixel-aspect from caps */ + { 0, 1 }, + 0, 0 + }; + /* *INDENT-ON* */ + + m = gst_jif_mux_new_marker (GST_JPEG_MARKER_APP0, sizeof (jfif_data), (const guint8 *) &jfif_data, FALSE); /* insert into self->markers list */ self->markers = g_list_insert (self->markers, m, 1); @@ -538,7 +544,8 @@ data = g_malloc0 (exif_size + 6); memcpy (data, "Exif", 4); gst_buffer_extract (exif_data, 0, data + 6, exif_size); - m = gst_jif_mux_new_marker (APP1, exif_size + 6, data, TRUE); + m = gst_jif_mux_new_marker (GST_JPEG_MARKER_APP1, exif_size + 6, data, + TRUE); gst_buffer_unref (exif_data); if (app1_exif) { @@ -574,7 +581,7 @@ data = g_malloc (size + 29); memcpy (data, "http://ns.adobe.com/xap/1.0/\0", 29); gst_buffer_extract (xmp_data, 0, &data29, size); - m = gst_jif_mux_new_marker (APP1, size + 29, data, TRUE); + m = gst_jif_mux_new_marker (GST_JPEG_MARKER_APP1, size + 29, data, TRUE); /* * Replace the old xmp marker and not add a new one. @@ -608,8 +615,8 @@ if (str) { GST_DEBUG_OBJECT (self, "set COM marker to '%s'", str); /* insert new marker into self->markers list */ - m = gst_jif_mux_new_marker (COM, strlen (str) + 1, (const guint8 *) str, - TRUE); + m = gst_jif_mux_new_marker (GST_JPEG_MARKER_COM, strlen (str) + 1, + (const guint8 *) str, TRUE); /* FIXME: if we have one already, replace */ /* this should go before SOS, maybe at the end of file-header */ self->markers = g_list_insert_before (self->markers, frame_hdr, m); @@ -672,7 +679,7 @@ writer_status &= gst_byte_writer_put_data (writer, m->data, m->size); } - if (m->marker == SOS) { + if (m->marker == GST_JPEG_MARKER_SOS) { GST_DEBUG_OBJECT (self, "scan data, size = %u", self->scan_size); writer_status &= gst_byte_writer_put_data (writer, self->scan_data, self->scan_size);
View file
gst-plugins-bad-1.20.5.tar.xz/gst/jpegformat/gstjifmux.h -> gst-plugins-bad-1.22.0.tar.xz/gst/jpegformat/gstjifmux.h
Changed
@@ -25,8 +25,6 @@ #include <gst/gst.h> -#include "gstjpegformat.h" - G_BEGIN_DECLS #define GST_TYPE_JIF_MUX \
View file
gst-plugins-bad-1.20.5.tar.xz/gst/jpegformat/gstjpegparse.c -> gst-plugins-bad-1.22.0.tar.xz/gst/jpegformat/gstjpegparse.c
Changed
@@ -3,7 +3,7 @@ * jpegparse: a parser for JPEG streams * * Copyright (C) <2009> Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> - * Víctor Manuel Jáquez Leal <vjaquez@igalia.com> + * <2022> Víctor Manuel Jáquez Leal <vjaquez@igalia.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -44,24 +44,43 @@ * (... ! jpegparse ! ... ! jifmux ! ...) metadata consolidation would be * easier. */ + +/* TODO: + * + APP2 -- ICC color profile + * + APP3 -- meta (same as exif) + * + APP12 -- Photoshop Save for Web: Ducky / Picture info + * + APP13 -- Adobe IRB + */ + #ifdef HAVE_CONFIG_H #include <config.h> #endif #include <string.h> #include <gst/base/gstbytereader.h> +#include <gst/codecparsers/gstjpegparser.h> #include <gst/tag/tag.h> +#include <gst/video/video.h> #include "gstjpegparse.h" +enum ParserState +{ + GST_JPEG_PARSER_STATE_GOT_SOI = 1 << 0, + GST_JPEG_PARSER_STATE_GOT_SOF = 1 << 1, + GST_JPEG_PARSER_STATE_GOT_SOS = 1 << 2, + GST_JPEG_PARSER_STATE_GOT_JFIF = 1 << 3, + GST_JPEG_PARSER_STATE_GOT_ADOBE = 1 << 4, + + GST_JPEG_PARSER_STATE_VALID_PICTURE = (GST_JPEG_PARSER_STATE_GOT_SOI | + GST_JPEG_PARSER_STATE_GOT_SOF | GST_JPEG_PARSER_STATE_GOT_SOS), +}; + static GstStaticPadTemplate gst_jpeg_parse_src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/jpeg, " - "format = (string) { I420, Y41B, UYVY, YV12 }, " - "width = (int) 0, MAX ," - "height = (int) 0, MAX , " "framerate = (fraction) 0/1, MAX , " "parsed = (boolean) true") ); @@ -84,14 +103,58 @@ GstEvent * event); static gboolean gst_jpeg_parse_start (GstBaseParse * parse); static gboolean gst_jpeg_parse_stop (GstBaseParse * parse); -static GstFlowReturn gst_jpeg_parse_pre_push_frame (GstBaseParse * bparse, - GstBaseParseFrame * frame); #define gst_jpeg_parse_parent_class parent_class G_DEFINE_TYPE (GstJpegParse, gst_jpeg_parse, GST_TYPE_BASE_PARSE); GST_ELEMENT_REGISTER_DEFINE (jpegparse, "jpegparse", GST_RANK_NONE, GST_TYPE_JPEG_PARSE); +enum GstJPEGColorspace +{ + GST_JPEG_COLORSPACE_NONE, + GST_JPEG_COLORSPACE_RGB, + GST_JPEG_COLORSPACE_YUV, + GST_JPEG_COLORSPACE_GRAY, + GST_JPEG_COLORSPACE_CMYK, + GST_JPEG_COLORSPACE_YCCK, +}; + +static const gchar *gst_jpeg_colorspace_strings = { + GST_JPEG_COLORSPACE_NONE = NULL, + GST_JPEG_COLORSPACE_RGB = "sRGB", + GST_JPEG_COLORSPACE_YUV = "sYUV", + GST_JPEG_COLORSPACE_GRAY = "GRAY", + GST_JPEG_COLORSPACE_CMYK = "CMYK", + GST_JPEG_COLORSPACE_YCCK = "YCCK", +}; + +enum GstJPEGSampling +{ + GST_JPEG_SAMPLING_NONE, + GST_JPEG_SAMPLING_RGB, + GST_JPEG_SAMPLING_BGR, + GST_JPEG_SAMPLING_YBR444, + GST_JPEG_SAMPLING_YBR422, + GST_JPEG_SAMPLING_YBR420, + GST_JPEG_SAMPLING_YBR440, + GST_JPEG_SAMPLING_YBR410, + GST_JPEG_SAMPLING_YBR411, + GST_JPEG_SAMPLING_GRAYSCALE, +}; + +static const gchar *gst_jpeg_sampling_strings = { + GST_JPEG_SAMPLING_NONE = NULL, + GST_JPEG_SAMPLING_RGB = "RGB", + GST_JPEG_SAMPLING_BGR = "BGR", + GST_JPEG_SAMPLING_YBR444 = "YCbCr-4:4:4", + GST_JPEG_SAMPLING_YBR422 = "YCbCr-4:2:2", + GST_JPEG_SAMPLING_YBR420 = "YCbCr-4:2:0", + GST_JPEG_SAMPLING_YBR440 = "YCbCr-4:4:0", + GST_JPEG_SAMPLING_YBR410 = "YCbCr-4:1:0", + GST_JPEG_SAMPLING_YBR411 = "YCbCr-4:1:1", + GST_JPEG_SAMPLING_GRAYSCALE = "GRAYSCALE", +}; + static void gst_jpeg_parse_class_init (GstJpegParseClass * klass) { @@ -106,7 +169,6 @@ gstbaseparse_class->set_sink_caps = gst_jpeg_parse_set_sink_caps; gstbaseparse_class->sink_event = gst_jpeg_parse_sink_event; gstbaseparse_class->handle_frame = gst_jpeg_parse_handle_frame; - gstbaseparse_class->pre_push_frame = gst_jpeg_parse_pre_push_frame; gst_element_class_add_static_pad_template (gstelement_class, &gst_jpeg_parse_src_pad_template); @@ -115,9 +177,9 @@ gst_element_class_set_static_metadata (gstelement_class, "JPEG stream parser", - "Video/Parser", + "Codec/Parser/Image", "Parse JPEG images into single-frame buffers", - "Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>"); + "Víctor Jáquez <vjaquez@igalia.com>"); GST_DEBUG_CATEGORY_INIT (jpeg_parse_debug, "jpegparse", 0, "JPEG parser"); } @@ -125,7 +187,7 @@ static void gst_jpeg_parse_init (GstJpegParse * parse) { - parse->next_ts = GST_CLOCK_TIME_NONE; + parse->sof = -1; } static gboolean @@ -133,410 +195,347 @@ { GstJpegParse *parse = GST_JPEG_PARSE_CAST (bparse); GstStructure *s = gst_caps_get_structure (caps, 0); - const GValue *framerate; - - if ((framerate = gst_structure_get_value (s, "framerate")) != NULL) { - if (GST_VALUE_HOLDS_FRACTION (framerate)) { - parse->framerate_numerator = gst_value_get_fraction_numerator (framerate); - parse->framerate_denominator = - gst_value_get_fraction_denominator (framerate); - parse->has_fps = TRUE; - GST_DEBUG_OBJECT (parse, "got framerate of %d/%d", - parse->framerate_numerator, parse->framerate_denominator); - } - } - return TRUE; -} + GST_DEBUG_OBJECT (parse, "get sink caps %" GST_PTR_FORMAT, caps); + gst_structure_get_fraction (s, "framerate", + &parse->framerate_numerator, &parse->framerate_denominator); -/* - * gst_jpeg_parse_skip_to_jpeg_header: - * @parse: the parser - * - * Flush everything until the next JPEG header. The header is considered - * to be the a start marker SOI (0xff 0xd8) followed by any other marker - * (0xff ...). - * - * Returns: TRUE if the header was found, FALSE if more data is needed. - */ -static gboolean -gst_jpeg_parse_skip_to_jpeg_header (GstJpegParse * parse, GstMapInfo * mapinfo, - gint * skipsize) -{ - gboolean ret = TRUE; - GstByteReader reader; - - if (mapinfo->size < 4) - return FALSE; - - gst_byte_reader_init (&reader, mapinfo->data, mapinfo->size); - - *skipsize = gst_byte_reader_masked_scan_uint32 (&reader, 0xffffff00, - 0xffd8ff00, 0, mapinfo->size); - if (*skipsize == -1) { - *skipsize = mapinfo->size - 3; /* Last 3 bytes + 1 more may match header. */ - ret = FALSE; - } - return ret; + return TRUE; } static inline gboolean -gst_jpeg_parse_parse_tag_has_entropy_segment (guint8 tag) +valid_state (guint state, guint ref_state) { - if (tag == SOS || (tag >= RST0 && tag <= RST7)) - return TRUE; - return FALSE; + return (state & ref_state) == ref_state; } -/* returns image length in bytes if parsed successfully, - * otherwise 0 if more data needed, - * if < 0 the absolute value needs to be flushed */ -static gint -gst_jpeg_parse_get_image_length (GstJpegParse * parse, GstMapInfo * mapinfo) +/* https://zpl.fi/chroma-subsampling-and-jpeg-sampling-factors/ */ +/* *INDENT-OFF* */ +static const struct { - guint size; - gboolean resync; - gint offset, noffset; - GstByteReader reader; - - size = mapinfo->size; - gst_byte_reader_init (&reader, mapinfo->data, mapinfo->size); - - /* TODO could be removed as previous functions already guarantee this to be - * true */ - /* we expect at least 4 bytes, first of which start marker */ - if (gst_byte_reader_masked_scan_uint32 (&reader, 0xffff0000, 0xffd80000, 0, - 4)) - return 0; - - GST_DEBUG ("Parsing jpeg image data (%u bytes)", size); + gint h3; + gint v3; + enum GstJPEGSampling sampling; +} subsampling_map = { + {{1, 1, 1}, {1, 1, 1}, GST_JPEG_SAMPLING_YBR444}, + {{2, 2, 2}, {1, 1, 1}, GST_JPEG_SAMPLING_YBR444}, + {{3, 3, 3}, {1, 1, 1}, GST_JPEG_SAMPLING_YBR444}, + {{1, 1, 1}, {2, 2, 2}, GST_JPEG_SAMPLING_YBR444}, + {{1, 1, 1}, {3, 3, 3}, GST_JPEG_SAMPLING_YBR444}, + {{1, 1, 1}, {2, 1, 1}, GST_JPEG_SAMPLING_YBR440}, + {{2, 2, 2}, {2, 1, 1}, GST_JPEG_SAMPLING_YBR440}, + {{1, 1, 1}, {4, 2, 2}, GST_JPEG_SAMPLING_YBR440}, + {{2, 1, 1}, {1, 1, 1}, GST_JPEG_SAMPLING_YBR422}, + {{2, 1, 1}, {2, 2, 2}, GST_JPEG_SAMPLING_YBR422}, + {{4, 2, 2}, {1, 1, 1}, GST_JPEG_SAMPLING_YBR422}, + {{2, 1, 1}, {2, 1, 1}, GST_JPEG_SAMPLING_YBR420}, + {{4, 1, 1}, {1, 1, 1}, GST_JPEG_SAMPLING_YBR411}, + {{4, 1, 1}, {2, 1, 1}, GST_JPEG_SAMPLING_YBR410}, +}; +/* *INDENT-ON* */ + +static guint16 +yuv_sampling (GstJpegFrameHdr * frame_hdr) +{ + int i, h0, h1, h2, v0, v1, v2; + + g_return_val_if_fail (frame_hdr->num_components == 3, GST_JPEG_SAMPLING_NONE); + + h0 = frame_hdr->components0.horizontal_factor; + h1 = frame_hdr->components1.horizontal_factor; + h2 = frame_hdr->components2.horizontal_factor; + v0 = frame_hdr->components0.vertical_factor; + v1 = frame_hdr->components1.vertical_factor; + v2 = frame_hdr->components2.vertical_factor; + + for (i = 0; i < G_N_ELEMENTS (subsampling_map); i++) { + if (subsampling_mapi.h0 == h0 + && subsampling_mapi.h1 == h1 && subsampling_mapi.h2 == h2 + && subsampling_mapi.v0 == v0 + && subsampling_mapi.v1 == v1 && subsampling_mapi.v2 == v2) + return subsampling_mapi.sampling; + } - GST_DEBUG ("Parse state: offset=%d, resync=%d, entropy len=%d", - parse->last_offset, parse->last_resync, parse->last_entropy_len); + return GST_JPEG_SAMPLING_NONE; +} - /* offset is 2 less than actual offset; - * - adapter needs at least 4 bytes for scanning, - * - start and end marker ensure at least that much - */ - /* resume from state offset */ - offset = parse->last_offset; +static const gchar * +colorspace_to_string (enum GstJPEGColorspace colorspace) +{ + return gst_jpeg_colorspace_stringscolorspace; +} - while (1) { - guint frame_len; - guint32 value; +/* https://entropymine.wordpress.com/2018/10/22/how-is-a-jpeg-images-color-type-determined/ */ +/* T-REC-T.872-201206 6.1 Colour encodings and associated values to define white and black */ +static gboolean +gst_jpeg_parse_sof (GstJpegParse * parse, GstJpegSegment * seg) +{ + GstJpegFrameHdr hdr = { 0, }; - noffset = - gst_byte_reader_masked_scan_uint32_peek (&reader, 0x0000ff00, - 0x0000ff00, offset, size - offset, &value); - /* lost sync if 0xff marker not where expected */ - if ((resync = (noffset != offset))) { - GST_DEBUG ("Lost sync at 0x%08x, resyncing", offset + 2); - } - /* may have marker, but could have been resyncng */ - resync = resync || parse->last_resync; - /* Skip over extra 0xff */ - while ((noffset >= 0) && ((value & 0xff) == 0xff)) { - noffset++; - noffset = - gst_byte_reader_masked_scan_uint32_peek (&reader, 0x0000ff00, - 0x0000ff00, noffset, size - noffset, &value); - } - /* enough bytes left for marker? (we need 0xNN after the 0xff) */ - if (noffset < 0) { - GST_DEBUG ("at end of input and no EOI marker found, need more data"); - goto need_more_data; - } + if (!gst_jpeg_segment_parse_frame_header (seg, &hdr)) { + return FALSE; + } - /* now lock on the marker we found */ - offset = noffset; - value = value & 0xff; - if (value == 0xd9) { - GST_DEBUG ("0x%08x: EOI marker", offset + 2); - /* clear parse state */ - parse->last_resync = FALSE; - parse->last_offset = 0; - return (offset + 4); - } else if (value == 0xd8) { - /* Skip this frame if we found another SOI marker */ - GST_DEBUG ("0x%08x: SOI marker before EOI, skipping", offset + 2); - /* clear parse state */ - parse->last_resync = FALSE; - parse->last_offset = 0; - return -(offset + 2); - } + parse->width = hdr.width; + parse->height = hdr.height; - if (value >= 0xd0 && value <= 0xd7) - frame_len = 0; - else { - /* peek tag and subsequent length */ - if (offset + 2 + 4 > size) - goto need_more_data; - else - gst_byte_reader_masked_scan_uint32_peek (&reader, 0x0, 0x0, offset + 2, - 4, &frame_len); - frame_len = frame_len & 0xffff; - } - GST_DEBUG ("0x%08x: tag %02x, frame_len=%u", offset + 2, value, frame_len); - /* the frame length includes the 2 bytes for the length; here we want at - * least 2 more bytes at the end for an end marker */ - if (offset + 2 + 2 + frame_len + 2 > size) { - goto need_more_data; - } + parse->colorspace = GST_JPEG_COLORSPACE_NONE; + parse->sampling = GST_JPEG_SAMPLING_NONE; - if (gst_jpeg_parse_parse_tag_has_entropy_segment (value)) { - guint eseglen = parse->last_entropy_len; - - GST_DEBUG ("0x%08x: finding entropy segment length", offset + 2); - noffset = offset + 2 + frame_len + eseglen; - while (1) { - noffset = gst_byte_reader_masked_scan_uint32_peek (&reader, 0x0000ff00, - 0x0000ff00, noffset, size - noffset, &value); - if (noffset < 0) { - /* need more data */ - parse->last_entropy_len = size - offset - 4 - frame_len - 2; - goto need_more_data; - } - if ((value & 0xff) != 0x00) { - eseglen = noffset - offset - frame_len - 2; - break; + switch (hdr.num_components) { + case 1: + parse->colorspace = GST_JPEG_COLORSPACE_GRAY; + parse->sampling = GST_JPEG_SAMPLING_GRAYSCALE; + break; + case 3: + if (valid_state (parse->state, GST_JPEG_PARSER_STATE_GOT_JFIF)) { + parse->colorspace = GST_JPEG_COLORSPACE_YUV; + parse->sampling = yuv_sampling (&hdr); + } else { + if (valid_state (parse->state, GST_JPEG_PARSER_STATE_GOT_ADOBE)) { + if (parse->adobe_transform == 0) { + parse->colorspace = GST_JPEG_COLORSPACE_RGB; + parse->sampling = GST_JPEG_SAMPLING_RGB; + } else if (parse->adobe_transform == 1) { + parse->colorspace = GST_JPEG_COLORSPACE_YUV;; + parse->sampling = yuv_sampling (&hdr); + } else { + GST_DEBUG_OBJECT (parse, "Unknown Adobe color transform code"); + parse->colorspace = GST_JPEG_COLORSPACE_YUV;; + parse->sampling = yuv_sampling (&hdr); + } + } else { + int cid0, cid1, cid2; + + cid0 = hdr.components0.identifier; + cid1 = hdr.components1.identifier; + cid2 = hdr.components2.identifier; + + if (cid0 == 1 && cid1 == 2 && cid2 == 3) { + parse->colorspace = GST_JPEG_COLORSPACE_YUV; + parse->sampling = yuv_sampling (&hdr); + } else if (cid0 == 'R' && cid1 == 'G' && cid2 == 'B') { + parse->colorspace = GST_JPEG_COLORSPACE_RGB; + parse->sampling = GST_JPEG_SAMPLING_RGB; + } else { + GST_DEBUG_OBJECT (parse, "Unrecognized component IDs"); + parse->colorspace = GST_JPEG_COLORSPACE_YUV; + parse->sampling = yuv_sampling (&hdr); + } } - noffset++; } - parse->last_entropy_len = 0; - frame_len += eseglen; - GST_DEBUG ("entropy segment length=%u => frame_len=%u", eseglen, - frame_len); - } - if (resync) { - /* check if we will still be in sync if we interpret - * this as a sync point and skip this frame */ - noffset = offset + frame_len + 2; - noffset = - gst_byte_reader_masked_scan_uint32 (&reader, 0x0000ff00, 0x0000ff00, - noffset, 4); - if (noffset < 0) { - /* ignore and continue resyncing until we hit the end - * of our data or find a sync point that looks okay */ - offset++; - continue; + break; + case 4: + if (valid_state (parse->state, GST_JPEG_PARSER_STATE_GOT_ADOBE)) { + if (parse->adobe_transform == 0) { + parse->colorspace = GST_JPEG_COLORSPACE_CMYK; + } else if (parse->adobe_transform == 2) { + parse->colorspace = GST_JPEG_COLORSPACE_YCCK; + } else { + GST_DEBUG_OBJECT (parse, "Unknown Adobe color transform code"); + parse->colorspace = GST_JPEG_COLORSPACE_YCCK; + } + } else { + parse->colorspace = GST_JPEG_COLORSPACE_CMYK; } - GST_DEBUG ("found sync at 0x%x", offset + 2); - } - - offset += frame_len + 2; + break; + default: + GST_WARNING_OBJECT (parse, "Unknown color space"); + break; } - /* EXITS */ -need_more_data: - { - parse->last_offset = offset; - parse->last_resync = resync; - return 0; - } + GST_INFO_OBJECT (parse, "SOF %dx%d %d comp - %s", parse->width, + parse->height, hdr.num_components, + GST_STR_NULL (colorspace_to_string (parse->colorspace))); + return TRUE; } -static inline gboolean -gst_jpeg_parse_sof (GstJpegParse * parse, GstByteReader * reader) +static inline GstTagList * +get_tag_list (GstJpegParse * parse) { - guint8 numcomps = 0; /* Number of components in image - (1 for gray, 3 for YUV, etc.) */ - guint8 precision; /* precision (in bits) for the samples */ - guint8 compId3 G_GNUC_UNUSED; /* unique value identifying each component */ - guint8 qtId3 G_GNUC_UNUSED; /* quantization table ID to use for this comp */ - guint8 blockWidth3; /* ArraynumComponents giving the number of - blocks (horiz) in this component */ - guint8 blockHeight3; /* Same for the vertical part of this component */ - guint8 i, value = 0; - gint temp; - - /* flush length field */ - if (!gst_byte_reader_skip (reader, 2)) - return FALSE; + if (!parse->tags) + parse->tags = gst_tag_list_new_empty (); + return parse->tags; +} - /* Get sample precision */ - if (!gst_byte_reader_get_uint8 (reader, &precision)) - return FALSE; +static gboolean +gst_jpeg_parse_app0 (GstJpegParse * parse, GstJpegSegment * seg) +{ + GstByteReader reader; + const gchar *id_str; + guint16 xd, yd; + guint8 unit, xt, yt; - /* Get w and h */ - if (!gst_byte_reader_get_uint16_be (reader, &parse->height)) - return FALSE; - if (!gst_byte_reader_get_uint16_be (reader, &parse->width)) + if (seg->size < 14) /* length of interesting data in APP0 */ return FALSE; - /* Get number of components */ - if (!gst_byte_reader_get_uint8 (reader, &numcomps)) - return FALSE; + gst_byte_reader_init (&reader, seg->data + seg->offset, seg->size); + gst_byte_reader_skip_unchecked (&reader, 2); - if (numcomps > 3) /* FIXME */ + if (!gst_byte_reader_get_string_utf8 (&reader, &id_str)) return FALSE; - /* Get decimation and quantization table id for each component */ - for (i = 0; i < numcomps; i++) { - /* Get component ID number */ - if (!gst_byte_reader_get_uint8 (reader, &value)) + if (!valid_state (parse->state, GST_JPEG_PARSER_STATE_GOT_JFIF) + && g_strcmp0 (id_str, "JFIF") == 0) { + + parse->state |= GST_JPEG_PARSER_STATE_GOT_JFIF; + + /* version */ + gst_byte_reader_skip_unchecked (&reader, 2); + + /* units */ + if (!gst_byte_reader_get_uint8 (&reader, &unit)) return FALSE; - compIdi = value; - /* Get decimation */ - if (!gst_byte_reader_get_uint8 (reader, &value)) + /* x density */ + if (!gst_byte_reader_get_uint16_be (&reader, &xd)) + return FALSE; + /* y density */ + if (!gst_byte_reader_get_uint16_be (&reader, &yd)) return FALSE; - blockWidthi = (value & 0xf0) >> 4; - blockHeighti = (value & 0x0f); - /* Get quantization table id */ - if (!gst_byte_reader_get_uint8 (reader, &value)) + /* x thumbnail */ + if (!gst_byte_reader_get_uint8 (&reader, &xt)) + return FALSE; + /* y thumbnail */ + if (!gst_byte_reader_get_uint8 (&reader, &yt)) return FALSE; - qtIdi = value; - } - if (numcomps == 1) { - /* gray image - no format */ - parse->format = ""; - } else if (numcomps == 3) { - temp = (blockWidth0 * blockHeight0) / (blockWidth1 * blockHeight1); - - if (temp == 4 && blockHeight0 == 2) - parse->format = "I420"; - else if (temp == 4 && blockHeight0 == 4) - parse->format = "Y41B"; - else if (temp == 2) - parse->format = "UYVY"; - else if (temp == 1) - parse->format = "YV12"; - else - parse->format = ""; - } else { - return FALSE; - } + if (unit == 0) { + /* no units, X and Y specify the pixel aspect ratio */ + parse->x_density = xd; + parse->y_density = yd; + } else if (unit == 1 || unit == 2) { + /* tag pixel per inches */ + double hppi = xd, vppi = yd; + + /* cm to in */ + if (unit == 2) { + hppi *= 2.54; + vppi *= 2.54; + } - GST_DEBUG_OBJECT (parse, "Header parsed"); + gst_tag_register_musicbrainz_tags (); + gst_tag_list_add (get_tag_list (parse), GST_TAG_MERGE_REPLACE, + GST_TAG_IMAGE_HORIZONTAL_PPI, hppi, GST_TAG_IMAGE_VERTICAL_PPI, vppi, + NULL); + } - return TRUE; -} + if (xt > 0 && yt > 0) + GST_FIXME_OBJECT (parse, "embedded thumbnail ignored"); -static inline gboolean -gst_jpeg_parse_skip_marker (GstJpegParse * parse, - GstByteReader * reader, guint8 marker) -{ - guint16 size = 0; + return TRUE; + } - if (!gst_byte_reader_get_uint16_be (reader, &size)) - return FALSE; + /* JFIF Extension */ + if (g_strcmp0 (id_str, "JFXX") == 0) { + if (!valid_state (parse->state, GST_JPEG_PARSER_STATE_GOT_JFIF)) + return FALSE; -#ifndef GST_DISABLE_GST_DEBUG - /* We'd pry the id of the skipped application segment */ - if (marker >= APP0 && marker <= APP15) { - const gchar *id_str = NULL; - - if (gst_byte_reader_peek_string_utf8 (reader, &id_str)) { - GST_DEBUG_OBJECT (parse, "unhandled marker %x: '%s' skipping %u bytes", - marker, id_str ? id_str : "(NULL)", size); - } else { - GST_DEBUG_OBJECT (parse, "unhandled marker %x skipping %u bytes", marker, - size); - } + return TRUE; } -#else - GST_DEBUG_OBJECT (parse, "unhandled marker %x skipping %u bytes", marker, - size); -#endif // GST_DISABLE_GST_DEBUG - - if (!gst_byte_reader_skip (reader, size - 2)) - return FALSE; - return TRUE; + return FALSE; } -static inline GstTagList * -get_tag_list (GstJpegParse * parse) +/* *INDENT-OFF* */ +static const struct { - if (!parse->tags) - parse->tags = gst_tag_list_new_empty (); - return parse->tags; -} + const gchar *suffix; + GstTagList *(*tag_func) (GstBuffer * buff); +} TagMap = { + {"Exif", gst_tag_list_from_exif_buffer_with_tiff_header}, + {"http://ns.adobe.com/xap/1.0/", gst_tag_list_from_xmp_buffer}, +}; +/* *INDENT-ON* */ -static inline void -extract_and_queue_tags (GstJpegParse * parse, guint size, guint8 * data, - GstTagList * (*tag_func) (GstBuffer * buff)) +static gboolean +gst_jpeg_parse_app1 (GstJpegParse * parse, GstJpegSegment * seg) { - GstTagList *tags; + GstByteReader reader; GstBuffer *buf; + guint16 size = 0; + const gchar *id_str; + const guint8 *data; + gint i; - buf = gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, data, size, 0, - size, NULL, NULL); + gst_byte_reader_init (&reader, seg->data + seg->offset, seg->size); + gst_byte_reader_skip_unchecked (&reader, 2); - tags = tag_func (buf); - gst_buffer_unref (buf); + if (!gst_byte_reader_get_string_utf8 (&reader, &id_str)) + return FALSE; + + for (i = 0; i < G_N_ELEMENTS (TagMap); i++) { + if (!g_str_has_suffix (id_str, TagMapi.suffix)) + continue; - if (tags) { - GstTagList *taglist = parse->tags; - if (taglist) { - gst_tag_list_insert (taglist, tags, GST_TAG_MERGE_REPLACE); - gst_tag_list_unref (tags); - } else { - parse->tags = tags; + /* skip NUL only for Exif */ + if (i == 0) { + if (!gst_byte_reader_skip (&reader, 1)) + return FALSE; } - GST_DEBUG_OBJECT (parse, "collected tags: %" GST_PTR_FORMAT, parse->tags); - } -} -static inline gboolean -gst_jpeg_parse_app1 (GstJpegParse * parse, GstByteReader * reader) -{ - guint16 size = 0; - const gchar *id_str; - const guint8 *data = NULL; + size = gst_byte_reader_get_remaining (&reader); - if (!gst_byte_reader_get_uint16_be (reader, &size)) - return FALSE; + if (!gst_byte_reader_get_data (&reader, size, &data)) + return FALSE; - size -= 2; /* 2 bytes for the mark */ - if (!gst_byte_reader_peek_string_utf8 (reader, &id_str)) - return FALSE; + buf = gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, + (gpointer) data, size, 0, size, NULL, NULL); - if (!strncmp (id_str, "Exif", 4)) { + if (buf) { + GstTagList *tags; - /* skip id + NUL + padding */ - if (!gst_byte_reader_skip (reader, 6)) - return FALSE; - size -= 6; + tags = TagMapi.tag_func (buf); + gst_buffer_unref (buf); - /* handle exif metadata */ - if (!gst_byte_reader_get_data (reader, size, &data)) - return FALSE; + if (tags) { + GST_LOG_OBJECT (parse, "parsed marker %x: '%s' %" GST_PTR_FORMAT, + GST_JPEG_MARKER_APP1, id_str, tags); + gst_tag_list_insert (get_tag_list (parse), tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (tags); + } else { + GST_INFO_OBJECT (parse, "failed to parse %s: %s", id_str, data); + } + } - extract_and_queue_tags (parse, size, (guint8 *) data, - gst_tag_list_from_exif_buffer_with_tiff_header); + return TRUE; + } - GST_LOG_OBJECT (parse, "parsed marker %x: '%s' %u bytes", - APP1, id_str, size); + return TRUE; +} - } else if (!strncmp (id_str, "http://ns.adobe.com/xap/1.0/", 28)) { +static gboolean +gst_jpeg_parse_app14 (GstJpegParse * parse, GstJpegSegment * seg) +{ + GstByteReader reader; + const gchar *id_str; + guint8 transform; - /* skip the id + NUL */ - if (!gst_byte_reader_skip (reader, 29)) - return FALSE; - size -= 29; + if (seg->size < 12) /* length of interesting data in APP14 */ + return FALSE; - /* handle xmp metadata */ - if (!gst_byte_reader_get_data (reader, size, &data)) - return FALSE; + gst_byte_reader_init (&reader, seg->data + seg->offset, seg->size); + gst_byte_reader_skip_unchecked (&reader, 2); - extract_and_queue_tags (parse, size, (guint8 *) data, - gst_tag_list_from_xmp_buffer); + if (!gst_byte_reader_get_string_utf8 (&reader, &id_str)) + return FALSE; - GST_LOG_OBJECT (parse, "parsed marker %x: '%s' %u bytes", - APP1, id_str, size); + if (!g_str_has_prefix (id_str, "Adobe")) + return FALSE; - } else { - /* restore the byte position and size */ - reader->size += 2; - reader->byte -= 2; - if (!gst_jpeg_parse_skip_marker (parse, reader, APP1)) - return FALSE; - } + /* skip version and flags */ + if (!gst_byte_reader_skip (&reader, 6)) + return FALSE; + parse->state |= GST_JPEG_PARSER_STATE_GOT_ADOBE; + + /* transform bit might not exist */ + if (!gst_byte_reader_get_uint8 (&reader, &transform)) + return TRUE; + + parse->adobe_transform = transform; return TRUE; } @@ -553,162 +552,100 @@ /* read comment and post as tag */ static inline gboolean -gst_jpeg_parse_com (GstJpegParse * parse, GstByteReader * reader) +gst_jpeg_parse_com (GstJpegParse * parse, GstJpegSegment * seg) { + GstByteReader reader; const guint8 *data = NULL; - guint16 size = 0; + guint16 size; gchar *comment; - if (!gst_byte_reader_get_uint16_be (reader, &size)) - return FALSE; + gst_byte_reader_init (&reader, seg->data + seg->offset, seg->size); + gst_byte_reader_skip_unchecked (&reader, 2); - size -= 2; - if (!gst_byte_reader_get_data (reader, size, &data)) + size = gst_byte_reader_get_remaining (&reader); + + if (!gst_byte_reader_get_data (&reader, size, &data)) return FALSE; comment = get_utf8_from_data (data, size); if (comment) { - GstTagList *taglist = get_tag_list (parse); - gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, + GST_INFO_OBJECT (parse, "comment found: %s", comment); + gst_tag_list_add (get_tag_list (parse), GST_TAG_MERGE_REPLACE, GST_TAG_COMMENT, comment, NULL); - GST_DEBUG_OBJECT (parse, "collected tags: %" GST_PTR_FORMAT, taglist); g_free (comment); } return TRUE; } -static gboolean -gst_jpeg_parse_read_header (GstJpegParse * parse, GstMapInfo * map, gint len) +static void +gst_jpeg_parse_reset (GstJpegParse * parse) { - GstByteReader reader; - guint8 marker = 0; - gboolean foundSOF = FALSE; - - gst_byte_reader_init (&reader, map->data, len); - - if (!gst_byte_reader_peek_uint8 (&reader, &marker)) - goto error; - - while (marker == 0xff) { - if (!gst_byte_reader_skip (&reader, 1)) - goto error; - - if (!gst_byte_reader_get_uint8 (&reader, &marker)) - goto error; - - GST_DEBUG_OBJECT (parse, "marker = %x", marker); - - switch (marker) { - case SOS: /* start of scan (begins compressed data) */ - goto done; - - case SOI: - break; - - case DRI: - if (!gst_byte_reader_skip (&reader, 4)) /* fixed size */ - goto error; - break; - - case COM: - if (!gst_jpeg_parse_com (parse, &reader)) - goto error; - break; - - case APP1: - if (!gst_jpeg_parse_app1 (parse, &reader)) - goto error; - break; - - case DHT: - case DQT: - /* Ignore these codes */ - if (!gst_jpeg_parse_skip_marker (parse, &reader, marker)) - goto error; - break; - - case SOF0: - /* parse Start Of Frame */ - if (!gst_jpeg_parse_sof (parse, &reader)) - goto error; - - foundSOF = TRUE; - goto done; - - default: - if (marker == JPG || (marker >= JPG0 && marker <= JPG13) || - (marker >= APP0 && marker <= APP15)) { - if (!gst_jpeg_parse_skip_marker (parse, &reader, marker)) - goto error; - } else - goto unhandled; - } + parse->width = 0; + parse->height = 0; + parse->last_offset = 0; + parse->state = 0; + parse->sof = -1; + parse->adobe_transform = 0; + parse->x_density = 0; + parse->y_density = 0; - if (!gst_byte_reader_peek_uint8 (&reader, &marker)) - goto error; + if (parse->tags) { + gst_tag_list_unref (parse->tags); + parse->tags = NULL; } -done: - - return foundSOF; +} - /* ERRORS */ -error: - { - GST_WARNING_OBJECT (parse, - "Error parsing image header (need more than %u bytes available)", - gst_byte_reader_get_remaining (&reader)); - return FALSE; - } -unhandled: - { - GST_WARNING_OBJECT (parse, "unhandled marker %x, leaving", marker); - /* Not SOF or SOI. Must not be a JPEG file (or file pointer - * is placed wrong). In either case, it's an error. */ - return FALSE; - } +static const gchar * +sampling_to_string (enum GstJPEGSampling sampling) +{ + return gst_jpeg_sampling_stringssampling; } static gboolean -gst_jpeg_parse_set_new_caps (GstJpegParse * parse, gboolean header_ok) +gst_jpeg_parse_set_new_caps (GstJpegParse * parse) { GstCaps *caps; gboolean res; - GST_DEBUG_OBJECT (parse, "setting caps on srcpad (hdr_ok=%d, have_fps=%d)", - header_ok, parse->has_fps); + caps = gst_caps_new_simple ("image/jpeg", "parsed", G_TYPE_BOOLEAN, TRUE, + NULL); + + if (parse->width > 0) + gst_caps_set_simple (caps, "width", G_TYPE_INT, parse->width, NULL); + if (parse->width > 0) + gst_caps_set_simple (caps, "height", G_TYPE_INT, parse->height, NULL); + if (parse->sof >= 0) + gst_caps_set_simple (caps, "sof-marker", G_TYPE_INT, parse->sof, NULL); + if (parse->colorspace != GST_JPEG_COLORSPACE_NONE) { + gst_caps_set_simple (caps, "colorspace", G_TYPE_STRING, + colorspace_to_string (parse->colorspace), NULL); + } + if (parse->sampling != GST_JPEG_SAMPLING_NONE) { + gst_caps_set_simple (caps, "sampling", G_TYPE_STRING, + sampling_to_string (parse->sampling), NULL); + } - caps = gst_caps_new_simple ("image/jpeg", - "parsed", G_TYPE_BOOLEAN, TRUE, NULL); + gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, + parse->framerate_numerator, parse->framerate_denominator, NULL); - if (header_ok == TRUE) { - gst_caps_set_simple (caps, - "format", G_TYPE_STRING, parse->format, - "width", G_TYPE_INT, parse->width, - "height", G_TYPE_INT, parse->height, NULL); + if (parse->x_density > 0 && parse->y_density > 0) { + gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, + parse->x_density, parse->y_density, NULL); } - if (parse->has_fps == TRUE) { - /* we have a framerate */ - gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, - parse->framerate_numerator, parse->framerate_denominator, NULL); - - if (!GST_CLOCK_TIME_IS_VALID (parse->duration) - && parse->framerate_numerator != 0) { - parse->duration = gst_util_uint64_scale_int (GST_SECOND, - parse->framerate_denominator, parse->framerate_numerator); - } - } else { - /* unknown duration */ - parse->duration = GST_CLOCK_TIME_NONE; - gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, 1, 1, NULL); + if (parse->prev_caps && gst_caps_is_equal_fixed (caps, parse->prev_caps)) { + gst_caps_unref (caps); + return TRUE; } GST_DEBUG_OBJECT (parse, "setting downstream caps on %s:%s to %" GST_PTR_FORMAT, GST_DEBUG_PAD_NAME (GST_BASE_PARSE_SRC_PAD (parse)), caps); res = gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (parse), caps); + + gst_caps_replace (&parse->prev_caps, caps); gst_caps_unref (caps); return res; @@ -716,28 +653,21 @@ } static GstFlowReturn -gst_jpeg_parse_pre_push_frame (GstBaseParse * bparse, GstBaseParseFrame * frame) +gst_jpeg_parse_push_frame (GstJpegParse * parse, GstBaseParseFrame * frame, + gint size) { - GstJpegParse *parse = GST_JPEG_PARSE_CAST (bparse); - GstBuffer *outbuf = frame->buffer; - - if (parse->has_fps && parse->framerate_numerator != 0 - && !GST_CLOCK_TIME_IS_VALID (parse->next_ts)) - parse->next_ts = bparse->segment.start; + GstBaseParse *bparse = GST_BASE_PARSE (parse); - GST_BUFFER_TIMESTAMP (outbuf) = parse->next_ts; + if (!gst_jpeg_parse_set_new_caps (parse)) + return GST_FLOW_ERROR; - if (parse->has_fps && GST_CLOCK_TIME_IS_VALID (parse->next_ts) - && GST_CLOCK_TIME_IS_VALID (parse->duration)) { - parse->next_ts += parse->duration; - } else { - parse->duration = GST_CLOCK_TIME_NONE; - parse->next_ts = GST_CLOCK_TIME_NONE; + if (!valid_state (parse->state, GST_JPEG_PARSER_STATE_VALID_PICTURE)) { + /* this validation breaks unit tests */ + /* frame->flags |= GST_BASE_PARSE_FRAME_FLAG_DROP; */ + GST_WARNING_OBJECT (parse, "Potentially invalid picture"); } - GST_BUFFER_DURATION (outbuf) = parse->duration; - - return GST_FLOW_OK; + return gst_base_parse_finish_frame (bparse, frame, size); } static GstFlowReturn @@ -745,142 +675,168 @@ gint * skipsize) { GstJpegParse *parse = GST_JPEG_PARSE_CAST (bparse); - gint len; - GstClockTime timestamp, duration; GstMapInfo mapinfo; - gboolean header_ok; + GstJpegMarker marker; + GstJpegSegment seg; + guint offset; - timestamp = GST_BUFFER_PTS (frame->buffer); - duration = GST_BUFFER_DURATION (frame->buffer); - - if (!gst_buffer_map (frame->buffer, &mapinfo, GST_MAP_READ)) { + if (!gst_buffer_map (frame->buffer, &mapinfo, GST_MAP_READ)) return GST_FLOW_ERROR; - } - if (!gst_jpeg_parse_skip_to_jpeg_header (parse, &mapinfo, skipsize)) { - gst_buffer_unmap (frame->buffer, &mapinfo); - return GST_FLOW_OK; - } + offset = parse->last_offset; + if (offset > 0) + offset -= 1; /* it migth be in the middle marker */ + + while (offset < mapinfo.size) { + if (!gst_jpeg_parse (&seg, mapinfo.data, mapinfo.size, offset)) { + if (!valid_state (parse->state, GST_JPEG_PARSER_STATE_GOT_SOI)) { + /* Skip any garbage until SOI */ + *skipsize = mapinfo.size; + GST_INFO_OBJECT (parse, "skipping %d bytes", *skipsize); + } else { + /* Accept anything after SOI */ + parse->last_offset = mapinfo.size; + } + goto beach; + } - if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (parse->next_ts))) - parse->next_ts = timestamp; + offset = seg.offset; + marker = seg.marker; - if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (duration))) - parse->duration = duration; + if (!valid_state (parse->state, GST_JPEG_PARSER_STATE_GOT_SOI) + && marker != GST_JPEG_MARKER_SOI) + continue; - len = gst_jpeg_parse_get_image_length (parse, &mapinfo); - if (len == 0) { - gst_buffer_unmap (frame->buffer, &mapinfo); - return GST_FLOW_OK; - } else if (len < 0) { - *skipsize = -len; - gst_buffer_unmap (frame->buffer, &mapinfo); - return GST_FLOW_OK; - } + /* check if the whole segment is available */ + if (offset + seg.size > mapinfo.size) { + GST_INFO_OBJECT (parse, "incomplete segment: %x offset %d", marker, + offset); + parse->last_offset = offset - 2; + goto beach; + } - /* check if we already have a EOI */ - GST_LOG_OBJECT (parse, "parsed image of size %d", len); + offset += seg.size; - /* reset the offset (only when we flushed) */ - parse->last_offset = 0; - parse->last_entropy_len = 0; + GST_INFO_OBJECT (parse, "marker found: %x offset %d / size %" + G_GSSIZE_FORMAT "", marker, seg.offset, seg.size); - header_ok = gst_jpeg_parse_read_header (parse, &mapinfo, len); + switch (marker) { + case GST_JPEG_MARKER_SOI: + parse->state |= GST_JPEG_PARSER_STATE_GOT_SOI; + /* unset tags */ + gst_base_parse_merge_tags (bparse, NULL, GST_TAG_MERGE_UNDEFINED); + /* remove all previous bytes */ + if (offset > 2) { + *skipsize = offset - 2; + GST_DEBUG_OBJECT (parse, "skipping %d bytes before SOI", *skipsize); + parse->last_offset = 2; + goto beach; + } + break; + case GST_JPEG_MARKER_EOI:{ + GstFlowReturn ret; - gst_buffer_unmap (frame->buffer, &mapinfo); + gst_buffer_unmap (frame->buffer, &mapinfo); - if (parse->width != parse->caps_width - || parse->height != parse->caps_height - || parse->framerate_numerator != - parse->caps_framerate_numerator - || parse->framerate_denominator != parse->caps_framerate_denominator) { - if (!gst_jpeg_parse_set_new_caps (parse, header_ok)) { - GST_ELEMENT_ERROR (parse, CORE, NEGOTIATION, - ("Can't set caps to the src pad"), ("Can't set caps to the src pad")); - return GST_FLOW_ERROR; - } + if (parse->tags) { + gst_base_parse_merge_tags (bparse, parse->tags, + GST_TAG_MERGE_REPLACE); + } - if (parse->tags) { - GST_DEBUG_OBJECT (parse, "Pushing tags: %" GST_PTR_FORMAT, parse->tags); - gst_pad_push_event (GST_BASE_PARSE_SRC_PAD (parse), - gst_event_new_tag (parse->tags)); - parse->tags = NULL; - } + ret = gst_jpeg_parse_push_frame (parse, frame, seg.offset); + gst_jpeg_parse_reset (parse); - parse->caps_width = parse->width; - parse->caps_height = parse->height; - parse->caps_framerate_numerator = parse->framerate_numerator; - parse->caps_framerate_denominator = parse->framerate_denominator; + return ret; + } + case GST_JPEG_MARKER_SOS: + if (!valid_state (parse->state, GST_JPEG_PARSER_STATE_GOT_SOF)) + GST_WARNING_OBJECT (parse, "SOS marker without SOF one"); + parse->state |= GST_JPEG_PARSER_STATE_GOT_SOS; + break; + case GST_JPEG_MARKER_COM: + if (!gst_jpeg_parse_com (parse, &seg)) { + GST_ELEMENT_WARNING (parse, STREAM, FORMAT, + ("Failed to parse com segment"), (NULL)); + } + break; + case GST_JPEG_MARKER_APP0: + if (!gst_jpeg_parse_app0 (parse, &seg)) { + GST_ELEMENT_WARNING (parse, STREAM, FORMAT, + ("Failed to parse app0 segment"), (NULL)); + } + break; + case GST_JPEG_MARKER_APP1: + if (!gst_jpeg_parse_app1 (parse, &seg)) { + GST_ELEMENT_WARNING (parse, STREAM, FORMAT, + ("Failed to parse app1 segment"), (NULL)); + } + break; + case GST_JPEG_MARKER_APP14: + if (!gst_jpeg_parse_app14 (parse, &seg)) { + GST_ELEMENT_WARNING (parse, STREAM, FORMAT, + ("Failed to parse app14 segment"), (NULL)); + } + break; + case GST_JPEG_MARKER_DHT: + case GST_JPEG_MARKER_DAC: + /* to avoid break the below SOF interval */ + break; + default: + /* SOFn segments */ + if (marker >= GST_JPEG_MARKER_SOF_MIN && + marker <= GST_JPEG_MARKER_SOF_MAX) { + if (!valid_state (parse->state, GST_JPEG_PARSER_STATE_GOT_SOF) + && gst_jpeg_parse_sof (parse, &seg)) { + parse->state |= GST_JPEG_PARSER_STATE_GOT_SOF; + parse->sof = marker - 0xc0; + } else { + GST_ELEMENT_ERROR (parse, STREAM, FORMAT, + ("Duplicated or bad SOF marker"), (NULL)); + gst_buffer_unmap (frame->buffer, &mapinfo); + gst_jpeg_parse_reset (parse); + return GST_FLOW_ERROR; + } + } + break; + } } + parse->last_offset = offset; - return gst_base_parse_finish_frame (bparse, frame, len); +beach: + gst_buffer_unmap (frame->buffer, &mapinfo); + return GST_FLOW_OK; } static gboolean gst_jpeg_parse_sink_event (GstBaseParse * bparse, GstEvent * event) { GstJpegParse *parse = GST_JPEG_PARSE_CAST (bparse); - gboolean res = TRUE; GST_DEBUG_OBJECT (parse, "event : %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: - parse->next_ts = GST_CLOCK_TIME_NONE; - parse->duration = GST_CLOCK_TIME_NONE; - parse->last_offset = 0; - parse->last_entropy_len = 0; - parse->last_resync = FALSE; - res = GST_BASE_PARSE_CLASS (parent_class)->sink_event (bparse, event); - break; - case GST_EVENT_TAG:{ - if (gst_pad_has_current_caps (GST_BASE_PARSE_SRC_PAD (parse))) - res = GST_BASE_PARSE_CLASS (parent_class)->sink_event (bparse, event); - else { - GstTagList *taglist = NULL; - - gst_event_parse_tag (event, &taglist); - /* Hold on to the tags till the srcpad caps are definitely set */ - gst_tag_list_insert (get_tag_list (parse), taglist, - GST_TAG_MERGE_REPLACE); - GST_DEBUG ("collected tags: %" GST_PTR_FORMAT, parse->tags); - gst_event_unref (event); - } + gst_jpeg_parse_reset (parse); break; - } default: - res = GST_BASE_PARSE_CLASS (parent_class)->sink_event (bparse, event); break; } - return res; + return GST_BASE_PARSE_CLASS (parent_class)->sink_event (bparse, event); } static gboolean gst_jpeg_parse_start (GstBaseParse * bparse) { - GstJpegParse *parse; - - parse = GST_JPEG_PARSE_CAST (bparse); - - parse->has_fps = FALSE; + GstJpegParse *parse = GST_JPEG_PARSE_CAST (bparse); - parse->width = parse->height = 0; parse->framerate_numerator = 0; parse->framerate_denominator = 1; - parse->caps_framerate_numerator = parse->caps_framerate_denominator = 0; - parse->caps_width = parse->caps_height = -1; + gst_jpeg_parse_reset (parse); - parse->next_ts = GST_CLOCK_TIME_NONE; - parse->duration = GST_CLOCK_TIME_NONE; - - parse->last_offset = 0; - parse->last_entropy_len = 0; - parse->last_resync = FALSE; - - parse->tags = NULL; + gst_base_parse_set_min_frame_size (bparse, 2); return TRUE; } @@ -888,14 +844,13 @@ static gboolean gst_jpeg_parse_stop (GstBaseParse * bparse) { - GstJpegParse *parse; - - parse = GST_JPEG_PARSE_CAST (bparse); + GstJpegParse *parse = GST_JPEG_PARSE_CAST (bparse); if (parse->tags) { gst_tag_list_unref (parse->tags); parse->tags = NULL; } + gst_clear_caps (&parse->prev_caps); return TRUE; }
View file
gst-plugins-bad-1.20.5.tar.xz/gst/jpegformat/gstjpegparse.h -> gst-plugins-bad-1.22.0.tar.xz/gst/jpegformat/gstjpegparse.h
Changed
@@ -3,6 +3,7 @@ * jpegparse: a parser for JPEG streams * * Copyright (C) <2009> Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> + * <2022> Víctor Manuel Jáquez Leal <vjaquez@igalia.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -24,11 +25,8 @@ #define __GST_JPEG_PARSE_H__ #include <gst/gst.h> -#include <gst/base/gstadapter.h> #include <gst/base/gstbaseparse.h> -#include "gstjpegformat.h" - G_BEGIN_DECLS #define GST_TYPE_JPEG_PARSE \ @@ -50,30 +48,22 @@ GstBaseParse parse; guint last_offset; - guint last_entropy_len; - gboolean last_resync; + gint state; - /* negotiated state */ - gint caps_width, caps_height; - gint caps_framerate_numerator; - gint caps_framerate_denominator; + gint8 sof; + gint8 adobe_transform; /* the parsed frame size */ guint16 width, height; /* format color space */ - const gchar *format; - - /* TRUE if the src caps sets a specific framerate */ - gboolean has_fps; - - /* the (expected) timestamp of the next frame */ - guint64 next_ts; - - /* duration of the current frame */ - guint64 duration; + guint colorspace; + guint sampling; + guint16 x_density; + guint16 y_density; + GstCaps *prev_caps; - /* video state */ + /* fps */ gint framerate_numerator; gint framerate_denominator;
View file
gst-plugins-bad-1.20.5.tar.xz/gst/jpegformat/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/jpegformat/meson.build
Changed
@@ -6,11 +6,10 @@ gstjpegformat = library('gstjpegformat', jpegf_sources, - c_args : gst_plugins_bad_args, + c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API' , include_directories : configinc, - dependencies : gstbase_dep, gsttag_dep, + dependencies : gstbase_dep, gstcodecparsers_dep, gstvideo_dep, gsttag_dep, install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstjpegformat, install_dir : plugins_pkgconfig_install_dir) plugins += gstjpegformat
View file
gst-plugins-bad-1.22.0.tar.xz/gst/librfb/gstrfb-utils.c
Added
@@ -0,0 +1,56 @@ +/* GStreamer + * Copyright (C) <2022> Marc Leeman <marc.leeman@gmail.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + * See: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/226 + */ + +#include "gstrfb-utils.h" + +static void +gst_rfb_utils_uri_query_foreach (const gchar * key, const gchar * value, + GObject * src) +{ + if (key == NULL) { + GST_WARNING_OBJECT (src, "Refusing to use empty key."); + return; + } + + if (value == NULL) { + GST_WARNING_OBJECT (src, "Refusing to use NULL for key %s.", key); + return; + } + + GST_DEBUG_OBJECT (src, "Setting property '%s' to '%s'", key, value); + gst_util_set_object_arg (src, key, value); +} + +void +gst_rfb_utils_set_properties_from_uri_query (GObject * obj, const GstUri * uri) +{ + GHashTable *hash_table; + + g_return_if_fail (uri != NULL); + hash_table = gst_uri_get_query_table (uri); + + if (hash_table) { + g_hash_table_foreach (hash_table, + (GHFunc) gst_rfb_utils_uri_query_foreach, obj); + + g_hash_table_unref (hash_table); + } +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst/librfb/gstrfb-utils.h
Added
@@ -0,0 +1,29 @@ +/* GStreamer + * Copyright (C) <2022> Marc Leeman <marc.leeman@gmail.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + * See: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/226 + */ + +#ifndef __GST_RFB_UTILS_H__ +#define __GST_RFB_UTILS_H__ + +#include <gst/gst.h> + +void gst_rfb_utils_set_properties_from_uri_query (GObject * obj, const GstUri * uri); + +#endif
View file
gst-plugins-bad-1.20.5.tar.xz/gst/librfb/gstrfbsrc.c -> gst-plugins-bad-1.22.0.tar.xz/gst/librfb/gstrfbsrc.c
Changed
@@ -25,8 +25,10 @@ #endif #include "gstrfbsrc.h" +#include "gstrfb-utils.h" #include <gst/video/video.h> +#include <glib/gi18n-lib.h> #include <string.h> #include <stdlib.h> @@ -34,9 +36,14 @@ #include <X11/Xlib.h> #endif +#define DEFAULT_PROP_HOST "127.0.0.1" +#define DEFAULT_PROP_PORT 5900 +#define DEFAULT_PROP_URI "rfb://"DEFAULT_PROP_HOST":"G_STRINGIFY(DEFAULT_PROP_PORT) + enum { PROP_0, + PROP_URI, PROP_HOST, PROP_PORT, PROP_VERSION, @@ -80,8 +87,15 @@ GstQuery * query); static GstFlowReturn gst_rfb_src_fill (GstPushSrc * psrc, GstBuffer * outbuf); +static void gst_rfb_src_uri_handler_init (gpointer g_iface, + gpointer iface_data); +static gboolean +gst_rfb_src_uri_set_uri (GstURIHandler * handler, const gchar * uri, + GError ** error); + #define gst_rfb_src_parent_class parent_class -G_DEFINE_TYPE (GstRfbSrc, gst_rfb_src, GST_TYPE_PUSH_SRC); +G_DEFINE_TYPE_WITH_CODE (GstRfbSrc, gst_rfb_src, GST_TYPE_PUSH_SRC, + G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, gst_rfb_src_uri_handler_init)); GST_ELEMENT_REGISTER_DEFINE (rfbsrc, "rfbsrc", GST_RANK_NONE, GST_TYPE_RFB_SRC); static void @@ -104,12 +118,26 @@ gobject_class->set_property = gst_rfb_src_set_property; gobject_class->get_property = gst_rfb_src_get_property; + /** + * GstRfbSrc:uri: + * + * uri to an RFB from. All GStreamer parameters can be + * encoded in the URI, this URI format is RFC compliant. + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_URI, + g_param_spec_string ("uri", "URI", + "URI in the form of rfb://host:port?query", DEFAULT_PROP_URI, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_HOST, g_param_spec_string ("host", "Host to connect to", "Host to connect to", - "127.0.0.1", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + DEFAULT_PROP_HOST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PORT, g_param_spec_int ("port", "Port", "Port", - 1, 65535, 5900, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + 1, 65535, DEFAULT_PROP_PORT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_VERSION, g_param_spec_string ("version", "RFB protocol version", "RFB protocol version", "3.3", @@ -179,8 +207,9 @@ gst_base_src_set_live (bsrc, TRUE); gst_base_src_set_format (bsrc, GST_FORMAT_TIME); - src->host = g_strdup ("127.0.0.1"); - src->port = 5900; + src->uri = gst_uri_from_string (DEFAULT_PROP_URI); + src->host = g_strdup (DEFAULT_PROP_HOST); + src->port = DEFAULT_PROP_PORT; src->version_major = 3; src->version_minor = 3; @@ -196,6 +225,9 @@ { GstRfbSrc *src = GST_RFB_SRC (object); + if (src->uri) + gst_uri_unref (src->uri); + g_free (src->host); if (src->decoder) { @@ -248,6 +280,12 @@ GstRfbSrc *src = GST_RFB_SRC (object); switch (prop_id) { + case PROP_URI:{ + const gchar *str_uri = g_value_get_string (value); + + gst_rfb_src_uri_set_uri ((GstURIHandler *) src, str_uri, NULL); + break; + } case PROP_HOST: src->host = g_value_dup_string (value);; break; @@ -298,6 +336,14 @@ gchar *version; switch (prop_id) { + case PROP_URI: + GST_OBJECT_LOCK (object); + if (src->uri) + g_value_take_string (value, gst_uri_to_string (src->uri)); + else + g_value_set_string (value, NULL); + GST_OBJECT_UNLOCK (object); + break; case PROP_HOST: g_value_set_string (value, src->host); break; @@ -551,11 +597,7 @@ GstRfbSrc *src = GST_RFB_SRC (bsrc); gdouble x, y; gint button; - const GstStructure *structure; - const gchar *event_type; - gboolean key_event, key_press; - - key_event = FALSE; + GstNavigationEventType event_type; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NAVIGATION: @@ -564,55 +606,62 @@ if (src->view_only) break; - structure = gst_event_get_structure (event); - event_type = gst_structure_get_string (structure, "event"); - - if (strcmp (event_type, "key-press") == 0) { - key_event = key_press = TRUE; - } else if (strcmp (event_type, "key-release") == 0) { - key_event = TRUE; - key_press = FALSE; - } - - if (key_event) { + event_type = gst_navigation_event_get_type (event); + switch (event_type) { #ifdef HAVE_X11 - const gchar *key; - KeySym key_sym; - - key = gst_structure_get_string (structure, "key"); - key_sym = XStringToKeysym (key); - - if (key_sym != NoSymbol) - rfb_decoder_send_key_event (src->decoder, key_sym, key_press); + case GST_NAVIGATION_EVENT_KEY_PRESS: + case GST_NAVIGATION_EVENT_KEY_RELEASE:{ + const gchar *key; + KeySym key_sym; + + gst_navigation_event_parse_key_event (event, &key); + key_sym = XStringToKeysym (key); + + if (key_sym != NoSymbol) + rfb_decoder_send_key_event (src->decoder, key_sym, + event_type == GST_NAVIGATION_EVENT_KEY_PRESS); + break; + } #endif - break; - } - - gst_structure_get_double (structure, "pointer_x", &x); - gst_structure_get_double (structure, "pointer_y", &y); - gst_structure_get_int (structure, "button", &button); - - /* we need to take care of the offset's */ - x += src->decoder->offset_x; - y += src->decoder->offset_y; - - if (strcmp (event_type, "mouse-move") == 0) { - GST_LOG_OBJECT (src, "sending mouse-move event " - "button_mask=%d, x=%d, y=%d", src->button_mask, (gint) x, (gint) y); - rfb_decoder_send_pointer_event (src->decoder, src->button_mask, - (gint) x, (gint) y); - } else if (strcmp (event_type, "mouse-button-release") == 0) { - src->button_mask &= ~(1 << (button - 1)); - GST_LOG_OBJECT (src, "sending mouse-button-release event " - "button_mask=%d, x=%d, y=%d", src->button_mask, (gint) x, (gint) y); - rfb_decoder_send_pointer_event (src->decoder, src->button_mask, - (gint) x, (gint) y); - } else if (strcmp (event_type, "mouse-button-press") == 0) { - src->button_mask |= (1 << (button - 1)); - GST_LOG_OBJECT (src, "sending mouse-button-press event " - "button_mask=%d, x=%d, y=%d", src->button_mask, (gint) x, (gint) y); - rfb_decoder_send_pointer_event (src->decoder, src->button_mask, - (gint) x, (gint) y); + case GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS:{ + gst_navigation_event_parse_mouse_button_event (event, + &button, &x, &y); + x += src->decoder->offset_x; + y += src->decoder->offset_y; + src->button_mask |= (1 << (button - 1)); + GST_LOG_OBJECT (src, "sending mouse-button-press event " + "button_mask=%d, x=%d, y=%d", + src->button_mask, (gint) x, (gint) y); + rfb_decoder_send_pointer_event (src->decoder, src->button_mask, + (gint) x, (gint) y); + break; + } + case GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE:{ + gst_navigation_event_parse_mouse_button_event (event, + &button, &x, &y); + x += src->decoder->offset_x; + y += src->decoder->offset_y; + src->button_mask &= ~(1 << (button - 1)); + GST_LOG_OBJECT (src, "sending mouse-button-release event " + "button_mask=%d, x=%d, y=%d", + src->button_mask, (gint) x, (gint) y); + rfb_decoder_send_pointer_event (src->decoder, src->button_mask, + (gint) x, (gint) y); + break; + } + case GST_NAVIGATION_EVENT_MOUSE_MOVE:{ + gst_navigation_event_parse_mouse_move_event (event, &x, &y); + x += src->decoder->offset_x; + y += src->decoder->offset_y; + GST_LOG_OBJECT (src, "sending mouse-move event " + "button_mask=%d, x=%d, y=%d", + src->button_mask, (gint) x, (gint) y); + rfb_decoder_send_pointer_event (src->decoder, src->button_mask, + (gint) x, (gint) y); + break; + } + default: + break; } break; default: @@ -630,6 +679,124 @@ return TRUE; } +static GstURIType +gst_rfb_src_uri_get_type (GType type) +{ + return GST_URI_SRC; +} + +static const gchar *const * +gst_rfb_src_uri_get_protocols (GType type) +{ + static const gchar *protocols = { (char *) "rfb", NULL }; + + return protocols; +} + +static gchar * +gst_rfb_src_uri_get_uri (GstURIHandler * handler) +{ + GstRfbSrc *src = (GstRfbSrc *) handler; + gchar *str_uri = NULL; + + GST_OBJECT_LOCK (src); + str_uri = gst_uri_to_string (src->uri); + GST_OBJECT_UNLOCK (src); + + return str_uri; +} + +static gboolean +gst_rfb_src_uri_set_uri (GstURIHandler * handler, const gchar * str_uri, + GError ** error) +{ + GstRfbSrc *src = (GstRfbSrc *) handler; + GstUri *uri = NULL; + const gchar *userinfo; + + g_return_val_if_fail (str_uri != NULL, FALSE); + + if (GST_STATE (src) >= GST_STATE_PAUSED) { + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_STATE, + _("Changing the URI on rfbsrc when it is running is not supported")); + GST_ERROR_OBJECT (src, + "Changing the URI on rfbsrc when it is running is not supported"); + return FALSE; + } + + if (!(uri = gst_uri_from_string (str_uri))) { + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI, + _("Invalid URI: %s"), str_uri); + GST_ERROR_OBJECT (src, "Invalid URI: %s", str_uri); + return FALSE; + } + + if (g_strcmp0 (gst_uri_get_scheme (uri), "rfb") != 0) { + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI, + _("Invalid scheme in uri (needs to be rfb): %s"), str_uri); + GST_ERROR_OBJECT (src, "Invalid scheme in uri (needs to be rfb): %s", + str_uri); + gst_uri_unref (uri); + return FALSE; + } + + /* Recursive set to src, do not use the same lock in all property + * setters. */ + g_object_set (src, "host", gst_uri_get_host (uri), NULL); + g_object_set (src, "port", gst_uri_get_port (uri), NULL); + + userinfo = gst_uri_get_userinfo (uri); + if (userinfo) { + gchar *pass; + gchar **split = g_strsplit (userinfo, ":", 2); + + if (!split || !split0 || !split1) { + g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI, + _("Failed to parse username:password data")); + GST_ERROR_OBJECT (src, "Failed to parse username:password data"); + g_strfreev (split); + gst_uri_unref (uri); + return FALSE; + } + + if (g_strrstr (split1, ":") != NULL) + GST_WARNING_OBJECT (src, + "userinfo %s contains more than one ':', will " + "assume that the first ':' delineates user:pass. You should escape " + "the user and pass before adding to the URI.", userinfo); + + pass = g_uri_unescape_string (split1, NULL); + g_strfreev (split); + + g_object_set (src, "password", pass, NULL); + g_free (pass); + } + + /* Only save URI once it is accepted */ + GST_OBJECT_LOCK (src); + if (src->uri) + gst_uri_unref (src->uri); + src->uri = gst_uri_ref (uri); + GST_OBJECT_UNLOCK (src); + + gst_rfb_utils_set_properties_from_uri_query (G_OBJECT (src), uri); + + gst_uri_unref (uri); + + return TRUE; +} + +static void +gst_rfb_src_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_rfb_src_uri_get_type; + iface->get_protocols = gst_rfb_src_uri_get_protocols; + iface->get_uri = gst_rfb_src_uri_get_uri; + iface->set_uri = gst_rfb_src_uri_set_uri; +} + static gboolean plugin_init (GstPlugin * plugin) {
View file
gst-plugins-bad-1.20.5.tar.xz/gst/librfb/gstrfbsrc.h -> gst-plugins-bad-1.22.0.tar.xz/gst/librfb/gstrfbsrc.h
Changed
@@ -51,6 +51,7 @@ { GstPushSrc element; + GstUri *uri; gchar *host; gint port; @@ -64,7 +65,6 @@ /* protocol version */ guint version_major; guint version_minor; - }; GType gst_rfb_src_get_type (void);
View file
gst-plugins-bad-1.20.5.tar.xz/gst/librfb/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/librfb/meson.build
Changed
@@ -1,5 +1,6 @@ rfbsrc_sources = 'gstrfbsrc.c', + 'gstrfb-utils.c', 'rfbdecoder.c', 'd3des.c', @@ -14,5 +15,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstrfbsrc, install_dir : plugins_pkgconfig_install_dir) plugins += gstrfbsrc
View file
gst-plugins-bad-1.20.5.tar.xz/gst/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/meson.build
Changed
@@ -1,7 +1,8 @@ foreach plugin : 'accurip', 'adpcmdec', 'adpcmenc', 'aiff', 'asfmux', 'audiobuffersplit', 'audiofxbad', 'audiomixmatrix', 'audiolatency', 'audiovisualizers', 'autoconvert', 'bayer', - 'camerabin2', 'codecalpha', 'coloreffects', 'debugutils', 'dvbsubenc', + 'camerabin2', 'codecalpha', 'codectimestamper', 'coloreffects', + 'debugutils', 'dvbsubenc', 'dvbsuboverlay', 'dvdspu', 'faceoverlay', 'festival', 'fieldanalysis', 'freeverb', 'frei0r', 'gaudieffects', 'gdp', 'geometrictransform', 'id3tag', 'inter', 'interlace',
View file
gst-plugins-bad-1.20.5.tar.xz/gst/midi/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/midi/meson.build
Changed
@@ -11,5 +11,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstmidi, install_dir : plugins_pkgconfig_install_dir) plugins += gstmidi
View file
gst-plugins-bad-1.20.5.tar.xz/gst/midi/midi.c -> gst-plugins-bad-1.22.0.tar.xz/gst/midi/midi.c
Changed
@@ -24,7 +24,7 @@ #include <gst/tag/tag.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "midiparse.h"
View file
gst-plugins-bad-1.20.5.tar.xz/gst/mpegdemux/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/mpegdemux/meson.build
Changed
@@ -12,5 +12,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstmpedpsdemux, install_dir : plugins_pkgconfig_install_dir) plugins += gstmpedpsdemux
View file
gst-plugins-bad-1.20.5.tar.xz/gst/mpegpsmux/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/mpegpsmux/meson.build
Changed
@@ -14,5 +14,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstmpegpsmux, install_dir : plugins_pkgconfig_install_dir) plugins += gstmpegpsmux
View file
gst-plugins-bad-1.20.5.tar.xz/gst/mpegtsdemux/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/mpegtsdemux/meson.build
Changed
@@ -16,5 +16,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstmpegtsdemux, install_dir : plugins_pkgconfig_install_dir) plugins += gstmpegtsdemux
View file
gst-plugins-bad-1.20.5.tar.xz/gst/mpegtsdemux/mpegtsbase.c -> gst-plugins-bad-1.22.0.tar.xz/gst/mpegtsdemux/mpegtsbase.c
Changed
@@ -37,7 +37,7 @@ #include <glib.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "mpegtsbase.h" #include "gstmpegdesc.h" @@ -502,13 +502,7 @@ for (i = 0; i < base->programs->len; i++) { MpegTSBaseProgram *program = g_ptr_array_index (base->programs, i); if (program->program_number == program_number) { -#if GLIB_CHECK_VERSION(2, 58, 0) return g_ptr_array_steal_index (base->programs, i); -#else - program->recycle = TRUE; - g_ptr_array_remove_index (base->programs, i); - return program; -#endif } } @@ -771,6 +765,7 @@ MpegTSBaseStream *stream = (MpegTSBaseStream *) tmp->data; mpegts_base_program_remove_stream (base, program, stream->pid); } + g_list_free (toremove); return TRUE; }
View file
gst-plugins-bad-1.20.5.tar.xz/gst/mpegtsdemux/mpegtspacketizer.c -> gst-plugins-bad-1.22.0.tar.xz/gst/mpegtsdemux/mpegtspacketizer.c
Changed
@@ -368,7 +368,7 @@ * adaptation field length is 183. This just means a zero length * payload so we clear the payload flag here and continue. */ - GST_WARNING ("PID 0x%04x afc == 0x%02x and length %d == 183 (ignored)", + GST_DEBUG ("PID 0x%04x afc == 0x%02x and length %d == 183 (ignored)", packet->pid, packet->scram_afc_cc & 0x30, length); packet->scram_afc_cc &= ~0x10; } else if (length > 182) { @@ -2250,9 +2250,9 @@ /* Input : local PTS (in GHz units) * Return : Stream time (in GHz units) */ -GstClockTime -mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer, - GstClockTime pts, guint16 pcr_pid) +static GstClockTime +mpegts_packetizer_pts_to_ts_internal (MpegTSPacketizer2 * packetizer, + GstClockTime pts, guint16 pcr_pid, gboolean check_diff) { GstClockTime res = GST_CLOCK_TIME_NONE; MpegTSPCR *pcrtable; @@ -2278,14 +2278,14 @@ res = pts + pcrtable->pcroffset + packetizer->extra_shift; /* Don't return anything if we differ too much against last seen PCR */ - if (G_UNLIKELY (pcr_pid != 0x1fff && - ABSDIFF (res, pcrtable->last_pcrtime) > 15 * GST_SECOND)) + if (G_UNLIKELY (check_diff && pcr_pid != 0x1fff && + ABSDIFF (res, pcrtable->last_pcrtime) > 15 * GST_SECOND)) { res = GST_CLOCK_TIME_NONE; - else { + } else { GstClockTime tmp = pcrtable->base_time + pcrtable->skew; if (tmp + res >= pcrtable->base_pcrtime) { res += tmp - pcrtable->base_pcrtime; - } else if (ABSDIFF (tmp + res + PCR_GST_MAX_VALUE, + } else if (!check_diff || ABSDIFF (tmp + res + PCR_GST_MAX_VALUE, pcrtable->base_pcrtime) < PCR_GST_MAX_VALUE / 2) { /* Handle wrapover */ res += tmp + PCR_GST_MAX_VALUE - pcrtable->base_pcrtime; @@ -2385,6 +2385,24 @@ return res; } +/* Input : local PTS (in GHz units) + * Return : Stream time (in GHz units) */ +GstClockTime +mpegts_packetizer_pts_to_ts_unchecked (MpegTSPacketizer2 * packetizer, + GstClockTime pts, guint16 pcr_pid) +{ + return mpegts_packetizer_pts_to_ts_internal (packetizer, pts, pcr_pid, FALSE); +} + +/* Input : local PTS (in GHz units) + * Return : Stream time (in GHz units) */ +GstClockTime +mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer, + GstClockTime pts, guint16 pcr_pid) +{ + return mpegts_packetizer_pts_to_ts_internal (packetizer, pts, pcr_pid, TRUE); +} + /* Stream time to offset */ guint64 mpegts_packetizer_ts_to_offset (MpegTSPacketizer2 * packetizer,
View file
gst-plugins-bad-1.20.5.tar.xz/gst/mpegtsdemux/mpegtspacketizer.h -> gst-plugins-bad-1.22.0.tar.xz/gst/mpegtsdemux/mpegtspacketizer.h
Changed
@@ -373,6 +373,9 @@ mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer, GstClockTime pts, guint16 pcr_pid); G_GNUC_INTERNAL GstClockTime +mpegts_packetizer_pts_to_ts_unchecked (MpegTSPacketizer2 * packetizer, + GstClockTime pts, guint16 pcr_pid); +G_GNUC_INTERNAL GstClockTime mpegts_packetizer_get_current_time (MpegTSPacketizer2 * packetizer, guint16 pcr_pid); G_GNUC_INTERNAL void
View file
gst-plugins-bad-1.20.5.tar.xz/gst/mpegtsdemux/tsdemux.c -> gst-plugins-bad-1.22.0.tar.xz/gst/mpegtsdemux/tsdemux.c
Changed
@@ -1179,7 +1179,7 @@ if (sevent->program_splice_time_specified) { pts = - mpegts_packetizer_pts_to_ts (base->packetizer, + mpegts_packetizer_pts_to_ts_unchecked (base->packetizer, MPEGTIME_TO_GSTTIME (sevent->program_splice_time + sit->pts_adjustment), demux->program->pcr_pid); field_name = @@ -2231,6 +2231,9 @@ gst_pad_push_event (stream->pad, gst_event_new_gap (0, 0)); } } + if (stream->pad) + gst_pad_push_event (stream->pad, + gst_event_new_stream_collection (program->collection)); } } @@ -2317,6 +2320,9 @@ GST_DEBUG_OBJECT (stream->pad, "sparse stream, pushing GAP event"); gst_pad_push_event (stream->pad, gst_event_new_gap (0, 0)); } + if (stream->pad) + gst_pad_push_event (stream->pad, + gst_event_new_stream_collection (program->collection)); } gst_element_no_more_pads ((GstElement *) demux); @@ -2732,13 +2738,16 @@ } stream->state = PENDING_PACKET_HEADER; } else { + gchar *pad_name = gst_pad_get_name (stream->pad); GST_ELEMENT_WARNING_WITH_DETAILS (demux, STREAM, DEMUX, ("CONTINUITY: Mismatch packet %d, stream %d (pid 0x%04x)", cc, stream->continuity_counter, stream->stream.pid), (NULL), ("warning-type", G_TYPE_STRING, "continuity-mismatch", "packet", G_TYPE_INT, cc, "stream", G_TYPE_INT, stream->continuity_counter, - "pid", G_TYPE_UINT, stream->stream.pid, NULL)); + "pid", G_TYPE_UINT, stream->stream.pid, + "pad-name", G_TYPE_STRING, pad_name, NULL)); + g_free (pad_name); stream->state = PENDING_PACKET_DISCONT; } }
View file
gst-plugins-bad-1.20.5.tar.xz/gst/mpegtsmux/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/mpegtsmux/meson.build
Changed
@@ -20,5 +20,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstmpegtsmux, install_dir : plugins_pkgconfig_install_dir) plugins += gstmpegtsmux
View file
gst-plugins-bad-1.20.5.tar.xz/gst/mxf/gstmxfelement.c -> gst-plugins-bad-1.22.0.tar.xz/gst/mxf/gstmxfelement.c
Changed
@@ -38,6 +38,7 @@ #include "mxfvc3.h" #include "mxfprores.h" #include "mxfvanc.h" +#include "mxfcustom.h" GST_DEBUG_CATEGORY (mxf_debug); #define GST_CAT_DEFAULT mxf_debug @@ -77,6 +78,7 @@ mxf_vc3_init (); mxf_prores_init (); mxf_vanc_init (); + mxf_custom_init (); g_once_init_leave (&res, TRUE); } }
View file
gst-plugins-bad-1.20.5.tar.xz/gst/mxf/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/mxf/meson.build
Changed
@@ -18,6 +18,7 @@ 'mxfvc3.c', 'mxfprores.c', 'mxfvanc.c', + 'mxfcustom.c', # 'mxfdms1.c', @@ -29,5 +30,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstmxf, install_dir : plugins_pkgconfig_install_dir) plugins += gstmxf
View file
gst-plugins-bad-1.22.0.tar.xz/gst/mxf/mxfcustom.c
Added
@@ -0,0 +1,115 @@ +/* GStreamer + * Copyright (C) 2022 Edward Hervey <edward@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/* Custom mappings + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include <gst/base/base.h> +#include <gst/video/video.h> +#include <string.h> + +#include "mxfcustom.h" +#include "mxfessence.h" + +GST_DEBUG_CATEGORY_EXTERN (mxf_debug); +#define GST_CAT_DEFAULT mxf_debug + +/* Custom Canon XF-HEVC essence */ +static const MXFUL mxf_canon_xf_hevc = { {0x06, 0x0E, 0x2B, 0x34, + 0x04, 0x01, 0x01, 0x0c, + 0x0e, 0x15, 0x00, 0x04, + 0x02, 0x10, 0x00, 0x01} +}; + +static gboolean +mxf_is_canon_xfhevc_essence_track (const MXFMetadataTimelineTrack * track) +{ + guint i; + + g_return_val_if_fail (track != NULL, FALSE); + + if (track->parent.descriptor == NULL) + return FALSE; + + for (i = 0; i < track->parent.n_descriptor; i++) { + MXFMetadataFileDescriptor *d = track->parent.descriptori; + MXFUL *key; + + if (!d) + continue; + + key = &d->essence_container; + if (mxf_ul_is_equal (key, &mxf_canon_xf_hevc)) + return TRUE; + } + + return FALSE; +} + +static GstFlowReturn +mxf_canon_xfhevc_handle_essence_element (const MXFUL * key, GstBuffer * buffer, + GstCaps * caps, + MXFMetadataTimelineTrack * track, + gpointer mapping_data, GstBuffer ** outbuf) +{ + *outbuf = buffer; + /* Blindly accept it */ + return GST_FLOW_OK; +} + +static MXFEssenceWrapping +mxf_canon_xfhevc_get_track_wrapping (const MXFMetadataTimelineTrack * track) +{ + /* Assume it's always frame wrapping */ + return MXF_ESSENCE_WRAPPING_FRAME_WRAPPING; +} + +static GstCaps * +mxf_canon_xfhevc_create_caps (MXFMetadataTimelineTrack * track, + GstTagList ** tags, gboolean * intra_only, + MXFEssenceElementHandleFunc * handler, gpointer * mapping_data) +{ + GstCaps *caps = NULL; + + g_return_val_if_fail (track != NULL, NULL); + + *handler = mxf_canon_xfhevc_handle_essence_element; + *intra_only = TRUE; + caps = gst_caps_from_string ("video/x-h265"); + + return caps; +} + +static const MXFEssenceElementHandler mxf_canon_xfhevc_essence_element_handler = { + mxf_is_canon_xfhevc_essence_track, + mxf_canon_xfhevc_get_track_wrapping, + mxf_canon_xfhevc_create_caps +}; + +void +mxf_custom_init (void) +{ + mxf_essence_element_handler_register + (&mxf_canon_xfhevc_essence_element_handler); +}
View file
gst-plugins-bad-1.22.0.tar.xz/gst/mxf/mxfcustom.h
Added
@@ -0,0 +1,30 @@ +/* GStreamer + * Copyright (C) 2022 Edward Hervey <edward@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/* Custom mappings + */ + +#ifndef __MXF_CUSTOM_H__ +#define __MXF_CUSTOM_H__ + +#include <gst/gst.h> + +void mxf_custom_init (void); + +#endif /* __MXF_CUSTOM_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst/mxf/mxfdemux.c -> gst-plugins-bad-1.22.0.tar.xz/gst/mxf/mxfdemux.c
Changed
@@ -3338,21 +3338,6 @@ return 1; } -#if !GLIB_CHECK_VERSION(2, 62, 0) -static gboolean -has_table_segment (GArray * segments, MXFIndexTableSegment * target) -{ - guint i; - for (i = 0; i < segments->len; i++) { - MXFIndexTableSegment *cand = - &g_array_index (segments, MXFIndexTableSegment, i); - if (compare_index_table_segment (cand, target) == 0) - return TRUE; - } - return FALSE; -} -#endif - static GstFlowReturn gst_mxf_demux_handle_index_table_segment (GstMXFDemux * demux, GstMXFKLV * klv) { @@ -3387,18 +3372,16 @@ if (g_list_find_custom (demux->pending_index_table_segments, segment, (GCompareFunc) compare_index_table_segment)) { GST_DEBUG_OBJECT (demux, "Already in pending list"); + mxf_index_table_segment_reset (segment); g_free (segment); return GST_FLOW_OK; } for (tmp = demux->index_tables; tmp; tmp = tmp->next) { GstMXFDemuxIndexTable *table = (GstMXFDemuxIndexTable *) tmp->data; -#if !GLIB_CHECK_VERSION (2, 62, 0) - if (has_table_segment (table->segments, segment)) { -#else if (g_array_binary_search (table->segments, segment, (GCompareFunc) compare_index_table_segment, NULL)) { -#endif GST_DEBUG_OBJECT (demux, "Already handled"); + mxf_index_table_segment_reset (segment); g_free (segment); return GST_FLOW_OK; }
View file
gst-plugins-bad-1.20.5.tar.xz/gst/mxf/mxfmetadata.c -> gst-plugins-bad-1.22.0.tar.xz/gst/mxf/mxfmetadata.c
Changed
@@ -246,10 +246,10 @@ g_hash_table_iter_init (&iter, self->other_tags); while (g_hash_table_iter_next (&iter, NULL, (gpointer) & t)) { + mxf_primer_pack_add_mapping (primer, 0x0000, &t->ul); tmp = g_slice_dup (MXFLocalTag, t); if (t->g_slice) { tmp->data = g_slice_alloc (t->size); - mxf_primer_pack_add_mapping (primer, 0x0000, &t->ul); memcpy (tmp->data, t->data, t->size); } else { tmp->data = g_memdup2 (t->data, t->size);
View file
gst-plugins-bad-1.20.5.tar.xz/gst/netsim/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/netsim/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstnetsim, install_dir : plugins_pkgconfig_install_dir) plugins += gstnetsim
View file
gst-plugins-bad-1.20.5.tar.xz/gst/onvif/gstrtponviftimestamp.c -> gst-plugins-bad-1.22.0.tar.xz/gst/onvif/gstrtponviftimestamp.c
Changed
@@ -30,13 +30,14 @@ #include "gstrtponviftimestamp.h" -#define GST_NTP_OFFSET_EVENT_NAME "GstNtpOffset" +#define GST_ONVIF_TIMESTAMP_EVENT_NAME "GstOnvifTimestamp" #define DEFAULT_NTP_OFFSET GST_CLOCK_TIME_NONE #define DEFAULT_CSEQ 0 #define DEFAULT_SET_E_BIT FALSE #define DEFAULT_SET_T_BIT FALSE #define DEFAULT_DROP_OUT_OF_SEGMENT TRUE +#define DEFAULT_USE_REFERENCE_TIMESTAMPS FALSE GST_DEBUG_CATEGORY_STATIC (rtponviftimestamp_debug); #define GST_CAT_DEFAULT (rtponviftimestamp_debug) @@ -72,7 +73,8 @@ PROP_CSEQ, PROP_SET_E_BIT, PROP_SET_T_BIT, - PROP_DROP_OUT_OF_SEGMENT + PROP_DROP_OUT_OF_SEGMENT, + PROP_USE_REFERENCE_TIMESTAMPS }; /*static guint gst_rtp_onvif_timestamp_signalsLAST_SIGNAL = { 0 }; */ @@ -103,6 +105,9 @@ case PROP_DROP_OUT_OF_SEGMENT: g_value_set_boolean (value, self->prop_drop_out_of_segment); break; + case PROP_USE_REFERENCE_TIMESTAMPS: + g_value_set_boolean (value, self->prop_use_reference_timestamps); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -131,6 +136,9 @@ case PROP_DROP_OUT_OF_SEGMENT: self->prop_drop_out_of_segment = g_value_get_boolean (value); break; + case PROP_USE_REFERENCE_TIMESTAMPS: + self->prop_use_reference_timestamps = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -204,9 +212,18 @@ switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: - self->ntp_offset = self->prop_ntp_offset; - GST_DEBUG_OBJECT (self, "ntp-offset: %" GST_TIME_FORMAT, - GST_TIME_ARGS (self->ntp_offset)); + if (self->prop_use_reference_timestamps && + self->prop_ntp_offset != DEFAULT_NTP_OFFSET) { + GST_WARNING_OBJECT (self, "ntp-offset should not be set if reference " + "timestamps are used"); + self->ntp_offset = DEFAULT_NTP_OFFSET; + } else if (self->prop_use_reference_timestamps) { + GST_DEBUG_OBJECT (self, "using reference timestamp meta"); + } else { + self->ntp_offset = self->prop_ntp_offset; + GST_DEBUG_OBJECT (self, "ntp-offset: %" GST_TIME_FORMAT, + GST_TIME_ARGS (self->ntp_offset)); + } self->set_d_bit = TRUE; self->set_e_bit = FALSE; self->set_t_bit = FALSE; @@ -239,6 +256,7 @@ GstRtpOnvifTimestamp *self = GST_RTP_ONVIF_TIMESTAMP (object); g_queue_free (self->event_queue); + gst_caps_replace (&self->reference_timestamp_id, NULL); G_OBJECT_CLASS (gst_rtp_onvif_timestamp_parent_class)->finalize (object); } @@ -288,6 +306,28 @@ DEFAULT_DROP_OUT_OF_SEGMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstRtpOnvifTimestamp:use-reference-timestamps: + * + * Whether to obtain timestamps from reference timestamp meta instead of using + * the ntp-offset method. If enabled then timestamps are expected to be + * attached to the buffers, and in that case ntp-offset should not be + * configured. + * + * Default value is FALSE, meaning that the ntp-offset property is used. + * If neither is set then the element calculates an ntp-offset. + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_USE_REFERENCE_TIMESTAMPS, + g_param_spec_boolean ("use-reference-timestamps", + "Use reference timestamps", + "Whether the element should use reference UTC timestamps from the " + "buffers instead of using the ntp-offset mechanism.", + DEFAULT_USE_REFERENCE_TIMESTAMPS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_PARAM_MUTABLE_READY)); + /* register pads */ gst_element_class_add_static_pad_template (gstelement_class, &sink_template_factory); @@ -347,9 +387,9 @@ case GST_EVENT_CUSTOM_DOWNSTREAM: /* if the "set-e-bit" property is set, an offset event might mark the * stream as discontinued. We need to check if the currently cached buffer - * needs the e-bit before it's pushed */ - if (self->buffer != NULL && self->prop_set_e_bit && - gst_event_has_name (event, GST_NTP_OFFSET_EVENT_NAME)) { + * or buffer list needs the e-bit before it's pushed */ + if ((self->buffer != NULL || self->list != NULL) && self->prop_set_e_bit + && gst_event_has_name (event, GST_ONVIF_TIMESTAMP_EVENT_NAME)) { gboolean discont; if (parse_event_ntp_offset (self, event, NULL, &discont)) { GST_DEBUG_OBJECT (self, "stream %s discontinued", @@ -391,7 +431,7 @@ /* enqueue serialized events if there is a cached buffer */ if (GST_EVENT_IS_SERIALIZED (event) && (self->buffer || self->list)) { - GST_DEBUG ("enqueueing serialized event"); + GST_WARNING ("enqueueing serialized event"); g_queue_push_tail (self->event_queue, event); event = NULL; goto out; @@ -403,7 +443,7 @@ /* update the ntp-offset after any cached buffer/buffer list has been * pushed. the d-bit of the next buffer/buffer list should be set if * the stream is discontinued */ - if (gst_event_has_name (event, GST_NTP_OFFSET_EVENT_NAME)) { + if (gst_event_has_name (event, GST_ONVIF_TIMESTAMP_EVENT_NAME)) { GstClockTime offset; gboolean discont; if (parse_event_ntp_offset (self, event, &offset, &discont)) { @@ -452,6 +492,9 @@ gst_pad_new_from_static_template (&src_template_factory, "src"); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); + self->prop_use_reference_timestamps = DEFAULT_USE_REFERENCE_TIMESTAMPS; + self->reference_timestamp_id = gst_caps_new_empty_simple ("timestamp/x-unix"); + self->prop_ntp_offset = DEFAULT_NTP_OFFSET; self->prop_set_e_bit = DEFAULT_SET_E_BIT; self->prop_set_t_bit = DEFAULT_SET_T_BIT; @@ -467,6 +510,51 @@ #define EXTENSION_ID 0xABAC #define EXTENSION_SIZE 3 +static guint64 +get_utc_from_reference_timestamp (GstRtpOnvifTimestamp * self, GstBuffer * buf) +{ + GstReferenceTimestampMeta *meta; + GstClockTime time; + + meta = gst_buffer_get_reference_timestamp_meta (buf, + self->reference_timestamp_id); + if (meta != NULL) { + /* the reference timestamp is expressed in unix times so add the difference + * between unix and ntp epochs */ + time = meta->timestamp + G_GUINT64_CONSTANT (2208988800) * GST_SECOND; + GST_TRACE_OBJECT (self, "UTC reference timestamp found: %" GST_TIME_FORMAT, + GST_TIME_ARGS (time)); + } else { + GST_ERROR_OBJECT (self, "UTC reference timestamp not found"); + time = GST_CLOCK_TIME_NONE; + } + + return time; +} + +static guint64 +get_utc_from_offset (GstRtpOnvifTimestamp * self, GstBuffer * buf) +{ + guint64 time = GST_CLOCK_TIME_NONE; + + if (GST_BUFFER_PTS_IS_VALID (buf)) { + time = gst_segment_to_stream_time (&self->segment, GST_FORMAT_TIME, + GST_BUFFER_PTS (buf)); + } else if (GST_BUFFER_DTS_IS_VALID (buf)) { + time = gst_segment_to_stream_time (&self->segment, GST_FORMAT_TIME, + GST_BUFFER_DTS (buf)); + } else { + g_assert_not_reached (); + } + + /* add the offset (in seconds) */ + if (time != GST_CLOCK_TIME_NONE) { + time += self->ntp_offset; + } + + return time; +} + static gboolean handle_buffer (GstRtpOnvifTimestamp * self, GstBuffer * buf) { @@ -477,7 +565,8 @@ guint64 time; guint8 field = 0; - if (!GST_CLOCK_TIME_IS_VALID (self->ntp_offset)) { + if (!self->prop_use_reference_timestamps && + !GST_CLOCK_TIME_IS_VALID (self->ntp_offset)) { GstClock *clock = gst_element_get_clock (GST_ELEMENT (self)); if (clock) { @@ -535,33 +624,35 @@ return FALSE; } - /* NTP timestamp */ - if (GST_BUFFER_PTS_IS_VALID (buf)) { - time = gst_segment_to_stream_time (&self->segment, GST_FORMAT_TIME, - GST_BUFFER_PTS (buf)); - } else if (GST_BUFFER_DTS_IS_VALID (buf)) { - time = gst_segment_to_stream_time (&self->segment, GST_FORMAT_TIME, - GST_BUFFER_DTS (buf)); + if (self->prop_use_reference_timestamps) { + time = get_utc_from_reference_timestamp (self, buf); + if (time == GST_CLOCK_TIME_NONE) { + gst_rtp_buffer_unmap (&rtp); + return FALSE; + } + } else if (GST_BUFFER_PTS_IS_VALID (buf) || GST_BUFFER_DTS_IS_VALID (buf)) { + time = get_utc_from_offset (self, buf); + if (self->prop_drop_out_of_segment && time == GST_CLOCK_TIME_NONE) { + GST_ERROR_OBJECT (self, "Failed to get stream time"); + gst_rtp_buffer_unmap (&rtp); + return FALSE; + } } else { GST_INFO_OBJECT (self, "Buffer doesn't contain any valid DTS or PTS timestamp"); goto done; } - if (self->prop_drop_out_of_segment && time == GST_CLOCK_TIME_NONE) { - GST_ERROR_OBJECT (self, "Failed to get stream time"); + if (time == GST_CLOCK_TIME_NONE) { + GST_ERROR_OBJECT (self, "failed calculating timestamp"); gst_rtp_buffer_unmap (&rtp); return FALSE; } - /* add the offset (in seconds) */ - if (time != GST_CLOCK_TIME_NONE) { - time += self->ntp_offset; - /* convert to NTP time. upper 32 bits should contain the seconds - * and the lower 32 bits, the fractions of a second. */ - time = gst_util_uint64_scale (time, (G_GINT64_CONSTANT (1) << 32), - GST_SECOND); - } + /* convert to NTP time. upper 32 bits should contain the seconds + * and the lower 32 bits, the fractions of a second. */ + time = gst_util_uint64_scale (time, (G_GINT64_CONSTANT (1) << 32), + GST_SECOND); GST_DEBUG_OBJECT (self, "timestamp: %" G_GUINT64_FORMAT, time); @@ -641,15 +732,18 @@ return result; } +static gboolean +do_handle_buffer (GstBuffer ** buffer, guint idx, GstRtpOnvifTimestamp * self) +{ + return handle_buffer (self, *buffer); +} + /* @buf: (transfer full) */ static GstFlowReturn handle_and_push_buffer_list (GstRtpOnvifTimestamp * self, GstBufferList * list) { - GstBuffer *buf; - - /* Set the extension on the *first* buffer */ - buf = gst_buffer_list_get (list, 0); - if (!handle_buffer (self, buf)) { + if (!gst_buffer_list_foreach (list, (GstBufferListFunc) do_handle_buffer, + self)) { gst_buffer_list_unref (list); return GST_FLOW_ERROR; }
View file
gst-plugins-bad-1.20.5.tar.xz/gst/onvif/gstrtponviftimestamp.h -> gst-plugins-bad-1.22.0.tar.xz/gst/onvif/gstrtponviftimestamp.h
Changed
@@ -54,11 +54,16 @@ gboolean prop_set_t_bit; gboolean prop_drop_out_of_segment; + /* whether reference timestamps from the buffers should be used instead + * of the ntp offset mechanism */ + gboolean prop_use_reference_timestamps; + GstCaps *reference_timestamp_id; + /* currently used ntp-offset - *(can be changed runtime with a GstNtpOffset event) + *(can be changed runtime with a GstOnvifTimestamp event) */ GstClockTime ntp_offset; - /* a GstNtpOffset event might mark the stream as discontinued */ + /* a GstOnvifTimestamp event might mark the stream as discontinued */ gboolean set_d_bit; gboolean set_e_bit; gboolean set_t_bit;
View file
gst-plugins-bad-1.20.5.tar.xz/gst/onvif/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/onvif/meson.build
Changed
@@ -12,5 +12,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstrtponvif, install_dir : plugins_pkgconfig_install_dir) plugins += gstrtponvif
View file
gst-plugins-bad-1.20.5.tar.xz/gst/pcapparse/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/pcapparse/meson.build
Changed
@@ -12,5 +12,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstpcapparse, install_dir : plugins_pkgconfig_install_dir) plugins += gstpcapparse
View file
gst-plugins-bad-1.20.5.tar.xz/gst/pnm/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/pnm/meson.build
Changed
@@ -13,5 +13,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstpnm, install_dir : plugins_pkgconfig_install_dir) plugins += gstpnm
View file
gst-plugins-bad-1.20.5.tar.xz/gst/proxy/gstproxysink.c -> gst-plugins-bad-1.22.0.tar.xz/gst/proxy/gstproxysink.c
Changed
@@ -268,7 +268,7 @@ if (sticky) gst_proxy_sink_send_sticky_events (self, pad, srcpad); - ret = gst_pad_push_event (srcpad, event); + ret = gst_pad_push_event (srcpad, gst_event_ref (event)); gst_object_unref (srcpad); gst_object_unref (src); @@ -288,10 +288,25 @@ ret = TRUE; } } else { - gst_event_unref (event); ret = TRUE; } + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + { + GstMessage *msg = gst_message_new_eos (GST_OBJECT_CAST (self)); + guint32 seq_num = gst_event_get_seqnum (event); + + gst_message_set_seqnum (msg, seq_num); + gst_element_post_message (GST_ELEMENT_CAST (self), msg); + break; + } + default: + break; + } + + gst_event_unref (event); + return ret; }
View file
gst-plugins-bad-1.20.5.tar.xz/gst/proxy/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/proxy/meson.build
Changed
@@ -12,5 +12,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstproxy, install_dir : plugins_pkgconfig_install_dir) plugins += gstproxy \ No newline at end of file
View file
gst-plugins-bad-1.20.5.tar.xz/gst/rawparse/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/rawparse/meson.build
Changed
@@ -12,5 +12,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstlegacyrawparse, install_dir : plugins_pkgconfig_install_dir) plugins += gstlegacyrawparse
View file
gst-plugins-bad-1.20.5.tar.xz/gst/removesilence/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/removesilence/meson.build
Changed
@@ -11,5 +11,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstremovesilence, install_dir : plugins_pkgconfig_install_dir) plugins += gstremovesilence
View file
gst-plugins-bad-1.20.5.tar.xz/gst/rist/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/rist/meson.build
Changed
@@ -18,5 +18,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstrist, install_dir : plugins_pkgconfig_install_dir) plugins += gstrist
View file
gst-plugins-bad-1.20.5.tar.xz/gst/rtmp2/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/rtmp2/meson.build
Changed
@@ -21,5 +21,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstrtmp2, install_dir : plugins_pkgconfig_install_dir) plugins += gstrtmp2
View file
gst-plugins-bad-1.20.5.tar.xz/gst/rtp/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/rtp/meson.build
Changed
@@ -7,11 +7,10 @@ gstrtp = library('gstrtpmanagerbad', gst_plugins_rtp_sources, - dependencies: gio_dep, gst_dep, gstbase_dep, gstrtp_dep, gstnet_dep, gstcontroller_dep, + dependencies: gst_dep, gstbase_dep, gstrtp_dep, gstnet_dep, gstcontroller_dep, gio_dep, include_directories: configinc, install: true, c_args: gst_plugins_bad_args, install_dir: plugins_install_dir, ) -pkgconfig.generate(gstrtp, install_dir : plugins_pkgconfig_install_dir) plugins += gstrtp
View file
gst-plugins-bad-1.20.5.tar.xz/gst/sdp/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/sdp/meson.build
Changed
@@ -13,5 +13,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstsdpelem, install_dir : plugins_pkgconfig_install_dir) plugins += gstsdpelem
View file
gst-plugins-bad-1.20.5.tar.xz/gst/segmentclip/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/segmentclip/meson.build
Changed
@@ -13,5 +13,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstsegmentclip, install_dir : plugins_pkgconfig_install_dir) plugins += gstsegmentclip
View file
gst-plugins-bad-1.20.5.tar.xz/gst/siren/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/siren/meson.build
Changed
@@ -18,5 +18,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstsiren, install_dir : plugins_pkgconfig_install_dir) plugins += gstsiren
View file
gst-plugins-bad-1.20.5.tar.xz/gst/smooth/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/smooth/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstsmooth, install_dir : plugins_pkgconfig_install_dir) plugins += gstsmooth
View file
gst-plugins-bad-1.20.5.tar.xz/gst/speed/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/speed/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstspeed, install_dir : plugins_pkgconfig_install_dir) plugins += gstspeed
View file
gst-plugins-bad-1.20.5.tar.xz/gst/subenc/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/subenc/meson.build
Changed
@@ -12,5 +12,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstsubenc, install_dir : plugins_pkgconfig_install_dir) plugins += gstsubenc
View file
gst-plugins-bad-1.20.5.tar.xz/gst/switchbin/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/switchbin/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstswitchbin, install_dir : plugins_pkgconfig_install_dir) plugins += gstswitchbin
View file
gst-plugins-bad-1.20.5.tar.xz/gst/timecode/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/timecode/meson.build
Changed
@@ -20,5 +20,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gsttimecode, install_dir : plugins_pkgconfig_install_dir) plugins += gsttimecode
View file
gst-plugins-bad-1.20.5.tar.xz/gst/transcode/gst-cpu-throttling-clock.c -> gst-plugins-bad-1.22.0.tar.xz/gst/transcode/gst-cpu-throttling-clock.c
Changed
@@ -165,6 +165,10 @@ gst_clock_id_unref (self->priv->evaluate_wait_time); self->priv->evaluate_wait_time = 0; } + if (self->priv->timer) { + gst_poll_free (self->priv->timer); + self->priv->timer = NULL; + } } static void
View file
gst-plugins-bad-1.20.5.tar.xz/gst/transcode/gsttranscodebin.c -> gst-plugins-bad-1.22.0.tar.xz/gst/transcode/gsttranscodebin.c
Changed
@@ -24,13 +24,11 @@ #include "gsttranscoding.h" #include "gsttranscodeelements.h" -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include <gst/pbutils/pbutils.h> #include <gst/pbutils/missing-plugins.h> - - /** * GstTranscodeBin!sink_%u: * @@ -92,6 +90,8 @@ { gst_object_unref (tstream->stream); gst_object_unref (tstream->encodebin_pad); + + g_free (tstream); } typedef struct @@ -109,6 +109,7 @@ GstElement *video_filter; GPtrArray *transcoding_streams; + gboolean upstream_selected; } GstTranscodeBin; typedef struct @@ -127,6 +128,9 @@ GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (transcodebin, "transcodebin", GST_RANK_NONE, GST_TYPE_TRANSCODE_BIN, transcodebin_element_init (plugin)); +static GstPad * +get_encodebin_pad_from_stream (GstTranscodeBin * self, GstStream * stream); + enum { PROP_0, @@ -173,15 +177,16 @@ static GstPad * _insert_filter (GstTranscodeBin * self, GstPad * sinkpad, GstPad * pad, - GstCaps * caps) + const GstCaps * filtercaps) { GstPad *filter_src = NULL, *filter_sink = NULL, *convert_sink, *convert_src; GstElement *filter = NULL, *convert; GstObject *filter_parent; const gchar *media_type; gboolean audio = TRUE; + GstCaps *caps; - media_type = gst_structure_get_name (gst_caps_get_structure (caps, 0)); + media_type = gst_structure_get_name (gst_caps_get_structure (filtercaps, 0)); if (self->video_filter && g_str_has_prefix (media_type, "video")) { audio = FALSE; @@ -191,7 +196,7 @@ filter = self->video_filter; else GST_ERROR_OBJECT (pad, "decodebin pad does not produce raw data (%" - GST_PTR_FORMAT "), cannot add video filter '%s'", caps, + GST_PTR_FORMAT "), cannot add video filter '%s'", filtercaps, GST_ELEMENT_NAME (self->video_filter)); } else if (self->audio_filter && g_str_has_prefix (media_type, "audio")) { if (!g_strcmp0 (media_type, "audio/x-raw") @@ -199,7 +204,7 @@ filter = self->audio_filter; else GST_ERROR_OBJECT (pad, "decodebin pad does not produce raw data (%" - GST_PTR_FORMAT "), cannot add audio filter '%s'", caps, + GST_PTR_FORMAT "), cannot add audio filter '%s'", filtercaps, GST_ELEMENT_NAME (self->audio_filter)); } @@ -316,21 +321,59 @@ return res; } +static TranscodingStream * +setup_stream (GstTranscodeBin * self, GstStream * stream) +{ + TranscodingStream *res = NULL; + GstPad *encodebin_pad = get_encodebin_pad_from_stream (self, stream); + + if (encodebin_pad) { + GST_INFO_OBJECT (self, + "Going to transcode stream %s (encodebin pad: %" GST_PTR_FORMAT ")", + gst_stream_get_stream_id (stream), encodebin_pad); + + res = transcoding_stream_new (stream, encodebin_pad); + GST_OBJECT_LOCK (self); + g_ptr_array_add (self->transcoding_streams, res); + GST_OBJECT_UNLOCK (self); + } + + return res; +} + static void gst_transcode_bin_link_encodebin_pad (GstTranscodeBin * self, GstPad * pad, - const gchar * stream_id) + GstEvent * sstart) { - GstCaps *caps; + GstCaps *caps, *filtercaps; GstPadLinkReturn lret; - TranscodingStream *stream = find_stream (self, stream_id, NULL); + const gchar *stream_id; + TranscodingStream *stream; + + gst_event_parse_stream_start (sstart, &stream_id); + stream = find_stream (self, stream_id, NULL); if (!stream) { - GST_ERROR_OBJECT (self, "%s -> Got not stream, decodebin3 bug?", stream_id); - return; + if (self->upstream_selected) { + GstStream *tmpstream; + + gst_event_parse_stream (sstart, &tmpstream); + + stream = setup_stream (self, tmpstream); + + gst_object_unref (tmpstream); + } + + if (!stream) { + GST_ERROR_OBJECT (self, "Could not find any stream with ID: %s", + stream_id); + return; + } } - caps = gst_pad_query_caps (pad, NULL); - pad = _insert_filter (self, stream->encodebin_pad, pad, caps); + filtercaps = gst_pad_query_caps (pad, NULL); + pad = _insert_filter (self, stream->encodebin_pad, pad, filtercaps); + gst_caps_unref (filtercaps); lret = gst_pad_link (pad, stream->encodebin_pad); switch (lret) { case GST_PAD_LINK_OK: @@ -371,15 +414,13 @@ wait_stream_start_probe (GstPad * pad, GstPadProbeInfo * info, GstTranscodeBin * self) { - const gchar *stream_id; - if (GST_EVENT_TYPE (info->data) != GST_EVENT_STREAM_START) return GST_PAD_PROBE_OK; - gst_event_parse_stream_start (info->data, &stream_id); - GST_INFO_OBJECT (self, "Got pad %" GST_PTR_FORMAT " with stream ID: %s", - pad, stream_id); - gst_transcode_bin_link_encodebin_pad (self, pad, stream_id); + GST_INFO_OBJECT (self, + "Got pad %" GST_PTR_FORMAT " with stream:: %" GST_PTR_FORMAT, pad, + info->data); + gst_transcode_bin_link_encodebin_pad (self, pad, info->data); return GST_PAD_PROBE_REMOVE; } @@ -399,7 +440,7 @@ gst_event_parse_stream_start (sstart_event, &stream_id); GST_INFO_OBJECT (self, "Got pad %" GST_PTR_FORMAT " with stream ID: %s", pad, stream_id); - gst_transcode_bin_link_encodebin_pad (self, pad, stream_id); + gst_transcode_bin_link_encodebin_pad (self, pad, sstart_event); return; } @@ -472,7 +513,7 @@ } static GstPad * -get_encodebin_pad_for_caps (GstTranscodeBin * self, GstCaps * srccaps) +get_encodebin_pad_for_caps (GstTranscodeBin * self, const GstCaps * srccaps) { GstPad *res = NULL; GstIterator *pads; @@ -549,8 +590,7 @@ } static GstPad * -get_encodebin_pad_from_stream (GstTranscodeBin * self, - GstEncodingProfile * profile, GstStream * stream) +get_encodebin_pad_from_stream (GstTranscodeBin * self, GstStream * stream) { GstCaps *caps = gst_stream_get_caps (stream); GstPad *sinkpad = get_encodebin_pad_for_caps (self, caps); @@ -572,6 +612,7 @@ sinkpad = get_encodebin_pad_for_caps (self, caps); } + gst_caps_unref (caps); return sinkpad; } @@ -597,22 +638,9 @@ for (i = 0; i < gst_stream_collection_get_size (collection); i++) { GstStream *tmpstream = gst_stream_collection_get_stream (collection, i); - GstPad *encodebin_pad = - get_encodebin_pad_from_stream (self, self->profile, tmpstream); - - if (encodebin_pad) { - if (stream == tmpstream) - transcode_stream = TRUE; - GST_INFO_OBJECT (self, - "Going to transcode stream %s (encodebin pad: %" GST_PTR_FORMAT, - gst_stream_get_stream_id (tmpstream), encodebin_pad); - - GST_OBJECT_LOCK (self); - g_ptr_array_add (self->transcoding_streams, - transcoding_stream_new (tmpstream, encodebin_pad)); - GST_OBJECT_UNLOCK (self); - } + if (setup_stream (self, tmpstream) && stream == tmpstream) + transcode_stream = TRUE; } GST_OBJECT_LOCK (self); @@ -656,9 +684,11 @@ restrictions = gst_encoding_profile_get_restriction (profile); - if (restrictions && gst_caps_is_any (restrictions)) { + if (restrictions) { + gboolean is_any = gst_caps_is_any (restrictions); gst_caps_unref (restrictions); - continue; + if (is_any) + continue; } encodecaps = gst_encoding_profile_get_format (profile); @@ -737,6 +767,38 @@ } } +static gboolean +sink_event_function (GstPad * sinkpad, GstTranscodeBin * self, GstEvent * event) +{ + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_STREAM_START: + { + GstQuery *q = gst_query_new_selectable (); + + /* Query whether upstream can handle stream selection or not */ + if (gst_pad_peer_query (sinkpad, q)) { + GST_FIXME_OBJECT (self, "We force `transcodebin` to upstream selection" + " mode if *any* of the inputs is. This means things might break if" + " there's a mix"); + gst_query_parse_selectable (q, &self->upstream_selected); + GST_DEBUG_OBJECT (sinkpad, "Upstream is selectable : %d", + self->upstream_selected); + } else { + self->upstream_selected = FALSE; + GST_DEBUG_OBJECT (sinkpad, "Upstream does not handle SELECTABLE query"); + } + gst_query_unref (q); + + break; + } + default: + break; + } + + return gst_pad_event_default (sinkpad, GST_OBJECT (self), event); +} + static GstStateChangeReturn gst_transcode_bin_change_state (GstElement * element, GstStateChange transition) { @@ -799,6 +861,7 @@ g_clear_object (&self->video_filter); g_clear_object (&self->audio_filter); g_clear_pointer (&self->transcoding_streams, g_ptr_array_unref); + gst_clear_object (&self->profile); G_OBJECT_CLASS (gst_transcode_bin_parent_class)->dispose (object); } @@ -851,6 +914,7 @@ } gpad = gst_ghost_pad_new_from_template (name, decodebin_pad, temp); + gst_pad_set_event_function (gpad, (GstPadEventFunction) sink_event_function); gst_element_add_pad (element, GST_PAD (gpad)); gst_object_unref (decodebin_pad);
View file
gst-plugins-bad-1.20.5.tar.xz/gst/transcode/gsttranscodeelement.c -> gst-plugins-bad-1.22.0.tar.xz/gst/transcode/gsttranscodeelement.c
Changed
@@ -24,12 +24,12 @@ #endif #include "gsttranscodeelements.h" -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include <gst/pbutils/pbutils.h> #include <gst/pbutils/missing-plugins.h> -GST_DEBUG_CATEGORY_STATIC (gst_transcodebin_debug); +GST_DEBUG_CATEGORY (gst_transcodebin_debug); #define GST_CAT_DEFAULT gst_transcodebin_debug void
View file
gst-plugins-bad-1.20.5.tar.xz/gst/transcode/gsturitranscodebin.c -> gst-plugins-bad-1.22.0.tar.xz/gst/transcode/gsturitranscodebin.c
Changed
@@ -225,6 +225,7 @@ sinkpad); /* Let `pad unlinked` error pop up later */ } + gst_object_unref (sinkpad); } static gboolean @@ -506,6 +507,9 @@ g_clear_object (&self->video_filter); g_clear_object (&self->audio_filter); g_clear_object (&self->cpu_clock); + g_free (self->source_uri); + g_free (self->dest_uri); + gst_clear_object (&self->profile); G_OBJECT_CLASS (gst_uri_transcode_bin_parent_class)->dispose (object); } @@ -599,11 +603,13 @@ break; case PROP_AUDIO_FILTER: GST_OBJECT_LOCK (self); + gst_object_unref (self->audio_filter); self->audio_filter = g_value_dup_object (value); GST_OBJECT_UNLOCK (self); break; case PROP_VIDEO_FILTER: GST_OBJECT_LOCK (self); + gst_object_unref (self->video_filter); self->video_filter = g_value_dup_object (value); GST_OBJECT_UNLOCK (self); break;
View file
gst-plugins-bad-1.20.5.tar.xz/gst/transcode/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/transcode/meson.build
Changed
@@ -11,5 +11,4 @@ install_dir : plugins_install_dir, ) -pkgconfig.generate(gsttranscoder_plugin, install_dir : plugins_pkgconfig_install_dir) plugins += gsttranscoder_plugin
View file
gst-plugins-bad-1.20.5.tar.xz/gst/videofilters/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/videofilters/meson.build
Changed
@@ -33,5 +33,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstvideofiltersbad, install_dir : plugins_pkgconfig_install_dir) plugins += gstvideofiltersbad
View file
gst-plugins-bad-1.20.5.tar.xz/gst/videoframe_audiolevel/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/videoframe_audiolevel/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstvideoframe_audiolevel, install_dir : plugins_pkgconfig_install_dir) plugins += gstvideoframe_audiolevel
View file
gst-plugins-bad-1.20.5.tar.xz/gst/videoparsers/gstav1parse.c -> gst-plugins-bad-1.22.0.tar.xz/gst/videoparsers/gstav1parse.c
Changed
@@ -111,6 +111,7 @@ GstAV1Profile profile; GstAV1ParseAligment in_align; + gboolean detect_annex_b; GstAV1ParseAligment align; GstAV1Parser *parser; @@ -126,6 +127,10 @@ gboolean header; gboolean keyframe; gboolean show_frame; + + GstClockTime buffer_pts; + GstClockTime buffer_dts; + GstClockTime buffer_duration; }; static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", @@ -272,6 +277,8 @@ GstCaps * caps); static GstCaps *gst_av1_parse_get_sink_caps (GstBaseParse * parse, GstCaps * filter); +static GstFlowReturn gst_av1_parse_pre_push_frame (GstBaseParse * parse, + GstBaseParseFrame * frame); /* Clear the parse state related to data kind OBUs. */ static void @@ -283,6 +290,14 @@ } static void +gst_av1_parse_reset_tu_timestamp (GstAV1Parse * self) +{ + self->buffer_pts = GST_CLOCK_TIME_NONE; + self->buffer_dts = GST_CLOCK_TIME_NONE; + self->buffer_duration = GST_CLOCK_TIME_NONE; +} + +static void gst_av1_parse_reset (GstAV1Parse * self) { self->width = 0; @@ -294,6 +309,7 @@ self->bit_depth = 0; self->align = GST_AV1_PARSE_ALIGN_NONE; self->in_align = GST_AV1_PARSE_ALIGN_NONE; + self->detect_annex_b = FALSE; self->discont = TRUE; self->header = FALSE; self->keyframe = FALSE; @@ -305,6 +321,7 @@ g_clear_pointer (&self->parser, gst_av1_parser_free); gst_adapter_clear (self->cache_out); gst_adapter_clear (self->frame_cache); + gst_av1_parse_reset_tu_timestamp (self); } static void @@ -343,6 +360,8 @@ parse_class->start = GST_DEBUG_FUNCPTR (gst_av1_parse_start); parse_class->stop = GST_DEBUG_FUNCPTR (gst_av1_parse_stop); parse_class->handle_frame = GST_DEBUG_FUNCPTR (gst_av1_parse_handle_frame); + parse_class->pre_push_frame = + GST_DEBUG_FUNCPTR (gst_av1_parse_pre_push_frame); parse_class->set_sink_caps = GST_DEBUG_FUNCPTR (gst_av1_parse_set_sink_caps); parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_av1_parse_get_sink_caps); @@ -608,8 +627,7 @@ str_align = gst_structure_get_string (s, "alignment"); str_stream = gst_structure_get_string (s, "stream-format"); - if (str_align || str_stream) - align = gst_av1_parse_alignment_from_string (str_align, str_stream); + align = gst_av1_parse_alignment_from_string (str_align, str_stream); } return align; @@ -738,7 +756,7 @@ gst_av1_parse_negotiate (GstAV1Parse * self, GstCaps * in_caps) { GstCaps *caps; - GstAV1ParseAligment align = GST_AV1_PARSE_ALIGN_NONE; + GstAV1ParseAligment align; caps = gst_pad_get_allowed_caps (GST_BASE_PARSE_SRC_PAD (self)); GST_DEBUG_OBJECT (self, "allowed caps: %" GST_PTR_FORMAT, caps); @@ -753,38 +771,45 @@ /* prefer TU as default */ if (gst_av1_parse_caps_has_alignment (caps, GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT)) { - align = GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT; + self->align = GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT; goto done; } /* Both upsteam and downstream support, best */ if (in_caps && caps) { if (gst_caps_can_intersect (in_caps, caps)) { - GST_DEBUG_OBJECT (self, "downstream accepts upstream caps"); - align = gst_av1_parse_alignment_from_caps (in_caps); - gst_clear_caps (&caps); + GstCaps *common_caps = NULL; + + common_caps = gst_caps_intersect (in_caps, caps); + align = gst_av1_parse_alignment_from_caps (common_caps); + gst_clear_caps (&common_caps); + + if (align != GST_AV1_PARSE_ALIGN_NONE + && align != GST_AV1_PARSE_ALIGN_ERROR) { + self->align = align; + goto done; + } } } - if (align != GST_AV1_PARSE_ALIGN_NONE) - goto done; /* Select first one of downstream support */ if (caps && !gst_caps_is_empty (caps)) { /* fixate to avoid ambiguity with lists when parsing */ caps = gst_caps_fixate (caps); align = gst_av1_parse_alignment_from_caps (caps); + + if (align != GST_AV1_PARSE_ALIGN_NONE && align != GST_AV1_PARSE_ALIGN_ERROR) { + self->align = align; + goto done; + } } - if (align != GST_AV1_PARSE_ALIGN_NONE) - goto done; /* default */ - if (align == GST_AV1_PARSE_ALIGN_NONE) - align = GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT; + self->align = GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT; done: - self->align = align; GST_INFO_OBJECT (self, "selected alignment %s", - gst_av1_parse_alignment_to_string (align)); + gst_av1_parse_alignment_to_string (self->align)); gst_clear_caps (&caps); } @@ -863,9 +888,12 @@ in_caps = gst_caps_copy (caps); /* default */ - if (align == GST_AV1_PARSE_ALIGN_NONE) + if (align == GST_AV1_PARSE_ALIGN_NONE) { + align = GST_AV1_PARSE_ALIGN_BYTE; gst_caps_set_simple (in_caps, "alignment", G_TYPE_STRING, - gst_av1_parse_alignment_to_string (GST_AV1_PARSE_ALIGN_BYTE), NULL); + gst_av1_parse_alignment_to_string (align), + "stream-format", G_TYPE_STRING, "obu-stream", NULL); + } /* negotiate with downstream, set output align */ gst_av1_parse_negotiate (self, in_caps); @@ -881,6 +909,9 @@ self->in_align = align; + if (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT) + self->detect_annex_b = TRUE; + if (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B) { gst_av1_parser_reset (self->parser, TRUE); } else { @@ -947,20 +978,29 @@ if (self->discont) { GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); self->discont = FALSE; + } else { + GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DISCONT); } + if (self->header) { GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_HEADER); self->header = FALSE; + } else { + GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_HEADER); } + if (self->keyframe) { - GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); + GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DELTA_UNIT); self->keyframe = FALSE; } else { - GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); } - if (frame_finished) - GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_MARKER); + if (frame_finished) { + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_MARKER); + } else { + GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_MARKER); + } if (self->align == GST_AV1_PARSE_ALIGN_FRAME) { if (!self->show_frame) { @@ -968,6 +1008,8 @@ } else { GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DECODE_ONLY); } + } else { + GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DECODE_ONLY); } gst_buffer_replace (&frame->out_buffer, buf); @@ -1537,6 +1579,19 @@ return ret; } +static void +gst_av1_parse_create_subframe (GstBaseParseFrame * frame, + GstBaseParseFrame * subframe, GstBuffer * buffer) +{ + gst_base_parse_frame_init (subframe); + subframe->flags |= frame->flags; + subframe->offset = frame->offset; + subframe->overhead = frame->overhead; + /* Just ref the input buffer. The base parse will check that + pointer, and it will be replaced by its out_buffer later. */ + subframe->buffer = gst_buffer_ref (buffer); +} + static GstFlowReturn gst_av1_parse_handle_to_small_and_equal_align (GstBaseParse * parse, GstBaseParseFrame * frame, gint * skipsize) @@ -1547,47 +1602,75 @@ GstFlowReturn ret = GST_FLOW_OK; GstAV1ParserResult res = GST_AV1_PARSER_INVALID_OPERATION; GstBuffer *buffer = gst_buffer_ref (frame->buffer); - guint32 total_consumed, consumed; + guint32 offset, consumed_before_push, consumed; gboolean frame_complete; + GstBaseParseFrame subframe; if (!gst_buffer_map (buffer, &map_info, GST_MAP_READ)) { GST_ERROR_OBJECT (parse, "Couldn't map incoming buffer"); return GST_FLOW_ERROR; } - total_consumed = 0; + self->buffer_pts = GST_BUFFER_PTS (buffer); + self->buffer_dts = GST_BUFFER_DTS (buffer); + self->buffer_duration = GST_BUFFER_DURATION (buffer); + + consumed_before_push = 0; + offset = 0; frame_complete = FALSE; again: - while (total_consumed < map_info.size) { + while (offset < map_info.size) { + GST_BUFFER_OFFSET (buffer) = offset; + res = gst_av1_parser_identify_one_obu (self->parser, - map_info.data + total_consumed, map_info.size - total_consumed, - &obu, &consumed); + map_info.data + offset, map_info.size - offset, &obu, &consumed); if (res == GST_AV1_PARSER_OK) res = gst_av1_parse_handle_one_obu (self, &obu, &frame_complete, NULL); if (res != GST_AV1_PARSER_OK) break; - if (obu.obu_type == GST_AV1_OBU_TEMPORAL_DELIMITER && total_consumed) { + if (obu.obu_type == GST_AV1_OBU_TEMPORAL_DELIMITER + && consumed_before_push > 0) { GST_DEBUG_OBJECT (self, "Encounter TD inside one %s aligned" " buffer, should not happen normally.", gst_av1_parse_alignment_to_string (self->in_align)); - frame_complete = TRUE; + if (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B) gst_av1_parser_reset_annex_b (self->parser); - /* Not include this TD obu, it should belong to the next TU or frame */ - break; + + /* Not include this TD obu, it should belong to the next TU or frame, + we push all the data we already got. */ + gst_av1_parse_create_subframe (frame, &subframe, buffer); + ret = gst_av1_parse_push_data (self, &subframe, + consumed_before_push, TRUE); + if (ret != GST_FLOW_OK) + goto out; + + /* Begin to find the next. */ + frame_complete = FALSE; + consumed_before_push = 0; + continue; } gst_av1_parse_cache_one_obu (self, buffer, &obu, - map_info.data + total_consumed, consumed, frame_complete); + map_info.data + offset, consumed, frame_complete); - total_consumed += consumed; + offset += consumed; + consumed_before_push += consumed; - if (self->align == GST_AV1_PARSE_ALIGN_OBU) - break; + if ((self->align == GST_AV1_PARSE_ALIGN_OBU) || + (self->align == GST_AV1_PARSE_ALIGN_FRAME && frame_complete)) { + gst_av1_parse_create_subframe (frame, &subframe, buffer); + ret = gst_av1_parse_push_data (self, &subframe, + consumed_before_push, frame_complete); + if (ret != GST_FLOW_OK) + goto out; - if (self->align == GST_AV1_PARSE_ALIGN_FRAME && frame_complete) - break; + /* Begin to find the next. */ + frame_complete = FALSE; + consumed_before_push = 0; + continue; + } } if (res == GST_AV1_PARSER_BITSTREAM_ERROR || @@ -1613,7 +1696,7 @@ goto out; } else if (res == GST_AV1_PARSER_DROP) { GST_DEBUG_OBJECT (parse, "Drop %d data", consumed); - total_consumed += consumed; + offset += consumed; gst_av1_parse_reset_obu_data_state (self); res = GST_AV1_PARSER_OK; goto again; @@ -1624,22 +1707,23 @@ goto out; } - g_assert (total_consumed >= map_info.size || frame_complete - || self->align == GST_AV1_PARSE_ALIGN_OBU); - - if (total_consumed >= map_info.size && !frame_complete + /* If the total buffer exhausted but frame is not complete, we just + push the left data and consider it as a frame. */ + if (consumed_before_push > 0 && !frame_complete && self->align == GST_AV1_PARSE_ALIGN_FRAME) { - /* Warning and still consider this frame as complete */ + g_assert (offset >= map_info.size); + /* Warning and still consider the frame is complete */ GST_WARNING_OBJECT (self, "Exhaust the buffer but still incomplete frame," " should not happend in %s alignment", gst_av1_parse_alignment_to_string (self->in_align)); } - ret = gst_av1_parse_push_data (self, frame, total_consumed, frame_complete); + ret = gst_av1_parse_push_data (self, frame, consumed_before_push, TRUE); out: gst_buffer_unmap (buffer, &map_info); gst_buffer_unref (buffer); + gst_av1_parse_reset_tu_timestamp (self); return ret; } @@ -1676,8 +1760,13 @@ break; check_new_tu = FALSE; - res = gst_av1_parse_handle_one_obu (self, &obu, &frame_complete, - &check_new_tu); + if (self->align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT + || self->align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B) { + res = gst_av1_parse_handle_one_obu (self, &obu, &frame_complete, + &check_new_tu); + } else { + res = gst_av1_parse_handle_one_obu (self, &obu, &frame_complete, NULL); + } if (res != GST_AV1_PARSER_OK) break; @@ -1766,10 +1855,12 @@ return ret; } -/* Try to recognize whether the input is annex-b format. */ -static GstFlowReturn -gst_av1_parse_detect_alignment (GstBaseParse * parse, - GstBaseParseFrame * frame, gint * skipsize, guint32 * total_consumed) +/* Try to recognize whether the input is annex-b format. + return TRUE if we decide, FALSE if we can not decide or + encounter some error. */ +static gboolean +gst_av1_parse_detect_stream_format (GstBaseParse * parse, + GstBaseParseFrame * frame) { GstAV1Parse *self = GST_AV1_PARSE (parse); GstMapInfo map_info; @@ -1779,28 +1870,31 @@ gboolean got_seq, got_frame; gboolean frame_complete; guint32 consumed; - guint32 frame_sz; - GstFlowReturn ret = GST_FLOW_OK; + guint32 total_consumed; + guint32 tu_sz; + gboolean ret = FALSE; + + g_assert (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT); + g_assert (self->detect_annex_b == TRUE); if (!gst_buffer_map (buffer, &map_info, GST_MAP_READ)) { - *skipsize = 0; GST_ERROR_OBJECT (parse, "Couldn't map incoming buffer"); - return GST_FLOW_ERROR; + return FALSE; } gst_av1_parser_reset (self->parser, FALSE); - /* Detect the alignment obu first */ got_seq = FALSE; got_frame = FALSE; - *total_consumed = 0; + total_consumed = 0; + again: - while (*total_consumed < map_info.size) { + while (total_consumed < map_info.size) { res = gst_av1_parser_identify_one_obu (self->parser, - map_info.data + *total_consumed, map_info.size - *total_consumed, + map_info.data + total_consumed, map_info.size - total_consumed, &obu, &consumed); if (res == GST_AV1_PARSER_OK) { - *total_consumed += consumed; + total_consumed += consumed; res = gst_av1_parse_handle_one_obu (self, &obu, &frame_complete, NULL); } @@ -1809,6 +1903,7 @@ if (obu.obu_type == GST_AV1_OBU_SEQUENCE_HEADER) got_seq = TRUE; + if (obu.obu_type == GST_AV1_OBU_REDUNDANT_FRAME_HEADER || obu.obu_type == GST_AV1_OBU_FRAME || obu.obu_type == GST_AV1_OBU_FRAME_HEADER) @@ -1820,51 +1915,45 @@ gst_av1_parser_reset (self->parser, FALSE); - if (res == GST_AV1_PARSER_OK || res == GST_AV1_PARSER_NO_MORE_DATA) { - *skipsize = 0; - - /* If succeed recognize seq or frame, we can decide, - otherwise, just skipsize to 0 and get more data. */ - if (got_seq || got_frame) - self->in_align = GST_AV1_PARSE_ALIGN_BYTE; - - ret = GST_FLOW_OK; + /* If succeed recognize seq or frame, it's done. + otherwise, just need to get more data. */ + if (got_seq || got_frame) { + ret = TRUE; + self->detect_annex_b = FALSE; goto out; - } else if (res == GST_AV1_PARSER_DROP) { - *total_consumed += consumed; + } + + if (res == GST_AV1_PARSER_DROP) { + total_consumed += consumed; res = GST_AV1_PARSER_OK; gst_av1_parse_reset_obu_data_state (self); goto again; } - /* Try the annexb. The buffer should hold the whole frame, and - the buffer start with the frame size in leb128() format. */ + /* Try the annex b format. The buffer should contain the whole TU, + and the buffer start with the TU size in leb128() format. */ if (map_info.size < 8) { - /* Get more data. */ - *skipsize = 0; - ret = GST_FLOW_OK; + /* Too small. */ goto out; } - frame_sz = _read_leb128 (map_info.data, &res, &consumed); - if (frame_sz == 0 || res != GST_AV1_PARSER_OK) { - /* Both modes does not match, we can decide a error */ - ret = GST_FLOW_ERROR; + tu_sz = _read_leb128 (map_info.data, &res, &consumed); + if (tu_sz == 0 || res != GST_AV1_PARSER_OK) { + /* error to get the TU size, should not be annex b. */ goto out; } - if (frame_sz + consumed != map_info.size) { - GST_DEBUG_OBJECT (self, "Buffer size %" G_GSSIZE_FORMAT ", frame size %d," - " consumed %d, does not match annex b format.", - map_info.size, frame_sz, consumed); - /* Both modes does not match, we can decide a error */ - ret = GST_FLOW_ERROR; + if (tu_sz + consumed != map_info.size) { + GST_DEBUG_OBJECT (self, "Buffer size %" G_GSSIZE_FORMAT ", TU size %d," + " do not match.", map_info.size, tu_sz); goto out; } + GST_INFO_OBJECT (self, "Detect the annex-b format"); self->in_align = GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B; + self->detect_annex_b = FALSE; gst_av1_parser_reset (self->parser, TRUE); - ret = GST_FLOW_OK; + ret = TRUE; out: gst_av1_parse_reset_obu_data_state (self); @@ -1916,10 +2005,22 @@ if (upstream_caps) { if (!gst_caps_is_empty (upstream_caps) && !gst_caps_is_any (upstream_caps)) { + GstAV1ParseAligment align; + GST_LOG_OBJECT (self, "upstream caps: %" GST_PTR_FORMAT, upstream_caps); + /* fixate to avoid ambiguity with lists when parsing */ upstream_caps = gst_caps_fixate (upstream_caps); - self->in_align = gst_av1_parse_alignment_from_caps (upstream_caps); + align = gst_av1_parse_alignment_from_caps (upstream_caps); + if (align == GST_AV1_PARSE_ALIGN_ERROR) { + GST_ERROR_OBJECT (self, "upstream caps %" GST_PTR_FORMAT + " set stream-format and alignment conflict.", upstream_caps); + + gst_caps_unref (upstream_caps); + return GST_FLOW_ERROR; + } + + self->in_align = align; } gst_caps_unref (upstream_caps); @@ -1928,24 +2029,29 @@ self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B); } - if (self->in_align != GST_AV1_PARSE_ALIGN_NONE) - GST_LOG_OBJECT (self, "Query the upstream get the alignment %d", - self->in_align); + if (self->in_align != GST_AV1_PARSE_ALIGN_NONE) { + GST_LOG_OBJECT (self, "Query the upstream get the alignment %s", + gst_av1_parse_alignment_to_string (self->in_align)); + } else { + self->in_align = GST_AV1_PARSE_ALIGN_BYTE; + GST_DEBUG_OBJECT (self, "alignment set to default %s", + gst_av1_parse_alignment_to_string (GST_AV1_PARSE_ALIGN_BYTE)); + } } - if (self->in_align == GST_AV1_PARSE_ALIGN_NONE) { - guint32 consumed = 0; - - /* Only happend at the first time of handle_frame, and the - alignment in the sink caps is unset. Try the default and - if error, try the annex B. */ - ret = gst_av1_parse_detect_alignment (parse, frame, skipsize, &consumed); - if (ret == GST_FLOW_OK && self->in_align != GST_AV1_PARSE_ALIGN_NONE) { - GST_INFO_OBJECT (self, "Detect the input alignment %d", self->in_align); + if (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT + && self->detect_annex_b) { + /* Only happend at the first time of handle_frame, try to + recognize the annex b stream format. */ + if (gst_av1_parse_detect_stream_format (parse, frame)) { + GST_INFO_OBJECT (self, "Input alignment %s", + gst_av1_parse_alignment_to_string (self->in_align)); } else { - *skipsize = consumed > 0 ? consumed : gst_buffer_get_size (frame->buffer); - GST_WARNING_OBJECT (self, "Fail to detect the alignment, skip %d", - *skipsize); + /* Because the input is already TU aligned, we should skip + the whole problematic TU and check the next one. */ + *skipsize = gst_buffer_get_size (frame->buffer); + GST_WARNING_OBJECT (self, "Fail to detect the stream format for TU," + " skip the whole TU %d", *skipsize); return GST_FLOW_OK; } } @@ -1973,3 +2079,57 @@ return ret; } + +static GstFlowReturn +gst_av1_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) +{ + GstAV1Parse *self = GST_AV1_PARSE (parse); + + frame->flags |= GST_BASE_PARSE_FRAME_FLAG_CLIP; + + if (!frame->buffer) + return GST_FLOW_OK; + + if (self->align == GST_AV1_PARSE_ALIGN_FRAME) { + /* When the input align to TU, it may may contain more than one frames + inside its buffer. When splitting a TU into frames, the base parse + class only assign the PTS to the first frame and leave the others' + PTS invalid. But in fact, all decode only frames should have invalid + PTS while showable frames should have correct PTS setting. */ + if (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT + || self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B) { + if (GST_BUFFER_FLAG_IS_SET (frame->buffer, GST_BUFFER_FLAG_DECODE_ONLY)) { + GST_BUFFER_PTS (frame->buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DURATION (frame->buffer) = GST_CLOCK_TIME_NONE; + } else { + GST_BUFFER_PTS (frame->buffer) = self->buffer_pts; + GST_BUFFER_DURATION (frame->buffer) = self->buffer_duration; + } + + GST_BUFFER_DTS (frame->buffer) = self->buffer_dts; + } else { + if (GST_BUFFER_FLAG_IS_SET (frame->buffer, GST_BUFFER_FLAG_DECODE_ONLY)) { + GST_BUFFER_PTS (frame->buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DURATION (frame->buffer) = GST_CLOCK_TIME_NONE; + } + } + } else if (self->align == GST_AV1_PARSE_ALIGN_OBU) { + /* When we split a big frame or TU into OBUs, all OBUs should have the + same PTS and DTS of the input buffer, and should not have duration. */ + if (self->in_align >= GST_AV1_PARSE_ALIGN_FRAME) { + GST_BUFFER_PTS (frame->buffer) = self->buffer_pts; + GST_BUFFER_DTS (frame->buffer) = self->buffer_dts; + GST_BUFFER_DURATION (frame->buffer) = GST_CLOCK_TIME_NONE; + } + } + + GST_LOG_OBJECT (parse, "Adjust the frame buffer PTS/DTS/duration." + " The buffer of size %" G_GSIZE_FORMAT " now with dts %" + GST_TIME_FORMAT ", pts %" GST_TIME_FORMAT ", duration %" + GST_TIME_FORMAT, gst_buffer_get_size (frame->buffer), + GST_TIME_ARGS (GST_BUFFER_DTS (frame->buffer)), + GST_TIME_ARGS (GST_BUFFER_PTS (frame->buffer)), + GST_TIME_ARGS (GST_BUFFER_DURATION (frame->buffer))); + + return GST_FLOW_OK; +}
View file
gst-plugins-bad-1.20.5.tar.xz/gst/videoparsers/gsth264parse.c -> gst-plugins-bad-1.22.0.tar.xz/gst/videoparsers/gsth264parse.c
Changed
@@ -212,6 +212,8 @@ { GstH264Parse *h264parse = GST_H264_PARSE (object); + gst_video_user_data_unregistered_clear (&h264parse->user_data_unregistered); + g_object_unref (h264parse->frame_out); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -607,6 +609,21 @@ } static void +gst_h264_parse_process_sei_user_data_unregistered (GstH264Parse * h264parse, + GstH264UserDataUnregistered * urud) +{ + GstByteReader br; + + if (urud->data == NULL || urud->size < 1) + return; + + gst_byte_reader_init (&br, urud->data, urud->size); + + gst_video_parse_user_data_unregistered ((GstElement *) h264parse, + &h264parse->user_data_unregistered, &br, urud->uuid); +} + +static void gst_h264_parse_process_sei (GstH264Parse * h264parse, GstH264NalUnit * nalu) { GstH264SEIMessage sei; @@ -664,6 +681,10 @@ gst_h264_parse_process_sei_user_data (h264parse, &sei.payload.registered_user_data); break; + case GST_H264_SEI_USER_DATA_UNREGISTERED: + gst_h264_parse_process_sei_user_data_unregistered (h264parse, + &sei.payload.user_data_unregistered); + break; case GST_H264_SEI_BUF_PERIOD: if (h264parse->ts_trn_nb == GST_CLOCK_TIME_NONE || h264parse->dts == GST_CLOCK_TIME_NONE) @@ -1254,6 +1275,10 @@ tmp_frame.overhead = frame->overhead; tmp_frame.buffer = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, nalu.offset, nalu.size); + /* Don't lose timestamp when offset is not 0. */ + GST_BUFFER_PTS (tmp_frame.buffer) = GST_BUFFER_PTS (buffer); + GST_BUFFER_DTS (tmp_frame.buffer) = GST_BUFFER_DTS (buffer); + GST_BUFFER_DURATION (tmp_frame.buffer) = GST_BUFFER_DURATION (buffer); /* Set marker on last packet */ if (nl + nalu.size == left) { @@ -2121,16 +2146,20 @@ GstVideoColorimetry ci = { 0, }; gchar *old_colorimetry = NULL; - if (vui->video_full_range_flag) - ci.range = GST_VIDEO_COLOR_RANGE_0_255; - else - ci.range = GST_VIDEO_COLOR_RANGE_16_235; - ci.matrix = gst_video_color_matrix_from_iso (vui->matrix_coefficients); ci.transfer = gst_video_transfer_function_from_iso (vui->transfer_characteristics); ci.primaries = gst_video_color_primaries_from_iso (vui->colour_primaries); + if (ci.matrix != GST_VIDEO_COLOR_MATRIX_UNKNOWN + && ci.transfer != GST_VIDEO_TRANSFER_UNKNOWN + && ci.primaries != GST_VIDEO_COLOR_PRIMARIES_UNKNOWN) { + if (vui->video_full_range_flag) + ci.range = GST_VIDEO_COLOR_RANGE_0_255; + else + ci.range = GST_VIDEO_COLOR_RANGE_16_235; + } + old_colorimetry = gst_video_colorimetry_to_string (&h264parse->parsed_colorimetry); colorimetry = gst_video_colorimetry_to_string (&ci); @@ -2155,6 +2184,7 @@ GstVideoMultiviewFlags mview_flags = h264parse->multiview_flags; const gchar *chroma_format = NULL; guint bit_depth_chroma; + const gchar *coded_picture_structure; fps_num = h264parse->fps_num; fps_den = h264parse->fps_den; @@ -2233,6 +2263,15 @@ latency); } + if (sps->frame_mbs_only_flag == 1) { + coded_picture_structure = "frame"; + } else { + coded_picture_structure = "field"; + } + + gst_caps_set_simple (caps, "coded-picture-structure", G_TYPE_STRING, + coded_picture_structure, NULL); + bit_depth_chroma = sps->bit_depth_chroma_minus8 + 8; switch (sps->chroma_format_idc) { @@ -3331,6 +3370,9 @@ gst_video_push_user_data ((GstElement *) h264parse, &h264parse->user_data, parse_buffer); + gst_video_push_user_data_unregistered ((GstElement *) h264parse, + &h264parse->user_data_unregistered, parse_buffer); + gst_h264_parse_reset_frame (h264parse); return GST_FLOW_OK; @@ -3343,11 +3385,11 @@ GstStructure *str; const GValue *codec_data_value; GstBuffer *codec_data = NULL; - gsize size; - guint format, align, off; - GstH264NalUnit nalu; + guint format, align; + GstH264NalUnit *nalu; GstH264ParserResult parseres; GstCaps *old_caps; + GstH264DecoderConfigRecord *config = NULL; h264parse = GST_H264_PARSE (parse); @@ -3412,12 +3454,7 @@ /* packetized video has codec_data (required for AVC, optional for AVC3) */ if (codec_data_value != NULL) { GstMapInfo map; - guint8 *data; - guint num_sps, num_pps; -#ifndef GST_DISABLE_GST_DEBUG - guint profile; -#endif - gint i; + guint i; GST_DEBUG_OBJECT (h264parse, "have packetized h264"); /* make note for optional split processing */ @@ -3431,67 +3468,36 @@ if (!codec_data) goto avc_caps_codec_data_missing; gst_buffer_map (codec_data, &map, GST_MAP_READ); - data = map.data; - size = map.size; - /* parse the avcC data */ - if (size < 7) { /* when numSPS==0 and numPPS==0, length is 7 bytes */ + parseres = + gst_h264_parser_parse_decoder_config_record (h264parse->nalparser, + map.data, map.size, &config); + if (parseres != GST_H264_PARSER_OK) { gst_buffer_unmap (codec_data, &map); - goto avcc_too_small; + goto avcC_failed; } - /* parse the version, this must be 1 */ - if (data0 != 1) { - gst_buffer_unmap (codec_data, &map); - goto wrong_version; - } -#ifndef GST_DISABLE_GST_DEBUG - /* AVCProfileIndication */ - /* profile_compat */ - /* AVCLevelIndication */ - profile = (data1 << 16) | (data2 << 8) | data3; - GST_DEBUG_OBJECT (h264parse, "profile %06x", profile); -#endif - /* 6 bits reserved | 2 bits lengthSizeMinusOne */ - /* this is the number of bytes in front of the NAL units to mark their - * length */ - h264parse->nal_length_size = (data4 & 0x03) + 1; + h264parse->nal_length_size = config->length_size_minus_one + 1; GST_DEBUG_OBJECT (h264parse, "nal length size %u", h264parse->nal_length_size); + GST_DEBUG_OBJECT (h264parse, "AVCProfileIndication %d", + config->profile_indication); + GST_DEBUG_OBJECT (h264parse, "profile_compatibility %d", + config->profile_compatibility); + GST_DEBUG_OBJECT (h264parse, "AVCLevelIndication %d", + config->level_indication); - num_sps = data5 & 0x1f; - off = 6; - for (i = 0; i < num_sps; i++) { - parseres = gst_h264_parser_identify_nalu_avc (h264parse->nalparser, - data, off, size, 2, &nalu); - if (parseres != GST_H264_PARSER_OK) { - gst_buffer_unmap (codec_data, &map); - goto avcc_too_small; - } - - gst_h264_parse_process_nal (h264parse, &nalu); - off = nalu.offset + nalu.size; + for (i = 0; i < config->sps->len; i++) { + nalu = &g_array_index (config->sps, GstH264NalUnit, i); + gst_h264_parse_process_nal (h264parse, nalu); } - if (off >= size) { - gst_buffer_unmap (codec_data, &map); - goto avcc_too_small; - } - num_pps = dataoff; - off++; - - for (i = 0; i < num_pps; i++) { - parseres = gst_h264_parser_identify_nalu_avc (h264parse->nalparser, - data, off, size, 2, &nalu); - if (parseres != GST_H264_PARSER_OK) { - gst_buffer_unmap (codec_data, &map); - goto avcc_too_small; - } - - gst_h264_parse_process_nal (h264parse, &nalu); - off = nalu.offset + nalu.size; + for (i = 0; i < config->pps->len; i++) { + nalu = &g_array_index (config->pps, GstH264NalUnit, i); + gst_h264_parse_process_nal (h264parse, nalu); } + gst_h264_decoder_config_record_free (config); gst_buffer_unmap (codec_data, &map); gst_buffer_replace (&h264parse->codec_data_in, codec_data); @@ -3566,14 +3572,9 @@ "expected, send SPS/PPS in-band with data or in streamheader field"); goto refuse_caps; } -avcc_too_small: - { - GST_DEBUG_OBJECT (h264parse, "avcC size %" G_GSIZE_FORMAT " < 8", size); - goto refuse_caps; - } -wrong_version: +avcC_failed: { - GST_DEBUG_OBJECT (h264parse, "wrong avcC version"); + GST_DEBUG_OBJECT (h264parse, "Failed to parse avcC data"); goto refuse_caps; } refuse_caps:
View file
gst-plugins-bad-1.20.5.tar.xz/gst/videoparsers/gsth264parse.h -> gst-plugins-bad-1.22.0.tar.xz/gst/videoparsers/gsth264parse.h
Changed
@@ -157,6 +157,7 @@ gboolean first_in_bundle; GstVideoParseUserData user_data; + GstVideoParseUserDataUnregistered user_data_unregistered; GstVideoMasteringDisplayInfo mastering_display_info; guint mastering_display_info_state;
View file
gst-plugins-bad-1.20.5.tar.xz/gst/videoparsers/gsth265parse.c -> gst-plugins-bad-1.22.0.tar.xz/gst/videoparsers/gsth265parse.c
Changed
@@ -797,14 +797,8 @@ h265parse->state |= GST_H265_PARSE_STATE_GOT_SPS; break; case GST_H265_NAL_PPS: - /* expected state: got-sps */ - h265parse->state &= GST_H265_PARSE_STATE_GOT_SPS; - if (!GST_H265_PARSE_STATE_VALID (h265parse, GST_H265_PARSE_STATE_GOT_SPS)) - return FALSE; - pres = gst_h265_parser_parse_pps (nalparser, nalu, &pps); - /* arranged for a fallback pps.id, so use that one and only warn */ if (pres != GST_H265_PARSER_OK) { GST_WARNING_OBJECT (h265parse, "failed to parse PPS:"); @@ -960,16 +954,8 @@ break; } case GST_H265_NAL_AUD: - /* Just accumulate AU Delimiter, whether it's before SPS or not */ - pres = gst_h265_parser_parse_nal (nalparser, nalu); - if (pres != GST_H265_PARSER_OK) - return FALSE; - break; default: - /* drop anything before the initial SPS */ - if (!GST_H265_PARSE_STATE_VALID (h265parse, GST_H265_PARSE_STATE_GOT_SPS)) - return FALSE; - + /* Just accumulate AU Delimiter, whether it's before SPS or not */ pres = gst_h265_parser_parse_nal (nalparser, nalu); if (pres != GST_H265_PARSER_OK) return FALSE; @@ -1075,6 +1061,10 @@ tmp_frame.overhead = frame->overhead; tmp_frame.buffer = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, nalu.offset, nalu.size); + /* Don't lose timestamp when offset is not 0. */ + GST_BUFFER_PTS (tmp_frame.buffer) = GST_BUFFER_PTS (buffer); + GST_BUFFER_DTS (tmp_frame.buffer) = GST_BUFFER_DTS (buffer); + GST_BUFFER_DURATION (tmp_frame.buffer) = GST_BUFFER_DURATION (buffer); /* Set marker on last packet */ if (nl + nalu.size == left) { @@ -2086,6 +2076,7 @@ gboolean modified = FALSE; GstBuffer *buf = NULL; GstStructure *s = NULL; + gint width, height; if (G_UNLIKELY (!gst_pad_has_current_caps (GST_BASE_PARSE_SRC_PAD (h265parse)))) @@ -2242,7 +2233,6 @@ if (G_UNLIKELY (modified || h265parse->update_caps)) { gint fps_num = h265parse->fps_num; gint fps_den = h265parse->fps_den; - gint width, height; GstClockTime latency = 0; caps = gst_caps_copy (sink_caps); @@ -2335,6 +2325,7 @@ const gchar *mdi_str = NULL; const gchar *cll_str = NULL; gboolean codec_data_modified = FALSE; + GstStructure *st; gst_caps_set_simple (caps, "parsed", G_TYPE_BOOLEAN, TRUE, "stream-format", G_TYPE_STRING, @@ -2343,11 +2334,32 @@ gst_h265_parse_get_string (h265parse, FALSE, h265parse->align), NULL); gst_h265_parse_get_par (h265parse, &par_n, &par_d); - if (par_n != 0 && par_d != 0 && + + width = 0; + height = 0; + st = gst_caps_get_structure (caps, 0); + gst_structure_get_int (st, "width", &width); + gst_structure_get_int (st, "height", &height); + + /* If no resolution info, do not consider aspect ratio */ + if (par_n != 0 && par_d != 0 && width > 0 && height > 0 && (!s || !gst_structure_has_field (s, "pixel-aspect-ratio"))) { - GST_INFO_OBJECT (h265parse, "PAR %d/%d", par_n, par_d); + gint new_par_d = par_d; + /* Special case for some encoders which provide an 1:2 pixel aspect ratio + * for HEVC interlaced content, possibly to work around decoders that don't + * support field-based interlacing. Add some defensive checks to check for + * a "common" aspect ratio. */ + if (par_n == 1 && par_d == 2 + && gst_h265_parse_is_field_interlaced (h265parse) + && !gst_video_is_common_aspect_ratio (width, height, par_n, par_d) + && gst_video_is_common_aspect_ratio (width, height, 1, 1)) { + GST_WARNING_OBJECT (h265parse, "PAR 1/2 makes the aspect ratio of " + "a %d x %d frame uncommon. Switching to 1/1", width, height); + new_par_d = 1; + } + GST_INFO_OBJECT (h265parse, "PAR %d/%d", par_n, new_par_d); gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, - par_n, par_d, NULL); + par_n, new_par_d, NULL); } /* set profile and level in caps */
View file
gst-plugins-bad-1.20.5.tar.xz/gst/videoparsers/gstvideoparseutils.c -> gst-plugins-bad-1.22.0.tar.xz/gst/videoparsers/gstvideoparseutils.c
Changed
@@ -26,6 +26,7 @@ #include <gst/base/base.h> #include <gst/pbutils/pbutils.h> #include <gst/video/video.h> +#include <gst/video/video-sei.h> #include <gst/base/gstbitreader.h> #include <gstvideoparseutils.h> @@ -436,3 +437,58 @@ afd->afd = (GstVideoAFDValue) afd_data; return TRUE; } + +/* + * gst_video_parse_user_data_unregistered: + * @elt: #GstElement that is parsing user data + * @user_data: #GstVideoParseUserDataUnregistered struct to hold parsed data + * @br: #GstByteReader attached to buffer of user data + * @uuid: User Data Unregistered UUID + * + * Parse user data and store in @user_data + */ +void +gst_video_parse_user_data_unregistered (GstElement * elt, + GstVideoParseUserDataUnregistered * user_data, + GstByteReader * br, guint8 uuid16) +{ + gst_video_user_data_unregistered_clear (user_data); + + memcpy (&user_data->uuid, uuid, 16); + user_data->size = gst_byte_reader_get_size (br); + gst_byte_reader_dup_data (br, user_data->size, &user_data->data); +} + +/* + * gst_video_user_data_unregistered_clear: + * @user_data: #GstVideoParseUserDataUnregistered holding SEI User Data Unregistered + * + * Clears the user data unregistered + */ +void +gst_video_user_data_unregistered_clear (GstVideoParseUserDataUnregistered * + user_data) +{ + g_free (user_data->data); + user_data->data = NULL; + user_data->size = 0; +} + +/* + * gst_video_push_user_data_unregistered: + * @elt: #GstElement that is pushing user data + * @user_data: #GstVideoParseUserDataUnregistered holding SEI User Data Unregistered + * @buf: #GstBuffer that receives the parsed data + * + * After user data has been parsed, add the data to @buf + */ +void +gst_video_push_user_data_unregistered (GstElement * elt, + GstVideoParseUserDataUnregistered * user_data, GstBuffer * buf) +{ + if (user_data->data != NULL) { + gst_buffer_add_video_sei_user_data_unregistered_meta (buf, user_data->uuid, + user_data->data, user_data->size); + gst_video_user_data_unregistered_clear (user_data); + } +}
View file
gst-plugins-bad-1.20.5.tar.xz/gst/videoparsers/gstvideoparseutils.h -> gst-plugins-bad-1.22.0.tar.xz/gst/videoparsers/gstvideoparseutils.h
Changed
@@ -174,13 +174,33 @@ } GstVideoParseUserData; +/* + * GstVideoParseUserDataUnregistered + * + * Holds unparsed User Data Unregistered. + */ +typedef struct +{ + guint8 uuid16; + guint8 *data; + gsize size; +} GstVideoParseUserDataUnregistered; + G_BEGIN_DECLS void gst_video_parse_user_data(GstElement * elt, GstVideoParseUserData * user_data, GstByteReader * br, guint8 field, guint16 provider_code); +void gst_video_parse_user_data_unregistered(GstElement * elt, GstVideoParseUserDataUnregistered * user_data, + GstByteReader * br, guint8 uuid16); + +void gst_video_user_data_unregistered_clear(GstVideoParseUserDataUnregistered * user_data); + void gst_video_push_user_data(GstElement * elt, GstVideoParseUserData * user_data, GstBuffer * buf); +void gst_video_push_user_data_unregistered(GstElement * elt, GstVideoParseUserDataUnregistered * user_data, + GstBuffer * buf); + G_END_DECLS #endif /* __VIDEO_PARSE_UTILS_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/gst/videoparsers/gstvp9parse.c -> gst-plugins-bad-1.22.0.tar.xz/gst/videoparsers/gstvp9parse.c
Changed
@@ -61,6 +61,10 @@ /* per frame status */ gboolean discont; + + GstClockTime super_frame_pts; + GstClockTime super_frame_dts; + GstClockTime super_frame_duration; }; static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", @@ -90,6 +94,8 @@ static void gst_vp9_parse_update_src_caps (GstVp9Parse * self, GstCaps * caps); static GstFlowReturn gst_vp9_parse_parse_frame (GstVp9Parse * self, GstBaseParseFrame * frame, GstVp9FrameHdr * frame_hdr); +static GstFlowReturn gst_vp9_parse_pre_push_frame (GstBaseParse * parse, + GstBaseParseFrame * frame); static void gst_vp9_parse_class_init (GstVp9ParseClass * klass) @@ -100,6 +106,8 @@ parse_class->start = GST_DEBUG_FUNCPTR (gst_vp9_parse_start); parse_class->stop = GST_DEBUG_FUNCPTR (gst_vp9_parse_stop); parse_class->handle_frame = GST_DEBUG_FUNCPTR (gst_vp9_parse_handle_frame); + parse_class->pre_push_frame = + GST_DEBUG_FUNCPTR (gst_vp9_parse_pre_push_frame); parse_class->set_sink_caps = GST_DEBUG_FUNCPTR (gst_vp9_parse_set_sink_caps); parse_class->get_sink_caps = GST_DEBUG_FUNCPTR (gst_vp9_parse_get_sink_caps); @@ -124,6 +132,14 @@ } static void +gst_vp9_parse_reset_super_frame (GstVp9Parse * self) +{ + self->super_frame_pts = GST_CLOCK_TIME_NONE; + self->super_frame_dts = GST_CLOCK_TIME_NONE; + self->super_frame_duration = GST_CLOCK_TIME_NONE; +} + +static void gst_vp9_parse_reset (GstVp9Parse * self) { self->width = 0; @@ -135,6 +151,7 @@ self->profile = GST_VP9_PROFILE_UNDEFINED; self->bit_depth = (GstVp9BitDepth) 0; self->codec_alpha = FALSE; + gst_vp9_parse_reset_super_frame (self); } static gboolean @@ -415,6 +432,36 @@ } static GstFlowReturn +gst_vp9_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) +{ + GstVp9Parse *self = GST_VP9_PARSE (parse); + + frame->flags |= GST_BASE_PARSE_FRAME_FLAG_CLIP; + + if (!frame->buffer) + return GST_FLOW_OK; + + /* The super frame may contain more than one frames inside its buffer. + When splitting a super frame into frames, the base parse class only + assign the PTS to the first frame and leave the others' PTS invalid. + But in fact, all decode only frames should have invalid PTS while + showable frames should have correct PTS setting. */ + if (self->align != GST_VP9_PARSE_ALIGN_FRAME) + return GST_FLOW_OK; + + if (GST_BUFFER_FLAG_IS_SET (frame->buffer, GST_BUFFER_FLAG_DECODE_ONLY)) { + GST_BUFFER_PTS (frame->buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DURATION (frame->buffer) = GST_CLOCK_TIME_NONE; + } else { + GST_BUFFER_PTS (frame->buffer) = self->super_frame_pts; + GST_BUFFER_DURATION (frame->buffer) = self->super_frame_duration; + } + GST_BUFFER_DTS (frame->buffer) = self->super_frame_dts; + + return GST_FLOW_OK; +} + +static GstFlowReturn gst_vp9_parse_handle_frame (GstBaseParse * parse, GstBaseParseFrame * frame, gint * skipsize) { @@ -460,6 +507,10 @@ goto done; } + self->super_frame_pts = GST_BUFFER_PTS (buffer); + self->super_frame_dts = GST_BUFFER_DTS (buffer); + self->super_frame_duration = GST_BUFFER_DURATION (buffer); + for (i = 0; i < superframe_info.frames_in_superframe; i++) { guint32 frame_size; @@ -489,6 +540,7 @@ * Real data is either taken from input by baseclass or * a replacement output buffer is provided anyway. */ gst_vp9_parse_parse_frame (self, &subframe, &frame_hdr); + ret = gst_base_parse_finish_frame (parse, &subframe, frame_size); } else { /* FIXME: need to parse all frames belong to this superframe? */ @@ -498,6 +550,8 @@ offset += frame_size; } + gst_vp9_parse_reset_super_frame (self); + done: gst_buffer_unmap (buffer, &map); @@ -632,23 +686,18 @@ } } - if (self->color_space != GST_VP9_CS_SRGB) { - if (self->parser->subsampling_x == 1 && self->parser->subsampling_y == 1) - chroma_format = "4:2:0"; - else if (self->parser->subsampling_x == 1 && - self->parser->subsampling_y == 0) - chroma_format = "4:2:2"; - else if (self->parser->subsampling_x == 0 && - self->parser->subsampling_y == 1) - chroma_format = "4:4:0"; - else if (self->parser->subsampling_x == 0 && - self->parser->subsampling_y == 0) - chroma_format = "4:4:4"; + if (self->parser->subsampling_x == 1 && self->parser->subsampling_y == 1) + chroma_format = "4:2:0"; + else if (self->parser->subsampling_x == 1 && self->parser->subsampling_y == 0) + chroma_format = "4:2:2"; + else if (self->parser->subsampling_x == 0 && self->parser->subsampling_y == 1) + chroma_format = "4:4:0"; + else if (self->parser->subsampling_x == 0 && self->parser->subsampling_y == 0) + chroma_format = "4:4:4"; - if (chroma_format) - gst_caps_set_simple (final_caps, - "chroma-format", G_TYPE_STRING, chroma_format, NULL); - } + if (chroma_format) + gst_caps_set_simple (final_caps, + "chroma-format", G_TYPE_STRING, chroma_format, NULL); switch (self->bit_depth) { case GST_VP9_BIT_DEPTH_8: @@ -718,7 +767,7 @@ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); if (self->align == GST_VP9_PARSE_ALIGN_FRAME) { - if (!frame_hdr->show_frame) + if (!frame_hdr->show_frame && !frame_hdr->show_existing_frame) GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DECODE_ONLY); else GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DECODE_ONLY); @@ -770,8 +819,12 @@ /* if all of decoder's capability related values are provided * by upstream, update src caps now */ - if (self->width > 0 && self->height > 0 && profile) + if (self->width > 0 && self->height > 0 && profile && + /* Other profiles defines multiple bitdepth/subsampling + * Delaying src caps update for non profile-0 streams */ + self->profile == GST_VP9_PROFILE_0) { gst_vp9_parse_update_src_caps (self, in_caps); + } gst_caps_unref (in_caps);
View file
gst-plugins-bad-1.20.5.tar.xz/gst/videoparsers/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/videoparsers/meson.build
Changed
@@ -25,5 +25,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstvideoparsersbad, install_dir : plugins_pkgconfig_install_dir) plugins += gstvideoparsersbad
View file
gst-plugins-bad-1.20.5.tar.xz/gst/videosignal/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/videosignal/meson.build
Changed
@@ -13,5 +13,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstvideosignal, install_dir : plugins_pkgconfig_install_dir) plugins += gstvideosignal
View file
gst-plugins-bad-1.20.5.tar.xz/gst/vmnc/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/vmnc/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstvmnc, install_dir : plugins_pkgconfig_install_dir) plugins += gstvmnc
View file
gst-plugins-bad-1.20.5.tar.xz/gst/y4m/meson.build -> gst-plugins-bad-1.22.0.tar.xz/gst/y4m/meson.build
Changed
@@ -10,5 +10,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gsty4mdec, install_dir : plugins_pkgconfig_install_dir) plugins += gsty4mdec
View file
gst-plugins-bad-1.20.5.tar.xz/meson.build -> gst-plugins-bad-1.22.0.tar.xz/meson.build
Changed
@@ -1,6 +1,6 @@ project('gst-plugins-bad', 'c', 'cpp', - version : '1.20.5', - meson_version : '>= 0.59', + version : '1.22.0', + meson_version : '>= 0.62', default_options : 'warning_level=1', 'buildtype=debugoptimized' ) @@ -17,7 +17,7 @@ gst_version_is_stable = gst_version_minor.is_even() gst_version_is_dev = gst_version_minor.is_odd() and gst_version_micro < 90 -glib_req = '>= 2.56.0' +glib_req = '>= 2.62.0' orc_req = '>= 0.4.17' if gst_version_is_stable @@ -37,7 +37,7 @@ plugins_install_dir = join_paths(get_option('libdir'), 'gstreamer-1.0') static_build = get_option('default_library') == 'static' plugins = -libraries = +gst_libraries = cc = meson.get_compiler('c') cxx = meson.get_compiler('cpp') @@ -52,6 +52,7 @@ endif cdata = configuration_data() +cdata.set('ENABLE_NLS', 1) if cc.get_id() == 'msvc' msvc_args = @@ -63,13 +64,29 @@ '/wd4146', # unary minus on unsigned (beware INT_MIN) '/wd4244', # lossy type conversion (e.g. double -> int) '/wd4305', # truncating type conversion (e.g. double -> float) + '/wd5051', # attribute 'attribute-name' requires at least 'standard-level'; ignored cc.get_supported_arguments('/utf-8'), # set the input encoding to utf-8 - - # Enable some warnings on MSVC to match GCC/Clang behaviour - '/w14062', # enumerator 'identifier' in switch of enum 'enumeration' is not handled - '/w14101', # 'identifier' : unreferenced local variable - '/w14189', # 'identifier' : local variable is initialized but not referenced + + if gst_version_is_dev + # Enable some warnings on MSVC to match GCC/Clang behaviour + msvc_args += cc.get_supported_arguments( + '/we4002', # too many actual parameters for macro 'identifier' + '/we4003', # not enough actual parameters for macro 'identifier' + '/we4013', # 'function' undefined; assuming extern returning int + '/we4020', # 'function' : too many actual parameters + '/we4027', # function declared without formal parameter list + '/we4029', # declared formal parameter list different from definition + '/we4033', # 'function' must return a value + '/we4045', # 'array' : array bounds overflow + '/we4047', # 'operator' : 'identifier1' differs in levels of indirection from 'identifier2' + '/we4053', # one void operand for '?:' + '/we4062', # enumerator 'identifier' in switch of enum 'enumeration' is not handled + '/we4098', # 'function' : void function returning a value + '/we4101', # 'identifier' : unreferenced local variable + '/we4189', # 'identifier' : local variable is initialized but not referenced + ) + endif add_project_arguments(msvc_args, language: 'c', 'cpp') # Disable SAFESEH with MSVC for plugins and libs that use external deps that # are built with MinGW @@ -86,23 +103,24 @@ add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'c') endif +# glib doesn't support unloading, which means that unloading and reloading +# any library that registers static types will fail +if cc.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'c') +endif +if cxx.has_link_argument('-Wl,-z,nodelete') + add_project_link_arguments('-Wl,-z,nodelete', language: 'cpp') +endif + # Symbol visibility -if cc.get_id() == 'msvc' - export_define = '__declspec(dllexport) extern' -elif cc.has_argument('-fvisibility=hidden') +if cc.has_argument('-fvisibility=hidden') add_project_arguments('-fvisibility=hidden', language: 'c') add_project_arguments('-fvisibility=hidden', language: 'cpp') if have_objc add_project_arguments('-fvisibility=hidden', language: 'objc') endif - export_define = 'extern __attribute__ ((visibility ("default")))' -else - export_define = 'extern' endif -# Passing this through the command line would be too messy -cdata.set('GST_API_EXPORT', export_define) - # Disable strict aliasing if cc.has_argument('-fno-strict-aliasing') add_project_arguments('-fno-strict-aliasing', language: 'c') @@ -365,9 +383,8 @@ endif libm = cc.find_library('m', required : false) -glib_dep = dependency('glib-2.0', version : glib_req, fallback: 'glib', 'libglib_dep') -gmodule_dep = dependency('gmodule-2.0', fallback: 'glib', 'libgmodule_dep') -gio_dep = dependency('gio-2.0', fallback: 'glib', 'libgio_dep') +gio_dep = dependency('gio-2.0', version: glib_req) +gmodule_dep = dependency('gmodule-no-export-2.0') # gio-unix-2.0 is used by sys/bluez # Optional dep of ext/gl and gst/librfb @@ -392,6 +409,23 @@ if host_machine.system() == 'windows' winsock2 = cc.find_library('ws2_32') + + building_for_win7 = cc.compiles('''#include <windows.h> + #ifndef WINVER + #error "unknown minimum supported OS version" + #endif + #if (WINVER < _WIN32_WINNT_WIN7) + #error "Windows 7 API is not guaranteed" + #endif + ''', + name: 'building for Windows 7') + + if not building_for_win7 + add_project_arguments( + '-D_WIN32_WINNT=_WIN32_WINNT_WIN7', + '-DWINVER=_WIN32_WINNT_WIN7', + , language: 'c', 'cpp') + endif else winsock2 = endif @@ -491,7 +525,6 @@ 'toolsdir=${exec_prefix}/bin', 'pluginsdir=${libdir}/gstreamer-1.0', 'datarootdir=${prefix}/share', - 'datadir=${datarootdir}', 'girdir=${datadir}/gir-1.0', 'typelibdir=${libdir}/girepository-1.0' @@ -540,7 +573,6 @@ # xgettext is optional (on Windows for instance) if find_program('xgettext', required : get_option('nls')).found() - cdata.set('ENABLE_NLS', 1) subdir('po') endif @@ -555,16 +587,23 @@ message('Package release date: ' + release_date) endif -if glib_dep.version().version_compare('< 2.67.4') +if gio_dep.version().version_compare('< 2.67.4') cdata.set('g_memdup2(ptr,sz)', '(G_LIKELY(((guint64)(sz)) < G_MAXUINT)) ? g_memdup(ptr,sz) : (g_abort(),NULL)') endif configure_file(output : 'config.h', configuration : cdata) +meson.add_dist_script('scripts/gen-changelog.py', meson.project_name(), '1.20.0', meson.project_version()) + subdir('docs') plugin_names = +gst_plugins = foreach plugin: plugins + pkgconfig.generate(plugin, install_dir: plugins_pkgconfig_install_dir) + dep = declare_dependency(link_with: plugin, variables: {'full_path': plugin.full_path()}) + meson.override_dependency(plugin.name(), dep) + gst_plugins += dep if plugin.name().startswith('gst') plugin_names += plugin.name().substring(3) else
View file
gst-plugins-bad-1.20.5.tar.xz/meson_options.txt -> gst-plugins-bad-1.22.0.tar.xz/meson_options.txt
Changed
@@ -16,6 +16,7 @@ option('bayer', type : 'feature', value : 'auto') option('camerabin2', type : 'feature', value : 'auto') option('codecalpha', type : 'feature', value : 'auto') +option('codectimestamper', type : 'feature', value : 'auto') option('coloreffects', type : 'feature', value : 'auto') option('debugutils', type : 'feature', value : 'auto') option('dvbsubenc', type : 'feature', value : 'auto') @@ -79,6 +80,7 @@ option('aes', type : 'feature', value : 'auto', description : 'AES encryption/decryption plugin') option('aom', type : 'feature', value : 'auto', description : 'AOM AV1 video codec plugin') option('avtp', type : 'feature', value : 'auto', description : 'Audio/Video Transport Protocol (AVTP) plugin') +option('amfcodec', type : 'feature', value : 'auto', description : 'AMD AMF codec plugin') option('androidmedia', type : 'feature', value : 'auto', description : 'Video capture and codec plugins for Android') option('applemedia', type : 'feature', value : 'auto', description : 'Video capture and codec access plugins for macOS and iOS') option('asio', type : 'feature', value : 'auto', description : 'Steinberg Audio Streaming Input Output (ASIO) plugin') @@ -99,6 +101,7 @@ option('decklink', type : 'feature', value : 'auto', description : 'DeckLink audio/video source/sink plugin') option('directfb', type : 'feature', value : 'auto', description : 'DirectFB video sink plugin') option('directsound', type : 'feature', value : 'auto', description : 'Directsound audio source plugin') +option('directshow', type : 'feature', value : 'auto', description : 'Directshow audio/video plugins') option('dtls', type : 'feature', value : 'auto', description : 'DTLS encoder and decoder plugin') option('dts', type : 'feature', value : 'auto', description : 'DTS audio decoder plugin (GPL - only built if gpl option is also enabled!)') option('dvb', type : 'feature', value : 'auto', description : 'DVB video bin and source plugin') @@ -112,6 +115,7 @@ option('gme', type : 'feature', value : 'auto', description : 'libgme gaming console music file decoder plugin') option('gs', type : 'feature', value : 'auto', description : 'Google Cloud Storage source and sink plugin') option('gsm', type : 'feature', value : 'auto', description : 'GSM encoder/decoder plugin') +option('gtk3', type : 'feature', value : 'auto', description : 'GTK+ video sink plugin') option('ipcpipeline', type : 'feature', value : 'auto', description : 'Inter-process communication plugin') option('iqa', type : 'feature', value : 'auto', description : 'Image quality assessment plugin (AGPL - only built if gpl option is also enabled!)') option('kate', type : 'feature', value : 'auto', description : 'Kate subtitle parser, tagger, and codec plugin') @@ -140,6 +144,7 @@ option('opensles', type : 'feature', value : 'auto', description : 'OpenSL ES audio source/sink plugin') option('opus', type : 'feature', value : 'auto', description : 'OPUS audio parser plugin') option('qroverlay', type : 'feature', value : 'auto', description : 'Element to set random data on a qroverlay') +option('qsv', type : 'feature', value : 'auto', description : 'Intel Quick Sync Video plugin') option('resindvd', type : 'feature', value : 'auto', description : 'Resin DVD playback plugin (GPL - only built if gpl option is also enabled!)') option('rsvg', type : 'feature', value : 'auto', description : 'SVG overlayer and image decoder plugin') option('rtmp', type : 'feature', value : 'auto', description : 'RTMP video network source and sink plugin') @@ -168,6 +173,8 @@ option('webrtc', type : 'feature', value : 'auto', description : 'WebRTC audio/video network bin plugin') option('webrtcdsp', type : 'feature', value : 'auto', description : 'Plugin with various audio filters provided by the WebRTC audio processing library') option('wildmidi', type : 'feature', value : 'auto', description : 'WildMidi midi soft synth plugin') +option('wic', type : 'feature', value : 'auto', description : 'Windows Imaging Component plugin') +option('win32ipc', type : 'feature', value : 'auto', description : 'Windows IPC plugin') option('winks', type : 'feature', value : 'auto', description : 'Windows Kernel Streaming video source plugin') option('winscreencap', type : 'feature', value : 'auto', description : 'Windows Screen Capture video source plugin') option('x265', type : 'feature', value : 'auto', description : 'HEVC/H.265 video encoder plugin (GPL - only built if gpl option is also enabled!)') @@ -191,6 +198,10 @@ option('mfx_api', type : 'combo', choices : 'MSDK', 'oneVPL', 'auto', value : 'auto', description : 'Select MFX API to build against') +# QSV plugin options +option('mfx-modules-dir', type: 'string', value : '', + description : 'libmfx runtime module dir, linux only') + # License-related feature options option('gpl', type: 'feature', value: 'disabled', yield: true, description: 'Allow build plugins that have (A)GPL-licensed dependencies')
View file
gst-plugins-bad-1.20.5.tar.xz/po/LINGUAS -> gst-plugins-bad-1.22.0.tar.xz/po/LINGUAS
Changed
@@ -1,1 +1,1 @@ -af ast az bg ca cs da de el en_GB eo es eu fi fr fur gl hr hu id it ja ky lt lv mt nb nl or pl pt_BR ro ru sk sl sq sr sv tr uk vi zh_CN zh_TW +af ast az bg ca cs da de el en_GB eo es eu fi fr fur gl hr hu id it ja ka ky lt lv mt nb nl or pl pt_BR ro ru sk sl sq sr sv tr uk vi zh_CN zh_TW
View file
gst-plugins-bad-1.20.5.tar.xz/po/POTFILES.skip -> gst-plugins-bad-1.22.0.tar.xz/po/POTFILES.skip
Changed
@@ -7,4 +7,4 @@ tests/examples/uvch264/int_property.glade tests/examples/uvch264/window.glade tests/examples/waylandsink/window.ui -tests/icles/metadata_editor.ui +tests/interactive/metadata_editor.ui
View file
gst-plugins-bad-1.20.5.tar.xz/po/es.po -> gst-plugins-bad-1.22.0.tar.xz/po/es.po
Changed
@@ -1,16 +1,17 @@ -# translation of gst-plugins-bad-0.10.21.2.po to Español +# translation of gst-plugins-bad-1.19.2.po to Español # spanish translation for gst-plugins-bad # This file is put in the public domain. # Jorge González <jorgegonz@svn.gnome.org>, 2007, 2008, 2009, 2011. +# Cristian Othón Martínez Vera <cfuga@cfuga.mx>, 2022. # msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad 0.10.21.2\n" +"Project-Id-Version: gst-plugins-bad 1.19.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-25 01:02+0100\n" -"PO-Revision-Date: 2011-10-02 15:47+0200\n" -"Last-Translator: Jorge González González <aloriel@gmail.com>\n" -"Language-Team: Spanish <es@li.org>\n" +"POT-Creation-Date: 2023-01-11 15:41+0000\n" +"PO-Revision-Date: 2022-03-07 13:53-0600\n" +"Last-Translator: Cristian Othón Martínez Vera <cfuga@cfuga.mx>\n" +"Language-Team: Spanish <es@tp.org.es>\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,10 +20,10 @@ "Plural-Forms: nplurals=2; plural=(n!=1);\n" msgid "No URL set." -msgstr "" +msgstr "No se definió un URL." msgid "OpenCV failed to load template image" -msgstr "" +msgstr "Falló OpenCV al cargar la imagen de plantilla" msgid "Could not read title information for DVD." msgstr "No se pudo leer la información del título para el DVD." @@ -45,34 +46,37 @@ msgstr "No se pudo leer el DVD." msgid "This file contains no playable streams." -msgstr "" +msgstr "Este archivo no continen flujos reproducibles." -#, fuzzy msgid "Could not open sndfile stream for reading." -msgstr "No se pudo abrir el archivo «%s» para leer." +msgstr "No se pudo abrir el flujo sndfile para leer." msgid "Generated file has a larger preroll time than its streams duration" msgstr "" +"El archivo generado tiene un tiempo de preenrollado más grande que la " +"duración de sus flujos" #, c-format msgid "Missing element '%s' - check your GStreamer installation." -msgstr "" +msgstr "Falta el elemento '%s' - verifique su instalación de GStreamer." msgid "File location is set to NULL, please set it to a valid filename" msgstr "" +"La ubicación del archivo se configuró a NULL, por favor cámbiela por un " +"nombre de archivo válido" msgid "Digitalzoom element couldn't be created" -msgstr "" +msgstr "No se pudo crear el elemento Digitalzoom" msgid "Subpicture format was not configured before data flow" -msgstr "" +msgstr "El formato de subimagen no se configuró antes del flujo de datos" msgid "Failed to get fragment URL." -msgstr "" +msgstr "No se pudo obtener el URL del fragmento." #, c-format msgid "Couldn't download fragments" -msgstr "" +msgstr "No se pudo descargar los fragmentos" msgid "Internal data stream error." msgstr "Error en el flujo de datos interno." @@ -89,56 +93,201 @@ msgid "Could not get settings from frontend device \"%s\"." msgstr "No se pudieron obtener los ajustes del dispositivo frontend «%s»." -#, fuzzy, c-format +#, c-format msgid "Cannot enumerate delivery systems from frontend device \"%s\"." -msgstr "No se pudieron obtener los ajustes del dispositivo frontend «%s»." +msgstr "" +"No se pudieron enumerar los sistemas de entrega del dispositivo frontend " +"«%s»." #, c-format msgid "Could not open file \"%s\" for reading." msgstr "No se pudo abrir el archivo «%s» para leer." -#, fuzzy, c-format +#, c-format msgid "Couldn't find channel configuration file" -msgstr "Configuración del canal del mezclador virtual" +msgstr "No se encontró el archivo de configuración del canal" -#, fuzzy, c-format +#, c-format msgid "Couldn't load channel configuration file: '%s'" -msgstr "Configuración del canal del mezclador virtual" +msgstr "No se pudo cargar el archivo de configuración del canal: '%s'" #, c-format msgid "Couldn't find details for channel '%s'" -msgstr "" +msgstr "No se pudo encontrar detalles para el canal '%s'" #, c-format msgid "No properties for channel '%s'" -msgstr "" +msgstr "No hay propiedades para el canal '%s'" -#, fuzzy, c-format +#, c-format msgid "Failed to set properties for channel '%s'" -msgstr "Falló abrir el dispositivo DVD «%s»." +msgstr "Falló al establecer propiedades para el canal «%s»." -#, fuzzy, c-format +#, c-format msgid "Couldn't find channel configuration file: '%s'" -msgstr "Configuración del canal del mezclador virtual" +msgstr "No se encontró el archivo de configuración del canal: '%s'" #, c-format msgid "Channel configuration file doesn't contain any channels" -msgstr "" +msgstr "El archivo de configuración del canal no contiene ningún canal" + +#~ msgid "failed to draw pattern" +#~ msgstr "falló al dibujar el patrón" + +#~ msgid "A GL error occured" +#~ msgstr "Ocurrió un error de GL" + +#~ msgid "format wasn't negotiated before get function" +#~ msgstr "No se negoció el formato antes de la función de obtener" + +#~ msgid "Could not establish connection to sndio" +#~ msgstr "No se pudo establecer la conexión a sndio" + +#~ msgid "Failed to query sndio capabilities" +#~ msgstr "Falló al consultar las capacidades de sndio" + +#~ msgid "Could not configure sndio" +#~ msgstr "No se pudo configurar sndio" + +#~ msgid "Could not start sndio" +#~ msgstr "No se pudo iniciar sndio" #~ msgid "No file name specified for writing." #~ msgstr "No se especificó un nombre de archivo para su escritura." -#, c-format +#~ msgid "" +#~ "Given file name \"%s\" can't be converted to local file name encoding." +#~ msgstr "" +#~ "El nombre de archivo dado \"%s\" no se puede cambiar a la codificación " +#~ "local de nombre de archivo." + #~ msgid "Could not open file \"%s\" for writing." #~ msgstr "No se pudo abrir el archivo «%s» para escribir." -#, c-format -#~ msgid "Could not write to file \"%s\"." -#~ msgstr "No se pudo escribir en el archivo «%s»." - #~ msgid "Internal data flow error." #~ msgstr "Error en el flujo de datos interno." +#~ msgid "default GStreamer sound events audiosink" +#~ msgstr "sumidero de eventos de sonido GStreamer por defecto" + +#~ msgid "" +#~ "GStreamer can play audio using any number of output elements. Some " +#~ "possible choices are osssink, pulsesink and alsasink. The audiosink can " +#~ "be a partial pipeline instead of just one element." +#~ msgstr "" +#~ "Gstreamer puede reproducir audio usando cualquier número de elementos de " +#~ "salida. Algunas opciones posibles son osssink, pulsesink y alsasink. El " +#~ "sumidero de audio puede ser un conducto parcial en lugar de un solo " +#~ "elemento." + +#~ msgid "description for default GStreamer sound events audiosink" +#~ msgstr "" +#~ "descripción para el sumidero de audio de eventos de sonido GStreamer por " +#~ "defecto" + +#~ msgid "Describes the selected audiosink element." +#~ msgstr "Describe el elemento de sumidero de audio seleccionado." + +#~ msgid "default GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "" +#~ "sumidero de audio GStreamer por defecto para Conferencia Audio/Video" + +#~ msgid "" +#~ "description for default GStreamer audiosink for Audio/Video Conferencing" +#~ msgstr "" +#~ "descripción para el sumidero de audio GStreamer por defecto para " +#~ "Conferencia de Audio/Video" + +#~ msgid "default GStreamer audiosink for Music and Movies" +#~ msgstr "sumidero de audio GStreamer por defecto para Música y Películas" + +#~ msgid "description for default GStreamer audiosink for Music and Movies" +#~ msgstr "" +#~ "descripción para el sumidero de audio GStreamer por defecto para Música y " +#~ "Películas" + +#~ msgid "default GStreamer videosink" +#~ msgstr "sumidero de video GStreamer por defecto" + +#~ msgid "" +#~ "GStreamer can play video using any number of output elements. Some " +#~ "possible choices are xvimagesink, ximagesink, sdlvideosink and aasink. " +#~ "The videosink can be a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer puede reproducir video usando cualquier número de elementos de " +#~ "salida. Algunas opciones posibles son xvimagesink, ximagesink, " +#~ "sdlvideosink y aasink. El sumidero de video puede ser un conducto parcial " +#~ "en lugar de un solo elemento." + +#~ msgid "description for default GStreamer videosink" +#~ msgstr "descripción para el sumidero de video GStreamer por defecto" + +#~ msgid "Describes the selected videosink element." +#~ msgstr "Describe el elemento de sumidero de video seleccionado." + +#~ msgid "default GStreamer audiosrc" +#~ msgstr "fuente de audio GStreamer por defecto" + +#~ msgid "" +#~ "GStreamer can record audio using any number of input elements. Some " +#~ "possible choices are osssrc, pulsesrc and alsasrc. The audio source can " +#~ "be a partial pipeline instead of just one element." +#~ msgstr "" +#~ "Gstreamer puede grabar audio usando cualquier número de elementos de " +#~ "entrada. Algunas opciones posibles son osssrc, pulsesrc y alsasrc. La " +#~ "fuente de audio puede ser un conducto parcial en lugar de un solo " +#~ "elemento." + +#~ msgid "description for default GStreamer audiosrc" +#~ msgstr "descripción para la fuente de audio GStreamer por defecto" + +#~ msgid "Describes the selected audiosrc element." +#~ msgstr "Describe el elemento de audio de entrada seleccionado." + +#~ msgid "default GStreamer videosrc" +#~ msgstr "fuente de video GStreamer por defecto" + +#~ msgid "" +#~ "GStreamer can record video from any number of input elements. Some " +#~ "possible choices are v4lsrc, v4l2src and videotestsrc. The video source " +#~ "can be a partial pipeline instead of just one element." +#~ msgstr "" +#~ "GStreamer puede grabar video de cualquier número de elementos de entrada. " +#~ "Algunas opciones posible son v4lsrc, v4l2src y videotestsrc. La fuente de " +#~ "video puede ser un conducto parcial en lugar de un solo elemento." + +#~ msgid "description for default GStreamer videosrc" +#~ msgstr "descripción para la fuente de video GStreamer por defecto" + +#~ msgid "Describes the selected videosrc element." +#~ msgstr "Describe el elemento de fuente de video seleccionado." + +#~ msgid "default GStreamer visualization" +#~ msgstr "visualización GStreamer por defecto" + +#~ msgid "" +#~ "GStreamer can put visualization plugins in a pipeline to transform audio " +#~ "streams in video frames. Some possible choices are goom, goom2k1 and " +#~ "synaesthesia. The visualization plugin can be a partial pipeline instead " +#~ "of just one element." +#~ msgstr "" +#~ "GStreamer puede poner plugins de visualización en un conducto para " +#~ "transformar los flujos de audio en fotogramas de video. Algunas opciones " +#~ "posibles son goom, goom2k1 y synaesthesia. El plugin de visualización " +#~ "puede ser un conducto parcial en lugar de un solo elemento." + +#~ msgid "description for default GStreamer visualization" +#~ msgstr "descripción para la visualización GStreamer por defecto" + +#~ msgid "Describes the selected visualization element." +#~ msgstr "Describe el elemento de visualización seleccionado." + +#~ msgid "Couldn't get the Manifest's URI" +#~ msgstr "No se pudo obtener el URI del manifesto" + +#~ msgid "Could not write to file \"%s\"." +#~ msgstr "No se pudo escribir en el archivo «%s»." + #~ msgid "Internal clock error." #~ msgstr "Error en el reloj interno."
View file
gst-plugins-bad-1.20.5.tar.xz/po/gst-plugins-bad-1.0.pot -> gst-plugins-bad-1.22.0.tar.xz/po/gst-plugins-bad-1.0.pot
Changed
@@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad-1.0\n" +"Project-Id-Version: gst-plugins-bad-1.22.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-12-19 23:38+0000\n" +"POT-Creation-Date: 2023-01-23 19:35+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -71,7 +71,7 @@ msgid "File location is set to NULL, please set it to a valid filename" msgstr "" -#: gst/camerabin2/gstwrappercamerabinsrc.c:587 +#: gst/camerabin2/gstwrappercamerabinsrc.c:583 msgid "Digitalzoom element couldn't be created" msgstr "" @@ -89,7 +89,7 @@ msgstr "" #: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:4102 -#: gst/mpegtsdemux/mpegtsbase.c:1761 +#: gst/mpegtsdemux/mpegtsbase.c:1756 msgid "Internal data stream error." msgstr "" @@ -118,37 +118,37 @@ msgid "Could not open file \"%s\" for reading." msgstr "" -#: sys/dvb/parsechannels.c:410 +#: sys/dvb/parsechannels.c:416 #, c-format msgid "Couldn't find channel configuration file" msgstr "" -#: sys/dvb/parsechannels.c:413 sys/dvb/parsechannels.c:563 +#: sys/dvb/parsechannels.c:419 sys/dvb/parsechannels.c:569 #, c-format msgid "Couldn't load channel configuration file: '%s'" msgstr "" -#: sys/dvb/parsechannels.c:421 sys/dvb/parsechannels.c:846 +#: sys/dvb/parsechannels.c:427 sys/dvb/parsechannels.c:852 #, c-format msgid "Couldn't find details for channel '%s'" msgstr "" -#: sys/dvb/parsechannels.c:430 +#: sys/dvb/parsechannels.c:436 #, c-format msgid "No properties for channel '%s'" msgstr "" -#: sys/dvb/parsechannels.c:439 +#: sys/dvb/parsechannels.c:445 #, c-format msgid "Failed to set properties for channel '%s'" msgstr "" -#: sys/dvb/parsechannels.c:560 +#: sys/dvb/parsechannels.c:566 #, c-format msgid "Couldn't find channel configuration file: '%s'" msgstr "" -#: sys/dvb/parsechannels.c:570 +#: sys/dvb/parsechannels.c:576 #, c-format msgid "Channel configuration file doesn't contain any channels" msgstr ""
View file
gst-plugins-bad-1.22.0.tar.xz/po/gst-plugins-bad.pot
Added
@@ -0,0 +1,154 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gst-plugins-bad-1.0 package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-bad-1.22.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-23 19:35+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ext/curl/gstcurlhttpsrc.c:1439 +msgid "No URL set." +msgstr "" + +#: ext/opencv/gsttemplatematch.cpp:189 +msgid "OpenCV failed to load template image" +msgstr "" + +#: ext/resindvd/resindvdsrc.c:361 +msgid "Could not read title information for DVD." +msgstr "" + +#: ext/resindvd/resindvdsrc.c:367 +#, c-format +msgid "Failed to open DVD device '%s'." +msgstr "" + +#: ext/resindvd/resindvdsrc.c:373 +msgid "Failed to set PGC based seeking." +msgstr "" + +#: ext/resindvd/resindvdsrc.c:1164 +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" + +#: ext/resindvd/resindvdsrc.c:1169 ext/resindvd/resindvdsrc.c:1178 +msgid "Could not read DVD." +msgstr "" + +#: ext/smoothstreaming/gstmssdemux.c:430 +#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:735 +msgid "This file contains no playable streams." +msgstr "" + +#: ext/sndfile/gstsfdec.c:771 +msgid "Could not open sndfile stream for reading." +msgstr "" + +#: gst/asfmux/gstasfmux.c:1834 +msgid "Generated file has a larger preroll time than its streams duration" +msgstr "" + +#: gst/camerabin2/camerabingeneral.c:167 gst/camerabin2/gstcamerabin2.c:1866 +#: gst/camerabin2/gstdigitalzoom.c:283 gst/camerabin2/gstviewfinderbin.c:275 +#, c-format +msgid "Missing element '%s' - check your GStreamer installation." +msgstr "" + +#: gst/camerabin2/gstcamerabin2.c:352 +msgid "File location is set to NULL, please set it to a valid filename" +msgstr "" + +#: gst/camerabin2/gstwrappercamerabinsrc.c:583 +msgid "Digitalzoom element couldn't be created" +msgstr "" + +#: gst/dvdspu/gstdvdspu.c:1044 +msgid "Subpicture format was not configured before data flow" +msgstr "" + +#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:3626 +msgid "Failed to get fragment URL." +msgstr "" + +#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:4013 +#, c-format +msgid "Couldn't download fragments" +msgstr "" + +#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:4102 +#: gst/mpegtsdemux/mpegtsbase.c:1756 +msgid "Internal data stream error." +msgstr "" + +#: sys/dvb/gstdvbsrc.c:1597 sys/dvb/gstdvbsrc.c:1811 +#, c-format +msgid "Device \"%s\" does not exist." +msgstr "" + +#: sys/dvb/gstdvbsrc.c:1601 +#, c-format +msgid "Could not open frontend device \"%s\"." +msgstr "" + +#: sys/dvb/gstdvbsrc.c:1620 +#, c-format +msgid "Could not get settings from frontend device \"%s\"." +msgstr "" + +#: sys/dvb/gstdvbsrc.c:1637 +#, c-format +msgid "Cannot enumerate delivery systems from frontend device \"%s\"." +msgstr "" + +#: sys/dvb/gstdvbsrc.c:1815 +#, c-format +msgid "Could not open file \"%s\" for reading." +msgstr "" + +#: sys/dvb/parsechannels.c:416 +#, c-format +msgid "Couldn't find channel configuration file" +msgstr "" + +#: sys/dvb/parsechannels.c:419 sys/dvb/parsechannels.c:569 +#, c-format +msgid "Couldn't load channel configuration file: '%s'" +msgstr "" + +#: sys/dvb/parsechannels.c:427 sys/dvb/parsechannels.c:852 +#, c-format +msgid "Couldn't find details for channel '%s'" +msgstr "" + +#: sys/dvb/parsechannels.c:436 +#, c-format +msgid "No properties for channel '%s'" +msgstr "" + +#: sys/dvb/parsechannels.c:445 +#, c-format +msgid "Failed to set properties for channel '%s'" +msgstr "" + +#: sys/dvb/parsechannels.c:566 +#, c-format +msgid "Couldn't find channel configuration file: '%s'" +msgstr "" + +#: sys/dvb/parsechannels.c:576 +#, c-format +msgid "Channel configuration file doesn't contain any channels" +msgstr ""
View file
gst-plugins-bad-1.20.5.tar.xz/po/hr.po -> gst-plugins-bad-1.22.0.tar.xz/po/hr.po
Changed
@@ -4,13 +4,13 @@ # This file is distributed under the same license as the gst-plugins-bad package. # # Tomislav Krznar <tomislav.krznar@gmail.com>, 2012. -# Božidar Putanec <bozidarp@yahoo.com>, 2016, 2018, 2019. +# Božidar Putanec <bozidarp@yahoo.com>, 2016, 2018, 2019, 2021, 2022. msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad-1.15.1\n" +"Project-Id-Version: gst-plugins-bad-1.21.90\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-25 01:02+0100\n" -"PO-Revision-Date: 2019-02-03 13:38-0800\n" +"POT-Creation-Date: 2023-01-23 16:28+0000\n" +"PO-Revision-Date: 2023-01-15 19:31-0800\n" "Last-Translator: Božidar Putanec <bozidarp@yahoo.com>\n" "Language-Team: Croatian <lokalizacija@linux.hr>\n" "Language: hr\n" @@ -18,9 +18,9 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 2.2.1\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 3.0\n" msgid "No URL set." msgstr "Nema URL-adrese (nije postavljena)." @@ -53,7 +53,7 @@ msgstr "Ova datoteka ne sadrži upotrebljive protoke." msgid "Could not open sndfile stream for reading." -msgstr "Nije moguće otvoriti protok sndfile za čitanje." +msgstr "Nije moguće otvoriti tok sndfile za čitanje." msgid "Generated file has a larger preroll time than its streams duration" msgstr ""
View file
gst-plugins-bad-1.22.0.tar.xz/po/ka.po
Added
@@ -0,0 +1,128 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2022 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gst-plugins-bad package. +# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: gst-plugins-bad-1.19.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-11 15:41+0000\n" +"PO-Revision-Date: 2022-04-30 09:47+0200\n" +"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n" +"Language-Team: Georgian <(nothing)>\n" +"Language: ka\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.0.1\n" + +msgid "No URL set." +msgstr "URL დაყენებული არაა." + +msgid "OpenCV failed to load template image" +msgstr "OpenCV-ს შაბლონური გამოსახულების ჩატვირთვა არ შეუძლია" + +msgid "Could not read title information for DVD." +msgstr "DVD-ის სათაურის გახსნის შეცდომა." + +#, c-format +msgid "Failed to open DVD device '%s'." +msgstr "DVD მოწყობილობის გახსნის შეცდომა: '%s'." + +msgid "Failed to set PGC based seeking." +msgstr "GPC გადახვევის დაყენების შეცდომა." + +msgid "" +"Could not read DVD. This may be because the DVD is encrypted and a DVD " +"decryption library is not installed." +msgstr "" +"DVD- ს წაკითხვა ვერ მოხერხდა. შეიძლება DVD-ი დაშიფრულია და DVD-ის გაშიფვრის " +"ბიბლიოთეკა დაყენებული არაა." + +msgid "Could not read DVD." +msgstr "DVD-ის წაკითხვა ვერ მოხერხდა." + +msgid "This file contains no playable streams." +msgstr "ეს ფაილი დაკვრად ნაკადს არ შეიცავს." + +msgid "Could not open sndfile stream for reading." +msgstr "Sndfile-ის ნაკადის წასაკითხად გახნა შეუძლებელია." + +msgid "Generated file has a larger preroll time than its streams duration" +msgstr "" +"საბოლოო ფაილს პრეროლის უფრო გრძელი მონაკვეთი აქვს, ვიდრე თვითონ ნაკადის " +"ხანგრძლივობაა" + +#, c-format +msgid "Missing element '%s' - check your GStreamer installation." +msgstr "აკლია ელემენტი '%s' - შეამოწმეთ GStreamer-ის პარამეტრები." + +msgid "File location is set to NULL, please set it to a valid filename" +msgstr "ფაილის მდებარეობის სტრიქონი ცარიელია. შეავსეთ" + +msgid "Digitalzoom element couldn't be created" +msgstr "Digitalzoom-ის ელემენტის შექმნა შეუძლებელია" + +msgid "Subpicture format was not configured before data flow" +msgstr "ქვესურათის ფორმატი მონაცემების ნაკადამდე მითითებული არ იყო" + +msgid "Failed to get fragment URL." +msgstr "ფრაგმენტის ბმულის მიღების შეცდომა." + +#, c-format +msgid "Couldn't download fragments" +msgstr "ფრაგმენტების გადმოწერის შეცდომა" + +msgid "Internal data stream error." +msgstr "შიდა მონაცემების დინების შეცდომა." + +#, c-format +msgid "Device \"%s\" does not exist." +msgstr "მოწყობილობა \"%s\" არ არსებობს." + +#, c-format +msgid "Could not open frontend device \"%s\"." +msgstr "წინაბოლო მოწყობილობის (%s) გახსნა შეუძლებელია." + +#, c-format +msgid "Could not get settings from frontend device \"%s\"." +msgstr "წინაბოლო მოწყობილობიდან (%s) პარამეტრების მიღების შეცდომა." + +#, c-format +msgid "Cannot enumerate delivery systems from frontend device \"%s\"." +msgstr "წინაბოლო მოწყობილობიდან (%s) მოწოდებული სისტემების სიის შექმნა." + +#, c-format +msgid "Could not open file \"%s\" for reading." +msgstr "ფაილის წასაკითხად გახსნის შეცდომა: %s." + +#, c-format +msgid "Couldn't find channel configuration file" +msgstr "არხის კონფიგურაციის ფაილი არ არსებობს" + +#, c-format +msgid "Couldn't load channel configuration file: '%s'" +msgstr "არხის კონფიგურაციის ფაილი არ არსებობს: %s" + +#, c-format +msgid "Couldn't find details for channel '%s'" +msgstr "არხის დეტალების პოვნა შეუძლებელია: %s" + +#, c-format +msgid "No properties for channel '%s'" +msgstr "არხის თვისებების პოვნა შეუძლებელია: %s" + +#, c-format +msgid "Failed to set properties for channel '%s'" +msgstr "არხის თვისებების დაყენების შეცდომა: %s" + +#, c-format +msgid "Couldn't find channel configuration file: '%s'" +msgstr "არხის კონფიგურაციის ფაილი არ არსებობს: %s" + +#, c-format +msgid "Channel configuration file doesn't contain any channels" +msgstr "არხის კონფიგურაციის ფაილი არხებს არ შეიცავს"
View file
gst-plugins-bad-1.20.5.tar.xz/po/lt.po -> gst-plugins-bad-1.22.0.tar.xz/po/lt.po
Changed
@@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: gst-plugins-bad-0.10.6.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-25 01:02+0100\n" +"POT-Creation-Date: 2023-01-11 15:41+0000\n" "PO-Revision-Date: 2008-05-14 02:13+0300\n" "Last-Translator: Gintautas Miliauskas <gintas@akl.lt>\n" "Language-Team: Lithuanian <komp_lt@konferencijos.lt>\n" @@ -16,8 +16,8 @@ "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "X-Generator: KBabel 1.11.4\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" -"%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"(n%100<10 || n%100>=20) ? 1 : 2);\n" msgid "No URL set." msgstr ""
View file
gst-plugins-bad-1.20.5.tar.xz/po/nl.po -> gst-plugins-bad-1.22.0.tar.xz/po/nl.po
Changed
@@ -2,13 +2,13 @@ # Copyright (C) 2004, 2007, 2008, 2009 Free Software Foundation, Inc. # # This file is distributed under the same license as the gst-plugins-bad package. -# Freek de Kruijf <f.de.kruijf@gmail.com>, 2007, 2008, 2009, 2011, 2013, 2014, 2015, 2016, 2017. +# Freek de Kruijf <f.de.kruijf@gmail.com>, 2007, 2008, 2009, 2011, 2013, 2014, 2015, 2016, 2017, 2022. msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad 1.12.0\n" +"Project-Id-Version: gst-plugins-bad 1.19.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-25 01:02+0100\n" -"PO-Revision-Date: 2017-10-24 22:43+0100\n" +"POT-Creation-Date: 2023-01-11 15:41+0000\n" +"PO-Revision-Date: 2022-02-08 14:39+0100\n" "Last-Translator: Freek de Kruijf <f.de.kruijf@gmail.com>\n" "Language-Team: Dutch <vertaling@vrijschrift.org>\n" "Language: nl\n" @@ -16,11 +16,11 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" -"X-Generator: Lokalize 2.0\n" +"X-Generator: Lokalize 21.12.2\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" msgid "No URL set." -msgstr "" +msgstr "Geen URL ingesteld." msgid "OpenCV failed to load template image" msgstr "OpenCV kon sjabloonafbeelding niet laden"
View file
gst-plugins-bad-1.20.5.tar.xz/po/ro.po -> gst-plugins-bad-1.22.0.tar.xz/po/ro.po
Changed
@@ -1,19 +1,25 @@ # Romanian translation for gst-plugins-bad # This file is distributed under the same license as the gst-plugins-bad package. # -# Lucian Adrian Grijincu <lucian.grijincu@gmail.com>, 2010. +# Lucian Adrian Grijincu <lucian.grijincu@gmail.com>, 2010.. # Florentina Mușat <florentina.musat.28@gmail.com>, 2020. +# Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>. 2022 - 2023. +# +# Cronologia traducerii fișierului „gstreamer”: +# Traducerea inițială, făcută de LAG, pentru versiunea gstreamer +# Actualizare a traducerii pentru versiunea 1.16.0, făcută de FM, iun-2020. # Actualizare a mesajelor, de la fișierul „gst-plugins-bad-1.19.2.pot”. # Eliminare a mesajelor ce-au dispărut în ultima versiune. -# S-au efectuat mici corecții -# Actualizări realizate de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>, 2022. +# Actualizare a traducerii pentru versiunea 1.19.2, făcută de R-GC, ian-2022. +# Actualizare a traducerii pentru versiunea 1.21.90, făcută de R-GC, ian-2023 +# Actualizare a traducerii pentru versiunea Y, făcută de X, Z(anul). # msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad 1.19.2\n" +"Project-Id-Version: gst-plugins-bad 1.21.90\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-23 01:34+0100\n" -"PO-Revision-Date: 2022-01-17 11:49+0100\n" +"POT-Creation-Date: 2023-01-23 16:28+0000\n" +"PO-Revision-Date: 2023-01-15 22:09+0100\n" "Last-Translator: Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>\n" "Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n" "Language: ro\n" @@ -26,7 +32,7 @@ "X-Generator: Poedit 2.3.1\n" msgid "No URL set." -msgstr "Niciun URL stabilit." +msgstr "Nicio adresă URL definită." msgid "OpenCV failed to load template image" msgstr "OpenCV a eșuat să încarce imaginea șablon"
View file
gst-plugins-bad-1.20.5.tar.xz/po/ru.po -> gst-plugins-bad-1.22.0.tar.xz/po/ru.po
Changed
@@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: gst-plugins-bad 1.15.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-25 01:02+0100\n" +"POT-Creation-Date: 2023-01-11 15:41+0000\n" "PO-Revision-Date: 2019-02-02 09:10+0300\n" "Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n" "Language-Team: Russian <gnu@d07.ru>\n" @@ -18,8 +18,8 @@ "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "X-Generator: Lokalize 2.0\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" msgid "No URL set." msgstr "URL не задан."
View file
gst-plugins-bad-1.20.5.tar.xz/po/sk.po -> gst-plugins-bad-1.22.0.tar.xz/po/sk.po
Changed
@@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: gst-plugins-bad 1.15.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-25 01:02+0100\n" +"POT-Creation-Date: 2023-01-11 15:41+0000\n" "PO-Revision-Date: 2020-06-11 09:09+0200\n" "Last-Translator: Peter Tuhársky <tuharsky@misbb.sk>\n" "Language-Team: Slovak <sk-i18n@lists.linux.sk>\n" @@ -17,8 +17,8 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 2.2.1\n" msgid "No URL set."
View file
gst-plugins-bad-1.20.5.tar.xz/po/sl.po -> gst-plugins-bad-1.22.0.tar.xz/po/sl.po
Changed
@@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: gst-plugins-bad 0.10.21.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-25 01:02+0100\n" +"POT-Creation-Date: 2023-01-11 15:41+0000\n" "PO-Revision-Date: 2011-04-26 15:21+0100\n" "Last-Translator: Klemen Košir <klemen.kosir@gmx.com>\n" "Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\n" @@ -17,8 +17,8 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" -"%100==4 ? 3 : 0);\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || " +"n%100==4 ? 3 : 0);\n" "X-Poedit-Language: Slovenian\n" "X-Poedit-Country: SLOVENIA\n" "X-Poedit-SourceCharset: utf-8\n"
View file
gst-plugins-bad-1.20.5.tar.xz/po/sr.po -> gst-plugins-bad-1.22.0.tar.xz/po/sr.po
Changed
@@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: gst-plugins-bad-1.15.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-25 01:02+0100\n" +"POT-Creation-Date: 2023-01-11 15:41+0000\n" "PO-Revision-Date: 2020-04-01 13:24+0200\n" "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n" "Language-Team: Serbian <(nothing)>\n" @@ -15,8 +15,8 @@ "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Virtaal 0.7.1\n" "X-Bugs: Report translation errors to the Language-Team address.\n" "X-Project-Style: gnome\n"
View file
gst-plugins-bad-1.20.5.tar.xz/po/uk.po -> gst-plugins-bad-1.22.0.tar.xz/po/uk.po
Changed
@@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: gst-plugins-bad 1.15.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-25 01:02+0100\n" +"POT-Creation-Date: 2023-01-11 15:41+0000\n" "PO-Revision-Date: 2019-01-24 22:16+0200\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n" @@ -17,8 +17,8 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Lokalize 2.0\n" msgid "No URL set."
View file
gst-plugins-bad-1.20.5.tar.xz/po/zh_CN.po -> gst-plugins-bad-1.22.0.tar.xz/po/zh_CN.po
Changed
@@ -7,10 +7,10 @@ # Tianze Wang <zwpwjwtz@126.com>, 2015. msgid "" msgstr "" -"Project-Id-Version: gst-plugins-bad 1.15.1\n" +"Project-Id-Version: gst-plugins-bad 1.21.90\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-25 01:02+0100\n" -"PO-Revision-Date: 2019-03-05 16:31+0100\n" +"POT-Creation-Date: 2023-01-23 16:28+0000\n" +"PO-Revision-Date: 2023-01-21 13:45+0800\n" "Last-Translator: Tianze Wang <zwpwjwtz@126.com>\n" "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n" "Language: zh_CN\n" @@ -18,7 +18,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Bugs: Report translation errors to the Language-Team address.\n" -"X-Generator: Poedit 2.0.7\n" +"X-Generator: Poedit 2.2.1\n" msgid "No URL set." msgstr "未设置 URL。"
View file
gst-plugins-bad-1.20.5.tar.xz/po/zh_TW.po -> gst-plugins-bad-1.22.0.tar.xz/po/zh_TW.po
Changed
@@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: gst-plugins-bad-1.15.1\n" -"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2019-01-17 02:16+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-11 15:41+0000\n" "PO-Revision-Date: 2021-05-09 21:17+0800\n" "Last-Translator: Yi-Jyun Pan <pan93412@gmail.com>\n" "Language-Team: Chinese (traditional) <zh-l10n@lists.linux.org.tw>\n" @@ -67,6 +67,7 @@ msgid "Failed to get fragment URL." msgstr "無法取得片段 URL。" +#, c-format msgid "Couldn't download fragments" msgstr "無法下載片段" @@ -93,6 +94,7 @@ msgid "Could not open file \"%s\" for reading." msgstr "無法開啟 \"%s\" 檔案以讀取。" +#, c-format msgid "Couldn't find channel configuration file" msgstr "找不到頻道設定檔" @@ -116,5 +118,6 @@ msgid "Couldn't find channel configuration file: '%s'" msgstr "找不到頻道設定檔:'%s'" +#, c-format msgid "Channel configuration file doesn't contain any channels" msgstr "頻道設定檔內完全沒有頻道"
View file
gst-plugins-bad-1.20.5.tar.xz/scripts/dist-translations.py -> gst-plugins-bad-1.22.0.tar.xz/scripts/dist-translations.py
Changed
@@ -21,11 +21,13 @@ import subprocess import shutil import tempfile +import sys if __name__ == "__main__": dist_root = os.environ'MESON_DIST_ROOT' build_root = os.environ'MESON_BUILD_ROOT' source_root = os.environ'MESON_SOURCE_ROOT' + project_version = sys.argv1 pwd = os.environ'PWD' tmpdir = tempfile.gettempdir() @@ -35,8 +37,22 @@ print('Generating pot file ...') subprocess.run('ninja', '-C', build_root, module + '-1.0-pot', check=True) - # Dist pot file in tarball - print('Copying pot file into dist staging directory ...') pot_src = os.path.join(source_root, 'po', module + '-1.0.pot') - dist_po_dir = os.path.join(dist_root, 'po') - shutil.copy2(pot_src, dist_po_dir) + + # Dist pot file in tarball, and fix up version in POT file to match + # Translation Project requirements as part of the copying. + with open(pot_src, 'r') as f: + pot_file = f.read() + + pot_file = pot_file.replace(f'Project-Id-Version: {module}-1.0', + f'Project-Id-Version: {module}-{project_version}', 1) + + print('Copying pot file into dist staging directory ...') + dist_pot_with_suffix = os.path.join(dist_root, 'po', f'{module}-1.0.pot') + with open(dist_pot_with_suffix, 'w') as f: + f.write(pot_file) + + # And another copy without the 1.0 suffix + dist_pot_without_suffix = os.path.join(dist_root, 'po', f'{module}.pot') + with open(dist_pot_without_suffix, 'w') as f: + f.write(pot_file)
View file
gst-plugins-bad-1.22.0.tar.xz/scripts/gen-changelog.py
Added
@@ -0,0 +1,240 @@ +#!/usr/bin/env python3 +# +# Makes a GNU-Style ChangeLog from a git repository +import os +import sys +import subprocess +import re + +meson_source_root = os.environ.get('MESON_SOURCE_ROOT') + +meson_dist_root = os.environ.get('MESON_DIST_ROOT') +if meson_dist_root: + output_fn = os.path.join(meson_dist_root, 'ChangeLog') +else: + output_fn = sys.stdout.fileno() + +# commit hash => release version tag string +release_refs = {} + +# These are the pre-monorepo module beginnings +changelog_starts = { + 'gstreamer': '70521179a75db0c7230cc47c6d7f9d63cf73d351', + 'gst-plugins-base': '68746a38d5e48e6f7c220663dcc2f175ff55cb3c', + 'gst-plugins-good': '81f63142d65b62b0971c19ceb79956c49ffc2f06', + 'gst-plugins-ugly': '7d7c3e478e32b7b66c44cc4442d571fbab534740', + 'gst-plugins-bad': 'ea6821e2934fe8d356ea89d5610f0630b3446877', + 'gst-libav': '3c440154c60d1ec0a54186f0fad4aebfd2ecc3ea', + 'gst-rtsp-server': '5029c85a46a8c366c4bf272d503e22bbcd624ece', + 'gst-editing-services': 'ee8bf88ebf131cf7c7161356540efc20bf411e14', + 'gst-python': 'b3e564eff577e2f577d795051bbcca85d47c89dc', + 'gstreamer-vaapi': 'c89e9afc5d43837c498a55f8f13ddf235442b83b', + 'gst-omx': 'd2463b017f222e678978582544a9c9a80edfd330', + 'gst-devtools': 'da962d096af9460502843e41b7d25fdece7ff1c2', + 'gstreamer-sharp': 'b94528f8e7979df49fedf137dfa228d8fe475e1b', +} + + +def print_help(): + print('', file=sys.stderr) + print('gen-changelog: generate GNU-style changelog from git history', + file=sys.stderr) + print('', file=sys.stderr) + print('Usage: {} OPTIONS GSTREAMER-MODULE START-TAG HEAD-TAG'.format( + sys.argv0), file=sys.stderr) + print('', file=sys.stderr) + sys.exit(1) + + +if len(sys.argv) < 2 or len(sys.argv) > 4 or '--help' in sys.argv: + print_help() + +module = sys.argv1 + +if len(sys.argv) > 2: + start_tag = sys.argv2 +else: + start_tag = None + +if len(sys.argv) > 3: + head_tag = sys.argv3 +else: + head_tag = None + +if module not in changelog_starts: + print(f'Unknown module {module}', file=sys.stderr) + print_help() + + +def process_commit(lines, files, subtree_path=None): + # DATE NAME + # BLANK LINE + # Subject + # BLANK LINE + # ... + # FILES + fileincommit = False + lines = x.strip() for x in lines if x.strip() + and not x.startswith('git-svn-id') + files = x.strip() for x in files if x.strip() + for line in lines: + if line.startswith('* ') and ':' in line: + fileincommit = True + break + + top_line = lines0 + print(top_line.strip()) + print() + if not fileincommit: + for f in files: + if subtree_path and f.startswith(subtree_path): + # requires Python 3.9 + print('\t* %s:' % f.removeprefix(subtree_path)) + else: + print('\t* %s:' % f) + for line in lines1:: + print('\t ', line) + print() + + +def output_commits(module, start_tag, end_tag, subtree_path=None): + # retrieve commit date for start tag so we can filter the log for commits + # after that date. That way we don't include commits from merged-in + # plugin-move branches that go back to the beginning of time. + start_date = get_commit_date_for_ref(start_tag) + + cmd = 'git', 'log', + '--pretty=format:--START-COMMIT--%H%n%ai %an <%ae>%n%n%s%n%b%n--END-COMMIT--', + '--date=short', + '--name-only', + f'--since={start_date}', + f'{start_tag}..{end_tag}', + + + if subtree_path: + cmd += '--', '.' + + p = subprocess.Popen(args=cmd, shell=False, + stdout=subprocess.PIPE, cwd=meson_source_root) + buf = + files = + filemode = False + for lin in x.decode('utf8', errors='replace') for x in p.stdout.readlines(): + if lin.startswith("--START-COMMIT--"): + commit_hash = lin16:.strip() + if buf != : + process_commit(buf, files, subtree_path) + + if commit_hash in release_refs: + version_str = release_refscommit_hash + print(f'=== release {version_str} ===\n') + + buf = + files = + filemode = False + elif lin.startswith("--END-COMMIT--"): + filemode = True + elif filemode is True: + files.append(lin) + else: + buf.append(lin) + if buf != : + process_commit(buf, files, subtree_path) + + +def get_commit_date_for_ref(ref): + cmd = 'git', 'log', '--pretty=format:%cI', '-1', ref + r = subprocess.run(cmd, capture_output=True, text=True, + check=True, cwd=meson_source_root) + commit_date = r.stdout.strip() + return commit_date + + +def populate_release_tags_for_premonorepo_module(module_tag_prefix): + if module_tag_prefix != '': + cmd = 'git', 'tag', '--list', f'{module_tag_prefix}*' + else: + cmd = 'git', 'tag', '--list', '1.*', 'RELEASE-*' + + p = subprocess.Popen(args=cmd, shell=False, + stdout=subprocess.PIPE, cwd=meson_source_root) + for line in x.decode('utf8') for x in p.stdout.readlines(): + git_tag = line.strip() + version_str = git_tag.removeprefix(module_tag_prefix).removeprefix('RELEASE-').split('-')0.replace('_', '.') + # might have been populated with post-monorepo tags already for gstreamer core + if version_str not in release_refs: + # find last commit before tag in module subdirectory + cmd = 'git', 'log', '--pretty=format:%H', '-1', git_tag + r = subprocess.run(cmd, capture_output=True, + text=True, check=True, cwd=meson_source_root) + commit_hash = r.stdout.strip() + release_refscommit_hash = version_str + + # print(f'{git_tag} => {version_str} => {commit_hash}') + + +def populate_release_tags_for_monorepo_subproject(): + cmd = 'git', 'tag', '--list', '1.*' + p = subprocess.Popen(args=cmd, shell=False, + stdout=subprocess.PIPE, cwd=meson_source_root) + for line in x.decode('utf8') for x in p.stdout.readlines(): + version_str = line.strip() + version_arr = version_str.split('.') + major = int(version_arr0) + minor = int(version_arr1) + micro = int(version_arr2) + # ignore pre-monorepo versions + if major < 1: + continue + if major == 1 and minor < 19: + continue + if major == 1 and minor == 19 and micro < 2: + continue + # find last commit before tag in module subdirectory + cmd = 'git', 'log', '--pretty=format:%H', + '-1', version_str, '--', '.' + r = subprocess.run(cmd, capture_output=True, text=True, + check=True, cwd=meson_source_root) + commit_hash = r.stdout.strip() + release_refscommit_hash = version_str + + +if __name__ == '__main__': + module_tag_prefix = '' if module == 'gstreamer' else f'{module}-' + + populate_release_tags_for_monorepo_subproject() + + with open(output_fn, 'w') as f: + sys.stdout = f + + # Force writing of head tag + if head_tag and head_tag not in release_refs.values(): + print(f'=== release {head_tag} ===\n') + + # Output all commits from start_tag onwards, otherwise output full history. + # (We assume the start_tag is after the monorepo merge if it's specified.) + if start_tag and start_tag != 'start': + output_commits(module, start_tag, 'HEAD', f'subprojects/{module}/') + else: + # First output all post-monorepo commits or commits from start_tag if specified + output_commits(module, 'monorepo-start', + 'HEAD', f'subprojects/{module}/') + + populate_release_tags_for_premonorepo_module(module_tag_prefix) + + # Next output all pre-monorepo commits (modules have their own root) + if not start_tag: + module_start = f'{module_tag_prefix}1.0.0' + elif start_tag == 'start': + module_start = changelog_startsmodule + else: + module_start = f'{module_tag_prefix}{start_tag}' + + output_commits(module, module_start, + f'{module_tag_prefix}1.19.2', None) + + # Write start tag at end for clarity + if not start_tag: + print(f'=== release 1.0.0 ===\n') + elif start_tag != 'start': + print(f'=== release {start_tag} ===\n')
View file
gst-plugins-bad-1.20.5.tar.xz/scripts/meson.build -> gst-plugins-bad-1.22.0.tar.xz/scripts/meson.build
Changed
@@ -1,4 +1,4 @@ # dist scripts if not meson.is_subproject() - meson.add_dist_script('dist-translations.py') + meson.add_dist_script('dist-translations.py', meson.project_version()) endif
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/gstamfav1enc.cpp
Added
@@ -0,0 +1,1174 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * Copyright (C) 2022 Evgeny Pavlov <lucenticus@gmail.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-amfav1enc + * @title: amfav1enc + * @short_description: An AMD AMF API based AV1 video encoder + * + * amfav1enc element encodes raw video stream into compressed AV1 bitstream + * via AMD AMF API. + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc num-buffers=100 ! amfav1enc ! av1parse ! webmmux ! filesink location=encoded.webm + * ``` + * + * Since: 1.22 + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstamfav1enc.h" +#include <components/Component.h> +#include <components/VideoEncoderAV1.h> +#include <core/Factory.h> +#include <string> +#include <vector> +#include <string.h> + +using namespace amf; + +GST_DEBUG_CATEGORY_STATIC (gst_amf_av1_enc_debug); +#define GST_CAT_DEFAULT gst_amf_av1_enc_debug + +static GTypeClass *parent_class = nullptr; + +typedef struct +{ + amf_int64 num_of_hw_instances; + amf_int64 max_throughput; + amf_int64 requested_throughput; + amf_int64 color_conversion; + amf_int64 pre_analysis; + amf_int64 max_bitrate; + amf_int64 max_profile; + amf_int64 max_level; + amf_int64 max_num_temporal_layers; + amf_int64 max_num_ltr_frames; + amf_int64 default_qp_i; + amf_int64 default_qp_p; + amf_int64 min_gop_size; + amf_int64 max_gop_size; + amf_int64 default_gop_size; + guint valign; +} GstAmfAv1EncDeviceCaps; + +/** + * GstAmfAv1EncUsage: + * + * Encoder usages + * + * Since: 1.22 + */ +#define GST_TYPE_AMF_AV1_ENC_USAGE (gst_amf_av1_enc_usage_get_type ()) +static GType +gst_amf_av1_enc_usage_get_type (void) +{ + static GType usage_type = 0; + static const GEnumValue usages = { + /** + * GstAmfAv1EncUsage::transcoding: + * + * Transcoding usage + */ + {AMF_VIDEO_ENCODER_AV1_USAGE_TRANSCODING, "Transcoding", "transcoding"}, + + /** + * GstAmfAv1EncUsage::low-latency: + * + * Low Latency usage + */ + {AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY, "Low Latency", "low-latency"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&usage_type)) { + GType type = g_enum_register_static ("GstAmfAv1EncUsage", usages); + g_once_init_leave (&usage_type, type); + } + + return usage_type; +} + +/** + * GstAmfAv1EncRateControl: + * + * Rate control methods + * + * Since: 1.22 + */ +#define GST_TYPE_AMF_AV1_ENC_RATE_CONTROL (gst_amf_av1_enc_rate_control_get_type ()) +static GType +gst_amf_av1_enc_rate_control_get_type (void) +{ + static GType rate_control_type = 0; + static const GEnumValue rate_controls = { + /** + * GstAmfAv1EncRateControl::default: + * + * Default rate control method depending on usage + */ + {AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_UNKNOWN, + "Default, depends on Usage", "default"}, + + /** + * GstAmfAv1EncRateControl::cqp: + * + * Constant QP + */ + {AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CONSTANT_QP, "Constant QP", + "cqp"}, + + /** + * GstAmfAv1EncRateControl::lcvbr: + * + * Latency Constrained Variable Bitrate + */ + {AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR, + "Latency Constrained VBR", "lcvbr"}, + + /** + * GstAmfAv1EncRateControl::vbr: + * + * Peak Constrained Variable Bitrate + */ + {AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR, + "Peak Constrained VBR", "vbr"}, + + /** + * GstAmfAv1EncRateControl::cbr: + * + * Constant Bitrate + */ + {AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR, "Constant Bitrate", "cbr"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&rate_control_type)) { + GType type = + g_enum_register_static ("GstAmfAv1EncRateControl", rate_controls); + g_once_init_leave (&rate_control_type, type); + } + + return rate_control_type; +} + +/** + * GstAmfAv1EncPreset: + * + * Encoding quality presets + * + * Since: 1.22 + */ +#define AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_UNKNOWN -1 +#define GST_TYPE_AMF_AV1_ENC_PRESET (gst_amf_av1_enc_preset_get_type ()) +static GType +gst_amf_av1_enc_preset_get_type (void) +{ + static GType preset_type = 0; + static const GEnumValue presets = { + /** + * GstAmfAv1EncRateControl::default: + * + * Default preset depends on usage + */ + {AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_UNKNOWN, "Default, depends on USAGE", + "default"}, + + /** + * GstAmfAv1EncRateControl::high-quality: + * + * High quality oriented preset + */ + {AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_HIGH_QUALITY, "High quality", + "high-quality"}, + + /** + * GstAmfAv1EncRateControl::quality: + * + * Quality oriented preset + */ + {AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_QUALITY, "Quality", "quality"}, + + /** + * + * GstAmfAv1EncRateControl::balanced: + * + * Balanced preset + */ + {AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_BALANCED, "Balanced", "balanced"}, + + /** + * GstAmfAv1EncRateControl::speed: + * + * Speed oriented preset + */ + {AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_SPEED, "Speed", "speed"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&preset_type)) { + GType type = g_enum_register_static ("GstAmfAv1EncPreset", presets); + g_once_init_leave (&preset_type, type); + } + + return preset_type; +} + +typedef struct +{ + GstCaps *sink_caps; + GstCaps *src_caps; + + gint64 adapter_luid; + + GstAmfAv1EncDeviceCaps dev_caps; +} GstAmfAv1EncClassData; + +enum +{ + PROP_0, + PROP_ADAPTER_LUID, + PROP_USAGE, + PROP_RATE_CONTROL, + PROP_PRESET, + PROP_BITRATE, + PROP_MAX_BITRATE, + PROP_GOP_SIZE, + PROP_MIN_QP_I, + PROP_MAX_QP_I, + PROP_MIN_QP_P, + PROP_MAX_QP_P, + PROP_QP_I, + PROP_QP_P, + PROP_REF_FRAMES, +}; + +#define DEFAULT_USAGE AMF_VIDEO_ENCODER_AV1_USAGE_TRANSCODING +#define DEFAULT_RATE_CONTROL AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_UNKNOWN +#define DEFAULT_PRESET AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_UNKNOWN +#define DEFAULT_BITRATE 0 +#define DEFAULT_MAX_BITRATE 0 +#define DEFAULT_MIN_MAX_QP -1 +#define DEFAULT_REF_FRAMES 1 + +#define DOC_SINK_CAPS_COMM \ + "format = (string) NV12, " \ + "width = (int) 128, 4096 , height = (int) 128, 4096 " + +#define DOC_SINK_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw, " DOC_SINK_CAPS_COMM + +#define DOC_SRC_CAPS \ + "video/x-av1, width = (int) 128, 4096 , height = (int) 128, 4096 , " \ + "profile = (string) main, alignment= (string) tu" + +typedef struct _GstAmfAv1Enc +{ + GstAmfEncoder parent; + + GMutex prop_lock; + gboolean property_updated; + gint usage; + gint rate_control; + gint preset; + guint bitrate; + guint max_bitrate; + guint gop_size; + gint min_qp_i; + gint max_qp_i; + gint min_qp_p; + gint max_qp_p; + guint qp_i; + guint qp_p; + guint ref_frames; +} GstAmfAv1Enc; + +typedef struct _GstAmfAv1EncClass +{ + GstAmfEncoderClass parent_class; + GstAmfAv1EncDeviceCaps dev_caps; + + gint64 adapter_luid; +} GstAmfAv1EncClass; + +#define GST_AMF_AV1_ENC(object) ((GstAmfAv1Enc *) (object)) +#define GST_AMF_AV1_ENC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstAmfAv1EncClass)) + +static void gst_amf_av1_enc_finalize (GObject * object); +static void gst_amf_av1_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_amf_av1_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static gboolean gst_amf_av1_enc_set_format (GstAmfEncoder * encoder, + GstVideoCodecState * state, gpointer component); +static gboolean gst_amf_av1_enc_set_output_state (GstAmfEncoder * encoder, + GstVideoCodecState * state, gpointer component); +static gboolean gst_amf_av1_enc_set_surface_prop (GstAmfEncoder * encoder, + GstVideoCodecFrame * frame, gpointer surface); +static GstBuffer *gst_amf_av1_enc_create_output_buffer (GstAmfEncoder * + encoder, gpointer data, gboolean * sync_point); +static gboolean gst_amf_av1_enc_check_reconfigure (GstAmfEncoder * encoder); + +static void +gst_amf_av1_enc_class_init (GstAmfAv1EncClass * klass, gpointer data) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstAmfEncoderClass *amf_class = GST_AMF_ENCODER_CLASS (klass); + GstAmfAv1EncClassData *cdata = (GstAmfAv1EncClassData *) data; + GstAmfAv1EncDeviceCaps *dev_caps = &cdata->dev_caps; + GParamFlags param_flags = (GParamFlags) (G_PARAM_READWRITE | + GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS); + GstPadTemplate *pad_templ; + GstCaps *doc_caps; + + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + + object_class->finalize = gst_amf_av1_enc_finalize; + object_class->set_property = gst_amf_av1_enc_set_property; + object_class->get_property = gst_amf_av1_enc_get_property; + + g_object_class_install_property (object_class, PROP_ADAPTER_LUID, + g_param_spec_int64 ("adapter-luid", "Adapter LUID", + "DXGI Adapter LUID (Locally Unique Identifier) of associated GPU", + G_MININT64, G_MAXINT64, 0, (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_USAGE, + g_param_spec_enum ("usage", "Usage", + "Target usage", GST_TYPE_AMF_AV1_ENC_USAGE, + DEFAULT_USAGE, param_flags)); + g_object_class_install_property (object_class, PROP_RATE_CONTROL, + g_param_spec_enum ("rate-control", "Rate Control", + "Rate Control Method", GST_TYPE_AMF_AV1_ENC_RATE_CONTROL, + DEFAULT_RATE_CONTROL, param_flags)); + g_object_class_install_property (object_class, PROP_PRESET, + g_param_spec_enum ("preset", "Preset", + "Preset", GST_TYPE_AMF_AV1_ENC_PRESET, DEFAULT_PRESET, param_flags)); + g_object_class_install_property (object_class, PROP_BITRATE, + g_param_spec_uint ("bitrate", "Bitrate", + "Target bitrate in kbit/sec (0: USAGE default)", + 0, G_MAXINT / 1000, DEFAULT_BITRATE, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_BITRATE, + g_param_spec_uint ("max-bitrate", "Max Bitrate", + "Maximum bitrate in kbit/sec (0: USAGE default)", + 0, G_MAXINT / 1000, DEFAULT_MAX_BITRATE, param_flags)); + g_object_class_install_property (object_class, PROP_GOP_SIZE, + g_param_spec_uint ("gop-size", "GOP Size", + "Number of pictures within a GOP", + (guint) dev_caps->min_gop_size, (guint) dev_caps->max_gop_size, + (guint) dev_caps->default_gop_size, param_flags)); + g_object_class_install_property (object_class, PROP_MIN_QP_I, + g_param_spec_int ("min-qp-i", "Min QP I", + "Minimum allowed QP value for I frames (-1: USAGE default)", + -1, 255, DEFAULT_MIN_MAX_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_QP_I, + g_param_spec_int ("max-qp-i", "Max QP I", + "Maximum allowed QP value for I frames (-1: USAGE default)", + -1, 255, DEFAULT_MIN_MAX_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MIN_QP_P, + g_param_spec_int ("min-qp-p", "Min QP P", + "Minimum allowed QP value for P frames (-1: USAGE default)", + -1, 255, DEFAULT_MIN_MAX_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_QP_P, + g_param_spec_int ("max-qp-p", "Max QP P", + "Maximum allowed QP value for P frames (-1: USAGE default)", + -1, 255, DEFAULT_MIN_MAX_QP, param_flags)); + g_object_class_install_property (object_class, PROP_QP_I, + g_param_spec_uint ("qp-i", "QP I", + "Constant QP for I frames", 0, 255, + (guint) dev_caps->default_qp_i, param_flags)); + g_object_class_install_property (object_class, PROP_QP_P, + g_param_spec_uint ("qp-p", "QP P", + "Constant QP for P frames", 0, 255, + (guint) dev_caps->default_qp_p, param_flags)); + g_object_class_install_property (object_class, PROP_REF_FRAMES, + g_param_spec_uint ("ref-frames", "Reference Frames", + "Number of reference frames", 0, 8, DEFAULT_REF_FRAMES, param_flags)); + + gst_element_class_set_metadata (element_class, + "AMD AMF AV1 Video Encoder", + "Codec/Encoder/Video/Hardware", + "Encode AV1 video streams using AMF API", + "Seungha Yang <seungha@centricular.com>, " + "Evgeny Pavlov <lucenticus@gmail.com>"); + + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + amf_class->set_format = GST_DEBUG_FUNCPTR (gst_amf_av1_enc_set_format); + amf_class->set_output_state = + GST_DEBUG_FUNCPTR (gst_amf_av1_enc_set_output_state); + amf_class->set_surface_prop = + GST_DEBUG_FUNCPTR (gst_amf_av1_enc_set_surface_prop); + amf_class->create_output_buffer = + GST_DEBUG_FUNCPTR (gst_amf_av1_enc_create_output_buffer); + amf_class->check_reconfigure = + GST_DEBUG_FUNCPTR (gst_amf_av1_enc_check_reconfigure); + + klass->dev_caps = cdata->dev_caps; + klass->adapter_luid = cdata->adapter_luid; + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); + + gst_type_mark_as_plugin_api (GST_TYPE_AMF_AV1_ENC_USAGE, + (GstPluginAPIFlags) 0); + gst_type_mark_as_plugin_api (GST_TYPE_AMF_AV1_ENC_RATE_CONTROL, + (GstPluginAPIFlags) 0); + gst_type_mark_as_plugin_api (GST_TYPE_AMF_AV1_ENC_PRESET, + (GstPluginAPIFlags) 0); +} + +static void +gst_amf_av1_enc_init (GstAmfAv1Enc * self) +{ + GstAmfAv1EncClass *klass = GST_AMF_AV1_ENC_GET_CLASS (self); + GstAmfAv1EncDeviceCaps *dev_caps = &klass->dev_caps; + + gst_amf_encoder_set_subclass_data (GST_AMF_ENCODER (self), + klass->adapter_luid, AMFVideoEncoder_AV1); + + g_mutex_init (&self->prop_lock); + + self->usage = DEFAULT_USAGE; + self->rate_control = DEFAULT_RATE_CONTROL; + self->preset = DEFAULT_PRESET; + self->bitrate = DEFAULT_BITRATE; + self->max_bitrate = DEFAULT_MAX_BITRATE; + self->gop_size = (guint) dev_caps->default_gop_size; + self->min_qp_i = DEFAULT_MIN_MAX_QP; + self->max_qp_i = DEFAULT_MIN_MAX_QP; + self->min_qp_p = DEFAULT_MIN_MAX_QP; + self->max_qp_p = DEFAULT_MIN_MAX_QP; + self->qp_i = (guint) dev_caps->default_qp_i; + self->qp_p = (guint) dev_caps->default_qp_p; + self->ref_frames = DEFAULT_REF_FRAMES; +} + +static void +gst_amf_av1_enc_finalize (GObject * object) +{ + GstAmfAv1Enc *self = GST_AMF_AV1_ENC (object); + + g_mutex_clear (&self->prop_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +update_int (GstAmfAv1Enc * self, gint * old_val, const GValue * new_val) +{ + gint val = g_value_get_int (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->property_updated = TRUE; +} + +static void +update_uint (GstAmfAv1Enc * self, guint * old_val, const GValue * new_val) +{ + guint val = g_value_get_uint (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->property_updated = TRUE; +} + +static void +update_enum (GstAmfAv1Enc * self, gint * old_val, const GValue * new_val) +{ + gint val = g_value_get_enum (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->property_updated = TRUE; +} + +static void +gst_amf_av1_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAmfAv1Enc *self = GST_AMF_AV1_ENC (object); + + g_mutex_lock (&self->prop_lock); + switch (prop_id) { + case PROP_USAGE: + update_enum (self, &self->usage, value); + break; + case PROP_RATE_CONTROL: + update_enum (self, &self->rate_control, value); + break; + case PROP_PRESET: + update_enum (self, &self->preset, value); + break; + case PROP_BITRATE: + update_uint (self, &self->bitrate, value); + break; + case PROP_MAX_BITRATE: + update_uint (self, &self->max_bitrate, value); + break; + case PROP_GOP_SIZE: + update_uint (self, &self->gop_size, value); + break; + case PROP_MIN_QP_I: + update_int (self, &self->min_qp_i, value); + break; + case PROP_MAX_QP_I: + update_int (self, &self->max_qp_i, value); + break; + case PROP_MIN_QP_P: + update_int (self, &self->min_qp_p, value); + break; + case PROP_MAX_QP_P: + update_int (self, &self->max_qp_p, value); + break; + case PROP_QP_I: + update_uint (self, &self->qp_i, value); + break; + case PROP_QP_P: + update_uint (self, &self->qp_p, value); + break; + case PROP_REF_FRAMES: + update_uint (self, &self->ref_frames, value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_amf_av1_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAmfAv1EncClass *klass = GST_AMF_AV1_ENC_GET_CLASS (object); + GstAmfAv1Enc *self = GST_AMF_AV1_ENC (object); + + switch (prop_id) { + case PROP_ADAPTER_LUID: + g_value_set_int64 (value, klass->adapter_luid); + break; + case PROP_USAGE: + g_value_set_enum (value, self->usage); + break; + case PROP_RATE_CONTROL: + g_value_set_enum (value, self->rate_control); + break; + case PROP_PRESET: + g_value_set_enum (value, self->preset); + break; + case PROP_BITRATE: + g_value_set_uint (value, self->bitrate); + break; + case PROP_MAX_BITRATE: + g_value_set_uint (value, self->max_bitrate); + break; + case PROP_GOP_SIZE: + g_value_set_uint (value, self->gop_size); + break; + case PROP_MIN_QP_I: + g_value_set_int (value, self->min_qp_i); + break; + case PROP_MAX_QP_I: + g_value_set_int (value, self->max_qp_i); + break; + case PROP_MIN_QP_P: + g_value_set_int (value, self->min_qp_p); + break; + case PROP_MAX_QP_P: + g_value_set_int (value, self->max_qp_p); + break; + case PROP_QP_I: + g_value_set_uint (value, self->qp_i); + break; + case PROP_QP_P: + g_value_set_uint (value, self->qp_p); + break; + case PROP_REF_FRAMES: + g_value_set_uint (value, self->ref_frames); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_amf_av1_enc_set_format (GstAmfEncoder * encoder, + GstVideoCodecState * state, gpointer component) +{ + GstAmfAv1Enc *self = GST_AMF_AV1_ENC (encoder); + AMFComponent *comp = (AMFComponent *) component; + GstVideoInfo *info = &state->info; + AMF_RESULT result; + AMFRate framerate; + amf_int64 int64_val = 0; + AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_ENUM rc_mode; + + g_mutex_lock (&self->prop_lock); + result = comp->SetProperty (AMF_VIDEO_ENCODER_AV1_FRAMESIZE, + AMFConstructSize (info->width, info->height)); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set frame size, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_AV1_USAGE, + (amf_int64) self->usage); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set usage, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + if (self->preset > AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_UNKNOWN) { + result = comp->SetProperty (AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET, + (amf_int64) self->preset); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set quality preset, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_AV1_PROFILE, + (amf_int64) AMF_VIDEO_ENCODER_AV1_PROFILE_MAIN); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set profile, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE, + (amf_int64) AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_NO_RESTRICTIONS); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set alignment mode, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_AV1_MAX_NUM_REFRAMES, + (amf_int64) self->ref_frames); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set ref-frames, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + result = comp->Init (AMF_SURFACE_NV12, info->width, info->height); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to init component, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + if (self->rate_control != AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_UNKNOWN) { + result = comp->SetProperty (AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD, + (amf_int64) self->rate_control); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set rate-control, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + } + + result = comp->GetProperty (AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD, + &int64_val); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to get rate-control method, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + rc_mode = (AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_ENUM) int64_val; + if (self->min_qp_i >= 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTRA, + (amf_int64) self->min_qp_i); + } + if (self->max_qp_i >= 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTRA, + (amf_int64) self->max_qp_i); + } + if (self->min_qp_p >= 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTER, + (amf_int64) self->min_qp_p); + } + if (self->max_qp_p >= 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTER, + (amf_int64) self->max_qp_p); + } + + comp->SetProperty (AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTRA, + (amf_int64) self->qp_i); + comp->SetProperty (AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTER, + (amf_int64) self->qp_p); + + switch (rc_mode) { + case AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR: + if (self->bitrate > 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_AV1_TARGET_BITRATE, + (amf_int64) self->bitrate * 1000); + comp->SetProperty (AMF_VIDEO_ENCODER_AV1_PEAK_BITRATE, + (amf_int64) self->bitrate * 1000); + } + break; + case AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR: + case AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR: + if (self->bitrate > 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_AV1_TARGET_BITRATE, + (amf_int64) self->bitrate * 1000); + } + if (self->max_bitrate > 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_AV1_PEAK_BITRATE, + (amf_int64) self->max_bitrate * 1000); + } + break; + default: + break; + } + + /* Disable frame skip for now, need investigation the behavior */ + result = + comp->SetProperty (AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_SKIP_FRAME, + (amf_bool) false); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to disable skip frame, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + if (info->fps_n > 0 && info->fps_d) { + framerate = AMFConstructRate (info->fps_n, info->fps_d); + } else { + framerate = AMFConstructRate (25, 1); + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_AV1_FRAMERATE, framerate); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set frame rate, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_AV1_GOP_SIZE, + (amf_int64) self->gop_size); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set gop-size, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + self->property_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return TRUE; + +error: + g_mutex_unlock (&self->prop_lock); + + return FALSE; +} + +static gboolean +gst_amf_av1_enc_set_output_state (GstAmfEncoder * encoder, + GstVideoCodecState * state, gpointer component) +{ + GstAmfAv1Enc *self = GST_AMF_AV1_ENC (encoder); + GstVideoCodecState *output_state; + GstCaps *caps; + GstTagList *tags; + + caps = gst_caps_from_string ("video/x-av1, profile = (string) main, " + "alignment = (string) tu"); + output_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (self), + caps, state); + + GST_INFO_OBJECT (self, "Output caps: %" GST_PTR_FORMAT, output_state->caps); + gst_video_codec_state_unref (output_state); + + tags = gst_tag_list_new_empty (); + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, + "amfav1enc", nullptr); + + gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (encoder), + tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (tags); + + return TRUE; +} + +static gboolean +gst_amf_av1_enc_set_surface_prop (GstAmfEncoder * encoder, + GstVideoCodecFrame * frame, gpointer surface) +{ + AMFSurface *surf = (AMFSurface *) surface; + AMF_RESULT result; + + if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame)) { + amf_int64 type = (amf_int64) AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE_NONE; + result = surf->SetProperty (AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE, type); + if (result != AMF_OK) { + GST_WARNING_OBJECT (encoder, "Failed to set force frame type, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + } + } + return TRUE; +} + +static GstBuffer * +gst_amf_av1_enc_create_output_buffer (GstAmfEncoder * encoder, + gpointer data, gboolean * sync_point) +{ + GstAmfAv1Enc *self = GST_AMF_AV1_ENC (encoder); + AMFBuffer *amf_buf = (AMFBuffer *) data; + GstBuffer *buf; + guint8 *data_ptr; + gsize data_size; + amf_int64 output_type = 0; + AMF_RESULT result; + + data_ptr = (guint8 *) amf_buf->GetNative (); + data_size = amf_buf->GetSize (); + + if (!data_ptr || data_size == 0) { + GST_WARNING_OBJECT (self, "Empty buffer"); + return nullptr; + } + + buf = gst_buffer_new_memdup (data_ptr, data_size); + + result = amf_buf->GetProperty (AMF_VIDEO_ENCODER_AV1_OUTPUT_FRAME_TYPE, + &output_type); + if (result == AMF_OK && + output_type == (amf_int64) AMF_VIDEO_ENCODER_AV1_OUTPUT_FRAME_TYPE_KEY) { + *sync_point = TRUE; + } + + return buf; +} + +static gboolean +gst_amf_av1_enc_check_reconfigure (GstAmfEncoder * encoder) +{ + GstAmfAv1Enc *self = GST_AMF_AV1_ENC (encoder); + gboolean ret; + + g_mutex_lock (&self->prop_lock); + ret = self->property_updated; + g_mutex_unlock (&self->prop_lock); + + return ret; +} + +static GstAmfAv1EncClassData * +gst_amf_av1_enc_create_class_data (GstD3D11Device * device, AMFComponent * comp) +{ + AMF_RESULT result; + GstAmfAv1EncDeviceCaps dev_caps = { 0, }; + std::string sink_caps_str; + std::string src_caps_str; + std::vector < std::string > profiles; + std::string resolution_str; + GstAmfAv1EncClassData *cdata; + AMFCapsPtr amf_caps; + AMFIOCapsPtr in_iocaps; + AMFIOCapsPtr out_iocaps; + amf_int32 in_min_width = 0, in_max_width = 0; + amf_int32 in_min_height = 0, in_max_height = 0; + amf_int32 out_min_width = 0, out_max_width = 0; + amf_int32 out_min_height = 0, out_max_height = 0; + amf_int32 num_val; + gboolean have_nv12 = FALSE; + gboolean d3d11_supported = FALSE; + gint min_width, max_width, min_height, max_height; + GstCaps *sink_caps; + GstCaps *system_caps; + + result = comp->GetCaps (&amf_caps); + if (result != AMF_OK) { + GST_WARNING_OBJECT (device, "Unable to get caps"); + return nullptr; + } + + result = amf_caps->GetInputCaps (&in_iocaps); + if (result != AMF_OK) { + GST_WARNING_OBJECT (device, "Unable to get input io caps"); + return nullptr; + } + + in_iocaps->GetWidthRange (&in_min_width, &in_max_width); + in_iocaps->GetHeightRange (&in_min_height, &in_max_height); + dev_caps.valign = in_iocaps->GetVertAlign (); + + GST_INFO_OBJECT (device, "Input width: %d, %d, height: %d, %d, " + "valign: %d", in_min_width, in_max_width, in_min_height, in_max_height, + dev_caps.valign); + + num_val = in_iocaps->GetNumOfFormats (); + GST_LOG_OBJECT (device, "Input format count: %d", num_val); + for (amf_int32 i = 0; i < num_val; i++) { + AMF_SURFACE_FORMAT format; + amf_bool native; + + result = in_iocaps->GetFormatAt (i, &format, &native); + if (result != AMF_OK) + continue; + + GST_INFO_OBJECT (device, "Format %d supported, native %d", format, native); + if (format == AMF_SURFACE_NV12) + have_nv12 = TRUE; + } + + if (!have_nv12) { + GST_WARNING_OBJECT (device, "NV12 is not supported"); + return nullptr; + } + + num_val = in_iocaps->GetNumOfMemoryTypes (); + GST_LOG_OBJECT (device, "Input memory type count: %d", num_val); + for (amf_int32 i = 0; i < num_val; i++) { + AMF_MEMORY_TYPE type; + amf_bool native; + + result = in_iocaps->GetMemoryTypeAt (i, &type, &native); + if (result != AMF_OK) + continue; + + GST_INFO_OBJECT (device, + "MemoryType %d supported, native %d", type, native); + if (type == AMF_MEMORY_DX11) + d3d11_supported = TRUE; + } + + if (!d3d11_supported) { + GST_WARNING_OBJECT (device, "D3D11 is not supported"); + return nullptr; + } + + result = amf_caps->GetOutputCaps (&out_iocaps); + if (result != AMF_OK) { + GST_WARNING_OBJECT (device, "Unable to get input io caps"); + return nullptr; + } + + out_iocaps->GetWidthRange (&out_min_width, &out_max_width); + out_iocaps->GetHeightRange (&out_min_height, &out_max_height); + + GST_INFO_OBJECT (device, "Output width: %d, %d, height: %d, %d", + in_min_width, in_max_width, in_min_height, in_max_height); + +#define QUERY_CAPS_PROP(prop,val) G_STMT_START { \ + amf_int64 _val = 0; \ + result = amf_caps->GetProperty (prop, &_val); \ + if (result == AMF_OK) { \ + GST_INFO_OBJECT (device, G_STRINGIFY (val) ": %" G_GINT64_FORMAT, _val); \ + dev_caps.val = _val; \ + } \ +} G_STMT_END + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_AV1_CAP_NUM_OF_HW_INSTANCES, + num_of_hw_instances); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_AV1_CAP_MAX_THROUGHPUT, max_throughput); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_AV1_CAP_REQUESTED_THROUGHPUT, + requested_throughput); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_AV1_CAP_COLOR_CONVERSION, + color_conversion); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_AV1_CAP_PRE_ANALYSIS, pre_analysis); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_AV1_CAP_MAX_BITRATE, max_bitrate); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_AV1_CAP_MAX_PROFILE, max_profile); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_AV1_CAP_MAX_LEVEL, max_level); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_AV1_CAP_MAX_NUM_TEMPORAL_LAYERS, + max_num_temporal_layers); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_AV1_CAP_MAX_NUM_LTR_FRAMES, + max_num_ltr_frames); + +#undef QUERY_CAPS_PROP + +#define QUERY_DEFAULT_PROP(prop,val,default_val) G_STMT_START { \ + const AMFPropertyInfo *pinfo = nullptr; \ + result = comp->GetPropertyInfo (prop, &pinfo); \ + if (result == AMF_OK && pinfo) { \ + dev_caps.val = AMFVariantGetInt64 (&pinfo->defaultValue); \ + GST_INFO_OBJECT (device, G_STRINGIFY (val) ": %" G_GINT64_FORMAT, \ + dev_caps.val); \ + } else { \ + dev_caps.val = default_val; \ + } \ +} G_STMT_END + + QUERY_DEFAULT_PROP (AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTRA, default_qp_i, 26); + QUERY_DEFAULT_PROP (AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTER, default_qp_p, 26); +#undef QUERY_DEFAULT_PROP + + { + const AMFPropertyInfo *pinfo = nullptr; + result = comp->GetPropertyInfo (AMF_VIDEO_ENCODER_AV1_GOP_SIZE, &pinfo); + if (result == AMF_OK && pinfo) { + dev_caps.default_gop_size = AMFVariantGetInt64 (&pinfo->defaultValue); + dev_caps.min_gop_size = AMFVariantGetInt64 (&pinfo->minValue); + dev_caps.max_gop_size = AMFVariantGetInt64 (&pinfo->maxValue); + GST_INFO_OBJECT (device, "gop-size: default %d, min %d, max %d", + (guint) dev_caps.default_gop_size, + (guint) dev_caps.min_gop_size, (guint) dev_caps.max_gop_size); + } else { + dev_caps.default_gop_size = 30; + dev_caps.min_gop_size = 0; + dev_caps.max_gop_size = G_MAXINT; + } + } + + min_width = MAX (in_min_width, 1); + max_width = in_max_width; + if (max_width == 0) { + GST_WARNING_OBJECT (device, "Unknown max width, assuming 4096"); + max_width = 4096; + } + + min_height = MAX (in_min_height, 1); + max_height = in_max_height; + if (max_height == 0) { + GST_WARNING_OBJECT (device, "Unknown max height, assuming 4096"); + max_height = 4096; + } + + resolution_str = "width = (int) " + std::to_string (min_width) + + ", " + std::to_string (max_width) + " "; + resolution_str += ", height = (int) " + std::to_string (min_height) + + ", " + std::to_string (max_height) + " "; + + sink_caps_str = "video/x-raw, format = (string) NV12, " + resolution_str; + src_caps_str = "video/x-av1, " + resolution_str + ", profile = (string) main, " + "alignment = (string) tu"; + + system_caps = gst_caps_from_string (sink_caps_str.c_str ()); + sink_caps = gst_caps_copy (system_caps); + gst_caps_set_features (sink_caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr)); + gst_caps_append (sink_caps, system_caps); + + cdata = g_new0 (GstAmfAv1EncClassData, 1); + cdata->sink_caps = sink_caps; + cdata->src_caps = gst_caps_from_string (src_caps_str.c_str ()); + cdata->dev_caps = dev_caps; + g_object_get (device, "adapter-luid", &cdata->adapter_luid, nullptr); + + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GST_DEBUG_OBJECT (device, "Sink caps %" GST_PTR_FORMAT, cdata->sink_caps); + GST_DEBUG_OBJECT (device, "Src caps %" GST_PTR_FORMAT, cdata->src_caps); + + return cdata; +} + +void +gst_amf_av1_enc_register_d3d11 (GstPlugin * plugin, GstD3D11Device * device, + gpointer context, guint rank) +{ + GstAmfAv1EncClassData *cdata; + AMFContext *amf_context = (AMFContext *) context; + AMFFactory *factory = (AMFFactory *) gst_amf_get_factory (); + AMFComponentPtr comp; + AMF_RESULT result; + + GST_DEBUG_CATEGORY_INIT (gst_amf_av1_enc_debug, "amfav1enc", 0, "amfav1enc"); + + result = factory->CreateComponent (amf_context, AMFVideoEncoder_AV1, &comp); + if (result != AMF_OK) { + GST_WARNING_OBJECT (device, "Failed to create component, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + return; + } + + cdata = gst_amf_av1_enc_create_class_data (device, comp.GetPtr ()); + if (!cdata) + return; + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstAmfAv1EncClass), + nullptr, + nullptr, + (GClassInitFunc) gst_amf_av1_enc_class_init, + nullptr, + cdata, + sizeof (GstAmfAv1Enc), + 0, + (GInstanceInitFunc) gst_amf_av1_enc_init, + }; + + type_name = g_strdup ("GstAmfAv1Enc"); + feature_name = g_strdup ("amfav1enc"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstAmfAv1Device%dEnc", index); + feature_name = g_strdup_printf ("amfav1device%denc", index); + } + + type = g_type_register_static (GST_TYPE_AMF_ENCODER, type_name, + &type_info, (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/gstamfav1enc.h
Added
@@ -0,0 +1,29 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "gstamfencoder.h" +#include <gst/d3d11/gstd3d11.h> + +G_BEGIN_DECLS + void gst_amf_av1_enc_register_d3d11 (GstPlugin * plugin, + GstD3D11Device * device, gpointer context, guint rank); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/gstamfencoder.cpp
Added
@@ -0,0 +1,1082 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <components/Component.h> +#include <core/Factory.h> +#include "gstamfencoder.h" + +#include <gst/d3d11/gstd3d11.h> +#include <wrl.h> +#include <string.h> +#include <mmsystem.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +using namespace amf; +/* *INDENT-ON* */ + +GST_DEBUG_CATEGORY_STATIC (gst_amf_encoder_debug); +#define GST_CAT_DEFAULT gst_amf_encoder_debug + +static GUID AMFTextureArrayIndexGUID = { 0x28115527, 0xe7c3, 0x4b66, 0x99, 0xd3, + 0x4f, 0x2a, 0xe6, 0xb4, 0x7f, 0xaf +}; + +#define GST_AMF_BUFFER_PROP L"GstAmfFrameData" + +#define GST_AMF_ENCODER_FLOW_TRY_AGAIN GST_FLOW_CUSTOM_SUCCESS_1 + +typedef struct +{ + GstBuffer *buffer; + GstMapInfo info; +} GstAmfEncoderFrameData; + +struct _GstAmfEncoderPrivate +{ + gint64 adapter_luid; + const wchar_t *codec_id; + + GstD3D11Device *device; + GstD3D11Fence *fence; + AMFContext *context; + AMFComponent *comp; + GstBufferPool *internal_pool; + + GstVideoCodecState *input_state; + + /* High precision clock */ + guint timer_resolution; +}; + +#define gst_amf_encoder_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GstAmfEncoder, gst_amf_encoder, + GST_TYPE_VIDEO_ENCODER); + +static void gst_amf_encoder_dispose (GObject * object); +static void gst_amf_encoder_finalize (GObject * object); +static void gst_amf_encoder_set_context (GstElement * element, + GstContext * context); +static gboolean gst_amf_encoder_open (GstVideoEncoder * encoder); +static gboolean gst_amf_encoder_stop (GstVideoEncoder * encoder); +static gboolean gst_amf_encoder_close (GstVideoEncoder * encoder); +static gboolean gst_amf_encoder_set_format (GstVideoEncoder * encoder, + GstVideoCodecState * state); +static GstFlowReturn gst_amf_encoder_handle_frame (GstVideoEncoder * encoder, + GstVideoCodecFrame * frame); +static GstFlowReturn gst_amf_encoder_finish (GstVideoEncoder * encoder); +static gboolean gst_amf_encoder_flush (GstVideoEncoder * encoder); +static gboolean gst_amf_encoder_sink_query (GstVideoEncoder * encoder, + GstQuery * query); +static gboolean gst_amf_encoder_src_query (GstVideoEncoder * encoder, + GstQuery * query); +static gboolean gst_amf_encoder_propose_allocation (GstVideoEncoder * encoder, + GstQuery * query); + +static void +gst_amf_encoder_class_init (GstAmfEncoderClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoEncoderClass *videoenc_class = GST_VIDEO_ENCODER_CLASS (klass); + + object_class->dispose = gst_amf_encoder_dispose; + object_class->finalize = gst_amf_encoder_finalize; + + element_class->set_context = GST_DEBUG_FUNCPTR (gst_amf_encoder_set_context); + + videoenc_class->open = GST_DEBUG_FUNCPTR (gst_amf_encoder_open); + videoenc_class->stop = GST_DEBUG_FUNCPTR (gst_amf_encoder_stop); + videoenc_class->close = GST_DEBUG_FUNCPTR (gst_amf_encoder_close); + videoenc_class->set_format = GST_DEBUG_FUNCPTR (gst_amf_encoder_set_format); + videoenc_class->handle_frame = + GST_DEBUG_FUNCPTR (gst_amf_encoder_handle_frame); + videoenc_class->finish = GST_DEBUG_FUNCPTR (gst_amf_encoder_finish); + videoenc_class->flush = GST_DEBUG_FUNCPTR (gst_amf_encoder_flush); + videoenc_class->sink_query = GST_DEBUG_FUNCPTR (gst_amf_encoder_sink_query); + videoenc_class->src_query = GST_DEBUG_FUNCPTR (gst_amf_encoder_src_query); + videoenc_class->propose_allocation = + GST_DEBUG_FUNCPTR (gst_amf_encoder_propose_allocation); + + GST_DEBUG_CATEGORY_INIT (gst_amf_encoder_debug, + "amfencoder", 0, "amfencoder"); + + gst_type_mark_as_plugin_api (GST_TYPE_AMF_ENCODER, (GstPluginAPIFlags) 0); +} + +static void +gst_amf_encoder_init (GstAmfEncoder * self) +{ + GstAmfEncoderPrivate *priv; + TIMECAPS time_caps; + + priv = self->priv = + (GstAmfEncoderPrivate *) gst_amf_encoder_get_instance_private (self); + + gst_video_encoder_set_min_pts (GST_VIDEO_ENCODER (self), + GST_SECOND * 60 * 60 * 1000); + + if (timeGetDevCaps (&time_caps, sizeof (TIMECAPS)) == TIMERR_NOERROR) { + guint resolution; + MMRESULT ret; + + resolution = MIN (MAX (time_caps.wPeriodMin, 1), time_caps.wPeriodMax); + ret = timeBeginPeriod (resolution); + if (ret == TIMERR_NOERROR) + priv->timer_resolution = resolution; + } +} + +static void +gst_amf_encoder_dispose (GObject * object) +{ + GstAmfEncoder *self = GST_AMF_ENCODER (object); + GstAmfEncoderPrivate *priv = self->priv; + + gst_clear_object (&priv->device); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_amf_encoder_finalize (GObject * object) +{ + GstAmfEncoder *self = GST_AMF_ENCODER (object); + GstAmfEncoderPrivate *priv = self->priv; + + if (priv->timer_resolution) + timeEndPeriod (priv->timer_resolution); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_amf_encoder_set_context (GstElement * element, GstContext * context) +{ + GstAmfEncoder *self = GST_AMF_ENCODER (element); + GstAmfEncoderPrivate *priv = self->priv; + + gst_d3d11_handle_set_context_for_adapter_luid (element, + context, priv->adapter_luid, &priv->device); + + GST_ELEMENT_CLASS (parent_class)->set_context (element, context); +} + +static gboolean +gst_amf_encoder_open (GstVideoEncoder * encoder) +{ + GstAmfEncoder *self = GST_AMF_ENCODER (encoder); + GstAmfEncoderPrivate *priv = self->priv; + ComPtr < ID3D10Multithread > multi_thread; + ID3D11Device *device_handle; + AMFFactory *factory = (AMFFactory *) gst_amf_get_factory (); + AMF_RESULT result; + HRESULT hr; + D3D_FEATURE_LEVEL feature_level; + AMF_DX_VERSION dx_ver = AMF_DX11_1; + + if (!gst_d3d11_ensure_element_data_for_adapter_luid (GST_ELEMENT (self), + priv->adapter_luid, &priv->device)) { + GST_ERROR_OBJECT (self, "d3d11 device is unavailable"); + return FALSE; + } + + device_handle = gst_d3d11_device_get_device_handle (priv->device); + feature_level = device_handle->GetFeatureLevel (); + if (feature_level >= D3D_FEATURE_LEVEL_11_1) + dx_ver = AMF_DX11_1; + else + dx_ver = AMF_DX11_0; + + hr = device_handle->QueryInterface (IID_PPV_ARGS (&multi_thread)); + if (!gst_d3d11_result (hr, priv->device)) { + GST_ERROR_OBJECT (self, "ID3D10Multithread interface is unavailable"); + goto error; + } + + multi_thread->SetMultithreadProtected (TRUE); + + result = factory->CreateContext (&priv->context); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to create context"); + goto error; + } + + result = priv->context->InitDX11 (device_handle, dx_ver); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to init context"); + goto error; + } + + return TRUE; + +error: + gst_clear_object (&priv->device); + if (priv->context) + priv->context->Release (); + priv->context = nullptr; + + return FALSE; +} + +static gboolean +gst_amf_encoder_reset (GstAmfEncoder * self) +{ + GstAmfEncoderPrivate *priv = self->priv; + + GST_LOG_OBJECT (self, "Reset"); + + if (priv->internal_pool) { + gst_buffer_pool_set_active (priv->internal_pool, FALSE); + gst_clear_object (&priv->internal_pool); + } + + if (priv->comp) { + priv->comp->Terminate (); + priv->comp->Release (); + priv->comp = nullptr; + } + + return TRUE; +} + +static GstFlowReturn +gst_amf_encoder_process_output (GstAmfEncoder * self, AMFBuffer * buffer) +{ + GstAmfEncoderClass *klass = GST_AMF_ENCODER_GET_CLASS (self); + GstVideoEncoder *venc = GST_VIDEO_ENCODER_CAST (self); + AMF_RESULT result; + GstVideoCodecFrame *frame = nullptr; + GstBuffer *output_buffer; + gboolean sync_point = FALSE; + + GST_TRACE_OBJECT (self, "Process output"); + + if (buffer->HasProperty (GST_AMF_BUFFER_PROP)) { + AMFInterfacePtr iface; + result = buffer->GetProperty (GST_AMF_BUFFER_PROP, &iface); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to get prop buffer, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + } else { + AMFBufferPtr prop_buffer = AMFBufferPtr (iface); + if (prop_buffer) { + guint32 system_frame_number = *((guint32 *) prop_buffer->GetNative ()); + frame = gst_video_encoder_get_frame (venc, system_frame_number); + } + } + } else { + GST_WARNING_OBJECT (self, "AMFData does not hold user data"); + } + + if (!frame) { + GST_WARNING_OBJECT (self, "Failed to get find associated codec frame"); + frame = gst_video_encoder_get_oldest_frame (venc); + } + + output_buffer = klass->create_output_buffer (self, buffer, &sync_point); + + if (!output_buffer) { + GST_WARNING_OBJECT (self, "Empty output buffer"); + return GST_FLOW_OK; + } + + GST_BUFFER_FLAG_SET (output_buffer, GST_BUFFER_FLAG_MARKER); + + if (frame) { + frame->output_buffer = output_buffer; + + if (sync_point) + GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); + } else { + if (!sync_point) + GST_BUFFER_FLAG_SET (output_buffer, GST_BUFFER_FLAG_DELTA_UNIT); + + return gst_pad_push (GST_VIDEO_ENCODER_SRC_PAD (self), output_buffer); + } + + gst_video_codec_frame_set_user_data (frame, nullptr, nullptr); + + return gst_video_encoder_finish_frame (venc, frame); +} + +static AMF_RESULT +gst_amf_encoder_query_output (GstAmfEncoder * self, AMFBuffer ** buffer) +{ + GstAmfEncoderPrivate *priv = self->priv; + AMF_RESULT result; + AMFDataPtr data; + AMFBufferPtr buf; + + result = priv->comp->QueryOutput (&data); + if (result != AMF_OK) + return result; + + if (!data) { + GST_LOG_OBJECT (self, "Empty data"); + return AMF_REPEAT; + } + + buf = AMFBufferPtr (data); + if (!buf) { + GST_ERROR_OBJECT (self, "Failed to convert data to buffer"); + return AMF_NO_INTERFACE; + } + + *buffer = buf.Detach (); + + return AMF_OK; +} + +static GstFlowReturn +gst_amf_encoder_try_output (GstAmfEncoder * self, gboolean do_wait) +{ + GstFlowReturn ret = GST_FLOW_OK; + + do { + AMFBufferPtr buffer; + AMF_RESULT result = gst_amf_encoder_query_output (self, &buffer); + + if (buffer) { + ret = gst_amf_encoder_process_output (self, buffer.GetPtr ()); + if (ret != GST_FLOW_OK) { + GST_INFO_OBJECT (self, "Process output returned %s", + gst_flow_get_name (ret)); + } + } else if (result == AMF_REPEAT || result == AMF_OK) { + GST_TRACE_OBJECT (self, "Output is not ready, do_wait %d", do_wait); + if (do_wait) { + g_usleep (1000); + } else { + ret = GST_AMF_ENCODER_FLOW_TRY_AGAIN; + } + } else if (result == AMF_EOF) { + GST_DEBUG_OBJECT (self, "Output queue is drained"); + ret = GST_VIDEO_ENCODER_FLOW_NEED_DATA; + } else { + GST_ERROR_OBJECT (self, "query output returned %" GST_AMF_RESULT_FORMAT, + GST_AMF_RESULT_ARGS (result)); + ret = GST_FLOW_ERROR; + } + } while (ret == GST_FLOW_OK); + + return ret; +} + +static gboolean +gst_amf_encoder_drain (GstAmfEncoder * self, gboolean flushing) +{ + GstAmfEncoderPrivate *priv = self->priv; + AMF_RESULT result; + + if (!priv->comp) + return TRUE; + + GST_DEBUG_OBJECT (self, "%s", flushing ? "Flush" : "Drain"); + if (flushing) + goto done; + + result = priv->comp->Drain (); + if (result != AMF_OK) { + GST_WARNING_OBJECT (self, "Drain returned %" GST_AMF_RESULT_FORMAT, + GST_AMF_RESULT_ARGS (result)); + goto done; + } + + gst_amf_encoder_try_output (self, TRUE); + +done: + gst_amf_encoder_reset (self); + + return TRUE; +} + +static gboolean +gst_amf_encoder_stop (GstVideoEncoder * encoder) +{ + GstAmfEncoder *self = GST_AMF_ENCODER (encoder); + GstAmfEncoderPrivate *priv = self->priv; + + GST_DEBUG_OBJECT (self, "Stop"); + + gst_amf_encoder_drain (self, TRUE); + + g_clear_pointer (&priv->input_state, gst_video_codec_state_unref); + + return TRUE; +} + +static gboolean +gst_amf_encoder_close (GstVideoEncoder * encoder) +{ + GstAmfEncoder *self = GST_AMF_ENCODER (encoder); + GstAmfEncoderPrivate *priv = self->priv; + + GST_DEBUG_OBJECT (self, "Close"); + + if (priv->context) { + priv->context->Terminate (); + priv->context->Release (); + priv->context = nullptr; + } + + gst_clear_d3d11_fence (&priv->fence); + gst_clear_object (&priv->device); + + return TRUE; +} + +static gboolean +gst_amf_encoder_prepare_internal_pool (GstAmfEncoder * self) +{ + GstAmfEncoderPrivate *priv = self->priv; + GstVideoInfo *info = &priv->input_state->info; + GstCaps *caps = priv->input_state->caps; + GstStructure *config; + GstD3D11AllocationParams *params; + + if (priv->internal_pool) { + gst_buffer_pool_set_active (priv->internal_pool, FALSE); + gst_clear_object (&priv->internal_pool); + } + + priv->internal_pool = gst_d3d11_buffer_pool_new (priv->device); + config = gst_buffer_pool_get_config (priv->internal_pool); + gst_buffer_pool_config_set_params (config, caps, + GST_VIDEO_INFO_SIZE (info), 0, 0); + + params = gst_d3d11_allocation_params_new (priv->device, info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, 0, 0); + params->desc0.MiscFlags = D3D11_RESOURCE_MISC_SHARED; + + gst_buffer_pool_config_set_d3d11_allocation_params (config, params); + gst_d3d11_allocation_params_free (params); + + if (!gst_buffer_pool_set_config (priv->internal_pool, config)) { + GST_ERROR_OBJECT (self, "Failed to set config"); + gst_clear_object (&priv->internal_pool); + return FALSE; + } + + if (!gst_buffer_pool_set_active (priv->internal_pool, TRUE)) { + GST_ERROR_OBJECT (self, "Failed to set active"); + gst_clear_object (&priv->internal_pool); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_amf_encoder_open_component (GstAmfEncoder * self) +{ + GstAmfEncoderClass *klass = GST_AMF_ENCODER_GET_CLASS (self); + GstAmfEncoderPrivate *priv = self->priv; + AMFFactory *factory = (AMFFactory *) gst_amf_get_factory (); + AMFComponentPtr comp; + AMF_RESULT result; + + gst_amf_encoder_drain (self, FALSE); + + if (!gst_amf_encoder_prepare_internal_pool (self)) + return FALSE; + + result = factory->CreateComponent (priv->context, priv->codec_id, &comp); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to create component, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + return FALSE; + } + + if (!klass->set_format (self, priv->input_state, comp.GetPtr ())) { + GST_ERROR_OBJECT (self, "Failed to set format"); + return FALSE; + } + + if (!klass->set_output_state (self, priv->input_state, comp.GetPtr ())) { + GST_ERROR_OBJECT (self, "Failed to set output state"); + return FALSE; + } + + priv->comp = comp.Detach (); + + return TRUE; +} + +static gboolean +gst_amf_encoder_set_format (GstVideoEncoder * encoder, + GstVideoCodecState * state) +{ + GstAmfEncoder *self = GST_AMF_ENCODER (encoder); + GstAmfEncoderPrivate *priv = self->priv; + + g_clear_pointer (&priv->input_state, gst_video_codec_state_unref); + priv->input_state = gst_video_codec_state_ref (state); + + return gst_amf_encoder_open_component (self); +} + +static GstBuffer * +gst_amf_encoder_upload_sysmem (GstAmfEncoder * self, GstBuffer * src_buf, + const GstVideoInfo * info) +{ + GstAmfEncoderPrivate *priv = self->priv; + GstVideoFrame src_frame, dst_frame; + GstBuffer *dst_buf; + GstFlowReturn ret; + + GST_TRACE_OBJECT (self, "Uploading sysmem buffer"); + + ret = gst_buffer_pool_acquire_buffer (priv->internal_pool, &dst_buf, nullptr); + if (ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (self, "Failed to acquire buffer"); + return nullptr; + } + + if (!gst_video_frame_map (&src_frame, info, src_buf, GST_MAP_READ)) { + GST_WARNING ("Failed to map src frame"); + gst_buffer_unref (dst_buf); + return nullptr; + } + + if (!gst_video_frame_map (&dst_frame, info, dst_buf, GST_MAP_WRITE)) { + GST_WARNING ("Failed to map src frame"); + gst_video_frame_unmap (&src_frame); + gst_buffer_unref (dst_buf); + return nullptr; + } + + for (guint i = 0; i < GST_VIDEO_FRAME_N_PLANES (&src_frame); i++) { + guint src_width_in_bytes, src_height; + guint dst_width_in_bytes, dst_height; + guint width_in_bytes, height; + guint src_stride, dst_stride; + guint8 *src_data, *dst_data; + + src_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&src_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&src_frame, i); + src_height = GST_VIDEO_FRAME_COMP_HEIGHT (&src_frame, i); + src_stride = GST_VIDEO_FRAME_COMP_STRIDE (&src_frame, i); + + dst_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&dst_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&src_frame, i); + dst_height = GST_VIDEO_FRAME_COMP_HEIGHT (&src_frame, i); + dst_stride = GST_VIDEO_FRAME_COMP_STRIDE (&dst_frame, i); + + width_in_bytes = MIN (src_width_in_bytes, dst_width_in_bytes); + height = MIN (src_height, dst_height); + + src_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&src_frame, i); + dst_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&dst_frame, i); + + for (guint j = 0; j < height; j++) { + memcpy (dst_data, src_data, width_in_bytes); + dst_data += dst_stride; + src_data += src_stride; + } + } + + gst_video_frame_unmap (&dst_frame); + gst_video_frame_unmap (&src_frame); + + return dst_buf; +} + +static GstBuffer * +gst_amf_encoder_copy_d3d11 (GstAmfEncoder * self, GstBuffer * src_buffer, + gboolean shared) +{ + GstAmfEncoderPrivate *priv = self->priv; + D3D11_TEXTURE2D_DESC src_desc, dst_desc; + D3D11_BOX src_box; + guint subresource_idx; + GstMemory *src_mem, *dst_mem; + GstMapInfo src_info, dst_info; + ID3D11Texture2D *src_tex, *dst_tex; + ID3D11Device *device_handle; + ID3D11DeviceContext *device_context; + GstBuffer *dst_buffer; + GstFlowReturn ret; + ComPtr < IDXGIResource > dxgi_resource; + ComPtr < ID3D11Texture2D > shared_texture; + HANDLE shared_handle; + GstD3D11Device *device; + HRESULT hr; + + ret = gst_buffer_pool_acquire_buffer (priv->internal_pool, + &dst_buffer, nullptr); + if (ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (self, "Failed to acquire buffer"); + return nullptr; + } + + src_mem = gst_buffer_peek_memory (src_buffer, 0); + dst_mem = gst_buffer_peek_memory (dst_buffer, 0); + + device = GST_D3D11_MEMORY_CAST (src_mem)->device; + + device_handle = gst_d3d11_device_get_device_handle (device); + device_context = gst_d3d11_device_get_device_context_handle (device); + + if (!gst_memory_map (src_mem, &src_info, + (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Failed to map src memory"); + gst_buffer_unref (dst_buffer); + return nullptr; + } + + if (!gst_memory_map (dst_mem, &dst_info, + (GstMapFlags) (GST_MAP_WRITE | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Failed to map dst memory"); + gst_memory_unmap (src_mem, &src_info); + gst_buffer_unref (dst_buffer); + return nullptr; + } + + src_tex = (ID3D11Texture2D *) src_info.data; + dst_tex = (ID3D11Texture2D *) dst_info.data; + + gst_d3d11_memory_get_texture_desc (GST_D3D11_MEMORY_CAST (src_mem), + &src_desc); + gst_d3d11_memory_get_texture_desc (GST_D3D11_MEMORY_CAST (dst_mem), + &dst_desc); + subresource_idx = + gst_d3d11_memory_get_subresource_index (GST_D3D11_MEMORY_CAST (src_mem)); + + if (shared) { + hr = dst_tex->QueryInterface (IID_PPV_ARGS (&dxgi_resource)); + if (!gst_d3d11_result (hr, priv->device)) { + GST_ERROR_OBJECT (self, + "IDXGIResource interface is not available, hr: 0x%x", (guint) hr); + goto error; + } + + hr = dxgi_resource->GetSharedHandle (&shared_handle); + if (!gst_d3d11_result (hr, priv->device)) { + GST_ERROR_OBJECT (self, "Failed to get shared handle, hr: 0x%x", + (guint) hr); + goto error; + } + + hr = device_handle->OpenSharedResource (shared_handle, + IID_PPV_ARGS (&shared_texture)); + + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Failed to get shared texture, hr: 0x%x", + (guint) hr); + goto error; + } + + dst_tex = shared_texture.Get (); + } + + src_box.left = 0; + src_box.top = 0; + src_box.front = 0; + src_box.back = 1; + src_box.right = MIN (src_desc.Width, dst_desc.Width); + src_box.bottom = MIN (src_desc.Height, dst_desc.Height); + + if (shared) { + if (priv->fence && priv->fence->device != device) + gst_clear_d3d11_fence (&priv->fence); + + if (!priv->fence) + priv->fence = gst_d3d11_device_create_fence (device); + + if (!priv->fence) { + GST_ERROR_OBJECT (self, "Couldn't crete fence"); + goto error; + } + + gst_d3d11_device_lock (device); + } + + device_context->CopySubresourceRegion (dst_tex, 0, + 0, 0, 0, src_tex, subresource_idx, &src_box); + + if (shared) { + if (!gst_d3d11_fence_signal (priv->fence) || + !gst_d3d11_fence_wait (priv->fence)) { + GST_ERROR_OBJECT (self, "Couldn't sync GPU operation"); + gst_d3d11_device_unlock (device); + gst_clear_d3d11_fence (&priv->fence); + goto error; + } + + gst_d3d11_device_unlock (device); + } + + gst_memory_unmap (dst_mem, &dst_info); + gst_memory_unmap (src_mem, &src_info); + + return dst_buffer; + +error: + gst_memory_unmap (dst_mem, &dst_info); + gst_memory_unmap (src_mem, &src_info); + gst_buffer_unref (dst_buffer); + + return nullptr; +} + +static GstBuffer * +gst_amf_encoder_upload_buffer (GstAmfEncoder * self, GstBuffer * buffer) +{ + GstAmfEncoderPrivate *priv = self->priv; + GstVideoInfo *info = &priv->input_state->info; + GstMemory *mem; + GstD3D11Memory *dmem; + D3D11_TEXTURE2D_DESC desc; + GstBuffer *ret; + + mem = gst_buffer_peek_memory (buffer, 0); + if (!gst_is_d3d11_memory (mem) || gst_buffer_n_memory (buffer) > 1) { + /* d3d11 buffer should hold single memory object */ + return gst_amf_encoder_upload_sysmem (self, buffer, info); + } + + dmem = GST_D3D11_MEMORY_CAST (mem); + if (dmem->device != priv->device) { + gint64 adapter_luid; + + g_object_get (dmem->device, "adapter-luid", &adapter_luid, nullptr); + if (adapter_luid == priv->adapter_luid) { + GST_LOG_OBJECT (self, "Different device but same GPU, copy d3d11"); + gst_d3d11_device_lock (priv->device); + ret = gst_amf_encoder_copy_d3d11 (self, buffer, TRUE); + gst_d3d11_device_unlock (priv->device); + + return ret; + } else { + GST_LOG_OBJECT (self, "Different device, system copy"); + return gst_amf_encoder_upload_sysmem (self, buffer, info); + } + } + + gst_d3d11_memory_get_texture_desc (dmem, &desc); + if (desc.Usage != D3D11_USAGE_DEFAULT) { + GST_TRACE_OBJECT (self, "Not a default usage texture, d3d11 copy"); + gst_d3d11_device_lock (priv->device); + ret = gst_amf_encoder_copy_d3d11 (self, buffer, FALSE); + gst_d3d11_device_unlock (priv->device); + + return ret; + } + + return gst_buffer_ref (buffer); +} + +static void +gst_amf_frame_data_free (GstAmfEncoderFrameData * data) +{ + if (!data) + return; + + gst_buffer_unmap (data->buffer, &data->info); + gst_buffer_unref (data->buffer); + g_free (data); +} + +static GstFlowReturn +gst_amf_encoder_submit_input (GstAmfEncoder * self, AMFSurface * surface) +{ + GstAmfEncoderPrivate *priv = self->priv; + AMF_RESULT result; + GstFlowReturn ret = GST_FLOW_OK; + + do { + result = priv->comp->SubmitInput (surface); + if (result == AMF_OK || result == AMF_NEED_MORE_INPUT) { + GST_TRACE_OBJECT (self, "SubmitInput returned %" GST_AMF_RESULT_FORMAT, + GST_AMF_RESULT_ARGS (result)); + ret = GST_FLOW_OK; + break; + } + + if (result != AMF_INPUT_FULL) { + GST_ERROR_OBJECT (self, "SubmitInput returned %" GST_AMF_RESULT_FORMAT, + GST_AMF_RESULT_ARGS (result)); + ret = GST_FLOW_ERROR; + break; + } + + /* When submit queue is full, QueryInput() that returns no buffer MUST be + * followed by another SubmitInput(), otherwise no buffer will ever get + * returned. Therefore we're passing FALSE as do_wait here. */ + ret = gst_amf_encoder_try_output (self, FALSE); + if (ret == GST_AMF_ENCODER_FLOW_TRY_AGAIN) { + g_usleep (1000); + } else if (ret != GST_FLOW_OK) { + GST_INFO_OBJECT (self, "Try output returned %s", gst_flow_get_name (ret)); + break; + } + } while (TRUE); + + return ret; +} + +static GstFlowReturn +gst_amf_encoder_handle_frame (GstVideoEncoder * encoder, + GstVideoCodecFrame * frame) +{ + GstAmfEncoder *self = GST_AMF_ENCODER (encoder); + GstAmfEncoderClass *klass = GST_AMF_ENCODER_GET_CLASS (self); + GstAmfEncoderPrivate *priv = self->priv; + GstVideoInfo *info = &priv->input_state->info; + GstBuffer *buffer; + AMFBufferPtr user_data; + AMFSurfacePtr surface; + AMF_RESULT result; + guint32 *system_frame_number; + guint subresource_index; + GstAmfEncoderFrameData *frame_data; + ID3D11Texture2D *texture; + gboolean need_reconfigure; + GstFlowReturn ret; + + if (!priv->comp && !gst_amf_encoder_open_component (self)) { + GST_ERROR_OBJECT (self, "Encoder object was not configured"); + goto error; + } + + need_reconfigure = klass->check_reconfigure (self); + if (need_reconfigure && !gst_amf_encoder_open_component (self)) { + GST_ERROR_OBJECT (self, "Failed to reconfigure encoder"); + goto error; + } + + result = priv->context->AllocBuffer (AMF_MEMORY_HOST, + sizeof (guint32), &user_data); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to allocate user data buffer, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + system_frame_number = (guint32 *) user_data->GetNative (); + *system_frame_number = frame->system_frame_number; + + buffer = gst_amf_encoder_upload_buffer (self, frame->input_buffer); + if (!buffer) + goto error; + + frame_data = g_new0 (GstAmfEncoderFrameData, 1); + frame_data->buffer = buffer; + gst_buffer_map (frame_data->buffer, &frame_data->info, + (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11)); + gst_video_codec_frame_set_user_data (frame, frame_data, + (GDestroyNotify) gst_amf_frame_data_free); + + subresource_index = GPOINTER_TO_UINT (frame_data->info.user_data0); + + gst_d3d11_device_lock (priv->device); + texture = (ID3D11Texture2D *) frame_data->info.data; + texture->SetPrivateData (AMFTextureArrayIndexGUID, + sizeof (guint), &subresource_index); + result = priv->context->CreateSurfaceFromDX11Native (texture, + &surface, nullptr); + gst_d3d11_device_unlock (priv->device); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to create surface, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + surface->SetCrop (0, 0, info->width, info->height); + surface->SetPts (frame->pts / 100); + if (GST_CLOCK_TIME_IS_VALID (frame->duration)) + surface->SetDuration (frame->duration / 100); + + result = surface->SetProperty (GST_AMF_BUFFER_PROP, user_data); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set user data on AMF surface"); + goto error; + } + + klass->set_surface_prop (self, frame, surface.GetPtr ()); + gst_video_codec_frame_unref (frame); + + ret = gst_amf_encoder_submit_input (self, surface.GetPtr ()); + if (ret == GST_FLOW_OK) + ret = gst_amf_encoder_try_output (self, FALSE); + if (ret == GST_AMF_ENCODER_FLOW_TRY_AGAIN) + ret = GST_FLOW_OK; + + return ret; + +error: + gst_video_encoder_finish_frame (encoder, frame); + + return GST_FLOW_ERROR; +} + +static GstFlowReturn +gst_amf_encoder_finish (GstVideoEncoder * encoder) +{ + GstAmfEncoder *self = GST_AMF_ENCODER (encoder); + + GST_DEBUG_OBJECT (self, "Finish"); + + gst_amf_encoder_drain (self, FALSE); + + return GST_FLOW_OK; +} + +static gboolean +gst_amf_encoder_flush (GstVideoEncoder * encoder) +{ + GstAmfEncoder *self = GST_AMF_ENCODER (encoder); + + GST_DEBUG_OBJECT (self, "Flush"); + + gst_amf_encoder_drain (self, TRUE); + + return TRUE; +} + +static gboolean +gst_amf_encoder_handle_context_query (GstAmfEncoder * self, GstQuery * query) +{ + GstAmfEncoderPrivate *priv = self->priv; + + return gst_d3d11_handle_context_query (GST_ELEMENT (self), query, + priv->device); +} + +static gboolean +gst_amf_encoder_sink_query (GstVideoEncoder * encoder, GstQuery * query) +{ + GstAmfEncoder *self = GST_AMF_ENCODER (encoder); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + if (gst_amf_encoder_handle_context_query (self, query)) + return TRUE; + break; + default: + break; + } + + return GST_VIDEO_ENCODER_CLASS (parent_class)->sink_query (encoder, query); +} + +static gboolean +gst_amf_encoder_src_query (GstVideoEncoder * encoder, GstQuery * query) +{ + GstAmfEncoder *self = GST_AMF_ENCODER (encoder); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + if (gst_amf_encoder_handle_context_query (self, query)) + return TRUE; + break; + default: + break; + } + + return GST_VIDEO_ENCODER_CLASS (parent_class)->src_query (encoder, query); +} + +static gboolean +gst_amf_encoder_propose_allocation (GstVideoEncoder * encoder, GstQuery * query) +{ + GstAmfEncoder *self = GST_AMF_ENCODER (encoder); + GstAmfEncoderPrivate *priv = self->priv; + GstD3D11Device *device = GST_D3D11_DEVICE (priv->device); + GstVideoInfo info; + GstBufferPool *pool; + GstCaps *caps; + guint size; + GstStructure *config; + GstCapsFeatures *features; + gboolean is_d3d11 = FALSE; + guint min_buffers = 0; + + gst_query_parse_allocation (query, &caps, nullptr); + if (!caps) { + GST_WARNING_OBJECT (self, "null caps in query"); + return FALSE; + } + + if (!gst_video_info_from_caps (&info, caps)) { + GST_WARNING_OBJECT (self, "Failed to convert caps into info"); + return FALSE; + } + + features = gst_caps_get_features (caps, 0); + if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { + GST_DEBUG_OBJECT (self, "upstream support d3d11 memory"); + pool = gst_d3d11_buffer_pool_new (device); + is_d3d11 = TRUE; + + /* XXX: AMF API does not provide information about internal queue size, + * use hardcoded value 16 */ + min_buffers = 16; + } else { + pool = gst_video_buffer_pool_new (); + } + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + if (!is_d3d11) { + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); + } + + size = GST_VIDEO_INFO_SIZE (&info); + gst_buffer_pool_config_set_params (config, caps, size, min_buffers, 0); + + if (!gst_buffer_pool_set_config (pool, config)) { + GST_WARNING_OBJECT (self, "Failed to set pool config"); + gst_object_unref (pool); + return FALSE; + } + + /* d3d11 buffer pool will update actual CPU accessible buffer size based on + * allocated staging texture per gst_buffer_pool_set_config() call, + * need query again to get the size */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); + + gst_query_add_allocation_pool (query, pool, size, min_buffers, 0); + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, nullptr); + gst_object_unref (pool); + + return TRUE; +} + +void +gst_amf_encoder_set_subclass_data (GstAmfEncoder * encoder, gint64 adapter_luid, + const wchar_t *codec_id) +{ + GstAmfEncoderPrivate *priv; + + g_return_if_fail (GST_IS_AMF_ENCODER (encoder)); + + priv = encoder->priv; + priv->adapter_luid = adapter_luid; + priv->codec_id = codec_id; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/gstamfencoder.h
Added
@@ -0,0 +1,78 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include "gstamfutils.h" + +G_BEGIN_DECLS + +#define GST_TYPE_AMF_ENCODER (gst_amf_encoder_get_type()) +#define GST_AMF_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_AMF_ENCODER, GstAmfEncoder)) +#define GST_AMF_ENCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_AMF_ENCODER, GstAmfEncoderClass)) +#define GST_IS_AMF_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_AMF_ENCODER)) +#define GST_IS_AMF_ENCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_AMF_ENCODER)) +#define GST_AMF_ENCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_AMF_ENCODER, GstAmfEncoderClass)) +#define GST_AMF_ENCODER_CAST(obj) ((GstAmfEncoder *)obj) + +typedef struct _GstAmfEncoder GstAmfEncoder; +typedef struct _GstAmfEncoderClass GstAmfEncoderClass; +typedef struct _GstAmfEncoderPrivate GstAmfEncoderPrivate; + +struct _GstAmfEncoder +{ + GstVideoEncoder parent; + + GstAmfEncoderPrivate *priv; +}; + +struct _GstAmfEncoderClass +{ + GstVideoEncoderClass parent_class; + + gboolean (*set_format) (GstAmfEncoder * encoder, + GstVideoCodecState * state, + gpointer component); + + gboolean (*set_output_state) (GstAmfEncoder * encoder, + GstVideoCodecState * state, + gpointer component); + + gboolean (*set_surface_prop) (GstAmfEncoder * encoder, + GstVideoCodecFrame * frame, + gpointer surface); + + GstBuffer * (*create_output_buffer) (GstAmfEncoder * encoder, + gpointer data, + gboolean * sync_point); + + gboolean (*check_reconfigure) (GstAmfEncoder * encoder); +}; + +GType gst_amf_encoder_get_type (void); + +void gst_amf_encoder_set_subclass_data (GstAmfEncoder * encoder, + gint64 adapter_luid, + const wchar_t * codec_id); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstAmfEncoder, gst_object_unref) + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/gstamfh264enc.cpp
Added
@@ -0,0 +1,1627 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-amfh264enc + * @title: amfh264enc + * @short_description: An AMD AMF API based H.264 video encoder + * + * amfh264enc element encodes raw video stream into compressed H.264 bitstream + * via AMD AMF API. + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc num-buffers=100 ! amfh264enc ! h264parse ! mp4mux ! filesink location=encoded.mp4 + * ``` + * + * Since: 1.22 + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstamfh264enc.h" +#include <components/Component.h> +#include <components/VideoEncoderVCE.h> +#include <core/Factory.h> +#include <gst/codecparsers/gsth264parser.h> +#include <gst/pbutils/codec-utils.h> +#include <string> +#include <set> +#include <string.h> + +using namespace amf; + +GST_DEBUG_CATEGORY_STATIC (gst_amf_h264_enc_debug); +#define GST_CAT_DEFAULT gst_amf_h264_enc_debug + +static GTypeClass *parent_class = nullptr; + +typedef struct +{ + amf_int64 max_bitrate; + amf_int64 num_of_streams; + amf_int64 max_profile; + amf_int64 max_level; + amf_int64 bframes; + amf_int64 min_ref_frames; + amf_int64 max_ref_frames; + amf_int64 max_temporal_layers; + amf_int64 fixed_slice_mode; + amf_int64 num_of_hw_instances; + amf_int64 color_conversion; + amf_int64 pre_analysis; + amf_int64 roi_map; + amf_int64 max_throughput; + amf_int64 query_timeout_support; + amf_int64 default_qp_i; + amf_int64 default_qp_p; + amf_int64 default_qp_b; + gboolean interlace_supported; + guint valign; +} GstAmfH264EncDeviceCaps; + +/** + * GstAmfH264EncUsage: + * + * Encoder usages + * + * Since: 1.22 + */ +#define GST_TYPE_AMF_H264_ENC_USAGE (gst_amf_h264_enc_usage_get_type ()) +static GType +gst_amf_h264_enc_usage_get_type (void) +{ + static GType usage_type = 0; + static const GEnumValue usages = { + /** + * GstAmfH264EncUsage::transcoding: + * + * Transcoding usage + */ + {AMF_VIDEO_ENCODER_USAGE_TRANSCODING, "Transcoding", "transcoding"}, + + /** + * GstAmfH264EncUsage::ultra-low-latency: + * + * Ultra Low Latency usage + */ + {AMF_VIDEO_ENCODER_USAGE_ULTRA_LOW_LATENCY, "Ultra Low Latency", + "ultra-low-latency"}, + + /** + * GstAmfH264EncUsage::low-latency: + * + * Low Latency usage + */ + {AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY, "Low Latency", "low-latency"}, + + /** + * GstAmfH264EncUsage::webcam: + * + * Webcam usage + */ + {AMF_VIDEO_ENCODER_USAGE_WEBCAM, "Webcam", "webcam"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&usage_type)) { + GType type = g_enum_register_static ("GstAmfH264EncUsage", usages); + g_once_init_leave (&usage_type, type); + } + + return usage_type; +} + +/** + * GstAmfH264EncRateControl: + * + * Rate control methods + * + * Since: 1.22 + */ +#define GST_TYPE_AMF_H264_ENC_RATE_CONTROL (gst_amf_h264_enc_rate_control_get_type ()) +static GType +gst_amf_h264_enc_rate_control_get_type (void) +{ + static GType rate_control_type = 0; + static const GEnumValue rate_controls = { + /** + * GstAmfH264EncRateControl::default: + * + * Default rate control method depending on usage + */ + {AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_UNKNOWN, "Default, depends on Usage", + "default"}, + + /** + * GstAmfH264EncRateControl::cqp: + * + * Constant QP + */ + {AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CONSTANT_QP, "Constant QP", "cqp"}, + + /** + * GstAmfH264EncRateControl::cbr: + * + * Constant Bitrate + */ + {AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CBR, "Constant Bitrate", "cbr"}, + + /** + * GstAmfH264EncRateControl::vbr: + * + * Peak Constrained Variable Bitrate + */ + {AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR, + "Peak Constrained VBR", "vbr"}, + + /** + * GstAmfH264EncRateControl::lcvbr: + * + * Latency Constrained Variable Bitrate + */ + {AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR, + "Latency Constrained VBR", "lcvbr"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&rate_control_type)) { + GType type = + g_enum_register_static ("GstAmfH264EncRateControl", rate_controls); + g_once_init_leave (&rate_control_type, type); + } + + return rate_control_type; +} + +/** + * GstAmfH264EncPreset: + * + * Encoding quality presets + * + * Since: 1.22 + */ +#define AMF_VIDEO_ENCODER_QUALITY_PRESET_UNKNOWN -1 +#define GST_TYPE_AMF_H264_ENC_PRESET (gst_amf_h264_enc_preset_get_type ()) +static GType +gst_amf_h264_enc_preset_get_type (void) +{ + static GType preset_type = 0; + static const GEnumValue presets = { + /** + * GstAmfH264EncRateControl::default: + * + * Default preset depends on usage + */ + {AMF_VIDEO_ENCODER_QUALITY_PRESET_UNKNOWN, "Default, depends on USAGE", + "default"}, + + /** + * GstAmfH264EncRateControl::balanced: + * + * Balanced preset + */ + {AMF_VIDEO_ENCODER_QUALITY_PRESET_BALANCED, "Balanced", "balanced"}, + + /** + * GstAmfH264EncRateControl::speed: + * + * Speed oriented preset + */ + {AMF_VIDEO_ENCODER_QUALITY_PRESET_SPEED, "Speed", "speed"}, + + /** + * GstAmfH264EncRateControl::quality: + * + * Quality oriented preset + */ + {AMF_VIDEO_ENCODER_QUALITY_PRESET_QUALITY, "Quality", "quality"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&preset_type)) { + GType type = g_enum_register_static ("GstAmfH264EncPreset", presets); + g_once_init_leave (&preset_type, type); + } + + return preset_type; +} + +typedef struct +{ + GstCaps *sink_caps; + GstCaps *src_caps; + + gint64 adapter_luid; + + GstAmfH264EncDeviceCaps dev_caps; +} GstAmfH264EncClassData; + +enum +{ + PROP_0, + PROP_ADAPTER_LUID, + PROP_USAGE, + PROP_RATE_CONTROL, + PROP_PRESET, + PROP_BITRATE, + PROP_MAX_BITRATE, + PROP_GOP_SIZE, + PROP_MIN_QP, + PROP_MAX_QP, + PROP_QP_I, + PROP_QP_P, + PROP_REF_FRAMES, + PROP_AUD, + PROP_CABAC, +}; + +#define DEFAULT_USAGE AMF_VIDEO_ENCODER_USAGE_TRANSCODING +#define DEFAULT_RATE_CONTROL AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_UNKNOWN +#define DEFAULT_PRESET AMF_VIDEO_ENCODER_QUALITY_PRESET_UNKNOWN +#define DEFAULT_BITRATE 0 +#define DEFAULT_MAX_BITRATE 0 +#define DEFAULT_GOP_SIZE -1 +#define DEFAULT_MIN_MAX_QP -1 +#define DEFAULT_AUD TRUE +#define DEFAULT_CABAC TRUE + +#define DOC_SINK_CAPS_COMM \ + "format = (string) NV12, " \ + "width = (int) 128, 4096 , height = (int) 128, 4096 " + +#define DOC_SINK_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw, " DOC_SINK_CAPS_COMM + +#define DOC_SRC_CAPS \ + "video/x-h264, width = (int) 128, 4096 , height = (int) 128, 4096 , " \ + "profile = (string) { main, high, constrained-baseline, baseline }, " \ + "stream-format = (string) { avc, byte-stream }, alignment = (string) au" + +typedef struct _GstAmfH264Enc +{ + GstAmfEncoder parent; + + gboolean packetized; + GstH264NalParser *parser; + + GMutex prop_lock; + gboolean property_updated; + + gint usage; + gint rate_control; + gint preset; + guint bitrate; + guint max_bitrate; + gint gop_size; + gint min_qp; + gint max_qp; + guint qp_i; + guint qp_p; + guint ref_frames; + + gboolean aud; + gboolean cabac; +} GstAmfH264Enc; + +typedef struct _GstAmfH264EncClass +{ + GstAmfEncoderClass parent_class; + GstAmfH264EncDeviceCaps dev_caps; + + gint64 adapter_luid; +} GstAmfH264EncClass; + +#define GST_AMF_H264_ENC(object) ((GstAmfH264Enc *) (object)) +#define GST_AMF_H264_ENC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstAmfH264EncClass)) + +static void gst_amf_h264_enc_finalize (GObject * object); +static void gst_amf_h264_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_amf_h264_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstCaps *gst_amf_h264_enc_getcaps (GstVideoEncoder * encoder, + GstCaps * filter); +static gboolean gst_amf_h264_enc_set_format (GstAmfEncoder * encoder, + GstVideoCodecState * state, gpointer component); +static gboolean gst_amf_h264_enc_set_output_state (GstAmfEncoder * encoder, + GstVideoCodecState * state, gpointer component); +static gboolean gst_amf_h264_enc_set_surface_prop (GstAmfEncoder * encoder, + GstVideoCodecFrame * frame, gpointer surface); +static GstBuffer *gst_amf_h264_enc_create_output_buffer (GstAmfEncoder * + encoder, gpointer data, gboolean * sync_point); +static gboolean gst_amf_h264_enc_check_reconfigure (GstAmfEncoder * encoder); + +static void +gst_amf_h264_enc_class_init (GstAmfH264EncClass * klass, gpointer data) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoEncoderClass *videoenc_class = GST_VIDEO_ENCODER_CLASS (klass); + GstAmfEncoderClass *amf_class = GST_AMF_ENCODER_CLASS (klass); + GstAmfH264EncClassData *cdata = (GstAmfH264EncClassData *) data; + GstAmfH264EncDeviceCaps *dev_caps = &cdata->dev_caps; + GParamFlags param_flags = (GParamFlags) (G_PARAM_READWRITE | + GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS); + GstPadTemplate *pad_templ; + GstCaps *doc_caps; + + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + + object_class->finalize = gst_amf_h264_enc_finalize; + object_class->set_property = gst_amf_h264_enc_set_property; + object_class->get_property = gst_amf_h264_enc_get_property; + + g_object_class_install_property (object_class, PROP_ADAPTER_LUID, + g_param_spec_int64 ("adapter-luid", "Adapter LUID", + "DXGI Adapter LUID (Locally Unique Identifier) of associated GPU", + G_MININT64, G_MAXINT64, 0, (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_USAGE, + g_param_spec_enum ("usage", "Usage", + "Target usage", GST_TYPE_AMF_H264_ENC_USAGE, + DEFAULT_USAGE, param_flags)); + g_object_class_install_property (object_class, PROP_RATE_CONTROL, + g_param_spec_enum ("rate-control", "Rate Control", + "Rate Control Method", GST_TYPE_AMF_H264_ENC_RATE_CONTROL, + DEFAULT_RATE_CONTROL, param_flags)); + g_object_class_install_property (object_class, PROP_PRESET, + g_param_spec_enum ("preset", "Preset", + "Preset", GST_TYPE_AMF_H264_ENC_PRESET, DEFAULT_PRESET, param_flags)); + g_object_class_install_property (object_class, PROP_BITRATE, + g_param_spec_uint ("bitrate", "Bitrate", + "Target bitrate in kbit/sec (0: USAGE default)", + 0, G_MAXINT / 1000, DEFAULT_BITRATE, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_BITRATE, + g_param_spec_uint ("max-bitrate", "Max Bitrate", + "Maximum bitrate in kbit/sec (0: USAGE default)", + 0, G_MAXINT / 1000, DEFAULT_MAX_BITRATE, param_flags)); + g_object_class_install_property (object_class, PROP_GOP_SIZE, + g_param_spec_int ("gop-size", "GOP Size", + "Number of pictures within a GOP (-1: USAGE default)", + -1, G_MAXINT, DEFAULT_GOP_SIZE, param_flags)); + g_object_class_install_property (object_class, PROP_MIN_QP, + g_param_spec_int ("min-qp", "Min QP", + "Minimum allowed QP value (-1: USAGE default)", + -1, 51, DEFAULT_MIN_MAX_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_QP, + g_param_spec_int ("max-qp", "Max QP", + "Maximum allowed QP value (-1: USAGE default)", + -1, 51, DEFAULT_MIN_MAX_QP, param_flags)); + g_object_class_install_property (object_class, PROP_QP_I, + g_param_spec_uint ("qp-i", "QP I", + "Constant QP for I frames", 0, 51, + (guint) dev_caps->default_qp_i, param_flags)); + g_object_class_install_property (object_class, PROP_QP_P, + g_param_spec_uint ("qp-p", "QP P", + "Constant QP for P frames", 0, 51, + (guint) dev_caps->default_qp_p, param_flags)); + g_object_class_install_property (object_class, PROP_REF_FRAMES, + g_param_spec_uint ("ref-frames", "Reference Frames", + "Number of reference frames", (guint) dev_caps->min_ref_frames, + (guint) dev_caps->max_ref_frames, + (guint) dev_caps->min_ref_frames, param_flags)); + g_object_class_install_property (object_class, PROP_AUD, + g_param_spec_boolean ("aud", "AUD", + "Use AU (Access Unit) delimiter", DEFAULT_AUD, param_flags)); + g_object_class_install_property (object_class, PROP_CABAC, + g_param_spec_boolean ("cabac", "CABAC", + "Enable CABAC entropy coding", TRUE, param_flags)); + + gst_element_class_set_metadata (element_class, + "AMD AMF H.264 Video Encoder", + "Codec/Encoder/Video/Hardware", + "Encode H.264 video streams using AMF API", + "Seungha Yang <seungha@centricular.com>"); + + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + videoenc_class->getcaps = GST_DEBUG_FUNCPTR (gst_amf_h264_enc_getcaps); + + amf_class->set_format = GST_DEBUG_FUNCPTR (gst_amf_h264_enc_set_format); + amf_class->set_output_state = + GST_DEBUG_FUNCPTR (gst_amf_h264_enc_set_output_state); + amf_class->set_surface_prop = + GST_DEBUG_FUNCPTR (gst_amf_h264_enc_set_surface_prop); + amf_class->create_output_buffer = + GST_DEBUG_FUNCPTR (gst_amf_h264_enc_create_output_buffer); + amf_class->check_reconfigure = + GST_DEBUG_FUNCPTR (gst_amf_h264_enc_check_reconfigure); + + klass->dev_caps = cdata->dev_caps; + klass->adapter_luid = cdata->adapter_luid; + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); + + gst_type_mark_as_plugin_api (GST_TYPE_AMF_H264_ENC_USAGE, + (GstPluginAPIFlags) 0); + gst_type_mark_as_plugin_api (GST_TYPE_AMF_H264_ENC_RATE_CONTROL, + (GstPluginAPIFlags) 0); + gst_type_mark_as_plugin_api (GST_TYPE_AMF_H264_ENC_PRESET, + (GstPluginAPIFlags) 0); +} + +static void +gst_amf_h264_enc_init (GstAmfH264Enc * self) +{ + GstAmfH264EncClass *klass = GST_AMF_H264_ENC_GET_CLASS (self); + GstAmfH264EncDeviceCaps *dev_caps = &klass->dev_caps; + + gst_amf_encoder_set_subclass_data (GST_AMF_ENCODER (self), + klass->adapter_luid, AMFVideoEncoderVCE_AVC); + + self->parser = gst_h264_nal_parser_new (); + + g_mutex_init (&self->prop_lock); + + self->usage = DEFAULT_USAGE; + self->rate_control = DEFAULT_RATE_CONTROL; + self->preset = DEFAULT_PRESET; + self->bitrate = DEFAULT_BITRATE; + self->max_bitrate = DEFAULT_MAX_BITRATE; + self->gop_size = DEFAULT_GOP_SIZE; + self->min_qp = DEFAULT_MIN_MAX_QP; + self->max_qp = DEFAULT_MIN_MAX_QP; + self->qp_i = (guint) dev_caps->default_qp_i; + self->qp_p = (guint) dev_caps->default_qp_p; + self->ref_frames = (guint) dev_caps->min_ref_frames; + self->aud = DEFAULT_AUD; + self->cabac = DEFAULT_CABAC; +} + +static void +gst_amf_h264_enc_finalize (GObject * object) +{ + GstAmfH264Enc *self = GST_AMF_H264_ENC (object); + + gst_h264_nal_parser_free (self->parser); + g_mutex_clear (&self->prop_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +update_int (GstAmfH264Enc * self, gint * old_val, const GValue * new_val) +{ + gint val = g_value_get_int (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->property_updated = TRUE; +} + +static void +update_uint (GstAmfH264Enc * self, guint * old_val, const GValue * new_val) +{ + guint val = g_value_get_uint (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->property_updated = TRUE; +} + +static void +update_enum (GstAmfH264Enc * self, gint * old_val, const GValue * new_val) +{ + gint val = g_value_get_enum (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->property_updated = TRUE; +} + +static void +update_bool (GstAmfH264Enc * self, gboolean * old_val, const GValue * new_val) +{ + gboolean val = g_value_get_boolean (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->property_updated = TRUE; +} + +static void +gst_amf_h264_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAmfH264Enc *self = GST_AMF_H264_ENC (object); + + g_mutex_lock (&self->prop_lock); + switch (prop_id) { + case PROP_USAGE: + update_enum (self, &self->usage, value); + break; + case PROP_RATE_CONTROL: + update_enum (self, &self->rate_control, value); + break; + case PROP_PRESET: + update_enum (self, &self->preset, value); + break; + case PROP_BITRATE: + update_uint (self, &self->bitrate, value); + break; + case PROP_MAX_BITRATE: + update_uint (self, &self->max_bitrate, value); + break; + case PROP_GOP_SIZE: + update_int (self, &self->gop_size, value); + break; + case PROP_MIN_QP: + update_int (self, &self->min_qp, value); + break; + case PROP_MAX_QP: + update_int (self, &self->max_qp, value); + break; + case PROP_QP_I: + update_uint (self, &self->qp_i, value); + break; + case PROP_QP_P: + update_uint (self, &self->qp_p, value); + break; + case PROP_REF_FRAMES: + update_uint (self, &self->ref_frames, value); + break; + case PROP_AUD: + /* This is per frame property, don't need to reset encoder */ + self->aud = g_value_get_boolean (value); + break; + case PROP_CABAC: + update_bool (self, &self->cabac, value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_amf_h264_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAmfH264EncClass *klass = GST_AMF_H264_ENC_GET_CLASS (object); + GstAmfH264Enc *self = GST_AMF_H264_ENC (object); + + switch (prop_id) { + case PROP_ADAPTER_LUID: + g_value_set_int64 (value, klass->adapter_luid); + break; + case PROP_USAGE: + g_value_set_enum (value, self->usage); + break; + case PROP_RATE_CONTROL: + g_value_set_enum (value, self->rate_control); + break; + case PROP_PRESET: + g_value_set_enum (value, self->preset); + break; + case PROP_BITRATE: + g_value_set_uint (value, self->bitrate); + break; + case PROP_MAX_BITRATE: + g_value_set_uint (value, self->max_bitrate); + break; + case PROP_GOP_SIZE: + g_value_set_int (value, self->gop_size); + break; + case PROP_MIN_QP: + g_value_set_int (value, self->min_qp); + break; + case PROP_MAX_QP: + g_value_set_int (value, self->max_qp); + break; + case PROP_QP_I: + g_value_set_uint (value, self->qp_i); + break; + case PROP_QP_P: + g_value_set_uint (value, self->qp_p); + break; + case PROP_REF_FRAMES: + g_value_set_uint (value, self->ref_frames); + break; + case PROP_AUD: + g_value_set_boolean (value, self->aud); + break; + case PROP_CABAC: + g_value_set_boolean (value, self->cabac); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_amf_h264_enc_get_downstream_profiles_and_format (GstAmfH264Enc * self, + std::set < std::string > &downstream_profiles, gboolean * packetized) +{ + GstCaps *allowed_caps; + GstStructure *s; + const gchar *stream_format; + + allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (self)); + + if (!allowed_caps || gst_caps_is_empty (allowed_caps) || + gst_caps_is_any (allowed_caps)) { + gst_clear_caps (&allowed_caps); + + return; + } + + for (guint i = 0; i < gst_caps_get_size (allowed_caps); i++) { + const GValue *profile_value; + const gchar *profile; + + s = gst_caps_get_structure (allowed_caps, i); + profile_value = gst_structure_get_value (s, "profile"); + if (!profile_value) + continue; + + if (GST_VALUE_HOLDS_LIST (profile_value)) { + for (guint j = 0; j < gst_value_list_get_size (profile_value); j++) { + const GValue *p = gst_value_list_get_value (profile_value, j); + + if (!G_VALUE_HOLDS_STRING (p)) + continue; + + profile = g_value_get_string (p); + if (profile) + downstream_profiles.insert (profile); + } + + } else if (G_VALUE_HOLDS_STRING (profile_value)) { + profile = g_value_get_string (profile_value); + if (profile) + downstream_profiles.insert (profile); + } + } + + if (packetized) { + *packetized = FALSE; + allowed_caps = gst_caps_fixate (allowed_caps); + s = gst_caps_get_structure (allowed_caps, 0); + stream_format = gst_structure_get_string (s, "stream-format"); + if (g_strcmp0 (stream_format, "avc") == 0) + *packetized = TRUE; + } + + gst_caps_unref (allowed_caps); +} + +static GstCaps * +gst_amf_h264_enc_getcaps (GstVideoEncoder * encoder, GstCaps * filter) +{ + GstAmfH264Enc *self = GST_AMF_H264_ENC (encoder); + GstAmfH264EncClass *klass = GST_AMF_H264_ENC_GET_CLASS (self); + GstCaps *template_caps; + GstCaps *supported_caps; + std::set < std::string > downstream_profiles; + + if (!klass->dev_caps.interlace_supported) + return gst_video_encoder_proxy_getcaps (encoder, nullptr, filter); + + gst_amf_h264_enc_get_downstream_profiles_and_format (self, + downstream_profiles, nullptr); + + GST_DEBUG_OBJECT (self, "Downstream specified %" G_GSIZE_FORMAT " profiles", + downstream_profiles.size ()); + + if (downstream_profiles.size () == 0) + return gst_video_encoder_proxy_getcaps (encoder, NULL, filter); + + /* Profile allows interlaced? */ + /* *INDENT-OFF* */ + gboolean can_support_interlaced = FALSE; + for (const auto &iter: downstream_profiles) { + if (iter == "high" || iter == "main" || iter == "constrained-high") { + can_support_interlaced = TRUE; + break; + } + } + /* *INDENT-ON* */ + + GST_DEBUG_OBJECT (self, "Downstream %s support interlaced format", + can_support_interlaced ? "can" : "cannot"); + + if (can_support_interlaced) { + /* No special handling is needed */ + return gst_video_encoder_proxy_getcaps (encoder, nullptr, filter); + } + + template_caps = gst_pad_get_pad_template_caps (encoder->sinkpad); + template_caps = gst_caps_make_writable (template_caps); + + gst_caps_set_simple (template_caps, "interlace-mode", G_TYPE_STRING, + "progressive", nullptr); + + supported_caps = gst_video_encoder_proxy_getcaps (encoder, + template_caps, filter); + gst_caps_unref (template_caps); + + GST_DEBUG_OBJECT (self, "Returning %" GST_PTR_FORMAT, supported_caps); + + return supported_caps; +} + +static gboolean +gst_amf_h264_enc_set_format (GstAmfEncoder * encoder, + GstVideoCodecState * state, gpointer component) +{ + GstAmfH264Enc *self = GST_AMF_H264_ENC (encoder); + GstAmfH264EncClass *klass = GST_AMF_H264_ENC_GET_CLASS (self); + GstAmfH264EncDeviceCaps *dev_caps = &klass->dev_caps; + AMFComponent *comp = (AMFComponent *) component; + GstVideoInfo *info = &state->info; + std::set < std::string > downstream_profiles; + AMF_VIDEO_ENCODER_PROFILE_ENUM profile = AMF_VIDEO_ENCODER_PROFILE_UNKNOWN; + AMF_RESULT result; + AMFRate framerate; + AMFRatio aspect_ratio; + amf_int64 int64_val; + amf_bool boolean_val; + AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_ENUM rc_mode; + AMF_VIDEO_ENCODER_CODING_ENUM cabac = AMF_VIDEO_ENCODER_UNDEFINED; + + self->packetized = FALSE; + + gst_amf_h264_enc_get_downstream_profiles_and_format (self, + downstream_profiles, &self->packetized); + + if (downstream_profiles.empty ()) { + GST_ERROR_OBJECT (self, "Unable to get downstream profile"); + return FALSE; + } + + if (GST_VIDEO_INFO_IS_INTERLACED (info)) { + downstream_profiles.erase ("constrained-high"); + downstream_profiles.erase ("constrained-baseline"); + downstream_profiles.erase ("baseline"); + + if (downstream_profiles.empty ()) { + GST_ERROR_OBJECT (self, + "None of downstream profile supports interlaced encoding"); + return FALSE; + } + } + + if (downstream_profiles.find ("main") != downstream_profiles.end ()) { + profile = AMF_VIDEO_ENCODER_PROFILE_MAIN; + } else if (downstream_profiles.find ("high") != downstream_profiles.end ()) { + profile = AMF_VIDEO_ENCODER_PROFILE_HIGH; + } else if (downstream_profiles.find ("constrained-high") != + downstream_profiles.end ()) { + if (dev_caps->max_profile >= + (gint64) AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_HIGH) { + profile = AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_HIGH; + } else { + profile = AMF_VIDEO_ENCODER_PROFILE_HIGH; + } + } else if (downstream_profiles.find ("constrained-baseline") != + downstream_profiles.end ()) { + if (dev_caps->max_profile >= + (gint64) AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_BASELINE) { + profile = AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_BASELINE; + } else { + profile = AMF_VIDEO_ENCODER_PROFILE_BASELINE; + } + } else if (downstream_profiles.find ("baseline") != + downstream_profiles.end ()) { + profile = AMF_VIDEO_ENCODER_PROFILE_BASELINE; + } else { + GST_ERROR_OBJECT (self, "Failed to determine profile"); + return FALSE; + } + + g_mutex_lock (&self->prop_lock); + /* Configure static properties first before Init() */ + result = comp->SetProperty (AMF_VIDEO_ENCODER_FRAMESIZE, + AMFConstructSize (info->width, info->height)); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set frame size, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_USAGE, (amf_int64) self->usage); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set usage, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + if (self->preset > AMF_VIDEO_ENCODER_QUALITY_PRESET_UNKNOWN) { + result = comp->SetProperty (AMF_VIDEO_ENCODER_QUALITY_PRESET, + (amf_int64) self->preset); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set quality preset, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_PROFILE, (amf_int64) profile); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set profile, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_MAX_NUM_REFRAMES, + (amf_int64) self->ref_frames); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set ref-frames, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + aspect_ratio = AMFConstructRatio (info->par_n, info->par_d); + result = comp->SetProperty (AMF_VIDEO_ENCODER_ASPECT_RATIO, aspect_ratio); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set aspect ratio, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + if (info->colorimetry.range == GST_VIDEO_COLOR_RANGE_0_255) + boolean_val = true; + else + boolean_val = false; + + result = comp->SetProperty (AMF_VIDEO_ENCODER_FULL_RANGE_COLOR, boolean_val); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set full-range-color, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + if (self->rate_control != AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_UNKNOWN) { + result = comp->SetProperty (AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD, + (amf_int64) self->rate_control); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set rate-control, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + } + + result = comp->Init (AMF_SURFACE_NV12, info->width, info->height); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to init component, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + /* dynamic properties */ + result = comp->GetProperty (AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD, + &int64_val); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to get rate-control method, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + rc_mode = (AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_ENUM) int64_val; + if (self->min_qp >= 0) + comp->SetProperty (AMF_VIDEO_ENCODER_MIN_QP, (amf_int64) self->min_qp); + if (self->max_qp >= 0) + comp->SetProperty (AMF_VIDEO_ENCODER_MAX_QP, (amf_int64) self->max_qp); + + comp->SetProperty (AMF_VIDEO_ENCODER_QP_I, (amf_int64) self->qp_i); + comp->SetProperty (AMF_VIDEO_ENCODER_QP_P, (amf_int64) self->qp_p); + + switch (rc_mode) { + case AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CBR: + if (self->bitrate > 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_TARGET_BITRATE, + (amf_int64) self->bitrate * 1000); + comp->SetProperty (AMF_VIDEO_ENCODER_PEAK_BITRATE, + (amf_int64) self->bitrate * 1000); + } + break; + case AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR: + case AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR: + if (self->bitrate > 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_TARGET_BITRATE, + (amf_int64) self->bitrate * 1000); + } + if (self->max_bitrate > 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_PEAK_BITRATE, + (amf_int64) self->max_bitrate * 1000); + } + break; + default: + break; + } + + /* Disable frame skip for now, need investigation the behavior */ + result = comp->SetProperty (AMF_VIDEO_ENCODER_RATE_CONTROL_SKIP_FRAME_ENABLE, + (amf_bool) false); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to disable skip frame, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + if (info->fps_n > 0 && info->fps_d) { + framerate = AMFConstructRate (info->fps_n, info->fps_d); + } else { + framerate = AMFConstructRate (25, 1); + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_FRAMERATE, framerate); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set frame rate, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + if (self->gop_size >= 0) { + result = comp->SetProperty (AMF_VIDEO_ENCODER_IDR_PERIOD, + (amf_int64) self->gop_size); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set IDR period, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + } + + if (profile != AMF_VIDEO_ENCODER_PROFILE_BASELINE && + profile != AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_BASELINE) { + if (self->cabac) + cabac = AMF_VIDEO_ENCODER_CABAC; + else + cabac = AMF_VIDEO_ENCODER_CALV; + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_CABAC_ENABLE, + (amf_int64) cabac); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set cabac, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + self->property_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return TRUE; + +error: + g_mutex_unlock (&self->prop_lock); + + return FALSE; +} + +static gboolean +gst_amf_h264_enc_set_output_state (GstAmfEncoder * encoder, + GstVideoCodecState * state, gpointer component) +{ + GstAmfH264Enc *self = GST_AMF_H264_ENC (encoder); + AMFComponent *comp = (AMFComponent *) component; + GstVideoCodecState *output_state; + GstCaps *caps; + const gchar *profile_from_sps; + std::set < std::string > downstream_profiles; + std::string caps_str; + GstTagList *tags; + GstBuffer *codec_data = nullptr; + GstH264NalUnit sps_nalu, pps_nalu; + GstH264ParserResult rst; + AMF_RESULT result; + AMFInterfacePtr iface; + AMFBufferPtr spspps_buf; + guint8 *spspps; + amf_size spspps_size; + + result = comp->GetProperty (AMF_VIDEO_ENCODER_EXTRADATA, &iface); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to get extra data, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + return FALSE; + } + + spspps_buf = AMFBufferPtr (iface); + if (!spspps_buf) { + GST_ERROR_OBJECT (self, "Failed to set get AMFBuffer interface, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + return FALSE; + } + + spspps_size = spspps_buf->GetSize (); + if (spspps_size < 4) { + GST_ERROR_OBJECT (self, "Too small spspps size %d", (guint) spspps_size); + return FALSE; + } + + spspps = (guint8 *) spspps_buf->GetNative (); + if (!spspps) { + GST_ERROR_OBJECT (self, "Null SPS/PPS"); + return FALSE; + } + + caps_str = "video/x-h264, alignment = (string) au"; + gst_amf_h264_enc_get_downstream_profiles_and_format (self, + downstream_profiles, nullptr); + + rst = gst_h264_parser_identify_nalu (self->parser, + spspps, 0, spspps_size, &sps_nalu); + if (rst != GST_H264_PARSER_OK) { + GST_ERROR_OBJECT (self, "Failed to identify SPS nal"); + return FALSE; + } + + if (sps_nalu.size < 4) { + GST_ERROR_OBJECT (self, "Too small sps nal size %d", sps_nalu.size); + return FALSE; + } + + rst = gst_h264_parser_identify_nalu_unchecked (self->parser, + spspps, sps_nalu.offset + sps_nalu.size, spspps_size, &pps_nalu); + if (rst != GST_H264_PARSER_OK && self->packetized) { + GST_ERROR_OBJECT (self, "Failed to identify PPS nal, %d", rst); + return FALSE; + } + + if (self->packetized) { + GstMapInfo info; + guint8 *data; + guint8 profile_idc, profile_comp, level_idc; + const guint nal_length_size = 4; + const guint num_sps = 1; + const guint num_pps = 1; + + data = sps_nalu.data + sps_nalu.offset + sps_nalu.header_bytes; + profile_idc = data0; + profile_comp = data1; + level_idc = data2; + + /* 5: configuration version, profile, compatibility, level, nal length + * 1: num sps + * 2: sps size bytes + * sizeof (sps) + * 1: num pps + * 2: pps size bytes + * sizeof (pps) + * + * -> 11 + sps_size + pps_size + */ + codec_data = gst_buffer_new_and_alloc (11 + sps_nalu.size + pps_nalu.size); + + gst_buffer_map (codec_data, &info, GST_MAP_WRITE); + + data = (guint8 *) info.data; + data0 = 1; + data1 = profile_idc; + data2 = profile_comp; + data3 = level_idc; + data4 = 0xfc | (nal_length_size - 1); + data5 = 0xe0 | num_sps; + data += 6; + GST_WRITE_UINT16_BE (data, sps_nalu.size); + data += 2; + memcpy (data, sps_nalu.data + sps_nalu.offset, sps_nalu.size); + data += sps_nalu.size; + + data0 = num_pps; + data++; + + GST_WRITE_UINT16_BE (data, pps_nalu.size); + data += 2; + memcpy (data, pps_nalu.data + pps_nalu.offset, pps_nalu.size); + + gst_buffer_unmap (codec_data, &info); + } + + profile_from_sps = + gst_codec_utils_h264_get_profile (sps_nalu.data + sps_nalu.offset + + sps_nalu.header_bytes, 3); + + if (!profile_from_sps) { + GST_WARNING_OBJECT (self, "Failed to parse profile from SPS"); + } else if (!downstream_profiles.empty ()) { + if (downstream_profiles.find (profile_from_sps) != + downstream_profiles.end ()) { + caps_str += ", profile = (string) " + std::string (profile_from_sps); + } else if (downstream_profiles.find ("baseline") != + downstream_profiles.end () && + strcmp (profile_from_sps, "constrained-baseline") == 0) { + caps_str += ", profile = (string) baseline"; + } else if (downstream_profiles.find ("constrained-baseline") != + downstream_profiles.end () && + strcmp (profile_from_sps, "constrained-baseline") == 0) { + caps_str += ", profile = (string) constrained-baseline"; + } + } else { + caps_str += ", profile = (string) " + std::string (profile_from_sps); + } + + if (self->packetized) { + caps_str += ", stream-format = (string) avc"; + } else { + caps_str += ", stream-format = (string) byte-stream"; + } + + caps = gst_caps_from_string (caps_str.c_str ()); + + if (self->packetized) { + gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, codec_data, + nullptr); + gst_buffer_unref (codec_data); + } + + output_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (self), + caps, state); + + GST_INFO_OBJECT (self, "Output caps: %" GST_PTR_FORMAT, output_state->caps); + gst_video_codec_state_unref (output_state); + + tags = gst_tag_list_new_empty (); + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, + "amfh264enc", nullptr); + + gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (encoder), + tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (tags); + + return TRUE; +} + +static gboolean +gst_amf_h264_enc_set_surface_prop (GstAmfEncoder * encoder, + GstVideoCodecFrame * frame, gpointer surface) +{ + GstAmfH264Enc *self = GST_AMF_H264_ENC (encoder); + AMFSurface *surf = (AMFSurface *) surface; + AMF_RESULT result; + amf_bool insert_aud = self->aud ? true : false; + + if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame)) { + amf_int64 type = (amf_int64) AMF_VIDEO_ENCODER_PICTURE_TYPE_IDR; + result = surf->SetProperty (AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, type); + if (result != AMF_OK) { + GST_WARNING_OBJECT (encoder, "Failed to set force idr, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + } + } + + result = surf->SetProperty (AMF_VIDEO_ENCODER_INSERT_AUD, &insert_aud); + if (result != AMF_OK) { + GST_WARNING_OBJECT (encoder, "Failed to set AUD, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + } + + return TRUE; +} + +static GstBuffer * +gst_amf_h264_enc_create_output_buffer (GstAmfEncoder * encoder, + gpointer data, gboolean * sync_point) +{ + GstAmfH264Enc *self = GST_AMF_H264_ENC (encoder); + AMFBuffer *amf_buf = (AMFBuffer *) data; + GstBuffer *buf; + GstH264ParserResult rst; + GstH264NalUnit nalu; + guint8 *data_ptr; + gsize data_size; + amf_int64 output_type = 0; + AMF_RESULT result; + + data_ptr = (guint8 *) amf_buf->GetNative (); + data_size = amf_buf->GetSize (); + + if (!data_ptr || data_size == 0) { + GST_WARNING_OBJECT (self, "Empty buffer"); + return nullptr; + } + + if (!self->packetized) { + buf = gst_buffer_new_memdup (data_ptr, data_size); + } else { + buf = gst_buffer_new (); + rst = gst_h264_parser_identify_nalu (self->parser, + data_ptr, 0, data_size, &nalu); + if (rst == GST_H264_PARSER_NO_NAL_END) + rst = GST_H264_PARSER_OK; + + while (rst == GST_H264_PARSER_OK) { + GstMemory *mem; + guint8 *data; + + data = (guint8 *) g_malloc0 (nalu.size + 4); + GST_WRITE_UINT32_BE (data, nalu.size); + memcpy (data + 4, nalu.data + nalu.offset, nalu.size); + + mem = gst_memory_new_wrapped ((GstMemoryFlags) 0, data, nalu.size + 4, + 0, nalu.size + 4, data, (GDestroyNotify) g_free); + gst_buffer_append_memory (buf, mem); + + rst = gst_h264_parser_identify_nalu (self->parser, + data_ptr, nalu.offset + nalu.size, data_size, &nalu); + + if (rst == GST_H264_PARSER_NO_NAL_END) + rst = GST_H264_PARSER_OK; + } + } + + result = amf_buf->GetProperty (AMF_VIDEO_ENCODER_OUTPUT_DATA_TYPE, + &output_type); + if (result == AMF_OK && + output_type == (amf_int64) AMF_VIDEO_ENCODER_OUTPUT_DATA_TYPE_IDR) { + *sync_point = TRUE; + } + + return buf; +} + +static gboolean +gst_amf_h264_enc_check_reconfigure (GstAmfEncoder * encoder) +{ + GstAmfH264Enc *self = GST_AMF_H264_ENC (encoder); + gboolean ret; + + g_mutex_lock (&self->prop_lock); + ret = self->property_updated; + g_mutex_unlock (&self->prop_lock); + + return ret; +} + +static GstAmfH264EncClassData * +gst_amf_h264_enc_create_class_data (GstD3D11Device * device, + AMFComponent * comp) +{ + AMF_RESULT result; + GstAmfH264EncDeviceCaps dev_caps = { 0, }; + std::string sink_caps_str; + std::string src_caps_str; + std::set < std::string > profiles; + std::string profile_str; + std::string resolution_str; + GstAmfH264EncClassData *cdata; + AMFCapsPtr amf_caps; + AMFIOCapsPtr in_iocaps; + AMFIOCapsPtr out_iocaps; + amf_int32 in_min_width = 0, in_max_width = 0; + amf_int32 in_min_height = 0, in_max_height = 0; + amf_int32 out_min_width = 0, out_max_width = 0; + amf_int32 out_min_height = 0, out_max_height = 0; + amf_bool interlace_supported; + amf_int32 num_val; + gboolean have_nv12 = FALSE; + gboolean d3d11_supported = FALSE; + gint min_width, max_width, min_height, max_height; + GstCaps *sink_caps; + GstCaps *system_caps; + + result = comp->GetCaps (&amf_caps); + if (result != AMF_OK) { + GST_WARNING_OBJECT (device, "Unable to get caps"); + return nullptr; + } + + result = amf_caps->GetInputCaps (&in_iocaps); + if (result != AMF_OK) { + GST_WARNING_OBJECT (device, "Unable to get input io caps"); + return nullptr; + } + + in_iocaps->GetWidthRange (&in_min_width, &in_max_width); + in_iocaps->GetHeightRange (&in_min_height, &in_max_height); + dev_caps.valign = in_iocaps->GetVertAlign (); + interlace_supported = in_iocaps->IsInterlacedSupported (); + + GST_INFO_OBJECT (device, "Input width: %d, %d, height: %d, %d, " + "valign: %d, interlace supported: %d", + in_min_width, in_max_width, in_min_height, in_max_height, dev_caps.valign, + interlace_supported); + + if (interlace_supported) + dev_caps.interlace_supported = TRUE; + + num_val = in_iocaps->GetNumOfFormats (); + GST_LOG_OBJECT (device, "Input format count: %d", num_val); + for (amf_int32 i = 0; i < num_val; i++) { + AMF_SURFACE_FORMAT format; + amf_bool native; + + result = in_iocaps->GetFormatAt (i, &format, &native); + if (result != AMF_OK) + continue; + + GST_INFO_OBJECT (device, "Format %d supported, native %d", format, native); + if (format == AMF_SURFACE_NV12) + have_nv12 = TRUE; + } + + if (!have_nv12) { + GST_WARNING_OBJECT (device, "NV12 is not supported"); + return nullptr; + } + + num_val = in_iocaps->GetNumOfMemoryTypes (); + GST_LOG_OBJECT (device, "Input memory type count: %d", num_val); + for (amf_int32 i = 0; i < num_val; i++) { + AMF_MEMORY_TYPE type; + amf_bool native; + + result = in_iocaps->GetMemoryTypeAt (i, &type, &native); + if (result != AMF_OK) + continue; + + GST_INFO_OBJECT (device, + "MemoryType %d supported, native %d", type, native); + if (type == AMF_MEMORY_DX11) + d3d11_supported = TRUE; + } + + if (!d3d11_supported) { + GST_WARNING_OBJECT (device, "D3D11 is not supported"); + return nullptr; + } + + result = amf_caps->GetOutputCaps (&out_iocaps); + if (result != AMF_OK) { + GST_WARNING_OBJECT (device, "Unable to get input io caps"); + return nullptr; + } + + out_iocaps->GetWidthRange (&out_min_width, &out_max_width); + out_iocaps->GetHeightRange (&out_min_height, &out_max_height); + + GST_INFO_OBJECT (device, "Output width: %d, %d, height: %d, %d", + in_min_width, in_max_width, in_min_height, in_max_height); + +#define QUERY_CAPS_PROP(prop,val) G_STMT_START { \ + amf_int64 _val = 0; \ + result = amf_caps->GetProperty (prop, &_val); \ + if (result == AMF_OK) { \ + GST_INFO_OBJECT (device, G_STRINGIFY (val) ": %" G_GINT64_FORMAT, _val); \ + dev_caps.val = _val; \ + } \ +} G_STMT_END + + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_MAX_BITRATE, max_bitrate); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_NUM_OF_STREAMS, num_of_streams); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_MAX_PROFILE, max_profile); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_MAX_LEVEL, max_level); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_BFRAMES, bframes); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_MIN_REFERENCE_FRAMES, min_ref_frames); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_MAX_REFERENCE_FRAMES, max_ref_frames); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_MAX_TEMPORAL_LAYERS, + max_temporal_layers); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_FIXED_SLICE_MODE, fixed_slice_mode); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_NUM_OF_HW_INSTANCES, + num_of_hw_instances); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_COLOR_CONVERSION, color_conversion); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_PRE_ANALYSIS, pre_analysis); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_ROI, roi_map); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAP_MAX_THROUGHPUT, max_throughput); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAPS_QUERY_TIMEOUT_SUPPORT, + query_timeout_support); +#undef QUERY_CAPS_PROP + +#define QUERY_DEFAULT_PROP(prop,val,default_val) G_STMT_START { \ + const AMFPropertyInfo *pinfo = nullptr; \ + result = comp->GetPropertyInfo (prop, &pinfo); \ + if (result == AMF_OK && pinfo) { \ + dev_caps.val = AMFVariantGetInt64 (&pinfo->defaultValue); \ + GST_INFO_OBJECT (device, G_STRINGIFY (val) ": %" G_GINT64_FORMAT, \ + dev_caps.val); \ + } else { \ + dev_caps.val = default_val; \ + } \ +} G_STMT_END + + QUERY_DEFAULT_PROP (AMF_VIDEO_ENCODER_QP_I, default_qp_i, 22); + QUERY_DEFAULT_PROP (AMF_VIDEO_ENCODER_QP_I, default_qp_p, 22); + QUERY_DEFAULT_PROP (AMF_VIDEO_ENCODER_QP_I, default_qp_b, 22); +#undef QUERY_DEFAULT_PROP + + min_width = MAX (in_min_width, 1); + max_width = in_max_width; + if (max_width == 0) { + GST_WARNING_OBJECT (device, "Unknown max width, assuming 4096"); + max_width = 4096; + } + + min_height = MAX (in_min_height, 1); + max_height = in_max_height; + if (max_height == 0) { + GST_WARNING_OBJECT (device, "Unknown max height, assuming 4096"); + max_height = 4096; + } + + if (dev_caps.max_profile >= (gint64) AMF_VIDEO_ENCODER_PROFILE_BASELINE) { + profiles.insert ("baseline"); + profiles.insert ("constrained-baseline"); + } + + if (dev_caps.max_profile >= (gint64) AMF_VIDEO_ENCODER_PROFILE_MAIN) + profiles.insert ("main"); + + if (dev_caps.max_profile >= (gint64) AMF_VIDEO_ENCODER_PROFILE_HIGH) { + profiles.insert ("high"); + } + + if (dev_caps.max_profile >= + (gint64) AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_HIGH) { + profiles.insert ("constrained-high"); + } + + if (profiles.empty ()) { + GST_WARNING_OBJECT (device, "Failed to determine profile support"); + return nullptr; + } +#define APPEND_STRING(dst,set,str) G_STMT_START { \ + if (set.find(str) != set.end()) { \ + if (!first) \ + dst += ", "; \ + dst += str; \ + first = FALSE; \ + } \ +} G_STMT_END + + if (profiles.size () == 1) { + profile_str = "profile = (string) " + *(profiles.begin ()); + } else { + gboolean first = TRUE; + + profile_str = "profile = (string) { "; + APPEND_STRING (profile_str, profiles, "main"); + APPEND_STRING (profile_str, profiles, "high"); + APPEND_STRING (profile_str, profiles, "constrained-high"); + APPEND_STRING (profile_str, profiles, "constrained-baseline"); + APPEND_STRING (profile_str, profiles, "baseline"); + profile_str += " } "; + } +#undef APPEND_STRING + + resolution_str = "width = (int) " + std::to_string (min_width) + + ", " + std::to_string (max_width) + " "; + resolution_str += ", height = (int) " + std::to_string (min_height) + + ", " + std::to_string (max_height) + " "; + + sink_caps_str = "video/x-raw, format = (string) NV12, " + resolution_str; + if (dev_caps.interlace_supported > 0) { + sink_caps_str += ", interlace-mode = (string) { interleaved, mixed }"; + } else { + sink_caps_str += ", interlace-mode = (string) progressive"; + } + + src_caps_str = "video/x-h264, " + resolution_str + ", " + profile_str + + ", stream-format = (string) { avc, byte-stream }, alignment = (string) au"; + + system_caps = gst_caps_from_string (sink_caps_str.c_str ()); + sink_caps = gst_caps_copy (system_caps); + gst_caps_set_features (sink_caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr)); + gst_caps_append (sink_caps, system_caps); + + cdata = g_new0 (GstAmfH264EncClassData, 1); + cdata->sink_caps = sink_caps; + cdata->src_caps = gst_caps_from_string (src_caps_str.c_str ()); + cdata->dev_caps = dev_caps; + g_object_get (device, "adapter-luid", &cdata->adapter_luid, nullptr); + + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GST_DEBUG_OBJECT (device, "Sink caps %" GST_PTR_FORMAT, cdata->sink_caps); + GST_DEBUG_OBJECT (device, "Src caps %" GST_PTR_FORMAT, cdata->src_caps); + + return cdata; +} + +void +gst_amf_h264_enc_register_d3d11 (GstPlugin * plugin, GstD3D11Device * device, + gpointer context, guint rank) +{ + GstAmfH264EncClassData *cdata; + AMFContext *amf_context = (AMFContext *) context; + AMFFactory *factory = (AMFFactory *) gst_amf_get_factory (); + AMFComponentPtr comp; + AMF_RESULT result; + + GST_DEBUG_CATEGORY_INIT (gst_amf_h264_enc_debug, "amfh264enc", 0, + "amfh264enc"); + + result = factory->CreateComponent (amf_context, AMFVideoEncoderVCE_AVC, + &comp); + if (result != AMF_OK) { + GST_WARNING_OBJECT (device, "Failed to create component, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + return; + } + + cdata = gst_amf_h264_enc_create_class_data (device, comp.GetPtr ()); + if (!cdata) + return; + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstAmfH264EncClass), + nullptr, + nullptr, + (GClassInitFunc) gst_amf_h264_enc_class_init, + nullptr, + cdata, + sizeof (GstAmfH264Enc), + 0, + (GInstanceInitFunc) gst_amf_h264_enc_init, + }; + + type_name = g_strdup ("GstAmfH264Enc"); + feature_name = g_strdup ("amfh264enc"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstAmfH264Device%dEnc", index); + feature_name = g_strdup_printf ("amfh264device%denc", index); + } + + type = g_type_register_static (GST_TYPE_AMF_ENCODER, type_name, + &type_info, (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/gstamfh264enc.h
Added
@@ -0,0 +1,32 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "gstamfencoder.h" +#include <gst/d3d11/gstd3d11.h> + +G_BEGIN_DECLS + +void gst_amf_h264_enc_register_d3d11 (GstPlugin * plugin, + GstD3D11Device * device, + gpointer context, + guint rank); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/gstamfh265enc.cpp
Added
@@ -0,0 +1,1228 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-amfh265enc + * @title: amfh265enc + * @short_description: An AMD AMF API based H.265 video encoder + * + * amfh265enc element encodes raw video stream into compressed H.265 bitstream + * via AMD AMF API. + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc num-buffers=100 ! amfh265enc ! h265parse ! mp4mux ! filesink location=encoded.mp4 + * ``` + * + * Since: 1.22 + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstamfh265enc.h" +#include <components/Component.h> +#include <components/VideoEncoderHEVC.h> +#include <core/Factory.h> +#include <string> +#include <vector> +#include <string.h> + +using namespace amf; + +GST_DEBUG_CATEGORY_STATIC (gst_amf_h265_enc_debug); +#define GST_CAT_DEFAULT gst_amf_h265_enc_debug + +static GTypeClass *parent_class = nullptr; + +typedef struct +{ + amf_int64 max_bitrate; + amf_int64 num_of_streams; + amf_int64 max_profile; + amf_int64 max_tier; + amf_int64 max_level; + amf_int64 min_ref_frames; + amf_int64 max_ref_frames; + amf_int64 num_of_hw_instances; + amf_int64 color_conversion; + amf_int64 pre_analysis; + amf_int64 roi_map; + amf_int64 max_throughput; + amf_int64 query_timeout_support; + amf_int64 default_qp_i; + amf_int64 default_qp_p; + amf_int64 min_gop_size; + amf_int64 max_gop_size; + amf_int64 default_gop_size; + guint valign; +} GstAmfH265EncDeviceCaps; + +/** + * GstAmfH265EncUsage: + * + * Encoder usages + * + * Since: 1.22 + */ +#define GST_TYPE_AMF_H265_ENC_USAGE (gst_amf_h265_enc_usage_get_type ()) +static GType +gst_amf_h265_enc_usage_get_type (void) +{ + static GType usage_type = 0; + static const GEnumValue usages = { + /** + * GstAmfH265EncUsage::transcoding: + * + * Transcoding usage + */ + {AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCODING, "Transcoding", "transcoding"}, + + /** + * GstAmfH265EncUsage::ultra-low-latency: + * + * Ultra Low Latency usage + */ + {AMF_VIDEO_ENCODER_HEVC_USAGE_ULTRA_LOW_LATENCY, "Ultra Low Latency", + "ultra-low-latency"}, + + /** + * GstAmfH265EncUsage::low-latency: + * + * Low Latency usage + */ + {AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY, "Low Latency", "low-latency"}, + + /** + * GstAmfH265EncUsage::webcam: + * + * Webcam usage + */ + {AMF_VIDEO_ENCODER_HEVC_USAGE_WEBCAM, "Webcam", "webcam"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&usage_type)) { + GType type = g_enum_register_static ("GstAmfH265EncUsage", usages); + g_once_init_leave (&usage_type, type); + } + + return usage_type; +} + +/** + * GstAmfH265EncRateControl: + * + * Rate control methods + * + * Since: 1.22 + */ +#define GST_TYPE_AMF_H265_ENC_RATE_CONTROL (gst_amf_h265_enc_rate_control_get_type ()) +static GType +gst_amf_h265_enc_rate_control_get_type (void) +{ + static GType rate_control_type = 0; + static const GEnumValue rate_controls = { + /** + * GstAmfH265EncRateControl::default: + * + * Default rate control method depending on usage + */ + {AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_UNKNOWN, + "Default, depends on Usage", "default"}, + + /** + * GstAmfH265EncRateControl::cqp: + * + * Constant QP + */ + {AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CONSTANT_QP, "Constant QP", + "cqp"}, + + /** + * GstAmfH265EncRateControl::lcvbr: + * + * Latency Constrained Variable Bitrate + */ + {AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR, + "Latency Constrained VBR", "lcvbr"}, + + /** + * GstAmfH265EncRateControl::vbr: + * + * Peak Constrained Variable Bitrate + */ + {AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR, + "Peak Constrained VBR", "vbr"}, + + /** + * GstAmfH265EncRateControl::cbr: + * + * Constant Bitrate + */ + {AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CBR, "Constant Bitrate", "cbr"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&rate_control_type)) { + GType type = + g_enum_register_static ("GstAmfH265EncRateControl", rate_controls); + g_once_init_leave (&rate_control_type, type); + } + + return rate_control_type; +} + +/** + * GstAmfH265EncPreset: + * + * Encoding quality presets + * + * Since: 1.22 + */ +#define AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_UNKNOWN -1 +#define GST_TYPE_AMF_H265_ENC_PRESET (gst_amf_h265_enc_preset_get_type ()) +static GType +gst_amf_h265_enc_preset_get_type (void) +{ + static GType preset_type = 0; + static const GEnumValue presets = { + /** + * GstAmfH265EncRateControl::default: + * + * Default preset depends on usage + */ + {AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_UNKNOWN, "Default, depends on USAGE", + "default"}, + + /** + * GstAmfH265EncRateControl::quality: + * + * Quality oriented preset + */ + {AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_QUALITY, "Quality", "quality"}, + /** + * + * GstAmfH265EncRateControl::balanced: + * + * Balanced preset + */ + {AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_BALANCED, "Balanced", "balanced"}, + + /** + * GstAmfH265EncRateControl::speed: + * + * Speed oriented preset + */ + {AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_SPEED, "Speed", "speed"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&preset_type)) { + GType type = g_enum_register_static ("GstAmfH265EncPreset", presets); + g_once_init_leave (&preset_type, type); + } + + return preset_type; +} + +typedef struct +{ + GstCaps *sink_caps; + GstCaps *src_caps; + + gint64 adapter_luid; + + GstAmfH265EncDeviceCaps dev_caps; +} GstAmfH265EncClassData; + +enum +{ + PROP_0, + PROP_ADAPTER_LUID, + PROP_USAGE, + PROP_RATE_CONTROL, + PROP_PRESET, + PROP_BITRATE, + PROP_MAX_BITRATE, + PROP_GOP_SIZE, + PROP_MIN_QP_I, + PROP_MAX_QP_I, + PROP_MIN_QP_P, + PROP_MAX_QP_P, + PROP_QP_I, + PROP_QP_P, + PROP_REF_FRAMES, + PROP_AUD, +}; + +#define DEFAULT_USAGE AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCODING +#define DEFAULT_RATE_CONTROL AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_UNKNOWN +#define DEFAULT_PRESET AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_UNKNOWN +#define DEFAULT_BITRATE 0 +#define DEFAULT_MAX_BITRATE 0 +#define DEFAULT_MIN_MAX_QP -1 +#define DEFAULT_AUD TRUE + +#define DOC_SINK_CAPS_COMM \ + "format = (string) NV12, " \ + "width = (int) 128, 4096 , height = (int) 128, 4096 " + +#define DOC_SINK_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw, " DOC_SINK_CAPS_COMM + +#define DOC_SRC_CAPS \ + "video/x-h265, width = (int) 128, 4096 , height = (int) 128, 4096 , " \ + "profile = (string) main, stream-format = (string) byte-stream, " \ + "alignment = (string) au" + +typedef struct _GstAmfH265Enc +{ + GstAmfEncoder parent; + + GMutex prop_lock; + gboolean property_updated; + + gint usage; + gint rate_control; + gint preset; + guint bitrate; + guint max_bitrate; + guint gop_size; + gint min_qp_i; + gint max_qp_i; + gint min_qp_p; + gint max_qp_p; + guint qp_i; + guint qp_p; + guint ref_frames; + + gboolean aud; +} GstAmfH265Enc; + +typedef struct _GstAmfH265EncClass +{ + GstAmfEncoderClass parent_class; + GstAmfH265EncDeviceCaps dev_caps; + + gint64 adapter_luid; +} GstAmfH265EncClass; + +#define GST_AMF_H265_ENC(object) ((GstAmfH265Enc *) (object)) +#define GST_AMF_H265_ENC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstAmfH265EncClass)) + +static void gst_amf_h265_enc_finalize (GObject * object); +static void gst_amf_h265_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_amf_h265_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static gboolean gst_amf_h265_enc_set_format (GstAmfEncoder * encoder, + GstVideoCodecState * state, gpointer component); +static gboolean gst_amf_h265_enc_set_output_state (GstAmfEncoder * encoder, + GstVideoCodecState * state, gpointer component); +static gboolean gst_amf_h265_enc_set_surface_prop (GstAmfEncoder * encoder, + GstVideoCodecFrame * frame, gpointer surface); +static GstBuffer *gst_amf_h265_enc_create_output_buffer (GstAmfEncoder * + encoder, gpointer data, gboolean * sync_point); +static gboolean gst_amf_h265_enc_check_reconfigure (GstAmfEncoder * encoder); + +static void +gst_amf_h265_enc_class_init (GstAmfH265EncClass * klass, gpointer data) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstAmfEncoderClass *amf_class = GST_AMF_ENCODER_CLASS (klass); + GstAmfH265EncClassData *cdata = (GstAmfH265EncClassData *) data; + GstAmfH265EncDeviceCaps *dev_caps = &cdata->dev_caps; + GParamFlags param_flags = (GParamFlags) (G_PARAM_READWRITE | + GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS); + GstPadTemplate *pad_templ; + GstCaps *doc_caps; + + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + + object_class->finalize = gst_amf_h265_enc_finalize; + object_class->set_property = gst_amf_h265_enc_set_property; + object_class->get_property = gst_amf_h265_enc_get_property; + + g_object_class_install_property (object_class, PROP_ADAPTER_LUID, + g_param_spec_int64 ("adapter-luid", "Adapter LUID", + "DXGI Adapter LUID (Locally Unique Identifier) of associated GPU", + G_MININT64, G_MAXINT64, 0, (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_USAGE, + g_param_spec_enum ("usage", "Usage", + "Target usage", GST_TYPE_AMF_H265_ENC_USAGE, + DEFAULT_USAGE, param_flags)); + g_object_class_install_property (object_class, PROP_RATE_CONTROL, + g_param_spec_enum ("rate-control", "Rate Control", + "Rate Control Method", GST_TYPE_AMF_H265_ENC_RATE_CONTROL, + DEFAULT_RATE_CONTROL, param_flags)); + g_object_class_install_property (object_class, PROP_PRESET, + g_param_spec_enum ("preset", "Preset", + "Preset", GST_TYPE_AMF_H265_ENC_PRESET, DEFAULT_PRESET, param_flags)); + g_object_class_install_property (object_class, PROP_BITRATE, + g_param_spec_uint ("bitrate", "Bitrate", + "Target bitrate in kbit/sec (0: USAGE default)", + 0, G_MAXINT / 1000, DEFAULT_BITRATE, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_BITRATE, + g_param_spec_uint ("max-bitrate", "Max Bitrate", + "Maximum bitrate in kbit/sec (0: USAGE default)", + 0, G_MAXINT / 1000, DEFAULT_MAX_BITRATE, param_flags)); + g_object_class_install_property (object_class, PROP_GOP_SIZE, + g_param_spec_uint ("gop-size", "GOP Size", + "Number of pictures within a GOP", + (guint) dev_caps->min_gop_size, (guint) dev_caps->max_gop_size, + (guint) dev_caps->default_gop_size, param_flags)); + g_object_class_install_property (object_class, PROP_MIN_QP_I, + g_param_spec_int ("min-qp-i", "Min QP I", + "Minimum allowed QP value for I frames (-1: USAGE default)", + -1, 51, DEFAULT_MIN_MAX_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_QP_I, + g_param_spec_int ("max-qp-i", "Max QP I", + "Maximum allowed QP value for I frames (-1: USAGE default)", + -1, 51, DEFAULT_MIN_MAX_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MIN_QP_P, + g_param_spec_int ("min-qp-p", "Min QP P", + "Minimum allowed QP value for P frames (-1: USAGE default)", + -1, 51, DEFAULT_MIN_MAX_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_QP_P, + g_param_spec_int ("max-qp-p", "Max QP P", + "Maximum allowed QP value for P frames (-1: USAGE default)", + -1, 51, DEFAULT_MIN_MAX_QP, param_flags)); + g_object_class_install_property (object_class, PROP_QP_I, + g_param_spec_uint ("qp-i", "QP I", + "Constant QP for I frames", 0, 51, + (guint) dev_caps->default_qp_i, param_flags)); + g_object_class_install_property (object_class, PROP_QP_P, + g_param_spec_uint ("qp-p", "QP P", + "Constant QP for P frames", 0, 51, + (guint) dev_caps->default_qp_p, param_flags)); + g_object_class_install_property (object_class, PROP_REF_FRAMES, + g_param_spec_uint ("ref-frames", "Reference Frames", + "Number of reference frames", (guint) dev_caps->min_ref_frames, + (guint) dev_caps->max_ref_frames, + (guint) dev_caps->min_ref_frames, param_flags)); + g_object_class_install_property (object_class, PROP_AUD, + g_param_spec_boolean ("aud", "AUD", + "Use AU (Access Unit) delimiter", DEFAULT_AUD, param_flags)); + + gst_element_class_set_metadata (element_class, + "AMD AMF H.265 Video Encoder", + "Codec/Encoder/Video/Hardware", + "Encode H.265 video streams using AMF API", + "Seungha Yang <seungha@centricular.com>"); + + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + amf_class->set_format = GST_DEBUG_FUNCPTR (gst_amf_h265_enc_set_format); + amf_class->set_output_state = + GST_DEBUG_FUNCPTR (gst_amf_h265_enc_set_output_state); + amf_class->set_surface_prop = + GST_DEBUG_FUNCPTR (gst_amf_h265_enc_set_surface_prop); + amf_class->create_output_buffer = + GST_DEBUG_FUNCPTR (gst_amf_h265_enc_create_output_buffer); + amf_class->check_reconfigure = + GST_DEBUG_FUNCPTR (gst_amf_h265_enc_check_reconfigure); + + klass->dev_caps = cdata->dev_caps; + klass->adapter_luid = cdata->adapter_luid; + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); + + gst_type_mark_as_plugin_api (GST_TYPE_AMF_H265_ENC_USAGE, + (GstPluginAPIFlags) 0); + gst_type_mark_as_plugin_api (GST_TYPE_AMF_H265_ENC_RATE_CONTROL, + (GstPluginAPIFlags) 0); + gst_type_mark_as_plugin_api (GST_TYPE_AMF_H265_ENC_PRESET, + (GstPluginAPIFlags) 0); +} + +static void +gst_amf_h265_enc_init (GstAmfH265Enc * self) +{ + GstAmfH265EncClass *klass = GST_AMF_H265_ENC_GET_CLASS (self); + GstAmfH265EncDeviceCaps *dev_caps = &klass->dev_caps; + + gst_amf_encoder_set_subclass_data (GST_AMF_ENCODER (self), + klass->adapter_luid, AMFVideoEncoder_HEVC); + + g_mutex_init (&self->prop_lock); + + self->usage = DEFAULT_USAGE; + self->rate_control = DEFAULT_RATE_CONTROL; + self->preset = DEFAULT_PRESET; + self->bitrate = DEFAULT_BITRATE; + self->max_bitrate = DEFAULT_MAX_BITRATE; + self->gop_size = (guint) dev_caps->default_gop_size; + self->min_qp_i = DEFAULT_MIN_MAX_QP; + self->max_qp_i = DEFAULT_MIN_MAX_QP; + self->min_qp_p = DEFAULT_MIN_MAX_QP; + self->max_qp_p = DEFAULT_MIN_MAX_QP; + self->qp_i = (guint) dev_caps->default_qp_i; + self->qp_p = (guint) dev_caps->default_qp_p; + self->ref_frames = (guint) dev_caps->min_ref_frames; + self->aud = DEFAULT_AUD; +} + +static void +gst_amf_h265_enc_finalize (GObject * object) +{ + GstAmfH265Enc *self = GST_AMF_H265_ENC (object); + + g_mutex_clear (&self->prop_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +update_int (GstAmfH265Enc * self, gint * old_val, const GValue * new_val) +{ + gint val = g_value_get_int (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->property_updated = TRUE; +} + +static void +update_uint (GstAmfH265Enc * self, guint * old_val, const GValue * new_val) +{ + guint val = g_value_get_uint (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->property_updated = TRUE; +} + +static void +update_enum (GstAmfH265Enc * self, gint * old_val, const GValue * new_val) +{ + gint val = g_value_get_enum (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->property_updated = TRUE; +} + +static void +gst_amf_h265_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAmfH265Enc *self = GST_AMF_H265_ENC (object); + + g_mutex_lock (&self->prop_lock); + switch (prop_id) { + case PROP_USAGE: + update_enum (self, &self->usage, value); + break; + case PROP_RATE_CONTROL: + update_enum (self, &self->rate_control, value); + break; + case PROP_PRESET: + update_enum (self, &self->preset, value); + break; + case PROP_BITRATE: + update_uint (self, &self->bitrate, value); + break; + case PROP_MAX_BITRATE: + update_uint (self, &self->max_bitrate, value); + break; + case PROP_GOP_SIZE: + update_uint (self, &self->gop_size, value); + break; + case PROP_MIN_QP_I: + update_int (self, &self->min_qp_i, value); + break; + case PROP_MAX_QP_I: + update_int (self, &self->max_qp_i, value); + break; + case PROP_MIN_QP_P: + update_int (self, &self->min_qp_p, value); + break; + case PROP_MAX_QP_P: + update_int (self, &self->max_qp_p, value); + break; + case PROP_QP_I: + update_uint (self, &self->qp_i, value); + break; + case PROP_QP_P: + update_uint (self, &self->qp_p, value); + break; + case PROP_REF_FRAMES: + update_uint (self, &self->ref_frames, value); + break; + case PROP_AUD: + /* This is per frame property, don't need to reset encoder */ + self->aud = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_amf_h265_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAmfH265EncClass *klass = GST_AMF_H265_ENC_GET_CLASS (object); + GstAmfH265Enc *self = GST_AMF_H265_ENC (object); + + switch (prop_id) { + case PROP_ADAPTER_LUID: + g_value_set_int64 (value, klass->adapter_luid); + break; + case PROP_USAGE: + g_value_set_enum (value, self->usage); + break; + case PROP_RATE_CONTROL: + g_value_set_enum (value, self->rate_control); + break; + case PROP_PRESET: + g_value_set_enum (value, self->preset); + break; + case PROP_BITRATE: + g_value_set_uint (value, self->bitrate); + break; + case PROP_MAX_BITRATE: + g_value_set_uint (value, self->max_bitrate); + break; + case PROP_GOP_SIZE: + g_value_set_uint (value, self->gop_size); + break; + case PROP_MIN_QP_I: + g_value_set_int (value, self->min_qp_i); + break; + case PROP_MAX_QP_I: + g_value_set_int (value, self->max_qp_i); + break; + case PROP_MIN_QP_P: + g_value_set_int (value, self->min_qp_p); + break; + case PROP_MAX_QP_P: + g_value_set_int (value, self->max_qp_p); + break; + case PROP_QP_I: + g_value_set_uint (value, self->qp_i); + break; + case PROP_QP_P: + g_value_set_uint (value, self->qp_p); + break; + case PROP_REF_FRAMES: + g_value_set_uint (value, self->ref_frames); + break; + case PROP_AUD: + g_value_set_boolean (value, self->aud); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_amf_h265_enc_set_format (GstAmfEncoder * encoder, + GstVideoCodecState * state, gpointer component) +{ + GstAmfH265Enc *self = GST_AMF_H265_ENC (encoder); + AMFComponent *comp = (AMFComponent *) component; + GstVideoInfo *info = &state->info; + AMF_RESULT result; + AMFRate framerate; + AMFRatio aspect_ratio; + amf_int64 int64_val; + AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_ENUM rc_mode; + + g_mutex_lock (&self->prop_lock); + result = comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_FRAMESIZE, + AMFConstructSize (info->width, info->height)); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set frame size, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_USAGE, + (amf_int64) self->usage); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set usage, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + if (self->preset > AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_UNKNOWN) { + result = comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET, + (amf_int64) self->preset); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set quality preset, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_PROFILE, + (amf_int64) AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set profile, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_MAX_NUM_REFRAMES, + (amf_int64) self->ref_frames); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set ref-frames, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + + aspect_ratio = AMFConstructRatio (info->par_n, info->par_d); + result = comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_ASPECT_RATIO, + aspect_ratio); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set aspect ratio, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + if (info->colorimetry.range == GST_VIDEO_COLOR_RANGE_0_255) + int64_val = AMF_VIDEO_ENCODER_HEVC_NOMINAL_RANGE_FULL; + else + int64_val = AMF_VIDEO_ENCODER_HEVC_NOMINAL_RANGE_STUDIO; + + result = comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_NOMINAL_RANGE, int64_val); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set full-range-color, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + result = comp->Init (AMF_SURFACE_NV12, info->width, info->height); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to init component, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + if (self->rate_control != AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_UNKNOWN) { + result = comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD, + (amf_int64) self->rate_control); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set rate-control, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + } + + result = comp->GetProperty (AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD, + &int64_val); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to get rate-control method, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + rc_mode = (AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_ENUM) int64_val; + if (self->min_qp_i >= 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_MIN_QP_I, + (amf_int64) self->min_qp_i); + } + if (self->max_qp_i >= 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_MAX_QP_I, + (amf_int64) self->max_qp_i); + } + if (self->min_qp_p >= 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_MIN_QP_P, + (amf_int64) self->min_qp_p); + } + if (self->max_qp_p >= 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_MAX_QP_P, + (amf_int64) self->max_qp_p); + } + + comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_QP_I, (amf_int64) self->qp_i); + comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_QP_P, (amf_int64) self->qp_p); + + switch (rc_mode) { + case AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CBR: + if (self->bitrate > 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_TARGET_BITRATE, + (amf_int64) self->bitrate * 1000); + comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_PEAK_BITRATE, + (amf_int64) self->bitrate * 1000); + } + break; + case AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR: + case AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR: + if (self->bitrate > 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_TARGET_BITRATE, + (amf_int64) self->bitrate * 1000); + } + if (self->max_bitrate > 0) { + comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_PEAK_BITRATE, + (amf_int64) self->max_bitrate * 1000); + } + break; + default: + break; + } + + /* Disable frame skip for now, need investigation the behavior */ + result = + comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_SKIP_FRAME_ENABLE, + (amf_bool) false); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to disable skip frame, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + if (info->fps_n > 0 && info->fps_d) { + framerate = AMFConstructRate (info->fps_n, info->fps_d); + } else { + framerate = AMFConstructRate (25, 1); + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_FRAMERATE, framerate); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set frame rate, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + result = comp->SetProperty (AMF_VIDEO_ENCODER_HEVC_GOP_SIZE, + (amf_int64) self->gop_size); + if (result != AMF_OK) { + GST_ERROR_OBJECT (self, "Failed to set gop-size, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + goto error; + } + + self->property_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return TRUE; + +error: + g_mutex_unlock (&self->prop_lock); + + return FALSE; +} + +static gboolean +gst_amf_h265_enc_set_output_state (GstAmfEncoder * encoder, + GstVideoCodecState * state, gpointer component) +{ + GstAmfH265Enc *self = GST_AMF_H265_ENC (encoder); + GstVideoCodecState *output_state; + GstCaps *caps; + GstTagList *tags; + + caps = gst_caps_from_string ("video/x-h265, alignment = (string) au" + ", stream-format = (string) byte-stream, profile = (string) main"); + output_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (self), + caps, state); + + GST_INFO_OBJECT (self, "Output caps: %" GST_PTR_FORMAT, output_state->caps); + gst_video_codec_state_unref (output_state); + + tags = gst_tag_list_new_empty (); + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, + "amfh265enc", nullptr); + + gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (encoder), + tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (tags); + + return TRUE; +} + +static gboolean +gst_amf_h265_enc_set_surface_prop (GstAmfEncoder * encoder, + GstVideoCodecFrame * frame, gpointer surface) +{ + GstAmfH265Enc *self = GST_AMF_H265_ENC (encoder); + AMFSurface *surf = (AMFSurface *) surface; + AMF_RESULT result; + amf_bool insert_aud = self->aud ? true : false; + + if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame)) { + amf_int64 type = (amf_int64) AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_IDR; + result = surf->SetProperty (AMF_VIDEO_ENCODER_HEVC_FORCE_PICTURE_TYPE, + type); + if (result != AMF_OK) { + GST_WARNING_OBJECT (encoder, "Failed to set force idr, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + } + } + + result = surf->SetProperty (AMF_VIDEO_ENCODER_HEVC_INSERT_AUD, &insert_aud); + if (result != AMF_OK) { + GST_WARNING_OBJECT (encoder, "Failed to set AUD, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + } + + return TRUE; +} + +static GstBuffer * +gst_amf_h265_enc_create_output_buffer (GstAmfEncoder * encoder, + gpointer data, gboolean * sync_point) +{ + GstAmfH265Enc *self = GST_AMF_H265_ENC (encoder); + AMFBuffer *amf_buf = (AMFBuffer *) data; + GstBuffer *buf; + guint8 *data_ptr; + gsize data_size; + amf_int64 output_type = 0; + AMF_RESULT result; + + data_ptr = (guint8 *) amf_buf->GetNative (); + data_size = amf_buf->GetSize (); + + if (!data_ptr || data_size == 0) { + GST_WARNING_OBJECT (self, "Empty buffer"); + return nullptr; + } + + buf = gst_buffer_new_memdup (data_ptr, data_size); + + result = amf_buf->GetProperty (AMF_VIDEO_ENCODER_HEVC_OUTPUT_DATA_TYPE, + &output_type); + if (result == AMF_OK && + output_type == (amf_int64) AMF_VIDEO_ENCODER_HEVC_OUTPUT_DATA_TYPE_IDR) { + *sync_point = TRUE; + } + + return buf; +} + +static gboolean +gst_amf_h265_enc_check_reconfigure (GstAmfEncoder * encoder) +{ + GstAmfH265Enc *self = GST_AMF_H265_ENC (encoder); + gboolean ret; + + g_mutex_lock (&self->prop_lock); + ret = self->property_updated; + g_mutex_unlock (&self->prop_lock); + + return ret; +} + +static GstAmfH265EncClassData * +gst_amf_h265_enc_create_class_data (GstD3D11Device * device, + AMFComponent * comp) +{ + AMF_RESULT result; + GstAmfH265EncDeviceCaps dev_caps = { 0, }; + std::string sink_caps_str; + std::string src_caps_str; + std::vector < std::string > profiles; + std::string resolution_str; + GstAmfH265EncClassData *cdata; + AMFCapsPtr amf_caps; + AMFIOCapsPtr in_iocaps; + AMFIOCapsPtr out_iocaps; + amf_int32 in_min_width = 0, in_max_width = 0; + amf_int32 in_min_height = 0, in_max_height = 0; + amf_int32 out_min_width = 0, out_max_width = 0; + amf_int32 out_min_height = 0, out_max_height = 0; + amf_int32 num_val; + gboolean have_nv12 = FALSE; + gboolean d3d11_supported = FALSE; + gint min_width, max_width, min_height, max_height; + GstCaps *sink_caps; + GstCaps *system_caps; + + result = comp->GetCaps (&amf_caps); + if (result != AMF_OK) { + GST_WARNING_OBJECT (device, "Unable to get caps"); + return nullptr; + } + + result = amf_caps->GetInputCaps (&in_iocaps); + if (result != AMF_OK) { + GST_WARNING_OBJECT (device, "Unable to get input io caps"); + return nullptr; + } + + in_iocaps->GetWidthRange (&in_min_width, &in_max_width); + in_iocaps->GetHeightRange (&in_min_height, &in_max_height); + dev_caps.valign = in_iocaps->GetVertAlign (); + + GST_INFO_OBJECT (device, "Input width: %d, %d, height: %d, %d, " + "valign: %d", in_min_width, in_max_width, in_min_height, in_max_height, + dev_caps.valign); + + num_val = in_iocaps->GetNumOfFormats (); + GST_LOG_OBJECT (device, "Input format count: %d", num_val); + for (amf_int32 i = 0; i < num_val; i++) { + AMF_SURFACE_FORMAT format; + amf_bool native; + + result = in_iocaps->GetFormatAt (i, &format, &native); + if (result != AMF_OK) + continue; + + GST_INFO_OBJECT (device, "Format %d supported, native %d", format, native); + if (format == AMF_SURFACE_NV12) + have_nv12 = TRUE; + } + + if (!have_nv12) { + GST_WARNING_OBJECT (device, "NV12 is not supported"); + return nullptr; + } + + num_val = in_iocaps->GetNumOfMemoryTypes (); + GST_LOG_OBJECT (device, "Input memory type count: %d", num_val); + for (amf_int32 i = 0; i < num_val; i++) { + AMF_MEMORY_TYPE type; + amf_bool native; + + result = in_iocaps->GetMemoryTypeAt (i, &type, &native); + if (result != AMF_OK) + continue; + + GST_INFO_OBJECT (device, + "MemoryType %d supported, native %d", type, native); + if (type == AMF_MEMORY_DX11) + d3d11_supported = TRUE; + } + + if (!d3d11_supported) { + GST_WARNING_OBJECT (device, "D3D11 is not supported"); + return nullptr; + } + + result = amf_caps->GetOutputCaps (&out_iocaps); + if (result != AMF_OK) { + GST_WARNING_OBJECT (device, "Unable to get input io caps"); + return nullptr; + } + + out_iocaps->GetWidthRange (&out_min_width, &out_max_width); + out_iocaps->GetHeightRange (&out_min_height, &out_max_height); + + GST_INFO_OBJECT (device, "Output width: %d, %d, height: %d, %d", + in_min_width, in_max_width, in_min_height, in_max_height); + +#define QUERY_CAPS_PROP(prop,val) G_STMT_START { \ + amf_int64 _val = 0; \ + result = amf_caps->GetProperty (prop, &_val); \ + if (result == AMF_OK) { \ + GST_INFO_OBJECT (device, G_STRINGIFY (val) ": %" G_GINT64_FORMAT, _val); \ + dev_caps.val = _val; \ + } \ +} G_STMT_END + + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_HEVC_CAP_MAX_BITRATE, max_bitrate); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_HEVC_CAP_NUM_OF_STREAMS, num_of_streams); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_HEVC_CAP_MAX_PROFILE, max_profile); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_HEVC_CAP_MAX_TIER, max_tier); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_HEVC_CAP_MAX_LEVEL, max_level); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_HEVC_CAP_MIN_REFERENCE_FRAMES, + min_ref_frames); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_HEVC_CAP_MAX_REFERENCE_FRAMES, + max_ref_frames); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_HEVC_CAP_NUM_OF_HW_INSTANCES, + num_of_hw_instances); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_HEVC_CAP_COLOR_CONVERSION, + color_conversion); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_HEVC_CAP_PRE_ANALYSIS, pre_analysis); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_HEVC_CAP_ROI, roi_map); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_HEVC_CAP_MAX_THROUGHPUT, max_throughput); + QUERY_CAPS_PROP (AMF_VIDEO_ENCODER_CAPS_HEVC_QUERY_TIMEOUT_SUPPORT, + query_timeout_support); +#undef QUERY_CAPS_PROP + +#define QUERY_DEFAULT_PROP(prop,val,default_val) G_STMT_START { \ + const AMFPropertyInfo *pinfo = nullptr; \ + result = comp->GetPropertyInfo (prop, &pinfo); \ + if (result == AMF_OK && pinfo) { \ + dev_caps.val = AMFVariantGetInt64 (&pinfo->defaultValue); \ + GST_INFO_OBJECT (device, G_STRINGIFY (val) ": %" G_GINT64_FORMAT, \ + dev_caps.val); \ + } else { \ + dev_caps.val = default_val; \ + } \ +} G_STMT_END + + QUERY_DEFAULT_PROP (AMF_VIDEO_ENCODER_HEVC_QP_I, default_qp_i, 26); + QUERY_DEFAULT_PROP (AMF_VIDEO_ENCODER_HEVC_QP_P, default_qp_p, 26); +#undef QUERY_DEFAULT_PROP + + { + const AMFPropertyInfo *pinfo = nullptr; + result = comp->GetPropertyInfo (AMF_VIDEO_ENCODER_HEVC_GOP_SIZE, &pinfo); + if (result == AMF_OK && pinfo) { + dev_caps.default_gop_size = AMFVariantGetInt64 (&pinfo->defaultValue); + dev_caps.min_gop_size = AMFVariantGetInt64 (&pinfo->minValue); + dev_caps.max_gop_size = AMFVariantGetInt64 (&pinfo->maxValue); + GST_INFO_OBJECT (device, "gop-size: default %d, min %d, max %d", + (guint) dev_caps.default_gop_size, + (guint) dev_caps.min_gop_size, (guint) dev_caps.max_gop_size); + } else { + dev_caps.default_gop_size = 30; + dev_caps.min_gop_size = 0; + dev_caps.max_gop_size = G_MAXINT; + } + } + + min_width = MAX (in_min_width, 1); + max_width = in_max_width; + if (max_width == 0) { + GST_WARNING_OBJECT (device, "Unknown max width, assuming 4096"); + max_width = 4096; + } + + min_height = MAX (in_min_height, 1); + max_height = in_max_height; + if (max_height == 0) { + GST_WARNING_OBJECT (device, "Unknown max height, assuming 4096"); + max_height = 4096; + } + + resolution_str = "width = (int) " + std::to_string (min_width) + + ", " + std::to_string (max_width) + " "; + resolution_str += ", height = (int) " + std::to_string (min_height) + + ", " + std::to_string (max_height) + " "; + + sink_caps_str = "video/x-raw, format = (string) NV12, " + resolution_str + + ", interlace-mode = (string) progressive"; + src_caps_str = "video/x-h265, " + resolution_str + ", profile = (string) main" + ", stream-format = (string) byte-stream, alignment = (string) au"; + + system_caps = gst_caps_from_string (sink_caps_str.c_str ()); + sink_caps = gst_caps_copy (system_caps); + gst_caps_set_features (sink_caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr)); + gst_caps_append (sink_caps, system_caps); + + cdata = g_new0 (GstAmfH265EncClassData, 1); + cdata->sink_caps = sink_caps; + cdata->src_caps = gst_caps_from_string (src_caps_str.c_str ()); + cdata->dev_caps = dev_caps; + g_object_get (device, "adapter-luid", &cdata->adapter_luid, nullptr); + + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GST_DEBUG_OBJECT (device, "Sink caps %" GST_PTR_FORMAT, cdata->sink_caps); + GST_DEBUG_OBJECT (device, "Src caps %" GST_PTR_FORMAT, cdata->src_caps); + + return cdata; +} + +void +gst_amf_h265_enc_register_d3d11 (GstPlugin * plugin, GstD3D11Device * device, + gpointer context, guint rank) +{ + GstAmfH265EncClassData *cdata; + AMFContext *amf_context = (AMFContext *) context; + AMFFactory *factory = (AMFFactory *) gst_amf_get_factory (); + AMFComponentPtr comp; + AMF_RESULT result; + + GST_DEBUG_CATEGORY_INIT (gst_amf_h265_enc_debug, "amfh265enc", 0, + "amfh265enc"); + + result = factory->CreateComponent (amf_context, AMFVideoEncoder_HEVC, &comp); + if (result != AMF_OK) { + GST_WARNING_OBJECT (device, "Failed to create component, result %" + GST_AMF_RESULT_FORMAT, GST_AMF_RESULT_ARGS (result)); + return; + } + + cdata = gst_amf_h265_enc_create_class_data (device, comp.GetPtr ()); + if (!cdata) + return; + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstAmfH265EncClass), + nullptr, + nullptr, + (GClassInitFunc) gst_amf_h265_enc_class_init, + nullptr, + cdata, + sizeof (GstAmfH265Enc), + 0, + (GInstanceInitFunc) gst_amf_h265_enc_init, + }; + + type_name = g_strdup ("GstAmfH265Enc"); + feature_name = g_strdup ("amfh265enc"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstAmfH265Device%dEnc", index); + feature_name = g_strdup_printf ("amfh265device%denc", index); + } + + type = g_type_register_static (GST_TYPE_AMF_ENCODER, type_name, + &type_info, (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/gstamfh265enc.h
Added
@@ -0,0 +1,32 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "gstamfencoder.h" +#include <gst/d3d11/gstd3d11.h> + +G_BEGIN_DECLS + +void gst_amf_h265_enc_register_d3d11 (GstPlugin * plugin, + GstD3D11Device * device, + gpointer context, + guint rank); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/gstamfutils.cpp
Added
@@ -0,0 +1,140 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <core/Factory.h> +#include "gstamfutils.h" +#include <gmodule.h> + +using namespace amf; + +AMFFactory *_factory = nullptr; +static gboolean loaded = FALSE; + +static gboolean +gst_amf_load_library (void) +{ + AMF_RESULT result; + GModule *amf_module = nullptr; + AMFInit_Fn init_func = nullptr; + + amf_module = g_module_open (AMF_DLL_NAMEA, G_MODULE_BIND_LAZY); + if (!amf_module) + return FALSE; + + if (!g_module_symbol (amf_module, AMF_INIT_FUNCTION_NAME, (gpointer *) + & init_func)) { + g_module_close (amf_module); + amf_module = nullptr; + + return FALSE; + } + + result = init_func (AMF_FULL_VERSION, &_factory); + if (result != AMF_OK) { + g_module_close (amf_module); + amf_module = nullptr; + _factory = nullptr; + return FALSE; + } + + return TRUE; +} + +gboolean +gst_amf_init_once (void) +{ + static gsize init_once = 0; + + if (g_once_init_enter (&init_once)) { + loaded = gst_amf_load_library (); + g_once_init_leave (&init_once, 1); + } + + return loaded; +} + +gpointer +gst_amf_get_factory (void) +{ + return (gpointer) _factory; +} + +const gchar * +gst_amf_result_to_string (AMF_RESULT result) +{ +#define CASE(err) \ + case err: \ + return G_STRINGIFY (err); + + switch (result) { + CASE (AMF_OK); + CASE (AMF_FAIL); + CASE (AMF_UNEXPECTED); + CASE (AMF_ACCESS_DENIED); + CASE (AMF_INVALID_ARG); + CASE (AMF_OUT_OF_RANGE); + CASE (AMF_OUT_OF_MEMORY); + CASE (AMF_INVALID_POINTER); + CASE (AMF_NO_INTERFACE); + CASE (AMF_NOT_IMPLEMENTED); + CASE (AMF_NOT_SUPPORTED); + CASE (AMF_NOT_FOUND); + CASE (AMF_ALREADY_INITIALIZED); + CASE (AMF_NOT_INITIALIZED); + CASE (AMF_INVALID_FORMAT); + CASE (AMF_WRONG_STATE); + CASE (AMF_FILE_NOT_OPEN); + CASE (AMF_NO_DEVICE); + CASE (AMF_DIRECTX_FAILED); + CASE (AMF_OPENCL_FAILED); + CASE (AMF_GLX_FAILED); + CASE (AMF_XV_FAILED); + CASE (AMF_ALSA_FAILED); + CASE (AMF_EOF); + CASE (AMF_REPEAT); + CASE (AMF_INPUT_FULL); + CASE (AMF_RESOLUTION_CHANGED); + CASE (AMF_RESOLUTION_UPDATED); + CASE (AMF_INVALID_DATA_TYPE); + CASE (AMF_INVALID_RESOLUTION); + CASE (AMF_CODEC_NOT_SUPPORTED); + CASE (AMF_SURFACE_FORMAT_NOT_SUPPORTED); + CASE (AMF_SURFACE_MUST_BE_SHARED); + CASE (AMF_DECODER_NOT_PRESENT); + CASE (AMF_DECODER_SURFACE_ALLOCATION_FAILED); + CASE (AMF_DECODER_NO_FREE_SURFACES); + CASE (AMF_ENCODER_NOT_PRESENT); + CASE (AMF_DEM_ERROR); + CASE (AMF_DEM_PROPERTY_READONLY); + CASE (AMF_DEM_REMOTE_DISPLAY_CREATE_FAILED); + CASE (AMF_DEM_START_ENCODING_FAILED); + CASE (AMF_DEM_QUERY_OUTPUT_FAILED); + CASE (AMF_TAN_CLIPPING_WAS_REQUIRED); + CASE (AMF_TAN_UNSUPPORTED_VERSION); + CASE (AMF_NEED_MORE_INPUT); + default: + break; + } +#undef CASE + return "Unknown"; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/gstamfutils.h
Added
@@ -0,0 +1,35 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <core/Result.h> + +G_BEGIN_DECLS + +gboolean gst_amf_init_once (void); + +gpointer gst_amf_get_factory (void); + +const gchar * gst_amf_result_to_string (AMF_RESULT result); +#define GST_AMF_RESULT_FORMAT "s (%d)" +#define GST_AMF_RESULT_ARGS(r) gst_amf_result_to_string (r), r + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/components
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/components/ColorSpace.h
Added
@@ -0,0 +1,138 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +//------------------------------------------------------------------------------------------------- +// Color Spacedeclaration +//------------------------------------------------------------------------------------------------- +#ifndef AMF_ColorSpace_h +#define AMF_ColorSpace_h +#pragma once + +// YUV <--> RGB conversion matrix with range +typedef enum AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM +{ + AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN =-1, + AMF_VIDEO_CONVERTER_COLOR_PROFILE_601 = 0, // studio range + AMF_VIDEO_CONVERTER_COLOR_PROFILE_709 = 1, // studio range + AMF_VIDEO_CONVERTER_COLOR_PROFILE_2020 = 2, // studio range + AMF_VIDEO_CONVERTER_COLOR_PROFILE_JPEG = 3, // full range 601 +// AMF_VIDEO_CONVERTER_COLOR_PROFILE_G22_BT709 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_709, +// AMF_VIDEO_CONVERTER_COLOR_PROFILE_G10_SCRGB = 4, +// AMF_VIDEO_CONVERTER_COLOR_PROFILE_G10_BT709 = 5, +// AMF_VIDEO_CONVERTER_COLOR_PROFILE_G10_BT2020 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_2020, +// AMF_VIDEO_CONVERTER_COLOR_PROFILE_G2084_BT2020 = 6, + AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_601 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_JPEG, // full range + AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_709 = 7, // full range + AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_2020 = 8, // full range + AMF_VIDEO_CONVERTER_COLOR_PROFILE_COUNT +} AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM; + +typedef enum AMF_COLOR_PRIMARIES_ENUM // as in VUI color_primaries AVC and HEVC +{ + AMF_COLOR_PRIMARIES_UNDEFINED = 0, + AMF_COLOR_PRIMARIES_BT709 = 1, + AMF_COLOR_PRIMARIES_UNSPECIFIED = 2, + AMF_COLOR_PRIMARIES_RESERVED = 3, + AMF_COLOR_PRIMARIES_BT470M = 4, + AMF_COLOR_PRIMARIES_BT470BG = 5, + AMF_COLOR_PRIMARIES_SMPTE170M = 6, + AMF_COLOR_PRIMARIES_SMPTE240M = 7, + AMF_COLOR_PRIMARIES_FILM = 8, + AMF_COLOR_PRIMARIES_BT2020 = 9, + AMF_COLOR_PRIMARIES_SMPTE428 = 10, + AMF_COLOR_PRIMARIES_SMPTE431 = 11, + AMF_COLOR_PRIMARIES_SMPTE432 = 12, + AMF_COLOR_PRIMARIES_JEDEC_P22 = 22, + AMF_COLOR_PRIMARIES_CCCS = 1000, // Common Composition Color Space or scRGB +} AMF_COLOR_PRIMARIES_ENUM; + +typedef enum AMF_COLOR_TRANSFER_CHARACTERISTIC_ENUM // as in VUI transfer_characteristic AVC and HEVC +{ + AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED = 0, + AMF_COLOR_TRANSFER_CHARACTERISTIC_BT709 = 1, //BT709 + AMF_COLOR_TRANSFER_CHARACTERISTIC_UNSPECIFIED = 2, + AMF_COLOR_TRANSFER_CHARACTERISTIC_RESERVED = 3, + AMF_COLOR_TRANSFER_CHARACTERISTIC_GAMMA22 = 4, //BT470_M + AMF_COLOR_TRANSFER_CHARACTERISTIC_GAMMA28 = 5, //BT470 + AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE170M = 6, //BT601 + AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE240M = 7, //SMPTE 240M + AMF_COLOR_TRANSFER_CHARACTERISTIC_LINEAR = 8, + AMF_COLOR_TRANSFER_CHARACTERISTIC_LOG = 9, //LOG10 + AMF_COLOR_TRANSFER_CHARACTERISTIC_LOG_SQRT = 10,//LOG10 SQRT + AMF_COLOR_TRANSFER_CHARACTERISTIC_IEC61966_2_4 = 11, + AMF_COLOR_TRANSFER_CHARACTERISTIC_BT1361_ECG = 12, + AMF_COLOR_TRANSFER_CHARACTERISTIC_IEC61966_2_1 = 13, + AMF_COLOR_TRANSFER_CHARACTERISTIC_BT2020_10 = 14, //BT709 + AMF_COLOR_TRANSFER_CHARACTERISTIC_BT2020_12 = 15, //BT709 + AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE2084 = 16, //PQ + AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE428 = 17, + AMF_COLOR_TRANSFER_CHARACTERISTIC_ARIB_STD_B67 = 18, //HLG +} AMF_COLOR_TRANSFER_CHARACTERISTIC_ENUM; + +typedef enum AMF_COLOR_BIT_DEPTH_ENUM +{ + AMF_COLOR_BIT_DEPTH_UNDEFINED = 0, + AMF_COLOR_BIT_DEPTH_8 = 8, + AMF_COLOR_BIT_DEPTH_10 = 10, +} AMF_COLOR_BIT_DEPTH_ENUM; + +typedef struct AMFHDRMetadata +{ + amf_uint16 redPrimary2; // normalized to 50000 + amf_uint16 greenPrimary2; // normalized to 50000 + amf_uint16 bluePrimary2; // normalized to 50000 + amf_uint16 whitePoint2; // normalized to 50000 + amf_uint32 maxMasteringLuminance; // normalized to 10000 + amf_uint32 minMasteringLuminance; // normalized to 10000 + amf_uint16 maxContentLightLevel; // nit value + amf_uint16 maxFrameAverageLightLevel; // nit value +} AMFHDRMetadata; + + +typedef enum AMF_COLOR_RANGE_ENUM +{ + AMF_COLOR_RANGE_UNDEFINED = 0, + AMF_COLOR_RANGE_STUDIO = 1, + AMF_COLOR_RANGE_FULL = 2, +} AMF_COLOR_RANGE_ENUM; + + +// these properties can be set on input or outout surface +// IDs are the same as in decoder properties +// can be used to dynamically pass color data between components: +// Decoder, Capture, Encoder. Presenter etc. +#define AMF_VIDEO_COLOR_TRANSFER_CHARACTERISTIC L"ColorTransferChar" // amf_int64(AMF_COLOR_TRANSFER_CHARACTERISTIC_ENUM); default = AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED, ISO/IEC 23001-8_2013 Section 7.2 See ColorSpace.h for enum +#define AMF_VIDEO_COLOR_PRIMARIES L"ColorPrimaries" // amf_int64(AMF_COLOR_PRIMARIES_ENUM); default = AMF_COLOR_PRIMARIES_UNDEFINED, ISO/IEC 23001-8_2013 Section 7.1 See ColorSpace.h for enum +#define AMF_VIDEO_COLOR_RANGE L"ColorRange" // amf_int64(AMF_COLOR_RANGE_ENUM) default = AMF_COLOR_RANGE_UNDEFINED +#define AMF_VIDEO_COLOR_HDR_METADATA L"HdrMetadata" // AMFBuffer containing AMFHDRMetadata; default NULL + +#endif //#ifndef AMF_ColorSpace_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/components/Component.h
Added
@@ -0,0 +1,443 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +/** + *************************************************************************************************** + * @file Component.h + * @brief AMFComponent interface declaration + *************************************************************************************************** + */ +#ifndef AMF_Component_h +#define AMF_Component_h +#pragma once + +#include "../core/Data.h" +#include "../core/PropertyStorageEx.h" +#include "../core/Surface.h" +#include "../core/Context.h" +#include "ComponentCaps.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif + //---------------------------------------------------------------------------------------------- + // AMFDataAllocatorCB interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFDataAllocatorCB : public AMFInterface + { + public: + AMF_DECLARE_IID(0x4bf46198, 0x8b7b, 0x49d0, 0xaa, 0x72, 0x48, 0xd4, 0x7, 0xce, 0x24, 0xc5 ) + + virtual AMF_RESULT AMF_STD_CALL AllocBuffer(AMF_MEMORY_TYPE type, amf_size size, AMFBuffer** ppBuffer) = 0; + virtual AMF_RESULT AMF_STD_CALL AllocSurface(AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, + amf_int32 width, amf_int32 height, amf_int32 hPitch, amf_int32 vPitch, AMFSurface** ppSurface) = 0; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFDataAllocatorCB> AMFDataAllocatorCBPtr; +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFDataAllocatorCB, 0x4bf46198, 0x8b7b, 0x49d0, 0xaa, 0x72, 0x48, 0xd4, 0x7, 0xce, 0x24, 0xc5 ) + typedef struct AMFDataAllocatorCB AMFDataAllocatorCB; + + typedef struct AMFDataAllocatorCBVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFDataAllocatorCB* pThis); + amf_long (AMF_STD_CALL *Release)(AMFDataAllocatorCB* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFDataAllocatorCB* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + // AMFDataAllocatorCB interface + AMF_RESULT (AMF_STD_CALL *AllocBuffer)(AMFDataAllocatorCB* pThis, AMF_MEMORY_TYPE type, amf_size size, AMFBuffer** ppBuffer); + AMF_RESULT (AMF_STD_CALL *AllocSurface)(AMFDataAllocatorCB* pThis, AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, + amf_int32 width, amf_int32 height, amf_int32 hPitch, amf_int32 vPitch, AMFSurface** ppSurface); + } AMFDataAllocatorCBVtbl; + + struct AMFDataAllocatorCB + { + const AMFDataAllocatorCBVtbl *pVtbl; + }; + +#endif // #if defined(__cplusplus) + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFComponentOptimizationCallback + { + public: + virtual AMF_RESULT AMF_STD_CALL OnComponentOptimizationProgress(amf_uint percent) = 0; + }; +#else // #if defined(__cplusplus) + typedef struct AMFComponentOptimizationCallback AMFComponentOptimizationCallback; + typedef struct AMFComponentOptimizationCallbackVtbl + { + // AMFDataAllocatorCB interface + AMF_RESULT (AMF_STD_CALL *OnComponentOptimizationProgress)(AMFComponentOptimizationCallback* pThis, amf_uint percent); + } AMFComponentOptimizationCallbackVtbl; + + struct AMFComponentOptimizationCallback + { + const AMFComponentOptimizationCallbackVtbl *pVtbl; + }; + +#endif //#if defined(__cplusplus) + //---------------------------------------------------------------------------------------------- + // AMFComponent interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFComponent : public AMFPropertyStorageEx + { + public: + AMF_DECLARE_IID(0x8b51e5e4, 0x455d, 0x4034, 0xa7, 0x46, 0xde, 0x1b, 0xed, 0xc3, 0xc4, 0x6) + + virtual AMF_RESULT AMF_STD_CALL Init(AMF_SURFACE_FORMAT format,amf_int32 width,amf_int32 height) = 0; + virtual AMF_RESULT AMF_STD_CALL ReInit(amf_int32 width,amf_int32 height) = 0; + virtual AMF_RESULT AMF_STD_CALL Terminate() = 0; + virtual AMF_RESULT AMF_STD_CALL Drain() = 0; + virtual AMF_RESULT AMF_STD_CALL Flush() = 0; + + virtual AMF_RESULT AMF_STD_CALL SubmitInput(AMFData* pData) = 0; + virtual AMF_RESULT AMF_STD_CALL QueryOutput(AMFData** ppData) = 0; + virtual AMFContext* AMF_STD_CALL GetContext() = 0; + virtual AMF_RESULT AMF_STD_CALL SetOutputDataAllocatorCB(AMFDataAllocatorCB* callback) = 0; + + virtual AMF_RESULT AMF_STD_CALL GetCaps(AMFCaps** ppCaps) = 0; + virtual AMF_RESULT AMF_STD_CALL Optimize(AMFComponentOptimizationCallback* pCallback) = 0; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFComponent> AMFComponentPtr; +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFComponent, 0x8b51e5e4, 0x455d, 0x4034, 0xa7, 0x46, 0xde, 0x1b, 0xed, 0xc3, 0xc4, 0x6) + typedef struct AMFComponent AMFComponent; + + typedef struct AMFComponentVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFComponent* pThis); + amf_long (AMF_STD_CALL *Release)(AMFComponent* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFComponent* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFPropertyStorage interface + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFComponent* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFComponent* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFComponent* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFComponent* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFComponent* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFComponent* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFComponent* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFComponent* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFComponent* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFComponent* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFPropertyStorageEx interface + + amf_size (AMF_STD_CALL *GetPropertiesInfoCount)(AMFComponent* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyInfoAt)(AMFComponent* pThis, amf_size index, const AMFPropertyInfo** ppInfo); + AMF_RESULT (AMF_STD_CALL *GetPropertyInfo)(AMFComponent* pThis, const wchar_t* name, const AMFPropertyInfo** ppInfo); + AMF_RESULT (AMF_STD_CALL *ValidateProperty)(AMFComponent* pThis, const wchar_t* name, AMFVariantStruct value, AMFVariantStruct* pOutValidated); + + // AMFComponent interface + + AMF_RESULT (AMF_STD_CALL *Init)(AMFComponent* pThis, AMF_SURFACE_FORMAT format,amf_int32 width,amf_int32 height); + AMF_RESULT (AMF_STD_CALL *ReInit)(AMFComponent* pThis, amf_int32 width,amf_int32 height); + AMF_RESULT (AMF_STD_CALL *Terminate)(AMFComponent* pThis); + AMF_RESULT (AMF_STD_CALL *Drain)(AMFComponent* pThis); + AMF_RESULT (AMF_STD_CALL *Flush)(AMFComponent* pThis); + + AMF_RESULT (AMF_STD_CALL *SubmitInput)(AMFComponent* pThis, AMFData* pData); + AMF_RESULT (AMF_STD_CALL *QueryOutput)(AMFComponent* pThis, AMFData** ppData); + AMFContext* (AMF_STD_CALL *GetContext)(AMFComponent* pThis); + AMF_RESULT (AMF_STD_CALL *SetOutputDataAllocatorCB)(AMFComponent* pThis, AMFDataAllocatorCB* callback); + + AMF_RESULT (AMF_STD_CALL *GetCaps)(AMFComponent* pThis, AMFCaps** ppCaps); + AMF_RESULT (AMF_STD_CALL *Optimize)(AMFComponent* pThis, AMFComponentOptimizationCallback* pCallback); + } AMFComponentVtbl; + + struct AMFComponent + { + const AMFComponentVtbl *pVtbl; + }; + +#endif // #if defined(__cplusplus) + //---------------------------------------------------------------------------------------------- + // AMFInput interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFInput : public AMFPropertyStorageEx + { + public: + AMF_DECLARE_IID(0x1181eee7, 0x95f2, 0x434a, 0x9b, 0x96, 0xea, 0x55, 0xa, 0xa7, 0x84, 0x89) + + virtual AMF_RESULT AMF_STD_CALL SubmitInput(AMFData* pData) = 0; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFInput> AMFInputPtr; +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFInput, 0x1181eee7, 0x95f2, 0x434a, 0x9b, 0x96, 0xea, 0x55, 0xa, 0xa7, 0x84, 0x89) + typedef struct AMFInput AMFInput; + + typedef struct AMFInputVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFInput* pThis); + amf_long (AMF_STD_CALL *Release)(AMFInput* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFInput* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFPropertyStorage interface + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFInput* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFInput* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFInput* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFInput* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFInput* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFInput* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFInput* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFInput* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFInput* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFInput* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFPropertyStorageEx interface + + amf_size (AMF_STD_CALL *GetPropertiesInfoCount)(AMFInput* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyInfoAt)(AMFInput* pThis, amf_size index, const AMFPropertyInfo** ppInfo); + AMF_RESULT (AMF_STD_CALL *GetPropertyInfo)(AMFInput* pThis, const wchar_t* name, const AMFPropertyInfo** ppInfo); + AMF_RESULT (AMF_STD_CALL *ValidateProperty)(AMFInput* pThis, const wchar_t* name, AMFVariantStruct value, AMFVariantStruct* pOutValidated); + + // AMFInput interface + AMF_RESULT (AMF_STD_CALL *SubmitInput)(AMFInput* pThis, AMFData* pData); + + } AMFInputVtbl; + + struct AMFInput + { + const AMFInputVtbl *pVtbl; + }; +#endif // #if defined(__cplusplus) + + //---------------------------------------------------------------------------------------------- + // AMFOutput interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFOutput : public AMFPropertyStorageEx + { + public: + AMF_DECLARE_IID(0x86a8a037, 0x912c, 0x4698, 0xb0, 0x46, 0x7, 0x5a, 0x1f, 0xac, 0x6b, 0x97) + + virtual AMF_RESULT AMF_STD_CALL QueryOutput(AMFData** ppData) = 0; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFOutput> AMFOutputPtr; +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFOutput, 0x86a8a037, 0x912c, 0x4698, 0xb0, 0x46, 0x7, 0x5a, 0x1f, 0xac, 0x6b, 0x97) + typedef struct AMFOutput AMFOutput; + + typedef struct AMFOutputVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFOutput* pThis); + amf_long (AMF_STD_CALL *Release)(AMFOutput* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFOutput* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFPropertyStorage interface + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFOutput* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFOutput* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFOutput* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFOutput* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFOutput* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFOutput* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFOutput* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFOutput* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFOutput* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFOutput* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFPropertyStorageEx interface + + amf_size (AMF_STD_CALL *GetPropertiesInfoCount)(AMFOutput* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyInfoAt)(AMFOutput* pThis, amf_size index, const AMFPropertyInfo** ppInfo); + AMF_RESULT (AMF_STD_CALL *GetPropertyInfo)(AMFOutput* pThis, const wchar_t* name, const AMFPropertyInfo** ppInfo); + AMF_RESULT (AMF_STD_CALL *ValidateProperty)(AMFOutput* pThis, const wchar_t* name, AMFVariantStruct value, AMFVariantStruct* pOutValidated); + + // AMFOutput interface + AMF_RESULT (AMF_STD_CALL *QueryOutput)(AMFOutput* pThis, AMFData** ppData); + + } AMFOutputVtbl; + + struct AMFOutput + { + const AMFOutputVtbl *pVtbl; + }; + +#endif // #if defined(__cplusplus) + //---------------------------------------------------------------------------------------------- + // AMFComponent interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFComponentEx : public AMFComponent + { + public: + AMF_DECLARE_IID(0xfda792af, 0x8712, 0x44df, 0x8e, 0xa0, 0xdf, 0xfa, 0xad, 0x2c, 0x80, 0x93) + + virtual amf_int32 AMF_STD_CALL GetInputCount() = 0; + virtual amf_int32 AMF_STD_CALL GetOutputCount() = 0; + + virtual AMF_RESULT AMF_STD_CALL GetInput(amf_int32 index, AMFInput** ppInput) = 0; + virtual AMF_RESULT AMF_STD_CALL GetOutput(amf_int32 index, AMFOutput** ppOutput) = 0; + + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFComponentEx> AMFComponentExPtr; +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFComponentEx, 0xfda792af, 0x8712, 0x44df, 0x8e, 0xa0, 0xdf, 0xfa, 0xad, 0x2c, 0x80, 0x93) + typedef struct AMFComponentEx AMFComponentEx; + + typedef struct AMFComponentExVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFComponentEx* pThis); + amf_long (AMF_STD_CALL *Release)(AMFComponentEx* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFComponentEx* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFPropertyStorage interface + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFComponentEx* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFComponentEx* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFComponentEx* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFComponentEx* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFComponentEx* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFComponentEx* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFComponentEx* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFComponentEx* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFComponentEx* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFComponentEx* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFPropertyStorageEx interface + + amf_size (AMF_STD_CALL *GetPropertiesInfoCount)(AMFComponentEx* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyInfoAt)(AMFComponentEx* pThis, amf_size index, const AMFPropertyInfo** ppInfo); + AMF_RESULT (AMF_STD_CALL *GetPropertyInfo)(AMFComponentEx* pThis, const wchar_t* name, const AMFPropertyInfo** ppInfo); + AMF_RESULT (AMF_STD_CALL *ValidateProperty)(AMFComponentEx* pThis, const wchar_t* name, AMFVariantStruct value, AMFVariantStruct* pOutValidated); + + // AMFComponent interface + + AMF_RESULT (AMF_STD_CALL *Init)(AMFComponentEx* pThis, AMF_SURFACE_FORMAT format,amf_int32 width,amf_int32 height); + AMF_RESULT (AMF_STD_CALL *ReInit)(AMFComponentEx* pThis, amf_int32 width,amf_int32 height); + AMF_RESULT (AMF_STD_CALL *Terminate)(AMFComponentEx* pThis); + AMF_RESULT (AMF_STD_CALL *Drain)(AMFComponentEx* pThis); + AMF_RESULT (AMF_STD_CALL *Flush)(AMFComponentEx* pThis); + + AMF_RESULT (AMF_STD_CALL *SubmitInput)(AMFComponentEx* pThis, AMFData* pData); + AMF_RESULT (AMF_STD_CALL *QueryOutput)(AMFComponentEx* pThis, AMFData** ppData); + AMFContext* (AMF_STD_CALL *GetContext)(AMFComponentEx* pThis); + AMF_RESULT (AMF_STD_CALL *SetOutputDataAllocatorCB)(AMFComponentEx* pThis, AMFDataAllocatorCB* callback); + + AMF_RESULT (AMF_STD_CALL *GetCaps)(AMFComponentEx* pThis, AMFCaps** ppCaps); + AMF_RESULT (AMF_STD_CALL *Optimize)(AMFComponentEx* pThis, AMFComponentOptimizationCallback* pCallback); + + // AMFComponentEx interface + + amf_int32 (AMF_STD_CALL *GetInputCount)(AMFComponentEx* pThis); + amf_int32 (AMF_STD_CALL *GetOutputCount)(AMFComponentEx* pThis); + + AMF_RESULT (AMF_STD_CALL *GetInput)(AMFComponentEx* pThis, amf_int32 index, AMFInput** ppInput); + AMF_RESULT (AMF_STD_CALL *GetOutput)(AMFComponentEx* pThis, amf_int32 index, AMFOutput** ppOutput); + + + } AMFComponentExVtbl; + + struct AMFComponentEx + { + const AMFComponentExVtbl *pVtbl; + }; +#endif // #if defined(__cplusplus) + + +#if defined(__cplusplus) +} // namespace +#endif + +typedef enum AMF_STREAM_TYPE_ENUM +{ + AMF_STREAM_UNKNOWN = 0, + AMF_STREAM_VIDEO = 1, + AMF_STREAM_AUDIO = 2, + AMF_STREAM_DATA = 3, +} AMF_STREAM_TYPE_ENUM; + +typedef enum AMF_STREAM_CODEC_ID_ENUM // matched codecs from VideoDecoxcderUVD.h +{ + AMF_STREAM_CODEC_ID_UNKNOWN = 0, + AMF_STREAM_CODEC_ID_MPEG2 = 1, // AMFVideoDecoderUVD_MPEG2 + AMF_STREAM_CODEC_ID_MPEG4 = 2, // AMFVideoDecoderUVD_MPEG4 + AMF_STREAM_CODEC_ID_WMV3 = 3, // AMFVideoDecoderUVD_WMV3 + AMF_STREAM_CODEC_ID_VC1 = 4, // AMFVideoDecoderUVD_VC1 + AMF_STREAM_CODEC_ID_H264_AVC = 5, // AMFVideoDecoderUVD_H264_AVC + AMF_STREAM_CODEC_ID_H264_MVC = 6, // AMFVideoDecoderUVD_H264_MVC + AMF_STREAM_CODEC_ID_H264_SVC = 7, // AMFVideoDecoderUVD_H264_SVC + AMF_STREAM_CODEC_ID_MJPEG = 8, // AMFVideoDecoderUVD_MJPEG + AMF_STREAM_CODEC_ID_H265_HEVC = 9, // AMFVideoDecoderHW_H265_HEVC + AMF_STREAM_CODEC_ID_H265_MAIN10 = 10, // AMFVideoDecoderHW_H265_MAIN10 + AMF_STREAM_CODEC_ID_VP9 = 11, // AMFVideoDecoderHW_VP9 + AMF_STREAM_CODEC_ID_VP9_10BIT = 12, // AMFVideoDecoderHW_VP9_10BIT + AMF_STREAM_CODEC_ID_AV1 = 13, // AMFVideoDecoderHW_AV1 +} AMF_STREAM_CODEC_ID_ENUM; + +// common stream properties +#define AMF_STREAM_TYPE L"StreamType" // amf_int64( AMF_STREAM_TYPE_ENUM ) +#define AMF_STREAM_ENABLED L"Enabled" // bool( default = false ) +#define AMF_STREAM_CODEC_ID L"CodecID" // amf_int64(Video: AMF_STREAM_CODEC_ID_ENUM, Audio: AVCodecID) (default = 0 - uncompressed) +#define AMF_STREAM_BIT_RATE L"BitRate" // amf_int64 (default = codec->bit_rate) +#define AMF_STREAM_EXTRA_DATA L"ExtraData" // interface to AMFBuffer - as is from FFMPEG + +// video stream properties +#define AMF_STREAM_VIDEO_MEMORY_TYPE L"VideoMemoryType" // amf_int64(AMF_MEMORY_TYPE); default = AMF_MEMORY_DX11 +#define AMF_STREAM_VIDEO_FORMAT L"VideoFormat" // amf_int64(AMF_SURFACE_FORMAT); default = AMF_SURFACE_NV12 (used if AMF_STREAM_CODEC_ID == 0) +#define AMF_STREAM_VIDEO_FRAME_RATE L"VideoFrameRate" // AMFRate; default = (30,1) - video frame rate +#define AMF_STREAM_VIDEO_FRAME_SIZE L"VideoFrameSize" // AMFSize; default = (1920,1080) - video frame rate +#define AMF_STREAM_VIDEO_SURFACE_POOL L"VideoSurfacePool" // amf_int64; default = 5, number of allocated output surfaces +//TODO support interlaced frames + +// audio stream properties +#define AMF_STREAM_AUDIO_FORMAT L"AudioFormat" // amf_int64(AMF_AUDIO_FORMAT); default = AMFAF_S16 +#define AMF_STREAM_AUDIO_SAMPLE_RATE L"AudioSampleRate" // amf_int64; default = 48000 +#define AMF_STREAM_AUDIO_CHANNELS L"AudioChannels" // amf_int64; default = 2 +#define AMF_STREAM_AUDIO_CHANNEL_LAYOUT L"AudioChannelLayout" // amf_int64 (default = codec->channel_layout) +#define AMF_STREAM_AUDIO_BLOCK_ALIGN L"AudioBlockAlign" // amf_int64 (default = codec->block_align) +#define AMF_STREAM_AUDIO_FRAME_SIZE L"AudioFrameSize" // amf_int64 (default = codec->frame_size) + + +#endif //#ifndef AMF_Component_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/components/ComponentCaps.h
Added
@@ -0,0 +1,172 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_ComponentCaps_h +#define AMF_ComponentCaps_h + +#pragma once + +#include "../core/Interface.h" +#include "../core/PropertyStorage.h" +#include "../core/Surface.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif + typedef enum AMF_ACCELERATION_TYPE + { + AMF_ACCEL_NOT_SUPPORTED = -1, + AMF_ACCEL_HARDWARE, + AMF_ACCEL_GPU, + AMF_ACCEL_SOFTWARE + } AMF_ACCELERATION_TYPE; + //---------------------------------------------------------------------------------------------- + // AMFIOCaps interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFIOCaps : public AMFInterface + { + public: + // Get supported resolution ranges in pixels/lines: + virtual void AMF_STD_CALL GetWidthRange(amf_int32* minWidth, amf_int32* maxWidth) const = 0; + virtual void AMF_STD_CALL GetHeightRange(amf_int32* minHeight, amf_int32* maxHeight) const = 0; + + // Get memory alignment in lines: Vertical aligmnent should be multiples of this number + virtual amf_int32 AMF_STD_CALL GetVertAlign() const = 0; + + // Enumerate supported surface pixel formats + virtual amf_int32 AMF_STD_CALL GetNumOfFormats() const = 0; + virtual AMF_RESULT AMF_STD_CALL GetFormatAt(amf_int32 index, AMF_SURFACE_FORMAT* format, amf_bool* native) const = 0; + + // Enumerate supported memory types + virtual amf_int32 AMF_STD_CALL GetNumOfMemoryTypes() const = 0; + virtual AMF_RESULT AMF_STD_CALL GetMemoryTypeAt(amf_int32 index, AMF_MEMORY_TYPE* memType, amf_bool* native) const = 0; + + virtual amf_bool AMF_STD_CALL IsInterlacedSupported() const = 0; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFIOCaps> AMFIOCapsPtr; +#else // #if defined(__cplusplus) + typedef struct AMFIOCaps AMFIOCaps; + + typedef struct AMFIOCapsVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFIOCaps* pThis); + amf_long (AMF_STD_CALL *Release)(AMFIOCaps* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFIOCaps* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFIOCaps interface + // Get supported resolution ranges in pixels/lines: + void (AMF_STD_CALL *GetWidthRange)(AMFIOCaps* pThis, amf_int32* minWidth, amf_int32* maxWidth); + void (AMF_STD_CALL *GetHeightRange)(AMFIOCaps* pThis, amf_int32* minHeight, amf_int32* maxHeight); + + // Get memory alignment in lines: Vertical aligmnent should be multiples of this number + amf_int32 (AMF_STD_CALL *GetVertAlign)(AMFIOCaps* pThis); + + // Enumerate supported surface pixel formats + amf_int32 (AMF_STD_CALL *GetNumOfFormats)(AMFIOCaps* pThis); + AMF_RESULT (AMF_STD_CALL *GetFormatAt)(AMFIOCaps* pThis, amf_int32 index, AMF_SURFACE_FORMAT* format, amf_bool* native); + + // Enumerate supported memory types + amf_int32 (AMF_STD_CALL *GetNumOfMemoryTypes)(AMFIOCaps* pThis); + AMF_RESULT (AMF_STD_CALL *GetMemoryTypeAt)(AMFIOCaps* pThis, amf_int32 index, AMF_MEMORY_TYPE* memType, amf_bool* native); + + amf_bool (AMF_STD_CALL *IsInterlacedSupported)(AMFIOCaps* pThis); + } AMFIOCapsVtbl; + + struct AMFIOCaps + { + const AMFIOCapsVtbl *pVtbl; + }; + +#endif // #if defined(__cplusplus) + + //---------------------------------------------------------------------------------------------- + // AMFCaps interface - base interface for every h/w module supported by Capability Manager + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFCaps : public AMFPropertyStorage + { + public: + virtual AMF_ACCELERATION_TYPE AMF_STD_CALL GetAccelerationType() const = 0; + virtual AMF_RESULT AMF_STD_CALL GetInputCaps(AMFIOCaps** input) = 0; + virtual AMF_RESULT AMF_STD_CALL GetOutputCaps(AMFIOCaps** output) = 0; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFCaps> AMFCapsPtr; +#else // #if defined(__cplusplus) + typedef struct AMFCaps AMFCaps; + + typedef struct AMFCapsVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFCaps* pThis); + amf_long (AMF_STD_CALL *Release)(AMFCaps* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFCaps* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFPropertyStorage interface + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFCaps* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFCaps* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFCaps* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFCaps* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFCaps* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFCaps* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFCaps* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFCaps* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFCaps* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFCaps* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFCaps interface + + AMF_ACCELERATION_TYPE (AMF_STD_CALL *GetAccelerationType)(AMFCaps* pThis); + AMF_RESULT (AMF_STD_CALL *GetInputCaps)(AMFCaps* pThis, AMFIOCaps** input); + AMF_RESULT (AMF_STD_CALL *GetOutputCaps)(AMFCaps* pThis, AMFIOCaps** output); + } AMFCapsVtbl; + + struct AMFCaps + { + const AMFCapsVtbl *pVtbl; + }; +#endif // #if defined(__cplusplus) + + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) +} +#endif + +#endif //#ifndef AMF_ComponentCaps_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/components/PreAnalysis.h
Added
@@ -0,0 +1,110 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2019 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMFPreAnalysis_h +#define AMFPreAnalysis_h + +#pragma once + +#define AMFPreAnalysis L"AMFPreAnalysis" + + + +enum AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY_ENUM +{ + AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY_LOW = 0, + AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY_MEDIUM = 1, + AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY_HIGH = 2 +}; + + +enum AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY_ENUM +{ + AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY_LOW = 0, + AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY_MEDIUM = 1, + AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY_HIGH = 2 +}; + + +enum AMF_PA_ACTIVITY_TYPE_ENUM +{ + AMF_PA_ACTIVITY_Y = 0, + AMF_PA_ACTIVITY_YUV = 1 +}; + + +enum AMF_PA_CAQ_STRENGTH_ENUM +{ + AMF_PA_CAQ_STRENGTH_LOW = 0, + AMF_PA_CAQ_STRENGTH_MEDIUM = 1, + AMF_PA_CAQ_STRENGTH_HIGH = 2 +}; + + + +// PA object properties +#define AMF_PA_ENGINE_TYPE L"PAEngineType" // AMF_MEMORY_TYPE (Host, DX11, OpenCL, Vulkan, Auto default : UNKNOWN (Auto))" - determines how the object is initialized and what kernels to use + // by default it is Auto (DX11, OpenCL and Vulkan are currently available) + +#define AMF_PA_SCENE_CHANGE_DETECTION_ENABLE L"PASceneChangeDetectionEnable" // bool (default : True) - Enable Scene Change Detection GPU algorithm +#define AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY L"PASceneChangeDetectionSensitivity" // AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY_ENUM (default : Medium) - Scene Change Detection Sensitivity +#define AMF_PA_STATIC_SCENE_DETECTION_ENABLE L"PAStaticSceneDetectionEnable" // bool (default : True) - Enable Skip Detection GPU algorithm +#define AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY L"PAStaticSceneDetectionSensitivity" // AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY_ENUM (default : High) - Allowable absolute difference between pixels (sample counts) +#define AMF_PA_FRAME_SAD_ENABLE L"PAFrameSadEnable" // bool (default : True) - Enable Frame SAD algorithm +#define AMF_PA_ACTIVITY_TYPE L"PAActivityType" // AMF_PA_ACTIVITY_TYPE_ENUM (default : Calculate on Y) - Block activity calculation mode +#define AMF_PA_LTR_ENABLE L"PALongTermReferenceEnable" // bool (default : True) - Enable Automatic Long Term Reference frame management + + + +/////////////////////////////////////////// +// the following properties are available +// only through the Encoder - trying to +// access/set them when PA is standalone +// will fail + + +#define AMF_PA_INITIAL_QP_AFTER_SCENE_CHANGE L"PAInitialQPAfterSceneChange" // amf_uint64 (default : 0) Values: 0, 51 - Base QP to be used immediately after scene change. If this value is not set, PA will choose a proper QP value +#define AMF_PA_MAX_QP_BEFORE_FORCE_SKIP L"PAMaxQPBeforeForceSkip" // amf_uint64 (default : 35) Values: 0, 51 - When a static scene is detected, a skip frame is inserted only if the previous encoded frame average QP <= this value + + +#define AMF_PA_CAQ_STRENGTH L"PACAQStrength" // AMF_PA_CAQ_STRENGTH_ENUM (default : Medium) - Content Adaptive Quantization (CAQ) strength + + + + +////////////////////////////////////////////////// +// properties set by PA on output buffer interface +#define AMF_PA_ACTIVITY_MAP L"PAActivityMap" // AMFInterface* -> AMFSurface*; Values: int32 - When PA is standalone, there will be a 2D Activity map generated for each frame +#define AMF_PA_SCENE_CHANGE_DETECT L"PASceneChangeDetect" // bool - True/False - available if AMF_PA_SCENE_CHANGE_DETECTION_ENABLE was set to True +#define AMF_PA_STATIC_SCENE_DETECT L"PAStaticSceneDetect" // bool - True/False - available if AMF_PA_STATIC_SCENE_DETECTION_ENABLE was set to True + +#endif //#ifndef AMFPreAnalysis_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/components/VideoDecoderUVD.h
Added
@@ -0,0 +1,122 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +//------------------------------------------------------------------------------------------------- +// VideoDecoderUVD interface declaration +//------------------------------------------------------------------------------------------------- +#ifndef AMF_VideoDecoderUVD_h +#define AMF_VideoDecoderUVD_h +#pragma once + +#include "Component.h" +#include "ColorSpace.h" + +#define AMFVideoDecoderUVD_MPEG2 L"AMFVideoDecoderUVD_MPEG2" +#define AMFVideoDecoderUVD_MPEG4 L"AMFVideoDecoderUVD_MPEG4" +#define AMFVideoDecoderUVD_WMV3 L"AMFVideoDecoderUVD_WMV3" +#define AMFVideoDecoderUVD_VC1 L"AMFVideoDecoderUVD_VC1" +#define AMFVideoDecoderUVD_H264_AVC L"AMFVideoDecoderUVD_H264_AVC" +#define AMFVideoDecoderUVD_H264_MVC L"AMFVideoDecoderUVD_H264_MVC" +#define AMFVideoDecoderUVD_H264_SVC L"AMFVideoDecoderUVD_H264_SVC" +#define AMFVideoDecoderUVD_MJPEG L"AMFVideoDecoderUVD_MJPEG" +#define AMFVideoDecoderHW_H265_HEVC L"AMFVideoDecoderHW_H265_HEVC" +#define AMFVideoDecoderHW_H265_MAIN10 L"AMFVideoDecoderHW_H265_MAIN10" +#define AMFVideoDecoderHW_VP9 L"AMFVideoDecoderHW_VP9" +#define AMFVideoDecoderHW_VP9_10BIT L"AMFVideoDecoderHW_VP9_10BIT" +#define AMFVideoDecoderHW_AV1 L"AMFVideoDecoderHW_AV1" + +enum AMF_VIDEO_DECODER_MODE_ENUM +{ + AMF_VIDEO_DECODER_MODE_REGULAR = 0, // DPB delay is based on number of reference frames + 1 (from SPS) + AMF_VIDEO_DECODER_MODE_COMPLIANT, // DPB delay is based on profile - up to 16 + AMF_VIDEO_DECODER_MODE_LOW_LATENCY, // DPB delay is 0. Expect stream with no reordering in P-Frames or B-Frames. B-frames can be present as long as they do not introduce any frame re-ordering +}; +enum AMF_TIMESTAMP_MODE_ENUM +{ + AMF_TS_PRESENTATION = 0, // default. decoder will preserve timestamps from input to output + AMF_TS_SORT, // decoder will resort PTS list + AMF_TS_DECODE // timestamps reflect decode order - decoder will reuse them +}; + +#define AMF_VIDEO_DECODER_SURFACE_COPY L"SurfaceCopy" // amf_bool; default = false; return output surfaces as a copy +#define AMF_VIDEO_DECODER_EXTRADATA L"ExtraData" // AMFInterface* -> AMFBuffer* - AVCC - size length + SPS/PPS; or as Annex B. Optional if stream is Annex B +#define AMF_VIDEO_DECODER_FRAME_RATE L"FrameRate" // amf_double; default = 0.0, optional property to restore duration in the output if needed +#define AMF_TIMESTAMP_MODE L"TimestampMode" // amf_int64(AMF_TIMESTAMP_MODE_ENUM) - default AMF_TS_PRESENTATION - how input timestamps are treated + +// dynamic/adaptive resolution change +#define AMF_VIDEO_DECODER_ADAPTIVE_RESOLUTION_CHANGE L"AdaptiveResolutionChange" // amf_bool; default = false; reuse allocated surfaces if new resolution is smaller +#define AMF_VIDEO_DECODER_ALLOC_SIZE L"AllocSize" // AMFSize; default (1920,1088); size of allocated surface if AdaptiveResolutionChange is true +#define AMF_VIDEO_DECODER_CURRENT_SIZE L"CurrentSize" // AMFSize; default = (0,0); current size of the video + +// reference frame management +#define AMF_VIDEO_DECODER_REORDER_MODE L"ReorderMode" // amf_int64(AMF_VIDEO_DECODER_MODE_ENUM); default = AMF_VIDEO_DECODER_MODE_REGULAR; defines number of surfaces in DPB list. +#define AMF_VIDEO_DECODER_SURFACE_POOL_SIZE L"SurfacePoolSize" // amf_int64; number of surfaces in the decode pool = DPB list size + number of surfaces for presentation +#define AMF_VIDEO_DECODER_DPB_SIZE L"DPBSize" // amf_int64; minimum number of surfaces for reordering + +#define AMF_VIDEO_DECODER_DEFAULT_SURFACES_FOR_TRANSIT 5 // if AMF_VIDEO_DECODER_SURFACE_POOL_SIZE is 0 , AMF_VIDEO_DECODER_SURFACE_POOL_SIZE=AMF_VIDEO_DECODER_DEFAULT_SURFACES_FOR_TRANSIT+AMF_VIDEO_DECODER_DPB_SIZE + +// Decoder capabilities - exposed in AMFCaps interface +#define AMF_VIDEO_DECODER_CAP_NUM_OF_STREAMS L"NumOfStreams" // amf_int64; maximum number of decode streams supported + + +// metadata information: can be set on output surface + +// Properties could be set on surface based on HDR SEI or VUI header +#define AMF_VIDEO_DECODER_COLOR_TRANSFER_CHARACTERISTIC L"ColorTransferChar" // amf_int64(AMF_COLOR_TRANSFER_CHARACTERISTIC_ENUM); default = AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED, ISO/IEC 23001-8_2013 7.2 +#define AMF_VIDEO_DECODER_COLOR_PRIMARIES L"ColorPrimaries" // amf_int64(AMF_COLOR_PRIMARIES_ENUM); default = AMF_COLOR_PRIMARIES_UNDEFINED, ISO/IEC 23001-8_2013 7.1 +#define AMF_VIDEO_DECODER_HDR_METADATA L"HdrMetadata" // AMFBuffer containing AMFHDRMetadata; default NULL + +/////// AMF_VIDEO_DECODER_FULL_RANGE_COLOR deprecated, use AMF_VIDEO_DECODER_COLOR_RANGE +#define AMF_VIDEO_DECODER_FULL_RANGE_COLOR L"FullRangeColor" // bool; default = false; false = studio range, true = full range +/////// +#define AMF_VIDEO_DECODER_COLOR_RANGE L"ColorRange" // amf_int64(AMF_COLOR_RANGE_ENUM) default = AMF_COLOR_RANGE_UNDEFINED + +// can be set on output surface if YUV outout or on component to overwrite VUI +#define AMF_VIDEO_DECODER_COLOR_PROFILE L"ColorProfile" // amf_int64(AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM); default = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN - mean AUTO + +// properties to be set on decoder if internal converter is used +#define AMF_VIDEO_DECODER_OUTPUT_TRANSFER_CHARACTERISTIC L"OutColorTransferChar" // amf_int64(AMF_COLOR_TRANSFER_CHARACTERISTIC_ENUM); default = AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED, ISO/IEC 23001-8_2013 7.2 See VideoDecoderUVD.h for enum +#define AMF_VIDEO_DECODER_OUTPUT_COLOR_PRIMARIES L"OutputColorPrimaries" // amf_int64(AMF_COLOR_PRIMARIES_ENUM); default = AMF_COLOR_PRIMARIES_UNDEFINED, ISO/IEC 23001-8_2013 7.1 See ColorSpace.h for enum +#define AMF_VIDEO_DECODER_OUTPUT_HDR_METADATA L"OutHDRMetadata" // AMFBuffer containing AMFHDRMetadata; default NULL + + +#if defined(__ANDROID__) +#define AMF_VIDEO_DECODER_NATIVEWINDOW L"AndroidNativeWindow" // amf_int64; default = 0; pointer to native window +#endif //__ANDROID__ + + +#if defined(__APPLE__) +#define AMF_VIDEO_DECODER_NATIVEWINDOW L"AppleNativeWindow" // amf_int64; default = 0; pointer to native window +#endif //__APPLE__ + + +#endif //#ifndef AMF_VideoDecoderUVD_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/components/VideoEncoderAV1.h
Added
@@ -0,0 +1,292 @@ +// +// Copyright (c) 2021-2022 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +//------------------------------------------------------------------------------------------------- +// VideoEncoderHW_AV1 interface declaration +//------------------------------------------------------------------------------------------------- + +#ifndef AMF_VideoEncoderAV1_h +#define AMF_VideoEncoderAV1_h +#pragma once + +#include "Component.h" +#include "ColorSpace.h" +#include "PreAnalysis.h" + +#define AMFVideoEncoder_AV1 L"AMFVideoEncoderHW_AV1" + +enum AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE_ENUM +{ + AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE_NONE = 0, // No encoding latency requirement. Encoder will balance encoding time and power consumption. + AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE_POWER_SAVING_REAL_TIME = 1, // Try the best to finish encoding a frame within 1/framerate sec. This mode may cause more power consumption + AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE_REAL_TIME = 2, // Try the best to finish encoding a frame within 1/(2 x framerate) sec. This mode will cause more power consumption than POWER_SAVING_REAL_TIME + AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE_LOWEST_LATENCY = 3 // Encoding as fast as possible. This mode causes highest power consumption. +}; + +enum AMF_VIDEO_ENCODER_AV1_USAGE_ENUM +{ + AMF_VIDEO_ENCODER_AV1_USAGE_TRANSCODING = 0, + AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY = 1 +}; + +enum AMF_VIDEO_ENCODER_AV1_PROFILE_ENUM +{ + AMF_VIDEO_ENCODER_AV1_PROFILE_MAIN = 1 +}; + +enum AMF_VIDEO_ENCODER_AV1_LEVEL_ENUM +{ + AMF_VIDEO_ENCODER_AV1_LEVEL_2_0 = 0, + AMF_VIDEO_ENCODER_AV1_LEVEL_2_1 = 1, + AMF_VIDEO_ENCODER_AV1_LEVEL_2_2 = 2, + AMF_VIDEO_ENCODER_AV1_LEVEL_2_3 = 3, + AMF_VIDEO_ENCODER_AV1_LEVEL_3_0 = 4, + AMF_VIDEO_ENCODER_AV1_LEVEL_3_1 = 5, + AMF_VIDEO_ENCODER_AV1_LEVEL_3_2 = 6, + AMF_VIDEO_ENCODER_AV1_LEVEL_3_3 = 7, + AMF_VIDEO_ENCODER_AV1_LEVEL_4_0 = 8, + AMF_VIDEO_ENCODER_AV1_LEVEL_4_1 = 9, + AMF_VIDEO_ENCODER_AV1_LEVEL_4_2 = 10, + AMF_VIDEO_ENCODER_AV1_LEVEL_4_3 = 11, + AMF_VIDEO_ENCODER_AV1_LEVEL_5_0 = 12, + AMF_VIDEO_ENCODER_AV1_LEVEL_5_1 = 13, + AMF_VIDEO_ENCODER_AV1_LEVEL_5_2 = 14, + AMF_VIDEO_ENCODER_AV1_LEVEL_5_3 = 15, + AMF_VIDEO_ENCODER_AV1_LEVEL_6_0 = 16, + AMF_VIDEO_ENCODER_AV1_LEVEL_6_1 = 17, + AMF_VIDEO_ENCODER_AV1_LEVEL_6_2 = 18, + AMF_VIDEO_ENCODER_AV1_LEVEL_6_3 = 19, + AMF_VIDEO_ENCODER_AV1_LEVEL_7_0 = 20, + AMF_VIDEO_ENCODER_AV1_LEVEL_7_1 = 21, + AMF_VIDEO_ENCODER_AV1_LEVEL_7_2 = 22, + AMF_VIDEO_ENCODER_AV1_LEVEL_7_3 = 23 +}; + +enum AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_ENUM +{ + AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_UNKNOWN = -1, + AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CONSTANT_QP = 0, + AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR = 1, + AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR = 2, + AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR = 3, + AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_QUALITY_VBR = 4, + AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_HIGH_QUALITY_VBR = 5, + AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_HIGH_QUALITY_CBR = 6 +}; + +enum AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_ENUM +{ + AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_ONLY = 1, + AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_1080P_CODED_1082 = 2, + AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_NO_RESTRICTIONS = 3 +}; + +enum AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE_ENUM +{ + AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE_NONE = 0, + AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE_KEY = 1, + AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE_INTRA_ONLY = 2, + AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE_SWITCH = 3, + AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE_SHOW_EXISTING = 4 +}; + +enum AMF_VIDEO_ENCODER_AV1_OUTPUT_FRAME_TYPE_ENUM +{ + AMF_VIDEO_ENCODER_AV1_OUTPUT_FRAME_TYPE_KEY = 0, + AMF_VIDEO_ENCODER_AV1_OUTPUT_FRAME_TYPE_INTRA_ONLY = 1, + AMF_VIDEO_ENCODER_AV1_OUTPUT_FRAME_TYPE_INTER = 2, + AMF_VIDEO_ENCODER_AV1_OUTPUT_FRAME_TYPE_SWITCH = 3, + AMF_VIDEO_ENCODER_AV1_OUTPUT_FRAME_TYPE_SHOW_EXISTING = 4 +}; + +enum AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_ENUM +{ + AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_HIGH_QUALITY = 0, + AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_QUALITY = 30, + AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_BALANCED = 70, + AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_SPEED = 100 +}; + +enum AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_ENUM +{ + AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_NONE = 0, + AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_GOP_ALIGNED = 1, + AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_KEY_FRAME_ALIGNED = 2 +}; + +enum AMF_VIDEO_ENCODER_AV1_SWITCH_FRAME_INSERTION_MODE_ENUM +{ + AMF_VIDEO_ENCODER_AV1_SWITCH_FRAME_INSERTION_MODE_NONE = 0, + AMF_VIDEO_ENCODER_AV1_SWITCH_FRAME_INSERTION_MODE_FIXED_INTERVAL = 1 +}; + +enum AMF_VIDEO_ENCODER_AV1_CDEF_MODE_ENUM +{ + AMF_VIDEO_ENCODER_AV1_CDEF_DISABLE = 0, + AMF_VIDEO_ENCODER_AV1_CDEF_ENABLE_DEFAULT = 1 +}; + +enum AMF_VIDEO_ENCODER_AV1_CDF_FRAME_END_UPDATE_MODE_ENUM +{ + AMF_VIDEO_ENCODER_AV1_CDF_FRAME_END_UPDATE_MODE_DISABLE = 0, + AMF_VIDEO_ENCODER_AV1_CDF_FRAME_END_UPDATE_MODE_ENABLE_DEFAULT = 1 +}; + +enum AMF_VIDEO_ENCODER_AV1_AQ_MODE_ENUM +{ + AMF_VIDEO_ENCODER_AV1_AQ_MODE_NONE = 0, + AMF_VIDEO_ENCODER_AV1_AQ_MODE_CAQ = 1 // Content adaptive quantization mode +}; + +enum AMF_VIDEO_ENCODER_AV1_INTRA_REFRESH_MODE_ENUM +{ + AMF_VIDEO_ENCODER_AV1_INTRA_REFRESH_MODE__DISABLED = 0, + AMF_VIDEO_ENCODER_AV1_INTRA_REFRESH_MODE__GOP_ALIGNED = 1, + AMF_VIDEO_ENCODER_AV1_INTRA_REFRESH_MODE__CONTINUOUS = 2 +}; + + +// *** Static properties - can be set only before Init() *** + +// Encoder Engine Settings +#define AMF_VIDEO_ENCODER_AV1_ENCODER_INSTANCE_INDEX L"Av1EncoderInstanceIndex" // amf_int64; default = 0; selected HW instance idx. The number of instances is queried by using AMF_VIDEO_ENCODER_AV1_CAP_NUM_OF_HW_INSTANCES +#define AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE L"Av1EncodingLatencyMode" // amf_int64(AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE_ENUM); default = depends on USAGE; The encoding latency mode. +#define AMF_VIDEO_ENCODER_AV1_QUERY_TIMEOUT L"Av1QueryTimeout" // amf_int64; default = 0 (no wait); timeout for QueryOutput call in ms. + +// Usage Settings +#define AMF_VIDEO_ENCODER_AV1_USAGE L"Av1Usage" // amf_int64(AMF_VIDEO_ENCODER_AV1_USAGE_ENUM); default = N/A; Encoder usage. fully configures parameter set. + +// Session Configuration +#define AMF_VIDEO_ENCODER_AV1_FRAMESIZE L"Av1FrameSize" // AMFSize; default = 0,0; Frame size +#define AMF_VIDEO_ENCODER_AV1_COLOR_BIT_DEPTH L"Av1ColorBitDepth" // amf_int64(AMF_COLOR_BIT_DEPTH_ENUM); default = AMF_COLOR_BIT_DEPTH_8 +#define AMF_VIDEO_ENCODER_AV1_PROFILE L"Av1Profile" // amf_int64(AMF_VIDEO_ENCODER_AV1_PROFILE_ENUM) ; default = depends on USAGE; the codec profile of the coded bitstream +#define AMF_VIDEO_ENCODER_AV1_LEVEL L"Av1Level" // amf_int64 (AMF_VIDEO_ENCODER_AV1_LEVEL_ENUM); default = depends on USAGE; the codec level of the coded bitstream +#define AMF_VIDEO_ENCODER_AV1_TILES_PER_FRAME L"Av1NumTilesPerFrame" // amf_int64; default = 1; Number of tiles Per Frame. This is treated as suggestion. The actual number of tiles might be different due to compliance or encoder limitation. +#define AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET L"Av1QualityPreset" // amf_int64(AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_ENUM); default = depends on USAGE; Quality Preset + +// Codec Configuration +#define AMF_VIDEO_ENCODER_AV1_SCREEN_CONTENT_TOOLS L"Av1ScreenContentTools" // bool; default = depends on USAGE; If true, allow enabling screen content tools by AMF_VIDEO_ENCODER_AV1_PALETTE_MODE and AMF_VIDEO_ENCODER_AV1_FORCE_INTEGER_MV; if false, all screen content tools are disabled. +#define AMF_VIDEO_ENCODER_AV1_ORDER_HINT L"Av1OrderHint" // bool; default = depends on USAGE; If true, code order hint; if false, don't code order hint +#define AMF_VIDEO_ENCODER_AV1_FRAME_ID L"Av1FrameId" // bool; default = depends on USAGE; If true, code frame id; if false, don't code frame id +#define AMF_VIDEO_ENCODER_AV1_TILE_GROUP_OBU L"Av1TileGroupObu" // bool; default = depends on USAGE; If true, code FrameHeaderObu + TileGroupObu and each TileGroupObu contains one tile; if false, code FrameObu. +#define AMF_VIDEO_ENCODER_AV1_CDEF_MODE L"Av1CdefMode" // amd_int64(AMF_VIDEO_ENCODER_AV1_CDEF_MODE_ENUM); default = depends on USAGE; Cdef mode +#define AMF_VIDEO_ENCODER_AV1_ERROR_RESILIENT_MODE L"Av1ErrorResilientMode" // bool; default = depends on USAGE; If true, enable error resilient mode; if false, disable error resilient mode + +// Rate Control and Quality Enhancement +#define AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD L"Av1RateControlMethod" // amf_int64(AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_ENUM); default = depends on USAGE; Rate Control Method +#define AMF_VIDEO_ENCODER_AV1_QVBR_QUALITY_LEVEL L"Av1QvbrQualityLevel" // amf_int64; default = 23; QVBR quality level; range = 1-51 +#define AMF_VIDEO_ENCODER_AV1_INITIAL_VBV_BUFFER_FULLNESS L"Av1InitialVBVBufferFullness" // amf_int64; default = depends on USAGE; Initial VBV Buffer Fullness 0=0% 64=100% + +// Alignment Mode Configuration +#define AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE L"Av1AlignmentMode" // amf_int64(AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_ENUM); default = AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_ONLY; Alignment Mode. + +#define AMF_VIDEO_ENCODER_AV1_PRE_ANALYSIS_ENABLE L"Av1EnablePreAnalysis" // bool; default = depends on USAGE; If true, enables the pre-analysis module. Refer to AMF Video PreAnalysis API reference for more details. If false, disable the pre-analysis module. +#define AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_PREENCODE L"Av1RateControlPreEncode" // bool; default = depends on USAGE; If true, enables pre-encode assist in rate control; if false, disables pre-encode assist in rate control. +#define AMF_VIDEO_ENCODER_AV1_HIGH_MOTION_QUALITY_BOOST L"Av1HighMotionQualityBoost" // bool; default = depends on USAGE; If true, enable high motion quality boost mode; if false, disable high motion quality boost mode. +#define AMF_VIDEO_ENCODER_AV1_AQ_MODE L"Av1AQMode" // amd_int64(AMF_VIDEO_ENCODER_AV1_AQ_MODE_ENUM); default = depends on USAGE; AQ mode + +// Picture Management Configuration +#define AMF_VIDEO_ENCODER_AV1_MAX_NUM_TEMPORAL_LAYERS L"Av1MaxNumOfTemporalLayers" // amf_int64; default = depends on USAGE; Max number of temporal layers might be enabled. The maximum value can be queried from AMF_VIDEO_ENCODER_AV1_CAP_MAX_NUM_TEMPORAL_LAYERS +#define AMF_VIDEO_ENCODER_AV1_MAX_LTR_FRAMES L"Av1MaxNumLTRFrames" // amf_int64; default = depends on USAGE; Max number of LTR frames. The maximum value can be queried from AMF_VIDEO_ENCODER_AV1_CAP_MAX_NUM_LTR_FRAMES +#define AMF_VIDEO_ENCODER_AV1_MAX_NUM_REFRAMES L"Av1MaxNumRefFrames" // amf_int64; default = 1; Maximum number of reference frames + +// color conversion +#define AMF_VIDEO_ENCODER_AV1_INPUT_HDR_METADATA L"Av1InHDRMetadata" // AMFBuffer containing AMFHDRMetadata; default NULL + +// Miscellaneous +#define AMF_VIDEO_ENCODER_AV1_EXTRA_DATA L"Av1ExtraData" // AMFInterface* - > AMFBuffer*; buffer to retrieve coded sequence header + + +// *** Dynamic properties - can be set anytime *** + +// Codec Configuration +#define AMF_VIDEO_ENCODER_AV1_PALETTE_MODE L"Av1PaletteMode" // bool; default = depends on USAGE; If true, enable palette mode; if false, disable palette mode. Valid only when AMF_VIDEO_ENCODER_AV1_SCREEN_CONTENT_TOOLS is true. +#define AMF_VIDEO_ENCODER_AV1_FORCE_INTEGER_MV L"Av1ForceIntegerMv" // bool; default = depends on USAGE; If true, enable force integer MV; if false, disable force integer MV. Valid only when AMF_VIDEO_ENCODER_AV1_SCREEN_CONTENT_TOOLS is true. +#define AMF_VIDEO_ENCODER_AV1_CDF_UPDATE L"Av1CdfUpdate" // bool; default = depends on USAGE; If true, enable CDF update; if false, disable CDF update. +#define AMF_VIDEO_ENCODER_AV1_CDF_FRAME_END_UPDATE_MODE L"Av1CdfFrameEndUpdateMode" // amd_int64(AMF_VIDEO_ENCODER_AV1_CDF_FRAME_END_UPDATE_MODE_ENUM); default = depends on USAGE; CDF frame end update mode + + +// Rate Control and Quality Enhancement +#define AMF_VIDEO_ENCODER_AV1_VBV_BUFFER_SIZE L"Av1VBVBufferSize" // amf_int64; default = depends on USAGE; VBV Buffer Size in bits +#define AMF_VIDEO_ENCODER_AV1_FRAMERATE L"Av1FrameRate" // AMFRate; default = depends on usage; Frame Rate +#define AMF_VIDEO_ENCODER_AV1_ENFORCE_HRD L"Av1EnforceHRD" // bool; default = depends on USAGE; If true, enforce HRD; if false, HRD is not enforced. +#define AMF_VIDEO_ENCODER_AV1_FILLER_DATA L"Av1FillerData" // bool; default = depends on USAGE; If true, code filler data when needed; if false, don't code filler data. +#define AMF_VIDEO_ENCODER_AV1_TARGET_BITRATE L"Av1TargetBitrate" // amf_int64; default = depends on USAGE; Target bit rate in bits +#define AMF_VIDEO_ENCODER_AV1_PEAK_BITRATE L"Av1PeakBitrate" // amf_int64; default = depends on USAGE; Peak bit rate in bits + +#define AMF_VIDEO_ENCODER_AV1_MAX_COMPRESSED_FRAME_SIZE L"Av1MaxCompressedFrameSize" // amf_int64; default = 0; Max compressed frame Size in bits. 0 - no limit +#define AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTRA L"Av1MinQIndex_Intra" // amf_int64; default = depends on USAGE; Min QIndex for intra frames; range = 0-255 +#define AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTRA L"Av1MaxQIndex_Intra" // amf_int64; default = depends on USAGE; Max QIndex for intra frames; range = 0-255 +#define AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTER L"Av1MinQIndex_Inter" // amf_int64; default = depends on USAGE; Min QIndex for inter frames; range = 0-255 +#define AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTER L"Av1MaxQIndex_Inter" // amf_int64; default = depends on USAGE; Max QIndex for inter frames; range = 0-255 + +#define AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTRA L"Av1QIndex_Intra" // amf_int64; default = depends on USAGE; intra-frame QIndex; range = 0-255 +#define AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTER L"Av1QIndex_Inter" // amf_int64; default = depends on USAGE; inter-frame QIndex; range = 0-255 + +#define AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_SKIP_FRAME L"Av1RateControlSkipFrameEnable" // bool; default = depends on USAGE; If true, rate control may code skip frame when needed; if false, rate control will not code skip frame. + + +// Picture Management Configuration +#define AMF_VIDEO_ENCODER_AV1_GOP_SIZE L"Av1GOPSize" // amf_int64; default = depends on USAGE; GOP Size (distance between automatically inserted key frames). If 0, key frame will be inserted at first frame only. Note that GOP may be interrupted by AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE. +#define AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE L"Av1HeaderInsertionMode" // amf_int64(AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_ENUM); default = depends on USAGE; sequence header insertion mode +#define AMF_VIDEO_ENCODER_AV1_SWITCH_FRAME_INSERTION_MODE L"Av1SwitchFrameInsertionMode" // amf_int64(AMF_VIDEO_ENCODER_AV1_SWITCH_FRAME_INSERTION_MODE_ENUM); default = depends on USAGE; switch frame insertin mode +#define AMF_VIDEO_ENCODER_AV1_SWITCH_FRAME_INTERVAL L"Av1SwitchFrameInterval" // amf_int64; default = depends on USAGE; the interval between two inserted switch frames. Valid only when AMF_VIDEO_ENCODER_AV1_SWITCH_FRAME_INSERTION_MODE is AMF_VIDEO_ENCODER_AV1_SWITCH_FRAME_INSERTION_MODE_FIXED_INTERVAL. +#define AMF_VIDEO_ENCODER_AV1_NUM_TEMPORAL_LAYERS L"Av1NumTemporalLayers" // amf_int64; default = depends on USAGE; Number of temporal layers. Can be changed at any time but the change is only applied when encoding next base layer frame. + +#define AMF_VIDEO_ENCODER_AV1_INTRA_REFRESH_MODE L"Av1IntraRefreshMode" // amf_int64(AMF_VIDEO_ENCODER_AV1_INTRA_REFRESH_MODE_ENUM); default AMF_VIDEO_ENCODER_AV1_INTRA_REFRESH_MODE__DISABLED +#define AMF_VIDEO_ENCODER_AV1_INTRAREFRESH_STRIPES L"Av1IntraRefreshNumOfStripes" // amf_int64; default = N/A; Valid only when intra refresh is enabled. + +// color conversion +#define AMF_VIDEO_ENCODER_AV1_INPUT_COLOR_PROFILE L"Av1InputColorProfile" // amf_int64(AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM); default = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN - mean AUTO by size +#define AMF_VIDEO_ENCODER_AV1_INPUT_TRANSFER_CHARACTERISTIC L"Av1InputColorTransferChar" // amf_int64(AMF_COLOR_TRANSFER_CHARACTERISTIC_ENUM); default = AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED, ISO/IEC 23001-8_2013 section 7.2 See VideoDecoderUVD.h for enum +#define AMF_VIDEO_ENCODER_AV1_INPUT_COLOR_PRIMARIES L"Av1InputColorPrimaries" // amf_int64(AMF_COLOR_PRIMARIES_ENUM); default = AMF_COLOR_PRIMARIES_UNDEFINED, ISO/IEC 23001-8_2013 section 7.1 See ColorSpace.h for enum + +#define AMF_VIDEO_ENCODER_AV1_OUTPUT_COLOR_PROFILE L"Av1OutputColorProfile" // amf_int64(AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM); default = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN - mean AUTO by size +#define AMF_VIDEO_ENCODER_AV1_OUTPUT_TRANSFER_CHARACTERISTIC L"Av1OutputColorTransferChar" // amf_int64(AMF_COLOR_TRANSFER_CHARACTERISTIC_ENUM); default = AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED, ISO/IEC 23001-8_2013 ?7.2 See VideoDecoderUVD.h for enum +#define AMF_VIDEO_ENCODER_AV1_OUTPUT_COLOR_PRIMARIES L"Av1OutputColorPrimaries" // amf_int64(AMF_COLOR_PRIMARIES_ENUM); default = AMF_COLOR_PRIMARIES_UNDEFINED, ISO/IEC 23001-8_2013 section 7.1 See ColorSpace.h for enum + + +// Frame encode parameters +#define AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE L"Av1ForceFrameType" // amf_int64(AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE_ENUM); default = AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE_NONE; generate particular frame type +#define AMF_VIDEO_ENCODER_AV1_FORCE_INSERT_SEQUENCE_HEADER L"Av1ForceInsertSequenceHeader" // bool; default = false; If true, force insert sequence header with current frame; +#define AMF_VIDEO_ENCODER_AV1_MARK_CURRENT_WITH_LTR_INDEX L"Av1MarkCurrentWithLTRIndex" // amf_int64; default = N/A; Mark current frame with LTR index +#define AMF_VIDEO_ENCODER_AV1_FORCE_LTR_REFERENCE_BITFIELD L"Av1ForceLTRReferenceBitfield" // amf_int64; default = 0; force LTR bit-field +#define AMF_VIDEO_ENCODER_AV1_ROI_DATA L"Av1ROIData" // 2D AMFSurface, surface format: AMF_SURFACE_GRAY32 + +// Encode output parameters +#define AMF_VIDEO_ENCODER_AV1_OUTPUT_FRAME_TYPE L"Av1OutputFrameType" // amf_int64(AMF_VIDEO_ENCODER_AV1_OUTPUT_FRAME_TYPE_ENUM); default = N/A +#define AMF_VIDEO_ENCODER_AV1_OUTPUT_MARKED_LTR_INDEX L"Av1MarkedLTRIndex" // amf_int64; default = N/A; Marked LTR index +#define AMF_VIDEO_ENCODER_AV1_OUTPUT_REFERENCED_LTR_INDEX_BITFIELD L"Av1ReferencedLTRIndexBitfield" // amf_int64; default = N/A; referenced LTR bit-field + +// AV1 Encoder capabilities - exposed in AMFCaps interface +#define AMF_VIDEO_ENCODER_AV1_CAP_NUM_OF_HW_INSTANCES L"Av1CapNumOfHwInstances" // amf_int64; default = N/A; number of HW encoder instances +#define AMF_VIDEO_ENCODER_AV1_CAP_MAX_THROUGHPUT L"Av1CapMaxThroughput" // amf_int64; default = N/A; MAX throughput for AV1 encoder in MB (16 x 16 pixel) +#define AMF_VIDEO_ENCODER_AV1_CAP_REQUESTED_THROUGHPUT L"Av1CapRequestedThroughput" // amf_int64; default = N/A; Currently total requested throughput for AV1 encode in MB (16 x 16 pixel) +#define AMF_VIDEO_ENCODER_AV1_CAP_COLOR_CONVERSION L"Av1CapColorConversion" // amf_int64(AMF_ACCELERATION_TYPE); default = N/A; type of supported color conversion. +#define AMF_VIDEO_ENCODER_AV1_CAP_PRE_ANALYSIS L"Av1PreAnalysis" // amf_bool - pre analysis module is available for AV1 UVE encoder, n/a for the other encoders +#define AMF_VIDEO_ENCODER_AV1_CAP_MAX_BITRATE L"Av1MaxBitrate" // amf_int64; default = N/A; Maximum bit rate in bits +#define AMF_VIDEO_ENCODER_AV1_CAP_MAX_PROFILE L"Av1MaxProfile" // amf_int64(AMF_VIDEO_ENCODER_AV1_PROFILE_ENUM); default = N/A; max value of code profile +#define AMF_VIDEO_ENCODER_AV1_CAP_MAX_LEVEL L"Av1MaxLevel" // amf_int64(AMF_VIDEO_ENCODER_AV1_LEVEL_ENUM); default = N/A; max value of codec level +#define AMF_VIDEO_ENCODER_AV1_CAP_MAX_NUM_TEMPORAL_LAYERS L"Av1CapMaxNumTemporalLayers" // amf_int64; default = N/A; The cap of maximum number of temporal layers +#define AMF_VIDEO_ENCODER_AV1_CAP_MAX_NUM_LTR_FRAMES L"Av1CapMaxNumLTRFrames" // amf_int64; default = N/A; The cap of maximum number of LTR frames. This value is calculated based on current value of AMF_VIDEO_ENCODER_AV1_MAX_NUM_TEMPORAL_LAYERS. + +#endif //#ifndef AMF_VideoEncoderAV1_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/components/VideoEncoderHEVC.h
Added
@@ -0,0 +1,296 @@ +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +//------------------------------------------------------------------------------------------------- +// VideoEncoderHW_HEVC interface declaration +//------------------------------------------------------------------------------------------------- + +#ifndef AMF_VideoEncoderHEVC_h +#define AMF_VideoEncoderHEVC_h +#pragma once + +#include "Component.h" +#include "ColorSpace.h" +#include "PreAnalysis.h" + +#define AMFVideoEncoder_HEVC L"AMFVideoEncoderHW_HEVC" + +enum AMF_VIDEO_ENCODER_HEVC_USAGE_ENUM +{ + AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCONDING = 0, // kept for backwards compatability + AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCODING = 0, // fixed typo + AMF_VIDEO_ENCODER_HEVC_USAGE_ULTRA_LOW_LATENCY, + AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY, + AMF_VIDEO_ENCODER_HEVC_USAGE_WEBCAM, + AMF_VIDEO_ENCODER_HEVC_USAGE_HIGH_QUALITY, + AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY_HIGH_QUALITY +}; + +enum AMF_VIDEO_ENCODER_HEVC_PROFILE_ENUM +{ + AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN = 1, + AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN_10 = 2 +}; + +enum AMF_VIDEO_ENCODER_HEVC_TIER_ENUM +{ + AMF_VIDEO_ENCODER_HEVC_TIER_MAIN = 0, + AMF_VIDEO_ENCODER_HEVC_TIER_HIGH = 1 +}; + +enum AMF_VIDEO_ENCODER_LEVEL_ENUM +{ + AMF_LEVEL_1 = 30, + AMF_LEVEL_2 = 60, + AMF_LEVEL_2_1 = 63, + AMF_LEVEL_3 = 90, + AMF_LEVEL_3_1 = 93, + AMF_LEVEL_4 = 120, + AMF_LEVEL_4_1 = 123, + AMF_LEVEL_5 = 150, + AMF_LEVEL_5_1 = 153, + AMF_LEVEL_5_2 = 156, + AMF_LEVEL_6 = 180, + AMF_LEVEL_6_1 = 183, + AMF_LEVEL_6_2 = 186 +}; + +enum AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_ENUM +{ + AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_UNKNOWN = -1, + AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CONSTANT_QP = 0, + AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR, + AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR, + AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CBR +}; + +enum AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_ENUM +{ + AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_NONE = 0, + AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_SKIP, + AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_IDR, + AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_I, + AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_P +}; + +enum AMF_VIDEO_ENCODER_HEVC_OUTPUT_DATA_TYPE_ENUM +{ + AMF_VIDEO_ENCODER_HEVC_OUTPUT_DATA_TYPE_IDR, + AMF_VIDEO_ENCODER_HEVC_OUTPUT_DATA_TYPE_I, + AMF_VIDEO_ENCODER_HEVC_OUTPUT_DATA_TYPE_P +}; + +enum AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_ENUM +{ + AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_QUALITY = 0, + AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_BALANCED = 5, + AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_SPEED = 10 +}; + +enum AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_ENUM +{ + AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_NONE = 0, + AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_GOP_ALIGNED, + AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_IDR_ALIGNED +}; + +enum AMF_VIDEO_ENCODER_HEVC_PICTURE_TRANSFER_MODE_ENUM +{ + AMF_VIDEO_ENCODER_HEVC_PICTURE_TRANSFER_MODE_OFF = 0, + AMF_VIDEO_ENCODER_HEVC_PICTURE_TRANSFER_MODE_ON +}; + +enum AMF_VIDEO_ENCODER_HEVC_NOMINAL_RANGE +{ + AMF_VIDEO_ENCODER_HEVC_NOMINAL_RANGE_STUDIO = 0, + AMF_VIDEO_ENCODER_HEVC_NOMINAL_RANGE_FULL = 1 +}; + +enum AMF_VIDEO_ENCODER_HEVC_LTR_MODE_ENUM +{ + AMF_VIDEO_ENCODER_HEVC_LTR_MODE_RESET_UNUSED = 0, + AMF_VIDEO_ENCODER_HEVC_LTR_MODE_KEEP_UNUSED +}; + +// Static properties - can be set before Init() +#define AMF_VIDEO_ENCODER_HEVC_INSTANCE_INDEX L"HevcEncoderInstance" // amf_int64; selected instance idx +#define AMF_VIDEO_ENCODER_HEVC_FRAMESIZE L"HevcFrameSize" // AMFSize; default = 0,0; Frame size + +#define AMF_VIDEO_ENCODER_HEVC_USAGE L"HevcUsage" // amf_int64(AMF_VIDEO_ENCODER_HEVC_USAGE_ENUM); default = N/A; Encoder usage type. fully configures parameter set. +#define AMF_VIDEO_ENCODER_HEVC_PROFILE L"HevcProfile" // amf_int64(AMF_VIDEO_ENCODER_HEVC_PROFILE_ENUM) ; default = AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN; +#define AMF_VIDEO_ENCODER_HEVC_TIER L"HevcTier" // amf_int64(AMF_VIDEO_ENCODER_HEVC_TIER_ENUM) ; default = AMF_VIDEO_ENCODER_HEVC_TIER_MAIN; +#define AMF_VIDEO_ENCODER_HEVC_PROFILE_LEVEL L"HevcProfileLevel" // amf_int64 (AMF_VIDEO_ENCODER_LEVEL_ENUM, default depends on HW capabilities); +#define AMF_VIDEO_ENCODER_HEVC_MAX_LTR_FRAMES L"HevcMaxOfLTRFrames" // amf_int64; default = 0; Max number of LTR frames +#define AMF_VIDEO_ENCODER_HEVC_LTR_MODE L"HevcLTRMode" // amf_int64(AMF_VIDEO_ENCODER_HEVC_LTR_MODE_ENUM); default = AMF_VIDEO_ENCODER_HEVC_LTR_MODE_RESET_UNUSED; remove/keep unused LTRs (not specified in property AMF_VIDEO_ENCODER_HEVC_FORCE_LTR_REFERENCE_BITFIELD) +#define AMF_VIDEO_ENCODER_HEVC_MAX_NUM_REFRAMES L"HevcMaxNumRefFrames" // amf_int64; default = 1; Maximum number of reference frames +#define AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET L"HevcQualityPreset" // amf_int64(AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_ENUM); default = depends on USAGE; Quality Preset +#define AMF_VIDEO_ENCODER_HEVC_EXTRADATA L"HevcExtraData" // AMFInterface* - > AMFBuffer*; SPS/PPS buffer - read-only +#define AMF_VIDEO_ENCODER_HEVC_ASPECT_RATIO L"HevcAspectRatio" // AMFRatio; default = 1, 1 +#define AMF_VIDEO_ENCODER_HEVC_LOWLATENCY_MODE L"LowLatencyInternal" // bool; default = false, enables low latency mode +#define AMF_VIDEO_ENCODER_HEVC_PRE_ANALYSIS_ENABLE L"HevcEnablePreAnalysis" // bool; default = false; enables the pre-analysis module. Currently only works in AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR mode. Refer to AMF Video PreAnalysis API reference for more details. +#define AMF_VIDEO_ENCODER_HEVC_NOMINAL_RANGE L"HevcNominalRange" // amf_int64(AMF_VIDEO_ENCODER_HEVC_NOMINAL_RANGE); default = amf_int64(AMF_VIDEO_ENCODER_HEVC_NOMINAL_RANGE_STUDIO); property is bool but amf_int64 also works for backward compatibility. + +// Picture control properties +#define AMF_VIDEO_ENCODER_HEVC_NUM_GOPS_PER_IDR L"HevcGOPSPerIDR" // amf_int64; default = 1; The frequency to insert IDR as start of a GOP. 0 means no IDR will be inserted. +#define AMF_VIDEO_ENCODER_HEVC_GOP_SIZE L"HevcGOPSize" // amf_int64; default = 60; GOP Size, in frames +#define AMF_VIDEO_ENCODER_HEVC_DE_BLOCKING_FILTER_DISABLE L"HevcDeBlockingFilter" // bool; default = depends on USAGE; De-blocking Filter +#define AMF_VIDEO_ENCODER_HEVC_SLICES_PER_FRAME L"HevcSlicesPerFrame" // amf_int64; default = 1; Number of slices Per Frame +#define AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE L"HevcHeaderInsertionMode" // amf_int64(AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_ENUM); default = NONE +#define AMF_VIDEO_ENCODER_HEVC_INTRA_REFRESH_NUM_CTBS_PER_SLOT L"HevcIntraRefreshCTBsNumberPerSlot" // amf_int64; default = depends on USAGE; Intra Refresh CTBs Number Per Slot in 64x64 CTB + +// Rate control properties +#define AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD L"HevcRateControlMethod" // amf_int64(AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_ENUM); default = depends on USAGE; Rate Control Method +#define AMF_VIDEO_ENCODER_HEVC_VBV_BUFFER_SIZE L"HevcVBVBufferSize" // amf_int64; default = depends on USAGE; VBV Buffer Size in bits +#define AMF_VIDEO_ENCODER_HEVC_INITIAL_VBV_BUFFER_FULLNESS L"HevcInitialVBVBufferFullness" // amf_int64; default = 64; Initial VBV Buffer Fullness 0=0% 64=100% +#define AMF_VIDEO_ENCODER_HEVC_ENABLE_VBAQ L"HevcEnableVBAQ" // // bool; default = depends on USAGE; Enable auto VBAQ +#define AMF_VIDEO_ENCODER_HEVC_HIGH_MOTION_QUALITY_BOOST_ENABLE L"HevcHighMotionQualityBoostEnable"// bool; default = depends on USAGE; Enable High motion quality boost mode + +#define AMF_VIDEO_ENCODER_HEVC_PREENCODE_ENABLE L"HevcRateControlPreAnalysisEnable" // bool; default = depends on USAGE; enables pre-encode assisted rate control +#define AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_PREANALYSIS_ENABLE L"HevcRateControlPreAnalysisEnable" // bool; default = depends on USAGE; enables pre-encode assisted rate control. Deprecated, please use AMF_VIDEO_ENCODER_PREENCODE_ENABLE instead. +#ifdef _MSC_VER + #ifndef __clang__ + #pragma deprecated("AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_PREANALYSIS_ENABLE") + #endif +#endif + +// Motion estimation +#define AMF_VIDEO_ENCODER_HEVC_MOTION_HALF_PIXEL L"HevcHalfPixel" // bool; default= true; Half Pixel +#define AMF_VIDEO_ENCODER_HEVC_MOTION_QUARTERPIXEL L"HevcQuarterPixel" // bool; default= true; Quarter Pixel + +// color conversion +#define AMF_VIDEO_ENCODER_HEVC_COLOR_BIT_DEPTH L"HevcColorBitDepth" // amf_int64(AMF_COLOR_BIT_DEPTH_ENUM); default = AMF_COLOR_BIT_DEPTH_8 + +#define AMF_VIDEO_ENCODER_HEVC_INPUT_COLOR_PROFILE L"HevcInColorProfile" // amf_int64(AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM); default = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN - mean AUTO by size +#define AMF_VIDEO_ENCODER_HEVC_INPUT_TRANSFER_CHARACTERISTIC L"HevcInColorTransferChar" // amf_int64(AMF_COLOR_TRANSFER_CHARACTERISTIC_ENUM); default = AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED, ISO/IEC 23001-8_2013 section 7.2 See VideoDecoderUVD.h for enum +#define AMF_VIDEO_ENCODER_HEVC_INPUT_COLOR_PRIMARIES L"HevcInColorPrimaries" // amf_int64(AMF_COLOR_PRIMARIES_ENUM); default = AMF_COLOR_PRIMARIES_UNDEFINED, ISO/IEC 23001-8_2013 section 7.1 See ColorSpace.h for enum + +#define AMF_VIDEO_ENCODER_HEVC_OUTPUT_COLOR_PROFILE L"HevcOutColorProfile" // amf_int64(AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM); default = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN - mean AUTO by size +#define AMF_VIDEO_ENCODER_HEVC_OUTPUT_TRANSFER_CHARACTERISTIC L"HevcOutColorTransferChar" // amf_int64(AMF_COLOR_TRANSFER_CHARACTERISTIC_ENUM); default = AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED, ISO/IEC 23001-8_2013 ?7.2 See VideoDecoderUVD.h for enum +#define AMF_VIDEO_ENCODER_HEVC_OUTPUT_COLOR_PRIMARIES L"HevcOutColorPrimaries" // amf_int64(AMF_COLOR_PRIMARIES_ENUM); default = AMF_COLOR_PRIMARIES_UNDEFINED, ISO/IEC 23001-8_2013 section 7.1 See ColorSpace.h for enum + +// Dynamic properties - can be set at any time + +// Rate control properties +#define AMF_VIDEO_ENCODER_HEVC_FRAMERATE L"HevcFrameRate" // AMFRate; default = depends on usage; Frame Rate + +#define AMF_VIDEO_ENCODER_HEVC_ENFORCE_HRD L"HevcEnforceHRD" // bool; default = depends on USAGE; Enforce HRD +#define AMF_VIDEO_ENCODER_HEVC_FILLER_DATA_ENABLE L"HevcFillerDataEnable" // bool; default = depends on USAGE; Enforce HRD +#define AMF_VIDEO_ENCODER_HEVC_TARGET_BITRATE L"HevcTargetBitrate" // amf_int64; default = depends on USAGE; Target bit rate in bits +#define AMF_VIDEO_ENCODER_HEVC_PEAK_BITRATE L"HevcPeakBitrate" // amf_int64; default = depends on USAGE; Peak bit rate in bits + +#define AMF_VIDEO_ENCODER_HEVC_MAX_AU_SIZE L"HevcMaxAUSize" // amf_int64; default = 60; Max AU Size in bits + +#define AMF_VIDEO_ENCODER_HEVC_MIN_QP_I L"HevcMinQP_I" // amf_int64; default = depends on USAGE; Min QP; range = +#define AMF_VIDEO_ENCODER_HEVC_MAX_QP_I L"HevcMaxQP_I" // amf_int64; default = depends on USAGE; Max QP; range = +#define AMF_VIDEO_ENCODER_HEVC_MIN_QP_P L"HevcMinQP_P" // amf_int64; default = depends on USAGE; Min QP; range = +#define AMF_VIDEO_ENCODER_HEVC_MAX_QP_P L"HevcMaxQP_P" // amf_int64; default = depends on USAGE; Max QP; range = + +#define AMF_VIDEO_ENCODER_HEVC_QP_I L"HevcQP_I" // amf_int64; default = 26; P-frame QP; range = 0-51 +#define AMF_VIDEO_ENCODER_HEVC_QP_P L"HevcQP_P" // amf_int64; default = 26; P-frame QP; range = 0-51 + +#define AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_SKIP_FRAME_ENABLE L"HevcRateControlSkipFrameEnable" // bool; default = depends on USAGE; Rate Control Based Frame Skip + +// color conversion +#define AMF_VIDEO_ENCODER_HEVC_INPUT_HDR_METADATA L"HevcInHDRMetadata" // AMFBuffer containing AMFHDRMetadata; default NULL +//#define AMF_VIDEO_ENCODER_HEVC_OUTPUT_HDR_METADATA L"HevcOutHDRMetadata" // AMFBuffer containing AMFHDRMetadata; default NULL + +// DPB management +#define AMF_VIDEO_ENCODER_HEVC_PICTURE_TRANSFER_MODE L"HevcPicTransferMode" // amf_int64(AMF_VIDEO_ENCODER_HEVC_PICTURE_TRANSFER_MODE_ENUM); default = AMF_VIDEO_ENCODER_HEVC_PICTURE_TRANSFER_MODE_OFF - whether to exchange reference/reconstructed pic between encoder and application + +// misc +#define AMF_VIDEO_ENCODER_HEVC_QUERY_TIMEOUT L"HevcQueryTimeout" // amf_int64; default = 0 (no wait); timeout for QueryOutput call in ms. + +// Per-submittion properties - can be set on input surface interface +#define AMF_VIDEO_ENCODER_HEVC_END_OF_SEQUENCE L"HevcEndOfSequence" // bool; default = false; generate end of sequence +#define AMF_VIDEO_ENCODER_HEVC_FORCE_PICTURE_TYPE L"HevcForcePictureType" // amf_int64(AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_ENUM); default = AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_NONE; generate particular picture type +#define AMF_VIDEO_ENCODER_HEVC_INSERT_AUD L"HevcInsertAUD" // bool; default = false; insert AUD +#define AMF_VIDEO_ENCODER_HEVC_INSERT_HEADER L"HevcInsertHeader" // bool; default = false; insert header(SPS, PPS, VPS) + +#define AMF_VIDEO_ENCODER_HEVC_MARK_CURRENT_WITH_LTR_INDEX L"HevcMarkCurrentWithLTRIndex" // amf_int64; default = N/A; Mark current frame with LTR index +#define AMF_VIDEO_ENCODER_HEVC_FORCE_LTR_REFERENCE_BITFIELD L"HevcForceLTRReferenceBitfield"// amf_int64; default = 0; force LTR bit-field +#define AMF_VIDEO_ENCODER_HEVC_ROI_DATA L"HevcROIData" // 2D AMFSurface, surface format: AMF_SURFACE_GRAY32 +#define AMF_VIDEO_ENCODER_HEVC_REFERENCE_PICTURE L"HevcReferencePicture" // AMFInterface(AMFSurface); surface used for frame injection +#define AMF_VIDEO_ENCODER_HEVC_PSNR_FEEDBACK L"HevcPSNRFeedback" // amf_bool; default = false; Signal encoder to calculate PSNR score +#define AMF_VIDEO_ENCODER_HEVC_SSIM_FEEDBACK L"HevcSSIMFeedback" // amf_bool; default = false; Signal encoder to calculate SSIM score +#define AMF_VIDEO_ENCODER_HEVC_STATISTICS_FEEDBACK L"HevcStatisticsFeedback" // amf_bool; default = false; Signal encoder to collect and feedback encoder statistics +#define AMF_VIDEO_ENCODER_HEVC_BLOCK_QP_FEEDBACK L"HevcBlockQpFeedback" // amf_bool; default = false; Signal encoder to collect and feedback block level QP values + +// Properties set by encoder on output buffer interface +#define AMF_VIDEO_ENCODER_HEVC_OUTPUT_DATA_TYPE L"HevcOutputDataType" // amf_int64(AMF_VIDEO_ENCODER_HEVC_OUTPUT_DATA_TYPE_ENUM); default = N/A +#define AMF_VIDEO_ENCODER_HEVC_OUTPUT_MARKED_LTR_INDEX L"HevcMarkedLTRIndex" // amf_int64; default = -1; Marked LTR index +#define AMF_VIDEO_ENCODER_HEVC_OUTPUT_REFERENCED_LTR_INDEX_BITFIELD L"HevcReferencedLTRIndexBitfield"// amf_int64; default = 0; referenced LTR bit-field +#define AMF_VIDEO_ENCODER_HEVC_OUTPUT_TEMPORAL_LAYER L"HevcOutputTemporalLayer" // amf_int64; Temporal layer +#define AMF_VIDEO_ENCODER_HEVC_RECONSTRUCTED_PICTURE L"HevcReconstructedPicture" // AMFInterface(AMFSurface); returns reconstructed picture as an AMFSurface attached to the output buffer as property AMF_VIDEO_ENCODER_RECONSTRUCTED_PICTURE of AMFInterface type +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_PSNR_Y L"PSNRY" // double; PSNR Y +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_PSNR_U L"PSNRU" // double; PSNR U +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_PSNR_V L"PSNRV" // double; PSNR V +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_PSNR_ALL L"PSNRALL" // double; PSNR All +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_SSIM_Y L"SSIMY" // double; SSIM Y +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_SSIM_U L"SSIMU" // double; SSIM U +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_SSIM_V L"SSIMV" // double; SSIM V +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_SSIM_ALL L"SSIMALL" // double; SSIM ALL + + // Encoder statistics feedback +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_FRAME_QP L"HevcStatisticsFeedbackFrameQP" // amf_int64; Rate control base frame/initial QP +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_AVERAGE_QP L"HevcStatisticsFeedbackAvgQP" // amf_int64; Average QP of all encoded CTBs in a picture. Value may be different from the one reported by bitstream analyzer when there are skipped CTBs. +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_MAX_QP L"HevcStatisticsFeedbackMaxQP" // amf_int64; Max QP among all encoded CTBs in a picture. Value may be different from the one reported by bitstream analyzer when there are skipped CTBs. +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_MIN_QP L"HevcStatisticsFeedbackMinQP" // amf_int64; Min QP among all encoded CTBs in a picture. Value may be different from the one reported by bitstream analyzer when there are skipped CTBs. +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_PIX_NUM_INTRA L"HevcStatisticsFeedbackPixNumIntra" // amf_int64; Number of the intra encoded pixels +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_PIX_NUM_INTER L"HevcStatisticsFeedbackPixNumInter" // amf_int64; Number of the inter encoded pixels +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_PIX_NUM_SKIP L"HevcStatisticsFeedbackPixNumSkip" // amf_int64; Number of the skip mode pixels +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_BITCOUNT_RESIDUAL L"HevcStatisticsFeedbackBitcountResidual" // amf_int64; The bit count that corresponds to residual data +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_BITCOUNT_MOTION L"HevcStatisticsFeedbackBitcountMotion" // amf_int64; The bit count that corresponds to motion vectors +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_BITCOUNT_INTER L"HevcStatisticsFeedbackBitcountInter" // amf_int64; The bit count that are assigned to inter CTBs +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_BITCOUNT_INTRA L"HevcStatisticsFeedbackBitcountIntra" // amf_int64; The bit count that are assigned to intra CTBs +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_BITCOUNT_ALL_MINUS_HEADER L"HevcStatisticsFeedbackBitcountAllMinusHeader" // amf_int64; The bit count of the bitstream excluding header +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_MV_X L"HevcStatisticsFeedbackMvX" // amf_int64; Accumulated absolute values of horizontal MV's +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_MV_Y L"HevcStatisticsFeedbackMvY" // amf_int64; Accumulated absolute values of vertical MV's +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_RD_COST_FINAL L"HevcStatisticsFeedbackRdCostFinal" // amf_int64; Frame level final RD cost for full encoding +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_RD_COST_INTRA L"HevcStatisticsFeedbackRdCostIntra" // amf_int64; Frame level intra RD cost for full encoding +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_RD_COST_INTER L"HevcStatisticsFeedbackRdCostInter" // amf_int64; Frame level inter RD cost for full encoding +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_SAD_FINAL L"HevcStatisticsFeedbackSadFinal" // amf_int64; Frame level final SAD for full encoding +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_SAD_INTRA L"HevcStatisticsFeedbackSadIntra" // amf_int64; Frame level intra SAD for full encoding +#define AMF_VIDEO_ENCODER_HEVC_STATISTIC_SAD_INTER L"HevcStatisticsFeedbackSadInter" // amf_int64; Frame level inter SAD for full encoding + + // Encoder block level feedback +#define AMF_VIDEO_ENCODER_HEVC_BLOCK_QP_MAP L"HevcBlockQpMap" // AMFInterface(AMFSurface); AMFSurface of format AMF_SURFACE_GRAY32 containing block level QP values + +// HEVC Encoder capabilities - exposed in AMFCaps interface +#define AMF_VIDEO_ENCODER_HEVC_CAP_MAX_BITRATE L"HevcMaxBitrate" // amf_int64; Maximum bit rate in bits +#define AMF_VIDEO_ENCODER_HEVC_CAP_NUM_OF_STREAMS L"HevcNumOfStreams" // amf_int64; maximum number of encode streams supported +#define AMF_VIDEO_ENCODER_HEVC_CAP_MAX_PROFILE L"HevcMaxProfile" // amf_int64(AMF_VIDEO_ENCODER_HEVC_PROFILE_ENUM) +#define AMF_VIDEO_ENCODER_HEVC_CAP_MAX_TIER L"HevcMaxTier" // amf_int64(AMF_VIDEO_ENCODER_HEVC_TIER_ENUM) maximum profile tier +#define AMF_VIDEO_ENCODER_HEVC_CAP_MAX_LEVEL L"HevcMaxLevel" // amf_int64 maximum profile level +#define AMF_VIDEO_ENCODER_HEVC_CAP_MIN_REFERENCE_FRAMES L"HevcMinReferenceFrames" // amf_int64 minimum number of reference frames +#define AMF_VIDEO_ENCODER_HEVC_CAP_MAX_REFERENCE_FRAMES L"HevcMaxReferenceFrames" // amf_int64 maximum number of reference frames +#define AMF_VIDEO_ENCODER_HEVC_CAP_NUM_OF_HW_INSTANCES L"HevcNumOfHwInstances" // amf_int64 number of HW encoder instances +#define AMF_VIDEO_ENCODER_HEVC_CAP_COLOR_CONVERSION L"HevcColorConversion" // amf_int64(AMF_ACCELERATION_TYPE) - type of supported color conversion. default AMF_ACCEL_GPU +#define AMF_VIDEO_ENCODER_HEVC_CAP_PRE_ANALYSIS L"HevcPreAnalysis" // amf_bool - pre analysis module is available for HEVC UVE encoder, n/a for the other encoders +#define AMF_VIDEO_ENCODER_HEVC_CAP_ROI L"HevcROIMap" // amf_bool - ROI map support is available for HEVC UVE encoder, n/a for the other encoders +#define AMF_VIDEO_ENCODER_HEVC_CAP_MAX_THROUGHPUT L"HevcMaxThroughput" // amf_int64 - MAX throughput for HEVC encoder in MB (16 x 16 pixel) +#define AMF_VIDEO_ENCODER_HEVC_CAP_REQUESTED_THROUGHPUT L"HevcRequestedThroughput" // amf_int64 - Currently total requested throughput for HEVC encode in MB (16 x 16 pixel) +#define AMF_VIDEO_ENCODER_CAPS_HEVC_QUERY_TIMEOUT_SUPPORT L"HevcQueryTimeoutSupport" // amf_bool - Timeout supported for QueryOutout call + +// properties set on AMFComponent to control component creation +#define AMF_VIDEO_ENCODER_HEVC_MEMORY_TYPE L"HevcEncoderMemoryType" // amf_int64(AMF_MEMORY_TYPE) , default is AMF_MEMORY_UNKNOWN, Values : AMF_MEMORY_DX11, AMF_MEMORY_DX9, AMF_MEMORY_UNKNOWN (auto) + +#endif //#ifndef AMF_VideoEncoderHEVC_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/components/VideoEncoderVCE.h
Added
@@ -0,0 +1,326 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +//------------------------------------------------------------------------------------------------- +// AMFVideoEncoderHW_AVC interface declaration +//------------------------------------------------------------------------------------------------- + +#ifndef AMF_VideoEncoderVCE_h +#define AMF_VideoEncoderVCE_h +#pragma once + +#include "Component.h" +#include "ColorSpace.h" +#include "PreAnalysis.h" + +#define AMFVideoEncoderVCE_AVC L"AMFVideoEncoderVCE_AVC" +#define AMFVideoEncoderVCE_SVC L"AMFVideoEncoderVCE_SVC" + +enum AMF_VIDEO_ENCODER_USAGE_ENUM +{ + AMF_VIDEO_ENCODER_USAGE_TRANSCONDING = 0, // kept for backwards compatability + AMF_VIDEO_ENCODER_USAGE_TRANSCODING = 0, // fixed typo + AMF_VIDEO_ENCODER_USAGE_ULTRA_LOW_LATENCY, + AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY, + AMF_VIDEO_ENCODER_USAGE_WEBCAM, + AMF_VIDEO_ENCODER_USAGE_HIGH_QUALITY, + AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY_HIGH_QUALITY +}; + +enum AMF_VIDEO_ENCODER_PROFILE_ENUM +{ + AMF_VIDEO_ENCODER_PROFILE_UNKNOWN = 0, + AMF_VIDEO_ENCODER_PROFILE_BASELINE = 66, + AMF_VIDEO_ENCODER_PROFILE_MAIN = 77, + AMF_VIDEO_ENCODER_PROFILE_HIGH = 100, + AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_BASELINE = 256, + AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_HIGH = 257 +}; + +enum AMF_VIDEO_ENCODER_SCANTYPE_ENUM +{ + AMF_VIDEO_ENCODER_SCANTYPE_PROGRESSIVE = 0, + AMF_VIDEO_ENCODER_SCANTYPE_INTERLACED +}; + +enum AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_ENUM +{ + AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_UNKNOWN = -1, + AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CONSTANT_QP = 0, + AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CBR, + AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR, + AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR, + AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_QUALITY_VBR +}; + +enum AMF_VIDEO_ENCODER_QUALITY_PRESET_ENUM +{ + AMF_VIDEO_ENCODER_QUALITY_PRESET_BALANCED = 0, + AMF_VIDEO_ENCODER_QUALITY_PRESET_SPEED, + AMF_VIDEO_ENCODER_QUALITY_PRESET_QUALITY +}; + +enum AMF_VIDEO_ENCODER_PICTURE_STRUCTURE_ENUM +{ + AMF_VIDEO_ENCODER_PICTURE_STRUCTURE_NONE = 0, + AMF_VIDEO_ENCODER_PICTURE_STRUCTURE_FRAME, + AMF_VIDEO_ENCODER_PICTURE_STRUCTURE_TOP_FIELD, + AMF_VIDEO_ENCODER_PICTURE_STRUCTURE_BOTTOM_FIELD +}; + +enum AMF_VIDEO_ENCODER_PICTURE_TYPE_ENUM +{ + AMF_VIDEO_ENCODER_PICTURE_TYPE_NONE = 0, + AMF_VIDEO_ENCODER_PICTURE_TYPE_SKIP, + AMF_VIDEO_ENCODER_PICTURE_TYPE_IDR, + AMF_VIDEO_ENCODER_PICTURE_TYPE_I, + AMF_VIDEO_ENCODER_PICTURE_TYPE_P, + AMF_VIDEO_ENCODER_PICTURE_TYPE_B +}; + +enum AMF_VIDEO_ENCODER_OUTPUT_DATA_TYPE_ENUM +{ + AMF_VIDEO_ENCODER_OUTPUT_DATA_TYPE_IDR, + AMF_VIDEO_ENCODER_OUTPUT_DATA_TYPE_I, + AMF_VIDEO_ENCODER_OUTPUT_DATA_TYPE_P, + AMF_VIDEO_ENCODER_OUTPUT_DATA_TYPE_B +}; + +enum AMF_VIDEO_ENCODER_PREENCODE_MODE_ENUM +{ + AMF_VIDEO_ENCODER_PREENCODE_DISABLED = 0, + AMF_VIDEO_ENCODER_PREENCODE_ENABLED = 1, +}; + +enum AMF_VIDEO_ENCODER_CODING_ENUM +{ + AMF_VIDEO_ENCODER_UNDEFINED = 0, // BASELINE = CALV; MAIN, HIGH = CABAC + AMF_VIDEO_ENCODER_CABAC, + AMF_VIDEO_ENCODER_CALV, + +}; + +enum AMF_VIDEO_ENCODER_PICTURE_TRANSFER_MODE_ENUM +{ + AMF_VIDEO_ENCODER_PICTURE_TRANSFER_MODE_OFF = 0, + AMF_VIDEO_ENCODER_PICTURE_TRANSFER_MODE_ON +}; + +enum AMF_VIDEO_ENCODER_LTR_MODE_ENUM +{ + AMF_VIDEO_ENCODER_LTR_MODE_RESET_UNUSED = 0, + AMF_VIDEO_ENCODER_LTR_MODE_KEEP_UNUSED +}; + + +// Static properties - can be set before Init() +#define AMF_VIDEO_ENCODER_INSTANCE_INDEX L"EncoderInstance" // amf_int64; selected HW instance idx +#define AMF_VIDEO_ENCODER_FRAMESIZE L"FrameSize" // AMFSize; default = 0,0; Frame size + +#define AMF_VIDEO_ENCODER_EXTRADATA L"ExtraData" // AMFInterface* - > AMFBuffer*; SPS/PPS buffer in Annex B format - read-only +#define AMF_VIDEO_ENCODER_USAGE L"Usage" // amf_int64(AMF_VIDEO_ENCODER_USAGE_ENUM); default = N/A; Encoder usage type. fully configures parameter set. +#define AMF_VIDEO_ENCODER_PROFILE L"Profile" // amf_int64(AMF_VIDEO_ENCODER_PROFILE_ENUM) ; default = AMF_VIDEO_ENCODER_PROFILE_MAIN; H264 profile +#define AMF_VIDEO_ENCODER_PROFILE_LEVEL L"ProfileLevel" // amf_int64; default = 42; H264 profile level +#define AMF_VIDEO_ENCODER_MAX_LTR_FRAMES L"MaxOfLTRFrames" // amf_int64; default = 0; Max number of LTR frames +#define AMF_VIDEO_ENCODER_LTR_MODE L"LTRMode" // amf_int64(AMF_VIDEO_ENCODER_LTR_MODE_ENUM); default = AMF_VIDEO_ENCODER_LTR_MODE_RESET_UNUSED; remove/keep unused LTRs (not specified in property AMF_VIDEO_ENCODER_FORCE_LTR_REFERENCE_BITFIELD) +#define AMF_VIDEO_ENCODER_SCANTYPE L"ScanType" // amf_int64(AMF_VIDEO_ENCODER_SCANTYPE_ENUM); default = AMF_VIDEO_ENCODER_SCANTYPE_PROGRESSIVE; indicates input stream type +#define AMF_VIDEO_ENCODER_MAX_NUM_REFRAMES L"MaxNumRefFrames" // amf_int64; Maximum number of reference frames +#define AMF_VIDEO_ENCODER_MAX_CONSECUTIVE_BPICTURES L"MaxConsecutiveBPictures" // amf_int64; Maximum number of consecutive B Pictures +#define AMF_VIDEO_ENCODER_ADAPTIVE_MINIGOP L"AdaptiveMiniGOP" // bool; default = false; Disable/Enable Adaptive MiniGOP +#define AMF_VIDEO_ENCODER_ASPECT_RATIO L"AspectRatio" // AMFRatio; default = 1, 1 +#define AMF_VIDEO_ENCODER_FULL_RANGE_COLOR L"FullRangeColor" // bool; default = false; inidicates that YUV input is (0,255) +#define AMF_VIDEO_ENCODER_LOWLATENCY_MODE L"LowLatencyInternal" // bool; default = false, enables low latency mode and POC mode 2 in the encoder +#define AMF_VIDEO_ENCODER_PRE_ANALYSIS_ENABLE L"EnablePreAnalysis" // bool; default = false; enables the pre-analysis module. Currently only works in AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR mode. Refer to AMF Video PreAnalysis API reference for more details. +#define AMF_VIDEO_ENCODER_PREENCODE_ENABLE L"RateControlPreanalysisEnable" // amf_int64(AMF_VIDEO_ENCODER_PREENCODE_MODE_ENUM); default = AMF_VIDEO_ENCODER_PREENCODE_DISABLED; enables pre-encode assisted rate control +#define AMF_VIDEO_ENCODER_RATE_CONTROL_PREANALYSIS_ENABLE L"RateControlPreanalysisEnable" // amf_int64(AMF_VIDEO_ENCODER_PREENCODE_MODE_ENUM); default = AMF_VIDEO_ENCODER_PREENCODE_DISABLED; enables pre-encode assisted rate control. Deprecated, please use AMF_VIDEO_ENCODER_PREENCODE_ENABLE instead. +#define AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD L"RateControlMethod" // amf_int64(AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_ENUM); default = depends on USAGE; Rate Control Method +#define AMF_VIDEO_ENCODER_QVBR_QUALITY_LEVEL L"QvbrQualityLevel" // amf_int64; default = 23; QVBR quality level; range = 1-51 +#if !defined(__GNUC__) && !defined(__clang__) + #pragma deprecated("AMF_VIDEO_ENCODER_RATE_CONTROL_PREANALYSIS_ENABLE") +#endif + + + // Quality preset property +#define AMF_VIDEO_ENCODER_QUALITY_PRESET L"QualityPreset" // amf_int64(AMF_VIDEO_ENCODER_QUALITY_PRESET_ENUM); default = depends on USAGE; Quality Preset + + // color conversion +#define AMF_VIDEO_ENCODER_COLOR_BIT_DEPTH L"ColorBitDepth" // amf_int64(AMF_COLOR_BIT_DEPTH_ENUM); default = AMF_COLOR_BIT_DEPTH_8 + +#define AMF_VIDEO_ENCODER_INPUT_COLOR_PROFILE L"InColorProfile" // amf_int64(AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM); default = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN - mean AUTO by size +#define AMF_VIDEO_ENCODER_INPUT_TRANSFER_CHARACTERISTIC L"InColorTransferChar" // amf_int64(AMF_COLOR_TRANSFER_CHARACTERISTIC_ENUM); default = AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED, ISO/IEC 23001-8_2013 ?7.2 See VideoDecoderUVD.h for enum +#define AMF_VIDEO_ENCODER_INPUT_COLOR_PRIMARIES L"InColorPrimaries" // amf_int64(AMF_COLOR_PRIMARIES_ENUM); default = AMF_COLOR_PRIMARIES_UNDEFINED, ISO/IEC 23001-8_2013 Section 7.1 See ColorSpace.h for enum +#define AMF_VIDEO_ENCODER_INPUT_HDR_METADATA L"InHDRMetadata" // AMFBuffer containing AMFHDRMetadata; default NULL + +#define AMF_VIDEO_ENCODER_OUTPUT_COLOR_PROFILE L"OutColorProfile" // amf_int64(AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM); default = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN - mean AUTO by size +#define AMF_VIDEO_ENCODER_OUTPUT_TRANSFER_CHARACTERISTIC L"OutColorTransferChar" // amf_int64(AMF_COLOR_TRANSFER_CHARACTERISTIC_ENUM); default = AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED, ISO/IEC 23001-8_2013 Section 7.2 See VideoDecoderUVD.h for enum +#define AMF_VIDEO_ENCODER_OUTPUT_COLOR_PRIMARIES L"OutColorPrimaries" // amf_int64(AMF_COLOR_PRIMARIES_ENUM); default = AMF_COLOR_PRIMARIES_UNDEFINED, ISO/IEC 23001-8_2013 Section 7.1 See ColorSpace.h for enum +#define AMF_VIDEO_ENCODER_OUTPUT_HDR_METADATA L"OutHDRMetadata" // AMFBuffer containing AMFHDRMetadata; default NULL + + +// Dynamic properties - can be set at any time + // Rate control properties +#define AMF_VIDEO_ENCODER_FRAMERATE L"FrameRate" // AMFRate; default = depends on usage; Frame Rate +#define AMF_VIDEO_ENCODER_B_PIC_DELTA_QP L"BPicturesDeltaQP" // amf_int64; default = depends on USAGE; B-picture Delta +#define AMF_VIDEO_ENCODER_REF_B_PIC_DELTA_QP L"ReferenceBPicturesDeltaQP"// amf_int64; default = depends on USAGE; Reference B-picture Delta + +#define AMF_VIDEO_ENCODER_ENFORCE_HRD L"EnforceHRD" // bool; default = depends on USAGE; Enforce HRD +#define AMF_VIDEO_ENCODER_FILLER_DATA_ENABLE L"FillerDataEnable" // bool; default = false; Filler Data Enable +#define AMF_VIDEO_ENCODER_ENABLE_VBAQ L"EnableVBAQ" // bool; default = depends on USAGE; Enable VBAQ +#define AMF_VIDEO_ENCODER_HIGH_MOTION_QUALITY_BOOST_ENABLE L"HighMotionQualityBoostEnable"// bool; default = depends on USAGE; Enable High motion quality boost mode + + +#define AMF_VIDEO_ENCODER_VBV_BUFFER_SIZE L"VBVBufferSize" // amf_int64; default = depends on USAGE; VBV Buffer Size in bits +#define AMF_VIDEO_ENCODER_INITIAL_VBV_BUFFER_FULLNESS L"InitialVBVBufferFullness" // amf_int64; default = 64; Initial VBV Buffer Fullness 0=0% 64=100% + +#define AMF_VIDEO_ENCODER_MAX_AU_SIZE L"MaxAUSize" // amf_int64; default = 0; Max AU Size in bits + +#define AMF_VIDEO_ENCODER_MIN_QP L"MinQP" // amf_int64; default = depends on USAGE; Min QP; range = 0-51 +#define AMF_VIDEO_ENCODER_MAX_QP L"MaxQP" // amf_int64; default = depends on USAGE; Max QP; range = 0-51 +#define AMF_VIDEO_ENCODER_QP_I L"QPI" // amf_int64; default = 22; I-frame QP; range = 0-51 +#define AMF_VIDEO_ENCODER_QP_P L"QPP" // amf_int64; default = 22; P-frame QP; range = 0-51 +#define AMF_VIDEO_ENCODER_QP_B L"QPB" // amf_int64; default = 22; B-frame QP; range = 0-51 +#define AMF_VIDEO_ENCODER_TARGET_BITRATE L"TargetBitrate" // amf_int64; default = depends on USAGE; Target bit rate in bits +#define AMF_VIDEO_ENCODER_PEAK_BITRATE L"PeakBitrate" // amf_int64; default = depends on USAGE; Peak bit rate in bits +#define AMF_VIDEO_ENCODER_RATE_CONTROL_SKIP_FRAME_ENABLE L"RateControlSkipFrameEnable" // bool; default = depends on USAGE; Rate Control Based Frame Skip + + // Picture control properties +#define AMF_VIDEO_ENCODER_HEADER_INSERTION_SPACING L"HeaderInsertionSpacing" // amf_int64; default = depends on USAGE; Header Insertion Spacing; range 0-1000 +#define AMF_VIDEO_ENCODER_B_PIC_PATTERN L"BPicturesPattern" // amf_int64; default = 3; B-picture Pattern (number of B-Frames) +#define AMF_VIDEO_ENCODER_DE_BLOCKING_FILTER L"DeBlockingFilter" // bool; default = depends on USAGE; De-blocking Filter +#define AMF_VIDEO_ENCODER_B_REFERENCE_ENABLE L"BReferenceEnable" // bool; default = true; Enable Refrence to B-frames +#define AMF_VIDEO_ENCODER_IDR_PERIOD L"IDRPeriod" // amf_int64; default = depends on USAGE; IDR Period in frames +#define AMF_VIDEO_ENCODER_INTRA_REFRESH_NUM_MBS_PER_SLOT L"IntraRefreshMBsNumberPerSlot" // amf_int64; default = depends on USAGE; Intra Refresh MBs Number Per Slot in Macroblocks +#define AMF_VIDEO_ENCODER_SLICES_PER_FRAME L"SlicesPerFrame" // amf_int64; default = 1; Number of slices Per Frame +#define AMF_VIDEO_ENCODER_CABAC_ENABLE L"CABACEnable" // amf_int64(AMF_VIDEO_ENCODER_CODING_ENUM) default = AMF_VIDEO_ENCODER_UNDEFINED + + // Motion estimation +#define AMF_VIDEO_ENCODER_MOTION_HALF_PIXEL L"HalfPixel" // bool; default= true; Half Pixel +#define AMF_VIDEO_ENCODER_MOTION_QUARTERPIXEL L"QuarterPixel" // bool; default= true; Quarter Pixel + + // SVC +#define AMF_VIDEO_ENCODER_NUM_TEMPORAL_ENHANCMENT_LAYERS L"NumOfTemporalEnhancmentLayers" // amf_int64; default = 1; range = 1-MaxTemporalLayers; Number of temporal Layers (SVC) + + + // DPB management +#define AMF_VIDEO_ENCODER_PICTURE_TRANSFER_MODE L"PicTransferMode" // amf_int64(AMF_VIDEO_ENCODER_PICTURE_TRANSFER_MODE_ENUM); default = AMF_VIDEO_ENCODER_PICTURE_TRANSFER_MODE_OFF - whether to exchange reference/reconstructed pic between encoder and application + // misc +#define AMF_VIDEO_ENCODER_QUERY_TIMEOUT L"QueryTimeout" // amf_int64; default = 0 (no wait); timeout for QueryOutput call in ms. + +// Per-submittion properties - can be set on input surface interface +#define AMF_VIDEO_ENCODER_END_OF_SEQUENCE L"EndOfSequence" // bool; default = false; generate end of sequence +#define AMF_VIDEO_ENCODER_END_OF_STREAM L"EndOfStream" // bool; default = false; generate end of stream +#define AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE L"ForcePictureType" // amf_int64(AMF_VIDEO_ENCODER_PICTURE_TYPE_ENUM); default = AMF_VIDEO_ENCODER_PICTURE_TYPE_NONE; generate particular picture type +#define AMF_VIDEO_ENCODER_INSERT_AUD L"InsertAUD" // bool; default = false; insert AUD +#define AMF_VIDEO_ENCODER_INSERT_SPS L"InsertSPS" // bool; default = false; insert SPS +#define AMF_VIDEO_ENCODER_INSERT_PPS L"InsertPPS" // bool; default = false; insert PPS +#define AMF_VIDEO_ENCODER_PICTURE_STRUCTURE L"PictureStructure" // amf_int64(AMF_VIDEO_ENCODER_PICTURE_STRUCTURE_ENUM); default = AMF_VIDEO_ENCODER_PICTURE_STRUCTURE_FRAME; indicate picture type +#define AMF_VIDEO_ENCODER_MARK_CURRENT_WITH_LTR_INDEX L"MarkCurrentWithLTRIndex" // //amf_int64; default = N/A; Mark current frame with LTR index +#define AMF_VIDEO_ENCODER_FORCE_LTR_REFERENCE_BITFIELD L"ForceLTRReferenceBitfield"// amf_int64; default = 0; force LTR bit-field +#define AMF_VIDEO_ENCODER_ROI_DATA L"ROIData" // 2D AMFSurface, surface format: AMF_SURFACE_GRAY32 +#define AMF_VIDEO_ENCODER_REFERENCE_PICTURE L"ReferencePicture" // AMFInterface(AMFSurface); surface used for frame injection +#define AMF_VIDEO_ENCODER_PSNR_FEEDBACK L"PSNRFeedback" // amf_bool; default = false; Signal encoder to calculate PSNR score +#define AMF_VIDEO_ENCODER_SSIM_FEEDBACK L"SSIMFeedback" // amf_bool; default = false; Signal encoder to calculate SSIM score +#define AMF_VIDEO_ENCODER_STATISTICS_FEEDBACK L"StatisticsFeedback" // amf_bool; default = false; Signal encoder to collect and feedback statistics +#define AMF_VIDEO_ENCODER_BLOCK_QP_FEEDBACK L"BlockQpFeedback" // amf_bool; default = false; Signal encoder to collect and feedback block level QP values + + +// properties set by encoder on output buffer interface +#define AMF_VIDEO_ENCODER_OUTPUT_DATA_TYPE L"OutputDataType" // amf_int64(AMF_VIDEO_ENCODER_OUTPUT_DATA_TYPE_ENUM); default = N/A +#define AMF_VIDEO_ENCODER_OUTPUT_MARKED_LTR_INDEX L"MarkedLTRIndex" //amf_int64; default = -1; Marked LTR index +#define AMF_VIDEO_ENCODER_OUTPUT_REFERENCED_LTR_INDEX_BITFIELD L"ReferencedLTRIndexBitfield" // amf_int64; default = 0; referenced LTR bit-field +#define AMF_VIDEO_ENCODER_OUTPUT_TEMPORAL_LAYER L"OutputTemporalLayer" // amf_int64; Temporal layer +#define AMF_VIDEO_ENCODER_PRESENTATION_TIME_STAMP L"PresentationTimeStamp" // amf_int64; Presentation time stamp (PTS) +#define AMF_VIDEO_ENCODER_RECONSTRUCTED_PICTURE L"ReconstructedPicture" // AMFInterface(AMFSurface); returns reconstructed picture as an AMFSurface attached to the output buffer as property AMF_VIDEO_ENCODER_RECONSTRUCTED_PICTURE of AMFInterface type +#define AMF_VIDEO_ENCODER_STATISTIC_PSNR_Y L"PSNRY" // double; PSNR Y +#define AMF_VIDEO_ENCODER_STATISTIC_PSNR_U L"PSNRU" // double; PSNR U +#define AMF_VIDEO_ENCODER_STATISTIC_PSNR_V L"PSNRV" // double; PSNR V +#define AMF_VIDEO_ENCODER_STATISTIC_PSNR_ALL L"PSNRALL" // double; PSNR All +#define AMF_VIDEO_ENCODER_STATISTIC_SSIM_Y L"SSIMY" // double; SSIM Y +#define AMF_VIDEO_ENCODER_STATISTIC_SSIM_U L"SSIMU" // double; SSIM U +#define AMF_VIDEO_ENCODER_STATISTIC_SSIM_V L"SSIMV" // double; SSIM V +#define AMF_VIDEO_ENCODER_STATISTIC_SSIM_ALL L"SSIMALL" // double; SSIM ALL + + // Encoder statistics feedback +#define AMF_VIDEO_ENCODER_STATISTIC_FRAME_QP L"StatisticsFeedbackFrameQP" // amf_int64; Rate control base frame/initial QP +#define AMF_VIDEO_ENCODER_STATISTIC_AVERAGE_QP L"StatisticsFeedbackAvgQP" // amf_int64; Average calculated QP of all encoded MBs in a picture. Value may be different from the one reported by bitstream analyzer when there are skipped MBs. +#define AMF_VIDEO_ENCODER_STATISTIC_MAX_QP L"StatisticsFeedbackMaxQP" // amf_int64; Max calculated QP among all encoded MBs in a picture. Value may be different from the one reported by bitstream analyzer when there are skipped MBs. +#define AMF_VIDEO_ENCODER_STATISTIC_MIN_QP L"StatisticsFeedbackMinQP" // amf_int64; Min calculated QP among all encoded MBs in a picture. Value may be different from the one reported by bitstream analyzer when there are skipped MBs. +#define AMF_VIDEO_ENCODER_STATISTIC_PIX_NUM_INTRA L"StatisticsFeedbackPixNumIntra" // amf_int64; Number of the intra encoded pixels +#define AMF_VIDEO_ENCODER_STATISTIC_PIX_NUM_INTER L"StatisticsFeedbackPixNumInter" // amf_int64; Number of the inter encoded pixels +#define AMF_VIDEO_ENCODER_STATISTIC_PIX_NUM_SKIP L"StatisticsFeedbackPixNumSkip" // amf_int64; Number of the skip mode pixels +#define AMF_VIDEO_ENCODER_STATISTIC_BITCOUNT_RESIDUAL L"StatisticsFeedbackBitcountResidual" // amf_int64; The bit count that corresponds to residual data +#define AMF_VIDEO_ENCODER_STATISTIC_BITCOUNT_MOTION L"StatisticsFeedbackBitcountMotion" // amf_int64; The bit count that corresponds to motion vectors +#define AMF_VIDEO_ENCODER_STATISTIC_BITCOUNT_INTER L"StatisticsFeedbackBitcountInter" // amf_int64; The bit count that are assigned to inter MBs +#define AMF_VIDEO_ENCODER_STATISTIC_BITCOUNT_INTRA L"StatisticsFeedbackBitcountIntra" // amf_int64; The bit count that are assigned to intra MBs +#define AMF_VIDEO_ENCODER_STATISTIC_BITCOUNT_ALL_MINUS_HEADER L"StatisticsFeedbackBitcountAllMinusHeader" // amf_int64; The bit count of the bitstream excluding header +#define AMF_VIDEO_ENCODER_STATISTIC_MV_X L"StatisticsFeedbackMvX" // amf_int64; Accumulated absolute values of horizontal MV's +#define AMF_VIDEO_ENCODER_STATISTIC_MV_Y L"StatisticsFeedbackMvY" // amf_int64; Accumulated absolute values of vertical MV's +#define AMF_VIDEO_ENCODER_STATISTIC_RD_COST_FINAL L"StatisticsFeedbackRdCostFinal" // amf_int64; Frame level final RD cost for full encoding +#define AMF_VIDEO_ENCODER_STATISTIC_RD_COST_INTRA L"StatisticsFeedbackRdCostIntra" // amf_int64; Frame level intra RD cost for full encoding +#define AMF_VIDEO_ENCODER_STATISTIC_RD_COST_INTER L"StatisticsFeedbackRdCostInter" // amf_int64; Frame level inter RD cost for full encoding +#define AMF_VIDEO_ENCODER_STATISTIC_SATD_FINAL L"StatisticsFeedbackSatdFinal" // amf_int64; Frame level final SATD for full encoding +#define AMF_VIDEO_ENCODER_STATISTIC_SATD_INTRA L"StatisticsFeedbackSatdIntra" // amf_int64; Frame level intra SATD for full encoding +#define AMF_VIDEO_ENCODER_STATISTIC_SATD_INTER L"StatisticsFeedbackSatdInter" // amf_int64; Frame level inter SATD for full encoding + + // Encoder block level feedback +#define AMF_VIDEO_ENCODER_BLOCK_QP_MAP L"BlockQpMap" // AMFInterface(AMFSurface); AMFSurface of format AMF_SURFACE_GRAY32 containing block level QP values + +#define AMF_VIDEO_ENCODER_HDCP_COUNTER L"HDCPCounter" // const void* + +// Properties for multi-instance cloud gaming +#define AMF_VIDEO_ENCODER_MAX_INSTANCES L"EncoderMaxInstances" // deprecated. amf_int64; default = 1; max number of encoder instances +#define AMF_VIDEO_ENCODER_MULTI_INSTANCE_MODE L"MultiInstanceMode" // deprecated. bool; default = false; +#define AMF_VIDEO_ENCODER_CURRENT_QUEUE L"MultiInstanceCurrentQueue"// deprecated. amf_int64; default = 0; + + +// VCE Encoder capabilities - exposed in AMFCaps interface +#define AMF_VIDEO_ENCODER_CAP_MAX_BITRATE L"MaxBitrate" // amf_int64; Maximum bit rate in bits +#define AMF_VIDEO_ENCODER_CAP_NUM_OF_STREAMS L"NumOfStreams" // amf_int64; maximum number of encode streams supported +#define AMF_VIDEO_ENCODER_CAP_MAX_PROFILE L"MaxProfile" // AMF_VIDEO_ENCODER_PROFILE_ENUM +#define AMF_VIDEO_ENCODER_CAP_MAX_LEVEL L"MaxLevel" // amf_int64 maximum profile level +#define AMF_VIDEO_ENCODER_CAP_BFRAMES L"BFrames" // bool is B-Frames supported +#define AMF_VIDEO_ENCODER_CAP_MIN_REFERENCE_FRAMES L"MinReferenceFrames" // amf_int64 minimum number of reference frames +#define AMF_VIDEO_ENCODER_CAP_MAX_REFERENCE_FRAMES L"MaxReferenceFrames" // amf_int64 maximum number of reference frames +#define AMF_VIDEO_ENCODER_CAP_MAX_TEMPORAL_LAYERS L"MaxTemporalLayers" // amf_int64 maximum number of temporal layers +#define AMF_VIDEO_ENCODER_CAP_FIXED_SLICE_MODE L"FixedSliceMode" // bool is fixed slice mode supported +#define AMF_VIDEO_ENCODER_CAP_NUM_OF_HW_INSTANCES L"NumOfHwInstances" // amf_int64 number of HW encoder instances +#define AMF_VIDEO_ENCODER_CAP_COLOR_CONVERSION L"ColorConversion" // amf_int64(AMF_ACCELERATION_TYPE) - type of supported color conversion. default AMF_ACCEL_GPU +#define AMF_VIDEO_ENCODER_CAP_PRE_ANALYSIS L"PreAnalysis" // amf_bool - pre analysis module is available for H264 UVE encoder, n/a for the other encoders +#define AMF_VIDEO_ENCODER_CAP_ROI L"ROIMap" // amf_bool - ROI map support is available for H264 UVE encoder, n/a for the other encoders +#define AMF_VIDEO_ENCODER_CAP_MAX_THROUGHPUT L"MaxThroughput" // amf_int64 - MAX throughput for H264 encoder in MB (16 x 16 pixel) +#define AMF_VIDEO_ENCODER_CAP_REQUESTED_THROUGHPUT L"RequestedThroughput" // amf_int64 - Currently total requested throughput for H264 encoder in MB (16 x 16 pixel) +#define AMF_VIDEO_ENCODER_CAPS_QUERY_TIMEOUT_SUPPORT L"QueryTimeoutSupport" // amf_bool - Timeout supported for QueryOutout call + +// properties set on AMFComponent to control component creation +#define AMF_VIDEO_ENCODER_MEMORY_TYPE L"EncoderMemoryType" // amf_int64(AMF_MEMORY_TYPE) , default is AMF_MEMORY_UNKNOWN, Values : AMF_MEMORY_DX11, AMF_MEMORY_DX9, AMF_MEMORY_VULKAN or AMF_MEMORY_UNKNOWN (auto) + +#endif //#ifndef AMF_VideoEncoderVCE_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/AudioBuffer.h
Added
@@ -0,0 +1,234 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_AudioBuffer_h +#define AMF_AudioBuffer_h +#pragma once + +#include "Data.h" +#if defined(_MSC_VER) + #pragma warning( push ) + #pragma warning(disable : 4263) + #pragma warning(disable : 4264) +#endif +#if defined(__cplusplus) +namespace amf +{ +#endif + typedef enum AMF_AUDIO_FORMAT + { + AMFAF_UNKNOWN =-1, + AMFAF_U8 = 0, // amf_uint8 + AMFAF_S16 = 1, // amf_int16 + AMFAF_S32 = 2, // amf_int32 + AMFAF_FLT = 3, // amf_float + AMFAF_DBL = 4, // amf_double + + AMFAF_U8P = 5, // amf_uint8 + AMFAF_S16P = 6, // amf_int16 + AMFAF_S32P = 7, // amf_int32 + AMFAF_FLTP = 8, // amf_float + AMFAF_DBLP = 9, // amf_double + AMFAF_FIRST = AMFAF_U8, + AMFAF_LAST = AMFAF_DBLP, + } AMF_AUDIO_FORMAT; + + typedef enum AMF_AUDIO_CHANNEL_LAYOUT + { + AMFACL_SPEAKER_FRONT_LEFT = 0x1, + AMFACL_SPEAKER_FRONT_RIGHT = 0x2, + AMFACL_SPEAKER_FRONT_CENTER = 0x4, + AMFACL_SPEAKER_LOW_FREQUENCY = 0x8, + AMFACL_SPEAKER_BACK_LEFT = 0x10, + AMFACL_SPEAKER_BACK_RIGHT = 0x20, + AMFACL_SPEAKER_FRONT_LEFT_OF_CENTER = 0x40, + AMFACL_SPEAKER_FRONT_RIGHT_OF_CENTER = 0x80, + AMFACL_SPEAKER_BACK_CENTER = 0x100, + AMFACL_SPEAKER_SIDE_LEFT = 0x200, + AMFACL_SPEAKER_SIDE_RIGHT = 0x400, + AMFACL_SPEAKER_TOP_CENTER = 0x800, + AMFACL_SPEAKER_TOP_FRONT_LEFT = 0x1000, + AMFACL_SPEAKER_TOP_FRONT_CENTER = 0x2000, + AMFACL_SPEAKER_TOP_FRONT_RIGHT = 0x4000, + AMFACL_SPEAKER_TOP_BACK_LEFT = 0x8000, + AMFACL_SPEAKER_TOP_BACK_CENTER = 0x10000, + AMFACL_SPEAKER_TOP_BACK_RIGHT = 0x20000 + } AMF_AUDIO_CHANNEL_LAYOUT; + + // get the most common layout for a given number of speakers + inline int GetDefaultChannelLayout(int channels) + { + switch (channels) + { + case 1: + return (AMFACL_SPEAKER_FRONT_CENTER); + case 2: + return (AMFACL_SPEAKER_FRONT_LEFT | AMFACL_SPEAKER_FRONT_RIGHT); + case 4: + return (AMFACL_SPEAKER_FRONT_LEFT | AMFACL_SPEAKER_FRONT_RIGHT | AMFACL_SPEAKER_BACK_LEFT | AMFACL_SPEAKER_BACK_RIGHT); + case 6: + return (AMFACL_SPEAKER_FRONT_LEFT | AMFACL_SPEAKER_FRONT_RIGHT | AMFACL_SPEAKER_FRONT_CENTER | AMFACL_SPEAKER_LOW_FREQUENCY | AMFACL_SPEAKER_BACK_LEFT | AMFACL_SPEAKER_BACK_RIGHT); + case 8: + return (AMFACL_SPEAKER_FRONT_LEFT | AMFACL_SPEAKER_FRONT_RIGHT | AMFACL_SPEAKER_FRONT_CENTER | AMFACL_SPEAKER_LOW_FREQUENCY | AMFACL_SPEAKER_BACK_LEFT | AMFACL_SPEAKER_BACK_RIGHT | AMFACL_SPEAKER_FRONT_LEFT_OF_CENTER | AMFACL_SPEAKER_FRONT_RIGHT_OF_CENTER); + } + + return AMFACL_SPEAKER_FRONT_LEFT | AMFACL_SPEAKER_FRONT_RIGHT; + } + + //---------------------------------------------------------------------------------------------- + // AMFAudioBufferObserver interface - callback + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMFAudioBuffer; + class AMF_NO_VTABLE AMFAudioBufferObserver + { + public: + virtual void AMF_STD_CALL OnBufferDataRelease(AMFAudioBuffer* pBuffer) = 0; + }; +#else // #if defined(__cplusplus) + typedef struct AMFAudioBuffer AMFAudioBuffer; + typedef struct AMFAudioBufferObserver AMFAudioBufferObserver; + typedef struct AMFAudioBufferObserverVtbl + { + void (AMF_STD_CALL *OnBufferDataRelease)(AMFAudioBufferObserver* pThis, AMFAudioBuffer* pBuffer); + } AMFAudioBufferObserverVtbl; + + struct AMFAudioBufferObserver + { + const AMFAudioBufferObserverVtbl *pVtbl; + }; + +#endif // #if defined(__cplusplus) + //---------------------------------------------------------------------------------------------- + // AudioBuffer interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFAudioBuffer : public AMFData + { + public: + AMF_DECLARE_IID(0x2212ff8, 0x6107, 0x430b, 0xb6, 0x3c, 0xc7, 0xe5, 0x40, 0xe5, 0xf8, 0xeb) + + virtual amf_int32 AMF_STD_CALL GetSampleCount() = 0; + virtual amf_int32 AMF_STD_CALL GetSampleRate() = 0; + virtual amf_int32 AMF_STD_CALL GetChannelCount() = 0; + virtual AMF_AUDIO_FORMAT AMF_STD_CALL GetSampleFormat() = 0; + virtual amf_int32 AMF_STD_CALL GetSampleSize() = 0; + virtual amf_uint32 AMF_STD_CALL GetChannelLayout() = 0; + virtual void* AMF_STD_CALL GetNative() = 0; + virtual amf_size AMF_STD_CALL GetSize() = 0; + + // Observer management +#ifdef __clang__ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Woverloaded-virtual" +#endif + virtual void AMF_STD_CALL AddObserver(AMFAudioBufferObserver* pObserver) = 0; + virtual void AMF_STD_CALL RemoveObserver(AMFAudioBufferObserver* pObserver) = 0; +#ifdef __clang__ + #pragma clang diagnostic pop +#endif + + + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFAudioBuffer> AMFAudioBufferPtr; + //---------------------------------------------------------------------------------------------- +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFAudioBuffer, 0x2212ff8, 0x6107, 0x430b, 0xb6, 0x3c, 0xc7, 0xe5, 0x40, 0xe5, 0xf8, 0xeb) + + typedef struct AMFAudioBufferVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFAudioBuffer* pThis); + amf_long (AMF_STD_CALL *Release)(AMFAudioBuffer* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFAudioBuffer* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFPropertyStorage interface + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFAudioBuffer* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFAudioBuffer* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFAudioBuffer* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFAudioBuffer* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFAudioBuffer* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFAudioBuffer* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFAudioBuffer* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFAudioBuffer* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFAudioBuffer* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFAudioBuffer* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFData interface + + AMF_MEMORY_TYPE (AMF_STD_CALL *GetMemoryType)(AMFAudioBuffer* pThis); + + AMF_RESULT (AMF_STD_CALL *Duplicate)(AMFAudioBuffer* pThis, AMF_MEMORY_TYPE type, AMFData** ppData); + AMF_RESULT (AMF_STD_CALL *Convert)(AMFAudioBuffer* pThis, AMF_MEMORY_TYPE type); // optimal interop if possilble. Copy through host memory if needed + AMF_RESULT (AMF_STD_CALL *Interop)(AMFAudioBuffer* pThis, AMF_MEMORY_TYPE type); // only optimal interop if possilble. No copy through host memory for GPU objects + + AMF_DATA_TYPE (AMF_STD_CALL *GetDataType)(AMFAudioBuffer* pThis); + + amf_bool (AMF_STD_CALL *IsReusable)(AMFAudioBuffer* pThis); + + void (AMF_STD_CALL *SetPts)(AMFAudioBuffer* pThis, amf_pts pts); + amf_pts (AMF_STD_CALL *GetPts)(AMFAudioBuffer* pThis); + void (AMF_STD_CALL *SetDuration)(AMFAudioBuffer* pThis, amf_pts duration); + amf_pts (AMF_STD_CALL *GetDuration)(AMFAudioBuffer* pThis); + + // AMFAudioBuffer interface + + amf_int32 (AMF_STD_CALL *GetSampleCount)(AMFAudioBuffer* pThis); + amf_int32 (AMF_STD_CALL *GetSampleRate)(AMFAudioBuffer* pThis); + amf_int32 (AMF_STD_CALL *GetChannelCount)(AMFAudioBuffer* pThis); + AMF_AUDIO_FORMAT (AMF_STD_CALL *GetSampleFormat)(AMFAudioBuffer* pThis); + amf_int32 (AMF_STD_CALL *GetSampleSize)(AMFAudioBuffer* pThis); + amf_uint32 (AMF_STD_CALL *GetChannelLayout)(AMFAudioBuffer* pThis); + void* (AMF_STD_CALL *GetNative)(AMFAudioBuffer* pThis); + amf_size (AMF_STD_CALL *GetSize)(AMFAudioBuffer* pThis); + + // Observer management + void (AMF_STD_CALL *AddObserver_AudioBuffer)(AMFAudioBuffer* pThis, AMFAudioBufferObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver_AudioBuffer)(AMFAudioBuffer* pThis, AMFAudioBufferObserver* pObserver); + + } AMFAudioBufferVtbl; + + struct AMFAudioBuffer + { + const AMFAudioBufferVtbl *pVtbl; + }; +#endif // #if defined(__cplusplus) +#if defined(__cplusplus) +} // namespace +#endif +#if defined(_MSC_VER) + #pragma warning( pop ) +#endif +#endif //#ifndef AMF_AudioBuffer_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Buffer.h
Added
@@ -0,0 +1,187 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_Buffer_h +#define AMF_Buffer_h +#pragma once + +#include "Data.h" + +#if defined(_MSC_VER) + #pragma warning( push ) + #pragma warning(disable : 4263) + #pragma warning(disable : 4264) +#endif +#if defined(__cplusplus) +namespace amf +{ +#endif + + //---------------------------------------------------------------------------------------------- + // AMF_BUFFER_USAGE translates to D3D11_BIND_FLAG or VkBufferUsageFlagBits + // bit mask + //---------------------------------------------------------------------------------------------- + typedef enum AMF_BUFFER_USAGE_BITS + { // D3D11 D3D12 Vulkan + AMF_BUFFER_USAGE_DEFAULT = 0x80000000, // D3D11_USAGE_STAGING, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT + AMF_BUFFER_USAGE_NONE = 0x00000000, // 0 , D3D12_RESOURCE_FLAG_NONE, 0 + AMF_BUFFER_USAGE_CONSTANT = 0x00000001, // D3D11_BIND_CONSTANT_BUFFER, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT + AMF_BUFFER_USAGE_SHADER_RESOURCE = 0x00000002, // D3D11_BIND_SHADER_RESOURCE, D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT + AMF_BUFFER_USAGE_UNORDERED_ACCESS = 0x00000004, // D3D11_BIND_UNORDERED_ACCESS, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT + AMF_BUFFER_USAGE_TRANSFER_SRC = 0x00000008, // VK_BUFFER_USAGE_TRANSFER_SRC_BIT + AMF_BUFFER_USAGE_TRANSFER_DST = 0x00000010, // VK_BUFFER_USAGE_TRANSFER_DST_BIT + } AMF_BUFFER_USAGE_BITS; + typedef amf_flags AMF_BUFFER_USAGE; + //---------------------------------------------------------------------------------------------- + + + //---------------------------------------------------------------------------------------------- + // AMFBufferObserver interface - callback + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMFBuffer; + class AMF_NO_VTABLE AMFBufferObserver + { + public: + virtual void AMF_STD_CALL OnBufferDataRelease(AMFBuffer* pBuffer) = 0; + }; +#else // #if defined(__cplusplus) + typedef struct AMFBuffer AMFBuffer; + typedef struct AMFBufferObserver AMFBufferObserver; + + typedef struct AMFBufferObserverVtbl + { + void (AMF_STD_CALL *OnBufferDataRelease)(AMFBufferObserver* pThis, AMFBuffer* pBuffer); + } AMFBufferObserverVtbl; + + struct AMFBufferObserver + { + const AMFBufferObserverVtbl *pVtbl; + }; + +#endif // #if defined(__cplusplus) + + //---------------------------------------------------------------------------------------------- + // AMFBuffer interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFBuffer : public AMFData + { + public: + AMF_DECLARE_IID(0xb04b7248, 0xb6f0, 0x4321, 0xb6, 0x91, 0xba, 0xa4, 0x74, 0xf, 0x9f, 0xcb) + + virtual AMF_RESULT AMF_STD_CALL SetSize(amf_size newSize) = 0; + virtual amf_size AMF_STD_CALL GetSize() = 0; + virtual void* AMF_STD_CALL GetNative() = 0; + + // Observer management +#ifdef __clang__ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Woverloaded-virtual" +#endif + virtual void AMF_STD_CALL AddObserver(AMFBufferObserver* pObserver) = 0; + virtual void AMF_STD_CALL RemoveObserver(AMFBufferObserver* pObserver) = 0; +#ifdef __clang__ + #pragma clang diagnostic pop +#endif + + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFBuffer> AMFBufferPtr; + //---------------------------------------------------------------------------------------------- + +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFBuffer, 0xb04b7248, 0xb6f0, 0x4321, 0xb6, 0x91, 0xba, 0xa4, 0x74, 0xf, 0x9f, 0xcb) + + typedef struct AMFBufferVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFBuffer* pThis); + amf_long (AMF_STD_CALL *Release)(AMFBuffer* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFBuffer* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFPropertyStorage interface + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFBuffer* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFBuffer* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFBuffer* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFBuffer* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFBuffer* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFBuffer* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFBuffer* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFBuffer* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFBuffer* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFBuffer* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFData interface + + AMF_MEMORY_TYPE (AMF_STD_CALL *GetMemoryType)(AMFBuffer* pThis); + + AMF_RESULT (AMF_STD_CALL *Duplicate)(AMFBuffer* pThis, AMF_MEMORY_TYPE type, AMFData** ppData); + AMF_RESULT (AMF_STD_CALL *Convert)(AMFBuffer* pThis, AMF_MEMORY_TYPE type); // optimal interop if possilble. Copy through host memory if needed + AMF_RESULT (AMF_STD_CALL *Interop)(AMFBuffer* pThis, AMF_MEMORY_TYPE type); // only optimal interop if possilble. No copy through host memory for GPU objects + + AMF_DATA_TYPE (AMF_STD_CALL *GetDataType)(AMFBuffer* pThis); + + amf_bool (AMF_STD_CALL *IsReusable)(AMFBuffer* pThis); + + void (AMF_STD_CALL *SetPts)(AMFBuffer* pThis, amf_pts pts); + amf_pts (AMF_STD_CALL *GetPts)(AMFBuffer* pThis); + void (AMF_STD_CALL *SetDuration)(AMFBuffer* pThis, amf_pts duration); + amf_pts (AMF_STD_CALL *GetDuration)(AMFBuffer* pThis); + + // AMFBuffer interface + + AMF_RESULT (AMF_STD_CALL *SetSize)(AMFBuffer* pThis, amf_size newSize); + amf_size (AMF_STD_CALL *GetSize)(AMFBuffer* pThis); + void* (AMF_STD_CALL *GetNative)(AMFBuffer* pThis); + + // Observer management + void (AMF_STD_CALL *AddObserver_Buffer)(AMFBuffer* pThis, AMFBufferObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver_Buffer)(AMFBuffer* pThis, AMFBufferObserver* pObserver); + + } AMFBufferVtbl; + + struct AMFBuffer + { + const AMFBufferVtbl *pVtbl; + }; + +#endif // #if defined(__cplusplus) +#if defined(__cplusplus) +} // namespace +#endif +#if defined(_MSC_VER) + #pragma warning( pop ) +#endif +#endif //#ifndef AMF_Buffer_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Compute.h
Added
@@ -0,0 +1,302 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +/** + *************************************************************************************************** + * @file Compute.h + * @brief AMFCompute interface declaration + *************************************************************************************************** + */ +#ifndef AMF_Compute_h +#define AMF_Compute_h +#pragma once + +#include "Buffer.h" +#include "Surface.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif + typedef amf_uint64 AMF_KERNEL_ID; + + //---------------------------------------------------------------------------------------------- + // enumerations for plane conversion + //---------------------------------------------------------------------------------------------- + typedef enum AMF_CHANNEL_ORDER + { + AMF_CHANNEL_ORDER_INVALID = 0, + AMF_CHANNEL_ORDER_R = 1, + AMF_CHANNEL_ORDER_RG = 2, + AMF_CHANNEL_ORDER_BGRA = 3, + AMF_CHANNEL_ORDER_RGBA = 4, + AMF_CHANNEL_ORDER_ARGB = 5, + AMF_CHANNEL_ORDER_YUY2 = 6, + } AMF_CHANNEL_ORDER; + //---------------------------------------------------------------------------------------------- + typedef enum AMF_CHANNEL_TYPE + { + AMF_CHANNEL_INVALID = 0, + AMF_CHANNEL_UNSIGNED_INT8 = 1, + AMF_CHANNEL_UNSIGNED_INT32 = 2, + AMF_CHANNEL_UNORM_INT8 = 3, + AMF_CHANNEL_UNORM_INT16 = 4, + AMF_CHANNEL_SNORM_INT16 = 5, + AMF_CHANNEL_FLOAT = 6, + AMF_CHANNEL_FLOAT16 = 7, + AMF_CHANNEL_UNSIGNED_INT16 = 8, + AMF_CHANNEL_UNORM_INT_101010 = 9, +} AMF_CHANNEL_TYPE; + //---------------------------------------------------------------------------------------------- +#define AMF_STRUCTURED_BUFFER_FORMAT L"StructuredBufferFormat" // amf_int64(AMF_CHANNEL_TYPE), default - AMF_CHANNEL_UNSIGNED_INT32; to be set on AMFBuffer objects +#if defined(_WIN32) + AMF_WEAK GUID AMFStructuredBufferFormatGUID = { 0x90c5d674, 0xe90, 0x4181, {0xbd, 0xef, 0x26, 0x13, 0xc1, 0xdf, 0xa3, 0xbd} }; // UINT(DXGI_FORMAT), default - DXGI_FORMAT_R32_UINT; to be set on ID3D11Buffer or ID3D11Texture2D objects when used natively +#endif + //---------------------------------------------------------------------------------------------- + // enumeration argument type + //---------------------------------------------------------------------------------------------- + typedef enum AMF_ARGUMENT_ACCESS_TYPE + { + AMF_ARGUMENT_ACCESS_READ = 0, + AMF_ARGUMENT_ACCESS_WRITE = 1, + AMF_ARGUMENT_ACCESS_READWRITE = 2, + AMF_ARGUMENT_ACCESS_READWRITE_MASK = 0xFFFF, + //Sampler parameters + AMF_ARGUMENT_SAMPLER_LINEAR = 0x10000000, + AMF_ARGUMENT_SAMPLER_NORM_COORD = 0x20000000, + AMF_ARGUMENT_SAMPLER_POINT = 0x40000000, + AMF_ARGUMENT_SAMPLER_MASK = 0xFFFF0000, + } AMF_ARGUMENT_ACCESS_TYPE; + //---------------------------------------------------------------------------------------------- + // AMFComputeKernel interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFComputeKernel : public AMFInterface + { + public: + AMF_DECLARE_IID(0x94815701, 0x6c84, 0x4ba6, 0xa9, 0xfe, 0xe9, 0xad, 0x40, 0xf8, 0x8, 0x8) + + virtual void* AMF_STD_CALL GetNative() = 0; + virtual const wchar_t* AMF_STD_CALL GetIDName() = 0; + virtual AMF_RESULT AMF_STD_CALL SetArgPlaneNative(amf_size index, void* pPlane, AMF_ARGUMENT_ACCESS_TYPE eAccess) = 0; + virtual AMF_RESULT AMF_STD_CALL SetArgBufferNative(amf_size index, void* pBuffer, AMF_ARGUMENT_ACCESS_TYPE eAccess) = 0; + + virtual AMF_RESULT AMF_STD_CALL SetArgPlane(amf_size index, AMFPlane* pPlane, AMF_ARGUMENT_ACCESS_TYPE eAccess) = 0; + virtual AMF_RESULT AMF_STD_CALL SetArgBuffer(amf_size index, AMFBuffer* pBuffer, AMF_ARGUMENT_ACCESS_TYPE eAccess) = 0; + + virtual AMF_RESULT AMF_STD_CALL SetArgInt32(amf_size index, amf_int32 data) = 0; + virtual AMF_RESULT AMF_STD_CALL SetArgInt64(amf_size index, amf_int64 data) = 0; + virtual AMF_RESULT AMF_STD_CALL SetArgFloat(amf_size index, amf_float data) = 0; + virtual AMF_RESULT AMF_STD_CALL SetArgBlob(amf_size index, amf_size dataSize, const void* pData) = 0; + + virtual AMF_RESULT AMF_STD_CALL GetCompileWorkgroupSize(amf_size workgroupSize3) = 0; + + virtual AMF_RESULT AMF_STD_CALL Enqueue(amf_size dimension, amf_size globalOffset3, amf_size globalSize3, amf_size localSize3) = 0; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFComputeKernel> AMFComputeKernelPtr; +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFComputeKernel, 0x94815701, 0x6c84, 0x4ba6, 0xa9, 0xfe, 0xe9, 0xad, 0x40, 0xf8, 0x8, 0x8) + typedef struct AMFComputeKernel AMFComputeKernel; + + typedef struct AMFComputeKernelVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFComputeKernel* pThis); + amf_long (AMF_STD_CALL *Release)(AMFComputeKernel* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFComputeKernel* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFComputeKernel interface + + } AMFComputeKernelVtbl; + + struct AMFComputeKernel + { + const AMFComputeKernelVtbl *pVtbl; + }; + +#endif //#if defined(__cplusplus) + + //---------------------------------------------------------------------------------------------- + // AMFComputeSyncPoint interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFComputeSyncPoint : public AMFInterface + { + public: + AMF_DECLARE_IID(0x66f33fe6, 0xaae, 0x4e65, 0xba, 0x3, 0xea, 0x8b, 0xa3, 0x60, 0x11, 0x2) + + virtual amf_bool AMF_STD_CALL IsCompleted() = 0; + virtual void AMF_STD_CALL Wait() = 0; + }; + typedef AMFInterfacePtr_T<AMFComputeSyncPoint> AMFComputeSyncPointPtr; +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFComputeSyncPoint, 0x66f33fe6, 0xaae, 0x4e65, 0xba, 0x3, 0xea, 0x8b, 0xa3, 0x60, 0x11, 0x2) + typedef struct AMFComputeSyncPoint AMFComputeSyncPoint; + + typedef struct AMFComputeSyncPointVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFComputeSyncPoint* pThis); + amf_long (AMF_STD_CALL *Release)(AMFComputeSyncPoint* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFComputeSyncPoint* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFComputeSyncPoint interface + amf_bool (AMF_STD_CALL *IsCompleted)(AMFComputeSyncPoint* pThis); + void (AMF_STD_CALL *Wait)(AMFComputeSyncPoint* pThis); + + } AMFComputeSyncPointVtbl; + + struct AMFComputeSyncPoint + { + const AMFComputeSyncPointVtbl *pVtbl; + }; + +#endif // #if defined(__cplusplus) + + //---------------------------------------------------------------------------------------------- + // AMFCompute interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFCompute : public AMFInterface + { + public: + AMF_DECLARE_IID(0x3846233a, 0x3f43, 0x443f, 0x8a, 0x45, 0x75, 0x22, 0x11, 0xa9, 0xfb, 0xd5) + + virtual AMF_MEMORY_TYPE AMF_STD_CALL GetMemoryType() = 0; + + virtual void* AMF_STD_CALL GetNativeContext() = 0; + virtual void* AMF_STD_CALL GetNativeDeviceID() = 0; + virtual void* AMF_STD_CALL GetNativeCommandQueue() = 0; + + virtual AMF_RESULT AMF_STD_CALL GetKernel(AMF_KERNEL_ID kernelID, AMFComputeKernel** kernel) = 0; + + virtual AMF_RESULT AMF_STD_CALL PutSyncPoint(AMFComputeSyncPoint** ppSyncPoint) = 0; + virtual AMF_RESULT AMF_STD_CALL FinishQueue() = 0; + virtual AMF_RESULT AMF_STD_CALL FlushQueue() = 0; + + virtual AMF_RESULT AMF_STD_CALL FillPlane(AMFPlane *pPlane, const amf_size origin3, const amf_size region3, const void* pColor) = 0; + virtual AMF_RESULT AMF_STD_CALL FillBuffer(AMFBuffer* pBuffer, amf_size dstOffset, amf_size dstSize, const void* pSourcePattern, amf_size patternSize) = 0; + virtual AMF_RESULT AMF_STD_CALL ConvertPlaneToBuffer(AMFPlane *pSrcPlane, AMFBuffer** ppDstBuffer) = 0; + + virtual AMF_RESULT AMF_STD_CALL CopyBuffer(AMFBuffer* pSrcBuffer, amf_size srcOffset, amf_size size, AMFBuffer* pDstBuffer, amf_size dstOffset) = 0; + virtual AMF_RESULT AMF_STD_CALL CopyPlane(AMFPlane *pSrcPlane, const amf_size srcOrigin3, const amf_size region3, AMFPlane *pDstPlane, const amf_size dstOrigin3) = 0; + + virtual AMF_RESULT AMF_STD_CALL CopyBufferToHost(AMFBuffer* pSrcBuffer, amf_size srcOffset, amf_size size, void* pDest, amf_bool blocking) = 0; + virtual AMF_RESULT AMF_STD_CALL CopyBufferFromHost(const void* pSource, amf_size size, AMFBuffer* pDstBuffer, amf_size dstOffsetInBytes, amf_bool blocking) = 0; + + virtual AMF_RESULT AMF_STD_CALL CopyPlaneToHost(AMFPlane *pSrcPlane, const amf_size origin3, const amf_size region3, void* pDest, amf_size dstPitch, amf_bool blocking) = 0; + virtual AMF_RESULT AMF_STD_CALL CopyPlaneFromHost(void* pSource, const amf_size origin3, const amf_size region3, amf_size srcPitch, AMFPlane *pDstPlane, amf_bool blocking) = 0; + + virtual AMF_RESULT AMF_STD_CALL ConvertPlaneToPlane(AMFPlane* pSrcPlane, AMFPlane** ppDstPlane, AMF_CHANNEL_ORDER order, AMF_CHANNEL_TYPE type) = 0; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFCompute> AMFComputePtr; +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFCompute, 0x3846233a, 0x3f43, 0x443f, 0x8a, 0x45, 0x75, 0x22, 0x11, 0xa9, 0xfb, 0xd5) + typedef struct AMFCompute AMFCompute; + + typedef struct AMFComputeVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFCompute* pThis); + amf_long (AMF_STD_CALL *Release)(AMFCompute* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFCompute* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFCompute interface + AMF_MEMORY_TYPE (AMF_STD_CALL *GetMemoryType)(AMFCompute* pThis); + void* (AMF_STD_CALL *GetNativeContext)(AMFCompute* pThis); + void* (AMF_STD_CALL *GetNativeDeviceID)(AMFCompute* pThis); + void* (AMF_STD_CALL *GetNativeCommandQueue)(AMFCompute* pThis); + AMF_RESULT (AMF_STD_CALL *GetKernel)(AMFCompute* pThis, AMF_KERNEL_ID kernelID, AMFComputeKernel** kernel); + AMF_RESULT (AMF_STD_CALL *PutSyncPoint)(AMFCompute* pThis, AMFComputeSyncPoint** ppSyncPoint); + AMF_RESULT (AMF_STD_CALL *FinishQueue)(AMFCompute* pThis); + AMF_RESULT (AMF_STD_CALL *FlushQueue)(AMFCompute* pThis); + AMF_RESULT (AMF_STD_CALL *FillPlane)(AMFCompute* pThis, AMFPlane *pPlane, const amf_size origin3, const amf_size region3, const void* pColor); + AMF_RESULT (AMF_STD_CALL *FillBuffer)(AMFCompute* pThis, AMFBuffer* pBuffer, amf_size dstOffset, amf_size dstSize, const void* pSourcePattern, amf_size patternSize); + AMF_RESULT (AMF_STD_CALL *ConvertPlaneToBuffer)(AMFCompute* pThis, AMFPlane *pSrcPlane, AMFBuffer** ppDstBuffer); + AMF_RESULT (AMF_STD_CALL *CopyBuffer)(AMFCompute* pThis, AMFBuffer* pSrcBuffer, amf_size srcOffset, amf_size size, AMFBuffer* pDstBuffer, amf_size dstOffset); + AMF_RESULT (AMF_STD_CALL *CopyPlane)(AMFCompute* pThis, AMFPlane *pSrcPlane, const amf_size srcOrigin3, const amf_size region3, AMFPlane *pDstPlane, const amf_size dstOrigin3); + AMF_RESULT (AMF_STD_CALL *CopyBufferToHost)(AMFCompute* pThis, AMFBuffer* pSrcBuffer, amf_size srcOffset, amf_size size, void* pDest, amf_bool blocking); + AMF_RESULT (AMF_STD_CALL *CopyBufferFromHost)(AMFCompute* pThis, const void* pSource, amf_size size, AMFBuffer* pDstBuffer, amf_size dstOffsetInBytes, amf_bool blocking); + AMF_RESULT (AMF_STD_CALL *CopyPlaneToHost)(AMFCompute* pThis, AMFPlane *pSrcPlane, const amf_size origin3, const amf_size region3, void* pDest, amf_size dstPitch, amf_bool blocking); + AMF_RESULT (AMF_STD_CALL *CopyPlaneFromHost)(AMFCompute* pThis, void* pSource, const amf_size origin3, const amf_size region3, amf_size srcPitch, AMFPlane *pDstPlane, amf_bool blocking); + AMF_RESULT (AMF_STD_CALL *ConvertPlaneToPlane)(AMFCompute* pThis, AMFPlane* pSrcPlane, AMFPlane** ppDstPlane, AMF_CHANNEL_ORDER order, AMF_CHANNEL_TYPE type); + } AMFComputeVtbl; + + struct AMFCompute + { + const AMFComputeVtbl *pVtbl; + }; + +#endif // #if defined(__cplusplus) + + //---------------------------------------------------------------------------------------------- + // AMFPrograms interface - singleton + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFPrograms + { + public: + virtual AMF_RESULT AMF_STD_CALL RegisterKernelSourceFile(AMF_KERNEL_ID* pKernelID, const wchar_t* kernelid_name, const char* kernelName, const wchar_t* filepath, const char* options) = 0; + virtual AMF_RESULT AMF_STD_CALL RegisterKernelSource(AMF_KERNEL_ID* pKernelID, const wchar_t* kernelid_name, const char* kernelName, amf_size dataSize, const amf_uint8* data, const char* options) = 0; + virtual AMF_RESULT AMF_STD_CALL RegisterKernelBinary(AMF_KERNEL_ID* pKernelID, const wchar_t* kernelid_name, const char* kernelName, amf_size dataSize, const amf_uint8* data, const char* options) = 0; + virtual AMF_RESULT AMF_STD_CALL RegisterKernelSource1(AMF_MEMORY_TYPE eMemoryType, AMF_KERNEL_ID* pKernelID, const wchar_t* kernelid_name, const char* kernelName, amf_size dataSize, const amf_uint8* data, const char* options) = 0; + virtual AMF_RESULT AMF_STD_CALL RegisterKernelBinary1(AMF_MEMORY_TYPE eMemoryType, AMF_KERNEL_ID* pKernelID, const wchar_t* kernelid_name, const char* kernelName, amf_size dataSize, const amf_uint8* data, const char* options) = 0; + }; +#else // #if defined(__cplusplus) + typedef struct AMFPrograms AMFPrograms; + typedef struct AMFProgramsVtbl + { + AMF_RESULT (AMF_STD_CALL *RegisterKernelSourceFile)(AMFPrograms* pThis, AMF_KERNEL_ID* pKernelID, const wchar_t* kernelid_name, const char* kernelName, const wchar_t* filepath, const char* options); + AMF_RESULT (AMF_STD_CALL *RegisterKernelSource)(AMFPrograms* pThis, AMF_KERNEL_ID* pKernelID, const wchar_t* kernelid_name, const char* kernelName, amf_size dataSize, const amf_uint8* data, const char* options); + AMF_RESULT (AMF_STD_CALL *RegisterKernelBinary)(AMFPrograms* pThis, AMF_KERNEL_ID* pKernelID, const wchar_t* kernelid_name, const char* kernelName, amf_size dataSize, const amf_uint8* data, const char* options); + AMF_RESULT (AMF_STD_CALL *RegisterKernelSource1)(AMFPrograms* pThis, AMF_MEMORY_TYPE eMemoryType, AMF_KERNEL_ID* pKernelID, const wchar_t* kernelid_name, const char* kernelName, amf_size dataSize, const amf_uint8* data, const char* options); + AMF_RESULT (AMF_STD_CALL *RegisterKernelBinary1)(AMFPrograms* pThis, AMF_MEMORY_TYPE eMemoryType, AMF_KERNEL_ID* pKernelID, const wchar_t* kernelid_name, const char* kernelName, amf_size dataSize, const amf_uint8* data, const char* options); + } AMFProgramsVtbl; + + struct AMFPrograms + { + const AMFProgramsVtbl *pVtbl; + }; +#endif // #if defined(__cplusplus) + + +#if defined(__cplusplus) +} // namespace amf +#endif + +#endif // AMF_Compute_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/ComputeFactory.h
Added
@@ -0,0 +1,147 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_ComputeFactory_h +#define AMF_ComputeFactory_h +#pragma once + +#include "Compute.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif +// compute device audio capabilities accessed via GetProperties() from AMFComputeDevice +#define AMF_DEVICE_NAME L"DeviceName" // char*, string, device name +#define AMF_DRIVER_VERSION_NAME L"DriverVersion" // char*, string, driver version +#define AMF_AUDIO_CONVOLUTION_MAX_STREAMS L"ConvolutionMaxStreams" // amf_int64, maximum number of audio streams supported in realtime +#define AMF_AUDIO_CONVOLUTION_LENGTH L"ConvolutionLength" // amf_int64, length of convolution in samples +#define AMF_AUDIO_CONVOLUTION_BUFFER_SIZE L"ConvolutionBufferSize" // amf_int64, buffer size in samples +#define AMF_AUDIO_CONVOLUTION_SAMPLE_RATE L"ConvolutionSampleRate" // amf_int64, sample rate + +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFComputeDevice : public AMFPropertyStorage + { + public: + AMF_DECLARE_IID(0xb79d7cf6, 0x2c5c, 0x4deb, 0xb8, 0x96, 0xa2, 0x9e, 0xbe, 0xa6, 0xe3, 0x97) + + virtual void* AMF_STD_CALL GetNativePlatform() = 0; + virtual void* AMF_STD_CALL GetNativeDeviceID() = 0; + virtual void* AMF_STD_CALL GetNativeContext() = 0; + + virtual AMF_RESULT AMF_STD_CALL CreateCompute(void *reserved, AMFCompute **ppCompute) = 0; + virtual AMF_RESULT AMF_STD_CALL CreateComputeEx(void* pCommandQueue, AMFCompute **ppCompute) = 0; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFComputeDevice> AMFComputeDevicePtr; +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFComputeDevice, 0xb79d7cf6, 0x2c5c, 0x4deb, 0xb8, 0x96, 0xa2, 0x9e, 0xbe, 0xa6, 0xe3, 0x97) + typedef struct AMFComputeDevice AMFComputeDevice; + + typedef struct AMFComputeDeviceVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFComputeDevice* pThis); + amf_long (AMF_STD_CALL *Release)(AMFComputeDevice* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFComputeDevice* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFPropertyStorage interface + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFComputeDevice* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFComputeDevice* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFComputeDevice* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFComputeDevice* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFComputeDevice* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFComputeDevice* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFComputeDevice* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFComputeDevice* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFComputeDevice* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFComputeDevice* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFComputeDevice interface + void* (AMF_STD_CALL *GetNativePlatform)(AMFComputeDevice* pThis); + void* (AMF_STD_CALL *GetNativeDeviceID)(AMFComputeDevice* pThis); + void* (AMF_STD_CALL *GetNativeContext)(AMFComputeDevice* pThis); + + AMF_RESULT (AMF_STD_CALL *CreateCompute)(AMFComputeDevice* pThis, void *reserved, AMFCompute **ppCompute); + AMF_RESULT (AMF_STD_CALL *CreateComputeEx)(AMFComputeDevice* pThis, void* pCommandQueue, AMFCompute **ppCompute); + + } AMFComputeDeviceVtbl; + + struct AMFComputeDevice + { + const AMFComputeDeviceVtbl *pVtbl; + }; +#endif // #if defined(__cplusplus) + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFComputeFactory : public AMFInterface + { + public: + AMF_DECLARE_IID(0xe3c24bd7, 0x2d83, 0x416c, 0x8c, 0x4e, 0xfd, 0x13, 0xca, 0x86, 0xf4, 0xd0) + + virtual amf_int32 AMF_STD_CALL GetDeviceCount() = 0; + virtual AMF_RESULT AMF_STD_CALL GetDeviceAt(amf_int32 index, AMFComputeDevice **ppDevice) = 0; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFComputeFactory> AMFComputeFactoryPtr; +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFComputeFactory, 0xe3c24bd7, 0x2d83, 0x416c, 0x8c, 0x4e, 0xfd, 0x13, 0xca, 0x86, 0xf4, 0xd0) + typedef struct AMFComputeFactory AMFComputeFactory; + + typedef struct AMFComputeFactoryVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFComputeFactory* pThis); + amf_long (AMF_STD_CALL *Release)(AMFComputeFactory* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFComputeFactory* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFComputeFactory interface + amf_int32 (AMF_STD_CALL *GetDeviceCount)(AMFComputeFactory* pThis); + AMF_RESULT (AMF_STD_CALL *GetDeviceAt)(AMFComputeFactory* pThis, amf_int32 index, AMFComputeDevice **ppDevice); + } AMFComputeFactoryVtbl; + + struct AMFComputeFactory + { + const AMFComputeFactoryVtbl *pVtbl; + }; +#endif // #if defined(__cplusplus) + + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) +} // namespace amf +#endif + +#endif // AMF_ComputeFactory_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Context.h
Added
@@ -0,0 +1,786 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_Context_h +#define AMF_Context_h +#pragma once + +#include "Buffer.h" +#include "AudioBuffer.h" +#include "Surface.h" +#include "Compute.h" +#include "ComputeFactory.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif + //---------------------------------------------------------------------------------------------- + // AMFContext interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFContext : public AMFPropertyStorage + { + public: + AMF_DECLARE_IID(0xa76a13f0, 0xd80e, 0x4fcc, 0xb5, 0x8, 0x65, 0xd0, 0xb5, 0x2e, 0xd9, 0xee) + + // Cleanup + virtual AMF_RESULT AMF_STD_CALL Terminate() = 0; + + // DX9 + virtual AMF_RESULT AMF_STD_CALL InitDX9(void* pDX9Device) = 0; + virtual void* AMF_STD_CALL GetDX9Device(AMF_DX_VERSION dxVersionRequired = AMF_DX9) = 0; + virtual AMF_RESULT AMF_STD_CALL LockDX9() = 0; + virtual AMF_RESULT AMF_STD_CALL UnlockDX9() = 0; + class AMFDX9Locker; + + // DX11 + virtual AMF_RESULT AMF_STD_CALL InitDX11(void* pDX11Device, AMF_DX_VERSION dxVersionRequired = AMF_DX11_0) = 0; + virtual void* AMF_STD_CALL GetDX11Device(AMF_DX_VERSION dxVersionRequired = AMF_DX11_0) = 0; + virtual AMF_RESULT AMF_STD_CALL LockDX11() = 0; + virtual AMF_RESULT AMF_STD_CALL UnlockDX11() = 0; + class AMFDX11Locker; + + // OpenCL + virtual AMF_RESULT AMF_STD_CALL InitOpenCL(void* pCommandQueue = NULL) = 0; + virtual void* AMF_STD_CALL GetOpenCLContext() = 0; + virtual void* AMF_STD_CALL GetOpenCLCommandQueue() = 0; + virtual void* AMF_STD_CALL GetOpenCLDeviceID() = 0; + virtual AMF_RESULT AMF_STD_CALL GetOpenCLComputeFactory(AMFComputeFactory **ppFactory) = 0; // advanced compute - multiple queries + virtual AMF_RESULT AMF_STD_CALL InitOpenCLEx(AMFComputeDevice *pDevice) = 0; + virtual AMF_RESULT AMF_STD_CALL LockOpenCL() = 0; + virtual AMF_RESULT AMF_STD_CALL UnlockOpenCL() = 0; + class AMFOpenCLLocker; + + // OpenGL + virtual AMF_RESULT AMF_STD_CALL InitOpenGL(amf_handle hOpenGLContext, amf_handle hWindow, amf_handle hDC) = 0; + virtual amf_handle AMF_STD_CALL GetOpenGLContext() = 0; + virtual amf_handle AMF_STD_CALL GetOpenGLDrawable() = 0; + virtual AMF_RESULT AMF_STD_CALL LockOpenGL() = 0; + virtual AMF_RESULT AMF_STD_CALL UnlockOpenGL() = 0; + class AMFOpenGLLocker; + + // XV - Linux + virtual AMF_RESULT AMF_STD_CALL InitXV(void* pXVDevice) = 0; + virtual void* AMF_STD_CALL GetXVDevice() = 0; + virtual AMF_RESULT AMF_STD_CALL LockXV() = 0; + virtual AMF_RESULT AMF_STD_CALL UnlockXV() = 0; + class AMFXVLocker; + + // Gralloc - Android + virtual AMF_RESULT AMF_STD_CALL InitGralloc(void* pGrallocDevice) = 0; + virtual void* AMF_STD_CALL GetGrallocDevice() = 0; + virtual AMF_RESULT AMF_STD_CALL LockGralloc() = 0; + virtual AMF_RESULT AMF_STD_CALL UnlockGralloc() = 0; + class AMFGrallocLocker; + + // Allocation + virtual AMF_RESULT AMF_STD_CALL AllocBuffer(AMF_MEMORY_TYPE type, amf_size size, AMFBuffer** ppBuffer) = 0; + virtual AMF_RESULT AMF_STD_CALL AllocSurface(AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMFSurface** ppSurface) = 0; + virtual AMF_RESULT AMF_STD_CALL AllocAudioBuffer(AMF_MEMORY_TYPE type, AMF_AUDIO_FORMAT format, amf_int32 samples, amf_int32 sampleRate, amf_int32 channels, + AMFAudioBuffer** ppAudioBuffer) = 0; + + // Wrap existing objects + virtual AMF_RESULT AMF_STD_CALL CreateBufferFromHostNative(void* pHostBuffer, amf_size size, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver) = 0; + virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromHostNative(AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, amf_int32 hPitch, amf_int32 vPitch, void* pData, + AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0; + virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromDX9Native(void* pDX9Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0; + virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromDX11Native(void* pDX11Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0; + virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromOpenGLNative(AMF_SURFACE_FORMAT format, amf_handle hGLTextureID, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0; + virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromGrallocNative(amf_handle hGrallocSurface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0; + virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromOpenCLNative(AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, void** pClPlanes, + AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0; + virtual AMF_RESULT AMF_STD_CALL CreateBufferFromOpenCLNative(void* pCLBuffer, amf_size size, AMFBuffer** ppBuffer) = 0; + + // Access to AMFCompute interface - AMF_MEMORY_OPENCL, AMF_MEMORY_COMPUTE_FOR_DX9, AMF_MEMORY_COMPUTE_FOR_DX11 are currently supported + virtual AMF_RESULT AMF_STD_CALL GetCompute(AMF_MEMORY_TYPE eMemType, AMFCompute** ppCompute) = 0; + }; + + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFContext> AMFContextPtr; + + //---------------------------------------------------------------------------------------------- + // AMFContext1 interface + //---------------------------------------------------------------------------------------------- + + class AMF_NO_VTABLE AMFContext1 : public AMFContext + { + public: + AMF_DECLARE_IID(0xd9e9f868, 0x6220, 0x44c6, 0xa2, 0x2f, 0x7c, 0xd6, 0xda, 0xc6, 0x86, 0x46) + + virtual AMF_RESULT AMF_STD_CALL CreateBufferFromDX11Native(void* pHostBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver) = 0; + + virtual AMF_RESULT AMF_STD_CALL AllocBufferEx(AMF_MEMORY_TYPE type, amf_size size, AMF_BUFFER_USAGE usage, AMF_MEMORY_CPU_ACCESS access, AMFBuffer** ppBuffer) = 0; + virtual AMF_RESULT AMF_STD_CALL AllocSurfaceEx(AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMF_SURFACE_USAGE usage, AMF_MEMORY_CPU_ACCESS access, AMFSurface** ppSurface) = 0; + + // Vulkan - Windows, Linux + virtual AMF_RESULT AMF_STD_CALL InitVulkan(void* pVulkanDevice) = 0; + virtual void* AMF_STD_CALL GetVulkanDevice() = 0; + virtual AMF_RESULT AMF_STD_CALL LockVulkan() = 0; + virtual AMF_RESULT AMF_STD_CALL UnlockVulkan() = 0; + + virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromVulkanNative(void* pVulkanImage, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0; + virtual AMF_RESULT AMF_STD_CALL CreateBufferFromVulkanNative(void* pVulkanBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver) = 0; + virtual AMF_RESULT AMF_STD_CALL GetVulkanDeviceExtensions(amf_size *pCount, const char **ppExtensions) = 0; + + + class AMFVulkanLocker; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFContext1> AMFContext1Ptr; + + class AMF_NO_VTABLE AMFContext2 : public AMFContext1 + { + public: + AMF_DECLARE_IID(0x726241d3, 0xbd46, 0x4e90, 0x99, 0x68, 0x93, 0xe0, 0x7e, 0xa2, 0x98, 0x4d) + + // DX12 + virtual AMF_RESULT AMF_STD_CALL InitDX12(void* pDX11Device, AMF_DX_VERSION dxVersionRequired = AMF_DX12) = 0; + virtual void* AMF_STD_CALL GetDX12Device(AMF_DX_VERSION dxVersionRequired = AMF_DX12) = 0; + virtual AMF_RESULT AMF_STD_CALL LockDX12() = 0; + virtual AMF_RESULT AMF_STD_CALL UnlockDX12() = 0; + virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromDX12Native(void* pResourceTexture, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0; + virtual AMF_RESULT AMF_STD_CALL CreateBufferFromDX12Native(void* pResourceBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver) = 0; + + class AMFDX12Locker; + }; + typedef AMFInterfacePtr_T<AMFContext2> AMFContext2Ptr; +#else + typedef struct AMFContext AMFContext; + AMF_DECLARE_IID(AMFContext, 0xa76a13f0, 0xd80e, 0x4fcc, 0xb5, 0x8, 0x65, 0xd0, 0xb5, 0x2e, 0xd9, 0xee) + + typedef struct AMFContextVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFContext* pThis); + amf_long (AMF_STD_CALL *Release)(AMFContext* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFContext* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFInterface AMFPropertyStorage + + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFContext* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFContext* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFContext* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFContext* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFContext* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFContext* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFContext* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFContext* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFContext* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFContext* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFContext interface + + // Cleanup + AMF_RESULT (AMF_STD_CALL *Terminate)(AMFContext* pThis); + + // DX9 + AMF_RESULT (AMF_STD_CALL *InitDX9)(AMFContext* pThis, void* pDX9Device); + void* (AMF_STD_CALL *GetDX9Device)(AMFContext* pThis, AMF_DX_VERSION dxVersionRequired); + AMF_RESULT (AMF_STD_CALL *LockDX9)(AMFContext* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockDX9)(AMFContext* pThis); + // DX11 + AMF_RESULT (AMF_STD_CALL *InitDX11)(AMFContext* pThis, void* pDX11Device, AMF_DX_VERSION dxVersionRequired); + void* (AMF_STD_CALL *GetDX11Device)(AMFContext* pThis, AMF_DX_VERSION dxVersionRequired); + AMF_RESULT (AMF_STD_CALL *LockDX11)(AMFContext* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockDX11)(AMFContext* pThis); + + // OpenCL + AMF_RESULT (AMF_STD_CALL *InitOpenCL)(AMFContext* pThis, void* pCommandQueue); + void* (AMF_STD_CALL *GetOpenCLContext)(AMFContext* pThis); + void* (AMF_STD_CALL *GetOpenCLCommandQueue)(AMFContext* pThis); + void* (AMF_STD_CALL *GetOpenCLDeviceID)(AMFContext* pThis); + AMF_RESULT (AMF_STD_CALL *GetOpenCLComputeFactory)(AMFContext* pThis, AMFComputeFactory **ppFactory); // advanced compute - multiple queries + AMF_RESULT (AMF_STD_CALL *InitOpenCLEx)(AMFContext* pThis, AMFComputeDevice *pDevice); + AMF_RESULT (AMF_STD_CALL *LockOpenCL)(AMFContext* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockOpenCL)(AMFContext* pThis); + + // OpenGL + AMF_RESULT (AMF_STD_CALL *InitOpenGL)(AMFContext* pThis, amf_handle hOpenGLContext, amf_handle hWindow, amf_handle hDC); + amf_handle (AMF_STD_CALL *GetOpenGLContext)(AMFContext* pThis); + amf_handle (AMF_STD_CALL *GetOpenGLDrawable)(AMFContext* pThis); + AMF_RESULT (AMF_STD_CALL *LockOpenGL)(AMFContext* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockOpenGL)(AMFContext* pThis); + // XV - Linux + AMF_RESULT (AMF_STD_CALL *InitXV)(AMFContext* pThis, void* pXVDevice); + void* (AMF_STD_CALL *GetXVDevice)(AMFContext* pThis); + AMF_RESULT (AMF_STD_CALL *LockXV)(AMFContext* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockXV)(AMFContext* pThis); + + // Gralloc - Android + AMF_RESULT (AMF_STD_CALL *InitGralloc)(AMFContext* pThis, void* pGrallocDevice); + void* (AMF_STD_CALL *GetGrallocDevice)(AMFContext* pThis); + AMF_RESULT (AMF_STD_CALL *LockGralloc)(AMFContext* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockGralloc)(AMFContext* pThis); + // Allocation + AMF_RESULT (AMF_STD_CALL *AllocBuffer)(AMFContext* pThis, AMF_MEMORY_TYPE type, amf_size size, AMFBuffer** ppBuffer); + AMF_RESULT (AMF_STD_CALL *AllocSurface)(AMFContext* pThis, AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMFSurface** ppSurface); + AMF_RESULT (AMF_STD_CALL *AllocAudioBuffer)(AMFContext* pThis, AMF_MEMORY_TYPE type, AMF_AUDIO_FORMAT format, amf_int32 samples, amf_int32 sampleRate, amf_int32 channels, + AMFAudioBuffer** ppAudioBuffer); + + // Wrap existing objects + AMF_RESULT (AMF_STD_CALL *CreateBufferFromHostNative)(AMFContext* pThis, void* pHostBuffer, amf_size size, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromHostNative)(AMFContext* pThis, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, amf_int32 hPitch, amf_int32 vPitch, void* pData, + AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX9Native)(AMFContext* pThis, void* pDX9Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX11Native)(AMFContext* pThis, void* pDX11Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromOpenGLNative)(AMFContext* pThis, AMF_SURFACE_FORMAT format, amf_handle hGLTextureID, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromGrallocNative)(AMFContext* pThis, amf_handle hGrallocSurface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromOpenCLNative)(AMFContext* pThis, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, void** pClPlanes, + AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateBufferFromOpenCLNative)(AMFContext* pThis, void* pCLBuffer, amf_size size, AMFBuffer** ppBuffer); + + // Access to AMFCompute interface - AMF_MEMORY_OPENCL, AMF_MEMORY_COMPUTE_FOR_DX9, AMF_MEMORY_COMPUTE_FOR_DX11 are currently supported + AMF_RESULT (AMF_STD_CALL *GetCompute)(AMFContext* pThis, AMF_MEMORY_TYPE eMemType, AMFCompute** ppCompute); + + } AMFContextVtbl; + + struct AMFContext + { + const AMFContextVtbl *pVtbl; + }; + + + typedef struct AMFContext1 AMFContext1; + AMF_DECLARE_IID(AMFContext1, 0xd9e9f868, 0x6220, 0x44c6, 0xa2, 0x2f, 0x7c, 0xd6, 0xda, 0xc6, 0x86, 0x46) + + typedef struct AMFContext1Vtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFContext1* pThis); + amf_long (AMF_STD_CALL *Release)(AMFContext1* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFContext1* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFInterface AMFPropertyStorage + + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFContext1* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFContext1* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFContext1* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFContext1* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFContext1* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFContext1* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFContext1* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFContext1* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFContext interface + + // Cleanup + AMF_RESULT (AMF_STD_CALL *Terminate)(AMFContext1* pThis); + + // DX9 + AMF_RESULT (AMF_STD_CALL *InitDX9)(AMFContext1* pThis, void* pDX9Device); + void* (AMF_STD_CALL *GetDX9Device)(AMFContext1* pThis, AMF_DX_VERSION dxVersionRequired); + AMF_RESULT (AMF_STD_CALL *LockDX9)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockDX9)(AMFContext1* pThis); + // DX11 + AMF_RESULT (AMF_STD_CALL *InitDX11)(AMFContext1* pThis, void* pDX11Device, AMF_DX_VERSION dxVersionRequired); + void* (AMF_STD_CALL *GetDX11Device)(AMFContext1* pThis, AMF_DX_VERSION dxVersionRequired); + AMF_RESULT (AMF_STD_CALL *LockDX11)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockDX11)(AMFContext1* pThis); + + // OpenCL + AMF_RESULT (AMF_STD_CALL *InitOpenCL)(AMFContext1* pThis, void* pCommandQueue); + void* (AMF_STD_CALL *GetOpenCLContext)(AMFContext1* pThis); + void* (AMF_STD_CALL *GetOpenCLCommandQueue)(AMFContext1* pThis); + void* (AMF_STD_CALL *GetOpenCLDeviceID)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *GetOpenCLComputeFactory)(AMFContext1* pThis, AMFComputeFactory **ppFactory); // advanced compute - multiple queries + AMF_RESULT (AMF_STD_CALL *InitOpenCLEx)(AMFContext1* pThis, AMFComputeDevice *pDevice); + AMF_RESULT (AMF_STD_CALL *LockOpenCL)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockOpenCL)(AMFContext1* pThis); + + // OpenGL + AMF_RESULT (AMF_STD_CALL *InitOpenGL)(AMFContext1* pThis, amf_handle hOpenGLContext, amf_handle hWindow, amf_handle hDC); + amf_handle (AMF_STD_CALL *GetOpenGLContext)(AMFContext1* pThis); + amf_handle (AMF_STD_CALL *GetOpenGLDrawable)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *LockOpenGL)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockOpenGL)(AMFContext1* pThis); + // XV - Linux + AMF_RESULT (AMF_STD_CALL *InitXV)(AMFContext1* pThis, void* pXVDevice); + void* (AMF_STD_CALL *GetXVDevice)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *LockXV)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockXV)(AMFContext1* pThis); + + // Gralloc - Android + AMF_RESULT (AMF_STD_CALL *InitGralloc)(AMFContext1* pThis, void* pGrallocDevice); + void* (AMF_STD_CALL *GetGrallocDevice)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *LockGralloc)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockGralloc)(AMFContext1* pThis); + // Allocation + AMF_RESULT (AMF_STD_CALL *AllocBuffer)(AMFContext1* pThis, AMF_MEMORY_TYPE type, amf_size size, AMFBuffer** ppBuffer); + AMF_RESULT (AMF_STD_CALL *AllocSurface)(AMFContext1* pThis, AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMFSurface** ppSurface); + AMF_RESULT (AMF_STD_CALL *AllocAudioBuffer)(AMFContext1* pThis, AMF_MEMORY_TYPE type, AMF_AUDIO_FORMAT format, amf_int32 samples, amf_int32 sampleRate, amf_int32 channels, + AMFAudioBuffer** ppAudioBuffer); + + // Wrap existing objects + AMF_RESULT (AMF_STD_CALL *CreateBufferFromHostNative)(AMFContext1* pThis, void* pHostBuffer, amf_size size, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromHostNative)(AMFContext1* pThis, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, amf_int32 hPitch, amf_int32 vPitch, void* pData, + AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX9Native)(AMFContext1* pThis, void* pDX9Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX11Native)(AMFContext1* pThis, void* pDX11Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromOpenGLNative)(AMFContext1* pThis, AMF_SURFACE_FORMAT format, amf_handle hGLTextureID, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromGrallocNative)(AMFContext1* pThis, amf_handle hGrallocSurface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromOpenCLNative)(AMFContext1* pThis, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, void** pClPlanes, + AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateBufferFromOpenCLNative)(AMFContext1* pThis, void* pCLBuffer, amf_size size, AMFBuffer** ppBuffer); + + // Access to AMFCompute interface - AMF_MEMORY_OPENCL, AMF_MEMORY_COMPUTE_FOR_DX9, AMF_MEMORY_COMPUTE_FOR_DX11 are currently supported + AMF_RESULT (AMF_STD_CALL *GetCompute)(AMFContext1* pThis, AMF_MEMORY_TYPE eMemType, AMFCompute** ppCompute); + + // AMFContext1 interface + + AMF_RESULT (AMF_STD_CALL *CreateBufferFromDX11Native)(AMFContext1* pThis, void* pHostBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *AllocBufferEx)(AMFContext1* pThis, AMF_MEMORY_TYPE type, amf_size size, AMF_BUFFER_USAGE usage, AMF_MEMORY_CPU_ACCESS access, AMFBuffer** ppBuffer); + AMF_RESULT (AMF_STD_CALL *AllocSurfaceEx)(AMFContext1* pThis, AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMF_SURFACE_USAGE usage, AMF_MEMORY_CPU_ACCESS access, AMFSurface** ppSurface); + + // Vulkan - Windows, Linux + AMF_RESULT (AMF_STD_CALL *InitVulkan)(AMFContext1* pThis, void* pVulkanDevice); + void* (AMF_STD_CALL *GetVulkanDevice)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *LockVulkan)(AMFContext1* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockVulkan)(AMFContext1* pThis); + + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromVulkanNative)(AMFContext1* pThis, void* pVulkanImage, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateBufferFromVulkanNative)(AMFContext1* pThis, void* pVulkanBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *GetVulkanDeviceExtensions)(AMFContext1* pThis, amf_size *pCount, const char **ppExtensions); + + } AMFContext1Vtbl; + + struct AMFContext1 + { + const AMFContext1Vtbl *pVtbl; + }; + + typedef struct AMFContext2 AMFContext2; + AMF_DECLARE_IID(AMFContext2, 0xd9e9f868, 0x6220, 0x44c6, 0xa2, 0x2f, 0x7c, 0xd6, 0xda, 0xc6, 0x86, 0x46) + + typedef struct AMFContext2Vtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFContext2* pThis); + amf_long (AMF_STD_CALL *Release)(AMFContext2* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFContext2* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFInterface AMFPropertyStorage + + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFContext2* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFContext2* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFContext2* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFContext2* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFContext2* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFContext2* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFContext2* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFContext2* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFContext interface + + // Cleanup + AMF_RESULT (AMF_STD_CALL *Terminate)(AMFContext2* pThis); + + // DX9 + AMF_RESULT (AMF_STD_CALL *InitDX9)(AMFContext2* pThis, void* pDX9Device); + void* (AMF_STD_CALL *GetDX9Device)(AMFContext2* pThis, AMF_DX_VERSION dxVersionRequired); + AMF_RESULT (AMF_STD_CALL *LockDX9)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockDX9)(AMFContext2* pThis); + // DX11 + AMF_RESULT (AMF_STD_CALL *InitDX11)(AMFContext2* pThis, void* pDX11Device, AMF_DX_VERSION dxVersionRequired); + void* (AMF_STD_CALL *GetDX11Device)(AMFContext2* pThis, AMF_DX_VERSION dxVersionRequired); + AMF_RESULT (AMF_STD_CALL *LockDX11)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockDX11)(AMFContext2* pThis); + + // OpenCL + AMF_RESULT (AMF_STD_CALL *InitOpenCL)(AMFContext2* pThis, void* pCommandQueue); + void* (AMF_STD_CALL *GetOpenCLContext)(AMFContext2* pThis); + void* (AMF_STD_CALL *GetOpenCLCommandQueue)(AMFContext2* pThis); + void* (AMF_STD_CALL *GetOpenCLDeviceID)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *GetOpenCLComputeFactory)(AMFContext2* pThis, AMFComputeFactory **ppFactory); // advanced compute - multiple queries + AMF_RESULT (AMF_STD_CALL *InitOpenCLEx)(AMFContext2* pThis, AMFComputeDevice *pDevice); + AMF_RESULT (AMF_STD_CALL *LockOpenCL)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockOpenCL)(AMFContext2* pThis); + + // OpenGL + AMF_RESULT (AMF_STD_CALL *InitOpenGL)(AMFContext2* pThis, amf_handle hOpenGLContext, amf_handle hWindow, amf_handle hDC); + amf_handle (AMF_STD_CALL *GetOpenGLContext)(AMFContext2* pThis); + amf_handle (AMF_STD_CALL *GetOpenGLDrawable)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *LockOpenGL)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockOpenGL)(AMFContext2* pThis); + // XV - Linux + AMF_RESULT (AMF_STD_CALL *InitXV)(AMFContext2* pThis, void* pXVDevice); + void* (AMF_STD_CALL *GetXVDevice)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *LockXV)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockXV)(AMFContext2* pThis); + + // Gralloc - Android + AMF_RESULT (AMF_STD_CALL *InitGralloc)(AMFContext2* pThis, void* pGrallocDevice); + void* (AMF_STD_CALL *GetGrallocDevice)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *LockGralloc)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockGralloc)(AMFContext2* pThis); + // Allocation + AMF_RESULT (AMF_STD_CALL *AllocBuffer)(AMFContext2* pThis, AMF_MEMORY_TYPE type, amf_size size, AMFBuffer** ppBuffer); + AMF_RESULT (AMF_STD_CALL *AllocSurface)(AMFContext2* pThis, AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMFSurface** ppSurface); + AMF_RESULT (AMF_STD_CALL *AllocAudioBuffer)(AMFContext2* pThis, AMF_MEMORY_TYPE type, AMF_AUDIO_FORMAT format, amf_int32 samples, amf_int32 sampleRate, amf_int32 channels, AMFAudioBuffer** ppAudioBuffer); + + // Wrap existing objects + AMF_RESULT (AMF_STD_CALL *CreateBufferFromHostNative)(AMFContext2* pThis, void* pHostBuffer, amf_size size, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromHostNative)(AMFContext2* pThis, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, amf_int32 hPitch, amf_int32 vPitch, void* pData,AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX9Native)(AMFContext2* pThis, void* pDX9Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX11Native)(AMFContext2* pThis, void* pDX11Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromOpenGLNative)(AMFContext2* pThis, AMF_SURFACE_FORMAT format, amf_handle hGLTextureID, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromGrallocNative)(AMFContext2* pThis, amf_handle hGrallocSurface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromOpenCLNative)(AMFContext2* pThis, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, void** pClPlanes, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateBufferFromOpenCLNative)(AMFContext2* pThis, void* pCLBuffer, amf_size size, AMFBuffer** ppBuffer); + + // Access to AMFCompute interface - AMF_MEMORY_OPENCL, AMF_MEMORY_COMPUTE_FOR_DX9, AMF_MEMORY_COMPUTE_FOR_DX11 are currently supported + AMF_RESULT (AMF_STD_CALL *GetCompute)(AMFContext2* pThis, AMF_MEMORY_TYPE eMemType, AMFCompute** ppCompute); + + // AMFContext1 interface + + AMF_RESULT (AMF_STD_CALL *CreateBufferFromDX11Native)(AMFContext2* pThis, void* pHostBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *AllocBufferEx)(AMFContext2* pThis, AMF_MEMORY_TYPE type, amf_size size, AMF_BUFFER_USAGE usage, AMF_MEMORY_CPU_ACCESS access, AMFBuffer** ppBuffer); + AMF_RESULT (AMF_STD_CALL *AllocSurfaceEx)(AMFContext2* pThis, AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMF_SURFACE_USAGE usage, AMF_MEMORY_CPU_ACCESS access, AMFSurface** ppSurface); + + // Vulkan - Windows, Linux + AMF_RESULT (AMF_STD_CALL *InitVulkan)(AMFContext2* pThis, void* pVulkanDevice); + void* (AMF_STD_CALL *GetVulkanDevice)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *LockVulkan)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockVulkan)(AMFContext2* pThis); + + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromVulkanNative)(AMFContext2* pThis, void* pVulkanImage, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateBufferFromVulkanNative)(AMFContext2* pThis, void* pVulkanBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *GetVulkanDeviceExtensions)(AMFContext2* pThis, amf_size *pCount, const char **ppExtensions); + + // AMFContext2 interface + AMF_RESULT (AMF_STD_CALL *InitDX12)(AMFContext2* pThis, void* pDX11Device, AMF_DX_VERSION dxVersionRequired); + void* (AMF_STD_CALL *GetDX12Device)(AMFContext2* pThis, AMF_DX_VERSION dxVersionRequired); + AMF_RESULT (AMF_STD_CALL *LockDX12)(AMFContext2* pThis); + AMF_RESULT (AMF_STD_CALL *UnlockDX12)(AMFContext2* pThis); + + AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX12Native)(AMFContext2* pThis, void* pResourceTexture, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver); + AMF_RESULT (AMF_STD_CALL *CreateBufferFromDX12Native)(AMFContext2* pThis, void* pResourceBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver); + + + } AMFContext2Vtbl; + + struct AMFContext2 + { + const AMFContext2Vtbl *pVtbl; + }; +#endif + +#if defined(__cplusplus) + //---------------------------------------------------------------------------------------------- + // Lockers + //---------------------------------------------------------------------------------------------- + class AMFContext::AMFDX9Locker + { + public: + AMFDX9Locker() : m_Context(NULL) + {} + AMFDX9Locker(AMFContext* resources) : m_Context(NULL) + { + Lock(resources); + } + ~AMFDX9Locker() + { + if(m_Context != NULL) + { + m_Context->UnlockDX9(); + } + } + void Lock(AMFContext* resources) + { + if(m_Context != NULL) + { + m_Context->UnlockDX9(); + } + m_Context = resources; + if(m_Context != NULL) + { + m_Context->LockDX9(); + } + } + protected: + AMFContext* m_Context; + + private: + AMFDX9Locker(const AMFDX9Locker&); + AMFDX9Locker& operator=(const AMFDX9Locker&); + }; + //---------------------------------------------------------------------------------------------- + class AMFContext::AMFDX11Locker + { + public: + AMFDX11Locker() : m_Context(NULL) + {} + AMFDX11Locker(AMFContext* resources) : m_Context(NULL) + { + Lock(resources); + } + ~AMFDX11Locker() + { + if(m_Context != NULL) + { + m_Context->UnlockDX11(); + } + } + void Lock(AMFContext* resources) + { + if(m_Context != NULL) + { + m_Context->UnlockDX11(); + } + m_Context = resources; + if(m_Context != NULL) + { + m_Context->LockDX11(); + } + } + protected: + AMFContext* m_Context; + + private: + AMFDX11Locker(const AMFDX11Locker&); + AMFDX11Locker& operator=(const AMFDX11Locker&); + }; + //---------------------------------------------------------------------------------------------- + class AMFContext::AMFOpenCLLocker + { + public: + AMFOpenCLLocker() : m_Context(NULL) + {} + AMFOpenCLLocker(AMFContext* resources) : m_Context(NULL) + { + Lock(resources); + } + ~AMFOpenCLLocker() + { + if(m_Context != NULL) + { + m_Context->UnlockOpenCL(); + } + } + void Lock(AMFContext* resources) + { + if(m_Context != NULL) + { + m_Context->UnlockOpenCL(); + } + m_Context = resources; + if(m_Context != NULL) + { + m_Context->LockOpenCL(); + } + } + protected: + AMFContext* m_Context; + private: + AMFOpenCLLocker(const AMFOpenCLLocker&); + AMFOpenCLLocker& operator=(const AMFOpenCLLocker&); + }; + //---------------------------------------------------------------------------------------------- + class AMFContext::AMFOpenGLLocker + { + public: + AMFOpenGLLocker(AMFContext* pContext) : m_pContext(pContext), + m_GLLocked(false) + { + if(m_pContext != NULL) + { + if(m_pContext->LockOpenGL() == AMF_OK) + { + m_GLLocked = true; + } + } + } + ~AMFOpenGLLocker() + { + if(m_GLLocked) + { + m_pContext->UnlockOpenGL(); + } + } + private: + AMFContext* m_pContext; + amf_bool m_GLLocked; ///< AMFOpenGLLocker can be called when OpenGL is not initialized yet + ///< in this case don't call UnlockOpenGL + AMFOpenGLLocker(const AMFOpenGLLocker&); + AMFOpenGLLocker& operator=(const AMFOpenGLLocker&); + }; + //---------------------------------------------------------------------------------------------- + class AMFContext::AMFXVLocker + { + public: + AMFXVLocker() : m_pContext(NULL) + {} + AMFXVLocker(AMFContext* pContext) : m_pContext(NULL) + { + Lock(pContext); + } + ~AMFXVLocker() + { + if(m_pContext != NULL) + { + m_pContext->UnlockXV(); + } + } + void Lock(AMFContext* pContext) + { + if((pContext != NULL) && (pContext->GetXVDevice() != NULL)) + { + m_pContext = pContext; + m_pContext->LockXV(); + } + } + protected: + AMFContext* m_pContext; + private: + AMFXVLocker(const AMFXVLocker&); + AMFXVLocker& operator=(const AMFXVLocker&); + }; + //---------------------------------------------------------------------------------------------- + class AMFContext::AMFGrallocLocker + { + public: + AMFGrallocLocker() : m_pContext(NULL) + {} + AMFGrallocLocker(AMFContext* pContext) : m_pContext(NULL) + { + Lock(pContext); + } + ~AMFGrallocLocker() + { + if(m_pContext != NULL) + { + m_pContext->UnlockGralloc(); + } + } + void Lock(AMFContext* pContext) + { + if((pContext != NULL) && (pContext->GetGrallocDevice() != NULL)) + { + m_pContext = pContext; + m_pContext->LockGralloc(); + } + } + protected: + AMFContext* m_pContext; + private: + AMFGrallocLocker(const AMFGrallocLocker&); + AMFGrallocLocker& operator=(const AMFGrallocLocker&); + }; + //---------------------------------------------------------------------------------------------- + class AMFContext1::AMFVulkanLocker + { + public: + AMFVulkanLocker() : m_pContext(NULL) + {} + AMFVulkanLocker(AMFContext1* pContext) : m_pContext(NULL) + { + Lock(pContext); + } + ~AMFVulkanLocker() + { + if(m_pContext != NULL) + { + m_pContext->UnlockVulkan(); + } + } + void Lock(AMFContext1* pContext) + { + if((pContext != NULL) && (pContext->GetVulkanDevice() != NULL)) + { + m_pContext = pContext; + m_pContext->LockVulkan(); + } + } + protected: + AMFContext1* m_pContext; + private: + AMFVulkanLocker(const AMFVulkanLocker&); + AMFVulkanLocker& operator=(const AMFVulkanLocker&); + }; + //---------------------------------------------------------------------------------------------- + class AMFContext2::AMFDX12Locker + { + public: + AMFDX12Locker() : m_Context(NULL) + {} + AMFDX12Locker(AMFContext2* resources) : m_Context(NULL) + { + Lock(resources); + } + ~AMFDX12Locker() + { + if (m_Context != NULL) + { + m_Context->UnlockDX12(); + } + } + void Lock(AMFContext2* resources) + { + if (m_Context != NULL) + { + m_Context->UnlockDX12(); + } + m_Context = resources; + if (m_Context != NULL) + { + m_Context->LockDX12(); + } + } + protected: + AMFContext2* m_Context; + + private: + AMFDX12Locker(const AMFDX12Locker&); + AMFDX12Locker& operator=(const AMFDX12Locker&); + }; + //---------------------------------------------------------------------------------------------- + //---------------------------------------------------------------------------------------------- + //---------------------------------------------------------------------------------------------- +#endif +#if defined(__cplusplus) +} +#endif +enum AMF_CONTEXT_DEVICETYPE_ENUM +{ + AMF_CONTEXT_DEVICE_TYPE_GPU = 0, + AMF_CONTEXT_DEVICE_TYPE_CPU +}; +#define AMF_CONTEXT_DEVICE_TYPE L"AMF_Context_DeviceType" //Value type: amf_int64; Values : AMF_CONTEXT_DEVICE_TYPE_GPU for GPU (default) , AMF_CONTEXT_DEVICE_TYPE_CPU for CPU. +#endif //#ifndef AMF_Context_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/CurrentTime.h
Added
@@ -0,0 +1,52 @@ +// +// Copyright (c) 2017 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_CurrentTime_h +#define AMF_CurrentTime_h + +#include "Platform.h" +#include "Interface.h" + +namespace amf +{ + // Current time interface class. This interface object can be passed + // as a property to components requiring synchronized timing. The + // implementation is: + // - first call to Get() starts time and returns 0 + // - subsequent calls to Get() returns values relative to 0 + // - Reset() puts time back at 0 at next Get() call + // + class AMF_NO_VTABLE AMFCurrentTime : public AMFInterface + { + public: + virtual amf_pts AMF_STD_CALL Get() = 0; + + virtual void AMF_STD_CALL Reset() = 0; + }; + + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFCurrentTime> AMFCurrentTimePtr; + //----------------------------------------------------------------------------------------------} +} +#endif // AMF_CurrentTime_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/D3D12AMF.h
Added
@@ -0,0 +1,44 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef __D3D12AMF_h__ +#define __D3D12AMF_h__ +#pragma once +#include "Platform.h" +#if defined(_WIN32)||(defined(__linux) && defined(AMF_WSL)) +// syncronization properties set via SetPrivateData() +AMF_WEAK GUID AMFResourceStateGUID = { 0x452da9bf, 0x4ad7, 0x47a5, { 0xa6, 0x9b, 0x96, 0xd3, 0x23, 0x76, 0xf2, 0xf3 } }; // Current resource state value (D3D12_RESOURCE_STATES ), sizeof(UINT), set on ID3D12Resource +AMF_WEAK GUID AMFFenceGUID = { 0x910a7928, 0x57bd, 0x4b04, { 0x91, 0xa3, 0xe7, 0xb8, 0x04, 0x12, 0xcd, 0xa5 } }; // IUnknown (ID3D12Fence), set on ID3D12Resource syncronization fence for this resource +AMF_WEAK GUID AMFFenceValueGUID = { 0x62a693d3, 0xbb4a, 0x46c9, { 0xa5, 0x04, 0x9a, 0x8e, 0x97, 0xbf, 0xf0, 0x56 } }; // The last value to wait on the fence from AMFFenceGUID; sizeof(UINT64), set on ID3D12Fence +#endif + +#endif // __D3D12AMF_h__ \ No newline at end of file
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Data.h
Added
@@ -0,0 +1,177 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_Data_h +#define AMF_Data_h +#pragma once + +#include "PropertyStorage.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif + //---------------------------------------------------------------------------------------------- + typedef enum AMF_DATA_TYPE + { + AMF_DATA_BUFFER = 0, + AMF_DATA_SURFACE = 1, + AMF_DATA_AUDIO_BUFFER = 2, + AMF_DATA_USER = 1000, + // all extensions will be AMF_DATA_USER+i + } AMF_DATA_TYPE; + //---------------------------------------------------------------------------------------------- + typedef enum AMF_MEMORY_TYPE + { + AMF_MEMORY_UNKNOWN = 0, + AMF_MEMORY_HOST = 1, + AMF_MEMORY_DX9 = 2, + AMF_MEMORY_DX11 = 3, + AMF_MEMORY_OPENCL = 4, + AMF_MEMORY_OPENGL = 5, + AMF_MEMORY_XV = 6, + AMF_MEMORY_GRALLOC = 7, + AMF_MEMORY_COMPUTE_FOR_DX9 = 8, // deprecated, the same as AMF_MEMORY_OPENCL + AMF_MEMORY_COMPUTE_FOR_DX11 = 9, // deprecated, the same as AMF_MEMORY_OPENCL + AMF_MEMORY_VULKAN = 10, + AMF_MEMORY_DX12 = 11, + } AMF_MEMORY_TYPE; + + //---------------------------------------------------------------------------------------------- + typedef enum AMF_DX_VERSION + { + AMF_DX9 = 90, + AMF_DX9_EX = 91, + AMF_DX11_0 = 110, + AMF_DX11_1 = 111, + AMF_DX12 = 120, + } AMF_DX_VERSION; + + //---------------------------------------------------------------------------------------------- + // AMF_MEMORY_CPU_ACCESS translates to D3D11_CPU_ACCESS_FLAG or VkImageUsageFlags + // bit mask + //---------------------------------------------------------------------------------------------- + typedef enum AMF_MEMORY_CPU_ACCESS_BITS + { // D3D11 D3D12 Vulkan + AMF_MEMORY_CPU_DEFAULT = 0x80000000, // 0 , D3D12_HEAP_TYPE_DEFAULT , VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT + AMF_MEMORY_CPU_NONE = 0x00000000, // 0 , D3D12_HEAP_TYPE_DEFAULT , + AMF_MEMORY_CPU_READ = 0x00000001, // D3D11_CPU_ACCESS_READ , D3D12_HEAP_TYPE_READBACK, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT + AMF_MEMORY_CPU_WRITE = 0x00000002, // D3D11_CPU_ACCESS_WRITE, D3D12_HEAP_TYPE_UPLOAD , VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT + AMF_MEMORY_CPU_LOCAL = 0x00000004, // , D3D12_HEAP_TYPE_DEFAULT , VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT + AMF_MEMORY_CPU_PINNED = 0x00000008, // , , VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR + } AMF_MEMORY_CPU_ACCESS_BITS; + typedef amf_flags AMF_MEMORY_CPU_ACCESS; + //---------------------------------------------------------------------------------------------- + // AMFData interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFData : public AMFPropertyStorage + { + public: + AMF_DECLARE_IID(0xa1159bf6, 0x9104, 0x4107, 0x8e, 0xaa, 0xc5, 0x3d, 0x5d, 0xba, 0xc5, 0x11) + + virtual AMF_MEMORY_TYPE AMF_STD_CALL GetMemoryType() = 0; + + virtual AMF_RESULT AMF_STD_CALL Duplicate(AMF_MEMORY_TYPE type, AMFData** ppData) = 0; + virtual AMF_RESULT AMF_STD_CALL Convert(AMF_MEMORY_TYPE type) = 0; // optimal interop if possilble. Copy through host memory if needed + virtual AMF_RESULT AMF_STD_CALL Interop(AMF_MEMORY_TYPE type) = 0; // only optimal interop if possilble. No copy through host memory for GPU objects + + virtual AMF_DATA_TYPE AMF_STD_CALL GetDataType() = 0; + + virtual amf_bool AMF_STD_CALL IsReusable() = 0; + + virtual void AMF_STD_CALL SetPts(amf_pts pts) = 0; + virtual amf_pts AMF_STD_CALL GetPts() = 0; + virtual void AMF_STD_CALL SetDuration(amf_pts duration) = 0; + virtual amf_pts AMF_STD_CALL GetDuration() = 0; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFData> AMFDataPtr; + //---------------------------------------------------------------------------------------------- + +#else // #if defined(__cplusplus) + typedef struct AMFData AMFData; + AMF_DECLARE_IID(AMFData, 0xa1159bf6, 0x9104, 0x4107, 0x8e, 0xaa, 0xc5, 0x3d, 0x5d, 0xba, 0xc5, 0x11) + + typedef struct AMFDataVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFData* pThis); + amf_long (AMF_STD_CALL *Release)(AMFData* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFData* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFPropertyStorage interface + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFData* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFData* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFData* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFData* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFData* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFData* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFData* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFData* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFData* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFData* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFData interface + + AMF_MEMORY_TYPE (AMF_STD_CALL *GetMemoryType)(AMFData* pThis); + + AMF_RESULT (AMF_STD_CALL *Duplicate)(AMFData* pThis, AMF_MEMORY_TYPE type, AMFData** ppData); + AMF_RESULT (AMF_STD_CALL *Convert)(AMFData* pThis, AMF_MEMORY_TYPE type); // optimal interop if possilble. Copy through host memory if needed + AMF_RESULT (AMF_STD_CALL *Interop)(AMFData* pThis, AMF_MEMORY_TYPE type); // only optimal interop if possilble. No copy through host memory for GPU objects + + AMF_DATA_TYPE (AMF_STD_CALL *GetDataType)(AMFData* pThis); + + amf_bool (AMF_STD_CALL *IsReusable)(AMFData* pThis); + + void (AMF_STD_CALL *SetPts)(AMFData* pThis, amf_pts pts); + amf_pts (AMF_STD_CALL *GetPts)(AMFData* pThis); + void (AMF_STD_CALL *SetDuration)(AMFData* pThis, amf_pts duration); + amf_pts (AMF_STD_CALL *GetDuration)(AMFData* pThis); + + } AMFDataVtbl; + + struct AMFData + { + const AMFDataVtbl *pVtbl; + }; + + +#endif // #if defined(__cplusplus) + +#if defined(__cplusplus) +} // namespace +#endif + +#endif //#ifndef AMF_Data_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Debug.h
Added
@@ -0,0 +1,78 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_Debug_h +#define AMF_Debug_h +#pragma once + +#include "Platform.h" +#include "Result.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif + //---------------------------------------------------------------------------------------------- + // AMFDebug interface - singleton + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFDebug + { + public: + virtual void AMF_STD_CALL EnablePerformanceMonitor(amf_bool enable) = 0; + virtual amf_bool AMF_STD_CALL PerformanceMonitorEnabled() = 0; + virtual void AMF_STD_CALL AssertsEnable(amf_bool enable) = 0; + virtual amf_bool AMF_STD_CALL AssertsEnabled() = 0; + }; +#else // #if defined(__cplusplus) + typedef struct AMFDebug AMFDebug; + typedef struct AMFDebugVtbl + { + // AMFDebug interface + void (AMF_STD_CALL *EnablePerformanceMonitor)(AMFDebug* pThis, amf_bool enable); + amf_bool (AMF_STD_CALL *PerformanceMonitorEnabled)(AMFDebug* pThis); + void (AMF_STD_CALL *AssertsEnable)(AMFDebug* pThis, amf_bool enable); + amf_bool (AMF_STD_CALL *AssertsEnabled)(AMFDebug* pThis); + } AMFDebugVtbl; + + struct AMFDebug + { + const AMFDebugVtbl *pVtbl; + }; + +#endif // #if defined(__cplusplus) + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) +} +#endif + +#endif // AMF_Debug_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Dump.h
Added
@@ -0,0 +1,112 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_Dump_h +#define AMF_Dump_h +#pragma once + +#include "Platform.h" +#include "Result.h" +#include "Interface.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFDump : public AMFInterface + { + public: + AMF_DECLARE_IID(0x75366ad4, 0x504c, 0x430b, 0xbb, 0xe2, 0xad, 0x21, 0x82, 0x8, 0xf, 0x72); + + + virtual const wchar_t* AMF_STD_CALL GetDumpBasePath() const = 0; // Get application dump base path + virtual AMF_RESULT AMF_STD_CALL SetDumpBasePath(const wchar_t* path) = 0; // Set application dump base path + + // Enable/disable input and/or output stream dumps + virtual bool AMF_STD_CALL IsInputDumpEnabled() const = 0; + virtual AMF_RESULT AMF_STD_CALL EnableInputDump(bool enabled) = 0; + virtual const wchar_t* AMF_STD_CALL GetInputDumpFullName() const = 0; // Get full name of dump file + + // Enable/disable input and/or output stream dumps + virtual bool AMF_STD_CALL IsOutputDumpEnabled() const = 0; + virtual AMF_RESULT AMF_STD_CALL EnableOutputDump(bool enabled) = 0; + virtual const wchar_t* AMF_STD_CALL GetOutputDumpFullName() const = 0; // Get full name of dump file + + // When enabled, each new application session will create a subfolder with a time stamp in the base path tree (disabled by default) + virtual bool AMF_STD_CALL IsPerSessionDumpEnabled() const = 0; + virtual void AMF_STD_CALL EnablePerSessionDump(bool enabled) = 0; + }; + typedef AMFInterfacePtr_T<AMFDump> AMFDumpPtr; +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFDump, 0x75366ad4, 0x504c, 0x430b, 0xbb, 0xe2, 0xad, 0x21, 0x82, 0x8, 0xf, 0x72); + typedef struct AMFDump AMFDump; + + typedef struct AMFDumpVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFDump* pThis); + amf_long (AMF_STD_CALL *Release)(AMFDump* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFDump* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFDump interface + const wchar_t* (AMF_STD_CALL *GetDumpBasePath)(AMFDump* pThis) const; // Get application dump base path + AMF_RESULT (AMF_STD_CALL *SetDumpBasePath)(AMFDump* pThis, const wchar_t* path); // Set application dump base path + + // Enable/disable input and/or output stream dumps + bool (AMF_STD_CALL *IsInputDumpEnabled)(AMFDump* pThis) const; + AMF_RESULT (AMF_STD_CALL *EnableInputDump)(AMFDump* pThis, bool enabled); + const wchar_t* (AMF_STD_CALL *GetInputDumpFullName)(AMFDump* pThis) const; // Get full name of dump file + + // Enable/disable input and/or output stream dumps + bool (AMF_STD_CALL *IsOutputDumpEnabled)(AMFDump* pThis) const; + AMF_RESULT (AMF_STD_CALL *EnableOutputDump)(AMFDump* pThis, bool enabled); + const wchar_t* (AMF_STD_CALL *GetOutputDumpFullName)(AMFDump* pThis) const; // Get full name of dump file + + // When enabled, each new application session will create a subfolder with a time stamp in the base path tree (disabled by default) + bool (AMF_STD_CALL *IsPerSessionDumpEnabled)(AMFDump* pThis) const; + void (AMF_STD_CALL *EnablePerSessionDump)(AMFDump* pThis, bool enabled); + + } AMFDumpVtbl; + + struct AMFDump + { + const AMFDumpVtbl *pVtbl; + }; + + +#endif // #if defined(__cplusplus) +#if defined(__cplusplus) +} // namespace +#endif + +#endif //AMF_Dump_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Factory.h
Added
@@ -0,0 +1,133 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_Factory_h +#define AMF_Factory_h +#pragma once + +#include "Platform.h" +#include "Version.h" +#include "Result.h" +#include "Context.h" +#include "Debug.h" +#include "Trace.h" +#include "Compute.h" + +#include "../components/Component.h" + +#if defined(__cplusplus) + +namespace amf +{ +#endif + //---------------------------------------------------------------------------------------------- + // AMFFactory interface - singleton + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFFactory + { + public: + virtual AMF_RESULT AMF_STD_CALL CreateContext(AMFContext** ppContext) = 0; + virtual AMF_RESULT AMF_STD_CALL CreateComponent(AMFContext* pContext, const wchar_t* id, AMFComponent** ppComponent) = 0; + virtual AMF_RESULT AMF_STD_CALL SetCacheFolder(const wchar_t* path) = 0; + virtual const wchar_t* AMF_STD_CALL GetCacheFolder() = 0; + virtual AMF_RESULT AMF_STD_CALL GetDebug(AMFDebug** ppDebug) = 0; + virtual AMF_RESULT AMF_STD_CALL GetTrace(AMFTrace** ppTrace) = 0; + virtual AMF_RESULT AMF_STD_CALL GetPrograms(AMFPrograms** ppPrograms) = 0; + }; +#else + typedef struct AMFFactory AMFFactory; + + typedef struct AMFFactoryVtbl + { + AMF_RESULT (AMF_STD_CALL *CreateContext)(AMFFactory* pThis, AMFContext** ppContext); + AMF_RESULT (AMF_STD_CALL *CreateComponent)(AMFFactory* pThis, AMFContext* pContext, const wchar_t* id, AMFComponent** ppComponent); + AMF_RESULT (AMF_STD_CALL *SetCacheFolder)(AMFFactory* pThis, const wchar_t* path); + const wchar_t* (AMF_STD_CALL *GetCacheFolder)(AMFFactory* pThis); + AMF_RESULT (AMF_STD_CALL *GetDebug)(AMFFactory* pThis, AMFDebug** ppDebug); + AMF_RESULT (AMF_STD_CALL *GetTrace)(AMFFactory* pThis, AMFTrace** ppTrace); + AMF_RESULT (AMF_STD_CALL *GetPrograms)(AMFFactory* pThis, AMFPrograms** ppPrograms); + } AMFFactoryVtbl; + + struct AMFFactory + { + const AMFFactoryVtbl *pVtbl; + }; + +#endif +#if defined(__cplusplus) +} +#endif + +//---------------------------------------------------------------------------------------------- +// DLL entry points +//---------------------------------------------------------------------------------------------- + +#define AMF_INIT_FUNCTION_NAME "AMFInit" +#define AMF_QUERY_VERSION_FUNCTION_NAME "AMFQueryVersion" + +#if defined(__cplusplus) +extern "C" +{ + typedef AMF_RESULT (AMF_CDECL_CALL *AMFInit_Fn)(amf_uint64 version, amf::AMFFactory **ppFactory); + typedef AMF_RESULT (AMF_CDECL_CALL *AMFQueryVersion_Fn)(amf_uint64 *pVersion); +} +#else + typedef AMF_RESULT (AMF_CDECL_CALL *AMFInit_Fn)(amf_uint64 version, AMFFactory **ppFactory); + typedef AMF_RESULT (AMF_CDECL_CALL *AMFQueryVersion_Fn)(amf_uint64 *pVersion); +#endif + +#if defined(_WIN32) + #if defined(_M_AMD64) + #define AMF_DLL_NAME L"amfrt64.dll" + #define AMF_DLL_NAMEA "amfrt64.dll" +#else + #define AMF_DLL_NAME L"amfrt32.dll" + #define AMF_DLL_NAMEA "amfrt32.dll" + #endif +#elif defined(__ANDROID__) + #define AMF_DLL_NAME L"libamf.so" + #define AMF_DLL_NAMEA "libamf.so" +#elif defined(__APPLE__) + #define AMF_DLL_NAME L"libamfrt.framework/libamfrt" + #define AMF_DLL_NAMEA "libamfrt.framework/libamfrt" +#elif defined(__linux__) + #if defined(__x86_64__) || defined(__aarch64__) + #define AMF_DLL_NAME L"libamfrt64.so.1" + #define AMF_DLL_NAMEA "libamfrt64.so.1" + #else + #define AMF_DLL_NAME L"libamfrt32.so.1" + #define AMF_DLL_NAMEA "libamfrt32.so.1" + #endif +#endif +//---------------------------------------------------------------------------------------------- +#endif // AMF_Factory_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Interface.h
Added
@@ -0,0 +1,258 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_Interface_h +#define AMF_Interface_h +#pragma once + +#include "Result.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif +#if defined(__cplusplus) + #define AMF_DECLARE_IID(_data1, _data2, _data3, _data41, _data42, _data43, _data44, _data45, _data46, _data47, _data48) \ + static AMF_INLINE const amf::AMFGuid IID() \ + { \ + amf::AMFGuid uid = {_data1, _data2, _data3, _data41, _data42, _data43, _data44, _data45, _data46, _data47, _data48}; \ + return uid; \ + } +#else +#define AMF_DECLARE_IID(name, _data1, _data2, _data3, _data41, _data42, _data43, _data44, _data45, _data46, _data47, _data48) \ + AMF_INLINE static const AMFGuid IID_##name(void) \ + { \ + AMFGuid uid = {_data1, _data2, _data3, _data41, _data42, _data43, _data44, _data45, _data46, _data47, _data48}; \ + return uid; \ + } +#endif + + //------------------------------------------------------------------------ + // AMFInterface interface - base class for all AMF interfaces + //------------------------------------------------------------------------ +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFInterface + { + public: + AMF_DECLARE_IID(0x9d872f34, 0x90dc, 0x4b93, 0xb6, 0xb2, 0x6c, 0xa3, 0x7c, 0x85, 0x25, 0xdb) + + virtual amf_long AMF_STD_CALL Acquire() = 0; + virtual amf_long AMF_STD_CALL Release() = 0; + virtual AMF_RESULT AMF_STD_CALL QueryInterface(const AMFGuid& interfaceID, void** ppInterface) = 0; + }; +#else + AMF_DECLARE_IID(AMFInterface, 0x9d872f34, 0x90dc, 0x4b93, 0xb6, 0xb2, 0x6c, 0xa3, 0x7c, 0x85, 0x25, 0xdb) + typedef struct AMFInterface AMFInterface; + + typedef struct AMFInterfaceVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFInterface* pThis); + amf_long (AMF_STD_CALL *Release)(AMFInterface* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFInterface* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + } AMFInterfaceVtbl; + + struct AMFInterface + { + const AMFInterfaceVtbl *pVtbl; + }; +#endif + //------------------------------------------------------------------------ + // template for AMF smart pointer + //------------------------------------------------------------------------ +#if defined(__cplusplus) + template<class _Interf> + class AMFInterfacePtr_T + { + private: + _Interf* m_pInterf; + + void InternalAcquire() + { + if(m_pInterf != NULL) + { + m_pInterf->Acquire(); + } + } + void InternalRelease() + { + if(m_pInterf != NULL) + { + m_pInterf->Release(); + } + } + public: + AMFInterfacePtr_T() : m_pInterf(NULL) + {} + + AMFInterfacePtr_T(const AMFInterfacePtr_T<_Interf>& p) : m_pInterf(p.m_pInterf) + { + InternalAcquire(); + } + + AMFInterfacePtr_T(_Interf* pInterface) : m_pInterf(pInterface) + { + InternalAcquire(); + } + + template<class _OtherInterf> + explicit AMFInterfacePtr_T(const AMFInterfacePtr_T<_OtherInterf>& cp) : m_pInterf(NULL) + { + void* pInterf = NULL; + if((cp == NULL) || (cp->QueryInterface(_Interf::IID(), &pInterf) != AMF_OK)) + { + pInterf = NULL; + } + m_pInterf = static_cast<_Interf*>(pInterf); + } + + template<class _OtherInterf> + explicit AMFInterfacePtr_T(_OtherInterf* cp) : m_pInterf(NULL) + { + void* pInterf = NULL; + if((cp == NULL) || (cp->QueryInterface(_Interf::IID(), &pInterf) != AMF_OK)) + { + pInterf = NULL; + } + m_pInterf = static_cast<_Interf*>(pInterf); + } + + ~AMFInterfacePtr_T() + { + InternalRelease(); + } + + AMFInterfacePtr_T& operator=(_Interf* pInterface) + { + if(m_pInterf != pInterface) + { + _Interf* pOldInterface = m_pInterf; + m_pInterf = pInterface; + InternalAcquire(); + if(pOldInterface != NULL) + { + pOldInterface->Release(); + } + } + return *this; + } + + AMFInterfacePtr_T& operator=(const AMFInterfacePtr_T<_Interf>& cp) + { + return operator=(cp.m_pInterf); + } + + void Attach(_Interf* pInterface) + { + InternalRelease(); + m_pInterf = pInterface; + } + + _Interf* Detach() + { + _Interf* const pOld = m_pInterf; + m_pInterf = NULL; + return pOld; + } + void Release() + { + InternalRelease(); + m_pInterf = NULL; + } + + operator _Interf*() const + { + return m_pInterf; + } + + _Interf& operator*() const + { + return *m_pInterf; + } + + // Returns the address of the interface pointer contained in this + // class. This is required for initializing from C-style factory function to + // avoid getting an incorrect ref count at the beginning. + + _Interf** operator&() + { + InternalRelease(); + m_pInterf = 0; + return &m_pInterf; + } + + _Interf* operator->() const + { + return m_pInterf; + } + + bool operator==(const AMFInterfacePtr_T<_Interf>& p) + { + return (m_pInterf == p.m_pInterf); + } + + bool operator==(_Interf* p) + { + return (m_pInterf == p); + } + + bool operator!=(const AMFInterfacePtr_T<_Interf>& p) + { + return !(operator==(p)); + } + bool operator!=(_Interf* p) + { + return !(operator==(p)); + } + + _Interf* GetPtr() + { + return m_pInterf; + } + + const _Interf* GetPtr() const + { + return m_pInterf; + } + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFInterface> AMFInterfacePtr; + //---------------------------------------------------------------------------------------------- +#endif + +#if defined(__cplusplus) +} +#endif + +#endif //#ifndef AMF_Interface_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Plane.h
Added
@@ -0,0 +1,112 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_Plane_h +#define AMF_Plane_h +#pragma once + +#include "Interface.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif + //--------------------------------------------------------------------------------------------- + typedef enum AMF_PLANE_TYPE + { + AMF_PLANE_UNKNOWN = 0, + AMF_PLANE_PACKED = 1, // for all packed formats: BGRA, YUY2, etc + AMF_PLANE_Y = 2, + AMF_PLANE_UV = 3, + AMF_PLANE_U = 4, + AMF_PLANE_V = 5, + } AMF_PLANE_TYPE; + //--------------------------------------------------------------------------------------------- + // AMFPlane interface + //--------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFPlane : public AMFInterface + { + public: + AMF_DECLARE_IID(0xbede1aa6, 0xd8fa, 0x4625, 0x94, 0x65, 0x6c, 0x82, 0xc4, 0x37, 0x71, 0x2e) + + virtual AMF_PLANE_TYPE AMF_STD_CALL GetType() = 0; + virtual void* AMF_STD_CALL GetNative() = 0; + virtual amf_int32 AMF_STD_CALL GetPixelSizeInBytes() = 0; + virtual amf_int32 AMF_STD_CALL GetOffsetX() = 0; + virtual amf_int32 AMF_STD_CALL GetOffsetY() = 0; + virtual amf_int32 AMF_STD_CALL GetWidth() = 0; + virtual amf_int32 AMF_STD_CALL GetHeight() = 0; + virtual amf_int32 AMF_STD_CALL GetHPitch() = 0; + virtual amf_int32 AMF_STD_CALL GetVPitch() = 0; + virtual bool AMF_STD_CALL IsTiled() = 0; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFPlane> AMFPlanePtr; + //---------------------------------------------------------------------------------------------- +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFPlane, 0xbede1aa6, 0xd8fa, 0x4625, 0x94, 0x65, 0x6c, 0x82, 0xc4, 0x37, 0x71, 0x2e) + typedef struct AMFPlane AMFPlane; + typedef struct AMFPlaneVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFPlane* pThis); + amf_long (AMF_STD_CALL *Release)(AMFPlane* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFPlane* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFPlane interface + AMF_PLANE_TYPE (AMF_STD_CALL *GetType)(AMFPlane* pThis); + void* (AMF_STD_CALL *GetNative)(AMFPlane* pThis); + amf_int32 (AMF_STD_CALL *GetPixelSizeInBytes)(AMFPlane* pThis); + amf_int32 (AMF_STD_CALL *GetOffsetX)(AMFPlane* pThis); + amf_int32 (AMF_STD_CALL *GetOffsetY)(AMFPlane* pThis); + amf_int32 (AMF_STD_CALL *GetWidth)(AMFPlane* pThis); + amf_int32 (AMF_STD_CALL *GetHeight)(AMFPlane* pThis); + amf_int32 (AMF_STD_CALL *GetHPitch)(AMFPlane* pThis); + amf_int32 (AMF_STD_CALL *GetVPitch)(AMFPlane* pThis); + amf_bool (AMF_STD_CALL *IsTiled)(AMFPlane* pThis); + + } AMFPlaneVtbl; + + struct AMFPlane + { + const AMFPlaneVtbl *pVtbl; + }; +#endif // #if defined(__cplusplus) + +#if defined(__cplusplus) +} // namespace amf +#endif + +#endif //#ifndef AMF_Plane_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Platform.h
Added
@@ -0,0 +1,547 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_Platform_h +#define AMF_Platform_h +#pragma once + +//---------------------------------------------------------------------------------------------- +// export declaration +//---------------------------------------------------------------------------------------------- +#if defined(_WIN32) + #if defined(AMF_CORE_STATIC) + #define AMF_CORE_LINK + #else + #if defined(AMF_CORE_EXPORTS) + #define AMF_CORE_LINK __declspec(dllexport) + #else + #define AMF_CORE_LINK __declspec(dllimport) + #endif + #endif +#elif defined(__linux) + #if defined(AMF_CORE_EXPORTS) + #define AMF_CORE_LINK __attribute__((visibility("default"))) + #else + #define AMF_CORE_LINK + #endif +#else + #define AMF_CORE_LINK +#endif // #ifdef _WIN32 + +#define AMF_MACRO_STRING2(x) #x +#define AMF_MACRO_STRING(x) AMF_MACRO_STRING2(x) + +#define AMF_TODO(_todo) (__FILE__ "(" AMF_MACRO_STRING(__LINE__) "): TODO: "_todo) + + + #if defined(__GNUC__) || defined(__clang__) + #define AMF_ALIGN(n) __attribute__((aligned(n))) + #elif defined(_MSC_VER) || defined(__INTEL_COMPILER) + #define AMF_ALIGN(n) __declspec(align(n)) + #else + #define AMF_ALIGN(n) +// #error Need to define AMF_ALIGN + #endif + +#if defined(__linux) || (__clang__) +typedef signed int HRESULT; +#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0) +#define FAILED(hr) (((HRESULT)(hr)) < 0) +#endif + +#include <stdio.h> +#include <stdint.h> +#include <string.h> + +#if defined(_WIN32) + + +#ifndef NOMINMAX +#define NOMINMAX +#endif + #define AMF_STD_CALL __stdcall + #define AMF_CDECL_CALL __cdecl + #define AMF_FAST_CALL __fastcall +#if defined(__GNUC__) || defined(__clang__) + #define AMF_INLINE inline + #define AMF_FORCEINLINE inline +#else + #define AMF_INLINE __inline + #define AMF_FORCEINLINE __forceinline +#endif + #define AMF_NO_VTABLE __declspec(novtable) + + #define AMFPRId64 "I64d" + #define LPRId64 L"I64d" + + #define AMFPRIud64 "Iu64d" + #define LPRIud64 L"Iu64d" + + #define AMFPRIx64 "I64x" + #define LPRIx64 L"I64x" + +#else // !WIN32 - Linux and Mac + + #define AMF_STD_CALL + #define AMF_CDECL_CALL + #define AMF_FAST_CALL +#if defined(__GNUC__) || defined(__clang__) + #define AMF_INLINE inline + #define AMF_FORCEINLINE inline +#else + #define AMF_INLINE __inline__ + #define AMF_FORCEINLINE __inline__ +#endif + #define AMF_NO_VTABLE + + #if !defined(AMFPRId64) + #define AMFPRId64 "lld" + #define LPRId64 L"lld" + + #define AMFPRIud64 "ulld" + #define LPRIud64 L"ulld" + + #define AMFPRIx64 "llx" + #define LPRIx64 L"llx" + #endif + +#endif // WIN32 + + +#if defined(_WIN32) +#define AMF_WEAK __declspec( selectany ) +#elif defined (__GNUC__) || defined (__GCC__) || defined(__clang__)//GCC or CLANG +#define AMF_WEAK __attribute__((weak)) +#endif + +#define amf_countof(x) (sizeof(x) / sizeof(x0)) + +//------------------------------------------------------------------------------------------------- +// basic data types +//------------------------------------------------------------------------------------------------- +typedef int64_t amf_int64; +typedef int32_t amf_int32; +typedef int16_t amf_int16; +typedef int8_t amf_int8; + +typedef uint64_t amf_uint64; +typedef uint32_t amf_uint32; +typedef uint16_t amf_uint16; +typedef uint8_t amf_uint8; +typedef size_t amf_size; + +typedef void* amf_handle; +typedef double amf_double; +typedef float amf_float; + +typedef void amf_void; + +#if defined(__cplusplus) +typedef bool amf_bool; +#else +typedef amf_uint8 amf_bool; +#define true 1 +#define false 0 +#endif + +typedef long amf_long; +typedef int amf_int; +typedef unsigned long amf_ulong; +typedef unsigned int amf_uint; + +typedef amf_int64 amf_pts; // in 100 nanosecs + +typedef amf_uint32 amf_flags; + +#define AMF_SECOND 10000000L // 1 second in 100 nanoseconds +#define AMF_MILLISECOND (AMF_SECOND / 1000) + +#define AMF_MIN(a, b) ((a) < (b) ? (a) : (b)) +#define AMF_MAX(a, b) ((a) > (b) ? (a) : (b)) + +#define AMF_BITS_PER_BYTE 8 + +#if defined(_WIN32) + #define PATH_SEPARATOR_WSTR L"\\" + #define PATH_SEPARATOR_WCHAR L'\\' +#elif defined(__linux) || defined(__APPLE__) // Linux & Apple + #define PATH_SEPARATOR_WSTR L"/" + #define PATH_SEPARATOR_WCHAR L'/' +#endif + +typedef struct AMFRect +{ + amf_int32 left; + amf_int32 top; + amf_int32 right; + amf_int32 bottom; +#if defined(__cplusplus) + bool operator==(const AMFRect& other) const + { + return left == other.left && top == other.top && right == other.right && bottom == other.bottom; + } + AMF_INLINE bool operator!=(const AMFRect& other) const { return !operator==(other); } + amf_int32 Width() const { return right - left; } + amf_int32 Height() const { return bottom - top; } +#endif +} AMFRect; + +static AMF_INLINE struct AMFRect AMFConstructRect(amf_int32 left, amf_int32 top, amf_int32 right, amf_int32 bottom) +{ + struct AMFRect object = {left, top, right, bottom}; + return object; +} + +typedef struct AMFSize +{ + amf_int32 width; + amf_int32 height; +#if defined(__cplusplus) + bool operator==(const AMFSize& other) const + { + return width == other.width && height == other.height; + } + AMF_INLINE bool operator!=(const AMFSize& other) const { return !operator==(other); } +#endif +} AMFSize; + +static AMF_INLINE struct AMFSize AMFConstructSize(amf_int32 width, amf_int32 height) +{ + struct AMFSize object = {width, height}; + return object; +} + +typedef struct AMFPoint +{ + amf_int32 x; + amf_int32 y; +#if defined(__cplusplus) + bool operator==(const AMFPoint& other) const + { + return x == other.x && y == other.y; + } + AMF_INLINE bool operator!=(const AMFPoint& other) const { return !operator==(other); } +#endif +} AMFPoint; + +static AMF_INLINE struct AMFPoint AMFConstructPoint(amf_int32 x, amf_int32 y) +{ + struct AMFPoint object = { x, y }; + return object; +} + +typedef struct AMFFloatPoint2D +{ + amf_float x; + amf_float y; +#if defined(__cplusplus) + bool operator==(const AMFFloatPoint2D& other) const + { + return x == other.x && y == other.y; + } + AMF_INLINE bool operator!=(const AMFFloatPoint2D& other) const { return !operator==(other); } +#endif +} AMFFloatPoint2D; + +static AMF_INLINE struct AMFFloatPoint2D AMFConstructFloatPoint2D(amf_float x, amf_float y) +{ + struct AMFFloatPoint2D object = {x, y}; + return object; +} +typedef struct AMFFloatSize +{ + amf_float width; + amf_float height; +#if defined(__cplusplus) + bool operator==(const AMFFloatSize& other) const + { + return width == other.width && height == other.height; + } + AMF_INLINE bool operator!=(const AMFFloatSize& other) const { return !operator==(other); } +#endif +} AMFFloatSize; + +static AMF_INLINE struct AMFFloatSize AMFConstructFloatSize(amf_float w, amf_float h) +{ + struct AMFFloatSize object = { w, h }; + return object; +} + + +typedef struct AMFFloatPoint3D +{ + amf_float x; + amf_float y; + amf_float z; +#if defined(__cplusplus) + bool operator==(const AMFFloatPoint3D& other) const + { + return x == other.x && y == other.y && z == other.z; + } + AMF_INLINE bool operator!=(const AMFFloatPoint3D& other) const { return !operator==(other); } +#endif +} AMFFloatPoint3D; + +static AMF_INLINE struct AMFFloatPoint3D AMFConstructFloatPoint3D(amf_float x, amf_float y, amf_float z) +{ + struct AMFFloatPoint3D object = { x, y, z }; + return object; +} + +typedef struct AMFFloatVector4D +{ + amf_float x; + amf_float y; + amf_float z; + amf_float w; +#if defined(__cplusplus) + bool operator==(const AMFFloatVector4D& other) const + { + return x == other.x && y == other.y && z == other.z && w == other.w; + } + AMF_INLINE bool operator!=(const AMFFloatVector4D& other) const { return !operator==(other); } +#endif +} AMFFloatVector4D; + +static AMF_INLINE struct AMFFloatVector4D AMFConstructFloatVector4D(amf_float x, amf_float y, amf_float z, amf_float w) +{ + struct AMFFloatVector4D object = { x, y, z, w }; + return object; +} + + +typedef struct AMFRate +{ + amf_uint32 num; + amf_uint32 den; +#if defined(__cplusplus) + bool operator==(const AMFRate& other) const + { + return num == other.num && den == other.den; + } + AMF_INLINE bool operator!=(const AMFRate& other) const { return !operator==(other); } +#endif +} AMFRate; + +static AMF_INLINE struct AMFRate AMFConstructRate(amf_uint32 num, amf_uint32 den) +{ + struct AMFRate object = {num, den}; + return object; +} + +typedef struct AMFRatio +{ + amf_uint32 num; + amf_uint32 den; +#if defined(__cplusplus) + bool operator==(const AMFRatio& other) const + { + return num == other.num && den == other.den; + } + AMF_INLINE bool operator!=(const AMFRatio& other) const { return !operator==(other); } +#endif +} AMFRatio; + +static AMF_INLINE struct AMFRatio AMFConstructRatio(amf_uint32 num, amf_uint32 den) +{ + struct AMFRatio object = {num, den}; + return object; +} + +#pragma pack(push, 1) +#if defined(_MSC_VER) + #pragma warning( push ) +#endif +#if defined(WIN32) +#if defined(_MSC_VER) + #pragma warning(disable : 4200) + #pragma warning(disable : 4201) +#endif +#endif +typedef struct AMFColor +{ + union + { + struct + { + amf_uint8 r; + amf_uint8 g; + amf_uint8 b; + amf_uint8 a; + }; + amf_uint32 rgba; + }; +#if defined(__cplusplus) + bool operator==(const AMFColor& other) const + { + return r == other.r && g == other.g && b == other.b && a == other.a; + } + AMF_INLINE bool operator!=(const AMFColor& other) const { return !operator==(other); } +#endif +} AMFColor; +#if defined(_MSC_VER) + #pragma warning( pop ) +#endif +#pragma pack(pop) + + +static AMF_INLINE struct AMFColor AMFConstructColor(amf_uint8 r, amf_uint8 g, amf_uint8 b, amf_uint8 a) +{ + struct AMFColor object; + object.r = r; + object.g = g; + object.b = b; + object.a = a; + return object; +} + +#if defined(_WIN32) + #include <combaseapi.h> + + #if defined(__cplusplus) + extern "C" + { + #endif + // allocator + static AMF_INLINE void* AMF_CDECL_CALL amf_variant_alloc(amf_size count) + { + return CoTaskMemAlloc(count); + } + static AMF_INLINE void AMF_CDECL_CALL amf_variant_free(void* ptr) + { + CoTaskMemFree(ptr); + } + #if defined(__cplusplus) + } + #endif + +#else // defined(_WIN32) + #include <stdlib.h> + #if defined(__cplusplus) + extern "C" + { + #endif + // allocator + static AMF_INLINE void* AMF_CDECL_CALL amf_variant_alloc(amf_size count) + { + return malloc(count); + } + static AMF_INLINE void AMF_CDECL_CALL amf_variant_free(void* ptr) + { + free(ptr); + } + #if defined(__cplusplus) + } + #endif +#endif // defined(_WIN32) + + +#if defined(__cplusplus) +namespace amf +{ +#endif + typedef struct AMFGuid + { + amf_uint32 data1; + amf_uint16 data2; + amf_uint16 data3; + amf_uint8 data41; + amf_uint8 data42; + amf_uint8 data43; + amf_uint8 data44; + amf_uint8 data45; + amf_uint8 data46; + amf_uint8 data47; + amf_uint8 data48; +#if defined(__cplusplus) + AMFGuid(amf_uint32 _data1, amf_uint16 _data2, amf_uint16 _data3, + amf_uint8 _data41, amf_uint8 _data42, amf_uint8 _data43, amf_uint8 _data44, + amf_uint8 _data45, amf_uint8 _data46, amf_uint8 _data47, amf_uint8 _data48) + : data1 (_data1), + data2 (_data2), + data3 (_data3), + data41(_data41), + data42(_data42), + data43(_data43), + data44(_data44), + data45(_data45), + data46(_data46), + data47(_data47), + data48(_data48) + {} + + bool operator==(const AMFGuid& other) const + { + return + data1 == other.data1 && + data2 == other.data2 && + data3 == other.data3 && + data41 == other.data41 && + data42 == other.data42 && + data43 == other.data43 && + data44 == other.data44 && + data45 == other.data45 && + data46 == other.data46 && + data47 == other.data47 && + data48 == other.data48; + } + AMF_INLINE bool operator!=(const AMFGuid& other) const { return !operator==(other); } +#endif + } AMFGuid; + +#if defined(__cplusplus) + static AMF_INLINE bool AMFCompareGUIDs(const AMFGuid& guid1, const AMFGuid& guid2) + { + return guid1 == guid2; + } +#else + static AMF_INLINE amf_bool AMFCompareGUIDs(const struct AMFGuid guid1, const struct AMFGuid guid2) + { + return memcmp(&guid1, &guid2, sizeof(guid1)) == 0; + } +#endif +#if defined(__cplusplus) +} +#endif + +#if defined(__APPLE__) +//#include <MacTypes.h> + +#define media_status_t int +#define ANativeWindow void +#define JNIEnv void +#define jobject int +#define JavaVM void + +#endif + +#endif //#ifndef AMF_Platform_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/PropertyStorage.h
Added
@@ -0,0 +1,275 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_PropertyStorage_h +#define AMF_PropertyStorage_h +#pragma once + +#include "Variant.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif + //---------------------------------------------------------------------------------------------- + // AMFPropertyStorageObserver interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + + class AMF_NO_VTABLE AMFPropertyStorageObserver + { + public: + virtual void AMF_STD_CALL OnPropertyChanged(const wchar_t* name) = 0; + }; +#else //#if defined(__cplusplus) + typedef struct AMFPropertyStorageObserver AMFPropertyStorageObserver; + typedef struct AMFPropertyStorageObserverVtbl + { + void (AMF_STD_CALL *OnPropertyChanged)(AMFPropertyStorageObserver *pThis, const wchar_t* name); + } AMFPropertyStorageObserverVtbl; + + struct AMFPropertyStorageObserver + { + const AMFPropertyStorageObserverVtbl *pVtbl; + }; + +#endif // #if defined(__cplusplus) +#if defined(__cplusplus) + //---------------------------------------------------------------------------------------------- + // AMFPropertyStorage interface + //---------------------------------------------------------------------------------------------- + class AMF_NO_VTABLE AMFPropertyStorage : public AMFInterface + { + public: + AMF_DECLARE_IID(0xc7cec05b, 0xcfb9, 0x48af, 0xac, 0xe3, 0xf6, 0x8d, 0xf8, 0x39, 0x5f, 0xe3) + + virtual AMF_RESULT AMF_STD_CALL SetProperty(const wchar_t* name, AMFVariantStruct value) = 0; + virtual AMF_RESULT AMF_STD_CALL GetProperty(const wchar_t* name, AMFVariantStruct* pValue) const = 0; + + virtual amf_bool AMF_STD_CALL HasProperty(const wchar_t* name) const = 0; + virtual amf_size AMF_STD_CALL GetPropertyCount() const = 0; + virtual AMF_RESULT AMF_STD_CALL GetPropertyAt(amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue) const = 0; + + virtual AMF_RESULT AMF_STD_CALL Clear() = 0; + virtual AMF_RESULT AMF_STD_CALL AddTo(AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep) const= 0; + virtual AMF_RESULT AMF_STD_CALL CopyTo(AMFPropertyStorage* pDest, amf_bool deep) const = 0; + + virtual void AMF_STD_CALL AddObserver(AMFPropertyStorageObserver* pObserver) = 0; + virtual void AMF_STD_CALL RemoveObserver(AMFPropertyStorageObserver* pObserver) = 0; + + template<typename _T> + AMF_RESULT AMF_STD_CALL SetProperty(const wchar_t* name, const _T& value); + template<typename _T> + AMF_RESULT AMF_STD_CALL GetProperty(const wchar_t* name, _T* pValue) const; + template<typename _T> + AMF_RESULT AMF_STD_CALL GetPropertyString(const wchar_t* name, _T* pValue) const; + template<typename _T> + AMF_RESULT AMF_STD_CALL GetPropertyWString(const wchar_t* name, _T* pValue) const; + + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFPropertyStorage> AMFPropertyStoragePtr; + //---------------------------------------------------------------------------------------------- + +#else // #if defined(__cplusplus) + typedef struct AMFPropertyStorage AMFPropertyStorage; + AMF_DECLARE_IID(AMFPropertyStorage, 0xc7cec05b, 0xcfb9, 0x48af, 0xac, 0xe3, 0xf6, 0x8d, 0xf8, 0x39, 0x5f, 0xe3) + + typedef struct AMFPropertyStorageVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFPropertyStorage* pThis); + amf_long (AMF_STD_CALL *Release)(AMFPropertyStorage* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFPropertyStorage* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFPropertyStorage interface + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFPropertyStorage* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFPropertyStorage* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFPropertyStorage* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFPropertyStorage* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFPropertyStorage* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFPropertyStorage* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFPropertyStorage* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFPropertyStorage* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFPropertyStorage* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFPropertyStorage* pThis, AMFPropertyStorageObserver* pObserver); + + } AMFPropertyStorageVtbl; + + struct AMFPropertyStorage + { + const AMFPropertyStorageVtbl *pVtbl; + }; + + #define AMF_ASSIGN_PROPERTY_DATA(res, varType, pThis, name, val ) \ + { \ + AMFVariantStruct var = {0}; \ + AMFVariantAssign##varType(&var, val); \ + res = pThis->pVtbl->SetProperty(pThis, name, var ); \ + } + + #define AMF_QUERY_INTERFACE(res, from, InterfaceTypeTo, to) \ + { \ + AMFGuid guid_##InterfaceTypeTo = IID_##InterfaceTypeTo(); \ + res = from->pVtbl->QueryInterface(from, &guid_##InterfaceTypeTo, (void**)&to); \ + } + + #define AMF_ASSIGN_PROPERTY_INTERFACE(res, pThis, name, val) \ + { \ + AMFInterface *amf_interface; \ + AMFVariantStruct var; \ + res = AMFVariantInit(&var); \ + if (res == AMF_OK) \ + { \ + AMF_QUERY_INTERFACE(res, val, AMFInterface, amf_interface)\ + if (res == AMF_OK) \ + { \ + res = AMFVariantAssignInterface(&var, amf_interface); \ + amf_interface->pVtbl->Release(amf_interface); \ + if (res == AMF_OK) \ + { \ + res = pThis->pVtbl->SetProperty(pThis, name, var); \ + } \ + } \ + AMFVariantClear(&var); \ + } \ + } + + #define AMF_GET_PROPERTY_INTERFACE(res, pThis, name, TargetType, val) \ + { \ + AMFVariantStruct var; \ + res = AMFVariantInit(&var); \ + if (res != AMF_OK) \ + { \ + res = pThis->pVtbl->GetProperty(pThis, name, &var); \ + if (res == AMF_OK) \ + { \ + if (var.type == AMF_VARIANT_INTERFACE && AMFVariantInterface(&var)) \ + { \ + AMF_QUERY_INTERFACE(res, AMFVariantInterface(&var), TargetType, val); \ + } \ + else \ + { \ + res = AMF_INVALID_DATA_TYPE; \ + } \ + } \ + } \ + AMFVariantClear(&var); \ + } + + #define AMF_ASSIGN_PROPERTY_TYPE(res, varType, dataType , pThis, name, val ) AMF_ASSIGN_PROPERTY_DATA(res, varType, pThis, name, (dataType)val) + + #define AMF_ASSIGN_PROPERTY_INT64(res, pThis, name, val ) AMF_ASSIGN_PROPERTY_TYPE(res, Int64, amf_int64, pThis, name, val) + #define AMF_ASSIGN_PROPERTY_DOUBLE(res, pThis, name, val ) AMF_ASSIGN_PROPERTY_TYPE(res, Double, amf_double, pThis, name, val) + #define AMF_ASSIGN_PROPERTY_BOOL(res, pThis, name, val ) AMF_ASSIGN_PROPERTY_TYPE(res, Bool, amf_bool, pThis, name, val) + #define AMF_ASSIGN_PROPERTY_RECT(res, pThis, name, val ) AMF_ASSIGN_PROPERTY_DATA(res, Rect, pThis, name, &val) + #define AMF_ASSIGN_PROPERTY_SIZE(res, pThis, name, val ) AMF_ASSIGN_PROPERTY_DATA(res, Size, pThis, name, &val) + #define AMF_ASSIGN_PROPERTY_POINT(res, pThis, name, val ) AMF_ASSIGN_PROPERTY_DATA(res, Point, pThis, name, &val) + #define AMF_ASSIGN_PROPERTY_RATE(res, pThis, name, val ) AMF_ASSIGN_PROPERTY_DATA(res, Rate, pThis, name, &val) + #define AMF_ASSIGN_PROPERTY_RATIO(res, pThis, name, val ) AMF_ASSIGN_PROPERTY_DATA(res, Ratio, pThis, name, &val) + #define AMF_ASSIGN_PROPERTY_COLOR(res, pThis, name, val ) AMF_ASSIGN_PROPERTY_DATA(res, Color, pThis, name, &val) + +#endif // #if defined(__cplusplus) + + +#if defined(__cplusplus) + //---------------------------------------------------------------------------------------------- + // template methods implementations + //---------------------------------------------------------------------------------------------- + template<typename _T> inline + AMF_RESULT AMF_STD_CALL AMFPropertyStorage::SetProperty(const wchar_t* name, const _T& value) + { + AMF_RESULT err = SetProperty(name, static_cast<const AMFVariantStruct&>(AMFVariant(value))); + return err; + } + //---------------------------------------------------------------------------------------------- + template<typename _T> inline + AMF_RESULT AMF_STD_CALL AMFPropertyStorage::GetProperty(const wchar_t* name, _T* pValue) const + { + AMFVariant var; + AMF_RESULT err = GetProperty(name, static_cast<AMFVariantStruct*>(&var)); + if(err == AMF_OK) + { + *pValue = static_cast<_T>(var); + } + return err; + } + //---------------------------------------------------------------------------------------------- + template<typename _T> inline + AMF_RESULT AMF_STD_CALL AMFPropertyStorage::GetPropertyString(const wchar_t* name, _T* pValue) const + { + AMFVariant var; + AMF_RESULT err = GetProperty(name, static_cast<AMFVariantStruct*>(&var)); + if(err == AMF_OK) + { + *pValue = var.ToString().c_str(); + } + return err; + } + //---------------------------------------------------------------------------------------------- + template<typename _T> inline + AMF_RESULT AMF_STD_CALL AMFPropertyStorage::GetPropertyWString(const wchar_t* name, _T* pValue) const + { + AMFVariant var; + AMF_RESULT err = GetProperty(name, static_cast<AMFVariantStruct*>(&var)); + if(err == AMF_OK) + { + *pValue = var.ToWString().c_str(); + } + return err; + } + //---------------------------------------------------------------------------------------------- + template<> inline + AMF_RESULT AMF_STD_CALL AMFPropertyStorage::GetProperty(const wchar_t* name, + AMFInterface** ppValue) const + { + AMFVariant var; + AMF_RESULT err = GetProperty(name, static_cast<AMFVariantStruct*>(&var)); + if(err == AMF_OK) + { + *ppValue = static_cast<AMFInterface*>(var); + } + if(*ppValue) + { + (*ppValue)->Acquire(); + } + return err; + } +#endif // #if defined(__cplusplus) + +#if defined(__cplusplus) +} //namespace amf +#endif + +#endif // #ifndef AMF_PropertyStorage_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/PropertyStorageEx.h
Added
@@ -0,0 +1,207 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_PropertyStorageEx_h +#define AMF_PropertyStorageEx_h +#pragma once + +#include "PropertyStorage.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif + //---------------------------------------------------------------------------------------------- + typedef enum AMF_PROPERTY_CONTENT_ENUM + { + AMF_PROPERTY_CONTENT_DEFAULT = 0, + AMF_PROPERTY_CONTENT_XML, // m_eType is AMF_VARIANT_STRING + + AMF_PROPERTY_CONTENT_FILE_OPEN_PATH, // m_eType AMF_VARIANT_WSTRING + AMF_PROPERTY_CONTENT_FILE_SAVE_PATH, // m_eType AMF_VARIANT_WSTRING + + AMF_PROPERTY_CONTENT_INTEGER_ARRAY, // m_eType AMF_VARIANT_INTERFACE + AMF_PROPERTY_CONTENT_FLOAT_ARRAY // m_eType AMF_VARIANT_INTERFACE + } AMF_PROPERTY_CONTENT_ENUM; + //---------------------------------------------------------------------------------------------- + typedef enum AMF_PROPERTY_ACCESS_TYPE + { + AMF_PROPERTY_ACCESS_PRIVATE = 0, + AMF_PROPERTY_ACCESS_READ = 0x1, + AMF_PROPERTY_ACCESS_WRITE = 0x2, + AMF_PROPERTY_ACCESS_READ_WRITE = (AMF_PROPERTY_ACCESS_READ | AMF_PROPERTY_ACCESS_WRITE), + AMF_PROPERTY_ACCESS_WRITE_RUNTIME = 0x4, + AMF_PROPERTY_ACCESS_FULL = 0xFF, + AMF_PROPERTY_ACCESS_NON_PERSISTANT = 0x4000, + AMF_PROPERTY_ACCESS_NON_PERSISTANT_READ = (AMF_PROPERTY_ACCESS_NON_PERSISTANT | AMF_PROPERTY_ACCESS_READ), + AMF_PROPERTY_ACCESS_NON_PERSISTANT_READ_WRITE = (AMF_PROPERTY_ACCESS_NON_PERSISTANT | AMF_PROPERTY_ACCESS_READ_WRITE), + AMF_PROPERTY_ACCESS_NON_PERSISTANT_FULL = (AMF_PROPERTY_ACCESS_NON_PERSISTANT | AMF_PROPERTY_ACCESS_FULL), + AMF_PROPERTY_ACCESS_INVALID = 0x8000 + } AMF_PROPERTY_ACCESS_TYPE; + + //---------------------------------------------------------------------------------------------- + typedef struct AMFEnumDescriptionEntry + { + amf_int value; + const wchar_t* name; + } AMFEnumDescriptionEntry; + //---------------------------------------------------------------------------------------------- + typedef amf_uint32 AMF_PROPERTY_CONTENT_TYPE; + + typedef struct AMFPropertyInfo + { + const wchar_t* name; + const wchar_t* desc; + AMF_VARIANT_TYPE type; + AMF_PROPERTY_CONTENT_TYPE contentType; + + AMFVariantStruct defaultValue; + AMFVariantStruct minValue; + AMFVariantStruct maxValue; + AMF_PROPERTY_ACCESS_TYPE accessType; + const AMFEnumDescriptionEntry* pEnumDescription; + +#if defined(__cplusplus) + AMFPropertyInfo() : + name(NULL), + desc(NULL), + type(), + contentType(), + defaultValue(), + minValue(), + maxValue(), + accessType(AMF_PROPERTY_ACCESS_FULL), + pEnumDescription(NULL) + {} + AMFPropertyInfo(const AMFPropertyInfo& propery) : name(propery.name), + desc(propery.desc), + type(propery.type), + contentType(propery.contentType), + defaultValue(propery.defaultValue), + minValue(propery.minValue), + maxValue(propery.maxValue), + accessType(propery.accessType), + pEnumDescription(propery.pEnumDescription) + {} + virtual ~AMFPropertyInfo(){} + + amf_bool AMF_STD_CALL AllowedRead() const + { + return (accessType & AMF_PROPERTY_ACCESS_READ) != 0; + } + amf_bool AMF_STD_CALL AllowedWrite() const + { + return (accessType & AMF_PROPERTY_ACCESS_WRITE) != 0; + } + amf_bool AMF_STD_CALL AllowedChangeInRuntime() const + { + return (accessType & AMF_PROPERTY_ACCESS_WRITE_RUNTIME) != 0; + } + + AMFPropertyInfo& operator=(const AMFPropertyInfo& propery) + { + name = propery.name; + desc = propery.desc; + type = propery.type; + contentType = propery.contentType; + defaultValue = propery.defaultValue; + minValue = propery.minValue; + maxValue = propery.maxValue; + accessType = propery.accessType; + pEnumDescription = propery.pEnumDescription; + + return *this; + } +#endif // #if defined(__cplusplus) + } AMFPropertyInfo; + //---------------------------------------------------------------------------------------------- + // AMFPropertyStorageEx interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFPropertyStorageEx : public AMFPropertyStorage + { + public: + AMF_DECLARE_IID(0x16b8958d, 0xe943, 0x4a33, 0xa3, 0x5a, 0x88, 0x5a, 0xd8, 0x28, 0xf2, 0x67) + + virtual amf_size AMF_STD_CALL GetPropertiesInfoCount() const = 0; + virtual AMF_RESULT AMF_STD_CALL GetPropertyInfo(amf_size index, const AMFPropertyInfo** ppInfo) const = 0; + virtual AMF_RESULT AMF_STD_CALL GetPropertyInfo(const wchar_t* name, const AMFPropertyInfo** ppInfo) const = 0; + virtual AMF_RESULT AMF_STD_CALL ValidateProperty(const wchar_t* name, AMFVariantStruct value, AMFVariantStruct* pOutValidated) const = 0; + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFPropertyStorageEx> AMFPropertyStorageExPtr; +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFPropertyStorageEx, 0x16b8958d, 0xe943, 0x4a33, 0xa3, 0x5a, 0x88, 0x5a, 0xd8, 0x28, 0xf2, 0x67) + typedef struct AMFPropertyStorageEx AMFPropertyStorageEx; + + typedef struct AMFPropertyStorageExVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFPropertyStorageEx* pThis); + amf_long (AMF_STD_CALL *Release)(AMFPropertyStorageEx* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFPropertyStorageEx* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFPropertyStorage interface + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFPropertyStorageEx* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFPropertyStorageEx* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFPropertyStorageEx* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFPropertyStorageEx* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFPropertyStorageEx* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFPropertyStorageEx* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFPropertyStorageEx* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFPropertyStorageEx* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFPropertyStorageEx* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFPropertyStorageEx* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFPropertyStorageEx interface + + amf_size (AMF_STD_CALL *GetPropertiesInfoCount)(AMFPropertyStorageEx* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyInfoAt)(AMFPropertyStorageEx* pThis, amf_size index, const AMFPropertyInfo** ppInfo); + AMF_RESULT (AMF_STD_CALL *GetPropertyInfo)(AMFPropertyStorageEx* pThis, const wchar_t* name, const AMFPropertyInfo** ppInfo); + AMF_RESULT (AMF_STD_CALL *ValidateProperty)(AMFPropertyStorageEx* pThis, const wchar_t* name, AMFVariantStruct value, AMFVariantStruct* pOutValidated); + + } AMFPropertyStorageExVtbl; + + struct AMFPropertyStorageEx + { + const AMFPropertyStorageExVtbl *pVtbl; + }; +#endif // #if defined(__cplusplus) + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) +} //namespace amf +#endif + + +#endif //#ifndef AMF_PropertyStorageEx_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Result.h
Added
@@ -0,0 +1,127 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_Result_h +#define AMF_Result_h +#pragma once + +#include "Platform.h" + +//---------------------------------------------------------------------------------------------- +// result codes +//---------------------------------------------------------------------------------------------- + +typedef enum AMF_RESULT +{ + AMF_OK = 0, + AMF_FAIL , + +// common errors + AMF_UNEXPECTED , + + AMF_ACCESS_DENIED , + AMF_INVALID_ARG , + AMF_OUT_OF_RANGE , + + AMF_OUT_OF_MEMORY , + AMF_INVALID_POINTER , + + AMF_NO_INTERFACE , + AMF_NOT_IMPLEMENTED , + AMF_NOT_SUPPORTED , + AMF_NOT_FOUND , + + AMF_ALREADY_INITIALIZED , + AMF_NOT_INITIALIZED , + + AMF_INVALID_FORMAT ,// invalid data format + + AMF_WRONG_STATE , + AMF_FILE_NOT_OPEN ,// cannot open file + +// device common codes + AMF_NO_DEVICE , + +// device directx + AMF_DIRECTX_FAILED , +// device opencl + AMF_OPENCL_FAILED , +// device opengl + AMF_GLX_FAILED ,//failed to use GLX +// device XV + AMF_XV_FAILED , //failed to use Xv extension +// device alsa + AMF_ALSA_FAILED ,//failed to use ALSA + +// component common codes + + //result codes + AMF_EOF , + AMF_REPEAT , + AMF_INPUT_FULL ,//returned by AMFComponent::SubmitInput if input queue is full + AMF_RESOLUTION_CHANGED ,//resolution changed client needs to Drain/Terminate/Init + AMF_RESOLUTION_UPDATED ,//resolution changed in adaptive mode. New ROI will be set on output on newly decoded frames + + //error codes + AMF_INVALID_DATA_TYPE ,//invalid data type + AMF_INVALID_RESOLUTION ,//invalid resolution (width or height) + AMF_CODEC_NOT_SUPPORTED ,//codec not supported + AMF_SURFACE_FORMAT_NOT_SUPPORTED ,//surface format not supported + AMF_SURFACE_MUST_BE_SHARED ,//surface should be shared (DX11: (MiscFlags & D3D11_RESOURCE_MISC_SHARED) == 0, DX9: No shared handle found) + +// component video decoder + AMF_DECODER_NOT_PRESENT ,//failed to create the decoder + AMF_DECODER_SURFACE_ALLOCATION_FAILED ,//failed to create the surface for decoding + AMF_DECODER_NO_FREE_SURFACES , + +// component video encoder + AMF_ENCODER_NOT_PRESENT ,//failed to create the encoder + +// component video processor + +// component video conveter + +// component dem + AMF_DEM_ERROR , + AMF_DEM_PROPERTY_READONLY , + AMF_DEM_REMOTE_DISPLAY_CREATE_FAILED , + AMF_DEM_START_ENCODING_FAILED , + AMF_DEM_QUERY_OUTPUT_FAILED , + +// component TAN + AMF_TAN_CLIPPING_WAS_REQUIRED , // Resulting data was truncated to meet output type's value limits. + AMF_TAN_UNSUPPORTED_VERSION , // Not supported version requested, solely for TANCreateContext(). + + AMF_NEED_MORE_INPUT ,//returned by AMFComponent::SubmitInput did not produce a buffer because more input submissions are required. +} AMF_RESULT; + +#endif //#ifndef AMF_Result_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Surface.h
Added
@@ -0,0 +1,279 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_Surface_h +#define AMF_Surface_h +#pragma once + +#include "Data.h" +#include "Plane.h" + +#if defined(_MSC_VER) + #pragma warning( push ) + #pragma warning(disable : 4263) + #pragma warning(disable : 4264) +#endif +#if defined(__cplusplus) +namespace amf +{ +#endif + //---------------------------------------------------------------------------------------------- + typedef enum AMF_SURFACE_FORMAT + { + AMF_SURFACE_UNKNOWN = 0, + AMF_SURFACE_NV12, ///< 1 - planar 4:2:0 Y width x height + packed UV width/2 x height/2 - 8 bit per component + AMF_SURFACE_YV12, ///< 2 - planar 4:2:0 Y width x height + V width/2 x height/2 + U width/2 x height/2 - 8 bit per component + AMF_SURFACE_BGRA, ///< 3 - packed 4:4:4 - 8 bit per component + AMF_SURFACE_ARGB, ///< 4 - packed 4:4:4 - 8 bit per component + AMF_SURFACE_RGBA, ///< 5 - packed 4:4:4 - 8 bit per component + AMF_SURFACE_GRAY8, ///< 6 - single component - 8 bit + AMF_SURFACE_YUV420P, ///< 7 - planar 4:2:0 Y width x height + U width/2 x height/2 + V width/2 x height/2 - 8 bit per component + AMF_SURFACE_U8V8, ///< 8 - packed double component - 8 bit per component + AMF_SURFACE_YUY2, ///< 9 - packed 4:2:2 Byte 0=8-bit Y'0; Byte 1=8-bit Cb; Byte 2=8-bit Y'1; Byte 3=8-bit Cr + AMF_SURFACE_P010, ///< 10 - planar 4:2:0 Y width x height + packed UV width/2 x height/2 - 10 bit per component (16 allocated, upper 10 bits are used) + AMF_SURFACE_RGBA_F16, ///< 11 - packed 4:4:4 - 16 bit per component float + AMF_SURFACE_UYVY, ///< 12 - packed 4:2:2 the similar to YUY2 but Y and UV swapped: Byte 0=8-bit Cb; Byte 1=8-bit Y'0; Byte 2=8-bit Cr Byte 3=8-bit Y'1; (used the same DX/CL/Vulkan storage as YUY2) + AMF_SURFACE_R10G10B10A2, ///< 13 - packed 4:4:4 to 4 bytes, 10 bit per RGB component, 2 bits per A + AMF_SURFACE_Y210, ///< 14 - packed 4:2:2 - Word 0=10-bit Y'0; Word 1=10-bit Cb; Word 2=10-bit Y'1; Word 3=10-bit Cr + AMF_SURFACE_AYUV, ///< 15 - packed 4:4:4 - 8 bit per component YUVA + AMF_SURFACE_Y410, ///< 16 - packed 4:4:4 - 10 bit per YUV component, 2 bits per A, AVYU + AMF_SURFACE_Y416, ///< 16 - packed 4:4:4 - 16 bit per component 4 bytes, AVYU + AMF_SURFACE_GRAY32, ///< 17 - single component - 32 bit + + AMF_SURFACE_FIRST = AMF_SURFACE_NV12, + AMF_SURFACE_LAST = AMF_SURFACE_GRAY32 + } AMF_SURFACE_FORMAT; + //---------------------------------------------------------------------------------------------- + // AMF_SURFACE_USAGE translates to D3D11_BIND_FLAG or VkImageUsageFlags + // bit mask + //---------------------------------------------------------------------------------------------- + typedef enum AMF_SURFACE_USAGE_BITS + { // D3D11 D3D12 Vulkan + AMF_SURFACE_USAGE_DEFAULT = 0x80000000, // will apply default D3D12_RESOURCE_FLAG_NONE VK_IMAGE_USAGE_TRANSFER_SRC_BIT| VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT + AMF_SURFACE_USAGE_NONE = 0x00000000, // 0, D3D12_RESOURCE_FLAG_NONE, 0 + AMF_SURFACE_USAGE_SHADER_RESOURCE = 0x00000001, // D3D11_BIND_SHADER_RESOURCE, D3D12_RESOURCE_FLAG_NONE VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT + AMF_SURFACE_USAGE_RENDER_TARGET = 0x00000002, // D3D11_BIND_RENDER_TARGET, D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT + AMF_SURFACE_USAGE_UNORDERED_ACCESS = 0x00000004, // D3D11_BIND_UNORDERED_ACCESS, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT + AMF_SURFACE_USAGE_TRANSFER_SRC = 0x00000008, // D3D12_RESOURCE_FLAG_NONE VK_IMAGE_USAGE_TRANSFER_SRC_BIT + AMF_SURFACE_USAGE_TRANSFER_DST = 0x00000010, // D3D12_RESOURCE_FLAG_NONE VK_IMAGE_USAGE_TRANSFER_DST_BIT + AMF_SURFACE_USAGE_LINEAR = 0x00000020 + } AMF_SURFACE_USAGE_BITS; + typedef amf_flags AMF_SURFACE_USAGE; + //---------------------------------------------------------------------------------------------- + +#if defined(_WIN32) + AMF_WEAK GUID AMFFormatGUID = { 0x8cd592d0, 0x8063, 0x4af8, {0xa7, 0xd0, 0x32, 0x5b, 0xc5, 0xf7, 0x48, 0xab}}; // UINT(AMF_SURFACE_FORMAT), default - AMF_SURFACE_UNKNOWN; to be set on ID3D11Texture2D objects when used natively (i.e. force UYVY on DXGI_FORMAT_YUY2 texture) +#endif + + //---------------------------------------------------------------------------------------------- + // frame type + //---------------------------------------------------------------------------------------------- + typedef enum AMF_FRAME_TYPE + { + // flags + AMF_FRAME_STEREO_FLAG = 0x10000000, + AMF_FRAME_LEFT_FLAG = AMF_FRAME_STEREO_FLAG | 0x20000000, + AMF_FRAME_RIGHT_FLAG = AMF_FRAME_STEREO_FLAG | 0x40000000, + AMF_FRAME_BOTH_FLAG = AMF_FRAME_LEFT_FLAG | AMF_FRAME_RIGHT_FLAG, + AMF_FRAME_INTERLEAVED_FLAG = 0x01000000, + AMF_FRAME_FIELD_FLAG = 0x02000000, + AMF_FRAME_EVEN_FLAG = 0x04000000, + AMF_FRAME_ODD_FLAG = 0x08000000, + + // values + AMF_FRAME_UNKNOWN =-1, + AMF_FRAME_PROGRESSIVE = 0, + + AMF_FRAME_INTERLEAVED_EVEN_FIRST = AMF_FRAME_INTERLEAVED_FLAG | AMF_FRAME_EVEN_FLAG, + AMF_FRAME_INTERLEAVED_ODD_FIRST = AMF_FRAME_INTERLEAVED_FLAG | AMF_FRAME_ODD_FLAG, + AMF_FRAME_FIELD_SINGLE_EVEN = AMF_FRAME_FIELD_FLAG | AMF_FRAME_EVEN_FLAG, + AMF_FRAME_FIELD_SINGLE_ODD = AMF_FRAME_FIELD_FLAG | AMF_FRAME_ODD_FLAG, + + AMF_FRAME_STEREO_LEFT = AMF_FRAME_LEFT_FLAG, + AMF_FRAME_STEREO_RIGHT = AMF_FRAME_RIGHT_FLAG, + AMF_FRAME_STEREO_BOTH = AMF_FRAME_BOTH_FLAG, + + AMF_FRAME_INTERLEAVED_EVEN_FIRST_STEREO_LEFT = AMF_FRAME_INTERLEAVED_FLAG | AMF_FRAME_EVEN_FLAG | AMF_FRAME_LEFT_FLAG, + AMF_FRAME_INTERLEAVED_EVEN_FIRST_STEREO_RIGHT = AMF_FRAME_INTERLEAVED_FLAG | AMF_FRAME_EVEN_FLAG | AMF_FRAME_RIGHT_FLAG, + AMF_FRAME_INTERLEAVED_EVEN_FIRST_STEREO_BOTH = AMF_FRAME_INTERLEAVED_FLAG | AMF_FRAME_EVEN_FLAG | AMF_FRAME_BOTH_FLAG, + + AMF_FRAME_INTERLEAVED_ODD_FIRST_STEREO_LEFT = AMF_FRAME_INTERLEAVED_FLAG | AMF_FRAME_ODD_FLAG | AMF_FRAME_LEFT_FLAG, + AMF_FRAME_INTERLEAVED_ODD_FIRST_STEREO_RIGHT = AMF_FRAME_INTERLEAVED_FLAG | AMF_FRAME_ODD_FLAG | AMF_FRAME_RIGHT_FLAG, + AMF_FRAME_INTERLEAVED_ODD_FIRST_STEREO_BOTH = AMF_FRAME_INTERLEAVED_FLAG | AMF_FRAME_ODD_FLAG | AMF_FRAME_BOTH_FLAG, + } AMF_FRAME_TYPE; + + typedef enum AMF_ROTATION_ENUM + { + AMF_ROTATION_NONE = 0, + AMF_ROTATION_90 = 1, + AMF_ROTATION_180 = 2, + AMF_ROTATION_270 = 3, + } AMF_ROTATION_ENUM; + + #define AMF_SURFACE_ROTATION L"Rotation" // amf_int64(AMF_ROTATION_ENUM); default = AMF_ROTATION_NONE, can be set on surfaces + + //---------------------------------------------------------------------------------------------- + // AMFSurfaceObserver interface - callback; is called before internal release resources. + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMFSurface; + class AMF_NO_VTABLE AMFSurfaceObserver + { + public: + virtual void AMF_STD_CALL OnSurfaceDataRelease(AMFSurface* pSurface) = 0; + }; +#else // #if defined(__cplusplus) + typedef struct AMFSurface AMFSurface; + typedef struct AMFSurfaceObserver AMFSurfaceObserver; + + typedef struct AMFSurfaceObserverVtbl + { + void (AMF_STD_CALL *OnSurfaceDataRelease)(AMFSurfaceObserver* pThis, AMFSurface* pSurface); + } AMFSurfaceObserverVtbl; + + struct AMFSurfaceObserver + { + const AMFSurfaceObserverVtbl *pVtbl; + }; +#endif // #if defined(__cplusplus) + + //---------------------------------------------------------------------------------------------- + // AMFSurface interface + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFSurface : public AMFData + { + public: + AMF_DECLARE_IID(0x3075dbe3, 0x8718, 0x4cfa, 0x86, 0xfb, 0x21, 0x14, 0xc0, 0xa5, 0xa4, 0x51) + + virtual AMF_SURFACE_FORMAT AMF_STD_CALL GetFormat() = 0; + + // do not store planes outside. should be used together with Surface + virtual amf_size AMF_STD_CALL GetPlanesCount() = 0; + virtual AMFPlane* AMF_STD_CALL GetPlaneAt(amf_size index) = 0; + virtual AMFPlane* AMF_STD_CALL GetPlane(AMF_PLANE_TYPE type) = 0; + + virtual AMF_FRAME_TYPE AMF_STD_CALL GetFrameType() = 0; + virtual void AMF_STD_CALL SetFrameType(AMF_FRAME_TYPE type) = 0; + + virtual AMF_RESULT AMF_STD_CALL SetCrop(amf_int32 x,amf_int32 y, amf_int32 width, amf_int32 height) = 0; + virtual AMF_RESULT AMF_STD_CALL CopySurfaceRegion(AMFSurface* pDest, amf_int32 dstX, amf_int32 dstY, amf_int32 srcX, amf_int32 srcY, amf_int32 width, amf_int32 height) = 0; + + // Observer management +#ifdef __clang__ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Woverloaded-virtual" +#endif + virtual void AMF_STD_CALL AddObserver(AMFSurfaceObserver* pObserver) = 0; + virtual void AMF_STD_CALL RemoveObserver(AMFSurfaceObserver* pObserver) = 0; +#ifdef __clang__ + #pragma clang diagnostic pop +#endif + + }; + //---------------------------------------------------------------------------------------------- + // smart pointer + //---------------------------------------------------------------------------------------------- + typedef AMFInterfacePtr_T<AMFSurface> AMFSurfacePtr; + //---------------------------------------------------------------------------------------------- +#else // #if defined(__cplusplus) + AMF_DECLARE_IID(AMFSurface, 0x3075dbe3, 0x8718, 0x4cfa, 0x86, 0xfb, 0x21, 0x14, 0xc0, 0xa5, 0xa4, 0x51) + typedef struct AMFSurfaceVtbl + { + // AMFInterface interface + amf_long (AMF_STD_CALL *Acquire)(AMFSurface* pThis); + amf_long (AMF_STD_CALL *Release)(AMFSurface* pThis); + enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFSurface* pThis, const struct AMFGuid *interfaceID, void** ppInterface); + + // AMFPropertyStorage interface + AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFSurface* pThis, const wchar_t* name, AMFVariantStruct value); + AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFSurface* pThis, const wchar_t* name, AMFVariantStruct* pValue); + amf_bool (AMF_STD_CALL *HasProperty)(AMFSurface* pThis, const wchar_t* name); + amf_size (AMF_STD_CALL *GetPropertyCount)(AMFSurface* pThis); + AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFSurface* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue); + AMF_RESULT (AMF_STD_CALL *Clear)(AMFSurface* pThis); + AMF_RESULT (AMF_STD_CALL *AddTo)(AMFSurface* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep); + AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFSurface* pThis, AMFPropertyStorage* pDest, amf_bool deep); + void (AMF_STD_CALL *AddObserver)(AMFSurface* pThis, AMFPropertyStorageObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver)(AMFSurface* pThis, AMFPropertyStorageObserver* pObserver); + + // AMFData interface + + AMF_MEMORY_TYPE (AMF_STD_CALL *GetMemoryType)(AMFSurface* pThis); + + AMF_RESULT (AMF_STD_CALL *Duplicate)(AMFSurface* pThis, AMF_MEMORY_TYPE type, AMFData** ppData); + AMF_RESULT (AMF_STD_CALL *Convert)(AMFSurface* pThis, AMF_MEMORY_TYPE type); // optimal interop if possilble. Copy through host memory if needed + AMF_RESULT (AMF_STD_CALL *Interop)(AMFSurface* pThis, AMF_MEMORY_TYPE type); // only optimal interop if possilble. No copy through host memory for GPU objects + + AMF_DATA_TYPE (AMF_STD_CALL *GetDataType)(AMFSurface* pThis); + + amf_bool (AMF_STD_CALL *IsReusable)(AMFSurface* pThis); + + void (AMF_STD_CALL *SetPts)(AMFSurface* pThis, amf_pts pts); + amf_pts (AMF_STD_CALL *GetPts)(AMFSurface* pThis); + void (AMF_STD_CALL *SetDuration)(AMFSurface* pThis, amf_pts duration); + amf_pts (AMF_STD_CALL *GetDuration)(AMFSurface* pThis); + + // AMFSurface interface + + AMF_SURFACE_FORMAT (AMF_STD_CALL *GetFormat)(AMFSurface* pThis); + + // do not store planes outside. should be used together with Surface + amf_size (AMF_STD_CALL *GetPlanesCount)(AMFSurface* pThis); + AMFPlane* (AMF_STD_CALL *GetPlaneAt)(AMFSurface* pThis, amf_size index); + AMFPlane* (AMF_STD_CALL *GetPlane)(AMFSurface* pThis, AMF_PLANE_TYPE type); + + AMF_FRAME_TYPE (AMF_STD_CALL *GetFrameType)(AMFSurface* pThis); + void (AMF_STD_CALL *SetFrameType)(AMFSurface* pThis, AMF_FRAME_TYPE type); + + AMF_RESULT (AMF_STD_CALL *SetCrop)(AMFSurface* pThis, amf_int32 x,amf_int32 y, amf_int32 width, amf_int32 height); + AMF_RESULT (AMF_STD_CALL *CopySurfaceRegion)(AMFSurface* pThis, AMFSurface* pDest, amf_int32 dstX, amf_int32 dstY, amf_int32 srcX, amf_int32 srcY, amf_int32 width, amf_int32 height); + + + // Observer management + void (AMF_STD_CALL *AddObserver_Surface)(AMFSurface* pThis, AMFSurfaceObserver* pObserver); + void (AMF_STD_CALL *RemoveObserver_Surface)(AMFSurface* pThis, AMFSurfaceObserver* pObserver); + + } AMFSurfaceVtbl; + + struct AMFSurface + { + const AMFSurfaceVtbl *pVtbl; + }; +#endif // #if defined(__cplusplus) +#if defined(__cplusplus) +} +#endif +#if defined(_MSC_VER) + #pragma warning( pop ) +#endif +#endif //#ifndef AMF_Surface_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Trace.h
Added
@@ -0,0 +1,183 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_Trace_h +#define AMF_Trace_h +#pragma once + +#include "Platform.h" +#include "Result.h" +#include "Surface.h" +#include "AudioBuffer.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif + //---------------------------------------------------------------------------------------------- + // trace levels + //---------------------------------------------------------------------------------------------- + #define AMF_TRACE_ERROR 0 + #define AMF_TRACE_WARNING 1 + #define AMF_TRACE_INFO 2 // default in sdk + #define AMF_TRACE_DEBUG 3 + #define AMF_TRACE_TRACE 4 + + #define AMF_TRACE_TEST 5 + #define AMF_TRACE_NOLOG 100 + + //---------------------------------------------------------------------------------------------- + // available trace writers + //---------------------------------------------------------------------------------------------- + #define AMF_TRACE_WRITER_CONSOLE L"Console" + #define AMF_TRACE_WRITER_DEBUG_OUTPUT L"DebugOutput" + #define AMF_TRACE_WRITER_FILE L"File" + + //---------------------------------------------------------------------------------------------- + // AMFTraceWriter interface - callback + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFTraceWriter + { + public: + virtual void AMF_CDECL_CALL Write(const wchar_t* scope, const wchar_t* message) = 0; + virtual void AMF_CDECL_CALL Flush() = 0; + }; +#else // #if defined(__cplusplus) + typedef struct AMFTraceWriter AMFTraceWriter; + + typedef struct AMFTraceWriterVtbl + { + // AMFTraceWriter interface + void (AMF_CDECL_CALL *Write)(AMFTraceWriter* pThis, const wchar_t* scope, const wchar_t* message); + void (AMF_CDECL_CALL *Flush)(AMFTraceWriter* pThis); + } AMFTraceWriterVtbl; + + struct AMFTraceWriter + { + const AMFTraceWriterVtbl *pVtbl; + }; + +#endif // #if defined(__cplusplus) + + //---------------------------------------------------------------------------------------------- + // AMFTrace interface - singleton + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + class AMF_NO_VTABLE AMFTrace + { + public: + virtual void AMF_STD_CALL TraceW(const wchar_t* src_path, amf_int32 line, amf_int32 level, const wchar_t* scope,amf_int32 countArgs, const wchar_t* format, ...) = 0; + virtual void AMF_STD_CALL Trace(const wchar_t* src_path, amf_int32 line, amf_int32 level, const wchar_t* scope, const wchar_t* message, va_list* pArglist) = 0; + + virtual amf_int32 AMF_STD_CALL SetGlobalLevel(amf_int32 level) = 0; + virtual amf_int32 AMF_STD_CALL GetGlobalLevel() = 0; + + virtual amf_bool AMF_STD_CALL EnableWriter(const wchar_t* writerID, bool enable) = 0; + virtual amf_bool AMF_STD_CALL WriterEnabled(const wchar_t* writerID) = 0; + virtual AMF_RESULT AMF_STD_CALL TraceEnableAsync(amf_bool enable) = 0; + virtual AMF_RESULT AMF_STD_CALL TraceFlush() = 0; + virtual AMF_RESULT AMF_STD_CALL SetPath(const wchar_t* path) = 0; + virtual AMF_RESULT AMF_STD_CALL GetPath(wchar_t* path, amf_size* pSize) = 0; + virtual amf_int32 AMF_STD_CALL SetWriterLevel(const wchar_t* writerID, amf_int32 level) = 0; + virtual amf_int32 AMF_STD_CALL GetWriterLevel(const wchar_t* writerID) = 0; + virtual amf_int32 AMF_STD_CALL SetWriterLevelForScope(const wchar_t* writerID, const wchar_t* scope, amf_int32 level) = 0; + virtual amf_int32 AMF_STD_CALL GetWriterLevelForScope(const wchar_t* writerID, const wchar_t* scope) = 0; + + virtual amf_int32 AMF_STD_CALL GetIndentation() = 0; + virtual void AMF_STD_CALL Indent(amf_int32 addIndent) = 0; + + virtual void AMF_STD_CALL RegisterWriter(const wchar_t* writerID, AMFTraceWriter* pWriter, amf_bool enable) = 0; + virtual void AMF_STD_CALL UnregisterWriter(const wchar_t* writerID) = 0; + + virtual const wchar_t* AMF_STD_CALL GetResultText(AMF_RESULT res) = 0; + virtual const wchar_t* AMF_STD_CALL SurfaceGetFormatName(const AMF_SURFACE_FORMAT eSurfaceFormat) = 0; + virtual AMF_SURFACE_FORMAT AMF_STD_CALL SurfaceGetFormatByName(const wchar_t* name) = 0; + + virtual const wchar_t* AMF_STD_CALL GetMemoryTypeName(const AMF_MEMORY_TYPE memoryType) = 0; + virtual AMF_MEMORY_TYPE AMF_STD_CALL GetMemoryTypeByName(const wchar_t* name) = 0; + + virtual const wchar_t* AMF_STD_CALL GetSampleFormatName(const AMF_AUDIO_FORMAT eFormat) = 0; + virtual AMF_AUDIO_FORMAT AMF_STD_CALL GetSampleFormatByName(const wchar_t* name) = 0; + }; +#else // #if defined(__cplusplus) + typedef struct AMFTrace AMFTrace; + + typedef struct AMFTraceVtbl + { + // AMFTrace interface + void (AMF_STD_CALL *TraceW)(AMFTrace* pThis, const wchar_t* src_path, amf_int32 line, amf_int32 level, const wchar_t* scope,amf_int32 countArgs, const wchar_t* format, ...); + void (AMF_STD_CALL *Trace)(AMFTrace* pThis, const wchar_t* src_path, amf_int32 line, amf_int32 level, const wchar_t* scope, const wchar_t* message, va_list* pArglist); + + amf_int32 (AMF_STD_CALL *SetGlobalLevel)(AMFTrace* pThis, amf_int32 level); + amf_int32 (AMF_STD_CALL *GetGlobalLevel)(AMFTrace* pThis); + + amf_bool (AMF_STD_CALL *EnableWriter)(AMFTrace* pThis, const wchar_t* writerID, amf_bool enable); + amf_bool (AMF_STD_CALL *WriterEnabled)(AMFTrace* pThis, const wchar_t* writerID); + AMF_RESULT (AMF_STD_CALL *TraceEnableAsync)(AMFTrace* pThis, amf_bool enable); + AMF_RESULT (AMF_STD_CALL *TraceFlush)(AMFTrace* pThis); + AMF_RESULT (AMF_STD_CALL *SetPath)(AMFTrace* pThis, const wchar_t* path); + AMF_RESULT (AMF_STD_CALL *GetPath)(AMFTrace* pThis, wchar_t* path, amf_size* pSize); + amf_int32 (AMF_STD_CALL *SetWriterLevel)(AMFTrace* pThis, const wchar_t* writerID, amf_int32 level); + amf_int32 (AMF_STD_CALL *GetWriterLevel)(AMFTrace* pThis, const wchar_t* writerID); + amf_int32 (AMF_STD_CALL *SetWriterLevelForScope)(AMFTrace* pThis, const wchar_t* writerID, const wchar_t* scope, amf_int32 level); + amf_int32 (AMF_STD_CALL *GetWriterLevelForScope)(AMFTrace* pThis, const wchar_t* writerID, const wchar_t* scope); + + amf_int32 (AMF_STD_CALL *GetIndentation)(AMFTrace* pThis); + void (AMF_STD_CALL *Indent)(AMFTrace* pThis, amf_int32 addIndent); + + void (AMF_STD_CALL *RegisterWriter)(AMFTrace* pThis, const wchar_t* writerID, AMFTraceWriter* pWriter, amf_bool enable); + void (AMF_STD_CALL *UnregisterWriter)(AMFTrace* pThis, const wchar_t* writerID); + + const wchar_t* (AMF_STD_CALL *GetResultText)(AMFTrace* pThis, AMF_RESULT res); + const wchar_t* (AMF_STD_CALL *SurfaceGetFormatName)(AMFTrace* pThis, const AMF_SURFACE_FORMAT eSurfaceFormat); + AMF_SURFACE_FORMAT (AMF_STD_CALL *SurfaceGetFormatByName)(AMFTrace* pThis, const wchar_t* name); + + const wchar_t* (AMF_STD_CALL *GetMemoryTypeName)(AMFTrace* pThis, const AMF_MEMORY_TYPE memoryType); + AMF_MEMORY_TYPE (AMF_STD_CALL *GetMemoryTypeByName)(AMFTrace* pThis, const wchar_t* name); + + const wchar_t* (AMF_STD_CALL *GetSampleFormatName)(AMFTrace* pThis, const AMF_AUDIO_FORMAT eFormat); + AMF_AUDIO_FORMAT (AMF_STD_CALL *GetSampleFormatByName)(AMFTrace* pThis, const wchar_t* name); + } AMFTraceVtbl; + + struct AMFTrace + { + const AMFTraceVtbl *pVtbl; + }; + +#endif +#if defined(__cplusplus) +} +#endif + + +#endif // AMF_Trace_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Variant.h
Added
@@ -0,0 +1,2075 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef AMF_Variant_h +#define AMF_Variant_h +#pragma once +#if defined(_MSC_VER) + #pragma warning(disable: 4996) +#endif + +#include "Interface.h" +#include <locale.h> +#include <wchar.h> +#include <string.h> + +#if defined(__cplusplus) +namespace amf +{ +#endif + //---------------------------------------------------------------------------------------------- + // variant types + //---------------------------------------------------------------------------------------------- + typedef enum AMF_VARIANT_TYPE + { + AMF_VARIANT_EMPTY = 0, + + AMF_VARIANT_BOOL = 1, + AMF_VARIANT_INT64 = 2, + AMF_VARIANT_DOUBLE = 3, + + AMF_VARIANT_RECT = 4, + AMF_VARIANT_SIZE = 5, + AMF_VARIANT_POINT = 6, + AMF_VARIANT_RATE = 7, + AMF_VARIANT_RATIO = 8, + AMF_VARIANT_COLOR = 9, + + AMF_VARIANT_STRING = 10, // value is char* + AMF_VARIANT_WSTRING = 11, // value is wchar_t* + AMF_VARIANT_INTERFACE = 12, // value is AMFInterface* + AMF_VARIANT_FLOAT = 13, + + AMF_VARIANT_FLOAT_SIZE = 14, + AMF_VARIANT_FLOAT_POINT2D = 15, + AMF_VARIANT_FLOAT_POINT3D = 16, + AMF_VARIANT_FLOAT_VECTOR4D = 17 + } AMF_VARIANT_TYPE; + //---------------------------------------------------------------------------------------------- + // variant struct + //---------------------------------------------------------------------------------------------- + typedef struct AMFVariantStruct + { + AMF_VARIANT_TYPE type; + union + { + amf_bool boolValue; + amf_int64 int64Value; + amf_double doubleValue; + char* stringValue; + wchar_t* wstringValue; + AMFInterface* pInterface; + struct AMFRect rectValue; + struct AMFSize sizeValue; + struct AMFPoint pointValue; + struct AMFRate rateValue; + struct AMFRatio ratioValue; + struct AMFColor colorValue; + amf_float floatValue; + struct AMFFloatSize floatSizeValue; + struct AMFFloatPoint2D floatPoint2DValue; + struct AMFFloatPoint3D floatPoint3DValue; + struct AMFFloatVector4D floatVector4DValue; + }; + } AMFVariantStruct; + //---------------------------------------------------------------------------------------------- + // variant accessors + //---------------------------------------------------------------------------------------------- + + static AMF_INLINE AMF_VARIANT_TYPE AMF_STD_CALL AMFVariantGetType(const AMFVariantStruct* _variant) { return (_variant)->type; } +#if defined(__cplusplus) + static AMF_INLINE AMF_VARIANT_TYPE& AMF_STD_CALL AMFVariantGetType(AMFVariantStruct* _variant) { return (_variant)->type; } +#endif + static AMF_INLINE amf_bool AMF_STD_CALL AMFVariantGetBool(const AMFVariantStruct* _variant) { return (_variant)->boolValue; } + static AMF_INLINE amf_int64 AMF_STD_CALL AMFVariantGetInt64(const AMFVariantStruct* _variant) { return (_variant)->int64Value; } + static AMF_INLINE amf_double AMF_STD_CALL AMFVariantGetDouble(const AMFVariantStruct* _variant) { return (_variant)->doubleValue; } + static AMF_INLINE amf_float AMF_STD_CALL AMFVariantGetFloat(const AMFVariantStruct* _variant) { return (_variant)->floatValue; } + static AMF_INLINE const char* AMF_STD_CALL AMFVariantGetString(const AMFVariantStruct* _variant) { return (_variant)->stringValue; } + static AMF_INLINE const wchar_t* AMF_STD_CALL AMFVariantGetWString(const AMFVariantStruct* _variant) { return (_variant)->wstringValue; } +#if defined(__cplusplus) + static AMF_INLINE const AMFInterface* AMF_STD_CALL AMFVariantGetInterface(const AMFVariantStruct* _variant) { return (_variant)->pInterface; } +#endif + static AMF_INLINE AMFInterface* AMF_STD_CALL AMFVariantGetInterface(AMFVariantStruct* _variant) { return (_variant)->pInterface; } + +#if defined(__cplusplus) + static AMF_INLINE const AMFRect & AMF_STD_CALL AMFVariantGetRect (const AMFVariantStruct* _variant) { return (_variant)->rectValue; } + static AMF_INLINE const AMFSize & AMF_STD_CALL AMFVariantGetSize (const AMFVariantStruct* _variant) { return (_variant)->sizeValue; } + static AMF_INLINE const AMFPoint& AMF_STD_CALL AMFVariantGetPoint(const AMFVariantStruct* _variant) { return (_variant)->pointValue; } + static AMF_INLINE const AMFFloatSize& AMF_STD_CALL AMFVariantGetFloatSize(const AMFVariantStruct* _variant) { return (_variant)->floatSizeValue; } + static AMF_INLINE const AMFFloatPoint2D& AMF_STD_CALL AMFVariantGetFloatPoint2D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint2DValue; } + static AMF_INLINE const AMFFloatPoint3D& AMF_STD_CALL AMFVariantGetFloatPoint3D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint3DValue; } + static AMF_INLINE const AMFFloatVector4D& AMF_STD_CALL AMFVariantGetFloatVector4D(const AMFVariantStruct* _variant) { return (_variant)->floatVector4DValue; } + static AMF_INLINE const AMFRate & AMF_STD_CALL AMFVariantGetRate (const AMFVariantStruct* _variant) { return (_variant)->rateValue; } + static AMF_INLINE const AMFRatio& AMF_STD_CALL AMFVariantGetRatio(const AMFVariantStruct* _variant) { return (_variant)->ratioValue; } + static AMF_INLINE const AMFColor& AMF_STD_CALL AMFVariantGetColor(const AMFVariantStruct* _variant) { return (_variant)->colorValue; } +#else // #if defined(__cplusplus) + static AMF_INLINE const AMFRect AMF_STD_CALL AMFVariantGetRect (const AMFVariantStruct* _variant) { return (_variant)->rectValue; } + static AMF_INLINE const AMFSize AMF_STD_CALL AMFVariantGetSize (const AMFVariantStruct* _variant) { return (_variant)->sizeValue; } + static AMF_INLINE const AMFPoint AMF_STD_CALL AMFVariantGetPoint(const AMFVariantStruct* _variant) { return (_variant)->pointValue; } + static AMF_INLINE const AMFFloatSize AMF_STD_CALL AMFVariantGetFloatSize(const AMFVariantStruct* _variant) { return (_variant)->floatSizeValue; } + static AMF_INLINE const AMFFloatPoint2D AMF_STD_CALL AMFVariantGetFloatPoint2D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint2DValue; } + static AMF_INLINE const AMFFloatPoint3D AMF_STD_CALL AMFVariantGetFloatPoint3D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint3DValue; } + static AMF_INLINE const AMFFloatVector4D AMF_STD_CALL AMFVariantGetFloatVector4D(const AMFVariantStruct* _variant) { return (_variant)->floatVector4DValue; } + static AMF_INLINE const AMFRate AMF_STD_CALL AMFVariantGetRate (const AMFVariantStruct* _variant) { return (_variant)->rateValue; } + static AMF_INLINE const AMFRatio AMF_STD_CALL AMFVariantGetRatio(const AMFVariantStruct* _variant) { return (_variant)->ratioValue; } + static AMF_INLINE const AMFColor AMF_STD_CALL AMFVariantGetColor(const AMFVariantStruct* _variant) { return (_variant)->colorValue; } +#endif // #if defined(__cplusplus) + + + #define AMFVariantEmpty(_variant) 0 + #define AMFVariantBool(_variant) (_variant)->boolValue + #define AMFVariantInt64(_variant) (_variant)->int64Value + #define AMFVariantDouble(_variant) (_variant)->doubleValue + #define AMFVariantFloat(_variant) (_variant)->floatValue + + #define AMFVariantRect(_variant) (_variant)->rectValue + #define AMFVariantSize(_variant) (_variant)->sizeValue + #define AMFVariantPoint(_variant) (_variant)->pointValue + #define AMFVariantFloatSize(_variant) (_variant)->floatSizeValue + #define AMFVariantFloatPoint2D(_variant) (_variant)->floatPoint2DValue + #define AMFVariantFloatPoint3D(_variant) (_variant)->floatPoint3DValue + #define AMFVariantFloatVector4D(_variant) (_variant)->floatVector4DValue + #define AMFVariantRate(_variant) (_variant)->rateValue + #define AMFVariantRatio(_variant) (_variant)->ratioValue + #define AMFVariantColor(_variant) (_variant)->colorValue + + #define AMFVariantString(_variant) (_variant)->stringValue + #define AMFVariantWString(_variant) (_variant)->wstringValue + #define AMFVariantInterface(_variant) (_variant)->pInterface + //---------------------------------------------------------------------------------------------- + // variant hleper functions + //---------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantInit(AMFVariantStruct* pVariant); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantClear(AMFVariantStruct* pVariant); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantCompare(const AMFVariantStruct* pFirst, const AMFVariantStruct* pSecond, amf_bool* equal); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantCopy(AMFVariantStruct* pDest, const AMFVariantStruct* pSrc); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignBool(AMFVariantStruct* pDest, amf_bool value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignInt64(AMFVariantStruct* pDest, amf_int64 value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignDouble(AMFVariantStruct* pDest, amf_double value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloat(AMFVariantStruct* pDest, amf_float value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignString(AMFVariantStruct* pDest, const char* value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignWString(AMFVariantStruct* pDest, const wchar_t* value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignInterface(AMFVariantStruct* pDest, AMFInterface* value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRect(AMFVariantStruct* pDest, const AMFRect* value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignSize(AMFVariantStruct* pDest, const AMFSize* value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignPoint(AMFVariantStruct* pDest, const AMFPoint* value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatSize(AMFVariantStruct* pDest, const AMFFloatSize* value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint2D(AMFVariantStruct* pDest, const AMFFloatPoint2D* value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint3D(AMFVariantStruct* pDest, const AMFFloatPoint3D* value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatVector4D(AMFVariantStruct* pDest, const AMFFloatVector4D* value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRate(AMFVariantStruct* pDest, const AMFRate* value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRatio(AMFVariantStruct* pDest, const AMFRatio* value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignColor(AMFVariantStruct* pDest, const AMFColor* value); + +#if defined(__cplusplus) + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRect(AMFVariantStruct* pDest, const AMFRect& value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignSize(AMFVariantStruct* pDest, const AMFSize& value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignPoint(AMFVariantStruct* pDest, const AMFPoint& value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatSize(AMFVariantStruct* pDest, const AMFFloatSize& value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint2D(AMFVariantStruct* pDest, const AMFFloatPoint2D& value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint3D(AMFVariantStruct* pDest, const AMFFloatPoint3D& value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatVector4D(AMFVariantStruct* pDest, const AMFFloatVector4D& value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRate(AMFVariantStruct* pDest, const AMFRate& value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRatio(AMFVariantStruct* pDest, const AMFRatio& value); + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignColor(AMFVariantStruct* pDest, const AMFColor& value); + + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantChangeType(AMFVariantStruct* pDest, const AMFVariantStruct* pSrc, AMF_VARIANT_TYPE newType); +#endif + static AMF_INLINE char* AMF_CDECL_CALL AMFVariantDuplicateString(const char* from); + static AMF_INLINE void AMF_CDECL_CALL AMFVariantFreeString(char* from); + static AMF_INLINE wchar_t* AMF_CDECL_CALL AMFVariantDuplicateWString(const wchar_t* from); + static AMF_INLINE void AMF_CDECL_CALL AMFVariantFreeWString(wchar_t* from); + +#if defined(__cplusplus) + //---------------------------------------------------------------------------------------------- + // AMF_INLINE Variant helper class + //---------------------------------------------------------------------------------------------- + class AMFVariant : public AMFVariantStruct + { + public: + class String; + class WString; + + public: + AMFVariant() { AMFVariantInit(this); } + explicit AMFVariant(const AMFVariantStruct& other) { AMFVariantInit(this); AMFVariantCopy(this, const_cast<AMFVariantStruct*>(&other)); } + + explicit AMFVariant(const AMFVariantStruct* pOther); + template<typename T> + explicit AMFVariant(const AMFInterfacePtr_T<T>& pValue); + + AMFVariant(const AMFVariant& other) { AMFVariantInit(this); AMFVariantCopy(this, const_cast<AMFVariantStruct*>(static_cast<const AMFVariantStruct*>(&other))); } + + explicit AMF_INLINE AMFVariant(amf_bool value) { AMFVariantInit(this); AMFVariantAssignBool(this, value); } + explicit AMF_INLINE AMFVariant(amf_int64 value) { AMFVariantInit(this); AMFVariantAssignInt64(this, value); } + explicit AMF_INLINE AMFVariant(amf_uint64 value) { AMFVariantInit(this); AMFVariantAssignInt64(this, (amf_int64)value); } + explicit AMF_INLINE AMFVariant(amf_int32 value) { AMFVariantInit(this); AMFVariantAssignInt64(this, value); } + explicit AMF_INLINE AMFVariant(amf_uint32 value) { AMFVariantInit(this); AMFVariantAssignInt64(this, value); } + explicit AMF_INLINE AMFVariant(amf_double value) { AMFVariantInit(this); AMFVariantAssignDouble(this, value); } + explicit AMF_INLINE AMFVariant(amf_float value) { AMFVariantInit(this); AMFVariantAssignFloat(this, value); } + explicit AMF_INLINE AMFVariant(const AMFRect & value) { AMFVariantInit(this); AMFVariantAssignRect(this, &value); } + explicit AMF_INLINE AMFVariant(const AMFSize & value) { AMFVariantInit(this); AMFVariantAssignSize(this, &value); } + explicit AMF_INLINE AMFVariant(const AMFPoint& value) { AMFVariantInit(this); AMFVariantAssignPoint(this, &value); } + explicit AMF_INLINE AMFVariant(const AMFFloatSize& value) { AMFVariantInit(this); AMFVariantAssignFloatSize(this, &value); } + explicit AMF_INLINE AMFVariant(const AMFFloatPoint2D& value) { AMFVariantInit(this); AMFVariantAssignFloatPoint2D(this, &value); } + explicit AMF_INLINE AMFVariant(const AMFFloatPoint3D& value) { AMFVariantInit(this); AMFVariantAssignFloatPoint3D(this, &value); } + explicit AMF_INLINE AMFVariant(const AMFFloatVector4D& value) { AMFVariantInit(this); AMFVariantAssignFloatVector4D(this, &value); } + explicit AMF_INLINE AMFVariant(const AMFRate & value) { AMFVariantInit(this); AMFVariantAssignRate(this, &value); } + explicit AMF_INLINE AMFVariant(const AMFRatio& value) { AMFVariantInit(this); AMFVariantAssignRatio(this, &value); } + explicit AMF_INLINE AMFVariant(const AMFColor& value) { AMFVariantInit(this); AMFVariantAssignColor(this, &value); } + explicit AMF_INLINE AMFVariant(const char* value) { AMFVariantInit(this); AMFVariantAssignString(this, value); } + explicit AMF_INLINE AMFVariant(const wchar_t* value) { AMFVariantInit(this); AMFVariantAssignWString(this, value); } + explicit AMF_INLINE AMFVariant(AMFInterface* pValue) { AMFVariantInit(this); AMFVariantAssignInterface(this, pValue); } + + ~AMFVariant() { AMFVariantClear(this); } + + AMFVariant& operator=(const AMFVariantStruct& other); + AMFVariant& operator=(const AMFVariantStruct* pOther); + AMFVariant& operator=(const AMFVariant& other); + + AMFVariant& operator=(amf_bool value) { AMFVariantAssignBool(this, value); return *this;} + AMFVariant& operator=(amf_int64 value) { AMFVariantAssignInt64(this, value); return *this;} + AMFVariant& operator=(amf_uint64 value) { AMFVariantAssignInt64(this, (amf_int64)value); return *this;} + AMFVariant& operator=(amf_int32 value) { AMFVariantAssignInt64(this, value); return *this;} + AMFVariant& operator=(amf_uint32 value) { AMFVariantAssignInt64(this, value); return *this;} + AMFVariant& operator=(amf_double value) { AMFVariantAssignDouble(this, value); return *this;} + AMFVariant& operator=(amf_float value) { AMFVariantAssignFloat(this, value); return *this; } + AMFVariant& operator=(const AMFRect & value) { AMFVariantAssignRect(this, &value); return *this;} + AMFVariant& operator=(const AMFSize & value) { AMFVariantAssignSize(this, &value); return *this;} + AMFVariant& operator=(const AMFPoint& value) { AMFVariantAssignPoint(this, &value); return *this;} + AMFVariant& operator=(const AMFFloatSize& value) { AMFVariantAssignFloatSize(this, &value); return *this; } + AMFVariant& operator=(const AMFFloatPoint2D& value) { AMFVariantAssignFloatPoint2D(this, &value); return *this; } + AMFVariant& operator=(const AMFFloatPoint3D& value) { AMFVariantAssignFloatPoint3D(this, &value); return *this; } + AMFVariant& operator=(const AMFFloatVector4D& value) { AMFVariantAssignFloatVector4D(this, &value); return *this; } + AMFVariant& operator=(const AMFRate & value) { AMFVariantAssignRate(this, &value); return *this;} + AMFVariant& operator=(const AMFRatio& value) { AMFVariantAssignRatio(this, &value); return *this;} + AMFVariant& operator=(const AMFColor& value) { AMFVariantAssignColor(this, &value); return *this;} + AMFVariant& operator=(const char* value) { AMFVariantAssignString(this, value); return *this;} + AMFVariant& operator=(const wchar_t* value) { AMFVariantAssignWString(this, value); return *this;} + AMFVariant& operator=(AMFInterface* value) { AMFVariantAssignInterface(this, value); return *this;} + + template<typename T> AMFVariant& operator=(const AMFInterfacePtr_T<T>& value); + + operator amf_bool() const { return ToBool(); } + operator amf_int64() const { return ToInt64(); } + operator amf_uint64() const { return ToUInt64(); } + operator amf_int32() const { return ToInt32(); } + operator amf_uint32() const { return ToUInt32(); } + operator amf_double() const { return ToDouble(); } + operator amf_float() const { return ToFloat(); } + operator AMFRect () const { return ToRect (); } + operator AMFSize () const { return ToSize (); } + operator AMFPoint() const { return ToPoint(); } + operator AMFFloatSize() const { return ToFloatSize(); } + operator AMFFloatPoint2D() const { return ToFloatPoint2D(); } + operator AMFFloatPoint3D() const { return ToFloatPoint3D(); } + operator AMFFloatVector4D() const { return ToFloatVector4D(); } + operator AMFRate () const { return ToRate (); } + operator AMFRatio() const { return ToRatio(); } + operator AMFColor() const { return ToColor(); } + operator AMFInterface*() const { return ToInterface(); } + + AMF_INLINE amf_bool ToBool() const { return Empty() ? false : GetValue<amf_bool, AMF_VARIANT_BOOL>(AMFVariantGetBool); } + AMF_INLINE amf_int64 ToInt64() const { return Empty() ? 0 : GetValue<amf_int64, AMF_VARIANT_INT64>(AMFVariantGetInt64); } + AMF_INLINE amf_uint64 ToUInt64() const { return Empty() ? 0 : GetValue<amf_uint64, AMF_VARIANT_INT64>(AMFVariantGetInt64); } + AMF_INLINE amf_int32 ToInt32() const { return Empty() ? 0 : GetValue<amf_int32, AMF_VARIANT_INT64>(AMFVariantGetInt64); } + AMF_INLINE amf_uint32 ToUInt32() const { return Empty() ? 0 : GetValue<amf_uint32, AMF_VARIANT_INT64>(AMFVariantGetInt64); } + AMF_INLINE amf_double ToDouble() const { return Empty() ? 0 : GetValue<amf_double, AMF_VARIANT_DOUBLE>(AMFVariantGetDouble); } + AMF_INLINE amf_float ToFloat() const { return Empty() ? 0 : GetValue<amf_float, AMF_VARIANT_FLOAT>(AMFVariantGetFloat); } + AMF_INLINE AMFRect ToRect () const { return Empty() ? AMFRect() : GetValue<AMFRect, AMF_VARIANT_RECT>(AMFVariantGetRect); } + AMF_INLINE AMFSize ToSize () const { return Empty() ? AMFSize() : GetValue<AMFSize, AMF_VARIANT_SIZE>(AMFVariantGetSize); } + AMF_INLINE AMFPoint ToPoint() const { return Empty() ? AMFPoint() : GetValue<AMFPoint, AMF_VARIANT_POINT>(AMFVariantGetPoint); } + AMF_INLINE AMFFloatSize ToFloatSize() const { return Empty() ? AMFFloatSize() : GetValue<AMFFloatSize, AMF_VARIANT_FLOAT_SIZE>(AMFVariantGetFloatSize); } + AMF_INLINE AMFFloatPoint2D ToFloatPoint2D() const { return Empty() ? AMFFloatPoint2D() : GetValue<AMFFloatPoint2D, AMF_VARIANT_FLOAT_POINT2D>(AMFVariantGetFloatPoint2D); } + AMF_INLINE AMFFloatPoint3D ToFloatPoint3D() const { return Empty() ? AMFFloatPoint3D() : GetValue<AMFFloatPoint3D, AMF_VARIANT_FLOAT_POINT3D>(AMFVariantGetFloatPoint3D); } + AMF_INLINE AMFFloatVector4D ToFloatVector4D() const { return Empty() ? AMFFloatVector4D() : GetValue<AMFFloatVector4D, AMF_VARIANT_FLOAT_VECTOR4D>(AMFVariantGetFloatVector4D); } + AMF_INLINE AMFRate ToRate () const { return Empty() ? AMFRate() : GetValue<AMFRate, AMF_VARIANT_RATE>(AMFVariantGetRate); } + AMF_INLINE AMFRatio ToRatio() const { return Empty() ? AMFRatio() : GetValue<AMFRatio, AMF_VARIANT_RATIO>(AMFVariantGetRatio); } + AMF_INLINE AMFColor ToColor() const { return Empty() ? AMFColor() : GetValue<AMFColor, AMF_VARIANT_COLOR>(AMFVariantGetColor); } + AMF_INLINE AMFInterface* ToInterface() const { return AMFVariantGetType(this) == AMF_VARIANT_INTERFACE ? this->pInterface : NULL; } + AMF_INLINE String ToString() const; + AMF_INLINE WString ToWString() const; + + bool operator==(const AMFVariantStruct& other) const; + bool operator==(const AMFVariantStruct* pOther) const; + + bool operator!=(const AMFVariantStruct& other) const; + bool operator!=(const AMFVariantStruct* pOther) const; + + void Clear() { AMFVariantClear(this); } + + void Attach(AMFVariantStruct& variant); + AMFVariantStruct Detach(); + + AMFVariantStruct& GetVariant(); + + void ChangeType(AMF_VARIANT_TYPE type, const AMFVariant* pSrc = NULL); + + bool Empty() const; + private: + template<class ReturnType, AMF_VARIANT_TYPE variantType, typename Getter> + ReturnType GetValue(Getter getter) const; + }; + //---------------------------------------------------------------------------------------------- + // helper String class + //---------------------------------------------------------------------------------------------- + class AMFVariant::String + { + friend class AMFVariant; + private: + void Free() + { + if (m_Str != NULL) + { + AMFVariantFreeString(m_Str); + m_Str = NULL; + } + } + public: + String() :m_Str(NULL){} + String(const char* str) : m_Str(NULL) + { + m_Str = AMFVariantDuplicateString(str); + } + String(const String& p_other) : m_Str(NULL) + { + operator=(p_other); + } + +#if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600) + String(String&& p_other) : m_Str(NULL) + { + operator=(p_other); + } +#endif + ~String() + { + Free(); + } + + char& operator(size_t index) + { + if (index >= size()) + { + resize(index); + } + return m_Strindex; + } + + String& operator=(const String& p_other) + { + Free(); + m_Str = AMFVariantDuplicateString(p_other.m_Str); + return *this; + } +#if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600) + String& operator=(String&& p_other) + { + Free(); + m_Str = p_other.m_Str; + p_other.m_Str = NULL; // Transfer the ownership + return *this; + } +#endif + bool operator==(const String& p_other) const + { + if (m_Str == NULL && p_other.m_Str == NULL) + { + return true; + } + else if ((m_Str == NULL && p_other.m_Str != NULL) || (m_Str != NULL && p_other.m_Str == NULL)) + { + return false; + } + return strcmp(c_str(), p_other.c_str()) == 0; + } + const char* c_str() const { return m_Str; } + size_t size() const + { + if(m_Str == NULL) + { + return 0; + } + return (size_t)strlen(m_Str); + } + + AMF_INLINE size_t length() const { return size(); } + + void resize(size_t sizeAlloc) + { + if(sizeAlloc == 0) + { + Free(); + return; + } + char* str = (char*)amf_variant_alloc(sizeof(char)*(sizeAlloc + 1)); + if(m_Str != NULL) + { + size_t copySize = sizeAlloc; + if(copySize > size()) + { + copySize = size(); + } + memcpy(str, m_Str, copySize * sizeof(char)); + Free(); + strsizeAlloc = 0; + } + m_Str = str; + } + private: + char* m_Str; + }; + //---------------------------------------------------------------------------------------------- + // helper WString class + //---------------------------------------------------------------------------------------------- + class AMFVariant::WString + { + friend class AMFVariant; + private: + void Free() + { + if (m_Str != NULL) + { + AMFVariantFreeWString(m_Str); + m_Str = NULL; + } + } + public: + WString() :m_Str(NULL){} + WString(const wchar_t* str) : m_Str(NULL) + { + m_Str = AMFVariantDuplicateWString(str); + } + WString(const WString& p_other) : m_Str(NULL) + { + operator=(p_other); + } +#if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600) + WString(WString&& p_other) : m_Str(NULL) + { + operator=(p_other); + } +#endif + ~WString() + { + Free(); + } + + WString& operator=(const WString& p_other) + { + Free(); + m_Str = AMFVariantDuplicateWString(p_other.m_Str); + return *this; + } +#if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600) + WString& operator=(WString&& p_other) + { + Free(); + m_Str = p_other.m_Str; + p_other.m_Str = NULL; // Transfer the ownership + return *this; + } +#endif + wchar_t& operator(size_t index) + { + if (index >= size()) + { + resize(index); + } + return m_Strindex; + } + + bool operator==(const WString& p_other) const + { + if (m_Str == NULL && p_other.m_Str == NULL) + { + return true; + } + else if ((m_Str == NULL && p_other.m_Str != NULL) || (m_Str != NULL && p_other.m_Str == NULL)) + { + return false; + } + return wcscmp(c_str(), p_other.c_str()) == 0; + } + + const wchar_t* c_str() const { return m_Str; } + size_t size() const + { + if(m_Str == NULL) + { + return 0; + } + return (size_t)wcslen(m_Str); + } + + AMF_INLINE size_t length() const { return size(); } + + void resize(size_t sizeAlloc) + { + if(sizeAlloc == 0) + { + Free(); + return; + } + wchar_t* str = (wchar_t*)amf_variant_alloc(sizeof(wchar_t)*(sizeAlloc + 1)); + if(m_Str != NULL) + { + size_t copySize = sizeAlloc; + if(copySize > size()) + { + copySize = size(); + } + memcpy(str, m_Str, copySize * sizeof(wchar_t)); + Free(); + strsizeAlloc = 0; + } + m_Str = str; + } + private: + wchar_t* m_Str; + }; + //------------------------------------------------------------------------------------------------- + AMFVariant::String AMFVariant::ToString() const + { + String temp = GetValue<String, AMF_VARIANT_STRING>(AMFVariantGetString); + return String(temp.c_str()); + } + //------------------------------------------------------------------------------------------------- + AMFVariant::WString AMFVariant::ToWString() const + { + WString temp = GetValue<WString, AMF_VARIANT_WSTRING>(AMFVariantGetWString); + return WString(temp.c_str()); + } +#endif // defined(__cplusplus) + //---------------------------------------------------------------------------------------------- + // AMF_INLINE implementation of helper functions + //---------------------------------------------------------------------------------------------- + #define AMF_VARIANT_RETURN_IF_INVALID_POINTER(p) \ + { \ + if(p == NULL) \ + { \ + return AMF_INVALID_POINTER; \ + } \ + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantInit(AMFVariantStruct* pVariant) + { + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pVariant); + pVariant->type = AMF_VARIANT_EMPTY; + return AMF_OK; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantClear(AMFVariantStruct* pVariant) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pVariant); + + switch(AMFVariantGetType(pVariant)) + { + case AMF_VARIANT_STRING: + amf_variant_free(AMFVariantString(pVariant)); + pVariant->type = AMF_VARIANT_EMPTY; + break; + + case AMF_VARIANT_WSTRING: + amf_variant_free(AMFVariantWString(pVariant)); + pVariant->type = AMF_VARIANT_EMPTY; + break; + + case AMF_VARIANT_INTERFACE: + if(AMFVariantInterface(pVariant) != NULL) + { +#if defined(__cplusplus) + AMFVariantInterface(pVariant)->Release(); +#else + AMFVariantInterface(pVariant)->pVtbl->Release(AMFVariantInterface(pVariant)); +#endif + AMFVariantInterface(pVariant) = NULL; + } + pVariant->type = AMF_VARIANT_EMPTY; + break; + + default: + pVariant->type = AMF_VARIANT_EMPTY; + break; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantCompare(const AMFVariantStruct* pFirst, const AMFVariantStruct* pSecond, amf_bool* bEqual) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pFirst); + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pSecond); + + if(pFirst == pSecond) + { + *bEqual = true; + } + else if(AMFVariantGetType(pFirst) != AMFVariantGetType(pSecond)) + { + *bEqual = false; + } + else + { + switch(AMFVariantGetType(pFirst)) + { + case AMF_VARIANT_EMPTY: + *bEqual = true; + break; + case AMF_VARIANT_BOOL: + *bEqual = AMFVariantGetBool(pFirst) == AMFVariantBool(pSecond); + break; + case AMF_VARIANT_INT64: + *bEqual = AMFVariantGetInt64(pFirst) == AMFVariantInt64(pSecond); + break; + case AMF_VARIANT_DOUBLE: + *bEqual = AMFVariantGetDouble(pFirst) == AMFVariantDouble(pSecond); + break; + case AMF_VARIANT_FLOAT: + *bEqual = AMFVariantGetFloat(pFirst) == AMFVariantFloat(pSecond); + break; + case AMF_VARIANT_RECT: +#if defined(__cplusplus) + *bEqual = AMFVariantGetRect(pFirst) == AMFVariantGetRect(pSecond); +#else + *bEqual = memcmp(&pFirst->rectValue, &pSecond->rectValue, sizeof(AMFRect)) == 0; +#endif + break; + case AMF_VARIANT_SIZE: +#if defined(__cplusplus) + *bEqual = AMFVariantGetSize(pFirst) == AMFVariantGetSize(pSecond); +#else + *bEqual = memcmp(&pFirst->sizeValue, &pSecond->sizeValue, sizeof(AMFSize)) == 0; +#endif + break; + case AMF_VARIANT_POINT: +#if defined(__cplusplus) + *bEqual = AMFVariantGetPoint(pFirst) == AMFVariantGetPoint(pSecond); +#else + *bEqual = memcmp(&pFirst->pointValue, &pSecond->pointValue, sizeof(AMFPoint)) == 0; +#endif + break; + case AMF_VARIANT_FLOAT_SIZE: +#if defined(__cplusplus) + *bEqual = AMFVariantGetFloatSize(pFirst) == AMFVariantGetFloatSize(pSecond); +#else + *bEqual = memcmp(&pFirst->floatSizeValue, &pSecond->floatSizeValue, sizeof(AMFFloatPoint2D)) == 0; +#endif + break; + case AMF_VARIANT_FLOAT_POINT2D: +#if defined(__cplusplus) + *bEqual = AMFVariantGetFloatPoint2D(pFirst) == AMFVariantGetFloatPoint2D(pSecond); +#else + *bEqual = memcmp(&pFirst->floatPoint2DValue, &pSecond->floatPoint2DValue, sizeof(AMFFloatPoint2D)) == 0; +#endif + break; + case AMF_VARIANT_FLOAT_POINT3D: +#if defined(__cplusplus) + *bEqual = AMFVariantGetFloatPoint3D(pFirst) == AMFVariantGetFloatPoint3D(pSecond); +#else + *bEqual = memcmp(&pFirst->floatPoint3DValue, &pSecond->floatPoint3DValue, sizeof(AMFFloatPoint3D)) == 0; +#endif + break; + case AMF_VARIANT_FLOAT_VECTOR4D: +#if defined(__cplusplus) + *bEqual = AMFVariantGetFloatVector4D(pFirst) == AMFVariantGetFloatVector4D(pSecond); +#else + *bEqual = memcmp(&pFirst->floatVector4DValue, &pSecond->floatVector4DValue, sizeof(AMFFloatPoint3D)) == 0; +#endif + break; + case AMF_VARIANT_RATE: +#if defined(__cplusplus) + *bEqual = AMFVariantGetRate(pFirst) == AMFVariantGetRate(pSecond); +#else + *bEqual = memcmp(&pFirst->rateValue, &pSecond->rateValue, sizeof(AMFRate)) == 0; +#endif + break; + case AMF_VARIANT_RATIO: +#if defined(__cplusplus) + *bEqual = AMFVariantGetRatio(pFirst) == AMFVariantGetRatio(pSecond); +#else + *bEqual = memcmp(&pFirst->ratioValue, &pSecond->ratioValue, sizeof(AMFRatio)) == 0; +#endif + break; + case AMF_VARIANT_COLOR: +#if defined(__cplusplus) + *bEqual = AMFVariantGetColor(pFirst) == AMFVariantGetColor(pSecond); +#else + *bEqual = memcmp(&pFirst->colorValue, &pSecond->colorValue, sizeof(AMFColor)) == 0; +#endif + break; + case AMF_VARIANT_STRING: + *bEqual = strcmp(AMFVariantString(pFirst), AMFVariantString(pSecond)) == 0; + break; + case AMF_VARIANT_WSTRING: + *bEqual = wcscmp(AMFVariantWString(pFirst), AMFVariantWString(pSecond)) == 0; + break; + case AMF_VARIANT_INTERFACE: + *bEqual = AMFVariantInterface(pFirst) == AMFVariantInterface(pSecond); + break; + default: + errRet = AMF_INVALID_ARG; + break; + } + } + return errRet; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantCopy(AMFVariantStruct* pDest, const AMFVariantStruct* pSrc) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pSrc); + if(pDest != pSrc) + { + switch(AMFVariantGetType(pSrc)) + { + case AMF_VARIANT_EMPTY: + errRet = AMFVariantClear(pDest); + break; + case AMF_VARIANT_BOOL: + errRet = AMFVariantAssignBool(pDest, AMFVariantBool(pSrc)); + break; + case AMF_VARIANT_INT64: + errRet = AMFVariantAssignInt64(pDest, AMFVariantInt64(pSrc)); + break; + case AMF_VARIANT_DOUBLE: + errRet = AMFVariantAssignDouble(pDest, AMFVariantDouble(pSrc)); + break; + case AMF_VARIANT_FLOAT: + errRet = AMFVariantAssignFloat(pDest, AMFVariantFloat(pSrc)); + break; + case AMF_VARIANT_RECT: + errRet = AMFVariantAssignRect(pDest, &pSrc->rectValue); + break; + case AMF_VARIANT_SIZE: + errRet = AMFVariantAssignSize(pDest, &pSrc->sizeValue); + break; + case AMF_VARIANT_POINT: + errRet = AMFVariantAssignPoint(pDest, &pSrc->pointValue); + break; + case AMF_VARIANT_FLOAT_SIZE: + errRet = AMFVariantAssignFloatSize(pDest, &pSrc->floatSizeValue); + break; + case AMF_VARIANT_FLOAT_POINT2D: + errRet = AMFVariantAssignFloatPoint2D(pDest, &pSrc->floatPoint2DValue); + break; + case AMF_VARIANT_FLOAT_POINT3D: + errRet = AMFVariantAssignFloatPoint3D(pDest, &pSrc->floatPoint3DValue); + break; + case AMF_VARIANT_FLOAT_VECTOR4D: + errRet = AMFVariantAssignFloatVector4D(pDest, &pSrc->floatVector4DValue); + break; + case AMF_VARIANT_RATE: + errRet = AMFVariantAssignRate(pDest, &pSrc->rateValue); + break; + case AMF_VARIANT_RATIO: + errRet = AMFVariantAssignRatio(pDest, &pSrc->ratioValue); + break; + case AMF_VARIANT_COLOR: + errRet = AMFVariantAssignColor(pDest, &pSrc->colorValue); + break; + case AMF_VARIANT_STRING: + errRet = AMFVariantAssignString(pDest, AMFVariantString(pSrc)); + break; + case AMF_VARIANT_WSTRING: + errRet = AMFVariantAssignWString(pDest, AMFVariantWString(pSrc)); + break; + case AMF_VARIANT_INTERFACE: + errRet = AMFVariantAssignInterface(pDest, AMFVariantInterface(pSrc)); + break; + default: + errRet = AMF_INVALID_ARG; + break; + } + } + return errRet; + } + #define AMFVariantTypeEmpty AMF_VARIANT_EMPTY + + #define AMFVariantTypeBool AMF_VARIANT_BOOL + #define AMFVariantTypeInt64 AMF_VARIANT_INT64 + #define AMFVariantTypeDouble AMF_VARIANT_DOUBLE + #define AMFVariantTypeFloat AMF_VARIANT_FLOAT + + #define AMFVariantTypeRect AMF_VARIANT_RECT + #define AMFVariantTypeSize AMF_VARIANT_SIZE + #define AMFVariantTypePoint AMF_VARIANT_POINT + #define AMFVariantTypeFloatPoint2D AMF_VARIANT_FLOAT_POINT2D + #define AMFVariantTypeFloatPoint3D AMF_VARIANT_FLOAT_POINT3D + #define AMFVariantTypeFloatVector4D AMF_VARIANT_FLOAT_VECTOR4D + + #define AMFVariantTypeRate AMF_VARIANT_RATE + #define AMFVariantTypeRatio AMF_VARIANT_RATIO + #define AMFVariantTypeColor AMF_VARIANT_COLOR + + #define AMFVariantTypeString AMF_VARIANT_STRING + #define AMFVariantTypeWString AMF_VARIANT_WSTRING + #define AMFVariantTypeInterface AMF_VARIANT_INTERFACE + +#if defined(__cplusplus) + + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignString(AMFVariantStruct* pDest, const AMFVariant::String& value) + { + return AMFVariantAssignString(pDest, value.c_str()); + } + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignWString(AMFVariantStruct* pDest, const AMFVariant::WString& value) + { + return AMFVariantAssignWString(pDest, value.c_str()); + } + + static AMF_INLINE amf_bool AMFConvertEmptyToBool(void*, AMF_RESULT& res) { res = AMF_OK; return false; } + static AMF_INLINE amf_int64 AMFConvertEmptyToInt64(void*, AMF_RESULT& res) {res = AMF_OK; return 0; } + static AMF_INLINE amf_double AMFConvertEmptyToDouble(void*, AMF_RESULT& res) {res = AMF_OK; return 0; } + static AMF_INLINE amf_float AMFConvertEmptyToFloat(void*, AMF_RESULT& res) { res = AMF_OK; return 0; } + + + static AMF_INLINE AMFVariant::String AMFConvertEmptyToString(void*, AMF_RESULT& res) {res = AMF_OK; return ""; } + static AMF_INLINE AMFVariant::WString AMFConvertEmptyToWString(void*, AMF_RESULT& res) {res = AMF_OK; return L""; } + static AMF_INLINE amf_int64 AMFConvertBoolToInt64(bool value, AMF_RESULT& res){res = AMF_OK; return value ? 1 : 0;} + static AMF_INLINE amf_double AMFConvertBoolToDouble(bool value, AMF_RESULT& res){res = AMF_OK; return value ? 1.0 : 0.0;} + static AMF_INLINE amf_float AMFConvertBoolToFloat(bool value, AMF_RESULT& res) { res = AMF_OK; return value ? 1.0f : 0.0f; } + static AMF_INLINE AMFVariant::String AMFConvertBoolToString(bool value, AMF_RESULT& res){res = AMF_OK; return value ? "true" : "false";} + static AMF_INLINE AMFVariant::WString AMFConvertBoolToWString(bool value, AMF_RESULT& res){res = AMF_OK; return value ? L"true" : L"false";} + static AMF_INLINE bool AMFConvertInt64ToBool(amf_int64 value, AMF_RESULT& res){res = AMF_OK;return value != 0;} + static AMF_INLINE amf_double AMFConvertInt64ToDouble(amf_int64 value, AMF_RESULT& res){res = AMF_OK;return (amf_double)value;} + static AMF_INLINE amf_float AMFConvertInt64ToFloat(amf_int64 value, AMF_RESULT& res) { res = AMF_OK; return (amf_float)value; } + static AMF_INLINE AMFVariant::String AMFConvertInt64ToString(amf_int64 value, AMF_RESULT& res) + { + res = AMF_OK; + char buff0xFF; + sprintf(buff, "%" AMFPRId64, (long long)value); + return buff; + } + static AMF_INLINE AMFVariant::WString AMFConvertInt64ToWString(amf_int64 value, AMF_RESULT& res) + { + res = AMF_OK; + wchar_t buff0xFF; + swprintf(buff, 0xFF, L"%" LPRId64, (long long)value); + return buff; + } + + static AMF_INLINE bool AMFConvertDoubleToBool(amf_double value, AMF_RESULT& res){res = AMF_OK;return value != 0;} + static AMF_INLINE bool AMFConvertFloatToBool(amf_float value, AMF_RESULT& res) { res = AMF_OK; return value != 0; } + static AMF_INLINE amf_int64 AMFConvertDoubleToInt64(amf_double value, AMF_RESULT& res){res = AMF_OK;return amf_int64(value);} + static AMF_INLINE amf_int64 AMFConvertFloatToInt64(amf_float value, AMF_RESULT& res) { res = AMF_OK; return amf_int64(value); } + static AMF_INLINE AMFVariant::String AMFConvertDoubleToString(amf_double value, AMF_RESULT& res) + { + res = AMF_OK; + char buff0xFF; + sprintf(buff, "%lf", value); + return buff; + } + static AMF_INLINE AMFVariant::String AMFConvertFloatToString(amf_float value, AMF_RESULT& res) + { + res = AMF_OK; + char buff0xFF; + sprintf(buff, "%f", value); + return buff; + } + static AMF_INLINE AMFVariant::WString AMFConvertDoubleToWString(amf_double value, AMF_RESULT& res) + { + res = AMF_OK; + wchar_t buff0xFF; + swprintf(buff, 0xFF, L"%lf", value); + return buff; + } + static AMF_INLINE AMFVariant::WString AMFConvertFloatToWString(amf_float value, AMF_RESULT& res) + { + res = AMF_OK; + wchar_t buff0xFF; + swprintf(buff, 0xFF, L"%f", value); + return buff; + } + + static AMF_INLINE bool AMFConvertStringToBool(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + AMFVariant::String tmp = value; + if(( tmp == "true") || ( tmp == "True") || ( tmp == "TRUE") || ( tmp == "1") ) + { + return true; + } + else + { + if(( tmp == "false") || ( tmp == "False") || ( tmp == "FALSE") || ( tmp == "0") ) + { + return false; + } + } + res = AMF_INVALID_ARG; + return false; + } + + static AMF_INLINE amf_int64 AMFConvertStringToInt64(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + long long tmp = 0; + int readElements = 0; + + if(value.size() > 2 && ( value.c_str()0 == '0') && ( value.c_str()1 == 'x') ) + { + readElements = sscanf(value.c_str(), "0x%" AMFPRIx64, &tmp); + } + else if(value.size() > 0) + { + readElements = sscanf(value.c_str(), "%" AMFPRId64, &tmp); + } + if(readElements) + { + return tmp; + } + res = AMF_INVALID_ARG; + return 0; + } + + static AMF_INLINE amf_double AMFConvertStringToDouble(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + amf_double tmp = 0; + int readElements = 0; + if(value.size() > 0) + { + readElements = sscanf(value.c_str(), "%lf", &tmp); + } + if(readElements) + { + return tmp; + } + res = AMF_INVALID_ARG; + return 0; + } + static AMF_INLINE amf_float AMFConvertStringToFloat(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + amf_float tmp = 0; + int readElements = 0; + if (value.size() > 0) + { + readElements = sscanf(value.c_str(), "%f", &tmp); + } + if (readElements) + { + return tmp; + } + res = AMF_INVALID_ARG; + return 0; + } + + static AMF_INLINE AMFVariant::WString AMFConvertStringToWString(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; +// return amf_from_utf8_to_unicode(value); + AMFVariant::WString result; + if(0 == value.size()) + { + return result; + } + const char* pUtf8Buff = value.c_str(); + +#if defined(_WIN32) + _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); + int UnicodeBuffSize = ::MultiByteToWideChar(CP_UTF8, 0, pUtf8Buff, -1, NULL, 0); + if(0 == UnicodeBuffSize) + { + return result; + } + UnicodeBuffSize += 8; // get some extra space + result.resize(UnicodeBuffSize); + UnicodeBuffSize = ::MultiByteToWideChar(CP_UTF8, 0, pUtf8Buff, -1, (LPWSTR)result.c_str(), UnicodeBuffSize); + UnicodeBuffSize--; + +#elif defined(__ANDROID__) + // on android mbstowcs cannot be used to define length + char* old_locale = setlocale(LC_CTYPE, "en_US.UTF8"); + + mbstate_t mbs; + mbrlen(NULL, 0, &mbs); + int len = value.size(); + const char* pt = pUtf8Buff; + int UnicodeBuffSize = 0; + while(len > 0) + { + size_t length = mbrlen (pt, len, &mbs); //MM TODO Android always return 1 + if((length == 0) || (length > len)) + { + break; + } + UnicodeBuffSize++; + len -= length; + pt += length; + } + UnicodeBuffSize += 8; // get some extra space + result.resize(UnicodeBuffSize); + + mbrlen (NULL, 0, &mbs); + len = value.size(); + pt = pUtf8Buff; + UnicodeBuffSize = 0; + while(len > 0) + { + size_t length = mbrlen (pt, len, &mbs); + if((length == 0) || (length > len)) + { + break; + } + mbrtowc(&((wchar_t*)(result.c_str()))UnicodeBuffSize, pt, length, &mbs); //MM TODO Android always return 1 char + UnicodeBuffSize++; + len -= length; + pt += length; + } + setlocale(LC_CTYPE, old_locale); + + #else + char* old_locale = setlocale(LC_CTYPE, "en_US.UTF8"); + size_t UnicodeBuffSize = mbstowcs(NULL, pUtf8Buff, 0); + if(0 == UnicodeBuffSize) + { + return result; + } + UnicodeBuffSize += 8; // get some extra space + result.resize(UnicodeBuffSize); + UnicodeBuffSize = mbstowcs((wchar_t*)result.c_str(), pUtf8Buff, UnicodeBuffSize + 1); + setlocale(LC_CTYPE, old_locale); +#endif + result.resize(UnicodeBuffSize); + return result; + } + static AMF_INLINE AMFVariant::String AMFConvertWStringToString(const AMFVariant::WString& value, AMF_RESULT& res) + { + res = AMF_OK; +// return amf_from_unicode_to_utf8(value); + AMFVariant::String result; + if(0 == value.size()) + { + return result; + } + + const wchar_t* pwBuff = value.c_str(); + +#if defined(_WIN32) + _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); + int Utf8BuffSize = ::WideCharToMultiByte(CP_UTF8, 0, pwBuff, -1, NULL, 0, NULL, NULL); + if(0 == Utf8BuffSize) + { + return result; + } + Utf8BuffSize += 8; // get some extra space + result.resize(Utf8BuffSize); + Utf8BuffSize = ::WideCharToMultiByte(CP_UTF8, 0, pwBuff, -1, (LPSTR)result.c_str(), Utf8BuffSize, NULL, NULL); + Utf8BuffSize--; +#elif defined(__ANDROID__) + char* old_locale = setlocale(LC_CTYPE, "en_US.UTF8"); + int Utf8BuffSize = value.length(); + if(0 == Utf8BuffSize) + { + return result; + } + Utf8BuffSize += 8; // get some extra space + result.resize(Utf8BuffSize); + + mbstate_t mbs; + mbrlen(NULL, 0, &mbs); + + Utf8BuffSize = 0; + for( int i = 0; i < value.length(); i++) + { + //MM TODO Android - not implemented + //int written = wcrtomb(&resultUtf8BuffSize, pwBuffi, &mbs); + ((char*)(result.c_str()))Utf8BuffSize = (char)(pwBuffi); + int written = 1; + // temp replacement + Utf8BuffSize += written; + } + setlocale(LC_CTYPE, old_locale); + +#else + char* old_locale = setlocale(LC_CTYPE, "en_US.UTF8"); + size_t Utf8BuffSize = wcstombs(NULL, pwBuff, 0); + if(0 == Utf8BuffSize) + { + return result; + } + Utf8BuffSize += 8; // get some extra space + result.resize(Utf8BuffSize); + Utf8BuffSize = wcstombs((char*)result.c_str(), pwBuff, Utf8BuffSize + 1); + + setlocale(LC_CTYPE, old_locale); +#endif + result.resize(Utf8BuffSize); + return result; + } + + + static AMF_INLINE bool AMFConvertWStringToBool(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToBool(AMFConvertWStringToString(value, res), res); + } + static AMF_INLINE amf_int64 AMFConvertWStringToInt64(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToInt64(AMFConvertWStringToString(value, res), res); + } + static AMF_INLINE amf_double AMFConvertWStringToDouble(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToDouble(AMFConvertWStringToString(value, res), res); + } + static AMF_INLINE amf_float AMFConvertWStringToFloat(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToFloat(AMFConvertWStringToString(value, res), res); + } + + static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertRectToString(const AMFRect& value, AMF_RESULT& res) + { + res = AMF_OK; + char buff0xFF; + sprintf(buff, "%d,%d,%d,%d", value.left, value.top, value.right, value.bottom); + return buff; + } + static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertSizeToString(const AMFSize& value, AMF_RESULT& res) + { + res = AMF_OK; + char buff0xFF; + sprintf(buff, "%d,%d", value.width, value.height); + return buff; + } + static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertPointToString(const AMFPoint& value, AMF_RESULT& res) + { + res = AMF_OK; + char buff0xFF; + sprintf(buff, "%d,%d", value.x, value.y); + return buff; + } + static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertFloatSizeToString(const AMFFloatSize& value, AMF_RESULT& res) + { + res = AMF_OK; + char buff0xFF; + sprintf(buff, "%f,%f", value.width, value.height); + return buff; + } + static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertFloatPoint2DToString(const AMFFloatPoint2D& value, AMF_RESULT& res) + { + res = AMF_OK; + char buff0xFF; + sprintf(buff, "%f,%f", value.x, value.y); + return buff; + } + static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertFloatPoint3DToString(const AMFFloatPoint3D& value, AMF_RESULT& res) + { + res = AMF_OK; + char buff0xFF; + sprintf(buff, "%f,%f,%f", value.x, value.y, value.z); + return buff; + } + static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertFloatVector4DToString(const AMFFloatVector4D& value, AMF_RESULT& res) + { + res = AMF_OK; + char buff0xFF; + sprintf(buff, "%f,%f,%f,%f", value.x, value.y, value.z, value.w); + return buff; + } + static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertRateToString(const AMFRate& value, AMF_RESULT& res) + { + res = AMF_OK; + char buff0xFF; + sprintf(buff, "%d,%d", value.num, value.den); + return buff; + } + static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertRatioToString(const AMFRatio& value, AMF_RESULT& res) + { + res = AMF_OK; + char buff0xFF; + sprintf(buff, "%d,%d", value.num, value.den); + return buff; + } + static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertColorToString(const AMFColor& value, AMF_RESULT& res) + { + res = AMF_OK; + char buff0xFF; + sprintf(buff, "%d,%d,%d,%d", value.r, value.g, value.b, value.a); + return buff; + } + + static AMF_INLINE AMFRect AMF_STD_CALL AMFConvertStringToRect(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + AMFRect tmp = {}; + int readElements = 0; + if(value.size() > 0) + { + readElements = sscanf(value.c_str(), "%d,%d,%d,%d", &tmp.left, &tmp.top, &tmp.right, &tmp.bottom); + } + if(readElements) + { + return tmp; + } + res = AMF_INVALID_ARG; + return tmp; + } + + static AMF_INLINE AMFSize AMF_STD_CALL AMFConvertStringToSize(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + AMFSize tmp = {}; + int readElements = 0; + if(value.size() > 0) + { + if(strchr(value.c_str(), ',') != nullptr) + { + readElements = sscanf(value.c_str(), "%d,%d", &tmp.width, &tmp.height); + } + else if (strchr(value.c_str(), 'x') != nullptr) + { + readElements = sscanf(value.c_str(), "%dx%d", &tmp.width, &tmp.height); + } + } + if(readElements) + { + return tmp; + } + res = AMF_INVALID_ARG; + return tmp; + } + static AMF_INLINE AMFPoint AMF_STD_CALL AMFConvertStringToPoint(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + AMFPoint tmp = {}; + int readElements = 0; + if(value.size() > 0) + { + readElements = sscanf(value.c_str(), "%d,%d", &tmp.x, &tmp.y); + } + if(readElements) + { + return tmp; + } + res = AMF_INVALID_ARG; + return tmp; + } + static AMF_INLINE AMFFloatSize AMF_STD_CALL AMFConvertStringToFloatSize(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + AMFFloatSize tmp = {}; + int readElements = 0; + if (value.size() > 0) + { + readElements = sscanf(value.c_str(), "%f,%f", &tmp.width, &tmp.height); + } + if (readElements) + { + return tmp; + } + res = AMF_INVALID_ARG; + return tmp; + } + static AMF_INLINE AMFFloatPoint2D AMF_STD_CALL AMFConvertStringToFloatPoint2D(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + AMFFloatPoint2D tmp = {}; + int readElements = 0; + if (value.size() > 0) + { + readElements = sscanf(value.c_str(), "%f,%f", &tmp.x, &tmp.y); + } + if (readElements) + { + return tmp; + } + res = AMF_INVALID_ARG; + return tmp; + } + static AMF_INLINE AMFFloatPoint3D AMF_STD_CALL AMFConvertStringToFloatPoint3D(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + AMFFloatPoint3D tmp = {}; + int readElements = 0; + if (value.size() > 0) + { + readElements = sscanf(value.c_str(), "%f,%f,%f", &tmp.x, &tmp.y, &tmp.z); + } + if (readElements) + { + return tmp; + } + res = AMF_INVALID_ARG; + return tmp; + } + static AMF_INLINE AMFFloatVector4D AMF_STD_CALL AMFConvertStringToFloatVector4D(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + AMFFloatVector4D tmp = {}; + int readElements = 0; + if (value.size() > 0) + { + readElements = sscanf(value.c_str(), "%f,%f,%f,%f", &tmp.x, &tmp.y, &tmp.z, &tmp.w); + } + if (readElements) + { + return tmp; + } + res = AMF_INVALID_ARG; + return tmp; + } + static AMF_INLINE AMFRate AMF_STD_CALL AMFConvertStringToRate(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + AMFRate tmp = {}; + int readElements = 0; + if(value.size() > 0) + { + readElements = sscanf(value.c_str(), "%d,%d", &tmp.num, &tmp.den); + } + if(readElements) + { + return tmp; + } + res = AMF_INVALID_ARG; + return tmp; + } + static AMF_INLINE AMFRatio AMF_STD_CALL AMFConvertStringToRatio(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + AMFRatio tmp = {}; + int readElements = 0; + if(value.size() > 0) + { + readElements = sscanf(value.c_str(), "%d,%d", &tmp.num, &tmp.den); + } + if(readElements) + { + return tmp; + } + res = AMF_INVALID_ARG; + return tmp; + } + static AMF_INLINE AMFColor AMF_STD_CALL AMFConvertStringToColor(const AMFVariant::String& value, AMF_RESULT& res) + { + res = AMF_OK; + int readElements = 0; + amf_uint32 r = 0; + amf_uint32 g = 0; + amf_uint32 b = 0; + amf_uint32 a = 0; + if(value.size() > 0) + { + readElements = sscanf(value.c_str(), "%u,%u,%u,%u", &r, &g, &b, &a); + } + if(readElements) + { + return AMFConstructColor((amf_uint8)r, (amf_uint8)g, (amf_uint8)b, (amf_uint8)a); + } + res = AMF_INVALID_ARG; + return AMFConstructColor(0, 0, 0, 255); + } +/////////////////////// + static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertRectToWString(const AMFRect& value, AMF_RESULT& res) + { + return AMFConvertStringToWString(AMFConvertRectToString(value, res), res); + } + static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertSizeToWString(const AMFSize& value, AMF_RESULT& res) + { + return AMFConvertStringToWString(AMFConvertSizeToString(value, res), res); + } + static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertPointToWString(const AMFPoint& value, AMF_RESULT& res) + { + return AMFConvertStringToWString(AMFConvertPointToString(value, res), res); + } + static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertFloatSizeToWString(const AMFFloatSize& value, AMF_RESULT& res) + { + return AMFConvertStringToWString(AMFConvertFloatSizeToString(value, res), res); + } + static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertFloatPoint2DToWString(const AMFFloatPoint2D& value, AMF_RESULT& res) + { + return AMFConvertStringToWString(AMFConvertFloatPoint2DToString(value, res), res); + } + static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertFloatPoint3DToWString(const AMFFloatPoint3D& value, AMF_RESULT& res) + { + return AMFConvertStringToWString(AMFConvertFloatPoint3DToString(value, res), res); + } + static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertFloatVector4DToWString(const AMFFloatVector4D& value, AMF_RESULT& res) + { + return AMFConvertStringToWString(AMFConvertFloatVector4DToString(value, res), res); + } + static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertRateToWString(const AMFRate& value, AMF_RESULT& res) + { + return AMFConvertStringToWString(AMFConvertRateToString(value, res), res); + } + static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertRatioToWString(const AMFRatio& value, AMF_RESULT& res) + { + return AMFConvertStringToWString(AMFConvertRatioToString(value, res), res); + } + static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertColorToWString(const AMFColor& value, AMF_RESULT& res) + { + return AMFConvertStringToWString(AMFConvertColorToString(value, res), res); + } + + static AMF_INLINE AMFRect AMF_STD_CALL AMFConvertWStringToRect(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToRect(AMFConvertWStringToString(value, res), res); + } + + static AMF_INLINE AMFSize AMF_STD_CALL AMFConvertWStringToSize(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToSize(AMFConvertWStringToString(value, res), res); + } + static AMF_INLINE AMFPoint AMF_STD_CALL AMFConvertWStringToPoint(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToPoint(AMFConvertWStringToString(value, res), res); + } + static AMF_INLINE AMFFloatSize AMF_STD_CALL AMFConvertWStringToFloatSize(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToFloatSize(AMFConvertWStringToString(value, res), res); + } + static AMF_INLINE AMFFloatPoint2D AMF_STD_CALL AMFConvertWStringToFloatPoint2D(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToFloatPoint2D(AMFConvertWStringToString(value, res), res); + } + static AMF_INLINE AMFFloatPoint3D AMF_STD_CALL AMFConvertWStringToFloatPoint3D(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToFloatPoint3D(AMFConvertWStringToString(value, res), res); + } + static AMF_INLINE AMFFloatVector4D AMF_STD_CALL AMFConvertWStringToFloatVector4D(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToFloatVector4D(AMFConvertWStringToString(value, res), res); + } + static AMF_INLINE AMFRate AMF_STD_CALL AMFConvertWStringToRate(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToRate(AMFConvertWStringToString(value, res), res); + } + static AMF_INLINE AMFRatio AMF_STD_CALL AMFConvertWStringToRatio(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToRatio(AMFConvertWStringToString(value, res), res); + } + static AMF_INLINE AMFColor AMF_STD_CALL AMFConvertWStringToColor(const AMFVariant::WString& value, AMF_RESULT& res) + { + return AMFConvertStringToColor(AMFConvertWStringToString(value, res), res); + } + + //------------------------------------------------------------------------------------------------- + #define AMFConvertTool(srcType, dstType)\ + if(AMFVariantGetType(pSrc) == AMFVariantType##srcType && newType == AMFVariantType##dstType)\ + {\ + AMF_RESULT res = AMF_OK;\ + AMFVariantAssign##dstType(pDest, AMFConvert##srcType##To##dstType(AMFVariant##srcType(pSrc), res));\ + return res;\ + }\ + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantChangeType(AMFVariantStruct* pDest, const AMFVariantStruct* pSrc, AMF_VARIANT_TYPE newType) + { + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + if(pSrc == 0) + { + pSrc = pDest; + } + + if(AMFVariantGetType(pSrc) == newType) + { + if(pDest == pSrc) + { + return AMF_OK; + } + return AMFVariantCopy(pDest, pSrc); + } + AMFVariantClear(pDest); + + AMFConvertTool(Empty, Bool); + AMFConvertTool(Empty, Int64); + AMFConvertTool(Empty, Double); + AMFConvertTool(Empty, Float); + AMFConvertTool(Empty, String); + AMFConvertTool(Empty, WString); + + AMFConvertTool(Bool, Int64); + AMFConvertTool(Bool, Double); + AMFConvertTool(Bool, Float); + AMFConvertTool(Bool, String); + AMFConvertTool(Bool, WString); + + AMFConvertTool(Int64, Bool); + AMFConvertTool(Int64, Double); + AMFConvertTool(Int64, Float); + AMFConvertTool(Int64, String); + AMFConvertTool(Int64, WString); + + AMFConvertTool(Double, Bool); + AMFConvertTool(Double, Int64); + AMFConvertTool(Double, String); + AMFConvertTool(Double, String); + + AMFConvertTool(Float, Bool); + AMFConvertTool(Float, Int64); + AMFConvertTool(Float, String); + AMFConvertTool(Float, String); + + AMFConvertTool(String, Bool); + AMFConvertTool(String, Int64); + AMFConvertTool(String, Double); + AMFConvertTool(String, Float); + AMFConvertTool(String, WString); + + AMFConvertTool(WString, Bool); + AMFConvertTool(WString, Int64); + AMFConvertTool(WString, Double); + AMFConvertTool(WString, Float); + AMFConvertTool(WString, String); + + AMFConvertTool(String, Rect); + AMFConvertTool(String, Size); + AMFConvertTool(String, Point); + AMFConvertTool(String, Rate); + AMFConvertTool(String, Ratio); + AMFConvertTool(String, Color); + + AMFConvertTool(Rect , String); + AMFConvertTool(Size , String); + AMFConvertTool(Point, String); + AMFConvertTool(Rate , String); + AMFConvertTool(Ratio, String); + AMFConvertTool(Color, String); + + AMFConvertTool(WString, Rect); + AMFConvertTool(WString, Size); + AMFConvertTool(WString, Point); + AMFConvertTool(WString, Rate); + AMFConvertTool(WString, Ratio); + AMFConvertTool(WString, Color); + + AMFConvertTool(Rect , WString); + AMFConvertTool(Size , WString); + AMFConvertTool(Point, WString); + AMFConvertTool(Rate , WString); + AMFConvertTool(Ratio, WString); + AMFConvertTool(Color, WString); + + return AMF_INVALID_ARG; + } +#endif // #if defined(__cplusplus) + + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignBool(AMFVariantStruct* pDest, amf_bool value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if(errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_BOOL; + AMFVariantBool(pDest) = value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignInt64(AMFVariantStruct* pDest, amf_int64 value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if(errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_INT64; + AMFVariantInt64(pDest) = value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignDouble(AMFVariantStruct* pDest, amf_double value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if(errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_DOUBLE; + AMFVariantDouble(pDest) = value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloat(AMFVariantStruct* pDest, amf_float value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if (errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_FLOAT; + AMFVariantFloat(pDest) = value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignString(AMFVariantStruct* pDest, const char* pValue) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pValue); + + errRet = AMFVariantClear(pDest); + if(errRet == AMF_OK) + { + const size_t size = (strlen(pValue) + 1); + pDest->type = AMF_VARIANT_STRING; + AMFVariantString(pDest) = (char*)amf_variant_alloc(size * sizeof(char)); + if(AMFVariantString(pDest)) + { + memcpy(AMFVariantString(pDest), pValue, size * sizeof(char)); + } + else + { + errRet = AMF_OUT_OF_MEMORY; + } + } + return errRet; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignWString(AMFVariantStruct* pDest, const wchar_t* pValue) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pValue); + + errRet = AMFVariantClear(pDest); + if(errRet == AMF_OK) + { + const size_t size = (wcslen(pValue) + 1); + pDest->type = AMF_VARIANT_WSTRING; + AMFVariantWString(pDest) = (wchar_t*)amf_variant_alloc(size * sizeof(wchar_t)); + if(AMFVariantWString(pDest)) + { + memcpy(AMFVariantWString(pDest), pValue, size * sizeof(wchar_t)); + } + else + { + errRet = AMF_OUT_OF_MEMORY; + } + } + return errRet; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignInterface(AMFVariantStruct* pDest, AMFInterface* pValue) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + //AMF_VARIANT_RETURN_IF_INVALID_POINTER(pValue);//can be NULL + + errRet = AMFVariantClear(pDest); + if(errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_INTERFACE; + AMFVariantInterface(pDest) = pValue; + if(AMFVariantInterface(pDest)) + { +#if defined(__cplusplus) + AMFVariantInterface(pDest)->Acquire(); +#else + AMFVariantInterface(pDest)->pVtbl->Acquire(AMFVariantInterface(pDest)); +#endif + } + } + return errRet; + } + //------------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRect(AMFVariantStruct* pDest, const AMFRect& value) + { + return AMFVariantAssignRect(pDest, &value); + } +#endif + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRect (AMFVariantStruct* pDest, const AMFRect* value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if(errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_RECT; + AMFVariantRect(pDest) = *value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignSize (AMFVariantStruct* pDest, const AMFSize& value) + { + return AMFVariantAssignSize (pDest, &value); + } +#endif + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignSize (AMFVariantStruct* pDest, const AMFSize* value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if(errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_SIZE; + AMFVariantSize(pDest) = *value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignPoint(AMFVariantStruct* pDest, const AMFPoint& value) + { + return AMFVariantAssignPoint(pDest, &value); + } + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatSize(AMFVariantStruct* pDest, const AMFFloatSize& value) + { + return AMFVariantAssignFloatSize(pDest, &value); + } + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint2D(AMFVariantStruct* pDest, const AMFFloatPoint2D& value) + { + return AMFVariantAssignFloatPoint2D(pDest, &value); + } + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint3D(AMFVariantStruct* pDest, const AMFFloatPoint3D& value) + { + return AMFVariantAssignFloatPoint3D(pDest, &value); + } + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatVector4D(AMFVariantStruct* pDest, const AMFFloatVector4D& value) + { + return AMFVariantAssignFloatVector4D(pDest, &value); + } +#endif + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignPoint(AMFVariantStruct* pDest, const AMFPoint* value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if(errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_POINT; + AMFVariantPoint(pDest) = *value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatSize(AMFVariantStruct* pDest, const AMFFloatSize* value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if (errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_FLOAT_SIZE; + AMFVariantFloatSize(pDest) = *value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint2D(AMFVariantStruct* pDest, const AMFFloatPoint2D* value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if (errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_FLOAT_POINT2D; + AMFVariantFloatPoint2D(pDest) = *value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint3D(AMFVariantStruct* pDest, const AMFFloatPoint3D* value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if (errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_FLOAT_POINT3D; + AMFVariantFloatPoint3D(pDest) = *value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatVector4D(AMFVariantStruct* pDest, const AMFFloatVector4D* value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if (errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_FLOAT_VECTOR4D; + AMFVariantFloatVector4D(pDest) = *value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRate (AMFVariantStruct* pDest, const AMFRate& value) + { + return AMFVariantAssignRate (pDest, &value); + } +#endif + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRate (AMFVariantStruct* pDest, const AMFRate* value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if(errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_RATE; + AMFVariantRate(pDest) = *value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRatio(AMFVariantStruct* pDest, const AMFRatio& value) + { + return AMFVariantAssignRatio(pDest, &value); + } +#endif + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRatio(AMFVariantStruct* pDest, const AMFRatio* value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if(errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_RATIO; + AMFVariantRatio(pDest) = *value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignColor(AMFVariantStruct* pDest, const AMFColor& value) + { + return AMFVariantAssignColor(pDest, &value); + } +#endif + //------------------------------------------------------------------------------------------------- + static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignColor(AMFVariantStruct* pDest, const AMFColor* value) + { + AMF_RESULT errRet = AMF_OK; + AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest); + + errRet = AMFVariantClear(pDest); + if(errRet == AMF_OK) + { + pDest->type = AMF_VARIANT_COLOR; + AMFVariantColor(pDest) = *value; + } + return errRet; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE char* AMF_CDECL_CALL AMFVariantDuplicateString(const char* from) + { + char* ret = 0; + if(from) + { + ret = (char*)amf_variant_alloc(sizeof(char)*(strlen(from) + 1)); + if(ret) + { + strcpy(ret, from); + } + } + return ret; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE void AMF_CDECL_CALL AMFVariantFreeString(char* from) + { + amf_variant_free(from); + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE wchar_t* AMF_CDECL_CALL AMFVariantDuplicateWString(const wchar_t* from) + { + wchar_t* ret = 0; + if(from) + { + ret = (wchar_t*)amf_variant_alloc(sizeof(wchar_t)*(wcslen(from) + 1)); + if(ret) + { + wcscpy(ret, from); + } + } + return ret; + } + //------------------------------------------------------------------------------------------------- + static AMF_INLINE void AMF_CDECL_CALL AMFVariantFreeWString(wchar_t* from) + { + amf_variant_free(from); + } + //---------------------------------------------------------------------------------------------- + // AMF_INLINE implementation of AMFVariant class + //---------------------------------------------------------------------------------------------- +#if defined(__cplusplus) + AMF_INLINE AMFVariant::AMFVariant(const AMFVariantStruct* pOther) + { + AMFVariantInit(this); + if(pOther != NULL) + { + AMFVariantCopy(this, const_cast<AMFVariantStruct*>(pOther)); + } + } + //------------------------------------------------------------------------------------------------- + template<typename T> + AMFVariant::AMFVariant(const AMFInterfacePtr_T<T>& pValue) + { + AMFVariantInit(this); + AMFVariantAssignInterface(this, pValue); + } + //------------------------------------------------------------------------------------------------- + template<class ReturnType, AMF_VARIANT_TYPE variantType, typename Getter> + ReturnType AMFVariant::GetValue(Getter getter) const + { + ReturnType str = ReturnType(); + if(AMFVariantGetType(this) == variantType) + { + str = static_cast<ReturnType>(getter(this)); + } + else + { + AMFVariant varDest; + varDest.ChangeType(variantType, this); + if(varDest.type != AMF_VARIANT_EMPTY) + { + str = static_cast<ReturnType>(getter(&varDest)); + } + } + return str; + } + //------------------------------------------------------------------------------------------------- + AMF_INLINE AMFVariant& AMFVariant::operator=(const AMFVariantStruct& other) + { + AMFVariantCopy(this, const_cast<AMFVariantStruct*>(&other)); + return *this; + } + //------------------------------------------------------------------------------------------------- + AMF_INLINE AMFVariant& AMFVariant::operator=(const AMFVariantStruct* pOther) + { + if(pOther != NULL) + { + AMFVariantCopy(this, const_cast<AMFVariantStruct*>(pOther)); + } + return *this; + } + //------------------------------------------------------------------------------------------------- + AMF_INLINE AMFVariant& AMFVariant::operator=(const AMFVariant& other) + { + AMFVariantCopy(this, + const_cast<AMFVariantStruct*>(static_cast<const AMFVariantStruct*>(&other))); + return *this; + } + //------------------------------------------------------------------------------------------------- + template<typename T> + AMFVariant& AMFVariant::operator=(const AMFInterfacePtr_T<T>& value) + { + AMFVariantAssignInterface(this, value); + return *this; + } + //------------------------------------------------------------------------------------------------- + AMF_INLINE bool AMFVariant::operator==(const AMFVariantStruct& other) const + { + return *this == &other; + } + //------------------------------------------------------------------------------------------------- + AMF_INLINE bool AMFVariant::operator==(const AMFVariantStruct* pOther) const + { + //TODO: double check + amf_bool ret = false; + if(pOther == NULL) + { + ret = false; + } + else + { + AMFVariantCompare(this, pOther, &ret); + } + return ret; + } + //------------------------------------------------------------------------------------------------- + AMF_INLINE bool AMFVariant::operator!=(const AMFVariantStruct& other) const + { + return !(*this == &other); + } + //------------------------------------------------------------------------------------------------- + AMF_INLINE bool AMFVariant::operator!=(const AMFVariantStruct* pOther) const + { + return !(*this == pOther); + } + //------------------------------------------------------------------------------------------------- + AMF_INLINE void AMFVariant::Attach(AMFVariantStruct& variant) + { + Clear(); + memcpy(this, &variant, sizeof(variant)); + AMFVariantGetType(&variant) = AMF_VARIANT_EMPTY; + } + //------------------------------------------------------------------------------------------------- + AMF_INLINE AMFVariantStruct AMFVariant::Detach() + { + AMFVariantStruct varResult = *this; + AMFVariantGetType(this) = AMF_VARIANT_EMPTY; + return varResult; + } + //------------------------------------------------------------------------------------------------- + AMF_INLINE AMFVariantStruct& AMFVariant::GetVariant() + { + return *static_cast<AMFVariantStruct*>(this); + } + //------------------------------------------------------------------------------------------------- + AMF_INLINE void AMFVariant::ChangeType(AMF_VARIANT_TYPE newType, const AMFVariant* pSrc) + { + AMFVariantChangeType(this, pSrc, newType); + } + //------------------------------------------------------------------------------------------------- + AMF_INLINE bool AMFVariant::Empty() const + { + return type == AMF_VARIANT_EMPTY; + } + //------------------------------------------------------------------------------------------------- +#endif // #if defined(__cplusplus) + +#if defined(__cplusplus) +} //namespace amf +#endif + +#endif //#ifndef AMF_Variant_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/Version.h
Added
@@ -0,0 +1,59 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2017 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +/** +*************************************************************************************************** +* @file Version.h +* @brief Version declaration +*************************************************************************************************** +*/ +#ifndef AMF_Version_h +#define AMF_Version_h +#pragma once + +#include "Platform.h" + +#define AMF_MAKE_FULL_VERSION(VERSION_MAJOR, VERSION_MINOR, VERSION_RELEASE, VERSION_BUILD_NUM) ( ((amf_uint64)(VERSION_MAJOR) << 48ull) | ((amf_uint64)(VERSION_MINOR) << 32ull) | ((amf_uint64)(VERSION_RELEASE) << 16ull) | (amf_uint64)(VERSION_BUILD_NUM)) + +#define AMF_GET_MAJOR_VERSION(x) ((x >> 48ull) & 0xFFFF) +#define AMF_GET_MINOR_VERSION(x) ((x >> 32ull) & 0xFFFF) +#define AMF_GET_SUBMINOR_VERSION(x) ((x >> 16ull) & 0xFFFF) +#define AMF_GET_BUILD_VERSION(x) ((x >> 0ull) & 0xFFFF) + +#define AMF_VERSION_MAJOR 1 +#define AMF_VERSION_MINOR 4 +#define AMF_VERSION_RELEASE 24 +#define AMF_VERSION_BUILD_NUM 0 + +#define AMF_FULL_VERSION AMF_MAKE_FULL_VERSION(AMF_VERSION_MAJOR, AMF_VERSION_MINOR, AMF_VERSION_RELEASE, AMF_VERSION_BUILD_NUM) + +#endif //#ifndef AMF_Version_h
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/include/core/VulkanAMF.h
Added
@@ -0,0 +1,108 @@ +// +// Notice Regarding Standards. AMD does not provide a license or sublicense to +// any Intellectual Property Rights relating to any standards, including but not +// limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4; +// AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3 +// (collectively, the "Media Technologies"). For clarity, you will pay any +// royalties due for such third party technologies, which may include the Media +// Technologies that are owed as a result of AMD providing the Software to you. +// +// MIT license +// +// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#ifndef __VulkanAMF_h__ +#define __VulkanAMF_h__ +#pragma once +#include "Platform.h" + +#include "vulkan/vulkan.h" + +#if defined(__cplusplus) +namespace amf +{ +#endif + typedef struct AMFVulkanDevice + { + amf_size cbSizeof; // sizeof(AMFVulkanDevice) + void* pNext; // reserved for extensions + VkInstance hInstance; + VkPhysicalDevice hPhysicalDevice; + VkDevice hDevice; + } AMFVulkanDevice; + + typedef struct AMFVulkanSync + { + amf_size cbSizeof; // sizeof(AMFVulkanSemaphore) + void* pNext; // reserved for extensions + VkSemaphore hSemaphore; + bool bSubmitted; // if true - wait for hSemaphore. re-submit hSemaphore if not synced by other ways and set to true + VkFence hFence; // To sync on CPU; can be nullptr. Submitted in vkQueueSubmit. If waited for hFence, null it, do not delete or reset. + } AMFVulkanSync; + + typedef struct AMFVulkanBuffer + { + amf_size cbSizeof; // sizeof(AMFVulkanBuffer) + void* pNext; // reserved for extensions + VkBuffer hBuffer; + VkDeviceMemory hMemory; + amf_int64 iSize; + amf_int64 iAllocatedSize; // for reuse + amf_uint32 eAccessFlags; // VkAccessFlagBits + amf_uint32 eUsage; // AMF_BUFFER_USAGE + amf_uint32 eAccess; // AMF_MEMORY_CPU_ACCESS + AMFVulkanSync Sync; + } AMFVulkanBuffer; + + typedef struct AMFVulkanSurface + { + amf_size cbSizeof; // sizeof(AMFVulkanSurface) + void* pNext; // reserved for extensions + // surface properties + VkImage hImage; + VkDeviceMemory hMemory; + amf_int64 iSize; // memory size + amf_uint32 eFormat; // VkFormat + amf_int32 iWidth; + amf_int32 iHeight; + amf_uint32 eCurrentLayout; // VkImageLayout + amf_uint32 eUsage; // AMF_SURFACE_USAGE + amf_uint32 eAccess; // AMF_MEMORY_CPU_ACCESS + AMFVulkanSync Sync; // To sync on GPU + } AMFVulkanSurface; + + typedef struct AMFVulkanView + { + amf_size cbSizeof; // sizeof(AMFVulkanSurface) + void* pNext; // reserved for extensions + // surface properties + AMFVulkanSurface *pSurface; + VkImageView hView; + amf_int32 iPlaneWidth; + amf_int32 iPlaneHeight; + amf_int32 iPlaneWidthPitch; + amf_int32 iPlaneHeightPitch; + } AMFVulkanView; +#if defined(__cplusplus) +} // namespace amf +#endif +#endif // __VulkanAMF_h__
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/meson.build
Added
@@ -0,0 +1,82 @@ +amf_sources = + 'gstamfencoder.cpp', + 'gstamfh264enc.cpp', + 'gstamfh265enc.cpp', + 'gstamfav1enc.cpp', + 'gstamfutils.cpp', + 'plugin.cpp', + + +amf_option = get_option('amfcodec') +if amf_option.disabled() + subdir_done() +endif + +platform_deps = +extra_args = '-DGST_USE_UNSTABLE_API' +extra_cpp_args = +if host_system == 'windows' + if not gstd3d11_dep.found() + if amf_option.enabled() + error('The amf was enabled explicitly, but required d3d11 was not found') + else + subdir_done() + endif + endif + + code = ''' + #include <windows.h> + #if !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) + #error "Not building for UWP" + #endif''' + if cc.compiles(code, name : 'building for UWP') + if amf_option.enabled() + error('amf plugin does not support UWP') + else + subdir_done() + endif + endif + + # Encoder needs to do sleep() by API design + winmm_lib = cc.find_library('winmm', required: amf_option) + if not winmm_lib.found() or not cc.has_header('mmsystem.h') + if amf_option.enabled() + error('Required winmm dependency is not available') + else + subdir_done() + endif + endif + + platform_deps += gstd3d11_dep, winmm_lib +else + if amf_option.enabled() + error('amf plugin supports only Windows') + else + subdir_done() + endif +endif + +if cxx.get_id() != 'msvc' + extra_cpp_args = cxx.get_supported_arguments( + # and MinGW 32bits compiler seems to be complaining about redundant-decls + '-Wno-redundant-decls', + # Various SDK header issue + '-Wno-class-memaccess', + '-Wno-attributes', + '-Wno-format', + '-Wno-format-nonliteral', + '-Wno-format-security', + ) +endif + +gstamfcodec = library('gstamfcodec', + amf_sources, + c_args : gst_plugins_bad_args + extra_args, + cpp_args : gst_plugins_bad_args + extra_args + extra_cpp_args, + include_directories : configinc, include_directories('include'), + dependencies : gstbase_dep, gstvideo_dep, gstpbutils_dep, gstcodecparsers_dep, gmodule_dep + platform_deps, + install : true, + install_dir : plugins_install_dir, +) + +plugins += gstamfcodec
View file
gst-plugins-bad-1.22.0.tar.xz/sys/amfcodec/plugin.cpp
Added
@@ -0,0 +1,126 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * plugin-amfcodec: + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include <gst/d3d11/gstd3d11.h> +#include <wrl.h> +#include <core/Factory.h> +#include <versionhelpers.h> +#include "gstamfutils.h" +#include "gstamfh264enc.h" +#include "gstamfh265enc.h" +#include "gstamfav1enc.h" + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +using namespace amf; +/* *INDENT-ON* */ + +static gboolean +plugin_init (GstPlugin * plugin) +{ + AMFFactory *amf_factory; + ComPtr < IDXGIFactory1 > factory; + HRESULT hr; + + if (!IsWindows8OrGreater ()) + return TRUE; + + if (!gst_amf_init_once ()) + return TRUE; + + amf_factory = (AMFFactory *) gst_amf_get_factory (); + if (!amf_factory) + return TRUE; + + hr = CreateDXGIFactory1 (IID_PPV_ARGS (&factory)); + if (FAILED (hr)) + return TRUE; + + /* Enumerate AMD GPUs */ + for (guint idx = 0;; idx++) { + ComPtr < IDXGIAdapter1 > adapter; + AMFContextPtr context; + DXGI_ADAPTER_DESC desc; + gint64 luid; + GstD3D11Device *device; + ID3D11Device *device_handle; + AMF_RESULT result; + D3D_FEATURE_LEVEL feature_level; + AMF_DX_VERSION dx_ver = AMF_DX11_1; + + hr = factory->EnumAdapters1 (idx, &adapter); + if (FAILED (hr)) + break; + + hr = adapter->GetDesc (&desc); + if (FAILED (hr)) + continue; + + if (desc.VendorId != 0x1002 && desc.VendorId != 0x1022) + continue; + + luid = gst_d3d11_luid_to_int64 (&desc.AdapterLuid); + device = gst_d3d11_device_new_for_adapter_luid (luid, + D3D11_CREATE_DEVICE_BGRA_SUPPORT); + + if (!device) + continue; + + device_handle = gst_d3d11_device_get_device_handle (device); + feature_level = device_handle->GetFeatureLevel (); + if (feature_level >= D3D_FEATURE_LEVEL_11_1) + dx_ver = AMF_DX11_1; + else + dx_ver = AMF_DX11_0; + + result = amf_factory->CreateContext (&context); + if (result == AMF_OK) + result = context->InitDX11 (device_handle, dx_ver); + + if (result == AMF_OK) { + gst_amf_h264_enc_register_d3d11 (plugin, device, + (gpointer) context.GetPtr (), GST_RANK_PRIMARY); + gst_amf_h265_enc_register_d3d11 (plugin, device, + (gpointer) context.GetPtr (), GST_RANK_PRIMARY); + gst_amf_av1_enc_register_d3d11 (plugin, device, + (gpointer) context.GetPtr (), GST_RANK_NONE); + } + + gst_clear_object (&device); + } + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + amfcodec, + "AMD AMF Codec plugin", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/androidmedia/gstamc.c -> gst-plugins-bad-1.22.0.tar.xz/sys/androidmedia/gstamc.c
Changed
@@ -798,13 +798,16 @@ { gboolean ret = FALSE; guint8 *cptr = NULL, *vptr = NULL; + GstMapFlags vmap_mode; guint8 **src, **dest; if (direction == COLOR_FORMAT_COPY_OUT) { src = &cptr; dest = &vptr; + vmap_mode = GST_MAP_WRITE; } else { src = &vptr; + vmap_mode = GST_MAP_READ; dest = &cptr; } @@ -813,7 +816,8 @@ GstMapInfo minfo; GST_DEBUG ("Buffer sizes equal, doing fast copy"); - gst_buffer_map (vbuffer, &minfo, GST_MAP_WRITE); + if (!gst_buffer_map (vbuffer, &minfo, vmap_mode)) + goto fail_map; cptr = cbuffer->data + cbuffer_info->offset; vptr = minfo.data; @@ -841,7 +845,8 @@ slice_height = cinfo->slice_height; g_assert (stride > 0 && slice_height > 0); - gst_video_frame_map (&vframe, vinfo, vbuffer, GST_MAP_WRITE); + if (!gst_video_frame_map (&vframe, vinfo, vbuffer, vmap_mode)) + goto fail_map; for (i = 0; i < 3; i++) { if (i == 0) { @@ -899,7 +904,9 @@ /* FIXME: This does not work for odd widths or heights * but might as well be a bug in the codec */ - gst_video_frame_map (&vframe, vinfo, vbuffer, GST_MAP_WRITE); + if (!gst_video_frame_map (&vframe, vinfo, vbuffer, vmap_mode)) + goto fail_map; + for (i = 0; i < 2; i++) { if (i == 0) { c_stride = cinfo->stride; @@ -942,7 +949,8 @@ /* This should always be set */ g_assert (cinfo->stride > 0 && cinfo->slice_height > 0); - gst_video_frame_map (&vframe, vinfo, vbuffer, GST_MAP_WRITE); + if (!gst_video_frame_map (&vframe, vinfo, vbuffer, vmap_mode)) + goto fail_map; for (i = 0; i < 2; i++) { c_stride = cinfo->stride; @@ -988,7 +996,9 @@ const size_t tile_h_chroma = (height / 2 - 1) / TILE_HEIGHT + 1; size_t luma_size = tile_w_align * tile_h_luma * TILE_SIZE; - gst_video_frame_map (&vframe, vinfo, vbuffer, GST_MAP_WRITE); + if (!gst_video_frame_map (&vframe, vinfo, vbuffer, vmap_mode)) + goto fail_map; + v_luma = GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0); v_chroma = GST_VIDEO_FRAME_PLANE_DATA (&vframe, 1); v_luma_stride = GST_VIDEO_FRAME_COMP_STRIDE (&vframe, 0); @@ -1069,6 +1079,10 @@ done: return ret; + +fail_map: + GST_ERROR ("Failed to map GStreamer buffer memory in mode %d", vmap_mode); + return FALSE; } static const struct
View file
gst-plugins-bad-1.20.5.tar.xz/sys/androidmedia/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/androidmedia/meson.build
Changed
@@ -83,7 +83,6 @@ gstphotography_dep, gmodule_dep, orc_dep, extra_deps, install : true, install_dir : plugins_install_dir) - pkgconfig.generate(gstandroidmedia, install_dir : plugins_pkgconfig_install_dir) plugins += gstandroidmedia install_data(androidmedia_java_sources,
View file
gst-plugins-bad-1.20.5.tar.xz/sys/applemedia/avfvideosrc.m -> gst-plugins-bad-1.22.0.tar.xz/sys/applemedia/avfvideosrc.m
Changed
@@ -194,6 +194,10 @@ BOOL captureScreen; BOOL captureScreenCursor; BOOL captureScreenMouseClicks; + guint cropX; + guint cropY; + guint cropWidth; + guint cropHeight; BOOL useVideoMeta; GstGLContextHelper *ctxh; @@ -214,6 +218,10 @@ @property BOOL captureScreen; @property BOOL captureScreenCursor; @property BOOL captureScreenMouseClicks; +@property guint cropX; +@property guint cropY; +@property guint cropWidth; +@property guint cropHeight; - (BOOL)openScreenInput; - (BOOL)openDeviceInput; @@ -294,7 +302,7 @@ @implementation GstAVFVideoSrcImpl @synthesize deviceIndex, deviceName, position, orientation, deviceType, doStats, - fps, captureScreen, captureScreenCursor, captureScreenMouseClicks; + fps, captureScreen, captureScreenCursor, captureScreenMouseClicks, cropX, cropY, cropWidth, cropHeight; - (id)init { @@ -393,6 +401,7 @@ return NO; #else CGDirectDisplayID displayId; + int screenHeight, screenWidth; GST_DEBUG_OBJECT (element, "Opening screen input"); @@ -403,7 +412,6 @@ AVCaptureScreenInput *screenInput = AVCaptureScreenInput alloc initWithDisplayID:displayId; - @try { screenInput setValue:NSNumber numberWithBool:captureScreenCursor forKey:@"capturesCursor"; @@ -415,6 +423,24 @@ } GST_WARNING ("Capturing cursor is only supported in OS X >= 10.8"); } + + screenHeight = CGDisplayPixelsHigh (displayId); + screenWidth = CGDisplayPixelsWide (displayId); + + if (cropX + cropWidth > screenWidth || cropY + cropHeight > screenHeight) { + GST_WARNING ("Capture region outside of screen bounds, ignoring"); + } else { + /* If width/height is not specified, assume max possible values */ + int rectWidth = cropWidth ? cropWidth : (screenWidth - cropX); + int rectHeight = cropHeight ? cropHeight : (screenHeight - cropY); + + /* cropRect (0,0) is bottom left, which feels counterintuitive. + * Make cropY relative to the top edge instead */ + CGRect cropRect = CGRectMake (cropX, screenHeight - cropY - rectHeight, + rectWidth, rectHeight); + screenInput setCropRect:cropRect; + } + screenInput.capturesMouseClicks = captureScreenMouseClicks; input = screenInput; return YES; @@ -771,7 +797,14 @@ if (captureScreen) { #if !HAVE_IOS - CGRect rect = CGDisplayBounds (self getDisplayIdFromDeviceIndex); + CGRect rect; + AVCaptureScreenInput *screenInput = (AVCaptureScreenInput *)input; + if (CGRectIsEmpty (screenInput.cropRect)) { + rect = CGDisplayBounds (self getDisplayIdFromDeviceIndex); + } else { + rect = screenInput.cropRect; + } + float scale = self getScaleFactorFromDeviceIndex; for (NSNumber *pixel_format in pixel_formats) { GstVideoFormat gst_format = self getGstVideoFormat:pixel_format; @@ -1244,6 +1277,10 @@ PROP_CAPTURE_SCREEN, PROP_CAPTURE_SCREEN_CURSOR, PROP_CAPTURE_SCREEN_MOUSE_CLICKS, + PROP_CAPTURE_SCREEN_CROP_X, + PROP_CAPTURE_SCREEN_CROP_Y, + PROP_CAPTURE_SCREEN_CROP_WIDTH, + PROP_CAPTURE_SCREEN_CROP_HEIGHT, #endif }; @@ -1353,6 +1390,22 @@ g_param_spec_boolean ("capture-screen-mouse-clicks", "Enable mouse clicks capture", "Enable mouse clicks capture while capturing screen", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_CAPTURE_SCREEN_CROP_X, + g_param_spec_uint ("screen-crop-x", "Screen capture crop X", + "Horizontal coordinate of top left corner of the screen capture area", + 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_CAPTURE_SCREEN_CROP_Y, + g_param_spec_uint ("screen-crop-y", "Screen capture crop Y", + "Vertical coordinate of top left corner of the screen capture area", + 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_CAPTURE_SCREEN_CROP_WIDTH, + g_param_spec_uint ("screen-crop-width", "Screen capture crop width", + "Width of the screen capture area (0 = maximum)", + 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_CAPTURE_SCREEN_CROP_HEIGHT, + g_param_spec_uint ("screen-crop-height", "Screen capture crop height", + "Height of the screen capture area (0 = maximum)", + 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); #endif GST_DEBUG_CATEGORY_INIT (gst_avf_video_src_debug, "avfvideosrc", @@ -1394,6 +1447,18 @@ case PROP_CAPTURE_SCREEN_MOUSE_CLICKS: g_value_set_boolean (value, impl.captureScreenMouseClicks); break; + case PROP_CAPTURE_SCREEN_CROP_X: + g_value_set_uint (value, impl.cropX); + break; + case PROP_CAPTURE_SCREEN_CROP_Y: + g_value_set_uint (value, impl.cropY); + break; + case PROP_CAPTURE_SCREEN_CROP_WIDTH: + g_value_set_uint (value, impl.cropWidth); + break; + case PROP_CAPTURE_SCREEN_CROP_HEIGHT: + g_value_set_uint (value, impl.cropHeight); + break; #endif case PROP_DEVICE_INDEX: g_value_set_int (value, impl.deviceIndex); @@ -1402,13 +1467,13 @@ g_value_set_string (value, impl.deviceName); break; case PROP_POSITION: - g_value_set_enum(value, impl.position); + g_value_set_enum (value, impl.position); break; case PROP_ORIENTATION: - g_value_set_enum(value, impl.orientation); + g_value_set_enum (value, impl.orientation); break; case PROP_DEVICE_TYPE: - g_value_set_enum(value, impl.deviceType); + g_value_set_enum (value, impl.deviceType); break; case PROP_DO_STATS: g_value_set_boolean (value, impl.doStats); @@ -1441,6 +1506,18 @@ case PROP_CAPTURE_SCREEN_MOUSE_CLICKS: impl.captureScreenMouseClicks = g_value_get_boolean (value); break; + case PROP_CAPTURE_SCREEN_CROP_X: + impl.cropX = g_value_get_uint (value); + break; + case PROP_CAPTURE_SCREEN_CROP_Y: + impl.cropY = g_value_get_uint (value); + break; + case PROP_CAPTURE_SCREEN_CROP_WIDTH: + impl.cropWidth = g_value_get_uint (value); + break; + case PROP_CAPTURE_SCREEN_CROP_HEIGHT: + impl.cropHeight = g_value_get_uint (value); + break; #endif case PROP_DEVICE_INDEX: impl.deviceIndex = g_value_get_int (value);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/applemedia/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/applemedia/meson.build
Changed
@@ -120,6 +120,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstapplemedia, install_dir : plugins_pkgconfig_install_dir) plugins += gstapplemedia endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/applemedia/vtdec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/applemedia/vtdec.c
Changed
@@ -105,6 +105,8 @@ CMTime duration); static gboolean compute_h264_decode_picture_buffer_length (GstVtdec * vtdec, GstBuffer * codec_data, int *length); +static gboolean compute_hevc_decode_picture_buffer_length (GstVtdec * vtdec, + GstBuffer * codec_data, int *length); static gboolean gst_vtdec_compute_reorder_queue_length (GstVtdec * vtdec, CMVideoCodecType cm_format, GstBuffer * codec_data); static void gst_vtdec_set_latency (GstVtdec * vtdec); @@ -116,6 +118,8 @@ GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-h264, stream-format=avc, alignment=au," " width=(int)1, MAX, height=(int)1, MAX;" + "video/x-h265, stream-format=(string){ hev1, hvc1 }, alignment=au," + " width=(int)1, MAX, height=(int)1, MAX;" "video/mpeg, mpegversion=2, systemstream=false, parsed=true;" "image/jpeg;" "video/x-prores, variant = { (string)standard, (string)hq, (string)lt," @@ -535,6 +539,8 @@ caps_name = gst_structure_get_name (structure); if (!strcmp (caps_name, "video/x-h264")) { cm_format = kCMVideoCodecType_H264; + } else if (!strcmp (caps_name, "video/x-h265")) { + cm_format = kCMVideoCodecType_HEVC; } else if (!strcmp (caps_name, "video/mpeg")) { cm_format = kCMVideoCodecType_MPEG2Video; } else if (!strcmp (caps_name, "image/jpeg")) { @@ -551,7 +557,9 @@ } } - if (cm_format == kCMVideoCodecType_H264 && state->codec_data == NULL) { + if ((cm_format == kCMVideoCodecType_H264 + || cm_format == kCMVideoCodecType_HEVC) + && state->codec_data == NULL) { GST_INFO_OBJECT (vtdec, "no codec data, wait for one"); return TRUE; } @@ -788,7 +796,12 @@ gst_buffer_map (codec_data, &map, GST_MAP_READ); atoms = CFDictionaryCreateMutable (NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - gst_vtutil_dict_set_data (atoms, CFSTR ("avcC"), map.data, map.size); + + if (cm_format == kCMVideoCodecType_HEVC) + gst_vtutil_dict_set_data (atoms, CFSTR ("hvcC"), map.data, map.size); + else + gst_vtutil_dict_set_data (atoms, CFSTR ("avcC"), map.data, map.size); + gst_vtutil_dict_set_object (extensions, CFSTR ("SampleDescriptionExtensionAtoms"), (CFTypeRef *) atoms); gst_buffer_unmap (codec_data, &map); @@ -1148,6 +1161,11 @@ &vtdec->reorder_queue_length)) { return FALSE; } + } else if (cm_format == kCMVideoCodecType_HEVC) { + if (!compute_hevc_decode_picture_buffer_length (vtdec, codec_data, + &vtdec->reorder_queue_length)) { + return FALSE; + } } else { vtdec->reorder_queue_length = 0; } @@ -1195,6 +1213,34 @@ return TRUE; } +static gboolean +compute_hevc_decode_picture_buffer_length (GstVtdec * vtdec, + GstBuffer * codec_data, int *length) +{ + /* This value should be level dependent (table A.8) + * but let's assume the maximum possible one for simplicity. */ + const gint max_luma_ps = 35651584; + const gint max_dpb_pic_buf = 6; + gint max_dbp_size, pic_size_samples_y; + + if (vtdec->video_info.width == 0 || vtdec->video_info.height == 0) + return FALSE; + + /* A.4.2 */ + pic_size_samples_y = vtdec->video_info.width * vtdec->video_info.height; + if (pic_size_samples_y <= (max_luma_ps >> 2)) + max_dbp_size = max_dpb_pic_buf * 4; + else if (pic_size_samples_y <= (max_luma_ps >> 1)) + max_dbp_size = max_dpb_pic_buf * 2; + else if (pic_size_samples_y <= ((3 * max_luma_ps) >> 2)) + max_dbp_size = (max_dpb_pic_buf * 4) / 3; + else + max_dbp_size = max_dpb_pic_buf; + + *length = MIN (max_dbp_size, 16); + return TRUE; +} + static void gst_vtdec_set_latency (GstVtdec * vtdec) {
View file
gst-plugins-bad-1.20.5.tar.xz/sys/applemedia/vtenc.c -> gst-plugins-bad-1.22.0.tar.xz/sys/applemedia/vtenc.c
Changed
@@ -71,7 +71,6 @@ #include "vtutil.h" #include <gst/pbutils/codec-utils.h> -#define VTENC_DEFAULT_USAGE 6 /* Profile: Baseline Level: 2.1 */ #define VTENC_DEFAULT_BITRATE 0 #define VTENC_DEFAULT_FRAME_REORDERING TRUE #define VTENC_DEFAULT_REALTIME FALSE @@ -239,7 +238,6 @@ gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps)); } - src_caps = gst_caps_new_simple (codec_details->mimetype, "width", GST_TYPE_INT_RANGE, min_width, max_width, "height", GST_TYPE_INT_RANGE, min_height, max_height, @@ -268,6 +266,11 @@ "stream-format", G_TYPE_STRING, "avc", "alignment", G_TYPE_STRING, "au", NULL); break; + case kCMVideoCodecType_HEVC: + gst_structure_set (gst_caps_get_structure (src_caps, 0), + "stream-format", G_TYPE_STRING, "hvc1", + "alignment", G_TYPE_STRING, "au", NULL); + break; case GST_kCMVideoCodecType_Some_AppleProRes: if (g_strcmp0 (codec_details->mimetype, "video/x-prores") == 0) { G_GNUC_BEGIN_IGNORE_DEPRECATIONS; @@ -720,7 +723,7 @@ } static CFStringRef -gst_vtenc_profile_level_key (GstVTEnc * self, const gchar * profile, +gst_vtenc_h264_profile_level_key (GstVTEnc * self, const gchar * profile, const gchar * level_arg) { char level64; @@ -763,6 +766,37 @@ return ret; } +static CFStringRef +gst_vtenc_hevc_profile_level_key (GstVTEnc * self, const gchar * profile, + const gchar * level_arg) +{ + gchar *key = NULL; + CFStringRef ret = NULL; + + if (profile == NULL || !strcmp (profile, "main")) + profile = "Main"; + else if (!strcmp (profile, "main-10")) + profile = "Main10"; + else if (!strcmp (profile, "main-422-10")) + /* TODO: this should probably be guarded with a version check (macOS 12.3+ / iOS 15.4+) + * https://developer.apple.com/documentation/videotoolbox/kvtprofilelevel_hevc_main10_autolevel */ + profile = "Main42210"; + else { + GST_ERROR_OBJECT (self, "invalid profile: %s", profile); + return ret; + } + + /* VT does not support specific levels for HEVC */ + key = g_strdup_printf ("HEVC_%s_AutoLevel", profile); + ret = CFStringCreateWithBytes (NULL, (const guint8 *) key, strlen (key), + kCFStringEncodingASCII, 0); + + GST_INFO_OBJECT (self, "negotiated profile and level %s", key); + + g_free (key); + return ret; +} + static gboolean gst_vtenc_negotiate_profile_and_level (GstVTEnc * self, GstStructure * s) { @@ -771,9 +805,16 @@ if (self->profile_level) CFRelease (self->profile_level); - self->profile_level = gst_vtenc_profile_level_key (self, profile, level); + + if (self->specific_format_id == kCMVideoCodecType_HEVC) + self->profile_level = + gst_vtenc_hevc_profile_level_key (self, profile, level); + else + self->profile_level = + gst_vtenc_h264_profile_level_key (self, profile, level); + if (self->profile_level == NULL) { - GST_ERROR_OBJECT (self, "unsupported h264 profile '%s' or level '%s'", + GST_ERROR_OBJECT (self, "unsupported profile '%s' or level '%s'", profile, level); return FALSE; } @@ -822,6 +863,11 @@ if (!gst_vtenc_negotiate_profile_and_level (self, s)) goto fail; break; + case kCMVideoCodecType_HEVC: + self->specific_format_id = kCMVideoCodecType_HEVC; + if (!gst_vtenc_negotiate_profile_and_level (self, s)) + goto fail; + break; case GST_kCMVideoCodecType_Some_AppleProRes: if (g_strcmp0 (self->details->mimetype, "video/x-prores") != 0) { GST_ERROR_OBJECT (self, "format_id == %i mimetype must be Apple " @@ -931,35 +977,48 @@ switch (self->details->format_id) { case kCMVideoCodecType_H264: + case kCMVideoCodecType_HEVC: { CMFormatDescriptionRef fmt; CFDictionaryRef atoms; - CFStringRef avccKey; - CFDataRef avcc; + CFStringRef boxKey; + CFDataRef box; guint8 *codec_data; gsize codec_data_size; GstBuffer *codec_data_buf; - guint8 sps3; + guint8 sps12; fmt = CMSampleBufferGetFormatDescription (sbuf); atoms = CMFormatDescriptionGetExtension (fmt, kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms); - avccKey = CFStringCreateWithCString (NULL, "avcC", kCFStringEncodingUTF8); - avcc = CFDictionaryGetValue (atoms, avccKey); - CFRelease (avccKey); - codec_data_size = CFDataGetLength (avcc); + + if (self->details->format_id == kCMVideoCodecType_HEVC) + boxKey = + CFStringCreateWithCString (NULL, "hvcC", kCFStringEncodingUTF8); + else + boxKey = + CFStringCreateWithCString (NULL, "avcC", kCFStringEncodingUTF8); + + box = CFDictionaryGetValue (atoms, boxKey); + CFRelease (boxKey); + codec_data_size = CFDataGetLength (box); codec_data = g_malloc (codec_data_size); - CFDataGetBytes (avcc, CFRangeMake (0, codec_data_size), codec_data); + CFDataGetBytes (box, CFRangeMake (0, codec_data_size), codec_data); codec_data_buf = gst_buffer_new_wrapped (codec_data, codec_data_size); gst_structure_set (s, "codec_data", GST_TYPE_BUFFER, codec_data_buf, NULL); - sps0 = codec_data1; - sps1 = codec_data2 & ~0xDF; - sps2 = codec_data3; - - gst_codec_utils_h264_caps_set_level_and_profile (caps, sps, 3); + if (self->details->format_id == kCMVideoCodecType_HEVC) { + sps0 = codec_data1; + sps11 = codec_data12; + gst_codec_utils_h265_caps_set_level_tier_and_profile (caps, sps, 12); + } else { + sps0 = codec_data1; + sps1 = codec_data2 & ~0xDF; + sps2 = codec_data3; + gst_codec_utils_h264_caps_set_level_and_profile (caps, sps, 3); + } gst_buffer_unref (codec_data_buf); } @@ -1189,7 +1248,7 @@ (gdouble) self->negotiated_fps_n / (gdouble) self->negotiated_fps_d); /* - * https://developer.apple.com/documentation/videotoolbox/vtcompressionsession/compression_properties/profile_and_level_constants + * https://developer.apple.com/documentation/videotoolbox/kvtcompressionpropertykey_profilelevel */ status = VTSessionSetProperty (session, kVTCompressionPropertyKey_ProfileLevel, self->profile_level); @@ -1885,8 +1944,11 @@ static const GstVTEncoderDetails gst_vtenc_codecs = { {"H.264", "h264", "video/x-h264", kCMVideoCodecType_H264, FALSE}, + {"H.265/HEVC", "h265", "video/x-h265", kCMVideoCodecType_HEVC, FALSE}, #ifndef HAVE_IOS {"H.264 (HW only)", "h264_hw", "video/x-h264", kCMVideoCodecType_H264, TRUE}, + {"H.265/HEVC (HW only)", "h265_hw", "video/x-h265", kCMVideoCodecType_HEVC, + TRUE}, #endif {"Apple ProRes", "prores", "video/x-prores", GST_kCMVideoCodecType_Some_AppleProRes, FALSE},
View file
gst-plugins-bad-1.20.5.tar.xz/sys/asio/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/asio/meson.build
Changed
@@ -80,5 +80,4 @@ cpp_args : gst_plugins_bad_args, install : true, install_dir : plugins_install_dir) -pkgconfig.generate(gstasio, install_dir : plugins_pkgconfig_install_dir) plugins += gstasio \ No newline at end of file
View file
gst-plugins-bad-1.20.5.tar.xz/sys/bluez/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/bluez/meson.build
Changed
@@ -13,9 +13,7 @@ endif bluez_dep = dependency('bluez', version : '>= 5.0', required : get_option('bluez')) -gio_unix_dep = dependency('gio-unix-2.0', version : glib_req, - fallback: 'glib', 'libgiounix_dep', - required : get_option('bluez')) +gio_unix_dep = dependency('gio-unix-2.0', required : get_option('bluez')) if bluez_dep.found() and gio_unix_dep.found() bluez_ch = gnome.gdbus_codegen('bluez', @@ -31,6 +29,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstbluez, install_dir : plugins_pkgconfig_install_dir) plugins += gstbluez endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11av1dec.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11av1dec.cpp
Changed
@@ -365,9 +365,6 @@ #pragma pack(pop) -/* reference list 8 + 4 margin */ -#define NUM_OUTPUT_VIEW 12 - /* *INDENT-OFF* */ typedef struct _GstD3D11AV1DecInner { @@ -423,11 +420,11 @@ /* GstAV1Decoder */ static GstFlowReturn gst_d3d11_av1_dec_new_sequence (GstAV1Decoder * decoder, - const GstAV1SequenceHeaderOBU * seq_hdr); + const GstAV1SequenceHeaderOBU * seq_hdr, gint max_dpb_size); static GstFlowReturn gst_d3d11_av1_dec_new_picture (GstAV1Decoder * decoder, GstVideoCodecFrame * frame, GstAV1Picture * picture); static GstAV1Picture *gst_d3d11_av1_dec_duplicate_picture (GstAV1Decoder * - decoder, GstAV1Picture * picture); + decoder, GstVideoCodecFrame * frame, GstAV1Picture * picture); static GstFlowReturn gst_d3d11_av1_dec_start_picture (GstAV1Decoder * decoder, GstAV1Picture * picture, GstAV1Dpb * dpb); static GstFlowReturn gst_d3d11_av1_dec_decode_tile (GstAV1Decoder * decoder, @@ -630,7 +627,7 @@ static GstFlowReturn gst_d3d11_av1_dec_new_sequence (GstAV1Decoder * decoder, - const GstAV1SequenceHeaderOBU * seq_hdr) + const GstAV1SequenceHeaderOBU * seq_hdr, gint max_dpb_size) { GstD3D11AV1Dec *self = GST_D3D11_AV1_DEC (decoder); GstD3D11AV1DecInner *inner = self->inner; @@ -686,14 +683,14 @@ out_format, inner->max_width, inner->max_height); if (!gst_d3d11_decoder_configure (inner->d3d11_decoder, - decoder->input_state, &info, (gint) inner->max_width, - (gint) inner->max_height, NUM_OUTPUT_VIEW)) { + decoder->input_state, &info, 0, 0, (gint) inner->max_width, + (gint) inner->max_height, max_dpb_size)) { GST_ERROR_OBJECT (self, "Failed to create decoder"); return GST_FLOW_NOT_NEGOTIATED; } if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { - GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); + GST_WARNING_OBJECT (self, "Failed to negotiate with downstream"); return GST_FLOW_NOT_NEGOTIATED; } } @@ -728,7 +725,7 @@ static GstAV1Picture * gst_d3d11_av1_dec_duplicate_picture (GstAV1Decoder * decoder, - GstAV1Picture * picture) + GstVideoCodecFrame * frame, GstAV1Picture * picture) { GstD3D11AV1Dec *self = GST_D3D11_AV1_DEC (decoder); GstBuffer *view_buffer; @@ -1204,10 +1201,8 @@ input_args.bitstream = &inner->bitstream_buffer0; input_args.bitstream_size = inner->bitstream_buffer.size (); - if (!gst_d3d11_decoder_decode_frame (inner->d3d11_decoder, view, &input_args)) - return GST_FLOW_ERROR; - - return GST_FLOW_OK; + return gst_d3d11_decoder_decode_frame (inner->d3d11_decoder, + view, &input_args); } static GstFlowReturn @@ -1230,8 +1225,9 @@ } if (!gst_d3d11_decoder_process_output (inner->d3d11_decoder, vdec, - picture->frame_hdr.render_width, picture->frame_hdr.render_height, - view_buffer, &frame->output_buffer)) { + picture->discont_state, picture->frame_hdr.render_width, + picture->frame_hdr.render_height, view_buffer, + &frame->output_buffer)) { GST_ERROR_OBJECT (self, "Failed to copy buffer"); goto error; } @@ -1341,16 +1337,10 @@ /* To cover both landscape and portrait, select max value */ resolution = MAX (max_width, max_height); - gst_caps_set_simple (sink_caps, - "width", GST_TYPE_INT_RANGE, 1, resolution, - "height", GST_TYPE_INT_RANGE, 1, resolution, NULL); - gst_caps_set_simple (src_caps, - "width", GST_TYPE_INT_RANGE, 1, resolution, - "height", GST_TYPE_INT_RANGE, 1, resolution, NULL); type_info.class_data = gst_d3d11_decoder_class_data_new (device, GST_DXVA_CODEC_AV1, - sink_caps, src_caps); + sink_caps, src_caps, resolution); type_name = g_strdup ("GstD3D11AV1Dec"); feature_name = g_strdup ("d3d11av1dec");
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11basefilter.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11basefilter.cpp
Changed
@@ -275,6 +275,14 @@ gboolean update_device = FALSE; GstCaps *in_caps = NULL; GstCaps *out_caps = NULL; + GstClockTime timestamp, stream_time; + + timestamp = GST_BUFFER_PTS (buffer); + stream_time = + gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp); + + if (GST_CLOCK_TIME_IS_VALID (stream_time)) + gst_object_sync_values (GST_OBJECT (self), stream_time); mem = gst_buffer_peek_memory (buffer, 0); /* Can happens (e.g., d3d11upload) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11compositor.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11compositor.cpp
Changed
@@ -23,11 +23,17 @@ */ /** - * SECTION:element-d3d11compositorelement - * @title: d3d11compositorelement + * SECTION:element-d3d11compositor + * @title: d3d11compositor * * A Direct3D11 based video compositing element. * + * ## Example launch line + * ``` + * gst-launch-1.0 d3d11compositor name=c ! d3d11videosink \ + * videotestsrc ! video/x-raw,width=320,height=240 ! c. \ + * videotestsrc pattern=ball ! video/x-raw,width=100,height=100 ! c. + * * Since: 1.20 * */ @@ -37,286 +43,27 @@ #endif #include "gstd3d11compositor.h" -#include "gstd3d11converter.h" -#include "gstd3d11shader.h" #include "gstd3d11pluginutils.h" #include <string.h> #include <wrl.h> -GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_compositor_debug); +GST_DEBUG_CATEGORY_STATIC (gst_d3d11_compositor_debug); #define GST_CAT_DEFAULT gst_d3d11_compositor_debug /* *INDENT-OFF* */ using namespace Microsoft::WRL; /* *INDENT-ON* */ -/** - * GstD3D11CompositorBlendOperation: - * @GST_D3D11_COMPOSITOR_BLEND_OP_ADD: - * Add source 1 and source 2 - * @GST_D3D11_COMPOSITOR_BLEND_OP_SUBTRACT: - * Subtract source 1 from source 2 - * @GST_D3D11_COMPOSITOR_BLEND_OP_REV_SUBTRACT: - * Subtract source 2 from source 1 - * @GST_D3D11_COMPOSITOR_BLEND_OP_MIN: - * Find the minimum of source 1 and source 2 - * @GST_D3D11_COMPOSITOR_BLEND_OP_MAX: - * Find the maximum of source 1 and source 2 - * - * Since: 1.20 - */ -GType -gst_d3d11_compositor_blend_operation_get_type (void) -{ - static GType blend_operation_type = 0; - - static const GEnumValue blend_operator = { - {GST_D3D11_COMPOSITOR_BLEND_OP_ADD, "Add source and background", - "add"}, - {GST_D3D11_COMPOSITOR_BLEND_OP_SUBTRACT, - "Subtract source from background", - "subtract"}, - {GST_D3D11_COMPOSITOR_BLEND_OP_REV_SUBTRACT, - "Subtract background from source", - "rev-subtract"}, - {GST_D3D11_COMPOSITOR_BLEND_OP_MIN, - "Minimum of source and background", "min"}, - {GST_D3D11_COMPOSITOR_BLEND_OP_MAX, - "Maximum of source and background", "max"}, - {0, NULL, NULL}, - }; - - if (!blend_operation_type) { - blend_operation_type = - g_enum_register_static ("GstD3D11CompositorBlendOperation", - blend_operator); - } - return blend_operation_type; -} - -static GstD3D11CompositorBlendOperation -gst_d3d11_compositor_blend_operation_from_native (D3D11_BLEND_OP blend_op) -{ - switch (blend_op) { - case D3D11_BLEND_OP_ADD: - return GST_D3D11_COMPOSITOR_BLEND_OP_ADD; - case D3D11_BLEND_OP_SUBTRACT: - return GST_D3D11_COMPOSITOR_BLEND_OP_SUBTRACT; - case D3D11_BLEND_OP_REV_SUBTRACT: - return GST_D3D11_COMPOSITOR_BLEND_OP_REV_SUBTRACT; - case D3D11_BLEND_OP_MIN: - return GST_D3D11_COMPOSITOR_BLEND_OP_MIN; - case D3D11_BLEND_OP_MAX: - return GST_D3D11_COMPOSITOR_BLEND_OP_MAX; - default: - g_assert_not_reached (); - break; - } - - return GST_D3D11_COMPOSITOR_BLEND_OP_ADD; -} - -static D3D11_BLEND_OP -gst_d3d11_compositor_blend_operation_to_native (GstD3D11CompositorBlendOperation - op) -{ - switch (op) { - case GST_D3D11_COMPOSITOR_BLEND_OP_ADD: - return D3D11_BLEND_OP_ADD; - case GST_D3D11_COMPOSITOR_BLEND_OP_SUBTRACT: - return D3D11_BLEND_OP_SUBTRACT; - case GST_D3D11_COMPOSITOR_BLEND_OP_REV_SUBTRACT: - return D3D11_BLEND_OP_REV_SUBTRACT; - case GST_D3D11_COMPOSITOR_BLEND_OP_MIN: - return D3D11_BLEND_OP_MIN; - case GST_D3D11_COMPOSITOR_BLEND_OP_MAX: - return D3D11_BLEND_OP_MAX; - default: - g_assert_not_reached (); - break; - } - - return D3D11_BLEND_OP_ADD; -} - -/** - * GstD3D11CompositorBlend: - * @GST_D3D11_COMPOSITOR_BLEND_ZERO: - * The blend factor is (0, 0, 0, 0). No pre-blend operation. - * @GST_D3D11_COMPOSITOR_BLEND_ONE: - * The blend factor is (1, 1, 1, 1). No pre-blend operation. - * @GST_D3D11_COMPOSITOR_BLEND_SRC_COLOR: - * The blend factor is (Rs, Gs, Bs, As), - * that is color data (RGB) from a pixel shader. No pre-blend operation. - * @GST_D3D11_COMPOSITOR_BLEND_INV_SRC_COLOR: - * The blend factor is (1 - Rs, 1 - Gs, 1 - Bs, 1 - As), - * that is color data (RGB) from a pixel shader. - * The pre-blend operation inverts the data, generating 1 - RGB. - * @GST_D3D11_COMPOSITOR_BLEND_SRC_ALPHA: - * The blend factor is (As, As, As, As), - * that is alpha data (A) from a pixel shader. No pre-blend operation. - * @GST_D3D11_COMPOSITOR_BLEND_INV_SRC_ALPHA: - * The blend factor is ( 1 - As, 1 - As, 1 - As, 1 - As), - * that is alpha data (A) from a pixel shader. - * The pre-blend operation inverts the data, generating 1 - A. - * @GST_D3D11_COMPOSITOR_BLEND_DEST_ALPHA: - * The blend factor is (Ad, Ad, Ad, Ad), - * that is alpha data from a render target. No pre-blend operation. - * @GST_D3D11_COMPOSITOR_BLEND_INV_DEST_ALPHA: - * The blend factor is (1 - Ad, 1 - Ad, 1 - Ad, 1 - Ad), - * that is alpha data from a render target. - * The pre-blend operation inverts the data, generating 1 - A. - * @GST_D3D11_COMPOSITOR_BLEND_DEST_COLOR: - * The blend factor is (Rd, Gd, Bd, Ad), - * that is color data from a render target. No pre-blend operation. - * @GST_D3D11_COMPOSITOR_BLEND_INV_DEST_COLOR: - * The blend factor is (1 - Rd, 1 - Gd, 1 - Bd, 1 - Ad), - * that is color data from a render target. - * The pre-blend operation inverts the data, generating 1 - RGB. - * @GST_D3D11_COMPOSITOR_BLEND_SRC_ALPHA_SAT: - * The blend factor is (f, f, f, 1); where f = min(As, 1 - Ad). - * The pre-blend operation clamps the data to 1 or less. - * @GST_D3D11_COMPOSITOR_BLEND_BLEND_FACTOR: - * The blend factor is the blend factor set with - * ID3D11DeviceContext::OMSetBlendState. No pre-blend operation. - * @GST_D3D11_COMPOSITOR_BLEND_INV_BLEND_FACTOR: - * The blend factor is the blend factor set with - * ID3D11DeviceContext::OMSetBlendState. - * The pre-blend operation inverts the blend factor, - * generating 1 - blend_factor. - * - * Since: 1.20 - */ -GType -gst_d3d11_compositor_blend_get_type (void) -{ - static GType blend_type = 0; - - static const GEnumValue blend = { - {GST_D3D11_COMPOSITOR_BLEND_ZERO, - "The blend factor is (0, 0, 0, 0)", "zero"}, - {GST_D3D11_COMPOSITOR_BLEND_ONE, - "The blend factor is (1, 1, 1, 1)", "one"}, - {GST_D3D11_COMPOSITOR_BLEND_SRC_COLOR, - "The blend factor is (Rs, Gs, Bs, As)", "src-color"}, - {GST_D3D11_COMPOSITOR_BLEND_INV_SRC_COLOR, - "The blend factor is (1 - Rs, 1 - Gs, 1 - Bs, 1 - As)", - "inv-src-color"}, - {GST_D3D11_COMPOSITOR_BLEND_SRC_ALPHA, - "The blend factor is (As, As, As, As)", "src-alpha"}, - {GST_D3D11_COMPOSITOR_BLEND_INV_SRC_ALPHA, - "The blend factor is (1 - As, 1 - As, 1 - As, 1 - As)", - "inv-src-alpha"}, - {GST_D3D11_COMPOSITOR_BLEND_DEST_ALPHA, - "The blend factor is (Ad, Ad, Ad, Ad)", "dest-alpha"}, - {GST_D3D11_COMPOSITOR_BLEND_INV_DEST_ALPHA, - "The blend factor is (1 - Ad, 1 - Ad, 1 - Ad, 1 - Ad)", - "inv-dest-alpha"}, - {GST_D3D11_COMPOSITOR_BLEND_DEST_COLOR, - "The blend factor is (Rd, Gd, Bd, Ad)", "dest-color"}, - {GST_D3D11_COMPOSITOR_BLEND_INV_DEST_COLOR, - "The blend factor is (1 - Rd, 1 - Gd, 1 - Bd, 1 - Ad)", - "inv-dest-color"}, - {GST_D3D11_COMPOSITOR_BLEND_SRC_ALPHA_SAT, - "The blend factor is (f, f, f, 1); where f = min(As, 1 - Ad)", - "src-alpha-sat"}, - {GST_D3D11_COMPOSITOR_BLEND_BLEND_FACTOR, - "User defined blend factor", "blend-factor"}, - {GST_D3D11_COMPOSITOR_BLEND_INV_BLEND_FACTOR, - "Inverse of user defined blend factor", "inv-blend-factor"}, - {0, NULL, NULL}, - }; - - if (!blend_type) { - blend_type = g_enum_register_static ("GstD3D11CompositorBlend", blend); - } - return blend_type; -} - -static GstD3D11CompositorBlend -gst_d3d11_compositor_blend_from_native (D3D11_BLEND blend) -{ - switch (blend) { - case D3D11_BLEND_ZERO: - return GST_D3D11_COMPOSITOR_BLEND_ZERO; - case D3D11_BLEND_ONE: - return GST_D3D11_COMPOSITOR_BLEND_ONE; - case D3D11_BLEND_SRC_COLOR: - return GST_D3D11_COMPOSITOR_BLEND_SRC_COLOR; - case D3D11_BLEND_INV_SRC_COLOR: - return GST_D3D11_COMPOSITOR_BLEND_INV_SRC_COLOR; - case D3D11_BLEND_SRC_ALPHA: - return GST_D3D11_COMPOSITOR_BLEND_SRC_ALPHA; - case D3D11_BLEND_INV_SRC_ALPHA: - return GST_D3D11_COMPOSITOR_BLEND_INV_SRC_ALPHA; - case D3D11_BLEND_DEST_ALPHA: - return GST_D3D11_COMPOSITOR_BLEND_DEST_ALPHA; - case D3D11_BLEND_INV_DEST_ALPHA: - return GST_D3D11_COMPOSITOR_BLEND_INV_DEST_ALPHA; - case D3D11_BLEND_DEST_COLOR: - return GST_D3D11_COMPOSITOR_BLEND_DEST_COLOR; - case D3D11_BLEND_INV_DEST_COLOR: - return GST_D3D11_COMPOSITOR_BLEND_INV_DEST_COLOR; - case D3D11_BLEND_SRC_ALPHA_SAT: - return GST_D3D11_COMPOSITOR_BLEND_SRC_ALPHA_SAT; - case D3D11_BLEND_BLEND_FACTOR: - return GST_D3D11_COMPOSITOR_BLEND_BLEND_FACTOR; - case D3D11_BLEND_INV_BLEND_FACTOR: - return GST_D3D11_COMPOSITOR_BLEND_INV_BLEND_FACTOR; - default: - g_assert_not_reached (); - break; - } - - return GST_D3D11_COMPOSITOR_BLEND_ZERO; -} - -static D3D11_BLEND -gst_d3d11_compositor_blend_to_native (GstD3D11CompositorBlend blend) +typedef enum { - switch (blend) { - case GST_D3D11_COMPOSITOR_BLEND_ZERO: - return D3D11_BLEND_ZERO; - case GST_D3D11_COMPOSITOR_BLEND_ONE: - return D3D11_BLEND_ONE; - case GST_D3D11_COMPOSITOR_BLEND_SRC_COLOR: - return D3D11_BLEND_SRC_COLOR; - case GST_D3D11_COMPOSITOR_BLEND_INV_SRC_COLOR: - return D3D11_BLEND_INV_SRC_COLOR; - case GST_D3D11_COMPOSITOR_BLEND_SRC_ALPHA: - return D3D11_BLEND_SRC_ALPHA; - case GST_D3D11_COMPOSITOR_BLEND_INV_SRC_ALPHA: - return D3D11_BLEND_INV_SRC_ALPHA; - case GST_D3D11_COMPOSITOR_BLEND_DEST_ALPHA: - return D3D11_BLEND_DEST_ALPHA; - case GST_D3D11_COMPOSITOR_BLEND_INV_DEST_ALPHA: - return D3D11_BLEND_INV_DEST_ALPHA; - case GST_D3D11_COMPOSITOR_BLEND_DEST_COLOR: - return D3D11_BLEND_DEST_COLOR; - case GST_D3D11_COMPOSITOR_BLEND_INV_DEST_COLOR: - return D3D11_BLEND_INV_DEST_COLOR; - case GST_D3D11_COMPOSITOR_BLEND_SRC_ALPHA_SAT: - return D3D11_BLEND_SRC_ALPHA_SAT; - case GST_D3D11_COMPOSITOR_BLEND_BLEND_FACTOR: - return D3D11_BLEND_BLEND_FACTOR; - case GST_D3D11_COMPOSITOR_BLEND_INV_BLEND_FACTOR: - return D3D11_BLEND_INV_BLEND_FACTOR; - default: - g_assert_not_reached (); - break; - } - - return D3D11_BLEND_ZERO; -} - -/** - * GstD3D11CompositorBackground: - * - * Background mode - * - * Since: 1.20 - */ -GType + GST_D3D11_COMPOSITOR_BACKGROUND_CHECKER, + GST_D3D11_COMPOSITOR_BACKGROUND_BLACK, + GST_D3D11_COMPOSITOR_BACKGROUND_WHITE, + GST_D3D11_COMPOSITOR_BACKGROUND_TRANSPARENT, +} GstD3D11CompositorBackground; + +#define GST_TYPE_D3D11_COMPOSITOR_BACKGROUND (gst_d3d11_compositor_background_get_type()) +static GType gst_d3d11_compositor_background_get_type (void) { static GType compositor_background_type = 0; @@ -327,7 +74,7 @@ {GST_D3D11_COMPOSITOR_BACKGROUND_WHITE, "White", "white"}, {GST_D3D11_COMPOSITOR_BACKGROUND_TRANSPARENT, "Transparent Background to enable further compositing", "transparent"}, - {0, NULL, NULL}, + {0, nullptr, nullptr}, }; if (!compositor_background_type) { @@ -338,14 +85,45 @@ return compositor_background_type; } +typedef enum +{ + GST_D3D11_COMPOSITOR_OPERATOR_SOURCE, + GST_D3D11_COMPOSITOR_OPERATOR_OVER, +} GstD3D11CompositorOperator; + /** - * GstD3D11CompositorSizingPolicy: + * GstD3D11CompositorOperator: * - * Sizing policy - * - * Since: 1.20 + * Since: 1.22 */ -GType +#define GST_TYPE_D3D11_COMPOSITOR_OPERATOR (gst_d3d11_compositor_operator_get_type()) +static GType +gst_d3d11_compositor_operator_get_type (void) +{ + static GType compositor_operator_type = 0; + + static const GEnumValue compositor_operator = { + {GST_D3D11_COMPOSITOR_OPERATOR_SOURCE, "Source", "source"}, + {GST_D3D11_COMPOSITOR_OPERATOR_OVER, "Over", "over"}, + {0, nullptr, nullptr}, + }; + + if (!compositor_operator_type) { + compositor_operator_type = + g_enum_register_static ("GstD3D11CompositorOperator", + compositor_operator); + } + return compositor_operator_type; +} + +typedef enum +{ + GST_D3D11_COMPOSITOR_SIZING_POLICY_NONE, + GST_D3D11_COMPOSITOR_SIZING_POLICY_KEEP_ASPECT_RATIO, +} GstD3D11CompositorSizingPolicy; + +#define GST_TYPE_D3D11_COMPOSITOR_SIZING_POLICY (gst_d3d11_compositor_sizing_policy_get_type()) +static GType gst_d3d11_compositor_sizing_policy_get_type (void) { static GType sizing_policy_type = 0; @@ -360,7 +138,7 @@ "with preserved aspect ratio. Resulting image will be centered in " "the destination rectangle with padding if necessary", "keep-aspect-ratio"}, - {0, NULL, NULL}, + {0, nullptr, nullptr}, }; if (!sizing_policy_type) { @@ -388,7 +166,7 @@ " return input;\n" "}\n"; -static const gchar checker_ps_src = +static const gchar checker_ps_src_rgb = "static const float blocksize = 8.0;\n" "static const float4 high = float4(0.667, 0.667, 0.667, 1.0);\n" "static const float4 low = float4(0.333, 0.333, 0.333, 1.0);\n" @@ -416,51 +194,138 @@ " }\n" " return output;\n" "}\n"; + +static const gchar checker_ps_src_vuya = + "static const float blocksize = 8.0;\n" + "static const float4 high = float4(0.5, 0.5, 0.667, 1.0);\n" + "static const float4 low = float4(0.5, 0.5, 0.333, 1.0);\n" + "struct PS_INPUT\n" + "{\n" + " float4 Position: SV_POSITION;\n" + "};\n" + "struct PS_OUTPUT\n" + "{\n" + " float4 Plane: SV_TARGET;\n" + "};\n" + "PS_OUTPUT main(PS_INPUT input)\n" + "{\n" + " PS_OUTPUT output;\n" + " if ((input.Position.x % (blocksize * 2.0)) >= blocksize) {\n" + " if ((input.Position.y % (blocksize * 2.0)) >= blocksize)\n" + " output.Plane = low;\n" + " else\n" + " output.Plane = high;\n" + " } else {\n" + " if ((input.Position.y % (blocksize * 2.0)) < blocksize)\n" + " output.Plane = low;\n" + " else\n" + " output.Plane = high;\n" + " }\n" + " return output;\n" + "}\n"; + +static const gchar checker_ps_src_luma = + "static const float blocksize = 8.0;\n" + "static const float4 high = float4(0.667, 0.0, 0.0, 1.0);\n" + "static const float4 low = float4(0.333, 0.0, 0.0, 1.0);\n" + "struct PS_INPUT\n" + "{\n" + " float4 Position: SV_POSITION;\n" + "};\n" + "struct PS_OUTPUT\n" + "{\n" + " float4 Plane: SV_TARGET;\n" + "};\n" + "PS_OUTPUT main(PS_INPUT input)\n" + "{\n" + " PS_OUTPUT output;\n" + " if ((input.Position.x % (blocksize * 2.0)) >= blocksize) {\n" + " if ((input.Position.y % (blocksize * 2.0)) >= blocksize)\n" + " output.Plane = low;\n" + " else\n" + " output.Plane = high;\n" + " } else {\n" + " if ((input.Position.y % (blocksize * 2.0)) < blocksize)\n" + " output.Plane = low;\n" + " else\n" + " output.Plane = high;\n" + " }\n" + " return output;\n" + "}\n"; + +static D3D11_RENDER_TARGET_BLEND_DESC blend_templ = { + /* SOURCE */ + { + TRUE, + D3D11_BLEND_ONE, D3D11_BLEND_ZERO, D3D11_BLEND_OP_ADD, + D3D11_BLEND_ONE, D3D11_BLEND_ZERO, D3D11_BLEND_OP_ADD, + D3D11_COLOR_WRITE_ENABLE_ALL + }, + /* OVER */ + { + TRUE, + D3D11_BLEND_SRC_ALPHA, D3D11_BLEND_INV_SRC_ALPHA, D3D11_BLEND_OP_ADD, + D3D11_BLEND_ONE, D3D11_BLEND_INV_SRC_ALPHA, D3D11_BLEND_OP_ADD, + D3D11_COLOR_WRITE_ENABLE_ALL, + }, +}; /* *INDENT-ON* */ -/** - * GstD3D11CompositorPad: - * - * Since: 1.20 - */ struct _GstD3D11CompositorPad { GstVideoAggregatorConvertPad parent; GstD3D11Converter *convert; - GstBufferPool *fallback_pool; - GstBuffer *fallback_buf; - gboolean position_updated; gboolean alpha_updated; gboolean blend_desc_updated; + gboolean config_updated; ID3D11BlendState *blend; + D3D11_RENDER_TARGET_BLEND_DESC desc; + /* properties */ gint xpos; gint ypos; gint width; gint height; gdouble alpha; - D3D11_RENDER_TARGET_BLEND_DESC desc; - gfloat blend_factor4; + GstD3D11CompositorOperator op; GstD3D11CompositorSizingPolicy sizing_policy; + GstVideoGammaMode gamma_mode; + GstVideoPrimariesMode primaries_mode; }; +typedef struct +{ + ID3D11PixelShader *ps; + ID3D11VertexShader *vs; + ID3D11InputLayout *layout; + ID3D11Buffer *vertex_buffer; + ID3D11Buffer *index_buffer; + D3D11_VIEWPORT viewport; +} GstD3D11CompositorQuad; + +typedef struct +{ + /* rtvcolors */ + FLOAT color44; +} GstD3D11CompositorClearColor; + struct _GstD3D11Compositor { GstVideoAggregator parent; GstD3D11Device *device; - GstBufferPool *fallback_pool; GstBuffer *fallback_buf; - GstD3D11Quad *checker_background; - D3D11_VIEWPORT viewport; + GstD3D11CompositorQuad *checker_background; + /* black/white/transparent */ + GstD3D11CompositorClearColor clear_color3; - gboolean reconfigured; + gboolean downstream_supports_d3d11; /* properties */ gint adapter; @@ -475,17 +340,10 @@ PROP_PAD_WIDTH, PROP_PAD_HEIGHT, PROP_PAD_ALPHA, - PROP_PAD_BLEND_OP_RGB, - PROP_PAD_BLEND_OP_ALPHA, - PROP_PAD_BLEND_SRC_RGB, - PROP_PAD_BLEND_SRC_ALPHA, - PROP_PAD_BLEND_DEST_RGB, - PROP_PAD_BLEND_DEST_ALPHA, - PROP_PAD_BLEND_FACTOR_RED, - PROP_PAD_BLEND_FACTOR_GREEN, - PROP_PAD_BLEND_FACTOR_BLUE, - PROP_PAD_BLEND_FACTOR_ALPHA, + PROP_PAD_OPERATOR, PROP_PAD_SIZING_POLICY, + PROP_PAD_GAMMA_MODE, + PROP_PAD_PRIMARIES_MODE, }; #define DEFAULT_PAD_XPOS 0 @@ -493,13 +351,10 @@ #define DEFAULT_PAD_WIDTH 0 #define DEFAULT_PAD_HEIGHT 0 #define DEFAULT_PAD_ALPHA 1.0 -#define DEFAULT_PAD_BLEND_OP_RGB GST_D3D11_COMPOSITOR_BLEND_OP_ADD -#define DEFAULT_PAD_BLEND_OP_ALPHA GST_D3D11_COMPOSITOR_BLEND_OP_ADD -#define DEFAULT_PAD_BLEND_SRC_RGB GST_D3D11_COMPOSITOR_BLEND_SRC_ALPHA -#define DEFAULT_PAD_BLEND_SRC_ALPHA GST_D3D11_COMPOSITOR_BLEND_ONE -#define DEFAULT_PAD_BLEND_DEST_RGB GST_D3D11_COMPOSITOR_BLEND_INV_SRC_ALPHA -#define DEFAULT_PAD_BLEND_DEST_ALPHA GST_D3D11_COMPOSITOR_BLEND_INV_SRC_ALPHA +#define DEFAULT_PAD_OPERATOR GST_D3D11_COMPOSITOR_OPERATOR_OVER #define DEFAULT_PAD_SIZING_POLICY GST_D3D11_COMPOSITOR_SIZING_POLICY_NONE +#define DEFAULT_PAD_GAMMA_MODE GST_VIDEO_GAMMA_MODE_NONE +#define DEFAULT_PAD_PRIMARIES_MODE GST_VIDEO_PRIMARIES_MODE_NONE static void gst_d3d11_compositor_pad_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -509,11 +364,8 @@ gst_d3d11_compositor_pad_prepare_frame (GstVideoAggregatorPad * pad, GstVideoAggregator * vagg, GstBuffer * buffer, GstVideoFrame * prepared_frame); -static void -gst_d3d11_compositor_pad_clean_frame (GstVideoAggregatorPad * pad, +static void gst_d3d11_compositor_pad_clean_frame (GstVideoAggregatorPad * vpad, GstVideoAggregator * vagg, GstVideoFrame * prepared_frame); -static void -gst_d3d11_compositor_pad_init_blend_options (GstD3D11CompositorPad * pad); #define gst_d3d11_compositor_pad_parent_class parent_pad_class G_DEFINE_TYPE (GstD3D11CompositorPad, gst_d3d11_compositor_pad, @@ -522,144 +374,79 @@ static void gst_d3d11_compositor_pad_class_init (GstD3D11CompositorPadClass * klass) { - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstVideoAggregatorPadClass *vaggpadclass = + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstVideoAggregatorPadClass *vagg_pad_class = GST_VIDEO_AGGREGATOR_PAD_CLASS (klass); + GParamFlags param_flags = (GParamFlags) + (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS); - gobject_class->set_property = gst_d3d11_compositor_pad_set_property; - gobject_class->get_property = gst_d3d11_compositor_pad_get_property; + object_class->set_property = gst_d3d11_compositor_pad_set_property; + object_class->get_property = gst_d3d11_compositor_pad_get_property; - g_object_class_install_property (gobject_class, PROP_PAD_XPOS, + g_object_class_install_property (object_class, PROP_PAD_XPOS, g_param_spec_int ("xpos", "X Position", "X position of the picture", - G_MININT, G_MAXINT, DEFAULT_PAD_XPOS, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_PAD_YPOS, + G_MININT, G_MAXINT, DEFAULT_PAD_XPOS, param_flags)); + g_object_class_install_property (object_class, PROP_PAD_YPOS, g_param_spec_int ("ypos", "Y Position", "Y position of the picture", - G_MININT, G_MAXINT, DEFAULT_PAD_YPOS, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_PAD_WIDTH, + G_MININT, G_MAXINT, DEFAULT_PAD_YPOS, param_flags)); + g_object_class_install_property (object_class, PROP_PAD_WIDTH, g_param_spec_int ("width", "Width", "Width of the picture", - G_MININT, G_MAXINT, DEFAULT_PAD_WIDTH, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_PAD_HEIGHT, + G_MININT, G_MAXINT, DEFAULT_PAD_WIDTH, param_flags)); + g_object_class_install_property (object_class, PROP_PAD_HEIGHT, g_param_spec_int ("height", "Height", "Height of the picture", - G_MININT, G_MAXINT, DEFAULT_PAD_HEIGHT, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_PAD_ALPHA, + G_MININT, G_MAXINT, DEFAULT_PAD_HEIGHT, param_flags)); + g_object_class_install_property (object_class, PROP_PAD_ALPHA, g_param_spec_double ("alpha", "Alpha", "Alpha of the picture", 0.0, 1.0, - DEFAULT_PAD_ALPHA, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_PAD_BLEND_OP_RGB, - g_param_spec_enum ("blend-op-rgb", "Blend Operation RGB", - "Blend equation for RGB", GST_TYPE_D3D11_COMPOSITOR_BLEND_OPERATION, - DEFAULT_PAD_BLEND_OP_RGB, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_PAD_BLEND_OP_ALPHA, - g_param_spec_enum ("blend-op-alpha", "Blend Operation Alpha", - "Blend equation for alpha", GST_TYPE_D3D11_COMPOSITOR_BLEND_OPERATION, - DEFAULT_PAD_BLEND_OP_ALPHA, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, - PROP_PAD_BLEND_SRC_RGB, - g_param_spec_enum ("blend-src-rgb", "Blend Source RGB", - "Blend factor for source RGB", - GST_TYPE_D3D11_COMPOSITOR_BLEND, - DEFAULT_PAD_BLEND_SRC_RGB, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, - PROP_PAD_BLEND_SRC_ALPHA, - g_param_spec_enum ("blend-src-alpha", - "Blend Source Alpha", - "Blend factor for source alpha, \"*-color\" values are not allowed", - GST_TYPE_D3D11_COMPOSITOR_BLEND, - DEFAULT_PAD_BLEND_SRC_ALPHA, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, - PROP_PAD_BLEND_DEST_RGB, - g_param_spec_enum ("blend-dest-rgb", - "Blend Destination RGB", - "Blend factor for destination RGB", - GST_TYPE_D3D11_COMPOSITOR_BLEND, - DEFAULT_PAD_BLEND_DEST_RGB, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, - PROP_PAD_BLEND_DEST_ALPHA, - g_param_spec_enum ("blend-dest-alpha", - "Blend Destination Alpha", - "Blend factor for destination alpha, " - "\"*-color\" values are not allowed", - GST_TYPE_D3D11_COMPOSITOR_BLEND, - DEFAULT_PAD_BLEND_DEST_ALPHA, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_PAD_BLEND_FACTOR_RED, - g_param_spec_float ("blend-factor-red", "Blend Factor Red", - "Blend factor for red component " - "when blend type is \"blend-factor\" or \"inv-blend-factor\"", - 0.0, 1.0, 1.0, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_PAD_BLEND_FACTOR_GREEN, - g_param_spec_float ("blend-factor-green", "Blend Factor Green", - "Blend factor for green component " - "when blend type is \"blend-factor\" or \"inv-blend-factor\"", - 0.0, 1.0, 1.0, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_PAD_BLEND_FACTOR_BLUE, - g_param_spec_float ("blend-factor-blue", "Blend Factor Blue", - "Blend factor for blue component " - "when blend type is \"blend-factor\" or \"inv-blend-factor\"", - 0.0, 1.0, 1.0, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_PAD_BLEND_FACTOR_ALPHA, - g_param_spec_float ("blend-factor-alpha", "Blend Factor Alpha", - "Blend factor for alpha component " - "when blend type is \"blend-factor\" or \"inv-blend-factor\"", - 0.0, 1.0, 1.0, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); - - g_object_class_install_property (gobject_class, PROP_PAD_SIZING_POLICY, + DEFAULT_PAD_ALPHA, param_flags)); + + /** + * GstD3D11CompositorPad:operator: + * + * Blending operator to use for blending this pad over the previous ones + * + * Since: 1.22 + */ + g_object_class_install_property (object_class, PROP_PAD_OPERATOR, + g_param_spec_enum ("operator", "Operator", + "Blending operator to use for blending this pad over the previous ones", + GST_TYPE_D3D11_COMPOSITOR_OPERATOR, DEFAULT_PAD_OPERATOR, + param_flags)); + g_object_class_install_property (object_class, PROP_PAD_SIZING_POLICY, g_param_spec_enum ("sizing-policy", "Sizing policy", "Sizing policy to use for image scaling", GST_TYPE_D3D11_COMPOSITOR_SIZING_POLICY, DEFAULT_PAD_SIZING_POLICY, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | - G_PARAM_STATIC_STRINGS))); + param_flags)); + + /** + * GstD3D11CompositorPad:gamma-mode: + * + * Gamma conversion mode + * + * Since: 1.22 + */ + g_object_class_install_property (object_class, PROP_PAD_GAMMA_MODE, + g_param_spec_enum ("gamma-mode", "Gamma mode", + "Gamma conversion mode", GST_TYPE_VIDEO_GAMMA_MODE, + DEFAULT_PAD_GAMMA_MODE, param_flags)); + + /** + * GstD3D11CompositorPad:primaries-mode: + * + * Primaries conversion mode + * + * Since: 1.22 + */ + g_object_class_install_property (object_class, PROP_PAD_PRIMARIES_MODE, + g_param_spec_enum ("primaries-mode", "Primaries Mode", + "Primaries conversion mode", GST_TYPE_VIDEO_PRIMARIES_MODE, + DEFAULT_PAD_PRIMARIES_MODE, param_flags)); - vaggpadclass->prepare_frame = + vagg_pad_class->prepare_frame = GST_DEBUG_FUNCPTR (gst_d3d11_compositor_pad_prepare_frame); - vaggpadclass->clean_frame = + vagg_pad_class->clean_frame = GST_DEBUG_FUNCPTR (gst_d3d11_compositor_pad_clean_frame); - gst_type_mark_as_plugin_api (GST_TYPE_D3D11_COMPOSITOR_BLEND, - (GstPluginAPIFlags) 0); - gst_type_mark_as_plugin_api (GST_TYPE_D3D11_COMPOSITOR_BLEND_OPERATION, + gst_type_mark_as_plugin_api (GST_TYPE_D3D11_COMPOSITOR_OPERATOR, (GstPluginAPIFlags) 0); gst_type_mark_as_plugin_api (GST_TYPE_D3D11_COMPOSITOR_SIZING_POLICY, (GstPluginAPIFlags) 0); @@ -673,36 +460,23 @@ pad->width = DEFAULT_PAD_WIDTH; pad->height = DEFAULT_PAD_HEIGHT; pad->alpha = DEFAULT_PAD_ALPHA; + pad->op = DEFAULT_PAD_OPERATOR; pad->sizing_policy = DEFAULT_PAD_SIZING_POLICY; - - gst_d3d11_compositor_pad_init_blend_options (pad); + pad->desc = blend_templDEFAULT_PAD_OPERATOR; + pad->gamma_mode = DEFAULT_PAD_GAMMA_MODE; + pad->primaries_mode = DEFAULT_PAD_PRIMARIES_MODE; } static void -gst_d3d11_compositor_pad_update_blend_function (GstD3D11CompositorPad * pad, - D3D11_BLEND * value, GstD3D11CompositorBlend new_value) +gst_d3d11_compositor_pad_update_position (GstD3D11CompositorPad * self, + gint * old, const GValue * value) { - D3D11_BLEND temp = gst_d3d11_compositor_blend_to_native (new_value); + gint tmp = g_value_get_int (value); - if (temp == *value) - return; - - *value = temp; - pad->blend_desc_updated = TRUE; -} - -static void -gst_d3d11_compositor_pad_update_blend_equation (GstD3D11CompositorPad * pad, - D3D11_BLEND_OP * value, GstD3D11CompositorBlendOperation new_value) -{ - D3D11_BLEND_OP temp = - gst_d3d11_compositor_blend_operation_to_native (new_value); - - if (temp == *value) - return; - - *value = temp; - pad->blend_desc_updated = TRUE; + if (*old != tmp) { + *old = tmp; + self->position_updated = TRUE; + } } static void @@ -713,23 +487,18 @@ switch (prop_id) { case PROP_PAD_XPOS: - pad->xpos = g_value_get_int (value); - pad->position_updated = TRUE; + gst_d3d11_compositor_pad_update_position (pad, &pad->xpos, value); break; case PROP_PAD_YPOS: - pad->ypos = g_value_get_int (value); - pad->position_updated = TRUE; + gst_d3d11_compositor_pad_update_position (pad, &pad->ypos, value); break; case PROP_PAD_WIDTH: - pad->width = g_value_get_int (value); - pad->position_updated = TRUE; + gst_d3d11_compositor_pad_update_position (pad, &pad->width, value); break; case PROP_PAD_HEIGHT: - pad->height = g_value_get_int (value); - pad->position_updated = TRUE; + gst_d3d11_compositor_pad_update_position (pad, &pad->height, value); break; - case PROP_PAD_ALPHA: - { + case PROP_PAD_ALPHA:{ gdouble alpha = g_value_get_double (value); if (pad->alpha != alpha) { pad->alpha_updated = TRUE; @@ -737,70 +506,42 @@ } break; } - case PROP_PAD_BLEND_OP_RGB: - gst_d3d11_compositor_pad_update_blend_equation (pad, &pad->desc.BlendOp, - (GstD3D11CompositorBlendOperation) g_value_get_enum (value)); - break; - case PROP_PAD_BLEND_OP_ALPHA: - gst_d3d11_compositor_pad_update_blend_equation (pad, - &pad->desc.BlendOpAlpha, - (GstD3D11CompositorBlendOperation) g_value_get_enum (value)); - break; - case PROP_PAD_BLEND_SRC_RGB: - gst_d3d11_compositor_pad_update_blend_function (pad, &pad->desc.SrcBlend, - (GstD3D11CompositorBlend) g_value_get_enum (value)); - break; - case PROP_PAD_BLEND_SRC_ALPHA: - { - GstD3D11CompositorBlend blend = - (GstD3D11CompositorBlend) g_value_get_enum (value); - if (blend == GST_D3D11_COMPOSITOR_BLEND_SRC_COLOR || - blend == GST_D3D11_COMPOSITOR_BLEND_INV_SRC_COLOR || - blend == GST_D3D11_COMPOSITOR_BLEND_DEST_COLOR || - blend == GST_D3D11_COMPOSITOR_BLEND_INV_DEST_COLOR) { - g_warning ("%d is not allowed for %s", blend, pspec->name); - } else { - gst_d3d11_compositor_pad_update_blend_function (pad, - &pad->desc.SrcBlendAlpha, blend); + case PROP_PAD_OPERATOR:{ + GstD3D11CompositorOperator op = + (GstD3D11CompositorOperator) g_value_get_enum (value); + if (op != pad->op) { + pad->op = op; + pad->desc = blend_templop; + pad->blend_desc_updated = TRUE; } break; } - case PROP_PAD_BLEND_DEST_RGB: - gst_d3d11_compositor_pad_update_blend_function (pad, &pad->desc.DestBlend, - (GstD3D11CompositorBlend) g_value_get_enum (value)); - break; - case PROP_PAD_BLEND_DEST_ALPHA: - { - GstD3D11CompositorBlend blend = - (GstD3D11CompositorBlend) g_value_get_enum (value); - if (blend == GST_D3D11_COMPOSITOR_BLEND_SRC_COLOR || - blend == GST_D3D11_COMPOSITOR_BLEND_INV_SRC_COLOR || - blend == GST_D3D11_COMPOSITOR_BLEND_DEST_COLOR || - blend == GST_D3D11_COMPOSITOR_BLEND_INV_DEST_COLOR) { - g_warning ("%d is not allowed for %s", blend, pspec->name); - } else { - gst_d3d11_compositor_pad_update_blend_function (pad, - &pad->desc.DestBlendAlpha, blend); + case PROP_PAD_SIZING_POLICY:{ + GstD3D11CompositorSizingPolicy policy = + (GstD3D11CompositorSizingPolicy) g_value_get_enum (value); + if (pad->sizing_policy != policy) { + pad->sizing_policy = policy; + pad->position_updated = TRUE; } break; } - case PROP_PAD_BLEND_FACTOR_RED: - pad->blend_factor0 = g_value_get_float (value); - break; - case PROP_PAD_BLEND_FACTOR_GREEN: - pad->blend_factor1 = g_value_get_float (value); - break; - case PROP_PAD_BLEND_FACTOR_BLUE: - pad->blend_factor2 = g_value_get_float (value); - break; - case PROP_PAD_BLEND_FACTOR_ALPHA: - pad->blend_factor3 = g_value_get_float (value); + case PROP_PAD_GAMMA_MODE:{ + GstVideoGammaMode mode = (GstVideoGammaMode) g_value_get_enum (value); + if (pad->gamma_mode != mode) { + pad->gamma_mode = mode; + pad->config_updated = TRUE; + } break; - case PROP_PAD_SIZING_POLICY: - pad->sizing_policy = - (GstD3D11CompositorSizingPolicy) g_value_get_enum (value); - pad->position_updated = TRUE; + } + case PROP_PAD_PRIMARIES_MODE:{ + GstVideoPrimariesMode mode = + (GstVideoPrimariesMode) g_value_get_enum (value); + if (pad->primaries_mode != mode) { + pad->primaries_mode = mode; + pad->config_updated = TRUE; + } break; + } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -822,251 +563,29 @@ break; case PROP_PAD_WIDTH: g_value_set_int (value, pad->width); - break; - case PROP_PAD_HEIGHT: - g_value_set_int (value, pad->height); - break; - case PROP_PAD_ALPHA: - g_value_set_double (value, pad->alpha); - break; - case PROP_PAD_BLEND_OP_RGB: - g_value_set_enum (value, - gst_d3d11_compositor_blend_operation_from_native (pad->desc.BlendOp)); - break; - case PROP_PAD_BLEND_OP_ALPHA: - g_value_set_enum (value, - gst_d3d11_compositor_blend_operation_from_native (pad-> - desc.BlendOpAlpha)); - break; - case PROP_PAD_BLEND_SRC_RGB: - g_value_set_enum (value, - gst_d3d11_compositor_blend_from_native (pad->desc.SrcBlend)); - break; - case PROP_PAD_BLEND_SRC_ALPHA: - g_value_set_enum (value, - gst_d3d11_compositor_blend_from_native (pad->desc.SrcBlendAlpha)); - break; - case PROP_PAD_BLEND_DEST_RGB: - g_value_set_enum (value, - gst_d3d11_compositor_blend_from_native (pad->desc.DestBlend)); - break; - case PROP_PAD_BLEND_DEST_ALPHA: - g_value_set_enum (value, - gst_d3d11_compositor_blend_from_native (pad->desc.DestBlendAlpha)); - break; - case PROP_PAD_BLEND_FACTOR_RED: - g_value_set_float (value, pad->blend_factor0); - break; - case PROP_PAD_BLEND_FACTOR_GREEN: - g_value_set_float (value, pad->blend_factor1); - break; - case PROP_PAD_BLEND_FACTOR_BLUE: - g_value_set_float (value, pad->blend_factor2); - break; - case PROP_PAD_BLEND_FACTOR_ALPHA: - g_value_set_float (value, pad->blend_factor3); - break; - case PROP_PAD_SIZING_POLICY: - g_value_set_enum (value, pad->sizing_policy); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_d3d11_compositor_pad_init_blend_options (GstD3D11CompositorPad * pad) -{ - guint i; - - pad->desc.BlendEnable = TRUE; - pad->desc.SrcBlend = - gst_d3d11_compositor_blend_to_native (DEFAULT_PAD_BLEND_SRC_RGB); - pad->desc.DestBlend = - gst_d3d11_compositor_blend_to_native (DEFAULT_PAD_BLEND_DEST_RGB); - pad->desc.BlendOp = - gst_d3d11_compositor_blend_operation_to_native (DEFAULT_PAD_BLEND_OP_RGB); - pad->desc.SrcBlendAlpha = - gst_d3d11_compositor_blend_to_native (DEFAULT_PAD_BLEND_SRC_ALPHA); - pad->desc.DestBlendAlpha = - gst_d3d11_compositor_blend_to_native (DEFAULT_PAD_BLEND_DEST_ALPHA); - pad->desc.BlendOpAlpha = - gst_d3d11_compositor_blend_operation_to_native - (DEFAULT_PAD_BLEND_OP_ALPHA); - pad->desc.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - - for (i = 0; i < G_N_ELEMENTS (pad->blend_factor); i++) - pad->blend_factori = 1.0f; -} - -static gboolean -gst_d3d11_compositor_configure_fallback_pool (GstD3D11Compositor * self, - GstVideoInfo * info, gint bind_flags, GstBufferPool ** pool) -{ - GstD3D11AllocationParams *d3d11_params; - GstBufferPool *new_pool; - GstCaps *caps; - - if (*pool) { - gst_buffer_pool_set_active (*pool, FALSE); - gst_clear_object (pool); - } - - caps = gst_video_info_to_caps (info); - if (!caps) { - GST_ERROR_OBJECT (self, "Couldn't create caps from info"); - return FALSE; - } - - d3d11_params = gst_d3d11_allocation_params_new (self->device, - info, (GstD3D11AllocationFlags) 0, bind_flags); - - new_pool = gst_d3d11_buffer_pool_new_with_options (self->device, - caps, d3d11_params, 0, 0); - gst_caps_unref (caps); - gst_d3d11_allocation_params_free (d3d11_params); - - if (!new_pool) { - GST_ERROR_OBJECT (self, "Failed to configure fallback pool"); - return FALSE; - } - - gst_buffer_pool_set_active (new_pool, TRUE); - *pool = new_pool; - - return TRUE; -} - -static gboolean -gst_d3d11_compsitor_prepare_fallback_buffer (GstD3D11Compositor * self, - GstVideoInfo * info, gboolean is_input, GstBufferPool ** pool, - GstBuffer ** fallback_buffer) -{ - GstBuffer *new_buf = NULL; - gint bind_flags = D3D11_BIND_SHADER_RESOURCE; - guint i; - - gst_clear_buffer (fallback_buffer); - - if (!is_input) - bind_flags = D3D11_BIND_RENDER_TARGET; - - if (*pool == NULL && - !gst_d3d11_compositor_configure_fallback_pool (self, info, - bind_flags, pool)) { - GST_ERROR_OBJECT (self, "Couldn't configure fallback buffer pool"); - return FALSE; - } - - if (gst_buffer_pool_acquire_buffer (*pool, &new_buf, NULL) - != GST_FLOW_OK) { - GST_ERROR_OBJECT (self, "Couldn't get fallback buffer from pool"); - return FALSE; - } - - for (i = 0; i < gst_buffer_n_memory (new_buf); i++) { - GstD3D11Memory *new_mem = - (GstD3D11Memory *) gst_buffer_peek_memory (new_buf, i); - - if (is_input && !gst_d3d11_memory_get_shader_resource_view_size (new_mem)) { - GST_ERROR_OBJECT (self, "Couldn't prepare shader resource view"); - gst_buffer_unref (new_buf); - return FALSE; - } else if (!is_input && - !gst_d3d11_memory_get_render_target_view_size (new_mem)) { - GST_ERROR_OBJECT (self, "Couldn't prepare render target view"); - gst_buffer_unref (new_buf); - return FALSE; - } - } - - *fallback_buffer = new_buf; - - return TRUE; -} - -static gboolean -gst_d3d11_compositor_copy_buffer (GstD3D11Compositor * self, - GstVideoInfo * info, GstBuffer * src_buf, GstBuffer * dest_buf, - gboolean do_device_copy) -{ - guint i; - - if (do_device_copy) { - return gst_d3d11_buffer_copy_into (dest_buf, src_buf, info); - } else { - GstVideoFrame src_frame, dest_frame; - - if (!gst_video_frame_map (&src_frame, info, src_buf, - (GstMapFlags) (GST_MAP_READ | GST_VIDEO_FRAME_MAP_FLAG_NO_REF))) { - GST_ERROR_OBJECT (self, "Couldn't map input buffer"); - return FALSE; - } - - if (!gst_video_frame_map (&dest_frame, info, dest_buf, - (GstMapFlags) (GST_MAP_WRITE | GST_VIDEO_FRAME_MAP_FLAG_NO_REF))) { - GST_ERROR_OBJECT (self, "Couldn't fallback buffer"); - gst_video_frame_unmap (&src_frame); - return FALSE; - } - - for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (&src_frame); i++) { - if (!gst_video_frame_copy_plane (&dest_frame, &src_frame, i)) { - GST_ERROR_OBJECT (self, "Couldn't copy %dth plane", i); - - gst_video_frame_unmap (&dest_frame); - gst_video_frame_unmap (&src_frame); - - return FALSE; - } - } - - gst_video_frame_unmap (&dest_frame); - gst_video_frame_unmap (&src_frame); - } - - return TRUE; -} - -static gboolean -gst_d3d11_compositor_check_d3d11_memory (GstD3D11Compositor * self, - GstBuffer * buffer, gboolean is_input, gboolean * view_available) -{ - guint i; - gboolean ret = TRUE; - - *view_available = TRUE; - - for (i = 0; i < gst_buffer_n_memory (buffer); i++) { - GstMemory *mem = gst_buffer_peek_memory (buffer, i); - GstD3D11Memory *dmem; - - if (!gst_is_d3d11_memory (mem)) { - ret = FALSE; - goto done; - } - - dmem = (GstD3D11Memory *) mem; - if (dmem->device != self->device) { - ret = FALSE; - goto done; - } - - if (is_input) { - if (!gst_d3d11_memory_get_shader_resource_view_size (dmem)) - *view_available = FALSE; - } else { - if (!gst_d3d11_memory_get_render_target_view_size (dmem)) - *view_available = FALSE; - } + break; + case PROP_PAD_HEIGHT: + g_value_set_int (value, pad->height); + break; + case PROP_PAD_ALPHA: + g_value_set_double (value, pad->alpha); + break; + case PROP_PAD_OPERATOR: + g_value_set_enum (value, pad->op); + break; + case PROP_PAD_SIZING_POLICY: + g_value_set_enum (value, pad->sizing_policy); + break; + case PROP_PAD_GAMMA_MODE: + g_value_set_enum (value, pad->gamma_mode); + break; + case PROP_PAD_PRIMARIES_MODE: + g_value_set_enum (value, pad->primaries_mode); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; } - -done: - if (!ret) - *view_available = FALSE; - - return ret; } static void @@ -1125,8 +644,7 @@ pad_width = gst_util_uint64_scale_int (pad_height, dar_n, dar_d); } break; - case GST_D3D11_COMPOSITOR_SIZING_POLICY_KEEP_ASPECT_RATIO: - { + case GST_D3D11_COMPOSITOR_SIZING_POLICY_KEEP_ASPECT_RATIO:{ gint from_dar_n, from_dar_d, to_dar_n, to_dar_d, num, den; /* Calculate DAR again with actual video size */ @@ -1254,57 +772,22 @@ GstVideoAggregator * vagg, GstBuffer * buffer, GstVideoFrame * prepared_frame) { - GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (vagg); - GstD3D11CompositorPad *cpad = GST_D3D11_COMPOSITOR_PAD (pad); - GstBuffer *target_buf = buffer; - gboolean do_device_copy = FALSE; - /* Skip this frame */ if (gst_d3d11_compositor_pad_check_frame_obscured (pad, vagg)) return TRUE; - /* Use fallback buffer when input buffer is: - * - non-d3d11 memory - * - or, from different d3d11 device - * - or not bound to shader resource - */ - if (!gst_d3d11_compositor_check_d3d11_memory (self, - buffer, TRUE, &do_device_copy) || !do_device_copy) { - if (!gst_d3d11_compsitor_prepare_fallback_buffer (self, &pad->info, TRUE, - &cpad->fallback_pool, &cpad->fallback_buf)) { - GST_ERROR_OBJECT (self, "Couldn't prepare fallback buffer"); - return FALSE; - } - - if (!gst_d3d11_compositor_copy_buffer (self, &pad->info, buffer, - cpad->fallback_buf, do_device_copy)) { - GST_ERROR_OBJECT (self, "Couldn't copy input buffer to fallback buffer"); - gst_clear_buffer (&cpad->fallback_buf); - return FALSE; - } - - target_buf = cpad->fallback_buf; - } - - if (!gst_video_frame_map (prepared_frame, &pad->info, target_buf, - (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { - GST_WARNING_OBJECT (pad, "Couldn't map input buffer"); - return FALSE; - } + /* don't map/upload now, it will happen in converter object. + * Just mark this frame is preparted instead */ + prepared_frame->buffer = buffer; return TRUE; } static void -gst_d3d11_compositor_pad_clean_frame (GstVideoAggregatorPad * pad, +gst_d3d11_compositor_pad_clean_frame (GstVideoAggregatorPad * vpad, GstVideoAggregator * vagg, GstVideoFrame * prepared_frame) { - GstD3D11CompositorPad *cpad = GST_D3D11_COMPOSITOR_PAD (pad); - - GST_VIDEO_AGGREGATOR_PAD_CLASS (parent_pad_class)->clean_frame (pad, - vagg, prepared_frame); - - gst_clear_buffer (&cpad->fallback_buf); + memset (prepared_frame, 0, sizeof (GstVideoFrame)); } static gboolean @@ -1313,62 +796,88 @@ { GstD3D11CompositorPad *cpad = GST_D3D11_COMPOSITOR_PAD (pad); GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (vagg); - RECT rect; gint width, height; GstVideoInfo *info = &vagg->info; GstVideoRectangle frame_rect; gboolean is_first = FALSE; + gboolean output_has_alpha_comp = FALSE; gint x_offset, y_offset; #ifndef GST_DISABLE_GST_DEBUG guint zorder = 0; #endif + static const D3D11_RENDER_TARGET_BLEND_DESC blend_over_no_alpha = { + TRUE, + D3D11_BLEND_BLEND_FACTOR, D3D11_BLEND_INV_BLEND_FACTOR, D3D11_BLEND_OP_ADD, + D3D11_BLEND_BLEND_FACTOR, D3D11_BLEND_INV_BLEND_FACTOR, D3D11_BLEND_OP_ADD, + D3D11_COLOR_WRITE_ENABLE_ALL, + }; - if (!cpad->convert || self->reconfigured) { - GstStructure *config; - - if (cpad->convert) - gst_d3d11_converter_free (cpad->convert); - - config = gst_structure_new_empty ("config"); - if (cpad->alpha <= 1.0) { - gst_structure_set (config, GST_D3D11_CONVERTER_OPT_ALPHA_VALUE, - G_TYPE_DOUBLE, cpad->alpha, nullptr); - } + if (GST_VIDEO_INFO_HAS_ALPHA (info) || + GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_BGRx || + GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_RGBx) { + output_has_alpha_comp = TRUE; + } - cpad->convert = - gst_d3d11_converter_new (self->device, &pad->info, &vagg->info, config); + if (cpad->config_updated) { + gst_clear_object (&cpad->convert); + cpad->config_updated = FALSE; + } + if (!cpad->convert) { + GstStructure *config = gst_structure_new ("converter-config", + /* XXX: Always use shader, to workaround buggy blending behavior of + * vendor implemented converter. Need investigation */ + GST_D3D11_CONVERTER_OPT_BACKEND, GST_TYPE_D3D11_CONVERTER_BACKEND, + GST_D3D11_CONVERTER_BACKEND_SHADER, + GST_D3D11_CONVERTER_OPT_GAMMA_MODE, + GST_TYPE_VIDEO_GAMMA_MODE, cpad->gamma_mode, + GST_D3D11_CONVERTER_OPT_PRIMARIES_MODE, + GST_TYPE_VIDEO_PRIMARIES_MODE, cpad->primaries_mode, nullptr); + + cpad->convert = gst_d3d11_converter_new (self->device, &pad->info, info, + config); if (!cpad->convert) { GST_ERROR_OBJECT (pad, "Couldn't create converter"); return FALSE; } is_first = TRUE; - } else if (cpad->alpha_updated) { - GstStructure *config; + } + + if (cpad->alpha_updated || is_first) { + if (output_has_alpha_comp) { + g_object_set (cpad->convert, "alpha", cpad->alpha, nullptr); + } else { + gfloat blend_factor = cpad->alpha; - config = gst_structure_new_empty ("config"); - if (cpad->alpha <= 1.0) { - gst_structure_set (config, GST_D3D11_CONVERTER_OPT_ALPHA_VALUE, - G_TYPE_DOUBLE, cpad->alpha, nullptr); + g_object_set (cpad->convert, + "blend-factor-red", blend_factor, + "blend-factor-green", blend_factor, + "blend-factor-blue", blend_factor, + "blend-factor-alpha", blend_factor, nullptr); } - gst_d3d11_converter_update_config (cpad->convert, config); cpad->alpha_updated = FALSE; } - if (!cpad->blend || cpad->blend_desc_updated) { + if (!cpad->blend || cpad->blend_desc_updated || is_first) { HRESULT hr; D3D11_BLEND_DESC desc = { 0, }; - ID3D11BlendState *blend = NULL; + ID3D11BlendState *blend = nullptr; ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (self->device); + gfloat blend_factor = 1.0f; GST_D3D11_CLEAR_COM (cpad->blend); desc.AlphaToCoverageEnable = FALSE; desc.IndependentBlendEnable = FALSE; desc.RenderTarget0 = cpad->desc; + if (!output_has_alpha_comp && + cpad->op == GST_D3D11_COMPOSITOR_OPERATOR_OVER) { + desc.RenderTarget0 = blend_over_no_alpha; + blend_factor = cpad->alpha; + } hr = device_handle->CreateBlendState (&desc, &blend); if (!gst_d3d11_result (hr, self->device)) { @@ -1378,6 +887,13 @@ } cpad->blend = blend; + g_object_set (cpad->convert, "blend-state", blend, + "blend-factor-red", blend_factor, + "blend-factor-green", blend_factor, + "blend-factor-blue", blend_factor, + "blend-factor-alpha", blend_factor, nullptr); + + cpad->blend_desc_updated = FALSE; } if (!is_first && !cpad->position_updated) @@ -1389,31 +905,44 @@ frame_rect = clamp_rectangle (cpad->xpos + x_offset, cpad->ypos + y_offset, width, height, GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info)); - rect.left = frame_rect.x; - rect.top = frame_rect.y; - rect.right = frame_rect.x + frame_rect.w; - rect.bottom = frame_rect.y + frame_rect.h; - #ifndef GST_DISABLE_GST_DEBUG - g_object_get (pad, "zorder", &zorder, NULL); + g_object_get (pad, "zorder", &zorder, nullptr); GST_LOG_OBJECT (pad, "Update position, pad-xpos %d, pad-ypos %d, " "pad-zorder %d, pad-width %d, pad-height %d, in-resolution %dx%d, " - "out-resoution %dx%d, dst-{left,top,right,bottom} %d-%d-%d-%d", + "out-resoution %dx%d, dst-{x,y,width,height} %d-%d-%d-%d", cpad->xpos, cpad->ypos, zorder, cpad->width, cpad->height, GST_VIDEO_INFO_WIDTH (&pad->info), GST_VIDEO_INFO_HEIGHT (&pad->info), GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info), - (gint) rect.left, (gint) rect.top, (gint) rect.right, (gint) rect.bottom); + frame_rect.x, frame_rect.y, frame_rect.w, frame_rect.h); #endif cpad->position_updated = FALSE; - return gst_d3d11_converter_update_dest_rect (cpad->convert, &rect); + g_object_set (cpad->convert, "dest-x", frame_rect.x, + "dest-y", frame_rect.y, "dest-width", frame_rect.w, + "dest-height", frame_rect.h, nullptr); + + return TRUE; } -static GstStaticCaps pad_template_caps = -GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES - (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, "{ RGBA, BGRA }")); +static GstStaticCaps sink_pad_template_caps = + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES + (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, GST_D3D11_SINK_FORMATS) "; " + GST_VIDEO_CAPS_MAKE (GST_D3D11_SINK_FORMATS)); + +/* formats we can output without conversion. + * Excludes 10/12 bits planar YUV (needs bitshift) and + * AYUV/AYUV64 (d3d11 runtime does not understand the ayuv order) */ +#define COMPOSITOR_SRC_FORMATS \ + "{ RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, " \ + "P010_10LE, P012_LE, P016_LE, I420, YV12, Y42B, Y444, Y444_16LE, " \ + "GRAY8, GRAY16_LE }" + +static GstStaticCaps src_pad_template_caps = + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES + (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, COMPOSITOR_SRC_FORMATS) "; " + GST_VIDEO_CAPS_MAKE (COMPOSITOR_SRC_FORMATS)); enum { @@ -1440,25 +969,28 @@ static void gst_d3d11_compositor_set_context (GstElement * element, GstContext * context); -static gboolean gst_d3d11_compositor_start (GstAggregator * aggregator); -static gboolean gst_d3d11_compositor_stop (GstAggregator * aggregator); -static gboolean gst_d3d11_compositor_sink_query (GstAggregator * aggregator, +static gboolean gst_d3d11_compositor_start (GstAggregator * agg); +static gboolean gst_d3d11_compositor_stop (GstAggregator * agg); +static gboolean gst_d3d11_compositor_sink_query (GstAggregator * agg, GstAggregatorPad * pad, GstQuery * query); -static gboolean gst_d3d11_compositor_src_query (GstAggregator * aggregator, +static gboolean gst_d3d11_compositor_src_query (GstAggregator * agg, GstQuery * query); -static GstCaps *gst_d3d11_compositor_fixate_src_caps (GstAggregator * - aggregator, GstCaps * caps); -static gboolean gst_d3d11_compositor_propose_allocation (GstAggregator * - aggregator, GstAggregatorPad * pad, GstQuery * decide_query, +static GstCaps *gst_d3d11_compositor_fixate_src_caps (GstAggregator * agg, + GstCaps * caps); +static gboolean gst_d3d11_compositor_negotiated_src_caps (GstAggregator * agg, + GstCaps * caps); +static gboolean +gst_d3d11_compositor_propose_allocation (GstAggregator * agg, + GstAggregatorPad * pad, GstQuery * decide_query, GstQuery * query); +static gboolean gst_d3d11_compositor_decide_allocation (GstAggregator * agg, GstQuery * query); -static gboolean gst_d3d11_compositor_decide_allocation (GstAggregator * - aggregator, GstQuery * query); static GstFlowReturn gst_d3d11_compositor_aggregate_frames (GstVideoAggregator * vagg, GstBuffer * outbuf); static GstFlowReturn gst_d3d11_compositor_create_output_buffer (GstVideoAggregator * vagg, GstBuffer ** outbuffer); +static void gst_d3d11_compositor_quad_free (GstD3D11CompositorQuad * quad); #define gst_d3d11_compositor_parent_class parent_class G_DEFINE_TYPE_WITH_CODE (GstD3D11Compositor, gst_d3d11_compositor, @@ -1468,24 +1000,24 @@ static void gst_d3d11_compositor_class_init (GstD3D11CompositorClass * klass) { - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstAggregatorClass *aggregator_class = GST_AGGREGATOR_CLASS (klass); + GstAggregatorClass *agg_class = GST_AGGREGATOR_CLASS (klass); GstVideoAggregatorClass *vagg_class = GST_VIDEO_AGGREGATOR_CLASS (klass); GstCaps *caps; - gobject_class->dispose = gst_d3d11_compositor_dispose; - gobject_class->set_property = gst_d3d11_compositor_set_property; - gobject_class->get_property = gst_d3d11_compositor_get_property; + object_class->dispose = gst_d3d11_compositor_dispose; + object_class->set_property = gst_d3d11_compositor_set_property; + object_class->get_property = gst_d3d11_compositor_get_property; - g_object_class_install_property (gobject_class, PROP_ADAPTER, + g_object_class_install_property (object_class, PROP_ADAPTER, g_param_spec_int ("adapter", "Adapter", "Adapter index for creating device (-1 for default)", -1, G_MAXINT32, DEFAULT_ADAPTER, (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | G_PARAM_STATIC_STRINGS))); - g_object_class_install_property (gobject_class, PROP_BACKGROUND, + g_object_class_install_property (object_class, PROP_BACKGROUND, g_param_spec_enum ("background", "Background", "Background type", GST_TYPE_D3D11_COMPOSITOR_BACKGROUND, DEFAULT_BACKGROUND, @@ -1498,17 +1030,17 @@ element_class->set_context = GST_DEBUG_FUNCPTR (gst_d3d11_compositor_set_context); - aggregator_class->start = GST_DEBUG_FUNCPTR (gst_d3d11_compositor_start); - aggregator_class->stop = GST_DEBUG_FUNCPTR (gst_d3d11_compositor_stop); - aggregator_class->sink_query = - GST_DEBUG_FUNCPTR (gst_d3d11_compositor_sink_query); - aggregator_class->src_query = - GST_DEBUG_FUNCPTR (gst_d3d11_compositor_src_query); - aggregator_class->fixate_src_caps = + agg_class->start = GST_DEBUG_FUNCPTR (gst_d3d11_compositor_start); + agg_class->stop = GST_DEBUG_FUNCPTR (gst_d3d11_compositor_stop); + agg_class->sink_query = GST_DEBUG_FUNCPTR (gst_d3d11_compositor_sink_query); + agg_class->src_query = GST_DEBUG_FUNCPTR (gst_d3d11_compositor_src_query); + agg_class->fixate_src_caps = GST_DEBUG_FUNCPTR (gst_d3d11_compositor_fixate_src_caps); - aggregator_class->propose_allocation = + agg_class->negotiated_src_caps = + GST_DEBUG_FUNCPTR (gst_d3d11_compositor_negotiated_src_caps); + agg_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_d3d11_compositor_propose_allocation); - aggregator_class->decide_allocation = + agg_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_d3d11_compositor_decide_allocation); vagg_class->aggregate_frames = @@ -1516,24 +1048,29 @@ vagg_class->create_output_buffer = GST_DEBUG_FUNCPTR (gst_d3d11_compositor_create_output_buffer); - caps = gst_d3d11_get_updated_template_caps (&pad_template_caps); + caps = gst_d3d11_get_updated_template_caps (&sink_pad_template_caps); gst_element_class_add_pad_template (element_class, gst_pad_template_new_with_gtype ("sink_%u", GST_PAD_SINK, GST_PAD_REQUEST, caps, GST_TYPE_D3D11_COMPOSITOR_PAD)); + gst_caps_unref (caps); + caps = gst_d3d11_get_updated_template_caps (&src_pad_template_caps); gst_element_class_add_pad_template (element_class, gst_pad_template_new_with_gtype ("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps, GST_TYPE_AGGREGATOR_PAD)); gst_caps_unref (caps); gst_element_class_set_static_metadata (element_class, "Direct3D11 Compositor", - "Filter/Editor/Video/Compositor", - "A Direct3D11 compositor", "Seungha Yang <seungha@centricular.com>"); + "Filter/Editor/Video/Compositor", "A Direct3D11 compositor", + "Seungha Yang <seungha@centricular.com>"); gst_type_mark_as_plugin_api (GST_TYPE_D3D11_COMPOSITOR_BACKGROUND, (GstPluginAPIFlags) 0); gst_type_mark_as_plugin_api (GST_TYPE_D3D11_COMPOSITOR_PAD, (GstPluginAPIFlags) 0); + + GST_DEBUG_CATEGORY_INIT (gst_d3d11_compositor_debug, + "d3d11compositor", 0, "d3d11compositor element"); } static void @@ -1550,8 +1087,7 @@ gst_clear_object (&self->device); gst_clear_buffer (&self->fallback_buf); - gst_clear_object (&self->fallback_pool); - g_clear_pointer (&self->checker_background, gst_d3d11_quad_free); + g_clear_pointer (&self->checker_background, gst_d3d11_compositor_quad_free); G_OBJECT_CLASS (parent_class)->dispose (object); } @@ -1600,7 +1136,7 @@ guint index) { GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (proxy); - GObject *obj = NULL; + GObject *obj = nullptr; GST_OBJECT_LOCK (self); obj = (GObject *) g_list_nth_data (GST_ELEMENT_CAST (self)->sinkpads, index); @@ -1645,8 +1181,10 @@ pad = GST_ELEMENT_CLASS (parent_class)->request_new_pad (element, templ, name, caps); - if (pad == NULL) - goto could_not_create; + if (!pad) { + GST_DEBUG_OBJECT (element, "could not create/add pad"); + return nullptr; + } gst_child_proxy_child_added (GST_CHILD_PROXY (element), G_OBJECT (pad), GST_OBJECT_NAME (pad)); @@ -1654,24 +1192,13 @@ GST_DEBUG_OBJECT (element, "Created new pad %s:%s", GST_DEBUG_PAD_NAME (pad)); return pad; - -could_not_create: - { - GST_DEBUG_OBJECT (element, "could not create/add pad"); - return NULL; - } } static gboolean gst_d3d11_compositor_pad_clear_resource (GstD3D11Compositor * self, GstD3D11CompositorPad * cpad, gpointer user_data) { - gst_clear_buffer (&cpad->fallback_buf); - if (cpad->fallback_pool) { - gst_buffer_pool_set_active (cpad->fallback_pool, FALSE); - gst_clear_object (&cpad->fallback_pool); - } - g_clear_pointer (&cpad->convert, gst_d3d11_converter_free); + gst_clear_object (&cpad->convert); GST_D3D11_CLEAR_COM (cpad->blend); return TRUE; @@ -1688,7 +1215,7 @@ gst_child_proxy_child_removed (GST_CHILD_PROXY (self), G_OBJECT (pad), GST_OBJECT_NAME (pad)); - gst_d3d11_compositor_pad_clear_resource (self, cpad, NULL); + gst_d3d11_compositor_pad_clear_resource (self, cpad, nullptr); GST_ELEMENT_CLASS (parent_class)->release_pad (element, pad); } @@ -1704,9 +1231,9 @@ } static gboolean -gst_d3d11_compositor_start (GstAggregator * aggregator) +gst_d3d11_compositor_start (GstAggregator * agg) { - GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (aggregator); + GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (agg); if (!gst_d3d11_ensure_element_data (GST_ELEMENT_CAST (self), self->adapter, &self->device)) { @@ -1714,18 +1241,18 @@ return FALSE; } - return GST_AGGREGATOR_CLASS (parent_class)->start (aggregator); + return GST_AGGREGATOR_CLASS (parent_class)->start (agg); } static gboolean -gst_d3d11_compositor_stop (GstAggregator * aggregator) +gst_d3d11_compositor_stop (GstAggregator * agg) { - GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (aggregator); + GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (agg); - g_clear_pointer (&self->checker_background, gst_d3d11_quad_free); + g_clear_pointer (&self->checker_background, gst_d3d11_compositor_quad_free); gst_clear_object (&self->device); - return GST_AGGREGATOR_CLASS (parent_class)->stop (aggregator); + return GST_AGGREGATOR_CLASS (parent_class)->stop (agg); } static GstCaps * @@ -1739,7 +1266,7 @@ template_caps = gst_pad_get_pad_template_caps (pad); sinkcaps = gst_pad_get_current_caps (pad); - if (sinkcaps == NULL) { + if (sinkcaps == nullptr) { sinkcaps = gst_caps_ref (template_caps); } else { sinkcaps = gst_caps_merge (sinkcaps, gst_caps_ref (template_caps)); @@ -1782,23 +1309,19 @@ } static gboolean -gst_d3d11_compositor_sink_query (GstAggregator * aggregator, +gst_d3d11_compositor_sink_query (GstAggregator * agg, GstAggregatorPad * pad, GstQuery * query) { - GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (aggregator); + GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (agg); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CONTEXT: - { - gboolean ret; - ret = gst_d3d11_handle_context_query (GST_ELEMENT (aggregator), query, - self->device); - if (ret) + if (gst_d3d11_handle_context_query (GST_ELEMENT (agg), query, + self->device)) { return TRUE; + } break; - } - case GST_QUERY_CAPS: - { + case GST_QUERY_CAPS:{ GstCaps *filter, *caps; gst_query_parse_caps (query, &filter); @@ -1807,8 +1330,7 @@ gst_caps_unref (caps); return TRUE; } - case GST_QUERY_ACCEPT_CAPS: - { + case GST_QUERY_ACCEPT_CAPS:{ GstCaps *caps; gboolean ret; @@ -1821,43 +1343,38 @@ break; } - return GST_AGGREGATOR_CLASS (parent_class)->sink_query (aggregator, - pad, query); + return GST_AGGREGATOR_CLASS (parent_class)->sink_query (agg, pad, query); } static gboolean -gst_d3d11_compositor_src_query (GstAggregator * aggregator, GstQuery * query) +gst_d3d11_compositor_src_query (GstAggregator * agg, GstQuery * query) { - GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (aggregator); + GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (agg); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CONTEXT: - { - gboolean ret; - ret = gst_d3d11_handle_context_query (GST_ELEMENT (aggregator), query, - self->device); - if (ret) + if (gst_d3d11_handle_context_query (GST_ELEMENT (agg), query, + self->device)) { return TRUE; + } break; - } default: break; } - return GST_AGGREGATOR_CLASS (parent_class)->src_query (aggregator, query); + return GST_AGGREGATOR_CLASS (parent_class)->src_query (agg, query); } static GstCaps * -gst_d3d11_compositor_fixate_src_caps (GstAggregator * aggregator, - GstCaps * caps) +gst_d3d11_compositor_fixate_src_caps (GstAggregator * agg, GstCaps * caps) { - GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (aggregator); + GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg); GList *l; gint best_width = -1, best_height = -1; gint best_fps_n = -1, best_fps_d = -1; gint par_n, par_d; gdouble best_fps = 0.; - GstCaps *ret = NULL; + GstCaps *ret = nullptr; GstStructure *s; ret = gst_caps_make_writable (caps); @@ -1926,45 +1443,306 @@ best_fps_d); ret = gst_caps_fixate (ret); - GST_LOG_OBJECT (aggregator, "Fixated caps %" GST_PTR_FORMAT, ret); + GST_LOG_OBJECT (agg, "Fixated caps %" GST_PTR_FORMAT, ret); return ret; } +static void +convert_info_gray_to_yuv (const GstVideoInfo * gray, GstVideoInfo * yuv) +{ + GstVideoInfo tmp; + + if (GST_VIDEO_INFO_IS_YUV (gray)) { + *yuv = *gray; + return; + } + + if (gray->finfo->depth0 == 8) { + gst_video_info_set_format (&tmp, + GST_VIDEO_FORMAT_Y444, gray->width, gray->height); + } else { + gst_video_info_set_format (&tmp, + GST_VIDEO_FORMAT_Y444_16LE, gray->width, gray->height); + } + + tmp.colorimetry.range = gray->colorimetry.range; + if (tmp.colorimetry.range == GST_VIDEO_COLOR_RANGE_UNKNOWN) + tmp.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + + tmp.colorimetry.primaries = gray->colorimetry.primaries; + if (tmp.colorimetry.primaries == GST_VIDEO_COLOR_PRIMARIES_UNKNOWN) + tmp.colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709; + + tmp.colorimetry.transfer = gray->colorimetry.transfer; + if (tmp.colorimetry.transfer == GST_VIDEO_TRANSFER_UNKNOWN) + tmp.colorimetry.transfer = GST_VIDEO_TRANSFER_BT709; + + tmp.colorimetry.matrix = gray->colorimetry.matrix; + if (tmp.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_UNKNOWN) + tmp.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT709; + + *yuv = tmp; +} + +static void +gst_d3d11_compositor_calculate_background_color (GstD3D11Compositor * self, + const GstVideoInfo * info) +{ + GstD3D11ColorMatrix clear_color_matrix; + gdouble rgb3; + gdouble converted3; + GstVideoFormat format = GST_VIDEO_INFO_FORMAT (info); + + if (GST_VIDEO_INFO_IS_RGB (info)) { + GstVideoInfo rgb_info = *info; + rgb_info.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + + gst_d3d11_color_range_adjust_matrix_unorm (&rgb_info, info, + &clear_color_matrix); + } else { + GstVideoInfo rgb_info; + GstVideoInfo yuv_info; + + gst_video_info_set_format (&rgb_info, GST_VIDEO_FORMAT_RGBA64_LE, + info->width, info->height); + convert_info_gray_to_yuv (info, &yuv_info); + + if (yuv_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_UNKNOWN || + yuv_info.colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_RGB) { + GST_WARNING_OBJECT (self, "Invalid matrix is detected"); + yuv_info.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT709; + } + + gst_d3d11_rgb_to_yuv_matrix_unorm (&rgb_info, + &yuv_info, &clear_color_matrix); + } + + /* Calculate black and white color values */ + for (guint i = 0; i < 2; i++) { + GstD3D11CompositorClearColor *clear_color = &self->clear_colori; + rgb0 = rgb1 = rgb2 = (gdouble) i; + + for (guint j = 0; j < 3; j++) { + convertedj = 0; + for (guint k = 0; k < 3; k++) { + convertedj += clear_color_matrix.matrixjk * rgbk; + } + convertedj += clear_color_matrix.offsetj; + convertedj = CLAMP (convertedj, + clear_color_matrix.minj, clear_color_matrix.maxj); + } + + GST_DEBUG_OBJECT (self, "Calculated background color RGB: %f, %f, %f", + converted0, converted1, converted2); + + if (GST_VIDEO_INFO_IS_RGB (info) || GST_VIDEO_INFO_IS_GRAY (info)) { + for (guint j = 0; j < 3; j++) + clear_color->color0j = convertedj; + clear_color->color03 = 1.0; + } else { + switch (format) { + case GST_VIDEO_FORMAT_VUYA: + clear_color->color00 = converted2; + clear_color->color01 = converted1; + clear_color->color02 = converted0; + clear_color->color03 = 1.0; + break; + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_NV21: + case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P012_LE: + case GST_VIDEO_FORMAT_P016_LE: + clear_color->color00 = converted0; + clear_color->color01 = 0; + clear_color->color02 = 0; + clear_color->color03 = 1.0; + if (format == GST_VIDEO_FORMAT_NV21) { + clear_color->color10 = converted2; + clear_color->color11 = converted1; + } else { + clear_color->color10 = converted1; + clear_color->color11 = converted2; + } + clear_color->color12 = 0; + clear_color->color13 = 1.0; + break; + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_I420_10LE: + case GST_VIDEO_FORMAT_I420_12LE: + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_I422_12LE: + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_Y444_12LE: + case GST_VIDEO_FORMAT_Y444_16LE: + clear_color->color00 = converted0; + clear_color->color01 = 0; + clear_color->color02 = 0; + clear_color->color03 = 1.0; + if (format == GST_VIDEO_FORMAT_YV12) { + clear_color->color10 = converted2; + clear_color->color20 = converted1; + } else { + clear_color->color10 = converted1; + clear_color->color20 = converted2; + } + clear_color->color11 = 0; + clear_color->color12 = 0; + clear_color->color13 = 1.0; + clear_color->color21 = 0; + clear_color->color22 = 0; + clear_color->color23 = 1.0; + break; + default: + g_assert_not_reached (); + break; + } + } + } +} + +static gboolean +gst_d3d11_compositor_negotiated_src_caps (GstAggregator * agg, GstCaps * caps) +{ + GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (agg); + GstCapsFeatures *features; + GstVideoInfo info; + + if (!gst_video_info_from_caps (&info, caps)) { + GST_ERROR_OBJECT (self, "Failed to convert caps to info"); + return FALSE; + } + + features = gst_caps_get_features (caps, 0); + if (features + && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { + GST_DEBUG_OBJECT (self, "Negotiated with D3D11 memory caps"); + self->downstream_supports_d3d11 = TRUE; + } else { + GST_DEBUG_OBJECT (self, "Negotiated with system memory caps"); + self->downstream_supports_d3d11 = FALSE; + } + + gst_element_foreach_sink_pad (GST_ELEMENT_CAST (self), + (GstElementForeachPadFunc) gst_d3d11_compositor_pad_clear_resource, + nullptr); + + gst_clear_buffer (&self->fallback_buf); + g_clear_pointer (&self->checker_background, gst_d3d11_compositor_quad_free); + + gst_d3d11_compositor_calculate_background_color (self, &info); + + if (!self->downstream_supports_d3d11) { + GstD3D11AllocationParams *d3d11_params; + GstBufferPool *pool; + GstFlowReturn flow_ret; + + d3d11_params = gst_d3d11_allocation_params_new (self->device, + &info, GST_D3D11_ALLOCATION_FLAG_DEFAULT, + D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET, 0); + + pool = gst_d3d11_buffer_pool_new_with_options (self->device, + caps, d3d11_params, 0, 0); + gst_d3d11_allocation_params_free (d3d11_params); + + if (!pool) { + GST_ERROR_OBJECT (self, "Failed to create pool"); + return FALSE; + } + + if (!gst_buffer_pool_set_active (pool, TRUE)) { + GST_ERROR_OBJECT (self, "Failed to set active"); + gst_object_unref (pool); + return FALSE; + } + + flow_ret = gst_buffer_pool_acquire_buffer (pool, &self->fallback_buf, + nullptr); + if (flow_ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (self, "Failed to acquire buffer"); + gst_object_unref (pool); + return FALSE; + } + + gst_buffer_pool_set_active (pool, FALSE); + gst_object_unref (pool); + } + + return GST_AGGREGATOR_CLASS (parent_class)->negotiated_src_caps (agg, caps); +} + static gboolean -gst_d3d11_compositor_propose_allocation (GstAggregator * aggregator, +gst_d3d11_compositor_propose_allocation (GstAggregator * agg, GstAggregatorPad * pad, GstQuery * decide_query, GstQuery * query) { - GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (aggregator); + GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (agg); GstVideoInfo info; GstBufferPool *pool; GstCaps *caps; guint size; - gst_query_parse_allocation (query, &caps, NULL); + gst_query_parse_allocation (query, &caps, nullptr); - if (caps == NULL) + if (caps == nullptr) return FALSE; if (!gst_video_info_from_caps (&info, caps)) return FALSE; if (gst_query_get_n_allocation_pools (query) == 0) { - GstD3D11AllocationParams *d3d11_params; + GstCapsFeatures *features; GstStructure *config; - - d3d11_params = gst_d3d11_allocation_params_new (self->device, &info, - (GstD3D11AllocationFlags) 0, D3D11_BIND_SHADER_RESOURCE); - - pool = gst_d3d11_buffer_pool_new_with_options (self->device, - caps, d3d11_params, 0, 0); - gst_d3d11_allocation_params_free (d3d11_params); + gboolean is_d3d11 = FALSE; + + features = gst_caps_get_features (caps, 0); + if (features + && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { + GST_DEBUG_OBJECT (pad, "upstream support d3d11 memory"); + pool = gst_d3d11_buffer_pool_new (self->device); + is_d3d11 = TRUE; + } else { + pool = gst_video_buffer_pool_new (); + } if (!pool) { GST_ERROR_OBJECT (self, "Failed to create buffer pool"); return FALSE; } + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_META); + + size = GST_VIDEO_INFO_SIZE (&info); + if (is_d3d11) { + GstD3D11AllocationParams *d3d11_params; + + d3d11_params = + gst_d3d11_allocation_params_new (self->device, + &info, GST_D3D11_ALLOCATION_FLAG_DEFAULT, D3D11_BIND_SHADER_RESOURCE, + 0); + + gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params); + gst_d3d11_allocation_params_free (d3d11_params); + } else { + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); + } + + gst_buffer_pool_config_set_params (config, caps, (guint) size, 0, 0); + + if (!gst_buffer_pool_set_config (pool, config)) { + GST_ERROR_OBJECT (pool, "Couldn't set config"); + gst_object_unref (pool); + + return FALSE; + } + /* d3d11 buffer pool will update buffer size based on allocated texture, * get size from config again */ config = gst_buffer_pool_get_config (pool); @@ -1976,71 +1754,91 @@ gst_object_unref (pool); } - gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, nullptr); + gst_query_add_allocation_meta (query, GST_VIDEO_CROP_META_API_TYPE, nullptr); return TRUE; } static gboolean -gst_d3d11_compositor_decide_allocation (GstAggregator * aggregator, - GstQuery * query) +gst_d3d11_compositor_decide_allocation (GstAggregator * agg, GstQuery * query) { - GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (aggregator); + GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (agg); GstCaps *caps; - GstBufferPool *pool = NULL; + GstBufferPool *pool = nullptr; guint n, size, min, max; GstVideoInfo info; GstStructure *config; - GstD3D11AllocationParams *d3d11_params; + gboolean use_d3d11_pool; - gst_query_parse_allocation (query, &caps, NULL); + gst_query_parse_allocation (query, &caps, nullptr); if (!caps) { GST_DEBUG_OBJECT (self, "No output caps"); return FALSE; } - gst_video_info_from_caps (&info, caps); + if (!gst_video_info_from_caps (&info, caps)) { + GST_ERROR_OBJECT (self, "Invalid caps"); + return FALSE; + } + + use_d3d11_pool = self->downstream_supports_d3d11; + n = gst_query_get_n_allocation_pools (query); if (n > 0) gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); /* create our own pool */ - if (pool) { + if (pool && use_d3d11_pool) { if (!GST_IS_D3D11_BUFFER_POOL (pool)) { + GST_DEBUG_OBJECT (self, + "Downstream pool is not d3d11, will create new one"); gst_clear_object (&pool); } else { GstD3D11BufferPool *dpool = GST_D3D11_BUFFER_POOL (pool); - if (dpool->device != self->device) + if (dpool->device != self->device) { + GST_DEBUG_OBJECT (self, "Different device, will create new one"); gst_clear_object (&pool); + } } } + size = (guint) info.size; + if (!pool) { - pool = gst_d3d11_buffer_pool_new (self->device); + if (use_d3d11_pool) + pool = gst_d3d11_buffer_pool_new (self->device); + else + pool = gst_video_buffer_pool_new (); - min = max = 0; - size = (guint) info.size; + min = 0; + max = 0; } config = gst_buffer_pool_get_config (pool); gst_buffer_pool_config_set_params (config, caps, size, min, max); gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); - d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); - if (!d3d11_params) { - d3d11_params = gst_d3d11_allocation_params_new (self->device, - &info, (GstD3D11AllocationFlags) 0, D3D11_BIND_RENDER_TARGET); - } else { - guint i; + if (use_d3d11_pool) { + GstD3D11AllocationParams *d3d11_params; - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&info); i++) { - d3d11_params->desci.BindFlags |= D3D11_BIND_RENDER_TARGET; + d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); + if (!d3d11_params) { + d3d11_params = gst_d3d11_allocation_params_new (self->device, + &info, GST_D3D11_ALLOCATION_FLAG_DEFAULT, D3D11_BIND_RENDER_TARGET, + 0); + } else { + guint i; + + for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&info); i++) { + d3d11_params->desci.BindFlags |= D3D11_BIND_RENDER_TARGET; + } } - } - gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params); - gst_d3d11_allocation_params_free (d3d11_params); + gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params); + gst_d3d11_allocation_params_free (d3d11_params); + } gst_buffer_pool_set_config (pool, config); @@ -2056,8 +1854,6 @@ gst_query_add_allocation_pool (query, pool, size, min, max); gst_object_unref (pool); - self->reconfigured = TRUE; - return TRUE; } @@ -2076,10 +1872,11 @@ } texture; } VertexData; -static GstD3D11Quad * -gst_d3d11_compositor_create_checker_quad (GstD3D11Compositor * self) +static GstD3D11CompositorQuad * +gst_d3d11_compositor_create_checker_quad (GstD3D11Compositor * self, + const GstVideoInfo * info) { - GstD3D11Quad *quad = NULL; + GstD3D11CompositorQuad *quad = nullptr; VertexData *vertex_data; WORD *indices; ID3D11Device *device_handle; @@ -2087,21 +1884,29 @@ D3D11_MAPPED_SUBRESOURCE map; D3D11_INPUT_ELEMENT_DESC input_desc; D3D11_BUFFER_DESC buffer_desc; - /* *INDENT-OFF* */ - ComPtr<ID3D11Buffer> vertex_buffer; - ComPtr<ID3D11Buffer> index_buffer; - ComPtr<ID3D11PixelShader> ps; - ComPtr<ID3D11VertexShader> vs; - ComPtr<ID3D11InputLayout> layout; - /* *INDENT-ON* */ + ComPtr < ID3D11Buffer > vertex_buffer; + ComPtr < ID3D11Buffer > index_buffer; + ComPtr < ID3D11PixelShader > ps; + ComPtr < ID3D11VertexShader > vs; + ComPtr < ID3D11InputLayout > layout; HRESULT hr; + const gchar *ps_src; device_handle = gst_d3d11_device_get_device_handle (self->device); context_handle = gst_d3d11_device_get_device_context_handle (self->device); - if (!gst_d3d11_create_pixel_shader (self->device, checker_ps_src, &ps)) { + if (GST_VIDEO_INFO_IS_RGB (info)) { + ps_src = checker_ps_src_rgb; + } else if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_VUYA) { + ps_src = checker_ps_src_vuya; + } else { + ps_src = checker_ps_src_luma; + } + + hr = gst_d3d11_create_pixel_shader_simple (self->device, ps_src, "main", &ps); + if (!gst_d3d11_result (hr, self->device)) { GST_ERROR_OBJECT (self, "Couldn't setup pixel shader"); - return NULL; + return nullptr; } memset (&input_desc, 0, sizeof (D3D11_INPUT_ELEMENT_DESC)); @@ -2113,10 +1918,11 @@ input_desc.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; input_desc.InstanceDataStepRate = 0; - if (!gst_d3d11_create_vertex_shader (self->device, checker_vs_src, - &input_desc, 1, &vs, &layout)) { + hr = gst_d3d11_create_vertex_shader_simple (self->device, checker_vs_src, + "main", &input_desc, 1, &vs, &layout); + if (!gst_d3d11_result (hr, self->device)) { GST_ERROR_OBJECT (self, "Couldn't setup vertex shader"); - return NULL; + return nullptr; } memset (&buffer_desc, 0, sizeof (D3D11_BUFFER_DESC)); @@ -2125,11 +1931,11 @@ buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - hr = device_handle->CreateBuffer (&buffer_desc, NULL, &vertex_buffer); + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &vertex_buffer); if (!gst_d3d11_result (hr, self->device)) { GST_ERROR_OBJECT (self, "Couldn't create vertex buffer, hr: 0x%x", (guint) hr); - return NULL; + return nullptr; } hr = context_handle->Map (vertex_buffer.Get (), @@ -2137,12 +1943,11 @@ if (!gst_d3d11_result (hr, self->device)) { GST_ERROR_OBJECT (self, "Couldn't map vertex buffer, hr: 0x%x", (guint) hr); - return NULL; + return nullptr; } vertex_data = (VertexData *) map.pData; /* bottom left */ - /* bottom left */ vertex_data0.position.x = -1.0f; vertex_data0.position.y = -1.0f; vertex_data0.position.z = 0.0f; @@ -2177,11 +1982,11 @@ buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - hr = device_handle->CreateBuffer (&buffer_desc, NULL, &index_buffer); + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &index_buffer); if (!gst_d3d11_result (hr, self->device)) { GST_ERROR_OBJECT (self, "Couldn't create index buffer, hr: 0x%x", (guint) hr); - return NULL; + return nullptr; } hr = context_handle->Map (index_buffer.Get (), @@ -2189,7 +1994,7 @@ if (!gst_d3d11_result (hr, self->device)) { GST_ERROR_OBJECT (self, "Couldn't map index buffer, hr: 0x%x", (guint) hr); - return NULL; + return nullptr; } indices = (WORD *) map.pData; @@ -2204,72 +2009,110 @@ indices5 = 2; /* top right */ context_handle->Unmap (index_buffer.Get (), 0); - - quad = gst_d3d11_quad_new (self->device, - ps.Get (), vs.Get (), layout.Get (), nullptr, 0, - vertex_buffer.Get (), sizeof (VertexData), index_buffer.Get (), - DXGI_FORMAT_R16_UINT, 6); - if (!quad) { - GST_ERROR_OBJECT (self, "Couldn't setup quad"); - return NULL; - } + quad = g_new0 (GstD3D11CompositorQuad, 1); + quad->ps = ps.Detach (); + quad->vs = vs.Detach (); + quad->layout = layout.Detach (); + quad->vertex_buffer = vertex_buffer.Detach (); + quad->index_buffer = index_buffer.Detach (); + + quad->viewport.TopLeftX = 0; + quad->viewport.TopLeftY = 0; + quad->viewport.Width = GST_VIDEO_INFO_WIDTH (info); + quad->viewport.Height = GST_VIDEO_INFO_HEIGHT (info); + quad->viewport.MinDepth = 0.0f; + quad->viewport.MaxDepth = 1.0f; return quad; } +static void +gst_d3d11_compositor_quad_free (GstD3D11CompositorQuad * quad) +{ + if (!quad) + return; + + GST_D3D11_CLEAR_COM (quad->ps); + GST_D3D11_CLEAR_COM (quad->vs); + GST_D3D11_CLEAR_COM (quad->layout); + GST_D3D11_CLEAR_COM (quad->vertex_buffer); + GST_D3D11_CLEAR_COM (quad->index_buffer); + + g_free (quad); +} + static gboolean gst_d3d11_compositor_draw_background_checker (GstD3D11Compositor * self, ID3D11RenderTargetView * rtv) { + ID3D11DeviceContext *context = + gst_d3d11_device_get_device_context_handle (self->device); + UINT offsets = 0; + UINT strides = sizeof (VertexData); + GstD3D11CompositorQuad *quad; + if (!self->checker_background) { GstVideoInfo *info = &GST_VIDEO_AGGREGATOR_CAST (self)->info; - self->checker_background = gst_d3d11_compositor_create_checker_quad (self); - + self->checker_background = + gst_d3d11_compositor_create_checker_quad (self, info); if (!self->checker_background) return FALSE; - - self->viewport.TopLeftX = 0; - self->viewport.TopLeftY = 0; - self->viewport.Width = GST_VIDEO_INFO_WIDTH (info); - self->viewport.Height = GST_VIDEO_INFO_HEIGHT (info); - self->viewport.MinDepth = 0.0f; - self->viewport.MaxDepth = 1.0f; } - return gst_d3d11_draw_quad_unlocked (self->checker_background, - &self->viewport, 1, NULL, 0, &rtv, 1, NULL, NULL, NULL, 0); + quad = self->checker_background; + context->IASetPrimitiveTopology (D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + context->IASetInputLayout (quad->layout); + context->IASetVertexBuffers (0, 1, &quad->vertex_buffer, &strides, &offsets); + context->IASetIndexBuffer (quad->index_buffer, DXGI_FORMAT_R16_UINT, 0); + context->VSSetShader (quad->vs, nullptr, 0); + context->PSSetShader (quad->ps, nullptr, 0); + context->RSSetViewports (1, &quad->viewport); + context->OMSetRenderTargets (1, &rtv, nullptr); + context->OMSetBlendState (nullptr, nullptr, 0xffffffff); + context->DrawIndexed (6, 0, 0); + context->OMSetRenderTargets (0, nullptr, nullptr); + + return TRUE; } /* Must be called with d3d11 device lock */ static gboolean gst_d3d11_compositor_draw_background (GstD3D11Compositor * self, - ID3D11RenderTargetView * rtv) + ID3D11RenderTargetView * rtvGST_VIDEO_MAX_PLANES, guint num_rtv) { - ID3D11DeviceContext *device_context = + ID3D11DeviceContext *context = gst_d3d11_device_get_device_context_handle (self->device); - FLOAT rgba4 = { 0.0f, 0.0f, 0.0f, 1.0f }; + GstD3D11CompositorClearColor *color = &self->clear_color0; + + if (self->background == GST_D3D11_COMPOSITOR_BACKGROUND_CHECKER) { + if (!gst_d3d11_compositor_draw_background_checker (self, rtv0)) + return FALSE; + + /* clear U and V components if needed */ + for (guint i = 1; i < num_rtv; i++) + context->ClearRenderTargetView (rtvi, color->colori); + + return TRUE; + } switch (self->background) { - case GST_D3D11_COMPOSITOR_BACKGROUND_CHECKER: - return gst_d3d11_compositor_draw_background_checker (self, rtv); case GST_D3D11_COMPOSITOR_BACKGROUND_BLACK: - /* {0, 0, 0, 1} */ + color = &self->clear_color0; break; case GST_D3D11_COMPOSITOR_BACKGROUND_WHITE: - rgba0 = 1.0f; - rgba1 = 1.0f; - rgba2 = 1.0f; + color = &self->clear_color1; break; case GST_D3D11_COMPOSITOR_BACKGROUND_TRANSPARENT: - rgba3 = 0.0f; + color = &self->clear_color2; break; default: g_assert_not_reached (); return FALSE; } - device_context->ClearRenderTargetView (rtv, rgba); + for (guint i = 0; i < num_rtv; i++) + context->ClearRenderTargetView (rtvi, color->colori); return TRUE; } @@ -2281,80 +2124,43 @@ GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (vagg); GList *iter; GstBuffer *target_buf = outbuf; - gboolean need_copy = FALSE; - gboolean do_device_copy = FALSE; GstFlowReturn ret = GST_FLOW_OK; - ID3D11RenderTargetView *rtvGST_VIDEO_MAX_PLANES = { NULL, }; - guint i, j; - gint view_idx; - - /* Use fallback buffer when output buffer is: - * - non-d3d11 memory - * - or, from different d3d11 device - * - or not bound to render target - */ - if (!gst_d3d11_compositor_check_d3d11_memory (self, - outbuf, FALSE, &do_device_copy) || !do_device_copy) { - if (!gst_d3d11_compsitor_prepare_fallback_buffer (self, &vagg->info, FALSE, - &self->fallback_pool, &self->fallback_buf)) { - GST_ERROR_OBJECT (self, "Couldn't prepare fallback buffer"); - return GST_FLOW_ERROR; - } + ID3D11RenderTargetView *rtvGST_VIDEO_MAX_PLANES = { nullptr, }; + GstVideoFrame target_frame; + guint num_rtv = GST_VIDEO_INFO_N_PLANES (&vagg->info); + GstD3D11DeviceLockGuard lk (self->device); - GST_TRACE_OBJECT (self, "Will draw on fallback texture"); - - need_copy = TRUE; + if (!self->downstream_supports_d3d11) target_buf = self->fallback_buf; - } - view_idx = 0; - for (i = 0; i < gst_buffer_n_memory (target_buf); i++) { - GstMemory *mem = gst_buffer_peek_memory (target_buf, i); - GstD3D11Memory *dmem; - guint rtv_size; - - if (!gst_is_d3d11_memory (mem)) { - GST_ERROR_OBJECT (self, "Invalid output memory"); - return GST_FLOW_ERROR; - } - - dmem = (GstD3D11Memory *) mem; - rtv_size = gst_d3d11_memory_get_render_target_view_size (dmem); - if (!rtv_size) { - GST_ERROR_OBJECT (self, "Render target view is unavailable"); - return GST_FLOW_ERROR; - } - - for (j = 0; j < rtv_size; j++) { - g_assert (view_idx < GST_VIDEO_MAX_PLANES); - - rtvview_idx = gst_d3d11_memory_get_render_target_view (dmem, j); - view_idx++; - } + if (!gst_video_frame_map (&target_frame, &vagg->info, target_buf, + (GstMapFlags) (GST_MAP_WRITE | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Failed to map render target frame"); + return GST_FLOW_ERROR; + } - /* Mark need-download for fallback buffer use case */ - GST_MINI_OBJECT_FLAG_SET (dmem, GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD); + if (!gst_d3d11_buffer_get_render_target_view (target_buf, rtv)) { + GST_ERROR_OBJECT (self, "RTV is unavailable"); + gst_video_frame_unmap (&target_frame); + return GST_FLOW_ERROR; } - gst_d3d11_device_lock (self->device); - /* XXX: the number of render target view must be one here, since we support - * only RGBA or BGRA */ - if (!gst_d3d11_compositor_draw_background (self, rtv0)) { + if (!gst_d3d11_compositor_draw_background (self, rtv, num_rtv)) { GST_ERROR_OBJECT (self, "Couldn't draw background"); - gst_d3d11_device_unlock (self->device); - ret = GST_FLOW_ERROR; - goto done; + gst_video_frame_unmap (&target_frame); + return GST_FLOW_ERROR; } - GST_OBJECT_LOCK (self); + gst_video_frame_unmap (&target_frame); + GST_OBJECT_LOCK (self); for (iter = GST_ELEMENT (vagg)->sinkpads; iter; iter = g_list_next (iter)) { GstVideoAggregatorPad *pad = GST_VIDEO_AGGREGATOR_PAD (iter->data); GstD3D11CompositorPad *cpad = GST_D3D11_COMPOSITOR_PAD (pad); GstVideoFrame *prepared_frame = gst_video_aggregator_pad_get_prepared_frame (pad); - ID3D11ShaderResourceView *srvGST_VIDEO_MAX_PLANES = { NULL, }; - GstBuffer *buffer; + gint x, y, w, h; + GstVideoCropMeta *crop_meta; if (!prepared_frame) continue; @@ -2365,47 +2171,41 @@ break; } - buffer = prepared_frame->buffer; - - view_idx = 0; - for (i = 0; i < gst_buffer_n_memory (buffer); i++) { - GstD3D11Memory *dmem = - (GstD3D11Memory *) gst_buffer_peek_memory (buffer, i); - guint srv_size = gst_d3d11_memory_get_shader_resource_view_size (dmem); - - for (j = 0; j < srv_size; j++) { - g_assert (view_idx < GST_VIDEO_MAX_PLANES); - - srvview_idx = gst_d3d11_memory_get_shader_resource_view (dmem, j); - view_idx++; - } + crop_meta = gst_buffer_get_video_crop_meta (prepared_frame->buffer); + if (crop_meta) { + x = crop_meta->x; + y = crop_meta->y; + w = crop_meta->width; + h = crop_meta->height; + } else { + x = y = 0; + w = pad->info.width; + h = pad->info.height; } - if (!gst_d3d11_converter_convert_unlocked (cpad->convert, srv, rtv, - cpad->blend, cpad->blend_factor)) { + g_object_set (cpad->convert, "src-x", x, "src-y", y, "src-width", w, + "src-height", h, nullptr); + + if (!gst_d3d11_converter_convert_buffer_unlocked (cpad->convert, + prepared_frame->buffer, target_buf)) { GST_ERROR_OBJECT (self, "Couldn't convert frame"); ret = GST_FLOW_ERROR; break; } } - - self->reconfigured = FALSE; GST_OBJECT_UNLOCK (self); - gst_d3d11_device_unlock (self->device); if (ret != GST_FLOW_OK) - goto done; + return ret; - if (need_copy && !gst_d3d11_compositor_copy_buffer (self, &vagg->info, - target_buf, outbuf, do_device_copy)) { - GST_ERROR_OBJECT (self, "Couldn't copy input buffer to fallback buffer"); - ret = GST_FLOW_ERROR; + if (!self->downstream_supports_d3d11) { + if (!gst_d3d11_buffer_copy_into (outbuf, self->fallback_buf, &vagg->info)) { + GST_ERROR_OBJECT (self, "Couldn't copy input buffer to fallback buffer"); + return GST_FLOW_ERROR; + } } -done: - gst_clear_buffer (&self->fallback_buf); - - return ret; + return GST_FLOW_OK; } typedef struct @@ -2436,13 +2236,8 @@ } mem = gst_buffer_peek_memory (buf, 0); - /* FIXME: we should be able to accept non-d3d11 memory later once - * we remove intermediate elements (d3d11upload and d3d11colorconvert) - */ - if (!gst_is_d3d11_memory (mem)) { - GST_ELEMENT_ERROR (agg, CORE, FAILED, (NULL), ("Invalid memory")); - return FALSE; - } + if (!gst_is_d3d11_memory (mem)) + return TRUE; dmem = GST_D3D11_MEMORY_CAST (mem); @@ -2457,7 +2252,7 @@ } else { guint adapter = 0; - g_object_get (dmem->device, "adapter", &adapter, NULL); + g_object_get (dmem->device, "adapter", &adapter, nullptr); /* The same GPU as what user wanted, update */ if (adapter == (guint) self->adapter) update_device = TRUE; @@ -2482,26 +2277,26 @@ /* Check whether there is at least one sinkpad which holds d3d11 buffer * with compatible device, and if not, update our device */ - data.other_device = NULL; + data.other_device = nullptr; data.have_same_device = FALSE; gst_element_foreach_sink_pad (GST_ELEMENT_CAST (vagg), (GstElementForeachPadFunc) gst_d3d11_compositor_check_device_update, &data); - if (data.have_same_device || !data.other_device) - goto done; + if (data.have_same_device || !data.other_device) { + return + GST_VIDEO_AGGREGATOR_CLASS (parent_class)->create_output_buffer (vagg, + outbuffer); + } /* Clear all device dependent resources */ gst_element_foreach_sink_pad (GST_ELEMENT_CAST (vagg), - (GstElementForeachPadFunc) gst_d3d11_compositor_pad_clear_resource, NULL); + (GstElementForeachPadFunc) gst_d3d11_compositor_pad_clear_resource, + nullptr); gst_clear_buffer (&self->fallback_buf); - if (self->fallback_pool) { - gst_buffer_pool_set_active (self->fallback_pool, FALSE); - gst_clear_object (&self->fallback_pool); - } - g_clear_pointer (&self->checker_background, gst_d3d11_quad_free); + g_clear_pointer (&self->checker_background, gst_d3d11_compositor_quad_free); GST_INFO_OBJECT (self, "Updating device %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT, self->device, data.other_device); @@ -2514,8 +2309,4 @@ gst_pad_mark_reconfigure (GST_AGGREGATOR_SRC_PAD (vagg)); return GST_AGGREGATOR_FLOW_NEED_DATA; - -done: - return GST_VIDEO_AGGREGATOR_CLASS (parent_class)->create_output_buffer (vagg, - outbuffer); }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11compositor.h -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11compositor.h
Changed
@@ -1,6 +1,6 @@ /* * GStreamer - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -18,8 +18,7 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __GST_D3D11_COMPOSITOR_H__ -#define __GST_D3D11_COMPOSITOR_H__ +#pragma once #include <gst/gst.h> #include <gst/video/video.h> @@ -36,58 +35,5 @@ G_DECLARE_FINAL_TYPE (GstD3D11Compositor, gst_d3d11_compositor, GST, D3D11_COMPOSITOR, GstVideoAggregator) -typedef enum -{ - GST_D3D11_COMPOSITOR_BLEND_OP_ADD, - GST_D3D11_COMPOSITOR_BLEND_OP_SUBTRACT, - GST_D3D11_COMPOSITOR_BLEND_OP_REV_SUBTRACT, - GST_D3D11_COMPOSITOR_BLEND_OP_MIN, - GST_D3D11_COMPOSITOR_BLEND_OP_MAX -} GstD3D11CompositorBlendOperation; - -#define GST_TYPE_D3D11_COMPOSITOR_BLEND_OPERATION (gst_d3d11_compositor_blend_operation_get_type()) -GType gst_d3d11_compositor_blend_operation_get_type (void); - -typedef enum -{ - GST_D3D11_COMPOSITOR_BLEND_ZERO, - GST_D3D11_COMPOSITOR_BLEND_ONE, - GST_D3D11_COMPOSITOR_BLEND_SRC_COLOR, - GST_D3D11_COMPOSITOR_BLEND_INV_SRC_COLOR, - GST_D3D11_COMPOSITOR_BLEND_SRC_ALPHA, - GST_D3D11_COMPOSITOR_BLEND_INV_SRC_ALPHA, - GST_D3D11_COMPOSITOR_BLEND_DEST_ALPHA, - GST_D3D11_COMPOSITOR_BLEND_INV_DEST_ALPHA, - GST_D3D11_COMPOSITOR_BLEND_DEST_COLOR, - GST_D3D11_COMPOSITOR_BLEND_INV_DEST_COLOR, - GST_D3D11_COMPOSITOR_BLEND_SRC_ALPHA_SAT, - GST_D3D11_COMPOSITOR_BLEND_BLEND_FACTOR, - GST_D3D11_COMPOSITOR_BLEND_INV_BLEND_FACTOR, -} GstD3D11CompositorBlend; - -#define GST_TYPE_D3D11_COMPOSITOR_BLEND (gst_d3d11_compositor_blend_get_type()) -GType gst_d3d11_compositor_blend_get_type (void); - -typedef enum -{ - GST_D3D11_COMPOSITOR_BACKGROUND_CHECKER, - GST_D3D11_COMPOSITOR_BACKGROUND_BLACK, - GST_D3D11_COMPOSITOR_BACKGROUND_WHITE, - GST_D3D11_COMPOSITOR_BACKGROUND_TRANSPARENT, -} GstD3D11CompositorBackground; - -#define GST_TYPE_D3D11_COMPOSITOR_BACKGROUND (gst_d3d11_compositor_background_get_type()) -GType gst_d3d11_compositor_background_get_type (void); - -typedef enum -{ - GST_D3D11_COMPOSITOR_SIZING_POLICY_NONE, - GST_D3D11_COMPOSITOR_SIZING_POLICY_KEEP_ASPECT_RATIO, -} GstD3D11CompositorSizingPolicy; - -#define GST_TYPE_D3D11_COMPOSITOR_SIZING_POLICY (gst_d3d11_compositor_sizing_policy_get_type()) -GType gst_d3d11_compositor_sizing_policy_get_type (void); - G_END_DECLS -#endif /* __GST_D3D11_COMPOSITOR_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11convert.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11convert.cpp
Changed
@@ -27,8 +27,6 @@ #endif #include "gstd3d11convert.h" -#include "gstd3d11converter.h" -#include "gstd3d11videoprocessor.h" #include "gstd3d11pluginutils.h" GST_DEBUG_CATEGORY_STATIC (gst_d3d11_convert_debug); @@ -51,28 +49,21 @@ GST_D3D11_SRC_FORMATS)); #define DEFAULT_ADD_BORDERS TRUE +#define DEFAULT_BORDER_COLOR G_GUINT64_CONSTANT(0xffff000000000000) +#define DEFAULT_GAMMA_MODE GST_VIDEO_GAMMA_MODE_NONE +#define DEFAULT_PRIMARIES_MODE GST_VIDEO_PRIMARIES_MODE_NONE struct _GstD3D11BaseConvert { GstD3D11BaseFilter parent; - const GstD3D11Format *in_d3d11_format; - const GstD3D11Format *out_d3d11_format; - - ID3D11Texture2D *in_textureGST_VIDEO_MAX_PLANES; - ID3D11ShaderResourceView *shader_resource_viewGST_VIDEO_MAX_PLANES; - guint num_input_view; - - ID3D11Texture2D *out_textureGST_VIDEO_MAX_PLANES; - ID3D11RenderTargetView *render_target_viewGST_VIDEO_MAX_PLANES; - guint num_output_view; - GstD3D11Converter *converter; - GstD3D11VideoProcessor *processor; - gboolean processor_in_use; + gboolean same_caps; + gboolean downstream_supports_crop_meta; /* used for border rendering */ RECT in_rect; + RECT prev_in_rect; RECT out_rect; gint borders_h; @@ -80,6 +71,21 @@ /* Updated by subclass */ gboolean add_borders; + guint64 border_color; + GstVideoGammaMode gamma_mode; + GstVideoPrimariesMode primaries_mode; + + /* orientation */ + /* method configured via property */ + GstVideoOrientationMethod method; + /* method parsed from tag */ + GstVideoOrientationMethod tag_method; + /* method currently selected based on "method" and "tag_method" */ + GstVideoOrientationMethod selected_method; + /* method previously selected and used for negotiation */ + GstVideoOrientationMethod active_method; + + SRWLOCK lock; }; /** @@ -100,15 +106,17 @@ trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter); static GstCaps *gst_d3d11_base_convert_fixate_caps (GstBaseTransform * base, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); -static gboolean gst_d3d11_base_convert_filter_meta (GstBaseTransform * trans, - GstQuery * query, GType api, const GstStructure * params); static gboolean gst_d3d11_base_convert_propose_allocation (GstBaseTransform * trans, GstQuery * decide_query, GstQuery * query); static gboolean gst_d3d11_base_convert_decide_allocation (GstBaseTransform * trans, GstQuery * query); - +static GstFlowReturn +gst_d3d11_base_convert_generate_output (GstBaseTransform * trans, + GstBuffer ** buffer); +static gboolean gst_d3d11_base_convert_transform_meta (GstBaseTransform * trans, + GstBuffer * outbuf, GstMeta * meta, GstBuffer * inbuf); static GstFlowReturn gst_d3d11_base_convert_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf); static gboolean gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter, @@ -261,18 +269,20 @@ gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps)); gst_caps_unref (caps); - trans_class->passthrough_on_same_caps = TRUE; + trans_class->passthrough_on_same_caps = FALSE; trans_class->transform_caps = GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_transform_caps); trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_fixate_caps); - trans_class->filter_meta = - GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_filter_meta); trans_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_propose_allocation); trans_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_decide_allocation); + trans_class->generate_output = + GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_generate_output); + trans_class->transform_meta = + GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_transform_meta); trans_class->transform = GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_transform); bfilter_class->set_info = GST_DEBUG_FUNCPTR (gst_d3d11_base_convert_set_info); @@ -285,30 +295,9 @@ gst_d3d11_base_convert_init (GstD3D11BaseConvert * self) { self->add_borders = DEFAULT_ADD_BORDERS; -} - -static void -gst_d3d11_base_convert_clear_shader_resource (GstD3D11BaseConvert * self) -{ - gint i; - - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - GST_D3D11_CLEAR_COM (self->shader_resource_viewi); - GST_D3D11_CLEAR_COM (self->render_target_viewi); - } - - self->num_input_view = 0; - self->num_output_view = 0; - - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - GST_D3D11_CLEAR_COM (self->in_texturei); - GST_D3D11_CLEAR_COM (self->out_texturei); - } - - g_clear_pointer (&self->converter, gst_d3d11_converter_free); - g_clear_pointer (&self->processor, gst_d3d11_video_processor_free); - - self->processor_in_use = FALSE; + self->border_color = DEFAULT_BORDER_COLOR; + self->gamma_mode = DEFAULT_GAMMA_MODE; + self->primaries_mode = DEFAULT_PRIMARIES_MODE; } static void @@ -316,7 +305,7 @@ { GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (object); - gst_d3d11_base_convert_clear_shader_resource (self); + gst_clear_object (&self->converter); G_OBJECT_CLASS (parent_class)->dispose (object); } @@ -664,9 +653,11 @@ gst_d3d11_base_convert_fixate_size (GstBaseTransform * base, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) { + GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (base); GstStructure *ins, *outs; const GValue *from_par, *to_par; GValue fpar = G_VALUE_INIT, tpar = G_VALUE_INIT; + gboolean rotate = FALSE; othercaps = gst_caps_truncate (othercaps); othercaps = gst_caps_make_writable (othercaps); @@ -680,6 +671,19 @@ * assume that missing PAR on the sinkpad means 1/1 and * missing PAR on the srcpad means undefined */ + GstD3D11SRWLockGuard lk (&self->lock); + switch (self->selected_method) { + case GST_VIDEO_ORIENTATION_90R: + case GST_VIDEO_ORIENTATION_90L: + case GST_VIDEO_ORIENTATION_UL_LR: + case GST_VIDEO_ORIENTATION_UR_LL: + rotate = TRUE; + break; + default: + rotate = FALSE; + break; + } + if (direction == GST_PAD_SINK) { if (!from_par) { g_value_init (&fpar, GST_TYPE_FRACTION); @@ -692,18 +696,36 @@ to_par = &tpar; } } else { - if (!to_par) { - g_value_init (&tpar, GST_TYPE_FRACTION); - gst_value_set_fraction (&tpar, 1, 1); - to_par = &tpar; + gint from_par_n, from_par_d; - gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, - NULL); - } if (!from_par) { g_value_init (&fpar, GST_TYPE_FRACTION); gst_value_set_fraction (&fpar, 1, 1); from_par = &fpar; + + from_par_n = from_par_d = 1; + } else { + from_par_n = gst_value_get_fraction_numerator (from_par); + from_par_d = gst_value_get_fraction_denominator (from_par); + } + + if (!to_par) { + gint to_par_n, to_par_d; + + if (rotate) { + to_par_n = from_par_d; + to_par_d = from_par_n; + } else { + to_par_n = from_par_n; + to_par_d = from_par_d; + } + + g_value_init (&tpar, GST_TYPE_FRACTION); + gst_value_set_fraction (&tpar, to_par_n, to_par_d); + to_par = &tpar; + + gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, + to_par_n, to_par_d, NULL); } } @@ -726,6 +748,17 @@ gst_structure_get_int (outs, "width", &w); gst_structure_get_int (outs, "height", &h); + /* swap dimensions when it's rotated */ + if (rotate) { + gint _tmp = from_w; + from_w = from_h; + from_h = _tmp; + + _tmp = from_par_n; + from_par_n = from_par_d; + from_par_d = _tmp; + } + /* if both width and height are already fixed, we can't do anything * about it anymore */ if (w && h) { @@ -1143,20 +1176,6 @@ } static gboolean -gst_d3d11_base_convert_filter_meta (GstBaseTransform * trans, - GstQuery * query, GType api, const GstStructure * params) -{ - /* This element cannot passthrough the crop meta, because it would convert the - * wrong sub-region of the image, and worst, our output image may not be large - * enough for the crop to be applied later */ - if (api == GST_VIDEO_CROP_META_API_TYPE) - return FALSE; - - /* propose all other metadata upstream */ - return TRUE; -} - -static gboolean gst_d3d11_base_convert_propose_allocation (GstBaseTransform * trans, GstQuery * decide_query, GstQuery * query) { @@ -1168,7 +1187,7 @@ GstStructure *config; guint size; GstD3D11AllocationParams *d3d11_params; - const GstD3D11Format *d3d11_format; + GstD3D11Format d3d11_format; guint bind_flags = D3D11_BIND_SHADER_RESOURCE; DXGI_FORMAT dxgi_format = DXGI_FORMAT_UNKNOWN; UINT supported = 0; @@ -1179,10 +1198,6 @@ decide_query, query)) return FALSE; - /* passthrough, we're done */ - if (decide_query == NULL) - return TRUE; - gst_query_parse_allocation (query, &caps, NULL); if (caps == NULL) @@ -1193,17 +1208,16 @@ return FALSE; } - d3d11_format = gst_d3d11_device_format_from_gst (filter->device, - GST_VIDEO_INFO_FORMAT (&info)); - if (!d3d11_format) { + if (!gst_d3d11_device_get_format (filter->device, + GST_VIDEO_INFO_FORMAT (&info), &d3d11_format)) { GST_ERROR_OBJECT (filter, "Unknown format caps %" GST_PTR_FORMAT, caps); return FALSE; } - if (d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) { - dxgi_format = d3d11_format->resource_format0; + if (d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) { + dxgi_format = d3d11_format.resource_format0; } else { - dxgi_format = d3d11_format->dxgi_format; + dxgi_format = d3d11_format.dxgi_format; } device_handle = gst_d3d11_device_get_device_handle (filter->device); @@ -1237,7 +1251,7 @@ d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); if (!d3d11_params) { d3d11_params = gst_d3d11_allocation_params_new (filter->device, &info, - (GstD3D11AllocationFlags) 0, bind_flags); + GST_D3D11_ALLOCATION_FLAG_DEFAULT, bind_flags, 0); } else { /* Set bind flag */ for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&info); i++) { @@ -1254,9 +1268,10 @@ if (!gst_buffer_pool_set_config (pool, config)) goto config_failed; - gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, nullptr); gst_query_add_allocation_meta (query, - GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL); + GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, nullptr); + gst_query_add_allocation_meta (query, GST_VIDEO_CROP_META_API_TYPE, nullptr); /* d3d11 buffer pool will update buffer size based on allocated texture, * get size from config again */ @@ -1284,6 +1299,7 @@ GstQuery * query) { GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans); + GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (trans); GstCaps *outcaps = NULL; GstBufferPool *pool = NULL; guint size, min = 0, max = 0; @@ -1292,7 +1308,7 @@ gboolean update_pool = FALSE; GstVideoInfo info; guint i; - const GstD3D11Format *d3d11_format; + GstD3D11Format d3d11_format; guint bind_flags = D3D11_BIND_RENDER_TARGET; DXGI_FORMAT dxgi_format = DXGI_FORMAT_UNKNOWN; UINT supported = 0; @@ -1309,17 +1325,21 @@ return FALSE; } - d3d11_format = gst_d3d11_device_format_from_gst (filter->device, - GST_VIDEO_INFO_FORMAT (&info)); - if (!d3d11_format) { + if (!gst_d3d11_device_get_format (filter->device, + GST_VIDEO_INFO_FORMAT (&info), &d3d11_format)) { GST_ERROR_OBJECT (filter, "Unknown format caps %" GST_PTR_FORMAT, outcaps); return FALSE; } - if (d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) { - dxgi_format = d3d11_format->resource_format0; + self->downstream_supports_crop_meta = gst_query_find_allocation_meta (query, + GST_VIDEO_CROP_META_API_TYPE, nullptr); + GST_DEBUG_OBJECT (self, "Downstream crop meta support: %d", + self->downstream_supports_crop_meta); + + if (d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) { + dxgi_format = d3d11_format.resource_format0; } else { - dxgi_format = d3d11_format->dxgi_format; + dxgi_format = d3d11_format.dxgi_format; } device_handle = gst_d3d11_device_get_device_handle (filter->device); @@ -1356,7 +1376,7 @@ d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); if (!d3d11_params) { d3d11_params = gst_d3d11_allocation_params_new (filter->device, &info, - (GstD3D11AllocationFlags) 0, bind_flags); + GST_D3D11_ALLOCATION_FLAG_DEFAULT, bind_flags, 0); } else { /* Set bind flag */ for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&info); i++) { @@ -1388,327 +1408,28 @@ } static gboolean -create_shader_input_resource (GstD3D11BaseConvert * self, - GstD3D11Device * device, const GstD3D11Format * format, GstVideoInfo * info) +gst_d3d11_base_convert_needs_color_convert (GstD3D11BaseConvert * self, + const GstVideoInfo * in_info, const GstVideoInfo * out_info) { - D3D11_TEXTURE2D_DESC texture_desc; - D3D11_SHADER_RESOURCE_VIEW_DESC view_desc; - HRESULT hr; - ID3D11Device *device_handle; - ID3D11Texture2D *texGST_VIDEO_MAX_PLANES = { NULL, }; - ID3D11ShaderResourceView *viewGST_VIDEO_MAX_PLANES = { NULL, }; - gint i; + const GstVideoColorimetry *in_cinfo = &in_info->colorimetry; + const GstVideoColorimetry *out_cinfo = &out_info->colorimetry; - if (self->num_input_view) + if (in_cinfo->range != out_cinfo->range || + in_cinfo->matrix != out_cinfo->matrix) { return TRUE; - - memset (&texture_desc, 0, sizeof (texture_desc)); - memset (&view_desc, 0, sizeof (view_desc)); - - device_handle = gst_d3d11_device_get_device_handle (device); - - texture_desc.MipLevels = 1; - texture_desc.ArraySize = 1; - texture_desc.SampleDesc.Count = 1; - texture_desc.SampleDesc.Quality = 0; - texture_desc.Usage = D3D11_USAGE_DEFAULT; - texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - - if (format->dxgi_format == DXGI_FORMAT_UNKNOWN) { - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - if (format->resource_formati == DXGI_FORMAT_UNKNOWN) - break; - - texture_desc.Width = GST_VIDEO_INFO_COMP_WIDTH (info, i); - texture_desc.Height = GST_VIDEO_INFO_COMP_HEIGHT (info, i); - texture_desc.Format = format->resource_formati; - - hr = device_handle->CreateTexture2D (&texture_desc, NULL, &texi); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR_OBJECT (self, "Failed to create texture (0x%x)", (guint) hr); - goto error; - } - } - } else { - gboolean is_semiplanar = FALSE; - - if (format->dxgi_format == DXGI_FORMAT_NV12 || - format->dxgi_format == DXGI_FORMAT_P010 || - format->dxgi_format == DXGI_FORMAT_P016) - is_semiplanar = TRUE; - - texture_desc.Width = GST_VIDEO_INFO_WIDTH (info); - texture_desc.Height = GST_VIDEO_INFO_HEIGHT (info); - texture_desc.Format = format->dxgi_format; - - /* semiplanar format resolution of should be even number */ - if (is_semiplanar) { - texture_desc.Width = GST_ROUND_UP_2 (texture_desc.Width); - texture_desc.Height = GST_ROUND_UP_2 (texture_desc.Height); - } - - hr = device_handle->CreateTexture2D (&texture_desc, NULL, &tex0); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR_OBJECT (self, "Failed to create texture (0x%x)", (guint) hr); - goto error; - } - - if (is_semiplanar) { - tex0->AddRef (); - tex1 = tex0; - } - } - - view_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - view_desc.Texture2D.MipLevels = 1; - - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - if (format->resource_formati == DXGI_FORMAT_UNKNOWN) - break; - - view_desc.Format = format->resource_formati; - hr = device_handle->CreateShaderResourceView (texi, &view_desc, &viewi); - - if (!gst_d3d11_result (hr, device)) { - GST_ERROR_OBJECT (self, - "Failed to create resource view (0x%x)", (guint) hr); - goto error; - } - } - - self->num_input_view = i; - - GST_DEBUG_OBJECT (self, - "%d shader resource view created", self->num_input_view); - - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - self->in_texturei = texi; - self->shader_resource_viewi = viewi; - } - - return TRUE; - -error: - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - GST_D3D11_CLEAR_COM (viewi); } - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - GST_D3D11_CLEAR_COM (texi); - } - - return FALSE; -} - -/* 16.0 / 255.0 ~= 0.062745 */ -static const float luma_black_level_limited = 0.062745f; - -static inline void -clear_rtv_color_rgb (GstD3D11BaseConvert * self, - ID3D11DeviceContext * context_handle, ID3D11RenderTargetView * rtv, - gboolean full_range) -{ - const FLOAT clear_color_full4 = { 0.0f, 0.0f, 0.0f, 1.0f }; - const FLOAT clear_color_limited4 = - { luma_black_level_limited, luma_black_level_limited, - luma_black_level_limited, 1.0f - }; - const FLOAT *target; - - if (full_range) - target = clear_color_full; - else - target = clear_color_limited; - - context_handle->ClearRenderTargetView (rtv, target); -} - -static inline void -clear_rtv_color_vuya (GstD3D11BaseConvert * self, - ID3D11DeviceContext * context_handle, ID3D11RenderTargetView * rtv, - gboolean full_range) -{ - const FLOAT clear_color_full4 = { 0.5f, 0.5f, 0.0f, 1.0f }; - const FLOAT clear_color_limited4 = - { 0.5f, 0.5f, luma_black_level_limited, 1.0f }; - const FLOAT *target; - - if (full_range) - target = clear_color_full; - else - target = clear_color_limited; - - context_handle->ClearRenderTargetView (rtv, target); -} - -static inline void -clear_rtv_color_luma (GstD3D11BaseConvert * self, - ID3D11DeviceContext * context_handle, ID3D11RenderTargetView * rtv, - gboolean full_range) -{ - const FLOAT clear_color_full4 = { 0.0f, 0.0f, 0.0f, 1.0f }; - const FLOAT clear_color_limited4 = - { luma_black_level_limited, luma_black_level_limited, - luma_black_level_limited, 1.0f - }; - const FLOAT *target; - - if (full_range) - target = clear_color_full; - else - target = clear_color_limited; - - context_handle->ClearRenderTargetView (rtv, target); -} - -static inline void -clear_rtv_color_chroma (GstD3D11BaseConvert * self, - ID3D11DeviceContext * context_handle, ID3D11RenderTargetView * rtv) -{ - const FLOAT clear_color4 = { 0.5f, 0.5f, 0.5f, 1.0f }; - - context_handle->ClearRenderTargetView (rtv, clear_color); -} - -static void -clear_rtv_color_all (GstD3D11BaseConvert * self, GstVideoInfo * info, - ID3D11DeviceContext * context_handle, - ID3D11RenderTargetView * rtvGST_VIDEO_MAX_PLANES) -{ - gint i; - gboolean full_range = info->colorimetry.range == GST_VIDEO_COLOR_RANGE_0_255; - - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - if (!rtvi) - break; - - if (GST_VIDEO_INFO_IS_RGB (info)) { - clear_rtv_color_rgb (self, context_handle, rtvi, full_range); - } else { - if (GST_VIDEO_INFO_N_PLANES (info) == 1) { - clear_rtv_color_vuya (self, context_handle, rtvi, full_range); - } else { - if (i == 0) - clear_rtv_color_luma (self, context_handle, rtvi, full_range); - else - clear_rtv_color_chroma (self, context_handle, rtvi); - } - } - } -} - -static gboolean -create_shader_output_resource (GstD3D11BaseConvert * self, - GstD3D11Device * device, const GstD3D11Format * format, GstVideoInfo * info) -{ - D3D11_TEXTURE2D_DESC texture_desc; - D3D11_RENDER_TARGET_VIEW_DESC view_desc; - HRESULT hr; - ID3D11Device *device_handle; - ID3D11DeviceContext *context_handle; - ID3D11Texture2D *texGST_VIDEO_MAX_PLANES = { NULL, }; - ID3D11RenderTargetView *viewGST_VIDEO_MAX_PLANES = { NULL, }; - gint i; - - if (self->num_output_view) + if (self->primaries_mode != GST_VIDEO_PRIMARIES_MODE_NONE && + !gst_video_color_primaries_is_equivalent (in_cinfo->primaries, + out_cinfo->primaries)) { return TRUE; - - memset (&texture_desc, 0, sizeof (texture_desc)); - memset (&view_desc, 0, sizeof (view_desc)); - - device_handle = gst_d3d11_device_get_device_handle (device); - context_handle = gst_d3d11_device_get_device_context_handle (device); - - texture_desc.MipLevels = 1; - texture_desc.ArraySize = 1; - texture_desc.SampleDesc.Count = 1; - texture_desc.SampleDesc.Quality = 0; - texture_desc.Usage = D3D11_USAGE_DEFAULT; - texture_desc.BindFlags = - D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; - - if (format->dxgi_format == DXGI_FORMAT_UNKNOWN) { - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - if (format->resource_formati == DXGI_FORMAT_UNKNOWN) - break; - - texture_desc.Width = GST_VIDEO_INFO_COMP_WIDTH (info, i); - texture_desc.Height = GST_VIDEO_INFO_COMP_HEIGHT (info, i); - texture_desc.Format = format->resource_formati; - - hr = device_handle->CreateTexture2D (&texture_desc, NULL, &texi); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR_OBJECT (self, "Failed to create texture (0x%x)", (guint) hr); - goto error; - } - } - } else { - gboolean is_semiplanar = FALSE; - - if (format->dxgi_format == DXGI_FORMAT_NV12 || - format->dxgi_format == DXGI_FORMAT_P010 || - format->dxgi_format == DXGI_FORMAT_P016) - is_semiplanar = TRUE; - - texture_desc.Width = GST_VIDEO_INFO_WIDTH (info); - texture_desc.Height = GST_VIDEO_INFO_HEIGHT (info); - texture_desc.Format = format->dxgi_format; - - /* semiplanar format resolution of should be even number */ - if (is_semiplanar) { - texture_desc.Width = GST_ROUND_UP_2 (texture_desc.Width); - texture_desc.Height = GST_ROUND_UP_2 (texture_desc.Height); - } - - hr = device_handle->CreateTexture2D (&texture_desc, NULL, &tex0); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR_OBJECT (self, "Failed to create texture (0x%x)", (guint) hr); - goto error; - } - - if (is_semiplanar) { - tex0->AddRef (); - tex1 = tex0; - } - } - - view_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; - view_desc.Texture2D.MipSlice = 0; - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - if (format->resource_formati == DXGI_FORMAT_UNKNOWN) - break; - - view_desc.Format = format->resource_formati; - hr = device_handle->CreateRenderTargetView (texi, &view_desc, &viewi); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR_OBJECT (self, - "Failed to create %dth render target view (0x%x)", i, (guint) hr); - goto error; - } - } - - gst_d3d11_device_lock (device); - clear_rtv_color_all (self, info, context_handle, view); - gst_d3d11_device_unlock (device); - - self->num_output_view = i; - - GST_DEBUG_OBJECT (self, "%d render view created", self->num_output_view); - - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - self->out_texturei = texi; - self->render_target_viewi = viewi; } - return TRUE; - -error: - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - GST_D3D11_CLEAR_COM (viewi); - } - - for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { - GST_D3D11_CLEAR_COM (texi); + if (self->gamma_mode != GST_VIDEO_GAMMA_MODE_NONE && + !gst_video_transfer_function_is_equivalent (in_cinfo->transfer, + GST_VIDEO_INFO_COMP_DEPTH (in_info, 0), out_cinfo->transfer, + GST_VIDEO_INFO_COMP_DEPTH (out_info, 0))) { + return TRUE; } return FALSE; @@ -1720,18 +1441,46 @@ GstVideoInfo * out_info) { GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (filter); - const GstVideoInfo *unknown_info; gint from_dar_n, from_dar_d, to_dar_n, to_dar_d; - D3D11_VIEWPORT view_port; gint border_offset_x = 0; gint border_offset_y = 0; + gboolean need_flip = FALSE; + gint in_width, in_height, in_par_n, in_par_d; + GstStructure *config; - if (gst_base_transform_is_passthrough (GST_BASE_TRANSFORM (filter))) + GstD3D11SRWLockGuard lk (&self->lock); + self->active_method = self->selected_method; + + if (self->active_method != GST_VIDEO_ORIENTATION_IDENTITY) + need_flip = TRUE; + + if (!need_flip && gst_caps_is_equal (incaps, outcaps)) { + self->same_caps = TRUE; return TRUE; + } else { + self->same_caps = FALSE; + } + + switch (self->selected_method) { + case GST_VIDEO_ORIENTATION_90R: + case GST_VIDEO_ORIENTATION_90L: + case GST_VIDEO_ORIENTATION_UL_LR: + case GST_VIDEO_ORIENTATION_UR_LL: + in_width = in_info->height; + in_height = in_info->width; + in_par_n = in_info->par_d; + in_par_d = in_info->par_n; + break; + default: + in_width = in_info->width; + in_height = in_info->height; + in_par_n = in_info->par_n; + in_par_d = in_info->par_d; + break; + } - if (!gst_util_fraction_multiply (in_info->width, - in_info->height, in_info->par_n, in_info->par_d, &from_dar_n, - &from_dar_d)) { + if (!gst_util_fraction_multiply (in_width, + in_height, in_par_n, in_par_d, &from_dar_n, &from_dar_d)) { from_dar_n = from_dar_d = -1; } @@ -1768,115 +1517,52 @@ } } - gst_d3d11_base_convert_clear_shader_resource (self); + gst_clear_object (&self->converter); GST_DEBUG_OBJECT (self, "Setup convert with format %s -> %s", gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info)), gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info))); /* if present, these must match */ - if (in_info->interlace_mode != out_info->interlace_mode) - goto format_mismatch; + if (in_info->interlace_mode != out_info->interlace_mode) { + GST_ERROR_OBJECT (self, "input and output formats do not match"); + return FALSE; + } - if (in_info->width == out_info->width && in_info->height == out_info->height + if (in_width == out_info->width && in_height == out_info->height && in_info->finfo == out_info->finfo && self->borders_w == 0 && - self->borders_h == 0) { - gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (filter), TRUE); + self->borders_h == 0 && !need_flip && + !gst_d3d11_base_convert_needs_color_convert (self, in_info, out_info)) { + self->same_caps = TRUE; return TRUE; - } else { - gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (filter), FALSE); - } - - self->in_d3d11_format = - gst_d3d11_device_format_from_gst (filter->device, - GST_VIDEO_INFO_FORMAT (in_info)); - if (!self->in_d3d11_format) { - unknown_info = in_info; - goto format_unknown; } - self->out_d3d11_format = - gst_d3d11_device_format_from_gst (filter->device, - GST_VIDEO_INFO_FORMAT (out_info)); - if (!self->out_d3d11_format) { - unknown_info = out_info; - goto format_unknown; - } - - self->converter = - gst_d3d11_converter_new (filter->device, in_info, out_info, nullptr); + config = gst_structure_new ("convert-config", + GST_D3D11_CONVERTER_OPT_GAMMA_MODE, + GST_TYPE_VIDEO_GAMMA_MODE, self->gamma_mode, + GST_D3D11_CONVERTER_OPT_PRIMARIES_MODE, + GST_TYPE_VIDEO_PRIMARIES_MODE, self->primaries_mode, nullptr); + self->converter = gst_d3d11_converter_new (filter->device, in_info, out_info, + config); if (!self->converter) { - GST_ERROR_OBJECT (self, "couldn't set converter"); + GST_ERROR_OBJECT (self, "Couldn't create converter"); return FALSE; } -#if (GST_D3D11_DXGI_HEADER_VERSION >= 4) - /* If both input and output formats are native DXGI format */ - if (self->in_d3d11_format->dxgi_format != DXGI_FORMAT_UNKNOWN && - self->out_d3d11_format->dxgi_format != DXGI_FORMAT_UNKNOWN) { - gboolean hardware = FALSE; - GstD3D11VideoProcessor *processor = NULL; - - gst_d3d11_device_lock (filter->device); - g_object_get (filter->device, "hardware", &hardware, NULL); - if (hardware) { - processor = gst_d3d11_video_processor_new (filter->device, - in_info->width, in_info->height, out_info->width, out_info->height); - } - - if (processor) { - const GstDxgiColorSpace *in_color_space; - const GstDxgiColorSpace *out_color_space; - - in_color_space = gst_d3d11_video_info_to_dxgi_color_space (in_info); - out_color_space = gst_d3d11_video_info_to_dxgi_color_space (out_info); - - if (in_color_space && out_color_space) { - DXGI_FORMAT in_dxgi_format = self->in_d3d11_format->dxgi_format; - DXGI_FORMAT out_dxgi_format = self->out_d3d11_format->dxgi_format; - DXGI_COLOR_SPACE_TYPE in_dxgi_color_space = - (DXGI_COLOR_SPACE_TYPE) in_color_space->dxgi_color_space_type; - DXGI_COLOR_SPACE_TYPE out_dxgi_color_space = - (DXGI_COLOR_SPACE_TYPE) out_color_space->dxgi_color_space_type; - - if (!gst_d3d11_video_processor_check_format_conversion (processor, - in_dxgi_format, in_dxgi_color_space, out_dxgi_format, - out_dxgi_color_space)) { - GST_DEBUG_OBJECT (self, "Conversion is not supported by device"); - gst_d3d11_video_processor_free (processor); - processor = NULL; - } else { - GST_DEBUG_OBJECT (self, "video processor supports conversion"); - gst_d3d11_video_processor_set_input_dxgi_color_space (processor, - in_dxgi_color_space); - gst_d3d11_video_processor_set_output_dxgi_color_space (processor, - out_dxgi_color_space); - } - } else { - GST_WARNING_OBJECT (self, - "Couldn't determine input and/or output dxgi colorspace"); - gst_d3d11_video_processor_free (processor); - processor = NULL; - } - } - - self->processor = processor; - gst_d3d11_device_unlock (filter->device); - } -#endif GST_DEBUG_OBJECT (self, "from=%dx%d (par=%d/%d dar=%d/%d), size %" G_GSIZE_FORMAT " -> to=%dx%d (par=%d/%d dar=%d/%d borders=%d:%d), " - "size %" G_GSIZE_FORMAT, + "size %" G_GSIZE_FORMAT ", orientation: %d", in_info->width, in_info->height, in_info->par_n, in_info->par_d, from_dar_n, from_dar_d, in_info->size, out_info->width, out_info->height, out_info->par_n, out_info->par_d, to_dar_n, to_dar_d, - self->borders_w, self->borders_h, out_info->size); + self->borders_w, self->borders_h, out_info->size, self->active_method); self->in_rect.left = 0; self->in_rect.top = 0; self->in_rect.right = GST_VIDEO_INFO_WIDTH (in_info); self->in_rect.bottom = GST_VIDEO_INFO_HEIGHT (in_info); + self->prev_in_rect = self->in_rect; if (self->borders_w) { border_offset_x = self->borders_w / 2; @@ -1896,311 +1582,307 @@ self->out_rect.bottom = GST_VIDEO_INFO_HEIGHT (out_info); } - view_port.TopLeftX = border_offset_x; - view_port.TopLeftY = border_offset_y; - view_port.Width = GST_VIDEO_INFO_WIDTH (out_info) - self->borders_w; - view_port.Height = GST_VIDEO_INFO_HEIGHT (out_info) - self->borders_h; - view_port.MinDepth = 0.0f; - view_port.MaxDepth = 1.0f; + g_object_set (self->converter, "dest-x", (gint) self->out_rect.left, + "dest-y", (gint) self->out_rect.top, + "dest-width", (gint) (self->out_rect.right - self->out_rect.left), + "dest-height", (gint) (self->out_rect.bottom - self->out_rect.top), + "video-direction", self->active_method, nullptr); - gst_d3d11_converter_update_viewport (self->converter, &view_port); + if (self->borders_w > 0 || self->borders_h > 0) { + g_object_set (self->converter, "fill-border", TRUE, "border-color", + self->border_color, nullptr); + } return TRUE; - - /* ERRORS */ -format_mismatch: - { - GST_ERROR_OBJECT (self, "input and output formats do not match"); - return FALSE; - } -format_unknown: - { - GST_ERROR_OBJECT (self, - "%s couldn't be converted to d3d11 format", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (unknown_info))); - return FALSE; - } } static gboolean -gst_d3d11_base_convert_prefer_video_processor (GstD3D11BaseConvert * self, - GstBuffer * inbuf, GstBuffer * outbuf) +gst_d3d11_base_convert_crop_and_copy (GstD3D11BaseConvert * self, + const GstVideoCropMeta * meta, GstBuffer * inbuf, GstBuffer * outbuf) { - GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (self); - GstMemory *mem; - GstD3D11Memory *dmem; - - if (!self->processor) { - GST_TRACE_OBJECT (self, "Processor is unavailable"); + GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER_CAST (self); + GstVideoInfo *info = &filter->in_info; + GstVideoFormat format = GST_VIDEO_INFO_FORMAT (info); + GstMemory *in_mem, *out_mem; + GstD3D11Memory *in_dmem, *out_dmem; + GstMapInfo in_map, out_map; + GstD3D11Device *device; + ID3D11DeviceContext *context; + D3D11_BOX src_box = { 0, }; + guint in_subresource; + guint out_subresource; + ID3D11Texture2D *in_tex, *out_tex; + + /* Copy into output memory */ + in_mem = gst_buffer_peek_memory (inbuf, 0); + out_mem = gst_buffer_peek_memory (outbuf, 0); + + if (!gst_is_d3d11_memory (in_mem)) { + GST_ERROR_OBJECT (self, "Input is not a d3d11 memory"); return FALSE; } - if (gst_buffer_n_memory (inbuf) != 1 || gst_buffer_n_memory (outbuf) != 1) { - GST_TRACE_OBJECT (self, "Num memory objects is mismatched, in: %d, out: %d", - gst_buffer_n_memory (inbuf), gst_buffer_n_memory (outbuf)); + if (!gst_is_d3d11_memory (out_mem)) { + GST_ERROR_OBJECT (self, "Output is not a d3d11 memory"); return FALSE; } - mem = gst_buffer_peek_memory (inbuf, 0); - g_assert (gst_is_d3d11_memory (mem)); + in_dmem = GST_D3D11_MEMORY_CAST (in_mem); + out_dmem = GST_D3D11_MEMORY_CAST (out_mem); - dmem = (GstD3D11Memory *) mem; - if (dmem->device != filter->device) { - GST_TRACE_OBJECT (self, "Input memory belongs to different device"); + if (in_dmem->device != out_dmem->device) { + GST_ERROR_OBJECT (self, "Different device"); return FALSE; } - /* If we can use shader, and video processor was not used previously, - * we prefer to use shader instead of video processor - * because video processor implementation is vendor dependent - * and not flexible */ - if (!self->processor_in_use && - gst_d3d11_memory_get_shader_resource_view_size (dmem)) { - GST_TRACE_OBJECT (self, "SRV is available"); - return FALSE; - } + device = in_dmem->device; + context = gst_d3d11_device_get_device_context_handle (device); - if (!gst_d3d11_video_processor_get_input_view (self->processor, dmem)) { - GST_TRACE_OBJECT (self, "PIV is unavailable"); - return FALSE; - } + src_box.left = meta->x; + src_box.top = meta->y; + src_box.right = meta->x + meta->width; + src_box.bottom = meta->y + meta->height; + src_box.front = 0; + src_box.back = 1; - mem = gst_buffer_peek_memory (outbuf, 0); - g_assert (gst_is_d3d11_memory (mem)); + GST_TRACE_OBJECT (self, "Source box left:top:right:bottom = %d, %d, %d, %d", + src_box.left, src_box.top, src_box.right, src_box.bottom); - dmem = (GstD3D11Memory *) mem; - if (dmem->device != filter->device) { - GST_TRACE_OBJECT (self, "Output memory belongs to different device"); + in_subresource = gst_d3d11_memory_get_subresource_index (in_dmem); + out_subresource = gst_d3d11_memory_get_subresource_index (out_dmem); + + GstD3D11DeviceLockGuard lk (device); + if (!gst_memory_map (in_mem, &in_map, + (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Failed to map input memory"); return FALSE; } - if (!gst_d3d11_video_processor_get_output_view (self->processor, dmem)) { - GST_TRACE_OBJECT (self, "POV is unavailable"); + if (!gst_memory_map (out_mem, &out_map, + (GstMapFlags) (GST_MAP_WRITE | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Failed to map output memory"); + gst_memory_unmap (in_mem, &in_map); return FALSE; } - return TRUE; -} + in_tex = (ID3D11Texture2D *) in_map.data; + out_tex = (ID3D11Texture2D *) out_map.data; -static gboolean -gst_d3d11_base_convert_transform_using_processor (GstD3D11BaseConvert * self, - GstBuffer * inbuf, GstBuffer * outbuf) -{ - GstD3D11Memory *in_mem, *out_mem; - ID3D11VideoProcessorInputView *piv; - ID3D11VideoProcessorOutputView *pov; + context->CopySubresourceRegion (out_tex, out_subresource, 0, 0, 0, + in_tex, in_subresource, &src_box); + gst_memory_unmap (in_mem, &in_map); + gst_memory_unmap (out_mem, &out_map); - in_mem = (GstD3D11Memory *) gst_buffer_peek_memory (inbuf, 0); - out_mem = (GstD3D11Memory *) gst_buffer_peek_memory (outbuf, 0); + if (gst_buffer_n_memory (inbuf) == 1) + return TRUE; - piv = gst_d3d11_video_processor_get_input_view (self->processor, in_mem); - if (!piv) { - GST_ERROR_OBJECT (self, "ID3D11VideoProcessorInputView is unavailable"); - return FALSE; + /* Non-native DXGI format YUV cases, copy UV plane(s) */ + switch (format) { + /* semi-planar */ + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_NV21: + case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P012_LE: + case GST_VIDEO_FORMAT_P016_LE: + src_box.top = GST_ROUND_DOWN_2 (meta->y) / 2; + src_box.bottom = GST_ROUND_DOWN_2 (meta->y + meta->height) / 2; + break; + /* planar */ + case GST_VIDEO_FORMAT_I420: + case GST_VIDEO_FORMAT_YV12: + case GST_VIDEO_FORMAT_I420_10LE: + case GST_VIDEO_FORMAT_I420_12LE: + src_box.left = GST_ROUND_DOWN_2 (meta->x) / 2; + src_box.top = GST_ROUND_DOWN_2 (meta->y) / 2; + src_box.right = GST_ROUND_DOWN_2 (meta->x + meta->width) / 2; + src_box.bottom = GST_ROUND_DOWN_2 (meta->y + meta->height) / 2; + break; + case GST_VIDEO_FORMAT_Y42B: + case GST_VIDEO_FORMAT_I422_10LE: + case GST_VIDEO_FORMAT_I422_12LE: + src_box.left = GST_ROUND_DOWN_2 (meta->x) / 2; + src_box.right = GST_ROUND_DOWN_2 (meta->x + meta->width) / 2; + break; + case GST_VIDEO_FORMAT_Y444: + case GST_VIDEO_FORMAT_Y444_10LE: + case GST_VIDEO_FORMAT_Y444_12LE: + case GST_VIDEO_FORMAT_Y444_16LE: + break; + default: + GST_ERROR_OBJECT (self, "Unexpected format %s", + gst_video_format_to_string (format)); + return FALSE; } - pov = gst_d3d11_video_processor_get_output_view (self->processor, out_mem); - if (!pov) { - GST_ERROR_OBJECT (self, "ID3D11VideoProcessorOutputView is unavailable"); - return FALSE; - } + GST_TRACE_OBJECT (self, "UV left:top:right:bottom = %d, %d, %d, %d", + src_box.left, src_box.top, src_box.right, src_box.bottom); + + for (guint i = 1; i < GST_VIDEO_INFO_N_PLANES (info); i++) { + in_mem = gst_buffer_peek_memory (inbuf, i); + out_mem = gst_buffer_peek_memory (outbuf, i); + + if (!gst_is_d3d11_memory (in_mem)) { + GST_ERROR_OBJECT (self, "Input is not a d3d11 memory"); + return FALSE; + } + + if (!gst_is_d3d11_memory (out_mem)) { + GST_ERROR_OBJECT (self, "Output is not a d3d11 memory"); + return FALSE; + } + + in_dmem = GST_D3D11_MEMORY_CAST (in_mem); + out_dmem = GST_D3D11_MEMORY_CAST (out_mem); - /* Clear background color with black */ - if (self->borders_w || self->borders_h) { - GstD3D11BaseFilter *bfilter = GST_D3D11_BASE_FILTER_CAST (self); - ID3D11DeviceContext *context_handle = - gst_d3d11_device_get_device_context_handle (bfilter->device); - ID3D11RenderTargetView *render_viewGST_VIDEO_MAX_PLANES = { NULL, }; + if (in_dmem->device != out_dmem->device) { + GST_ERROR_OBJECT (self, "Different device"); + return FALSE; + } - if (!gst_d3d11_buffer_get_render_target_view (outbuf, render_view)) { - GST_ERROR_OBJECT (self, "ID3D11RenderTargetView is unavailable"); + in_subresource = gst_d3d11_memory_get_subresource_index (in_dmem); + out_subresource = gst_d3d11_memory_get_subresource_index (out_dmem); + + if (!gst_memory_map (in_mem, &in_map, + (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Failed to map input memory"); return FALSE; } - gst_d3d11_device_lock (bfilter->device); - clear_rtv_color_all (self, &bfilter->out_info, context_handle, render_view); - gst_d3d11_device_unlock (bfilter->device); + if (!gst_memory_map (out_mem, &out_map, + (GstMapFlags) (GST_MAP_WRITE | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Failed to map output memory"); + gst_memory_unmap (in_mem, &in_map); + return FALSE; + } + + in_tex = (ID3D11Texture2D *) in_map.data; + out_tex = (ID3D11Texture2D *) out_map.data; + + context->CopySubresourceRegion (out_tex, out_subresource, 0, 0, 0, + in_tex, in_subresource, &src_box); + gst_memory_unmap (in_mem, &in_map); + gst_memory_unmap (out_mem, &out_map); } - return gst_d3d11_video_processor_render (self->processor, - &self->in_rect, piv, &self->out_rect, pov); + return TRUE; } static GstFlowReturn -gst_d3d11_base_convert_transform (GstBaseTransform * trans, - GstBuffer * inbuf, GstBuffer * outbuf) +gst_d3d11_base_convert_generate_output (GstBaseTransform * trans, + GstBuffer ** buffer) { - GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans); GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (trans); - GstD3D11Device *device = filter->device; - ID3D11Device *device_handle; - ID3D11DeviceContext *context_handle; - ID3D11ShaderResourceView *resource_viewGST_VIDEO_MAX_PLANES = { NULL, }; - ID3D11RenderTargetView *render_viewGST_VIDEO_MAX_PLANES = { NULL, }; - ID3D11RenderTargetView **target_rtv; - guint i; - gboolean copy_input = FALSE; - gboolean copy_output = FALSE; - GstMapInfo in_mapGST_VIDEO_MAX_PLANES; - GstMapInfo out_mapGST_VIDEO_MAX_PLANES; + GstBuffer *inbuf; + GstVideoCropMeta *crop_meta; + GstFlowReturn ret; - device_handle = gst_d3d11_device_get_device_handle (device); - context_handle = gst_d3d11_device_get_device_context_handle (device); - - if (!gst_d3d11_buffer_map (inbuf, device_handle, in_map, GST_MAP_READ)) { - GST_ERROR_OBJECT (self, "Couldn't map input buffer"); - goto invalid_memory; - } - - if (!gst_d3d11_buffer_map (outbuf, device_handle, out_map, GST_MAP_WRITE)) { - GST_ERROR_OBJECT (self, "Couldn't map output buffer"); - gst_d3d11_buffer_unmap (inbuf, in_map); - goto invalid_memory; + if (!self->same_caps) { + return GST_BASE_TRANSFORM_CLASS (parent_class)->generate_output (trans, + buffer); } - if (gst_d3d11_base_convert_prefer_video_processor (self, inbuf, outbuf)) { - gboolean ret = - gst_d3d11_base_convert_transform_using_processor (self, inbuf, outbuf); + /* Retrieve stashed input buffer, if the default submit_input_buffer + * was run. Takes ownership back from there */ + inbuf = trans->queued_buf; + trans->queued_buf = nullptr; - if (!ret) { - GST_ERROR_OBJECT (self, "Couldn't convert using video processor"); - goto conversion_failed; - } - - self->processor_in_use = TRUE; - - GST_TRACE_OBJECT (self, "Conversion done by video processor"); + /* This default processing method needs one input buffer to feed to + * the transform functions, we can't do anything without it */ + if (!inbuf) + return GST_FLOW_OK; - gst_d3d11_buffer_unmap (inbuf, in_map); - gst_d3d11_buffer_unmap (outbuf, out_map); + crop_meta = gst_buffer_get_video_crop_meta (inbuf); + /* downstream supports crop meta or no crop meta. Just passthrough it */ + if (self->downstream_supports_crop_meta || !crop_meta) { + *buffer = inbuf; return GST_FLOW_OK; } - /* Ensure shader resource views */ - if (!gst_d3d11_buffer_get_shader_resource_view (inbuf, resource_view)) { - if (!create_shader_input_resource (self, device, - self->in_d3d11_format, &filter->in_info)) { - GST_ERROR_OBJECT (self, "Failed to configure fallback input texture"); - goto fallback_failed; - } - - copy_input = TRUE; - gst_d3d11_device_lock (device); - for (i = 0; i < gst_buffer_n_memory (inbuf); i++) { - GstD3D11Memory *mem = - (GstD3D11Memory *) gst_buffer_peek_memory (inbuf, i); - guint subidx; - D3D11_BOX src_box = { 0, }; - D3D11_TEXTURE2D_DESC src_desc; - D3D11_TEXTURE2D_DESC dst_desc; - - subidx = gst_d3d11_memory_get_subresource_index (mem); - gst_d3d11_memory_get_texture_desc (mem, &src_desc); - - self->in_texturei->GetDesc (&dst_desc); - - src_box.left = 0; - src_box.top = 0; - src_box.front = 0; - src_box.back = 1; - src_box.right = MIN (src_desc.Width, dst_desc.Width); - src_box.bottom = MIN (src_desc.Height, dst_desc.Height); - - context_handle->CopySubresourceRegion (self->in_texturei, 0, 0, 0, 0, - (ID3D11Resource *) in_mapi.data, subidx, &src_box); - } - gst_d3d11_device_unlock (device); + ret = GST_BASE_TRANSFORM_CLASS (parent_class)->prepare_output_buffer (trans, + inbuf, buffer); + if (ret != GST_FLOW_OK || *buffer == nullptr) { + GST_WARNING_OBJECT (trans, "Could not get buffer from pool, %s", + gst_flow_get_name (ret)); + gst_buffer_unref (inbuf); + return ret; } - /* Ensure render target views */ - if (!gst_d3d11_buffer_get_render_target_view (outbuf, render_view)) { - if (!create_shader_output_resource (self, device, - self->out_d3d11_format, &filter->out_info)) { - GST_ERROR_OBJECT (self, "Failed to configure fallback output texture"); - goto fallback_failed; - } - - copy_output = TRUE; - } + GST_TRACE_OBJECT (self, "Copying cropped buffer"); + if (!gst_d3d11_base_convert_crop_and_copy (self, crop_meta, inbuf, *buffer)) { + gst_buffer_unref (inbuf); + gst_clear_buffer (buffer); - /* If we need border, clear render target view first */ - if (copy_output) { - target_rtv = self->render_target_view; - } else { - target_rtv = render_view; - } - - /* We need to clear background color as our shader wouldn't touch border - * area. Likely output texture was initialized with zeros which is fine for - * RGB, but it's not black color in case of YUV */ - if (self->borders_w || self->borders_h) { - gst_d3d11_device_lock (device); - clear_rtv_color_all (self, &filter->out_info, context_handle, target_rtv); - gst_d3d11_device_unlock (device); - } - - if (!gst_d3d11_converter_convert (self->converter, - copy_input ? self->shader_resource_view : resource_view, - target_rtv, NULL, NULL)) { - goto conversion_failed; - } - - if (copy_output) { - gst_d3d11_device_lock (device); - for (i = 0; i < gst_buffer_n_memory (outbuf); i++) { - GstD3D11Memory *mem = - (GstD3D11Memory *) gst_buffer_peek_memory (outbuf, i); - guint subidx; - D3D11_BOX src_box = { 0, }; - D3D11_TEXTURE2D_DESC src_desc; - D3D11_TEXTURE2D_DESC dst_desc; - - self->out_texturei->GetDesc (&src_desc); - subidx = gst_d3d11_memory_get_subresource_index (mem); - gst_d3d11_memory_get_texture_desc (mem, &dst_desc); - - src_box.left = 0; - src_box.top = 0; - src_box.front = 0; - src_box.back = 1; - src_box.right = MIN (src_desc.Width, dst_desc.Width); - src_box.bottom = MIN (src_desc.Height, dst_desc.Height); - - context_handle->CopySubresourceRegion ((ID3D11Resource *) out_mapi.data, - subidx, 0, 0, 0, self->out_texturei, 0, &src_box); - } - gst_d3d11_device_unlock (device); + return GST_FLOW_ERROR; } - gst_d3d11_buffer_unmap (inbuf, in_map); - gst_d3d11_buffer_unmap (outbuf, out_map); + gst_buffer_unref (inbuf); return GST_FLOW_OK; +} -invalid_memory: - { - GST_ELEMENT_ERROR (self, CORE, FAILED, (NULL), ("Invalid memory")); - return GST_FLOW_ERROR; +static gboolean +gst_d3d11_base_convert_transform_meta (GstBaseTransform * trans, + GstBuffer * outbuf, GstMeta * meta, GstBuffer * inbuf) +{ + /* Do not copy crop meta in any case. + * + * 1) When input and output caps are identical, + * - If downstream supports crop meta or crop meta is not attached on input + * buffer, then we do passthrough input buffers. + * In that case, this method must not be called already + * - Otherwise (downstream does not support crop meta), we do crop input + * and copy cropped area to output buffer + * 2) in case of input-caps != output-caps, we specify source rectangle to + * shader or video processor object. Then the conversion object will + * consider source cropping area automatically + */ + if (meta->info->api == GST_VIDEO_CROP_META_API_TYPE) + return FALSE; + + return GST_BASE_TRANSFORM_CLASS (parent_class)->transform_meta (trans, + outbuf, meta, inbuf); +} + +static GstFlowReturn +gst_d3d11_base_convert_transform (GstBaseTransform * trans, + GstBuffer * inbuf, GstBuffer * outbuf) +{ + GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (trans); + RECT in_rect; + GstVideoCropMeta *crop_meta; + + crop_meta = gst_buffer_get_video_crop_meta (inbuf); + if (crop_meta) { + GST_TRACE_OBJECT (self, "Have crop rect, x:y:w:h = %d:%d:%d:%d", + crop_meta->x, crop_meta->y, crop_meta->width, crop_meta->height); + + in_rect.left = crop_meta->x; + in_rect.top = crop_meta->y; + in_rect.right = crop_meta->x + crop_meta->width; + in_rect.bottom = crop_meta->y + crop_meta->height; + } else { + in_rect = self->in_rect; } -fallback_failed: - { - GST_ELEMENT_ERROR (self, CORE, FAILED, (NULL), - ("Couldn't prepare fallback memory")); - gst_d3d11_buffer_unmap (inbuf, in_map); - gst_d3d11_buffer_unmap (outbuf, out_map); - return GST_FLOW_ERROR; + if (in_rect.left != self->prev_in_rect.left || + in_rect.top != self->prev_in_rect.top || + in_rect.right != self->prev_in_rect.right || + in_rect.bottom != self->prev_in_rect.bottom) { + self->prev_in_rect = in_rect; + g_object_set (self->converter, "src-x", (gint) in_rect.left, + "src-y", (gint) in_rect.top, + "src-width", (gint) in_rect.right - in_rect.left, + "src-height", (gint) in_rect.bottom - in_rect.top, nullptr); } -conversion_failed: - { - GST_ELEMENT_ERROR (self, CORE, FAILED, (NULL), - ("Couldn't convert texture")); - gst_d3d11_buffer_unmap (inbuf, in_map); - gst_d3d11_buffer_unmap (outbuf, out_map); + if (!gst_d3d11_converter_convert_buffer (self->converter, inbuf, outbuf)) { + GST_ELEMENT_ERROR (self, CORE, FAILED, (nullptr), + ("Couldn't convert texture")); return GST_FLOW_ERROR; } + + return GST_FLOW_OK; } static void @@ -2214,6 +1896,82 @@ gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM_CAST (self)); } +static void +gst_d3d11_base_convert_set_border_color (GstD3D11BaseConvert * self, + guint64 border_color) +{ + GstD3D11SRWLockGuard lk (&self->lock); + self->border_color = border_color; + if (self->converter) + g_object_set (self->converter, "border-color", self->border_color, nullptr); +} + +static void +gst_d3d11_base_convert_set_orientation (GstD3D11BaseConvert * self, + GstVideoOrientationMethod method, gboolean from_tag) +{ + if (method == GST_VIDEO_ORIENTATION_CUSTOM) { + GST_WARNING_OBJECT (self, "Unsupported custom orientation"); + return; + } + + GstD3D11SRWLockGuard lk (&self->lock); + if (from_tag) + self->tag_method = method; + else + self->method = method; + + if (self->method == GST_VIDEO_ORIENTATION_AUTO) { + self->selected_method = self->tag_method; + } else { + self->selected_method = self->method; + } + + if (self->selected_method != self->active_method) { + GST_DEBUG_OBJECT (self, "Rotation orientation %d -> %d", + self->active_method, self->selected_method); + + gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (self)); + } +} + +static void +gst_d3d11_base_convert_set_gamma_mode (GstD3D11BaseConvert * self, + GstVideoGammaMode mode) +{ + GstD3D11SRWLockGuard lk (&self->lock); + if (self->gamma_mode != mode) { + GST_DEBUG_OBJECT (self, "Gamma mode %d -> %d", self->gamma_mode, mode); + self->gamma_mode = mode; + gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (self)); + } +} + +static void +gst_d3d11_base_convert_set_primaries_mode (GstD3D11BaseConvert * self, + GstVideoPrimariesMode mode) +{ + GstD3D11SRWLockGuard lk (&self->lock); + if (self->primaries_mode != mode) { + gboolean prev_enabled = TRUE; + gboolean new_enabled = TRUE; + + GST_DEBUG_OBJECT (self, "Primaries mode %d -> %d", + self->primaries_mode, mode); + + if (self->primaries_mode == GST_VIDEO_PRIMARIES_MODE_NONE) + prev_enabled = FALSE; + + if (mode == GST_VIDEO_PRIMARIES_MODE_NONE) + new_enabled = FALSE; + + self->primaries_mode = mode; + + if (prev_enabled != new_enabled) + gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (self)); + } +} + /** * SECTION:element-d3d11convert * @title: d3d11convert @@ -2242,6 +2000,10 @@ { PROP_CONVERT_0, PROP_CONVERT_ADD_BORDERS, + PROP_CONVERT_BORDER_COLOR, + PROP_CONVERT_VIDEO_DIRECTION, + PROP_CONVERT_GAMMA_MODE, + PROP_CONVERT_PRIMARIES_MODE, }; struct _GstD3D11Convert @@ -2249,18 +2011,30 @@ GstD3D11BaseConvert parent; }; -G_DEFINE_TYPE (GstD3D11Convert, gst_d3d11_convert, GST_TYPE_D3D11_BASE_CONVERT); +static void +gst_d3d11_convert_video_direction_interface_init (GstVideoDirectionInterface * + iface) +{ +} + +G_DEFINE_TYPE_WITH_CODE (GstD3D11Convert, gst_d3d11_convert, + GST_TYPE_D3D11_BASE_CONVERT, + G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_DIRECTION, + gst_d3d11_convert_video_direction_interface_init)); static void gst_d3d11_convert_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_d3d11_convert_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); +static gboolean gst_d3d11_convert_sink_event (GstBaseTransform * trans, + GstEvent * event); static void gst_d3d11_convert_class_init (GstD3D11ConvertClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); gobject_class->set_property = gst_d3d11_convert_set_property; gobject_class->get_property = gst_d3d11_convert_get_property; @@ -2268,7 +2042,7 @@ /** * GstD3D11Convert:add-borders: * - * Add black borders if necessary to keep the display aspect ratio + * Add borders if necessary to keep the display aspect ratio * * Since: 1.20 */ @@ -2278,12 +2052,63 @@ DEFAULT_ADD_BORDERS, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + /** + * GstD3D11Convert:border-color: + * + * Border color to use in ARGB64 format + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_CONVERT_BORDER_COLOR, + g_param_spec_uint64 ("border-color", "Border color", + "Border color to use in ARGB64 format", 0, G_MAXUINT64, + DEFAULT_BORDER_COLOR, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /** + * GstD3D11Convert:video-direction: + * + * Video rotation/flip method to use + * + * Since: 1.22 + */ + g_object_class_override_property (gobject_class, PROP_CONVERT_VIDEO_DIRECTION, + "video-direction"); + + /** + * GstD3D11Convert:gamma-mode: + * + * Gamma conversion mode + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_CONVERT_GAMMA_MODE, + g_param_spec_enum ("gamma-mode", "Gamma mode", + "Gamma conversion mode", GST_TYPE_VIDEO_GAMMA_MODE, + DEFAULT_GAMMA_MODE, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /** + * GstD3D11Convert:primaries-mode: + * + * Primaries conversion mode + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_CONVERT_PRIMARIES_MODE, + g_param_spec_enum ("primaries-mode", "Primaries Mode", + "Primaries conversion mode", GST_TYPE_VIDEO_PRIMARIES_MODE, + DEFAULT_PRIMARIES_MODE, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + gst_element_class_set_static_metadata (element_class, "Direct3D11 colorspace converter and scaler", - "Filter/Converter/Scaler/Video/Hardware", + "Filter/Converter/Scaler/Effect/Video/Hardware", "Resizes video and allow color conversion using Direct3D11", "Seungha Yang <seungha.yang@navercorp.com>, " "Jeongki Kim <jeongki.kim@jeongki.kim>"); + + trans_class->sink_event = GST_DEBUG_FUNCPTR (gst_d3d11_convert_sink_event); } static void @@ -2301,6 +2126,22 @@ case PROP_CONVERT_ADD_BORDERS: gst_d3d11_base_convert_set_add_border (base, g_value_get_boolean (value)); break; + case PROP_CONVERT_BORDER_COLOR: + gst_d3d11_base_convert_set_border_color (base, + g_value_get_uint64 (value)); + break; + case PROP_CONVERT_VIDEO_DIRECTION: + gst_d3d11_base_convert_set_orientation (base, + (GstVideoOrientationMethod) g_value_get_enum (value), FALSE); + break; + case PROP_CONVERT_GAMMA_MODE: + gst_d3d11_base_convert_set_gamma_mode (base, + (GstVideoGammaMode) g_value_get_enum (value)); + break; + case PROP_CONVERT_PRIMARIES_MODE: + gst_d3d11_base_convert_set_primaries_mode (base, + (GstVideoPrimariesMode) g_value_get_enum (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -2317,12 +2158,47 @@ case PROP_CONVERT_ADD_BORDERS: g_value_set_boolean (value, base->add_borders); break; + case PROP_CONVERT_BORDER_COLOR: + g_value_set_uint64 (value, base->border_color); + break; + case PROP_CONVERT_VIDEO_DIRECTION: + g_value_set_enum (value, base->method); + break; + case PROP_CONVERT_GAMMA_MODE: + g_value_set_enum (value, base->gamma_mode); + break; + case PROP_CONVERT_PRIMARIES_MODE: + g_value_set_enum (value, base->primaries_mode); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } +static gboolean +gst_d3d11_convert_sink_event (GstBaseTransform * trans, GstEvent * event) +{ + GstD3D11BaseConvert *base = GST_D3D11_BASE_CONVERT (trans); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_TAG:{ + GstTagList *taglist; + GstVideoOrientationMethod method = GST_VIDEO_ORIENTATION_IDENTITY; + + gst_event_parse_tag (event, &taglist); + if (gst_video_orientation_from_tag (taglist, &method)) + gst_d3d11_base_convert_set_orientation (base, method, TRUE); + break; + } + default: + break; + } + + return GST_BASE_TRANSFORM_CLASS (gst_d3d11_convert_parent_class)->sink_event + (trans, event); +} + /** * SECTION:element-d3d11colorconvert * @title: d3d11colorconvert @@ -2340,11 +2216,23 @@ * Since: 1.20 * */ + +enum +{ + PROP_COLOR_CONVERT_0, + PROP_COLOR_CONVERT_GAMMA_MODE, + PROP_COLOR_CONVERT_PRIMARIES_MODE, +}; + struct _GstD3D11ColorConvert { GstD3D11BaseConvert parent; }; +static void gst_d3d11_color_convert_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_d3d11_color_convert_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); static GstCaps *gst_d3d11_color_convert_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter); static GstCaps *gst_d3d11_color_convert_fixate_caps (GstBaseTransform * base, @@ -2356,9 +2244,40 @@ static void gst_d3d11_color_convert_class_init (GstD3D11ColorConvertClass * klass) { + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); + gobject_class->set_property = gst_d3d11_color_convert_set_property; + gobject_class->get_property = gst_d3d11_color_convert_get_property; + + /** + * GstD3D11ColorConvert:gamma-mode: + * + * Gamma conversion mode + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_COLOR_CONVERT_GAMMA_MODE, + g_param_spec_enum ("gamma-mode", "Gamma mode", + "Gamma conversion mode", GST_TYPE_VIDEO_GAMMA_MODE, + DEFAULT_GAMMA_MODE, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /** + * GstD3D11ColorConvert:primaries-mode: + * + * Primaries conversion mode + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, + PROP_COLOR_CONVERT_PRIMARIES_MODE, + g_param_spec_enum ("primaries-mode", "Primaries Mode", + "Primaries conversion mode", GST_TYPE_VIDEO_PRIMARIES_MODE, + DEFAULT_PRIMARIES_MODE, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + gst_element_class_set_static_metadata (element_class, "Direct3D11 colorspace converter", "Filter/Converter/Video/Hardware", @@ -2376,6 +2295,46 @@ { } +static void +gst_d3d11_color_convert_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstD3D11BaseConvert *base = GST_D3D11_BASE_CONVERT (object); + + switch (prop_id) { + case PROP_COLOR_CONVERT_GAMMA_MODE: + gst_d3d11_base_convert_set_gamma_mode (base, + (GstVideoGammaMode) g_value_get_enum (value)); + break; + case PROP_COLOR_CONVERT_PRIMARIES_MODE: + gst_d3d11_base_convert_set_primaries_mode (base, + (GstVideoPrimariesMode) g_value_get_enum (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_d3d11_color_convert_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstD3D11BaseConvert *base = GST_D3D11_BASE_CONVERT (object); + + switch (prop_id) { + case PROP_COLOR_CONVERT_GAMMA_MODE: + g_value_set_enum (value, base->gamma_mode); + break; + case PROP_COLOR_CONVERT_PRIMARIES_MODE: + g_value_set_enum (value, base->primaries_mode); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + static GstCaps * gst_d3d11_color_convert_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter) @@ -2445,6 +2404,7 @@ { PROP_SCALE_0, PROP_SCALE_ADD_BORDERS, + PROP_SCALE_BORDER_COLOR, }; struct _GstD3D11Scale @@ -2476,7 +2436,7 @@ /** * GstD3D11Scale:add-borders: * - * Add black borders if necessary to keep the display aspect ratio + * Add borders if necessary to keep the display aspect ratio * * Since: 1.20 */ @@ -2486,6 +2446,19 @@ DEFAULT_ADD_BORDERS, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + /** + * GstD3D11Scale:border-color: + * + * Border color to use in ARGB64 format + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_SCALE_BORDER_COLOR, + g_param_spec_uint64 ("border-color", "Border color", + "Border color to use in ARGB64 format", 0, G_MAXUINT64, + DEFAULT_BORDER_COLOR, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + gst_element_class_set_static_metadata (element_class, "Direct3D11 scaler", "Filter/Converter/Video/Scaler/Hardware", @@ -2509,9 +2482,13 @@ GstD3D11BaseConvert *base = GST_D3D11_BASE_CONVERT (object); switch (prop_id) { - case PROP_CONVERT_ADD_BORDERS: + case PROP_SCALE_ADD_BORDERS: gst_d3d11_base_convert_set_add_border (base, g_value_get_boolean (value)); break; + case PROP_SCALE_BORDER_COLOR: + gst_d3d11_base_convert_set_border_color (base, + g_value_get_uint64 (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -2525,9 +2502,12 @@ GstD3D11BaseConvert *base = GST_D3D11_BASE_CONVERT (object); switch (prop_id) { - case PROP_CONVERT_ADD_BORDERS: + case PROP_SCALE_ADD_BORDERS: g_value_set_boolean (value, base->add_borders); break; + case PROP_SCALE_BORDER_COLOR: + g_value_set_uint64 (value, base->border_color); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11decoder.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11decoder.cpp
Changed
@@ -52,15 +52,19 @@ #endif #include "gstd3d11decoder.h" -#include "gstd3d11converter.h" #include "gstd3d11pluginutils.h" #include <string.h> #include <string> +#include <wrl.h> #ifdef HAVE_WINMM #include <mmsystem.h> #endif +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_decoder_debug); #define GST_CAT_DEFAULT gst_d3d11_decoder_debug @@ -124,6 +128,85 @@ /* TODO: add more profile */ }; +DEFINE_GUID (IID_GST_D3D11_DECODER_VIEW_DATA, 0xe1fd3e17, 0x1e33, + 0x4198, 0x9e, 0x48, 0xdb, 0x01, 0x55, 0x2b, 0xf1, 0x78); + +/* *INDENT-OFF* */ +class IGstD3D11DecoderViewData: public IUnknown +{ +public: + static HRESULT + CreateInstance (guint8 index, IGstD3D11DecoderViewData ** data) + { + IGstD3D11DecoderViewData *self; + + self = new IGstD3D11DecoderViewData (index); + if (!self) + return E_OUTOFMEMORY; + + *data = self; + + return S_OK; + } + + STDMETHODIMP_ (ULONG) + AddRef (void) + { + return InterlockedIncrement (&ref_count_); + } + + STDMETHODIMP_ (ULONG) + Release (void) + { + ULONG ref_count; + + ref_count = InterlockedDecrement (&ref_count_); + + if (ref_count == 0) + delete this; + + return ref_count; + } + + STDMETHODIMP + QueryInterface (REFIID riid, void ** object) + { + if (riid == IID_IUnknown) { + *object = static_cast<IUnknown *> + (static_cast<IGstD3D11DecoderViewData *> (this)); + } else if (riid == IID_GST_D3D11_DECODER_VIEW_DATA) { + *object = this; + } else { + *object = nullptr; + return E_NOINTERFACE; + } + + AddRef (); + + return S_OK; + } + + guint8 + GetViewIndex (void) + { + return index_; + } + +private: + IGstD3D11DecoderViewData (guint8 index) : index_(index), ref_count_(1) + { + } + + virtual ~IGstD3D11DecoderViewData (void) + { + } + +private: + guint8 index_; + ULONG ref_count_; +}; +/* *INDENT-ON* */ + enum { PROP_0, @@ -147,16 +230,22 @@ GstVideoInfo info; GstVideoInfo output_info; GstDXVACodec codec; + gint offset_x; + gint offset_y; gint coded_width; gint coded_height; DXGI_FORMAT decoder_format; gboolean downstream_supports_d3d11; + gboolean need_crop; + gboolean use_crop_meta; GstVideoCodecState *input_state; GstVideoCodecState *output_state; - /* Protect internal pool */ - GMutex internal_pool_lock; + SRWLOCK lock; + /* performance frequency */ + LARGE_INTEGER frequency; + gboolean flushing; GstBufferPool *internal_pool; /* Internal pool params */ @@ -172,8 +261,7 @@ /* for staging */ ID3D11Texture2D *staging; - gsize staging_texture_offsetGST_VIDEO_MAX_PLANES; - gint stating_texture_strideGST_VIDEO_MAX_PLANES; + guint stating_plane_offsetGST_VIDEO_MAX_PLANES; GUID decoder_profile; @@ -219,7 +307,6 @@ static void gst_d3d11_decoder_init (GstD3D11Decoder * self) { - g_mutex_init (&self->internal_pool_lock); } static void @@ -252,6 +339,9 @@ self->video_context = video_context; video_context->AddRef (); + BOOL ret = QueryPerformanceFrequency (&self->frequency); + g_assert (ret); + return; } @@ -290,20 +380,14 @@ static void gst_d3d11_decoder_clear_resource (GstD3D11Decoder * self) { - g_mutex_lock (&self->internal_pool_lock); + GstD3D11SRWLockGuard lk (&self->lock); if (self->internal_pool) { gst_buffer_pool_set_active (self->internal_pool, FALSE); gst_clear_object (&self->internal_pool); } - g_mutex_unlock (&self->internal_pool_lock); GST_D3D11_CLEAR_COM (self->decoder_handle); GST_D3D11_CLEAR_COM (self->staging); - - memset (self->staging_texture_offset, - 0, sizeof (self->staging_texture_offset)); - memset (self->stating_texture_stride, - 0, sizeof (self->stating_texture_stride)); } static void @@ -316,6 +400,7 @@ self->configured = FALSE; self->opened = FALSE; + self->flushing = FALSE; self->use_array_of_texture = FALSE; self->downstream_supports_d3d11 = FALSE; @@ -342,16 +427,14 @@ static void gst_d3d11_decoder_finalize (GObject * obj) { +#if HAVE_WINMM GstD3D11Decoder *self = GST_D3D11_DECODER (obj); -#if HAVE_WINMM /* Restore clock precision */ if (self->timer_resolution) timeEndPeriod (self->timer_resolution); #endif - g_mutex_clear (&self->internal_pool_lock); - G_OBJECT_CLASS (parent_class)->finalize (obj); } @@ -387,25 +470,15 @@ return decoder->configured; } -static GQuark -gst_d3d11_decoder_view_id_quark (void) -{ - static gsize id_quark = 0; - - if (g_once_init_enter (&id_quark)) { - GQuark quark = g_quark_from_string ("GstD3D11DecoderViewId"); - g_once_init_leave (&id_quark, quark); - } - - return (GQuark) id_quark; -} - static gboolean gst_d3d11_decoder_ensure_output_view (GstD3D11Decoder * self, GstBuffer * buffer) { GstD3D11Memory *mem; - gpointer val = NULL; + ID3D11Resource *texture; + ComPtr < IGstD3D11DecoderViewData > data; + UINT size; + HRESULT hr; mem = (GstD3D11Memory *) gst_buffer_peek_memory (buffer, 0); if (!gst_d3d11_memory_get_decoder_output_view (mem, self->video_device, @@ -417,25 +490,26 @@ if (!self->use_array_of_texture) return TRUE; - val = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), - gst_d3d11_decoder_view_id_quark ()); - if (!val) { - g_assert (self->next_view_id < 128); - g_assert (self->next_view_id > 0); + size = sizeof (IGstD3D11DecoderViewData *); - gst_mini_object_set_qdata (GST_MINI_OBJECT (mem), - gst_d3d11_decoder_view_id_quark (), - GUINT_TO_POINTER (self->next_view_id), NULL); + texture = gst_d3d11_memory_get_resource_handle (mem); + texture->GetPrivateData (IID_GST_D3D11_DECODER_VIEW_DATA, + &size, data.GetAddressOf ()); + + if (!data) { + g_assert (self->next_view_id < 127); + + hr = IGstD3D11DecoderViewData::CreateInstance (self->next_view_id, &data); + g_assert (SUCCEEDED (hr)); + + texture->SetPrivateDataInterface (IID_GST_D3D11_DECODER_VIEW_DATA, + data.Get ()); self->next_view_id++; - /* valid view range is 0, 126, but 0 is not used to here - * (it's NULL as well) */ - self->next_view_id %= 128; - if (self->next_view_id == 0) - self->next_view_id = 1; + /* valid view range is 0, 126 */ + self->next_view_id %= 127; } - return TRUE; } @@ -446,17 +520,16 @@ GstBufferPool *pool = NULL; GstCaps *caps = NULL; GstVideoAlignment align; - GstD3D11AllocationFlags alloc_flags = (GstD3D11AllocationFlags) 0; + GstD3D11AllocationFlags alloc_flags = GST_D3D11_ALLOCATION_FLAG_DEFAULT; gint bind_flags = D3D11_BIND_DECODER; GstVideoInfo *info = &self->info; guint pool_size; - g_mutex_lock (&self->internal_pool_lock); + GstD3D11SRWLockGuard lk (&self->lock); if (self->internal_pool) { gst_buffer_pool_set_active (self->internal_pool, FALSE); gst_clear_object (&self->internal_pool); } - g_mutex_unlock (&self->internal_pool_lock); if (!self->use_array_of_texture) { alloc_flags = GST_D3D11_ALLOCATION_FLAG_TEXTURE_ARRAY; @@ -466,7 +539,7 @@ } alloc_params = gst_d3d11_allocation_params_new (self->device, info, - alloc_flags, bind_flags); + alloc_flags, bind_flags, 0); if (!alloc_params) { GST_ERROR_OBJECT (self, "Failed to create allocation param"); @@ -482,12 +555,10 @@ if (!self->use_array_of_texture) { alloc_params->desc0.ArraySize = pool_size; } else { - /* Valid view id is 0, 126, but we will use 1, 127 range so that - * it can be used by qdata, because zero is equal to null */ - self->next_view_id = 1; + self->next_view_id = 0; - /* our pool size can be increased as much as possbile */ - pool_size = 0; + /* Valid view id range is 0, 126 */ + pool_size = 127; } gst_video_alignment_reset (&align); @@ -520,9 +591,7 @@ goto error; } - g_mutex_lock (&self->internal_pool_lock); self->internal_pool = pool; - g_mutex_unlock (&self->internal_pool_lock); return TRUE; @@ -706,40 +775,51 @@ return TRUE; } - gboolean gst_d3d11_decoder_configure (GstD3D11Decoder * decoder, - GstVideoCodecState * input_state, GstVideoInfo * info, gint coded_width, - gint coded_height, guint dpb_size) + GstVideoCodecState * input_state, const GstVideoInfo * out_info, + gint offset_x, gint offset_y, gint coded_width, gint coded_height, + guint dpb_size) { - const GstD3D11Format *d3d11_format; + GstD3D11Format d3d11_format; g_return_val_if_fail (GST_IS_D3D11_DECODER (decoder), FALSE); - g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (out_info != NULL, FALSE); g_return_val_if_fail (input_state != NULL, FALSE); - g_return_val_if_fail (coded_width >= GST_VIDEO_INFO_WIDTH (info), FALSE); - g_return_val_if_fail (coded_height >= GST_VIDEO_INFO_HEIGHT (info), FALSE); + g_return_val_if_fail (coded_width >= GST_VIDEO_INFO_WIDTH (out_info), FALSE); + g_return_val_if_fail (coded_height >= GST_VIDEO_INFO_HEIGHT (out_info), + FALSE); g_return_val_if_fail (dpb_size > 0, FALSE); gst_d3d11_decoder_reset (decoder); - d3d11_format = gst_d3d11_device_format_from_gst (decoder->device, - GST_VIDEO_INFO_FORMAT (info)); - if (!d3d11_format || d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) { + if (!gst_d3d11_device_get_format (decoder->device, + GST_VIDEO_INFO_FORMAT (out_info), &d3d11_format) || + d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) { GST_ERROR_OBJECT (decoder, "Could not determine dxgi format from %s", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info))); + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info))); return FALSE; } + /* Additional 4 frames to help zero-copying */ + dpb_size += 4; + decoder->input_state = gst_video_codec_state_ref (input_state); - decoder->info = decoder->output_info = *info; + decoder->info = decoder->output_info = *out_info; + decoder->offset_x = offset_x; + decoder->offset_y = offset_y; decoder->coded_width = coded_width; decoder->coded_height = coded_height; decoder->dpb_size = dpb_size; - decoder->decoder_format = d3d11_format->dxgi_format; + decoder->decoder_format = d3d11_format.dxgi_format; decoder->configured = TRUE; + if (offset_x != 0 || offset_y != 0) + decoder->need_crop = TRUE; + else + decoder->need_crop = FALSE; + return TRUE; } @@ -765,12 +845,16 @@ desc.Usage = D3D11_USAGE_STAGING; desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - hr = device_handle->CreateTexture2D (&desc, NULL, &self->staging); + hr = device_handle->CreateTexture2D (&desc, nullptr, &self->staging); if (!gst_d3d11_result (hr, self->device)) { GST_ERROR_OBJECT (self, "Couldn't create staging texture"); return FALSE; } + /* decoder supports single plane (e.g,. YUV packed) or semi-planar */ + self->stating_plane_offset0 = 0; + self->stating_plane_offset1 = desc.Height; + return TRUE; } @@ -820,6 +904,7 @@ GstD3D11DeviceVendor vendor; ID3D11VideoDevice *video_device; GstVideoInfo *info = &self->info; + GstD3D11DeviceLockGuard lk (self->device); if (self->opened) return TRUE; @@ -831,7 +916,6 @@ video_device = self->video_device; - gst_d3d11_device_lock (self->device); if (!gst_d3d11_decoder_get_supported_decoder_profile (self->device, self->codec, GST_VIDEO_INFO_FORMAT (info), &selected_profile)) { goto error; @@ -988,7 +1072,6 @@ self->wait_on_pool_full = FALSE; self->opened = TRUE; - gst_d3d11_device_unlock (self->device); gst_d3d11_decoder_enable_high_precision_timer (self); @@ -996,54 +1079,64 @@ error: gst_d3d11_decoder_reset (self); - gst_d3d11_device_unlock (self->device); return FALSE; } -static gboolean -gst_d3d11_decoder_begin_frame (GstD3D11Decoder * decoder, +static GstFlowReturn +gst_d3d11_decoder_begin_frame (GstD3D11Decoder * self, ID3D11VideoDecoderOutputView * output_view, guint content_key_size, gconstpointer content_key) { ID3D11VideoContext *video_context; guint retry_count = 0; HRESULT hr; - guint retry_threshold = 100; + BOOL timer_ret; + LARGE_INTEGER now; + LONGLONG timeout; - /* if we have high resolution timer, do more retry */ - if (decoder->timer_resolution) - retry_threshold = 500; + video_context = self->video_context; - video_context = decoder->video_context; + timer_ret = QueryPerformanceCounter (&now); + g_assert (timer_ret); + + /* 20 sec timeout should be sufficient */ + timeout = now.QuadPart + 20 * self->frequency.QuadPart; do { - GST_LOG_OBJECT (decoder, "Try begin frame, retry count %d", retry_count); - hr = video_context->DecoderBeginFrame (decoder->decoder_handle, + if (self->flushing) { + GST_DEBUG_OBJECT (self, "We are flushing"); + return GST_FLOW_FLUSHING; + } + + GST_LOG_OBJECT (self, "Try begin frame, retry count %d", retry_count); + hr = video_context->DecoderBeginFrame (self->decoder_handle, output_view, content_key_size, content_key); /* HACK: Do retry with 1ms sleep per failure, since DXVA/D3D11 * doesn't provide API for "GPU-IS-READY-TO-DECODE" like signal. */ - if (hr == E_PENDING && retry_count < retry_threshold) { - GST_LOG_OBJECT (decoder, "GPU is busy, try again. Retry count %d", + if (hr == E_PENDING) { + GST_LOG_OBJECT (self, "GPU is busy, try again. Retry count %d", retry_count); - g_usleep (1000); + Sleep (1); } else { - if (gst_d3d11_result (hr, decoder->device)) - GST_LOG_OBJECT (decoder, "Succeeded with retry count %d", retry_count); + if (gst_d3d11_result (hr, self->device)) + GST_LOG_OBJECT (self, "Succeeded with retry count %d", retry_count); break; } retry_count++; - } while (TRUE); + timer_ret = QueryPerformanceCounter (&now); + g_assert (timer_ret); + } while (now.QuadPart < timeout); - if (!gst_d3d11_result (hr, decoder->device)) { - GST_ERROR_OBJECT (decoder, "Failed to begin frame, hr: 0x%x", (guint) hr); - return FALSE; + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to begin frame, hr: 0x%x", (guint) hr); + return GST_FLOW_ERROR; } - return TRUE; + return GST_FLOW_OK; } static gboolean @@ -1127,7 +1220,7 @@ return TRUE; } -gboolean +GstFlowReturn gst_d3d11_decoder_decode_frame (GstD3D11Decoder * decoder, ID3D11VideoDecoderOutputView * output_view, GstD3D11DecodeInputStreamArgs * input_args) @@ -1136,10 +1229,11 @@ gpointer d3d11_buffer; D3D11_VIDEO_DECODER_BUFFER_DESC buffer_desc4; guint buffer_desc_size; + GstFlowReturn ret = GST_FLOW_OK; - g_return_val_if_fail (GST_IS_D3D11_DECODER (decoder), FALSE); - g_return_val_if_fail (output_view != nullptr, FALSE); - g_return_val_if_fail (input_args != nullptr, FALSE); + g_return_val_if_fail (GST_IS_D3D11_DECODER (decoder), GST_FLOW_ERROR); + g_return_val_if_fail (output_view != nullptr, GST_FLOW_ERROR); + g_return_val_if_fail (input_args != nullptr, GST_FLOW_ERROR); memset (buffer_desc, 0, sizeof (buffer_desc)); @@ -1162,12 +1256,10 @@ buffer_desc_size++; } - gst_d3d11_device_lock (decoder->device); - if (!gst_d3d11_decoder_begin_frame (decoder, output_view, 0, nullptr)) { - gst_d3d11_device_unlock (decoder->device); - - return FALSE; - } + GstD3D11DeviceLockGuard lk (decoder->device); + ret = gst_d3d11_decoder_begin_frame (decoder, output_view, 0, nullptr); + if (ret != GST_FLOW_OK) + return ret; if (!gst_d3d11_decoder_get_decoder_buffer (decoder, D3D11_VIDEO_DECODER_BUFFER_PICTURE_PARAMETERS, &d3d11_buffer_size, @@ -1280,19 +1372,14 @@ goto error; } - if (!gst_d3d11_decoder_end_frame (decoder)) { - gst_d3d11_device_unlock (decoder->device); - return FALSE; - } - - gst_d3d11_device_unlock (decoder->device); + if (!gst_d3d11_decoder_end_frame (decoder)) + return GST_FLOW_ERROR; - return TRUE; + return GST_FLOW_OK; error: gst_d3d11_decoder_end_frame (decoder); - gst_d3d11_device_unlock (decoder->device); - return FALSE; + return GST_FLOW_ERROR; } GstBuffer * @@ -1373,18 +1460,22 @@ if (index) { if (decoder->use_array_of_texture) { - guint8 id; - gpointer val = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), - gst_d3d11_decoder_view_id_quark ()); - if (!val) { - GST_ERROR_OBJECT (decoder, "memory has no qdata"); - return NULL; - } + ID3D11Resource *texture; + ComPtr < IGstD3D11DecoderViewData > data; + UINT size; + + texture = gst_d3d11_memory_get_resource_handle (dmem); + size = sizeof (IGstD3D11DecoderViewData *); - id = (guint8) GPOINTER_TO_UINT (val); - g_assert (id < 128); + texture->GetPrivateData (IID_GST_D3D11_DECODER_VIEW_DATA, + &size, data.GetAddressOf ()); + + if (!data) { + GST_ERROR_OBJECT (decoder, "memory has no private data"); + return nullptr; + } - *index = (id - 1); + *index = data->GetViewIndex (); } else { *index = gst_d3d11_memory_get_subresource_index (dmem); } @@ -1393,145 +1484,128 @@ return view; } +static void +gst_d3d11_decoder_crop_and_copy_texture (GstD3D11Decoder * self, + ID3D11Texture2D * src_texture, guint src_subresource, + ID3D11Texture2D * dst_texture, guint dst_subresource) +{ + GstD3D11Device *device = self->device; + ID3D11DeviceContext *context = + gst_d3d11_device_get_device_context_handle (device); + D3D11_BOX src_box = { 0, }; + GstD3D11DeviceLockGuard lk (device); + + /* NOTE: this may be incorrect for non-4:2:0 formats, but we do support + * only 4:2:0 8/10 bits streams at the moment */ + src_box.left = GST_ROUND_UP_2 (self->offset_x); + src_box.top = GST_ROUND_UP_2 (self->offset_y); + src_box.right = GST_ROUND_UP_2 (self->offset_x + self->info.width); + src_box.bottom = GST_ROUND_UP_2 (self->offset_y + self->info.height); + src_box.front = 0; + src_box.back = 1; + + context->CopySubresourceRegion (dst_texture, dst_subresource, + 0, 0, 0, src_texture, src_subresource, &src_box); +} + static gboolean -copy_to_system (GstD3D11Decoder * self, GstBuffer * decoder_buffer, - GstBuffer * output) +gst_d3d11_decoder_crop_and_copy_buffer (GstD3D11Decoder * self, + GstBuffer * src, GstBuffer * dst) { - GstVideoFrame out_frame; - GstVideoInfo *info = &self->output_info; - guint i; - GstD3D11Memory *in_mem; - D3D11_MAPPED_SUBRESOURCE map; + GstD3D11Device *device = self->device; + ID3D11DeviceContext *context = + gst_d3d11_device_get_device_context_handle (device); + GstD3D11Memory *src_dmem; + GstMemory *dst_mem; + ID3D11Texture2D *src_texture; + guint src_subresource; + GstMapInfo map; + D3D11_MAPPED_SUBRESOURCE d3d11_map; HRESULT hr; - ID3D11Texture2D *in_texture; - guint in_subresource_index; - ID3D11DeviceContext *device_context = - gst_d3d11_device_get_device_context_handle (self->device); - - if (!gst_d3d11_decoder_ensure_staging_texture (self)) { - GST_ERROR_OBJECT (self, "Staging texture is not available"); - return FALSE; + GstVideoFrame frame; + + src_dmem = (GstD3D11Memory *) gst_buffer_peek_memory (src, 0); + src_texture = + (ID3D11Texture2D *) gst_d3d11_memory_get_resource_handle (src_dmem); + src_subresource = gst_d3d11_memory_get_subresource_index (src_dmem); + + dst_mem = gst_buffer_peek_memory (dst, 0); + if (gst_is_d3d11_memory (dst_mem)) { + GstD3D11Memory *dst_dmem = GST_D3D11_MEMORY_CAST (dst_mem); + if (dst_dmem->device == self->device && + gst_memory_map (dst_mem, &map, + (GstMapFlags) (GST_MAP_WRITE | GST_MAP_D3D11))) { + ID3D11Texture2D *dst_texture = (ID3D11Texture2D *) map.data; + guint dst_subresource = gst_d3d11_memory_get_subresource_index (dst_dmem); + + GST_TRACE_OBJECT (self, "Copying to output D3D11 texture"); + gst_d3d11_decoder_crop_and_copy_texture (self, src_texture, + src_subresource, dst_texture, dst_subresource); + gst_memory_unmap (dst_mem, &map); + + return TRUE; + } } - if (!gst_video_frame_map (&out_frame, info, output, GST_MAP_WRITE)) { - GST_ERROR_OBJECT (self, "Couldn't map output buffer"); + /* fallback copy, copy to our staging texture and copy to output */ + if (!gst_d3d11_decoder_ensure_staging_texture (self)) return FALSE; - } - - in_mem = (GstD3D11Memory *) gst_buffer_peek_memory (decoder_buffer, 0); - - in_texture = gst_d3d11_memory_get_texture_handle (in_mem); - in_subresource_index = gst_d3d11_memory_get_subresource_index (in_mem); - - gst_d3d11_device_lock (self->device); - device_context->CopySubresourceRegion (self->staging, 0, 0, 0, 0, - in_texture, in_subresource_index, NULL); - - hr = device_context->Map (self->staging, 0, D3D11_MAP_READ, 0, &map); - - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to map, hr: 0x%x", (guint) hr); - - gst_d3d11_device_unlock (self->device); - gst_video_frame_unmap (&out_frame); + GstD3D11DeviceLockGuard lk (device); + if (!gst_video_frame_map (&frame, &self->output_info, dst, GST_MAP_WRITE)) { + GST_ERROR_OBJECT (self, "Failed to map output buffer"); return FALSE; } - /* calculate stride and offset only once */ - if (self->stating_texture_stride0 == 0) { - D3D11_TEXTURE2D_DESC desc; - gsize dummy; + gst_d3d11_decoder_crop_and_copy_texture (self, src_texture, src_subresource, + self->staging, 0); - self->staging->GetDesc (&desc); - - gst_d3d11_dxgi_format_get_size (desc.Format, desc.Width, desc.Height, - map.RowPitch, self->staging_texture_offset, - self->stating_texture_stride, &dummy); + hr = context->Map (self->staging, 0, D3D11_MAP_READ, 0, &d3d11_map); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Failed to map staging texture"); + gst_video_frame_unmap (&frame); + return FALSE; } - for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (&out_frame); i++) { - guint8 *src, *dst; - gint j; - gint width; - - src = (guint8 *) map.pData + self->staging_texture_offseti; - dst = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&out_frame, i); - width = GST_VIDEO_FRAME_COMP_WIDTH (&out_frame, i) * - GST_VIDEO_FRAME_COMP_PSTRIDE (&out_frame, i); - - for (j = 0; j < GST_VIDEO_FRAME_COMP_HEIGHT (&out_frame, i); j++) { - memcpy (dst, src, width); - dst += GST_VIDEO_FRAME_PLANE_STRIDE (&out_frame, i); - src += self->stating_texture_stridei; + g_assert (GST_VIDEO_FRAME_N_PLANES (&frame) <= 2); + for (guint i = 0; i < GST_VIDEO_FRAME_N_PLANES (&frame); i++) { + guint8 *src_data = (guint8 *) d3d11_map.pData + + self->stating_plane_offseti * d3d11_map.RowPitch; + guint8 *dst_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, i); + guint width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&frame, i); + gint stride = GST_VIDEO_FRAME_PLANE_STRIDE (&frame, i); + gint height = GST_VIDEO_FRAME_COMP_HEIGHT (&frame, i); + + for (gint j = 0; j < height; j++) { + memcpy (dst_data, src_data, width_in_bytes); + dst_data += stride; + src_data += d3d11_map.RowPitch; } } - gst_video_frame_unmap (&out_frame); - device_context->Unmap (self->staging, 0); - gst_d3d11_device_unlock (self->device); - - return TRUE; -} - -static gboolean -copy_to_d3d11 (GstD3D11Decoder * self, GstBuffer * decoder_buffer, - GstBuffer * output) -{ - GstVideoInfo *info = &self->output_info; - GstD3D11Memory *in_mem; - GstD3D11Memory *out_mem; - GstMapInfo out_map; - D3D11_BOX src_box; - ID3D11Texture2D *in_texture; - guint in_subresource_index, out_subresource_index; - ID3D11DeviceContext *device_context = - gst_d3d11_device_get_device_context_handle (self->device); - - in_mem = (GstD3D11Memory *) gst_buffer_peek_memory (decoder_buffer, 0); - out_mem = (GstD3D11Memory *) gst_buffer_peek_memory (output, 0); - - if (!gst_memory_map (GST_MEMORY_CAST (out_mem), - &out_map, (GstMapFlags) (GST_MAP_WRITE | GST_MAP_D3D11))) { - GST_ERROR_OBJECT (self, "Couldn't map output d3d11 memory"); - return FALSE; - } - - gst_d3d11_device_lock (self->device); - in_texture = gst_d3d11_memory_get_texture_handle (in_mem); - in_subresource_index = gst_d3d11_memory_get_subresource_index (in_mem); - - src_box.left = 0; - src_box.top = 0; - src_box.front = 0; - src_box.back = 1; - - src_box.right = GST_ROUND_UP_2 (GST_VIDEO_INFO_WIDTH (info)); - src_box.bottom = GST_ROUND_UP_2 (GST_VIDEO_INFO_HEIGHT (info)); - - out_subresource_index = gst_d3d11_memory_get_subresource_index (out_mem); - device_context->CopySubresourceRegion ((ID3D11Resource *) out_map.data, - out_subresource_index, 0, 0, 0, in_texture, in_subresource_index, - &src_box); - - gst_d3d11_device_unlock (self->device); - gst_memory_unmap (GST_MEMORY_CAST (out_mem), &out_map); + context->Unmap (self->staging, 0); + gst_video_frame_unmap (&frame); return TRUE; } gboolean gst_d3d11_decoder_process_output (GstD3D11Decoder * decoder, - GstVideoDecoder * videodec, gint display_width, gint display_height, + GstVideoDecoder * videodec, GstVideoCodecState * input_state, + gint display_width, gint display_height, GstBuffer * decoder_buffer, GstBuffer ** output) { - gboolean can_device_copy = TRUE; - g_return_val_if_fail (GST_IS_D3D11_DECODER (decoder), FALSE); g_return_val_if_fail (GST_IS_VIDEO_DECODER (videodec), FALSE); g_return_val_if_fail (GST_IS_BUFFER (decoder_buffer), FALSE); g_return_val_if_fail (output != NULL, FALSE); + if (input_state) { + g_clear_pointer (&decoder->input_state, gst_video_codec_state_unref); + decoder->input_state = gst_video_codec_state_ref (input_state); + } + if (display_width != GST_VIDEO_INFO_WIDTH (&decoder->output_info) || display_height != GST_VIDEO_INFO_HEIGHT (&decoder->output_info)) { GST_INFO_OBJECT (videodec, "Frame size changed, do renegotiate"); @@ -1545,6 +1619,11 @@ GST_ERROR_OBJECT (videodec, "Failed to re-negotiate with new frame size"); return FALSE; } + } else if (input_state) { + if (!gst_video_decoder_negotiate (videodec)) { + GST_ERROR_OBJECT (videodec, "Could not re-negotiate with updated state"); + return FALSE; + } } if (gst_d3d11_decoder_can_direct_render (decoder, videodec, decoder_buffer, @@ -1554,6 +1633,22 @@ mem = gst_buffer_peek_memory (decoder_buffer, 0); GST_MINI_OBJECT_FLAG_SET (mem, GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD); + if (decoder->need_crop) { + GstVideoCropMeta *crop_meta; + + decoder_buffer = gst_buffer_make_writable (decoder_buffer); + crop_meta = gst_buffer_get_video_crop_meta (decoder_buffer); + if (!crop_meta) + crop_meta = gst_buffer_add_video_crop_meta (decoder_buffer); + + crop_meta->x = decoder->offset_x; + crop_meta->y = decoder->offset_y; + crop_meta->width = decoder->info.width; + crop_meta->height = decoder->info.height; + + GST_TRACE_OBJECT (decoder, "Attatching crop meta"); + } + *output = gst_buffer_ref (decoder_buffer); return TRUE; @@ -1562,34 +1657,11 @@ *output = gst_video_decoder_allocate_output_buffer (videodec); if (*output == NULL) { GST_ERROR_OBJECT (videodec, "Couldn't allocate output buffer"); - return FALSE; } - /* decoder buffer must have single memory */ - if (gst_buffer_n_memory (decoder_buffer) == gst_buffer_n_memory (*output)) { - GstMemory *mem; - GstD3D11Memory *dmem; - - mem = gst_buffer_peek_memory (*output, 0); - if (!gst_is_d3d11_memory (mem)) { - can_device_copy = FALSE; - goto do_process; - } - - dmem = (GstD3D11Memory *) mem; - if (dmem->device != decoder->device) - can_device_copy = FALSE; - } else { - can_device_copy = FALSE; - } - -do_process: - if (can_device_copy) { - return copy_to_d3d11 (decoder, decoder_buffer, *output); - } - - return copy_to_system (decoder, decoder_buffer, *output); + return gst_d3d11_decoder_crop_and_copy_buffer (decoder, decoder_buffer, + *output); } gboolean @@ -1756,6 +1828,15 @@ } use_d3d11_pool = decoder->downstream_supports_d3d11; + if (use_d3d11_pool) { + decoder->use_crop_meta = + gst_query_find_allocation_meta (query, GST_VIDEO_CROP_META_API_TYPE, + nullptr); + } else { + decoder->use_crop_meta = FALSE; + } + + GST_DEBUG_OBJECT (videodec, "Use crop meta %d", decoder->use_crop_meta); gst_video_info_from_caps (&vinfo, outcaps); n = gst_query_get_n_allocation_pools (query); @@ -1799,7 +1880,7 @@ d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); if (!d3d11_params) d3d11_params = gst_d3d11_allocation_params_new (decoder->device, &vinfo, - (GstD3D11AllocationFlags) 0, 0); + GST_D3D11_ALLOCATION_FLAG_DEFAULT, 0, 0); width = GST_VIDEO_INFO_WIDTH (&vinfo); height = GST_VIDEO_INFO_HEIGHT (&vinfo); @@ -1861,14 +1942,11 @@ } gst_buffer_pool_set_config (pool, config); - if (use_d3d11_pool) { - /* d3d11 buffer pool will update buffer size based on allocated texture, - * get size from config again */ - config = gst_buffer_pool_get_config (pool); - gst_buffer_pool_config_get_params (config, - nullptr, &size, nullptr, nullptr); - gst_structure_free (config); - } + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); if (n > 0) gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); @@ -1885,16 +1963,16 @@ { g_return_val_if_fail (GST_IS_D3D11_DECODER (decoder), FALSE); - g_mutex_lock (&decoder->internal_pool_lock); + GstD3D11SRWLockGuard lk (&decoder->lock); if (decoder->internal_pool) gst_buffer_pool_set_flushing (decoder->internal_pool, flushing); - g_mutex_unlock (&decoder->internal_pool_lock); + decoder->flushing = flushing; return TRUE; } static gboolean -gst_d3d11_decoder_can_direct_render (GstD3D11Decoder * decoder, +gst_d3d11_decoder_can_direct_render (GstD3D11Decoder * self, GstVideoDecoder * videodec, GstBuffer * view_buffer, gint display_width, gint display_height) { @@ -1906,22 +1984,26 @@ if (videodec->input_segment.rate < 0) return FALSE; - if (!decoder->can_direct_rendering || !decoder->downstream_supports_d3d11) + if (!self->can_direct_rendering || !self->downstream_supports_d3d11) return FALSE; /* different size, need copy */ /* TODO: crop meta */ - if (display_width != GST_VIDEO_INFO_WIDTH (&decoder->info) || - display_height != GST_VIDEO_INFO_HEIGHT (&decoder->info)) + if (display_width != GST_VIDEO_INFO_WIDTH (&self->info) || + display_height != GST_VIDEO_INFO_HEIGHT (&self->info)) + return FALSE; + + /* We need to crop but downstream does not support crop, need to copy */ + if (self->need_crop && !self->use_crop_meta) return FALSE; /* we can do direct render in this case, since there is no DPB pool size * limit */ - if (decoder->use_array_of_texture) + if (self->use_array_of_texture) return TRUE; /* Let's believe downstream info */ - if (decoder->wait_on_pool_full) + if (self->wait_on_pool_full) return TRUE; /* Check if we are about to full */ @@ -1929,25 +2011,25 @@ /* something went wrong */ if (!gst_is_d3d11_memory (mem)) { - GST_ERROR_OBJECT (decoder, "Not a D3D11 memory"); + GST_ERROR_OBJECT (self, "Not a D3D11 memory"); return FALSE; } alloc = GST_D3D11_POOL_ALLOCATOR (mem->allocator); if (!gst_d3d11_pool_allocator_get_pool_size (alloc, &max_size, &outstanding_size)) { - GST_ERROR_OBJECT (decoder, "Couldn't query pool size"); + GST_ERROR_OBJECT (self, "Couldn't query pool size"); return FALSE; } /* 2 buffer margin */ if (max_size <= outstanding_size + 1) { - GST_DEBUG_OBJECT (decoder, "memory pool is about to full (%u/%u)", + GST_DEBUG_OBJECT (self, "memory pool is about to full (%u/%u)", outstanding_size, max_size); return FALSE; } - GST_LOG_OBJECT (decoder, "Can do direct rendering"); + GST_LOG_OBJECT (self, "Can do direct rendering"); return TRUE; } @@ -2124,6 +2206,7 @@ * @device: (transfer none): a #GstD3D11Device * @sink_caps: (transfer full): a #GstCaps * @src_caps: (transfer full): a #GstCaps + * @max_resolution: maximum supported resolution * * Create new #GstD3D11DecoderClassData * @@ -2131,16 +2214,51 @@ */ GstD3D11DecoderClassData * gst_d3d11_decoder_class_data_new (GstD3D11Device * device, GstDXVACodec codec, - GstCaps * sink_caps, GstCaps * src_caps) + GstCaps * sink_caps, GstCaps * src_caps, guint max_resolution) { GstD3D11DecoderClassData *ret; + guint min_width = 1; + guint min_height = 1; g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL); g_return_val_if_fail (sink_caps != NULL, NULL); g_return_val_if_fail (src_caps != NULL, NULL); + /* FIXME: D3D11/DXVA does not have an API for querying minimum resolution + * capability. Might need to find a nice way for testing minimum resolution. + * + * Below hardcoded values were checked on RTX 2080/3060 GPUs via NVDEC API + * (VP8 decoding is not supported by those GPUs via D3D11/DXVA) */ + if (gst_d3d11_get_device_vendor (device) == GST_D3D11_DEVICE_VENDOR_NVIDIA) { + switch (codec) { + case GST_DXVA_CODEC_MPEG2: + case GST_DXVA_CODEC_H264: + case GST_DXVA_CODEC_VP8: + min_width = 48; + min_height = 16; + break; + case GST_DXVA_CODEC_H265: + min_width = min_height = 144; + break; + case GST_DXVA_CODEC_VP9: + case GST_DXVA_CODEC_AV1: + min_width = min_height = 128; + break; + default: + g_assert_not_reached (); + return nullptr; + } + } + ret = g_new0 (GstD3D11DecoderClassData, 1); + gst_caps_set_simple (sink_caps, + "width", GST_TYPE_INT_RANGE, min_width, max_resolution, + "height", GST_TYPE_INT_RANGE, min_height, max_resolution, nullptr); + gst_caps_set_simple (src_caps, + "width", GST_TYPE_INT_RANGE, min_width, max_resolution, + "height", GST_TYPE_INT_RANGE, min_height, max_resolution, nullptr); + /* class data will be leaked if the element never gets instantiated */ GST_MINI_OBJECT_FLAG_SET (sink_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); GST_MINI_OBJECT_FLAG_SET (src_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); @@ -2178,6 +2296,81 @@ g_free (data); } +typedef struct _GstD3D11DecoderDocCaps +{ + GstDXVACodec codec; + const gchar *sink_caps; + const gchar *src_caps; +} GstD3D11DecoderDocCaps; + +/* *INDENT-OFF* */ +static const GstD3D11DecoderDocCaps doc_caps_list = { + { + GST_DXVA_CODEC_MPEG2, + "video/mpeg, width = (int) 1, 1920 , height = (int) 1, 1920 , " + "mpegversion = (int) 2, systemstream = (boolean) false, " + "profile = (string) { main, simple }", + + "video/x-raw(memory:D3D11Memory), format = (string) NV12, " + "width = (int) 1, 1920 , height = (int) 1, 1920 ; " + "video/x-raw, format = (string) NV12, " + "width = (int) 1, 1920 , height = (int) 1, 1920 "}, + { + GST_DXVA_CODEC_H264, + "video/x-h264, width = (int) 1, 4096 , height = (int) 1, 4096 , " + "stream-format = (string) { avc, avc3, byte-stream }, " + "alignment = (string) au, " + "profile = (string) { high, progressive-high, constrained-high, main, " + "constrained-baseline, baseline }", + + "video/x-raw(memory:D3D11Memory), format = (string) NV12, " + "width = (int) 1, 4096 , height = (int) 1, 4096 ; " + "video/x-raw, format = (string) NV12, " + "width = (int) 1, 4096 , height = (int) 1, 4096 " + }, + { + GST_DXVA_CODEC_H265, + "video/x-h265, width = (int) 1, 16384 , height = (int) 1, 16384 , " + "stream-format = (string) { hev1, hvc1, byte-stream }, " + "alignment = (string) au, profile = (string) { main, main-10 }", + + "video/x-raw(memory:D3D11Memory), format = (string) { NV12, P010_10LE }, " + "width = (int) 1, 16384 , height = (int) 1, 16384 ; " + "video/x-raw, format = (string) { NV12, P010_10LE }, " + "width = (int) 1, 16384 , height = (int) 1, 16384 " + }, + { + GST_DXVA_CODEC_VP8, + "video/x-vp8, width = (int) 1, 4096 , height = (int) 1, 4096 ", + + "video/x-raw(memory:D3D11Memory), format = (string) NV12, " + "width = (int) 1, 4096 , height = (int) 1, 4096 ; " + "video/x-raw, format = (string) NV12, " + "width = (int) 1, 4096 , height = (int) 1, 4096 " + }, + { + GST_DXVA_CODEC_VP9, + "video/x-vp9, width = (int) 1, 16384 , height = (int) 1, 16384 , " + "alignment = (string) frame, profile = (string) { 0, 2 }", + + "video/x-raw(memory:D3D11Memory), format = (string) { NV12, P010_10LE }, " + "width = (int) 1, 16384 , height = (int) 1, 16384 ; " + "video/x-raw, format = (string) { NV12, P010_10LE }, " + "width = (int) 1, 16384 , height = (int) 1, 16384 " + }, + { + GST_DXVA_CODEC_AV1, + "video/x-av1, width = (int) 1, 16384 , height = (int) 1, 16384 , " + "alignment = (string) frame, profile = (string) main", + + "video/x-raw(memory:D3D11Memory), format = (string) { NV12, P010_10LE }, " + "width = (int) 1, 16384 , height = (int) 1, 16384 ; " + "video/x-raw, format = (string) { NV12, P010_10LE }, " + "width = (int) 1, 16384 , height = (int) 1, 16384 " + }, +}; +/* *INDENT-ON* */ + void gst_d3d11_decoder_proxy_class_init (GstElementClass * klass, GstD3D11DecoderClassData * data, const gchar * author) @@ -2187,22 +2380,24 @@ std::string long_name; std::string description; const gchar *codec_name; + GParamFlags param_flags = (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + GstPadTemplate *pad_templ; + GstCaps *doc_caps; + const GstD3D11DecoderDocCaps *d3d11_doc_caps = nullptr; g_object_class_install_property (gobject_class, PROP_DECODER_ADAPTER_LUID, g_param_spec_int64 ("adapter-luid", "Adapter LUID", "DXGI Adapter LUID (Locally Unique Identifier) of created device", - G_MININT64, G_MAXINT64, cdata->adapter_luid, - (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + G_MININT64, G_MAXINT64, 0, param_flags)); g_object_class_install_property (gobject_class, PROP_DECODER_DEVICE_ID, g_param_spec_uint ("device-id", "Device Id", - "DXGI Device ID", 0, G_MAXUINT32, 0, - (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + "DXGI Device ID", 0, G_MAXUINT32, 0, param_flags)); g_object_class_install_property (gobject_class, PROP_DECODER_VENDOR_ID, g_param_spec_uint ("vendor-id", "Vendor Id", - "DXGI Vendor ID", 0, G_MAXUINT32, 0, - (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + "DXGI Vendor ID", 0, G_MAXUINT32, 0, param_flags)); codec_name = gst_dxva_codec_to_string (cdata->codec); long_name = "Direct3D11/DXVA " + std::string (codec_name) + " " + @@ -2213,12 +2408,28 @@ gst_element_class_set_metadata (klass, long_name.c_str (), "Codec/Decoder/Video/Hardware", description.c_str (), author); - gst_element_class_add_pad_template (klass, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - data->sink_caps)); - gst_element_class_add_pad_template (klass, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - data->src_caps)); + for (guint i = 0; i < G_N_ELEMENTS (doc_caps_list); i++) { + if (doc_caps_listi.codec == cdata->codec) { + d3d11_doc_caps = &doc_caps_listi; + break; + } + } + + g_assert (d3d11_doc_caps); + + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, data->sink_caps); + doc_caps = gst_caps_from_string (d3d11_doc_caps->sink_caps); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (klass, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, data->src_caps); + doc_caps = gst_caps_from_string (d3d11_doc_caps->src_caps); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (klass, pad_templ); gst_d3d11_decoder_class_data_free (data); }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11decoder.h -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11decoder.h
Changed
@@ -76,12 +76,14 @@ gboolean gst_d3d11_decoder_configure (GstD3D11Decoder * decoder, GstVideoCodecState * input_state, - GstVideoInfo * info, + const GstVideoInfo * out_info, + gint offset_x, + gint offset_y, gint coded_width, gint coded_height, guint dpb_size); -gboolean gst_d3d11_decoder_decode_frame (GstD3D11Decoder * decoder, +GstFlowReturn gst_d3d11_decoder_decode_frame (GstD3D11Decoder * decoder, ID3D11VideoDecoderOutputView * output_view, GstD3D11DecodeInputStreamArgs * input_args); @@ -95,6 +97,7 @@ gboolean gst_d3d11_decoder_process_output (GstD3D11Decoder * decoder, GstVideoDecoder * videodec, + GstVideoCodecState * in_state, gint display_width, gint display_height, GstBuffer * decoder_buffer, @@ -143,7 +146,8 @@ GstD3D11DecoderClassData * gst_d3d11_decoder_class_data_new (GstD3D11Device * device, GstDXVACodec codec, GstCaps * sink_caps, - GstCaps * src_caps); + GstCaps * src_caps, + guint max_resolution); void gst_d3d11_decoder_class_data_fill_subclass_data (GstD3D11DecoderClassData * data, GstD3D11DecoderSubClassData * subclass_data);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11deinterlace.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11deinterlace.cpp
Changed
@@ -80,22 +80,6 @@ * D3D11_VIDEO_PROCESSOR_STREAM::ppFutureSurfaces */ -/* g_queue_clear_full is available since 2.60 */ -#if !GLIB_CHECK_VERSION(2,60,0) -#define g_queue_clear_full gst_d3d11_deinterlace_g_queue_clear_full -static void -gst_d3d11_deinterlace_g_queue_clear_full (GQueue * queue, - GDestroyNotify free_func) -{ - g_return_if_fail (queue != NULL); - - if (free_func != NULL) - g_queue_foreach (queue, (GFunc) free_func, NULL); - - g_queue_clear (queue); -} -#endif - typedef enum { GST_D3D11_DEINTERLACE_METHOD_BLEND = @@ -110,6 +94,14 @@ /* TODO: INVERSE_TELECINE */ } GstD3D11DeinterlaceMethod; +DEFINE_ENUM_FLAG_OPERATORS (GstD3D11DeinterlaceMethod); + +#define DEINTERLACE_METHOD_ALL \ + ((GstD3D11DeinterlaceMethod) (GST_D3D11_DEINTERLACE_METHOD_BLEND | \ + GST_D3D11_DEINTERLACE_METHOD_BOB | \ + GST_D3D11_DEINTERLACE_METHOD_ADAPTVIE | \ + GST_D3D11_DEINTERLACE_METHOD_MOTION_COMPENSATION)) + /** * GstD3D11DeinterlaceMethod: * @@ -122,9 +114,9 @@ static GType gst_d3d11_deinterlace_method_type (void) { - static gsize method_type = 0; + static GType method_type = 0; - if (g_once_init_enter (&method_type)) { + GST_D3D11_CALL_ONCE_BEGIN { static const GFlagsValue method_types = { {GST_D3D11_DEINTERLACE_METHOD_BLEND, "Blend: Blending top/bottom field pictures into one frame. " @@ -139,14 +131,14 @@ {GST_D3D11_DEINTERLACE_METHOD_MOTION_COMPENSATION, "Motion Compensation: Recreating missing lines by using motion vector. " "Framerate will be doubled (e,g, 60i -> 60p)", "mocomp"}, - {0, NULL, NULL}, + {0, nullptr, nullptr}, }; - GType tmp = g_flags_register_static ("GstD3D11DeinterlaceMethod", + + method_type = g_flags_register_static ("GstD3D11DeinterlaceMethod", method_types); - g_once_init_leave (&method_type, tmp); - } + } GST_D3D11_CALL_ONCE_END; - return (GType) method_type; + return method_type; } typedef struct @@ -220,6 +212,13 @@ /* hardcoded maximum queue size for each past/future frame queue */ #define MAX_NUM_REFERENCES 2 +#define DOC_CAPS \ + "video/x-raw(memory:D3D11Memory), format = (string) { NV12, P010_10LE}, " \ + "width = (int) 1, 16384 , height = (int) 1, 16384 ; " \ + "video/x-raw(memory:D3D11Memory, meta:GstVideoOverlayComposition), " \ + "format = (string) { NV12, P010_10LE}, " \ + "width = (int) 1, 16384 , height = (int) 1, 16384 " + typedef struct _GstD3D11Deinterlace { GstBaseTransform parent; @@ -238,7 +237,7 @@ GstD3D11DeinterlaceMethod method; - GRecMutex lock; + CRITICAL_SECTION lock; GQueue past_frame_queue; GQueue future_frame_queue; GstBuffer *to_process; @@ -275,10 +274,6 @@ #define GST_D3D11_DEINTERLACE_GET_CLASS(object) \ (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object), \ GstD3D11DeinterlaceClass)) -#define GST_D3D11_DEINTERLACE_LOCK(self) \ - g_rec_mutex_lock (&GST_D3D11_DEINTERLACE (self)->lock); -#define GST_D3D11_DEINTERLACE_UNLOCK(self) \ - g_rec_mutex_unlock (&GST_D3D11_DEINTERLACE (self)->lock); static gboolean gst_d3d11_deinterlace_update_method (GstD3D11Deinterlace * self); @@ -336,6 +331,8 @@ GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); GstD3D11DeinterlaceClassData *cdata = (GstD3D11DeinterlaceClassData *) data; gchar *long_name; + GstPadTemplate *pad_templ; + GstCaps *doc_caps; parent_class = (GstElementClass *) g_type_class_peek_parent (klass); @@ -346,31 +343,35 @@ g_object_class_install_property (gobject_class, PROP_ADAPTER, g_param_spec_uint ("adapter", "Adapter", "DXGI Adapter index for creating device", - 0, G_MAXUINT32, cdata->adapter, - (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + 0, G_MAXUINT32, 0, + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_DEVICE_ID, g_param_spec_uint ("device-id", "Device Id", "DXGI Device ID", 0, G_MAXUINT32, 0, - (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_VENDOR_ID, g_param_spec_uint ("vendor-id", "Vendor Id", "DXGI Vendor ID", 0, G_MAXUINT32, 0, - (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_METHOD, g_param_spec_flags ("method", "Method", "Deinterlace Method. Use can set multiple methods as a flagset " "and element will select one of method automatically. " "If deinterlacing device failed to deinterlace with given mode, " "fallback might happen by the device", - GST_TYPE_D3D11_DEINTERLACE_METHOD, cdata->device_caps.default_method, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_TYPE_D3D11_DEINTERLACE_METHOD, DEINTERLACE_METHOD_ALL, + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY))); g_object_class_install_property (gobject_class, PROP_SUPPORTED_METHODS, g_param_spec_flags ("supported-methods", "Supported Methods", "Set of supported deinterlace methods by device", - GST_TYPE_D3D11_DEINTERLACE_METHOD, - cdata->device_caps.supported_methods, - (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + GST_TYPE_D3D11_DEINTERLACE_METHOD, DEINTERLACE_METHOD_ALL, + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); element_class->set_context = GST_DEBUG_FUNCPTR (gst_d3d11_deinterlace_set_context); @@ -383,12 +384,17 @@ "Seungha Yang <seungha@centricular.com>"); g_free (long_name); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); + doc_caps = gst_caps_from_string (DOC_CAPS); + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + gst_caps_unref (doc_caps); trans_class->passthrough_on_same_caps = TRUE; @@ -436,7 +442,7 @@ g_queue_init (&self->past_frame_queue); g_queue_init (&self->future_frame_queue); - g_rec_mutex_init (&self->lock); + InitializeCriticalSection (&self->lock); } static void @@ -583,7 +589,7 @@ { GstD3D11Deinterlace *self = GST_D3D11_DEINTERLACE (object); - g_rec_mutex_clear (&self->lock); + DeleteCriticalSection (&self->lock); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -646,7 +652,8 @@ static void gst_d3d11_deinterlace_reset (GstD3D11Deinterlace * self) { - GST_D3D11_DEINTERLACE_LOCK (self); + GstD3D11CSLockGuard lk (&self->lock); + if (self->fallback_in_pool) { gst_buffer_pool_set_active (self->fallback_in_pool, FALSE); gst_object_unref (self->fallback_in_pool); @@ -664,8 +671,6 @@ gst_d3d11_deinterlace_reset_history (self); self->default_buffer_duration = GST_CLOCK_TIME_NONE; - - GST_D3D11_DEINTERLACE_UNLOCK (self); } static void @@ -907,7 +912,7 @@ d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); if (!d3d11_params) { d3d11_params = gst_d3d11_allocation_params_new (self->device, &info, - (GstD3D11AllocationFlags) 0, D3D11_BIND_RENDER_TARGET); + GST_D3D11_ALLOCATION_FLAG_DEFAULT, D3D11_BIND_RENDER_TARGET, 0); } else { d3d11_params->desc0.BindFlags |= D3D11_BIND_RENDER_TARGET; } @@ -1012,7 +1017,7 @@ d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); if (!d3d11_params) { d3d11_params = gst_d3d11_allocation_params_new (self->device, &info, - (GstD3D11AllocationFlags) 0, D3D11_BIND_RENDER_TARGET); + GST_D3D11_ALLOCATION_FLAG_DEFAULT, D3D11_BIND_RENDER_TARGET, 0); } else { d3d11_params->desc0.BindFlags |= D3D11_BIND_RENDER_TARGET; } @@ -1068,7 +1073,7 @@ /* Empty bind flag is allowed for video processor input */ d3d11_params = gst_d3d11_allocation_params_new (self->device, in_info, - (GstD3D11AllocationFlags) 0, 0); + GST_D3D11_ALLOCATION_FLAG_DEFAULT, 0, 0); self->fallback_in_pool = gst_d3d11_buffer_pool_new_with_options (self->device, in_caps, d3d11_params, 0, 0); gst_d3d11_allocation_params_free (d3d11_params); @@ -1080,7 +1085,7 @@ /* For processor output, render target bind flag is required */ d3d11_params = gst_d3d11_allocation_params_new (self->device, out_info, - (GstD3D11AllocationFlags) 0, D3D11_BIND_RENDER_TARGET); + GST_D3D11_ALLOCATION_FLAG_DEFAULT, D3D11_BIND_RENDER_TARGET, 0); self->fallback_out_pool = gst_d3d11_buffer_pool_new_with_options (self->device, out_caps, d3d11_params, 0, 0); @@ -1226,7 +1231,7 @@ if (self->method == GST_D3D11_DEINTERLACE_METHOD_BLEND) output_rate = D3D11_VIDEO_PROCESSOR_OUTPUT_RATE_HALF; - gst_d3d11_device_lock (self->device); + GstD3D11DeviceLockGuard lk (self->device); self->video_context->VideoProcessorSetStreamSourceRect (self->video_proc, 0, TRUE, &rect); self->video_context->VideoProcessorSetStreamDestRect (self->video_proc, @@ -1237,7 +1242,6 @@ VideoProcessorSetStreamAutoProcessingMode (self->video_proc, 0, FALSE); self->video_context->VideoProcessorSetStreamOutputRate (self->video_proc, 0, output_rate, TRUE, NULL); - gst_d3d11_device_unlock (self->device); return TRUE; } @@ -1322,7 +1326,7 @@ return NULL; } - /* copy metadata, default implemenation of baseclass will copy everything + /* copy metadata, default implementation of baseclass will copy everything * what we need */ GST_BASE_TRANSFORM_CLASS (parent_class)->copy_metadata (GST_BASE_TRANSFORM_CAST (self), input, new_buf); @@ -1521,7 +1525,7 @@ return NULL; } - /* copy metadata, default implemenation of baseclass will copy everything + /* copy metadata, default implementation of baseclass will copy everything * what we need */ GST_BASE_TRANSFORM_CLASS (parent_class)->copy_metadata (GST_BASE_TRANSFORM_CAST (self), output, new_buf); @@ -1771,13 +1775,12 @@ proc_stream.ppPastSurfaces = past_surfaces; } - gst_d3d11_device_lock (self->device); + GstD3D11DeviceLockGuard lk (self->device); self->video_context->VideoProcessorSetStreamFrameFormat (self->video_proc, 0, frame_foramt); hr = self->video_context->VideoProcessorBlt (self->video_proc, pov, 0, 1, &proc_stream); - gst_d3d11_device_unlock (self->device); if (!gst_d3d11_result (hr, self->device)) { GST_ERROR_OBJECT (self, "Failed to perform deinterlacing"); @@ -1827,9 +1830,9 @@ gst_d3d11_deinterlace_drain (self); break; case GST_EVENT_FLUSH_STOP: - GST_D3D11_DEINTERLACE_LOCK (self); + EnterCriticalSection (&self->lock); gst_d3d11_deinterlace_reset_history (self); - GST_D3D11_DEINTERLACE_UNLOCK (self); + LeaveCriticalSection (&self->lock); break; default: break; @@ -1908,7 +1911,8 @@ GstFlowReturn ret = GST_FLOW_OK; GstBuffer *outbuf = NULL; - GST_D3D11_DEINTERLACE_LOCK (self); + EnterCriticalSection (&self->lock); + if (gst_base_transform_is_passthrough (trans)) { /* If we were passthrough, nothing to do */ goto done; @@ -1928,16 +1932,16 @@ ret = gst_d3d11_deinterlace_generate_output (trans, &outbuf); if (outbuf != NULL) { /* Release lock during push buffer */ - GST_D3D11_DEINTERLACE_UNLOCK (self); + LeaveCriticalSection (&self->lock); ret = gst_pad_push (trans->srcpad, outbuf); - GST_D3D11_DEINTERLACE_LOCK (self); + EnterCriticalSection (&self->lock); } } while (ret == GST_FLOW_OK && outbuf != NULL); } done: gst_d3d11_deinterlace_reset_history (self); - GST_D3D11_DEINTERLACE_UNLOCK (self); + LeaveCriticalSection (&self->lock); return ret; } @@ -2004,14 +2008,14 @@ #define GST_D3D11_DEINTERLACE_BIN_CAPS_MAKE(format) \ "video/x-raw, " \ "format = (string) " format ", " \ - "width = (int) 1, 8192, " \ - "height = (int) 1, 8192 " + "width = (int) 1, 16384, " \ + "height = (int) 1, 16384 " #define GST_D3D11_DEINTERLACE_BIN_CAPS_MAKE_WITH_FEATURES(features,format) \ "video/x-raw(" features "), " \ "format = (string) " format ", " \ - "width = (int) 1, 8192, " \ - "height = (int) 1, 8192 " + "width = (int) 1, 16384, " \ + "height = (int) 1, 16384 " static GstStaticPadTemplate bin_sink_template_caps = GST_STATIC_PAD_TEMPLATE ("sink", @@ -2075,31 +2079,35 @@ g_object_class_install_property (gobject_class, PROP_BIN_ADAPTER, g_param_spec_uint ("adapter", "Adapter", "DXGI Adapter index for creating device", - 0, G_MAXUINT32, cdata->adapter, - (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + 0, G_MAXUINT32, 0, + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_BIN_DEVICE_ID, g_param_spec_uint ("device-id", "Device Id", "DXGI Device ID", 0, G_MAXUINT32, 0, - (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_BIN_VENDOR_ID, g_param_spec_uint ("vendor-id", "Vendor Id", "DXGI Vendor ID", 0, G_MAXUINT32, 0, - (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_BIN_METHOD, g_param_spec_flags ("method", "Method", "Deinterlace Method. Use can set multiple methods as a flagset " "and element will select one of method automatically. " "If deinterlacing device failed to deinterlace with given mode, " "fallback might happen by the device", - GST_TYPE_D3D11_DEINTERLACE_METHOD, cdata->device_caps.default_method, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_TYPE_D3D11_DEINTERLACE_METHOD, DEINTERLACE_METHOD_ALL, + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY))); g_object_class_install_property (gobject_class, PROP_BIN_SUPPORTED_METHODS, g_param_spec_flags ("supported-methods", "Supported Methods", "Set of supported deinterlace methods by device", - GST_TYPE_D3D11_DEINTERLACE_METHOD, - cdata->device_caps.supported_methods, - (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + GST_TYPE_D3D11_DEINTERLACE_METHOD, DEINTERLACE_METHOD_ALL, + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); long_name = g_strdup_printf ("Direct3D11 %s Deinterlacer Bin", cdata->description); @@ -2393,8 +2401,8 @@ /* FIXME: Check supported resolution, it would be different from * supported max texture dimension */ gst_caps_set_simple (caps, - "width", GST_TYPE_INT_RANGE, 1, 8192, - "height", GST_TYPE_INT_RANGE, 1, 8192, NULL); + "width", GST_TYPE_INT_RANGE, 1, 16384, + "height", GST_TYPE_INT_RANGE, 1, 16384, NULL); gst_caps_set_value (caps, "format", supported_formats); g_value_unset (supported_formats); g_free (supported_formats);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11download.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11download.cpp
Changed
@@ -77,18 +77,12 @@ struct _GstD3D11Download { GstD3D11BaseFilter parent; - - GstBuffer *staging_buffer; }; #define gst_d3d11_download_parent_class parent_class G_DEFINE_TYPE (GstD3D11Download, gst_d3d11_download, GST_TYPE_D3D11_BASE_FILTER); -static void gst_d3d11_download_dispose (GObject * object); -static gboolean gst_d3d11_download_stop (GstBaseTransform * trans); -static gboolean gst_d3d11_download_sink_event (GstBaseTransform * trans, - GstEvent * event); static GstCaps *gst_d3d11_download_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter); static gboolean gst_d3d11_download_propose_allocation (GstBaseTransform * trans, @@ -97,21 +91,14 @@ GstQuery * query); static GstFlowReturn gst_d3d11_download_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf); -static gboolean gst_d3d11_download_set_info (GstD3D11BaseFilter * filter, - GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, - GstVideoInfo * out_info); static void gst_d3d11_download_class_init (GstD3D11DownloadClass * klass) { - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); - GstD3D11BaseFilterClass *bfilter_class = GST_D3D11_BASE_FILTER_CLASS (klass); GstCaps *caps; - gobject_class->dispose = gst_d3d11_download_dispose; - caps = gst_d3d11_get_updated_template_caps (&sink_template_caps); gst_element_class_add_pad_template (element_class, gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps)); @@ -129,8 +116,6 @@ trans_class->passthrough_on_same_caps = TRUE; - trans_class->stop = GST_DEBUG_FUNCPTR (gst_d3d11_download_stop); - trans_class->sink_event = GST_DEBUG_FUNCPTR (gst_d3d11_download_sink_event); trans_class->transform_caps = GST_DEBUG_FUNCPTR (gst_d3d11_download_transform_caps); trans_class->propose_allocation = @@ -139,8 +124,6 @@ GST_DEBUG_FUNCPTR (gst_d3d11_download_decide_allocation); trans_class->transform = GST_DEBUG_FUNCPTR (gst_d3d11_download_transform); - bfilter_class->set_info = GST_DEBUG_FUNCPTR (gst_d3d11_download_set_info); - GST_DEBUG_CATEGORY_INIT (gst_d3d11_download_debug, "d3d11download", 0, "d3d11download Element"); } @@ -150,43 +133,6 @@ { } -static void -gst_d3d11_download_dispose (GObject * object) -{ - GstD3D11Download *self = GST_D3D11_DOWNLOAD (object); - - gst_clear_buffer (&self->staging_buffer); - - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -static gboolean -gst_d3d11_download_stop (GstBaseTransform * trans) -{ - GstD3D11Download *self = GST_D3D11_DOWNLOAD (trans); - - gst_clear_buffer (&self->staging_buffer); - - return GST_BASE_TRANSFORM_CLASS (parent_class)->stop (trans); -} - -static gboolean -gst_d3d11_download_sink_event (GstBaseTransform * trans, GstEvent * event) -{ - GstD3D11Download *self = GST_D3D11_DOWNLOAD (trans); - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - /* We don't need to hold this staging buffer after eos */ - gst_clear_buffer (&self->staging_buffer); - break; - default: - break; - } - - return GST_BASE_TRANSFORM_CLASS (parent_class)->sink_event (trans, event); -} - static GstCaps * _set_caps_features (const GstCaps * caps, const gchar * feature_name) { @@ -243,6 +189,7 @@ GstBufferPool *pool; GstCaps *caps; guint size; + gboolean is_d3d11 = FALSE; if (!GST_BASE_TRANSFORM_CLASS (parent_class)->propose_allocation (trans, decide_query, query)) @@ -263,7 +210,6 @@ if (gst_query_get_n_allocation_pools (query) == 0) { GstCapsFeatures *features; GstStructure *config; - gboolean is_d3d11 = FALSE; features = gst_caps_get_features (caps, 0); @@ -280,8 +226,6 @@ gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); - - /* d3d11 pool does not support video alignment */ if (!is_d3d11) { gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); @@ -293,22 +237,21 @@ if (!gst_buffer_pool_set_config (pool, config)) goto config_failed; - gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); - - if (is_d3d11) { - /* d3d11 buffer pool will update buffer size based on allocated texture, - * get size from config again */ - config = gst_buffer_pool_get_config (pool); - gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, - nullptr); - gst_structure_free (config); - } + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, + nullptr, &size, nullptr, nullptr); + gst_structure_free (config); gst_query_add_allocation_pool (query, pool, size, 0, 0); - gst_object_unref (pool); } + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + gst_query_add_allocation_meta (query, + GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL); + return TRUE; /* ERRORS */ @@ -330,32 +273,39 @@ gboolean update_pool; GstCaps *outcaps = NULL; + gst_query_parse_allocation (query, &outcaps, NULL); + + if (!outcaps) + return FALSE; + if (gst_query_get_n_allocation_pools (query) > 0) { gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); - if (!pool) - gst_query_parse_allocation (query, &outcaps, NULL); - update_pool = TRUE; } else { GstVideoInfo vinfo; - gst_query_parse_allocation (query, &outcaps, NULL); gst_video_info_from_caps (&vinfo, outcaps); size = vinfo.size; min = max = 0; update_pool = FALSE; } - if (!pool) + if (!pool) { pool = gst_video_buffer_pool_new (); + } config = gst_buffer_pool_get_config (pool); gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); - if (outcaps) - gst_buffer_pool_config_set_params (config, outcaps, size, 0, 0); + gst_buffer_pool_config_set_params (config, outcaps, size, min, max); gst_buffer_pool_set_config (pool, config); + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); + if (update_pool) gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); else @@ -367,99 +317,16 @@ query); } -static gboolean -gst_d3d11_download_can_use_staging_buffer (GstD3D11Download * self, - GstBuffer * inbuf) -{ - GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (self); - ID3D11Device *device_handle = - gst_d3d11_device_get_device_handle (filter->device); - - if (!gst_d3d11_buffer_can_access_device (inbuf, device_handle)) - return FALSE; - - if (self->staging_buffer) - return TRUE; - - self->staging_buffer = gst_d3d11_allocate_staging_buffer_for (inbuf, - &filter->in_info, TRUE); - - if (!self->staging_buffer) { - GST_WARNING_OBJECT (self, "Couldn't allocate staging buffer"); - return FALSE; - } - - return TRUE; -} - static GstFlowReturn gst_d3d11_download_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf) { GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans); - GstD3D11Download *self = GST_D3D11_DOWNLOAD (trans); - GstVideoFrame in_frame, out_frame; - GstFlowReturn ret = GST_FLOW_OK; - gboolean use_staging_buf; - GstBuffer *target_inbuf = inbuf; - guint i; - - use_staging_buf = gst_d3d11_download_can_use_staging_buffer (self, inbuf); - - if (use_staging_buf) { - GST_TRACE_OBJECT (self, "Copy input buffer to staging buffer"); - - /* Copy d3d11 texture to staging texture */ - if (!gst_d3d11_buffer_copy_into (self->staging_buffer, - inbuf, &filter->in_info)) { - GST_ERROR_OBJECT (self, - "Failed to copy input buffer into staging texture"); - return GST_FLOW_ERROR; - } - - target_inbuf = self->staging_buffer; - } - if (!gst_video_frame_map (&in_frame, &filter->in_info, target_inbuf, - (GstMapFlags) (GST_MAP_READ | GST_VIDEO_FRAME_MAP_FLAG_NO_REF))) - goto invalid_buffer; - - if (!gst_video_frame_map (&out_frame, &filter->out_info, outbuf, - (GstMapFlags) (GST_MAP_WRITE | GST_VIDEO_FRAME_MAP_FLAG_NO_REF))) { - gst_video_frame_unmap (&in_frame); - goto invalid_buffer; - } - - for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (&in_frame); i++) { - if (!gst_video_frame_copy_plane (&out_frame, &in_frame, i)) { - GST_ERROR_OBJECT (filter, "Couldn't copy %dth plane", i); - ret = GST_FLOW_ERROR; - break; - } - } - - gst_video_frame_unmap (&out_frame); - gst_video_frame_unmap (&in_frame); - - return ret; - - /* ERRORS */ -invalid_buffer: - { - GST_ELEMENT_WARNING (filter, CORE, NOT_IMPLEMENTED, (NULL), - ("invalid video buffer received")); + if (!gst_d3d11_buffer_copy_into (outbuf, inbuf, &filter->in_info)) { + GST_ERROR_OBJECT (filter, "Failed to copy buffer"); return GST_FLOW_ERROR; } -} - -static gboolean -gst_d3d11_download_set_info (GstD3D11BaseFilter * filter, - GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, - GstVideoInfo * out_info) -{ - GstD3D11Download *self = GST_D3D11_DOWNLOAD (filter); - gst_clear_buffer (&self->staging_buffer); - - return TRUE; + return GST_FLOW_OK; }
View file
gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11dxgicapture.cpp
Added
@@ -0,0 +1,1983 @@ +/* + * GStreamer + * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/* + * The MIT License (MIT) + * + * Copyright (c) Microsoft Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstd3d11dxgicapture.h" +#include "gstd3d11pluginutils.h" +#include <string.h> + +#include <wrl.h> + +GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_screen_capture_debug); +#define GST_CAT_DEFAULT gst_d3d11_screen_capture_debug + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; + +/* List of GstD3D11DxgiCapture weakref */ +G_LOCK_DEFINE_STATIC (dupl_list_lock); +static GList *dupl_list = nullptr; + +/* Below implemenation were taken from Microsoft sample + * https://github.com/microsoft/Windows-classic-samples/tree/master/Samples/DXGIDesktopDuplication + */ +#define NUMVERTICES 6 +#define BPP 4 + +/* Define our own MyFLOAT3 and MyFLOAT2 struct, since MinGW doesn't support + * DirectXMath.h + */ +struct MyFLOAT3 +{ + float x; + float y; + float z; + + MyFLOAT3() = default; + + MyFLOAT3(const MyFLOAT3&) = default; + MyFLOAT3& operator=(const MyFLOAT3&) = default; + + MyFLOAT3(MyFLOAT3&&) = default; + MyFLOAT3& operator=(MyFLOAT3&&) = default; + + constexpr MyFLOAT3(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {} + explicit MyFLOAT3(const float *pArray) : x(pArray0), y(pArray1), z(pArray2) {} +}; + +struct MyFLOAT2 +{ + float x; + float y; + + MyFLOAT2() = default; + + MyFLOAT2(const MyFLOAT2&) = default; + MyFLOAT2& operator=(const MyFLOAT2&) = default; + + MyFLOAT2(MyFLOAT2&&) = default; + MyFLOAT2& operator=(MyFLOAT2&&) = default; + + constexpr MyFLOAT2(float _x, float _y) : x(_x), y(_y) {} + explicit MyFLOAT2(const float *pArray) : x(pArray0), y(pArray1) {} +}; + +typedef struct +{ + MyFLOAT3 Pos; + MyFLOAT2 TexCoord; +} VERTEX; + +/* List of expected error cases */ +/* These are the errors we expect from general Dxgi API due to a transition */ +HRESULT SystemTransitionsExpectedErrors = { + DXGI_ERROR_DEVICE_REMOVED, + DXGI_ERROR_ACCESS_LOST, + static_cast<HRESULT>(WAIT_ABANDONED), + S_OK +}; + +/* These are the errors we expect from IDXGIOutput1::DuplicateOutput + * due to a transition */ +HRESULT CreateDuplicationExpectedErrors = { + DXGI_ERROR_DEVICE_REMOVED, + static_cast<HRESULT>(E_ACCESSDENIED), + DXGI_ERROR_SESSION_DISCONNECTED, + S_OK +}; + +/* These are the errors we expect from IDXGIOutputDuplication methods + * due to a transition */ +HRESULT FrameInfoExpectedErrors = { + DXGI_ERROR_DEVICE_REMOVED, + DXGI_ERROR_ACCESS_LOST, + S_OK +}; + +/* These are the errors we expect from IDXGIAdapter::EnumOutputs methods + * due to outputs becoming stale during a transition */ +HRESULT EnumOutputsExpectedErrors = { + DXGI_ERROR_NOT_FOUND, + S_OK +}; + +static GstFlowReturn +gst_d3d11_dxgi_capture_return_from_hr (ID3D11Device * device, + HRESULT hr, HRESULT * expected_errors = nullptr) +{ + HRESULT translated_hr = hr; + + /* On an error check if the DX device is lost */ + if (device) { + HRESULT remove_reason = device->GetDeviceRemovedReason (); + + switch (remove_reason) { + case DXGI_ERROR_DEVICE_REMOVED: + case DXGI_ERROR_DEVICE_RESET: + case static_cast<HRESULT>(E_OUTOFMEMORY): + /* Our device has been stopped due to an external event on the GPU so + * map them all to device removed and continue processing the condition + */ + translated_hr = DXGI_ERROR_DEVICE_REMOVED; + break; + case S_OK: + /* Device is not removed so use original error */ + break; + default: + /* Device is removed but not a error we want to remap */ + translated_hr = remove_reason; + break; + } + } + + /* Check if this error was expected or not */ + if (expected_errors) { + HRESULT* rst = expected_errors; + + while (*rst != S_OK) { + if (*rst == translated_hr) + return GST_D3D11_SCREEN_CAPTURE_FLOW_EXPECTED_ERROR; + + rst++; + } + } + + return GST_FLOW_ERROR; +} + +class PTR_INFO +{ +public: + PTR_INFO () + : PtrShapeBuffer (nullptr) + , BufferSize (0) + { + LastTimeStamp.QuadPart = 0; + } + + ~PTR_INFO () + { + if (PtrShapeBuffer) + delete PtrShapeBuffer; + } + + void + MaybeReallocBuffer (UINT buffer_size) + { + if (buffer_size <= BufferSize) + return; + + if (PtrShapeBuffer) + delete PtrShapeBuffer; + + PtrShapeBuffer = new BYTEbuffer_size; + BufferSize = buffer_size; + } + + BYTE* PtrShapeBuffer; + UINT BufferSize; + DXGI_OUTDUPL_POINTER_SHAPE_INFO shape_info; + POINT Position; + bool Visible; + LARGE_INTEGER LastTimeStamp; +}; + +class D3D11DesktopDupObject +{ +public: + D3D11DesktopDupObject () + : device_(nullptr) + , fence_(nullptr) + , metadata_buffer_(nullptr) + , metadata_buffer_size_(0) + , vertex_buffer_(nullptr) + , vertex_buffer_size_(0) + { + } + + ~D3D11DesktopDupObject () + { + if (metadata_buffer_) + delete metadata_buffer_; + + if (vertex_buffer_) + delete vertex_buffer_; + + gst_clear_d3d11_fence (&fence_); + gst_clear_object (&device_); + } + + GstFlowReturn + Init (GstD3D11Device * device, HMONITOR monitor) + { + GstFlowReturn ret; + ID3D11Device *device_handle; + HRESULT hr; + D3D11_TEXTURE2D_DESC texture_desc = { 0, }; + + if (!InitShader (device)) + return GST_FLOW_ERROR; + + ret = InitDupl (device, monitor); + if (ret != GST_FLOW_OK) + return ret; + + GST_INFO ("Init done"); + + device_handle = gst_d3d11_device_get_device_handle (device); + + texture_desc.Width = output_desc_.ModeDesc.Width; + texture_desc.Height = output_desc_.ModeDesc.Height; + texture_desc.MipLevels = 1; + texture_desc.ArraySize = 1; + /* FIXME: we can support DXGI_FORMAT_R10G10B10A2_UNORM */ + texture_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + texture_desc.SampleDesc.Count = 1; + texture_desc.Usage = D3D11_USAGE_DEFAULT; + texture_desc.BindFlags = + D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; + texture_desc.CPUAccessFlags = 0; + /* source element may hold different d3d11 device object */ + texture_desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; + + hr = device_handle->CreateTexture2D (&texture_desc, + nullptr, &shared_texture_); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (device, "Couldn't create texture, hr 0x%x", (guint) hr); + return GST_FLOW_ERROR; + } + + device_ = (GstD3D11Device *) gst_object_ref (device); + + return GST_FLOW_OK; + } + + GstFlowReturn + Capture () + { + GstFlowReturn ret; + bool timeout = false; + ComPtr<ID3D11Texture2D> texture; + UINT move_count, dirty_count; + DXGI_OUTDUPL_FRAME_INFO frame_info; + + GST_TRACE ("Capturing"); + ret = GetFrame (&texture, &move_count, &dirty_count, &frame_info, &timeout); + if (ret != GST_FLOW_OK) + return ret; + + /* Nothing updated */ + if (timeout) { + GST_TRACE ("timeout"); + return GST_FLOW_OK; + } + + GST_TRACE ("Getting mouse pointer info"); + ret = GetMouse (&ptr_info_, &frame_info); + if (ret != GST_FLOW_OK) { + GST_WARNING ("Couldn't get mouse pointer info"); + dupl_->ReleaseFrame (); + return ret; + } + + ret = ProcessFrame (texture.Get(), shared_texture_.Get(), + &output_desc_, move_count, dirty_count, &frame_info); + + if (ret != GST_FLOW_OK) { + dupl_->ReleaseFrame (); + GST_WARNING ("Couldn't process frame"); + return ret; + } + + HRESULT hr = dupl_->ReleaseFrame (); + if (!gst_d3d11_result (hr, device_)) { + GST_WARNING ("Couldn't release frame"); + return gst_d3d11_dxgi_capture_return_from_hr (nullptr, hr, FrameInfoExpectedErrors); + } + + GST_TRACE ("Capture done"); + + return GST_FLOW_OK; + } + + bool + DrawMouse (GstD3D11Device * device, ID3D11RenderTargetView * rtv, + ID3D11VertexShader * vs, ID3D11PixelShader * ps, + ID3D11InputLayout * layout, ID3D11SamplerState * sampler, + ID3D11BlendState * blend, D3D11_BOX * cropBox) + { + GST_TRACE ("Drawing mouse"); + + if (!ptr_info_.Visible) { + GST_TRACE ("Mouse is invisiable"); + return true; + } + + ComPtr<ID3D11Texture2D> MouseTex; + ComPtr<ID3D11ShaderResourceView> ShaderRes; + ComPtr<ID3D11Buffer> VertexBufferMouse; + D3D11_SUBRESOURCE_DATA InitData; + D3D11_TEXTURE2D_DESC Desc; + D3D11_SHADER_RESOURCE_VIEW_DESC SDesc; + ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device); + ID3D11DeviceContext *context_handle = + gst_d3d11_device_get_device_context_handle (device); + + VERTEX VerticesNUMVERTICES = + { + {MyFLOAT3(-1.0f, -1.0f, 0), MyFLOAT2(0.0f, 1.0f)}, + {MyFLOAT3(-1.0f, 1.0f, 0), MyFLOAT2(0.0f, 0.0f)}, + {MyFLOAT3(1.0f, -1.0f, 0), MyFLOAT2(1.0f, 1.0f)}, + {MyFLOAT3(1.0f, -1.0f, 0), MyFLOAT2(1.0f, 1.0f)}, + {MyFLOAT3(-1.0f, 1.0f, 0), MyFLOAT2(0.0f, 0.0f)}, + {MyFLOAT3(1.0f, 1.0f, 0), MyFLOAT2(1.0f, 0.0f)}, + }; + + D3D11_TEXTURE2D_DESC FullDesc; + shared_texture_->GetDesc(&FullDesc); + INT DesktopWidth = FullDesc.Width; + INT DesktopHeight = FullDesc.Height; + + INT CenterX = (DesktopWidth / 2); + INT CenterY = (DesktopHeight / 2); + + INT PtrWidth = 0; + INT PtrHeight = 0; + INT PtrLeft = 0; + INT PtrTop = 0; + + BYTE* InitBuffer = nullptr; + + D3D11_BOX Box; + Box.front = 0; + Box.back = 1; + + Desc.MipLevels = 1; + Desc.ArraySize = 1; + Desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + Desc.SampleDesc.Count = 1; + Desc.SampleDesc.Quality = 0; + Desc.Usage = D3D11_USAGE_DEFAULT; + Desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + Desc.CPUAccessFlags = 0; + Desc.MiscFlags = 0; + + // Set shader resource properties + SDesc.Format = Desc.Format; + SDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + SDesc.Texture2D.MostDetailedMip = Desc.MipLevels - 1; + SDesc.Texture2D.MipLevels = Desc.MipLevels; + + switch (ptr_info_.shape_info.Type) { + case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR: + PtrLeft = ptr_info_.Position.x; + PtrTop = ptr_info_.Position.y; + + PtrWidth = static_cast<INT>(ptr_info_.shape_info.Width); + PtrHeight = static_cast<INT>(ptr_info_.shape_info.Height); + break; + case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MONOCHROME: + ProcessMonoMask(true, &ptr_info_, &PtrWidth, &PtrHeight, &PtrLeft, + &PtrTop, &InitBuffer, &Box); + break; + case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR: + ProcessMonoMask(false, &ptr_info_, &PtrWidth, &PtrHeight, &PtrLeft, + &PtrTop, &InitBuffer, &Box); + break; + default: + break; + } + + /* Nothing to draw */ + if (PtrWidth == 0 || PtrHeight == 0 || + (PtrLeft + PtrWidth) < static_cast<INT>(cropBox->left) || + PtrLeft > static_cast<INT>(cropBox->right) || + (PtrTop + PtrHeight) < static_cast<INT>(cropBox->top) || + PtrTop > static_cast<INT>(cropBox->bottom)) { + if (InitBuffer) + delete InitBuffer; + + return true; + } + + PtrLeft -= cropBox->left; + PtrTop -= cropBox->top; + + Vertices0.Pos.x = (PtrLeft - CenterX) / (FLOAT)CenterX; + Vertices0.Pos.y = -1 * ((PtrTop + PtrHeight) - CenterY) / (FLOAT)CenterY; + Vertices1.Pos.x = (PtrLeft - CenterX) / (FLOAT)CenterX; + Vertices1.Pos.y = -1 * (PtrTop - CenterY) / (FLOAT)CenterY; + Vertices2.Pos.x = ((PtrLeft + PtrWidth) - CenterX) / (FLOAT)CenterX; + Vertices2.Pos.y = -1 * ((PtrTop + PtrHeight) - CenterY) / (FLOAT)CenterY; + Vertices3.Pos.x = Vertices2.Pos.x; + Vertices3.Pos.y = Vertices2.Pos.y; + Vertices4.Pos.x = Vertices1.Pos.x; + Vertices4.Pos.y = Vertices1.Pos.y; + Vertices5.Pos.x = ((PtrLeft + PtrWidth) - CenterX) / (FLOAT)CenterX; + Vertices5.Pos.y = -1 * (PtrTop - CenterY) / (FLOAT)CenterY; + + Desc.Width = PtrWidth; + Desc.Height = PtrHeight; + + InitData.pSysMem = + (ptr_info_.shape_info.Type == DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR) ? + ptr_info_.PtrShapeBuffer : InitBuffer; + InitData.SysMemPitch = + (ptr_info_.shape_info.Type == DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR) ? + ptr_info_.shape_info.Pitch : PtrWidth * BPP; + InitData.SysMemSlicePitch = 0; + + // Create mouseshape as texture + HRESULT hr = device_handle->CreateTexture2D(&Desc, &InitData, &MouseTex); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR ("Failed to create texture for rendering mouse"); + return false; + } + + // Create shader resource from texture + hr = device_handle->CreateShaderResourceView(MouseTex.Get(), &SDesc, + &ShaderRes); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR ("Failed to create shader resource view for rendering mouse"); + return false; + } + + D3D11_BUFFER_DESC BDesc; + memset (&BDesc, 0, sizeof(D3D11_BUFFER_DESC)); + BDesc.Usage = D3D11_USAGE_DEFAULT; + BDesc.ByteWidth = sizeof(VERTEX) * NUMVERTICES; + BDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + BDesc.CPUAccessFlags = 0; + + memset (&InitData, 0, sizeof(D3D11_SUBRESOURCE_DATA)); + InitData.pSysMem = Vertices; + + // Create vertex buffer + hr = device_handle->CreateBuffer(&BDesc, &InitData, &VertexBufferMouse); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR ("Failed to create vertex buffer for rendering mouse"); + return false; + } + + FLOAT BlendFactor4 = {0.f, 0.f, 0.f, 0.f}; + UINT Stride = sizeof(VERTEX); + UINT Offset = 0; + ID3D11ShaderResourceView *srv = ShaderRes.Get(); + ID3D11Buffer *vert_buf = VertexBufferMouse.Get(); + + context_handle->IASetVertexBuffers(0, 1, &vert_buf, &Stride, &Offset); + context_handle->OMSetBlendState(blend, BlendFactor, 0xFFFFFFFF); + context_handle->OMSetRenderTargets(1, &rtv, nullptr); + context_handle->VSSetShader(vs, nullptr, 0); + context_handle->PSSetShader(ps, nullptr, 0); + context_handle->PSSetShaderResources(0, 1, &srv); + context_handle->PSSetSamplers(0, 1, &sampler); + context_handle->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + context_handle->IASetInputLayout(layout); + + D3D11_VIEWPORT VP; + VP.Width = static_cast<FLOAT>(FullDesc.Width); + VP.Height = static_cast<FLOAT>(FullDesc.Height); + VP.MinDepth = 0.0f; + VP.MaxDepth = 1.0f; + VP.TopLeftX = 0.0f; + VP.TopLeftY = 0.0f; + context_handle->RSSetViewports(1, &VP); + + context_handle->Draw(NUMVERTICES, 0); + + /* Unbind srv and rtv from context */ + srv = nullptr; + context_handle->PSSetShaderResources (0, 1, &srv); + context_handle->OMSetRenderTargets (0, nullptr, nullptr); + + if (InitBuffer) + delete InitBuffer; + + return true; + } + + GstFlowReturn + CopyToTexture (GstD3D11Device * device, ID3D11Texture2D * texture, + D3D11_BOX * cropBox) + { + ID3D11DeviceContext *context_handle = nullptr; + ComPtr <ID3D11Texture2D> tex; + HRESULT hr; + gboolean is_shared = FALSE; + + context_handle = gst_d3d11_device_get_device_context_handle (device); + + if (device == device_) { + tex = shared_texture_; + } else { + ID3D11Device *device_handle = nullptr; + ComPtr < IDXGIResource > dxgi_resource; + HANDLE shared_handle; + + device_handle = gst_d3d11_device_get_device_handle (device); + + hr = shared_texture_.As (&dxgi_resource); + if (!gst_d3d11_result (hr, device_)) + return GST_FLOW_ERROR; + + hr = dxgi_resource->GetSharedHandle (&shared_handle); + if (!gst_d3d11_result (hr, device_)) + return GST_FLOW_ERROR; + + hr = device_handle->OpenSharedResource (shared_handle, + IID_PPV_ARGS (&tex)); + if (!gst_d3d11_result (hr, device)) + return GST_FLOW_ERROR; + + if (fence_ && fence_->device != device) + gst_clear_d3d11_fence (&fence_); + + if (!fence_) + fence_ = gst_d3d11_device_create_fence (device); + + if (!fence_) + return GST_FLOW_ERROR; + + is_shared = TRUE; + } + + context_handle->CopySubresourceRegion (texture, 0, 0, 0, 0, + tex.Get(), 0, cropBox); + + if (is_shared) { + if (!gst_d3d11_fence_signal (fence_) || !gst_d3d11_fence_wait (fence_)) + return GST_FLOW_ERROR; + } + + return GST_FLOW_OK; + } + + void + GetSize (guint * width, guint * height) + { + *width = output_desc_.ModeDesc.Width; + *height = output_desc_.ModeDesc.Height; + } + +private: + /* This method is not expected to be failed unless un-recoverable error case */ + bool + InitShader (GstD3D11Device * device) + { + static const gchar vs_str = + "struct VS_INPUT {\n" + " float4 Position: POSITION;\n" + " float2 Texture: TEXCOORD;\n" + "};\n" + "\n" + "struct VS_OUTPUT {\n" + " float4 Position: SV_POSITION;\n" + " float2 Texture: TEXCOORD;\n" + "};\n" + "\n" + "VS_OUTPUT main (VS_INPUT input)\n" + "{\n" + " return input;\n" + "}"; + + static const gchar ps_str = + "Texture2D shaderTexture;\n" + "SamplerState samplerState;\n" + "\n" + "struct PS_INPUT {\n" + " float4 Position: SV_POSITION;\n" + " float2 Texture: TEXCOORD;\n" + "};\n" + "\n" + "struct PS_OUTPUT {\n" + " float4 Plane: SV_Target;\n" + "};\n" + "\n" + "PS_OUTPUT main(PS_INPUT input)\n" + "{\n" + " PS_OUTPUT output;\n" + " output.Plane = shaderTexture.Sample(samplerState, input.Texture);\n" + " return output;\n" + "}"; + + D3D11_INPUT_ELEMENT_DESC input_desc = { + {"POSITION", + 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"TEXCOORD", + 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0} + }; + + ComPtr<ID3D11VertexShader> vs; + ComPtr<ID3D11InputLayout> layout; + HRESULT hr; + + hr = gst_d3d11_create_vertex_shader_simple (device, + vs_str, "main", input_desc, G_N_ELEMENTS (input_desc), &vs, &layout); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR ("Failed to create vertex shader"); + return false; + } + + ComPtr<ID3D11PixelShader> ps; + hr = gst_d3d11_create_pixel_shader_simple (device, ps_str, "main", &ps); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR ("Failed to create pixel shader"); + return false; + } + + D3D11_SAMPLER_DESC sampler_desc; + memset (&sampler_desc, 0, sizeof (D3D11_SAMPLER_DESC)); + sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; + sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; + sampler_desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; + sampler_desc.ComparisonFunc = D3D11_COMPARISON_NEVER; + sampler_desc.MinLOD = 0; + sampler_desc.MaxLOD = D3D11_FLOAT32_MAX; + + ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device); + ComPtr<ID3D11SamplerState> sampler; + hr = device_handle->CreateSamplerState (&sampler_desc, &sampler); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR ("Failed to create sampler state, hr 0x%x", (guint) hr); + return false; + } + + /* Everything is prepared now */ + vs_ = vs; + ps_ = ps; + layout_ = layout; + sampler_ = sampler; + + return true; + } + + /* Maybe returning expected error code depending on desktop status */ + GstFlowReturn + InitDupl (GstD3D11Device * device, HMONITOR monitor) + { + ComPtr<ID3D11Device> d3d11_device; + ComPtr<IDXGIAdapter1> adapter; + ComPtr<IDXGIOutput> output; + ComPtr<IDXGIOutput1> output1; + + d3d11_device = gst_d3d11_device_get_device_handle (device); + + HRESULT hr = gst_d3d11_screen_capture_find_output_for_monitor (monitor, + &adapter, &output); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR ("Couldn't get adapter and output for monitor"); + return GST_FLOW_ERROR; + } + + hr = output.As (&output1); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR ("Couldn't get IDXGIOutput1 interface, hr 0x%x", (guint) hr); + return GST_FLOW_ERROR; + } + + HDESK hdesk = OpenInputDesktop (0, FALSE, GENERIC_ALL); + if (hdesk) { + if (!SetThreadDesktop (hdesk)) { + GST_WARNING ("SetThreadDesktop() failed, error %lu", GetLastError()); + } + + CloseDesktop (hdesk); + } else { + GST_WARNING ("OpenInputDesktop() failed, error %lu", GetLastError()); + } + + /* FIXME: Use DuplicateOutput1 to avoid potentail color conversion */ + hr = output1->DuplicateOutput(d3d11_device.Get(), &dupl_); + if (!gst_d3d11_result (hr, device)) { + if (hr == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE) { + GST_ERROR ("Hit the max allowed number of Desktop Duplication session"); + return GST_FLOW_ERROR; + } + + /* Seems to be one limitation of Desktop Duplication API design + * See + * https://docs.microsoft.com/en-US/troubleshoot/windows-client/shell-experience/error-when-dda-capable-app-is-against-gpu + */ + if (hr == DXGI_ERROR_UNSUPPORTED) { + GST_WARNING ("IDXGIOutput1::DuplicateOutput returned " + "DXGI_ERROR_UNSUPPORTED, possiblely application is run against a " + "discrete GPU"); + return GST_D3D11_SCREEN_CAPTURE_FLOW_UNSUPPORTED; + } + + return gst_d3d11_dxgi_capture_return_from_hr (d3d11_device.Get(), hr, + CreateDuplicationExpectedErrors); + } + + dupl_->GetDesc (&output_desc_); + + return GST_FLOW_OK; + } + + GstFlowReturn + GetMouse (PTR_INFO * ptr_info, DXGI_OUTDUPL_FRAME_INFO * frame_info) + { + /* A non-zero mouse update timestamp indicates that there is a mouse + * position update and optionally a shape change */ + if (frame_info->LastMouseUpdateTime.QuadPart == 0) + return GST_FLOW_OK; + + ptr_info->Position.x = frame_info->PointerPosition.Position.x; + ptr_info->Position.y = frame_info->PointerPosition.Position.y; + ptr_info->LastTimeStamp = frame_info->LastMouseUpdateTime; + ptr_info->Visible = frame_info->PointerPosition.Visible != 0; + + /* No new shape */ + if (frame_info->PointerShapeBufferSize == 0) + return GST_FLOW_OK; + + /* Realloc buffer if needed */ + ptr_info->MaybeReallocBuffer (frame_info->PointerShapeBufferSize); + + /* Must always get shape of cursor, even if not drawn at the moment. + * Shape of cursor is not repeated by the AcquireNextFrame and can be + * requested to be drawn any time later */ + UINT dummy; + HRESULT hr = dupl_->GetFramePointerShape(frame_info->PointerShapeBufferSize, + (void *) ptr_info->PtrShapeBuffer, &dummy, &ptr_info->shape_info); + + if (!gst_d3d11_result (hr, device_)) { + ID3D11Device *device_handle = + gst_d3d11_device_get_device_handle (device_); + + return gst_d3d11_dxgi_capture_return_from_hr(device_handle, hr, + FrameInfoExpectedErrors); + } + + return GST_FLOW_OK; + } + + void + MaybeReallocMetadataBuffer (UINT buffer_size) + { + if (buffer_size <= metadata_buffer_size_) + return; + + if (metadata_buffer_) + delete metadata_buffer_; + + metadata_buffer_ = new BYTEbuffer_size; + metadata_buffer_size_ = buffer_size; + } + + GstFlowReturn + GetFrame (ID3D11Texture2D ** texture, UINT * move_count, UINT * dirty_count, + DXGI_OUTDUPL_FRAME_INFO * frame_info, bool* timeout) + { + ComPtr<IDXGIResource> resource; + ComPtr<ID3D11Texture2D> acquired_texture; + ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device_); + + /* Get new frame */ + HRESULT hr = dupl_->AcquireNextFrame(0, frame_info, &resource); + if (hr == DXGI_ERROR_WAIT_TIMEOUT) { + GST_TRACE ("Timeout"); + + *timeout = true; + return GST_FLOW_OK; + } + + *timeout = false; + *move_count = 0; + *dirty_count = 0; + + if (!gst_d3d11_result (hr, device_)) { + return gst_d3d11_dxgi_capture_return_from_hr(device_handle, hr, + FrameInfoExpectedErrors); + } + + GST_TRACE ( + "LastPresentTime: %" G_GINT64_FORMAT + ", LastMouseUpdateTime: %" G_GINT64_FORMAT + ", AccumulatedFrames: %d" + ", RectsCoalesced: %d" + ", ProtectedContentMaskedOut: %d" + ", PointerPosition: (%ldx%ld, visible %d)" + ", TotalMetadataBufferSize: %d" + ", PointerShapeBufferSize: %d", + frame_info->LastPresentTime.QuadPart, + frame_info->LastMouseUpdateTime.QuadPart, + frame_info->AccumulatedFrames, + frame_info->RectsCoalesced, + frame_info->ProtectedContentMaskedOut, + frame_info->PointerPosition.Position.x, + frame_info->PointerPosition.Position.y, + frame_info->PointerPosition.Visible, + frame_info->TotalMetadataBufferSize, + frame_info->PointerShapeBufferSize); + + hr = resource.As (&acquired_texture); + if (!gst_d3d11_result (hr, device_)) { + GST_ERROR ("Failed to get ID3D11Texture2D interface from IDXGIResource " + "hr 0x%x", (guint) hr); + return GST_FLOW_ERROR; + } + + /* Get metadata */ + if (frame_info->TotalMetadataBufferSize) { + UINT buf_size = frame_info->TotalMetadataBufferSize; + + MaybeReallocMetadataBuffer (buf_size); + + /* Get move rectangles */ + hr = dupl_->GetFrameMoveRects(buf_size, + (DXGI_OUTDUPL_MOVE_RECT *) metadata_buffer_, &buf_size); + if (!gst_d3d11_result (hr, device_)) { + GST_ERROR ("Couldn't get move rect, hr 0x%x", (guint) hr); + + return gst_d3d11_dxgi_capture_return_from_hr(nullptr, hr, + FrameInfoExpectedErrors); + } + + *move_count = buf_size / sizeof(DXGI_OUTDUPL_MOVE_RECT); + + GST_TRACE ("MoveRects count %d", *move_count); +#ifndef GST_DISABLE_GST_DEBUG + { + DXGI_OUTDUPL_MOVE_RECT *rects = + (DXGI_OUTDUPL_MOVE_RECT *) metadata_buffer_; + for (guint i = 0; i < *move_count; i++) { + GST_TRACE ("MoveRect%d SourcePoint: %ldx%ld, " + "DestinationRect (left:top:right:bottom): %ldx%ldx%ldx%ld", + i, rects->SourcePoint.x, rects->SourcePoint.y, + rects->DestinationRect.left, rects->DestinationRect.top, + rects->DestinationRect.right, rects->DestinationRect.bottom); + } + } +#endif + + BYTE* dirty_rects = metadata_buffer_ + buf_size; + buf_size = frame_info->TotalMetadataBufferSize - buf_size; + + /* Get dirty rectangles */ + hr = dupl_->GetFrameDirtyRects(buf_size, (RECT *) dirty_rects, &buf_size); + if (!gst_d3d11_result (hr, device_)) { + GST_ERROR ("Couldn't get dirty rect, hr 0x%x", (guint) hr); + *move_count = 0; + *dirty_count = 0; + + return gst_d3d11_dxgi_capture_return_from_hr(nullptr, + hr, FrameInfoExpectedErrors); + } + + *dirty_count = buf_size / sizeof(RECT); + + GST_TRACE ("DirtyRects count %d", *dirty_count); +#ifndef GST_DISABLE_GST_DEBUG + { + RECT *rects = (RECT *) dirty_rects; + for (guint i = 0; i < *dirty_count; i++) { + GST_TRACE ("DirtyRect%d left:top:right:bottom: %ldx%ldx%ldx%ld", + i, rectsi.left, rectsi.top, rectsi.right, rectsi.bottom); + } + } +#endif + } + + *texture = acquired_texture.Detach(); + + return GST_FLOW_OK; + } + + void + SetMoveRect (RECT* SrcRect, RECT* DestRect, DXGI_OUTDUPL_DESC* DeskDesc, + DXGI_OUTDUPL_MOVE_RECT* MoveRect, INT TexWidth, INT TexHeight) + { + switch (DeskDesc->Rotation) + { + case DXGI_MODE_ROTATION_UNSPECIFIED: + case DXGI_MODE_ROTATION_IDENTITY: + SrcRect->left = MoveRect->SourcePoint.x; + SrcRect->top = MoveRect->SourcePoint.y; + SrcRect->right = MoveRect->SourcePoint.x + + MoveRect->DestinationRect.right - MoveRect->DestinationRect.left; + SrcRect->bottom = MoveRect->SourcePoint.y + + MoveRect->DestinationRect.bottom - MoveRect->DestinationRect.top; + + *DestRect = MoveRect->DestinationRect; + break; + case DXGI_MODE_ROTATION_ROTATE90: + SrcRect->left = TexHeight - (MoveRect->SourcePoint.y + + MoveRect->DestinationRect.bottom - MoveRect->DestinationRect.top); + SrcRect->top = MoveRect->SourcePoint.x; + SrcRect->right = TexHeight - MoveRect->SourcePoint.y; + SrcRect->bottom = MoveRect->SourcePoint.x + + MoveRect->DestinationRect.right - MoveRect->DestinationRect.left; + + DestRect->left = TexHeight - MoveRect->DestinationRect.bottom; + DestRect->top = MoveRect->DestinationRect.left; + DestRect->right = TexHeight - MoveRect->DestinationRect.top; + DestRect->bottom = MoveRect->DestinationRect.right; + break; + case DXGI_MODE_ROTATION_ROTATE180: + SrcRect->left = TexWidth - (MoveRect->SourcePoint.x + + MoveRect->DestinationRect.right - MoveRect->DestinationRect.left); + SrcRect->top = TexHeight - (MoveRect->SourcePoint.y + + MoveRect->DestinationRect.bottom - MoveRect->DestinationRect.top); + SrcRect->right = TexWidth - MoveRect->SourcePoint.x; + SrcRect->bottom = TexHeight - MoveRect->SourcePoint.y; + + DestRect->left = TexWidth - MoveRect->DestinationRect.right; + DestRect->top = TexHeight - MoveRect->DestinationRect.bottom; + DestRect->right = TexWidth - MoveRect->DestinationRect.left; + DestRect->bottom = TexHeight - MoveRect->DestinationRect.top; + break; + case DXGI_MODE_ROTATION_ROTATE270: + SrcRect->left = MoveRect->SourcePoint.x; + SrcRect->top = TexWidth - (MoveRect->SourcePoint.x + + MoveRect->DestinationRect.right - MoveRect->DestinationRect.left); + SrcRect->right = MoveRect->SourcePoint.y + + MoveRect->DestinationRect.bottom - MoveRect->DestinationRect.top; + SrcRect->bottom = TexWidth - MoveRect->SourcePoint.x; + + DestRect->left = MoveRect->DestinationRect.top; + DestRect->top = TexWidth - MoveRect->DestinationRect.right; + DestRect->right = MoveRect->DestinationRect.bottom; + DestRect->bottom = TexWidth - MoveRect->DestinationRect.left; + break; + default: + memset (DestRect, 0, sizeof (RECT)); + memset (SrcRect, 0, sizeof (RECT)); + break; + } + } + + GstFlowReturn + CopyMove (ID3D11Texture2D* SharedSurf, DXGI_OUTDUPL_MOVE_RECT* MoveBuffer, + UINT MoveCount, DXGI_OUTDUPL_DESC* DeskDesc) + { + ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device_); + ID3D11DeviceContext *device_context = + gst_d3d11_device_get_device_context_handle (device_); + D3D11_TEXTURE2D_DESC FullDesc; + SharedSurf->GetDesc(&FullDesc); + + GST_TRACE ("Copying MoveRects (count %d)", MoveCount); + + /* Make new intermediate surface to copy into for moving */ + if (!move_texture_) { + D3D11_TEXTURE2D_DESC MoveDesc; + MoveDesc = FullDesc; + MoveDesc.BindFlags = D3D11_BIND_RENDER_TARGET; + MoveDesc.MiscFlags = 0; + HRESULT hr = device_handle->CreateTexture2D(&MoveDesc, + nullptr, &move_texture_); + if (!gst_d3d11_result (hr, device_)) { + GST_ERROR ("Couldn't create intermediate texture, hr 0x%x", (guint) hr); + return GST_FLOW_ERROR; + } + } + + for (UINT i = 0; i < MoveCount; i++) { + RECT SrcRect; + RECT DestRect; + + SetMoveRect(&SrcRect, &DestRect, DeskDesc, &MoveBufferi, + FullDesc.Width, FullDesc.Height); + + /* Copy rect out of shared surface */ + D3D11_BOX Box; + Box.left = SrcRect.left; + Box.top = SrcRect.top; + Box.front = 0; + Box.right = SrcRect.right; + Box.bottom = SrcRect.bottom; + Box.back = 1; + device_context->CopySubresourceRegion(move_texture_.Get(), + 0, SrcRect.left, SrcRect.top, 0, SharedSurf, 0, &Box); + + /* Copy back to shared surface */ + device_context->CopySubresourceRegion(SharedSurf, + 0, DestRect.left, DestRect.top, 0, move_texture_.Get(), 0, &Box); + } + + return GST_FLOW_OK; + } + + void + SetDirtyVert (VERTEX* Vertices, RECT* Dirty, + DXGI_OUTDUPL_DESC* DeskDesc, D3D11_TEXTURE2D_DESC* FullDesc, + D3D11_TEXTURE2D_DESC* ThisDesc) + { + INT CenterX = FullDesc->Width / 2; + INT CenterY = FullDesc->Height / 2; + + INT Width = FullDesc->Width; + INT Height = FullDesc->Height; + + /* Rotation compensated destination rect */ + RECT DestDirty = *Dirty; + + /* Set appropriate coordinates compensated for rotation */ + switch (DeskDesc->Rotation) + { + case DXGI_MODE_ROTATION_ROTATE90: + DestDirty.left = Width - Dirty->bottom; + DestDirty.top = Dirty->left; + DestDirty.right = Width - Dirty->top; + DestDirty.bottom = Dirty->right; + + Vertices0.TexCoord = + MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), + Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); + Vertices1.TexCoord = + MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), + Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); + Vertices2.TexCoord = + MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), + Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); + Vertices5.TexCoord = + MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), + Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); + break; + case DXGI_MODE_ROTATION_ROTATE180: + DestDirty.left = Width - Dirty->right; + DestDirty.top = Height - Dirty->bottom; + DestDirty.right = Width - Dirty->left; + DestDirty.bottom = Height - Dirty->top; + + Vertices0.TexCoord = + MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), + Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); + Vertices1.TexCoord = + MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), + Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); + Vertices2.TexCoord = + MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), + Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); + Vertices5.TexCoord = + MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), + Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); + break; + case DXGI_MODE_ROTATION_ROTATE270: + DestDirty.left = Dirty->top; + DestDirty.top = Height - Dirty->right; + DestDirty.right = Dirty->bottom; + DestDirty.bottom = Height - Dirty->left; + + Vertices0.TexCoord = + MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), + Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); + Vertices1.TexCoord = + MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), + Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); + Vertices2.TexCoord = + MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), + Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); + Vertices5.TexCoord = + MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), + Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); + break; + case DXGI_MODE_ROTATION_UNSPECIFIED: + case DXGI_MODE_ROTATION_IDENTITY: + default: + Vertices0.TexCoord = + MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), + Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); + Vertices1.TexCoord = + MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), + Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); + Vertices2.TexCoord = + MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), + Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); + Vertices5.TexCoord = + MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), + Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); + break; + } + + /* Set positions */ + Vertices0.Pos = + MyFLOAT3( + (DestDirty.left - CenterX) / static_cast<FLOAT>(CenterX), + -1 * (DestDirty.bottom - CenterY) / static_cast<FLOAT>(CenterY), + 0.0f); + Vertices1.Pos = + MyFLOAT3( + (DestDirty.left - CenterX) / static_cast<FLOAT>(CenterX), + -1 * (DestDirty.top - CenterY) / static_cast<FLOAT>(CenterY), + 0.0f); + Vertices2.Pos = + MyFLOAT3( + (DestDirty.right - CenterX) / static_cast<FLOAT>(CenterX), + -1 * (DestDirty.bottom - CenterY) / static_cast<FLOAT>(CenterY), + 0.0f); + Vertices3.Pos = Vertices2.Pos; + Vertices4.Pos = Vertices1.Pos; + Vertices5.Pos = + MyFLOAT3( + (DestDirty.right - CenterX) / static_cast<FLOAT>(CenterX), + -1 * (DestDirty.top - CenterY) / static_cast<FLOAT>(CenterY), + 0.0f); + + Vertices3.TexCoord = Vertices2.TexCoord; + Vertices4.TexCoord = Vertices1.TexCoord; + } + + void + MaybeReallocVertexBuffer (UINT buffer_size) + { + if (buffer_size <= vertex_buffer_size_) + return; + + if (vertex_buffer_) + delete vertex_buffer_; + + vertex_buffer_ = new BYTEbuffer_size; + vertex_buffer_size_ = buffer_size; + } + + GstFlowReturn + CopyDirty (ID3D11Texture2D* SrcSurface, ID3D11Texture2D* SharedSurf, + RECT* DirtyBuffer, UINT DirtyCount, DXGI_OUTDUPL_DESC* DeskDesc) + { + D3D11_TEXTURE2D_DESC FullDesc; + D3D11_TEXTURE2D_DESC ThisDesc; + ComPtr<ID3D11ShaderResourceView> ShaderResource; + ComPtr<ID3D11Buffer> VertBuf; + HRESULT hr; + ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device_); + ID3D11DeviceContext *device_context = + gst_d3d11_device_get_device_context_handle (device_); + + GST_TRACE ("Copying DirtyRects (count %d)", DirtyCount); + + SharedSurf->GetDesc(&FullDesc); + SrcSurface->GetDesc(&ThisDesc); + + if (!rtv_) { + hr = device_handle->CreateRenderTargetView(SharedSurf, nullptr, &rtv_); + if (!gst_d3d11_result (hr, device_)) { + GST_ERROR ("Couldn't create render target view, hr 0x%x", (guint) hr); + return GST_FLOW_ERROR; + } + } + + D3D11_SHADER_RESOURCE_VIEW_DESC ShaderDesc; + ShaderDesc.Format = ThisDesc.Format; + ShaderDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + ShaderDesc.Texture2D.MostDetailedMip = ThisDesc.MipLevels - 1; + ShaderDesc.Texture2D.MipLevels = ThisDesc.MipLevels; + + /* Create new shader resource view */ + hr = device_handle->CreateShaderResourceView(SrcSurface, + &ShaderDesc, &ShaderResource); + if (!gst_d3d11_result (hr, device_)) { + return gst_d3d11_dxgi_capture_return_from_hr(device_handle, hr, + SystemTransitionsExpectedErrors); + } + + ID3D11SamplerState *samplers = sampler_.Get(); + ID3D11ShaderResourceView *srv = ShaderResource.Get(); + ID3D11RenderTargetView *rtv = rtv_.Get(); + device_context->OMSetBlendState(nullptr, nullptr, 0xFFFFFFFF); + device_context->OMSetRenderTargets(1, &rtv, nullptr); + device_context->VSSetShader(vs_.Get(), nullptr, 0); + device_context->PSSetShader(ps_.Get(), nullptr, 0); + device_context->PSSetShaderResources(0, 1, &srv); + device_context->PSSetSamplers(0, 1, &samplers); + device_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + device_context->IASetInputLayout(layout_.Get()); + + /* Create space for vertices for the dirty rects if the current space isn't + * large enough */ + UINT byte_needed = sizeof(VERTEX) * NUMVERTICES * DirtyCount; + MaybeReallocVertexBuffer (byte_needed); + + /* Fill them in */ + VERTEX* DirtyVertex = (VERTEX *) vertex_buffer_; + for (UINT i = 0; i < DirtyCount; ++i, DirtyVertex += NUMVERTICES) { + SetDirtyVert(DirtyVertex, &DirtyBufferi, DeskDesc, + &FullDesc, &ThisDesc); + } + + /* Create vertex buffer */ + D3D11_BUFFER_DESC BufferDesc; + memset (&BufferDesc, 0, sizeof (D3D11_BUFFER_DESC)); + BufferDesc.Usage = D3D11_USAGE_DEFAULT; + BufferDesc.ByteWidth = byte_needed; + BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + BufferDesc.CPUAccessFlags = 0; + D3D11_SUBRESOURCE_DATA InitData; + memset (&InitData, 0, sizeof (D3D11_SUBRESOURCE_DATA)); + InitData.pSysMem = vertex_buffer_; + + hr = device_handle->CreateBuffer(&BufferDesc, &InitData, &VertBuf); + if (!gst_d3d11_result (hr, device_)) { + GST_ERROR ("Failed to create vertex buffer"); + return GST_FLOW_ERROR; + } + + UINT Stride = sizeof(VERTEX); + UINT Offset = 0; + ID3D11Buffer *vert_buf = VertBuf.Get(); + device_context->IASetVertexBuffers(0, 1, &vert_buf, &Stride, &Offset); + + D3D11_VIEWPORT VP; + VP.Width = static_cast<FLOAT>(FullDesc.Width); + VP.Height = static_cast<FLOAT>(FullDesc.Height); + VP.MinDepth = 0.0f; + VP.MaxDepth = 1.0f; + VP.TopLeftX = 0.0f; + VP.TopLeftY = 0.0f; + device_context->RSSetViewports(1, &VP); + + device_context->Draw(NUMVERTICES * DirtyCount, 0); + + /* Unbind srv and rtv from context */ + srv = nullptr; + device_context->PSSetShaderResources (0, 1, &srv); + device_context->OMSetRenderTargets (0, nullptr, nullptr); + + return GST_FLOW_OK; + } + + GstFlowReturn + ProcessFrame(ID3D11Texture2D * acquired_texture, ID3D11Texture2D* SharedSurf, + DXGI_OUTDUPL_DESC* DeskDesc, UINT move_count, UINT dirty_count, + DXGI_OUTDUPL_FRAME_INFO * frame_info) + { + GstFlowReturn ret = GST_FLOW_OK; + + GST_TRACE ("Processing frame"); + + /* Process dirties and moves */ + if (frame_info->TotalMetadataBufferSize) { + if (move_count) { + ret = CopyMove(SharedSurf, (DXGI_OUTDUPL_MOVE_RECT *) metadata_buffer_, + move_count, DeskDesc); + + if (ret != GST_FLOW_OK) + return ret; + } + + if (dirty_count) { + ret = CopyDirty(acquired_texture, SharedSurf, + (RECT *)(metadata_buffer_ + + (move_count * sizeof(DXGI_OUTDUPL_MOVE_RECT))), + dirty_count, DeskDesc); + } + } else { + GST_TRACE ("No metadata"); + } + + return ret; + } + + /* To draw mouse */ + bool + ProcessMonoMask (bool IsMono, PTR_INFO* PtrInfo, INT* PtrWidth, + INT* PtrHeight, INT* PtrLeft, INT* PtrTop, BYTE** InitBuffer, + D3D11_BOX* Box) + { + ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device_); + ID3D11DeviceContext *context_handle = + gst_d3d11_device_get_device_context_handle (device_); + + D3D11_TEXTURE2D_DESC FullDesc; + shared_texture_->GetDesc(&FullDesc); + INT DesktopWidth = FullDesc.Width; + INT DesktopHeight = FullDesc.Height; + + // Pointer position + INT GivenLeft = PtrInfo->Position.x; + INT GivenTop = PtrInfo->Position.y; + + // Figure out if any adjustment is needed for out of bound positions + if (GivenLeft < 0) { + *PtrWidth = GivenLeft + static_cast<INT>(PtrInfo->shape_info.Width); + } else if ((GivenLeft + static_cast<INT>(PtrInfo->shape_info.Width)) > DesktopWidth) { + *PtrWidth = DesktopWidth - GivenLeft; + } else { + *PtrWidth = static_cast<INT>(PtrInfo->shape_info.Width); + } + + if (IsMono) + PtrInfo->shape_info.Height = PtrInfo->shape_info.Height / 2; + + if (GivenTop < 0) { + *PtrHeight = GivenTop + static_cast<INT>(PtrInfo->shape_info.Height); + } else if ((GivenTop + static_cast<INT>(PtrInfo->shape_info.Height)) > DesktopHeight) { + *PtrHeight = DesktopHeight - GivenTop; + } else { + *PtrHeight = static_cast<INT>(PtrInfo->shape_info.Height); + } + + if (IsMono) + PtrInfo->shape_info.Height = PtrInfo->shape_info.Height * 2; + + *PtrLeft = (GivenLeft < 0) ? 0 : GivenLeft; + *PtrTop = (GivenTop < 0) ? 0 : GivenTop; + + D3D11_TEXTURE2D_DESC CopyBufferDesc; + CopyBufferDesc.Width = *PtrWidth; + CopyBufferDesc.Height = *PtrHeight; + CopyBufferDesc.MipLevels = 1; + CopyBufferDesc.ArraySize = 1; + CopyBufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + CopyBufferDesc.SampleDesc.Count = 1; + CopyBufferDesc.SampleDesc.Quality = 0; + CopyBufferDesc.Usage = D3D11_USAGE_STAGING; + CopyBufferDesc.BindFlags = 0; + CopyBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + CopyBufferDesc.MiscFlags = 0; + + ComPtr<ID3D11Texture2D> CopyBuffer; + HRESULT hr = device_handle->CreateTexture2D(&CopyBufferDesc, + nullptr, &CopyBuffer); + if (!gst_d3d11_result (hr, device_)) { + GST_ERROR ("Couldn't create texture for mouse pointer"); + return false; + } + + Box->left = *PtrLeft; + Box->top = *PtrTop; + Box->right = *PtrLeft + *PtrWidth; + Box->bottom = *PtrTop + *PtrHeight; + context_handle->CopySubresourceRegion(CopyBuffer.Get(), + 0, 0, 0, 0, shared_texture_.Get(), 0, Box); + + ComPtr<IDXGISurface> CopySurface; + hr = CopyBuffer.As (&CopySurface); + if (!gst_d3d11_result (hr, device_)) { + GST_ERROR ("Couldn't get DXGI resource from mouse texture"); + return false; + } + + DXGI_MAPPED_RECT MappedSurface; + hr = CopySurface->Map(&MappedSurface, DXGI_MAP_READ); + if (!gst_d3d11_result (hr, device_)) { + GST_ERROR ("Couldn't map DXGI surface"); + return false; + } + + *InitBuffer = new BYTE*PtrWidth * *PtrHeight * BPP; + + UINT* InitBuffer32 = reinterpret_cast<UINT*>(*InitBuffer); + UINT* Desktop32 = reinterpret_cast<UINT*>(MappedSurface.pBits); + UINT DesktopPitchInPixels = MappedSurface.Pitch / sizeof(UINT); + + // What to skip (pixel offset) + UINT SkipX = (GivenLeft < 0) ? (-1 * GivenLeft) : (0); + UINT SkipY = (GivenTop < 0) ? (-1 * GivenTop) : (0); + + if (IsMono) { + for (INT Row = 0; Row < *PtrHeight; Row++) { + BYTE Mask = 0x80; + Mask = Mask >> (SkipX % 8); + for (INT Col = 0; Col < *PtrWidth; Col++) { + BYTE AndMask = PtrInfo->PtrShapeBuffer((Col + SkipX) / 8) + + ((Row + SkipY) * (PtrInfo->shape_info.Pitch)) & Mask; + BYTE XorMask = PtrInfo->PtrShapeBuffer((Col + SkipX) / 8) + + ((Row + SkipY + (PtrInfo->shape_info.Height / 2)) * + (PtrInfo->shape_info.Pitch)) & Mask; + UINT AndMask32 = (AndMask) ? 0xFFFFFFFF : 0xFF000000; + UINT XorMask32 = (XorMask) ? 0x00FFFFFF : 0x00000000; + + InitBuffer32(Row * *PtrWidth) + Col = + (Desktop32(Row * DesktopPitchInPixels) + Col & AndMask32) ^ XorMask32; + + if (Mask == 0x01) { + Mask = 0x80; + } else { + Mask = Mask >> 1; + } + } + } + } else { + UINT* Buffer32 = reinterpret_cast<UINT*>(PtrInfo->PtrShapeBuffer); + + for (INT Row = 0; Row < *PtrHeight; Row++) { + for (INT Col = 0; Col < *PtrWidth; ++Col) { + // Set up mask + UINT MaskVal = 0xFF000000 & Buffer32(Col + SkipX) + ((Row + SkipY) * + (PtrInfo->shape_info.Pitch / sizeof(UINT))); + if (MaskVal) { + // Mask was 0xFF + InitBuffer32(Row * *PtrWidth) + Col = + (Desktop32(Row * DesktopPitchInPixels) + Col ^ + Buffer32(Col + SkipX) + ((Row + SkipY) * + (PtrInfo->shape_info.Pitch / sizeof(UINT)))) | 0xFF000000; + } else { + // Mask was 0x00 + InitBuffer32(Row * *PtrWidth) + Col = Buffer32(Col + SkipX) + + ((Row + SkipY) * (PtrInfo->shape_info.Pitch / sizeof(UINT))) | 0xFF000000; + } + } + } + } + + // Done with resource + hr = CopySurface->Unmap(); + if (!gst_d3d11_result (hr, device_)) { + GST_ERROR ("Failed to unmap DXGI surface"); + return false; + } + + return true; + } + +private: + PTR_INFO ptr_info_; + DXGI_OUTDUPL_DESC output_desc_; + GstD3D11Device * device_; + GstD3D11Fence * fence_; + + ComPtr<ID3D11Texture2D> shared_texture_; + ComPtr<ID3D11RenderTargetView> rtv_; + ComPtr<ID3D11Texture2D> move_texture_; + ComPtr<ID3D11VertexShader> vs_; + ComPtr<ID3D11PixelShader> ps_; + ComPtr<ID3D11InputLayout> layout_; + ComPtr<ID3D11SamplerState> sampler_; + ComPtr<IDXGIOutputDuplication> dupl_; + + /* frame metadata */ + BYTE *metadata_buffer_; + UINT metadata_buffer_size_; + + /* vertex buffers */ + BYTE *vertex_buffer_; + UINT vertex_buffer_size_; +}; +/* *INDENT-ON* */ + +enum +{ + PROP_0, + PROP_D3D11_DEVICE, + PROP_MONITOR_HANDLE, +}; + +struct _GstD3D11DxgiCapture +{ + GstD3D11ScreenCapture parent; + + GstD3D11Device *device; + guint cached_width; + guint cached_height; + + D3D11DesktopDupObject *dupl_obj; + IDXGIOutput *output; + + HMONITOR monitor_handle; + RECT desktop_coordinates; + gboolean prepared; + gint64 adapter_luid; + + CRITICAL_SECTION lock; +}; + +static void gst_d3d11_dxgi_capture_constructed (GObject * object); +static void gst_d3d11_dxgi_capture_dispose (GObject * object); +static void gst_d3d11_dxgi_capture_finalize (GObject * object); +static void gst_d3d11_dxgi_capture_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static GstFlowReturn +gst_d3d11_dxgi_capture_prepare (GstD3D11ScreenCapture * capture); +static gboolean +gst_d3d11_dxgi_capture_get_size (GstD3D11ScreenCapture * capture, + guint * width, guint * height); +static gboolean +gst_d3d11_dxgi_capture_get_colorimetry (GstD3D11ScreenCapture * capture, + GstVideoColorimetry * colorimetry); +static GstFlowReturn +gst_d3d11_dxgi_capture_do_capture (GstD3D11ScreenCapture * capture, + GstD3D11Device * device, ID3D11Texture2D * texture, + ID3D11RenderTargetView * rtv, ID3D11VertexShader * vs, + ID3D11PixelShader * ps, ID3D11InputLayout * layout, + ID3D11SamplerState * sampler, ID3D11BlendState * blend, + D3D11_BOX * crop_box, gboolean draw_mouse); + +#define gst_d3d11_dxgi_capture_parent_class parent_class +G_DEFINE_TYPE (GstD3D11DxgiCapture, gst_d3d11_dxgi_capture, + GST_TYPE_D3D11_SCREEN_CAPTURE); + +static void +gst_d3d11_dxgi_capture_class_init (GstD3D11DxgiCaptureClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstD3D11ScreenCaptureClass *capture_class = + GST_D3D11_SCREEN_CAPTURE_CLASS (klass); + + gobject_class->constructed = gst_d3d11_dxgi_capture_constructed; + gobject_class->dispose = gst_d3d11_dxgi_capture_dispose; + gobject_class->finalize = gst_d3d11_dxgi_capture_finalize; + gobject_class->set_property = gst_d3d11_dxgi_capture_set_property; + + g_object_class_install_property (gobject_class, PROP_D3D11_DEVICE, + g_param_spec_object ("d3d11device", "D3D11 Device", + "GstD3D11Device object for operating", + GST_TYPE_D3D11_DEVICE, (GParamFlags) + (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (gobject_class, PROP_MONITOR_HANDLE, + g_param_spec_pointer ("monitor-handle", "Monitor Handle", + "A HMONITOR handle of monitor to capture", (GParamFlags) + (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS))); + + capture_class->prepare = GST_DEBUG_FUNCPTR (gst_d3d11_dxgi_capture_prepare); + capture_class->get_size = GST_DEBUG_FUNCPTR (gst_d3d11_dxgi_capture_get_size); + capture_class->get_colorimetry = + GST_DEBUG_FUNCPTR (gst_d3d11_dxgi_capture_get_colorimetry); + capture_class->do_capture = + GST_DEBUG_FUNCPTR (gst_d3d11_dxgi_capture_do_capture); +} + +static void +gst_d3d11_dxgi_capture_init (GstD3D11DxgiCapture * self) +{ + InitializeCriticalSection (&self->lock); + + memset (&self->desktop_coordinates, 0, sizeof (RECT)); +} + +static void +gst_d3d11_dxgi_capture_constructed (GObject * object) +{ + GstD3D11DxgiCapture *self = GST_D3D11_DXGI_CAPTURE (object); + /* *INDENT-OFF* */ + ComPtr<IDXGIDevice> dxgi_device; + ComPtr<IDXGIAdapter1> adapter; + ComPtr<IDXGIOutput> output; + ComPtr<IDXGIOutput1> output1; + /* *INDENT-ON* */ + HRESULT hr; + gboolean ret = FALSE; + DXGI_OUTPUT_DESC output_desc; + DXGI_ADAPTER_DESC adapter_desc; + gint64 luid, device_luid; + + if (!self->device) { + GST_WARNING_OBJECT (self, "D3D11 device is unavailable"); + goto out; + } + + if (!self->monitor_handle) { + GST_WARNING_OBJECT (self, "Null monitor handle"); + goto out; + } + + hr = gst_d3d11_screen_capture_find_output_for_monitor (self->monitor_handle, + &adapter, &output); + if (!gst_d3d11_result (hr, self->device)) { + GST_WARNING_OBJECT (self, + "Failed to find associated adapter for monitor %p", + self->monitor_handle); + goto out; + } + + hr = output.As (&output1); + if (!gst_d3d11_result (hr, self->device)) { + GST_WARNING_OBJECT (self, "IDXGIOutput1 interface is unavailble"); + goto out; + } + + hr = adapter->GetDesc (&adapter_desc); + if (!gst_d3d11_result (hr, self->device)) { + GST_WARNING_OBJECT (self, "Failed to get adapter desc"); + goto out; + } + + luid = gst_d3d11_luid_to_int64 (&adapter_desc.AdapterLuid); + g_object_get (self->device, "adapter-luid", &device_luid, nullptr); + if (luid != device_luid) { + GST_WARNING_OBJECT (self, "Incompatible d3d11 device"); + goto out; + } + + hr = output->GetDesc (&output_desc); + if (!gst_d3d11_result (hr, self->device)) { + GST_WARNING_OBJECT (self, "Failed to get output desc"); + goto out; + } + + /* DesktopCoordinates will not report actual texture size in case that + * application is running without dpi-awareness. To get actual monitor size, + * we need to use Win32 API... */ + MONITORINFOEXW monitor_info; + DEVMODEW dev_mode; + + monitor_info.cbSize = sizeof (MONITORINFOEXW); + if (!GetMonitorInfoW (output_desc.Monitor, (LPMONITORINFO) & monitor_info)) { + GST_WARNING_OBJECT (self, "Couldn't get monitor info"); + goto out; + } + + dev_mode.dmSize = sizeof (DEVMODEW); + dev_mode.dmDriverExtra = sizeof (POINTL); + dev_mode.dmFields = DM_POSITION; + if (!EnumDisplaySettingsW + (monitor_info.szDevice, ENUM_CURRENT_SETTINGS, &dev_mode)) { + GST_WARNING_OBJECT (self, "Couldn't enumerate display settings"); + goto out; + } + + self->desktop_coordinates.left = dev_mode.dmPosition.x; + self->desktop_coordinates.top = dev_mode.dmPosition.y; + self->desktop_coordinates.right = + dev_mode.dmPosition.x + dev_mode.dmPelsWidth; + self->desktop_coordinates.bottom = + dev_mode.dmPosition.y + dev_mode.dmPelsHeight; + + self->cached_width = + self->desktop_coordinates.right - self->desktop_coordinates.left; + self->cached_height = + self->desktop_coordinates.bottom - self->desktop_coordinates.top; + + GST_DEBUG_OBJECT (self, + "Desktop coordinates left:top:right:bottom = %ld:%ld:%ld:%ld (%dx%d)", + self->desktop_coordinates.left, self->desktop_coordinates.top, + self->desktop_coordinates.right, self->desktop_coordinates.bottom, + self->cached_width, self->cached_height); + + g_object_get (self->device, "adapter-luid", &self->adapter_luid, nullptr); + + self->output = output.Detach (); + + ret = TRUE; + +out: + if (!ret) + gst_clear_object (&self->device); + + G_OBJECT_CLASS (parent_class)->constructed (object); +} + +static void +gst_d3d11_dxgi_capture_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstD3D11DxgiCapture *self = GST_D3D11_DXGI_CAPTURE (object); + + switch (prop_id) { + case PROP_D3D11_DEVICE: + self->device = (GstD3D11Device *) g_value_dup_object (value); + break; + case PROP_MONITOR_HANDLE: + self->monitor_handle = (HMONITOR) g_value_get_pointer (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_d3d11_dxgi_capture_dispose (GObject * object) +{ + GstD3D11DxgiCapture *self = GST_D3D11_DXGI_CAPTURE (object); + + GST_D3D11_CLEAR_COM (self->output); + + if (self->dupl_obj) { + delete self->dupl_obj; + self->dupl_obj = nullptr; + } + + gst_clear_object (&self->device); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_d3d11_dxgi_capture_finalize (GObject * object) +{ + GstD3D11DxgiCapture *self = GST_D3D11_DXGI_CAPTURE (object); + + DeleteCriticalSection (&self->lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_d3d11_dxgi_capture_weak_ref_notify (gpointer data, + GstD3D11DxgiCapture * dupl) +{ + G_LOCK (dupl_list_lock); + dupl_list = g_list_remove (dupl_list, dupl); + G_UNLOCK (dupl_list_lock); +} + +GstD3D11ScreenCapture * +gst_d3d11_dxgi_capture_new (GstD3D11Device * device, HMONITOR monitor_handle) +{ + GstD3D11DxgiCapture *self = nullptr; + GList *iter; + + g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), nullptr); + + /* Check if we have dup object corresponding to monitor_handle, + * and if there is already configured capture object, reuse it. + * This is because of the limitation of desktop duplication API + * (i.e., in a process, only one duplication object can exist). + * See also + * https://docs.microsoft.com/en-us/windows/win32/api/dxgi1_2/nf-dxgi1_2-idxgioutput1-duplicateoutput#remarks + */ + G_LOCK (dupl_list_lock); + for (iter = dupl_list; iter; iter = g_list_next (iter)) { + GstD3D11DxgiCapture *dupl = (GstD3D11DxgiCapture *) iter->data; + + if (dupl->monitor_handle == monitor_handle) { + GST_DEBUG ("Found configured desktop dup object for monitor handle %p", + monitor_handle); + self = (GstD3D11DxgiCapture *) gst_object_ref (dupl); + break; + } + } + + if (self) { + G_UNLOCK (dupl_list_lock); + return GST_D3D11_SCREEN_CAPTURE_CAST (self); + } + + self = (GstD3D11DxgiCapture *) g_object_new (GST_TYPE_D3D11_DXGI_CAPTURE, + "d3d11device", device, "monitor-handle", monitor_handle, nullptr); + + if (!self->device) { + GST_WARNING_OBJECT (self, "Couldn't configure desktop dup object"); + gst_object_unref (self); + G_UNLOCK (dupl_list_lock); + + return nullptr; + } + + g_object_weak_ref (G_OBJECT (self), + (GWeakNotify) gst_d3d11_dxgi_capture_weak_ref_notify, nullptr); + dupl_list = g_list_append (dupl_list, self); + + G_UNLOCK (dupl_list_lock); + + return GST_D3D11_SCREEN_CAPTURE_CAST (self); +} + +static GstFlowReturn +gst_d3d11_dxgi_capture_prepare (GstD3D11ScreenCapture * capture) +{ + GstD3D11DxgiCapture *self = GST_D3D11_DXGI_CAPTURE (capture); + GstFlowReturn ret; + + GstD3D11CSLockGuard lk (&self->lock); + + if (self->prepared) { + GST_DEBUG_OBJECT (self, "Already prepared"); + return GST_FLOW_OK; + } + + self->dupl_obj = new D3D11DesktopDupObject (); + ret = self->dupl_obj->Init (self->device, self->monitor_handle); + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (capture, + "Couldn't prepare capturing, %sexpected failure", + ret == GST_D3D11_SCREEN_CAPTURE_FLOW_EXPECTED_ERROR ? "" : "un"); + + delete self->dupl_obj; + self->dupl_obj = nullptr; + + return ret; + } + + self->prepared = TRUE; + + return GST_FLOW_OK; +} + +static gboolean +gst_d3d11_dxgi_capture_get_size_unlocked (GstD3D11DxgiCapture * self, + guint * width, guint * height) +{ + *width = 0; + *height = 0; + + if (self->dupl_obj) { + self->dupl_obj->GetSize (&self->cached_width, &self->cached_height); + } + + *width = self->cached_width; + *height = self->cached_height; + + return TRUE; +} + + +static gboolean +gst_d3d11_dxgi_capture_get_size (GstD3D11ScreenCapture * capture, + guint * width, guint * height) +{ + GstD3D11DxgiCapture *self = GST_D3D11_DXGI_CAPTURE (capture); + GstD3D11CSLockGuard lk (&self->lock); + + return gst_d3d11_dxgi_capture_get_size_unlocked (self, width, height); +} + +static gboolean +gst_d3d11_dxgi_capture_get_colorimetry (GstD3D11ScreenCapture * capture, + GstVideoColorimetry * colorimetry) +{ + GstD3D11DxgiCapture *self = GST_D3D11_DXGI_CAPTURE (capture); + DXGI_COLOR_SPACE_TYPE dxgi_cs; + GstVideoInfo info; + + dxgi_cs = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; + + if (self->output) { + ComPtr < IDXGIOutput6 > output; + HRESULT hr; + DXGI_OUTPUT_DESC1 desc; + + hr = self->output->QueryInterface (IID_PPV_ARGS (&output)); + if (SUCCEEDED (hr)) + hr = output->GetDesc1 (&desc); + + if (SUCCEEDED (hr)) + dxgi_cs = desc.ColorSpace; + } + + gst_video_info_set_format (&info, GST_VIDEO_FORMAT_BGRA, 16, 16); + if (gst_video_info_apply_dxgi_color_space (dxgi_cs, &info)) { + *colorimetry = info.colorimetry; + return TRUE; + } + + return FALSE; +} + +static GstFlowReturn +gst_d3d11_dxgi_capture_do_capture (GstD3D11ScreenCapture * capture, + GstD3D11Device * device, ID3D11Texture2D * texture, + ID3D11RenderTargetView * rtv, ID3D11VertexShader * vs, + ID3D11PixelShader * ps, ID3D11InputLayout * layout, + ID3D11SamplerState * sampler, ID3D11BlendState * blend, + D3D11_BOX * crop_box, gboolean draw_mouse) +{ + GstD3D11DxgiCapture *self = GST_D3D11_DXGI_CAPTURE (capture); + GstFlowReturn ret = GST_FLOW_OK; + gboolean shared_device = FALSE; + guint width, height; + + if (device != self->device) { + gint64 luid; + + g_object_get (device, "adapter-luid", &luid, nullptr); + /* source element must hold d3d11 device for the same GPU already + * by DXGI duplication API design */ + if (luid != self->adapter_luid) { + GST_ERROR_OBJECT (self, "Trying to capture from different device"); + return GST_FLOW_ERROR; + } + + shared_device = TRUE; + } + + GstD3D11CSLockGuard lk (&self->lock); + if (!self->prepared) + ret = gst_d3d11_dxgi_capture_prepare (capture); + + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (self, "We are not prepared"); + return ret; + } + + gst_d3d11_dxgi_capture_get_size_unlocked (self, &width, &height); + + if (crop_box->left > width || crop_box->right > width || + crop_box->top > height || crop_box->bottom > height) { + GST_INFO_OBJECT (self, + "Capture area (%u, %u, %u, %u) doesn't fit into screen size %ux%u", + crop_box->left, crop_box->right, crop_box->top, + crop_box->bottom, width, height); + + return GST_D3D11_SCREEN_CAPTURE_FLOW_SIZE_CHANGED; + } + + gst_d3d11_device_lock (self->device); + ret = self->dupl_obj->Capture (); + if (ret != GST_FLOW_OK) { + gst_d3d11_device_unlock (self->device); + + delete self->dupl_obj; + self->dupl_obj = nullptr; + self->prepared = FALSE; + + if (ret == GST_D3D11_SCREEN_CAPTURE_FLOW_EXPECTED_ERROR) { + GST_WARNING_OBJECT (self, "Couldn't capture frame, but expected failure"); + } else { + GST_ERROR_OBJECT (self, "Unexpected failure during capture"); + } + + return ret; + } + + GST_LOG_OBJECT (self, "Capture done"); + if (shared_device) + gst_d3d11_device_lock (device); + + ret = self->dupl_obj->CopyToTexture (device, texture, crop_box); + if (ret != GST_FLOW_OK) + goto out; + + if (draw_mouse) { + self->dupl_obj->DrawMouse (device, + rtv, vs, ps, layout, sampler, blend, crop_box); + } + +out: + if (shared_device) + gst_d3d11_device_unlock (device); + + gst_d3d11_device_unlock (self->device); + + return ret; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11dxgicapture.h
Added
@@ -0,0 +1,38 @@ +/* + * GStreamer + * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/d3d11/gstd3d11.h> +#include "gstd3d11screencapture.h" + +G_BEGIN_DECLS + +#define GST_TYPE_D3D11_DXGI_CAPTURE (gst_d3d11_dxgi_capture_get_type()) +G_DECLARE_FINAL_TYPE (GstD3D11DxgiCapture, gst_d3d11_dxgi_capture, + GST, D3D11_DXGI_CAPTURE, GstD3D11ScreenCapture); + +GstD3D11ScreenCapture * gst_d3d11_dxgi_capture_new (GstD3D11Device * device, + HMONITOR monitor_handle); + +G_END_DECLS +
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11h264dec.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11h264dec.cpp
Changed
@@ -95,6 +95,8 @@ std::vector<DXVA_Slice_H264_Short> slice_list; std::vector<guint8> bitstream_buffer; + gint crop_x = 0; + gint crop_y = 0; gint width = 0; gint height = 0; gint coded_width = 0; @@ -146,8 +148,9 @@ const GstH264SPS * sps, gint max_dpb_size); static GstFlowReturn gst_d3d11_h264_dec_new_picture (GstH264Decoder * decoder, GstVideoCodecFrame * frame, GstH264Picture * picture); -static GstFlowReturn gst_d3d11_h264_dec_new_field_picture (GstH264Decoder * - decoder, const GstH264Picture * first_field, GstH264Picture * second_field); +static GstFlowReturn +gst_d3d11_h264_dec_new_field_picture (GstH264Decoder * decoder, + GstH264Picture * first_field, GstH264Picture * second_field); static GstFlowReturn gst_d3d11_h264_dec_start_picture (GstH264Decoder * decoder, GstH264Picture * picture, GstH264Slice * slice, GstH264Dpb * dpb); static GstFlowReturn gst_d3d11_h264_dec_decode_slice (GstH264Decoder * decoder, @@ -388,9 +391,12 @@ } if (inner->width != crop_width || inner->height != crop_height || - inner->coded_width != sps->width || inner->coded_height != sps->height) { + inner->coded_width != sps->width || inner->coded_height != sps->height || + inner->crop_x != sps->crop_rect_x || inner->crop_y != sps->crop_rect_y) { GST_INFO_OBJECT (self, "resolution changed %dx%d (%dx%d)", crop_width, crop_height, sps->width, sps->height); + inner->crop_x = sps->crop_rect_x; + inner->crop_y = sps->crop_rect_y; inner->width = crop_width; inner->height = crop_height; inner->coded_width = sps->width; @@ -453,16 +459,14 @@ */ inner->max_dpb_size = max_dpb_size; if (!gst_d3d11_decoder_configure (inner->d3d11_decoder, - decoder->input_state, &info, - inner->coded_width, inner->coded_height, - /* Additional 4 views margin for zero-copy rendering */ - max_dpb_size + 4)) { + decoder->input_state, &info, inner->crop_x, inner->crop_y, + inner->coded_width, inner->coded_height, max_dpb_size)) { GST_ERROR_OBJECT (self, "Failed to create decoder"); return GST_FLOW_NOT_NEGOTIATED; } if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { - GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); + GST_WARNING_OBJECT (self, "Failed to negotiate with downstream"); return GST_FLOW_NOT_NEGOTIATED; } } @@ -497,13 +501,12 @@ static GstFlowReturn gst_d3d11_h264_dec_new_field_picture (GstH264Decoder * decoder, - const GstH264Picture * first_field, GstH264Picture * second_field) + GstH264Picture * first_field, GstH264Picture * second_field) { GstD3D11H264Dec *self = GST_D3D11_H264_DEC (decoder); GstBuffer *view_buffer; - view_buffer = (GstBuffer *) gst_h264_picture_get_user_data ((GstH264Picture *) - first_field); + view_buffer = (GstBuffer *) gst_h264_picture_get_user_data (first_field); if (!view_buffer) { GST_WARNING_OBJECT (self, "First picture does not have output view buffer"); @@ -858,10 +861,8 @@ input_args.inverse_quantization_matrix = &inner->iq_matrix; input_args.inverse_quantization_matrix_size = sizeof (DXVA_Qmatrix_H264); - if (!gst_d3d11_decoder_decode_frame (inner->d3d11_decoder, view, &input_args)) - return GST_FLOW_ERROR; - - return GST_FLOW_OK; + return gst_d3d11_decoder_decode_frame (inner->d3d11_decoder, + view, &input_args); } static GstFlowReturn @@ -884,7 +885,8 @@ } if (!gst_d3d11_decoder_process_output (inner->d3d11_decoder, vdec, - inner->width, inner->height, view_buffer, &frame->output_buffer)) { + picture->discont_state, inner->width, inner->height, view_buffer, + &frame->output_buffer)) { GST_ERROR_OBJECT (self, "Failed to copy buffer"); goto error; } @@ -991,16 +993,10 @@ /* To cover both landscape and portrait, select max value */ resolution = MAX (max_width, max_height); - gst_caps_set_simple (sink_caps, - "width", GST_TYPE_INT_RANGE, 1, resolution, - "height", GST_TYPE_INT_RANGE, 1, resolution, NULL); - gst_caps_set_simple (src_caps, - "width", GST_TYPE_INT_RANGE, 1, resolution, - "height", GST_TYPE_INT_RANGE, 1, resolution, NULL); type_info.class_data = gst_d3d11_decoder_class_data_new (device, GST_DXVA_CODEC_H264, - sink_caps, src_caps); + sink_caps, src_caps, resolution); type_name = g_strdup ("GstD3D11H264Dec"); feature_name = g_strdup ("d3d11h264dec");
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11h265dec.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11h265dec.cpp
Changed
@@ -67,6 +67,8 @@ gboolean submit_iq_data; + gint crop_x = 0; + gint crop_y = 0; gint width = 0; gint height = 0; gint coded_width = 0; @@ -336,9 +338,12 @@ } if (inner->width != crop_width || inner->height != crop_height || - inner->coded_width != sps->width || inner->coded_height != sps->height) { + inner->coded_width != sps->width || inner->coded_height != sps->height || + inner->crop_x != sps->crop_rect_x || inner->crop_y != sps->crop_rect_y) { GST_INFO_OBJECT (self, "resolution changed %dx%d -> %dx%d", crop_width, crop_height, sps->width, sps->height); + inner->crop_x = sps->crop_rect_x; + inner->crop_y = sps->crop_rect_y; inner->width = crop_width; inner->height = crop_height; inner->coded_width = sps->width; @@ -406,16 +411,14 @@ GST_VIDEO_INFO_INTERLACE_MODE (&info) = inner->interlace_mode; if (!gst_d3d11_decoder_configure (inner->d3d11_decoder, - decoder->input_state, &info, - inner->coded_width, inner->coded_height, - /* Additional 4 views margin for zero-copy rendering */ - max_dpb_size + 4)) { + decoder->input_state, &info, inner->crop_x, inner->crop_y, + inner->coded_width, inner->coded_height, max_dpb_size)) { GST_ERROR_OBJECT (self, "Failed to create decoder"); return GST_FLOW_NOT_NEGOTIATED; } if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { - GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); + GST_WARNING_OBJECT (self, "Failed to negotiate with downstream"); return GST_FLOW_NOT_NEGOTIATED; } } @@ -905,10 +908,8 @@ input_args.inverse_quantization_matrix_size = sizeof (DXVA_Qmatrix_HEVC); } - if (!gst_d3d11_decoder_decode_frame (inner->d3d11_decoder, view, &input_args)) - return GST_FLOW_ERROR; - - return GST_FLOW_OK; + return gst_d3d11_decoder_decode_frame (inner->d3d11_decoder, + view, &input_args); } static GstFlowReturn @@ -932,7 +933,8 @@ } if (!gst_d3d11_decoder_process_output (inner->d3d11_decoder, vdec, - inner->width, inner->height, view_buffer, &frame->output_buffer)) { + picture->discont_state, inner->width, inner->height, view_buffer, + &frame->output_buffer)) { GST_ERROR_OBJECT (self, "Failed to copy buffer"); goto error; } @@ -1085,12 +1087,6 @@ /* To cover both landscape and portrait, select max value */ resolution = MAX (max_width, max_height); - gst_caps_set_simple (sink_caps, - "width", GST_TYPE_INT_RANGE, 1, resolution, - "height", GST_TYPE_INT_RANGE, 1, resolution, NULL); - gst_caps_set_simple (src_caps, - "width", GST_TYPE_INT_RANGE, 1, resolution, - "height", GST_TYPE_INT_RANGE, 1, resolution, NULL); /* Copy src caps to append other capsfeatures */ src_caps_copy = gst_caps_copy (src_caps); @@ -1126,7 +1122,7 @@ type_info.class_data = gst_d3d11_decoder_class_data_new (device, GST_DXVA_CODEC_H265, - sink_caps, src_caps); + sink_caps, src_caps, resolution); type_name = g_strdup ("GstD3D11H265Dec"); feature_name = g_strdup ("d3d11h265dec");
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11mpeg2dec.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11mpeg2dec.cpp
Changed
@@ -53,9 +53,6 @@ GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_mpeg2_dec_debug); #define GST_CAT_DEFAULT gst_d3d11_mpeg2_dec_debug -/* reference list 2 + 4 margin */ -#define NUM_OUTPUT_VIEW 6 - /* *INDENT-OFF* */ typedef struct _GstD3D11Mpeg2DecInner { @@ -120,12 +117,13 @@ decoder, const GstMpegVideoSequenceHdr * seq, const GstMpegVideoSequenceExt * seq_ext, const GstMpegVideoSequenceDisplayExt * seq_display_ext, - const GstMpegVideoSequenceScalableExt * seq_scalable_ext); + const GstMpegVideoSequenceScalableExt * seq_scalable_ext, + gint max_dpb_size); static GstFlowReturn gst_d3d11_mpeg2_dec_new_picture (GstMpeg2Decoder * decoder, GstVideoCodecFrame * frame, GstMpeg2Picture * picture); -static GstFlowReturn gst_d3d11_mpeg2_dec_new_field_picture (GstMpeg2Decoder * - decoder, const GstMpeg2Picture * first_field, - GstMpeg2Picture * second_field); +static GstFlowReturn +gst_d3d11_mpeg2_dec_new_field_picture (GstMpeg2Decoder * decoder, + GstMpeg2Picture * first_field, GstMpeg2Picture * second_field); static GstFlowReturn gst_d3d11_mpeg2_dec_start_picture (GstMpeg2Decoder * decoder, GstMpeg2Picture * picture, GstMpeg2Slice * slice, GstMpeg2Picture * prev_picture, GstMpeg2Picture * next_picture); @@ -332,7 +330,7 @@ const GstMpegVideoSequenceHdr * seq, const GstMpegVideoSequenceExt * seq_ext, const GstMpegVideoSequenceDisplayExt * seq_display_ext, - const GstMpegVideoSequenceScalableExt * seq_scalable_ext) + const GstMpegVideoSequenceScalableExt * seq_scalable_ext, gint max_dpb_size) { GstD3D11Mpeg2Dec *self = GST_D3D11_MPEG2_DEC (decoder); GstD3D11Mpeg2DecInner *inner = self->inner; @@ -396,14 +394,14 @@ GST_VIDEO_INFO_INTERLACE_MODE (&info) = GST_VIDEO_INTERLACE_MODE_MIXED; if (!gst_d3d11_decoder_configure (inner->d3d11_decoder, - decoder->input_state, &info, - inner->width, inner->height, NUM_OUTPUT_VIEW)) { + decoder->input_state, &info, 0, 0, + inner->width, inner->height, max_dpb_size)) { GST_ERROR_OBJECT (self, "Failed to create decoder"); return GST_FLOW_NOT_NEGOTIATED; } if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { - GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); + GST_WARNING_OBJECT (self, "Failed to negotiate with downstream"); return GST_FLOW_NOT_NEGOTIATED; } } @@ -438,13 +436,13 @@ static GstFlowReturn gst_d3d11_mpeg2_dec_new_field_picture (GstMpeg2Decoder * decoder, - const GstMpeg2Picture * first_field, GstMpeg2Picture * second_field) + GstMpeg2Picture * first_field, GstMpeg2Picture * second_field) { GstD3D11Mpeg2Dec *self = GST_D3D11_MPEG2_DEC (decoder); GstBuffer *view_buffer; view_buffer = (GstBuffer *) - gst_mpeg2_picture_get_user_data ((GstMpeg2Picture *) first_field); + gst_mpeg2_picture_get_user_data (first_field); if (!view_buffer) { GST_WARNING_OBJECT (self, "First picture does not have output view buffer"); @@ -726,10 +724,8 @@ input_args.inverse_quantization_matrix_size = sizeof (DXVA_QmatrixData); } - if (!gst_d3d11_decoder_decode_frame (inner->d3d11_decoder, view, &input_args)) - return GST_FLOW_ERROR; - - return GST_FLOW_OK; + return gst_d3d11_decoder_decode_frame (inner->d3d11_decoder, + view, &input_args); } static GstFlowReturn @@ -751,7 +747,8 @@ } if (!gst_d3d11_decoder_process_output (inner->d3d11_decoder, vdec, - inner->width, inner->height, view_buffer, &frame->output_buffer)) { + picture->discont_state, inner->width, inner->height, view_buffer, + &frame->output_buffer)) { GST_ERROR_OBJECT (self, "Failed to copy buffer"); goto error; } @@ -816,16 +813,9 @@ /* NOTE: We are supporting only 4:2:0, main or simple profiles */ gst_caps_set_simple (src_caps, "format", G_TYPE_STRING, "NV12", NULL); - gst_caps_set_simple (sink_caps, - "width", GST_TYPE_INT_RANGE, 1, 1920, - "height", GST_TYPE_INT_RANGE, 1, 1920, NULL); - gst_caps_set_simple (src_caps, - "width", GST_TYPE_INT_RANGE, 1, 1920, - "height", GST_TYPE_INT_RANGE, 1, 1920, NULL); - type_info.class_data = gst_d3d11_decoder_class_data_new (device, GST_DXVA_CODEC_MPEG2, - sink_caps, src_caps); + sink_caps, src_caps, 1920); type_name = g_strdup ("GstD3D11Mpeg2Dec"); feature_name = g_strdup ("d3d11mpeg2dec");
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11overlaycompositor.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11overlaycompositor.cpp
Changed
@@ -22,7 +22,6 @@ #endif #include "gstd3d11overlaycompositor.h" -#include "gstd3d11shader.h" #include "gstd3d11pluginutils.h" #include <wrl.h> @@ -40,21 +39,19 @@ FLOAT z; } position; struct { - FLOAT x; - FLOAT y; + FLOAT u; + FLOAT v; } texture; } VertexData; static const gchar templ_pixel_shader = "Texture2D shaderTexture;\n" "SamplerState samplerState;\n" - "\n" "struct PS_INPUT\n" "{\n" " float4 Position: SV_POSITION;\n" - " float3 Texture: TEXCOORD0;\n" + " float2 Texture: TEXCOORD;\n" "};\n" - "\n" "float4 main(PS_INPUT input): SV_TARGET\n" "{\n" " return shaderTexture.Sample(samplerState, input.Texture);\n" @@ -64,13 +61,13 @@ "struct VS_INPUT\n" "{\n" " float4 Position : POSITION;\n" - " float4 Texture : TEXCOORD0;\n" + " float2 Texture : TEXCOORD;\n" "};\n" "\n" "struct VS_OUTPUT\n" "{\n" " float4 Position: SV_POSITION;\n" - " float4 Texture: TEXCOORD0;\n" + " float2 Texture: TEXCOORD;\n" "};\n" "\n" "VS_OUTPUT main(VS_INPUT input)\n" @@ -79,10 +76,9 @@ "}\n"; /* *INDENT-ON* */ -struct _GstD3D11OverlayCompositor +struct _GstD3D11OverlayCompositorPrivate { - GstD3D11Device *device; - GstVideoInfo out_info; + GstVideoInfo info; D3D11_VIEWPORT viewport; @@ -102,14 +98,58 @@ GstVideoOverlayRectangle *overlay_rect; ID3D11Texture2D *texture; ID3D11ShaderResourceView *srv; - GstD3D11Quad *quad; + ID3D11Buffer *vertex_buffer; } GstD3D11CompositionOverlay; +static void gst_d3d11_overlay_compositor_dispose (GObject * object); +static void +gst_d3d11_overlay_compositor_free_overlays (GstD3D11OverlayCompositor * self); + +#define gst_d3d11_overlay_compositor_parent_class parent_class +G_DEFINE_TYPE_WITH_PRIVATE (GstD3D11OverlayCompositor, + gst_d3d11_overlay_compositor, GST_TYPE_OBJECT); + +static void +gst_d3d11_overlay_compositor_class_init (GstD3D11OverlayCompositorClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = gst_d3d11_overlay_compositor_dispose; +} + +static void +gst_d3d11_overlay_compositor_init (GstD3D11OverlayCompositor * self) +{ + self->priv = (GstD3D11OverlayCompositorPrivate *) + gst_d3d11_overlay_compositor_get_instance_private (self); +} + +static void +gst_d3d11_overlay_compositor_dispose (GObject * object) +{ + GstD3D11OverlayCompositor *self = GST_D3D11_OVERLAY_COMPOSITOR (object); + GstD3D11OverlayCompositorPrivate *priv = self->priv; + + gst_d3d11_overlay_compositor_free_overlays (self); + + GST_D3D11_CLEAR_COM (priv->ps); + GST_D3D11_CLEAR_COM (priv->vs); + GST_D3D11_CLEAR_COM (priv->layout); + GST_D3D11_CLEAR_COM (priv->sampler); + GST_D3D11_CLEAR_COM (priv->blend); + GST_D3D11_CLEAR_COM (priv->index_buffer); + + gst_clear_object (&self->device); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + static GstD3D11CompositionOverlay * gst_d3d11_composition_overlay_new (GstD3D11OverlayCompositor * self, GstVideoOverlayRectangle * overlay_rect) { - GstD3D11CompositionOverlay *overlay = NULL; + GstD3D11OverlayCompositorPrivate *priv = self->priv; + GstD3D11CompositionOverlay *overlay = nullptr; gint x, y; guint width, height; D3D11_SUBRESOURCE_DATA subresource_data; @@ -127,16 +167,11 @@ ID3D11Device *device_handle; ID3D11DeviceContext *context_handle; GstD3D11Device *device = self->device; - const guint index_count = 2 * 3; FLOAT x1, y1, x2, y2; gdouble val; - /* *INDENT-OFF* */ - ComPtr<ID3D11Texture2D> texture; - ComPtr<ID3D11ShaderResourceView> srv; - ComPtr<ID3D11Buffer> vertex_buffer; - /* *INDENT-ON* */ - - g_return_val_if_fail (overlay_rect != NULL, NULL); + ComPtr < ID3D11Texture2D > texture; + ComPtr < ID3D11ShaderResourceView > srv; + ComPtr < ID3D11Buffer > vertex_buffer; memset (&subresource_data, 0, sizeof (subresource_data)); memset (&texture_desc, 0, sizeof (texture_desc)); @@ -148,27 +183,27 @@ if (!gst_video_overlay_rectangle_get_render_rectangle (overlay_rect, &x, &y, &width, &height)) { - GST_ERROR ("Failed to get render rectangle"); - return NULL; + GST_ERROR_OBJECT (self, "Failed to get render rectangle"); + return nullptr; } buf = gst_video_overlay_rectangle_get_pixels_unscaled_argb (overlay_rect, GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE); if (!buf) { - GST_ERROR ("Failed to get overlay buffer"); - return NULL; + GST_ERROR_OBJECT (self, "Failed to get overlay buffer"); + return nullptr; } vmeta = gst_buffer_get_video_meta (buf); if (!vmeta) { - GST_ERROR ("Failed to get video meta"); - return NULL; + GST_ERROR_OBJECT (self, "Failed to get video meta"); + return nullptr; } if (!gst_video_meta_map (vmeta, 0, &info, (gpointer *) & data, &stride, GST_MAP_READ)) { - GST_ERROR ("Failed to map"); - return NULL; + GST_ERROR_OBJECT (self, "Failed to map"); + return nullptr; } /* Do create texture and upload data at once, for create immutable texture */ @@ -180,7 +215,6 @@ texture_desc.Height = height; texture_desc.MipLevels = 1; texture_desc.ArraySize = 1; - /* FIXME: need to consider non-BGRA ? */ texture_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; texture_desc.SampleDesc.Count = 1; texture_desc.SampleDesc.Quality = 0; @@ -193,8 +227,8 @@ gst_video_meta_unmap (vmeta, 0, &info); if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Failed to create texture"); - return NULL; + GST_ERROR_OBJECT (self, "Failed to create texture"); + return nullptr; } srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; @@ -203,8 +237,8 @@ hr = device_handle->CreateShaderResourceView (texture.Get (), &srv_desc, &srv); if (!gst_d3d11_result (hr, device) || !srv) { - GST_ERROR ("Failed to create shader resource view"); - return NULL; + GST_ERROR_OBJECT (self, "Failed to create shader resource view"); + return nullptr; } buffer_desc.Usage = D3D11_USAGE_DYNAMIC; @@ -212,79 +246,74 @@ buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - hr = device_handle->CreateBuffer (&buffer_desc, NULL, &vertex_buffer); + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &vertex_buffer); if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't create vertex buffer, hr: 0x%x", (guint) hr); - return NULL; + GST_ERROR_OBJECT (self, + "Couldn't create vertex buffer, hr: 0x%x", (guint) hr); + return nullptr; } - gst_d3d11_device_lock (device); + GstD3D11DeviceLockGuard lk (device); hr = context_handle->Map (vertex_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, &map); if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't map vertex buffer, hr: 0x%x", (guint) hr); - gst_d3d11_device_unlock (device); - return NULL; + GST_ERROR_OBJECT (self, "Couldn't map vertex buffer, hr: 0x%x", (guint) hr); + return nullptr; } vertex_data = (VertexData *) map.pData; /* bottom left */ - gst_util_fraction_to_double (x, GST_VIDEO_INFO_WIDTH (&self->out_info), &val); + gst_util_fraction_to_double (x, GST_VIDEO_INFO_WIDTH (&priv->info), &val); x1 = (val * 2.0f) - 1.0f; gst_util_fraction_to_double (y + height, - GST_VIDEO_INFO_HEIGHT (&self->out_info), &val); + GST_VIDEO_INFO_HEIGHT (&priv->info), &val); y1 = (val * -2.0f) + 1.0f; /* top right */ gst_util_fraction_to_double (x + width, - GST_VIDEO_INFO_WIDTH (&self->out_info), &val); + GST_VIDEO_INFO_WIDTH (&priv->info), &val); x2 = (val * 2.0f) - 1.0f; - gst_util_fraction_to_double (y, - GST_VIDEO_INFO_HEIGHT (&self->out_info), &val); + gst_util_fraction_to_double (y, GST_VIDEO_INFO_HEIGHT (&priv->info), &val); y2 = (val * -2.0f) + 1.0f; /* bottom left */ vertex_data0.position.x = x1; vertex_data0.position.y = y1; vertex_data0.position.z = 0.0f; - vertex_data0.texture.x = 0.0f; - vertex_data0.texture.y = 1.0f; + vertex_data0.texture.u = 0.0f; + vertex_data0.texture.v = 1.0f; /* top left */ vertex_data1.position.x = x1; vertex_data1.position.y = y2; vertex_data1.position.z = 0.0f; - vertex_data1.texture.x = 0.0f; - vertex_data1.texture.y = 0.0f; + vertex_data1.texture.u = 0.0f; + vertex_data1.texture.v = 0.0f; /* top right */ vertex_data2.position.x = x2; vertex_data2.position.y = y2; vertex_data2.position.z = 0.0f; - vertex_data2.texture.x = 1.0f; - vertex_data2.texture.y = 0.0f; + vertex_data2.texture.u = 1.0f; + vertex_data2.texture.v = 0.0f; /* bottom right */ vertex_data3.position.x = x2; vertex_data3.position.y = y1; vertex_data3.position.z = 0.0f; - vertex_data3.texture.x = 1.0f; - vertex_data3.texture.y = 1.0f; + vertex_data3.texture.u = 1.0f; + vertex_data3.texture.v = 1.0f; context_handle->Unmap (vertex_buffer.Get (), 0); - gst_d3d11_device_unlock (device); overlay = g_new0 (GstD3D11CompositionOverlay, 1); overlay->overlay_rect = gst_video_overlay_rectangle_ref (overlay_rect); overlay->texture = texture.Detach (); overlay->srv = srv.Detach (); - overlay->quad = gst_d3d11_quad_new (device, - self->ps, self->vs, self->layout, nullptr, 0, - vertex_buffer.Get (), sizeof (VertexData), - self->index_buffer, DXGI_FORMAT_R16_UINT, index_count); + overlay->vertex_buffer = vertex_buffer.Detach (); return overlay; } @@ -300,17 +329,17 @@ GST_D3D11_CLEAR_COM (overlay->srv); GST_D3D11_CLEAR_COM (overlay->texture); - - if (overlay->quad) - gst_d3d11_quad_free (overlay->quad); + GST_D3D11_CLEAR_COM (overlay->vertex_buffer); g_free (overlay); } static gboolean -gst_d3d11_overlay_compositor_setup_shader (GstD3D11OverlayCompositor * self, - GstD3D11Device * device) +gst_d3d11_overlay_compositor_setup_shader (GstD3D11OverlayCompositor * self) { + GstD3D11OverlayCompositorPrivate *priv = self->priv; + GstVideoInfo *info = &priv->info; + GstD3D11Device *device = self->device; HRESULT hr; D3D11_SAMPLER_DESC sampler_desc; D3D11_INPUT_ELEMENT_DESC input_desc2; @@ -320,15 +349,12 @@ WORD *indices; ID3D11Device *device_handle; ID3D11DeviceContext *context_handle; - /* *INDENT-OFF* */ - ComPtr<ID3D11PixelShader> ps; - ComPtr<ID3D11VertexShader> vs; - ComPtr<ID3D11InputLayout> layout; - ComPtr<ID3D11SamplerState> sampler; - ComPtr<ID3D11BlendState> blend; - ComPtr<ID3D11Buffer> index_buffer; - /* *INDENT-ON* */ - const guint index_count = 2 * 3; + ComPtr < ID3D11PixelShader > ps; + ComPtr < ID3D11VertexShader > vs; + ComPtr < ID3D11InputLayout > layout; + ComPtr < ID3D11SamplerState > sampler; + ComPtr < ID3D11BlendState > blend; + ComPtr < ID3D11Buffer > index_buffer; memset (&sampler_desc, 0, sizeof (sampler_desc)); memset (input_desc, 0, sizeof (input_desc)); @@ -349,14 +375,15 @@ hr = device_handle->CreateSamplerState (&sampler_desc, &sampler); if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't create sampler state, hr: 0x%x", (guint) hr); + GST_ERROR_OBJECT (self, "Couldn't create sampler state, hr: 0x%x", + (guint) hr); return FALSE; } - GST_LOG ("Create Pixel Shader \n%s", templ_pixel_shader); - - if (!gst_d3d11_create_pixel_shader (device, templ_pixel_shader, &ps)) { - GST_ERROR ("Couldn't create pixel shader"); + hr = gst_d3d11_create_pixel_shader_simple (device, + templ_pixel_shader, "main", &ps); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Couldn't create pixel shader"); return FALSE; } @@ -376,9 +403,10 @@ input_desc1.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; input_desc1.InstanceDataStepRate = 0; - if (!gst_d3d11_create_vertex_shader (device, templ_vertex_shader, - input_desc, G_N_ELEMENTS (input_desc), &vs, &layout)) { - GST_ERROR ("Couldn't vertex pixel shader"); + hr = gst_d3d11_create_vertex_shader_simple (device, templ_vertex_shader, + "main", input_desc, G_N_ELEMENTS (input_desc), &vs, &layout); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Couldn't vertex pixel shader"); return FALSE; } @@ -396,28 +424,29 @@ hr = device_handle->CreateBlendState (&blend_desc, &blend); if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't create blend staten, hr: 0x%x", (guint) hr); + GST_ERROR_OBJECT (self, + "Couldn't create blend staten, hr: 0x%x", (guint) hr); return FALSE; } buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = sizeof (WORD) * index_count; + buffer_desc.ByteWidth = sizeof (WORD) * 6; buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - hr = device_handle->CreateBuffer (&buffer_desc, NULL, &index_buffer); + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &index_buffer); if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't create index buffer, hr: 0x%x", (guint) hr); + GST_ERROR_OBJECT (self, + "Couldn't create index buffer, hr: 0x%x", (guint) hr); return FALSE; } - gst_d3d11_device_lock (device); + GstD3D11DeviceLockGuard lk (device); hr = context_handle->Map (index_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, &map); if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't map index buffer, hr: 0x%x", (guint) hr); - gst_d3d11_device_unlock (device); + GST_ERROR_OBJECT (self, "Couldn't map index buffer, hr: 0x%x", (guint) hr); return FALSE; } @@ -433,64 +462,61 @@ indices5 = 2; /* top right */ context_handle->Unmap (index_buffer.Get (), 0); - gst_d3d11_device_unlock (device); - self->ps = ps.Detach (); - self->vs = vs.Detach (); - self->layout = layout.Detach (); - self->sampler = sampler.Detach (); - self->blend = blend.Detach (); - self->index_buffer = index_buffer.Detach (); + priv->ps = ps.Detach (); + priv->vs = vs.Detach (); + priv->layout = layout.Detach (); + priv->sampler = sampler.Detach (); + priv->blend = blend.Detach (); + priv->index_buffer = index_buffer.Detach (); + + priv->viewport.TopLeftX = 0; + priv->viewport.TopLeftY = 0; + priv->viewport.Width = GST_VIDEO_INFO_WIDTH (info); + priv->viewport.Height = GST_VIDEO_INFO_HEIGHT (info); + priv->viewport.MinDepth = 0.0f; + priv->viewport.MaxDepth = 1.0f; return TRUE; } - GstD3D11OverlayCompositor * gst_d3d11_overlay_compositor_new (GstD3D11Device * device, - GstVideoInfo * out_info) + const GstVideoInfo * info) { - GstD3D11OverlayCompositor *compositor = NULL; + GstD3D11OverlayCompositor *self = nullptr; + GstD3D11OverlayCompositorPrivate *priv; - g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL); - g_return_val_if_fail (out_info != NULL, NULL); + g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), nullptr); + g_return_val_if_fail (info != nullptr, nullptr); - compositor = g_new0 (GstD3D11OverlayCompositor, 1); + self = (GstD3D11OverlayCompositor *) + g_object_new (GST_TYPE_D3D11_OVERLAY_COMPOSITOR, nullptr); + gst_object_ref_sink (self); + priv = self->priv; - if (!gst_d3d11_overlay_compositor_setup_shader (compositor, device)) { - gst_d3d11_overlay_compositor_free (compositor); - return NULL; - } - - compositor->device = (GstD3D11Device *) gst_object_ref (device); - compositor->out_info = *out_info; + self->device = (GstD3D11Device *) gst_object_ref (device); + priv->info = *info; - compositor->viewport.TopLeftX = 0; - compositor->viewport.TopLeftY = 0; - compositor->viewport.Width = GST_VIDEO_INFO_WIDTH (out_info); - compositor->viewport.Height = GST_VIDEO_INFO_HEIGHT (out_info); - compositor->viewport.MinDepth = 0.0f; - compositor->viewport.MaxDepth = 1.0f; + if (!gst_d3d11_overlay_compositor_setup_shader (self)) { + gst_object_unref (self); + return nullptr; + } - return compositor; + return self; } -void -gst_d3d11_overlay_compositor_free (GstD3D11OverlayCompositor * compositor) +static void +gst_d3d11_overlay_compositor_free_overlays (GstD3D11OverlayCompositor * self) { - g_return_if_fail (compositor != NULL); - - gst_d3d11_overlay_compositor_free_overlays (compositor); + GstD3D11OverlayCompositorPrivate *priv = self->priv; - GST_D3D11_CLEAR_COM (compositor->ps); - GST_D3D11_CLEAR_COM (compositor->vs); - GST_D3D11_CLEAR_COM (compositor->layout); - GST_D3D11_CLEAR_COM (compositor->sampler); - GST_D3D11_CLEAR_COM (compositor->blend); - GST_D3D11_CLEAR_COM (compositor->index_buffer); + if (priv->overlays) { + g_list_free_full (priv->overlays, + (GDestroyNotify) gst_d3d11_composition_overlay_free); - gst_clear_object (&compositor->device); - g_free (compositor); + priv->overlays = nullptr; + } } static gint @@ -519,15 +545,17 @@ gst_d3d11_overlay_compositor_upload (GstD3D11OverlayCompositor * compositor, GstBuffer * buf) { + GstD3D11OverlayCompositorPrivate *priv; GstVideoOverlayCompositionMeta *meta; gint i, num_overlays; GList *iter; - g_return_val_if_fail (compositor != NULL, FALSE); + g_return_val_if_fail (compositor != nullptr, FALSE); g_return_val_if_fail (GST_IS_BUFFER (buf), FALSE); - meta = gst_buffer_get_video_overlay_composition_meta (buf); + priv = compositor->priv; + meta = gst_buffer_get_video_overlay_composition_meta (buf); if (!meta) { gst_d3d11_overlay_compositor_free_overlays (compositor); return TRUE; @@ -539,35 +567,35 @@ return TRUE; } - GST_LOG ("Upload %d overlay rectangles", num_overlays); + GST_LOG_OBJECT (compositor, "Upload %d overlay rectangles", num_overlays); /* Upload new overlay */ for (i = 0; i < num_overlays; i++) { GstVideoOverlayRectangle *rectangle = gst_video_overlay_composition_get_rectangle (meta->overlay, i); - if (!g_list_find_custom (compositor->overlays, + if (!g_list_find_custom (priv->overlays, rectangle, (GCompareFunc) find_in_compositor)) { - GstD3D11CompositionOverlay *overlay = NULL; + GstD3D11CompositionOverlay *overlay = nullptr; overlay = gst_d3d11_composition_overlay_new (compositor, rectangle); if (!overlay) return FALSE; - compositor->overlays = g_list_append (compositor->overlays, overlay); + priv->overlays = g_list_append (priv->overlays, overlay); } } /* Remove old overlay */ - iter = compositor->overlays; + iter = priv->overlays; while (iter) { GstD3D11CompositionOverlay *overlay = (GstD3D11CompositionOverlay *) iter->data; GList *next = iter->next; if (!is_in_video_overlay_composition (meta->overlay, overlay)) { - compositor->overlays = g_list_delete_link (compositor->overlays, iter); + priv->overlays = g_list_delete_link (priv->overlays, iter); gst_d3d11_composition_overlay_free (overlay); } @@ -577,28 +605,14 @@ return TRUE; } -void -gst_d3d11_overlay_compositor_free_overlays (GstD3D11OverlayCompositor * - compositor) -{ - g_return_if_fail (compositor != NULL); - - if (compositor->overlays) { - g_list_free_full (compositor->overlays, - (GDestroyNotify) gst_d3d11_composition_overlay_free); - - compositor->overlays = NULL; - } -} - gboolean gst_d3d11_overlay_compositor_update_viewport (GstD3D11OverlayCompositor * compositor, D3D11_VIEWPORT * viewport) { - g_return_val_if_fail (compositor != NULL, FALSE); - g_return_val_if_fail (viewport != NULL, FALSE); + g_return_val_if_fail (GST_IS_D3D11_OVERLAY_COMPOSITOR (compositor), FALSE); + g_return_val_if_fail (viewport != nullptr, FALSE); - compositor->viewport = *viewport; + compositor->priv->viewport = *viewport; return TRUE; } @@ -607,39 +621,56 @@ gst_d3d11_overlay_compositor_draw (GstD3D11OverlayCompositor * compositor, ID3D11RenderTargetView * rtvGST_VIDEO_MAX_PLANES) { - gboolean ret = TRUE; - - g_return_val_if_fail (compositor != NULL, FALSE); - g_return_val_if_fail (rtv != NULL, FALSE); + g_return_val_if_fail (compositor != nullptr, FALSE); + g_return_val_if_fail (rtv != nullptr, FALSE); - gst_d3d11_device_lock (compositor->device); - ret = gst_d3d11_overlay_compositor_draw_unlocked (compositor, rtv); - gst_d3d11_device_unlock (compositor->device); - - return ret; + GstD3D11DeviceLockGuard lk (compositor->device); + return gst_d3d11_overlay_compositor_draw_unlocked (compositor, rtv); } gboolean gst_d3d11_overlay_compositor_draw_unlocked (GstD3D11OverlayCompositor * compositor, ID3D11RenderTargetView * rtvGST_VIDEO_MAX_PLANES) { - gboolean ret = TRUE; + GstD3D11OverlayCompositorPrivate *priv; GList *iter; + ID3D11DeviceContext *context; + ID3D11ShaderResourceView *clear_viewGST_VIDEO_MAX_PLANES = { nullptr, }; + UINT strides = sizeof (VertexData); + UINT offsets = 0; + + g_return_val_if_fail (compositor != nullptr, FALSE); + g_return_val_if_fail (rtv != nullptr, FALSE); + + priv = compositor->priv; - g_return_val_if_fail (compositor != NULL, FALSE); - g_return_val_if_fail (rtv != NULL, FALSE); + if (!priv->overlays) + return TRUE; - for (iter = compositor->overlays; iter; iter = g_list_next (iter)) { + context = gst_d3d11_device_get_device_context_handle (compositor->device); + context->IASetPrimitiveTopology (D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + context->IASetInputLayout (priv->layout); + context->IASetIndexBuffer (priv->index_buffer, DXGI_FORMAT_R16_UINT, 0); + context->PSSetSamplers (0, 1, &priv->sampler); + context->VSSetShader (priv->vs, nullptr, 0); + context->PSSetShader (priv->ps, nullptr, 0); + context->RSSetViewports (1, &priv->viewport); + context->OMSetRenderTargets (1, rtv, nullptr); + context->OMSetBlendState (priv->blend, nullptr, 0xffffffff); + + for (iter = priv->overlays; iter; iter = g_list_next (iter)) { GstD3D11CompositionOverlay *overlay = (GstD3D11CompositionOverlay *) iter->data; - ret = gst_d3d11_draw_quad_unlocked (overlay->quad, - &compositor->viewport, 1, &overlay->srv, 1, rtv, 1, - compositor->blend, NULL, &compositor->sampler, 1); + context->PSSetShaderResources (0, 1, &overlay->srv); + context->IASetVertexBuffers (0, + 1, &overlay->vertex_buffer, &strides, &offsets); - if (!ret) - break; + context->DrawIndexed (6, 0, 0); } - return ret; + context->PSSetShaderResources (0, 1, clear_view); + context->OMSetRenderTargets (0, nullptr, nullptr); + + return TRUE; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11overlaycompositor.h -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11overlaycompositor.h
Changed
@@ -26,18 +26,45 @@ G_BEGIN_DECLS +#define GST_TYPE_D3D11_OVERLAY_COMPOSITOR (gst_d3d11_overlay_compositor_get_type()) +#define GST_D3D11_OVERLAY_COMPOSITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_D3D11_OVERLAY_COMPOSITOR,GstD3D11OverlayCompositor)) +#define GST_D3D11_OVERLAY_COMPOSITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_D3D11_OVERLAY_COMPOSITOR,GstD3D11OverlayCompositorClass)) +#define GST_D3D11_OVERLAY_COMPOSITOR_GET_CLASS(obj) (GST_D3D11_OVERLAY_COMPOSITOR_CLASS(G_OBJECT_GET_CLASS(obj))) +#define GST_IS_D3D11_OVERLAY_COMPOSITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_D3D11_OVERLAY_COMPOSITOR)) +#define GST_IS_D3D11_OVERLAY_COMPOSITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_D3D11_OVERLAY_COMPOSITOR)) +#define GST_D3D11_OVERLAY_COMPOSITOR_CAST(obj) ((GstD3D11OverlayCompositor*)(obj)) + typedef struct _GstD3D11OverlayCompositor GstD3D11OverlayCompositor; +typedef struct _GstD3D11OverlayCompositorClass GstD3D11OverlayCompositorClass; +typedef struct _GstD3D11OverlayCompositorPrivate GstD3D11OverlayCompositorPrivate; -GstD3D11OverlayCompositor * gst_d3d11_overlay_compositor_new (GstD3D11Device * device, - GstVideoInfo * out_info); +struct _GstD3D11OverlayCompositor +{ + GstObject parent; + + GstD3D11Device *device; + + /*< private >*/ + GstD3D11OverlayCompositorPrivate *priv; + gpointer _gst_reservedGST_PADDING; +}; + +struct _GstD3D11OverlayCompositorClass +{ + GstObjectClass parent_class; -void gst_d3d11_overlay_compositor_free (GstD3D11OverlayCompositor * compositor); + /*< private >*/ + gpointer _gst_reservedGST_PADDING; +}; + +GType gst_d3d11_overlay_compositor_get_type (void); + +GstD3D11OverlayCompositor * gst_d3d11_overlay_compositor_new (GstD3D11Device * device, + const GstVideoInfo * info); gboolean gst_d3d11_overlay_compositor_upload (GstD3D11OverlayCompositor * compositor, GstBuffer * buf); -void gst_d3d11_overlay_compositor_free_overlays (GstD3D11OverlayCompositor * compositor); - gboolean gst_d3d11_overlay_compositor_update_viewport (GstD3D11OverlayCompositor * compositor, D3D11_VIEWPORT * viewport);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11pluginutils.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11pluginutils.cpp
Changed
@@ -36,9 +36,7 @@ void gst_d3d11_plugin_utils_init (D3D_FEATURE_LEVEL feature_level) { - static gsize _init_once = 0; - - if (g_once_init_enter (&_init_once)) { + GST_D3D11_CALL_ONCE_BEGIN { /* https://docs.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-devices-downlevel-intro */ if (feature_level >= D3D_FEATURE_LEVEL_11_0) _gst_d3d11_texture_max_dimension = 16384; @@ -46,9 +44,8 @@ _gst_d3d11_texture_max_dimension = 8192; else _gst_d3d11_texture_max_dimension = 4096; - - g_once_init_leave (&_init_once, 1); } + GST_D3D11_CALL_ONCE_END; } GstCaps * @@ -75,19 +72,16 @@ gboolean gst_d3d11_is_windows_8_or_greater (void) { - static gsize version_once = 0; static gboolean ret = FALSE; - if (g_once_init_enter (&version_once)) { + GST_D3D11_CALL_ONCE_BEGIN { #if (!GST_D3D11_WINAPI_ONLY_APP) if (IsWindows8OrGreater ()) ret = TRUE; #else ret = TRUE; #endif - - g_once_init_leave (&version_once, 1); - } + } GST_D3D11_CALL_ONCE_END; return ret; } @@ -133,7 +127,6 @@ return vendor; } -#if (GST_D3D11_DXGI_HEADER_VERSION >= 5) gboolean gst_d3d11_hdr_meta_data_to_dxgi (GstVideoMasteringDisplayInfo * minfo, GstVideoContentLightLevel * cll, DXGI_HDR_METADATA_HDR10 * dxgi_hdr10) @@ -163,417 +156,45 @@ return TRUE; } -#endif - -#if (GST_D3D11_DXGI_HEADER_VERSION >= 4) -typedef enum -{ - GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 = 0, - GST_DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 = 1, - GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709 = 2, - GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020 = 3, - GST_DXGI_COLOR_SPACE_RESERVED = 4, - GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601 = 5, - GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601 = 6, - GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601 = 7, - GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 = 8, - GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709 = 9, - GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020 = 10, - GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020 = 11, - GST_DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 = 12, - GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020 = 13, - GST_DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020 = 14, - GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020 = 15, - GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020 = 16, - GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020 = 17, - GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020 = 18, - GST_DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020 = 19, - GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709 = 20, - GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020 = 21, - GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P709 = 22, - GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P2020 = 23, - GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_TOPLEFT_P2020 = 24, - GST_DXGI_COLOR_SPACE_CUSTOM = 0xFFFFFFFF -} GST_DXGI_COLOR_SPACE_TYPE; - -/* https://docs.microsoft.com/en-us/windows/win32/api/dxgicommon/ne-dxgicommon-dxgi_color_space_type */ - -#define MAKE_COLOR_MAP(d,r,m,t,p) \ - { GST_DXGI_COLOR_SPACE_ ##d, GST_VIDEO_COLOR_RANGE ##r, \ - GST_VIDEO_COLOR_MATRIX_ ##m, GST_VIDEO_TRANSFER_ ##t, \ - GST_VIDEO_COLOR_PRIMARIES_ ##p } - -static const GstDxgiColorSpace rgb_colorspace_map = { - /* 1) DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 - * 2) DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 - * 3) DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709 - * 4) DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020 - * 5) DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 - * 6) DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020 - * 7) DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020 - * 8) DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709 - * 9) DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020 - * - * NOTE: if G24 (Gamma 2.4, SRGB) transfer is not defined, - * it will be approximated as G22. - * NOTE: BT470BG ~= BT709 - */ - - /* 1) RGB_FULL_G22_NONE_P709 */ - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT709, BT709), - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT601, BT709), - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT2020_10, BT709), - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT2020_12, BT709), - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT709, BT470BG), - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT601, BT470BG), - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT2020_10, BT470BG), - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT2020_12, BT470BG), - - /* 1-1) Approximation for RGB_FULL_G22_NONE_P709 */ - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, SRGB, BT709), - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, SRGB, BT470BG), - - /* 2) RGB_FULL_G10_NONE_P709 */ - MAKE_COLOR_MAP (RGB_FULL_G10_NONE_P709, _0_255, UNKNOWN, GAMMA10, BT709), - MAKE_COLOR_MAP (RGB_FULL_G10_NONE_P709, _0_255, UNKNOWN, GAMMA10, BT470BG), - - /* 3) RGB_STUDIO_G22_NONE_P709 */ - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT709, BT709), - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT601, BT709), - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT2020_10, BT709), - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT2020_12, BT709), - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT709, BT470BG), - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT601, BT470BG), - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT2020_10, - BT470BG), - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT2020_12, - BT470BG), - - /* 3-1) Approximation for RGB_STUDIO_G22_NONE_P709 */ - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, SRGB, BT709), - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, SRGB, BT470BG), - - /* 4) RGB_STUDIO_G22_NONE_P2020 */ - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P2020, _16_235, UNKNOWN, BT709, BT2020), - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P2020, _16_235, UNKNOWN, BT601, BT2020), - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P2020, _16_235, UNKNOWN, BT2020_10, - BT2020), - MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P2020, _16_235, UNKNOWN, BT2020_12, - BT2020), - - /* 5) RGB_FULL_G2084_NONE_P2020 */ - MAKE_COLOR_MAP (RGB_FULL_G2084_NONE_P2020, _0_255, UNKNOWN, SMPTE2084, - BT2020), - - /* 6) RGB_STUDIO_G2084_NONE_P2020 */ - MAKE_COLOR_MAP (RGB_STUDIO_G2084_NONE_P2020, _16_235, UNKNOWN, SMPTE2084, - BT2020), - - /* 7) RGB_FULL_G22_NONE_P2020 */ - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P2020, _0_255, UNKNOWN, BT709, BT2020), - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P2020, _0_255, UNKNOWN, BT601, BT2020), - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P2020, _0_255, UNKNOWN, BT2020_10, BT2020), - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P2020, _0_255, UNKNOWN, BT2020_12, BT2020), - - /* 7-1) Approximation for RGB_FULL_G22_NONE_P2020 */ - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P2020, _0_255, UNKNOWN, SRGB, BT2020), - - /* 8) RGB_STUDIO_G24_NONE_P709 */ - MAKE_COLOR_MAP (RGB_STUDIO_G24_NONE_P709, _16_235, UNKNOWN, SRGB, BT709), - MAKE_COLOR_MAP (RGB_STUDIO_G24_NONE_P709, _16_235, UNKNOWN, SRGB, BT470BG), - - /* 9) RGB_STUDIO_G24_NONE_P2020 */ - MAKE_COLOR_MAP (RGB_STUDIO_G24_NONE_P2020, _16_235, UNKNOWN, SRGB, BT2020), -}; - -static const GstDxgiColorSpace yuv_colorspace_map = { - /* 1) YCBCR_FULL_G22_NONE_P709_X601 - * 2) YCBCR_STUDIO_G22_LEFT_P601 - * 3) YCBCR_FULL_G22_LEFT_P601 - * 4) YCBCR_STUDIO_G22_LEFT_P709 - * 5) YCBCR_FULL_G22_LEFT_P709 - * 6) YCBCR_STUDIO_G22_LEFT_P2020 - * 7) YCBCR_FULL_G22_LEFT_P2020 - * 8) YCBCR_STUDIO_G2084_LEFT_P2020 - * 9) YCBCR_STUDIO_G22_TOPLEFT_P2020 - * 10) YCBCR_STUDIO_G2084_TOPLEFT_P2020 - * 11) YCBCR_STUDIO_GHLG_TOPLEFT_P2020 - * 12) YCBCR_FULL_GHLG_TOPLEFT_P2020 - * 13) YCBCR_STUDIO_G24_LEFT_P709 - * 14) YCBCR_STUDIO_G24_LEFT_P2020 - * 15) YCBCR_STUDIO_G24_TOPLEFT_P2020 - * - * NOTE: BT470BG ~= BT709 - */ - - /* 1) YCBCR_FULL_G22_NONE_P709_X601 */ - MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT709, BT709), - MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT601, BT709), - MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT2020_10, - BT709), - MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT2020_12, - BT709), - MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT709, BT470BG), - MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT601, BT470BG), - MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT2020_10, - BT470BG), - MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT2020_12, - BT470BG), - - /* 2) YCBCR_STUDIO_G22_LEFT_P601 */ - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT601, SMPTE170M), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT709, SMPTE170M), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT2020_10, - SMPTE170M), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT2020_12, - SMPTE170M), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT601, SMPTE240M), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT709, SMPTE240M), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT2020_10, - SMPTE240M), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT2020_12, - SMPTE240M), - - /* 3) YCBCR_FULL_G22_LEFT_P601 */ - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT601, SMPTE170M), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT709, SMPTE170M), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT2020_10, - SMPTE170M), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT2020_12, - SMPTE170M), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT601, SMPTE240M), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT709, SMPTE240M), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT2020_10, - SMPTE240M), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT2020_12, - SMPTE240M), - - /* 4) YCBCR_STUDIO_G22_LEFT_P709 */ - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT709, BT709), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT601, BT709), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT2020_10, - BT709), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT2020_12, - BT709), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT709, BT470BG), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT601, BT470BG), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT2020_10, - BT470BG), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT2020_12, - BT470BG), - - /* 5) YCBCR_FULL_G22_LEFT_P709 */ - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT709, BT709), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT601, BT709), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT2020_10, BT709), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT2020_12, BT709), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT709, BT470BG), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT601, BT470BG), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT2020_10, BT470BG), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT2020_12, BT470BG), - - /* 6) YCBCR_STUDIO_G22_LEFT_P2020 */ - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P2020, _16_235, BT2020, BT709, BT2020), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P2020, _16_235, BT2020, BT601, BT2020), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P2020, _16_235, BT2020, BT2020_10, - BT2020), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P2020, _16_235, BT2020, BT2020_12, - BT2020), - - /* 7) YCBCR_FULL_G22_LEFT_P2020 */ - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P2020, _0_255, BT2020, BT709, BT2020), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P2020, _0_255, BT2020, BT601, BT2020), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P2020, _0_255, BT2020, BT2020_10, - BT2020), - MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P2020, _0_255, BT2020, BT2020_12, - BT2020), - - /* 8) YCBCR_STUDIO_G2084_LEFT_P2020 */ - MAKE_COLOR_MAP (YCBCR_STUDIO_G2084_LEFT_P2020, _16_235, BT2020, SMPTE2084, - BT2020), - - /* 9) YCBCR_STUDIO_G22_TOPLEFT_P2020 */ - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_TOPLEFT_P2020, _16_235, BT2020, BT2020_10, - BT2020), - MAKE_COLOR_MAP (YCBCR_STUDIO_G22_TOPLEFT_P2020, _16_235, BT2020, BT2020_12, - BT2020), - - /* 10) YCBCR_STUDIO_G2084_TOPLEFT_P2020 */ - /* FIXME: check chroma-site to differentiate this from - * YCBCR_STUDIO_G2084_LEFT_P2020 */ - MAKE_COLOR_MAP (YCBCR_STUDIO_G2084_TOPLEFT_P2020, _16_235, BT2020, SMPTE2084, - BT2020), - - /* 11) YCBCR_STUDIO_GHLG_TOPLEFT_P2020 */ - MAKE_COLOR_MAP (YCBCR_STUDIO_GHLG_TOPLEFT_P2020, _16_235, BT2020, - ARIB_STD_B67, BT2020), - - /* 12) YCBCR_FULL_GHLG_TOPLEFT_P2020 */ - MAKE_COLOR_MAP (YCBCR_FULL_GHLG_TOPLEFT_P2020, _0_255, BT2020, ARIB_STD_B67, - BT2020), - - /* 13) YCBCR_STUDIO_G24_LEFT_P709 */ - MAKE_COLOR_MAP (YCBCR_STUDIO_G24_LEFT_P709, _16_235, BT709, SRGB, BT709), - - /* 14) YCBCR_STUDIO_G24_LEFT_P2020 */ - MAKE_COLOR_MAP (YCBCR_STUDIO_G24_LEFT_P2020, _16_235, BT2020, SRGB, BT2020), - - /* 15) YCBCR_STUDIO_G24_TOPLEFT_P2020 */ - /* FIXME: check chroma-site to differentiate this from - * YCBCR_STUDIO_G24_LEFT_P2020 */ - MAKE_COLOR_MAP (YCBCR_STUDIO_G24_TOPLEFT_P2020, _16_235, BT2020, SRGB, - BT2020), -}; - -#define SCORE_RANGE_MISMATCH 5 -#define SCORE_MATRIX_MISMATCH 5 -#define SCORE_TRANSFER_MISMATCH 5 -#define SCORE_PRIMARY_MISMATCH 10 - -static gint -get_score (GstVideoInfo * info, const GstDxgiColorSpace * color_map, - gboolean is_yuv) -{ - gint loss = 0; - GstVideoColorimetry *color = &info->colorimetry; - - if (color->range != color_map->range) - loss += SCORE_RANGE_MISMATCH; - - if (is_yuv && color->matrix != color_map->matrix) - loss += SCORE_MATRIX_MISMATCH; - - if (color->transfer != color_map->transfer) - loss += SCORE_TRANSFER_MISMATCH; - - if (color->primaries != color_map->primaries) - loss += SCORE_PRIMARY_MISMATCH; - - return loss; -} - -static const GstDxgiColorSpace * -gst_d3d11_video_info_to_dxgi_color_space_rgb (GstVideoInfo * info) -{ - gint best_score = G_MAXINT; - gint score; - guint i; - const GstDxgiColorSpace *colorspace = NULL; - - for (i = 0; i < G_N_ELEMENTS (rgb_colorspace_map); i++) { - score = get_score (info, &rgb_colorspace_mapi, FALSE); - - if (score < best_score) { - best_score = score; - colorspace = &rgb_colorspace_mapi; - - if (score == 0) - break; - } - } - - return colorspace; -} - -static const GstDxgiColorSpace * -gst_d3d11_video_info_to_dxgi_color_space_yuv (GstVideoInfo * info) -{ - gint best_score = G_MAXINT; - gint score; - guint i; - const GstDxgiColorSpace *colorspace = NULL; - - for (i = 0; i < G_N_ELEMENTS (yuv_colorspace_map); i++) { - score = get_score (info, &yuv_colorspace_mapi, TRUE); - - if (score < best_score) { - best_score = score; - colorspace = &yuv_colorspace_mapi; - if (score == 0) - break; - } - } - - return colorspace; -} - -const GstDxgiColorSpace * -gst_d3d11_video_info_to_dxgi_color_space (GstVideoInfo * info) -{ - g_return_val_if_fail (info != NULL, NULL); - - if (GST_VIDEO_INFO_IS_RGB (info)) { - return gst_d3d11_video_info_to_dxgi_color_space_rgb (info); - } else if (GST_VIDEO_INFO_IS_YUV (info)) { - return gst_d3d11_video_info_to_dxgi_color_space_yuv (info); - } - - return NULL; -} - -const GstDxgiColorSpace * -gst_d3d11_find_swap_chain_color_space (GstVideoInfo * info, - IDXGISwapChain3 * swapchain) +gboolean +gst_d3d11_find_swap_chain_color_space (const GstVideoInfo * info, + IDXGISwapChain3 * swapchain, DXGI_COLOR_SPACE_TYPE * color_space) { - const GstDxgiColorSpace *colorspace = NULL; - gint best_score = G_MAXINT; - guint i; - /* list of tested display color spaces */ - static GST_DXGI_COLOR_SPACE_TYPE whitelist = { - GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709, - GST_DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709, - GST_DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020, - }; + UINT can_support = 0; + HRESULT hr; + DXGI_COLOR_SPACE_TYPE color; g_return_val_if_fail (info != NULL, FALSE); g_return_val_if_fail (swapchain != NULL, FALSE); + g_return_val_if_fail (color_space != NULL, FALSE); if (!GST_VIDEO_INFO_IS_RGB (info)) { GST_WARNING ("Swapchain colorspace should be RGB format"); return FALSE; } - for (i = 0; i < G_N_ELEMENTS (rgb_colorspace_map); i++) { - UINT can_support = 0; - HRESULT hr; - gint score; - gboolean valid = FALSE; - GST_DXGI_COLOR_SPACE_TYPE cur_type = - (GST_DXGI_COLOR_SPACE_TYPE) rgb_colorspace_mapi.dxgi_color_space_type; - - for (guint j = 0; j < G_N_ELEMENTS (whitelist); j++) { - if (whitelistj == cur_type) { - valid = TRUE; - break; - } + /* Select PQ color space only if input is also PQ */ + if (info->colorimetry.primaries == GST_VIDEO_COLOR_PRIMARIES_BT2020 && + info->colorimetry.transfer == GST_VIDEO_TRANSFER_SMPTE2084) { + color = (DXGI_COLOR_SPACE_TYPE) 12; + hr = swapchain->CheckColorSpaceSupport (color, &can_support); + if (SUCCEEDED (hr) && can_support) { + *color_space = color; + return TRUE; } + } - if (!valid) - continue; - - hr = swapchain->CheckColorSpaceSupport ((DXGI_COLOR_SPACE_TYPE) cur_type, - &can_support); - - if (FAILED (hr)) - continue; - - if ((can_support & DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT) == - DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT) { - score = get_score (info, &rgb_colorspace_mapi, FALSE); - - GST_DEBUG ("colorspace %d supported, score %d", cur_type, score); - - if (score < best_score) { - best_score = score; - colorspace = &rgb_colorspace_mapi; - } - } + /* otherwise use standard sRGB color space */ + color = (DXGI_COLOR_SPACE_TYPE) 0; + hr = swapchain->CheckColorSpaceSupport (color, &can_support); + if (SUCCEEDED (hr) && can_support) { + *color_space = color; + return TRUE; } - return colorspace; + return FALSE; } -#endif static void fill_staging_desc (const D3D11_TEXTURE2D_DESC * ref, @@ -597,13 +218,12 @@ { GstD3D11Memory *dmem; GstD3D11Device *device; - GstD3D11Allocator *alloc = NULL; GstBuffer *staging_buffer = NULL; gint strideGST_VIDEO_MAX_PLANES = { 0, }; gsize offsetGST_VIDEO_MAX_PLANES = { 0, }; guint i; gsize size = 0; - const GstD3D11Format *format; + GstD3D11Format format; D3D11_TEXTURE2D_DESC desc; for (i = 0; i < gst_buffer_n_memory (buffer); i++) { @@ -618,19 +238,12 @@ dmem = (GstD3D11Memory *) gst_buffer_peek_memory (buffer, 0); device = dmem->device; - format = gst_d3d11_device_format_from_gst (device, - GST_VIDEO_INFO_FORMAT (info)); - if (!format) { + if (!gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (info), + &format)) { GST_ERROR ("Unknown d3d11 format"); return NULL; } - alloc = (GstD3D11Allocator *) gst_allocator_find (GST_D3D11_MEMORY_NAME); - if (!alloc) { - GST_ERROR ("D3D11 allocator is not available"); - return NULL; - } - staging_buffer = gst_buffer_new (); for (i = 0; i < gst_buffer_n_memory (buffer); i++) { D3D11_TEXTURE2D_DESC staging_desc; @@ -643,13 +256,13 @@ fill_staging_desc (&desc, &staging_desc); new_mem = (GstD3D11Memory *) - gst_d3d11_allocator_alloc (alloc, mem->device, &staging_desc); + gst_d3d11_allocator_alloc (nullptr, mem->device, &staging_desc); if (!new_mem) { GST_ERROR ("Failed to allocate memory"); goto error; } - if (!gst_d3d11_memory_get_texture_stride (new_mem, &cur_stride) || + if (!gst_d3d11_memory_get_resource_stride (new_mem, &cur_stride) || cur_stride < staging_desc.Width) { GST_ERROR ("Failed to calculate memory size"); gst_memory_unref (GST_MEMORY_CAST (mem)); @@ -664,7 +277,7 @@ } /* single texture semi-planar formats */ - if (format->dxgi_format != DXGI_FORMAT_UNKNOWN && + if (format.dxgi_format != DXGI_FORMAT_UNKNOWN && GST_VIDEO_INFO_N_PLANES (info) == 2) { stride1 = stride0; offset1 = stride0 * desc.Height; @@ -675,14 +288,10 @@ GST_VIDEO_INFO_HEIGHT (info), GST_VIDEO_INFO_N_PLANES (info), offset, stride); - if (alloc) - gst_object_unref (alloc); - return staging_buffer; error: gst_clear_buffer (&staging_buffer); - gst_clear_object (&alloc); return NULL; } @@ -801,10 +410,9 @@ dst_subidx = gst_d3d11_memory_get_subresource_index (dst_dmem); src_subidx = gst_d3d11_memory_get_subresource_index (src_dmem); - gst_d3d11_device_lock (device); + GstD3D11DeviceLockGuard lk (device); device_context->CopySubresourceRegion (dst_texture, dst_subidx, 0, 0, 0, src_texture, src_subidx, &src_box); - gst_d3d11_device_unlock (device); gst_memory_unmap (src_mem, &src_info); gst_memory_unmap (dst_mem, &dst_info);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11pluginutils.h -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11pluginutils.h
Changed
@@ -24,11 +24,10 @@ #include <gst/gst.h> #include <gst/video/video.h> #include <gst/d3d11/gstd3d11.h> +#include <gst/d3d11/gstd3d11-private.h> G_BEGIN_DECLS -typedef struct _GstDxgiColorSpace GstDxgiColorSpace; - typedef enum { GST_D3D11_DEVICE_VENDOR_UNKNOWN = 0, @@ -39,22 +38,6 @@ GST_D3D11_DEVICE_VENDOR_XBOX, } GstD3D11DeviceVendor; -struct _GstDxgiColorSpace -{ - guint dxgi_color_space_type; - GstVideoColorRange range; - GstVideoColorMatrix matrix; - GstVideoTransferFunction transfer; - GstVideoColorPrimaries primaries; -}; - -#define GST_D3D11_CLEAR_COM(obj) G_STMT_START { \ - if (obj) { \ - (obj)->Release (); \ - (obj) = NULL; \ - } \ - } G_STMT_END - void gst_d3d11_plugin_utils_init (D3D_FEATURE_LEVEL feature_level); GstCaps * gst_d3d11_get_updated_template_caps (GstStaticCaps * template_caps); @@ -63,18 +46,13 @@ GstD3D11DeviceVendor gst_d3d11_get_device_vendor (GstD3D11Device * device); -#if (GST_D3D11_DXGI_HEADER_VERSION >= 5) gboolean gst_d3d11_hdr_meta_data_to_dxgi (GstVideoMasteringDisplayInfo * minfo, GstVideoContentLightLevel * cll, DXGI_HDR_METADATA_HDR10 * dxgi_hdr10); -#endif - -#if (GST_D3D11_DXGI_HEADER_VERSION >= 4) -const GstDxgiColorSpace * gst_d3d11_video_info_to_dxgi_color_space (GstVideoInfo * info); -const GstDxgiColorSpace * gst_d3d11_find_swap_chain_color_space (GstVideoInfo * info, - IDXGISwapChain3 * swapchain); -#endif +gboolean gst_d3d11_find_swap_chain_color_space (const GstVideoInfo * info, + IDXGISwapChain3 * swapchain, + DXGI_COLOR_SPACE_TYPE * color_space); GstBuffer * gst_d3d11_allocate_staging_buffer_for (GstBuffer * buffer, const GstVideoInfo * info,
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11screencapture.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11screencapture.cpp
Changed
@@ -1,6 +1,6 @@ /* * GStreamer - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -18,36 +18,11 @@ * Boston, MA 02110-1301, USA. */ -/* - * The MIT License (MIT) - * - * Copyright (c) Microsoft Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstd3d11screencapture.h" -#include "gstd3d11shader.h" #include "gstd3d11pluginutils.h" #include <string.h> @@ -58,1768 +33,105 @@ /* *INDENT-OFF* */ using namespace Microsoft::WRL; - -/* List of GstD3D11ScreenCapture weakref */ -G_LOCK_DEFINE_STATIC (dupl_list_lock); -static GList *dupl_list = nullptr; - -/* Below implemenation were taken from Microsoft sample - * https://github.com/microsoft/Windows-classic-samples/tree/master/Samples/DXGIDesktopDuplication - */ -#define NUMVERTICES 6 -#define BPP 4 - -/* Define our own MyFLOAT3 and MyFLOAT2 struct, since MinGW doesn't support - * DirectXMath.h - */ -struct MyFLOAT3 -{ - float x; - float y; - float z; - - MyFLOAT3() = default; - - MyFLOAT3(const MyFLOAT3&) = default; - MyFLOAT3& operator=(const MyFLOAT3&) = default; - - MyFLOAT3(MyFLOAT3&&) = default; - MyFLOAT3& operator=(MyFLOAT3&&) = default; - - constexpr MyFLOAT3(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {} - explicit MyFLOAT3(const float *pArray) : x(pArray0), y(pArray1), z(pArray2) {} -}; - -struct MyFLOAT2 -{ - float x; - float y; - - MyFLOAT2() = default; - - MyFLOAT2(const MyFLOAT2&) = default; - MyFLOAT2& operator=(const MyFLOAT2&) = default; - - MyFLOAT2(MyFLOAT2&&) = default; - MyFLOAT2& operator=(MyFLOAT2&&) = default; - - constexpr MyFLOAT2(float _x, float _y) : x(_x), y(_y) {} - explicit MyFLOAT2(const float *pArray) : x(pArray0), y(pArray1) {} -}; - -typedef struct -{ - MyFLOAT3 Pos; - MyFLOAT2 TexCoord; -} VERTEX; - -/* List of expected error cases */ -/* These are the errors we expect from general Dxgi API due to a transition */ -HRESULT SystemTransitionsExpectedErrors = { - DXGI_ERROR_DEVICE_REMOVED, - DXGI_ERROR_ACCESS_LOST, - static_cast<HRESULT>(WAIT_ABANDONED), - S_OK -}; - -/* These are the errors we expect from IDXGIOutput1::DuplicateOutput - * due to a transition */ -HRESULT CreateDuplicationExpectedErrors = { - DXGI_ERROR_DEVICE_REMOVED, - static_cast<HRESULT>(E_ACCESSDENIED), - DXGI_ERROR_SESSION_DISCONNECTED, - S_OK -}; - -/* These are the errors we expect from IDXGIOutputDuplication methods - * due to a transition */ -HRESULT FrameInfoExpectedErrors = { - DXGI_ERROR_DEVICE_REMOVED, - DXGI_ERROR_ACCESS_LOST, - S_OK -}; - -/* These are the errors we expect from IDXGIAdapter::EnumOutputs methods - * due to outputs becoming stale during a transition */ -HRESULT EnumOutputsExpectedErrors = { - DXGI_ERROR_NOT_FOUND, - S_OK -}; - -static GstFlowReturn -gst_d3d11_screen_capture_return_from_hr (ID3D11Device * device, - HRESULT hr, HRESULT * expected_errors = nullptr) -{ - HRESULT translated_hr = hr; - - /* On an error check if the DX device is lost */ - if (device) { - HRESULT remove_reason = device->GetDeviceRemovedReason (); - - switch (remove_reason) { - case DXGI_ERROR_DEVICE_REMOVED: - case DXGI_ERROR_DEVICE_RESET: - case static_cast<HRESULT>(E_OUTOFMEMORY): - /* Our device has been stopped due to an external event on the GPU so - * map them all to device removed and continue processing the condition - */ - translated_hr = DXGI_ERROR_DEVICE_REMOVED; - break; - case S_OK: - /* Device is not removed so use original error */ - break; - default: - /* Device is removed but not a error we want to remap */ - translated_hr = remove_reason; - break; - } - } - - /* Check if this error was expected or not */ - if (expected_errors) { - HRESULT* rst = expected_errors; - - while (*rst != S_OK) { - if (*rst == translated_hr) - return GST_D3D11_SCREEN_CAPTURE_FLOW_EXPECTED_ERROR; - - rst++; - } - } - - return GST_FLOW_ERROR; -} - -class PTR_INFO -{ -public: - PTR_INFO () - : PtrShapeBuffer (nullptr) - , BufferSize (0) - { - LastTimeStamp.QuadPart = 0; - } - - ~PTR_INFO () - { - if (PtrShapeBuffer) - delete PtrShapeBuffer; - } - - void - MaybeReallocBuffer (UINT buffer_size) - { - if (buffer_size <= BufferSize) - return; - - if (PtrShapeBuffer) - delete PtrShapeBuffer; - - PtrShapeBuffer = new BYTEbuffer_size; - BufferSize = buffer_size; - } - - BYTE* PtrShapeBuffer; - UINT BufferSize; - DXGI_OUTDUPL_POINTER_SHAPE_INFO shape_info; - POINT Position; - bool Visible; - LARGE_INTEGER LastTimeStamp; -}; - -class D3D11DesktopDupObject -{ -public: - D3D11DesktopDupObject () - : device_(nullptr) - , metadata_buffer_(nullptr) - , metadata_buffer_size_(0) - , vertex_buffer_(nullptr) - , vertex_buffer_size_(0) - { - } - - ~D3D11DesktopDupObject () - { - if (metadata_buffer_) - delete metadata_buffer_; - - if (vertex_buffer_) - delete vertex_buffer_; - - gst_clear_object (&device_); - } - - GstFlowReturn - Init (GstD3D11Device * device, HMONITOR monitor) - { - GstFlowReturn ret; - ID3D11Device *device_handle; - HRESULT hr; - D3D11_TEXTURE2D_DESC texture_desc = { 0, }; - - if (!InitShader (device)) - return GST_FLOW_ERROR; - - ret = InitDupl (device, monitor); - if (ret != GST_FLOW_OK) - return ret; - - GST_INFO ("Init done"); - - device_handle = gst_d3d11_device_get_device_handle (device); - - texture_desc.Width = output_desc_.ModeDesc.Width; - texture_desc.Height = output_desc_.ModeDesc.Height; - texture_desc.MipLevels = 1; - texture_desc.ArraySize = 1; - /* FIXME: we can support DXGI_FORMAT_R10G10B10A2_UNORM */ - texture_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - texture_desc.SampleDesc.Count = 1; - texture_desc.Usage = D3D11_USAGE_DEFAULT; - texture_desc.BindFlags = - D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; - texture_desc.CPUAccessFlags = 0; - /* source element may hold different d3d11 device object */ - texture_desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; - - hr = device_handle->CreateTexture2D (&texture_desc, - nullptr, &shared_texture_); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR_OBJECT (device, "Couldn't create texture, hr 0x%x", (guint) hr); - return GST_FLOW_ERROR; - } - - device_ = (GstD3D11Device *) gst_object_ref (device); - - return GST_FLOW_OK; - } - - GstFlowReturn - Capture () - { - GstFlowReturn ret; - bool timeout = false; - ComPtr<ID3D11Texture2D> texture; - UINT move_count, dirty_count; - DXGI_OUTDUPL_FRAME_INFO frame_info; - - GST_TRACE ("Capturing"); - ret = GetFrame (&texture, &move_count, &dirty_count, &frame_info, &timeout); - if (ret != GST_FLOW_OK) - return ret; - - /* Nothing updated */ - if (timeout) { - GST_TRACE ("timeout"); - return GST_FLOW_OK; - } - - GST_TRACE ("Getting mouse pointer info"); - ret = GetMouse (&ptr_info_, &frame_info); - if (ret != GST_FLOW_OK) { - GST_WARNING ("Couldn't get mouse pointer info"); - dupl_->ReleaseFrame (); - return ret; - } - - ret = ProcessFrame (texture.Get(), shared_texture_.Get(), - &output_desc_, move_count, dirty_count, &frame_info); - - if (ret != GST_FLOW_OK) { - dupl_->ReleaseFrame (); - GST_WARNING ("Couldn't process frame"); - return ret; - } - - HRESULT hr = dupl_->ReleaseFrame (); - if (!gst_d3d11_result (hr, device_)) { - GST_WARNING ("Couldn't release frame"); - return gst_d3d11_screen_capture_return_from_hr (nullptr, hr, FrameInfoExpectedErrors); - } - - GST_TRACE ("Capture done"); - - return GST_FLOW_OK; - } - - bool - DrawMouse (GstD3D11Device * device, ID3D11RenderTargetView * rtv, - ID3D11VertexShader * vs, ID3D11PixelShader * ps, - ID3D11InputLayout * layout, ID3D11SamplerState * sampler, - ID3D11BlendState * blend) - { - GST_TRACE ("Drawing mouse"); - - if (!ptr_info_.Visible) { - GST_TRACE ("Mouse is invisiable"); - return true; - } - - ComPtr<ID3D11Texture2D> MouseTex; - ComPtr<ID3D11ShaderResourceView> ShaderRes; - ComPtr<ID3D11Buffer> VertexBufferMouse; - D3D11_SUBRESOURCE_DATA InitData; - D3D11_TEXTURE2D_DESC Desc; - D3D11_SHADER_RESOURCE_VIEW_DESC SDesc; - ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device); - ID3D11DeviceContext *context_handle = - gst_d3d11_device_get_device_context_handle (device); - - VERTEX VerticesNUMVERTICES = - { - {MyFLOAT3(-1.0f, -1.0f, 0), MyFLOAT2(0.0f, 1.0f)}, - {MyFLOAT3(-1.0f, 1.0f, 0), MyFLOAT2(0.0f, 0.0f)}, - {MyFLOAT3(1.0f, -1.0f, 0), MyFLOAT2(1.0f, 1.0f)}, - {MyFLOAT3(1.0f, -1.0f, 0), MyFLOAT2(1.0f, 1.0f)}, - {MyFLOAT3(-1.0f, 1.0f, 0), MyFLOAT2(0.0f, 0.0f)}, - {MyFLOAT3(1.0f, 1.0f, 0), MyFLOAT2(1.0f, 0.0f)}, - }; - - D3D11_TEXTURE2D_DESC FullDesc; - shared_texture_->GetDesc(&FullDesc); - INT DesktopWidth = FullDesc.Width; - INT DesktopHeight = FullDesc.Height; - - INT CenterX = (DesktopWidth / 2); - INT CenterY = (DesktopHeight / 2); - - INT PtrWidth = 0; - INT PtrHeight = 0; - INT PtrLeft = 0; - INT PtrTop = 0; - - BYTE* InitBuffer = nullptr; - - D3D11_BOX Box; - Box.front = 0; - Box.back = 1; - - Desc.MipLevels = 1; - Desc.ArraySize = 1; - Desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - Desc.SampleDesc.Count = 1; - Desc.SampleDesc.Quality = 0; - Desc.Usage = D3D11_USAGE_DEFAULT; - Desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - Desc.CPUAccessFlags = 0; - Desc.MiscFlags = 0; - - // Set shader resource properties - SDesc.Format = Desc.Format; - SDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - SDesc.Texture2D.MostDetailedMip = Desc.MipLevels - 1; - SDesc.Texture2D.MipLevels = Desc.MipLevels; - - switch (ptr_info_.shape_info.Type) { - case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR: - PtrLeft = ptr_info_.Position.x; - PtrTop = ptr_info_.Position.y; - - PtrWidth = static_cast<INT>(ptr_info_.shape_info.Width); - PtrHeight = static_cast<INT>(ptr_info_.shape_info.Height); - break; - case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MONOCHROME: - ProcessMonoMask(true, &ptr_info_, &PtrWidth, &PtrHeight, &PtrLeft, - &PtrTop, &InitBuffer, &Box); - break; - case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR: - ProcessMonoMask(false, &ptr_info_, &PtrWidth, &PtrHeight, &PtrLeft, - &PtrTop, &InitBuffer, &Box); - break; - default: - break; - } - - /* Nothing draw */ - if (PtrWidth == 0 || PtrHeight == 0) { - if (InitBuffer) - delete InitBuffer; - - return true; - } - - Vertices0.Pos.x = (PtrLeft - CenterX) / (FLOAT)CenterX; - Vertices0.Pos.y = -1 * ((PtrTop + PtrHeight) - CenterY) / (FLOAT)CenterY; - Vertices1.Pos.x = (PtrLeft - CenterX) / (FLOAT)CenterX; - Vertices1.Pos.y = -1 * (PtrTop - CenterY) / (FLOAT)CenterY; - Vertices2.Pos.x = ((PtrLeft + PtrWidth) - CenterX) / (FLOAT)CenterX; - Vertices2.Pos.y = -1 * ((PtrTop + PtrHeight) - CenterY) / (FLOAT)CenterY; - Vertices3.Pos.x = Vertices2.Pos.x; - Vertices3.Pos.y = Vertices2.Pos.y; - Vertices4.Pos.x = Vertices1.Pos.x; - Vertices4.Pos.y = Vertices1.Pos.y; - Vertices5.Pos.x = ((PtrLeft + PtrWidth) - CenterX) / (FLOAT)CenterX; - Vertices5.Pos.y = -1 * (PtrTop - CenterY) / (FLOAT)CenterY; - - Desc.Width = PtrWidth; - Desc.Height = PtrHeight; - - InitData.pSysMem = - (ptr_info_.shape_info.Type == DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR) ? - ptr_info_.PtrShapeBuffer : InitBuffer; - InitData.SysMemPitch = - (ptr_info_.shape_info.Type == DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR) ? - ptr_info_.shape_info.Pitch : PtrWidth * BPP; - InitData.SysMemSlicePitch = 0; - - // Create mouseshape as texture - HRESULT hr = device_handle->CreateTexture2D(&Desc, &InitData, &MouseTex); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Failed to create texture for rendering mouse"); - return false; - } - - // Create shader resource from texture - hr = device_handle->CreateShaderResourceView(MouseTex.Get(), &SDesc, - &ShaderRes); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Failed to create shader resource view for rendering mouse"); - return false; - } - - D3D11_BUFFER_DESC BDesc; - memset (&BDesc, 0, sizeof(D3D11_BUFFER_DESC)); - BDesc.Usage = D3D11_USAGE_DEFAULT; - BDesc.ByteWidth = sizeof(VERTEX) * NUMVERTICES; - BDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - BDesc.CPUAccessFlags = 0; - - memset (&InitData, 0, sizeof(D3D11_SUBRESOURCE_DATA)); - InitData.pSysMem = Vertices; - - // Create vertex buffer - hr = device_handle->CreateBuffer(&BDesc, &InitData, &VertexBufferMouse); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Failed to create vertex buffer for rendering mouse"); - return false; - } - - FLOAT BlendFactor4 = {0.f, 0.f, 0.f, 0.f}; - UINT Stride = sizeof(VERTEX); - UINT Offset = 0; - ID3D11ShaderResourceView *srv = ShaderRes.Get(); - ID3D11Buffer *vert_buf = VertexBufferMouse.Get(); - - context_handle->IASetVertexBuffers(0, 1, &vert_buf, &Stride, &Offset); - context_handle->OMSetBlendState(blend, BlendFactor, 0xFFFFFFFF); - context_handle->OMSetRenderTargets(1, &rtv, nullptr); - context_handle->VSSetShader(vs, nullptr, 0); - context_handle->PSSetShader(ps, nullptr, 0); - context_handle->PSSetShaderResources(0, 1, &srv); - context_handle->PSSetSamplers(0, 1, &sampler); - context_handle->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - context_handle->IASetInputLayout(layout); - - D3D11_VIEWPORT VP; - VP.Width = static_cast<FLOAT>(FullDesc.Width); - VP.Height = static_cast<FLOAT>(FullDesc.Height); - VP.MinDepth = 0.0f; - VP.MaxDepth = 1.0f; - VP.TopLeftX = 0.0f; - VP.TopLeftY = 0.0f; - context_handle->RSSetViewports(1, &VP); - - context_handle->Draw(NUMVERTICES, 0); - - /* Unbind srv and rtv from context */ - srv = nullptr; - context_handle->PSSetShaderResources (0, 1, &srv); - context_handle->OMSetRenderTargets (0, nullptr, nullptr); - - if (InitBuffer) - delete InitBuffer; - - return true; - } - - GstFlowReturn - CopyToTexture (GstD3D11Device * device, ID3D11Texture2D * texture) - { - ID3D11DeviceContext *context_handle = nullptr; - ComPtr <ID3D11Texture2D> tex; - ComPtr < ID3D11Query > query; - HRESULT hr; - - context_handle = gst_d3d11_device_get_device_context_handle (device); - - if (device == device_) { - tex = shared_texture_; - } else { - ID3D11Device *device_handle = nullptr; - ComPtr < IDXGIResource > dxgi_resource; - D3D11_QUERY_DESC query_desc; - HANDLE shared_handle; - - device_handle = gst_d3d11_device_get_device_handle (device); - - hr = shared_texture_.As (&dxgi_resource); - if (!gst_d3d11_result (hr, device_)) - return GST_FLOW_ERROR; - - hr = dxgi_resource->GetSharedHandle (&shared_handle); - if (!gst_d3d11_result (hr, device_)) - return GST_FLOW_ERROR; - - hr = device_handle->OpenSharedResource (shared_handle, - IID_PPV_ARGS (&tex)); - if (!gst_d3d11_result (hr, device)) - return GST_FLOW_ERROR; - - query_desc.Query = D3D11_QUERY_EVENT; - query_desc.MiscFlags = 0; - - hr = device_handle->CreateQuery (&query_desc, &query); - if (!gst_d3d11_result (hr, device)) - return GST_FLOW_ERROR; - } - - context_handle->CopySubresourceRegion (texture, 0, 0, 0, 0, - tex.Get(), 0, nullptr); - - if (query) { - BOOL sync_done = FALSE; - - do { - hr = context_handle->GetData (query.Get (), - &sync_done, sizeof (BOOL), 0); - } while (!sync_done && (hr == S_OK || hr == S_FALSE)); - } - - return GST_FLOW_OK; - } - - void - GetSize (guint * width, guint * height) - { - *width = output_desc_.ModeDesc.Width; - *height = output_desc_.ModeDesc.Height; - } - -private: - /* This method is not expected to be failed unless un-recoverable error case */ - bool - InitShader (GstD3D11Device * device) - { - static const gchar vs_str = - "struct VS_INPUT {\n" - " float4 Position: POSITION;\n" - " float2 Texture: TEXCOORD;\n" - "};\n" - "\n" - "struct VS_OUTPUT {\n" - " float4 Position: SV_POSITION;\n" - " float2 Texture: TEXCOORD;\n" - "};\n" - "\n" - "VS_OUTPUT main (VS_INPUT input)\n" - "{\n" - " return input;\n" - "}"; - - static const gchar ps_str = - "Texture2D shaderTexture;\n" - "SamplerState samplerState;\n" - "\n" - "struct PS_INPUT {\n" - " float4 Position: SV_POSITION;\n" - " float2 Texture: TEXCOORD;\n" - "};\n" - "\n" - "struct PS_OUTPUT {\n" - " float4 Plane: SV_Target;\n" - "};\n" - "\n" - "PS_OUTPUT main(PS_INPUT input)\n" - "{\n" - " PS_OUTPUT output;\n" - " output.Plane = shaderTexture.Sample(samplerState, input.Texture);\n" - " return output;\n" - "}"; - - D3D11_INPUT_ELEMENT_DESC input_desc = { - {"POSITION", - 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, - {"TEXCOORD", - 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0} - }; - - ComPtr<ID3D11VertexShader> vs; - ComPtr<ID3D11InputLayout> layout; - if (!gst_d3d11_create_vertex_shader (device, - vs_str, input_desc, G_N_ELEMENTS (input_desc), &vs, &layout)) { - GST_ERROR ("Failed to create vertex shader"); - return false; - } - - ComPtr<ID3D11PixelShader> ps; - if (!gst_d3d11_create_pixel_shader (device, ps_str, &ps)) { - GST_ERROR ("Failed to create pixel shader"); - return false; - } - - D3D11_SAMPLER_DESC sampler_desc; - memset (&sampler_desc, 0, sizeof (D3D11_SAMPLER_DESC)); - sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.ComparisonFunc = D3D11_COMPARISON_NEVER; - sampler_desc.MinLOD = 0; - sampler_desc.MaxLOD = D3D11_FLOAT32_MAX; - - ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device); - ComPtr<ID3D11SamplerState> sampler; - HRESULT hr = device_handle->CreateSamplerState (&sampler_desc, &sampler); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Failed to create sampler state, hr 0x%x", (guint) hr); - return false; - } - - /* Everything is prepared now */ - vs_ = vs; - ps_ = ps; - layout_ = layout; - sampler_ = sampler; - - return true; - } - - /* Maybe returning expected error code depending on desktop status */ - GstFlowReturn - InitDupl (GstD3D11Device * device, HMONITOR monitor) - { - ComPtr<ID3D11Device> d3d11_device; - ComPtr<IDXGIAdapter1> adapter; - ComPtr<IDXGIOutput> output; - ComPtr<IDXGIOutput1> output1; - - d3d11_device = gst_d3d11_device_get_device_handle (device); - - HRESULT hr = gst_d3d11_screen_capture_find_output_for_monitor (monitor, - &adapter, &output); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't get adapter and output for monitor"); - return GST_FLOW_ERROR; - } - - hr = output.As (&output1); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR ("Couldn't get IDXGIOutput1 interface, hr 0x%x", (guint) hr); - return GST_FLOW_ERROR; - } - - HDESK hdesk = OpenInputDesktop (0, FALSE, GENERIC_ALL); - if (hdesk) { - if (!SetThreadDesktop (hdesk)) { - GST_WARNING ("SetThreadDesktop() failed, error %lu", GetLastError()); - } - - CloseDesktop (hdesk); - } else { - GST_WARNING ("OpenInputDesktop() failed, error %lu", GetLastError()); - } - - /* FIXME: Use DuplicateOutput1 to avoid potentail color conversion */ - hr = output1->DuplicateOutput(d3d11_device.Get(), &dupl_); - if (!gst_d3d11_result (hr, device)) { - if (hr == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE) { - GST_ERROR ("Hit the max allowed number of Desktop Duplication session"); - return GST_FLOW_ERROR; - } - - /* Seems to be one limitation of Desktop Duplication API design - * See - * https://docs.microsoft.com/en-US/troubleshoot/windows-client/shell-experience/error-when-dda-capable-app-is-against-gpu - */ - if (hr == DXGI_ERROR_UNSUPPORTED) { - GST_WARNING ("IDXGIOutput1::DuplicateOutput returned " - "DXGI_ERROR_UNSUPPORTED, possiblely application is run against a " - "discrete GPU"); - return GST_D3D11_SCREEN_CAPTURE_FLOW_UNSUPPORTED; - } - - return gst_d3d11_screen_capture_return_from_hr (d3d11_device.Get(), hr, - CreateDuplicationExpectedErrors); - } - - dupl_->GetDesc (&output_desc_); - - return GST_FLOW_OK; - } - - GstFlowReturn - GetMouse (PTR_INFO * ptr_info, DXGI_OUTDUPL_FRAME_INFO * frame_info) - { - /* A non-zero mouse update timestamp indicates that there is a mouse - * position update and optionally a shape change */ - if (frame_info->LastMouseUpdateTime.QuadPart == 0) - return GST_FLOW_OK; - - ptr_info->Position.x = frame_info->PointerPosition.Position.x; - ptr_info->Position.y = frame_info->PointerPosition.Position.y; - ptr_info->LastTimeStamp = frame_info->LastMouseUpdateTime; - ptr_info->Visible = frame_info->PointerPosition.Visible != 0; - - /* No new shape */ - if (frame_info->PointerShapeBufferSize == 0) - return GST_FLOW_OK; - - /* Realloc buffer if needed */ - ptr_info->MaybeReallocBuffer (frame_info->PointerShapeBufferSize); - - /* Must always get shape of cursor, even if not drawn at the moment. - * Shape of cursor is not repeated by the AcquireNextFrame and can be - * requested to be drawn any time later */ - UINT dummy; - HRESULT hr = dupl_->GetFramePointerShape(frame_info->PointerShapeBufferSize, - (void *) ptr_info->PtrShapeBuffer, &dummy, &ptr_info->shape_info); - - if (!gst_d3d11_result (hr, device_)) { - ID3D11Device *device_handle = - gst_d3d11_device_get_device_handle (device_); - - return gst_d3d11_screen_capture_return_from_hr(device_handle, hr, - FrameInfoExpectedErrors); - } - - return GST_FLOW_OK; - } - - void - MaybeReallocMetadataBuffer (UINT buffer_size) - { - if (buffer_size <= metadata_buffer_size_) - return; - - if (metadata_buffer_) - delete metadata_buffer_; - - metadata_buffer_ = new BYTEbuffer_size; - metadata_buffer_size_ = buffer_size; - } - - GstFlowReturn - GetFrame (ID3D11Texture2D ** texture, UINT * move_count, UINT * dirty_count, - DXGI_OUTDUPL_FRAME_INFO * frame_info, bool* timeout) - { - ComPtr<IDXGIResource> resource; - ComPtr<ID3D11Texture2D> acquired_texture; - ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device_); - - /* Get new frame */ - HRESULT hr = dupl_->AcquireNextFrame(0, frame_info, &resource); - if (hr == DXGI_ERROR_WAIT_TIMEOUT) { - GST_TRACE ("Timeout"); - - *timeout = true; - return GST_FLOW_OK; - } - - *timeout = false; - *move_count = 0; - *dirty_count = 0; - - if (!gst_d3d11_result (hr, device_)) { - return gst_d3d11_screen_capture_return_from_hr(device_handle, hr, - FrameInfoExpectedErrors); - } - - GST_TRACE ( - "LastPresentTime: %" G_GINT64_FORMAT - ", LastMouseUpdateTime: %" G_GINT64_FORMAT - ", AccumulatedFrames: %d" - ", RectsCoalesced: %d" - ", ProtectedContentMaskedOut: %d" - ", PointerPosition: (%ldx%ld, visible %d)" - ", TotalMetadataBufferSize: %d" - ", PointerShapeBufferSize: %d", - frame_info->LastPresentTime.QuadPart, - frame_info->LastMouseUpdateTime.QuadPart, - frame_info->AccumulatedFrames, - frame_info->RectsCoalesced, - frame_info->ProtectedContentMaskedOut, - frame_info->PointerPosition.Position.x, - frame_info->PointerPosition.Position.y, - frame_info->PointerPosition.Visible, - frame_info->TotalMetadataBufferSize, - frame_info->PointerShapeBufferSize); - - hr = resource.As (&acquired_texture); - if (!gst_d3d11_result (hr, device_)) { - GST_ERROR ("Failed to get ID3D11Texture2D interface from IDXGIResource " - "hr 0x%x", (guint) hr); - return GST_FLOW_ERROR; - } - - /* Get metadata */ - if (frame_info->TotalMetadataBufferSize) { - UINT buf_size = frame_info->TotalMetadataBufferSize; - - MaybeReallocMetadataBuffer (buf_size); - - /* Get move rectangles */ - hr = dupl_->GetFrameMoveRects(buf_size, - (DXGI_OUTDUPL_MOVE_RECT *) metadata_buffer_, &buf_size); - if (!gst_d3d11_result (hr, device_)) { - GST_ERROR ("Couldn't get move rect, hr 0x%x", (guint) hr); - - return gst_d3d11_screen_capture_return_from_hr(nullptr, hr, - FrameInfoExpectedErrors); - } - - *move_count = buf_size / sizeof(DXGI_OUTDUPL_MOVE_RECT); - - GST_TRACE ("MoveRects count %d", *move_count); -#ifndef GST_DISABLE_GST_DEBUG - { - DXGI_OUTDUPL_MOVE_RECT *rects = - (DXGI_OUTDUPL_MOVE_RECT *) metadata_buffer_; - for (guint i = 0; i < *move_count; i++) { - GST_TRACE ("MoveRect%d SourcePoint: %ldx%ld, " - "DestinationRect (left:top:right:bottom): %ldx%ldx%ldx%ld", - i, rects->SourcePoint.x, rects->SourcePoint.y, - rects->DestinationRect.left, rects->DestinationRect.top, - rects->DestinationRect.right, rects->DestinationRect.bottom); - } - } -#endif - - BYTE* dirty_rects = metadata_buffer_ + buf_size; - buf_size = frame_info->TotalMetadataBufferSize - buf_size; - - /* Get dirty rectangles */ - hr = dupl_->GetFrameDirtyRects(buf_size, (RECT *) dirty_rects, &buf_size); - if (!gst_d3d11_result (hr, device_)) { - GST_ERROR ("Couldn't get dirty rect, hr 0x%x", (guint) hr); - *move_count = 0; - *dirty_count = 0; - - return gst_d3d11_screen_capture_return_from_hr(nullptr, - hr, FrameInfoExpectedErrors); - } - - *dirty_count = buf_size / sizeof(RECT); - - GST_TRACE ("DirtyRects count %d", *dirty_count); -#ifndef GST_DISABLE_GST_DEBUG - { - RECT *rects = (RECT *) dirty_rects; - for (guint i = 0; i < *dirty_count; i++) { - GST_TRACE ("DirtyRect%d left:top:right:bottom: %ldx%ldx%ldx%ld", - i, rects->left, rects->top, rects->right, rects->bottom); - } - } -#endif - } - - *texture = acquired_texture.Detach(); - - return GST_FLOW_OK; - } - - void - SetMoveRect (RECT* SrcRect, RECT* DestRect, DXGI_OUTDUPL_DESC* DeskDesc, - DXGI_OUTDUPL_MOVE_RECT* MoveRect, INT TexWidth, INT TexHeight) - { - switch (DeskDesc->Rotation) - { - case DXGI_MODE_ROTATION_UNSPECIFIED: - case DXGI_MODE_ROTATION_IDENTITY: - SrcRect->left = MoveRect->SourcePoint.x; - SrcRect->top = MoveRect->SourcePoint.y; - SrcRect->right = MoveRect->SourcePoint.x + - MoveRect->DestinationRect.right - MoveRect->DestinationRect.left; - SrcRect->bottom = MoveRect->SourcePoint.y + - MoveRect->DestinationRect.bottom - MoveRect->DestinationRect.top; - - *DestRect = MoveRect->DestinationRect; - break; - case DXGI_MODE_ROTATION_ROTATE90: - SrcRect->left = TexHeight - (MoveRect->SourcePoint.y + - MoveRect->DestinationRect.bottom - MoveRect->DestinationRect.top); - SrcRect->top = MoveRect->SourcePoint.x; - SrcRect->right = TexHeight - MoveRect->SourcePoint.y; - SrcRect->bottom = MoveRect->SourcePoint.x + - MoveRect->DestinationRect.right - MoveRect->DestinationRect.left; - - DestRect->left = TexHeight - MoveRect->DestinationRect.bottom; - DestRect->top = MoveRect->DestinationRect.left; - DestRect->right = TexHeight - MoveRect->DestinationRect.top; - DestRect->bottom = MoveRect->DestinationRect.right; - break; - case DXGI_MODE_ROTATION_ROTATE180: - SrcRect->left = TexWidth - (MoveRect->SourcePoint.x + - MoveRect->DestinationRect.right - MoveRect->DestinationRect.left); - SrcRect->top = TexHeight - (MoveRect->SourcePoint.y + - MoveRect->DestinationRect.bottom - MoveRect->DestinationRect.top); - SrcRect->right = TexWidth - MoveRect->SourcePoint.x; - SrcRect->bottom = TexHeight - MoveRect->SourcePoint.y; - - DestRect->left = TexWidth - MoveRect->DestinationRect.right; - DestRect->top = TexHeight - MoveRect->DestinationRect.bottom; - DestRect->right = TexWidth - MoveRect->DestinationRect.left; - DestRect->bottom = TexHeight - MoveRect->DestinationRect.top; - break; - case DXGI_MODE_ROTATION_ROTATE270: - SrcRect->left = MoveRect->SourcePoint.x; - SrcRect->top = TexWidth - (MoveRect->SourcePoint.x + - MoveRect->DestinationRect.right - MoveRect->DestinationRect.left); - SrcRect->right = MoveRect->SourcePoint.y + - MoveRect->DestinationRect.bottom - MoveRect->DestinationRect.top; - SrcRect->bottom = TexWidth - MoveRect->SourcePoint.x; - - DestRect->left = MoveRect->DestinationRect.top; - DestRect->top = TexWidth - MoveRect->DestinationRect.right; - DestRect->right = MoveRect->DestinationRect.bottom; - DestRect->bottom = TexWidth - MoveRect->DestinationRect.left; - break; - default: - memset (DestRect, 0, sizeof (RECT)); - memset (SrcRect, 0, sizeof (RECT)); - break; - } - } - - GstFlowReturn - CopyMove (ID3D11Texture2D* SharedSurf, DXGI_OUTDUPL_MOVE_RECT* MoveBuffer, - UINT MoveCount, DXGI_OUTDUPL_DESC* DeskDesc) - { - ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device_); - ID3D11DeviceContext *device_context = - gst_d3d11_device_get_device_context_handle (device_); - D3D11_TEXTURE2D_DESC FullDesc; - SharedSurf->GetDesc(&FullDesc); - - GST_TRACE ("Copying MoveRects (count %d)", MoveCount); - - /* Make new intermediate surface to copy into for moving */ - if (!move_texture_) { - D3D11_TEXTURE2D_DESC MoveDesc; - MoveDesc = FullDesc; - MoveDesc.BindFlags = D3D11_BIND_RENDER_TARGET; - MoveDesc.MiscFlags = 0; - HRESULT hr = device_handle->CreateTexture2D(&MoveDesc, - nullptr, &move_texture_); - if (!gst_d3d11_result (hr, device_)) { - GST_ERROR ("Couldn't create intermediate texture, hr 0x%x", (guint) hr); - return GST_FLOW_ERROR; - } - } - - for (UINT i = 0; i < MoveCount; i++) { - RECT SrcRect; - RECT DestRect; - - SetMoveRect(&SrcRect, &DestRect, DeskDesc, &MoveBufferi, - FullDesc.Width, FullDesc.Height); - - /* Copy rect out of shared surface */ - D3D11_BOX Box; - Box.left = SrcRect.left; - Box.top = SrcRect.top; - Box.front = 0; - Box.right = SrcRect.right; - Box.bottom = SrcRect.bottom; - Box.back = 1; - device_context->CopySubresourceRegion(move_texture_.Get(), - 0, SrcRect.left, SrcRect.top, 0, SharedSurf, 0, &Box); - - /* Copy back to shared surface */ - device_context->CopySubresourceRegion(SharedSurf, - 0, DestRect.left, DestRect.top, 0, move_texture_.Get(), 0, &Box); - } - - return GST_FLOW_OK; - } - - void - SetDirtyVert (VERTEX* Vertices, RECT* Dirty, - DXGI_OUTDUPL_DESC* DeskDesc, D3D11_TEXTURE2D_DESC* FullDesc, - D3D11_TEXTURE2D_DESC* ThisDesc) - { - INT CenterX = FullDesc->Width / 2; - INT CenterY = FullDesc->Height / 2; - - INT Width = FullDesc->Width; - INT Height = FullDesc->Height; - - /* Rotation compensated destination rect */ - RECT DestDirty = *Dirty; - - /* Set appropriate coordinates compensated for rotation */ - switch (DeskDesc->Rotation) - { - case DXGI_MODE_ROTATION_ROTATE90: - DestDirty.left = Width - Dirty->bottom; - DestDirty.top = Dirty->left; - DestDirty.right = Width - Dirty->top; - DestDirty.bottom = Dirty->right; - - Vertices0.TexCoord = - MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), - Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); - Vertices1.TexCoord = - MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), - Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); - Vertices2.TexCoord = - MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), - Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); - Vertices5.TexCoord = - MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), - Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); - break; - case DXGI_MODE_ROTATION_ROTATE180: - DestDirty.left = Width - Dirty->right; - DestDirty.top = Height - Dirty->bottom; - DestDirty.right = Width - Dirty->left; - DestDirty.bottom = Height - Dirty->top; - - Vertices0.TexCoord = - MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), - Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); - Vertices1.TexCoord = - MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), - Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); - Vertices2.TexCoord = - MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), - Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); - Vertices5.TexCoord = - MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), - Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); - break; - case DXGI_MODE_ROTATION_ROTATE270: - DestDirty.left = Dirty->top; - DestDirty.top = Height - Dirty->right; - DestDirty.right = Dirty->bottom; - DestDirty.bottom = Height - Dirty->left; - - Vertices0.TexCoord = - MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), - Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); - Vertices1.TexCoord = - MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), - Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); - Vertices2.TexCoord = - MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), - Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); - Vertices5.TexCoord = - MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), - Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); - break; - case DXGI_MODE_ROTATION_UNSPECIFIED: - case DXGI_MODE_ROTATION_IDENTITY: - default: - Vertices0.TexCoord = - MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), - Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); - Vertices1.TexCoord = - MyFLOAT2(Dirty->left / static_cast<FLOAT>(ThisDesc->Width), - Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); - Vertices2.TexCoord = - MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), - Dirty->bottom / static_cast<FLOAT>(ThisDesc->Height)); - Vertices5.TexCoord = - MyFLOAT2(Dirty->right / static_cast<FLOAT>(ThisDesc->Width), - Dirty->top / static_cast<FLOAT>(ThisDesc->Height)); - break; - } - - /* Set positions */ - Vertices0.Pos = - MyFLOAT3( - (DestDirty.left - CenterX) / static_cast<FLOAT>(CenterX), - -1 * (DestDirty.bottom - CenterY) / static_cast<FLOAT>(CenterY), - 0.0f); - Vertices1.Pos = - MyFLOAT3( - (DestDirty.left - CenterX) / static_cast<FLOAT>(CenterX), - -1 * (DestDirty.top - CenterY) / static_cast<FLOAT>(CenterY), - 0.0f); - Vertices2.Pos = - MyFLOAT3( - (DestDirty.right - CenterX) / static_cast<FLOAT>(CenterX), - -1 * (DestDirty.bottom - CenterY) / static_cast<FLOAT>(CenterY), - 0.0f); - Vertices3.Pos = Vertices2.Pos; - Vertices4.Pos = Vertices1.Pos; - Vertices5.Pos = - MyFLOAT3( - (DestDirty.right - CenterX) / static_cast<FLOAT>(CenterX), - -1 * (DestDirty.top - CenterY) / static_cast<FLOAT>(CenterY), - 0.0f); - - Vertices3.TexCoord = Vertices2.TexCoord; - Vertices4.TexCoord = Vertices1.TexCoord; - } - - void - MaybeReallocVertexBuffer (UINT buffer_size) - { - if (buffer_size <= vertex_buffer_size_) - return; - - if (vertex_buffer_) - delete vertex_buffer_; - - vertex_buffer_ = new BYTEbuffer_size; - vertex_buffer_size_ = buffer_size; - } - - GstFlowReturn - CopyDirty (ID3D11Texture2D* SrcSurface, ID3D11Texture2D* SharedSurf, - RECT* DirtyBuffer, UINT DirtyCount, DXGI_OUTDUPL_DESC* DeskDesc) - { - D3D11_TEXTURE2D_DESC FullDesc; - D3D11_TEXTURE2D_DESC ThisDesc; - ComPtr<ID3D11ShaderResourceView> ShaderResource; - ComPtr<ID3D11Buffer> VertBuf; - HRESULT hr; - ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device_); - ID3D11DeviceContext *device_context = - gst_d3d11_device_get_device_context_handle (device_); - - GST_TRACE ("Copying DiretyRects (count %d)", DirtyCount); - - SharedSurf->GetDesc(&FullDesc); - SrcSurface->GetDesc(&ThisDesc); - - if (!rtv_) { - hr = device_handle->CreateRenderTargetView(SharedSurf, nullptr, &rtv_); - if (!gst_d3d11_result (hr, device_)) { - GST_ERROR ("Couldn't create renter target view, hr 0x%x", (guint) hr); - return GST_FLOW_ERROR; - } - } - - D3D11_SHADER_RESOURCE_VIEW_DESC ShaderDesc; - ShaderDesc.Format = ThisDesc.Format; - ShaderDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - ShaderDesc.Texture2D.MostDetailedMip = ThisDesc.MipLevels - 1; - ShaderDesc.Texture2D.MipLevels = ThisDesc.MipLevels; - - /* Create new shader resource view */ - hr = device_handle->CreateShaderResourceView(SrcSurface, - &ShaderDesc, &ShaderResource); - if (!gst_d3d11_result (hr, device_)) { - return gst_d3d11_screen_capture_return_from_hr(device_handle, hr, - SystemTransitionsExpectedErrors); - } - - ID3D11SamplerState *samplers = sampler_.Get(); - ID3D11ShaderResourceView *srv = ShaderResource.Get(); - ID3D11RenderTargetView *rtv = rtv_.Get(); - device_context->OMSetBlendState(nullptr, nullptr, 0xFFFFFFFF); - device_context->OMSetRenderTargets(1, &rtv, nullptr); - device_context->VSSetShader(vs_.Get(), nullptr, 0); - device_context->PSSetShader(ps_.Get(), nullptr, 0); - device_context->PSSetShaderResources(0, 1, &srv); - device_context->PSSetSamplers(0, 1, &samplers); - device_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - device_context->IASetInputLayout(layout_.Get()); - - /* Create space for vertices for the dirty rects if the current space isn't - * large enough */ - UINT byte_needed = sizeof(VERTEX) * NUMVERTICES * DirtyCount; - MaybeReallocVertexBuffer (byte_needed); - - /* Fill them in */ - VERTEX* DirtyVertex = (VERTEX *) vertex_buffer_; - for (UINT i = 0; i < DirtyCount; ++i, DirtyVertex += NUMVERTICES) { - SetDirtyVert(DirtyVertex, &DirtyBufferi, DeskDesc, - &FullDesc, &ThisDesc); - } - - /* Create vertex buffer */ - D3D11_BUFFER_DESC BufferDesc; - memset (&BufferDesc, 0, sizeof (D3D11_BUFFER_DESC)); - BufferDesc.Usage = D3D11_USAGE_DEFAULT; - BufferDesc.ByteWidth = byte_needed; - BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - BufferDesc.CPUAccessFlags = 0; - D3D11_SUBRESOURCE_DATA InitData; - memset (&InitData, 0, sizeof (D3D11_SUBRESOURCE_DATA)); - InitData.pSysMem = vertex_buffer_; - - hr = device_handle->CreateBuffer(&BufferDesc, &InitData, &VertBuf); - if (!gst_d3d11_result (hr, device_)) { - GST_ERROR ("Failed to create vertex buffer"); - return GST_FLOW_ERROR; - } - - UINT Stride = sizeof(VERTEX); - UINT Offset = 0; - ID3D11Buffer *vert_buf = VertBuf.Get(); - device_context->IASetVertexBuffers(0, 1, &vert_buf, &Stride, &Offset); - - D3D11_VIEWPORT VP; - VP.Width = static_cast<FLOAT>(FullDesc.Width); - VP.Height = static_cast<FLOAT>(FullDesc.Height); - VP.MinDepth = 0.0f; - VP.MaxDepth = 1.0f; - VP.TopLeftX = 0.0f; - VP.TopLeftY = 0.0f; - device_context->RSSetViewports(1, &VP); - - device_context->Draw(NUMVERTICES * DirtyCount, 0); - - /* Unbind srv and rtv from context */ - srv = nullptr; - device_context->PSSetShaderResources (0, 1, &srv); - device_context->OMSetRenderTargets (0, nullptr, nullptr); - - return GST_FLOW_OK; - } - - GstFlowReturn - ProcessFrame(ID3D11Texture2D * acquired_texture, ID3D11Texture2D* SharedSurf, - DXGI_OUTDUPL_DESC* DeskDesc, UINT move_count, UINT dirty_count, - DXGI_OUTDUPL_FRAME_INFO * frame_info) - { - GstFlowReturn ret = GST_FLOW_OK; - - GST_TRACE ("Processing frame"); - - /* Process dirties and moves */ - if (frame_info->TotalMetadataBufferSize) { - if (move_count) { - ret = CopyMove(SharedSurf, (DXGI_OUTDUPL_MOVE_RECT *) metadata_buffer_, - move_count, DeskDesc); - - if (ret != GST_FLOW_OK) - return ret; - } - - if (dirty_count) { - ret = CopyDirty(acquired_texture, SharedSurf, - (RECT *)(metadata_buffer_ + - (move_count * sizeof(DXGI_OUTDUPL_MOVE_RECT))), - dirty_count, DeskDesc); - } - } else { - GST_TRACE ("No metadata"); - } - - return ret; - } - - /* To draw mouse */ - bool - ProcessMonoMask (bool IsMono, PTR_INFO* PtrInfo, INT* PtrWidth, - INT* PtrHeight, INT* PtrLeft, INT* PtrTop, BYTE** InitBuffer, - D3D11_BOX* Box) - { - ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device_); - ID3D11DeviceContext *context_handle = - gst_d3d11_device_get_device_context_handle (device_); - - D3D11_TEXTURE2D_DESC FullDesc; - shared_texture_->GetDesc(&FullDesc); - INT DesktopWidth = FullDesc.Width; - INT DesktopHeight = FullDesc.Height; - - // Pointer position - INT GivenLeft = PtrInfo->Position.x; - INT GivenTop = PtrInfo->Position.y; - - // Figure out if any adjustment is needed for out of bound positions - if (GivenLeft < 0) { - *PtrWidth = GivenLeft + static_cast<INT>(PtrInfo->shape_info.Width); - } else if ((GivenLeft + static_cast<INT>(PtrInfo->shape_info.Width)) > DesktopWidth) { - *PtrWidth = DesktopWidth - GivenLeft; - } else { - *PtrWidth = static_cast<INT>(PtrInfo->shape_info.Width); - } - - if (IsMono) - PtrInfo->shape_info.Height = PtrInfo->shape_info.Height / 2; - - if (GivenTop < 0) { - *PtrHeight = GivenTop + static_cast<INT>(PtrInfo->shape_info.Height); - } else if ((GivenTop + static_cast<INT>(PtrInfo->shape_info.Height)) > DesktopHeight) { - *PtrHeight = DesktopHeight - GivenTop; - } else { - *PtrHeight = static_cast<INT>(PtrInfo->shape_info.Height); - } - - if (IsMono) - PtrInfo->shape_info.Height = PtrInfo->shape_info.Height * 2; - - *PtrLeft = (GivenLeft < 0) ? 0 : GivenLeft; - *PtrTop = (GivenTop < 0) ? 0 : GivenTop; - - D3D11_TEXTURE2D_DESC CopyBufferDesc; - CopyBufferDesc.Width = *PtrWidth; - CopyBufferDesc.Height = *PtrHeight; - CopyBufferDesc.MipLevels = 1; - CopyBufferDesc.ArraySize = 1; - CopyBufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - CopyBufferDesc.SampleDesc.Count = 1; - CopyBufferDesc.SampleDesc.Quality = 0; - CopyBufferDesc.Usage = D3D11_USAGE_STAGING; - CopyBufferDesc.BindFlags = 0; - CopyBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - CopyBufferDesc.MiscFlags = 0; - - ComPtr<ID3D11Texture2D> CopyBuffer; - HRESULT hr = device_handle->CreateTexture2D(&CopyBufferDesc, - nullptr, &CopyBuffer); - if (!gst_d3d11_result (hr, device_)) { - GST_ERROR ("Couldn't create texture for mouse pointer"); - return false; - } - - Box->left = *PtrLeft; - Box->top = *PtrTop; - Box->right = *PtrLeft + *PtrWidth; - Box->bottom = *PtrTop + *PtrHeight; - context_handle->CopySubresourceRegion(CopyBuffer.Get(), - 0, 0, 0, 0, shared_texture_.Get(), 0, Box); - - ComPtr<IDXGISurface> CopySurface; - hr = CopyBuffer.As (&CopySurface); - if (!gst_d3d11_result (hr, device_)) { - GST_ERROR ("Couldn't get DXGI resource from mouse texture"); - return false; - } - - DXGI_MAPPED_RECT MappedSurface; - hr = CopySurface->Map(&MappedSurface, DXGI_MAP_READ); - if (!gst_d3d11_result (hr, device_)) { - GST_ERROR ("Couldn't map DXGI surface"); - return false; - } - - *InitBuffer = new BYTE*PtrWidth * *PtrHeight * BPP; - - UINT* InitBuffer32 = reinterpret_cast<UINT*>(*InitBuffer); - UINT* Desktop32 = reinterpret_cast<UINT*>(MappedSurface.pBits); - UINT DesktopPitchInPixels = MappedSurface.Pitch / sizeof(UINT); - - // What to skip (pixel offset) - UINT SkipX = (GivenLeft < 0) ? (-1 * GivenLeft) : (0); - UINT SkipY = (GivenTop < 0) ? (-1 * GivenTop) : (0); - - if (IsMono) { - for (INT Row = 0; Row < *PtrHeight; Row++) { - BYTE Mask = 0x80; - Mask = Mask >> (SkipX % 8); - for (INT Col = 0; Col < *PtrWidth; Col++) { - BYTE AndMask = PtrInfo->PtrShapeBuffer((Col + SkipX) / 8) + - ((Row + SkipY) * (PtrInfo->shape_info.Pitch)) & Mask; - BYTE XorMask = PtrInfo->PtrShapeBuffer((Col + SkipX) / 8) + - ((Row + SkipY + (PtrInfo->shape_info.Height / 2)) * - (PtrInfo->shape_info.Pitch)) & Mask; - UINT AndMask32 = (AndMask) ? 0xFFFFFFFF : 0xFF000000; - UINT XorMask32 = (XorMask) ? 0x00FFFFFF : 0x00000000; - - InitBuffer32(Row * *PtrWidth) + Col = - (Desktop32(Row * DesktopPitchInPixels) + Col & AndMask32) ^ XorMask32; - - if (Mask == 0x01) { - Mask = 0x80; - } else { - Mask = Mask >> 1; - } - } - } - } else { - UINT* Buffer32 = reinterpret_cast<UINT*>(PtrInfo->PtrShapeBuffer); - - for (INT Row = 0; Row < *PtrHeight; Row++) { - for (INT Col = 0; Col < *PtrWidth; ++Col) { - // Set up mask - UINT MaskVal = 0xFF000000 & Buffer32(Col + SkipX) + ((Row + SkipY) * - (PtrInfo->shape_info.Pitch / sizeof(UINT))); - if (MaskVal) { - // Mask was 0xFF - InitBuffer32(Row * *PtrWidth) + Col = - (Desktop32(Row * DesktopPitchInPixels) + Col ^ - Buffer32(Col + SkipX) + ((Row + SkipY) * - (PtrInfo->shape_info.Pitch / sizeof(UINT)))) | 0xFF000000; - } else { - // Mask was 0x00 - InitBuffer32(Row * *PtrWidth) + Col = Buffer32(Col + SkipX) + - ((Row + SkipY) * (PtrInfo->shape_info.Pitch / sizeof(UINT))) | 0xFF000000; - } - } - } - } - - // Done with resource - hr = CopySurface->Unmap(); - if (!gst_d3d11_result (hr, device_)) { - GST_ERROR ("Failed to unmap DXGI surface"); - return false; - } - - return true; - } - -private: - PTR_INFO ptr_info_; - DXGI_OUTDUPL_DESC output_desc_; - GstD3D11Device * device_; - - ComPtr<ID3D11Texture2D> shared_texture_; - ComPtr<ID3D11RenderTargetView> rtv_; - ComPtr<ID3D11Texture2D> move_texture_; - ComPtr<ID3D11VertexShader> vs_; - ComPtr<ID3D11PixelShader> ps_; - ComPtr<ID3D11InputLayout> layout_; - ComPtr<ID3D11SamplerState> sampler_; - ComPtr<IDXGIOutputDuplication> dupl_; - - /* frame metadata */ - BYTE *metadata_buffer_; - UINT metadata_buffer_size_; - - /* vertex buffers */ - BYTE *vertex_buffer_; - UINT vertex_buffer_size_; -}; /* *INDENT-ON* */ -enum -{ - PROP_0, - PROP_D3D11_DEVICE, - PROP_MONITOR_HANDLE, -}; - -#define DEFAULT_MONITOR_INDEX -1 - -struct _GstD3D11ScreenCapture -{ - GstObject parent; - - GstD3D11Device *device; - guint cached_width; - guint cached_height; - - D3D11DesktopDupObject *dupl_obj; - - HMONITOR monitor_handle; - RECT desktop_coordinates; - gboolean prepared; - gint64 adapter_luid; - - GRecMutex lock; -}; - -static void gst_d3d11_screen_capture_constructed (GObject * object); -static void gst_d3d11_screen_capture_dispose (GObject * object); -static void gst_d3d11_screen_capture_finalize (GObject * object); -static void gst_d3d11_screen_capture_set_property (GObject * object, - guint prop_id, const GValue * value, GParamSpec * pspec); - #define gst_d3d11_screen_capture_parent_class parent_class -G_DEFINE_TYPE (GstD3D11ScreenCapture, gst_d3d11_screen_capture, +G_DEFINE_ABSTRACT_TYPE (GstD3D11ScreenCapture, gst_d3d11_screen_capture, GST_TYPE_OBJECT); static void gst_d3d11_screen_capture_class_init (GstD3D11ScreenCaptureClass * klass) { - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->constructed = gst_d3d11_screen_capture_constructed; - gobject_class->dispose = gst_d3d11_screen_capture_dispose; - gobject_class->finalize = gst_d3d11_screen_capture_finalize; - gobject_class->set_property = gst_d3d11_screen_capture_set_property; - - g_object_class_install_property (gobject_class, PROP_D3D11_DEVICE, - g_param_spec_object ("d3d11device", "D3D11 Device", - "GstD3D11Device object for operating", - GST_TYPE_D3D11_DEVICE, (GParamFlags) - (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS))); - g_object_class_install_property (gobject_class, PROP_MONITOR_HANDLE, - g_param_spec_pointer ("monitor-handle", "Monitor Handle", - "A HMONITOR handle of monitor to capture", (GParamFlags) - (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS))); } static void gst_d3d11_screen_capture_init (GstD3D11ScreenCapture * self) { - g_rec_mutex_init (&self->lock); - - memset (&self->desktop_coordinates, 0, sizeof (RECT)); } -static void -gst_d3d11_screen_capture_constructed (GObject * object) +GstFlowReturn +gst_d3d11_screen_capture_prepare (GstD3D11ScreenCapture * capture) { - GstD3D11ScreenCapture *self = GST_D3D11_SCREEN_CAPTURE (object); - /* *INDENT-OFF* */ - ComPtr<IDXGIDevice> dxgi_device; - ComPtr<IDXGIAdapter1> adapter; - ComPtr<IDXGIOutput> output; - ComPtr<IDXGIOutput1> output1; - /* *INDENT-ON* */ - HRESULT hr; - gboolean ret = FALSE; - DXGI_OUTPUT_DESC output_desc; - DXGI_ADAPTER_DESC adapter_desc; - gint64 luid, device_luid; - - if (!self->device) { - GST_WARNING_OBJECT (self, "D3D11 device is unavailable"); - goto out; - } - - if (!self->monitor_handle) { - GST_WARNING_OBJECT (self, "Null monitor handle"); - goto out; - } - - hr = gst_d3d11_screen_capture_find_output_for_monitor (self->monitor_handle, - &adapter, &output); - if (!gst_d3d11_result (hr, self->device)) { - GST_WARNING_OBJECT (self, - "Failed to find associated adapter for monitor %p", - self->monitor_handle); - goto out; - } - - hr = output.As (&output1); - if (!gst_d3d11_result (hr, self->device)) { - GST_WARNING_OBJECT (self, "IDXGIOutput1 interface is unavailble"); - goto out; - } + GstD3D11ScreenCaptureClass *klass; - hr = adapter->GetDesc (&adapter_desc); - if (!gst_d3d11_result (hr, self->device)) { - GST_WARNING_OBJECT (self, "Failed to get adapter desc"); - goto out; - } - - luid = gst_d3d11_luid_to_int64 (&adapter_desc.AdapterLuid); - g_object_get (self->device, "adapter-luid", &device_luid, nullptr); - if (luid != device_luid) { - GST_WARNING_OBJECT (self, "Incompatible d3d11 device"); - goto out; - } - - hr = output->GetDesc (&output_desc); - if (!gst_d3d11_result (hr, self->device)) { - GST_WARNING_OBJECT (self, "Failed to get output desc"); - goto out; - } - - /* DesktopCoordinates will not report actual texture size in case that - * application is running without dpi-awareness. To get actual monitor size, - * we need to use Win32 API... */ - MONITORINFOEXW monitor_info; - DEVMODEW dev_mode; - - monitor_info.cbSize = sizeof (MONITORINFOEXW); - if (!GetMonitorInfoW (output_desc.Monitor, (LPMONITORINFO) & monitor_info)) { - GST_WARNING_OBJECT (self, "Couldn't get monitor info"); - goto out; - } - - dev_mode.dmSize = sizeof (DEVMODEW); - dev_mode.dmDriverExtra = sizeof (POINTL); - dev_mode.dmFields = DM_POSITION; - if (!EnumDisplaySettingsW - (monitor_info.szDevice, ENUM_CURRENT_SETTINGS, &dev_mode)) { - GST_WARNING_OBJECT (self, "Couldn't enumerate display settings"); - goto out; - } - - self->desktop_coordinates.left = dev_mode.dmPosition.x; - self->desktop_coordinates.top = dev_mode.dmPosition.y; - self->desktop_coordinates.right = - dev_mode.dmPosition.x + dev_mode.dmPelsWidth; - self->desktop_coordinates.bottom = - dev_mode.dmPosition.y + dev_mode.dmPelsHeight; - - self->cached_width = - self->desktop_coordinates.right - self->desktop_coordinates.left; - self->cached_height = - self->desktop_coordinates.bottom - self->desktop_coordinates.top; - - GST_DEBUG_OBJECT (self, - "Desktop coordinates left:top:right:bottom = %ld:%ld:%ld:%ld (%dx%d)", - self->desktop_coordinates.left, self->desktop_coordinates.top, - self->desktop_coordinates.right, self->desktop_coordinates.bottom, - self->cached_width, self->cached_height); - - g_object_get (self->device, "adapter-luid", &self->adapter_luid, nullptr); - - ret = TRUE; - -out: - if (!ret) - gst_clear_object (&self->device); - - G_OBJECT_CLASS (parent_class)->constructed (object); -} + g_return_val_if_fail (GST_IS_D3D11_SCREEN_CAPTURE (capture), GST_FLOW_ERROR); -static void -gst_d3d11_screen_capture_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstD3D11ScreenCapture *self = GST_D3D11_SCREEN_CAPTURE (object); + klass = GST_D3D11_SCREEN_CAPTURE_GET_CLASS (capture); + g_assert (klass->prepare); - switch (prop_id) { - case PROP_D3D11_DEVICE: - self->device = (GstD3D11Device *) g_value_dup_object (value); - break; - case PROP_MONITOR_HANDLE: - self->monitor_handle = (HMONITOR) g_value_get_pointer (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } + return klass->prepare (capture); } -static void -gst_d3d11_screen_capture_dispose (GObject * object) +gboolean +gst_d3d11_screen_capture_get_size (GstD3D11ScreenCapture * capture, + guint * width, guint * height) { - GstD3D11ScreenCapture *self = GST_D3D11_SCREEN_CAPTURE (object); + GstD3D11ScreenCaptureClass *klass; - if (self->dupl_obj) { - delete self->dupl_obj; - self->dupl_obj = nullptr; - } + g_return_val_if_fail (GST_IS_D3D11_SCREEN_CAPTURE (capture), FALSE); + g_return_val_if_fail (width != nullptr, FALSE); + g_return_val_if_fail (height != nullptr, FALSE); - gst_clear_object (&self->device); + klass = GST_D3D11_SCREEN_CAPTURE_GET_CLASS (capture); + g_assert (klass->get_size); - G_OBJECT_CLASS (parent_class)->dispose (object); + return klass->get_size (capture, width, height); } -static void -gst_d3d11_screen_capture_finalize (GObject * object) +gboolean +gst_d3d11_screen_capture_get_colorimetry (GstD3D11ScreenCapture * capture, + GstVideoColorimetry * colorimetry) { - GstD3D11ScreenCapture *self = GST_D3D11_SCREEN_CAPTURE (object); + GstD3D11ScreenCaptureClass *klass; - g_rec_mutex_clear (&self->lock); + g_return_val_if_fail (GST_IS_D3D11_SCREEN_CAPTURE (capture), FALSE); + g_return_val_if_fail (colorimetry != nullptr, FALSE); - G_OBJECT_CLASS (parent_class)->finalize (object); -} + klass = GST_D3D11_SCREEN_CAPTURE_GET_CLASS (capture); + g_assert (klass->get_colorimetry); -static void -gst_d3d11_screen_capture_weak_ref_notify (gpointer data, - GstD3D11ScreenCapture * dupl) -{ - G_LOCK (dupl_list_lock); - dupl_list = g_list_remove (dupl_list, dupl); - G_UNLOCK (dupl_list_lock); + return klass->get_colorimetry (capture, colorimetry); } -GstD3D11ScreenCapture * -gst_d3d11_screen_capture_new (GstD3D11Device * device, HMONITOR monitor_handle) +gboolean +gst_d3d11_screen_capture_unlock (GstD3D11ScreenCapture * capture) { - GstD3D11ScreenCapture *self = nullptr; - GList *iter; - - g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), nullptr); - - /* Check if we have dup object corresponding to monitor_handle, - * and if there is already configured capture object, reuse it. - * This is because of the limitation of desktop duplication API - * (i.e., in a process, only one duplication object can exist). - * See also - * https://docs.microsoft.com/en-us/windows/win32/api/dxgi1_2/nf-dxgi1_2-idxgioutput1-duplicateoutput#remarks - */ - G_LOCK (dupl_list_lock); - for (iter = dupl_list; iter; iter = g_list_next (iter)) { - GstD3D11ScreenCapture *dupl = (GstD3D11ScreenCapture *) iter->data; - - if (dupl->monitor_handle == monitor_handle) { - GST_DEBUG ("Found configured desktop dup object for monitor handle %p", - monitor_handle); - self = (GstD3D11ScreenCapture *) gst_object_ref (dupl); - break; - } - } - - if (self) { - G_UNLOCK (dupl_list_lock); - return self; - } - - self = (GstD3D11ScreenCapture *) g_object_new (GST_TYPE_D3D11_SCREEN_CAPTURE, - "d3d11device", device, "monitor-handle", monitor_handle, nullptr); - - if (!self->device) { - GST_WARNING_OBJECT (self, "Couldn't configure desktop dup object"); - gst_object_unref (self); - G_UNLOCK (dupl_list_lock); + GstD3D11ScreenCaptureClass *klass; - return nullptr; - } - - g_object_weak_ref (G_OBJECT (self), - (GWeakNotify) gst_d3d11_screen_capture_weak_ref_notify, nullptr); - dupl_list = g_list_append (dupl_list, self); + g_return_val_if_fail (GST_IS_D3D11_SCREEN_CAPTURE (capture), FALSE); + klass = GST_D3D11_SCREEN_CAPTURE_GET_CLASS (capture); - G_UNLOCK (dupl_list_lock); + if (klass->unlock) + return klass->unlock (capture); - return self; + return TRUE; } -GstFlowReturn -gst_d3d11_screen_capture_prepare (GstD3D11ScreenCapture * capture) +gboolean +gst_d3d11_screen_capture_unlock_stop (GstD3D11ScreenCapture * capture) { - GstFlowReturn ret; - - g_return_val_if_fail (GST_IS_D3D11_SCREEN_CAPTURE (capture), GST_FLOW_ERROR); - g_return_val_if_fail (capture->device != nullptr, GST_FLOW_ERROR); - - g_rec_mutex_lock (&capture->lock); - if (capture->prepared) { - GST_DEBUG_OBJECT (capture, "Already prepared"); - g_rec_mutex_unlock (&capture->lock); - return GST_FLOW_OK; - } + GstD3D11ScreenCaptureClass *klass; - capture->dupl_obj = new D3D11DesktopDupObject (); - ret = capture->dupl_obj->Init (capture->device, capture->monitor_handle); - if (ret != GST_FLOW_OK) { - GST_WARNING_OBJECT (capture, - "Couldn't prepare capturing, %sexpected failure", - ret == GST_D3D11_SCREEN_CAPTURE_FLOW_EXPECTED_ERROR ? "" : "un"); - - delete capture->dupl_obj; - capture->dupl_obj = nullptr; - g_rec_mutex_unlock (&capture->lock); - - return ret; - } + g_return_val_if_fail (GST_IS_D3D11_SCREEN_CAPTURE (capture), FALSE); + klass = GST_D3D11_SCREEN_CAPTURE_GET_CLASS (capture); - capture->prepared = TRUE; - g_rec_mutex_unlock (&capture->lock); + if (klass->unlock_stop) + return klass->unlock_stop (capture); - return GST_FLOW_OK; + return TRUE; } -gboolean -gst_d3d11_screen_capture_get_size (GstD3D11ScreenCapture * capture, - guint * width, guint * height) +void +gst_d3d11_screen_capture_show_border (GstD3D11ScreenCapture * capture, + gboolean show) { - g_return_val_if_fail (GST_IS_D3D11_SCREEN_CAPTURE (capture), FALSE); - g_return_val_if_fail (width != nullptr, FALSE); - g_return_val_if_fail (height != nullptr, FALSE); + GstD3D11ScreenCaptureClass *klass; - g_rec_mutex_lock (&capture->lock); - *width = 0; - *height = 0; + g_return_if_fail (GST_IS_D3D11_SCREEN_CAPTURE (capture)); + klass = GST_D3D11_SCREEN_CAPTURE_GET_CLASS (capture); - if (capture->dupl_obj) { - capture->dupl_obj->GetSize (&capture->cached_width, - &capture->cached_height); - } - - *width = capture->cached_width; - *height = capture->cached_height; - g_rec_mutex_unlock (&capture->lock); - - return TRUE; + if (klass->show_border) + klass->show_border (capture, show); } GstFlowReturn @@ -1827,91 +139,19 @@ GstD3D11Device * device, ID3D11Texture2D * texture, ID3D11RenderTargetView * rtv, ID3D11VertexShader * vs, ID3D11PixelShader * ps, ID3D11InputLayout * layout, - ID3D11SamplerState * sampler, ID3D11BlendState * blend, gboolean draw_mouse) + ID3D11SamplerState * sampler, ID3D11BlendState * blend, + D3D11_BOX * crop_box, gboolean draw_mouse) { - GstFlowReturn ret = GST_FLOW_OK; - D3D11_TEXTURE2D_DESC desc; - gboolean shared_device = FALSE; - guint width, height; + GstD3D11ScreenCaptureClass *klass; g_return_val_if_fail (GST_IS_D3D11_SCREEN_CAPTURE (capture), GST_FLOW_ERROR); g_return_val_if_fail (texture != nullptr, GST_FLOW_ERROR); - if (device != capture->device) { - gint64 luid; - - g_object_get (device, "adapter-luid", &luid, nullptr); - /* source element must hold d3d11 device for the same GPU already - * by DXGI duplication API design */ - if (luid != capture->adapter_luid) { - GST_ERROR_OBJECT (capture, "Trying to capture from different device"); - return GST_FLOW_ERROR; - } - - shared_device = TRUE; - } - - g_rec_mutex_lock (&capture->lock); - if (!capture->prepared) - ret = gst_d3d11_screen_capture_prepare (capture); - - if (ret != GST_FLOW_OK) { - GST_WARNING_OBJECT (capture, "We are not prepared"); - g_rec_mutex_unlock (&capture->lock); - return ret; - } - - gst_d3d11_screen_capture_get_size (capture, &width, &height); - - texture->GetDesc (&desc); - if (desc.Width != width || desc.Height != height) { - GST_INFO_OBJECT (capture, - "Different texture size, ours: %dx%d, external: %dx%d", - width, height, desc.Width, desc.Height); - g_rec_mutex_unlock (&capture->lock); - - return GST_D3D11_SCREEN_CAPTURE_FLOW_SIZE_CHANGED; - } - - gst_d3d11_device_lock (capture->device); - ret = capture->dupl_obj->Capture (); - if (ret != GST_FLOW_OK) { - gst_d3d11_device_unlock (capture->device); - - delete capture->dupl_obj; - capture->dupl_obj = nullptr; - capture->prepared = FALSE; - - if (ret == GST_D3D11_SCREEN_CAPTURE_FLOW_EXPECTED_ERROR) { - GST_WARNING_OBJECT (capture, - "Couldn't capture frame, but expected failure"); - } else { - GST_ERROR_OBJECT (capture, "Unexpected failure during capture"); - } - - g_rec_mutex_unlock (&capture->lock); - return ret; - } - - GST_LOG_OBJECT (capture, "Capture done"); - if (shared_device) - gst_d3d11_device_lock (device); - - ret = capture->dupl_obj->CopyToTexture (device, texture); - if (ret != GST_FLOW_OK) - goto out; - - if (draw_mouse) - capture->dupl_obj->DrawMouse (device, rtv, vs, ps, layout, sampler, blend); - -out: - if (shared_device) - gst_d3d11_device_unlock (device); - - gst_d3d11_device_unlock (capture->device); - g_rec_mutex_unlock (&capture->lock); + klass = GST_D3D11_SCREEN_CAPTURE_GET_CLASS (capture); + g_assert (klass->do_capture); - return ret; + return klass->do_capture (capture, device, texture, rtv, + vs, ps, layout, sampler, blend, crop_box, draw_mouse); } HRESULT
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11screencapture.h -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11screencapture.h
Changed
@@ -1,6 +1,6 @@ /* * GStreamer - * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -26,16 +26,60 @@ G_BEGIN_DECLS +#define GST_TYPE_D3D11_SCREEN_CAPTURE (gst_d3d11_screen_capture_get_type()) +#define GST_D3D11_SCREEN_CAPTURE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_D3D11_SCREEN_CAPTURE,GstD3D11ScreenCapture)) +#define GST_D3D11_SCREEN_CAPTURE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_D3D11_SCREEN_CAPTURE,GstD3D11ScreenCaptureClass)) +#define GST_D3D11_SCREEN_CAPTURE_GET_CLASS(obj) (GST_D3D11_SCREEN_CAPTURE_CLASS(G_OBJECT_GET_CLASS(obj))) +#define GST_IS_D3D11_SCREEN_CAPTURE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_D3D11_SCREEN_CAPTURE)) +#define GST_IS_D3D11_SCREEN_CAPTURE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_D3D11_SCREEN_CAPTURE)) +#define GST_D3D11_SCREEN_CAPTURE_CAST(obj) ((GstD3D11ScreenCapture*)(obj)) + +typedef struct _GstD3D11ScreenCapture GstD3D11ScreenCapture; +typedef struct _GstD3D11ScreenCaptureClass GstD3D11ScreenCaptureClass; + #define GST_D3D11_SCREEN_CAPTURE_FLOW_EXPECTED_ERROR GST_FLOW_CUSTOM_SUCCESS #define GST_D3D11_SCREEN_CAPTURE_FLOW_SIZE_CHANGED GST_FLOW_CUSTOM_SUCCESS_1 #define GST_D3D11_SCREEN_CAPTURE_FLOW_UNSUPPORTED GST_FLOW_CUSTOM_ERROR -#define GST_TYPE_D3D11_SCREEN_CAPTURE (gst_d3d11_screen_capture_get_type()) -G_DECLARE_FINAL_TYPE (GstD3D11ScreenCapture, gst_d3d11_screen_capture, - GST, D3D11_SCREEN_CAPTURE, GstObject); +struct _GstD3D11ScreenCapture +{ + GstObject parent; +}; + +struct _GstD3D11ScreenCaptureClass +{ + GstObjectClass parent_class; + + GstFlowReturn (*prepare) (GstD3D11ScreenCapture * capture); + + gboolean (*get_size) (GstD3D11ScreenCapture * capture, + guint * width, + guint * height); + + gboolean (*get_colorimetry) (GstD3D11ScreenCapture * capture, + GstVideoColorimetry * colorimetry); + + gboolean (*unlock) (GstD3D11ScreenCapture * capture); + + gboolean (*unlock_stop) (GstD3D11ScreenCapture * capture); -GstD3D11ScreenCapture * gst_d3d11_screen_capture_new (GstD3D11Device * device, - HMONITOR monitor_handle); + void (*show_border) (GstD3D11ScreenCapture * capture, + gboolean show); + + GstFlowReturn (*do_capture) (GstD3D11ScreenCapture * capture, + GstD3D11Device * device, + ID3D11Texture2D * texture, + ID3D11RenderTargetView * rtv, + ID3D11VertexShader * vs, + ID3D11PixelShader * ps, + ID3D11InputLayout * layout, + ID3D11SamplerState * sampler, + ID3D11BlendState * blend, + D3D11_BOX * crop_box, + gboolean draw_mouse); +}; + +GType gst_d3d11_screen_capture_get_type (void); GstFlowReturn gst_d3d11_screen_capture_prepare (GstD3D11ScreenCapture * capture); @@ -43,16 +87,27 @@ guint * width, guint * height); -GstFlowReturn gst_d3d11_screen_capture_do_capture (GstD3D11ScreenCapture * capture, - GstD3D11Device * device, - ID3D11Texture2D * texture, - ID3D11RenderTargetView * rtv, - ID3D11VertexShader * vs, - ID3D11PixelShader * ps, - ID3D11InputLayout * layout, - ID3D11SamplerState * sampler, - ID3D11BlendState * blend, - gboolean draw_mouse); +gboolean gst_d3d11_screen_capture_get_colorimetry (GstD3D11ScreenCapture * capture, + GstVideoColorimetry * colorimetry); + +gboolean gst_d3d11_screen_capture_unlock (GstD3D11ScreenCapture * capture); + +gboolean gst_d3d11_screen_capture_unlock_stop (GstD3D11ScreenCapture * capture); + +void gst_d3d11_screen_capture_show_border (GstD3D11ScreenCapture * capture, + gboolean show); + +GstFlowReturn gst_d3d11_screen_capture_do_capture (GstD3D11ScreenCapture * capture, + GstD3D11Device * device, + ID3D11Texture2D * texture, + ID3D11RenderTargetView * rtv, + ID3D11VertexShader * vs, + ID3D11PixelShader * ps, + ID3D11InputLayout * layout, + ID3D11SamplerState * sampler, + ID3D11BlendState * blend, + D3D11_BOX * crop_box, + gboolean draw_mouse); HRESULT gst_d3d11_screen_capture_find_output_for_monitor (HMONITOR monitor, IDXGIAdapter1 ** adapter, @@ -67,5 +122,7 @@ IDXGIAdapter1 ** adapter, IDXGIOutput ** output); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstD3D11ScreenCapture, gst_object_unref) + G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11screencapturedevice.h -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11screencapturedevice.h
Changed
@@ -20,6 +20,7 @@ #pragma once #include <gst/gst.h> +#include "gstd3d11pluginutils.h" G_BEGIN_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11screencapturesrc.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11screencapturesrc.cpp
Changed
@@ -37,9 +37,11 @@ #endif #include "gstd3d11screencapturesrc.h" -#include "gstd3d11screencapture.h" +#include "gstd3d11dxgicapture.h" +#ifdef HAVE_WINRT_CAPTURE +#include "gstd3d11winrtcapture.h" +#endif #include "gstd3d11pluginutils.h" -#include "gstd3d11shader.h" #include <wrl.h> #include <string.h> @@ -56,14 +58,64 @@ PROP_MONITOR_INDEX, PROP_MONITOR_HANDLE, PROP_SHOW_CURSOR, - - PROP_LAST, + PROP_CROP_X, + PROP_CROP_Y, + PROP_CROP_WIDTH, + PROP_CROP_HEIGHT, + PROP_WINDOW_HANDLE, + PROP_SHOW_BORDER, + PROP_CAPTURE_API, + PROP_ADAPTER, }; -static GParamSpec *propertiesPROP_LAST; +typedef enum +{ + GST_D3D11_SCREEN_CAPTURE_API_DXGI, + GST_D3D11_SCREEN_CAPTURE_API_WGC, +} GstD3D11ScreenCaptureAPI; + +#ifdef HAVE_WINRT_CAPTURE +/** + * GstD3D11ScreenCaptureAPI: + * + * Since: 1.22 + */ +#define GST_TYPE_D3D11_SCREEN_CAPTURE_API (gst_d3d11_screen_capture_api_get_type()) +static GType +gst_d3d11_screen_capture_api_get_type (void) +{ + static GType api_type = 0; + + GST_D3D11_CALL_ONCE_BEGIN { + static const GEnumValue api_types = { + /** + * GstD3D11ScreenCaptureAPI::dxgi: + * + * Since: 1.22 + */ + {GST_D3D11_SCREEN_CAPTURE_API_DXGI, "DXGI Desktop Duplication", "dxgi"}, + + /** + * GstD3D11ScreenCaptureAPI::wgc: + * + * Since: 1.22 + */ + {GST_D3D11_SCREEN_CAPTURE_API_WGC, "Windows Graphics Capture", "wgc"}, + {0, nullptr, nullptr}, + }; + + api_type = g_enum_register_static ("GstD3D11ScreenCaptureAPI", api_types); + } GST_D3D11_CALL_ONCE_END; + + return api_type; +} +#endif #define DEFAULT_MONITOR_INDEX -1 #define DEFAULT_SHOW_CURSOR FALSE +#define DEFAULT_SHOW_BORDER FALSE +#define DEFAULT_CAPTURE_API GST_D3D11_SCREEN_CAPTURE_API_DXGI +#define DEFAULT_ADAPTER -1 static GstStaticCaps template_caps = GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES @@ -86,7 +138,17 @@ gint64 adapter_luid; gint monitor_index; HMONITOR monitor_handle; + HWND window_handle; gboolean show_cursor; + gboolean show_border; + GstD3D11ScreenCaptureAPI capture_api; + gint adapter; + + guint crop_x; + guint crop_y; + guint crop_w; + guint crop_h; + D3D11_BOX crop_box; gboolean flushing; GstClockTime min_latency; @@ -99,9 +161,12 @@ ID3D11InputLayout *layout; ID3D11SamplerState *sampler; ID3D11BlendState *blend; + + CRITICAL_SECTION lock; }; static void gst_d3d11_screen_capture_src_dispose (GObject * object); +static void gst_d3d11_screen_capture_src_finalize (GObject * object); static void gst_d3d11_screen_capture_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_d3d11_screen_capture_src_get_property (GObject * object, @@ -141,38 +206,152 @@ GstCaps *caps; gobject_class->dispose = gst_d3d11_screen_capture_src_dispose; + gobject_class->finalize = gst_d3d11_screen_capture_src_finalize; gobject_class->set_property = gst_d3d11_screen_capture_src_set_property; gobject_class->get_property = gst_d3d11_screen_capture_src_get_property; - propertiesPROP_MONITOR_INDEX = + g_object_class_install_property (gobject_class, PROP_MONITOR_INDEX, g_param_spec_int ("monitor-index", "Monitor Index", - "Zero-based index for monitor to capture (-1 = primary monitor)", - -1, G_MAXINT, DEFAULT_MONITOR_INDEX, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | - G_PARAM_STATIC_STRINGS)); + "Zero-based index for monitor to capture (-1 = primary monitor)", + -1, G_MAXINT, DEFAULT_MONITOR_INDEX, + (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | + G_PARAM_STATIC_STRINGS))); - propertiesPROP_MONITOR_HANDLE = + g_object_class_install_property (gobject_class, PROP_MONITOR_HANDLE, g_param_spec_uint64 ("monitor-handle", "Monitor Handle", - "A HMONITOR handle of monitor to capture", - 0, G_MAXUINT64, 0, - (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | - G_PARAM_STATIC_STRINGS)); + "A HMONITOR handle of monitor to capture", + 0, G_MAXUINT64, 0, + (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | + G_PARAM_STATIC_STRINGS))); - propertiesPROP_SHOW_CURSOR = + g_object_class_install_property (gobject_class, PROP_SHOW_CURSOR, g_param_spec_boolean ("show-cursor", - "Show Mouse Cursor", "Whether to show mouse cursor", - DEFAULT_SHOW_CURSOR, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_properties (gobject_class, PROP_LAST, properties); + "Show Mouse Cursor", "Whether to show mouse cursor", + DEFAULT_SHOW_CURSOR, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /** + * GstD3D11ScreenCaptureSrc:crop-x: + * + * Horizontal coordinate of top left corner for the screen capture area + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_CROP_X, + g_param_spec_uint ("crop-x", "Crop X", + "Horizontal coordinate of top left corner for the screen capture area", + 0, G_MAXUINT, 0, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /** + * GstD3D11ScreenCaptureSrc:crop-y: + * + * Vertical coordinate of top left corner for the screen capture area + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_CROP_Y, + g_param_spec_uint ("crop-y", "Crop Y", + "Vertical coordinate of top left corner for the screen capture area", + 0, G_MAXUINT, 0, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /** + * GstD3D11ScreenCaptureSrc:crop-width: + * + * Width of screen capture area (0 = maximum) + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_CROP_WIDTH, + g_param_spec_uint ("crop-width", "Crop Width", + "Width of screen capture area (0 = maximum)", + 0, G_MAXUINT, 0, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /** + * GstD3D11ScreenCaptureSrc:crop-height: + * + * Height of screen capture area (0 = maximum) + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_CROP_HEIGHT, + g_param_spec_uint ("crop-height", "Crop Height", + "Height of screen capture area (0 = maximum)", + 0, G_MAXUINT, 0, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + +#ifdef HAVE_WINRT_CAPTURE + if (gst_d3d11_winrt_capture_load_library ()) { + /** + * GstD3D11ScreenCaptureSrc:window-handle: + * + * HWND window handle to capture + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_WINDOW_HANDLE, + g_param_spec_uint64 ("window-handle", "Window Handle", + "A HWND handle of window to capture", + 0, G_MAXUINT64, 0, + (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | + GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_STATIC_STRINGS))); + + /** + * GstD3D11ScreenCaptureSrc:show-border: + * + * Show border lines to capture area when WGC mode is selected. + * This feature requires Windows11 or newer + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_SHOW_BORDER, + g_param_spec_boolean ("show-border", "Show Border", + "Show border lines to capture area when WGC mode is selected", + DEFAULT_SHOW_BORDER, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_READWRITE + | G_PARAM_STATIC_STRINGS))); + + /** + * GstD3D11ScreenCaptureSrc:capture-api: + * + * Capture API to use + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_CAPTURE_API, + g_param_spec_enum ("capture-api", "Capture API", "Capture API to use", + GST_TYPE_D3D11_SCREEN_CAPTURE_API, + DEFAULT_CAPTURE_API, + (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | + GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_STATIC_STRINGS))); + gst_type_mark_as_plugin_api (GST_TYPE_D3D11_SCREEN_CAPTURE_API, + (GstPluginAPIFlags) 0); + + /** + * GstD3D11ScreenCaptureSrc:adapter: + * + * DXGI Adapter index for creating device when WGC mode is selected + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_ADAPTER, + g_param_spec_int ("adapter", "Adapter", + "DXGI Adapter index for creating device when WGC mode is selected " + "(-1 for default)", + -1, G_MAXINT32, DEFAULT_ADAPTER, + (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | + GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_STATIC_STRINGS))); + } +#endif element_class->set_context = GST_DEBUG_FUNCPTR (gst_d3d11_screen_capture_src_set_context); gst_element_class_set_static_metadata (element_class, "Direct3D11 screen capture src", "Source/Video", - "Capture desktop image by using Desktop Duplication API", - "Seungha Yang <seungha@centricular.com>"); + "Captures desktop screen", "Seungha Yang <seungha@centricular.com>"); caps = gst_d3d11_get_updated_template_caps (&template_caps); gst_element_class_add_pad_template (element_class, @@ -195,7 +374,6 @@ GST_DEBUG_FUNCPTR (gst_d3d11_screen_capture_src_unlock_stop); basesrc_class->query = GST_DEBUG_FUNCPTR (gst_d3d11_screen_capture_src_src_query); - basesrc_class->create = GST_DEBUG_FUNCPTR (gst_d3d11_screen_capture_src_create); } @@ -208,8 +386,13 @@ self->monitor_index = DEFAULT_MONITOR_INDEX; self->show_cursor = DEFAULT_SHOW_CURSOR; + self->show_border = DEFAULT_SHOW_BORDER; + self->capture_api = DEFAULT_CAPTURE_API; + self->adapter = DEFAULT_ADAPTER; self->min_latency = GST_CLOCK_TIME_NONE; self->max_latency = GST_CLOCK_TIME_NONE; + + InitializeCriticalSection (&self->lock); } static void @@ -224,10 +407,21 @@ } static void +gst_d3d11_screen_capture_src_finalize (GObject * object) +{ + GstD3D11ScreenCaptureSrc *self = GST_D3D11_SCREEN_CAPTURE_SRC (object); + + DeleteCriticalSection (&self->lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void gst_d3d11_screen_capture_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstD3D11ScreenCaptureSrc *self = GST_D3D11_SCREEN_CAPTURE_SRC (object); + GstD3D11CSLockGuard lk (&self->lock); switch (prop_id) { case PROP_MONITOR_INDEX: @@ -239,6 +433,32 @@ case PROP_SHOW_CURSOR: self->show_cursor = g_value_get_boolean (value); break; + case PROP_CROP_X: + self->crop_x = g_value_get_uint (value); + break; + case PROP_CROP_Y: + self->crop_y = g_value_get_uint (value); + break; + case PROP_CROP_WIDTH: + self->crop_w = g_value_get_uint (value); + break; + case PROP_CROP_HEIGHT: + self->crop_h = g_value_get_uint (value); + break; + case PROP_WINDOW_HANDLE: + self->window_handle = (HWND) g_value_get_uint64 (value); + break; + case PROP_SHOW_BORDER: + self->show_border = g_value_get_boolean (value); + if (self->capture) + gst_d3d11_screen_capture_show_border (self->capture, self->show_border); + break; + case PROP_CAPTURE_API: + self->capture_api = (GstD3D11ScreenCaptureAPI) g_value_get_enum (value); + break; + case PROP_ADAPTER: + self->adapter = g_value_get_int (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -261,6 +481,30 @@ case PROP_SHOW_CURSOR: g_value_set_boolean (value, self->show_cursor); break; + case PROP_CROP_X: + g_value_set_uint (value, self->crop_x); + break; + case PROP_CROP_Y: + g_value_set_uint (value, self->crop_y); + break; + case PROP_CROP_WIDTH: + g_value_set_uint (value, self->crop_w); + break; + case PROP_CROP_HEIGHT: + g_value_set_uint (value, self->crop_h); + break; + case PROP_WINDOW_HANDLE: + g_value_set_uint64 (value, (guint64) self->window_handle); + break; + case PROP_SHOW_BORDER: + g_value_set_boolean (value, self->show_border); + break; + case PROP_CAPTURE_API: + g_value_set_enum (value, self->capture_api); + break; + case PROP_ADAPTER: + g_value_set_int (value, self->adapter); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -272,30 +516,65 @@ GstContext * context) { GstD3D11ScreenCaptureSrc *self = GST_D3D11_SCREEN_CAPTURE_SRC (element); + GstD3D11CSLockGuard lk (&self->lock); - gst_d3d11_handle_set_context_for_adapter_luid (element, - context, self->adapter_luid, &self->device); + if (self->capture_api == GST_D3D11_SCREEN_CAPTURE_API_DXGI) { + gst_d3d11_handle_set_context_for_adapter_luid (element, + context, self->adapter_luid, &self->device); + } else { + gst_d3d11_handle_set_context (element, + context, self->adapter, &self->device); + } GST_ELEMENT_CLASS (parent_class)->set_context (element, context); } +static D3D11_BOX +gst_d3d11_screen_capture_src_get_crop_box (GstD3D11ScreenCaptureSrc * self) +{ + D3D11_BOX box; + guint screen_width, screen_height; + + box.front = 0; + box.back = 1; + + gst_d3d11_screen_capture_get_size (self->capture, &screen_width, + &screen_height); + + if ((self->crop_x + self->crop_w) > screen_width || + (self->crop_y + self->crop_h) > screen_height) { + GST_WARNING ("Capture region outside of the screen bounds; ignoring."); + + box.left = 0; + box.top = 0; + box.right = screen_width; + box.bottom = screen_height; + } else { + box.left = self->crop_x; + box.top = self->crop_y; + box.right = self->crop_w ? (self->crop_x + self->crop_w) : screen_width; + box.bottom = self->crop_h ? (self->crop_y + self->crop_h) : screen_height; + } + + return box; +} + static GstCaps * gst_d3d11_screen_capture_src_get_caps (GstBaseSrc * bsrc, GstCaps * filter) { GstD3D11ScreenCaptureSrc *self = GST_D3D11_SCREEN_CAPTURE_SRC (bsrc); GstCaps *caps = NULL; guint width, height; + GstVideoColorimetry color; if (!self->capture) { - GST_DEBUG_OBJECT (self, "Duplication object is not configured yet"); + GST_DEBUG_OBJECT (self, "capture object is not configured yet"); return gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD (bsrc)); } - if (!gst_d3d11_screen_capture_get_size (self->capture, &width, &height)) { - GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ, - ("Cannot query supported resolution"), (NULL)); - return NULL; - } + self->crop_box = gst_d3d11_screen_capture_src_get_crop_box (self); + width = self->crop_box.right - self->crop_box.left; + height = self->crop_box.bottom - self->crop_box.top; caps = gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD (bsrc)); caps = gst_caps_make_writable (caps); @@ -303,6 +582,16 @@ gst_caps_set_simple (caps, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, nullptr); + if (gst_d3d11_screen_capture_get_colorimetry (self->capture, &color)) { + gchar *color_str = gst_video_colorimetry_to_string (&color); + + if (color_str) { + gst_caps_set_simple (caps, "colorimetry", G_TYPE_STRING, color_str, + nullptr); + g_free (color_str); + } + } + if (filter) { GstCaps *tmp = gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); @@ -441,8 +730,8 @@ d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); if (!d3d11_params) { d3d11_params = gst_d3d11_allocation_params_new (self->device, &vinfo, - (GstD3D11AllocationFlags) 0, - D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET); + GST_D3D11_ALLOCATION_FLAG_DEFAULT, + D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET, 0); } else { d3d11_params->desc0.BindFlags |= D3D11_BIND_RENDER_TARGET; } @@ -456,14 +745,13 @@ goto error; } - if (self->downstream_supports_d3d11) { - /* d3d11 buffer pool will update buffer size based on allocated texture, - * get size from config again */ - config = gst_buffer_pool_get_config (pool); - gst_buffer_pool_config_get_params (config, - nullptr, &size, nullptr, nullptr); - gst_structure_free (config); - } else { + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); + + if (!self->downstream_supports_d3d11) { self->pool = gst_d3d11_buffer_pool_new (self->device); config = gst_buffer_pool_get_config (self->pool); @@ -475,7 +763,7 @@ d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); if (!d3d11_params) { d3d11_params = gst_d3d11_allocation_params_new (self->device, &vinfo, - (GstD3D11AllocationFlags) 0, D3D11_BIND_RENDER_TARGET); + GST_D3D11_ALLOCATION_FLAG_DEFAULT, D3D11_BIND_RENDER_TARGET, 0); } else { d3d11_params->desc0.BindFlags |= D3D11_BIND_RENDER_TARGET; } @@ -567,13 +855,15 @@ device_handle = gst_d3d11_device_get_device_handle (self->device); - if (!gst_d3d11_create_vertex_shader (self->device, - vs_str, input_desc, G_N_ELEMENTS (input_desc), &vs, &layout)) { + hr = gst_d3d11_create_vertex_shader_simple (self->device, + vs_str, "main", input_desc, G_N_ELEMENTS (input_desc), &vs, &layout); + if (!gst_d3d11_result (hr, self->device)) { GST_ERROR_OBJECT (self, "Failed to create vertex shader"); return FALSE; } - if (!gst_d3d11_create_pixel_shader (self->device, ps_str, &ps)) { + hr = gst_d3d11_create_pixel_shader_simple (self->device, ps_str, "main", &ps); + if (!gst_d3d11_result (hr, self->device)) { GST_ERROR_OBJECT (self, "Failed to create pixel shader"); return FALSE; } @@ -631,72 +921,131 @@ ComPtr < IDXGIAdapter1 > adapter; DXGI_ADAPTER_DESC desc; HRESULT hr; + GstD3D11ScreenCapture *capture = nullptr; + GstD3D11ScreenCaptureAPI capture_api = self->capture_api; - if (monitor) { - hr = gst_d3d11_screen_capture_find_output_for_monitor (monitor, - &adapter, nullptr); - } else if (self->monitor_index < 0) { - hr = gst_d3d11_screen_capture_find_primary_monitor (&monitor, - &adapter, nullptr); + EnterCriticalSection (&self->lock); + if (self->window_handle) { + self->capture_api = GST_D3D11_SCREEN_CAPTURE_API_WGC; } else { - hr = gst_d3d11_screen_capture_find_nth_monitor (self->monitor_index, - &monitor, &adapter, nullptr); + if (monitor) { + hr = gst_d3d11_screen_capture_find_output_for_monitor (monitor, + &adapter, nullptr); + } else if (self->monitor_index < 0) { + hr = gst_d3d11_screen_capture_find_primary_monitor (&monitor, + &adapter, nullptr); + } else { + hr = gst_d3d11_screen_capture_find_nth_monitor (self->monitor_index, + &monitor, &adapter, nullptr); + } + + if (FAILED (hr)) + goto error; } - if (FAILED (hr)) - goto error; + if (self->capture_api == GST_D3D11_SCREEN_CAPTURE_API_DXGI) { + hr = adapter->GetDesc (&desc); + if (FAILED (hr)) + goto error; - hr = adapter->GetDesc (&desc); - if (FAILED (hr)) - goto error; + self->adapter_luid = gst_d3d11_luid_to_int64 (&desc.AdapterLuid); + gst_clear_object (&self->device); - self->adapter_luid = gst_d3d11_luid_to_int64 (&desc.AdapterLuid); - gst_clear_object (&self->device); + gst_d3d11_ensure_element_data_for_adapter_luid (GST_ELEMENT_CAST (self), + self->adapter_luid, &self->device); + } else { + gst_clear_object (&self->device); + gst_d3d11_ensure_element_data (GST_ELEMENT_CAST (self), + self->adapter, &self->device); + } - if (!gst_d3d11_ensure_element_data_for_adapter_luid (GST_ELEMENT_CAST (self), - self->adapter_luid, &self->device)) { - GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, - ("D3D11 device for LUID %" G_GINT64_FORMAT " is unavailble", - self->adapter_luid), (nullptr)); + if (!self->device) + goto no_device; - return FALSE; +#ifdef HAVE_WINRT_CAPTURE + if (self->window_handle) { + capture = gst_d3d11_winrt_capture_new (self->device, nullptr, + self->window_handle); + } else if (self->capture_api == GST_D3D11_SCREEN_CAPTURE_API_WGC) { + capture = gst_d3d11_winrt_capture_new (self->device, monitor, nullptr); } +#endif + + if (!capture) + capture = gst_d3d11_dxgi_capture_new (self->device, monitor); - self->capture = gst_d3d11_screen_capture_new (self->device, monitor); - if (!self->capture) + if (!capture) goto error; /* Check if we can open device */ - ret = gst_d3d11_screen_capture_prepare (self->capture); + ret = gst_d3d11_screen_capture_prepare (capture); switch (ret) { case GST_D3D11_SCREEN_CAPTURE_FLOW_EXPECTED_ERROR: case GST_FLOW_OK: break; case GST_D3D11_SCREEN_CAPTURE_FLOW_UNSUPPORTED: +#ifdef HAVE_WINRT_CAPTURE + /* Try WinRT capture if DXGI capture does not work */ + if (self->capture_api == GST_D3D11_SCREEN_CAPTURE_API_DXGI) { + self->capture_api = GST_D3D11_SCREEN_CAPTURE_API_WGC; + gst_clear_object (&capture); + GST_WARNING_OBJECT (self, "DXGI capture is not available"); + capture = gst_d3d11_winrt_capture_new (self->device, monitor, nullptr); + if (capture + && gst_d3d11_screen_capture_prepare (capture) == GST_FLOW_OK) { + GST_INFO_OBJECT (self, "Fallback to Windows Graphics Capture"); + break; + } + } +#endif goto unsupported; default: goto error; } - if (!gst_d3d11_screen_capture_prepare_shader (self)) + if (self->capture_api == GST_D3D11_SCREEN_CAPTURE_API_DXGI && + !gst_d3d11_screen_capture_prepare_shader (self)) { goto error; + } self->last_frame_no = -1; self->min_latency = self->max_latency = GST_CLOCK_TIME_NONE; + gst_d3d11_screen_capture_show_border (capture, self->show_border); + self->capture = capture; + + LeaveCriticalSection (&self->lock); + if (self->capture_api != capture_api) { + GST_INFO_OBJECT (self, "Updated capture api: %d", self->capture_api); + g_object_notify (G_OBJECT (self), "capture-api"); + } + return TRUE; +no_device: + { + LeaveCriticalSection (&self->lock); + GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, + ("D3D11 device is not available"), (nullptr)); + return FALSE; + } + error: { + gst_clear_object (&capture); + LeaveCriticalSection (&self->lock); GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, ("Failed to prepare capture object with given configuration, " - "monitor-index: %d, monitor-handle: %p", - self->monitor_index, self->monitor_handle), (nullptr)); + "monitor-index: %d, monitor-handle: %p, window-handle: %p", + self->monitor_index, self->monitor_handle, self->window_handle), + (nullptr)); return FALSE; } unsupported: { + gst_clear_object (&capture); + LeaveCriticalSection (&self->lock); GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ, ("Failed to prepare capture object with given configuration, " "monitor-index: %d, monitor-handle: %p", @@ -710,6 +1059,7 @@ gst_d3d11_screen_capture_src_stop (GstBaseSrc * bsrc) { GstD3D11ScreenCaptureSrc *self = GST_D3D11_SCREEN_CAPTURE_SRC (bsrc); + GstD3D11CSLockGuard lk (&self->lock); if (self->pool) { gst_buffer_pool_set_active (self->pool, FALSE); @@ -734,6 +1084,9 @@ GstD3D11ScreenCaptureSrc *self = GST_D3D11_SCREEN_CAPTURE_SRC (bsrc); GST_OBJECT_LOCK (self); + if (self->capture) + gst_d3d11_screen_capture_unlock (self->capture); + if (self->clock_id) { GST_DEBUG_OBJECT (self, "Waking up waiting clock"); gst_clock_id_unschedule (self->clock_id); @@ -750,6 +1103,9 @@ GstD3D11ScreenCaptureSrc *self = GST_D3D11_SCREEN_CAPTURE_SRC (bsrc); GST_OBJECT_LOCK (self); + if (self->capture) + gst_d3d11_screen_capture_unlock_stop (self->capture); + self->flushing = FALSE; GST_OBJECT_UNLOCK (self); @@ -808,6 +1164,7 @@ gint unsupported_retry_count = 100; GstBuffer *buffer = NULL; GstBuffer *sysmem_buf = NULL; + D3D11_BOX crop_box; if (!self->capture) { GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ, @@ -821,6 +1178,18 @@ if (fps_n <= 0 || fps_d <= 0) return GST_FLOW_NOT_NEGOTIATED; + crop_box = gst_d3d11_screen_capture_src_get_crop_box (self); + if (crop_box.left != self->crop_box.left || + crop_box.right != self->crop_box.right || + crop_box.top != self->crop_box.top || + crop_box.bottom != self->crop_box.bottom) { + GST_INFO_OBJECT (self, "Capture area changed, need negotiation"); + if (!gst_base_src_negotiate (bsrc)) { + GST_ERROR_OBJECT (self, "Failed to negotiate with new capture area"); + return GST_FLOW_NOT_NEGOTIATED; + } + } + again: clock = gst_element_get_clock (GST_ELEMENT_CAST (self)); if (!clock) { @@ -937,7 +1306,7 @@ before_capture = gst_clock_get_time (clock); ret = gst_d3d11_screen_capture_do_capture (self->capture, self->device, texture, rtv, self->vs, self->ps, self->layout, self->sampler, - self->blend, draw_mouse); + self->blend, &self->crop_box, draw_mouse); gst_memory_unmap (mem, &info); switch (ret) { @@ -969,10 +1338,10 @@ break; } - if (!self->downstream_supports_d3d11) { - GstVideoFrame src_frame, dst_frame; - gboolean copy_ret; + if (ret != GST_FLOW_OK) + goto out; + if (!self->downstream_supports_d3d11) { ret = GST_BASE_SRC_CLASS (parent_class)->alloc (bsrc, offset, size, &sysmem_buf); if (ret != GST_FLOW_OK) { @@ -980,24 +1349,7 @@ goto out; } - if (!gst_video_frame_map (&src_frame, &self->video_info, buffer, - GST_MAP_READ)) { - GST_ERROR_OBJECT (self, "Failed to map d3d11 buffer"); - goto error; - } - - if (!gst_video_frame_map (&dst_frame, &self->video_info, sysmem_buf, - GST_MAP_WRITE)) { - GST_ERROR_OBJECT (self, "Failed to map sysmem buffer"); - gst_video_frame_unmap (&src_frame); - goto error; - } - - copy_ret = gst_video_frame_copy (&dst_frame, &src_frame); - gst_video_frame_unmap (&dst_frame); - gst_video_frame_unmap (&src_frame); - - if (!copy_ret) { + if (!gst_d3d11_buffer_copy_into (sysmem_buf, buffer, &self->video_info)) { GST_ERROR_OBJECT (self, "Failed to copy frame"); goto error; }
View file
gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11testsrc.cpp
Added
@@ -0,0 +1,1793 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-d3d11testsrc + * @title: d3d11testsrc + * + * The videotestsrc element is used to produce test video data + * + * ## Example launch line + * ``` + * gst-launch-1.0 d3d11testsrc ! queue ! d3d11videosink + * ``` + * + * Since: 1.22 + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstd3d11testsrc.h" +#include "gstd3d11pluginutils.h" +#include <wrl.h> +#include <string.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +GST_DEBUG_CATEGORY_STATIC (gst_d3d11_test_src_debug); +#define GST_CAT_DEFAULT gst_d3d11_test_src_debug + +static GstStaticCaps template_caps = + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES + (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, GST_D3D11_SRC_FORMATS) ";" + GST_VIDEO_CAPS_MAKE (GST_D3D11_SRC_FORMATS)); + +typedef enum +{ + GST_D3D11_TEST_SRC_SMPTE, + GST_D3D11_TEST_SRC_SNOW, + GST_D3D11_TEST_SRC_BLACK, + GST_D3D11_TEST_SRC_WHITE, + GST_D3D11_TEST_SRC_RED, + GST_D3D11_TEST_SRC_GREEN, + GST_D3D11_TEST_SRC_BLUE, + GST_D3D11_TEST_SRC_CHECKERS1, + GST_D3D11_TEST_SRC_CHECKERS2, + GST_D3D11_TEST_SRC_CHECKERS4, + GST_D3D11_TEST_SRC_CHECKERS8, +} GstD3D11TestSrcPattern; + +/** + * GstD3D11TestSrcPattern: + * + * Since: 1.22 + */ +#define GST_TYPE_D3D11_TEST_SRC_PATTERN (gst_d3d11_test_src_pattern_get_type ()) +static GType +gst_d3d11_test_src_pattern_get_type (void) +{ + static GType pattern_type = 0; + + GST_D3D11_CALL_ONCE_BEGIN { + static const GEnumValue pattern_types = { + {GST_D3D11_TEST_SRC_SMPTE, "SMPTE 100% color bars", "smpte"}, + {GST_D3D11_TEST_SRC_SNOW, "Random (television snow)", "snow"}, + {GST_D3D11_TEST_SRC_BLACK, "100% Black", "black"}, + {GST_D3D11_TEST_SRC_WHITE, "100% White", "white"}, + {GST_D3D11_TEST_SRC_RED, "Red", "red"}, + {GST_D3D11_TEST_SRC_GREEN, "Green", "green"}, + {GST_D3D11_TEST_SRC_BLUE, "Blue", "blue"}, + {GST_D3D11_TEST_SRC_CHECKERS1, "Checkers 1px", "checkers-1"}, + {GST_D3D11_TEST_SRC_CHECKERS2, "Checkers 2px", "checkers-2"}, + {GST_D3D11_TEST_SRC_CHECKERS4, "Checkers 4px", "checkers-4"}, + {GST_D3D11_TEST_SRC_CHECKERS8, "Checkers 8px", "checkers-8"}, + {0, nullptr, nullptr}, + }; + + pattern_type = g_enum_register_static ("GstD3D11TestSrcPattern", + pattern_types); + } GST_D3D11_CALL_ONCE_END; + + return pattern_type; +} + +typedef struct +{ + union + { + struct + { + FLOAT r; + FLOAT g; + FLOAT b; + FLOAT a; + }; + FLOAT color4; + }; +} ColorValue; + +static const ColorValue color_table = { + /* white */ + {1.0f, 1.0f, 1.0f, 1.0f}, + /* yellow */ + {1.0f, 1.0f, 0.0f, 1.0f}, + /* cyan */ + {0.0f, 1.0f, 1.0f, 1.0f}, + /* green */ + {0.0f, 1.0f, 0.0f, 1.0f}, + /* magenta */ + {1.0f, 0.0f, 1.0f, 1.0f}, + /* red */ + {1.0f, 0.0f, 0.0f, 1.0f}, + /* blue */ + {0.0f, 0.0f, 1.0f, 1.0f}, + /* black */ + {0.0f, 0.0f, 0.0f, 1.0f}, + /* -I */ + {0.0, 0.0f, 0.5f, 1.0f}, + /* +Q */ + {0.0f, 0.5, 1.0f, 1.0f}, + /* superblack */ + {0.0f, 0.0f, 0.0f, 1.0f}, + /* 7.421875% grey */ + {19. / 256.0f, 19. / 256.0f, 19. / 256.0, 1.0f}, +}; + +enum +{ + COLOR_WHITE = 0, + COLOR_YELLOW, + COLOR_CYAN, + COLOR_GREEN, + COLOR_MAGENTA, + COLOR_RED, + COLOR_BLUE, + COLOR_BLACK, + COLOR_NEG_I, + COLOR_POS_Q, + COLOR_SUPER_BLACK, + COLOR_DARK_GREY, +}; + +typedef struct +{ + ID3D11PixelShader *ps; + ID3D11VertexShader *vs; + ID3D11InputLayout *layout; + ID3D11Buffer *vertex_buffer; + ID3D11Buffer *index_buffer; + ID3D11Buffer *const_buffer; + guint vertex_stride; + guint index_count; +} GstD3D11TestSrcQuad; + +typedef struct +{ + const ColorValue *clear_color; + GstD3D11TestSrcQuad *quad2; +} GstD3D11TestSrcRender; + +struct _GstD3D11TestSrc +{ + GstBaseSrc src; + + GstD3D11Device *device; + gboolean downstream_supports_d3d11; + + GstVideoInfo info; + GstD3D11Converter *converter; + GstBufferPool *render_pool; + GstBufferPool *convert_pool; + + guint adapter_index; + GstD3D11TestSrcPattern pattern; + GstD3D11TestSrcRender *render; + D3D11_VIEWPORT viewport; + + gboolean reverse; + gint64 n_frames; + gint64 accum_frames; + GstClockTime accum_rtime; + GstClockTime running_time; +}; + +typedef struct +{ + FLOAT time; + FLOAT padding3; +} TimeConstBuffer; + +typedef struct +{ + struct + { + FLOAT x; + FLOAT y; + FLOAT z; + } position; + struct + { + FLOAT u; + FLOAT v; + } texture; +} UvVertexData; + +typedef struct +{ + struct + { + FLOAT x; + FLOAT y; + FLOAT z; + } position; + struct + { + FLOAT r; + FLOAT g; + FLOAT b; + FLOAT a; + } color; +} ColorVertexData; + +/* *INDENT-OFF* */ +static const gchar templ_vs_coord = + "struct VS_INPUT {\n" + " float4 Position: POSITION;\n" + " float2 Texture: TEXCOORD;\n" + "};\n" + "struct VS_OUTPUT {\n" + " float4 Position: SV_POSITION;\n" + " float2 Texture: TEXCOORD;\n" + "};\n" + "VS_OUTPUT main (VS_INPUT input)\n" + "{\n" + " return input;\n" + "}"; + +static const gchar templ_vs_color = + "struct VS_INPUT {\n" + " float4 Position: POSITION;\n" + " float4 Color: COLOR;\n" + "};\n" + "struct VS_OUTPUT {\n" + " float4 Position: SV_POSITION;\n" + " float4 Color: COLOR;\n" + "};\n" + "VS_OUTPUT main (VS_INPUT input)\n" + "{\n" + " return input;\n" + "}"; + +static const gchar templ_ps_snow = + "cbuffer TimeConstBuffer : register(b0)\n" + "{\n" + " float time;\n" + " float3 padding;\n" + "}\n" + "struct PS_INPUT {\n" + " float4 Position: SV_POSITION;\n" + " float2 Texture: TEXCOORD;\n" + "};\n" + "float get_rand(float2 uv)\n" + "{\n" + " return frac(sin(dot(uv, float2(12.9898,78.233))) * 43758.5453);\n" + "}\n" + "float4 main(PS_INPUT input) : SV_Target\n" + "{\n" + " float4 output;\n" + " float val = get_rand (time * input.Texture);\n" + " output.rgb = float3(val, val, val);\n" + " output.a = 1.0f;\n" + " return output;\n" + "}"; + +static const gchar templ_ps_smpte = + "struct PS_INPUT {\n" + " float4 Position: SV_POSITION;\n" + " float4 Color: COLOR;\n" + "};\n" + "float4 main(PS_INPUT input) : SV_TARGET\n" + "{\n" + " return input.Color;\n" + "}"; + +static const gchar templ_ps_checker = + "static const float width = %d;\n" + "static const float height = %d;\n" + "static const float checker_size = %d;\n" + "struct PS_INPUT {\n" + " float4 Position: SV_POSITION;\n" + " float2 Texture: TEXCOORD;\n" + "};\n" + "float4 main(PS_INPUT input) : SV_Target\n" + "{\n" + " float4 output;\n" + " float2 xy_mod = floor (0.5 * input.Texture * float2 (width, height) / checker_size);\n" + " float result = fmod (xy_mod.x + xy_mod.y, 2.0);\n" + " output.r = step (result, 0.5);\n" + " output.g = 1.0 - output.r;\n" + " output.ba = float2 (0.0f, 1.0f);\n" + " return output;\n" + "}"; +/* *INDENT-ON* */ + +static gboolean +setup_snow_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render, + guint on_smpte) +{ + HRESULT hr; + D3D11_INPUT_ELEMENT_DESC input_desc2; + D3D11_BUFFER_DESC buffer_desc; + D3D11_MAPPED_SUBRESOURCE map; + UvVertexData *vertex_data; + WORD *indices; + ID3D11Device *device_handle = + gst_d3d11_device_get_device_handle (self->device); + ID3D11DeviceContext *context_handle = + gst_d3d11_device_get_device_context_handle (self->device); + ComPtr < ID3D11PixelShader > ps; + ComPtr < ID3D11VertexShader > vs; + ComPtr < ID3D11InputLayout > layout; + ComPtr < ID3D11Buffer > vertex_buffer; + ComPtr < ID3D11Buffer > index_buffer; + ComPtr < ID3D11Buffer > const_buffer; + GstD3D11TestSrcQuad *quad; + + memset (input_desc, 0, sizeof (input_desc)); + memset (&buffer_desc, 0, sizeof (buffer_desc)); + + input_desc0.SemanticName = "POSITION"; + input_desc0.SemanticIndex = 0; + input_desc0.Format = DXGI_FORMAT_R32G32B32_FLOAT; + input_desc0.InputSlot = 0; + input_desc0.AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; + input_desc0.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + input_desc0.InstanceDataStepRate = 0; + + input_desc1.SemanticName = "TEXCOORD"; + input_desc1.SemanticIndex = 0; + input_desc1.Format = DXGI_FORMAT_R32G32_FLOAT; + input_desc1.InputSlot = 0; + input_desc1.AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; + input_desc1.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + input_desc1.InstanceDataStepRate = 0; + + hr = gst_d3d11_create_vertex_shader_simple (self->device, templ_vs_coord, + "main", input_desc, G_N_ELEMENTS (input_desc), &vs, &layout); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to compile vertext shader"); + return FALSE; + } + + hr = gst_d3d11_create_pixel_shader_simple (self->device, + templ_ps_snow, "main", &ps); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to compile pixel shader"); + return FALSE; + } + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (UvVertexData) * 4; + buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &vertex_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create vertex buffer"); + return FALSE; + } + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (WORD) * 6; + buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &index_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create index buffer"); + return FALSE; + } + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (TimeConstBuffer); + buffer_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &const_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create constant buffer"); + return FALSE; + } + + GstD3D11DeviceLockGuard lk (self->device); + hr = context_handle->Map (vertex_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, + &map); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to map vertex buffer"); + return FALSE; + } + vertex_data = (UvVertexData *) map.pData; + + hr = context_handle->Map (index_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, + &map); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to map index buffer"); + context_handle->Unmap (vertex_buffer.Get (), 0); + return FALSE; + } + indices = (WORD *) map.pData; + + if (on_smpte) { + FLOAT left, right, top, bottom; + FLOAT left_u, right_u, top_v, bottom_v; + + left = 0.5f; + right = 1.0f; + top = -0.5f; + bottom = -1.0f; + + left_u = 3.0f / 4.0f; + right_u = 1.0f; + top_v = 3.0f / 4.0f; + bottom_v = 1.0f; + + /* bottom left */ + vertex_data0.position.x = left; + vertex_data0.position.y = bottom; + vertex_data0.position.z = 0.0f; + vertex_data0.texture.u = left_u; + vertex_data0.texture.v = bottom_v; + + /* top left */ + vertex_data1.position.x = left; + vertex_data1.position.y = top; + vertex_data1.position.z = 0.0f; + vertex_data1.texture.u = left_u; + vertex_data1.texture.v = top_v; + + /* top right */ + vertex_data2.position.x = right; + vertex_data2.position.y = top; + vertex_data2.position.z = 0.0f; + vertex_data2.texture.u = right_u; + vertex_data2.texture.v = top_v; + + /* bottom right */ + vertex_data3.position.x = right; + vertex_data3.position.y = bottom; + vertex_data3.position.z = 0.0f; + vertex_data3.texture.u = right_u; + vertex_data3.texture.v = bottom_v; + } else { + /* bottom left */ + vertex_data0.position.x = -1.0f; + vertex_data0.position.y = -1.0f; + vertex_data0.position.z = 0.0f; + vertex_data0.texture.u = 0.0f; + vertex_data0.texture.v = 1.0f; + /* top left */ + vertex_data1.position.x = -1.0f; + vertex_data1.position.y = 1.0f; + vertex_data1.position.z = 0.0f; + vertex_data1.texture.u = 0.0f; + vertex_data1.texture.v = 0.0f; + + /* top right */ + vertex_data2.position.x = 1.0f; + vertex_data2.position.y = 1.0f; + vertex_data2.position.z = 0.0f; + vertex_data2.texture.u = 1.0f; + vertex_data2.texture.v = 0.0f; + + /* bottom right */ + vertex_data3.position.x = 1.0f; + vertex_data3.position.y = -1.0f; + vertex_data3.position.z = 0.0f; + vertex_data3.texture.u = 1.0f; + vertex_data3.texture.v = 1.0f; + } + + /* clockwise indexing */ + indices0 = 0; /* bottom left */ + indices1 = 1; /* top left */ + indices2 = 2; /* top right */ + + indices3 = 3; /* bottom right */ + indices4 = 0; /* bottom left */ + indices5 = 2; /* top right */ + + context_handle->Unmap (vertex_buffer.Get (), 0); + context_handle->Unmap (index_buffer.Get (), 0); + + quad = g_new0 (GstD3D11TestSrcQuad, 1); + if (on_smpte) + render->quad1 = quad; + else + render->quad0 = quad; + + quad->ps = ps.Detach (); + quad->vs = vs.Detach (); + quad->layout = layout.Detach (); + quad->vertex_buffer = vertex_buffer.Detach (); + quad->index_buffer = index_buffer.Detach (); + quad->const_buffer = const_buffer.Detach (); + quad->vertex_stride = sizeof (UvVertexData); + quad->index_count = 6; + + return TRUE; +} + +static gboolean +setup_smpte_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render) +{ + HRESULT hr; + D3D11_INPUT_ELEMENT_DESC input_desc2; + D3D11_BUFFER_DESC buffer_desc; + D3D11_MAPPED_SUBRESOURCE map; + ColorVertexData *vertex_data; + WORD *indices; + ID3D11Device *device_handle = + gst_d3d11_device_get_device_handle (self->device); + ID3D11DeviceContext *context_handle = + gst_d3d11_device_get_device_context_handle (self->device); + ComPtr < ID3D11PixelShader > ps; + ComPtr < ID3D11VertexShader > vs; + ComPtr < ID3D11InputLayout > layout; + ComPtr < ID3D11Buffer > vertex_buffer; + ComPtr < ID3D11Buffer > index_buffer; + GstD3D11TestSrcQuad *quad; + guint num_vertex = 0; + guint num_index = 0; + + memset (input_desc, 0, sizeof (input_desc)); + memset (&buffer_desc, 0, sizeof (buffer_desc)); + + input_desc0.SemanticName = "POSITION"; + input_desc0.SemanticIndex = 0; + input_desc0.Format = DXGI_FORMAT_R32G32B32_FLOAT; + input_desc0.InputSlot = 0; + input_desc0.AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; + input_desc0.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + input_desc0.InstanceDataStepRate = 0; + + input_desc1.SemanticName = "COLOR"; + input_desc1.SemanticIndex = 0; + input_desc1.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + input_desc1.InputSlot = 0; + input_desc1.AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; + input_desc1.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + input_desc1.InstanceDataStepRate = 0; + + hr = gst_d3d11_create_vertex_shader_simple (self->device, templ_vs_color, + "main", input_desc, G_N_ELEMENTS (input_desc), &vs, &layout); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to compile vertext shader"); + return FALSE; + } + + hr = gst_d3d11_create_pixel_shader_simple (self->device, + templ_ps_smpte, "main", &ps); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to compile pixel shader"); + return FALSE; + } + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (ColorVertexData) * 4 * 20; + buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &vertex_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create vertex buffer"); + return FALSE; + } + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (WORD) * 6 * 20; + buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &index_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create index buffer"); + return FALSE; + } + + GstD3D11DeviceLockGuard lk (self->device); + hr = context_handle->Map (vertex_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, + &map); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to map vertex buffer"); + return FALSE; + } + vertex_data = (ColorVertexData *) map.pData; + + hr = context_handle->Map (index_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, + &map); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to map index buffer"); + context_handle->Unmap (vertex_buffer.Get (), 0); + return FALSE; + } + indices = (WORD *) map.pData; + + /* top row */ + for (guint i = 0; i < 7; i++) { + FLOAT left, right, top, bottom; + FLOAT scale = 2.0f / 7.0f; + guint base = i * 4; + guint idx_base = i * 6; + const ColorValue *color = &color_tablei; + + left = -1.0f + i * scale; + right = -1.0f + (i + 1) * scale; + top = 1.0f; + bottom = -1.0f / 3.0f; + + /* bottom left */ + vertex_database.position.x = left; + vertex_database.position.y = bottom; + vertex_database.position.z = 0.0f; + vertex_database.color.r = color->r; + vertex_database.color.g = color->g; + vertex_database.color.b = color->b; + vertex_database.color.a = color->a; + + /* top left */ + vertex_database + 1.position.x = left; + vertex_database + 1.position.y = top; + vertex_database + 1.position.z = 0.0f; + vertex_database + 1.color = vertex_database.color; + + /* top right */ + vertex_database + 2.position.x = right; + vertex_database + 2.position.y = top; + vertex_database + 2.position.z = 0.0f; + vertex_database + 2.color = vertex_database.color; + + /* bottom right */ + vertex_database + 3.position.x = right; + vertex_database + 3.position.y = bottom; + vertex_database + 3.position.z = 0.0f; + vertex_database + 3.color = vertex_database.color; + + /* clockwise indexing */ + indicesidx_base = base; /* bottom left */ + indicesidx_base + 1 = base + 1; /* top left */ + indicesidx_base + 2 = base + 2; /* top right */ + + indicesidx_base + 3 = base + 3; /* bottom right */ + indicesidx_base + 4 = base; /* bottom left */ + indicesidx_base + 5 = base + 2; /* top right */ + } + num_vertex += 4 * 7; + num_index += 6 * 7; + + /* middle row */ + for (guint i = 0; i < 7; i++) { + FLOAT left, right, top, bottom; + FLOAT scale = 2.0f / 7.0f; + guint base = i * 4 + num_vertex; + guint idx_base = i * 6 + num_index; + const ColorValue *color; + + if ((i % 2) != 0) + color = &color_tableCOLOR_BLACK; + else + color = &color_tableCOLOR_BLUE - i; + + left = -1.0f + i * scale; + right = -1.0f + (i + 1) * scale; + top = -1.0f / 3.0f; + bottom = -0.5f; + + /* bottom left */ + vertex_database.position.x = left; + vertex_database.position.y = bottom; + vertex_database.position.z = 0.0f; + vertex_database.color.r = color->r; + vertex_database.color.g = color->g; + vertex_database.color.b = color->b; + vertex_database.color.a = color->a; + + /* top left */ + vertex_database + 1.position.x = left; + vertex_database + 1.position.y = top; + vertex_database + 1.position.z = 0.0f; + vertex_database + 1.color = vertex_database.color; + + /* top right */ + vertex_database + 2.position.x = right; + vertex_database + 2.position.y = top; + vertex_database + 2.position.z = 0.0f; + vertex_database + 2.color = vertex_database.color; + + /* bottom right */ + vertex_database + 3.position.x = right; + vertex_database + 3.position.y = bottom; + vertex_database + 3.position.z = 0.0f; + vertex_database + 3.color = vertex_database.color; + + /* clockwise indexing */ + indicesidx_base = base; /* bottom left */ + indicesidx_base + 1 = base + 1; /* top left */ + indicesidx_base + 2 = base + 2; /* top right */ + + indicesidx_base + 3 = base + 3; /* bottom right */ + indicesidx_base + 4 = base; /* bottom left */ + indicesidx_base + 5 = base + 2; /* top right */ + } + num_vertex += 4 * 7; + num_index += 6 * 7; + + /* bottom row, left three */ + for (guint i = 0; i < 3; i++) { + FLOAT left, right, top, bottom; + FLOAT scale = 1.0f / 3.0f; + guint base = i * 4 + num_vertex; + guint idx_base = i * 6 + num_index; + const ColorValue *color; + + if (i == 0) + color = &color_tableCOLOR_NEG_I; + else if (i == 1) + color = &color_tableCOLOR_WHITE; + else + color = &color_tableCOLOR_POS_Q; + + left = -1.0f + i * scale; + right = -1.0f + (i + 1) * scale; + top = -0.5f; + bottom = -1.0f; + + /* bottom left */ + vertex_database.position.x = left; + vertex_database.position.y = bottom; + vertex_database.position.z = 0.0f; + vertex_database.color.r = color->r; + vertex_database.color.g = color->g; + vertex_database.color.b = color->b; + vertex_database.color.a = color->a; + + /* top left */ + vertex_database + 1.position.x = left; + vertex_database + 1.position.y = top; + vertex_database + 1.position.z = 0.0f; + vertex_database + 1.color = vertex_database.color; + + /* top right */ + vertex_database + 2.position.x = right; + vertex_database + 2.position.y = top; + vertex_database + 2.position.z = 0.0f; + vertex_database + 2.color = vertex_database.color; + + /* bottom right */ + vertex_database + 3.position.x = right; + vertex_database + 3.position.y = bottom; + vertex_database + 3.position.z = 0.0f; + vertex_database + 3.color = vertex_database.color; + + /* clockwise indexing */ + indicesidx_base = base; /* bottom left */ + indicesidx_base + 1 = base + 1; /* top left */ + indicesidx_base + 2 = base + 2; /* top right */ + + indicesidx_base + 3 = base + 3; /* bottom right */ + indicesidx_base + 4 = base; /* bottom left */ + indicesidx_base + 5 = base + 2; /* top right */ + } + num_vertex += 4 * 3; + num_index += 6 * 3; + + /* bottom row, middle three */ + for (guint i = 0; i < 3; i++) { + FLOAT left, right, top, bottom; + FLOAT scale = 1.0f / 6.0f; + guint base = i * 4 + num_vertex; + guint idx_base = i * 6 + num_index; + const ColorValue *color; + + if (i == 0) + color = &color_tableCOLOR_SUPER_BLACK; + else if (i == 1) + color = &color_tableCOLOR_BLACK; + else + color = &color_tableCOLOR_DARK_GREY; + + left = i * scale; + right = (i + 1) * scale; + top = -0.5f; + bottom = -1.0f; + + /* bottom left */ + vertex_database.position.x = left; + vertex_database.position.y = bottom; + vertex_database.position.z = 0.0f; + vertex_database.color.r = color->r; + vertex_database.color.g = color->g; + vertex_database.color.b = color->b; + vertex_database.color.a = color->a; + + /* top left */ + vertex_database + 1.position.x = left; + vertex_database + 1.position.y = top; + vertex_database + 1.position.z = 0.0f; + vertex_database + 1.color = vertex_database.color; + + /* top right */ + vertex_database + 2.position.x = right; + vertex_database + 2.position.y = top; + vertex_database + 2.position.z = 0.0f; + vertex_database + 2.color = vertex_database.color; + + /* bottom right */ + vertex_database + 3.position.x = right; + vertex_database + 3.position.y = bottom; + vertex_database + 3.position.z = 0.0f; + vertex_database + 3.color = vertex_database.color; + + /* clockwise indexing */ + indicesidx_base = base; /* bottom left */ + indicesidx_base + 1 = base + 1; /* top left */ + indicesidx_base + 2 = base + 2; /* top right */ + + indicesidx_base + 3 = base + 3; /* bottom right */ + indicesidx_base + 4 = base; /* bottom left */ + indicesidx_base + 5 = base + 2; /* top right */ + } + + context_handle->Unmap (vertex_buffer.Get (), 0); + context_handle->Unmap (index_buffer.Get (), 0); + + render->quad0 = quad = g_new0 (GstD3D11TestSrcQuad, 1); + + quad->ps = ps.Detach (); + quad->vs = vs.Detach (); + quad->layout = layout.Detach (); + quad->vertex_buffer = vertex_buffer.Detach (); + quad->index_buffer = index_buffer.Detach (); + quad->vertex_stride = sizeof (ColorVertexData); + quad->index_count = 6 * 20; + + return setup_snow_render (self, render, TRUE); +} + +static gboolean +setup_checker_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render, + guint checker_size) +{ + HRESULT hr; + D3D11_INPUT_ELEMENT_DESC input_desc2; + D3D11_BUFFER_DESC buffer_desc; + D3D11_MAPPED_SUBRESOURCE map; + UvVertexData *vertex_data; + WORD *indices; + ID3D11Device *device_handle = + gst_d3d11_device_get_device_handle (self->device); + ID3D11DeviceContext *context_handle = + gst_d3d11_device_get_device_context_handle (self->device); + ComPtr < ID3D11PixelShader > ps; + ComPtr < ID3D11VertexShader > vs; + ComPtr < ID3D11InputLayout > layout; + ComPtr < ID3D11Buffer > vertex_buffer; + ComPtr < ID3D11Buffer > index_buffer; + GstD3D11TestSrcQuad *quad; + gchar *ps_src; + + memset (input_desc, 0, sizeof (input_desc)); + memset (&buffer_desc, 0, sizeof (buffer_desc)); + + input_desc0.SemanticName = "POSITION"; + input_desc0.SemanticIndex = 0; + input_desc0.Format = DXGI_FORMAT_R32G32B32_FLOAT; + input_desc0.InputSlot = 0; + input_desc0.AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; + input_desc0.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + input_desc0.InstanceDataStepRate = 0; + + input_desc1.SemanticName = "TEXCOORD"; + input_desc1.SemanticIndex = 0; + input_desc1.Format = DXGI_FORMAT_R32G32_FLOAT; + input_desc1.InputSlot = 0; + input_desc1.AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; + input_desc1.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + input_desc1.InstanceDataStepRate = 0; + + hr = gst_d3d11_create_vertex_shader_simple (self->device, templ_vs_coord, + "main", input_desc, G_N_ELEMENTS (input_desc), &vs, &layout); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to compile vertext shader"); + return FALSE; + } + + ps_src = g_strdup_printf (templ_ps_checker, + self->info.width, self->info.height, checker_size); + hr = gst_d3d11_create_pixel_shader_simple (self->device, ps_src, "main", &ps); + g_free (ps_src); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to compile pixel shader"); + return FALSE; + } + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (UvVertexData) * 4; + buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &vertex_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create vertex buffer"); + return FALSE; + } + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (WORD) * 6; + buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &index_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create index buffer"); + return FALSE; + } + + GstD3D11DeviceLockGuard lk (self->device); + hr = context_handle->Map (vertex_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, + &map); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to map vertex buffer"); + return FALSE; + } + vertex_data = (UvVertexData *) map.pData; + + hr = context_handle->Map (index_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, + &map); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to map index buffer"); + context_handle->Unmap (vertex_buffer.Get (), 0); + return FALSE; + } + indices = (WORD *) map.pData; + + /* bottom left */ + vertex_data0.position.x = -1.0f; + vertex_data0.position.y = -1.0f; + vertex_data0.position.z = 0.0f; + vertex_data0.texture.u = 0.0f; + vertex_data0.texture.v = 1.0f; + /* top left */ + vertex_data1.position.x = -1.0f; + vertex_data1.position.y = 1.0f; + vertex_data1.position.z = 0.0f; + vertex_data1.texture.u = 0.0f; + vertex_data1.texture.v = 0.0f; + + /* top right */ + vertex_data2.position.x = 1.0f; + vertex_data2.position.y = 1.0f; + vertex_data2.position.z = 0.0f; + vertex_data2.texture.u = 1.0f; + vertex_data2.texture.v = 0.0f; + + /* bottom right */ + vertex_data3.position.x = 1.0f; + vertex_data3.position.y = -1.0f; + vertex_data3.position.z = 0.0f; + vertex_data3.texture.u = 1.0f; + vertex_data3.texture.v = 1.0f; + + /* clockwise indexing */ + indices0 = 0; /* bottom left */ + indices1 = 1; /* top left */ + indices2 = 2; /* top right */ + + indices3 = 3; /* bottom right */ + indices4 = 0; /* bottom left */ + indices5 = 2; /* top right */ + + context_handle->Unmap (vertex_buffer.Get (), 0); + context_handle->Unmap (index_buffer.Get (), 0); + + render->quad0 = quad = g_new0 (GstD3D11TestSrcQuad, 1); + + quad->ps = ps.Detach (); + quad->vs = vs.Detach (); + quad->layout = layout.Detach (); + quad->vertex_buffer = vertex_buffer.Detach (); + quad->index_buffer = index_buffer.Detach (); + quad->vertex_stride = sizeof (UvVertexData); + quad->index_count = 6; + + return TRUE; +} + +enum +{ + PROP_0, + PROP_ADAPTER, + PROP_IS_LIVE, + PROP_PATTERN, +}; + +#define DEFAULT_ADAPTER -1 +#define DEFAULT_PATTERN GST_D3D11_TEST_SRC_SMPTE + +static void gst_d3d11_test_src_dispose (GObject * object); +static void gst_d3d11_test_src_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_d3d11_test_src_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +static void gst_d3d11_test_src_set_context (GstElement * element, + GstContext * context); + +static gboolean gst_d3d11_test_src_is_seekable (GstBaseSrc * bsrc); +static gboolean gst_d3d11_test_src_do_seek (GstBaseSrc * bsrc, + GstSegment * segment); +static GstCaps *gst_d3d11_test_src_fixate (GstBaseSrc * bsrc, GstCaps * caps); +static gboolean gst_d3d11_test_src_set_caps (GstBaseSrc * bsrc, GstCaps * caps); +static gboolean gst_d3d11_test_src_decide_allocation (GstBaseSrc * + bsrc, GstQuery * query); +static gboolean gst_d3d11_test_src_start (GstBaseSrc * bsrc); +static gboolean gst_d3d11_test_src_stop (GstBaseSrc * bsrc); +static gboolean gst_d3d11_test_src_src_query (GstBaseSrc * bsrc, + GstQuery * query); +static void gst_d3d11_test_src_get_times (GstBaseSrc * bsrc, + GstBuffer * buffer, GstClockTime * start, GstClockTime * end); +static GstFlowReturn gst_d3d11_test_src_create (GstBaseSrc * bsrc, + guint64 offset, guint size, GstBuffer ** buf); + +#define gst_d3d11_test_src_parent_class parent_class +G_DEFINE_TYPE (GstD3D11TestSrc, gst_d3d11_test_src, GST_TYPE_BASE_SRC); + +static void +gst_d3d11_test_src_class_init (GstD3D11TestSrcClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstBaseSrcClass *basesrc_class = GST_BASE_SRC_CLASS (klass); + GstCaps *caps; + + gobject_class->dispose = gst_d3d11_test_src_dispose; + gobject_class->set_property = gst_d3d11_test_src_set_property; + gobject_class->get_property = gst_d3d11_test_src_get_property; + + g_object_class_install_property (gobject_class, PROP_ADAPTER, + g_param_spec_int ("adapter", "Adapter", + "DXGI Adapter index (-1 for any device)", + -1, G_MAXINT32, DEFAULT_ADAPTER, + (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | + G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (gobject_class, PROP_IS_LIVE, + g_param_spec_boolean ("is-live", "Is Live", + "Whether to act as a live source", FALSE, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (gobject_class, PROP_PATTERN, + g_param_spec_enum ("pattern", "Pattern", + "Type of test pattern to generate", GST_TYPE_D3D11_TEST_SRC_PATTERN, + DEFAULT_PATTERN, + (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | + G_PARAM_STATIC_STRINGS))); + + element_class->set_context = + GST_DEBUG_FUNCPTR (gst_d3d11_test_src_set_context); + + gst_element_class_set_static_metadata (element_class, + "Direct3D11 test src", "Source/Video", + "Creates a test video stream", "Seungha Yang <seungha@centricular.com>"); + + caps = gst_d3d11_get_updated_template_caps (&template_caps); + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps)); + gst_caps_unref (caps); + + basesrc_class->is_seekable = + GST_DEBUG_FUNCPTR (gst_d3d11_test_src_is_seekable); + basesrc_class->do_seek = GST_DEBUG_FUNCPTR (gst_d3d11_test_src_do_seek); + basesrc_class->fixate = GST_DEBUG_FUNCPTR (gst_d3d11_test_src_fixate); + basesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_d3d11_test_src_set_caps); + basesrc_class->decide_allocation = + GST_DEBUG_FUNCPTR (gst_d3d11_test_src_decide_allocation); + basesrc_class->start = GST_DEBUG_FUNCPTR (gst_d3d11_test_src_start); + basesrc_class->stop = GST_DEBUG_FUNCPTR (gst_d3d11_test_src_stop); + basesrc_class->query = GST_DEBUG_FUNCPTR (gst_d3d11_test_src_src_query); + basesrc_class->get_times = GST_DEBUG_FUNCPTR (gst_d3d11_test_src_get_times); + basesrc_class->create = GST_DEBUG_FUNCPTR (gst_d3d11_test_src_create); + + GST_DEBUG_CATEGORY_INIT (gst_d3d11_test_src_debug, "d3d11testsrc", 0, + "d3d11testsrc"); + + gst_type_mark_as_plugin_api (GST_TYPE_D3D11_TEST_SRC_PATTERN, + (GstPluginAPIFlags) 0); +} + +static void +gst_d3d11_test_src_init (GstD3D11TestSrc * self) +{ + gst_base_src_set_format (GST_BASE_SRC (self), GST_FORMAT_TIME); + + self->adapter_index = DEFAULT_ADAPTER; + self->pattern = DEFAULT_PATTERN; +} + +static void +gst_d3d11_test_src_dispose (GObject * object) +{ + GstD3D11TestSrc *self = GST_D3D11_TEST_SRC (object); + + gst_clear_object (&self->device); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_d3d11_test_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstD3D11TestSrc *self = GST_D3D11_TEST_SRC (object); + + switch (prop_id) { + case PROP_ADAPTER: + self->adapter_index = g_value_get_int (value); + break; + case PROP_IS_LIVE: + gst_base_src_set_live (GST_BASE_SRC (self), g_value_get_boolean (value)); + break; + case PROP_PATTERN: + self->pattern = (GstD3D11TestSrcPattern) g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_d3d11_test_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstD3D11TestSrc *self = GST_D3D11_TEST_SRC (object); + + switch (prop_id) { + case PROP_ADAPTER: + g_value_set_int (value, self->adapter_index); + break; + case PROP_IS_LIVE: + g_value_set_boolean (value, gst_base_src_is_live (GST_BASE_SRC (self))); + break; + case PROP_PATTERN: + g_value_set_enum (value, self->pattern); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_d3d11_test_src_set_context (GstElement * element, GstContext * context) +{ + GstD3D11TestSrc *self = GST_D3D11_TEST_SRC (element); + + gst_d3d11_handle_set_context (element, + context, self->adapter_index, &self->device); + + GST_ELEMENT_CLASS (parent_class)->set_context (element, context); +} + +static gboolean +gst_d3d11_test_src_is_seekable (GstBaseSrc * bsrc) +{ + return TRUE; +} + +static gboolean +gst_d3d11_test_src_do_seek (GstBaseSrc * bsrc, GstSegment * segment) +{ + GstD3D11TestSrc *self = GST_D3D11_TEST_SRC (bsrc); + GstClockTime position; + + segment->time = segment->start; + position = segment->position; + self->reverse = segment->rate < 0; + + /* now move to the position indicated */ + if (self->info.fps_n) { + self->n_frames = gst_util_uint64_scale (position, + self->info.fps_n, self->info.fps_d * GST_SECOND); + } else { + self->n_frames = 0; + } + self->accum_frames = 0; + self->accum_rtime = 0; + if (self->info.fps_n) { + self->running_time = gst_util_uint64_scale (self->n_frames, + self->info.fps_d * GST_SECOND, self->info.fps_n); + } else { + /* FIXME : Not sure what to set here */ + self->running_time = 0; + } + + return TRUE; +} + +static GstCaps * +gst_d3d11_test_src_fixate (GstBaseSrc * bsrc, GstCaps * caps) +{ + GstStructure *s; + + caps = gst_caps_make_writable (caps); + s = gst_caps_get_structure (caps, 0); + + gst_structure_fixate_field_nearest_int (s, "width", 320); + gst_structure_fixate_field_nearest_int (s, "height", 240); + gst_structure_fixate_field_nearest_fraction (s, "framerate", 30, 1); + + return GST_BASE_SRC_CLASS (parent_class)->fixate (bsrc, caps); +} + +static void +gst_d3d11_test_src_quad_free (GstD3D11TestSrcQuad * quad) +{ + if (!quad) + return; + + GST_D3D11_CLEAR_COM (quad->ps); + GST_D3D11_CLEAR_COM (quad->vs); + GST_D3D11_CLEAR_COM (quad->layout); + GST_D3D11_CLEAR_COM (quad->vertex_buffer); + GST_D3D11_CLEAR_COM (quad->index_buffer); + GST_D3D11_CLEAR_COM (quad->const_buffer); + + g_free (quad); +} + +static void +gst_d3d11_test_src_render_free (GstD3D11TestSrcRender * render) +{ + if (!render) + return; + + for (guint i = 0; i < G_N_ELEMENTS (render->quad); i++) + g_clear_pointer (&render->quadi, gst_d3d11_test_src_quad_free); + + g_free (render); +} + +static void +gst_d3d11_test_src_clear_resource (GstD3D11TestSrc * self) +{ + if (self->render_pool) { + gst_buffer_pool_set_active (self->render_pool, FALSE); + gst_clear_object (&self->render_pool); + } + + if (self->convert_pool) { + gst_buffer_pool_set_active (self->convert_pool, FALSE); + gst_clear_object (&self->convert_pool); + } + + g_clear_pointer (&self->render, gst_d3d11_test_src_render_free); + gst_clear_object (&self->converter); +} + +static gboolean +gst_d3d11_test_src_setup_resource (GstD3D11TestSrc * self, GstCaps * caps) +{ + GstVideoInfo draw_info; + GstCaps *draw_caps; + GstD3D11AllocationParams *params; + GstD3D11TestSrcRender *render; + GstStructure *config; + + config = gst_structure_new ("converter-config", + GST_D3D11_CONVERTER_OPT_BACKEND, GST_TYPE_D3D11_CONVERTER_BACKEND, + GST_D3D11_CONVERTER_BACKEND_SHADER, nullptr); + + gst_video_info_set_format (&draw_info, GST_VIDEO_FORMAT_RGBA, + self->info.width, self->info.height); + self->converter = gst_d3d11_converter_new (self->device, + &draw_info, &self->info, config); + + if (!self->converter) { + GST_ERROR_OBJECT (self, "Failed to create converter"); + goto error; + } + + draw_caps = gst_video_info_to_caps (&draw_info); + params = gst_d3d11_allocation_params_new (self->device, &draw_info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, + D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET, 0); + + self->render_pool = gst_d3d11_buffer_pool_new_with_options (self->device, + draw_caps, params, 0, 0); + gst_d3d11_allocation_params_free (params); + gst_caps_unref (draw_caps); + + if (!self->render_pool + || !gst_buffer_pool_set_active (self->render_pool, TRUE)) { + GST_ERROR_OBJECT (self, "Failed to configure draw pool"); + goto error; + } + + params = gst_d3d11_allocation_params_new (self->device, &self->info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, D3D11_BIND_RENDER_TARGET, 0); + self->convert_pool = gst_d3d11_buffer_pool_new_with_options (self->device, + caps, params, 0, 0); + gst_d3d11_allocation_params_free (params); + + if (!self->convert_pool || + !gst_buffer_pool_set_active (self->convert_pool, TRUE)) { + GST_ERROR_OBJECT (self, "Failed to configure draw pool"); + goto error; + } + + self->viewport.TopLeftX = 0; + self->viewport.TopLeftY = 0; + self->viewport.Width = self->info.width; + self->viewport.Height = self->info.height; + self->viewport.MinDepth = 0.0f; + self->viewport.MaxDepth = 1.0f; + + self->render = render = g_new0 (GstD3D11TestSrcRender, 1); + + switch (self->pattern) { + case GST_D3D11_TEST_SRC_SMPTE: + if (!setup_smpte_render (self, render)) + goto error; + break; + case GST_D3D11_TEST_SRC_SNOW: + if (!setup_snow_render (self, render, FALSE)) + goto error; + break; + case GST_D3D11_TEST_SRC_BLACK: + render->clear_color = &color_tableCOLOR_BLACK; + break; + case GST_D3D11_TEST_SRC_WHITE: + render->clear_color = &color_tableCOLOR_WHITE; + break; + case GST_D3D11_TEST_SRC_RED: + render->clear_color = &color_tableCOLOR_RED; + break; + case GST_D3D11_TEST_SRC_GREEN: + render->clear_color = &color_tableCOLOR_GREEN; + break; + case GST_D3D11_TEST_SRC_BLUE: + render->clear_color = &color_tableCOLOR_BLUE; + break; + case GST_D3D11_TEST_SRC_CHECKERS1: + if (!setup_checker_render (self, render, 1)) + goto error; + break; + case GST_D3D11_TEST_SRC_CHECKERS2: + if (!setup_checker_render (self, render, 2)) + goto error; + break; + case GST_D3D11_TEST_SRC_CHECKERS4: + if (!setup_checker_render (self, render, 4)) + goto error; + break; + case GST_D3D11_TEST_SRC_CHECKERS8: + if (!setup_checker_render (self, render, 8)) + goto error; + break; + } + + return TRUE; + +error: + gst_d3d11_test_src_clear_resource (self); + return FALSE; +} + +static gboolean +gst_d3d11_test_src_set_caps (GstBaseSrc * bsrc, GstCaps * caps) +{ + GstD3D11TestSrc *self = GST_D3D11_TEST_SRC (bsrc); + GstCapsFeatures *features; + + GST_DEBUG_OBJECT (self, "Set caps %" GST_PTR_FORMAT, caps); + + gst_d3d11_test_src_clear_resource (self); + + features = gst_caps_get_features (caps, 0); + if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { + self->downstream_supports_d3d11 = TRUE; + } else { + self->downstream_supports_d3d11 = FALSE; + } + + GST_OBJECT_LOCK (self); + gst_video_info_from_caps (&self->info, caps); + GST_OBJECT_UNLOCK (self); + if (self->info.fps_d <= 0 || self->info.fps_n <= 0) { + GST_ERROR_OBJECT (self, "Invalid framerate %d/%d", self->info.fps_n, + self->info.fps_d); + return FALSE; + } + + gst_base_src_set_blocksize (bsrc, GST_VIDEO_INFO_SIZE (&self->info)); + + return gst_d3d11_test_src_setup_resource (self, caps); +} + +static gboolean +gst_d3d11_test_src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query) +{ + GstD3D11TestSrc *self = GST_D3D11_TEST_SRC (bsrc); + GstBufferPool *pool = nullptr; + GstStructure *config; + GstD3D11AllocationParams *d3d11_params; + GstCaps *caps; + guint min, max, size; + gboolean update_pool; + GstVideoInfo vinfo; + + gst_query_parse_allocation (query, &caps, nullptr); + + if (!caps) { + GST_ERROR_OBJECT (self, "No output caps"); + return FALSE; + } + + gst_video_info_from_caps (&vinfo, caps); + + if (gst_query_get_n_allocation_pools (query) > 0) { + gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); + update_pool = TRUE; + } else { + size = GST_VIDEO_INFO_SIZE (&vinfo); + + min = max = 0; + update_pool = FALSE; + } + + if (pool && self->downstream_supports_d3d11) { + if (!GST_IS_D3D11_BUFFER_POOL (pool)) { + gst_clear_object (&pool); + } else { + GstD3D11BufferPool *dpool = GST_D3D11_BUFFER_POOL (pool); + if (dpool->device != self->device) + gst_clear_object (&pool); + } + } + + if (!pool) { + if (self->downstream_supports_d3d11) + pool = gst_d3d11_buffer_pool_new (self->device); + else + pool = gst_video_buffer_pool_new (); + } + + config = gst_buffer_pool_get_config (pool); + + gst_buffer_pool_config_set_params (config, caps, size, min, max); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + + if (self->downstream_supports_d3d11) { + d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); + if (!d3d11_params) { + d3d11_params = gst_d3d11_allocation_params_new (self->device, &vinfo, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, + D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET, 0); + } else { + d3d11_params->desc0.BindFlags |= D3D11_BIND_RENDER_TARGET; + } + + gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params); + gst_d3d11_allocation_params_free (d3d11_params); + } + + if (!gst_buffer_pool_set_config (pool, config)) { + GST_ERROR_OBJECT (self, "Failed to set config"); + gst_clear_object (&pool); + return FALSE; + } + + if (update_pool) + gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); + else + gst_query_add_allocation_pool (query, pool, size, min, max); + + gst_object_unref (pool); + + return TRUE; +} + +static gboolean +gst_d3d11_test_src_start (GstBaseSrc * bsrc) +{ + GstD3D11TestSrc *self = GST_D3D11_TEST_SRC (bsrc); + + if (!gst_d3d11_ensure_element_data (GST_ELEMENT (bsrc), self->adapter_index, + &self->device)) { + GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ, + ("Failed to prepare device"), (nullptr)); + return FALSE; + } + + self->running_time = 0; + self->reverse = FALSE; + self->n_frames = 0; + self->accum_frames = 0; + self->accum_rtime = 0; + + gst_video_info_init (&self->info); + + return TRUE; +} + +static gboolean +gst_d3d11_test_src_stop (GstBaseSrc * bsrc) +{ + GstD3D11TestSrc *self = GST_D3D11_TEST_SRC (bsrc); + + gst_d3d11_test_src_clear_resource (self); + gst_clear_object (&self->device); + + return TRUE; +} + +static gboolean +gst_d3d11_test_src_src_query (GstBaseSrc * bsrc, GstQuery * query) +{ + GstD3D11TestSrc *self = GST_D3D11_TEST_SRC (bsrc); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + if (gst_d3d11_handle_context_query (GST_ELEMENT_CAST (self), query, + self->device)) { + return TRUE; + } + break; + case GST_QUERY_LATENCY: + GST_OBJECT_LOCK (self); + if (self->info.fps_n > 0 && self->info.fps_d > 0) { + GstClockTime latency; + + latency = + gst_util_uint64_scale (GST_SECOND, self->info.fps_d, + self->info.fps_n); + GST_OBJECT_UNLOCK (self); + gst_query_set_latency (query, + gst_base_src_is_live (bsrc), latency, GST_CLOCK_TIME_NONE); + GST_DEBUG_OBJECT (self, "Reporting latency of %" GST_TIME_FORMAT, + GST_TIME_ARGS (latency)); + return TRUE; + } + GST_OBJECT_UNLOCK (self); + break; + case GST_QUERY_DURATION: + if (bsrc->num_buffers > 0) { + GstFormat format; + + gst_query_parse_duration (query, &format, nullptr); + if (format != GST_FORMAT_TIME) + return FALSE; + + GST_OBJECT_LOCK (self); + if (format == GST_FORMAT_TIME && self->info.fps_n > 0 && + self->info.fps_d > 0) { + gint64 dur; + dur = gst_util_uint64_scale_int_round (bsrc->num_buffers + * GST_SECOND, self->info.fps_d, self->info.fps_n); + gst_query_set_duration (query, GST_FORMAT_TIME, dur); + GST_OBJECT_UNLOCK (self); + return TRUE; + } + + GST_OBJECT_UNLOCK (self); + } + break; + default: + break; + } + + return GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query); +} + +static void +gst_d3d11_test_src_get_times (GstBaseSrc * bsrc, GstBuffer * buffer, + GstClockTime * start, GstClockTime * end) +{ + /* for live sources, sync on the timestamp of the buffer */ + if (gst_base_src_is_live (bsrc)) { + GstClockTime timestamp = GST_BUFFER_PTS (buffer); + + if (GST_CLOCK_TIME_IS_VALID (timestamp)) { + /* get duration to calculate end time */ + GstClockTime duration = GST_BUFFER_DURATION (buffer); + + if (GST_CLOCK_TIME_IS_VALID (duration)) { + *end = timestamp + duration; + } + *start = timestamp; + } + } else { + *start = -1; + *end = -1; + } +} + +static gboolean +gst_d3d11_test_src_draw_pattern (GstD3D11TestSrc * self, + ID3D11DeviceContext * context, ID3D11RenderTargetView * rtv) +{ + GstD3D11TestSrcRender *render = self->render; + HRESULT hr; + TimeConstBuffer *time_buf; + D3D11_MAPPED_SUBRESOURCE map; + UINT offsets = 0; + + if (render->clear_color) { + context->ClearRenderTargetView (rtv, render->clear_color->color); + return TRUE; + } + + context->IASetPrimitiveTopology (D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + context->RSSetViewports (1, &self->viewport); + context->OMSetRenderTargets (1, &rtv, nullptr); + context->OMSetBlendState (nullptr, nullptr, 0xffffffff); + + for (guint i = 0; i < G_N_ELEMENTS (render->quad); i++) { + GstD3D11TestSrcQuad *quad = render->quadi; + + if (!quad) + break; + + if (quad->const_buffer) { + hr = context->Map (quad->const_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, + &map); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to map constant buffer"); + return FALSE; + } + + time_buf = (TimeConstBuffer *) map.pData; + time_buf->time = (FLOAT) ((FLOAT) (self->running_time + 1) / GST_SECOND); + context->Unmap (quad->const_buffer, 0); + + context->PSSetConstantBuffers (0, 1, &quad->const_buffer); + } else { + context->PSSetConstantBuffers (0, 0, nullptr); + } + + context->IASetInputLayout (quad->layout); + context->IASetVertexBuffers (0, 1, &quad->vertex_buffer, + &quad->vertex_stride, &offsets); + context->IASetIndexBuffer (quad->index_buffer, DXGI_FORMAT_R16_UINT, 0); + + context->VSSetShader (quad->vs, nullptr, 0); + context->PSSetShader (quad->ps, nullptr, 0); + + context->DrawIndexed (quad->index_count, 0, 0); + } + + context->OMSetRenderTargets (0, nullptr, nullptr); + + return TRUE; +} + +static GstFlowReturn +gst_d3d11_test_src_create (GstBaseSrc * bsrc, guint64 offset, + guint size, GstBuffer ** buf) +{ + GstD3D11TestSrc *self = GST_D3D11_TEST_SRC (bsrc); + GstBuffer *buffer = nullptr; + GstBuffer *render_buffer = nullptr; + GstBuffer *convert_buffer = nullptr; + GstFlowReturn ret = GST_FLOW_ERROR; + GstClockTime pts; + GstClockTime next_time; + GstMapInfo render_info; + ID3D11DeviceContext *context_handle = + gst_d3d11_device_get_device_context_handle (self->device); + GstMemory *mem; + GstD3D11Memory *dmem; + ID3D11RenderTargetView *pattern_rtv; + gboolean convert_ret; + GstD3D11DeviceLockGuard lk (self->device); + + ret = GST_BASE_SRC_CLASS (parent_class)->alloc (bsrc, offset, size, &buffer); + if (ret != GST_FLOW_OK) + return ret; + + ret = + gst_buffer_pool_acquire_buffer (self->render_pool, &render_buffer, + nullptr); + if (ret != GST_FLOW_OK) + goto error; + + if (self->downstream_supports_d3d11) { + convert_buffer = buffer; + } else { + ret = gst_buffer_pool_acquire_buffer (self->convert_pool, + &convert_buffer, nullptr); + if (ret != GST_FLOW_OK) + goto error; + } + + mem = gst_buffer_peek_memory (render_buffer, 0); + + if (!gst_memory_map (mem, &render_info, + (GstMapFlags) (GST_MAP_WRITE | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Failed to map render buffer"); + goto error; + } + + dmem = GST_D3D11_MEMORY_CAST (mem); + pattern_rtv = gst_d3d11_memory_get_render_target_view (dmem, 0); + if (!pattern_rtv) { + GST_ERROR_OBJECT (self, "RTV is not available"); + gst_memory_unmap (mem, &render_info); + goto error; + } + + gst_d3d11_test_src_draw_pattern (self, context_handle, pattern_rtv); + gst_memory_unmap (mem, &render_info); + convert_ret = gst_d3d11_converter_convert_buffer_unlocked (self->converter, + render_buffer, convert_buffer); + + if (!convert_ret) { + GST_ERROR_OBJECT (self, "Failed to convert buffer"); + goto error; + } + + if (self->downstream_supports_d3d11) { + convert_buffer = nullptr; + } else { + gst_d3d11_buffer_copy_into (buffer, convert_buffer, &self->info); + gst_clear_buffer (&convert_buffer); + } + + gst_clear_buffer (&render_buffer); + + pts = self->accum_rtime + self->running_time; + + GST_BUFFER_PTS (buffer) = pts; + GST_BUFFER_DTS (buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_OFFSET (buffer) = self->accum_frames + self->n_frames; + if (self->reverse) { + self->n_frames--; + } else { + self->n_frames++; + } + GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET (buffer) + 1; + + next_time = gst_util_uint64_scale (self->n_frames, + self->info.fps_d * GST_SECOND, self->info.fps_n); + if (self->reverse) { + /* We already decremented to next frame */ + GstClockTime prev_pts = gst_util_uint64_scale (self->n_frames + 2, + self->info.fps_d * GST_SECOND, self->info.fps_n); + + GST_BUFFER_DURATION (buffer) = prev_pts - GST_BUFFER_PTS (buffer); + } else { + GST_BUFFER_DURATION (buffer) = next_time - self->running_time; + } + + self->running_time = next_time; + *buf = buffer; + + return GST_FLOW_OK; + +error: + gst_clear_buffer (&buffer); + gst_clear_buffer (&render_buffer); + if (!self->downstream_supports_d3d11) + gst_clear_buffer (&convert_buffer); + + return ret; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11testsrc.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/base/gstbasesrc.h> +#include <gst/d3d11/gstd3d11.h> + +G_BEGIN_DECLS + +#define GST_TYPE_D3D11_TEST_SRC (gst_d3d11_test_src_get_type()) +G_DECLARE_FINAL_TYPE (GstD3D11TestSrc, gst_d3d11_test_src, + GST, D3D11_TEST_SRC, GstBaseSrc); + +G_END_DECLS +
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11upload.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11upload.cpp
Changed
@@ -73,17 +73,11 @@ struct _GstD3D11Upload { GstD3D11BaseFilter parent; - - GstBuffer *staging_buffer; }; #define gst_d3d11_upload_parent_class parent_class G_DEFINE_TYPE (GstD3D11Upload, gst_d3d11_upload, GST_TYPE_D3D11_BASE_FILTER); -static void gst_d3d11_upload_dispose (GObject * object); -static gboolean gst_d3d11_upload_stop (GstBaseTransform * trans); -static gboolean gst_d3d11_upload_sink_event (GstBaseTransform * trans, - GstEvent * event); static GstCaps *gst_d3d11_upload_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter); static gboolean gst_d3d11_upload_propose_allocation (GstBaseTransform * trans, @@ -92,21 +86,14 @@ GstQuery * query); static GstFlowReturn gst_d3d11_upload_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf); -static gboolean gst_d3d11_upload_set_info (GstD3D11BaseFilter * filter, - GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, - GstVideoInfo * out_info); static void gst_d3d11_upload_class_init (GstD3D11UploadClass * klass) { - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); - GstD3D11BaseFilterClass *bfilter_class = GST_D3D11_BASE_FILTER_CLASS (klass); GstCaps *caps; - gobject_class->dispose = gst_d3d11_upload_dispose; - caps = gst_d3d11_get_updated_template_caps (&sink_template_caps); gst_element_class_add_pad_template (element_class, gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps)); @@ -124,8 +111,6 @@ trans_class->passthrough_on_same_caps = TRUE; - trans_class->stop = GST_DEBUG_FUNCPTR (gst_d3d11_upload_stop); - trans_class->sink_event = GST_DEBUG_FUNCPTR (gst_d3d11_upload_sink_event); trans_class->transform_caps = GST_DEBUG_FUNCPTR (gst_d3d11_upload_transform_caps); trans_class->propose_allocation = @@ -134,8 +119,6 @@ GST_DEBUG_FUNCPTR (gst_d3d11_upload_decide_allocation); trans_class->transform = GST_DEBUG_FUNCPTR (gst_d3d11_upload_transform); - bfilter_class->set_info = GST_DEBUG_FUNCPTR (gst_d3d11_upload_set_info); - GST_DEBUG_CATEGORY_INIT (gst_d3d11_upload_debug, "d3d11upload", 0, "d3d11upload Element"); } @@ -145,43 +128,6 @@ { } -static void -gst_d3d11_upload_dispose (GObject * object) -{ - GstD3D11Upload *self = GST_D3D11_UPLOAD (object); - - gst_clear_buffer (&self->staging_buffer); - - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -static gboolean -gst_d3d11_upload_stop (GstBaseTransform * trans) -{ - GstD3D11Upload *self = GST_D3D11_UPLOAD (trans); - - gst_clear_buffer (&self->staging_buffer); - - return GST_BASE_TRANSFORM_CLASS (parent_class)->stop (trans); -} - -static gboolean -gst_d3d11_upload_sink_event (GstBaseTransform * trans, GstEvent * event) -{ - GstD3D11Upload *self = GST_D3D11_UPLOAD (trans); - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - /* We don't need to hold this staging buffer after eos */ - gst_clear_buffer (&self->staging_buffer); - break; - default: - break; - } - - return GST_BASE_TRANSFORM_CLASS (parent_class)->sink_event (trans, event); -} - static GstCaps * _set_caps_features (const GstCaps * caps, const gchar * feature_name) { @@ -276,6 +222,7 @@ GstBufferPool *pool; GstCaps *caps; guint size; + gboolean is_d3d11 = FALSE; if (!GST_BASE_TRANSFORM_CLASS (parent_class)->propose_allocation (trans, decide_query, query)) @@ -296,8 +243,6 @@ if (gst_query_get_n_allocation_pools (query) == 0) { GstCapsFeatures *features; GstStructure *config; - gboolean is_d3d11 = FALSE; - features = gst_caps_get_features (caps, 0); if (features && gst_caps_features_contains (features, @@ -313,8 +258,6 @@ gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); - - /* d3d11 pool does not support video alignment */ if (!is_d3d11) { gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); @@ -328,12 +271,10 @@ /* d3d11 buffer pool will update buffer size based on allocated texture, * get size from config again */ - if (is_d3d11) { - config = gst_buffer_pool_get_config (pool); - gst_buffer_pool_config_get_params (config, - nullptr, &size, nullptr, nullptr); - gst_structure_free (config); - } + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, + nullptr, &size, nullptr, nullptr); + gst_structure_free (config); gst_query_add_allocation_pool (query, pool, size, 0, 0); gst_object_unref (pool); @@ -364,7 +305,7 @@ GstStructure *config; gboolean update_pool = FALSE; GstVideoInfo vinfo; - const GstD3D11Format *d3d11_format; + GstD3D11Format d3d11_format; GstD3D11AllocationParams *d3d11_params; guint bind_flags = 0; guint i; @@ -380,17 +321,16 @@ gst_video_info_from_caps (&vinfo, outcaps); - d3d11_format = gst_d3d11_device_format_from_gst (filter->device, - GST_VIDEO_INFO_FORMAT (&vinfo)); - if (!d3d11_format) { + if (!gst_d3d11_device_get_format (filter->device, + GST_VIDEO_INFO_FORMAT (&vinfo), &d3d11_format)) { GST_ERROR_OBJECT (filter, "Unknown format caps %" GST_PTR_FORMAT, outcaps); return FALSE; } - if (d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) { - dxgi_format = d3d11_format->resource_format0; + if (d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) { + dxgi_format = d3d11_format.resource_format0; } else { - dxgi_format = d3d11_format->dxgi_format; + dxgi_format = d3d11_format.dxgi_format; } device_handle = gst_d3d11_device_get_device_handle (filter->device); @@ -438,7 +378,7 @@ d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); if (!d3d11_params) { d3d11_params = gst_d3d11_allocation_params_new (filter->device, &vinfo, - (GstD3D11AllocationFlags) 0, bind_flags); + GST_D3D11_ALLOCATION_FLAG_DEFAULT, bind_flags, 0); } else { /* Set bind flag */ for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&vinfo); i++) { @@ -468,99 +408,16 @@ query); } -static gboolean -gst_d3d11_upload_can_use_staging_buffer (GstD3D11Upload * self, - GstBuffer * outbuf) -{ - GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (self); - ID3D11Device *device_handle = - gst_d3d11_device_get_device_handle (filter->device); - - if (!gst_d3d11_buffer_can_access_device (outbuf, device_handle)) - return FALSE; - - if (self->staging_buffer) - return TRUE; - - self->staging_buffer = gst_d3d11_allocate_staging_buffer_for (outbuf, - &filter->out_info, TRUE); - - if (!self->staging_buffer) { - GST_WARNING_OBJECT (self, "Couldn't allocate staging buffer"); - return FALSE; - } - - return TRUE; -} - static GstFlowReturn gst_d3d11_upload_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf) { GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans); - GstD3D11Upload *self = GST_D3D11_UPLOAD (trans); - GstVideoFrame in_frame, out_frame; - GstFlowReturn ret = GST_FLOW_OK; - gboolean use_staging_buf; - GstBuffer *target_outbuf = outbuf; - guint i; - - use_staging_buf = gst_d3d11_upload_can_use_staging_buffer (self, outbuf); - - if (use_staging_buf) { - GST_TRACE_OBJECT (self, "Copy input buffer to staging buffer"); - target_outbuf = self->staging_buffer; - } - if (!gst_video_frame_map (&in_frame, &filter->in_info, inbuf, - (GstMapFlags) (GST_MAP_READ | GST_VIDEO_FRAME_MAP_FLAG_NO_REF))) - goto invalid_buffer; - - if (!gst_video_frame_map (&out_frame, &filter->out_info, target_outbuf, - (GstMapFlags) (GST_MAP_WRITE | GST_VIDEO_FRAME_MAP_FLAG_NO_REF))) { - gst_video_frame_unmap (&in_frame); - goto invalid_buffer; - } - - for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (&in_frame); i++) { - if (!gst_video_frame_copy_plane (&out_frame, &in_frame, i)) { - GST_ERROR_OBJECT (filter, "Couldn't copy plane %d", i); - ret = GST_FLOW_ERROR; - break; - } - } - - gst_video_frame_unmap (&out_frame); - gst_video_frame_unmap (&in_frame); - - /* Copy staging texture to d3d11 texture */ - if (use_staging_buf) { - if (!gst_d3d11_buffer_copy_into (outbuf, - self->staging_buffer, &filter->out_info)) { - GST_ERROR_OBJECT (self, "Cannot copy staging texture into texture"); - return GST_FLOW_ERROR; - } - } - - return ret; - - /* ERRORS */ -invalid_buffer: - { - GST_ELEMENT_WARNING (filter, CORE, NOT_IMPLEMENTED, (NULL), - ("invalid video buffer received")); + if (!gst_d3d11_buffer_copy_into (outbuf, inbuf, &filter->in_info)) { + GST_ERROR_OBJECT (filter, "Failed to copy buffer"); return GST_FLOW_ERROR; } -} -static gboolean -gst_d3d11_upload_set_info (GstD3D11BaseFilter * filter, - GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, - GstVideoInfo * out_info) -{ - GstD3D11Upload *self = GST_D3D11_UPLOAD (filter); - - gst_clear_buffer (&self->staging_buffer); - - return TRUE; + return GST_FLOW_OK; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11videosink.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11videosink.cpp
Changed
@@ -39,7 +39,6 @@ #endif #include "gstd3d11videosink.h" -#include "gstd3d11videoprocessor.h" #include "gstd3d11pluginutils.h" #include <string> @@ -61,6 +60,11 @@ PROP_FULLSCREEN_TOGGLE_MODE, PROP_FULLSCREEN, PROP_DRAW_ON_SHARED_TEXTURE, + PROP_ROTATE_METHOD, + PROP_GAMMA_MODE, + PROP_PRIMARIES_MODE, + PROP_DISPLAY_FORMAT, + PROP_EMIT_PRESENT, }; #define DEFAULT_ADAPTER -1 @@ -69,11 +73,71 @@ #define DEFAULT_FULLSCREEN_TOGGLE_MODE GST_D3D11_WINDOW_FULLSCREEN_TOGGLE_MODE_NONE #define DEFAULT_FULLSCREEN FALSE #define DEFAULT_DRAW_ON_SHARED_TEXTURE FALSE +#define DEFAULT_GAMMA_MODE GST_VIDEO_GAMMA_MODE_NONE +#define DEFAULT_PRIMARIES_MODE GST_VIDEO_PRIMARIES_MODE_NONE +#define DEFAULT_DISPLAY_FORMAT DXGI_FORMAT_UNKNOWN +#define DEFAULT_EMIT_PRESENT FALSE + +/** + * GstD3D11VideoSinkDisplayFormat: + * + * Swapchain's DXGI format + * + * Since: 1.22 + */ +#define GST_TYPE_D3D11_VIDEO_SINK_DISPLAY_FORMAT (gst_d3d11_video_sink_display_format_type()) +static GType +gst_d3d11_video_sink_display_format_type (void) +{ + static GType format_type = 0; + + GST_D3D11_CALL_ONCE_BEGIN { + static const GEnumValue format_types = { + /** + * GstD3D11VideoSinkDisplayFormat::unknown: + * + * Since: 1.22 + */ + {DXGI_FORMAT_UNKNOWN, "DXGI_FORMAT_UNKNOWN", "unknown"}, + + /** + * GstD3D11VideoSinkDisplayFormat::r10g10b10a2-unorm: + * + * Since: 1.22 + */ + {DXGI_FORMAT_R10G10B10A2_UNORM, + "DXGI_FORMAT_R10G10B10A2_UNORM", "r10g10b10a2-unorm"}, + + /** + * GstD3D11VideoSinkDisplayFormat::r8g8b8a8-unorm: + * + * Since: 1.22 + */ + {DXGI_FORMAT_R8G8B8A8_UNORM, + "DXGI_FORMAT_R8G8B8A8_UNORM", "r8g8b8a8-unorm"}, + + /** + * GstD3D11VideoSinkDisplayFormat::b8g8r8a8-unorm: + * + * Since: 1.22 + */ + {DXGI_FORMAT_B8G8R8A8_UNORM, + "DXGI_FORMAT_B8G8R8A8_UNORM", "b8g8r8a8-unorm"}, + {0, nullptr, nullptr}, + }; + + format_type = g_enum_register_static ("GstD3D11VideoSinkDisplayFormat", + format_types); + } GST_D3D11_CALL_ONCE_END; + + return format_type; +} enum { /* signals */ SIGNAL_BEGIN_DRAW, + SIGNAL_PRESENT, /* actions */ SIGNAL_DRAW, @@ -106,12 +170,11 @@ GstD3D11Window *window; gint video_width; gint video_height; - GstVideoInfo info; - guintptr window_id; - gboolean caps_updated; + GstBuffer *prepared_buffer; + GstBufferPool *pool; /* properties */ gint adapter; @@ -120,34 +183,28 @@ GstD3D11WindowFullscreenToggleMode fullscreen_toggle_mode; gboolean fullscreen; gboolean draw_on_shared_texture; + GstVideoGammaMode gamma_mode; + GstVideoPrimariesMode primaries_mode; + DXGI_FORMAT display_format; + gboolean emit_present; /* saved render rectangle until we have a window */ GstVideoRectangle render_rect; gboolean pending_render_rect; - GstBufferPool *fallback_pool; - gboolean have_video_processor; - gboolean processor_in_use; - /* For drawing on user texture */ gboolean drawing; - GstBuffer *current_buffer; - GRecMutex lock; + CRITICAL_SECTION lock; gchar *title; -}; -#define GST_D3D11_VIDEO_SINK_GET_LOCK(d) (&(GST_D3D11_VIDEO_SINK_CAST(d)->lock)) -#define GST_D3D11_VIDEO_SINK_LOCK(d) G_STMT_START { \ - GST_TRACE_OBJECT (d, "Locking from thread %p", g_thread_self()); \ - g_rec_mutex_lock (GST_D3D11_VIDEO_SINK_GET_LOCK (d)); \ - GST_TRACE_OBJECT (d, "Locked from thread %p", g_thread_self()); \ - } G_STMT_END - -#define GST_D3D11_VIDEO_SINK_UNLOCK(d) G_STMT_START { \ - GST_TRACE_OBJECT (d, "Unlocking from thread %p", g_thread_self()); \ - g_rec_mutex_unlock (GST_D3D11_VIDEO_SINK_GET_LOCK (d)); \ - } G_STMT_END + /* method configured via property */ + GstVideoOrientationMethod method; + /* method parsed from tag */ + GstVideoOrientationMethod tag_method; + /* method currently selected based on "method" and "tag_method" */ + GstVideoOrientationMethod selected_method; +}; static void gst_d3d11_videosink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -181,10 +238,13 @@ static gboolean gst_d3d11_video_sink_unlock_stop (GstBaseSink * sink); static gboolean gst_d3d11_video_sink_event (GstBaseSink * sink, GstEvent * event); - +static GstFlowReturn gst_d3d11_video_sink_prepare (GstBaseSink * sink, + GstBuffer * buffer); static GstFlowReturn gst_d3d11_video_sink_show_frame (GstVideoSink * sink, GstBuffer * buf); static gboolean gst_d3d11_video_sink_prepare_window (GstD3D11VideoSink * self); +static void gst_d3d11_video_sink_set_orientation (GstD3D11VideoSink * self, + GstVideoOrientationMethod method, gboolean from_tag); #define gst_d3d11_video_sink_parent_class parent_class G_DEFINE_TYPE_WITH_CODE (GstD3D11VideoSink, gst_d3d11_video_sink, @@ -274,6 +334,71 @@ G_PARAM_STATIC_STRINGS))); /** + * GstD3D11VideoSink:rotate-method: + * + * Video rotation/flip method to use + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_ROTATE_METHOD, + g_param_spec_enum ("rotate-method", "Rotate Method", + "Rotate method to use", + GST_TYPE_VIDEO_ORIENTATION_METHOD, GST_VIDEO_ORIENTATION_IDENTITY, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /** + * GstD3D11VideoSink:gamma-mode: + * + * Gamma conversion mode + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_GAMMA_MODE, + g_param_spec_enum ("gamma-mode", "Gamma mode", + "Gamma conversion mode", GST_TYPE_VIDEO_GAMMA_MODE, + DEFAULT_GAMMA_MODE, (GParamFlags) (GST_PARAM_MUTABLE_READY | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /** + * GstD3D11VideoSink:primaries-mode: + * + * Primaries conversion mode + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_PRIMARIES_MODE, + g_param_spec_enum ("primaries-mode", "Primaries Mode", + "Primaries conversion mode", GST_TYPE_VIDEO_PRIMARIES_MODE, + DEFAULT_PRIMARIES_MODE, (GParamFlags) (GST_PARAM_MUTABLE_READY | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /** + * GstD3D11VideoSink:display-format: + * + * Swapchain display format + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_DISPLAY_FORMAT, + g_param_spec_enum ("display-format", "Display Format", + "Swapchain display format", GST_TYPE_D3D11_VIDEO_SINK_DISPLAY_FORMAT, + DEFAULT_DISPLAY_FORMAT, (GParamFlags) (G_PARAM_READWRITE | + GST_PARAM_MUTABLE_READY | G_PARAM_STATIC_STRINGS))); + + /** + * GstD3D11VideoSink:emit-present: + * + * Emits "present" signal + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_EMIT_PRESENT, + g_param_spec_boolean ("emit-present", "Emit present", + "Emits present signal", DEFAULT_EMIT_PRESENT, + (GParamFlags) (G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY | + G_PARAM_STATIC_STRINGS))); + + /** * GstD3D11VideoSink::begin-draw: * @videosink: the #d3d11videosink * @@ -314,6 +439,27 @@ G_TYPE_BOOLEAN, 4, G_TYPE_POINTER, G_TYPE_UINT, G_TYPE_UINT64, G_TYPE_UINT64); + /** + * GstD3D11VideoSink::present + * @videosink: the #GstD3D11VideoSink + * @device: a GstD3D11Device object + * @render_target: a ID3D11RenderTargetView handle of swapchain's backbuffer + * + * Emitted just before presenting a texture via the IDXGISwapChain::Present. + * The client can perform additional rendering on the given @render_target, + * or can read the content already rendered on the swapchain's backbuffer. + * + * This signal will be emitted with gst_d3d11_device_lock taken and + * client should perform GPU operation from the thread where this signal + * emitted. + * + * Since: 1.22 + */ + gst_d3d11_video_sink_signalsSIGNAL_PRESENT = + g_signal_new ("present", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, 0, nullptr, nullptr, nullptr, + G_TYPE_NONE, 2, GST_TYPE_OBJECT, G_TYPE_POINTER); + element_class->set_context = GST_DEBUG_FUNCPTR (gst_d3d11_video_sink_set_context); @@ -338,6 +484,7 @@ basesink_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_d3d11_video_sink_unlock_stop); basesink_class->event = GST_DEBUG_FUNCPTR (gst_d3d11_video_sink_event); + basesink_class->prepare = GST_DEBUG_FUNCPTR (gst_d3d11_video_sink_prepare); videosink_class->show_frame = GST_DEBUG_FUNCPTR (gst_d3d11_video_sink_show_frame); @@ -346,6 +493,8 @@ gst_type_mark_as_plugin_api (GST_D3D11_WINDOW_TOGGLE_MODE_GET_TYPE, (GstPluginAPIFlags) 0); + gst_type_mark_as_plugin_api (GST_TYPE_D3D11_VIDEO_SINK_DISPLAY_FORMAT, + (GstPluginAPIFlags) 0); } static void @@ -357,8 +506,12 @@ self->fullscreen_toggle_mode = DEFAULT_FULLSCREEN_TOGGLE_MODE; self->fullscreen = DEFAULT_FULLSCREEN; self->draw_on_shared_texture = DEFAULT_DRAW_ON_SHARED_TEXTURE; + self->gamma_mode = DEFAULT_GAMMA_MODE; + self->primaries_mode = DEFAULT_PRIMARIES_MODE; + self->display_format = DEFAULT_DISPLAY_FORMAT; + self->emit_present = DEFAULT_EMIT_PRESENT; - g_rec_mutex_init (&self->lock); + InitializeCriticalSection (&self->lock); } static void @@ -366,8 +519,8 @@ const GValue * value, GParamSpec * pspec) { GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (object); + GstD3D11CSLockGuard lk (&self->lock); - GST_D3D11_VIDEO_SINK_LOCK (self); switch (prop_id) { case PROP_ADAPTER: self->adapter = g_value_get_int (value); @@ -402,11 +555,26 @@ case PROP_DRAW_ON_SHARED_TEXTURE: self->draw_on_shared_texture = g_value_get_boolean (value); break; + case PROP_ROTATE_METHOD: + gst_d3d11_video_sink_set_orientation (self, + (GstVideoOrientationMethod) g_value_get_enum (value), FALSE); + break; + case PROP_GAMMA_MODE: + self->gamma_mode = (GstVideoGammaMode) g_value_get_enum (value); + break; + case PROP_PRIMARIES_MODE: + self->primaries_mode = (GstVideoPrimariesMode) g_value_get_enum (value); + break; + case PROP_DISPLAY_FORMAT: + self->display_format = (DXGI_FORMAT) g_value_get_enum (value); + break; + case PROP_EMIT_PRESENT: + self->emit_present = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } - GST_D3D11_VIDEO_SINK_UNLOCK (self); } static void @@ -414,8 +582,8 @@ GValue * value, GParamSpec * pspec) { GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (object); + GstD3D11CSLockGuard lk (&self->lock); - GST_D3D11_VIDEO_SINK_LOCK (self); switch (prop_id) { case PROP_ADAPTER: g_value_set_int (value, self->adapter); @@ -439,11 +607,25 @@ case PROP_DRAW_ON_SHARED_TEXTURE: g_value_set_boolean (value, self->draw_on_shared_texture); break; + case PROP_ROTATE_METHOD: + g_value_set_enum (value, self->method); + break; + case PROP_GAMMA_MODE: + g_value_set_enum (value, self->gamma_mode); + break; + case PROP_PRIMARIES_MODE: + g_value_set_enum (value, self->primaries_mode); + break; + case PROP_DISPLAY_FORMAT: + g_value_set_enum (value, self->display_format); + break; + case PROP_EMIT_PRESENT: + g_value_set_boolean (value, self->emit_present); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } - GST_D3D11_VIDEO_SINK_UNLOCK (self); } static void @@ -451,7 +633,7 @@ { GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (object); - g_rec_mutex_clear (&self->lock); + DeleteCriticalSection (&self->lock); g_free (self->title); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -534,16 +716,24 @@ gint display_par_n = 1, display_par_d = 1; /* display's PAR */ guint num, den; GError *error = NULL; + GstStructure *config; GstD3D11Window *window; GstFlowReturn ret = GST_FLOW_OK; + GstD3D11AllocationParams *params; + guint bind_flags = D3D11_BIND_SHADER_RESOURCE; + GstD3D11Format device_format; GST_DEBUG_OBJECT (self, "Updating window with caps %" GST_PTR_FORMAT, caps); self->caps_updated = FALSE; + if (self->pool) { + gst_buffer_pool_set_active (self->pool, FALSE); + gst_clear_object (&self->pool); + } - GST_D3D11_VIDEO_SINK_LOCK (self); + EnterCriticalSection (&self->lock); if (!gst_d3d11_video_sink_prepare_window (self)) { - GST_D3D11_VIDEO_SINK_UNLOCK (self); + LeaveCriticalSection (&self->lock); GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, (nullptr), ("Failed to open window.")); @@ -554,7 +744,7 @@ if (!gst_video_info_from_caps (&self->info, caps)) { GST_DEBUG_OBJECT (self, "Could not locate image format from caps %" GST_PTR_FORMAT, caps); - GST_D3D11_VIDEO_SINK_UNLOCK (self); + LeaveCriticalSection (&self->lock); return GST_FLOW_ERROR; } @@ -570,7 +760,7 @@ if (!gst_video_calculate_display_ratio (&num, &den, video_width, video_height, video_par_n, video_par_d, display_par_n, display_par_d)) { - GST_D3D11_VIDEO_SINK_UNLOCK (self); + LeaveCriticalSection (&self->lock); GST_ELEMENT_ERROR (self, CORE, NEGOTIATION, (nullptr), ("Error calculating the output display ratio of the video.")); @@ -613,7 +803,7 @@ self->video_height = video_height; if (GST_VIDEO_SINK_WIDTH (self) <= 0 || GST_VIDEO_SINK_HEIGHT (self) <= 0) { - GST_D3D11_VIDEO_SINK_UNLOCK (self); + LeaveCriticalSection (&self->lock); GST_ELEMENT_ERROR (self, CORE, NEGOTIATION, (nullptr), ("Error calculating the output display ratio of the video.")); @@ -627,21 +817,25 @@ gst_d3d11_window_set_render_rectangle (self->window, &rect); } - self->have_video_processor = FALSE; + config = gst_structure_new ("convert-config", + GST_D3D11_CONVERTER_OPT_GAMMA_MODE, + GST_TYPE_VIDEO_GAMMA_MODE, self->gamma_mode, + GST_D3D11_CONVERTER_OPT_PRIMARIES_MODE, + GST_TYPE_VIDEO_PRIMARIES_MODE, self->primaries_mode, nullptr); + window = (GstD3D11Window *) gst_object_ref (self->window); - GST_D3D11_VIDEO_SINK_UNLOCK (self); + LeaveCriticalSection (&self->lock); ret = gst_d3d11_window_prepare (window, GST_VIDEO_SINK_WIDTH (self), - GST_VIDEO_SINK_HEIGHT (self), caps, &self->have_video_processor, &error); + GST_VIDEO_SINK_HEIGHT (self), caps, config, self->display_format, &error); if (ret != GST_FLOW_OK) { GstMessage *error_msg; if (ret == GST_FLOW_FLUSHING) { - GST_D3D11_VIDEO_SINK_LOCK (self); + GstD3D11CSLockGuard lk (&self->lock); GST_WARNING_OBJECT (self, "Couldn't prepare window but we are flushing"); gst_clear_object (&self->window); gst_object_unref (window); - GST_D3D11_VIDEO_SINK_UNLOCK (self); return GST_FLOW_FLUSHING; } @@ -656,52 +850,39 @@ return GST_FLOW_ERROR; } - if (self->fallback_pool) { - gst_buffer_pool_set_active (self->fallback_pool, FALSE); - gst_clear_object (&self->fallback_pool); + if (self->title) { + gst_d3d11_window_set_title (window, self->title); + g_clear_pointer (&self->title, g_free); } - { - GstD3D11AllocationParams *d3d11_params; - gint bind_flags = D3D11_BIND_SHADER_RESOURCE; - - if (self->have_video_processor) { - /* To create video processor input view, one of following bind flags - * is required - * NOTE: Any texture arrays which were created with D3D11_BIND_DECODER flag - * cannot be used for shader input. - * - * D3D11_BIND_DECODER - * D3D11_BIND_VIDEO_ENCODER - * D3D11_BIND_RENDER_TARGET - * D3D11_BIND_UNORDERED_ACCESS_VIEW - */ - bind_flags |= D3D11_BIND_RENDER_TARGET; - } + gst_object_unref (window); - d3d11_params = gst_d3d11_allocation_params_new (self->device, - &self->info, (GstD3D11AllocationFlags) 0, bind_flags); + self->pool = gst_d3d11_buffer_pool_new (self->device); + config = gst_buffer_pool_get_config (self->pool); - self->fallback_pool = gst_d3d11_buffer_pool_new_with_options (self->device, - caps, d3d11_params, 2, 0); - gst_d3d11_allocation_params_free (d3d11_params); + if (gst_d3d11_device_get_format (self->device, + GST_VIDEO_INFO_FORMAT (&self->info), &device_format) && + (device_format.format_support0 & + (guint) D3D11_FORMAT_SUPPORT_RENDER_TARGET) != 0) { + bind_flags |= D3D11_BIND_RENDER_TARGET; } - if (!self->fallback_pool) { - GST_ERROR_OBJECT (self, "Failed to configure fallback pool"); - gst_object_unref (window); - return GST_FLOW_ERROR; - } + params = gst_d3d11_allocation_params_new (self->device, &self->info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, bind_flags, 0); + gst_buffer_pool_config_set_d3d11_allocation_params (config, params); + gst_d3d11_allocation_params_free (params); - self->processor_in_use = FALSE; + gst_buffer_pool_config_set_params (config, caps, self->info.size, 0, 0); + if (!gst_buffer_pool_set_config (self->pool, config) || + !gst_buffer_pool_set_active (self->pool, TRUE)) { + GST_ERROR_OBJECT (self, "Couldn't setup buffer pool"); + gst_clear_object (&self->pool); - if (self->title) { - gst_d3d11_window_set_title (window, self->title); - g_clear_pointer (&self->title, g_free); + GST_ELEMENT_ERROR (self, RESOURCE, FAILED, (nullptr), + ("Couldn't setup buffer pool")); + return GST_FLOW_ERROR; } - gst_object_unref (window); - return GST_FLOW_OK; } @@ -709,22 +890,58 @@ gst_d3d11_video_sink_key_event (GstD3D11Window * window, const gchar * event, const gchar * key, GstD3D11VideoSink * self) { - if (self->enable_navigation_events) { - GST_LOG_OBJECT (self, "send key event %s, key %s", event, key); - gst_navigation_send_key_event (GST_NAVIGATION (self), event, key); + GstEvent *key_event; + + if (!self->enable_navigation_events || !event || !key) + return; + + GST_LOG_OBJECT (self, "send key event %s, key %s", event, key); + if (g_strcmp0 ("key-press", event) == 0) { + key_event = gst_navigation_event_new_key_press (key, + GST_NAVIGATION_MODIFIER_NONE); + } else if (g_strcmp0 ("key-release", event) == 0) { + key_event = gst_navigation_event_new_key_release (key, + GST_NAVIGATION_MODIFIER_NONE); + } else { + return; } + + gst_navigation_send_event_simple (GST_NAVIGATION (self), key_event); } static void gst_d3d11_video_mouse_key_event (GstD3D11Window * window, const gchar * event, gint button, gdouble x, gdouble y, GstD3D11VideoSink * self) { - if (self->enable_navigation_events) { - GST_LOG_OBJECT (self, - "send mouse event %s, button %d (%.1f, %.1f)", event, button, x, y); - gst_navigation_send_mouse_event (GST_NAVIGATION (self), event, button, x, - y); + GstEvent *mouse_event; + + if (!self->enable_navigation_events || !event) + return; + + GST_LOG_OBJECT (self, + "send mouse event %s, button %d (%.1f, %.1f)", event, button, x, y); + if (g_strcmp0 ("mouse-button-press", event) == 0) { + mouse_event = gst_navigation_event_new_mouse_button_press (button, x, y, + GST_NAVIGATION_MODIFIER_NONE); + } else if (g_strcmp0 ("mouse-button-release", event) == 0) { + mouse_event = gst_navigation_event_new_mouse_button_release (button, x, y, + GST_NAVIGATION_MODIFIER_NONE); + } else if (g_strcmp0 ("mouse-move", event) == 0) { + mouse_event = gst_navigation_event_new_mouse_move (x, y, + GST_NAVIGATION_MODIFIER_NONE); + } else { + return; } + + gst_navigation_send_event_simple (GST_NAVIGATION (self), mouse_event); +} + +static void +gst_d3d11_video_sink_present (GstD3D11Window * window, GstD3D11Device * device, + ID3D11RenderTargetView * rtv, GstD3D11VideoSink * self) +{ + g_signal_emit (self, gst_d3d11_video_sink_signalsSIGNAL_PRESENT, 0, + device, rtv); } static gboolean @@ -815,12 +1032,17 @@ "force-aspect-ratio", self->force_aspect_ratio, "fullscreen-toggle-mode", self->fullscreen_toggle_mode, "fullscreen", self->fullscreen, - "enable-navigation-events", self->enable_navigation_events, NULL); + "enable-navigation-events", self->enable_navigation_events, + "emit-present", self->emit_present, nullptr); + + gst_d3d11_window_set_orientation (self->window, self->selected_method); g_signal_connect (self->window, "key-event", G_CALLBACK (gst_d3d11_video_sink_key_event), self); g_signal_connect (self->window, "mouse-event", G_CALLBACK (gst_d3d11_video_mouse_key_event), self); + g_signal_connect (self->window, "present", + G_CALLBACK (gst_d3d11_video_sink_present), self); GST_DEBUG_OBJECT (self, "Have prepared window %" GST_PTR_FORMAT, self->window); @@ -832,24 +1054,21 @@ gst_d3d11_video_sink_stop (GstBaseSink * sink) { GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (sink); + GstD3D11CSLockGuard lk (&self->lock); GST_DEBUG_OBJECT (self, "Stop"); - if (self->fallback_pool) { - gst_buffer_pool_set_active (self->fallback_pool, FALSE); - gst_object_unref (self->fallback_pool); - self->fallback_pool = NULL; + gst_clear_buffer (&self->prepared_buffer); + if (self->pool) { + gst_buffer_pool_set_active (self->pool, FALSE); + gst_clear_object (&self->pool); } - GST_D3D11_VIDEO_SINK_LOCK (self); if (self->window) gst_d3d11_window_unprepare (self->window); gst_clear_object (&self->window); - GST_D3D11_VIDEO_SINK_UNLOCK (self); - gst_clear_object (&self->device); - g_clear_pointer (&self->title, g_free); return TRUE; @@ -882,7 +1101,7 @@ if (need_pool) { GstCapsFeatures *features; GstStructure *config; - gboolean is_d3d11 = false; + gboolean is_d3d11 = FALSE; features = gst_caps_get_features (caps, 0); if (features @@ -890,7 +1109,7 @@ GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { GST_DEBUG_OBJECT (self, "upstream support d3d11 memory"); pool = gst_d3d11_buffer_pool_new (self->device); - is_d3d11 = true; + is_d3d11 = TRUE; } else { pool = gst_video_buffer_pool_new (); } @@ -898,8 +1117,6 @@ config = gst_buffer_pool_get_config (pool); gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); - - /* d3d11 pool does not support video alignment */ if (!is_d3d11) { gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); @@ -911,7 +1128,8 @@ d3d11_params = gst_d3d11_allocation_params_new (self->device, - &info, (GstD3D11AllocationFlags) 0, D3D11_BIND_SHADER_RESOURCE); + &info, GST_D3D11_ALLOCATION_FLAG_DEFAULT, D3D11_BIND_SHADER_RESOURCE, + 0); gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params); gst_d3d11_allocation_params_free (d3d11_params); @@ -926,14 +1144,14 @@ return FALSE; } - if (is_d3d11) { - /* d3d11 buffer pool will update buffer size based on allocated texture, - * get size from config again */ - config = gst_buffer_pool_get_config (pool); - gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, - nullptr); - gst_structure_free (config); + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, + nullptr); + gst_structure_free (config); + if (is_d3d11) { /* In case of system memory, we will upload video frame to GPU memory, * (which is copy in any case), so crop meta support for system memory * is almost pointless */ @@ -992,11 +1210,10 @@ gst_d3d11_video_sink_unlock (GstBaseSink * sink) { GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (sink); + GstD3D11CSLockGuard lk (&self->lock); - GST_D3D11_VIDEO_SINK_LOCK (self); if (self->window) gst_d3d11_window_unlock (self->window); - GST_D3D11_VIDEO_SINK_UNLOCK (self); return TRUE; } @@ -1005,11 +1222,12 @@ gst_d3d11_video_sink_unlock_stop (GstBaseSink * sink) { GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (sink); + GstD3D11CSLockGuard lk (&self->lock); - GST_D3D11_VIDEO_SINK_LOCK (self); if (self->window) gst_d3d11_window_unlock_stop (self->window); - GST_D3D11_VIDEO_SINK_UNLOCK (self); + + gst_clear_buffer (&self->prepared_buffer); return TRUE; } @@ -1023,6 +1241,7 @@ case GST_EVENT_TAG:{ GstTagList *taglist; gchar *title = nullptr; + GstVideoOrientationMethod method = GST_VIDEO_ORIENTATION_IDENTITY; gst_event_parse_tag (event, &taglist); gst_tag_list_get_string (taglist, GST_TAG_TITLE, &title); @@ -1030,6 +1249,7 @@ if (title) { const gchar *app_name = g_get_application_name (); std::string title_string; + GstD3D11CSLockGuard lk (&self->lock); if (app_name) { title_string = std::string (title) + " : " + std::string (app_name); @@ -1037,17 +1257,20 @@ title_string = std::string (title); } - GST_D3D11_VIDEO_SINK_LOCK (self); if (self->window) { gst_d3d11_window_set_title (self->window, title_string.c_str ()); } else { g_free (self->title); self->title = g_strdup (title_string.c_str ()); } - GST_D3D11_VIDEO_SINK_UNLOCK (self); g_free (title); } + + if (gst_video_orientation_from_tag (taglist, &method)) { + GstD3D11CSLockGuard lk (&self->lock); + gst_d3d11_video_sink_set_orientation (self, method, TRUE); + } break; } default: @@ -1057,106 +1280,29 @@ return GST_BASE_SINK_CLASS (parent_class)->event (sink, event); } -static gboolean -gst_d3d11_video_sink_upload_frame (GstD3D11VideoSink * self, GstBuffer * inbuf, - GstBuffer * outbuf) -{ - GstVideoFrame in_frame, out_frame; - gboolean ret; - - GST_LOG_OBJECT (self, "Copy to fallback buffer"); - - if (!gst_video_frame_map (&in_frame, &self->info, inbuf, - (GstMapFlags) (GST_MAP_READ | GST_VIDEO_FRAME_MAP_FLAG_NO_REF))) - goto invalid_buffer; - - if (!gst_video_frame_map (&out_frame, &self->info, outbuf, - (GstMapFlags) (GST_MAP_WRITE | GST_VIDEO_FRAME_MAP_FLAG_NO_REF))) { - gst_video_frame_unmap (&in_frame); - goto invalid_buffer; - } - - ret = gst_video_frame_copy (&out_frame, &in_frame); - - gst_video_frame_unmap (&in_frame); - gst_video_frame_unmap (&out_frame); - - return ret; - - /* ERRORS */ -invalid_buffer: - { - GST_ELEMENT_WARNING (self, CORE, NOT_IMPLEMENTED, (NULL), - ("invalid video buffer received")); - return FALSE; - } -} - -static gboolean -gst_d3d11_video_sink_copy_d3d11_to_d3d11 (GstD3D11VideoSink * self, - GstBuffer * inbuf, GstBuffer * outbuf) -{ - GST_LOG_OBJECT (self, "Copy to fallback buffer using device memory copy"); - - return gst_d3d11_buffer_copy_into (outbuf, inbuf, &self->info); -} - -static gboolean -gst_d3d11_video_sink_get_fallback_buffer (GstD3D11VideoSink * self, - GstBuffer * inbuf, GstBuffer ** fallback_buf, gboolean device_copy) +/* called with lock */ +static void +gst_d3d11_video_sink_set_orientation (GstD3D11VideoSink * self, + GstVideoOrientationMethod method, gboolean from_tag) { - GstBuffer *outbuf = NULL; - ID3D11ShaderResourceView *viewGST_VIDEO_MAX_PLANES; - GstVideoOverlayCompositionMeta *compo_meta; - GstVideoCropMeta *crop_meta; - - if (!self->fallback_pool || - !gst_buffer_pool_set_active (self->fallback_pool, TRUE) || - gst_buffer_pool_acquire_buffer (self->fallback_pool, &outbuf, - NULL) != GST_FLOW_OK) { - GST_ERROR_OBJECT (self, "fallback pool is unavailable"); - return FALSE; - } - - /* Ensure SRV */ - if (!gst_d3d11_buffer_get_shader_resource_view (outbuf, view)) { - GST_ERROR_OBJECT (self, "fallback SRV is unavailable"); - goto error; - } - - if (device_copy) { - if (!gst_d3d11_video_sink_copy_d3d11_to_d3d11 (self, inbuf, outbuf)) { - GST_ERROR_OBJECT (self, "cannot copy frame"); - goto error; - } - } else if (!gst_d3d11_video_sink_upload_frame (self, inbuf, outbuf)) { - GST_ERROR_OBJECT (self, "cannot upload frame"); - goto error; + if (method == GST_VIDEO_ORIENTATION_CUSTOM) { + GST_WARNING_OBJECT (self, "Unsupported custom orientation"); + return; } - /* Copy overlaycomposition meta if any */ - compo_meta = gst_buffer_get_video_overlay_composition_meta (inbuf); - if (compo_meta) - gst_buffer_add_video_overlay_composition_meta (outbuf, compo_meta->overlay); - - /* And copy crop meta as well */ - crop_meta = gst_buffer_get_video_crop_meta (inbuf); - if (crop_meta) { - GstVideoCropMeta *new_crop_meta = gst_buffer_add_video_crop_meta (outbuf); + if (from_tag) + self->tag_method = method; + else + self->method = method; - new_crop_meta->x = crop_meta->x; - new_crop_meta->y = crop_meta->y; - new_crop_meta->width = crop_meta->width; - new_crop_meta->height = crop_meta->height; + if (self->method == GST_VIDEO_ORIENTATION_AUTO) { + self->selected_method = self->tag_method; + } else { + self->selected_method = self->method; } - *fallback_buf = outbuf; - - return TRUE; - -error: - gst_buffer_unref (outbuf); - return FALSE; + if (self->window) + gst_d3d11_window_set_orientation (self->window, self->selected_method); } static void @@ -1202,17 +1348,14 @@ } static GstFlowReturn -gst_d3d11_video_sink_show_frame (GstVideoSink * sink, GstBuffer * buf) +gst_d3d11_video_sink_prepare (GstBaseSink * sink, GstBuffer * buffer) { GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (sink); - GstFlowReturn ret = GST_FLOW_OK; - GstBuffer *fallback_buf = NULL; - ID3D11Device *device_handle = - gst_d3d11_device_get_device_handle (self->device); - ID3D11ShaderResourceView *viewGST_VIDEO_MAX_PLANES; + GstFlowReturn ret; - gst_d3d11_video_sink_check_device_update (self, buf); + gst_clear_buffer (&self->prepared_buffer); + gst_d3d11_video_sink_check_device_update (self, buffer); if (self->caps_updated || !self->window) { GstCaps *caps = gst_pad_get_current_caps (GST_BASE_SINK_PAD (sink)); @@ -1227,54 +1370,55 @@ return ret; } - if (!gst_d3d11_buffer_can_access_device (buf, device_handle)) { - GST_LOG_OBJECT (self, "Need fallback buffer"); + if (!gst_is_d3d11_buffer (buffer)) { + GstVideoOverlayCompositionMeta *overlay_meta; - if (!gst_d3d11_video_sink_get_fallback_buffer (self, buf, &fallback_buf, - FALSE)) { - return GST_FLOW_ERROR; - } - } else { - gboolean direct_rendering = FALSE; - - /* Check if we can use video processor for conversion */ - if (gst_buffer_n_memory (buf) == 1 && self->have_video_processor) { - GstD3D11Memory *mem = (GstD3D11Memory *) gst_buffer_peek_memory (buf, 0); - D3D11_TEXTURE2D_DESC desc; - - gst_d3d11_memory_get_texture_desc (mem, &desc); - if ((desc.BindFlags & D3D11_BIND_DECODER) == D3D11_BIND_DECODER) { - GST_TRACE_OBJECT (self, - "Got VideoProcessor compatible texture, do direct rendering"); - direct_rendering = TRUE; - self->processor_in_use = TRUE; - } else if (self->processor_in_use && - (desc.BindFlags & D3D11_BIND_RENDER_TARGET) == - D3D11_BIND_RENDER_TARGET) { - direct_rendering = TRUE; - } - } + ret = gst_buffer_pool_acquire_buffer (self->pool, &self->prepared_buffer, + nullptr); + if (ret != GST_FLOW_OK) + return ret; - /* Or, SRV should be available */ - if (!direct_rendering) { - if (gst_d3d11_buffer_get_shader_resource_view (buf, view)) { - GST_TRACE_OBJECT (self, "SRV is available, do direct rendering"); - direct_rendering = TRUE; + gst_d3d11_buffer_copy_into (self->prepared_buffer, buffer, &self->info); + /* Upload to default texture */ + for (guint i = 0; i < gst_buffer_n_memory (self->prepared_buffer); i++) { + GstMemory *mem = gst_buffer_peek_memory (self->prepared_buffer, i); + GstMapInfo info; + if (!gst_memory_map (mem, + &info, (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Couldn't map fallback buffer"); + gst_clear_buffer (&self->prepared_buffer); + return GST_FLOW_ERROR; } + + gst_memory_unmap (mem, &info); } - if (!direct_rendering && - !gst_d3d11_video_sink_get_fallback_buffer (self, buf, &fallback_buf, - TRUE)) { - return GST_FLOW_ERROR; + overlay_meta = gst_buffer_get_video_overlay_composition_meta (buffer); + if (overlay_meta) { + gst_buffer_add_video_overlay_composition_meta (self->prepared_buffer, + overlay_meta->overlay); } + } else { + self->prepared_buffer = gst_buffer_ref (buffer); } - gst_d3d11_window_show (self->window); + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_d3d11_video_sink_show_frame (GstVideoSink * sink, GstBuffer * buf) +{ + GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (sink); + GstFlowReturn ret = GST_FLOW_OK; + + if (!self->prepared_buffer) { + GST_ERROR_OBJECT (self, "No prepared buffer"); + return GST_FLOW_ERROR; + } if (self->draw_on_shared_texture) { - GST_D3D11_VIDEO_SINK_LOCK (self); - self->current_buffer = fallback_buf ? fallback_buf : buf; + GstD3D11CSLockGuard lk (&self->lock); + self->drawing = TRUE; GST_LOG_OBJECT (self, "Begin drawing"); @@ -1285,15 +1429,10 @@ GST_LOG_OBJECT (self, "End drawing"); self->drawing = FALSE; - self->current_buffer = NULL; - GST_D3D11_VIDEO_SINK_UNLOCK (self); } else { - ret = gst_d3d11_window_render (self->window, - fallback_buf ? fallback_buf : buf); + ret = gst_d3d11_window_render (self->window, self->prepared_buffer); } - gst_clear_buffer (&fallback_buf); - if (ret == GST_D3D11_WINDOW_FLOW_CLOSED) { GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, ("Output window was closed"), (NULL)); @@ -1321,11 +1460,11 @@ gint y, gint width, gint height) { GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (overlay); + GstD3D11CSLockGuard lk (&self->lock); GST_DEBUG_OBJECT (self, "render rect x: %d, y: %d, width: %d, height %d", x, y, width, height); - GST_D3D11_VIDEO_SINK_LOCK (self); if (self->window) { GstVideoRectangle rect; @@ -1344,19 +1483,16 @@ self->render_rect.h = height; self->pending_render_rect = TRUE; } - - GST_D3D11_VIDEO_SINK_UNLOCK (self); } static void gst_d3d11_video_sink_expose (GstVideoOverlay * overlay) { GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (overlay); + GstD3D11CSLockGuard lk (&self->lock); - GST_D3D11_VIDEO_SINK_LOCK (self); if (self->window && self->window->swap_chain) gst_d3d11_window_render (self->window, nullptr); - GST_D3D11_VIDEO_SINK_UNLOCK (self); } static void @@ -1370,10 +1506,9 @@ /* Navigation interface */ static void gst_d3d11_video_sink_navigation_send_event (GstNavigation * navigation, - GstStructure * structure) + GstEvent * event) { GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (navigation); - GstEvent *event = gst_event_new_navigation (structure); /* TODO: add support for translating native coordinate and video coordinate * when force-aspect-ratio is set */ @@ -1394,7 +1529,7 @@ static void gst_d3d11_video_sink_navigation_init (GstNavigationInterface * iface) { - iface->send_event = gst_d3d11_video_sink_navigation_send_event; + iface->send_event_simple = gst_d3d11_video_sink_navigation_send_event; } static gboolean @@ -1415,10 +1550,9 @@ return FALSE; } - GST_D3D11_VIDEO_SINK_LOCK (self); - if (!self->drawing || !self->current_buffer) { + GstD3D11CSLockGuard lk (&self->lock); + if (!self->drawing || !self->prepared_buffer) { GST_WARNING_OBJECT (self, "Nothing to draw"); - GST_D3D11_VIDEO_SINK_UNLOCK (self); return FALSE; } @@ -1428,9 +1562,8 @@ release_key); ret = gst_d3d11_window_render_on_shared_handle (self->window, - self->current_buffer, shared_handle, texture_misc_flags, acquire_key, + self->prepared_buffer, shared_handle, texture_misc_flags, acquire_key, release_key); - GST_D3D11_VIDEO_SINK_UNLOCK (self); return ret == GST_FLOW_OK; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11vp8dec.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11vp8dec.cpp
Changed
@@ -53,9 +53,6 @@ GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_vp8_dec_debug); #define GST_CAT_DEFAULT gst_d3d11_vp8_dec_debug -/* reference list 4 + 4 margin */ -#define NUM_OUTPUT_VIEW 8 - /* *INDENT-OFF* */ typedef struct _GstD3D11Vp8DecInner { @@ -111,7 +108,7 @@ /* GstVp8Decoder */ static GstFlowReturn gst_d3d11_vp8_dec_new_sequence (GstVp8Decoder * decoder, - const GstVp8FrameHdr * frame_hdr); + const GstVp8FrameHdr * frame_hdr, gint max_dpb_size); static GstFlowReturn gst_d3d11_vp8_dec_new_picture (GstVp8Decoder * decoder, GstVideoCodecFrame * frame, GstVp8Picture * picture); static GstFlowReturn gst_d3d11_vp8_dec_start_picture (GstVp8Decoder * decoder, @@ -313,7 +310,7 @@ static GstFlowReturn gst_d3d11_vp8_dec_new_sequence (GstVp8Decoder * decoder, - const GstVp8FrameHdr * frame_hdr) + const GstVp8FrameHdr * frame_hdr, gint max_dpb_size) { GstD3D11Vp8Dec *self = GST_D3D11_VP8_DEC (decoder); GstD3D11Vp8DecInner *inner = self->inner; @@ -330,14 +327,14 @@ inner->out_format, inner->width, inner->height); if (!gst_d3d11_decoder_configure (inner->d3d11_decoder, - decoder->input_state, &info, inner->width, inner->height, - NUM_OUTPUT_VIEW)) { + decoder->input_state, &info, 0, 0, inner->width, inner->height, + max_dpb_size)) { GST_ERROR_OBJECT (self, "Failed to create decoder"); return GST_FLOW_NOT_NEGOTIATED; } if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { - GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); + GST_WARNING_OBJECT (self, "Failed to negotiate with downstream"); return GST_FLOW_NOT_NEGOTIATED; } @@ -623,10 +620,8 @@ input_args.bitstream = &inner->bitstream_buffer0; input_args.bitstream_size = inner->bitstream_buffer.size (); - if (!gst_d3d11_decoder_decode_frame (inner->d3d11_decoder, view, &input_args)) - return GST_FLOW_ERROR; - - return GST_FLOW_OK; + return gst_d3d11_decoder_decode_frame (inner->d3d11_decoder, + view, &input_args); } static GstFlowReturn @@ -650,7 +645,8 @@ } if (!gst_d3d11_decoder_process_output (inner->d3d11_decoder, vdec, - inner->width, inner->height, view_buffer, &frame->output_buffer)) { + picture->discont_state, inner->width, inner->height, view_buffer, + &frame->output_buffer)) { GST_ERROR_OBJECT (self, "Failed to copy buffer"); goto error; } @@ -727,16 +723,10 @@ /* To cover both landscape and portrait, select max value */ resolution = MAX (max_width, max_height); - gst_caps_set_simple (sink_caps, - "width", GST_TYPE_INT_RANGE, 1, resolution, - "height", GST_TYPE_INT_RANGE, 1, resolution, NULL); - gst_caps_set_simple (src_caps, - "width", GST_TYPE_INT_RANGE, 1, resolution, - "height", GST_TYPE_INT_RANGE, 1, resolution, NULL); type_info.class_data = gst_d3d11_decoder_class_data_new (device, GST_DXVA_CODEC_VP8, - sink_caps, src_caps); + sink_caps, src_caps, resolution); type_name = g_strdup ("GstD3D11Vp8Dec"); feature_name = g_strdup ("d3d11vp8dec");
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11vp9dec.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11vp9dec.cpp
Changed
@@ -84,9 +84,6 @@ GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_vp9_dec_debug); #define GST_CAT_DEFAULT gst_d3d11_vp9_dec_debug -/* reference list 8 + 4 margin */ -#define NUM_OUTPUT_VIEW 12 - /* *INDENT-OFF* */ typedef struct _GstD3D11Vp9DecInner { @@ -143,7 +140,7 @@ /* GstVp9Decoder */ static GstFlowReturn gst_d3d11_vp9_dec_new_sequence (GstVp9Decoder * decoder, - const GstVp9FrameHeader * frame_hdr); + const GstVp9FrameHeader * frame_hdr, gint max_dpb_size); static GstFlowReturn gst_d3d11_vp9_dec_new_picture (GstVp9Decoder * decoder, GstVideoCodecFrame * frame, GstVp9Picture * picture); static GstVp9Picture *gst_d3d11_vp9_dec_duplicate_picture (GstVp9Decoder * @@ -361,7 +358,7 @@ static GstFlowReturn gst_d3d11_vp9_dec_new_sequence (GstVp9Decoder * decoder, - const GstVp9FrameHeader * frame_hdr) + const GstVp9FrameHeader * frame_hdr, gint max_dpb_size) { GstD3D11Vp9Dec *self = GST_D3D11_VP9_DEC (decoder); GstD3D11Vp9DecInner *inner = self->inner; @@ -384,14 +381,14 @@ out_format, frame_hdr->width, frame_hdr->height); if (!gst_d3d11_decoder_configure (inner->d3d11_decoder, - decoder->input_state, &info, (gint) frame_hdr->width, - (gint) frame_hdr->height, NUM_OUTPUT_VIEW)) { + decoder->input_state, &info, 0, 0, (gint) frame_hdr->width, + (gint) frame_hdr->height, max_dpb_size)) { GST_ERROR_OBJECT (self, "Failed to create decoder"); return GST_FLOW_NOT_NEGOTIATED; } if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { - GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); + GST_WARNING_OBJECT (self, "Failed to negotiate with downstream"); return GST_FLOW_NOT_NEGOTIATED; } @@ -761,10 +758,8 @@ input_args.bitstream = &inner->bitstream_buffer0; input_args.bitstream_size = inner->bitstream_buffer.size (); - if (!gst_d3d11_decoder_decode_frame (inner->d3d11_decoder, view, &input_args)) - return GST_FLOW_ERROR; - - return GST_FLOW_OK; + return gst_d3d11_decoder_decode_frame (inner->d3d11_decoder, + view, &input_args); } static GstFlowReturn @@ -786,8 +781,8 @@ } if (!gst_d3d11_decoder_process_output (inner->d3d11_decoder, vdec, - picture->frame_hdr.width, picture->frame_hdr.height, view_buffer, - &frame->output_buffer)) { + picture->discont_state, picture->frame_hdr.width, + picture->frame_hdr.height, view_buffer, &frame->output_buffer)) { GST_ERROR_OBJECT (self, "Failed to copy buffer"); goto error; } @@ -828,13 +823,13 @@ const GUID *profile0_guid = NULL; GstCaps *sink_caps = NULL; GstCaps *src_caps = NULL; + GstCaps *d3d11_caps = NULL; guint max_width = 0; guint max_height = 0; guint resolution; gboolean have_profile2 = FALSE; gboolean have_profile0 = FALSE; DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; - GValue vp9_profiles = G_VALUE_INIT; have_profile2 = gst_d3d11_decoder_get_supported_decoder_profile (device, GST_DXVA_CODEC_VP9, GST_VIDEO_FORMAT_P010_10LE, &profile2_guid); @@ -895,60 +890,39 @@ return; } - sink_caps = gst_caps_from_string ("video/x-vp9, alignment = (string) frame"); - src_caps = gst_caps_from_string ("video/x-raw(" - GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY "); video/x-raw"); - - g_value_init (&vp9_profiles, GST_TYPE_LIST); - - if (have_profile0) { - GValue vp9_profile_val = G_VALUE_INIT; - - g_value_init (&vp9_profile_val, G_TYPE_STRING); - g_value_set_string (&vp9_profile_val, "0"); - gst_value_list_append_and_take_value (&vp9_profiles, &vp9_profile_val); - } - - if (have_profile2) { - GValue format_list = G_VALUE_INIT; - GValue format_value = G_VALUE_INIT; - GValue vp9_profile_val = G_VALUE_INIT; - - g_value_init (&format_list, GST_TYPE_LIST); - - g_value_init (&format_value, G_TYPE_STRING); - g_value_set_string (&format_value, "NV12"); - gst_value_list_append_and_take_value (&format_list, &format_value); - - g_value_init (&format_value, G_TYPE_STRING); - g_value_set_string (&format_value, "P010_10LE"); - gst_value_list_append_and_take_value (&format_list, &format_value); - - gst_caps_set_value (src_caps, "format", &format_list); - g_value_unset (&format_list); - - g_value_init (&vp9_profile_val, G_TYPE_STRING); - g_value_set_string (&vp9_profile_val, "2"); - gst_value_list_append_and_take_value (&vp9_profiles, &vp9_profile_val); + if (have_profile0 && have_profile2) { + sink_caps = gst_caps_from_string ("video/x-vp9, " + "alignment = (string) frame, profile = (string) 0; " + "video/x-vp9, alignment = (string) frame, profile = (string) 2, " + "bit-depth-luma = (uint) 10, bit-depth-chroma = (uint) 10"); + src_caps = gst_caps_from_string ("video/x-raw, " + "format = (string) { NV12, P010_10LE }"); + } else if (have_profile0) { + sink_caps = gst_caps_from_string ("video/x-vp9, " + "alignment = (string) frame, profile = (string) 0"); + src_caps = gst_caps_from_string ("video/x-raw, " "format = (string) NV12"); + } else if (have_profile2) { + sink_caps = gst_caps_from_string ("video/x-vp9, " + "alignment = (string) frame, profile = (string) 2, " + "bit-depth-luma = (uint) 10, bit-depth-chroma = (uint) 10"); + src_caps = gst_caps_from_string ("video/x-raw, " + "format = (string) P010_10LE"); } else { - gst_caps_set_simple (src_caps, "format", G_TYPE_STRING, "NV12", NULL); + g_assert_not_reached (); + return; } - gst_caps_set_value (sink_caps, "profile", &vp9_profiles); - g_value_unset (&vp9_profiles); + d3d11_caps = gst_caps_copy (src_caps); + gst_caps_set_features_simple (d3d11_caps, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, NULL)); + src_caps = gst_caps_merge (d3d11_caps, src_caps); /* To cover both landscape and portrait, select max value */ resolution = MAX (max_width, max_height); - gst_caps_set_simple (sink_caps, - "width", GST_TYPE_INT_RANGE, 1, resolution, - "height", GST_TYPE_INT_RANGE, 1, resolution, NULL); - gst_caps_set_simple (src_caps, - "width", GST_TYPE_INT_RANGE, 1, resolution, - "height", GST_TYPE_INT_RANGE, 1, resolution, NULL); type_info.class_data = gst_d3d11_decoder_class_data_new (device, GST_DXVA_CODEC_VP9, - sink_caps, src_caps); + sink_caps, src_caps, resolution); type_name = g_strdup ("GstD3D11Vp9Dec"); feature_name = g_strdup ("d3d11vp9dec");
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11window.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11window.cpp
Changed
@@ -54,18 +54,20 @@ PROP_FULLSCREEN, PROP_WINDOW_HANDLE, PROP_RENDER_STATS, + PROP_EMIT_PRESENT, }; #define DEFAULT_ENABLE_NAVIGATION_EVENTS TRUE #define DEFAULT_FORCE_ASPECT_RATIO TRUE #define DEFAULT_FULLSCREEN_TOGGLE_MODE GST_D3D11_WINDOW_FULLSCREEN_TOGGLE_MODE_NONE #define DEFAULT_FULLSCREEN FALSE -#define DEFAULT_RENDER_STATS FALSE +#define DEFAULT_EMIT_PRESENT FALSE enum { SIGNAL_KEY_EVENT, SIGNAL_MOUSE_EVENT, + SIGNAL_PRESENT, SIGNAL_LAST }; @@ -74,9 +76,9 @@ GType gst_d3d11_window_fullscreen_toggle_mode_type (void) { - static gsize mode_type = 0; + static GType mode_type = 0; - if (g_once_init_enter (&mode_type)) { + GST_D3D11_CALL_ONCE_BEGIN { static const GFlagsValue mode_types = { {GST_D3D11_WINDOW_FULLSCREEN_TOGGLE_MODE_NONE, "GST_D3D11_WINDOW_FULLSCREEN_TOGGLE_MODE_NONE", "none"}, @@ -84,14 +86,14 @@ "GST_D3D11_WINDOW_FULLSCREEN_TOGGLE_MODE_ALT_ENTER", "alt-enter"}, {GST_D3D11_WINDOW_FULLSCREEN_TOGGLE_MODE_PROPERTY, "GST_D3D11_WINDOW_FULLSCREEN_TOGGLE_MODE_PROPERTY", "property"}, - {0, NULL, NULL}, + {0, nullptr, nullptr}, }; - GType tmp = g_flags_register_static ("GstD3D11WindowFullscreenToggleMode", + + mode_type = g_flags_register_static ("GstD3D11WindowFullscreenToggleMode", mode_types); - g_once_init_leave (&mode_type, tmp); - } + } GST_D3D11_CALL_ONCE_END; - return (GType) mode_type; + return mode_type; } #define gst_d3d11_window_parent_class parent_class @@ -103,13 +105,12 @@ GValue * value, GParamSpec * pspec); static void gst_d3d11_window_dispose (GObject * object); static GstFlowReturn gst_d3d111_window_present (GstD3D11Window * self, - GstBuffer * buffer, ID3D11VideoProcessorOutputView * pov, - ID3D11RenderTargetView * rtv); + GstBuffer * buffer, GstBuffer * render_target); static void gst_d3d11_window_on_resize_default (GstD3D11Window * window, guint width, guint height); static GstFlowReturn gst_d3d11_window_prepare_default (GstD3D11Window * window, guint display_width, guint display_height, GstCaps * caps, - gboolean * video_processor_available, GError ** error); + GstStructure * config, DXGI_FORMAT display_format, GError ** error); static void gst_d3d11_window_class_init (GstD3D11WindowClass * klass) @@ -164,6 +165,11 @@ (GParamFlags) (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (gobject_class, PROP_EMIT_PRESENT, + g_param_spec_boolean ("emit-present", "Emit Present", + "Emit present signal", DEFAULT_EMIT_PRESENT, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + d3d11_window_signalsSIGNAL_KEY_EVENT = g_signal_new ("key-event", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, @@ -173,6 +179,11 @@ g_signal_new ("mouse-event", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_INT, G_TYPE_DOUBLE, G_TYPE_DOUBLE); + + d3d11_window_signalsSIGNAL_PRESENT = + g_signal_new ("present", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, 0, nullptr, nullptr, nullptr, + G_TYPE_NONE, 2, GST_TYPE_D3D11_DEVICE, G_TYPE_POINTER); } static void @@ -182,7 +193,7 @@ self->enable_navigation_events = DEFAULT_ENABLE_NAVIGATION_EVENTS; self->fullscreen_toggle_mode = GST_D3D11_WINDOW_FULLSCREEN_TOGGLE_MODE_NONE; self->fullscreen = DEFAULT_FULLSCREEN; - self->render_stats = DEFAULT_RENDER_STATS; + self->emit_present = DEFAULT_EMIT_PRESENT; } static void @@ -220,6 +231,9 @@ case PROP_WINDOW_HANDLE: self->external_handle = (guintptr) g_value_get_pointer (value); break; + case PROP_EMIT_PRESENT: + self->emit_present = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -245,6 +259,9 @@ case PROP_FULLSCREEN: g_value_set_boolean (value, self->fullscreen); break; + case PROP_EMIT_PRESENT: + g_value_set_boolean (value, self->emit_present); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -252,26 +269,15 @@ } static void -gst_d3d11_window_release_resources (GstD3D11Device * device, - GstD3D11Window * window) -{ - GST_D3D11_CLEAR_COM (window->rtv); - GST_D3D11_CLEAR_COM (window->pov); - GST_D3D11_CLEAR_COM (window->swap_chain); -} - -static void gst_d3d11_window_dispose (GObject * object) { GstD3D11Window *self = GST_D3D11_WINDOW (object); - if (self->device) { - gst_d3d11_window_release_resources (self->device, self); - } + gst_clear_buffer (&self->backbuffer); + GST_D3D11_CLEAR_COM (self->swap_chain); - g_clear_pointer (&self->processor, gst_d3d11_video_processor_free); - g_clear_pointer (&self->converter, gst_d3d11_converter_free); - g_clear_pointer (&self->compositor, gst_d3d11_overlay_compositor_free); + gst_clear_object (&self->compositor); + gst_clear_object (&self->converter); gst_clear_buffer (&self->cached_buffer); gst_clear_object (&self->device); @@ -280,109 +286,121 @@ } static void -gst_d3d11_window_on_resize_default (GstD3D11Window * window, guint width, +gst_d3d11_window_on_resize_default (GstD3D11Window * self, guint width, guint height) { + GstD3D11Device *device = self->device; HRESULT hr; - ID3D11Device *device_handle; D3D11_TEXTURE2D_DESC desc; DXGI_SWAP_CHAIN_DESC swap_desc; - ID3D11Texture2D *backbuffer = NULL; + ComPtr < ID3D11Texture2D > backbuffer; GstVideoRectangle src_rect, dst_rect, rst_rect; IDXGISwapChain *swap_chain; + GstMemory *mem; + GstD3D11Memory *dmem; + ID3D11RenderTargetView *rtv; ID3D11DeviceContext *context; + gsize size; + GstD3D11DeviceLockGuard lk (device); const FLOAT clear_color = { 0.0, 0.0, 0.0, 1.0 }; - gst_d3d11_device_lock (window->device); - if (!window->swap_chain) - goto done; - - device_handle = gst_d3d11_device_get_device_handle (window->device); - swap_chain = window->swap_chain; - - GST_D3D11_CLEAR_COM (window->rtv); - GST_D3D11_CLEAR_COM (window->pov); + gst_clear_buffer (&self->backbuffer); + if (!self->swap_chain) + return; + swap_chain = self->swap_chain; swap_chain->GetDesc (&swap_desc); - hr = swap_chain->ResizeBuffers (0, width, height, window->dxgi_format, + hr = swap_chain->ResizeBuffers (0, width, height, self->dxgi_format, swap_desc.Flags); - if (!gst_d3d11_result (hr, window->device)) { - GST_ERROR_OBJECT (window, "Couldn't resize buffers, hr: 0x%x", (guint) hr); - goto done; + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Couldn't resize buffers, hr: 0x%x", (guint) hr); + return; } hr = swap_chain->GetBuffer (0, IID_PPV_ARGS (&backbuffer)); - if (!gst_d3d11_result (hr, window->device)) { - GST_ERROR_OBJECT (window, + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Cannot get backbuffer from swapchain, hr: 0x%x", (guint) hr); - goto done; + return; } backbuffer->GetDesc (&desc); - window->surface_width = desc.Width; - window->surface_height = desc.Height; + size = desc.Width * desc.Height; + /* flip mode swapchain supports only 4 formats, rgba/bgra/rgb10a2/rgba64. + * The size passed in alloc_wrapped() is not important here, since we never + * try mapping this for CPU access */ + if (desc.Format == DXGI_FORMAT_R16G16B16A16_FLOAT) { + size *= 8; + } else { + size *= 4; + } - { - dst_rect.x = 0; - dst_rect.y = 0; - dst_rect.w = window->surface_width; - dst_rect.h = window->surface_height; - - if (window->force_aspect_ratio) { - src_rect.x = 0; - src_rect.y = 0; - src_rect.w = GST_VIDEO_INFO_WIDTH (&window->render_info); - src_rect.h = GST_VIDEO_INFO_HEIGHT (&window->render_info); - - gst_video_sink_center_rect (src_rect, dst_rect, &rst_rect, TRUE); - } else { - rst_rect = dst_rect; - } + mem = gst_d3d11_allocator_alloc_wrapped (nullptr, + self->device, backbuffer.Get (), size, nullptr, nullptr); + if (!mem) { + GST_ERROR_OBJECT (self, "Couldn't allocate wrapped memory"); + return; } - window->render_rect.left = rst_rect.x; - window->render_rect.top = rst_rect.y; - window->render_rect.right = rst_rect.x + rst_rect.w; - window->render_rect.bottom = rst_rect.y + rst_rect.h; + dmem = GST_D3D11_MEMORY_CAST (mem); + rtv = gst_d3d11_memory_get_render_target_view (dmem, 0); + if (!rtv) { + GST_ERROR_OBJECT (self, "RTV is unavailable"); + gst_memory_unref (mem); + return; + } - GST_LOG_OBJECT (window, - "New client area %dx%d, render rect x: %d, y: %d, %dx%d", - desc.Width, desc.Height, rst_rect.x, rst_rect.y, rst_rect.w, rst_rect.h); + context = gst_d3d11_device_get_device_context_handle (self->device); + context->ClearRenderTargetView (rtv, clear_color); - hr = device_handle->CreateRenderTargetView (backbuffer, NULL, &window->rtv); - if (!gst_d3d11_result (hr, window->device)) { - GST_ERROR_OBJECT (window, "Cannot create render target view, hr: 0x%x", - (guint) hr); + self->backbuffer = gst_buffer_new (); + gst_buffer_append_memory (self->backbuffer, mem); - goto done; - } + self->surface_width = desc.Width; + self->surface_height = desc.Height; - context = gst_d3d11_device_get_device_context_handle (window->device); - context->ClearRenderTargetView (window->rtv, clear_color); + dst_rect.x = 0; + dst_rect.y = 0; + dst_rect.w = self->surface_width; + dst_rect.h = self->surface_height; - if (window->processor) { - D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC pov_desc; + if (self->force_aspect_ratio) { + src_rect.x = 0; + src_rect.y = 0; - pov_desc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D; - pov_desc.Texture2D.MipSlice = 0; + switch (self->method) { + case GST_VIDEO_ORIENTATION_90R: + case GST_VIDEO_ORIENTATION_90L: + case GST_VIDEO_ORIENTATION_UL_LR: + case GST_VIDEO_ORIENTATION_UR_LL: + src_rect.w = GST_VIDEO_INFO_HEIGHT (&self->render_info); + src_rect.h = GST_VIDEO_INFO_WIDTH (&self->render_info); + break; + default: + src_rect.w = GST_VIDEO_INFO_WIDTH (&self->render_info); + src_rect.h = GST_VIDEO_INFO_HEIGHT (&self->render_info); + break; + } - if (!gst_d3d11_video_processor_create_output_view (window->processor, - &pov_desc, backbuffer, &window->pov)) - goto done; + gst_video_sink_center_rect (src_rect, dst_rect, &rst_rect, TRUE); + } else { + rst_rect = dst_rect; } - window->first_present = TRUE; + self->render_rect.left = rst_rect.x; + self->render_rect.top = rst_rect.y; + self->render_rect.right = rst_rect.x + rst_rect.w; + self->render_rect.bottom = rst_rect.y + rst_rect.h; - /* redraw the last scene if cached buffer exits */ - if (window->cached_buffer) { - gst_d3d111_window_present (window, window->cached_buffer, - window->pov, window->rtv); - } + GST_LOG_OBJECT (self, + "New client area %dx%d, render rect x: %d, y: %d, %dx%d", + desc.Width, desc.Height, rst_rect.x, rst_rect.y, rst_rect.w, rst_rect.h); -done: - GST_D3D11_CLEAR_COM (backbuffer); + self->first_present = TRUE; - gst_d3d11_device_unlock (window->device); + /* redraw the last scene if cached buffer exits */ + if (self->cached_buffer) + gst_d3d111_window_present (self, self->cached_buffer, self->backbuffer); } void @@ -401,11 +419,93 @@ gst_d3d11_window_on_mouse_event (GstD3D11Window * window, const gchar * event, gint button, gdouble x, gdouble y) { + RECT render_rect; + GstVideoOrientationMethod method; + LONG xpos, ypos; + gdouble display_w, display_h, src_w, src_h; + gint in_w, in_h; + g_return_if_fail (GST_IS_D3D11_WINDOW (window)); if (!window->enable_navigation_events) return; + gst_d3d11_device_lock (window->device); + method = window->method; + render_rect = window->render_rect; + in_w = window->info.width; + in_h = window->info.height; + gst_d3d11_device_unlock (window->device); + + display_w = render_rect.right - render_rect.left; + display_h = render_rect.bottom - render_rect.top; + xpos = (LONG) x; + ypos = (LONG) y; + + /* if backbuffer surface size is unknown or mouse point located at + * outside of render area, ignore it */ + if (display_w <= 0 || display_h <= 0 || in_w <= 0 || in_h <= 0 || + xpos < render_rect.left || xpos >= render_rect.right || + ypos < render_rect.top || ypos >= render_rect.bottom) { + return; + } + + switch (method) { + case GST_VIDEO_ORIENTATION_90R: + case GST_VIDEO_ORIENTATION_90L: + case GST_VIDEO_ORIENTATION_UL_LR: + case GST_VIDEO_ORIENTATION_UR_LL: + src_w = in_h; + src_h = in_w; + break; + default: + src_w = in_w; + src_h = in_h; + break; + } + + xpos = ((xpos - render_rect.left) / display_w) * src_w; + ypos = ((ypos - render_rect.top) / display_h) * src_h; + + xpos = CLAMP (xpos, 0, (LONG) (src_w - 1)); + ypos = CLAMP (ypos, 0, (LONG) (src_h - 1)); + + /* Reverse rotate/flip if needed */ + switch (method) { + case GST_VIDEO_ORIENTATION_90R: + x = ypos; + y = src_w - xpos; + break; + case GST_VIDEO_ORIENTATION_90L: + x = src_h - ypos; + y = xpos; + break; + case GST_VIDEO_ORIENTATION_UR_LL: + x = src_h - ypos; + y = src_w - xpos; + break; + case GST_VIDEO_ORIENTATION_UL_LR: + x = ypos; + y = xpos; + break; + case GST_VIDEO_ORIENTATION_180: + x = src_w - xpos; + y = src_h - ypos; + break; + case GST_VIDEO_ORIENTATION_HORIZ: + x = src_w - xpos; + y = ypos; + break; + case GST_VIDEO_ORIENTATION_VERT: + x = xpos; + y = src_h - ypos; + break; + default: + x = xpos; + y = ypos; + break; + } + g_signal_emit (window, d3d11_window_signalsSIGNAL_MOUSE_EVENT, 0, event, button, x, y); } @@ -419,8 +519,8 @@ GstFlowReturn gst_d3d11_window_prepare (GstD3D11Window * window, guint display_width, - guint display_height, GstCaps * caps, gboolean * video_processor_available, - GError ** error) + guint display_height, GstCaps * caps, GstStructure * config, + DXGI_FORMAT display_format, GError ** error) { GstD3D11WindowClass *klass; @@ -432,55 +532,56 @@ GST_DEBUG_OBJECT (window, "Prepare window, display resolution %dx%d, caps %" GST_PTR_FORMAT, display_width, display_height, caps); - return klass->prepare (window, display_width, display_height, caps, - video_processor_available, error); + return klass->prepare (window, display_width, display_height, caps, config, + display_format, error); } static GstFlowReturn gst_d3d11_window_prepare_default (GstD3D11Window * window, guint display_width, - guint display_height, GstCaps * caps, gboolean * video_processor_available, - GError ** error) + guint display_height, GstCaps * caps, GstStructure * config, + DXGI_FORMAT display_format, GError ** error) { + GstD3D11Device *device = window->device; GstD3D11WindowClass *klass; guint swapchain_flags = 0; ID3D11Device *device_handle; - guint i; guint num_supported_format = 0; HRESULT hr; UINT display_flags = D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_DISPLAY; UINT supported_flags = 0; GstD3D11WindowDisplayFormat formats = { - {DXGI_FORMAT_R8G8B8A8_UNORM, GST_VIDEO_FORMAT_RGBA, FALSE}, {DXGI_FORMAT_B8G8R8A8_UNORM, GST_VIDEO_FORMAT_BGRA, FALSE}, + {DXGI_FORMAT_R8G8B8A8_UNORM, GST_VIDEO_FORMAT_RGBA, FALSE}, {DXGI_FORMAT_R10G10B10A2_UNORM, GST_VIDEO_FORMAT_RGB10A2_LE, FALSE}, }; - const GstD3D11WindowDisplayFormat *chosen_format = NULL; - const GstDxgiColorSpace *chosen_colorspace = NULL; -#if (GST_D3D11_DXGI_HEADER_VERSION >= 4) - gboolean have_hdr10 = FALSE; - DXGI_COLOR_SPACE_TYPE native_colorspace_type = + const GstD3D11WindowDisplayFormat *chosen_format = nullptr; + DXGI_COLOR_SPACE_TYPE swapchain_colorspace = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; -#endif -#if (GST_D3D11_DXGI_HEADER_VERSION >= 5) - DXGI_HDR_METADATA_HDR10 hdr10_metadata = { 0, }; -#endif + gboolean hdr10_aware = FALSE; + gboolean have_hdr10_meta = FALSE; + ComPtr < IDXGIFactory5 > factory5; + IDXGIFactory1 *factory_handle; + BOOL allow_tearing = FALSE; + GstVideoMasteringDisplayInfo mdcv; + GstVideoContentLightLevel cll; + ComPtr < IDXGISwapChain3 > swapchain3; + GstStructure *s; + const gchar *cll_str = nullptr; + const gchar *mdcv_str = nullptr; /* Step 1: Clear old resources and objects */ gst_clear_buffer (&window->cached_buffer); - g_clear_pointer (&window->processor, gst_d3d11_video_processor_free); - g_clear_pointer (&window->converter, gst_d3d11_converter_free); - g_clear_pointer (&window->compositor, gst_d3d11_overlay_compositor_free); - - window->processor_in_use = FALSE; + gst_clear_object (&window->compositor); + gst_clear_object (&window->converter); /* Step 2: Decide display color format * If upstream format is 10bits, try DXGI_FORMAT_R10G10B10A2_UNORM first * Otherwise, use DXGI_FORMAT_B8G8R8A8_UNORM or DXGI_FORMAT_B8G8R8A8_UNORM */ gst_video_info_from_caps (&window->info, caps); - device_handle = gst_d3d11_device_get_device_handle (window->device); - for (i = 0; i < G_N_ELEMENTS (formats); i++) { + device_handle = gst_d3d11_device_get_device_handle (device); + for (guint i = 0; i < G_N_ELEMENTS (formats); i++) { hr = device_handle->CheckFormatSupport (formatsi.dxgi_format, &supported_flags); if (SUCCEEDED (hr) && (supported_flags & display_flags) == display_flags) { @@ -496,21 +597,46 @@ GST_ERROR_OBJECT (window, "Cannot determine render format"); g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED, "Cannot determine render format"); + if (config) + gst_structure_free (config); + return GST_FLOW_ERROR; } - for (i = 0; i < GST_VIDEO_INFO_N_COMPONENTS (&window->info); i++) { - if (GST_VIDEO_INFO_COMP_DEPTH (&window->info, i) > 8) { - if (formats2.supported) { - chosen_format = &formats2; + if (display_format != DXGI_FORMAT_UNKNOWN) { + for (guint i = 0; i < G_N_ELEMENTS (formats); i++) { + if (display_format == formatsi.dxgi_format && formatsi.supported) { + GST_DEBUG_OBJECT (window, "Requested format %s is supported", + gst_d3d11_dxgi_format_to_string (display_format)); + chosen_format = &formatsi; + break; + } + } + + if (!chosen_format) { + GST_ERROR_OBJECT (window, "Requested DXGI FORMAT %d is not supported", + display_format); + g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED, + "Cannot determine render format"); + if (config) + gst_structure_free (config); + + return GST_FLOW_ERROR; + } + } else { + for (guint i = 0; i < GST_VIDEO_INFO_N_COMPONENTS (&window->info); i++) { + if (GST_VIDEO_INFO_COMP_DEPTH (&window->info, i) > 8) { + if (formats2.supported) { + chosen_format = &formats2; + } + break; } - break; } } if (!chosen_format) { /* prefer native format over conversion */ - for (i = 0; i < 2; i++) { + for (guint i = 0; i < 2; i++) { if (formatsi.supported && formatsi.gst_format == GST_VIDEO_INFO_FORMAT (&window->info)) { chosen_format = &formatsi; @@ -520,7 +646,7 @@ /* choose any color space then */ if (!chosen_format) { - for (i = 0; i < G_N_ELEMENTS (formats); i++) { + for (guint i = 0; i < G_N_ELEMENTS (formats); i++) { if (formatsi.supported) { chosen_format = &formatsi; break; @@ -529,7 +655,7 @@ } } - g_assert (chosen_format != NULL); + g_assert (chosen_format != nullptr); GST_DEBUG_OBJECT (window, "chosen render format %s (DXGI_FORMAT %d)", gst_video_format_to_string (chosen_format->gst_format), @@ -539,30 +665,22 @@ * (or reuse old swapchain if the format is not changed) */ window->allow_tearing = FALSE; -#if (GST_D3D11_DXGI_HEADER_VERSION >= 5) - { - ComPtr < IDXGIFactory5 > factory5; - IDXGIFactory1 *factory_handle; - BOOL allow_tearing = FALSE; - - factory_handle = gst_d3d11_device_get_dxgi_factory_handle (window->device); - hr = factory_handle->QueryInterface (IID_PPV_ARGS (&factory5)); - if (SUCCEEDED (hr)) { - hr = factory5->CheckFeatureSupport (DXGI_FEATURE_PRESENT_ALLOW_TEARING, - (void *) &allow_tearing, sizeof (allow_tearing)); - } - - if (SUCCEEDED (hr) && allow_tearing) - window->allow_tearing = allow_tearing; + factory_handle = gst_d3d11_device_get_dxgi_factory_handle (device); + hr = factory_handle->QueryInterface (IID_PPV_ARGS (&factory5)); + if (SUCCEEDED (hr)) { + hr = factory5->CheckFeatureSupport (DXGI_FEATURE_PRESENT_ALLOW_TEARING, + (void *) &allow_tearing, sizeof (allow_tearing)); } -#endif + + if (SUCCEEDED (hr) && allow_tearing) + window->allow_tearing = allow_tearing; if (window->allow_tearing) { - GST_DEBUG_OBJECT (window, "device support tearning"); + GST_DEBUG_OBJECT (window, "device supports tearing"); swapchain_flags |= DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING; } - gst_d3d11_device_lock (window->device); + GstD3D11DeviceLockGuard lk (device); window->dxgi_format = chosen_format->dxgi_format; klass = GST_D3D11_WINDOW_GET_CLASS (window); @@ -573,7 +691,10 @@ GST_ERROR_OBJECT (window, "Cannot create swapchain"); g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED, "Cannot create swapchain"); - goto error; + if (config) + gst_structure_free (config); + + return GST_FLOW_ERROR; } /* this rect struct will be used to calculate render area */ @@ -587,37 +708,8 @@ window->input_rect.right = GST_VIDEO_INFO_WIDTH (&window->info); window->input_rect.bottom = GST_VIDEO_INFO_HEIGHT (&window->info); - /* Step 4: Decide render color space and set it on converter/processor */ -#if (GST_D3D11_DXGI_HEADER_VERSION >= 5) - { - GstVideoMasteringDisplayInfo minfo; - GstVideoContentLightLevel cll; - - if (gst_video_mastering_display_info_from_caps (&minfo, caps) && - gst_video_content_light_level_from_caps (&cll, caps)) { - ComPtr < IDXGISwapChain4 > swapchain4; - HRESULT hr; - - hr = window->swap_chain->QueryInterface (IID_PPV_ARGS (&swapchain4)); - if (gst_d3d11_result (hr, window->device)) { - GST_DEBUG_OBJECT (window, "Have HDR metadata, set to DXGI swapchain"); - - gst_d3d11_hdr_meta_data_to_dxgi (&minfo, &cll, &hdr10_metadata); - - hr = swapchain4->SetHDRMetaData (DXGI_HDR_METADATA_TYPE_HDR10, - sizeof (DXGI_HDR_METADATA_HDR10), &hdr10_metadata); - if (!gst_d3d11_result (hr, window->device)) { - GST_WARNING_OBJECT (window, "Couldn't set HDR metadata, hr 0x%x", - (guint) hr); - } else { - have_hdr10 = TRUE; - } - } - } - } -#endif + window->prev_input_rect = window->input_rect; - /* Step 5: Choose display color space */ gst_video_info_set_format (&window->render_info, chosen_format->gst_format, display_width, display_height); @@ -630,120 +722,76 @@ * target display color space type */ window->render_info.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; -#if (GST_D3D11_DXGI_HEADER_VERSION >= 4) - { - ComPtr < IDXGISwapChain3 > swapchain3; - HRESULT hr; - - hr = window->swap_chain->QueryInterface (IID_PPV_ARGS (&swapchain3)); - - if (gst_d3d11_result (hr, window->device)) { - chosen_colorspace = - gst_d3d11_find_swap_chain_color_space (&window->render_info, - swapchain3.Get ()); - if (chosen_colorspace) { - native_colorspace_type = - (DXGI_COLOR_SPACE_TYPE) chosen_colorspace->dxgi_color_space_type; - hr = swapchain3->SetColorSpace1 (native_colorspace_type); - if (!gst_d3d11_result (hr, window->device)) { - GST_WARNING_OBJECT (window, "Failed to set colorspace %d, hr: 0x%x", - native_colorspace_type, (guint) hr); - chosen_colorspace = NULL; - native_colorspace_type = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; - } else { - GST_DEBUG_OBJECT (window, - "Set colorspace %d", native_colorspace_type); - - /* update with selected display color space */ - window->render_info.colorimetry.primaries = - chosen_colorspace->primaries; - window->render_info.colorimetry.transfer = - chosen_colorspace->transfer; - window->render_info.colorimetry.range = chosen_colorspace->range; - window->render_info.colorimetry.matrix = chosen_colorspace->matrix; - } - } - } - } -#endif - - /* otherwise, use most common DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 - * color space */ - if (!chosen_colorspace) { - GST_DEBUG_OBJECT (window, "No selected render color space, use BT709"); - window->render_info.colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709; - window->render_info.colorimetry.transfer = GST_VIDEO_TRANSFER_BT709; - window->render_info.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + s = gst_caps_get_structure (caps, 0); + mdcv_str = gst_structure_get_string (s, "mastering-display-info"); + cll_str = gst_structure_get_string (s, "content-light-level"); + if (mdcv_str && cll_str && + gst_video_mastering_display_info_from_string (&mdcv, mdcv_str) && + gst_video_content_light_level_from_string (&cll, cll_str)) { + have_hdr10_meta = TRUE; } -#if (GST_D3D11_DXGI_HEADER_VERSION >= 4) - if (chosen_colorspace) { - const GstDxgiColorSpace *in_color_space = - gst_d3d11_video_info_to_dxgi_color_space (&window->info); - const GstD3D11Format *in_format = - gst_d3d11_device_format_from_gst (window->device, - GST_VIDEO_INFO_FORMAT (&window->info)); - gboolean hardware = FALSE; - GstD3D11VideoProcessor *processor = NULL; - - if (in_color_space && in_format && - in_format->dxgi_format != DXGI_FORMAT_UNKNOWN) { - g_object_get (window->device, "hardware", &hardware, NULL); - } - - if (hardware) { - processor = - gst_d3d11_video_processor_new (window->device, - GST_VIDEO_INFO_WIDTH (&window->info), - GST_VIDEO_INFO_HEIGHT (&window->info), display_width, display_height); - } - if (processor) { - DXGI_FORMAT in_dxgi_format = in_format->dxgi_format; - DXGI_FORMAT out_dxgi_format = chosen_format->dxgi_format; - DXGI_COLOR_SPACE_TYPE in_dxgi_color_space = - (DXGI_COLOR_SPACE_TYPE) in_color_space->dxgi_color_space_type; - DXGI_COLOR_SPACE_TYPE out_dxgi_color_space = native_colorspace_type; - - if (!gst_d3d11_video_processor_check_format_conversion (processor, - in_dxgi_format, in_dxgi_color_space, out_dxgi_format, - out_dxgi_color_space)) { - GST_DEBUG_OBJECT (window, "Conversion is not supported by device"); - gst_d3d11_video_processor_free (processor); - processor = NULL; + hr = window->swap_chain->QueryInterface (IID_PPV_ARGS (&swapchain3)); + if (gst_d3d11_result (hr, device)) { + if (gst_d3d11_find_swap_chain_color_space (&window->render_info, + swapchain3.Get (), &swapchain_colorspace)) { + hr = swapchain3->SetColorSpace1 (swapchain_colorspace); + if (!gst_d3d11_result (hr, window->device)) { + GST_WARNING_OBJECT (window, "Failed to set colorspace %d, hr: 0x%x", + swapchain_colorspace, (guint) hr); + swapchain_colorspace = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; } else { - GST_DEBUG_OBJECT (window, "video processor supports conversion"); - gst_d3d11_video_processor_set_input_dxgi_color_space (processor, - in_dxgi_color_space); - gst_d3d11_video_processor_set_output_dxgi_color_space (processor, - out_dxgi_color_space); - -#if (GST_D3D11_DXGI_HEADER_VERSION >= 5) - if (have_hdr10) { - GST_DEBUG_OBJECT (window, "Set HDR metadata on video processor"); - gst_d3d11_video_processor_set_input_hdr10_metadata (processor, - &hdr10_metadata); - gst_d3d11_video_processor_set_output_hdr10_metadata (processor, - &hdr10_metadata); + ComPtr < IDXGISwapChain4 > swapchain4; + + /* DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 = 12, undefined in old + * mingw header */ + if (swapchain_colorspace == 12 && have_hdr10_meta) { + hr = swapchain3.As (&swapchain4); + if (gst_d3d11_result (hr, device)) { + DXGI_HDR_METADATA_HDR10 hdr10_metadata = { 0, }; + + GST_DEBUG_OBJECT (window, + "Have HDR metadata, set to DXGI swapchain"); + + gst_d3d11_hdr_meta_data_to_dxgi (&mdcv, &cll, &hdr10_metadata); + + hr = swapchain4->SetHDRMetaData (DXGI_HDR_METADATA_TYPE_HDR10, + sizeof (DXGI_HDR_METADATA_HDR10), &hdr10_metadata); + if (!gst_d3d11_result (hr, device)) { + GST_WARNING_OBJECT (window, + "Couldn't set HDR metadata, hr 0x%x", (guint) hr); + } else { + hdr10_aware = TRUE; + } + } } -#endif } - - window->processor = processor; } } -#endif - *video_processor_available = !!window->processor; - /* configure shader even if video processor is available for fallback */ - window->converter = - gst_d3d11_converter_new (window->device, &window->info, - &window->render_info, nullptr); + GST_DEBUG_OBJECT (window, "Set colorspace %d", swapchain_colorspace); + + /* update with selected display color space */ + gst_video_info_apply_dxgi_color_space (swapchain_colorspace, + &window->render_info); + + window->converter = gst_d3d11_converter_new (device, + &window->info, &window->render_info, config); if (!window->converter) { GST_ERROR_OBJECT (window, "Cannot create converter"); g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED, "Cannot create converter"); - goto error; + return GST_FLOW_ERROR; + } + + if (have_hdr10_meta) { + g_object_set (window->converter, "src-mastering-display-info", mdcv_str, + "src-content-light-level", cll_str, nullptr); + if (hdr10_aware) { + g_object_set (window->converter, "dest-mastering-display-info", mdcv_str, + "dest-content-light-level", cll_str, nullptr); + } } window->compositor = @@ -752,38 +800,18 @@ GST_ERROR_OBJECT (window, "Cannot create overlay compositor"); g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED, "Cannot create overlay compositor"); - goto error; + return GST_FLOW_ERROR; } - gst_d3d11_device_unlock (window->device); /* call resize to allocated resources */ klass->on_resize (window, display_width, display_height); - if (window->requested_fullscreen != window->fullscreen) { + if (window->requested_fullscreen != window->fullscreen) klass->change_fullscreen_mode (window); - } GST_DEBUG_OBJECT (window, "New swap chain 0x%p created", window->swap_chain); return GST_FLOW_OK; - -error: - gst_d3d11_device_unlock (window->device); - - return GST_FLOW_ERROR; -} - -void -gst_d3d11_window_show (GstD3D11Window * window) -{ - GstD3D11WindowClass *klass; - - g_return_if_fail (GST_IS_D3D11_WINDOW (window)); - - klass = GST_D3D11_WINDOW_GET_CLASS (window); - - if (klass->show) - klass->show (window); } void @@ -813,223 +841,127 @@ klass->set_title (window, title); } -static gboolean -gst_d3d11_window_buffer_ensure_processor_input (GstD3D11Window * self, - GstBuffer * buffer, ID3D11VideoProcessorInputView ** in_view) -{ - GstD3D11Memory *mem; - ID3D11VideoProcessorInputView *piv; - - if (!self->processor) - return FALSE; - - if (gst_buffer_n_memory (buffer) != 1) - return FALSE; - - mem = (GstD3D11Memory *) gst_buffer_peek_memory (buffer, 0); - piv = gst_d3d11_video_processor_get_input_view (self->processor, mem); - if (!piv) { - GST_LOG_OBJECT (self, "Failed to get processor input view"); - return FALSE; - } - - *in_view = piv; - - return TRUE; -} - -static gboolean -gst_d3d11_window_do_processor (GstD3D11Window * self, - ID3D11VideoProcessorInputView * piv, ID3D11VideoProcessorOutputView * pov, - RECT * input_rect) -{ - gboolean ret; - - ret = gst_d3d11_video_processor_render_unlocked (self->processor, - input_rect, piv, &self->render_rect, pov); - if (!ret) { - GST_ERROR_OBJECT (self, "Couldn't render to backbuffer using processor"); - } else { - GST_TRACE_OBJECT (self, "Rendered using processor"); - self->processor_in_use = TRUE; - } - - return ret; -} - -static gboolean -gst_d3d11_window_do_convert (GstD3D11Window * self, - ID3D11ShaderResourceView * srvGST_VIDEO_MAX_PLANES, - ID3D11RenderTargetView * rtv, RECT * input_rect) -{ - if (!gst_d3d11_converter_update_src_rect (self->converter, input_rect)) { - GST_ERROR_OBJECT (self, "Failed to update src rect"); - return FALSE; - } - - if (!gst_d3d11_converter_convert_unlocked (self->converter, - srv, &rtv, NULL, NULL)) { - GST_ERROR_OBJECT (self, "Couldn't render to backbuffer using converter"); - return FALSE; - } else { - GST_TRACE_OBJECT (self, "Rendered using converter"); - } - - return TRUE; -} - static GstFlowReturn gst_d3d111_window_present (GstD3D11Window * self, GstBuffer * buffer, - ID3D11VideoProcessorOutputView * pov, ID3D11RenderTargetView * rtv) + GstBuffer * backbuffer) { GstD3D11WindowClass *klass = GST_D3D11_WINDOW_GET_CLASS (self); GstFlowReturn ret = GST_FLOW_OK; guint present_flags = 0; + GstVideoCropMeta *crop_meta; + RECT input_rect = self->input_rect; + RECT *prev_rect = &self->prev_input_rect; + ID3D11RenderTargetView *rtv; + GstMemory *mem; + GstD3D11Memory *dmem; if (!buffer) return GST_FLOW_OK; - if (!rtv) { - GST_ERROR_OBJECT (self, "RTV is unavailable"); + if (!backbuffer) { + GST_ERROR_OBJECT (self, "Empty render target"); return GST_FLOW_ERROR; } - { - GstMapInfo infosGST_VIDEO_MAX_PLANES; - ID3D11ShaderResourceView *srvGST_VIDEO_MAX_PLANES; - ID3D11VideoProcessorInputView *piv = NULL; - ID3D11Device *device_handle = - gst_d3d11_device_get_device_handle (self->device); - gboolean can_convert = FALSE; - gboolean can_process = FALSE; - gboolean convert_ret = FALSE; - RECT input_rect = self->input_rect; - GstVideoCropMeta *crop_meta; - - /* Map memory in any case so that we can upload pending stage texture */ - if (!gst_d3d11_buffer_map (buffer, device_handle, infos, GST_MAP_READ)) { - GST_ERROR_OBJECT (self, "Couldn't map buffer"); - return GST_FLOW_ERROR; - } - - can_convert = gst_d3d11_buffer_get_shader_resource_view (buffer, srv); - if (pov) { - can_process = gst_d3d11_window_buffer_ensure_processor_input (self, - buffer, &piv); - } + mem = gst_buffer_peek_memory (backbuffer, 0); + if (!gst_is_d3d11_memory (mem)) { + GST_ERROR_OBJECT (self, "Invalid back buffer"); + return GST_FLOW_ERROR; + } - if (!can_convert && !can_process) { - GST_ERROR_OBJECT (self, "Input texture cannot be used for converter"); - return GST_FLOW_ERROR; - } + dmem = GST_D3D11_MEMORY_CAST (mem); + rtv = gst_d3d11_memory_get_render_target_view (dmem, 0); + if (!rtv) { + GST_ERROR_OBJECT (self, "RTV is unavailable"); + return GST_FLOW_ERROR; + } - crop_meta = gst_buffer_get_video_crop_meta (buffer); - /* Do minimal validate */ - if (crop_meta) { - ID3D11Texture2D *texture = (ID3D11Texture2D *) infos0.data; - D3D11_TEXTURE2D_DESC desc = { 0, }; + /* We use flip mode swapchain and will not redraw borders. + * So backbuffer should be cleared manually in order to remove artifact of + * previous client's rendering on present signal */ + if (self->emit_present) { + const FLOAT clear_color = { 0.0f, 0.0f, 0.0f, 1.0f }; + ID3D11DeviceContext *context = + gst_d3d11_device_get_device_context_handle (self->device); - texture->GetDesc (&desc); + context->ClearRenderTargetView (rtv, clear_color); + } - if (desc.Width < crop_meta->x + crop_meta->width || - desc.Height < crop_meta->y + crop_meta->height) { - GST_WARNING_OBJECT (self, "Invalid crop meta, ignore"); + crop_meta = gst_buffer_get_video_crop_meta (buffer); + if (crop_meta) { + input_rect.left = crop_meta->x; + input_rect.right = crop_meta->x + crop_meta->width; + input_rect.top = crop_meta->y; + input_rect.bottom = crop_meta->y + crop_meta->height; + } - crop_meta = nullptr; - } - } + if (input_rect.left != prev_rect->left || input_rect.top != prev_rect->top || + input_rect.right != prev_rect->right || + input_rect.bottom != prev_rect->bottom) { + g_object_set (self->converter, "src-x", (gint) input_rect.left, + "src-y", (gint) input_rect.top, + "src-width", (gint) (input_rect.right - input_rect.left), + "src-height", (gint) (input_rect.bottom - input_rect.top), nullptr); - if (crop_meta) { - input_rect.left = crop_meta->x; - input_rect.right = crop_meta->x + crop_meta->width; - input_rect.top = crop_meta->y; - input_rect.bottom = crop_meta->y + crop_meta->height; - } + self->prev_input_rect = input_rect; + } - if (self->first_present) { - D3D11_VIEWPORT viewport; - - viewport.TopLeftX = self->render_rect.left; - viewport.TopLeftY = self->render_rect.top; - viewport.Width = self->render_rect.right - self->render_rect.left; - viewport.Height = self->render_rect.bottom - self->render_rect.top; - viewport.MinDepth = 0.0f; - viewport.MaxDepth = 1.0f; - gst_d3d11_converter_update_viewport (self->converter, &viewport); - gst_d3d11_overlay_compositor_update_viewport (self->compositor, - &viewport); - } + if (self->first_present) { + D3D11_VIEWPORT viewport; + + viewport.TopLeftX = self->render_rect.left; + viewport.TopLeftY = self->render_rect.top; + viewport.Width = self->render_rect.right - self->render_rect.left; + viewport.Height = self->render_rect.bottom - self->render_rect.top; + viewport.MinDepth = 0.0f; + viewport.MaxDepth = 1.0f; + + g_object_set (self->converter, "dest-x", (gint) self->render_rect.left, + "dest-y", (gint) self->render_rect.top, + "dest-width", + (gint) (self->render_rect.right - self->render_rect.left), + "dest-height", + (gint) (self->render_rect.bottom - self->render_rect.top), + "video-direction", self->method, nullptr); + gst_d3d11_overlay_compositor_update_viewport (self->compositor, &viewport); + } - /* Converter preference order - * 1) If this texture can be converted via processor, and we used processor - * previously, use processor - * 2) If SRV is available, use converter - * 3) otherwise, use processor - */ - if (can_process && self->processor_in_use) { - convert_ret = gst_d3d11_window_do_processor (self, piv, pov, &input_rect); - } else if (can_convert) { - convert_ret = gst_d3d11_window_do_convert (self, srv, rtv, &input_rect); - } else if (can_process) { - convert_ret = gst_d3d11_window_do_processor (self, piv, pov, &input_rect); - } else { - g_assert_not_reached (); - ret = GST_FLOW_ERROR; - goto unmap_and_out; - } + if (!gst_d3d11_converter_convert_buffer_unlocked (self->converter, + buffer, backbuffer)) { + GST_ERROR_OBJECT (self, "Couldn't render buffer"); + return GST_FLOW_ERROR; + } - if (!convert_ret) { - ret = GST_FLOW_ERROR; - goto unmap_and_out; - } + gst_d3d11_overlay_compositor_upload (self->compositor, buffer); + gst_d3d11_overlay_compositor_draw_unlocked (self->compositor, &rtv); - gst_d3d11_overlay_compositor_upload (self->compositor, buffer); - gst_d3d11_overlay_compositor_draw_unlocked (self->compositor, &rtv); + if (self->allow_tearing && self->fullscreen) + present_flags |= DXGI_PRESENT_ALLOW_TEARING; -#if (GST_D3D11_DXGI_HEADER_VERSION >= 5) - if (self->allow_tearing && self->fullscreen) { - present_flags |= DXGI_PRESENT_ALLOW_TEARING; + if (klass->present) { + if (self->emit_present) { + g_signal_emit (self, d3d11_window_signalsSIGNAL_PRESENT, 0, + self->device, rtv, nullptr); } -#endif - - if (klass->present) - ret = klass->present (self, present_flags); - - self->first_present = FALSE; - - unmap_and_out: - gst_d3d11_buffer_unmap (buffer, infos); + ret = klass->present (self, present_flags); } + self->first_present = FALSE; + return ret; } GstFlowReturn gst_d3d11_window_render (GstD3D11Window * window, GstBuffer * buffer) { - GstMemory *mem; - GstFlowReturn ret; - g_return_val_if_fail (GST_IS_D3D11_WINDOW (window), GST_FLOW_ERROR); - if (buffer) { - mem = gst_buffer_peek_memory (buffer, 0); - if (!gst_is_d3d11_memory (mem)) { - GST_ERROR_OBJECT (window, "Invalid buffer"); - - return GST_FLOW_ERROR; - } - } - - gst_d3d11_device_lock (window->device); + GstD3D11DeviceLockGuard lk (window->device); if (buffer) gst_buffer_replace (&window->cached_buffer, buffer); - ret = gst_d3d111_window_present (window, window->cached_buffer, - window->pov, window->rtv); - gst_d3d11_device_unlock (window->device); - - return ret; + return gst_d3d111_window_present (window, window->cached_buffer, + window->backbuffer); } GstFlowReturn @@ -1038,11 +970,8 @@ guint64 acquire_key, guint64 release_key) { GstD3D11WindowClass *klass; - GstMemory *mem; GstFlowReturn ret = GST_FLOW_OK; - GstD3D11WindowSharedHandleData data = { NULL, }; - ID3D11VideoProcessorOutputView *pov = NULL; - ID3D11RenderTargetView *rtv = NULL; + GstD3D11WindowSharedHandleData data = { nullptr, }; g_return_val_if_fail (GST_IS_D3D11_WINDOW (window), GST_FLOW_ERROR); @@ -1051,37 +980,20 @@ g_assert (klass->open_shared_handle != NULL); g_assert (klass->release_shared_handle != NULL); - mem = gst_buffer_peek_memory (buffer, 0); - if (!gst_is_d3d11_memory (mem)) { - GST_ERROR_OBJECT (window, "Invalid buffer"); - - return GST_FLOW_ERROR; - } - data.shared_handle = shared_handle; data.texture_misc_flags = texture_misc_flags; data.acquire_key = acquire_key; data.release_key = release_key; - gst_d3d11_device_lock (window->device); + GstD3D11DeviceLockGuard (window->device); if (!klass->open_shared_handle (window, &data)) { GST_ERROR_OBJECT (window, "Couldn't open shared handle"); - gst_d3d11_device_unlock (window->device); return GST_FLOW_OK; } - if (data.fallback_rtv) { - rtv = data.fallback_rtv; - pov = data.fallback_pov; - } else { - rtv = data.rtv; - pov = data.pov; - } - - ret = gst_d3d111_window_present (window, buffer, pov, rtv); + ret = gst_d3d111_window_present (window, buffer, data.render_target); klass->release_shared_handle (window, &data); - gst_d3d11_device_unlock (window->device); return ret; } @@ -1115,9 +1027,8 @@ if (klass->unlock_stop) ret = klass->unlock_stop (window); - gst_d3d11_device_lock (window->device); + GstD3D11DeviceLockGuard lk (window->device); gst_clear_buffer (&window->cached_buffer); - gst_d3d11_device_unlock (window->device); return ret; } @@ -1182,3 +1093,23 @@ return "none"; } + +void +gst_d3d11_window_set_orientation (GstD3D11Window * window, + GstVideoOrientationMethod method) +{ + if (method == GST_VIDEO_ORIENTATION_AUTO || + method == GST_VIDEO_ORIENTATION_CUSTOM) { + return; + } + + GstD3D11DeviceLockGuard lk (window->device); + if (window->method != method) { + window->method = method; + if (window->swap_chain) { + GstD3D11WindowClass *klass = GST_D3D11_WINDOW_GET_CLASS (window); + + klass->on_resize (window, window->surface_width, window->surface_height); + } + } +}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11window.h -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11window.h
Changed
@@ -25,9 +25,7 @@ #include <gst/gst.h> #include <gst/video/video.h> #include <gst/d3d11/gstd3d11.h> -#include "gstd3d11converter.h" #include "gstd3d11overlaycompositor.h" -#include "gstd3d11videoprocessor.h" #include "gstd3d11pluginutils.h" G_BEGIN_DECLS @@ -69,13 +67,8 @@ guint64 acquire_key; guint64 release_key; - ID3D11Texture2D *texture; + GstBuffer *render_target; IDXGIKeyedMutex *keyed_mutex; - ID3D11VideoProcessorOutputView *pov; - ID3D11RenderTargetView *rtv; - - ID3D11VideoProcessorOutputView *fallback_pov; - ID3D11RenderTargetView *fallback_rtv; } GstD3D11WindowSharedHandleData; struct _GstD3D11Window @@ -93,21 +86,19 @@ GstD3D11WindowFullscreenToggleMode fullscreen_toggle_mode; gboolean requested_fullscreen; gboolean fullscreen; - gboolean render_stats; + gboolean emit_present; GstVideoInfo info; GstVideoInfo render_info; - GstD3D11VideoProcessor *processor; GstD3D11Converter *converter; GstD3D11OverlayCompositor *compositor; - gboolean processor_in_use; - /* calculated rect with aspect ratio and window area */ RECT render_rect; /* input resolution */ RECT input_rect; + RECT prev_input_rect; /* requested rect via gst_d3d11_window_render */ GstVideoRectangle rect; @@ -116,21 +107,20 @@ guint surface_height; IDXGISwapChain *swap_chain; - ID3D11RenderTargetView *rtv; - ID3D11VideoProcessorOutputView *pov; + GstBuffer *backbuffer; DXGI_FORMAT dxgi_format; GstBuffer *cached_buffer; gboolean first_present; gboolean allow_tearing; + + GstVideoOrientationMethod method; }; struct _GstD3D11WindowClass { GstObjectClass object_class; - void (*show) (GstD3D11Window * window); - void (*update_swap_chain) (GstD3D11Window * window); void (*change_fullscreen_mode) (GstD3D11Window * window); @@ -157,7 +147,8 @@ guint display_width, guint display_height, GstCaps * caps, - gboolean * video_processor_available, + GstStructure * config, + DXGI_FORMAT display_format, GError ** error); void (*unprepare) (GstD3D11Window * window); @@ -177,19 +168,21 @@ GType gst_d3d11_window_get_type (void); -void gst_d3d11_window_show (GstD3D11Window * window); - void gst_d3d11_window_set_render_rectangle (GstD3D11Window * window, const GstVideoRectangle * rect); void gst_d3d11_window_set_title (GstD3D11Window * window, const gchar *title); +void gst_d3d11_window_set_orientation (GstD3D11Window * window, + GstVideoOrientationMethod method); + GstFlowReturn gst_d3d11_window_prepare (GstD3D11Window * window, guint display_width, guint display_height, GstCaps * caps, - gboolean * video_processor_available, + GstStructure * config, + DXGI_FORMAT display_format, GError ** error); GstFlowReturn gst_d3d11_window_render (GstD3D11Window * window,
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11window_corewindow.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11window_corewindow.cpp
Changed
@@ -390,10 +390,9 @@ return NULL; } - gst_d3d11_device_lock (device); + GstD3D11DeviceLockGuard lk (device); hr = factory2->CreateSwapChainForCoreWindow (device_handle, (IUnknown *) core_window, desc, output, &swap_chain); - gst_d3d11_device_unlock (device); if (!gst_d3d11_result (hr, device)) { GST_WARNING_OBJECT (self, "Cannot create SwapChain Object: 0x%x", @@ -453,7 +452,7 @@ IDXGISwapChain1 *swap_chain = (IDXGISwapChain1 *) window->swap_chain; /* the first present should not specify dirty-rect */ - if (!window->first_present) { + if (!window->first_present && !window->emit_present) { present_params.DirtyRectsCount = 1; present_params.pDirtyRects = &window->render_rect; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11window_dummy.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11window_dummy.cpp
Changed
@@ -40,6 +40,8 @@ ID3D11Texture2D *fallback_texture; ID3D11VideoProcessorOutputView *fallback_pov; ID3D11RenderTargetView *fallback_rtv; + + GstD3D11Fence *fence; }; #define gst_d3d11_window_dummy_parent_class parent_class @@ -50,7 +52,7 @@ guint width, guint height); static GstFlowReturn gst_d3d11_window_dummy_prepare (GstD3D11Window * window, guint display_width, guint display_height, GstCaps * caps, - gboolean * video_processor_available, GError ** error); + GstStructure * config, DXGI_FORMAT display_format, GError ** error); static void gst_d3d11_window_dummy_unprepare (GstD3D11Window * window); static gboolean gst_d3d11_window_dummy_open_shared_handle (GstD3D11Window * window, @@ -83,11 +85,10 @@ static GstFlowReturn gst_d3d11_window_dummy_prepare (GstD3D11Window * window, guint display_width, guint display_height, GstCaps * caps, - gboolean * video_processor_available, GError ** error) + GstStructure * config, DXGI_FORMAT display_format, GError ** error) { - g_clear_pointer (&window->processor, gst_d3d11_video_processor_free); - g_clear_pointer (&window->converter, gst_d3d11_converter_free); - g_clear_pointer (&window->compositor, gst_d3d11_overlay_compositor_free); + gst_clear_object (&window->compositor); + gst_clear_object (&window->converter); /* We are supporting only RGBA, BGRA or RGB10A2_LE formats but we don't know * which format texture will be used at this moment */ @@ -112,73 +113,25 @@ window->render_info.colorimetry.transfer = GST_VIDEO_TRANSFER_BT709; window->render_info.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; - gst_d3d11_device_lock (window->device); - -#if (GST_D3D11_DXGI_HEADER_VERSION >= 4) - { - const GstDxgiColorSpace *in_color_space = - gst_d3d11_video_info_to_dxgi_color_space (&window->info); - const GstD3D11Format *in_format = - gst_d3d11_device_format_from_gst (window->device, - GST_VIDEO_INFO_FORMAT (&window->info)); - gboolean hardware = FALSE; - GstD3D11VideoProcessor *processor = NULL; - guint i; - DXGI_FORMAT formats_to_check = { - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_B8G8R8A8_UNORM, - DXGI_FORMAT_R10G10B10A2_UNORM - }; - - if (in_color_space && in_format && - in_format->dxgi_format != DXGI_FORMAT_UNKNOWN) { - g_object_get (window->device, "hardware", &hardware, NULL); - } - - if (hardware) { - processor = - gst_d3d11_video_processor_new (window->device, - GST_VIDEO_INFO_WIDTH (&window->info), - GST_VIDEO_INFO_HEIGHT (&window->info), display_width, display_height); - } - - /* Check if video processor can support all possible output dxgi formats */ - for (i = 0; i < G_N_ELEMENTS (formats_to_check) && processor; i++) { - DXGI_FORMAT in_dxgi_format = in_format->dxgi_format; - DXGI_FORMAT out_dxgi_format = formats_to_checki; - DXGI_COLOR_SPACE_TYPE in_dxgi_color_space = - (DXGI_COLOR_SPACE_TYPE) in_color_space->dxgi_color_space_type; - - if (!gst_d3d11_video_processor_check_format_conversion (processor, - in_dxgi_format, in_dxgi_color_space, out_dxgi_format, - DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709)) { - GST_DEBUG_OBJECT (window, "Conversion is not supported by device"); - g_clear_pointer (&processor, gst_d3d11_video_processor_free); - break; - } - } - - if (processor) { - gst_d3d11_video_processor_set_input_dxgi_color_space (processor, - (DXGI_COLOR_SPACE_TYPE) in_color_space->dxgi_color_space_type); - gst_d3d11_video_processor_set_output_dxgi_color_space (processor, - DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709); - } - - window->processor = processor; + if (config) { + gst_structure_set (config, GST_D3D11_CONVERTER_OPT_BACKEND, + GST_TYPE_D3D11_CONVERTER_BACKEND, GST_D3D11_CONVERTER_BACKEND_SHADER, + nullptr); + } else { + config = gst_structure_new ("converter-config", + GST_D3D11_CONVERTER_OPT_BACKEND, GST_TYPE_D3D11_CONVERTER_BACKEND, + GST_D3D11_CONVERTER_BACKEND_SHADER, nullptr); } -#endif - *video_processor_available = !!window->processor; - window->converter = - gst_d3d11_converter_new (window->device, &window->info, - &window->render_info, nullptr); + GstD3D11DeviceLockGuard lk (window->device); + window->converter = gst_d3d11_converter_new (window->device, &window->info, + &window->render_info, config); if (!window->converter) { GST_ERROR_OBJECT (window, "Cannot create converter"); g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED, "Cannot create converter"); - goto error; + return GST_FLOW_ERROR; } window->compositor = @@ -187,25 +140,10 @@ GST_ERROR_OBJECT (window, "Cannot create overlay compositor"); g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED, "Cannot create overlay compositor"); - goto error; + return GST_FLOW_ERROR; } - gst_d3d11_device_unlock (window->device); - return GST_FLOW_OK; - -error: - gst_d3d11_device_unlock (window->device); - - return GST_FLOW_ERROR; -} - -static void -gst_d3d11_window_dummy_clear_resources (GstD3D11WindowDummy * self) -{ - GST_D3D11_CLEAR_COM (self->fallback_pov); - GST_D3D11_CLEAR_COM (self->fallback_rtv); - GST_D3D11_CLEAR_COM (self->fallback_texture); } static void @@ -213,7 +151,7 @@ { GstD3D11WindowDummy *self = GST_D3D11_WINDOW_DUMMY (window); - gst_d3d11_window_dummy_clear_resources (self); + gst_clear_d3d11_fence (&self->fence); } static void @@ -233,6 +171,20 @@ src_rect.w = GST_VIDEO_INFO_WIDTH (&window->render_info); src_rect.h = GST_VIDEO_INFO_HEIGHT (&window->render_info); + switch (window->method) { + case GST_VIDEO_ORIENTATION_90R: + case GST_VIDEO_ORIENTATION_90L: + case GST_VIDEO_ORIENTATION_UL_LR: + case GST_VIDEO_ORIENTATION_UR_LL: + src_rect.w = GST_VIDEO_INFO_HEIGHT (&window->render_info); + src_rect.h = GST_VIDEO_INFO_WIDTH (&window->render_info); + break; + default: + src_rect.w = GST_VIDEO_INFO_WIDTH (&window->render_info); + src_rect.h = GST_VIDEO_INFO_HEIGHT (&window->render_info); + break; + } + gst_video_sink_center_rect (src_rect, dst_rect, &rst_rect, TRUE); } else { rst_rect = dst_rect; @@ -247,107 +199,25 @@ } static gboolean -gst_d3d11_window_dummy_setup_fallback_texture (GstD3D11Window * window, - D3D11_TEXTURE2D_DESC * shared_desc) -{ - GstD3D11WindowDummy *self = GST_D3D11_WINDOW_DUMMY (window); - D3D11_TEXTURE2D_DESC desc = { 0, }; - D3D11_RENDER_TARGET_VIEW_DESC rtv_desc; - ID3D11Device *device_handle = - gst_d3d11_device_get_device_handle (window->device); - gboolean need_new_texture = FALSE; - HRESULT hr; - - if (!self->fallback_texture) { - GST_DEBUG_OBJECT (self, - "We have no configured fallback texture, create new one"); - need_new_texture = TRUE; - } else { - self->fallback_texture->GetDesc (&desc); - if (shared_desc->Format != desc.Format) { - GST_DEBUG_OBJECT (self, "Texture formats are different, create new one"); - need_new_texture = TRUE; - } else if (shared_desc->Width > desc.Width || - shared_desc->Height > desc.Height) { - GST_DEBUG_OBJECT (self, "Needs larger size of fallback texture"); - need_new_texture = TRUE; - } - } - - if (!need_new_texture) - return TRUE; - - gst_d3d11_window_dummy_clear_resources (self); - - desc.Width = shared_desc->Width; - desc.Height = shared_desc->Height; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = shared_desc->Format; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; - - hr = device_handle->CreateTexture2D (&desc, NULL, &self->fallback_texture); - if (!gst_d3d11_result (hr, window->device)) { - GST_ERROR_OBJECT (self, "Couldn't create fallback texture"); - return FALSE; - } - - rtv_desc.Format = DXGI_FORMAT_UNKNOWN; - rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; - rtv_desc.Texture2D.MipSlice = 0; - - hr = device_handle->CreateRenderTargetView (self->fallback_texture, &rtv_desc, - &self->fallback_rtv); - if (!gst_d3d11_result (hr, window->device)) { - GST_ERROR_OBJECT (self, - "Couldn't get render target view from fallback texture"); - gst_d3d11_window_dummy_clear_resources (self); - return FALSE; - } - - if (window->processor) { - D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC pov_desc; - - pov_desc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D; - pov_desc.Texture2D.MipSlice = 0; - - if (!gst_d3d11_video_processor_create_output_view (window->processor, - &pov_desc, self->fallback_texture, &self->fallback_pov)) { - GST_ERROR_OBJECT (window, - "ID3D11VideoProcessorOutputView is unavailable"); - gst_d3d11_window_dummy_clear_resources (self); - return FALSE; - } - } - - return TRUE; -} - -/* *INDENT-OFF* */ -static gboolean gst_d3d11_window_dummy_open_shared_handle (GstD3D11Window * window, GstD3D11WindowSharedHandleData * data) { - GstD3D11WindowDummy *self = GST_D3D11_WINDOW_DUMMY (window); GstD3D11Device *device = window->device; ID3D11Device *device_handle; HRESULT hr; - ID3D11Texture2D *texture = NULL; - IDXGIKeyedMutex *keyed_mutex = NULL; - ID3D11VideoProcessorOutputView *pov = NULL; - ID3D11RenderTargetView *rtv = NULL; + ComPtr < ID3D11Texture2D > texture; + ComPtr < IDXGIKeyedMutex > keyed_mutex; + ID3D11RenderTargetView *rtv; + GstMemory *mem; + GstD3D11Memory *dmem; D3D11_TEXTURE2D_DESC desc; gboolean use_keyed_mutex = FALSE; - gboolean need_fallback_texture = FALSE; device_handle = gst_d3d11_device_get_device_handle (device); if ((data->texture_misc_flags & D3D11_RESOURCE_MISC_SHARED_NTHANDLE) == D3D11_RESOURCE_MISC_SHARED_NTHANDLE) { - ComPtr<ID3D11Device1> device1_handle; + ComPtr < ID3D11Device1 > device1_handle; hr = device_handle->QueryInterface (IID_PPV_ARGS (&device1_handle)); if (!gst_d3d11_result (hr, device)) @@ -369,82 +239,47 @@ if (use_keyed_mutex) { hr = texture->QueryInterface (IID_PPV_ARGS (&keyed_mutex)); - if (!gst_d3d11_result (hr, device)) - goto out; + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (window, "Keyed mutex is unavailable"); + return FALSE; + } } - if (window->processor) { - if (use_keyed_mutex) { - D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC pov_desc; - - pov_desc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D; - pov_desc.Texture2D.MipSlice = 0; - - if (!gst_d3d11_video_processor_create_output_view (window->processor, - &pov_desc, texture, &pov)) { - GST_WARNING_OBJECT (window, - "ID3D11VideoProcessorOutputView is unavailable"); - } - } else { - /* HACK: If external texture was created without keyed mutext - * and we need to used videoprocessor to convert decoder output texture - * to external texture, converted texture by videoprocessor seems to be broken - * Probably that's because of missing flush/sync API around videoprocessor. - * (e.g., ID3D11VideoContext and ID3D11VideoProcessor have no - * flushing api such as ID3D11DeviceContext::Flush). - * To workaround the case, we need to use fallback texture and copy back - * to external texture - */ - - need_fallback_texture = TRUE; - - GST_TRACE_OBJECT (window, - "We are using video processor but keyed mutex is unavailable"); - if (!gst_d3d11_window_dummy_setup_fallback_texture (window, &desc)) { - goto out; - } - } + mem = gst_d3d11_allocator_alloc_wrapped (nullptr, + device, texture.Get (), desc.Width * desc.Height * 4, nullptr, nullptr); + if (!mem) { + GST_ERROR_OBJECT (window, "Couldn't allocate memory"); + return FALSE; } - hr = device_handle->CreateRenderTargetView ((ID3D11Resource *) texture, - NULL, &rtv); - if (!gst_d3d11_result (hr, device)) - goto out; + dmem = GST_D3D11_MEMORY_CAST (mem); + rtv = gst_d3d11_memory_get_render_target_view (dmem, 0); + if (!rtv) { + GST_ERROR_OBJECT (window, "Render target view is unavailable"); + gst_memory_unref (mem); + return FALSE; + } if (keyed_mutex) { - hr = keyed_mutex->AcquireSync(data->acquire_key, INFINITE); - if (!gst_d3d11_result (hr, device)) - goto out; + hr = keyed_mutex->AcquireSync (data->acquire_key, INFINITE); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (window, "Couldn't acquire sync"); + gst_memory_unref (mem); + return FALSE; + } } /* Everything is prepared now */ gst_d3d11_window_dummy_on_resize (window, desc.Width, desc.Height); /* Move owned resources */ - data->texture = texture; - data->keyed_mutex = keyed_mutex; - data->pov = pov; - data->rtv = rtv; - - if (need_fallback_texture) { - data->fallback_pov = self->fallback_pov; - data->fallback_rtv = self->fallback_rtv; - } else { - data->fallback_pov = nullptr; - data->fallback_rtv = nullptr; - } + data->render_target = gst_buffer_new (); + gst_buffer_append_memory (data->render_target, mem); + if (keyed_mutex) + data->keyed_mutex = keyed_mutex.Detach (); return TRUE; - -out: - GST_D3D11_CLEAR_COM (texture); - GST_D3D11_CLEAR_COM (keyed_mutex); - GST_D3D11_CLEAR_COM (pov); - GST_D3D11_CLEAR_COM (rtv); - - return FALSE; } -/* *INDENT-ON* */ static gboolean gst_d3d11_window_dummy_release_shared_handle (GstD3D11Window * window, @@ -459,63 +294,27 @@ hr = data->keyed_mutex->ReleaseSync (data->release_key); gst_d3d11_result (hr, device); - data->keyed_mutex->Release (); + GST_D3D11_CLEAR_COM (data->keyed_mutex); } else { - /* *INDENT-OFF* */ - ComPtr<ID3D11Query> query; - /* *INDENT-ON* */ - D3D11_QUERY_DESC query_desc; - ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device); - ID3D11DeviceContext *context_handle = - gst_d3d11_device_get_device_context_handle (device); - BOOL sync_done = FALSE; - /* If keyed mutex is not used, let's handle sync manually by using - * ID3D11Query. Issued GPU commands might not be finished yet */ - query_desc.Query = D3D11_QUERY_EVENT; - query_desc.MiscFlags = 0; + * fence. Issued GPU commands might not be finished yet */ - hr = device_handle->CreateQuery (&query_desc, &query); - if (!gst_d3d11_result (hr, device)) { + if (!self->fence) + self->fence = gst_d3d11_device_create_fence (device); + + if (!self->fence) { GST_ERROR_OBJECT (self, "Couldn't Create event query"); return FALSE; } - /* Copy from fallback texture to user's texture */ - if (data->fallback_rtv) { - D3D11_BOX src_box; - D3D11_TEXTURE2D_DESC desc; - ID3D11DeviceContext *context_handle = - gst_d3d11_device_get_device_context_handle (device); - - data->texture->GetDesc (&desc); - - src_box.left = 0; - src_box.top = 0; - src_box.front = 0; - src_box.back = 1; - src_box.right = desc.Width; - src_box.bottom = desc.Height; - - context_handle->CopySubresourceRegion (data->texture, 0, 0, 0, 0, - self->fallback_texture, 0, &src_box); - } - context_handle->End (query.Get ()); - - /* Wait until all issued GPU commands are finished */ - do { - context_handle->GetData (query.Get (), &sync_done, sizeof (BOOL), 0); - } while (!sync_done && (hr == S_OK || hr == S_FALSE)); - - if (!gst_d3d11_result (hr, device)) { + if (!gst_d3d11_fence_signal (self->fence) || + !gst_d3d11_fence_wait (self->fence)) { GST_ERROR_OBJECT (self, "Couldn't sync GPU operation"); return FALSE; } } - GST_D3D11_CLEAR_COM (data->rtv); - GST_D3D11_CLEAR_COM (data->pov); - GST_D3D11_CLEAR_COM (data->texture); + gst_clear_buffer (&data->render_target); return TRUE; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11window_swapchainpanel.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11window_swapchainpanel.cpp
Changed
@@ -363,10 +363,9 @@ return NULL; } - gst_d3d11_device_lock (device); + GstD3D11DeviceLockGuard lk (device); hr = factory2->CreateSwapChainForComposition (device_handle, desc, output, &swap_chain); - gst_d3d11_device_unlock (device); if (!gst_d3d11_result (hr, device)) { GST_WARNING_OBJECT (self, "Cannot create SwapChain Object: 0x%x", @@ -443,7 +442,7 @@ IDXGISwapChain1 *swap_chain = (IDXGISwapChain1 *) window->swap_chain; /* the first present should not specify dirty-rect */ - if (!window->first_present) { + if (!window->first_present && !window->emit_present) { present_params.DirtyRectsCount = 1; present_params.pDirtyRects = &window->render_rect; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/gstd3d11window_win32.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11window_win32.cpp
Changed
@@ -43,7 +43,6 @@ #define WM_GST_D3D11_CONSTRUCT_INTERNAL_WINDOW (WM_USER + 2) #define WM_GST_D3D11_DESTROY_INTERNAL_WINDOW (WM_USER + 3) #define WM_GST_D3D11_MOVE_WINDOW (WM_USER + 4) -#define WM_GST_D3D11_SHOW_WINDOW (WM_USER + 5) static LRESULT CALLBACK window_proc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -61,14 +60,12 @@ { GstD3D11Window parent; - GMutex lock; - GCond cond; + SRWLOCK lock; + CONDITION_VARIABLE cond; GMainContext *main_context; GMainLoop *loop; - gboolean visible; - GSource *msg_source; GIOChannel *msg_io_channel; @@ -81,7 +78,6 @@ GstD3D11WindowWin32OverlayState overlay_state; HDC device_handle; - gboolean first_present; gboolean have_swapchain1; /* atomic */ @@ -105,9 +101,7 @@ static void gst_d3d11_window_win32_constructed (GObject * object); static void gst_d3d11_window_win32_dispose (GObject * object); -static void gst_d3d11_window_win32_finalize (GObject * object); -static void gst_d3d11_window_win32_show (GstD3D11Window * window); static void gst_d3d11_window_win32_update_swap_chain (GstD3D11Window * window); static void gst_d3d11_window_win32_change_fullscreen_mode (GstD3D11Window * window); @@ -128,7 +122,7 @@ guint width, guint height); static GstFlowReturn gst_d3d11_window_win32_prepare (GstD3D11Window * window, guint display_width, guint display_height, GstCaps * caps, - gboolean * video_processor_available, GError ** error); + GstStructure * config, DXGI_FORMAT display_format, GError ** error); static void gst_d3d11_window_win32_unprepare (GstD3D11Window * window); static void gst_d3d11_window_win32_set_render_rectangle (GstD3D11Window * window, @@ -148,9 +142,7 @@ gobject_class->constructed = gst_d3d11_window_win32_constructed; gobject_class->dispose = gst_d3d11_window_win32_dispose; - gobject_class->finalize = gst_d3d11_window_win32_finalize; - window_class->show = GST_DEBUG_FUNCPTR (gst_d3d11_window_win32_show); window_class->update_swap_chain = GST_DEBUG_FUNCPTR (gst_d3d11_window_win32_update_swap_chain); window_class->change_fullscreen_mode = @@ -175,9 +167,6 @@ static void gst_d3d11_window_win32_init (GstD3D11WindowWin32 * self) { - g_mutex_init (&self->lock); - g_cond_init (&self->cond); - self->main_context = g_main_context_new (); } @@ -194,13 +183,13 @@ goto done; } - g_mutex_lock (&self->lock); + AcquireSRWLockExclusive (&self->lock); self->loop = g_main_loop_new (self->main_context, FALSE); self->thread = g_thread_new ("GstD3D11WindowWin32", (GThreadFunc) gst_d3d11_window_win32_thread_func, self); while (!g_main_loop_is_running (self->loop)) - g_cond_wait (&self->cond, &self->lock); - g_mutex_unlock (&self->lock); + SleepConditionVariableSRW (&self->cond, &self->lock, INFINITE, 0); + ReleaseSRWLockExclusive (&self->lock); done: G_OBJECT_CLASS (parent_class)->constructed (object); @@ -216,15 +205,38 @@ static GstFlowReturn gst_d3d11_window_win32_prepare (GstD3D11Window * window, guint display_width, - guint display_height, GstCaps * caps, gboolean * video_processor_available, - GError ** error) + guint display_height, GstCaps * caps, GstStructure * config, + DXGI_FORMAT display_format, GError ** error) { GstD3D11WindowWin32 *self = GST_D3D11_WINDOW_WIN32 (window); HWND hwnd; GstFlowReturn ret; + gint width, height; - if (!self->setup_external_hwnd) + switch (window->method) { + case GST_VIDEO_ORIENTATION_90R: + case GST_VIDEO_ORIENTATION_90L: + case GST_VIDEO_ORIENTATION_UL_LR: + case GST_VIDEO_ORIENTATION_UR_LL: + width = display_height; + height = display_width; + break; + default: + width = display_width; + height = display_height; + break; + } + + if (!self->setup_external_hwnd) { + RECT rect; + GetClientRect (self->internal_hwnd, &rect); + width += 2 * GetSystemMetrics (SM_CXSIZEFRAME); + height += + 2 * GetSystemMetrics (SM_CYSIZEFRAME) + GetSystemMetrics (SM_CYCAPTION); + MoveWindow (self->internal_hwnd, rect.left, rect.top, width, height, FALSE); + ShowWindow (self->internal_hwnd, SW_SHOW); goto done; + } hwnd = (HWND) window->external_handle; if (!IsWindow (hwnd)) { @@ -256,7 +268,7 @@ done: return GST_D3D11_WINDOW_CLASS (parent_class)->prepare (window, display_width, - display_height, caps, video_processor_available, error); + display_height, caps, config, display_format, error); } static void @@ -358,28 +370,16 @@ } } -static void -gst_d3d11_window_win32_finalize (GObject * object) -{ - GstD3D11WindowWin32 *self = GST_D3D11_WINDOW_WIN32 (object); - - g_mutex_clear (&self->lock); - g_cond_clear (&self->cond); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - static gboolean gst_d3d11_window_win32_unlock (GstD3D11Window * window) { GstD3D11WindowWin32 *self = GST_D3D11_WINDOW_WIN32 (window); - g_mutex_lock (&self->lock); + GstD3D11SRWLockGuard lk (&self->lock); GST_DEBUG_OBJECT (self, "Unlock"); self->flushing = TRUE; - g_cond_broadcast (&self->cond); - g_mutex_unlock (&self->lock); + WakeAllConditionVariable (&self->cond); return TRUE; } @@ -388,13 +388,12 @@ gst_d3d11_window_win32_unlock_stop (GstD3D11Window * window) { GstD3D11WindowWin32 *self = GST_D3D11_WINDOW_WIN32 (window); - g_mutex_lock (&self->lock); + GstD3D11SRWLockGuard lk (&self->lock); GST_DEBUG_OBJECT (self, "Unlock stop"); self->flushing = FALSE; - g_cond_broadcast (&self->cond); - g_mutex_unlock (&self->lock); + WakeAllConditionVariable (&self->cond); return TRUE; } @@ -406,9 +405,9 @@ GST_TRACE_OBJECT (self, "Main loop running now"); - g_mutex_lock (&self->lock); - g_cond_signal (&self->cond); - g_mutex_unlock (&self->lock); + AcquireSRWLockExclusive (&self->lock); + WakeConditionVariable (&self->cond); + ReleaseSRWLockExclusive (&self->lock); return G_SOURCE_REMOVE; } @@ -515,11 +514,11 @@ PostMessageA (self->external_hwnd, WM_GST_D3D11_CONSTRUCT_INTERNAL_WINDOW, 0, 0); - g_mutex_lock (&self->lock); + GstD3D11SRWLockGuard lk (&self->lock); while (self->external_hwnd && self->overlay_state == GST_D3D11_WINDOW_WIN32_OVERLAY_STATE_NONE && !self->flushing) { - g_cond_wait (&self->cond, &self->lock); + SleepConditionVariableSRW (&self->cond, &self->lock, INFINITE, 0); } if (self->overlay_state != GST_D3D11_WINDOW_WIN32_OVERLAY_STATE_OPENED) { @@ -528,7 +527,6 @@ else ret = GST_FLOW_ERROR; } - g_mutex_unlock (&self->lock); return ret; } @@ -594,9 +592,6 @@ } self->device_handle = 0; - self->internal_hwnd = 0; - self->visible = FALSE; - self->internal_hwnd = CreateWindowExA (0, "GSTD3D11", "Direct3D11 renderer", @@ -730,7 +725,6 @@ if (!window->enable_navigation_events) return; - /* FIXME: convert to render coordinate */ switch (uMsg) { case WM_MOUSEMOVE: button = 0; @@ -844,9 +838,6 @@ } } break; - case WM_GST_D3D11_SHOW_WINDOW: - ShowWindow (self->internal_hwnd, SW_SHOW); - break; default: break; } @@ -938,11 +929,11 @@ SWP_FRAMECHANGED | SWP_NOACTIVATE); MoveWindow (self->internal_hwnd, rect.left, rect.top, rect.right, rect.bottom, FALSE); + ShowWindow (self->internal_hwnd, SW_SHOW); - g_mutex_lock (&self->lock); + GstD3D11SRWLockGuard lk (&self->lock); self->overlay_state = GST_D3D11_WINDOW_WIN32_OVERLAY_STATE_OPENED; - g_cond_broadcast (&self->cond); - g_mutex_unlock (&self->lock); + WakeAllConditionVariable (&self->cond); /* don't need to be chained up to parent window procedure, * as this is our custom message */ @@ -952,7 +943,7 @@ MoveWindow (self->internal_hwnd, 0, 0, LOWORD (lParam), HIWORD (lParam), FALSE); } else if (uMsg == WM_CLOSE || uMsg == WM_DESTROY) { - g_mutex_lock (&self->lock); + GstD3D11SRWLockGuard lk (&self->lock); GST_WARNING_OBJECT (self, "external window is closing"); gst_d3d11_window_win32_release_external_handle (self->external_hwnd); self->external_hwnd = NULL; @@ -966,8 +957,7 @@ self->internal_hwnd_thread = NULL; self->overlay_state = GST_D3D11_WINDOW_WIN32_OVERLAY_STATE_CLOSED; - g_cond_broadcast (&self->cond); - g_mutex_unlock (&self->lock); + WakeAllConditionVariable (&self->cond); } else { gst_d3d11_window_win32_handle_window_proc (self, hWnd, uMsg, wParam, lParam); @@ -1008,9 +998,8 @@ ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device); IDXGIFactory1 *factory = gst_d3d11_device_get_dxgi_factory_handle (device); - gst_d3d11_device_lock (device); + GstD3D11DeviceLockGuard lk (device); hr = factory->CreateSwapChain (device_handle, desc, &swap_chain); - gst_d3d11_device_unlock (device); if (!gst_d3d11_result (hr, device)) { GST_WARNING_OBJECT (self, "Cannot create SwapChain Object: 0x%x", @@ -1021,7 +1010,6 @@ return swap_chain; } -#if (GST_D3D11_DXGI_HEADER_VERSION >= 2) static IDXGISwapChain1 * create_swap_chain_for_hwnd (GstD3D11WindowWin32 * self, GstD3D11Device * device, HWND hwnd, DXGI_SWAP_CHAIN_DESC1 * desc, @@ -1039,10 +1027,9 @@ return NULL; } - gst_d3d11_device_lock (device); + GstD3D11DeviceLockGuard lk (device); hr = factory2->CreateSwapChainForHwnd (device_handle, hwnd, desc, fullscreen_desc, output, &swap_chain); - gst_d3d11_device_unlock (device); if (!gst_d3d11_result (hr, device)) { GST_WARNING_OBJECT (self, "Cannot create SwapChain Object: 0x%x", @@ -1052,7 +1039,6 @@ return swap_chain; } -#endif static gboolean gst_d3d11_window_win32_create_swap_chain (GstD3D11Window * window, @@ -1066,7 +1052,6 @@ self->have_swapchain1 = FALSE; -#if (GST_D3D11_DXGI_HEADER_VERSION >= 2) { DXGI_SWAP_CHAIN_DESC1 desc1 = { 0, }; desc1.Width = 0; @@ -1097,7 +1082,6 @@ self->have_swapchain1 = TRUE; } } -#endif if (!new_swapchain) { DXGI_SWAP_EFFECT swap_effect = DXGI_SWAP_EFFECT_DISCARD; @@ -1132,50 +1116,15 @@ } /* disable alt+enter here. It should be manually handled */ - gst_d3d11_device_lock (device); + GstD3D11DeviceLockGuard lk (device); gst_d3d11_window_win32_disable_alt_enter (self, device, new_swapchain, desc.OutputWindow); - gst_d3d11_device_unlock (device); *swap_chain = new_swapchain; return TRUE; } -static void -gst_d3d11_window_win32_show (GstD3D11Window * window) -{ - GstD3D11WindowWin32 *self = GST_D3D11_WINDOW_WIN32 (window); - gint width, height; - - width = GST_VIDEO_INFO_WIDTH (&window->render_info); - height = GST_VIDEO_INFO_HEIGHT (&window->render_info); - - if (!self->visible) { - /* if no parent the real size has to be set now because this has not been done - * when at window creation */ - if (!self->external_hwnd) { - RECT rect; - GetClientRect (self->internal_hwnd, &rect); - width += 2 * GetSystemMetrics (SM_CXSIZEFRAME); - height += - 2 * GetSystemMetrics (SM_CYSIZEFRAME) + - GetSystemMetrics (SM_CYCAPTION); - MoveWindow (self->internal_hwnd, rect.left, rect.top, width, - height, FALSE); - ShowWindow (self->internal_hwnd, SW_SHOW); - } else if (self->internal_hwnd) { - /* ShowWindow will throw message to message pumping thread (app thread) - * synchroniously, which can be blocked at the moment. - * Post message to internal hwnd and do that from message pumping thread - */ - PostMessageA (self->internal_hwnd, WM_GST_D3D11_SHOW_WINDOW, 0, 0); - } - - self->visible = TRUE; - } -} - static GstFlowReturn gst_d3d11_window_win32_present (GstD3D11Window * window, guint present_flags) { @@ -1189,21 +1138,19 @@ return GST_D3D11_WINDOW_FLOW_CLOSED; } -#if (GST_D3D11_DXGI_HEADER_VERSION >= 2) + if (self->have_swapchain1) { IDXGISwapChain1 *swap_chain1 = (IDXGISwapChain1 *) window->swap_chain; DXGI_PRESENT_PARAMETERS present_params = { 0, }; /* the first present should not specify dirty-rect */ - if (!window->first_present) { + if (!window->first_present && !window->emit_present) { present_params.DirtyRectsCount = 1; present_params.pDirtyRects = &window->render_rect; } hr = swap_chain1->Present1 (0, present_flags, &present_params); - } else -#endif - { + } else { hr = window->swap_chain->Present (0, present_flags); }
View file
gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11winrtcapture.cpp
Added
@@ -0,0 +1,975 @@ +/* + * GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef WINAPI_PARTITION_APP +#undef WINAPI_PARTITION_APP +#endif + +#define WINAPI_PARTITION_APP 1 + +#include "gstd3d11winrtcapture.h" +#include "gstd3d11pluginutils.h" +#include <gmodule.h> +#include <winstring.h> +#include <roapi.h> +#include <windows.graphics.capture.h> +#include <windows.graphics.capture.interop.h> +#include <windows.graphics.directx.direct3d11.h> +#include <windows.graphics.directx.direct3d11.interop.h> +#include <string.h> + +#include <wrl.h> + +#ifdef HAVE_WINMM +#include <mmsystem.h> +#endif + +GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_screen_capture_debug); +#define GST_CAT_DEFAULT gst_d3d11_screen_capture_debug + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +using namespace ABI::Windows::Foundation; +using namespace ABI::Windows::Graphics; +using namespace ABI::Windows::Graphics::Capture; +using namespace ABI::Windows::Graphics::DirectX; +using namespace ABI::Windows::Graphics::DirectX::Direct3D11; +using namespace Windows::Graphics::DirectX::Direct3D11; + +static SRWLOCK capture_list_lock = SRWLOCK_INIT; +static GList *capture_list = nullptr; + +#define D3D11_WINRT_CAPTURE_PROP_NAME "gst-d3d11-winrt-capture" +#define WM_GST_D3D11_WINRT_CAPTURE_CLOSED (WM_USER + 1) + +typedef struct +{ + gboolean loaded; + + /* d3d11.dll */ + HRESULT (WINAPI * CreateDirect3D11DeviceFromDXGIDevice) (IDXGIDevice * + dxgi_device, IInspectable ** graphics_device); + + /* combase.dll */ + HRESULT (WINAPI * RoInitialize) (RO_INIT_TYPE init_type); + HRESULT (WINAPI * RoUninitialize) (void); + HRESULT (WINAPI * WindowsCreateString) (PCNZWCH source_string, + UINT32 length, HSTRING * string); + HRESULT (WINAPI * WindowsDeleteString) (HSTRING string); + HRESULT (WINAPI * RoGetActivationFactory) (HSTRING activatable_class_id, + REFIID iid, void ** factory); +} GstD3D11WinRTVTable; + +static GstD3D11WinRTVTable winrt_vtable = { FALSE, }; + +template < typename InterfaceType, PCNZWCH runtime_class_id > +static HRESULT +GstGetActivationFactory (InterfaceType ** factory) +{ + if (!gst_d3d11_winrt_capture_load_library ()) + return E_NOINTERFACE; + + HSTRING class_id_hstring; + HRESULT hr = winrt_vtable.WindowsCreateString (runtime_class_id, + wcslen (runtime_class_id), &class_id_hstring); + + if (FAILED (hr)) + return hr; + + hr = winrt_vtable.RoGetActivationFactory (class_id_hstring, + IID_PPV_ARGS (factory)); + + if (FAILED (hr)) { + winrt_vtable.WindowsDeleteString (class_id_hstring); + return hr; + } + + return winrt_vtable.WindowsDeleteString (class_id_hstring); +} + +#define CLOSE_COM(obj) G_STMT_START { \ + if (obj) { \ + ComPtr<IClosable> closable; \ + obj.As (&closable); \ + if (closable) \ + closable->Close (); \ + obj = nullptr; \ + } \ +} G_STMT_END + +struct GstD3D11WinRTCaptureInner +{ + ~GstD3D11WinRTCaptureInner() + { + CLOSE_COM (session); + CLOSE_COM (pool); + CLOSE_COM (item); + CLOSE_COM (d3d_device); + } + + STDMETHODIMP + OnClosed (IGraphicsCaptureItem * item, IInspectable * args) + { + GST_WARNING ("Item %p got closed", this); + this->closed = true; + + return S_OK; + } + + ComPtr < IDirect3DDevice > d3d_device; + ComPtr < IGraphicsCaptureItem > item; + ComPtr < IDirect3D11CaptureFramePool > pool; + ComPtr < IGraphicsCaptureSession > session; + + bool closed = false; +}; +/* *INDENT-ON* */ + +#define LOAD_SYMBOL(module,name,func) G_STMT_START { \ + if (!g_module_symbol (module, G_STRINGIFY (name), (gpointer *) &winrt_vtable.func)) { \ + GST_WARNING ("Failed to load '%s', %s", G_STRINGIFY (name), g_module_error()); \ + if (d3d11_module) \ + g_module_close (d3d11_module); \ + if (combase_module) \ + g_module_close (combase_module); \ + return; \ + } \ +} G_STMT_END + +gboolean +gst_d3d11_winrt_capture_load_library (void) +{ + static GModule *d3d11_module = nullptr; + static GModule *combase_module = nullptr; + + GST_D3D11_CALL_ONCE_BEGIN { + d3d11_module = g_module_open ("d3d11.dll", G_MODULE_BIND_LAZY); + /* Shouldn't happen... */ + if (!d3d11_module) + return; + + combase_module = g_module_open ("combase.dll", G_MODULE_BIND_LAZY); + if (!combase_module) { + g_module_close (d3d11_module); + return; + } + + LOAD_SYMBOL (d3d11_module, CreateDirect3D11DeviceFromDXGIDevice, + CreateDirect3D11DeviceFromDXGIDevice); + LOAD_SYMBOL (combase_module, RoInitialize, RoInitialize); + LOAD_SYMBOL (combase_module, RoUninitialize, RoUninitialize); + LOAD_SYMBOL (combase_module, WindowsCreateString, WindowsCreateString); + LOAD_SYMBOL (combase_module, WindowsDeleteString, WindowsDeleteString); + LOAD_SYMBOL (combase_module, RoGetActivationFactory, + RoGetActivationFactory); + + winrt_vtable.loaded = TRUE; + } + GST_D3D11_CALL_ONCE_END; + + return winrt_vtable.loaded; +} + +enum +{ + PROP_0, + PROP_D3D11_DEVICE, + PROP_MONITOR_HANDLE, + PROP_WINDOW_HANDLE, +}; + +struct _GstD3D11WinRTCapture +{ + GstD3D11ScreenCapture parent; + + GstD3D11Device *device; + GstD3D11WinRTCaptureInner *inner; + /* Reported by WGC API */ + SizeInt32 pool_size; + /* Actual texture resolution */ + UINT width; + UINT height; + + gboolean flushing; + boolean show_mouse; + boolean show_border; + + GThread *thread; + GMainContext *context; + GMainLoop *loop; + + CRITICAL_SECTION lock; + CONDITION_VARIABLE cond; + LARGE_INTEGER frequency; + + HMONITOR monitor_handle; + HWND window_handle; + + HWND hidden_window; +}; + +static void gst_d3d11_winrt_capture_constructed (GObject * object); +static void gst_d3d11_winrt_capture_dispose (GObject * object); +static void gst_d3d11_winrt_capture_finalize (GObject * object); +static void gst_d3d11_winrt_capture_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); + +static GstFlowReturn +gst_d3d11_winrt_capture_prepare (GstD3D11ScreenCapture * capture); +static gboolean +gst_d3d11_winrt_capture_get_size (GstD3D11ScreenCapture * capture, + guint * width, guint * height); +static gboolean +gst_d3d11_winrt_capture_get_colorimetry (GstD3D11ScreenCapture * capture, + GstVideoColorimetry * colorimetry); +static gboolean +gst_d3d11_winrt_capture_unlock (GstD3D11ScreenCapture * capture); +static gboolean +gst_d3d11_winrt_capture_unlock_stop (GstD3D11ScreenCapture * capture); +static void +gst_d3d11_winrt_capture_show_border (GstD3D11ScreenCapture * capture, + gboolean show); +static GstFlowReturn +gst_d3d11_winrt_capture_do_capture (GstD3D11ScreenCapture * capture, + GstD3D11Device * device, ID3D11Texture2D * texture, + ID3D11RenderTargetView * rtv, ID3D11VertexShader * vs, + ID3D11PixelShader * ps, ID3D11InputLayout * layout, + ID3D11SamplerState * sampler, ID3D11BlendState * blend, + D3D11_BOX * crop_box, gboolean draw_mouse); +static gpointer +gst_d3d11_winrt_capture_thread_func (GstD3D11WinRTCapture * self); + +#define gst_d3d11_winrt_capture_parent_class parent_class +G_DEFINE_TYPE (GstD3D11WinRTCapture, gst_d3d11_winrt_capture, + GST_TYPE_D3D11_SCREEN_CAPTURE); + +static void +gst_d3d11_winrt_capture_class_init (GstD3D11WinRTCaptureClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstD3D11ScreenCaptureClass *capture_class = + GST_D3D11_SCREEN_CAPTURE_CLASS (klass); + + gobject_class->constructed = gst_d3d11_winrt_capture_constructed; + gobject_class->dispose = gst_d3d11_winrt_capture_dispose; + gobject_class->finalize = gst_d3d11_winrt_capture_finalize; + gobject_class->set_property = gst_d3d11_winrt_capture_set_property; + + g_object_class_install_property (gobject_class, PROP_D3D11_DEVICE, + g_param_spec_object ("d3d11device", "D3D11 Device", + "GstD3D11Device object for operating", + GST_TYPE_D3D11_DEVICE, (GParamFlags) + (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (gobject_class, PROP_MONITOR_HANDLE, + g_param_spec_pointer ("monitor-handle", "Monitor Handle", + "A HMONITOR handle of monitor to capture", (GParamFlags) + (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (gobject_class, PROP_WINDOW_HANDLE, + g_param_spec_pointer ("window-handle", "Window Handle", + "A HWND handle of window to capture", (GParamFlags) + (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS))); + + capture_class->prepare = GST_DEBUG_FUNCPTR (gst_d3d11_winrt_capture_prepare); + capture_class->get_size = + GST_DEBUG_FUNCPTR (gst_d3d11_winrt_capture_get_size); + capture_class->get_colorimetry = + GST_DEBUG_FUNCPTR (gst_d3d11_winrt_capture_get_colorimetry); + capture_class->unlock = GST_DEBUG_FUNCPTR (gst_d3d11_winrt_capture_unlock); + capture_class->unlock_stop = + GST_DEBUG_FUNCPTR (gst_d3d11_winrt_capture_unlock_stop); + capture_class->show_border = + GST_DEBUG_FUNCPTR (gst_d3d11_winrt_capture_show_border); + capture_class->do_capture = + GST_DEBUG_FUNCPTR (gst_d3d11_winrt_capture_do_capture); +} + +static void +gst_d3d11_winrt_capture_init (GstD3D11WinRTCapture * self) +{ + InitializeCriticalSection (&self->lock); +} + +static void +gst_d3d11_winrt_capture_constructed (GObject * object) +{ + GstD3D11WinRTCapture *self = GST_D3D11_WINRT_CAPTURE (object); + GstD3D11CSLockGuard lk (&self->lock); + + self->context = g_main_context_new (); + self->loop = g_main_loop_new (self->context, FALSE); + self->thread = g_thread_new ("GstD3D11WinRTCapture", + (GThreadFunc) gst_d3d11_winrt_capture_thread_func, self); + while (!g_main_loop_is_running (self->loop)) + SleepConditionVariableCS (&self->cond, &self->lock, INFINITE); + + G_OBJECT_CLASS (parent_class)->constructed (object); +} + +static void +gst_d3d11_winrt_capture_dispose (GObject * object) +{ + GstD3D11WinRTCapture *self = GST_D3D11_WINRT_CAPTURE (object); + + if (self->loop) + g_main_loop_quit (self->loop); + + g_clear_pointer (&self->thread, g_thread_join); + g_clear_pointer (&self->loop, g_main_loop_unref); + g_clear_pointer (&self->context, g_main_context_unref); + + gst_clear_object (&self->device); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_d3d11_winrt_capture_finalize (GObject * object) +{ + GstD3D11WinRTCapture *self = GST_D3D11_WINRT_CAPTURE (object); + + DeleteCriticalSection (&self->lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_d3d11_winrt_capture_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstD3D11WinRTCapture *self = GST_D3D11_WINRT_CAPTURE (object); + + switch (prop_id) { + case PROP_D3D11_DEVICE: + self->device = (GstD3D11Device *) g_value_dup_object (value); + break; + case PROP_MONITOR_HANDLE: + self->monitor_handle = (HMONITOR) g_value_get_pointer (value); + break; + case PROP_WINDOW_HANDLE: + self->window_handle = (HWND) g_value_get_pointer (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_d3d11_winrt_capture_running_cb (GstD3D11WinRTCapture * self) +{ + GstD3D11CSLockGuard lk (&self->lock); + WakeAllConditionVariable (&self->cond); + + return G_SOURCE_REMOVE; +} + +static void +gst_d3d11_winrt_configure (GstD3D11WinRTCapture * self) +{ + HRESULT hr; + GstD3D11Device *device = self->device; + ComPtr < ID3D10Multithread > multi_thread; + ComPtr < IGraphicsCaptureItemInterop > interop; + ID3D11Device *device_handle; + ComPtr < IDXGIDevice > dxgi_device; + ComPtr < IInspectable > inspectable; + ComPtr < IDirect3D11CaptureFramePoolStatics > pool_statics; + ComPtr < IDirect3D11CaptureFramePoolStatics2 > pool_statics2; + ComPtr < IGraphicsCaptureSession2 > session2; + ComPtr < IGraphicsCaptureSession3 > session3; + GstD3D11WinRTCaptureInner *inner = nullptr; + + device_handle = gst_d3d11_device_get_device_handle (device); + hr = device_handle->QueryInterface (IID_PPV_ARGS (&multi_thread)); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "ID3D10Multithread interface is unavailable"); + return; + } + + multi_thread->SetMultithreadProtected (TRUE); + + hr = GstGetActivationFactory < IGraphicsCaptureItemInterop, + RuntimeClass_Windows_Graphics_Capture_GraphicsCaptureItem > (&interop); + if (!gst_d3d11_result (hr, device)) { + GST_WARNING_OBJECT (self, "IGraphicsCaptureItemInterop is not available"); + return; + } + + inner = new GstD3D11WinRTCaptureInner (); + + if (self->monitor_handle) { + hr = interop->CreateForMonitor (self->monitor_handle, + IID_PPV_ARGS (&inner->item)); + } else if (self->window_handle) { + hr = interop->CreateForWindow (self->window_handle, + IID_PPV_ARGS (&inner->item)); + } else { + g_assert_not_reached (); + goto error; + } + + if (!gst_d3d11_result (hr, device)) { + GST_WARNING_OBJECT (self, "Could not create item"); + goto error; + } + + hr = device_handle->QueryInterface (IID_PPV_ARGS (&dxgi_device)); + if (!gst_d3d11_result (hr, device)) { + GST_WARNING_OBJECT (self, "IDXGIDevice is not available"); + goto error; + } + + hr = winrt_vtable.CreateDirect3D11DeviceFromDXGIDevice (dxgi_device.Get (), + &inspectable); + if (!gst_d3d11_result (hr, device)) { + GST_WARNING_OBJECT (self, "CreateDirect3D11DeviceFromDXGIDevice failed"); + goto error; + } + + hr = inspectable.As (&inner->d3d_device); + if (!gst_d3d11_result (hr, device)) { + GST_WARNING_OBJECT (device, "IDirect3DDevice is not available"); + goto error; + } + + hr = GstGetActivationFactory < IDirect3D11CaptureFramePoolStatics, + RuntimeClass_Windows_Graphics_Capture_Direct3D11CaptureFramePool > + (&pool_statics); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, + "IDirect3D11CaptureFramePoolStatics is not available"); + goto error; + } + + hr = pool_statics.As (&pool_statics2); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, + "IDirect3D11CaptureFramePoolStatics2 is not available"); + goto error; + } + + hr = inner->item->get_Size (&self->pool_size); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Could not get item size"); + goto error; + } + + self->width = (UINT) self->pool_size.Width; + self->height = (UINT) self->pool_size.Height; + + hr = pool_statics2->CreateFreeThreaded (inner->d3d_device.Get (), + DirectXPixelFormat::DirectXPixelFormat_B8G8R8A8UIntNormalized, + 1, self->pool_size, &inner->pool); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Could not setup pool"); + goto error; + } + + hr = inner->pool->CreateCaptureSession (inner->item.Get (), &inner->session); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Could not create session"); + goto error; + } + + inner->session.As (&session2); + if (session2) + session2->put_IsCursorCaptureEnabled (FALSE); + + inner->session.As (&session3); + if (session3) + session3->put_IsBorderRequired (self->show_border); + + hr = inner->session->StartCapture (); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Could not start capture"); + goto error; + } + + self->inner = inner; + + return; + +error: + if (inner) + delete inner; +} + +static LRESULT CALLBACK +gst_d3d11_winrt_capture_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + GstD3D11WinRTCapture *self; + + if (msg == WM_CREATE) { + self = GST_D3D11_WINRT_CAPTURE (((LPCREATESTRUCTA) lparam)->lpCreateParams); + + SetPropA (hwnd, D3D11_WINRT_CAPTURE_PROP_NAME, self); + } else if (GetPropA (hwnd, D3D11_WINRT_CAPTURE_PROP_NAME) && + msg == WM_GST_D3D11_WINRT_CAPTURE_CLOSED) { + HANDLE handle = GetPropA (hwnd, D3D11_WINRT_CAPTURE_PROP_NAME); + + if (!GST_IS_D3D11_WINRT_CAPTURE (handle)) { + GST_WARNING ("%p is not d3d11window object", handle); + return DefWindowProcA (hwnd, msg, wparam, lparam); + } + + self = GST_D3D11_WINRT_CAPTURE (handle); + GST_INFO_OBJECT (self, "Target window got closed"); + GstD3D11CSLockGuard lk (&self->lock); + if (self->inner) + self->inner->closed = true; + WakeAllConditionVariable (&self->cond); + + return 0; + } + + return DefWindowProcA (hwnd, msg, wparam, lparam); +} + +static HWND +gst_d3d11_winrt_create_hidden_window (GstD3D11WinRTCapture * self) +{ + static SRWLOCK lock = SRWLOCK_INIT; + WNDCLASSEXA wc; + ATOM atom; + HINSTANCE inst = GetModuleHandle (nullptr); + + AcquireSRWLockExclusive (&lock); + atom = GetClassInfoExA (inst, "GstD3D11WinRTCapture", &wc); + if (atom == 0) { + ZeroMemory (&wc, sizeof (WNDCLASSEXA)); + + wc.cbSize = sizeof (WNDCLASSEXA); + wc.lpfnWndProc = gst_d3d11_winrt_capture_proc; + wc.hInstance = inst; + wc.style = CS_OWNDC; + wc.lpszClassName = "GstD3D11WinRTCapture"; + + atom = RegisterClassExA (&wc); + ReleaseSRWLockExclusive (&lock); + + if (atom == 0) { + GST_ERROR_OBJECT (self, "Failed to register window class 0x%x", + (guint) GetLastError ()); + return nullptr; + } + } else { + ReleaseSRWLockExclusive (&lock); + } + + return CreateWindowExA (0, "GstD3D11WinRTCapture", "GstD3D11WinRTCapture", + WS_POPUP, 0, 0, 1, 1, nullptr, nullptr, inst, self); +} + +static void CALLBACK +event_hook_func (HWINEVENTHOOK hook, DWORD event, HWND hwnd, LONG id_obj, + LONG id_child, DWORD id_event_thread, DWORD event_time) +{ + if (event != EVENT_OBJECT_DESTROY || id_obj != OBJID_WINDOW || + id_child != INDEXID_CONTAINER || !hwnd) { + return; + } + + GstD3D11SRWLockGuard lk (&capture_list_lock); + GList *iter; + + for (iter = capture_list; iter; iter = g_list_next (iter)) { + GstD3D11WinRTCapture *capture = GST_D3D11_WINRT_CAPTURE (iter->data); + GstD3D11CSLockGuard capture_lk (&capture->lock); + + if (capture->hidden_window && capture->window_handle == hwnd) { + PostMessageA (capture->hidden_window, WM_GST_D3D11_WINRT_CAPTURE_CLOSED, + 0, 0); + return; + } + } +} + +static gboolean +gst_d3d11_winrt_capture_msg_cb (GIOChannel * source, GIOCondition condition, + gpointer data) +{ + MSG msg; + + if (!PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) + return G_SOURCE_CONTINUE; + + TranslateMessage (&msg); + DispatchMessage (&msg); + + return G_SOURCE_CONTINUE; +} + +static void +gst_d3d11_winrt_capture_weak_ref_notify (gpointer data, + GstD3D11WinRTCapture * self) +{ + GstD3D11SRWLockGuard lk (&capture_list_lock); + capture_list = g_list_remove (capture_list, self); +} + +static gpointer +gst_d3d11_winrt_capture_thread_func (GstD3D11WinRTCapture * self) +{ + GSource *source; + GSource *msg_source = nullptr; + GIOChannel *msg_io_channel = nullptr; + HWINEVENTHOOK hook = nullptr; +#if HAVE_WINMM + TIMECAPS time_caps; + guint timer_res = 0; + + if (timeGetDevCaps (&time_caps, sizeof (TIMECAPS)) == TIMERR_NOERROR) { + guint resolution; + + resolution = MIN (MAX (time_caps.wPeriodMin, 1), time_caps.wPeriodMax); + + if (timeBeginPeriod (resolution) != TIMERR_NOERROR) + timer_res = resolution; + } +#endif + + QueryPerformanceFrequency (&self->frequency); + + winrt_vtable.RoInitialize (RO_INIT_MULTITHREADED); + g_main_context_push_thread_default (self->context); + + source = g_idle_source_new (); + g_source_set_callback (source, + (GSourceFunc) gst_d3d11_winrt_capture_running_cb, self, nullptr); + g_source_attach (source, self->context); + g_source_unref (source); + + gst_d3d11_winrt_configure (self); + if (self->inner && self->window_handle) { + /* hold list of capture objects to send target window closed event */ + AcquireSRWLockExclusive (&capture_list_lock); + g_object_weak_ref (G_OBJECT (self), + (GWeakNotify) gst_d3d11_winrt_capture_weak_ref_notify, nullptr); + capture_list = g_list_append (capture_list, self); + ReleaseSRWLockExclusive (&capture_list_lock); + + self->hidden_window = gst_d3d11_winrt_create_hidden_window (self); + if (self->hidden_window) { + DWORD process_id, thread_id; + + thread_id = GetWindowThreadProcessId (self->window_handle, &process_id); + if (thread_id) { + hook = SetWinEventHook (EVENT_OBJECT_DESTROY, EVENT_OBJECT_DESTROY, + nullptr, event_hook_func, process_id, thread_id, + WINEVENT_OUTOFCONTEXT); + } + + msg_io_channel = + g_io_channel_win32_new_messages ((guintptr) self->hidden_window); + msg_source = g_io_create_watch (msg_io_channel, G_IO_IN); + g_source_set_callback (msg_source, + (GSourceFunc) gst_d3d11_winrt_capture_msg_cb, self, nullptr); + g_source_attach (msg_source, self->context); + } + } + + g_main_loop_run (self->loop); + + if (hook) + UnhookWinEvent (hook); + + EnterCriticalSection (&self->lock); + if (self->hidden_window) { + RemovePropA (self->hidden_window, D3D11_WINRT_CAPTURE_PROP_NAME); + DestroyWindow (self->hidden_window); + self->hidden_window = nullptr; + } + LeaveCriticalSection (&self->lock); + + if (msg_source) { + g_source_destroy (msg_source); + g_source_unref (msg_source); + } + + if (msg_io_channel) + g_io_channel_unref (msg_io_channel); + + if (self->inner) + delete self->inner; + self->inner = nullptr; + + g_main_context_pop_thread_default (self->context); + winrt_vtable.RoUninitialize (); + +#if HAVE_WINMM + if (timer_res != 0) + timeEndPeriod (timer_res); +#endif + + return nullptr; +} + +static GstFlowReturn +gst_d3d11_winrt_capture_prepare (GstD3D11ScreenCapture * capture) +{ + GstD3D11WinRTCapture *self = GST_D3D11_WINRT_CAPTURE (capture); + + g_assert (self->inner != nullptr); + + return GST_FLOW_OK; +} + +static gboolean +gst_d3d11_winrt_capture_get_size (GstD3D11ScreenCapture * capture, + guint * width, guint * height) +{ + GstD3D11WinRTCapture *self = GST_D3D11_WINRT_CAPTURE (capture); + + *width = self->width; + *height = self->height; + + return TRUE; +} + +static gboolean +gst_d3d11_winrt_capture_get_colorimetry (GstD3D11ScreenCapture * capture, + GstVideoColorimetry * colorimetry) +{ + return FALSE; +} + +static gboolean +gst_d3d11_winrt_capture_unlock (GstD3D11ScreenCapture * capture) +{ + GstD3D11WinRTCapture *self = GST_D3D11_WINRT_CAPTURE (capture); + GstD3D11CSLockGuard lk (&self->lock); + + self->flushing = TRUE; + WakeAllConditionVariable (&self->cond); + + return TRUE; +} + +static gboolean +gst_d3d11_winrt_capture_unlock_stop (GstD3D11ScreenCapture * capture) +{ + GstD3D11WinRTCapture *self = GST_D3D11_WINRT_CAPTURE (capture); + GstD3D11CSLockGuard lk (&self->lock); + + self->flushing = FALSE; + WakeAllConditionVariable (&self->cond); + + return TRUE; +} + +static void +gst_d3d11_winrt_capture_show_border (GstD3D11ScreenCapture * capture, + gboolean show) +{ + GstD3D11WinRTCapture *self = GST_D3D11_WINRT_CAPTURE (capture); + GstD3D11CSLockGuard lk (&self->lock); + + self->show_border = show; + if (self->inner->session) { + ComPtr < IGraphicsCaptureSession3 > session3; + self->inner->session.As (&session3); + + if (session3) + session3->put_IsBorderRequired (self->show_border); + } +} + +static GstFlowReturn +gst_d3d11_winrt_capture_do_capture (GstD3D11ScreenCapture * capture, + GstD3D11Device * device, ID3D11Texture2D * texture, + ID3D11RenderTargetView * rtv, ID3D11VertexShader * vs, + ID3D11PixelShader * ps, ID3D11InputLayout * layout, + ID3D11SamplerState * sampler, ID3D11BlendState * blend, + D3D11_BOX * crop_box, gboolean draw_mouse) +{ + GstD3D11WinRTCapture *self = GST_D3D11_WINRT_CAPTURE (capture); + GstD3D11WinRTCaptureInner *inner = self->inner; + ComPtr < IDirect3D11CaptureFrame > frame; + ComPtr < IDirect3DSurface > surface; + ComPtr < IDirect3DDxgiInterfaceAccess > access; + ComPtr < ID3D11Texture2D > captured_texture; + ID3D11DeviceContext *context_handle; + SizeInt32 size; + HRESULT hr; + LARGE_INTEGER now; + LONGLONG timeout; + D3D11_TEXTURE2D_DESC desc; + gboolean size_changed = FALSE; + + GstD3D11CSLockGuard lk (&self->lock); +again: + frame = nullptr; + surface = nullptr; + access = nullptr; + captured_texture = nullptr; + + if (inner->closed) { + GST_ERROR_OBJECT (self, "Item was closed"); + return GST_FLOW_ERROR; + } + + if (self->flushing) { + GST_INFO_OBJECT (self, "We are flushing"); + return GST_FLOW_FLUSHING; + } + + if ((draw_mouse && !self->show_mouse) || (!draw_mouse && self->show_mouse)) { + ComPtr < IGraphicsCaptureSession2 > session2; + self->show_mouse = draw_mouse; + + inner->session.As (&session2); + if (session2) { + hr = session2->put_IsCursorCaptureEnabled (draw_mouse); + if (!gst_d3d11_result (hr, self->device)) + GST_DEBUG_OBJECT (self, "Could not set IsCursorCaptureEnabled"); + } else { + GST_LOG_OBJECT (self, "IGraphicsCaptureSession2 is not available"); + } + } + + /* Magic number 5 sec timeout */ + QueryPerformanceCounter (&now); + timeout = now.QuadPart + 5 * self->frequency.QuadPart; + + do { + hr = inner->pool->TryGetNextFrame (&frame); + if (frame) + break; + + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Could not capture frame"); + return GST_FLOW_ERROR; + } + + SleepConditionVariableCS (&self->cond, &self->lock, 1); + QueryPerformanceCounter (&now); + } while (!inner->closed && !self->flushing && now.QuadPart < timeout); + + if (self->flushing) { + GST_INFO_OBJECT (self, "We are flushing"); + return GST_FLOW_FLUSHING; + } + + if (inner->closed) { + GST_WARNING_OBJECT (self, "Capture item was closed"); + return GST_FLOW_ERROR; + } + + if (!frame) { + GST_WARNING_OBJECT (self, "No frame available"); + return GST_D3D11_SCREEN_CAPTURE_FLOW_EXPECTED_ERROR; + } + + hr = frame->get_ContentSize (&size); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Could not get content size"); + return GST_FLOW_ERROR; + } + + if (size.Width != self->pool_size.Width || + size.Height != self->pool_size.Height) { + GST_DEBUG_OBJECT (self, "Size changed %dx%d -> %dx%d", + self->pool_size.Width, self->pool_size.Height, size.Width, size.Height); + self->pool_size = size; + frame = nullptr; + hr = inner->pool->Recreate (inner->d3d_device.Get (), + DirectXPixelFormat::DirectXPixelFormat_B8G8R8A8UIntNormalized, + 1, self->pool_size); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Could not recreate"); + return GST_FLOW_ERROR; + } + + size_changed = TRUE; + goto again; + } + + hr = frame->get_Surface (&surface); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Could not get IDirect3DSurface"); + return GST_FLOW_ERROR; + } + + hr = surface.As (&access); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Could not get IDirect3DDxgiInterfaceAccess"); + return GST_FLOW_ERROR; + } + + hr = access->GetInterface (IID_PPV_ARGS (&captured_texture)); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Could not get texture from frame"); + return GST_FLOW_ERROR; + } + + /* XXX: actual texture size can be different from reported pool size */ + captured_texture->GetDesc (&desc); + if (desc.Width != self->width || desc.Height != self->height) { + GST_DEBUG_OBJECT (self, "Texture size changed %dx%d -> %dx%d", + self->width, self->height, desc.Width, desc.Height); + self->width = desc.Width; + self->height = desc.Height; + size_changed = TRUE; + } + + if (size_changed) + return GST_D3D11_SCREEN_CAPTURE_FLOW_SIZE_CHANGED; + + context_handle = gst_d3d11_device_get_device_context_handle (self->device); + GstD3D11DeviceLockGuard device_lk (self->device); + context_handle->CopySubresourceRegion (texture, 0, 0, 0, 0, + captured_texture.Get (), 0, crop_box); + + return GST_FLOW_OK; +} + +GstD3D11ScreenCapture * +gst_d3d11_winrt_capture_new (GstD3D11Device * device, HMONITOR monitor_handle, + HWND window_handle) +{ + GstD3D11WinRTCapture *self; + + if (window_handle && !IsWindow (window_handle)) { + GST_WARNING_OBJECT (device, "Not a valid window handle"); + return nullptr; + } + + if (!gst_d3d11_winrt_capture_load_library ()) + return nullptr; + + self = (GstD3D11WinRTCapture *) g_object_new (GST_TYPE_D3D11_WINRT_CAPTURE, + "d3d11device", device, "monitor-handle", (gpointer) monitor_handle, + "window-handle", (gpointer) window_handle, nullptr); + if (!self->inner) { + gst_clear_object (&self); + return nullptr; + } + + gst_object_ref_sink (self); + + return GST_D3D11_SCREEN_CAPTURE_CAST (self); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/gstd3d11winrtcapture.h
Added
@@ -0,0 +1,41 @@ +/* + * GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/d3d11/gstd3d11.h> +#include "gstd3d11screencapture.h" + +G_BEGIN_DECLS + +#define GST_TYPE_D3D11_WINRT_CAPTURE (gst_d3d11_winrt_capture_get_type()) +G_DECLARE_FINAL_TYPE (GstD3D11WinRTCapture, gst_d3d11_winrt_capture, + GST, D3D11_WINRT_CAPTURE, GstD3D11ScreenCapture); + +gboolean gst_d3d11_winrt_capture_load_library (void); + +GstD3D11ScreenCapture * gst_d3d11_winrt_capture_new (GstD3D11Device * device, + HMONITOR monitor_handle, + HWND window_handle); + +G_END_DECLS +
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/meson.build
Changed
@@ -1,31 +1,26 @@ d3d11_sources = + 'gstd3d11av1dec.cpp', 'gstd3d11basefilter.cpp', - 'gstd3d11convert.cpp', - 'gstd3d11converter.cpp', 'gstd3d11compositor.cpp', - 'gstd3d11compositorbin.cpp', + 'gstd3d11convert.cpp', + 'gstd3d11decoder.cpp', + 'gstd3d11deinterlace.cpp', 'gstd3d11download.cpp', + 'gstd3d11h264dec.cpp', + 'gstd3d11h265dec.cpp', + 'gstd3d11mpeg2dec.cpp', 'gstd3d11overlaycompositor.cpp', 'gstd3d11pluginutils.cpp', - 'gstd3d11shader.cpp', + 'gstd3d11testsrc.cpp', 'gstd3d11upload.cpp', - 'gstd3d11videoprocessor.cpp', 'gstd3d11videosink.cpp', + 'gstd3d11vp8dec.cpp', + 'gstd3d11vp9dec.cpp', 'gstd3d11window.cpp', 'gstd3d11window_dummy.cpp', 'plugin.cpp', -d3d11_dec_sources = - 'gstd3d11av1dec.cpp', - 'gstd3d11decoder.cpp', - 'gstd3d11h264dec.cpp', - 'gstd3d11vp9dec.cpp', - 'gstd3d11h265dec.cpp', - 'gstd3d11mpeg2dec.cpp', - 'gstd3d11vp8dec.cpp', - - extra_c_args = '-DCOBJMACROS' extra_args = '-DGST_USE_UNSTABLE_API' extra_dep = @@ -35,33 +30,15 @@ subdir_done() endif -if not gstd3d11_dep.found() +if not gstd3d11_dep.found() or not cc.has_header('dxva.h') or not cc.has_header('d3d9.h') if d3d11_option.enabled() error('The d3d11 was enabled explicitly, but required dependencies were not found.') endif subdir_done() endif -d3dcompiler_lib = cc.find_library('d3dcompiler', required: d3d11_option) runtimeobject_lib = cc.find_library('runtimeobject', required : false) winmm_lib = cc.find_library('winmm', required: false) -has_decoder = false - -have_d3d11 = cc.has_header('d3dcompiler.h') -if not have_d3d11 - if d3d11_option.enabled() - error('The d3d11 plugin was enabled explicitly, but required dependencies were not found.') - endif - subdir_done() -endif - -# d3d11 video api uses dxva structure for decoding, and dxva.h needs d3d9 types -if cc.has_header('dxva.h') and cc.has_header('d3d9.h') - d3d11_sources += d3d11_dec_sources - extra_args += '-DHAVE_DXVA_H' - extra_dep += gstcodecs_dep - has_decoder = true -endif if d3d11_winapi_only_app and (not d3dcompiler_lib.found() or not runtimeobject_lib.found()) if d3d11_option.enabled() @@ -70,36 +47,51 @@ subdir_done() endif +have_wgc = cxx.compiles(''' + #include<windows.h> + #include<winstring.h> + #include<roapi.h> + #include<windows.graphics.capture.h>, + #include<windows.graphics.capture.interop.h> + #include<windows.graphics.directx.direct3d11.h> + #include<windows.graphics.directx.direct3d11.interop.h> + #include<wrl.h> + using namespace Microsoft::WRL; + using namespace ABI::Windows::Graphics::Capture; + ComPtr<IDirect3D11CaptureFramePoolStatics> pool_statics; + ComPtr<IDirect3D11CaptureFramePoolStatics2> pool_statics2; + ComPtr<IDirect3D11CaptureFramePool> pool; + ComPtr<IGraphicsCaptureSession> session; + ComPtr<IGraphicsCaptureSession2> session2; + ComPtr<IGraphicsCaptureSession3> session3; + ''', + name: 'Windows Graphics Capture support in Windows SDK') + # if build target is Windows 10 and WINAPI_PARTITION_APP is allowed, # we can build UWP only modules as well if d3d11_winapi_app d3d11_sources += 'gstd3d11window_corewindow.cpp', 'gstd3d11window_swapchainpanel.cpp' - extra_dep += runtimeobject_lib, d3dcompiler_lib + extra_dep += runtimeobject_lib endif if d3d11_winapi_desktop - d3d11_sources += 'gstd3d11window_win32.cpp' - if d3d11_conf.get('GST_D3D11_DXGI_HEADER_VERSION') >= 6 - # Desktop Duplication API is unavailable for UWP - # and MinGW is not supported due to some missing headers - extra_args += '-DHAVE_DXGI_DESKTOP_DUP' - d3d11_sources += 'gstd3d11screencapture.cpp', - 'gstd3d11screencapturedevice.cpp', - 'gstd3d11screencapturesrc.cpp' - message('Enable D3D11 Desktop Duplication API') - endif + d3d11_sources += 'gstd3d11dxgicapture.cpp', + 'gstd3d11screencapture.cpp', + 'gstd3d11screencapturedevice.cpp', + 'gstd3d11screencapturesrc.cpp', + 'gstd3d11window_win32.cpp' + # multimedia clock is desktop only API - if has_decoder and winmm_lib.found() and cc.has_header('mmsystem.h') + if winmm_lib.found() and cc.has_header('mmsystem.h') extra_args += '-DHAVE_WINMM' extra_dep += winmm_lib endif -endif -# need dxgi1_5.h for HDR10 processing and d3d11_4.h for ID3D11VideoContext2 interface -if d3d11_conf.get('GST_D3D11_DXGI_HEADER_VERSION') >= 5 and d3d11_conf.get('GST_D3D11_HEADER_VERSION') >= 4 - d3d11_sources += 'gstd3d11deinterlace.cpp' - extra_args += '-DHAVE_D3D11_VIDEO_PROC' + if have_wgc + d3d11_sources += 'gstd3d11winrtcapture.cpp' + extra_args += '-DHAVE_WINRT_CAPTURE' + endif endif # MinGW 32bits compiler seems to be complaining about redundant-decls @@ -117,9 +109,8 @@ c_args : gst_plugins_bad_args + extra_c_args + extra_args, cpp_args: gst_plugins_bad_args + extra_args, include_directories : configinc, - dependencies : gstbase_dep, gstvideo_dep, gmodule_dep, gstcontroller_dep, gstd3d11_dep + extra_dep, + dependencies : gstbase_dep, gstvideo_dep, gmodule_dep, gstcontroller_dep, gstd3d11_dep, gstcodecs_dep + extra_dep, install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstd3d11, install_dir : plugins_pkgconfig_install_dir) plugins += gstd3d11
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3d11/plugin.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/d3d11/plugin.cpp
Changed
@@ -66,37 +66,34 @@ #include "gstd3d11upload.h" #include "gstd3d11download.h" #include "gstd3d11convert.h" -#include "gstd3d11shader.h" #include "gstd3d11compositor.h" -#include "gstd3d11compositorbin.h" -#ifdef HAVE_DXVA_H #include "gstd3d11h264dec.h" #include "gstd3d11h265dec.h" #include "gstd3d11vp9dec.h" #include "gstd3d11vp8dec.h" #include "gstd3d11mpeg2dec.h" #include "gstd3d11av1dec.h" -#endif -#ifdef HAVE_DXGI_DESKTOP_DUP +#include "gstd3d11deinterlace.h" +#include "gstd3d11testsrc.h" + +#if !GST_D3D11_WINAPI_ONLY_APP #include "gstd3d11screencapturesrc.h" #include "gstd3d11screencapturedevice.h" #endif -#ifdef HAVE_D3D11_VIDEO_PROC -#include "gstd3d11deinterlace.h" -#endif + +#include <wrl.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ GST_DEBUG_CATEGORY (gst_d3d11_debug); -GST_DEBUG_CATEGORY (gst_d3d11_shader_debug); -GST_DEBUG_CATEGORY (gst_d3d11_converter_debug); GST_DEBUG_CATEGORY (gst_d3d11_plugin_utils_debug); GST_DEBUG_CATEGORY (gst_d3d11_format_debug); GST_DEBUG_CATEGORY (gst_d3d11_device_debug); GST_DEBUG_CATEGORY (gst_d3d11_overlay_compositor_debug); GST_DEBUG_CATEGORY (gst_d3d11_window_debug); GST_DEBUG_CATEGORY (gst_d3d11_video_processor_debug); -GST_DEBUG_CATEGORY (gst_d3d11_compositor_debug); - -#ifdef HAVE_DXVA_H GST_DEBUG_CATEGORY (gst_d3d11_decoder_debug); GST_DEBUG_CATEGORY (gst_d3d11_h264_dec_debug); GST_DEBUG_CATEGORY (gst_d3d11_h265_dec_debug); @@ -104,17 +101,13 @@ GST_DEBUG_CATEGORY (gst_d3d11_vp8_dec_debug); GST_DEBUG_CATEGORY (gst_d3d11_mpeg2_dec_debug); GST_DEBUG_CATEGORY (gst_d3d11_av1_dec_debug); -#endif +GST_DEBUG_CATEGORY (gst_d3d11_deinterlace_debug); -#ifdef HAVE_DXGI_DESKTOP_DUP +#if !GST_D3D11_WINAPI_ONLY_APP GST_DEBUG_CATEGORY (gst_d3d11_screen_capture_debug); GST_DEBUG_CATEGORY (gst_d3d11_screen_capture_device_debug); #endif -#ifdef HAVE_D3D11_VIDEO_PROC -GST_DEBUG_CATEGORY (gst_d3d11_deinterlace_debug); -#endif - #define GST_CAT_DEFAULT gst_d3d11_debug static gboolean @@ -122,13 +115,10 @@ { GstRank video_sink_rank = GST_RANK_PRIMARY; D3D_FEATURE_LEVEL max_feature_level = D3D_FEATURE_LEVEL_9_3; - guint i; + HRESULT hr; + ComPtr < IDXGIFactory1 > factory; GST_DEBUG_CATEGORY_INIT (gst_d3d11_debug, "d3d11", 0, "direct3d 11 plugin"); - GST_DEBUG_CATEGORY_INIT (gst_d3d11_shader_debug, - "d3d11shader", 0, "d3d11shader"); - GST_DEBUG_CATEGORY_INIT (gst_d3d11_converter_debug, - "d3d11converter", 0, "d3d11converter"); GST_DEBUG_CATEGORY_INIT (gst_d3d11_plugin_utils_debug, "d3d11pluginutils", 0, "d3d11 plugin utility functions"); GST_DEBUG_CATEGORY_INIT (gst_d3d11_overlay_compositor_debug, @@ -137,14 +127,12 @@ "d3d11window", 0, "d3d11window"); GST_DEBUG_CATEGORY_INIT (gst_d3d11_video_processor_debug, "d3d11videoprocessor", 0, "d3d11videoprocessor"); - GST_DEBUG_CATEGORY_INIT (gst_d3d11_compositor_debug, - "d3d11compositor", 0, "d3d11compositor element"); - if (!gst_d3d11_shader_init ()) { - GST_WARNING ("Cannot initialize d3d11 shader"); + if (!gst_d3d11_compile_init ()) { + GST_WARNING ("Cannot initialize d3d11 compiler"); return TRUE; } -#ifdef HAVE_DXVA_H + /* DXVA2 API is availble since Windows 8 */ if (gst_d3d11_is_windows_8_or_greater ()) { GST_DEBUG_CATEGORY_INIT (gst_d3d11_decoder_debug, @@ -161,25 +149,29 @@ "d3d11mpeg2dec", 0, "Direct3D11 MPEG2 Decoder"); GST_DEBUG_CATEGORY_INIT (gst_d3d11_av1_dec_debug, "d3d11av1dec", 0, "Direct3D11 AV1 Decoder"); + GST_DEBUG_CATEGORY_INIT (gst_d3d11_deinterlace_debug, + "d3d11deinterlace", 0, "Direct3D11 Deinterlacer"); } -#endif -#ifdef HAVE_D3D11_VIDEO_PROC - GST_DEBUG_CATEGORY_INIT (gst_d3d11_deinterlace_debug, - "d3d11deinterlace", 0, "Direct3D11 Deinterlacer"); -#endif + hr = CreateDXGIFactory1 (IID_PPV_ARGS (&factory)); + if (FAILED (hr)) + return TRUE; /* Enumerate devices to register decoders per device and to get the highest * feature level */ - /* AMD seems supporting up to 12 cards, and 8 for NVIDIA */ - for (i = 0; i < 12; i++) { - GstD3D11Device *device = NULL; + for (guint i = 0;; i++) { + ComPtr < IDXGIAdapter1 > adapter; + GstD3D11Device *device; ID3D11Device *device_handle; D3D_FEATURE_LEVEL feature_level; + hr = factory->EnumAdapters1 (i, &adapter); + if (FAILED (hr)) + break; + device = gst_d3d11_device_new (i, D3D11_CREATE_DEVICE_BGRA_SUPPORT); if (!device) - break; + continue; device_handle = gst_d3d11_device_get_device_handle (device); feature_level = device_handle->GetFeatureLevel (); @@ -187,33 +179,26 @@ if (feature_level > max_feature_level) max_feature_level = feature_level; -#ifdef HAVE_DXVA_H /* DXVA2 API is availble since Windows 8 */ if (gst_d3d11_is_windows_8_or_greater () && gst_d3d11_device_get_video_device_handle (device)) { gboolean legacy = gst_d3d11_decoder_util_is_legacy_device (device); - gst_d3d11_h264_dec_register (plugin, device, GST_RANK_SECONDARY, legacy); + /* avdec_h264 has primary rank, make this higher than it */ + gst_d3d11_h264_dec_register (plugin, + device, GST_RANK_PRIMARY + 1, legacy); if (!legacy) { - gst_d3d11_h265_dec_register (plugin, device, GST_RANK_SECONDARY); - gst_d3d11_vp9_dec_register (plugin, device, GST_RANK_SECONDARY); - gst_d3d11_vp8_dec_register (plugin, device, GST_RANK_SECONDARY); + /* avdec_h265 has primary rank, make this higher than it */ + gst_d3d11_h265_dec_register (plugin, device, GST_RANK_PRIMARY + 1); + gst_d3d11_vp9_dec_register (plugin, device, GST_RANK_PRIMARY); + gst_d3d11_vp8_dec_register (plugin, device, GST_RANK_PRIMARY); + /* rust dav1ddec has "primary" rank */ + gst_d3d11_av1_dec_register (plugin, device, GST_RANK_PRIMARY + 1); gst_d3d11_mpeg2_dec_register (plugin, device, GST_RANK_SECONDARY); - gst_d3d11_av1_dec_register (plugin, device, GST_RANK_SECONDARY); } - } -#endif - -#ifdef HAVE_D3D11_VIDEO_PROC - /* D3D11 video processor API is availble since Windows 8 */ - if (gst_d3d11_is_windows_8_or_greater ()) { - gboolean hardware; - g_object_get (device, "hardware", &hardware, NULL); - if (hardware) - gst_d3d11_deinterlace_register (plugin, device, GST_RANK_MARGINAL); + gst_d3d11_deinterlace_register (plugin, device, GST_RANK_MARGINAL); } -#endif gst_object_unref (device); } @@ -246,11 +231,11 @@ "d3d11videosink", video_sink_rank, GST_TYPE_D3D11_VIDEO_SINK); gst_element_register (plugin, - "d3d11compositorelement", GST_RANK_NONE, GST_TYPE_D3D11_COMPOSITOR); + "d3d11compositor", GST_RANK_SECONDARY, GST_TYPE_D3D11_COMPOSITOR); gst_element_register (plugin, - "d3d11compositor", GST_RANK_SECONDARY, GST_TYPE_D3D11_COMPOSITOR_BIN); + "d3d11testsrc", GST_RANK_NONE, GST_TYPE_D3D11_TEST_SRC); -#ifdef HAVE_DXGI_DESKTOP_DUP +#if !GST_D3D11_WINAPI_ONLY_APP if (gst_d3d11_is_windows_8_or_greater ()) { GST_DEBUG_CATEGORY_INIT (gst_d3d11_screen_capture_debug, "d3d11screencapturesrc", 0, "d3d11screencapturesrc");
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3dvideosink/d3dhelpers.c -> gst-plugins-bad-1.22.0.tar.xz/sys/d3dvideosink/d3dhelpers.c
Changed
@@ -2140,11 +2140,13 @@ gchar *utfrep = g_utf16_to_utf8 (wcrep, 128, NULL, NULL, NULL); if (utfrep) { if (message == WM_KEYDOWN) - gst_navigation_send_key_event (GST_NAVIGATION (sink), "key-press", - utfrep); + gst_navigation_send_event_simple (GST_NAVIGATION (sink), + gst_navigation_event_new_key_press (utfrep, + GST_NAVIGATION_MODIFIER_NONE)); else if (message == WM_KEYUP) - gst_navigation_send_key_event (GST_NAVIGATION (sink), - "key-release", utfrep); + gst_navigation_send_event_simple (GST_NAVIGATION (sink), + gst_navigation_event_new_key_release (utfrep, + GST_NAVIGATION_MODIFIER_NONE)); g_free (utfrep); } } @@ -2161,45 +2163,45 @@ if (sink->enable_navigation_events && d3d_get_render_coordinates (sink, LOWORD (lParam), HIWORD (lParam), &x, &y)) { - gint button; - const gchar *action = NULL; switch (message) { case WM_MOUSEMOVE: - button = 0; - action = "mouse-move"; + gst_navigation_send_event_simple (GST_NAVIGATION (sink), + gst_navigation_event_new_mouse_move (x, y, + GST_NAVIGATION_MODIFIER_NONE)); break; case WM_LBUTTONDOWN: - button = 1; - action = "mouse-button-press"; + gst_navigation_send_event_simple (GST_NAVIGATION (sink), + gst_navigation_event_new_mouse_button_press (1, x, y, + GST_NAVIGATION_MODIFIER_NONE)); break; case WM_LBUTTONUP: - button = 1; - action = "mouse-button-release"; + gst_navigation_send_event_simple (GST_NAVIGATION (sink), + gst_navigation_event_new_mouse_button_release (1, x, y, + GST_NAVIGATION_MODIFIER_NONE)); break; case WM_RBUTTONDOWN: - button = 2; - action = "mouse-button-press"; + gst_navigation_send_event_simple (GST_NAVIGATION (sink), + gst_navigation_event_new_mouse_button_press (2, x, y, + GST_NAVIGATION_MODIFIER_NONE)); break; case WM_RBUTTONUP: - button = 2; - action = "mouse-button-release"; + gst_navigation_send_event_simple (GST_NAVIGATION (sink), + gst_navigation_event_new_mouse_button_release (2, x, y, + GST_NAVIGATION_MODIFIER_NONE)); break; case WM_MBUTTONDOWN: - button = 3; - action = "mouse-button-press"; + gst_navigation_send_event_simple (GST_NAVIGATION (sink), + gst_navigation_event_new_mouse_button_press (3, x, y, + GST_NAVIGATION_MODIFIER_NONE)); break; case WM_MBUTTONUP: - button = 3; - action = "mouse-button-release"; + gst_navigation_send_event_simple (GST_NAVIGATION (sink), + gst_navigation_event_new_mouse_button_release (3, x, y, + GST_NAVIGATION_MODIFIER_NONE)); break; default: break; } - if (action) { - /* GST_DEBUG_OBJECT(sink, "%s: %lfx%lf", action, x, y); */ - gst_navigation_send_mouse_event (GST_NAVIGATION (sink), action, - button, x, y); - } } break; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3dvideosink/d3dvideosink.c -> gst-plugins-bad-1.22.0.tar.xz/sys/d3dvideosink/d3dvideosink.c
Changed
@@ -70,7 +70,7 @@ static void gst_d3dvideosink_navigation_interface_init (GstNavigationInterface * iface); static void gst_d3dvideosink_navigation_send_event (GstNavigation * navigation, - GstStructure * structure); + GstEvent * event); /* GObject */ static void gst_d3dvideosink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -157,8 +157,8 @@ (GParamFlags) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gst_element_class_set_static_metadata (gstelement_class, - "Direct3D video sink", "Sink/Video", - "Display data using a Direct3D video renderer", + "Direct3D9 video sink", "Sink/Video", + "Display data using a Direct3D9 video renderer", "David Hoyt <dhoyt@hoytsoft.org>, Roland Krikava <info@bluedigits.com>"); gst_element_class_add_static_pad_template (gstelement_class, &sink_template); @@ -580,7 +580,7 @@ static void gst_d3dvideosink_navigation_interface_init (GstNavigationInterface * iface) { - iface->send_event = gst_d3dvideosink_navigation_send_event; + iface->send_event_simple = gst_d3dvideosink_navigation_send_event; } /* Video Render Code */ @@ -622,23 +622,19 @@ static void gst_d3dvideosink_navigation_send_event (GstNavigation * navigation, - GstStructure * structure) + GstEvent * event) { GstD3DVideoSink *sink = GST_D3DVIDEOSINK (navigation); - GstEvent *e; - - if ((e = gst_event_new_navigation (structure))) { - GstPad *pad; - if ((pad = gst_pad_get_peer (GST_VIDEO_SINK_PAD (sink)))) { - if (!gst_pad_send_event (pad, gst_event_ref (e))) { - /* If upstream didn't handle the event we'll post a message with it - * for the application in case it wants to do something with it */ - gst_element_post_message (GST_ELEMENT_CAST (sink), - gst_navigation_message_new_event (GST_OBJECT_CAST (sink), e)); - } - gst_event_unref (e); - gst_object_unref (pad); + + GstPad *pad; + if ((pad = gst_pad_get_peer (GST_VIDEO_SINK_PAD (sink)))) { + if (!gst_pad_send_event (pad, gst_event_ref (event))) { + /* If upstream didn't handle the event we'll post a message with it + * for the application in case it wants to do something with it */ + gst_element_post_message (GST_ELEMENT_CAST (sink), + gst_navigation_message_new_event (GST_OBJECT_CAST (sink), event)); } + gst_object_unref (pad); } } @@ -649,7 +645,6 @@ static gboolean plugin_init (GstPlugin * plugin) { - /* PRIMARY: this is the best videosink to use on windows */ if (!gst_element_register (plugin, ELEMENT_NAME, GST_RANK_SECONDARY, GST_TYPE_D3DVIDEOSINK)) return FALSE;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/d3dvideosink/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/d3dvideosink/meson.build
Changed
@@ -23,6 +23,5 @@ dependencies : gstvideo_dep, d3d_dep, gdi_dep, install : true, install_dir : plugins_install_dir) - pkgconfig.generate(gstd3dvideosink, install_dir : plugins_pkgconfig_install_dir) plugins += gstd3dvideosink endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/gstdecklink.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/gstdecklink.cpp
Changed
@@ -34,6 +34,7 @@ GST_DEBUG_CATEGORY_STATIC (gst_decklink_debug); #define GST_CAT_DEFAULT gst_decklink_debug +#define DEFAULT_PERSISTENT_ID (-1) GType gst_decklink_mode_get_type (void) @@ -99,6 +100,33 @@ {GST_DECKLINK_MODE_PAL_P_WIDESCREEN, "PAL SD 50p Widescreen", "pal-p-widescreen"}, + {GST_DECKLINK_MODE_4Kp2398, "4k dci 23.98p", "4kdcip2398"}, + {GST_DECKLINK_MODE_4Kp24, "4k dci 24p", "4kdcip24"}, + {GST_DECKLINK_MODE_4Kp25, "4k dci 25p", "4kdcip25"}, + {GST_DECKLINK_MODE_4Kp2997, "4k dci 29.97p", "4kdcip2997"}, + {GST_DECKLINK_MODE_4Kp30, "4k dci 30p", "4kdcip30"}, + {GST_DECKLINK_MODE_4Kp50, "4k dci 50p", "4kdcip50"}, + {GST_DECKLINK_MODE_4Kp5994, "4k dci 59.94p", "4kdcip5994"}, + {GST_DECKLINK_MODE_4Kp60, "4k dci 60p", "4kdcip60"}, + + {GST_DECKLINK_MODE_4320p2398, "8k 23.98p", "8kp2398"}, + {GST_DECKLINK_MODE_4320p24, "8k 24p", "8kp24"}, + {GST_DECKLINK_MODE_4320p25, "8k 25p", "8kp25"}, + {GST_DECKLINK_MODE_4320p2997, "8k 29.97p", "8kp2997"}, + {GST_DECKLINK_MODE_4320p30, "8k 30p", "8kp30"}, + {GST_DECKLINK_MODE_4320p50, "8k 50p", "8kp50"}, + {GST_DECKLINK_MODE_4320p5994, "8k 59.94p", "8kp5994"}, + {GST_DECKLINK_MODE_4320p60, "8k 60p", "8kp60"}, + + {GST_DECKLINK_MODE_8Kp2398, "8k dci 23.98p", "8kdcip2398"}, + {GST_DECKLINK_MODE_8Kp24, "8k dci 24p", "8kdcip24"}, + {GST_DECKLINK_MODE_8Kp25, "8k dci 25p", "8kdcip25"}, + {GST_DECKLINK_MODE_8Kp2997, "8k dci 29.97p", "8kdcip2997"}, + {GST_DECKLINK_MODE_8Kp30, "8k dci 30p", "8kdcip30"}, + {GST_DECKLINK_MODE_8Kp50, "8k dci 50p", "8kdcip50"}, + {GST_DECKLINK_MODE_8Kp5994, "8k dci 59.94p", "8kdcip5994"}, + {GST_DECKLINK_MODE_8Kp60, "8k dci 60p", "8kdcip60"}, + {0, NULL, NULL} }; @@ -202,6 +230,36 @@ return (GType) id; } +/** + * GstDecklinkMappingFormat: + * @GST_DECKLINK_MAPPING_FORMAT_DEFAULT: Don't change the mapping format + * @GST_DECKLINK_MAPPING_FORMAT_LEVEL_A: Level A + * @GST_DECKLINK_MAPPING_FORMAT_LEVEL_B: Level B + * + * 3G-SDI mapping format (SMPTE ST 425-1:2017) + * + * Since: 1.22 + */ +GType +gst_decklink_mapping_format_get_type (void) +{ + static gsize id = 0; + static const GEnumValue mappingformats = { + {GST_DECKLINK_MAPPING_FORMAT_DEFAULT, "Default, don't change mapping format", + "default"}, + {GST_DECKLINK_MAPPING_FORMAT_LEVEL_A, "Level A", "level-a"}, + {GST_DECKLINK_MAPPING_FORMAT_LEVEL_B, "Level B", "level-b"}, + {0, NULL, NULL} + }; + + if (g_once_init_enter (&id)) { + GType tmp = g_enum_register_static ("GstDecklinkMappingFormat", mappingformats); + g_once_init_leave (&id, tmp); + } + + return (GType) id; +} + GType gst_decklink_timecode_format_get_type (void) { @@ -355,7 +413,34 @@ {bmdModeNTSC2398, 720, 486, 24000, 1001, true, NTSC_WS}, {bmdModePAL, 720, 576, 25, 1, true, PAL_WS}, {bmdModeNTSCp, 720, 486, 30000, 1001, false, NTSC_WS}, - {bmdModePALp, 720, 576, 25, 1, false, PAL_WS} + {bmdModePALp, 720, 576, 25, 1, false, PAL_WS}, + + {bmdMode4kDCI2398, 4096, 2160, 24000, 1001, false, UHD}, + {bmdMode4kDCI24, 4096, 2160, 24, 1, false, UHD}, + {bmdMode4kDCI25, 4096, 2160, 25, 1, false, UHD}, + {bmdMode4kDCI2997, 4096, 2160, 30000, 1001, false, UHD}, + {bmdMode4kDCI30, 4096, 2160, 30, 1, false, UHD}, + {bmdMode4kDCI50, 4096, 2160, 50, 1, false, UHD}, + {bmdMode4kDCI5994, 4096, 2160, 60000, 1001, false, UHD}, + {bmdMode4kDCI60, 4096, 2160, 60, 1, false, UHD}, + + {bmdMode8K4320p2398, 7680, 4320, 24000, 1001, false, UHD}, + {bmdMode8K4320p24, 7680, 4320, 24, 1, false, UHD}, + {bmdMode8K4320p25, 7680, 4320, 25, 1, false, UHD}, + {bmdMode8K4320p2997, 7680, 4320, 30000, 1001, false, UHD}, + {bmdMode8K4320p30, 7680, 4320, 30, 1, false, UHD}, + {bmdMode8K4320p50, 7680, 4320, 50, 1, false, UHD}, + {bmdMode8K4320p5994, 7680, 4320, 60000, 1001, false, UHD}, + {bmdMode8K4320p60, 7680, 4320, 60, 1, false, UHD}, + + {bmdMode8kDCI2398, 8192, 4320, 24000, 1001, false, UHD}, + {bmdMode8kDCI24, 8192, 4320, 24, 1, false, UHD}, + {bmdMode8kDCI25, 8192, 4320, 25, 1, false, UHD}, + {bmdMode8kDCI2997, 8192, 4320, 30000, 1001, false, UHD}, + {bmdMode8kDCI30, 8192, 4320, 30, 1, false, UHD}, + {bmdMode8kDCI50, 8192, 4320, 50, 1, false, UHD}, + {bmdMode8kDCI5994, 8192, 4320, 60000, 1001, false, UHD}, + {bmdMode8kDCI60, 8192, 4320, 60, 1, false, UHD}, }; static const struct @@ -386,6 +471,13 @@ PROFILE_SET_FAILURE }; +enum MappingFormatSetOperationResult +{ + MAPPING_FORMAT_SET_UNSUPPORTED, + MAPPING_FORMAT_SET_SUCCESS, + MAPPING_FORMAT_SET_FAILURE +}; + enum DuplexModeSetOperationResult { DUPLEX_MODE_SET_UNSUPPORTED, @@ -424,7 +516,7 @@ const GstDecklinkMode * gst_decklink_get_mode (GstDecklinkModeEnum e) { - if (e < GST_DECKLINK_MODE_AUTO || e > GST_DECKLINK_MODE_PAL_P_WIDESCREEN) + if (e < GST_DECKLINK_MODE_AUTO || e > GST_DECKLINK_MODE_8Kp60) return NULL; return &modese; } @@ -548,6 +640,78 @@ case bmdMode4K2160p60: displayMode = GST_DECKLINK_MODE_2160p60; break; + case bmdMode4kDCI2398: + displayMode = GST_DECKLINK_MODE_4Kp2398; + break; + case bmdMode4kDCI24: + displayMode = GST_DECKLINK_MODE_4Kp24; + break; + case bmdMode4kDCI25: + displayMode = GST_DECKLINK_MODE_4Kp25; + break; + case bmdMode4kDCI2997: + displayMode = GST_DECKLINK_MODE_4Kp2997; + break; + case bmdMode4kDCI30: + displayMode = GST_DECKLINK_MODE_4Kp30; + break; + case bmdMode4kDCI50: + displayMode = GST_DECKLINK_MODE_4Kp50; + break; + case bmdMode4kDCI5994: + displayMode = GST_DECKLINK_MODE_4Kp5994; + break; + case bmdMode4kDCI60: + displayMode = GST_DECKLINK_MODE_4Kp60; + break; + case bmdMode8K4320p2398: + displayMode = GST_DECKLINK_MODE_4320p2398; + break; + case bmdMode8K4320p24: + displayMode = GST_DECKLINK_MODE_4320p24; + break; + case bmdMode8K4320p25: + displayMode = GST_DECKLINK_MODE_4320p25; + break; + case bmdMode8K4320p2997: + displayMode = GST_DECKLINK_MODE_4320p2997; + break; + case bmdMode8K4320p30: + displayMode = GST_DECKLINK_MODE_4320p30; + break; + case bmdMode8K4320p50: + displayMode = GST_DECKLINK_MODE_4320p50; + break; + case bmdMode8K4320p5994: + displayMode = GST_DECKLINK_MODE_4320p5994; + break; + case bmdMode8K4320p60: + displayMode = GST_DECKLINK_MODE_4320p60; + break; + case bmdMode8kDCI2398: + displayMode = GST_DECKLINK_MODE_4Kp2398; + break; + case bmdMode8kDCI24: + displayMode = GST_DECKLINK_MODE_4Kp24; + break; + case bmdMode8kDCI25: + displayMode = GST_DECKLINK_MODE_4Kp25; + break; + case bmdMode8kDCI2997: + displayMode = GST_DECKLINK_MODE_4Kp2997; + break; + case bmdMode8kDCI30: + displayMode = GST_DECKLINK_MODE_4Kp30; + break; + case bmdMode8kDCI50: + displayMode = GST_DECKLINK_MODE_4Kp50; + break; + case bmdMode8kDCI5994: + displayMode = GST_DECKLINK_MODE_4Kp5994; + break; + case bmdMode8kDCI60: + displayMode = GST_DECKLINK_MODE_4Kp60; + break; default: displayMode = (GstDecklinkModeEnum) - 1; break; @@ -867,6 +1031,20 @@ static ProfileSetOperationResult gst_decklink_configure_profile (Device * device, GstDecklinkProfileId profile_id); +static MappingFormatSetOperationResult gst_decklink_configure_mapping_format (Device * + device, GstDecklinkMappingFormat mapping_format); + +static gboolean +persistent_id_is_equal_input (const Device * a, const gint64 * b) +{ + return a->input.persistent_id == *b; +} + +static gboolean +persistent_id_is_equal_output (const Device * a, const gint64 * b) +{ + return a->output.persistent_id == *b; +} class GStreamerDecklinkInputCallback:public IDeckLinkInputCallback { @@ -925,17 +1103,35 @@ VideoInputFormatChanged (BMDVideoInputFormatChangedEvents, IDeckLinkDisplayMode * mode, BMDDetectedVideoInputFormatFlags formatFlags) { - BMDPixelFormat pixelFormat; + BMDPixelFormat pixelFormat = bmdFormatUnspecified; GST_INFO ("Video input format changed"); + /* Detect input format */ if ((formatFlags & bmdDetectedVideoInputRGB444) - && m_input->format == bmdFormat8BitYUV) { - /* user-set format was auto or 8BitYUV, change to RGB */ - pixelFormat = bmdFormat8BitARGB; - } else { - /* use the user-set format, defaulting to 8BitYUV */ - pixelFormat = m_input->format; + && (formatFlags & bmdDetectedVideoInput8BitDepth)) { + /* Cannot detect ARGB vs BGRA, so assume ARGB unless user sets BGRA */ + if (m_input->format == bmdFormat8BitBGRA) { + pixelFormat = bmdFormat8BitBGRA; + } else { + pixelFormat = bmdFormat8BitARGB; + } + } else if (formatFlags & bmdDetectedVideoInputYCbCr422) { + if (formatFlags & bmdDetectedVideoInput10BitDepth) { + pixelFormat = bmdFormat10BitYUV; + } else if (formatFlags & bmdDetectedVideoInput8BitDepth) { + pixelFormat = bmdFormat8BitYUV; + } + } + + if (pixelFormat == bmdFormatUnspecified) { + GST_ERROR ("Video input format is not supported"); + return E_FAIL; + } + + if (!m_input->auto_format && (m_input->format != pixelFormat)) { + GST_ERROR ("Video input format does not match the user-set format"); + return E_FAIL; } g_mutex_lock (&m_input->lock); @@ -1358,9 +1554,9 @@ static GstDecklinkDevice * gst_decklink_device_new (const gchar * model_name, const gchar * display_name, - const gchar * serial_number, gboolean supports_format_detection, - GstCaps * video_caps, guint max_channels, gboolean video, gboolean capture, - guint device_number) + const gchar * serial_number, gint64 persistent_id, + gboolean supports_format_detection, GstCaps * video_caps, + guint max_channels, gboolean video, gboolean capture, guint device_number) { GstDevice *ret; gchar *name; @@ -1409,6 +1605,10 @@ gst_structure_set (properties, "serial-number", G_TYPE_STRING, serial_number, NULL); + if (persistent_id) + gst_structure_set (properties, "persistent-id", G_TYPE_INT64, + persistent_id, NULL); + ret = GST_DEVICE (g_object_new (GST_TYPE_DECKLINK_DEVICE, "display-name", name, "device-class", device_class, "caps", caps, "properties", properties, @@ -1420,11 +1620,19 @@ GST_DECKLINK_DEVICE (ret)->video = video; GST_DECKLINK_DEVICE (ret)->capture = capture; - GST_DECKLINK_DEVICE (ret)->device_number = device_number; + GST_DECKLINK_DEVICE (ret)->persistent_id = persistent_id; return GST_DECKLINK_DEVICE (ret); } +static gint +compare_persistent_id (gconstpointer a, gconstpointer b) +{ + const Device *const dev1 = *(Device **) a; + const Device *const dev2 = *(Device **) b; + return dev1->input.persistent_id - dev2->input.persistent_id; +} + static gpointer init_devices (gpointer data) { @@ -1463,6 +1671,7 @@ gchar *model_name = NULL; gchar *display_name = NULL; gchar *serial_number = NULL; + gint64 persistent_id = 0; gboolean supports_format_detection = 0; gint64 max_channels = 2; GstCaps *video_input_caps = gst_caps_new_empty (); @@ -1593,12 +1802,28 @@ } else { bool tmp_bool = false; int64_t tmp_int = 2; + int64_t tmp_int_persistent_id = 0; dev->input.attributes->GetInt (BMDDeckLinkMaximumAudioChannels, &tmp_int); dev->input.attributes->GetFlag (BMDDeckLinkSupportsInputFormatDetection, &tmp_bool); supports_format_detection = tmp_bool; max_channels = tmp_int; + + ret = + dev->input.attributes->GetInt (BMDDeckLinkPersistentID, + &tmp_int_persistent_id); + if (ret == S_OK) { + persistent_id = tmp_int_persistent_id; + dev->output.persistent_id = persistent_id; + dev->input.persistent_id = persistent_id; + GST_DEBUG ("device %d has persistent id %" G_GINT64_FORMAT, i, persistent_id); + } else { + persistent_id = i; + dev->output.persistent_id = i; + dev->input.persistent_id = i; + GST_DEBUG ("device %d does not have persistent id. Value set to %d", i, i); + } } decklink->GetModelName ((COMSTR_T *) & model_name); @@ -1611,22 +1836,22 @@ if (capture) { dev->devices0 = gst_decklink_device_new (model_name, display_name, serial_number, - supports_format_detection, video_input_caps, max_channels, TRUE, TRUE, - i); + persistent_id, supports_format_detection, video_input_caps, + max_channels, TRUE, TRUE, i); dev->devices1 = gst_decklink_device_new (model_name, display_name, serial_number, - supports_format_detection, video_input_caps, max_channels, FALSE, - TRUE, i); + persistent_id, supports_format_detection, video_input_caps, + max_channels, FALSE, TRUE, i); } if (output) { dev->devices2 = gst_decklink_device_new (model_name, display_name, serial_number, - supports_format_detection, video_output_caps, max_channels, TRUE, - FALSE, i); + persistent_id, supports_format_detection, video_output_caps, + max_channels, TRUE, FALSE, i); dev->devices3 = gst_decklink_device_new (model_name, display_name, serial_number, - supports_format_detection, video_output_caps, max_channels, FALSE, - FALSE, i); + persistent_id, supports_format_detection, video_output_caps, + max_channels, FALSE, FALSE, i); } if (model_name) @@ -1655,6 +1880,8 @@ iterator->Release (); + g_ptr_array_sort (devices, compare_persistent_id); + return NULL; } @@ -1692,16 +1919,28 @@ } GstDecklinkOutput * -gst_decklink_acquire_nth_output (gint n, GstElement * sink, gboolean is_audio) +gst_decklink_acquire_nth_output (gint n, gint64 persistent_id, + GstElement * sink, gboolean is_audio) { GstDecklinkOutput *output; Device *device; + guint found_index; g_once (&devices_once, init_devices, NULL); if (devices == NULL) return NULL; + if (persistent_id != DEFAULT_PERSISTENT_ID) { + if (g_ptr_array_find_with_equal_func (devices, &persistent_id, + (GEqualFunc) persistent_id_is_equal_output, &found_index)) { + n = found_index; + GST_DEBUG ("Persistent ID: %" G_GINT64_FORMAT ", used", persistent_id); + } else { + return NULL; + } + } + if (n < 0 || (guint) n >= devices->len) return NULL; @@ -1718,6 +1957,10 @@ videosink->profile_id) == PROFILE_SET_FAILURE) { return NULL; } + if (gst_decklink_configure_mapping_format (device, + videosink->mapping_format) == MAPPING_FORMAT_SET_FAILURE) { + return NULL; + } } g_mutex_lock (&output->lock); @@ -1737,14 +1980,26 @@ } void -gst_decklink_release_nth_output (gint n, GstElement * sink, gboolean is_audio) +gst_decklink_release_nth_output (gint n, gint64 persistent_id, + GstElement * sink, gboolean is_audio) { GstDecklinkOutput *output; Device *device; + guint found_index; if (devices == NULL) return; + if (persistent_id != DEFAULT_PERSISTENT_ID) { + if (g_ptr_array_find_with_equal_func (devices, &persistent_id, + (GEqualFunc) persistent_id_is_equal_output, &found_index)) { + n = found_index; + GST_DEBUG ("Persistent ID: %" G_GINT64_FORMAT ", used", persistent_id); + } else { + return; + } + } + if (n < 0 || (guint) n >= devices->len) return; @@ -1766,16 +2021,28 @@ } GstDecklinkInput * -gst_decklink_acquire_nth_input (gint n, GstElement * src, gboolean is_audio) +gst_decklink_acquire_nth_input (gint n, gint64 persistent_id, GstElement * src, + gboolean is_audio) { GstDecklinkInput *input; Device *device; + guint found_index; g_once (&devices_once, init_devices, NULL); if (devices == NULL) return NULL; + if (persistent_id != DEFAULT_PERSISTENT_ID) { + if (g_ptr_array_find_with_equal_func (devices, &persistent_id, + (GEqualFunc) persistent_id_is_equal_input, &found_index)) { + n = found_index; + GST_DEBUG ("Persistent ID: %" G_GINT64_FORMAT ", used", persistent_id); + } else { + return NULL; + } + } + if (n < 0 || (guint) n >= devices->len) return NULL; @@ -1814,14 +2081,26 @@ } void -gst_decklink_release_nth_input (gint n, GstElement * src, gboolean is_audio) +gst_decklink_release_nth_input (gint n, gint64 persistent_id, GstElement * src, + gboolean is_audio) { GstDecklinkInput *input; Device *device; + guint found_index; if (devices == NULL) return; + if (persistent_id != DEFAULT_PERSISTENT_ID) { + if (g_ptr_array_find_with_equal_func (devices, &persistent_id, + (GEqualFunc) persistent_id_is_equal_input, &found_index)) { + n = found_index; + GST_DEBUG ("Persistent ID: %" G_GINT64_FORMAT ", used", persistent_id); + } else { + return; + } + } + if (n < 0 || (guint) n >= devices->len) return; @@ -1905,6 +2184,49 @@ } } +static MappingFormatSetOperationResult +gst_decklink_configure_mapping_format (Device * device, + GstDecklinkMappingFormat mapping_format) +{ + HRESULT res; + + bool level_a_output; + switch (mapping_format) { + case GST_DECKLINK_MAPPING_FORMAT_LEVEL_A: + level_a_output = true; + break; + case GST_DECKLINK_MAPPING_FORMAT_LEVEL_B: + level_a_output = false; + break; + default: + case GST_DECKLINK_MAPPING_FORMAT_DEFAULT: + return MAPPING_FORMAT_SET_SUCCESS; + } + + // Make sure Level A is supported + bool supports_level_a_output = false; + res = device->output.attributes->GetFlag(BMDDeckLinkSupportsSMPTELevelAOutput, + &supports_level_a_output); + if (res != S_OK || !supports_level_a_output) { + if (level_a_output) { + GST_DEBUG ("Device does not support Level A mapping format"); + return MAPPING_FORMAT_SET_UNSUPPORTED; + } else { + // Level B is the only supported option + return MAPPING_FORMAT_SET_SUCCESS; + } + } + + res = device->input.config->SetFlag(bmdDeckLinkConfigSMPTELevelAOutput, level_a_output); + if (res == S_OK) { + GST_DEBUG ("Successfully set mapping format"); + return MAPPING_FORMAT_SET_SUCCESS; + } else { + GST_ERROR ("Failed to set mapping format"); + return MAPPING_FORMAT_SET_FAILURE; + } +} + G_DEFINE_TYPE (GstDecklinkClock, gst_decklink_clock, GST_TYPE_SYSTEM_CLOCK); static GstClockTime gst_decklink_clock_get_internal_time (GstClock * clock);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/gstdecklink.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/gstdecklink.h
Changed
@@ -44,13 +44,16 @@ # ifdef __MINGW32__ # define CONVERT_COM_STRING(s) G_STMT_START { BSTR _s = (BSTR)s; s = (char*) malloc(100); wcstombs(s, _s, 100); ::SysFreeString(_s); } G_STMT_END # define FREE_COM_STRING(s) free(s); +# define CONVERT_TO_COM_STRING(s) G_STMT_START { char * _s = (char *)s; s = (BSTR) malloc(100); mbstowcs(s, _s, 100); g_free(_s); } G_STMT_END # else # define CONVERT_COM_STRING(s) G_STMT_START { BSTR _s = (BSTR)s; s = _com_util::ConvertBSTRToString(_s); ::SysFreeString(_s); } G_STMT_END # define FREE_COM_STRING(s) G_STMT_START { delete s; } G_STMT_END +# define CONVERT_TO_COM_STRING(s) G_STMT_START { char * _s = (char *)s; s = _com_util::ConvertStringToBSTR(_s); g_free(_s); } G_STMT_END # endif /* __MINGW32__ */ #else #define COMSTR_T const char* #define CONVERT_COM_STRING(s) +#define CONVERT_TO_COM_STRING(s) #define FREE_COM_STRING(s) #define WINAPI #endif /* G_OS_WIN32 */ @@ -110,7 +113,154 @@ GST_DECKLINK_MODE_NTSC2398_WIDESCREEN, GST_DECKLINK_MODE_PAL_WIDESCREEN, GST_DECKLINK_MODE_NTSC_P_WIDESCREEN, - GST_DECKLINK_MODE_PAL_P_WIDESCREEN + GST_DECKLINK_MODE_PAL_P_WIDESCREEN, + + /** + * GstDecklinkModes::4kdcip2398: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4Kp2398, + /** + * GstDecklinkModes::4kdcip24: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4Kp24, + /** + * GstDecklinkModes::4kdcip25: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4Kp25, + /** + * GstDecklinkModes::4kdcip2997: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4Kp2997, + /** + * GstDecklinkModes::4kdcip30: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4Kp30, + /** + * GstDecklinkModes::4kdcip50: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4Kp50, + /** + * GstDecklinkModes::4kdcip5994: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4Kp5994, + /** + * GstDecklinkModes::4kdcip60: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4Kp60, + + /** + * GstDecklinkModes::8kp2398: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4320p2398, + /** + * GstDecklinkModes::8kp24: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4320p24, + /** + * GstDecklinkModes::8kp25: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4320p25, + /** + * GstDecklinkModes::8kp2997: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4320p2997, + /** + * GstDecklinkModes::8kp30: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4320p30, + /** + * GstDecklinkModes::8kp50: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4320p50, + /** + * GstDecklinkModes::8kp5994: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4320p5994, + /** + * GstDecklinkModes::8kp60: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_4320p60, + + /** + * GstDecklinkModes::8kdcip2398: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_8Kp2398, + /** + * GstDecklinkModes::8kdcip24: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_8Kp24, + /** + * GstDecklinkModes::8kdcip25: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_8Kp25, + /** + * GstDecklinkModes::8kdcip2997: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_8Kp2997, + /** + * GstDecklinkModes::8kdcip30: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_8Kp30, + /** + * GstDecklinkModes::8kdcip50: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_8Kp50, + /** + * GstDecklinkModes::8kdcip5994: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_8Kp5994, + /** + * GstDecklinkModes::8kdcip60: + * + * Since: 1.22 + */ + GST_DECKLINK_MODE_8Kp60 } GstDecklinkModeEnum; #define GST_TYPE_DECKLINK_MODE (gst_decklink_mode_get_type ()) GType gst_decklink_mode_get_type (void); @@ -174,6 +324,14 @@ GType gst_decklink_profile_id_get_type (void); typedef enum { + GST_DECKLINK_MAPPING_FORMAT_DEFAULT, + GST_DECKLINK_MAPPING_FORMAT_LEVEL_A, /* bmdDeckLinkConfigSMPTELevelAOutput = true */ + GST_DECKLINK_MAPPING_FORMAT_LEVEL_B, /* bmdDeckLinkConfigSMPTELevelAOutput = false */ +} GstDecklinkMappingFormat; +#define GST_TYPE_DECKLINK_MAPPING_FORMAT (gst_decklink_mapping_format_get_type ()) +GType gst_decklink_mapping_format_get_type (void); + +typedef enum { GST_DECKLINK_TIMECODE_FORMAT_RP188VITC1, /*bmdTimecodeRP188VITC1 */ GST_DECKLINK_TIMECODE_FORMAT_RP188VITC2, /*bmdTimecodeRP188VITC2 */ GST_DECKLINK_TIMECODE_FORMAT_RP188LTC, /*bmdTimecodeRP188LTC */ @@ -243,6 +401,7 @@ IDeckLinkKeyer *keyer; gchar *hw_serial_number; + gint64 persistent_id; GstClock *clock; GstClockTime clock_start_time, clock_last_time, clock_epoch; @@ -273,6 +432,7 @@ IDeckLinkProfileAttributes *attributes; gchar *hw_serial_number; + gint64 persistent_id; /* Everything below protected by mutex */ GMutex lock; @@ -282,6 +442,7 @@ /* Configured mode or NULL */ const GstDecklinkMode *mode; BMDPixelFormat format; + gboolean auto_format; /* Set by the audio source */ void (*got_audio_packet) (GstElement *videosrc, IDeckLinkAudioInputPacket * packet, GstClockTime capture_time, GstClockTime stream_time, GstClockTime stream_duration, GstClockTime hardware_time, GstClockTime hardware_duration, gboolean no_signal); @@ -293,11 +454,11 @@ void (*start_streams) (GstElement *videosrc); }; -GstDecklinkOutput * gst_decklink_acquire_nth_output (gint n, GstElement * sink, gboolean is_audio); -void gst_decklink_release_nth_output (gint n, GstElement * sink, gboolean is_audio); +GstDecklinkOutput * gst_decklink_acquire_nth_output (gint n, gint64 persistent_id, GstElement * sink, gboolean is_audio); +void gst_decklink_release_nth_output (gint n, gint64 persistent_id, GstElement * sink, gboolean is_audio); -GstDecklinkInput * gst_decklink_acquire_nth_input (gint n, GstElement * src, gboolean is_audio); -void gst_decklink_release_nth_input (gint n, GstElement * src, gboolean is_audio); +GstDecklinkInput * gst_decklink_acquire_nth_input (gint n, gint64 persistent_id, GstElement * src, gboolean is_audio); +void gst_decklink_release_nth_input (gint n, gint64 persistent_id, GstElement * src, gboolean is_audio); const GstDecklinkMode * gst_decklink_find_mode_for_caps (GstCaps * caps); const GstDecklinkMode * gst_decklink_find_mode_and_format_for_caps (GstCaps * caps, BMDPixelFormat * format); @@ -320,7 +481,7 @@ GstDevice parent; gboolean video; gboolean capture; - guint device_number; + gint64 persistent_id; }; GType gst_decklink_device_get_type (void);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/gstdecklinkaudiosink.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/gstdecklinkaudiosink.cpp
Changed
@@ -52,6 +52,8 @@ // Microseconds for audiobasesink compatibility... #define DEFAULT_BUFFER_TIME (50 * GST_MSECOND / 1000) +#define DEFAULT_PERSISTENT_ID (-1) + enum { PROP_0, @@ -60,6 +62,7 @@ PROP_ALIGNMENT_THRESHOLD, PROP_DISCONT_WAIT, PROP_BUFFER_TIME, + PROP_PERSISTENT_ID }; static void gst_decklink_audio_sink_set_property (GObject * object, @@ -141,6 +144,23 @@ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); + /** + * GstDecklinkAudioSink:persistent-id + * + * Decklink device to use. Higher priority than "device-number". + * BMDDeckLinkPersistentID is a device specific, 32-bit unique identifier. + * It is stable even when the device is plugged in a different connector, + * across reboots, and when plugged into different computers. + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_PERSISTENT_ID, + g_param_spec_int64 ("persistent-id", "Persistent id", + "Output device instance to use. Higher priority than \"device-number\".", + DEFAULT_PERSISTENT_ID, G_MAXINT64, DEFAULT_PERSISTENT_ID, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + G_PARAM_CONSTRUCT))); + g_object_class_install_property (gobject_class, PROP_HW_SERIAL_NUMBER, g_param_spec_string ("hw-serial-number", "Hardware serial number", "The serial number (hardware ID) of the Decklink card", @@ -188,6 +208,8 @@ DEFAULT_DISCONT_WAIT); self->buffer_time = DEFAULT_BUFFER_TIME * 1000; + self->persistent_id = DEFAULT_PERSISTENT_ID; + gst_base_sink_set_max_lateness (GST_BASE_SINK_CAST (self), 20 * GST_MSECOND); } @@ -218,6 +240,9 @@ self->buffer_time = g_value_get_uint64 (value) * 1000; GST_OBJECT_UNLOCK (self); break; + case PROP_PERSISTENT_ID: + self->persistent_id = g_value_get_int64 (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -257,6 +282,9 @@ g_value_set_uint64 (value, self->buffer_time / 1000); GST_OBJECT_UNLOCK (self); break; + case PROP_PERSISTENT_ID: + g_value_set_int64 (value, self->persistent_id); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -799,7 +827,7 @@ GST_DEBUG_OBJECT (self, "Starting"); self->output = - gst_decklink_acquire_nth_output (self->device_number, + gst_decklink_acquire_nth_output (self->device_number, self->persistent_id, GST_ELEMENT_CAST (self), TRUE); if (!self->output) { GST_ERROR_OBJECT (self, "Failed to acquire output"); @@ -827,7 +855,7 @@ g_mutex_unlock (&self->output->lock); self->output->output->DisableAudioOutput (); - gst_decklink_release_nth_output (self->device_number, + gst_decklink_release_nth_output (self->device_number, self->persistent_id, GST_ELEMENT_CAST (self), TRUE); self->output = NULL; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/gstdecklinkaudiosink.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/gstdecklinkaudiosink.h
Changed
@@ -58,6 +58,8 @@ GstAudioStreamAlign *stream_align; GstAudioResampler *resampler; guint resampler_in_rate, resampler_out_rate; + + gint64 persistent_id; }; struct _GstDecklinkAudioSinkClass
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/gstdecklinkaudiosrc.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/gstdecklinkaudiosrc.cpp
Changed
@@ -57,6 +57,8 @@ #define ABSDIFF(x, y) ( (x) > (y) ? ((x) - (y)) : ((y) - (x)) ) #endif +#define DEFAULT_PERSISTENT_ID (-1) + enum { PROP_0, @@ -66,7 +68,8 @@ PROP_DISCONT_WAIT, PROP_BUFFER_SIZE, PROP_CHANNELS, - PROP_HW_SERIAL_NUMBER + PROP_HW_SERIAL_NUMBER, + PROP_PERSISTENT_ID }; static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("src", @@ -180,6 +183,23 @@ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); + /** + * GstDecklinkAudioSrc:persistent-id + * + * Decklink device to use. Higher priority than "device-number". + * BMDDeckLinkPersistentID is a device specific, 32-bit unique identifier. + * It is stable even when the device is plugged in a different connector, + * across reboots, and when plugged into different computers. + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_PERSISTENT_ID, + g_param_spec_int64 ("persistent-id", "Persistent id", + "Output device instance to use. Higher priority than \"device-number\".", + DEFAULT_PERSISTENT_ID, G_MAXINT64, DEFAULT_PERSISTENT_ID, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + G_PARAM_CONSTRUCT))); + g_object_class_install_property (gobject_class, PROP_ALIGNMENT_THRESHOLD, g_param_spec_uint64 ("alignment-threshold", "Alignment Threshold", "Timestamp alignment threshold in nanoseconds", 0, @@ -246,6 +266,8 @@ self->skipped_last = 0; self->skip_from_timestamp = GST_CLOCK_TIME_NONE; self->skip_to_timestamp = GST_CLOCK_TIME_NONE; + + self->persistent_id = DEFAULT_PERSISTENT_ID; } void @@ -274,6 +296,9 @@ case PROP_CHANNELS: self->channels = (GstDecklinkAudioChannelsEnum) g_value_get_enum (value); break; + case PROP_PERSISTENT_ID: + self->persistent_id = g_value_get_int64 (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -311,6 +336,9 @@ else g_value_set_string (value, NULL); break; + case PROP_PERSISTENT_ID: + g_value_set_int64 (value, self->persistent_id); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -939,7 +967,7 @@ GST_DEBUG_OBJECT (self, "Opening"); self->input = - gst_decklink_acquire_nth_input (self->device_number, + gst_decklink_acquire_nth_input (self->device_number, self->persistent_id, GST_ELEMENT_CAST (self), TRUE); if (!self->input) { GST_ERROR_OBJECT (self, "Failed to acquire input"); @@ -986,7 +1014,7 @@ self->input->got_audio_packet = NULL; g_mutex_unlock (&self->input->lock); - gst_decklink_release_nth_input (self->device_number, + gst_decklink_release_nth_input (self->device_number, self->persistent_id, GST_ELEMENT_CAST (self), TRUE); self->input = NULL; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/gstdecklinkaudiosrc.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/gstdecklinkaudiosrc.h
Changed
@@ -52,6 +52,7 @@ GstDecklinkModeEnum mode; GstDecklinkAudioConnectionEnum connection; gint device_number; + gint64 persistent_id; GstDecklinkAudioChannelsEnum channels; gint64 channels_found;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/gstdecklinkdeviceprovider.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/gstdecklinkdeviceprovider.cpp
Changed
@@ -24,6 +24,8 @@ #include "gstdecklinkdeviceprovider.h" #include "gstdecklink.h" +#define DEFAULT_PERSISTENT_ID (-1) + G_DEFINE_TYPE (GstDecklinkDeviceProvider, gst_decklink_device_provider, GST_TYPE_DEVICE_PROVIDER); GST_DEVICE_PROVIDER_REGISTER_DEFINE (decklinkdeviceprovider, "decklinkdeviceprovider", @@ -77,7 +79,7 @@ } if (ret) { - g_object_set (ret, "device-number", self->device_number, NULL); + g_object_set (ret, "persistent-id", self->persistent_id, NULL); } return ret;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/gstdecklinkvideosink.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/gstdecklinkvideosink.cpp
Changed
@@ -140,6 +140,8 @@ GST_DEBUG_CATEGORY_STATIC (gst_decklink_video_sink_debug); #define GST_CAT_DEFAULT gst_decklink_video_sink_debug +#define DEFAULT_PERSISTENT_ID (-1) + class GStreamerVideoOutputCallback:public IDeckLinkVideoOutputCallback { public: @@ -232,6 +234,281 @@ gint m_refcount; }; +class GstDecklinkTimecode:public IDeckLinkTimecode +{ +public: + GstDecklinkTimecode (GstVideoTimeCode * + timecode):m_timecode (gst_video_time_code_copy (timecode)), m_refcount (1) + { + } + + virtual BMDTimecodeBCD STDMETHODCALLTYPE GetBCD (void) + { + BMDTimecodeBCD bcd = 0; + + bcd |= (m_timecode->frames % 10) << 0; + bcd |= ((m_timecode->frames / 10) & 0x0f) << 4; + bcd |= (m_timecode->seconds % 10) << 8; + bcd |= ((m_timecode->seconds / 10) & 0x0f) << 12; + bcd |= (m_timecode->minutes % 10) << 16; + bcd |= ((m_timecode->minutes / 10) & 0x0f) << 20; + bcd |= (m_timecode->hours % 10) << 24; + bcd |= ((m_timecode->hours / 10) & 0x0f) << 28; + + if (m_timecode->config.fps_n == 24 && m_timecode->config.fps_d == 1) + bcd |= 0x0 << 30; + else if (m_timecode->config.fps_n == 25 && m_timecode->config.fps_d == 1) + bcd |= 0x1 << 30; + else if (m_timecode->config.fps_n == 30 && m_timecode->config.fps_d == 1001) + bcd |= 0x2 << 30; + else if (m_timecode->config.fps_n == 30 && m_timecode->config.fps_d == 1) + bcd |= 0x3 << 30; + + return bcd; + } + + virtual HRESULT STDMETHODCALLTYPE GetComponents (uint8_t * hours, + uint8_t * minutes, uint8_t * seconds, uint8_t * frames) + { + *hours = m_timecode->hours; + *minutes = m_timecode->minutes; + *seconds = m_timecode->seconds; + *frames = m_timecode->frames; + + return S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE GetString (COMSTR_T * timecode) + { + COMSTR_T s = (COMSTR_T) gst_video_time_code_to_string (m_timecode); + CONVERT_TO_COM_STRING (s); + *timecode = s; + return S_OK; + } + + virtual BMDTimecodeFlags STDMETHODCALLTYPE GetFlags (void) + { + BMDTimecodeFlags flags = (BMDTimecodeFlags) 0; + + if (((GstVideoTimeCodeFlags) (m_timecode-> + config.flags)) & GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME) + flags = (BMDTimecodeFlags) (flags | bmdTimecodeIsDropFrame); + else + flags = (BMDTimecodeFlags) (flags | bmdTimecodeFlagDefault); + if (m_timecode->field_count == 2) + flags = (BMDTimecodeFlags) (flags | bmdTimecodeFieldMark); + + return flags; + } + + virtual HRESULT STDMETHODCALLTYPE GetTimecodeUserBits (BMDTimecodeUserBits * + userBits) + { + *userBits = 0; + return S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE QueryInterface (REFIID, LPVOID *) + { + return E_NOINTERFACE; + } + + virtual ULONG STDMETHODCALLTYPE AddRef (void) + { + ULONG ret; + + ret = g_atomic_int_add (&m_refcount, 1) + 1; + + return ret; + } + + virtual ULONG STDMETHODCALLTYPE Release (void) + { + ULONG ret; + + ret = g_atomic_int_add (&m_refcount, -1); + if (ret == 1) { + delete this; + } + + return ret - 1; + } + +private: + GstVideoTimeCode * m_timecode; + int m_refcount; + + virtual ~ GstDecklinkTimecode () { + if (m_timecode) { + gst_video_time_code_free (m_timecode); + } + } +}; + +class GstDecklinkVideoFrame:public IDeckLinkVideoFrame +{ +public: + GstDecklinkVideoFrame (GstVideoFrame * frame):m_frame (0), + m_dframe (0), m_ancillary (0), m_timecode (0), m_refcount (1) + { + m_frame = g_new0 (GstVideoFrame, 1); + *m_frame = *frame; + } + + GstDecklinkVideoFrame (IDeckLinkMutableVideoFrame * dframe):m_frame (0), + m_dframe (dframe), m_ancillary (0), m_timecode (0), m_refcount (1) + { + } + + virtual long STDMETHODCALLTYPE GetWidth (void) + { + return m_frame ? GST_VIDEO_FRAME_WIDTH (m_frame) : m_dframe->GetWidth (); + } + virtual long STDMETHODCALLTYPE GetHeight (void) + { + return m_frame ? GST_VIDEO_FRAME_HEIGHT (m_frame) : m_dframe->GetHeight (); + } + virtual long STDMETHODCALLTYPE GetRowBytes (void) + { + return m_frame ? GST_VIDEO_FRAME_PLANE_STRIDE (m_frame, + 0) : m_dframe->GetRowBytes (); + } + virtual BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat (void) + { + if (m_dframe) + return m_dframe->GetPixelFormat (); + + switch (GST_VIDEO_FRAME_FORMAT (m_frame)) { + case GST_VIDEO_FORMAT_UYVY: + return bmdFormat8BitYUV; + case GST_VIDEO_FORMAT_v210: + return bmdFormat10BitYUV; + case GST_VIDEO_FORMAT_ARGB: + return bmdFormat8BitARGB; + case GST_VIDEO_FORMAT_BGRA: + return bmdFormat8BitBGRA; + default: + g_assert_not_reached (); + } + } + virtual BMDFrameFlags STDMETHODCALLTYPE GetFlags (void) + { + return m_dframe ? m_dframe->GetFlags () : bmdFrameFlagDefault; + } + virtual HRESULT STDMETHODCALLTYPE GetBytes (void **buffer) + { + if (m_dframe) + return m_dframe->GetBytes (buffer); + + *buffer = GST_VIDEO_FRAME_PLANE_DATA (m_frame, 0); + return S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE GetTimecode (BMDTimecodeFormat format, + IDeckLinkTimecode ** timecode) + { + *timecode = m_timecode; + if (m_timecode) { + m_timecode->AddRef (); + return S_OK; + } else { + return S_FALSE; + } + } + + virtual HRESULT STDMETHODCALLTYPE SetTimecode (GstVideoTimeCode * timecode) + { + if (m_timecode) { + m_timecode->Release (); + } + m_timecode = new GstDecklinkTimecode (timecode); + + return S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE + GetAncillaryData (IDeckLinkVideoFrameAncillary ** ancillary) + { + *ancillary = m_ancillary; + if (m_ancillary) { + m_ancillary->AddRef (); + return S_OK; + } else { + return S_FALSE; + } + } + virtual HRESULT STDMETHODCALLTYPE + SetAncillaryData (IDeckLinkVideoFrameAncillary * ancillary) + { + if (m_ancillary) + m_ancillary->Release (); + + if (ancillary) + ancillary->AddRef (); + + m_ancillary = ancillary; + + return S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE QueryInterface (REFIID, LPVOID *) + { + return E_NOINTERFACE; + } + + virtual ULONG STDMETHODCALLTYPE AddRef (void) + { + ULONG ret; + + ret = g_atomic_int_add (&m_refcount, 1) + 1; + + return ret; + } + + virtual ULONG STDMETHODCALLTYPE Release (void) + { + ULONG ret; + + ret = g_atomic_int_add (&m_refcount, -1); + if (ret == 1) { + delete this; + } + + return ret - 1; + } + +private: + GstVideoFrame * m_frame; + IDeckLinkMutableVideoFrame *m_dframe; + IDeckLinkVideoFrameAncillary *m_ancillary; + GstDecklinkTimecode *m_timecode; + int m_refcount; + + virtual ~ GstDecklinkVideoFrame () { + if (m_frame) { + gst_video_frame_unmap (m_frame); + g_free (m_frame); + } + if (m_dframe) { + m_dframe->Release (); + } + if (m_ancillary) { + m_ancillary->Release (); + } + if (m_timecode) { + m_timecode->Release (); + } + } +}; + +/** + * GstDecklinkMappingFormat: + * @GST_DECKLINK_MAPPING_FORMAT_DEFAULT: Don't change the mapping format + * @GST_DECKLINK_MAPPING_FORMAT_LEVEL_A: Level A + * @GST_DECKLINK_MAPPING_FORMAT_LEVEL_B: Level B + * + * Since: 1.22 + */ enum { PROP_0, @@ -245,6 +522,8 @@ PROP_HW_SERIAL_NUMBER, PROP_CC_LINE, PROP_AFD_BAR_LINE, + PROP_MAPPING_FORMAT, + PROP_PERSISTENT_ID }; static void gst_decklink_video_sink_set_property (GObject * object, @@ -280,8 +559,9 @@ #define parent_class gst_decklink_video_sink_parent_class G_DEFINE_TYPE (GstDecklinkVideoSink, gst_decklink_video_sink, GST_TYPE_BASE_SINK); -GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (decklinkvideosink, "decklinkvideosink", GST_RANK_NONE, - GST_TYPE_DECKLINK_VIDEO_SINK, decklink_element_init (plugin)); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (decklinkvideosink, "decklinkvideosink", + GST_RANK_NONE, GST_TYPE_DECKLINK_VIDEO_SINK, + decklink_element_init (plugin)); static gboolean reset_framerate (GstCapsFeatures * features, GstStructure * structure, @@ -335,6 +615,22 @@ "Output device instance to use", 0, G_MAXINT, 0, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); + /** + * GstDecklinkVideoSink:persistent-id + * + * Decklink device to use. Higher priority than "device-number". + * BMDDeckLinkPersistentID is a device specific, 32-bit unique identifier. + * It is stable even when the device is plugged in a different connector, + * across reboots, and when plugged into different computers. + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_PERSISTENT_ID, + g_param_spec_int64 ("persistent-id", "Persistent id", + "Output device instance to use. Higher priority than \"device-number\".", + DEFAULT_PERSISTENT_ID, G_MAXINT64, DEFAULT_PERSISTENT_ID, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + G_PARAM_CONSTRUCT))); g_object_class_install_property (gobject_class, PROP_VIDEO_FORMAT, g_param_spec_enum ("video-format", "Video format", @@ -407,6 +703,20 @@ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); + /** + * GstDecklinkVideoSink:mapping-format + * + * Specifies the 3G-SDI mapping format to use (SMPTE ST 425-1:2017). + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_MAPPING_FORMAT, + g_param_spec_enum ("mapping-format", "3G-SDI Mapping Format", + "3G-SDI Mapping Format (Level A/B)", + GST_TYPE_DECKLINK_MAPPING_FORMAT, GST_DECKLINK_MAPPING_FORMAT_DEFAULT, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + G_PARAM_CONSTRUCT))); + templ_caps = gst_decklink_mode_get_template_caps (FALSE); templ_caps = gst_caps_make_writable (templ_caps); /* For output we support any framerate and only really care about timestamps */ @@ -422,6 +732,9 @@ GST_DEBUG_CATEGORY_INIT (gst_decklink_video_sink_debug, "decklinkvideosink", 0, "debug category for decklinkvideosink element"); + + gst_type_mark_as_plugin_api (GST_TYPE_DECKLINK_MAPPING_FORMAT, + (GstPluginAPIFlags) 0); } static void @@ -429,12 +742,14 @@ { self->mode = GST_DECKLINK_MODE_NTSC; self->device_number = 0; + self->persistent_id = DEFAULT_PERSISTENT_ID; self->video_format = GST_DECKLINK_VIDEO_FORMAT_8BIT_YUV; self->profile_id = GST_DECKLINK_PROFILE_ID_DEFAULT; /* VITC is legacy, we should expect RP188 in modern use cases */ self->timecode_format = bmdTimecodeRP188Any; self->caption_line = 0; self->afd_bar_line = 0; + self->mapping_format = GST_DECKLINK_MAPPING_FORMAT_DEFAULT; gst_base_sink_set_max_lateness (GST_BASE_SINK_CAST (self), 20 * GST_MSECOND); gst_base_sink_set_qos_enabled (GST_BASE_SINK_CAST (self), TRUE); @@ -490,6 +805,13 @@ case PROP_AFD_BAR_LINE: self->afd_bar_line = g_value_get_int (value); break; + case PROP_MAPPING_FORMAT: + self->mapping_format = + (GstDecklinkMappingFormat) g_value_get_enum (value); + break; + case PROP_PERSISTENT_ID: + self->persistent_id = g_value_get_int64 (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -538,6 +860,12 @@ case PROP_AFD_BAR_LINE: g_value_set_int (value, self->afd_bar_line); break; + case PROP_MAPPING_FORMAT: + g_value_set_enum (value, self->mapping_format); + break; + case PROP_PERSISTENT_ID: + g_value_set_int64 (value, self->persistent_id); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -926,7 +1254,7 @@ static void write_vbi (GstDecklinkVideoSink * self, GstBuffer * buffer, - BMDPixelFormat format, IDeckLinkMutableVideoFrame * frame, + BMDPixelFormat format, GstDecklinkVideoFrame * frame, GstVideoTimeCodeMeta * tc_meta) { IDeckLinkVideoFrameAncillary *vanc_frame = NULL; @@ -1205,23 +1533,32 @@ } } +static gboolean +buffer_is_pbo_memory (GstBuffer * buffer) +{ + GstMemory *mem; + + mem = gst_buffer_peek_memory (buffer, 0); + if (mem->allocator + && g_strcmp0 (mem->allocator->mem_type, "GLMemoryPBO") == 0) + return TRUE; + return FALSE; +} + static GstFlowReturn gst_decklink_video_sink_prepare (GstBaseSink * bsink, GstBuffer * buffer) { GstDecklinkVideoSink *self = GST_DECKLINK_VIDEO_SINK_CAST (bsink); GstVideoFrame vframe; - IDeckLinkMutableVideoFrame *frame; - guint8 *outdata, *indata; + GstDecklinkVideoFrame *frame = NULL; GstFlowReturn flow_ret; HRESULT ret; GstClockTime timestamp, duration; GstClockTime running_time, running_time_duration; GstClockTime latency, render_delay; GstClockTimeDiff ts_offset; - gint i; GstDecklinkVideoFormat caps_format; BMDPixelFormat format; - gint stride; GstVideoTimeCodeMeta *tc_meta; GST_DEBUG_OBJECT (self, "Preparing buffer %" GST_PTR_FORMAT, buffer); @@ -1270,58 +1607,57 @@ else running_time = 0; - ret = self->output->output->CreateVideoFrame (self->info.width, - self->info.height, self->info.stride0, format, bmdFrameFlagDefault, - &frame); - if (ret != S_OK) { - GST_ELEMENT_ERROR (self, STREAM, FAILED, - (NULL), ("Failed to create video frame: 0x%08lx", (unsigned long) ret)); - return GST_FLOW_ERROR; - } - if (!gst_video_frame_map (&vframe, &self->info, buffer, GST_MAP_READ)) { GST_ERROR_OBJECT (self, "Failed to map video frame"); flow_ret = GST_FLOW_ERROR; goto out; } + // If the video frame is stored in PBO memory then we need to copy anyway as + // it might be stored in CPU-accessible GPU memory that can't be accessed + // from the Decklink driver. + if (buffer_is_pbo_memory (buffer)) { + guint8 *outdata; + const guint8 *indata; + gint i, src_stride, dest_stride, stride; + IDeckLinkMutableVideoFrame *dframe; + + ret = self->output->output->CreateVideoFrame (self->info.width, + self->info.height, self->info.stride0, format, bmdFrameFlagDefault, + &dframe); - frame->GetBytes ((void **) &outdata); - indata = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0); - stride = - MIN (GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0), frame->GetRowBytes ()); - for (i = 0; i < self->info.height; i++) { - memcpy (outdata, indata, stride); - indata += GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0); - outdata += frame->GetRowBytes (); + if (ret != S_OK) { + gst_video_frame_unmap (&vframe); + GST_ELEMENT_ERROR (self, STREAM, FAILED, + (NULL), ("Failed to create video frame: 0x%08lx", + (unsigned long) ret)); + return GST_FLOW_ERROR; + } + + dframe->GetBytes ((void **) &outdata); + indata = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0); + src_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0); + dest_stride = dframe->GetRowBytes (); + stride = MIN (src_stride, dest_stride); + for (i = 0; i < self->info.height; i++) { + memcpy (outdata, indata, stride); + indata += src_stride; + outdata += dest_stride; + } + gst_video_frame_unmap (&vframe); + + // Takes ownership of the frame + frame = new GstDecklinkVideoFrame (dframe); + } else { + // Takes ownership of the frame + frame = new GstDecklinkVideoFrame (&vframe); } - gst_video_frame_unmap (&vframe); tc_meta = gst_buffer_get_video_time_code_meta (buffer); if (tc_meta) { - BMDTimecodeFlags bflags = (BMDTimecodeFlags) 0; gchar *tc_str; - if (((GstVideoTimeCodeFlags) (tc_meta->tc. - config.flags)) & GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME) - bflags = (BMDTimecodeFlags) (bflags | bmdTimecodeIsDropFrame); - else - bflags = (BMDTimecodeFlags) (bflags | bmdTimecodeFlagDefault); - if (tc_meta->tc.field_count == 2) - bflags = (BMDTimecodeFlags) (bflags | bmdTimecodeFieldMark); - + frame->SetTimecode (&tc_meta->tc); tc_str = gst_video_time_code_to_string (&tc_meta->tc); - ret = frame->SetTimecodeFromComponents (self->timecode_format, - (uint8_t) tc_meta->tc.hours, - (uint8_t) tc_meta->tc.minutes, - (uint8_t) tc_meta->tc.seconds, (uint8_t) tc_meta->tc.frames, bflags); - if (ret != S_OK) { - GST_ERROR_OBJECT (self, - "Failed to set timecode %s to video frame: 0x%08lx", tc_str, - (unsigned long) ret); - flow_ret = GST_FLOW_ERROR; - g_free (tc_str); - goto out; - } GST_DEBUG_OBJECT (self, "Set frame timecode to %s", tc_str); g_free (tc_str); } @@ -1348,7 +1684,8 @@ out: - frame->Release (); + if (frame) + frame->Release (); return flow_ret; } @@ -1362,7 +1699,7 @@ GST_DEBUG_OBJECT (self, "Starting"); self->output = - gst_decklink_acquire_nth_output (self->device_number, + gst_decklink_acquire_nth_output (self->device_number, self->persistent_id, GST_ELEMENT_CAST (self), FALSE); if (!self->output) { GST_ERROR_OBJECT (self, "Failed to acquire output"); @@ -1407,7 +1744,7 @@ g_mutex_unlock (&self->output->lock); self->output->output->DisableVideoOutput (); - gst_decklink_release_nth_output (self->device_number, + gst_decklink_release_nth_output (self->device_number, self->persistent_id, GST_ELEMENT_CAST (self), FALSE); self->output = NULL; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/gstdecklinkvideosink.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/gstdecklinkvideosink.h
Changed
@@ -51,6 +51,7 @@ GstDecklinkModeEnum mode; gint device_number; + gint64 persistent_id; GstDecklinkVideoFormat video_format; GstDecklinkProfileId profile_id; BMDTimecodeFormat timecode_format; @@ -75,6 +76,7 @@ guint16 cdp_hdr_sequence_cntr; gint afd_bar_line; + GstDecklinkMappingFormat mapping_format; }; struct _GstDecklinkVideoSinkClass
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/gstdecklinkvideosrc.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/gstdecklinkvideosrc.cpp
Changed
@@ -149,6 +149,7 @@ #define DEFAULT_DROP_NO_SIGNAL_FRAMES (FALSE) #define DEFAULT_OUTPUT_CC (FALSE) #define DEFAULT_OUTPUT_AFD_BAR (FALSE) +#define DEFAULT_PERSISTENT_ID (-1) #ifndef ABSDIFF #define ABSDIFF(x, y) ( (x) > (y) ? ((x) - (y)) : ((y) - (x)) ) @@ -171,6 +172,7 @@ PROP_DROP_NO_SIGNAL_FRAMES, PROP_SIGNAL, PROP_HW_SERIAL_NUMBER, + PROP_PERSISTENT_ID, PROP_OUTPUT_CC, PROP_OUTPUT_AFD_BAR, }; @@ -292,6 +294,23 @@ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); + /** + * GstDecklinkVideoSrc:persistent-id + * + * Decklink device to use. Higher priority than "device-number". + * BMDDeckLinkPersistentID is a device specific, 32-bit unique identifier. + * It is stable even when the device is plugged in a different connector, + * across reboots, and when plugged into different computers. + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_PERSISTENT_ID, + g_param_spec_int64 ("persistent-id", "Persistent id", + "Output device instance to use. Higher priority than \"device-number\".", + DEFAULT_PERSISTENT_ID, G_MAXINT64, DEFAULT_PERSISTENT_ID, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + G_PARAM_CONSTRUCT))); + g_object_class_install_property (gobject_class, PROP_BUFFER_SIZE, g_param_spec_uint ("buffer-size", "Buffer Size", "Size of internal buffer in number of video frames", 1, @@ -398,6 +417,7 @@ self->caps_format = bmdFormat8BitYUV; self->connection = DEFAULT_CONNECTION; self->device_number = 0; + self->persistent_id = DEFAULT_PERSISTENT_ID; self->buffer_size = DEFAULT_BUFFER_SIZE; self->video_format = GST_DECKLINK_VIDEO_FORMAT_AUTO; self->profile_id = GST_DECKLINK_PROFILE_ID_DEFAULT; @@ -492,6 +512,9 @@ case PROP_DROP_NO_SIGNAL_FRAMES: self->drop_no_signal_frames = g_value_get_boolean (value); break; + case PROP_PERSISTENT_ID: + self->persistent_id = g_value_get_int64 (value); + break; case PROP_OUTPUT_CC: self->output_cc = g_value_get_boolean (value); break; @@ -542,6 +565,9 @@ case PROP_DROP_NO_SIGNAL_FRAMES: g_value_set_boolean (value, self->drop_no_signal_frames); break; + case PROP_PERSISTENT_ID: + g_value_set_int64 (value, self->persistent_id); + break; case PROP_SIGNAL: g_value_set_boolean (value, self->signal_state == SIGNAL_STATE_AVAILABLE); break; @@ -1552,7 +1578,7 @@ GST_DEBUG_OBJECT (self, "Opening"); self->input = - gst_decklink_acquire_nth_input (self->device_number, + gst_decklink_acquire_nth_input (self->device_number, self->persistent_id, GST_ELEMENT_CAST (self), FALSE); if (!self->input) { GST_ERROR_OBJECT (self, "Failed to acquire input"); @@ -1566,6 +1592,7 @@ g_mutex_lock (&self->input->lock); self->input->mode = mode; self->input->format = self->caps_format; + self->input->auto_format = self->video_format == GST_DECKLINK_VIDEO_FORMAT_AUTO; self->input->got_video_frame = gst_decklink_video_src_got_frame; self->input->start_streams = gst_decklink_video_src_start_streams; g_mutex_unlock (&self->input->lock); @@ -1587,7 +1614,7 @@ self->input->start_streams = NULL; g_mutex_unlock (&self->input->lock); - gst_decklink_release_nth_input (self->device_number, + gst_decklink_release_nth_input (self->device_number, self->persistent_id, GST_ELEMENT_CAST (self), FALSE); self->input = NULL; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/gstdecklinkvideosrc.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/gstdecklinkvideosrc.h
Changed
@@ -62,6 +62,7 @@ BMDPixelFormat caps_format; GstDecklinkConnectionEnum connection; gint device_number; + gint64 persistent_id; gboolean output_stream_time; GstClockTime skip_first_time; gboolean drop_no_signal_frames;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/linux/DeckLinkAPI.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/linux/DeckLinkAPI.h
Changed
@@ -1,29 +1,43 @@ /* -LICENSE-START- -** Copyright (c) 2019 Blackmagic Design -** -** Permission is hereby granted, free of charge, to any person or organization -** obtaining a copy of the software and accompanying documentation covered by -** this license (the "Software") to use, reproduce, display, distribute, -** execute, and transmit the Software, and to prepare derivative works of the -** Software, and to permit third-parties to whom the Software is furnished to -** do so, all subject to the following: -** -** The copyright notices in the Software and this entire statement, including -** the above license grant, this restriction and the following disclaimer, -** must be included in all copies of the Software, in whole or in part, and -** all derivative works of the Software, unless such copies or derivative -** works are solely in the form of machine-executable object code generated by -** a source language processor. -** -** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -** DEALINGS IN THE SOFTWARE. -** -LICENSE-END- -*/ + ** Copyright (c) 2021 Blackmagic Design + ** + ** Permission is hereby granted, free of charge, to any person or organization + ** obtaining a copy of the software and accompanying documentation (the + ** "Software") to use, reproduce, display, distribute, sub-license, execute, + ** and transmit the Software, and to prepare derivative works of the Software, + ** and to permit third-parties to whom the Software is furnished to do so, in + ** accordance with: + ** + ** (1) if the Software is obtained from Blackmagic Design, the End User License + ** Agreement for the Software Development Kit ("EULA") available at + ** https://www.blackmagicdesign.com/EULA/DeckLinkSDK; or + ** + ** (2) if the Software is obtained from any third party, such licensing terms + ** as notified by that third party, + ** + ** and all subject to the following: + ** + ** (3) the copyright notices in the Software and this entire statement, + ** including the above license grant, this restriction and the following + ** disclaimer, must be included in all copies of the Software, in whole or in + ** part, and all derivative works of the Software, unless such copies or + ** derivative works are solely in the form of machine-executable object code + ** generated by a source language processor. + ** + ** (4) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + ** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + ** DEALINGS IN THE SOFTWARE. + ** + ** A copy of the Software is available free of charge at + ** https://www.blackmagicdesign.com/desktopvideo_sdk under the EULA. + ** + ** -LICENSE-END- + */ + #ifndef BMD_DECKLINKAPI_H #define BMD_DECKLINKAPI_H @@ -59,45 +73,45 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLinkVideoOutputCallback = /* 20AA5225-1958-47CB-820B-80A8D521A6EE */ {0x20,0xAA,0x52,0x25,0x19,0x58,0x47,0xCB,0x82,0x0B,0x80,0xA8,0xD5,0x21,0xA6,0xEE}; -BMD_CONST REFIID IID_IDeckLinkInputCallback = /* DD04E5EC-7415-42AB-AE4A-E80C4DFC044A */ {0xDD,0x04,0xE5,0xEC,0x74,0x15,0x42,0xAB,0xAE,0x4A,0xE8,0x0C,0x4D,0xFC,0x04,0x4A}; -BMD_CONST REFIID IID_IDeckLinkEncoderInputCallback = /* ACF13E61-F4A0-4974-A6A7-59AFF6268B31 */ {0xAC,0xF1,0x3E,0x61,0xF4,0xA0,0x49,0x74,0xA6,0xA7,0x59,0xAF,0xF6,0x26,0x8B,0x31}; -BMD_CONST REFIID IID_IDeckLinkMemoryAllocator = /* B36EB6E7-9D29-4AA8-92EF-843B87A289E8 */ {0xB3,0x6E,0xB6,0xE7,0x9D,0x29,0x4A,0xA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8}; -BMD_CONST REFIID IID_IDeckLinkAudioOutputCallback = /* 403C681B-7F46-4A12-B993-2BB127084EE6 */ {0x40,0x3C,0x68,0x1B,0x7F,0x46,0x4A,0x12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6}; -BMD_CONST REFIID IID_IDeckLinkIterator = /* 50FB36CD-3063-4B73-BDBB-958087F2D8BA */ {0x50,0xFB,0x36,0xCD,0x30,0x63,0x4B,0x73,0xBD,0xBB,0x95,0x80,0x87,0xF2,0xD8,0xBA}; -BMD_CONST REFIID IID_IDeckLinkAPIInformation = /* 7BEA3C68-730D-4322-AF34-8A7152B532A4 */ {0x7B,0xEA,0x3C,0x68,0x73,0x0D,0x43,0x22,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4}; -BMD_CONST REFIID IID_IDeckLinkOutput = /* 065A0F6C-C508-4D0D-B919-F5EB0EBFC96B */ {0x06,0x5A,0x0F,0x6C,0xC5,0x08,0x4D,0x0D,0xB9,0x19,0xF5,0xEB,0x0E,0xBF,0xC9,0x6B}; -BMD_CONST REFIID IID_IDeckLinkInput = /* 2A88CF76-F494-4216-A7EF-DC74EEB83882 */ {0x2A,0x88,0xCF,0x76,0xF4,0x94,0x42,0x16,0xA7,0xEF,0xDC,0x74,0xEE,0xB8,0x38,0x82}; -BMD_CONST REFIID IID_IDeckLinkHDMIInputEDID = /* ABBBACBC-45BC-4665-9D92-ACE6E5A97902 */ {0xAB,0xBB,0xAC,0xBC,0x45,0xBC,0x46,0x65,0x9D,0x92,0xAC,0xE6,0xE5,0xA9,0x79,0x02}; -BMD_CONST REFIID IID_IDeckLinkEncoderInput = /* F222551D-13DF-4FD8-B587-9D4F19EC12C9 */ {0xF2,0x22,0x55,0x1D,0x13,0xDF,0x4F,0xD8,0xB5,0x87,0x9D,0x4F,0x19,0xEC,0x12,0xC9}; -BMD_CONST REFIID IID_IDeckLinkVideoFrame = /* 3F716FE0-F023-4111-BE5D-EF4414C05B17 */ {0x3F,0x71,0x6F,0xE0,0xF0,0x23,0x41,0x11,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17}; -BMD_CONST REFIID IID_IDeckLinkMutableVideoFrame = /* 69E2639F-40DA-4E19-B6F2-20ACE815C390 */ {0x69,0xE2,0x63,0x9F,0x40,0xDA,0x4E,0x19,0xB6,0xF2,0x20,0xAC,0xE8,0x15,0xC3,0x90}; -BMD_CONST REFIID IID_IDeckLinkVideoFrame3DExtensions = /* DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7 */ {0xDA,0x0F,0x7E,0x4A,0xED,0xC7,0x48,0xA8,0x9C,0xDD,0x2D,0xB5,0x1C,0x72,0x9C,0xD7}; -BMD_CONST REFIID IID_IDeckLinkVideoFrameMetadataExtensions = /* D5973DC9-6432-46D0-8F0B-2496F8A1238F */ {0xD5,0x97,0x3D,0xC9,0x64,0x32,0x46,0xD0,0x8F,0x0B,0x24,0x96,0xF8,0xA1,0x23,0x8F}; -BMD_CONST REFIID IID_IDeckLinkVideoInputFrame = /* 05CFE374-537C-4094-9A57-680525118F44 */ {0x05,0xCF,0xE3,0x74,0x53,0x7C,0x40,0x94,0x9A,0x57,0x68,0x05,0x25,0x11,0x8F,0x44}; -BMD_CONST REFIID IID_IDeckLinkAncillaryPacket = /* CC5BBF7E-029C-4D3B-9158-6000EF5E3670 */ {0xCC,0x5B,0xBF,0x7E,0x02,0x9C,0x4D,0x3B,0x91,0x58,0x60,0x00,0xEF,0x5E,0x36,0x70}; -BMD_CONST REFIID IID_IDeckLinkAncillaryPacketIterator = /* 3FC8994B-88FB-4C17-968F-9AAB69D964A7 */ {0x3F,0xC8,0x99,0x4B,0x88,0xFB,0x4C,0x17,0x96,0x8F,0x9A,0xAB,0x69,0xD9,0x64,0xA7}; -BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillaryPackets = /* 6C186C0F-459E-41D8-AEE2-4812D81AEE68 */ {0x6C,0x18,0x6C,0x0F,0x45,0x9E,0x41,0xD8,0xAE,0xE2,0x48,0x12,0xD8,0x1A,0xEE,0x68}; -BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillary = /* 732E723C-D1A4-4E29-9E8E-4A88797A0004 */ {0x73,0x2E,0x72,0x3C,0xD1,0xA4,0x4E,0x29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04}; -BMD_CONST REFIID IID_IDeckLinkEncoderPacket = /* B693F36C-316E-4AF1-B6C2-F389A4BCA620 */ {0xB6,0x93,0xF3,0x6C,0x31,0x6E,0x4A,0xF1,0xB6,0xC2,0xF3,0x89,0xA4,0xBC,0xA6,0x20}; -BMD_CONST REFIID IID_IDeckLinkEncoderVideoPacket = /* 4E7FD944-E8C7-4EAC-B8C0-7B77F80F5AE0 */ {0x4E,0x7F,0xD9,0x44,0xE8,0xC7,0x4E,0xAC,0xB8,0xC0,0x7B,0x77,0xF8,0x0F,0x5A,0xE0}; -BMD_CONST REFIID IID_IDeckLinkEncoderAudioPacket = /* 49E8EDC8-693B-4E14-8EF6-12C658F5A07A */ {0x49,0xE8,0xED,0xC8,0x69,0x3B,0x4E,0x14,0x8E,0xF6,0x12,0xC6,0x58,0xF5,0xA0,0x7A}; -BMD_CONST REFIID IID_IDeckLinkH265NALPacket = /* 639C8E0B-68D5-4BDE-A6D4-95F3AEAFF2E7 */ {0x63,0x9C,0x8E,0x0B,0x68,0xD5,0x4B,0xDE,0xA6,0xD4,0x95,0xF3,0xAE,0xAF,0xF2,0xE7}; -BMD_CONST REFIID IID_IDeckLinkAudioInputPacket = /* E43D5870-2894-11DE-8C30-0800200C9A66 */ {0xE4,0x3D,0x58,0x70,0x28,0x94,0x11,0xDE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66}; -BMD_CONST REFIID IID_IDeckLinkScreenPreviewCallback = /* B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438 */ {0xB1,0xD3,0xF4,0x9A,0x85,0xFE,0x4C,0x5D,0x95,0xC8,0x0B,0x5D,0x5D,0xCC,0xD4,0x38}; -BMD_CONST REFIID IID_IDeckLinkGLScreenPreviewHelper = /* 504E2209-CAC7-4C1A-9FB4-C5BB6274D22F */ {0x50,0x4E,0x22,0x09,0xCA,0xC7,0x4C,0x1A,0x9F,0xB4,0xC5,0xBB,0x62,0x74,0xD2,0x2F}; -BMD_CONST REFIID IID_IDeckLinkNotificationCallback = /* B002A1EC-070D-4288-8289-BD5D36E5FF0D */ {0xB0,0x02,0xA1,0xEC,0x07,0x0D,0x42,0x88,0x82,0x89,0xBD,0x5D,0x36,0xE5,0xFF,0x0D}; -BMD_CONST REFIID IID_IDeckLinkNotification = /* B85DF4C8-BDF5-47C1-8064-28162EBDD4EB */ {0xB8,0x5D,0xF4,0xC8,0xBD,0xF5,0x47,0xC1,0x80,0x64,0x28,0x16,0x2E,0xBD,0xD4,0xEB}; -BMD_CONST REFIID IID_IDeckLinkProfileAttributes = /* 17D4BF8E-4911-473A-80A0-731CF6FF345B */ {0x17,0xD4,0xBF,0x8E,0x49,0x11,0x47,0x3A,0x80,0xA0,0x73,0x1C,0xF6,0xFF,0x34,0x5B}; -BMD_CONST REFIID IID_IDeckLinkProfileIterator = /* 29E5A8C0-8BE4-46EB-93AC-31DAAB5B7BF2 */ {0x29,0xE5,0xA8,0xC0,0x8B,0xE4,0x46,0xEB,0x93,0xAC,0x31,0xDA,0xAB,0x5B,0x7B,0xF2}; -BMD_CONST REFIID IID_IDeckLinkProfile = /* 16093466-674A-432B-9DA0-1AC2C5A8241C */ {0x16,0x09,0x34,0x66,0x67,0x4A,0x43,0x2B,0x9D,0xA0,0x1A,0xC2,0xC5,0xA8,0x24,0x1C}; -BMD_CONST REFIID IID_IDeckLinkProfileCallback = /* A4F9341E-97AA-4E04-8935-15F809898CEA */ {0xA4,0xF9,0x34,0x1E,0x97,0xAA,0x4E,0x04,0x89,0x35,0x15,0xF8,0x09,0x89,0x8C,0xEA}; -BMD_CONST REFIID IID_IDeckLinkProfileManager = /* 30D41429-3998-4B6D-84F8-78C94A797C6E */ {0x30,0xD4,0x14,0x29,0x39,0x98,0x4B,0x6D,0x84,0xF8,0x78,0xC9,0x4A,0x79,0x7C,0x6E}; -BMD_CONST REFIID IID_IDeckLinkStatus = /* 5F558200-4028-49BC-BEAC-DB3FA4A96E46 */ {0x5F,0x55,0x82,0x00,0x40,0x28,0x49,0xBC,0xBE,0xAC,0xDB,0x3F,0xA4,0xA9,0x6E,0x46}; -BMD_CONST REFIID IID_IDeckLinkKeyer = /* 89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3 */ {0x89,0xAF,0xCA,0xF5,0x65,0xF8,0x42,0x1E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3}; -BMD_CONST REFIID IID_IDeckLinkVideoConversion = /* 3BBCB8A2-DA2C-42D9-B5D8-88083644E99A */ {0x3B,0xBC,0xB8,0xA2,0xDA,0x2C,0x42,0xD9,0xB5,0xD8,0x88,0x08,0x36,0x44,0xE9,0x9A}; -BMD_CONST REFIID IID_IDeckLinkDeviceNotificationCallback = /* 4997053B-0ADF-4CC8-AC70-7A50C4BE728F */ {0x49,0x97,0x05,0x3B,0x0A,0xDF,0x4C,0xC8,0xAC,0x70,0x7A,0x50,0xC4,0xBE,0x72,0x8F}; -BMD_CONST REFIID IID_IDeckLinkDiscovery = /* CDBF631C-BC76-45FA-B44D-C55059BC6101 */ {0xCD,0xBF,0x63,0x1C,0xBC,0x76,0x45,0xFA,0xB4,0x4D,0xC5,0x50,0x59,0xBC,0x61,0x01}; +BMD_CONST REFIID IID_IDeckLinkVideoOutputCallback = /* 20AA5225-1958-47CB-820B-80A8D521A6EE */ { 0x20,0xAA,0x52,0x25,0x19,0x58,0x47,0xCB,0x82,0x0B,0x80,0xA8,0xD5,0x21,0xA6,0xEE }; +BMD_CONST REFIID IID_IDeckLinkInputCallback = /* C6FCE4C9-C4E4-4047-82FB-5D238232A902 */ { 0xC6,0xFC,0xE4,0xC9,0xC4,0xE4,0x40,0x47,0x82,0xFB,0x5D,0x23,0x82,0x32,0xA9,0x02 }; +BMD_CONST REFIID IID_IDeckLinkEncoderInputCallback = /* ACF13E61-F4A0-4974-A6A7-59AFF6268B31 */ { 0xAC,0xF1,0x3E,0x61,0xF4,0xA0,0x49,0x74,0xA6,0xA7,0x59,0xAF,0xF6,0x26,0x8B,0x31 }; +BMD_CONST REFIID IID_IDeckLinkMemoryAllocator = /* B36EB6E7-9D29-4AA8-92EF-843B87A289E8 */ { 0xB3,0x6E,0xB6,0xE7,0x9D,0x29,0x4A,0xA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8 }; +BMD_CONST REFIID IID_IDeckLinkAudioOutputCallback = /* 403C681B-7F46-4A12-B993-2BB127084EE6 */ { 0x40,0x3C,0x68,0x1B,0x7F,0x46,0x4A,0x12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6 }; +BMD_CONST REFIID IID_IDeckLinkIterator = /* 50FB36CD-3063-4B73-BDBB-958087F2D8BA */ { 0x50,0xFB,0x36,0xCD,0x30,0x63,0x4B,0x73,0xBD,0xBB,0x95,0x80,0x87,0xF2,0xD8,0xBA }; +BMD_CONST REFIID IID_IDeckLinkAPIInformation = /* 7BEA3C68-730D-4322-AF34-8A7152B532A4 */ { 0x7B,0xEA,0x3C,0x68,0x73,0x0D,0x43,0x22,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4 }; +BMD_CONST REFIID IID_IDeckLinkOutput = /* BE2D9020-461E-442F-84B7-E949CB953B9D */ { 0xBE,0x2D,0x90,0x20,0x46,0x1E,0x44,0x2F,0x84,0xB7,0xE9,0x49,0xCB,0x95,0x3B,0x9D }; +BMD_CONST REFIID IID_IDeckLinkInput = /* C21CDB6E-F414-46E4-A636-80A566E0ED37 */ { 0xC2,0x1C,0xDB,0x6E,0xF4,0x14,0x46,0xE4,0xA6,0x36,0x80,0xA5,0x66,0xE0,0xED,0x37 }; +BMD_CONST REFIID IID_IDeckLinkHDMIInputEDID = /* ABBBACBC-45BC-4665-9D92-ACE6E5A97902 */ { 0xAB,0xBB,0xAC,0xBC,0x45,0xBC,0x46,0x65,0x9D,0x92,0xAC,0xE6,0xE5,0xA9,0x79,0x02 }; +BMD_CONST REFIID IID_IDeckLinkEncoderInput = /* F222551D-13DF-4FD8-B587-9D4F19EC12C9 */ { 0xF2,0x22,0x55,0x1D,0x13,0xDF,0x4F,0xD8,0xB5,0x87,0x9D,0x4F,0x19,0xEC,0x12,0xC9 }; +BMD_CONST REFIID IID_IDeckLinkVideoFrame = /* 3F716FE0-F023-4111-BE5D-EF4414C05B17 */ { 0x3F,0x71,0x6F,0xE0,0xF0,0x23,0x41,0x11,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17 }; +BMD_CONST REFIID IID_IDeckLinkMutableVideoFrame = /* 69E2639F-40DA-4E19-B6F2-20ACE815C390 */ { 0x69,0xE2,0x63,0x9F,0x40,0xDA,0x4E,0x19,0xB6,0xF2,0x20,0xAC,0xE8,0x15,0xC3,0x90 }; +BMD_CONST REFIID IID_IDeckLinkVideoFrame3DExtensions = /* DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7 */ { 0xDA,0x0F,0x7E,0x4A,0xED,0xC7,0x48,0xA8,0x9C,0xDD,0x2D,0xB5,0x1C,0x72,0x9C,0xD7 }; +BMD_CONST REFIID IID_IDeckLinkVideoFrameMetadataExtensions = /* E232A5B7-4DB4-44C9-9152-F47C12E5F051 */ { 0xE2,0x32,0xA5,0xB7,0x4D,0xB4,0x44,0xC9,0x91,0x52,0xF4,0x7C,0x12,0xE5,0xF0,0x51 }; +BMD_CONST REFIID IID_IDeckLinkVideoInputFrame = /* 05CFE374-537C-4094-9A57-680525118F44 */ { 0x05,0xCF,0xE3,0x74,0x53,0x7C,0x40,0x94,0x9A,0x57,0x68,0x05,0x25,0x11,0x8F,0x44 }; +BMD_CONST REFIID IID_IDeckLinkAncillaryPacket = /* CC5BBF7E-029C-4D3B-9158-6000EF5E3670 */ { 0xCC,0x5B,0xBF,0x7E,0x02,0x9C,0x4D,0x3B,0x91,0x58,0x60,0x00,0xEF,0x5E,0x36,0x70 }; +BMD_CONST REFIID IID_IDeckLinkAncillaryPacketIterator = /* 3FC8994B-88FB-4C17-968F-9AAB69D964A7 */ { 0x3F,0xC8,0x99,0x4B,0x88,0xFB,0x4C,0x17,0x96,0x8F,0x9A,0xAB,0x69,0xD9,0x64,0xA7 }; +BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillaryPackets = /* 6C186C0F-459E-41D8-AEE2-4812D81AEE68 */ { 0x6C,0x18,0x6C,0x0F,0x45,0x9E,0x41,0xD8,0xAE,0xE2,0x48,0x12,0xD8,0x1A,0xEE,0x68 }; +BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillary = /* 732E723C-D1A4-4E29-9E8E-4A88797A0004 */ { 0x73,0x2E,0x72,0x3C,0xD1,0xA4,0x4E,0x29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04 }; +BMD_CONST REFIID IID_IDeckLinkEncoderPacket = /* B693F36C-316E-4AF1-B6C2-F389A4BCA620 */ { 0xB6,0x93,0xF3,0x6C,0x31,0x6E,0x4A,0xF1,0xB6,0xC2,0xF3,0x89,0xA4,0xBC,0xA6,0x20 }; +BMD_CONST REFIID IID_IDeckLinkEncoderVideoPacket = /* 4E7FD944-E8C7-4EAC-B8C0-7B77F80F5AE0 */ { 0x4E,0x7F,0xD9,0x44,0xE8,0xC7,0x4E,0xAC,0xB8,0xC0,0x7B,0x77,0xF8,0x0F,0x5A,0xE0 }; +BMD_CONST REFIID IID_IDeckLinkEncoderAudioPacket = /* 49E8EDC8-693B-4E14-8EF6-12C658F5A07A */ { 0x49,0xE8,0xED,0xC8,0x69,0x3B,0x4E,0x14,0x8E,0xF6,0x12,0xC6,0x58,0xF5,0xA0,0x7A }; +BMD_CONST REFIID IID_IDeckLinkH265NALPacket = /* 639C8E0B-68D5-4BDE-A6D4-95F3AEAFF2E7 */ { 0x63,0x9C,0x8E,0x0B,0x68,0xD5,0x4B,0xDE,0xA6,0xD4,0x95,0xF3,0xAE,0xAF,0xF2,0xE7 }; +BMD_CONST REFIID IID_IDeckLinkAudioInputPacket = /* E43D5870-2894-11DE-8C30-0800200C9A66 */ { 0xE4,0x3D,0x58,0x70,0x28,0x94,0x11,0xDE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66 }; +BMD_CONST REFIID IID_IDeckLinkScreenPreviewCallback = /* B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438 */ { 0xB1,0xD3,0xF4,0x9A,0x85,0xFE,0x4C,0x5D,0x95,0xC8,0x0B,0x5D,0x5D,0xCC,0xD4,0x38 }; +BMD_CONST REFIID IID_IDeckLinkGLScreenPreviewHelper = /* 504E2209-CAC7-4C1A-9FB4-C5BB6274D22F */ { 0x50,0x4E,0x22,0x09,0xCA,0xC7,0x4C,0x1A,0x9F,0xB4,0xC5,0xBB,0x62,0x74,0xD2,0x2F }; +BMD_CONST REFIID IID_IDeckLinkNotificationCallback = /* B002A1EC-070D-4288-8289-BD5D36E5FF0D */ { 0xB0,0x02,0xA1,0xEC,0x07,0x0D,0x42,0x88,0x82,0x89,0xBD,0x5D,0x36,0xE5,0xFF,0x0D }; +BMD_CONST REFIID IID_IDeckLinkNotification = /* B85DF4C8-BDF5-47C1-8064-28162EBDD4EB */ { 0xB8,0x5D,0xF4,0xC8,0xBD,0xF5,0x47,0xC1,0x80,0x64,0x28,0x16,0x2E,0xBD,0xD4,0xEB }; +BMD_CONST REFIID IID_IDeckLinkProfileAttributes = /* 17D4BF8E-4911-473A-80A0-731CF6FF345B */ { 0x17,0xD4,0xBF,0x8E,0x49,0x11,0x47,0x3A,0x80,0xA0,0x73,0x1C,0xF6,0xFF,0x34,0x5B }; +BMD_CONST REFIID IID_IDeckLinkProfileIterator = /* 29E5A8C0-8BE4-46EB-93AC-31DAAB5B7BF2 */ { 0x29,0xE5,0xA8,0xC0,0x8B,0xE4,0x46,0xEB,0x93,0xAC,0x31,0xDA,0xAB,0x5B,0x7B,0xF2 }; +BMD_CONST REFIID IID_IDeckLinkProfile = /* 16093466-674A-432B-9DA0-1AC2C5A8241C */ { 0x16,0x09,0x34,0x66,0x67,0x4A,0x43,0x2B,0x9D,0xA0,0x1A,0xC2,0xC5,0xA8,0x24,0x1C }; +BMD_CONST REFIID IID_IDeckLinkProfileCallback = /* A4F9341E-97AA-4E04-8935-15F809898CEA */ { 0xA4,0xF9,0x34,0x1E,0x97,0xAA,0x4E,0x04,0x89,0x35,0x15,0xF8,0x09,0x89,0x8C,0xEA }; +BMD_CONST REFIID IID_IDeckLinkProfileManager = /* 30D41429-3998-4B6D-84F8-78C94A797C6E */ { 0x30,0xD4,0x14,0x29,0x39,0x98,0x4B,0x6D,0x84,0xF8,0x78,0xC9,0x4A,0x79,0x7C,0x6E }; +BMD_CONST REFIID IID_IDeckLinkStatus = /* 5F558200-4028-49BC-BEAC-DB3FA4A96E46 */ { 0x5F,0x55,0x82,0x00,0x40,0x28,0x49,0xBC,0xBE,0xAC,0xDB,0x3F,0xA4,0xA9,0x6E,0x46 }; +BMD_CONST REFIID IID_IDeckLinkKeyer = /* 89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3 */ { 0x89,0xAF,0xCA,0xF5,0x65,0xF8,0x42,0x1E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3 }; +BMD_CONST REFIID IID_IDeckLinkVideoConversion = /* 3BBCB8A2-DA2C-42D9-B5D8-88083644E99A */ { 0x3B,0xBC,0xB8,0xA2,0xDA,0x2C,0x42,0xD9,0xB5,0xD8,0x88,0x08,0x36,0x44,0xE9,0x9A }; +BMD_CONST REFIID IID_IDeckLinkDeviceNotificationCallback = /* 4997053B-0ADF-4CC8-AC70-7A50C4BE728F */ { 0x49,0x97,0x05,0x3B,0x0A,0xDF,0x4C,0xC8,0xAC,0x70,0x7A,0x50,0xC4,0xBE,0x72,0x8F }; +BMD_CONST REFIID IID_IDeckLinkDiscovery = /* CDBF631C-BC76-45FA-B44D-C55059BC6101 */ { 0xCD,0xBF,0x63,0x1C,0xBC,0x76,0x45,0xFA,0xB4,0x4D,0xC5,0x50,0x59,0xBC,0x61,0x01 }; /* Enum BMDVideoOutputFlags - Flags to control the output of ancillary data along with video. */ @@ -111,7 +125,7 @@ bmdVideoOutputSynchronizeToPlaybackGroup = 1 << 6 }; -/* Enum BMDSupportedVideoModeFlags - Flags to describe supported video mode */ +/* Enum BMDSupportedVideoModeFlags - Flags to describe supported video modes */ typedef uint32_t BMDSupportedVideoModeFlags; enum _BMDSupportedVideoModeFlags { @@ -139,7 +153,6 @@ bmdFrameFlagDefault = 0, bmdFrameFlagFlipVertical = 1 << 0, bmdFrameContainsHDRMetadata = 1 << 1, - bmdFrameContainsCintelMetadata = 1 << 2, /* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */ @@ -172,7 +185,10 @@ enum _BMDDetectedVideoInputFormatFlags { bmdDetectedVideoInputYCbCr422 = 1 << 0, bmdDetectedVideoInputRGB444 = 1 << 1, - bmdDetectedVideoInputDualStream3D = 1 << 2 + bmdDetectedVideoInputDualStream3D = 1 << 2, + bmdDetectedVideoInput12BitDepth = 1 << 3, + bmdDetectedVideoInput10BitDepth = 1 << 4, + bmdDetectedVideoInput8BitDepth = 1 << 5 }; /* Enum BMDDeckLinkCapturePassthroughMode - Enumerates whether the video output is electrically connected to the video input or if the clean switching mode is enabled */ @@ -188,16 +204,17 @@ typedef uint32_t BMDOutputFrameCompletionResult; enum _BMDOutputFrameCompletionResult { - bmdOutputFrameCompleted, - bmdOutputFrameDisplayedLate, - bmdOutputFrameDropped, - bmdOutputFrameFlushed + bmdOutputFrameCompleted, + bmdOutputFrameDisplayedLate, + bmdOutputFrameDropped, + bmdOutputFrameFlushed }; /* Enum BMDReferenceStatus - GenLock input status */ typedef uint32_t BMDReferenceStatus; enum _BMDReferenceStatus { + bmdReferenceUnlocked = 0, bmdReferenceNotSupportedByHardware = 1 << 0, bmdReferenceLocked = 1 << 1 }; @@ -228,9 +245,9 @@ typedef uint32_t BMDAudioOutputStreamType; enum _BMDAudioOutputStreamType { - bmdAudioOutputStreamContinuous, - bmdAudioOutputStreamContinuousDontResample, - bmdAudioOutputStreamTimestamped + bmdAudioOutputStreamContinuous, + bmdAudioOutputStreamContinuousDontResample, + bmdAudioOutputStreamTimestamped }; /* Enum BMDAncillaryPacketFormat - Ancillary packet format */ @@ -375,15 +392,18 @@ typedef uint32_t BMDDynamicRange; enum _BMDDynamicRange { - bmdDynamicRangeSDR = 0, - bmdDynamicRangeHDRStaticPQ = 1 << 29, // SMPTE ST 2084 - bmdDynamicRangeHDRStaticHLG = 1 << 30 // ITU-R BT.2100-0 + bmdDynamicRangeSDR = 0, // Standard Dynamic Range in accordance with SMPTE ST 2036-1 + bmdDynamicRangeHDRStaticPQ = 1 << 29, // High Dynamic Range PQ in accordance with SMPTE ST 2084 + bmdDynamicRangeHDRStaticHLG = 1 << 30 // High Dynamic Range HLG in accordance with ITU-R BT.2100-0 }; /* Enum BMDDeckLinkHDMIInputEDIDID - DeckLink HDMI Input EDID ID */ typedef uint32_t BMDDeckLinkHDMIInputEDIDID; enum _BMDDeckLinkHDMIInputEDIDID { + + /* Integers */ + bmdDeckLinkHDMIInputEDIDDynamicRange = /* 'HIDy' */ 0x48494479 // Parameter is of type BMDDynamicRange. Default is (bmdDynamicRangeSDR|bmdDynamicRangeHDRStaticPQ) }; @@ -391,37 +411,17 @@ typedef uint32_t BMDDeckLinkFrameMetadataID; enum _BMDDeckLinkFrameMetadataID { + + /* Colorspace Metadata - Integers */ + bmdDeckLinkFrameMetadataColorspace = /* 'cspc' */ 0x63737063, // Colorspace of video frame (see BMDColorspace) + + /* HDR Metadata - Integers */ + bmdDeckLinkFrameMetadataHDRElectroOpticalTransferFunc = /* 'eotf' */ 0x656F7466, // EOTF in range 0-7 as per CEA 861.3 - bmdDeckLinkFrameMetadataCintelFilmType = /* 'cfty' */ 0x63667479, // Current film type - bmdDeckLinkFrameMetadataCintelFilmGauge = /* 'cfga' */ 0x63666761, // Current film gauge - bmdDeckLinkFrameMetadataCintelKeykodeLow = /* 'ckkl' */ 0x636B6B6C, // Raw keykode value - low 64 bits - bmdDeckLinkFrameMetadataCintelKeykodeHigh = /* 'ckkh' */ 0x636B6B68, // Raw keykode value - high 64 bits - bmdDeckLinkFrameMetadataCintelTile1Size = /* 'ct1s' */ 0x63743173, // Size in bytes of compressed raw tile 1 - bmdDeckLinkFrameMetadataCintelTile2Size = /* 'ct2s' */ 0x63743273, // Size in bytes of compressed raw tile 2 - bmdDeckLinkFrameMetadataCintelTile3Size = /* 'ct3s' */ 0x63743373, // Size in bytes of compressed raw tile 3 - bmdDeckLinkFrameMetadataCintelTile4Size = /* 'ct4s' */ 0x63743473, // Size in bytes of compressed raw tile 4 - bmdDeckLinkFrameMetadataCintelImageWidth = /* 'IWPx' */ 0x49575078, // Width in pixels of image - bmdDeckLinkFrameMetadataCintelImageHeight = /* 'IHPx' */ 0x49485078, // Height in pixels of image - bmdDeckLinkFrameMetadataCintelLinearMaskingRedInRed = /* 'mrir' */ 0x6D726972, // Red in red linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInRed = /* 'mgir' */ 0x6D676972, // Green in red linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInRed = /* 'mbir' */ 0x6D626972, // Blue in red linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingRedInGreen = /* 'mrig' */ 0x6D726967, // Red in green linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInGreen = /* 'mgig' */ 0x6D676967, // Green in green linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInGreen = /* 'mbig' */ 0x6D626967, // Blue in green linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingRedInBlue = /* 'mrib' */ 0x6D726962, // Red in blue linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInBlue = /* 'mgib' */ 0x6D676962, // Green in blue linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInBlue = /* 'mbib' */ 0x6D626962, // Blue in blue linear masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingRedInRed = /* 'mlrr' */ 0x6D6C7272, // Red in red log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingGreenInRed = /* 'mlgr' */ 0x6D6C6772, // Green in red log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingBlueInRed = /* 'mlbr' */ 0x6D6C6272, // Blue in red log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingRedInGreen = /* 'mlrg' */ 0x6D6C7267, // Red in green log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingGreenInGreen = /* 'mlgg' */ 0x6D6C6767, // Green in green log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingBlueInGreen = /* 'mlbg' */ 0x6D6C6267, // Blue in green log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingRedInBlue = /* 'mlrb' */ 0x6D6C7262, // Red in blue log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingGreenInBlue = /* 'mlgb' */ 0x6D6C6762, // Green in blue log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingBlueInBlue = /* 'mlbb' */ 0x6D6C6262, // Blue in blue log masking parameter - bmdDeckLinkFrameMetadataCintelFilmFrameRate = /* 'cffr' */ 0x63666672, // Film frame rate + + /* HDR Metadata - Floats */ + bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedX = /* 'hdrx' */ 0x68647278, // Red display primaries in range 0.0 - 1.0 bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedY = /* 'hdry' */ 0x68647279, // Red display primaries in range 0.0 - 1.0 bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenX = /* 'hdgx' */ 0x68646778, // Green display primaries in range 0.0 - 1.0 @@ -433,18 +433,7 @@ bmdDeckLinkFrameMetadataHDRMaxDisplayMasteringLuminance = /* 'hdml' */ 0x68646D6C, // Max display mastering luminance in range 1 cd/m2 - 65535 cd/m2 bmdDeckLinkFrameMetadataHDRMinDisplayMasteringLuminance = /* 'hmil' */ 0x686D696C, // Min display mastering luminance in range 0.0001 cd/m2 - 6.5535 cd/m2 bmdDeckLinkFrameMetadataHDRMaximumContentLightLevel = /* 'mcll' */ 0x6D636C6C, // Maximum Content Light Level in range 1 cd/m2 - 65535 cd/m2 - bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel = /* 'fall' */ 0x66616C6C, // Maximum Frame Average Light Level in range 1 cd/m2 - 65535 cd/m2 - bmdDeckLinkFrameMetadataCintelOffsetToApplyHorizontal = /* 'otah' */ 0x6F746168, // Horizontal offset (pixels) to be applied to image - bmdDeckLinkFrameMetadataCintelOffsetToApplyVertical = /* 'otav' */ 0x6F746176, // Vertical offset (pixels) to be applied to image - bmdDeckLinkFrameMetadataCintelGainRed = /* 'LfRd' */ 0x4C665264, // Red gain parameter to apply after log - bmdDeckLinkFrameMetadataCintelGainGreen = /* 'LfGr' */ 0x4C664772, // Green gain parameter to apply after log - bmdDeckLinkFrameMetadataCintelGainBlue = /* 'LfBl' */ 0x4C66426C, // Blue gain parameter to apply after log - bmdDeckLinkFrameMetadataCintelLiftRed = /* 'GnRd' */ 0x476E5264, // Red lift parameter to apply after log and gain - bmdDeckLinkFrameMetadataCintelLiftGreen = /* 'GnGr' */ 0x476E4772, // Green lift parameter to apply after log and gain - bmdDeckLinkFrameMetadataCintelLiftBlue = /* 'GnBl' */ 0x476E426C, // Blue lift parameter to apply after log and gain - bmdDeckLinkFrameMetadataCintelHDRGainRed = /* 'HGRd' */ 0x48475264, // Red gain parameter to apply to linear data for HDR Combination - bmdDeckLinkFrameMetadataCintelHDRGainGreen = /* 'HGGr' */ 0x48474772, // Green gain parameter to apply to linear data for HDR Combination - bmdDeckLinkFrameMetadataCintelHDRGainBlue = /* 'HGBl' */ 0x4847426C // Blue gain parameter to apply to linear data for HDR Combination + bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel = /* 'fall' */ 0x66616C6C // Maximum Frame Average Light Level in range 1 cd/m2 - 65535 cd/m2 }; /* Enum BMDProfileID - Identifies a profile */ @@ -467,6 +456,14 @@ bmdHDMITimecodePackingIEEEOUI5CF9F0 = 0x5CF9F003 }; +/* Enum BMDInternalKeyingAncillaryDataSource - Source for VANC and timecode data when performing internal keying */ + +typedef uint32_t BMDInternalKeyingAncillaryDataSource; +enum _BMDInternalKeyingAncillaryDataSource { + bmdInternalKeyingUsesAncillaryDataFromInputSignal = /* 'ikai' */ 0x696B6169, + bmdInternalKeyingUsesAncillaryDataFromKeyFrame = /* 'ikak' */ 0x696B616B +}; + /* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */ typedef uint32_t BMDDeckLinkAttributeID; @@ -486,6 +483,7 @@ BMDDeckLinkSupportsClockTimingAdjustment = /* 'ctad' */ 0x63746164, BMDDeckLinkSupportsFullFrameReferenceInputTimingOffset = /* 'frin' */ 0x6672696E, BMDDeckLinkSupportsSMPTELevelAOutput = /* 'lvla' */ 0x6C766C61, + BMDDeckLinkSupportsAutoSwitchingPPsFOnInput = /* 'apsf' */ 0x61707366, BMDDeckLinkSupportsDualLinkSDI = /* 'sdls' */ 0x73646C73, BMDDeckLinkSupportsQuadLinkSDI = /* 'sqls' */ 0x73716C73, BMDDeckLinkSupportsIdleOutput = /* 'idou' */ 0x69646F75, @@ -521,6 +519,8 @@ BMDDeckLinkAudioOutputXLRChannelCount = /* 'aoxc' */ 0x616F7863, BMDDeckLinkProfileID = /* 'prid' */ 0x70726964, // Returns a BMDProfileID BMDDeckLinkDuplex = /* 'dupx' */ 0x64757078, + BMDDeckLinkMinimumPrerollFrames = /* 'mprf' */ 0x6D707266, + BMDDeckLinkSupportedDynamicRange = /* 'sudr' */ 0x73756472, /* Floats */ @@ -544,6 +544,9 @@ typedef uint32_t BMDDeckLinkAPIInformationID; enum _BMDDeckLinkAPIInformationID { + + /* Integer or String */ + BMDDeckLinkAPIVersion = /* 'vers' */ 0x76657273 }; @@ -555,7 +558,11 @@ /* Integers */ bmdDeckLinkStatusDetectedVideoInputMode = /* 'dvim' */ 0x6476696D, - bmdDeckLinkStatusDetectedVideoInputFlags = /* 'dvif' */ 0x64766966, + bmdDeckLinkStatusDetectedVideoInputFormatFlags = /* 'dvff' */ 0x64766666, + bmdDeckLinkStatusDetectedVideoInputFieldDominance = /* 'dvfd' */ 0x64766664, + bmdDeckLinkStatusDetectedVideoInputColorspace = /* 'dscl' */ 0x6473636C, + bmdDeckLinkStatusDetectedVideoInputDynamicRange = /* 'dsdr' */ 0x64736472, + bmdDeckLinkStatusDetectedSDILinkConfiguration = /* 'dslc' */ 0x64736C63, bmdDeckLinkStatusCurrentVideoInputMode = /* 'cvim' */ 0x6376696D, bmdDeckLinkStatusCurrentVideoInputPixelFormat = /* 'cvip' */ 0x63766970, bmdDeckLinkStatusCurrentVideoInputFlags = /* 'cvif' */ 0x63766966, @@ -574,6 +581,9 @@ bmdDeckLinkStatusVideoInputSignalLocked = /* 'visl' */ 0x7669736C, bmdDeckLinkStatusReferenceSignalLocked = /* 'refl' */ 0x7265666C, + + /* Bytes */ + bmdDeckLinkStatusReceivedEDID = /* 'edid' */ 0x65646964 }; @@ -688,7 +698,7 @@ class BMD_PUBLIC IDeckLinkVideoOutputCallback : public IUnknown { public: - virtual HRESULT ScheduledFrameCompleted (/* in */ IDeckLinkVideoFrame *completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0; + virtual HRESULT ScheduledFrameCompleted (/* in */ IDeckLinkVideoFrame* completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0; virtual HRESULT ScheduledPlaybackHasStopped (void) = 0; protected: @@ -700,7 +710,7 @@ class BMD_PUBLIC IDeckLinkInputCallback : public IUnknown { public: - virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; + virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode* newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; virtual HRESULT VideoInputFrameArrived (/* in */ IDeckLinkVideoInputFrame* videoFrame, /* in */ IDeckLinkAudioInputPacket* audioPacket) = 0; protected: @@ -712,7 +722,7 @@ class BMD_PUBLIC IDeckLinkEncoderInputCallback : public IUnknown { public: - virtual HRESULT VideoInputSignalChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; + virtual HRESULT VideoInputSignalChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode* newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; virtual HRESULT VideoPacketArrived (/* in */ IDeckLinkEncoderVideoPacket* videoPacket) = 0; virtual HRESULT AudioPacketArrived (/* in */ IDeckLinkEncoderAudioPacket* audioPacket) = 0; @@ -725,9 +735,8 @@ class BMD_PUBLIC IDeckLinkMemoryAllocator : public IUnknown { public: - virtual HRESULT AllocateBuffer (/* in */ uint32_t bufferSize, /* out */ void **allocatedBuffer) = 0; - virtual HRESULT ReleaseBuffer (/* in */ void *buffer) = 0; - + virtual HRESULT AllocateBuffer (/* in */ uint32_t bufferSize, /* out */ void** allocatedBuffer) = 0; + virtual HRESULT ReleaseBuffer (/* in */ void* buffer) = 0; virtual HRESULT Commit (void) = 0; virtual HRESULT Decommit (void) = 0; }; @@ -740,12 +749,12 @@ virtual HRESULT RenderAudioSamples (/* in */ bool preroll) = 0; }; -/* Interface IDeckLinkIterator - enumerates installed DeckLink hardware */ +/* Interface IDeckLinkIterator - Enumerates installed DeckLink hardware */ class BMD_PUBLIC IDeckLinkIterator : public IUnknown { public: - virtual HRESULT Next (/* out */ IDeckLink **deckLinkInstance) = 0; + virtual HRESULT Next (/* out */ IDeckLink** deckLinkInstance) = 0; }; /* Interface IDeckLinkAPIInformation - DeckLinkAPI attribute interface */ @@ -753,10 +762,10 @@ class BMD_PUBLIC IDeckLinkAPIInformation : public IUnknown { public: - virtual HRESULT GetFlag (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ bool *value) = 0; - virtual HRESULT GetInt (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ int64_t *value) = 0; - virtual HRESULT GetFloat (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ double *value) = 0; - virtual HRESULT GetString (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ const char **value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ bool* value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ int64_t* value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ double* value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ const char** value) = 0; protected: virtual ~IDeckLinkAPIInformation () {} // call Release method to drop reference count @@ -767,54 +776,47 @@ class BMD_PUBLIC IDeckLinkOutput : public IUnknown { public: - virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of 0 is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, /* in */ BMDSupportedVideoModeFlags flags, /* out */ BMDDisplayMode *actualMode, /* out */ bool *supported) = 0; - virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; - - virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of bmdVideoConnectionUnspecified is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, /* in */ BMDVideoOutputConversionMode conversionMode, /* in */ BMDSupportedVideoModeFlags flags, /* out */ BMDDisplayMode* actualMode, /* out */ bool* supported) = 0; + virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode** resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator** iterator) = 0; + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback* previewCallback) = 0; /* Video Output */ virtual HRESULT EnableVideoOutput (/* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags) = 0; virtual HRESULT DisableVideoOutput (void) = 0; - - virtual HRESULT SetVideoOutputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; - virtual HRESULT CreateVideoFrame (/* in */ int32_t width, /* in */ int32_t height, /* in */ int32_t rowBytes, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame **outFrame) = 0; - virtual HRESULT CreateAncillaryData (/* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; // Use of IDeckLinkVideoFrameAncillaryPackets is preferred - - virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame *theFrame) = 0; - virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0; - virtual HRESULT SetScheduledFrameCompletionCallback (/* in */ IDeckLinkVideoOutputCallback *theCallback) = 0; - virtual HRESULT GetBufferedVideoFrameCount (/* out */ uint32_t *bufferedFrameCount) = 0; + virtual HRESULT SetVideoOutputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator* theAllocator) = 0; + virtual HRESULT CreateVideoFrame (/* in */ int32_t width, /* in */ int32_t height, /* in */ int32_t rowBytes, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame** outFrame) = 0; + virtual HRESULT CreateAncillaryData (/* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary** outBuffer) = 0; // Use of IDeckLinkVideoFrameAncillaryPackets is preferred + virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame* theFrame) = 0; + virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame* theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT SetScheduledFrameCompletionCallback (/* in */ IDeckLinkVideoOutputCallback* theCallback) = 0; + virtual HRESULT GetBufferedVideoFrameCount (/* out */ uint32_t* bufferedFrameCount) = 0; /* Audio Output */ virtual HRESULT EnableAudioOutput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount, /* in */ BMDAudioOutputStreamType streamType) = 0; virtual HRESULT DisableAudioOutput (void) = 0; - - virtual HRESULT WriteAudioSamplesSync (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* out */ uint32_t *sampleFramesWritten) = 0; - + virtual HRESULT WriteAudioSamplesSync (/* in */ void* buffer, /* in */ uint32_t sampleFrameCount, /* out */ uint32_t* sampleFramesWritten) = 0; virtual HRESULT BeginAudioPreroll (void) = 0; virtual HRESULT EndAudioPreroll (void) = 0; - virtual HRESULT ScheduleAudioSamples (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ uint32_t *sampleFramesWritten) = 0; - - virtual HRESULT GetBufferedAudioSampleFrameCount (/* out */ uint32_t *bufferedSampleFrameCount) = 0; + virtual HRESULT ScheduleAudioSamples (/* in */ void* buffer, /* in */ uint32_t sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ uint32_t* sampleFramesWritten) = 0; + virtual HRESULT GetBufferedAudioSampleFrameCount (/* out */ uint32_t* bufferedSampleFrameCount) = 0; virtual HRESULT FlushBufferedAudioSamples (void) = 0; - - virtual HRESULT SetAudioCallback (/* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; + virtual HRESULT SetAudioCallback (/* in */ IDeckLinkAudioOutputCallback* theCallback) = 0; /* Output Control */ virtual HRESULT StartScheduledPlayback (/* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed) = 0; - virtual HRESULT StopScheduledPlayback (/* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale) = 0; - virtual HRESULT IsScheduledPlaybackRunning (/* out */ bool *active) = 0; - virtual HRESULT GetScheduledStreamTime (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed) = 0; - virtual HRESULT GetReferenceStatus (/* out */ BMDReferenceStatus *referenceStatus) = 0; + virtual HRESULT StopScheduledPlayback (/* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue* actualStopTime, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT IsScheduledPlaybackRunning (/* out */ bool* active) = 0; + virtual HRESULT GetScheduledStreamTime (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue* streamTime, /* out */ double* playbackSpeed) = 0; + virtual HRESULT GetReferenceStatus (/* out */ BMDReferenceStatus* referenceStatus) = 0; /* Hardware Timing */ - virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; - virtual HRESULT GetFrameCompletionReferenceTimestamp (/* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *frameCompletionTimestamp) = 0; + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue* hardwareTime, /* out */ BMDTimeValue* timeInFrame, /* out */ BMDTimeValue* ticksPerFrame) = 0; + virtual HRESULT GetFrameCompletionReferenceTimestamp (/* in */ IDeckLinkVideoFrame* theFrame, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue* frameCompletionTimestamp) = 0; protected: virtual ~IDeckLinkOutput () {} // call Release method to drop reference count @@ -825,24 +827,23 @@ class BMD_PUBLIC IDeckLinkInput : public IUnknown { public: - virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of 0 is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, /* in */ BMDSupportedVideoModeFlags flags, /* out */ bool *supported) = 0; - virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; - - virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of bmdVideoConnectionUnspecified is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, /* in */ BMDVideoInputConversionMode conversionMode, /* in */ BMDSupportedVideoModeFlags flags, /* out */ BMDDisplayMode* actualMode, /* out */ bool* supported) = 0; + virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode** resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator** iterator) = 0; + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback* previewCallback) = 0; /* Video Input */ virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; virtual HRESULT DisableVideoInput (void) = 0; - virtual HRESULT GetAvailableVideoFrameCount (/* out */ uint32_t *availableFrameCount) = 0; - virtual HRESULT SetVideoInputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + virtual HRESULT GetAvailableVideoFrameCount (/* out */ uint32_t* availableFrameCount) = 0; + virtual HRESULT SetVideoInputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator* theAllocator) = 0; /* Audio Input */ virtual HRESULT EnableAudioInput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount) = 0; virtual HRESULT DisableAudioInput (void) = 0; - virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0; + virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t* availableSampleFrameCount) = 0; /* Input Control */ @@ -850,11 +851,11 @@ virtual HRESULT StopStreams (void) = 0; virtual HRESULT PauseStreams (void) = 0; virtual HRESULT FlushStreams (void) = 0; - virtual HRESULT SetCallback (/* in */ IDeckLinkInputCallback *theCallback) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkInputCallback* theCallback) = 0; /* Hardware Timing */ - virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue* hardwareTime, /* out */ BMDTimeValue* timeInFrame, /* out */ BMDTimeValue* ticksPerFrame) = 0; protected: virtual ~IDeckLinkInput () {} // call Release method to drop reference count @@ -866,7 +867,7 @@ { public: virtual HRESULT SetInt (/* in */ BMDDeckLinkHDMIInputEDIDID cfgID, /* in */ int64_t value) = 0; - virtual HRESULT GetInt (/* in */ BMDDeckLinkHDMIInputEDIDID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkHDMIInputEDIDID cfgID, /* out */ int64_t* value) = 0; virtual HRESULT WriteToEDID (void) = 0; protected: @@ -878,22 +879,22 @@ class BMD_PUBLIC IDeckLinkEncoderInput : public IUnknown { public: - virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of 0 is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedCodec, /* in */ uint32_t requestedCodecProfile, /* in */ BMDSupportedVideoModeFlags flags, /* out */ bool *supported) = 0; - virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; + virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of bmdVideoConnectionUnspecified is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedCodec, /* in */ uint32_t requestedCodecProfile, /* in */ BMDSupportedVideoModeFlags flags, /* out */ bool* supported) = 0; + virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode** resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator** iterator) = 0; /* Video Input */ virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; virtual HRESULT DisableVideoInput (void) = 0; - virtual HRESULT GetAvailablePacketsCount (/* out */ uint32_t *availablePacketsCount) = 0; - virtual HRESULT SetMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + virtual HRESULT GetAvailablePacketsCount (/* out */ uint32_t* availablePacketsCount) = 0; + virtual HRESULT SetMemoryAllocator (/* in */ IDeckLinkMemoryAllocator* theAllocator) = 0; /* Audio Input */ virtual HRESULT EnableAudioInput (/* in */ BMDAudioFormat audioFormat, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount) = 0; virtual HRESULT DisableAudioInput (void) = 0; - virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0; + virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t* availableSampleFrameCount) = 0; /* Input Control */ @@ -901,11 +902,11 @@ virtual HRESULT StopStreams (void) = 0; virtual HRESULT PauseStreams (void) = 0; virtual HRESULT FlushStreams (void) = 0; - virtual HRESULT SetCallback (/* in */ IDeckLinkEncoderInputCallback *theCallback) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkEncoderInputCallback* theCallback) = 0; /* Hardware Timing */ - virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue* hardwareTime, /* out */ BMDTimeValue* timeInFrame, /* out */ BMDTimeValue* ticksPerFrame) = 0; protected: virtual ~IDeckLinkEncoderInput () {} // call Release method to drop reference count @@ -921,10 +922,9 @@ virtual long GetRowBytes (void) = 0; virtual BMDPixelFormat GetPixelFormat (void) = 0; virtual BMDFrameFlags GetFlags (void) = 0; - virtual HRESULT GetBytes (/* out */ void **buffer) = 0; - - virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0; - virtual HRESULT GetAncillaryData (/* out */ IDeckLinkVideoFrameAncillary **ancillary) = 0; // Use of IDeckLinkVideoFrameAncillaryPackets is preferred + virtual HRESULT GetBytes (/* out */ void** buffer) = 0; + virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode** timecode) = 0; + virtual HRESULT GetAncillaryData (/* out */ IDeckLinkVideoFrameAncillary** ancillary) = 0; // Use of IDeckLinkVideoFrameAncillaryPackets is preferred protected: virtual ~IDeckLinkVideoFrame () {} // call Release method to drop reference count @@ -936,10 +936,9 @@ { public: virtual HRESULT SetFlags (/* in */ BMDFrameFlags newFlags) = 0; - - virtual HRESULT SetTimecode (/* in */ BMDTimecodeFormat format, /* in */ IDeckLinkTimecode *timecode) = 0; + virtual HRESULT SetTimecode (/* in */ BMDTimecodeFormat format, /* in */ IDeckLinkTimecode* timecode) = 0; virtual HRESULT SetTimecodeFromComponents (/* in */ BMDTimecodeFormat format, /* in */ uint8_t hours, /* in */ uint8_t minutes, /* in */ uint8_t seconds, /* in */ uint8_t frames, /* in */ BMDTimecodeFlags flags) = 0; - virtual HRESULT SetAncillaryData (/* in */ IDeckLinkVideoFrameAncillary *ancillary) = 0; + virtual HRESULT SetAncillaryData (/* in */ IDeckLinkVideoFrameAncillary* ancillary) = 0; virtual HRESULT SetTimecodeUserBits (/* in */ BMDTimecodeFormat format, /* in */ BMDTimecodeUserBits userBits) = 0; protected: @@ -952,21 +951,22 @@ { public: virtual BMDVideo3DPackingFormat Get3DPackingFormat (void) = 0; - virtual HRESULT GetFrameForRightEye (/* out */ IDeckLinkVideoFrame* *rightEyeFrame) = 0; + virtual HRESULT GetFrameForRightEye (/* out */ IDeckLinkVideoFrame** rightEyeFrame) = 0; protected: virtual ~IDeckLinkVideoFrame3DExtensions () {} // call Release method to drop reference count }; -/* Interface IDeckLinkVideoFrameMetadataExtensions - Optional interface implemented on IDeckLinkVideoFrame to support frame metadata such as HDMI HDR information */ +/* Interface IDeckLinkVideoFrameMetadataExtensions - Optional interface implemented on IDeckLinkVideoFrame to support frame metadata such as HDR information */ class BMD_PUBLIC IDeckLinkVideoFrameMetadataExtensions : public IUnknown { public: - virtual HRESULT GetInt (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ int64_t *value) = 0; - virtual HRESULT GetFloat (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ double *value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ int64_t* value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ double* value) = 0; virtual HRESULT GetFlag (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ bool* value) = 0; - virtual HRESULT GetString (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ const char **value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ const char** value) = 0; + virtual HRESULT GetBytes (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ void* buffer /* optional */, /* in, out */ uint32_t* bufferSize) = 0; protected: virtual ~IDeckLinkVideoFrameMetadataExtensions () {} // call Release method to drop reference count @@ -977,8 +977,8 @@ class BMD_PUBLIC IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame { public: - virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, /* in */ BMDTimeScale timeScale) = 0; - virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0; + virtual HRESULT GetStreamTime (/* out */ BMDTimeValue* frameTime, /* out */ BMDTimeValue* frameDuration, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue* frameTime, /* out */ BMDTimeValue* frameDuration) = 0; protected: virtual ~IDeckLinkVideoInputFrame () {} // call Release method to drop reference count @@ -989,12 +989,11 @@ class BMD_PUBLIC IDeckLinkAncillaryPacket : public IUnknown { public: - - virtual HRESULT GetBytes (/* in */ BMDAncillaryPacketFormat format /* For output, only one format need be offered */, /* out */ const void **data /* Optional */, /* out */ uint32_t *size /* Optional */) = 0; + virtual HRESULT GetBytes (/* in */ BMDAncillaryPacketFormat format /* For output, only one format need be offered */, /* out */ const void** data /* Optional */, /* out */ uint32_t* size /* Optional */) = 0; virtual uint8_t GetDID (void) = 0; virtual uint8_t GetSDID (void) = 0; - virtual uint32_t GetLineNumber (void) = 0; // On output, zero is auto - virtual uint8_t GetDataStreamIndex (void) = 0; // Usually zero. Can only be 1 if non-SD and the first data stream is completely full + virtual uint32_t GetLineNumber (void) = 0; // On output, zero is auto + virtual uint8_t GetDataStreamIndex (void) = 0; // Usually zero. Can only be 1 if non-SD and the first data stream is completely full protected: virtual ~IDeckLinkAncillaryPacket () {} // call Release method to drop reference count @@ -1005,35 +1004,33 @@ class BMD_PUBLIC IDeckLinkAncillaryPacketIterator : public IUnknown { public: - virtual HRESULT Next (/* out */ IDeckLinkAncillaryPacket **packet) = 0; + virtual HRESULT Next (/* out */ IDeckLinkAncillaryPacket** packet) = 0; protected: virtual ~IDeckLinkAncillaryPacketIterator () {} // call Release method to drop reference count }; -/* Interface IDeckLinkVideoFrameAncillaryPackets - Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */ +/* Interface IDeckLinkVideoFrameAncillaryPackets - Obtained through QueryInterface on an IDeckLinkVideoFrame object. */ class BMD_PUBLIC IDeckLinkVideoFrameAncillaryPackets : public IUnknown { public: - - virtual HRESULT GetPacketIterator (/* out */ IDeckLinkAncillaryPacketIterator **iterator) = 0; - virtual HRESULT GetFirstPacketByID (/* in */ uint8_t DID, /* in */ uint8_t SDID, /* out */ IDeckLinkAncillaryPacket **packet) = 0; - virtual HRESULT AttachPacket (/* in */ IDeckLinkAncillaryPacket *packet) = 0; // Implement IDeckLinkAncillaryPacket to output your own - virtual HRESULT DetachPacket (/* in */ IDeckLinkAncillaryPacket *packet) = 0; + virtual HRESULT GetPacketIterator (/* out */ IDeckLinkAncillaryPacketIterator** iterator) = 0; + virtual HRESULT GetFirstPacketByID (/* in */ uint8_t DID, /* in */ uint8_t SDID, /* out */ IDeckLinkAncillaryPacket** packet) = 0; + virtual HRESULT AttachPacket (/* in */ IDeckLinkAncillaryPacket* packet) = 0; // Implement IDeckLinkAncillaryPacket to output your own + virtual HRESULT DetachPacket (/* in */ IDeckLinkAncillaryPacket* packet) = 0; virtual HRESULT DetachAllPackets (void) = 0; protected: virtual ~IDeckLinkVideoFrameAncillaryPackets () {} // call Release method to drop reference count }; -/* Interface IDeckLinkVideoFrameAncillary - Use of IDeckLinkVideoFrameAncillaryPackets is preferred. Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */ +/* Interface IDeckLinkVideoFrameAncillary - Use of IDeckLinkVideoFrameAncillaryPackets is preferred. Obtained through QueryInterface on an IDeckLinkVideoFrame object. */ class BMD_PUBLIC IDeckLinkVideoFrameAncillary : public IUnknown { public: - - virtual HRESULT GetBufferForVerticalBlankingLine (/* in */ uint32_t lineNumber, /* out */ void **buffer) = 0; // Pixels/rowbytes is same as display mode, except for above HD where it's 1920 pixels for UHD modes and 2048 pixels for DCI modes + virtual HRESULT GetBufferForVerticalBlankingLine (/* in */ uint32_t lineNumber, /* out */ void** buffer) = 0; // Pixels/rowbytes is same as display mode, except for above HD where it's 1920 pixels for UHD modes and 2048 pixels for DCI modes virtual BMDPixelFormat GetPixelFormat (void) = 0; virtual BMDDisplayMode GetDisplayMode (void) = 0; @@ -1046,9 +1043,9 @@ class BMD_PUBLIC IDeckLinkEncoderPacket : public IUnknown { public: - virtual HRESULT GetBytes (/* out */ void **buffer) = 0; + virtual HRESULT GetBytes (/* out */ void** buffer) = 0; virtual long GetSize (void) = 0; - virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT GetStreamTime (/* out */ BMDTimeValue* frameTime, /* in */ BMDTimeScale timeScale) = 0; virtual BMDPacketType GetPacketType (void) = 0; protected: @@ -1061,9 +1058,8 @@ { public: virtual BMDPixelFormat GetPixelFormat (void) = 0; - virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0; - - virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0; + virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue* frameTime, /* out */ BMDTimeValue* frameDuration) = 0; + virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode** timecode) = 0; protected: virtual ~IDeckLinkEncoderVideoPacket () {} // call Release method to drop reference count @@ -1080,13 +1076,13 @@ virtual ~IDeckLinkEncoderAudioPacket () {} // call Release method to drop reference count }; -/* Interface IDeckLinkH265NALPacket - Obtained through QueryInterface() on an IDeckLinkEncoderVideoPacket object */ +/* Interface IDeckLinkH265NALPacket - Obtained through QueryInterface on an IDeckLinkEncoderVideoPacket object */ class BMD_PUBLIC IDeckLinkH265NALPacket : public IDeckLinkEncoderVideoPacket { public: - virtual HRESULT GetUnitType (/* out */ uint8_t *unitType) = 0; - virtual HRESULT GetBytesNoPrefix (/* out */ void **buffer) = 0; + virtual HRESULT GetUnitType (/* out */ uint8_t* unitType) = 0; + virtual HRESULT GetBytesNoPrefix (/* out */ void** buffer) = 0; virtual long GetSizeNoPrefix (void) = 0; protected: @@ -1099,8 +1095,8 @@ { public: virtual long GetSampleFrameCount (void) = 0; - virtual HRESULT GetBytes (/* out */ void **buffer) = 0; - virtual HRESULT GetPacketTime (/* out */ BMDTimeValue *packetTime, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT GetBytes (/* out */ void** buffer) = 0; + virtual HRESULT GetPacketTime (/* out */ BMDTimeValue* packetTime, /* in */ BMDTimeScale timeScale) = 0; protected: virtual ~IDeckLinkAudioInputPacket () {} // call Release method to drop reference count @@ -1111,13 +1107,13 @@ class BMD_PUBLIC IDeckLinkScreenPreviewCallback : public IUnknown { public: - virtual HRESULT DrawFrame (/* in */ IDeckLinkVideoFrame *theFrame) = 0; + virtual HRESULT DrawFrame (/* in */ IDeckLinkVideoFrame* theFrame) = 0; protected: virtual ~IDeckLinkScreenPreviewCallback () {} // call Release method to drop reference count }; -/* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance(). */ +/* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance on platforms with native COM support or from CreateOpenGLScreenPreviewHelper on other platforms. */ class BMD_PUBLIC IDeckLinkGLScreenPreviewHelper : public IUnknown { @@ -1127,7 +1123,7 @@ virtual HRESULT InitializeGL (void) = 0; virtual HRESULT PaintGL (void) = 0; - virtual HRESULT SetFrame (/* in */ IDeckLinkVideoFrame *theFrame) = 0; + virtual HRESULT SetFrame (/* in */ IDeckLinkVideoFrame* theFrame) = 0; virtual HRESULT Set3DPreviewFormat (/* in */ BMD3DPreviewFormat previewFormat) = 0; protected: @@ -1147,8 +1143,8 @@ class BMD_PUBLIC IDeckLinkNotification : public IUnknown { public: - virtual HRESULT Subscribe (/* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback) = 0; - virtual HRESULT Unsubscribe (/* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback) = 0; + virtual HRESULT Subscribe (/* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback* theCallback) = 0; + virtual HRESULT Unsubscribe (/* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback* theCallback) = 0; protected: virtual ~IDeckLinkNotification () {} // call Release method to drop reference count @@ -1159,10 +1155,10 @@ class BMD_PUBLIC IDeckLinkProfileAttributes : public IUnknown { public: - virtual HRESULT GetFlag (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ bool *value) = 0; - virtual HRESULT GetInt (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ int64_t *value) = 0; - virtual HRESULT GetFloat (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ double *value) = 0; - virtual HRESULT GetString (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ const char **value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ bool* value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ int64_t* value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ double* value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ const char** value) = 0; protected: virtual ~IDeckLinkProfileAttributes () {} // call Release method to drop reference count @@ -1173,7 +1169,7 @@ class BMD_PUBLIC IDeckLinkProfileIterator : public IUnknown { public: - virtual HRESULT Next (/* out */ IDeckLinkProfile **profile) = 0; + virtual HRESULT Next (/* out */ IDeckLinkProfile** profile) = 0; protected: virtual ~IDeckLinkProfileIterator () {} // call Release method to drop reference count @@ -1184,10 +1180,10 @@ class BMD_PUBLIC IDeckLinkProfile : public IUnknown { public: - virtual HRESULT GetDevice (/* out */ IDeckLink **device) = 0; // Device affected when this profile becomes active - virtual HRESULT IsActive (/* out */ bool *isActive) = 0; - virtual HRESULT SetActive (void) = 0; // Activating a profile will also change the profile on all devices enumerated by GetPeers(). Activation is not complete until IDeckLinkProfileCallback::ProfileActivated() is called - virtual HRESULT GetPeers (/* out */ IDeckLinkProfileIterator **profileIterator) = 0; // Profiles of other devices activated with this profile + virtual HRESULT GetDevice (/* out */ IDeckLink** device) = 0; // Device affected when this profile becomes active + virtual HRESULT IsActive (/* out */ bool* isActive) = 0; + virtual HRESULT SetActive (void) = 0; // Activating a profile will also change the profile on all devices enumerated by GetPeers. Activation is not complete until IDeckLinkProfileCallback::ProfileActivated is called + virtual HRESULT GetPeers (/* out */ IDeckLinkProfileIterator** profileIterator) = 0; // Profiles of other devices activated with this profile protected: virtual ~IDeckLinkProfile () {} // call Release method to drop reference count @@ -1198,8 +1194,8 @@ class BMD_PUBLIC IDeckLinkProfileCallback : public IUnknown { public: - virtual HRESULT ProfileChanging (/* in */ IDeckLinkProfile *profileToBeActivated, /* in */ bool streamsWillBeForcedToStop) = 0; // Called before this device changes profile. User has an opportunity for teardown if streamsWillBeForcedToStop - virtual HRESULT ProfileActivated (/* in */ IDeckLinkProfile *activatedProfile) = 0; // Called after this device has been activated with a new profile + virtual HRESULT ProfileChanging (/* in */ IDeckLinkProfile* profileToBeActivated, /* in */ bool streamsWillBeForcedToStop) = 0; // Called before this device changes profile. User has an opportunity for teardown if streamsWillBeForcedToStop + virtual HRESULT ProfileActivated (/* in */ IDeckLinkProfile* activatedProfile) = 0; // Called after this device has been activated with a new profile protected: virtual ~IDeckLinkProfileCallback () {} // call Release method to drop reference count @@ -1210,9 +1206,9 @@ class BMD_PUBLIC IDeckLinkProfileManager : public IUnknown { public: - virtual HRESULT GetProfiles (/* out */ IDeckLinkProfileIterator **profileIterator) = 0; // All available profiles for this device - virtual HRESULT GetProfile (/* in */ BMDProfileID profileID, /* out */ IDeckLinkProfile **profile) = 0; - virtual HRESULT SetCallback (/* in */ IDeckLinkProfileCallback *callback) = 0; + virtual HRESULT GetProfiles (/* out */ IDeckLinkProfileIterator** profileIterator) = 0; // All available profiles for this device + virtual HRESULT GetProfile (/* in */ BMDProfileID profileID, /* out */ IDeckLinkProfile** profile) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkProfileCallback* callback) = 0; protected: virtual ~IDeckLinkProfileManager () {} // call Release method to drop reference count @@ -1223,11 +1219,11 @@ class BMD_PUBLIC IDeckLinkStatus : public IUnknown { public: - virtual HRESULT GetFlag (/* in */ BMDDeckLinkStatusID statusID, /* out */ bool *value) = 0; - virtual HRESULT GetInt (/* in */ BMDDeckLinkStatusID statusID, /* out */ int64_t *value) = 0; - virtual HRESULT GetFloat (/* in */ BMDDeckLinkStatusID statusID, /* out */ double *value) = 0; - virtual HRESULT GetString (/* in */ BMDDeckLinkStatusID statusID, /* out */ const char **value) = 0; - virtual HRESULT GetBytes (/* in */ BMDDeckLinkStatusID statusID, /* out */ void *buffer, /* in, out */ uint32_t *bufferSize) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkStatusID statusID, /* out */ bool* value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkStatusID statusID, /* out */ int64_t* value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkStatusID statusID, /* out */ double* value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkStatusID statusID, /* out */ const char** value) = 0; + virtual HRESULT GetBytes (/* in */ BMDDeckLinkStatusID statusID, /* out */ void* buffer, /* in, out */ uint32_t* bufferSize) = 0; protected: virtual ~IDeckLinkStatus () {} // call Release method to drop reference count @@ -1248,7 +1244,7 @@ virtual ~IDeckLinkKeyer () {} // call Release method to drop reference count }; -/* Interface IDeckLinkVideoConversion - Created with CoCreateInstance(). */ +/* Interface IDeckLinkVideoConversion - Created with CoCreateInstance. */ class BMD_PUBLIC IDeckLinkVideoConversion : public IUnknown { @@ -1287,15 +1283,16 @@ extern "C" { - IDeckLinkIterator* BMD_PUBLIC CreateDeckLinkIteratorInstance (void); - IDeckLinkDiscovery* BMD_PUBLIC CreateDeckLinkDiscoveryInstance (void); - IDeckLinkAPIInformation* BMD_PUBLIC CreateDeckLinkAPIInformationInstance (void); - IDeckLinkGLScreenPreviewHelper* BMD_PUBLIC CreateOpenGLScreenPreviewHelper (void); - IDeckLinkVideoConversion* BMD_PUBLIC CreateVideoConversionInstance (void); - IDeckLinkVideoFrameAncillaryPackets* BMD_PUBLIC CreateVideoFrameAncillaryPacketsInstance (void); // For use when creating a custom IDeckLinkVideoFrame without wrapping IDeckLinkOutput::CreateVideoFrame + IDeckLinkIterator* BMD_PUBLIC CreateDeckLinkIteratorInstance(void); + IDeckLinkDiscovery* BMD_PUBLIC CreateDeckLinkDiscoveryInstance(void); + IDeckLinkAPIInformation* BMD_PUBLIC CreateDeckLinkAPIInformationInstance(void); + IDeckLinkGLScreenPreviewHelper* BMD_PUBLIC CreateOpenGLScreenPreviewHelper(void); + IDeckLinkVideoConversion* BMD_PUBLIC CreateVideoConversionInstance(void); + IDeckLinkVideoFrameAncillaryPackets* BMD_PUBLIC CreateVideoFrameAncillaryPacketsInstance(void); // For use when creating a custom IDeckLinkVideoFrame without wrapping IDeckLinkOutput::CreateVideoFrame } -#endif // defined(__cplusplus) + +#endif /* defined(__cplusplus) */ #endif /* defined(BMD_DECKLINKAPI_H) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/linux/DeckLinkAPIConfiguration.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/linux/DeckLinkAPIConfiguration.h
Changed
@@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2019 Blackmagic Design +** Copyright (c) 2021 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -7,14 +7,14 @@ ** execute, and transmit the Software, and to prepare derivative works of the ** Software, and to permit third-parties to whom the Software is furnished to ** do so, all subject to the following: -** +** ** The copyright notices in the Software and this entire statement, including ** the above license grant, this restriction and the following disclaimer, ** must be included in all copies of the Software, in whole or in part, and ** all derivative works of the Software, unless such copies or derivative ** works are solely in the form of machine-executable object code generated by ** a source language processor. -** +** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT @@ -46,8 +46,8 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLinkConfiguration = /* 912F634B-2D4E-40A4-8AAB-8D80B73F1289 */ {0x91,0x2F,0x63,0x4B,0x2D,0x4E,0x40,0xA4,0x8A,0xAB,0x8D,0x80,0xB7,0x3F,0x12,0x89}; -BMD_CONST REFIID IID_IDeckLinkEncoderConfiguration = /* 138050E5-C60A-4552-BF3F-0F358049327E */ {0x13,0x80,0x50,0xE5,0xC6,0x0A,0x45,0x52,0xBF,0x3F,0x0F,0x35,0x80,0x49,0x32,0x7E}; +BMD_CONST REFIID IID_IDeckLinkConfiguration = /* 912F634B-2D4E-40A4-8AAB-8D80B73F1289 */ { 0x91,0x2F,0x63,0x4B,0x2D,0x4E,0x40,0xA4,0x8A,0xAB,0x8D,0x80,0xB7,0x3F,0x12,0x89 }; +BMD_CONST REFIID IID_IDeckLinkEncoderConfiguration = /* 138050E5-C60A-4552-BF3F-0F358049327E */ { 0x13,0x80,0x50,0xE5,0xC6,0x0A,0x45,0x52,0xBF,0x3F,0x0F,0x35,0x80,0x49,0x32,0x7E }; /* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */ @@ -67,8 +67,10 @@ /* Audio Input/Output Flags */ bmdDeckLinkConfigAnalogAudioConsumerLevels = /* 'aacl' */ 0x6161636C, + bmdDeckLinkConfigSwapHDMICh3AndCh4OnInput = /* 'hi34' */ 0x68693334, + bmdDeckLinkConfigSwapHDMICh3AndCh4OnOutput = /* 'ho34' */ 0x686F3334, - /* Video output flags */ + /* Video Output Flags */ bmdDeckLinkConfigFieldFlickerRemoval = /* 'fdfr' */ 0x66646672, bmdDeckLinkConfigHD1080p24ToHD1080i5994Conversion = /* 'to59' */ 0x746F3539, @@ -79,9 +81,6 @@ bmdDeckLinkConfigSMPTELevelAOutput = /* 'smta' */ 0x736D7461, bmdDeckLinkConfigRec2020Output = /* 'rec2' */ 0x72656332, // Ensure output is Rec.2020 colorspace bmdDeckLinkConfigQuadLinkSDIVideoOutputSquareDivisionSplit = /* 'SDQS' */ 0x53445153, - - /* Video Output Flags */ - bmdDeckLinkConfigOutput1080pAsPsF = /* 'pfpr' */ 0x70667072, /* Video Output Integers */ @@ -112,9 +111,6 @@ bmdDeckLinkConfigVideoInputScanning = /* 'visc' */ 0x76697363, // Applicable to H264 Pro Recorder only bmdDeckLinkConfigUseDedicatedLTCInput = /* 'dltc' */ 0x646C7463, // Use timecode from LTC input instead of SDI stream bmdDeckLinkConfigSDIInput3DPayloadOverride = /* '3dds' */ 0x33646473, - - /* Video Input Flags */ - bmdDeckLinkConfigCapture1080pAsPsF = /* 'cfpr' */ 0x63667072, /* Video Input Integers */ @@ -139,6 +135,10 @@ bmdDeckLinkConfigVideoInputSVideoLumaGain = /* 'islg' */ 0x69736C67, bmdDeckLinkConfigVideoInputSVideoChromaGain = /* 'iscg' */ 0x69736367, + /* Keying Integers */ + + bmdDeckLinkConfigInternalKeyingAncillaryDataSource = /* 'ikas' */ 0x696B6173, + /* Audio Input Flags */ bmdDeckLinkConfigMicrophonePhantomPower = /* 'mphp' */ 0x6D706870, @@ -211,6 +211,8 @@ bmdDeckLinkEncoderConfigMPEG4CodecSpecificDesc = /* 'esds' */ 0x65736473 // Sample description extensions only (atom stream, each with size and fourCC header). Useful for AVFoundation, VideoToolbox, MKV and more }; +#if defined(__cplusplus) + // Forward Declarations class IDeckLinkConfiguration; @@ -222,13 +224,13 @@ { public: virtual HRESULT SetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ bool value) = 0; - virtual HRESULT GetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ bool* value) = 0; virtual HRESULT SetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ int64_t value) = 0; - virtual HRESULT GetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ int64_t* value) = 0; virtual HRESULT SetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value) = 0; - virtual HRESULT GetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value) = 0; - virtual HRESULT SetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ const char *value) = 0; - virtual HRESULT GetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ const char **value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double* value) = 0; + virtual HRESULT SetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ const char* value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ const char** value) = 0; virtual HRESULT WriteConfigurationToPreferences (void) = 0; protected: @@ -241,14 +243,14 @@ { public: virtual HRESULT SetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ bool value) = 0; - virtual HRESULT GetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ bool* value) = 0; virtual HRESULT SetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ int64_t value) = 0; - virtual HRESULT GetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ int64_t* value) = 0; virtual HRESULT SetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ double value) = 0; - virtual HRESULT GetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ double *value) = 0; - virtual HRESULT SetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ const char *value) = 0; - virtual HRESULT GetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ const char **value) = 0; - virtual HRESULT GetBytes (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ void *buffer /* optional */, /* in, out */ uint32_t *bufferSize) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ double* value) = 0; + virtual HRESULT SetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ const char* value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ const char** value) = 0; + virtual HRESULT GetBytes (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ void* buffer /* optional */, /* in, out */ uint32_t* bufferSize) = 0; protected: virtual ~IDeckLinkEncoderConfiguration () {} // call Release method to drop reference count @@ -262,4 +264,6 @@ } + +#endif /* defined(__cplusplus) */ #endif /* defined(BMD_DECKLINKAPICONFIGURATION_H) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/linux/DeckLinkAPIDeckControl.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/linux/DeckLinkAPIDeckControl.h
Changed
@@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2019 Blackmagic Design +** Copyright (c) 2021 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -7,14 +7,14 @@ ** execute, and transmit the Software, and to prepare derivative works of the ** Software, and to permit third-parties to whom the Software is furnished to ** do so, all subject to the following: -** +** ** The copyright notices in the Software and this entire statement, including ** the above license grant, this restriction and the following disclaimer, ** must be included in all copies of the Software, in whole or in part, and ** all derivative works of the Software, unless such copies or derivative ** works are solely in the form of machine-executable object code generated by ** a source language processor. -** +** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT @@ -46,8 +46,8 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLinkDeckControlStatusCallback = /* 53436FFB-B434-4906-BADC-AE3060FFE8EF */ {0x53,0x43,0x6F,0xFB,0xB4,0x34,0x49,0x06,0xBA,0xDC,0xAE,0x30,0x60,0xFF,0xE8,0xEF}; -BMD_CONST REFIID IID_IDeckLinkDeckControl = /* 8E1C3ACE-19C7-4E00-8B92-D80431D958BE */ {0x8E,0x1C,0x3A,0xCE,0x19,0xC7,0x4E,0x00,0x8B,0x92,0xD8,0x04,0x31,0xD9,0x58,0xBE}; +BMD_CONST REFIID IID_IDeckLinkDeckControlStatusCallback = /* 53436FFB-B434-4906-BADC-AE3060FFE8EF */ { 0x53,0x43,0x6F,0xFB,0xB4,0x34,0x49,0x06,0xBA,0xDC,0xAE,0x30,0x60,0xFF,0xE8,0xEF }; +BMD_CONST REFIID IID_IDeckLinkDeckControl = /* 8E1C3ACE-19C7-4E00-8B92-D80431D958BE */ { 0x8E,0x1C,0x3A,0xCE,0x19,0xC7,0x4E,0x00,0x8B,0x92,0xD8,0x04,0x31,0xD9,0x58,0xBE }; /* Enum BMDDeckControlMode - DeckControl mode */ @@ -67,13 +67,13 @@ /* Export-To-Tape events */ - bmdDeckControlPrepareForExportEvent = /* 'pfee' */ 0x70666565, // This event is triggered a few frames before reaching the in-point. IDeckLinkInput::StartScheduledPlayback() should be called at this point. - bmdDeckControlExportCompleteEvent = /* 'exce' */ 0x65786365, // This event is triggered a few frames after reaching the out-point. At this point, it is safe to stop playback. + bmdDeckControlPrepareForExportEvent = /* 'pfee' */ 0x70666565, // This event is triggered a few frames before reaching the in-point. IDeckLinkInput::StartScheduledPlayback should be called at this point. + bmdDeckControlExportCompleteEvent = /* 'exce' */ 0x65786365, // This event is triggered a few frames after reaching the out-point. At this point, it is safe to stop playback. Upon reception of this event the deck's control mode is set back to bmdDeckControlVTRControlMode. /* Capture events */ bmdDeckControlPrepareForCaptureEvent = /* 'pfce' */ 0x70666365, // This event is triggered a few frames before reaching the in-point. The serial timecode attached to IDeckLinkVideoInputFrames is now valid. - bmdDeckControlCaptureCompleteEvent = /* 'ccev' */ 0x63636576 // This event is triggered a few frames after reaching the out-point. + bmdDeckControlCaptureCompleteEvent = /* 'ccev' */ 0x63636576 // This event is triggered a few frames after reaching the out-point. Upon reception of this event the deck's control mode is set back to bmdDeckControlVTRControlMode. }; /* Enum BMDDeckControlVTRControlState - VTR Control state */ @@ -146,6 +146,8 @@ bmdDeckControlUnknownError = /* 'uner' */ 0x756E6572 }; +#if defined(__cplusplus) + // Forward Declarations class IDeckLinkDeckControlStatusCallback; @@ -170,39 +172,39 @@ class BMD_PUBLIC IDeckLinkDeckControl : public IUnknown { public: - virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError* error) = 0; virtual HRESULT Close (/* in */ bool standbyOn) = 0; - virtual HRESULT GetCurrentState (/* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags) = 0; + virtual HRESULT GetCurrentState (/* out */ BMDDeckControlMode* mode, /* out */ BMDDeckControlVTRControlState* vtrControlState, /* out */ BMDDeckControlStatusFlags* flags) = 0; virtual HRESULT SetStandby (/* in */ bool standbyOn) = 0; - virtual HRESULT SendCommand (/* in */ uint8_t *inBuffer, /* in */ uint32_t inBufferSize, /* out */ uint8_t *outBuffer, /* out */ uint32_t *outDataSize, /* in */ uint32_t outBufferSize, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT Play (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT Stop (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT TogglePlayStop (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT Eject (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT GoToTimecode (/* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT FastForward (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT Rewind (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT StepForward (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT StepBack (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT Jog (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT Shuttle (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT GetTimecodeString (/* out */ const char **currentTimeCode, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT GetTimecode (/* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT GetTimecodeBCD (/* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT SendCommand (/* in */ uint8_t* inBuffer, /* in */ uint32_t inBufferSize, /* out */ uint8_t* outBuffer, /* out */ uint32_t* outDataSize, /* in */ uint32_t outBufferSize, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT Play (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT Stop (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT TogglePlayStop (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT Eject (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT GoToTimecode (/* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT FastForward (/* in */ bool viewTape, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT Rewind (/* in */ bool viewTape, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT StepForward (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT StepBack (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT Jog (/* in */ double rate, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT Shuttle (/* in */ double rate, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT GetTimecodeString (/* out */ const char** currentTimeCode, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT GetTimecode (/* out */ IDeckLinkTimecode** currentTimecode, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT GetTimecodeBCD (/* out */ BMDTimecodeBCD* currentTimecode, /* out */ BMDDeckControlError* error) = 0; virtual HRESULT SetPreroll (/* in */ uint32_t prerollSeconds) = 0; - virtual HRESULT GetPreroll (/* out */ uint32_t *prerollSeconds) = 0; + virtual HRESULT GetPreroll (/* out */ uint32_t* prerollSeconds) = 0; virtual HRESULT SetExportOffset (/* in */ int32_t exportOffsetFields) = 0; - virtual HRESULT GetExportOffset (/* out */ int32_t *exportOffsetFields) = 0; - virtual HRESULT GetManualExportOffset (/* out */ int32_t *deckManualExportOffsetFields) = 0; + virtual HRESULT GetExportOffset (/* out */ int32_t* exportOffsetFields) = 0; + virtual HRESULT GetManualExportOffset (/* out */ int32_t* deckManualExportOffsetFields) = 0; virtual HRESULT SetCaptureOffset (/* in */ int32_t captureOffsetFields) = 0; - virtual HRESULT GetCaptureOffset (/* out */ int32_t *captureOffsetFields) = 0; - virtual HRESULT StartExport (/* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT StartCapture (/* in */ bool useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT GetDeviceID (/* out */ uint16_t *deviceId, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetCaptureOffset (/* out */ int32_t* captureOffsetFields) = 0; + virtual HRESULT StartExport (/* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT StartCapture (/* in */ bool useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT GetDeviceID (/* out */ uint16_t* deviceId, /* out */ BMDDeckControlError* error) = 0; virtual HRESULT Abort (void) = 0; - virtual HRESULT CrashRecordStart (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT CrashRecordStop (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT SetCallback (/* in */ IDeckLinkDeckControlStatusCallback *callback) = 0; + virtual HRESULT CrashRecordStart (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT CrashRecordStop (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkDeckControlStatusCallback* callback) = 0; protected: virtual ~IDeckLinkDeckControl () {} // call Release method to drop reference count @@ -216,4 +218,6 @@ } + +#endif /* defined(__cplusplus) */ #endif /* defined(BMD_DECKLINKAPIDECKCONTROL_H) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/linux/DeckLinkAPIDiscovery.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/linux/DeckLinkAPIDiscovery.h
Changed
@@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2019 Blackmagic Design +** Copyright (c) 2021 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -7,14 +7,14 @@ ** execute, and transmit the Software, and to prepare derivative works of the ** Software, and to permit third-parties to whom the Software is furnished to ** do so, all subject to the following: -** +** ** The copyright notices in the Software and this entire statement, including ** the above license grant, this restriction and the following disclaimer, ** must be included in all copies of the Software, in whole or in part, and ** all derivative works of the Software, unless such copies or derivative ** works are solely in the form of machine-executable object code generated by ** a source language processor. -** +** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT @@ -46,19 +46,21 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLink = /* C418FBDD-0587-48ED-8FE5-640F0A14AF91 */ {0xC4,0x18,0xFB,0xDD,0x05,0x87,0x48,0xED,0x8F,0xE5,0x64,0x0F,0x0A,0x14,0xAF,0x91}; +BMD_CONST REFIID IID_IDeckLink = /* C418FBDD-0587-48ED-8FE5-640F0A14AF91 */ { 0xC4,0x18,0xFB,0xDD,0x05,0x87,0x48,0xED,0x8F,0xE5,0x64,0x0F,0x0A,0x14,0xAF,0x91 }; + +#if defined(__cplusplus) // Forward Declarations class IDeckLink; -/* Interface IDeckLink - represents a DeckLink device */ +/* Interface IDeckLink - Represents a DeckLink device */ class BMD_PUBLIC IDeckLink : public IUnknown { public: - virtual HRESULT GetModelName (/* out */ const char **modelName) = 0; - virtual HRESULT GetDisplayName (/* out */ const char **displayName) = 0; + virtual HRESULT GetModelName (/* out */ const char** modelName) = 0; + virtual HRESULT GetDisplayName (/* out */ const char** displayName) = 0; protected: virtual ~IDeckLink () {} // call Release method to drop reference count @@ -72,4 +74,6 @@ } + +#endif /* defined(__cplusplus) */ #endif /* defined(BMD_DECKLINKAPIDISCOVERY_H) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/linux/DeckLinkAPIDispatch.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/linux/DeckLinkAPIDispatch.cpp
Changed
@@ -1,27 +1,40 @@ /* -LICENSE-START- ** Copyright (c) 2009 Blackmagic Design -** -** Permission is hereby granted, free of charge, to any person or organization -** obtaining a copy of the software and accompanying documentation covered by -** this license (the "Software") to use, reproduce, display, distribute, -** execute, and transmit the Software, and to prepare derivative works of the -** Software, and to permit third-parties to whom the Software is furnished to -** do so, all subject to the following: -** -** The copyright notices in the Software and this entire statement, including -** the above license grant, this restriction and the following disclaimer, -** must be included in all copies of the Software, in whole or in part, and -** all derivative works of the Software, unless such copies or derivative -** works are solely in the form of machine-executable object code generated by -** a source language processor. -** -** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation (the +** "Software") to use, reproduce, display, distribute, sub-license, execute, +** and transmit the Software, and to prepare derivative works of the Software, +** and to permit third-parties to whom the Software is furnished to do so, in +** accordance with: +** +** (1) if the Software is obtained from Blackmagic Design, the End User License +** Agreement for the Software Development Kit (“EULA”) available at +** https://www.blackmagicdesign.com/EULA/DeckLinkSDK; or +** +** (2) if the Software is obtained from any third party, such licensing terms +** as notified by that third party, +** +** and all subject to the following: +** +** (3) the copyright notices in the Software and this entire statement, +** including the above license grant, this restriction and the following +** disclaimer, must be included in all copies of the Software, in whole or in +** part, and all derivative works of the Software, unless such copies or +** derivative works are solely in the form of machine-executable object code +** generated by a source language processor. +** +** (4) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ** DEALINGS IN THE SOFTWARE. +** +** A copy of the Software is available free of charge at +** https://www.blackmagicdesign.com/desktopvideo_sdk under the EULA. +** ** -LICENSE-END- **/ @@ -56,16 +69,16 @@ static void InitDeckLinkAPI (void) { void *libraryHandle; - + libraryHandle = dlopen(kDeckLinkAPI_Name, RTLD_NOW|RTLD_GLOBAL); if (!libraryHandle) { // fprintf(stderr, "%s\n", dlerror()); return; } - + gLoadedDeckLinkAPI = true; - + gCreateIteratorFunc = (CreateIteratorFunc)dlsym(libraryHandle, "CreateDeckLinkIteratorInstance_0004"); if (!gCreateIteratorFunc) fprintf(stderr, "%s\n", dlerror()); @@ -86,7 +99,7 @@ static void InitDeckLinkPreviewAPI (void) { void *libraryHandle; - + libraryHandle = dlopen(KDeckLinkPreviewAPI_Name, RTLD_NOW|RTLD_GLOBAL); if (!libraryHandle) { @@ -109,7 +122,7 @@ IDeckLinkIterator* CreateDeckLinkIteratorInstance (void) { pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); - + if (gCreateIteratorFunc == NULL) return NULL; return gCreateIteratorFunc(); @@ -118,7 +131,7 @@ IDeckLinkAPIInformation* CreateDeckLinkAPIInformationInstance (void) { pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); - + if (gCreateAPIInformationFunc == NULL) return NULL; return gCreateAPIInformationFunc(); @@ -128,7 +141,7 @@ { pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); pthread_once(&gPreviewOnceControl, InitDeckLinkPreviewAPI); - + if (gCreateOpenGLPreviewFunc == NULL) return NULL; return gCreateOpenGLPreviewFunc(); @@ -137,7 +150,7 @@ IDeckLinkVideoConversion* CreateVideoConversionInstance (void) { pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); - + if (gCreateVideoConversionFunc == NULL) return NULL; return gCreateVideoConversionFunc(); @@ -146,7 +159,7 @@ IDeckLinkDiscovery* CreateDeckLinkDiscoveryInstance (void) { pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); - + if (gCreateDeckLinkDiscoveryFunc == NULL) return NULL; return gCreateDeckLinkDiscoveryFunc(); @@ -155,7 +168,7 @@ IDeckLinkVideoFrameAncillaryPackets* CreateVideoFrameAncillaryPacketsInstance (void) { pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); - + if (gCreateVideoFrameAncillaryPacketsFunc == NULL) return NULL; return gCreateVideoFrameAncillaryPacketsFunc();
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/linux/DeckLinkAPIModes.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/linux/DeckLinkAPIModes.h
Changed
@@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2019 Blackmagic Design +** Copyright (c) 2021 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -7,14 +7,14 @@ ** execute, and transmit the Software, and to prepare derivative works of the ** Software, and to permit third-parties to whom the Software is furnished to ** do so, all subject to the following: -** +** ** The copyright notices in the Software and this entire statement, including ** the above license grant, this restriction and the following disclaimer, ** must be included in all copies of the Software, in whole or in part, and ** all derivative works of the Software, unless such copies or derivative ** works are solely in the form of machine-executable object code generated by ** a source language processor. -** +** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT @@ -46,10 +46,10 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLinkDisplayModeIterator = /* 9C88499F-F601-4021-B80B-032E4EB41C35 */ {0x9C,0x88,0x49,0x9F,0xF6,0x01,0x40,0x21,0xB8,0x0B,0x03,0x2E,0x4E,0xB4,0x1C,0x35}; -BMD_CONST REFIID IID_IDeckLinkDisplayMode = /* 3EB2C1AB-0A3D-4523-A3AD-F40D7FB14E78 */ {0x3E,0xB2,0xC1,0xAB,0x0A,0x3D,0x45,0x23,0xA3,0xAD,0xF4,0x0D,0x7F,0xB1,0x4E,0x78}; +BMD_CONST REFIID IID_IDeckLinkDisplayModeIterator = /* 9C88499F-F601-4021-B80B-032E4EB41C35 */ { 0x9C,0x88,0x49,0x9F,0xF6,0x01,0x40,0x21,0xB8,0x0B,0x03,0x2E,0x4E,0xB4,0x1C,0x35 }; +BMD_CONST REFIID IID_IDeckLinkDisplayMode = /* 3EB2C1AB-0A3D-4523-A3AD-F40D7FB14E78 */ { 0x3E,0xB2,0xC1,0xAB,0x0A,0x3D,0x45,0x23,0xA3,0xAD,0xF4,0x0D,0x7F,0xB1,0x4E,0x78 }; -/* Enum BMDDisplayMode - Video display modes */ +/* Enum BMDDisplayMode - BMDDisplayMode enumerates the video modes supported. */ typedef uint32_t BMDDisplayMode; enum _BMDDisplayMode { @@ -194,17 +194,12 @@ bmdMode2560x1600p50 = /* 'wqx5' */ 0x77717835, bmdMode2560x1600p60 = /* 'wqx6' */ 0x77717836, - /* RAW Modes for Cintel (input only) */ - - bmdModeCintelRAW = /* 'rwci' */ 0x72776369, // Frame size up to 4096x3072, variable frame rate - bmdModeCintelCompressedRAW = /* 'rwcc' */ 0x72776363, // Frame size up to 4096x3072, variable frame rate - /* Special Modes */ bmdModeUnknown = /* 'iunk' */ 0x69756E6B }; -/* Enum BMDFieldDominance - Video field dominance */ +/* Enum BMDFieldDominance - BMDFieldDominance enumerates settings applicable to video fields. */ typedef uint32_t BMDFieldDominance; enum _BMDFieldDominance { @@ -233,12 +228,7 @@ /* AVID DNxHR */ - bmdFormatDNxHR = /* 'AVdh' */ 0x41566468, - - /* Cintel formats */ - - bmdFormat12BitRAWGRBG = /* 'r12p' */ 0x72313270, // 12-bit RAW data for bayer pattern GRBG - bmdFormat12BitRAWJPEG = /* 'r16p' */ 0x72313670 // 12-bit RAW data arranged in tiles and JPEG compressed + bmdFormatDNxHR = /* 'AVdh' */ 0x41566468 }; /* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */ @@ -251,32 +241,34 @@ bmdDisplayModeColorspaceRec2020 = 1 << 3 }; +#if defined(__cplusplus) + // Forward Declarations class IDeckLinkDisplayModeIterator; class IDeckLinkDisplayMode; -/* Interface IDeckLinkDisplayModeIterator - enumerates over supported input/output display modes. */ +/* Interface IDeckLinkDisplayModeIterator - Enumerates over supported input/output display modes. */ class BMD_PUBLIC IDeckLinkDisplayModeIterator : public IUnknown { public: - virtual HRESULT Next (/* out */ IDeckLinkDisplayMode **deckLinkDisplayMode) = 0; + virtual HRESULT Next (/* out */ IDeckLinkDisplayMode** deckLinkDisplayMode) = 0; protected: virtual ~IDeckLinkDisplayModeIterator () {} // call Release method to drop reference count }; -/* Interface IDeckLinkDisplayMode - represents a display mode */ +/* Interface IDeckLinkDisplayMode - Represents a display mode */ class BMD_PUBLIC IDeckLinkDisplayMode : public IUnknown { public: - virtual HRESULT GetName (/* out */ const char **name) = 0; + virtual HRESULT GetName (/* out */ const char** name) = 0; virtual BMDDisplayMode GetDisplayMode (void) = 0; virtual long GetWidth (void) = 0; virtual long GetHeight (void) = 0; - virtual HRESULT GetFrameRate (/* out */ BMDTimeValue *frameDuration, /* out */ BMDTimeScale *timeScale) = 0; + virtual HRESULT GetFrameRate (/* out */ BMDTimeValue* frameDuration, /* out */ BMDTimeScale* timeScale) = 0; virtual BMDFieldDominance GetFieldDominance (void) = 0; virtual BMDDisplayModeFlags GetFlags (void) = 0; @@ -292,4 +284,6 @@ } + +#endif /* defined(__cplusplus) */ #endif /* defined(BMD_DECKLINKAPIMODES_H) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/linux/DeckLinkAPITypes.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/linux/DeckLinkAPITypes.h
Changed
@@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2019 Blackmagic Design +** Copyright (c) 2021 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -7,14 +7,14 @@ ** execute, and transmit the Software, and to prepare derivative works of the ** Software, and to permit third-parties to whom the Software is furnished to ** do so, all subject to the following: -** +** ** The copyright notices in the Software and this entire statement, including ** the above license grant, this restriction and the following disclaimer, ** must be included in all copies of the Software, in whole or in part, and ** all derivative works of the Software, unless such copies or derivative ** works are solely in the form of machine-executable object code generated by ** a source language processor. -** +** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT @@ -50,7 +50,7 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLinkTimecode = /* BC6CFBD3-8317-4325-AC1C-1216391E9340 */ {0xBC,0x6C,0xFB,0xD3,0x83,0x17,0x43,0x25,0xAC,0x1C,0x12,0x16,0x39,0x1E,0x93,0x40}; +BMD_CONST REFIID IID_IDeckLinkTimecode = /* BC6CFBD3-8317-4325-AC1C-1216391E9340 */ { 0xBC,0x6C,0xFB,0xD3,0x83,0x17,0x43,0x25,0xAC,0x1C,0x12,0x16,0x39,0x1E,0x93,0x40 }; /* Enum BMDTimecodeFlags - Timecode flags */ @@ -60,7 +60,7 @@ bmdTimecodeIsDropFrame = 1 << 0, bmdTimecodeFieldMark = 1 << 1, bmdTimecodeColorFrame = 1 << 2, - bmdTimecodeEmbedRecordingTrigger = 1 << 3, // On SDI recording trigger utilises a user-bit + bmdTimecodeEmbedRecordingTrigger = 1 << 3, // On SDI recording trigger utilises a user-bit. bmdTimecodeRecordingTriggered = 1 << 4 }; @@ -98,6 +98,8 @@ bmdDeckControlConnectionRS422Remote2 = 1 << 1 }; +#if defined(__cplusplus) + // Forward Declarations class IDeckLinkTimecode; @@ -108,10 +110,10 @@ { public: virtual BMDTimecodeBCD GetBCD (void) = 0; - virtual HRESULT GetComponents (/* out */ uint8_t *hours, /* out */ uint8_t *minutes, /* out */ uint8_t *seconds, /* out */ uint8_t *frames) = 0; - virtual HRESULT GetString (/* out */ const char **timecode) = 0; + virtual HRESULT GetComponents (/* out */ uint8_t* hours, /* out */ uint8_t* minutes, /* out */ uint8_t* seconds, /* out */ uint8_t* frames) = 0; + virtual HRESULT GetString (/* out */ const char** timecode) = 0; virtual BMDTimecodeFlags GetFlags (void) = 0; - virtual HRESULT GetTimecodeUserBits (/* out */ BMDTimecodeUserBits *userBits) = 0; + virtual HRESULT GetTimecodeUserBits (/* out */ BMDTimecodeUserBits* userBits) = 0; protected: virtual ~IDeckLinkTimecode () {} // call Release method to drop reference count @@ -125,4 +127,6 @@ } + +#endif /* defined(__cplusplus) */ #endif /* defined(BMD_DECKLINKAPITYPES_H) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/linux/DeckLinkAPIVersion.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/linux/DeckLinkAPIVersion.h
Changed
@@ -1,27 +1,40 @@ /* -LICENSE-START- * ** Copyright (c) 2014 Blackmagic Design - * ** - * ** Permission is hereby granted, free of charge, to any person or organization - * ** obtaining a copy of the software and accompanying documentation covered by - * ** this license (the "Software") to use, reproduce, display, distribute, - * ** execute, and transmit the Software, and to prepare derivative works of the - * ** Software, and to permit third-parties to whom the Software is furnished to - * ** do so, all subject to the following: + * ** + * ** Permission is hereby granted, free of charge, to any person or organization + * ** obtaining a copy of the software and accompanying documentation (the + * ** "Software") to use, reproduce, display, distribute, sub-license, execute, + * ** and transmit the Software, and to prepare derivative works of the Software, + * ** and to permit third-parties to whom the Software is furnished to do so, in + * ** accordance with: * ** - * ** The copyright notices in the Software and this entire statement, including - * ** the above license grant, this restriction and the following disclaimer, - * ** must be included in all copies of the Software, in whole or in part, and - * ** all derivative works of the Software, unless such copies or derivative - * ** works are solely in the form of machine-executable object code generated by - * ** a source language processor. + * ** (1) if the Software is obtained from Blackmagic Design, the End User License + * ** Agreement for the Software Development Kit (“EULA”) available at + * ** https://www.blackmagicdesign.com/EULA/DeckLinkSDK; or * ** - * ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT - * ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE - * ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, - * ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * ** (2) if the Software is obtained from any third party, such licensing terms + * ** as notified by that third party, + * ** + * ** and all subject to the following: + * ** + * ** (3) the copyright notices in the Software and this entire statement, + * ** including the above license grant, this restriction and the following + * ** disclaimer, must be included in all copies of the Software, in whole or in + * ** part, and all derivative works of the Software, unless such copies or + * ** derivative works are solely in the form of machine-executable object code + * ** generated by a source language processor. + * ** + * ** (4) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * ** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * ** DEALINGS IN THE SOFTWARE. + * ** + * ** A copy of the Software is available free of charge at + * ** https://www.blackmagicdesign.com/desktopvideo_sdk under the EULA. + * ** * ** -LICENSE-END- * */ @@ -30,8 +43,8 @@ #ifndef __DeckLink_API_Version_h__ #define __DeckLink_API_Version_h__ -#define BLACKMAGIC_DECKLINK_API_VERSION 0x0b020000 -#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "11.2" +#define BLACKMAGIC_DECKLINK_API_VERSION 0x0c020200 +#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "12.2.2" #endif // __DeckLink_API_Version_h__
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/linux/LinuxCOM.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/linux/LinuxCOM.h
Changed
@@ -1,27 +1,40 @@ /* -LICENSE-START- ** Copyright (c) 2009 Blackmagic Design -** -** Permission is hereby granted, free of charge, to any person or organization -** obtaining a copy of the software and accompanying documentation covered by -** this license (the "Software") to use, reproduce, display, distribute, -** execute, and transmit the Software, and to prepare derivative works of the -** Software, and to permit third-parties to whom the Software is furnished to -** do so, all subject to the following: +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation (the +** "Software") to use, reproduce, display, distribute, sub-license, execute, +** and transmit the Software, and to prepare derivative works of the Software, +** and to permit third-parties to whom the Software is furnished to do so, in +** accordance with: ** -** The copyright notices in the Software and this entire statement, including -** the above license grant, this restriction and the following disclaimer, -** must be included in all copies of the Software, in whole or in part, and -** all derivative works of the Software, unless such copies or derivative -** works are solely in the form of machine-executable object code generated by -** a source language processor. +** (1) if the Software is obtained from Blackmagic Design, the End User License +** Agreement for the Software Development Kit (“EULA”) available at +** https://www.blackmagicdesign.com/EULA/DeckLinkSDK; or ** -** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** (2) if the Software is obtained from any third party, such licensing terms +** as notified by that third party, +** +** and all subject to the following: +** +** (3) the copyright notices in the Software and this entire statement, +** including the above license grant, this restriction and the following +** disclaimer, must be included in all copies of the Software, in whole or in +** part, and all derivative works of the Software, unless such copies or +** derivative works are solely in the form of machine-executable object code +** generated by a source language processor. +** +** (4) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ** DEALINGS IN THE SOFTWARE. +** +** A copy of the Software is available free of charge at +** https://www.blackmagicdesign.com/desktopvideo_sdk under the EULA. +** ** -LICENSE-END- */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/meson.build
Changed
@@ -55,7 +55,6 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(decklink, install_dir : plugins_pkgconfig_install_dir) plugins += decklink else message('Not building decklink plugin for "@0@'.format(host_machine.system()))
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/osx/DeckLinkAPI.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/osx/DeckLinkAPI.h
Changed
@@ -1,29 +1,43 @@ /* -LICENSE-START- -** Copyright (c) 2019 Blackmagic Design -** -** Permission is hereby granted, free of charge, to any person or organization -** obtaining a copy of the software and accompanying documentation covered by -** this license (the "Software") to use, reproduce, display, distribute, -** execute, and transmit the Software, and to prepare derivative works of the -** Software, and to permit third-parties to whom the Software is furnished to -** do so, all subject to the following: -** -** The copyright notices in the Software and this entire statement, including -** the above license grant, this restriction and the following disclaimer, -** must be included in all copies of the Software, in whole or in part, and -** all derivative works of the Software, unless such copies or derivative -** works are solely in the form of machine-executable object code generated by -** a source language processor. -** -** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -** DEALINGS IN THE SOFTWARE. -** -LICENSE-END- -*/ + ** Copyright (c) 2021 Blackmagic Design + ** + ** Permission is hereby granted, free of charge, to any person or organization + ** obtaining a copy of the software and accompanying documentation (the + ** "Software") to use, reproduce, display, distribute, sub-license, execute, + ** and transmit the Software, and to prepare derivative works of the Software, + ** and to permit third-parties to whom the Software is furnished to do so, in + ** accordance with: + ** + ** (1) if the Software is obtained from Blackmagic Design, the End User License + ** Agreement for the Software Development Kit ("EULA") available at + ** https://www.blackmagicdesign.com/EULA/DeckLinkSDK; or + ** + ** (2) if the Software is obtained from any third party, such licensing terms + ** as notified by that third party, + ** + ** and all subject to the following: + ** + ** (3) the copyright notices in the Software and this entire statement, + ** including the above license grant, this restriction and the following + ** disclaimer, must be included in all copies of the Software, in whole or in + ** part, and all derivative works of the Software, unless such copies or + ** derivative works are solely in the form of machine-executable object code + ** generated by a source language processor. + ** + ** (4) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + ** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + ** DEALINGS IN THE SOFTWARE. + ** + ** A copy of the Software is available free of charge at + ** https://www.blackmagicdesign.com/desktopvideo_sdk under the EULA. + ** + ** -LICENSE-END- + */ + #ifndef BMD_DECKLINKAPI_H #define BMD_DECKLINKAPI_H @@ -62,46 +76,46 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLinkVideoOutputCallback = /* 20AA5225-1958-47CB-820B-80A8D521A6EE */ {0x20,0xAA,0x52,0x25,0x19,0x58,0x47,0xCB,0x82,0x0B,0x80,0xA8,0xD5,0x21,0xA6,0xEE}; -BMD_CONST REFIID IID_IDeckLinkInputCallback = /* DD04E5EC-7415-42AB-AE4A-E80C4DFC044A */ {0xDD,0x04,0xE5,0xEC,0x74,0x15,0x42,0xAB,0xAE,0x4A,0xE8,0x0C,0x4D,0xFC,0x04,0x4A}; -BMD_CONST REFIID IID_IDeckLinkEncoderInputCallback = /* ACF13E61-F4A0-4974-A6A7-59AFF6268B31 */ {0xAC,0xF1,0x3E,0x61,0xF4,0xA0,0x49,0x74,0xA6,0xA7,0x59,0xAF,0xF6,0x26,0x8B,0x31}; -BMD_CONST REFIID IID_IDeckLinkMemoryAllocator = /* B36EB6E7-9D29-4AA8-92EF-843B87A289E8 */ {0xB3,0x6E,0xB6,0xE7,0x9D,0x29,0x4A,0xA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8}; -BMD_CONST REFIID IID_IDeckLinkAudioOutputCallback = /* 403C681B-7F46-4A12-B993-2BB127084EE6 */ {0x40,0x3C,0x68,0x1B,0x7F,0x46,0x4A,0x12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6}; -BMD_CONST REFIID IID_IDeckLinkIterator = /* 50FB36CD-3063-4B73-BDBB-958087F2D8BA */ {0x50,0xFB,0x36,0xCD,0x30,0x63,0x4B,0x73,0xBD,0xBB,0x95,0x80,0x87,0xF2,0xD8,0xBA}; -BMD_CONST REFIID IID_IDeckLinkAPIInformation = /* 7BEA3C68-730D-4322-AF34-8A7152B532A4 */ {0x7B,0xEA,0x3C,0x68,0x73,0x0D,0x43,0x22,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4}; -BMD_CONST REFIID IID_IDeckLinkOutput = /* 065A0F6C-C508-4D0D-B919-F5EB0EBFC96B */ {0x06,0x5A,0x0F,0x6C,0xC5,0x08,0x4D,0x0D,0xB9,0x19,0xF5,0xEB,0x0E,0xBF,0xC9,0x6B}; -BMD_CONST REFIID IID_IDeckLinkInput = /* 2A88CF76-F494-4216-A7EF-DC74EEB83882 */ {0x2A,0x88,0xCF,0x76,0xF4,0x94,0x42,0x16,0xA7,0xEF,0xDC,0x74,0xEE,0xB8,0x38,0x82}; -BMD_CONST REFIID IID_IDeckLinkHDMIInputEDID = /* ABBBACBC-45BC-4665-9D92-ACE6E5A97902 */ {0xAB,0xBB,0xAC,0xBC,0x45,0xBC,0x46,0x65,0x9D,0x92,0xAC,0xE6,0xE5,0xA9,0x79,0x02}; -BMD_CONST REFIID IID_IDeckLinkEncoderInput = /* F222551D-13DF-4FD8-B587-9D4F19EC12C9 */ {0xF2,0x22,0x55,0x1D,0x13,0xDF,0x4F,0xD8,0xB5,0x87,0x9D,0x4F,0x19,0xEC,0x12,0xC9}; -BMD_CONST REFIID IID_IDeckLinkVideoFrame = /* 3F716FE0-F023-4111-BE5D-EF4414C05B17 */ {0x3F,0x71,0x6F,0xE0,0xF0,0x23,0x41,0x11,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17}; -BMD_CONST REFIID IID_IDeckLinkMutableVideoFrame = /* 69E2639F-40DA-4E19-B6F2-20ACE815C390 */ {0x69,0xE2,0x63,0x9F,0x40,0xDA,0x4E,0x19,0xB6,0xF2,0x20,0xAC,0xE8,0x15,0xC3,0x90}; -BMD_CONST REFIID IID_IDeckLinkVideoFrame3DExtensions = /* DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7 */ {0xDA,0x0F,0x7E,0x4A,0xED,0xC7,0x48,0xA8,0x9C,0xDD,0x2D,0xB5,0x1C,0x72,0x9C,0xD7}; -BMD_CONST REFIID IID_IDeckLinkVideoFrameMetadataExtensions = /* D5973DC9-6432-46D0-8F0B-2496F8A1238F */ {0xD5,0x97,0x3D,0xC9,0x64,0x32,0x46,0xD0,0x8F,0x0B,0x24,0x96,0xF8,0xA1,0x23,0x8F}; -BMD_CONST REFIID IID_IDeckLinkVideoInputFrame = /* 05CFE374-537C-4094-9A57-680525118F44 */ {0x05,0xCF,0xE3,0x74,0x53,0x7C,0x40,0x94,0x9A,0x57,0x68,0x05,0x25,0x11,0x8F,0x44}; -BMD_CONST REFIID IID_IDeckLinkAncillaryPacket = /* CC5BBF7E-029C-4D3B-9158-6000EF5E3670 */ {0xCC,0x5B,0xBF,0x7E,0x02,0x9C,0x4D,0x3B,0x91,0x58,0x60,0x00,0xEF,0x5E,0x36,0x70}; -BMD_CONST REFIID IID_IDeckLinkAncillaryPacketIterator = /* 3FC8994B-88FB-4C17-968F-9AAB69D964A7 */ {0x3F,0xC8,0x99,0x4B,0x88,0xFB,0x4C,0x17,0x96,0x8F,0x9A,0xAB,0x69,0xD9,0x64,0xA7}; -BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillaryPackets = /* 6C186C0F-459E-41D8-AEE2-4812D81AEE68 */ {0x6C,0x18,0x6C,0x0F,0x45,0x9E,0x41,0xD8,0xAE,0xE2,0x48,0x12,0xD8,0x1A,0xEE,0x68}; -BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillary = /* 732E723C-D1A4-4E29-9E8E-4A88797A0004 */ {0x73,0x2E,0x72,0x3C,0xD1,0xA4,0x4E,0x29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04}; -BMD_CONST REFIID IID_IDeckLinkEncoderPacket = /* B693F36C-316E-4AF1-B6C2-F389A4BCA620 */ {0xB6,0x93,0xF3,0x6C,0x31,0x6E,0x4A,0xF1,0xB6,0xC2,0xF3,0x89,0xA4,0xBC,0xA6,0x20}; -BMD_CONST REFIID IID_IDeckLinkEncoderVideoPacket = /* 4E7FD944-E8C7-4EAC-B8C0-7B77F80F5AE0 */ {0x4E,0x7F,0xD9,0x44,0xE8,0xC7,0x4E,0xAC,0xB8,0xC0,0x7B,0x77,0xF8,0x0F,0x5A,0xE0}; -BMD_CONST REFIID IID_IDeckLinkEncoderAudioPacket = /* 49E8EDC8-693B-4E14-8EF6-12C658F5A07A */ {0x49,0xE8,0xED,0xC8,0x69,0x3B,0x4E,0x14,0x8E,0xF6,0x12,0xC6,0x58,0xF5,0xA0,0x7A}; -BMD_CONST REFIID IID_IDeckLinkH265NALPacket = /* 639C8E0B-68D5-4BDE-A6D4-95F3AEAFF2E7 */ {0x63,0x9C,0x8E,0x0B,0x68,0xD5,0x4B,0xDE,0xA6,0xD4,0x95,0xF3,0xAE,0xAF,0xF2,0xE7}; -BMD_CONST REFIID IID_IDeckLinkAudioInputPacket = /* E43D5870-2894-11DE-8C30-0800200C9A66 */ {0xE4,0x3D,0x58,0x70,0x28,0x94,0x11,0xDE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66}; -BMD_CONST REFIID IID_IDeckLinkScreenPreviewCallback = /* B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438 */ {0xB1,0xD3,0xF4,0x9A,0x85,0xFE,0x4C,0x5D,0x95,0xC8,0x0B,0x5D,0x5D,0xCC,0xD4,0x38}; -BMD_CONST REFIID IID_IDeckLinkCocoaScreenPreviewCallback = /* D174152F-8F96-4C07-83A5-DD5F5AF0A2AA */ {0xD1,0x74,0x15,0x2F,0x8F,0x96,0x4C,0x07,0x83,0xA5,0xDD,0x5F,0x5A,0xF0,0xA2,0xAA}; -BMD_CONST REFIID IID_IDeckLinkGLScreenPreviewHelper = /* 504E2209-CAC7-4C1A-9FB4-C5BB6274D22F */ {0x50,0x4E,0x22,0x09,0xCA,0xC7,0x4C,0x1A,0x9F,0xB4,0xC5,0xBB,0x62,0x74,0xD2,0x2F}; -BMD_CONST REFIID IID_IDeckLinkNotificationCallback = /* B002A1EC-070D-4288-8289-BD5D36E5FF0D */ {0xB0,0x02,0xA1,0xEC,0x07,0x0D,0x42,0x88,0x82,0x89,0xBD,0x5D,0x36,0xE5,0xFF,0x0D}; -BMD_CONST REFIID IID_IDeckLinkNotification = /* B85DF4C8-BDF5-47C1-8064-28162EBDD4EB */ {0xB8,0x5D,0xF4,0xC8,0xBD,0xF5,0x47,0xC1,0x80,0x64,0x28,0x16,0x2E,0xBD,0xD4,0xEB}; -BMD_CONST REFIID IID_IDeckLinkProfileAttributes = /* 17D4BF8E-4911-473A-80A0-731CF6FF345B */ {0x17,0xD4,0xBF,0x8E,0x49,0x11,0x47,0x3A,0x80,0xA0,0x73,0x1C,0xF6,0xFF,0x34,0x5B}; -BMD_CONST REFIID IID_IDeckLinkProfileIterator = /* 29E5A8C0-8BE4-46EB-93AC-31DAAB5B7BF2 */ {0x29,0xE5,0xA8,0xC0,0x8B,0xE4,0x46,0xEB,0x93,0xAC,0x31,0xDA,0xAB,0x5B,0x7B,0xF2}; -BMD_CONST REFIID IID_IDeckLinkProfile = /* 16093466-674A-432B-9DA0-1AC2C5A8241C */ {0x16,0x09,0x34,0x66,0x67,0x4A,0x43,0x2B,0x9D,0xA0,0x1A,0xC2,0xC5,0xA8,0x24,0x1C}; -BMD_CONST REFIID IID_IDeckLinkProfileCallback = /* A4F9341E-97AA-4E04-8935-15F809898CEA */ {0xA4,0xF9,0x34,0x1E,0x97,0xAA,0x4E,0x04,0x89,0x35,0x15,0xF8,0x09,0x89,0x8C,0xEA}; -BMD_CONST REFIID IID_IDeckLinkProfileManager = /* 30D41429-3998-4B6D-84F8-78C94A797C6E */ {0x30,0xD4,0x14,0x29,0x39,0x98,0x4B,0x6D,0x84,0xF8,0x78,0xC9,0x4A,0x79,0x7C,0x6E}; -BMD_CONST REFIID IID_IDeckLinkStatus = /* 5F558200-4028-49BC-BEAC-DB3FA4A96E46 */ {0x5F,0x55,0x82,0x00,0x40,0x28,0x49,0xBC,0xBE,0xAC,0xDB,0x3F,0xA4,0xA9,0x6E,0x46}; -BMD_CONST REFIID IID_IDeckLinkKeyer = /* 89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3 */ {0x89,0xAF,0xCA,0xF5,0x65,0xF8,0x42,0x1E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3}; -BMD_CONST REFIID IID_IDeckLinkVideoConversion = /* 3BBCB8A2-DA2C-42D9-B5D8-88083644E99A */ {0x3B,0xBC,0xB8,0xA2,0xDA,0x2C,0x42,0xD9,0xB5,0xD8,0x88,0x08,0x36,0x44,0xE9,0x9A}; -BMD_CONST REFIID IID_IDeckLinkDeviceNotificationCallback = /* 4997053B-0ADF-4CC8-AC70-7A50C4BE728F */ {0x49,0x97,0x05,0x3B,0x0A,0xDF,0x4C,0xC8,0xAC,0x70,0x7A,0x50,0xC4,0xBE,0x72,0x8F}; -BMD_CONST REFIID IID_IDeckLinkDiscovery = /* CDBF631C-BC76-45FA-B44D-C55059BC6101 */ {0xCD,0xBF,0x63,0x1C,0xBC,0x76,0x45,0xFA,0xB4,0x4D,0xC5,0x50,0x59,0xBC,0x61,0x01}; +BMD_CONST REFIID IID_IDeckLinkVideoOutputCallback = /* 20AA5225-1958-47CB-820B-80A8D521A6EE */ { 0x20,0xAA,0x52,0x25,0x19,0x58,0x47,0xCB,0x82,0x0B,0x80,0xA8,0xD5,0x21,0xA6,0xEE }; +BMD_CONST REFIID IID_IDeckLinkInputCallback = /* C6FCE4C9-C4E4-4047-82FB-5D238232A902 */ { 0xC6,0xFC,0xE4,0xC9,0xC4,0xE4,0x40,0x47,0x82,0xFB,0x5D,0x23,0x82,0x32,0xA9,0x02 }; +BMD_CONST REFIID IID_IDeckLinkEncoderInputCallback = /* ACF13E61-F4A0-4974-A6A7-59AFF6268B31 */ { 0xAC,0xF1,0x3E,0x61,0xF4,0xA0,0x49,0x74,0xA6,0xA7,0x59,0xAF,0xF6,0x26,0x8B,0x31 }; +BMD_CONST REFIID IID_IDeckLinkMemoryAllocator = /* B36EB6E7-9D29-4AA8-92EF-843B87A289E8 */ { 0xB3,0x6E,0xB6,0xE7,0x9D,0x29,0x4A,0xA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8 }; +BMD_CONST REFIID IID_IDeckLinkAudioOutputCallback = /* 403C681B-7F46-4A12-B993-2BB127084EE6 */ { 0x40,0x3C,0x68,0x1B,0x7F,0x46,0x4A,0x12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6 }; +BMD_CONST REFIID IID_IDeckLinkIterator = /* 50FB36CD-3063-4B73-BDBB-958087F2D8BA */ { 0x50,0xFB,0x36,0xCD,0x30,0x63,0x4B,0x73,0xBD,0xBB,0x95,0x80,0x87,0xF2,0xD8,0xBA }; +BMD_CONST REFIID IID_IDeckLinkAPIInformation = /* 7BEA3C68-730D-4322-AF34-8A7152B532A4 */ { 0x7B,0xEA,0x3C,0x68,0x73,0x0D,0x43,0x22,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4 }; +BMD_CONST REFIID IID_IDeckLinkOutput = /* BE2D9020-461E-442F-84B7-E949CB953B9D */ { 0xBE,0x2D,0x90,0x20,0x46,0x1E,0x44,0x2F,0x84,0xB7,0xE9,0x49,0xCB,0x95,0x3B,0x9D }; +BMD_CONST REFIID IID_IDeckLinkInput = /* C21CDB6E-F414-46E4-A636-80A566E0ED37 */ { 0xC2,0x1C,0xDB,0x6E,0xF4,0x14,0x46,0xE4,0xA6,0x36,0x80,0xA5,0x66,0xE0,0xED,0x37 }; +BMD_CONST REFIID IID_IDeckLinkHDMIInputEDID = /* ABBBACBC-45BC-4665-9D92-ACE6E5A97902 */ { 0xAB,0xBB,0xAC,0xBC,0x45,0xBC,0x46,0x65,0x9D,0x92,0xAC,0xE6,0xE5,0xA9,0x79,0x02 }; +BMD_CONST REFIID IID_IDeckLinkEncoderInput = /* F222551D-13DF-4FD8-B587-9D4F19EC12C9 */ { 0xF2,0x22,0x55,0x1D,0x13,0xDF,0x4F,0xD8,0xB5,0x87,0x9D,0x4F,0x19,0xEC,0x12,0xC9 }; +BMD_CONST REFIID IID_IDeckLinkVideoFrame = /* 3F716FE0-F023-4111-BE5D-EF4414C05B17 */ { 0x3F,0x71,0x6F,0xE0,0xF0,0x23,0x41,0x11,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17 }; +BMD_CONST REFIID IID_IDeckLinkMutableVideoFrame = /* 69E2639F-40DA-4E19-B6F2-20ACE815C390 */ { 0x69,0xE2,0x63,0x9F,0x40,0xDA,0x4E,0x19,0xB6,0xF2,0x20,0xAC,0xE8,0x15,0xC3,0x90 }; +BMD_CONST REFIID IID_IDeckLinkVideoFrame3DExtensions = /* DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7 */ { 0xDA,0x0F,0x7E,0x4A,0xED,0xC7,0x48,0xA8,0x9C,0xDD,0x2D,0xB5,0x1C,0x72,0x9C,0xD7 }; +BMD_CONST REFIID IID_IDeckLinkVideoFrameMetadataExtensions = /* E232A5B7-4DB4-44C9-9152-F47C12E5F051 */ { 0xE2,0x32,0xA5,0xB7,0x4D,0xB4,0x44,0xC9,0x91,0x52,0xF4,0x7C,0x12,0xE5,0xF0,0x51 }; +BMD_CONST REFIID IID_IDeckLinkVideoInputFrame = /* 05CFE374-537C-4094-9A57-680525118F44 */ { 0x05,0xCF,0xE3,0x74,0x53,0x7C,0x40,0x94,0x9A,0x57,0x68,0x05,0x25,0x11,0x8F,0x44 }; +BMD_CONST REFIID IID_IDeckLinkAncillaryPacket = /* CC5BBF7E-029C-4D3B-9158-6000EF5E3670 */ { 0xCC,0x5B,0xBF,0x7E,0x02,0x9C,0x4D,0x3B,0x91,0x58,0x60,0x00,0xEF,0x5E,0x36,0x70 }; +BMD_CONST REFIID IID_IDeckLinkAncillaryPacketIterator = /* 3FC8994B-88FB-4C17-968F-9AAB69D964A7 */ { 0x3F,0xC8,0x99,0x4B,0x88,0xFB,0x4C,0x17,0x96,0x8F,0x9A,0xAB,0x69,0xD9,0x64,0xA7 }; +BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillaryPackets = /* 6C186C0F-459E-41D8-AEE2-4812D81AEE68 */ { 0x6C,0x18,0x6C,0x0F,0x45,0x9E,0x41,0xD8,0xAE,0xE2,0x48,0x12,0xD8,0x1A,0xEE,0x68 }; +BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillary = /* 732E723C-D1A4-4E29-9E8E-4A88797A0004 */ { 0x73,0x2E,0x72,0x3C,0xD1,0xA4,0x4E,0x29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04 }; +BMD_CONST REFIID IID_IDeckLinkEncoderPacket = /* B693F36C-316E-4AF1-B6C2-F389A4BCA620 */ { 0xB6,0x93,0xF3,0x6C,0x31,0x6E,0x4A,0xF1,0xB6,0xC2,0xF3,0x89,0xA4,0xBC,0xA6,0x20 }; +BMD_CONST REFIID IID_IDeckLinkEncoderVideoPacket = /* 4E7FD944-E8C7-4EAC-B8C0-7B77F80F5AE0 */ { 0x4E,0x7F,0xD9,0x44,0xE8,0xC7,0x4E,0xAC,0xB8,0xC0,0x7B,0x77,0xF8,0x0F,0x5A,0xE0 }; +BMD_CONST REFIID IID_IDeckLinkEncoderAudioPacket = /* 49E8EDC8-693B-4E14-8EF6-12C658F5A07A */ { 0x49,0xE8,0xED,0xC8,0x69,0x3B,0x4E,0x14,0x8E,0xF6,0x12,0xC6,0x58,0xF5,0xA0,0x7A }; +BMD_CONST REFIID IID_IDeckLinkH265NALPacket = /* 639C8E0B-68D5-4BDE-A6D4-95F3AEAFF2E7 */ { 0x63,0x9C,0x8E,0x0B,0x68,0xD5,0x4B,0xDE,0xA6,0xD4,0x95,0xF3,0xAE,0xAF,0xF2,0xE7 }; +BMD_CONST REFIID IID_IDeckLinkAudioInputPacket = /* E43D5870-2894-11DE-8C30-0800200C9A66 */ { 0xE4,0x3D,0x58,0x70,0x28,0x94,0x11,0xDE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66 }; +BMD_CONST REFIID IID_IDeckLinkScreenPreviewCallback = /* B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438 */ { 0xB1,0xD3,0xF4,0x9A,0x85,0xFE,0x4C,0x5D,0x95,0xC8,0x0B,0x5D,0x5D,0xCC,0xD4,0x38 }; +BMD_CONST REFIID IID_IDeckLinkCocoaScreenPreviewCallback = /* D174152F-8F96-4C07-83A5-DD5F5AF0A2AA */ { 0xD1,0x74,0x15,0x2F,0x8F,0x96,0x4C,0x07,0x83,0xA5,0xDD,0x5F,0x5A,0xF0,0xA2,0xAA }; +BMD_CONST REFIID IID_IDeckLinkGLScreenPreviewHelper = /* 504E2209-CAC7-4C1A-9FB4-C5BB6274D22F */ { 0x50,0x4E,0x22,0x09,0xCA,0xC7,0x4C,0x1A,0x9F,0xB4,0xC5,0xBB,0x62,0x74,0xD2,0x2F }; +BMD_CONST REFIID IID_IDeckLinkNotificationCallback = /* B002A1EC-070D-4288-8289-BD5D36E5FF0D */ { 0xB0,0x02,0xA1,0xEC,0x07,0x0D,0x42,0x88,0x82,0x89,0xBD,0x5D,0x36,0xE5,0xFF,0x0D }; +BMD_CONST REFIID IID_IDeckLinkNotification = /* B85DF4C8-BDF5-47C1-8064-28162EBDD4EB */ { 0xB8,0x5D,0xF4,0xC8,0xBD,0xF5,0x47,0xC1,0x80,0x64,0x28,0x16,0x2E,0xBD,0xD4,0xEB }; +BMD_CONST REFIID IID_IDeckLinkProfileAttributes = /* 17D4BF8E-4911-473A-80A0-731CF6FF345B */ { 0x17,0xD4,0xBF,0x8E,0x49,0x11,0x47,0x3A,0x80,0xA0,0x73,0x1C,0xF6,0xFF,0x34,0x5B }; +BMD_CONST REFIID IID_IDeckLinkProfileIterator = /* 29E5A8C0-8BE4-46EB-93AC-31DAAB5B7BF2 */ { 0x29,0xE5,0xA8,0xC0,0x8B,0xE4,0x46,0xEB,0x93,0xAC,0x31,0xDA,0xAB,0x5B,0x7B,0xF2 }; +BMD_CONST REFIID IID_IDeckLinkProfile = /* 16093466-674A-432B-9DA0-1AC2C5A8241C */ { 0x16,0x09,0x34,0x66,0x67,0x4A,0x43,0x2B,0x9D,0xA0,0x1A,0xC2,0xC5,0xA8,0x24,0x1C }; +BMD_CONST REFIID IID_IDeckLinkProfileCallback = /* A4F9341E-97AA-4E04-8935-15F809898CEA */ { 0xA4,0xF9,0x34,0x1E,0x97,0xAA,0x4E,0x04,0x89,0x35,0x15,0xF8,0x09,0x89,0x8C,0xEA }; +BMD_CONST REFIID IID_IDeckLinkProfileManager = /* 30D41429-3998-4B6D-84F8-78C94A797C6E */ { 0x30,0xD4,0x14,0x29,0x39,0x98,0x4B,0x6D,0x84,0xF8,0x78,0xC9,0x4A,0x79,0x7C,0x6E }; +BMD_CONST REFIID IID_IDeckLinkStatus = /* 5F558200-4028-49BC-BEAC-DB3FA4A96E46 */ { 0x5F,0x55,0x82,0x00,0x40,0x28,0x49,0xBC,0xBE,0xAC,0xDB,0x3F,0xA4,0xA9,0x6E,0x46 }; +BMD_CONST REFIID IID_IDeckLinkKeyer = /* 89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3 */ { 0x89,0xAF,0xCA,0xF5,0x65,0xF8,0x42,0x1E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3 }; +BMD_CONST REFIID IID_IDeckLinkVideoConversion = /* 3BBCB8A2-DA2C-42D9-B5D8-88083644E99A */ { 0x3B,0xBC,0xB8,0xA2,0xDA,0x2C,0x42,0xD9,0xB5,0xD8,0x88,0x08,0x36,0x44,0xE9,0x9A }; +BMD_CONST REFIID IID_IDeckLinkDeviceNotificationCallback = /* 4997053B-0ADF-4CC8-AC70-7A50C4BE728F */ { 0x49,0x97,0x05,0x3B,0x0A,0xDF,0x4C,0xC8,0xAC,0x70,0x7A,0x50,0xC4,0xBE,0x72,0x8F }; +BMD_CONST REFIID IID_IDeckLinkDiscovery = /* CDBF631C-BC76-45FA-B44D-C55059BC6101 */ { 0xCD,0xBF,0x63,0x1C,0xBC,0x76,0x45,0xFA,0xB4,0x4D,0xC5,0x50,0x59,0xBC,0x61,0x01 }; /* Enum BMDVideoOutputFlags - Flags to control the output of ancillary data along with video. */ @@ -115,7 +129,7 @@ bmdVideoOutputSynchronizeToPlaybackGroup = 1 << 6 }; -/* Enum BMDSupportedVideoModeFlags - Flags to describe supported video mode */ +/* Enum BMDSupportedVideoModeFlags - Flags to describe supported video modes */ typedef uint32_t BMDSupportedVideoModeFlags; enum _BMDSupportedVideoModeFlags { @@ -132,8 +146,8 @@ typedef uint32_t BMDPacketType; enum _BMDPacketType { - bmdPacketTypeStreamInterruptedMarker = 'sint', // A packet of this type marks the time when a video stream was interrupted, for example by a disconnected cable - bmdPacketTypeStreamData = 'sdat' // Regular stream data + bmdPacketTypeStreamInterruptedMarker = /* 'sint' */ 0x73696E74, // A packet of this type marks the time when a video stream was interrupted, for example by a disconnected cable + bmdPacketTypeStreamData = /* 'sdat' */ 0x73646174 // Regular stream data }; /* Enum BMDFrameFlags - Frame flags */ @@ -143,7 +157,6 @@ bmdFrameFlagDefault = 0, bmdFrameFlagFlipVertical = 1 << 0, bmdFrameContainsHDRMetadata = 1 << 1, - bmdFrameContainsCintelMetadata = 1 << 2, /* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */ @@ -176,32 +189,36 @@ enum _BMDDetectedVideoInputFormatFlags { bmdDetectedVideoInputYCbCr422 = 1 << 0, bmdDetectedVideoInputRGB444 = 1 << 1, - bmdDetectedVideoInputDualStream3D = 1 << 2 + bmdDetectedVideoInputDualStream3D = 1 << 2, + bmdDetectedVideoInput12BitDepth = 1 << 3, + bmdDetectedVideoInput10BitDepth = 1 << 4, + bmdDetectedVideoInput8BitDepth = 1 << 5 }; /* Enum BMDDeckLinkCapturePassthroughMode - Enumerates whether the video output is electrically connected to the video input or if the clean switching mode is enabled */ typedef uint32_t BMDDeckLinkCapturePassthroughMode; enum _BMDDeckLinkCapturePassthroughMode { - bmdDeckLinkCapturePassthroughModeDisabled = 'pdis', - bmdDeckLinkCapturePassthroughModeDirect = 'pdir', - bmdDeckLinkCapturePassthroughModeCleanSwitch = 'pcln' + bmdDeckLinkCapturePassthroughModeDisabled = /* 'pdis' */ 0x70646973, + bmdDeckLinkCapturePassthroughModeDirect = /* 'pdir' */ 0x70646972, + bmdDeckLinkCapturePassthroughModeCleanSwitch = /* 'pcln' */ 0x70636C6E }; /* Enum BMDOutputFrameCompletionResult - Frame Completion Callback */ typedef uint32_t BMDOutputFrameCompletionResult; enum _BMDOutputFrameCompletionResult { - bmdOutputFrameCompleted, - bmdOutputFrameDisplayedLate, - bmdOutputFrameDropped, - bmdOutputFrameFlushed + bmdOutputFrameCompleted, + bmdOutputFrameDisplayedLate, + bmdOutputFrameDropped, + bmdOutputFrameFlushed }; /* Enum BMDReferenceStatus - GenLock input status */ typedef uint32_t BMDReferenceStatus; enum _BMDReferenceStatus { + bmdReferenceUnlocked = 0, bmdReferenceNotSupportedByHardware = 1 << 0, bmdReferenceLocked = 1 << 1 }; @@ -210,7 +227,7 @@ typedef uint32_t BMDAudioFormat; enum _BMDAudioFormat { - bmdAudioFormatPCM = 'lpcm' // Linear signed PCM samples + bmdAudioFormatPCM = /* 'lpcm' */ 0x6C70636D // Linear signed PCM samples }; /* Enum BMDAudioSampleRate - Audio sample rates supported for output/input */ @@ -232,32 +249,32 @@ typedef uint32_t BMDAudioOutputStreamType; enum _BMDAudioOutputStreamType { - bmdAudioOutputStreamContinuous, - bmdAudioOutputStreamContinuousDontResample, - bmdAudioOutputStreamTimestamped + bmdAudioOutputStreamContinuous, + bmdAudioOutputStreamContinuousDontResample, + bmdAudioOutputStreamTimestamped }; /* Enum BMDAncillaryPacketFormat - Ancillary packet format */ typedef uint32_t BMDAncillaryPacketFormat; enum _BMDAncillaryPacketFormat { - bmdAncillaryPacketFormatUInt8 = 'ui08', - bmdAncillaryPacketFormatUInt16 = 'ui16', - bmdAncillaryPacketFormatYCbCr10 = 'v210' + bmdAncillaryPacketFormatUInt8 = /* 'ui08' */ 0x75693038, + bmdAncillaryPacketFormatUInt16 = /* 'ui16' */ 0x75693136, + bmdAncillaryPacketFormatYCbCr10 = /* 'v210' */ 0x76323130 }; /* Enum BMDTimecodeFormat - Timecode formats for frame metadata */ typedef uint32_t BMDTimecodeFormat; enum _BMDTimecodeFormat { - bmdTimecodeRP188VITC1 = 'rpv1', // RP188 timecode where DBB1 equals VITC1 (line 9) - bmdTimecodeRP188VITC2 = 'rp12', // RP188 timecode where DBB1 equals VITC2 (line 9 for progressive or line 571 for interlaced/PsF) - bmdTimecodeRP188LTC = 'rplt', // RP188 timecode where DBB1 equals LTC (line 10) - bmdTimecodeRP188HighFrameRate = 'rphr', // RP188 timecode where DBB1 is an HFRTC (SMPTE ST 12-3), the only timecode allowing the frame value to go above 30 - bmdTimecodeRP188Any = 'rp18', // Convenience for capture, returning the first valid timecode in {HFRTC (if supported), VITC1, LTC, VITC2} - bmdTimecodeVITC = 'vitc', - bmdTimecodeVITCField2 = 'vit2', - bmdTimecodeSerial = 'seri' + bmdTimecodeRP188VITC1 = /* 'rpv1' */ 0x72707631, // RP188 timecode where DBB1 equals VITC1 (line 9) + bmdTimecodeRP188VITC2 = /* 'rp12' */ 0x72703132, // RP188 timecode where DBB1 equals VITC2 (line 9 for progressive or line 571 for interlaced/PsF) + bmdTimecodeRP188LTC = /* 'rplt' */ 0x72706C74, // RP188 timecode where DBB1 equals LTC (line 10) + bmdTimecodeRP188HighFrameRate = /* 'rphr' */ 0x72706872, // RP188 timecode where DBB1 is an HFRTC (SMPTE ST 12-3), the only timecode allowing the frame value to go above 30 + bmdTimecodeRP188Any = /* 'rp18' */ 0x72703138, // Convenience for capture, returning the first valid timecode in {HFRTC (if supported), VITC1, LTC, VITC2} + bmdTimecodeVITC = /* 'vitc' */ 0x76697463, + bmdTimecodeVITCField2 = /* 'vit2' */ 0x76697432, + bmdTimecodeSerial = /* 'seri' */ 0x73657269 }; /* Enum BMDAnalogVideoFlags - Analog video display flags */ @@ -272,194 +289,166 @@ typedef uint32_t BMDAudioOutputAnalogAESSwitch; enum _BMDAudioOutputAnalogAESSwitch { - bmdAudioOutputSwitchAESEBU = 'aes ', - bmdAudioOutputSwitchAnalog = 'anlg' + bmdAudioOutputSwitchAESEBU = /* 'aes ' */ 0x61657320, + bmdAudioOutputSwitchAnalog = /* 'anlg' */ 0x616E6C67 }; /* Enum BMDVideoOutputConversionMode - Video/audio conversion mode */ typedef uint32_t BMDVideoOutputConversionMode; enum _BMDVideoOutputConversionMode { - bmdNoVideoOutputConversion = 'none', - bmdVideoOutputLetterboxDownconversion = 'ltbx', - bmdVideoOutputAnamorphicDownconversion = 'amph', - bmdVideoOutputHD720toHD1080Conversion = '720c', - bmdVideoOutputHardwareLetterboxDownconversion = 'HWlb', - bmdVideoOutputHardwareAnamorphicDownconversion = 'HWam', - bmdVideoOutputHardwareCenterCutDownconversion = 'HWcc', - bmdVideoOutputHardware720p1080pCrossconversion = 'xcap', - bmdVideoOutputHardwareAnamorphic720pUpconversion = 'ua7p', - bmdVideoOutputHardwareAnamorphic1080iUpconversion = 'ua1i', - bmdVideoOutputHardwareAnamorphic149To720pUpconversion = 'u47p', - bmdVideoOutputHardwareAnamorphic149To1080iUpconversion = 'u41i', - bmdVideoOutputHardwarePillarbox720pUpconversion = 'up7p', - bmdVideoOutputHardwarePillarbox1080iUpconversion = 'up1i' + bmdNoVideoOutputConversion = /* 'none' */ 0x6E6F6E65, + bmdVideoOutputLetterboxDownconversion = /* 'ltbx' */ 0x6C746278, + bmdVideoOutputAnamorphicDownconversion = /* 'amph' */ 0x616D7068, + bmdVideoOutputHD720toHD1080Conversion = /* '720c' */ 0x37323063, + bmdVideoOutputHardwareLetterboxDownconversion = /* 'HWlb' */ 0x48576C62, + bmdVideoOutputHardwareAnamorphicDownconversion = /* 'HWam' */ 0x4857616D, + bmdVideoOutputHardwareCenterCutDownconversion = /* 'HWcc' */ 0x48576363, + bmdVideoOutputHardware720p1080pCrossconversion = /* 'xcap' */ 0x78636170, + bmdVideoOutputHardwareAnamorphic720pUpconversion = /* 'ua7p' */ 0x75613770, + bmdVideoOutputHardwareAnamorphic1080iUpconversion = /* 'ua1i' */ 0x75613169, + bmdVideoOutputHardwareAnamorphic149To720pUpconversion = /* 'u47p' */ 0x75343770, + bmdVideoOutputHardwareAnamorphic149To1080iUpconversion = /* 'u41i' */ 0x75343169, + bmdVideoOutputHardwarePillarbox720pUpconversion = /* 'up7p' */ 0x75703770, + bmdVideoOutputHardwarePillarbox1080iUpconversion = /* 'up1i' */ 0x75703169 }; /* Enum BMDVideoInputConversionMode - Video input conversion mode */ typedef uint32_t BMDVideoInputConversionMode; enum _BMDVideoInputConversionMode { - bmdNoVideoInputConversion = 'none', - bmdVideoInputLetterboxDownconversionFromHD1080 = '10lb', - bmdVideoInputAnamorphicDownconversionFromHD1080 = '10am', - bmdVideoInputLetterboxDownconversionFromHD720 = '72lb', - bmdVideoInputAnamorphicDownconversionFromHD720 = '72am', - bmdVideoInputLetterboxUpconversion = 'lbup', - bmdVideoInputAnamorphicUpconversion = 'amup' + bmdNoVideoInputConversion = /* 'none' */ 0x6E6F6E65, + bmdVideoInputLetterboxDownconversionFromHD1080 = /* '10lb' */ 0x31306C62, + bmdVideoInputAnamorphicDownconversionFromHD1080 = /* '10am' */ 0x3130616D, + bmdVideoInputLetterboxDownconversionFromHD720 = /* '72lb' */ 0x37326C62, + bmdVideoInputAnamorphicDownconversionFromHD720 = /* '72am' */ 0x3732616D, + bmdVideoInputLetterboxUpconversion = /* 'lbup' */ 0x6C627570, + bmdVideoInputAnamorphicUpconversion = /* 'amup' */ 0x616D7570 }; /* Enum BMDVideo3DPackingFormat - Video 3D packing format */ typedef uint32_t BMDVideo3DPackingFormat; enum _BMDVideo3DPackingFormat { - bmdVideo3DPackingSidebySideHalf = 'sbsh', - bmdVideo3DPackingLinebyLine = 'lbyl', - bmdVideo3DPackingTopAndBottom = 'tabo', - bmdVideo3DPackingFramePacking = 'frpk', - bmdVideo3DPackingLeftOnly = 'left', - bmdVideo3DPackingRightOnly = 'righ' + bmdVideo3DPackingSidebySideHalf = /* 'sbsh' */ 0x73627368, + bmdVideo3DPackingLinebyLine = /* 'lbyl' */ 0x6C62796C, + bmdVideo3DPackingTopAndBottom = /* 'tabo' */ 0x7461626F, + bmdVideo3DPackingFramePacking = /* 'frpk' */ 0x6672706B, + bmdVideo3DPackingLeftOnly = /* 'left' */ 0x6C656674, + bmdVideo3DPackingRightOnly = /* 'righ' */ 0x72696768 }; /* Enum BMDIdleVideoOutputOperation - Video output operation when not playing video */ typedef uint32_t BMDIdleVideoOutputOperation; enum _BMDIdleVideoOutputOperation { - bmdIdleVideoOutputBlack = 'blac', - bmdIdleVideoOutputLastFrame = 'lafa' + bmdIdleVideoOutputBlack = /* 'blac' */ 0x626C6163, + bmdIdleVideoOutputLastFrame = /* 'lafa' */ 0x6C616661 }; /* Enum BMDVideoEncoderFrameCodingMode - Video frame coding mode */ typedef uint32_t BMDVideoEncoderFrameCodingMode; enum _BMDVideoEncoderFrameCodingMode { - bmdVideoEncoderFrameCodingModeInter = 'inte', - bmdVideoEncoderFrameCodingModeIntra = 'intr' + bmdVideoEncoderFrameCodingModeInter = /* 'inte' */ 0x696E7465, + bmdVideoEncoderFrameCodingModeIntra = /* 'intr' */ 0x696E7472 }; /* Enum BMDDNxHRLevel - DNxHR Levels */ typedef uint32_t BMDDNxHRLevel; enum _BMDDNxHRLevel { - bmdDNxHRLevelSQ = 'dnsq', - bmdDNxHRLevelLB = 'dnlb', - bmdDNxHRLevelHQ = 'dnhq', - bmdDNxHRLevelHQX = 'dhqx', - bmdDNxHRLevel444 = 'd444' + bmdDNxHRLevelSQ = /* 'dnsq' */ 0x646E7371, + bmdDNxHRLevelLB = /* 'dnlb' */ 0x646E6C62, + bmdDNxHRLevelHQ = /* 'dnhq' */ 0x646E6871, + bmdDNxHRLevelHQX = /* 'dhqx' */ 0x64687178, + bmdDNxHRLevel444 = /* 'd444' */ 0x64343434 }; /* Enum BMDLinkConfiguration - Video link configuration */ typedef uint32_t BMDLinkConfiguration; enum _BMDLinkConfiguration { - bmdLinkConfigurationSingleLink = 'lcsl', - bmdLinkConfigurationDualLink = 'lcdl', - bmdLinkConfigurationQuadLink = 'lcql' + bmdLinkConfigurationSingleLink = /* 'lcsl' */ 0x6C63736C, + bmdLinkConfigurationDualLink = /* 'lcdl' */ 0x6C63646C, + bmdLinkConfigurationQuadLink = /* 'lcql' */ 0x6C63716C }; /* Enum BMDDeviceInterface - Device interface type */ typedef uint32_t BMDDeviceInterface; enum _BMDDeviceInterface { - bmdDeviceInterfacePCI = 'pci ', - bmdDeviceInterfaceUSB = 'usb ', - bmdDeviceInterfaceThunderbolt = 'thun' + bmdDeviceInterfacePCI = /* 'pci ' */ 0x70636920, + bmdDeviceInterfaceUSB = /* 'usb ' */ 0x75736220, + bmdDeviceInterfaceThunderbolt = /* 'thun' */ 0x7468756E }; /* Enum BMDColorspace - Colorspace */ typedef uint32_t BMDColorspace; enum _BMDColorspace { - bmdColorspaceRec601 = 'r601', - bmdColorspaceRec709 = 'r709', - bmdColorspaceRec2020 = '2020' + bmdColorspaceRec601 = /* 'r601' */ 0x72363031, + bmdColorspaceRec709 = /* 'r709' */ 0x72373039, + bmdColorspaceRec2020 = /* '2020' */ 0x32303230 }; /* Enum BMDDynamicRange - SDR or HDR */ typedef uint32_t BMDDynamicRange; enum _BMDDynamicRange { - bmdDynamicRangeSDR = 0, - bmdDynamicRangeHDRStaticPQ = 1 << 29, // SMPTE ST 2084 - bmdDynamicRangeHDRStaticHLG = 1 << 30 // ITU-R BT.2100-0 + bmdDynamicRangeSDR = 0, // Standard Dynamic Range in accordance with SMPTE ST 2036-1 + bmdDynamicRangeHDRStaticPQ = 1 << 29, // High Dynamic Range PQ in accordance with SMPTE ST 2084 + bmdDynamicRangeHDRStaticHLG = 1 << 30 // High Dynamic Range HLG in accordance with ITU-R BT.2100-0 }; /* Enum BMDDeckLinkHDMIInputEDIDID - DeckLink HDMI Input EDID ID */ typedef uint32_t BMDDeckLinkHDMIInputEDIDID; enum _BMDDeckLinkHDMIInputEDIDID { - bmdDeckLinkHDMIInputEDIDDynamicRange = 'HIDy' // Parameter is of type BMDDynamicRange. Default is (bmdDynamicRangeSDR|bmdDynamicRangeHDRStaticPQ) + + /* Integers */ + + bmdDeckLinkHDMIInputEDIDDynamicRange = /* 'HIDy' */ 0x48494479 // Parameter is of type BMDDynamicRange. Default is (bmdDynamicRangeSDR|bmdDynamicRangeHDRStaticPQ) }; /* Enum BMDDeckLinkFrameMetadataID - DeckLink Frame Metadata ID */ typedef uint32_t BMDDeckLinkFrameMetadataID; enum _BMDDeckLinkFrameMetadataID { - bmdDeckLinkFrameMetadataColorspace = 'cspc', // Colorspace of video frame (see BMDColorspace) - bmdDeckLinkFrameMetadataHDRElectroOpticalTransferFunc = 'eotf', // EOTF in range 0-7 as per CEA 861.3 - bmdDeckLinkFrameMetadataCintelFilmType = 'cfty', // Current film type - bmdDeckLinkFrameMetadataCintelFilmGauge = 'cfga', // Current film gauge - bmdDeckLinkFrameMetadataCintelKeykodeLow = 'ckkl', // Raw keykode value - low 64 bits - bmdDeckLinkFrameMetadataCintelKeykodeHigh = 'ckkh', // Raw keykode value - high 64 bits - bmdDeckLinkFrameMetadataCintelTile1Size = 'ct1s', // Size in bytes of compressed raw tile 1 - bmdDeckLinkFrameMetadataCintelTile2Size = 'ct2s', // Size in bytes of compressed raw tile 2 - bmdDeckLinkFrameMetadataCintelTile3Size = 'ct3s', // Size in bytes of compressed raw tile 3 - bmdDeckLinkFrameMetadataCintelTile4Size = 'ct4s', // Size in bytes of compressed raw tile 4 - bmdDeckLinkFrameMetadataCintelImageWidth = 'IWPx', // Width in pixels of image - bmdDeckLinkFrameMetadataCintelImageHeight = 'IHPx', // Height in pixels of image - bmdDeckLinkFrameMetadataCintelLinearMaskingRedInRed = 'mrir', // Red in red linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInRed = 'mgir', // Green in red linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInRed = 'mbir', // Blue in red linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingRedInGreen = 'mrig', // Red in green linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInGreen = 'mgig', // Green in green linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInGreen = 'mbig', // Blue in green linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingRedInBlue = 'mrib', // Red in blue linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInBlue = 'mgib', // Green in blue linear masking parameter - bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInBlue = 'mbib', // Blue in blue linear masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingRedInRed = 'mlrr', // Red in red log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingGreenInRed = 'mlgr', // Green in red log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingBlueInRed = 'mlbr', // Blue in red log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingRedInGreen = 'mlrg', // Red in green log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingGreenInGreen = 'mlgg', // Green in green log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingBlueInGreen = 'mlbg', // Blue in green log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingRedInBlue = 'mlrb', // Red in blue log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingGreenInBlue = 'mlgb', // Green in blue log masking parameter - bmdDeckLinkFrameMetadataCintelLogMaskingBlueInBlue = 'mlbb', // Blue in blue log masking parameter - bmdDeckLinkFrameMetadataCintelFilmFrameRate = 'cffr', // Film frame rate - bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedX = 'hdrx', // Red display primaries in range 0.0 - 1.0 - bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedY = 'hdry', // Red display primaries in range 0.0 - 1.0 - bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenX = 'hdgx', // Green display primaries in range 0.0 - 1.0 - bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenY = 'hdgy', // Green display primaries in range 0.0 - 1.0 - bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueX = 'hdbx', // Blue display primaries in range 0.0 - 1.0 - bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueY = 'hdby', // Blue display primaries in range 0.0 - 1.0 - bmdDeckLinkFrameMetadataHDRWhitePointX = 'hdwx', // White point in range 0.0 - 1.0 - bmdDeckLinkFrameMetadataHDRWhitePointY = 'hdwy', // White point in range 0.0 - 1.0 - bmdDeckLinkFrameMetadataHDRMaxDisplayMasteringLuminance = 'hdml', // Max display mastering luminance in range 1 cd/m2 - 65535 cd/m2 - bmdDeckLinkFrameMetadataHDRMinDisplayMasteringLuminance = 'hmil', // Min display mastering luminance in range 0.0001 cd/m2 - 6.5535 cd/m2 - bmdDeckLinkFrameMetadataHDRMaximumContentLightLevel = 'mcll', // Maximum Content Light Level in range 1 cd/m2 - 65535 cd/m2 - bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel = 'fall', // Maximum Frame Average Light Level in range 1 cd/m2 - 65535 cd/m2 - bmdDeckLinkFrameMetadataCintelOffsetToApplyHorizontal = 'otah', // Horizontal offset (pixels) to be applied to image - bmdDeckLinkFrameMetadataCintelOffsetToApplyVertical = 'otav', // Vertical offset (pixels) to be applied to image - bmdDeckLinkFrameMetadataCintelGainRed = 'LfRd', // Red gain parameter to apply after log - bmdDeckLinkFrameMetadataCintelGainGreen = 'LfGr', // Green gain parameter to apply after log - bmdDeckLinkFrameMetadataCintelGainBlue = 'LfBl', // Blue gain parameter to apply after log - bmdDeckLinkFrameMetadataCintelLiftRed = 'GnRd', // Red lift parameter to apply after log and gain - bmdDeckLinkFrameMetadataCintelLiftGreen = 'GnGr', // Green lift parameter to apply after log and gain - bmdDeckLinkFrameMetadataCintelLiftBlue = 'GnBl', // Blue lift parameter to apply after log and gain - bmdDeckLinkFrameMetadataCintelHDRGainRed = 'HGRd', // Red gain parameter to apply to linear data for HDR Combination - bmdDeckLinkFrameMetadataCintelHDRGainGreen = 'HGGr', // Green gain parameter to apply to linear data for HDR Combination - bmdDeckLinkFrameMetadataCintelHDRGainBlue = 'HGBl' // Blue gain parameter to apply to linear data for HDR Combination + + /* Colorspace Metadata - Integers */ + + bmdDeckLinkFrameMetadataColorspace = /* 'cspc' */ 0x63737063, // Colorspace of video frame (see BMDColorspace) + + /* HDR Metadata - Integers */ + + bmdDeckLinkFrameMetadataHDRElectroOpticalTransferFunc = /* 'eotf' */ 0x656F7466, // EOTF in range 0-7 as per CEA 861.3 + + /* HDR Metadata - Floats */ + + bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedX = /* 'hdrx' */ 0x68647278, // Red display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedY = /* 'hdry' */ 0x68647279, // Red display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenX = /* 'hdgx' */ 0x68646778, // Green display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenY = /* 'hdgy' */ 0x68646779, // Green display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueX = /* 'hdbx' */ 0x68646278, // Blue display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueY = /* 'hdby' */ 0x68646279, // Blue display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRWhitePointX = /* 'hdwx' */ 0x68647778, // White point in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRWhitePointY = /* 'hdwy' */ 0x68647779, // White point in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRMaxDisplayMasteringLuminance = /* 'hdml' */ 0x68646D6C, // Max display mastering luminance in range 1 cd/m2 - 65535 cd/m2 + bmdDeckLinkFrameMetadataHDRMinDisplayMasteringLuminance = /* 'hmil' */ 0x686D696C, // Min display mastering luminance in range 0.0001 cd/m2 - 6.5535 cd/m2 + bmdDeckLinkFrameMetadataHDRMaximumContentLightLevel = /* 'mcll' */ 0x6D636C6C, // Maximum Content Light Level in range 1 cd/m2 - 65535 cd/m2 + bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel = /* 'fall' */ 0x66616C6C // Maximum Frame Average Light Level in range 1 cd/m2 - 65535 cd/m2 }; /* Enum BMDProfileID - Identifies a profile */ typedef uint32_t BMDProfileID; enum _BMDProfileID { - bmdProfileOneSubDeviceFullDuplex = '1dfd', - bmdProfileOneSubDeviceHalfDuplex = '1dhd', - bmdProfileTwoSubDevicesFullDuplex = '2dfd', - bmdProfileTwoSubDevicesHalfDuplex = '2dhd', - bmdProfileFourSubDevicesHalfDuplex = '4dhd' + bmdProfileOneSubDeviceFullDuplex = /* '1dfd' */ 0x31646664, + bmdProfileOneSubDeviceHalfDuplex = /* '1dhd' */ 0x31646864, + bmdProfileTwoSubDevicesFullDuplex = /* '2dfd' */ 0x32646664, + bmdProfileTwoSubDevicesHalfDuplex = /* '2dhd' */ 0x32646864, + bmdProfileFourSubDevicesHalfDuplex = /* '4dhd' */ 0x34646864 }; /* Enum BMDHDMITimecodePacking - Packing form of timecode on HDMI */ @@ -471,6 +460,14 @@ bmdHDMITimecodePackingIEEEOUI5CF9F0 = 0x5CF9F003 }; +/* Enum BMDInternalKeyingAncillaryDataSource - Source for VANC and timecode data when performing internal keying */ + +typedef uint32_t BMDInternalKeyingAncillaryDataSource; +enum _BMDInternalKeyingAncillaryDataSource { + bmdInternalKeyingUsesAncillaryDataFromInputSignal = /* 'ikai' */ 0x696B6169, + bmdInternalKeyingUsesAncillaryDataFromKeyFrame = /* 'ikak' */ 0x696B616B +}; + /* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */ typedef uint32_t BMDDeckLinkAttributeID; @@ -478,77 +475,83 @@ /* Flags */ - BMDDeckLinkSupportsInternalKeying = 'keyi', - BMDDeckLinkSupportsExternalKeying = 'keye', - BMDDeckLinkSupportsInputFormatDetection = 'infd', - BMDDeckLinkHasReferenceInput = 'hrin', - BMDDeckLinkHasSerialPort = 'hspt', - BMDDeckLinkHasAnalogVideoOutputGain = 'avog', - BMDDeckLinkCanOnlyAdjustOverallVideoOutputGain = 'ovog', - BMDDeckLinkHasVideoInputAntiAliasingFilter = 'aafl', - BMDDeckLinkHasBypass = 'byps', - BMDDeckLinkSupportsClockTimingAdjustment = 'ctad', - BMDDeckLinkSupportsFullFrameReferenceInputTimingOffset = 'frin', - BMDDeckLinkSupportsSMPTELevelAOutput = 'lvla', - BMDDeckLinkSupportsDualLinkSDI = 'sdls', - BMDDeckLinkSupportsQuadLinkSDI = 'sqls', - BMDDeckLinkSupportsIdleOutput = 'idou', - BMDDeckLinkVANCRequires10BitYUVVideoFrames = 'vioY', // Legacy product requires v210 active picture for IDeckLinkVideoFrameAncillaryPackets or 10-bit VANC - BMDDeckLinkHasLTCTimecodeInput = 'hltc', - BMDDeckLinkSupportsHDRMetadata = 'hdrm', - BMDDeckLinkSupportsColorspaceMetadata = 'cmet', - BMDDeckLinkSupportsHDMITimecode = 'htim', - BMDDeckLinkSupportsHighFrameRateTimecode = 'HFRT', - BMDDeckLinkSupportsSynchronizeToCaptureGroup = 'stcg', - BMDDeckLinkSupportsSynchronizeToPlaybackGroup = 'stpg', + BMDDeckLinkSupportsInternalKeying = /* 'keyi' */ 0x6B657969, + BMDDeckLinkSupportsExternalKeying = /* 'keye' */ 0x6B657965, + BMDDeckLinkSupportsInputFormatDetection = /* 'infd' */ 0x696E6664, + BMDDeckLinkHasReferenceInput = /* 'hrin' */ 0x6872696E, + BMDDeckLinkHasSerialPort = /* 'hspt' */ 0x68737074, + BMDDeckLinkHasAnalogVideoOutputGain = /* 'avog' */ 0x61766F67, + BMDDeckLinkCanOnlyAdjustOverallVideoOutputGain = /* 'ovog' */ 0x6F766F67, + BMDDeckLinkHasVideoInputAntiAliasingFilter = /* 'aafl' */ 0x6161666C, + BMDDeckLinkHasBypass = /* 'byps' */ 0x62797073, + BMDDeckLinkSupportsClockTimingAdjustment = /* 'ctad' */ 0x63746164, + BMDDeckLinkSupportsFullFrameReferenceInputTimingOffset = /* 'frin' */ 0x6672696E, + BMDDeckLinkSupportsSMPTELevelAOutput = /* 'lvla' */ 0x6C766C61, + BMDDeckLinkSupportsAutoSwitchingPPsFOnInput = /* 'apsf' */ 0x61707366, + BMDDeckLinkSupportsDualLinkSDI = /* 'sdls' */ 0x73646C73, + BMDDeckLinkSupportsQuadLinkSDI = /* 'sqls' */ 0x73716C73, + BMDDeckLinkSupportsIdleOutput = /* 'idou' */ 0x69646F75, + BMDDeckLinkVANCRequires10BitYUVVideoFrames = /* 'vioY' */ 0x76696F59, // Legacy product requires v210 active picture for IDeckLinkVideoFrameAncillaryPackets or 10-bit VANC + BMDDeckLinkHasLTCTimecodeInput = /* 'hltc' */ 0x686C7463, + BMDDeckLinkSupportsHDRMetadata = /* 'hdrm' */ 0x6864726D, + BMDDeckLinkSupportsColorspaceMetadata = /* 'cmet' */ 0x636D6574, + BMDDeckLinkSupportsHDMITimecode = /* 'htim' */ 0x6874696D, + BMDDeckLinkSupportsHighFrameRateTimecode = /* 'HFRT' */ 0x48465254, + BMDDeckLinkSupportsSynchronizeToCaptureGroup = /* 'stcg' */ 0x73746367, + BMDDeckLinkSupportsSynchronizeToPlaybackGroup = /* 'stpg' */ 0x73747067, /* Integers */ - BMDDeckLinkMaximumAudioChannels = 'mach', - BMDDeckLinkMaximumAnalogAudioInputChannels = 'iach', - BMDDeckLinkMaximumAnalogAudioOutputChannels = 'aach', - BMDDeckLinkNumberOfSubDevices = 'nsbd', - BMDDeckLinkSubDeviceIndex = 'subi', - BMDDeckLinkPersistentID = 'peid', - BMDDeckLinkDeviceGroupID = 'dgid', - BMDDeckLinkTopologicalID = 'toid', - BMDDeckLinkVideoOutputConnections = 'vocn', // Returns a BMDVideoConnection bit field - BMDDeckLinkVideoInputConnections = 'vicn', // Returns a BMDVideoConnection bit field - BMDDeckLinkAudioOutputConnections = 'aocn', // Returns a BMDAudioConnection bit field - BMDDeckLinkAudioInputConnections = 'aicn', // Returns a BMDAudioConnection bit field - BMDDeckLinkVideoIOSupport = 'vios', // Returns a BMDVideoIOSupport bit field - BMDDeckLinkDeckControlConnections = 'dccn', // Returns a BMDDeckControlConnection bit field - BMDDeckLinkDeviceInterface = 'dbus', // Returns a BMDDeviceInterface - BMDDeckLinkAudioInputRCAChannelCount = 'airc', - BMDDeckLinkAudioInputXLRChannelCount = 'aixc', - BMDDeckLinkAudioOutputRCAChannelCount = 'aorc', - BMDDeckLinkAudioOutputXLRChannelCount = 'aoxc', - BMDDeckLinkProfileID = 'prid', // Returns a BMDProfileID - BMDDeckLinkDuplex = 'dupx', + BMDDeckLinkMaximumAudioChannels = /* 'mach' */ 0x6D616368, + BMDDeckLinkMaximumAnalogAudioInputChannels = /* 'iach' */ 0x69616368, + BMDDeckLinkMaximumAnalogAudioOutputChannels = /* 'aach' */ 0x61616368, + BMDDeckLinkNumberOfSubDevices = /* 'nsbd' */ 0x6E736264, + BMDDeckLinkSubDeviceIndex = /* 'subi' */ 0x73756269, + BMDDeckLinkPersistentID = /* 'peid' */ 0x70656964, + BMDDeckLinkDeviceGroupID = /* 'dgid' */ 0x64676964, + BMDDeckLinkTopologicalID = /* 'toid' */ 0x746F6964, + BMDDeckLinkVideoOutputConnections = /* 'vocn' */ 0x766F636E, // Returns a BMDVideoConnection bit field + BMDDeckLinkVideoInputConnections = /* 'vicn' */ 0x7669636E, // Returns a BMDVideoConnection bit field + BMDDeckLinkAudioOutputConnections = /* 'aocn' */ 0x616F636E, // Returns a BMDAudioConnection bit field + BMDDeckLinkAudioInputConnections = /* 'aicn' */ 0x6169636E, // Returns a BMDAudioConnection bit field + BMDDeckLinkVideoIOSupport = /* 'vios' */ 0x76696F73, // Returns a BMDVideoIOSupport bit field + BMDDeckLinkDeckControlConnections = /* 'dccn' */ 0x6463636E, // Returns a BMDDeckControlConnection bit field + BMDDeckLinkDeviceInterface = /* 'dbus' */ 0x64627573, // Returns a BMDDeviceInterface + BMDDeckLinkAudioInputRCAChannelCount = /* 'airc' */ 0x61697263, + BMDDeckLinkAudioInputXLRChannelCount = /* 'aixc' */ 0x61697863, + BMDDeckLinkAudioOutputRCAChannelCount = /* 'aorc' */ 0x616F7263, + BMDDeckLinkAudioOutputXLRChannelCount = /* 'aoxc' */ 0x616F7863, + BMDDeckLinkProfileID = /* 'prid' */ 0x70726964, // Returns a BMDProfileID + BMDDeckLinkDuplex = /* 'dupx' */ 0x64757078, + BMDDeckLinkMinimumPrerollFrames = /* 'mprf' */ 0x6D707266, + BMDDeckLinkSupportedDynamicRange = /* 'sudr' */ 0x73756472, /* Floats */ - BMDDeckLinkVideoInputGainMinimum = 'vigm', - BMDDeckLinkVideoInputGainMaximum = 'vigx', - BMDDeckLinkVideoOutputGainMinimum = 'vogm', - BMDDeckLinkVideoOutputGainMaximum = 'vogx', - BMDDeckLinkMicrophoneInputGainMinimum = 'migm', - BMDDeckLinkMicrophoneInputGainMaximum = 'migx', + BMDDeckLinkVideoInputGainMinimum = /* 'vigm' */ 0x7669676D, + BMDDeckLinkVideoInputGainMaximum = /* 'vigx' */ 0x76696778, + BMDDeckLinkVideoOutputGainMinimum = /* 'vogm' */ 0x766F676D, + BMDDeckLinkVideoOutputGainMaximum = /* 'vogx' */ 0x766F6778, + BMDDeckLinkMicrophoneInputGainMinimum = /* 'migm' */ 0x6D69676D, + BMDDeckLinkMicrophoneInputGainMaximum = /* 'migx' */ 0x6D696778, /* Strings */ - BMDDeckLinkSerialPortDeviceName = 'slpn', - BMDDeckLinkVendorName = 'vndr', - BMDDeckLinkDisplayName = 'dspn', - BMDDeckLinkModelName = 'mdln', - BMDDeckLinkDeviceHandle = 'devh' + BMDDeckLinkSerialPortDeviceName = /* 'slpn' */ 0x736C706E, + BMDDeckLinkVendorName = /* 'vndr' */ 0x766E6472, + BMDDeckLinkDisplayName = /* 'dspn' */ 0x6473706E, + BMDDeckLinkModelName = /* 'mdln' */ 0x6D646C6E, + BMDDeckLinkDeviceHandle = /* 'devh' */ 0x64657668 }; /* Enum BMDDeckLinkAPIInformationID - DeckLinkAPI information ID */ typedef uint32_t BMDDeckLinkAPIInformationID; enum _BMDDeckLinkAPIInformationID { - BMDDeckLinkAPIVersion = 'vers' + + /* Integer or String */ + + BMDDeckLinkAPIVersion = /* 'vers' */ 0x76657273 }; /* Enum BMDDeckLinkStatusID - DeckLink Status ID */ @@ -558,27 +561,34 @@ /* Integers */ - bmdDeckLinkStatusDetectedVideoInputMode = 'dvim', - bmdDeckLinkStatusDetectedVideoInputFlags = 'dvif', - bmdDeckLinkStatusCurrentVideoInputMode = 'cvim', - bmdDeckLinkStatusCurrentVideoInputPixelFormat = 'cvip', - bmdDeckLinkStatusCurrentVideoInputFlags = 'cvif', - bmdDeckLinkStatusCurrentVideoOutputMode = 'cvom', - bmdDeckLinkStatusCurrentVideoOutputFlags = 'cvof', - bmdDeckLinkStatusPCIExpressLinkWidth = 'pwid', - bmdDeckLinkStatusPCIExpressLinkSpeed = 'plnk', - bmdDeckLinkStatusLastVideoOutputPixelFormat = 'opix', - bmdDeckLinkStatusReferenceSignalMode = 'refm', - bmdDeckLinkStatusReferenceSignalFlags = 'reff', - bmdDeckLinkStatusBusy = 'busy', - bmdDeckLinkStatusInterchangeablePanelType = 'icpt', - bmdDeckLinkStatusDeviceTemperature = 'dtmp', + bmdDeckLinkStatusDetectedVideoInputMode = /* 'dvim' */ 0x6476696D, + bmdDeckLinkStatusDetectedVideoInputFormatFlags = /* 'dvff' */ 0x64766666, + bmdDeckLinkStatusDetectedVideoInputFieldDominance = /* 'dvfd' */ 0x64766664, + bmdDeckLinkStatusDetectedVideoInputColorspace = /* 'dscl' */ 0x6473636C, + bmdDeckLinkStatusDetectedVideoInputDynamicRange = /* 'dsdr' */ 0x64736472, + bmdDeckLinkStatusDetectedSDILinkConfiguration = /* 'dslc' */ 0x64736C63, + bmdDeckLinkStatusCurrentVideoInputMode = /* 'cvim' */ 0x6376696D, + bmdDeckLinkStatusCurrentVideoInputPixelFormat = /* 'cvip' */ 0x63766970, + bmdDeckLinkStatusCurrentVideoInputFlags = /* 'cvif' */ 0x63766966, + bmdDeckLinkStatusCurrentVideoOutputMode = /* 'cvom' */ 0x63766F6D, + bmdDeckLinkStatusCurrentVideoOutputFlags = /* 'cvof' */ 0x63766F66, + bmdDeckLinkStatusPCIExpressLinkWidth = /* 'pwid' */ 0x70776964, + bmdDeckLinkStatusPCIExpressLinkSpeed = /* 'plnk' */ 0x706C6E6B, + bmdDeckLinkStatusLastVideoOutputPixelFormat = /* 'opix' */ 0x6F706978, + bmdDeckLinkStatusReferenceSignalMode = /* 'refm' */ 0x7265666D, + bmdDeckLinkStatusReferenceSignalFlags = /* 'reff' */ 0x72656666, + bmdDeckLinkStatusBusy = /* 'busy' */ 0x62757379, + bmdDeckLinkStatusInterchangeablePanelType = /* 'icpt' */ 0x69637074, + bmdDeckLinkStatusDeviceTemperature = /* 'dtmp' */ 0x64746D70, /* Flags */ - bmdDeckLinkStatusVideoInputSignalLocked = 'visl', - bmdDeckLinkStatusReferenceSignalLocked = 'refl', - bmdDeckLinkStatusReceivedEDID = 'edid' + bmdDeckLinkStatusVideoInputSignalLocked = /* 'visl' */ 0x7669736C, + bmdDeckLinkStatusReferenceSignalLocked = /* 'refl' */ 0x7265666C, + + /* Bytes */ + + bmdDeckLinkStatusReceivedEDID = /* 'edid' */ 0x65646964 }; /* Enum BMDDeckLinkVideoStatusFlags - */ @@ -593,18 +603,18 @@ typedef uint32_t BMDDuplexMode; enum _BMDDuplexMode { - bmdDuplexFull = 'dxfu', - bmdDuplexHalf = 'dxha', - bmdDuplexSimplex = 'dxsp', - bmdDuplexInactive = 'dxin' + bmdDuplexFull = /* 'dxfu' */ 0x64786675, + bmdDuplexHalf = /* 'dxha' */ 0x64786861, + bmdDuplexSimplex = /* 'dxsp' */ 0x64787370, + bmdDuplexInactive = /* 'dxin' */ 0x6478696E }; /* Enum BMDPanelType - The type of interchangeable panel */ typedef uint32_t BMDPanelType; enum _BMDPanelType { - bmdPanelNotDetected = 'npnl', - bmdPanelTeranexMiniSmartPanel = 'tmsm' + bmdPanelNotDetected = /* 'npnl' */ 0x6E706E6C, + bmdPanelTeranexMiniSmartPanel = /* 'tmsm' */ 0x746D736D }; /* Enum BMDDeviceBusyState - Current device busy state */ @@ -628,19 +638,19 @@ typedef uint32_t BMD3DPreviewFormat; enum _BMD3DPreviewFormat { - bmd3DPreviewFormatDefault = 'defa', - bmd3DPreviewFormatLeftOnly = 'left', - bmd3DPreviewFormatRightOnly = 'righ', - bmd3DPreviewFormatSideBySide = 'side', - bmd3DPreviewFormatTopBottom = 'topb' + bmd3DPreviewFormatDefault = /* 'defa' */ 0x64656661, + bmd3DPreviewFormatLeftOnly = /* 'left' */ 0x6C656674, + bmd3DPreviewFormatRightOnly = /* 'righ' */ 0x72696768, + bmd3DPreviewFormatSideBySide = /* 'side' */ 0x73696465, + bmd3DPreviewFormatTopBottom = /* 'topb' */ 0x746F7062 }; /* Enum BMDNotifications - Events that can be subscribed through IDeckLinkNotification */ typedef uint32_t BMDNotifications; enum _BMDNotifications { - bmdPreferencesChanged = 'pref', - bmdStatusChanged = 'stat' + bmdPreferencesChanged = /* 'pref' */ 0x70726566, + bmdStatusChanged = /* 'stat' */ 0x73746174 }; #if defined(__cplusplus) @@ -693,7 +703,7 @@ class BMD_PUBLIC IDeckLinkVideoOutputCallback : public IUnknown { public: - virtual HRESULT ScheduledFrameCompleted (/* in */ IDeckLinkVideoFrame *completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0; + virtual HRESULT ScheduledFrameCompleted (/* in */ IDeckLinkVideoFrame* completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0; virtual HRESULT ScheduledPlaybackHasStopped (void) = 0; protected: @@ -705,7 +715,7 @@ class BMD_PUBLIC IDeckLinkInputCallback : public IUnknown { public: - virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; + virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode* newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; virtual HRESULT VideoInputFrameArrived (/* in */ IDeckLinkVideoInputFrame* videoFrame, /* in */ IDeckLinkAudioInputPacket* audioPacket) = 0; protected: @@ -717,7 +727,7 @@ class BMD_PUBLIC IDeckLinkEncoderInputCallback : public IUnknown { public: - virtual HRESULT VideoInputSignalChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; + virtual HRESULT VideoInputSignalChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode* newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; virtual HRESULT VideoPacketArrived (/* in */ IDeckLinkEncoderVideoPacket* videoPacket) = 0; virtual HRESULT AudioPacketArrived (/* in */ IDeckLinkEncoderAudioPacket* audioPacket) = 0; @@ -730,9 +740,8 @@ class BMD_PUBLIC IDeckLinkMemoryAllocator : public IUnknown { public: - virtual HRESULT AllocateBuffer (/* in */ uint32_t bufferSize, /* out */ void **allocatedBuffer) = 0; - virtual HRESULT ReleaseBuffer (/* in */ void *buffer) = 0; - + virtual HRESULT AllocateBuffer (/* in */ uint32_t bufferSize, /* out */ void** allocatedBuffer) = 0; + virtual HRESULT ReleaseBuffer (/* in */ void* buffer) = 0; virtual HRESULT Commit (void) = 0; virtual HRESULT Decommit (void) = 0; }; @@ -745,12 +754,12 @@ virtual HRESULT RenderAudioSamples (/* in */ bool preroll) = 0; }; -/* Interface IDeckLinkIterator - enumerates installed DeckLink hardware */ +/* Interface IDeckLinkIterator - Enumerates installed DeckLink hardware */ class BMD_PUBLIC IDeckLinkIterator : public IUnknown { public: - virtual HRESULT Next (/* out */ IDeckLink **deckLinkInstance) = 0; + virtual HRESULT Next (/* out */ IDeckLink** deckLinkInstance) = 0; }; /* Interface IDeckLinkAPIInformation - DeckLinkAPI attribute interface */ @@ -758,10 +767,10 @@ class BMD_PUBLIC IDeckLinkAPIInformation : public IUnknown { public: - virtual HRESULT GetFlag (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ bool *value) = 0; - virtual HRESULT GetInt (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ int64_t *value) = 0; - virtual HRESULT GetFloat (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ double *value) = 0; - virtual HRESULT GetString (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ CFStringRef *value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ bool* value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ int64_t* value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ double* value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ CFStringRef* value) = 0; protected: virtual ~IDeckLinkAPIInformation () {} // call Release method to drop reference count @@ -772,54 +781,47 @@ class BMD_PUBLIC IDeckLinkOutput : public IUnknown { public: - virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of 0 is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, /* in */ BMDSupportedVideoModeFlags flags, /* out */ BMDDisplayMode *actualMode, /* out */ bool *supported) = 0; - virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; - - virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of bmdVideoConnectionUnspecified is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, /* in */ BMDVideoOutputConversionMode conversionMode, /* in */ BMDSupportedVideoModeFlags flags, /* out */ BMDDisplayMode* actualMode, /* out */ bool* supported) = 0; + virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode** resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator** iterator) = 0; + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback* previewCallback) = 0; /* Video Output */ virtual HRESULT EnableVideoOutput (/* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags) = 0; virtual HRESULT DisableVideoOutput (void) = 0; - - virtual HRESULT SetVideoOutputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; - virtual HRESULT CreateVideoFrame (/* in */ int32_t width, /* in */ int32_t height, /* in */ int32_t rowBytes, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame **outFrame) = 0; - virtual HRESULT CreateAncillaryData (/* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; // Use of IDeckLinkVideoFrameAncillaryPackets is preferred - - virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame *theFrame) = 0; - virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0; - virtual HRESULT SetScheduledFrameCompletionCallback (/* in */ IDeckLinkVideoOutputCallback *theCallback) = 0; - virtual HRESULT GetBufferedVideoFrameCount (/* out */ uint32_t *bufferedFrameCount) = 0; + virtual HRESULT SetVideoOutputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator* theAllocator) = 0; + virtual HRESULT CreateVideoFrame (/* in */ int32_t width, /* in */ int32_t height, /* in */ int32_t rowBytes, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame** outFrame) = 0; + virtual HRESULT CreateAncillaryData (/* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary** outBuffer) = 0; // Use of IDeckLinkVideoFrameAncillaryPackets is preferred + virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame* theFrame) = 0; + virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame* theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT SetScheduledFrameCompletionCallback (/* in */ IDeckLinkVideoOutputCallback* theCallback) = 0; + virtual HRESULT GetBufferedVideoFrameCount (/* out */ uint32_t* bufferedFrameCount) = 0; /* Audio Output */ virtual HRESULT EnableAudioOutput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount, /* in */ BMDAudioOutputStreamType streamType) = 0; virtual HRESULT DisableAudioOutput (void) = 0; - - virtual HRESULT WriteAudioSamplesSync (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* out */ uint32_t *sampleFramesWritten) = 0; - + virtual HRESULT WriteAudioSamplesSync (/* in */ void* buffer, /* in */ uint32_t sampleFrameCount, /* out */ uint32_t* sampleFramesWritten) = 0; virtual HRESULT BeginAudioPreroll (void) = 0; virtual HRESULT EndAudioPreroll (void) = 0; - virtual HRESULT ScheduleAudioSamples (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ uint32_t *sampleFramesWritten) = 0; - - virtual HRESULT GetBufferedAudioSampleFrameCount (/* out */ uint32_t *bufferedSampleFrameCount) = 0; + virtual HRESULT ScheduleAudioSamples (/* in */ void* buffer, /* in */ uint32_t sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ uint32_t* sampleFramesWritten) = 0; + virtual HRESULT GetBufferedAudioSampleFrameCount (/* out */ uint32_t* bufferedSampleFrameCount) = 0; virtual HRESULT FlushBufferedAudioSamples (void) = 0; - - virtual HRESULT SetAudioCallback (/* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; + virtual HRESULT SetAudioCallback (/* in */ IDeckLinkAudioOutputCallback* theCallback) = 0; /* Output Control */ virtual HRESULT StartScheduledPlayback (/* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed) = 0; - virtual HRESULT StopScheduledPlayback (/* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale) = 0; - virtual HRESULT IsScheduledPlaybackRunning (/* out */ bool *active) = 0; - virtual HRESULT GetScheduledStreamTime (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed) = 0; - virtual HRESULT GetReferenceStatus (/* out */ BMDReferenceStatus *referenceStatus) = 0; + virtual HRESULT StopScheduledPlayback (/* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue* actualStopTime, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT IsScheduledPlaybackRunning (/* out */ bool* active) = 0; + virtual HRESULT GetScheduledStreamTime (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue* streamTime, /* out */ double* playbackSpeed) = 0; + virtual HRESULT GetReferenceStatus (/* out */ BMDReferenceStatus* referenceStatus) = 0; /* Hardware Timing */ - virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; - virtual HRESULT GetFrameCompletionReferenceTimestamp (/* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *frameCompletionTimestamp) = 0; + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue* hardwareTime, /* out */ BMDTimeValue* timeInFrame, /* out */ BMDTimeValue* ticksPerFrame) = 0; + virtual HRESULT GetFrameCompletionReferenceTimestamp (/* in */ IDeckLinkVideoFrame* theFrame, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue* frameCompletionTimestamp) = 0; protected: virtual ~IDeckLinkOutput () {} // call Release method to drop reference count @@ -830,24 +832,23 @@ class BMD_PUBLIC IDeckLinkInput : public IUnknown { public: - virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of 0 is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, /* in */ BMDSupportedVideoModeFlags flags, /* out */ bool *supported) = 0; - virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; - - virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of bmdVideoConnectionUnspecified is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, /* in */ BMDVideoInputConversionMode conversionMode, /* in */ BMDSupportedVideoModeFlags flags, /* out */ BMDDisplayMode* actualMode, /* out */ bool* supported) = 0; + virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode** resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator** iterator) = 0; + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback* previewCallback) = 0; /* Video Input */ virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; virtual HRESULT DisableVideoInput (void) = 0; - virtual HRESULT GetAvailableVideoFrameCount (/* out */ uint32_t *availableFrameCount) = 0; - virtual HRESULT SetVideoInputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + virtual HRESULT GetAvailableVideoFrameCount (/* out */ uint32_t* availableFrameCount) = 0; + virtual HRESULT SetVideoInputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator* theAllocator) = 0; /* Audio Input */ virtual HRESULT EnableAudioInput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount) = 0; virtual HRESULT DisableAudioInput (void) = 0; - virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0; + virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t* availableSampleFrameCount) = 0; /* Input Control */ @@ -855,11 +856,11 @@ virtual HRESULT StopStreams (void) = 0; virtual HRESULT PauseStreams (void) = 0; virtual HRESULT FlushStreams (void) = 0; - virtual HRESULT SetCallback (/* in */ IDeckLinkInputCallback *theCallback) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkInputCallback* theCallback) = 0; /* Hardware Timing */ - virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue* hardwareTime, /* out */ BMDTimeValue* timeInFrame, /* out */ BMDTimeValue* ticksPerFrame) = 0; protected: virtual ~IDeckLinkInput () {} // call Release method to drop reference count @@ -871,7 +872,7 @@ { public: virtual HRESULT SetInt (/* in */ BMDDeckLinkHDMIInputEDIDID cfgID, /* in */ int64_t value) = 0; - virtual HRESULT GetInt (/* in */ BMDDeckLinkHDMIInputEDIDID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkHDMIInputEDIDID cfgID, /* out */ int64_t* value) = 0; virtual HRESULT WriteToEDID (void) = 0; protected: @@ -883,22 +884,22 @@ class BMD_PUBLIC IDeckLinkEncoderInput : public IUnknown { public: - virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of 0 is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedCodec, /* in */ uint32_t requestedCodecProfile, /* in */ BMDSupportedVideoModeFlags flags, /* out */ bool *supported) = 0; - virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; + virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of bmdVideoConnectionUnspecified is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedCodec, /* in */ uint32_t requestedCodecProfile, /* in */ BMDSupportedVideoModeFlags flags, /* out */ bool* supported) = 0; + virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode** resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator** iterator) = 0; /* Video Input */ virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; virtual HRESULT DisableVideoInput (void) = 0; - virtual HRESULT GetAvailablePacketsCount (/* out */ uint32_t *availablePacketsCount) = 0; - virtual HRESULT SetMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + virtual HRESULT GetAvailablePacketsCount (/* out */ uint32_t* availablePacketsCount) = 0; + virtual HRESULT SetMemoryAllocator (/* in */ IDeckLinkMemoryAllocator* theAllocator) = 0; /* Audio Input */ virtual HRESULT EnableAudioInput (/* in */ BMDAudioFormat audioFormat, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount) = 0; virtual HRESULT DisableAudioInput (void) = 0; - virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0; + virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t* availableSampleFrameCount) = 0; /* Input Control */ @@ -906,11 +907,11 @@ virtual HRESULT StopStreams (void) = 0; virtual HRESULT PauseStreams (void) = 0; virtual HRESULT FlushStreams (void) = 0; - virtual HRESULT SetCallback (/* in */ IDeckLinkEncoderInputCallback *theCallback) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkEncoderInputCallback* theCallback) = 0; /* Hardware Timing */ - virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue* hardwareTime, /* out */ BMDTimeValue* timeInFrame, /* out */ BMDTimeValue* ticksPerFrame) = 0; protected: virtual ~IDeckLinkEncoderInput () {} // call Release method to drop reference count @@ -926,10 +927,9 @@ virtual long GetRowBytes (void) = 0; virtual BMDPixelFormat GetPixelFormat (void) = 0; virtual BMDFrameFlags GetFlags (void) = 0; - virtual HRESULT GetBytes (/* out */ void **buffer) = 0; - - virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0; - virtual HRESULT GetAncillaryData (/* out */ IDeckLinkVideoFrameAncillary **ancillary) = 0; // Use of IDeckLinkVideoFrameAncillaryPackets is preferred + virtual HRESULT GetBytes (/* out */ void** buffer) = 0; + virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode** timecode) = 0; + virtual HRESULT GetAncillaryData (/* out */ IDeckLinkVideoFrameAncillary** ancillary) = 0; // Use of IDeckLinkVideoFrameAncillaryPackets is preferred protected: virtual ~IDeckLinkVideoFrame () {} // call Release method to drop reference count @@ -941,10 +941,9 @@ { public: virtual HRESULT SetFlags (/* in */ BMDFrameFlags newFlags) = 0; - - virtual HRESULT SetTimecode (/* in */ BMDTimecodeFormat format, /* in */ IDeckLinkTimecode *timecode) = 0; + virtual HRESULT SetTimecode (/* in */ BMDTimecodeFormat format, /* in */ IDeckLinkTimecode* timecode) = 0; virtual HRESULT SetTimecodeFromComponents (/* in */ BMDTimecodeFormat format, /* in */ uint8_t hours, /* in */ uint8_t minutes, /* in */ uint8_t seconds, /* in */ uint8_t frames, /* in */ BMDTimecodeFlags flags) = 0; - virtual HRESULT SetAncillaryData (/* in */ IDeckLinkVideoFrameAncillary *ancillary) = 0; + virtual HRESULT SetAncillaryData (/* in */ IDeckLinkVideoFrameAncillary* ancillary) = 0; virtual HRESULT SetTimecodeUserBits (/* in */ BMDTimecodeFormat format, /* in */ BMDTimecodeUserBits userBits) = 0; protected: @@ -957,21 +956,22 @@ { public: virtual BMDVideo3DPackingFormat Get3DPackingFormat (void) = 0; - virtual HRESULT GetFrameForRightEye (/* out */ IDeckLinkVideoFrame* *rightEyeFrame) = 0; + virtual HRESULT GetFrameForRightEye (/* out */ IDeckLinkVideoFrame** rightEyeFrame) = 0; protected: virtual ~IDeckLinkVideoFrame3DExtensions () {} // call Release method to drop reference count }; -/* Interface IDeckLinkVideoFrameMetadataExtensions - Optional interface implemented on IDeckLinkVideoFrame to support frame metadata such as HDMI HDR information */ +/* Interface IDeckLinkVideoFrameMetadataExtensions - Optional interface implemented on IDeckLinkVideoFrame to support frame metadata such as HDR information */ class BMD_PUBLIC IDeckLinkVideoFrameMetadataExtensions : public IUnknown { public: - virtual HRESULT GetInt (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ int64_t *value) = 0; - virtual HRESULT GetFloat (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ double *value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ int64_t* value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ double* value) = 0; virtual HRESULT GetFlag (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ bool* value) = 0; - virtual HRESULT GetString (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ CFStringRef *value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ CFStringRef* value) = 0; + virtual HRESULT GetBytes (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ void* buffer /* optional */, /* in, out */ uint32_t* bufferSize) = 0; protected: virtual ~IDeckLinkVideoFrameMetadataExtensions () {} // call Release method to drop reference count @@ -982,8 +982,8 @@ class BMD_PUBLIC IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame { public: - virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, /* in */ BMDTimeScale timeScale) = 0; - virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0; + virtual HRESULT GetStreamTime (/* out */ BMDTimeValue* frameTime, /* out */ BMDTimeValue* frameDuration, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue* frameTime, /* out */ BMDTimeValue* frameDuration) = 0; protected: virtual ~IDeckLinkVideoInputFrame () {} // call Release method to drop reference count @@ -994,12 +994,11 @@ class BMD_PUBLIC IDeckLinkAncillaryPacket : public IUnknown { public: - - virtual HRESULT GetBytes (/* in */ BMDAncillaryPacketFormat format /* For output, only one format need be offered */, /* out */ const void **data /* Optional */, /* out */ uint32_t *size /* Optional */) = 0; + virtual HRESULT GetBytes (/* in */ BMDAncillaryPacketFormat format /* For output, only one format need be offered */, /* out */ const void** data /* Optional */, /* out */ uint32_t* size /* Optional */) = 0; virtual uint8_t GetDID (void) = 0; virtual uint8_t GetSDID (void) = 0; - virtual uint32_t GetLineNumber (void) = 0; // On output, zero is auto - virtual uint8_t GetDataStreamIndex (void) = 0; // Usually zero. Can only be 1 if non-SD and the first data stream is completely full + virtual uint32_t GetLineNumber (void) = 0; // On output, zero is auto + virtual uint8_t GetDataStreamIndex (void) = 0; // Usually zero. Can only be 1 if non-SD and the first data stream is completely full protected: virtual ~IDeckLinkAncillaryPacket () {} // call Release method to drop reference count @@ -1010,35 +1009,33 @@ class BMD_PUBLIC IDeckLinkAncillaryPacketIterator : public IUnknown { public: - virtual HRESULT Next (/* out */ IDeckLinkAncillaryPacket **packet) = 0; + virtual HRESULT Next (/* out */ IDeckLinkAncillaryPacket** packet) = 0; protected: virtual ~IDeckLinkAncillaryPacketIterator () {} // call Release method to drop reference count }; -/* Interface IDeckLinkVideoFrameAncillaryPackets - Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */ +/* Interface IDeckLinkVideoFrameAncillaryPackets - Obtained through QueryInterface on an IDeckLinkVideoFrame object. */ class BMD_PUBLIC IDeckLinkVideoFrameAncillaryPackets : public IUnknown { public: - - virtual HRESULT GetPacketIterator (/* out */ IDeckLinkAncillaryPacketIterator **iterator) = 0; - virtual HRESULT GetFirstPacketByID (/* in */ uint8_t DID, /* in */ uint8_t SDID, /* out */ IDeckLinkAncillaryPacket **packet) = 0; - virtual HRESULT AttachPacket (/* in */ IDeckLinkAncillaryPacket *packet) = 0; // Implement IDeckLinkAncillaryPacket to output your own - virtual HRESULT DetachPacket (/* in */ IDeckLinkAncillaryPacket *packet) = 0; + virtual HRESULT GetPacketIterator (/* out */ IDeckLinkAncillaryPacketIterator** iterator) = 0; + virtual HRESULT GetFirstPacketByID (/* in */ uint8_t DID, /* in */ uint8_t SDID, /* out */ IDeckLinkAncillaryPacket** packet) = 0; + virtual HRESULT AttachPacket (/* in */ IDeckLinkAncillaryPacket* packet) = 0; // Implement IDeckLinkAncillaryPacket to output your own + virtual HRESULT DetachPacket (/* in */ IDeckLinkAncillaryPacket* packet) = 0; virtual HRESULT DetachAllPackets (void) = 0; protected: virtual ~IDeckLinkVideoFrameAncillaryPackets () {} // call Release method to drop reference count }; -/* Interface IDeckLinkVideoFrameAncillary - Use of IDeckLinkVideoFrameAncillaryPackets is preferred. Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */ +/* Interface IDeckLinkVideoFrameAncillary - Use of IDeckLinkVideoFrameAncillaryPackets is preferred. Obtained through QueryInterface on an IDeckLinkVideoFrame object. */ class BMD_PUBLIC IDeckLinkVideoFrameAncillary : public IUnknown { public: - - virtual HRESULT GetBufferForVerticalBlankingLine (/* in */ uint32_t lineNumber, /* out */ void **buffer) = 0; // Pixels/rowbytes is same as display mode, except for above HD where it's 1920 pixels for UHD modes and 2048 pixels for DCI modes + virtual HRESULT GetBufferForVerticalBlankingLine (/* in */ uint32_t lineNumber, /* out */ void** buffer) = 0; // Pixels/rowbytes is same as display mode, except for above HD where it's 1920 pixels for UHD modes and 2048 pixels for DCI modes virtual BMDPixelFormat GetPixelFormat (void) = 0; virtual BMDDisplayMode GetDisplayMode (void) = 0; @@ -1051,9 +1048,9 @@ class BMD_PUBLIC IDeckLinkEncoderPacket : public IUnknown { public: - virtual HRESULT GetBytes (/* out */ void **buffer) = 0; + virtual HRESULT GetBytes (/* out */ void** buffer) = 0; virtual long GetSize (void) = 0; - virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT GetStreamTime (/* out */ BMDTimeValue* frameTime, /* in */ BMDTimeScale timeScale) = 0; virtual BMDPacketType GetPacketType (void) = 0; protected: @@ -1066,9 +1063,8 @@ { public: virtual BMDPixelFormat GetPixelFormat (void) = 0; - virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0; - - virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0; + virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue* frameTime, /* out */ BMDTimeValue* frameDuration) = 0; + virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode** timecode) = 0; protected: virtual ~IDeckLinkEncoderVideoPacket () {} // call Release method to drop reference count @@ -1085,13 +1081,13 @@ virtual ~IDeckLinkEncoderAudioPacket () {} // call Release method to drop reference count }; -/* Interface IDeckLinkH265NALPacket - Obtained through QueryInterface() on an IDeckLinkEncoderVideoPacket object */ +/* Interface IDeckLinkH265NALPacket - Obtained through QueryInterface on an IDeckLinkEncoderVideoPacket object */ class BMD_PUBLIC IDeckLinkH265NALPacket : public IDeckLinkEncoderVideoPacket { public: - virtual HRESULT GetUnitType (/* out */ uint8_t *unitType) = 0; - virtual HRESULT GetBytesNoPrefix (/* out */ void **buffer) = 0; + virtual HRESULT GetUnitType (/* out */ uint8_t* unitType) = 0; + virtual HRESULT GetBytesNoPrefix (/* out */ void** buffer) = 0; virtual long GetSizeNoPrefix (void) = 0; protected: @@ -1104,8 +1100,8 @@ { public: virtual long GetSampleFrameCount (void) = 0; - virtual HRESULT GetBytes (/* out */ void **buffer) = 0; - virtual HRESULT GetPacketTime (/* out */ BMDTimeValue *packetTime, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT GetBytes (/* out */ void** buffer) = 0; + virtual HRESULT GetPacketTime (/* out */ BMDTimeValue* packetTime, /* in */ BMDTimeScale timeScale) = 0; protected: virtual ~IDeckLinkAudioInputPacket () {} // call Release method to drop reference count @@ -1116,13 +1112,13 @@ class BMD_PUBLIC IDeckLinkScreenPreviewCallback : public IUnknown { public: - virtual HRESULT DrawFrame (/* in */ IDeckLinkVideoFrame *theFrame) = 0; + virtual HRESULT DrawFrame (/* in */ IDeckLinkVideoFrame* theFrame) = 0; protected: virtual ~IDeckLinkScreenPreviewCallback () {} // call Release method to drop reference count }; -/* Interface IDeckLinkCocoaScreenPreviewCallback - Screen preview callback for Cocoa-based applications */ +/* Interface IDeckLinkCocoaScreenPreviewCallback - Screen preview callback for Cocoa-based applications. Created with CreateCocoaScreenPreview */ class BMD_PUBLIC IDeckLinkCocoaScreenPreviewCallback : public IDeckLinkScreenPreviewCallback { @@ -1132,7 +1128,7 @@ virtual ~IDeckLinkCocoaScreenPreviewCallback () {} // call Release method to drop reference count }; -/* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance(). */ +/* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance on platforms with native COM support or from CreateOpenGLScreenPreviewHelper on other platforms. */ class BMD_PUBLIC IDeckLinkGLScreenPreviewHelper : public IUnknown { @@ -1142,7 +1138,7 @@ virtual HRESULT InitializeGL (void) = 0; virtual HRESULT PaintGL (void) = 0; - virtual HRESULT SetFrame (/* in */ IDeckLinkVideoFrame *theFrame) = 0; + virtual HRESULT SetFrame (/* in */ IDeckLinkVideoFrame* theFrame) = 0; virtual HRESULT Set3DPreviewFormat (/* in */ BMD3DPreviewFormat previewFormat) = 0; protected: @@ -1162,8 +1158,8 @@ class BMD_PUBLIC IDeckLinkNotification : public IUnknown { public: - virtual HRESULT Subscribe (/* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback) = 0; - virtual HRESULT Unsubscribe (/* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback) = 0; + virtual HRESULT Subscribe (/* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback* theCallback) = 0; + virtual HRESULT Unsubscribe (/* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback* theCallback) = 0; protected: virtual ~IDeckLinkNotification () {} // call Release method to drop reference count @@ -1174,10 +1170,10 @@ class BMD_PUBLIC IDeckLinkProfileAttributes : public IUnknown { public: - virtual HRESULT GetFlag (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ bool *value) = 0; - virtual HRESULT GetInt (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ int64_t *value) = 0; - virtual HRESULT GetFloat (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ double *value) = 0; - virtual HRESULT GetString (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ CFStringRef *value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ bool* value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ int64_t* value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ double* value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ CFStringRef* value) = 0; protected: virtual ~IDeckLinkProfileAttributes () {} // call Release method to drop reference count @@ -1188,7 +1184,7 @@ class BMD_PUBLIC IDeckLinkProfileIterator : public IUnknown { public: - virtual HRESULT Next (/* out */ IDeckLinkProfile **profile) = 0; + virtual HRESULT Next (/* out */ IDeckLinkProfile** profile) = 0; protected: virtual ~IDeckLinkProfileIterator () {} // call Release method to drop reference count @@ -1199,10 +1195,10 @@ class BMD_PUBLIC IDeckLinkProfile : public IUnknown { public: - virtual HRESULT GetDevice (/* out */ IDeckLink **device) = 0; // Device affected when this profile becomes active - virtual HRESULT IsActive (/* out */ bool *isActive) = 0; - virtual HRESULT SetActive (void) = 0; // Activating a profile will also change the profile on all devices enumerated by GetPeers(). Activation is not complete until IDeckLinkProfileCallback::ProfileActivated() is called - virtual HRESULT GetPeers (/* out */ IDeckLinkProfileIterator **profileIterator) = 0; // Profiles of other devices activated with this profile + virtual HRESULT GetDevice (/* out */ IDeckLink** device) = 0; // Device affected when this profile becomes active + virtual HRESULT IsActive (/* out */ bool* isActive) = 0; + virtual HRESULT SetActive (void) = 0; // Activating a profile will also change the profile on all devices enumerated by GetPeers. Activation is not complete until IDeckLinkProfileCallback::ProfileActivated is called + virtual HRESULT GetPeers (/* out */ IDeckLinkProfileIterator** profileIterator) = 0; // Profiles of other devices activated with this profile protected: virtual ~IDeckLinkProfile () {} // call Release method to drop reference count @@ -1213,8 +1209,8 @@ class BMD_PUBLIC IDeckLinkProfileCallback : public IUnknown { public: - virtual HRESULT ProfileChanging (/* in */ IDeckLinkProfile *profileToBeActivated, /* in */ bool streamsWillBeForcedToStop) = 0; // Called before this device changes profile. User has an opportunity for teardown if streamsWillBeForcedToStop - virtual HRESULT ProfileActivated (/* in */ IDeckLinkProfile *activatedProfile) = 0; // Called after this device has been activated with a new profile + virtual HRESULT ProfileChanging (/* in */ IDeckLinkProfile* profileToBeActivated, /* in */ bool streamsWillBeForcedToStop) = 0; // Called before this device changes profile. User has an opportunity for teardown if streamsWillBeForcedToStop + virtual HRESULT ProfileActivated (/* in */ IDeckLinkProfile* activatedProfile) = 0; // Called after this device has been activated with a new profile protected: virtual ~IDeckLinkProfileCallback () {} // call Release method to drop reference count @@ -1225,9 +1221,9 @@ class BMD_PUBLIC IDeckLinkProfileManager : public IUnknown { public: - virtual HRESULT GetProfiles (/* out */ IDeckLinkProfileIterator **profileIterator) = 0; // All available profiles for this device - virtual HRESULT GetProfile (/* in */ BMDProfileID profileID, /* out */ IDeckLinkProfile **profile) = 0; - virtual HRESULT SetCallback (/* in */ IDeckLinkProfileCallback *callback) = 0; + virtual HRESULT GetProfiles (/* out */ IDeckLinkProfileIterator** profileIterator) = 0; // All available profiles for this device + virtual HRESULT GetProfile (/* in */ BMDProfileID profileID, /* out */ IDeckLinkProfile** profile) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkProfileCallback* callback) = 0; protected: virtual ~IDeckLinkProfileManager () {} // call Release method to drop reference count @@ -1238,11 +1234,11 @@ class BMD_PUBLIC IDeckLinkStatus : public IUnknown { public: - virtual HRESULT GetFlag (/* in */ BMDDeckLinkStatusID statusID, /* out */ bool *value) = 0; - virtual HRESULT GetInt (/* in */ BMDDeckLinkStatusID statusID, /* out */ int64_t *value) = 0; - virtual HRESULT GetFloat (/* in */ BMDDeckLinkStatusID statusID, /* out */ double *value) = 0; - virtual HRESULT GetString (/* in */ BMDDeckLinkStatusID statusID, /* out */ CFStringRef *value) = 0; - virtual HRESULT GetBytes (/* in */ BMDDeckLinkStatusID statusID, /* out */ void *buffer, /* in, out */ uint32_t *bufferSize) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkStatusID statusID, /* out */ bool* value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkStatusID statusID, /* out */ int64_t* value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkStatusID statusID, /* out */ double* value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkStatusID statusID, /* out */ CFStringRef* value) = 0; + virtual HRESULT GetBytes (/* in */ BMDDeckLinkStatusID statusID, /* out */ void* buffer, /* in, out */ uint32_t* bufferSize) = 0; protected: virtual ~IDeckLinkStatus () {} // call Release method to drop reference count @@ -1263,7 +1259,7 @@ virtual ~IDeckLinkKeyer () {} // call Release method to drop reference count }; -/* Interface IDeckLinkVideoConversion - Created with CoCreateInstance(). */ +/* Interface IDeckLinkVideoConversion - Created with CoCreateInstance. */ class BMD_PUBLIC IDeckLinkVideoConversion : public IUnknown { @@ -1302,16 +1298,17 @@ extern "C" { - IDeckLinkIterator* BMD_PUBLIC CreateDeckLinkIteratorInstance (void); - IDeckLinkDiscovery* BMD_PUBLIC CreateDeckLinkDiscoveryInstance (void); - IDeckLinkAPIInformation* BMD_PUBLIC CreateDeckLinkAPIInformationInstance (void); - IDeckLinkGLScreenPreviewHelper* BMD_PUBLIC CreateOpenGLScreenPreviewHelper (void); - IDeckLinkCocoaScreenPreviewCallback* BMD_PUBLIC CreateCocoaScreenPreview (void* /* (NSView*) */ parentView); - IDeckLinkVideoConversion* BMD_PUBLIC CreateVideoConversionInstance (void); - IDeckLinkVideoFrameAncillaryPackets* BMD_PUBLIC CreateVideoFrameAncillaryPacketsInstance (void); // For use when creating a custom IDeckLinkVideoFrame without wrapping IDeckLinkOutput::CreateVideoFrame + IDeckLinkIterator* BMD_PUBLIC CreateDeckLinkIteratorInstance(void); + IDeckLinkDiscovery* BMD_PUBLIC CreateDeckLinkDiscoveryInstance(void); + IDeckLinkAPIInformation* BMD_PUBLIC CreateDeckLinkAPIInformationInstance(void); + IDeckLinkGLScreenPreviewHelper* BMD_PUBLIC CreateOpenGLScreenPreviewHelper(void); + IDeckLinkCocoaScreenPreviewCallback* BMD_PUBLIC CreateCocoaScreenPreview(/* in */ void* /* (NSView*)*/ parentView); + IDeckLinkVideoConversion* BMD_PUBLIC CreateVideoConversionInstance(void); + IDeckLinkVideoFrameAncillaryPackets* BMD_PUBLIC CreateVideoFrameAncillaryPacketsInstance(void); // For use when creating a custom IDeckLinkVideoFrame without wrapping IDeckLinkOutput::CreateVideoFrame } -#endif // defined(__cplusplus) + +#endif /* defined(__cplusplus) */ #endif /* defined(BMD_DECKLINKAPI_H) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/osx/DeckLinkAPIConfiguration.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/osx/DeckLinkAPIConfiguration.h
Changed
@@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2019 Blackmagic Design +** Copyright (c) 2021 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -7,14 +7,14 @@ ** execute, and transmit the Software, and to prepare derivative works of the ** Software, and to permit third-parties to whom the Software is furnished to ** do so, all subject to the following: -** +** ** The copyright notices in the Software and this entire statement, including ** the above license grant, this restriction and the following disclaimer, ** must be included in all copies of the Software, in whole or in part, and ** all derivative works of the Software, unless such copies or derivative ** works are solely in the form of machine-executable object code generated by ** a source language processor. -** +** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT @@ -46,8 +46,8 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLinkConfiguration = /* 912F634B-2D4E-40A4-8AAB-8D80B73F1289 */ {0x91,0x2F,0x63,0x4B,0x2D,0x4E,0x40,0xA4,0x8A,0xAB,0x8D,0x80,0xB7,0x3F,0x12,0x89}; -BMD_CONST REFIID IID_IDeckLinkEncoderConfiguration = /* 138050E5-C60A-4552-BF3F-0F358049327E */ {0x13,0x80,0x50,0xE5,0xC6,0x0A,0x45,0x52,0xBF,0x3F,0x0F,0x35,0x80,0x49,0x32,0x7E}; +BMD_CONST REFIID IID_IDeckLinkConfiguration = /* 912F634B-2D4E-40A4-8AAB-8D80B73F1289 */ { 0x91,0x2F,0x63,0x4B,0x2D,0x4E,0x40,0xA4,0x8A,0xAB,0x8D,0x80,0xB7,0x3F,0x12,0x89 }; +BMD_CONST REFIID IID_IDeckLinkEncoderConfiguration = /* 138050E5-C60A-4552-BF3F-0F358049327E */ { 0x13,0x80,0x50,0xE5,0xC6,0x0A,0x45,0x52,0xBF,0x3F,0x0F,0x35,0x80,0x49,0x32,0x7E }; /* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */ @@ -56,131 +56,131 @@ /* Serial port Flags */ - bmdDeckLinkConfigSwapSerialRxTx = 'ssrt', + bmdDeckLinkConfigSwapSerialRxTx = /* 'ssrt' */ 0x73737274, /* Video Input/Output Integers */ - bmdDeckLinkConfigHDMI3DPackingFormat = '3dpf', - bmdDeckLinkConfigBypass = 'byps', - bmdDeckLinkConfigClockTimingAdjustment = 'ctad', + bmdDeckLinkConfigHDMI3DPackingFormat = /* '3dpf' */ 0x33647066, + bmdDeckLinkConfigBypass = /* 'byps' */ 0x62797073, + bmdDeckLinkConfigClockTimingAdjustment = /* 'ctad' */ 0x63746164, /* Audio Input/Output Flags */ - bmdDeckLinkConfigAnalogAudioConsumerLevels = 'aacl', - - /* Video output flags */ - - bmdDeckLinkConfigFieldFlickerRemoval = 'fdfr', - bmdDeckLinkConfigHD1080p24ToHD1080i5994Conversion = 'to59', - bmdDeckLinkConfig444SDIVideoOutput = '444o', - bmdDeckLinkConfigBlackVideoOutputDuringCapture = 'bvoc', - bmdDeckLinkConfigLowLatencyVideoOutput = 'llvo', - bmdDeckLinkConfigDownConversionOnAllAnalogOutput = 'caao', - bmdDeckLinkConfigSMPTELevelAOutput = 'smta', - bmdDeckLinkConfigRec2020Output = 'rec2', // Ensure output is Rec.2020 colorspace - bmdDeckLinkConfigQuadLinkSDIVideoOutputSquareDivisionSplit = 'SDQS', + bmdDeckLinkConfigAnalogAudioConsumerLevels = /* 'aacl' */ 0x6161636C, + bmdDeckLinkConfigSwapHDMICh3AndCh4OnInput = /* 'hi34' */ 0x68693334, + bmdDeckLinkConfigSwapHDMICh3AndCh4OnOutput = /* 'ho34' */ 0x686F3334, /* Video Output Flags */ - bmdDeckLinkConfigOutput1080pAsPsF = 'pfpr', + bmdDeckLinkConfigFieldFlickerRemoval = /* 'fdfr' */ 0x66646672, + bmdDeckLinkConfigHD1080p24ToHD1080i5994Conversion = /* 'to59' */ 0x746F3539, + bmdDeckLinkConfig444SDIVideoOutput = /* '444o' */ 0x3434346F, + bmdDeckLinkConfigBlackVideoOutputDuringCapture = /* 'bvoc' */ 0x62766F63, + bmdDeckLinkConfigLowLatencyVideoOutput = /* 'llvo' */ 0x6C6C766F, + bmdDeckLinkConfigDownConversionOnAllAnalogOutput = /* 'caao' */ 0x6361616F, + bmdDeckLinkConfigSMPTELevelAOutput = /* 'smta' */ 0x736D7461, + bmdDeckLinkConfigRec2020Output = /* 'rec2' */ 0x72656332, // Ensure output is Rec.2020 colorspace + bmdDeckLinkConfigQuadLinkSDIVideoOutputSquareDivisionSplit = /* 'SDQS' */ 0x53445153, + bmdDeckLinkConfigOutput1080pAsPsF = /* 'pfpr' */ 0x70667072, /* Video Output Integers */ - bmdDeckLinkConfigVideoOutputConnection = 'vocn', - bmdDeckLinkConfigVideoOutputConversionMode = 'vocm', - bmdDeckLinkConfigAnalogVideoOutputFlags = 'avof', - bmdDeckLinkConfigReferenceInputTimingOffset = 'glot', - bmdDeckLinkConfigVideoOutputIdleOperation = 'voio', - bmdDeckLinkConfigDefaultVideoOutputMode = 'dvom', - bmdDeckLinkConfigDefaultVideoOutputModeFlags = 'dvof', - bmdDeckLinkConfigSDIOutputLinkConfiguration = 'solc', - bmdDeckLinkConfigHDMITimecodePacking = 'htpk', - bmdDeckLinkConfigPlaybackGroup = 'plgr', + bmdDeckLinkConfigVideoOutputConnection = /* 'vocn' */ 0x766F636E, + bmdDeckLinkConfigVideoOutputConversionMode = /* 'vocm' */ 0x766F636D, + bmdDeckLinkConfigAnalogVideoOutputFlags = /* 'avof' */ 0x61766F66, + bmdDeckLinkConfigReferenceInputTimingOffset = /* 'glot' */ 0x676C6F74, + bmdDeckLinkConfigVideoOutputIdleOperation = /* 'voio' */ 0x766F696F, + bmdDeckLinkConfigDefaultVideoOutputMode = /* 'dvom' */ 0x64766F6D, + bmdDeckLinkConfigDefaultVideoOutputModeFlags = /* 'dvof' */ 0x64766F66, + bmdDeckLinkConfigSDIOutputLinkConfiguration = /* 'solc' */ 0x736F6C63, + bmdDeckLinkConfigHDMITimecodePacking = /* 'htpk' */ 0x6874706B, + bmdDeckLinkConfigPlaybackGroup = /* 'plgr' */ 0x706C6772, /* Video Output Floats */ - bmdDeckLinkConfigVideoOutputComponentLumaGain = 'oclg', - bmdDeckLinkConfigVideoOutputComponentChromaBlueGain = 'occb', - bmdDeckLinkConfigVideoOutputComponentChromaRedGain = 'occr', - bmdDeckLinkConfigVideoOutputCompositeLumaGain = 'oilg', - bmdDeckLinkConfigVideoOutputCompositeChromaGain = 'oicg', - bmdDeckLinkConfigVideoOutputSVideoLumaGain = 'oslg', - bmdDeckLinkConfigVideoOutputSVideoChromaGain = 'oscg', + bmdDeckLinkConfigVideoOutputComponentLumaGain = /* 'oclg' */ 0x6F636C67, + bmdDeckLinkConfigVideoOutputComponentChromaBlueGain = /* 'occb' */ 0x6F636362, + bmdDeckLinkConfigVideoOutputComponentChromaRedGain = /* 'occr' */ 0x6F636372, + bmdDeckLinkConfigVideoOutputCompositeLumaGain = /* 'oilg' */ 0x6F696C67, + bmdDeckLinkConfigVideoOutputCompositeChromaGain = /* 'oicg' */ 0x6F696367, + bmdDeckLinkConfigVideoOutputSVideoLumaGain = /* 'oslg' */ 0x6F736C67, + bmdDeckLinkConfigVideoOutputSVideoChromaGain = /* 'oscg' */ 0x6F736367, /* Video Input Flags */ - bmdDeckLinkConfigVideoInputScanning = 'visc', // Applicable to H264 Pro Recorder only - bmdDeckLinkConfigUseDedicatedLTCInput = 'dltc', // Use timecode from LTC input instead of SDI stream - bmdDeckLinkConfigSDIInput3DPayloadOverride = '3dds', - - /* Video Input Flags */ - - bmdDeckLinkConfigCapture1080pAsPsF = 'cfpr', + bmdDeckLinkConfigVideoInputScanning = /* 'visc' */ 0x76697363, // Applicable to H264 Pro Recorder only + bmdDeckLinkConfigUseDedicatedLTCInput = /* 'dltc' */ 0x646C7463, // Use timecode from LTC input instead of SDI stream + bmdDeckLinkConfigSDIInput3DPayloadOverride = /* '3dds' */ 0x33646473, + bmdDeckLinkConfigCapture1080pAsPsF = /* 'cfpr' */ 0x63667072, /* Video Input Integers */ - bmdDeckLinkConfigVideoInputConnection = 'vicn', - bmdDeckLinkConfigAnalogVideoInputFlags = 'avif', - bmdDeckLinkConfigVideoInputConversionMode = 'vicm', - bmdDeckLinkConfig32PulldownSequenceInitialTimecodeFrame = 'pdif', - bmdDeckLinkConfigVANCSourceLine1Mapping = 'vsl1', - bmdDeckLinkConfigVANCSourceLine2Mapping = 'vsl2', - bmdDeckLinkConfigVANCSourceLine3Mapping = 'vsl3', - bmdDeckLinkConfigCapturePassThroughMode = 'cptm', - bmdDeckLinkConfigCaptureGroup = 'cpgr', + bmdDeckLinkConfigVideoInputConnection = /* 'vicn' */ 0x7669636E, + bmdDeckLinkConfigAnalogVideoInputFlags = /* 'avif' */ 0x61766966, + bmdDeckLinkConfigVideoInputConversionMode = /* 'vicm' */ 0x7669636D, + bmdDeckLinkConfig32PulldownSequenceInitialTimecodeFrame = /* 'pdif' */ 0x70646966, + bmdDeckLinkConfigVANCSourceLine1Mapping = /* 'vsl1' */ 0x76736C31, + bmdDeckLinkConfigVANCSourceLine2Mapping = /* 'vsl2' */ 0x76736C32, + bmdDeckLinkConfigVANCSourceLine3Mapping = /* 'vsl3' */ 0x76736C33, + bmdDeckLinkConfigCapturePassThroughMode = /* 'cptm' */ 0x6370746D, + bmdDeckLinkConfigCaptureGroup = /* 'cpgr' */ 0x63706772, /* Video Input Floats */ - bmdDeckLinkConfigVideoInputComponentLumaGain = 'iclg', - bmdDeckLinkConfigVideoInputComponentChromaBlueGain = 'iccb', - bmdDeckLinkConfigVideoInputComponentChromaRedGain = 'iccr', - bmdDeckLinkConfigVideoInputCompositeLumaGain = 'iilg', - bmdDeckLinkConfigVideoInputCompositeChromaGain = 'iicg', - bmdDeckLinkConfigVideoInputSVideoLumaGain = 'islg', - bmdDeckLinkConfigVideoInputSVideoChromaGain = 'iscg', + bmdDeckLinkConfigVideoInputComponentLumaGain = /* 'iclg' */ 0x69636C67, + bmdDeckLinkConfigVideoInputComponentChromaBlueGain = /* 'iccb' */ 0x69636362, + bmdDeckLinkConfigVideoInputComponentChromaRedGain = /* 'iccr' */ 0x69636372, + bmdDeckLinkConfigVideoInputCompositeLumaGain = /* 'iilg' */ 0x69696C67, + bmdDeckLinkConfigVideoInputCompositeChromaGain = /* 'iicg' */ 0x69696367, + bmdDeckLinkConfigVideoInputSVideoLumaGain = /* 'islg' */ 0x69736C67, + bmdDeckLinkConfigVideoInputSVideoChromaGain = /* 'iscg' */ 0x69736367, + + /* Keying Integers */ + + bmdDeckLinkConfigInternalKeyingAncillaryDataSource = /* 'ikas' */ 0x696B6173, /* Audio Input Flags */ - bmdDeckLinkConfigMicrophonePhantomPower = 'mphp', + bmdDeckLinkConfigMicrophonePhantomPower = /* 'mphp' */ 0x6D706870, /* Audio Input Integers */ - bmdDeckLinkConfigAudioInputConnection = 'aicn', + bmdDeckLinkConfigAudioInputConnection = /* 'aicn' */ 0x6169636E, /* Audio Input Floats */ - bmdDeckLinkConfigAnalogAudioInputScaleChannel1 = 'ais1', - bmdDeckLinkConfigAnalogAudioInputScaleChannel2 = 'ais2', - bmdDeckLinkConfigAnalogAudioInputScaleChannel3 = 'ais3', - bmdDeckLinkConfigAnalogAudioInputScaleChannel4 = 'ais4', - bmdDeckLinkConfigDigitalAudioInputScale = 'dais', - bmdDeckLinkConfigMicrophoneInputGain = 'micg', + bmdDeckLinkConfigAnalogAudioInputScaleChannel1 = /* 'ais1' */ 0x61697331, + bmdDeckLinkConfigAnalogAudioInputScaleChannel2 = /* 'ais2' */ 0x61697332, + bmdDeckLinkConfigAnalogAudioInputScaleChannel3 = /* 'ais3' */ 0x61697333, + bmdDeckLinkConfigAnalogAudioInputScaleChannel4 = /* 'ais4' */ 0x61697334, + bmdDeckLinkConfigDigitalAudioInputScale = /* 'dais' */ 0x64616973, + bmdDeckLinkConfigMicrophoneInputGain = /* 'micg' */ 0x6D696367, /* Audio Output Integers */ - bmdDeckLinkConfigAudioOutputAESAnalogSwitch = 'aoaa', + bmdDeckLinkConfigAudioOutputAESAnalogSwitch = /* 'aoaa' */ 0x616F6161, /* Audio Output Floats */ - bmdDeckLinkConfigAnalogAudioOutputScaleChannel1 = 'aos1', - bmdDeckLinkConfigAnalogAudioOutputScaleChannel2 = 'aos2', - bmdDeckLinkConfigAnalogAudioOutputScaleChannel3 = 'aos3', - bmdDeckLinkConfigAnalogAudioOutputScaleChannel4 = 'aos4', - bmdDeckLinkConfigDigitalAudioOutputScale = 'daos', - bmdDeckLinkConfigHeadphoneVolume = 'hvol', + bmdDeckLinkConfigAnalogAudioOutputScaleChannel1 = /* 'aos1' */ 0x616F7331, + bmdDeckLinkConfigAnalogAudioOutputScaleChannel2 = /* 'aos2' */ 0x616F7332, + bmdDeckLinkConfigAnalogAudioOutputScaleChannel3 = /* 'aos3' */ 0x616F7333, + bmdDeckLinkConfigAnalogAudioOutputScaleChannel4 = /* 'aos4' */ 0x616F7334, + bmdDeckLinkConfigDigitalAudioOutputScale = /* 'daos' */ 0x64616F73, + bmdDeckLinkConfigHeadphoneVolume = /* 'hvol' */ 0x68766F6C, /* Device Information Strings */ - bmdDeckLinkConfigDeviceInformationLabel = 'dila', - bmdDeckLinkConfigDeviceInformationSerialNumber = 'disn', - bmdDeckLinkConfigDeviceInformationCompany = 'dico', - bmdDeckLinkConfigDeviceInformationPhone = 'diph', - bmdDeckLinkConfigDeviceInformationEmail = 'diem', - bmdDeckLinkConfigDeviceInformationDate = 'dida', + bmdDeckLinkConfigDeviceInformationLabel = /* 'dila' */ 0x64696C61, + bmdDeckLinkConfigDeviceInformationSerialNumber = /* 'disn' */ 0x6469736E, + bmdDeckLinkConfigDeviceInformationCompany = /* 'dico' */ 0x6469636F, + bmdDeckLinkConfigDeviceInformationPhone = /* 'diph' */ 0x64697068, + bmdDeckLinkConfigDeviceInformationEmail = /* 'diem' */ 0x6469656D, + bmdDeckLinkConfigDeviceInformationDate = /* 'dida' */ 0x64696461, /* Deck Control Integers */ - bmdDeckLinkConfigDeckControlConnection = 'dcco' + bmdDeckLinkConfigDeckControlConnection = /* 'dcco' */ 0x6463636F }; /* Enum BMDDeckLinkEncoderConfigurationID - DeckLink Encoder Configuration ID */ @@ -190,27 +190,29 @@ /* Video Encoder Integers */ - bmdDeckLinkEncoderConfigPreferredBitDepth = 'epbr', - bmdDeckLinkEncoderConfigFrameCodingMode = 'efcm', + bmdDeckLinkEncoderConfigPreferredBitDepth = /* 'epbr' */ 0x65706272, + bmdDeckLinkEncoderConfigFrameCodingMode = /* 'efcm' */ 0x6566636D, /* HEVC/H.265 Encoder Integers */ - bmdDeckLinkEncoderConfigH265TargetBitrate = 'htbr', + bmdDeckLinkEncoderConfigH265TargetBitrate = /* 'htbr' */ 0x68746272, /* DNxHR/DNxHD Compression ID */ - bmdDeckLinkEncoderConfigDNxHRCompressionID = 'dcid', + bmdDeckLinkEncoderConfigDNxHRCompressionID = /* 'dcid' */ 0x64636964, /* DNxHR/DNxHD Level */ - bmdDeckLinkEncoderConfigDNxHRLevel = 'dlev', + bmdDeckLinkEncoderConfigDNxHRLevel = /* 'dlev' */ 0x646C6576, /* Encoded Sample Decriptions */ - bmdDeckLinkEncoderConfigMPEG4SampleDescription = 'stsE', // Full MPEG4 sample description (aka SampleEntry of an 'stsd' atom-box). Useful for MediaFoundation, QuickTime, MKV and more - bmdDeckLinkEncoderConfigMPEG4CodecSpecificDesc = 'esds' // Sample description extensions only (atom stream, each with size and fourCC header). Useful for AVFoundation, VideoToolbox, MKV and more + bmdDeckLinkEncoderConfigMPEG4SampleDescription = /* 'stsE' */ 0x73747345, // Full MPEG4 sample description (aka SampleEntry of an 'stsd' atom-box). Useful for MediaFoundation, QuickTime, MKV and more + bmdDeckLinkEncoderConfigMPEG4CodecSpecificDesc = /* 'esds' */ 0x65736473 // Sample description extensions only (atom stream, each with size and fourCC header). Useful for AVFoundation, VideoToolbox, MKV and more }; +#if defined(__cplusplus) + // Forward Declarations class IDeckLinkConfiguration; @@ -222,13 +224,13 @@ { public: virtual HRESULT SetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ bool value) = 0; - virtual HRESULT GetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ bool* value) = 0; virtual HRESULT SetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ int64_t value) = 0; - virtual HRESULT GetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ int64_t* value) = 0; virtual HRESULT SetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value) = 0; - virtual HRESULT GetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double* value) = 0; virtual HRESULT SetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ CFStringRef value) = 0; - virtual HRESULT GetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ CFStringRef *value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ CFStringRef* value) = 0; virtual HRESULT WriteConfigurationToPreferences (void) = 0; protected: @@ -241,14 +243,14 @@ { public: virtual HRESULT SetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ bool value) = 0; - virtual HRESULT GetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ bool* value) = 0; virtual HRESULT SetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ int64_t value) = 0; - virtual HRESULT GetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ int64_t* value) = 0; virtual HRESULT SetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ double value) = 0; - virtual HRESULT GetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ double *value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ double* value) = 0; virtual HRESULT SetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ CFStringRef value) = 0; - virtual HRESULT GetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ CFStringRef *value) = 0; - virtual HRESULT GetBytes (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ void *buffer /* optional */, /* in, out */ uint32_t *bufferSize) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ CFStringRef* value) = 0; + virtual HRESULT GetBytes (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ void* buffer /* optional */, /* in, out */ uint32_t* bufferSize) = 0; protected: virtual ~IDeckLinkEncoderConfiguration () {} // call Release method to drop reference count @@ -262,4 +264,6 @@ } + +#endif /* defined(__cplusplus) */ #endif /* defined(BMD_DECKLINKAPICONFIGURATION_H) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/osx/DeckLinkAPIDeckControl.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/osx/DeckLinkAPIDeckControl.h
Changed
@@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2019 Blackmagic Design +** Copyright (c) 2021 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -7,14 +7,14 @@ ** execute, and transmit the Software, and to prepare derivative works of the ** Software, and to permit third-parties to whom the Software is furnished to ** do so, all subject to the following: -** +** ** The copyright notices in the Software and this entire statement, including ** the above license grant, this restriction and the following disclaimer, ** must be included in all copies of the Software, in whole or in part, and ** all derivative works of the Software, unless such copies or derivative ** works are solely in the form of machine-executable object code generated by ** a source language processor. -** +** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT @@ -46,49 +46,49 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLinkDeckControlStatusCallback = /* 53436FFB-B434-4906-BADC-AE3060FFE8EF */ {0x53,0x43,0x6F,0xFB,0xB4,0x34,0x49,0x06,0xBA,0xDC,0xAE,0x30,0x60,0xFF,0xE8,0xEF}; -BMD_CONST REFIID IID_IDeckLinkDeckControl = /* 8E1C3ACE-19C7-4E00-8B92-D80431D958BE */ {0x8E,0x1C,0x3A,0xCE,0x19,0xC7,0x4E,0x00,0x8B,0x92,0xD8,0x04,0x31,0xD9,0x58,0xBE}; +BMD_CONST REFIID IID_IDeckLinkDeckControlStatusCallback = /* 53436FFB-B434-4906-BADC-AE3060FFE8EF */ { 0x53,0x43,0x6F,0xFB,0xB4,0x34,0x49,0x06,0xBA,0xDC,0xAE,0x30,0x60,0xFF,0xE8,0xEF }; +BMD_CONST REFIID IID_IDeckLinkDeckControl = /* 8E1C3ACE-19C7-4E00-8B92-D80431D958BE */ { 0x8E,0x1C,0x3A,0xCE,0x19,0xC7,0x4E,0x00,0x8B,0x92,0xD8,0x04,0x31,0xD9,0x58,0xBE }; /* Enum BMDDeckControlMode - DeckControl mode */ typedef uint32_t BMDDeckControlMode; enum _BMDDeckControlMode { - bmdDeckControlNotOpened = 'ntop', - bmdDeckControlVTRControlMode = 'vtrc', - bmdDeckControlExportMode = 'expm', - bmdDeckControlCaptureMode = 'capm' + bmdDeckControlNotOpened = /* 'ntop' */ 0x6E746F70, + bmdDeckControlVTRControlMode = /* 'vtrc' */ 0x76747263, + bmdDeckControlExportMode = /* 'expm' */ 0x6578706D, + bmdDeckControlCaptureMode = /* 'capm' */ 0x6361706D }; /* Enum BMDDeckControlEvent - DeckControl event */ typedef uint32_t BMDDeckControlEvent; enum _BMDDeckControlEvent { - bmdDeckControlAbortedEvent = 'abte', // This event is triggered when a capture or edit-to-tape operation is aborted. + bmdDeckControlAbortedEvent = /* 'abte' */ 0x61627465, // This event is triggered when a capture or edit-to-tape operation is aborted. /* Export-To-Tape events */ - bmdDeckControlPrepareForExportEvent = 'pfee', // This event is triggered a few frames before reaching the in-point. IDeckLinkInput::StartScheduledPlayback() should be called at this point. - bmdDeckControlExportCompleteEvent = 'exce', // This event is triggered a few frames after reaching the out-point. At this point, it is safe to stop playback. + bmdDeckControlPrepareForExportEvent = /* 'pfee' */ 0x70666565, // This event is triggered a few frames before reaching the in-point. IDeckLinkInput::StartScheduledPlayback should be called at this point. + bmdDeckControlExportCompleteEvent = /* 'exce' */ 0x65786365, // This event is triggered a few frames after reaching the out-point. At this point, it is safe to stop playback. Upon reception of this event the deck's control mode is set back to bmdDeckControlVTRControlMode. /* Capture events */ - bmdDeckControlPrepareForCaptureEvent = 'pfce', // This event is triggered a few frames before reaching the in-point. The serial timecode attached to IDeckLinkVideoInputFrames is now valid. - bmdDeckControlCaptureCompleteEvent = 'ccev' // This event is triggered a few frames after reaching the out-point. + bmdDeckControlPrepareForCaptureEvent = /* 'pfce' */ 0x70666365, // This event is triggered a few frames before reaching the in-point. The serial timecode attached to IDeckLinkVideoInputFrames is now valid. + bmdDeckControlCaptureCompleteEvent = /* 'ccev' */ 0x63636576 // This event is triggered a few frames after reaching the out-point. Upon reception of this event the deck's control mode is set back to bmdDeckControlVTRControlMode. }; /* Enum BMDDeckControlVTRControlState - VTR Control state */ typedef uint32_t BMDDeckControlVTRControlState; enum _BMDDeckControlVTRControlState { - bmdDeckControlNotInVTRControlMode = 'nvcm', - bmdDeckControlVTRControlPlaying = 'vtrp', - bmdDeckControlVTRControlRecording = 'vtrr', - bmdDeckControlVTRControlStill = 'vtra', - bmdDeckControlVTRControlShuttleForward = 'vtsf', - bmdDeckControlVTRControlShuttleReverse = 'vtsr', - bmdDeckControlVTRControlJogForward = 'vtjf', - bmdDeckControlVTRControlJogReverse = 'vtjr', - bmdDeckControlVTRControlStopped = 'vtro' + bmdDeckControlNotInVTRControlMode = /* 'nvcm' */ 0x6E76636D, + bmdDeckControlVTRControlPlaying = /* 'vtrp' */ 0x76747270, + bmdDeckControlVTRControlRecording = /* 'vtrr' */ 0x76747272, + bmdDeckControlVTRControlStill = /* 'vtra' */ 0x76747261, + bmdDeckControlVTRControlShuttleForward = /* 'vtsf' */ 0x76747366, + bmdDeckControlVTRControlShuttleReverse = /* 'vtsr' */ 0x76747372, + bmdDeckControlVTRControlJogForward = /* 'vtjf' */ 0x76746A66, + bmdDeckControlVTRControlJogReverse = /* 'vtjr' */ 0x76746A72, + bmdDeckControlVTRControlStopped = /* 'vtro' */ 0x7674726F }; /* Enum BMDDeckControlStatusFlags - Deck Control status flags */ @@ -128,24 +128,26 @@ typedef uint32_t BMDDeckControlError; enum _BMDDeckControlError { - bmdDeckControlNoError = 'noer', - bmdDeckControlModeError = 'moer', - bmdDeckControlMissedInPointError = 'mier', - bmdDeckControlDeckTimeoutError = 'dter', - bmdDeckControlCommandFailedError = 'cfer', - bmdDeckControlDeviceAlreadyOpenedError = 'dalo', - bmdDeckControlFailedToOpenDeviceError = 'fder', - bmdDeckControlInLocalModeError = 'lmer', - bmdDeckControlEndOfTapeError = 'eter', - bmdDeckControlUserAbortError = 'uaer', - bmdDeckControlNoTapeInDeckError = 'nter', - bmdDeckControlNoVideoFromCardError = 'nvfc', - bmdDeckControlNoCommunicationError = 'ncom', - bmdDeckControlBufferTooSmallError = 'btsm', - bmdDeckControlBadChecksumError = 'chks', - bmdDeckControlUnknownError = 'uner' + bmdDeckControlNoError = /* 'noer' */ 0x6E6F6572, + bmdDeckControlModeError = /* 'moer' */ 0x6D6F6572, + bmdDeckControlMissedInPointError = /* 'mier' */ 0x6D696572, + bmdDeckControlDeckTimeoutError = /* 'dter' */ 0x64746572, + bmdDeckControlCommandFailedError = /* 'cfer' */ 0x63666572, + bmdDeckControlDeviceAlreadyOpenedError = /* 'dalo' */ 0x64616C6F, + bmdDeckControlFailedToOpenDeviceError = /* 'fder' */ 0x66646572, + bmdDeckControlInLocalModeError = /* 'lmer' */ 0x6C6D6572, + bmdDeckControlEndOfTapeError = /* 'eter' */ 0x65746572, + bmdDeckControlUserAbortError = /* 'uaer' */ 0x75616572, + bmdDeckControlNoTapeInDeckError = /* 'nter' */ 0x6E746572, + bmdDeckControlNoVideoFromCardError = /* 'nvfc' */ 0x6E766663, + bmdDeckControlNoCommunicationError = /* 'ncom' */ 0x6E636F6D, + bmdDeckControlBufferTooSmallError = /* 'btsm' */ 0x6274736D, + bmdDeckControlBadChecksumError = /* 'chks' */ 0x63686B73, + bmdDeckControlUnknownError = /* 'uner' */ 0x756E6572 }; +#if defined(__cplusplus) + // Forward Declarations class IDeckLinkDeckControlStatusCallback; @@ -170,39 +172,39 @@ class BMD_PUBLIC IDeckLinkDeckControl : public IUnknown { public: - virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError* error) = 0; virtual HRESULT Close (/* in */ bool standbyOn) = 0; - virtual HRESULT GetCurrentState (/* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags) = 0; + virtual HRESULT GetCurrentState (/* out */ BMDDeckControlMode* mode, /* out */ BMDDeckControlVTRControlState* vtrControlState, /* out */ BMDDeckControlStatusFlags* flags) = 0; virtual HRESULT SetStandby (/* in */ bool standbyOn) = 0; - virtual HRESULT SendCommand (/* in */ uint8_t *inBuffer, /* in */ uint32_t inBufferSize, /* out */ uint8_t *outBuffer, /* out */ uint32_t *outDataSize, /* in */ uint32_t outBufferSize, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT Play (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT Stop (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT TogglePlayStop (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT Eject (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT GoToTimecode (/* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT FastForward (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT Rewind (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT StepForward (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT StepBack (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT Jog (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT Shuttle (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT GetTimecodeString (/* out */ CFStringRef *currentTimeCode, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT GetTimecode (/* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT GetTimecodeBCD (/* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT SendCommand (/* in */ uint8_t* inBuffer, /* in */ uint32_t inBufferSize, /* out */ uint8_t* outBuffer, /* out */ uint32_t* outDataSize, /* in */ uint32_t outBufferSize, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT Play (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT Stop (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT TogglePlayStop (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT Eject (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT GoToTimecode (/* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT FastForward (/* in */ bool viewTape, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT Rewind (/* in */ bool viewTape, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT StepForward (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT StepBack (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT Jog (/* in */ double rate, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT Shuttle (/* in */ double rate, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT GetTimecodeString (/* out */ CFStringRef* currentTimeCode, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT GetTimecode (/* out */ IDeckLinkTimecode** currentTimecode, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT GetTimecodeBCD (/* out */ BMDTimecodeBCD* currentTimecode, /* out */ BMDDeckControlError* error) = 0; virtual HRESULT SetPreroll (/* in */ uint32_t prerollSeconds) = 0; - virtual HRESULT GetPreroll (/* out */ uint32_t *prerollSeconds) = 0; + virtual HRESULT GetPreroll (/* out */ uint32_t* prerollSeconds) = 0; virtual HRESULT SetExportOffset (/* in */ int32_t exportOffsetFields) = 0; - virtual HRESULT GetExportOffset (/* out */ int32_t *exportOffsetFields) = 0; - virtual HRESULT GetManualExportOffset (/* out */ int32_t *deckManualExportOffsetFields) = 0; + virtual HRESULT GetExportOffset (/* out */ int32_t* exportOffsetFields) = 0; + virtual HRESULT GetManualExportOffset (/* out */ int32_t* deckManualExportOffsetFields) = 0; virtual HRESULT SetCaptureOffset (/* in */ int32_t captureOffsetFields) = 0; - virtual HRESULT GetCaptureOffset (/* out */ int32_t *captureOffsetFields) = 0; - virtual HRESULT StartExport (/* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT StartCapture (/* in */ bool useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error) = 0; - virtual HRESULT GetDeviceID (/* out */ uint16_t *deviceId, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetCaptureOffset (/* out */ int32_t* captureOffsetFields) = 0; + virtual HRESULT StartExport (/* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT StartCapture (/* in */ bool useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError* error) = 0; + virtual HRESULT GetDeviceID (/* out */ uint16_t* deviceId, /* out */ BMDDeckControlError* error) = 0; virtual HRESULT Abort (void) = 0; - virtual HRESULT CrashRecordStart (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT CrashRecordStop (/* out */ BMDDeckControlError *error) = 0; - virtual HRESULT SetCallback (/* in */ IDeckLinkDeckControlStatusCallback *callback) = 0; + virtual HRESULT CrashRecordStart (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT CrashRecordStop (/* out */ BMDDeckControlError* error) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkDeckControlStatusCallback* callback) = 0; protected: virtual ~IDeckLinkDeckControl () {} // call Release method to drop reference count @@ -216,4 +218,6 @@ } + +#endif /* defined(__cplusplus) */ #endif /* defined(BMD_DECKLINKAPIDECKCONTROL_H) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/osx/DeckLinkAPIDiscovery.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/osx/DeckLinkAPIDiscovery.h
Changed
@@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2019 Blackmagic Design +** Copyright (c) 2021 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -7,14 +7,14 @@ ** execute, and transmit the Software, and to prepare derivative works of the ** Software, and to permit third-parties to whom the Software is furnished to ** do so, all subject to the following: -** +** ** The copyright notices in the Software and this entire statement, including ** the above license grant, this restriction and the following disclaimer, ** must be included in all copies of the Software, in whole or in part, and ** all derivative works of the Software, unless such copies or derivative ** works are solely in the form of machine-executable object code generated by ** a source language processor. -** +** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT @@ -46,19 +46,21 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLink = /* C418FBDD-0587-48ED-8FE5-640F0A14AF91 */ {0xC4,0x18,0xFB,0xDD,0x05,0x87,0x48,0xED,0x8F,0xE5,0x64,0x0F,0x0A,0x14,0xAF,0x91}; +BMD_CONST REFIID IID_IDeckLink = /* C418FBDD-0587-48ED-8FE5-640F0A14AF91 */ { 0xC4,0x18,0xFB,0xDD,0x05,0x87,0x48,0xED,0x8F,0xE5,0x64,0x0F,0x0A,0x14,0xAF,0x91 }; + +#if defined(__cplusplus) // Forward Declarations class IDeckLink; -/* Interface IDeckLink - represents a DeckLink device */ +/* Interface IDeckLink - Represents a DeckLink device */ class BMD_PUBLIC IDeckLink : public IUnknown { public: - virtual HRESULT GetModelName (/* out */ CFStringRef *modelName) = 0; - virtual HRESULT GetDisplayName (/* out */ CFStringRef *displayName) = 0; + virtual HRESULT GetModelName (/* out */ CFStringRef* modelName) = 0; + virtual HRESULT GetDisplayName (/* out */ CFStringRef* displayName) = 0; protected: virtual ~IDeckLink () {} // call Release method to drop reference count @@ -72,4 +74,6 @@ } + +#endif /* defined(__cplusplus) */ #endif /* defined(BMD_DECKLINKAPIDISCOVERY_H) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/osx/DeckLinkAPIDispatch.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/osx/DeckLinkAPIDispatch.cpp
Changed
@@ -1,27 +1,40 @@ /* -LICENSE-START- ** Copyright (c) 2009 Blackmagic Design -** -** Permission is hereby granted, free of charge, to any person or organization -** obtaining a copy of the software and accompanying documentation covered by -** this license (the "Software") to use, reproduce, display, distribute, -** execute, and transmit the Software, and to prepare derivative works of the -** Software, and to permit third-parties to whom the Software is furnished to -** do so, all subject to the following: -** -** The copyright notices in the Software and this entire statement, including -** the above license grant, this restriction and the following disclaimer, -** must be included in all copies of the Software, in whole or in part, and -** all derivative works of the Software, unless such copies or derivative -** works are solely in the form of machine-executable object code generated by -** a source language processor. -** -** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation (the +** "Software") to use, reproduce, display, distribute, sub-license, execute, +** and transmit the Software, and to prepare derivative works of the Software, +** and to permit third-parties to whom the Software is furnished to do so, in +** accordance with: +** +** (1) if the Software is obtained from Blackmagic Design, the End User License +** Agreement for the Software Development Kit (“EULA”) available at +** https://www.blackmagicdesign.com/EULA/DeckLinkSDK; or +** +** (2) if the Software is obtained from any third party, such licensing terms +** as notified by that third party, +** +** and all subject to the following: +** +** (3) the copyright notices in the Software and this entire statement, +** including the above license grant, this restriction and the following +** disclaimer, must be included in all copies of the Software, in whole or in +** part, and all derivative works of the Software, unless such copies or +** derivative works are solely in the form of machine-executable object code +** generated by a source language processor. +** +** (4) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ** DEALINGS IN THE SOFTWARE. +** +** A copy of the Software is available free of charge at +** https://www.blackmagicdesign.com/desktopvideo_sdk under the EULA. +** ** -LICENSE-END- */ /* DeckLinkAPIDispatch.cpp */ @@ -77,84 +90,82 @@ } } -#if 0 bool IsDeckLinkAPIPresent (void) { // If the DeckLink API bundle was successfully loaded, return this knowledge to the caller if (gDeckLinkAPIBundleRef != NULL) return true; - + return false; } -#endif IDeckLinkIterator* CreateDeckLinkIteratorInstance (void) { pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); - + if (gCreateIteratorFunc == NULL) return NULL; - + return gCreateIteratorFunc(); } IDeckLinkAPIInformation* CreateDeckLinkAPIInformationInstance (void) { pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); - + if (gCreateAPIInformationFunc == NULL) return NULL; - + return gCreateAPIInformationFunc(); } IDeckLinkGLScreenPreviewHelper* CreateOpenGLScreenPreviewHelper (void) { pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); - + if (gCreateOpenGLPreviewFunc == NULL) return NULL; - + return gCreateOpenGLPreviewFunc(); } IDeckLinkCocoaScreenPreviewCallback* CreateCocoaScreenPreview (void* parentView) { pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); - + if (gCreateCocoaPreviewFunc == NULL) return NULL; - + return gCreateCocoaPreviewFunc(parentView); } IDeckLinkVideoConversion* CreateVideoConversionInstance (void) { pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); - + if (gCreateVideoConversionFunc == NULL) return NULL; - + return gCreateVideoConversionFunc(); } IDeckLinkDiscovery* CreateDeckLinkDiscoveryInstance (void) { pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); - + if (gCreateDeckLinkDiscoveryFunc == NULL) return NULL; - + return gCreateDeckLinkDiscoveryFunc(); } IDeckLinkVideoFrameAncillaryPackets* CreateVideoFrameAncillaryPacketsInstance (void) { pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); - + if (gCreateVideoFrameAncillaryPacketsFunc == NULL) return NULL; - + return gCreateVideoFrameAncillaryPacketsFunc(); }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/osx/DeckLinkAPIModes.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/osx/DeckLinkAPIModes.h
Changed
@@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2019 Blackmagic Design +** Copyright (c) 2021 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -7,14 +7,14 @@ ** execute, and transmit the Software, and to prepare derivative works of the ** Software, and to permit third-parties to whom the Software is furnished to ** do so, all subject to the following: -** +** ** The copyright notices in the Software and this entire statement, including ** the above license grant, this restriction and the following disclaimer, ** must be included in all copies of the Software, in whole or in part, and ** all derivative works of the Software, unless such copies or derivative ** works are solely in the form of machine-executable object code generated by ** a source language processor. -** +** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT @@ -46,173 +46,168 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLinkDisplayModeIterator = /* 9C88499F-F601-4021-B80B-032E4EB41C35 */ {0x9C,0x88,0x49,0x9F,0xF6,0x01,0x40,0x21,0xB8,0x0B,0x03,0x2E,0x4E,0xB4,0x1C,0x35}; -BMD_CONST REFIID IID_IDeckLinkDisplayMode = /* 3EB2C1AB-0A3D-4523-A3AD-F40D7FB14E78 */ {0x3E,0xB2,0xC1,0xAB,0x0A,0x3D,0x45,0x23,0xA3,0xAD,0xF4,0x0D,0x7F,0xB1,0x4E,0x78}; +BMD_CONST REFIID IID_IDeckLinkDisplayModeIterator = /* 9C88499F-F601-4021-B80B-032E4EB41C35 */ { 0x9C,0x88,0x49,0x9F,0xF6,0x01,0x40,0x21,0xB8,0x0B,0x03,0x2E,0x4E,0xB4,0x1C,0x35 }; +BMD_CONST REFIID IID_IDeckLinkDisplayMode = /* 3EB2C1AB-0A3D-4523-A3AD-F40D7FB14E78 */ { 0x3E,0xB2,0xC1,0xAB,0x0A,0x3D,0x45,0x23,0xA3,0xAD,0xF4,0x0D,0x7F,0xB1,0x4E,0x78 }; -/* Enum BMDDisplayMode - Video display modes */ +/* Enum BMDDisplayMode - BMDDisplayMode enumerates the video modes supported. */ typedef uint32_t BMDDisplayMode; enum _BMDDisplayMode { /* SD Modes */ - bmdModeNTSC = 'ntsc', - bmdModeNTSC2398 = 'nt23', // 3:2 pulldown - bmdModePAL = 'pal ', - bmdModeNTSCp = 'ntsp', - bmdModePALp = 'palp', + bmdModeNTSC = /* 'ntsc' */ 0x6E747363, + bmdModeNTSC2398 = /* 'nt23' */ 0x6E743233, // 3:2 pulldown + bmdModePAL = /* 'pal ' */ 0x70616C20, + bmdModeNTSCp = /* 'ntsp' */ 0x6E747370, + bmdModePALp = /* 'palp' */ 0x70616C70, /* HD 1080 Modes */ - bmdModeHD1080p2398 = '23ps', - bmdModeHD1080p24 = '24ps', - bmdModeHD1080p25 = 'Hp25', - bmdModeHD1080p2997 = 'Hp29', - bmdModeHD1080p30 = 'Hp30', - bmdModeHD1080p4795 = 'Hp47', - bmdModeHD1080p48 = 'Hp48', - bmdModeHD1080p50 = 'Hp50', - bmdModeHD1080p5994 = 'Hp59', - bmdModeHD1080p6000 = 'Hp60', // N.B. This _really_ is 60.00 Hz. - bmdModeHD1080p9590 = 'Hp95', - bmdModeHD1080p96 = 'Hp96', - bmdModeHD1080p100 = 'Hp10', - bmdModeHD1080p11988 = 'Hp11', - bmdModeHD1080p120 = 'Hp12', - bmdModeHD1080i50 = 'Hi50', - bmdModeHD1080i5994 = 'Hi59', - bmdModeHD1080i6000 = 'Hi60', // N.B. This _really_ is 60.00 Hz. + bmdModeHD1080p2398 = /* '23ps' */ 0x32337073, + bmdModeHD1080p24 = /* '24ps' */ 0x32347073, + bmdModeHD1080p25 = /* 'Hp25' */ 0x48703235, + bmdModeHD1080p2997 = /* 'Hp29' */ 0x48703239, + bmdModeHD1080p30 = /* 'Hp30' */ 0x48703330, + bmdModeHD1080p4795 = /* 'Hp47' */ 0x48703437, + bmdModeHD1080p48 = /* 'Hp48' */ 0x48703438, + bmdModeHD1080p50 = /* 'Hp50' */ 0x48703530, + bmdModeHD1080p5994 = /* 'Hp59' */ 0x48703539, + bmdModeHD1080p6000 = /* 'Hp60' */ 0x48703630, // N.B. This _really_ is 60.00 Hz. + bmdModeHD1080p9590 = /* 'Hp95' */ 0x48703935, + bmdModeHD1080p96 = /* 'Hp96' */ 0x48703936, + bmdModeHD1080p100 = /* 'Hp10' */ 0x48703130, + bmdModeHD1080p11988 = /* 'Hp11' */ 0x48703131, + bmdModeHD1080p120 = /* 'Hp12' */ 0x48703132, + bmdModeHD1080i50 = /* 'Hi50' */ 0x48693530, + bmdModeHD1080i5994 = /* 'Hi59' */ 0x48693539, + bmdModeHD1080i6000 = /* 'Hi60' */ 0x48693630, // N.B. This _really_ is 60.00 Hz. /* HD 720 Modes */ - bmdModeHD720p50 = 'hp50', - bmdModeHD720p5994 = 'hp59', - bmdModeHD720p60 = 'hp60', + bmdModeHD720p50 = /* 'hp50' */ 0x68703530, + bmdModeHD720p5994 = /* 'hp59' */ 0x68703539, + bmdModeHD720p60 = /* 'hp60' */ 0x68703630, /* 2K Modes */ - bmdMode2k2398 = '2k23', - bmdMode2k24 = '2k24', - bmdMode2k25 = '2k25', + bmdMode2k2398 = /* '2k23' */ 0x326B3233, + bmdMode2k24 = /* '2k24' */ 0x326B3234, + bmdMode2k25 = /* '2k25' */ 0x326B3235, /* 2K DCI Modes */ - bmdMode2kDCI2398 = '2d23', - bmdMode2kDCI24 = '2d24', - bmdMode2kDCI25 = '2d25', - bmdMode2kDCI2997 = '2d29', - bmdMode2kDCI30 = '2d30', - bmdMode2kDCI4795 = '2d47', - bmdMode2kDCI48 = '2d48', - bmdMode2kDCI50 = '2d50', - bmdMode2kDCI5994 = '2d59', - bmdMode2kDCI60 = '2d60', - bmdMode2kDCI9590 = '2d95', - bmdMode2kDCI96 = '2d96', - bmdMode2kDCI100 = '2d10', - bmdMode2kDCI11988 = '2d11', - bmdMode2kDCI120 = '2d12', + bmdMode2kDCI2398 = /* '2d23' */ 0x32643233, + bmdMode2kDCI24 = /* '2d24' */ 0x32643234, + bmdMode2kDCI25 = /* '2d25' */ 0x32643235, + bmdMode2kDCI2997 = /* '2d29' */ 0x32643239, + bmdMode2kDCI30 = /* '2d30' */ 0x32643330, + bmdMode2kDCI4795 = /* '2d47' */ 0x32643437, + bmdMode2kDCI48 = /* '2d48' */ 0x32643438, + bmdMode2kDCI50 = /* '2d50' */ 0x32643530, + bmdMode2kDCI5994 = /* '2d59' */ 0x32643539, + bmdMode2kDCI60 = /* '2d60' */ 0x32643630, + bmdMode2kDCI9590 = /* '2d95' */ 0x32643935, + bmdMode2kDCI96 = /* '2d96' */ 0x32643936, + bmdMode2kDCI100 = /* '2d10' */ 0x32643130, + bmdMode2kDCI11988 = /* '2d11' */ 0x32643131, + bmdMode2kDCI120 = /* '2d12' */ 0x32643132, /* 4K UHD Modes */ - bmdMode4K2160p2398 = '4k23', - bmdMode4K2160p24 = '4k24', - bmdMode4K2160p25 = '4k25', - bmdMode4K2160p2997 = '4k29', - bmdMode4K2160p30 = '4k30', - bmdMode4K2160p4795 = '4k47', - bmdMode4K2160p48 = '4k48', - bmdMode4K2160p50 = '4k50', - bmdMode4K2160p5994 = '4k59', - bmdMode4K2160p60 = '4k60', - bmdMode4K2160p9590 = '4k95', - bmdMode4K2160p96 = '4k96', - bmdMode4K2160p100 = '4k10', - bmdMode4K2160p11988 = '4k11', - bmdMode4K2160p120 = '4k12', + bmdMode4K2160p2398 = /* '4k23' */ 0x346B3233, + bmdMode4K2160p24 = /* '4k24' */ 0x346B3234, + bmdMode4K2160p25 = /* '4k25' */ 0x346B3235, + bmdMode4K2160p2997 = /* '4k29' */ 0x346B3239, + bmdMode4K2160p30 = /* '4k30' */ 0x346B3330, + bmdMode4K2160p4795 = /* '4k47' */ 0x346B3437, + bmdMode4K2160p48 = /* '4k48' */ 0x346B3438, + bmdMode4K2160p50 = /* '4k50' */ 0x346B3530, + bmdMode4K2160p5994 = /* '4k59' */ 0x346B3539, + bmdMode4K2160p60 = /* '4k60' */ 0x346B3630, + bmdMode4K2160p9590 = /* '4k95' */ 0x346B3935, + bmdMode4K2160p96 = /* '4k96' */ 0x346B3936, + bmdMode4K2160p100 = /* '4k10' */ 0x346B3130, + bmdMode4K2160p11988 = /* '4k11' */ 0x346B3131, + bmdMode4K2160p120 = /* '4k12' */ 0x346B3132, /* 4K DCI Modes */ - bmdMode4kDCI2398 = '4d23', - bmdMode4kDCI24 = '4d24', - bmdMode4kDCI25 = '4d25', - bmdMode4kDCI2997 = '4d29', - bmdMode4kDCI30 = '4d30', - bmdMode4kDCI4795 = '4d47', - bmdMode4kDCI48 = '4d48', - bmdMode4kDCI50 = '4d50', - bmdMode4kDCI5994 = '4d59', - bmdMode4kDCI60 = '4d60', - bmdMode4kDCI9590 = '4d95', - bmdMode4kDCI96 = '4d96', - bmdMode4kDCI100 = '4d10', - bmdMode4kDCI11988 = '4d11', - bmdMode4kDCI120 = '4d12', + bmdMode4kDCI2398 = /* '4d23' */ 0x34643233, + bmdMode4kDCI24 = /* '4d24' */ 0x34643234, + bmdMode4kDCI25 = /* '4d25' */ 0x34643235, + bmdMode4kDCI2997 = /* '4d29' */ 0x34643239, + bmdMode4kDCI30 = /* '4d30' */ 0x34643330, + bmdMode4kDCI4795 = /* '4d47' */ 0x34643437, + bmdMode4kDCI48 = /* '4d48' */ 0x34643438, + bmdMode4kDCI50 = /* '4d50' */ 0x34643530, + bmdMode4kDCI5994 = /* '4d59' */ 0x34643539, + bmdMode4kDCI60 = /* '4d60' */ 0x34643630, + bmdMode4kDCI9590 = /* '4d95' */ 0x34643935, + bmdMode4kDCI96 = /* '4d96' */ 0x34643936, + bmdMode4kDCI100 = /* '4d10' */ 0x34643130, + bmdMode4kDCI11988 = /* '4d11' */ 0x34643131, + bmdMode4kDCI120 = /* '4d12' */ 0x34643132, /* 8K UHD Modes */ - bmdMode8K4320p2398 = '8k23', - bmdMode8K4320p24 = '8k24', - bmdMode8K4320p25 = '8k25', - bmdMode8K4320p2997 = '8k29', - bmdMode8K4320p30 = '8k30', - bmdMode8K4320p4795 = '8k47', - bmdMode8K4320p48 = '8k48', - bmdMode8K4320p50 = '8k50', - bmdMode8K4320p5994 = '8k59', - bmdMode8K4320p60 = '8k60', + bmdMode8K4320p2398 = /* '8k23' */ 0x386B3233, + bmdMode8K4320p24 = /* '8k24' */ 0x386B3234, + bmdMode8K4320p25 = /* '8k25' */ 0x386B3235, + bmdMode8K4320p2997 = /* '8k29' */ 0x386B3239, + bmdMode8K4320p30 = /* '8k30' */ 0x386B3330, + bmdMode8K4320p4795 = /* '8k47' */ 0x386B3437, + bmdMode8K4320p48 = /* '8k48' */ 0x386B3438, + bmdMode8K4320p50 = /* '8k50' */ 0x386B3530, + bmdMode8K4320p5994 = /* '8k59' */ 0x386B3539, + bmdMode8K4320p60 = /* '8k60' */ 0x386B3630, /* 8K DCI Modes */ - bmdMode8kDCI2398 = '8d23', - bmdMode8kDCI24 = '8d24', - bmdMode8kDCI25 = '8d25', - bmdMode8kDCI2997 = '8d29', - bmdMode8kDCI30 = '8d30', - bmdMode8kDCI4795 = '8d47', - bmdMode8kDCI48 = '8d48', - bmdMode8kDCI50 = '8d50', - bmdMode8kDCI5994 = '8d59', - bmdMode8kDCI60 = '8d60', + bmdMode8kDCI2398 = /* '8d23' */ 0x38643233, + bmdMode8kDCI24 = /* '8d24' */ 0x38643234, + bmdMode8kDCI25 = /* '8d25' */ 0x38643235, + bmdMode8kDCI2997 = /* '8d29' */ 0x38643239, + bmdMode8kDCI30 = /* '8d30' */ 0x38643330, + bmdMode8kDCI4795 = /* '8d47' */ 0x38643437, + bmdMode8kDCI48 = /* '8d48' */ 0x38643438, + bmdMode8kDCI50 = /* '8d50' */ 0x38643530, + bmdMode8kDCI5994 = /* '8d59' */ 0x38643539, + bmdMode8kDCI60 = /* '8d60' */ 0x38643630, /* PC Modes */ - bmdMode640x480p60 = 'vga6', - bmdMode800x600p60 = 'svg6', - bmdMode1440x900p50 = 'wxg5', - bmdMode1440x900p60 = 'wxg6', - bmdMode1440x1080p50 = 'sxg5', - bmdMode1440x1080p60 = 'sxg6', - bmdMode1600x1200p50 = 'uxg5', - bmdMode1600x1200p60 = 'uxg6', - bmdMode1920x1200p50 = 'wux5', - bmdMode1920x1200p60 = 'wux6', - bmdMode1920x1440p50 = '1945', - bmdMode1920x1440p60 = '1946', - bmdMode2560x1440p50 = 'wqh5', - bmdMode2560x1440p60 = 'wqh6', - bmdMode2560x1600p50 = 'wqx5', - bmdMode2560x1600p60 = 'wqx6', - - /* RAW Modes for Cintel (input only) */ - - bmdModeCintelRAW = 'rwci', // Frame size up to 4096x3072, variable frame rate - bmdModeCintelCompressedRAW = 'rwcc', // Frame size up to 4096x3072, variable frame rate + bmdMode640x480p60 = /* 'vga6' */ 0x76676136, + bmdMode800x600p60 = /* 'svg6' */ 0x73766736, + bmdMode1440x900p50 = /* 'wxg5' */ 0x77786735, + bmdMode1440x900p60 = /* 'wxg6' */ 0x77786736, + bmdMode1440x1080p50 = /* 'sxg5' */ 0x73786735, + bmdMode1440x1080p60 = /* 'sxg6' */ 0x73786736, + bmdMode1600x1200p50 = /* 'uxg5' */ 0x75786735, + bmdMode1600x1200p60 = /* 'uxg6' */ 0x75786736, + bmdMode1920x1200p50 = /* 'wux5' */ 0x77757835, + bmdMode1920x1200p60 = /* 'wux6' */ 0x77757836, + bmdMode1920x1440p50 = /* '1945' */ 0x31393435, + bmdMode1920x1440p60 = /* '1946' */ 0x31393436, + bmdMode2560x1440p50 = /* 'wqh5' */ 0x77716835, + bmdMode2560x1440p60 = /* 'wqh6' */ 0x77716836, + bmdMode2560x1600p50 = /* 'wqx5' */ 0x77717835, + bmdMode2560x1600p60 = /* 'wqx6' */ 0x77717836, /* Special Modes */ - bmdModeUnknown = 'iunk' + bmdModeUnknown = /* 'iunk' */ 0x69756E6B }; -/* Enum BMDFieldDominance - Video field dominance */ +/* Enum BMDFieldDominance - BMDFieldDominance enumerates settings applicable to video fields. */ typedef uint32_t BMDFieldDominance; enum _BMDFieldDominance { bmdUnknownFieldDominance = 0, - bmdLowerFieldFirst = 'lowr', - bmdUpperFieldFirst = 'uppr', - bmdProgressiveFrame = 'prog', - bmdProgressiveSegmentedFrame = 'psf ' + bmdLowerFieldFirst = /* 'lowr' */ 0x6C6F7772, + bmdUpperFieldFirst = /* 'uppr' */ 0x75707072, + bmdProgressiveFrame = /* 'prog' */ 0x70726F67, + bmdProgressiveSegmentedFrame = /* 'psf ' */ 0x70736620 }; /* Enum BMDPixelFormat - Video pixel formats supported for output/input */ @@ -220,25 +215,20 @@ typedef uint32_t BMDPixelFormat; enum _BMDPixelFormat { bmdFormatUnspecified = 0, - bmdFormat8BitYUV = '2vuy', - bmdFormat10BitYUV = 'v210', + bmdFormat8BitYUV = /* '2vuy' */ 0x32767579, + bmdFormat10BitYUV = /* 'v210' */ 0x76323130, bmdFormat8BitARGB = 32, - bmdFormat8BitBGRA = 'BGRA', - bmdFormat10BitRGB = 'r210', // Big-endian RGB 10-bit per component with SMPTE video levels (64-960). Packed as 2:10:10:10 - bmdFormat12BitRGB = 'R12B', // Big-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component - bmdFormat12BitRGBLE = 'R12L', // Little-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component - bmdFormat10BitRGBXLE = 'R10l', // Little-endian 10-bit RGB with SMPTE video levels (64-940) - bmdFormat10BitRGBX = 'R10b', // Big-endian 10-bit RGB with SMPTE video levels (64-940) - bmdFormatH265 = 'hev1', // High Efficiency Video Coding (HEVC/h.265) + bmdFormat8BitBGRA = /* 'BGRA' */ 0x42475241, + bmdFormat10BitRGB = /* 'r210' */ 0x72323130, // Big-endian RGB 10-bit per component with SMPTE video levels (64-960). Packed as 2:10:10:10 + bmdFormat12BitRGB = /* 'R12B' */ 0x52313242, // Big-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component + bmdFormat12BitRGBLE = /* 'R12L' */ 0x5231324C, // Little-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component + bmdFormat10BitRGBXLE = /* 'R10l' */ 0x5231306C, // Little-endian 10-bit RGB with SMPTE video levels (64-940) + bmdFormat10BitRGBX = /* 'R10b' */ 0x52313062, // Big-endian 10-bit RGB with SMPTE video levels (64-940) + bmdFormatH265 = /* 'hev1' */ 0x68657631, // High Efficiency Video Coding (HEVC/h.265) /* AVID DNxHR */ - bmdFormatDNxHR = 'AVdh', - - /* Cintel formats */ - - bmdFormat12BitRAWGRBG = 'r12p', // 12-bit RAW data for bayer pattern GRBG - bmdFormat12BitRAWJPEG = 'r16p' // 12-bit RAW data arranged in tiles and JPEG compressed + bmdFormatDNxHR = /* 'AVdh' */ 0x41566468 }; /* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */ @@ -251,32 +241,34 @@ bmdDisplayModeColorspaceRec2020 = 1 << 3 }; +#if defined(__cplusplus) + // Forward Declarations class IDeckLinkDisplayModeIterator; class IDeckLinkDisplayMode; -/* Interface IDeckLinkDisplayModeIterator - enumerates over supported input/output display modes. */ +/* Interface IDeckLinkDisplayModeIterator - Enumerates over supported input/output display modes. */ class BMD_PUBLIC IDeckLinkDisplayModeIterator : public IUnknown { public: - virtual HRESULT Next (/* out */ IDeckLinkDisplayMode **deckLinkDisplayMode) = 0; + virtual HRESULT Next (/* out */ IDeckLinkDisplayMode** deckLinkDisplayMode) = 0; protected: virtual ~IDeckLinkDisplayModeIterator () {} // call Release method to drop reference count }; -/* Interface IDeckLinkDisplayMode - represents a display mode */ +/* Interface IDeckLinkDisplayMode - Represents a display mode */ class BMD_PUBLIC IDeckLinkDisplayMode : public IUnknown { public: - virtual HRESULT GetName (/* out */ CFStringRef *name) = 0; + virtual HRESULT GetName (/* out */ CFStringRef* name) = 0; virtual BMDDisplayMode GetDisplayMode (void) = 0; virtual long GetWidth (void) = 0; virtual long GetHeight (void) = 0; - virtual HRESULT GetFrameRate (/* out */ BMDTimeValue *frameDuration, /* out */ BMDTimeScale *timeScale) = 0; + virtual HRESULT GetFrameRate (/* out */ BMDTimeValue* frameDuration, /* out */ BMDTimeScale* timeScale) = 0; virtual BMDFieldDominance GetFieldDominance (void) = 0; virtual BMDDisplayModeFlags GetFlags (void) = 0; @@ -292,4 +284,6 @@ } + +#endif /* defined(__cplusplus) */ #endif /* defined(BMD_DECKLINKAPIMODES_H) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/osx/DeckLinkAPIStreaming.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/osx/DeckLinkAPIStreaming.h
Changed
@@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2019 Blackmagic Design +** Copyright (c) 2021 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -7,14 +7,14 @@ ** execute, and transmit the Software, and to prepare derivative works of the ** Software, and to permit third-parties to whom the Software is furnished to ** do so, all subject to the following: -** +** ** The copyright notices in the Software and this entire statement, including ** the above license grant, this restriction and the following disclaimer, ** must be included in all copies of the Software, in whole or in part, and ** all derivative works of the Software, unless such copies or derivative ** works are solely in the form of machine-executable object code generated by ** a source language processor. -** +** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT @@ -46,26 +46,26 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IBMDStreamingDeviceNotificationCallback = /* F9531D64-3305-4B29-A387-7F74BB0D0E84 */ {0xF9,0x53,0x1D,0x64,0x33,0x05,0x4B,0x29,0xA3,0x87,0x7F,0x74,0xBB,0x0D,0x0E,0x84}; -BMD_CONST REFIID IID_IBMDStreamingH264InputCallback = /* 823C475F-55AE-46F9-890C-537CC5CEDCCA */ {0x82,0x3C,0x47,0x5F,0x55,0xAE,0x46,0xF9,0x89,0x0C,0x53,0x7C,0xC5,0xCE,0xDC,0xCA}; -BMD_CONST REFIID IID_IBMDStreamingDiscovery = /* 2C837444-F989-4D87-901A-47C8A36D096D */ {0x2C,0x83,0x74,0x44,0xF9,0x89,0x4D,0x87,0x90,0x1A,0x47,0xC8,0xA3,0x6D,0x09,0x6D}; -BMD_CONST REFIID IID_IBMDStreamingVideoEncodingMode = /* 1AB8035B-CD13-458D-B6DF-5E8F7C2141D9 */ {0x1A,0xB8,0x03,0x5B,0xCD,0x13,0x45,0x8D,0xB6,0xDF,0x5E,0x8F,0x7C,0x21,0x41,0xD9}; -BMD_CONST REFIID IID_IBMDStreamingMutableVideoEncodingMode = /* 19BF7D90-1E0A-400D-B2C6-FFC4E78AD49D */ {0x19,0xBF,0x7D,0x90,0x1E,0x0A,0x40,0x0D,0xB2,0xC6,0xFF,0xC4,0xE7,0x8A,0xD4,0x9D}; -BMD_CONST REFIID IID_IBMDStreamingVideoEncodingModePresetIterator = /* 7AC731A3-C950-4AD0-804A-8377AA51C6C4 */ {0x7A,0xC7,0x31,0xA3,0xC9,0x50,0x4A,0xD0,0x80,0x4A,0x83,0x77,0xAA,0x51,0xC6,0xC4}; -BMD_CONST REFIID IID_IBMDStreamingDeviceInput = /* 24B6B6EC-1727-44BB-9818-34FF086ACF98 */ {0x24,0xB6,0xB6,0xEC,0x17,0x27,0x44,0xBB,0x98,0x18,0x34,0xFF,0x08,0x6A,0xCF,0x98}; -BMD_CONST REFIID IID_IBMDStreamingH264NALPacket = /* E260E955-14BE-4395-9775-9F02CC0A9D89 */ {0xE2,0x60,0xE9,0x55,0x14,0xBE,0x43,0x95,0x97,0x75,0x9F,0x02,0xCC,0x0A,0x9D,0x89}; -BMD_CONST REFIID IID_IBMDStreamingAudioPacket = /* D9EB5902-1AD2-43F4-9E2C-3CFA50B5EE19 */ {0xD9,0xEB,0x59,0x02,0x1A,0xD2,0x43,0xF4,0x9E,0x2C,0x3C,0xFA,0x50,0xB5,0xEE,0x19}; -BMD_CONST REFIID IID_IBMDStreamingMPEG2TSPacket = /* 91810D1C-4FB3-4AAA-AE56-FA301D3DFA4C */ {0x91,0x81,0x0D,0x1C,0x4F,0xB3,0x4A,0xAA,0xAE,0x56,0xFA,0x30,0x1D,0x3D,0xFA,0x4C}; -BMD_CONST REFIID IID_IBMDStreamingH264NALParser = /* 5867F18C-5BFA-4CCC-B2A7-9DFD140417D2 */ {0x58,0x67,0xF1,0x8C,0x5B,0xFA,0x4C,0xCC,0xB2,0xA7,0x9D,0xFD,0x14,0x04,0x17,0xD2}; +BMD_CONST REFIID IID_IBMDStreamingDeviceNotificationCallback = /* F9531D64-3305-4B29-A387-7F74BB0D0E84 */ { 0xF9,0x53,0x1D,0x64,0x33,0x05,0x4B,0x29,0xA3,0x87,0x7F,0x74,0xBB,0x0D,0x0E,0x84 }; +BMD_CONST REFIID IID_IBMDStreamingH264InputCallback = /* 823C475F-55AE-46F9-890C-537CC5CEDCCA */ { 0x82,0x3C,0x47,0x5F,0x55,0xAE,0x46,0xF9,0x89,0x0C,0x53,0x7C,0xC5,0xCE,0xDC,0xCA }; +BMD_CONST REFIID IID_IBMDStreamingDiscovery = /* 2C837444-F989-4D87-901A-47C8A36D096D */ { 0x2C,0x83,0x74,0x44,0xF9,0x89,0x4D,0x87,0x90,0x1A,0x47,0xC8,0xA3,0x6D,0x09,0x6D }; +BMD_CONST REFIID IID_IBMDStreamingVideoEncodingMode = /* 1AB8035B-CD13-458D-B6DF-5E8F7C2141D9 */ { 0x1A,0xB8,0x03,0x5B,0xCD,0x13,0x45,0x8D,0xB6,0xDF,0x5E,0x8F,0x7C,0x21,0x41,0xD9 }; +BMD_CONST REFIID IID_IBMDStreamingMutableVideoEncodingMode = /* 19BF7D90-1E0A-400D-B2C6-FFC4E78AD49D */ { 0x19,0xBF,0x7D,0x90,0x1E,0x0A,0x40,0x0D,0xB2,0xC6,0xFF,0xC4,0xE7,0x8A,0xD4,0x9D }; +BMD_CONST REFIID IID_IBMDStreamingVideoEncodingModePresetIterator = /* 7AC731A3-C950-4AD0-804A-8377AA51C6C4 */ { 0x7A,0xC7,0x31,0xA3,0xC9,0x50,0x4A,0xD0,0x80,0x4A,0x83,0x77,0xAA,0x51,0xC6,0xC4 }; +BMD_CONST REFIID IID_IBMDStreamingDeviceInput = /* 24B6B6EC-1727-44BB-9818-34FF086ACF98 */ { 0x24,0xB6,0xB6,0xEC,0x17,0x27,0x44,0xBB,0x98,0x18,0x34,0xFF,0x08,0x6A,0xCF,0x98 }; +BMD_CONST REFIID IID_IBMDStreamingH264NALPacket = /* E260E955-14BE-4395-9775-9F02CC0A9D89 */ { 0xE2,0x60,0xE9,0x55,0x14,0xBE,0x43,0x95,0x97,0x75,0x9F,0x02,0xCC,0x0A,0x9D,0x89 }; +BMD_CONST REFIID IID_IBMDStreamingAudioPacket = /* D9EB5902-1AD2-43F4-9E2C-3CFA50B5EE19 */ { 0xD9,0xEB,0x59,0x02,0x1A,0xD2,0x43,0xF4,0x9E,0x2C,0x3C,0xFA,0x50,0xB5,0xEE,0x19 }; +BMD_CONST REFIID IID_IBMDStreamingMPEG2TSPacket = /* 91810D1C-4FB3-4AAA-AE56-FA301D3DFA4C */ { 0x91,0x81,0x0D,0x1C,0x4F,0xB3,0x4A,0xAA,0xAE,0x56,0xFA,0x30,0x1D,0x3D,0xFA,0x4C }; +BMD_CONST REFIID IID_IBMDStreamingH264NALParser = /* 5867F18C-5BFA-4CCC-B2A7-9DFD140417D2 */ { 0x58,0x67,0xF1,0x8C,0x5B,0xFA,0x4C,0xCC,0xB2,0xA7,0x9D,0xFD,0x14,0x04,0x17,0xD2 }; /* Enum BMDStreamingDeviceMode - Device modes */ typedef uint32_t BMDStreamingDeviceMode; enum _BMDStreamingDeviceMode { - bmdStreamingDeviceIdle = 'idle', - bmdStreamingDeviceEncoding = 'enco', - bmdStreamingDeviceStopping = 'stop', - bmdStreamingDeviceUnknown = 'munk' + bmdStreamingDeviceIdle = /* 'idle' */ 0x69646C65, + bmdStreamingDeviceEncoding = /* 'enco' */ 0x656E636F, + bmdStreamingDeviceStopping = /* 'stop' */ 0x73746F70, + bmdStreamingDeviceUnknown = /* 'munk' */ 0x6D756E6B }; /* Enum BMDStreamingEncodingFrameRate - Encoded frame rates */ @@ -75,20 +75,20 @@ /* Interlaced rates */ - bmdStreamingEncodedFrameRate50i = 'e50i', - bmdStreamingEncodedFrameRate5994i = 'e59i', - bmdStreamingEncodedFrameRate60i = 'e60i', + bmdStreamingEncodedFrameRate50i = /* 'e50i' */ 0x65353069, + bmdStreamingEncodedFrameRate5994i = /* 'e59i' */ 0x65353969, + bmdStreamingEncodedFrameRate60i = /* 'e60i' */ 0x65363069, /* Progressive rates */ - bmdStreamingEncodedFrameRate2398p = 'e23p', - bmdStreamingEncodedFrameRate24p = 'e24p', - bmdStreamingEncodedFrameRate25p = 'e25p', - bmdStreamingEncodedFrameRate2997p = 'e29p', - bmdStreamingEncodedFrameRate30p = 'e30p', - bmdStreamingEncodedFrameRate50p = 'e50p', - bmdStreamingEncodedFrameRate5994p = 'e59p', - bmdStreamingEncodedFrameRate60p = 'e60p' + bmdStreamingEncodedFrameRate2398p = /* 'e23p' */ 0x65323370, + bmdStreamingEncodedFrameRate24p = /* 'e24p' */ 0x65323470, + bmdStreamingEncodedFrameRate25p = /* 'e25p' */ 0x65323570, + bmdStreamingEncodedFrameRate2997p = /* 'e29p' */ 0x65323970, + bmdStreamingEncodedFrameRate30p = /* 'e30p' */ 0x65333070, + bmdStreamingEncodedFrameRate50p = /* 'e50p' */ 0x65353070, + bmdStreamingEncodedFrameRate5994p = /* 'e59p' */ 0x65353970, + bmdStreamingEncodedFrameRate60p = /* 'e60p' */ 0x65363070 }; /* Enum BMDStreamingEncodingSupport - Output encoding mode supported flag */ @@ -96,56 +96,56 @@ typedef uint32_t BMDStreamingEncodingSupport; enum _BMDStreamingEncodingSupport { bmdStreamingEncodingModeNotSupported = 0, - bmdStreamingEncodingModeSupported, - bmdStreamingEncodingModeSupportedWithChanges + bmdStreamingEncodingModeSupported, + bmdStreamingEncodingModeSupportedWithChanges }; /* Enum BMDStreamingVideoCodec - Video codecs */ typedef uint32_t BMDStreamingVideoCodec; enum _BMDStreamingVideoCodec { - bmdStreamingVideoCodecH264 = 'H264' + bmdStreamingVideoCodecH264 = /* 'H264' */ 0x48323634 }; /* Enum BMDStreamingH264Profile - H264 encoding profile */ typedef uint32_t BMDStreamingH264Profile; enum _BMDStreamingH264Profile { - bmdStreamingH264ProfileHigh = 'high', - bmdStreamingH264ProfileMain = 'main', - bmdStreamingH264ProfileBaseline = 'base' + bmdStreamingH264ProfileHigh = /* 'high' */ 0x68696768, + bmdStreamingH264ProfileMain = /* 'main' */ 0x6D61696E, + bmdStreamingH264ProfileBaseline = /* 'base' */ 0x62617365 }; /* Enum BMDStreamingH264Level - H264 encoding level */ typedef uint32_t BMDStreamingH264Level; enum _BMDStreamingH264Level { - bmdStreamingH264Level12 = 'lv12', - bmdStreamingH264Level13 = 'lv13', - bmdStreamingH264Level2 = 'lv2 ', - bmdStreamingH264Level21 = 'lv21', - bmdStreamingH264Level22 = 'lv22', - bmdStreamingH264Level3 = 'lv3 ', - bmdStreamingH264Level31 = 'lv31', - bmdStreamingH264Level32 = 'lv32', - bmdStreamingH264Level4 = 'lv4 ', - bmdStreamingH264Level41 = 'lv41', - bmdStreamingH264Level42 = 'lv42' + bmdStreamingH264Level12 = /* 'lv12' */ 0x6C763132, + bmdStreamingH264Level13 = /* 'lv13' */ 0x6C763133, + bmdStreamingH264Level2 = /* 'lv2 ' */ 0x6C763220, + bmdStreamingH264Level21 = /* 'lv21' */ 0x6C763231, + bmdStreamingH264Level22 = /* 'lv22' */ 0x6C763232, + bmdStreamingH264Level3 = /* 'lv3 ' */ 0x6C763320, + bmdStreamingH264Level31 = /* 'lv31' */ 0x6C763331, + bmdStreamingH264Level32 = /* 'lv32' */ 0x6C763332, + bmdStreamingH264Level4 = /* 'lv4 ' */ 0x6C763420, + bmdStreamingH264Level41 = /* 'lv41' */ 0x6C763431, + bmdStreamingH264Level42 = /* 'lv42' */ 0x6C763432 }; /* Enum BMDStreamingH264EntropyCoding - H264 entropy coding */ typedef uint32_t BMDStreamingH264EntropyCoding; enum _BMDStreamingH264EntropyCoding { - bmdStreamingH264EntropyCodingCAVLC = 'EVLC', - bmdStreamingH264EntropyCodingCABAC = 'EBAC' + bmdStreamingH264EntropyCodingCAVLC = /* 'EVLC' */ 0x45564C43, + bmdStreamingH264EntropyCodingCABAC = /* 'EBAC' */ 0x45424143 }; /* Enum BMDStreamingAudioCodec - Audio codecs */ typedef uint32_t BMDStreamingAudioCodec; enum _BMDStreamingAudioCodec { - bmdStreamingAudioCodecAAC = 'AAC ' + bmdStreamingAudioCodecAAC = /* 'AAC ' */ 0x41414320 }; /* Enum BMDStreamingEncodingModePropertyID - Encoding mode properties */ @@ -155,27 +155,29 @@ /* Integers, Video Properties */ - bmdStreamingEncodingPropertyVideoFrameRate = 'vfrt', // Uses values of type BMDStreamingEncodingFrameRate - bmdStreamingEncodingPropertyVideoBitRateKbps = 'vbrt', + bmdStreamingEncodingPropertyVideoFrameRate = /* 'vfrt' */ 0x76667274, // Uses values of type BMDStreamingEncodingFrameRate + bmdStreamingEncodingPropertyVideoBitRateKbps = /* 'vbrt' */ 0x76627274, /* Integers, H264 Properties */ - bmdStreamingEncodingPropertyH264Profile = 'hprf', - bmdStreamingEncodingPropertyH264Level = 'hlvl', - bmdStreamingEncodingPropertyH264EntropyCoding = 'hent', + bmdStreamingEncodingPropertyH264Profile = /* 'hprf' */ 0x68707266, + bmdStreamingEncodingPropertyH264Level = /* 'hlvl' */ 0x686C766C, + bmdStreamingEncodingPropertyH264EntropyCoding = /* 'hent' */ 0x68656E74, /* Flags, H264 Properties */ - bmdStreamingEncodingPropertyH264HasBFrames = 'hBfr', + bmdStreamingEncodingPropertyH264HasBFrames = /* 'hBfr' */ 0x68426672, /* Integers, Audio Properties */ - bmdStreamingEncodingPropertyAudioCodec = 'acdc', - bmdStreamingEncodingPropertyAudioSampleRate = 'asrt', - bmdStreamingEncodingPropertyAudioChannelCount = 'achc', - bmdStreamingEncodingPropertyAudioBitRateKbps = 'abrt' + bmdStreamingEncodingPropertyAudioCodec = /* 'acdc' */ 0x61636463, + bmdStreamingEncodingPropertyAudioSampleRate = /* 'asrt' */ 0x61737274, + bmdStreamingEncodingPropertyAudioChannelCount = /* 'achc' */ 0x61636863, + bmdStreamingEncodingPropertyAudioBitRateKbps = /* 'abrt' */ 0x61627274 }; +#if defined(__cplusplus) + // Forward Declarations class IBMDStreamingDeviceNotificationCallback; @@ -236,7 +238,7 @@ class BMD_PUBLIC IBMDStreamingVideoEncodingMode : public IUnknown { public: - virtual HRESULT GetName (/* out */ CFStringRef *name) = 0; + virtual HRESULT GetName (/* out */ CFStringRef* name) = 0; virtual unsigned int GetPresetID (void) = 0; virtual unsigned int GetSourcePositionX (void) = 0; virtual unsigned int GetSourcePositionY (void) = 0; @@ -247,8 +249,8 @@ virtual HRESULT GetFlag (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ bool* value) = 0; virtual HRESULT GetInt (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ int64_t* value) = 0; virtual HRESULT GetFloat (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ double* value) = 0; - virtual HRESULT GetString (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ CFStringRef *value) = 0; - virtual HRESULT CreateMutableVideoEncodingMode (/* out */ IBMDStreamingMutableVideoEncodingMode** newEncodingMode) = 0; // Creates a mutable copy of the encoding mode + virtual HRESULT GetString (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ CFStringRef* value) = 0; + virtual HRESULT CreateMutableVideoEncodingMode (/* out */ IBMDStreamingMutableVideoEncodingMode** newEncodingMode) = 0; // Creates a mutable copy of the encoding mode protected: virtual ~IBMDStreamingVideoEncodingMode () {} // call Release method to drop reference count @@ -318,9 +320,9 @@ public: virtual long GetPayloadSize (void) = 0; virtual HRESULT GetBytes (/* out */ void** buffer) = 0; - virtual HRESULT GetBytesWithSizePrefix (/* out */ void** buffer) = 0; // Contains a 32-bit unsigned big endian size prefix + virtual HRESULT GetBytesWithSizePrefix (/* out */ void** buffer) = 0; // Contains a 32-bit unsigned big endian size prefix virtual HRESULT GetDisplayTime (/* in */ uint64_t requestedTimeScale, /* out */ uint64_t* displayTime) = 0; - virtual HRESULT GetPacketIndex (/* out */ uint32_t* packetIndex) = 0; // Deprecated + virtual HRESULT GetPacketIndex (/* out */ uint32_t* packetIndex) = 0; // Deprecated protected: virtual ~IBMDStreamingH264NALPacket () {} // call Release method to drop reference count @@ -335,7 +337,7 @@ virtual long GetPayloadSize (void) = 0; virtual HRESULT GetBytes (/* out */ void** buffer) = 0; virtual HRESULT GetPlayTime (/* in */ uint64_t requestedTimeScale, /* out */ uint64_t* playTime) = 0; - virtual HRESULT GetPacketIndex (/* out */ uint32_t* packetIndex) = 0; // Deprecated + virtual HRESULT GetPacketIndex (/* out */ uint32_t* packetIndex) = 0; // Deprecated protected: virtual ~IBMDStreamingAudioPacket () {} // call Release method to drop reference count @@ -370,10 +372,12 @@ extern "C" { - IBMDStreamingDiscovery* BMD_PUBLIC CreateBMDStreamingDiscoveryInstance (void); - IBMDStreamingH264NALParser* BMD_PUBLIC CreateBMDStreamingH264NALParser (void); + IBMDStreamingDiscovery* BMD_PUBLIC CreateBMDStreamingDiscoveryInstance(void); + IBMDStreamingH264NALParser* BMD_PUBLIC CreateBMDStreamingH264NALParser(void); } + +#endif /* defined(__cplusplus) */ #endif /* defined(BMD_DECKLINKAPISTREAMING_H) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/osx/DeckLinkAPITypes.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/osx/DeckLinkAPITypes.h
Changed
@@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2019 Blackmagic Design +** Copyright (c) 2021 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -7,14 +7,14 @@ ** execute, and transmit the Software, and to prepare derivative works of the ** Software, and to permit third-parties to whom the Software is furnished to ** do so, all subject to the following: -** +** ** The copyright notices in the Software and this entire statement, including ** the above license grant, this restriction and the following disclaimer, ** must be included in all copies of the Software, in whole or in part, and ** all derivative works of the Software, unless such copies or derivative ** works are solely in the form of machine-executable object code generated by ** a source language processor. -** +** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT @@ -50,7 +50,7 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLinkTimecode = /* BC6CFBD3-8317-4325-AC1C-1216391E9340 */ {0xBC,0x6C,0xFB,0xD3,0x83,0x17,0x43,0x25,0xAC,0x1C,0x12,0x16,0x39,0x1E,0x93,0x40}; +BMD_CONST REFIID IID_IDeckLinkTimecode = /* BC6CFBD3-8317-4325-AC1C-1216391E9340 */ { 0xBC,0x6C,0xFB,0xD3,0x83,0x17,0x43,0x25,0xAC,0x1C,0x12,0x16,0x39,0x1E,0x93,0x40 }; /* Enum BMDTimecodeFlags - Timecode flags */ @@ -60,7 +60,7 @@ bmdTimecodeIsDropFrame = 1 << 0, bmdTimecodeFieldMark = 1 << 1, bmdTimecodeColorFrame = 1 << 2, - bmdTimecodeEmbedRecordingTrigger = 1 << 3, // On SDI recording trigger utilises a user-bit + bmdTimecodeEmbedRecordingTrigger = 1 << 3, // On SDI recording trigger utilises a user-bit. bmdTimecodeRecordingTriggered = 1 << 4 }; @@ -98,6 +98,8 @@ bmdDeckControlConnectionRS422Remote2 = 1 << 1 }; +#if defined(__cplusplus) + // Forward Declarations class IDeckLinkTimecode; @@ -108,10 +110,10 @@ { public: virtual BMDTimecodeBCD GetBCD (void) = 0; - virtual HRESULT GetComponents (/* out */ uint8_t *hours, /* out */ uint8_t *minutes, /* out */ uint8_t *seconds, /* out */ uint8_t *frames) = 0; - virtual HRESULT GetString (/* out */ CFStringRef *timecode) = 0; + virtual HRESULT GetComponents (/* out */ uint8_t* hours, /* out */ uint8_t* minutes, /* out */ uint8_t* seconds, /* out */ uint8_t* frames) = 0; + virtual HRESULT GetString (/* out */ CFStringRef* timecode) = 0; virtual BMDTimecodeFlags GetFlags (void) = 0; - virtual HRESULT GetTimecodeUserBits (/* out */ BMDTimecodeUserBits *userBits) = 0; + virtual HRESULT GetTimecodeUserBits (/* out */ BMDTimecodeUserBits* userBits) = 0; protected: virtual ~IDeckLinkTimecode () {} // call Release method to drop reference count @@ -125,4 +127,6 @@ } + +#endif /* defined(__cplusplus) */ #endif /* defined(BMD_DECKLINKAPITYPES_H) */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/osx/DeckLinkAPIVersion.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/osx/DeckLinkAPIVersion.h
Changed
@@ -1,27 +1,40 @@ /* -LICENSE-START- * ** Copyright (c) 2014 Blackmagic Design - * ** - * ** Permission is hereby granted, free of charge, to any person or organization - * ** obtaining a copy of the software and accompanying documentation covered by - * ** this license (the "Software") to use, reproduce, display, distribute, - * ** execute, and transmit the Software, and to prepare derivative works of the - * ** Software, and to permit third-parties to whom the Software is furnished to - * ** do so, all subject to the following: + * ** + * ** Permission is hereby granted, free of charge, to any person or organization + * ** obtaining a copy of the software and accompanying documentation (the + * ** "Software") to use, reproduce, display, distribute, sub-license, execute, + * ** and transmit the Software, and to prepare derivative works of the Software, + * ** and to permit third-parties to whom the Software is furnished to do so, in + * ** accordance with: * ** - * ** The copyright notices in the Software and this entire statement, including - * ** the above license grant, this restriction and the following disclaimer, - * ** must be included in all copies of the Software, in whole or in part, and - * ** all derivative works of the Software, unless such copies or derivative - * ** works are solely in the form of machine-executable object code generated by - * ** a source language processor. + * ** (1) if the Software is obtained from Blackmagic Design, the End User License + * ** Agreement for the Software Development Kit (“EULA”) available at + * ** https://www.blackmagicdesign.com/EULA/DeckLinkSDK; or * ** - * ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT - * ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE - * ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, - * ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * ** (2) if the Software is obtained from any third party, such licensing terms + * ** as notified by that third party, + * ** + * ** and all subject to the following: + * ** + * ** (3) the copyright notices in the Software and this entire statement, + * ** including the above license grant, this restriction and the following + * ** disclaimer, must be included in all copies of the Software, in whole or in + * ** part, and all derivative works of the Software, unless such copies or + * ** derivative works are solely in the form of machine-executable object code + * ** generated by a source language processor. + * ** + * ** (4) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * ** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * ** DEALINGS IN THE SOFTWARE. + * ** + * ** A copy of the Software is available free of charge at + * ** https://www.blackmagicdesign.com/desktopvideo_sdk under the EULA. + * ** * ** -LICENSE-END- * */ @@ -30,8 +43,8 @@ #ifndef __DeckLink_API_Version_h__ #define __DeckLink_API_Version_h__ -#define BLACKMAGIC_DECKLINK_API_VERSION 0x0b020000 -#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "11.2" +#define BLACKMAGIC_DECKLINK_API_VERSION 0x0c020200 +#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "12.2.2" #endif // __DeckLink_API_Version_h__
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/win/DeckLinkAPI.h -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/win/DeckLinkAPI.h
Changed
@@ -3,14 +3,14 @@ /* this ALWAYS GENERATED file contains the definitions for the interfaces */ - /* File created by MIDL compiler version 8.01.0622 */ + /* File created by MIDL compiler version 8.01.0626 */ /* at Tue Jan 19 12:14:07 2038 */ -/* Compiler settings for ..\..\Blackmagic\DeckLink_SDK_10.11.4\Win\include\DeckLinkAPI.idl: - Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 +/* Compiler settings for ..\..\Blackmagic_DeckLink_SDK_12.2.2\BlackmagicDeckLinkSDK12.2.2\Win\include\DeckLinkAPI.idl: + Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0626 protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: __declspec(uuid()), __declspec(selectany), __declspec(novtable) DECLSPEC_UUID(), MIDL_INTERFACE() */ @@ -41,7 +41,15 @@ #pragma once #endif -/* Forward Declarations */ +#ifndef DECLSPEC_XFGVIRT +#if _CONTROL_FLOW_GUARD_XFG +#define DECLSPEC_XFGVIRT(base, func) __declspec(xfg_virtual(base, func)) +#else +#define DECLSPEC_XFGVIRT(base, func) +#endif +#endif + +/* Forward Declarations */ #ifndef __IDeckLinkTimecode_FWD_DEFINED__ #define __IDeckLinkTimecode_FWD_DEFINED__ @@ -564,6 +572,20 @@ #endif /* __CDeckLinkVideoFrameAncillaryPackets_FWD_DEFINED__ */ +#ifndef __IDeckLinkInputCallback_v11_5_1_FWD_DEFINED__ +#define __IDeckLinkInputCallback_v11_5_1_FWD_DEFINED__ +typedef interface IDeckLinkInputCallback_v11_5_1 IDeckLinkInputCallback_v11_5_1; + +#endif /* __IDeckLinkInputCallback_v11_5_1_FWD_DEFINED__ */ + + +#ifndef __IDeckLinkInput_v11_5_1_FWD_DEFINED__ +#define __IDeckLinkInput_v11_5_1_FWD_DEFINED__ +typedef interface IDeckLinkInput_v11_5_1 IDeckLinkInput_v11_5_1; + +#endif /* __IDeckLinkInput_v11_5_1_FWD_DEFINED__ */ + + #ifndef __IDeckLinkConfiguration_v10_11_FWD_DEFINED__ #define __IDeckLinkConfiguration_v10_11_FWD_DEFINED__ typedef interface IDeckLinkConfiguration_v10_11 IDeckLinkConfiguration_v10_11; @@ -649,6 +671,41 @@ #endif /* __CBMDStreamingDiscovery_v10_8_FWD_DEFINED__ */ +#ifndef __IDeckLinkConfiguration_v10_4_FWD_DEFINED__ +#define __IDeckLinkConfiguration_v10_4_FWD_DEFINED__ +typedef interface IDeckLinkConfiguration_v10_4 IDeckLinkConfiguration_v10_4; + +#endif /* __IDeckLinkConfiguration_v10_4_FWD_DEFINED__ */ + + +#ifndef __IDeckLinkConfiguration_v10_2_FWD_DEFINED__ +#define __IDeckLinkConfiguration_v10_2_FWD_DEFINED__ +typedef interface IDeckLinkConfiguration_v10_2 IDeckLinkConfiguration_v10_2; + +#endif /* __IDeckLinkConfiguration_v10_2_FWD_DEFINED__ */ + + +#ifndef __IDeckLinkVideoFrameMetadataExtensions_v11_5_FWD_DEFINED__ +#define __IDeckLinkVideoFrameMetadataExtensions_v11_5_FWD_DEFINED__ +typedef interface IDeckLinkVideoFrameMetadataExtensions_v11_5 IDeckLinkVideoFrameMetadataExtensions_v11_5; + +#endif /* __IDeckLinkVideoFrameMetadataExtensions_v11_5_FWD_DEFINED__ */ + + +#ifndef __IDeckLinkOutput_v11_4_FWD_DEFINED__ +#define __IDeckLinkOutput_v11_4_FWD_DEFINED__ +typedef interface IDeckLinkOutput_v11_4 IDeckLinkOutput_v11_4; + +#endif /* __IDeckLinkOutput_v11_4_FWD_DEFINED__ */ + + +#ifndef __IDeckLinkInput_v11_4_FWD_DEFINED__ +#define __IDeckLinkInput_v11_4_FWD_DEFINED__ +typedef interface IDeckLinkInput_v11_4 IDeckLinkInput_v11_4; + +#endif /* __IDeckLinkInput_v11_4_FWD_DEFINED__ */ + + #ifndef __CDeckLinkIterator_v10_8_FWD_DEFINED__ #define __CDeckLinkIterator_v10_8_FWD_DEFINED__ @@ -680,20 +737,6 @@ #endif /* __IDeckLinkEncoderConfiguration_v10_5_FWD_DEFINED__ */ -#ifndef __IDeckLinkConfiguration_v10_4_FWD_DEFINED__ -#define __IDeckLinkConfiguration_v10_4_FWD_DEFINED__ -typedef interface IDeckLinkConfiguration_v10_4 IDeckLinkConfiguration_v10_4; - -#endif /* __IDeckLinkConfiguration_v10_4_FWD_DEFINED__ */ - - -#ifndef __IDeckLinkConfiguration_v10_2_FWD_DEFINED__ -#define __IDeckLinkConfiguration_v10_2_FWD_DEFINED__ -typedef interface IDeckLinkConfiguration_v10_2 IDeckLinkConfiguration_v10_2; - -#endif /* __IDeckLinkConfiguration_v10_2_FWD_DEFINED__ */ - - #ifndef __IDeckLinkOutput_v9_9_FWD_DEFINED__ #define __IDeckLinkOutput_v9_9_FWD_DEFINED__ typedef interface IDeckLinkOutput_v9_9 IDeckLinkOutput_v9_9; @@ -973,7 +1016,7 @@ #ifdef __cplusplus extern "C"{ -#endif +#endif @@ -981,7 +1024,7 @@ #define __DeckLinkAPI_LIBRARY_DEFINED__ /* library DeckLinkAPI */ -/* helpstringversionuuid */ +/* helpstringversionuuid */ typedef LONGLONG BMDTimeValue; @@ -996,7 +1039,7 @@ typedef enum _BMDTimecodeFlags BMDTimecodeFlags; #endif -/* v1_enum */ +/* v1_enum */ enum _BMDTimecodeFlags { bmdTimecodeFlagDefault = 0, @@ -1004,9 +1047,9 @@ bmdTimecodeFieldMark = ( 1 << 1 ) , bmdTimecodeColorFrame = ( 1 << 2 ) , bmdTimecodeEmbedRecordingTrigger = ( 1 << 3 ) , - bmdTimecodeRecordingTriggered = ( 1 << 4 ) + bmdTimecodeRecordingTriggered = ( 1 << 4 ) } ; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDVideoConnection { bmdVideoConnectionUnspecified = 0, @@ -1015,10 +1058,10 @@ bmdVideoConnectionOpticalSDI = ( 1 << 2 ) , bmdVideoConnectionComponent = ( 1 << 3 ) , bmdVideoConnectionComposite = ( 1 << 4 ) , - bmdVideoConnectionSVideo = ( 1 << 5 ) + bmdVideoConnectionSVideo = ( 1 << 5 ) } BMDVideoConnection; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDAudioConnection { bmdAudioConnectionEmbedded = ( 1 << 0 ) , @@ -1027,14 +1070,14 @@ bmdAudioConnectionAnalogXLR = ( 1 << 3 ) , bmdAudioConnectionAnalogRCA = ( 1 << 4 ) , bmdAudioConnectionMicrophone = ( 1 << 5 ) , - bmdAudioConnectionHeadphones = ( 1 << 6 ) + bmdAudioConnectionHeadphones = ( 1 << 6 ) } BMDAudioConnection; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckControlConnection { bmdDeckControlConnectionRS422Remote1 = ( 1 << 0 ) , - bmdDeckControlConnectionRS422Remote2 = ( 1 << 1 ) + bmdDeckControlConnectionRS422Remote2 = ( 1 << 1 ) } BMDDeckControlConnection; @@ -1043,7 +1086,7 @@ typedef enum _BMDDisplayModeFlags BMDDisplayModeFlags; #endif -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDisplayMode { bmdModeNTSC = 0x6e747363, @@ -1156,12 +1199,10 @@ bmdMode2560x1440p60 = 0x77716836, bmdMode2560x1600p50 = 0x77717835, bmdMode2560x1600p60 = 0x77717836, - bmdModeCintelRAW = 0x72776369, - bmdModeCintelCompressedRAW = 0x72776363, bmdModeUnknown = 0x69756e6b } BMDDisplayMode; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDFieldDominance { bmdUnknownFieldDominance = 0, @@ -1171,7 +1212,7 @@ bmdProgressiveSegmentedFrame = 0x70736620 } BMDFieldDominance; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDPixelFormat { bmdFormatUnspecified = 0, @@ -1185,18 +1226,16 @@ bmdFormat10BitRGBXLE = 0x5231306c, bmdFormat10BitRGBX = 0x52313062, bmdFormatH265 = 0x68657631, - bmdFormatDNxHR = 0x41566468, - bmdFormat12BitRAWGRBG = 0x72313270, - bmdFormat12BitRAWJPEG = 0x72313670 + bmdFormatDNxHR = 0x41566468 } BMDPixelFormat; -/* v1_enum */ +/* v1_enum */ enum _BMDDisplayModeFlags { bmdDisplayModeSupports3D = ( 1 << 0 ) , bmdDisplayModeColorspaceRec601 = ( 1 << 1 ) , bmdDisplayModeColorspaceRec709 = ( 1 << 2 ) , - bmdDisplayModeColorspaceRec2020 = ( 1 << 3 ) + bmdDisplayModeColorspaceRec2020 = ( 1 << 3 ) } ; @@ -1205,7 +1244,7 @@ #if 0 #endif -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigSwapSerialRxTx = 0x73737274, @@ -1213,6 +1252,8 @@ bmdDeckLinkConfigBypass = 0x62797073, bmdDeckLinkConfigClockTimingAdjustment = 0x63746164, bmdDeckLinkConfigAnalogAudioConsumerLevels = 0x6161636c, + bmdDeckLinkConfigSwapHDMICh3AndCh4OnInput = 0x68693334, + bmdDeckLinkConfigSwapHDMICh3AndCh4OnOutput = 0x686f3334, bmdDeckLinkConfigFieldFlickerRemoval = 0x66646672, bmdDeckLinkConfigHD1080p24ToHD1080i5994Conversion = 0x746f3539, bmdDeckLinkConfig444SDIVideoOutput = 0x3434346f, @@ -1260,6 +1301,7 @@ bmdDeckLinkConfigVideoInputCompositeChromaGain = 0x69696367, bmdDeckLinkConfigVideoInputSVideoLumaGain = 0x69736c67, bmdDeckLinkConfigVideoInputSVideoChromaGain = 0x69736367, + bmdDeckLinkConfigInternalKeyingAncillaryDataSource = 0x696b6173, bmdDeckLinkConfigMicrophonePhantomPower = 0x6d706870, bmdDeckLinkConfigAudioInputConnection = 0x6169636e, bmdDeckLinkConfigAnalogAudioInputScaleChannel1 = 0x61697331, @@ -1284,7 +1326,7 @@ bmdDeckLinkConfigDeckControlConnection = 0x6463636f } BMDDeckLinkConfigurationID; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckLinkEncoderConfigurationID { bmdDeckLinkEncoderConfigPreferredBitDepth = 0x65706272, @@ -1306,7 +1348,7 @@ typedef enum _BMDDeckControlExportModeOpsFlags BMDDeckControlExportModeOpsFlags; #endif -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckControlMode { bmdDeckControlNotOpened = 0x6e746f70, @@ -1315,7 +1357,7 @@ bmdDeckControlCaptureMode = 0x6361706d } BMDDeckControlMode; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckControlEvent { bmdDeckControlAbortedEvent = 0x61627465, @@ -1325,7 +1367,7 @@ bmdDeckControlCaptureCompleteEvent = 0x63636576 } BMDDeckControlEvent; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckControlVTRControlState { bmdDeckControlNotInVTRControlMode = 0x6e76636d, @@ -1339,15 +1381,15 @@ bmdDeckControlVTRControlStopped = 0x7674726f } BMDDeckControlVTRControlState; -/* v1_enum */ +/* v1_enum */ enum _BMDDeckControlStatusFlags { bmdDeckControlStatusDeckConnected = ( 1 << 0 ) , bmdDeckControlStatusRemoteMode = ( 1 << 1 ) , bmdDeckControlStatusRecordInhibited = ( 1 << 2 ) , - bmdDeckControlStatusCassetteOut = ( 1 << 3 ) + bmdDeckControlStatusCassetteOut = ( 1 << 3 ) } ; -/* v1_enum */ +/* v1_enum */ enum _BMDDeckControlExportModeOpsFlags { bmdDeckControlExportModeInsertVideo = ( 1 << 0 ) , @@ -1366,9 +1408,9 @@ bmdDeckControlExportModeInsertTimeCode = ( 1 << 13 ) , bmdDeckControlExportModeInsertAssemble = ( 1 << 14 ) , bmdDeckControlExportModeInsertPreview = ( 1 << 15 ) , - bmdDeckControlUseManualExport = ( 1 << 16 ) + bmdDeckControlUseManualExport = ( 1 << 16 ) } ; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckControlError { bmdDeckControlNoError = 0x6e6f6572, @@ -1393,7 +1435,7 @@ #if 0 #endif -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDStreamingDeviceMode { bmdStreamingDeviceIdle = 0x69646c65, @@ -1402,7 +1444,7 @@ bmdStreamingDeviceUnknown = 0x6d756e6b } BMDStreamingDeviceMode; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDStreamingEncodingFrameRate { bmdStreamingEncodedFrameRate50i = 0x65353069, @@ -1418,21 +1460,21 @@ bmdStreamingEncodedFrameRate60p = 0x65363070 } BMDStreamingEncodingFrameRate; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDStreamingEncodingSupport { bmdStreamingEncodingModeNotSupported = 0, bmdStreamingEncodingModeSupported = ( bmdStreamingEncodingModeNotSupported + 1 ) , - bmdStreamingEncodingModeSupportedWithChanges = ( bmdStreamingEncodingModeSupported + 1 ) + bmdStreamingEncodingModeSupportedWithChanges = ( bmdStreamingEncodingModeSupported + 1 ) } BMDStreamingEncodingSupport; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDStreamingVideoCodec { bmdStreamingVideoCodecH264 = 0x48323634 } BMDStreamingVideoCodec; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDStreamingH264Profile { bmdStreamingH264ProfileHigh = 0x68696768, @@ -1440,7 +1482,7 @@ bmdStreamingH264ProfileBaseline = 0x62617365 } BMDStreamingH264Profile; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDStreamingH264Level { bmdStreamingH264Level12 = 0x6c763132, @@ -1456,20 +1498,20 @@ bmdStreamingH264Level42 = 0x6c763432 } BMDStreamingH264Level; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDStreamingH264EntropyCoding { bmdStreamingH264EntropyCodingCAVLC = 0x45564c43, bmdStreamingH264EntropyCodingCABAC = 0x45424143 } BMDStreamingH264EntropyCoding; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDStreamingAudioCodec { bmdStreamingAudioCodecAAC = 0x41414320 } BMDStreamingAudioCodec; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDStreamingEncodingModePropertyID { bmdStreamingEncodingPropertyVideoFrameRate = 0x76667274, @@ -1518,7 +1560,7 @@ typedef enum _BMDDeviceBusyState BMDDeviceBusyState; #endif -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDVideoOutputFlags { bmdVideoOutputFlagDefault = 0, @@ -1526,10 +1568,10 @@ bmdVideoOutputVITC = ( 1 << 1 ) , bmdVideoOutputRP188 = ( 1 << 2 ) , bmdVideoOutputDualStream3D = ( 1 << 4 ) , - bmdVideoOutputSynchronizeToPlaybackGroup = ( 1 << 6 ) + bmdVideoOutputSynchronizeToPlaybackGroup = ( 1 << 6 ) } BMDVideoOutputFlags; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDSupportedVideoModeFlags { bmdSupportedVideoModeDefault = 0, @@ -1538,99 +1580,102 @@ bmdSupportedVideoModeSDISingleLink = ( 1 << 2 ) , bmdSupportedVideoModeSDIDualLink = ( 1 << 3 ) , bmdSupportedVideoModeSDIQuadLink = ( 1 << 4 ) , - bmdSupportedVideoModeInAnyProfile = ( 1 << 5 ) + bmdSupportedVideoModeInAnyProfile = ( 1 << 5 ) } BMDSupportedVideoModeFlags; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDPacketType { bmdPacketTypeStreamInterruptedMarker = 0x73696e74, bmdPacketTypeStreamData = 0x73646174 } BMDPacketType; -/* v1_enum */ +/* v1_enum */ enum _BMDFrameFlags { bmdFrameFlagDefault = 0, bmdFrameFlagFlipVertical = ( 1 << 0 ) , bmdFrameContainsHDRMetadata = ( 1 << 1 ) , - bmdFrameContainsCintelMetadata = ( 1 << 2 ) , bmdFrameCapturedAsPsF = ( 1 << 30 ) , - bmdFrameHasNoInputSource = ( 1 << 31 ) + bmdFrameHasNoInputSource = ( 1 << 31 ) } ; -/* v1_enum */ +/* v1_enum */ enum _BMDVideoInputFlags { bmdVideoInputFlagDefault = 0, bmdVideoInputEnableFormatDetection = ( 1 << 0 ) , bmdVideoInputDualStream3D = ( 1 << 1 ) , - bmdVideoInputSynchronizeToCaptureGroup = ( 1 << 2 ) + bmdVideoInputSynchronizeToCaptureGroup = ( 1 << 2 ) } ; -/* v1_enum */ +/* v1_enum */ enum _BMDVideoInputFormatChangedEvents { bmdVideoInputDisplayModeChanged = ( 1 << 0 ) , bmdVideoInputFieldDominanceChanged = ( 1 << 1 ) , - bmdVideoInputColorspaceChanged = ( 1 << 2 ) + bmdVideoInputColorspaceChanged = ( 1 << 2 ) } ; -/* v1_enum */ +/* v1_enum */ enum _BMDDetectedVideoInputFormatFlags { bmdDetectedVideoInputYCbCr422 = ( 1 << 0 ) , bmdDetectedVideoInputRGB444 = ( 1 << 1 ) , - bmdDetectedVideoInputDualStream3D = ( 1 << 2 ) + bmdDetectedVideoInputDualStream3D = ( 1 << 2 ) , + bmdDetectedVideoInput12BitDepth = ( 1 << 3 ) , + bmdDetectedVideoInput10BitDepth = ( 1 << 4 ) , + bmdDetectedVideoInput8BitDepth = ( 1 << 5 ) } ; -/* v1_enum */ +/* v1_enum */ enum _BMDDeckLinkCapturePassthroughMode { bmdDeckLinkCapturePassthroughModeDisabled = 0x70646973, bmdDeckLinkCapturePassthroughModeDirect = 0x70646972, bmdDeckLinkCapturePassthroughModeCleanSwitch = 0x70636c6e } ; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDOutputFrameCompletionResult { bmdOutputFrameCompleted = 0, bmdOutputFrameDisplayedLate = ( bmdOutputFrameCompleted + 1 ) , bmdOutputFrameDropped = ( bmdOutputFrameDisplayedLate + 1 ) , - bmdOutputFrameFlushed = ( bmdOutputFrameDropped + 1 ) + bmdOutputFrameFlushed = ( bmdOutputFrameDropped + 1 ) } BMDOutputFrameCompletionResult; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDReferenceStatus { + bmdReferenceUnlocked = 0, bmdReferenceNotSupportedByHardware = ( 1 << 0 ) , - bmdReferenceLocked = ( 1 << 1 ) + bmdReferenceLocked = ( 1 << 1 ) } BMDReferenceStatus; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDAudioFormat { bmdAudioFormatPCM = 0x6c70636d } BMDAudioFormat; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDAudioSampleRate { bmdAudioSampleRate48kHz = 48000 } BMDAudioSampleRate; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDAudioSampleType { bmdAudioSampleType16bitInteger = 16, bmdAudioSampleType32bitInteger = 32 } BMDAudioSampleType; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDAudioOutputStreamType { bmdAudioOutputStreamContinuous = 0, bmdAudioOutputStreamContinuousDontResample = ( bmdAudioOutputStreamContinuous + 1 ) , - bmdAudioOutputStreamTimestamped = ( bmdAudioOutputStreamContinuousDontResample + 1 ) + bmdAudioOutputStreamTimestamped = ( bmdAudioOutputStreamContinuousDontResample + 1 ) } BMDAudioOutputStreamType; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDAncillaryPacketFormat { bmdAncillaryPacketFormatUInt8 = 0x75693038, @@ -1638,7 +1683,7 @@ bmdAncillaryPacketFormatYCbCr10 = 0x76323130 } BMDAncillaryPacketFormat; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDTimecodeFormat { bmdTimecodeRP188VITC1 = 0x72707631, @@ -1651,20 +1696,20 @@ bmdTimecodeSerial = 0x73657269 } BMDTimecodeFormat; -/* v1_enum */ +/* v1_enum */ enum _BMDAnalogVideoFlags { bmdAnalogVideoFlagCompositeSetup75 = ( 1 << 0 ) , - bmdAnalogVideoFlagComponentBetacamLevels = ( 1 << 1 ) + bmdAnalogVideoFlagComponentBetacamLevels = ( 1 << 1 ) } ; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDAudioOutputAnalogAESSwitch { bmdAudioOutputSwitchAESEBU = 0x61657320, bmdAudioOutputSwitchAnalog = 0x616e6c67 } BMDAudioOutputAnalogAESSwitch; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDVideoOutputConversionMode { bmdNoVideoOutputConversion = 0x6e6f6e65, @@ -1683,7 +1728,7 @@ bmdVideoOutputHardwarePillarbox1080iUpconversion = 0x75703169 } BMDVideoOutputConversionMode; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDVideoInputConversionMode { bmdNoVideoInputConversion = 0x6e6f6e65, @@ -1695,7 +1740,7 @@ bmdVideoInputAnamorphicUpconversion = 0x616d7570 } BMDVideoInputConversionMode; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDVideo3DPackingFormat { bmdVideo3DPackingSidebySideHalf = 0x73627368, @@ -1706,21 +1751,21 @@ bmdVideo3DPackingRightOnly = 0x72696768 } BMDVideo3DPackingFormat; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDIdleVideoOutputOperation { bmdIdleVideoOutputBlack = 0x626c6163, bmdIdleVideoOutputLastFrame = 0x6c616661 } BMDIdleVideoOutputOperation; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDVideoEncoderFrameCodingMode { bmdVideoEncoderFrameCodingModeInter = 0x696e7465, bmdVideoEncoderFrameCodingModeIntra = 0x696e7472 } BMDVideoEncoderFrameCodingMode; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDNxHRLevel { bmdDNxHRLevelSQ = 0x646e7371, @@ -1730,7 +1775,7 @@ bmdDNxHRLevel444 = 0x64343434 } BMDDNxHRLevel; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDLinkConfiguration { bmdLinkConfigurationSingleLink = 0x6c63736c, @@ -1738,7 +1783,7 @@ bmdLinkConfigurationQuadLink = 0x6c63716c } BMDLinkConfiguration; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeviceInterface { bmdDeviceInterfacePCI = 0x70636920, @@ -1746,7 +1791,7 @@ bmdDeviceInterfaceThunderbolt = 0x7468756e } BMDDeviceInterface; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDColorspace { bmdColorspaceRec601 = 0x72363031, @@ -1754,54 +1799,25 @@ bmdColorspaceRec2020 = 0x32303230 } BMDColorspace; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDynamicRange { bmdDynamicRangeSDR = 0, bmdDynamicRangeHDRStaticPQ = ( 1 << 29 ) , - bmdDynamicRangeHDRStaticHLG = ( 1 << 30 ) + bmdDynamicRangeHDRStaticHLG = ( 1 << 30 ) } BMDDynamicRange; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckLinkHDMIInputEDIDID { bmdDeckLinkHDMIInputEDIDDynamicRange = 0x48494479 } BMDDeckLinkHDMIInputEDIDID; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckLinkFrameMetadataID { bmdDeckLinkFrameMetadataColorspace = 0x63737063, bmdDeckLinkFrameMetadataHDRElectroOpticalTransferFunc = 0x656f7466, - bmdDeckLinkFrameMetadataCintelFilmType = 0x63667479, - bmdDeckLinkFrameMetadataCintelFilmGauge = 0x63666761, - bmdDeckLinkFrameMetadataCintelKeykodeLow = 0x636b6b6c, - bmdDeckLinkFrameMetadataCintelKeykodeHigh = 0x636b6b68, - bmdDeckLinkFrameMetadataCintelTile1Size = 0x63743173, - bmdDeckLinkFrameMetadataCintelTile2Size = 0x63743273, - bmdDeckLinkFrameMetadataCintelTile3Size = 0x63743373, - bmdDeckLinkFrameMetadataCintelTile4Size = 0x63743473, - bmdDeckLinkFrameMetadataCintelImageWidth = 0x49575078, - bmdDeckLinkFrameMetadataCintelImageHeight = 0x49485078, - bmdDeckLinkFrameMetadataCintelLinearMaskingRedInRed = 0x6d726972, - bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInRed = 0x6d676972, - bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInRed = 0x6d626972, - bmdDeckLinkFrameMetadataCintelLinearMaskingRedInGreen = 0x6d726967, - bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInGreen = 0x6d676967, - bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInGreen = 0x6d626967, - bmdDeckLinkFrameMetadataCintelLinearMaskingRedInBlue = 0x6d726962, - bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInBlue = 0x6d676962, - bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInBlue = 0x6d626962, - bmdDeckLinkFrameMetadataCintelLogMaskingRedInRed = 0x6d6c7272, - bmdDeckLinkFrameMetadataCintelLogMaskingGreenInRed = 0x6d6c6772, - bmdDeckLinkFrameMetadataCintelLogMaskingBlueInRed = 0x6d6c6272, - bmdDeckLinkFrameMetadataCintelLogMaskingRedInGreen = 0x6d6c7267, - bmdDeckLinkFrameMetadataCintelLogMaskingGreenInGreen = 0x6d6c6767, - bmdDeckLinkFrameMetadataCintelLogMaskingBlueInGreen = 0x6d6c6267, - bmdDeckLinkFrameMetadataCintelLogMaskingRedInBlue = 0x6d6c7262, - bmdDeckLinkFrameMetadataCintelLogMaskingGreenInBlue = 0x6d6c6762, - bmdDeckLinkFrameMetadataCintelLogMaskingBlueInBlue = 0x6d6c6262, - bmdDeckLinkFrameMetadataCintelFilmFrameRate = 0x63666672, bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedX = 0x68647278, bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedY = 0x68647279, bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenX = 0x68646778, @@ -1813,21 +1829,10 @@ bmdDeckLinkFrameMetadataHDRMaxDisplayMasteringLuminance = 0x68646d6c, bmdDeckLinkFrameMetadataHDRMinDisplayMasteringLuminance = 0x686d696c, bmdDeckLinkFrameMetadataHDRMaximumContentLightLevel = 0x6d636c6c, - bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel = 0x66616c6c, - bmdDeckLinkFrameMetadataCintelOffsetToApplyHorizontal = 0x6f746168, - bmdDeckLinkFrameMetadataCintelOffsetToApplyVertical = 0x6f746176, - bmdDeckLinkFrameMetadataCintelGainRed = 0x4c665264, - bmdDeckLinkFrameMetadataCintelGainGreen = 0x4c664772, - bmdDeckLinkFrameMetadataCintelGainBlue = 0x4c66426c, - bmdDeckLinkFrameMetadataCintelLiftRed = 0x476e5264, - bmdDeckLinkFrameMetadataCintelLiftGreen = 0x476e4772, - bmdDeckLinkFrameMetadataCintelLiftBlue = 0x476e426c, - bmdDeckLinkFrameMetadataCintelHDRGainRed = 0x48475264, - bmdDeckLinkFrameMetadataCintelHDRGainGreen = 0x48474772, - bmdDeckLinkFrameMetadataCintelHDRGainBlue = 0x4847426c + bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel = 0x66616c6c } BMDDeckLinkFrameMetadataID; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDProfileID { bmdProfileOneSubDeviceFullDuplex = 0x31646664, @@ -1837,7 +1842,7 @@ bmdProfileFourSubDevicesHalfDuplex = 0x34646864 } BMDProfileID; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDHDMITimecodePacking { bmdHDMITimecodePackingIEEEOUI000085 = 0x8500, @@ -1845,7 +1850,14 @@ bmdHDMITimecodePackingIEEEOUI5CF9F0 = 0x5cf9f003 } BMDHDMITimecodePacking; -typedef /* v1_enum */ +typedef /* v1_enum */ +enum _BMDInternalKeyingAncillaryDataSource + { + bmdInternalKeyingUsesAncillaryDataFromInputSignal = 0x696b6169, + bmdInternalKeyingUsesAncillaryDataFromKeyFrame = 0x696b616b + } BMDInternalKeyingAncillaryDataSource; + +typedef /* v1_enum */ enum _BMDDeckLinkAttributeID { BMDDeckLinkSupportsInternalKeying = 0x6b657969, @@ -1860,6 +1872,7 @@ BMDDeckLinkSupportsClockTimingAdjustment = 0x63746164, BMDDeckLinkSupportsFullFrameReferenceInputTimingOffset = 0x6672696e, BMDDeckLinkSupportsSMPTELevelAOutput = 0x6c766c61, + BMDDeckLinkSupportsAutoSwitchingPPsFOnInput = 0x61707366, BMDDeckLinkSupportsDualLinkSDI = 0x73646c73, BMDDeckLinkSupportsQuadLinkSDI = 0x73716c73, BMDDeckLinkSupportsIdleOutput = 0x69646f75, @@ -1892,6 +1905,8 @@ BMDDeckLinkAudioOutputXLRChannelCount = 0x616f7863, BMDDeckLinkProfileID = 0x70726964, BMDDeckLinkDuplex = 0x64757078, + BMDDeckLinkMinimumPrerollFrames = 0x6d707266, + BMDDeckLinkSupportedDynamicRange = 0x73756472, BMDDeckLinkVideoInputGainMinimum = 0x7669676d, BMDDeckLinkVideoInputGainMaximum = 0x76696778, BMDDeckLinkVideoOutputGainMinimum = 0x766f676d, @@ -1905,17 +1920,21 @@ BMDDeckLinkDeviceHandle = 0x64657668 } BMDDeckLinkAttributeID; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckLinkAPIInformationID { BMDDeckLinkAPIVersion = 0x76657273 } BMDDeckLinkAPIInformationID; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckLinkStatusID { bmdDeckLinkStatusDetectedVideoInputMode = 0x6476696d, - bmdDeckLinkStatusDetectedVideoInputFlags = 0x64766966, + bmdDeckLinkStatusDetectedVideoInputFormatFlags = 0x64766666, + bmdDeckLinkStatusDetectedVideoInputFieldDominance = 0x64766664, + bmdDeckLinkStatusDetectedVideoInputColorspace = 0x6473636c, + bmdDeckLinkStatusDetectedVideoInputDynamicRange = 0x64736472, + bmdDeckLinkStatusDetectedSDILinkConfiguration = 0x64736c63, bmdDeckLinkStatusCurrentVideoInputMode = 0x6376696d, bmdDeckLinkStatusCurrentVideoInputPixelFormat = 0x63766970, bmdDeckLinkStatusCurrentVideoInputFlags = 0x63766966, @@ -1934,14 +1953,14 @@ bmdDeckLinkStatusReceivedEDID = 0x65646964 } BMDDeckLinkStatusID; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckLinkVideoStatusFlags { bmdDeckLinkVideoStatusPsF = ( 1 << 0 ) , - bmdDeckLinkVideoStatusDualStream3D = ( 1 << 1 ) + bmdDeckLinkVideoStatusDualStream3D = ( 1 << 1 ) } BMDDeckLinkVideoStatusFlags; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDuplexMode { bmdDuplexFull = 0x64786675, @@ -1950,28 +1969,28 @@ bmdDuplexInactive = 0x6478696e } BMDDuplexMode; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDPanelType { bmdPanelNotDetected = 0x6e706e6c, bmdPanelTeranexMiniSmartPanel = 0x746d736d } BMDPanelType; -/* v1_enum */ +/* v1_enum */ enum _BMDDeviceBusyState { bmdDeviceCaptureBusy = ( 1 << 0 ) , bmdDevicePlaybackBusy = ( 1 << 1 ) , - bmdDeviceSerialPortBusy = ( 1 << 2 ) + bmdDeviceSerialPortBusy = ( 1 << 2 ) } ; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDVideoIOSupport { bmdDeviceSupportsCapture = ( 1 << 0 ) , - bmdDeviceSupportsPlayback = ( 1 << 1 ) + bmdDeviceSupportsPlayback = ( 1 << 1 ) } BMDVideoIOSupport; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMD3DPreviewFormat { bmd3DPreviewFormatDefault = 0x64656661, @@ -1981,7 +2000,7 @@ bmd3DPreviewFormatTopBottom = 0x746f7062 } BMD3DPreviewFormat; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDNotifications { bmdPreferencesChanged = 0x70726566, @@ -2028,28 +2047,34 @@ -typedef /* v1_enum */ +typedef /* v1_enum */ +enum _BMDDeckLinkStatusID_v11_5_1 + { + bmdDeckLinkStatusDetectedVideoInputFlags_v11_5_1 = 0x64766966 + } BMDDeckLinkStatusID_v11_5_1; + +typedef /* v1_enum */ enum _BMDDisplayModeSupport_v10_11 { bmdDisplayModeNotSupported_v10_11 = 0, bmdDisplayModeSupported_v10_11 = ( bmdDisplayModeNotSupported_v10_11 + 1 ) , - bmdDisplayModeSupportedWithConversion_v10_11 = ( bmdDisplayModeSupported_v10_11 + 1 ) + bmdDisplayModeSupportedWithConversion_v10_11 = ( bmdDisplayModeSupported_v10_11 + 1 ) } BMDDisplayModeSupport_v10_11; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDuplexMode_v10_11 { bmdDuplexModeFull_v10_11 = 0x66647570, bmdDuplexModeHalf_v10_11 = 0x68647570 } BMDDuplexMode_v10_11; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckLinkConfigurationID_v10_11 { bmdDeckLinkConfigDuplexMode_v10_11 = 0x64757078 } BMDDeckLinkConfigurationID_v10_11; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckLinkAttributeID_v10_11 { BMDDeckLinkSupportsDuplexModeConfiguration_v10_11 = 0x64757078, @@ -2058,13 +2083,13 @@ BMDDeckLinkSupportsFullDuplex_v10_11 = 0x66647570 } BMDDeckLinkAttributeID_v10_11; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckLinkStatusID_v10_11 { bmdDeckLinkStatusDuplexMode_v10_11 = 0x64757078 } BMDDeckLinkStatusID_v10_11; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDuplexStatus_v10_11 { bmdDuplexFullDuplex_v10_11 = 0x66647570, @@ -2076,46 +2101,27 @@ -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckLinkConfigurationID_v10_9 { bmdDeckLinkConfig1080pNotPsF_v10_9 = 0x6670726f } BMDDeckLinkConfigurationID_v10_9; -typedef /* v1_enum */ -enum _BMDDeckLinkAttributeID_v10_6 - { - BMDDeckLinkSupportsDesktopDisplay_v10_6 = 0x65787464 - } BMDDeckLinkAttributeID_v10_6; - -typedef /* v1_enum */ -enum _BMDIdleVideoOutputOperation_v10_6 - { - bmdIdleVideoOutputDesktop_v10_6 = 0x6465736b - } BMDIdleVideoOutputOperation_v10_6; - -typedef /* v1_enum */ -enum _BMDDeckLinkAttributeID_v10_5 - { - BMDDeckLinkDeviceBusyState_v10_5 = 0x64627374 - } BMDDeckLinkAttributeID_v10_5; - - -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckLinkConfigurationID_v10_4 { bmdDeckLinkConfigSingleLinkVideoOutput_v10_4 = 0x73676c6f } BMDDeckLinkConfigurationID_v10_4; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDDeckLinkConfigurationID_v10_2 { bmdDeckLinkConfig3GBpsVideoOutput_v10_2 = 0x33676273 } BMDDeckLinkConfigurationID_v10_2; -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDAudioConnection_v10_2 { bmdAudioConnectionEmbedded_v10_2 = 0x656d6264, @@ -2126,7 +2132,77 @@ } BMDAudioConnection_v10_2; -typedef /* v1_enum */ +typedef /* v1_enum */ +enum _BMDDeckLinkFrameMetadataID_v11_5 + { + bmdDeckLinkFrameMetadataCintelFilmType_v11_5 = 0x63667479, + bmdDeckLinkFrameMetadataCintelFilmGauge_v11_5 = 0x63666761, + bmdDeckLinkFrameMetadataCintelKeykodeLow_v11_5 = 0x636b6b6c, + bmdDeckLinkFrameMetadataCintelKeykodeHigh_v11_5 = 0x636b6b68, + bmdDeckLinkFrameMetadataCintelTile1Size_v11_5 = 0x63743173, + bmdDeckLinkFrameMetadataCintelTile2Size_v11_5 = 0x63743273, + bmdDeckLinkFrameMetadataCintelTile3Size_v11_5 = 0x63743373, + bmdDeckLinkFrameMetadataCintelTile4Size_v11_5 = 0x63743473, + bmdDeckLinkFrameMetadataCintelImageWidth_v11_5 = 0x49575078, + bmdDeckLinkFrameMetadataCintelImageHeight_v11_5 = 0x49485078, + bmdDeckLinkFrameMetadataCintelLinearMaskingRedInRed_v11_5 = 0x6d726972, + bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInRed_v11_5 = 0x6d676972, + bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInRed_v11_5 = 0x6d626972, + bmdDeckLinkFrameMetadataCintelLinearMaskingRedInGreen_v11_5 = 0x6d726967, + bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInGreen_v11_5 = 0x6d676967, + bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInGreen_v11_5 = 0x6d626967, + bmdDeckLinkFrameMetadataCintelLinearMaskingRedInBlue_v11_5 = 0x6d726962, + bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInBlue_v11_5 = 0x6d676962, + bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInBlue_v11_5 = 0x6d626962, + bmdDeckLinkFrameMetadataCintelLogMaskingRedInRed_v11_5 = 0x6d6c7272, + bmdDeckLinkFrameMetadataCintelLogMaskingGreenInRed_v11_5 = 0x6d6c6772, + bmdDeckLinkFrameMetadataCintelLogMaskingBlueInRed_v11_5 = 0x6d6c6272, + bmdDeckLinkFrameMetadataCintelLogMaskingRedInGreen_v11_5 = 0x6d6c7267, + bmdDeckLinkFrameMetadataCintelLogMaskingGreenInGreen_v11_5 = 0x6d6c6767, + bmdDeckLinkFrameMetadataCintelLogMaskingBlueInGreen_v11_5 = 0x6d6c6267, + bmdDeckLinkFrameMetadataCintelLogMaskingRedInBlue_v11_5 = 0x6d6c7262, + bmdDeckLinkFrameMetadataCintelLogMaskingGreenInBlue_v11_5 = 0x6d6c6762, + bmdDeckLinkFrameMetadataCintelLogMaskingBlueInBlue_v11_5 = 0x6d6c6262, + bmdDeckLinkFrameMetadataCintelFilmFrameRate_v11_5 = 0x63666672, + bmdDeckLinkFrameMetadataCintelOffsetToApplyHorizontal_v11_5 = 0x6f746168, + bmdDeckLinkFrameMetadataCintelOffsetToApplyVertical_v11_5 = 0x6f746176, + bmdDeckLinkFrameMetadataCintelGainRed_v11_5 = 0x4c665264, + bmdDeckLinkFrameMetadataCintelGainGreen_v11_5 = 0x4c664772, + bmdDeckLinkFrameMetadataCintelGainBlue_v11_5 = 0x4c66426c, + bmdDeckLinkFrameMetadataCintelLiftRed_v11_5 = 0x476e5264, + bmdDeckLinkFrameMetadataCintelLiftGreen_v11_5 = 0x476e4772, + bmdDeckLinkFrameMetadataCintelLiftBlue_v11_5 = 0x476e426c, + bmdDeckLinkFrameMetadataCintelHDRGainRed_v11_5 = 0x48475264, + bmdDeckLinkFrameMetadataCintelHDRGainGreen_v11_5 = 0x48474772, + bmdDeckLinkFrameMetadataCintelHDRGainBlue_v11_5 = 0x4847426c, + bmdDeckLinkFrameMetadataCintel16mmCropRequired_v11_5 = 0x63313663, + bmdDeckLinkFrameMetadataCintelInversionRequired_v11_5 = 0x63696e76, + bmdDeckLinkFrameMetadataCintelFlipRequired_v11_5 = 0x63666c72, + bmdDeckLinkFrameMetadataCintelFocusAssistEnabled_v11_5 = 0x63666165, + bmdDeckLinkFrameMetadataCintelKeykodeIsInterpolated_v11_5 = 0x6b6b6969 + } BMDDeckLinkFrameMetadataID_v11_5; + + +typedef /* v1_enum */ +enum _BMDDeckLinkAttributeID_v10_6 + { + BMDDeckLinkSupportsDesktopDisplay_v10_6 = 0x65787464 + } BMDDeckLinkAttributeID_v10_6; + +typedef /* v1_enum */ +enum _BMDIdleVideoOutputOperation_v10_6 + { + bmdIdleVideoOutputDesktop_v10_6 = 0x6465736b + } BMDIdleVideoOutputOperation_v10_6; + +typedef /* v1_enum */ +enum _BMDDeckLinkAttributeID_v10_5 + { + BMDDeckLinkDeviceBusyState_v10_5 = 0x64627374 + } BMDDeckLinkAttributeID_v10_5; + + +typedef /* v1_enum */ enum _BMDDeckControlVTRControlState_v8_1 { bmdDeckControlNotInVTRControlMode_v8_1 = 0x6e76636d, @@ -2139,7 +2215,7 @@ -typedef /* v1_enum */ +typedef /* v1_enum */ enum _BMDVideoConnection_v7_6 { bmdVideoConnectionSDI_v7_6 = 0x73646920, @@ -2178,75 +2254,83 @@ #define __IDeckLinkTimecode_INTERFACE_DEFINED__ /* interface IDeckLinkTimecode */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkTimecode; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("BC6CFBD3-8317-4325-AC1C-1216391E9340") IDeckLinkTimecode : public IUnknown { public: virtual BMDTimecodeBCD STDMETHODCALLTYPE GetBCD( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetComponents( + + virtual HRESULT STDMETHODCALLTYPE GetComponents( /* out */ unsigned char *hours, /* out */ unsigned char *minutes, /* out */ unsigned char *seconds, /* out */ unsigned char *frames) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* out */ BSTR *timecode) = 0; - + virtual BMDTimecodeFlags STDMETHODCALLTYPE GetFlags( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecodeUserBits( + + virtual HRESULT STDMETHODCALLTYPE GetTimecodeUserBits( /* out */ BMDTimecodeUserBits *userBits) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkTimecodeVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkTimecode * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkTimecode * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkTimecode * This); - - BMDTimecodeBCD ( STDMETHODCALLTYPE *GetBCD )( + + DECLSPEC_XFGVIRT(IDeckLinkTimecode, GetBCD) + BMDTimecodeBCD ( STDMETHODCALLTYPE *GetBCD )( IDeckLinkTimecode * This); - - HRESULT ( STDMETHODCALLTYPE *GetComponents )( + + DECLSPEC_XFGVIRT(IDeckLinkTimecode, GetComponents) + HRESULT ( STDMETHODCALLTYPE *GetComponents )( IDeckLinkTimecode * This, /* out */ unsigned char *hours, /* out */ unsigned char *minutes, /* out */ unsigned char *seconds, /* out */ unsigned char *frames); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IDeckLinkTimecode, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IDeckLinkTimecode * This, /* out */ BSTR *timecode); - - BMDTimecodeFlags ( STDMETHODCALLTYPE *GetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkTimecode, GetFlags) + BMDTimecodeFlags ( STDMETHODCALLTYPE *GetFlags )( IDeckLinkTimecode * This); - - HRESULT ( STDMETHODCALLTYPE *GetTimecodeUserBits )( + + DECLSPEC_XFGVIRT(IDeckLinkTimecode, GetTimecodeUserBits) + HRESULT ( STDMETHODCALLTYPE *GetTimecodeUserBits )( IDeckLinkTimecode * This, /* out */ BMDTimecodeUserBits *userBits); - + END_INTERFACE } IDeckLinkTimecodeVtbl; @@ -2255,35 +2339,35 @@ CONST_VTBL struct IDeckLinkTimecodeVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkTimecode_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkTimecode_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkTimecode_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkTimecode_GetBCD(This) \ - ( (This)->lpVtbl -> GetBCD(This) ) + ( (This)->lpVtbl -> GetBCD(This) ) #define IDeckLinkTimecode_GetComponents(This,hours,minutes,seconds,frames) \ - ( (This)->lpVtbl -> GetComponents(This,hours,minutes,seconds,frames) ) + ( (This)->lpVtbl -> GetComponents(This,hours,minutes,seconds,frames) ) #define IDeckLinkTimecode_GetString(This,timecode) \ - ( (This)->lpVtbl -> GetString(This,timecode) ) + ( (This)->lpVtbl -> GetString(This,timecode) ) #define IDeckLinkTimecode_GetFlags(This) \ - ( (This)->lpVtbl -> GetFlags(This) ) + ( (This)->lpVtbl -> GetFlags(This) ) #define IDeckLinkTimecode_GetTimecodeUserBits(This,userBits) \ - ( (This)->lpVtbl -> GetTimecodeUserBits(This,userBits) ) + ( (This)->lpVtbl -> GetTimecodeUserBits(This,userBits) ) #endif /* COBJMACROS */ @@ -2300,45 +2384,49 @@ #define __IDeckLinkDisplayModeIterator_INTERFACE_DEFINED__ /* interface IDeckLinkDisplayModeIterator */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkDisplayModeIterator; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("9C88499F-F601-4021-B80B-032E4EB41C35") IDeckLinkDisplayModeIterator : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Next( + virtual HRESULT STDMETHODCALLTYPE Next( /* out */ IDeckLinkDisplayMode **deckLinkDisplayMode) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDisplayModeIteratorVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDisplayModeIterator * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDisplayModeIterator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDisplayModeIterator * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayModeIterator, Next) + HRESULT ( STDMETHODCALLTYPE *Next )( IDeckLinkDisplayModeIterator * This, /* out */ IDeckLinkDisplayMode **deckLinkDisplayMode); - + END_INTERFACE } IDeckLinkDisplayModeIteratorVtbl; @@ -2347,23 +2435,23 @@ CONST_VTBL struct IDeckLinkDisplayModeIteratorVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDisplayModeIterator_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDisplayModeIterator_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDisplayModeIterator_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDisplayModeIterator_Next(This,deckLinkDisplayMode) \ - ( (This)->lpVtbl -> Next(This,deckLinkDisplayMode) ) + ( (This)->lpVtbl -> Next(This,deckLinkDisplayMode) ) #endif /* COBJMACROS */ @@ -2380,79 +2468,89 @@ #define __IDeckLinkDisplayMode_INTERFACE_DEFINED__ /* interface IDeckLinkDisplayMode */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkDisplayMode; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("3EB2C1AB-0A3D-4523-A3AD-F40D7FB14E78") IDeckLinkDisplayMode : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetName( + virtual HRESULT STDMETHODCALLTYPE GetName( /* out */ BSTR *name) = 0; - + virtual BMDDisplayMode STDMETHODCALLTYPE GetDisplayMode( void) = 0; - + virtual long STDMETHODCALLTYPE GetWidth( void) = 0; - + virtual long STDMETHODCALLTYPE GetHeight( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFrameRate( + + virtual HRESULT STDMETHODCALLTYPE GetFrameRate( /* out */ BMDTimeValue *frameDuration, /* out */ BMDTimeScale *timeScale) = 0; - + virtual BMDFieldDominance STDMETHODCALLTYPE GetFieldDominance( void) = 0; - + virtual BMDDisplayModeFlags STDMETHODCALLTYPE GetFlags( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDisplayModeVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDisplayMode * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDisplayMode * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDisplayMode * This); - - HRESULT ( STDMETHODCALLTYPE *GetName )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode, GetName) + HRESULT ( STDMETHODCALLTYPE *GetName )( IDeckLinkDisplayMode * This, /* out */ BSTR *name); - - BMDDisplayMode ( STDMETHODCALLTYPE *GetDisplayMode )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode, GetDisplayMode) + BMDDisplayMode ( STDMETHODCALLTYPE *GetDisplayMode )( IDeckLinkDisplayMode * This); - - long ( STDMETHODCALLTYPE *GetWidth )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode, GetWidth) + long ( STDMETHODCALLTYPE *GetWidth )( IDeckLinkDisplayMode * This); - - long ( STDMETHODCALLTYPE *GetHeight )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode, GetHeight) + long ( STDMETHODCALLTYPE *GetHeight )( IDeckLinkDisplayMode * This); - - HRESULT ( STDMETHODCALLTYPE *GetFrameRate )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode, GetFrameRate) + HRESULT ( STDMETHODCALLTYPE *GetFrameRate )( IDeckLinkDisplayMode * This, /* out */ BMDTimeValue *frameDuration, /* out */ BMDTimeScale *timeScale); - - BMDFieldDominance ( STDMETHODCALLTYPE *GetFieldDominance )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode, GetFieldDominance) + BMDFieldDominance ( STDMETHODCALLTYPE *GetFieldDominance )( IDeckLinkDisplayMode * This); - - BMDDisplayModeFlags ( STDMETHODCALLTYPE *GetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode, GetFlags) + BMDDisplayModeFlags ( STDMETHODCALLTYPE *GetFlags )( IDeckLinkDisplayMode * This); - + END_INTERFACE } IDeckLinkDisplayModeVtbl; @@ -2461,41 +2559,41 @@ CONST_VTBL struct IDeckLinkDisplayModeVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDisplayMode_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDisplayMode_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDisplayMode_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDisplayMode_GetName(This,name) \ - ( (This)->lpVtbl -> GetName(This,name) ) + ( (This)->lpVtbl -> GetName(This,name) ) #define IDeckLinkDisplayMode_GetDisplayMode(This) \ - ( (This)->lpVtbl -> GetDisplayMode(This) ) + ( (This)->lpVtbl -> GetDisplayMode(This) ) #define IDeckLinkDisplayMode_GetWidth(This) \ - ( (This)->lpVtbl -> GetWidth(This) ) + ( (This)->lpVtbl -> GetWidth(This) ) #define IDeckLinkDisplayMode_GetHeight(This) \ - ( (This)->lpVtbl -> GetHeight(This) ) + ( (This)->lpVtbl -> GetHeight(This) ) #define IDeckLinkDisplayMode_GetFrameRate(This,frameDuration,timeScale) \ - ( (This)->lpVtbl -> GetFrameRate(This,frameDuration,timeScale) ) + ( (This)->lpVtbl -> GetFrameRate(This,frameDuration,timeScale) ) #define IDeckLinkDisplayMode_GetFieldDominance(This) \ - ( (This)->lpVtbl -> GetFieldDominance(This) ) + ( (This)->lpVtbl -> GetFieldDominance(This) ) #define IDeckLinkDisplayMode_GetFlags(This) \ - ( (This)->lpVtbl -> GetFlags(This) ) + ( (This)->lpVtbl -> GetFlags(This) ) #endif /* COBJMACROS */ @@ -2512,52 +2610,57 @@ #define __IDeckLink_INTERFACE_DEFINED__ /* interface IDeckLink */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLink; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("C418FBDD-0587-48ED-8FE5-640F0A14AF91") IDeckLink : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetModelName( + virtual HRESULT STDMETHODCALLTYPE GetModelName( /* out */ BSTR *modelName) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayName( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayName( /* out */ BSTR *displayName) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLink * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLink * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLink * This); - - HRESULT ( STDMETHODCALLTYPE *GetModelName )( + + DECLSPEC_XFGVIRT(IDeckLink, GetModelName) + HRESULT ( STDMETHODCALLTYPE *GetModelName )( IDeckLink * This, /* out */ BSTR *modelName); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayName )( + + DECLSPEC_XFGVIRT(IDeckLink, GetDisplayName) + HRESULT ( STDMETHODCALLTYPE *GetDisplayName )( IDeckLink * This, /* out */ BSTR *displayName); - + END_INTERFACE } IDeckLinkVtbl; @@ -2566,26 +2669,26 @@ CONST_VTBL struct IDeckLinkVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLink_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLink_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLink_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLink_GetModelName(This,modelName) \ - ( (This)->lpVtbl -> GetModelName(This,modelName) ) + ( (This)->lpVtbl -> GetModelName(This,modelName) ) #define IDeckLink_GetDisplayName(This,displayName) \ - ( (This)->lpVtbl -> GetDisplayName(This,displayName) ) + ( (This)->lpVtbl -> GetDisplayName(This,displayName) ) #endif /* COBJMACROS */ @@ -2602,115 +2705,127 @@ #define __IDeckLinkConfiguration_INTERFACE_DEFINED__ /* interface IDeckLinkConfiguration */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkConfiguration; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("912F634B-2D4E-40A4-8AAB-8D80B73F1289") IDeckLinkConfiguration : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE SetFlag( + virtual HRESULT STDMETHODCALLTYPE SetFlag( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BOOL value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFlag( + + virtual HRESULT STDMETHODCALLTYPE GetFlag( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BOOL *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInt( + + virtual HRESULT STDMETHODCALLTYPE SetInt( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ LONGLONG value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInt( + + virtual HRESULT STDMETHODCALLTYPE GetInt( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ LONGLONG *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFloat( + + virtual HRESULT STDMETHODCALLTYPE SetFloat( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFloat( + + virtual HRESULT STDMETHODCALLTYPE GetFloat( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetString( + + virtual HRESULT STDMETHODCALLTYPE SetString( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BSTR value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BSTR *value) = 0; - + virtual HRESULT STDMETHODCALLTYPE WriteConfigurationToPreferences( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkConfigurationVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkConfiguration * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkConfiguration * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkConfiguration * This); - - HRESULT ( STDMETHODCALLTYPE *SetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration, SetFlag) + HRESULT ( STDMETHODCALLTYPE *SetFlag )( IDeckLinkConfiguration * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BOOL value); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( IDeckLinkConfiguration * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *SetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration, SetInt) + HRESULT ( STDMETHODCALLTYPE *SetInt )( IDeckLinkConfiguration * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ LONGLONG value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IDeckLinkConfiguration * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *SetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration, SetFloat) + HRESULT ( STDMETHODCALLTYPE *SetFloat )( IDeckLinkConfiguration * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( IDeckLinkConfiguration * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *SetString )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration, SetString) + HRESULT ( STDMETHODCALLTYPE *SetString )( IDeckLinkConfiguration * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BSTR value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IDeckLinkConfiguration * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BSTR *value); - - HRESULT ( STDMETHODCALLTYPE *WriteConfigurationToPreferences )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration, WriteConfigurationToPreferences) + HRESULT ( STDMETHODCALLTYPE *WriteConfigurationToPreferences )( IDeckLinkConfiguration * This); - + END_INTERFACE } IDeckLinkConfigurationVtbl; @@ -2719,47 +2834,47 @@ CONST_VTBL struct IDeckLinkConfigurationVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkConfiguration_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkConfiguration_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkConfiguration_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkConfiguration_SetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) #define IDeckLinkConfiguration_GetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) #define IDeckLinkConfiguration_SetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) #define IDeckLinkConfiguration_GetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) #define IDeckLinkConfiguration_SetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) #define IDeckLinkConfiguration_GetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) #define IDeckLinkConfiguration_SetString(This,cfgID,value) \ - ( (This)->lpVtbl -> SetString(This,cfgID,value) ) + ( (This)->lpVtbl -> SetString(This,cfgID,value) ) #define IDeckLinkConfiguration_GetString(This,cfgID,value) \ - ( (This)->lpVtbl -> GetString(This,cfgID,value) ) + ( (This)->lpVtbl -> GetString(This,cfgID,value) ) #define IDeckLinkConfiguration_WriteConfigurationToPreferences(This) \ - ( (This)->lpVtbl -> WriteConfigurationToPreferences(This) ) + ( (This)->lpVtbl -> WriteConfigurationToPreferences(This) ) #endif /* COBJMACROS */ @@ -2776,121 +2891,133 @@ #define __IDeckLinkEncoderConfiguration_INTERFACE_DEFINED__ /* interface IDeckLinkEncoderConfiguration */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkEncoderConfiguration; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("138050E5-C60A-4552-BF3F-0F358049327E") IDeckLinkEncoderConfiguration : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE SetFlag( + virtual HRESULT STDMETHODCALLTYPE SetFlag( /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ BOOL value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFlag( + + virtual HRESULT STDMETHODCALLTYPE GetFlag( /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ BOOL *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInt( + + virtual HRESULT STDMETHODCALLTYPE SetInt( /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ LONGLONG value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInt( + + virtual HRESULT STDMETHODCALLTYPE GetInt( /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ LONGLONG *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFloat( + + virtual HRESULT STDMETHODCALLTYPE SetFloat( /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ double value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFloat( + + virtual HRESULT STDMETHODCALLTYPE GetFloat( /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ double *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetString( + + virtual HRESULT STDMETHODCALLTYPE SetString( /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ BSTR value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ BSTR *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBytes( + + virtual HRESULT STDMETHODCALLTYPE GetBytes( /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ void *buffer, /* outin */ unsigned int *bufferSize) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkEncoderConfigurationVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkEncoderConfiguration * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkEncoderConfiguration * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkEncoderConfiguration * This); - - HRESULT ( STDMETHODCALLTYPE *SetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration, SetFlag) + HRESULT ( STDMETHODCALLTYPE *SetFlag )( IDeckLinkEncoderConfiguration * This, /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ BOOL value); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( IDeckLinkEncoderConfiguration * This, /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *SetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration, SetInt) + HRESULT ( STDMETHODCALLTYPE *SetInt )( IDeckLinkEncoderConfiguration * This, /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ LONGLONG value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IDeckLinkEncoderConfiguration * This, /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *SetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration, SetFloat) + HRESULT ( STDMETHODCALLTYPE *SetFloat )( IDeckLinkEncoderConfiguration * This, /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ double value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( IDeckLinkEncoderConfiguration * This, /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *SetString )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration, SetString) + HRESULT ( STDMETHODCALLTYPE *SetString )( IDeckLinkEncoderConfiguration * This, /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ BSTR value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IDeckLinkEncoderConfiguration * This, /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ BSTR *value); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkEncoderConfiguration * This, /* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ void *buffer, /* outin */ unsigned int *bufferSize); - + END_INTERFACE } IDeckLinkEncoderConfigurationVtbl; @@ -2899,47 +3026,47 @@ CONST_VTBL struct IDeckLinkEncoderConfigurationVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkEncoderConfiguration_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkEncoderConfiguration_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkEncoderConfiguration_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkEncoderConfiguration_SetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) #define IDeckLinkEncoderConfiguration_GetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) #define IDeckLinkEncoderConfiguration_SetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) #define IDeckLinkEncoderConfiguration_GetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) #define IDeckLinkEncoderConfiguration_SetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) #define IDeckLinkEncoderConfiguration_GetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) #define IDeckLinkEncoderConfiguration_SetString(This,cfgID,value) \ - ( (This)->lpVtbl -> SetString(This,cfgID,value) ) + ( (This)->lpVtbl -> SetString(This,cfgID,value) ) #define IDeckLinkEncoderConfiguration_GetString(This,cfgID,value) \ - ( (This)->lpVtbl -> GetString(This,cfgID,value) ) + ( (This)->lpVtbl -> GetString(This,cfgID,value) ) #define IDeckLinkEncoderConfiguration_GetBytes(This,cfgID,buffer,bufferSize) \ - ( (This)->lpVtbl -> GetBytes(This,cfgID,buffer,bufferSize) ) + ( (This)->lpVtbl -> GetBytes(This,cfgID,buffer,bufferSize) ) #endif /* COBJMACROS */ @@ -2956,72 +3083,79 @@ #define __IDeckLinkDeckControlStatusCallback_INTERFACE_DEFINED__ /* interface IDeckLinkDeckControlStatusCallback */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkDeckControlStatusCallback; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("53436FFB-B434-4906-BADC-AE3060FFE8EF") IDeckLinkDeckControlStatusCallback : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE TimecodeUpdate( + virtual HRESULT STDMETHODCALLTYPE TimecodeUpdate( /* in */ BMDTimecodeBCD currentTimecode) = 0; - - virtual HRESULT STDMETHODCALLTYPE VTRControlStateChanged( + + virtual HRESULT STDMETHODCALLTYPE VTRControlStateChanged( /* in */ BMDDeckControlVTRControlState newState, /* in */ BMDDeckControlError error) = 0; - - virtual HRESULT STDMETHODCALLTYPE DeckControlEventReceived( + + virtual HRESULT STDMETHODCALLTYPE DeckControlEventReceived( /* in */ BMDDeckControlEvent event, /* in */ BMDDeckControlError error) = 0; - - virtual HRESULT STDMETHODCALLTYPE DeckControlStatusChanged( + + virtual HRESULT STDMETHODCALLTYPE DeckControlStatusChanged( /* in */ BMDDeckControlStatusFlags flags, /* in */ unsigned int mask) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDeckControlStatusCallbackVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDeckControlStatusCallback * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDeckControlStatusCallback * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDeckControlStatusCallback * This); - - HRESULT ( STDMETHODCALLTYPE *TimecodeUpdate )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControlStatusCallback, TimecodeUpdate) + HRESULT ( STDMETHODCALLTYPE *TimecodeUpdate )( IDeckLinkDeckControlStatusCallback * This, /* in */ BMDTimecodeBCD currentTimecode); - - HRESULT ( STDMETHODCALLTYPE *VTRControlStateChanged )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControlStatusCallback, VTRControlStateChanged) + HRESULT ( STDMETHODCALLTYPE *VTRControlStateChanged )( IDeckLinkDeckControlStatusCallback * This, /* in */ BMDDeckControlVTRControlState newState, /* in */ BMDDeckControlError error); - - HRESULT ( STDMETHODCALLTYPE *DeckControlEventReceived )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControlStatusCallback, DeckControlEventReceived) + HRESULT ( STDMETHODCALLTYPE *DeckControlEventReceived )( IDeckLinkDeckControlStatusCallback * This, /* in */ BMDDeckControlEvent event, /* in */ BMDDeckControlError error); - - HRESULT ( STDMETHODCALLTYPE *DeckControlStatusChanged )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControlStatusCallback, DeckControlStatusChanged) + HRESULT ( STDMETHODCALLTYPE *DeckControlStatusChanged )( IDeckLinkDeckControlStatusCallback * This, /* in */ BMDDeckControlStatusFlags flags, /* in */ unsigned int mask); - + END_INTERFACE } IDeckLinkDeckControlStatusCallbackVtbl; @@ -3030,32 +3164,32 @@ CONST_VTBL struct IDeckLinkDeckControlStatusCallbackVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDeckControlStatusCallback_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDeckControlStatusCallback_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDeckControlStatusCallback_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDeckControlStatusCallback_TimecodeUpdate(This,currentTimecode) \ - ( (This)->lpVtbl -> TimecodeUpdate(This,currentTimecode) ) + ( (This)->lpVtbl -> TimecodeUpdate(This,currentTimecode) ) #define IDeckLinkDeckControlStatusCallback_VTRControlStateChanged(This,newState,error) \ - ( (This)->lpVtbl -> VTRControlStateChanged(This,newState,error) ) + ( (This)->lpVtbl -> VTRControlStateChanged(This,newState,error) ) #define IDeckLinkDeckControlStatusCallback_DeckControlEventReceived(This,event,error) \ - ( (This)->lpVtbl -> DeckControlEventReceived(This,event,error) ) + ( (This)->lpVtbl -> DeckControlEventReceived(This,event,error) ) #define IDeckLinkDeckControlStatusCallback_DeckControlStatusChanged(This,flags,mask) \ - ( (This)->lpVtbl -> DeckControlStatusChanged(This,flags,mask) ) + ( (This)->lpVtbl -> DeckControlStatusChanged(This,flags,mask) ) #endif /* COBJMACROS */ @@ -3072,183 +3206,191 @@ #define __IDeckLinkDeckControl_INTERFACE_DEFINED__ /* interface IDeckLinkDeckControl */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkDeckControl; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("8E1C3ACE-19C7-4E00-8B92-D80431D958BE") IDeckLinkDeckControl : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Open( + virtual HRESULT STDMETHODCALLTYPE Open( /* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ BOOL timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Close( + + virtual HRESULT STDMETHODCALLTYPE Close( /* in */ BOOL standbyOn) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentState( + + virtual HRESULT STDMETHODCALLTYPE GetCurrentState( /* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetStandby( + + virtual HRESULT STDMETHODCALLTYPE SetStandby( /* in */ BOOL standbyOn) = 0; - - virtual HRESULT STDMETHODCALLTYPE SendCommand( + + virtual HRESULT STDMETHODCALLTYPE SendCommand( /* in */ unsigned char *inBuffer, /* in */ unsigned int inBufferSize, /* out */ unsigned char *outBuffer, /* out */ unsigned int *outDataSize, /* in */ unsigned int outBufferSize, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Play( + + virtual HRESULT STDMETHODCALLTYPE Play( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Stop( + + virtual HRESULT STDMETHODCALLTYPE Stop( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE TogglePlayStop( + + virtual HRESULT STDMETHODCALLTYPE TogglePlayStop( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Eject( + + virtual HRESULT STDMETHODCALLTYPE Eject( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GoToTimecode( + + virtual HRESULT STDMETHODCALLTYPE GoToTimecode( /* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE FastForward( + + virtual HRESULT STDMETHODCALLTYPE FastForward( /* in */ BOOL viewTape, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Rewind( + + virtual HRESULT STDMETHODCALLTYPE Rewind( /* in */ BOOL viewTape, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE StepForward( + + virtual HRESULT STDMETHODCALLTYPE StepForward( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE StepBack( + + virtual HRESULT STDMETHODCALLTYPE StepBack( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Jog( + + virtual HRESULT STDMETHODCALLTYPE Jog( /* in */ double rate, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Shuttle( + + virtual HRESULT STDMETHODCALLTYPE Shuttle( /* in */ double rate, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecodeString( + + virtual HRESULT STDMETHODCALLTYPE GetTimecodeString( /* out */ BSTR *currentTimeCode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecode( + + virtual HRESULT STDMETHODCALLTYPE GetTimecode( /* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecodeBCD( + + virtual HRESULT STDMETHODCALLTYPE GetTimecodeBCD( /* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetPreroll( + + virtual HRESULT STDMETHODCALLTYPE SetPreroll( /* in */ unsigned int prerollSeconds) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPreroll( + + virtual HRESULT STDMETHODCALLTYPE GetPreroll( /* out */ unsigned int *prerollSeconds) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetExportOffset( + + virtual HRESULT STDMETHODCALLTYPE SetExportOffset( /* in */ int exportOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetExportOffset( + + virtual HRESULT STDMETHODCALLTYPE GetExportOffset( /* out */ int *exportOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetManualExportOffset( + + virtual HRESULT STDMETHODCALLTYPE GetManualExportOffset( /* out */ int *deckManualExportOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCaptureOffset( + + virtual HRESULT STDMETHODCALLTYPE SetCaptureOffset( /* in */ int captureOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCaptureOffset( + + virtual HRESULT STDMETHODCALLTYPE GetCaptureOffset( /* out */ int *captureOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE StartExport( + + virtual HRESULT STDMETHODCALLTYPE StartExport( /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE StartCapture( + + virtual HRESULT STDMETHODCALLTYPE StartCapture( /* in */ BOOL useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDeviceID( + + virtual HRESULT STDMETHODCALLTYPE GetDeviceID( /* out */ unsigned short *deviceId, /* out */ BMDDeckControlError *error) = 0; - + virtual HRESULT STDMETHODCALLTYPE Abort( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE CrashRecordStart( + + virtual HRESULT STDMETHODCALLTYPE CrashRecordStart( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE CrashRecordStop( + + virtual HRESULT STDMETHODCALLTYPE CrashRecordStop( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( + + virtual HRESULT STDMETHODCALLTYPE SetCallback( /* in */ IDeckLinkDeckControlStatusCallback *callback) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDeckControlVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDeckControl * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDeckControl * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDeckControl * This); - - HRESULT ( STDMETHODCALLTYPE *Open )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, Open) + HRESULT ( STDMETHODCALLTYPE *Open )( IDeckLinkDeckControl * This, /* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ BOOL timecodeIsDropFrame, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Close )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, Close) + HRESULT ( STDMETHODCALLTYPE *Close )( IDeckLinkDeckControl * This, /* in */ BOOL standbyOn); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentState )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, GetCurrentState) + HRESULT ( STDMETHODCALLTYPE *GetCurrentState )( IDeckLinkDeckControl * This, /* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags); - - HRESULT ( STDMETHODCALLTYPE *SetStandby )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, SetStandby) + HRESULT ( STDMETHODCALLTYPE *SetStandby )( IDeckLinkDeckControl * This, /* in */ BOOL standbyOn); - - HRESULT ( STDMETHODCALLTYPE *SendCommand )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, SendCommand) + HRESULT ( STDMETHODCALLTYPE *SendCommand )( IDeckLinkDeckControl * This, /* in */ unsigned char *inBuffer, /* in */ unsigned int inBufferSize, @@ -3256,133 +3398,161 @@ /* out */ unsigned int *outDataSize, /* in */ unsigned int outBufferSize, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Play )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, Play) + HRESULT ( STDMETHODCALLTYPE *Play )( IDeckLinkDeckControl * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Stop )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, Stop) + HRESULT ( STDMETHODCALLTYPE *Stop )( IDeckLinkDeckControl * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *TogglePlayStop )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, TogglePlayStop) + HRESULT ( STDMETHODCALLTYPE *TogglePlayStop )( IDeckLinkDeckControl * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Eject )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, Eject) + HRESULT ( STDMETHODCALLTYPE *Eject )( IDeckLinkDeckControl * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GoToTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, GoToTimecode) + HRESULT ( STDMETHODCALLTYPE *GoToTimecode )( IDeckLinkDeckControl * This, /* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *FastForward )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, FastForward) + HRESULT ( STDMETHODCALLTYPE *FastForward )( IDeckLinkDeckControl * This, /* in */ BOOL viewTape, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Rewind )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, Rewind) + HRESULT ( STDMETHODCALLTYPE *Rewind )( IDeckLinkDeckControl * This, /* in */ BOOL viewTape, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *StepForward )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, StepForward) + HRESULT ( STDMETHODCALLTYPE *StepForward )( IDeckLinkDeckControl * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *StepBack )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, StepBack) + HRESULT ( STDMETHODCALLTYPE *StepBack )( IDeckLinkDeckControl * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Jog )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, Jog) + HRESULT ( STDMETHODCALLTYPE *Jog )( IDeckLinkDeckControl * This, /* in */ double rate, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Shuttle )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, Shuttle) + HRESULT ( STDMETHODCALLTYPE *Shuttle )( IDeckLinkDeckControl * This, /* in */ double rate, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GetTimecodeString )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, GetTimecodeString) + HRESULT ( STDMETHODCALLTYPE *GetTimecodeString )( IDeckLinkDeckControl * This, /* out */ BSTR *currentTimeCode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, GetTimecode) + HRESULT ( STDMETHODCALLTYPE *GetTimecode )( IDeckLinkDeckControl * This, /* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GetTimecodeBCD )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, GetTimecodeBCD) + HRESULT ( STDMETHODCALLTYPE *GetTimecodeBCD )( IDeckLinkDeckControl * This, /* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *SetPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, SetPreroll) + HRESULT ( STDMETHODCALLTYPE *SetPreroll )( IDeckLinkDeckControl * This, /* in */ unsigned int prerollSeconds); - - HRESULT ( STDMETHODCALLTYPE *GetPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, GetPreroll) + HRESULT ( STDMETHODCALLTYPE *GetPreroll )( IDeckLinkDeckControl * This, /* out */ unsigned int *prerollSeconds); - - HRESULT ( STDMETHODCALLTYPE *SetExportOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, SetExportOffset) + HRESULT ( STDMETHODCALLTYPE *SetExportOffset )( IDeckLinkDeckControl * This, /* in */ int exportOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *GetExportOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, GetExportOffset) + HRESULT ( STDMETHODCALLTYPE *GetExportOffset )( IDeckLinkDeckControl * This, /* out */ int *exportOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *GetManualExportOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, GetManualExportOffset) + HRESULT ( STDMETHODCALLTYPE *GetManualExportOffset )( IDeckLinkDeckControl * This, /* out */ int *deckManualExportOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *SetCaptureOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, SetCaptureOffset) + HRESULT ( STDMETHODCALLTYPE *SetCaptureOffset )( IDeckLinkDeckControl * This, /* in */ int captureOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *GetCaptureOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, GetCaptureOffset) + HRESULT ( STDMETHODCALLTYPE *GetCaptureOffset )( IDeckLinkDeckControl * This, /* out */ int *captureOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *StartExport )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, StartExport) + HRESULT ( STDMETHODCALLTYPE *StartExport )( IDeckLinkDeckControl * This, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *StartCapture )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, StartCapture) + HRESULT ( STDMETHODCALLTYPE *StartCapture )( IDeckLinkDeckControl * This, /* in */ BOOL useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GetDeviceID )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, GetDeviceID) + HRESULT ( STDMETHODCALLTYPE *GetDeviceID )( IDeckLinkDeckControl * This, /* out */ unsigned short *deviceId, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Abort )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, Abort) + HRESULT ( STDMETHODCALLTYPE *Abort )( IDeckLinkDeckControl * This); - - HRESULT ( STDMETHODCALLTYPE *CrashRecordStart )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, CrashRecordStart) + HRESULT ( STDMETHODCALLTYPE *CrashRecordStart )( IDeckLinkDeckControl * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *CrashRecordStop )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, CrashRecordStop) + HRESULT ( STDMETHODCALLTYPE *CrashRecordStop )( IDeckLinkDeckControl * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( IDeckLinkDeckControl * This, /* in */ IDeckLinkDeckControlStatusCallback *callback); - + END_INTERFACE } IDeckLinkDeckControlVtbl; @@ -3391,119 +3561,119 @@ CONST_VTBL struct IDeckLinkDeckControlVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDeckControl_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDeckControl_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDeckControl_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDeckControl_Open(This,timeScale,timeValue,timecodeIsDropFrame,error) \ - ( (This)->lpVtbl -> Open(This,timeScale,timeValue,timecodeIsDropFrame,error) ) + ( (This)->lpVtbl -> Open(This,timeScale,timeValue,timecodeIsDropFrame,error) ) #define IDeckLinkDeckControl_Close(This,standbyOn) \ - ( (This)->lpVtbl -> Close(This,standbyOn) ) + ( (This)->lpVtbl -> Close(This,standbyOn) ) #define IDeckLinkDeckControl_GetCurrentState(This,mode,vtrControlState,flags) \ - ( (This)->lpVtbl -> GetCurrentState(This,mode,vtrControlState,flags) ) + ( (This)->lpVtbl -> GetCurrentState(This,mode,vtrControlState,flags) ) #define IDeckLinkDeckControl_SetStandby(This,standbyOn) \ - ( (This)->lpVtbl -> SetStandby(This,standbyOn) ) + ( (This)->lpVtbl -> SetStandby(This,standbyOn) ) #define IDeckLinkDeckControl_SendCommand(This,inBuffer,inBufferSize,outBuffer,outDataSize,outBufferSize,error) \ - ( (This)->lpVtbl -> SendCommand(This,inBuffer,inBufferSize,outBuffer,outDataSize,outBufferSize,error) ) + ( (This)->lpVtbl -> SendCommand(This,inBuffer,inBufferSize,outBuffer,outDataSize,outBufferSize,error) ) #define IDeckLinkDeckControl_Play(This,error) \ - ( (This)->lpVtbl -> Play(This,error) ) + ( (This)->lpVtbl -> Play(This,error) ) #define IDeckLinkDeckControl_Stop(This,error) \ - ( (This)->lpVtbl -> Stop(This,error) ) + ( (This)->lpVtbl -> Stop(This,error) ) #define IDeckLinkDeckControl_TogglePlayStop(This,error) \ - ( (This)->lpVtbl -> TogglePlayStop(This,error) ) + ( (This)->lpVtbl -> TogglePlayStop(This,error) ) #define IDeckLinkDeckControl_Eject(This,error) \ - ( (This)->lpVtbl -> Eject(This,error) ) + ( (This)->lpVtbl -> Eject(This,error) ) #define IDeckLinkDeckControl_GoToTimecode(This,timecode,error) \ - ( (This)->lpVtbl -> GoToTimecode(This,timecode,error) ) + ( (This)->lpVtbl -> GoToTimecode(This,timecode,error) ) #define IDeckLinkDeckControl_FastForward(This,viewTape,error) \ - ( (This)->lpVtbl -> FastForward(This,viewTape,error) ) + ( (This)->lpVtbl -> FastForward(This,viewTape,error) ) #define IDeckLinkDeckControl_Rewind(This,viewTape,error) \ - ( (This)->lpVtbl -> Rewind(This,viewTape,error) ) + ( (This)->lpVtbl -> Rewind(This,viewTape,error) ) #define IDeckLinkDeckControl_StepForward(This,error) \ - ( (This)->lpVtbl -> StepForward(This,error) ) + ( (This)->lpVtbl -> StepForward(This,error) ) #define IDeckLinkDeckControl_StepBack(This,error) \ - ( (This)->lpVtbl -> StepBack(This,error) ) + ( (This)->lpVtbl -> StepBack(This,error) ) #define IDeckLinkDeckControl_Jog(This,rate,error) \ - ( (This)->lpVtbl -> Jog(This,rate,error) ) + ( (This)->lpVtbl -> Jog(This,rate,error) ) #define IDeckLinkDeckControl_Shuttle(This,rate,error) \ - ( (This)->lpVtbl -> Shuttle(This,rate,error) ) + ( (This)->lpVtbl -> Shuttle(This,rate,error) ) #define IDeckLinkDeckControl_GetTimecodeString(This,currentTimeCode,error) \ - ( (This)->lpVtbl -> GetTimecodeString(This,currentTimeCode,error) ) + ( (This)->lpVtbl -> GetTimecodeString(This,currentTimeCode,error) ) #define IDeckLinkDeckControl_GetTimecode(This,currentTimecode,error) \ - ( (This)->lpVtbl -> GetTimecode(This,currentTimecode,error) ) + ( (This)->lpVtbl -> GetTimecode(This,currentTimecode,error) ) #define IDeckLinkDeckControl_GetTimecodeBCD(This,currentTimecode,error) \ - ( (This)->lpVtbl -> GetTimecodeBCD(This,currentTimecode,error) ) + ( (This)->lpVtbl -> GetTimecodeBCD(This,currentTimecode,error) ) #define IDeckLinkDeckControl_SetPreroll(This,prerollSeconds) \ - ( (This)->lpVtbl -> SetPreroll(This,prerollSeconds) ) + ( (This)->lpVtbl -> SetPreroll(This,prerollSeconds) ) #define IDeckLinkDeckControl_GetPreroll(This,prerollSeconds) \ - ( (This)->lpVtbl -> GetPreroll(This,prerollSeconds) ) + ( (This)->lpVtbl -> GetPreroll(This,prerollSeconds) ) #define IDeckLinkDeckControl_SetExportOffset(This,exportOffsetFields) \ - ( (This)->lpVtbl -> SetExportOffset(This,exportOffsetFields) ) + ( (This)->lpVtbl -> SetExportOffset(This,exportOffsetFields) ) #define IDeckLinkDeckControl_GetExportOffset(This,exportOffsetFields) \ - ( (This)->lpVtbl -> GetExportOffset(This,exportOffsetFields) ) + ( (This)->lpVtbl -> GetExportOffset(This,exportOffsetFields) ) #define IDeckLinkDeckControl_GetManualExportOffset(This,deckManualExportOffsetFields) \ - ( (This)->lpVtbl -> GetManualExportOffset(This,deckManualExportOffsetFields) ) + ( (This)->lpVtbl -> GetManualExportOffset(This,deckManualExportOffsetFields) ) #define IDeckLinkDeckControl_SetCaptureOffset(This,captureOffsetFields) \ - ( (This)->lpVtbl -> SetCaptureOffset(This,captureOffsetFields) ) + ( (This)->lpVtbl -> SetCaptureOffset(This,captureOffsetFields) ) #define IDeckLinkDeckControl_GetCaptureOffset(This,captureOffsetFields) \ - ( (This)->lpVtbl -> GetCaptureOffset(This,captureOffsetFields) ) + ( (This)->lpVtbl -> GetCaptureOffset(This,captureOffsetFields) ) #define IDeckLinkDeckControl_StartExport(This,inTimecode,outTimecode,exportModeOps,error) \ - ( (This)->lpVtbl -> StartExport(This,inTimecode,outTimecode,exportModeOps,error) ) + ( (This)->lpVtbl -> StartExport(This,inTimecode,outTimecode,exportModeOps,error) ) #define IDeckLinkDeckControl_StartCapture(This,useVITC,inTimecode,outTimecode,error) \ - ( (This)->lpVtbl -> StartCapture(This,useVITC,inTimecode,outTimecode,error) ) + ( (This)->lpVtbl -> StartCapture(This,useVITC,inTimecode,outTimecode,error) ) #define IDeckLinkDeckControl_GetDeviceID(This,deviceId,error) \ - ( (This)->lpVtbl -> GetDeviceID(This,deviceId,error) ) + ( (This)->lpVtbl -> GetDeviceID(This,deviceId,error) ) #define IDeckLinkDeckControl_Abort(This) \ - ( (This)->lpVtbl -> Abort(This) ) + ( (This)->lpVtbl -> Abort(This) ) #define IDeckLinkDeckControl_CrashRecordStart(This,error) \ - ( (This)->lpVtbl -> CrashRecordStart(This,error) ) + ( (This)->lpVtbl -> CrashRecordStart(This,error) ) #define IDeckLinkDeckControl_CrashRecordStop(This,error) \ - ( (This)->lpVtbl -> CrashRecordStop(This,error) ) + ( (This)->lpVtbl -> CrashRecordStop(This,error) ) #define IDeckLinkDeckControl_SetCallback(This,callback) \ - ( (This)->lpVtbl -> SetCallback(This,callback) ) + ( (This)->lpVtbl -> SetCallback(This,callback) ) #endif /* COBJMACROS */ @@ -3520,61 +3690,67 @@ #define __IBMDStreamingDeviceNotificationCallback_INTERFACE_DEFINED__ /* interface IBMDStreamingDeviceNotificationCallback */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IBMDStreamingDeviceNotificationCallback; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("F9531D64-3305-4B29-A387-7F74BB0D0E84") IBMDStreamingDeviceNotificationCallback : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE StreamingDeviceArrived( + virtual HRESULT STDMETHODCALLTYPE StreamingDeviceArrived( /* in */ IDeckLink *device) = 0; - - virtual HRESULT STDMETHODCALLTYPE StreamingDeviceRemoved( + + virtual HRESULT STDMETHODCALLTYPE StreamingDeviceRemoved( /* in */ IDeckLink *device) = 0; - - virtual HRESULT STDMETHODCALLTYPE StreamingDeviceModeChanged( + + virtual HRESULT STDMETHODCALLTYPE StreamingDeviceModeChanged( /* in */ IDeckLink *device, /* in */ BMDStreamingDeviceMode mode) = 0; - + }; - - + + #else /* C style interface */ typedef struct IBMDStreamingDeviceNotificationCallbackVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IBMDStreamingDeviceNotificationCallback * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IBMDStreamingDeviceNotificationCallback * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IBMDStreamingDeviceNotificationCallback * This); - - HRESULT ( STDMETHODCALLTYPE *StreamingDeviceArrived )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceNotificationCallback, StreamingDeviceArrived) + HRESULT ( STDMETHODCALLTYPE *StreamingDeviceArrived )( IBMDStreamingDeviceNotificationCallback * This, /* in */ IDeckLink *device); - - HRESULT ( STDMETHODCALLTYPE *StreamingDeviceRemoved )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceNotificationCallback, StreamingDeviceRemoved) + HRESULT ( STDMETHODCALLTYPE *StreamingDeviceRemoved )( IBMDStreamingDeviceNotificationCallback * This, /* in */ IDeckLink *device); - - HRESULT ( STDMETHODCALLTYPE *StreamingDeviceModeChanged )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceNotificationCallback, StreamingDeviceModeChanged) + HRESULT ( STDMETHODCALLTYPE *StreamingDeviceModeChanged )( IBMDStreamingDeviceNotificationCallback * This, /* in */ IDeckLink *device, /* in */ BMDStreamingDeviceMode mode); - + END_INTERFACE } IBMDStreamingDeviceNotificationCallbackVtbl; @@ -3583,29 +3759,29 @@ CONST_VTBL struct IBMDStreamingDeviceNotificationCallbackVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IBMDStreamingDeviceNotificationCallback_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IBMDStreamingDeviceNotificationCallback_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IBMDStreamingDeviceNotificationCallback_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IBMDStreamingDeviceNotificationCallback_StreamingDeviceArrived(This,device) \ - ( (This)->lpVtbl -> StreamingDeviceArrived(This,device) ) + ( (This)->lpVtbl -> StreamingDeviceArrived(This,device) ) #define IBMDStreamingDeviceNotificationCallback_StreamingDeviceRemoved(This,device) \ - ( (This)->lpVtbl -> StreamingDeviceRemoved(This,device) ) + ( (This)->lpVtbl -> StreamingDeviceRemoved(This,device) ) #define IBMDStreamingDeviceNotificationCallback_StreamingDeviceModeChanged(This,device,mode) \ - ( (This)->lpVtbl -> StreamingDeviceModeChanged(This,device,mode) ) + ( (This)->lpVtbl -> StreamingDeviceModeChanged(This,device,mode) ) #endif /* COBJMACROS */ @@ -3622,74 +3798,83 @@ #define __IBMDStreamingH264InputCallback_INTERFACE_DEFINED__ /* interface IBMDStreamingH264InputCallback */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IBMDStreamingH264InputCallback; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("823C475F-55AE-46F9-890C-537CC5CEDCCA") IBMDStreamingH264InputCallback : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE H264NALPacketArrived( + virtual HRESULT STDMETHODCALLTYPE H264NALPacketArrived( /* in */ IBMDStreamingH264NALPacket *nalPacket) = 0; - - virtual HRESULT STDMETHODCALLTYPE H264AudioPacketArrived( + + virtual HRESULT STDMETHODCALLTYPE H264AudioPacketArrived( /* in */ IBMDStreamingAudioPacket *audioPacket) = 0; - - virtual HRESULT STDMETHODCALLTYPE MPEG2TSPacketArrived( + + virtual HRESULT STDMETHODCALLTYPE MPEG2TSPacketArrived( /* in */ IBMDStreamingMPEG2TSPacket *tsPacket) = 0; - + virtual HRESULT STDMETHODCALLTYPE H264VideoInputConnectorScanningChanged( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE H264VideoInputConnectorChanged( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE H264VideoInputModeChanged( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IBMDStreamingH264InputCallbackVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IBMDStreamingH264InputCallback * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IBMDStreamingH264InputCallback * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IBMDStreamingH264InputCallback * This); - - HRESULT ( STDMETHODCALLTYPE *H264NALPacketArrived )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264InputCallback, H264NALPacketArrived) + HRESULT ( STDMETHODCALLTYPE *H264NALPacketArrived )( IBMDStreamingH264InputCallback * This, /* in */ IBMDStreamingH264NALPacket *nalPacket); - - HRESULT ( STDMETHODCALLTYPE *H264AudioPacketArrived )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264InputCallback, H264AudioPacketArrived) + HRESULT ( STDMETHODCALLTYPE *H264AudioPacketArrived )( IBMDStreamingH264InputCallback * This, /* in */ IBMDStreamingAudioPacket *audioPacket); - - HRESULT ( STDMETHODCALLTYPE *MPEG2TSPacketArrived )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264InputCallback, MPEG2TSPacketArrived) + HRESULT ( STDMETHODCALLTYPE *MPEG2TSPacketArrived )( IBMDStreamingH264InputCallback * This, /* in */ IBMDStreamingMPEG2TSPacket *tsPacket); - - HRESULT ( STDMETHODCALLTYPE *H264VideoInputConnectorScanningChanged )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264InputCallback, H264VideoInputConnectorScanningChanged) + HRESULT ( STDMETHODCALLTYPE *H264VideoInputConnectorScanningChanged )( IBMDStreamingH264InputCallback * This); - - HRESULT ( STDMETHODCALLTYPE *H264VideoInputConnectorChanged )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264InputCallback, H264VideoInputConnectorChanged) + HRESULT ( STDMETHODCALLTYPE *H264VideoInputConnectorChanged )( IBMDStreamingH264InputCallback * This); - - HRESULT ( STDMETHODCALLTYPE *H264VideoInputModeChanged )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264InputCallback, H264VideoInputModeChanged) + HRESULT ( STDMETHODCALLTYPE *H264VideoInputModeChanged )( IBMDStreamingH264InputCallback * This); - + END_INTERFACE } IBMDStreamingH264InputCallbackVtbl; @@ -3698,38 +3883,38 @@ CONST_VTBL struct IBMDStreamingH264InputCallbackVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IBMDStreamingH264InputCallback_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IBMDStreamingH264InputCallback_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IBMDStreamingH264InputCallback_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IBMDStreamingH264InputCallback_H264NALPacketArrived(This,nalPacket) \ - ( (This)->lpVtbl -> H264NALPacketArrived(This,nalPacket) ) + ( (This)->lpVtbl -> H264NALPacketArrived(This,nalPacket) ) #define IBMDStreamingH264InputCallback_H264AudioPacketArrived(This,audioPacket) \ - ( (This)->lpVtbl -> H264AudioPacketArrived(This,audioPacket) ) + ( (This)->lpVtbl -> H264AudioPacketArrived(This,audioPacket) ) #define IBMDStreamingH264InputCallback_MPEG2TSPacketArrived(This,tsPacket) \ - ( (This)->lpVtbl -> MPEG2TSPacketArrived(This,tsPacket) ) + ( (This)->lpVtbl -> MPEG2TSPacketArrived(This,tsPacket) ) #define IBMDStreamingH264InputCallback_H264VideoInputConnectorScanningChanged(This) \ - ( (This)->lpVtbl -> H264VideoInputConnectorScanningChanged(This) ) + ( (This)->lpVtbl -> H264VideoInputConnectorScanningChanged(This) ) #define IBMDStreamingH264InputCallback_H264VideoInputConnectorChanged(This) \ - ( (This)->lpVtbl -> H264VideoInputConnectorChanged(This) ) + ( (This)->lpVtbl -> H264VideoInputConnectorChanged(This) ) #define IBMDStreamingH264InputCallback_H264VideoInputModeChanged(This) \ - ( (This)->lpVtbl -> H264VideoInputModeChanged(This) ) + ( (This)->lpVtbl -> H264VideoInputModeChanged(This) ) #endif /* COBJMACROS */ @@ -3746,50 +3931,55 @@ #define __IBMDStreamingDiscovery_INTERFACE_DEFINED__ /* interface IBMDStreamingDiscovery */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IBMDStreamingDiscovery; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("2C837444-F989-4D87-901A-47C8A36D096D") IBMDStreamingDiscovery : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE InstallDeviceNotifications( + virtual HRESULT STDMETHODCALLTYPE InstallDeviceNotifications( /* in */ IBMDStreamingDeviceNotificationCallback *theCallback) = 0; - + virtual HRESULT STDMETHODCALLTYPE UninstallDeviceNotifications( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IBMDStreamingDiscoveryVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IBMDStreamingDiscovery * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IBMDStreamingDiscovery * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IBMDStreamingDiscovery * This); - - HRESULT ( STDMETHODCALLTYPE *InstallDeviceNotifications )( + + DECLSPEC_XFGVIRT(IBMDStreamingDiscovery, InstallDeviceNotifications) + HRESULT ( STDMETHODCALLTYPE *InstallDeviceNotifications )( IBMDStreamingDiscovery * This, /* in */ IBMDStreamingDeviceNotificationCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *UninstallDeviceNotifications )( + + DECLSPEC_XFGVIRT(IBMDStreamingDiscovery, UninstallDeviceNotifications) + HRESULT ( STDMETHODCALLTYPE *UninstallDeviceNotifications )( IBMDStreamingDiscovery * This); - + END_INTERFACE } IBMDStreamingDiscoveryVtbl; @@ -3798,26 +3988,26 @@ CONST_VTBL struct IBMDStreamingDiscoveryVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IBMDStreamingDiscovery_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IBMDStreamingDiscovery_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IBMDStreamingDiscovery_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IBMDStreamingDiscovery_InstallDeviceNotifications(This,theCallback) \ - ( (This)->lpVtbl -> InstallDeviceNotifications(This,theCallback) ) + ( (This)->lpVtbl -> InstallDeviceNotifications(This,theCallback) ) #define IBMDStreamingDiscovery_UninstallDeviceNotifications(This) \ - ( (This)->lpVtbl -> UninstallDeviceNotifications(This) ) + ( (This)->lpVtbl -> UninstallDeviceNotifications(This) ) #endif /* COBJMACROS */ @@ -3834,123 +4024,139 @@ #define __IBMDStreamingVideoEncodingMode_INTERFACE_DEFINED__ /* interface IBMDStreamingVideoEncodingMode */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IBMDStreamingVideoEncodingMode; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("1AB8035B-CD13-458D-B6DF-5E8F7C2141D9") IBMDStreamingVideoEncodingMode : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetName( + virtual HRESULT STDMETHODCALLTYPE GetName( /* out */ BSTR *name) = 0; - + virtual unsigned int STDMETHODCALLTYPE GetPresetID( void) = 0; - + virtual unsigned int STDMETHODCALLTYPE GetSourcePositionX( void) = 0; - + virtual unsigned int STDMETHODCALLTYPE GetSourcePositionY( void) = 0; - + virtual unsigned int STDMETHODCALLTYPE GetSourceWidth( void) = 0; - + virtual unsigned int STDMETHODCALLTYPE GetSourceHeight( void) = 0; - + virtual unsigned int STDMETHODCALLTYPE GetDestWidth( void) = 0; - + virtual unsigned int STDMETHODCALLTYPE GetDestHeight( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFlag( + + virtual HRESULT STDMETHODCALLTYPE GetFlag( /* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ BOOL *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInt( + + virtual HRESULT STDMETHODCALLTYPE GetInt( /* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ LONGLONG *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFloat( + + virtual HRESULT STDMETHODCALLTYPE GetFloat( /* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ double *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ BSTR *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateMutableVideoEncodingMode( + + virtual HRESULT STDMETHODCALLTYPE CreateMutableVideoEncodingMode( /* out */ IBMDStreamingMutableVideoEncodingMode **newEncodingMode) = 0; - + }; - - + + #else /* C style interface */ typedef struct IBMDStreamingVideoEncodingModeVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IBMDStreamingVideoEncodingMode * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IBMDStreamingVideoEncodingMode * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IBMDStreamingVideoEncodingMode * This); - - HRESULT ( STDMETHODCALLTYPE *GetName )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetName) + HRESULT ( STDMETHODCALLTYPE *GetName )( IBMDStreamingVideoEncodingMode * This, /* out */ BSTR *name); - - unsigned int ( STDMETHODCALLTYPE *GetPresetID )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetPresetID) + unsigned int ( STDMETHODCALLTYPE *GetPresetID )( IBMDStreamingVideoEncodingMode * This); - - unsigned int ( STDMETHODCALLTYPE *GetSourcePositionX )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetSourcePositionX) + unsigned int ( STDMETHODCALLTYPE *GetSourcePositionX )( IBMDStreamingVideoEncodingMode * This); - - unsigned int ( STDMETHODCALLTYPE *GetSourcePositionY )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetSourcePositionY) + unsigned int ( STDMETHODCALLTYPE *GetSourcePositionY )( IBMDStreamingVideoEncodingMode * This); - - unsigned int ( STDMETHODCALLTYPE *GetSourceWidth )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetSourceWidth) + unsigned int ( STDMETHODCALLTYPE *GetSourceWidth )( IBMDStreamingVideoEncodingMode * This); - - unsigned int ( STDMETHODCALLTYPE *GetSourceHeight )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetSourceHeight) + unsigned int ( STDMETHODCALLTYPE *GetSourceHeight )( IBMDStreamingVideoEncodingMode * This); - - unsigned int ( STDMETHODCALLTYPE *GetDestWidth )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetDestWidth) + unsigned int ( STDMETHODCALLTYPE *GetDestWidth )( IBMDStreamingVideoEncodingMode * This); - - unsigned int ( STDMETHODCALLTYPE *GetDestHeight )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetDestHeight) + unsigned int ( STDMETHODCALLTYPE *GetDestHeight )( IBMDStreamingVideoEncodingMode * This); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( IBMDStreamingVideoEncodingMode * This, /* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IBMDStreamingVideoEncodingMode * This, /* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( IBMDStreamingVideoEncodingMode * This, /* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IBMDStreamingVideoEncodingMode * This, /* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ BSTR *value); - - HRESULT ( STDMETHODCALLTYPE *CreateMutableVideoEncodingMode )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, CreateMutableVideoEncodingMode) + HRESULT ( STDMETHODCALLTYPE *CreateMutableVideoEncodingMode )( IBMDStreamingVideoEncodingMode * This, /* out */ IBMDStreamingMutableVideoEncodingMode **newEncodingMode); - + END_INTERFACE } IBMDStreamingVideoEncodingModeVtbl; @@ -3959,59 +4165,59 @@ CONST_VTBL struct IBMDStreamingVideoEncodingModeVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IBMDStreamingVideoEncodingMode_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IBMDStreamingVideoEncodingMode_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IBMDStreamingVideoEncodingMode_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IBMDStreamingVideoEncodingMode_GetName(This,name) \ - ( (This)->lpVtbl -> GetName(This,name) ) + ( (This)->lpVtbl -> GetName(This,name) ) #define IBMDStreamingVideoEncodingMode_GetPresetID(This) \ - ( (This)->lpVtbl -> GetPresetID(This) ) + ( (This)->lpVtbl -> GetPresetID(This) ) #define IBMDStreamingVideoEncodingMode_GetSourcePositionX(This) \ - ( (This)->lpVtbl -> GetSourcePositionX(This) ) + ( (This)->lpVtbl -> GetSourcePositionX(This) ) #define IBMDStreamingVideoEncodingMode_GetSourcePositionY(This) \ - ( (This)->lpVtbl -> GetSourcePositionY(This) ) + ( (This)->lpVtbl -> GetSourcePositionY(This) ) #define IBMDStreamingVideoEncodingMode_GetSourceWidth(This) \ - ( (This)->lpVtbl -> GetSourceWidth(This) ) + ( (This)->lpVtbl -> GetSourceWidth(This) ) #define IBMDStreamingVideoEncodingMode_GetSourceHeight(This) \ - ( (This)->lpVtbl -> GetSourceHeight(This) ) + ( (This)->lpVtbl -> GetSourceHeight(This) ) #define IBMDStreamingVideoEncodingMode_GetDestWidth(This) \ - ( (This)->lpVtbl -> GetDestWidth(This) ) + ( (This)->lpVtbl -> GetDestWidth(This) ) #define IBMDStreamingVideoEncodingMode_GetDestHeight(This) \ - ( (This)->lpVtbl -> GetDestHeight(This) ) + ( (This)->lpVtbl -> GetDestHeight(This) ) #define IBMDStreamingVideoEncodingMode_GetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) #define IBMDStreamingVideoEncodingMode_GetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) #define IBMDStreamingVideoEncodingMode_GetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) #define IBMDStreamingVideoEncodingMode_GetString(This,cfgID,value) \ - ( (This)->lpVtbl -> GetString(This,cfgID,value) ) + ( (This)->lpVtbl -> GetString(This,cfgID,value) ) #define IBMDStreamingVideoEncodingMode_CreateMutableVideoEncodingMode(This,newEncodingMode) \ - ( (This)->lpVtbl -> CreateMutableVideoEncodingMode(This,newEncodingMode) ) + ( (This)->lpVtbl -> CreateMutableVideoEncodingMode(This,newEncodingMode) ) #endif /* COBJMACROS */ @@ -4028,145 +4234,167 @@ #define __IBMDStreamingMutableVideoEncodingMode_INTERFACE_DEFINED__ /* interface IBMDStreamingMutableVideoEncodingMode */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IBMDStreamingMutableVideoEncodingMode; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("19BF7D90-1E0A-400D-B2C6-FFC4E78AD49D") IBMDStreamingMutableVideoEncodingMode : public IBMDStreamingVideoEncodingMode { public: - virtual HRESULT STDMETHODCALLTYPE SetSourceRect( + virtual HRESULT STDMETHODCALLTYPE SetSourceRect( /* in */ unsigned int posX, /* in */ unsigned int posY, /* in */ unsigned int width, /* in */ unsigned int height) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetDestSize( + + virtual HRESULT STDMETHODCALLTYPE SetDestSize( /* in */ unsigned int width, /* in */ unsigned int height) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFlag( + + virtual HRESULT STDMETHODCALLTYPE SetFlag( /* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ BOOL value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInt( + + virtual HRESULT STDMETHODCALLTYPE SetInt( /* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ LONGLONG value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFloat( + + virtual HRESULT STDMETHODCALLTYPE SetFloat( /* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ double value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetString( + + virtual HRESULT STDMETHODCALLTYPE SetString( /* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ BSTR value) = 0; - + }; - - + + #else /* C style interface */ typedef struct IBMDStreamingMutableVideoEncodingModeVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IBMDStreamingMutableVideoEncodingMode * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IBMDStreamingMutableVideoEncodingMode * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IBMDStreamingMutableVideoEncodingMode * This); - - HRESULT ( STDMETHODCALLTYPE *GetName )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetName) + HRESULT ( STDMETHODCALLTYPE *GetName )( IBMDStreamingMutableVideoEncodingMode * This, /* out */ BSTR *name); - - unsigned int ( STDMETHODCALLTYPE *GetPresetID )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetPresetID) + unsigned int ( STDMETHODCALLTYPE *GetPresetID )( IBMDStreamingMutableVideoEncodingMode * This); - - unsigned int ( STDMETHODCALLTYPE *GetSourcePositionX )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetSourcePositionX) + unsigned int ( STDMETHODCALLTYPE *GetSourcePositionX )( IBMDStreamingMutableVideoEncodingMode * This); - - unsigned int ( STDMETHODCALLTYPE *GetSourcePositionY )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetSourcePositionY) + unsigned int ( STDMETHODCALLTYPE *GetSourcePositionY )( IBMDStreamingMutableVideoEncodingMode * This); - - unsigned int ( STDMETHODCALLTYPE *GetSourceWidth )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetSourceWidth) + unsigned int ( STDMETHODCALLTYPE *GetSourceWidth )( IBMDStreamingMutableVideoEncodingMode * This); - - unsigned int ( STDMETHODCALLTYPE *GetSourceHeight )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetSourceHeight) + unsigned int ( STDMETHODCALLTYPE *GetSourceHeight )( IBMDStreamingMutableVideoEncodingMode * This); - - unsigned int ( STDMETHODCALLTYPE *GetDestWidth )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetDestWidth) + unsigned int ( STDMETHODCALLTYPE *GetDestWidth )( IBMDStreamingMutableVideoEncodingMode * This); - - unsigned int ( STDMETHODCALLTYPE *GetDestHeight )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetDestHeight) + unsigned int ( STDMETHODCALLTYPE *GetDestHeight )( IBMDStreamingMutableVideoEncodingMode * This); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( IBMDStreamingMutableVideoEncodingMode * This, /* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IBMDStreamingMutableVideoEncodingMode * This, /* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( IBMDStreamingMutableVideoEncodingMode * This, /* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IBMDStreamingMutableVideoEncodingMode * This, /* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ BSTR *value); - - HRESULT ( STDMETHODCALLTYPE *CreateMutableVideoEncodingMode )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingMode, CreateMutableVideoEncodingMode) + HRESULT ( STDMETHODCALLTYPE *CreateMutableVideoEncodingMode )( IBMDStreamingMutableVideoEncodingMode * This, /* out */ IBMDStreamingMutableVideoEncodingMode **newEncodingMode); - - HRESULT ( STDMETHODCALLTYPE *SetSourceRect )( + + DECLSPEC_XFGVIRT(IBMDStreamingMutableVideoEncodingMode, SetSourceRect) + HRESULT ( STDMETHODCALLTYPE *SetSourceRect )( IBMDStreamingMutableVideoEncodingMode * This, /* in */ unsigned int posX, /* in */ unsigned int posY, /* in */ unsigned int width, /* in */ unsigned int height); - - HRESULT ( STDMETHODCALLTYPE *SetDestSize )( + + DECLSPEC_XFGVIRT(IBMDStreamingMutableVideoEncodingMode, SetDestSize) + HRESULT ( STDMETHODCALLTYPE *SetDestSize )( IBMDStreamingMutableVideoEncodingMode * This, /* in */ unsigned int width, /* in */ unsigned int height); - - HRESULT ( STDMETHODCALLTYPE *SetFlag )( + + DECLSPEC_XFGVIRT(IBMDStreamingMutableVideoEncodingMode, SetFlag) + HRESULT ( STDMETHODCALLTYPE *SetFlag )( IBMDStreamingMutableVideoEncodingMode * This, /* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ BOOL value); - - HRESULT ( STDMETHODCALLTYPE *SetInt )( + + DECLSPEC_XFGVIRT(IBMDStreamingMutableVideoEncodingMode, SetInt) + HRESULT ( STDMETHODCALLTYPE *SetInt )( IBMDStreamingMutableVideoEncodingMode * This, /* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ LONGLONG value); - - HRESULT ( STDMETHODCALLTYPE *SetFloat )( + + DECLSPEC_XFGVIRT(IBMDStreamingMutableVideoEncodingMode, SetFloat) + HRESULT ( STDMETHODCALLTYPE *SetFloat )( IBMDStreamingMutableVideoEncodingMode * This, /* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ double value); - - HRESULT ( STDMETHODCALLTYPE *SetString )( + + DECLSPEC_XFGVIRT(IBMDStreamingMutableVideoEncodingMode, SetString) + HRESULT ( STDMETHODCALLTYPE *SetString )( IBMDStreamingMutableVideoEncodingMode * This, /* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ BSTR value); - + END_INTERFACE } IBMDStreamingMutableVideoEncodingModeVtbl; @@ -4175,78 +4403,78 @@ CONST_VTBL struct IBMDStreamingMutableVideoEncodingModeVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IBMDStreamingMutableVideoEncodingMode_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IBMDStreamingMutableVideoEncodingMode_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IBMDStreamingMutableVideoEncodingMode_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IBMDStreamingMutableVideoEncodingMode_GetName(This,name) \ - ( (This)->lpVtbl -> GetName(This,name) ) + ( (This)->lpVtbl -> GetName(This,name) ) #define IBMDStreamingMutableVideoEncodingMode_GetPresetID(This) \ - ( (This)->lpVtbl -> GetPresetID(This) ) + ( (This)->lpVtbl -> GetPresetID(This) ) #define IBMDStreamingMutableVideoEncodingMode_GetSourcePositionX(This) \ - ( (This)->lpVtbl -> GetSourcePositionX(This) ) + ( (This)->lpVtbl -> GetSourcePositionX(This) ) #define IBMDStreamingMutableVideoEncodingMode_GetSourcePositionY(This) \ - ( (This)->lpVtbl -> GetSourcePositionY(This) ) + ( (This)->lpVtbl -> GetSourcePositionY(This) ) #define IBMDStreamingMutableVideoEncodingMode_GetSourceWidth(This) \ - ( (This)->lpVtbl -> GetSourceWidth(This) ) + ( (This)->lpVtbl -> GetSourceWidth(This) ) #define IBMDStreamingMutableVideoEncodingMode_GetSourceHeight(This) \ - ( (This)->lpVtbl -> GetSourceHeight(This) ) + ( (This)->lpVtbl -> GetSourceHeight(This) ) #define IBMDStreamingMutableVideoEncodingMode_GetDestWidth(This) \ - ( (This)->lpVtbl -> GetDestWidth(This) ) + ( (This)->lpVtbl -> GetDestWidth(This) ) #define IBMDStreamingMutableVideoEncodingMode_GetDestHeight(This) \ - ( (This)->lpVtbl -> GetDestHeight(This) ) + ( (This)->lpVtbl -> GetDestHeight(This) ) #define IBMDStreamingMutableVideoEncodingMode_GetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) #define IBMDStreamingMutableVideoEncodingMode_GetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) #define IBMDStreamingMutableVideoEncodingMode_GetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) #define IBMDStreamingMutableVideoEncodingMode_GetString(This,cfgID,value) \ - ( (This)->lpVtbl -> GetString(This,cfgID,value) ) + ( (This)->lpVtbl -> GetString(This,cfgID,value) ) #define IBMDStreamingMutableVideoEncodingMode_CreateMutableVideoEncodingMode(This,newEncodingMode) \ - ( (This)->lpVtbl -> CreateMutableVideoEncodingMode(This,newEncodingMode) ) + ( (This)->lpVtbl -> CreateMutableVideoEncodingMode(This,newEncodingMode) ) #define IBMDStreamingMutableVideoEncodingMode_SetSourceRect(This,posX,posY,width,height) \ - ( (This)->lpVtbl -> SetSourceRect(This,posX,posY,width,height) ) + ( (This)->lpVtbl -> SetSourceRect(This,posX,posY,width,height) ) #define IBMDStreamingMutableVideoEncodingMode_SetDestSize(This,width,height) \ - ( (This)->lpVtbl -> SetDestSize(This,width,height) ) + ( (This)->lpVtbl -> SetDestSize(This,width,height) ) #define IBMDStreamingMutableVideoEncodingMode_SetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) #define IBMDStreamingMutableVideoEncodingMode_SetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) #define IBMDStreamingMutableVideoEncodingMode_SetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) #define IBMDStreamingMutableVideoEncodingMode_SetString(This,cfgID,value) \ - ( (This)->lpVtbl -> SetString(This,cfgID,value) ) + ( (This)->lpVtbl -> SetString(This,cfgID,value) ) #endif /* COBJMACROS */ @@ -4263,45 +4491,49 @@ #define __IBMDStreamingVideoEncodingModePresetIterator_INTERFACE_DEFINED__ /* interface IBMDStreamingVideoEncodingModePresetIterator */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IBMDStreamingVideoEncodingModePresetIterator; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("7AC731A3-C950-4AD0-804A-8377AA51C6C4") IBMDStreamingVideoEncodingModePresetIterator : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Next( + virtual HRESULT STDMETHODCALLTYPE Next( /* out */ IBMDStreamingVideoEncodingMode **videoEncodingMode) = 0; - + }; - - + + #else /* C style interface */ typedef struct IBMDStreamingVideoEncodingModePresetIteratorVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IBMDStreamingVideoEncodingModePresetIterator * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IBMDStreamingVideoEncodingModePresetIterator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IBMDStreamingVideoEncodingModePresetIterator * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( + + DECLSPEC_XFGVIRT(IBMDStreamingVideoEncodingModePresetIterator, Next) + HRESULT ( STDMETHODCALLTYPE *Next )( IBMDStreamingVideoEncodingModePresetIterator * This, /* out */ IBMDStreamingVideoEncodingMode **videoEncodingMode); - + END_INTERFACE } IBMDStreamingVideoEncodingModePresetIteratorVtbl; @@ -4310,23 +4542,23 @@ CONST_VTBL struct IBMDStreamingVideoEncodingModePresetIteratorVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IBMDStreamingVideoEncodingModePresetIterator_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IBMDStreamingVideoEncodingModePresetIterator_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IBMDStreamingVideoEncodingModePresetIterator_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IBMDStreamingVideoEncodingModePresetIterator_Next(This,videoEncodingMode) \ - ( (This)->lpVtbl -> Next(This,videoEncodingMode) ) + ( (This)->lpVtbl -> Next(This,videoEncodingMode) ) #endif /* COBJMACROS */ @@ -4343,121 +4575,135 @@ #define __IBMDStreamingDeviceInput_INTERFACE_DEFINED__ /* interface IBMDStreamingDeviceInput */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IBMDStreamingDeviceInput; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("24B6B6EC-1727-44BB-9818-34FF086ACF98") IBMDStreamingDeviceInput : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoInputMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoInputMode( /* in */ BMDDisplayMode inputMode, /* out */ BOOL *result) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVideoInputModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetVideoInputModeIterator( /* out */ IDeckLinkDisplayModeIterator **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoInputMode( + + virtual HRESULT STDMETHODCALLTYPE SetVideoInputMode( /* in */ BMDDisplayMode inputMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentDetectedVideoInputMode( + + virtual HRESULT STDMETHODCALLTYPE GetCurrentDetectedVideoInputMode( /* out */ BMDDisplayMode *detectedMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVideoEncodingMode( + + virtual HRESULT STDMETHODCALLTYPE GetVideoEncodingMode( /* out */ IBMDStreamingVideoEncodingMode **encodingMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVideoEncodingModePresetIterator( + + virtual HRESULT STDMETHODCALLTYPE GetVideoEncodingModePresetIterator( /* in */ BMDDisplayMode inputMode, /* out */ IBMDStreamingVideoEncodingModePresetIterator **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoEncodingMode( + + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoEncodingMode( /* in */ BMDDisplayMode inputMode, /* in */ IBMDStreamingVideoEncodingMode *encodingMode, /* out */ BMDStreamingEncodingSupport *result, /* out */ IBMDStreamingVideoEncodingMode **changedEncodingMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoEncodingMode( + + virtual HRESULT STDMETHODCALLTYPE SetVideoEncodingMode( /* in */ IBMDStreamingVideoEncodingMode *encodingMode) = 0; - + virtual HRESULT STDMETHODCALLTYPE StartCapture( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE StopCapture( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( + + virtual HRESULT STDMETHODCALLTYPE SetCallback( /* in */ IUnknown *theCallback) = 0; - + }; - - + + #else /* C style interface */ typedef struct IBMDStreamingDeviceInputVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IBMDStreamingDeviceInput * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IBMDStreamingDeviceInput * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IBMDStreamingDeviceInput * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoInputMode )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceInput, DoesSupportVideoInputMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoInputMode )( IBMDStreamingDeviceInput * This, /* in */ BMDDisplayMode inputMode, /* out */ BOOL *result); - - HRESULT ( STDMETHODCALLTYPE *GetVideoInputModeIterator )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceInput, GetVideoInputModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetVideoInputModeIterator )( IBMDStreamingDeviceInput * This, /* out */ IDeckLinkDisplayModeIterator **iterator); - - HRESULT ( STDMETHODCALLTYPE *SetVideoInputMode )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceInput, SetVideoInputMode) + HRESULT ( STDMETHODCALLTYPE *SetVideoInputMode )( IBMDStreamingDeviceInput * This, /* in */ BMDDisplayMode inputMode); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentDetectedVideoInputMode )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceInput, GetCurrentDetectedVideoInputMode) + HRESULT ( STDMETHODCALLTYPE *GetCurrentDetectedVideoInputMode )( IBMDStreamingDeviceInput * This, /* out */ BMDDisplayMode *detectedMode); - - HRESULT ( STDMETHODCALLTYPE *GetVideoEncodingMode )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceInput, GetVideoEncodingMode) + HRESULT ( STDMETHODCALLTYPE *GetVideoEncodingMode )( IBMDStreamingDeviceInput * This, /* out */ IBMDStreamingVideoEncodingMode **encodingMode); - - HRESULT ( STDMETHODCALLTYPE *GetVideoEncodingModePresetIterator )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceInput, GetVideoEncodingModePresetIterator) + HRESULT ( STDMETHODCALLTYPE *GetVideoEncodingModePresetIterator )( IBMDStreamingDeviceInput * This, /* in */ BMDDisplayMode inputMode, /* out */ IBMDStreamingVideoEncodingModePresetIterator **iterator); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoEncodingMode )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceInput, DoesSupportVideoEncodingMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoEncodingMode )( IBMDStreamingDeviceInput * This, /* in */ BMDDisplayMode inputMode, /* in */ IBMDStreamingVideoEncodingMode *encodingMode, /* out */ BMDStreamingEncodingSupport *result, /* out */ IBMDStreamingVideoEncodingMode **changedEncodingMode); - - HRESULT ( STDMETHODCALLTYPE *SetVideoEncodingMode )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceInput, SetVideoEncodingMode) + HRESULT ( STDMETHODCALLTYPE *SetVideoEncodingMode )( IBMDStreamingDeviceInput * This, /* in */ IBMDStreamingVideoEncodingMode *encodingMode); - - HRESULT ( STDMETHODCALLTYPE *StartCapture )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceInput, StartCapture) + HRESULT ( STDMETHODCALLTYPE *StartCapture )( IBMDStreamingDeviceInput * This); - - HRESULT ( STDMETHODCALLTYPE *StopCapture )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceInput, StopCapture) + HRESULT ( STDMETHODCALLTYPE *StopCapture )( IBMDStreamingDeviceInput * This); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( + + DECLSPEC_XFGVIRT(IBMDStreamingDeviceInput, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( IBMDStreamingDeviceInput * This, /* in */ IUnknown *theCallback); - + END_INTERFACE } IBMDStreamingDeviceInputVtbl; @@ -4466,53 +4712,53 @@ CONST_VTBL struct IBMDStreamingDeviceInputVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IBMDStreamingDeviceInput_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IBMDStreamingDeviceInput_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IBMDStreamingDeviceInput_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IBMDStreamingDeviceInput_DoesSupportVideoInputMode(This,inputMode,result) \ - ( (This)->lpVtbl -> DoesSupportVideoInputMode(This,inputMode,result) ) + ( (This)->lpVtbl -> DoesSupportVideoInputMode(This,inputMode,result) ) #define IBMDStreamingDeviceInput_GetVideoInputModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetVideoInputModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetVideoInputModeIterator(This,iterator) ) #define IBMDStreamingDeviceInput_SetVideoInputMode(This,inputMode) \ - ( (This)->lpVtbl -> SetVideoInputMode(This,inputMode) ) + ( (This)->lpVtbl -> SetVideoInputMode(This,inputMode) ) #define IBMDStreamingDeviceInput_GetCurrentDetectedVideoInputMode(This,detectedMode) \ - ( (This)->lpVtbl -> GetCurrentDetectedVideoInputMode(This,detectedMode) ) + ( (This)->lpVtbl -> GetCurrentDetectedVideoInputMode(This,detectedMode) ) #define IBMDStreamingDeviceInput_GetVideoEncodingMode(This,encodingMode) \ - ( (This)->lpVtbl -> GetVideoEncodingMode(This,encodingMode) ) + ( (This)->lpVtbl -> GetVideoEncodingMode(This,encodingMode) ) #define IBMDStreamingDeviceInput_GetVideoEncodingModePresetIterator(This,inputMode,iterator) \ - ( (This)->lpVtbl -> GetVideoEncodingModePresetIterator(This,inputMode,iterator) ) + ( (This)->lpVtbl -> GetVideoEncodingModePresetIterator(This,inputMode,iterator) ) #define IBMDStreamingDeviceInput_DoesSupportVideoEncodingMode(This,inputMode,encodingMode,result,changedEncodingMode) \ - ( (This)->lpVtbl -> DoesSupportVideoEncodingMode(This,inputMode,encodingMode,result,changedEncodingMode) ) + ( (This)->lpVtbl -> DoesSupportVideoEncodingMode(This,inputMode,encodingMode,result,changedEncodingMode) ) #define IBMDStreamingDeviceInput_SetVideoEncodingMode(This,encodingMode) \ - ( (This)->lpVtbl -> SetVideoEncodingMode(This,encodingMode) ) + ( (This)->lpVtbl -> SetVideoEncodingMode(This,encodingMode) ) #define IBMDStreamingDeviceInput_StartCapture(This) \ - ( (This)->lpVtbl -> StartCapture(This) ) + ( (This)->lpVtbl -> StartCapture(This) ) #define IBMDStreamingDeviceInput_StopCapture(This) \ - ( (This)->lpVtbl -> StopCapture(This) ) + ( (This)->lpVtbl -> StopCapture(This) ) #define IBMDStreamingDeviceInput_SetCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetCallback(This,theCallback) ) #endif /* COBJMACROS */ @@ -4529,73 +4775,81 @@ #define __IBMDStreamingH264NALPacket_INTERFACE_DEFINED__ /* interface IBMDStreamingH264NALPacket */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IBMDStreamingH264NALPacket; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("E260E955-14BE-4395-9775-9F02CC0A9D89") IBMDStreamingH264NALPacket : public IUnknown { public: virtual long STDMETHODCALLTYPE GetPayloadSize( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBytes( + + virtual HRESULT STDMETHODCALLTYPE GetBytes( /* out */ void **buffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBytesWithSizePrefix( + + virtual HRESULT STDMETHODCALLTYPE GetBytesWithSizePrefix( /* out */ void **buffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayTime( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayTime( /* in */ ULONGLONG requestedTimeScale, /* out */ ULONGLONG *displayTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPacketIndex( + + virtual HRESULT STDMETHODCALLTYPE GetPacketIndex( /* out */ unsigned int *packetIndex) = 0; - + }; - - + + #else /* C style interface */ typedef struct IBMDStreamingH264NALPacketVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IBMDStreamingH264NALPacket * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IBMDStreamingH264NALPacket * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IBMDStreamingH264NALPacket * This); - - long ( STDMETHODCALLTYPE *GetPayloadSize )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264NALPacket, GetPayloadSize) + long ( STDMETHODCALLTYPE *GetPayloadSize )( IBMDStreamingH264NALPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264NALPacket, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IBMDStreamingH264NALPacket * This, /* out */ void **buffer); - - HRESULT ( STDMETHODCALLTYPE *GetBytesWithSizePrefix )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264NALPacket, GetBytesWithSizePrefix) + HRESULT ( STDMETHODCALLTYPE *GetBytesWithSizePrefix )( IBMDStreamingH264NALPacket * This, /* out */ void **buffer); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayTime )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264NALPacket, GetDisplayTime) + HRESULT ( STDMETHODCALLTYPE *GetDisplayTime )( IBMDStreamingH264NALPacket * This, /* in */ ULONGLONG requestedTimeScale, /* out */ ULONGLONG *displayTime); - - HRESULT ( STDMETHODCALLTYPE *GetPacketIndex )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264NALPacket, GetPacketIndex) + HRESULT ( STDMETHODCALLTYPE *GetPacketIndex )( IBMDStreamingH264NALPacket * This, /* out */ unsigned int *packetIndex); - + END_INTERFACE } IBMDStreamingH264NALPacketVtbl; @@ -4604,35 +4858,35 @@ CONST_VTBL struct IBMDStreamingH264NALPacketVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IBMDStreamingH264NALPacket_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IBMDStreamingH264NALPacket_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IBMDStreamingH264NALPacket_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IBMDStreamingH264NALPacket_GetPayloadSize(This) \ - ( (This)->lpVtbl -> GetPayloadSize(This) ) + ( (This)->lpVtbl -> GetPayloadSize(This) ) #define IBMDStreamingH264NALPacket_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IBMDStreamingH264NALPacket_GetBytesWithSizePrefix(This,buffer) \ - ( (This)->lpVtbl -> GetBytesWithSizePrefix(This,buffer) ) + ( (This)->lpVtbl -> GetBytesWithSizePrefix(This,buffer) ) #define IBMDStreamingH264NALPacket_GetDisplayTime(This,requestedTimeScale,displayTime) \ - ( (This)->lpVtbl -> GetDisplayTime(This,requestedTimeScale,displayTime) ) + ( (This)->lpVtbl -> GetDisplayTime(This,requestedTimeScale,displayTime) ) #define IBMDStreamingH264NALPacket_GetPacketIndex(This,packetIndex) \ - ( (This)->lpVtbl -> GetPacketIndex(This,packetIndex) ) + ( (This)->lpVtbl -> GetPacketIndex(This,packetIndex) ) #endif /* COBJMACROS */ @@ -4649,71 +4903,79 @@ #define __IBMDStreamingAudioPacket_INTERFACE_DEFINED__ /* interface IBMDStreamingAudioPacket */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IBMDStreamingAudioPacket; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("D9EB5902-1AD2-43F4-9E2C-3CFA50B5EE19") IBMDStreamingAudioPacket : public IUnknown { public: virtual BMDStreamingAudioCodec STDMETHODCALLTYPE GetCodec( void) = 0; - + virtual long STDMETHODCALLTYPE GetPayloadSize( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBytes( + + virtual HRESULT STDMETHODCALLTYPE GetBytes( /* out */ void **buffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPlayTime( + + virtual HRESULT STDMETHODCALLTYPE GetPlayTime( /* in */ ULONGLONG requestedTimeScale, /* out */ ULONGLONG *playTime) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPacketIndex( + + virtual HRESULT STDMETHODCALLTYPE GetPacketIndex( /* out */ unsigned int *packetIndex) = 0; - + }; - - + + #else /* C style interface */ typedef struct IBMDStreamingAudioPacketVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IBMDStreamingAudioPacket * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IBMDStreamingAudioPacket * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IBMDStreamingAudioPacket * This); - - BMDStreamingAudioCodec ( STDMETHODCALLTYPE *GetCodec )( + + DECLSPEC_XFGVIRT(IBMDStreamingAudioPacket, GetCodec) + BMDStreamingAudioCodec ( STDMETHODCALLTYPE *GetCodec )( IBMDStreamingAudioPacket * This); - - long ( STDMETHODCALLTYPE *GetPayloadSize )( + + DECLSPEC_XFGVIRT(IBMDStreamingAudioPacket, GetPayloadSize) + long ( STDMETHODCALLTYPE *GetPayloadSize )( IBMDStreamingAudioPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IBMDStreamingAudioPacket, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IBMDStreamingAudioPacket * This, /* out */ void **buffer); - - HRESULT ( STDMETHODCALLTYPE *GetPlayTime )( + + DECLSPEC_XFGVIRT(IBMDStreamingAudioPacket, GetPlayTime) + HRESULT ( STDMETHODCALLTYPE *GetPlayTime )( IBMDStreamingAudioPacket * This, /* in */ ULONGLONG requestedTimeScale, /* out */ ULONGLONG *playTime); - - HRESULT ( STDMETHODCALLTYPE *GetPacketIndex )( + + DECLSPEC_XFGVIRT(IBMDStreamingAudioPacket, GetPacketIndex) + HRESULT ( STDMETHODCALLTYPE *GetPacketIndex )( IBMDStreamingAudioPacket * This, /* out */ unsigned int *packetIndex); - + END_INTERFACE } IBMDStreamingAudioPacketVtbl; @@ -4722,35 +4984,35 @@ CONST_VTBL struct IBMDStreamingAudioPacketVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IBMDStreamingAudioPacket_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IBMDStreamingAudioPacket_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IBMDStreamingAudioPacket_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IBMDStreamingAudioPacket_GetCodec(This) \ - ( (This)->lpVtbl -> GetCodec(This) ) + ( (This)->lpVtbl -> GetCodec(This) ) #define IBMDStreamingAudioPacket_GetPayloadSize(This) \ - ( (This)->lpVtbl -> GetPayloadSize(This) ) + ( (This)->lpVtbl -> GetPayloadSize(This) ) #define IBMDStreamingAudioPacket_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IBMDStreamingAudioPacket_GetPlayTime(This,requestedTimeScale,playTime) \ - ( (This)->lpVtbl -> GetPlayTime(This,requestedTimeScale,playTime) ) + ( (This)->lpVtbl -> GetPlayTime(This,requestedTimeScale,playTime) ) #define IBMDStreamingAudioPacket_GetPacketIndex(This,packetIndex) \ - ( (This)->lpVtbl -> GetPacketIndex(This,packetIndex) ) + ( (This)->lpVtbl -> GetPacketIndex(This,packetIndex) ) #endif /* COBJMACROS */ @@ -4767,50 +5029,55 @@ #define __IBMDStreamingMPEG2TSPacket_INTERFACE_DEFINED__ /* interface IBMDStreamingMPEG2TSPacket */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IBMDStreamingMPEG2TSPacket; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("91810D1C-4FB3-4AAA-AE56-FA301D3DFA4C") IBMDStreamingMPEG2TSPacket : public IUnknown { public: virtual long STDMETHODCALLTYPE GetPayloadSize( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBytes( + + virtual HRESULT STDMETHODCALLTYPE GetBytes( /* out */ void **buffer) = 0; - + }; - - + + #else /* C style interface */ typedef struct IBMDStreamingMPEG2TSPacketVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IBMDStreamingMPEG2TSPacket * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IBMDStreamingMPEG2TSPacket * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IBMDStreamingMPEG2TSPacket * This); - - long ( STDMETHODCALLTYPE *GetPayloadSize )( + + DECLSPEC_XFGVIRT(IBMDStreamingMPEG2TSPacket, GetPayloadSize) + long ( STDMETHODCALLTYPE *GetPayloadSize )( IBMDStreamingMPEG2TSPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IBMDStreamingMPEG2TSPacket, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IBMDStreamingMPEG2TSPacket * This, /* out */ void **buffer); - + END_INTERFACE } IBMDStreamingMPEG2TSPacketVtbl; @@ -4819,26 +5086,26 @@ CONST_VTBL struct IBMDStreamingMPEG2TSPacketVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IBMDStreamingMPEG2TSPacket_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IBMDStreamingMPEG2TSPacket_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IBMDStreamingMPEG2TSPacket_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IBMDStreamingMPEG2TSPacket_GetPayloadSize(This) \ - ( (This)->lpVtbl -> GetPayloadSize(This) ) + ( (This)->lpVtbl -> GetPayloadSize(This) ) #define IBMDStreamingMPEG2TSPacket_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #endif /* COBJMACROS */ @@ -4855,65 +5122,71 @@ #define __IBMDStreamingH264NALParser_INTERFACE_DEFINED__ /* interface IBMDStreamingH264NALParser */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IBMDStreamingH264NALParser; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("5867F18C-5BFA-4CCC-B2A7-9DFD140417D2") IBMDStreamingH264NALParser : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE IsNALSequenceParameterSet( + virtual HRESULT STDMETHODCALLTYPE IsNALSequenceParameterSet( /* in */ IBMDStreamingH264NALPacket *nal) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsNALPictureParameterSet( + + virtual HRESULT STDMETHODCALLTYPE IsNALPictureParameterSet( /* in */ IBMDStreamingH264NALPacket *nal) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetProfileAndLevelFromSPS( + + virtual HRESULT STDMETHODCALLTYPE GetProfileAndLevelFromSPS( /* in */ IBMDStreamingH264NALPacket *nal, /* out */ unsigned int *profileIdc, /* out */ unsigned int *profileCompatability, /* out */ unsigned int *levelIdc) = 0; - + }; - - + + #else /* C style interface */ typedef struct IBMDStreamingH264NALParserVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IBMDStreamingH264NALParser * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IBMDStreamingH264NALParser * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IBMDStreamingH264NALParser * This); - - HRESULT ( STDMETHODCALLTYPE *IsNALSequenceParameterSet )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264NALParser, IsNALSequenceParameterSet) + HRESULT ( STDMETHODCALLTYPE *IsNALSequenceParameterSet )( IBMDStreamingH264NALParser * This, /* in */ IBMDStreamingH264NALPacket *nal); - - HRESULT ( STDMETHODCALLTYPE *IsNALPictureParameterSet )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264NALParser, IsNALPictureParameterSet) + HRESULT ( STDMETHODCALLTYPE *IsNALPictureParameterSet )( IBMDStreamingH264NALParser * This, /* in */ IBMDStreamingH264NALPacket *nal); - - HRESULT ( STDMETHODCALLTYPE *GetProfileAndLevelFromSPS )( + + DECLSPEC_XFGVIRT(IBMDStreamingH264NALParser, GetProfileAndLevelFromSPS) + HRESULT ( STDMETHODCALLTYPE *GetProfileAndLevelFromSPS )( IBMDStreamingH264NALParser * This, /* in */ IBMDStreamingH264NALPacket *nal, /* out */ unsigned int *profileIdc, /* out */ unsigned int *profileCompatability, /* out */ unsigned int *levelIdc); - + END_INTERFACE } IBMDStreamingH264NALParserVtbl; @@ -4922,29 +5195,29 @@ CONST_VTBL struct IBMDStreamingH264NALParserVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IBMDStreamingH264NALParser_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IBMDStreamingH264NALParser_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IBMDStreamingH264NALParser_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IBMDStreamingH264NALParser_IsNALSequenceParameterSet(This,nal) \ - ( (This)->lpVtbl -> IsNALSequenceParameterSet(This,nal) ) + ( (This)->lpVtbl -> IsNALSequenceParameterSet(This,nal) ) #define IBMDStreamingH264NALParser_IsNALPictureParameterSet(This,nal) \ - ( (This)->lpVtbl -> IsNALPictureParameterSet(This,nal) ) + ( (This)->lpVtbl -> IsNALPictureParameterSet(This,nal) ) #define IBMDStreamingH264NALParser_GetProfileAndLevelFromSPS(This,nal,profileIdc,profileCompatability,levelIdc) \ - ( (This)->lpVtbl -> GetProfileAndLevelFromSPS(This,nal,profileIdc,profileCompatability,levelIdc) ) + ( (This)->lpVtbl -> GetProfileAndLevelFromSPS(This,nal,profileIdc,profileCompatability,levelIdc) ) #endif /* COBJMACROS */ @@ -4977,52 +5250,57 @@ #define __IDeckLinkVideoOutputCallback_INTERFACE_DEFINED__ /* interface IDeckLinkVideoOutputCallback */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkVideoOutputCallback; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("20AA5225-1958-47CB-820B-80A8D521A6EE") IDeckLinkVideoOutputCallback : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE ScheduledFrameCompleted( + virtual HRESULT STDMETHODCALLTYPE ScheduledFrameCompleted( /* in */ IDeckLinkVideoFrame *completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0; - + virtual HRESULT STDMETHODCALLTYPE ScheduledPlaybackHasStopped( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoOutputCallbackVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoOutputCallback * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoOutputCallback * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoOutputCallback * This); - - HRESULT ( STDMETHODCALLTYPE *ScheduledFrameCompleted )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoOutputCallback, ScheduledFrameCompleted) + HRESULT ( STDMETHODCALLTYPE *ScheduledFrameCompleted )( IDeckLinkVideoOutputCallback * This, /* in */ IDeckLinkVideoFrame *completedFrame, /* in */ BMDOutputFrameCompletionResult result); - - HRESULT ( STDMETHODCALLTYPE *ScheduledPlaybackHasStopped )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoOutputCallback, ScheduledPlaybackHasStopped) + HRESULT ( STDMETHODCALLTYPE *ScheduledPlaybackHasStopped )( IDeckLinkVideoOutputCallback * This); - + END_INTERFACE } IDeckLinkVideoOutputCallbackVtbl; @@ -5031,26 +5309,26 @@ CONST_VTBL struct IDeckLinkVideoOutputCallbackVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoOutputCallback_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoOutputCallback_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoOutputCallback_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoOutputCallback_ScheduledFrameCompleted(This,completedFrame,result) \ - ( (This)->lpVtbl -> ScheduledFrameCompleted(This,completedFrame,result) ) + ( (This)->lpVtbl -> ScheduledFrameCompleted(This,completedFrame,result) ) #define IDeckLinkVideoOutputCallback_ScheduledPlaybackHasStopped(This) \ - ( (This)->lpVtbl -> ScheduledPlaybackHasStopped(This) ) + ( (This)->lpVtbl -> ScheduledPlaybackHasStopped(This) ) #endif /* COBJMACROS */ @@ -5067,58 +5345,63 @@ #define __IDeckLinkInputCallback_INTERFACE_DEFINED__ /* interface IDeckLinkInputCallback */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkInputCallback; #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("DD04E5EC-7415-42AB-AE4A-E80C4DFC044A") + + MIDL_INTERFACE("C6FCE4C9-C4E4-4047-82FB-5D238232A902") IDeckLinkInputCallback : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged( + virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged( /* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived( + + virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived( /* in */ IDeckLinkVideoInputFrame *videoFrame, /* in */ IDeckLinkAudioInputPacket *audioPacket) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkInputCallbackVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkInputCallback * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkInputCallback * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkInputCallback * This); - - HRESULT ( STDMETHODCALLTYPE *VideoInputFormatChanged )( + + DECLSPEC_XFGVIRT(IDeckLinkInputCallback, VideoInputFormatChanged) + HRESULT ( STDMETHODCALLTYPE *VideoInputFormatChanged )( IDeckLinkInputCallback * This, /* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags); - - HRESULT ( STDMETHODCALLTYPE *VideoInputFrameArrived )( + + DECLSPEC_XFGVIRT(IDeckLinkInputCallback, VideoInputFrameArrived) + HRESULT ( STDMETHODCALLTYPE *VideoInputFrameArrived )( IDeckLinkInputCallback * This, /* in */ IDeckLinkVideoInputFrame *videoFrame, /* in */ IDeckLinkAudioInputPacket *audioPacket); - + END_INTERFACE } IDeckLinkInputCallbackVtbl; @@ -5127,26 +5410,26 @@ CONST_VTBL struct IDeckLinkInputCallbackVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkInputCallback_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkInputCallback_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkInputCallback_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkInputCallback_VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) \ - ( (This)->lpVtbl -> VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) ) + ( (This)->lpVtbl -> VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) ) #define IDeckLinkInputCallback_VideoInputFrameArrived(This,videoFrame,audioPacket) \ - ( (This)->lpVtbl -> VideoInputFrameArrived(This,videoFrame,audioPacket) ) + ( (This)->lpVtbl -> VideoInputFrameArrived(This,videoFrame,audioPacket) ) #endif /* COBJMACROS */ @@ -5163,63 +5446,69 @@ #define __IDeckLinkEncoderInputCallback_INTERFACE_DEFINED__ /* interface IDeckLinkEncoderInputCallback */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkEncoderInputCallback; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("ACF13E61-F4A0-4974-A6A7-59AFF6268B31") IDeckLinkEncoderInputCallback : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE VideoInputSignalChanged( + virtual HRESULT STDMETHODCALLTYPE VideoInputSignalChanged( /* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE VideoPacketArrived( + + virtual HRESULT STDMETHODCALLTYPE VideoPacketArrived( /* in */ IDeckLinkEncoderVideoPacket *videoPacket) = 0; - - virtual HRESULT STDMETHODCALLTYPE AudioPacketArrived( + + virtual HRESULT STDMETHODCALLTYPE AudioPacketArrived( /* in */ IDeckLinkEncoderAudioPacket *audioPacket) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkEncoderInputCallbackVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkEncoderInputCallback * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkEncoderInputCallback * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkEncoderInputCallback * This); - - HRESULT ( STDMETHODCALLTYPE *VideoInputSignalChanged )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInputCallback, VideoInputSignalChanged) + HRESULT ( STDMETHODCALLTYPE *VideoInputSignalChanged )( IDeckLinkEncoderInputCallback * This, /* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags); - - HRESULT ( STDMETHODCALLTYPE *VideoPacketArrived )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInputCallback, VideoPacketArrived) + HRESULT ( STDMETHODCALLTYPE *VideoPacketArrived )( IDeckLinkEncoderInputCallback * This, /* in */ IDeckLinkEncoderVideoPacket *videoPacket); - - HRESULT ( STDMETHODCALLTYPE *AudioPacketArrived )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInputCallback, AudioPacketArrived) + HRESULT ( STDMETHODCALLTYPE *AudioPacketArrived )( IDeckLinkEncoderInputCallback * This, /* in */ IDeckLinkEncoderAudioPacket *audioPacket); - + END_INTERFACE } IDeckLinkEncoderInputCallbackVtbl; @@ -5228,29 +5517,29 @@ CONST_VTBL struct IDeckLinkEncoderInputCallbackVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkEncoderInputCallback_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkEncoderInputCallback_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkEncoderInputCallback_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkEncoderInputCallback_VideoInputSignalChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) \ - ( (This)->lpVtbl -> VideoInputSignalChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) ) + ( (This)->lpVtbl -> VideoInputSignalChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) ) #define IDeckLinkEncoderInputCallback_VideoPacketArrived(This,videoPacket) \ - ( (This)->lpVtbl -> VideoPacketArrived(This,videoPacket) ) + ( (This)->lpVtbl -> VideoPacketArrived(This,videoPacket) ) #define IDeckLinkEncoderInputCallback_AudioPacketArrived(This,audioPacket) \ - ( (This)->lpVtbl -> AudioPacketArrived(This,audioPacket) ) + ( (This)->lpVtbl -> AudioPacketArrived(This,audioPacket) ) #endif /* COBJMACROS */ @@ -5267,64 +5556,71 @@ #define __IDeckLinkMemoryAllocator_INTERFACE_DEFINED__ /* interface IDeckLinkMemoryAllocator */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkMemoryAllocator; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("B36EB6E7-9D29-4AA8-92EF-843B87A289E8") IDeckLinkMemoryAllocator : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE AllocateBuffer( + virtual HRESULT STDMETHODCALLTYPE AllocateBuffer( /* in */ unsigned int bufferSize, /* out */ void **allocatedBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReleaseBuffer( + + virtual HRESULT STDMETHODCALLTYPE ReleaseBuffer( /* in */ void *buffer) = 0; - + virtual HRESULT STDMETHODCALLTYPE Commit( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE Decommit( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkMemoryAllocatorVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkMemoryAllocator * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkMemoryAllocator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkMemoryAllocator * This); - - HRESULT ( STDMETHODCALLTYPE *AllocateBuffer )( + + DECLSPEC_XFGVIRT(IDeckLinkMemoryAllocator, AllocateBuffer) + HRESULT ( STDMETHODCALLTYPE *AllocateBuffer )( IDeckLinkMemoryAllocator * This, /* in */ unsigned int bufferSize, /* out */ void **allocatedBuffer); - - HRESULT ( STDMETHODCALLTYPE *ReleaseBuffer )( + + DECLSPEC_XFGVIRT(IDeckLinkMemoryAllocator, ReleaseBuffer) + HRESULT ( STDMETHODCALLTYPE *ReleaseBuffer )( IDeckLinkMemoryAllocator * This, /* in */ void *buffer); - - HRESULT ( STDMETHODCALLTYPE *Commit )( + + DECLSPEC_XFGVIRT(IDeckLinkMemoryAllocator, Commit) + HRESULT ( STDMETHODCALLTYPE *Commit )( IDeckLinkMemoryAllocator * This); - - HRESULT ( STDMETHODCALLTYPE *Decommit )( + + DECLSPEC_XFGVIRT(IDeckLinkMemoryAllocator, Decommit) + HRESULT ( STDMETHODCALLTYPE *Decommit )( IDeckLinkMemoryAllocator * This); - + END_INTERFACE } IDeckLinkMemoryAllocatorVtbl; @@ -5333,32 +5629,32 @@ CONST_VTBL struct IDeckLinkMemoryAllocatorVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkMemoryAllocator_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkMemoryAllocator_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkMemoryAllocator_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkMemoryAllocator_AllocateBuffer(This,bufferSize,allocatedBuffer) \ - ( (This)->lpVtbl -> AllocateBuffer(This,bufferSize,allocatedBuffer) ) + ( (This)->lpVtbl -> AllocateBuffer(This,bufferSize,allocatedBuffer) ) #define IDeckLinkMemoryAllocator_ReleaseBuffer(This,buffer) \ - ( (This)->lpVtbl -> ReleaseBuffer(This,buffer) ) + ( (This)->lpVtbl -> ReleaseBuffer(This,buffer) ) #define IDeckLinkMemoryAllocator_Commit(This) \ - ( (This)->lpVtbl -> Commit(This) ) + ( (This)->lpVtbl -> Commit(This) ) #define IDeckLinkMemoryAllocator_Decommit(This) \ - ( (This)->lpVtbl -> Decommit(This) ) + ( (This)->lpVtbl -> Decommit(This) ) #endif /* COBJMACROS */ @@ -5375,45 +5671,49 @@ #define __IDeckLinkAudioOutputCallback_INTERFACE_DEFINED__ /* interface IDeckLinkAudioOutputCallback */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkAudioOutputCallback; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("403C681B-7F46-4A12-B993-2BB127084EE6") IDeckLinkAudioOutputCallback : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE RenderAudioSamples( + virtual HRESULT STDMETHODCALLTYPE RenderAudioSamples( /* in */ BOOL preroll) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkAudioOutputCallbackVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkAudioOutputCallback * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkAudioOutputCallback * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkAudioOutputCallback * This); - - HRESULT ( STDMETHODCALLTYPE *RenderAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkAudioOutputCallback, RenderAudioSamples) + HRESULT ( STDMETHODCALLTYPE *RenderAudioSamples )( IDeckLinkAudioOutputCallback * This, /* in */ BOOL preroll); - + END_INTERFACE } IDeckLinkAudioOutputCallbackVtbl; @@ -5422,23 +5722,23 @@ CONST_VTBL struct IDeckLinkAudioOutputCallbackVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkAudioOutputCallback_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkAudioOutputCallback_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkAudioOutputCallback_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkAudioOutputCallback_RenderAudioSamples(This,preroll) \ - ( (This)->lpVtbl -> RenderAudioSamples(This,preroll) ) + ( (This)->lpVtbl -> RenderAudioSamples(This,preroll) ) #endif /* COBJMACROS */ @@ -5455,45 +5755,49 @@ #define __IDeckLinkIterator_INTERFACE_DEFINED__ /* interface IDeckLinkIterator */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkIterator; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("50FB36CD-3063-4B73-BDBB-958087F2D8BA") IDeckLinkIterator : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Next( + virtual HRESULT STDMETHODCALLTYPE Next( /* out */ IDeckLink **deckLinkInstance) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkIteratorVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkIterator * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkIterator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkIterator * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( + + DECLSPEC_XFGVIRT(IDeckLinkIterator, Next) + HRESULT ( STDMETHODCALLTYPE *Next )( IDeckLinkIterator * This, /* out */ IDeckLink **deckLinkInstance); - + END_INTERFACE } IDeckLinkIteratorVtbl; @@ -5502,23 +5806,23 @@ CONST_VTBL struct IDeckLinkIteratorVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkIterator_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkIterator_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkIterator_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkIterator_Next(This,deckLinkInstance) \ - ( (This)->lpVtbl -> Next(This,deckLinkInstance) ) + ( (This)->lpVtbl -> Next(This,deckLinkInstance) ) #endif /* COBJMACROS */ @@ -5535,74 +5839,81 @@ #define __IDeckLinkAPIInformation_INTERFACE_DEFINED__ /* interface IDeckLinkAPIInformation */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkAPIInformation; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("7BEA3C68-730D-4322-AF34-8A7152B532A4") IDeckLinkAPIInformation : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetFlag( + virtual HRESULT STDMETHODCALLTYPE GetFlag( /* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ BOOL *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInt( + + virtual HRESULT STDMETHODCALLTYPE GetInt( /* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ LONGLONG *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFloat( + + virtual HRESULT STDMETHODCALLTYPE GetFloat( /* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ double *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ BSTR *value) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkAPIInformationVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkAPIInformation * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkAPIInformation * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkAPIInformation * This); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkAPIInformation, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( IDeckLinkAPIInformation * This, /* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkAPIInformation, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IDeckLinkAPIInformation * This, /* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkAPIInformation, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( IDeckLinkAPIInformation * This, /* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IDeckLinkAPIInformation, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IDeckLinkAPIInformation * This, /* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ BSTR *value); - + END_INTERFACE } IDeckLinkAPIInformationVtbl; @@ -5611,32 +5922,32 @@ CONST_VTBL struct IDeckLinkAPIInformationVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkAPIInformation_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkAPIInformation_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkAPIInformation_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkAPIInformation_GetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) #define IDeckLinkAPIInformation_GetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) #define IDeckLinkAPIInformation_GetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) #define IDeckLinkAPIInformation_GetString(This,cfgID,value) \ - ( (This)->lpVtbl -> GetString(This,cfgID,value) ) + ( (This)->lpVtbl -> GetString(This,cfgID,value) ) #endif /* COBJMACROS */ @@ -5653,191 +5964,204 @@ #define __IDeckLinkOutput_INTERFACE_DEFINED__ /* interface IDeckLinkOutput */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkOutput; #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("065A0F6C-C508-4D0D-B919-F5EB0EBFC96B") + + MIDL_INTERFACE("BE2D9020-461E-442F-84B7-E949CB953B9D") IDeckLinkOutput : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( /* in */ BMDVideoConnection connection, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, + /* in */ BMDVideoOutputConversionMode conversionMode, /* in */ BMDSupportedVideoModeFlags flags, /* out */ BMDDisplayMode *actualMode, /* out */ BOOL *supported) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayMode( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayMode( /* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( /* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( /* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoOutput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( + + virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( /* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( + + virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( /* in */ int width, /* in */ int height, /* in */ int rowBytes, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame **outFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateAncillaryData( + + virtual HRESULT STDMETHODCALLTYPE CreateAncillaryData( /* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( + + virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( /* in */ IDeckLinkVideoFrame *theFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( + + virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( /* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( /* in */ IDeckLinkVideoOutputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferedVideoFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetBufferedVideoFrameCount( /* out */ unsigned int *bufferedFrameCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount, /* in */ BMDAudioOutputStreamType streamType) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioOutput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( + + virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( /* in */ void *buffer, /* in */ unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesWritten) = 0; - + virtual HRESULT STDMETHODCALLTYPE BeginAudioPreroll( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE EndAudioPreroll( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( + + virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( /* in */ void *buffer, /* in */ unsigned int sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ unsigned int *sampleFramesWritten) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( /* out */ unsigned int *bufferedSampleFrameCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE FlushBufferedAudioSamples( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( + + virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( /* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( + + virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( /* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed) = 0; - - virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( + + virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( /* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsScheduledPlaybackRunning( + + virtual HRESULT STDMETHODCALLTYPE IsScheduledPlaybackRunning( /* out */ BOOL *active) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetScheduledStreamTime( + + virtual HRESULT STDMETHODCALLTYPE GetScheduledStreamTime( /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetReferenceStatus( + + virtual HRESULT STDMETHODCALLTYPE GetReferenceStatus( /* out */ BMDReferenceStatus *referenceStatus) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFrameCompletionReferenceTimestamp( + + virtual HRESULT STDMETHODCALLTYPE GetFrameCompletionReferenceTimestamp( /* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *frameCompletionTimestamp) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkOutputVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkOutput * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkOutput * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkOutput * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkOutput * This, /* in */ BMDVideoConnection connection, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, + /* in */ BMDVideoOutputConversionMode conversionMode, /* in */ BMDSupportedVideoModeFlags flags, /* out */ BMDDisplayMode *actualMode, /* out */ BOOL *supported); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayMode )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, GetDisplayMode) + HRESULT ( STDMETHODCALLTYPE *GetDisplayMode )( IDeckLinkOutput * This, /* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkOutput * This, /* out */ IDeckLinkDisplayModeIterator **iterator); - - HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, SetScreenPreviewCallback) + HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( IDeckLinkOutput * This, /* in */ IDeckLinkScreenPreviewCallback *previewCallback); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, EnableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( IDeckLinkOutput * This, /* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, DisableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( IDeckLinkOutput * This); - - HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, SetVideoOutputFrameMemoryAllocator) + HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( IDeckLinkOutput * This, /* in */ IDeckLinkMemoryAllocator *theAllocator); - - HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, CreateVideoFrame) + HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( IDeckLinkOutput * This, /* in */ int width, /* in */ int height, @@ -5845,111 +6169,132 @@ /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame **outFrame); - - HRESULT ( STDMETHODCALLTYPE *CreateAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, CreateAncillaryData) + HRESULT ( STDMETHODCALLTYPE *CreateAncillaryData )( IDeckLinkOutput * This, /* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer); - - HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, DisplayVideoFrameSync) + HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( IDeckLinkOutput * This, /* in */ IDeckLinkVideoFrame *theFrame); - - HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, ScheduleVideoFrame) + HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( IDeckLinkOutput * This, /* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, SetScheduledFrameCompletionCallback) + HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( IDeckLinkOutput * This, /* in */ IDeckLinkVideoOutputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *GetBufferedVideoFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, GetBufferedVideoFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedVideoFrameCount )( IDeckLinkOutput * This, /* out */ unsigned int *bufferedFrameCount); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, EnableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( IDeckLinkOutput * This, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount, /* in */ BMDAudioOutputStreamType streamType); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, DisableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( IDeckLinkOutput * This); - - HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, WriteAudioSamplesSync) + HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( IDeckLinkOutput * This, /* in */ void *buffer, /* in */ unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesWritten); - - HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, BeginAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( IDeckLinkOutput * This); - - HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, EndAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( IDeckLinkOutput * This); - - HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, ScheduleAudioSamples) + HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( IDeckLinkOutput * This, /* in */ void *buffer, /* in */ unsigned int sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ unsigned int *sampleFramesWritten); - - HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, GetBufferedAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( IDeckLinkOutput * This, /* out */ unsigned int *bufferedSampleFrameCount); - - HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, FlushBufferedAudioSamples) + HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( IDeckLinkOutput * This); - - HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, SetAudioCallback) + HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( IDeckLinkOutput * This, /* in */ IDeckLinkAudioOutputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, StartScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( IDeckLinkOutput * This, /* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed); - - HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, StopScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( IDeckLinkOutput * This, /* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *IsScheduledPlaybackRunning )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, IsScheduledPlaybackRunning) + HRESULT ( STDMETHODCALLTYPE *IsScheduledPlaybackRunning )( IDeckLinkOutput * This, /* out */ BOOL *active); - - HRESULT ( STDMETHODCALLTYPE *GetScheduledStreamTime )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, GetScheduledStreamTime) + HRESULT ( STDMETHODCALLTYPE *GetScheduledStreamTime )( IDeckLinkOutput * This, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed); - - HRESULT ( STDMETHODCALLTYPE *GetReferenceStatus )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, GetReferenceStatus) + HRESULT ( STDMETHODCALLTYPE *GetReferenceStatus )( IDeckLinkOutput * This, /* out */ BMDReferenceStatus *referenceStatus); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( IDeckLinkOutput * This, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame); - - HRESULT ( STDMETHODCALLTYPE *GetFrameCompletionReferenceTimestamp )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput, GetFrameCompletionReferenceTimestamp) + HRESULT ( STDMETHODCALLTYPE *GetFrameCompletionReferenceTimestamp )( IDeckLinkOutput * This, /* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *frameCompletionTimestamp); - + END_INTERFACE } IDeckLinkOutputVtbl; @@ -5958,107 +6303,107 @@ CONST_VTBL struct IDeckLinkOutputVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkOutput_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkOutput_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkOutput_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) -#define IDeckLinkOutput_DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,flags,actualMode,supported) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,flags,actualMode,supported) ) +#define IDeckLinkOutput_DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,conversionMode,flags,actualMode,supported) \ + ( (This)->lpVtbl -> DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,conversionMode,flags,actualMode,supported) ) #define IDeckLinkOutput_GetDisplayMode(This,displayMode,resultDisplayMode) \ - ( (This)->lpVtbl -> GetDisplayMode(This,displayMode,resultDisplayMode) ) + ( (This)->lpVtbl -> GetDisplayMode(This,displayMode,resultDisplayMode) ) #define IDeckLinkOutput_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkOutput_SetScreenPreviewCallback(This,previewCallback) \ - ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) + ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) #define IDeckLinkOutput_EnableVideoOutput(This,displayMode,flags) \ - ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode,flags) ) + ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode,flags) ) #define IDeckLinkOutput_DisableVideoOutput(This) \ - ( (This)->lpVtbl -> DisableVideoOutput(This) ) + ( (This)->lpVtbl -> DisableVideoOutput(This) ) #define IDeckLinkOutput_SetVideoOutputFrameMemoryAllocator(This,theAllocator) \ - ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) + ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) #define IDeckLinkOutput_CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) \ - ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) + ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) #define IDeckLinkOutput_CreateAncillaryData(This,pixelFormat,outBuffer) \ - ( (This)->lpVtbl -> CreateAncillaryData(This,pixelFormat,outBuffer) ) + ( (This)->lpVtbl -> CreateAncillaryData(This,pixelFormat,outBuffer) ) #define IDeckLinkOutput_DisplayVideoFrameSync(This,theFrame) \ - ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) + ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) #define IDeckLinkOutput_ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) \ - ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) + ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) #define IDeckLinkOutput_SetScheduledFrameCompletionCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) #define IDeckLinkOutput_GetBufferedVideoFrameCount(This,bufferedFrameCount) \ - ( (This)->lpVtbl -> GetBufferedVideoFrameCount(This,bufferedFrameCount) ) + ( (This)->lpVtbl -> GetBufferedVideoFrameCount(This,bufferedFrameCount) ) #define IDeckLinkOutput_EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) \ - ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) ) + ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) ) #define IDeckLinkOutput_DisableAudioOutput(This) \ - ( (This)->lpVtbl -> DisableAudioOutput(This) ) + ( (This)->lpVtbl -> DisableAudioOutput(This) ) #define IDeckLinkOutput_WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) \ - ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) + ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) #define IDeckLinkOutput_BeginAudioPreroll(This) \ - ( (This)->lpVtbl -> BeginAudioPreroll(This) ) + ( (This)->lpVtbl -> BeginAudioPreroll(This) ) #define IDeckLinkOutput_EndAudioPreroll(This) \ - ( (This)->lpVtbl -> EndAudioPreroll(This) ) + ( (This)->lpVtbl -> EndAudioPreroll(This) ) #define IDeckLinkOutput_ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) \ - ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) + ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) #define IDeckLinkOutput_GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) \ - ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) ) + ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) ) #define IDeckLinkOutput_FlushBufferedAudioSamples(This) \ - ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) + ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) #define IDeckLinkOutput_SetAudioCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) #define IDeckLinkOutput_StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) \ - ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) + ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) #define IDeckLinkOutput_StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) \ - ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) + ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) #define IDeckLinkOutput_IsScheduledPlaybackRunning(This,active) \ - ( (This)->lpVtbl -> IsScheduledPlaybackRunning(This,active) ) + ( (This)->lpVtbl -> IsScheduledPlaybackRunning(This,active) ) #define IDeckLinkOutput_GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) \ - ( (This)->lpVtbl -> GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) ) + ( (This)->lpVtbl -> GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) ) #define IDeckLinkOutput_GetReferenceStatus(This,referenceStatus) \ - ( (This)->lpVtbl -> GetReferenceStatus(This,referenceStatus) ) + ( (This)->lpVtbl -> GetReferenceStatus(This,referenceStatus) ) #define IDeckLinkOutput_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \ - ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) #define IDeckLinkOutput_GetFrameCompletionReferenceTimestamp(This,theFrame,desiredTimeScale,frameCompletionTimestamp) \ - ( (This)->lpVtbl -> GetFrameCompletionReferenceTimestamp(This,theFrame,desiredTimeScale,frameCompletionTimestamp) ) + ( (This)->lpVtbl -> GetFrameCompletionReferenceTimestamp(This,theFrame,desiredTimeScale,frameCompletionTimestamp) ) #endif /* COBJMACROS */ @@ -6075,169 +6420,193 @@ #define __IDeckLinkInput_INTERFACE_DEFINED__ /* interface IDeckLinkInput */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkInput; #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2A88CF76-F494-4216-A7EF-DC74EEB83882") + + MIDL_INTERFACE("C21CDB6E-F414-46E4-A636-80A566E0ED37") IDeckLinkInput : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( /* in */ BMDVideoConnection connection, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, + /* in */ BMDVideoInputConversionMode conversionMode, /* in */ BMDSupportedVideoModeFlags flags, + /* out */ BMDDisplayMode *actualMode, /* out */ BOOL *supported) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayMode( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayMode( /* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( /* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( /* out */ unsigned int *availableFrameCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoInputFrameMemoryAllocator( + + virtual HRESULT STDMETHODCALLTYPE SetVideoInputFrameMemoryAllocator( /* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( /* out */ unsigned int *availableSampleFrameCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE StartStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE StopStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE PauseStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE FlushStreams( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( + + virtual HRESULT STDMETHODCALLTYPE SetCallback( /* in */ IDeckLinkInputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkInputVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkInput * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkInput * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkInput * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkInput * This, /* in */ BMDVideoConnection connection, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, + /* in */ BMDVideoInputConversionMode conversionMode, /* in */ BMDSupportedVideoModeFlags flags, + /* out */ BMDDisplayMode *actualMode, /* out */ BOOL *supported); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayMode )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, GetDisplayMode) + HRESULT ( STDMETHODCALLTYPE *GetDisplayMode )( IDeckLinkInput * This, /* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkInput * This, /* out */ IDeckLinkDisplayModeIterator **iterator); - - HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, SetScreenPreviewCallback) + HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( IDeckLinkInput * This, /* in */ IDeckLinkScreenPreviewCallback *previewCallback); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, EnableVideoInput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( IDeckLinkInput * This, /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, DisableVideoInput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( IDeckLinkInput * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, GetAvailableVideoFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( IDeckLinkInput * This, /* out */ unsigned int *availableFrameCount); - - HRESULT ( STDMETHODCALLTYPE *SetVideoInputFrameMemoryAllocator )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, SetVideoInputFrameMemoryAllocator) + HRESULT ( STDMETHODCALLTYPE *SetVideoInputFrameMemoryAllocator )( IDeckLinkInput * This, /* in */ IDeckLinkMemoryAllocator *theAllocator); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, EnableAudioInput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( IDeckLinkInput * This, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, DisableAudioInput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( IDeckLinkInput * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, GetAvailableAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( IDeckLinkInput * This, /* out */ unsigned int *availableSampleFrameCount); - - HRESULT ( STDMETHODCALLTYPE *StartStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, StartStreams) + HRESULT ( STDMETHODCALLTYPE *StartStreams )( IDeckLinkInput * This); - - HRESULT ( STDMETHODCALLTYPE *StopStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, StopStreams) + HRESULT ( STDMETHODCALLTYPE *StopStreams )( IDeckLinkInput * This); - - HRESULT ( STDMETHODCALLTYPE *PauseStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, PauseStreams) + HRESULT ( STDMETHODCALLTYPE *PauseStreams )( IDeckLinkInput * This); - - HRESULT ( STDMETHODCALLTYPE *FlushStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, FlushStreams) + HRESULT ( STDMETHODCALLTYPE *FlushStreams )( IDeckLinkInput * This); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( IDeckLinkInput * This, /* in */ IDeckLinkInputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + + DECLSPEC_XFGVIRT(IDeckLinkInput, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( IDeckLinkInput * This, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame); - + END_INTERFACE } IDeckLinkInputVtbl; @@ -6246,71 +6615,71 @@ CONST_VTBL struct IDeckLinkInputVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkInput_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkInput_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkInput_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) -#define IDeckLinkInput_DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,flags,supported) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,flags,supported) ) +#define IDeckLinkInput_DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,conversionMode,flags,actualMode,supported) \ + ( (This)->lpVtbl -> DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,conversionMode,flags,actualMode,supported) ) #define IDeckLinkInput_GetDisplayMode(This,displayMode,resultDisplayMode) \ - ( (This)->lpVtbl -> GetDisplayMode(This,displayMode,resultDisplayMode) ) + ( (This)->lpVtbl -> GetDisplayMode(This,displayMode,resultDisplayMode) ) #define IDeckLinkInput_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkInput_SetScreenPreviewCallback(This,previewCallback) \ - ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) + ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) #define IDeckLinkInput_EnableVideoInput(This,displayMode,pixelFormat,flags) \ - ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) + ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) #define IDeckLinkInput_DisableVideoInput(This) \ - ( (This)->lpVtbl -> DisableVideoInput(This) ) + ( (This)->lpVtbl -> DisableVideoInput(This) ) #define IDeckLinkInput_GetAvailableVideoFrameCount(This,availableFrameCount) \ - ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) + ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) #define IDeckLinkInput_SetVideoInputFrameMemoryAllocator(This,theAllocator) \ - ( (This)->lpVtbl -> SetVideoInputFrameMemoryAllocator(This,theAllocator) ) + ( (This)->lpVtbl -> SetVideoInputFrameMemoryAllocator(This,theAllocator) ) #define IDeckLinkInput_EnableAudioInput(This,sampleRate,sampleType,channelCount) \ - ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) + ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) #define IDeckLinkInput_DisableAudioInput(This) \ - ( (This)->lpVtbl -> DisableAudioInput(This) ) + ( (This)->lpVtbl -> DisableAudioInput(This) ) #define IDeckLinkInput_GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) \ - ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) + ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) #define IDeckLinkInput_StartStreams(This) \ - ( (This)->lpVtbl -> StartStreams(This) ) + ( (This)->lpVtbl -> StartStreams(This) ) #define IDeckLinkInput_StopStreams(This) \ - ( (This)->lpVtbl -> StopStreams(This) ) + ( (This)->lpVtbl -> StopStreams(This) ) #define IDeckLinkInput_PauseStreams(This) \ - ( (This)->lpVtbl -> PauseStreams(This) ) + ( (This)->lpVtbl -> PauseStreams(This) ) #define IDeckLinkInput_FlushStreams(This) \ - ( (This)->lpVtbl -> FlushStreams(This) ) + ( (This)->lpVtbl -> FlushStreams(This) ) #define IDeckLinkInput_SetCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetCallback(This,theCallback) ) #define IDeckLinkInput_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \ - ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) #endif /* COBJMACROS */ @@ -6327,61 +6696,67 @@ #define __IDeckLinkHDMIInputEDID_INTERFACE_DEFINED__ /* interface IDeckLinkHDMIInputEDID */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkHDMIInputEDID; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("ABBBACBC-45BC-4665-9D92-ACE6E5A97902") IDeckLinkHDMIInputEDID : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE SetInt( + virtual HRESULT STDMETHODCALLTYPE SetInt( /* in */ BMDDeckLinkHDMIInputEDIDID cfgID, /* in */ LONGLONG value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInt( + + virtual HRESULT STDMETHODCALLTYPE GetInt( /* in */ BMDDeckLinkHDMIInputEDIDID cfgID, /* out */ LONGLONG *value) = 0; - + virtual HRESULT STDMETHODCALLTYPE WriteToEDID( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkHDMIInputEDIDVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkHDMIInputEDID * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkHDMIInputEDID * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkHDMIInputEDID * This); - - HRESULT ( STDMETHODCALLTYPE *SetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkHDMIInputEDID, SetInt) + HRESULT ( STDMETHODCALLTYPE *SetInt )( IDeckLinkHDMIInputEDID * This, /* in */ BMDDeckLinkHDMIInputEDIDID cfgID, /* in */ LONGLONG value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkHDMIInputEDID, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IDeckLinkHDMIInputEDID * This, /* in */ BMDDeckLinkHDMIInputEDIDID cfgID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *WriteToEDID )( + + DECLSPEC_XFGVIRT(IDeckLinkHDMIInputEDID, WriteToEDID) + HRESULT ( STDMETHODCALLTYPE *WriteToEDID )( IDeckLinkHDMIInputEDID * This); - + END_INTERFACE } IDeckLinkHDMIInputEDIDVtbl; @@ -6390,29 +6765,29 @@ CONST_VTBL struct IDeckLinkHDMIInputEDIDVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkHDMIInputEDID_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkHDMIInputEDID_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkHDMIInputEDID_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkHDMIInputEDID_SetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) #define IDeckLinkHDMIInputEDID_GetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) #define IDeckLinkHDMIInputEDID_WriteToEDID(This) \ - ( (This)->lpVtbl -> WriteToEDID(This) ) + ( (This)->lpVtbl -> WriteToEDID(This) ) #endif /* COBJMACROS */ @@ -6429,95 +6804,99 @@ #define __IDeckLinkEncoderInput_INTERFACE_DEFINED__ /* interface IDeckLinkEncoderInput */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkEncoderInput; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("F222551D-13DF-4FD8-B587-9D4F19EC12C9") IDeckLinkEncoderInput : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( /* in */ BMDVideoConnection connection, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedCodec, /* in */ unsigned int requestedCodecProfile, /* in */ BMDSupportedVideoModeFlags flags, /* out */ BOOL *supported) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayMode( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayMode( /* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailablePacketsCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailablePacketsCount( /* out */ unsigned int *availablePacketsCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMemoryAllocator( + + virtual HRESULT STDMETHODCALLTYPE SetMemoryAllocator( /* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( /* in */ BMDAudioFormat audioFormat, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( /* out */ unsigned int *availableSampleFrameCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE StartStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE StopStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE PauseStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE FlushStreams( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( + + virtual HRESULT STDMETHODCALLTYPE SetCallback( /* in */ IDeckLinkEncoderInputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkEncoderInputVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkEncoderInput * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkEncoderInput * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkEncoderInput * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkEncoderInput * This, /* in */ BMDVideoConnection connection, /* in */ BMDDisplayMode requestedMode, @@ -6525,70 +6904,85 @@ /* in */ unsigned int requestedCodecProfile, /* in */ BMDSupportedVideoModeFlags flags, /* out */ BOOL *supported); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayMode )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, GetDisplayMode) + HRESULT ( STDMETHODCALLTYPE *GetDisplayMode )( IDeckLinkEncoderInput * This, /* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkEncoderInput * This, /* out */ IDeckLinkDisplayModeIterator **iterator); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, EnableVideoInput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( IDeckLinkEncoderInput * This, /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, DisableVideoInput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( IDeckLinkEncoderInput * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailablePacketsCount )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, GetAvailablePacketsCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailablePacketsCount )( IDeckLinkEncoderInput * This, /* out */ unsigned int *availablePacketsCount); - - HRESULT ( STDMETHODCALLTYPE *SetMemoryAllocator )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, SetMemoryAllocator) + HRESULT ( STDMETHODCALLTYPE *SetMemoryAllocator )( IDeckLinkEncoderInput * This, /* in */ IDeckLinkMemoryAllocator *theAllocator); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, EnableAudioInput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( IDeckLinkEncoderInput * This, /* in */ BMDAudioFormat audioFormat, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, DisableAudioInput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( IDeckLinkEncoderInput * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, GetAvailableAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( IDeckLinkEncoderInput * This, /* out */ unsigned int *availableSampleFrameCount); - - HRESULT ( STDMETHODCALLTYPE *StartStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, StartStreams) + HRESULT ( STDMETHODCALLTYPE *StartStreams )( IDeckLinkEncoderInput * This); - - HRESULT ( STDMETHODCALLTYPE *StopStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, StopStreams) + HRESULT ( STDMETHODCALLTYPE *StopStreams )( IDeckLinkEncoderInput * This); - - HRESULT ( STDMETHODCALLTYPE *PauseStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, PauseStreams) + HRESULT ( STDMETHODCALLTYPE *PauseStreams )( IDeckLinkEncoderInput * This); - - HRESULT ( STDMETHODCALLTYPE *FlushStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, FlushStreams) + HRESULT ( STDMETHODCALLTYPE *FlushStreams )( IDeckLinkEncoderInput * This); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( IDeckLinkEncoderInput * This, /* in */ IDeckLinkEncoderInputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( IDeckLinkEncoderInput * This, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame); - + END_INTERFACE } IDeckLinkEncoderInputVtbl; @@ -6597,68 +6991,68 @@ CONST_VTBL struct IDeckLinkEncoderInputVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkEncoderInput_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkEncoderInput_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkEncoderInput_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkEncoderInput_DoesSupportVideoMode(This,connection,requestedMode,requestedCodec,requestedCodecProfile,flags,supported) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,connection,requestedMode,requestedCodec,requestedCodecProfile,flags,supported) ) + ( (This)->lpVtbl -> DoesSupportVideoMode(This,connection,requestedMode,requestedCodec,requestedCodecProfile,flags,supported) ) #define IDeckLinkEncoderInput_GetDisplayMode(This,displayMode,resultDisplayMode) \ - ( (This)->lpVtbl -> GetDisplayMode(This,displayMode,resultDisplayMode) ) + ( (This)->lpVtbl -> GetDisplayMode(This,displayMode,resultDisplayMode) ) #define IDeckLinkEncoderInput_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkEncoderInput_EnableVideoInput(This,displayMode,pixelFormat,flags) \ - ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) + ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) #define IDeckLinkEncoderInput_DisableVideoInput(This) \ - ( (This)->lpVtbl -> DisableVideoInput(This) ) + ( (This)->lpVtbl -> DisableVideoInput(This) ) #define IDeckLinkEncoderInput_GetAvailablePacketsCount(This,availablePacketsCount) \ - ( (This)->lpVtbl -> GetAvailablePacketsCount(This,availablePacketsCount) ) + ( (This)->lpVtbl -> GetAvailablePacketsCount(This,availablePacketsCount) ) #define IDeckLinkEncoderInput_SetMemoryAllocator(This,theAllocator) \ - ( (This)->lpVtbl -> SetMemoryAllocator(This,theAllocator) ) + ( (This)->lpVtbl -> SetMemoryAllocator(This,theAllocator) ) #define IDeckLinkEncoderInput_EnableAudioInput(This,audioFormat,sampleRate,sampleType,channelCount) \ - ( (This)->lpVtbl -> EnableAudioInput(This,audioFormat,sampleRate,sampleType,channelCount) ) + ( (This)->lpVtbl -> EnableAudioInput(This,audioFormat,sampleRate,sampleType,channelCount) ) #define IDeckLinkEncoderInput_DisableAudioInput(This) \ - ( (This)->lpVtbl -> DisableAudioInput(This) ) + ( (This)->lpVtbl -> DisableAudioInput(This) ) #define IDeckLinkEncoderInput_GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) \ - ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) + ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) #define IDeckLinkEncoderInput_StartStreams(This) \ - ( (This)->lpVtbl -> StartStreams(This) ) + ( (This)->lpVtbl -> StartStreams(This) ) #define IDeckLinkEncoderInput_StopStreams(This) \ - ( (This)->lpVtbl -> StopStreams(This) ) + ( (This)->lpVtbl -> StopStreams(This) ) #define IDeckLinkEncoderInput_PauseStreams(This) \ - ( (This)->lpVtbl -> PauseStreams(This) ) + ( (This)->lpVtbl -> PauseStreams(This) ) #define IDeckLinkEncoderInput_FlushStreams(This) \ - ( (This)->lpVtbl -> FlushStreams(This) ) + ( (This)->lpVtbl -> FlushStreams(This) ) #define IDeckLinkEncoderInput_SetCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetCallback(This,theCallback) ) #define IDeckLinkEncoderInput_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \ - ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) #endif /* COBJMACROS */ @@ -6675,86 +7069,97 @@ #define __IDeckLinkVideoFrame_INTERFACE_DEFINED__ /* interface IDeckLinkVideoFrame */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkVideoFrame; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("3F716FE0-F023-4111-BE5D-EF4414C05B17") IDeckLinkVideoFrame : public IUnknown { public: virtual long STDMETHODCALLTYPE GetWidth( void) = 0; - + virtual long STDMETHODCALLTYPE GetHeight( void) = 0; - + virtual long STDMETHODCALLTYPE GetRowBytes( void) = 0; - + virtual BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat( void) = 0; - + virtual BMDFrameFlags STDMETHODCALLTYPE GetFlags( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBytes( + + virtual HRESULT STDMETHODCALLTYPE GetBytes( /* out */ void **buffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecode( + + virtual HRESULT STDMETHODCALLTYPE GetTimecode( /* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAncillaryData( + + virtual HRESULT STDMETHODCALLTYPE GetAncillaryData( /* out */ IDeckLinkVideoFrameAncillary **ancillary) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoFrameVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoFrame * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoFrame * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoFrame * This); - - long ( STDMETHODCALLTYPE *GetWidth )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetWidth) + long ( STDMETHODCALLTYPE *GetWidth )( IDeckLinkVideoFrame * This); - - long ( STDMETHODCALLTYPE *GetHeight )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetHeight) + long ( STDMETHODCALLTYPE *GetHeight )( IDeckLinkVideoFrame * This); - - long ( STDMETHODCALLTYPE *GetRowBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetRowBytes) + long ( STDMETHODCALLTYPE *GetRowBytes )( IDeckLinkVideoFrame * This); - - BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetPixelFormat) + BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( IDeckLinkVideoFrame * This); - - BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetFlags) + BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( IDeckLinkVideoFrame * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkVideoFrame * This, /* out */ void **buffer); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetTimecode) + HRESULT ( STDMETHODCALLTYPE *GetTimecode )( IDeckLinkVideoFrame * This, /* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode); - - HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetAncillaryData) + HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( IDeckLinkVideoFrame * This, /* out */ IDeckLinkVideoFrameAncillary **ancillary); - + END_INTERFACE } IDeckLinkVideoFrameVtbl; @@ -6763,44 +7168,44 @@ CONST_VTBL struct IDeckLinkVideoFrameVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoFrame_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoFrame_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoFrame_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoFrame_GetWidth(This) \ - ( (This)->lpVtbl -> GetWidth(This) ) + ( (This)->lpVtbl -> GetWidth(This) ) #define IDeckLinkVideoFrame_GetHeight(This) \ - ( (This)->lpVtbl -> GetHeight(This) ) + ( (This)->lpVtbl -> GetHeight(This) ) #define IDeckLinkVideoFrame_GetRowBytes(This) \ - ( (This)->lpVtbl -> GetRowBytes(This) ) + ( (This)->lpVtbl -> GetRowBytes(This) ) #define IDeckLinkVideoFrame_GetPixelFormat(This) \ - ( (This)->lpVtbl -> GetPixelFormat(This) ) + ( (This)->lpVtbl -> GetPixelFormat(This) ) #define IDeckLinkVideoFrame_GetFlags(This) \ - ( (This)->lpVtbl -> GetFlags(This) ) + ( (This)->lpVtbl -> GetFlags(This) ) #define IDeckLinkVideoFrame_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkVideoFrame_GetTimecode(This,format,timecode) \ - ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) + ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) #define IDeckLinkVideoFrame_GetAncillaryData(This,ancillary) \ - ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) + ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) #endif /* COBJMACROS */ @@ -6817,98 +7222,112 @@ #define __IDeckLinkMutableVideoFrame_INTERFACE_DEFINED__ /* interface IDeckLinkMutableVideoFrame */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkMutableVideoFrame; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("69E2639F-40DA-4E19-B6F2-20ACE815C390") IDeckLinkMutableVideoFrame : public IDeckLinkVideoFrame { public: - virtual HRESULT STDMETHODCALLTYPE SetFlags( + virtual HRESULT STDMETHODCALLTYPE SetFlags( /* in */ BMDFrameFlags newFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTimecode( + + virtual HRESULT STDMETHODCALLTYPE SetTimecode( /* in */ BMDTimecodeFormat format, /* in */ IDeckLinkTimecode *timecode) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTimecodeFromComponents( + + virtual HRESULT STDMETHODCALLTYPE SetTimecodeFromComponents( /* in */ BMDTimecodeFormat format, /* in */ unsigned char hours, /* in */ unsigned char minutes, /* in */ unsigned char seconds, /* in */ unsigned char frames, /* in */ BMDTimecodeFlags flags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetAncillaryData( + + virtual HRESULT STDMETHODCALLTYPE SetAncillaryData( /* in */ IDeckLinkVideoFrameAncillary *ancillary) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTimecodeUserBits( + + virtual HRESULT STDMETHODCALLTYPE SetTimecodeUserBits( /* in */ BMDTimecodeFormat format, /* in */ BMDTimecodeUserBits userBits) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkMutableVideoFrameVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkMutableVideoFrame * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkMutableVideoFrame * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkMutableVideoFrame * This); - - long ( STDMETHODCALLTYPE *GetWidth )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetWidth) + long ( STDMETHODCALLTYPE *GetWidth )( IDeckLinkMutableVideoFrame * This); - - long ( STDMETHODCALLTYPE *GetHeight )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetHeight) + long ( STDMETHODCALLTYPE *GetHeight )( IDeckLinkMutableVideoFrame * This); - - long ( STDMETHODCALLTYPE *GetRowBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetRowBytes) + long ( STDMETHODCALLTYPE *GetRowBytes )( IDeckLinkMutableVideoFrame * This); - - BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetPixelFormat) + BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( IDeckLinkMutableVideoFrame * This); - - BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetFlags) + BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( IDeckLinkMutableVideoFrame * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkMutableVideoFrame * This, /* out */ void **buffer); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetTimecode) + HRESULT ( STDMETHODCALLTYPE *GetTimecode )( IDeckLinkMutableVideoFrame * This, /* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode); - - HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetAncillaryData) + HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( IDeckLinkMutableVideoFrame * This, /* out */ IDeckLinkVideoFrameAncillary **ancillary); - - HRESULT ( STDMETHODCALLTYPE *SetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkMutableVideoFrame, SetFlags) + HRESULT ( STDMETHODCALLTYPE *SetFlags )( IDeckLinkMutableVideoFrame * This, /* in */ BMDFrameFlags newFlags); - - HRESULT ( STDMETHODCALLTYPE *SetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkMutableVideoFrame, SetTimecode) + HRESULT ( STDMETHODCALLTYPE *SetTimecode )( IDeckLinkMutableVideoFrame * This, /* in */ BMDTimecodeFormat format, /* in */ IDeckLinkTimecode *timecode); - - HRESULT ( STDMETHODCALLTYPE *SetTimecodeFromComponents )( + + DECLSPEC_XFGVIRT(IDeckLinkMutableVideoFrame, SetTimecodeFromComponents) + HRESULT ( STDMETHODCALLTYPE *SetTimecodeFromComponents )( IDeckLinkMutableVideoFrame * This, /* in */ BMDTimecodeFormat format, /* in */ unsigned char hours, @@ -6916,16 +7335,18 @@ /* in */ unsigned char seconds, /* in */ unsigned char frames, /* in */ BMDTimecodeFlags flags); - - HRESULT ( STDMETHODCALLTYPE *SetAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkMutableVideoFrame, SetAncillaryData) + HRESULT ( STDMETHODCALLTYPE *SetAncillaryData )( IDeckLinkMutableVideoFrame * This, /* in */ IDeckLinkVideoFrameAncillary *ancillary); - - HRESULT ( STDMETHODCALLTYPE *SetTimecodeUserBits )( + + DECLSPEC_XFGVIRT(IDeckLinkMutableVideoFrame, SetTimecodeUserBits) + HRESULT ( STDMETHODCALLTYPE *SetTimecodeUserBits )( IDeckLinkMutableVideoFrame * This, /* in */ BMDTimecodeFormat format, /* in */ BMDTimecodeUserBits userBits); - + END_INTERFACE } IDeckLinkMutableVideoFrameVtbl; @@ -6934,60 +7355,60 @@ CONST_VTBL struct IDeckLinkMutableVideoFrameVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkMutableVideoFrame_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkMutableVideoFrame_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkMutableVideoFrame_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkMutableVideoFrame_GetWidth(This) \ - ( (This)->lpVtbl -> GetWidth(This) ) + ( (This)->lpVtbl -> GetWidth(This) ) #define IDeckLinkMutableVideoFrame_GetHeight(This) \ - ( (This)->lpVtbl -> GetHeight(This) ) + ( (This)->lpVtbl -> GetHeight(This) ) #define IDeckLinkMutableVideoFrame_GetRowBytes(This) \ - ( (This)->lpVtbl -> GetRowBytes(This) ) + ( (This)->lpVtbl -> GetRowBytes(This) ) #define IDeckLinkMutableVideoFrame_GetPixelFormat(This) \ - ( (This)->lpVtbl -> GetPixelFormat(This) ) + ( (This)->lpVtbl -> GetPixelFormat(This) ) #define IDeckLinkMutableVideoFrame_GetFlags(This) \ - ( (This)->lpVtbl -> GetFlags(This) ) + ( (This)->lpVtbl -> GetFlags(This) ) #define IDeckLinkMutableVideoFrame_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkMutableVideoFrame_GetTimecode(This,format,timecode) \ - ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) + ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) #define IDeckLinkMutableVideoFrame_GetAncillaryData(This,ancillary) \ - ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) + ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) #define IDeckLinkMutableVideoFrame_SetFlags(This,newFlags) \ - ( (This)->lpVtbl -> SetFlags(This,newFlags) ) + ( (This)->lpVtbl -> SetFlags(This,newFlags) ) #define IDeckLinkMutableVideoFrame_SetTimecode(This,format,timecode) \ - ( (This)->lpVtbl -> SetTimecode(This,format,timecode) ) + ( (This)->lpVtbl -> SetTimecode(This,format,timecode) ) #define IDeckLinkMutableVideoFrame_SetTimecodeFromComponents(This,format,hours,minutes,seconds,frames,flags) \ - ( (This)->lpVtbl -> SetTimecodeFromComponents(This,format,hours,minutes,seconds,frames,flags) ) + ( (This)->lpVtbl -> SetTimecodeFromComponents(This,format,hours,minutes,seconds,frames,flags) ) #define IDeckLinkMutableVideoFrame_SetAncillaryData(This,ancillary) \ - ( (This)->lpVtbl -> SetAncillaryData(This,ancillary) ) + ( (This)->lpVtbl -> SetAncillaryData(This,ancillary) ) #define IDeckLinkMutableVideoFrame_SetTimecodeUserBits(This,format,userBits) \ - ( (This)->lpVtbl -> SetTimecodeUserBits(This,format,userBits) ) + ( (This)->lpVtbl -> SetTimecodeUserBits(This,format,userBits) ) #endif /* COBJMACROS */ @@ -7004,50 +7425,55 @@ #define __IDeckLinkVideoFrame3DExtensions_INTERFACE_DEFINED__ /* interface IDeckLinkVideoFrame3DExtensions */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkVideoFrame3DExtensions; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7") IDeckLinkVideoFrame3DExtensions : public IUnknown { public: virtual BMDVideo3DPackingFormat STDMETHODCALLTYPE Get3DPackingFormat( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFrameForRightEye( + + virtual HRESULT STDMETHODCALLTYPE GetFrameForRightEye( /* out */ IDeckLinkVideoFrame **rightEyeFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoFrame3DExtensionsVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoFrame3DExtensions * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoFrame3DExtensions * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoFrame3DExtensions * This); - - BMDVideo3DPackingFormat ( STDMETHODCALLTYPE *Get3DPackingFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame3DExtensions, Get3DPackingFormat) + BMDVideo3DPackingFormat ( STDMETHODCALLTYPE *Get3DPackingFormat )( IDeckLinkVideoFrame3DExtensions * This); - - HRESULT ( STDMETHODCALLTYPE *GetFrameForRightEye )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame3DExtensions, GetFrameForRightEye) + HRESULT ( STDMETHODCALLTYPE *GetFrameForRightEye )( IDeckLinkVideoFrame3DExtensions * This, /* out */ IDeckLinkVideoFrame **rightEyeFrame); - + END_INTERFACE } IDeckLinkVideoFrame3DExtensionsVtbl; @@ -7056,26 +7482,26 @@ CONST_VTBL struct IDeckLinkVideoFrame3DExtensionsVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoFrame3DExtensions_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoFrame3DExtensions_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoFrame3DExtensions_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoFrame3DExtensions_Get3DPackingFormat(This) \ - ( (This)->lpVtbl -> Get3DPackingFormat(This) ) + ( (This)->lpVtbl -> Get3DPackingFormat(This) ) #define IDeckLinkVideoFrame3DExtensions_GetFrameForRightEye(This,rightEyeFrame) \ - ( (This)->lpVtbl -> GetFrameForRightEye(This,rightEyeFrame) ) + ( (This)->lpVtbl -> GetFrameForRightEye(This,rightEyeFrame) ) #endif /* COBJMACROS */ @@ -7092,74 +7518,93 @@ #define __IDeckLinkVideoFrameMetadataExtensions_INTERFACE_DEFINED__ /* interface IDeckLinkVideoFrameMetadataExtensions */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkVideoFrameMetadataExtensions; #if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("D5973DC9-6432-46D0-8F0B-2496F8A1238F") + + MIDL_INTERFACE("E232A5B7-4DB4-44C9-9152-F47C12E5F051") IDeckLinkVideoFrameMetadataExtensions : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetInt( + virtual HRESULT STDMETHODCALLTYPE GetInt( /* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ LONGLONG *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFloat( + + virtual HRESULT STDMETHODCALLTYPE GetFloat( /* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ double *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFlag( + + virtual HRESULT STDMETHODCALLTYPE GetFlag( /* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ BOOL *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ BSTR *value) = 0; - + + virtual HRESULT STDMETHODCALLTYPE GetBytes( + /* in */ BMDDeckLinkFrameMetadataID metadataID, + /* out */ void *buffer, + /* outin */ unsigned int *bufferSize) = 0; + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoFrameMetadataExtensionsVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoFrameMetadataExtensions * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoFrameMetadataExtensions * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoFrameMetadataExtensions * This); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameMetadataExtensions, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IDeckLinkVideoFrameMetadataExtensions * This, /* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameMetadataExtensions, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( IDeckLinkVideoFrameMetadataExtensions * This, /* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameMetadataExtensions, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( IDeckLinkVideoFrameMetadataExtensions * This, /* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameMetadataExtensions, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IDeckLinkVideoFrameMetadataExtensions * This, /* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ BSTR *value); - + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameMetadataExtensions, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( + IDeckLinkVideoFrameMetadataExtensions * This, + /* in */ BMDDeckLinkFrameMetadataID metadataID, + /* out */ void *buffer, + /* outin */ unsigned int *bufferSize); + END_INTERFACE } IDeckLinkVideoFrameMetadataExtensionsVtbl; @@ -7168,32 +7613,35 @@ CONST_VTBL struct IDeckLinkVideoFrameMetadataExtensionsVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoFrameMetadataExtensions_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoFrameMetadataExtensions_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoFrameMetadataExtensions_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoFrameMetadataExtensions_GetInt(This,metadataID,value) \ - ( (This)->lpVtbl -> GetInt(This,metadataID,value) ) + ( (This)->lpVtbl -> GetInt(This,metadataID,value) ) #define IDeckLinkVideoFrameMetadataExtensions_GetFloat(This,metadataID,value) \ - ( (This)->lpVtbl -> GetFloat(This,metadataID,value) ) + ( (This)->lpVtbl -> GetFloat(This,metadataID,value) ) #define IDeckLinkVideoFrameMetadataExtensions_GetFlag(This,metadataID,value) \ - ( (This)->lpVtbl -> GetFlag(This,metadataID,value) ) + ( (This)->lpVtbl -> GetFlag(This,metadataID,value) ) #define IDeckLinkVideoFrameMetadataExtensions_GetString(This,metadataID,value) \ - ( (This)->lpVtbl -> GetString(This,metadataID,value) ) + ( (This)->lpVtbl -> GetString(This,metadataID,value) ) + +#define IDeckLinkVideoFrameMetadataExtensions_GetBytes(This,metadataID,buffer,bufferSize) \ + ( (This)->lpVtbl -> GetBytes(This,metadataID,buffer,bufferSize) ) #endif /* COBJMACROS */ @@ -7210,88 +7658,101 @@ #define __IDeckLinkVideoInputFrame_INTERFACE_DEFINED__ /* interface IDeckLinkVideoInputFrame */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkVideoInputFrame; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("05CFE374-537C-4094-9A57-680525118F44") IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame { public: - virtual HRESULT STDMETHODCALLTYPE GetStreamTime( + virtual HRESULT STDMETHODCALLTYPE GetStreamTime( /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, /* in */ BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceTimestamp( + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceTimestamp( /* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoInputFrameVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoInputFrame * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoInputFrame * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoInputFrame * This); - - long ( STDMETHODCALLTYPE *GetWidth )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetWidth) + long ( STDMETHODCALLTYPE *GetWidth )( IDeckLinkVideoInputFrame * This); - - long ( STDMETHODCALLTYPE *GetHeight )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetHeight) + long ( STDMETHODCALLTYPE *GetHeight )( IDeckLinkVideoInputFrame * This); - - long ( STDMETHODCALLTYPE *GetRowBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetRowBytes) + long ( STDMETHODCALLTYPE *GetRowBytes )( IDeckLinkVideoInputFrame * This); - - BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetPixelFormat) + BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( IDeckLinkVideoInputFrame * This); - - BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetFlags) + BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( IDeckLinkVideoInputFrame * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkVideoInputFrame * This, /* out */ void **buffer); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetTimecode) + HRESULT ( STDMETHODCALLTYPE *GetTimecode )( IDeckLinkVideoInputFrame * This, /* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode); - - HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame, GetAncillaryData) + HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( IDeckLinkVideoInputFrame * This, /* out */ IDeckLinkVideoFrameAncillary **ancillary); - - HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoInputFrame, GetStreamTime) + HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( IDeckLinkVideoInputFrame * This, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, /* in */ BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceTimestamp )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoInputFrame, GetHardwareReferenceTimestamp) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceTimestamp )( IDeckLinkVideoInputFrame * This, /* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration); - + END_INTERFACE } IDeckLinkVideoInputFrameVtbl; @@ -7300,51 +7761,51 @@ CONST_VTBL struct IDeckLinkVideoInputFrameVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoInputFrame_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoInputFrame_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoInputFrame_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoInputFrame_GetWidth(This) \ - ( (This)->lpVtbl -> GetWidth(This) ) + ( (This)->lpVtbl -> GetWidth(This) ) #define IDeckLinkVideoInputFrame_GetHeight(This) \ - ( (This)->lpVtbl -> GetHeight(This) ) + ( (This)->lpVtbl -> GetHeight(This) ) #define IDeckLinkVideoInputFrame_GetRowBytes(This) \ - ( (This)->lpVtbl -> GetRowBytes(This) ) + ( (This)->lpVtbl -> GetRowBytes(This) ) #define IDeckLinkVideoInputFrame_GetPixelFormat(This) \ - ( (This)->lpVtbl -> GetPixelFormat(This) ) + ( (This)->lpVtbl -> GetPixelFormat(This) ) #define IDeckLinkVideoInputFrame_GetFlags(This) \ - ( (This)->lpVtbl -> GetFlags(This) ) + ( (This)->lpVtbl -> GetFlags(This) ) #define IDeckLinkVideoInputFrame_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkVideoInputFrame_GetTimecode(This,format,timecode) \ - ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) + ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) #define IDeckLinkVideoInputFrame_GetAncillaryData(This,ancillary) \ - ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) + ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) #define IDeckLinkVideoInputFrame_GetStreamTime(This,frameTime,frameDuration,timeScale) \ - ( (This)->lpVtbl -> GetStreamTime(This,frameTime,frameDuration,timeScale) ) + ( (This)->lpVtbl -> GetStreamTime(This,frameTime,frameDuration,timeScale) ) #define IDeckLinkVideoInputFrame_GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) \ - ( (This)->lpVtbl -> GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) ) + ( (This)->lpVtbl -> GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) ) #endif /* COBJMACROS */ @@ -7361,69 +7822,77 @@ #define __IDeckLinkAncillaryPacket_INTERFACE_DEFINED__ /* interface IDeckLinkAncillaryPacket */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkAncillaryPacket; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("CC5BBF7E-029C-4D3B-9158-6000EF5E3670") IDeckLinkAncillaryPacket : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetBytes( + virtual HRESULT STDMETHODCALLTYPE GetBytes( /* in */ BMDAncillaryPacketFormat format, /* out */ const void **data, /* out */ unsigned int *size) = 0; - + virtual unsigned char STDMETHODCALLTYPE GetDID( void) = 0; - + virtual unsigned char STDMETHODCALLTYPE GetSDID( void) = 0; - + virtual unsigned int STDMETHODCALLTYPE GetLineNumber( void) = 0; - + virtual unsigned char STDMETHODCALLTYPE GetDataStreamIndex( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkAncillaryPacketVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkAncillaryPacket * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkAncillaryPacket * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkAncillaryPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkAncillaryPacket, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkAncillaryPacket * This, /* in */ BMDAncillaryPacketFormat format, /* out */ const void **data, /* out */ unsigned int *size); - - unsigned char ( STDMETHODCALLTYPE *GetDID )( + + DECLSPEC_XFGVIRT(IDeckLinkAncillaryPacket, GetDID) + unsigned char ( STDMETHODCALLTYPE *GetDID )( IDeckLinkAncillaryPacket * This); - - unsigned char ( STDMETHODCALLTYPE *GetSDID )( + + DECLSPEC_XFGVIRT(IDeckLinkAncillaryPacket, GetSDID) + unsigned char ( STDMETHODCALLTYPE *GetSDID )( IDeckLinkAncillaryPacket * This); - - unsigned int ( STDMETHODCALLTYPE *GetLineNumber )( + + DECLSPEC_XFGVIRT(IDeckLinkAncillaryPacket, GetLineNumber) + unsigned int ( STDMETHODCALLTYPE *GetLineNumber )( IDeckLinkAncillaryPacket * This); - - unsigned char ( STDMETHODCALLTYPE *GetDataStreamIndex )( + + DECLSPEC_XFGVIRT(IDeckLinkAncillaryPacket, GetDataStreamIndex) + unsigned char ( STDMETHODCALLTYPE *GetDataStreamIndex )( IDeckLinkAncillaryPacket * This); - + END_INTERFACE } IDeckLinkAncillaryPacketVtbl; @@ -7432,35 +7901,35 @@ CONST_VTBL struct IDeckLinkAncillaryPacketVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkAncillaryPacket_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkAncillaryPacket_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkAncillaryPacket_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkAncillaryPacket_GetBytes(This,format,data,size) \ - ( (This)->lpVtbl -> GetBytes(This,format,data,size) ) + ( (This)->lpVtbl -> GetBytes(This,format,data,size) ) #define IDeckLinkAncillaryPacket_GetDID(This) \ - ( (This)->lpVtbl -> GetDID(This) ) + ( (This)->lpVtbl -> GetDID(This) ) #define IDeckLinkAncillaryPacket_GetSDID(This) \ - ( (This)->lpVtbl -> GetSDID(This) ) + ( (This)->lpVtbl -> GetSDID(This) ) #define IDeckLinkAncillaryPacket_GetLineNumber(This) \ - ( (This)->lpVtbl -> GetLineNumber(This) ) + ( (This)->lpVtbl -> GetLineNumber(This) ) #define IDeckLinkAncillaryPacket_GetDataStreamIndex(This) \ - ( (This)->lpVtbl -> GetDataStreamIndex(This) ) + ( (This)->lpVtbl -> GetDataStreamIndex(This) ) #endif /* COBJMACROS */ @@ -7477,45 +7946,49 @@ #define __IDeckLinkAncillaryPacketIterator_INTERFACE_DEFINED__ /* interface IDeckLinkAncillaryPacketIterator */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkAncillaryPacketIterator; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("3FC8994B-88FB-4C17-968F-9AAB69D964A7") IDeckLinkAncillaryPacketIterator : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Next( + virtual HRESULT STDMETHODCALLTYPE Next( /* out */ IDeckLinkAncillaryPacket **packet) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkAncillaryPacketIteratorVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkAncillaryPacketIterator * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkAncillaryPacketIterator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkAncillaryPacketIterator * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( + + DECLSPEC_XFGVIRT(IDeckLinkAncillaryPacketIterator, Next) + HRESULT ( STDMETHODCALLTYPE *Next )( IDeckLinkAncillaryPacketIterator * This, /* out */ IDeckLinkAncillaryPacket **packet); - + END_INTERFACE } IDeckLinkAncillaryPacketIteratorVtbl; @@ -7524,23 +7997,23 @@ CONST_VTBL struct IDeckLinkAncillaryPacketIteratorVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkAncillaryPacketIterator_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkAncillaryPacketIterator_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkAncillaryPacketIterator_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkAncillaryPacketIterator_Next(This,packet) \ - ( (This)->lpVtbl -> Next(This,packet) ) + ( (This)->lpVtbl -> Next(This,packet) ) #endif /* COBJMACROS */ @@ -7557,75 +8030,83 @@ #define __IDeckLinkVideoFrameAncillaryPackets_INTERFACE_DEFINED__ /* interface IDeckLinkVideoFrameAncillaryPackets */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkVideoFrameAncillaryPackets; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("6C186C0F-459E-41D8-AEE2-4812D81AEE68") IDeckLinkVideoFrameAncillaryPackets : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetPacketIterator( + virtual HRESULT STDMETHODCALLTYPE GetPacketIterator( /* out */ IDeckLinkAncillaryPacketIterator **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFirstPacketByID( + + virtual HRESULT STDMETHODCALLTYPE GetFirstPacketByID( /* in */ unsigned char DID, /* in */ unsigned char SDID, /* out */ IDeckLinkAncillaryPacket **packet) = 0; - - virtual HRESULT STDMETHODCALLTYPE AttachPacket( + + virtual HRESULT STDMETHODCALLTYPE AttachPacket( /* in */ IDeckLinkAncillaryPacket *packet) = 0; - - virtual HRESULT STDMETHODCALLTYPE DetachPacket( + + virtual HRESULT STDMETHODCALLTYPE DetachPacket( /* in */ IDeckLinkAncillaryPacket *packet) = 0; - + virtual HRESULT STDMETHODCALLTYPE DetachAllPackets( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoFrameAncillaryPacketsVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoFrameAncillaryPackets * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoFrameAncillaryPackets * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoFrameAncillaryPackets * This); - - HRESULT ( STDMETHODCALLTYPE *GetPacketIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameAncillaryPackets, GetPacketIterator) + HRESULT ( STDMETHODCALLTYPE *GetPacketIterator )( IDeckLinkVideoFrameAncillaryPackets * This, /* out */ IDeckLinkAncillaryPacketIterator **iterator); - - HRESULT ( STDMETHODCALLTYPE *GetFirstPacketByID )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameAncillaryPackets, GetFirstPacketByID) + HRESULT ( STDMETHODCALLTYPE *GetFirstPacketByID )( IDeckLinkVideoFrameAncillaryPackets * This, /* in */ unsigned char DID, /* in */ unsigned char SDID, /* out */ IDeckLinkAncillaryPacket **packet); - - HRESULT ( STDMETHODCALLTYPE *AttachPacket )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameAncillaryPackets, AttachPacket) + HRESULT ( STDMETHODCALLTYPE *AttachPacket )( IDeckLinkVideoFrameAncillaryPackets * This, /* in */ IDeckLinkAncillaryPacket *packet); - - HRESULT ( STDMETHODCALLTYPE *DetachPacket )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameAncillaryPackets, DetachPacket) + HRESULT ( STDMETHODCALLTYPE *DetachPacket )( IDeckLinkVideoFrameAncillaryPackets * This, /* in */ IDeckLinkAncillaryPacket *packet); - - HRESULT ( STDMETHODCALLTYPE *DetachAllPackets )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameAncillaryPackets, DetachAllPackets) + HRESULT ( STDMETHODCALLTYPE *DetachAllPackets )( IDeckLinkVideoFrameAncillaryPackets * This); - + END_INTERFACE } IDeckLinkVideoFrameAncillaryPacketsVtbl; @@ -7634,35 +8115,35 @@ CONST_VTBL struct IDeckLinkVideoFrameAncillaryPacketsVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoFrameAncillaryPackets_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoFrameAncillaryPackets_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoFrameAncillaryPackets_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoFrameAncillaryPackets_GetPacketIterator(This,iterator) \ - ( (This)->lpVtbl -> GetPacketIterator(This,iterator) ) + ( (This)->lpVtbl -> GetPacketIterator(This,iterator) ) #define IDeckLinkVideoFrameAncillaryPackets_GetFirstPacketByID(This,DID,SDID,packet) \ - ( (This)->lpVtbl -> GetFirstPacketByID(This,DID,SDID,packet) ) + ( (This)->lpVtbl -> GetFirstPacketByID(This,DID,SDID,packet) ) #define IDeckLinkVideoFrameAncillaryPackets_AttachPacket(This,packet) \ - ( (This)->lpVtbl -> AttachPacket(This,packet) ) + ( (This)->lpVtbl -> AttachPacket(This,packet) ) #define IDeckLinkVideoFrameAncillaryPackets_DetachPacket(This,packet) \ - ( (This)->lpVtbl -> DetachPacket(This,packet) ) + ( (This)->lpVtbl -> DetachPacket(This,packet) ) #define IDeckLinkVideoFrameAncillaryPackets_DetachAllPackets(This) \ - ( (This)->lpVtbl -> DetachAllPackets(This) ) + ( (This)->lpVtbl -> DetachAllPackets(This) ) #endif /* COBJMACROS */ @@ -7679,57 +8160,63 @@ #define __IDeckLinkVideoFrameAncillary_INTERFACE_DEFINED__ /* interface IDeckLinkVideoFrameAncillary */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkVideoFrameAncillary; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("732E723C-D1A4-4E29-9E8E-4A88797A0004") IDeckLinkVideoFrameAncillary : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetBufferForVerticalBlankingLine( + virtual HRESULT STDMETHODCALLTYPE GetBufferForVerticalBlankingLine( /* in */ unsigned int lineNumber, /* out */ void **buffer) = 0; - + virtual BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat( void) = 0; - + virtual BMDDisplayMode STDMETHODCALLTYPE GetDisplayMode( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoFrameAncillaryVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoFrameAncillary * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoFrameAncillary * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoFrameAncillary * This); - - HRESULT ( STDMETHODCALLTYPE *GetBufferForVerticalBlankingLine )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameAncillary, GetBufferForVerticalBlankingLine) + HRESULT ( STDMETHODCALLTYPE *GetBufferForVerticalBlankingLine )( IDeckLinkVideoFrameAncillary * This, /* in */ unsigned int lineNumber, /* out */ void **buffer); - - BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameAncillary, GetPixelFormat) + BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( IDeckLinkVideoFrameAncillary * This); - - BMDDisplayMode ( STDMETHODCALLTYPE *GetDisplayMode )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameAncillary, GetDisplayMode) + BMDDisplayMode ( STDMETHODCALLTYPE *GetDisplayMode )( IDeckLinkVideoFrameAncillary * This); - + END_INTERFACE } IDeckLinkVideoFrameAncillaryVtbl; @@ -7738,29 +8225,29 @@ CONST_VTBL struct IDeckLinkVideoFrameAncillaryVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoFrameAncillary_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoFrameAncillary_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoFrameAncillary_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoFrameAncillary_GetBufferForVerticalBlankingLine(This,lineNumber,buffer) \ - ( (This)->lpVtbl -> GetBufferForVerticalBlankingLine(This,lineNumber,buffer) ) + ( (This)->lpVtbl -> GetBufferForVerticalBlankingLine(This,lineNumber,buffer) ) #define IDeckLinkVideoFrameAncillary_GetPixelFormat(This) \ - ( (This)->lpVtbl -> GetPixelFormat(This) ) + ( (This)->lpVtbl -> GetPixelFormat(This) ) #define IDeckLinkVideoFrameAncillary_GetDisplayMode(This) \ - ( (This)->lpVtbl -> GetDisplayMode(This) ) + ( (This)->lpVtbl -> GetDisplayMode(This) ) #endif /* COBJMACROS */ @@ -7777,64 +8264,71 @@ #define __IDeckLinkEncoderPacket_INTERFACE_DEFINED__ /* interface IDeckLinkEncoderPacket */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkEncoderPacket; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("B693F36C-316E-4AF1-B6C2-F389A4BCA620") IDeckLinkEncoderPacket : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetBytes( + virtual HRESULT STDMETHODCALLTYPE GetBytes( /* out */ void **buffer) = 0; - + virtual long STDMETHODCALLTYPE GetSize( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetStreamTime( + + virtual HRESULT STDMETHODCALLTYPE GetStreamTime( /* out */ BMDTimeValue *frameTime, /* in */ BMDTimeScale timeScale) = 0; - + virtual BMDPacketType STDMETHODCALLTYPE GetPacketType( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkEncoderPacketVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkEncoderPacket * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkEncoderPacket * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkEncoderPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkEncoderPacket * This, /* out */ void **buffer); - - long ( STDMETHODCALLTYPE *GetSize )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetSize) + long ( STDMETHODCALLTYPE *GetSize )( IDeckLinkEncoderPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetStreamTime) + HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( IDeckLinkEncoderPacket * This, /* out */ BMDTimeValue *frameTime, /* in */ BMDTimeScale timeScale); - - BMDPacketType ( STDMETHODCALLTYPE *GetPacketType )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetPacketType) + BMDPacketType ( STDMETHODCALLTYPE *GetPacketType )( IDeckLinkEncoderPacket * This); - + END_INTERFACE } IDeckLinkEncoderPacketVtbl; @@ -7843,32 +8337,32 @@ CONST_VTBL struct IDeckLinkEncoderPacketVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkEncoderPacket_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkEncoderPacket_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkEncoderPacket_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkEncoderPacket_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkEncoderPacket_GetSize(This) \ - ( (This)->lpVtbl -> GetSize(This) ) + ( (This)->lpVtbl -> GetSize(This) ) #define IDeckLinkEncoderPacket_GetStreamTime(This,frameTime,timeScale) \ - ( (This)->lpVtbl -> GetStreamTime(This,frameTime,timeScale) ) + ( (This)->lpVtbl -> GetStreamTime(This,frameTime,timeScale) ) #define IDeckLinkEncoderPacket_GetPacketType(This) \ - ( (This)->lpVtbl -> GetPacketType(This) ) + ( (This)->lpVtbl -> GetPacketType(This) ) #endif /* COBJMACROS */ @@ -7885,78 +8379,88 @@ #define __IDeckLinkEncoderVideoPacket_INTERFACE_DEFINED__ /* interface IDeckLinkEncoderVideoPacket */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkEncoderVideoPacket; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("4E7FD944-E8C7-4EAC-B8C0-7B77F80F5AE0") IDeckLinkEncoderVideoPacket : public IDeckLinkEncoderPacket { public: virtual BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceTimestamp( + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceTimestamp( /* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecode( + + virtual HRESULT STDMETHODCALLTYPE GetTimecode( /* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkEncoderVideoPacketVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkEncoderVideoPacket * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkEncoderVideoPacket * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkEncoderVideoPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkEncoderVideoPacket * This, /* out */ void **buffer); - - long ( STDMETHODCALLTYPE *GetSize )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetSize) + long ( STDMETHODCALLTYPE *GetSize )( IDeckLinkEncoderVideoPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetStreamTime) + HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( IDeckLinkEncoderVideoPacket * This, /* out */ BMDTimeValue *frameTime, /* in */ BMDTimeScale timeScale); - - BMDPacketType ( STDMETHODCALLTYPE *GetPacketType )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetPacketType) + BMDPacketType ( STDMETHODCALLTYPE *GetPacketType )( IDeckLinkEncoderVideoPacket * This); - - BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderVideoPacket, GetPixelFormat) + BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( IDeckLinkEncoderVideoPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceTimestamp )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderVideoPacket, GetHardwareReferenceTimestamp) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceTimestamp )( IDeckLinkEncoderVideoPacket * This, /* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderVideoPacket, GetTimecode) + HRESULT ( STDMETHODCALLTYPE *GetTimecode )( IDeckLinkEncoderVideoPacket * This, /* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode); - + END_INTERFACE } IDeckLinkEncoderVideoPacketVtbl; @@ -7965,42 +8469,42 @@ CONST_VTBL struct IDeckLinkEncoderVideoPacketVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkEncoderVideoPacket_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkEncoderVideoPacket_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkEncoderVideoPacket_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkEncoderVideoPacket_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkEncoderVideoPacket_GetSize(This) \ - ( (This)->lpVtbl -> GetSize(This) ) + ( (This)->lpVtbl -> GetSize(This) ) #define IDeckLinkEncoderVideoPacket_GetStreamTime(This,frameTime,timeScale) \ - ( (This)->lpVtbl -> GetStreamTime(This,frameTime,timeScale) ) + ( (This)->lpVtbl -> GetStreamTime(This,frameTime,timeScale) ) #define IDeckLinkEncoderVideoPacket_GetPacketType(This) \ - ( (This)->lpVtbl -> GetPacketType(This) ) + ( (This)->lpVtbl -> GetPacketType(This) ) #define IDeckLinkEncoderVideoPacket_GetPixelFormat(This) \ - ( (This)->lpVtbl -> GetPixelFormat(This) ) + ( (This)->lpVtbl -> GetPixelFormat(This) ) #define IDeckLinkEncoderVideoPacket_GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) \ - ( (This)->lpVtbl -> GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) ) + ( (This)->lpVtbl -> GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) ) #define IDeckLinkEncoderVideoPacket_GetTimecode(This,format,timecode) \ - ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) + ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) #endif /* COBJMACROS */ @@ -8017,58 +8521,66 @@ #define __IDeckLinkEncoderAudioPacket_INTERFACE_DEFINED__ /* interface IDeckLinkEncoderAudioPacket */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkEncoderAudioPacket; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("49E8EDC8-693B-4E14-8EF6-12C658F5A07A") IDeckLinkEncoderAudioPacket : public IDeckLinkEncoderPacket { public: virtual BMDAudioFormat STDMETHODCALLTYPE GetAudioFormat( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkEncoderAudioPacketVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkEncoderAudioPacket * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkEncoderAudioPacket * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkEncoderAudioPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkEncoderAudioPacket * This, /* out */ void **buffer); - - long ( STDMETHODCALLTYPE *GetSize )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetSize) + long ( STDMETHODCALLTYPE *GetSize )( IDeckLinkEncoderAudioPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetStreamTime) + HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( IDeckLinkEncoderAudioPacket * This, /* out */ BMDTimeValue *frameTime, /* in */ BMDTimeScale timeScale); - - BMDPacketType ( STDMETHODCALLTYPE *GetPacketType )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetPacketType) + BMDPacketType ( STDMETHODCALLTYPE *GetPacketType )( IDeckLinkEncoderAudioPacket * This); - - BMDAudioFormat ( STDMETHODCALLTYPE *GetAudioFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderAudioPacket, GetAudioFormat) + BMDAudioFormat ( STDMETHODCALLTYPE *GetAudioFormat )( IDeckLinkEncoderAudioPacket * This); - + END_INTERFACE } IDeckLinkEncoderAudioPacketVtbl; @@ -8077,36 +8589,36 @@ CONST_VTBL struct IDeckLinkEncoderAudioPacketVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkEncoderAudioPacket_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkEncoderAudioPacket_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkEncoderAudioPacket_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkEncoderAudioPacket_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkEncoderAudioPacket_GetSize(This) \ - ( (This)->lpVtbl -> GetSize(This) ) + ( (This)->lpVtbl -> GetSize(This) ) #define IDeckLinkEncoderAudioPacket_GetStreamTime(This,frameTime,timeScale) \ - ( (This)->lpVtbl -> GetStreamTime(This,frameTime,timeScale) ) + ( (This)->lpVtbl -> GetStreamTime(This,frameTime,timeScale) ) #define IDeckLinkEncoderAudioPacket_GetPacketType(This) \ - ( (This)->lpVtbl -> GetPacketType(This) ) + ( (This)->lpVtbl -> GetPacketType(This) ) #define IDeckLinkEncoderAudioPacket_GetAudioFormat(This) \ - ( (This)->lpVtbl -> GetAudioFormat(This) ) + ( (This)->lpVtbl -> GetAudioFormat(This) ) #endif /* COBJMACROS */ @@ -8123,86 +8635,99 @@ #define __IDeckLinkH265NALPacket_INTERFACE_DEFINED__ /* interface IDeckLinkH265NALPacket */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkH265NALPacket; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("639C8E0B-68D5-4BDE-A6D4-95F3AEAFF2E7") IDeckLinkH265NALPacket : public IDeckLinkEncoderVideoPacket { public: - virtual HRESULT STDMETHODCALLTYPE GetUnitType( + virtual HRESULT STDMETHODCALLTYPE GetUnitType( /* out */ unsigned char *unitType) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBytesNoPrefix( + + virtual HRESULT STDMETHODCALLTYPE GetBytesNoPrefix( /* out */ void **buffer) = 0; - + virtual long STDMETHODCALLTYPE GetSizeNoPrefix( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkH265NALPacketVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkH265NALPacket * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkH265NALPacket * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkH265NALPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkH265NALPacket * This, /* out */ void **buffer); - - long ( STDMETHODCALLTYPE *GetSize )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetSize) + long ( STDMETHODCALLTYPE *GetSize )( IDeckLinkH265NALPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetStreamTime) + HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( IDeckLinkH265NALPacket * This, /* out */ BMDTimeValue *frameTime, /* in */ BMDTimeScale timeScale); - - BMDPacketType ( STDMETHODCALLTYPE *GetPacketType )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderPacket, GetPacketType) + BMDPacketType ( STDMETHODCALLTYPE *GetPacketType )( IDeckLinkH265NALPacket * This); - - BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderVideoPacket, GetPixelFormat) + BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( IDeckLinkH265NALPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceTimestamp )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderVideoPacket, GetHardwareReferenceTimestamp) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceTimestamp )( IDeckLinkH265NALPacket * This, /* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderVideoPacket, GetTimecode) + HRESULT ( STDMETHODCALLTYPE *GetTimecode )( IDeckLinkH265NALPacket * This, /* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode); - - HRESULT ( STDMETHODCALLTYPE *GetUnitType )( + + DECLSPEC_XFGVIRT(IDeckLinkH265NALPacket, GetUnitType) + HRESULT ( STDMETHODCALLTYPE *GetUnitType )( IDeckLinkH265NALPacket * This, /* out */ unsigned char *unitType); - - HRESULT ( STDMETHODCALLTYPE *GetBytesNoPrefix )( + + DECLSPEC_XFGVIRT(IDeckLinkH265NALPacket, GetBytesNoPrefix) + HRESULT ( STDMETHODCALLTYPE *GetBytesNoPrefix )( IDeckLinkH265NALPacket * This, /* out */ void **buffer); - - long ( STDMETHODCALLTYPE *GetSizeNoPrefix )( + + DECLSPEC_XFGVIRT(IDeckLinkH265NALPacket, GetSizeNoPrefix) + long ( STDMETHODCALLTYPE *GetSizeNoPrefix )( IDeckLinkH265NALPacket * This); - + END_INTERFACE } IDeckLinkH265NALPacketVtbl; @@ -8211,52 +8736,52 @@ CONST_VTBL struct IDeckLinkH265NALPacketVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkH265NALPacket_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkH265NALPacket_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkH265NALPacket_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkH265NALPacket_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkH265NALPacket_GetSize(This) \ - ( (This)->lpVtbl -> GetSize(This) ) + ( (This)->lpVtbl -> GetSize(This) ) #define IDeckLinkH265NALPacket_GetStreamTime(This,frameTime,timeScale) \ - ( (This)->lpVtbl -> GetStreamTime(This,frameTime,timeScale) ) + ( (This)->lpVtbl -> GetStreamTime(This,frameTime,timeScale) ) #define IDeckLinkH265NALPacket_GetPacketType(This) \ - ( (This)->lpVtbl -> GetPacketType(This) ) + ( (This)->lpVtbl -> GetPacketType(This) ) #define IDeckLinkH265NALPacket_GetPixelFormat(This) \ - ( (This)->lpVtbl -> GetPixelFormat(This) ) + ( (This)->lpVtbl -> GetPixelFormat(This) ) #define IDeckLinkH265NALPacket_GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) \ - ( (This)->lpVtbl -> GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) ) + ( (This)->lpVtbl -> GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) ) #define IDeckLinkH265NALPacket_GetTimecode(This,format,timecode) \ - ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) + ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) #define IDeckLinkH265NALPacket_GetUnitType(This,unitType) \ - ( (This)->lpVtbl -> GetUnitType(This,unitType) ) + ( (This)->lpVtbl -> GetUnitType(This,unitType) ) #define IDeckLinkH265NALPacket_GetBytesNoPrefix(This,buffer) \ - ( (This)->lpVtbl -> GetBytesNoPrefix(This,buffer) ) + ( (This)->lpVtbl -> GetBytesNoPrefix(This,buffer) ) #define IDeckLinkH265NALPacket_GetSizeNoPrefix(This) \ - ( (This)->lpVtbl -> GetSizeNoPrefix(This) ) + ( (This)->lpVtbl -> GetSizeNoPrefix(This) ) #endif /* COBJMACROS */ @@ -8273,59 +8798,65 @@ #define __IDeckLinkAudioInputPacket_INTERFACE_DEFINED__ /* interface IDeckLinkAudioInputPacket */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkAudioInputPacket; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("E43D5870-2894-11DE-8C30-0800200C9A66") IDeckLinkAudioInputPacket : public IUnknown { public: virtual long STDMETHODCALLTYPE GetSampleFrameCount( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBytes( + + virtual HRESULT STDMETHODCALLTYPE GetBytes( /* out */ void **buffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPacketTime( + + virtual HRESULT STDMETHODCALLTYPE GetPacketTime( /* out */ BMDTimeValue *packetTime, /* in */ BMDTimeScale timeScale) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkAudioInputPacketVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkAudioInputPacket * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkAudioInputPacket * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkAudioInputPacket * This); - - long ( STDMETHODCALLTYPE *GetSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkAudioInputPacket, GetSampleFrameCount) + long ( STDMETHODCALLTYPE *GetSampleFrameCount )( IDeckLinkAudioInputPacket * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkAudioInputPacket, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkAudioInputPacket * This, /* out */ void **buffer); - - HRESULT ( STDMETHODCALLTYPE *GetPacketTime )( + + DECLSPEC_XFGVIRT(IDeckLinkAudioInputPacket, GetPacketTime) + HRESULT ( STDMETHODCALLTYPE *GetPacketTime )( IDeckLinkAudioInputPacket * This, /* out */ BMDTimeValue *packetTime, /* in */ BMDTimeScale timeScale); - + END_INTERFACE } IDeckLinkAudioInputPacketVtbl; @@ -8334,29 +8865,29 @@ CONST_VTBL struct IDeckLinkAudioInputPacketVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkAudioInputPacket_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkAudioInputPacket_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkAudioInputPacket_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkAudioInputPacket_GetSampleFrameCount(This) \ - ( (This)->lpVtbl -> GetSampleFrameCount(This) ) + ( (This)->lpVtbl -> GetSampleFrameCount(This) ) #define IDeckLinkAudioInputPacket_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkAudioInputPacket_GetPacketTime(This,packetTime,timeScale) \ - ( (This)->lpVtbl -> GetPacketTime(This,packetTime,timeScale) ) + ( (This)->lpVtbl -> GetPacketTime(This,packetTime,timeScale) ) #endif /* COBJMACROS */ @@ -8373,45 +8904,49 @@ #define __IDeckLinkScreenPreviewCallback_INTERFACE_DEFINED__ /* interface IDeckLinkScreenPreviewCallback */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkScreenPreviewCallback; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438") IDeckLinkScreenPreviewCallback : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DrawFrame( + virtual HRESULT STDMETHODCALLTYPE DrawFrame( /* in */ IDeckLinkVideoFrame *theFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkScreenPreviewCallbackVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkScreenPreviewCallback * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkScreenPreviewCallback * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkScreenPreviewCallback * This); - - HRESULT ( STDMETHODCALLTYPE *DrawFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkScreenPreviewCallback, DrawFrame) + HRESULT ( STDMETHODCALLTYPE *DrawFrame )( IDeckLinkScreenPreviewCallback * This, /* in */ IDeckLinkVideoFrame *theFrame); - + END_INTERFACE } IDeckLinkScreenPreviewCallbackVtbl; @@ -8420,23 +8955,23 @@ CONST_VTBL struct IDeckLinkScreenPreviewCallbackVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkScreenPreviewCallback_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkScreenPreviewCallback_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkScreenPreviewCallback_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkScreenPreviewCallback_DrawFrame(This,theFrame) \ - ( (This)->lpVtbl -> DrawFrame(This,theFrame) ) + ( (This)->lpVtbl -> DrawFrame(This,theFrame) ) #endif /* COBJMACROS */ @@ -8453,62 +8988,69 @@ #define __IDeckLinkGLScreenPreviewHelper_INTERFACE_DEFINED__ /* interface IDeckLinkGLScreenPreviewHelper */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkGLScreenPreviewHelper; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("504E2209-CAC7-4C1A-9FB4-C5BB6274D22F") IDeckLinkGLScreenPreviewHelper : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE InitializeGL( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE PaintGL( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFrame( + + virtual HRESULT STDMETHODCALLTYPE SetFrame( /* in */ IDeckLinkVideoFrame *theFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE Set3DPreviewFormat( + + virtual HRESULT STDMETHODCALLTYPE Set3DPreviewFormat( /* in */ BMD3DPreviewFormat previewFormat) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkGLScreenPreviewHelperVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkGLScreenPreviewHelper * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkGLScreenPreviewHelper * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkGLScreenPreviewHelper * This); - - HRESULT ( STDMETHODCALLTYPE *InitializeGL )( + + DECLSPEC_XFGVIRT(IDeckLinkGLScreenPreviewHelper, InitializeGL) + HRESULT ( STDMETHODCALLTYPE *InitializeGL )( IDeckLinkGLScreenPreviewHelper * This); - - HRESULT ( STDMETHODCALLTYPE *PaintGL )( + + DECLSPEC_XFGVIRT(IDeckLinkGLScreenPreviewHelper, PaintGL) + HRESULT ( STDMETHODCALLTYPE *PaintGL )( IDeckLinkGLScreenPreviewHelper * This); - - HRESULT ( STDMETHODCALLTYPE *SetFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkGLScreenPreviewHelper, SetFrame) + HRESULT ( STDMETHODCALLTYPE *SetFrame )( IDeckLinkGLScreenPreviewHelper * This, /* in */ IDeckLinkVideoFrame *theFrame); - - HRESULT ( STDMETHODCALLTYPE *Set3DPreviewFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkGLScreenPreviewHelper, Set3DPreviewFormat) + HRESULT ( STDMETHODCALLTYPE *Set3DPreviewFormat )( IDeckLinkGLScreenPreviewHelper * This, /* in */ BMD3DPreviewFormat previewFormat); - + END_INTERFACE } IDeckLinkGLScreenPreviewHelperVtbl; @@ -8517,32 +9059,32 @@ CONST_VTBL struct IDeckLinkGLScreenPreviewHelperVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkGLScreenPreviewHelper_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkGLScreenPreviewHelper_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkGLScreenPreviewHelper_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkGLScreenPreviewHelper_InitializeGL(This) \ - ( (This)->lpVtbl -> InitializeGL(This) ) + ( (This)->lpVtbl -> InitializeGL(This) ) #define IDeckLinkGLScreenPreviewHelper_PaintGL(This) \ - ( (This)->lpVtbl -> PaintGL(This) ) + ( (This)->lpVtbl -> PaintGL(This) ) #define IDeckLinkGLScreenPreviewHelper_SetFrame(This,theFrame) \ - ( (This)->lpVtbl -> SetFrame(This,theFrame) ) + ( (This)->lpVtbl -> SetFrame(This,theFrame) ) #define IDeckLinkGLScreenPreviewHelper_Set3DPreviewFormat(This,previewFormat) \ - ( (This)->lpVtbl -> Set3DPreviewFormat(This,previewFormat) ) + ( (This)->lpVtbl -> Set3DPreviewFormat(This,previewFormat) ) #endif /* COBJMACROS */ @@ -8559,66 +9101,73 @@ #define __IDeckLinkDX9ScreenPreviewHelper_INTERFACE_DEFINED__ /* interface IDeckLinkDX9ScreenPreviewHelper */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkDX9ScreenPreviewHelper; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("2094B522-D1A1-40C0-9AC7-1C012218EF02") IDeckLinkDX9ScreenPreviewHelper : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Initialize( + virtual HRESULT STDMETHODCALLTYPE Initialize( /* in */ void *device) = 0; - - virtual HRESULT STDMETHODCALLTYPE Render( + + virtual HRESULT STDMETHODCALLTYPE Render( /* in */ RECT *rc) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFrame( + + virtual HRESULT STDMETHODCALLTYPE SetFrame( /* in */ IDeckLinkVideoFrame *theFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE Set3DPreviewFormat( + + virtual HRESULT STDMETHODCALLTYPE Set3DPreviewFormat( /* in */ BMD3DPreviewFormat previewFormat) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDX9ScreenPreviewHelperVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDX9ScreenPreviewHelper * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDX9ScreenPreviewHelper * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDX9ScreenPreviewHelper * This); - - HRESULT ( STDMETHODCALLTYPE *Initialize )( + + DECLSPEC_XFGVIRT(IDeckLinkDX9ScreenPreviewHelper, Initialize) + HRESULT ( STDMETHODCALLTYPE *Initialize )( IDeckLinkDX9ScreenPreviewHelper * This, /* in */ void *device); - - HRESULT ( STDMETHODCALLTYPE *Render )( + + DECLSPEC_XFGVIRT(IDeckLinkDX9ScreenPreviewHelper, Render) + HRESULT ( STDMETHODCALLTYPE *Render )( IDeckLinkDX9ScreenPreviewHelper * This, /* in */ RECT *rc); - - HRESULT ( STDMETHODCALLTYPE *SetFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkDX9ScreenPreviewHelper, SetFrame) + HRESULT ( STDMETHODCALLTYPE *SetFrame )( IDeckLinkDX9ScreenPreviewHelper * This, /* in */ IDeckLinkVideoFrame *theFrame); - - HRESULT ( STDMETHODCALLTYPE *Set3DPreviewFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkDX9ScreenPreviewHelper, Set3DPreviewFormat) + HRESULT ( STDMETHODCALLTYPE *Set3DPreviewFormat )( IDeckLinkDX9ScreenPreviewHelper * This, /* in */ BMD3DPreviewFormat previewFormat); - + END_INTERFACE } IDeckLinkDX9ScreenPreviewHelperVtbl; @@ -8627,32 +9176,32 @@ CONST_VTBL struct IDeckLinkDX9ScreenPreviewHelperVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDX9ScreenPreviewHelper_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDX9ScreenPreviewHelper_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDX9ScreenPreviewHelper_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDX9ScreenPreviewHelper_Initialize(This,device) \ - ( (This)->lpVtbl -> Initialize(This,device) ) + ( (This)->lpVtbl -> Initialize(This,device) ) #define IDeckLinkDX9ScreenPreviewHelper_Render(This,rc) \ - ( (This)->lpVtbl -> Render(This,rc) ) + ( (This)->lpVtbl -> Render(This,rc) ) #define IDeckLinkDX9ScreenPreviewHelper_SetFrame(This,theFrame) \ - ( (This)->lpVtbl -> SetFrame(This,theFrame) ) + ( (This)->lpVtbl -> SetFrame(This,theFrame) ) #define IDeckLinkDX9ScreenPreviewHelper_Set3DPreviewFormat(This,previewFormat) \ - ( (This)->lpVtbl -> Set3DPreviewFormat(This,previewFormat) ) + ( (This)->lpVtbl -> Set3DPreviewFormat(This,previewFormat) ) #endif /* COBJMACROS */ @@ -8669,49 +9218,53 @@ #define __IDeckLinkNotificationCallback_INTERFACE_DEFINED__ /* interface IDeckLinkNotificationCallback */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkNotificationCallback; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("b002a1ec-070d-4288-8289-bd5d36e5ff0d") IDeckLinkNotificationCallback : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Notify( + virtual HRESULT STDMETHODCALLTYPE Notify( /* in */ BMDNotifications topic, /* in */ ULONGLONG param1, /* in */ ULONGLONG param2) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkNotificationCallbackVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkNotificationCallback * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkNotificationCallback * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkNotificationCallback * This); - - HRESULT ( STDMETHODCALLTYPE *Notify )( + + DECLSPEC_XFGVIRT(IDeckLinkNotificationCallback, Notify) + HRESULT ( STDMETHODCALLTYPE *Notify )( IDeckLinkNotificationCallback * This, /* in */ BMDNotifications topic, /* in */ ULONGLONG param1, /* in */ ULONGLONG param2); - + END_INTERFACE } IDeckLinkNotificationCallbackVtbl; @@ -8720,23 +9273,23 @@ CONST_VTBL struct IDeckLinkNotificationCallbackVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkNotificationCallback_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkNotificationCallback_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkNotificationCallback_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkNotificationCallback_Notify(This,topic,param1,param2) \ - ( (This)->lpVtbl -> Notify(This,topic,param1,param2) ) + ( (This)->lpVtbl -> Notify(This,topic,param1,param2) ) #endif /* COBJMACROS */ @@ -8753,56 +9306,61 @@ #define __IDeckLinkNotification_INTERFACE_DEFINED__ /* interface IDeckLinkNotification */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkNotification; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("b85df4c8-bdf5-47c1-8064-28162ebdd4eb") IDeckLinkNotification : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Subscribe( + virtual HRESULT STDMETHODCALLTYPE Subscribe( /* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE Unsubscribe( + + virtual HRESULT STDMETHODCALLTYPE Unsubscribe( /* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkNotificationVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkNotification * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkNotification * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkNotification * This); - - HRESULT ( STDMETHODCALLTYPE *Subscribe )( + + DECLSPEC_XFGVIRT(IDeckLinkNotification, Subscribe) + HRESULT ( STDMETHODCALLTYPE *Subscribe )( IDeckLinkNotification * This, /* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *Unsubscribe )( + + DECLSPEC_XFGVIRT(IDeckLinkNotification, Unsubscribe) + HRESULT ( STDMETHODCALLTYPE *Unsubscribe )( IDeckLinkNotification * This, /* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback); - + END_INTERFACE } IDeckLinkNotificationVtbl; @@ -8811,26 +9369,26 @@ CONST_VTBL struct IDeckLinkNotificationVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkNotification_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkNotification_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkNotification_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkNotification_Subscribe(This,topic,theCallback) \ - ( (This)->lpVtbl -> Subscribe(This,topic,theCallback) ) + ( (This)->lpVtbl -> Subscribe(This,topic,theCallback) ) #define IDeckLinkNotification_Unsubscribe(This,topic,theCallback) \ - ( (This)->lpVtbl -> Unsubscribe(This,topic,theCallback) ) + ( (This)->lpVtbl -> Unsubscribe(This,topic,theCallback) ) #endif /* COBJMACROS */ @@ -8847,74 +9405,81 @@ #define __IDeckLinkProfileAttributes_INTERFACE_DEFINED__ /* interface IDeckLinkProfileAttributes */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkProfileAttributes; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("17D4BF8E-4911-473A-80A0-731CF6FF345B") IDeckLinkProfileAttributes : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetFlag( + virtual HRESULT STDMETHODCALLTYPE GetFlag( /* in */ BMDDeckLinkAttributeID cfgID, /* out */ BOOL *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInt( + + virtual HRESULT STDMETHODCALLTYPE GetInt( /* in */ BMDDeckLinkAttributeID cfgID, /* out */ LONGLONG *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFloat( + + virtual HRESULT STDMETHODCALLTYPE GetFloat( /* in */ BMDDeckLinkAttributeID cfgID, /* out */ double *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* in */ BMDDeckLinkAttributeID cfgID, /* out */ BSTR *value) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkProfileAttributesVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkProfileAttributes * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkProfileAttributes * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkProfileAttributes * This); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkProfileAttributes, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( IDeckLinkProfileAttributes * This, /* in */ BMDDeckLinkAttributeID cfgID, /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkProfileAttributes, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IDeckLinkProfileAttributes * This, /* in */ BMDDeckLinkAttributeID cfgID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkProfileAttributes, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( IDeckLinkProfileAttributes * This, /* in */ BMDDeckLinkAttributeID cfgID, /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IDeckLinkProfileAttributes, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IDeckLinkProfileAttributes * This, /* in */ BMDDeckLinkAttributeID cfgID, /* out */ BSTR *value); - + END_INTERFACE } IDeckLinkProfileAttributesVtbl; @@ -8923,32 +9488,32 @@ CONST_VTBL struct IDeckLinkProfileAttributesVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkProfileAttributes_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkProfileAttributes_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkProfileAttributes_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkProfileAttributes_GetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) #define IDeckLinkProfileAttributes_GetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) #define IDeckLinkProfileAttributes_GetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) #define IDeckLinkProfileAttributes_GetString(This,cfgID,value) \ - ( (This)->lpVtbl -> GetString(This,cfgID,value) ) + ( (This)->lpVtbl -> GetString(This,cfgID,value) ) #endif /* COBJMACROS */ @@ -8965,45 +9530,49 @@ #define __IDeckLinkProfileIterator_INTERFACE_DEFINED__ /* interface IDeckLinkProfileIterator */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkProfileIterator; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("29E5A8C0-8BE4-46EB-93AC-31DAAB5B7BF2") IDeckLinkProfileIterator : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Next( + virtual HRESULT STDMETHODCALLTYPE Next( /* out */ IDeckLinkProfile **profile) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkProfileIteratorVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkProfileIterator * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkProfileIterator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkProfileIterator * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( + + DECLSPEC_XFGVIRT(IDeckLinkProfileIterator, Next) + HRESULT ( STDMETHODCALLTYPE *Next )( IDeckLinkProfileIterator * This, /* out */ IDeckLinkProfile **profile); - + END_INTERFACE } IDeckLinkProfileIteratorVtbl; @@ -9012,23 +9581,23 @@ CONST_VTBL struct IDeckLinkProfileIteratorVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkProfileIterator_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkProfileIterator_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkProfileIterator_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkProfileIterator_Next(This,profile) \ - ( (This)->lpVtbl -> Next(This,profile) ) + ( (This)->lpVtbl -> Next(This,profile) ) #endif /* COBJMACROS */ @@ -9045,64 +9614,71 @@ #define __IDeckLinkProfile_INTERFACE_DEFINED__ /* interface IDeckLinkProfile */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkProfile; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("16093466-674A-432B-9DA0-1AC2C5A8241C") IDeckLinkProfile : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetDevice( + virtual HRESULT STDMETHODCALLTYPE GetDevice( /* out */ IDeckLink **device) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsActive( + + virtual HRESULT STDMETHODCALLTYPE IsActive( /* out */ BOOL *isActive) = 0; - + virtual HRESULT STDMETHODCALLTYPE SetActive( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPeers( + + virtual HRESULT STDMETHODCALLTYPE GetPeers( /* out */ IDeckLinkProfileIterator **profileIterator) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkProfileVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkProfile * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkProfile * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkProfile * This); - - HRESULT ( STDMETHODCALLTYPE *GetDevice )( + + DECLSPEC_XFGVIRT(IDeckLinkProfile, GetDevice) + HRESULT ( STDMETHODCALLTYPE *GetDevice )( IDeckLinkProfile * This, /* out */ IDeckLink **device); - - HRESULT ( STDMETHODCALLTYPE *IsActive )( + + DECLSPEC_XFGVIRT(IDeckLinkProfile, IsActive) + HRESULT ( STDMETHODCALLTYPE *IsActive )( IDeckLinkProfile * This, /* out */ BOOL *isActive); - - HRESULT ( STDMETHODCALLTYPE *SetActive )( + + DECLSPEC_XFGVIRT(IDeckLinkProfile, SetActive) + HRESULT ( STDMETHODCALLTYPE *SetActive )( IDeckLinkProfile * This); - - HRESULT ( STDMETHODCALLTYPE *GetPeers )( + + DECLSPEC_XFGVIRT(IDeckLinkProfile, GetPeers) + HRESULT ( STDMETHODCALLTYPE *GetPeers )( IDeckLinkProfile * This, /* out */ IDeckLinkProfileIterator **profileIterator); - + END_INTERFACE } IDeckLinkProfileVtbl; @@ -9111,32 +9687,32 @@ CONST_VTBL struct IDeckLinkProfileVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkProfile_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkProfile_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkProfile_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkProfile_GetDevice(This,device) \ - ( (This)->lpVtbl -> GetDevice(This,device) ) + ( (This)->lpVtbl -> GetDevice(This,device) ) #define IDeckLinkProfile_IsActive(This,isActive) \ - ( (This)->lpVtbl -> IsActive(This,isActive) ) + ( (This)->lpVtbl -> IsActive(This,isActive) ) #define IDeckLinkProfile_SetActive(This) \ - ( (This)->lpVtbl -> SetActive(This) ) + ( (This)->lpVtbl -> SetActive(This) ) #define IDeckLinkProfile_GetPeers(This,profileIterator) \ - ( (This)->lpVtbl -> GetPeers(This,profileIterator) ) + ( (This)->lpVtbl -> GetPeers(This,profileIterator) ) #endif /* COBJMACROS */ @@ -9153,54 +9729,59 @@ #define __IDeckLinkProfileCallback_INTERFACE_DEFINED__ /* interface IDeckLinkProfileCallback */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkProfileCallback; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("A4F9341E-97AA-4E04-8935-15F809898CEA") IDeckLinkProfileCallback : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE ProfileChanging( + virtual HRESULT STDMETHODCALLTYPE ProfileChanging( /* in */ IDeckLinkProfile *profileToBeActivated, /* in */ BOOL streamsWillBeForcedToStop) = 0; - - virtual HRESULT STDMETHODCALLTYPE ProfileActivated( + + virtual HRESULT STDMETHODCALLTYPE ProfileActivated( /* in */ IDeckLinkProfile *activatedProfile) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkProfileCallbackVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkProfileCallback * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkProfileCallback * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkProfileCallback * This); - - HRESULT ( STDMETHODCALLTYPE *ProfileChanging )( + + DECLSPEC_XFGVIRT(IDeckLinkProfileCallback, ProfileChanging) + HRESULT ( STDMETHODCALLTYPE *ProfileChanging )( IDeckLinkProfileCallback * This, /* in */ IDeckLinkProfile *profileToBeActivated, /* in */ BOOL streamsWillBeForcedToStop); - - HRESULT ( STDMETHODCALLTYPE *ProfileActivated )( + + DECLSPEC_XFGVIRT(IDeckLinkProfileCallback, ProfileActivated) + HRESULT ( STDMETHODCALLTYPE *ProfileActivated )( IDeckLinkProfileCallback * This, /* in */ IDeckLinkProfile *activatedProfile); - + END_INTERFACE } IDeckLinkProfileCallbackVtbl; @@ -9209,26 +9790,26 @@ CONST_VTBL struct IDeckLinkProfileCallbackVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkProfileCallback_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkProfileCallback_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkProfileCallback_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkProfileCallback_ProfileChanging(This,profileToBeActivated,streamsWillBeForcedToStop) \ - ( (This)->lpVtbl -> ProfileChanging(This,profileToBeActivated,streamsWillBeForcedToStop) ) + ( (This)->lpVtbl -> ProfileChanging(This,profileToBeActivated,streamsWillBeForcedToStop) ) #define IDeckLinkProfileCallback_ProfileActivated(This,activatedProfile) \ - ( (This)->lpVtbl -> ProfileActivated(This,activatedProfile) ) + ( (This)->lpVtbl -> ProfileActivated(This,activatedProfile) ) #endif /* COBJMACROS */ @@ -9245,61 +9826,67 @@ #define __IDeckLinkProfileManager_INTERFACE_DEFINED__ /* interface IDeckLinkProfileManager */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkProfileManager; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("30D41429-3998-4B6D-84F8-78C94A797C6E") IDeckLinkProfileManager : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetProfiles( + virtual HRESULT STDMETHODCALLTYPE GetProfiles( /* out */ IDeckLinkProfileIterator **profileIterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetProfile( + + virtual HRESULT STDMETHODCALLTYPE GetProfile( /* in */ BMDProfileID profileID, /* out */ IDeckLinkProfile **profile) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( + + virtual HRESULT STDMETHODCALLTYPE SetCallback( /* in */ IDeckLinkProfileCallback *callback) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkProfileManagerVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkProfileManager * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkProfileManager * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkProfileManager * This); - - HRESULT ( STDMETHODCALLTYPE *GetProfiles )( + + DECLSPEC_XFGVIRT(IDeckLinkProfileManager, GetProfiles) + HRESULT ( STDMETHODCALLTYPE *GetProfiles )( IDeckLinkProfileManager * This, /* out */ IDeckLinkProfileIterator **profileIterator); - - HRESULT ( STDMETHODCALLTYPE *GetProfile )( + + DECLSPEC_XFGVIRT(IDeckLinkProfileManager, GetProfile) + HRESULT ( STDMETHODCALLTYPE *GetProfile )( IDeckLinkProfileManager * This, /* in */ BMDProfileID profileID, /* out */ IDeckLinkProfile **profile); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkProfileManager, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( IDeckLinkProfileManager * This, /* in */ IDeckLinkProfileCallback *callback); - + END_INTERFACE } IDeckLinkProfileManagerVtbl; @@ -9308,29 +9895,29 @@ CONST_VTBL struct IDeckLinkProfileManagerVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkProfileManager_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkProfileManager_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkProfileManager_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkProfileManager_GetProfiles(This,profileIterator) \ - ( (This)->lpVtbl -> GetProfiles(This,profileIterator) ) + ( (This)->lpVtbl -> GetProfiles(This,profileIterator) ) #define IDeckLinkProfileManager_GetProfile(This,profileID,profile) \ - ( (This)->lpVtbl -> GetProfile(This,profileID,profile) ) + ( (This)->lpVtbl -> GetProfile(This,profileID,profile) ) #define IDeckLinkProfileManager_SetCallback(This,callback) \ - ( (This)->lpVtbl -> SetCallback(This,callback) ) + ( (This)->lpVtbl -> SetCallback(This,callback) ) #endif /* COBJMACROS */ @@ -9347,85 +9934,93 @@ #define __IDeckLinkStatus_INTERFACE_DEFINED__ /* interface IDeckLinkStatus */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkStatus; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("5F558200-4028-49BC-BEAC-DB3FA4A96E46") IDeckLinkStatus : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetFlag( + virtual HRESULT STDMETHODCALLTYPE GetFlag( /* in */ BMDDeckLinkStatusID statusID, /* out */ BOOL *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInt( + + virtual HRESULT STDMETHODCALLTYPE GetInt( /* in */ BMDDeckLinkStatusID statusID, /* out */ LONGLONG *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFloat( + + virtual HRESULT STDMETHODCALLTYPE GetFloat( /* in */ BMDDeckLinkStatusID statusID, /* out */ double *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* in */ BMDDeckLinkStatusID statusID, /* out */ BSTR *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBytes( + + virtual HRESULT STDMETHODCALLTYPE GetBytes( /* in */ BMDDeckLinkStatusID statusID, /* out */ void *buffer, /* outin */ unsigned int *bufferSize) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkStatusVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkStatus * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkStatus * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkStatus * This); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkStatus, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( IDeckLinkStatus * This, /* in */ BMDDeckLinkStatusID statusID, /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkStatus, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IDeckLinkStatus * This, /* in */ BMDDeckLinkStatusID statusID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkStatus, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( IDeckLinkStatus * This, /* in */ BMDDeckLinkStatusID statusID, /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IDeckLinkStatus, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IDeckLinkStatus * This, /* in */ BMDDeckLinkStatusID statusID, /* out */ BSTR *value); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkStatus, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkStatus * This, /* in */ BMDDeckLinkStatusID statusID, /* out */ void *buffer, /* outin */ unsigned int *bufferSize); - + END_INTERFACE } IDeckLinkStatusVtbl; @@ -9434,35 +10029,35 @@ CONST_VTBL struct IDeckLinkStatusVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkStatus_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkStatus_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkStatus_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkStatus_GetFlag(This,statusID,value) \ - ( (This)->lpVtbl -> GetFlag(This,statusID,value) ) + ( (This)->lpVtbl -> GetFlag(This,statusID,value) ) #define IDeckLinkStatus_GetInt(This,statusID,value) \ - ( (This)->lpVtbl -> GetInt(This,statusID,value) ) + ( (This)->lpVtbl -> GetInt(This,statusID,value) ) #define IDeckLinkStatus_GetFloat(This,statusID,value) \ - ( (This)->lpVtbl -> GetFloat(This,statusID,value) ) + ( (This)->lpVtbl -> GetFloat(This,statusID,value) ) #define IDeckLinkStatus_GetString(This,statusID,value) \ - ( (This)->lpVtbl -> GetString(This,statusID,value) ) + ( (This)->lpVtbl -> GetString(This,statusID,value) ) #define IDeckLinkStatus_GetBytes(This,statusID,buffer,bufferSize) \ - ( (This)->lpVtbl -> GetBytes(This,statusID,buffer,bufferSize) ) + ( (This)->lpVtbl -> GetBytes(This,statusID,buffer,bufferSize) ) #endif /* COBJMACROS */ @@ -9479,71 +10074,79 @@ #define __IDeckLinkKeyer_INTERFACE_DEFINED__ /* interface IDeckLinkKeyer */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkKeyer; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3") IDeckLinkKeyer : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Enable( + virtual HRESULT STDMETHODCALLTYPE Enable( /* in */ BOOL isExternal) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetLevel( + + virtual HRESULT STDMETHODCALLTYPE SetLevel( /* in */ unsigned char level) = 0; - - virtual HRESULT STDMETHODCALLTYPE RampUp( + + virtual HRESULT STDMETHODCALLTYPE RampUp( /* in */ unsigned int numberOfFrames) = 0; - - virtual HRESULT STDMETHODCALLTYPE RampDown( + + virtual HRESULT STDMETHODCALLTYPE RampDown( /* in */ unsigned int numberOfFrames) = 0; - + virtual HRESULT STDMETHODCALLTYPE Disable( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkKeyerVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkKeyer * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkKeyer * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkKeyer * This); - - HRESULT ( STDMETHODCALLTYPE *Enable )( + + DECLSPEC_XFGVIRT(IDeckLinkKeyer, Enable) + HRESULT ( STDMETHODCALLTYPE *Enable )( IDeckLinkKeyer * This, /* in */ BOOL isExternal); - - HRESULT ( STDMETHODCALLTYPE *SetLevel )( + + DECLSPEC_XFGVIRT(IDeckLinkKeyer, SetLevel) + HRESULT ( STDMETHODCALLTYPE *SetLevel )( IDeckLinkKeyer * This, /* in */ unsigned char level); - - HRESULT ( STDMETHODCALLTYPE *RampUp )( + + DECLSPEC_XFGVIRT(IDeckLinkKeyer, RampUp) + HRESULT ( STDMETHODCALLTYPE *RampUp )( IDeckLinkKeyer * This, /* in */ unsigned int numberOfFrames); - - HRESULT ( STDMETHODCALLTYPE *RampDown )( + + DECLSPEC_XFGVIRT(IDeckLinkKeyer, RampDown) + HRESULT ( STDMETHODCALLTYPE *RampDown )( IDeckLinkKeyer * This, /* in */ unsigned int numberOfFrames); - - HRESULT ( STDMETHODCALLTYPE *Disable )( + + DECLSPEC_XFGVIRT(IDeckLinkKeyer, Disable) + HRESULT ( STDMETHODCALLTYPE *Disable )( IDeckLinkKeyer * This); - + END_INTERFACE } IDeckLinkKeyerVtbl; @@ -9552,35 +10155,35 @@ CONST_VTBL struct IDeckLinkKeyerVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkKeyer_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkKeyer_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkKeyer_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkKeyer_Enable(This,isExternal) \ - ( (This)->lpVtbl -> Enable(This,isExternal) ) + ( (This)->lpVtbl -> Enable(This,isExternal) ) #define IDeckLinkKeyer_SetLevel(This,level) \ - ( (This)->lpVtbl -> SetLevel(This,level) ) + ( (This)->lpVtbl -> SetLevel(This,level) ) #define IDeckLinkKeyer_RampUp(This,numberOfFrames) \ - ( (This)->lpVtbl -> RampUp(This,numberOfFrames) ) + ( (This)->lpVtbl -> RampUp(This,numberOfFrames) ) #define IDeckLinkKeyer_RampDown(This,numberOfFrames) \ - ( (This)->lpVtbl -> RampDown(This,numberOfFrames) ) + ( (This)->lpVtbl -> RampDown(This,numberOfFrames) ) #define IDeckLinkKeyer_Disable(This) \ - ( (This)->lpVtbl -> Disable(This) ) + ( (This)->lpVtbl -> Disable(This) ) #endif /* COBJMACROS */ @@ -9597,47 +10200,51 @@ #define __IDeckLinkVideoConversion_INTERFACE_DEFINED__ /* interface IDeckLinkVideoConversion */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkVideoConversion; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("3BBCB8A2-DA2C-42D9-B5D8-88083644E99A") IDeckLinkVideoConversion : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE ConvertFrame( + virtual HRESULT STDMETHODCALLTYPE ConvertFrame( /* in */ IDeckLinkVideoFrame *srcFrame, /* in */ IDeckLinkVideoFrame *dstFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoConversionVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoConversion * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoConversion * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoConversion * This); - - HRESULT ( STDMETHODCALLTYPE *ConvertFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoConversion, ConvertFrame) + HRESULT ( STDMETHODCALLTYPE *ConvertFrame )( IDeckLinkVideoConversion * This, /* in */ IDeckLinkVideoFrame *srcFrame, /* in */ IDeckLinkVideoFrame *dstFrame); - + END_INTERFACE } IDeckLinkVideoConversionVtbl; @@ -9646,23 +10253,23 @@ CONST_VTBL struct IDeckLinkVideoConversionVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoConversion_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoConversion_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoConversion_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoConversion_ConvertFrame(This,srcFrame,dstFrame) \ - ( (This)->lpVtbl -> ConvertFrame(This,srcFrame,dstFrame) ) + ( (This)->lpVtbl -> ConvertFrame(This,srcFrame,dstFrame) ) #endif /* COBJMACROS */ @@ -9679,52 +10286,57 @@ #define __IDeckLinkDeviceNotificationCallback_INTERFACE_DEFINED__ /* interface IDeckLinkDeviceNotificationCallback */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkDeviceNotificationCallback; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("4997053B-0ADF-4CC8-AC70-7A50C4BE728F") IDeckLinkDeviceNotificationCallback : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DeckLinkDeviceArrived( + virtual HRESULT STDMETHODCALLTYPE DeckLinkDeviceArrived( /* in */ IDeckLink *deckLinkDevice) = 0; - - virtual HRESULT STDMETHODCALLTYPE DeckLinkDeviceRemoved( + + virtual HRESULT STDMETHODCALLTYPE DeckLinkDeviceRemoved( /* in */ IDeckLink *deckLinkDevice) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDeviceNotificationCallbackVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDeviceNotificationCallback * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDeviceNotificationCallback * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDeviceNotificationCallback * This); - - HRESULT ( STDMETHODCALLTYPE *DeckLinkDeviceArrived )( + + DECLSPEC_XFGVIRT(IDeckLinkDeviceNotificationCallback, DeckLinkDeviceArrived) + HRESULT ( STDMETHODCALLTYPE *DeckLinkDeviceArrived )( IDeckLinkDeviceNotificationCallback * This, /* in */ IDeckLink *deckLinkDevice); - - HRESULT ( STDMETHODCALLTYPE *DeckLinkDeviceRemoved )( + + DECLSPEC_XFGVIRT(IDeckLinkDeviceNotificationCallback, DeckLinkDeviceRemoved) + HRESULT ( STDMETHODCALLTYPE *DeckLinkDeviceRemoved )( IDeckLinkDeviceNotificationCallback * This, /* in */ IDeckLink *deckLinkDevice); - + END_INTERFACE } IDeckLinkDeviceNotificationCallbackVtbl; @@ -9733,26 +10345,26 @@ CONST_VTBL struct IDeckLinkDeviceNotificationCallbackVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDeviceNotificationCallback_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDeviceNotificationCallback_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDeviceNotificationCallback_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDeviceNotificationCallback_DeckLinkDeviceArrived(This,deckLinkDevice) \ - ( (This)->lpVtbl -> DeckLinkDeviceArrived(This,deckLinkDevice) ) + ( (This)->lpVtbl -> DeckLinkDeviceArrived(This,deckLinkDevice) ) #define IDeckLinkDeviceNotificationCallback_DeckLinkDeviceRemoved(This,deckLinkDevice) \ - ( (This)->lpVtbl -> DeckLinkDeviceRemoved(This,deckLinkDevice) ) + ( (This)->lpVtbl -> DeckLinkDeviceRemoved(This,deckLinkDevice) ) #endif /* COBJMACROS */ @@ -9769,50 +10381,55 @@ #define __IDeckLinkDiscovery_INTERFACE_DEFINED__ /* interface IDeckLinkDiscovery */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkDiscovery; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("CDBF631C-BC76-45FA-B44D-C55059BC6101") IDeckLinkDiscovery : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE InstallDeviceNotifications( + virtual HRESULT STDMETHODCALLTYPE InstallDeviceNotifications( /* in */ IDeckLinkDeviceNotificationCallback *deviceNotificationCallback) = 0; - + virtual HRESULT STDMETHODCALLTYPE UninstallDeviceNotifications( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDiscoveryVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDiscovery * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDiscovery * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDiscovery * This); - - HRESULT ( STDMETHODCALLTYPE *InstallDeviceNotifications )( + + DECLSPEC_XFGVIRT(IDeckLinkDiscovery, InstallDeviceNotifications) + HRESULT ( STDMETHODCALLTYPE *InstallDeviceNotifications )( IDeckLinkDiscovery * This, /* in */ IDeckLinkDeviceNotificationCallback *deviceNotificationCallback); - - HRESULT ( STDMETHODCALLTYPE *UninstallDeviceNotifications )( + + DECLSPEC_XFGVIRT(IDeckLinkDiscovery, UninstallDeviceNotifications) + HRESULT ( STDMETHODCALLTYPE *UninstallDeviceNotifications )( IDeckLinkDiscovery * This); - + END_INTERFACE } IDeckLinkDiscoveryVtbl; @@ -9821,26 +10438,26 @@ CONST_VTBL struct IDeckLinkDiscoveryVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDiscovery_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDiscovery_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDiscovery_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDiscovery_InstallDeviceNotifications(This,deviceNotificationCallback) \ - ( (This)->lpVtbl -> InstallDeviceNotifications(This,deviceNotificationCallback) ) + ( (This)->lpVtbl -> InstallDeviceNotifications(This,deviceNotificationCallback) ) #define IDeckLinkDiscovery_UninstallDeviceNotifications(This) \ - ( (This)->lpVtbl -> UninstallDeviceNotifications(This) ) + ( (This)->lpVtbl -> UninstallDeviceNotifications(This) ) #endif /* COBJMACROS */ @@ -9909,119 +10526,508 @@ CDeckLinkVideoFrameAncillaryPackets; #endif +#ifndef __IDeckLinkInputCallback_v11_5_1_INTERFACE_DEFINED__ +#define __IDeckLinkInputCallback_v11_5_1_INTERFACE_DEFINED__ + +/* interface IDeckLinkInputCallback_v11_5_1 */ +/* helpstringuuidobject */ + + +EXTERN_C const IID IID_IDeckLinkInputCallback_v11_5_1; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("DD04E5EC-7415-42AB-AE4A-E80C4DFC044A") + IDeckLinkInputCallback_v11_5_1 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged( + /* in */ BMDVideoInputFormatChangedEvents notificationEvents, + /* in */ IDeckLinkDisplayMode *newDisplayMode, + /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; + + virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived( + /* in */ IDeckLinkVideoInputFrame *videoFrame, + /* in */ IDeckLinkAudioInputPacket *audioPacket) = 0; + + }; + + +#else /* C style interface */ + + typedef struct IDeckLinkInputCallback_v11_5_1Vtbl + { + BEGIN_INTERFACE + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IDeckLinkInputCallback_v11_5_1 * This, + /* in */ REFIID riid, + /* annotationiid_isout */ + _COM_Outptr_ void **ppvObject); + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( + IDeckLinkInputCallback_v11_5_1 * This); + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( + IDeckLinkInputCallback_v11_5_1 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInputCallback_v11_5_1, VideoInputFormatChanged) + HRESULT ( STDMETHODCALLTYPE *VideoInputFormatChanged )( + IDeckLinkInputCallback_v11_5_1 * This, + /* in */ BMDVideoInputFormatChangedEvents notificationEvents, + /* in */ IDeckLinkDisplayMode *newDisplayMode, + /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags); + + DECLSPEC_XFGVIRT(IDeckLinkInputCallback_v11_5_1, VideoInputFrameArrived) + HRESULT ( STDMETHODCALLTYPE *VideoInputFrameArrived )( + IDeckLinkInputCallback_v11_5_1 * This, + /* in */ IDeckLinkVideoInputFrame *videoFrame, + /* in */ IDeckLinkAudioInputPacket *audioPacket); + + END_INTERFACE + } IDeckLinkInputCallback_v11_5_1Vtbl; + + interface IDeckLinkInputCallback_v11_5_1 + { + CONST_VTBL struct IDeckLinkInputCallback_v11_5_1Vtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IDeckLinkInputCallback_v11_5_1_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IDeckLinkInputCallback_v11_5_1_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IDeckLinkInputCallback_v11_5_1_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IDeckLinkInputCallback_v11_5_1_VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) \ + ( (This)->lpVtbl -> VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) ) + +#define IDeckLinkInputCallback_v11_5_1_VideoInputFrameArrived(This,videoFrame,audioPacket) \ + ( (This)->lpVtbl -> VideoInputFrameArrived(This,videoFrame,audioPacket) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IDeckLinkInputCallback_v11_5_1_INTERFACE_DEFINED__ */ + + +#ifndef __IDeckLinkInput_v11_5_1_INTERFACE_DEFINED__ +#define __IDeckLinkInput_v11_5_1_INTERFACE_DEFINED__ + +/* interface IDeckLinkInput_v11_5_1 */ +/* helpstringuuidobject */ + + +EXTERN_C const IID IID_IDeckLinkInput_v11_5_1; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("9434C6E4-B15D-4B1C-979E-661E3DDCB4B9") + IDeckLinkInput_v11_5_1 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + /* in */ BMDVideoConnection connection, + /* in */ BMDDisplayMode requestedMode, + /* in */ BMDPixelFormat requestedPixelFormat, + /* in */ BMDVideoInputConversionMode conversionMode, + /* in */ BMDSupportedVideoModeFlags flags, + /* out */ BMDDisplayMode *actualMode, + /* out */ BOOL *supported) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetDisplayMode( + /* in */ BMDDisplayMode displayMode, + /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + /* out */ IDeckLinkDisplayModeIterator **iterator) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( + /* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + + virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( + /* in */ BMDDisplayMode displayMode, + /* in */ BMDPixelFormat pixelFormat, + /* in */ BMDVideoInputFlags flags) = 0; + + virtual HRESULT STDMETHODCALLTYPE DisableVideoInput( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( + /* out */ unsigned int *availableFrameCount) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetVideoInputFrameMemoryAllocator( + /* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + + virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( + /* in */ BMDAudioSampleRate sampleRate, + /* in */ BMDAudioSampleType sampleType, + /* in */ unsigned int channelCount) = 0; + + virtual HRESULT STDMETHODCALLTYPE DisableAudioInput( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( + /* out */ unsigned int *availableSampleFrameCount) = 0; + + virtual HRESULT STDMETHODCALLTYPE StartStreams( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE StopStreams( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE PauseStreams( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE FlushStreams( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetCallback( + /* in */ IDeckLinkInputCallback_v11_5_1 *theCallback) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + /* in */ BMDTimeScale desiredTimeScale, + /* out */ BMDTimeValue *hardwareTime, + /* out */ BMDTimeValue *timeInFrame, + /* out */ BMDTimeValue *ticksPerFrame) = 0; + + }; + + +#else /* C style interface */ + + typedef struct IDeckLinkInput_v11_5_1Vtbl + { + BEGIN_INTERFACE + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IDeckLinkInput_v11_5_1 * This, + /* in */ REFIID riid, + /* annotationiid_isout */ + _COM_Outptr_ void **ppvObject); + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( + IDeckLinkInput_v11_5_1 * This); + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( + IDeckLinkInput_v11_5_1 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + IDeckLinkInput_v11_5_1 * This, + /* in */ BMDVideoConnection connection, + /* in */ BMDDisplayMode requestedMode, + /* in */ BMDPixelFormat requestedPixelFormat, + /* in */ BMDVideoInputConversionMode conversionMode, + /* in */ BMDSupportedVideoModeFlags flags, + /* out */ BMDDisplayMode *actualMode, + /* out */ BOOL *supported); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, GetDisplayMode) + HRESULT ( STDMETHODCALLTYPE *GetDisplayMode )( + IDeckLinkInput_v11_5_1 * This, + /* in */ BMDDisplayMode displayMode, + /* out */ IDeckLinkDisplayMode **resultDisplayMode); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + IDeckLinkInput_v11_5_1 * This, + /* out */ IDeckLinkDisplayModeIterator **iterator); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, SetScreenPreviewCallback) + HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( + IDeckLinkInput_v11_5_1 * This, + /* in */ IDeckLinkScreenPreviewCallback *previewCallback); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, EnableVideoInput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( + IDeckLinkInput_v11_5_1 * This, + /* in */ BMDDisplayMode displayMode, + /* in */ BMDPixelFormat pixelFormat, + /* in */ BMDVideoInputFlags flags); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, DisableVideoInput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( + IDeckLinkInput_v11_5_1 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, GetAvailableVideoFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( + IDeckLinkInput_v11_5_1 * This, + /* out */ unsigned int *availableFrameCount); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, SetVideoInputFrameMemoryAllocator) + HRESULT ( STDMETHODCALLTYPE *SetVideoInputFrameMemoryAllocator )( + IDeckLinkInput_v11_5_1 * This, + /* in */ IDeckLinkMemoryAllocator *theAllocator); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, EnableAudioInput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( + IDeckLinkInput_v11_5_1 * This, + /* in */ BMDAudioSampleRate sampleRate, + /* in */ BMDAudioSampleType sampleType, + /* in */ unsigned int channelCount); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, DisableAudioInput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( + IDeckLinkInput_v11_5_1 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, GetAvailableAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( + IDeckLinkInput_v11_5_1 * This, + /* out */ unsigned int *availableSampleFrameCount); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, StartStreams) + HRESULT ( STDMETHODCALLTYPE *StartStreams )( + IDeckLinkInput_v11_5_1 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, StopStreams) + HRESULT ( STDMETHODCALLTYPE *StopStreams )( + IDeckLinkInput_v11_5_1 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, PauseStreams) + HRESULT ( STDMETHODCALLTYPE *PauseStreams )( + IDeckLinkInput_v11_5_1 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, FlushStreams) + HRESULT ( STDMETHODCALLTYPE *FlushStreams )( + IDeckLinkInput_v11_5_1 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( + IDeckLinkInput_v11_5_1 * This, + /* in */ IDeckLinkInputCallback_v11_5_1 *theCallback); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_5_1, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + IDeckLinkInput_v11_5_1 * This, + /* in */ BMDTimeScale desiredTimeScale, + /* out */ BMDTimeValue *hardwareTime, + /* out */ BMDTimeValue *timeInFrame, + /* out */ BMDTimeValue *ticksPerFrame); + + END_INTERFACE + } IDeckLinkInput_v11_5_1Vtbl; + + interface IDeckLinkInput_v11_5_1 + { + CONST_VTBL struct IDeckLinkInput_v11_5_1Vtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IDeckLinkInput_v11_5_1_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IDeckLinkInput_v11_5_1_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IDeckLinkInput_v11_5_1_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IDeckLinkInput_v11_5_1_DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,conversionMode,flags,actualMode,supported) \ + ( (This)->lpVtbl -> DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,conversionMode,flags,actualMode,supported) ) + +#define IDeckLinkInput_v11_5_1_GetDisplayMode(This,displayMode,resultDisplayMode) \ + ( (This)->lpVtbl -> GetDisplayMode(This,displayMode,resultDisplayMode) ) + +#define IDeckLinkInput_v11_5_1_GetDisplayModeIterator(This,iterator) \ + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + +#define IDeckLinkInput_v11_5_1_SetScreenPreviewCallback(This,previewCallback) \ + ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) + +#define IDeckLinkInput_v11_5_1_EnableVideoInput(This,displayMode,pixelFormat,flags) \ + ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) + +#define IDeckLinkInput_v11_5_1_DisableVideoInput(This) \ + ( (This)->lpVtbl -> DisableVideoInput(This) ) + +#define IDeckLinkInput_v11_5_1_GetAvailableVideoFrameCount(This,availableFrameCount) \ + ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) + +#define IDeckLinkInput_v11_5_1_SetVideoInputFrameMemoryAllocator(This,theAllocator) \ + ( (This)->lpVtbl -> SetVideoInputFrameMemoryAllocator(This,theAllocator) ) + +#define IDeckLinkInput_v11_5_1_EnableAudioInput(This,sampleRate,sampleType,channelCount) \ + ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) + +#define IDeckLinkInput_v11_5_1_DisableAudioInput(This) \ + ( (This)->lpVtbl -> DisableAudioInput(This) ) + +#define IDeckLinkInput_v11_5_1_GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) \ + ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) + +#define IDeckLinkInput_v11_5_1_StartStreams(This) \ + ( (This)->lpVtbl -> StartStreams(This) ) + +#define IDeckLinkInput_v11_5_1_StopStreams(This) \ + ( (This)->lpVtbl -> StopStreams(This) ) + +#define IDeckLinkInput_v11_5_1_PauseStreams(This) \ + ( (This)->lpVtbl -> PauseStreams(This) ) + +#define IDeckLinkInput_v11_5_1_FlushStreams(This) \ + ( (This)->lpVtbl -> FlushStreams(This) ) + +#define IDeckLinkInput_v11_5_1_SetCallback(This,theCallback) \ + ( (This)->lpVtbl -> SetCallback(This,theCallback) ) + +#define IDeckLinkInput_v11_5_1_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \ + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IDeckLinkInput_v11_5_1_INTERFACE_DEFINED__ */ + + #ifndef __IDeckLinkConfiguration_v10_11_INTERFACE_DEFINED__ #define __IDeckLinkConfiguration_v10_11_INTERFACE_DEFINED__ /* interface IDeckLinkConfiguration_v10_11 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkConfiguration_v10_11; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("EF90380B-4AE5-4346-9077-E288E149F129") IDeckLinkConfiguration_v10_11 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE SetFlag( + virtual HRESULT STDMETHODCALLTYPE SetFlag( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BOOL value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFlag( + + virtual HRESULT STDMETHODCALLTYPE GetFlag( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BOOL *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInt( + + virtual HRESULT STDMETHODCALLTYPE SetInt( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ LONGLONG value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInt( + + virtual HRESULT STDMETHODCALLTYPE GetInt( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ LONGLONG *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFloat( + + virtual HRESULT STDMETHODCALLTYPE SetFloat( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFloat( + + virtual HRESULT STDMETHODCALLTYPE GetFloat( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetString( + + virtual HRESULT STDMETHODCALLTYPE SetString( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BSTR value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BSTR *value) = 0; - + virtual HRESULT STDMETHODCALLTYPE WriteConfigurationToPreferences( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkConfiguration_v10_11Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkConfiguration_v10_11 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkConfiguration_v10_11 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkConfiguration_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *SetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_11, SetFlag) + HRESULT ( STDMETHODCALLTYPE *SetFlag )( IDeckLinkConfiguration_v10_11 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BOOL value); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_11, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( IDeckLinkConfiguration_v10_11 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *SetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_11, SetInt) + HRESULT ( STDMETHODCALLTYPE *SetInt )( IDeckLinkConfiguration_v10_11 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ LONGLONG value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_11, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IDeckLinkConfiguration_v10_11 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *SetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_11, SetFloat) + HRESULT ( STDMETHODCALLTYPE *SetFloat )( IDeckLinkConfiguration_v10_11 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_11, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( IDeckLinkConfiguration_v10_11 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *SetString )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_11, SetString) + HRESULT ( STDMETHODCALLTYPE *SetString )( IDeckLinkConfiguration_v10_11 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BSTR value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_11, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IDeckLinkConfiguration_v10_11 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BSTR *value); - - HRESULT ( STDMETHODCALLTYPE *WriteConfigurationToPreferences )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_11, WriteConfigurationToPreferences) + HRESULT ( STDMETHODCALLTYPE *WriteConfigurationToPreferences )( IDeckLinkConfiguration_v10_11 * This); - + END_INTERFACE } IDeckLinkConfiguration_v10_11Vtbl; @@ -10030,47 +11036,47 @@ CONST_VTBL struct IDeckLinkConfiguration_v10_11Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkConfiguration_v10_11_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkConfiguration_v10_11_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkConfiguration_v10_11_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkConfiguration_v10_11_SetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_11_GetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_11_SetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_11_GetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_11_SetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_11_GetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_11_SetString(This,cfgID,value) \ - ( (This)->lpVtbl -> SetString(This,cfgID,value) ) + ( (This)->lpVtbl -> SetString(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_11_GetString(This,cfgID,value) \ - ( (This)->lpVtbl -> GetString(This,cfgID,value) ) + ( (This)->lpVtbl -> GetString(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_11_WriteConfigurationToPreferences(This) \ - ( (This)->lpVtbl -> WriteConfigurationToPreferences(This) ) + ( (This)->lpVtbl -> WriteConfigurationToPreferences(This) ) #endif /* COBJMACROS */ @@ -10087,74 +11093,81 @@ #define __IDeckLinkAttributes_v10_11_INTERFACE_DEFINED__ /* interface IDeckLinkAttributes_v10_11 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkAttributes_v10_11; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("ABC11843-D966-44CB-96E2-A1CB5D3135C4") IDeckLinkAttributes_v10_11 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetFlag( + virtual HRESULT STDMETHODCALLTYPE GetFlag( /* in */ BMDDeckLinkAttributeID cfgID, /* out */ BOOL *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInt( + + virtual HRESULT STDMETHODCALLTYPE GetInt( /* in */ BMDDeckLinkAttributeID cfgID, /* out */ LONGLONG *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFloat( + + virtual HRESULT STDMETHODCALLTYPE GetFloat( /* in */ BMDDeckLinkAttributeID cfgID, /* out */ double *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* in */ BMDDeckLinkAttributeID cfgID, /* out */ BSTR *value) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkAttributes_v10_11Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkAttributes_v10_11 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkAttributes_v10_11 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkAttributes_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkAttributes_v10_11, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( IDeckLinkAttributes_v10_11 * This, /* in */ BMDDeckLinkAttributeID cfgID, /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkAttributes_v10_11, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IDeckLinkAttributes_v10_11 * This, /* in */ BMDDeckLinkAttributeID cfgID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkAttributes_v10_11, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( IDeckLinkAttributes_v10_11 * This, /* in */ BMDDeckLinkAttributeID cfgID, /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IDeckLinkAttributes_v10_11, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IDeckLinkAttributes_v10_11 * This, /* in */ BMDDeckLinkAttributeID cfgID, /* out */ BSTR *value); - + END_INTERFACE } IDeckLinkAttributes_v10_11Vtbl; @@ -10163,32 +11176,32 @@ CONST_VTBL struct IDeckLinkAttributes_v10_11Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkAttributes_v10_11_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkAttributes_v10_11_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkAttributes_v10_11_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkAttributes_v10_11_GetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) #define IDeckLinkAttributes_v10_11_GetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) #define IDeckLinkAttributes_v10_11_GetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) #define IDeckLinkAttributes_v10_11_GetString(This,cfgID,value) \ - ( (This)->lpVtbl -> GetString(This,cfgID,value) ) + ( (This)->lpVtbl -> GetString(This,cfgID,value) ) #endif /* COBJMACROS */ @@ -10205,56 +11218,61 @@ #define __IDeckLinkNotification_v10_11_INTERFACE_DEFINED__ /* interface IDeckLinkNotification_v10_11 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkNotification_v10_11; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("0A1FB207-E215-441B-9B19-6FA1575946C5") IDeckLinkNotification_v10_11 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Subscribe( + virtual HRESULT STDMETHODCALLTYPE Subscribe( /* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE Unsubscribe( + + virtual HRESULT STDMETHODCALLTYPE Unsubscribe( /* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkNotification_v10_11Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkNotification_v10_11 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkNotification_v10_11 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkNotification_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *Subscribe )( + + DECLSPEC_XFGVIRT(IDeckLinkNotification_v10_11, Subscribe) + HRESULT ( STDMETHODCALLTYPE *Subscribe )( IDeckLinkNotification_v10_11 * This, /* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *Unsubscribe )( + + DECLSPEC_XFGVIRT(IDeckLinkNotification_v10_11, Unsubscribe) + HRESULT ( STDMETHODCALLTYPE *Unsubscribe )( IDeckLinkNotification_v10_11 * This, /* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback); - + END_INTERFACE } IDeckLinkNotification_v10_11Vtbl; @@ -10263,26 +11281,26 @@ CONST_VTBL struct IDeckLinkNotification_v10_11Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkNotification_v10_11_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkNotification_v10_11_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkNotification_v10_11_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkNotification_v10_11_Subscribe(This,topic,theCallback) \ - ( (This)->lpVtbl -> Subscribe(This,topic,theCallback) ) + ( (This)->lpVtbl -> Subscribe(This,topic,theCallback) ) #define IDeckLinkNotification_v10_11_Unsubscribe(This,topic,theCallback) \ - ( (This)->lpVtbl -> Unsubscribe(This,topic,theCallback) ) + ( (This)->lpVtbl -> Unsubscribe(This,topic,theCallback) ) #endif /* COBJMACROS */ @@ -10299,180 +11317,190 @@ #define __IDeckLinkOutput_v10_11_INTERFACE_DEFINED__ /* interface IDeckLinkOutput_v10_11 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkOutput_v10_11; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("CC5C8A6E-3F2F-4B3A-87EA-FD78AF300564") IDeckLinkOutput_v10_11 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoOutputFlags flags, /* out */ BMDDisplayModeSupport_v10_11 *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( /* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( /* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoOutput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( + + virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( /* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( + + virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( /* in */ int width, /* in */ int height, /* in */ int rowBytes, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame **outFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateAncillaryData( + + virtual HRESULT STDMETHODCALLTYPE CreateAncillaryData( /* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( + + virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( /* in */ IDeckLinkVideoFrame *theFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( + + virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( /* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( /* in */ IDeckLinkVideoOutputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferedVideoFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetBufferedVideoFrameCount( /* out */ unsigned int *bufferedFrameCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount, /* in */ BMDAudioOutputStreamType streamType) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioOutput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( + + virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( /* in */ void *buffer, /* in */ unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesWritten) = 0; - + virtual HRESULT STDMETHODCALLTYPE BeginAudioPreroll( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE EndAudioPreroll( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( + + virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( /* in */ void *buffer, /* in */ unsigned int sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ unsigned int *sampleFramesWritten) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( /* out */ unsigned int *bufferedSampleFrameCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE FlushBufferedAudioSamples( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( + + virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( /* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( + + virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( /* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed) = 0; - - virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( + + virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( /* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsScheduledPlaybackRunning( + + virtual HRESULT STDMETHODCALLTYPE IsScheduledPlaybackRunning( /* out */ BOOL *active) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetScheduledStreamTime( + + virtual HRESULT STDMETHODCALLTYPE GetScheduledStreamTime( /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetReferenceStatus( + + virtual HRESULT STDMETHODCALLTYPE GetReferenceStatus( /* out */ BMDReferenceStatus *referenceStatus) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFrameCompletionReferenceTimestamp( + + virtual HRESULT STDMETHODCALLTYPE GetFrameCompletionReferenceTimestamp( /* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *frameCompletionTimestamp) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkOutput_v10_11Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkOutput_v10_11 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkOutput_v10_11 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkOutput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkOutput_v10_11 * This, /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoOutputFlags flags, /* out */ BMDDisplayModeSupport_v10_11 *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkOutput_v10_11 * This, /* out */ IDeckLinkDisplayModeIterator **iterator); - - HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, SetScreenPreviewCallback) + HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( IDeckLinkOutput_v10_11 * This, /* in */ IDeckLinkScreenPreviewCallback *previewCallback); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, EnableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( IDeckLinkOutput_v10_11 * This, /* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, DisableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( IDeckLinkOutput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, SetVideoOutputFrameMemoryAllocator) + HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( IDeckLinkOutput_v10_11 * This, /* in */ IDeckLinkMemoryAllocator *theAllocator); - - HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, CreateVideoFrame) + HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( IDeckLinkOutput_v10_11 * This, /* in */ int width, /* in */ int height, @@ -10480,111 +11508,132 @@ /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame **outFrame); - - HRESULT ( STDMETHODCALLTYPE *CreateAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, CreateAncillaryData) + HRESULT ( STDMETHODCALLTYPE *CreateAncillaryData )( IDeckLinkOutput_v10_11 * This, /* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer); - - HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, DisplayVideoFrameSync) + HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( IDeckLinkOutput_v10_11 * This, /* in */ IDeckLinkVideoFrame *theFrame); - - HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, ScheduleVideoFrame) + HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( IDeckLinkOutput_v10_11 * This, /* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, SetScheduledFrameCompletionCallback) + HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( IDeckLinkOutput_v10_11 * This, /* in */ IDeckLinkVideoOutputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *GetBufferedVideoFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, GetBufferedVideoFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedVideoFrameCount )( IDeckLinkOutput_v10_11 * This, /* out */ unsigned int *bufferedFrameCount); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, EnableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( IDeckLinkOutput_v10_11 * This, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount, /* in */ BMDAudioOutputStreamType streamType); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, DisableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( IDeckLinkOutput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, WriteAudioSamplesSync) + HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( IDeckLinkOutput_v10_11 * This, /* in */ void *buffer, /* in */ unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesWritten); - - HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, BeginAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( IDeckLinkOutput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, EndAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( IDeckLinkOutput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, ScheduleAudioSamples) + HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( IDeckLinkOutput_v10_11 * This, /* in */ void *buffer, /* in */ unsigned int sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ unsigned int *sampleFramesWritten); - - HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, GetBufferedAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( IDeckLinkOutput_v10_11 * This, /* out */ unsigned int *bufferedSampleFrameCount); - - HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, FlushBufferedAudioSamples) + HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( IDeckLinkOutput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, SetAudioCallback) + HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( IDeckLinkOutput_v10_11 * This, /* in */ IDeckLinkAudioOutputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, StartScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( IDeckLinkOutput_v10_11 * This, /* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed); - - HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, StopScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( IDeckLinkOutput_v10_11 * This, /* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *IsScheduledPlaybackRunning )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, IsScheduledPlaybackRunning) + HRESULT ( STDMETHODCALLTYPE *IsScheduledPlaybackRunning )( IDeckLinkOutput_v10_11 * This, /* out */ BOOL *active); - - HRESULT ( STDMETHODCALLTYPE *GetScheduledStreamTime )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, GetScheduledStreamTime) + HRESULT ( STDMETHODCALLTYPE *GetScheduledStreamTime )( IDeckLinkOutput_v10_11 * This, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed); - - HRESULT ( STDMETHODCALLTYPE *GetReferenceStatus )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, GetReferenceStatus) + HRESULT ( STDMETHODCALLTYPE *GetReferenceStatus )( IDeckLinkOutput_v10_11 * This, /* out */ BMDReferenceStatus *referenceStatus); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( IDeckLinkOutput_v10_11 * This, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame); - - HRESULT ( STDMETHODCALLTYPE *GetFrameCompletionReferenceTimestamp )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v10_11, GetFrameCompletionReferenceTimestamp) + HRESULT ( STDMETHODCALLTYPE *GetFrameCompletionReferenceTimestamp )( IDeckLinkOutput_v10_11 * This, /* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *frameCompletionTimestamp); - + END_INTERFACE } IDeckLinkOutput_v10_11Vtbl; @@ -10593,104 +11642,104 @@ CONST_VTBL struct IDeckLinkOutput_v10_11Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkOutput_v10_11_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkOutput_v10_11_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkOutput_v10_11_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkOutput_v10_11_DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) ) + ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) ) #define IDeckLinkOutput_v10_11_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkOutput_v10_11_SetScreenPreviewCallback(This,previewCallback) \ - ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) + ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) #define IDeckLinkOutput_v10_11_EnableVideoOutput(This,displayMode,flags) \ - ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode,flags) ) + ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode,flags) ) #define IDeckLinkOutput_v10_11_DisableVideoOutput(This) \ - ( (This)->lpVtbl -> DisableVideoOutput(This) ) + ( (This)->lpVtbl -> DisableVideoOutput(This) ) #define IDeckLinkOutput_v10_11_SetVideoOutputFrameMemoryAllocator(This,theAllocator) \ - ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) + ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) #define IDeckLinkOutput_v10_11_CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) \ - ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) + ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) #define IDeckLinkOutput_v10_11_CreateAncillaryData(This,pixelFormat,outBuffer) \ - ( (This)->lpVtbl -> CreateAncillaryData(This,pixelFormat,outBuffer) ) + ( (This)->lpVtbl -> CreateAncillaryData(This,pixelFormat,outBuffer) ) #define IDeckLinkOutput_v10_11_DisplayVideoFrameSync(This,theFrame) \ - ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) + ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) #define IDeckLinkOutput_v10_11_ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) \ - ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) + ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) #define IDeckLinkOutput_v10_11_SetScheduledFrameCompletionCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) #define IDeckLinkOutput_v10_11_GetBufferedVideoFrameCount(This,bufferedFrameCount) \ - ( (This)->lpVtbl -> GetBufferedVideoFrameCount(This,bufferedFrameCount) ) + ( (This)->lpVtbl -> GetBufferedVideoFrameCount(This,bufferedFrameCount) ) #define IDeckLinkOutput_v10_11_EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) \ - ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) ) + ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) ) #define IDeckLinkOutput_v10_11_DisableAudioOutput(This) \ - ( (This)->lpVtbl -> DisableAudioOutput(This) ) + ( (This)->lpVtbl -> DisableAudioOutput(This) ) #define IDeckLinkOutput_v10_11_WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) \ - ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) + ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) #define IDeckLinkOutput_v10_11_BeginAudioPreroll(This) \ - ( (This)->lpVtbl -> BeginAudioPreroll(This) ) + ( (This)->lpVtbl -> BeginAudioPreroll(This) ) #define IDeckLinkOutput_v10_11_EndAudioPreroll(This) \ - ( (This)->lpVtbl -> EndAudioPreroll(This) ) + ( (This)->lpVtbl -> EndAudioPreroll(This) ) #define IDeckLinkOutput_v10_11_ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) \ - ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) + ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) #define IDeckLinkOutput_v10_11_GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) \ - ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) ) + ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) ) #define IDeckLinkOutput_v10_11_FlushBufferedAudioSamples(This) \ - ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) + ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) #define IDeckLinkOutput_v10_11_SetAudioCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) #define IDeckLinkOutput_v10_11_StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) \ - ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) + ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) #define IDeckLinkOutput_v10_11_StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) \ - ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) + ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) #define IDeckLinkOutput_v10_11_IsScheduledPlaybackRunning(This,active) \ - ( (This)->lpVtbl -> IsScheduledPlaybackRunning(This,active) ) + ( (This)->lpVtbl -> IsScheduledPlaybackRunning(This,active) ) #define IDeckLinkOutput_v10_11_GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) \ - ( (This)->lpVtbl -> GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) ) + ( (This)->lpVtbl -> GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) ) #define IDeckLinkOutput_v10_11_GetReferenceStatus(This,referenceStatus) \ - ( (This)->lpVtbl -> GetReferenceStatus(This,referenceStatus) ) + ( (This)->lpVtbl -> GetReferenceStatus(This,referenceStatus) ) #define IDeckLinkOutput_v10_11_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \ - ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) #define IDeckLinkOutput_v10_11_GetFrameCompletionReferenceTimestamp(This,theFrame,desiredTimeScale,frameCompletionTimestamp) \ - ( (This)->lpVtbl -> GetFrameCompletionReferenceTimestamp(This,theFrame,desiredTimeScale,frameCompletionTimestamp) ) + ( (This)->lpVtbl -> GetFrameCompletionReferenceTimestamp(This,theFrame,desiredTimeScale,frameCompletionTimestamp) ) #endif /* COBJMACROS */ @@ -10707,160 +11756,179 @@ #define __IDeckLinkInput_v10_11_INTERFACE_DEFINED__ /* interface IDeckLinkInput_v10_11 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkInput_v10_11; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("AF22762B-DFAC-4846-AA79-FA8883560995") IDeckLinkInput_v10_11 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport_v10_11 *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( /* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( /* out */ unsigned int *availableFrameCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoInputFrameMemoryAllocator( + + virtual HRESULT STDMETHODCALLTYPE SetVideoInputFrameMemoryAllocator( /* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( /* out */ unsigned int *availableSampleFrameCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE StartStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE StopStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE PauseStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE FlushStreams( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( - /* in */ IDeckLinkInputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + + virtual HRESULT STDMETHODCALLTYPE SetCallback( + /* in */ IDeckLinkInputCallback_v11_5_1 *theCallback) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkInput_v10_11Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkInput_v10_11 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkInput_v10_11 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkInput_v10_11 * This, /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport_v10_11 *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkInput_v10_11 * This, /* out */ IDeckLinkDisplayModeIterator **iterator); - - HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, SetScreenPreviewCallback) + HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( IDeckLinkInput_v10_11 * This, /* in */ IDeckLinkScreenPreviewCallback *previewCallback); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, EnableVideoInput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( IDeckLinkInput_v10_11 * This, /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, DisableVideoInput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( IDeckLinkInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, GetAvailableVideoFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( IDeckLinkInput_v10_11 * This, /* out */ unsigned int *availableFrameCount); - - HRESULT ( STDMETHODCALLTYPE *SetVideoInputFrameMemoryAllocator )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, SetVideoInputFrameMemoryAllocator) + HRESULT ( STDMETHODCALLTYPE *SetVideoInputFrameMemoryAllocator )( IDeckLinkInput_v10_11 * This, /* in */ IDeckLinkMemoryAllocator *theAllocator); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, EnableAudioInput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( IDeckLinkInput_v10_11 * This, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, DisableAudioInput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( IDeckLinkInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, GetAvailableAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( IDeckLinkInput_v10_11 * This, /* out */ unsigned int *availableSampleFrameCount); - - HRESULT ( STDMETHODCALLTYPE *StartStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, StartStreams) + HRESULT ( STDMETHODCALLTYPE *StartStreams )( IDeckLinkInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *StopStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, StopStreams) + HRESULT ( STDMETHODCALLTYPE *StopStreams )( IDeckLinkInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *PauseStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, PauseStreams) + HRESULT ( STDMETHODCALLTYPE *PauseStreams )( IDeckLinkInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *FlushStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, FlushStreams) + HRESULT ( STDMETHODCALLTYPE *FlushStreams )( IDeckLinkInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( IDeckLinkInput_v10_11 * This, - /* in */ IDeckLinkInputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + /* in */ IDeckLinkInputCallback_v11_5_1 *theCallback); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v10_11, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( IDeckLinkInput_v10_11 * This, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame); - + END_INTERFACE } IDeckLinkInput_v10_11Vtbl; @@ -10869,68 +11937,68 @@ CONST_VTBL struct IDeckLinkInput_v10_11Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkInput_v10_11_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkInput_v10_11_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkInput_v10_11_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkInput_v10_11_DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) ) + ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) ) #define IDeckLinkInput_v10_11_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkInput_v10_11_SetScreenPreviewCallback(This,previewCallback) \ - ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) + ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) #define IDeckLinkInput_v10_11_EnableVideoInput(This,displayMode,pixelFormat,flags) \ - ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) + ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) #define IDeckLinkInput_v10_11_DisableVideoInput(This) \ - ( (This)->lpVtbl -> DisableVideoInput(This) ) + ( (This)->lpVtbl -> DisableVideoInput(This) ) #define IDeckLinkInput_v10_11_GetAvailableVideoFrameCount(This,availableFrameCount) \ - ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) + ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) #define IDeckLinkInput_v10_11_SetVideoInputFrameMemoryAllocator(This,theAllocator) \ - ( (This)->lpVtbl -> SetVideoInputFrameMemoryAllocator(This,theAllocator) ) + ( (This)->lpVtbl -> SetVideoInputFrameMemoryAllocator(This,theAllocator) ) #define IDeckLinkInput_v10_11_EnableAudioInput(This,sampleRate,sampleType,channelCount) \ - ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) + ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) #define IDeckLinkInput_v10_11_DisableAudioInput(This) \ - ( (This)->lpVtbl -> DisableAudioInput(This) ) + ( (This)->lpVtbl -> DisableAudioInput(This) ) #define IDeckLinkInput_v10_11_GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) \ - ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) + ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) #define IDeckLinkInput_v10_11_StartStreams(This) \ - ( (This)->lpVtbl -> StartStreams(This) ) + ( (This)->lpVtbl -> StartStreams(This) ) #define IDeckLinkInput_v10_11_StopStreams(This) \ - ( (This)->lpVtbl -> StopStreams(This) ) + ( (This)->lpVtbl -> StopStreams(This) ) #define IDeckLinkInput_v10_11_PauseStreams(This) \ - ( (This)->lpVtbl -> PauseStreams(This) ) + ( (This)->lpVtbl -> PauseStreams(This) ) #define IDeckLinkInput_v10_11_FlushStreams(This) \ - ( (This)->lpVtbl -> FlushStreams(This) ) + ( (This)->lpVtbl -> FlushStreams(This) ) #define IDeckLinkInput_v10_11_SetCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetCallback(This,theCallback) ) #define IDeckLinkInput_v10_11_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \ - ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) #endif /* COBJMACROS */ @@ -10947,155 +12015,173 @@ #define __IDeckLinkEncoderInput_v10_11_INTERFACE_DEFINED__ /* interface IDeckLinkEncoderInput_v10_11 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkEncoderInput_v10_11; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("270587DA-6B7D-42E7-A1F0-6D853F581185") IDeckLinkEncoderInput_v10_11 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport_v10_11 *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailablePacketsCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailablePacketsCount( /* out */ unsigned int *availablePacketsCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMemoryAllocator( + + virtual HRESULT STDMETHODCALLTYPE SetMemoryAllocator( /* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( /* in */ BMDAudioFormat audioFormat, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( /* out */ unsigned int *availableSampleFrameCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE StartStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE StopStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE PauseStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE FlushStreams( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( + + virtual HRESULT STDMETHODCALLTYPE SetCallback( /* in */ IDeckLinkEncoderInputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkEncoderInput_v10_11Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkEncoderInput_v10_11 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkEncoderInput_v10_11 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkEncoderInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkEncoderInput_v10_11 * This, /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport_v10_11 *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkEncoderInput_v10_11 * This, /* out */ IDeckLinkDisplayModeIterator **iterator); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, EnableVideoInput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( IDeckLinkEncoderInput_v10_11 * This, /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, DisableVideoInput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( IDeckLinkEncoderInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailablePacketsCount )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, GetAvailablePacketsCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailablePacketsCount )( IDeckLinkEncoderInput_v10_11 * This, /* out */ unsigned int *availablePacketsCount); - - HRESULT ( STDMETHODCALLTYPE *SetMemoryAllocator )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, SetMemoryAllocator) + HRESULT ( STDMETHODCALLTYPE *SetMemoryAllocator )( IDeckLinkEncoderInput_v10_11 * This, /* in */ IDeckLinkMemoryAllocator *theAllocator); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, EnableAudioInput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( IDeckLinkEncoderInput_v10_11 * This, /* in */ BMDAudioFormat audioFormat, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, DisableAudioInput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( IDeckLinkEncoderInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, GetAvailableAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( IDeckLinkEncoderInput_v10_11 * This, /* out */ unsigned int *availableSampleFrameCount); - - HRESULT ( STDMETHODCALLTYPE *StartStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, StartStreams) + HRESULT ( STDMETHODCALLTYPE *StartStreams )( IDeckLinkEncoderInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *StopStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, StopStreams) + HRESULT ( STDMETHODCALLTYPE *StopStreams )( IDeckLinkEncoderInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *PauseStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, PauseStreams) + HRESULT ( STDMETHODCALLTYPE *PauseStreams )( IDeckLinkEncoderInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *FlushStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, FlushStreams) + HRESULT ( STDMETHODCALLTYPE *FlushStreams )( IDeckLinkEncoderInput_v10_11 * This); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( IDeckLinkEncoderInput_v10_11 * This, /* in */ IDeckLinkEncoderInputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + + DECLSPEC_XFGVIRT(IDeckLinkEncoderInput_v10_11, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( IDeckLinkEncoderInput_v10_11 * This, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame); - + END_INTERFACE } IDeckLinkEncoderInput_v10_11Vtbl; @@ -11104,65 +12190,65 @@ CONST_VTBL struct IDeckLinkEncoderInput_v10_11Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkEncoderInput_v10_11_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkEncoderInput_v10_11_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkEncoderInput_v10_11_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkEncoderInput_v10_11_DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) ) + ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) ) #define IDeckLinkEncoderInput_v10_11_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkEncoderInput_v10_11_EnableVideoInput(This,displayMode,pixelFormat,flags) \ - ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) + ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) #define IDeckLinkEncoderInput_v10_11_DisableVideoInput(This) \ - ( (This)->lpVtbl -> DisableVideoInput(This) ) + ( (This)->lpVtbl -> DisableVideoInput(This) ) #define IDeckLinkEncoderInput_v10_11_GetAvailablePacketsCount(This,availablePacketsCount) \ - ( (This)->lpVtbl -> GetAvailablePacketsCount(This,availablePacketsCount) ) + ( (This)->lpVtbl -> GetAvailablePacketsCount(This,availablePacketsCount) ) #define IDeckLinkEncoderInput_v10_11_SetMemoryAllocator(This,theAllocator) \ - ( (This)->lpVtbl -> SetMemoryAllocator(This,theAllocator) ) + ( (This)->lpVtbl -> SetMemoryAllocator(This,theAllocator) ) #define IDeckLinkEncoderInput_v10_11_EnableAudioInput(This,audioFormat,sampleRate,sampleType,channelCount) \ - ( (This)->lpVtbl -> EnableAudioInput(This,audioFormat,sampleRate,sampleType,channelCount) ) + ( (This)->lpVtbl -> EnableAudioInput(This,audioFormat,sampleRate,sampleType,channelCount) ) #define IDeckLinkEncoderInput_v10_11_DisableAudioInput(This) \ - ( (This)->lpVtbl -> DisableAudioInput(This) ) + ( (This)->lpVtbl -> DisableAudioInput(This) ) #define IDeckLinkEncoderInput_v10_11_GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) \ - ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) + ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) #define IDeckLinkEncoderInput_v10_11_StartStreams(This) \ - ( (This)->lpVtbl -> StartStreams(This) ) + ( (This)->lpVtbl -> StartStreams(This) ) #define IDeckLinkEncoderInput_v10_11_StopStreams(This) \ - ( (This)->lpVtbl -> StopStreams(This) ) + ( (This)->lpVtbl -> StopStreams(This) ) #define IDeckLinkEncoderInput_v10_11_PauseStreams(This) \ - ( (This)->lpVtbl -> PauseStreams(This) ) + ( (This)->lpVtbl -> PauseStreams(This) ) #define IDeckLinkEncoderInput_v10_11_FlushStreams(This) \ - ( (This)->lpVtbl -> FlushStreams(This) ) + ( (This)->lpVtbl -> FlushStreams(This) ) #define IDeckLinkEncoderInput_v10_11_SetCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetCallback(This,theCallback) ) #define IDeckLinkEncoderInput_v10_11_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \ - ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) #endif /* COBJMACROS */ @@ -11195,115 +12281,127 @@ #define __IDeckLinkConfiguration_v10_9_INTERFACE_DEFINED__ /* interface IDeckLinkConfiguration_v10_9 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkConfiguration_v10_9; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("CB71734A-FE37-4E8D-8E13-802133A1C3F2") IDeckLinkConfiguration_v10_9 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE SetFlag( + virtual HRESULT STDMETHODCALLTYPE SetFlag( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BOOL value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFlag( + + virtual HRESULT STDMETHODCALLTYPE GetFlag( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BOOL *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInt( + + virtual HRESULT STDMETHODCALLTYPE SetInt( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ LONGLONG value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInt( + + virtual HRESULT STDMETHODCALLTYPE GetInt( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ LONGLONG *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFloat( + + virtual HRESULT STDMETHODCALLTYPE SetFloat( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFloat( + + virtual HRESULT STDMETHODCALLTYPE GetFloat( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetString( + + virtual HRESULT STDMETHODCALLTYPE SetString( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BSTR value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BSTR *value) = 0; - + virtual HRESULT STDMETHODCALLTYPE WriteConfigurationToPreferences( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkConfiguration_v10_9Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkConfiguration_v10_9 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkConfiguration_v10_9 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkConfiguration_v10_9 * This); - - HRESULT ( STDMETHODCALLTYPE *SetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_9, SetFlag) + HRESULT ( STDMETHODCALLTYPE *SetFlag )( IDeckLinkConfiguration_v10_9 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BOOL value); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_9, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( IDeckLinkConfiguration_v10_9 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *SetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_9, SetInt) + HRESULT ( STDMETHODCALLTYPE *SetInt )( IDeckLinkConfiguration_v10_9 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ LONGLONG value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_9, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IDeckLinkConfiguration_v10_9 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *SetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_9, SetFloat) + HRESULT ( STDMETHODCALLTYPE *SetFloat )( IDeckLinkConfiguration_v10_9 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_9, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( IDeckLinkConfiguration_v10_9 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *SetString )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_9, SetString) + HRESULT ( STDMETHODCALLTYPE *SetString )( IDeckLinkConfiguration_v10_9 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BSTR value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_9, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IDeckLinkConfiguration_v10_9 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BSTR *value); - - HRESULT ( STDMETHODCALLTYPE *WriteConfigurationToPreferences )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_9, WriteConfigurationToPreferences) + HRESULT ( STDMETHODCALLTYPE *WriteConfigurationToPreferences )( IDeckLinkConfiguration_v10_9 * This); - + END_INTERFACE } IDeckLinkConfiguration_v10_9Vtbl; @@ -11312,47 +12410,47 @@ CONST_VTBL struct IDeckLinkConfiguration_v10_9Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkConfiguration_v10_9_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkConfiguration_v10_9_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkConfiguration_v10_9_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkConfiguration_v10_9_SetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_9_GetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_9_SetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_9_GetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_9_SetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_9_GetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_9_SetString(This,cfgID,value) \ - ( (This)->lpVtbl -> SetString(This,cfgID,value) ) + ( (This)->lpVtbl -> SetString(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_9_GetString(This,cfgID,value) \ - ( (This)->lpVtbl -> GetString(This,cfgID,value) ) + ( (This)->lpVtbl -> GetString(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_9_WriteConfigurationToPreferences(This) \ - ( (This)->lpVtbl -> WriteConfigurationToPreferences(This) ) + ( (This)->lpVtbl -> WriteConfigurationToPreferences(This) ) #endif /* COBJMACROS */ @@ -11373,315 +12471,131 @@ CBMDStreamingDiscovery_v10_8; #endif -EXTERN_C const CLSID CLSID_CDeckLinkIterator_v10_8; - -#ifdef __cplusplus - -class DECLSPEC_UUID("1F2E109A-8F4F-49E4-9203-135595CB6FA5") -CDeckLinkIterator_v10_8; -#endif - -EXTERN_C const CLSID CLSID_CDeckLinkDiscovery_v10_8; - -#ifdef __cplusplus - -class DECLSPEC_UUID("1073A05C-D885-47E9-B3C6-129B3F9F648B") -CDeckLinkDiscovery_v10_8; -#endif - -#ifndef __IDeckLinkEncoderConfiguration_v10_5_INTERFACE_DEFINED__ -#define __IDeckLinkEncoderConfiguration_v10_5_INTERFACE_DEFINED__ - -/* interface IDeckLinkEncoderConfiguration_v10_5 */ -/* helpstringlocaluuidobject */ - - -EXTERN_C const IID IID_IDeckLinkEncoderConfiguration_v10_5; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("67455668-0848-45DF-8D8E-350A77C9A028") - IDeckLinkEncoderConfiguration_v10_5 : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetFlag( - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* in */ BOOL value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFlag( - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* out */ BOOL *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInt( - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* in */ LONGLONG value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInt( - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* out */ LONGLONG *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFloat( - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* in */ double value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFloat( - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* out */ double *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetString( - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* in */ BSTR value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* out */ BSTR *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDecoderConfigurationInfo( - /* out */ void *buffer, - /* in */ long bufferSize, - /* out */ long *returnedSize) = 0; - - }; - - -#else /* C style interface */ - - typedef struct IDeckLinkEncoderConfiguration_v10_5Vtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDeckLinkEncoderConfiguration_v10_5 * This, - /* in */ REFIID riid, - /* annotationiid_isout */ - _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDeckLinkEncoderConfiguration_v10_5 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDeckLinkEncoderConfiguration_v10_5 * This); - - HRESULT ( STDMETHODCALLTYPE *SetFlag )( - IDeckLinkEncoderConfiguration_v10_5 * This, - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* in */ BOOL value); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( - IDeckLinkEncoderConfiguration_v10_5 * This, - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *SetInt )( - IDeckLinkEncoderConfiguration_v10_5 * This, - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* in */ LONGLONG value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( - IDeckLinkEncoderConfiguration_v10_5 * This, - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *SetFloat )( - IDeckLinkEncoderConfiguration_v10_5 * This, - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* in */ double value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( - IDeckLinkEncoderConfiguration_v10_5 * This, - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *SetString )( - IDeckLinkEncoderConfiguration_v10_5 * This, - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* in */ BSTR value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( - IDeckLinkEncoderConfiguration_v10_5 * This, - /* in */ BMDDeckLinkEncoderConfigurationID cfgID, - /* out */ BSTR *value); - - HRESULT ( STDMETHODCALLTYPE *GetDecoderConfigurationInfo )( - IDeckLinkEncoderConfiguration_v10_5 * This, - /* out */ void *buffer, - /* in */ long bufferSize, - /* out */ long *returnedSize); - - END_INTERFACE - } IDeckLinkEncoderConfiguration_v10_5Vtbl; - - interface IDeckLinkEncoderConfiguration_v10_5 - { - CONST_VTBL struct IDeckLinkEncoderConfiguration_v10_5Vtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDeckLinkEncoderConfiguration_v10_5_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define IDeckLinkEncoderConfiguration_v10_5_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define IDeckLinkEncoderConfiguration_v10_5_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define IDeckLinkEncoderConfiguration_v10_5_SetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) - -#define IDeckLinkEncoderConfiguration_v10_5_GetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) - -#define IDeckLinkEncoderConfiguration_v10_5_SetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) - -#define IDeckLinkEncoderConfiguration_v10_5_GetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) - -#define IDeckLinkEncoderConfiguration_v10_5_SetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) - -#define IDeckLinkEncoderConfiguration_v10_5_GetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) - -#define IDeckLinkEncoderConfiguration_v10_5_SetString(This,cfgID,value) \ - ( (This)->lpVtbl -> SetString(This,cfgID,value) ) - -#define IDeckLinkEncoderConfiguration_v10_5_GetString(This,cfgID,value) \ - ( (This)->lpVtbl -> GetString(This,cfgID,value) ) - -#define IDeckLinkEncoderConfiguration_v10_5_GetDecoderConfigurationInfo(This,buffer,bufferSize,returnedSize) \ - ( (This)->lpVtbl -> GetDecoderConfigurationInfo(This,buffer,bufferSize,returnedSize) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __IDeckLinkEncoderConfiguration_v10_5_INTERFACE_DEFINED__ */ - - #ifndef __IDeckLinkConfiguration_v10_4_INTERFACE_DEFINED__ #define __IDeckLinkConfiguration_v10_4_INTERFACE_DEFINED__ /* interface IDeckLinkConfiguration_v10_4 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkConfiguration_v10_4; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("1E69FCF6-4203-4936-8076-2A9F4CFD50CB") IDeckLinkConfiguration_v10_4 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE SetFlag( + virtual HRESULT STDMETHODCALLTYPE SetFlag( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BOOL value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFlag( + + virtual HRESULT STDMETHODCALLTYPE GetFlag( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BOOL *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInt( + + virtual HRESULT STDMETHODCALLTYPE SetInt( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ LONGLONG value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInt( + + virtual HRESULT STDMETHODCALLTYPE GetInt( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ LONGLONG *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFloat( + + virtual HRESULT STDMETHODCALLTYPE SetFloat( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFloat( + + virtual HRESULT STDMETHODCALLTYPE GetFloat( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetString( + + virtual HRESULT STDMETHODCALLTYPE SetString( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BSTR value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BSTR *value) = 0; - + virtual HRESULT STDMETHODCALLTYPE WriteConfigurationToPreferences( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkConfiguration_v10_4Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkConfiguration_v10_4 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkConfiguration_v10_4 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkConfiguration_v10_4 * This); - - HRESULT ( STDMETHODCALLTYPE *SetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_4, SetFlag) + HRESULT ( STDMETHODCALLTYPE *SetFlag )( IDeckLinkConfiguration_v10_4 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BOOL value); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_4, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( IDeckLinkConfiguration_v10_4 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *SetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_4, SetInt) + HRESULT ( STDMETHODCALLTYPE *SetInt )( IDeckLinkConfiguration_v10_4 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ LONGLONG value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_4, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IDeckLinkConfiguration_v10_4 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *SetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_4, SetFloat) + HRESULT ( STDMETHODCALLTYPE *SetFloat )( IDeckLinkConfiguration_v10_4 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_4, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( IDeckLinkConfiguration_v10_4 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *SetString )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_4, SetString) + HRESULT ( STDMETHODCALLTYPE *SetString )( IDeckLinkConfiguration_v10_4 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BSTR value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_4, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IDeckLinkConfiguration_v10_4 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BSTR *value); - - HRESULT ( STDMETHODCALLTYPE *WriteConfigurationToPreferences )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_4, WriteConfigurationToPreferences) + HRESULT ( STDMETHODCALLTYPE *WriteConfigurationToPreferences )( IDeckLinkConfiguration_v10_4 * This); - + END_INTERFACE } IDeckLinkConfiguration_v10_4Vtbl; @@ -11690,47 +12604,47 @@ CONST_VTBL struct IDeckLinkConfiguration_v10_4Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkConfiguration_v10_4_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkConfiguration_v10_4_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkConfiguration_v10_4_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkConfiguration_v10_4_SetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_4_GetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_4_SetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_4_GetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_4_SetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_4_GetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_4_SetString(This,cfgID,value) \ - ( (This)->lpVtbl -> SetString(This,cfgID,value) ) + ( (This)->lpVtbl -> SetString(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_4_GetString(This,cfgID,value) \ - ( (This)->lpVtbl -> GetString(This,cfgID,value) ) + ( (This)->lpVtbl -> GetString(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_4_WriteConfigurationToPreferences(This) \ - ( (This)->lpVtbl -> WriteConfigurationToPreferences(This) ) + ( (This)->lpVtbl -> WriteConfigurationToPreferences(This) ) #endif /* COBJMACROS */ @@ -11747,115 +12661,127 @@ #define __IDeckLinkConfiguration_v10_2_INTERFACE_DEFINED__ /* interface IDeckLinkConfiguration_v10_2 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkConfiguration_v10_2; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("C679A35B-610C-4D09-B748-1D0478100FC0") IDeckLinkConfiguration_v10_2 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE SetFlag( + virtual HRESULT STDMETHODCALLTYPE SetFlag( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BOOL value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFlag( + + virtual HRESULT STDMETHODCALLTYPE GetFlag( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BOOL *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInt( + + virtual HRESULT STDMETHODCALLTYPE SetInt( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ LONGLONG value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetInt( + + virtual HRESULT STDMETHODCALLTYPE GetInt( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ LONGLONG *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFloat( + + virtual HRESULT STDMETHODCALLTYPE SetFloat( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFloat( + + virtual HRESULT STDMETHODCALLTYPE GetFloat( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetString( + + virtual HRESULT STDMETHODCALLTYPE SetString( /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BSTR value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BSTR *value) = 0; - + virtual HRESULT STDMETHODCALLTYPE WriteConfigurationToPreferences( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkConfiguration_v10_2Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkConfiguration_v10_2 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkConfiguration_v10_2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkConfiguration_v10_2 * This); - - HRESULT ( STDMETHODCALLTYPE *SetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_2, SetFlag) + HRESULT ( STDMETHODCALLTYPE *SetFlag )( IDeckLinkConfiguration_v10_2 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BOOL value); - - HRESULT ( STDMETHODCALLTYPE *GetFlag )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_2, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( IDeckLinkConfiguration_v10_2 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BOOL *value); - - HRESULT ( STDMETHODCALLTYPE *SetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_2, SetInt) + HRESULT ( STDMETHODCALLTYPE *SetInt )( IDeckLinkConfiguration_v10_2 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ LONGLONG value); - - HRESULT ( STDMETHODCALLTYPE *GetInt )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_2, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( IDeckLinkConfiguration_v10_2 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ LONGLONG *value); - - HRESULT ( STDMETHODCALLTYPE *SetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_2, SetFloat) + HRESULT ( STDMETHODCALLTYPE *SetFloat )( IDeckLinkConfiguration_v10_2 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value); - - HRESULT ( STDMETHODCALLTYPE *GetFloat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_2, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( IDeckLinkConfiguration_v10_2 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value); - - HRESULT ( STDMETHODCALLTYPE *SetString )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_2, SetString) + HRESULT ( STDMETHODCALLTYPE *SetString )( IDeckLinkConfiguration_v10_2 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* in */ BSTR value); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_2, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IDeckLinkConfiguration_v10_2 * This, /* in */ BMDDeckLinkConfigurationID cfgID, /* out */ BSTR *value); - - HRESULT ( STDMETHODCALLTYPE *WriteConfigurationToPreferences )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v10_2, WriteConfigurationToPreferences) + HRESULT ( STDMETHODCALLTYPE *WriteConfigurationToPreferences )( IDeckLinkConfiguration_v10_2 * This); - + END_INTERFACE } IDeckLinkConfiguration_v10_2Vtbl; @@ -11864,47 +12790,47 @@ CONST_VTBL struct IDeckLinkConfiguration_v10_2Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkConfiguration_v10_2_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkConfiguration_v10_2_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkConfiguration_v10_2_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkConfiguration_v10_2_SetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_2_GetFlag(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_2_SetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_2_GetInt(This,cfgID,value) \ - ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) + ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_2_SetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_2_GetFloat(This,cfgID,value) \ - ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) + ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_2_SetString(This,cfgID,value) \ - ( (This)->lpVtbl -> SetString(This,cfgID,value) ) + ( (This)->lpVtbl -> SetString(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_2_GetString(This,cfgID,value) \ - ( (This)->lpVtbl -> GetString(This,cfgID,value) ) + ( (This)->lpVtbl -> GetString(This,cfgID,value) ) #define IDeckLinkConfiguration_v10_2_WriteConfigurationToPreferences(This) \ - ( (This)->lpVtbl -> WriteConfigurationToPreferences(This) ) + ( (This)->lpVtbl -> WriteConfigurationToPreferences(This) ) #endif /* COBJMACROS */ @@ -11917,179 +12843,1248 @@ #endif /* __IDeckLinkConfiguration_v10_2_INTERFACE_DEFINED__ */ +#ifndef __IDeckLinkVideoFrameMetadataExtensions_v11_5_INTERFACE_DEFINED__ +#define __IDeckLinkVideoFrameMetadataExtensions_v11_5_INTERFACE_DEFINED__ + +/* interface IDeckLinkVideoFrameMetadataExtensions_v11_5 */ +/* helpstringlocaluuidobject */ + + +EXTERN_C const IID IID_IDeckLinkVideoFrameMetadataExtensions_v11_5; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("D5973DC9-6432-46D0-8F0B-2496F8A1238F") + IDeckLinkVideoFrameMetadataExtensions_v11_5 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetInt( + /* in */ BMDDeckLinkFrameMetadataID_v11_5 metadataID, + /* out */ LONGLONG *value) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetFloat( + /* in */ BMDDeckLinkFrameMetadataID_v11_5 metadataID, + /* out */ double *value) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetFlag( + /* in */ BMDDeckLinkFrameMetadataID_v11_5 metadataID, + /* out */ BOOL *value) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetString( + /* in */ BMDDeckLinkFrameMetadataID_v11_5 metadataID, + /* out */ BSTR *value) = 0; + + }; + + +#else /* C style interface */ + + typedef struct IDeckLinkVideoFrameMetadataExtensions_v11_5Vtbl + { + BEGIN_INTERFACE + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IDeckLinkVideoFrameMetadataExtensions_v11_5 * This, + /* in */ REFIID riid, + /* annotationiid_isout */ + _COM_Outptr_ void **ppvObject); + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( + IDeckLinkVideoFrameMetadataExtensions_v11_5 * This); + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( + IDeckLinkVideoFrameMetadataExtensions_v11_5 * This); + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameMetadataExtensions_v11_5, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( + IDeckLinkVideoFrameMetadataExtensions_v11_5 * This, + /* in */ BMDDeckLinkFrameMetadataID_v11_5 metadataID, + /* out */ LONGLONG *value); + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameMetadataExtensions_v11_5, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( + IDeckLinkVideoFrameMetadataExtensions_v11_5 * This, + /* in */ BMDDeckLinkFrameMetadataID_v11_5 metadataID, + /* out */ double *value); + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameMetadataExtensions_v11_5, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( + IDeckLinkVideoFrameMetadataExtensions_v11_5 * This, + /* in */ BMDDeckLinkFrameMetadataID_v11_5 metadataID, + /* out */ BOOL *value); + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrameMetadataExtensions_v11_5, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( + IDeckLinkVideoFrameMetadataExtensions_v11_5 * This, + /* in */ BMDDeckLinkFrameMetadataID_v11_5 metadataID, + /* out */ BSTR *value); + + END_INTERFACE + } IDeckLinkVideoFrameMetadataExtensions_v11_5Vtbl; + + interface IDeckLinkVideoFrameMetadataExtensions_v11_5 + { + CONST_VTBL struct IDeckLinkVideoFrameMetadataExtensions_v11_5Vtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IDeckLinkVideoFrameMetadataExtensions_v11_5_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IDeckLinkVideoFrameMetadataExtensions_v11_5_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IDeckLinkVideoFrameMetadataExtensions_v11_5_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IDeckLinkVideoFrameMetadataExtensions_v11_5_GetInt(This,metadataID,value) \ + ( (This)->lpVtbl -> GetInt(This,metadataID,value) ) + +#define IDeckLinkVideoFrameMetadataExtensions_v11_5_GetFloat(This,metadataID,value) \ + ( (This)->lpVtbl -> GetFloat(This,metadataID,value) ) + +#define IDeckLinkVideoFrameMetadataExtensions_v11_5_GetFlag(This,metadataID,value) \ + ( (This)->lpVtbl -> GetFlag(This,metadataID,value) ) + +#define IDeckLinkVideoFrameMetadataExtensions_v11_5_GetString(This,metadataID,value) \ + ( (This)->lpVtbl -> GetString(This,metadataID,value) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IDeckLinkVideoFrameMetadataExtensions_v11_5_INTERFACE_DEFINED__ */ + + +#ifndef __IDeckLinkOutput_v11_4_INTERFACE_DEFINED__ +#define __IDeckLinkOutput_v11_4_INTERFACE_DEFINED__ + +/* interface IDeckLinkOutput_v11_4 */ +/* helpstringlocaluuidobject */ + + +EXTERN_C const IID IID_IDeckLinkOutput_v11_4; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("065A0F6C-C508-4D0D-B919-F5EB0EBFC96B") + IDeckLinkOutput_v11_4 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + /* in */ BMDVideoConnection connection, + /* in */ BMDDisplayMode requestedMode, + /* in */ BMDPixelFormat requestedPixelFormat, + /* in */ BMDSupportedVideoModeFlags flags, + /* out */ BMDDisplayMode *actualMode, + /* out */ BOOL *supported) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetDisplayMode( + /* in */ BMDDisplayMode displayMode, + /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + /* out */ IDeckLinkDisplayModeIterator **iterator) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( + /* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + + virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( + /* in */ BMDDisplayMode displayMode, + /* in */ BMDVideoOutputFlags flags) = 0; + + virtual HRESULT STDMETHODCALLTYPE DisableVideoOutput( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( + /* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + + virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( + /* in */ int width, + /* in */ int height, + /* in */ int rowBytes, + /* in */ BMDPixelFormat pixelFormat, + /* in */ BMDFrameFlags flags, + /* out */ IDeckLinkMutableVideoFrame **outFrame) = 0; + + virtual HRESULT STDMETHODCALLTYPE CreateAncillaryData( + /* in */ BMDPixelFormat pixelFormat, + /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; + + virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( + /* in */ IDeckLinkVideoFrame *theFrame) = 0; + + virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( + /* in */ IDeckLinkVideoFrame *theFrame, + /* in */ BMDTimeValue displayTime, + /* in */ BMDTimeValue displayDuration, + /* in */ BMDTimeScale timeScale) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( + /* in */ IDeckLinkVideoOutputCallback *theCallback) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetBufferedVideoFrameCount( + /* out */ unsigned int *bufferedFrameCount) = 0; + + virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( + /* in */ BMDAudioSampleRate sampleRate, + /* in */ BMDAudioSampleType sampleType, + /* in */ unsigned int channelCount, + /* in */ BMDAudioOutputStreamType streamType) = 0; + + virtual HRESULT STDMETHODCALLTYPE DisableAudioOutput( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( + /* in */ void *buffer, + /* in */ unsigned int sampleFrameCount, + /* out */ unsigned int *sampleFramesWritten) = 0; + + virtual HRESULT STDMETHODCALLTYPE BeginAudioPreroll( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE EndAudioPreroll( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( + /* in */ void *buffer, + /* in */ unsigned int sampleFrameCount, + /* in */ BMDTimeValue streamTime, + /* in */ BMDTimeScale timeScale, + /* out */ unsigned int *sampleFramesWritten) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( + /* out */ unsigned int *bufferedSampleFrameCount) = 0; + + virtual HRESULT STDMETHODCALLTYPE FlushBufferedAudioSamples( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( + /* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; + + virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( + /* in */ BMDTimeValue playbackStartTime, + /* in */ BMDTimeScale timeScale, + /* in */ double playbackSpeed) = 0; + + virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( + /* in */ BMDTimeValue stopPlaybackAtTime, + /* out */ BMDTimeValue *actualStopTime, + /* in */ BMDTimeScale timeScale) = 0; + + virtual HRESULT STDMETHODCALLTYPE IsScheduledPlaybackRunning( + /* out */ BOOL *active) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetScheduledStreamTime( + /* in */ BMDTimeScale desiredTimeScale, + /* out */ BMDTimeValue *streamTime, + /* out */ double *playbackSpeed) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetReferenceStatus( + /* out */ BMDReferenceStatus *referenceStatus) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + /* in */ BMDTimeScale desiredTimeScale, + /* out */ BMDTimeValue *hardwareTime, + /* out */ BMDTimeValue *timeInFrame, + /* out */ BMDTimeValue *ticksPerFrame) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetFrameCompletionReferenceTimestamp( + /* in */ IDeckLinkVideoFrame *theFrame, + /* in */ BMDTimeScale desiredTimeScale, + /* out */ BMDTimeValue *frameCompletionTimestamp) = 0; + + }; + + +#else /* C style interface */ + + typedef struct IDeckLinkOutput_v11_4Vtbl + { + BEGIN_INTERFACE + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IDeckLinkOutput_v11_4 * This, + /* in */ REFIID riid, + /* annotationiid_isout */ + _COM_Outptr_ void **ppvObject); + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( + IDeckLinkOutput_v11_4 * This); + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( + IDeckLinkOutput_v11_4 * This); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + IDeckLinkOutput_v11_4 * This, + /* in */ BMDVideoConnection connection, + /* in */ BMDDisplayMode requestedMode, + /* in */ BMDPixelFormat requestedPixelFormat, + /* in */ BMDSupportedVideoModeFlags flags, + /* out */ BMDDisplayMode *actualMode, + /* out */ BOOL *supported); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, GetDisplayMode) + HRESULT ( STDMETHODCALLTYPE *GetDisplayMode )( + IDeckLinkOutput_v11_4 * This, + /* in */ BMDDisplayMode displayMode, + /* out */ IDeckLinkDisplayMode **resultDisplayMode); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + IDeckLinkOutput_v11_4 * This, + /* out */ IDeckLinkDisplayModeIterator **iterator); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, SetScreenPreviewCallback) + HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( + IDeckLinkOutput_v11_4 * This, + /* in */ IDeckLinkScreenPreviewCallback *previewCallback); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, EnableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( + IDeckLinkOutput_v11_4 * This, + /* in */ BMDDisplayMode displayMode, + /* in */ BMDVideoOutputFlags flags); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, DisableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( + IDeckLinkOutput_v11_4 * This); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, SetVideoOutputFrameMemoryAllocator) + HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( + IDeckLinkOutput_v11_4 * This, + /* in */ IDeckLinkMemoryAllocator *theAllocator); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, CreateVideoFrame) + HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( + IDeckLinkOutput_v11_4 * This, + /* in */ int width, + /* in */ int height, + /* in */ int rowBytes, + /* in */ BMDPixelFormat pixelFormat, + /* in */ BMDFrameFlags flags, + /* out */ IDeckLinkMutableVideoFrame **outFrame); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, CreateAncillaryData) + HRESULT ( STDMETHODCALLTYPE *CreateAncillaryData )( + IDeckLinkOutput_v11_4 * This, + /* in */ BMDPixelFormat pixelFormat, + /* out */ IDeckLinkVideoFrameAncillary **outBuffer); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, DisplayVideoFrameSync) + HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( + IDeckLinkOutput_v11_4 * This, + /* in */ IDeckLinkVideoFrame *theFrame); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, ScheduleVideoFrame) + HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( + IDeckLinkOutput_v11_4 * This, + /* in */ IDeckLinkVideoFrame *theFrame, + /* in */ BMDTimeValue displayTime, + /* in */ BMDTimeValue displayDuration, + /* in */ BMDTimeScale timeScale); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, SetScheduledFrameCompletionCallback) + HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( + IDeckLinkOutput_v11_4 * This, + /* in */ IDeckLinkVideoOutputCallback *theCallback); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, GetBufferedVideoFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedVideoFrameCount )( + IDeckLinkOutput_v11_4 * This, + /* out */ unsigned int *bufferedFrameCount); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, EnableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( + IDeckLinkOutput_v11_4 * This, + /* in */ BMDAudioSampleRate sampleRate, + /* in */ BMDAudioSampleType sampleType, + /* in */ unsigned int channelCount, + /* in */ BMDAudioOutputStreamType streamType); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, DisableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( + IDeckLinkOutput_v11_4 * This); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, WriteAudioSamplesSync) + HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( + IDeckLinkOutput_v11_4 * This, + /* in */ void *buffer, + /* in */ unsigned int sampleFrameCount, + /* out */ unsigned int *sampleFramesWritten); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, BeginAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( + IDeckLinkOutput_v11_4 * This); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, EndAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( + IDeckLinkOutput_v11_4 * This); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, ScheduleAudioSamples) + HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( + IDeckLinkOutput_v11_4 * This, + /* in */ void *buffer, + /* in */ unsigned int sampleFrameCount, + /* in */ BMDTimeValue streamTime, + /* in */ BMDTimeScale timeScale, + /* out */ unsigned int *sampleFramesWritten); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, GetBufferedAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( + IDeckLinkOutput_v11_4 * This, + /* out */ unsigned int *bufferedSampleFrameCount); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, FlushBufferedAudioSamples) + HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( + IDeckLinkOutput_v11_4 * This); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, SetAudioCallback) + HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( + IDeckLinkOutput_v11_4 * This, + /* in */ IDeckLinkAudioOutputCallback *theCallback); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, StartScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( + IDeckLinkOutput_v11_4 * This, + /* in */ BMDTimeValue playbackStartTime, + /* in */ BMDTimeScale timeScale, + /* in */ double playbackSpeed); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, StopScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( + IDeckLinkOutput_v11_4 * This, + /* in */ BMDTimeValue stopPlaybackAtTime, + /* out */ BMDTimeValue *actualStopTime, + /* in */ BMDTimeScale timeScale); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, IsScheduledPlaybackRunning) + HRESULT ( STDMETHODCALLTYPE *IsScheduledPlaybackRunning )( + IDeckLinkOutput_v11_4 * This, + /* out */ BOOL *active); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, GetScheduledStreamTime) + HRESULT ( STDMETHODCALLTYPE *GetScheduledStreamTime )( + IDeckLinkOutput_v11_4 * This, + /* in */ BMDTimeScale desiredTimeScale, + /* out */ BMDTimeValue *streamTime, + /* out */ double *playbackSpeed); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, GetReferenceStatus) + HRESULT ( STDMETHODCALLTYPE *GetReferenceStatus )( + IDeckLinkOutput_v11_4 * This, + /* out */ BMDReferenceStatus *referenceStatus); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + IDeckLinkOutput_v11_4 * This, + /* in */ BMDTimeScale desiredTimeScale, + /* out */ BMDTimeValue *hardwareTime, + /* out */ BMDTimeValue *timeInFrame, + /* out */ BMDTimeValue *ticksPerFrame); + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v11_4, GetFrameCompletionReferenceTimestamp) + HRESULT ( STDMETHODCALLTYPE *GetFrameCompletionReferenceTimestamp )( + IDeckLinkOutput_v11_4 * This, + /* in */ IDeckLinkVideoFrame *theFrame, + /* in */ BMDTimeScale desiredTimeScale, + /* out */ BMDTimeValue *frameCompletionTimestamp); + + END_INTERFACE + } IDeckLinkOutput_v11_4Vtbl; + + interface IDeckLinkOutput_v11_4 + { + CONST_VTBL struct IDeckLinkOutput_v11_4Vtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IDeckLinkOutput_v11_4_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IDeckLinkOutput_v11_4_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IDeckLinkOutput_v11_4_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IDeckLinkOutput_v11_4_DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,flags,actualMode,supported) \ + ( (This)->lpVtbl -> DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,flags,actualMode,supported) ) + +#define IDeckLinkOutput_v11_4_GetDisplayMode(This,displayMode,resultDisplayMode) \ + ( (This)->lpVtbl -> GetDisplayMode(This,displayMode,resultDisplayMode) ) + +#define IDeckLinkOutput_v11_4_GetDisplayModeIterator(This,iterator) \ + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + +#define IDeckLinkOutput_v11_4_SetScreenPreviewCallback(This,previewCallback) \ + ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) + +#define IDeckLinkOutput_v11_4_EnableVideoOutput(This,displayMode,flags) \ + ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode,flags) ) + +#define IDeckLinkOutput_v11_4_DisableVideoOutput(This) \ + ( (This)->lpVtbl -> DisableVideoOutput(This) ) + +#define IDeckLinkOutput_v11_4_SetVideoOutputFrameMemoryAllocator(This,theAllocator) \ + ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) + +#define IDeckLinkOutput_v11_4_CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) \ + ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) + +#define IDeckLinkOutput_v11_4_CreateAncillaryData(This,pixelFormat,outBuffer) \ + ( (This)->lpVtbl -> CreateAncillaryData(This,pixelFormat,outBuffer) ) + +#define IDeckLinkOutput_v11_4_DisplayVideoFrameSync(This,theFrame) \ + ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) + +#define IDeckLinkOutput_v11_4_ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) \ + ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) + +#define IDeckLinkOutput_v11_4_SetScheduledFrameCompletionCallback(This,theCallback) \ + ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) + +#define IDeckLinkOutput_v11_4_GetBufferedVideoFrameCount(This,bufferedFrameCount) \ + ( (This)->lpVtbl -> GetBufferedVideoFrameCount(This,bufferedFrameCount) ) + +#define IDeckLinkOutput_v11_4_EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) \ + ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) ) + +#define IDeckLinkOutput_v11_4_DisableAudioOutput(This) \ + ( (This)->lpVtbl -> DisableAudioOutput(This) ) + +#define IDeckLinkOutput_v11_4_WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) \ + ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) + +#define IDeckLinkOutput_v11_4_BeginAudioPreroll(This) \ + ( (This)->lpVtbl -> BeginAudioPreroll(This) ) + +#define IDeckLinkOutput_v11_4_EndAudioPreroll(This) \ + ( (This)->lpVtbl -> EndAudioPreroll(This) ) + +#define IDeckLinkOutput_v11_4_ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) \ + ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) + +#define IDeckLinkOutput_v11_4_GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) \ + ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) ) + +#define IDeckLinkOutput_v11_4_FlushBufferedAudioSamples(This) \ + ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) + +#define IDeckLinkOutput_v11_4_SetAudioCallback(This,theCallback) \ + ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) + +#define IDeckLinkOutput_v11_4_StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) \ + ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) + +#define IDeckLinkOutput_v11_4_StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) \ + ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) + +#define IDeckLinkOutput_v11_4_IsScheduledPlaybackRunning(This,active) \ + ( (This)->lpVtbl -> IsScheduledPlaybackRunning(This,active) ) + +#define IDeckLinkOutput_v11_4_GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) \ + ( (This)->lpVtbl -> GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) ) + +#define IDeckLinkOutput_v11_4_GetReferenceStatus(This,referenceStatus) \ + ( (This)->lpVtbl -> GetReferenceStatus(This,referenceStatus) ) + +#define IDeckLinkOutput_v11_4_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \ + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) + +#define IDeckLinkOutput_v11_4_GetFrameCompletionReferenceTimestamp(This,theFrame,desiredTimeScale,frameCompletionTimestamp) \ + ( (This)->lpVtbl -> GetFrameCompletionReferenceTimestamp(This,theFrame,desiredTimeScale,frameCompletionTimestamp) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IDeckLinkOutput_v11_4_INTERFACE_DEFINED__ */ + + +#ifndef __IDeckLinkInput_v11_4_INTERFACE_DEFINED__ +#define __IDeckLinkInput_v11_4_INTERFACE_DEFINED__ + +/* interface IDeckLinkInput_v11_4 */ +/* helpstringuuidobject */ + + +EXTERN_C const IID IID_IDeckLinkInput_v11_4; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("2A88CF76-F494-4216-A7EF-DC74EEB83882") + IDeckLinkInput_v11_4 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + /* in */ BMDVideoConnection connection, + /* in */ BMDDisplayMode requestedMode, + /* in */ BMDPixelFormat requestedPixelFormat, + /* in */ BMDSupportedVideoModeFlags flags, + /* out */ BOOL *supported) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetDisplayMode( + /* in */ BMDDisplayMode displayMode, + /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + /* out */ IDeckLinkDisplayModeIterator **iterator) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( + /* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + + virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( + /* in */ BMDDisplayMode displayMode, + /* in */ BMDPixelFormat pixelFormat, + /* in */ BMDVideoInputFlags flags) = 0; + + virtual HRESULT STDMETHODCALLTYPE DisableVideoInput( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( + /* out */ unsigned int *availableFrameCount) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetVideoInputFrameMemoryAllocator( + /* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + + virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( + /* in */ BMDAudioSampleRate sampleRate, + /* in */ BMDAudioSampleType sampleType, + /* in */ unsigned int channelCount) = 0; + + virtual HRESULT STDMETHODCALLTYPE DisableAudioInput( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( + /* out */ unsigned int *availableSampleFrameCount) = 0; + + virtual HRESULT STDMETHODCALLTYPE StartStreams( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE StopStreams( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE PauseStreams( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE FlushStreams( void) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetCallback( + /* in */ IDeckLinkInputCallback_v11_5_1 *theCallback) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + /* in */ BMDTimeScale desiredTimeScale, + /* out */ BMDTimeValue *hardwareTime, + /* out */ BMDTimeValue *timeInFrame, + /* out */ BMDTimeValue *ticksPerFrame) = 0; + + }; + + +#else /* C style interface */ + + typedef struct IDeckLinkInput_v11_4Vtbl + { + BEGIN_INTERFACE + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IDeckLinkInput_v11_4 * This, + /* in */ REFIID riid, + /* annotationiid_isout */ + _COM_Outptr_ void **ppvObject); + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( + IDeckLinkInput_v11_4 * This); + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( + IDeckLinkInput_v11_4 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + IDeckLinkInput_v11_4 * This, + /* in */ BMDVideoConnection connection, + /* in */ BMDDisplayMode requestedMode, + /* in */ BMDPixelFormat requestedPixelFormat, + /* in */ BMDSupportedVideoModeFlags flags, + /* out */ BOOL *supported); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, GetDisplayMode) + HRESULT ( STDMETHODCALLTYPE *GetDisplayMode )( + IDeckLinkInput_v11_4 * This, + /* in */ BMDDisplayMode displayMode, + /* out */ IDeckLinkDisplayMode **resultDisplayMode); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + IDeckLinkInput_v11_4 * This, + /* out */ IDeckLinkDisplayModeIterator **iterator); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, SetScreenPreviewCallback) + HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( + IDeckLinkInput_v11_4 * This, + /* in */ IDeckLinkScreenPreviewCallback *previewCallback); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, EnableVideoInput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( + IDeckLinkInput_v11_4 * This, + /* in */ BMDDisplayMode displayMode, + /* in */ BMDPixelFormat pixelFormat, + /* in */ BMDVideoInputFlags flags); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, DisableVideoInput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( + IDeckLinkInput_v11_4 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, GetAvailableVideoFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( + IDeckLinkInput_v11_4 * This, + /* out */ unsigned int *availableFrameCount); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, SetVideoInputFrameMemoryAllocator) + HRESULT ( STDMETHODCALLTYPE *SetVideoInputFrameMemoryAllocator )( + IDeckLinkInput_v11_4 * This, + /* in */ IDeckLinkMemoryAllocator *theAllocator); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, EnableAudioInput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( + IDeckLinkInput_v11_4 * This, + /* in */ BMDAudioSampleRate sampleRate, + /* in */ BMDAudioSampleType sampleType, + /* in */ unsigned int channelCount); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, DisableAudioInput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( + IDeckLinkInput_v11_4 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, GetAvailableAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( + IDeckLinkInput_v11_4 * This, + /* out */ unsigned int *availableSampleFrameCount); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, StartStreams) + HRESULT ( STDMETHODCALLTYPE *StartStreams )( + IDeckLinkInput_v11_4 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, StopStreams) + HRESULT ( STDMETHODCALLTYPE *StopStreams )( + IDeckLinkInput_v11_4 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, PauseStreams) + HRESULT ( STDMETHODCALLTYPE *PauseStreams )( + IDeckLinkInput_v11_4 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, FlushStreams) + HRESULT ( STDMETHODCALLTYPE *FlushStreams )( + IDeckLinkInput_v11_4 * This); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( + IDeckLinkInput_v11_4 * This, + /* in */ IDeckLinkInputCallback_v11_5_1 *theCallback); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v11_4, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + IDeckLinkInput_v11_4 * This, + /* in */ BMDTimeScale desiredTimeScale, + /* out */ BMDTimeValue *hardwareTime, + /* out */ BMDTimeValue *timeInFrame, + /* out */ BMDTimeValue *ticksPerFrame); + + END_INTERFACE + } IDeckLinkInput_v11_4Vtbl; + + interface IDeckLinkInput_v11_4 + { + CONST_VTBL struct IDeckLinkInput_v11_4Vtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IDeckLinkInput_v11_4_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IDeckLinkInput_v11_4_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IDeckLinkInput_v11_4_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IDeckLinkInput_v11_4_DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,flags,supported) \ + ( (This)->lpVtbl -> DoesSupportVideoMode(This,connection,requestedMode,requestedPixelFormat,flags,supported) ) + +#define IDeckLinkInput_v11_4_GetDisplayMode(This,displayMode,resultDisplayMode) \ + ( (This)->lpVtbl -> GetDisplayMode(This,displayMode,resultDisplayMode) ) + +#define IDeckLinkInput_v11_4_GetDisplayModeIterator(This,iterator) \ + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + +#define IDeckLinkInput_v11_4_SetScreenPreviewCallback(This,previewCallback) \ + ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) + +#define IDeckLinkInput_v11_4_EnableVideoInput(This,displayMode,pixelFormat,flags) \ + ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) + +#define IDeckLinkInput_v11_4_DisableVideoInput(This) \ + ( (This)->lpVtbl -> DisableVideoInput(This) ) + +#define IDeckLinkInput_v11_4_GetAvailableVideoFrameCount(This,availableFrameCount) \ + ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) + +#define IDeckLinkInput_v11_4_SetVideoInputFrameMemoryAllocator(This,theAllocator) \ + ( (This)->lpVtbl -> SetVideoInputFrameMemoryAllocator(This,theAllocator) ) + +#define IDeckLinkInput_v11_4_EnableAudioInput(This,sampleRate,sampleType,channelCount) \ + ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) + +#define IDeckLinkInput_v11_4_DisableAudioInput(This) \ + ( (This)->lpVtbl -> DisableAudioInput(This) ) + +#define IDeckLinkInput_v11_4_GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) \ + ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) + +#define IDeckLinkInput_v11_4_StartStreams(This) \ + ( (This)->lpVtbl -> StartStreams(This) ) + +#define IDeckLinkInput_v11_4_StopStreams(This) \ + ( (This)->lpVtbl -> StopStreams(This) ) + +#define IDeckLinkInput_v11_4_PauseStreams(This) \ + ( (This)->lpVtbl -> PauseStreams(This) ) + +#define IDeckLinkInput_v11_4_FlushStreams(This) \ + ( (This)->lpVtbl -> FlushStreams(This) ) + +#define IDeckLinkInput_v11_4_SetCallback(This,theCallback) \ + ( (This)->lpVtbl -> SetCallback(This,theCallback) ) + +#define IDeckLinkInput_v11_4_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \ + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IDeckLinkInput_v11_4_INTERFACE_DEFINED__ */ + + +EXTERN_C const CLSID CLSID_CDeckLinkIterator_v10_8; + +#ifdef __cplusplus + +class DECLSPEC_UUID("1F2E109A-8F4F-49E4-9203-135595CB6FA5") +CDeckLinkIterator_v10_8; +#endif + +EXTERN_C const CLSID CLSID_CDeckLinkDiscovery_v10_8; + +#ifdef __cplusplus + +class DECLSPEC_UUID("1073A05C-D885-47E9-B3C6-129B3F9F648B") +CDeckLinkDiscovery_v10_8; +#endif + +#ifndef __IDeckLinkEncoderConfiguration_v10_5_INTERFACE_DEFINED__ +#define __IDeckLinkEncoderConfiguration_v10_5_INTERFACE_DEFINED__ + +/* interface IDeckLinkEncoderConfiguration_v10_5 */ +/* helpstringlocaluuidobject */ + + +EXTERN_C const IID IID_IDeckLinkEncoderConfiguration_v10_5; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("67455668-0848-45DF-8D8E-350A77C9A028") + IDeckLinkEncoderConfiguration_v10_5 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE SetFlag( + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* in */ BOOL value) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetFlag( + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* out */ BOOL *value) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetInt( + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* in */ LONGLONG value) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetInt( + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* out */ LONGLONG *value) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetFloat( + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* in */ double value) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetFloat( + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* out */ double *value) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetString( + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* in */ BSTR value) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetString( + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* out */ BSTR *value) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetDecoderConfigurationInfo( + /* out */ void *buffer, + /* in */ long bufferSize, + /* out */ long *returnedSize) = 0; + + }; + + +#else /* C style interface */ + + typedef struct IDeckLinkEncoderConfiguration_v10_5Vtbl + { + BEGIN_INTERFACE + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + IDeckLinkEncoderConfiguration_v10_5 * This, + /* in */ REFIID riid, + /* annotationiid_isout */ + _COM_Outptr_ void **ppvObject); + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( + IDeckLinkEncoderConfiguration_v10_5 * This); + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( + IDeckLinkEncoderConfiguration_v10_5 * This); + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration_v10_5, SetFlag) + HRESULT ( STDMETHODCALLTYPE *SetFlag )( + IDeckLinkEncoderConfiguration_v10_5 * This, + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* in */ BOOL value); + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration_v10_5, GetFlag) + HRESULT ( STDMETHODCALLTYPE *GetFlag )( + IDeckLinkEncoderConfiguration_v10_5 * This, + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* out */ BOOL *value); + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration_v10_5, SetInt) + HRESULT ( STDMETHODCALLTYPE *SetInt )( + IDeckLinkEncoderConfiguration_v10_5 * This, + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* in */ LONGLONG value); + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration_v10_5, GetInt) + HRESULT ( STDMETHODCALLTYPE *GetInt )( + IDeckLinkEncoderConfiguration_v10_5 * This, + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* out */ LONGLONG *value); + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration_v10_5, SetFloat) + HRESULT ( STDMETHODCALLTYPE *SetFloat )( + IDeckLinkEncoderConfiguration_v10_5 * This, + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* in */ double value); + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration_v10_5, GetFloat) + HRESULT ( STDMETHODCALLTYPE *GetFloat )( + IDeckLinkEncoderConfiguration_v10_5 * This, + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* out */ double *value); + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration_v10_5, SetString) + HRESULT ( STDMETHODCALLTYPE *SetString )( + IDeckLinkEncoderConfiguration_v10_5 * This, + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* in */ BSTR value); + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration_v10_5, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( + IDeckLinkEncoderConfiguration_v10_5 * This, + /* in */ BMDDeckLinkEncoderConfigurationID cfgID, + /* out */ BSTR *value); + + DECLSPEC_XFGVIRT(IDeckLinkEncoderConfiguration_v10_5, GetDecoderConfigurationInfo) + HRESULT ( STDMETHODCALLTYPE *GetDecoderConfigurationInfo )( + IDeckLinkEncoderConfiguration_v10_5 * This, + /* out */ void *buffer, + /* in */ long bufferSize, + /* out */ long *returnedSize); + + END_INTERFACE + } IDeckLinkEncoderConfiguration_v10_5Vtbl; + + interface IDeckLinkEncoderConfiguration_v10_5 + { + CONST_VTBL struct IDeckLinkEncoderConfiguration_v10_5Vtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IDeckLinkEncoderConfiguration_v10_5_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define IDeckLinkEncoderConfiguration_v10_5_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define IDeckLinkEncoderConfiguration_v10_5_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define IDeckLinkEncoderConfiguration_v10_5_SetFlag(This,cfgID,value) \ + ( (This)->lpVtbl -> SetFlag(This,cfgID,value) ) + +#define IDeckLinkEncoderConfiguration_v10_5_GetFlag(This,cfgID,value) \ + ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) + +#define IDeckLinkEncoderConfiguration_v10_5_SetInt(This,cfgID,value) \ + ( (This)->lpVtbl -> SetInt(This,cfgID,value) ) + +#define IDeckLinkEncoderConfiguration_v10_5_GetInt(This,cfgID,value) \ + ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) + +#define IDeckLinkEncoderConfiguration_v10_5_SetFloat(This,cfgID,value) \ + ( (This)->lpVtbl -> SetFloat(This,cfgID,value) ) + +#define IDeckLinkEncoderConfiguration_v10_5_GetFloat(This,cfgID,value) \ + ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) + +#define IDeckLinkEncoderConfiguration_v10_5_SetString(This,cfgID,value) \ + ( (This)->lpVtbl -> SetString(This,cfgID,value) ) + +#define IDeckLinkEncoderConfiguration_v10_5_GetString(This,cfgID,value) \ + ( (This)->lpVtbl -> GetString(This,cfgID,value) ) + +#define IDeckLinkEncoderConfiguration_v10_5_GetDecoderConfigurationInfo(This,buffer,bufferSize,returnedSize) \ + ( (This)->lpVtbl -> GetDecoderConfigurationInfo(This,buffer,bufferSize,returnedSize) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __IDeckLinkEncoderConfiguration_v10_5_INTERFACE_DEFINED__ */ + + #ifndef __IDeckLinkOutput_v9_9_INTERFACE_DEFINED__ #define __IDeckLinkOutput_v9_9_INTERFACE_DEFINED__ /* interface IDeckLinkOutput_v9_9 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkOutput_v9_9; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("A3EF0963-0862-44ED-92A9-EE89ABF431C7") IDeckLinkOutput_v9_9 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoOutputFlags flags, /* out */ BMDDisplayModeSupport_v10_11 *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( /* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( /* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoOutput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( + + virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( /* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( + + virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( /* in */ int width, /* in */ int height, /* in */ int rowBytes, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame **outFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateAncillaryData( + + virtual HRESULT STDMETHODCALLTYPE CreateAncillaryData( /* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( + + virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( /* in */ IDeckLinkVideoFrame *theFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( + + virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( /* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( /* in */ IDeckLinkVideoOutputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferedVideoFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetBufferedVideoFrameCount( /* out */ unsigned int *bufferedFrameCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount, /* in */ BMDAudioOutputStreamType streamType) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioOutput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( + + virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( /* in */ void *buffer, /* in */ unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesWritten) = 0; - + virtual HRESULT STDMETHODCALLTYPE BeginAudioPreroll( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE EndAudioPreroll( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( + + virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( /* in */ void *buffer, /* in */ unsigned int sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ unsigned int *sampleFramesWritten) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( /* out */ unsigned int *bufferedSampleFrameCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE FlushBufferedAudioSamples( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( + + virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( /* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( + + virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( /* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed) = 0; - - virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( + + virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( /* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsScheduledPlaybackRunning( + + virtual HRESULT STDMETHODCALLTYPE IsScheduledPlaybackRunning( /* out */ BOOL *active) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetScheduledStreamTime( + + virtual HRESULT STDMETHODCALLTYPE GetScheduledStreamTime( /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetReferenceStatus( + + virtual HRESULT STDMETHODCALLTYPE GetReferenceStatus( /* out */ BMDReferenceStatus *referenceStatus) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkOutput_v9_9Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkOutput_v9_9 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkOutput_v9_9 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkOutput_v9_9 * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkOutput_v9_9 * This, /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoOutputFlags flags, /* out */ BMDDisplayModeSupport_v10_11 *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkOutput_v9_9 * This, /* out */ IDeckLinkDisplayModeIterator **iterator); - - HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, SetScreenPreviewCallback) + HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( IDeckLinkOutput_v9_9 * This, /* in */ IDeckLinkScreenPreviewCallback *previewCallback); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, EnableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( IDeckLinkOutput_v9_9 * This, /* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, DisableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( IDeckLinkOutput_v9_9 * This); - - HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, SetVideoOutputFrameMemoryAllocator) + HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( IDeckLinkOutput_v9_9 * This, /* in */ IDeckLinkMemoryAllocator *theAllocator); - - HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, CreateVideoFrame) + HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( IDeckLinkOutput_v9_9 * This, /* in */ int width, /* in */ int height, @@ -12097,105 +14092,125 @@ /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame **outFrame); - - HRESULT ( STDMETHODCALLTYPE *CreateAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, CreateAncillaryData) + HRESULT ( STDMETHODCALLTYPE *CreateAncillaryData )( IDeckLinkOutput_v9_9 * This, /* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer); - - HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, DisplayVideoFrameSync) + HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( IDeckLinkOutput_v9_9 * This, /* in */ IDeckLinkVideoFrame *theFrame); - - HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, ScheduleVideoFrame) + HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( IDeckLinkOutput_v9_9 * This, /* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, SetScheduledFrameCompletionCallback) + HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( IDeckLinkOutput_v9_9 * This, /* in */ IDeckLinkVideoOutputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *GetBufferedVideoFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, GetBufferedVideoFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedVideoFrameCount )( IDeckLinkOutput_v9_9 * This, /* out */ unsigned int *bufferedFrameCount); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, EnableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( IDeckLinkOutput_v9_9 * This, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount, /* in */ BMDAudioOutputStreamType streamType); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, DisableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( IDeckLinkOutput_v9_9 * This); - - HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, WriteAudioSamplesSync) + HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( IDeckLinkOutput_v9_9 * This, /* in */ void *buffer, /* in */ unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesWritten); - - HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, BeginAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( IDeckLinkOutput_v9_9 * This); - - HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, EndAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( IDeckLinkOutput_v9_9 * This); - - HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, ScheduleAudioSamples) + HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( IDeckLinkOutput_v9_9 * This, /* in */ void *buffer, /* in */ unsigned int sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ unsigned int *sampleFramesWritten); - - HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, GetBufferedAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( IDeckLinkOutput_v9_9 * This, /* out */ unsigned int *bufferedSampleFrameCount); - - HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, FlushBufferedAudioSamples) + HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( IDeckLinkOutput_v9_9 * This); - - HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, SetAudioCallback) + HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( IDeckLinkOutput_v9_9 * This, /* in */ IDeckLinkAudioOutputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, StartScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( IDeckLinkOutput_v9_9 * This, /* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed); - - HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, StopScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( IDeckLinkOutput_v9_9 * This, /* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *IsScheduledPlaybackRunning )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, IsScheduledPlaybackRunning) + HRESULT ( STDMETHODCALLTYPE *IsScheduledPlaybackRunning )( IDeckLinkOutput_v9_9 * This, /* out */ BOOL *active); - - HRESULT ( STDMETHODCALLTYPE *GetScheduledStreamTime )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, GetScheduledStreamTime) + HRESULT ( STDMETHODCALLTYPE *GetScheduledStreamTime )( IDeckLinkOutput_v9_9 * This, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed); - - HRESULT ( STDMETHODCALLTYPE *GetReferenceStatus )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, GetReferenceStatus) + HRESULT ( STDMETHODCALLTYPE *GetReferenceStatus )( IDeckLinkOutput_v9_9 * This, /* out */ BMDReferenceStatus *referenceStatus); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v9_9, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( IDeckLinkOutput_v9_9 * This, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame); - + END_INTERFACE } IDeckLinkOutput_v9_9Vtbl; @@ -12204,101 +14219,101 @@ CONST_VTBL struct IDeckLinkOutput_v9_9Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkOutput_v9_9_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkOutput_v9_9_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkOutput_v9_9_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkOutput_v9_9_DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) ) + ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) ) #define IDeckLinkOutput_v9_9_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkOutput_v9_9_SetScreenPreviewCallback(This,previewCallback) \ - ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) + ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) #define IDeckLinkOutput_v9_9_EnableVideoOutput(This,displayMode,flags) \ - ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode,flags) ) + ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode,flags) ) #define IDeckLinkOutput_v9_9_DisableVideoOutput(This) \ - ( (This)->lpVtbl -> DisableVideoOutput(This) ) + ( (This)->lpVtbl -> DisableVideoOutput(This) ) #define IDeckLinkOutput_v9_9_SetVideoOutputFrameMemoryAllocator(This,theAllocator) \ - ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) + ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) #define IDeckLinkOutput_v9_9_CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) \ - ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) + ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) #define IDeckLinkOutput_v9_9_CreateAncillaryData(This,pixelFormat,outBuffer) \ - ( (This)->lpVtbl -> CreateAncillaryData(This,pixelFormat,outBuffer) ) + ( (This)->lpVtbl -> CreateAncillaryData(This,pixelFormat,outBuffer) ) #define IDeckLinkOutput_v9_9_DisplayVideoFrameSync(This,theFrame) \ - ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) + ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) #define IDeckLinkOutput_v9_9_ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) \ - ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) + ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) #define IDeckLinkOutput_v9_9_SetScheduledFrameCompletionCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) #define IDeckLinkOutput_v9_9_GetBufferedVideoFrameCount(This,bufferedFrameCount) \ - ( (This)->lpVtbl -> GetBufferedVideoFrameCount(This,bufferedFrameCount) ) + ( (This)->lpVtbl -> GetBufferedVideoFrameCount(This,bufferedFrameCount) ) #define IDeckLinkOutput_v9_9_EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) \ - ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) ) + ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) ) #define IDeckLinkOutput_v9_9_DisableAudioOutput(This) \ - ( (This)->lpVtbl -> DisableAudioOutput(This) ) + ( (This)->lpVtbl -> DisableAudioOutput(This) ) #define IDeckLinkOutput_v9_9_WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) \ - ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) + ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) #define IDeckLinkOutput_v9_9_BeginAudioPreroll(This) \ - ( (This)->lpVtbl -> BeginAudioPreroll(This) ) + ( (This)->lpVtbl -> BeginAudioPreroll(This) ) #define IDeckLinkOutput_v9_9_EndAudioPreroll(This) \ - ( (This)->lpVtbl -> EndAudioPreroll(This) ) + ( (This)->lpVtbl -> EndAudioPreroll(This) ) #define IDeckLinkOutput_v9_9_ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) \ - ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) + ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) #define IDeckLinkOutput_v9_9_GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) \ - ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) ) + ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) ) #define IDeckLinkOutput_v9_9_FlushBufferedAudioSamples(This) \ - ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) + ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) #define IDeckLinkOutput_v9_9_SetAudioCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) #define IDeckLinkOutput_v9_9_StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) \ - ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) + ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) #define IDeckLinkOutput_v9_9_StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) \ - ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) + ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) #define IDeckLinkOutput_v9_9_IsScheduledPlaybackRunning(This,active) \ - ( (This)->lpVtbl -> IsScheduledPlaybackRunning(This,active) ) + ( (This)->lpVtbl -> IsScheduledPlaybackRunning(This,active) ) #define IDeckLinkOutput_v9_9_GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) \ - ( (This)->lpVtbl -> GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) ) + ( (This)->lpVtbl -> GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) ) #define IDeckLinkOutput_v9_9_GetReferenceStatus(This,referenceStatus) \ - ( (This)->lpVtbl -> GetReferenceStatus(This,referenceStatus) ) + ( (This)->lpVtbl -> GetReferenceStatus(This,referenceStatus) ) #define IDeckLinkOutput_v9_9_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \ - ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) #endif /* COBJMACROS */ @@ -12315,153 +14330,171 @@ #define __IDeckLinkInput_v9_2_INTERFACE_DEFINED__ /* interface IDeckLinkInput_v9_2 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkInput_v9_2; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("6D40EF78-28B9-4E21-990D-95BB7750A04F") IDeckLinkInput_v9_2 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport_v10_11 *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( /* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( /* out */ unsigned int *availableFrameCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( /* out */ unsigned int *availableSampleFrameCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE StartStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE StopStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE PauseStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE FlushStreams( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( - /* in */ IDeckLinkInputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + + virtual HRESULT STDMETHODCALLTYPE SetCallback( + /* in */ IDeckLinkInputCallback_v11_5_1 *theCallback) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkInput_v9_2Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkInput_v9_2 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkInput_v9_2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkInput_v9_2 * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkInput_v9_2 * This, /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport_v10_11 *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkInput_v9_2 * This, /* out */ IDeckLinkDisplayModeIterator **iterator); - - HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, SetScreenPreviewCallback) + HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( IDeckLinkInput_v9_2 * This, /* in */ IDeckLinkScreenPreviewCallback *previewCallback); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, EnableVideoInput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( IDeckLinkInput_v9_2 * This, /* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, DisableVideoInput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( IDeckLinkInput_v9_2 * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, GetAvailableVideoFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( IDeckLinkInput_v9_2 * This, /* out */ unsigned int *availableFrameCount); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, EnableAudioInput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( IDeckLinkInput_v9_2 * This, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ unsigned int channelCount); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, DisableAudioInput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( IDeckLinkInput_v9_2 * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, GetAvailableAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( IDeckLinkInput_v9_2 * This, /* out */ unsigned int *availableSampleFrameCount); - - HRESULT ( STDMETHODCALLTYPE *StartStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, StartStreams) + HRESULT ( STDMETHODCALLTYPE *StartStreams )( IDeckLinkInput_v9_2 * This); - - HRESULT ( STDMETHODCALLTYPE *StopStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, StopStreams) + HRESULT ( STDMETHODCALLTYPE *StopStreams )( IDeckLinkInput_v9_2 * This); - - HRESULT ( STDMETHODCALLTYPE *PauseStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, PauseStreams) + HRESULT ( STDMETHODCALLTYPE *PauseStreams )( IDeckLinkInput_v9_2 * This); - - HRESULT ( STDMETHODCALLTYPE *FlushStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, FlushStreams) + HRESULT ( STDMETHODCALLTYPE *FlushStreams )( IDeckLinkInput_v9_2 * This); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( IDeckLinkInput_v9_2 * This, - /* in */ IDeckLinkInputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + /* in */ IDeckLinkInputCallback_v11_5_1 *theCallback); + + DECLSPEC_XFGVIRT(IDeckLinkInput_v9_2, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( IDeckLinkInput_v9_2 * This, /* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame); - + END_INTERFACE } IDeckLinkInput_v9_2Vtbl; @@ -12470,65 +14503,65 @@ CONST_VTBL struct IDeckLinkInput_v9_2Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkInput_v9_2_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkInput_v9_2_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkInput_v9_2_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkInput_v9_2_DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) ) + ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,flags,result,resultDisplayMode) ) #define IDeckLinkInput_v9_2_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkInput_v9_2_SetScreenPreviewCallback(This,previewCallback) \ - ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) + ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) #define IDeckLinkInput_v9_2_EnableVideoInput(This,displayMode,pixelFormat,flags) \ - ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) + ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) #define IDeckLinkInput_v9_2_DisableVideoInput(This) \ - ( (This)->lpVtbl -> DisableVideoInput(This) ) + ( (This)->lpVtbl -> DisableVideoInput(This) ) #define IDeckLinkInput_v9_2_GetAvailableVideoFrameCount(This,availableFrameCount) \ - ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) + ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) #define IDeckLinkInput_v9_2_EnableAudioInput(This,sampleRate,sampleType,channelCount) \ - ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) + ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) #define IDeckLinkInput_v9_2_DisableAudioInput(This) \ - ( (This)->lpVtbl -> DisableAudioInput(This) ) + ( (This)->lpVtbl -> DisableAudioInput(This) ) #define IDeckLinkInput_v9_2_GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) \ - ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) + ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) #define IDeckLinkInput_v9_2_StartStreams(This) \ - ( (This)->lpVtbl -> StartStreams(This) ) + ( (This)->lpVtbl -> StartStreams(This) ) #define IDeckLinkInput_v9_2_StopStreams(This) \ - ( (This)->lpVtbl -> StopStreams(This) ) + ( (This)->lpVtbl -> StopStreams(This) ) #define IDeckLinkInput_v9_2_PauseStreams(This) \ - ( (This)->lpVtbl -> PauseStreams(This) ) + ( (This)->lpVtbl -> PauseStreams(This) ) #define IDeckLinkInput_v9_2_FlushStreams(This) \ - ( (This)->lpVtbl -> FlushStreams(This) ) + ( (This)->lpVtbl -> FlushStreams(This) ) #define IDeckLinkInput_v9_2_SetCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetCallback(This,theCallback) ) #define IDeckLinkInput_v9_2_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \ - ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) #endif /* COBJMACROS */ @@ -12545,72 +14578,79 @@ #define __IDeckLinkDeckControlStatusCallback_v8_1_INTERFACE_DEFINED__ /* interface IDeckLinkDeckControlStatusCallback_v8_1 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkDeckControlStatusCallback_v8_1; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("E5F693C1-4283-4716-B18F-C1431521955B") IDeckLinkDeckControlStatusCallback_v8_1 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE TimecodeUpdate( + virtual HRESULT STDMETHODCALLTYPE TimecodeUpdate( /* in */ BMDTimecodeBCD currentTimecode) = 0; - - virtual HRESULT STDMETHODCALLTYPE VTRControlStateChanged( + + virtual HRESULT STDMETHODCALLTYPE VTRControlStateChanged( /* in */ BMDDeckControlVTRControlState_v8_1 newState, /* in */ BMDDeckControlError error) = 0; - - virtual HRESULT STDMETHODCALLTYPE DeckControlEventReceived( + + virtual HRESULT STDMETHODCALLTYPE DeckControlEventReceived( /* in */ BMDDeckControlEvent event, /* in */ BMDDeckControlError error) = 0; - - virtual HRESULT STDMETHODCALLTYPE DeckControlStatusChanged( + + virtual HRESULT STDMETHODCALLTYPE DeckControlStatusChanged( /* in */ BMDDeckControlStatusFlags flags, /* in */ unsigned int mask) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDeckControlStatusCallback_v8_1Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDeckControlStatusCallback_v8_1 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDeckControlStatusCallback_v8_1 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDeckControlStatusCallback_v8_1 * This); - - HRESULT ( STDMETHODCALLTYPE *TimecodeUpdate )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControlStatusCallback_v8_1, TimecodeUpdate) + HRESULT ( STDMETHODCALLTYPE *TimecodeUpdate )( IDeckLinkDeckControlStatusCallback_v8_1 * This, /* in */ BMDTimecodeBCD currentTimecode); - - HRESULT ( STDMETHODCALLTYPE *VTRControlStateChanged )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControlStatusCallback_v8_1, VTRControlStateChanged) + HRESULT ( STDMETHODCALLTYPE *VTRControlStateChanged )( IDeckLinkDeckControlStatusCallback_v8_1 * This, /* in */ BMDDeckControlVTRControlState_v8_1 newState, /* in */ BMDDeckControlError error); - - HRESULT ( STDMETHODCALLTYPE *DeckControlEventReceived )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControlStatusCallback_v8_1, DeckControlEventReceived) + HRESULT ( STDMETHODCALLTYPE *DeckControlEventReceived )( IDeckLinkDeckControlStatusCallback_v8_1 * This, /* in */ BMDDeckControlEvent event, /* in */ BMDDeckControlError error); - - HRESULT ( STDMETHODCALLTYPE *DeckControlStatusChanged )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControlStatusCallback_v8_1, DeckControlStatusChanged) + HRESULT ( STDMETHODCALLTYPE *DeckControlStatusChanged )( IDeckLinkDeckControlStatusCallback_v8_1 * This, /* in */ BMDDeckControlStatusFlags flags, /* in */ unsigned int mask); - + END_INTERFACE } IDeckLinkDeckControlStatusCallback_v8_1Vtbl; @@ -12619,32 +14659,32 @@ CONST_VTBL struct IDeckLinkDeckControlStatusCallback_v8_1Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDeckControlStatusCallback_v8_1_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDeckControlStatusCallback_v8_1_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDeckControlStatusCallback_v8_1_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDeckControlStatusCallback_v8_1_TimecodeUpdate(This,currentTimecode) \ - ( (This)->lpVtbl -> TimecodeUpdate(This,currentTimecode) ) + ( (This)->lpVtbl -> TimecodeUpdate(This,currentTimecode) ) #define IDeckLinkDeckControlStatusCallback_v8_1_VTRControlStateChanged(This,newState,error) \ - ( (This)->lpVtbl -> VTRControlStateChanged(This,newState,error) ) + ( (This)->lpVtbl -> VTRControlStateChanged(This,newState,error) ) #define IDeckLinkDeckControlStatusCallback_v8_1_DeckControlEventReceived(This,event,error) \ - ( (This)->lpVtbl -> DeckControlEventReceived(This,event,error) ) + ( (This)->lpVtbl -> DeckControlEventReceived(This,event,error) ) #define IDeckLinkDeckControlStatusCallback_v8_1_DeckControlStatusChanged(This,flags,mask) \ - ( (This)->lpVtbl -> DeckControlStatusChanged(This,flags,mask) ) + ( (This)->lpVtbl -> DeckControlStatusChanged(This,flags,mask) ) #endif /* COBJMACROS */ @@ -12661,183 +14701,191 @@ #define __IDeckLinkDeckControl_v8_1_INTERFACE_DEFINED__ /* interface IDeckLinkDeckControl_v8_1 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkDeckControl_v8_1; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("522A9E39-0F3C-4742-94EE-D80DE335DA1D") IDeckLinkDeckControl_v8_1 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Open( + virtual HRESULT STDMETHODCALLTYPE Open( /* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ BOOL timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Close( + + virtual HRESULT STDMETHODCALLTYPE Close( /* in */ BOOL standbyOn) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentState( + + virtual HRESULT STDMETHODCALLTYPE GetCurrentState( /* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState_v8_1 *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetStandby( + + virtual HRESULT STDMETHODCALLTYPE SetStandby( /* in */ BOOL standbyOn) = 0; - - virtual HRESULT STDMETHODCALLTYPE SendCommand( + + virtual HRESULT STDMETHODCALLTYPE SendCommand( /* in */ unsigned char *inBuffer, /* in */ unsigned int inBufferSize, /* out */ unsigned char *outBuffer, /* out */ unsigned int *outDataSize, /* in */ unsigned int outBufferSize, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Play( + + virtual HRESULT STDMETHODCALLTYPE Play( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Stop( + + virtual HRESULT STDMETHODCALLTYPE Stop( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE TogglePlayStop( + + virtual HRESULT STDMETHODCALLTYPE TogglePlayStop( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Eject( + + virtual HRESULT STDMETHODCALLTYPE Eject( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GoToTimecode( + + virtual HRESULT STDMETHODCALLTYPE GoToTimecode( /* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE FastForward( + + virtual HRESULT STDMETHODCALLTYPE FastForward( /* in */ BOOL viewTape, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Rewind( + + virtual HRESULT STDMETHODCALLTYPE Rewind( /* in */ BOOL viewTape, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE StepForward( + + virtual HRESULT STDMETHODCALLTYPE StepForward( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE StepBack( + + virtual HRESULT STDMETHODCALLTYPE StepBack( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Jog( + + virtual HRESULT STDMETHODCALLTYPE Jog( /* in */ double rate, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Shuttle( + + virtual HRESULT STDMETHODCALLTYPE Shuttle( /* in */ double rate, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecodeString( + + virtual HRESULT STDMETHODCALLTYPE GetTimecodeString( /* out */ BSTR *currentTimeCode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecode( + + virtual HRESULT STDMETHODCALLTYPE GetTimecode( /* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecodeBCD( + + virtual HRESULT STDMETHODCALLTYPE GetTimecodeBCD( /* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetPreroll( + + virtual HRESULT STDMETHODCALLTYPE SetPreroll( /* in */ unsigned int prerollSeconds) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPreroll( + + virtual HRESULT STDMETHODCALLTYPE GetPreroll( /* out */ unsigned int *prerollSeconds) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetExportOffset( + + virtual HRESULT STDMETHODCALLTYPE SetExportOffset( /* in */ int exportOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetExportOffset( + + virtual HRESULT STDMETHODCALLTYPE GetExportOffset( /* out */ int *exportOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetManualExportOffset( + + virtual HRESULT STDMETHODCALLTYPE GetManualExportOffset( /* out */ int *deckManualExportOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCaptureOffset( + + virtual HRESULT STDMETHODCALLTYPE SetCaptureOffset( /* in */ int captureOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCaptureOffset( + + virtual HRESULT STDMETHODCALLTYPE GetCaptureOffset( /* out */ int *captureOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE StartExport( + + virtual HRESULT STDMETHODCALLTYPE StartExport( /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE StartCapture( + + virtual HRESULT STDMETHODCALLTYPE StartCapture( /* in */ BOOL useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDeviceID( + + virtual HRESULT STDMETHODCALLTYPE GetDeviceID( /* out */ unsigned short *deviceId, /* out */ BMDDeckControlError *error) = 0; - + virtual HRESULT STDMETHODCALLTYPE Abort( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE CrashRecordStart( + + virtual HRESULT STDMETHODCALLTYPE CrashRecordStart( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE CrashRecordStop( + + virtual HRESULT STDMETHODCALLTYPE CrashRecordStop( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( + + virtual HRESULT STDMETHODCALLTYPE SetCallback( /* in */ IDeckLinkDeckControlStatusCallback_v8_1 *callback) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDeckControl_v8_1Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDeckControl_v8_1 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDeckControl_v8_1 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDeckControl_v8_1 * This); - - HRESULT ( STDMETHODCALLTYPE *Open )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, Open) + HRESULT ( STDMETHODCALLTYPE *Open )( IDeckLinkDeckControl_v8_1 * This, /* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ BOOL timecodeIsDropFrame, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Close )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, Close) + HRESULT ( STDMETHODCALLTYPE *Close )( IDeckLinkDeckControl_v8_1 * This, /* in */ BOOL standbyOn); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentState )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, GetCurrentState) + HRESULT ( STDMETHODCALLTYPE *GetCurrentState )( IDeckLinkDeckControl_v8_1 * This, /* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState_v8_1 *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags); - - HRESULT ( STDMETHODCALLTYPE *SetStandby )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, SetStandby) + HRESULT ( STDMETHODCALLTYPE *SetStandby )( IDeckLinkDeckControl_v8_1 * This, /* in */ BOOL standbyOn); - - HRESULT ( STDMETHODCALLTYPE *SendCommand )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, SendCommand) + HRESULT ( STDMETHODCALLTYPE *SendCommand )( IDeckLinkDeckControl_v8_1 * This, /* in */ unsigned char *inBuffer, /* in */ unsigned int inBufferSize, @@ -12845,133 +14893,161 @@ /* out */ unsigned int *outDataSize, /* in */ unsigned int outBufferSize, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Play )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, Play) + HRESULT ( STDMETHODCALLTYPE *Play )( IDeckLinkDeckControl_v8_1 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Stop )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, Stop) + HRESULT ( STDMETHODCALLTYPE *Stop )( IDeckLinkDeckControl_v8_1 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *TogglePlayStop )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, TogglePlayStop) + HRESULT ( STDMETHODCALLTYPE *TogglePlayStop )( IDeckLinkDeckControl_v8_1 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Eject )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, Eject) + HRESULT ( STDMETHODCALLTYPE *Eject )( IDeckLinkDeckControl_v8_1 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GoToTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, GoToTimecode) + HRESULT ( STDMETHODCALLTYPE *GoToTimecode )( IDeckLinkDeckControl_v8_1 * This, /* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *FastForward )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, FastForward) + HRESULT ( STDMETHODCALLTYPE *FastForward )( IDeckLinkDeckControl_v8_1 * This, /* in */ BOOL viewTape, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Rewind )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, Rewind) + HRESULT ( STDMETHODCALLTYPE *Rewind )( IDeckLinkDeckControl_v8_1 * This, /* in */ BOOL viewTape, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *StepForward )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, StepForward) + HRESULT ( STDMETHODCALLTYPE *StepForward )( IDeckLinkDeckControl_v8_1 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *StepBack )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, StepBack) + HRESULT ( STDMETHODCALLTYPE *StepBack )( IDeckLinkDeckControl_v8_1 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Jog )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, Jog) + HRESULT ( STDMETHODCALLTYPE *Jog )( IDeckLinkDeckControl_v8_1 * This, /* in */ double rate, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Shuttle )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, Shuttle) + HRESULT ( STDMETHODCALLTYPE *Shuttle )( IDeckLinkDeckControl_v8_1 * This, /* in */ double rate, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GetTimecodeString )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, GetTimecodeString) + HRESULT ( STDMETHODCALLTYPE *GetTimecodeString )( IDeckLinkDeckControl_v8_1 * This, /* out */ BSTR *currentTimeCode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, GetTimecode) + HRESULT ( STDMETHODCALLTYPE *GetTimecode )( IDeckLinkDeckControl_v8_1 * This, /* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GetTimecodeBCD )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, GetTimecodeBCD) + HRESULT ( STDMETHODCALLTYPE *GetTimecodeBCD )( IDeckLinkDeckControl_v8_1 * This, /* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *SetPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, SetPreroll) + HRESULT ( STDMETHODCALLTYPE *SetPreroll )( IDeckLinkDeckControl_v8_1 * This, /* in */ unsigned int prerollSeconds); - - HRESULT ( STDMETHODCALLTYPE *GetPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, GetPreroll) + HRESULT ( STDMETHODCALLTYPE *GetPreroll )( IDeckLinkDeckControl_v8_1 * This, /* out */ unsigned int *prerollSeconds); - - HRESULT ( STDMETHODCALLTYPE *SetExportOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, SetExportOffset) + HRESULT ( STDMETHODCALLTYPE *SetExportOffset )( IDeckLinkDeckControl_v8_1 * This, /* in */ int exportOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *GetExportOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, GetExportOffset) + HRESULT ( STDMETHODCALLTYPE *GetExportOffset )( IDeckLinkDeckControl_v8_1 * This, /* out */ int *exportOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *GetManualExportOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, GetManualExportOffset) + HRESULT ( STDMETHODCALLTYPE *GetManualExportOffset )( IDeckLinkDeckControl_v8_1 * This, /* out */ int *deckManualExportOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *SetCaptureOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, SetCaptureOffset) + HRESULT ( STDMETHODCALLTYPE *SetCaptureOffset )( IDeckLinkDeckControl_v8_1 * This, /* in */ int captureOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *GetCaptureOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, GetCaptureOffset) + HRESULT ( STDMETHODCALLTYPE *GetCaptureOffset )( IDeckLinkDeckControl_v8_1 * This, /* out */ int *captureOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *StartExport )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, StartExport) + HRESULT ( STDMETHODCALLTYPE *StartExport )( IDeckLinkDeckControl_v8_1 * This, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *StartCapture )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, StartCapture) + HRESULT ( STDMETHODCALLTYPE *StartCapture )( IDeckLinkDeckControl_v8_1 * This, /* in */ BOOL useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GetDeviceID )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, GetDeviceID) + HRESULT ( STDMETHODCALLTYPE *GetDeviceID )( IDeckLinkDeckControl_v8_1 * This, /* out */ unsigned short *deviceId, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Abort )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, Abort) + HRESULT ( STDMETHODCALLTYPE *Abort )( IDeckLinkDeckControl_v8_1 * This); - - HRESULT ( STDMETHODCALLTYPE *CrashRecordStart )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, CrashRecordStart) + HRESULT ( STDMETHODCALLTYPE *CrashRecordStart )( IDeckLinkDeckControl_v8_1 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *CrashRecordStop )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, CrashRecordStop) + HRESULT ( STDMETHODCALLTYPE *CrashRecordStop )( IDeckLinkDeckControl_v8_1 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v8_1, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( IDeckLinkDeckControl_v8_1 * This, /* in */ IDeckLinkDeckControlStatusCallback_v8_1 *callback); - + END_INTERFACE } IDeckLinkDeckControl_v8_1Vtbl; @@ -12980,119 +15056,119 @@ CONST_VTBL struct IDeckLinkDeckControl_v8_1Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDeckControl_v8_1_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDeckControl_v8_1_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDeckControl_v8_1_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDeckControl_v8_1_Open(This,timeScale,timeValue,timecodeIsDropFrame,error) \ - ( (This)->lpVtbl -> Open(This,timeScale,timeValue,timecodeIsDropFrame,error) ) + ( (This)->lpVtbl -> Open(This,timeScale,timeValue,timecodeIsDropFrame,error) ) #define IDeckLinkDeckControl_v8_1_Close(This,standbyOn) \ - ( (This)->lpVtbl -> Close(This,standbyOn) ) + ( (This)->lpVtbl -> Close(This,standbyOn) ) #define IDeckLinkDeckControl_v8_1_GetCurrentState(This,mode,vtrControlState,flags) \ - ( (This)->lpVtbl -> GetCurrentState(This,mode,vtrControlState,flags) ) + ( (This)->lpVtbl -> GetCurrentState(This,mode,vtrControlState,flags) ) #define IDeckLinkDeckControl_v8_1_SetStandby(This,standbyOn) \ - ( (This)->lpVtbl -> SetStandby(This,standbyOn) ) + ( (This)->lpVtbl -> SetStandby(This,standbyOn) ) #define IDeckLinkDeckControl_v8_1_SendCommand(This,inBuffer,inBufferSize,outBuffer,outDataSize,outBufferSize,error) \ - ( (This)->lpVtbl -> SendCommand(This,inBuffer,inBufferSize,outBuffer,outDataSize,outBufferSize,error) ) + ( (This)->lpVtbl -> SendCommand(This,inBuffer,inBufferSize,outBuffer,outDataSize,outBufferSize,error) ) #define IDeckLinkDeckControl_v8_1_Play(This,error) \ - ( (This)->lpVtbl -> Play(This,error) ) + ( (This)->lpVtbl -> Play(This,error) ) #define IDeckLinkDeckControl_v8_1_Stop(This,error) \ - ( (This)->lpVtbl -> Stop(This,error) ) + ( (This)->lpVtbl -> Stop(This,error) ) #define IDeckLinkDeckControl_v8_1_TogglePlayStop(This,error) \ - ( (This)->lpVtbl -> TogglePlayStop(This,error) ) + ( (This)->lpVtbl -> TogglePlayStop(This,error) ) #define IDeckLinkDeckControl_v8_1_Eject(This,error) \ - ( (This)->lpVtbl -> Eject(This,error) ) + ( (This)->lpVtbl -> Eject(This,error) ) #define IDeckLinkDeckControl_v8_1_GoToTimecode(This,timecode,error) \ - ( (This)->lpVtbl -> GoToTimecode(This,timecode,error) ) + ( (This)->lpVtbl -> GoToTimecode(This,timecode,error) ) #define IDeckLinkDeckControl_v8_1_FastForward(This,viewTape,error) \ - ( (This)->lpVtbl -> FastForward(This,viewTape,error) ) + ( (This)->lpVtbl -> FastForward(This,viewTape,error) ) #define IDeckLinkDeckControl_v8_1_Rewind(This,viewTape,error) \ - ( (This)->lpVtbl -> Rewind(This,viewTape,error) ) + ( (This)->lpVtbl -> Rewind(This,viewTape,error) ) #define IDeckLinkDeckControl_v8_1_StepForward(This,error) \ - ( (This)->lpVtbl -> StepForward(This,error) ) + ( (This)->lpVtbl -> StepForward(This,error) ) #define IDeckLinkDeckControl_v8_1_StepBack(This,error) \ - ( (This)->lpVtbl -> StepBack(This,error) ) + ( (This)->lpVtbl -> StepBack(This,error) ) #define IDeckLinkDeckControl_v8_1_Jog(This,rate,error) \ - ( (This)->lpVtbl -> Jog(This,rate,error) ) + ( (This)->lpVtbl -> Jog(This,rate,error) ) #define IDeckLinkDeckControl_v8_1_Shuttle(This,rate,error) \ - ( (This)->lpVtbl -> Shuttle(This,rate,error) ) + ( (This)->lpVtbl -> Shuttle(This,rate,error) ) #define IDeckLinkDeckControl_v8_1_GetTimecodeString(This,currentTimeCode,error) \ - ( (This)->lpVtbl -> GetTimecodeString(This,currentTimeCode,error) ) + ( (This)->lpVtbl -> GetTimecodeString(This,currentTimeCode,error) ) #define IDeckLinkDeckControl_v8_1_GetTimecode(This,currentTimecode,error) \ - ( (This)->lpVtbl -> GetTimecode(This,currentTimecode,error) ) + ( (This)->lpVtbl -> GetTimecode(This,currentTimecode,error) ) #define IDeckLinkDeckControl_v8_1_GetTimecodeBCD(This,currentTimecode,error) \ - ( (This)->lpVtbl -> GetTimecodeBCD(This,currentTimecode,error) ) + ( (This)->lpVtbl -> GetTimecodeBCD(This,currentTimecode,error) ) #define IDeckLinkDeckControl_v8_1_SetPreroll(This,prerollSeconds) \ - ( (This)->lpVtbl -> SetPreroll(This,prerollSeconds) ) + ( (This)->lpVtbl -> SetPreroll(This,prerollSeconds) ) #define IDeckLinkDeckControl_v8_1_GetPreroll(This,prerollSeconds) \ - ( (This)->lpVtbl -> GetPreroll(This,prerollSeconds) ) + ( (This)->lpVtbl -> GetPreroll(This,prerollSeconds) ) #define IDeckLinkDeckControl_v8_1_SetExportOffset(This,exportOffsetFields) \ - ( (This)->lpVtbl -> SetExportOffset(This,exportOffsetFields) ) + ( (This)->lpVtbl -> SetExportOffset(This,exportOffsetFields) ) #define IDeckLinkDeckControl_v8_1_GetExportOffset(This,exportOffsetFields) \ - ( (This)->lpVtbl -> GetExportOffset(This,exportOffsetFields) ) + ( (This)->lpVtbl -> GetExportOffset(This,exportOffsetFields) ) #define IDeckLinkDeckControl_v8_1_GetManualExportOffset(This,deckManualExportOffsetFields) \ - ( (This)->lpVtbl -> GetManualExportOffset(This,deckManualExportOffsetFields) ) + ( (This)->lpVtbl -> GetManualExportOffset(This,deckManualExportOffsetFields) ) #define IDeckLinkDeckControl_v8_1_SetCaptureOffset(This,captureOffsetFields) \ - ( (This)->lpVtbl -> SetCaptureOffset(This,captureOffsetFields) ) + ( (This)->lpVtbl -> SetCaptureOffset(This,captureOffsetFields) ) #define IDeckLinkDeckControl_v8_1_GetCaptureOffset(This,captureOffsetFields) \ - ( (This)->lpVtbl -> GetCaptureOffset(This,captureOffsetFields) ) + ( (This)->lpVtbl -> GetCaptureOffset(This,captureOffsetFields) ) #define IDeckLinkDeckControl_v8_1_StartExport(This,inTimecode,outTimecode,exportModeOps,error) \ - ( (This)->lpVtbl -> StartExport(This,inTimecode,outTimecode,exportModeOps,error) ) + ( (This)->lpVtbl -> StartExport(This,inTimecode,outTimecode,exportModeOps,error) ) #define IDeckLinkDeckControl_v8_1_StartCapture(This,useVITC,inTimecode,outTimecode,error) \ - ( (This)->lpVtbl -> StartCapture(This,useVITC,inTimecode,outTimecode,error) ) + ( (This)->lpVtbl -> StartCapture(This,useVITC,inTimecode,outTimecode,error) ) #define IDeckLinkDeckControl_v8_1_GetDeviceID(This,deviceId,error) \ - ( (This)->lpVtbl -> GetDeviceID(This,deviceId,error) ) + ( (This)->lpVtbl -> GetDeviceID(This,deviceId,error) ) #define IDeckLinkDeckControl_v8_1_Abort(This) \ - ( (This)->lpVtbl -> Abort(This) ) + ( (This)->lpVtbl -> Abort(This) ) #define IDeckLinkDeckControl_v8_1_CrashRecordStart(This,error) \ - ( (This)->lpVtbl -> CrashRecordStart(This,error) ) + ( (This)->lpVtbl -> CrashRecordStart(This,error) ) #define IDeckLinkDeckControl_v8_1_CrashRecordStop(This,error) \ - ( (This)->lpVtbl -> CrashRecordStop(This,error) ) + ( (This)->lpVtbl -> CrashRecordStop(This,error) ) #define IDeckLinkDeckControl_v8_1_SetCallback(This,callback) \ - ( (This)->lpVtbl -> SetCallback(This,callback) ) + ( (This)->lpVtbl -> SetCallback(This,callback) ) #endif /* COBJMACROS */ @@ -13109,45 +15185,49 @@ #define __IDeckLink_v8_0_INTERFACE_DEFINED__ /* interface IDeckLink_v8_0 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLink_v8_0; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("62BFF75D-6569-4E55-8D4D-66AA03829ABC") IDeckLink_v8_0 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetModelName( + virtual HRESULT STDMETHODCALLTYPE GetModelName( /* out */ BSTR *modelName) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLink_v8_0Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLink_v8_0 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLink_v8_0 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLink_v8_0 * This); - - HRESULT ( STDMETHODCALLTYPE *GetModelName )( + + DECLSPEC_XFGVIRT(IDeckLink_v8_0, GetModelName) + HRESULT ( STDMETHODCALLTYPE *GetModelName )( IDeckLink_v8_0 * This, /* out */ BSTR *modelName); - + END_INTERFACE } IDeckLink_v8_0Vtbl; @@ -13156,23 +15236,23 @@ CONST_VTBL struct IDeckLink_v8_0Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLink_v8_0_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLink_v8_0_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLink_v8_0_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLink_v8_0_GetModelName(This,modelName) \ - ( (This)->lpVtbl -> GetModelName(This,modelName) ) + ( (This)->lpVtbl -> GetModelName(This,modelName) ) #endif /* COBJMACROS */ @@ -13189,45 +15269,49 @@ #define __IDeckLinkIterator_v8_0_INTERFACE_DEFINED__ /* interface IDeckLinkIterator_v8_0 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkIterator_v8_0; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("74E936FC-CC28-4A67-81A0-1E94E52D4E69") IDeckLinkIterator_v8_0 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Next( + virtual HRESULT STDMETHODCALLTYPE Next( /* out */ IDeckLink_v8_0 **deckLinkInstance) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkIterator_v8_0Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkIterator_v8_0 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkIterator_v8_0 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkIterator_v8_0 * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( + + DECLSPEC_XFGVIRT(IDeckLinkIterator_v8_0, Next) + HRESULT ( STDMETHODCALLTYPE *Next )( IDeckLinkIterator_v8_0 * This, /* out */ IDeckLink_v8_0 **deckLinkInstance); - + END_INTERFACE } IDeckLinkIterator_v8_0Vtbl; @@ -13236,23 +15320,23 @@ CONST_VTBL struct IDeckLinkIterator_v8_0Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkIterator_v8_0_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkIterator_v8_0_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkIterator_v8_0_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkIterator_v8_0_Next(This,deckLinkInstance) \ - ( (This)->lpVtbl -> Next(This,deckLinkInstance) ) + ( (This)->lpVtbl -> Next(This,deckLinkInstance) ) #endif /* COBJMACROS */ @@ -13277,300 +15361,335 @@ #define __IDeckLinkDeckControl_v7_9_INTERFACE_DEFINED__ /* interface IDeckLinkDeckControl_v7_9 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkDeckControl_v7_9; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("A4D81043-0619-42B7-8ED6-602D29041DF7") IDeckLinkDeckControl_v7_9 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Open( + virtual HRESULT STDMETHODCALLTYPE Open( /* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ BOOL timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Close( + + virtual HRESULT STDMETHODCALLTYPE Close( /* in */ BOOL standbyOn) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentState( + + virtual HRESULT STDMETHODCALLTYPE GetCurrentState( /* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetStandby( + + virtual HRESULT STDMETHODCALLTYPE SetStandby( /* in */ BOOL standbyOn) = 0; - - virtual HRESULT STDMETHODCALLTYPE Play( + + virtual HRESULT STDMETHODCALLTYPE Play( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Stop( + + virtual HRESULT STDMETHODCALLTYPE Stop( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE TogglePlayStop( + + virtual HRESULT STDMETHODCALLTYPE TogglePlayStop( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Eject( + + virtual HRESULT STDMETHODCALLTYPE Eject( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GoToTimecode( + + virtual HRESULT STDMETHODCALLTYPE GoToTimecode( /* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE FastForward( + + virtual HRESULT STDMETHODCALLTYPE FastForward( /* in */ BOOL viewTape, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Rewind( + + virtual HRESULT STDMETHODCALLTYPE Rewind( /* in */ BOOL viewTape, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE StepForward( + + virtual HRESULT STDMETHODCALLTYPE StepForward( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE StepBack( + + virtual HRESULT STDMETHODCALLTYPE StepBack( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Jog( + + virtual HRESULT STDMETHODCALLTYPE Jog( /* in */ double rate, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE Shuttle( + + virtual HRESULT STDMETHODCALLTYPE Shuttle( /* in */ double rate, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecodeString( + + virtual HRESULT STDMETHODCALLTYPE GetTimecodeString( /* out */ BSTR *currentTimeCode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecode( + + virtual HRESULT STDMETHODCALLTYPE GetTimecode( /* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecodeBCD( + + virtual HRESULT STDMETHODCALLTYPE GetTimecodeBCD( /* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetPreroll( + + virtual HRESULT STDMETHODCALLTYPE SetPreroll( /* in */ unsigned int prerollSeconds) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPreroll( + + virtual HRESULT STDMETHODCALLTYPE GetPreroll( /* out */ unsigned int *prerollSeconds) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetExportOffset( + + virtual HRESULT STDMETHODCALLTYPE SetExportOffset( /* in */ int exportOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetExportOffset( + + virtual HRESULT STDMETHODCALLTYPE GetExportOffset( /* out */ int *exportOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetManualExportOffset( + + virtual HRESULT STDMETHODCALLTYPE GetManualExportOffset( /* out */ int *deckManualExportOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCaptureOffset( + + virtual HRESULT STDMETHODCALLTYPE SetCaptureOffset( /* in */ int captureOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCaptureOffset( + + virtual HRESULT STDMETHODCALLTYPE GetCaptureOffset( /* out */ int *captureOffsetFields) = 0; - - virtual HRESULT STDMETHODCALLTYPE StartExport( + + virtual HRESULT STDMETHODCALLTYPE StartExport( /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE StartCapture( + + virtual HRESULT STDMETHODCALLTYPE StartCapture( /* in */ BOOL useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDeviceID( + + virtual HRESULT STDMETHODCALLTYPE GetDeviceID( /* out */ unsigned short *deviceId, /* out */ BMDDeckControlError *error) = 0; - + virtual HRESULT STDMETHODCALLTYPE Abort( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE CrashRecordStart( + + virtual HRESULT STDMETHODCALLTYPE CrashRecordStart( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE CrashRecordStop( + + virtual HRESULT STDMETHODCALLTYPE CrashRecordStop( /* out */ BMDDeckControlError *error) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( + + virtual HRESULT STDMETHODCALLTYPE SetCallback( /* in */ IDeckLinkDeckControlStatusCallback *callback) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDeckControl_v7_9Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDeckControl_v7_9 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDeckControl_v7_9 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDeckControl_v7_9 * This); - - HRESULT ( STDMETHODCALLTYPE *Open )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, Open) + HRESULT ( STDMETHODCALLTYPE *Open )( IDeckLinkDeckControl_v7_9 * This, /* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ BOOL timecodeIsDropFrame, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Close )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, Close) + HRESULT ( STDMETHODCALLTYPE *Close )( IDeckLinkDeckControl_v7_9 * This, /* in */ BOOL standbyOn); - - HRESULT ( STDMETHODCALLTYPE *GetCurrentState )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, GetCurrentState) + HRESULT ( STDMETHODCALLTYPE *GetCurrentState )( IDeckLinkDeckControl_v7_9 * This, /* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags); - - HRESULT ( STDMETHODCALLTYPE *SetStandby )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, SetStandby) + HRESULT ( STDMETHODCALLTYPE *SetStandby )( IDeckLinkDeckControl_v7_9 * This, /* in */ BOOL standbyOn); - - HRESULT ( STDMETHODCALLTYPE *Play )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, Play) + HRESULT ( STDMETHODCALLTYPE *Play )( IDeckLinkDeckControl_v7_9 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Stop )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, Stop) + HRESULT ( STDMETHODCALLTYPE *Stop )( IDeckLinkDeckControl_v7_9 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *TogglePlayStop )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, TogglePlayStop) + HRESULT ( STDMETHODCALLTYPE *TogglePlayStop )( IDeckLinkDeckControl_v7_9 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Eject )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, Eject) + HRESULT ( STDMETHODCALLTYPE *Eject )( IDeckLinkDeckControl_v7_9 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GoToTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, GoToTimecode) + HRESULT ( STDMETHODCALLTYPE *GoToTimecode )( IDeckLinkDeckControl_v7_9 * This, /* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *FastForward )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, FastForward) + HRESULT ( STDMETHODCALLTYPE *FastForward )( IDeckLinkDeckControl_v7_9 * This, /* in */ BOOL viewTape, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Rewind )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, Rewind) + HRESULT ( STDMETHODCALLTYPE *Rewind )( IDeckLinkDeckControl_v7_9 * This, /* in */ BOOL viewTape, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *StepForward )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, StepForward) + HRESULT ( STDMETHODCALLTYPE *StepForward )( IDeckLinkDeckControl_v7_9 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *StepBack )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, StepBack) + HRESULT ( STDMETHODCALLTYPE *StepBack )( IDeckLinkDeckControl_v7_9 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Jog )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, Jog) + HRESULT ( STDMETHODCALLTYPE *Jog )( IDeckLinkDeckControl_v7_9 * This, /* in */ double rate, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Shuttle )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, Shuttle) + HRESULT ( STDMETHODCALLTYPE *Shuttle )( IDeckLinkDeckControl_v7_9 * This, /* in */ double rate, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GetTimecodeString )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, GetTimecodeString) + HRESULT ( STDMETHODCALLTYPE *GetTimecodeString )( IDeckLinkDeckControl_v7_9 * This, /* out */ BSTR *currentTimeCode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, GetTimecode) + HRESULT ( STDMETHODCALLTYPE *GetTimecode )( IDeckLinkDeckControl_v7_9 * This, /* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GetTimecodeBCD )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, GetTimecodeBCD) + HRESULT ( STDMETHODCALLTYPE *GetTimecodeBCD )( IDeckLinkDeckControl_v7_9 * This, /* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *SetPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, SetPreroll) + HRESULT ( STDMETHODCALLTYPE *SetPreroll )( IDeckLinkDeckControl_v7_9 * This, /* in */ unsigned int prerollSeconds); - - HRESULT ( STDMETHODCALLTYPE *GetPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, GetPreroll) + HRESULT ( STDMETHODCALLTYPE *GetPreroll )( IDeckLinkDeckControl_v7_9 * This, /* out */ unsigned int *prerollSeconds); - - HRESULT ( STDMETHODCALLTYPE *SetExportOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, SetExportOffset) + HRESULT ( STDMETHODCALLTYPE *SetExportOffset )( IDeckLinkDeckControl_v7_9 * This, /* in */ int exportOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *GetExportOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, GetExportOffset) + HRESULT ( STDMETHODCALLTYPE *GetExportOffset )( IDeckLinkDeckControl_v7_9 * This, /* out */ int *exportOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *GetManualExportOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, GetManualExportOffset) + HRESULT ( STDMETHODCALLTYPE *GetManualExportOffset )( IDeckLinkDeckControl_v7_9 * This, /* out */ int *deckManualExportOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *SetCaptureOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, SetCaptureOffset) + HRESULT ( STDMETHODCALLTYPE *SetCaptureOffset )( IDeckLinkDeckControl_v7_9 * This, /* in */ int captureOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *GetCaptureOffset )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, GetCaptureOffset) + HRESULT ( STDMETHODCALLTYPE *GetCaptureOffset )( IDeckLinkDeckControl_v7_9 * This, /* out */ int *captureOffsetFields); - - HRESULT ( STDMETHODCALLTYPE *StartExport )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, StartExport) + HRESULT ( STDMETHODCALLTYPE *StartExport )( IDeckLinkDeckControl_v7_9 * This, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *StartCapture )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, StartCapture) + HRESULT ( STDMETHODCALLTYPE *StartCapture )( IDeckLinkDeckControl_v7_9 * This, /* in */ BOOL useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *GetDeviceID )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, GetDeviceID) + HRESULT ( STDMETHODCALLTYPE *GetDeviceID )( IDeckLinkDeckControl_v7_9 * This, /* out */ unsigned short *deviceId, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *Abort )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, Abort) + HRESULT ( STDMETHODCALLTYPE *Abort )( IDeckLinkDeckControl_v7_9 * This); - - HRESULT ( STDMETHODCALLTYPE *CrashRecordStart )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, CrashRecordStart) + HRESULT ( STDMETHODCALLTYPE *CrashRecordStart )( IDeckLinkDeckControl_v7_9 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *CrashRecordStop )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, CrashRecordStop) + HRESULT ( STDMETHODCALLTYPE *CrashRecordStop )( IDeckLinkDeckControl_v7_9 * This, /* out */ BMDDeckControlError *error); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkDeckControl_v7_9, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( IDeckLinkDeckControl_v7_9 * This, /* in */ IDeckLinkDeckControlStatusCallback *callback); - + END_INTERFACE } IDeckLinkDeckControl_v7_9Vtbl; @@ -13579,116 +15698,116 @@ CONST_VTBL struct IDeckLinkDeckControl_v7_9Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDeckControl_v7_9_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDeckControl_v7_9_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDeckControl_v7_9_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDeckControl_v7_9_Open(This,timeScale,timeValue,timecodeIsDropFrame,error) \ - ( (This)->lpVtbl -> Open(This,timeScale,timeValue,timecodeIsDropFrame,error) ) + ( (This)->lpVtbl -> Open(This,timeScale,timeValue,timecodeIsDropFrame,error) ) #define IDeckLinkDeckControl_v7_9_Close(This,standbyOn) \ - ( (This)->lpVtbl -> Close(This,standbyOn) ) + ( (This)->lpVtbl -> Close(This,standbyOn) ) #define IDeckLinkDeckControl_v7_9_GetCurrentState(This,mode,vtrControlState,flags) \ - ( (This)->lpVtbl -> GetCurrentState(This,mode,vtrControlState,flags) ) + ( (This)->lpVtbl -> GetCurrentState(This,mode,vtrControlState,flags) ) #define IDeckLinkDeckControl_v7_9_SetStandby(This,standbyOn) \ - ( (This)->lpVtbl -> SetStandby(This,standbyOn) ) + ( (This)->lpVtbl -> SetStandby(This,standbyOn) ) #define IDeckLinkDeckControl_v7_9_Play(This,error) \ - ( (This)->lpVtbl -> Play(This,error) ) + ( (This)->lpVtbl -> Play(This,error) ) #define IDeckLinkDeckControl_v7_9_Stop(This,error) \ - ( (This)->lpVtbl -> Stop(This,error) ) + ( (This)->lpVtbl -> Stop(This,error) ) #define IDeckLinkDeckControl_v7_9_TogglePlayStop(This,error) \ - ( (This)->lpVtbl -> TogglePlayStop(This,error) ) + ( (This)->lpVtbl -> TogglePlayStop(This,error) ) #define IDeckLinkDeckControl_v7_9_Eject(This,error) \ - ( (This)->lpVtbl -> Eject(This,error) ) + ( (This)->lpVtbl -> Eject(This,error) ) #define IDeckLinkDeckControl_v7_9_GoToTimecode(This,timecode,error) \ - ( (This)->lpVtbl -> GoToTimecode(This,timecode,error) ) + ( (This)->lpVtbl -> GoToTimecode(This,timecode,error) ) #define IDeckLinkDeckControl_v7_9_FastForward(This,viewTape,error) \ - ( (This)->lpVtbl -> FastForward(This,viewTape,error) ) + ( (This)->lpVtbl -> FastForward(This,viewTape,error) ) #define IDeckLinkDeckControl_v7_9_Rewind(This,viewTape,error) \ - ( (This)->lpVtbl -> Rewind(This,viewTape,error) ) + ( (This)->lpVtbl -> Rewind(This,viewTape,error) ) #define IDeckLinkDeckControl_v7_9_StepForward(This,error) \ - ( (This)->lpVtbl -> StepForward(This,error) ) + ( (This)->lpVtbl -> StepForward(This,error) ) #define IDeckLinkDeckControl_v7_9_StepBack(This,error) \ - ( (This)->lpVtbl -> StepBack(This,error) ) + ( (This)->lpVtbl -> StepBack(This,error) ) #define IDeckLinkDeckControl_v7_9_Jog(This,rate,error) \ - ( (This)->lpVtbl -> Jog(This,rate,error) ) + ( (This)->lpVtbl -> Jog(This,rate,error) ) #define IDeckLinkDeckControl_v7_9_Shuttle(This,rate,error) \ - ( (This)->lpVtbl -> Shuttle(This,rate,error) ) + ( (This)->lpVtbl -> Shuttle(This,rate,error) ) #define IDeckLinkDeckControl_v7_9_GetTimecodeString(This,currentTimeCode,error) \ - ( (This)->lpVtbl -> GetTimecodeString(This,currentTimeCode,error) ) + ( (This)->lpVtbl -> GetTimecodeString(This,currentTimeCode,error) ) #define IDeckLinkDeckControl_v7_9_GetTimecode(This,currentTimecode,error) \ - ( (This)->lpVtbl -> GetTimecode(This,currentTimecode,error) ) + ( (This)->lpVtbl -> GetTimecode(This,currentTimecode,error) ) #define IDeckLinkDeckControl_v7_9_GetTimecodeBCD(This,currentTimecode,error) \ - ( (This)->lpVtbl -> GetTimecodeBCD(This,currentTimecode,error) ) + ( (This)->lpVtbl -> GetTimecodeBCD(This,currentTimecode,error) ) #define IDeckLinkDeckControl_v7_9_SetPreroll(This,prerollSeconds) \ - ( (This)->lpVtbl -> SetPreroll(This,prerollSeconds) ) + ( (This)->lpVtbl -> SetPreroll(This,prerollSeconds) ) #define IDeckLinkDeckControl_v7_9_GetPreroll(This,prerollSeconds) \ - ( (This)->lpVtbl -> GetPreroll(This,prerollSeconds) ) + ( (This)->lpVtbl -> GetPreroll(This,prerollSeconds) ) #define IDeckLinkDeckControl_v7_9_SetExportOffset(This,exportOffsetFields) \ - ( (This)->lpVtbl -> SetExportOffset(This,exportOffsetFields) ) + ( (This)->lpVtbl -> SetExportOffset(This,exportOffsetFields) ) #define IDeckLinkDeckControl_v7_9_GetExportOffset(This,exportOffsetFields) \ - ( (This)->lpVtbl -> GetExportOffset(This,exportOffsetFields) ) + ( (This)->lpVtbl -> GetExportOffset(This,exportOffsetFields) ) #define IDeckLinkDeckControl_v7_9_GetManualExportOffset(This,deckManualExportOffsetFields) \ - ( (This)->lpVtbl -> GetManualExportOffset(This,deckManualExportOffsetFields) ) + ( (This)->lpVtbl -> GetManualExportOffset(This,deckManualExportOffsetFields) ) #define IDeckLinkDeckControl_v7_9_SetCaptureOffset(This,captureOffsetFields) \ - ( (This)->lpVtbl -> SetCaptureOffset(This,captureOffsetFields) ) + ( (This)->lpVtbl -> SetCaptureOffset(This,captureOffsetFields) ) #define IDeckLinkDeckControl_v7_9_GetCaptureOffset(This,captureOffsetFields) \ - ( (This)->lpVtbl -> GetCaptureOffset(This,captureOffsetFields) ) + ( (This)->lpVtbl -> GetCaptureOffset(This,captureOffsetFields) ) #define IDeckLinkDeckControl_v7_9_StartExport(This,inTimecode,outTimecode,exportModeOps,error) \ - ( (This)->lpVtbl -> StartExport(This,inTimecode,outTimecode,exportModeOps,error) ) + ( (This)->lpVtbl -> StartExport(This,inTimecode,outTimecode,exportModeOps,error) ) #define IDeckLinkDeckControl_v7_9_StartCapture(This,useVITC,inTimecode,outTimecode,error) \ - ( (This)->lpVtbl -> StartCapture(This,useVITC,inTimecode,outTimecode,error) ) + ( (This)->lpVtbl -> StartCapture(This,useVITC,inTimecode,outTimecode,error) ) #define IDeckLinkDeckControl_v7_9_GetDeviceID(This,deviceId,error) \ - ( (This)->lpVtbl -> GetDeviceID(This,deviceId,error) ) + ( (This)->lpVtbl -> GetDeviceID(This,deviceId,error) ) #define IDeckLinkDeckControl_v7_9_Abort(This) \ - ( (This)->lpVtbl -> Abort(This) ) + ( (This)->lpVtbl -> Abort(This) ) #define IDeckLinkDeckControl_v7_9_CrashRecordStart(This,error) \ - ( (This)->lpVtbl -> CrashRecordStart(This,error) ) + ( (This)->lpVtbl -> CrashRecordStart(This,error) ) #define IDeckLinkDeckControl_v7_9_CrashRecordStop(This,error) \ - ( (This)->lpVtbl -> CrashRecordStop(This,error) ) + ( (This)->lpVtbl -> CrashRecordStop(This,error) ) #define IDeckLinkDeckControl_v7_9_SetCallback(This,callback) \ - ( (This)->lpVtbl -> SetCallback(This,callback) ) + ( (This)->lpVtbl -> SetCallback(This,callback) ) #endif /* COBJMACROS */ @@ -13705,45 +15824,49 @@ #define __IDeckLinkDisplayModeIterator_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkDisplayModeIterator_v7_6 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkDisplayModeIterator_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("455D741F-1779-4800-86F5-0B5D13D79751") IDeckLinkDisplayModeIterator_v7_6 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Next( + virtual HRESULT STDMETHODCALLTYPE Next( /* out */ IDeckLinkDisplayMode_v7_6 **deckLinkDisplayMode) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDisplayModeIterator_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDisplayModeIterator_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDisplayModeIterator_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDisplayModeIterator_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayModeIterator_v7_6, Next) + HRESULT ( STDMETHODCALLTYPE *Next )( IDeckLinkDisplayModeIterator_v7_6 * This, /* out */ IDeckLinkDisplayMode_v7_6 **deckLinkDisplayMode); - + END_INTERFACE } IDeckLinkDisplayModeIterator_v7_6Vtbl; @@ -13752,23 +15875,23 @@ CONST_VTBL struct IDeckLinkDisplayModeIterator_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDisplayModeIterator_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDisplayModeIterator_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDisplayModeIterator_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDisplayModeIterator_v7_6_Next(This,deckLinkDisplayMode) \ - ( (This)->lpVtbl -> Next(This,deckLinkDisplayMode) ) + ( (This)->lpVtbl -> Next(This,deckLinkDisplayMode) ) #endif /* COBJMACROS */ @@ -13785,74 +15908,83 @@ #define __IDeckLinkDisplayMode_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkDisplayMode_v7_6 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkDisplayMode_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("87451E84-2B7E-439E-A629-4393EA4A8550") IDeckLinkDisplayMode_v7_6 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetName( + virtual HRESULT STDMETHODCALLTYPE GetName( /* out */ BSTR *name) = 0; - + virtual BMDDisplayMode STDMETHODCALLTYPE GetDisplayMode( void) = 0; - + virtual long STDMETHODCALLTYPE GetWidth( void) = 0; - + virtual long STDMETHODCALLTYPE GetHeight( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFrameRate( + + virtual HRESULT STDMETHODCALLTYPE GetFrameRate( /* out */ BMDTimeValue *frameDuration, /* out */ BMDTimeScale *timeScale) = 0; - + virtual BMDFieldDominance STDMETHODCALLTYPE GetFieldDominance( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDisplayMode_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDisplayMode_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDisplayMode_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDisplayMode_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *GetName )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode_v7_6, GetName) + HRESULT ( STDMETHODCALLTYPE *GetName )( IDeckLinkDisplayMode_v7_6 * This, /* out */ BSTR *name); - - BMDDisplayMode ( STDMETHODCALLTYPE *GetDisplayMode )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode_v7_6, GetDisplayMode) + BMDDisplayMode ( STDMETHODCALLTYPE *GetDisplayMode )( IDeckLinkDisplayMode_v7_6 * This); - - long ( STDMETHODCALLTYPE *GetWidth )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode_v7_6, GetWidth) + long ( STDMETHODCALLTYPE *GetWidth )( IDeckLinkDisplayMode_v7_6 * This); - - long ( STDMETHODCALLTYPE *GetHeight )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode_v7_6, GetHeight) + long ( STDMETHODCALLTYPE *GetHeight )( IDeckLinkDisplayMode_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *GetFrameRate )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode_v7_6, GetFrameRate) + HRESULT ( STDMETHODCALLTYPE *GetFrameRate )( IDeckLinkDisplayMode_v7_6 * This, /* out */ BMDTimeValue *frameDuration, /* out */ BMDTimeScale *timeScale); - - BMDFieldDominance ( STDMETHODCALLTYPE *GetFieldDominance )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode_v7_6, GetFieldDominance) + BMDFieldDominance ( STDMETHODCALLTYPE *GetFieldDominance )( IDeckLinkDisplayMode_v7_6 * This); - + END_INTERFACE } IDeckLinkDisplayMode_v7_6Vtbl; @@ -13861,38 +15993,38 @@ CONST_VTBL struct IDeckLinkDisplayMode_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDisplayMode_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDisplayMode_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDisplayMode_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDisplayMode_v7_6_GetName(This,name) \ - ( (This)->lpVtbl -> GetName(This,name) ) + ( (This)->lpVtbl -> GetName(This,name) ) #define IDeckLinkDisplayMode_v7_6_GetDisplayMode(This) \ - ( (This)->lpVtbl -> GetDisplayMode(This) ) + ( (This)->lpVtbl -> GetDisplayMode(This) ) #define IDeckLinkDisplayMode_v7_6_GetWidth(This) \ - ( (This)->lpVtbl -> GetWidth(This) ) + ( (This)->lpVtbl -> GetWidth(This) ) #define IDeckLinkDisplayMode_v7_6_GetHeight(This) \ - ( (This)->lpVtbl -> GetHeight(This) ) + ( (This)->lpVtbl -> GetHeight(This) ) #define IDeckLinkDisplayMode_v7_6_GetFrameRate(This,frameDuration,timeScale) \ - ( (This)->lpVtbl -> GetFrameRate(This,frameDuration,timeScale) ) + ( (This)->lpVtbl -> GetFrameRate(This,frameDuration,timeScale) ) #define IDeckLinkDisplayMode_v7_6_GetFieldDominance(This) \ - ( (This)->lpVtbl -> GetFieldDominance(This) ) + ( (This)->lpVtbl -> GetFieldDominance(This) ) #endif /* COBJMACROS */ @@ -13909,168 +16041,178 @@ #define __IDeckLinkOutput_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkOutput_v7_6 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkOutput_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("29228142-EB8C-4141-A621-F74026450955") IDeckLinkOutput_v7_6 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport_v10_11 *result) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( /* in */ IDeckLinkScreenPreviewCallback_v7_6 *previewCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( BMDDisplayMode displayMode, BMDVideoOutputFlags flags) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoOutput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( + + virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( /* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( + + virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( int width, int height, int rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame_v7_6 **outFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateAncillaryData( + + virtual HRESULT STDMETHODCALLTYPE CreateAncillaryData( BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( + + virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( /* in */ IDeckLinkVideoFrame_v7_6 *theFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( + + virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( /* in */ IDeckLinkVideoFrame_v7_6 *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( /* in */ IDeckLinkVideoOutputCallback_v7_6 *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferedVideoFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetBufferedVideoFrameCount( /* out */ unsigned int *bufferedFrameCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount, BMDAudioOutputStreamType streamType) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioOutput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( + + virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( /* in */ void *buffer, unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesWritten) = 0; - + virtual HRESULT STDMETHODCALLTYPE BeginAudioPreroll( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE EndAudioPreroll( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( + + virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( /* in */ void *buffer, unsigned int sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, /* out */ unsigned int *sampleFramesWritten) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( /* out */ unsigned int *bufferedSampleFrameCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE FlushBufferedAudioSamples( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( + + virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( /* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( + + virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed) = 0; - - virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( + + virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsScheduledPlaybackRunning( + + virtual HRESULT STDMETHODCALLTYPE IsScheduledPlaybackRunning( /* out */ BOOL *active) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetScheduledStreamTime( + + virtual HRESULT STDMETHODCALLTYPE GetScheduledStreamTime( BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkOutput_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkOutput_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkOutput_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkOutput_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkOutput_v7_6 * This, BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport_v10_11 *result); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkOutput_v7_6 * This, /* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator); - - HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, SetScreenPreviewCallback) + HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( IDeckLinkOutput_v7_6 * This, /* in */ IDeckLinkScreenPreviewCallback_v7_6 *previewCallback); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, EnableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( IDeckLinkOutput_v7_6 * This, BMDDisplayMode displayMode, BMDVideoOutputFlags flags); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, DisableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( IDeckLinkOutput_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, SetVideoOutputFrameMemoryAllocator) + HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( IDeckLinkOutput_v7_6 * This, /* in */ IDeckLinkMemoryAllocator *theAllocator); - - HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, CreateVideoFrame) + HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( IDeckLinkOutput_v7_6 * This, int width, int height, @@ -14078,101 +16220,120 @@ BMDPixelFormat pixelFormat, BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame_v7_6 **outFrame); - - HRESULT ( STDMETHODCALLTYPE *CreateAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, CreateAncillaryData) + HRESULT ( STDMETHODCALLTYPE *CreateAncillaryData )( IDeckLinkOutput_v7_6 * This, BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer); - - HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, DisplayVideoFrameSync) + HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( IDeckLinkOutput_v7_6 * This, /* in */ IDeckLinkVideoFrame_v7_6 *theFrame); - - HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, ScheduleVideoFrame) + HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( IDeckLinkOutput_v7_6 * This, /* in */ IDeckLinkVideoFrame_v7_6 *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, SetScheduledFrameCompletionCallback) + HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( IDeckLinkOutput_v7_6 * This, /* in */ IDeckLinkVideoOutputCallback_v7_6 *theCallback); - - HRESULT ( STDMETHODCALLTYPE *GetBufferedVideoFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, GetBufferedVideoFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedVideoFrameCount )( IDeckLinkOutput_v7_6 * This, /* out */ unsigned int *bufferedFrameCount); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, EnableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( IDeckLinkOutput_v7_6 * This, BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount, BMDAudioOutputStreamType streamType); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, DisableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( IDeckLinkOutput_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, WriteAudioSamplesSync) + HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( IDeckLinkOutput_v7_6 * This, /* in */ void *buffer, unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesWritten); - - HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, BeginAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( IDeckLinkOutput_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, EndAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( IDeckLinkOutput_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, ScheduleAudioSamples) + HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( IDeckLinkOutput_v7_6 * This, /* in */ void *buffer, unsigned int sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, /* out */ unsigned int *sampleFramesWritten); - - HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, GetBufferedAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( IDeckLinkOutput_v7_6 * This, /* out */ unsigned int *bufferedSampleFrameCount); - - HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, FlushBufferedAudioSamples) + HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( IDeckLinkOutput_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, SetAudioCallback) + HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( IDeckLinkOutput_v7_6 * This, /* in */ IDeckLinkAudioOutputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, StartScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( IDeckLinkOutput_v7_6 * This, BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed); - - HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, StopScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( IDeckLinkOutput_v7_6 * This, BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *IsScheduledPlaybackRunning )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, IsScheduledPlaybackRunning) + HRESULT ( STDMETHODCALLTYPE *IsScheduledPlaybackRunning )( IDeckLinkOutput_v7_6 * This, /* out */ BOOL *active); - - HRESULT ( STDMETHODCALLTYPE *GetScheduledStreamTime )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, GetScheduledStreamTime) + HRESULT ( STDMETHODCALLTYPE *GetScheduledStreamTime )( IDeckLinkOutput_v7_6 * This, BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_6, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( IDeckLinkOutput_v7_6 * This, BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame); - + END_INTERFACE } IDeckLinkOutput_v7_6Vtbl; @@ -14181,98 +16342,98 @@ CONST_VTBL struct IDeckLinkOutput_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkOutput_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkOutput_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkOutput_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkOutput_v7_6_DoesSupportVideoMode(This,displayMode,pixelFormat,result) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) + ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) #define IDeckLinkOutput_v7_6_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkOutput_v7_6_SetScreenPreviewCallback(This,previewCallback) \ - ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) + ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) #define IDeckLinkOutput_v7_6_EnableVideoOutput(This,displayMode,flags) \ - ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode,flags) ) + ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode,flags) ) #define IDeckLinkOutput_v7_6_DisableVideoOutput(This) \ - ( (This)->lpVtbl -> DisableVideoOutput(This) ) + ( (This)->lpVtbl -> DisableVideoOutput(This) ) #define IDeckLinkOutput_v7_6_SetVideoOutputFrameMemoryAllocator(This,theAllocator) \ - ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) + ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) #define IDeckLinkOutput_v7_6_CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) \ - ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) + ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) #define IDeckLinkOutput_v7_6_CreateAncillaryData(This,pixelFormat,outBuffer) \ - ( (This)->lpVtbl -> CreateAncillaryData(This,pixelFormat,outBuffer) ) + ( (This)->lpVtbl -> CreateAncillaryData(This,pixelFormat,outBuffer) ) #define IDeckLinkOutput_v7_6_DisplayVideoFrameSync(This,theFrame) \ - ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) + ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) #define IDeckLinkOutput_v7_6_ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) \ - ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) + ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) #define IDeckLinkOutput_v7_6_SetScheduledFrameCompletionCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) #define IDeckLinkOutput_v7_6_GetBufferedVideoFrameCount(This,bufferedFrameCount) \ - ( (This)->lpVtbl -> GetBufferedVideoFrameCount(This,bufferedFrameCount) ) + ( (This)->lpVtbl -> GetBufferedVideoFrameCount(This,bufferedFrameCount) ) #define IDeckLinkOutput_v7_6_EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) \ - ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) ) + ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) ) #define IDeckLinkOutput_v7_6_DisableAudioOutput(This) \ - ( (This)->lpVtbl -> DisableAudioOutput(This) ) + ( (This)->lpVtbl -> DisableAudioOutput(This) ) #define IDeckLinkOutput_v7_6_WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) \ - ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) + ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) #define IDeckLinkOutput_v7_6_BeginAudioPreroll(This) \ - ( (This)->lpVtbl -> BeginAudioPreroll(This) ) + ( (This)->lpVtbl -> BeginAudioPreroll(This) ) #define IDeckLinkOutput_v7_6_EndAudioPreroll(This) \ - ( (This)->lpVtbl -> EndAudioPreroll(This) ) + ( (This)->lpVtbl -> EndAudioPreroll(This) ) #define IDeckLinkOutput_v7_6_ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) \ - ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) + ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) #define IDeckLinkOutput_v7_6_GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) \ - ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) ) + ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) ) #define IDeckLinkOutput_v7_6_FlushBufferedAudioSamples(This) \ - ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) + ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) #define IDeckLinkOutput_v7_6_SetAudioCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) #define IDeckLinkOutput_v7_6_StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) \ - ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) + ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) #define IDeckLinkOutput_v7_6_StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) \ - ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) + ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) #define IDeckLinkOutput_v7_6_IsScheduledPlaybackRunning(This,active) \ - ( (This)->lpVtbl -> IsScheduledPlaybackRunning(This,active) ) + ( (This)->lpVtbl -> IsScheduledPlaybackRunning(This,active) ) #define IDeckLinkOutput_v7_6_GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) \ - ( (This)->lpVtbl -> GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) ) + ( (This)->lpVtbl -> GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) ) #define IDeckLinkOutput_v7_6_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \ - ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) #endif /* COBJMACROS */ @@ -14289,149 +16450,167 @@ #define __IDeckLinkInput_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkInput_v7_6 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkInput_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("300C135A-9F43-48E2-9906-6D7911D93CF1") IDeckLinkInput_v7_6 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport_v10_11 *result) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( /* in */ IDeckLinkScreenPreviewCallback_v7_6 *previewCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( /* out */ unsigned int *availableFrameCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( /* out */ unsigned int *availableSampleFrameCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE StartStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE StopStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE PauseStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE FlushStreams( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( + + virtual HRESULT STDMETHODCALLTYPE SetCallback( /* in */ IDeckLinkInputCallback_v7_6 *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkInput_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkInput_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkInput_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkInput_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkInput_v7_6 * This, BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport_v10_11 *result); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkInput_v7_6 * This, /* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator); - - HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, SetScreenPreviewCallback) + HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( IDeckLinkInput_v7_6 * This, /* in */ IDeckLinkScreenPreviewCallback_v7_6 *previewCallback); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, EnableVideoInput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( IDeckLinkInput_v7_6 * This, BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, DisableVideoInput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( IDeckLinkInput_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, GetAvailableVideoFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( IDeckLinkInput_v7_6 * This, /* out */ unsigned int *availableFrameCount); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, EnableAudioInput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( IDeckLinkInput_v7_6 * This, BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, DisableAudioInput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( IDeckLinkInput_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, GetAvailableAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( IDeckLinkInput_v7_6 * This, /* out */ unsigned int *availableSampleFrameCount); - - HRESULT ( STDMETHODCALLTYPE *StartStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, StartStreams) + HRESULT ( STDMETHODCALLTYPE *StartStreams )( IDeckLinkInput_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *StopStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, StopStreams) + HRESULT ( STDMETHODCALLTYPE *StopStreams )( IDeckLinkInput_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *PauseStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, PauseStreams) + HRESULT ( STDMETHODCALLTYPE *PauseStreams )( IDeckLinkInput_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *FlushStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, FlushStreams) + HRESULT ( STDMETHODCALLTYPE *FlushStreams )( IDeckLinkInput_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( IDeckLinkInput_v7_6 * This, /* in */ IDeckLinkInputCallback_v7_6 *theCallback); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_6, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( IDeckLinkInput_v7_6 * This, BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame); - + END_INTERFACE } IDeckLinkInput_v7_6Vtbl; @@ -14440,65 +16619,65 @@ CONST_VTBL struct IDeckLinkInput_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkInput_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkInput_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkInput_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkInput_v7_6_DoesSupportVideoMode(This,displayMode,pixelFormat,result) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) + ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) #define IDeckLinkInput_v7_6_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkInput_v7_6_SetScreenPreviewCallback(This,previewCallback) \ - ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) + ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) #define IDeckLinkInput_v7_6_EnableVideoInput(This,displayMode,pixelFormat,flags) \ - ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) + ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) #define IDeckLinkInput_v7_6_DisableVideoInput(This) \ - ( (This)->lpVtbl -> DisableVideoInput(This) ) + ( (This)->lpVtbl -> DisableVideoInput(This) ) #define IDeckLinkInput_v7_6_GetAvailableVideoFrameCount(This,availableFrameCount) \ - ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) + ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) #define IDeckLinkInput_v7_6_EnableAudioInput(This,sampleRate,sampleType,channelCount) \ - ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) + ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) #define IDeckLinkInput_v7_6_DisableAudioInput(This) \ - ( (This)->lpVtbl -> DisableAudioInput(This) ) + ( (This)->lpVtbl -> DisableAudioInput(This) ) #define IDeckLinkInput_v7_6_GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) \ - ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) + ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) #define IDeckLinkInput_v7_6_StartStreams(This) \ - ( (This)->lpVtbl -> StartStreams(This) ) + ( (This)->lpVtbl -> StartStreams(This) ) #define IDeckLinkInput_v7_6_StopStreams(This) \ - ( (This)->lpVtbl -> StopStreams(This) ) + ( (This)->lpVtbl -> StopStreams(This) ) #define IDeckLinkInput_v7_6_PauseStreams(This) \ - ( (This)->lpVtbl -> PauseStreams(This) ) + ( (This)->lpVtbl -> PauseStreams(This) ) #define IDeckLinkInput_v7_6_FlushStreams(This) \ - ( (This)->lpVtbl -> FlushStreams(This) ) + ( (This)->lpVtbl -> FlushStreams(This) ) #define IDeckLinkInput_v7_6_SetCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetCallback(This,theCallback) ) #define IDeckLinkInput_v7_6_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \ - ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) #endif /* COBJMACROS */ @@ -14515,68 +16694,75 @@ #define __IDeckLinkTimecode_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkTimecode_v7_6 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkTimecode_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("EFB9BCA6-A521-44F7-BD69-2332F24D9EE6") IDeckLinkTimecode_v7_6 : public IUnknown { public: virtual BMDTimecodeBCD STDMETHODCALLTYPE GetBCD( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetComponents( + + virtual HRESULT STDMETHODCALLTYPE GetComponents( /* out */ unsigned char *hours, /* out */ unsigned char *minutes, /* out */ unsigned char *seconds, /* out */ unsigned char *frames) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetString( + + virtual HRESULT STDMETHODCALLTYPE GetString( /* out */ BSTR *timecode) = 0; - + virtual BMDTimecodeFlags STDMETHODCALLTYPE GetFlags( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkTimecode_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkTimecode_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkTimecode_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkTimecode_v7_6 * This); - - BMDTimecodeBCD ( STDMETHODCALLTYPE *GetBCD )( + + DECLSPEC_XFGVIRT(IDeckLinkTimecode_v7_6, GetBCD) + BMDTimecodeBCD ( STDMETHODCALLTYPE *GetBCD )( IDeckLinkTimecode_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *GetComponents )( + + DECLSPEC_XFGVIRT(IDeckLinkTimecode_v7_6, GetComponents) + HRESULT ( STDMETHODCALLTYPE *GetComponents )( IDeckLinkTimecode_v7_6 * This, /* out */ unsigned char *hours, /* out */ unsigned char *minutes, /* out */ unsigned char *seconds, /* out */ unsigned char *frames); - - HRESULT ( STDMETHODCALLTYPE *GetString )( + + DECLSPEC_XFGVIRT(IDeckLinkTimecode_v7_6, GetString) + HRESULT ( STDMETHODCALLTYPE *GetString )( IDeckLinkTimecode_v7_6 * This, /* out */ BSTR *timecode); - - BMDTimecodeFlags ( STDMETHODCALLTYPE *GetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkTimecode_v7_6, GetFlags) + BMDTimecodeFlags ( STDMETHODCALLTYPE *GetFlags )( IDeckLinkTimecode_v7_6 * This); - + END_INTERFACE } IDeckLinkTimecode_v7_6Vtbl; @@ -14585,32 +16771,32 @@ CONST_VTBL struct IDeckLinkTimecode_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkTimecode_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkTimecode_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkTimecode_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkTimecode_v7_6_GetBCD(This) \ - ( (This)->lpVtbl -> GetBCD(This) ) + ( (This)->lpVtbl -> GetBCD(This) ) #define IDeckLinkTimecode_v7_6_GetComponents(This,hours,minutes,seconds,frames) \ - ( (This)->lpVtbl -> GetComponents(This,hours,minutes,seconds,frames) ) + ( (This)->lpVtbl -> GetComponents(This,hours,minutes,seconds,frames) ) #define IDeckLinkTimecode_v7_6_GetString(This,timecode) \ - ( (This)->lpVtbl -> GetString(This,timecode) ) + ( (This)->lpVtbl -> GetString(This,timecode) ) #define IDeckLinkTimecode_v7_6_GetFlags(This) \ - ( (This)->lpVtbl -> GetFlags(This) ) + ( (This)->lpVtbl -> GetFlags(This) ) #endif /* COBJMACROS */ @@ -14627,86 +16813,97 @@ #define __IDeckLinkVideoFrame_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkVideoFrame_v7_6 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkVideoFrame_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("A8D8238E-6B18-4196-99E1-5AF717B83D32") IDeckLinkVideoFrame_v7_6 : public IUnknown { public: virtual long STDMETHODCALLTYPE GetWidth( void) = 0; - + virtual long STDMETHODCALLTYPE GetHeight( void) = 0; - + virtual long STDMETHODCALLTYPE GetRowBytes( void) = 0; - + virtual BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat( void) = 0; - + virtual BMDFrameFlags STDMETHODCALLTYPE GetFlags( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBytes( + + virtual HRESULT STDMETHODCALLTYPE GetBytes( /* out */ void **buffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTimecode( + + virtual HRESULT STDMETHODCALLTYPE GetTimecode( BMDTimecodeFormat format, /* out */ IDeckLinkTimecode_v7_6 **timecode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAncillaryData( + + virtual HRESULT STDMETHODCALLTYPE GetAncillaryData( /* out */ IDeckLinkVideoFrameAncillary **ancillary) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoFrame_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoFrame_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoFrame_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoFrame_v7_6 * This); - - long ( STDMETHODCALLTYPE *GetWidth )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetWidth) + long ( STDMETHODCALLTYPE *GetWidth )( IDeckLinkVideoFrame_v7_6 * This); - - long ( STDMETHODCALLTYPE *GetHeight )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetHeight) + long ( STDMETHODCALLTYPE *GetHeight )( IDeckLinkVideoFrame_v7_6 * This); - - long ( STDMETHODCALLTYPE *GetRowBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetRowBytes) + long ( STDMETHODCALLTYPE *GetRowBytes )( IDeckLinkVideoFrame_v7_6 * This); - - BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetPixelFormat) + BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( IDeckLinkVideoFrame_v7_6 * This); - - BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetFlags) + BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( IDeckLinkVideoFrame_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkVideoFrame_v7_6 * This, /* out */ void **buffer); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetTimecode) + HRESULT ( STDMETHODCALLTYPE *GetTimecode )( IDeckLinkVideoFrame_v7_6 * This, BMDTimecodeFormat format, /* out */ IDeckLinkTimecode_v7_6 **timecode); - - HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetAncillaryData) + HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( IDeckLinkVideoFrame_v7_6 * This, /* out */ IDeckLinkVideoFrameAncillary **ancillary); - + END_INTERFACE } IDeckLinkVideoFrame_v7_6Vtbl; @@ -14715,44 +16912,44 @@ CONST_VTBL struct IDeckLinkVideoFrame_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoFrame_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoFrame_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoFrame_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoFrame_v7_6_GetWidth(This) \ - ( (This)->lpVtbl -> GetWidth(This) ) + ( (This)->lpVtbl -> GetWidth(This) ) #define IDeckLinkVideoFrame_v7_6_GetHeight(This) \ - ( (This)->lpVtbl -> GetHeight(This) ) + ( (This)->lpVtbl -> GetHeight(This) ) #define IDeckLinkVideoFrame_v7_6_GetRowBytes(This) \ - ( (This)->lpVtbl -> GetRowBytes(This) ) + ( (This)->lpVtbl -> GetRowBytes(This) ) #define IDeckLinkVideoFrame_v7_6_GetPixelFormat(This) \ - ( (This)->lpVtbl -> GetPixelFormat(This) ) + ( (This)->lpVtbl -> GetPixelFormat(This) ) #define IDeckLinkVideoFrame_v7_6_GetFlags(This) \ - ( (This)->lpVtbl -> GetFlags(This) ) + ( (This)->lpVtbl -> GetFlags(This) ) #define IDeckLinkVideoFrame_v7_6_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkVideoFrame_v7_6_GetTimecode(This,format,timecode) \ - ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) + ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) #define IDeckLinkVideoFrame_v7_6_GetAncillaryData(This,ancillary) \ - ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) + ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) #endif /* COBJMACROS */ @@ -14769,94 +16966,108 @@ #define __IDeckLinkMutableVideoFrame_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkMutableVideoFrame_v7_6 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkMutableVideoFrame_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("46FCEE00-B4E6-43D0-91C0-023A7FCEB34F") IDeckLinkMutableVideoFrame_v7_6 : public IDeckLinkVideoFrame_v7_6 { public: - virtual HRESULT STDMETHODCALLTYPE SetFlags( + virtual HRESULT STDMETHODCALLTYPE SetFlags( BMDFrameFlags newFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTimecode( + + virtual HRESULT STDMETHODCALLTYPE SetTimecode( BMDTimecodeFormat format, /* in */ IDeckLinkTimecode_v7_6 *timecode) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTimecodeFromComponents( + + virtual HRESULT STDMETHODCALLTYPE SetTimecodeFromComponents( BMDTimecodeFormat format, unsigned char hours, unsigned char minutes, unsigned char seconds, unsigned char frames, BMDTimecodeFlags flags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetAncillaryData( + + virtual HRESULT STDMETHODCALLTYPE SetAncillaryData( /* in */ IDeckLinkVideoFrameAncillary *ancillary) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkMutableVideoFrame_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkMutableVideoFrame_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkMutableVideoFrame_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkMutableVideoFrame_v7_6 * This); - - long ( STDMETHODCALLTYPE *GetWidth )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetWidth) + long ( STDMETHODCALLTYPE *GetWidth )( IDeckLinkMutableVideoFrame_v7_6 * This); - - long ( STDMETHODCALLTYPE *GetHeight )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetHeight) + long ( STDMETHODCALLTYPE *GetHeight )( IDeckLinkMutableVideoFrame_v7_6 * This); - - long ( STDMETHODCALLTYPE *GetRowBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetRowBytes) + long ( STDMETHODCALLTYPE *GetRowBytes )( IDeckLinkMutableVideoFrame_v7_6 * This); - - BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetPixelFormat) + BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( IDeckLinkMutableVideoFrame_v7_6 * This); - - BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetFlags) + BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( IDeckLinkMutableVideoFrame_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkMutableVideoFrame_v7_6 * This, /* out */ void **buffer); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetTimecode) + HRESULT ( STDMETHODCALLTYPE *GetTimecode )( IDeckLinkMutableVideoFrame_v7_6 * This, BMDTimecodeFormat format, /* out */ IDeckLinkTimecode_v7_6 **timecode); - - HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetAncillaryData) + HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( IDeckLinkMutableVideoFrame_v7_6 * This, /* out */ IDeckLinkVideoFrameAncillary **ancillary); - - HRESULT ( STDMETHODCALLTYPE *SetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkMutableVideoFrame_v7_6, SetFlags) + HRESULT ( STDMETHODCALLTYPE *SetFlags )( IDeckLinkMutableVideoFrame_v7_6 * This, BMDFrameFlags newFlags); - - HRESULT ( STDMETHODCALLTYPE *SetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkMutableVideoFrame_v7_6, SetTimecode) + HRESULT ( STDMETHODCALLTYPE *SetTimecode )( IDeckLinkMutableVideoFrame_v7_6 * This, BMDTimecodeFormat format, /* in */ IDeckLinkTimecode_v7_6 *timecode); - - HRESULT ( STDMETHODCALLTYPE *SetTimecodeFromComponents )( + + DECLSPEC_XFGVIRT(IDeckLinkMutableVideoFrame_v7_6, SetTimecodeFromComponents) + HRESULT ( STDMETHODCALLTYPE *SetTimecodeFromComponents )( IDeckLinkMutableVideoFrame_v7_6 * This, BMDTimecodeFormat format, unsigned char hours, @@ -14864,11 +17075,12 @@ unsigned char seconds, unsigned char frames, BMDTimecodeFlags flags); - - HRESULT ( STDMETHODCALLTYPE *SetAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkMutableVideoFrame_v7_6, SetAncillaryData) + HRESULT ( STDMETHODCALLTYPE *SetAncillaryData )( IDeckLinkMutableVideoFrame_v7_6 * This, /* in */ IDeckLinkVideoFrameAncillary *ancillary); - + END_INTERFACE } IDeckLinkMutableVideoFrame_v7_6Vtbl; @@ -14877,57 +17089,57 @@ CONST_VTBL struct IDeckLinkMutableVideoFrame_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkMutableVideoFrame_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkMutableVideoFrame_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkMutableVideoFrame_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkMutableVideoFrame_v7_6_GetWidth(This) \ - ( (This)->lpVtbl -> GetWidth(This) ) + ( (This)->lpVtbl -> GetWidth(This) ) #define IDeckLinkMutableVideoFrame_v7_6_GetHeight(This) \ - ( (This)->lpVtbl -> GetHeight(This) ) + ( (This)->lpVtbl -> GetHeight(This) ) #define IDeckLinkMutableVideoFrame_v7_6_GetRowBytes(This) \ - ( (This)->lpVtbl -> GetRowBytes(This) ) + ( (This)->lpVtbl -> GetRowBytes(This) ) #define IDeckLinkMutableVideoFrame_v7_6_GetPixelFormat(This) \ - ( (This)->lpVtbl -> GetPixelFormat(This) ) + ( (This)->lpVtbl -> GetPixelFormat(This) ) #define IDeckLinkMutableVideoFrame_v7_6_GetFlags(This) \ - ( (This)->lpVtbl -> GetFlags(This) ) + ( (This)->lpVtbl -> GetFlags(This) ) #define IDeckLinkMutableVideoFrame_v7_6_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkMutableVideoFrame_v7_6_GetTimecode(This,format,timecode) \ - ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) + ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) #define IDeckLinkMutableVideoFrame_v7_6_GetAncillaryData(This,ancillary) \ - ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) + ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) #define IDeckLinkMutableVideoFrame_v7_6_SetFlags(This,newFlags) \ - ( (This)->lpVtbl -> SetFlags(This,newFlags) ) + ( (This)->lpVtbl -> SetFlags(This,newFlags) ) #define IDeckLinkMutableVideoFrame_v7_6_SetTimecode(This,format,timecode) \ - ( (This)->lpVtbl -> SetTimecode(This,format,timecode) ) + ( (This)->lpVtbl -> SetTimecode(This,format,timecode) ) #define IDeckLinkMutableVideoFrame_v7_6_SetTimecodeFromComponents(This,format,hours,minutes,seconds,frames,flags) \ - ( (This)->lpVtbl -> SetTimecodeFromComponents(This,format,hours,minutes,seconds,frames,flags) ) + ( (This)->lpVtbl -> SetTimecodeFromComponents(This,format,hours,minutes,seconds,frames,flags) ) #define IDeckLinkMutableVideoFrame_v7_6_SetAncillaryData(This,ancillary) \ - ( (This)->lpVtbl -> SetAncillaryData(This,ancillary) ) + ( (This)->lpVtbl -> SetAncillaryData(This,ancillary) ) #endif /* COBJMACROS */ @@ -14944,88 +17156,101 @@ #define __IDeckLinkVideoInputFrame_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkVideoInputFrame_v7_6 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkVideoInputFrame_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("9A74FA41-AE9F-47AC-8CF4-01F42DD59965") IDeckLinkVideoInputFrame_v7_6 : public IDeckLinkVideoFrame_v7_6 { public: - virtual HRESULT STDMETHODCALLTYPE GetStreamTime( + virtual HRESULT STDMETHODCALLTYPE GetStreamTime( /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceTimestamp( + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceTimestamp( BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoInputFrame_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoInputFrame_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoInputFrame_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoInputFrame_v7_6 * This); - - long ( STDMETHODCALLTYPE *GetWidth )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetWidth) + long ( STDMETHODCALLTYPE *GetWidth )( IDeckLinkVideoInputFrame_v7_6 * This); - - long ( STDMETHODCALLTYPE *GetHeight )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetHeight) + long ( STDMETHODCALLTYPE *GetHeight )( IDeckLinkVideoInputFrame_v7_6 * This); - - long ( STDMETHODCALLTYPE *GetRowBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetRowBytes) + long ( STDMETHODCALLTYPE *GetRowBytes )( IDeckLinkVideoInputFrame_v7_6 * This); - - BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetPixelFormat) + BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( IDeckLinkVideoInputFrame_v7_6 * This); - - BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetFlags) + BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( IDeckLinkVideoInputFrame_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkVideoInputFrame_v7_6 * This, /* out */ void **buffer); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetTimecode) + HRESULT ( STDMETHODCALLTYPE *GetTimecode )( IDeckLinkVideoInputFrame_v7_6 * This, BMDTimecodeFormat format, /* out */ IDeckLinkTimecode_v7_6 **timecode); - - HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetAncillaryData) + HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( IDeckLinkVideoInputFrame_v7_6 * This, /* out */ IDeckLinkVideoFrameAncillary **ancillary); - - HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoInputFrame_v7_6, GetStreamTime) + HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( IDeckLinkVideoInputFrame_v7_6 * This, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceTimestamp )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoInputFrame_v7_6, GetHardwareReferenceTimestamp) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceTimestamp )( IDeckLinkVideoInputFrame_v7_6 * This, BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration); - + END_INTERFACE } IDeckLinkVideoInputFrame_v7_6Vtbl; @@ -15034,51 +17259,51 @@ CONST_VTBL struct IDeckLinkVideoInputFrame_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoInputFrame_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoInputFrame_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoInputFrame_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoInputFrame_v7_6_GetWidth(This) \ - ( (This)->lpVtbl -> GetWidth(This) ) + ( (This)->lpVtbl -> GetWidth(This) ) #define IDeckLinkVideoInputFrame_v7_6_GetHeight(This) \ - ( (This)->lpVtbl -> GetHeight(This) ) + ( (This)->lpVtbl -> GetHeight(This) ) #define IDeckLinkVideoInputFrame_v7_6_GetRowBytes(This) \ - ( (This)->lpVtbl -> GetRowBytes(This) ) + ( (This)->lpVtbl -> GetRowBytes(This) ) #define IDeckLinkVideoInputFrame_v7_6_GetPixelFormat(This) \ - ( (This)->lpVtbl -> GetPixelFormat(This) ) + ( (This)->lpVtbl -> GetPixelFormat(This) ) #define IDeckLinkVideoInputFrame_v7_6_GetFlags(This) \ - ( (This)->lpVtbl -> GetFlags(This) ) + ( (This)->lpVtbl -> GetFlags(This) ) #define IDeckLinkVideoInputFrame_v7_6_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkVideoInputFrame_v7_6_GetTimecode(This,format,timecode) \ - ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) + ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) #define IDeckLinkVideoInputFrame_v7_6_GetAncillaryData(This,ancillary) \ - ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) + ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) #define IDeckLinkVideoInputFrame_v7_6_GetStreamTime(This,frameTime,frameDuration,timeScale) \ - ( (This)->lpVtbl -> GetStreamTime(This,frameTime,frameDuration,timeScale) ) + ( (This)->lpVtbl -> GetStreamTime(This,frameTime,frameDuration,timeScale) ) #define IDeckLinkVideoInputFrame_v7_6_GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) \ - ( (This)->lpVtbl -> GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) ) + ( (This)->lpVtbl -> GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) ) #endif /* COBJMACROS */ @@ -15095,45 +17320,49 @@ #define __IDeckLinkScreenPreviewCallback_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkScreenPreviewCallback_v7_6 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkScreenPreviewCallback_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("373F499D-4B4D-4518-AD22-6354E5A5825E") IDeckLinkScreenPreviewCallback_v7_6 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DrawFrame( + virtual HRESULT STDMETHODCALLTYPE DrawFrame( /* in */ IDeckLinkVideoFrame_v7_6 *theFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkScreenPreviewCallback_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkScreenPreviewCallback_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkScreenPreviewCallback_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkScreenPreviewCallback_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *DrawFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkScreenPreviewCallback_v7_6, DrawFrame) + HRESULT ( STDMETHODCALLTYPE *DrawFrame )( IDeckLinkScreenPreviewCallback_v7_6 * This, /* in */ IDeckLinkVideoFrame_v7_6 *theFrame); - + END_INTERFACE } IDeckLinkScreenPreviewCallback_v7_6Vtbl; @@ -15142,23 +17371,23 @@ CONST_VTBL struct IDeckLinkScreenPreviewCallback_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkScreenPreviewCallback_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkScreenPreviewCallback_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkScreenPreviewCallback_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkScreenPreviewCallback_v7_6_DrawFrame(This,theFrame) \ - ( (This)->lpVtbl -> DrawFrame(This,theFrame) ) + ( (This)->lpVtbl -> DrawFrame(This,theFrame) ) #endif /* COBJMACROS */ @@ -15175,55 +17404,61 @@ #define __IDeckLinkGLScreenPreviewHelper_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkGLScreenPreviewHelper_v7_6 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkGLScreenPreviewHelper_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("BA575CD9-A15E-497B-B2C2-F9AFE7BE4EBA") IDeckLinkGLScreenPreviewHelper_v7_6 : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE InitializeGL( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE PaintGL( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFrame( + + virtual HRESULT STDMETHODCALLTYPE SetFrame( /* in */ IDeckLinkVideoFrame_v7_6 *theFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkGLScreenPreviewHelper_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkGLScreenPreviewHelper_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkGLScreenPreviewHelper_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkGLScreenPreviewHelper_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *InitializeGL )( + + DECLSPEC_XFGVIRT(IDeckLinkGLScreenPreviewHelper_v7_6, InitializeGL) + HRESULT ( STDMETHODCALLTYPE *InitializeGL )( IDeckLinkGLScreenPreviewHelper_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *PaintGL )( + + DECLSPEC_XFGVIRT(IDeckLinkGLScreenPreviewHelper_v7_6, PaintGL) + HRESULT ( STDMETHODCALLTYPE *PaintGL )( IDeckLinkGLScreenPreviewHelper_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *SetFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkGLScreenPreviewHelper_v7_6, SetFrame) + HRESULT ( STDMETHODCALLTYPE *SetFrame )( IDeckLinkGLScreenPreviewHelper_v7_6 * This, /* in */ IDeckLinkVideoFrame_v7_6 *theFrame); - + END_INTERFACE } IDeckLinkGLScreenPreviewHelper_v7_6Vtbl; @@ -15232,29 +17467,29 @@ CONST_VTBL struct IDeckLinkGLScreenPreviewHelper_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkGLScreenPreviewHelper_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkGLScreenPreviewHelper_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkGLScreenPreviewHelper_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkGLScreenPreviewHelper_v7_6_InitializeGL(This) \ - ( (This)->lpVtbl -> InitializeGL(This) ) + ( (This)->lpVtbl -> InitializeGL(This) ) #define IDeckLinkGLScreenPreviewHelper_v7_6_PaintGL(This) \ - ( (This)->lpVtbl -> PaintGL(This) ) + ( (This)->lpVtbl -> PaintGL(This) ) #define IDeckLinkGLScreenPreviewHelper_v7_6_SetFrame(This,theFrame) \ - ( (This)->lpVtbl -> SetFrame(This,theFrame) ) + ( (This)->lpVtbl -> SetFrame(This,theFrame) ) #endif /* COBJMACROS */ @@ -15271,47 +17506,51 @@ #define __IDeckLinkVideoConversion_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkVideoConversion_v7_6 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkVideoConversion_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("3EB504C9-F97D-40FE-A158-D407D48CB53B") IDeckLinkVideoConversion_v7_6 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE ConvertFrame( + virtual HRESULT STDMETHODCALLTYPE ConvertFrame( /* in */ IDeckLinkVideoFrame_v7_6 *srcFrame, /* in */ IDeckLinkVideoFrame_v7_6 *dstFrame) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoConversion_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoConversion_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoConversion_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoConversion_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *ConvertFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoConversion_v7_6, ConvertFrame) + HRESULT ( STDMETHODCALLTYPE *ConvertFrame )( IDeckLinkVideoConversion_v7_6 * This, /* in */ IDeckLinkVideoFrame_v7_6 *srcFrame, /* in */ IDeckLinkVideoFrame_v7_6 *dstFrame); - + END_INTERFACE } IDeckLinkVideoConversion_v7_6Vtbl; @@ -15320,23 +17559,23 @@ CONST_VTBL struct IDeckLinkVideoConversion_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoConversion_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoConversion_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoConversion_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoConversion_v7_6_ConvertFrame(This,srcFrame,dstFrame) \ - ( (This)->lpVtbl -> ConvertFrame(This,srcFrame,dstFrame) ) + ( (This)->lpVtbl -> ConvertFrame(This,srcFrame,dstFrame) ) #endif /* COBJMACROS */ @@ -15353,246 +17592,277 @@ #define __IDeckLinkConfiguration_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkConfiguration_v7_6 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkConfiguration_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("B8EAD569-B764-47F0-A73F-AE40DF6CBF10") IDeckLinkConfiguration_v7_6 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetConfigurationValidator( + virtual HRESULT STDMETHODCALLTYPE GetConfigurationValidator( /* out */ IDeckLinkConfiguration_v7_6 **configObject) = 0; - + virtual HRESULT STDMETHODCALLTYPE WriteConfigurationToPreferences( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFormat( + + virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFormat( /* in */ BMDVideoConnection_v7_6 videoOutputConnection) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsVideoOutputActive( + + virtual HRESULT STDMETHODCALLTYPE IsVideoOutputActive( /* in */ BMDVideoConnection_v7_6 videoOutputConnection, /* out */ BOOL *active) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetAnalogVideoOutputFlags( + + virtual HRESULT STDMETHODCALLTYPE SetAnalogVideoOutputFlags( /* in */ BMDAnalogVideoFlags analogVideoFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAnalogVideoOutputFlags( + + virtual HRESULT STDMETHODCALLTYPE GetAnalogVideoOutputFlags( /* out */ BMDAnalogVideoFlags *analogVideoFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableFieldFlickerRemovalWhenPaused( + + virtual HRESULT STDMETHODCALLTYPE EnableFieldFlickerRemovalWhenPaused( /* in */ BOOL enable) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsEnabledFieldFlickerRemovalWhenPaused( + + virtual HRESULT STDMETHODCALLTYPE IsEnabledFieldFlickerRemovalWhenPaused( /* out */ BOOL *enabled) = 0; - - virtual HRESULT STDMETHODCALLTYPE Set444And3GBpsVideoOutput( + + virtual HRESULT STDMETHODCALLTYPE Set444And3GBpsVideoOutput( /* in */ BOOL enable444VideoOutput, /* in */ BOOL enable3GbsOutput) = 0; - - virtual HRESULT STDMETHODCALLTYPE Get444And3GBpsVideoOutput( + + virtual HRESULT STDMETHODCALLTYPE Get444And3GBpsVideoOutput( /* out */ BOOL *is444VideoOutputEnabled, /* out */ BOOL *threeGbsOutputEnabled) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoOutputConversionMode( + + virtual HRESULT STDMETHODCALLTYPE SetVideoOutputConversionMode( /* in */ BMDVideoOutputConversionMode conversionMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVideoOutputConversionMode( + + virtual HRESULT STDMETHODCALLTYPE GetVideoOutputConversionMode( /* out */ BMDVideoOutputConversionMode *conversionMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE Set_HD1080p24_to_HD1080i5994_Conversion( + + virtual HRESULT STDMETHODCALLTYPE Set_HD1080p24_to_HD1080i5994_Conversion( /* in */ BOOL enable) = 0; - - virtual HRESULT STDMETHODCALLTYPE Get_HD1080p24_to_HD1080i5994_Conversion( + + virtual HRESULT STDMETHODCALLTYPE Get_HD1080p24_to_HD1080i5994_Conversion( /* out */ BOOL *enabled) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoInputFormat( + + virtual HRESULT STDMETHODCALLTYPE SetVideoInputFormat( /* in */ BMDVideoConnection_v7_6 videoInputFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVideoInputFormat( + + virtual HRESULT STDMETHODCALLTYPE GetVideoInputFormat( /* out */ BMDVideoConnection_v7_6 *videoInputFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetAnalogVideoInputFlags( + + virtual HRESULT STDMETHODCALLTYPE SetAnalogVideoInputFlags( /* in */ BMDAnalogVideoFlags analogVideoFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAnalogVideoInputFlags( + + virtual HRESULT STDMETHODCALLTYPE GetAnalogVideoInputFlags( /* out */ BMDAnalogVideoFlags *analogVideoFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoInputConversionMode( + + virtual HRESULT STDMETHODCALLTYPE SetVideoInputConversionMode( /* in */ BMDVideoInputConversionMode conversionMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVideoInputConversionMode( + + virtual HRESULT STDMETHODCALLTYPE GetVideoInputConversionMode( /* out */ BMDVideoInputConversionMode *conversionMode) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetBlackVideoOutputDuringCapture( + + virtual HRESULT STDMETHODCALLTYPE SetBlackVideoOutputDuringCapture( /* in */ BOOL blackOutInCapture) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBlackVideoOutputDuringCapture( + + virtual HRESULT STDMETHODCALLTYPE GetBlackVideoOutputDuringCapture( /* out */ BOOL *blackOutInCapture) = 0; - - virtual HRESULT STDMETHODCALLTYPE Set32PulldownSequenceInitialTimecodeFrame( + + virtual HRESULT STDMETHODCALLTYPE Set32PulldownSequenceInitialTimecodeFrame( /* in */ unsigned int aFrameTimecode) = 0; - - virtual HRESULT STDMETHODCALLTYPE Get32PulldownSequenceInitialTimecodeFrame( + + virtual HRESULT STDMETHODCALLTYPE Get32PulldownSequenceInitialTimecodeFrame( /* out */ unsigned int *aFrameTimecode) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVancSourceLineMapping( + + virtual HRESULT STDMETHODCALLTYPE SetVancSourceLineMapping( /* in */ unsigned int activeLine1VANCsource, /* in */ unsigned int activeLine2VANCsource, /* in */ unsigned int activeLine3VANCsource) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetVancSourceLineMapping( + + virtual HRESULT STDMETHODCALLTYPE GetVancSourceLineMapping( /* out */ unsigned int *activeLine1VANCsource, /* out */ unsigned int *activeLine2VANCsource, /* out */ unsigned int *activeLine3VANCsource) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetAudioInputFormat( + + virtual HRESULT STDMETHODCALLTYPE SetAudioInputFormat( /* in */ BMDAudioConnection_v10_2 audioInputFormat) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAudioInputFormat( + + virtual HRESULT STDMETHODCALLTYPE GetAudioInputFormat( /* out */ BMDAudioConnection_v10_2 *audioInputFormat) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkConfiguration_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkConfiguration_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkConfiguration_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkConfiguration_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *GetConfigurationValidator )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, GetConfigurationValidator) + HRESULT ( STDMETHODCALLTYPE *GetConfigurationValidator )( IDeckLinkConfiguration_v7_6 * This, /* out */ IDeckLinkConfiguration_v7_6 **configObject); - - HRESULT ( STDMETHODCALLTYPE *WriteConfigurationToPreferences )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, WriteConfigurationToPreferences) + HRESULT ( STDMETHODCALLTYPE *WriteConfigurationToPreferences )( IDeckLinkConfiguration_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, SetVideoOutputFormat) + HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFormat )( IDeckLinkConfiguration_v7_6 * This, /* in */ BMDVideoConnection_v7_6 videoOutputConnection); - - HRESULT ( STDMETHODCALLTYPE *IsVideoOutputActive )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, IsVideoOutputActive) + HRESULT ( STDMETHODCALLTYPE *IsVideoOutputActive )( IDeckLinkConfiguration_v7_6 * This, /* in */ BMDVideoConnection_v7_6 videoOutputConnection, /* out */ BOOL *active); - - HRESULT ( STDMETHODCALLTYPE *SetAnalogVideoOutputFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, SetAnalogVideoOutputFlags) + HRESULT ( STDMETHODCALLTYPE *SetAnalogVideoOutputFlags )( IDeckLinkConfiguration_v7_6 * This, /* in */ BMDAnalogVideoFlags analogVideoFlags); - - HRESULT ( STDMETHODCALLTYPE *GetAnalogVideoOutputFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, GetAnalogVideoOutputFlags) + HRESULT ( STDMETHODCALLTYPE *GetAnalogVideoOutputFlags )( IDeckLinkConfiguration_v7_6 * This, /* out */ BMDAnalogVideoFlags *analogVideoFlags); - - HRESULT ( STDMETHODCALLTYPE *EnableFieldFlickerRemovalWhenPaused )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, EnableFieldFlickerRemovalWhenPaused) + HRESULT ( STDMETHODCALLTYPE *EnableFieldFlickerRemovalWhenPaused )( IDeckLinkConfiguration_v7_6 * This, /* in */ BOOL enable); - - HRESULT ( STDMETHODCALLTYPE *IsEnabledFieldFlickerRemovalWhenPaused )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, IsEnabledFieldFlickerRemovalWhenPaused) + HRESULT ( STDMETHODCALLTYPE *IsEnabledFieldFlickerRemovalWhenPaused )( IDeckLinkConfiguration_v7_6 * This, /* out */ BOOL *enabled); - - HRESULT ( STDMETHODCALLTYPE *Set444And3GBpsVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, Set444And3GBpsVideoOutput) + HRESULT ( STDMETHODCALLTYPE *Set444And3GBpsVideoOutput )( IDeckLinkConfiguration_v7_6 * This, /* in */ BOOL enable444VideoOutput, /* in */ BOOL enable3GbsOutput); - - HRESULT ( STDMETHODCALLTYPE *Get444And3GBpsVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, Get444And3GBpsVideoOutput) + HRESULT ( STDMETHODCALLTYPE *Get444And3GBpsVideoOutput )( IDeckLinkConfiguration_v7_6 * This, /* out */ BOOL *is444VideoOutputEnabled, /* out */ BOOL *threeGbsOutputEnabled); - - HRESULT ( STDMETHODCALLTYPE *SetVideoOutputConversionMode )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, SetVideoOutputConversionMode) + HRESULT ( STDMETHODCALLTYPE *SetVideoOutputConversionMode )( IDeckLinkConfiguration_v7_6 * This, /* in */ BMDVideoOutputConversionMode conversionMode); - - HRESULT ( STDMETHODCALLTYPE *GetVideoOutputConversionMode )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, GetVideoOutputConversionMode) + HRESULT ( STDMETHODCALLTYPE *GetVideoOutputConversionMode )( IDeckLinkConfiguration_v7_6 * This, /* out */ BMDVideoOutputConversionMode *conversionMode); - - HRESULT ( STDMETHODCALLTYPE *Set_HD1080p24_to_HD1080i5994_Conversion )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, Set_HD1080p24_to_HD1080i5994_Conversion) + HRESULT ( STDMETHODCALLTYPE *Set_HD1080p24_to_HD1080i5994_Conversion )( IDeckLinkConfiguration_v7_6 * This, /* in */ BOOL enable); - - HRESULT ( STDMETHODCALLTYPE *Get_HD1080p24_to_HD1080i5994_Conversion )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, Get_HD1080p24_to_HD1080i5994_Conversion) + HRESULT ( STDMETHODCALLTYPE *Get_HD1080p24_to_HD1080i5994_Conversion )( IDeckLinkConfiguration_v7_6 * This, /* out */ BOOL *enabled); - - HRESULT ( STDMETHODCALLTYPE *SetVideoInputFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, SetVideoInputFormat) + HRESULT ( STDMETHODCALLTYPE *SetVideoInputFormat )( IDeckLinkConfiguration_v7_6 * This, /* in */ BMDVideoConnection_v7_6 videoInputFormat); - - HRESULT ( STDMETHODCALLTYPE *GetVideoInputFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, GetVideoInputFormat) + HRESULT ( STDMETHODCALLTYPE *GetVideoInputFormat )( IDeckLinkConfiguration_v7_6 * This, /* out */ BMDVideoConnection_v7_6 *videoInputFormat); - - HRESULT ( STDMETHODCALLTYPE *SetAnalogVideoInputFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, SetAnalogVideoInputFlags) + HRESULT ( STDMETHODCALLTYPE *SetAnalogVideoInputFlags )( IDeckLinkConfiguration_v7_6 * This, /* in */ BMDAnalogVideoFlags analogVideoFlags); - - HRESULT ( STDMETHODCALLTYPE *GetAnalogVideoInputFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, GetAnalogVideoInputFlags) + HRESULT ( STDMETHODCALLTYPE *GetAnalogVideoInputFlags )( IDeckLinkConfiguration_v7_6 * This, /* out */ BMDAnalogVideoFlags *analogVideoFlags); - - HRESULT ( STDMETHODCALLTYPE *SetVideoInputConversionMode )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, SetVideoInputConversionMode) + HRESULT ( STDMETHODCALLTYPE *SetVideoInputConversionMode )( IDeckLinkConfiguration_v7_6 * This, /* in */ BMDVideoInputConversionMode conversionMode); - - HRESULT ( STDMETHODCALLTYPE *GetVideoInputConversionMode )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, GetVideoInputConversionMode) + HRESULT ( STDMETHODCALLTYPE *GetVideoInputConversionMode )( IDeckLinkConfiguration_v7_6 * This, /* out */ BMDVideoInputConversionMode *conversionMode); - - HRESULT ( STDMETHODCALLTYPE *SetBlackVideoOutputDuringCapture )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, SetBlackVideoOutputDuringCapture) + HRESULT ( STDMETHODCALLTYPE *SetBlackVideoOutputDuringCapture )( IDeckLinkConfiguration_v7_6 * This, /* in */ BOOL blackOutInCapture); - - HRESULT ( STDMETHODCALLTYPE *GetBlackVideoOutputDuringCapture )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, GetBlackVideoOutputDuringCapture) + HRESULT ( STDMETHODCALLTYPE *GetBlackVideoOutputDuringCapture )( IDeckLinkConfiguration_v7_6 * This, /* out */ BOOL *blackOutInCapture); - - HRESULT ( STDMETHODCALLTYPE *Set32PulldownSequenceInitialTimecodeFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, Set32PulldownSequenceInitialTimecodeFrame) + HRESULT ( STDMETHODCALLTYPE *Set32PulldownSequenceInitialTimecodeFrame )( IDeckLinkConfiguration_v7_6 * This, /* in */ unsigned int aFrameTimecode); - - HRESULT ( STDMETHODCALLTYPE *Get32PulldownSequenceInitialTimecodeFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, Get32PulldownSequenceInitialTimecodeFrame) + HRESULT ( STDMETHODCALLTYPE *Get32PulldownSequenceInitialTimecodeFrame )( IDeckLinkConfiguration_v7_6 * This, /* out */ unsigned int *aFrameTimecode); - - HRESULT ( STDMETHODCALLTYPE *SetVancSourceLineMapping )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, SetVancSourceLineMapping) + HRESULT ( STDMETHODCALLTYPE *SetVancSourceLineMapping )( IDeckLinkConfiguration_v7_6 * This, /* in */ unsigned int activeLine1VANCsource, /* in */ unsigned int activeLine2VANCsource, /* in */ unsigned int activeLine3VANCsource); - - HRESULT ( STDMETHODCALLTYPE *GetVancSourceLineMapping )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, GetVancSourceLineMapping) + HRESULT ( STDMETHODCALLTYPE *GetVancSourceLineMapping )( IDeckLinkConfiguration_v7_6 * This, /* out */ unsigned int *activeLine1VANCsource, /* out */ unsigned int *activeLine2VANCsource, /* out */ unsigned int *activeLine3VANCsource); - - HRESULT ( STDMETHODCALLTYPE *SetAudioInputFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, SetAudioInputFormat) + HRESULT ( STDMETHODCALLTYPE *SetAudioInputFormat )( IDeckLinkConfiguration_v7_6 * This, /* in */ BMDAudioConnection_v10_2 audioInputFormat); - - HRESULT ( STDMETHODCALLTYPE *GetAudioInputFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkConfiguration_v7_6, GetAudioInputFormat) + HRESULT ( STDMETHODCALLTYPE *GetAudioInputFormat )( IDeckLinkConfiguration_v7_6 * This, /* out */ BMDAudioConnection_v10_2 *audioInputFormat); - + END_INTERFACE } IDeckLinkConfiguration_v7_6Vtbl; @@ -15601,104 +17871,104 @@ CONST_VTBL struct IDeckLinkConfiguration_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkConfiguration_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkConfiguration_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkConfiguration_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkConfiguration_v7_6_GetConfigurationValidator(This,configObject) \ - ( (This)->lpVtbl -> GetConfigurationValidator(This,configObject) ) + ( (This)->lpVtbl -> GetConfigurationValidator(This,configObject) ) #define IDeckLinkConfiguration_v7_6_WriteConfigurationToPreferences(This) \ - ( (This)->lpVtbl -> WriteConfigurationToPreferences(This) ) + ( (This)->lpVtbl -> WriteConfigurationToPreferences(This) ) #define IDeckLinkConfiguration_v7_6_SetVideoOutputFormat(This,videoOutputConnection) \ - ( (This)->lpVtbl -> SetVideoOutputFormat(This,videoOutputConnection) ) + ( (This)->lpVtbl -> SetVideoOutputFormat(This,videoOutputConnection) ) #define IDeckLinkConfiguration_v7_6_IsVideoOutputActive(This,videoOutputConnection,active) \ - ( (This)->lpVtbl -> IsVideoOutputActive(This,videoOutputConnection,active) ) + ( (This)->lpVtbl -> IsVideoOutputActive(This,videoOutputConnection,active) ) #define IDeckLinkConfiguration_v7_6_SetAnalogVideoOutputFlags(This,analogVideoFlags) \ - ( (This)->lpVtbl -> SetAnalogVideoOutputFlags(This,analogVideoFlags) ) + ( (This)->lpVtbl -> SetAnalogVideoOutputFlags(This,analogVideoFlags) ) #define IDeckLinkConfiguration_v7_6_GetAnalogVideoOutputFlags(This,analogVideoFlags) \ - ( (This)->lpVtbl -> GetAnalogVideoOutputFlags(This,analogVideoFlags) ) + ( (This)->lpVtbl -> GetAnalogVideoOutputFlags(This,analogVideoFlags) ) #define IDeckLinkConfiguration_v7_6_EnableFieldFlickerRemovalWhenPaused(This,enable) \ - ( (This)->lpVtbl -> EnableFieldFlickerRemovalWhenPaused(This,enable) ) + ( (This)->lpVtbl -> EnableFieldFlickerRemovalWhenPaused(This,enable) ) #define IDeckLinkConfiguration_v7_6_IsEnabledFieldFlickerRemovalWhenPaused(This,enabled) \ - ( (This)->lpVtbl -> IsEnabledFieldFlickerRemovalWhenPaused(This,enabled) ) + ( (This)->lpVtbl -> IsEnabledFieldFlickerRemovalWhenPaused(This,enabled) ) #define IDeckLinkConfiguration_v7_6_Set444And3GBpsVideoOutput(This,enable444VideoOutput,enable3GbsOutput) \ - ( (This)->lpVtbl -> Set444And3GBpsVideoOutput(This,enable444VideoOutput,enable3GbsOutput) ) + ( (This)->lpVtbl -> Set444And3GBpsVideoOutput(This,enable444VideoOutput,enable3GbsOutput) ) #define IDeckLinkConfiguration_v7_6_Get444And3GBpsVideoOutput(This,is444VideoOutputEnabled,threeGbsOutputEnabled) \ - ( (This)->lpVtbl -> Get444And3GBpsVideoOutput(This,is444VideoOutputEnabled,threeGbsOutputEnabled) ) + ( (This)->lpVtbl -> Get444And3GBpsVideoOutput(This,is444VideoOutputEnabled,threeGbsOutputEnabled) ) #define IDeckLinkConfiguration_v7_6_SetVideoOutputConversionMode(This,conversionMode) \ - ( (This)->lpVtbl -> SetVideoOutputConversionMode(This,conversionMode) ) + ( (This)->lpVtbl -> SetVideoOutputConversionMode(This,conversionMode) ) #define IDeckLinkConfiguration_v7_6_GetVideoOutputConversionMode(This,conversionMode) \ - ( (This)->lpVtbl -> GetVideoOutputConversionMode(This,conversionMode) ) + ( (This)->lpVtbl -> GetVideoOutputConversionMode(This,conversionMode) ) #define IDeckLinkConfiguration_v7_6_Set_HD1080p24_to_HD1080i5994_Conversion(This,enable) \ - ( (This)->lpVtbl -> Set_HD1080p24_to_HD1080i5994_Conversion(This,enable) ) + ( (This)->lpVtbl -> Set_HD1080p24_to_HD1080i5994_Conversion(This,enable) ) #define IDeckLinkConfiguration_v7_6_Get_HD1080p24_to_HD1080i5994_Conversion(This,enabled) \ - ( (This)->lpVtbl -> Get_HD1080p24_to_HD1080i5994_Conversion(This,enabled) ) + ( (This)->lpVtbl -> Get_HD1080p24_to_HD1080i5994_Conversion(This,enabled) ) #define IDeckLinkConfiguration_v7_6_SetVideoInputFormat(This,videoInputFormat) \ - ( (This)->lpVtbl -> SetVideoInputFormat(This,videoInputFormat) ) + ( (This)->lpVtbl -> SetVideoInputFormat(This,videoInputFormat) ) #define IDeckLinkConfiguration_v7_6_GetVideoInputFormat(This,videoInputFormat) \ - ( (This)->lpVtbl -> GetVideoInputFormat(This,videoInputFormat) ) + ( (This)->lpVtbl -> GetVideoInputFormat(This,videoInputFormat) ) #define IDeckLinkConfiguration_v7_6_SetAnalogVideoInputFlags(This,analogVideoFlags) \ - ( (This)->lpVtbl -> SetAnalogVideoInputFlags(This,analogVideoFlags) ) + ( (This)->lpVtbl -> SetAnalogVideoInputFlags(This,analogVideoFlags) ) #define IDeckLinkConfiguration_v7_6_GetAnalogVideoInputFlags(This,analogVideoFlags) \ - ( (This)->lpVtbl -> GetAnalogVideoInputFlags(This,analogVideoFlags) ) + ( (This)->lpVtbl -> GetAnalogVideoInputFlags(This,analogVideoFlags) ) #define IDeckLinkConfiguration_v7_6_SetVideoInputConversionMode(This,conversionMode) \ - ( (This)->lpVtbl -> SetVideoInputConversionMode(This,conversionMode) ) + ( (This)->lpVtbl -> SetVideoInputConversionMode(This,conversionMode) ) #define IDeckLinkConfiguration_v7_6_GetVideoInputConversionMode(This,conversionMode) \ - ( (This)->lpVtbl -> GetVideoInputConversionMode(This,conversionMode) ) + ( (This)->lpVtbl -> GetVideoInputConversionMode(This,conversionMode) ) #define IDeckLinkConfiguration_v7_6_SetBlackVideoOutputDuringCapture(This,blackOutInCapture) \ - ( (This)->lpVtbl -> SetBlackVideoOutputDuringCapture(This,blackOutInCapture) ) + ( (This)->lpVtbl -> SetBlackVideoOutputDuringCapture(This,blackOutInCapture) ) #define IDeckLinkConfiguration_v7_6_GetBlackVideoOutputDuringCapture(This,blackOutInCapture) \ - ( (This)->lpVtbl -> GetBlackVideoOutputDuringCapture(This,blackOutInCapture) ) + ( (This)->lpVtbl -> GetBlackVideoOutputDuringCapture(This,blackOutInCapture) ) #define IDeckLinkConfiguration_v7_6_Set32PulldownSequenceInitialTimecodeFrame(This,aFrameTimecode) \ - ( (This)->lpVtbl -> Set32PulldownSequenceInitialTimecodeFrame(This,aFrameTimecode) ) + ( (This)->lpVtbl -> Set32PulldownSequenceInitialTimecodeFrame(This,aFrameTimecode) ) #define IDeckLinkConfiguration_v7_6_Get32PulldownSequenceInitialTimecodeFrame(This,aFrameTimecode) \ - ( (This)->lpVtbl -> Get32PulldownSequenceInitialTimecodeFrame(This,aFrameTimecode) ) + ( (This)->lpVtbl -> Get32PulldownSequenceInitialTimecodeFrame(This,aFrameTimecode) ) #define IDeckLinkConfiguration_v7_6_SetVancSourceLineMapping(This,activeLine1VANCsource,activeLine2VANCsource,activeLine3VANCsource) \ - ( (This)->lpVtbl -> SetVancSourceLineMapping(This,activeLine1VANCsource,activeLine2VANCsource,activeLine3VANCsource) ) + ( (This)->lpVtbl -> SetVancSourceLineMapping(This,activeLine1VANCsource,activeLine2VANCsource,activeLine3VANCsource) ) #define IDeckLinkConfiguration_v7_6_GetVancSourceLineMapping(This,activeLine1VANCsource,activeLine2VANCsource,activeLine3VANCsource) \ - ( (This)->lpVtbl -> GetVancSourceLineMapping(This,activeLine1VANCsource,activeLine2VANCsource,activeLine3VANCsource) ) + ( (This)->lpVtbl -> GetVancSourceLineMapping(This,activeLine1VANCsource,activeLine2VANCsource,activeLine3VANCsource) ) #define IDeckLinkConfiguration_v7_6_SetAudioInputFormat(This,audioInputFormat) \ - ( (This)->lpVtbl -> SetAudioInputFormat(This,audioInputFormat) ) + ( (This)->lpVtbl -> SetAudioInputFormat(This,audioInputFormat) ) #define IDeckLinkConfiguration_v7_6_GetAudioInputFormat(This,audioInputFormat) \ - ( (This)->lpVtbl -> GetAudioInputFormat(This,audioInputFormat) ) + ( (This)->lpVtbl -> GetAudioInputFormat(This,audioInputFormat) ) #endif /* COBJMACROS */ @@ -15715,52 +17985,57 @@ #define __IDeckLinkVideoOutputCallback_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkVideoOutputCallback_v7_6 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkVideoOutputCallback_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("E763A626-4A3C-49D1-BF13-E7AD3692AE52") IDeckLinkVideoOutputCallback_v7_6 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE ScheduledFrameCompleted( + virtual HRESULT STDMETHODCALLTYPE ScheduledFrameCompleted( /* in */ IDeckLinkVideoFrame_v7_6 *completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0; - + virtual HRESULT STDMETHODCALLTYPE ScheduledPlaybackHasStopped( void) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoOutputCallback_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoOutputCallback_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoOutputCallback_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoOutputCallback_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *ScheduledFrameCompleted )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoOutputCallback_v7_6, ScheduledFrameCompleted) + HRESULT ( STDMETHODCALLTYPE *ScheduledFrameCompleted )( IDeckLinkVideoOutputCallback_v7_6 * This, /* in */ IDeckLinkVideoFrame_v7_6 *completedFrame, /* in */ BMDOutputFrameCompletionResult result); - - HRESULT ( STDMETHODCALLTYPE *ScheduledPlaybackHasStopped )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoOutputCallback_v7_6, ScheduledPlaybackHasStopped) + HRESULT ( STDMETHODCALLTYPE *ScheduledPlaybackHasStopped )( IDeckLinkVideoOutputCallback_v7_6 * This); - + END_INTERFACE } IDeckLinkVideoOutputCallback_v7_6Vtbl; @@ -15769,26 +18044,26 @@ CONST_VTBL struct IDeckLinkVideoOutputCallback_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoOutputCallback_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoOutputCallback_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoOutputCallback_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoOutputCallback_v7_6_ScheduledFrameCompleted(This,completedFrame,result) \ - ( (This)->lpVtbl -> ScheduledFrameCompleted(This,completedFrame,result) ) + ( (This)->lpVtbl -> ScheduledFrameCompleted(This,completedFrame,result) ) #define IDeckLinkVideoOutputCallback_v7_6_ScheduledPlaybackHasStopped(This) \ - ( (This)->lpVtbl -> ScheduledPlaybackHasStopped(This) ) + ( (This)->lpVtbl -> ScheduledPlaybackHasStopped(This) ) #endif /* COBJMACROS */ @@ -15805,58 +18080,63 @@ #define __IDeckLinkInputCallback_v7_6_INTERFACE_DEFINED__ /* interface IDeckLinkInputCallback_v7_6 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkInputCallback_v7_6; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("31D28EE7-88B6-4CB1-897A-CDBF79A26414") IDeckLinkInputCallback_v7_6 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged( + virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged( /* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode_v7_6 *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived( + + virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived( /* in */ IDeckLinkVideoInputFrame_v7_6 *videoFrame, /* in */ IDeckLinkAudioInputPacket *audioPacket) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkInputCallback_v7_6Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkInputCallback_v7_6 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkInputCallback_v7_6 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkInputCallback_v7_6 * This); - - HRESULT ( STDMETHODCALLTYPE *VideoInputFormatChanged )( + + DECLSPEC_XFGVIRT(IDeckLinkInputCallback_v7_6, VideoInputFormatChanged) + HRESULT ( STDMETHODCALLTYPE *VideoInputFormatChanged )( IDeckLinkInputCallback_v7_6 * This, /* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode_v7_6 *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags); - - HRESULT ( STDMETHODCALLTYPE *VideoInputFrameArrived )( + + DECLSPEC_XFGVIRT(IDeckLinkInputCallback_v7_6, VideoInputFrameArrived) + HRESULT ( STDMETHODCALLTYPE *VideoInputFrameArrived )( IDeckLinkInputCallback_v7_6 * This, /* in */ IDeckLinkVideoInputFrame_v7_6 *videoFrame, /* in */ IDeckLinkAudioInputPacket *audioPacket); - + END_INTERFACE } IDeckLinkInputCallback_v7_6Vtbl; @@ -15865,26 +18145,26 @@ CONST_VTBL struct IDeckLinkInputCallback_v7_6Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkInputCallback_v7_6_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkInputCallback_v7_6_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkInputCallback_v7_6_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkInputCallback_v7_6_VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) \ - ( (This)->lpVtbl -> VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) ) + ( (This)->lpVtbl -> VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) ) #define IDeckLinkInputCallback_v7_6_VideoInputFrameArrived(This,videoFrame,audioPacket) \ - ( (This)->lpVtbl -> VideoInputFrameArrived(This,videoFrame,audioPacket) ) + ( (This)->lpVtbl -> VideoInputFrameArrived(This,videoFrame,audioPacket) ) #endif /* COBJMACROS */ @@ -15917,58 +18197,63 @@ #define __IDeckLinkInputCallback_v7_3_INTERFACE_DEFINED__ /* interface IDeckLinkInputCallback_v7_3 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkInputCallback_v7_3; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("FD6F311D-4D00-444B-9ED4-1F25B5730AD0") IDeckLinkInputCallback_v7_3 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged( + virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged( /* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode_v7_6 *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; - - virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived( + + virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived( /* in */ IDeckLinkVideoInputFrame_v7_3 *videoFrame, /* in */ IDeckLinkAudioInputPacket *audioPacket) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkInputCallback_v7_3Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkInputCallback_v7_3 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkInputCallback_v7_3 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkInputCallback_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *VideoInputFormatChanged )( + + DECLSPEC_XFGVIRT(IDeckLinkInputCallback_v7_3, VideoInputFormatChanged) + HRESULT ( STDMETHODCALLTYPE *VideoInputFormatChanged )( IDeckLinkInputCallback_v7_3 * This, /* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode_v7_6 *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags); - - HRESULT ( STDMETHODCALLTYPE *VideoInputFrameArrived )( + + DECLSPEC_XFGVIRT(IDeckLinkInputCallback_v7_3, VideoInputFrameArrived) + HRESULT ( STDMETHODCALLTYPE *VideoInputFrameArrived )( IDeckLinkInputCallback_v7_3 * This, /* in */ IDeckLinkVideoInputFrame_v7_3 *videoFrame, /* in */ IDeckLinkAudioInputPacket *audioPacket); - + END_INTERFACE } IDeckLinkInputCallback_v7_3Vtbl; @@ -15977,26 +18262,26 @@ CONST_VTBL struct IDeckLinkInputCallback_v7_3Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkInputCallback_v7_3_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkInputCallback_v7_3_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkInputCallback_v7_3_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkInputCallback_v7_3_VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) \ - ( (This)->lpVtbl -> VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) ) + ( (This)->lpVtbl -> VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) ) #define IDeckLinkInputCallback_v7_3_VideoInputFrameArrived(This,videoFrame,audioPacket) \ - ( (This)->lpVtbl -> VideoInputFrameArrived(This,videoFrame,audioPacket) ) + ( (This)->lpVtbl -> VideoInputFrameArrived(This,videoFrame,audioPacket) ) #endif /* COBJMACROS */ @@ -16013,161 +18298,171 @@ #define __IDeckLinkOutput_v7_3_INTERFACE_DEFINED__ /* interface IDeckLinkOutput_v7_3 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkOutput_v7_3; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("271C65E3-C323-4344-A30F-D908BCB20AA3") IDeckLinkOutput_v7_3 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport_v10_11 *result) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( /* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( BMDDisplayMode displayMode, BMDVideoOutputFlags flags) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoOutput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( + + virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( /* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( + + virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( int width, int height, int rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame_v7_6 **outFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateAncillaryData( + + virtual HRESULT STDMETHODCALLTYPE CreateAncillaryData( BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( + + virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( /* in */ IDeckLinkVideoFrame_v7_6 *theFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( + + virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( /* in */ IDeckLinkVideoFrame_v7_6 *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( /* in */ IDeckLinkVideoOutputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferedVideoFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetBufferedVideoFrameCount( /* out */ unsigned int *bufferedFrameCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount, BMDAudioOutputStreamType streamType) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioOutput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( + + virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( /* in */ void *buffer, unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesWritten) = 0; - + virtual HRESULT STDMETHODCALLTYPE BeginAudioPreroll( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE EndAudioPreroll( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( + + virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( /* in */ void *buffer, unsigned int sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, /* out */ unsigned int *sampleFramesWritten) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( /* out */ unsigned int *bufferedSampleFrameCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE FlushBufferedAudioSamples( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( + + virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( /* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( + + virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed) = 0; - - virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( + + virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsScheduledPlaybackRunning( + + virtual HRESULT STDMETHODCALLTYPE IsScheduledPlaybackRunning( /* out */ BOOL *active) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *elapsedTimeSinceSchedulerBegan) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkOutput_v7_3Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkOutput_v7_3 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkOutput_v7_3 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkOutput_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkOutput_v7_3 * This, BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport_v10_11 *result); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkOutput_v7_3 * This, /* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator); - - HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, SetScreenPreviewCallback) + HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( IDeckLinkOutput_v7_3 * This, /* in */ IDeckLinkScreenPreviewCallback *previewCallback); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, EnableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( IDeckLinkOutput_v7_3 * This, BMDDisplayMode displayMode, BMDVideoOutputFlags flags); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, DisableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( IDeckLinkOutput_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, SetVideoOutputFrameMemoryAllocator) + HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( IDeckLinkOutput_v7_3 * This, /* in */ IDeckLinkMemoryAllocator *theAllocator); - - HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, CreateVideoFrame) + HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( IDeckLinkOutput_v7_3 * This, int width, int height, @@ -16175,93 +18470,111 @@ BMDPixelFormat pixelFormat, BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame_v7_6 **outFrame); - - HRESULT ( STDMETHODCALLTYPE *CreateAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, CreateAncillaryData) + HRESULT ( STDMETHODCALLTYPE *CreateAncillaryData )( IDeckLinkOutput_v7_3 * This, BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer); - - HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, DisplayVideoFrameSync) + HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( IDeckLinkOutput_v7_3 * This, /* in */ IDeckLinkVideoFrame_v7_6 *theFrame); - - HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, ScheduleVideoFrame) + HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( IDeckLinkOutput_v7_3 * This, /* in */ IDeckLinkVideoFrame_v7_6 *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, SetScheduledFrameCompletionCallback) + HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( IDeckLinkOutput_v7_3 * This, /* in */ IDeckLinkVideoOutputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *GetBufferedVideoFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, GetBufferedVideoFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedVideoFrameCount )( IDeckLinkOutput_v7_3 * This, /* out */ unsigned int *bufferedFrameCount); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, EnableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( IDeckLinkOutput_v7_3 * This, BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount, BMDAudioOutputStreamType streamType); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, DisableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( IDeckLinkOutput_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, WriteAudioSamplesSync) + HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( IDeckLinkOutput_v7_3 * This, /* in */ void *buffer, unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesWritten); - - HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, BeginAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( IDeckLinkOutput_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, EndAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( IDeckLinkOutput_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, ScheduleAudioSamples) + HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( IDeckLinkOutput_v7_3 * This, /* in */ void *buffer, unsigned int sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, /* out */ unsigned int *sampleFramesWritten); - - HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, GetBufferedAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( IDeckLinkOutput_v7_3 * This, /* out */ unsigned int *bufferedSampleFrameCount); - - HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, FlushBufferedAudioSamples) + HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( IDeckLinkOutput_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, SetAudioCallback) + HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( IDeckLinkOutput_v7_3 * This, /* in */ IDeckLinkAudioOutputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, StartScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( IDeckLinkOutput_v7_3 * This, BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed); - - HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, StopScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( IDeckLinkOutput_v7_3 * This, BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *IsScheduledPlaybackRunning )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, IsScheduledPlaybackRunning) + HRESULT ( STDMETHODCALLTYPE *IsScheduledPlaybackRunning )( IDeckLinkOutput_v7_3 * This, /* out */ BOOL *active); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_3, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( IDeckLinkOutput_v7_3 * This, BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *elapsedTimeSinceSchedulerBegan); - + END_INTERFACE } IDeckLinkOutput_v7_3Vtbl; @@ -16270,95 +18583,95 @@ CONST_VTBL struct IDeckLinkOutput_v7_3Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkOutput_v7_3_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkOutput_v7_3_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkOutput_v7_3_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkOutput_v7_3_DoesSupportVideoMode(This,displayMode,pixelFormat,result) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) + ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) #define IDeckLinkOutput_v7_3_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkOutput_v7_3_SetScreenPreviewCallback(This,previewCallback) \ - ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) + ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) #define IDeckLinkOutput_v7_3_EnableVideoOutput(This,displayMode,flags) \ - ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode,flags) ) + ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode,flags) ) #define IDeckLinkOutput_v7_3_DisableVideoOutput(This) \ - ( (This)->lpVtbl -> DisableVideoOutput(This) ) + ( (This)->lpVtbl -> DisableVideoOutput(This) ) #define IDeckLinkOutput_v7_3_SetVideoOutputFrameMemoryAllocator(This,theAllocator) \ - ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) + ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) #define IDeckLinkOutput_v7_3_CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) \ - ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) + ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) #define IDeckLinkOutput_v7_3_CreateAncillaryData(This,pixelFormat,outBuffer) \ - ( (This)->lpVtbl -> CreateAncillaryData(This,pixelFormat,outBuffer) ) + ( (This)->lpVtbl -> CreateAncillaryData(This,pixelFormat,outBuffer) ) #define IDeckLinkOutput_v7_3_DisplayVideoFrameSync(This,theFrame) \ - ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) + ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) #define IDeckLinkOutput_v7_3_ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) \ - ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) + ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) #define IDeckLinkOutput_v7_3_SetScheduledFrameCompletionCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) #define IDeckLinkOutput_v7_3_GetBufferedVideoFrameCount(This,bufferedFrameCount) \ - ( (This)->lpVtbl -> GetBufferedVideoFrameCount(This,bufferedFrameCount) ) + ( (This)->lpVtbl -> GetBufferedVideoFrameCount(This,bufferedFrameCount) ) #define IDeckLinkOutput_v7_3_EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) \ - ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) ) + ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) ) #define IDeckLinkOutput_v7_3_DisableAudioOutput(This) \ - ( (This)->lpVtbl -> DisableAudioOutput(This) ) + ( (This)->lpVtbl -> DisableAudioOutput(This) ) #define IDeckLinkOutput_v7_3_WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) \ - ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) + ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) #define IDeckLinkOutput_v7_3_BeginAudioPreroll(This) \ - ( (This)->lpVtbl -> BeginAudioPreroll(This) ) + ( (This)->lpVtbl -> BeginAudioPreroll(This) ) #define IDeckLinkOutput_v7_3_EndAudioPreroll(This) \ - ( (This)->lpVtbl -> EndAudioPreroll(This) ) + ( (This)->lpVtbl -> EndAudioPreroll(This) ) #define IDeckLinkOutput_v7_3_ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) \ - ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) + ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) #define IDeckLinkOutput_v7_3_GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) \ - ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) ) + ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) ) #define IDeckLinkOutput_v7_3_FlushBufferedAudioSamples(This) \ - ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) + ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) #define IDeckLinkOutput_v7_3_SetAudioCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) #define IDeckLinkOutput_v7_3_StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) \ - ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) + ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) #define IDeckLinkOutput_v7_3_StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) \ - ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) + ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) #define IDeckLinkOutput_v7_3_IsScheduledPlaybackRunning(This,active) \ - ( (This)->lpVtbl -> IsScheduledPlaybackRunning(This,active) ) + ( (This)->lpVtbl -> IsScheduledPlaybackRunning(This,active) ) #define IDeckLinkOutput_v7_3_GetHardwareReferenceClock(This,desiredTimeScale,elapsedTimeSinceSchedulerBegan) \ - ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,elapsedTimeSinceSchedulerBegan) ) + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,elapsedTimeSinceSchedulerBegan) ) #endif /* COBJMACROS */ @@ -16375,136 +18688,153 @@ #define __IDeckLinkInput_v7_3_INTERFACE_DEFINED__ /* interface IDeckLinkInput_v7_3 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkInput_v7_3; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("4973F012-9925-458C-871C-18774CDBBECB") IDeckLinkInput_v7_3 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport_v10_11 *result) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( /* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( /* out */ unsigned int *availableFrameCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( /* out */ unsigned int *availableSampleFrameCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE StartStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE StopStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE PauseStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE FlushStreams( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( + + virtual HRESULT STDMETHODCALLTYPE SetCallback( /* in */ IDeckLinkInputCallback_v7_3 *theCallback) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkInput_v7_3Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkInput_v7_3 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkInput_v7_3 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkInput_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkInput_v7_3 * This, BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport_v10_11 *result); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkInput_v7_3 * This, /* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator); - - HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, SetScreenPreviewCallback) + HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( IDeckLinkInput_v7_3 * This, /* in */ IDeckLinkScreenPreviewCallback *previewCallback); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, EnableVideoInput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( IDeckLinkInput_v7_3 * This, BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, DisableVideoInput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( IDeckLinkInput_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, GetAvailableVideoFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( IDeckLinkInput_v7_3 * This, /* out */ unsigned int *availableFrameCount); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, EnableAudioInput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( IDeckLinkInput_v7_3 * This, BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, DisableAudioInput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( IDeckLinkInput_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, GetAvailableAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( IDeckLinkInput_v7_3 * This, /* out */ unsigned int *availableSampleFrameCount); - - HRESULT ( STDMETHODCALLTYPE *StartStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, StartStreams) + HRESULT ( STDMETHODCALLTYPE *StartStreams )( IDeckLinkInput_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *StopStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, StopStreams) + HRESULT ( STDMETHODCALLTYPE *StopStreams )( IDeckLinkInput_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *PauseStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, PauseStreams) + HRESULT ( STDMETHODCALLTYPE *PauseStreams )( IDeckLinkInput_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *FlushStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, FlushStreams) + HRESULT ( STDMETHODCALLTYPE *FlushStreams )( IDeckLinkInput_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_3, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( IDeckLinkInput_v7_3 * This, /* in */ IDeckLinkInputCallback_v7_3 *theCallback); - + END_INTERFACE } IDeckLinkInput_v7_3Vtbl; @@ -16513,62 +18843,62 @@ CONST_VTBL struct IDeckLinkInput_v7_3Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkInput_v7_3_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkInput_v7_3_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkInput_v7_3_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkInput_v7_3_DoesSupportVideoMode(This,displayMode,pixelFormat,result) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) + ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) #define IDeckLinkInput_v7_3_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkInput_v7_3_SetScreenPreviewCallback(This,previewCallback) \ - ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) + ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) #define IDeckLinkInput_v7_3_EnableVideoInput(This,displayMode,pixelFormat,flags) \ - ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) + ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) #define IDeckLinkInput_v7_3_DisableVideoInput(This) \ - ( (This)->lpVtbl -> DisableVideoInput(This) ) + ( (This)->lpVtbl -> DisableVideoInput(This) ) #define IDeckLinkInput_v7_3_GetAvailableVideoFrameCount(This,availableFrameCount) \ - ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) + ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) #define IDeckLinkInput_v7_3_EnableAudioInput(This,sampleRate,sampleType,channelCount) \ - ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) + ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) #define IDeckLinkInput_v7_3_DisableAudioInput(This) \ - ( (This)->lpVtbl -> DisableAudioInput(This) ) + ( (This)->lpVtbl -> DisableAudioInput(This) ) #define IDeckLinkInput_v7_3_GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) \ - ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) + ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) #define IDeckLinkInput_v7_3_StartStreams(This) \ - ( (This)->lpVtbl -> StartStreams(This) ) + ( (This)->lpVtbl -> StartStreams(This) ) #define IDeckLinkInput_v7_3_StopStreams(This) \ - ( (This)->lpVtbl -> StopStreams(This) ) + ( (This)->lpVtbl -> StopStreams(This) ) #define IDeckLinkInput_v7_3_PauseStreams(This) \ - ( (This)->lpVtbl -> PauseStreams(This) ) + ( (This)->lpVtbl -> PauseStreams(This) ) #define IDeckLinkInput_v7_3_FlushStreams(This) \ - ( (This)->lpVtbl -> FlushStreams(This) ) + ( (This)->lpVtbl -> FlushStreams(This) ) #define IDeckLinkInput_v7_3_SetCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetCallback(This,theCallback) ) #endif /* COBJMACROS */ @@ -16585,77 +18915,89 @@ #define __IDeckLinkVideoInputFrame_v7_3_INTERFACE_DEFINED__ /* interface IDeckLinkVideoInputFrame_v7_3 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkVideoInputFrame_v7_3; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("CF317790-2894-11DE-8C30-0800200C9A66") IDeckLinkVideoInputFrame_v7_3 : public IDeckLinkVideoFrame_v7_6 { public: - virtual HRESULT STDMETHODCALLTYPE GetStreamTime( + virtual HRESULT STDMETHODCALLTYPE GetStreamTime( /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, BMDTimeScale timeScale) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoInputFrame_v7_3Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoInputFrame_v7_3 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoInputFrame_v7_3 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoInputFrame_v7_3 * This); - - long ( STDMETHODCALLTYPE *GetWidth )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetWidth) + long ( STDMETHODCALLTYPE *GetWidth )( IDeckLinkVideoInputFrame_v7_3 * This); - - long ( STDMETHODCALLTYPE *GetHeight )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetHeight) + long ( STDMETHODCALLTYPE *GetHeight )( IDeckLinkVideoInputFrame_v7_3 * This); - - long ( STDMETHODCALLTYPE *GetRowBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetRowBytes) + long ( STDMETHODCALLTYPE *GetRowBytes )( IDeckLinkVideoInputFrame_v7_3 * This); - - BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetPixelFormat) + BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( IDeckLinkVideoInputFrame_v7_3 * This); - - BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetFlags) + BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( IDeckLinkVideoInputFrame_v7_3 * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkVideoInputFrame_v7_3 * This, /* out */ void **buffer); - - HRESULT ( STDMETHODCALLTYPE *GetTimecode )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetTimecode) + HRESULT ( STDMETHODCALLTYPE *GetTimecode )( IDeckLinkVideoInputFrame_v7_3 * This, BMDTimecodeFormat format, /* out */ IDeckLinkTimecode_v7_6 **timecode); - - HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_6, GetAncillaryData) + HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( IDeckLinkVideoInputFrame_v7_3 * This, /* out */ IDeckLinkVideoFrameAncillary **ancillary); - - HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoInputFrame_v7_3, GetStreamTime) + HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( IDeckLinkVideoInputFrame_v7_3 * This, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, BMDTimeScale timeScale); - + END_INTERFACE } IDeckLinkVideoInputFrame_v7_3Vtbl; @@ -16664,48 +19006,48 @@ CONST_VTBL struct IDeckLinkVideoInputFrame_v7_3Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoInputFrame_v7_3_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoInputFrame_v7_3_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoInputFrame_v7_3_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoInputFrame_v7_3_GetWidth(This) \ - ( (This)->lpVtbl -> GetWidth(This) ) + ( (This)->lpVtbl -> GetWidth(This) ) #define IDeckLinkVideoInputFrame_v7_3_GetHeight(This) \ - ( (This)->lpVtbl -> GetHeight(This) ) + ( (This)->lpVtbl -> GetHeight(This) ) #define IDeckLinkVideoInputFrame_v7_3_GetRowBytes(This) \ - ( (This)->lpVtbl -> GetRowBytes(This) ) + ( (This)->lpVtbl -> GetRowBytes(This) ) #define IDeckLinkVideoInputFrame_v7_3_GetPixelFormat(This) \ - ( (This)->lpVtbl -> GetPixelFormat(This) ) + ( (This)->lpVtbl -> GetPixelFormat(This) ) #define IDeckLinkVideoInputFrame_v7_3_GetFlags(This) \ - ( (This)->lpVtbl -> GetFlags(This) ) + ( (This)->lpVtbl -> GetFlags(This) ) #define IDeckLinkVideoInputFrame_v7_3_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkVideoInputFrame_v7_3_GetTimecode(This,format,timecode) \ - ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) + ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) #define IDeckLinkVideoInputFrame_v7_3_GetAncillaryData(This,ancillary) \ - ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) + ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) #define IDeckLinkVideoInputFrame_v7_3_GetStreamTime(This,frameTime,frameDuration,timeScale) \ - ( (This)->lpVtbl -> GetStreamTime(This,frameTime,frameDuration,timeScale) ) + ( (This)->lpVtbl -> GetStreamTime(This,frameTime,frameDuration,timeScale) ) #endif /* COBJMACROS */ @@ -16722,45 +19064,49 @@ #define __IDeckLinkDisplayModeIterator_v7_1_INTERFACE_DEFINED__ /* interface IDeckLinkDisplayModeIterator_v7_1 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkDisplayModeIterator_v7_1; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("B28131B6-59AC-4857-B5AC-CD75D5883E2F") IDeckLinkDisplayModeIterator_v7_1 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Next( + virtual HRESULT STDMETHODCALLTYPE Next( /* out */ IDeckLinkDisplayMode_v7_1 **deckLinkDisplayMode) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDisplayModeIterator_v7_1Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDisplayModeIterator_v7_1 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDisplayModeIterator_v7_1 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDisplayModeIterator_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayModeIterator_v7_1, Next) + HRESULT ( STDMETHODCALLTYPE *Next )( IDeckLinkDisplayModeIterator_v7_1 * This, /* out */ IDeckLinkDisplayMode_v7_1 **deckLinkDisplayMode); - + END_INTERFACE } IDeckLinkDisplayModeIterator_v7_1Vtbl; @@ -16769,23 +19115,23 @@ CONST_VTBL struct IDeckLinkDisplayModeIterator_v7_1Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDisplayModeIterator_v7_1_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDisplayModeIterator_v7_1_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDisplayModeIterator_v7_1_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDisplayModeIterator_v7_1_Next(This,deckLinkDisplayMode) \ - ( (This)->lpVtbl -> Next(This,deckLinkDisplayMode) ) + ( (This)->lpVtbl -> Next(This,deckLinkDisplayMode) ) #endif /* COBJMACROS */ @@ -16802,69 +19148,77 @@ #define __IDeckLinkDisplayMode_v7_1_INTERFACE_DEFINED__ /* interface IDeckLinkDisplayMode_v7_1 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkDisplayMode_v7_1; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("AF0CD6D5-8376-435E-8433-54F9DD530AC3") IDeckLinkDisplayMode_v7_1 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetName( + virtual HRESULT STDMETHODCALLTYPE GetName( /* out */ BSTR *name) = 0; - + virtual BMDDisplayMode STDMETHODCALLTYPE GetDisplayMode( void) = 0; - + virtual long STDMETHODCALLTYPE GetWidth( void) = 0; - + virtual long STDMETHODCALLTYPE GetHeight( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFrameRate( + + virtual HRESULT STDMETHODCALLTYPE GetFrameRate( /* out */ BMDTimeValue *frameDuration, /* out */ BMDTimeScale *timeScale) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkDisplayMode_v7_1Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkDisplayMode_v7_1 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkDisplayMode_v7_1 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkDisplayMode_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *GetName )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode_v7_1, GetName) + HRESULT ( STDMETHODCALLTYPE *GetName )( IDeckLinkDisplayMode_v7_1 * This, /* out */ BSTR *name); - - BMDDisplayMode ( STDMETHODCALLTYPE *GetDisplayMode )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode_v7_1, GetDisplayMode) + BMDDisplayMode ( STDMETHODCALLTYPE *GetDisplayMode )( IDeckLinkDisplayMode_v7_1 * This); - - long ( STDMETHODCALLTYPE *GetWidth )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode_v7_1, GetWidth) + long ( STDMETHODCALLTYPE *GetWidth )( IDeckLinkDisplayMode_v7_1 * This); - - long ( STDMETHODCALLTYPE *GetHeight )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode_v7_1, GetHeight) + long ( STDMETHODCALLTYPE *GetHeight )( IDeckLinkDisplayMode_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *GetFrameRate )( + + DECLSPEC_XFGVIRT(IDeckLinkDisplayMode_v7_1, GetFrameRate) + HRESULT ( STDMETHODCALLTYPE *GetFrameRate )( IDeckLinkDisplayMode_v7_1 * This, /* out */ BMDTimeValue *frameDuration, /* out */ BMDTimeScale *timeScale); - + END_INTERFACE } IDeckLinkDisplayMode_v7_1Vtbl; @@ -16873,35 +19227,35 @@ CONST_VTBL struct IDeckLinkDisplayMode_v7_1Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkDisplayMode_v7_1_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkDisplayMode_v7_1_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkDisplayMode_v7_1_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkDisplayMode_v7_1_GetName(This,name) \ - ( (This)->lpVtbl -> GetName(This,name) ) + ( (This)->lpVtbl -> GetName(This,name) ) #define IDeckLinkDisplayMode_v7_1_GetDisplayMode(This) \ - ( (This)->lpVtbl -> GetDisplayMode(This) ) + ( (This)->lpVtbl -> GetDisplayMode(This) ) #define IDeckLinkDisplayMode_v7_1_GetWidth(This) \ - ( (This)->lpVtbl -> GetWidth(This) ) + ( (This)->lpVtbl -> GetWidth(This) ) #define IDeckLinkDisplayMode_v7_1_GetHeight(This) \ - ( (This)->lpVtbl -> GetHeight(This) ) + ( (This)->lpVtbl -> GetHeight(This) ) #define IDeckLinkDisplayMode_v7_1_GetFrameRate(This,frameDuration,timeScale) \ - ( (This)->lpVtbl -> GetFrameRate(This,frameDuration,timeScale) ) + ( (This)->lpVtbl -> GetFrameRate(This,frameDuration,timeScale) ) #endif /* COBJMACROS */ @@ -16918,70 +19272,79 @@ #define __IDeckLinkVideoFrame_v7_1_INTERFACE_DEFINED__ /* interface IDeckLinkVideoFrame_v7_1 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkVideoFrame_v7_1; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("333F3A10-8C2D-43CF-B79D-46560FEEA1CE") IDeckLinkVideoFrame_v7_1 : public IUnknown { public: virtual long STDMETHODCALLTYPE GetWidth( void) = 0; - + virtual long STDMETHODCALLTYPE GetHeight( void) = 0; - + virtual long STDMETHODCALLTYPE GetRowBytes( void) = 0; - + virtual BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat( void) = 0; - + virtual BMDFrameFlags STDMETHODCALLTYPE GetFlags( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBytes( + + virtual HRESULT STDMETHODCALLTYPE GetBytes( void **buffer) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoFrame_v7_1Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoFrame_v7_1 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoFrame_v7_1 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoFrame_v7_1 * This); - - long ( STDMETHODCALLTYPE *GetWidth )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_1, GetWidth) + long ( STDMETHODCALLTYPE *GetWidth )( IDeckLinkVideoFrame_v7_1 * This); - - long ( STDMETHODCALLTYPE *GetHeight )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_1, GetHeight) + long ( STDMETHODCALLTYPE *GetHeight )( IDeckLinkVideoFrame_v7_1 * This); - - long ( STDMETHODCALLTYPE *GetRowBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_1, GetRowBytes) + long ( STDMETHODCALLTYPE *GetRowBytes )( IDeckLinkVideoFrame_v7_1 * This); - - BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_1, GetPixelFormat) + BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( IDeckLinkVideoFrame_v7_1 * This); - - BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_1, GetFlags) + BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( IDeckLinkVideoFrame_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_1, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkVideoFrame_v7_1 * This, void **buffer); - + END_INTERFACE } IDeckLinkVideoFrame_v7_1Vtbl; @@ -16990,38 +19353,38 @@ CONST_VTBL struct IDeckLinkVideoFrame_v7_1Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoFrame_v7_1_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoFrame_v7_1_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoFrame_v7_1_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoFrame_v7_1_GetWidth(This) \ - ( (This)->lpVtbl -> GetWidth(This) ) + ( (This)->lpVtbl -> GetWidth(This) ) #define IDeckLinkVideoFrame_v7_1_GetHeight(This) \ - ( (This)->lpVtbl -> GetHeight(This) ) + ( (This)->lpVtbl -> GetHeight(This) ) #define IDeckLinkVideoFrame_v7_1_GetRowBytes(This) \ - ( (This)->lpVtbl -> GetRowBytes(This) ) + ( (This)->lpVtbl -> GetRowBytes(This) ) #define IDeckLinkVideoFrame_v7_1_GetPixelFormat(This) \ - ( (This)->lpVtbl -> GetPixelFormat(This) ) + ( (This)->lpVtbl -> GetPixelFormat(This) ) #define IDeckLinkVideoFrame_v7_1_GetFlags(This) \ - ( (This)->lpVtbl -> GetFlags(This) ) + ( (This)->lpVtbl -> GetFlags(This) ) #define IDeckLinkVideoFrame_v7_1_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #endif /* COBJMACROS */ @@ -17038,68 +19401,78 @@ #define __IDeckLinkVideoInputFrame_v7_1_INTERFACE_DEFINED__ /* interface IDeckLinkVideoInputFrame_v7_1 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkVideoInputFrame_v7_1; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("C8B41D95-8848-40EE-9B37-6E3417FB114B") IDeckLinkVideoInputFrame_v7_1 : public IDeckLinkVideoFrame_v7_1 { public: - virtual HRESULT STDMETHODCALLTYPE GetFrameTime( + virtual HRESULT STDMETHODCALLTYPE GetFrameTime( BMDTimeValue *frameTime, BMDTimeValue *frameDuration, BMDTimeScale timeScale) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoInputFrame_v7_1Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoInputFrame_v7_1 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoInputFrame_v7_1 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoInputFrame_v7_1 * This); - - long ( STDMETHODCALLTYPE *GetWidth )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_1, GetWidth) + long ( STDMETHODCALLTYPE *GetWidth )( IDeckLinkVideoInputFrame_v7_1 * This); - - long ( STDMETHODCALLTYPE *GetHeight )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_1, GetHeight) + long ( STDMETHODCALLTYPE *GetHeight )( IDeckLinkVideoInputFrame_v7_1 * This); - - long ( STDMETHODCALLTYPE *GetRowBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_1, GetRowBytes) + long ( STDMETHODCALLTYPE *GetRowBytes )( IDeckLinkVideoInputFrame_v7_1 * This); - - BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_1, GetPixelFormat) + BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( IDeckLinkVideoInputFrame_v7_1 * This); - - BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_1, GetFlags) + BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( IDeckLinkVideoInputFrame_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoFrame_v7_1, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkVideoInputFrame_v7_1 * This, void **buffer); - - HRESULT ( STDMETHODCALLTYPE *GetFrameTime )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoInputFrame_v7_1, GetFrameTime) + HRESULT ( STDMETHODCALLTYPE *GetFrameTime )( IDeckLinkVideoInputFrame_v7_1 * This, BMDTimeValue *frameTime, BMDTimeValue *frameDuration, BMDTimeScale timeScale); - + END_INTERFACE } IDeckLinkVideoInputFrame_v7_1Vtbl; @@ -17108,42 +19481,42 @@ CONST_VTBL struct IDeckLinkVideoInputFrame_v7_1Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoInputFrame_v7_1_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoInputFrame_v7_1_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoInputFrame_v7_1_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoInputFrame_v7_1_GetWidth(This) \ - ( (This)->lpVtbl -> GetWidth(This) ) + ( (This)->lpVtbl -> GetWidth(This) ) #define IDeckLinkVideoInputFrame_v7_1_GetHeight(This) \ - ( (This)->lpVtbl -> GetHeight(This) ) + ( (This)->lpVtbl -> GetHeight(This) ) #define IDeckLinkVideoInputFrame_v7_1_GetRowBytes(This) \ - ( (This)->lpVtbl -> GetRowBytes(This) ) + ( (This)->lpVtbl -> GetRowBytes(This) ) #define IDeckLinkVideoInputFrame_v7_1_GetPixelFormat(This) \ - ( (This)->lpVtbl -> GetPixelFormat(This) ) + ( (This)->lpVtbl -> GetPixelFormat(This) ) #define IDeckLinkVideoInputFrame_v7_1_GetFlags(This) \ - ( (This)->lpVtbl -> GetFlags(This) ) + ( (This)->lpVtbl -> GetFlags(This) ) #define IDeckLinkVideoInputFrame_v7_1_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkVideoInputFrame_v7_1_GetFrameTime(This,frameTime,frameDuration,timeScale) \ - ( (This)->lpVtbl -> GetFrameTime(This,frameTime,frameDuration,timeScale) ) + ( (This)->lpVtbl -> GetFrameTime(This,frameTime,frameDuration,timeScale) ) #endif /* COBJMACROS */ @@ -17160,59 +19533,65 @@ #define __IDeckLinkAudioInputPacket_v7_1_INTERFACE_DEFINED__ /* interface IDeckLinkAudioInputPacket_v7_1 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkAudioInputPacket_v7_1; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("C86DE4F6-A29F-42E3-AB3A-1363E29F0788") IDeckLinkAudioInputPacket_v7_1 : public IUnknown { public: virtual long STDMETHODCALLTYPE GetSampleCount( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBytes( + + virtual HRESULT STDMETHODCALLTYPE GetBytes( void **buffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetAudioPacketTime( + + virtual HRESULT STDMETHODCALLTYPE GetAudioPacketTime( BMDTimeValue *packetTime, BMDTimeScale timeScale) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkAudioInputPacket_v7_1Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkAudioInputPacket_v7_1 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkAudioInputPacket_v7_1 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkAudioInputPacket_v7_1 * This); - - long ( STDMETHODCALLTYPE *GetSampleCount )( + + DECLSPEC_XFGVIRT(IDeckLinkAudioInputPacket_v7_1, GetSampleCount) + long ( STDMETHODCALLTYPE *GetSampleCount )( IDeckLinkAudioInputPacket_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *GetBytes )( + + DECLSPEC_XFGVIRT(IDeckLinkAudioInputPacket_v7_1, GetBytes) + HRESULT ( STDMETHODCALLTYPE *GetBytes )( IDeckLinkAudioInputPacket_v7_1 * This, void **buffer); - - HRESULT ( STDMETHODCALLTYPE *GetAudioPacketTime )( + + DECLSPEC_XFGVIRT(IDeckLinkAudioInputPacket_v7_1, GetAudioPacketTime) + HRESULT ( STDMETHODCALLTYPE *GetAudioPacketTime )( IDeckLinkAudioInputPacket_v7_1 * This, BMDTimeValue *packetTime, BMDTimeScale timeScale); - + END_INTERFACE } IDeckLinkAudioInputPacket_v7_1Vtbl; @@ -17221,29 +19600,29 @@ CONST_VTBL struct IDeckLinkAudioInputPacket_v7_1Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkAudioInputPacket_v7_1_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkAudioInputPacket_v7_1_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkAudioInputPacket_v7_1_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkAudioInputPacket_v7_1_GetSampleCount(This) \ - ( (This)->lpVtbl -> GetSampleCount(This) ) + ( (This)->lpVtbl -> GetSampleCount(This) ) #define IDeckLinkAudioInputPacket_v7_1_GetBytes(This,buffer) \ - ( (This)->lpVtbl -> GetBytes(This,buffer) ) + ( (This)->lpVtbl -> GetBytes(This,buffer) ) #define IDeckLinkAudioInputPacket_v7_1_GetAudioPacketTime(This,packetTime,timeScale) \ - ( (This)->lpVtbl -> GetAudioPacketTime(This,packetTime,timeScale) ) + ( (This)->lpVtbl -> GetAudioPacketTime(This,packetTime,timeScale) ) #endif /* COBJMACROS */ @@ -17260,47 +19639,51 @@ #define __IDeckLinkVideoOutputCallback_v7_1_INTERFACE_DEFINED__ /* interface IDeckLinkVideoOutputCallback_v7_1 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkVideoOutputCallback_v7_1; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("EBD01AFA-E4B0-49C6-A01D-EDB9D1B55FD9") IDeckLinkVideoOutputCallback_v7_1 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE ScheduledFrameCompleted( + virtual HRESULT STDMETHODCALLTYPE ScheduledFrameCompleted( /* in */ IDeckLinkVideoFrame_v7_1 *completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkVideoOutputCallback_v7_1Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkVideoOutputCallback_v7_1 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkVideoOutputCallback_v7_1 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkVideoOutputCallback_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *ScheduledFrameCompleted )( + + DECLSPEC_XFGVIRT(IDeckLinkVideoOutputCallback_v7_1, ScheduledFrameCompleted) + HRESULT ( STDMETHODCALLTYPE *ScheduledFrameCompleted )( IDeckLinkVideoOutputCallback_v7_1 * This, /* in */ IDeckLinkVideoFrame_v7_1 *completedFrame, /* in */ BMDOutputFrameCompletionResult result); - + END_INTERFACE } IDeckLinkVideoOutputCallback_v7_1Vtbl; @@ -17309,23 +19692,23 @@ CONST_VTBL struct IDeckLinkVideoOutputCallback_v7_1Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkVideoOutputCallback_v7_1_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkVideoOutputCallback_v7_1_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkVideoOutputCallback_v7_1_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkVideoOutputCallback_v7_1_ScheduledFrameCompleted(This,completedFrame,result) \ - ( (This)->lpVtbl -> ScheduledFrameCompleted(This,completedFrame,result) ) + ( (This)->lpVtbl -> ScheduledFrameCompleted(This,completedFrame,result) ) #endif /* COBJMACROS */ @@ -17342,47 +19725,51 @@ #define __IDeckLinkInputCallback_v7_1_INTERFACE_DEFINED__ /* interface IDeckLinkInputCallback_v7_1 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkInputCallback_v7_1; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("7F94F328-5ED4-4E9F-9729-76A86BDC99CC") IDeckLinkInputCallback_v7_1 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived( + virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived( /* in */ IDeckLinkVideoInputFrame_v7_1 *videoFrame, /* in */ IDeckLinkAudioInputPacket_v7_1 *audioPacket) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkInputCallback_v7_1Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkInputCallback_v7_1 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkInputCallback_v7_1 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkInputCallback_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *VideoInputFrameArrived )( + + DECLSPEC_XFGVIRT(IDeckLinkInputCallback_v7_1, VideoInputFrameArrived) + HRESULT ( STDMETHODCALLTYPE *VideoInputFrameArrived )( IDeckLinkInputCallback_v7_1 * This, /* in */ IDeckLinkVideoInputFrame_v7_1 *videoFrame, /* in */ IDeckLinkAudioInputPacket_v7_1 *audioPacket); - + END_INTERFACE } IDeckLinkInputCallback_v7_1Vtbl; @@ -17391,23 +19778,23 @@ CONST_VTBL struct IDeckLinkInputCallback_v7_1Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkInputCallback_v7_1_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkInputCallback_v7_1_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkInputCallback_v7_1_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkInputCallback_v7_1_VideoInputFrameArrived(This,videoFrame,audioPacket) \ - ( (This)->lpVtbl -> VideoInputFrameArrived(This,videoFrame,audioPacket) ) + ( (This)->lpVtbl -> VideoInputFrameArrived(This,videoFrame,audioPacket) ) #endif /* COBJMACROS */ @@ -17424,42 +19811,42 @@ #define __IDeckLinkOutput_v7_1_INTERFACE_DEFINED__ /* interface IDeckLinkOutput_v7_1 */ -/* helpstringlocaluuidobject */ +/* helpstringlocaluuidobject */ EXTERN_C const IID IID_IDeckLinkOutput_v7_1; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("AE5B3E9B-4E1E-4535-B6E8-480FF52F6CE5") IDeckLinkOutput_v7_1 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport_v10_11 *result) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator_v7_1 **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( BMDDisplayMode displayMode) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoOutput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( + + virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( /* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( + + virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( int width, int height, int rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1 **outFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateVideoFrameFromBuffer( + + virtual HRESULT STDMETHODCALLTYPE CreateVideoFrameFromBuffer( void *buffer, int width, int height, @@ -17467,107 +19854,116 @@ BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1 **outFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( + + virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( IDeckLinkVideoFrame_v7_1 *theFrame) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( + + virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( IDeckLinkVideoFrame_v7_1 *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( + + virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( /* in */ IDeckLinkVideoOutputCallback_v7_1 *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioOutput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( + + virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( void *buffer, unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesWritten) = 0; - + virtual HRESULT STDMETHODCALLTYPE BeginAudioPreroll( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE EndAudioPreroll( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( + + virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( void *buffer, unsigned int sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, /* out */ unsigned int *sampleFramesWritten) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( /* out */ unsigned int *bufferedSampleCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE FlushBufferedAudioSamples( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( + + virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( /* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; - - virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( + + virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed) = 0; - - virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( + + virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( BMDTimeValue stopPlaybackAtTime, BMDTimeValue *actualStopTime, BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( + + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( BMDTimeScale desiredTimeScale, BMDTimeValue *elapsedTimeSinceSchedulerBegan) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkOutput_v7_1Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkOutput_v7_1 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkOutput_v7_1 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkOutput_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkOutput_v7_1 * This, BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport_v10_11 *result); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkOutput_v7_1 * This, /* out */ IDeckLinkDisplayModeIterator_v7_1 **iterator); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, EnableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( IDeckLinkOutput_v7_1 * This, BMDDisplayMode displayMode); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, DisableVideoOutput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( IDeckLinkOutput_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, SetVideoOutputFrameMemoryAllocator) + HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( IDeckLinkOutput_v7_1 * This, /* in */ IDeckLinkMemoryAllocator *theAllocator); - - HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, CreateVideoFrame) + HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( IDeckLinkOutput_v7_1 * This, int width, int height, @@ -17575,8 +19971,9 @@ BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1 **outFrame); - - HRESULT ( STDMETHODCALLTYPE *CreateVideoFrameFromBuffer )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, CreateVideoFrameFromBuffer) + HRESULT ( STDMETHODCALLTYPE *CreateVideoFrameFromBuffer )( IDeckLinkOutput_v7_1 * This, void *buffer, int width, @@ -17585,79 +19982,94 @@ BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1 **outFrame); - - HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, DisplayVideoFrameSync) + HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( IDeckLinkOutput_v7_1 * This, IDeckLinkVideoFrame_v7_1 *theFrame); - - HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, ScheduleVideoFrame) + HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( IDeckLinkOutput_v7_1 * This, IDeckLinkVideoFrame_v7_1 *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, SetScheduledFrameCompletionCallback) + HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( IDeckLinkOutput_v7_1 * This, /* in */ IDeckLinkVideoOutputCallback_v7_1 *theCallback); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, EnableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( IDeckLinkOutput_v7_1 * This, BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, DisableAudioOutput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( IDeckLinkOutput_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, WriteAudioSamplesSync) + HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( IDeckLinkOutput_v7_1 * This, void *buffer, unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesWritten); - - HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, BeginAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( IDeckLinkOutput_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, EndAudioPreroll) + HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( IDeckLinkOutput_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, ScheduleAudioSamples) + HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( IDeckLinkOutput_v7_1 * This, void *buffer, unsigned int sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, /* out */ unsigned int *sampleFramesWritten); - - HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, GetBufferedAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( IDeckLinkOutput_v7_1 * This, /* out */ unsigned int *bufferedSampleCount); - - HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, FlushBufferedAudioSamples) + HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( IDeckLinkOutput_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, SetAudioCallback) + HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( IDeckLinkOutput_v7_1 * This, /* in */ IDeckLinkAudioOutputCallback *theCallback); - - HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, StartScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( IDeckLinkOutput_v7_1 * This, BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed); - - HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, StopScheduledPlayback) + HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( IDeckLinkOutput_v7_1 * This, BMDTimeValue stopPlaybackAtTime, BMDTimeValue *actualStopTime, BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( + + DECLSPEC_XFGVIRT(IDeckLinkOutput_v7_1, GetHardwareReferenceClock) + HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( IDeckLinkOutput_v7_1 * This, BMDTimeScale desiredTimeScale, BMDTimeValue *elapsedTimeSinceSchedulerBegan); - + END_INTERFACE } IDeckLinkOutput_v7_1Vtbl; @@ -17666,86 +20078,86 @@ CONST_VTBL struct IDeckLinkOutput_v7_1Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkOutput_v7_1_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkOutput_v7_1_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkOutput_v7_1_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkOutput_v7_1_DoesSupportVideoMode(This,displayMode,pixelFormat,result) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) + ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) #define IDeckLinkOutput_v7_1_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkOutput_v7_1_EnableVideoOutput(This,displayMode) \ - ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode) ) + ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode) ) #define IDeckLinkOutput_v7_1_DisableVideoOutput(This) \ - ( (This)->lpVtbl -> DisableVideoOutput(This) ) + ( (This)->lpVtbl -> DisableVideoOutput(This) ) #define IDeckLinkOutput_v7_1_SetVideoOutputFrameMemoryAllocator(This,theAllocator) \ - ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) + ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) #define IDeckLinkOutput_v7_1_CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) \ - ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) + ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) #define IDeckLinkOutput_v7_1_CreateVideoFrameFromBuffer(This,buffer,width,height,rowBytes,pixelFormat,flags,outFrame) \ - ( (This)->lpVtbl -> CreateVideoFrameFromBuffer(This,buffer,width,height,rowBytes,pixelFormat,flags,outFrame) ) + ( (This)->lpVtbl -> CreateVideoFrameFromBuffer(This,buffer,width,height,rowBytes,pixelFormat,flags,outFrame) ) #define IDeckLinkOutput_v7_1_DisplayVideoFrameSync(This,theFrame) \ - ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) + ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) #define IDeckLinkOutput_v7_1_ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) \ - ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) + ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) #define IDeckLinkOutput_v7_1_SetScheduledFrameCompletionCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) #define IDeckLinkOutput_v7_1_EnableAudioOutput(This,sampleRate,sampleType,channelCount) \ - ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount) ) + ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount) ) #define IDeckLinkOutput_v7_1_DisableAudioOutput(This) \ - ( (This)->lpVtbl -> DisableAudioOutput(This) ) + ( (This)->lpVtbl -> DisableAudioOutput(This) ) #define IDeckLinkOutput_v7_1_WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) \ - ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) + ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) #define IDeckLinkOutput_v7_1_BeginAudioPreroll(This) \ - ( (This)->lpVtbl -> BeginAudioPreroll(This) ) + ( (This)->lpVtbl -> BeginAudioPreroll(This) ) #define IDeckLinkOutput_v7_1_EndAudioPreroll(This) \ - ( (This)->lpVtbl -> EndAudioPreroll(This) ) + ( (This)->lpVtbl -> EndAudioPreroll(This) ) #define IDeckLinkOutput_v7_1_ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) \ - ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) + ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) #define IDeckLinkOutput_v7_1_GetBufferedAudioSampleFrameCount(This,bufferedSampleCount) \ - ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleCount) ) + ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleCount) ) #define IDeckLinkOutput_v7_1_FlushBufferedAudioSamples(This) \ - ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) + ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) #define IDeckLinkOutput_v7_1_SetAudioCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) #define IDeckLinkOutput_v7_1_StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) \ - ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) + ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) #define IDeckLinkOutput_v7_1_StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) \ - ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) + ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) #define IDeckLinkOutput_v7_1_GetHardwareReferenceClock(This,desiredTimeScale,elapsedTimeSinceSchedulerBegan) \ - ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,elapsedTimeSinceSchedulerBegan) ) + ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,elapsedTimeSinceSchedulerBegan) ) #endif /* COBJMACROS */ @@ -17762,132 +20174,147 @@ #define __IDeckLinkInput_v7_1_INTERFACE_DEFINED__ /* interface IDeckLinkInput_v7_1 */ -/* helpstringuuidobject */ +/* helpstringuuidobject */ EXTERN_C const IID IID_IDeckLinkInput_v7_1; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("2B54EDEF-5B32-429F-BA11-BB990596EACD") IDeckLinkInput_v7_1 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport_v10_11 *result) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( + + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( /* out */ IDeckLinkDisplayModeIterator_v7_1 **iterator) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( + + virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableVideoInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( + + virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE DisableAudioInput( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReadAudioSamples( + + virtual HRESULT STDMETHODCALLTYPE ReadAudioSamples( void *buffer, unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesRead, /* out */ BMDTimeValue *audioPacketTime, BMDTimeScale timeScale) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( + + virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( /* out */ unsigned int *bufferedSampleCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE StartStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE StopStreams( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE PauseStreams( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( + + virtual HRESULT STDMETHODCALLTYPE SetCallback( /* in */ IDeckLinkInputCallback_v7_1 *theCallback) = 0; - + }; - - + + #else /* C style interface */ typedef struct IDeckLinkInput_v7_1Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDeckLinkInput_v7_1 * This, /* in */ REFIID riid, - /* annotationiid_isout */ + /* annotationiid_isout */ _COM_Outptr_ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( IDeckLinkInput_v7_1 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( IDeckLinkInput_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_1, DoesSupportVideoMode) + HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( IDeckLinkInput_v7_1 * This, BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport_v10_11 *result); - - HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_1, GetDisplayModeIterator) + HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( IDeckLinkInput_v7_1 * This, /* out */ IDeckLinkDisplayModeIterator_v7_1 **iterator); - - HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_1, EnableVideoInput) + HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( IDeckLinkInput_v7_1 * This, BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags); - - HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_1, DisableVideoInput) + HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( IDeckLinkInput_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_1, EnableAudioInput) + HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( IDeckLinkInput_v7_1 * This, BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount); - - HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_1, DisableAudioInput) + HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( IDeckLinkInput_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *ReadAudioSamples )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_1, ReadAudioSamples) + HRESULT ( STDMETHODCALLTYPE *ReadAudioSamples )( IDeckLinkInput_v7_1 * This, void *buffer, unsigned int sampleFrameCount, /* out */ unsigned int *sampleFramesRead, /* out */ BMDTimeValue *audioPacketTime, BMDTimeScale timeScale); - - HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_1, GetBufferedAudioSampleFrameCount) + HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( IDeckLinkInput_v7_1 * This, /* out */ unsigned int *bufferedSampleCount); - - HRESULT ( STDMETHODCALLTYPE *StartStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_1, StartStreams) + HRESULT ( STDMETHODCALLTYPE *StartStreams )( IDeckLinkInput_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *StopStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_1, StopStreams) + HRESULT ( STDMETHODCALLTYPE *StopStreams )( IDeckLinkInput_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *PauseStreams )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_1, PauseStreams) + HRESULT ( STDMETHODCALLTYPE *PauseStreams )( IDeckLinkInput_v7_1 * This); - - HRESULT ( STDMETHODCALLTYPE *SetCallback )( + + DECLSPEC_XFGVIRT(IDeckLinkInput_v7_1, SetCallback) + HRESULT ( STDMETHODCALLTYPE *SetCallback )( IDeckLinkInput_v7_1 * This, /* in */ IDeckLinkInputCallback_v7_1 *theCallback); - + END_INTERFACE } IDeckLinkInput_v7_1Vtbl; @@ -17896,56 +20323,56 @@ CONST_VTBL struct IDeckLinkInput_v7_1Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IDeckLinkInput_v7_1_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IDeckLinkInput_v7_1_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IDeckLinkInput_v7_1_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IDeckLinkInput_v7_1_DoesSupportVideoMode(This,displayMode,pixelFormat,result) \ - ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) + ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) #define IDeckLinkInput_v7_1_GetDisplayModeIterator(This,iterator) \ - ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) + ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) #define IDeckLinkInput_v7_1_EnableVideoInput(This,displayMode,pixelFormat,flags) \ - ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) + ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) #define IDeckLinkInput_v7_1_DisableVideoInput(This) \ - ( (This)->lpVtbl -> DisableVideoInput(This) ) + ( (This)->lpVtbl -> DisableVideoInput(This) ) #define IDeckLinkInput_v7_1_EnableAudioInput(This,sampleRate,sampleType,channelCount) \ - ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) + ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) #define IDeckLinkInput_v7_1_DisableAudioInput(This) \ - ( (This)->lpVtbl -> DisableAudioInput(This) ) + ( (This)->lpVtbl -> DisableAudioInput(This) ) #define IDeckLinkInput_v7_1_ReadAudioSamples(This,buffer,sampleFrameCount,sampleFramesRead,audioPacketTime,timeScale) \ - ( (This)->lpVtbl -> ReadAudioSamples(This,buffer,sampleFrameCount,sampleFramesRead,audioPacketTime,timeScale) ) + ( (This)->lpVtbl -> ReadAudioSamples(This,buffer,sampleFrameCount,sampleFramesRead,audioPacketTime,timeScale) ) #define IDeckLinkInput_v7_1_GetBufferedAudioSampleFrameCount(This,bufferedSampleCount) \ - ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleCount) ) + ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleCount) ) #define IDeckLinkInput_v7_1_StartStreams(This) \ - ( (This)->lpVtbl -> StartStreams(This) ) + ( (This)->lpVtbl -> StartStreams(This) ) #define IDeckLinkInput_v7_1_StopStreams(This) \ - ( (This)->lpVtbl -> StopStreams(This) ) + ( (This)->lpVtbl -> StopStreams(This) ) #define IDeckLinkInput_v7_1_PauseStreams(This) \ - ( (This)->lpVtbl -> PauseStreams(This) ) + ( (This)->lpVtbl -> PauseStreams(This) ) #define IDeckLinkInput_v7_1_SetCallback(This,theCallback) \ - ( (This)->lpVtbl -> SetCallback(This,theCallback) ) + ( (This)->lpVtbl -> SetCallback(This,theCallback) ) #endif /* COBJMACROS */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/decklink/win/DeckLinkAPI_i.c -> gst-plugins-bad-1.22.0.tar.xz/sys/decklink/win/DeckLinkAPI_i.c
Changed
@@ -1,440 +1,455 @@ /* *INDENT-OFF* */ - -/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */ - -/* link this file in with the server and any clients */ - - - /* File created by MIDL compiler version 8.01.0622 */ -/* at Tue Jan 19 12:14:07 2038 - */ -/* Compiler settings for ..\..\Blackmagic\DeckLink_SDK_10.11.4\Win\include\DeckLinkAPI.idl: - Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622 - protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -/* @@MIDL_FILE_HEADING( ) */ - -#ifdef _MSC_VER -#pragma warning( disable: 4049 ) /* more than 64k source lines */ -#endif - -#ifdef __cplusplus -extern "C"{ -#endif - - -#include <rpc.h> -#include <rpcndr.h> - -#ifdef _MIDL_USE_GUIDDEF_ - -#ifndef INITGUID -#define INITGUID -#include <guiddef.h> -#undef INITGUID -#else -#include <guiddef.h> -#endif - -#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ - DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) - -#else // !_MIDL_USE_GUIDDEF_ - -#ifndef __IID_DEFINED__ -#define __IID_DEFINED__ - -typedef struct _IID -{ - unsigned long x; - unsigned short s1; - unsigned short s2; - unsigned char c8; -} IID; - -#endif // __IID_DEFINED__ - -#ifndef CLSID_DEFINED -#define CLSID_DEFINED -typedef IID CLSID; -#endif // CLSID_DEFINED - -#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ - const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} - -#endif // !_MIDL_USE_GUIDDEF_ - -MIDL_DEFINE_GUID(IID, LIBID_DeckLinkAPI,0xD864517A,0xEDD5,0x466D,0x86,0x7D,0xC8,0x19,0xF1,0xC0,0x52,0xBB); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkTimecode,0xBC6CFBD3,0x8317,0x4325,0xAC,0x1C,0x12,0x16,0x39,0x1E,0x93,0x40); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayModeIterator,0x9C88499F,0xF601,0x4021,0xB8,0x0B,0x03,0x2E,0x4E,0xB4,0x1C,0x35); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayMode,0x3EB2C1AB,0x0A3D,0x4523,0xA3,0xAD,0xF4,0x0D,0x7F,0xB1,0x4E,0x78); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLink,0xC418FBDD,0x0587,0x48ED,0x8F,0xE5,0x64,0x0F,0x0A,0x14,0xAF,0x91); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration,0x912F634B,0x2D4E,0x40A4,0x8A,0xAB,0x8D,0x80,0xB7,0x3F,0x12,0x89); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderConfiguration,0x138050E5,0xC60A,0x4552,0xBF,0x3F,0x0F,0x35,0x80,0x49,0x32,0x7E); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeckControlStatusCallback,0x53436FFB,0xB434,0x4906,0xBA,0xDC,0xAE,0x30,0x60,0xFF,0xE8,0xEF); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeckControl,0x8E1C3ACE,0x19C7,0x4E00,0x8B,0x92,0xD8,0x04,0x31,0xD9,0x58,0xBE); - - -MIDL_DEFINE_GUID(IID, IID_IBMDStreamingDeviceNotificationCallback,0xF9531D64,0x3305,0x4B29,0xA3,0x87,0x7F,0x74,0xBB,0x0D,0x0E,0x84); - - -MIDL_DEFINE_GUID(IID, IID_IBMDStreamingH264InputCallback,0x823C475F,0x55AE,0x46F9,0x89,0x0C,0x53,0x7C,0xC5,0xCE,0xDC,0xCA); - - -MIDL_DEFINE_GUID(IID, IID_IBMDStreamingDiscovery,0x2C837444,0xF989,0x4D87,0x90,0x1A,0x47,0xC8,0xA3,0x6D,0x09,0x6D); - - -MIDL_DEFINE_GUID(IID, IID_IBMDStreamingVideoEncodingMode,0x1AB8035B,0xCD13,0x458D,0xB6,0xDF,0x5E,0x8F,0x7C,0x21,0x41,0xD9); - - -MIDL_DEFINE_GUID(IID, IID_IBMDStreamingMutableVideoEncodingMode,0x19BF7D90,0x1E0A,0x400D,0xB2,0xC6,0xFF,0xC4,0xE7,0x8A,0xD4,0x9D); - - -MIDL_DEFINE_GUID(IID, IID_IBMDStreamingVideoEncodingModePresetIterator,0x7AC731A3,0xC950,0x4AD0,0x80,0x4A,0x83,0x77,0xAA,0x51,0xC6,0xC4); - - -MIDL_DEFINE_GUID(IID, IID_IBMDStreamingDeviceInput,0x24B6B6EC,0x1727,0x44BB,0x98,0x18,0x34,0xFF,0x08,0x6A,0xCF,0x98); - - -MIDL_DEFINE_GUID(IID, IID_IBMDStreamingH264NALPacket,0xE260E955,0x14BE,0x4395,0x97,0x75,0x9F,0x02,0xCC,0x0A,0x9D,0x89); - - -MIDL_DEFINE_GUID(IID, IID_IBMDStreamingAudioPacket,0xD9EB5902,0x1AD2,0x43F4,0x9E,0x2C,0x3C,0xFA,0x50,0xB5,0xEE,0x19); - - -MIDL_DEFINE_GUID(IID, IID_IBMDStreamingMPEG2TSPacket,0x91810D1C,0x4FB3,0x4AAA,0xAE,0x56,0xFA,0x30,0x1D,0x3D,0xFA,0x4C); - - -MIDL_DEFINE_GUID(IID, IID_IBMDStreamingH264NALParser,0x5867F18C,0x5BFA,0x4CCC,0xB2,0xA7,0x9D,0xFD,0x14,0x04,0x17,0xD2); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CBMDStreamingDiscovery,0x23A4EDF5,0xA0E5,0x432C,0x94,0xEF,0x3B,0xAB,0xB5,0xF8,0x1C,0x82); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CBMDStreamingH264NALParser,0x7753EFBD,0x951C,0x407C,0x97,0xA5,0x23,0xC7,0x37,0xB7,0x3B,0x52); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoOutputCallback,0x20AA5225,0x1958,0x47CB,0x82,0x0B,0x80,0xA8,0xD5,0x21,0xA6,0xEE); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkInputCallback,0xDD04E5EC,0x7415,0x42AB,0xAE,0x4A,0xE8,0x0C,0x4D,0xFC,0x04,0x4A); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderInputCallback,0xACF13E61,0xF4A0,0x4974,0xA6,0xA7,0x59,0xAF,0xF6,0x26,0x8B,0x31); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkMemoryAllocator,0xB36EB6E7,0x9D29,0x4AA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkAudioOutputCallback,0x403C681B,0x7F46,0x4A12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkIterator,0x50FB36CD,0x3063,0x4B73,0xBD,0xBB,0x95,0x80,0x87,0xF2,0xD8,0xBA); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkAPIInformation,0x7BEA3C68,0x730D,0x4322,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput,0x065A0F6C,0xC508,0x4D0D,0xB9,0x19,0xF5,0xEB,0x0E,0xBF,0xC9,0x6B); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput,0x2A88CF76,0xF494,0x4216,0xA7,0xEF,0xDC,0x74,0xEE,0xB8,0x38,0x82); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkHDMIInputEDID,0xABBBACBC,0x45BC,0x4665,0x9D,0x92,0xAC,0xE6,0xE5,0xA9,0x79,0x02); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderInput,0xF222551D,0x13DF,0x4FD8,0xB5,0x87,0x9D,0x4F,0x19,0xEC,0x12,0xC9); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrame,0x3F716FE0,0xF023,0x4111,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkMutableVideoFrame,0x69E2639F,0x40DA,0x4E19,0xB6,0xF2,0x20,0xAC,0xE8,0x15,0xC3,0x90); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrame3DExtensions,0xDA0F7E4A,0xEDC7,0x48A8,0x9C,0xDD,0x2D,0xB5,0x1C,0x72,0x9C,0xD7); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrameMetadataExtensions,0xD5973DC9,0x6432,0x46D0,0x8F,0x0B,0x24,0x96,0xF8,0xA1,0x23,0x8F); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoInputFrame,0x05CFE374,0x537C,0x4094,0x9A,0x57,0x68,0x05,0x25,0x11,0x8F,0x44); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkAncillaryPacket,0xCC5BBF7E,0x029C,0x4D3B,0x91,0x58,0x60,0x00,0xEF,0x5E,0x36,0x70); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkAncillaryPacketIterator,0x3FC8994B,0x88FB,0x4C17,0x96,0x8F,0x9A,0xAB,0x69,0xD9,0x64,0xA7); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrameAncillaryPackets,0x6C186C0F,0x459E,0x41D8,0xAE,0xE2,0x48,0x12,0xD8,0x1A,0xEE,0x68); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrameAncillary,0x732E723C,0xD1A4,0x4E29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderPacket,0xB693F36C,0x316E,0x4AF1,0xB6,0xC2,0xF3,0x89,0xA4,0xBC,0xA6,0x20); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderVideoPacket,0x4E7FD944,0xE8C7,0x4EAC,0xB8,0xC0,0x7B,0x77,0xF8,0x0F,0x5A,0xE0); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderAudioPacket,0x49E8EDC8,0x693B,0x4E14,0x8E,0xF6,0x12,0xC6,0x58,0xF5,0xA0,0x7A); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkH265NALPacket,0x639C8E0B,0x68D5,0x4BDE,0xA6,0xD4,0x95,0xF3,0xAE,0xAF,0xF2,0xE7); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkAudioInputPacket,0xE43D5870,0x2894,0x11DE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkScreenPreviewCallback,0xB1D3F49A,0x85FE,0x4C5D,0x95,0xC8,0x0B,0x5D,0x5D,0xCC,0xD4,0x38); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkGLScreenPreviewHelper,0x504E2209,0xCAC7,0x4C1A,0x9F,0xB4,0xC5,0xBB,0x62,0x74,0xD2,0x2F); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDX9ScreenPreviewHelper,0x2094B522,0xD1A1,0x40C0,0x9A,0xC7,0x1C,0x01,0x22,0x18,0xEF,0x02); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkNotificationCallback,0xb002a1ec,0x070d,0x4288,0x82,0x89,0xbd,0x5d,0x36,0xe5,0xff,0x0d); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkNotification,0xb85df4c8,0xbdf5,0x47c1,0x80,0x64,0x28,0x16,0x2e,0xbd,0xd4,0xeb); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkProfileAttributes,0x17D4BF8E,0x4911,0x473A,0x80,0xA0,0x73,0x1C,0xF6,0xFF,0x34,0x5B); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkProfileIterator,0x29E5A8C0,0x8BE4,0x46EB,0x93,0xAC,0x31,0xDA,0xAB,0x5B,0x7B,0xF2); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkProfile,0x16093466,0x674A,0x432B,0x9D,0xA0,0x1A,0xC2,0xC5,0xA8,0x24,0x1C); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkProfileCallback,0xA4F9341E,0x97AA,0x4E04,0x89,0x35,0x15,0xF8,0x09,0x89,0x8C,0xEA); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkProfileManager,0x30D41429,0x3998,0x4B6D,0x84,0xF8,0x78,0xC9,0x4A,0x79,0x7C,0x6E); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkStatus,0x5F558200,0x4028,0x49BC,0xBE,0xAC,0xDB,0x3F,0xA4,0xA9,0x6E,0x46); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkKeyer,0x89AFCAF5,0x65F8,0x421E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoConversion,0x3BBCB8A2,0xDA2C,0x42D9,0xB5,0xD8,0x88,0x08,0x36,0x44,0xE9,0x9A); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeviceNotificationCallback,0x4997053B,0x0ADF,0x4CC8,0xAC,0x70,0x7A,0x50,0xC4,0xBE,0x72,0x8F); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDiscovery,0xCDBF631C,0xBC76,0x45FA,0xB4,0x4D,0xC5,0x50,0x59,0xBC,0x61,0x01); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkIterator,0xBA6C6F44,0x6DA5,0x4DCE,0x94,0xAA,0xEE,0x2D,0x13,0x72,0xA6,0x76); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkAPIInformation,0x263CA19F,0xED09,0x482E,0x9F,0x9D,0x84,0x00,0x57,0x83,0xA2,0x37); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkGLScreenPreviewHelper,0xF63E77C7,0xB655,0x4A4A,0x9A,0xD0,0x3C,0xA8,0x5D,0x39,0x43,0x43); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkDX9ScreenPreviewHelper,0xCC010023,0xE01D,0x4525,0x9D,0x59,0x80,0xC8,0xAB,0x3D,0xC7,0xA0); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkVideoConversion,0x7DBBBB11,0x5B7B,0x467D,0xAE,0xA4,0xCE,0xA4,0x68,0xFD,0x36,0x8C); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkDiscovery,0x22FBFC33,0x8D07,0x495C,0xA5,0xBF,0xDA,0xB5,0xEA,0x9B,0x82,0xDB); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkVideoFrameAncillaryPackets,0xF891AD29,0xD0C2,0x46E9,0xA9,0x26,0x4E,0x2D,0x0D,0xD8,0xCF,0xAD); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration_v10_11,0xEF90380B,0x4AE5,0x4346,0x90,0x77,0xE2,0x88,0xE1,0x49,0xF1,0x29); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkAttributes_v10_11,0xABC11843,0xD966,0x44CB,0x96,0xE2,0xA1,0xCB,0x5D,0x31,0x35,0xC4); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkNotification_v10_11,0x0A1FB207,0xE215,0x441B,0x9B,0x19,0x6F,0xA1,0x57,0x59,0x46,0xC5); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput_v10_11,0xCC5C8A6E,0x3F2F,0x4B3A,0x87,0xEA,0xFD,0x78,0xAF,0x30,0x05,0x64); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v10_11,0xAF22762B,0xDFAC,0x4846,0xAA,0x79,0xFA,0x88,0x83,0x56,0x09,0x95); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderInput_v10_11,0x270587DA,0x6B7D,0x42E7,0xA1,0xF0,0x6D,0x85,0x3F,0x58,0x11,0x85); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkIterator_v10_11,0x87D2693F,0x8D4A,0x45C7,0xB4,0x3F,0x10,0xAC,0xBA,0x25,0xE6,0x8F); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkDiscovery_v10_11,0x652615D4,0x26CD,0x4514,0xB1,0x61,0x2F,0xD5,0x07,0x2E,0xD0,0x08); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration_v10_9,0xCB71734A,0xFE37,0x4E8D,0x8E,0x13,0x80,0x21,0x33,0xA1,0xC3,0xF2); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CBMDStreamingDiscovery_v10_8,0x0CAA31F6,0x8A26,0x40B0,0x86,0xA4,0xBF,0x58,0xDC,0xCA,0x71,0x0C); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkIterator_v10_8,0x1F2E109A,0x8F4F,0x49E4,0x92,0x03,0x13,0x55,0x95,0xCB,0x6F,0xA5); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkDiscovery_v10_8,0x1073A05C,0xD885,0x47E9,0xB3,0xC6,0x12,0x9B,0x3F,0x9F,0x64,0x8B); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderConfiguration_v10_5,0x67455668,0x0848,0x45DF,0x8D,0x8E,0x35,0x0A,0x77,0xC9,0xA0,0x28); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration_v10_4,0x1E69FCF6,0x4203,0x4936,0x80,0x76,0x2A,0x9F,0x4C,0xFD,0x50,0xCB); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration_v10_2,0xC679A35B,0x610C,0x4D09,0xB7,0x48,0x1D,0x04,0x78,0x10,0x0F,0xC0); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput_v9_9,0xA3EF0963,0x0862,0x44ED,0x92,0xA9,0xEE,0x89,0xAB,0xF4,0x31,0xC7); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v9_2,0x6D40EF78,0x28B9,0x4E21,0x99,0x0D,0x95,0xBB,0x77,0x50,0xA0,0x4F); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeckControlStatusCallback_v8_1,0xE5F693C1,0x4283,0x4716,0xB1,0x8F,0xC1,0x43,0x15,0x21,0x95,0x5B); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeckControl_v8_1,0x522A9E39,0x0F3C,0x4742,0x94,0xEE,0xD8,0x0D,0xE3,0x35,0xDA,0x1D); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLink_v8_0,0x62BFF75D,0x6569,0x4E55,0x8D,0x4D,0x66,0xAA,0x03,0x82,0x9A,0xBC); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkIterator_v8_0,0x74E936FC,0xCC28,0x4A67,0x81,0xA0,0x1E,0x94,0xE5,0x2D,0x4E,0x69); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkIterator_v8_0,0xD9EDA3B3,0x2887,0x41FA,0xB7,0x24,0x01,0x7C,0xF1,0xEB,0x1D,0x37); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeckControl_v7_9,0xA4D81043,0x0619,0x42B7,0x8E,0xD6,0x60,0x2D,0x29,0x04,0x1D,0xF7); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayModeIterator_v7_6,0x455D741F,0x1779,0x4800,0x86,0xF5,0x0B,0x5D,0x13,0xD7,0x97,0x51); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayMode_v7_6,0x87451E84,0x2B7E,0x439E,0xA6,0x29,0x43,0x93,0xEA,0x4A,0x85,0x50); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput_v7_6,0x29228142,0xEB8C,0x4141,0xA6,0x21,0xF7,0x40,0x26,0x45,0x09,0x55); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v7_6,0x300C135A,0x9F43,0x48E2,0x99,0x06,0x6D,0x79,0x11,0xD9,0x3C,0xF1); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkTimecode_v7_6,0xEFB9BCA6,0xA521,0x44F7,0xBD,0x69,0x23,0x32,0xF2,0x4D,0x9E,0xE6); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrame_v7_6,0xA8D8238E,0x6B18,0x4196,0x99,0xE1,0x5A,0xF7,0x17,0xB8,0x3D,0x32); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkMutableVideoFrame_v7_6,0x46FCEE00,0xB4E6,0x43D0,0x91,0xC0,0x02,0x3A,0x7F,0xCE,0xB3,0x4F); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoInputFrame_v7_6,0x9A74FA41,0xAE9F,0x47AC,0x8C,0xF4,0x01,0xF4,0x2D,0xD5,0x99,0x65); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkScreenPreviewCallback_v7_6,0x373F499D,0x4B4D,0x4518,0xAD,0x22,0x63,0x54,0xE5,0xA5,0x82,0x5E); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkGLScreenPreviewHelper_v7_6,0xBA575CD9,0xA15E,0x497B,0xB2,0xC2,0xF9,0xAF,0xE7,0xBE,0x4E,0xBA); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoConversion_v7_6,0x3EB504C9,0xF97D,0x40FE,0xA1,0x58,0xD4,0x07,0xD4,0x8C,0xB5,0x3B); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration_v7_6,0xB8EAD569,0xB764,0x47F0,0xA7,0x3F,0xAE,0x40,0xDF,0x6C,0xBF,0x10); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoOutputCallback_v7_6,0xE763A626,0x4A3C,0x49D1,0xBF,0x13,0xE7,0xAD,0x36,0x92,0xAE,0x52); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkInputCallback_v7_6,0x31D28EE7,0x88B6,0x4CB1,0x89,0x7A,0xCD,0xBF,0x79,0xA2,0x64,0x14); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkGLScreenPreviewHelper_v7_6,0xD398CEE7,0x4434,0x4CA3,0x9B,0xA6,0x5A,0xE3,0x45,0x56,0xB9,0x05); - - -MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkVideoConversion_v7_6,0xFFA84F77,0x73BE,0x4FB7,0xB0,0x3E,0xB5,0xE4,0x4B,0x9F,0x75,0x9B); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkInputCallback_v7_3,0xFD6F311D,0x4D00,0x444B,0x9E,0xD4,0x1F,0x25,0xB5,0x73,0x0A,0xD0); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput_v7_3,0x271C65E3,0xC323,0x4344,0xA3,0x0F,0xD9,0x08,0xBC,0xB2,0x0A,0xA3); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v7_3,0x4973F012,0x9925,0x458C,0x87,0x1C,0x18,0x77,0x4C,0xDB,0xBE,0xCB); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoInputFrame_v7_3,0xCF317790,0x2894,0x11DE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayModeIterator_v7_1,0xB28131B6,0x59AC,0x4857,0xB5,0xAC,0xCD,0x75,0xD5,0x88,0x3E,0x2F); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayMode_v7_1,0xAF0CD6D5,0x8376,0x435E,0x84,0x33,0x54,0xF9,0xDD,0x53,0x0A,0xC3); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrame_v7_1,0x333F3A10,0x8C2D,0x43CF,0xB7,0x9D,0x46,0x56,0x0F,0xEE,0xA1,0xCE); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoInputFrame_v7_1,0xC8B41D95,0x8848,0x40EE,0x9B,0x37,0x6E,0x34,0x17,0xFB,0x11,0x4B); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkAudioInputPacket_v7_1,0xC86DE4F6,0xA29F,0x42E3,0xAB,0x3A,0x13,0x63,0xE2,0x9F,0x07,0x88); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoOutputCallback_v7_1,0xEBD01AFA,0xE4B0,0x49C6,0xA0,0x1D,0xED,0xB9,0xD1,0xB5,0x5F,0xD9); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkInputCallback_v7_1,0x7F94F328,0x5ED4,0x4E9F,0x97,0x29,0x76,0xA8,0x6B,0xDC,0x99,0xCC); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput_v7_1,0xAE5B3E9B,0x4E1E,0x4535,0xB6,0xE8,0x48,0x0F,0xF5,0x2F,0x6C,0xE5); - - -MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v7_1,0x2B54EDEF,0x5B32,0x429F,0xBA,0x11,0xBB,0x99,0x05,0x96,0xEA,0xCD); - -#undef MIDL_DEFINE_GUID - -#ifdef __cplusplus -} -#endif - - + +/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */ + +/* link this file in with the server and any clients */ + + + /* File created by MIDL compiler version 8.01.0626 */ +/* at Tue Jan 19 12:14:07 2038 + */ +/* Compiler settings for ..\..\Blackmagic_DeckLink_SDK_12.2.2\BlackmagicDeckLinkSDK12.2.2\Win\include\DeckLinkAPI.idl: + Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0626 + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +/* @@MIDL_FILE_HEADING( ) */ + +#ifdef _MSC_VER +#pragma warning( disable: 4049 ) /* more than 64k source lines */ +#endif + + +#ifdef __cplusplus +extern "C"{ +#endif + + +#include <rpc.h> +#include <rpcndr.h> + +#ifdef _MIDL_USE_GUIDDEF_ + +#ifndef INITGUID +#define INITGUID +#include <guiddef.h> +#undef INITGUID +#else +#include <guiddef.h> +#endif + +#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ + DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) + +#else // !_MIDL_USE_GUIDDEF_ + +#ifndef __IID_DEFINED__ +#define __IID_DEFINED__ + +typedef struct _IID +{ + unsigned long x; + unsigned short s1; + unsigned short s2; + unsigned char c8; +} IID; + +#endif // __IID_DEFINED__ + +#ifndef CLSID_DEFINED +#define CLSID_DEFINED +typedef IID CLSID; +#endif // CLSID_DEFINED + +#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ + const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} + +#endif // !_MIDL_USE_GUIDDEF_ + +MIDL_DEFINE_GUID(IID, LIBID_DeckLinkAPI,0xD864517A,0xEDD5,0x466D,0x86,0x7D,0xC8,0x19,0xF1,0xC0,0x52,0xBB); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkTimecode,0xBC6CFBD3,0x8317,0x4325,0xAC,0x1C,0x12,0x16,0x39,0x1E,0x93,0x40); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayModeIterator,0x9C88499F,0xF601,0x4021,0xB8,0x0B,0x03,0x2E,0x4E,0xB4,0x1C,0x35); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayMode,0x3EB2C1AB,0x0A3D,0x4523,0xA3,0xAD,0xF4,0x0D,0x7F,0xB1,0x4E,0x78); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLink,0xC418FBDD,0x0587,0x48ED,0x8F,0xE5,0x64,0x0F,0x0A,0x14,0xAF,0x91); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration,0x912F634B,0x2D4E,0x40A4,0x8A,0xAB,0x8D,0x80,0xB7,0x3F,0x12,0x89); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderConfiguration,0x138050E5,0xC60A,0x4552,0xBF,0x3F,0x0F,0x35,0x80,0x49,0x32,0x7E); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeckControlStatusCallback,0x53436FFB,0xB434,0x4906,0xBA,0xDC,0xAE,0x30,0x60,0xFF,0xE8,0xEF); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeckControl,0x8E1C3ACE,0x19C7,0x4E00,0x8B,0x92,0xD8,0x04,0x31,0xD9,0x58,0xBE); + + +MIDL_DEFINE_GUID(IID, IID_IBMDStreamingDeviceNotificationCallback,0xF9531D64,0x3305,0x4B29,0xA3,0x87,0x7F,0x74,0xBB,0x0D,0x0E,0x84); + + +MIDL_DEFINE_GUID(IID, IID_IBMDStreamingH264InputCallback,0x823C475F,0x55AE,0x46F9,0x89,0x0C,0x53,0x7C,0xC5,0xCE,0xDC,0xCA); + + +MIDL_DEFINE_GUID(IID, IID_IBMDStreamingDiscovery,0x2C837444,0xF989,0x4D87,0x90,0x1A,0x47,0xC8,0xA3,0x6D,0x09,0x6D); + + +MIDL_DEFINE_GUID(IID, IID_IBMDStreamingVideoEncodingMode,0x1AB8035B,0xCD13,0x458D,0xB6,0xDF,0x5E,0x8F,0x7C,0x21,0x41,0xD9); + + +MIDL_DEFINE_GUID(IID, IID_IBMDStreamingMutableVideoEncodingMode,0x19BF7D90,0x1E0A,0x400D,0xB2,0xC6,0xFF,0xC4,0xE7,0x8A,0xD4,0x9D); + + +MIDL_DEFINE_GUID(IID, IID_IBMDStreamingVideoEncodingModePresetIterator,0x7AC731A3,0xC950,0x4AD0,0x80,0x4A,0x83,0x77,0xAA,0x51,0xC6,0xC4); + + +MIDL_DEFINE_GUID(IID, IID_IBMDStreamingDeviceInput,0x24B6B6EC,0x1727,0x44BB,0x98,0x18,0x34,0xFF,0x08,0x6A,0xCF,0x98); + + +MIDL_DEFINE_GUID(IID, IID_IBMDStreamingH264NALPacket,0xE260E955,0x14BE,0x4395,0x97,0x75,0x9F,0x02,0xCC,0x0A,0x9D,0x89); + + +MIDL_DEFINE_GUID(IID, IID_IBMDStreamingAudioPacket,0xD9EB5902,0x1AD2,0x43F4,0x9E,0x2C,0x3C,0xFA,0x50,0xB5,0xEE,0x19); + + +MIDL_DEFINE_GUID(IID, IID_IBMDStreamingMPEG2TSPacket,0x91810D1C,0x4FB3,0x4AAA,0xAE,0x56,0xFA,0x30,0x1D,0x3D,0xFA,0x4C); + + +MIDL_DEFINE_GUID(IID, IID_IBMDStreamingH264NALParser,0x5867F18C,0x5BFA,0x4CCC,0xB2,0xA7,0x9D,0xFD,0x14,0x04,0x17,0xD2); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CBMDStreamingDiscovery,0x23A4EDF5,0xA0E5,0x432C,0x94,0xEF,0x3B,0xAB,0xB5,0xF8,0x1C,0x82); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CBMDStreamingH264NALParser,0x7753EFBD,0x951C,0x407C,0x97,0xA5,0x23,0xC7,0x37,0xB7,0x3B,0x52); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoOutputCallback,0x20AA5225,0x1958,0x47CB,0x82,0x0B,0x80,0xA8,0xD5,0x21,0xA6,0xEE); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkInputCallback,0xC6FCE4C9,0xC4E4,0x4047,0x82,0xFB,0x5D,0x23,0x82,0x32,0xA9,0x02); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderInputCallback,0xACF13E61,0xF4A0,0x4974,0xA6,0xA7,0x59,0xAF,0xF6,0x26,0x8B,0x31); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkMemoryAllocator,0xB36EB6E7,0x9D29,0x4AA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkAudioOutputCallback,0x403C681B,0x7F46,0x4A12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkIterator,0x50FB36CD,0x3063,0x4B73,0xBD,0xBB,0x95,0x80,0x87,0xF2,0xD8,0xBA); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkAPIInformation,0x7BEA3C68,0x730D,0x4322,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput,0xBE2D9020,0x461E,0x442F,0x84,0xB7,0xE9,0x49,0xCB,0x95,0x3B,0x9D); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput,0xC21CDB6E,0xF414,0x46E4,0xA6,0x36,0x80,0xA5,0x66,0xE0,0xED,0x37); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkHDMIInputEDID,0xABBBACBC,0x45BC,0x4665,0x9D,0x92,0xAC,0xE6,0xE5,0xA9,0x79,0x02); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderInput,0xF222551D,0x13DF,0x4FD8,0xB5,0x87,0x9D,0x4F,0x19,0xEC,0x12,0xC9); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrame,0x3F716FE0,0xF023,0x4111,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkMutableVideoFrame,0x69E2639F,0x40DA,0x4E19,0xB6,0xF2,0x20,0xAC,0xE8,0x15,0xC3,0x90); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrame3DExtensions,0xDA0F7E4A,0xEDC7,0x48A8,0x9C,0xDD,0x2D,0xB5,0x1C,0x72,0x9C,0xD7); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrameMetadataExtensions,0xE232A5B7,0x4DB4,0x44C9,0x91,0x52,0xF4,0x7C,0x12,0xE5,0xF0,0x51); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoInputFrame,0x05CFE374,0x537C,0x4094,0x9A,0x57,0x68,0x05,0x25,0x11,0x8F,0x44); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkAncillaryPacket,0xCC5BBF7E,0x029C,0x4D3B,0x91,0x58,0x60,0x00,0xEF,0x5E,0x36,0x70); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkAncillaryPacketIterator,0x3FC8994B,0x88FB,0x4C17,0x96,0x8F,0x9A,0xAB,0x69,0xD9,0x64,0xA7); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrameAncillaryPackets,0x6C186C0F,0x459E,0x41D8,0xAE,0xE2,0x48,0x12,0xD8,0x1A,0xEE,0x68); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrameAncillary,0x732E723C,0xD1A4,0x4E29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderPacket,0xB693F36C,0x316E,0x4AF1,0xB6,0xC2,0xF3,0x89,0xA4,0xBC,0xA6,0x20); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderVideoPacket,0x4E7FD944,0xE8C7,0x4EAC,0xB8,0xC0,0x7B,0x77,0xF8,0x0F,0x5A,0xE0); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderAudioPacket,0x49E8EDC8,0x693B,0x4E14,0x8E,0xF6,0x12,0xC6,0x58,0xF5,0xA0,0x7A); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkH265NALPacket,0x639C8E0B,0x68D5,0x4BDE,0xA6,0xD4,0x95,0xF3,0xAE,0xAF,0xF2,0xE7); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkAudioInputPacket,0xE43D5870,0x2894,0x11DE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkScreenPreviewCallback,0xB1D3F49A,0x85FE,0x4C5D,0x95,0xC8,0x0B,0x5D,0x5D,0xCC,0xD4,0x38); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkGLScreenPreviewHelper,0x504E2209,0xCAC7,0x4C1A,0x9F,0xB4,0xC5,0xBB,0x62,0x74,0xD2,0x2F); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDX9ScreenPreviewHelper,0x2094B522,0xD1A1,0x40C0,0x9A,0xC7,0x1C,0x01,0x22,0x18,0xEF,0x02); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkNotificationCallback,0xb002a1ec,0x070d,0x4288,0x82,0x89,0xbd,0x5d,0x36,0xe5,0xff,0x0d); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkNotification,0xb85df4c8,0xbdf5,0x47c1,0x80,0x64,0x28,0x16,0x2e,0xbd,0xd4,0xeb); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkProfileAttributes,0x17D4BF8E,0x4911,0x473A,0x80,0xA0,0x73,0x1C,0xF6,0xFF,0x34,0x5B); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkProfileIterator,0x29E5A8C0,0x8BE4,0x46EB,0x93,0xAC,0x31,0xDA,0xAB,0x5B,0x7B,0xF2); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkProfile,0x16093466,0x674A,0x432B,0x9D,0xA0,0x1A,0xC2,0xC5,0xA8,0x24,0x1C); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkProfileCallback,0xA4F9341E,0x97AA,0x4E04,0x89,0x35,0x15,0xF8,0x09,0x89,0x8C,0xEA); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkProfileManager,0x30D41429,0x3998,0x4B6D,0x84,0xF8,0x78,0xC9,0x4A,0x79,0x7C,0x6E); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkStatus,0x5F558200,0x4028,0x49BC,0xBE,0xAC,0xDB,0x3F,0xA4,0xA9,0x6E,0x46); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkKeyer,0x89AFCAF5,0x65F8,0x421E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoConversion,0x3BBCB8A2,0xDA2C,0x42D9,0xB5,0xD8,0x88,0x08,0x36,0x44,0xE9,0x9A); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeviceNotificationCallback,0x4997053B,0x0ADF,0x4CC8,0xAC,0x70,0x7A,0x50,0xC4,0xBE,0x72,0x8F); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDiscovery,0xCDBF631C,0xBC76,0x45FA,0xB4,0x4D,0xC5,0x50,0x59,0xBC,0x61,0x01); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkIterator,0xBA6C6F44,0x6DA5,0x4DCE,0x94,0xAA,0xEE,0x2D,0x13,0x72,0xA6,0x76); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkAPIInformation,0x263CA19F,0xED09,0x482E,0x9F,0x9D,0x84,0x00,0x57,0x83,0xA2,0x37); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkGLScreenPreviewHelper,0xF63E77C7,0xB655,0x4A4A,0x9A,0xD0,0x3C,0xA8,0x5D,0x39,0x43,0x43); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkDX9ScreenPreviewHelper,0xCC010023,0xE01D,0x4525,0x9D,0x59,0x80,0xC8,0xAB,0x3D,0xC7,0xA0); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkVideoConversion,0x7DBBBB11,0x5B7B,0x467D,0xAE,0xA4,0xCE,0xA4,0x68,0xFD,0x36,0x8C); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkDiscovery,0x22FBFC33,0x8D07,0x495C,0xA5,0xBF,0xDA,0xB5,0xEA,0x9B,0x82,0xDB); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkVideoFrameAncillaryPackets,0xF891AD29,0xD0C2,0x46E9,0xA9,0x26,0x4E,0x2D,0x0D,0xD8,0xCF,0xAD); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkInputCallback_v11_5_1,0xDD04E5EC,0x7415,0x42AB,0xAE,0x4A,0xE8,0x0C,0x4D,0xFC,0x04,0x4A); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v11_5_1,0x9434C6E4,0xB15D,0x4B1C,0x97,0x9E,0x66,0x1E,0x3D,0xDC,0xB4,0xB9); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration_v10_11,0xEF90380B,0x4AE5,0x4346,0x90,0x77,0xE2,0x88,0xE1,0x49,0xF1,0x29); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkAttributes_v10_11,0xABC11843,0xD966,0x44CB,0x96,0xE2,0xA1,0xCB,0x5D,0x31,0x35,0xC4); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkNotification_v10_11,0x0A1FB207,0xE215,0x441B,0x9B,0x19,0x6F,0xA1,0x57,0x59,0x46,0xC5); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput_v10_11,0xCC5C8A6E,0x3F2F,0x4B3A,0x87,0xEA,0xFD,0x78,0xAF,0x30,0x05,0x64); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v10_11,0xAF22762B,0xDFAC,0x4846,0xAA,0x79,0xFA,0x88,0x83,0x56,0x09,0x95); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderInput_v10_11,0x270587DA,0x6B7D,0x42E7,0xA1,0xF0,0x6D,0x85,0x3F,0x58,0x11,0x85); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkIterator_v10_11,0x87D2693F,0x8D4A,0x45C7,0xB4,0x3F,0x10,0xAC,0xBA,0x25,0xE6,0x8F); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkDiscovery_v10_11,0x652615D4,0x26CD,0x4514,0xB1,0x61,0x2F,0xD5,0x07,0x2E,0xD0,0x08); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration_v10_9,0xCB71734A,0xFE37,0x4E8D,0x8E,0x13,0x80,0x21,0x33,0xA1,0xC3,0xF2); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CBMDStreamingDiscovery_v10_8,0x0CAA31F6,0x8A26,0x40B0,0x86,0xA4,0xBF,0x58,0xDC,0xCA,0x71,0x0C); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration_v10_4,0x1E69FCF6,0x4203,0x4936,0x80,0x76,0x2A,0x9F,0x4C,0xFD,0x50,0xCB); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration_v10_2,0xC679A35B,0x610C,0x4D09,0xB7,0x48,0x1D,0x04,0x78,0x10,0x0F,0xC0); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrameMetadataExtensions_v11_5,0xD5973DC9,0x6432,0x46D0,0x8F,0x0B,0x24,0x96,0xF8,0xA1,0x23,0x8F); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput_v11_4,0x065A0F6C,0xC508,0x4D0D,0xB9,0x19,0xF5,0xEB,0x0E,0xBF,0xC9,0x6B); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v11_4,0x2A88CF76,0xF494,0x4216,0xA7,0xEF,0xDC,0x74,0xEE,0xB8,0x38,0x82); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkIterator_v10_8,0x1F2E109A,0x8F4F,0x49E4,0x92,0x03,0x13,0x55,0x95,0xCB,0x6F,0xA5); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkDiscovery_v10_8,0x1073A05C,0xD885,0x47E9,0xB3,0xC6,0x12,0x9B,0x3F,0x9F,0x64,0x8B); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkEncoderConfiguration_v10_5,0x67455668,0x0848,0x45DF,0x8D,0x8E,0x35,0x0A,0x77,0xC9,0xA0,0x28); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput_v9_9,0xA3EF0963,0x0862,0x44ED,0x92,0xA9,0xEE,0x89,0xAB,0xF4,0x31,0xC7); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v9_2,0x6D40EF78,0x28B9,0x4E21,0x99,0x0D,0x95,0xBB,0x77,0x50,0xA0,0x4F); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeckControlStatusCallback_v8_1,0xE5F693C1,0x4283,0x4716,0xB1,0x8F,0xC1,0x43,0x15,0x21,0x95,0x5B); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeckControl_v8_1,0x522A9E39,0x0F3C,0x4742,0x94,0xEE,0xD8,0x0D,0xE3,0x35,0xDA,0x1D); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLink_v8_0,0x62BFF75D,0x6569,0x4E55,0x8D,0x4D,0x66,0xAA,0x03,0x82,0x9A,0xBC); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkIterator_v8_0,0x74E936FC,0xCC28,0x4A67,0x81,0xA0,0x1E,0x94,0xE5,0x2D,0x4E,0x69); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkIterator_v8_0,0xD9EDA3B3,0x2887,0x41FA,0xB7,0x24,0x01,0x7C,0xF1,0xEB,0x1D,0x37); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDeckControl_v7_9,0xA4D81043,0x0619,0x42B7,0x8E,0xD6,0x60,0x2D,0x29,0x04,0x1D,0xF7); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayModeIterator_v7_6,0x455D741F,0x1779,0x4800,0x86,0xF5,0x0B,0x5D,0x13,0xD7,0x97,0x51); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayMode_v7_6,0x87451E84,0x2B7E,0x439E,0xA6,0x29,0x43,0x93,0xEA,0x4A,0x85,0x50); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput_v7_6,0x29228142,0xEB8C,0x4141,0xA6,0x21,0xF7,0x40,0x26,0x45,0x09,0x55); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v7_6,0x300C135A,0x9F43,0x48E2,0x99,0x06,0x6D,0x79,0x11,0xD9,0x3C,0xF1); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkTimecode_v7_6,0xEFB9BCA6,0xA521,0x44F7,0xBD,0x69,0x23,0x32,0xF2,0x4D,0x9E,0xE6); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrame_v7_6,0xA8D8238E,0x6B18,0x4196,0x99,0xE1,0x5A,0xF7,0x17,0xB8,0x3D,0x32); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkMutableVideoFrame_v7_6,0x46FCEE00,0xB4E6,0x43D0,0x91,0xC0,0x02,0x3A,0x7F,0xCE,0xB3,0x4F); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoInputFrame_v7_6,0x9A74FA41,0xAE9F,0x47AC,0x8C,0xF4,0x01,0xF4,0x2D,0xD5,0x99,0x65); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkScreenPreviewCallback_v7_6,0x373F499D,0x4B4D,0x4518,0xAD,0x22,0x63,0x54,0xE5,0xA5,0x82,0x5E); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkGLScreenPreviewHelper_v7_6,0xBA575CD9,0xA15E,0x497B,0xB2,0xC2,0xF9,0xAF,0xE7,0xBE,0x4E,0xBA); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoConversion_v7_6,0x3EB504C9,0xF97D,0x40FE,0xA1,0x58,0xD4,0x07,0xD4,0x8C,0xB5,0x3B); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration_v7_6,0xB8EAD569,0xB764,0x47F0,0xA7,0x3F,0xAE,0x40,0xDF,0x6C,0xBF,0x10); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoOutputCallback_v7_6,0xE763A626,0x4A3C,0x49D1,0xBF,0x13,0xE7,0xAD,0x36,0x92,0xAE,0x52); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkInputCallback_v7_6,0x31D28EE7,0x88B6,0x4CB1,0x89,0x7A,0xCD,0xBF,0x79,0xA2,0x64,0x14); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkGLScreenPreviewHelper_v7_6,0xD398CEE7,0x4434,0x4CA3,0x9B,0xA6,0x5A,0xE3,0x45,0x56,0xB9,0x05); + + +MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkVideoConversion_v7_6,0xFFA84F77,0x73BE,0x4FB7,0xB0,0x3E,0xB5,0xE4,0x4B,0x9F,0x75,0x9B); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkInputCallback_v7_3,0xFD6F311D,0x4D00,0x444B,0x9E,0xD4,0x1F,0x25,0xB5,0x73,0x0A,0xD0); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput_v7_3,0x271C65E3,0xC323,0x4344,0xA3,0x0F,0xD9,0x08,0xBC,0xB2,0x0A,0xA3); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v7_3,0x4973F012,0x9925,0x458C,0x87,0x1C,0x18,0x77,0x4C,0xDB,0xBE,0xCB); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoInputFrame_v7_3,0xCF317790,0x2894,0x11DE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayModeIterator_v7_1,0xB28131B6,0x59AC,0x4857,0xB5,0xAC,0xCD,0x75,0xD5,0x88,0x3E,0x2F); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayMode_v7_1,0xAF0CD6D5,0x8376,0x435E,0x84,0x33,0x54,0xF9,0xDD,0x53,0x0A,0xC3); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrame_v7_1,0x333F3A10,0x8C2D,0x43CF,0xB7,0x9D,0x46,0x56,0x0F,0xEE,0xA1,0xCE); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoInputFrame_v7_1,0xC8B41D95,0x8848,0x40EE,0x9B,0x37,0x6E,0x34,0x17,0xFB,0x11,0x4B); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkAudioInputPacket_v7_1,0xC86DE4F6,0xA29F,0x42E3,0xAB,0x3A,0x13,0x63,0xE2,0x9F,0x07,0x88); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoOutputCallback_v7_1,0xEBD01AFA,0xE4B0,0x49C6,0xA0,0x1D,0xED,0xB9,0xD1,0xB5,0x5F,0xD9); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkInputCallback_v7_1,0x7F94F328,0x5ED4,0x4E9F,0x97,0x29,0x76,0xA8,0x6B,0xDC,0x99,0xCC); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput_v7_1,0xAE5B3E9B,0x4E1E,0x4535,0xB6,0xE8,0x48,0x0F,0xF5,0x2F,0x6C,0xE5); + + +MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v7_1,0x2B54EDEF,0x5B32,0x429F,0xBA,0x11,0xBB,0x99,0x05,0x96,0xEA,0xCD); + +#undef MIDL_DEFINE_GUID + +#ifdef __cplusplus +} +#endif + /* *INDENT-ON* */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/dshowdeviceprovider.cpp
Changed
(renamed from sys/dshowsrcwrapper/dshowdeviceprovider.cpp)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/dshowdeviceprovider.h
Changed
(renamed from sys/dshowsrcwrapper/dshowdeviceprovider.h)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/dshowvideofakesrc.cpp
Added
@@ -0,0 +1,415 @@ +/* GStreamer + * Copyright (C) 2008 Pioneers of the Inevitable <songbird@songbirdnest.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "dshowvideofakesrc.h" + +GST_DEBUG_CATEGORY_EXTERN (dshowvideosink_debug); +#define GST_CAT_DEFAULT dshowvideosink_debug + +// {A0A5CF33-BD0C-4158-9A56-3011DEE3AF6B} +const GUID CLSID_VideoFakeSrc = +{ 0xa0a5cf33, 0xbd0c, 0x4158, { 0x9a, 0x56, 0x30, 0x11, 0xde, 0xe3, 0xaf, 0x6b } }; + +/* output pin*/ +VideoFakeSrcPin::VideoFakeSrcPin (CBaseFilter *pFilter, CCritSec *sec, HRESULT *hres): + CDynamicOutputPin("VideoFakeSrcPin", pFilter, sec, hres, L"output") +{ +} + +VideoFakeSrcPin::~VideoFakeSrcPin() +{ +} + +HRESULT VideoFakeSrcPin::GetMediaType(int iPosition, CMediaType *pMediaType) +{ + GST_DEBUG ("GetMediaType(%d) called", iPosition); + if(iPosition == 0) { + *pMediaType = m_MediaType; + return S_OK; + } + + return VFW_S_NO_MORE_ITEMS; +} + +/* This seems to be called to notify us of the actual media type being used, + * even though SetMediaType isn't called. How bizarre! */ +HRESULT VideoFakeSrcPin::CheckMediaType(const CMediaType *pmt) +{ + GST_DEBUG ("CheckMediaType called: %p", pmt); + + /* The video renderer will request a different stride, which we must accept. + * So, we accept arbitrary strides (and do memcpy() to convert if needed), + * and require the rest of the media type to match + */ + if (IsEqualGUID(pmt->majortype,m_MediaType.majortype) && + IsEqualGUID(pmt->subtype,m_MediaType.subtype) && + IsEqualGUID(pmt->formattype,m_MediaType.formattype) && + pmt->cbFormat >= m_MediaType.cbFormat) + { + if (IsEqualGUID(pmt->formattype, FORMAT_VideoInfo)) { + VIDEOINFOHEADER *newvh = (VIDEOINFOHEADER *)pmt->pbFormat; + VIDEOINFOHEADER *curvh = (VIDEOINFOHEADER *)m_MediaType.pbFormat; + + if ((memcmp ((void *)&newvh->rcSource, (void *)&curvh->rcSource, sizeof (RECT)) == 0) && + (memcmp ((void *)&newvh->rcTarget, (void *)&curvh->rcTarget, sizeof (RECT)) == 0) && + (newvh->bmiHeader.biCompression == curvh->bmiHeader.biCompression) && + (newvh->bmiHeader.biHeight == curvh->bmiHeader.biHeight) && + (newvh->bmiHeader.biWidth >= curvh->bmiHeader.biWidth)) + { + GST_DEBUG ("CheckMediaType has same media type, width %d (%d image)", newvh->bmiHeader.biWidth, curvh->bmiHeader.biWidth); + + /* OK, compatible! */ + return S_OK; + } + else { + GST_WARNING ("Looked similar, but aren't..."); + } + } + + } + GST_WARNING ("Different media types, FAILING!"); + return S_FALSE; +} + +HRESULT VideoFakeSrcPin::DecideBufferSize (IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest) +{ + ALLOCATOR_PROPERTIES properties; + GST_DEBUG ("Required allocator properties: %d, %d, %d, %d", + ppropInputRequest->cbAlign, ppropInputRequest->cbBuffer, + ppropInputRequest->cbPrefix, ppropInputRequest->cBuffers); + + ppropInputRequest->cbBuffer = m_SampleSize; + ppropInputRequest->cBuffers = 1; + + /* First set the buffer descriptions we're interested in */ + HRESULT hres = pAlloc->SetProperties(ppropInputRequest, &properties); + GST_DEBUG ("Actual Allocator properties: %d, %d, %d, %d", + properties.cbAlign, properties.cbBuffer, + properties.cbPrefix, properties.cBuffers); + + return S_OK; +} + +STDMETHODIMP +VideoFakeSrcPin::Notify(IBaseFilter * pSender, Quality q) +{ + /* Implementing this usefully is not required, but the base class + * has an assertion here... */ + /* TODO: Map this to GStreamer QOS events? */ + return E_NOTIMPL; +} + +STDMETHODIMP VideoFakeSrcPin::SetMediaType (AM_MEDIA_TYPE *pmt) +{ + m_MediaType.Set (*pmt); + m_SampleSize = m_MediaType.GetSampleSize(); + + GST_DEBUG ("SetMediaType called. SampleSize is %d", m_SampleSize); + + return S_OK; +} + +/* If the destination buffer is a different shape (strides, etc.) from the source + * buffer, we have to copy. Do that here, for supported video formats. + * + * TODO: When possible (when these things DON'T differ), we should buffer-alloc the + * final output buffer, and not do this copy */ +STDMETHODIMP VideoFakeSrcPin::CopyToDestinationBuffer (byte *srcbuf, byte *dstbuf) +{ + VIDEOINFOHEADER *vh = (VIDEOINFOHEADER *)m_MediaType.pbFormat; + GST_DEBUG ("Rendering a frame"); + + byte *src, *dst; + int dststride, srcstride, rows; + guint32 fourcc = vh->bmiHeader.biCompression; + + /* biHeight is always negative; we don't want that. */ + int height = ABS (vh->bmiHeader.biHeight); + int width = vh->bmiHeader.biWidth; + + /* YUY2 is the preferred layout for DirectShow, so we will probably get this + * most of the time */ + if ((fourcc == GST_MAKE_FOURCC ('Y', 'U', 'Y', '2')) || + (fourcc == GST_MAKE_FOURCC ('Y', 'U', 'Y', 'V')) || + (fourcc == GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'))) + { + /* Nice and simple */ + int srcstride = GST_ROUND_UP_4 (vh->rcSource.right * 2); + int dststride = width * 2; + + for (int i = 0; i < height; i++) { + memcpy (dstbuf + dststride * i, srcbuf + srcstride * i, srcstride); + } + } + else if (fourcc == GST_MAKE_FOURCC ('Y', 'V', '1', '2')) { + for (int component = 0; component < 3; component++) { + // TODO: Get format properly rather than hard-coding it. Use gst_video_* APIs *? + if (component == 0) { + srcstride = GST_ROUND_UP_4 (vh->rcSource.right); + src = srcbuf; + } + else { + srcstride = GST_ROUND_UP_4 ( GST_ROUND_UP_2 (vh->rcSource.right) / 2); + if (component == 1) + src = srcbuf + GST_ROUND_UP_4 (vh->rcSource.right) * GST_ROUND_UP_2 (vh->rcSource.bottom); + else + src = srcbuf + GST_ROUND_UP_4 (vh->rcSource.right) * GST_ROUND_UP_2 (vh->rcSource.bottom) + + srcstride * (GST_ROUND_UP_2 (vh->rcSource.bottom) / 2); + } + + /* Is there a better way to do this? This is ICK! */ + if (component == 0) { + dststride = width; + dst = dstbuf; + rows = height; + } else if (component == 1) { + dststride = width / 2; + dst = dstbuf + width * height; + rows = height/2; + } + else { + dststride = width / 2; + dst = dstbuf + width * height + + width/2 * height/2; + rows = height/2; + } + + for (int i = 0; i < rows; i++) { + memcpy (dst + i * dststride, src + i * srcstride, srcstride); + } + } + } + + return S_OK; +} + +STDMETHODIMP VideoFakeSrcPin::Disconnect () +{ + GST_DEBUG_OBJECT (this, "Disconnecting pin"); + HRESULT hr = CDynamicOutputPin::Disconnect(); + GST_DEBUG_OBJECT (this, "Pin disconnected"); + return hr; +} + +HRESULT VideoFakeSrcPin::Inactive () +{ + GST_DEBUG_OBJECT (this, "Pin going inactive"); + HRESULT hr = CDynamicOutputPin::Inactive(); + GST_DEBUG_OBJECT (this, "Pin inactivated"); + return hr; +} + +HRESULT VideoFakeSrcPin::BreakConnect () +{ + GST_DEBUG_OBJECT (this, "Breaking connection"); + HRESULT hr = CDynamicOutputPin::BreakConnect(); + GST_DEBUG_OBJECT (this, "Connection broken"); + return hr; +} + +HRESULT VideoFakeSrcPin::CompleteConnect (IPin *pReceivePin) +{ + GST_DEBUG_OBJECT (this, "Completing connection"); + HRESULT hr = CDynamicOutputPin::CompleteConnect(pReceivePin); + GST_DEBUG_OBJECT (this, "Completed connection: %x", hr); + return hr; +} + +STDMETHODIMP VideoFakeSrcPin::Block(DWORD dwBlockFlags, HANDLE hEvent) +{ + GST_DEBUG_OBJECT (this, "Calling Block()"); + HRESULT hr = CDynamicOutputPin::Block (dwBlockFlags, hEvent); + GST_DEBUG_OBJECT (this, "Called Block()"); + return hr; +} + +/* When moving the video to a different monitor, directshow stops and restarts the playback pipeline. + * Unfortunately, it doesn't properly block pins or do anything special, so we racily just fail + * at this point. + * So, we try multiple times in a loop, hoping that it'll have finished (we get no notifications at all!) + * at some point. + */ +#define MAX_ATTEMPTS 10 + +GstFlowReturn VideoFakeSrcPin::PushBuffer(GstBuffer *buffer) +{ + IMediaSample *pSample = NULL; + byte *data; + GstMapInfo map; + int attempts = 0; + HRESULT hres; + BYTE *sample_buffer; + AM_MEDIA_TYPE *mediatype; + + /* FIXME: check return value. */ + gst_buffer_map (buffer, &map, GST_MAP_READ); + data = map.data; + StartUsingOutputPin(); + + while (attempts < MAX_ATTEMPTS) + { + hres = GetDeliveryBuffer(&pSample, NULL, NULL, 0); + if (SUCCEEDED (hres)) + break; + attempts++; + Sleep(100); + } + + if (FAILED (hres)) + { + StopUsingOutputPin(); + GST_WARNING ("Could not get sample for delivery to sink: %x", hres); + return GST_FLOW_ERROR; + } + + pSample->GetPointer(&sample_buffer); + pSample->GetMediaType(&mediatype); + if (mediatype) + SetMediaType (mediatype); + + if(sample_buffer) + { + /* Copy to the destination stride. + * This is not just a simple memcpy because of the different strides. + * TODO: optimise for the same-stride case and avoid the copy entirely. + */ + CopyToDestinationBuffer (data, sample_buffer); + } + gst_buffer_unmap (buffer, &map); + + pSample->SetDiscontinuity(FALSE); /* Decoded frame; unimportant */ + pSample->SetSyncPoint(TRUE); /* Decoded frame; always a valid syncpoint */ + pSample->SetPreroll(FALSE); /* For non-displayed frames. + Not used in GStreamer */ + + /* Disable synchronising on this sample. We instead let GStreamer handle + * this at a higher level, inside BaseSink. */ + pSample->SetTime(NULL, NULL); + + while (attempts < MAX_ATTEMPTS) + { + hres = Deliver(pSample); + if (SUCCEEDED (hres)) + break; + attempts++; + Sleep(100); + } + + pSample->Release(); + + StopUsingOutputPin(); + + if (SUCCEEDED (hres)) + return GST_FLOW_OK; + else { + GST_WARNING_OBJECT (this, "Failed to deliver sample: %x", hres); + if (hres == VFW_E_NOT_CONNECTED) + return GST_FLOW_NOT_LINKED; + else + return GST_FLOW_ERROR; + } +} + +STDMETHODIMP VideoFakeSrcPin::Flush () +{ + DeliverBeginFlush(); + DeliverEndFlush(); + return S_OK; +} + +VideoFakeSrc::VideoFakeSrc() : CBaseFilter("VideoFakeSrc", NULL, &m_critsec, CLSID_VideoFakeSrc), + m_evFilterStoppingEvent(TRUE) +{ + HRESULT hr = S_OK; + m_pOutputPin = new VideoFakeSrcPin ((CSource *)this, &m_critsec, &hr); +} + +int VideoFakeSrc::GetPinCount() +{ + return 1; +} + +CBasePin *VideoFakeSrc::GetPin(int n) +{ + return (CBasePin *)m_pOutputPin; +} + +VideoFakeSrcPin *VideoFakeSrc::GetOutputPin() +{ + return m_pOutputPin; +} + +STDMETHODIMP VideoFakeSrc::Stop(void) +{ + GST_DEBUG_OBJECT (this, "Stop()"); + m_evFilterStoppingEvent.Set(); + + return CBaseFilter::Stop(); +} + +STDMETHODIMP VideoFakeSrc::Pause(void) +{ + GST_DEBUG_OBJECT (this, "Pause()"); + + m_evFilterStoppingEvent.Reset(); + + return CBaseFilter::Pause(); +} + +STDMETHODIMP VideoFakeSrc::Run(REFERENCE_TIME tStart) +{ + GST_DEBUG_OBJECT (this, "Run()"); + + return CBaseFilter::Run(tStart); +} + +STDMETHODIMP VideoFakeSrc::JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR pName) +{ + HRESULT hr; + + // The filter is joining the filter graph. + if(NULL != pGraph) + { + IGraphConfig* pGraphConfig = NULL; + hr = pGraph->QueryInterface(IID_IGraphConfig, (void**)&pGraphConfig); + if(FAILED(hr)) + return hr; + + hr = CBaseFilter::JoinFilterGraph(pGraph, pName); + if(FAILED(hr)) + { + pGraphConfig->Release(); + return hr; + } + + m_pOutputPin->SetConfigInfo(pGraphConfig, m_evFilterStoppingEvent); + pGraphConfig->Release(); + } + else + { + hr = CBaseFilter::JoinFilterGraph(pGraph, pName); + if(FAILED(hr)) + return hr; + + m_pOutputPin->SetConfigInfo(NULL, NULL); + } + + return S_OK; +} +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/dshowvideofakesrc.h
Changed
(renamed from sys/dshowvideosink/dshowvideofakesrc.h)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/dshowvideosink.cpp
Added
@@ -0,0 +1,1877 @@ +/* GStreamer + * Copyright (C) 2008 Pioneers of the Inevitable <songbird@songbirdnest.com> + * 2010 FLUENDO S.A. <support@fluendo.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "dshowvideosink.h" +#include "dshowvideofakesrc.h" + +#include <gst/video/video.h> +#include <gst/video/videooverlay.h> +#include <gst/video/navigation.h> + +#include "windows.h" + +#define WM_GRAPH_NOTIFY WM_APP + 1 /* Private message */ + +GST_DEBUG_CATEGORY (dshowvideosink_debug); +#define GST_CAT_DEFAULT dshowvideosink_debug + +static GstCaps * gst_directshow_media_type_to_caps (AM_MEDIA_TYPE *mediatype); +static gboolean gst_caps_to_directshow_media_type (GstDshowVideoSink * sink, + GstCaps *caps, AM_MEDIA_TYPE *mediatype); + +/* TODO: Support RGB! */ +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ( + "video/x-raw," + "width = (int) 1, MAX ," + "height = (int) 1, MAX ," + "framerate = (fraction) 0, MAX ," + "format = {(string)YUY2, (string)UYVY, (string)YV12 }") + ); + +static void gst_dshowvideosink_init_interfaces (GType type); + +static void gst_dshowvideosink_videooverlay_init (GstVideoOverlayInterface *iface); +static void +gst_dshowvideosink_navigation_interface_init (GstNavigationInterface * iface); + +#define gst_dshowvideosink_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstDshowVideoSink, gst_dshowvideosink, + GST_TYPE_VIDEO_SINK, + G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_OVERLAY, gst_dshowvideosink_videooverlay_init); + G_IMPLEMENT_INTERFACE (GST_TYPE_NAVIGATION, gst_dshowvideosink_navigation_interface_init)) + +enum +{ + PROP_0, + PROP_KEEP_ASPECT_RATIO, + PROP_FULL_SCREEN, + PROP_RENDERER +}; + +/* GObject methods */ +static void gst_dshowvideosink_finalize (GObject * gobject); +static void gst_dshowvideosink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_dshowvideosink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +/* GstElement methods */ +static GstStateChangeReturn gst_dshowvideosink_change_state (GstElement * element, GstStateChange transition); + +/* GstBaseSink methods */ +static gboolean gst_dshowvideosink_start (GstBaseSink * bsink); +static gboolean gst_dshowvideosink_stop (GstBaseSink * bsink); +static gboolean gst_dshowvideosink_unlock (GstBaseSink * bsink); +static gboolean gst_dshowvideosink_unlock_stop (GstBaseSink * bsink); +static gboolean gst_dshowvideosink_set_caps (GstBaseSink * bsink, GstCaps * caps); +static GstCaps *gst_dshowvideosink_get_caps (GstBaseSink * bsink, GstCaps * filter); +static GstFlowReturn gst_dshowvideosink_show_frame (GstVideoSink *sink, GstBuffer *buffer); +static void gst_dshowvideosink_set_window_for_renderer (GstDshowVideoSink *sink); + +/* COM initialization/uninitialization thread */ +static void gst_dshowvideosink_com_thread (GstDshowVideoSink * sink); +/* TODO: event, preroll, buffer_alloc? + * buffer_alloc won't generally be all that useful because the renderers require a + * different stride to GStreamer's implicit values. + */ + +static void +gst_dshowvideosink_set_window_handle (GstVideoOverlay * overlay, guintptr window_id) + +{ + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (overlay); + HWND previous_window = sink->window_id; + HWND videowindow = (HWND)window_id; + + if (videowindow == sink->window_id) { + GST_DEBUG_OBJECT (sink, "Window already set"); + return; + } + + sink->window_id = videowindow; + + /* Update window if we're already playing. */ + if (sink->connected && sink->filter_media_event) { + HRESULT hres; + + if (sink->is_new_window) { + /* If we created a new window */ + SendMessage (previous_window, WM_CLOSE, 0, 0); + sink->is_new_window = FALSE; + sink->window_closed = FALSE; + } else { + /* Return control of application window */ + SetWindowLongPtr (previous_window, GWLP_WNDPROC, (LONG_PTR)sink->prevWndProc); + SetWindowPos (previous_window, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); + } + + gst_dshowvideosink_set_window_for_renderer (sink); + + hres = sink->filter_media_event->SetNotifyWindow ((OAHWND)sink->window_id, WM_GRAPH_NOTIFY, 0); + GST_DEBUG_OBJECT (sink, "SetNotifyWindow(%p) returned %x", sink->window_id, hres); + } +} + +static void +gst_dshowvideosink_expose (GstVideoOverlay * overlay) +{ + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (overlay); + + if (sink->renderersupport) { + sink->renderersupport->PaintWindow (); + } +} + +static void +gst_dshowvideosink_videooverlay_init (GstVideoOverlayInterface * iface) +{ + iface->set_window_handle = gst_dshowvideosink_set_window_handle; + iface->expose = gst_dshowvideosink_expose; +} + +static void +gst_dshowvideosink_navigation_send_event (GstNavigation * navigation, + GstEvent * event) +{ + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (navigation); + GstPad *pad = NULL; + + /* FXIME: handle aspect ratio. */ + + pad = gst_pad_get_peer (GST_VIDEO_SINK_PAD (sink)); + + if (GST_IS_PAD (pad) && GST_IS_EVENT (event)) { + gst_pad_send_event (pad, event); + + gst_object_unref (pad); + } +} + +static void +gst_dshowvideosink_navigation_interface_init (GstNavigationInterface * iface) +{ + /* FIXME: navigation interface partially implemented. + * Need to call gst_navigation_send_event_simple and like in directdrawsink. + */ + iface->send_event_simple = gst_dshowvideosink_navigation_send_event; +} + +static void +gst_dshowvideosink_class_init (GstDshowVideoSinkClass * klass) +{ + GObjectClass *o_class; + GstElementClass *e_class; + GstBaseSinkClass *bs_class; + GstVideoSinkClass *vs_class; + + o_class = (GObjectClass *) klass; + e_class = (GstElementClass *) klass; + bs_class = (GstBaseSinkClass *) klass; + vs_class = (GstVideoSinkClass *) klass; + + o_class->finalize = gst_dshowvideosink_finalize; + o_class->set_property = gst_dshowvideosink_set_property; + o_class->get_property = gst_dshowvideosink_get_property; + + gst_element_class_set_static_metadata (e_class, "DirectShow video sink", + "Sink/Video", "Display data using a DirectShow video renderer", + "Pioneers of the Inevitable <songbird@songbirdnest.com>, " \ + "FLUENDO S.A. <support@fluendo.com>"); + + gst_element_class_add_static_pad_template (e_class, &sink_template); + + e_class->change_state = GST_DEBUG_FUNCPTR (gst_dshowvideosink_change_state); + + bs_class->get_caps = GST_DEBUG_FUNCPTR (gst_dshowvideosink_get_caps); + bs_class->set_caps = GST_DEBUG_FUNCPTR (gst_dshowvideosink_set_caps); + bs_class->start = GST_DEBUG_FUNCPTR (gst_dshowvideosink_start); + bs_class->stop = GST_DEBUG_FUNCPTR (gst_dshowvideosink_stop); + bs_class->unlock = GST_DEBUG_FUNCPTR (gst_dshowvideosink_unlock); + bs_class->unlock_stop = + GST_DEBUG_FUNCPTR (gst_dshowvideosink_unlock_stop); + + vs_class->show_frame = GST_DEBUG_FUNCPTR (gst_dshowvideosink_show_frame); + + /* Add properties */ + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_KEEP_ASPECT_RATIO, g_param_spec_boolean ("force-aspect-ratio", + "Force aspect ratio", + "When enabled, scaling will respect original aspect ratio", TRUE, + (GParamFlags)G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_FULL_SCREEN, g_param_spec_boolean ("fullscreen", + "Full screen mode", + "Use full-screen mode (not available when using XOverlay)", FALSE, + (GParamFlags)G_PARAM_READWRITE)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_RENDERER, g_param_spec_string ("renderer", "Renderer", + "Force usage of specific DirectShow renderer (EVR, VMR9 or VMR7)", + NULL, (GParamFlags)G_PARAM_READWRITE)); +} + +static void +gst_dshowvideosink_clear (GstDshowVideoSink *sink) +{ + sink->renderersupport = NULL; + sink->fakesrc = NULL; + sink->filter_graph = NULL; + sink->filter_media_event = NULL; + + sink->keep_aspect_ratio = FALSE; + sink->full_screen = FALSE; + + sink->window_closed = FALSE; + sink->window_id = NULL; + sink->is_new_window = FALSE; + + sink->connected = FALSE; + sink->graph_running = FALSE; +} + +static void +gst_dshowvideosink_init (GstDshowVideoSink * sink) +{ + gst_dshowvideosink_clear (sink); + + g_mutex_init (&sink->graph_lock); + g_mutex_init (&sink->com_init_lock); + g_mutex_init (&sink->com_deinit_lock); + g_cond_init (&sink->com_initialized); + g_cond_init (&sink->com_uninitialize); + g_cond_init (&sink->com_uninitialized); + + g_mutex_lock (&sink->com_init_lock); + + /* create the COM initialization thread */ + g_thread_new ("gstdshowvideosinkcomthread", (GThreadFunc)gst_dshowvideosink_com_thread, sink); + + /* wait until the COM thread signals that COM has been initialized */ + g_cond_wait (&sink->com_initialized, &sink->com_init_lock); + g_mutex_unlock (&sink->com_init_lock); +} + +static void +gst_dshowvideosink_finalize (GObject * gobject) +{ + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (gobject); + + g_free (sink->preferredrenderer); + + /* signal the COM thread that it sould uninitialize COM */ + if (sink->comInitialized) { + g_mutex_lock (&sink->com_deinit_lock); + g_cond_signal (&sink->com_uninitialize); + g_cond_wait (&sink->com_uninitialized, &sink->com_deinit_lock); + g_mutex_unlock (&sink->com_deinit_lock); + } + + g_mutex_clear (&sink->com_init_lock); + g_mutex_clear (&sink->com_deinit_lock); + g_cond_clear (&sink->com_initialized); + g_cond_clear (&sink->com_uninitialize); + g_cond_clear (&sink->com_uninitialized); + + g_mutex_clear (&sink->graph_lock); + + G_OBJECT_CLASS (parent_class)->finalize (gobject); +} + +static void +gst_dshowvideosink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (object); + + switch (prop_id) { + case PROP_RENDERER: + g_free (sink->preferredrenderer); + sink->preferredrenderer = g_value_dup_string (value); + break; + case PROP_KEEP_ASPECT_RATIO: + sink->keep_aspect_ratio = g_value_get_boolean (value); + if (sink->renderersupport) + sink->renderersupport->SetAspectRatioMode(); + break; + case PROP_FULL_SCREEN: + sink->full_screen = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_dshowvideosink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (object); + + switch (prop_id) { + case PROP_RENDERER: + g_value_take_string (value, sink->preferredrenderer); + break; + case PROP_KEEP_ASPECT_RATIO: + g_value_set_boolean (value, sink->keep_aspect_ratio); + break; + case PROP_FULL_SCREEN: + g_value_set_boolean (value, sink->full_screen); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_dshowvideosink_com_thread (GstDshowVideoSink * sink) +{ + HRESULT res; + + g_mutex_lock (&sink->com_init_lock); + + /* Initialize COM with a MTA for this process. This thread will + * be the first one to enter the apartement and the last one to leave + * it, unitializing COM properly */ + + res = CoInitializeEx (0, COINIT_MULTITHREADED); + if (res == S_FALSE) + GST_WARNING_OBJECT (sink, "COM has been already initialized in the same process"); + else if (res == RPC_E_CHANGED_MODE) + GST_WARNING_OBJECT (sink, "The concurrency model of COM has changed."); + else + GST_INFO_OBJECT (sink, "COM initialized successfully"); + + sink->comInitialized = TRUE; + + /* Signal other threads waiting on this condition that COM was initialized */ + g_cond_signal (&sink->com_initialized); + + g_mutex_unlock (&sink->com_init_lock); + + /* Wait until the uninitialize condition is met to leave the COM apartement */ + g_mutex_lock (&sink->com_deinit_lock); + g_cond_wait (&sink->com_uninitialize, &sink->com_deinit_lock); + + CoUninitialize (); + GST_INFO_OBJECT (sink, "COM uninitialized successfully"); + sink->comInitialized = FALSE; + g_cond_signal (&sink->com_uninitialized); + g_mutex_unlock (&sink->com_deinit_lock); +} + +static GstCaps * +gst_dshowvideosink_get_caps (GstBaseSink * basesink, GstCaps * filter) +{ + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (basesink); + GstCaps *ret = NULL; + + return ret; +} + +static void dump_available_media_types (IPin *pin) +{ + /* Enumerate all media types on this pin, output info about them */ + IEnumMediaTypes *enumerator = NULL; + AM_MEDIA_TYPE *type; + GstCaps *caps; + int i = 0; + + GST_INFO ("Enumerating media types on pin %p", pin); + + pin->EnumMediaTypes (&enumerator); + + while (enumerator->Next (1, &type, NULL) == S_OK) { + i++; + caps = gst_directshow_media_type_to_caps (type); + + if (caps) { + gchar *str = gst_caps_to_string (caps); + GST_INFO ("Type %d: converted to caps \"%s\"", i, str); + g_free (str); + + gst_caps_unref (caps); + } + else + GST_INFO ("Failed to convert type to GstCaps"); + + DeleteMediaType (type); + } + GST_INFO ("Enumeration complete"); + + enumerator->Release(); +} + +static void +dump_all_pin_media_types (IBaseFilter *filter) +{ + IEnumPins *enumpins = NULL; + IPin *pin = NULL; + HRESULT hres; + + hres = filter->EnumPins (&enumpins); + if (FAILED(hres)) { + GST_WARNING ("Cannot enumerate pins on filter"); + return; + } + + GST_INFO ("Enumerating pins on filter %p", filter); + while (enumpins->Next (1, &pin, NULL) == S_OK) + { + IMemInputPin *meminputpin; + PIN_DIRECTION pindir; + hres = pin->QueryDirection (&pindir); + + GST_INFO ("Found a pin with direction: %s", (pindir == PINDIR_INPUT)? "input": "output"); + dump_available_media_types (pin); + + hres = pin->QueryInterface ( + IID_IMemInputPin, (void **) &meminputpin); + if (hres == S_OK) { + GST_INFO ("Pin is a MemInputPin (push mode): %p", meminputpin); + meminputpin->Release(); + } + else + GST_INFO ("Pin is not a MemInputPin (pull mode?): %p", pin); + + pin->Release(); + } + enumpins->Release(); +} + +static gboolean +get_pin_from_filter (IBaseFilter *filter, PIN_DIRECTION pindir, IPin **pin) +{ + gboolean ret = FALSE; + IEnumPins *enumpins = NULL; + IPin *pintmp = NULL; + HRESULT hres; + *pin = NULL; + + hres = filter->EnumPins (&enumpins); + if (FAILED(hres)) { + return ret; + } + + while (enumpins->Next (1, &pintmp, NULL) == S_OK) + { + PIN_DIRECTION pindirtmp; + hres = pintmp->QueryDirection (&pindirtmp); + if (hres == S_OK && pindir == pindirtmp) { + *pin = pintmp; + ret = TRUE; + break; + } + pintmp->Release (); + } + enumpins->Release (); + + return ret; +} + +static void +gst_dshowvideosink_handle_event (GstDshowVideoSink *sink) +{ + if (sink->filter_media_event) { + long evCode; + LONG_PTR param1, param2; + while (SUCCEEDED (sink->filter_media_event->GetEvent(&evCode, ¶m1, ¶m2, 0))) + { + GST_INFO_OBJECT (sink, "Received DirectShow graph event code 0x%x", evCode); + sink->filter_media_event->FreeEventParams(evCode, param1, param2); + } + } +} + +/* WNDPROC for application-supplied windows */ +LRESULT APIENTRY WndProcHook (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + /* Handle certain actions specially on the window passed to us. + * Then forward back to the original window. + */ + GstDshowVideoSink *sink = (GstDshowVideoSink *)GetProp (hWnd, (LPCSTR)"GstDShowVideoSink"); + g_assert (sink != NULL); + + switch (message) { + case WM_GRAPH_NOTIFY: + gst_dshowvideosink_handle_event (sink); + return 0; + case WM_PAINT: + sink->renderersupport->PaintWindow (); + break; + case WM_MOVE: + case WM_SIZE: + sink->renderersupport->MoveWindow (); + break; + case WM_DISPLAYCHANGE: + sink->renderersupport->DisplayModeChanged(); + break; + case WM_ERASEBKGND: + /* DirectShow docs recommend ignoring this message to avoid flicker */ + return TRUE; + case WM_CLOSE: + sink->window_closed = TRUE; + } + return CallWindowProc (sink->prevWndProc, hWnd, message, wParam, lParam); +} + +/* WndProc for our default window, if the application didn't supply one */ +LRESULT APIENTRY +WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + GstDshowVideoSink *sink = (GstDshowVideoSink *)GetWindowLongPtr (hWnd, GWLP_USERDATA); + + if (!sink) { + /* I think these happen before we have a chance to set our userdata pointer */ + GST_DEBUG ("No sink!"); + return DefWindowProc (hWnd, message, wParam, lParam); + } + + //GST_DEBUG_OBJECT (sink, "Got a window message for %x, %x", hWnd, message); + + switch (message) { + case WM_GRAPH_NOTIFY: + GST_LOG_OBJECT (sink, "GRAPH_NOTIFY WINDOW MESSAGE"); + gst_dshowvideosink_handle_event (sink); + return 0; + case WM_PAINT: + sink->renderersupport->PaintWindow (); + break; + case WM_MOVE: + case WM_SIZE: + sink->renderersupport->MoveWindow (); + break; + case WM_DISPLAYCHANGE: + sink->renderersupport->DisplayModeChanged(); + break; + case WM_ERASEBKGND: + /* DirectShow docs recommend ignoring this message */ + return TRUE; + case WM_CLOSE: + sink->renderersupport->DestroyWindow (); + sink->window_closed = TRUE; + PostQuitMessage (WM_QUIT); + return 0; + } + + return DefWindowProc (hWnd, message, wParam, lParam); +} + +static gpointer +gst_dshowvideosink_window_thread (GstDshowVideoSink * sink) +{ + WNDCLASS WndClass; + int width, height; + int offx, offy; + DWORD exstyle, style; + + memset (&WndClass, 0, sizeof (WNDCLASS)); + WndClass.style = CS_HREDRAW | CS_VREDRAW; + WndClass.hInstance = GetModuleHandle (NULL); + WndClass.lpszClassName = (LPCSTR)"GST-DShowSink"; + WndClass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); + WndClass.cbClsExtra = 0; + WndClass.cbWndExtra = 0; + WndClass.lpfnWndProc = WndProc; + WndClass.hCursor = LoadCursor (NULL, IDC_ARROW); + RegisterClass (&WndClass); + + if (sink->full_screen) { + /* This doesn't seem to work, it returns the wrong values! But when we + * later use ShowWindow to show it maximized, it goes to full-screen + * anyway. TODO: Figure out why. */ + width = GetSystemMetrics (SM_CXFULLSCREEN); + height = GetSystemMetrics (SM_CYFULLSCREEN); + offx = 0; + offy = 0; + + style = WS_POPUP; /* No window decorations */ + exstyle = 0; + } + else { + /* By default, create a normal top-level window, the size + * of the video. + */ + RECT rect; + AM_MEDIA_TYPE pmt = (AM_MEDIA_TYPE)sink->mediatype; + VIDEOINFOHEADER *vi = (VIDEOINFOHEADER *)pmt.pbFormat; + + if (vi == NULL) + { + GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, ("Unknown media format"), (NULL)); + return NULL; + } + + /* rcTarget is the aspect-ratio-corrected size of the video. */ + width = vi->rcTarget.right + GetSystemMetrics (SM_CXSIZEFRAME) * 2; + height = vi->rcTarget.bottom + GetSystemMetrics (SM_CYCAPTION) + + (GetSystemMetrics (SM_CYSIZEFRAME) * 2); + + SystemParametersInfo (SPI_GETWORKAREA, 0, &rect, 0); + int screenwidth = rect.right - rect.left; + int screenheight = rect.bottom - rect.top; + offx = rect.left; + offy = rect.top; + + /* Make it fit into the screen without changing the + * aspect ratio. */ + if (width > screenwidth) { + double ratio = (double)screenwidth/(double)width; + width = screenwidth; + height = (int)(height * ratio); + } + if (height > screenheight) { + double ratio = (double)screenheight/(double)height; + height = screenheight; + width = (int)(width * ratio); + } + + style = WS_OVERLAPPEDWINDOW; /* Normal top-level window */ + exstyle = 0; + } + + HWND video_window = CreateWindowEx (exstyle, (LPCSTR)"GST-DShowSink", + (LPCSTR)"GStreamer DirectShow sink default window", + style, offx, offy, width, height, NULL, NULL, + WndClass.hInstance, NULL); + if (video_window == NULL) { + GST_ERROR_OBJECT (sink, "Failed to create window!"); + return NULL; + } + + sink->is_new_window = TRUE; + + SetWindowLongPtr (video_window, GWLP_USERDATA, (LONG_PTR)sink); + + sink->window_id = video_window; + + /* signal application we created a window */ + gst_video_overlay_got_window_handle (GST_VIDEO_OVERLAY (sink), + (guintptr)video_window); + + /* Set the renderer's clipping window */ + if (!sink->renderersupport->SetRendererWindow (video_window)) { + GST_WARNING_OBJECT (sink, "Failed to set video clipping window on filter %p", sink->renderersupport); + } + + /* Now show the window, as appropriate */ + if (sink->full_screen) { + ShowWindow (video_window, SW_SHOWMAXIMIZED); + ShowCursor (FALSE); + } + else + ShowWindow (video_window, SW_SHOWNORMAL); + + /* Trigger the initial paint of the window */ + UpdateWindow (video_window); + + ReleaseSemaphore (sink->window_created_signal, 1, NULL); + + /* start message loop processing our default window messages */ + while (1) { + MSG msg; + + if (GetMessage (&msg, video_window, 0, 0) <= 0) { + GST_LOG_OBJECT (sink, "our window received WM_QUIT or error."); + break; + } + DispatchMessage (&msg); + } + + return NULL; +} + +static gboolean +gst_dshowvideosink_create_default_window (GstDshowVideoSink * sink) +{ + sink->window_created_signal = CreateSemaphore (NULL, 0, 1, NULL); + if (sink->window_created_signal == NULL) + goto failed; + + sink -> window_thread = g_thread_new ("windowthread", + (GThreadFunc) gst_dshowvideosink_window_thread, + sink); + + /* wait maximum 10 seconds for window to be created */ + if (WaitForSingleObject (sink->window_created_signal, + 10000) != WAIT_OBJECT_0) + goto failed; + + CloseHandle (sink->window_created_signal); + return TRUE; + +failed: + CloseHandle (sink->window_created_signal); + GST_ELEMENT_ERROR (sink, RESOURCE, WRITE, + ("Error creating our default window"), (NULL)); + + return FALSE; +} + +static void gst_dshowvideosink_set_window_for_renderer (GstDshowVideoSink *sink) +{ + WNDPROC prevWndProc = (WNDPROC)GetWindowLongPtr (sink->window_id, GWLP_WNDPROC); + if (prevWndProc == WndProcHook) { + /* The WndProc already points to our hook. Something has gone wrong + * somewhere else and this safety net prevents an infinite recursion */ + return; + } + + /* Application has requested a specific window ID */ + sink->prevWndProc = (WNDPROC) SetWindowLongPtr (sink->window_id, GWLP_WNDPROC, (LONG_PTR)WndProcHook); + GST_DEBUG_OBJECT (sink, "Set wndproc to %p from %p", WndProcHook, sink->prevWndProc); + SetProp (sink->window_id, (LPCSTR)"GstDShowVideoSink", sink); + /* This causes the new WNDPROC to become active */ + SetWindowPos (sink->window_id, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); + + if (!sink->renderersupport->SetRendererWindow (sink->window_id)) { + GST_WARNING_OBJECT (sink, "Failed to set HWND %x on renderer", sink->window_id); + return; + } + sink->is_new_window = FALSE; + + /* This tells the renderer where the window is located, needed to + * start drawing in the right place. */ + sink->renderersupport->MoveWindow(); + GST_INFO_OBJECT (sink, "Set renderer window to %x", sink->window_id); +} + +static void +gst_dshowvideosink_prepare_window (GstDshowVideoSink *sink) +{ + HRESULT hres; + + /* Give the app a last chance to supply a window id */ + if (!sink->window_id) { + gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (sink)); + } + + /* If the app supplied one, use it. Otherwise, go ahead + * and create (and use) our own window */ + if (sink->window_id) { + gst_dshowvideosink_set_window_for_renderer (sink); + } + else { + gst_dshowvideosink_create_default_window (sink); + } + + if (sink->filter_media_event) { + sink->filter_media_event->Release(); + sink->filter_media_event = NULL; + } + + hres = sink->filter_graph->QueryInterface( + IID_IMediaEventEx, (void **) &sink->filter_media_event); + + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "Failed to get IMediaEventEx"); + } + else { + hres = sink->filter_media_event->SetNotifyWindow ((OAHWND)sink->window_id, + WM_GRAPH_NOTIFY, 0); + GST_DEBUG_OBJECT (sink, "SetNotifyWindow(%p) returned %x", sink->window_id, hres); + } +} + +static gboolean +gst_dshowvideosink_connect_graph (GstDshowVideoSink *sink) +{ + HRESULT hres; + IPin *srcpin; + IPin *sinkpin; + + GST_INFO_OBJECT (sink, "Connecting DirectShow pins"); + + srcpin = sink->fakesrc->GetOutputPin(); + + get_pin_from_filter (sink->renderersupport->GetFilter(), PINDIR_INPUT, + &sinkpin); + if (!sinkpin) { + GST_WARNING_OBJECT (sink, "Cannot get input pin from Renderer"); + return FALSE; + } + + /* Be warned that this call WILL deadlock unless you call it from + * the main thread. Thus, we call this from the state change, not from + * setcaps (which happens in a streaming thread). + */ + hres = sink->filter_graph->ConnectDirect ( + srcpin, sinkpin, NULL); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "Could not connect pins: %x", hres); + sinkpin->Release(); + return FALSE; + } + sinkpin->Release(); + return TRUE; +} + +static GstStateChangeReturn +gst_dshowvideosink_start_graph (GstDshowVideoSink *sink) +{ + IMediaControl *control = NULL; + HRESULT hres; + GstStateChangeReturn ret; + + GST_DEBUG_OBJECT (sink, "Connecting and starting DirectShow graph"); + + hres = sink->filter_graph->QueryInterface( + IID_IMediaControl, (void **) &control); + + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "Failed to get IMediaControl interface"); + ret = GST_STATE_CHANGE_FAILURE; + goto done; + } + + GST_INFO_OBJECT (sink, "Running DirectShow graph"); + hres = control->Run(); + if (FAILED (hres)) { + GST_ERROR_OBJECT (sink, + "Failed to run the directshow graph (error=%x)", hres); + ret = GST_STATE_CHANGE_FAILURE; + goto done; + } + + GST_DEBUG_OBJECT (sink, "DirectShow graph is now running"); + ret = GST_STATE_CHANGE_SUCCESS; + +done: + if (control) + control->Release(); + + return ret; +} +static GstStateChangeReturn +gst_dshowvideosink_pause_graph (GstDshowVideoSink *sink) +{ + IMediaControl *control = NULL; + GstStateChangeReturn ret; + HRESULT hres; + + hres = sink->filter_graph->QueryInterface( + IID_IMediaControl, (void **) &control); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "Failed to get IMediaControl interface"); + ret = GST_STATE_CHANGE_FAILURE; + goto done; + } + + GST_INFO_OBJECT (sink, "Pausing DirectShow graph"); + hres = control->Pause(); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, + "Can't pause the directshow graph (error=%x)", hres); + ret = GST_STATE_CHANGE_FAILURE; + goto done; + } + + ret = GST_STATE_CHANGE_SUCCESS; + +done: + if (control) + control->Release(); + + return ret; +} + +static GstStateChangeReturn +gst_dshowvideosink_stop_graph (GstDshowVideoSink *sink) +{ + IMediaControl *control = NULL; + GstStateChangeReturn ret; + HRESULT hres; + IPin *sinkpin; + + hres = sink->filter_graph->QueryInterface( + IID_IMediaControl, (void **) &control); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "Failed to get IMediaControl interface"); + ret = GST_STATE_CHANGE_FAILURE; + goto done; + } + + GST_INFO_OBJECT (sink, "Stopping DirectShow graph"); + hres = control->Stop(); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, + "Can't stop the directshow graph (error=%x)", hres); + ret = GST_STATE_CHANGE_FAILURE; + goto done; + } + + sink->filter_graph->Disconnect(sink->fakesrc->GetOutputPin()); + + get_pin_from_filter (sink->renderersupport->GetFilter(), PINDIR_INPUT, + &sinkpin); + sink->filter_graph->Disconnect(sinkpin); + sinkpin->Release(); + + GST_DEBUG_OBJECT (sink, "DirectShow graph has stopped"); + + if (sink->window_id) { + /* Return control of application window */ + SetWindowLongPtr (sink->window_id, GWLP_WNDPROC, (LONG_PTR)sink->prevWndProc); + RemoveProp (sink->window_id, (LPCSTR)"GstDShowVideoSink"); + SetWindowPos (sink->window_id, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); + sink->prevWndProc = NULL; + } + sink->connected = FALSE; + + ret = GST_STATE_CHANGE_SUCCESS; + +done: + if (control) + control->Release(); + + return ret; +} + +static GstStateChangeReturn +gst_dshowvideosink_change_state (GstElement * element, GstStateChange transition) +{ + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (element); + GstStateChangeReturn ret, rettmp; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + ret = gst_dshowvideosink_start_graph (sink); + if (ret == GST_STATE_CHANGE_FAILURE) + return ret; + sink->graph_running = TRUE; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + GST_DSHOWVIDEOSINK_GRAPH_LOCK(sink); + rettmp = gst_dshowvideosink_pause_graph (sink); + if (rettmp == GST_STATE_CHANGE_FAILURE) + ret = rettmp; + sink->graph_running = FALSE; + GST_DSHOWVIDEOSINK_GRAPH_UNLOCK(sink); + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + GST_DSHOWVIDEOSINK_GRAPH_LOCK(sink); + rettmp = gst_dshowvideosink_stop_graph (sink); + if (rettmp == GST_STATE_CHANGE_FAILURE) + ret = rettmp; + sink->graph_running = FALSE; + GST_DSHOWVIDEOSINK_GRAPH_UNLOCK(sink); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + gst_dshowvideosink_clear (sink); + break; + default: + break; + } + + return ret; +} + +class EVRSupport : public RendererSupport +{ +private: + GstDshowVideoSink *sink; + IBaseFilter *filter; + IMFGetService *service; + IMFVideoDisplayControl *control; + HWND video_window; + +public: + EVRSupport (GstDshowVideoSink *sink) : + sink(sink), + filter(NULL), + service(NULL), + control(NULL) + { + } + + ~EVRSupport() { + if (control) + control->Release(); + if (service) + service->Release(); + if (filter) + filter->Release(); + } + + const char *GetName() { + return "EnhancedVideoRenderer"; + } + + IBaseFilter *GetFilter() { + return filter; + } + + gboolean CheckOS () { + OSVERSIONINFO info; + info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); + GetVersionEx (&info); + + if (info.dwMajorVersion < 6) { + return false; + } + else { + return true; + } + } + + gboolean Configure() { + HRESULT hres; + + if (!this->CheckOS ()) { + GST_DEBUG_OBJECT (sink, "Windows Vista is required at least for EVR to work"); + return FALSE; + } + + hres = CoCreateInstance (CLSID_EnhancedVideoRenderer, NULL, CLSCTX_INPROC, + IID_IBaseFilter, (LPVOID *) &filter); + GST_DEBUG_OBJECT (sink, "cocreateinstance returned %d", hres); + if (FAILED (hres)) { + GST_ERROR_OBJECT (sink, + "Can't create an instance of renderer (error=%x)", + hres); + return FALSE; + } + + hres = filter->QueryInterface (IID_IMFGetService, + (void **) &service); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "EVR service interface missing: %x", hres); + return FALSE; + } + + hres = service->GetService (MR_VIDEO_RENDER_SERVICE, + IID_IMFVideoDisplayControl, (void **) &control); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "EVR control service missing: %x", hres); + return FALSE; + } + + SetAspectRatioMode(); + return TRUE; + } + + void SetAspectRatioMode() { + if (sink->keep_aspect_ratio) { + control->SetAspectRatioMode(MFVideoARMode_PreservePicture); + } + else { + control->SetAspectRatioMode(MFVideoARMode_None); + } + } + + gboolean SetRendererWindow(HWND window) { + video_window = window; + HRESULT hres = control->SetVideoWindow (video_window); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "Failed to set video clipping window on filter %p: %x", filter, hres); + return FALSE; + } + return TRUE; + } + + void PaintWindow() + { + HRESULT hr; + PAINTSTRUCT ps; + HDC hdc; + RECT rcClient; + + GetClientRect(video_window, &rcClient); + hdc = BeginPaint(video_window, &ps); + + hr = control->RepaintVideo(); + + EndPaint(video_window, &ps); + } + + void MoveWindow() + { + HRESULT hr; + RECT rect; + + // Track the movement of the container window and resize as needed + GetClientRect(video_window, &rect); + hr = control->SetVideoPosition(NULL, &rect); + } + + void DisplayModeChanged() { + } + + void DestroyWindow() { + ::DestroyWindow (video_window); + } +}; + +class VMR9Support : public RendererSupport +{ +private: + GstDshowVideoSink *sink; + IBaseFilter *filter; + IVMRWindowlessControl9 *control; + IVMRFilterConfig9 *config; + HWND video_window; + +public: + VMR9Support (GstDshowVideoSink *sink) : + sink(sink), + filter(NULL), + control(NULL), + config(NULL) + { + } + + ~VMR9Support() { + if (control) + control->Release(); + if (config) + config->Release(); + if (filter) + filter->Release(); + } + + const char *GetName() { + return "VideoMixingRenderer9"; + } + + IBaseFilter *GetFilter() { + return filter; + } + + gboolean Configure() { + HRESULT hres; + + hres = CoCreateInstance (CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC, + IID_IBaseFilter, (LPVOID *) &filter); + if (FAILED (hres)) { + GST_ERROR_OBJECT (sink, + "Can't create an instance of renderer (error=%x)", + hres); + return FALSE; + } + + hres = filter->QueryInterface ( + IID_IVMRFilterConfig9, (void **) &config); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "VMR9 filter config interface missing: %x", hres); + return FALSE; + } + + hres = config->SetRenderingMode (VMR9Mode_Windowless); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "VMR9 couldn't be set to windowless mode: %x", hres); + return FALSE; + } + else { + GST_DEBUG_OBJECT (sink, "Set VMR9 (%p) to windowless mode!", filter); + } + + /* We can't QI to this until _after_ we've been set to windowless mode. + * Apparently this is against the rules in COM, but that's how it is... */ + hres = filter->QueryInterface ( + IID_IVMRWindowlessControl9, (void **) &control); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "VMR9 windowless control interface missing: %x", hres); + return FALSE; + } + + SetAspectRatioMode(); + return TRUE; + } + + void SetAspectRatioMode() { + if (sink->keep_aspect_ratio) { + control->SetAspectRatioMode(VMR9ARMode_LetterBox); + } + else { + control->SetAspectRatioMode(VMR9ARMode_None); + } + } + + gboolean SetRendererWindow(HWND window) { + video_window = window; + HRESULT hres = control->SetVideoClippingWindow (video_window); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "Failed to set video clipping window on filter %p: %x", filter, hres); + return FALSE; + } + return TRUE; + } + + void PaintWindow() + { + HRESULT hr; + PAINTSTRUCT ps; + HDC hdc; + RECT rcClient; + + GetClientRect(video_window, &rcClient); + hdc = BeginPaint(video_window, &ps); + + hr = control->RepaintVideo(video_window, hdc); + + EndPaint(video_window, &ps); + } + + void MoveWindow() + { + HRESULT hr; + RECT rect; + + // Track the movement of the container window and resize as needed + GetClientRect(video_window, &rect); + hr = control->SetVideoPosition(NULL, &rect); + } + + void DisplayModeChanged() { + control->DisplayModeChanged(); + } + + void DestroyWindow() { + ::DestroyWindow (video_window); + } +}; + +class VMR7Support : public RendererSupport +{ +private: + GstDshowVideoSink *sink; + IBaseFilter *filter; + IVMRWindowlessControl *control; + IVMRFilterConfig *config; + HWND video_window; + +public: + VMR7Support (GstDshowVideoSink *sink) : + sink(sink), + filter(NULL), + control(NULL), + config(NULL) + { + } + + ~VMR7Support() { + if (control) + control->Release(); + if (config) + config->Release(); + if (filter) + filter->Release(); + } + + const char *GetName() { + return "VideoMixingRenderer"; + } + + IBaseFilter *GetFilter() { + return filter; + } + + gboolean Configure() { + HRESULT hres; + + hres = CoCreateInstance (CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC, + IID_IBaseFilter, (LPVOID *) &filter); + if (FAILED (hres)) { + GST_ERROR_OBJECT (sink, + "Can't create an instance of renderer (error=%x)", + hres); + return FALSE; + } + + hres = filter->QueryInterface ( + IID_IVMRFilterConfig, (void **) &config); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "VMR filter config interface missing: %x", hres); + return FALSE; + } + + hres = config->SetRenderingMode (VMRMode_Windowless); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "VMR couldn't be set to windowless mode: %x", hres); + return FALSE; + } + else { + GST_DEBUG_OBJECT (sink, "Set VMR (%p) to windowless mode!", filter); + } + + hres = filter->QueryInterface ( + IID_IVMRWindowlessControl, (void **) &control); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "VMR windowless control interface missing: %x", hres); + return FALSE; + } + + SetAspectRatioMode(); + return TRUE; + } + + void SetAspectRatioMode() { + if (sink->keep_aspect_ratio) { + control->SetAspectRatioMode(VMR_ARMODE_LETTER_BOX); + } + else { + control->SetAspectRatioMode(VMR_ARMODE_NONE); + } + } + + gboolean SetRendererWindow(HWND window) { + video_window = window; + HRESULT hres = control->SetVideoClippingWindow (video_window); + if (FAILED (hres)) { + GST_WARNING_OBJECT (sink, "Failed to set video clipping window on filter %p: %x", filter, hres); + return FALSE; + } + return TRUE; + } + + void PaintWindow() + { + HRESULT hr; + PAINTSTRUCT ps; + HDC hdc; + RECT rcClient; + + GetClientRect(video_window, &rcClient); + hdc = BeginPaint(video_window, &ps); + + hr = control->RepaintVideo(video_window, hdc); + + EndPaint(video_window, &ps); + } + + void MoveWindow() + { + HRESULT hr; + RECT rect; + + // Track the movement of the container window and resize as needed + GetClientRect(video_window, &rect); + hr = control->SetVideoPosition(NULL, &rect); + } + + void DisplayModeChanged() { + control->DisplayModeChanged(); + } + + void DestroyWindow() { + ::DestroyWindow (video_window); + } +}; + +static gboolean +gst_dshowvideosink_create_renderer (GstDshowVideoSink *sink) +{ + GST_DEBUG_OBJECT (sink, "Trying to create renderer '%s'", "EVR"); + + RendererSupport *support = NULL; + + if (sink->preferredrenderer) { + if (!strcmp (sink->preferredrenderer, "EVR")) { + GST_INFO_OBJECT (sink, "Forcing use of EVR"); + support = new EVRSupport (sink); + } + else if (!strcmp (sink->preferredrenderer, "VMR9")) { + GST_INFO_OBJECT (sink, "Forcing use of VMR9"); + support = new VMR9Support (sink); + } + else if (!strcmp (sink->preferredrenderer, "VMR")) { + GST_INFO_OBJECT (sink, "Forcing use of VMR"); + support = new VMR7Support (sink); + } + else { + GST_ERROR_OBJECT (sink, "Unknown sink type '%s'", sink->preferredrenderer); + return FALSE; + } + + if (!support->Configure()) { + GST_ERROR_OBJECT (sink, "Couldn't configure selected renderer"); + delete support; + return FALSE; + } + goto done; + } + + support = new EVRSupport (sink); + if (!support->Configure ()) { + GST_INFO_OBJECT (sink, "Failed to configure EVR, trying VMR9"); + delete support; + support = new VMR9Support (sink); + if (!support->Configure()) { + GST_INFO_OBJECT (sink, "Failed to configure VMR9, trying VMR7"); + delete support; + support = new VMR7Support (sink); + if (!support->Configure()) { + GST_ERROR_OBJECT (sink, "Failed to configure VMR9 or VMR7"); + delete support; + return FALSE; + } + } + } + +done: + sink->renderersupport = support; + return TRUE; +} + +static gboolean +gst_dshowvideosink_build_filtergraph (GstDshowVideoSink *sink) +{ + HRESULT hres; + + /* Build our DirectShow FilterGraph, looking like: + * + * fakesrc -> sink filter + * + * so we can feed data in through the fakesrc. + * + * The sink filter can be one of our supported filters: VMR9 (VMR7?, EMR?) + */ + + hres = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC, + IID_IFilterGraph, (LPVOID *) & sink->filter_graph); + if (FAILED (hres)) { + GST_ERROR_OBJECT (sink, + "Can't create an instance of the dshow graph manager (error=%x)", hres); + goto error; + } + + sink->fakesrc = new VideoFakeSrc(); + + IBaseFilter *filter; + hres = sink->fakesrc->QueryInterface ( + IID_IBaseFilter, (void **) &filter); + if (FAILED (hres)) { + GST_ERROR_OBJECT (sink, "Could not QI fakesrc to IBaseFilter"); + goto error; + } + + hres = sink->filter_graph->AddFilter (filter, L"fakesrc"); + if (FAILED (hres)) { + GST_ERROR_OBJECT (sink, + "Can't add our fakesrc filter to the graph (error=%x)", hres); + goto error; + } + + if (!gst_dshowvideosink_create_renderer (sink)) { + GST_ERROR_OBJECT (sink, "Could not create a video renderer"); + goto error; + } + + /* dump_all_pin_media_types (sink->renderer); */ + + hres = + sink->filter_graph->AddFilter (sink->renderersupport->GetFilter(), + L"renderer"); + if (FAILED (hres)) { + GST_ERROR_OBJECT (sink, + "Can't add renderer to the graph (error=%x)", hres); + goto error; + } + + return TRUE; + +error: + if (sink->fakesrc) { + sink->fakesrc->Release(); + sink->fakesrc = NULL; + } + + if (sink->filter_graph) { + sink->filter_graph->Release(); + sink->filter_graph = NULL; + } + + if (sink->filter_media_event) { + sink->filter_media_event->Release(); + sink->filter_media_event = NULL; + } + + return FALSE; +} + +static gboolean +gst_dshowvideosink_start (GstBaseSink * bsink) +{ + HRESULT hres = S_FALSE; + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (bsink); + + /* Just build the filtergraph; we don't link or otherwise configure it yet */ + return gst_dshowvideosink_build_filtergraph (sink); +} + +static gboolean +gst_dshowvideosink_set_caps (GstBaseSink * bsink, GstCaps * caps) +{ + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (bsink); + + if (sink->connected) { + IPin *sinkpin; + sink->filter_graph->Disconnect(sink->fakesrc->GetOutputPin()); + get_pin_from_filter (sink->renderersupport->GetFilter(), PINDIR_INPUT, + &sinkpin); + sink->filter_graph->Disconnect(sinkpin); + sinkpin->Release(); + } + + if (!gst_caps_to_directshow_media_type (sink, caps, &sink->mediatype)) { + GST_WARNING_OBJECT (sink, "Cannot convert caps to AM_MEDIA_TYPE, rejecting"); + return FALSE; + } + + GST_DEBUG_OBJECT (sink, "Configuring output pin media type"); + /* Now we have an AM_MEDIA_TYPE describing what we're going to send. + * We set this on our DirectShow fakesrc's output pin. + */ + sink->fakesrc->GetOutputPin()->SetMediaType (&sink->mediatype); + GST_DEBUG_OBJECT (sink, "Configured output pin media type"); + + /* We have configured the output pin media type. + * So, create a window (or start using an application-supplied + * one, then connect the graph */ + gst_dshowvideosink_prepare_window (sink); + if (!gst_dshowvideosink_connect_graph (sink)) { + GST_ELEMENT_ERROR (sink, CORE, NEGOTIATION, + ("Failed to initialize DirectShow graph with the input caps"), (NULL)); + return FALSE; + } + sink->connected = TRUE; + + return TRUE; +} + +static gboolean +gst_dshowvideosink_stop (GstBaseSink * bsink) +{ + IPin *input_pin = NULL, *output_pin = NULL; + HRESULT hres = S_FALSE; + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (bsink); + + if (!sink->filter_graph) { + GST_WARNING_OBJECT (sink, "Cannot destroy filter graph; it doesn't exist"); + return TRUE; + } + + /* If we created a new window, send the close message and wait until + * it's closed in the window thread */ + if (sink->is_new_window) { + SendMessage (sink->window_id, WM_CLOSE, 0, 0); + while (!sink->window_closed); + sink->is_new_window = FALSE; + } + + /* Release the renderer */ + if (sink->renderersupport) { + delete sink->renderersupport; + sink->renderersupport = NULL; + } + + /* Release our dshow fakesrc */ + if (sink->fakesrc) { + sink->fakesrc->Release(); + sink->fakesrc = NULL; + } + + /* Release the filter graph manager */ + if (sink->filter_graph) { + sink->filter_graph->Release(); + sink->filter_graph = NULL; + } + + if (sink->filter_media_event) { + sink->filter_media_event->Release(); + sink->filter_media_event = NULL; + } + + return TRUE; +} + +static GstFlowReturn +gst_dshowvideosink_show_frame (GstVideoSink *vsink, GstBuffer *buffer) +{ + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (vsink); + GstFlowReturn ret; + GstStateChangeReturn retst; + + if (sink->window_closed) { + GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, ("Output window was closed"), (NULL)); + return GST_FLOW_ERROR; + } + + GST_DEBUG_OBJECT (sink, "Pushing buffer through fakesrc->renderer"); + GST_DSHOWVIDEOSINK_GRAPH_LOCK(sink); + if (!sink->graph_running){ + retst = gst_dshowvideosink_start_graph(sink); + if (retst == GST_STATE_CHANGE_FAILURE) + return GST_FLOW_FLUSHING; + } + ret = sink->fakesrc->GetOutputPin()->PushBuffer (buffer); + if (!sink->graph_running){ + retst = gst_dshowvideosink_pause_graph(sink); + if (retst == GST_STATE_CHANGE_FAILURE) + return GST_FLOW_FLUSHING; + } + GST_DSHOWVIDEOSINK_GRAPH_UNLOCK(sink); + GST_DEBUG_OBJECT (sink, "Done pushing buffer through fakesrc->renderer: %s", gst_flow_get_name(ret)); + + return ret; +} + +/* TODO: How can we implement these? Figure that out... */ +static gboolean +gst_dshowvideosink_unlock (GstBaseSink * bsink) +{ + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (bsink); + + return TRUE; +} + +static gboolean +gst_dshowvideosink_unlock_stop (GstBaseSink * bsink) +{ + GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (bsink); + + return TRUE; +} + +/* TODO: Move all of this into generic code? */ + +/* Helpers to format GUIDs the same way we find them in the source */ +#define GUID_FORMAT "{%.8x, %.4x, %.4x, { %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x }}" +#define GUID_ARGS(guid) \ + guid.Data1, guid.Data2, guid.Data3, \ + guid.Data40, guid.Data41, guid.Data43, guid.Data44, \ + guid.Data45, guid.Data46, guid.Data47, guid.Data48 + +static GstCaps * +audio_media_type_to_caps (AM_MEDIA_TYPE *mediatype) +{ + return NULL; +} + +static GstCaps * +video_media_type_to_caps (AM_MEDIA_TYPE *mediatype) +{ + GstCaps *caps = NULL; + + /* TODO: Add RGB types. */ + if (IsEqualGUID (mediatype->subtype, MEDIASUBTYPE_YUY2)) + caps = gst_caps_new_simple ("video/x-raw", + "format", GST_TYPE_VIDEO_FORMAT, GST_VIDEO_FORMAT_YUY2, NULL); + else if (IsEqualGUID (mediatype->subtype, MEDIASUBTYPE_UYVY)) + caps = gst_caps_new_simple ("video/x-raw", + "format", GST_TYPE_VIDEO_FORMAT, GST_VIDEO_FORMAT_UYVY, NULL); + else if (IsEqualGUID (mediatype->subtype, MEDIASUBTYPE_YV12)) + caps = gst_caps_new_simple ("video/x-raw", + "format", GST_TYPE_VIDEO_FORMAT, GST_VIDEO_FORMAT_YV12, NULL); + + if (!caps) { + GST_DEBUG ("No subtype known; cannot continue"); + return NULL; + } + + if (IsEqualGUID (mediatype->formattype, FORMAT_VideoInfo) && + mediatype->cbFormat >= sizeof(VIDEOINFOHEADER)) + { + VIDEOINFOHEADER *vh = (VIDEOINFOHEADER *)mediatype->pbFormat; + + /* TODO: Set PAR here. Based on difference between source and target RECTs? + * Do we want framerate? Based on AvgTimePerFrame? */ + gst_caps_set_simple (caps, + "width", G_TYPE_INT, vh->bmiHeader.biWidth, + "height", G_TYPE_INT, vh->bmiHeader.biHeight, + NULL); + } + + return caps; +} + + +/* Create a GstCaps object representing the same media type as + * this AM_MEDIA_TYPE. + * + * Returns NULL if no corresponding GStreamer type is known. + * + * May modify mediatype. + */ +static GstCaps * +gst_directshow_media_type_to_caps (AM_MEDIA_TYPE *mediatype) +{ + GstCaps *caps = NULL; + + if (IsEqualGUID (mediatype->majortype, MEDIATYPE_Video)) + caps = video_media_type_to_caps (mediatype); + else if (IsEqualGUID (mediatype->majortype, MEDIATYPE_Audio)) + caps = audio_media_type_to_caps (mediatype); + else { + GST_DEBUG ("Non audio/video media types not yet " \ + "recognised, please add me: " GUID_FORMAT, + GUID_ARGS(mediatype->majortype)); + } + + if (caps) { + gchar *capsstring = gst_caps_to_string (caps); + GST_DEBUG ("Converted AM_MEDIA_TYPE to \"%s\"", capsstring); + g_free (capsstring); + } + else { + GST_WARNING ("Failed to convert AM_MEDIA_TYPE to caps"); + } + + return caps; +} + +/* Fill in a DirectShow AM_MEDIA_TYPE structure representing the same media + * type as this GstCaps object. + * + * Returns FALSE if no corresponding type is known. + * + * Only operates on simple (single structure) caps. + */ +static gboolean +gst_caps_to_directshow_media_type (GstDshowVideoSink * sink, GstCaps *caps, + AM_MEDIA_TYPE *mediatype) +{ + GstVideoInfo info; + int width, height; + int bpp; + + gst_video_info_init (&info); + if (!gst_video_info_from_caps (&info, caps)) + { + GST_WARNING_OBJECT (sink, "Couldn't parse caps"); + return FALSE; + } + memset (mediatype, 0, sizeof (AM_MEDIA_TYPE)); + + if (GST_VIDEO_FORMAT_INFO_IS_YUV (info.finfo)) + { + guint32 fourcc; + GST_VIDEO_SINK_WIDTH (sink) = info.width; + GST_VIDEO_SINK_HEIGHT (sink) = info.height; + width = info.width; + height = info.height; + mediatype->majortype = MEDIATYPE_Video; + + switch (GST_VIDEO_INFO_FORMAT (&info)) + { + case GST_VIDEO_FORMAT_YUY2: + mediatype->subtype = MEDIASUBTYPE_YUY2; + fourcc = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'); + bpp = 16; + break; + case GST_VIDEO_FORMAT_UYVY: + mediatype->subtype = MEDIASUBTYPE_UYVY; + fourcc = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); + bpp = 16; + break; + case GST_VIDEO_FORMAT_YV12: + mediatype->subtype = MEDIASUBTYPE_YV12; + fourcc = GST_MAKE_FOURCC ('Y', 'V', '1', '2'); + bpp = 12; + break; + default: + GST_WARNING_OBJECT (sink, "Couldn't parse caps"); + return FALSE; + } + + mediatype->bFixedSizeSamples = TRUE; /* Always true for raw video */ + mediatype->bTemporalCompression = FALSE; /* Likewise, always false */ + + { + int par_n, par_d; + VIDEOINFOHEADER *vi = (VIDEOINFOHEADER *)CoTaskMemAlloc (sizeof (VIDEOINFOHEADER)); + memset (vi, 0, sizeof (VIDEOINFOHEADER)); + + mediatype->formattype = FORMAT_VideoInfo; + mediatype->cbFormat = sizeof (VIDEOINFOHEADER); + mediatype->pbFormat = (BYTE *)vi; + + mediatype->lSampleSize = width * height * bpp / 8; + + GST_INFO_OBJECT (sink, "Set mediatype format: size %d, sample size %d", + mediatype->cbFormat, mediatype->lSampleSize); + + vi->rcSource.top = 0; + vi->rcSource.left = 0; + vi->rcSource.bottom = height; + vi->rcSource.right = width; + + vi->rcTarget.top = 0; + vi->rcTarget.left = 0; + if (sink->keep_aspect_ratio) { + par_n = GST_VIDEO_INFO_PAR_N (&info); + par_d = GST_VIDEO_INFO_PAR_D (&info); + /* To handle non-square pixels, we set the target rectangle to a + * different size than the source rectangle. + * There might be a better way, but this seems to work. */ + vi->rcTarget.bottom = height; + vi->rcTarget.right = width * par_n / par_d; + GST_DEBUG_OBJECT (sink, "Got PAR: set target right to %d from width %d", + vi->rcTarget.right, width); + } + else { + vi->rcTarget.bottom = height; + vi->rcTarget.right = width; + } + + vi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER); + vi->bmiHeader.biWidth = width; + vi->bmiHeader.biHeight = -height; /* Required to be negative. */ + vi->bmiHeader.biPlanes = 1; /* Required to be 1 */ + vi->bmiHeader.biBitCount = bpp; + vi->bmiHeader.biCompression = fourcc; + vi->bmiHeader.biSizeImage = width * height * bpp / 8; + + /* We can safely zero these; they don't matter for our uses */ + vi->bmiHeader.biXPelsPerMeter = 0; + vi->bmiHeader.biYPelsPerMeter = 0; + vi->bmiHeader.biClrUsed = 0; + vi->bmiHeader.biClrImportant = 0; + } + + GST_DEBUG_OBJECT (sink, "Successfully built AM_MEDIA_TYPE from caps"); + return TRUE; + } + + GST_WARNING_OBJECT (sink, "Failed to convert caps, not a known caps type"); + /* Only YUV supported so far */ + + return FALSE; +} +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/dshowvideosink.h
Added
@@ -0,0 +1,128 @@ +/* GStreamer + * Copyright (C) 2008 Pioneers of the Inevitable <songbird@songbirdnest.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __DSHOWVIDEOSINK_H__ +#define __DSHOWVIDEOSINK_H__ + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/video/gstvideosink.h> + +#include "dshowvideofakesrc.h" + +#include <dshow.h> + +#include "d3d9.h" +#include "vmr9.h" +#include "evr.h" +#include "mfidl.h" + +#pragma warning( disable : 4090 4024) + +G_BEGIN_DECLS +#define GST_TYPE_DSHOWVIDEOSINK (gst_dshowvideosink_get_type()) +#define GST_DSHOWVIDEOSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DSHOWVIDEOSINK,GstDshowVideoSink)) +#define GST_DSHOWVIDEOSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DSHOWVIDEOSINK,GstDshowVideoSinkClass)) +#define GST_IS_DSHOWVIDEOSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DSHOWVIDEOSINK)) +#define GST_IS_DSHOWVIDEOSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DSHOWVIDEOSINK)) +typedef struct _GstDshowVideoSink GstDshowVideoSink; +typedef struct _GstDshowVideoSinkClass GstDshowVideoSinkClass; + +#define GST_DSHOWVIDEOSINK_GRAPH_LOCK(sink) g_mutex_lock (&GST_DSHOWVIDEOSINK (sink)->graph_lock) +#define GST_DSHOWVIDEOSINK_GRAPH_UNLOCK(clock) g_mutex_unlock (&GST_DSHOWVIDEOSINK (sink)->graph_lock) + +/* Renderer-specific support classes */ +class RendererSupport +{ +public: + virtual ~RendererSupport() {}; + virtual const char *GetName() = 0; + virtual IBaseFilter *GetFilter() = 0; + virtual gboolean Configure() = 0; + virtual gboolean SetRendererWindow(HWND window) = 0; + virtual void PaintWindow() = 0; + virtual void MoveWindow() = 0; + virtual void DestroyWindow() = 0; + virtual void DisplayModeChanged() = 0; + virtual void SetAspectRatioMode() = 0; +}; + +struct _GstDshowVideoSink +{ + GstVideoSink sink; + + /* Preferred renderer to use: VM9 or VMR */ + char *preferredrenderer; + + /* The filter graph (DirectShow equivalent to pipeline */ + IFilterGraph *filter_graph; + + IMediaEventEx *filter_media_event; + + /* Renderer wrapper (EVR, VMR9, or VMR) and support code */ + RendererSupport *renderersupport; + + /* Our fakesrc filter */ + VideoFakeSrc *fakesrc; + + /* DirectShow description of media type (equivalent of GstCaps) */ + AM_MEDIA_TYPE mediatype; + + gboolean keep_aspect_ratio; + gboolean full_screen; + + /* If the window is closed, we set this and error out */ + gboolean window_closed; + + /* The video window set through GstXOverlay */ + HWND window_id; + + /* If we created the window, it needs to be closed in ::stop() */ + gboolean is_new_window; + + gboolean connected; + gboolean graph_running; + + /* If we create our own window, we run it from another thread */ + GThread *window_thread; + HANDLE window_created_signal; + + /* If we use an app-supplied window, we need to hook its WNDPROC */ + WNDPROC prevWndProc; + + /* Lock for transitions */ + GMutex graph_lock; + + gboolean comInitialized; + GMutex com_init_lock; + GMutex com_deinit_lock; + GCond com_initialized; + GCond com_uninitialize; + GCond com_uninitialized; +}; + +struct _GstDshowVideoSinkClass +{ + GstVideoSinkClass parent_class; +}; + +GType gst_dshowvideosink_get_type (void); + +G_END_DECLS +#endif /* __DSHOWVIDEOSINK_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshow.cpp
Added
@@ -0,0 +1,777 @@ +/* GStreamer + * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> + * + * gstdshow.cpp: + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include <gst/video/video-format.h> + +#include "gstdshow.h" +#include "gstdshowfakesink.h" +#include "gstdshowvideosrc.h" + +GST_DEBUG_CATEGORY_EXTERN (dshowsrcwrapper_debug); +#define GST_CAT_DEFAULT dshowsrcwrapper_debug + +gchar * +wchar_to_gchar (WCHAR * w) +{ + return g_utf16_to_utf8 ((const gunichar2 *) w, wcslen (w), NULL, NULL, NULL); +} + +const GUID MEDIASUBTYPE_I420 + = { 0x30323449, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, + 0x71} +}; + +void +gst_dshow_free_mediatype (AM_MEDIA_TYPE * pmt) +{ + if (pmt != NULL) { + if (pmt->cbFormat != 0) { + CoTaskMemFree ((PVOID) pmt->pbFormat); + pmt->cbFormat = 0; + pmt->pbFormat = NULL; + } + if (pmt->pUnk != NULL) { + /* Unnecessary because pUnk should not be used, but safest. */ + pmt->pUnk->Release (); + pmt->pUnk = NULL; + } + + CoTaskMemFree (pmt); + } +} + +void +gst_dshow_free_pin_mediatype (gpointer pt) +{ + GstCapturePinMediaType *pin_mediatype = (GstCapturePinMediaType *) pt; + if (pin_mediatype) { + if (pin_mediatype->capture_pin) { + pin_mediatype->capture_pin->Release (); + pin_mediatype->capture_pin = NULL; + } + if (pin_mediatype->mediatype) { + gst_dshow_free_mediatype (pin_mediatype->mediatype); + pin_mediatype->mediatype = NULL; + } + } +} + +GstCapturePinMediaType * +gst_dshow_new_pin_mediatype (IPin * pin) +{ + GstCapturePinMediaType *pin_mediatype = g_new0 (GstCapturePinMediaType, 1); + + pin->AddRef (); + pin_mediatype->capture_pin = pin; + + return pin_mediatype; +} + +GstCapturePinMediaType * +gst_dshow_new_pin_mediatype_from_enum_mediatypes (IPin * pin, IEnumMediaTypes *enum_mediatypes) +{ + GstCapturePinMediaType *pin_mediatype = gst_dshow_new_pin_mediatype (pin); + VIDEOINFOHEADER *video_info = NULL; + + HRESULT hres = enum_mediatypes->Next (1, &pin_mediatype->mediatype, NULL); + if (hres != S_OK || !pin_mediatype->mediatype) { + gst_dshow_free_pin_mediatype (pin_mediatype); + return NULL; + } + + /* FORMAT_None or GUID_NULL format type does hold format data */ + if (pin_mediatype->mediatype->formattype == FORMAT_None || + pin_mediatype->mediatype->formattype == GUID_NULL) { + return NULL; + } + + video_info = (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat; + if (!video_info) + return NULL; + + pin_mediatype->defaultWidth = video_info->bmiHeader.biWidth; + pin_mediatype->defaultHeight = video_info->bmiHeader.biHeight; + if (video_info->AvgTimePerFrame > 0) { + pin_mediatype->defaultFPS = (gint) (10000000 / video_info->AvgTimePerFrame); + } else { + pin_mediatype->defaultFPS = 30; + } + pin_mediatype->granularityWidth = 1; + pin_mediatype->granularityHeight = 1; + + return pin_mediatype; +} + +GstCapturePinMediaType * +gst_dshow_new_pin_mediatype_from_streamcaps (IPin * pin, gint id, IAMStreamConfig * streamcaps) +{ + GstCapturePinMediaType *pin_mediatype = gst_dshow_new_pin_mediatype (pin); + VIDEOINFOHEADER *video_info = NULL; + + HRESULT hres = streamcaps->GetStreamCaps (id, &pin_mediatype->mediatype, + (BYTE *) & pin_mediatype->vscc); + if (FAILED (hres) || !pin_mediatype->mediatype) { + gst_dshow_free_pin_mediatype (pin_mediatype); + return NULL; + } + + video_info = (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat; + + pin_mediatype->defaultWidth = video_info->bmiHeader.biWidth; + pin_mediatype->defaultHeight = video_info->bmiHeader.biHeight; + if (video_info->AvgTimePerFrame > 0) { + pin_mediatype->defaultFPS = (gint) (10000000 / video_info->AvgTimePerFrame); + } else { + pin_mediatype->defaultFPS = 30; + } + pin_mediatype->granularityWidth = pin_mediatype->vscc.OutputGranularityX; + pin_mediatype->granularityHeight = pin_mediatype->vscc.OutputGranularityY; + + return pin_mediatype; +} + +void +gst_dshow_free_pins_mediatypes (GList * pins_mediatypes) +{ + g_list_free_full (pins_mediatypes, + (GDestroyNotify) gst_dshow_free_pin_mediatype); +} + +gboolean +gst_dshow_check_mediatype (AM_MEDIA_TYPE * media_type, const GUID sub_type, + const GUID format_type) +{ + RPC_STATUS rpcstatus; + + g_return_val_if_fail (media_type != NULL, FALSE); + + return + UuidCompare (&media_type->subtype, (UUID *) & sub_type, + &rpcstatus) == 0 && rpcstatus == RPC_S_OK && + //IsEqualGUID (&media_type->subtype, &sub_type) + UuidCompare (&media_type->formattype, (UUID *) & format_type, + &rpcstatus) == 0 && rpcstatus == RPC_S_OK; +} + +gboolean +gst_dshow_get_pin_from_filter (IBaseFilter * filter, PIN_DIRECTION pindir, + IPin ** pin) +{ + gboolean ret = FALSE; + IEnumPins *enumpins = NULL; + IPin *pintmp = NULL; + HRESULT hres; + *pin = NULL; + + hres = filter->EnumPins (&enumpins); + if (FAILED (hres)) { + return ret; + } + + while (enumpins->Next (1, &pintmp, NULL) == S_OK) { + PIN_DIRECTION pindirtmp; + hres = pintmp->QueryDirection (&pindirtmp); + if (hres == S_OK && pindir == pindirtmp) { + *pin = pintmp; + ret = TRUE; + break; + } + pintmp->Release (); + } + enumpins->Release (); + + return ret; +} + +gboolean +gst_dshow_find_filter (CLSID input_majortype, CLSID input_subtype, + CLSID output_majortype, CLSID output_subtype, + gchar * prefered_filter_name, IBaseFilter ** filter) +{ + gboolean ret = FALSE; + HRESULT hres; + GUID arrayInTypes2; + GUID arrayOutTypes2; + IFilterMapper2 *mapper = NULL; + IEnumMoniker *enum_moniker = NULL; + IMoniker *moniker = NULL; + ULONG fetched; + gchar *prefered_filter_upper = NULL; + gboolean exit = FALSE; + + /* initialize output parameter */ + if (filter) + *filter = NULL; + + /* create a private copy of preferred filter substring in upper case */ + if (prefered_filter_name) { + prefered_filter_upper = g_strdup (prefered_filter_name); + _strupr (prefered_filter_upper); + } + + hres = CoCreateInstance (CLSID_FilterMapper2, NULL, CLSCTX_INPROC, + IID_IFilterMapper2, (void **) &mapper); + if (FAILED (hres)) + goto clean; + + memcpy (&arrayInTypes0, &input_majortype, sizeof (CLSID)); + memcpy (&arrayInTypes1, &input_subtype, sizeof (CLSID)); + memcpy (&arrayOutTypes0, &output_majortype, sizeof (CLSID)); + memcpy (&arrayOutTypes1, &output_subtype, sizeof (CLSID)); + + hres = + mapper->EnumMatchingFilters (&enum_moniker, 0, FALSE, + MERIT_DO_NOT_USE + 1, TRUE, 1, arrayInTypes, NULL, NULL, FALSE, TRUE, 1, + arrayOutTypes, NULL, NULL); + if (FAILED (hres)) + goto clean; + + enum_moniker->Reset (); + + while (hres = enum_moniker->Next (1, &moniker, &fetched), hres == S_OK + && !exit) { + IBaseFilter *filter_temp = NULL; + IPropertyBag *property_bag = NULL; + gchar *friendly_name = NULL; + + hres = + moniker->BindToStorage (NULL, NULL, IID_IPropertyBag, + (void **) &property_bag); + if (SUCCEEDED (hres) && property_bag) { + VARIANT varFriendlyName; + VariantInit (&varFriendlyName); + + hres = property_bag->Read (L"FriendlyName", &varFriendlyName, NULL); + if (hres == S_OK && varFriendlyName.bstrVal) { + friendly_name = wchar_to_gchar (varFriendlyName.bstrVal); + if (friendly_name) + _strupr (friendly_name); + SysFreeString (varFriendlyName.bstrVal); + } + property_bag->Release (); + } + + hres = + moniker->BindToObject (NULL, NULL, IID_IBaseFilter, + (void **) &filter_temp); + if (SUCCEEDED (hres) && filter_temp) { + ret = TRUE; + if (filter) { + if (*filter) + (*filter)->Release (); + + *filter = filter_temp; + (*filter)->AddRef (); + + if (prefered_filter_upper && friendly_name && + strstr (friendly_name, prefered_filter_upper)) + exit = TRUE; + } + + /* if we just want to know if the formats are supported OR + if we don't care about what will be the filter used + => we can stop enumeration */ + if (!filter || !prefered_filter_upper) + exit = TRUE; + + filter_temp->Release (); + } + + g_free (friendly_name); + moniker->Release (); + } + +clean: + g_free (prefered_filter_upper); + if (enum_moniker) + enum_moniker->Release (); + if (mapper) + mapper->Release (); + + return ret; +} + +void +gst_dshow_device_entry_free (DshowDeviceEntry * entry) +{ + if (entry) { + g_free (entry->device); + entry->device = NULL; + g_free (entry->device_name); + entry->device_name = NULL; + if (entry->caps) { + gst_caps_unref (entry->caps); + entry->caps = NULL; + } + if (entry->moniker) { + entry->moniker->Release (); + entry->moniker = NULL; + } + } +} + +void +gst_dshow_device_list_free (GList * devices) +{ + GList *cur; + + for (cur = devices; cur != NULL; cur = cur->next) + gst_dshow_device_entry_free ((DshowDeviceEntry *) cur->data); + + g_list_free (devices); +} + +GList * +gst_dshow_enumerate_devices (const GUID * device_category, gboolean getcaps) +{ + GList *result = NULL; + ICreateDevEnum *devices_enum = NULL; + IEnumMoniker *enum_moniker = NULL; + IMoniker *moniker = NULL; + HRESULT hres = S_FALSE; + ULONG fetched; + gint devidx = -1; + + hres = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, + IID_ICreateDevEnum, (void **) &devices_enum); + if (hres != S_OK) { + GST_ERROR ("Failed to create System Device Enumerator"); + goto clean; + } + + hres = devices_enum->CreateClassEnumerator (*device_category, + &enum_moniker, 0); + if (hres != S_OK || !enum_moniker) { + GST_ERROR ("Failed to create audio/video class device enumerator"); + goto clean; + } + + enum_moniker->Reset (); + + while (enum_moniker->Next (1, &moniker, &fetched) == S_OK) { + IPropertyBag *property_bag = NULL; + hres = moniker->BindToStorage (NULL, NULL, IID_IPropertyBag, + (void **) &property_bag); + if (SUCCEEDED (hres) && property_bag) { + VARIANT varFriendlyName; + VariantInit (&varFriendlyName); + + hres = property_bag->Read (L"FriendlyName", &varFriendlyName, NULL); + if (hres == S_OK && varFriendlyName.bstrVal) { + gchar *friendly_name = wchar_to_gchar (varFriendlyName.bstrVal); + + devidx++; + GST_DEBUG ("Found device idx=%d: device-name='%s'", + devidx, friendly_name); + + WCHAR *wszDisplayName = NULL; + hres = moniker->GetDisplayName (NULL, NULL, &wszDisplayName); + if (hres == S_OK && wszDisplayName) { + DshowDeviceEntry *entry = g_new0 (DshowDeviceEntry, 1); + gchar *device_path = NULL; + GstCaps *caps = NULL; + + device_path = wchar_to_gchar (wszDisplayName); + CoTaskMemFree (wszDisplayName); + + /* getting caps can be slow, so make it optional when enumerating */ + if (getcaps) { + IBindCtx *lpbc = NULL; + hres = CreateBindCtx (0, &lpbc); + if (SUCCEEDED (hres)) { + IBaseFilter *video_cap_filter = NULL; + hres = moniker->BindToObject (lpbc, NULL, IID_IBaseFilter, + (LPVOID *) & video_cap_filter); + if (video_cap_filter) { + caps = gst_dshowvideosrc_getcaps_from_capture_filter (video_cap_filter, NULL); + video_cap_filter->Release (); + } + lpbc->Release (); + } + } + + entry->device = device_path; + entry->device_name = friendly_name; + entry->device_index = devidx; + entry->caps = caps; + entry->moniker = moniker; + moniker = NULL; + result = g_list_append (result, entry); + } else { + g_free (friendly_name); + } + SysFreeString (varFriendlyName.bstrVal); + } + property_bag->Release (); + } + if (moniker) { + moniker->Release (); + } + } + +clean: + if (enum_moniker) { + enum_moniker->Release (); + } + + if (devices_enum) { + devices_enum->Release (); + } + + return result; +} + +DshowDeviceEntry * +gst_dshow_select_device (const GUID * device_category, + const gchar * device, const gchar * device_name, const gint device_index) +{ + GList *devices = NULL; + GList *item = NULL; + DshowDeviceEntry *selected = NULL; + + GST_DEBUG ("Trying to select device-index=%d, device-name='%s', device='%s'", + device_index, device_name, device); + + devices = gst_dshow_enumerate_devices (&CLSID_VideoInputDeviceCategory, FALSE); + + for (item = devices; item != NULL; item = item->next) { + DshowDeviceEntry *entry = (DshowDeviceEntry *) item->data; + + /* device will be used first, then device-name, then device-index */ + if (device && g_strcmp0 (device, entry->device) == 0) { + selected = entry; + break; + } else if (!device && device_name && g_strcmp0 (device_name, entry->device_name) == 0) { + selected = entry; + break; + } else if (!device && !device_name && device_index == entry->device_index) { + selected = entry; + break; + } + } + + if (selected) { + devices = g_list_remove (devices, selected); + GST_DEBUG ("Selected device-index=%d, device-name='%s', device='%s'", + selected->device_index, selected->device_name, selected->device); + } else { + GST_DEBUG ("No matching device found"); + } + + gst_dshow_device_list_free (devices); + + return selected; +} + +IBaseFilter * +gst_dshow_create_capture_filter (IMoniker *moniker) +{ + HRESULT hres = S_OK; + IBindCtx *lpbc = NULL; + IBaseFilter *video_cap_filter = NULL; + + g_assert (moniker != NULL); + + hres = CreateBindCtx (0, &lpbc); + if (SUCCEEDED (hres)) { + hres = moniker->BindToObject (lpbc, NULL, IID_IBaseFilter, + (LPVOID *) & video_cap_filter); + lpbc->Release (); + } + + return video_cap_filter; +} + +gchar * +gst_dshow_getdevice_from_devicename (const GUID * device_category, + gchar ** device_name, gint * device_index) +{ + gchar *ret = NULL; + ICreateDevEnum *devices_enum = NULL; + IEnumMoniker *enum_moniker = NULL; + IMoniker *moniker = NULL; + HRESULT hres = S_FALSE; + ULONG fetched; + gboolean bfound = FALSE; + gint devidx = -1; + + hres = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, + IID_ICreateDevEnum, (void **) &devices_enum); + if (hres != S_OK) { + GST_ERROR ("Failed to create System Device Enumerator"); + goto clean; + } + + hres = devices_enum->CreateClassEnumerator (*device_category, + &enum_moniker, 0); + if (hres != S_OK || !enum_moniker) { + GST_ERROR ("Failed to create audio/video class device enumerator"); + goto clean; + } + + enum_moniker->Reset (); + + while (hres = enum_moniker->Next (1, &moniker, &fetched), hres == S_OK + && !bfound) { + IPropertyBag *property_bag = NULL; + hres = + moniker->BindToStorage (NULL, NULL, IID_IPropertyBag, + (void **) &property_bag); + if (SUCCEEDED (hres) && property_bag) { + VARIANT varFriendlyName; + VariantInit (&varFriendlyName); + + hres = property_bag->Read (L"FriendlyName", &varFriendlyName, NULL); + if (hres == S_OK && varFriendlyName.bstrVal) { + gchar *friendly_name = wchar_to_gchar (varFriendlyName.bstrVal); + + devidx++; + GST_DEBUG ("Found device idx=%d: device-name='%s'", + devidx, friendly_name); + + if ((!*device_name || !**device_name) && devidx == *device_index) { + g_free (*device_name); + *device_name = g_strdup (friendly_name); + } + + if ((*device_name && **device_name) + && _stricmp (*device_name, friendly_name) == 0) { + WCHAR *wszDisplayName = NULL; + hres = moniker->GetDisplayName (NULL, NULL, &wszDisplayName); + if (hres == S_OK && wszDisplayName) { + *device_index = devidx; + ret = wchar_to_gchar (wszDisplayName); + CoTaskMemFree (wszDisplayName); + } + bfound = TRUE; + } + SysFreeString (varFriendlyName.bstrVal); + } + property_bag->Release (); + } + moniker->Release (); + } + +clean: + if (enum_moniker) { + enum_moniker->Release (); + } + + if (devices_enum) { + devices_enum->Release (); + } + + return ret; +} + +gboolean +gst_dshow_show_propertypage (IBaseFilter * base_filter) +{ + gboolean ret = FALSE; + ISpecifyPropertyPages *pProp = NULL; + HRESULT hres = + base_filter->QueryInterface (IID_ISpecifyPropertyPages, (void **) &pProp); + if (SUCCEEDED (hres)) { + /* Get the filter's name and IUnknown pointer. */ + FILTER_INFO FilterInfo; + CAUUID caGUID; + IUnknown *pFilterUnk = NULL; + hres = base_filter->QueryFilterInfo (&FilterInfo); + base_filter->QueryInterface (IID_IUnknown, (void **) &pFilterUnk); + + /* Show the page. */ + pProp->GetPages (&caGUID); + pProp->Release (); + OleCreatePropertyFrame (GetDesktopWindow (), 0, 0, FilterInfo.achName, + 1, &pFilterUnk, caGUID.cElems, caGUID.pElems, 0, 0, NULL); + + pFilterUnk->Release (); + FilterInfo.pGraph->Release (); + CoTaskMemFree (caGUID.pElems); + } + return ret; +} + +GstVideoFormat +gst_dshow_guid_to_gst_video_format (AM_MEDIA_TYPE *mediatype) +{ + if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_I420, FORMAT_VideoInfo)) + return GST_VIDEO_FORMAT_I420; + + if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB24, FORMAT_VideoInfo)) + return GST_VIDEO_FORMAT_BGR; + + if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_YUY2, FORMAT_VideoInfo)) + return GST_VIDEO_FORMAT_YUY2; + + if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_UYVY, FORMAT_VideoInfo)) + return GST_VIDEO_FORMAT_UYVY; + + if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB32, FORMAT_VideoInfo)) + return GST_VIDEO_FORMAT_BGRx; + + if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB565, FORMAT_VideoInfo)) + return GST_VIDEO_FORMAT_BGR16; + + if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB555, FORMAT_VideoInfo)) + return GST_VIDEO_FORMAT_BGR15; + + if (gst_dshow_check_mediatype (mediatype, MEDIASUBTYPE_RGB8, FORMAT_VideoInfo)) + return GST_VIDEO_FORMAT_GRAY8; + + return GST_VIDEO_FORMAT_UNKNOWN; +} + +gboolean +gst_dshow_is_pin_connected (IPin * pin) +{ + IPin *tmp_pin = NULL; + gboolean res; + HRESULT hres; + + g_assert (pin); + hres = pin->ConnectedTo (&tmp_pin); + res = (hres != VFW_E_NOT_CONNECTED); + if (tmp_pin) + tmp_pin->Release (); + + return res; +} + +GstCaps * +gst_dshow_new_video_caps (GstVideoFormat video_format, const gchar * name, + GstCapturePinMediaType * pin_mediatype) +{ + GstCaps *video_caps = NULL; + GstStructure *video_structure = NULL; + gint min_w, max_w; + gint min_h, max_h; + gint min_fr, max_fr; + + /* raw video format */ + switch (video_format) { + case GST_VIDEO_FORMAT_BGR: + video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGR")); + break; + case GST_VIDEO_FORMAT_I420: + video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("I420")); + break; + case GST_VIDEO_FORMAT_YUY2: + video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("YUY2")); + break; + case GST_VIDEO_FORMAT_UYVY: + video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("UYVY")); + break; + case GST_VIDEO_FORMAT_BGRx: + video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGRx")); + break; + case GST_VIDEO_FORMAT_BGR16: + video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGR16")); + break; + case GST_VIDEO_FORMAT_BGR15: + video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("BGR15")); + break; + case GST_VIDEO_FORMAT_GRAY8: + video_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE ("GRAY8")); + break; + default: + break; + } + + /* other video format */ + if (!video_caps) { + if (g_ascii_strncasecmp (name, "video/x-dv, systemstream=FALSE", 31) == 0) { + video_caps = gst_caps_new_simple ("video/x-dv", + "systemstream", G_TYPE_BOOLEAN, FALSE, + "format", G_TYPE_STRING, "dvsd", + NULL); + } else if (g_ascii_strncasecmp (name, "video/x-dv, systemstream=TRUE", 31) == 0) { + video_caps = gst_caps_new_simple ("video/x-dv", + "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); + return video_caps; + } else if (g_ascii_strncasecmp (name, "image/jpeg", 10) == 0) { + video_caps = gst_caps_new_simple ("image/jpeg", NULL); + } else if (g_ascii_strncasecmp (name, "video/x-h264", 12) == 0) { + video_caps = gst_caps_new_simple ("video/x-h264", NULL); + } + } + + if (!video_caps) + return NULL; + + video_structure = gst_caps_get_structure (video_caps, 0); + + /* Hope GST_TYPE_INT_RANGE_STEP will exits in future gstreamer releases */ + /* because we could use : */ + /* "width", GST_TYPE_INT_RANGE_STEP, video_default->minWidth, video_default->maxWidth, video_default->granularityWidth */ + /* instead of : */ + /* "width", GST_TYPE_INT_RANGE, video_default->minWidth, video_default->maxWidth */ + + /* For framerate we do not need a step (granularity) because */ + /* "The IAMStreamConfig::SetFormat method will set the frame rate to the closest */ + /* value that the filter supports" as it said in the VIDEO_STREAM_CONFIG_CAPS dshwo doc */ + + min_w = pin_mediatype->vscc.MinOutputSize.cx; + max_w = pin_mediatype->vscc.MaxOutputSize.cx; + min_h = pin_mediatype->vscc.MinOutputSize.cy; + max_h = pin_mediatype->vscc.MaxOutputSize.cy; + min_fr = (gint) (10000000 / pin_mediatype->vscc.MaxFrameInterval); + max_fr = (gint)(10000000 / pin_mediatype->vscc.MinFrameInterval); + + if (min_w == max_w) + gst_structure_set (video_structure, "width", G_TYPE_INT, min_w, NULL); + else + gst_structure_set (video_structure, + "width", GST_TYPE_INT_RANGE, min_w, max_w, NULL); + + if (min_h == max_h) + gst_structure_set (video_structure, "height", G_TYPE_INT, min_h, NULL); + else + gst_structure_set (video_structure, + "height", GST_TYPE_INT_RANGE, min_h, max_h, NULL); + + if (min_fr == max_fr) + gst_structure_set (video_structure, "framerate", + GST_TYPE_FRACTION, min_fr, 1, NULL); + else + gst_structure_set (video_structure, "framerate", + GST_TYPE_FRACTION_RANGE, min_fr, 1, max_fr, 1, NULL); + + return video_caps; +} + +bool gst_dshow_configure_latency (IPin *pCapturePin, guint bufSizeMS) +{ + HRESULT hr; + ALLOCATOR_PROPERTIES alloc_prop; + IAMBufferNegotiation * pNeg = NULL; + hr = pCapturePin->QueryInterface(IID_IAMBufferNegotiation, (void **)&pNeg); + + if(!SUCCEEDED (hr)) + return FALSE; + + alloc_prop.cbAlign = -1; // -1 means no preference. + alloc_prop.cbBuffer = bufSizeMS; + alloc_prop.cbPrefix = -1; + alloc_prop.cBuffers = -1; + hr = pNeg->SuggestAllocatorProperties (&alloc_prop); + return SUCCEEDED (hr); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshow.h
Added
@@ -0,0 +1,127 @@ +/* GStreamer + * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> + * + * gstdshow.h: + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef _GSTDSHOW_ +#define _GSTDSHOW_ + +#include <streams.h> +#include <windows.h> +#include <tchar.h> +#include <objbase.h> +#include <dshow.h> +#include <Rpc.h> + +#include <gst/gst.h> +#include <gst/video/video.h> + +typedef struct _DshowDeviceEntry DshowDeviceEntry; + +struct _DshowDeviceEntry +{ + gchar *device; + gchar *device_name; + gint device_index; + GstCaps *caps; + IMoniker *moniker; +}; + +typedef struct _GstCapturePinMediaType +{ + AM_MEDIA_TYPE *mediatype; + IPin *capture_pin; + + VIDEO_STREAM_CONFIG_CAPS vscc; + + //default caps + gint defaultWidth; + gint defaultHeight; + gint defaultFPS; + + gint granularityWidth; //will be removed when GST_TYPE_INT_RANGE_STEP exits + gint granularityHeight; //will be removed when GST_TYPE_INT_RANGE_STEP exits +} GstCapturePinMediaType; + +/* free memory of the input pin mediatype */ +void gst_dshow_free_pin_mediatype (gpointer pt); + +/* free memory of the input dshow mediatype */ +void gst_dshow_free_mediatype (AM_MEDIA_TYPE * pmt); + +/* create a new capture media type that handles dshow video caps of a capture pin */ +GstCapturePinMediaType *gst_dshow_new_pin_mediatype (IPin * pin); + +/* create a new capture media type from enum mediatype */ +GstCapturePinMediaType * gst_dshow_new_pin_mediatype_from_enum_mediatypes (IPin * pin, + IEnumMediaTypes *enum_mediatypes); + +/* create a new capture media type from streamcaps */ +GstCapturePinMediaType *gst_dshow_new_pin_mediatype_from_streamcaps (IPin * pin, + gint id, IAMStreamConfig * streamcaps); + +/* free the memory of all mediatypes of the input list if pin mediatype */ +void gst_dshow_free_pins_mediatypes (GList * mediatypes); + +/* allow to know what kind of media type we have */ +gboolean gst_dshow_check_mediatype (AM_MEDIA_TYPE * media_type, + const GUID sub_type, const GUID format_type); + +/* get a pin from directshow filter */ +gboolean gst_dshow_get_pin_from_filter (IBaseFilter * filter, + PIN_DIRECTION pindir, IPin ** pin); + +/* find and return a filter according to the input and output types */ +gboolean gst_dshow_find_filter (CLSID input_majortype, CLSID input_subtype, + CLSID output_majortype, CLSID output_subtype, + gchar * prefered_filter_name, IBaseFilter ** filter); + +/* get the dshow device path from device friendly name. +If friendly name is not set, it will return the first available device */ +gchar *gst_dshow_getdevice_from_devicename (const GUID * device_category, + gchar ** device_name, gint * device_index); + +/* show the capture filter property page (generally used to setup the device). the page is modal*/ +gboolean gst_dshow_show_propertypage (IBaseFilter * base_filter); + +/* translate GUID format to gsteamer video format */ +GstVideoFormat gst_dshow_guid_to_gst_video_format (AM_MEDIA_TYPE *mediatype); + +/* check if IPin is connected */ +gboolean gst_dshow_is_pin_connected (IPin *pin); + +/* transform a dshow video caps to a gstreamer video caps */ +GstCaps *gst_dshow_new_video_caps (GstVideoFormat video_format, + const gchar * name, GstCapturePinMediaType * pin_mediatype); + +/* configure the latency of the capture source */ +bool gst_dshow_configure_latency (IPin *pCapturePin, guint bufSizeMS); + +/* enumerate devices of a given category (i.e., audio or video) */ +void gst_dshow_device_entry_free (DshowDeviceEntry *entry); +void gst_dshow_device_list_free (GList * devices); +GList * gst_dshow_enumerate_devices (const GUID * device_category, gboolean getcaps); + +DshowDeviceEntry * gst_dshow_select_device (const GUID * device_category, + const gchar *device, const gchar *device_name, const gint device_index); + +/* create capture filter from moniker */ +IBaseFilter *gst_dshow_create_capture_filter (IMoniker *moniker); + +#endif /* _GSTDSHOW_ */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowaudiodec.cpp
Added
@@ -0,0 +1,1206 @@ +/* + * GStreamer DirectShow codecs wrapper + * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com> + * Copyright <2006, 2007, 2008> Pioneers of the Inevitable <songbird@songbirdnest.com> + * Copyright <2007,2008> Sebastien Moutte <sebastien@moutte.net> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstdshowaudiodec.h" +#include <mmreg.h> +#include <dmoreg.h> +#include <wmcodecdsp.h> +#include <gst/audio/audio.h> + +GST_DEBUG_CATEGORY_STATIC (dshowaudiodec_debug); +#define GST_CAT_DEFAULT dshowaudiodec_debug + +#define gst_dshowaudiodec_parent_class parent_class +G_DEFINE_TYPE(GstDshowAudioDec, gst_dshowaudiodec, GST_TYPE_ELEMENT) + +static void gst_dshowaudiodec_finalize (GObject * object); +static GstStateChangeReturn gst_dshowaudiodec_change_state + (GstElement * element, GstStateChange transition); + +/* sink pad overwrites */ +static gboolean gst_dshowaudiodec_sink_setcaps (GstPad * pad, GstCaps * caps); +static GstFlowReturn gst_dshowaudiodec_chain (GstPad * pad, GstObject *parent, GstBuffer * buffer); +static gboolean gst_dshowaudiodec_sink_event (GstPad * pad, GstObject *parent, GstEvent * event); + +/* utils */ +static gboolean gst_dshowaudiodec_create_graph_and_filters (GstDshowAudioDec * + adec); +static gboolean gst_dshowaudiodec_destroy_graph_and_filters (GstDshowAudioDec * + adec); +static gboolean gst_dshowaudiodec_flush (GstDshowAudioDec * adec); +static gboolean gst_dshowaudiodec_get_filter_settings (GstDshowAudioDec * adec); +static gboolean gst_dshowaudiodec_setup_graph (GstDshowAudioDec * adec, GstCaps *caps); + +/* All the GUIDs we want are generated from the FOURCC like this */ +#define GUID_MEDIASUBTYPE_FROM_FOURCC(fourcc) \ + { fourcc , 0x0000, 0x0010, \ + { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} + +/* WMA we should always use the DMO */ +static PreferredFilter preferred_wma_filters = { + {&CLSID_CWMADecMediaObject, &DMOCATEGORY_AUDIO_DECODER}, + {0} +}; + +/* Prefer the Vista (DMO) decoder if present, otherwise the XP + * decoder (not a DMO), otherwise fallback to highest-merit */ +static const GUID CLSID_XP_MP3_DECODER = {0x38BE3000, 0xDBF4, 0x11D0, + {0x86,0x0E,0x00,0xA0,0x24,0xCF,0xEF,0x6D}}; +static PreferredFilter preferred_mp3_filters = { + {&CLSID_CMP3DecMediaObject, &DMOCATEGORY_AUDIO_DECODER}, + {&CLSID_XP_MP3_DECODER}, + {0} +}; + +/* MPEG 1/2: use the MPEG Audio Decoder filter */ +static const GUID CLSID_WINDOWS_MPEG_AUDIO_DECODER = + {0x4A2286E0, 0x7BEF, 0x11CE, + {0x9B, 0xD9, 0x00, 0x00, 0xE2, 0x02, 0x59, 0x9C}}; +static PreferredFilter preferred_mpegaudio_filters = { + {&CLSID_WINDOWS_MPEG_AUDIO_DECODER}, + {0} +}; + +static const AudioCodecEntry audio_dec_codecs = { + {"dshowadec_wma1", "Windows Media Audio 7", + WAVE_FORMAT_MSAUDIO1, + "audio/x-wma, wmaversion = (int) 1", + preferred_wma_filters}, + + {"dshowadec_wma2", "Windows Media Audio 8", + WAVE_FORMAT_WMAUDIO2, + "audio/x-wma, wmaversion = (int) 2", + preferred_wma_filters}, + + {"dshowadec_wma3", "Windows Media Audio 9 Professional", + WAVE_FORMAT_WMAUDIO3, + "audio/x-wma, wmaversion = (int) 3", + preferred_wma_filters}, + + {"dshowadec_wma4", "Windows Media Audio 9 Lossless", + WAVE_FORMAT_WMAUDIO_LOSSLESS, + "audio/x-wma, wmaversion = (int) 4", + preferred_wma_filters}, + + {"dshowadec_wms", "Windows Media Audio Voice v9", + WAVE_FORMAT_WMAVOICE9, + "audio/x-wms", + preferred_wma_filters}, + + {"dshowadec_mp3", "MPEG Layer 3 Audio", + WAVE_FORMAT_MPEGLAYER3, + "audio/mpeg, " + "mpegversion = (int) 1, " + "layer = (int)3, " + "rate = (int) 8000, 48000 , " + "channels = (int) 1, 2 , " + "parsed= (boolean) true", + preferred_mp3_filters}, + + {"dshowadec_mpeg_1_2", "MPEG Layer 1,2 Audio", + WAVE_FORMAT_MPEG, + "audio/mpeg, " + "mpegversion = (int) 1, " + "layer = (int) 1, 2 , " + "rate = (int) 8000, 48000 , " + "channels = (int) 1, 2 , " + "parsed= (boolean) true", + preferred_mpegaudio_filters}, +}; + +HRESULT AudioFakeSink::DoRenderSample(IMediaSample *pMediaSample) +{ + GstBuffer *out_buf = NULL; + gboolean in_seg = FALSE; + GstClockTime buf_start, buf_stop; + guint64 clip_start = 0, clip_stop = 0; + guint start_offset = 0, stop_offset; + GstClockTime duration; + + if(pMediaSample) + { + BYTE *pBuffer = NULL; + LONGLONG lStart = 0, lStop = 0; + long size = pMediaSample->GetActualDataLength(); + + pMediaSample->GetPointer(&pBuffer); + pMediaSample->GetTime(&lStart, &lStop); + + if (!GST_CLOCK_TIME_IS_VALID (mDec->timestamp)) { + // Convert REFERENCE_TIME to GST_CLOCK_TIME + mDec->timestamp = (GstClockTime)lStart * 100; + } + duration = (lStop - lStart) * 100; + + buf_start = mDec->timestamp; + buf_stop = mDec->timestamp + duration; + + /* save stop position to start next buffer with it */ + mDec->timestamp = buf_stop; + + /* check if this buffer is in our current segment */ + in_seg = gst_segment_clip (mDec->segment, GST_FORMAT_TIME, + buf_start, buf_stop, &clip_start, &clip_stop); + + /* if the buffer is out of segment do not push it downstream */ + if (!in_seg) { + GST_DEBUG_OBJECT (mDec, + "buffer is out of segment, start %" GST_TIME_FORMAT " stop %" + GST_TIME_FORMAT, GST_TIME_ARGS (buf_start), GST_TIME_ARGS (buf_stop)); + goto done; + } + + /* buffer is entirely or partially in-segment, so allocate a + * GstBuffer for output, and clip if required */ + + /* allocate a new buffer for raw audio */ + out_buf = gst_buffer_new_and_alloc(size); + if (!out_buf) { + GST_WARNING_OBJECT (mDec, "cannot allocate a new GstBuffer"); + goto done; + } + + /* set buffer properties */ + GST_BUFFER_TIMESTAMP (out_buf) = buf_start; + GST_BUFFER_DURATION (out_buf) = duration; + + if (gst_buffer_fill(out_buf, 0, pBuffer, size) != size) { + gst_buffer_unref (out_buf); + GST_WARNING_OBJECT (mDec, "unable to fill output buffer"); + goto done; + } + + /* we have to remove some heading samples */ + if ((GstClockTime) clip_start > buf_start) { + start_offset = (guint)gst_util_uint64_scale_int (clip_start - buf_start, + mDec->rate, GST_SECOND) * mDec->depth / 8 * mDec->channels; + } + else + start_offset = 0; + /* we have to remove some trailing samples */ + if ((GstClockTime) clip_stop < buf_stop) { + stop_offset = (guint)gst_util_uint64_scale_int (buf_stop - clip_stop, + mDec->rate, GST_SECOND) * mDec->depth / 8 * mDec->channels; + } + else + stop_offset = size; + + /* truncating */ + if ((start_offset != 0) || (stop_offset != (size_t) size)) { + + GstBuffer *subbuf = gst_buffer_copy_region (out_buf, GST_BUFFER_COPY_ALL, + start_offset, stop_offset - start_offset); + + if (subbuf) { + gst_buffer_unref (out_buf); + out_buf = subbuf; + } + } + + GST_BUFFER_TIMESTAMP (out_buf) = clip_start; + GST_BUFFER_DURATION (out_buf) = clip_stop - clip_start; + + /* replace the saved stop position by the clipped one */ + mDec->timestamp = clip_stop; + + GST_DEBUG_OBJECT (mDec, + "push_buffer (size %d)=> pts %" GST_TIME_FORMAT " stop %" GST_TIME_FORMAT + " duration %" GST_TIME_FORMAT, size, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (out_buf)), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (out_buf) + + GST_BUFFER_DURATION (out_buf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (out_buf))); + + mDec->last_ret = gst_pad_push (mDec->srcpad, out_buf); + } + +done: + return S_OK; +} + +HRESULT AudioFakeSink::CheckMediaType(const CMediaType *pmt) +{ + if(pmt != NULL) + { + /* The Vista MP3 decoder (and possibly others?) outputs an + * AM_MEDIA_TYPE with the wrong cbFormat. So, rather than using + * CMediaType.operator==, we implement a sufficient check ourselves. + * I think this is a bug in the MP3 decoder. + */ + if (IsEqualGUID (pmt->majortype, m_MediaType.majortype) && + IsEqualGUID (pmt->subtype, m_MediaType.subtype) && + IsEqualGUID (pmt->formattype, m_MediaType.formattype)) + { + /* Types are the same at the top-level. Now, we need to compare + * the format blocks. + * We special case WAVEFORMATEX to not check that + * pmt->cbFormat == m_MediaType.cbFormat, though the actual format + * blocks must still be the same. + */ + if (pmt->formattype == FORMAT_WaveFormatEx) { + if (pmt->cbFormat >= sizeof (WAVEFORMATEX) && + m_MediaType.cbFormat >= sizeof (WAVEFORMATEX)) + { + WAVEFORMATEX *wf1 = (WAVEFORMATEX *)pmt->pbFormat; + WAVEFORMATEX *wf2 = (WAVEFORMATEX *)m_MediaType.pbFormat; + if (wf1->cbSize == wf2->cbSize && + memcmp (wf1, wf2, sizeof(WAVEFORMATEX) + wf1->cbSize) == 0) + return S_OK; + } + } + else { + if (pmt->cbFormat == m_MediaType.cbFormat && + pmt->cbFormat == 0 || + (pmt->pbFormat != NULL && m_MediaType.pbFormat != NULL && + memcmp (pmt->pbFormat, m_MediaType.pbFormat, pmt->cbFormat) == 0)) + return S_OK; + } + } + } + + return S_FALSE; +} + +int AudioFakeSink::GetBufferSize() +{ + IMemAllocator *allocator = NULL; + if (m_pInputPin) { + allocator = m_pInputPin->Allocator(); + if(allocator) { + ALLOCATOR_PROPERTIES props; + allocator->GetProperties(&props); + return props.cbBuffer; + } + } + + return 0; +} + +static void +gst_dshowaudiodec_base_init (gpointer klass) +{ + GstDshowAudioDecClass *audiodec_class = (GstDshowAudioDecClass *) klass; + GstPadTemplate *src, *sink; + GstCaps *srccaps, *sinkcaps; + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + const AudioCodecEntry *tmp; + gpointer qdata; + gchar *longname, *description; + + qdata = g_type_get_qdata (G_OBJECT_CLASS_TYPE (klass), DSHOW_CODEC_QDATA); + + /* element details */ + tmp = audiodec_class->entry = (AudioCodecEntry *) qdata; + + longname = g_strdup_printf ("DirectShow %s Decoder Wrapper", + tmp->element_longname); + description = g_strdup_printf ("DirectShow %s Decoder Wrapper", + tmp->element_longname); + + gst_element_class_set_metadata(element_class, longname, "Codec/Decoder/Audio", description, + "Sebastien Moutte <sebastien@moutte.net>"); + + g_free (longname); + g_free (description); + + sinkcaps = gst_caps_from_string (tmp->sinkcaps); + + srccaps = gst_caps_from_string ( + "audio/x-raw," + "format = (string)" GST_AUDIO_FORMATS_ALL "," + "rate = (int)1, MAX," + "channels = (int)1, MAX," + "layout = (string)interleaved"); + + sink = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, sinkcaps); + src = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, srccaps); + + /* register */ + gst_element_class_add_pad_template (element_class, src); + gst_element_class_add_pad_template (element_class, sink); + + if (sinkcaps) + gst_caps_unref(sinkcaps); + + if (srccaps) + gst_caps_unref(srccaps); +} + +static void +gst_dshowaudiodec_class_init (GstDshowAudioDecClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + + gobject_class->finalize = gst_dshowaudiodec_finalize; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_dshowaudiodec_change_state); + + parent_class = (GstElementClass *) g_type_class_peek_parent (klass); +} + +static void +gst_dshowaudiodec_com_thread (GstDshowAudioDec * adec) +{ + HRESULT res; + + g_mutex_lock (&adec->com_init_lock); + + /* Initialize COM with a MTA for this process. This thread will + * be the first one to enter the apartement and the last one to leave + * it, unitializing COM properly */ + + res = CoInitializeEx (0, COINIT_MULTITHREADED); + if (res == S_FALSE) + GST_WARNING_OBJECT (adec, "COM has been already initialized in the same process"); + else if (res == RPC_E_CHANGED_MODE) + GST_WARNING_OBJECT (adec, "The concurrency model of COM has changed."); + else + GST_INFO_OBJECT (adec, "COM initialized successfully"); + + adec->comInitialized = TRUE; + + /* Signal other threads waiting on this condition that COM was initialized */ + g_cond_signal (&adec->com_initialized); + + g_mutex_unlock (&adec->com_init_lock); + + /* Wait until the uninitialize condition is met to leave the COM apartement */ + g_mutex_lock (&adec->com_deinit_lock); + g_cond_wait (&adec->com_uninitialize, &adec->com_deinit_lock); + + CoUninitialize (); + GST_INFO_OBJECT (adec, "COM uninitialized successfully"); + adec->comInitialized = FALSE; + g_cond_signal (&adec->com_uninitialized); + g_mutex_unlock (&adec->com_deinit_lock); +} + +static void +gst_dshowaudiodec_init (GstDshowAudioDec * adec) +{ + GstElementClass *element_class = GST_ELEMENT_GET_CLASS (adec); + + /* setup pads */ + adec->sinkpad = + gst_pad_new_from_template (gst_element_class_get_pad_template + (element_class, "sink"), "sink"); + + gst_pad_set_event_function (adec->sinkpad, gst_dshowaudiodec_sink_event); + gst_pad_set_chain_function (adec->sinkpad, gst_dshowaudiodec_chain); + gst_element_add_pad (GST_ELEMENT (adec), adec->sinkpad); + + adec->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template + (element_class, "src"), "src"); + gst_element_add_pad (GST_ELEMENT (adec), adec->srcpad); + + adec->fakesrc = NULL; + adec->fakesink = NULL; + + adec->decfilter = 0; + adec->filtergraph = 0; + adec->mediafilter = 0; + + adec->timestamp = GST_CLOCK_TIME_NONE; + adec->segment = gst_segment_new (); + adec->setup = FALSE; + adec->depth = 0; + adec->bitrate = 0; + adec->block_align = 0; + adec->channels = 0; + adec->rate = 0; + adec->layer = 0; + adec->codec_data = NULL; + + adec->last_ret = GST_FLOW_OK; + + g_mutex_init(&adec->com_init_lock); + g_mutex_init(&adec->com_deinit_lock); + g_cond_init(&adec->com_initialized); + g_cond_init(&adec->com_uninitialize); + g_cond_init(&adec->com_uninitialized); + + g_mutex_lock (&adec->com_init_lock); + + /* create the COM initialization thread */ + g_thread_new ("COM init thread", (GThreadFunc)gst_dshowaudiodec_com_thread, + adec); + + /* wait until the COM thread signals that COM has been initialized */ + g_cond_wait (&adec->com_initialized, &adec->com_init_lock); + g_mutex_unlock (&adec->com_init_lock); +} + +static void +gst_dshowaudiodec_finalize (GObject * object) +{ + GstDshowAudioDec *adec = (GstDshowAudioDec *) (object); + + if (adec->segment) { + gst_segment_free (adec->segment); + adec->segment = NULL; + } + + if (adec->codec_data) { + gst_buffer_unref (adec->codec_data); + adec->codec_data = NULL; + } + + /* signal the COM thread that it sould uninitialize COM */ + if (adec->comInitialized) { + g_mutex_lock (&adec->com_deinit_lock); + g_cond_signal (&adec->com_uninitialize); + g_cond_wait (&adec->com_uninitialized, &adec->com_deinit_lock); + g_mutex_unlock (&adec->com_deinit_lock); + } + + g_mutex_clear (&adec->com_init_lock); + g_mutex_clear (&adec->com_deinit_lock); + g_cond_clear (&adec->com_initialized); + g_cond_clear (&adec->com_uninitialize); + g_cond_clear (&adec->com_uninitialized); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GstStateChangeReturn +gst_dshowaudiodec_change_state (GstElement * element, GstStateChange transition) +{ + GstDshowAudioDec *adec = (GstDshowAudioDec *) (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!gst_dshowaudiodec_create_graph_and_filters (adec)) + return GST_STATE_CHANGE_FAILURE; + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + break; + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + adec->depth = 0; + adec->bitrate = 0; + adec->block_align = 0; + adec->channels = 0; + adec->rate = 0; + adec->layer = 0; + if (adec->codec_data) { + gst_buffer_unref (adec->codec_data); + adec->codec_data = NULL; + } + break; + case GST_STATE_CHANGE_READY_TO_NULL: + if (!gst_dshowaudiodec_destroy_graph_and_filters (adec)) + return GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + return GST_ELEMENT_CLASS(parent_class)->change_state (element, transition); +} + +static gboolean +gst_dshowaudiodec_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + gboolean ret = FALSE; + GstDshowAudioDec *adec = (GstDshowAudioDec *) gst_pad_get_parent (pad); + GstStructure *s = gst_caps_get_structure (caps, 0); + const GValue *v = NULL; + + adec->timestamp = GST_CLOCK_TIME_NONE; + + /* read data, only rate and channels are needed */ + if (!gst_structure_get_int (s, "rate", &adec->rate) || + !gst_structure_get_int (s, "channels", &adec->channels)) { + GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, + ("error getting audio specs from caps"), (NULL)); + goto end; + } + + gst_structure_get_int (s, "depth", &adec->depth); + gst_structure_get_int (s, "bitrate", &adec->bitrate); + gst_structure_get_int (s, "block_align", &adec->block_align); + gst_structure_get_int (s, "layer", &adec->layer); + + if (adec->codec_data) { + gst_buffer_unref (adec->codec_data); + adec->codec_data = NULL; + } + + if ((v = gst_structure_get_value (s, "codec_data"))) + adec->codec_data = gst_buffer_ref (gst_value_get_buffer (v)); + + ret = gst_dshowaudiodec_setup_graph (adec, caps); +end: + gst_object_unref (adec); + + return ret; +} + +static GstFlowReturn +gst_dshowaudiodec_chain (GstPad *pad, GstObject *parent, GstBuffer *buffer) +{ + GstDshowAudioDec *adec = (GstDshowAudioDec *) gst_pad_get_parent (pad); + GstMapInfo map; + bool discont = FALSE; + + if (!adec->setup) { + /* we are not set up */ + GST_WARNING_OBJECT (adec, "Decoder not set up, failing"); + adec->last_ret = GST_FLOW_FLUSHING; + goto beach; + } + + if (adec->last_ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (adec, "last decoding iteration generated a fatal error " + "%s", gst_flow_get_name (adec->last_ret)); + goto beach; + } + + GST_CAT_DEBUG_OBJECT (dshowaudiodec_debug, adec, "chain (size %d)=> pts %" + GST_TIME_FORMAT " stop %" GST_TIME_FORMAT, + gst_buffer_get_size(buffer), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer) + + GST_BUFFER_DURATION (buffer))); + + /* if the incoming buffer has discont flag set => flush decoder data */ + if (buffer && GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) { + GST_CAT_DEBUG_OBJECT (dshowaudiodec_debug, adec, + "this buffer has a DISCONT flag (%" GST_TIME_FORMAT "), flushing", + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); + gst_dshowaudiodec_flush (adec); + discont = TRUE; + } + + /* push the buffer to the directshow decoder */ + gst_buffer_map(buffer, &map, GST_MAP_READ); + adec->fakesrc->GetOutputPin()->PushBuffer ( + map.data, GST_BUFFER_TIMESTAMP (buffer), + GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer), + map.size, (bool)discont); + gst_buffer_unmap(buffer, &map); + +beach: + gst_buffer_unref (buffer); + gst_object_unref (adec); + return adec->last_ret; +} + +static gboolean +gst_dshowaudiodec_sink_event (GstPad * pad, GstObject *parent, GstEvent * event) +{ + gboolean ret = TRUE; + GstDshowAudioDec *adec = (GstDshowAudioDec *) parent; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS:{ + GstCaps *caps; + gst_event_parse_caps(event, &caps); + ret = gst_dshowaudiodec_sink_setcaps(pad, caps); + break; + } + + case GST_EVENT_FLUSH_STOP:{ + gst_dshowaudiodec_flush (adec); + ret = gst_pad_event_default (pad, parent, event); + break; + } + + case GST_EVENT_SEGMENT:{ + const GstSegment *segment; + gst_event_parse_segment (event, &segment); + + GST_CAT_DEBUG_OBJECT (dshowaudiodec_debug, adec, + "received new segment from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, + GST_TIME_ARGS (segment->start), GST_TIME_ARGS (segment->stop)); + + /* save the new segment in our local current segment */ + gst_segment_copy_into(segment, adec->segment); + + ret = gst_pad_event_default (pad, parent, event); + break; + } + + default: + ret = gst_pad_event_default (pad, parent, event); + break; + } + + return ret; +} + +static gboolean +gst_dshowaudiodec_flush (GstDshowAudioDec * adec) +{ + if (!adec->fakesrc) + return FALSE; + + /* flush dshow decoder and reset timestamp */ + adec->fakesrc->GetOutputPin()->Flush(); + + adec->timestamp = GST_CLOCK_TIME_NONE; + adec->last_ret = GST_FLOW_OK; + + return TRUE; +} + +static AM_MEDIA_TYPE * +dshowaudiodec_set_input_format (GstDshowAudioDec *adec, GstCaps *caps) +{ + AM_MEDIA_TYPE *mediatype; + WAVEFORMATEX *format; + GstDshowAudioDecClass *klass = + (GstDshowAudioDecClass *) G_OBJECT_GET_CLASS (adec); + const AudioCodecEntry *codec_entry = klass->entry; + int size; + + mediatype = (AM_MEDIA_TYPE *)g_malloc0 (sizeof(AM_MEDIA_TYPE)); + mediatype->majortype = MEDIATYPE_Audio; + GUID subtype = GUID_MEDIASUBTYPE_FROM_FOURCC (0x00000000); + subtype.Data1 = codec_entry->format; + mediatype->subtype = subtype; + mediatype->bFixedSizeSamples = TRUE; + mediatype->bTemporalCompression = FALSE; + if (adec->block_align) + mediatype->lSampleSize = adec->block_align; + else + mediatype->lSampleSize = 8192; /* need to evaluate it dynamically */ + mediatype->formattype = FORMAT_WaveFormatEx; + + /* We need this special behaviour for layers 1 and 2 (layer 3 uses a different + * decoder which doesn't need this */ + if (adec->layer == 1 || adec->layer == 2) { + MPEG1WAVEFORMAT *mpeg1_format; + int samples, version; + GstStructure *structure = gst_caps_get_structure (caps, 0); + + size = sizeof (MPEG1WAVEFORMAT); + format = (WAVEFORMATEX *)g_malloc0 (size); + format->cbSize = sizeof (MPEG1WAVEFORMAT) - sizeof (WAVEFORMATEX); + format->wFormatTag = WAVE_FORMAT_MPEG; + + mpeg1_format = (MPEG1WAVEFORMAT *) format; + + mpeg1_format->wfx.nChannels = adec->channels; + if (adec->channels == 2) + mpeg1_format->fwHeadMode = ACM_MPEG_STEREO; + else + mpeg1_format->fwHeadMode = ACM_MPEG_SINGLECHANNEL; + + mpeg1_format->fwHeadModeExt = 0; + mpeg1_format->wHeadEmphasis = 0; + mpeg1_format->fwHeadFlags = 0; + + switch (adec->layer) { + case 1: + mpeg1_format->fwHeadLayer = ACM_MPEG_LAYER3; + break; + case 2: + mpeg1_format->fwHeadLayer = ACM_MPEG_LAYER2; + break; + case 3: + mpeg1_format->fwHeadLayer = ACM_MPEG_LAYER1; + break; + }; + + gst_structure_get_int (structure, "mpegaudioversion", &version); + if (adec->layer == 1) { + samples = 384; + } else { + if (version == 1) { + samples = 576; + } else { + samples = 1152; + } + } + mpeg1_format->wfx.nBlockAlign = (WORD) samples; + mpeg1_format->wfx.nSamplesPerSec = adec->rate; + mpeg1_format->dwHeadBitrate = 128000; /* This doesn't seem to matter */ + mpeg1_format->wfx.nAvgBytesPerSec = mpeg1_format->dwHeadBitrate / 8; + } + else + { + size = sizeof (WAVEFORMATEX) + + (adec->codec_data ? gst_buffer_get_size(adec->codec_data) : 0); + + if (adec->layer == 3) { + MPEGLAYER3WAVEFORMAT *mp3format; + + /* The WinXP mp3 decoder doesn't actually check the size of this structure, + * but requires that this be allocated and filled out (or we get obscure + * random crashes) + */ + size = sizeof (MPEGLAYER3WAVEFORMAT); + mp3format = (MPEGLAYER3WAVEFORMAT *)g_malloc0 (size); + format = (WAVEFORMATEX *)mp3format; + format->cbSize = MPEGLAYER3_WFX_EXTRA_BYTES; + + mp3format->wID = MPEGLAYER3_ID_MPEG; + mp3format->fdwFlags = MPEGLAYER3_FLAG_PADDING_ISO; /* No idea what this means for a decoder */ + + /* The XP decoder divides by nBlockSize, so we must set this to a + non-zero value, but it doesn't matter what - this is meaningless + for VBR mp3 anyway */ + mp3format->nBlockSize = 1; + mp3format->nFramesPerBlock = 1; + mp3format->nCodecDelay = 0; + } + else { + format = (WAVEFORMATEX *)g_malloc0 (size); + + if (adec->codec_data) { /* Codec data is appended after our header */ + gsize codec_size = gst_buffer_get_size(adec->codec_data); + gst_buffer_extract(adec->codec_data, 0, ((guchar *) format) + sizeof (WAVEFORMATEX), + codec_size); + format->cbSize = codec_size; + } + } + + format->wFormatTag = codec_entry->format; + format->nChannels = adec->channels; + format->nSamplesPerSec = adec->rate; + format->nAvgBytesPerSec = adec->bitrate / 8; + format->nBlockAlign = adec->block_align; + format->wBitsPerSample = adec->depth; + } + + mediatype->cbFormat = size; + mediatype->pbFormat = (BYTE *) format; + + return mediatype; +} + +static AM_MEDIA_TYPE * +dshowaudiodec_set_output_format (GstDshowAudioDec *adec) +{ + AM_MEDIA_TYPE *mediatype; + WAVEFORMATEX *format; + GstDshowAudioDecClass *klass = + (GstDshowAudioDecClass *) G_OBJECT_GET_CLASS (adec); + const AudioCodecEntry *codec_entry = klass->entry; + + if (!gst_dshowaudiodec_get_filter_settings (adec)) { + return NULL; + } + + format = (WAVEFORMATEX *)g_malloc0(sizeof (WAVEFORMATEX)); + format->wFormatTag = WAVE_FORMAT_PCM; + format->wBitsPerSample = adec->depth; + format->nChannels = adec->channels; + format->nBlockAlign = adec->channels * (adec->depth / 8); + format->nSamplesPerSec = adec->rate; + format->nAvgBytesPerSec = format->nBlockAlign * adec->rate; + + mediatype = (AM_MEDIA_TYPE *)g_malloc0(sizeof (AM_MEDIA_TYPE)); + mediatype->majortype = MEDIATYPE_Audio; + GUID subtype = GUID_MEDIASUBTYPE_FROM_FOURCC (WAVE_FORMAT_PCM); + mediatype->subtype = subtype; + mediatype->bFixedSizeSamples = TRUE; + mediatype->bTemporalCompression = FALSE; + mediatype->lSampleSize = format->nBlockAlign; + mediatype->formattype = FORMAT_WaveFormatEx; + mediatype->cbFormat = sizeof (WAVEFORMATEX); + mediatype->pbFormat = (BYTE *)format; + + return mediatype; +} + +static void +dshowadec_free_mediatype (AM_MEDIA_TYPE *mediatype) +{ + g_free (mediatype->pbFormat); + g_free (mediatype); +} + +static gboolean +gst_dshowaudiodec_setup_graph (GstDshowAudioDec * adec, GstCaps *caps) +{ + gboolean ret = FALSE; + GstDshowAudioDecClass *klass = + (GstDshowAudioDecClass *) G_OBJECT_GET_CLASS (adec); + HRESULT hres; + GstCaps *outcaps = NULL; + AM_MEDIA_TYPE *output_mediatype = NULL; + AM_MEDIA_TYPE *input_mediatype = NULL; + IPinPtr output_pin = NULL; + IPinPtr input_pin = NULL; + const AudioCodecEntry *codec_entry = klass->entry; + IBaseFilterPtr srcfilter; + IBaseFilterPtr sinkfilter; + GstAudioInfo audio_info; + + input_mediatype = dshowaudiodec_set_input_format (adec, caps); + + adec->fakesrc->GetOutputPin()->SetMediaType (input_mediatype); + + srcfilter = adec->fakesrc; + + /* connect our fake source to decoder */ + output_pin = gst_dshow_util_get_pin_from_filter (srcfilter, PINDIR_OUTPUT); + if (!output_pin) { + GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, + ("Can't get output pin from our directshow fakesrc filter"), (NULL)); + goto end; + } + input_pin = gst_dshow_util_get_pin_from_filter (adec->decfilter, PINDIR_INPUT); + if (!input_pin) { + GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, + ("Can't get input pin from decoder filter"), (NULL)); + goto end; + } + + hres = adec->filtergraph->ConnectDirect (output_pin, input_pin, + NULL); + if (hres != S_OK) { + GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, + ("Can't connect fakesrc with decoder (error=%x)", hres), (NULL)); + goto end; + } + + output_mediatype = dshowaudiodec_set_output_format (adec); + if (!output_mediatype) { + GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, + ("Can't get audio output format from decoder"), (NULL)); + goto end; + } + + adec->fakesink->SetMediaType(output_mediatype); + + gst_audio_info_init(&audio_info); + gst_audio_info_set_format(&audio_info, + gst_audio_format_build_integer(TRUE, G_BYTE_ORDER, adec->depth, adec->depth), + adec->rate, adec->channels, NULL); + + outcaps = gst_audio_info_to_caps(&audio_info); + + if (!gst_pad_set_caps (adec->srcpad, outcaps)) { + GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, + ("Failed to negotiate output"), (NULL)); + goto end; + } + + /* connect the decoder to our fake sink */ + output_pin = gst_dshow_util_get_pin_from_filter (adec->decfilter, PINDIR_OUTPUT); + if (!output_pin) { + GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, + ("Can't get output pin from our decoder filter"), (NULL)); + goto end; + } + + sinkfilter = adec->fakesink; + input_pin = gst_dshow_util_get_pin_from_filter (sinkfilter, PINDIR_INPUT); + if (!input_pin) { + GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, + ("Can't get input pin from our directshow fakesink filter"), (NULL)); + goto end; + } + + hres = adec->filtergraph->ConnectDirect(output_pin, input_pin, NULL); + if (hres != S_OK) { + GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, + ("Can't connect decoder with fakesink (error=%x)", hres), (NULL)); + goto end; + } + + hres = adec->mediafilter->Run (-1); + if (hres != S_OK) { + GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, + ("Can't run the directshow graph (error=%x)", hres), (NULL)); + goto end; + } + + ret = TRUE; + adec->setup = TRUE; +end: + if (outcaps) + gst_caps_unref(outcaps); + if (input_mediatype) + dshowadec_free_mediatype (input_mediatype); + if (output_mediatype) + dshowadec_free_mediatype (output_mediatype); + + return ret; +} + +static gboolean +gst_dshowaudiodec_get_filter_settings (GstDshowAudioDec * adec) +{ + IPinPtr output_pin; + IEnumMediaTypesPtr enum_mediatypes; + HRESULT hres; + ULONG fetched; + BOOL ret = FALSE; + + if (adec->decfilter == 0) + return FALSE; + + output_pin = gst_dshow_util_get_pin_from_filter (adec->decfilter, PINDIR_OUTPUT); + if (!output_pin) { + GST_ELEMENT_ERROR (adec, CORE, NEGOTIATION, + ("failed getting output pin from the decoder"), (NULL)); + return FALSE; + } + + hres = output_pin->EnumMediaTypes (&enum_mediatypes); + if (hres == S_OK && enum_mediatypes) { + AM_MEDIA_TYPE *mediatype = NULL; + + enum_mediatypes->Reset(); + while (!ret && enum_mediatypes->Next(1, &mediatype, &fetched) == S_OK) + { + if (IsEqualGUID (mediatype->subtype, MEDIASUBTYPE_PCM) && + IsEqualGUID (mediatype->formattype, FORMAT_WaveFormatEx)) + { + WAVEFORMATEX *audio_info = (WAVEFORMATEX *) mediatype->pbFormat; + + adec->channels = audio_info->nChannels; + adec->depth = audio_info->wBitsPerSample; + adec->rate = audio_info->nSamplesPerSec; + ret = TRUE; + } + DeleteMediaType (mediatype); + } + } + + return ret; +} + +static gboolean +gst_dshowaudiodec_create_graph_and_filters (GstDshowAudioDec * adec) +{ + HRESULT hres; + GstDshowAudioDecClass *klass = + (GstDshowAudioDecClass *) G_OBJECT_GET_CLASS (adec); + IBaseFilterPtr srcfilter; + IBaseFilterPtr sinkfilter; + GUID insubtype = GUID_MEDIASUBTYPE_FROM_FOURCC (klass->entry->format); + GUID outsubtype = GUID_MEDIASUBTYPE_FROM_FOURCC (WAVE_FORMAT_PCM); + + /* create the filter graph manager object */ + hres = adec->filtergraph.CreateInstance ( + CLSID_FilterGraph, NULL, CLSCTX_INPROC); + if (FAILED (hres)) { + GST_ELEMENT_ERROR (adec, STREAM, FAILED, + ("Can't create an instance of the directshow graph manager (error=%d)", + hres), (NULL)); + goto error; + } + + hres = adec->filtergraph->QueryInterface (&adec->mediafilter); + if (FAILED (hres)) { + GST_WARNING_OBJECT (adec, "Can't QI filtergraph to mediafilter"); + goto error; + } + + /* create fake src filter */ + adec->fakesrc = new FakeSrc(); + /* Created with a refcount of zero, so increment that */ + adec->fakesrc->AddRef(); + + /* create decoder filter */ + adec->decfilter = gst_dshow_util_find_filter (MEDIATYPE_Audio, + insubtype, + MEDIATYPE_Audio, + outsubtype, + klass->entry->preferred_filters); + if (adec->decfilter == NULL) { + GST_ELEMENT_ERROR (adec, STREAM, FAILED, + ("Can't create an instance of the decoder filter"), (NULL)); + goto error; + } + + /* create fake sink filter */ + adec->fakesink = new AudioFakeSink(adec); + /* Created with a refcount of zero, so increment that */ + adec->fakesink->AddRef(); + + /* add filters to the graph */ + srcfilter = adec->fakesrc; + hres = adec->filtergraph->AddFilter (srcfilter, L"src"); + if (hres != S_OK) { + GST_ELEMENT_ERROR (adec, STREAM, FAILED, + ("Can't add fakesrc filter to the graph (error=%d)", hres), (NULL)); + goto error; + } + + hres = adec->filtergraph->AddFilter(adec->decfilter, L"decoder"); + if (hres != S_OK) { + GST_ELEMENT_ERROR (adec, STREAM, FAILED, + ("Can't add decoder filter to the graph (error=%d)", hres), (NULL)); + goto error; + } + + sinkfilter = adec->fakesink; + hres = adec->filtergraph->AddFilter(sinkfilter, L"sink"); + if (hres != S_OK) { + GST_ELEMENT_ERROR (adec, STREAM, FAILED, + ("Can't add fakesink filter to the graph (error=%d)", hres), (NULL)); + goto error; + } + + return TRUE; + +error: + if (adec->fakesrc) { + adec->fakesrc->Release(); + adec->fakesrc = NULL; + } + if (adec->fakesink) { + adec->fakesink->Release(); + adec->fakesink = NULL; + } + adec->decfilter = 0; + adec->mediafilter = 0; + adec->filtergraph = 0; + + return FALSE; +} + +static gboolean +gst_dshowaudiodec_destroy_graph_and_filters (GstDshowAudioDec * adec) +{ + if (adec->mediafilter) { + adec->mediafilter->Stop(); + } + + if (adec->fakesrc) { + if (adec->filtergraph) { + IBaseFilterPtr filter = adec->fakesrc; + adec->filtergraph->RemoveFilter(filter); + } + adec->fakesrc->Release(); + adec->fakesrc = NULL; + } + if (adec->decfilter) { + if (adec->filtergraph) + adec->filtergraph->RemoveFilter(adec->decfilter); + adec->decfilter = 0; + } + if (adec->fakesink) { + if (adec->filtergraph) { + IBaseFilterPtr filter = adec->fakesink; + adec->filtergraph->RemoveFilter(filter); + } + + adec->fakesink->Release(); + adec->fakesink = NULL; + } + adec->mediafilter = 0; + adec->filtergraph = 0; + + adec->setup = FALSE; + + return TRUE; +} + +gboolean +dshow_adec_register (GstPlugin * plugin) +{ + GTypeInfo info = { + sizeof (GstDshowAudioDecClass), + (GBaseInitFunc) gst_dshowaudiodec_base_init, + NULL, + (GClassInitFunc) gst_dshowaudiodec_class_init, + NULL, + NULL, + sizeof (GstDshowAudioDec), + 0, + (GInstanceInitFunc) gst_dshowaudiodec_init, + }; + gint i; + HRESULT hr; + + GST_DEBUG_CATEGORY_INIT (dshowaudiodec_debug, "dshowaudiodec", 0, + "Directshow filter audio decoder"); + + hr = CoInitialize(0); + for (i = 0; i < sizeof (audio_dec_codecs) / sizeof (AudioCodecEntry); i++) { + GType type; + IBaseFilterPtr filter; + GUID insubtype = GUID_MEDIASUBTYPE_FROM_FOURCC (audio_dec_codecsi.format); + GUID outsubtype = GUID_MEDIASUBTYPE_FROM_FOURCC (WAVE_FORMAT_PCM); + + filter = gst_dshow_util_find_filter (MEDIATYPE_Audio, + insubtype, + MEDIATYPE_Audio, + outsubtype, + audio_dec_codecsi.preferred_filters); + + if (filter) + { + GST_DEBUG ("Registering %s", audio_dec_codecsi.element_name); + + type = g_type_register_static (GST_TYPE_ELEMENT, + audio_dec_codecsi.element_name, &info, (GTypeFlags)0); + g_type_set_qdata (type, DSHOW_CODEC_QDATA, (gpointer) (audio_dec_codecs + i)); + if (!gst_element_register (plugin, audio_dec_codecsi.element_name, + GST_RANK_MARGINAL, type)) { + return FALSE; + } + GST_CAT_DEBUG (dshowaudiodec_debug, "Registered %s", + audio_dec_codecsi.element_name); + } + else { + GST_DEBUG ("Element %s not registered " + "(the format is not supported by the system)", + audio_dec_codecsi.element_name); + } + } + + if (SUCCEEDED(hr)) + CoUninitialize (); + + return TRUE; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowaudiodec.h
Added
@@ -0,0 +1,160 @@ +/* + * GStreamer DirectShow codecs wrapper + * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com> + * Copyright <2006, 2007, 2008> Pioneers of the Inevitable <songbird@songbirdnest.com> + * Copyright <2007,2008> Sebastien Moutte <sebastien@moutte.net> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + + +#ifndef __GST_DSHOWAUDIODEC_H__ +#define __GST_DSHOWAUDIODEC_H__ + +#include <gst/gst.h> +#include "gstdshowutil.h" +#include "gstdshowfakesrc.h" + +G_BEGIN_DECLS + +typedef struct { + gchar *element_name; /* The gst element factory name */ + gchar *element_longname; /* Description string for element */ + unsigned long format; /* WAVEFORMATEX format */ + gchar *sinkcaps; /* GStreamer caps of input format */ + PreferredFilter *preferred_filters; /* NULL-terminated list of preferred filters */ +} AudioCodecEntry; + +#define GST_TYPE_DSHOWAUDIODEC (gst_dshowaudiodec_get_type()) +#define GST_DSHOWAUDIODEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DSHOWAUDIODEC,GstDshowAudioDec)) +#define GST_DSHOWAUDIODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DSHOWAUDIODEC,GstDshowAudioDecClass)) +#define GST_IS_DSHOWAUDIODEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DSHOWAUDIODEC)) +#define GST_IS_DSHOWAUDIODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DSHOWAUDIODEC)) + +typedef struct _GstDshowAudioDec GstDshowAudioDec; +typedef struct _GstDshowAudioDecClass GstDshowAudioDecClass; + +class AudioFakeSink; + +struct _GstDshowAudioDec +{ + GstElement element; + + /* element pads */ + GstPad *sinkpad; + GstPad *srcpad; + + GstFlowReturn last_ret; + + /* filters interfaces*/ + FakeSrc *fakesrc; + AudioFakeSink *fakesink; + + IBaseFilterPtr decfilter; + + /* graph manager interfaces */ + IMediaFilterPtr mediafilter; + IFilterGraphPtr filtergraph; + + /* true when dshow graph is setup */ + gboolean setup; + + /* audio settings */ + gint bitrate; + gint block_align; + gint depth; + gint channels; + gint rate; + gint layer; + GstBuffer *codec_data; + + /* current segment */ + GstSegment * segment; + + /* timestamp of the next buffer */ + GstClockTime timestamp; + + gboolean comInitialized; + GMutex com_init_lock; + GMutex com_deinit_lock; + GCond com_initialized; + GCond com_uninitialize; + GCond com_uninitialized; +}; + +struct _GstDshowAudioDecClass +{ + GstElementClass parent_class; + const AudioCodecEntry *entry; +}; + +gboolean dshow_adec_register (GstPlugin * plugin); + +const GUID CLSID_AudioFakeSink = +{ 0x3867f537, 0x3e3d, 0x44da, + { 0xbb, 0xf2, 0x02, 0x48, 0x7b, 0xb0, 0xbc, 0xc4} }; + +class AudioFakeSink : public CBaseRenderer +{ +public: + AudioFakeSink(GstDshowAudioDec *dec) : + m_hres(S_OK), + CBaseRenderer(CLSID_AudioFakeSink, _T("AudioFakeSink"), NULL, &m_hres), + mDec(dec) + {}; + virtual ~AudioFakeSink() {}; + + HRESULT DoRenderSample(IMediaSample *pMediaSample); + HRESULT CheckMediaType(const CMediaType *pmt); + HRESULT SetMediaType (AM_MEDIA_TYPE *pmt) + { + m_MediaType.Set (*pmt); + return S_OK; + } + int GetBufferSize(); + +protected: + HRESULT m_hres; + CMediaType m_MediaType; + GstDshowAudioDec *mDec; +}; + +G_END_DECLS + +#endif /* __GST_DSHOWAUDIODEC_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowaudiosrc.cpp
Changed
(renamed from sys/dshowsrcwrapper/gstdshowaudiosrc.cpp)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowaudiosrc.h
Added
@@ -0,0 +1,85 @@ +/* GStreamer + * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> + * + * gstdshowaudiosrc.h: + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + + +#ifndef __GST_DSHOWAUDIOSRC_H__ +#define __GST_DSHOWAUDIOSRC_H__ + +#include <gst/gst.h> +#include <gst/audio/gstaudiosrc.h> + +#include "gstdshow.h" +#include "gstdshowfakesink.h" + +G_BEGIN_DECLS +#define GST_TYPE_DSHOWAUDIOSRC (gst_dshowaudiosrc_get_type()) +#define GST_DSHOWAUDIOSRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DSHOWAUDIOSRC,GstDshowAudioSrc)) +#define GST_DSHOWAUDIOSRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DSHOWAUDIOSRC,GstDshowAudioSrcClass)) +#define GST_IS_DSHOWAUDIOSRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DSHOWAUDIOSRC)) +#define GST_IS_DSHOWAUDIOSRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DSHOWAUDIOSRC)) +typedef struct _GstDshowAudioSrc GstDshowAudioSrc; +typedef struct _GstDshowAudioSrcClass GstDshowAudioSrcClass; + +struct _GstDshowAudioSrc +{ + GstAudioSrc src; + + /* device dshow reference (generally classid/name) */ + gchar *device; + + /* device friendly name */ + gchar *device_name; + + /* device index */ + gint device_index; + + /* list of caps created from the list of supported media types of the dshow capture filter */ + GstCaps *caps; + + /* list of dshow media types filter's pins mediatypes */ + GList *pins_mediatypes; + + /* dshow audio capture filter */ + IBaseFilter *audio_cap_filter; + + /* dshow fakesink filter */ + CDshowFakeSink *dshow_fakesink; + + /* graph manager interfaces */ + IMediaFilter *media_filter; + IFilterGraph *filter_graph; + + /* bytes array */ + GByteArray *gbarray; + GMutex gbarray_lock; + + gboolean is_running; +}; + +struct _GstDshowAudioSrcClass +{ + GstAudioSrcClass parent_class; +}; + +GType gst_dshowaudiosrc_get_type (void); + +G_END_DECLS +#endif /* __GST_DSHOWAUDIOSRC_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowfakesink.cpp
Changed
(renamed from sys/dshowsrcwrapper/gstdshowfakesink.cpp)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowfakesink.h
Changed
(renamed from sys/dshowsrcwrapper/gstdshowfakesink.h)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowfakesrc.cpp
Added
@@ -0,0 +1,179 @@ +/* GStreamer + * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com> + * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> + * + * gstdshowfakesrc.cpp: + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "gstdshowfakesrc.h" + +GST_DEBUG_CATEGORY_EXTERN (dshowdec_debug); +#define GST_CAT_DEFAULT dshowdec_debug + +const GUID CLSID_DecodeFakeSrc = +{ 0x039527db, 0x6b48, 0x45a7, { 0xab, 0xcf, 0x21, 0xab, 0xc5, 0x44, 0xbb, 0xb6} }; + +static CCritSec g_pCriticSec; + +/* output pin*/ +FakeOutputPin::FakeOutputPin (CBaseFilter *pFilter, CCritSec *sec): + CBaseOutputPin("FakeOutputPin", pFilter, sec, &m_hres, L"output") +{ +} + +FakeOutputPin::~FakeOutputPin() +{ +} + +HRESULT FakeOutputPin::GetMediaType(int iPosition, + CMediaType *pMediaType) +{ + if(iPosition == 0) { + *pMediaType = m_MediaType; + return S_OK; + } + + return VFW_S_NO_MORE_ITEMS; +} +#if 0 +#define GUID_FORMAT "0x%.8x 0x%.4x 0x%.4x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x" +#define GUID_ARGS(g) g.Data1, g.Data2, g.Data3, \ + g.Data40, g.Data41, g.Data42, g.Data43, \ + g.Data44, g.Data45, g.Data46, g.Data47 + +static void printMediaType (AM_MEDIA_TYPE *mt) +{ + GST_DEBUG (":: majortype: "GUID_FORMAT, GUID_ARGS(mt->majortype)); + GST_DEBUG (":: subtype: "GUID_FORMAT, GUID_ARGS(mt->subtype)); + + GST_DEBUG (":: bFixedSizeSamples: %d", mt->bFixedSizeSamples); + GST_DEBUG (":: bTemporalCompression: %d", mt->bTemporalCompression); + GST_DEBUG (":: cbFormat: %d", mt->cbFormat); + GST_DEBUG (":: formattype: %x", mt->formattype); + GST_DEBUG (":: lSampleSize: %lu", mt->lSampleSize); + GST_DEBUG (":: pbFormat: %p", mt->pbFormat); +} +#endif + +HRESULT FakeOutputPin::CheckMediaType(const CMediaType *pmt) +{ + if (m_MediaType == *pmt) { + return S_OK; + } + + return S_FALSE; +} + +HRESULT FakeOutputPin::DecideBufferSize (IMemAllocator *pAlloc, + ALLOCATOR_PROPERTIES *ppropInputRequest) +{ + ALLOCATOR_PROPERTIES properties; + ppropInputRequest->cbBuffer = m_SampleSize; + ppropInputRequest->cBuffers = 1; + HRESULT hres = pAlloc->SetProperties(ppropInputRequest, &properties); + pAlloc->Commit(); + + return S_OK; +} + +STDMETHODIMP FakeOutputPin::SetMediaType (AM_MEDIA_TYPE *pmt) +{ + m_MediaType.Set (*pmt); + m_SampleSize = m_MediaType.GetSampleSize(); + return S_OK; +} + +STDMETHODIMP FakeOutputPin::PushBuffer(byte *buffer, + __int64 start, __int64 stop, + unsigned int size, bool discont) +{ + IMediaSample *pSample = NULL; + + if (start != -1) { + start /= 100; + stop /= 100; + } + + HRESULT hres = GetDeliveryBuffer(&pSample, NULL, NULL, 0); + if (hres == S_OK && pSample) + { + BYTE *sample_buffer; + pSample->GetPointer(&sample_buffer); + if(sample_buffer) + { + memcpy (sample_buffer, buffer, size); + pSample->SetActualDataLength(size); + } + pSample->SetDiscontinuity(discont); + + pSample->SetSyncPoint(TRUE); + pSample->SetPreroll(FALSE); + + if (start != -1) + pSample->SetTime(&start, &stop); + + hres = Deliver(pSample); + pSample->Release(); + } + else { + GST_WARNING ("unable to obtain a delivery buffer"); + } + + return S_OK; +} + +STDMETHODIMP FakeOutputPin::Flush () +{ + DeliverBeginFlush(); + DeliverEndFlush(); + return S_OK; +} + +STDMETHODIMP FakeOutputPin::SetSampleSize (unsigned int size) +{ + m_SampleSize = size; + return S_OK; +} + +/* filter */ +FakeSrc::FakeSrc() : + CBaseFilter("DshowFakeSink", NULL, &g_pCriticSec, CLSID_DecodeFakeSrc) +{ + m_pOutputPin = new FakeOutputPin((CSource *)this, m_pLock); +} + +FakeSrc::~FakeSrc() +{ + if (m_pOutputPin) + delete m_pOutputPin; +} + +int FakeSrc::GetPinCount() +{ + return 1; +} + +CBasePin *FakeSrc::GetPin(int n) +{ + return (CBasePin *)m_pOutputPin; +} + +FakeOutputPin *FakeSrc::GetOutputPin() +{ + return m_pOutputPin; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowfakesrc.h
Added
@@ -0,0 +1,65 @@ +/* GStreamer + * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> + * + * gstdshowfakesrc.h: + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +#ifndef _DSHOWDECWRAPPER_FAKESRC_H_ +#define _DSHOWDECWRAPPER_FAKESRC_H_ + +#include <gst/gst.h> +#include "gstdshowutil.h" + +class FakeOutputPin : public CBaseOutputPin +{ +protected: +/* members */ + HRESULT m_hres; + CMediaType m_MediaType; + unsigned int m_SampleSize; + +public: +/* methods */ + FakeOutputPin (CBaseFilter *pFilter, CCritSec *sec); + ~FakeOutputPin (); + + virtual HRESULT CheckMediaType(const CMediaType *pmt); + HRESULT GetMediaType(int iPosition, CMediaType *pMediaType); + virtual HRESULT DecideBufferSize (IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest); + STDMETHOD (SetMediaType) (AM_MEDIA_TYPE *pmt); + STDMETHOD (PushBuffer) (byte *buffer, __int64 start, __int64 stop, unsigned int size, bool discont); + STDMETHOD (Flush) (); + STDMETHOD (SetSampleSize) (unsigned int size); +}; + +class FakeSrc : public CBaseFilter +{ +public: +/* members */ + FakeOutputPin *m_pOutputPin; + +/* methods */ + FakeSrc (); + virtual ~FakeSrc (); + + virtual int GetPinCount(); + virtual CBasePin *GetPin(int n); + + FakeOutputPin *GetOutputPin(); +}; + +#endif // _DSHOWDECWRAPPER_FAKESRC_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowutil.cpp
Added
@@ -0,0 +1,138 @@ +/* GStreamer + * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> + * + * gstdshow.cpp: + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include <dmodshow.h> +#include <dmoreg.h> + +#include "gstdshowutil.h" +#include "gstdshowfakesrc.h" + +_COM_SMARTPTR_TYPEDEF(IDMOWrapperFilter, __uuidof(IDMOWrapperFilter)); + +IPin * +gst_dshow_util_get_pin_from_filter (IBaseFilter *filter, PIN_DIRECTION pindir) +{ + IEnumPinsPtr enumpins; + IPinPtr pin; + HRESULT hres; + + hres = filter->EnumPins (&enumpins); + if (FAILED(hres)) { + return NULL; + } + + while (enumpins->Next (1, &pin, NULL) == S_OK) + { + PIN_DIRECTION pindirtmp; + hres = pin->QueryDirection (&pindirtmp); + if (hres == S_OK && pindir == pindirtmp) { + return pin; + } + pin.Release(); + } + + return NULL; +} + +IBaseFilter * +gst_dshow_util_find_filter(CLSID input_majortype, CLSID input_subtype, + CLSID output_majortype, CLSID output_subtype, + PreferredFilter *preferred_filters) +{ + HRESULT hres; + GUID inTypes2; + GUID outTypes2; + IFilterMapper2Ptr mapper; + IEnumMonikerPtr enum_moniker; + IMonikerPtr moniker; + ULONG fetched; + IBaseFilter *filter; + + /* First, see if any of our preferred filters is available. + * If not, we fall back to the highest-ranked installed filter */ + if (preferred_filters) { + while (preferred_filters->filter_guid) + { + /* If the filter is a DMO, we need to do this a bit differently */ + if (preferred_filters->dmo_category) + { + IDMOWrapperFilterPtr wrapper; + + hres = CoCreateInstance (CLSID_DMOWrapperFilter, NULL, + CLSCTX_INPROC, + IID_IBaseFilter, (void **)&filter); + if (SUCCEEDED(hres)) { + hres = filter->QueryInterface (&wrapper); + if (SUCCEEDED(hres)) { + hres = wrapper->Init (*preferred_filters->filter_guid, + *preferred_filters->dmo_category); + if (SUCCEEDED(hres)) + return filter; + } + filter->Release(); + } + } + else + { + hres = CoCreateInstance (*preferred_filters->filter_guid, + NULL, CLSCTX_INPROC, + IID_IBaseFilter, (void **)&filter); + if (SUCCEEDED(hres)) + return filter; + } + + /* Continue to the next filter */ + preferred_filters++; + } + } + + hres = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC, + IID_IFilterMapper2, (void **) &mapper); + if (FAILED(hres)) + return NULL; + + inTypes0 = input_majortype; + inTypes1 = input_subtype; + outTypes0 = output_majortype; + outTypes1 = output_subtype; + + hres = mapper->EnumMatchingFilters (&enum_moniker, 0, + FALSE, MERIT_DO_NOT_USE+1, + TRUE, 1, inTypes, NULL, NULL, FALSE, + TRUE, 1, outTypes, NULL, NULL); + if (FAILED(hres)) + return NULL; + + enum_moniker->Reset (); + + while(enum_moniker->Next (1, &moniker, &fetched) == S_OK) + { + hres = moniker->BindToObject(NULL, NULL, + IID_IBaseFilter, (void**)&filter); + if(SUCCEEDED(hres)) { + return filter; + } + moniker.Release (); + } + + return NULL; +} +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowutil.h
Added
@@ -0,0 +1,64 @@ +/* GStreamer + * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com> + * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> + * + * gstdshow.h: + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef _GST_DSHOW_UTIL_H_ +#define _GST_DSHOW_UTIL_H_ + +#include <windows.h> +#include <tchar.h> +#include <comdef.h> +#include <objbase.h> +#include <dshow.h> +#include <Rpc.h> +#include <streams.h> +#include <strmif.h> + +#include <glib.h> + +_COM_SMARTPTR_TYPEDEF(IBaseFilter, __uuidof(IBaseFilter)); +_COM_SMARTPTR_TYPEDEF(IFilterGraph, __uuidof(IFilterGraph)); +_COM_SMARTPTR_TYPEDEF(IFilterMapper2, __uuidof(IFilterMapper2)); +_COM_SMARTPTR_TYPEDEF(IEnumMediaTypes, __uuidof(IEnumMediaTypes)); +_COM_SMARTPTR_TYPEDEF(IEnumMoniker, __uuidof(IEnumMoniker)); +_COM_SMARTPTR_TYPEDEF(IEnumPins, __uuidof(IEnumPins)); +_COM_SMARTPTR_TYPEDEF(IMediaFilter, __uuidof(IMediaFilter)); +_COM_SMARTPTR_TYPEDEF(IMoniker, __uuidof(IMoniker)); +_COM_SMARTPTR_TYPEDEF(IPin, __uuidof(IPin)); + +typedef struct { + const GUID *filter_guid; /* The filter GUID, or DMO GUID */ + const GUID *dmo_category; /* If non-NULL, the filter is a DMO of this + category */ +} PreferredFilter; + +/* get a pin from directshow filter */ +IPin *gst_dshow_util_get_pin_from_filter (IBaseFilter *filter, PIN_DIRECTION pindir); + +/* find and return a filter according to the input and output types */ +IBaseFilter * +gst_dshow_util_find_filter(CLSID input_majortype, CLSID input_subtype, + CLSID output_majortype, CLSID output_subtype, + PreferredFilter *preferred_filters); + +#define DSHOW_CODEC_QDATA g_quark_from_string ("dshow-codec") + +#endif /* _GST_DSHOW_UTIL_H_ */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowvideodec.cpp
Added
@@ -0,0 +1,1352 @@ +/* + * GStreamer DirectShow codecs wrapper + * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com> + * Copyright <2006, 2007, 2008> Pioneers of the Inevitable <songbird@songbirdnest.com> + * Copyright <2007,2008> Sebastien Moutte <sebastien@moutte.net> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <dmoreg.h> +#include <wmcodecdsp.h> + +#include "gstdshowvideodec.h" +#include <gst/video/video.h> + +GST_DEBUG_CATEGORY_STATIC (dshowvideodec_debug); +#define GST_CAT_DEFAULT dshowvideodec_debug + +#define gst_dshowvideodec_parent_class parent_class +G_DEFINE_TYPE(GstDshowVideoDec, gst_dshowvideodec, GST_TYPE_ELEMENT) + +static void gst_dshowvideodec_finalize (GObject * object); +static GstStateChangeReturn gst_dshowvideodec_change_state + (GstElement * element, GstStateChange transition); + +/* sink pad overwrites */ +static gboolean gst_dshowvideodec_sink_setcaps (GstPad * pad, GstCaps * caps); +static gboolean gst_dshowvideodec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event); +static GstFlowReturn gst_dshowvideodec_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer); + +/* src pad overwrites */ +static GstCaps *gst_dshowvideodec_src_getcaps (GstPad * pad); +static gboolean gst_dshowvideodec_src_setcaps (GstPad * pad, GstCaps * caps); + +/* utils */ +static gboolean gst_dshowvideodec_create_graph_and_filters (GstDshowVideoDec * + vdec); +static gboolean gst_dshowvideodec_destroy_graph_and_filters (GstDshowVideoDec * + vdec); +static gboolean gst_dshowvideodec_flush (GstDshowVideoDec * adec); +static gboolean gst_dshowvideodec_get_filter_output_format (GstDshowVideoDec * + vdec, const GUID subtype, VIDEOINFOHEADER ** format, guint * size); + + +#define GUID_MEDIATYPE_VIDEO {0x73646976, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_WMVV1 {0x31564d57, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_WMVV2 {0x32564d57, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_WMVV3 {0x33564d57, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_WMVP {0x50564d57, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_WMVA {0x41564d57, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_WVC1 {0x31435657, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_CVID {0x64697663, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_MP4S {0x5334504d, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_MP42 {0x3234504d, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_MP43 {0x3334504d, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_M4S2 {0x3253344d, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_XVID {0x44495658, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_DX50 {0x30355844, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_DIVX {0x58564944, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_DIV3 {0x33564944, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} + +#define GUID_MEDIASUBTYPE_MPG4 {0x3447504d, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_MPEG1Payload {0xe436eb81, 0x524f, 0x11ce, {0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}} + + +/* output types */ +#define GUID_MEDIASUBTYPE_YUY2 {0x32595559, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_YV12 {0x32315659, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }} +#define GUID_MEDIASUBTYPE_RGB32 {0xe436eb7e, 0x524f, 0x11ce, { 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 }} +#define GUID_MEDIASUBTYPE_RGB565 {0xe436eb7b, 0x524f, 0x11ce, { 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 }} + +/* WMV always uses the WMV DMO */ +static PreferredFilter preferred_wmv_filters = { + {&CLSID_CWMVDecMediaObject, &DMOCATEGORY_VIDEO_DECODER}, {0} +}; + +static const GUID CLSID_AVI_DECOMPRESSOR = + {0xCF49D4E0, 0x1115, 0x11CE, + {0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}}; +static PreferredFilter preferred_cinepack_filters = { + {&CLSID_AVI_DECOMPRESSOR}, {0} +}; + +/* Various MPEG-4 video variants */ +// MPG4, mpg4, MP42, mp42 +static PreferredFilter preferred_mpeg4_filters = { + {&CLSID_CMpeg4DecMediaObject, &DMOCATEGORY_VIDEO_DECODER}, {0}}; +// MP4S, mp4s, M4S2, m4s2 +static PreferredFilter preferred_mp4s_filters = { + {&CLSID_CMpeg4sDecMediaObject, &DMOCATEGORY_VIDEO_DECODER}, {0}}; +// MP43, mp43 +static PreferredFilter preferred_mp43_filters = { + {&CLSID_CMpeg43DecMediaObject, &DMOCATEGORY_VIDEO_DECODER}, {0}}; + +static const GUID CLSID_MPEG_VIDEO_DECODER = + {0xFEB50740, 0x7BEF, 0x11CE, + {0x9B, 0xD9, 0x00, 0x00, 0xE2, 0x02, 0x59, 0x9C}}; +static PreferredFilter preferred_mpeg1_filters = { + {&CLSID_MPEG_VIDEO_DECODER}, {0} +}; + +/* video codecs array */ +static const VideoCodecEntry video_dec_codecs = { + {"dshowvdec_wmv1", "Windows Media Video 7", + GST_MAKE_FOURCC ('W', 'M', 'V', '1'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WMVV1, + "video/x-wmv, wmvversion = (int) 1", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2"), + preferred_wmv_filters}, + + {"dshowvdec_wmv2", "Windows Media Video 8", + GST_MAKE_FOURCC ('W', 'M', 'V', '2'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WMVV2, + "video/x-wmv, wmvversion = (int) 2", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2"), + preferred_wmv_filters}, + + {"dshowvdec_wmv3", "Windows Media Video 9", + GST_MAKE_FOURCC ('W', 'M', 'V', '3'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WMVV3, + "video/x-wmv, wmvversion = (int) 3, " "format = (string) WMV3", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2"), + preferred_wmv_filters}, + + {"dshowvdec_wmvp", "Windows Media Video 9 Image", + GST_MAKE_FOURCC ('W', 'M', 'V', 'P'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WMVP, + "video/x-wmv, wmvversion = (int) 3, " "format = (string) { WMVP, MSS1 }", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2"), + preferred_wmv_filters}, + + {"dshowvdec_wmva", "Windows Media Video 9 Advanced", + GST_MAKE_FOURCC ('W', 'M', 'V', 'A'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WMVA, + "video/x-wmv, wmvversion = (int) 3, " "format = (string) WMVA", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2"), + preferred_wmv_filters}, + + {"dshowvdec_wvc1", "Windows Media VC1 video", + GST_MAKE_FOURCC ('W', 'V', 'C', '1'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_WVC1, + "video/x-wmv, wmvversion = (int) 3, " "format = (string) WVC1", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2"), + preferred_wmv_filters}, + + {"dshowvdec_cinepak", "Cinepack", + 0x64697663, + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_CVID, + "video/x-cinepak", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_RGB32, + "video/x-raw, format=(string)RGB, bpp=(int)32, depth=(int)24, " + "endianness=(int)4321, red_mask=(int)65280, " + "green_mask=(int)16711680, blue_mask=(int)-16777216", + preferred_cinepack_filters}, + + {"dshowvdec_msmpeg41", "Microsoft ISO MPEG-4 version 1", + GST_MAKE_FOURCC ('M', 'P', '4', 'S'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_MP4S, + "video/x-msmpeg, msmpegversion=(int)41", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2"), + preferred_mp4s_filters}, + + {"dshowvdec_msmpeg42", "Microsoft ISO MPEG-4 version 2", + GST_MAKE_FOURCC ('M', 'P', '4', '2'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_MP42, + "video/x-msmpeg, msmpegversion=(int)42", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2"), + preferred_mpeg4_filters}, + + {"dshowvdec_msmpeg43", "Microsoft ISO MPEG-4 version 3", + GST_MAKE_FOURCC ('M', 'P', '4', '3'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_MP43, + "video/x-msmpeg, msmpegversion=(int)43", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2"), + preferred_mp43_filters}, + + {"dshowvdec_msmpeg4", "Microsoft ISO MPEG-4 version 1.1", + GST_MAKE_FOURCC ('M', '4', 'S', '2'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_M4S2, + "video/x-msmpeg, msmpegversion=(int)4", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2"), + preferred_mp4s_filters}, + + {"dshowvdec_mpeg1", + "MPEG-1 Video", + GST_MAKE_FOURCC ('M', 'P', 'E', 'G'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_MPEG1Payload, + "video/mpeg, mpegversion= (int) 1, " + "parsed= (boolean) true, " "systemstream= (boolean) false", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2"), + preferred_mpeg1_filters}, + + {"dshowvdec_mpeg4", "MPEG-4 Video", + GST_MAKE_FOURCC ('M', 'P', 'G', '4'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_MPG4, + "video/mpeg, msmpegversion=(int)4", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2"), + preferred_mpeg4_filters}, + + /* The rest of these have no preferred filter; windows doesn't come + * with anything appropriate */ + {"dshowvdec_xvid", "XVID Video", + GST_MAKE_FOURCC ('X', 'V', 'I', 'D'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_XVID, + "video/x-xvid", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2")}, + + {"dshowvdec_divx5", "DIVX 5.0 Video", + GST_MAKE_FOURCC ('D', 'X', '5', '0'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_DX50, + "video/x-divx, divxversion=(int)5", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2")}, + + {"dshowvdec_divx4", "DIVX 4.0 Video", + GST_MAKE_FOURCC ('D', 'I', 'V', 'X'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_DIVX, + "video/x-divx, divxversion=(int)4", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2")}, + + {"dshowvdec_divx3", "DIVX 3.0 Video", + GST_MAKE_FOURCC ('D', 'I', 'V', '3'), + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_MP43, + "video/x-divx, divxversion=(int)3", + GUID_MEDIATYPE_VIDEO, GUID_MEDIASUBTYPE_YUY2, + GST_VIDEO_CAPS_MAKE("YUY2")} +}; + +HRESULT VideoFakeSink::DoRenderSample(IMediaSample *pMediaSample) +{ + gboolean in_seg = FALSE; + guint64 clip_start = 0, clip_stop = 0; + GstDshowVideoDecClass *klass = + (GstDshowVideoDecClass *) G_OBJECT_GET_CLASS (mDec); + GstBuffer *buf = NULL; + GstClockTime start, stop; + GstMapInfo map; + + if(pMediaSample) + { + BYTE *pBuffer = NULL; + LONGLONG lStart = 0, lStop = 0; + long size = pMediaSample->GetActualDataLength(); + + pMediaSample->GetPointer(&pBuffer); + pMediaSample->GetTime(&lStart, &lStop); + + start = lStart * 100; + stop = lStop * 100; + /* check if this buffer is in our current segment */ + in_seg = gst_segment_clip (mDec->segment, GST_FORMAT_TIME, + start, stop, &clip_start, &clip_stop); + + /* if the buffer is out of segment do not push it downstream */ + if (!in_seg) { + GST_DEBUG_OBJECT (mDec, + "buffer is out of segment, start %" GST_TIME_FORMAT " stop %" + GST_TIME_FORMAT, GST_TIME_ARGS (start), GST_TIME_ARGS (stop)); + goto done; + } + + /* buffer is in our segment, allocate a new out buffer and clip its + * timestamps */ + gst_buffer_pool_acquire_buffer(mDec->buffer_pool, &buf, NULL); + if (!buf) { + GST_WARNING_OBJECT (mDec, + "cannot allocate a new GstBuffer"); + goto done; + } + + /* set buffer properties */ + GST_BUFFER_TIMESTAMP (buf) = clip_start; + GST_BUFFER_DURATION (buf) = clip_stop - clip_start; + + gst_buffer_map(buf, &map, GST_MAP_WRITE); + if (strstr (klass->entry->srccaps, "rgb")) { + /* FOR RGB directshow decoder will return bottom-up BITMAP + * There is probably a way to get top-bottom video frames from + * the decoder... + */ + gint line = 0; + guint stride = mDec->width * 4; + + for (; line < mDec->height; line++) { + memcpy (map.data + (line * stride), + pBuffer + (size - ((line + 1) * (stride))), stride); + } + } else { + memcpy (map.data, pBuffer, MIN ((unsigned int)size, map.size)); + } + gst_buffer_unmap(buf, &map); + + GST_LOG_OBJECT (mDec, + "push_buffer (size %d)=> pts %" GST_TIME_FORMAT " stop %" GST_TIME_FORMAT + " duration %" GST_TIME_FORMAT, size, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (buf))); + + /* push the buffer downstream */ + mDec->last_ret = gst_pad_push (mDec->srcpad, buf); + } +done: + + return S_OK; +} + +HRESULT VideoFakeSink::CheckMediaType(const CMediaType *pmt) +{ + if (pmt != NULL) { + if (*pmt == m_MediaType) + return S_OK; + } + + return S_FALSE; +} + +static void +gst_dshowvideodec_base_init (gpointer klass) +{ + GstDshowVideoDecClass *videodec_class = (GstDshowVideoDecClass *) klass; + GstPadTemplate *src, *sink; + GstCaps *srccaps, *sinkcaps; + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + const VideoCodecEntry *tmp; + gpointer qdata; + gchar *longname, *description; + + qdata = g_type_get_qdata (G_OBJECT_CLASS_TYPE (klass), DSHOW_CODEC_QDATA); + + /* element details */ + tmp = videodec_class->entry = (VideoCodecEntry *) qdata; + + longname = g_strdup_printf ("DirectShow %s Decoder Wrapper", + tmp->element_longname); + description = g_strdup_printf ("DirectShow %s Decoder Wrapper", + tmp->element_longname); + + gst_element_class_set_metadata(element_class, longname, "Codec/Decoder/Video", description, + "Sebastien Moutte <sebastien@moutte.net>"); + + g_free (longname); + g_free (description); + + sinkcaps = gst_caps_from_string (tmp->sinkcaps); + gst_caps_set_simple (sinkcaps, + "width", GST_TYPE_INT_RANGE, 16, 4096, + "height", GST_TYPE_INT_RANGE, 16, 4096, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); + + srccaps = gst_caps_from_string (tmp->srccaps); + + sink = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, sinkcaps); + src = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, srccaps); + + gst_element_class_add_pad_template (element_class, src); + gst_element_class_add_pad_template (element_class, sink); + + if (sinkcaps) + gst_caps_unref(sinkcaps); + + if (srccaps) + gst_caps_unref(srccaps); +} + +static void +gst_dshowvideodec_class_init (GstDshowVideoDecClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); + + gobject_class->finalize = gst_dshowvideodec_finalize; + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_dshowvideodec_change_state); + + parent_class = (GstElementClass *) g_type_class_peek_parent (klass); +} + +static void +gst_dshowvideodec_com_thread (GstDshowVideoDec * vdec) +{ + HRESULT res; + + g_mutex_lock (&vdec->com_init_lock); + + /* Initialize COM with a MTA for this process. This thread will + * be the first one to enter the apartement and the last one to leave + * it, unitializing COM properly */ + + res = CoInitializeEx (0, COINIT_MULTITHREADED); + if (res == S_FALSE) + GST_WARNING_OBJECT (vdec, "COM has been already initialized in the same process"); + else if (res == RPC_E_CHANGED_MODE) + GST_WARNING_OBJECT (vdec, "The concurrency model of COM has changed."); + else + GST_INFO_OBJECT (vdec, "COM initialized successfully"); + + vdec->comInitialized = TRUE; + + /* Signal other threads waiting on this condition that COM was initialized */ + g_cond_signal (&vdec->com_initialized); + + g_mutex_unlock (&vdec->com_init_lock); + + /* Wait until the uninitialize condition is met to leave the COM apartement */ + g_mutex_lock (&vdec->com_deinit_lock); + g_cond_wait (&vdec->com_uninitialize, &vdec->com_deinit_lock); + + CoUninitialize (); + GST_INFO_OBJECT (vdec, "COM uninitialized successfully"); + vdec->comInitialized = FALSE; + g_cond_signal (&vdec->com_uninitialized); + g_mutex_unlock (&vdec->com_deinit_lock); +} + +static void +gst_dshowvideodec_init (GstDshowVideoDec * vdec) +{ + GstElementClass *element_class = GST_ELEMENT_GET_CLASS (vdec); + + /* setup pads */ + vdec->sinkpad = + gst_pad_new_from_template (gst_element_class_get_pad_template + (element_class, "sink"), "sink"); + + gst_pad_set_event_function (vdec->sinkpad, gst_dshowvideodec_sink_event); + gst_pad_set_chain_function (vdec->sinkpad, gst_dshowvideodec_chain); + gst_element_add_pad (GST_ELEMENT (vdec), vdec->sinkpad); + + vdec->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template + (element_class, "src"), "src"); +/* needed to implement caps negotiation on our src pad */ +/* gst_pad_set_getcaps_function (vdec->srcpad, gst_dshowvideodec_src_getcaps); + gst_pad_set_setcaps_function (vdec->srcpad, gst_dshowvideodec_src_setcaps);*/ + gst_element_add_pad (GST_ELEMENT (vdec), vdec->srcpad); + + vdec->fakesrc = NULL; + vdec->fakesink = NULL; + vdec->decfilter = NULL; + + vdec->last_ret = GST_FLOW_OK; + + vdec->filtergraph = NULL; + vdec->mediafilter = NULL; + vdec->srccaps = NULL; + vdec->segment = gst_segment_new (); + + vdec->setup = FALSE; + vdec->buffer_pool = NULL; + + g_mutex_init (&vdec->com_init_lock); + g_mutex_init (&vdec->com_deinit_lock); + g_cond_init (&vdec->com_initialized); + g_cond_init (&vdec->com_uninitialize); + g_cond_init (&vdec->com_uninitialized); + + g_mutex_lock (&vdec->com_init_lock); + + /* create the COM initialization thread */ + g_thread_new ("COM Init Thread", (GThreadFunc)gst_dshowvideodec_com_thread, + vdec); + + /* wait until the COM thread signals that COM has been initialized */ + g_cond_wait (&vdec->com_initialized, &vdec->com_init_lock); + g_mutex_unlock (&vdec->com_init_lock); +} + +static void +gst_dshowvideodec_finalize (GObject * object) +{ + GstDshowVideoDec *vdec = (GstDshowVideoDec *) (object); + + if (vdec->segment) { + gst_segment_free (vdec->segment); + vdec->segment = NULL; + } + + if(vdec->buffer_pool) { + gst_object_unref(vdec->buffer_pool); + vdec->buffer_pool = NULL; + } + + /* signal the COM thread that it sould uninitialize COM */ + if (vdec->comInitialized) { + g_mutex_lock (&vdec->com_deinit_lock); + g_cond_signal (&vdec->com_uninitialize); + g_cond_wait (&vdec->com_uninitialized, &vdec->com_deinit_lock); + g_mutex_unlock (&vdec->com_deinit_lock); + } + + g_mutex_clear (&vdec->com_init_lock); + g_mutex_clear (&vdec->com_deinit_lock); + g_cond_clear (&vdec->com_initialized); + g_cond_clear (&vdec->com_uninitialize); + g_cond_clear (&vdec->com_uninitialized); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstStateChangeReturn +gst_dshowvideodec_change_state (GstElement * element, GstStateChange transition) +{ + GstDshowVideoDec *vdec = (GstDshowVideoDec *) (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + if (!gst_dshowvideodec_create_graph_and_filters (vdec)) + return GST_STATE_CHANGE_FAILURE; + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + break; + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_NULL: + if (!gst_dshowvideodec_destroy_graph_and_filters (vdec)) + return GST_STATE_CHANGE_FAILURE; + break; + default: + break; + } + + return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); +} + +static gboolean +gst_dshowvideodec_sink_setcaps (GstPad * pad, GstCaps * caps) +{ + gboolean ret = FALSE; + HRESULT hres; + GstStructure *s = gst_caps_get_structure (caps, 0); + GstDshowVideoDec *vdec = (GstDshowVideoDec *) gst_pad_get_parent (pad); + GstDshowVideoDecClass *klass = + (GstDshowVideoDecClass *) G_OBJECT_GET_CLASS (vdec); + GstBuffer *extradata = NULL; + gsize extra_size; + const GValue *v = NULL; + guint size = 0; + GstCaps *caps_out = NULL; + AM_MEDIA_TYPE output_mediatype, input_mediatype; + VIDEOINFOHEADER *input_vheader = NULL, *output_vheader = NULL; + IPinPtr output_pin; + IPinPtr input_pin; + IBaseFilter *srcfilter = NULL; + IBaseFilter *sinkfilter = NULL; + const GValue *fps, *par; + GstQuery *query = NULL; + GstBufferPool *pool = NULL; + GstStructure *pool_config = NULL; + guint pool_size, pool_min, pool_max; + + /* read data */ + if (!gst_structure_get_int (s, "width", &vdec->width) || + !gst_structure_get_int (s, "height", &vdec->height)) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("error getting video width or height from caps"), (NULL)); + goto end; + } + fps = gst_structure_get_value (s, "framerate"); + if (fps) { + vdec->fps_n = gst_value_get_fraction_numerator (fps); + vdec->fps_d = gst_value_get_fraction_denominator (fps); + } + else { + /* Invent a sane default framerate; the timestamps matter + * more anyway. */ + vdec->fps_n = 25; + vdec->fps_d = 1; + } + + par = gst_structure_get_value (s, "pixel-aspect-ratio"); + if (par) { + vdec->par_n = gst_value_get_fraction_numerator (par); + vdec->par_d = gst_value_get_fraction_denominator (par); + } + else { + vdec->par_n = vdec->par_d = 1; + } + + if ((v = gst_structure_get_value (s, "codec_data"))) { + extradata = gst_value_get_buffer (v); + extra_size = gst_buffer_get_size(extradata); + } + + /* define the input type format */ + memset (&input_mediatype, 0, sizeof (AM_MEDIA_TYPE)); + input_mediatype.majortype = klass->entry->input_majortype; + input_mediatype.subtype = klass->entry->input_subtype; + input_mediatype.bFixedSizeSamples = FALSE; + input_mediatype.bTemporalCompression = TRUE; + + if (strstr (klass->entry->sinkcaps, "video/mpeg, mpegversion= (int) 1")) { + size = + sizeof (MPEG1VIDEOINFO) + (extradata ? extra_size - 1 : 0); + input_vheader = (VIDEOINFOHEADER *)g_malloc0 (size); + + input_vheader->bmiHeader.biSize = sizeof (BITMAPINFOHEADER); + if (extradata) { + MPEG1VIDEOINFO *mpeg_info = (MPEG1VIDEOINFO *) input_vheader; + + gst_buffer_extract(extradata, 0, mpeg_info->bSequenceHeader, extra_size); + mpeg_info->cbSequenceHeader = extra_size; + } + input_mediatype.formattype = FORMAT_MPEGVideo; + } else { + size = + sizeof (VIDEOINFOHEADER) + (extradata ? extra_size : 0); + input_vheader = (VIDEOINFOHEADER *)g_malloc0 (size); + input_vheader->bmiHeader.biSize = sizeof (BITMAPINFOHEADER); + + if (extradata) { /* Codec data is appended after our header */ + gst_buffer_extract(extradata, 0, + ((guchar *) input_vheader) + sizeof (VIDEOINFOHEADER), extra_size); + input_vheader->bmiHeader.biSize += extra_size; + } + input_mediatype.formattype = FORMAT_VideoInfo; + } + + input_vheader->rcSource.top = input_vheader->rcSource.left = 0; + input_vheader->rcSource.right = vdec->width; + input_vheader->rcSource.bottom = vdec->height; + input_vheader->rcTarget = input_vheader->rcSource; + input_vheader->bmiHeader.biWidth = vdec->width; + input_vheader->bmiHeader.biHeight = vdec->height; + input_vheader->bmiHeader.biPlanes = 1; + input_vheader->bmiHeader.biBitCount = 16; + input_vheader->bmiHeader.biCompression = klass->entry->format; + input_vheader->bmiHeader.biSizeImage = + (vdec->width * vdec->height) * (input_vheader->bmiHeader.biBitCount / 8); + + input_mediatype.cbFormat = size; + input_mediatype.pbFormat = (BYTE *) input_vheader; + input_mediatype.lSampleSize = input_vheader->bmiHeader.biSizeImage; + + vdec->fakesrc->GetOutputPin()->SetMediaType(&input_mediatype); + + /* set the sample size for fakesrc filter to the output buffer size */ + vdec->fakesrc->GetOutputPin()->SetSampleSize(input_mediatype.lSampleSize); + + /* connect our fake src to decoder */ + hres = vdec->fakesrc->QueryInterface(IID_IBaseFilter, + (void **) &srcfilter); + if (FAILED (hres)) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("Can't QT fakesrc to IBaseFilter: %x", hres), (NULL)); + goto end; + } + + output_pin = gst_dshow_util_get_pin_from_filter (srcfilter, PINDIR_OUTPUT); + if (!output_pin) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("Can't get output pin from our directshow fakesrc filter"), (NULL)); + goto end; + } + input_pin = gst_dshow_util_get_pin_from_filter (vdec->decfilter, PINDIR_INPUT); + if (!input_pin) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("Can't get input pin from decoder filter"), (NULL)); + goto end; + } + + hres = vdec->filtergraph->ConnectDirect (output_pin, input_pin, NULL); + if (hres != S_OK) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("Can't connect fakesrc with decoder (error=%x)", hres), (NULL)); + goto end; + } + + /* get decoder output video format */ + if (!gst_dshowvideodec_get_filter_output_format (vdec, + klass->entry->output_subtype, &output_vheader, &size)) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("Can't get decoder output video format"), (NULL)); + goto end; + } + + memset (&output_mediatype, 0, sizeof (AM_MEDIA_TYPE)); + output_mediatype.majortype = klass->entry->output_majortype; + output_mediatype.subtype = klass->entry->output_subtype; + output_mediatype.bFixedSizeSamples = TRUE; + output_mediatype.bTemporalCompression = FALSE; + output_mediatype.lSampleSize = output_vheader->bmiHeader.biSizeImage; + output_mediatype.formattype = FORMAT_VideoInfo; + output_mediatype.cbFormat = size; + output_mediatype.pbFormat = (BYTE *) output_vheader; + + vdec->fakesink->SetMediaType (&output_mediatype); + + /* connect decoder to our fake sink */ + output_pin = gst_dshow_util_get_pin_from_filter (vdec->decfilter, PINDIR_OUTPUT); + if (!output_pin) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("Can't get output pin from our decoder filter"), (NULL)); + goto end; + } + + hres = vdec->fakesink->QueryInterface(IID_IBaseFilter, + (void **) &sinkfilter); + if (FAILED (hres)) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("Can't QT fakesink to IBaseFilter: %x", hres), (NULL)); + goto end; + } + + input_pin = gst_dshow_util_get_pin_from_filter (sinkfilter, PINDIR_INPUT); + if (!input_pin) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("Can't get input pin from our directshow fakesink filter"), (NULL)); + goto end; + } + + hres = vdec->filtergraph->ConnectDirect(output_pin, input_pin, + &output_mediatype); + if (hres != S_OK) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("Can't connect decoder with fakesink (error=%x)", hres), (NULL)); + goto end; + } + + /* negotiate output */ + caps_out = gst_caps_from_string (klass->entry->srccaps); + gst_caps_set_simple (caps_out, + "width", G_TYPE_INT, vdec->width, + "height", G_TYPE_INT, vdec->height, NULL); + + if (vdec->fps_n && vdec->fps_d) { + gst_caps_set_simple (caps_out, + "framerate", GST_TYPE_FRACTION, vdec->fps_n, vdec->fps_d, NULL); + } + + gst_caps_set_simple (caps_out, + "pixel-aspect-ratio", GST_TYPE_FRACTION, vdec->par_n, vdec->par_d, NULL); + + if (!gst_pad_set_caps (vdec->srcpad, caps_out)) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("Failed to negotiate output"), (NULL)); + goto end; + } + + /* request or create a buffer pool */ + if (vdec->buffer_pool) { + gst_object_unref (vdec->buffer_pool); + } + + query = gst_query_new_allocation(caps_out, TRUE); + gst_pad_peer_query(vdec->srcpad, query); + + if (gst_query_get_n_allocation_pools (query) > 0) { + gst_query_parse_nth_allocation_pool (query, 0, &pool, &pool_size, &pool_min, + &pool_max); + } + else { + pool = NULL; + pool_size = output_mediatype.lSampleSize; + pool_min = 1; + pool_max = 0; + } + + if (pool == NULL) { + pool = gst_video_buffer_pool_new (); + } + + if (!pool) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("Could not create buffer bool"), (NULL)); + goto end; + } + + pool_config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_params (pool_config, caps_out, pool_size, + pool_min, pool_max); + gst_buffer_pool_set_config (pool, pool_config); + + if (!gst_buffer_pool_set_active (pool, TRUE)) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("Failed set buffer pool active"), (NULL)); + goto end; + } + + vdec->buffer_pool = pool; + + hres = vdec->mediafilter->Run (-1); + if (hres != S_OK) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("Can't run the directshow graph (error=%d)", hres), (NULL)); + goto end; + } + + ret = TRUE; +end: + if (caps_out) + gst_caps_unref (caps_out); + gst_object_unref (vdec); + g_free (input_vheader); + if (srcfilter) + srcfilter->Release(); + if (sinkfilter) + sinkfilter->Release(); + if (query) + gst_query_unref(query); + return ret; +} + +static gboolean +gst_dshowvideodec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) +{ + gboolean ret = TRUE; + GstDshowVideoDec *vdec = (GstDshowVideoDec *) gst_pad_get_parent (pad); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + GstCaps *caps; + gst_event_parse_caps(event, &caps); + ret = gst_dshowvideodec_sink_setcaps(pad, caps); + break; + + case GST_EVENT_FLUSH_STOP: + gst_dshowvideodec_flush (vdec); + ret = gst_pad_event_default (pad, parent, event); + break; + case GST_EVENT_SEGMENT: + { + const GstSegment *segment; + + gst_event_parse_segment (event, &segment); + + /* save the new segment in our local current segment */ + gst_segment_copy_into(segment, vdec->segment); + + GST_CAT_DEBUG_OBJECT (dshowvideodec_debug, vdec, + "new segment received => start=%" GST_TIME_FORMAT " stop=%" + GST_TIME_FORMAT, GST_TIME_ARGS (vdec->segment->start), + GST_TIME_ARGS (vdec->segment->stop)); + + ret = gst_pad_event_default (pad, parent, event); + break; + } + default: + ret = gst_pad_event_default (pad, parent, event); + break; + } + + gst_object_unref (vdec); + + return ret; +} + +static GstFlowReturn +gst_dshowvideodec_chain (GstPad * pad, GstObject *parent, GstBuffer * buffer) +{ + GstDshowVideoDec *vdec = (GstDshowVideoDec *) gst_pad_get_parent (pad); + bool discont = FALSE; + GstClockTime stop; + GstMapInfo map; + + if (!vdec->setup) { + /* we are not setup */ + GST_WARNING_OBJECT (vdec, "Decoder not set up, failing"); + vdec->last_ret = GST_FLOW_FLUSHING; + goto beach; + } + + if (vdec->last_ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (vdec, "last decoding iteration generated a fatal error " + "%s", gst_flow_get_name (vdec->last_ret)); + goto beach; + } + + /* check if duration is valid and use duration only when it's valid + /* because dshow is not decoding frames having stop smaller than start */ + if (GST_BUFFER_DURATION_IS_VALID (buffer)) { + stop = GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer); + } else { + stop = GST_BUFFER_TIMESTAMP (buffer); + } + + GST_CAT_LOG_OBJECT (dshowvideodec_debug, vdec, + "chain (size %d)=> pts %" GST_TIME_FORMAT " stop %" GST_TIME_FORMAT, + gst_buffer_get_size (buffer), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), + GST_TIME_ARGS (stop)); + + /* if the incoming buffer has discont flag set => flush decoder data */ + if (buffer && GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) { + GST_CAT_DEBUG_OBJECT (dshowvideodec_debug, vdec, + "this buffer has a DISCONT flag (%" GST_TIME_FORMAT "), flushing", + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); + gst_dshowvideodec_flush (vdec); + discont = TRUE; + } + + gst_buffer_map(buffer, &map, GST_MAP_READ); + /* push the buffer to the directshow decoder */ + vdec->fakesrc->GetOutputPin()->PushBuffer( + map.data, GST_BUFFER_TIMESTAMP (buffer), stop, + map.size, discont); + gst_buffer_unmap(buffer, &map); + +beach: + gst_buffer_unref (buffer); + gst_object_unref (vdec); + + return vdec->last_ret; +} + +static GstCaps * +gst_dshowvideodec_src_getcaps (GstPad * pad) +{ + GstDshowVideoDec *vdec = (GstDshowVideoDec *) gst_pad_get_parent (pad); + GstCaps *caps = NULL; + + if (!vdec->srccaps) + vdec->srccaps = gst_caps_new_empty (); + + if (vdec->decfilter) { + IPinPtr output_pin; + IEnumMediaTypesPtr enum_mediatypes; + HRESULT hres; + ULONG fetched; + + output_pin = gst_dshow_util_get_pin_from_filter (vdec->decfilter, PINDIR_OUTPUT); + if (!output_pin) { + GST_ELEMENT_ERROR (vdec, STREAM, FAILED, + ("failed getting output pin from the decoder"), (NULL)); + goto beach; + } + + hres = output_pin->EnumMediaTypes (&enum_mediatypes); + if (hres == S_OK && enum_mediatypes) { + AM_MEDIA_TYPE *mediatype = NULL; + + enum_mediatypes->Reset(); + while (hres = + enum_mediatypes->Next(1, &mediatype, &fetched), + hres == S_OK) + { + VIDEOINFOHEADER *video_info; + GstCaps *mediacaps = NULL; + + /* RGB24 */ + if (IsEqualGUID (mediatype->subtype, MEDIASUBTYPE_RGB24) && + IsEqualGUID (mediatype->formattype, FORMAT_VideoInfo)) + { + gint fps_n; + + video_info = (VIDEOINFOHEADER *) mediatype->pbFormat; + + if (video_info->AvgTimePerFrame > 0) { + fps_n = 10000000 / video_info->AvgTimePerFrame; + } else { + fps_n = 30; + } + + /* ffmpegcolorspace handles RGB24 in BIG_ENDIAN */ + mediacaps = gst_caps_new_simple ("video/x-raw-rgb", + "bpp", G_TYPE_INT, 24, + "depth", G_TYPE_INT, 24, + "width", G_TYPE_INT, video_info->bmiHeader.biWidth, + "height", G_TYPE_INT, video_info->bmiHeader.biHeight, + "framerate", GST_TYPE_FRACTION, fps_n, 1, "endianness", + G_TYPE_INT, G_BIG_ENDIAN, "red_mask", G_TYPE_INT, 255, + "green_mask", G_TYPE_INT, 65280, "blue_mask", G_TYPE_INT, + 16711680, NULL); + + if (mediacaps) { + vdec->mediatypes = g_list_append (vdec->mediatypes, mediatype); + gst_caps_append (vdec->srccaps, mediacaps); + } else { + DeleteMediaType (mediatype); + } + } else { + DeleteMediaType (mediatype); + } + + } + } + } + + if (vdec->srccaps) + caps = gst_caps_ref (vdec->srccaps); + +beach: + gst_object_unref (vdec); + + return caps; +} + +static gboolean +gst_dshowvideodec_src_setcaps (GstPad * pad, GstCaps * caps) +{ + gboolean ret = FALSE; + + return ret; +} + +static gboolean +gst_dshowvideodec_flush (GstDshowVideoDec * vdec) +{ + if (!vdec->fakesrc) + return FALSE; + + /* flush dshow decoder and reset timestamp */ + vdec->fakesrc->GetOutputPin()->Flush(); + vdec->last_ret = GST_FLOW_OK; + + return TRUE; +} + +static gboolean +gst_dshowvideodec_get_filter_output_format (GstDshowVideoDec * vdec, + const GUID subtype, VIDEOINFOHEADER ** format, guint * size) +{ + IPinPtr output_pin; + IEnumMediaTypesPtr enum_mediatypes; + HRESULT hres; + ULONG fetched; + BOOL ret = FALSE; + + if (!vdec->decfilter) + return FALSE; + + output_pin = gst_dshow_util_get_pin_from_filter (vdec->decfilter, PINDIR_OUTPUT); + if (!output_pin) { + GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, + ("failed getting output pin from the decoder"), (NULL)); + return FALSE; + } + + hres = output_pin->EnumMediaTypes (&enum_mediatypes); + if (hres == S_OK && enum_mediatypes) { + AM_MEDIA_TYPE *mediatype = NULL; + + enum_mediatypes->Reset(); + while (hres = + enum_mediatypes->Next(1, &mediatype, &fetched), + hres == S_OK) + { + if (IsEqualGUID (mediatype->subtype, subtype) && + IsEqualGUID (mediatype->formattype, FORMAT_VideoInfo)) + { + *size = mediatype->cbFormat; + *format = (VIDEOINFOHEADER *)g_malloc0 (*size); + memcpy (*format, mediatype->pbFormat, *size); + ret = TRUE; + } + DeleteMediaType (mediatype); + if (ret) + break; + } + } + + return ret; +} + +static gboolean +gst_dshowvideodec_create_graph_and_filters (GstDshowVideoDec * vdec) +{ + HRESULT hres = S_FALSE; + GstDshowVideoDecClass *klass = + (GstDshowVideoDecClass *) G_OBJECT_GET_CLASS (vdec); + IBaseFilter *srcfilter = NULL; + IBaseFilter *sinkfilter = NULL; + gboolean ret = FALSE; + + /* create the filter graph manager object */ + hres = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC, + IID_IFilterGraph, (LPVOID *) & vdec->filtergraph); + if (hres != S_OK || !vdec->filtergraph) { + GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't create an instance " + "of the directshow graph manager (error=%d)", hres), (NULL)); + goto error; + } + + hres = vdec->filtergraph->QueryInterface(IID_IMediaFilter, + (void **) &vdec->mediafilter); + if (hres != S_OK || !vdec->mediafilter) { + GST_ELEMENT_ERROR (vdec, STREAM, FAILED, + ("Can't get IMediacontrol interface " + "from the graph manager (error=%d)", hres), (NULL)); + goto error; + } + + /* create fake src filter */ + vdec->fakesrc = new FakeSrc(); + /* Created with a refcount of zero, so increment that */ + vdec->fakesrc->AddRef(); + + hres = vdec->fakesrc->QueryInterface(IID_IBaseFilter, + (void **) &srcfilter); + if (FAILED (hres)) { + GST_WARNING_OBJECT (vdec, "Failed to QI fakesrc to IBaseFilter"); + goto error; + } + + /* search a decoder filter and create it */ + vdec->decfilter = gst_dshow_util_find_filter ( + klass->entry->input_majortype, + klass->entry->input_subtype, + klass->entry->output_majortype, + klass->entry->output_subtype, + klass->entry->preferred_filters); + if (vdec->decfilter == NULL) { + GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't create an instance " + "of the decoder filter"), (NULL)); + goto error; + } + + /* create fake sink filter */ + vdec->fakesink = new VideoFakeSink(vdec); + /* Created with a refcount of zero, so increment that */ + vdec->fakesink->AddRef(); + + hres = vdec->fakesink->QueryInterface(IID_IBaseFilter, + (void **) &sinkfilter); + if (FAILED (hres)) { + GST_WARNING_OBJECT (vdec, "Failed to QI fakesink to IBaseFilter"); + goto error; + } + + /* add filters to the graph */ + hres = vdec->filtergraph->AddFilter (srcfilter, L"src"); + if (hres != S_OK) { + GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't add fakesrc filter " + "to the graph (error=%d)", hres), (NULL)); + goto error; + } + + hres = vdec->filtergraph->AddFilter(vdec->decfilter, L"decoder"); + if (hres != S_OK) { + GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't add decoder filter " + "to the graph (error=%d)", hres), (NULL)); + goto error; + } + + hres = vdec->filtergraph->AddFilter(sinkfilter, L"sink"); + if (hres != S_OK) { + GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't add fakesink filter " + "to the graph (error=%d)", hres), (NULL)); + goto error; + } + + vdec->setup = TRUE; + + ret = TRUE; + +done: + if (srcfilter) + srcfilter->Release(); + if (sinkfilter) + sinkfilter->Release(); + return ret; + +error: + if (vdec->fakesrc) { + vdec->fakesrc->Release(); + vdec->fakesrc = NULL; + } + if (vdec->decfilter) { + vdec->decfilter->Release(); + vdec->decfilter = NULL; + } + if (vdec->fakesink) { + vdec->fakesink->Release(); + vdec->fakesink = NULL; + } + if (vdec->mediafilter) { + vdec->mediafilter->Release(); + vdec->mediafilter = NULL; + } + if (vdec->filtergraph) { + vdec->filtergraph->Release(); + vdec->filtergraph = NULL; + } + + goto done; +} + +static gboolean +gst_dshowvideodec_destroy_graph_and_filters (GstDshowVideoDec * vdec) +{ + HRESULT hres; + + if (vdec->mediafilter) { + vdec->mediafilter->Stop(); + } + + if (vdec->fakesrc) { + if (vdec->filtergraph) { + IBaseFilter *filter; + hres = vdec->fakesrc->QueryInterface(IID_IBaseFilter, + (void **) &filter); + if (SUCCEEDED (hres)) { + vdec->filtergraph->RemoveFilter(filter); + filter->Release(); + } + } + + vdec->fakesrc->Release(); + vdec->fakesrc = NULL; + } + if (vdec->decfilter) { + if (vdec->filtergraph) + vdec->filtergraph->RemoveFilter(vdec->decfilter); + vdec->decfilter->Release(); + vdec->decfilter = NULL; + } + if (vdec->fakesink) { + if (vdec->filtergraph) { + IBaseFilter *filter; + hres = vdec->fakesink->QueryInterface(IID_IBaseFilter, + (void **) &filter); + if (SUCCEEDED (hres)) { + vdec->filtergraph->RemoveFilter(filter); + filter->Release(); + } + } + + vdec->fakesink->Release(); + vdec->fakesink = NULL; + } + if (vdec->mediafilter) { + vdec->mediafilter->Release(); + vdec->mediafilter = NULL; + } + if (vdec->filtergraph) { + vdec->filtergraph->Release(); + vdec->filtergraph = NULL; + } + + vdec->setup = FALSE; + + return TRUE; +} + +gboolean +dshow_vdec_register (GstPlugin * plugin) +{ + GTypeInfo info = { + sizeof (GstDshowVideoDecClass), + (GBaseInitFunc) gst_dshowvideodec_base_init, + NULL, + (GClassInitFunc) gst_dshowvideodec_class_init, + NULL, + NULL, + sizeof (GstDshowVideoDec), + 0, + (GInstanceInitFunc) gst_dshowvideodec_init, + }; + gint i; + HRESULT hr; + + GST_DEBUG_CATEGORY_INIT (dshowvideodec_debug, "dshowvideodec", 0, + "Directshow filter video decoder"); + + hr = CoInitialize (0); + + for (i = 0; i < sizeof (video_dec_codecs) / sizeof (VideoCodecEntry); i++) { + GType type; + IBaseFilterPtr filter; + guint rank = GST_RANK_MARGINAL; + + filter = gst_dshow_util_find_filter ( + video_dec_codecsi.input_majortype, + video_dec_codecsi.input_subtype, + video_dec_codecsi.output_majortype, + video_dec_codecsi.output_subtype, + video_dec_codecsi.preferred_filters); + if (filter != NULL) { + + if (video_dec_codecsi.format == GST_MAKE_FOURCC ('W', 'V', 'C', '1')) { + /* FFMPEG WVC1 decoder sucks, get higher priority for ours */ + rank = GST_RANK_MARGINAL + 2; + } + GST_DEBUG ("Registering %s with rank %u", video_dec_codecsi.element_name, rank); + + type = g_type_register_static (GST_TYPE_ELEMENT, + video_dec_codecsi.element_name, &info, (GTypeFlags)0); + g_type_set_qdata (type, DSHOW_CODEC_QDATA, (gpointer) (video_dec_codecs + i)); + if (!gst_element_register (plugin, video_dec_codecsi.element_name, rank, type)) { + return FALSE; + } + GST_DEBUG ("Registered %s", video_dec_codecsi.element_name); + } else { + GST_DEBUG ("Element %s not registered " + "(the format is not supported by the system)", + video_dec_codecsi.element_name); + } + } + + if (SUCCEEDED(hr)) + CoUninitialize (); + + return TRUE; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowvideodec.h
Added
@@ -0,0 +1,163 @@ +/* + * GStreamer DirectShow codecs wrapper + * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com> + * Copyright <2006, 2007, 2008> Pioneers of the Inevitable <songbird@songbirdnest.com> + * Copyright <2007,2008> Sebastien Moutte <sebastien@moutte.net> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_DSHOWVIDEODEC_H__ +#define __GST_DSHOWVIDEODEC_H__ + +#include <gst/gst.h> +#include "gstdshowutil.h" +#include "gstdshowfakesrc.h" + +G_BEGIN_DECLS + +typedef struct { + gchar *element_name; /* The gst element factory name */ + gchar *element_longname; /* Description string for element */ + gint32 format; /* ??? */ + GUID input_majortype; + GUID input_subtype; + gchar *sinkcaps; /* GStreamer caps of input format */ + GUID output_majortype; + GUID output_subtype; + gchar *srccaps; + PreferredFilter *preferred_filters; +} VideoCodecEntry; + +#define GST_TYPE_DSHOWVIDEODEC (gst_dshowvideodec_get_type()) +#define GST_DSHOWVIDEODEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DSHOWVIDEODEC,GstDshowVideoDec)) +#define GST_DSHOWVIDEODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DSHOWVIDEODEC,GstDshowVideoDecClass)) +#define GST_IS_DSHOWVIDEODEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DSHOWVIDEODEC)) +#define GST_IS_DSHOWVIDEODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DSHOWVIDEODEC)) + +typedef struct _GstDshowVideoDec GstDshowVideoDec; +typedef struct _GstDshowVideoDecClass GstDshowVideoDecClass; + +class VideoFakeSink; + +struct _GstDshowVideoDec +{ + GstElement element; + + /* element pads */ + GstPad *sinkpad; + GstPad *srcpad; + + /* caps of our src pad */ + GstCaps *srccaps; + + GstFlowReturn last_ret; + + /* list of dshow mediatypes corresponding to the caps list */ + GList *mediatypes; + + /* filters interfaces */ + FakeSrc *fakesrc; + VideoFakeSink *fakesink; + + IBaseFilter *decfilter; + + /* graph manager interfaces */ + IMediaFilter *mediafilter; + IFilterGraph *filtergraph; + + /* settings */ + gint width, height; + gint fps_n, fps_d; + gint par_n, par_d; + + /* current segment */ + GstSegment *segment; + + gboolean setup; + + gboolean comInitialized; + GMutex com_init_lock; + GMutex com_deinit_lock; + GCond com_initialized; + GCond com_uninitialize; + GCond com_uninitialized; + + GstBufferPool *buffer_pool; +}; + +struct _GstDshowVideoDecClass +{ + GstElementClass parent_class; + const VideoCodecEntry *entry; +}; + +gboolean dshow_vdec_register (GstPlugin * plugin); + +const GUID CLSID_VideoFakeSink = +{ 0xff8f0c8e, 0x64f9, 0x4471, + { 0x96, 0x0e, 0xd2, 0xd3, 0x18, 0x87, 0x78, 0x9a} }; + +class VideoFakeSink : public CBaseRenderer +{ +public: + VideoFakeSink(GstDshowVideoDec *dec) : + m_hres(S_OK), + CBaseRenderer(CLSID_VideoFakeSink, _T("VideoFakeSink"), NULL, &m_hres), + mDec(dec) + {}; + virtual ~VideoFakeSink() {}; + + HRESULT DoRenderSample(IMediaSample *pMediaSample); + HRESULT CheckMediaType(const CMediaType *pmt); + HRESULT SetMediaType (AM_MEDIA_TYPE *pmt) + { + m_MediaType.Set (*pmt); + return S_OK; + } + +protected: + HRESULT m_hres; + CMediaType m_MediaType; + GstDshowVideoDec *mDec; +}; + +G_END_DECLS + +#endif /* __GST_DSHOWVIDEODEC_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowvideosrc.cpp
Added
@@ -0,0 +1,1118 @@ +/* GStreamer + * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> + * Copyright (C) 2009 Julien Isorce <julien.isorce@gmail.com> + * + * gstdshowvideosrc.c: + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstdshowvideosrc.h" + +#include <gst/video/video.h> + +GST_DEBUG_CATEGORY_EXTERN (dshowvideosrc_debug); +#define GST_CAT_DEFAULT dshowvideosrc_debug + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ( + GST_VIDEO_CAPS_MAKE ("{ I420, BGR, YUY2, UYVY, BGRx, BGR16, BGR15, " + "GRAY8 }") "; " + + "video/x-dv, " + "format= (string) DVSD, " + "width = " GST_VIDEO_SIZE_RANGE ", " + "height = " GST_VIDEO_SIZE_RANGE ", " + "framerate = " GST_VIDEO_FPS_RANGE ", " + "systemstream = (boolean) { TRUE, FALSE }; " + + "image/jpeg, " + "width = " GST_VIDEO_SIZE_RANGE ", " + "height = " GST_VIDEO_SIZE_RANGE ", " + "framerate = " GST_VIDEO_FPS_RANGE "; " + + "video/x-h264, " + "width = " GST_VIDEO_SIZE_RANGE ", " + "height = " GST_VIDEO_SIZE_RANGE ", " + "framerate = " GST_VIDEO_FPS_RANGE + ) + ); + +G_DEFINE_TYPE (GstDshowVideoSrc, gst_dshowvideosrc, GST_TYPE_PUSH_SRC) + +enum +{ + PROP_0, + PROP_DEVICE, + PROP_DEVICE_NAME, + PROP_DEVICE_INDEX +}; + +#define DEFAULT_PROP_DEVICE_INDEX 0 + + +static void gst_dshowvideosrc_dispose (GObject * gobject); +static void gst_dshowvideosrc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_dshowvideosrc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstStateChangeReturn gst_dshowvideosrc_change_state (GstElement * + element, GstStateChange transition); + + +static gboolean gst_dshowvideosrc_start (GstBaseSrc * bsrc); +static gboolean gst_dshowvideosrc_stop (GstBaseSrc * bsrc); +static gboolean gst_dshowvideosrc_unlock (GstBaseSrc * bsrc); +static gboolean gst_dshowvideosrc_unlock_stop (GstBaseSrc * bsrc); +static gboolean gst_dshowvideosrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps); +static GstCaps *gst_dshowvideosrc_get_caps (GstBaseSrc * bsrc, GstCaps * filter); +static GstCaps *gst_dshowvideosrc_src_fixate (GstBaseSrc * bsrc, GstCaps * caps); +static GstFlowReturn gst_dshowvideosrc_create (GstPushSrc * psrc, + GstBuffer ** buf); + +/*utils*/ +GstCaps *gst_dshowvideosrc_getcaps_from_streamcaps (IPin * pin, + GList ** pins_mediatypes); +GstCaps *gst_dshowvideosrc_getcaps_from_enum_mediatypes (IPin * pin, + GList ** pins_mediatypes); + +static gboolean gst_dshowvideosrc_push_buffer (guint8 * buffer, guint size, + gpointer src_object, GstClockTime duration); + +static void +gst_dshowvideosrc_class_init (GstDshowVideoSrcClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSrcClass *gstbasesrc_class; + GstPushSrcClass *gstpushsrc_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstpushsrc_class = (GstPushSrcClass *) klass; + + gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_dispose); + gobject_class->set_property = + GST_DEBUG_FUNCPTR (gst_dshowvideosrc_set_property); + gobject_class->get_property = + GST_DEBUG_FUNCPTR (gst_dshowvideosrc_get_property); + + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_dshowvideosrc_change_state); + + gstbasesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_set_caps); + gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_get_caps); + gstbasesrc_class->fixate = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_src_fixate); + gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_start); + gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_stop); + gstbasesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_unlock); + gstbasesrc_class->unlock_stop = + GST_DEBUG_FUNCPTR (gst_dshowvideosrc_unlock_stop); + + gstpushsrc_class->create = GST_DEBUG_FUNCPTR (gst_dshowvideosrc_create); + + g_object_class_install_property + (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Device", + "Directshow device path (@..classID/name)", NULL, + static_cast < GParamFlags > (G_PARAM_READWRITE))); + + g_object_class_install_property + (gobject_class, PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Device name", + "Human-readable name of the video device", NULL, + static_cast < GParamFlags > (G_PARAM_READWRITE))); + + g_object_class_install_property + (gobject_class, PROP_DEVICE_INDEX, + g_param_spec_int ("device-index", "Device index", + "Index of the enumerated video device", 0, G_MAXINT, + DEFAULT_PROP_DEVICE_INDEX, + static_cast < GParamFlags > (G_PARAM_READWRITE))); + + gst_element_class_add_static_pad_template (gstelement_class, &src_template); + + gst_element_class_set_static_metadata (gstelement_class, + "DirectShow video capture source", "Source/Video", + "Receive data from a directshow video capture graph", + "Sebastien Moutte <sebastien@moutte.net>"); +} + +static void +gst_dshowvideosrc_init (GstDshowVideoSrc * src) +{ + src->device = NULL; + src->device_name = NULL; + src->device_index = DEFAULT_PROP_DEVICE_INDEX; + src->video_cap_filter = NULL; + src->dshow_fakesink = NULL; + src->media_filter = NULL; + src->filter_graph = NULL; + src->caps = NULL; + src->pins_mediatypes = NULL; + src->is_rgb = FALSE; + src->is_running = FALSE; + + /*added for analog input*/ + src->graph_builder = NULL; + src->capture_builder = NULL; + src->pVC = NULL; + src->pVSC = NULL; + + g_cond_init(&src->buffer_cond); + g_mutex_init(&src->buffer_mutex); + src->buffer = NULL; + src->stop_requested = FALSE; + + CoInitializeEx (NULL, COINIT_MULTITHREADED); + + gst_base_src_set_live (GST_BASE_SRC (src), TRUE); +} + +static GstCaps * +gst_dshowvideosrc_src_fixate (GstBaseSrc * bsrc, GstCaps * caps) +{ + /* If there is no desired video size, set default video size to device preferred video size */ + + GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (bsrc); + GstStructure *structure = gst_caps_get_structure (caps, 0); + guint i = 0; + gint res = -1; + + for (; i < gst_caps_get_size (src->caps) && res == -1; i++) { + GstCaps *capstmp = gst_caps_copy_nth (src->caps, i); + + if (gst_caps_is_subset (caps, capstmp)) { + res = i; + } + gst_caps_unref (capstmp); + } + + if (res != -1) { + GList *type_pin_mediatype = g_list_nth (src->pins_mediatypes, res); + if (type_pin_mediatype) { + GstCapturePinMediaType *pin_mediatype = + (GstCapturePinMediaType *) type_pin_mediatype->data; + gst_structure_fixate_field_nearest_int (structure, "width", + pin_mediatype->defaultWidth); + gst_structure_fixate_field_nearest_int (structure, "height", + pin_mediatype->defaultHeight); + gst_structure_fixate_field_nearest_fraction (structure, "framerate", + pin_mediatype->defaultFPS, 1); + } + } + + caps = GST_BASE_SRC_CLASS (gst_dshowvideosrc_parent_class)->fixate(bsrc, caps); + + return caps; +} + +static void +gst_dshowvideosrc_dispose (GObject * gobject) +{ + GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (gobject); + + if (src->device) { + g_free (src->device); + src->device = NULL; + } + + if (src->device_name) { + g_free (src->device_name); + src->device_name = NULL; + } + + if (src->caps) { + gst_caps_unref (src->caps); + src->caps = NULL; + } + + if (src->pins_mediatypes) { + gst_dshow_free_pins_mediatypes (src->pins_mediatypes); + src->pins_mediatypes = NULL; + } + + /* clean dshow */ + if (src->video_cap_filter) { + src->video_cap_filter->Release (); + src->video_cap_filter = NULL; + } + + g_cond_clear(&src->buffer_cond); + g_mutex_clear(&src->buffer_mutex); + + CoUninitialize (); + + G_OBJECT_CLASS (gst_dshowvideosrc_parent_class)->dispose (gobject); +} + +static void +gst_dshowvideosrc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (object); + + switch (prop_id) { + case PROP_DEVICE: + { + const gchar *device = g_value_get_string (value); + g_free (src->device); + src->device = NULL; + if (device && strlen (device) != 0) { + src->device = g_value_dup_string (value); + } + break; + } + case PROP_DEVICE_NAME: + { + const gchar *device_name = g_value_get_string (value); + g_free (src->device_name); + src->device_name = NULL; + if (device_name && strlen (device_name) != 0) { + src->device_name = g_value_dup_string (value); + } + break; + } + case PROP_DEVICE_INDEX: + { + src->device_index = g_value_get_int (value); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_dshowvideosrc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstDshowVideoSrc *src; + + g_return_if_fail (GST_IS_DSHOWVIDEOSRC (object)); + src = GST_DSHOWVIDEOSRC (object); + + switch (prop_id) { + case PROP_DEVICE: + g_value_set_string (value, src->device); + break; + case PROP_DEVICE_NAME: + g_value_set_string (value, src->device_name); + break; + case PROP_DEVICE_INDEX: + g_value_set_int (value, src->device_index); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstCaps * +gst_dshowvideosrc_get_caps (GstBaseSrc * basesrc, GstCaps * filter) +{ + GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (basesrc); + GstCaps *caps; + + if (src->caps) { + caps = gst_caps_ref (src->caps); + } else { + caps = gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD (src)); + } + + if (caps) { + GstCaps *filtcaps; + + if (filter) { + filtcaps = gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); + } else { + filtcaps = gst_caps_ref (caps); + } + gst_caps_unref (caps); + + return filtcaps; + } + + return NULL; +} + +GstCaps * +gst_dshowvideosrc_getcaps_from_capture_filter (IBaseFilter * filter, + GList ** pins_mediatypes) +{ + IPin *capture_pin = NULL; + IEnumPins *enumpins = NULL; + HRESULT hres; + GstCaps *caps; + + g_assert (filter); + + caps = gst_caps_new_empty (); + + /* get the capture pins supported types */ + hres = filter->EnumPins (&enumpins); + if (SUCCEEDED (hres)) { + while (enumpins->Next (1, &capture_pin, NULL) == S_OK) { + IKsPropertySet *pKs = NULL; + hres = + capture_pin->QueryInterface (IID_IKsPropertySet, (LPVOID *) & pKs); + if (SUCCEEDED (hres) && pKs) { + DWORD cbReturned; + GUID pin_category; + RPC_STATUS rpcstatus; + + hres = + pKs->Get (AMPROPSETID_Pin, + AMPROPERTY_PIN_CATEGORY, NULL, 0, &pin_category, sizeof (GUID), + &cbReturned); + + /* we only want capture pins */ + if (UuidCompare (&pin_category, (UUID *) & PIN_CATEGORY_CAPTURE, + &rpcstatus) == 0) { + GstCaps *caps2; + caps2 = gst_dshowvideosrc_getcaps_from_streamcaps (capture_pin, + pins_mediatypes); + if (caps2) { + gst_caps_append (caps, caps2); + } else { + caps2 = gst_dshowvideosrc_getcaps_from_enum_mediatypes ( + capture_pin, pins_mediatypes); + if (caps2) { + gst_caps_append (caps, caps2); + } + } + } + pKs->Release (); + } + capture_pin->Release (); + } + enumpins->Release (); + } + + GST_DEBUG ("Device supports these caps: %" GST_PTR_FORMAT, caps); + + return caps; +} + +static GstStateChangeReturn +gst_dshowvideosrc_change_state (GstElement * element, GstStateChange transition) +{ + HRESULT hres = S_FALSE; + GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + if (src->media_filter) { + /* Setting this to TRUE because set_caps may be invoked before + Run() returns. */ + src->is_running = TRUE; + hres = src->media_filter->Run (0); + } + if (hres != S_OK) { + GST_ERROR ("Can't RUN the directshow capture graph (error=0x%x)", hres); + src->is_running = FALSE; + return GST_STATE_CHANGE_FAILURE; + } + break; + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + if (src->media_filter) + hres = src->media_filter->Stop (); + if (hres != S_OK) { + GST_ERROR ("Can't STOP the directshow capture graph (error=%d)", hres); + return GST_STATE_CHANGE_FAILURE; + } + src->is_running = FALSE; + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return GST_ELEMENT_CLASS(gst_dshowvideosrc_parent_class)->change_state(element, transition); +} + +static gboolean +gst_dshowvideosrc_start (GstBaseSrc * bsrc) +{ + HRESULT hres = S_FALSE; + GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (bsrc); + DshowDeviceEntry *device_entry; + IMoniker *moniker = NULL; + + device_entry = gst_dshow_select_device (&CLSID_VideoInputDeviceCategory, + src->device, src->device_name, src->device_index); + if (device_entry == NULL) { + GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Failed to find device"), (NULL)); + return FALSE; + } + + g_free (src->device); + g_free (src->device_name); + src->device = g_strdup (device_entry->device); + src->device_name = g_strdup (device_entry->device_name); + src->device_index = device_entry->device_index; + moniker = device_entry->moniker; + device_entry->moniker = NULL; + gst_dshow_device_entry_free (device_entry); + + src->video_cap_filter = gst_dshow_create_capture_filter (moniker); + moniker->Release (); + if (src->video_cap_filter == NULL) { + GST_ELEMENT_ERROR (src, RESOURCE, FAILED, + ("Failed to create capture filter for device"), (NULL)); + return FALSE; + } + + src->caps = gst_dshowvideosrc_getcaps_from_capture_filter ( + src->video_cap_filter, (GList**)&src->pins_mediatypes); + if (gst_caps_is_empty (src->caps)) { + GST_ELEMENT_ERROR (src, RESOURCE, FAILED, + ("Failed to get any caps from device"), (NULL)); + return FALSE; + } + + /* + The filter graph now is created via the IGraphBuilder Interface + Code added to build upstream filters, needed for USB Analog TV Tuners / DVD Maker, based on AMCap code. + by Fabrice Costa <fabricio.costa@moldeointeractive.com.ar> + */ + + hres = CoCreateInstance(CLSID_FilterGraph, NULL, + CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (LPVOID *) & src->graph_builder ); + if (hres != S_OK || !src->graph_builder ) { + GST_ERROR + ("Can't create an instance of the dshow graph builder (error=0x%x)", + hres); + goto error; + } else { + /*graph builder is derived from IFilterGraph so we can assign it to the old src->filter_graph*/ + src->filter_graph = (IFilterGraph*) src->graph_builder; + } + + /*adding capture graph builder to correctly create upstream filters, Analog TV, TV Tuner */ + + hres = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, + CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, + (LPVOID *) & src->capture_builder); + if ( hres != S_OK || !src->capture_builder ) { + GST_ERROR + ("Can't create an instance of the dshow capture graph builder manager (error=0x%x)", + hres); + goto error; + } else { + src->capture_builder->SetFiltergraph(src->graph_builder); + } + + hres = src->filter_graph->QueryInterface (IID_IMediaFilter, + (LPVOID *) & src->media_filter); + if (hres != S_OK || !src->media_filter) { + GST_ERROR + ("Can't get IMediacontrol interface from the graph manager (error=0x%x)", + hres); + goto error; + } + + src->dshow_fakesink = new CDshowFakeSink; + src->dshow_fakesink->AddRef (); + + hres = src->filter_graph->AddFilter (src->video_cap_filter, L"capture"); + if (hres != S_OK) { + GST_ERROR ("Can't add video capture filter to the graph (error=0x%x)", + hres); + goto error; + } + + /* Finding interfaces really creates the upstream filters */ + + hres = src->capture_builder->FindInterface(&PIN_CATEGORY_CAPTURE, + &MEDIATYPE_Interleaved, src->video_cap_filter, + IID_IAMVideoCompression, (LPVOID *)&src->pVC); + + if(hres != S_OK) + { + hres = src->capture_builder->FindInterface(&PIN_CATEGORY_CAPTURE, + &MEDIATYPE_Video, src->video_cap_filter, + IID_IAMVideoCompression, (LPVOID *)&src->pVC); + } + + hres = src->capture_builder->FindInterface(&PIN_CATEGORY_CAPTURE, + &MEDIATYPE_Interleaved, + src->video_cap_filter, IID_IAMStreamConfig, (LPVOID *)&src->pVSC); + if(hres != S_OK) + { + hres = src->capture_builder->FindInterface(&PIN_CATEGORY_CAPTURE, + &MEDIATYPE_Video, src->video_cap_filter, + IID_IAMStreamConfig, (LPVOID *)&src->pVSC); + if (hres != S_OK) { + /* this means we can't set frame rate (non-DV only) */ + GST_ERROR ("Error %x: Cannot find VCapture:IAMStreamConfig", hres); + goto error; + } + } + + hres = src->filter_graph->AddFilter (src->dshow_fakesink, L"sink"); + if (hres != S_OK) { + GST_ERROR ("Can't add our fakesink filter to the graph (error=0x%x)", hres); + goto error; + } + + return TRUE; + +error: + GST_ELEMENT_ERROR (src, RESOURCE, FAILED, + ("Failed to build filter graph"), (NULL)); + + if (src->dshow_fakesink) { + src->dshow_fakesink->Release (); + src->dshow_fakesink = NULL; + } + + if (src->media_filter) { + src->media_filter->Release (); + src->media_filter = NULL; + } + if (src->graph_builder) { + src->graph_builder->Release (); + src->graph_builder = NULL; + } + if (src->capture_builder) { + src->capture_builder->Release (); + src->capture_builder = NULL; + } + if (src->pVC) { + src->pVC->Release (); + src->pVC = NULL; + } + if (src->pVSC) { + src->pVSC->Release (); + src->pVSC = NULL; + } + + return FALSE; +} + +static gboolean +gst_dshowvideosrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps) +{ + HRESULT hres; + IPin *input_pin = NULL; + GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (bsrc); + GstStructure *s = gst_caps_get_structure (caps, 0); + GstCaps *current_caps = gst_pad_get_current_caps (GST_BASE_SRC_PAD (bsrc)); + + if (current_caps) { + if (gst_caps_is_equal (caps, current_caps)) { + gst_caps_unref (current_caps); + return TRUE; + } + gst_caps_unref (current_caps); + } + + /* Same remark as in gstdshowaudiosrc. */ + gboolean was_running = src->is_running; + if (was_running) { + HRESULT hres = src->media_filter->Stop (); + if (hres != S_OK) { + GST_ERROR ("Can't STOP the directshow capture graph (error=0x%x)", hres); + return FALSE; + } + src->is_running = FALSE; + } + + /* search the negotiated caps in our caps list to get its index and the corresponding mediatype */ + if (gst_caps_is_subset (caps, src->caps)) { + guint i = 0; + gint res = -1; + + for (; i < gst_caps_get_size (src->caps) && res == -1; i++) { + GstCaps *capstmp = gst_caps_copy_nth (src->caps, i); + + if (gst_caps_is_subset (caps, capstmp)) { + res = i; + } + gst_caps_unref (capstmp); + } + + if (res != -1 && src->pins_mediatypes) { + /* get the corresponding media type and build the dshow graph */ + GList *type_pin_mediatype = g_list_nth (src->pins_mediatypes, res); + + if (type_pin_mediatype) { + GstCapturePinMediaType *pin_mediatype = + (GstCapturePinMediaType *) type_pin_mediatype->data; + gchar *caps_string = NULL; + gchar *src_caps_string = NULL; + + GST_DEBUG_OBJECT (src, "Default: %dx%d@%d", pin_mediatype->defaultWidth, pin_mediatype->defaultHeight, pin_mediatype->defaultFPS); + + /* retrieve the desired video size */ + VIDEOINFOHEADER *video_info = NULL; + gint width = 0; + gint height = 0; + gint numerator = 0; + gint denominator = 0; + gst_structure_get_int (s, "width", &width); + gst_structure_get_int (s, "height", &height); + gst_structure_get_fraction (s, "framerate", &numerator, &denominator); + + /* check if the desired video size is valid about granularity */ + /* This check will be removed when GST_TYPE_INT_RANGE_STEP exits */ + /* See remarks in gst_dshow_new_video_caps function */ + if (pin_mediatype->granularityWidth != 0 + && width % pin_mediatype->granularityWidth != 0) + g_warning ("your desired video size is not valid : %d mod %d !=0\n", + width, pin_mediatype->granularityWidth); + if (pin_mediatype->granularityHeight != 0 + && height % pin_mediatype->granularityHeight != 0) + g_warning ("your desired video size is not valid : %d mod %d !=0\n", + height, pin_mediatype->granularityHeight); + + /* update mediatype */ + video_info = (VIDEOINFOHEADER *) pin_mediatype->mediatype->pbFormat; + video_info->bmiHeader.biWidth = width; + video_info->bmiHeader.biHeight = height; + video_info->AvgTimePerFrame = + (LONGLONG) (10000000 * denominator / (double) numerator); + video_info->bmiHeader.biSizeImage = DIBSIZE (video_info->bmiHeader); + pin_mediatype->mediatype->lSampleSize = DIBSIZE (video_info->bmiHeader); + + src->dshow_fakesink->gst_set_media_type (pin_mediatype->mediatype); + src->dshow_fakesink->gst_set_buffer_callback ( + (push_buffer_func) gst_dshowvideosrc_push_buffer, src); + + gst_dshow_get_pin_from_filter (src->dshow_fakesink, PINDIR_INPUT, + &input_pin); + if (!input_pin) { + GST_ERROR ("Can't get input pin from our dshow fakesink"); + goto error; + } + + if (gst_dshow_is_pin_connected (pin_mediatype->capture_pin)) { + GST_DEBUG_OBJECT (src, + "capture_pin already connected, disconnecting"); + src->filter_graph->Disconnect (pin_mediatype->capture_pin); + } + + if (gst_dshow_is_pin_connected (input_pin)) { + GST_DEBUG_OBJECT (src, "input_pin already connected, disconnecting"); + src->filter_graph->Disconnect (input_pin); + } + + hres = src->pVSC->SetFormat(pin_mediatype->mediatype); + if (FAILED (hres)) { + GST_ERROR ("Failed to set capture pin format (error=0x%x)", hres); + goto error; + } + + hres = src->filter_graph->ConnectDirect (pin_mediatype->capture_pin, + input_pin, pin_mediatype->mediatype); + input_pin->Release (); + + if (hres != S_OK) { + GST_ERROR + ("Can't connect capture filter with fakesink filter (error=0x%x)", + hres); + goto error; + } + + /* save width and height negotiated */ + gst_structure_get_int (s, "width", &src->width); + gst_structure_get_int (s, "height", &src->height); + + GstVideoInfo info; + gst_video_info_from_caps(&info, caps); + switch (GST_VIDEO_INFO_FORMAT(&info)) { + case GST_VIDEO_FORMAT_RGB: + case GST_VIDEO_FORMAT_BGR: + src->is_rgb = TRUE; + break; + default: + src->is_rgb = FALSE; + break; + } + } + } + } + + if (was_running) { + HRESULT hres = src->media_filter->Run (0); + if (hres != S_OK) { + GST_ERROR ("Can't RUN the directshow capture graph (error=0x%x)", hres); + return FALSE; + } + src->is_running = TRUE; + } + + return TRUE; + +error: + return FALSE; +} + +static gboolean +gst_dshowvideosrc_stop (GstBaseSrc * bsrc) +{ + IPin *input_pin = NULL, *output_pin = NULL; + HRESULT hres = S_FALSE; + GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (bsrc); + + if (!src->filter_graph) + return TRUE; + + /* disconnect filters */ + gst_dshow_get_pin_from_filter (src->video_cap_filter, PINDIR_OUTPUT, + &output_pin); + if (output_pin) { + hres = src->filter_graph->Disconnect (output_pin); + output_pin->Release (); + } + + gst_dshow_get_pin_from_filter (src->dshow_fakesink, PINDIR_INPUT, &input_pin); + if (input_pin) { + hres = src->filter_graph->Disconnect (input_pin); + input_pin->Release (); + } + + /* remove filters from the graph */ + src->filter_graph->RemoveFilter (src->video_cap_filter); + src->filter_graph->RemoveFilter (src->dshow_fakesink); + + /* release our gstreamer dshow sink */ + src->dshow_fakesink->Release (); + src->dshow_fakesink = NULL; + + /* release media filter interface */ + src->media_filter->Release (); + src->media_filter = NULL; + + /* release any upstream filter */ + if (src->pVC) { + src->pVC->Release (); + src->pVC = NULL; + } + + if (src->pVSC) { + src->pVSC->Release (); + src->pVSC = NULL; + } + +/* release the graph builder */ + if (src->graph_builder) { + src->graph_builder->Release (); + src->graph_builder = NULL; + src->filter_graph = NULL; + } + +/* release the capture builder */ + if (src->capture_builder) { + src->capture_builder->Release (); + src->capture_builder = NULL; + } + + /* reset caps */ + if (src->caps) { + gst_caps_unref (src->caps); + src->caps = NULL; + } + + /* reset device id */ + if (src->device) { + g_free (src->device); + src->device = NULL; + } + + if (src->video_cap_filter) { + src->video_cap_filter->Release (); + src->video_cap_filter = NULL; + } + + return TRUE; +} + +static gboolean +gst_dshowvideosrc_unlock (GstBaseSrc * bsrc) +{ + GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (bsrc); + + g_mutex_lock (&src->buffer_mutex); + src->stop_requested = TRUE; + g_cond_signal (&src->buffer_cond); + g_mutex_unlock (&src->buffer_mutex); + + return TRUE; +} + +static gboolean +gst_dshowvideosrc_unlock_stop (GstBaseSrc * bsrc) +{ + GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (bsrc); + + src->stop_requested = FALSE; + + return TRUE; +} + +static GstFlowReturn +gst_dshowvideosrc_create (GstPushSrc * psrc, GstBuffer ** buf) +{ + GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (psrc); + + g_mutex_lock (&src->buffer_mutex); + while (src->buffer == NULL && !src->stop_requested) + g_cond_wait (&src->buffer_cond, &src->buffer_mutex); + *buf = src->buffer; + src->buffer = NULL; + g_mutex_unlock (&src->buffer_mutex); + + if (src->stop_requested) { + if (*buf != NULL) { + gst_buffer_unref (*buf); + *buf = NULL; + } + return GST_FLOW_FLUSHING; + } + + GST_DEBUG ("dshowvideosrc_create => pts %" GST_TIME_FORMAT " duration %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (*buf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (*buf))); + + return GST_FLOW_OK; +} + +GstCaps * +gst_dshowvideosrc_getcaps_from_streamcaps (IPin * pin, GList ** pins_mediatypes) +{ + GstCaps *caps = NULL; + HRESULT hres = S_OK; + int icount = 0; + int isize = 0; + int i = 0; + IAMStreamConfig *streamcaps = NULL; + + hres = pin->QueryInterface (IID_IAMStreamConfig, (LPVOID *) & streamcaps); + if (FAILED (hres)) { + GST_ERROR ("Failed to retrieve IAMStreamConfig (error=0x%x)", hres); + return NULL; + } + + streamcaps->GetNumberOfCapabilities (&icount, &isize); + + if (isize != sizeof (VIDEO_STREAM_CONFIG_CAPS)) { + streamcaps->Release (); + return NULL; + } + + caps = gst_caps_new_empty (); + + for (i = 0; i < icount; i++) { + + GstCapturePinMediaType *pin_mediatype = + gst_dshow_new_pin_mediatype_from_streamcaps (pin, i, streamcaps); + + if (pin_mediatype) { + + GstCaps *mediacaps = NULL; + GstVideoFormat video_format = + gst_dshow_guid_to_gst_video_format (pin_mediatype->mediatype); + + if (video_format != GST_VIDEO_FORMAT_UNKNOWN) { + mediacaps = gst_dshow_new_video_caps (video_format, NULL, + pin_mediatype); + + } else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, + MEDIASUBTYPE_dvsd, FORMAT_VideoInfo)) { + mediacaps = + gst_dshow_new_video_caps (GST_VIDEO_FORMAT_UNKNOWN, + "video/x-dv, systemstream=FALSE", pin_mediatype); + + } else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, + MEDIASUBTYPE_dvsd, FORMAT_DvInfo)) { + mediacaps = + gst_dshow_new_video_caps (GST_VIDEO_FORMAT_UNKNOWN, + "video/x-dv, systemstream=TRUE", pin_mediatype); + + pin_mediatype->granularityWidth = 0; + pin_mediatype->granularityHeight = 0; + + } else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, + MEDIASUBTYPE_MJPG, FORMAT_VideoInfo)) { + mediacaps = + gst_dshow_new_video_caps (GST_VIDEO_FORMAT_ENCODED, + "image/jpeg", pin_mediatype); + + } else if (gst_dshow_check_mediatype (pin_mediatype->mediatype, + MEDIASUBTYPE_H264, FORMAT_VideoInfo)) { + mediacaps = + gst_dshow_new_video_caps (GST_VIDEO_FORMAT_ENCODED, + "video/x-h264", pin_mediatype); + } + + if (mediacaps) { + if (pins_mediatypes != NULL) { + *pins_mediatypes = g_list_append (*pins_mediatypes, pin_mediatype); + } + gst_caps_append (caps, mediacaps); + } else { + /* failed to convert dshow caps */ + gst_dshow_free_pin_mediatype (pin_mediatype); + } + } + } + + streamcaps->Release (); + + if (caps && gst_caps_is_empty (caps)) { + gst_caps_unref (caps); + caps = NULL; + } + + return caps; +} + +GstCaps * +gst_dshowvideosrc_getcaps_from_enum_mediatypes (IPin * pin, GList ** pins_mediatypes) +{ + GstCaps *caps = NULL; + IEnumMediaTypes *enum_mediatypes = NULL; + HRESULT hres = S_OK; + GstCapturePinMediaType *pin_mediatype = NULL; + + hres = pin->EnumMediaTypes (&enum_mediatypes); + if (FAILED (hres)) { + GST_ERROR ("Failed to retrieve IEnumMediaTypes (error=0x%x)", hres); + return NULL; + } + + caps = gst_caps_new_empty (); + + while ((pin_mediatype = gst_dshow_new_pin_mediatype_from_enum_mediatypes (pin, enum_mediatypes)) != NULL) { + + GstCaps *mediacaps = NULL; + GstVideoFormat video_format = gst_dshow_guid_to_gst_video_format (pin_mediatype->mediatype); + + if (video_format != GST_VIDEO_FORMAT_UNKNOWN) { + GstVideoInfo info; + + gst_video_info_init(&info); + gst_video_info_set_format(&info, video_format, pin_mediatype->defaultWidth, pin_mediatype->defaultHeight); + info.fps_n = pin_mediatype->defaultFPS; + info.fps_d = 1; + info.par_n = 1; + info.par_d = 1; + info.interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE; /* XXX is this correct ? */ + mediacaps = gst_video_info_to_caps(&info); + } + + if (mediacaps) { + if (pins_mediatypes != NULL) { + *pins_mediatypes = g_list_append (*pins_mediatypes, pin_mediatype); + } + gst_caps_append (caps, mediacaps); + } else { + /* failed to convert dshow caps */ + gst_dshow_free_pin_mediatype (pin_mediatype); + } + } + + enum_mediatypes->Release (); + + if (caps && gst_caps_is_empty (caps)) { + gst_caps_unref (caps); + caps = NULL; + } + + return caps; +} + +static gboolean +gst_dshowvideosrc_push_buffer (guint8 * buffer, guint size, gpointer src_object, + GstClockTime duration) +{ + GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (src_object); + GstBuffer *buf = NULL; + IPin *pPin = NULL; + HRESULT hres = S_FALSE; + AM_MEDIA_TYPE *pMediaType = NULL; + GstMapInfo info; + + if (!buffer || size == 0 || !src) { + return FALSE; + } + + /* create a new buffer assign to it the clock time as timestamp */ + buf = gst_buffer_new_and_alloc (size); + + gst_buffer_set_size(buf, size); + + GstClock *clock = gst_element_get_clock (GST_ELEMENT (src)); + GST_BUFFER_TIMESTAMP (buf) = + GST_CLOCK_DIFF (gst_element_get_base_time (GST_ELEMENT (src)), gst_clock_get_time (clock)); + gst_object_unref (clock); + + GST_BUFFER_DURATION (buf) = duration; + + if (!gst_buffer_map(buf, &info, GST_MAP_WRITE)) { + gst_buffer_unref(buf); + GST_ERROR("Failed to map buffer"); + return FALSE; + } + + if (src->is_rgb) { + /* FOR RGB directshow decoder will return bottom-up BITMAP + * There is probably a way to get top-bottom video frames from + * the decoder... + */ + gint line = 0; + gint stride = size / src->height; + + for (; line < src->height; line++) { + memcpy (info.data + (line * stride), + buffer + (size - ((line + 1) * (stride))), stride); + } + } else { + memcpy (info.data, buffer, size); + } + + gst_buffer_unmap(buf, &info); + + GST_DEBUG ("push_buffer => pts %" GST_TIME_FORMAT "duration %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), + GST_TIME_ARGS (duration)); + + g_mutex_lock (&src->buffer_mutex); + if (src->buffer != NULL) + gst_buffer_unref (src->buffer); + src->buffer = buf; + g_cond_signal (&src->buffer_cond); + g_mutex_unlock (&src->buffer_mutex); + + return TRUE; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/gstdshowvideosrc.h
Added
@@ -0,0 +1,109 @@ +/* GStreamer + * Copyright (C) 2007 Sebastien Moutte <sebastien@moutte.net> + * + * gstdshowvideosrc.h: + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_DSHOWVIDEOSRC_H__ +#define __GST_DSHOWVIDEOSRC_H__ + +#include <glib.h> +#include <gst/gst.h> +#include <gst/base/gstpushsrc.h> + +#include "gstdshow.h" +#include "gstdshowfakesink.h" + +// 30323449-0000-0010-8000-00AA00389B71 MEDIASUBTYPE_I420 +DEFINE_GUID (MEDIASUBTYPE_I420, 0x30323449, 0x0000, 0x0010, 0x80, 0x00, 0x00, + 0xAA, 0x00, 0x38, 0x9B, 0x71); +DEFINE_GUID (MEDIASUBTYPE_UYVY, 0x59565955, 0x0000, 0x0010, 0x80, 0x00, 0x00, + 0xAA, 0x00, 0x38, 0x9B, 0x71); + +G_BEGIN_DECLS +#define GST_TYPE_DSHOWVIDEOSRC (gst_dshowvideosrc_get_type()) +#define GST_DSHOWVIDEOSRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DSHOWVIDEOSRC,GstDshowVideoSrc)) +#define GST_DSHOWVIDEOSRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DSHOWVIDEOSRC,GstDshowVideoSrcClass)) +#define GST_IS_DSHOWVIDEOSRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DSHOWVIDEOSRC)) +#define GST_IS_DSHOWVIDEOSRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DSHOWVIDEOSRC)) +typedef struct _GstDshowVideoSrc GstDshowVideoSrc; +typedef struct _GstDshowVideoSrcClass GstDshowVideoSrcClass; + + +struct _GstDshowVideoSrc +{ + GstPushSrc src; + + /* device dshow reference (generally classid/name) */ + gchar *device; + + /* device friendly name */ + gchar *device_name; + + /* device index */ + gint device_index; + + /* list of caps created from the list of supported media types of the dshow capture filter */ + GstCaps *caps; + + /* list of dshow media types from the filter's capture pins */ + GList *pins_mediatypes; + + /* dshow video capture filter */ + IBaseFilter *video_cap_filter; + + /* dshow sink filter */ + CDshowFakeSink *dshow_fakesink; + + /* graph manager interfaces */ + IMediaFilter *media_filter; + IFilterGraph *filter_graph; + + IGraphBuilder *graph_builder; + ICaptureGraphBuilder2 *capture_builder; + IAMVideoCompression *pVC; + //IAMVfwCaptureDialogs *pDlg; + //IAMStreamConfig *pASC; // for audio cap + IAMStreamConfig *pVSC; // for video cap + + /* the last buffer from DirectShow */ + GCond buffer_cond; + GMutex buffer_mutex; + GstBuffer *buffer; + gboolean stop_requested; + + gboolean is_rgb; + gboolean is_running; + gint width; + gint height; +}; + +struct _GstDshowVideoSrcClass +{ + GstPushSrcClass parent_class; +}; + +GType gst_dshowvideosrc_get_type (void); + + +GstCaps * gst_dshowvideosrc_getcaps_from_capture_filter (IBaseFilter * filter, + GList ** pins_mediatypes); + + +G_END_DECLS +#endif /* __GST_DSHOWVIDEOSRC_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/meson.build
Added
@@ -0,0 +1,73 @@ +dshow_sources = + 'dshowdeviceprovider.cpp', + 'dshowvideofakesrc.cpp', + 'dshowvideosink.cpp', + 'gstdshow.cpp', + 'gstdshowaudiodec.cpp', + 'gstdshowaudiosrc.cpp', + 'gstdshowfakesink.cpp', + 'gstdshowfakesrc.cpp', + 'gstdshowutil.cpp', + 'gstdshowvideodec.cpp', + 'gstdshowvideosrc.cpp', + 'plugin.cpp', + + +dshow_option = get_option('directshow') + +if cxx.get_id() != 'msvc' or dshow_option.disabled() + if get_option('directshow').enabled() + error('directshow plugins can only be built with MSVC') + endif + subdir_done() +endif + +if host_system == 'windows' + # Check whether we're building for UWP apps + code = ''' + #include <windows.h> + #if !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) + #error "Not building for UWP" + #endif''' + if cxx.compiles(code, name: 'building for UWP') + if dshow_option.enabled() + error('directshow plugins cannot be built for UWP') + endif + subdir_done() + endif +endif + +subdir('strmbase') + +winmm_lib = cxx.find_library('winmm', required: dshow_option) +dmoguids_lib = cxx.find_library('dmoguids', required: dshow_option) +wmcodecdspuuid_lib = cxx.find_library('wmcodecdspuuid', required: dshow_option) +mfuuid_dep = cxx.find_library('mfuuid', required: dshow_option) +rpcrt4_dep = cxx.find_library('rpcrt4', required: dshow_option) + +dshow_deps = + strmbase_dep, + winmm_lib, + dmoguids_lib, + wmcodecdspuuid_lib, + mfuuid_dep, + rpcrt4_dep + + +foreach dep: dshow_deps + if not dep.found() + subdir_done() + endif +endforeach + +gstdirectshow = library('gstdirectshow', + dshow_sources, + c_args: gst_plugins_bad_args, + cpp_args: gst_plugins_bad_args, + include_directories: configinc, + dependencies: gstvideo_dep, gstaudio_dep + dshow_deps, + install: true, + install_dir: plugins_install_dir, + override_options: 'cpp_std=none' +) +plugins += gstdirectshow
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/plugin.cpp
Added
@@ -0,0 +1,72 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * plugin-directshow: + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> + +#include "dshowvideosink.h" +#include "gstdshowaudiodec.h" +#include "gstdshowvideodec.h" +#include "gstdshowaudiosrc.h" +#include "gstdshowvideosrc.h" +#include "dshowdeviceprovider.h" + +GST_DEBUG_CATEGORY (dshowdec_debug); +GST_DEBUG_CATEGORY (dshowsrcwrapper_debug); +GST_DEBUG_CATEGORY (dshowvideosrc_debug); + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (dshowdec_debug, "dshowdec", 0, "DirectShow decoder"); + GST_DEBUG_CATEGORY_INIT (dshowsrcwrapper_debug, "dshowsrcwrapper", 0, + "DirectShow source wrapper"); + GST_DEBUG_CATEGORY_INIT (dshowvideosrc_debug, "dshowvideosrc", 0, + "Directshow video source"); + + dshow_adec_register (plugin); + dshow_vdec_register (plugin); + + gst_element_register (plugin, "dshowvideosink", + GST_RANK_MARGINAL, GST_TYPE_DSHOWVIDEOSINK); + gst_element_register (plugin, "dshowaudiosrc", + GST_RANK_NONE, GST_TYPE_DSHOWAUDIOSRC); + gst_element_register (plugin, "dshowvideosrc", + GST_RANK_NONE, GST_TYPE_DSHOWVIDEOSRC); + + gst_device_provider_register (plugin, "dshowdeviceprovider", + GST_RANK_NONE, GST_TYPE_DSHOW_DEVICE_PROVIDER); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + directshow, + "DirectShow plugin", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/LICENSE
Added
@@ -0,0 +1,24 @@ +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +Portions of this repo are provided under the SIL Open Font License. +See the LICENSE file in individual samples for additional details.
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/amextra.cpp
Added
@@ -0,0 +1,111 @@ +//------------------------------------------------------------------------------ +// File: AMExtra.cpp +// +// Desc: DirectShow base classes - implements CRenderedInputPin class. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> // DirectShow base class definitions +#include <mmsystem.h> // Needed for definition of timeGetTime +#include <limits.h> // Standard data type limit definitions +#include <measure.h> // Used for time critical log functions + +#include "amextra.h" + +#pragma warning(disable:4355) + +// Implements CRenderedInputPin class + +CRenderedInputPin::CRenderedInputPin(__in_opt LPCTSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName) : + CBaseInputPin(pObjectName, pFilter, pLock, phr, pName), + m_bAtEndOfStream(FALSE), + m_bCompleteNotified(FALSE) +{ +} +#ifdef UNICODE +CRenderedInputPin::CRenderedInputPin(__in_opt LPCSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName) : + CBaseInputPin(pObjectName, pFilter, pLock, phr, pName), + m_bAtEndOfStream(FALSE), + m_bCompleteNotified(FALSE) +{ +} +#endif + +// Flush end of stream condition - caller should do any +// necessary stream level locking before calling this + +STDMETHODIMP CRenderedInputPin::EndOfStream() +{ + HRESULT hr = CheckStreaming(); + + // Do EC_COMPLETE handling for rendered pins + if (S_OK == hr && !m_bAtEndOfStream) { + m_bAtEndOfStream = TRUE; + FILTER_STATE fs; + EXECUTE_ASSERT(SUCCEEDED(m_pFilter->GetState(0, &fs))); + if (fs == State_Running) { + DoCompleteHandling(); + } + } + return hr; +} + + +// Called to complete the flush + +STDMETHODIMP CRenderedInputPin::EndFlush() +{ + CAutoLock lck(m_pLock); + + // Clean up renderer state + m_bAtEndOfStream = FALSE; + m_bCompleteNotified = FALSE; + + return CBaseInputPin::EndFlush(); +} + + +// Notify of Run() from filter + +HRESULT CRenderedInputPin::Run(REFERENCE_TIME tStart) +{ + UNREFERENCED_PARAMETER(tStart); + m_bCompleteNotified = FALSE; + if (m_bAtEndOfStream) { + DoCompleteHandling(); + } + return S_OK; +} + + +// Clear status on going into paused state + +HRESULT CRenderedInputPin::Active() +{ + m_bAtEndOfStream = FALSE; + m_bCompleteNotified = FALSE; + return CBaseInputPin::Active(); +} + + +// Do stuff to deliver end of stream + +void CRenderedInputPin::DoCompleteHandling() +{ + ASSERT(m_bAtEndOfStream); + if (!m_bCompleteNotified) { + m_bCompleteNotified = TRUE; + m_pFilter->NotifyEvent(EC_COMPLETE, S_OK, (LONG_PTR)(IBaseFilter *)m_pFilter); + } +} +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/amextra.h
Added
@@ -0,0 +1,56 @@ +//------------------------------------------------------------------------------ +// File: AMExtra.h +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __AMEXTRA__ +#define __AMEXTRA__ + +// Simple rendered input pin +// +// NOTE if your filter queues stuff before rendering then it may not be +// appropriate to use this class +// +// In that case queue the end of stream condition until the last sample +// is actually rendered and flush the condition appropriately + +class CRenderedInputPin : public CBaseInputPin +{ +public: + + CRenderedInputPin(__in_opt LPCTSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName); +#ifdef UNICODE + CRenderedInputPin(__in_opt LPCSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName); +#endif + + // Override methods to track end of stream state + STDMETHODIMP EndOfStream(); + STDMETHODIMP EndFlush(); + + HRESULT Active(); + HRESULT Run(REFERENCE_TIME tStart); + +protected: + + // Member variables to track state + BOOL m_bAtEndOfStream; // Set by EndOfStream + BOOL m_bCompleteNotified; // Set when we notify for EC_COMPLETE + +private: + void DoCompleteHandling(); +}; + +#endif // __AMEXTRA__ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/amfilter.cpp
Added
@@ -0,0 +1,5358 @@ +//------------------------------------------------------------------------------ +// File: AMFilter.cpp +// +// Desc: DirectShow base classes - implements class hierarchy for streams +// architecture. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +//===================================================================== +//===================================================================== +// The following classes are declared in this header: +// +// +// CBaseMediaFilter Basic IMediaFilter support (abstract class) +// CBaseFilter Support for IBaseFilter (incl. IMediaFilter) +// CEnumPins Enumerate input and output pins +// CEnumMediaTypes Enumerate the preferred pin formats +// CBasePin Abstract base class for IPin interface +// CBaseOutputPin Adds data provider member functions +// CBaseInputPin Implements IMemInputPin interface +// CMediaSample Basic transport unit for IMemInputPin +// CBaseAllocator General list guff for most allocators +// CMemAllocator Implements memory buffer allocation +// +//===================================================================== +//===================================================================== + +#include <streams.h> +#include <strsafe.h> + +#ifdef DXMPERF +#include "dxmperf.h" +#endif // DXMPERF + + +//===================================================================== +// Helpers +//===================================================================== +STDAPI CreateMemoryAllocator(__deref_out IMemAllocator **ppAllocator) +{ + return CoCreateInstance(CLSID_MemoryAllocator, + 0, + CLSCTX_INPROC_SERVER, + IID_IMemAllocator, + (void **)ppAllocator); +} + +// Put this one here rather than in ctlutil.cpp to avoid linking +// anything brought in by ctlutil.cpp +STDAPI CreatePosPassThru( + __in_opt LPUNKNOWN pAgg, + BOOL bRenderer, + IPin *pPin, + __deref_out IUnknown **ppPassThru +) +{ + *ppPassThru = NULL; + IUnknown *pUnkSeek; + HRESULT hr = CoCreateInstance(CLSID_SeekingPassThru, + pAgg, + CLSCTX_INPROC_SERVER, + IID_IUnknown, + (void **)&pUnkSeek + ); + if (FAILED(hr)) { + return hr; + } + + ISeekingPassThru *pPassThru; + hr = pUnkSeek->QueryInterface(IID_ISeekingPassThru, (void**)&pPassThru); + if (FAILED(hr)) { + pUnkSeek->Release(); + return hr; + } + hr = pPassThru->Init(bRenderer, pPin); + pPassThru->Release(); + if (FAILED(hr)) { + pUnkSeek->Release(); + return hr; + } + *ppPassThru = pUnkSeek; + return S_OK; +} + + + +#define CONNECT_TRACE_LEVEL 3 + +//===================================================================== +//===================================================================== +// Implements CBaseMediaFilter +//===================================================================== +//===================================================================== + + +/* Constructor */ + +CBaseMediaFilter::CBaseMediaFilter(__in_opt LPCTSTR pName, + __inout_opt LPUNKNOWN pUnk, + __in CCritSec *pLock, + REFCLSID clsid) : + CUnknown(pName, pUnk), + m_pLock(pLock), + m_clsid(clsid), + m_State(State_Stopped), + m_pClock(NULL) +{ +} + + +/* Destructor */ + +CBaseMediaFilter::~CBaseMediaFilter() +{ + // must be stopped, but can't call Stop here since + // our critsec has been destroyed. + + /* Release any clock we were using */ + + if (m_pClock) { + m_pClock->Release(); + m_pClock = NULL; + } +} + + +/* Override this to say what interfaces we support and where */ + +STDMETHODIMP +CBaseMediaFilter::NonDelegatingQueryInterface( + REFIID riid, + __deref_out void ** ppv) +{ + if (riid == IID_IMediaFilter) { + return GetInterface((IMediaFilter *) this, ppv); + } else if (riid == IID_IPersist) { + return GetInterface((IPersist *) this, ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } +} + +/* Return the filter's clsid */ +STDMETHODIMP +CBaseMediaFilter::GetClassID(__out CLSID *pClsID) +{ + CheckPointer(pClsID,E_POINTER); + ValidateReadWritePtr(pClsID,sizeof(CLSID)); + *pClsID = m_clsid; + return NOERROR; +} + +/* Override this if your state changes are not done synchronously */ + +STDMETHODIMP +CBaseMediaFilter::GetState(DWORD dwMSecs, __out FILTER_STATE *State) +{ + UNREFERENCED_PARAMETER(dwMSecs); + CheckPointer(State,E_POINTER); + ValidateReadWritePtr(State,sizeof(FILTER_STATE)); + + *State = m_State; + return S_OK; +} + + +/* Set the clock we will use for synchronisation */ + +STDMETHODIMP +CBaseMediaFilter::SetSyncSource(__inout_opt IReferenceClock *pClock) +{ + CAutoLock cObjectLock(m_pLock); + + // Ensure the new one does not go away - even if the same as the old + if (pClock) { + pClock->AddRef(); + } + + // if we have a clock, release it + if (m_pClock) { + m_pClock->Release(); + } + + // Set the new reference clock (might be NULL) + // Should we query it to ensure it is a clock? Consider for a debug build. + m_pClock = pClock; + + return NOERROR; +} + +/* Return the clock we are using for synchronisation */ +STDMETHODIMP +CBaseMediaFilter::GetSyncSource(__deref_out_opt IReferenceClock **pClock) +{ + CheckPointer(pClock,E_POINTER); + ValidateReadWritePtr(pClock,sizeof(IReferenceClock *)); + CAutoLock cObjectLock(m_pLock); + + if (m_pClock) { + // returning an interface... addref it... + m_pClock->AddRef(); + } + *pClock = (IReferenceClock*)m_pClock; + return NOERROR; +} + + +/* Put the filter into a stopped state */ + +STDMETHODIMP +CBaseMediaFilter::Stop() +{ + CAutoLock cObjectLock(m_pLock); + + m_State = State_Stopped; + return S_OK; +} + + +/* Put the filter into a paused state */ + +STDMETHODIMP +CBaseMediaFilter::Pause() +{ + CAutoLock cObjectLock(m_pLock); + + m_State = State_Paused; + return S_OK; +} + + +// Put the filter into a running state. + +// The time parameter is the offset to be added to the samples' +// stream time to get the reference time at which they should be presented. +// +// you can either add these two and compare it against the reference clock, +// or you can call CBaseMediaFilter::StreamTime and compare that against +// the sample timestamp. + +STDMETHODIMP +CBaseMediaFilter::Run(REFERENCE_TIME tStart) +{ + CAutoLock cObjectLock(m_pLock); + + // remember the stream time offset + m_tStart = tStart; + + if (m_State == State_Stopped){ + HRESULT hr = Pause(); + + if (FAILED(hr)) { + return hr; + } + } + m_State = State_Running; + return S_OK; +} + + +// +// return the current stream time - samples with start timestamps of this +// time or before should be rendered by now +HRESULT +CBaseMediaFilter::StreamTime(CRefTime& rtStream) +{ + // Caller must lock for synchronization + // We can't grab the filter lock because we want to be able to call + // this from worker threads without deadlocking + + if (m_pClock == NULL) { + return VFW_E_NO_CLOCK; + } + + // get the current reference time + HRESULT hr = m_pClock->GetTime((REFERENCE_TIME*)&rtStream); + if (FAILED(hr)) { + return hr; + } + + // subtract the stream offset to get stream time + rtStream -= m_tStart; + + return S_OK; +} + + +//===================================================================== +//===================================================================== +// Implements CBaseFilter +//===================================================================== +//===================================================================== + + +/* Override this to say what interfaces we support and where */ + +STDMETHODIMP CBaseFilter::NonDelegatingQueryInterface(REFIID riid, + __deref_out void **ppv) +{ + /* Do we have this interface */ + + if (riid == IID_IBaseFilter) { + return GetInterface((IBaseFilter *) this, ppv); + } else if (riid == IID_IMediaFilter) { + return GetInterface((IMediaFilter *) this, ppv); + } else if (riid == IID_IPersist) { + return GetInterface((IPersist *) this, ppv); + } else if (riid == IID_IAMovieSetup) { + return GetInterface((IAMovieSetup *) this, ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } +} + +#ifdef DEBUG +STDMETHODIMP_(ULONG) CBaseFilter::NonDelegatingRelease() +{ + if (m_cRef == 1) { + KASSERT(m_pGraph == NULL); + } + return CUnknown::NonDelegatingRelease(); +} +#endif + + +/* Constructor */ + +CBaseFilter::CBaseFilter(__in_opt LPCTSTR pName, + __inout_opt LPUNKNOWN pUnk, + __in CCritSec *pLock, + REFCLSID clsid) : + CUnknown( pName, pUnk ), + m_pLock(pLock), + m_clsid(clsid), + m_State(State_Stopped), + m_pClock(NULL), + m_pGraph(NULL), + m_pSink(NULL), + m_pName(NULL), + m_PinVersion(1) +{ +#ifdef DXMPERF + PERFLOG_CTOR( pName ? pName : L"CBaseFilter", (IBaseFilter *) this ); +#endif // DXMPERF + + ASSERT(pLock != NULL); +} + +/* Passes in a redundant HRESULT argument */ + +CBaseFilter::CBaseFilter(__in_opt LPCTSTR pName, + __in_opt LPUNKNOWN pUnk, + __in CCritSec *pLock, + REFCLSID clsid, + __inout HRESULT *phr) : + CUnknown( pName, pUnk ), + m_pLock(pLock), + m_clsid(clsid), + m_State(State_Stopped), + m_pClock(NULL), + m_pGraph(NULL), + m_pSink(NULL), + m_pName(NULL), + m_PinVersion(1) +{ +#ifdef DXMPERF + PERFLOG_CTOR( pName ? pName : L"CBaseFilter", (IBaseFilter *) this ); +#endif // DXMPERF + + ASSERT(pLock != NULL); + UNREFERENCED_PARAMETER(phr); +} + +#ifdef UNICODE +CBaseFilter::CBaseFilter(__in_opt LPCSTR pName, + __in_opt LPUNKNOWN pUnk, + __in CCritSec *pLock, + REFCLSID clsid) : + CUnknown( pName, pUnk ), + m_pLock(pLock), + m_clsid(clsid), + m_State(State_Stopped), + m_pClock(NULL), + m_pGraph(NULL), + m_pSink(NULL), + m_pName(NULL), + m_PinVersion(1) +{ +#ifdef DXMPERF + PERFLOG_CTOR( L"CBaseFilter", (IBaseFilter *) this ); +#endif // DXMPERF + + ASSERT(pLock != NULL); +} +CBaseFilter::CBaseFilter(__in_opt LPCSTR pName, + __in_opt LPUNKNOWN pUnk, + __in CCritSec *pLock, + REFCLSID clsid, + __inout HRESULT *phr) : + CUnknown( pName, pUnk ), + m_pLock(pLock), + m_clsid(clsid), + m_State(State_Stopped), + m_pClock(NULL), + m_pGraph(NULL), + m_pSink(NULL), + m_pName(NULL), + m_PinVersion(1) +{ +#ifdef DXMPERF + PERFLOG_CTOR( L"CBaseFilter", (IBaseFilter *) this ); +#endif // DXMPERF + + ASSERT(pLock != NULL); + UNREFERENCED_PARAMETER(phr); +} +#endif + +/* Destructor */ + +CBaseFilter::~CBaseFilter() +{ +#ifdef DXMPERF + PERFLOG_DTOR( L"CBaseFilter", (IBaseFilter *) this ); +#endif // DXMPERF + + // NOTE we do NOT hold references on the filtergraph for m_pGraph or m_pSink + // When we did we had the circular reference problem. Nothing would go away. + + delete m_pName; + + // must be stopped, but can't call Stop here since + // our critsec has been destroyed. + + /* Release any clock we were using */ + if (m_pClock) { + m_pClock->Release(); + m_pClock = NULL; + } +} + +/* Return the filter's clsid */ +STDMETHODIMP +CBaseFilter::GetClassID(__out CLSID *pClsID) +{ + CheckPointer(pClsID,E_POINTER); + ValidateReadWritePtr(pClsID,sizeof(CLSID)); + *pClsID = m_clsid; + return NOERROR; +} + +/* Override this if your state changes are not done synchronously */ +STDMETHODIMP +CBaseFilter::GetState(DWORD dwMSecs, __out FILTER_STATE *State) +{ + UNREFERENCED_PARAMETER(dwMSecs); + CheckPointer(State,E_POINTER); + ValidateReadWritePtr(State,sizeof(FILTER_STATE)); + + *State = m_State; + return S_OK; +} + + +/* Set the clock we will use for synchronisation */ + +STDMETHODIMP +CBaseFilter::SetSyncSource(__in_opt IReferenceClock *pClock) +{ + CAutoLock cObjectLock(m_pLock); + + // Ensure the new one does not go away - even if the same as the old + if (pClock) { + pClock->AddRef(); + } + + // if we have a clock, release it + if (m_pClock) { + m_pClock->Release(); + } + + // Set the new reference clock (might be NULL) + // Should we query it to ensure it is a clock? Consider for a debug build. + m_pClock = pClock; + + return NOERROR; +} + +/* Return the clock we are using for synchronisation */ +STDMETHODIMP +CBaseFilter::GetSyncSource(__deref_out_opt IReferenceClock **pClock) +{ + CheckPointer(pClock,E_POINTER); + ValidateReadWritePtr(pClock,sizeof(IReferenceClock *)); + CAutoLock cObjectLock(m_pLock); + + if (m_pClock) { + // returning an interface... addref it... + m_pClock->AddRef(); + } + *pClock = (IReferenceClock*)m_pClock; + return NOERROR; +} + + + +// override CBaseMediaFilter Stop method, to deactivate any pins this +// filter has. +STDMETHODIMP +CBaseFilter::Stop() +{ + CAutoLock cObjectLock(m_pLock); + HRESULT hr = NOERROR; + + // notify all pins of the state change + if (m_State != State_Stopped) { + int cPins = GetPinCount(); + for (int c = 0; c < cPins; c++) { + + CBasePin *pPin = GetPin(c); + if (NULL == pPin) { + break; + } + + // Disconnected pins are not activated - this saves pins worrying + // about this state themselves. We ignore the return code to make + // sure everyone is inactivated regardless. The base input pin + // class can return an error if it has no allocator but Stop can + // be used to resync the graph state after something has gone bad + + if (pPin->IsConnected()) { + HRESULT hrTmp = pPin->Inactive(); + if (FAILED(hrTmp) && SUCCEEDED(hr)) { + hr = hrTmp; + } + } + } + } + +#ifdef DXMPERF + PERFLOG_STOP( m_pName ? m_pName : L"CBaseFilter", (IBaseFilter *) this, m_State ); +#endif // DXMPERF + + m_State = State_Stopped; + return hr; +} + + +// override CBaseMediaFilter Pause method to activate any pins +// this filter has (also called from Run) + +STDMETHODIMP +CBaseFilter::Pause() +{ + CAutoLock cObjectLock(m_pLock); + + // notify all pins of the change to active state + if (m_State == State_Stopped) { + int cPins = GetPinCount(); + for (int c = 0; c < cPins; c++) { + + CBasePin *pPin = GetPin(c); + if (NULL == pPin) { + break; + } + + // Disconnected pins are not activated - this saves pins + // worrying about this state themselves + + if (pPin->IsConnected()) { + HRESULT hr = pPin->Active(); + if (FAILED(hr)) { + return hr; + } + } + } + } + + +#ifdef DXMPERF + PERFLOG_PAUSE( m_pName ? m_pName : L"CBaseFilter", (IBaseFilter *) this, m_State ); +#endif // DXMPERF + + m_State = State_Paused; + return S_OK; +} + +// Put the filter into a running state. + +// The time parameter is the offset to be added to the samples' +// stream time to get the reference time at which they should be presented. +// +// you can either add these two and compare it against the reference clock, +// or you can call CBaseFilter::StreamTime and compare that against +// the sample timestamp. + +STDMETHODIMP +CBaseFilter::Run(REFERENCE_TIME tStart) +{ + CAutoLock cObjectLock(m_pLock); + + // remember the stream time offset + m_tStart = tStart; + + if (m_State == State_Stopped){ + HRESULT hr = Pause(); + + if (FAILED(hr)) { + return hr; + } + } + // notify all pins of the change to active state + if (m_State != State_Running) { + int cPins = GetPinCount(); + for (int c = 0; c < cPins; c++) { + + CBasePin *pPin = GetPin(c); + if (NULL == pPin) { + break; + } + + // Disconnected pins are not activated - this saves pins + // worrying about this state themselves + + if (pPin->IsConnected()) { + HRESULT hr = pPin->Run(tStart); + if (FAILED(hr)) { + return hr; + } + } + } + } + +#ifdef DXMPERF + PERFLOG_RUN( m_pName ? m_pName : L"CBaseFilter", (IBaseFilter *) this, tStart, m_State ); +#endif // DXMPERF + + m_State = State_Running; + return S_OK; +} + +// +// return the current stream time - samples with start timestamps of this +// time or before should be rendered by now +HRESULT +CBaseFilter::StreamTime(CRefTime& rtStream) +{ + // Caller must lock for synchronization + // We can't grab the filter lock because we want to be able to call + // this from worker threads without deadlocking + + if (m_pClock == NULL) { + return VFW_E_NO_CLOCK; + } + + // get the current reference time + HRESULT hr = m_pClock->GetTime((REFERENCE_TIME*)&rtStream); + if (FAILED(hr)) { + return hr; + } + + // subtract the stream offset to get stream time + rtStream -= m_tStart; + + return S_OK; +} + + +/* Create an enumerator for the pins attached to this filter */ + +STDMETHODIMP +CBaseFilter::EnumPins(__deref_out IEnumPins **ppEnum) +{ + CheckPointer(ppEnum,E_POINTER); + ValidateReadWritePtr(ppEnum,sizeof(IEnumPins *)); + + /* Create a new ref counted enumerator */ + + *ppEnum = new CEnumPins(this, + NULL); + + return *ppEnum == NULL ? E_OUTOFMEMORY : NOERROR; +} + + +// default behaviour of FindPin is to assume pins are named +// by their pin names +STDMETHODIMP +CBaseFilter::FindPin( + LPCWSTR Id, + __deref_out IPin ** ppPin +) +{ + CheckPointer(ppPin,E_POINTER); + ValidateReadWritePtr(ppPin,sizeof(IPin *)); + + // We're going to search the pin list so maintain integrity + CAutoLock lck(m_pLock); + int iCount = GetPinCount(); + for (int i = 0; i < iCount; i++) { + CBasePin *pPin = GetPin(i); + if (NULL == pPin) { + break; + } + + if (0 == lstrcmpW(pPin->Name(), Id)) { + // Found one that matches + // + // AddRef() and return it + *ppPin = pPin; + pPin->AddRef(); + return S_OK; + } + } + *ppPin = NULL; + return VFW_E_NOT_FOUND; +} + +/* Return information about this filter */ + +STDMETHODIMP +CBaseFilter::QueryFilterInfo(__out FILTER_INFO * pInfo) +{ + CheckPointer(pInfo,E_POINTER); + ValidateReadWritePtr(pInfo,sizeof(FILTER_INFO)); + + if (m_pName) { + (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName); + } else { + pInfo->achName0 = L'\0'; + } + pInfo->pGraph = m_pGraph; + if (m_pGraph) + m_pGraph->AddRef(); + return NOERROR; +} + + +/* Provide the filter with a filter graph */ + +STDMETHODIMP +CBaseFilter::JoinFilterGraph( + __inout_opt IFilterGraph * pGraph, + __in_opt LPCWSTR pName) +{ + CAutoLock cObjectLock(m_pLock); + + // NOTE: we no longer hold references on the graph (m_pGraph, m_pSink) + + m_pGraph = pGraph; + if (m_pGraph) { + HRESULT hr = m_pGraph->QueryInterface(IID_IMediaEventSink, + (void**) &m_pSink); + if (FAILED(hr)) { + ASSERT(m_pSink == NULL); + } + else m_pSink->Release(); // we do NOT keep a reference on it. + } else { + // if graph pointer is null, then we should + // also release the IMediaEventSink on the same object - we don't + // refcount it, so just set it to null + m_pSink = NULL; + } + + + if (m_pName) { + delete m_pName; + m_pName = NULL; + } + + if (pName) { + size_t namelen; + HRESULT hr = StringCchLengthW(pName, STRSAFE_MAX_CCH, &namelen); + if (FAILED(hr)) { + return hr; + } + m_pName = new WCHARnamelen + 1; + if (m_pName) { + (void)StringCchCopyW(m_pName, namelen + 1, pName); + } else { + return E_OUTOFMEMORY; + } + } + +#ifdef DXMPERF + PERFLOG_JOINGRAPH( m_pName ? m_pName : L"CBaseFilter",(IBaseFilter *) this, pGraph ); +#endif // DXMPERF + + return NOERROR; +} + + +// return a Vendor information string. Optional - may return E_NOTIMPL. +// memory returned should be freed using CoTaskMemFree +// default implementation returns E_NOTIMPL +STDMETHODIMP +CBaseFilter::QueryVendorInfo( + __deref_out LPWSTR* pVendorInfo) +{ + UNREFERENCED_PARAMETER(pVendorInfo); + return E_NOTIMPL; +} + + +// send an event notification to the filter graph if we know about it. +// returns S_OK if delivered, S_FALSE if the filter graph does not sink +// events, or an error otherwise. +HRESULT +CBaseFilter::NotifyEvent( + long EventCode, + LONG_PTR EventParam1, + LONG_PTR EventParam2) +{ + // Snapshot so we don't have to lock up + IMediaEventSink *pSink = m_pSink; + if (pSink) { + if (EC_COMPLETE == EventCode) { + EventParam2 = (LONG_PTR)(IBaseFilter*)this; + } + + return pSink->Notify(EventCode, EventParam1, EventParam2); + } else { + return E_NOTIMPL; + } +} + +// Request reconnect +// pPin is the pin to reconnect +// pmt is the type to reconnect with - can be NULL +// Calls ReconnectEx on the filter graph +HRESULT +CBaseFilter::ReconnectPin( + IPin *pPin, + __in_opt AM_MEDIA_TYPE const *pmt +) +{ + IFilterGraph2 *pGraph2; + if (m_pGraph != NULL) { + HRESULT hr = m_pGraph->QueryInterface(IID_IFilterGraph2, (void **)&pGraph2); + if (SUCCEEDED(hr)) { + hr = pGraph2->ReconnectEx(pPin, pmt); + pGraph2->Release(); + return hr; + } else { + return m_pGraph->Reconnect(pPin); + } + } else { + return E_NOINTERFACE; + } +} + + + +/* This is the same idea as the media type version does for type enumeration + on pins but for the list of pins available. So if the list of pins you + provide changes dynamically then either override this virtual function + to provide the version number, or more simply call IncrementPinVersion */ + +LONG CBaseFilter::GetPinVersion() +{ + return m_PinVersion; +} + + +/* Increment the current pin version cookie */ + +void CBaseFilter::IncrementPinVersion() +{ + InterlockedIncrement(&m_PinVersion); +} + +/* register filter */ + +STDMETHODIMP CBaseFilter::Register() +{ + // get setup data, if it exists + // + LPAMOVIESETUP_FILTER psetupdata = GetSetupData(); + + // check we've got data + // + if( NULL == psetupdata ) return S_FALSE; + + // init is ref counted so call just in case + // we're being called cold. + // + HRESULT hr = CoInitialize( (LPVOID)NULL ); + ASSERT( SUCCEEDED(hr) ); + + // get hold of IFilterMapper + // + IFilterMapper *pIFM; + hr = CoCreateInstance( CLSID_FilterMapper + , NULL + , CLSCTX_INPROC_SERVER + , IID_IFilterMapper + , (void **)&pIFM ); + if( SUCCEEDED(hr) ) + { + hr = AMovieSetupRegisterFilter( psetupdata, pIFM, TRUE ); + pIFM->Release(); + } + + // and clear up + // + CoFreeUnusedLibraries(); + CoUninitialize(); + + return NOERROR; +} + + +/* unregister filter */ + +STDMETHODIMP CBaseFilter::Unregister() +{ + // get setup data, if it exists + // + LPAMOVIESETUP_FILTER psetupdata = GetSetupData(); + + // check we've got data + // + if( NULL == psetupdata ) return S_FALSE; + + // OLE init is ref counted so call + // just in case we're being called cold. + // + HRESULT hr = CoInitialize( (LPVOID)NULL ); + ASSERT( SUCCEEDED(hr) ); + + // get hold of IFilterMapper + // + IFilterMapper *pIFM; + hr = CoCreateInstance( CLSID_FilterMapper + , NULL + , CLSCTX_INPROC_SERVER + , IID_IFilterMapper + , (void **)&pIFM ); + if( SUCCEEDED(hr) ) + { + hr = AMovieSetupRegisterFilter( psetupdata, pIFM, FALSE ); + + // release interface + // + pIFM->Release(); + } + + // clear up + // + CoFreeUnusedLibraries(); + CoUninitialize(); + + // handle one acceptable "error" - that + // of filter not being registered! + // (couldn't find a suitable #define'd + // name for the error!) + // + if( 0x80070002 == hr) + return NOERROR; + else + return hr; +} + + +//===================================================================== +//===================================================================== +// Implements CEnumPins +//===================================================================== +//===================================================================== + + +CEnumPins::CEnumPins(__in CBaseFilter *pFilter, + __in_opt CEnumPins *pEnumPins) : + m_Position(0), + m_PinCount(0), + m_pFilter(pFilter), + m_cRef(1), // Already ref counted + m_PinCache(NAME("Pin Cache")) +{ + +#ifdef DEBUG + m_dwCookie = DbgRegisterObjectCreation("CEnumPins", 0); +#endif + + /* We must be owned by a filter derived from CBaseFilter */ + + ASSERT(pFilter != NULL); + + /* Hold a reference count on our filter */ + m_pFilter->AddRef(); + + /* Are we creating a new enumerator */ + + if (pEnumPins == NULL) { + m_Version = m_pFilter->GetPinVersion(); + m_PinCount = m_pFilter->GetPinCount(); + } else { + ASSERT(m_Position <= m_PinCount); + m_Position = pEnumPins->m_Position; + m_PinCount = pEnumPins->m_PinCount; + m_Version = pEnumPins->m_Version; + m_PinCache.AddTail(&(pEnumPins->m_PinCache)); + } +} + + +/* Destructor releases the reference count on our filter NOTE since we hold + a reference count on the filter who created us we know it is safe to + release it, no access can be made to it afterwards though as we have just + caused the last reference count to go and the object to be deleted */ + +CEnumPins::~CEnumPins() +{ + m_pFilter->Release(); + +#ifdef DEBUG + DbgRegisterObjectDestruction(m_dwCookie); +#endif +} + + +/* Override this to say what interfaces we support where */ + +STDMETHODIMP +CEnumPins::QueryInterface(REFIID riid, __deref_out void **ppv) +{ + CheckPointer(ppv, E_POINTER); + + /* Do we have this interface */ + + if (riid == IID_IEnumPins || riid == IID_IUnknown) { + return GetInterface((IEnumPins *) this, ppv); + } else { + *ppv = NULL; + return E_NOINTERFACE; + } +} + +STDMETHODIMP_(ULONG) +CEnumPins::AddRef() +{ + return InterlockedIncrement(&m_cRef); +} + +STDMETHODIMP_(ULONG) +CEnumPins::Release() +{ + ULONG cRef = InterlockedDecrement(&m_cRef); + if (cRef == 0) { + delete this; + } + return cRef; +} + +/* One of an enumerator's basic member functions allows us to create a cloned + interface that initially has the same state. Since we are taking a snapshot + of an object (current position and all) we must lock access at the start */ + +STDMETHODIMP +CEnumPins::Clone(__deref_out IEnumPins **ppEnum) +{ + CheckPointer(ppEnum,E_POINTER); + ValidateReadWritePtr(ppEnum,sizeof(IEnumPins *)); + HRESULT hr = NOERROR; + + /* Check we are still in sync with the filter */ + if (AreWeOutOfSync() == TRUE) { + *ppEnum = NULL; + hr = VFW_E_ENUM_OUT_OF_SYNC; + } else { + *ppEnum = new CEnumPins(m_pFilter, + this); + if (*ppEnum == NULL) { + hr = E_OUTOFMEMORY; + } + } + return hr; +} + + +/* Return the next pin after the current position */ + +STDMETHODIMP +CEnumPins::Next(ULONG cPins, // place this many pins... + __out_ecount(cPins) IPin **ppPins, // ...in this array + __out_opt ULONG *pcFetched) // actual count passed returned here +{ + CheckPointer(ppPins,E_POINTER); + ValidateReadWritePtr(ppPins,cPins * sizeof(IPin *)); + + ASSERT(ppPins); + + if (pcFetched!=NULL) { + ValidateWritePtr(pcFetched, sizeof(ULONG)); + *pcFetched = 0; // default unless we succeed + } + // now check that the parameter is valid + else if (cPins>1) { // pcFetched == NULL + return E_INVALIDARG; + } + ULONG cFetched = 0; // increment as we get each one. + + /* Check we are still in sync with the filter */ + if (AreWeOutOfSync() == TRUE) { + // If we are out of sync, we should refresh the enumerator. + // This will reset the position and update the other members, but + // will not clear cache of pins we have already returned. + Refresh(); + } + + /* Return each pin interface NOTE GetPin returns CBasePin * not addrefed + so we must QI for the IPin (which increments its reference count) + If while we are retrieving a pin from the filter an error occurs we + assume that our internal state is stale with respect to the filter + (for example someone has deleted a pin) so we + return VFW_E_ENUM_OUT_OF_SYNC */ + + while (cFetched < cPins && m_PinCount > m_Position) { + + /* Get the next pin object from the filter */ + + CBasePin *pPin = m_pFilter->GetPin(m_Position++); + if (pPin == NULL) { + // If this happend, and it's not the first time through, then we've got a problem, + // since we should really go back and release the iPins, which we have previously + // AddRef'ed. + ASSERT( cFetched==0 ); + return VFW_E_ENUM_OUT_OF_SYNC; + } + + /* We only want to return this pin, if it is not in our cache */ + if (0 == m_PinCache.Find(pPin)) + { + /* From the object get an IPin interface */ + + *ppPins = pPin; + pPin->AddRef(); + + cFetched++; + ppPins++; + + m_PinCache.AddTail(pPin); + } + } + + if (pcFetched!=NULL) { + *pcFetched = cFetched; + } + + return (cPins==cFetched ? NOERROR : S_FALSE); +} + + +/* Skip over one or more entries in the enumerator */ + +STDMETHODIMP +CEnumPins::Skip(ULONG cPins) +{ + /* Check we are still in sync with the filter */ + if (AreWeOutOfSync() == TRUE) { + return VFW_E_ENUM_OUT_OF_SYNC; + } + + /* Work out how many pins are left to skip over */ + /* We could position at the end if we are asked to skip too many... */ + /* ..which would match the base implementation for CEnumMediaTypes::Skip */ + + ULONG PinsLeft = m_PinCount - m_Position; + if (cPins > PinsLeft) { + return S_FALSE; + } + m_Position += cPins; + return NOERROR; +} + + +/* Set the current position back to the start */ +/* Reset has 4 simple steps: + * + * Set position to head of list + * Sync enumerator with object being enumerated + * Clear the cache of pins already returned + * return S_OK + */ + +STDMETHODIMP +CEnumPins::Reset() +{ + m_Version = m_pFilter->GetPinVersion(); + m_PinCount = m_pFilter->GetPinCount(); + + m_Position = 0; + + // Clear the cache + m_PinCache.RemoveAll(); + + return S_OK; +} + + +/* Set the current position back to the start */ +/* Refresh has 3 simple steps: + * + * Set position to head of list + * Sync enumerator with object being enumerated + * return S_OK + */ + +STDMETHODIMP +CEnumPins::Refresh() +{ + m_Version = m_pFilter->GetPinVersion(); + m_PinCount = m_pFilter->GetPinCount(); + + m_Position = 0; + return S_OK; +} + + +//===================================================================== +//===================================================================== +// Implements CEnumMediaTypes +//===================================================================== +//===================================================================== + + +CEnumMediaTypes::CEnumMediaTypes(__in CBasePin *pPin, + __in_opt CEnumMediaTypes *pEnumMediaTypes) : + m_Position(0), + m_pPin(pPin), + m_cRef(1) +{ + +#ifdef DEBUG + m_dwCookie = DbgRegisterObjectCreation("CEnumMediaTypes", 0); +#endif + + /* We must be owned by a pin derived from CBasePin */ + + ASSERT(pPin != NULL); + + /* Hold a reference count on our pin */ + m_pPin->AddRef(); + + /* Are we creating a new enumerator */ + + if (pEnumMediaTypes == NULL) { + m_Version = m_pPin->GetMediaTypeVersion(); + return; + } + + m_Position = pEnumMediaTypes->m_Position; + m_Version = pEnumMediaTypes->m_Version; +} + + +/* Destructor releases the reference count on our base pin. NOTE since we hold + a reference count on the pin who created us we know it is safe to release + it, no access can be made to it afterwards though as we might have just + caused the last reference count to go and the object to be deleted */ + +CEnumMediaTypes::~CEnumMediaTypes() +{ +#ifdef DEBUG + DbgRegisterObjectDestruction(m_dwCookie); +#endif + m_pPin->Release(); +} + + +/* Override this to say what interfaces we support where */ + +STDMETHODIMP +CEnumMediaTypes::QueryInterface(REFIID riid, __deref_out void **ppv) +{ + CheckPointer(ppv, E_POINTER); + + /* Do we have this interface */ + + if (riid == IID_IEnumMediaTypes || riid == IID_IUnknown) { + return GetInterface((IEnumMediaTypes *) this, ppv); + } else { + *ppv = NULL; + return E_NOINTERFACE; + } +} + +STDMETHODIMP_(ULONG) +CEnumMediaTypes::AddRef() +{ + return InterlockedIncrement(&m_cRef); +} + +STDMETHODIMP_(ULONG) +CEnumMediaTypes::Release() +{ + ULONG cRef = InterlockedDecrement(&m_cRef); + if (cRef == 0) { + delete this; + } + return cRef; +} + +/* One of an enumerator's basic member functions allows us to create a cloned + interface that initially has the same state. Since we are taking a snapshot + of an object (current position and all) we must lock access at the start */ + +STDMETHODIMP +CEnumMediaTypes::Clone(__deref_out IEnumMediaTypes **ppEnum) +{ + CheckPointer(ppEnum,E_POINTER); + ValidateReadWritePtr(ppEnum,sizeof(IEnumMediaTypes *)); + HRESULT hr = NOERROR; + + /* Check we are still in sync with the pin */ + if (AreWeOutOfSync() == TRUE) { + *ppEnum = NULL; + hr = VFW_E_ENUM_OUT_OF_SYNC; + } else { + + *ppEnum = new CEnumMediaTypes(m_pPin, + this); + + if (*ppEnum == NULL) { + hr = E_OUTOFMEMORY; + } + } + return hr; +} + + +/* Enumerate the next pin(s) after the current position. The client using this + interface passes in a pointer to an array of pointers each of which will + be filled in with a pointer to a fully initialised media type format + Return NOERROR if it all works, + S_FALSE if fewer than cMediaTypes were enumerated. + VFW_E_ENUM_OUT_OF_SYNC if the enumerator has been broken by + state changes in the filter + The actual count always correctly reflects the number of types in the array. +*/ + +STDMETHODIMP +CEnumMediaTypes::Next(ULONG cMediaTypes, // place this many types... + __out_ecount(cMediaTypes) AM_MEDIA_TYPE **ppMediaTypes, // ...in this array + __out ULONG *pcFetched) // actual count passed +{ + CheckPointer(ppMediaTypes,E_POINTER); + ValidateReadWritePtr(ppMediaTypes,cMediaTypes * sizeof(AM_MEDIA_TYPE *)); + /* Check we are still in sync with the pin */ + if (AreWeOutOfSync() == TRUE) { + return VFW_E_ENUM_OUT_OF_SYNC; + } + + if (pcFetched!=NULL) { + ValidateWritePtr(pcFetched, sizeof(ULONG)); + *pcFetched = 0; // default unless we succeed + } + // now check that the parameter is valid + else if (cMediaTypes>1) { // pcFetched == NULL + return E_INVALIDARG; + } + ULONG cFetched = 0; // increment as we get each one. + + /* Return each media type by asking the filter for them in turn - If we + have an error code retured to us while we are retrieving a media type + we assume that our internal state is stale with respect to the filter + (for example the window size changing) so we return + VFW_E_ENUM_OUT_OF_SYNC */ + + while (cMediaTypes) { + + CMediaType cmt; + + HRESULT hr = m_pPin->GetMediaType(m_Position++, &cmt); + if (S_OK != hr) { + break; + } + + /* We now have a CMediaType object that contains the next media type + but when we assign it to the array position we CANNOT just assign + the AM_MEDIA_TYPE structure because as soon as the object goes out of + scope it will delete the memory we have just copied. The function + we use is CreateMediaType which allocates a task memory block */ + + /* Transfer across the format block manually to save an allocate + and free on the format block and generally go faster */ + + *ppMediaTypes = (AM_MEDIA_TYPE *)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); + if (*ppMediaTypes == NULL) { + break; + } + + /* Do a regular copy */ + **ppMediaTypes = cmt; + + /* Make sure the destructor doesn't free these */ + cmt.pbFormat = NULL; + cmt.cbFormat = NULL; + cmt.pUnk = NULL; + + + ppMediaTypes++; + cFetched++; + cMediaTypes--; + } + + if (pcFetched!=NULL) { + *pcFetched = cFetched; + } + + return ( cMediaTypes==0 ? NOERROR : S_FALSE ); +} + + +/* Skip over one or more entries in the enumerator */ + +STDMETHODIMP +CEnumMediaTypes::Skip(ULONG cMediaTypes) +{ + // If we're skipping 0 elements we're guaranteed to skip the + // correct number of elements + if (cMediaTypes == 0) { + return S_OK; + } + + /* Check we are still in sync with the pin */ + if (AreWeOutOfSync() == TRUE) { + return VFW_E_ENUM_OUT_OF_SYNC; + } + + m_Position += cMediaTypes; + + /* See if we're over the end */ + CMediaType cmt; + return S_OK == m_pPin->GetMediaType(m_Position - 1, &cmt) ? S_OK : S_FALSE; +} + + +/* Set the current position back to the start */ +/* Reset has 3 simple steps: + * + * set position to head of list + * sync enumerator with object being enumerated + * return S_OK + */ + +STDMETHODIMP +CEnumMediaTypes::Reset() + +{ + m_Position = 0; + + // Bring the enumerator back into step with the current state. This + // may be a noop but ensures that the enumerator will be valid on the + // next call. + m_Version = m_pPin->GetMediaTypeVersion(); + return NOERROR; +} + + +//===================================================================== +//===================================================================== +// Implements CBasePin +//===================================================================== +//===================================================================== + + +/* NOTE The implementation of this class calls the CUnknown constructor with + a NULL outer unknown pointer. This has the effect of making us a self + contained class, ie any QueryInterface, AddRef or Release calls will be + routed to the class's NonDelegatingUnknown methods. You will typically + find that the classes that do this then override one or more of these + virtual functions to provide more specialised behaviour. A good example + of this is where a class wants to keep the QueryInterface internal but + still wants its lifetime controlled by the external object */ + +/* Constructor */ + +CBasePin::CBasePin(__in_opt LPCTSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName, + PIN_DIRECTION dir) : + CUnknown( pObjectName, NULL ), + m_pFilter(pFilter), + m_pLock(pLock), + m_pName(NULL), + m_Connected(NULL), + m_dir(dir), + m_bRunTimeError(FALSE), + m_pQSink(NULL), + m_TypeVersion(1), + m_tStart(), + m_tStop(MAX_TIME), + m_bCanReconnectWhenActive(false), + m_bTryMyTypesFirst(false), + m_dRate(1.0) +{ + /* WARNING - pFilter is often not a properly constituted object at + this state (in particular QueryInterface may not work) - this + is because its owner is often its containing object and we + have been called from the containing object's constructor so + the filter's owner has not yet had its CUnknown constructor + called + */ +#ifdef DXMPERF + PERFLOG_CTOR( pName ? pName : L"CBasePin", (IPin *) this ); +#endif // DXMPERF + + ASSERT(pFilter != NULL); + ASSERT(pLock != NULL); + + if (pName) { + size_t cchName; + HRESULT hr = StringCchLengthW(pName, STRSAFE_MAX_CCH, &cchName); + if (SUCCEEDED(hr)) { + m_pName = new WCHARcchName + 1; + if (m_pName) { + (void)StringCchCopyW(m_pName, cchName + 1, pName); + } + } + } + +#ifdef DEBUG + m_cRef = 0; +#endif +} + +#ifdef UNICODE +CBasePin::CBasePin(__in_opt LPCSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName, + PIN_DIRECTION dir) : + CUnknown( pObjectName, NULL ), + m_pFilter(pFilter), + m_pLock(pLock), + m_pName(NULL), + m_Connected(NULL), + m_dir(dir), + m_bRunTimeError(FALSE), + m_pQSink(NULL), + m_TypeVersion(1), + m_tStart(), + m_tStop(MAX_TIME), + m_bCanReconnectWhenActive(false), + m_bTryMyTypesFirst(false), + m_dRate(1.0) +{ + /* WARNING - pFilter is often not a properly constituted object at + this state (in particular QueryInterface may not work) - this + is because its owner is often its containing object and we + have been called from the containing object's constructor so + the filter's owner has not yet had its CUnknown constructor + called + */ +#ifdef DXMPERF + PERFLOG_CTOR( pName ? pName : L"CBasePin", (IPin *) this ); +#endif // DXMPERF + + ASSERT(pFilter != NULL); + ASSERT(pLock != NULL); + + if (pName) { + size_t cchName; + HRESULT hr = StringCchLengthW(pName, STRSAFE_MAX_CCH, &cchName); + if (SUCCEEDED(hr)) { + m_pName = new WCHARcchName + 1; + if (m_pName) { + (void)StringCchCopyW(m_pName, cchName + 1, pName); + } + } + } + + +#ifdef DEBUG + m_cRef = 0; +#endif +} +#endif + +/* Destructor since a connected pin holds a reference count on us there is + no way that we can be deleted unless we are not currently connected */ + +CBasePin::~CBasePin() +{ +#ifdef DXMPERF + PERFLOG_DTOR( m_pName ? m_pName : L"CBasePin", (IPin *) this ); +#endif // DXMPERF + + // We don't call disconnect because if the filter is going away + // all the pins must have a reference count of zero so they must + // have been disconnected anyway - (but check the assumption) + ASSERT(m_Connected == FALSE); + + delete m_pName; + + // check the internal reference count is consistent + ASSERT(m_cRef == 0); +} + + +/* Override this to say what interfaces we support and where */ + +STDMETHODIMP +CBasePin::NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv) +{ + /* Do we have this interface */ + + if (riid == IID_IPin) { + return GetInterface((IPin *) this, ppv); + } else if (riid == IID_IQualityControl) { + return GetInterface((IQualityControl *) this, ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } +} + + +/* Override to increment the owning filter's reference count */ + +STDMETHODIMP_(ULONG) +CBasePin::NonDelegatingAddRef() +{ + ASSERT(InterlockedIncrement(&m_cRef) > 0); + return m_pFilter->AddRef(); +} + + +/* Override to decrement the owning filter's reference count */ + +STDMETHODIMP_(ULONG) +CBasePin::NonDelegatingRelease() +{ + ASSERT(InterlockedDecrement(&m_cRef) >= 0); + return m_pFilter->Release(); +} + + +/* Displays pin connection information */ + +#ifdef DEBUG +void +CBasePin::DisplayPinInfo(IPin *pReceivePin) +{ + + if (DbgCheckModuleLevel(LOG_TRACE, CONNECT_TRACE_LEVEL)) { + PIN_INFO ConnectPinInfo; + PIN_INFO ReceivePinInfo; + + if (FAILED(QueryPinInfo(&ConnectPinInfo))) { + StringCchCopyW(ConnectPinInfo.achName, sizeof(ConnectPinInfo.achName)/sizeof(WCHAR), L"Bad Pin"); + } else { + QueryPinInfoReleaseFilter(ConnectPinInfo); + } + + if (FAILED(pReceivePin->QueryPinInfo(&ReceivePinInfo))) { + StringCchCopyW(ReceivePinInfo.achName, sizeof(ReceivePinInfo.achName)/sizeof(WCHAR), L"Bad Pin"); + } else { + QueryPinInfoReleaseFilter(ReceivePinInfo); + } + + DbgLog((LOG_TRACE, CONNECT_TRACE_LEVEL, TEXT("Trying to connect Pins :"))); + DbgLog((LOG_TRACE, CONNECT_TRACE_LEVEL, TEXT(" <%ls>"), ConnectPinInfo.achName)); + DbgLog((LOG_TRACE, CONNECT_TRACE_LEVEL, TEXT(" <%ls>"), ReceivePinInfo.achName)); + } +} +#endif + + +/* Displays general information on the pin media type */ + +#ifdef DEBUG +void CBasePin::DisplayTypeInfo(IPin *pPin, const CMediaType *pmt) +{ + UNREFERENCED_PARAMETER(pPin); + if (DbgCheckModuleLevel(LOG_TRACE, CONNECT_TRACE_LEVEL)) { + DbgLog((LOG_TRACE, CONNECT_TRACE_LEVEL, TEXT("Trying media type:"))); + DbgLog((LOG_TRACE, CONNECT_TRACE_LEVEL, TEXT(" major type: %hs"), + GuidNames*pmt->Type())); + DbgLog((LOG_TRACE, CONNECT_TRACE_LEVEL, TEXT(" sub type : %hs"), + GuidNames*pmt->Subtype())); + } +} +#endif + +/* Asked to connect to a pin. A pin is always attached to an owning filter + object so we always delegate our locking to that object. We first of all + retrieve a media type enumerator for the input pin and see if we accept + any of the formats that it would ideally like, failing that we retrieve + our enumerator and see if it will accept any of our preferred types */ + +STDMETHODIMP +CBasePin::Connect( + IPin * pReceivePin, + __in_opt const AM_MEDIA_TYPE *pmt // optional media type +) +{ + CheckPointer(pReceivePin,E_POINTER); + ValidateReadPtr(pReceivePin,sizeof(IPin)); + CAutoLock cObjectLock(m_pLock); + DisplayPinInfo(pReceivePin); + + /* See if we are already connected */ + + if (m_Connected) { + DbgLog((LOG_TRACE, CONNECT_TRACE_LEVEL, TEXT("Already connected"))); + return VFW_E_ALREADY_CONNECTED; + } + + /* See if the filter is active */ + if (!IsStopped() && !m_bCanReconnectWhenActive) { + return VFW_E_NOT_STOPPED; + } + + + // Find a mutually agreeable media type - + // Pass in the template media type. If this is partially specified, + // each of the enumerated media types will need to be checked against + // it. If it is non-null and fully specified, we will just try to connect + // with this. + + const CMediaType * ptype = (CMediaType*)pmt; + HRESULT hr = AgreeMediaType(pReceivePin, ptype); + if (FAILED(hr)) { + DbgLog((LOG_TRACE, CONNECT_TRACE_LEVEL, TEXT("Failed to agree type"))); + + // Since the procedure is already returning an error code, there + // is nothing else this function can do to report the error. + EXECUTE_ASSERT( SUCCEEDED( BreakConnect() ) ); + +#ifdef DXMPERF + PERFLOG_CONNECT( (IPin *) this, pReceivePin, hr, pmt ); +#endif // DXMPERF + + return hr; + } + + DbgLog((LOG_TRACE, CONNECT_TRACE_LEVEL, TEXT("Connection succeeded"))); + +#ifdef DXMPERF + PERFLOG_CONNECT( (IPin *) this, pReceivePin, NOERROR, pmt ); +#endif // DXMPERF + + return NOERROR; +} + +// given a specific media type, attempt a connection (includes +// checking that the type is acceptable to this pin) +HRESULT +CBasePin::AttemptConnection( + IPin* pReceivePin, // connect to this pin + const CMediaType* pmt // using this type +) +{ + // The caller should hold the filter lock becasue this function + // uses m_Connected. The caller should also hold the filter lock + // because this function calls SetMediaType(), IsStopped() and + // CompleteConnect(). + ASSERT(CritCheckIn(m_pLock)); + + // Check that the connection is valid -- need to do this for every + // connect attempt since BreakConnect will undo it. + HRESULT hr = CheckConnect(pReceivePin); + if (FAILED(hr)) { + DbgLog((LOG_TRACE, CONNECT_TRACE_LEVEL, TEXT("CheckConnect failed"))); + + // Since the procedure is already returning an error code, there + // is nothing else this function can do to report the error. + EXECUTE_ASSERT( SUCCEEDED( BreakConnect() ) ); + + return hr; + } + + DisplayTypeInfo(pReceivePin, pmt); + + /* Check we will accept this media type */ + + hr = CheckMediaType(pmt); + if (hr == NOERROR) { + + /* Make ourselves look connected otherwise ReceiveConnection + may not be able to complete the connection + */ + m_Connected = pReceivePin; + m_Connected->AddRef(); + hr = SetMediaType(pmt); + if (SUCCEEDED(hr)) { + /* See if the other pin will accept this type */ + + hr = pReceivePin->ReceiveConnection((IPin *)this, pmt); + if (SUCCEEDED(hr)) { + /* Complete the connection */ + + hr = CompleteConnect(pReceivePin); + if (SUCCEEDED(hr)) { + return hr; + } else { + DbgLog((LOG_TRACE, + CONNECT_TRACE_LEVEL, + TEXT("Failed to complete connection"))); + pReceivePin->Disconnect(); + } + } + } + } else { + // we cannot use this media type + + // return a specific media type error if there is one + // or map a general failure code to something more helpful + // (in particular S_FALSE gets changed to an error code) + if (SUCCEEDED(hr) || + (hr == E_FAIL) || + (hr == E_INVALIDARG)) { + hr = VFW_E_TYPE_NOT_ACCEPTED; + } + } + + // BreakConnect and release any connection here in case CheckMediaType + // failed, or if we set anything up during a call back during + // ReceiveConnection. + + // Since the procedure is already returning an error code, there + // is nothing else this function can do to report the error. + EXECUTE_ASSERT( SUCCEEDED( BreakConnect() ) ); + + /* If failed then undo our state */ + if (m_Connected) { + m_Connected->Release(); + m_Connected = NULL; + } + + return hr; +} + +/* Given an enumerator we cycle through all the media types it proposes and + firstly suggest them to our derived pin class and if that succeeds try + them with the pin in a ReceiveConnection call. This means that if our pin + proposes a media type we still check in here that we can support it. This + is deliberate so that in simple cases the enumerator can hold all of the + media types even if some of them are not really currently available */ + +HRESULT CBasePin::TryMediaTypes( + IPin *pReceivePin, + __in_opt const CMediaType *pmt, + IEnumMediaTypes *pEnum) +{ + /* Reset the current enumerator position */ + + HRESULT hr = pEnum->Reset(); + if (FAILED(hr)) { + return hr; + } + + CMediaType *pMediaType = NULL; + ULONG ulMediaCount = 0; + + // attempt to remember a specific error code if there is one + HRESULT hrFailure = S_OK; + + for (;;) { + + /* Retrieve the next media type NOTE each time round the loop the + enumerator interface will allocate another AM_MEDIA_TYPE structure + If we are successful then we copy it into our output object, if + not then we must delete the memory allocated before returning */ + + hr = pEnum->Next(1, (AM_MEDIA_TYPE**)&pMediaType,&ulMediaCount); + if (hr != S_OK) { + if (S_OK == hrFailure) { + hrFailure = VFW_E_NO_ACCEPTABLE_TYPES; + } + return hrFailure; + } + + + ASSERT(ulMediaCount == 1); + ASSERT(pMediaType); + + // check that this matches the partial type (if any) + + if (pMediaType && + ((pmt == NULL) || + pMediaType->MatchesPartial(pmt))) { + + hr = AttemptConnection(pReceivePin, pMediaType); + + // attempt to remember a specific error code + if (FAILED(hr) && + SUCCEEDED(hrFailure) && + (hr != E_FAIL) && + (hr != E_INVALIDARG) && + (hr != VFW_E_TYPE_NOT_ACCEPTED)) { + hrFailure = hr; + } + } else { + hr = VFW_E_NO_ACCEPTABLE_TYPES; + } + + if(pMediaType) { + DeleteMediaType(pMediaType); + pMediaType = NULL; + } + + if (S_OK == hr) { + return hr; + } + } +} + + +/* This is called to make the connection, including the taask of finding + a media type for the pin connection. pmt is the proposed media type + from the Connect call: if this is fully specified, we will try that. + Otherwise we enumerate and try all the input pin's types first and + if that fails we then enumerate and try all our preferred media types. + For each media type we check it against pmt (if non-null and partially + specified) as well as checking that both pins will accept it. + */ + +HRESULT CBasePin::AgreeMediaType( + IPin *pReceivePin, + const CMediaType *pmt) +{ + ASSERT(pReceivePin); + IEnumMediaTypes *pEnumMediaTypes = NULL; + + // if the media type is fully specified then use that + if ( (pmt != NULL) && (!pmt->IsPartiallySpecified())) { + + // if this media type fails, then we must fail the connection + // since if pmt is nonnull we are only allowed to connect + // using a type that matches it. + + return AttemptConnection(pReceivePin, pmt); + } + + + /* Try the other pin's enumerator */ + + HRESULT hrFailure = VFW_E_NO_ACCEPTABLE_TYPES; + + for (int i = 0; i < 2; i++) { + HRESULT hr; + if (i == (int)m_bTryMyTypesFirst) { + hr = pReceivePin->EnumMediaTypes(&pEnumMediaTypes); + } else { + hr = EnumMediaTypes(&pEnumMediaTypes); + } + if (SUCCEEDED(hr)) { + ASSERT(pEnumMediaTypes); + hr = TryMediaTypes(pReceivePin,pmt,pEnumMediaTypes); + pEnumMediaTypes->Release(); + if (SUCCEEDED(hr)) { + return NOERROR; + } else { + // try to remember specific error codes if there are any + if ((hr != E_FAIL) && + (hr != E_INVALIDARG) && + (hr != VFW_E_TYPE_NOT_ACCEPTED)) { + hrFailure = hr; + } + } + } + } + + return hrFailure; +} + + +/* Called when we want to complete a connection to another filter. Failing + this will also fail the connection and disconnect the other pin as well */ + +HRESULT +CBasePin::CompleteConnect(IPin *pReceivePin) +{ + UNREFERENCED_PARAMETER(pReceivePin); + return NOERROR; +} + + +/* This is called to set the format for a pin connection - CheckMediaType + will have been called to check the connection format and if it didn't + return an error code then this (virtual) function will be invoked */ + +HRESULT +CBasePin::SetMediaType(const CMediaType *pmt) +{ + HRESULT hr = m_mt.Set(*pmt); + if (FAILED(hr)) { + return hr; + } + + return NOERROR; +} + + +/* This is called during Connect() to provide a virtual method that can do + any specific check needed for connection such as QueryInterface. This + base class method just checks that the pin directions don't match */ + +HRESULT +CBasePin::CheckConnect(IPin * pPin) +{ + /* Check that pin directions DONT match */ + + PIN_DIRECTION pd; + pPin->QueryDirection(&pd); + + ASSERT((pd == PINDIR_OUTPUT) || (pd == PINDIR_INPUT)); + ASSERT((m_dir == PINDIR_OUTPUT) || (m_dir == PINDIR_INPUT)); + + // we should allow for non-input and non-output connections? + if (pd == m_dir) { + return VFW_E_INVALID_DIRECTION; + } + return NOERROR; +} + + +/* This is called when we realise we can't make a connection to the pin and + must undo anything we did in CheckConnect - override to release QIs done */ + +HRESULT +CBasePin::BreakConnect() +{ + return NOERROR; +} + + +/* Called normally by an output pin on an input pin to try and establish a + connection. +*/ + +STDMETHODIMP +CBasePin::ReceiveConnection( + IPin * pConnector, // this is the pin who we will connect to + const AM_MEDIA_TYPE *pmt // this is the media type we will exchange +) +{ + CheckPointer(pConnector,E_POINTER); + CheckPointer(pmt,E_POINTER); + ValidateReadPtr(pConnector,sizeof(IPin)); + ValidateReadPtr(pmt,sizeof(AM_MEDIA_TYPE)); + CAutoLock cObjectLock(m_pLock); + + /* Are we already connected */ + if (m_Connected) { + return VFW_E_ALREADY_CONNECTED; + } + + /* See if the filter is active */ + if (!IsStopped() && !m_bCanReconnectWhenActive) { + return VFW_E_NOT_STOPPED; + } + + HRESULT hr = CheckConnect(pConnector); + if (FAILED(hr)) { + // Since the procedure is already returning an error code, there + // is nothing else this function can do to report the error. + EXECUTE_ASSERT( SUCCEEDED( BreakConnect() ) ); + +#ifdef DXMPERF + PERFLOG_RXCONNECT( pConnector, (IPin *) this, hr, pmt ); +#endif // DXMPERF + + return hr; + } + + /* Ask derived class if this media type is ok */ + + CMediaType * pcmt = (CMediaType*) pmt; + hr = CheckMediaType(pcmt); + if (hr != NOERROR) { + // no -we don't support this media type + + // Since the procedure is already returning an error code, there + // is nothing else this function can do to report the error. + EXECUTE_ASSERT( SUCCEEDED( BreakConnect() ) ); + + // return a specific media type error if there is one + // or map a general failure code to something more helpful + // (in particular S_FALSE gets changed to an error code) + if (SUCCEEDED(hr) || + (hr == E_FAIL) || + (hr == E_INVALIDARG)) { + hr = VFW_E_TYPE_NOT_ACCEPTED; + } + +#ifdef DXMPERF + PERFLOG_RXCONNECT( pConnector, (IPin *) this, hr, pmt ); +#endif // DXMPERF + + return hr; + } + + /* Complete the connection */ + + m_Connected = pConnector; + m_Connected->AddRef(); + hr = SetMediaType(pcmt); + if (SUCCEEDED(hr)) { + hr = CompleteConnect(pConnector); + if (SUCCEEDED(hr)) { + +#ifdef DXMPERF + PERFLOG_RXCONNECT( pConnector, (IPin *) this, NOERROR, pmt ); +#endif // DXMPERF + + return NOERROR; + } + } + + DbgLog((LOG_TRACE, CONNECT_TRACE_LEVEL, TEXT("Failed to set the media type or failed to complete the connection."))); + m_Connected->Release(); + m_Connected = NULL; + + // Since the procedure is already returning an error code, there + // is nothing else this function can do to report the error. + EXECUTE_ASSERT( SUCCEEDED( BreakConnect() ) ); + +#ifdef DXMPERF + PERFLOG_RXCONNECT( pConnector, (IPin *) this, hr, pmt ); +#endif // DXMPERF + + return hr; +} + + +/* Called when we want to terminate a pin connection */ + +STDMETHODIMP +CBasePin::Disconnect() +{ + CAutoLock cObjectLock(m_pLock); + + /* See if the filter is active */ + if (!IsStopped()) { + return VFW_E_NOT_STOPPED; + } + + return DisconnectInternal(); +} + +STDMETHODIMP +CBasePin::DisconnectInternal() +{ + ASSERT(CritCheckIn(m_pLock)); + + if (m_Connected) { + HRESULT hr = BreakConnect(); + if( FAILED( hr ) ) { + +#ifdef DXMPERF + PERFLOG_DISCONNECT( (IPin *) this, m_Connected, hr ); +#endif // DXMPERF + + // There is usually a bug in the program if BreakConnect() fails. + DbgBreak( "WARNING: BreakConnect() failed in CBasePin::Disconnect()." ); + return hr; + } + + m_Connected->Release(); + m_Connected = NULL; + +#ifdef DXMPERF + PERFLOG_DISCONNECT( (IPin *) this, m_Connected, S_OK ); +#endif // DXMPERF + + return S_OK; + } else { + // no connection - not an error + +#ifdef DXMPERF + PERFLOG_DISCONNECT( (IPin *) this, m_Connected, S_FALSE ); +#endif // DXMPERF + + return S_FALSE; + } +} + + +/* Return an AddRef()'d pointer to the connected pin if there is one */ +STDMETHODIMP +CBasePin::ConnectedTo( + __deref_out IPin **ppPin +) +{ + CheckPointer(ppPin,E_POINTER); + ValidateReadWritePtr(ppPin,sizeof(IPin *)); + // + // It's pointless to lock here. + // The caller should ensure integrity. + // + + IPin *pPin = m_Connected; + *ppPin = pPin; + if (pPin != NULL) { + pPin->AddRef(); + return S_OK; + } else { + ASSERT(*ppPin == NULL); + return VFW_E_NOT_CONNECTED; + } +} + +/* Return the media type of the connection */ +STDMETHODIMP +CBasePin::ConnectionMediaType( + __out AM_MEDIA_TYPE *pmt +) +{ + CheckPointer(pmt,E_POINTER); + ValidateReadWritePtr(pmt,sizeof(AM_MEDIA_TYPE)); + CAutoLock cObjectLock(m_pLock); + + /* Copy constructor of m_mt allocates the memory */ + if (IsConnected()) { + CopyMediaType( pmt, &m_mt ); + return S_OK; + } else { + ((CMediaType *)pmt)->InitMediaType(); + return VFW_E_NOT_CONNECTED; + } +} + +/* Return information about the filter we are connect to */ + +STDMETHODIMP +CBasePin::QueryPinInfo( + __out PIN_INFO * pInfo +) +{ + CheckPointer(pInfo,E_POINTER); + ValidateReadWritePtr(pInfo,sizeof(PIN_INFO)); + + pInfo->pFilter = m_pFilter; + if (m_pFilter) { + m_pFilter->AddRef(); + } + + if (m_pName) { + (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName); + } else { + pInfo->achName0 = L'\0'; + } + + pInfo->dir = m_dir; + + return NOERROR; +} + +STDMETHODIMP +CBasePin::QueryDirection( + __out PIN_DIRECTION * pPinDir +) +{ + CheckPointer(pPinDir,E_POINTER); + ValidateReadWritePtr(pPinDir,sizeof(PIN_DIRECTION)); + + *pPinDir = m_dir; + return NOERROR; +} + +// Default QueryId to return the pin's name +STDMETHODIMP +CBasePin::QueryId( + __deref_out LPWSTR * Id +) +{ + // We're not going away because someone's got a pointer to us + // so there's no need to lock + + return AMGetWideString(Name(), Id); +} + +/* Does this pin support this media type WARNING this interface function does + not lock the main object as it is meant to be asynchronous by nature - if + the media types you support depend on some internal state that is updated + dynamically then you will need to implement locking in a derived class */ + +STDMETHODIMP +CBasePin::QueryAccept( + const AM_MEDIA_TYPE *pmt +) +{ + CheckPointer(pmt,E_POINTER); + ValidateReadPtr(pmt,sizeof(AM_MEDIA_TYPE)); + + /* The CheckMediaType method is valid to return error codes if the media + type is horrible, an example might be E_INVALIDARG. What we do here + is map all the error codes into either S_OK or S_FALSE regardless */ + + HRESULT hr = CheckMediaType((CMediaType*)pmt); + if (FAILED(hr)) { + return S_FALSE; + } + // note that the only defined success codes should be S_OK and S_FALSE... + return hr; +} + + +/* This can be called to return an enumerator for the pin's list of preferred + media types. An input pin is not obliged to have any preferred formats + although it can do. For example, the window renderer has a preferred type + which describes a video image that matches the current window size. All + output pins should expose at least one preferred format otherwise it is + possible that neither pin has any types and so no connection is possible */ + +STDMETHODIMP +CBasePin::EnumMediaTypes( + __deref_out IEnumMediaTypes **ppEnum +) +{ + CheckPointer(ppEnum,E_POINTER); + ValidateReadWritePtr(ppEnum,sizeof(IEnumMediaTypes *)); + + /* Create a new ref counted enumerator */ + + *ppEnum = new CEnumMediaTypes(this, + NULL); + + if (*ppEnum == NULL) { + return E_OUTOFMEMORY; + } + + return NOERROR; +} + + + +/* This is a virtual function that returns a media type corresponding with + place iPosition in the list. This base class simply returns an error as + we support no media types by default but derived classes should override */ + +HRESULT CBasePin::GetMediaType(int iPosition, __inout CMediaType *pMediaType) +{ + UNREFERENCED_PARAMETER(iPosition); + UNREFERENCED_PARAMETER(pMediaType); + return E_UNEXPECTED; +} + + +/* This is a virtual function that returns the current media type version. + The base class initialises the media type enumerators with the value 1 + By default we always returns that same value. A Derived class may change + the list of media types available and after doing so it should increment + the version either in a method derived from this, or more simply by just + incrementing the m_TypeVersion base pin variable. The type enumerators + call this when they want to see if their enumerations are out of date */ + +LONG CBasePin::GetMediaTypeVersion() +{ + return m_TypeVersion; +} + + +/* Increment the cookie representing the current media type version */ + +void CBasePin::IncrementTypeVersion() +{ + InterlockedIncrement(&m_TypeVersion); +} + + +/* Called by IMediaFilter implementation when the state changes from Stopped + to either paused or running and in derived classes could do things like + commit memory and grab hardware resource (the default is to do nothing) */ + +HRESULT +CBasePin::Active(void) +{ + return NOERROR; +} + +/* Called by IMediaFilter implementation when the state changes from + to either paused to running and in derived classes could do things like + commit memory and grab hardware resource (the default is to do nothing) */ + +HRESULT +CBasePin::Run(REFERENCE_TIME tStart) +{ + UNREFERENCED_PARAMETER(tStart); + return NOERROR; +} + + +/* Also called by the IMediaFilter implementation when the state changes to + Stopped at which point you should decommit allocators and free hardware + resources you grabbed in the Active call (default is also to do nothing) */ + +HRESULT +CBasePin::Inactive(void) +{ + m_bRunTimeError = FALSE; + return NOERROR; +} + + +// Called when no more data will arrive +STDMETHODIMP +CBasePin::EndOfStream(void) +{ + return S_OK; +} + + +STDMETHODIMP +CBasePin::SetSink(IQualityControl * piqc) +{ + CAutoLock cObjectLock(m_pLock); + if (piqc) ValidateReadPtr(piqc,sizeof(IQualityControl)); + m_pQSink = piqc; + return NOERROR; +} // SetSink + + +STDMETHODIMP +CBasePin::Notify(IBaseFilter * pSender, Quality q) +{ + UNREFERENCED_PARAMETER(q); + UNREFERENCED_PARAMETER(pSender); + DbgBreak("IQualityControl::Notify not over-ridden from CBasePin. (IGNORE is OK)"); + return E_NOTIMPL; +} //Notify + + +// NewSegment notifies of the start/stop/rate applying to the data +// about to be received. Default implementation records data and +// returns S_OK. +// Override this to pass downstream. +STDMETHODIMP +CBasePin::NewSegment( + REFERENCE_TIME tStart, + REFERENCE_TIME tStop, + double dRate) +{ + m_tStart = tStart; + m_tStop = tStop; + m_dRate = dRate; + + return S_OK; +} + + +//===================================================================== +//===================================================================== +// Implements CBaseOutputPin +//===================================================================== +//===================================================================== + + +CBaseOutputPin::CBaseOutputPin(__in_opt LPCTSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName) : + CBasePin(pObjectName, pFilter, pLock, phr, pName, PINDIR_OUTPUT), + m_pAllocator(NULL), + m_pInputPin(NULL) +{ + ASSERT(pFilter); +} + +#ifdef UNICODE +CBaseOutputPin::CBaseOutputPin(__in_opt LPCSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName) : + CBasePin(pObjectName, pFilter, pLock, phr, pName, PINDIR_OUTPUT), + m_pAllocator(NULL), + m_pInputPin(NULL) +{ + ASSERT(pFilter); +} +#endif + +/* This is called after a media type has been proposed + + Try to complete the connection by agreeing the allocator +*/ +HRESULT +CBaseOutputPin::CompleteConnect(IPin *pReceivePin) +{ + UNREFERENCED_PARAMETER(pReceivePin); + return DecideAllocator(m_pInputPin, &m_pAllocator); +} + + +/* This method is called when the output pin is about to try and connect to + an input pin. It is at this point that you should try and grab any extra + interfaces that you need, in this case IMemInputPin. Because this is + only called if we are not currently connected we do NOT need to call + BreakConnect. This also makes it easier to derive classes from us as + BreakConnect is only called when we actually have to break a connection + (or a partly made connection) and not when we are checking a connection */ + +/* Overriden from CBasePin */ + +HRESULT +CBaseOutputPin::CheckConnect(IPin * pPin) +{ + HRESULT hr = CBasePin::CheckConnect(pPin); + if (FAILED(hr)) { + return hr; + } + + // get an input pin and an allocator interface + hr = pPin->QueryInterface(IID_IMemInputPin, (void **) &m_pInputPin); + if (FAILED(hr)) { + return hr; + } + return NOERROR; +} + + +/* Overriden from CBasePin */ + +HRESULT +CBaseOutputPin::BreakConnect() +{ + /* Release any allocator we hold */ + + if (m_pAllocator) { + // Always decommit the allocator because a downstream filter may or + // may not decommit the connection's allocator. A memory leak could + // occur if the allocator is not decommited when a connection is broken. + HRESULT hr = m_pAllocator->Decommit(); + if( FAILED( hr ) ) { + return hr; + } + + m_pAllocator->Release(); + m_pAllocator = NULL; + } + + /* Release any input pin interface we hold */ + + if (m_pInputPin) { + m_pInputPin->Release(); + m_pInputPin = NULL; + } + return NOERROR; +} + + +/* This is called when the input pin didn't give us a valid allocator */ + +HRESULT +CBaseOutputPin::InitAllocator(__deref_out IMemAllocator **ppAlloc) +{ + return CreateMemoryAllocator(ppAlloc); +} + + +/* Decide on an allocator, override this if you want to use your own allocator + Override DecideBufferSize to call SetProperties. If the input pin fails + the GetAllocator call then this will construct a CMemAllocator and call + DecideBufferSize on that, and if that fails then we are completely hosed. + If the you succeed the DecideBufferSize call, we will notify the input + pin of the selected allocator. NOTE this is called during Connect() which + therefore looks after grabbing and locking the object's critical section */ + +// We query the input pin for its requested properties and pass this to +// DecideBufferSize to allow it to fulfill requests that it is happy +// with (eg most people don't care about alignment and are thus happy to +// use the downstream pin's alignment request). + +HRESULT +CBaseOutputPin::DecideAllocator(IMemInputPin *pPin, __deref_out IMemAllocator **ppAlloc) +{ + HRESULT hr = NOERROR; + *ppAlloc = NULL; + + // get downstream prop request + // the derived class may modify this in DecideBufferSize, but + // we assume that he will consistently modify it the same way, + // so we only get it once + ALLOCATOR_PROPERTIES prop; + ZeroMemory(&prop, sizeof(prop)); + + // whatever he returns, we assume prop is either all zeros + // or he has filled it out. + pPin->GetAllocatorRequirements(&prop); + + // if he doesn't care about alignment, then set it to 1 + if (prop.cbAlign == 0) { + prop.cbAlign = 1; + } + + /* Try the allocator provided by the input pin */ + + hr = pPin->GetAllocator(ppAlloc); + if (SUCCEEDED(hr)) { + + hr = DecideBufferSize(*ppAlloc, &prop); + if (SUCCEEDED(hr)) { + hr = pPin->NotifyAllocator(*ppAlloc, FALSE); + if (SUCCEEDED(hr)) { + return NOERROR; + } + } + } + + /* If the GetAllocator failed we may not have an interface */ + + if (*ppAlloc) { + (*ppAlloc)->Release(); + *ppAlloc = NULL; + } + + /* Try the output pin's allocator by the same method */ + + hr = InitAllocator(ppAlloc); + if (SUCCEEDED(hr)) { + + // note - the properties passed here are in the same + // structure as above and may have been modified by + // the previous call to DecideBufferSize + hr = DecideBufferSize(*ppAlloc, &prop); + if (SUCCEEDED(hr)) { + hr = pPin->NotifyAllocator(*ppAlloc, FALSE); + if (SUCCEEDED(hr)) { + return NOERROR; + } + } + } + + /* Likewise we may not have an interface to release */ + + if (*ppAlloc) { + (*ppAlloc)->Release(); + *ppAlloc = NULL; + } + return hr; +} + + +/* This returns an empty sample buffer from the allocator WARNING the same + dangers and restrictions apply here as described below for Deliver() */ + +HRESULT +CBaseOutputPin::GetDeliveryBuffer(__deref_out IMediaSample ** ppSample, + __in_opt REFERENCE_TIME * pStartTime, + __in_opt REFERENCE_TIME * pEndTime, + DWORD dwFlags) +{ + if (m_pAllocator != NULL) { + return m_pAllocator->GetBuffer(ppSample,pStartTime,pEndTime,dwFlags); + } else { + return E_NOINTERFACE; + } +} + + +/* Deliver a filled-in sample to the connected input pin. NOTE the object must + have locked itself before calling us otherwise we may get halfway through + executing this method only to find the filter graph has got in and + disconnected us from the input pin. If the filter has no worker threads + then the lock is best applied on Receive(), otherwise it should be done + when the worker thread is ready to deliver. There is a wee snag to worker + threads that this shows up. The worker thread must lock the object when + it is ready to deliver a sample, but it may have to wait until a state + change has completed, but that may never complete because the state change + is waiting for the worker thread to complete. The way to handle this is for + the state change code to grab the critical section, then set an abort event + for the worker thread, then release the critical section and wait for the + worker thread to see the event we set and then signal that it has finished + (with another event). At which point the state change code can complete */ + +// note (if you've still got any breath left after reading that) that you +// need to release the sample yourself after this call. if the connected +// input pin needs to hold onto the sample beyond the call, it will addref +// the sample itself. + +// of course you must release this one and call GetDeliveryBuffer for the +// next. You cannot reuse it directly. + +HRESULT +CBaseOutputPin::Deliver(IMediaSample * pSample) +{ + if (m_pInputPin == NULL) { + return VFW_E_NOT_CONNECTED; + } + +#ifdef DXMPERF + PERFLOG_DELIVER( m_pName ? m_pName : L"CBaseOutputPin", (IPin *) this, (IPin *) m_pInputPin, pSample, &m_mt ); +#endif // DXMPERF + + return m_pInputPin->Receive(pSample); +} + + +// called from elsewhere in our filter to pass EOS downstream to +// our connected input pin +HRESULT +CBaseOutputPin::DeliverEndOfStream(void) +{ + // remember this is on IPin not IMemInputPin + if (m_Connected == NULL) { + return VFW_E_NOT_CONNECTED; + } + return m_Connected->EndOfStream(); +} + + +/* Commit the allocator's memory, this is called through IMediaFilter + which is responsible for locking the object before calling us */ + +HRESULT +CBaseOutputPin::Active(void) +{ + if (m_pAllocator == NULL) { + return VFW_E_NO_ALLOCATOR; + } + return m_pAllocator->Commit(); +} + + +/* Free up or unprepare allocator's memory, this is called through + IMediaFilter which is responsible for locking the object first */ + +HRESULT +CBaseOutputPin::Inactive(void) +{ + m_bRunTimeError = FALSE; + if (m_pAllocator == NULL) { + return VFW_E_NO_ALLOCATOR; + } + return m_pAllocator->Decommit(); +} + +// we have a default handling of EndOfStream which is to return +// an error, since this should be called on input pins only +STDMETHODIMP +CBaseOutputPin::EndOfStream(void) +{ + return E_UNEXPECTED; +} + + +// BeginFlush should be called on input pins only +STDMETHODIMP +CBaseOutputPin::BeginFlush(void) +{ + return E_UNEXPECTED; +} + +// EndFlush should be called on input pins only +STDMETHODIMP +CBaseOutputPin::EndFlush(void) +{ + return E_UNEXPECTED; +} + +// call BeginFlush on the connected input pin +HRESULT +CBaseOutputPin::DeliverBeginFlush(void) +{ + // remember this is on IPin not IMemInputPin + if (m_Connected == NULL) { + return VFW_E_NOT_CONNECTED; + } + return m_Connected->BeginFlush(); +} + +// call EndFlush on the connected input pin +HRESULT +CBaseOutputPin::DeliverEndFlush(void) +{ + // remember this is on IPin not IMemInputPin + if (m_Connected == NULL) { + return VFW_E_NOT_CONNECTED; + } + return m_Connected->EndFlush(); +} +// deliver NewSegment to connected pin +HRESULT +CBaseOutputPin::DeliverNewSegment( + REFERENCE_TIME tStart, + REFERENCE_TIME tStop, + double dRate) +{ + if (m_Connected == NULL) { + return VFW_E_NOT_CONNECTED; + } + return m_Connected->NewSegment(tStart, tStop, dRate); +} + + +//===================================================================== +//===================================================================== +// Implements CBaseInputPin +//===================================================================== +//===================================================================== + + +/* Constructor creates a default allocator object */ + +CBaseInputPin::CBaseInputPin(__in_opt LPCTSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pPinName) : + CBasePin(pObjectName, pFilter, pLock, phr, pPinName, PINDIR_INPUT), + m_pAllocator(NULL), + m_bReadOnly(FALSE), + m_bFlushing(FALSE) +{ + ZeroMemory(&m_SampleProps, sizeof(m_SampleProps)); +} + +#ifdef UNICODE +CBaseInputPin::CBaseInputPin(__in LPCSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pPinName) : + CBasePin(pObjectName, pFilter, pLock, phr, pPinName, PINDIR_INPUT), + m_pAllocator(NULL), + m_bReadOnly(FALSE), + m_bFlushing(FALSE) +{ + ZeroMemory(&m_SampleProps, sizeof(m_SampleProps)); +} +#endif + +/* Destructor releases it's reference count on the default allocator */ + +CBaseInputPin::~CBaseInputPin() +{ + if (m_pAllocator != NULL) { + m_pAllocator->Release(); + m_pAllocator = NULL; + } +} + + +// override this to publicise our interfaces +STDMETHODIMP +CBaseInputPin::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + /* Do we know about this interface */ + + if (riid == IID_IMemInputPin) { + return GetInterface((IMemInputPin *) this, ppv); + } else { + return CBasePin::NonDelegatingQueryInterface(riid, ppv); + } +} + + +/* Return the allocator interface that this input pin would like the output + pin to use. NOTE subsequent calls to GetAllocator should all return an + interface onto the SAME object so we create one object at the start + + Note: + The allocator is Release()'d on disconnect and replaced on + NotifyAllocator(). + + Override this to provide your own allocator. +*/ + +STDMETHODIMP +CBaseInputPin::GetAllocator( + __deref_out IMemAllocator **ppAllocator) +{ + CheckPointer(ppAllocator,E_POINTER); + ValidateReadWritePtr(ppAllocator,sizeof(IMemAllocator *)); + CAutoLock cObjectLock(m_pLock); + + if (m_pAllocator == NULL) { + HRESULT hr = CreateMemoryAllocator(&m_pAllocator); + if (FAILED(hr)) { + return hr; + } + } + ASSERT(m_pAllocator != NULL); + *ppAllocator = m_pAllocator; + m_pAllocator->AddRef(); + return NOERROR; +} + + +/* Tell the input pin which allocator the output pin is actually going to use + Override this if you care - NOTE the locking we do both here and also in + GetAllocator is unnecessary but derived classes that do something useful + will undoubtedly have to lock the object so this might help remind people */ + +STDMETHODIMP +CBaseInputPin::NotifyAllocator( + IMemAllocator * pAllocator, + BOOL bReadOnly) +{ + CheckPointer(pAllocator,E_POINTER); + ValidateReadPtr(pAllocator,sizeof(IMemAllocator)); + CAutoLock cObjectLock(m_pLock); + + IMemAllocator *pOldAllocator = m_pAllocator; + pAllocator->AddRef(); + m_pAllocator = pAllocator; + + if (pOldAllocator != NULL) { + pOldAllocator->Release(); + } + + // the readonly flag indicates whether samples from this allocator should + // be regarded as readonly - if true, then inplace transforms will not be + // allowed. + m_bReadOnly = (BYTE)bReadOnly; + return NOERROR; +} + + +HRESULT +CBaseInputPin::BreakConnect() +{ + /* We don't need our allocator any more */ + if (m_pAllocator) { + // Always decommit the allocator because a downstream filter may or + // may not decommit the connection's allocator. A memory leak could + // occur if the allocator is not decommited when a pin is disconnected. + HRESULT hr = m_pAllocator->Decommit(); + if( FAILED( hr ) ) { + return hr; + } + + m_pAllocator->Release(); + m_pAllocator = NULL; + } + + return S_OK; +} + + +/* Do something with this media sample - this base class checks to see if the + format has changed with this media sample and if so checks that the filter + will accept it, generating a run time error if not. Once we have raised a + run time error we set a flag so that no more samples will be accepted + + It is important that any filter should override this method and implement + synchronization so that samples are not processed when the pin is + disconnected etc +*/ + +STDMETHODIMP +CBaseInputPin::Receive(IMediaSample *pSample) +{ + CheckPointer(pSample,E_POINTER); + ValidateReadPtr(pSample,sizeof(IMediaSample)); + ASSERT(pSample); + + HRESULT hr = CheckStreaming(); + if (S_OK != hr) { + return hr; + } + +#ifdef DXMPERF + PERFLOG_RECEIVE( m_pName ? m_pName : L"CBaseInputPin", (IPin *) m_Connected, (IPin *) this, pSample, &m_mt ); +#endif // DXMPERF + + + /* Check for IMediaSample2 */ + IMediaSample2 *pSample2; + if (SUCCEEDED(pSample->QueryInterface(IID_IMediaSample2, (void **)&pSample2))) { + hr = pSample2->GetProperties(sizeof(m_SampleProps), (PBYTE)&m_SampleProps); + pSample2->Release(); + if (FAILED(hr)) { + return hr; + } + } else { + /* Get the properties the hard way */ + m_SampleProps.cbData = sizeof(m_SampleProps); + m_SampleProps.dwTypeSpecificFlags = 0; + m_SampleProps.dwStreamId = AM_STREAM_MEDIA; + m_SampleProps.dwSampleFlags = 0; + if (S_OK == pSample->IsDiscontinuity()) { + m_SampleProps.dwSampleFlags |= AM_SAMPLE_DATADISCONTINUITY; + } + if (S_OK == pSample->IsPreroll()) { + m_SampleProps.dwSampleFlags |= AM_SAMPLE_PREROLL; + } + if (S_OK == pSample->IsSyncPoint()) { + m_SampleProps.dwSampleFlags |= AM_SAMPLE_SPLICEPOINT; + } + if (SUCCEEDED(pSample->GetTime(&m_SampleProps.tStart, + &m_SampleProps.tStop))) { + m_SampleProps.dwSampleFlags |= AM_SAMPLE_TIMEVALID | + AM_SAMPLE_STOPVALID; + } + if (S_OK == pSample->GetMediaType(&m_SampleProps.pMediaType)) { + m_SampleProps.dwSampleFlags |= AM_SAMPLE_TYPECHANGED; + } + pSample->GetPointer(&m_SampleProps.pbBuffer); + m_SampleProps.lActual = pSample->GetActualDataLength(); + m_SampleProps.cbBuffer = pSample->GetSize(); + } + + /* Has the format changed in this sample */ + + if (!(m_SampleProps.dwSampleFlags & AM_SAMPLE_TYPECHANGED)) { + return NOERROR; + } + + /* Check the derived class accepts this format */ + /* This shouldn't fail as the source must call QueryAccept first */ + + hr = CheckMediaType((CMediaType *)m_SampleProps.pMediaType); + + if (hr == NOERROR) { + return NOERROR; + } + + /* Raise a runtime error if we fail the media type */ + + m_bRunTimeError = TRUE; + EndOfStream(); + m_pFilter->NotifyEvent(EC_ERRORABORT,VFW_E_TYPE_NOT_ACCEPTED,0); + return VFW_E_INVALIDMEDIATYPE; +} + + +/* Receive multiple samples */ +STDMETHODIMP +CBaseInputPin::ReceiveMultiple ( + __in_ecount(nSamples) IMediaSample **pSamples, + long nSamples, + __out long *nSamplesProcessed) +{ + CheckPointer(pSamples,E_POINTER); + ValidateReadPtr(pSamples,nSamples * sizeof(IMediaSample *)); + + HRESULT hr = S_OK; + *nSamplesProcessed = 0; + while (nSamples-- > 0) { + hr = Receive(pSamples*nSamplesProcessed); + + /* S_FALSE means don't send any more */ + if (hr != S_OK) { + break; + } + (*nSamplesProcessed)++; + } + return hr; +} + +/* See if Receive() might block */ +STDMETHODIMP +CBaseInputPin::ReceiveCanBlock() +{ + /* Ask all the output pins if they block + If there are no output pin assume we do block + */ + int cPins = m_pFilter->GetPinCount(); + int cOutputPins = 0; + for (int c = 0; c < cPins; c++) { + CBasePin *pPin = m_pFilter->GetPin(c); + if (NULL == pPin) { + break; + } + PIN_DIRECTION pd; + HRESULT hr = pPin->QueryDirection(&pd); + if (FAILED(hr)) { + return hr; + } + + if (pd == PINDIR_OUTPUT) { + + IPin *pConnected; + hr = pPin->ConnectedTo(&pConnected); + if (SUCCEEDED(hr)) { + ASSERT(pConnected != NULL); + cOutputPins++; + IMemInputPin *pInputPin; + hr = pConnected->QueryInterface( + IID_IMemInputPin, + (void **)&pInputPin); + pConnected->Release(); + if (SUCCEEDED(hr)) { + hr = pInputPin->ReceiveCanBlock(); + pInputPin->Release(); + if (hr != S_FALSE) { + return S_OK; + } + } else { + /* There's a transport we don't understand here */ + return S_OK; + } + } + } + } + return cOutputPins == 0 ? S_OK : S_FALSE; +} + +// Default handling for BeginFlush - call at the beginning +// of your implementation (makes sure that all Receive calls +// fail). After calling this, you need to free any queued data +// and then call downstream. +STDMETHODIMP +CBaseInputPin::BeginFlush(void) +{ + // BeginFlush is NOT synchronized with streaming but is part of + // a control action - hence we synchronize with the filter + CAutoLock lck(m_pLock); + + // if we are already in mid-flush, this is probably a mistake + // though not harmful - try to pick it up for now so I can think about it + ASSERT(!m_bFlushing); + + // first thing to do is ensure that no further Receive calls succeed + m_bFlushing = TRUE; + + // now discard any data and call downstream - must do that + // in derived classes + return S_OK; +} + +// default handling for EndFlush - call at end of your implementation +// - before calling this, ensure that there is no queued data and no thread +// pushing any more without a further receive, then call downstream, +// then call this method to clear the m_bFlushing flag and re-enable +// receives +STDMETHODIMP +CBaseInputPin::EndFlush(void) +{ + // Endlush is NOT synchronized with streaming but is part of + // a control action - hence we synchronize with the filter + CAutoLock lck(m_pLock); + + // almost certainly a mistake if we are not in mid-flush + ASSERT(m_bFlushing); + + // before calling, sync with pushing thread and ensure + // no more data is going downstream, then call EndFlush on + // downstream pins. + + // now re-enable Receives + m_bFlushing = FALSE; + + // No more errors + m_bRunTimeError = FALSE; + + return S_OK; +} + + +STDMETHODIMP +CBaseInputPin::Notify(IBaseFilter * pSender, Quality q) +{ + UNREFERENCED_PARAMETER(q); + CheckPointer(pSender,E_POINTER); + ValidateReadPtr(pSender,sizeof(IBaseFilter)); + DbgBreak("IQuality::Notify called on an input pin"); + return NOERROR; +} // Notify + +/* Free up or unprepare allocator's memory, this is called through + IMediaFilter which is responsible for locking the object first */ + +HRESULT +CBaseInputPin::Inactive(void) +{ + m_bRunTimeError = FALSE; + if (m_pAllocator == NULL) { + return VFW_E_NO_ALLOCATOR; + } + + m_bFlushing = FALSE; + + return m_pAllocator->Decommit(); +} + +// what requirements do we have of the allocator - override if you want +// to support other people's allocators but need a specific alignment +// or prefix. +STDMETHODIMP +CBaseInputPin::GetAllocatorRequirements(__out ALLOCATOR_PROPERTIES*pProps) +{ + UNREFERENCED_PARAMETER(pProps); + return E_NOTIMPL; +} + +// Check if it's OK to process data +// +HRESULT +CBaseInputPin::CheckStreaming() +{ + // Shouldn't be able to get any data if we're not connected! + ASSERT(IsConnected()); + + // Don't process stuff in Stopped state + if (IsStopped()) { + return VFW_E_WRONG_STATE; + } + if (m_bFlushing) { + return S_FALSE; + } + if (m_bRunTimeError) { + return VFW_E_RUNTIME_ERROR; + } + return S_OK; +} + +// Pass on the Quality notification q to +// a. Our QualityControl sink (if we have one) or else +// b. to our upstream filter +// and if that doesn't work, throw it away with a bad return code +HRESULT +CBaseInputPin::PassNotify(Quality& q) +{ + // We pass the message on, which means that we find the quality sink + // for our input pin and send it there + + DbgLog((LOG_TRACE,3,TEXT("Passing Quality notification through transform"))); + if (m_pQSink!=NULL) { + return m_pQSink->Notify(m_pFilter, q); + } else { + // no sink set, so pass it upstream + HRESULT hr; + IQualityControl * pIQC; + + hr = VFW_E_NOT_FOUND; // default + if (m_Connected) { + m_Connected->QueryInterface(IID_IQualityControl, (void**)&pIQC); + + if (pIQC!=NULL) { + hr = pIQC->Notify(m_pFilter, q); + pIQC->Release(); + } + } + return hr; + } + +} // PassNotify + +//===================================================================== +//===================================================================== +// Memory allocation class, implements CMediaSample +//===================================================================== +//===================================================================== + + +/* NOTE The implementation of this class calls the CUnknown constructor with + a NULL outer unknown pointer. This has the effect of making us a self + contained class, ie any QueryInterface, AddRef or Release calls will be + routed to the class's NonDelegatingUnknown methods. You will typically + find that the classes that do this then override one or more of these + virtual functions to provide more specialised behaviour. A good example + of this is where a class wants to keep the QueryInterface internal but + still wants it's lifetime controlled by the external object */ + +/* The last two parameters have default values of NULL and zero */ + +CMediaSample::CMediaSample(__in_opt LPCTSTR pName, + __in_opt CBaseAllocator *pAllocator, + __inout_opt HRESULT *phr, + __in_bcount_opt(length) LPBYTE pBuffer, + LONG length) : + m_pBuffer(pBuffer), // Initialise the buffer + m_cbBuffer(length), // And it's length + m_lActual(length), // By default, actual = length + m_pMediaType(NULL), // No media type change + m_dwFlags(0), // Nothing set + m_cRef(0), // 0 ref count + m_dwTypeSpecificFlags(0), // Type specific flags + m_dwStreamId(AM_STREAM_MEDIA), // Stream id + m_pAllocator(pAllocator) // Allocator +{ +#ifdef DXMPERF + PERFLOG_CTOR( pName ? pName : L"CMediaSample", (IMediaSample *) this ); +#endif // DXMPERF + + /* We must have an owner and it must also be derived from class + CBaseAllocator BUT we do not hold a reference count on it */ + + ASSERT(pAllocator); + + if (length < 0) { + *phr = VFW_E_BUFFER_OVERFLOW; + m_cbBuffer = 0; + } +} + +#ifdef UNICODE +CMediaSample::CMediaSample(__in_opt LPCSTR pName, + __in_opt CBaseAllocator *pAllocator, + __inout_opt HRESULT *phr, + __in_bcount_opt(length) LPBYTE pBuffer, + LONG length) : + m_pBuffer(pBuffer), // Initialise the buffer + m_cbBuffer(length), // And it's length + m_lActual(length), // By default, actual = length + m_pMediaType(NULL), // No media type change + m_dwFlags(0), // Nothing set + m_cRef(0), // 0 ref count + m_dwTypeSpecificFlags(0), // Type specific flags + m_dwStreamId(AM_STREAM_MEDIA), // Stream id + m_pAllocator(pAllocator) // Allocator +{ +#ifdef DXMPERF + PERFLOG_CTOR( L"CMediaSample", (IMediaSample *) this ); +#endif // DXMPERF + + /* We must have an owner and it must also be derived from class + CBaseAllocator BUT we do not hold a reference count on it */ + + ASSERT(pAllocator); +} +#endif + +/* Destructor deletes the media type memory */ + +CMediaSample::~CMediaSample() +{ +#ifdef DXMPERF + PERFLOG_DTOR( L"CMediaSample", (IMediaSample *) this ); +#endif // DXMPERF + + if (m_pMediaType) { + DeleteMediaType(m_pMediaType); + } +} + +/* Override this to publicise our interfaces */ + +STDMETHODIMP +CMediaSample::QueryInterface(REFIID riid, __deref_out void **ppv) +{ + if (riid == IID_IMediaSample || + riid == IID_IMediaSample2 || + riid == IID_IUnknown) { + return GetInterface((IMediaSample *) this, ppv); + } else { + *ppv = NULL; + return E_NOINTERFACE; + } +} + +STDMETHODIMP_(ULONG) +CMediaSample::AddRef() +{ + return InterlockedIncrement(&m_cRef); +} + + +// -- CMediaSample lifetimes -- +// +// On final release of this sample buffer it is not deleted but +// returned to the freelist of the owning memory allocator +// +// The allocator may be waiting for the last buffer to be placed on the free +// list in order to decommit all the memory, so the ReleaseBuffer() call may +// result in this sample being deleted. We also need to hold a refcount on +// the allocator to stop that going away until we have finished with this. +// However, we cannot release the allocator before the ReleaseBuffer, as the +// release may cause us to be deleted. Similarly we can't do it afterwards. +// +// Thus we must leave it to the allocator to hold an addref on our behalf. +// When he issues us in GetBuffer, he addref's himself. When ReleaseBuffer +// is called, he releases himself, possibly causing us and him to be deleted. + + +STDMETHODIMP_(ULONG) +CMediaSample::Release() +{ + /* Decrement our own private reference count */ + LONG lRef; + if (m_cRef == 1) { + lRef = 0; + m_cRef = 0; + } else { + lRef = InterlockedDecrement(&m_cRef); + } + ASSERT(lRef >= 0); + + DbgLog((LOG_MEMORY,3,TEXT(" Unknown %X ref-- = %d"), + this, m_cRef)); + + /* Did we release our final reference count */ + if (lRef == 0) { + /* Free all resources */ + if (m_dwFlags & Sample_TypeChanged) { + SetMediaType(NULL); + } + ASSERT(m_pMediaType == NULL); + m_dwFlags = 0; + m_dwTypeSpecificFlags = 0; + m_dwStreamId = AM_STREAM_MEDIA; + + /* This may cause us to be deleted */ + // Our refcount is reliably 0 thus no-one will mess with us + m_pAllocator->ReleaseBuffer(this); + } + return (ULONG)lRef; +} + + +// set the buffer pointer and length. Used by allocators that +// want variable sized pointers or pointers into already-read data. +// This is only available through a CMediaSample* not an IMediaSample* +// and so cannot be changed by clients. +HRESULT +CMediaSample::SetPointer(__in_bcount(cBytes) BYTE * ptr, LONG cBytes) +{ + if (cBytes < 0) { + return VFW_E_BUFFER_OVERFLOW; + } + m_pBuffer = ptr; // new buffer area (could be null) + m_cbBuffer = cBytes; // length of buffer + m_lActual = cBytes; // length of data in buffer (assume full) + + return S_OK; +} + + +// get me a read/write pointer to this buffer's memory. I will actually +// want to use sizeUsed bytes. +STDMETHODIMP +CMediaSample::GetPointer(__deref_out BYTE ** ppBuffer) +{ + ValidateReadWritePtr(ppBuffer,sizeof(BYTE *)); + + // creator must have set pointer either during + // constructor or by SetPointer + ASSERT(m_pBuffer); + + *ppBuffer = m_pBuffer; + return NOERROR; +} + + +// return the size in bytes of this buffer +STDMETHODIMP_(LONG) +CMediaSample::GetSize(void) +{ + return m_cbBuffer; +} + + +// get the stream time at which this sample should start and finish. +STDMETHODIMP +CMediaSample::GetTime( + __out REFERENCE_TIME * pTimeStart, // put time here + __out REFERENCE_TIME * pTimeEnd +) +{ + ValidateReadWritePtr(pTimeStart,sizeof(REFERENCE_TIME)); + ValidateReadWritePtr(pTimeEnd,sizeof(REFERENCE_TIME)); + + if (!(m_dwFlags & Sample_StopValid)) { + if (!(m_dwFlags & Sample_TimeValid)) { + return VFW_E_SAMPLE_TIME_NOT_SET; + } else { + *pTimeStart = m_Start; + + // Make sure old stuff works + *pTimeEnd = m_Start + 1; + return VFW_S_NO_STOP_TIME; + } + } + + *pTimeStart = m_Start; + *pTimeEnd = m_End; + return NOERROR; +} + + +// Set the stream time at which this sample should start and finish. +// NULL pointers means the time is reset +STDMETHODIMP +CMediaSample::SetTime( + __in_opt REFERENCE_TIME * pTimeStart, + __in_opt REFERENCE_TIME * pTimeEnd +) +{ + if (pTimeStart == NULL) { + ASSERT(pTimeEnd == NULL); + m_dwFlags &= ~(Sample_TimeValid | Sample_StopValid); + } else { + if (pTimeEnd == NULL) { + m_Start = *pTimeStart; + m_dwFlags |= Sample_TimeValid; + m_dwFlags &= ~Sample_StopValid; + } else { + ValidateReadPtr(pTimeStart,sizeof(REFERENCE_TIME)); + ValidateReadPtr(pTimeEnd,sizeof(REFERENCE_TIME)); + ASSERT(*pTimeEnd >= *pTimeStart); + + m_Start = *pTimeStart; + m_End = *pTimeEnd; + m_dwFlags |= Sample_TimeValid | Sample_StopValid; + } + } + return NOERROR; +} + + +// get the media times (eg bytes) for this sample +STDMETHODIMP +CMediaSample::GetMediaTime( + __out LONGLONG * pTimeStart, + __out LONGLONG * pTimeEnd +) +{ + ValidateReadWritePtr(pTimeStart,sizeof(LONGLONG)); + ValidateReadWritePtr(pTimeEnd,sizeof(LONGLONG)); + + if (!(m_dwFlags & Sample_MediaTimeValid)) { + return VFW_E_MEDIA_TIME_NOT_SET; + } + + *pTimeStart = m_MediaStart; + *pTimeEnd = (m_MediaStart + m_MediaEnd); + return NOERROR; +} + + +// Set the media times for this sample +STDMETHODIMP +CMediaSample::SetMediaTime( + __in_opt LONGLONG * pTimeStart, + __in_opt LONGLONG * pTimeEnd +) +{ + if (pTimeStart == NULL) { + ASSERT(pTimeEnd == NULL); + m_dwFlags &= ~Sample_MediaTimeValid; + } else { + if (NULL == pTimeEnd) { + return E_POINTER; + } + ValidateReadPtr(pTimeStart,sizeof(LONGLONG)); + ValidateReadPtr(pTimeEnd,sizeof(LONGLONG)); + ASSERT(*pTimeEnd >= *pTimeStart); + + m_MediaStart = *pTimeStart; + m_MediaEnd = (LONG)(*pTimeEnd - *pTimeStart); + m_dwFlags |= Sample_MediaTimeValid; + } + return NOERROR; +} + + +STDMETHODIMP +CMediaSample::IsSyncPoint(void) +{ + if (m_dwFlags & Sample_SyncPoint) { + return S_OK; + } else { + return S_FALSE; + } +} + + +STDMETHODIMP +CMediaSample::SetSyncPoint(BOOL bIsSyncPoint) +{ + if (bIsSyncPoint) { + m_dwFlags |= Sample_SyncPoint; + } else { + m_dwFlags &= ~Sample_SyncPoint; + } + return NOERROR; +} + +// returns S_OK if there is a discontinuity in the data (this same is +// not a continuation of the previous stream of data +// - there has been a seek). +STDMETHODIMP +CMediaSample::IsDiscontinuity(void) +{ + if (m_dwFlags & Sample_Discontinuity) { + return S_OK; + } else { + return S_FALSE; + } +} + +// set the discontinuity property - TRUE if this sample is not a +// continuation, but a new sample after a seek. +STDMETHODIMP +CMediaSample::SetDiscontinuity(BOOL bDiscont) +{ + // should be TRUE or FALSE + if (bDiscont) { + m_dwFlags |= Sample_Discontinuity; + } else { + m_dwFlags &= ~Sample_Discontinuity; + } + return S_OK; +} + +STDMETHODIMP +CMediaSample::IsPreroll(void) +{ + if (m_dwFlags & Sample_Preroll) { + return S_OK; + } else { + return S_FALSE; + } +} + + +STDMETHODIMP +CMediaSample::SetPreroll(BOOL bIsPreroll) +{ + if (bIsPreroll) { + m_dwFlags |= Sample_Preroll; + } else { + m_dwFlags &= ~Sample_Preroll; + } + return NOERROR; +} + +STDMETHODIMP_(LONG) +CMediaSample::GetActualDataLength(void) +{ + return m_lActual; +} + + +STDMETHODIMP +CMediaSample::SetActualDataLength(LONG lActual) +{ + if (lActual > m_cbBuffer || lActual < 0) { + ASSERT(lActual <= GetSize()); + return VFW_E_BUFFER_OVERFLOW; + } + m_lActual = lActual; + return NOERROR; +} + + +/* These allow for limited format changes in band */ + +STDMETHODIMP +CMediaSample::GetMediaType(__deref_out AM_MEDIA_TYPE **ppMediaType) +{ + ValidateReadWritePtr(ppMediaType,sizeof(AM_MEDIA_TYPE *)); + ASSERT(ppMediaType); + + /* Do we have a new media type for them */ + + if (!(m_dwFlags & Sample_TypeChanged)) { + ASSERT(m_pMediaType == NULL); + *ppMediaType = NULL; + return S_FALSE; + } + + ASSERT(m_pMediaType); + + /* Create a copy of our media type */ + + *ppMediaType = CreateMediaType(m_pMediaType); + if (*ppMediaType == NULL) { + return E_OUTOFMEMORY; + } + return NOERROR; +} + + +/* Mark this sample as having a different format type */ + +STDMETHODIMP +CMediaSample::SetMediaType(__in_opt AM_MEDIA_TYPE *pMediaType) +{ + /* Delete the current media type */ + + if (m_pMediaType) { + DeleteMediaType(m_pMediaType); + m_pMediaType = NULL; + } + + /* Mechanism for resetting the format type */ + + if (pMediaType == NULL) { + m_dwFlags &= ~Sample_TypeChanged; + return NOERROR; + } + + ASSERT(pMediaType); + ValidateReadPtr(pMediaType,sizeof(AM_MEDIA_TYPE)); + + /* Take a copy of the media type */ + + m_pMediaType = CreateMediaType(pMediaType); + if (m_pMediaType == NULL) { + m_dwFlags &= ~Sample_TypeChanged; + return E_OUTOFMEMORY; + } + + m_dwFlags |= Sample_TypeChanged; + return NOERROR; +} + +// Set and get properties (IMediaSample2) +STDMETHODIMP CMediaSample::GetProperties( + DWORD cbProperties, + __out_bcount(cbProperties) BYTE * pbProperties +) +{ + if (0 != cbProperties) { + CheckPointer(pbProperties, E_POINTER); + // Return generic stuff up to the length + AM_SAMPLE2_PROPERTIES Props; + Props.cbData = min(cbProperties, sizeof(Props)); + Props.dwSampleFlags = m_dwFlags & ~Sample_MediaTimeValid; + Props.dwTypeSpecificFlags = m_dwTypeSpecificFlags; + Props.pbBuffer = m_pBuffer; + Props.cbBuffer = m_cbBuffer; + Props.lActual = m_lActual; + Props.tStart = m_Start; + Props.tStop = m_End; + Props.dwStreamId = m_dwStreamId; + if (m_dwFlags & AM_SAMPLE_TYPECHANGED) { + Props.pMediaType = m_pMediaType; + } else { + Props.pMediaType = NULL; + } + CopyMemory(pbProperties, &Props, Props.cbData); + } + return S_OK; +} + +#define CONTAINS_FIELD(type, field, offset) \ + ((FIELD_OFFSET(type, field) + sizeof(((type *)0)->field)) <= offset) + +HRESULT CMediaSample::SetProperties( + DWORD cbProperties, + __in_bcount(cbProperties) const BYTE * pbProperties +) +{ + + /* Generic properties */ + AM_MEDIA_TYPE *pMediaType = NULL; + + if (CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, cbData, cbProperties)) { + CheckPointer(pbProperties, E_POINTER); + AM_SAMPLE2_PROPERTIES *pProps = + (AM_SAMPLE2_PROPERTIES *)pbProperties; + + /* Don't use more data than is actually there */ + if (pProps->cbData < cbProperties) { + cbProperties = pProps->cbData; + } + /* We only handle IMediaSample2 */ + if (cbProperties > sizeof(*pProps) || + pProps->cbData > sizeof(*pProps)) { + return E_INVALIDARG; + } + /* Do checks first, the assignments (for backout) */ + if (CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, dwSampleFlags, cbProperties)) { + /* Check the flags */ + if (pProps->dwSampleFlags & + (~Sample_ValidFlags | Sample_MediaTimeValid)) { + return E_INVALIDARG; + } + /* Check a flag isn't being set for a property + not being provided + */ + if ((pProps->dwSampleFlags & AM_SAMPLE_TIMEVALID) && + !(m_dwFlags & AM_SAMPLE_TIMEVALID) && + !CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, tStop, cbProperties)) { + return E_INVALIDARG; + } + } + /* NB - can't SET the pointer or size */ + if (CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, pbBuffer, cbProperties)) { + + /* Check pbBuffer */ + if (pProps->pbBuffer != 0 && pProps->pbBuffer != m_pBuffer) { + return E_INVALIDARG; + } + } + if (CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, cbBuffer, cbProperties)) { + + /* Check cbBuffer */ + if (pProps->cbBuffer != 0 && pProps->cbBuffer != m_cbBuffer) { + return E_INVALIDARG; + } + } + if (CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, cbBuffer, cbProperties) && + CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, lActual, cbProperties)) { + + /* Check lActual */ + if (pProps->cbBuffer < pProps->lActual) { + return E_INVALIDARG; + } + } + + if (CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, pMediaType, cbProperties)) { + + /* Check pMediaType */ + if (pProps->dwSampleFlags & AM_SAMPLE_TYPECHANGED) { + CheckPointer(pProps->pMediaType, E_POINTER); + pMediaType = CreateMediaType(pProps->pMediaType); + if (pMediaType == NULL) { + return E_OUTOFMEMORY; + } + } + } + + /* Now do the assignments */ + if (CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, dwStreamId, cbProperties)) { + m_dwStreamId = pProps->dwStreamId; + } + if (CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, dwSampleFlags, cbProperties)) { + /* Set the flags */ + m_dwFlags = pProps->dwSampleFlags | + (m_dwFlags & Sample_MediaTimeValid); + m_dwTypeSpecificFlags = pProps->dwTypeSpecificFlags; + } else { + if (CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, dwTypeSpecificFlags, cbProperties)) { + m_dwTypeSpecificFlags = pProps->dwTypeSpecificFlags; + } + } + + if (CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, lActual, cbProperties)) { + /* Set lActual */ + m_lActual = pProps->lActual; + } + + if (CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, tStop, cbProperties)) { + + /* Set the times */ + m_End = pProps->tStop; + } + if (CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, tStart, cbProperties)) { + + /* Set the times */ + m_Start = pProps->tStart; + } + + if (CONTAINS_FIELD(AM_SAMPLE2_PROPERTIES, pMediaType, cbProperties)) { + /* Set pMediaType */ + if (pProps->dwSampleFlags & AM_SAMPLE_TYPECHANGED) { + if (m_pMediaType != NULL) { + DeleteMediaType(m_pMediaType); + } + m_pMediaType = pMediaType; + } + } + + /* Fix up the type changed flag to correctly reflect the current state + If, for instance the input contained no type change but the + output does then if we don't do this we'd lose the + output media type. + */ + if (m_pMediaType) { + m_dwFlags |= Sample_TypeChanged; + } else { + m_dwFlags &= ~Sample_TypeChanged; + } + } + + return S_OK; +} + + +// +// The streaming thread calls IPin::NewSegment(), IPin::EndOfStream(), +// IMemInputPin::Receive() and IMemInputPin::ReceiveMultiple() on the +// connected input pin. The application thread calls Block(). The +// following class members can only be called by the streaming thread. +// +// Deliver() +// DeliverNewSegment() +// StartUsingOutputPin() +// StopUsingOutputPin() +// ChangeOutputFormat() +// ChangeMediaType() +// DynamicReconnect() +// +// The following class members can only be called by the application thread. +// +// Block() +// SynchronousBlockOutputPin() +// AsynchronousBlockOutputPin() +// + +CDynamicOutputPin::CDynamicOutputPin( + __in_opt LPCTSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName) : + CBaseOutputPin(pObjectName, pFilter, pLock, phr, pName), + m_hStopEvent(NULL), + m_pGraphConfig(NULL), + m_bPinUsesReadOnlyAllocator(FALSE), + m_BlockState(NOT_BLOCKED), + m_hUnblockOutputPinEvent(NULL), + m_hNotifyCallerPinBlockedEvent(NULL), + m_dwBlockCallerThreadID(0), + m_dwNumOutstandingOutputPinUsers(0) +{ + HRESULT hr = Initialize(); + if( FAILED( hr ) ) { + *phr = hr; + return; + } +} + +#ifdef UNICODE +CDynamicOutputPin::CDynamicOutputPin( + __in_opt LPCSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName) : + CBaseOutputPin(pObjectName, pFilter, pLock, phr, pName), + m_hStopEvent(NULL), + m_pGraphConfig(NULL), + m_bPinUsesReadOnlyAllocator(FALSE), + m_BlockState(NOT_BLOCKED), + m_hUnblockOutputPinEvent(NULL), + m_hNotifyCallerPinBlockedEvent(NULL), + m_dwBlockCallerThreadID(0), + m_dwNumOutstandingOutputPinUsers(0) +{ + HRESULT hr = Initialize(); + if( FAILED( hr ) ) { + *phr = hr; + return; + } +} +#endif + +CDynamicOutputPin::~CDynamicOutputPin() +{ + if(NULL != m_hUnblockOutputPinEvent) { + // This call should not fail because we have access to m_hUnblockOutputPinEvent + // and m_hUnblockOutputPinEvent is a valid event. + EXECUTE_ASSERT(::CloseHandle(m_hUnblockOutputPinEvent)); + } + + if(NULL != m_hNotifyCallerPinBlockedEvent) { + // This call should not fail because we have access to m_hNotifyCallerPinBlockedEvent + // and m_hNotifyCallerPinBlockedEvent is a valid event. + EXECUTE_ASSERT(::CloseHandle(m_hNotifyCallerPinBlockedEvent)); + } +} + +HRESULT CDynamicOutputPin::Initialize(void) +{ + m_hUnblockOutputPinEvent = ::CreateEvent( NULL, // The event will have the default security descriptor. + TRUE, // This is a manual reset event. + TRUE, // The event is initially signaled. + NULL ); // The event is not named. + + // CreateEvent() returns NULL if an error occurs. + if(NULL == m_hUnblockOutputPinEvent) { + return AmGetLastErrorToHResult(); + } + + // Set flag to say we can reconnect while streaming. + SetReconnectWhenActive(true); + + return S_OK; +} + +STDMETHODIMP CDynamicOutputPin::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + if(riid == IID_IPinFlowControl) { + return GetInterface(static_cast<IPinFlowControl*>(this), ppv); + } else { + return CBaseOutputPin::NonDelegatingQueryInterface(riid, ppv); + } +} + +STDMETHODIMP CDynamicOutputPin::Disconnect(void) +{ + CAutoLock cObjectLock(m_pLock); + return DisconnectInternal(); +} + +STDMETHODIMP CDynamicOutputPin::Block(DWORD dwBlockFlags, HANDLE hEvent) +{ + const DWORD VALID_FLAGS = AM_PIN_FLOW_CONTROL_BLOCK; + + // Check for illegal flags. + if(dwBlockFlags & ~VALID_FLAGS) { + return E_INVALIDARG; + } + + // Make sure the event is unsignaled. + if((dwBlockFlags & AM_PIN_FLOW_CONTROL_BLOCK) && (NULL != hEvent)) { + if( !::ResetEvent( hEvent ) ) { + return AmGetLastErrorToHResult(); + } + } + + // No flags are set if we are unblocking the output pin. + if(0 == dwBlockFlags) { + + // This parameter should be NULL because unblock operations are always synchronous. + // There is no need to notify the caller when the event is done. + if(NULL != hEvent) { + return E_INVALIDARG; + } + } + + #ifdef DEBUG + AssertValid(); + #endif // DEBUG + + HRESULT hr; + + if(dwBlockFlags & AM_PIN_FLOW_CONTROL_BLOCK) { + // IPinFlowControl::Block()'s hEvent parameter is NULL if the block is synchronous. + // If hEvent is not NULL, the block is asynchronous. + if(NULL == hEvent) { + hr = SynchronousBlockOutputPin(); + } else { + hr = AsynchronousBlockOutputPin(hEvent); + } + } else { + hr = UnblockOutputPin(); + } + + #ifdef DEBUG + AssertValid(); + #endif // DEBUG + + if(FAILED(hr)) { + return hr; + } + + return S_OK; +} + +HRESULT CDynamicOutputPin::SynchronousBlockOutputPin(void) +{ + HANDLE hNotifyCallerPinBlockedEvent = :: CreateEvent( NULL, // The event will have the default security attributes. + FALSE, // This is an automatic reset event. + FALSE, // The event is initially unsignaled. + NULL ); // The event is not named. + + // CreateEvent() returns NULL if an error occurs. + if(NULL == hNotifyCallerPinBlockedEvent) { + return AmGetLastErrorToHResult(); + } + + HRESULT hr = AsynchronousBlockOutputPin(hNotifyCallerPinBlockedEvent); + if(FAILED(hr)) { + // This call should not fail because we have access to hNotifyCallerPinBlockedEvent + // and hNotifyCallerPinBlockedEvent is a valid event. + EXECUTE_ASSERT(::CloseHandle(hNotifyCallerPinBlockedEvent)); + + return hr; + } + + hr = WaitEvent(hNotifyCallerPinBlockedEvent); + + // This call should not fail because we have access to hNotifyCallerPinBlockedEvent + // and hNotifyCallerPinBlockedEvent is a valid event. + EXECUTE_ASSERT(::CloseHandle(hNotifyCallerPinBlockedEvent)); + + if(FAILED(hr)) { + return hr; + } + + return S_OK; +} + +HRESULT CDynamicOutputPin::AsynchronousBlockOutputPin(HANDLE hNotifyCallerPinBlockedEvent) +{ + // This function holds the m_BlockStateLock because it uses + // m_dwBlockCallerThreadID, m_BlockState and + // m_hNotifyCallerPinBlockedEvent. + CAutoLock alBlockStateLock(&m_BlockStateLock); + + if(NOT_BLOCKED != m_BlockState) { + if(m_dwBlockCallerThreadID == ::GetCurrentThreadId()) { + return VFW_E_PIN_ALREADY_BLOCKED_ON_THIS_THREAD; + } else { + return VFW_E_PIN_ALREADY_BLOCKED; + } + } + + BOOL fSuccess = ::DuplicateHandle( ::GetCurrentProcess(), + hNotifyCallerPinBlockedEvent, + ::GetCurrentProcess(), + &m_hNotifyCallerPinBlockedEvent, + EVENT_MODIFY_STATE, + FALSE, + 0 ); + if( !fSuccess ) { + return AmGetLastErrorToHResult(); + } + + m_BlockState = PENDING; + m_dwBlockCallerThreadID = ::GetCurrentThreadId(); + + // The output pin cannot be blocked if the streaming thread is + // calling IPin::NewSegment(), IPin::EndOfStream(), IMemInputPin::Receive() + // or IMemInputPin::ReceiveMultiple() on the connected input pin. Also, it + // cannot be blocked if the streaming thread is calling DynamicReconnect(), + // ChangeMediaType() or ChangeOutputFormat(). + if(!StreamingThreadUsingOutputPin()) { + + // The output pin can be immediately blocked. + BlockOutputPin(); + } + + return S_OK; +} + +void CDynamicOutputPin::BlockOutputPin(void) +{ + // The caller should always hold the m_BlockStateLock because this function + // uses m_BlockState and m_hNotifyCallerPinBlockedEvent. + ASSERT(CritCheckIn(&m_BlockStateLock)); + + // This function should not be called if the streaming thread is modifying + // the connection state or it's passing data downstream. + ASSERT(!StreamingThreadUsingOutputPin()); + + // This should not fail because we successfully created the event + // and we have the security permissions to change it's state. + EXECUTE_ASSERT(::ResetEvent(m_hUnblockOutputPinEvent)); + + // This event should not fail because AsynchronousBlockOutputPin() successfully + // duplicated this handle and we have the appropriate security permissions. + EXECUTE_ASSERT(::SetEvent(m_hNotifyCallerPinBlockedEvent)); + EXECUTE_ASSERT(::CloseHandle(m_hNotifyCallerPinBlockedEvent)); + + m_BlockState = BLOCKED; + m_hNotifyCallerPinBlockedEvent = NULL; +} + +HRESULT CDynamicOutputPin::UnblockOutputPin(void) +{ + // UnblockOutputPin() holds the m_BlockStateLock because it + // uses m_BlockState, m_dwBlockCallerThreadID and + // m_hNotifyCallerPinBlockedEvent. + CAutoLock alBlockStateLock(&m_BlockStateLock); + + if(NOT_BLOCKED == m_BlockState) { + return S_FALSE; + } + + // This should not fail because we successfully created the event + // and we have the security permissions to change it's state. + EXECUTE_ASSERT(::SetEvent(m_hUnblockOutputPinEvent)); + + // Cancel the block operation if it's still pending. + if(NULL != m_hNotifyCallerPinBlockedEvent) { + // This event should not fail because AsynchronousBlockOutputPin() successfully + // duplicated this handle and we have the appropriate security permissions. + EXECUTE_ASSERT(::SetEvent(m_hNotifyCallerPinBlockedEvent)); + EXECUTE_ASSERT(::CloseHandle(m_hNotifyCallerPinBlockedEvent)); + } + + m_BlockState = NOT_BLOCKED; + m_dwBlockCallerThreadID = 0; + m_hNotifyCallerPinBlockedEvent = NULL; + + return S_OK; +} + +HRESULT CDynamicOutputPin::StartUsingOutputPin(void) +{ + // The caller should not hold m_BlockStateLock. If the caller does, + // a deadlock could occur. + ASSERT(CritCheckOut(&m_BlockStateLock)); + + CAutoLock alBlockStateLock(&m_BlockStateLock); + + #ifdef DEBUG + AssertValid(); + #endif // DEBUG + + // Are we in the middle of a block operation? + while(BLOCKED == m_BlockState) { + m_BlockStateLock.Unlock(); + + // If this ASSERT fires, a deadlock could occur. The caller should make sure + // that this thread never acquires the Block State lock more than once. + ASSERT(CritCheckOut( &m_BlockStateLock )); + + // WaitForMultipleObjects() returns WAIT_OBJECT_0 if the unblock event + // is fired. It returns WAIT_OBJECT_0 + 1 if the stop event if fired. + // See the Windows SDK documentation for more information on + // WaitForMultipleObjects(). + const DWORD UNBLOCK = WAIT_OBJECT_0; + const DWORD STOP = WAIT_OBJECT_0 + 1; + + HANDLE ahWaitEvents = { m_hUnblockOutputPinEvent, m_hStopEvent }; + DWORD dwNumWaitEvents = sizeof(ahWaitEvents)/sizeof(HANDLE); + + DWORD dwReturnValue = ::WaitForMultipleObjects( dwNumWaitEvents, ahWaitEvents, FALSE, INFINITE ); + + m_BlockStateLock.Lock(); + + #ifdef DEBUG + AssertValid(); + #endif // DEBUG + + switch( dwReturnValue ) { + case UNBLOCK: + break; + + case STOP: + return VFW_E_STATE_CHANGED; + + case WAIT_FAILED: + return AmGetLastErrorToHResult(); + + default: + DbgBreak( "An Unexpected case occured in CDynamicOutputPin::StartUsingOutputPin()." ); + return E_UNEXPECTED; + } + } + + m_dwNumOutstandingOutputPinUsers++; + + #ifdef DEBUG + AssertValid(); + #endif // DEBUG + + return S_OK; +} + +void CDynamicOutputPin::StopUsingOutputPin(void) +{ + CAutoLock alBlockStateLock(&m_BlockStateLock); + + #ifdef DEBUG + AssertValid(); + #endif // DEBUG + + m_dwNumOutstandingOutputPinUsers--; + + if((m_dwNumOutstandingOutputPinUsers == 0) && (NOT_BLOCKED != m_BlockState)) { + BlockOutputPin(); + } + + #ifdef DEBUG + AssertValid(); + #endif // DEBUG +} + +bool CDynamicOutputPin::StreamingThreadUsingOutputPin(void) +{ + CAutoLock alBlockStateLock(&m_BlockStateLock); + + return (m_dwNumOutstandingOutputPinUsers > 0); +} + +void CDynamicOutputPin::SetConfigInfo(IGraphConfig *pGraphConfig, HANDLE hStopEvent) +{ + // This pointer is not addrefed because filters are not allowed to + // hold references to the filter graph manager. See the documentation for + // IBaseFilter::JoinFilterGraph() in the Direct Show SDK for more information. + m_pGraphConfig = pGraphConfig; + + m_hStopEvent = hStopEvent; +} + +HRESULT CDynamicOutputPin::Active(void) +{ + // Make sure the user initialized the object by calling SetConfigInfo(). + if((NULL == m_hStopEvent) || (NULL == m_pGraphConfig)) { + DbgBreak( ERROR: CDynamicOutputPin::Active() failed because m_pGraphConfig and m_hStopEvent were not initialized. Call SetConfigInfo() to initialize them. ); + return E_FAIL; + } + + // If this ASSERT fires, the user may have passed an invalid event handle to SetConfigInfo(). + // The ASSERT can also fire if the event if destroyed and then Active() is called. An event + // handle is invalid if 1) the event does not exist or the user does not have the security + // permissions to use the event. + EXECUTE_ASSERT(ResetEvent(m_hStopEvent)); + + return CBaseOutputPin::Active(); +} + +HRESULT CDynamicOutputPin::Inactive(void) +{ + // If this ASSERT fires, the user may have passed an invalid event handle to SetConfigInfo(). + // The ASSERT can also fire if the event if destroyed and then Active() is called. An event + // handle is invalid if 1) the event does not exist or the user does not have the security + // permissions to use the event. + EXECUTE_ASSERT(SetEvent(m_hStopEvent)); + + return CBaseOutputPin::Inactive(); +} + +HRESULT CDynamicOutputPin::DeliverBeginFlush(void) +{ + // If this ASSERT fires, the user may have passed an invalid event handle to SetConfigInfo(). + // The ASSERT can also fire if the event if destroyed and then DeliverBeginFlush() is called. + // An event handle is invalid if 1) the event does not exist or the user does not have the security + // permissions to use the event. + EXECUTE_ASSERT(SetEvent(m_hStopEvent)); + + return CBaseOutputPin::DeliverBeginFlush(); +} + +HRESULT CDynamicOutputPin::DeliverEndFlush(void) +{ + // If this ASSERT fires, the user may have passed an invalid event handle to SetConfigInfo(). + // The ASSERT can also fire if the event if destroyed and then DeliverBeginFlush() is called. + // An event handle is invalid if 1) the event does not exist or the user does not have the security + // permissions to use the event. + EXECUTE_ASSERT(ResetEvent(m_hStopEvent)); + + return CBaseOutputPin::DeliverEndFlush(); +} + + +// ChangeOutputFormat() either dynamicly changes the connection's format type or it dynamicly +// reconnects the output pin. +HRESULT CDynamicOutputPin::ChangeOutputFormat + ( + const AM_MEDIA_TYPE *pmt, + REFERENCE_TIME tSegmentStart, + REFERENCE_TIME tSegmentStop, + double dSegmentRate + ) +{ + // The caller should call StartUsingOutputPin() before calling this + // method. + ASSERT(StreamingThreadUsingOutputPin()); + + // Callers should always pass a valid media type to ChangeOutputFormat() . + ASSERT(NULL != pmt); + + CMediaType cmt(*pmt); + HRESULT hr = ChangeMediaType(&cmt); + if (FAILED(hr)) { + return hr; + } + + hr = DeliverNewSegment(tSegmentStart, tSegmentStop, dSegmentRate); + if( FAILED( hr ) ) { + return hr; + } + + return S_OK; +} + +HRESULT CDynamicOutputPin::ChangeMediaType(const CMediaType *pmt) +{ + // The caller should call StartUsingOutputPin() before calling this + // method. + ASSERT(StreamingThreadUsingOutputPin()); + + // This function assumes the filter graph is running. + ASSERT(!IsStopped()); + + if(!IsConnected()) { + return VFW_E_NOT_CONNECTED; + } + + /* First check if the downstream pin will accept a dynamic + format change + */ + QzCComPtr<IPinConnection> pConnection; + + m_Connected->QueryInterface(IID_IPinConnection, (void **)&pConnection); + if(pConnection != NULL) { + + if(S_OK == pConnection->DynamicQueryAccept(pmt)) { + + HRESULT hr = ChangeMediaTypeHelper(pmt); + if(FAILED(hr)) { + return hr; + } + + return S_OK; + } + } + + /* Can't do the dynamic connection */ + return DynamicReconnect(pmt); +} + +HRESULT CDynamicOutputPin::ChangeMediaTypeHelper(const CMediaType *pmt) +{ + // The caller should call StartUsingOutputPin() before calling this + // method. + ASSERT(StreamingThreadUsingOutputPin()); + + HRESULT hr = m_Connected->ReceiveConnection(this, pmt); + if(FAILED(hr)) { + return hr; + } + + hr = SetMediaType(pmt); + if(FAILED(hr)) { + return hr; + } + + // Does this pin use the local memory transport? + if(NULL != m_pInputPin) { + // This function assumes that m_pInputPin and m_Connected are + // two different interfaces to the same object. + ASSERT(::IsEqualObject(m_Connected, m_pInputPin)); + + ALLOCATOR_PROPERTIES apInputPinRequirements; + apInputPinRequirements.cbAlign = 0; + apInputPinRequirements.cbBuffer = 0; + apInputPinRequirements.cbPrefix = 0; + apInputPinRequirements.cBuffers = 0; + + m_pInputPin->GetAllocatorRequirements(&apInputPinRequirements); + + // A zero allignment does not make any sense. + if(0 == apInputPinRequirements.cbAlign) { + apInputPinRequirements.cbAlign = 1; + } + + hr = m_pAllocator->Decommit(); + if(FAILED(hr)) { + return hr; + } + + hr = DecideBufferSize(m_pAllocator, &apInputPinRequirements); + if(FAILED(hr)) { + return hr; + } + + hr = m_pAllocator->Commit(); + if(FAILED(hr)) { + return hr; + } + + hr = m_pInputPin->NotifyAllocator(m_pAllocator, m_bPinUsesReadOnlyAllocator); + if(FAILED(hr)) { + return hr; + } + } + + return S_OK; +} + +// this method has to be called from the thread that is pushing data, +// and it's the caller's responsibility to make sure that the thread +// has no outstand samples because they cannot be delivered after a +// reconnect +// +HRESULT CDynamicOutputPin::DynamicReconnect( const CMediaType* pmt ) +{ + // The caller should call StartUsingOutputPin() before calling this + // method. + ASSERT(StreamingThreadUsingOutputPin()); + + if((m_pGraphConfig == NULL) || (NULL == m_hStopEvent)) { + return E_FAIL; + } + + HRESULT hr = m_pGraphConfig->Reconnect( + this, + NULL, + pmt, + NULL, + m_hStopEvent, + AM_GRAPH_CONFIG_RECONNECT_CACHE_REMOVED_FILTERS ); + + return hr; +} + +HRESULT CDynamicOutputPin::CompleteConnect(IPin *pReceivePin) +{ + HRESULT hr = CBaseOutputPin::CompleteConnect(pReceivePin); + if(SUCCEEDED(hr)) { + if(!IsStopped() && m_pAllocator) { + hr = m_pAllocator->Commit(); + ASSERT(hr != VFW_E_ALREADY_COMMITTED); + } + } + + return hr; +} + +#ifdef DEBUG +void CDynamicOutputPin::AssertValid(void) +{ + // Make sure the object was correctly initialized. + + // This ASSERT only fires if the object failed to initialize + // and the user ignored the constructor's return code (phr). + ASSERT(NULL != m_hUnblockOutputPinEvent); + + // If either of these ASSERTs fire, the user did not correctly call + // SetConfigInfo(). + ASSERT(NULL != m_hStopEvent); + ASSERT(NULL != m_pGraphConfig); + + // Make sure the block state is consistent. + + CAutoLock alBlockStateLock(&m_BlockStateLock); + + // BLOCK_STATE variables only have three legal values: PENDING, BLOCKED and NOT_BLOCKED. + ASSERT((NOT_BLOCKED == m_BlockState) || (PENDING == m_BlockState) || (BLOCKED == m_BlockState)); + + // m_hNotifyCallerPinBlockedEvent is only needed when a block operation cannot complete + // immediately. + ASSERT(((NULL == m_hNotifyCallerPinBlockedEvent) && (PENDING != m_BlockState)) || + ((NULL != m_hNotifyCallerPinBlockedEvent) && (PENDING == m_BlockState)) ); + + // m_dwBlockCallerThreadID should always be 0 if the pin is not blocked and + // the user is not trying to block the pin. + ASSERT((0 == m_dwBlockCallerThreadID) || (NOT_BLOCKED != m_BlockState)); + + // If this ASSERT fires, the streaming thread is using the output pin and the + // output pin is blocked. + ASSERT(((0 != m_dwNumOutstandingOutputPinUsers) && (BLOCKED != m_BlockState)) || + ((0 == m_dwNumOutstandingOutputPinUsers) && (NOT_BLOCKED != m_BlockState)) || + ((0 == m_dwNumOutstandingOutputPinUsers) && (NOT_BLOCKED == m_BlockState)) ); +} +#endif // DEBUG + +HRESULT CDynamicOutputPin::WaitEvent(HANDLE hEvent) +{ + const DWORD EVENT_SIGNALED = WAIT_OBJECT_0; + + DWORD dwReturnValue = ::WaitForSingleObject(hEvent, INFINITE); + + switch( dwReturnValue ) { + case EVENT_SIGNALED: + return S_OK; + + case WAIT_FAILED: + return AmGetLastErrorToHResult(); + + default: + DbgBreak( "An Unexpected case occured in CDynamicOutputPin::WaitEvent()." ); + return E_UNEXPECTED; + } +} + +//===================================================================== +//===================================================================== +// Implements CBaseAllocator +//===================================================================== +//===================================================================== + + +/* Constructor overrides the default settings for the free list to request + that it be alertable (ie the list can be cast to a handle which can be + passed to WaitForSingleObject). Both of the allocator lists also ask for + object locking, the all list matches the object default settings but I + have included them here just so it is obvious what kind of list it is */ + +CBaseAllocator::CBaseAllocator(__in_opt LPCTSTR pName, + __inout_opt LPUNKNOWN pUnk, + __inout HRESULT *phr, + BOOL bEvent, + BOOL fEnableReleaseCallback + ) : + CUnknown(pName, pUnk), + m_lAllocated(0), + m_bChanged(FALSE), + m_bCommitted(FALSE), + m_bDecommitInProgress(FALSE), + m_lSize(0), + m_lCount(0), + m_lAlignment(0), + m_lPrefix(0), + m_hSem(NULL), + m_lWaiting(0), + m_fEnableReleaseCallback(fEnableReleaseCallback), + m_pNotify(NULL) +{ +#ifdef DXMPERF + PERFLOG_CTOR( pName ? pName : L"CBaseAllocator", (IMemAllocator *) this ); +#endif // DXMPERF + + if (bEvent) { + m_hSem = CreateSemaphore(NULL, 0, 0x7FFFFFFF, NULL); + if (m_hSem == NULL) { + *phr = E_OUTOFMEMORY; + return; + } + } +} + +#ifdef UNICODE +CBaseAllocator::CBaseAllocator(__in_opt LPCSTR pName, + __inout_opt LPUNKNOWN pUnk, + __inout HRESULT *phr, + BOOL bEvent, + BOOL fEnableReleaseCallback) : + CUnknown(pName, pUnk), + m_lAllocated(0), + m_bChanged(FALSE), + m_bCommitted(FALSE), + m_bDecommitInProgress(FALSE), + m_lSize(0), + m_lCount(0), + m_lAlignment(0), + m_lPrefix(0), + m_hSem(NULL), + m_lWaiting(0), + m_fEnableReleaseCallback(fEnableReleaseCallback), + m_pNotify(NULL) +{ +#ifdef DXMPERF + PERFLOG_CTOR( L"CBaseAllocator", (IMemAllocator *) this ); +#endif // DXMPERF + + if (bEvent) { + m_hSem = CreateSemaphore(NULL, 0, 0x7FFFFFFF, NULL); + if (m_hSem == NULL) { + *phr = E_OUTOFMEMORY; + return; + } + } +} +#endif + +/* Destructor */ + +CBaseAllocator::~CBaseAllocator() +{ + // we can't call Decommit here since that would mean a call to a + // pure virtual in destructor. + // We must assume that the derived class has gone into decommit state in + // its destructor. +#ifdef DXMPERF + PERFLOG_DTOR( L"CBaseAllocator", (IMemAllocator *) this ); +#endif // DXMPERF + + ASSERT(!m_bCommitted); + if (m_hSem != NULL) { + EXECUTE_ASSERT(CloseHandle(m_hSem)); + } + if (m_pNotify) { + m_pNotify->Release(); + } +} + + +/* Override this to publicise our interfaces */ + +STDMETHODIMP +CBaseAllocator::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + /* Do we know about this interface */ + + if (riid == IID_IMemAllocator || + riid == IID_IMemAllocatorCallbackTemp && m_fEnableReleaseCallback) { + return GetInterface((IMemAllocatorCallbackTemp *) this, ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } +} + + +/* This sets the size and count of the required samples. The memory isn't + actually allocated until Commit() is called, if memory has already been + allocated then assuming no samples are outstanding the user may call us + to change the buffering, the memory will be released in Commit() */ + +STDMETHODIMP +CBaseAllocator::SetProperties( + __in ALLOCATOR_PROPERTIES* pRequest, + __out ALLOCATOR_PROPERTIES* pActual) +{ + CheckPointer(pRequest, E_POINTER); + CheckPointer(pActual, E_POINTER); + ValidateReadWritePtr(pActual, sizeof(ALLOCATOR_PROPERTIES)); + CAutoLock cObjectLock(this); + + ZeroMemory(pActual, sizeof(ALLOCATOR_PROPERTIES)); + + ASSERT(pRequest->cbBuffer > 0); + + /* Check the alignment requested */ + if (pRequest->cbAlign != 1) { + DbgLog((LOG_ERROR, 2, TEXT("Alignment requested was 0x%x, not 1"), + pRequest->cbAlign)); + return VFW_E_BADALIGN; + } + + /* Can't do this if already committed, there is an argument that says we + should not reject the SetProperties call if there are buffers still + active. However this is called by the source filter, which is the same + person who is holding the samples. Therefore it is not unreasonable + for them to free all their samples before changing the requirements */ + + if (m_bCommitted) { + return VFW_E_ALREADY_COMMITTED; + } + + /* Must be no outstanding buffers */ + + if (m_lAllocated != m_lFree.GetCount()) { + return VFW_E_BUFFERS_OUTSTANDING; + } + + /* There isn't any real need to check the parameters as they + will just be rejected when the user finally calls Commit */ + + pActual->cbBuffer = m_lSize = pRequest->cbBuffer; + pActual->cBuffers = m_lCount = pRequest->cBuffers; + pActual->cbAlign = m_lAlignment = pRequest->cbAlign; + pActual->cbPrefix = m_lPrefix = pRequest->cbPrefix; + + m_bChanged = TRUE; + return NOERROR; +} + +STDMETHODIMP +CBaseAllocator::GetProperties( + __out ALLOCATOR_PROPERTIES * pActual) +{ + CheckPointer(pActual,E_POINTER); + ValidateReadWritePtr(pActual,sizeof(ALLOCATOR_PROPERTIES)); + + CAutoLock cObjectLock(this); + pActual->cbBuffer = m_lSize; + pActual->cBuffers = m_lCount; + pActual->cbAlign = m_lAlignment; + pActual->cbPrefix = m_lPrefix; + return NOERROR; +} + +// get container for a sample. Blocking, synchronous call to get the +// next free buffer (as represented by an IMediaSample interface). +// on return, the time etc properties will be invalid, but the buffer +// pointer and size will be correct. + +HRESULT CBaseAllocator::GetBuffer(__deref_out IMediaSample **ppBuffer, + __in_opt REFERENCE_TIME *pStartTime, + __in_opt REFERENCE_TIME *pEndTime, + DWORD dwFlags + ) +{ + UNREFERENCED_PARAMETER(pStartTime); + UNREFERENCED_PARAMETER(pEndTime); + UNREFERENCED_PARAMETER(dwFlags); + CMediaSample *pSample; + + *ppBuffer = NULL; + for (;;) + { + { // scope for lock + CAutoLock cObjectLock(this); + + /* Check we are committed */ + if (!m_bCommitted) { + return VFW_E_NOT_COMMITTED; + } + pSample = (CMediaSample *) m_lFree.RemoveHead(); + if (pSample == NULL) { + SetWaiting(); + } + } + + /* If we didn't get a sample then wait for the list to signal */ + + if (pSample) { + break; + } + if (dwFlags & AM_GBF_NOWAIT) { + return VFW_E_TIMEOUT; + } + ASSERT(m_hSem != NULL); + WaitForSingleObject(m_hSem, INFINITE); + } + + /* Addref the buffer up to one. On release + back to zero instead of being deleted, it will requeue itself by + calling the ReleaseBuffer member function. NOTE the owner of a + media sample must always be derived from CBaseAllocator */ + + + ASSERT(pSample->m_cRef == 0); + pSample->m_cRef = 1; + *ppBuffer = pSample; + +#ifdef DXMPERF + PERFLOG_GETBUFFER( (IMemAllocator *) this, pSample ); +#endif // DXMPERF + + return NOERROR; +} + + +/* Final release of a CMediaSample will call this */ + +STDMETHODIMP +CBaseAllocator::ReleaseBuffer(IMediaSample * pSample) +{ + CheckPointer(pSample,E_POINTER); + ValidateReadPtr(pSample,sizeof(IMediaSample)); + +#ifdef DXMPERF + PERFLOG_RELBUFFER( (IMemAllocator *) this, pSample ); +#endif // DXMPERF + + + BOOL bRelease = FALSE; + { + CAutoLock cal(this); + + /* Put back on the free list */ + + m_lFree.Add((CMediaSample *)pSample); + if (m_lWaiting != 0) { + NotifySample(); + } + + // if there is a pending Decommit, then we need to complete it by + // calling Free() when the last buffer is placed on the free list + + LONG l1 = m_lFree.GetCount(); + if (m_bDecommitInProgress && (l1 == m_lAllocated)) { + Free(); + m_bDecommitInProgress = FALSE; + bRelease = TRUE; + } + } + + if (m_pNotify) { + + ASSERT(m_fEnableReleaseCallback); + + // + // Note that this is not synchronized with setting up a notification + // method. + // + m_pNotify->NotifyRelease(); + } + + /* For each buffer there is one AddRef, made in GetBuffer and released + here. This may cause the allocator and all samples to be deleted */ + + if (bRelease) { + Release(); + } + return NOERROR; +} + +STDMETHODIMP +CBaseAllocator::SetNotify( + IMemAllocatorNotifyCallbackTemp* pNotify + ) +{ + ASSERT(m_fEnableReleaseCallback); + CAutoLock lck(this); + if (pNotify) { + pNotify->AddRef(); + } + if (m_pNotify) { + m_pNotify->Release(); + } + m_pNotify = pNotify; + return S_OK; +} + +STDMETHODIMP +CBaseAllocator::GetFreeCount( + __out LONG* plBuffersFree + ) +{ + ASSERT(m_fEnableReleaseCallback); + CAutoLock cObjectLock(this); + *plBuffersFree = m_lCount - m_lAllocated + m_lFree.GetCount(); + return NOERROR; +} + +void +CBaseAllocator::NotifySample() +{ + if (m_lWaiting != 0) { + ASSERT(m_hSem != NULL); + ReleaseSemaphore(m_hSem, m_lWaiting, 0); + m_lWaiting = 0; + } +} + +STDMETHODIMP +CBaseAllocator::Commit() +{ + /* Check we are not decommitted */ + CAutoLock cObjectLock(this); + + // cannot need to alloc or re-alloc if we are committed + if (m_bCommitted) { + return NOERROR; + } + + /* Allow GetBuffer calls */ + + m_bCommitted = TRUE; + + // is there a pending decommit ? if so, just cancel it + if (m_bDecommitInProgress) { + m_bDecommitInProgress = FALSE; + + // don't call Alloc at this point. He cannot allow SetProperties + // between Decommit and the last free, so the buffer size cannot have + // changed. And because some of the buffers are not free yet, he + // cannot re-alloc anyway. + return NOERROR; + } + + DbgLog((LOG_MEMORY, 1, TEXT("Allocating: %ldx%ld"), m_lCount, m_lSize)); + + // actually need to allocate the samples + HRESULT hr = Alloc(); + if (FAILED(hr)) { + m_bCommitted = FALSE; + return hr; + } + AddRef(); + return NOERROR; +} + + +STDMETHODIMP +CBaseAllocator::Decommit() +{ + BOOL bRelease = FALSE; + { + /* Check we are not already decommitted */ + CAutoLock cObjectLock(this); + if (m_bCommitted == FALSE) { + if (m_bDecommitInProgress == FALSE) { + return NOERROR; + } + } + + /* No more GetBuffer calls will succeed */ + m_bCommitted = FALSE; + + // are any buffers outstanding? + if (m_lFree.GetCount() < m_lAllocated) { + // please complete the decommit when last buffer is freed + m_bDecommitInProgress = TRUE; + } else { + m_bDecommitInProgress = FALSE; + + // need to complete the decommit here as there are no + // outstanding buffers + + Free(); + bRelease = TRUE; + } + + // Tell anyone waiting that they can go now so we can + // reject their call +#pragma warning(push) +#ifndef _PREFAST_ +#pragma warning(disable:4068) +#endif +#pragma prefast(suppress:__WARNING_DEREF_NULL_PTR, "Suppress warning related to Free() invalidating 'this' which is no applicable to CBaseAllocator::Free()") + NotifySample(); + +#pragma warning(pop) + } + + if (bRelease) { + Release(); + } + return NOERROR; +} + + +/* Base definition of allocation which checks we are ok to go ahead and do + the full allocation. We return S_FALSE if the requirements are the same */ + +HRESULT +CBaseAllocator::Alloc(void) +{ + /* Error if he hasn't set the size yet */ + if (m_lCount <= 0 || m_lSize <= 0 || m_lAlignment <= 0) { + return VFW_E_SIZENOTSET; + } + + /* should never get here while buffers outstanding */ + ASSERT(m_lFree.GetCount() == m_lAllocated); + + /* If the requirements haven't changed then don't reallocate */ + if (m_bChanged == FALSE) { + return S_FALSE; + } + + return NOERROR; +} + +/* Implement CBaseAllocator::CSampleList::Remove(pSample) + Removes pSample from the list +*/ +void +CBaseAllocator::CSampleList::Remove(__inout CMediaSample * pSample) +{ + CMediaSample **pSearch; + for (pSearch = &m_List; + *pSearch != NULL; + pSearch = &(CBaseAllocator::NextSample(*pSearch))) { + if (*pSearch == pSample) { + *pSearch = CBaseAllocator::NextSample(pSample); + CBaseAllocator::NextSample(pSample) = NULL; + m_nOnList--; + return; + } + } + DbgBreak("Couldn't find sample in list"); +} + +//===================================================================== +//===================================================================== +// Implements CMemAllocator +//===================================================================== +//===================================================================== + + +/* This goes in the factory template table to create new instances */ +CUnknown *CMemAllocator::CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr) +{ + CUnknown *pUnkRet = new CMemAllocator(NAME("CMemAllocator"), pUnk, phr); + return pUnkRet; +} + +CMemAllocator::CMemAllocator( + __in_opt LPCTSTR pName, + __inout_opt LPUNKNOWN pUnk, + __inout HRESULT *phr) + : CBaseAllocator(pName, pUnk, phr, TRUE, TRUE), + m_pBuffer(NULL) +{ +} + +#ifdef UNICODE +CMemAllocator::CMemAllocator( + __in_opt LPCSTR pName, + __inout_opt LPUNKNOWN pUnk, + __inout HRESULT *phr) + : CBaseAllocator(pName, pUnk, phr, TRUE, TRUE), + m_pBuffer(NULL) +{ +} +#endif + +/* This sets the size and count of the required samples. The memory isn't + actually allocated until Commit() is called, if memory has already been + allocated then assuming no samples are outstanding the user may call us + to change the buffering, the memory will be released in Commit() */ +STDMETHODIMP +CMemAllocator::SetProperties( + __in ALLOCATOR_PROPERTIES* pRequest, + __out ALLOCATOR_PROPERTIES* pActual) +{ + CheckPointer(pActual,E_POINTER); + ValidateReadWritePtr(pActual,sizeof(ALLOCATOR_PROPERTIES)); + CAutoLock cObjectLock(this); + + ZeroMemory(pActual, sizeof(ALLOCATOR_PROPERTIES)); + + ASSERT(pRequest->cbBuffer > 0); + + SYSTEM_INFO SysInfo; + GetSystemInfo(&SysInfo); + + /* Check the alignment request is a power of 2 */ + if ((-pRequest->cbAlign & pRequest->cbAlign) != pRequest->cbAlign) { + DbgLog((LOG_ERROR, 1, TEXT("Alignment requested 0x%x not a power of 2!"), + pRequest->cbAlign)); + } + /* Check the alignment requested */ + if (pRequest->cbAlign == 0 || + (SysInfo.dwAllocationGranularity & (pRequest->cbAlign - 1)) != 0) { + DbgLog((LOG_ERROR, 1, TEXT("Invalid alignment 0x%x requested - granularity = 0x%x"), + pRequest->cbAlign, SysInfo.dwAllocationGranularity)); + return VFW_E_BADALIGN; + } + + /* Can't do this if already committed, there is an argument that says we + should not reject the SetProperties call if there are buffers still + active. However this is called by the source filter, which is the same + person who is holding the samples. Therefore it is not unreasonable + for them to free all their samples before changing the requirements */ + + if (m_bCommitted == TRUE) { + return VFW_E_ALREADY_COMMITTED; + } + + /* Must be no outstanding buffers */ + + if (m_lFree.GetCount() < m_lAllocated) { + return VFW_E_BUFFERS_OUTSTANDING; + } + + /* There isn't any real need to check the parameters as they + will just be rejected when the user finally calls Commit */ + + // round length up to alignment - remember that prefix is included in + // the alignment + LONG lSize = pRequest->cbBuffer + pRequest->cbPrefix; + LONG lRemainder = lSize % pRequest->cbAlign; + if (lRemainder != 0) { + lSize = lSize - lRemainder + pRequest->cbAlign; + } + pActual->cbBuffer = m_lSize = (lSize - pRequest->cbPrefix); + + pActual->cBuffers = m_lCount = pRequest->cBuffers; + pActual->cbAlign = m_lAlignment = pRequest->cbAlign; + pActual->cbPrefix = m_lPrefix = pRequest->cbPrefix; + + m_bChanged = TRUE; + return NOERROR; +} + +// override this to allocate our resources when Commit is called. +// +// note that our resources may be already allocated when this is called, +// since we don't free them on Decommit. We will only be called when in +// decommit state with all buffers free. +// +// object locked by caller +HRESULT +CMemAllocator::Alloc(void) +{ + CAutoLock lck(this); + + /* Check he has called SetProperties */ + HRESULT hr = CBaseAllocator::Alloc(); + if (FAILED(hr)) { + return hr; + } + + /* If the requirements haven't changed then don't reallocate */ + if (hr == S_FALSE) { + ASSERT(m_pBuffer); + return NOERROR; + } + ASSERT(hr == S_OK); // we use this fact in the loop below + + /* Free the old resources */ + if (m_pBuffer) { + ReallyFree(); + } + + /* Make sure we've got reasonable values */ + if ( m_lSize < 0 || m_lPrefix < 0 || m_lCount < 0 ) { + return E_OUTOFMEMORY; + } + + /* Compute the aligned size */ + LONG lAlignedSize = m_lSize + m_lPrefix; + + /* Check overflow */ + if (lAlignedSize < m_lSize) { + return E_OUTOFMEMORY; + } + + if (m_lAlignment > 1) { + LONG lRemainder = lAlignedSize % m_lAlignment; + if (lRemainder != 0) { + LONG lNewSize = lAlignedSize + m_lAlignment - lRemainder; + if (lNewSize < lAlignedSize) { + return E_OUTOFMEMORY; + } + lAlignedSize = lNewSize; + } + } + + /* Create the contiguous memory block for the samples + making sure it's properly aligned (64K should be enough!) + */ + ASSERT(lAlignedSize % m_lAlignment == 0); + + LONGLONG lToAllocate = m_lCount * (LONGLONG)lAlignedSize; + + /* Check overflow */ + if (lToAllocate > MAXLONG) { + return E_OUTOFMEMORY; + } + + m_pBuffer = (PBYTE)VirtualAlloc(NULL, + (LONG)lToAllocate, + MEM_COMMIT, + PAGE_READWRITE); + + if (m_pBuffer == NULL) { + return E_OUTOFMEMORY; + } + + LPBYTE pNext = m_pBuffer; + CMediaSample *pSample; + + ASSERT(m_lAllocated == 0); + + // Create the new samples - we have allocated m_lSize bytes for each sample + // plus m_lPrefix bytes per sample as a prefix. We set the pointer to + // the memory after the prefix - so that GetPointer() will return a pointer + // to m_lSize bytes. + for (; m_lAllocated < m_lCount; m_lAllocated++, pNext += lAlignedSize) { + + + pSample = new CMediaSample( + NAME("Default memory media sample"), + this, + &hr, + pNext + m_lPrefix, // GetPointer() value + m_lSize); // not including prefix + + ASSERT(SUCCEEDED(hr)); + if (pSample == NULL) { + return E_OUTOFMEMORY; + } + + // This CANNOT fail + m_lFree.Add(pSample); + } + + m_bChanged = FALSE; + return NOERROR; +} + + +// override this to free up any resources we have allocated. +// called from the base class on Decommit when all buffers have been +// returned to the free list. +// +// caller has already locked the object. + +// in our case, we keep the memory until we are deleted, so +// we do nothing here. The memory is deleted in the destructor by +// calling ReallyFree() +void +CMemAllocator::Free(void) +{ + return; +} + + +// called from the destructor (and from Alloc if changing size/count) to +// actually free up the memory +void +CMemAllocator::ReallyFree(void) +{ + /* Should never be deleting this unless all buffers are freed */ + + ASSERT(m_lAllocated == m_lFree.GetCount()); + + /* Free up all the CMediaSamples */ + + CMediaSample *pSample; + for (;;) { + pSample = m_lFree.RemoveHead(); + if (pSample != NULL) { + delete pSample; + } else { + break; + } + } + + m_lAllocated = 0; + + // free the block of buffer memory + if (m_pBuffer) { + EXECUTE_ASSERT(VirtualFree(m_pBuffer, 0, MEM_RELEASE)); + m_pBuffer = NULL; + } +} + + +/* Destructor frees our memory resources */ + +CMemAllocator::~CMemAllocator() +{ + Decommit(); + ReallyFree(); +} + +// ------------------------------------------------------------------------ +// filter registration through IFilterMapper. used if IFilterMapper is +// not found (Quartz 1.0 install) + +STDAPI +AMovieSetupRegisterFilter( const AMOVIESETUP_FILTER * const psetupdata + , IFilterMapper * pIFM + , BOOL bRegister ) +{ + DbgLog((LOG_TRACE, 3, TEXT("= AMovieSetupRegisterFilter"))); + + // check we've got data + // + if( NULL == psetupdata ) return S_FALSE; + + + // unregister filter + // (as pins are subkeys of filter's CLSID key + // they do not need to be removed separately). + // + DbgLog((LOG_TRACE, 3, TEXT("= = unregister filter"))); + HRESULT hr = pIFM->UnregisterFilter( *(psetupdata->clsID) ); + + + if( bRegister ) + { + // register filter + // + DbgLog((LOG_TRACE, 3, TEXT("= = register filter"))); + hr = pIFM->RegisterFilter( *(psetupdata->clsID) + , psetupdata->strName + , psetupdata->dwMerit ); + if( SUCCEEDED(hr) ) + { + // all its pins + // + DbgLog((LOG_TRACE, 3, TEXT("= = register filter pins"))); + for( UINT m1=0; m1 < psetupdata->nPins; m1++ ) + { + hr = pIFM->RegisterPin( *(psetupdata->clsID) + , psetupdata->lpPinm1.strName + , psetupdata->lpPinm1.bRendered + , psetupdata->lpPinm1.bOutput + , psetupdata->lpPinm1.bZero + , psetupdata->lpPinm1.bMany + , *(psetupdata->lpPinm1.clsConnectsToFilter) + , psetupdata->lpPinm1.strConnectsToPin ); + + if( SUCCEEDED(hr) ) + { + // and each pin's media types + // + DbgLog((LOG_TRACE, 3, TEXT("= = register filter pin types"))); + for( UINT m2=0; m2 < psetupdata->lpPinm1.nMediaTypes; m2++ ) + { + hr = pIFM->RegisterPinType( *(psetupdata->clsID) + , psetupdata->lpPinm1.strName + , *(psetupdata->lpPinm1.lpMediaTypem2.clsMajorType) + , *(psetupdata->lpPinm1.lpMediaTypem2.clsMinorType) ); + if( FAILED(hr) ) break; + } + if( FAILED(hr) ) break; + } + if( FAILED(hr) ) break; + } + } + } + + // handle one acceptable "error" - that + // of filter not being registered! + // (couldn't find a suitable #define'd + // name for the error!) + // + if( 0x80070002 == hr) + return NOERROR; + else + return hr; +} + +// Remove warnings about unreferenced inline functions +#pragma warning(disable:4514) +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/amfilter.h
Added
@@ -0,0 +1,1587 @@ +//------------------------------------------------------------------------------ +// File: AMFilter.h +// +// Desc: DirectShow base classes - efines class hierarchy for streams +// architecture. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __FILTER__ +#define __FILTER__ + +/* The following classes are declared in this header: */ + +class CBaseMediaFilter; // IMediaFilter support +class CBaseFilter; // IBaseFilter,IMediaFilter support +class CBasePin; // Abstract base class for IPin interface +class CEnumPins; // Enumerate input and output pins +class CEnumMediaTypes; // Enumerate the pin's preferred formats +class CBaseOutputPin; // Adds data provider member functions +class CBaseInputPin; // Implements IMemInputPin interface +class CMediaSample; // Basic transport unit for IMemInputPin +class CBaseAllocator; // General list guff for most allocators +class CMemAllocator; // Implements memory buffer allocation + + +//===================================================================== +//===================================================================== +// +// QueryFilterInfo and QueryPinInfo AddRef the interface pointers +// they return. You can use the macro below to release the interface. +// +//===================================================================== +//===================================================================== + +#define QueryFilterInfoReleaseGraph(fi) if ((fi).pGraph) (fi).pGraph->Release(); + +#define QueryPinInfoReleaseFilter(pi) if ((pi).pFilter) (pi).pFilter->Release(); + +//===================================================================== +//===================================================================== +// Defines CBaseMediaFilter +// +// Abstract base class implementing IMediaFilter. +// +// Typically you will derive your filter from CBaseFilter rather than +// this, unless you are implementing an object such as a plug-in +// distributor that needs to support IMediaFilter but not IBaseFilter. +// +// Note that IMediaFilter is derived from IPersist to allow query of +// class id. +//===================================================================== +//===================================================================== + +class AM_NOVTABLE CBaseMediaFilter : public CUnknown, + public IMediaFilter +{ + +protected: + + FILTER_STATE m_State; // current state: running, paused + IReferenceClock *m_pClock; // this filter's reference clock + // note: all filters in a filter graph use the same clock + + // offset from stream time to reference time + CRefTime m_tStart; + + CLSID m_clsid; // This filters clsid + // used for serialization + CCritSec *m_pLock; // Object we use for locking + +public: + + CBaseMediaFilter( + __in_opt LPCTSTR pName, + __inout_opt LPUNKNOWN pUnk, + __in CCritSec *pLock, + REFCLSID clsid); + + virtual ~CBaseMediaFilter(); + + DECLARE_IUNKNOWN + + // override this to say what interfaces we support where + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv); + + // + // --- IPersist method --- + // + + STDMETHODIMP GetClassID(__out CLSID *pClsID); + + // --- IMediaFilter methods --- + + STDMETHODIMP GetState(DWORD dwMSecs, __out FILTER_STATE *State); + + STDMETHODIMP SetSyncSource(__inout_opt IReferenceClock *pClock); + + STDMETHODIMP GetSyncSource(__deref_out_opt IReferenceClock **pClock); + + // default implementation of Stop and Pause just record the + // state. Override to activate or de-activate your filter. + // Note that Run when called from Stopped state will call Pause + // to ensure activation, so if you are a source or transform + // you will probably not need to override Run. + STDMETHODIMP Stop(); + STDMETHODIMP Pause(); + + + // the start parameter is the difference to be added to the + // sample's stream time to get the reference time for + // its presentation + STDMETHODIMP Run(REFERENCE_TIME tStart); + + // --- helper methods --- + + // return the current stream time - ie find out what + // stream time should be appearing now + virtual HRESULT StreamTime(CRefTime& rtStream); + + // Is the filter currently active? (running or paused) + BOOL IsActive() { + CAutoLock cObjectLock(m_pLock); + return ((m_State == State_Paused) || (m_State == State_Running)); + }; +}; + +//===================================================================== +//===================================================================== +// Defines CBaseFilter +// +// An abstract class providing basic IBaseFilter support for pin +// enumeration and filter information reading. +// +// We cannot derive from CBaseMediaFilter since methods in IMediaFilter +// are also in IBaseFilter and would be ambiguous. Since much of the code +// assumes that they derive from a class that has m_State and other state +// directly available, we duplicate code from CBaseMediaFilter rather than +// having a member variable. +// +// Derive your filter from this, or from a derived object such as +// CTransformFilter. +//===================================================================== +//===================================================================== + + +class AM_NOVTABLE CBaseFilter : public CUnknown, // Handles an IUnknown + public IBaseFilter, // The Filter Interface + public IAMovieSetup // For un/registration +{ + +friend class CBasePin; + +protected: + FILTER_STATE m_State; // current state: running, paused + IReferenceClock *m_pClock; // this graph's ref clock + CRefTime m_tStart; // offset from stream time to reference time + CLSID m_clsid; // This filters clsid + // used for serialization + CCritSec *m_pLock; // Object we use for locking + + WCHAR *m_pName; // Full filter name + IFilterGraph *m_pGraph; // Graph we belong to + IMediaEventSink *m_pSink; // Called with notify events + LONG m_PinVersion; // Current pin version + +public: + + CBaseFilter( + __in_opt LPCTSTR pName, // Object description + __inout_opt LPUNKNOWN pUnk, // IUnknown of delegating object + __in CCritSec *pLock, // Object who maintains lock + REFCLSID clsid); // The clsid to be used to serialize this filter + + CBaseFilter( + __in_opt LPCTSTR pName, // Object description + __in_opt LPUNKNOWN pUnk, // IUnknown of delegating object + __in CCritSec *pLock, // Object who maintains lock + REFCLSID clsid, // The clsid to be used to serialize this filter + __inout HRESULT *phr); // General OLE return code +#ifdef UNICODE + CBaseFilter( + __in_opt LPCSTR pName, // Object description + __in_opt LPUNKNOWN pUnk, // IUnknown of delegating object + __in CCritSec *pLock, // Object who maintains lock + REFCLSID clsid); // The clsid to be used to serialize this filter + + CBaseFilter( + __in_opt LPCSTR pName, // Object description + __in_opt LPUNKNOWN pUnk, // IUnknown of delegating object + __in CCritSec *pLock, // Object who maintains lock + REFCLSID clsid, // The clsid to be used to serialize this filter + __inout HRESULT *phr); // General OLE return code +#endif + ~CBaseFilter(); + + DECLARE_IUNKNOWN + + // override this to say what interfaces we support where + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv); +#ifdef DEBUG + STDMETHODIMP_(ULONG) NonDelegatingRelease(); +#endif + + // + // --- IPersist method --- + // + + STDMETHODIMP GetClassID(__out CLSID *pClsID); + + // --- IMediaFilter methods --- + + STDMETHODIMP GetState(DWORD dwMSecs, __out FILTER_STATE *State); + + STDMETHODIMP SetSyncSource(__in_opt IReferenceClock *pClock); + + STDMETHODIMP GetSyncSource(__deref_out_opt IReferenceClock **pClock); + + + // override Stop and Pause so we can activate the pins. + // Note that Run will call Pause first if activation needed. + // Override these if you want to activate your filter rather than + // your pins. + STDMETHODIMP Stop(); + STDMETHODIMP Pause(); + + // the start parameter is the difference to be added to the + // sample's stream time to get the reference time for + // its presentation + STDMETHODIMP Run(REFERENCE_TIME tStart); + + // --- helper methods --- + + // return the current stream time - ie find out what + // stream time should be appearing now + virtual HRESULT StreamTime(CRefTime& rtStream); + + // Is the filter currently active? + BOOL IsActive() { + CAutoLock cObjectLock(m_pLock); + return ((m_State == State_Paused) || (m_State == State_Running)); + }; + + // Is this filter stopped (without locking) + BOOL IsStopped() { + return (m_State == State_Stopped); + }; + + // + // --- IBaseFilter methods --- + // + + // pin enumerator + STDMETHODIMP EnumPins( + __deref_out IEnumPins ** ppEnum); + + + // default behaviour of FindPin assumes pin ids are their names + STDMETHODIMP FindPin( + LPCWSTR Id, + __deref_out IPin ** ppPin + ); + + STDMETHODIMP QueryFilterInfo( + __out FILTER_INFO * pInfo); + + STDMETHODIMP JoinFilterGraph( + __inout_opt IFilterGraph * pGraph, + __in_opt LPCWSTR pName); + + // return a Vendor information string. Optional - may return E_NOTIMPL. + // memory returned should be freed using CoTaskMemFree + // default implementation returns E_NOTIMPL + STDMETHODIMP QueryVendorInfo( + __deref_out LPWSTR* pVendorInfo + ); + + // --- helper methods --- + + // send an event notification to the filter graph if we know about it. + // returns S_OK if delivered, S_FALSE if the filter graph does not sink + // events, or an error otherwise. + HRESULT NotifyEvent( + long EventCode, + LONG_PTR EventParam1, + LONG_PTR EventParam2); + + // return the filter graph we belong to + __out_opt IFilterGraph *GetFilterGraph() { + return m_pGraph; + } + + // Request reconnect + // pPin is the pin to reconnect + // pmt is the type to reconnect with - can be NULL + // Calls ReconnectEx on the filter graph + HRESULT ReconnectPin(IPin *pPin, __in_opt AM_MEDIA_TYPE const *pmt); + + // find out the current pin version (used by enumerators) + virtual LONG GetPinVersion(); + void IncrementPinVersion(); + + // you need to supply these to access the pins from the enumerator + // and for default Stop and Pause/Run activation. + virtual int GetPinCount() PURE; + virtual CBasePin *GetPin(int n) PURE; + + // --- IAMovieSetup methods --- + + STDMETHODIMP Register(); // ask filter to register itself + STDMETHODIMP Unregister(); // and unregister itself + + // --- setup helper methods --- + // (override to return filters setup data) + + virtual __out_opt LPAMOVIESETUP_FILTER GetSetupData(){ return NULL; } + +}; + + +//===================================================================== +//===================================================================== +// Defines CBasePin +// +// Abstract class that supports the basics of IPin +//===================================================================== +//===================================================================== + +class AM_NOVTABLE CBasePin : public CUnknown, public IPin, public IQualityControl +{ + +protected: + + WCHAR * m_pName; // This pin's name + IPin *m_Connected; // Pin we have connected to + PIN_DIRECTION m_dir; // Direction of this pin + CCritSec *m_pLock; // Object we use for locking + bool m_bRunTimeError; // Run time error generated + bool m_bCanReconnectWhenActive; // OK to reconnect when active + bool m_bTryMyTypesFirst; // When connecting enumerate + // this pin's types first + CBaseFilter *m_pFilter; // Filter we were created by + IQualityControl *m_pQSink; // Target for Quality messages + LONG m_TypeVersion; // Holds current type version + CMediaType m_mt; // Media type of connection + + CRefTime m_tStart; // time from NewSegment call + CRefTime m_tStop; // time from NewSegment + double m_dRate; // rate from NewSegment + +#ifdef DEBUG + LONG m_cRef; // Ref count tracing +#endif + + // displays pin connection information + +#ifdef DEBUG + void DisplayPinInfo(IPin *pReceivePin); + void DisplayTypeInfo(IPin *pPin, const CMediaType *pmt); +#else + void DisplayPinInfo(IPin *pReceivePin) {}; + void DisplayTypeInfo(IPin *pPin, const CMediaType *pmt) {}; +#endif + + // used to agree a media type for a pin connection + + // given a specific media type, attempt a connection (includes + // checking that the type is acceptable to this pin) + HRESULT + AttemptConnection( + IPin* pReceivePin, // connect to this pin + const CMediaType* pmt // using this type + ); + + // try all the media types in this enumerator - for each that + // we accept, try to connect using ReceiveConnection. + HRESULT TryMediaTypes( + IPin *pReceivePin, // connect to this pin + __in_opt const CMediaType *pmt, // proposed type from Connect + IEnumMediaTypes *pEnum); // try this enumerator + + // establish a connection with a suitable mediatype. Needs to + // propose a media type if the pmt pointer is null or partially + // specified - use TryMediaTypes on both our and then the other pin's + // enumerator until we find one that works. + HRESULT AgreeMediaType( + IPin *pReceivePin, // connect to this pin + const CMediaType *pmt); // proposed type from Connect + +public: + + CBasePin( + __in_opt LPCTSTR pObjectName, // Object description + __in CBaseFilter *pFilter, // Owning filter who knows about pins + __in CCritSec *pLock, // Object who implements the lock + __inout HRESULT *phr, // General OLE return code + __in_opt LPCWSTR pName, // Pin name for us + PIN_DIRECTION dir); // Either PINDIR_INPUT or PINDIR_OUTPUT +#ifdef UNICODE + CBasePin( + __in_opt LPCSTR pObjectName, // Object description + __in CBaseFilter *pFilter, // Owning filter who knows about pins + __in CCritSec *pLock, // Object who implements the lock + __inout HRESULT *phr, // General OLE return code + __in_opt LPCWSTR pName, // Pin name for us + PIN_DIRECTION dir); // Either PINDIR_INPUT or PINDIR_OUTPUT +#endif + virtual ~CBasePin(); + + DECLARE_IUNKNOWN + + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv); + STDMETHODIMP_(ULONG) NonDelegatingRelease(); + STDMETHODIMP_(ULONG) NonDelegatingAddRef(); + + // --- IPin methods --- + + // take lead role in establishing a connection. Media type pointer + // may be null, or may point to partially-specified mediatype + // (subtype or format type may be GUID_NULL). + STDMETHODIMP Connect( + IPin * pReceivePin, + __in_opt const AM_MEDIA_TYPE *pmt // optional media type + ); + + // (passive) accept a connection from another pin + STDMETHODIMP ReceiveConnection( + IPin * pConnector, // this is the initiating connecting pin + const AM_MEDIA_TYPE *pmt // this is the media type we will exchange + ); + + STDMETHODIMP Disconnect(); + + STDMETHODIMP ConnectedTo(__deref_out IPin **pPin); + + STDMETHODIMP ConnectionMediaType(__out AM_MEDIA_TYPE *pmt); + + STDMETHODIMP QueryPinInfo( + __out PIN_INFO * pInfo + ); + + STDMETHODIMP QueryDirection( + __out PIN_DIRECTION * pPinDir + ); + + STDMETHODIMP QueryId( + __deref_out LPWSTR * Id + ); + + // does the pin support this media type + STDMETHODIMP QueryAccept( + const AM_MEDIA_TYPE *pmt + ); + + // return an enumerator for this pins preferred media types + STDMETHODIMP EnumMediaTypes( + __deref_out IEnumMediaTypes **ppEnum + ); + + // return an array of IPin* - the pins that this pin internally connects to + // All pins put in the array must be AddReffed (but no others) + // Errors: "Can't say" - FAIL, not enough slots - return S_FALSE + // Default: return E_NOTIMPL + // The filter graph will interpret NOT_IMPL as any input pin connects to + // all visible output pins and vice versa. + // apPin can be NULL if nPin==0 (not otherwise). + STDMETHODIMP QueryInternalConnections( + __out_ecount_part(*nPin,*nPin) IPin* *apPin, // array of IPin* + __inout ULONG *nPin // on input, the number of slots + // on output the number of pins + ) { return E_NOTIMPL; } + + // Called when no more data will be sent + STDMETHODIMP EndOfStream(void); + + // Begin/EndFlush still PURE + + // NewSegment notifies of the start/stop/rate applying to the data + // about to be received. Default implementation records data and + // returns S_OK. + // Override this to pass downstream. + STDMETHODIMP NewSegment( + REFERENCE_TIME tStart, + REFERENCE_TIME tStop, + double dRate); + + //================================================================================ + // IQualityControl methods + //================================================================================ + + STDMETHODIMP Notify(IBaseFilter * pSender, Quality q); + + STDMETHODIMP SetSink(IQualityControl * piqc); + + // --- helper methods --- + + // Returns true if the pin is connected. false otherwise. + BOOL IsConnected(void) {return (m_Connected != NULL); }; + // Return the pin this is connected to (if any) + IPin * GetConnected() { return m_Connected; }; + + // Check if our filter is currently stopped + BOOL IsStopped() { + return (m_pFilter->m_State == State_Stopped); + }; + + // find out the current type version (used by enumerators) + virtual LONG GetMediaTypeVersion(); + void IncrementTypeVersion(); + + // switch the pin to active (paused or running) mode + // not an error to call this if already active + virtual HRESULT Active(void); + + // switch the pin to inactive state - may already be inactive + virtual HRESULT Inactive(void); + + // Notify of Run() from filter + virtual HRESULT Run(REFERENCE_TIME tStart); + + // check if the pin can support this specific proposed type and format + virtual HRESULT CheckMediaType(const CMediaType *) PURE; + + // set the connection to use this format (previously agreed) + virtual HRESULT SetMediaType(const CMediaType *); + + // check that the connection is ok before verifying it + // can be overridden eg to check what interfaces will be supported. + virtual HRESULT CheckConnect(IPin *); + + // Set and release resources required for a connection + virtual HRESULT BreakConnect(); + virtual HRESULT CompleteConnect(IPin *pReceivePin); + + // returns the preferred formats for a pin + virtual HRESULT GetMediaType(int iPosition, __inout CMediaType *pMediaType); + + // access to NewSegment values + REFERENCE_TIME CurrentStopTime() { + return m_tStop; + } + REFERENCE_TIME CurrentStartTime() { + return m_tStart; + } + double CurrentRate() { + return m_dRate; + } + + // Access name + LPWSTR Name() { return m_pName; }; + + // Can reconnectwhen active? + void SetReconnectWhenActive(bool bCanReconnect) + { + m_bCanReconnectWhenActive = bCanReconnect; + } + + bool CanReconnectWhenActive() + { + return m_bCanReconnectWhenActive; + } + +protected: + STDMETHODIMP DisconnectInternal(); +}; + + +//===================================================================== +//===================================================================== +// Defines CEnumPins +// +// Pin enumerator class that works by calling CBaseFilter. This interface +// is provided by CBaseFilter::EnumPins and calls GetPinCount() and +// GetPin() to enumerate existing pins. Needs to be a separate object so +// that it can be cloned (creating an existing object at the same +// position in the enumeration) +// +//===================================================================== +//===================================================================== + +class CEnumPins : public IEnumPins // The interface we support +{ + int m_Position; // Current ordinal position + int m_PinCount; // Number of pins available + CBaseFilter *m_pFilter; // The filter who owns us + LONG m_Version; // Pin version information + LONG m_cRef; + + typedef CGenericList<CBasePin> CPinList; + + CPinList m_PinCache; // These pointers have not been AddRef'ed and + // so they should not be dereferenced. They are + // merely kept to ID which pins have been enumerated. + +#ifdef DEBUG + DWORD m_dwCookie; +#endif + + /* If while we are retrieving a pin for example from the filter an error + occurs we assume that our internal state is stale with respect to the + filter (someone may have deleted all the pins). We can check before + starting whether or not the operation is likely to fail by asking the + filter what it's current version number is. If the filter has not + overriden the GetPinVersion method then this will always match */ + + BOOL AreWeOutOfSync() { + return (m_pFilter->GetPinVersion() == m_Version ? FALSE : TRUE); + }; + + /* This method performs the same operations as Reset, except is does not clear + the cache of pins already enumerated. */ + + STDMETHODIMP Refresh(); + +public: + + CEnumPins( + __in CBaseFilter *pFilter, + __in_opt CEnumPins *pEnumPins); + + virtual ~CEnumPins(); + + // IUnknown + STDMETHODIMP QueryInterface(REFIID riid, __deref_out void **ppv); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + + // IEnumPins + STDMETHODIMP Next( + ULONG cPins, // place this many pins... + __out_ecount(cPins) IPin ** ppPins, // ...in this array of IPin* + __out_opt ULONG * pcFetched // actual count passed returned here + ); + + STDMETHODIMP Skip(ULONG cPins); + STDMETHODIMP Reset(); + STDMETHODIMP Clone(__deref_out IEnumPins **ppEnum); + + +}; + + +//===================================================================== +//===================================================================== +// Defines CEnumMediaTypes +// +// Enumerates the preferred formats for input and output pins +//===================================================================== +//===================================================================== + +class CEnumMediaTypes : public IEnumMediaTypes // The interface we support +{ + int m_Position; // Current ordinal position + CBasePin *m_pPin; // The pin who owns us + LONG m_Version; // Media type version value + LONG m_cRef; +#ifdef DEBUG + DWORD m_dwCookie; +#endif + + /* The media types a filter supports can be quite dynamic so we add to + the general IEnumXXXX interface the ability to be signaled when they + change via an event handle the connected filter supplies. Until the + Reset method is called after the state changes all further calls to + the enumerator (except Reset) will return E_UNEXPECTED error code */ + + BOOL AreWeOutOfSync() { + return (m_pPin->GetMediaTypeVersion() == m_Version ? FALSE : TRUE); + }; + +public: + + CEnumMediaTypes( + __in CBasePin *pPin, + __in_opt CEnumMediaTypes *pEnumMediaTypes); + + virtual ~CEnumMediaTypes(); + + // IUnknown + STDMETHODIMP QueryInterface(REFIID riid, __deref_out void **ppv); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + + // IEnumMediaTypes + STDMETHODIMP Next( + ULONG cMediaTypes, // place this many pins... + __out_ecount(cMediaTypes) AM_MEDIA_TYPE ** ppMediaTypes, // ...in this array + __out_opt ULONG * pcFetched // actual count passed + ); + + STDMETHODIMP Skip(ULONG cMediaTypes); + STDMETHODIMP Reset(); + STDMETHODIMP Clone(__deref_out IEnumMediaTypes **ppEnum); +}; + + + + +//===================================================================== +//===================================================================== +// Defines CBaseOutputPin +// +// class derived from CBasePin that can pass buffers to a connected pin +// that supports IMemInputPin. Supports IPin. +// +// Derive your output pin from this. +// +//===================================================================== +//===================================================================== + +class AM_NOVTABLE CBaseOutputPin : public CBasePin +{ + +protected: + + IMemAllocator *m_pAllocator; + IMemInputPin *m_pInputPin; // interface on the downstreaminput pin + // set up in CheckConnect when we connect. + +public: + + CBaseOutputPin( + __in_opt LPCTSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName); +#ifdef UNICODE + CBaseOutputPin( + __in_opt LPCSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName); +#endif + // override CompleteConnect() so we can negotiate an allocator + virtual HRESULT CompleteConnect(IPin *pReceivePin); + + // negotiate the allocator and its buffer size/count and other properties + // Calls DecideBufferSize to set properties + virtual HRESULT DecideAllocator(IMemInputPin * pPin, __deref_out IMemAllocator ** pAlloc); + + // override this to set the buffer size and count. Return an error + // if the size/count is not to your liking. + // The allocator properties passed in are those requested by the + // input pin - use eg the alignment and prefix members if you have + // no preference on these. + virtual HRESULT DecideBufferSize( + IMemAllocator * pAlloc, + __inout ALLOCATOR_PROPERTIES * ppropInputRequest + ) PURE; + + // returns an empty sample buffer from the allocator + virtual HRESULT GetDeliveryBuffer(__deref_out IMediaSample ** ppSample, + __in_opt REFERENCE_TIME * pStartTime, + __in_opt REFERENCE_TIME * pEndTime, + DWORD dwFlags); + + // deliver a filled-in sample to the connected input pin + // note - you need to release it after calling this. The receiving + // pin will addref the sample if it needs to hold it beyond the + // call. + virtual HRESULT Deliver(IMediaSample *); + + // override this to control the connection + virtual HRESULT InitAllocator(__deref_out IMemAllocator **ppAlloc); + HRESULT CheckConnect(IPin *pPin); + HRESULT BreakConnect(); + + // override to call Commit and Decommit + HRESULT Active(void); + HRESULT Inactive(void); + + // we have a default handling of EndOfStream which is to return + // an error, since this should be called on input pins only + STDMETHODIMP EndOfStream(void); + + // called from elsewhere in our filter to pass EOS downstream to + // our connected input pin + virtual HRESULT DeliverEndOfStream(void); + + // same for Begin/EndFlush - we handle Begin/EndFlush since it + // is an error on an output pin, and we have Deliver methods to + // call the methods on the connected pin + STDMETHODIMP BeginFlush(void); + STDMETHODIMP EndFlush(void); + virtual HRESULT DeliverBeginFlush(void); + virtual HRESULT DeliverEndFlush(void); + + // deliver NewSegment to connected pin - you will need to + // override this if you queue any data in your output pin. + virtual HRESULT DeliverNewSegment( + REFERENCE_TIME tStart, + REFERENCE_TIME tStop, + double dRate); + + //================================================================================ + // IQualityControl methods + //================================================================================ + + // All inherited from CBasePin and not overridden here. + // STDMETHODIMP Notify(IBaseFilter * pSender, Quality q); + // STDMETHODIMP SetSink(IQualityControl * piqc); +}; + + +//===================================================================== +//===================================================================== +// Defines CBaseInputPin +// +// derive your standard input pin from this. +// you need to supply GetMediaType and CheckConnect etc (see CBasePin), +// and you need to supply Receive to do something more useful. +// +//===================================================================== +//===================================================================== + +class AM_NOVTABLE CBaseInputPin : public CBasePin, + public IMemInputPin +{ + +protected: + + IMemAllocator *m_pAllocator; // Default memory allocator + + // allocator is read-only, so received samples + // cannot be modified (probably only relevant to in-place + // transforms + BYTE m_bReadOnly; + + // in flushing state (between BeginFlush and EndFlush) + // if TRUE, all Receives are returned with S_FALSE + BYTE m_bFlushing; + + // Sample properties - initalized in Receive + AM_SAMPLE2_PROPERTIES m_SampleProps; + +public: + + CBaseInputPin( + __in_opt LPCTSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName); +#ifdef UNICODE + CBaseInputPin( + __in_opt LPCSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName); +#endif + virtual ~CBaseInputPin(); + + DECLARE_IUNKNOWN + + // override this to publicise our interfaces + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv); + + // return the allocator interface that this input pin + // would like the output pin to use + STDMETHODIMP GetAllocator(__deref_out IMemAllocator ** ppAllocator); + + // tell the input pin which allocator the output pin is actually + // going to use. + STDMETHODIMP NotifyAllocator( + IMemAllocator * pAllocator, + BOOL bReadOnly); + + // do something with this media sample + STDMETHODIMP Receive(IMediaSample *pSample); + + // do something with these media samples + STDMETHODIMP ReceiveMultiple ( + __in_ecount(nSamples) IMediaSample **pSamples, + long nSamples, + __out long *nSamplesProcessed); + + // See if Receive() blocks + STDMETHODIMP ReceiveCanBlock(); + + // Default handling for BeginFlush - call at the beginning + // of your implementation (makes sure that all Receive calls + // fail). After calling this, you need to free any queued data + // and then call downstream. + STDMETHODIMP BeginFlush(void); + + // default handling for EndFlush - call at end of your implementation + // - before calling this, ensure that there is no queued data and no thread + // pushing any more without a further receive, then call downstream, + // then call this method to clear the m_bFlushing flag and re-enable + // receives + STDMETHODIMP EndFlush(void); + + // this method is optional (can return E_NOTIMPL). + // default implementation returns E_NOTIMPL. Override if you have + // specific alignment or prefix needs, but could use an upstream + // allocator + STDMETHODIMP GetAllocatorRequirements(__out ALLOCATOR_PROPERTIES*pProps); + + // Release the pin's allocator. + HRESULT BreakConnect(); + + // helper method to check the read-only flag + BOOL IsReadOnly() { + return m_bReadOnly; + }; + + // helper method to see if we are flushing + BOOL IsFlushing() { + return m_bFlushing; + }; + + // Override this for checking whether it's OK to process samples + // Also call this from EndOfStream. + virtual HRESULT CheckStreaming(); + + // Pass a Quality notification on to the appropriate sink + HRESULT PassNotify(Quality& q); + + + //================================================================================ + // IQualityControl methods (from CBasePin) + //================================================================================ + + STDMETHODIMP Notify(IBaseFilter * pSender, Quality q); + + // no need to override: + // STDMETHODIMP SetSink(IQualityControl * piqc); + + + // switch the pin to inactive state - may already be inactive + virtual HRESULT Inactive(void); + + // Return sample properties pointer + AM_SAMPLE2_PROPERTIES * SampleProps() { + ASSERT(m_SampleProps.cbData != 0); + return &m_SampleProps; + } + +}; + +/////////////////////////////////////////////////////////////////////////// +// CDynamicOutputPin +// + +class CDynamicOutputPin : public CBaseOutputPin, + public IPinFlowControl +{ +public: +#ifdef UNICODE + CDynamicOutputPin( + __in_opt LPCSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName); +#endif + + CDynamicOutputPin( + __in_opt LPCTSTR pObjectName, + __in CBaseFilter *pFilter, + __in CCritSec *pLock, + __inout HRESULT *phr, + __in_opt LPCWSTR pName); + + ~CDynamicOutputPin(); + + // IUnknown Methods + DECLARE_IUNKNOWN + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv); + + // IPin Methods + STDMETHODIMP Disconnect(void); + + // IPinFlowControl Methods + STDMETHODIMP Block(DWORD dwBlockFlags, HANDLE hEvent); + + // Set graph config info + void SetConfigInfo(IGraphConfig *pGraphConfig, HANDLE hStopEvent); + + #ifdef DEBUG + virtual HRESULT Deliver(IMediaSample *pSample); + virtual HRESULT DeliverEndOfStream(void); + virtual HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate); + #endif // DEBUG + + HRESULT DeliverBeginFlush(void); + HRESULT DeliverEndFlush(void); + + HRESULT Inactive(void); + HRESULT Active(void); + virtual HRESULT CompleteConnect(IPin *pReceivePin); + + virtual HRESULT StartUsingOutputPin(void); + virtual void StopUsingOutputPin(void); + virtual bool StreamingThreadUsingOutputPin(void); + + HRESULT ChangeOutputFormat + ( + const AM_MEDIA_TYPE *pmt, + REFERENCE_TIME tSegmentStart, + REFERENCE_TIME tSegmentStop, + double dSegmentRate + ); + HRESULT ChangeMediaType(const CMediaType *pmt); + HRESULT DynamicReconnect(const CMediaType *pmt); + +protected: + HRESULT SynchronousBlockOutputPin(void); + HRESULT AsynchronousBlockOutputPin(HANDLE hNotifyCallerPinBlockedEvent); + HRESULT UnblockOutputPin(void); + + void BlockOutputPin(void); + void ResetBlockState(void); + + static HRESULT WaitEvent(HANDLE hEvent); + + enum BLOCK_STATE + { + NOT_BLOCKED, + PENDING, + BLOCKED + }; + + // This lock should be held when the following class members are + // being used: m_hNotifyCallerPinBlockedEvent, m_BlockState, + // m_dwBlockCallerThreadID and m_dwNumOutstandingOutputPinUsers. + CCritSec m_BlockStateLock; + + // This event should be signaled when the output pin is + // not blocked. This is a manual reset event. For more + // information on events, see the documentation for + // CreateEvent() in the Windows SDK. + HANDLE m_hUnblockOutputPinEvent; + + // This event will be signaled when block operation succeedes or + // when the user cancels the block operation. The block operation + // can be canceled by calling IPinFlowControl2::Block( 0, NULL ) + // while the block operation is pending. + HANDLE m_hNotifyCallerPinBlockedEvent; + + // The state of the current block operation. + BLOCK_STATE m_BlockState; + + // The ID of the thread which last called IPinFlowControl::Block(). + // For more information on thread IDs, see the documentation for + // GetCurrentThreadID() in the Windows SDK. + DWORD m_dwBlockCallerThreadID; + + // The number of times StartUsingOutputPin() has been sucessfully + // called and a corresponding call to StopUsingOutputPin() has not + // been made. When this variable is greater than 0, the streaming + // thread is calling IPin::NewSegment(), IPin::EndOfStream(), + // IMemInputPin::Receive() or IMemInputPin::ReceiveMultiple(). The + // streaming thread could also be calling: DynamicReconnect(), + // ChangeMediaType() or ChangeOutputFormat(). The output pin cannot + // be blocked while the output pin is being used. + DWORD m_dwNumOutstandingOutputPinUsers; + + // This event should be set when the IMediaFilter::Stop() is called. + // This is a manual reset event. It is also set when the output pin + // delivers a flush to the connected input pin. + HANDLE m_hStopEvent; + IGraphConfig* m_pGraphConfig; + + // TRUE if the output pin's allocator's samples are read only. + // Otherwise FALSE. For more information, see the documentation + // for IMemInputPin::NotifyAllocator(). + BOOL m_bPinUsesReadOnlyAllocator; + +private: + HRESULT Initialize(void); + HRESULT ChangeMediaTypeHelper(const CMediaType *pmt); + + #ifdef DEBUG + void AssertValid(void); + #endif // DEBUG +}; + +class CAutoUsingOutputPin +{ +public: + CAutoUsingOutputPin( __in CDynamicOutputPin* pOutputPin, __inout HRESULT* phr ); + ~CAutoUsingOutputPin(); + +private: + CDynamicOutputPin* m_pOutputPin; +}; + +inline CAutoUsingOutputPin::CAutoUsingOutputPin( __in CDynamicOutputPin* pOutputPin, __inout HRESULT* phr ) : + m_pOutputPin(NULL) +{ + // The caller should always pass in valid pointers. + ASSERT( NULL != pOutputPin ); + ASSERT( NULL != phr ); + + // Make sure the user initialized phr. + ASSERT( S_OK == *phr ); + + HRESULT hr = pOutputPin->StartUsingOutputPin(); + if( FAILED( hr ) ) + { + *phr = hr; + return; + } + + m_pOutputPin = pOutputPin; +} + +inline CAutoUsingOutputPin::~CAutoUsingOutputPin() +{ + if( NULL != m_pOutputPin ) + { + m_pOutputPin->StopUsingOutputPin(); + } +} + +#ifdef DEBUG + +inline HRESULT CDynamicOutputPin::Deliver(IMediaSample *pSample) +{ + // The caller should call StartUsingOutputPin() before calling this + // method. + ASSERT(StreamingThreadUsingOutputPin()); + + return CBaseOutputPin::Deliver(pSample); +} + +inline HRESULT CDynamicOutputPin::DeliverEndOfStream(void) +{ + // The caller should call StartUsingOutputPin() before calling this + // method. + ASSERT( StreamingThreadUsingOutputPin() ); + + return CBaseOutputPin::DeliverEndOfStream(); +} + +inline HRESULT CDynamicOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) +{ + // The caller should call StartUsingOutputPin() before calling this + // method. + ASSERT(StreamingThreadUsingOutputPin()); + + return CBaseOutputPin::DeliverNewSegment(tStart, tStop, dRate); +} + +#endif // DEBUG + +//===================================================================== +//===================================================================== +// Memory allocators +// +// the shared memory transport between pins requires the input pin +// to provide a memory allocator that can provide sample objects. A +// sample object supports the IMediaSample interface. +// +// CBaseAllocator handles the management of free and busy samples. It +// allocates CMediaSample objects. CBaseAllocator is an abstract class: +// in particular it has no method of initializing the list of free +// samples. CMemAllocator is derived from CBaseAllocator and initializes +// the list of samples using memory from the standard IMalloc interface. +// +// If you want your buffers to live in some special area of memory, +// derive your allocator object from CBaseAllocator. If you derive your +// IMemInputPin interface object from CBaseMemInputPin, you will get +// CMemAllocator-based allocation etc for free and will just need to +// supply the Receive handling, and media type / format negotiation. +//===================================================================== +//===================================================================== + + +//===================================================================== +//===================================================================== +// Defines CMediaSample +// +// an object of this class supports IMediaSample and represents a buffer +// for media data with some associated properties. Releasing it returns +// it to a freelist managed by a CBaseAllocator derived object. +//===================================================================== +//===================================================================== + +class CMediaSample : public IMediaSample2 // The interface we support +{ + +protected: + + friend class CBaseAllocator; + + /* Values for dwFlags - these are used for backward compatiblity + only now - use AM_SAMPLE_xxx + */ + enum { Sample_SyncPoint = 0x01, /* Is this a sync point */ + Sample_Preroll = 0x02, /* Is this a preroll sample */ + Sample_Discontinuity = 0x04, /* Set if start of new segment */ + Sample_TypeChanged = 0x08, /* Has the type changed */ + Sample_TimeValid = 0x10, /* Set if time is valid */ + Sample_MediaTimeValid = 0x20, /* Is the media time valid */ + Sample_TimeDiscontinuity = 0x40, /* Time discontinuity */ + Sample_StopValid = 0x100, /* Stop time valid */ + Sample_ValidFlags = 0x1FF + }; + + /* Properties, the media sample class can be a container for a format + change in which case we take a copy of a type through the SetMediaType + interface function and then return it when GetMediaType is called. As + we do no internal processing on it we leave it as a pointer */ + + DWORD m_dwFlags; /* Flags for this sample */ + /* Type specific flags are packed + into the top word + */ + DWORD m_dwTypeSpecificFlags; /* Media type specific flags */ + __field_ecount_opt(m_cbBuffer) LPBYTE m_pBuffer; /* Pointer to the complete buffer */ + LONG m_lActual; /* Length of data in this sample */ + LONG m_cbBuffer; /* Size of the buffer */ + CBaseAllocator *m_pAllocator; /* The allocator who owns us */ + CMediaSample *m_pNext; /* Chaining in free list */ + REFERENCE_TIME m_Start; /* Start sample time */ + REFERENCE_TIME m_End; /* End sample time */ + LONGLONG m_MediaStart; /* Real media start position */ + LONG m_MediaEnd; /* A difference to get the end */ + AM_MEDIA_TYPE *m_pMediaType; /* Media type change data */ + DWORD m_dwStreamId; /* Stream id */ +public: + LONG m_cRef; /* Reference count */ + + +public: + + CMediaSample( + __in_opt LPCTSTR pName, + __in_opt CBaseAllocator *pAllocator, + __inout_opt HRESULT *phr, + __in_bcount_opt(length) LPBYTE pBuffer = NULL, + LONG length = 0); +#ifdef UNICODE + CMediaSample( + __in_opt LPCSTR pName, + __in_opt CBaseAllocator *pAllocator, + __inout_opt HRESULT *phr, + __in_bcount_opt(length) LPBYTE pBuffer = NULL, + LONG length = 0); +#endif + + virtual ~CMediaSample(); + + /* Note the media sample does not delegate to its owner */ + + STDMETHODIMP QueryInterface(REFIID riid, __deref_out void **ppv); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + + // set the buffer pointer and length. Used by allocators that + // want variable sized pointers or pointers into already-read data. + // This is only available through a CMediaSample* not an IMediaSample* + // and so cannot be changed by clients. + HRESULT SetPointer(__in_bcount(cBytes) BYTE * ptr, LONG cBytes); + + // Get me a read/write pointer to this buffer's memory. + STDMETHODIMP GetPointer(__deref_out BYTE ** ppBuffer); + + STDMETHODIMP_(LONG) GetSize(void); + + // get the stream time at which this sample should start and finish. + STDMETHODIMP GetTime( + __out REFERENCE_TIME * pTimeStart, // put time here + __out REFERENCE_TIME * pTimeEnd + ); + + // Set the stream time at which this sample should start and finish. + STDMETHODIMP SetTime( + __in_opt REFERENCE_TIME * pTimeStart, // put time here + __in_opt REFERENCE_TIME * pTimeEnd + ); + STDMETHODIMP IsSyncPoint(void); + STDMETHODIMP SetSyncPoint(BOOL bIsSyncPoint); + STDMETHODIMP IsPreroll(void); + STDMETHODIMP SetPreroll(BOOL bIsPreroll); + + STDMETHODIMP_(LONG) GetActualDataLength(void); + STDMETHODIMP SetActualDataLength(LONG lActual); + + // these allow for limited format changes in band + + STDMETHODIMP GetMediaType(__deref_out AM_MEDIA_TYPE **ppMediaType); + STDMETHODIMP SetMediaType(__in_opt AM_MEDIA_TYPE *pMediaType); + + // returns S_OK if there is a discontinuity in the data (this same is + // not a continuation of the previous stream of data + // - there has been a seek). + STDMETHODIMP IsDiscontinuity(void); + // set the discontinuity property - TRUE if this sample is not a + // continuation, but a new sample after a seek. + STDMETHODIMP SetDiscontinuity(BOOL bDiscontinuity); + + // get the media times for this sample + STDMETHODIMP GetMediaTime( + __out LONGLONG * pTimeStart, + __out LONGLONG * pTimeEnd + ); + + // Set the media times for this sample + STDMETHODIMP SetMediaTime( + __in_opt LONGLONG * pTimeStart, + __in_opt LONGLONG * pTimeEnd + ); + + // Set and get properties (IMediaSample2) + STDMETHODIMP GetProperties( + DWORD cbProperties, + __out_bcount(cbProperties) BYTE * pbProperties + ); + + STDMETHODIMP SetProperties( + DWORD cbProperties, + __in_bcount(cbProperties) const BYTE * pbProperties + ); +}; + + +//===================================================================== +//===================================================================== +// Defines CBaseAllocator +// +// Abstract base class that manages a list of media samples +// +// This class provides support for getting buffers from the free list, +// including handling of commit and (asynchronous) decommit. +// +// Derive from this class and override the Alloc and Free functions to +// allocate your CMediaSample (or derived) objects and add them to the +// free list, preparing them as necessary. +//===================================================================== +//===================================================================== + +class AM_NOVTABLE CBaseAllocator : public CUnknown,// A non delegating IUnknown + public IMemAllocatorCallbackTemp, // The interface we support + public CCritSec // Provides object locking +{ + class CSampleList; + friend class CSampleList; + + /* Trick to get at protected member in CMediaSample */ + static CMediaSample * &NextSample(__in CMediaSample *pSample) + { + return pSample->m_pNext; + }; + + /* Mini list class for the free list */ + class CSampleList + { + public: + CSampleList() : m_List(NULL), m_nOnList(0) {}; +#ifdef DEBUG + ~CSampleList() + { + ASSERT(m_nOnList == 0); + }; +#endif + CMediaSample *Head() const { return m_List; }; + CMediaSample *Next(__in CMediaSample *pSample) const { return CBaseAllocator::NextSample(pSample); }; + int GetCount() const { return m_nOnList; }; + void Add(__inout CMediaSample *pSample) + { + ASSERT(pSample != NULL); + CBaseAllocator::NextSample(pSample) = m_List; + m_List = pSample; + m_nOnList++; + }; + CMediaSample *RemoveHead() + { + CMediaSample *pSample = m_List; + if (pSample != NULL) { + m_List = CBaseAllocator::NextSample(m_List); + m_nOnList--; + } + return pSample; + }; + void Remove(__inout CMediaSample *pSample); + + public: + CMediaSample *m_List; + int m_nOnList; + }; +protected: + + CSampleList m_lFree; // Free list + + /* Note to overriders of CBaseAllocator. + + We use a lazy signalling mechanism for waiting for samples. + This means we don't call the OS if no waits occur. + + In order to implement this: + + 1. When a new sample is added to m_lFree call NotifySample() which + calls ReleaseSemaphore on m_hSem with a count of m_lWaiting and + sets m_lWaiting to 0. + This must all be done holding the allocator's critical section. + + 2. When waiting for a sample call SetWaiting() which increments + m_lWaiting BEFORE leaving the allocator's critical section. + + 3. Actually wait by calling WaitForSingleObject(m_hSem, INFINITE) + having left the allocator's critical section. The effect of + this is to remove 1 from the semaphore's count. You MUST call + this once having incremented m_lWaiting. + + The following are then true when the critical section is not held : + (let nWaiting = number about to wait or waiting) + + (1) if (m_lFree.GetCount() != 0) then (m_lWaiting == 0) + (2) m_lWaiting + Semaphore count == nWaiting + + We would deadlock if + nWaiting != 0 && + m_lFree.GetCount() != 0 && + Semaphore count == 0 + + But from (1) if m_lFree.GetCount() != 0 then m_lWaiting == 0 so + from (2) Semaphore count == nWaiting (which is non-0) so the + deadlock can't happen. + */ + + HANDLE m_hSem; // For signalling + long m_lWaiting; // Waiting for a free element + long m_lCount; // how many buffers we have agreed to provide + long m_lAllocated; // how many buffers are currently allocated + long m_lSize; // agreed size of each buffer + long m_lAlignment; // agreed alignment + long m_lPrefix; // agreed prefix (preceeds GetPointer() value) + BOOL m_bChanged; // Have the buffer requirements changed + + // if true, we are decommitted and can't allocate memory + BOOL m_bCommitted; + // if true, the decommit has happened, but we haven't called Free yet + // as there are still outstanding buffers + BOOL m_bDecommitInProgress; + + // Notification interface + IMemAllocatorNotifyCallbackTemp *m_pNotify; + + BOOL m_fEnableReleaseCallback; + + // called to decommit the memory when the last buffer is freed + // pure virtual - need to override this + virtual void Free(void) PURE; + + // override to allocate the memory when commit called + virtual HRESULT Alloc(void); + +public: + + CBaseAllocator( + __in_opt LPCTSTR , __inout_opt LPUNKNOWN, __inout HRESULT *, + BOOL bEvent = TRUE, BOOL fEnableReleaseCallback = FALSE); +#ifdef UNICODE + CBaseAllocator( + __in_opt LPCSTR , __inout_opt LPUNKNOWN, __inout HRESULT *, + BOOL bEvent = TRUE, BOOL fEnableReleaseCallback = FALSE); +#endif + virtual ~CBaseAllocator(); + + DECLARE_IUNKNOWN + + // override this to publicise our interfaces + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv); + + STDMETHODIMP SetProperties( + __in ALLOCATOR_PROPERTIES* pRequest, + __out ALLOCATOR_PROPERTIES* pActual); + + // return the properties actually being used on this allocator + STDMETHODIMP GetProperties( + __out ALLOCATOR_PROPERTIES* pProps); + + // override Commit to allocate memory. We handle the GetBuffer + //state changes + STDMETHODIMP Commit(); + + // override this to handle the memory freeing. We handle any outstanding + // GetBuffer calls + STDMETHODIMP Decommit(); + + // get container for a sample. Blocking, synchronous call to get the + // next free buffer (as represented by an IMediaSample interface). + // on return, the time etc properties will be invalid, but the buffer + // pointer and size will be correct. The two time parameters are + // optional and either may be NULL, they may alternatively be set to + // the start and end times the sample will have attached to it + // bPrevFramesSkipped is not used (used only by the video renderer's + // allocator where it affects quality management in direct draw). + + STDMETHODIMP GetBuffer(__deref_out IMediaSample **ppBuffer, + __in_opt REFERENCE_TIME * pStartTime, + __in_opt REFERENCE_TIME * pEndTime, + DWORD dwFlags); + + // final release of a CMediaSample will call this + STDMETHODIMP ReleaseBuffer(IMediaSample *pBuffer); + // obsolete:: virtual void PutOnFreeList(CMediaSample * pSample); + + STDMETHODIMP SetNotify(IMemAllocatorNotifyCallbackTemp *pNotify); + + STDMETHODIMP GetFreeCount(__out LONG *plBuffersFree); + + // Notify that a sample is available + void NotifySample(); + + // Notify that we're waiting for a sample + void SetWaiting() { m_lWaiting++; }; +}; + + +//===================================================================== +//===================================================================== +// Defines CMemAllocator +// +// this is an allocator based on CBaseAllocator that allocates sample +// buffers in main memory (from 'new'). You must call SetProperties +// before calling Commit. +// +// we don't free the memory when going into Decommit state. The simplest +// way to implement this without complicating CBaseAllocator is to +// have a Free() function, called to go into decommit state, that does +// nothing and a ReallyFree function called from our destructor that +// actually frees the memory. +//===================================================================== +//===================================================================== + +// Make me one from quartz.dll +STDAPI CreateMemoryAllocator(__deref_out IMemAllocator **ppAllocator); + +class CMemAllocator : public CBaseAllocator +{ + +protected: + + LPBYTE m_pBuffer; // combined memory for all buffers + + // override to free the memory when decommit completes + // - we actually do nothing, and save the memory until deletion. + void Free(void); + + // called from the destructor (and from Alloc if changing size/count) to + // actually free up the memory + void ReallyFree(void); + + // overriden to allocate the memory when commit called + HRESULT Alloc(void); + +public: + /* This goes in the factory template table to create new instances */ + static CUnknown *CreateInstance(__inout_opt LPUNKNOWN, __inout HRESULT *); + + STDMETHODIMP SetProperties( + __in ALLOCATOR_PROPERTIES* pRequest, + __out ALLOCATOR_PROPERTIES* pActual); + + CMemAllocator(__in_opt LPCTSTR , __inout_opt LPUNKNOWN, __inout HRESULT *); +#ifdef UNICODE + CMemAllocator(__in_opt LPCSTR , __inout_opt LPUNKNOWN, __inout HRESULT *); +#endif + ~CMemAllocator(); +}; + +// helper used by IAMovieSetup implementation +STDAPI +AMovieSetupRegisterFilter( const AMOVIESETUP_FILTER * const psetupdata + , IFilterMapper * pIFM + , BOOL bRegister ); + + +/////////////////////////////////////////////////////////////////////////// +// ------------------------------------------------------------------------ +// ------------------------------------------------------------------------ +// ------------------------------------------------------------------------ +// ------------------------------------------------------------------------ +/////////////////////////////////////////////////////////////////////////// + +#endif /* __FILTER__ */ + + +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/amvideo.cpp
Added
@@ -0,0 +1,275 @@ +//------------------------------------------------------------------------------ +// File: AMVideo.cpp +// +// Desc: DirectShow base classes - implements helper functions for +// bitmap formats. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include <limits.h> + +// These are bit field masks for true colour devices + +const DWORD bits555 = {0x007C00,0x0003E0,0x00001F}; +const DWORD bits565 = {0x00F800,0x0007E0,0x00001F}; +const DWORD bits888 = {0xFF0000,0x00FF00,0x0000FF}; + +// This maps bitmap subtypes into a bits per pixel value and also a +// name. unicode and ansi versions are stored because we have to +// return a pointer to a static string. +const struct { + const GUID *pSubtype; + WORD BitCount; + CHAR *pName; + WCHAR *wszName; +} BitCountMap = { &MEDIASUBTYPE_RGB1, 1, "RGB Monochrome", L"RGB Monochrome", + &MEDIASUBTYPE_RGB4, 4, "RGB VGA", L"RGB VGA", + &MEDIASUBTYPE_RGB8, 8, "RGB 8", L"RGB 8", + &MEDIASUBTYPE_RGB565, 16, "RGB 565 (16 bit)", L"RGB 565 (16 bit)", + &MEDIASUBTYPE_RGB555, 16, "RGB 555 (16 bit)", L"RGB 555 (16 bit)", + &MEDIASUBTYPE_RGB24, 24, "RGB 24", L"RGB 24", + &MEDIASUBTYPE_RGB32, 32, "RGB 32", L"RGB 32", + &MEDIASUBTYPE_ARGB32, 32, "ARGB 32", L"ARGB 32", + &MEDIASUBTYPE_Overlay, 0, "Overlay", L"Overlay", + &GUID_NULL, 0, "UNKNOWN", L"UNKNOWN" +}; + +// Return the size of the bitmap as defined by this header + +STDAPI_(DWORD) GetBitmapSize(const BITMAPINFOHEADER *pHeader) +{ + return DIBSIZE(*pHeader); +} + + +// This is called if the header has a 16 bit colour depth and needs to work +// out the detailed type from the bit fields (either RGB 565 or RGB 555) + +STDAPI_(const GUID) GetTrueColorType(const BITMAPINFOHEADER *pbmiHeader) +{ + BITMAPINFO *pbmInfo = (BITMAPINFO *) pbmiHeader; + ASSERT(pbmiHeader->biBitCount == 16); + + // If its BI_RGB then it's RGB 555 by default + + if (pbmiHeader->biCompression == BI_RGB) { + return MEDIASUBTYPE_RGB555; + } + + // Compare the bit fields with RGB 555 + + DWORD *pMask = (DWORD *) pbmInfo->bmiColors; + if (pMask0 == bits5550) { + if (pMask1 == bits5551) { + if (pMask2 == bits5552) { + return MEDIASUBTYPE_RGB555; + } + } + } + + // Compare the bit fields with RGB 565 + + pMask = (DWORD *) pbmInfo->bmiColors; + if (pMask0 == bits5650) { + if (pMask1 == bits5651) { + if (pMask2 == bits5652) { + return MEDIASUBTYPE_RGB565; + } + } + } + return GUID_NULL; +} + + +// Given a BITMAPINFOHEADER structure this returns the GUID sub type that is +// used to describe it in format negotiations. For example a video codec fills +// in the format block with a VIDEOINFO structure, it also fills in the major +// type with MEDIATYPE_VIDEO and the subtype with a GUID that matches the bit +// count, for example if it is an eight bit image then MEDIASUBTYPE_RGB8 + +STDAPI_(const GUID) GetBitmapSubtype(const BITMAPINFOHEADER *pbmiHeader) +{ + ASSERT(pbmiHeader); + + // If it's not RGB then create a GUID from the compression type + + if (pbmiHeader->biCompression != BI_RGB) { + if (pbmiHeader->biCompression != BI_BITFIELDS) { + FOURCCMap FourCCMap(pbmiHeader->biCompression); + return (const GUID) FourCCMap; + } + } + + // Map the RGB DIB bit depth to a image GUID + + switch(pbmiHeader->biBitCount) { + case 1 : return MEDIASUBTYPE_RGB1; + case 4 : return MEDIASUBTYPE_RGB4; + case 8 : return MEDIASUBTYPE_RGB8; + case 16 : return GetTrueColorType(pbmiHeader); + case 24 : return MEDIASUBTYPE_RGB24; + case 32 : return MEDIASUBTYPE_RGB32; + } + return GUID_NULL; +} + + +// Given a video bitmap subtype we return the number of bits per pixel it uses +// We return a WORD bit count as thats what the BITMAPINFOHEADER uses. If the +// GUID subtype is not found in the table we return an invalid USHRT_MAX + +STDAPI_(WORD) GetBitCount(const GUID *pSubtype) +{ + ASSERT(pSubtype); + const GUID *pMediaSubtype; + INT iPosition = 0; + + // Scan the mapping list seeing if the source GUID matches any known + // bitmap subtypes, the list is terminated by a GUID_NULL entry + + while (TRUE) { + pMediaSubtype = BitCountMapiPosition.pSubtype; + if (IsEqualGUID(*pMediaSubtype,GUID_NULL)) { + return USHRT_MAX; + } + if (IsEqualGUID(*pMediaSubtype,*pSubtype)) { + return BitCountMapiPosition.BitCount; + } + iPosition++; + } +} + + +// Given a bitmap subtype we return a description name that can be used for +// debug purposes. In a retail build this function still returns the names +// If the subtype isn't found in the lookup table we return string UNKNOWN + +int LocateSubtype(const GUID *pSubtype) +{ + ASSERT(pSubtype); + const GUID *pMediaSubtype; + INT iPosition = 0; + + // Scan the mapping list seeing if the source GUID matches any known + // bitmap subtypes, the list is terminated by a GUID_NULL entry + + while (TRUE) { + pMediaSubtype = BitCountMapiPosition.pSubtype; + if (IsEqualGUID(*pMediaSubtype,*pSubtype) || + IsEqualGUID(*pMediaSubtype,GUID_NULL) + ) + { + break; + } + + iPosition++; + } + + return iPosition; +} + + + +STDAPI_(WCHAR *) GetSubtypeNameW(const GUID *pSubtype) +{ + return BitCountMapLocateSubtype(pSubtype).wszName; +} + +STDAPI_(CHAR *) GetSubtypeNameA(const GUID *pSubtype) +{ + return BitCountMapLocateSubtype(pSubtype).pName; +} + +#ifndef GetSubtypeName +#error wxutil.h should have defined GetSubtypeName +#endif +#undef GetSubtypeName + +// this is here for people that linked to it directly; most people +// would use the header file that picks the A or W version. +STDAPI_(CHAR *) GetSubtypeName(const GUID *pSubtype) +{ + return GetSubtypeNameA(pSubtype); +} + + +// The mechanism for describing a bitmap format is with the BITMAPINFOHEADER +// This is really messy to deal with because it invariably has fields that +// follow it holding bit fields, palettes and the rest. This function gives +// the number of bytes required to hold a VIDEOINFO that represents it. This +// count includes the prefix information (like the rcSource rectangle) the +// BITMAPINFOHEADER field, and any other colour information on the end. +// +// WARNING If you want to copy a BITMAPINFOHEADER into a VIDEOINFO always make +// sure that you use the HEADER macro because the BITMAPINFOHEADER field isn't +// right at the start of the VIDEOINFO (there are a number of other fields), +// +// CopyMemory(HEADER(pVideoInfo),pbmi,sizeof(BITMAPINFOHEADER)); +// + +STDAPI_(LONG) GetBitmapFormatSize(const BITMAPINFOHEADER *pHeader) +{ + // Everyone has this to start with this + LONG Size = SIZE_PREHEADER + pHeader->biSize; + + ASSERT(pHeader->biSize >= sizeof(BITMAPINFOHEADER)); + + // Does this format use a palette, if the number of colours actually used + // is zero then it is set to the maximum that are allowed for that colour + // depth (an example is 256 for eight bits). Truecolour formats may also + // pass a palette with them in which case the used count is non zero + + // This would scare me. + ASSERT(pHeader->biBitCount <= iPALETTE || pHeader->biClrUsed == 0); + + if (pHeader->biBitCount <= iPALETTE || pHeader->biClrUsed) { + LONG Entries = (DWORD) 1 << pHeader->biBitCount; + if (pHeader->biClrUsed) { + Entries = pHeader->biClrUsed; + } + Size += Entries * sizeof(RGBQUAD); + } + + // Truecolour formats may have a BI_BITFIELDS specifier for compression + // type which means that room for three DWORDs should be allocated that + // specify where in each pixel the RGB colour components may be found + + if (pHeader->biCompression == BI_BITFIELDS) { + Size += SIZE_MASKS; + } + + // A BITMAPINFO for a palettised image may also contain a palette map that + // provides the information to map from a source palette to a destination + // palette during a BitBlt for example, because this information is only + // ever processed during drawing you don't normally store the palette map + // nor have any way of knowing if it is present in the data structure + + return Size; +} + + +// Returns TRUE if the VIDEOINFO contains a palette + +STDAPI_(BOOL) ContainsPalette(const VIDEOINFOHEADER *pVideoInfo) +{ + if (PALETTISED(pVideoInfo) == FALSE) { + if (pVideoInfo->bmiHeader.biClrUsed == 0) { + return FALSE; + } + } + return TRUE; +} + + +// Return a pointer to the first entry in a palette + +STDAPI_(const RGBQUAD *) GetBitmapPalette(const VIDEOINFOHEADER *pVideoInfo) +{ + if (pVideoInfo->bmiHeader.biCompression == BI_BITFIELDS) { + return TRUECOLOR(pVideoInfo)->bmiColors; + } + return COLORS(pVideoInfo); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/arithutil.cpp
Added
@@ -0,0 +1,360 @@ +//------------------------------------------------------------------------------ +// File: ArithUtil.cpp +// +// Desc: DirectShow base classes - implements helper classes for building +// multimedia filters. +// +// Copyright (c) 1992-2004 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + +#include <streams.h> + +// +// Declare function from largeint.h we need so that PPC can build +// + +// +// Enlarged integer divide - 64-bits / 32-bits > 32-bits +// + +#ifndef _X86_ + +#define LLtoU64(x) (*(unsigned __int64*)(void*)(&(x))) + +__inline +ULONG +WINAPI +EnlargedUnsignedDivide ( + IN ULARGE_INTEGER Dividend, + IN ULONG Divisor, + IN PULONG Remainder + ) +{ + // return remainder if necessary + if (Remainder != NULL) + *Remainder = (ULONG)(LLtoU64(Dividend) % Divisor); + return (ULONG)(LLtoU64(Dividend) / Divisor); +} + +#else +__inline +ULONG +WINAPI +EnlargedUnsignedDivide ( + IN ULARGE_INTEGER Dividend, + IN ULONG Divisor, + IN PULONG Remainder + ) +{ + ULONG ulResult; + _asm { + mov eax,Dividend.LowPart + mov edx,Dividend.HighPart + mov ecx,Remainder + div Divisor + or ecx,ecx + jz short label + mov ecx,edx +label: + mov ulResult,eax + } + return ulResult; +} +#endif + + +/* Arithmetic functions to help with time format conversions +*/ + +#ifdef _M_ALPHA +// work around bug in version 12.00.8385 of the alpha compiler where +// UInt32x32To64 sign-extends its arguments (?) +#undef UInt32x32To64 +#define UInt32x32To64(a, b) (((ULONGLONG)((ULONG)(a)) & 0xffffffff) * ((ULONGLONG)((ULONG)(b)) & 0xffffffff)) +#endif + +/* Compute (a * b + d) / c */ +LONGLONG WINAPI llMulDiv(LONGLONG a, LONGLONG b, LONGLONG c, LONGLONG d) +{ + /* Compute the absolute values to avoid signed arithmetic problems */ + ULARGE_INTEGER ua, ub; + DWORDLONG uc; + + ua.QuadPart = (DWORDLONG)(a >= 0 ? a : -a); + ub.QuadPart = (DWORDLONG)(b >= 0 ? b : -b); + uc = (DWORDLONG)(c >= 0 ? c : -c); + BOOL bSign = (a < 0) ^ (b < 0); + + /* Do long multiplication */ + ULARGE_INTEGER p2; + p0.QuadPart = UInt32x32To64(ua.LowPart, ub.LowPart); + + /* This next computation cannot overflow into p1.HighPart because + the max number we can compute here is: + + (2 ** 32 - 1) * (2 ** 32 - 1) + // ua.LowPart * ub.LowPart + (2 ** 32) * (2 ** 31) * (2 ** 32 - 1) * 2 // x.LowPart * y.HighPart * 2 + + == 2 ** 96 - 2 ** 64 + (2 ** 64 - 2 ** 33 + 1) + == 2 ** 96 - 2 ** 33 + 1 + < 2 ** 96 + */ + + ULARGE_INTEGER x; + x.QuadPart = UInt32x32To64(ua.LowPart, ub.HighPart) + + UInt32x32To64(ua.HighPart, ub.LowPart) + + p0.HighPart; + p0.HighPart = x.LowPart; + p1.QuadPart = UInt32x32To64(ua.HighPart, ub.HighPart) + x.HighPart; + + if (d != 0) { + ULARGE_INTEGER ud2; + if (bSign) { + ud0.QuadPart = (DWORDLONG)(-d); + if (d > 0) { + /* -d < 0 */ + ud1.QuadPart = (DWORDLONG)(LONGLONG)-1; + } else { + ud1.QuadPart = (DWORDLONG)0; + } + } else { + ud0.QuadPart = (DWORDLONG)d; + if (d < 0) { + ud1.QuadPart = (DWORDLONG)(LONGLONG)-1; + } else { + ud1.QuadPart = (DWORDLONG)0; + } + } + /* Now do extended addition */ + ULARGE_INTEGER uliTotal; + + /* Add ls DWORDs */ + uliTotal.QuadPart = (DWORDLONG)ud0.LowPart + p0.LowPart; + p0.LowPart = uliTotal.LowPart; + + /* Propagate carry */ + uliTotal.LowPart = uliTotal.HighPart; + uliTotal.HighPart = 0; + + /* Add 2nd most ls DWORDs */ + uliTotal.QuadPart += (DWORDLONG)ud0.HighPart + p0.HighPart; + p0.HighPart = uliTotal.LowPart; + + /* Propagate carry */ + uliTotal.LowPart = uliTotal.HighPart; + uliTotal.HighPart = 0; + + /* Add MS DWORDLONGs - no carry expected */ + p1.QuadPart += ud1.QuadPart + uliTotal.QuadPart; + + /* Now see if we got a sign change from the addition */ + if ((LONG)p1.HighPart < 0) { + bSign = !bSign; + + /* Negate the current value (ugh!) */ + p0.QuadPart = ~p0.QuadPart; + p1.QuadPart = ~p1.QuadPart; + p0.QuadPart += 1; + p1.QuadPart += (p0.QuadPart == 0); + } + } + + /* Now for the division */ + if (c < 0) { + bSign = !bSign; + } + + + /* This will catch c == 0 and overflow */ + if (uc <= p1.QuadPart) { + return bSign ? (LONGLONG)0x8000000000000000 : + (LONGLONG)0x7FFFFFFFFFFFFFFF; + } + + DWORDLONG ullResult; + + /* Do the division */ + /* If the dividend is a DWORD_LONG use the compiler */ + if (p1.QuadPart == 0) { + ullResult = p0.QuadPart / uc; + return bSign ? -(LONGLONG)ullResult : (LONGLONG)ullResult; + } + + /* If the divisor is a DWORD then its simpler */ + ULARGE_INTEGER ulic; + ulic.QuadPart = uc; + if (ulic.HighPart == 0) { + ULARGE_INTEGER uliDividend; + ULARGE_INTEGER uliResult; + DWORD dwDivisor = (DWORD)uc; + // ASSERT(p1.HighPart == 0 && p1.LowPart < dwDivisor); + uliDividend.HighPart = p1.LowPart; + uliDividend.LowPart = p0.HighPart; +#ifndef USE_LARGEINT + uliResult.HighPart = (DWORD)(uliDividend.QuadPart / dwDivisor); + p0.HighPart = (DWORD)(uliDividend.QuadPart % dwDivisor); + uliResult.LowPart = 0; + uliResult.QuadPart = p0.QuadPart / dwDivisor + uliResult.QuadPart; +#else + /* NOTE - this routine will take exceptions if + the result does not fit in a DWORD + */ + if (uliDividend.QuadPart >= (DWORDLONG)dwDivisor) { + uliResult.HighPart = EnlargedUnsignedDivide( + uliDividend, + dwDivisor, + &p0.HighPart); + } else { + uliResult.HighPart = 0; + } + uliResult.LowPart = EnlargedUnsignedDivide( + p0, + dwDivisor, + NULL); +#endif + return bSign ? -(LONGLONG)uliResult.QuadPart : + (LONGLONG)uliResult.QuadPart; + } + + + ullResult = 0; + + /* OK - do long division */ + for (int i = 0; i < 64; i++) { + ullResult <<= 1; + + /* Shift 128 bit p left 1 */ + p1.QuadPart <<= 1; + if ((p0.HighPart & 0x80000000) != 0) { + p1.LowPart++; + } + p0.QuadPart <<= 1; + + /* Compare */ + if (uc <= p1.QuadPart) { + p1.QuadPart -= uc; + ullResult += 1; + } + } + + return bSign ? - (LONGLONG)ullResult : (LONGLONG)ullResult; +} + +LONGLONG WINAPI Int64x32Div32(LONGLONG a, LONG b, LONG c, LONG d) +{ + ULARGE_INTEGER ua; + DWORD ub; + DWORD uc; + + /* Compute the absolute values to avoid signed arithmetic problems */ + ua.QuadPart = (DWORDLONG)(a >= 0 ? a : -a); + ub = (DWORD)(b >= 0 ? b : -b); + uc = (DWORD)(c >= 0 ? c : -c); + BOOL bSign = (a < 0) ^ (b < 0); + + /* Do long multiplication */ + ULARGE_INTEGER p0; + DWORD p1; + p0.QuadPart = UInt32x32To64(ua.LowPart, ub); + + if (ua.HighPart != 0) { + ULARGE_INTEGER x; + x.QuadPart = UInt32x32To64(ua.HighPart, ub) + p0.HighPart; + p0.HighPart = x.LowPart; + p1 = x.HighPart; + } else { + p1 = 0; + } + + if (d != 0) { + ULARGE_INTEGER ud0; + DWORD ud1; + + if (bSign) { + // + // Cast d to LONGLONG first otherwise -0x80000000 sign extends + // incorrectly + // + ud0.QuadPart = (DWORDLONG)(-(LONGLONG)d); + if (d > 0) { + /* -d < 0 */ + ud1 = (DWORD)-1; + } else { + ud1 = (DWORD)0; + } + } else { + ud0.QuadPart = (DWORDLONG)d; + if (d < 0) { + ud1 = (DWORD)-1; + } else { + ud1 = (DWORD)0; + } + } + /* Now do extended addition */ + ULARGE_INTEGER uliTotal; + + /* Add ls DWORDs */ + uliTotal.QuadPart = (DWORDLONG)ud0.LowPart + p0.LowPart; + p0.LowPart = uliTotal.LowPart; + + /* Propagate carry */ + uliTotal.LowPart = uliTotal.HighPart; + uliTotal.HighPart = 0; + + /* Add 2nd most ls DWORDs */ + uliTotal.QuadPart += (DWORDLONG)ud0.HighPart + p0.HighPart; + p0.HighPart = uliTotal.LowPart; + + /* Add MS DWORDLONGs - no carry expected */ + p1 += ud1 + uliTotal.HighPart; + + /* Now see if we got a sign change from the addition */ + if ((LONG)p1 < 0) { + bSign = !bSign; + + /* Negate the current value (ugh!) */ + p0.QuadPart = ~p0.QuadPart; + p1 = ~p1; + p0.QuadPart += 1; + p1 += (p0.QuadPart == 0); + } + } + + /* Now for the division */ + if (c < 0) { + bSign = !bSign; + } + + + /* This will catch c == 0 and overflow */ + if (uc <= p1) { + return bSign ? (LONGLONG)0x8000000000000000 : + (LONGLONG)0x7FFFFFFFFFFFFFFF; + } + + /* Do the division */ + + /* If the divisor is a DWORD then its simpler */ + ULARGE_INTEGER uliDividend; + ULARGE_INTEGER uliResult; + DWORD dwDivisor = uc; + uliDividend.HighPart = p1; + uliDividend.LowPart = p0.HighPart; + /* NOTE - this routine will take exceptions if + the result does not fit in a DWORD + */ + if (uliDividend.QuadPart >= (DWORDLONG)dwDivisor) { + uliResult.HighPart = EnlargedUnsignedDivide( + uliDividend, + dwDivisor, + &p0.HighPart); + } else { + uliResult.HighPart = 0; + } + uliResult.LowPart = EnlargedUnsignedDivide( + p0, + dwDivisor, + NULL); + return bSign ? -(LONGLONG)uliResult.QuadPart : + (LONGLONG)uliResult.QuadPart; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/cache.h
Added
@@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// File: Cache.h +// +// Desc: DirectShow base classes - efines a non-MFC generic cache class. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +/* This class implements a simple cache. A cache object is instantiated + with the number of items it is to hold. An item is a pointer to an + object derived from CBaseObject (helps reduce memory leaks). The cache + can then have objects added to it and removed from it. The cache size + is fixed at construction time and may therefore run out or be flooded. + If it runs out it returns a NULL pointer, if it fills up it also returns + a NULL pointer instead of a pointer to the object just inserted */ + +/* Making these classes inherit from CBaseObject does nothing for their + functionality but it allows us to check there are no memory leaks */ + +/* WARNING Be very careful when using this class, what it lets you do is + store and retrieve objects so that you can minimise object creation + which in turns improves efficiency. However the object you store is + exactly the same as the object you get back which means that it short + circuits the constructor initialisation phase. This means any class + variables the object has (eg pointers) are highly likely to be invalid. + Therefore ensure you reinitialise the object before using it again */ + + +#ifndef __CACHE__ +#define __CACHE__ + + +class CCache : CBaseObject { + + /* Make copy constructor and assignment operator inaccessible */ + + CCache(const CCache &refCache); + CCache &operator=(const CCache &refCache); + +private: + + /* These are initialised in the constructor. The first variable points to + an array of pointers, each of which points to a CBaseObject derived + object. The m_iCacheSize is the static fixed size for the cache and the + m_iUsed defines the number of places filled with objects at any time. + We fill the array of pointers from the start (ie m_ppObjects0 first) + and then only add and remove objects from the end position, so in this + respect the array of object pointers should be treated as a stack */ + + CBaseObject **m_ppObjects; + const INT m_iCacheSize; + INT m_iUsed; + +public: + + CCache(__in_opt LPCTSTR pName,INT iItems); + virtual ~CCache(); + + /* Add an item to the cache */ + CBaseObject *AddToCache(__in CBaseObject *pObject); + + /* Remove an item from the cache */ + CBaseObject *RemoveFromCache(); + + /* Delete all the objects held in the cache */ + void RemoveAll(void); + + /* Return the cache size which is set during construction */ + INT GetCacheSize(void) const {return m_iCacheSize;}; +}; + +#endif /* __CACHE__ */ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/checkbmi.h
Added
@@ -0,0 +1,120 @@ +// Copyright (c) 1992 - 1997 Microsoft Corporation. All Rights Reserved. + +#ifndef _CHECKBMI_H_ +#define _CHECKBMI_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +// Helper +__inline BOOL MultiplyCheckOverflow(DWORD a, DWORD b, __deref_out_range(==, a * b) DWORD *pab) { + *pab = a * b; + if ((a == 0) || (((*pab) / a) == b)) { + return TRUE; + } + return FALSE; +} + + +// Checks if the fields in a BITMAPINFOHEADER won't generate +// overlows and buffer overruns +// This is not a complete check and does not guarantee code using this structure will be secure +// from attack +// Bugs this is guarding against: +// 1. Total structure size calculation overflowing +// 2. biClrUsed > 256 for 8-bit palettized content +// 3. Total bitmap size in bytes overflowing +// 4. biSize < size of the base structure leading to accessessing random memory +// 5. Total structure size exceeding know size of data +// + +__success(return != 0) __inline BOOL ValidateBitmapInfoHeader( + const BITMAPINFOHEADER *pbmi, // pointer to structure to check + __out_range(>=, sizeof(BITMAPINFOHEADER)) DWORD cbSize // size of memory block containing structure +) +{ + DWORD dwWidthInBytes; + DWORD dwBpp; + DWORD dwWidthInBits; + DWORD dwHeight; + DWORD dwSizeImage; + DWORD dwClrUsed; + + // Reject bad parameters - do the size check first to avoid reading bad memory + if (cbSize < sizeof(BITMAPINFOHEADER) || + pbmi->biSize < sizeof(BITMAPINFOHEADER) || + pbmi->biSize > 4096) { + return FALSE; + } + + // Reject 0 size + if (pbmi->biWidth == 0 || pbmi->biHeight == 0) { + return FALSE; + } + + // Use bpp of 200 for validating against further overflows if not set for compressed format + dwBpp = 200; + + if (pbmi->biBitCount > dwBpp) { + return FALSE; + } + + // Strictly speaking abs can overflow so cast explicitly to DWORD + dwHeight = (DWORD)abs(pbmi->biHeight); + + if (!MultiplyCheckOverflow(dwBpp, (DWORD)pbmi->biWidth, &dwWidthInBits)) { + return FALSE; + } + + // Compute correct width in bytes - rounding up to 4 bytes + dwWidthInBytes = (dwWidthInBits / 8 + 3) & ~3; + + if (!MultiplyCheckOverflow(dwWidthInBytes, dwHeight, &dwSizeImage)) { + return FALSE; + } + + // Fail if total size is 0 - this catches indivual quantities being 0 + // Also don't allow huge values > 1GB which might cause arithmetic + // errors for users + if (dwSizeImage > 0x40000000 || + pbmi->biSizeImage > 0x40000000) { + return FALSE; + } + + // Fail if biClrUsed looks bad + if (pbmi->biClrUsed > 256) { + return FALSE; + } + + if (pbmi->biClrUsed == 0 && pbmi->biBitCount <= 8 && pbmi->biBitCount > 0) { + dwClrUsed = (1 << pbmi->biBitCount); + } else { + dwClrUsed = pbmi->biClrUsed; + } + + // Check total size + if (cbSize < pbmi->biSize + dwClrUsed * sizeof(RGBQUAD) + + (pbmi->biCompression == BI_BITFIELDS ? 3 * sizeof(DWORD) : 0)) { + return FALSE; + } + + // If it is RGB validate biSizeImage - lots of code assumes the size is correct + if (pbmi->biCompression == BI_RGB || pbmi->biCompression == BI_BITFIELDS) { + if (pbmi->biSizeImage != 0) { + DWORD dwBits = (DWORD)pbmi->biWidth * (DWORD)pbmi->biBitCount; + DWORD dwWidthInBytes = ((DWORD)((dwBits+31) & (~31)) / 8); + DWORD dwTotalSize = (DWORD)abs(pbmi->biHeight) * dwWidthInBytes; + if (dwTotalSize > pbmi->biSizeImage) { + return FALSE; + } + } + } + return TRUE; +} + +#ifdef __cplusplus +} +#endif + +#endif // _CHECKBMI_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/combase.cpp
Added
@@ -0,0 +1,265 @@ +//------------------------------------------------------------------------------ +// File: ComBase.cpp +// +// Desc: DirectShow base classes - implements class hierarchy for creating +// COM objects. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#pragma warning( disable : 4514 ) // Disable warnings re unused inline functions + + +/* Define the static member variable */ + +LONG CBaseObject::m_cObjects = 0; + + +/* Constructor */ + +CBaseObject::CBaseObject(__in_opt LPCTSTR pName) +{ + /* Increment the number of active objects */ + InterlockedIncrement(&m_cObjects); + +#ifdef DEBUG + +#ifdef UNICODE + m_dwCookie = DbgRegisterObjectCreation(0, pName); +#else + m_dwCookie = DbgRegisterObjectCreation(pName, 0); +#endif + +#endif +} + +#ifdef UNICODE +CBaseObject::CBaseObject(const char *pName) +{ + /* Increment the number of active objects */ + InterlockedIncrement(&m_cObjects); + +#ifdef DEBUG + m_dwCookie = DbgRegisterObjectCreation(pName, 0); +#endif +} +#endif + +HINSTANCE hlibOLEAut32; + +/* Destructor */ + +CBaseObject::~CBaseObject() +{ + /* Decrement the number of objects active */ + if (InterlockedDecrement(&m_cObjects) == 0) { + if (hlibOLEAut32) { + FreeLibrary(hlibOLEAut32); + + hlibOLEAut32 = 0; + } + }; + + +#ifdef DEBUG + DbgRegisterObjectDestruction(m_dwCookie); +#endif +} + +static const TCHAR szOle32Aut = TEXT("OleAut32.dll"); + +HINSTANCE LoadOLEAut32() +{ + if (hlibOLEAut32 == 0) { + + hlibOLEAut32 = LoadLibrary(szOle32Aut); + } + + return hlibOLEAut32; +} + + +/* Constructor */ + +// We know we use "this" in the initialization list, we also know we don't modify *phr. +#pragma warning( disable : 4355 4100 ) +CUnknown::CUnknown(__in_opt LPCTSTR pName, __in_opt LPUNKNOWN pUnk) +: CBaseObject(pName) +/* Start the object with a reference count of zero - when the */ +/* object is queried for it's first interface this may be */ +/* incremented depending on whether or not this object is */ +/* currently being aggregated upon */ +, m_cRef(0) +/* Set our pointer to our IUnknown interface. */ +/* If we have an outer, use its, otherwise use ours. */ +/* This pointer effectivly points to the owner of */ +/* this object and can be accessed by the GetOwner() method. */ +, m_pUnknown( pUnk != 0 ? pUnk : reinterpret_cast<LPUNKNOWN>( static_cast<PNDUNKNOWN>(this) ) ) + /* Why the double cast? Well, the inner cast is a type-safe cast */ + /* to pointer to a type from which we inherit. The second is */ + /* type-unsafe but works because INonDelegatingUnknown "behaves */ + /* like" IUnknown. (Only the names on the methods change.) */ +{ + // Everything we need to do has been done in the initializer list +} + +// This does the same as above except it has a useless HRESULT argument +// use the previous constructor, this is just left for compatibility... +CUnknown::CUnknown(__in_opt LPCTSTR pName, __in_opt LPUNKNOWN pUnk, __inout_opt HRESULT *phr) : + CBaseObject(pName), + m_cRef(0), + m_pUnknown( pUnk != 0 ? pUnk : reinterpret_cast<LPUNKNOWN>( static_cast<PNDUNKNOWN>(this) ) ) +{ +} + +#ifdef UNICODE +CUnknown::CUnknown(__in_opt LPCSTR pName, __in_opt LPUNKNOWN pUnk) +: CBaseObject(pName), m_cRef(0), + m_pUnknown( pUnk != 0 ? pUnk : reinterpret_cast<LPUNKNOWN>( static_cast<PNDUNKNOWN>(this) ) ) +{ } + +CUnknown::CUnknown(__in_opt LPCSTR pName, __in_opt LPUNKNOWN pUnk, __inout_opt HRESULT *phr) : + CBaseObject(pName), m_cRef(0), + m_pUnknown( pUnk != 0 ? pUnk : reinterpret_cast<LPUNKNOWN>( static_cast<PNDUNKNOWN>(this) ) ) +{ } + +#endif + +#pragma warning( default : 4355 4100 ) + + +/* QueryInterface */ + +STDMETHODIMP CUnknown::NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv) +{ + CheckPointer(ppv,E_POINTER); + ValidateReadWritePtr(ppv,sizeof(PVOID)); + + /* We know only about IUnknown */ + + if (riid == IID_IUnknown) { + GetInterface((LPUNKNOWN) (PNDUNKNOWN) this, ppv); + return NOERROR; + } else { + *ppv = NULL; + return E_NOINTERFACE; + } +} + +/* We have to ensure that we DON'T use a max macro, since these will typically */ +/* lead to one of the parameters being evaluated twice. Since we are worried */ +/* about concurrency, we can't afford to access the m_cRef twice since we can't */ +/* afford to run the risk that its value having changed between accesses. */ + +template<class T> inline static T ourmax( const T & a, const T & b ) +{ + return a > b ? a : b; +} + +/* AddRef */ + +STDMETHODIMP_(ULONG) CUnknown::NonDelegatingAddRef() +{ + LONG lRef = InterlockedIncrement( &m_cRef ); + ASSERT(lRef > 0); + DbgLog((LOG_MEMORY,3,TEXT(" Obj %d ref++ = %d"), + m_dwCookie, m_cRef)); + return ourmax(ULONG(m_cRef), 1ul); +} + + +/* Release */ + +STDMETHODIMP_(ULONG) CUnknown::NonDelegatingRelease() +{ + /* If the reference count drops to zero delete ourselves */ + + LONG lRef = InterlockedDecrement( &m_cRef ); + ASSERT(lRef >= 0); + + DbgLog((LOG_MEMORY,3,TEXT(" Object %d ref-- = %d"), + m_dwCookie, m_cRef)); + if (lRef == 0) { + + // COM rules say we must protect against re-entrancy. + // If we are an aggregator and we hold our own interfaces + // on the aggregatee, the QI for these interfaces will + // addref ourselves. So after doing the QI we must release + // a ref count on ourselves. Then, before releasing the + // private interface, we must addref ourselves. When we do + // this from the destructor here it will result in the ref + // count going to 1 and then back to 0 causing us to + // re-enter the destructor. Hence we add an extra refcount here + // once we know we will delete the object. + // for an example aggregator see filgraph\distrib.cpp. + + m_cRef++; + + delete this; + return ULONG(0); + } else { + // Don't touch m_cRef again even in this leg as the object + // may have just been released on another thread too + return ourmax(ULONG(lRef), 1ul); + } +} + + +/* Return an interface pointer to a requesting client + performing a thread safe AddRef as necessary */ + +STDAPI GetInterface(LPUNKNOWN pUnk, __out void **ppv) +{ + CheckPointer(ppv, E_POINTER); + *ppv = pUnk; + pUnk->AddRef(); + return NOERROR; +} + + +/* Compares two interfaces and returns TRUE if they are on the same object */ + +BOOL WINAPI IsEqualObject(IUnknown *pFirst, IUnknown *pSecond) +{ + /* Different objects can't have the same interface pointer for + any interface + */ + if (pFirst == pSecond) { + return TRUE; + } + /* OK - do it the hard way - check if they have the same + IUnknown pointers - a single object can only have one of these + */ + LPUNKNOWN pUnknown1; // Retrieve the IUnknown interface + LPUNKNOWN pUnknown2; // Retrieve the other IUnknown interface + HRESULT hr; // General OLE return code + + ASSERT(pFirst); + ASSERT(pSecond); + + /* See if the IUnknown pointers match */ + + hr = pFirst->QueryInterface(IID_IUnknown,(void **) &pUnknown1); + if (FAILED(hr)) { + return FALSE; + } + ASSERT(pUnknown1); + + /* Release the extra interface we hold */ + + pUnknown1->Release(); + + hr = pSecond->QueryInterface(IID_IUnknown,(void **) &pUnknown2); + if (FAILED(hr)) { + return FALSE; + } + ASSERT(pUnknown2); + + /* Release the extra interface we hold */ + + pUnknown2->Release(); + return (pUnknown1 == pUnknown2); +} +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/combase.h
Added
@@ -0,0 +1,305 @@ +//------------------------------------------------------------------------------ +// File: ComBase.h +// +// Desc: DirectShow base classes - defines a class hierarchy for creating +// COM objects. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +/* + +a. Derive your COM object from CUnknown + +b. Make a static CreateInstance function that takes an LPUNKNOWN, an HRESULT * + and a TCHAR *. The LPUNKNOWN defines the object to delegate IUnknown calls + to. The HRESULT * allows error codes to be passed around constructors and + the TCHAR * is a descriptive name that can be printed on the debugger. + + It is important that constructors only change the HRESULT * if they have + to set an ERROR code, if it was successful then leave it alone or you may + overwrite an error code from an object previously created. + + When you call a constructor the descriptive name should be in static store + as we do not copy the string. To stop large amounts of memory being used + in retail builds by all these static strings use the NAME macro, + + CMyFilter = new CImplFilter(NAME("My filter"),pUnknown,phr); + if (FAILED(hr)) { + return hr; + } + + In retail builds NAME(_x_) compiles to NULL, the base CBaseObject class + knows not to do anything with objects that don't have a name. + +c. Have a constructor for your object that passes the LPUNKNOWN, HRESULT * and + TCHAR * to the CUnknown constructor. You can set the HRESULT if you have an + error, or just simply pass it through to the constructor. + + The object creation will fail in the class factory if the HRESULT indicates + an error (ie FAILED(HRESULT) == TRUE) + +d. Create a FactoryTemplate with your object's class id and CreateInstance + function. + +Then (for each interface) either + +Multiple inheritance + +1. Also derive it from ISomeInterface +2. Include DECLARE_IUNKNOWN in your class definition to declare + implementations of QueryInterface, AddRef and Release that + call the outer unknown +3. Override NonDelegatingQueryInterface to expose ISomeInterface by + code something like + + if (riid == IID_ISomeInterface) { + return GetInterface((ISomeInterface *) this, ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } + +4. Declare and implement the member functions of ISomeInterface. + +or: Nested interfaces + +1. Declare a class derived from CUnknown +2. Include DECLARE_IUNKNOWN in your class definition +3. Override NonDelegatingQueryInterface to expose ISomeInterface by + code something like + + if (riid == IID_ISomeInterface) { + return GetInterface((ISomeInterface *) this, ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } + +4. Implement the member functions of ISomeInterface. Use GetOwner() to + access the COM object class. + +And in your COM object class: + +5. Make the nested class a friend of the COM object class, and declare + an instance of the nested class as a member of the COM object class. + + NOTE that because you must always pass the outer unknown and an hResult + to the CUnknown constructor you cannot use a default constructor, in + other words you will have to make the member variable a pointer to the + class and make a NEW call in your constructor to actually create it. + +6. override the NonDelegatingQueryInterface with code like this: + + if (riid == IID_ISomeInterface) { + return m_pImplFilter-> + NonDelegatingQueryInterface(IID_ISomeInterface, ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } + +You can have mixed classes which support some interfaces via multiple +inheritance and some via nested classes + +*/ + +#ifndef __COMBASE__ +#define __COMBASE__ + +// Filter Setup data structures no defined in axextend.idl + +typedef REGPINTYPES +AMOVIESETUP_MEDIATYPE, * PAMOVIESETUP_MEDIATYPE, * FAR LPAMOVIESETUP_MEDIATYPE; + +typedef REGFILTERPINS +AMOVIESETUP_PIN, * PAMOVIESETUP_PIN, * FAR LPAMOVIESETUP_PIN; + +typedef struct _AMOVIESETUP_FILTER +{ + const CLSID * clsID; + const WCHAR * strName; + DWORD dwMerit; + UINT nPins; + const AMOVIESETUP_PIN * lpPin; +} +AMOVIESETUP_FILTER, * PAMOVIESETUP_FILTER, * FAR LPAMOVIESETUP_FILTER; + +/* The DLLENTRY module initialises the module handle on loading */ + +extern HINSTANCE g_hInst; + +/* On DLL load remember which platform we are running on */ + +extern DWORD g_amPlatform; +extern OSVERSIONINFO g_osInfo; // Filled in by GetVersionEx + +/* Version of IUnknown that is renamed to allow a class to support both + non delegating and delegating IUnknowns in the same COM object */ + +#ifndef INONDELEGATINGUNKNOWN_DEFINED +DECLARE_INTERFACE(INonDelegatingUnknown) +{ + STDMETHOD(NonDelegatingQueryInterface) (THIS_ REFIID, LPVOID *) PURE; + STDMETHOD_(ULONG, NonDelegatingAddRef)(THIS) PURE; + STDMETHOD_(ULONG, NonDelegatingRelease)(THIS) PURE; +}; +#define INONDELEGATINGUNKNOWN_DEFINED +#endif + +typedef INonDelegatingUnknown *PNDUNKNOWN; + + +/* This is the base object class that supports active object counting. As + part of the debug facilities we trace every time a C++ object is created + or destroyed. The name of the object has to be passed up through the class + derivation list during construction as you cannot call virtual functions + in the constructor. The downside of all this is that every single object + constructor has to take an object name parameter that describes it */ + +class CBaseObject +{ + +private: + + // Disable the copy constructor and assignment by default so you will get + // compiler errors instead of unexpected behaviour if you pass objects + // by value or assign objects. + CBaseObject(const CBaseObject& objectSrc); // no implementation + void operator=(const CBaseObject& objectSrc); // no implementation + +private: + static LONG m_cObjects; /* Total number of objects active */ + +protected: +#ifdef DEBUG + DWORD m_dwCookie; /* Cookie identifying this object */ +#endif + + +public: + + /* These increment and decrement the number of active objects */ + + CBaseObject(__in_opt LPCTSTR pName); +#ifdef UNICODE + CBaseObject(__in_opt LPCSTR pName); +#endif + ~CBaseObject(); + + /* Call this to find if there are any CUnknown derived objects active */ + + static LONG ObjectsActive() { + return m_cObjects; + }; +}; + + +/* An object that supports one or more COM interfaces will be based on + this class. It supports counting of total objects for DLLCanUnloadNow + support, and an implementation of the core non delegating IUnknown */ + +class AM_NOVTABLE CUnknown : public INonDelegatingUnknown, + public CBaseObject +{ +private: + const LPUNKNOWN m_pUnknown; /* Owner of this object */ + +protected: /* So we can override NonDelegatingRelease() */ + volatile LONG m_cRef; /* Number of reference counts */ + +public: + + CUnknown(__in_opt LPCTSTR pName, __in_opt LPUNKNOWN pUnk); + virtual ~CUnknown() {}; + + // This is redundant, just use the other constructor + // as we never touch the HRESULT in this anyway + CUnknown(__in_opt LPCTSTR Name, __in_opt LPUNKNOWN pUnk, __inout_opt HRESULT *phr); +#ifdef UNICODE + CUnknown(__in_opt LPCSTR pName, __in_opt LPUNKNOWN pUnk); + CUnknown(__in_opt LPCSTR pName, __in_opt LPUNKNOWN pUnk,__inout_opt HRESULT *phr); +#endif + + /* Return the owner of this object */ + + LPUNKNOWN GetOwner() const { + return m_pUnknown; + }; + + /* Called from the class factory to create a new instance, it is + pure virtual so it must be overriden in your derived class */ + + /* static CUnknown *CreateInstance(LPUNKNOWN, HRESULT *) */ + + /* Non delegating unknown implementation */ + + STDMETHODIMP NonDelegatingQueryInterface(REFIID, __deref_out void **); + STDMETHODIMP_(ULONG) NonDelegatingAddRef(); + STDMETHODIMP_(ULONG) NonDelegatingRelease(); +}; + +/* Return an interface pointer to a requesting client + performing a thread safe AddRef as necessary */ + +STDAPI GetInterface(LPUNKNOWN pUnk, __out void **ppv); + +/* A function that can create a new COM object */ + +typedef CUnknown *(CALLBACK *LPFNNewCOMObject)(__in_opt LPUNKNOWN pUnkOuter, __inout_opt HRESULT *phr); + +/* A function (can be NULL) which is called from the DLL entrypoint + routine for each factory template: + + bLoading - TRUE on DLL load, FALSE on DLL unload + rclsid - the m_ClsID of the entry +*/ +typedef void (CALLBACK *LPFNInitRoutine)(BOOL bLoading, const CLSID *rclsid); + +/* Create one of these per object class in an array so that + the default class factory code can create new instances */ + +class CFactoryTemplate { + +public: + + const WCHAR * m_Name; + const CLSID * m_ClsID; + LPFNNewCOMObject m_lpfnNew; + LPFNInitRoutine m_lpfnInit; + const AMOVIESETUP_FILTER * m_pAMovieSetup_Filter; + + BOOL IsClassID(REFCLSID rclsid) const { + return (IsEqualCLSID(*m_ClsID,rclsid)); + }; + + CUnknown *CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout_opt HRESULT *phr) const { + CheckPointer(phr,NULL); + return m_lpfnNew(pUnk, phr); + }; +}; + + +/* You must override the (pure virtual) NonDelegatingQueryInterface to return + interface pointers (using GetInterface) to the interfaces your derived + class supports (the default implementation only supports IUnknown) */ + +#define DECLARE_IUNKNOWN \ + STDMETHODIMP QueryInterface(REFIID riid, __deref_out void **ppv) { \ + return GetOwner()->QueryInterface(riid,ppv); \ + }; \ + STDMETHODIMP_(ULONG) AddRef() { \ + return GetOwner()->AddRef(); \ + }; \ + STDMETHODIMP_(ULONG) Release() { \ + return GetOwner()->Release(); \ + }; + + + +HINSTANCE LoadOLEAut32(); + + +#endif /* __COMBASE__ */ + + + +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/cprop.cpp
Added
@@ -0,0 +1,383 @@ +//------------------------------------------------------------------------------ +// File: CProp.cpp +// +// Desc: DirectShow base classes - implements CBasePropertyPage class. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> + +// Constructor for the base property page class. As described in the header +// file we must be initialised with dialog and title resource identifiers. +// The class supports IPropertyPage and overrides AddRef and Release calls +// to keep track of the reference counts. When the last count is released +// we call SetPageSite(NULL) and SetObjects(0,NULL) to release interfaces +// previously obtained by the property page when it had SetObjects called + +CBasePropertyPage::CBasePropertyPage(__in_opt LPCTSTR pName, // Debug only name + __inout_opt LPUNKNOWN pUnk, // COM Delegator + int DialogId, // Resource ID + int TitleId) : // To get tital + CUnknown(pName,pUnk), + m_DialogId(DialogId), + m_TitleId(TitleId), + m_hwnd(NULL), + m_Dlg(NULL), + m_pPageSite(NULL), + m_bObjectSet(FALSE), + m_bDirty(FALSE) +{ +} + +#ifdef UNICODE +CBasePropertyPage::CBasePropertyPage(__in_opt LPCSTR pName, // Debug only name + __inout_opt LPUNKNOWN pUnk, // COM Delegator + int DialogId, // Resource ID + int TitleId) : // To get tital + CUnknown(pName,pUnk), + m_DialogId(DialogId), + m_TitleId(TitleId), + m_hwnd(NULL), + m_Dlg(NULL), + m_pPageSite(NULL), + m_bObjectSet(FALSE), + m_bDirty(FALSE) +{ +} +#endif + +// Increment our reference count + +STDMETHODIMP_(ULONG) CBasePropertyPage::NonDelegatingAddRef() +{ + LONG lRef = InterlockedIncrement(&m_cRef); + ASSERT(lRef > 0); + return max(ULONG(m_cRef),1ul); +} + + +// Release a reference count and protect against reentrancy + +STDMETHODIMP_(ULONG) CBasePropertyPage::NonDelegatingRelease() +{ + // If the reference count drops to zero delete ourselves + + LONG lRef = InterlockedDecrement(&m_cRef); + if (lRef == 0) { + m_cRef++; + SetPageSite(NULL); + SetObjects(0,NULL); + delete this; + return ULONG(0); + } else { + // Don't touch m_cRef again here! + return max(ULONG(lRef),1ul); + } +} + + +// Expose our IPropertyPage interface + +STDMETHODIMP +CBasePropertyPage::NonDelegatingQueryInterface(REFIID riid,__deref_out void **ppv) +{ + if (riid == IID_IPropertyPage) { + return GetInterface((IPropertyPage *)this,ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid,ppv); + } +} + + +// Get the page info so that the page site can size itself + +STDMETHODIMP CBasePropertyPage::GetPageInfo(__out LPPROPPAGEINFO pPageInfo) +{ + CheckPointer(pPageInfo,E_POINTER); + WCHAR wszTitleSTR_MAX_LENGTH; + WideStringFromResource(wszTitle,m_TitleId); + + // Allocate dynamic memory for the property page title + + LPOLESTR pszTitle; + HRESULT hr = AMGetWideString(wszTitle, &pszTitle); + if (FAILED(hr)) { + NOTE("No caption memory"); + return hr; + } + + pPageInfo->cb = sizeof(PROPPAGEINFO); + pPageInfo->pszTitle = pszTitle; + pPageInfo->pszDocString = NULL; + pPageInfo->pszHelpFile = NULL; + pPageInfo->dwHelpContext = 0; + + // Set defaults in case GetDialogSize fails + pPageInfo->size.cx = 340; + pPageInfo->size.cy = 150; + + GetDialogSize(m_DialogId, DialogProc,0L,&pPageInfo->size); + return NOERROR; +} + + +// Handles the messages for our property window + +INT_PTR CALLBACK CBasePropertyPage::DialogProc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + CBasePropertyPage *pPropertyPage; + + switch (uMsg) { + + case WM_INITDIALOG: + + _SetWindowLongPtr(hwnd, DWLP_USER, lParam); + + // This pointer may be NULL when calculating size + + pPropertyPage = (CBasePropertyPage *) lParam; + if (pPropertyPage == NULL) { + return (LRESULT) 1; + } + pPropertyPage->m_Dlg = hwnd; + } + + // This pointer may be NULL when calculating size + + pPropertyPage = _GetWindowLongPtr<CBasePropertyPage*>(hwnd, DWLP_USER); + if (pPropertyPage == NULL) { + return (LRESULT) 1; + } + return pPropertyPage->OnReceiveMessage(hwnd,uMsg,wParam,lParam); +} + + +// Tells us the object that should be informed of the property changes + +STDMETHODIMP CBasePropertyPage::SetObjects(ULONG cObjects,__in_ecount_opt(cObjects) LPUNKNOWN *ppUnk) +{ + if (cObjects == 1) { + + if ((ppUnk == NULL) || (*ppUnk == NULL)) { + return E_POINTER; + } + + // Set a flag to say that we have set the Object + m_bObjectSet = TRUE ; + return OnConnect(*ppUnk); + + } else if (cObjects == 0) { + + // Set a flag to say that we have not set the Object for the page + m_bObjectSet = FALSE ; + return OnDisconnect(); + } + + DbgBreak("No support for more than one object"); + return E_UNEXPECTED; +} + + +// Create the window we will use to edit properties + +STDMETHODIMP CBasePropertyPage::Activate(HWND hwndParent, + LPCRECT pRect, + BOOL fModal) +{ + CheckPointer(pRect,E_POINTER); + + // Return failure if SetObject has not been called. + if (m_bObjectSet == FALSE) { + return E_UNEXPECTED; + } + + if (m_hwnd) { + return E_UNEXPECTED; + } + + m_hwnd = CreateDialogParam(g_hInst, + MAKEINTRESOURCE(m_DialogId), + hwndParent, + DialogProc, + (LPARAM) this); + if (m_hwnd == NULL) { + return E_OUTOFMEMORY; + } + + OnActivate(); + Move(pRect); + return Show(SW_SHOWNORMAL); +} + + +// Set the position of the property page + +STDMETHODIMP CBasePropertyPage::Move(LPCRECT pRect) +{ + CheckPointer(pRect,E_POINTER); + + if (m_hwnd == NULL) { + return E_UNEXPECTED; + } + + MoveWindow(m_hwnd, // Property page handle + pRect->left, // x coordinate + pRect->top, // y coordinate + WIDTH(pRect), // Overall window width + HEIGHT(pRect), // And likewise height + TRUE); // Should we repaint it + + return NOERROR; +} + + +// Display the property dialog + +STDMETHODIMP CBasePropertyPage::Show(UINT nCmdShow) +{ + // Have we been activated yet + + if (m_hwnd == NULL) { + return E_UNEXPECTED; + } + + // Ignore wrong show flags + + if ((nCmdShow != SW_SHOW) && (nCmdShow != SW_SHOWNORMAL) && (nCmdShow != SW_HIDE)) { + return E_INVALIDARG; + } + + ShowWindow(m_hwnd,nCmdShow); + InvalidateRect(m_hwnd,NULL,TRUE); + return NOERROR; +} + + +// Destroy the property page dialog + +STDMETHODIMP CBasePropertyPage::Deactivate(void) +{ + if (m_hwnd == NULL) { + return E_UNEXPECTED; + } + + // Remove WS_EX_CONTROLPARENT before DestroyWindow call + + DWORD dwStyle = GetWindowLong(m_hwnd, GWL_EXSTYLE); + dwStyle = dwStyle & (~WS_EX_CONTROLPARENT); + + // Set m_hwnd to be NULL temporarily so the message handler + // for WM_STYLECHANGING doesn't add the WS_EX_CONTROLPARENT + // style back in + HWND hwnd = m_hwnd; + m_hwnd = NULL; + SetWindowLong(hwnd, GWL_EXSTYLE, dwStyle); + m_hwnd = hwnd; + + OnDeactivate(); + + // Destroy the dialog window + + DestroyWindow(m_hwnd); + m_hwnd = NULL; + return NOERROR; +} + + +// Tells the application property page site + +STDMETHODIMP CBasePropertyPage::SetPageSite(__in_opt LPPROPERTYPAGESITE pPageSite) +{ + if (pPageSite) { + + if (m_pPageSite) { + return E_UNEXPECTED; + } + + m_pPageSite = pPageSite; + m_pPageSite->AddRef(); + + } else { + + if (m_pPageSite == NULL) { + return E_UNEXPECTED; + } + + m_pPageSite->Release(); + m_pPageSite = NULL; + } + return NOERROR; +} + + +// Apply any changes so far made + +STDMETHODIMP CBasePropertyPage::Apply() +{ + // In ActiveMovie 1.0 we used to check whether we had been activated or + // not. This is too constrictive. Apply should be allowed as long as + // SetObject was called to set an object. So we will no longer check to + // see if we have been activated (ie., m_hWnd != NULL), but instead + // make sure that m_bObjectSet is TRUE (ie., SetObject has been called). + + if (m_bObjectSet == FALSE) { + return E_UNEXPECTED; + } + + // Must have had a site set + + if (m_pPageSite == NULL) { + return E_UNEXPECTED; + } + + // Has anything changed + + if (m_bDirty == FALSE) { + return NOERROR; + } + + // Commit derived class changes + + HRESULT hr = OnApplyChanges(); + if (SUCCEEDED(hr)) { + m_bDirty = FALSE; + } + return hr; +} + + +// Base class definition for message handling + +INT_PTR CBasePropertyPage::OnReceiveMessage(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) +{ + // we would like the TAB key to move around the tab stops in our property + // page, but for some reason OleCreatePropertyFrame clears the CONTROLPARENT + // style behind our back, so we need to switch it back on now behind its + // back. Otherwise the tab key will be useless in every page. + // + + CBasePropertyPage *pPropertyPage; + { + pPropertyPage = _GetWindowLongPtr<CBasePropertyPage*>(hwnd, DWLP_USER); + + if (pPropertyPage->m_hwnd == NULL) { + return 0; + } + switch (uMsg) { + case WM_STYLECHANGING: + if (wParam == GWL_EXSTYLE) { + LPSTYLESTRUCT lpss = (LPSTYLESTRUCT)lParam; + lpss->styleNew |= WS_EX_CONTROLPARENT; + return 0; + } + } + } + + return DefWindowProc(hwnd,uMsg,wParam,lParam); +} +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/cprop.h
Added
@@ -0,0 +1,95 @@ +//------------------------------------------------------------------------------ +// File: CProp.h +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __CPROP__ +#define __CPROP__ + +// Base property page class. Filters typically expose custom properties by +// implementing special control interfaces, examples are IDirectDrawVideo +// and IQualProp on renderers. This allows property pages to be built that +// use the given interface. Applications such as the ActiveMovie OCX query +// filters for the property pages they support and expose them to the user +// +// This class provides all the framework for a property page. A property +// page is a COM object that supports IPropertyPage. We should be created +// with a resource ID for the dialog which we will load when required. We +// should also be given in the constructor a resource ID for a title string +// we will load from the DLLs STRINGTABLE. The property page titles must be +// stored in resource files so that they can be easily internationalised +// +// We have a number of virtual methods (not PURE) that may be overriden in +// derived classes to query for interfaces and so on. These functions have +// simple implementations here that just return NOERROR. Derived classes +// will almost definately have to override the message handler method called +// OnReceiveMessage. We have a static dialog procedure that calls the method +// so that derived classes don't have to fiddle around with the this pointer + +class AM_NOVTABLE CBasePropertyPage : public IPropertyPage, public CUnknown +{ +protected: + + LPPROPERTYPAGESITE m_pPageSite; // Details for our property site + HWND m_hwnd; // Window handle for the page + HWND m_Dlg; // Actual dialog window handle + BOOL m_bDirty; // Has anything been changed + int m_TitleId; // Resource identifier for title + int m_DialogId; // Dialog resource identifier + + static INT_PTR CALLBACK DialogProc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +private: + BOOL m_bObjectSet ; // SetObject has been called or not. +public: + + CBasePropertyPage(__in_opt LPCTSTR pName, // Debug only name + __inout_opt LPUNKNOWN pUnk, // COM Delegator + int DialogId, // Resource ID + int TitleId); // To get tital + +#ifdef UNICODE + CBasePropertyPage(__in_opt LPCSTR pName, + __inout_opt LPUNKNOWN pUnk, + int DialogId, + int TitleId); +#endif + virtual ~CBasePropertyPage() { }; + DECLARE_IUNKNOWN + + // Override these virtual methods + + virtual HRESULT OnConnect(IUnknown *pUnknown) { return NOERROR; }; + virtual HRESULT OnDisconnect() { return NOERROR; }; + virtual HRESULT OnActivate() { return NOERROR; }; + virtual HRESULT OnDeactivate() { return NOERROR; }; + virtual HRESULT OnApplyChanges() { return NOERROR; }; + virtual INT_PTR OnReceiveMessage(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); + + // These implement an IPropertyPage interface + + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv); + STDMETHODIMP_(ULONG) NonDelegatingRelease(); + STDMETHODIMP_(ULONG) NonDelegatingAddRef(); + STDMETHODIMP SetPageSite(__in_opt LPPROPERTYPAGESITE pPageSite); + STDMETHODIMP Activate(HWND hwndParent, LPCRECT prect,BOOL fModal); + STDMETHODIMP Deactivate(void); + STDMETHODIMP GetPageInfo(__out LPPROPPAGEINFO pPageInfo); + STDMETHODIMP SetObjects(ULONG cObjects, __in_ecount_opt(cObjects) LPUNKNOWN *ppUnk); + STDMETHODIMP Show(UINT nCmdShow); + STDMETHODIMP Move(LPCRECT prect); + STDMETHODIMP IsPageDirty(void) { return m_bDirty ? S_OK : S_FALSE; } + STDMETHODIMP Apply(void); + STDMETHODIMP Help(LPCWSTR lpszHelpDir) { return E_NOTIMPL; } + STDMETHODIMP TranslateAccelerator(__inout LPMSG lpMsg) { return E_NOTIMPL; } +}; + +#endif // __CPROP__ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/ctlutil.cpp
Added
@@ -0,0 +1,2541 @@ +//------------------------------------------------------------------------------ +// File: CtlUtil.cpp +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// Base classes implementing IDispatch parsing for the basic control dual +// interfaces. Derive from these and implement just the custom method and +// property methods. We also implement CPosPassThru that can be used by +// renderers and transforms to pass by IMediaPosition and IMediaSeeking + + +#include <streams.h> +#include <limits.h> +#include "seekpt.h" + +// 'bool' non standard reserved word +#pragma warning(disable:4237) + + +// --- CBaseDispatch implementation ---------- +CBaseDispatch::~CBaseDispatch() +{ + if (m_pti) { + m_pti->Release(); + } +} + + +// return 1 if we support GetTypeInfo + +STDMETHODIMP +CBaseDispatch::GetTypeInfoCount(__out UINT * pctinfo) +{ + CheckPointer(pctinfo,E_POINTER); + ValidateReadWritePtr(pctinfo,sizeof(UINT *)); + *pctinfo = 1; + return S_OK; +} + + +typedef HRESULT (STDAPICALLTYPE *LPLOADTYPELIB)( + const OLECHAR FAR *szFile, + __deref_out ITypeLib FAR* FAR* pptlib); + +typedef HRESULT (STDAPICALLTYPE *LPLOADREGTYPELIB)(REFGUID rguid, + WORD wVerMajor, + WORD wVerMinor, + LCID lcid, + __deref_out ITypeLib FAR* FAR* pptlib); + +// attempt to find our type library + +STDMETHODIMP +CBaseDispatch::GetTypeInfo( + REFIID riid, + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo) +{ + CheckPointer(pptinfo,E_POINTER); + ValidateReadWritePtr(pptinfo,sizeof(ITypeInfo *)); + HRESULT hr; + + *pptinfo = NULL; + + // we only support one type element + if (0 != itinfo) { + return TYPE_E_ELEMENTNOTFOUND; + } + + if (NULL == pptinfo) { + return E_POINTER; + } + + // always look for neutral + if (NULL == m_pti) { + + LPLOADTYPELIB lpfnLoadTypeLib; + LPLOADREGTYPELIB lpfnLoadRegTypeLib; + ITypeLib *ptlib; + HINSTANCE hInst; + + static const char szTypeLib = "LoadTypeLib"; + static const char szRegTypeLib = "LoadRegTypeLib"; + static const WCHAR szControl = L"control.tlb"; + + // + // Try to get the Ole32Aut.dll module handle. + // + + hInst = LoadOLEAut32(); + if (hInst == NULL) { + DWORD dwError = GetLastError(); + return AmHresultFromWin32(dwError); + } + lpfnLoadRegTypeLib = (LPLOADREGTYPELIB)GetProcAddress(hInst, + szRegTypeLib); + if (lpfnLoadRegTypeLib == NULL) { + DWORD dwError = GetLastError(); + return AmHresultFromWin32(dwError); + } + + hr = (*lpfnLoadRegTypeLib)(LIBID_QuartzTypeLib, 1, 0, // version 1.0 + lcid, &ptlib); + + if (FAILED(hr)) { + + // attempt to load directly - this will fill the + // registry in if it finds it + + lpfnLoadTypeLib = (LPLOADTYPELIB)GetProcAddress(hInst, szTypeLib); + if (lpfnLoadTypeLib == NULL) { + DWORD dwError = GetLastError(); + return AmHresultFromWin32(dwError); + } + + hr = (*lpfnLoadTypeLib)(szControl, &ptlib); + if (FAILED(hr)) { + return hr; + } + } + + hr = ptlib->GetTypeInfoOfGuid( + riid, + &m_pti); + + ptlib->Release(); + + if (FAILED(hr)) { + return hr; + } + } + + *pptinfo = m_pti; + m_pti->AddRef(); + return S_OK; +} + + +STDMETHODIMP +CBaseDispatch::GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid) +{ + // although the IDispatch riid is dead, we use this to pass from + // the interface implementation class to us the iid we are talking about. + + ITypeInfo * pti; + HRESULT hr = GetTypeInfo(riid, 0, lcid, &pti); + + if (SUCCEEDED(hr)) { + hr = pti->GetIDsOfNames(rgszNames, cNames, rgdispid); + + pti->Release(); + } + return hr; +} + + +// --- CMediaControl implementation --------- + +CMediaControl::CMediaControl(const TCHAR * name,LPUNKNOWN pUnk) : + CUnknown(name, pUnk) +{ +} + +// expose our interfaces IMediaControl and IUnknown + +STDMETHODIMP +CMediaControl::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + ValidateReadWritePtr(ppv,sizeof(PVOID)); + if (riid == IID_IMediaControl) { + return GetInterface( (IMediaControl *) this, ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } +} + + +// return 1 if we support GetTypeInfo + +STDMETHODIMP +CMediaControl::GetTypeInfoCount(__out UINT * pctinfo) +{ + return m_basedisp.GetTypeInfoCount(pctinfo); +} + + +// attempt to find our type library + +STDMETHODIMP +CMediaControl::GetTypeInfo( + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo) +{ + return m_basedisp.GetTypeInfo( + IID_IMediaControl, + itinfo, + lcid, + pptinfo); +} + + +STDMETHODIMP +CMediaControl::GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid) +{ + return m_basedisp.GetIDsOfNames( + IID_IMediaControl, + rgszNames, + cNames, + lcid, + rgdispid); +} + + +STDMETHODIMP +CMediaControl::Invoke( + DISPID dispidMember, + REFIID riid, + LCID lcid, + WORD wFlags, + __in DISPPARAMS * pdispparams, + __out_opt VARIANT * pvarResult, + __out_opt EXCEPINFO * pexcepinfo, + __out_opt UINT * puArgErr) +{ + // this parameter is a dead leftover from an earlier interface + if (IID_NULL != riid) { + return DISP_E_UNKNOWNINTERFACE; + } + + ITypeInfo * pti; + HRESULT hr = GetTypeInfo(0, lcid, &pti); + + if (FAILED(hr)) { + return hr; + } + + hr = pti->Invoke( + (IMediaControl *)this, + dispidMember, + wFlags, + pdispparams, + pvarResult, + pexcepinfo, + puArgErr); + + pti->Release(); + return hr; +} + + +// --- CMediaEvent implementation ---------- + + +CMediaEvent::CMediaEvent(__in_opt LPCTSTR name,__in_opt LPUNKNOWN pUnk) : + CUnknown(name, pUnk) +{ +} + + +// expose our interfaces IMediaEvent and IUnknown + +STDMETHODIMP +CMediaEvent::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + ValidateReadWritePtr(ppv,sizeof(PVOID)); + if (riid == IID_IMediaEvent || riid == IID_IMediaEventEx) { + return GetInterface( (IMediaEventEx *) this, ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } +} + + +// return 1 if we support GetTypeInfo + +STDMETHODIMP +CMediaEvent::GetTypeInfoCount(__out UINT * pctinfo) +{ + return m_basedisp.GetTypeInfoCount(pctinfo); +} + + +// attempt to find our type library + +STDMETHODIMP +CMediaEvent::GetTypeInfo( + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo) +{ + return m_basedisp.GetTypeInfo( + IID_IMediaEvent, + itinfo, + lcid, + pptinfo); +} + + +STDMETHODIMP +CMediaEvent::GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid) +{ + return m_basedisp.GetIDsOfNames( + IID_IMediaEvent, + rgszNames, + cNames, + lcid, + rgdispid); +} + + +STDMETHODIMP +CMediaEvent::Invoke( + DISPID dispidMember, + REFIID riid, + LCID lcid, + WORD wFlags, + __in DISPPARAMS * pdispparams, + __out_opt VARIANT * pvarResult, + __out_opt EXCEPINFO * pexcepinfo, + __out_opt UINT * puArgErr) +{ + // this parameter is a dead leftover from an earlier interface + if (IID_NULL != riid) { + return DISP_E_UNKNOWNINTERFACE; + } + + ITypeInfo * pti; + HRESULT hr = GetTypeInfo(0, lcid, &pti); + + if (FAILED(hr)) { + return hr; + } + + hr = pti->Invoke( + (IMediaEvent *)this, + dispidMember, + wFlags, + pdispparams, + pvarResult, + pexcepinfo, + puArgErr); + + pti->Release(); + return hr; +} + + +// --- CMediaPosition implementation ---------- + + +CMediaPosition::CMediaPosition(__in_opt LPCTSTR name,__in_opt LPUNKNOWN pUnk) : + CUnknown(name, pUnk) +{ +} + +CMediaPosition::CMediaPosition(__in_opt LPCTSTR name, + __in_opt LPUNKNOWN pUnk, + __inout HRESULT * phr) : + CUnknown(name, pUnk) +{ + UNREFERENCED_PARAMETER(phr); +} + + +// expose our interfaces IMediaPosition and IUnknown + +STDMETHODIMP +CMediaPosition::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + ValidateReadWritePtr(ppv,sizeof(PVOID)); + if (riid == IID_IMediaPosition) { + return GetInterface( (IMediaPosition *) this, ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } +} + + +// return 1 if we support GetTypeInfo + +STDMETHODIMP +CMediaPosition::GetTypeInfoCount(__out UINT * pctinfo) +{ + return m_basedisp.GetTypeInfoCount(pctinfo); +} + + +// attempt to find our type library + +STDMETHODIMP +CMediaPosition::GetTypeInfo( + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo) +{ + return m_basedisp.GetTypeInfo( + IID_IMediaPosition, + itinfo, + lcid, + pptinfo); +} + + +STDMETHODIMP +CMediaPosition::GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid) +{ + return m_basedisp.GetIDsOfNames( + IID_IMediaPosition, + rgszNames, + cNames, + lcid, + rgdispid); +} + + +STDMETHODIMP +CMediaPosition::Invoke( + DISPID dispidMember, + REFIID riid, + LCID lcid, + WORD wFlags, + __in DISPPARAMS * pdispparams, + __out_opt VARIANT * pvarResult, + __out_opt EXCEPINFO * pexcepinfo, + __out_opt UINT * puArgErr) +{ + // this parameter is a dead leftover from an earlier interface + if (IID_NULL != riid) { + return DISP_E_UNKNOWNINTERFACE; + } + + ITypeInfo * pti; + HRESULT hr = GetTypeInfo(0, lcid, &pti); + + if (FAILED(hr)) { + return hr; + } + + hr = pti->Invoke( + (IMediaPosition *)this, + dispidMember, + wFlags, + pdispparams, + pvarResult, + pexcepinfo, + puArgErr); + + pti->Release(); + return hr; +} + + +// --- IMediaPosition and IMediaSeeking pass through class ---------- + + +CPosPassThru::CPosPassThru(__in_opt LPCTSTR pName, + __in_opt LPUNKNOWN pUnk, + __inout HRESULT *phr, + IPin *pPin) : + CMediaPosition(pName,pUnk), + m_pPin(pPin) +{ + if (pPin == NULL) { + *phr = E_POINTER; + return; + } +} + + +// Expose our IMediaSeeking and IMediaPosition interfaces + +STDMETHODIMP +CPosPassThru::NonDelegatingQueryInterface(REFIID riid,__deref_out void **ppv) +{ + CheckPointer(ppv,E_POINTER); + *ppv = NULL; + + if (riid == IID_IMediaSeeking) { + return GetInterface( static_cast<IMediaSeeking *>(this), ppv); + } + return CMediaPosition::NonDelegatingQueryInterface(riid,ppv); +} + + +// Return the IMediaPosition interface from our peer + +HRESULT +CPosPassThru::GetPeer(IMediaPosition ** ppMP) +{ + *ppMP = NULL; + + IPin *pConnected; + HRESULT hr = m_pPin->ConnectedTo(&pConnected); + if (FAILED(hr)) { + return E_NOTIMPL; + } + IMediaPosition * pMP; + hr = pConnected->QueryInterface(IID_IMediaPosition, (void **) &pMP); + pConnected->Release(); + if (FAILED(hr)) { + return E_NOTIMPL; + } + + *ppMP = pMP; + return S_OK; +} + + +// Return the IMediaSeeking interface from our peer + +HRESULT +CPosPassThru::GetPeerSeeking(__deref_out IMediaSeeking ** ppMS) +{ + *ppMS = NULL; + + IPin *pConnected; + HRESULT hr = m_pPin->ConnectedTo(&pConnected); + if (FAILED(hr)) { + return E_NOTIMPL; + } + IMediaSeeking * pMS; + hr = pConnected->QueryInterface(IID_IMediaSeeking, (void **) &pMS); + pConnected->Release(); + if (FAILED(hr)) { + return E_NOTIMPL; + } + + *ppMS = pMS; + return S_OK; +} + + +// --- IMediaSeeking methods ---------- + + +STDMETHODIMP +CPosPassThru::GetCapabilities(__out DWORD * pCaps) +{ + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (FAILED(hr)) { + return hr; + } + + hr = pMS->GetCapabilities(pCaps); + pMS->Release(); + return hr; +} + +STDMETHODIMP +CPosPassThru::CheckCapabilities(__inout DWORD * pCaps) +{ + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (FAILED(hr)) { + return hr; + } + + hr = pMS->CheckCapabilities(pCaps); + pMS->Release(); + return hr; +} + +STDMETHODIMP +CPosPassThru::IsFormatSupported(const GUID * pFormat) +{ + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (FAILED(hr)) { + return hr; + } + + hr = pMS->IsFormatSupported(pFormat); + pMS->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::QueryPreferredFormat(__out GUID *pFormat) +{ + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (FAILED(hr)) { + return hr; + } + + hr = pMS->QueryPreferredFormat(pFormat); + pMS->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::SetTimeFormat(const GUID * pFormat) +{ + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (FAILED(hr)) { + return hr; + } + + hr = pMS->SetTimeFormat(pFormat); + pMS->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::GetTimeFormat(__out GUID *pFormat) +{ + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (FAILED(hr)) { + return hr; + } + + hr = pMS->GetTimeFormat(pFormat); + pMS->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::IsUsingTimeFormat(const GUID * pFormat) +{ + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (FAILED(hr)) { + return hr; + } + + hr = pMS->IsUsingTimeFormat(pFormat); + pMS->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::ConvertTimeFormat(__out LONGLONG * pTarget, + __in_opt const GUID * pTargetFormat, + LONGLONG Source, + __in_opt const GUID * pSourceFormat ) +{ + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (FAILED(hr)) { + return hr; + } + + hr = pMS->ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat ); + pMS->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::SetPositions( __inout_opt LONGLONG * pCurrent, + DWORD CurrentFlags, + __inout_opt LONGLONG * pStop, + DWORD StopFlags ) +{ + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (FAILED(hr)) { + return hr; + } + + hr = pMS->SetPositions(pCurrent, CurrentFlags, pStop, StopFlags ); + pMS->Release(); + return hr; +} + +STDMETHODIMP +CPosPassThru::GetPositions(__out_opt LONGLONG *pCurrent, __out_opt LONGLONG * pStop) +{ + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (FAILED(hr)) { + return hr; + } + + hr = pMS->GetPositions(pCurrent,pStop); + pMS->Release(); + return hr; +} + +HRESULT +CPosPassThru::GetSeekingLongLong +( HRESULT (__stdcall IMediaSeeking::*pMethod)( __out LONGLONG * ) +, LONGLONG * pll +) +{ + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (SUCCEEDED(hr)) + { + hr = (pMS->*pMethod)(pll); + pMS->Release(); + } + return hr; +} + +// If we don't have a current position then ask upstream + +STDMETHODIMP +CPosPassThru::GetCurrentPosition(__out LONGLONG *pCurrent) +{ + // Can we report the current position + HRESULT hr = GetMediaTime(pCurrent,NULL); + if (SUCCEEDED(hr)) hr = NOERROR; + else hr = GetSeekingLongLong( &IMediaSeeking::GetCurrentPosition, pCurrent ); + return hr; +} + + +STDMETHODIMP +CPosPassThru::GetStopPosition(__out LONGLONG *pStop) +{ + return GetSeekingLongLong( &IMediaSeeking::GetStopPosition, pStop );; +} + +STDMETHODIMP +CPosPassThru::GetDuration(__out LONGLONG *pDuration) +{ + return GetSeekingLongLong( &IMediaSeeking::GetDuration, pDuration );; +} + + +STDMETHODIMP +CPosPassThru::GetPreroll(__out LONGLONG *pllPreroll) +{ + return GetSeekingLongLong( &IMediaSeeking::GetPreroll, pllPreroll );; +} + + +STDMETHODIMP +CPosPassThru::GetAvailable( __out_opt LONGLONG *pEarliest, __out_opt LONGLONG *pLatest ) +{ + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (FAILED(hr)) { + return hr; + } + + hr = pMS->GetAvailable( pEarliest, pLatest ); + pMS->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::GetRate(__out double * pdRate) +{ + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (FAILED(hr)) { + return hr; + } + hr = pMS->GetRate(pdRate); + pMS->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::SetRate(double dRate) +{ + if (0.0 == dRate) { + return E_INVALIDARG; + } + + IMediaSeeking* pMS; + HRESULT hr = GetPeerSeeking(&pMS); + if (FAILED(hr)) { + return hr; + } + hr = pMS->SetRate(dRate); + pMS->Release(); + return hr; +} + + + + +// --- IMediaPosition methods ---------- + + +STDMETHODIMP +CPosPassThru::get_Duration(__out REFTIME * plength) +{ + IMediaPosition* pMP; + HRESULT hr = GetPeer(&pMP); + if (FAILED(hr)) { + return hr; + } + + hr = pMP->get_Duration(plength); + pMP->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::get_CurrentPosition(__out REFTIME * pllTime) +{ + IMediaPosition* pMP; + HRESULT hr = GetPeer(&pMP); + if (FAILED(hr)) { + return hr; + } + hr = pMP->get_CurrentPosition(pllTime); + pMP->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::put_CurrentPosition(REFTIME llTime) +{ + IMediaPosition* pMP; + HRESULT hr = GetPeer(&pMP); + if (FAILED(hr)) { + return hr; + } + hr = pMP->put_CurrentPosition(llTime); + pMP->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::get_StopTime(__out REFTIME * pllTime) +{ + IMediaPosition* pMP; + HRESULT hr = GetPeer(&pMP); + if (FAILED(hr)) { + return hr; + } + hr = pMP->get_StopTime(pllTime); + pMP->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::put_StopTime(REFTIME llTime) +{ + IMediaPosition* pMP; + HRESULT hr = GetPeer(&pMP); + if (FAILED(hr)) { + return hr; + } + hr = pMP->put_StopTime(llTime); + pMP->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::get_PrerollTime(__out REFTIME * pllTime) +{ + IMediaPosition* pMP; + HRESULT hr = GetPeer(&pMP); + if (FAILED(hr)) { + return hr; + } + hr = pMP->get_PrerollTime(pllTime); + pMP->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::put_PrerollTime(REFTIME llTime) +{ + IMediaPosition* pMP; + HRESULT hr = GetPeer(&pMP); + if (FAILED(hr)) { + return hr; + } + hr = pMP->put_PrerollTime(llTime); + pMP->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::get_Rate(__out double * pdRate) +{ + IMediaPosition* pMP; + HRESULT hr = GetPeer(&pMP); + if (FAILED(hr)) { + return hr; + } + hr = pMP->get_Rate(pdRate); + pMP->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::put_Rate(double dRate) +{ + if (0.0 == dRate) { + return E_INVALIDARG; + } + + IMediaPosition* pMP; + HRESULT hr = GetPeer(&pMP); + if (FAILED(hr)) { + return hr; + } + hr = pMP->put_Rate(dRate); + pMP->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::CanSeekForward(__out LONG *pCanSeekForward) +{ + IMediaPosition* pMP; + HRESULT hr = GetPeer(&pMP); + if (FAILED(hr)) { + return hr; + } + hr = pMP->CanSeekForward(pCanSeekForward); + pMP->Release(); + return hr; +} + + +STDMETHODIMP +CPosPassThru::CanSeekBackward(__out LONG *pCanSeekBackward) +{ + IMediaPosition* pMP; + HRESULT hr = GetPeer(&pMP); + if (FAILED(hr)) { + return hr; + } + hr = pMP->CanSeekBackward(pCanSeekBackward); + pMP->Release(); + return hr; +} + + +// --- Implements the CRendererPosPassThru class ---------- + + +// Media times (eg current frame, field, sample etc) are passed through the +// filtergraph in media samples. When a renderer gets a sample with media +// times in it, it will call one of the RegisterMediaTime methods we expose +// (one takes an IMediaSample, the other takes the media times direct). We +// store the media times internally and return them in GetCurrentPosition. + +CRendererPosPassThru::CRendererPosPassThru(__in_opt LPCTSTR pName, + __in_opt LPUNKNOWN pUnk, + __inout HRESULT *phr, + IPin *pPin) : + CPosPassThru(pName,pUnk,phr,pPin), + m_StartMedia(0), + m_EndMedia(0), + m_bReset(TRUE) +{ +} + + +// Sets the media times the object should report + +HRESULT +CRendererPosPassThru::RegisterMediaTime(IMediaSample *pMediaSample) +{ + ASSERT(pMediaSample); + LONGLONG StartMedia; + LONGLONG EndMedia; + + CAutoLock cAutoLock(&m_PositionLock); + + // Get the media times from the sample + + HRESULT hr = pMediaSample->GetTime(&StartMedia,&EndMedia); + if (FAILED(hr)) + { + ASSERT(hr == VFW_E_SAMPLE_TIME_NOT_SET); + return hr; + } + + m_StartMedia = StartMedia; + m_EndMedia = EndMedia; + m_bReset = FALSE; + return NOERROR; +} + + +// Sets the media times the object should report + +HRESULT +CRendererPosPassThru::RegisterMediaTime(LONGLONG StartTime,LONGLONG EndTime) +{ + CAutoLock cAutoLock(&m_PositionLock); + m_StartMedia = StartTime; + m_EndMedia = EndTime; + m_bReset = FALSE; + return NOERROR; +} + + +// Return the current media times registered in the object + +HRESULT +CRendererPosPassThru::GetMediaTime(__out LONGLONG *pStartTime, __out_opt LONGLONG *pEndTime) +{ + ASSERT(pStartTime); + + CAutoLock cAutoLock(&m_PositionLock); + if (m_bReset == TRUE) { + return E_FAIL; + } + + // We don't have to return the end time + + HRESULT hr = ConvertTimeFormat( pStartTime, 0, m_StartMedia, &TIME_FORMAT_MEDIA_TIME ); + if (pEndTime && SUCCEEDED(hr)) { + hr = ConvertTimeFormat( pEndTime, 0, m_EndMedia, &TIME_FORMAT_MEDIA_TIME ); + } + return hr; +} + + +// Resets the media times we hold + +HRESULT +CRendererPosPassThru::ResetMediaTime() +{ + CAutoLock cAutoLock(&m_PositionLock); + m_StartMedia = 0; + m_EndMedia = 0; + m_bReset = TRUE; + return NOERROR; +} + +// Intended to be called by the owing filter during EOS processing so +// that the media times can be adjusted to the stop time. This ensures +// that the GetCurrentPosition will actully get to the stop position. +HRESULT +CRendererPosPassThru::EOS() +{ + HRESULT hr; + + if ( m_bReset == TRUE ) hr = E_FAIL; + else + { + LONGLONG llStop; + if SUCCEEDED(hr=GetStopPosition(&llStop)) + { + CAutoLock cAutoLock(&m_PositionLock); + m_StartMedia = + m_EndMedia = llStop; + } + } + return hr; +} + +// -- CSourceSeeking implementation ------------ + +CSourceSeeking::CSourceSeeking( + __in_opt LPCTSTR pName, + __in_opt LPUNKNOWN pUnk, + __inout HRESULT* phr, + __in CCritSec * pLock) : + CUnknown(pName, pUnk), + m_pLock(pLock), + m_rtStart((long)0) +{ + m_rtStop = _I64_MAX / 2; + m_rtDuration = m_rtStop; + m_dRateSeeking = 1.0; + + m_dwSeekingCaps = AM_SEEKING_CanSeekForwards + | AM_SEEKING_CanSeekBackwards + | AM_SEEKING_CanSeekAbsolute + | AM_SEEKING_CanGetStopPos + | AM_SEEKING_CanGetDuration; +} + +HRESULT CSourceSeeking::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + if(riid == IID_IMediaSeeking) { + CheckPointer(ppv, E_POINTER); + return GetInterface(static_cast<IMediaSeeking *>(this), ppv); + } + else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } +} + + +HRESULT CSourceSeeking::IsFormatSupported(const GUID * pFormat) +{ + CheckPointer(pFormat, E_POINTER); + // only seeking in time (REFERENCE_TIME units) is supported + return *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : S_FALSE; +} + +HRESULT CSourceSeeking::QueryPreferredFormat(__out GUID *pFormat) +{ + CheckPointer(pFormat, E_POINTER); + *pFormat = TIME_FORMAT_MEDIA_TIME; + return S_OK; +} + +HRESULT CSourceSeeking::SetTimeFormat(const GUID * pFormat) +{ + CheckPointer(pFormat, E_POINTER); + + // nothing to set; just check that it's TIME_FORMAT_TIME + return *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : E_INVALIDARG; +} + +HRESULT CSourceSeeking::IsUsingTimeFormat(const GUID * pFormat) +{ + CheckPointer(pFormat, E_POINTER); + return *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : S_FALSE; +} + +HRESULT CSourceSeeking::GetTimeFormat(__out GUID *pFormat) +{ + CheckPointer(pFormat, E_POINTER); + *pFormat = TIME_FORMAT_MEDIA_TIME; + return S_OK; +} + +HRESULT CSourceSeeking::GetDuration(__out LONGLONG *pDuration) +{ + CheckPointer(pDuration, E_POINTER); + CAutoLock lock(m_pLock); + *pDuration = m_rtDuration; + return S_OK; +} + +HRESULT CSourceSeeking::GetStopPosition(__out LONGLONG *pStop) +{ + CheckPointer(pStop, E_POINTER); + CAutoLock lock(m_pLock); + *pStop = m_rtStop; + return S_OK; +} + +HRESULT CSourceSeeking::GetCurrentPosition(__out LONGLONG *pCurrent) +{ + // GetCurrentPosition is typically supported only in renderers and + // not in source filters. + return E_NOTIMPL; +} + +HRESULT CSourceSeeking::GetCapabilities( __out DWORD * pCapabilities ) +{ + CheckPointer(pCapabilities, E_POINTER); + *pCapabilities = m_dwSeekingCaps; + return S_OK; +} + +HRESULT CSourceSeeking::CheckCapabilities( __inout DWORD * pCapabilities ) +{ + CheckPointer(pCapabilities, E_POINTER); + + // make sure all requested capabilities are in our mask + return (~m_dwSeekingCaps & *pCapabilities) ? S_FALSE : S_OK; +} + +HRESULT CSourceSeeking::ConvertTimeFormat( __out LONGLONG * pTarget, + __in_opt const GUID * pTargetFormat, + LONGLONG Source, + __in_opt const GUID * pSourceFormat ) +{ + CheckPointer(pTarget, E_POINTER); + // format guids can be null to indicate current format + + // since we only support TIME_FORMAT_MEDIA_TIME, we don't really + // offer any conversions. + if(pTargetFormat == 0 || *pTargetFormat == TIME_FORMAT_MEDIA_TIME) + { + if(pSourceFormat == 0 || *pSourceFormat == TIME_FORMAT_MEDIA_TIME) + { + *pTarget = Source; + return S_OK; + } + } + + return E_INVALIDARG; +} + + +HRESULT CSourceSeeking::SetPositions( __inout_opt LONGLONG * pCurrent, + DWORD CurrentFlags, + __inout_opt LONGLONG * pStop, + DWORD StopFlags ) +{ + DWORD StopPosBits = StopFlags & AM_SEEKING_PositioningBitsMask; + DWORD StartPosBits = CurrentFlags & AM_SEEKING_PositioningBitsMask; + + if(StopFlags) { + CheckPointer(pStop, E_POINTER); + + // accept only relative, incremental, or absolute positioning + if(StopPosBits != StopFlags) { + return E_INVALIDARG; + } + } + + if(CurrentFlags) { + CheckPointer(pCurrent, E_POINTER); + if(StartPosBits != AM_SEEKING_AbsolutePositioning && + StartPosBits != AM_SEEKING_RelativePositioning) { + return E_INVALIDARG; + } + } + + + // scope for autolock + { + CAutoLock lock(m_pLock); + + // set start position + if(StartPosBits == AM_SEEKING_AbsolutePositioning) + { + m_rtStart = *pCurrent; + } + else if(StartPosBits == AM_SEEKING_RelativePositioning) + { + m_rtStart += *pCurrent; + } + + // set stop position + if(StopPosBits == AM_SEEKING_AbsolutePositioning) + { + m_rtStop = *pStop; + } + else if(StopPosBits == AM_SEEKING_IncrementalPositioning) + { + m_rtStop = m_rtStart + *pStop; + } + else if(StopPosBits == AM_SEEKING_RelativePositioning) + { + m_rtStop = m_rtStop + *pStop; + } + } + + + HRESULT hr = S_OK; + if(SUCCEEDED(hr) && StopPosBits) { + hr = ChangeStop(); + } + if(StartPosBits) { + hr = ChangeStart(); + } + + return hr; +} + + +HRESULT CSourceSeeking::GetPositions( __out_opt LONGLONG * pCurrent, __out_opt LONGLONG * pStop ) +{ + if(pCurrent) { + *pCurrent = m_rtStart; + } + if(pStop) { + *pStop = m_rtStop; + } + + return S_OK;; +} + + +HRESULT CSourceSeeking::GetAvailable( __out_opt LONGLONG * pEarliest, __out_opt LONGLONG * pLatest ) +{ + if(pEarliest) { + *pEarliest = 0; + } + if(pLatest) { + CAutoLock lock(m_pLock); + *pLatest = m_rtDuration; + } + return S_OK; +} + +HRESULT CSourceSeeking::SetRate( double dRate) +{ + { + CAutoLock lock(m_pLock); + m_dRateSeeking = dRate; + } + return ChangeRate(); +} + +HRESULT CSourceSeeking::GetRate( __out double * pdRate) +{ + CheckPointer(pdRate, E_POINTER); + CAutoLock lock(m_pLock); + *pdRate = m_dRateSeeking; + return S_OK; +} + +HRESULT CSourceSeeking::GetPreroll(__out LONGLONG *pPreroll) +{ + CheckPointer(pPreroll, E_POINTER); + *pPreroll = 0; + return S_OK; +} + + + + + +// --- CSourcePosition implementation ---------- + + +CSourcePosition::CSourcePosition(__in_opt LPCTSTR pName, + __in_opt LPUNKNOWN pUnk, + __inout HRESULT* phr, + __in CCritSec * pLock) : + CMediaPosition(pName, pUnk), + m_pLock(pLock), + m_Start(CRefTime((LONGLONG)0)) +{ + m_Stop = _I64_MAX; + m_Rate = 1.0; +} + + +STDMETHODIMP +CSourcePosition::get_Duration(__out REFTIME * plength) +{ + CheckPointer(plength,E_POINTER); + ValidateReadWritePtr(plength,sizeof(REFTIME)); + CAutoLock lock(m_pLock); + + *plength = m_Duration; + return S_OK; +} + + +STDMETHODIMP +CSourcePosition::put_CurrentPosition(REFTIME llTime) +{ + m_pLock->Lock(); + m_Start = llTime; + m_pLock->Unlock(); + + return ChangeStart(); +} + + +STDMETHODIMP +CSourcePosition::get_StopTime(__out REFTIME * pllTime) +{ + CheckPointer(pllTime,E_POINTER); + ValidateReadWritePtr(pllTime,sizeof(REFTIME)); + CAutoLock lock(m_pLock); + + *pllTime = m_Stop; + return S_OK; +} + + +STDMETHODIMP +CSourcePosition::put_StopTime(REFTIME llTime) +{ + m_pLock->Lock(); + m_Stop = llTime; + m_pLock->Unlock(); + + return ChangeStop(); +} + + +STDMETHODIMP +CSourcePosition::get_PrerollTime(__out REFTIME * pllTime) +{ + CheckPointer(pllTime,E_POINTER); + ValidateReadWritePtr(pllTime,sizeof(REFTIME)); + return E_NOTIMPL; +} + + +STDMETHODIMP +CSourcePosition::put_PrerollTime(REFTIME llTime) +{ + return E_NOTIMPL; +} + + +STDMETHODIMP +CSourcePosition::get_Rate(__out double * pdRate) +{ + CheckPointer(pdRate,E_POINTER); + ValidateReadWritePtr(pdRate,sizeof(double)); + CAutoLock lock(m_pLock); + + *pdRate = m_Rate; + return S_OK; +} + + +STDMETHODIMP +CSourcePosition::put_Rate(double dRate) +{ + m_pLock->Lock(); + m_Rate = dRate; + m_pLock->Unlock(); + + return ChangeRate(); +} + + +// By default we can seek forwards + +STDMETHODIMP +CSourcePosition::CanSeekForward(__out LONG *pCanSeekForward) +{ + CheckPointer(pCanSeekForward,E_POINTER); + *pCanSeekForward = OATRUE; + return S_OK; +} + + +// By default we can seek backwards + +STDMETHODIMP +CSourcePosition::CanSeekBackward(__out LONG *pCanSeekBackward) +{ + CheckPointer(pCanSeekBackward,E_POINTER); + *pCanSeekBackward = OATRUE; + return S_OK; +} + + +// --- Implementation of CBasicAudio class ---------- + + +CBasicAudio::CBasicAudio(__in_opt LPCTSTR pName,__in_opt LPUNKNOWN punk) : + CUnknown(pName, punk) +{ +} + +// overriden to publicise our interfaces + +STDMETHODIMP +CBasicAudio::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + ValidateReadWritePtr(ppv,sizeof(PVOID)); + if (riid == IID_IBasicAudio) { + return GetInterface( (IBasicAudio *) this, ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } +} + + +STDMETHODIMP +CBasicAudio::GetTypeInfoCount(__out UINT * pctinfo) +{ + return m_basedisp.GetTypeInfoCount(pctinfo); +} + + +STDMETHODIMP +CBasicAudio::GetTypeInfo( + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo) +{ + return m_basedisp.GetTypeInfo( + IID_IBasicAudio, + itinfo, + lcid, + pptinfo); +} + + +STDMETHODIMP +CBasicAudio::GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid) +{ + return m_basedisp.GetIDsOfNames( + IID_IBasicAudio, + rgszNames, + cNames, + lcid, + rgdispid); +} + + +STDMETHODIMP +CBasicAudio::Invoke( + DISPID dispidMember, + REFIID riid, + LCID lcid, + WORD wFlags, + __in DISPPARAMS * pdispparams, + __out_opt VARIANT * pvarResult, + __out_opt EXCEPINFO * pexcepinfo, + __out_opt UINT * puArgErr) +{ + // this parameter is a dead leftover from an earlier interface + if (IID_NULL != riid) { + return DISP_E_UNKNOWNINTERFACE; + } + + ITypeInfo * pti; + HRESULT hr = GetTypeInfo(0, lcid, &pti); + + if (FAILED(hr)) { + return hr; + } + + hr = pti->Invoke( + (IBasicAudio *)this, + dispidMember, + wFlags, + pdispparams, + pvarResult, + pexcepinfo, + puArgErr); + + pti->Release(); + return hr; +} + + +// --- IVideoWindow implementation ---------- + +CBaseVideoWindow::CBaseVideoWindow(__in_opt LPCTSTR pName,__in_opt LPUNKNOWN punk) : + CUnknown(pName, punk) +{ +} + + +// overriden to publicise our interfaces + +STDMETHODIMP +CBaseVideoWindow::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + ValidateReadWritePtr(ppv,sizeof(PVOID)); + if (riid == IID_IVideoWindow) { + return GetInterface( (IVideoWindow *) this, ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } +} + + +STDMETHODIMP +CBaseVideoWindow::GetTypeInfoCount(__out UINT * pctinfo) +{ + return m_basedisp.GetTypeInfoCount(pctinfo); +} + + +STDMETHODIMP +CBaseVideoWindow::GetTypeInfo( + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo) +{ + return m_basedisp.GetTypeInfo( + IID_IVideoWindow, + itinfo, + lcid, + pptinfo); +} + + +STDMETHODIMP +CBaseVideoWindow::GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid) +{ + return m_basedisp.GetIDsOfNames( + IID_IVideoWindow, + rgszNames, + cNames, + lcid, + rgdispid); +} + + +STDMETHODIMP +CBaseVideoWindow::Invoke( + DISPID dispidMember, + REFIID riid, + LCID lcid, + WORD wFlags, + __in DISPPARAMS * pdispparams, + __out_opt VARIANT * pvarResult, + __out_opt EXCEPINFO * pexcepinfo, + __out_opt UINT * puArgErr) +{ + // this parameter is a dead leftover from an earlier interface + if (IID_NULL != riid) { + return DISP_E_UNKNOWNINTERFACE; + } + + ITypeInfo * pti; + HRESULT hr = GetTypeInfo(0, lcid, &pti); + + if (FAILED(hr)) { + return hr; + } + + hr = pti->Invoke( + (IVideoWindow *)this, + dispidMember, + wFlags, + pdispparams, + pvarResult, + pexcepinfo, + puArgErr); + + pti->Release(); + return hr; +} + + +// --- IBasicVideo implementation ---------- + + +CBaseBasicVideo::CBaseBasicVideo(__in_opt LPCTSTR pName,__in_opt LPUNKNOWN punk) : + CUnknown(pName, punk) +{ +} + + +// overriden to publicise our interfaces + +STDMETHODIMP +CBaseBasicVideo::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + ValidateReadWritePtr(ppv,sizeof(PVOID)); + if (riid == IID_IBasicVideo || riid == IID_IBasicVideo2) { + return GetInterface( static_cast<IBasicVideo2 *>(this), ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } +} + + +STDMETHODIMP +CBaseBasicVideo::GetTypeInfoCount(__out UINT * pctinfo) +{ + return m_basedisp.GetTypeInfoCount(pctinfo); +} + + +STDMETHODIMP +CBaseBasicVideo::GetTypeInfo( + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo) +{ + return m_basedisp.GetTypeInfo( + IID_IBasicVideo, + itinfo, + lcid, + pptinfo); +} + + +STDMETHODIMP +CBaseBasicVideo::GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid) +{ + return m_basedisp.GetIDsOfNames( + IID_IBasicVideo, + rgszNames, + cNames, + lcid, + rgdispid); +} + + +STDMETHODIMP +CBaseBasicVideo::Invoke( + DISPID dispidMember, + REFIID riid, + LCID lcid, + WORD wFlags, + __in DISPPARAMS * pdispparams, + __out_opt VARIANT * pvarResult, + __out_opt EXCEPINFO * pexcepinfo, + __out_opt UINT * puArgErr) +{ + // this parameter is a dead leftover from an earlier interface + if (IID_NULL != riid) { + return DISP_E_UNKNOWNINTERFACE; + } + + ITypeInfo * pti; + HRESULT hr = GetTypeInfo(0, lcid, &pti); + + if (FAILED(hr)) { + return hr; + } + + hr = pti->Invoke( + (IBasicVideo *)this, + dispidMember, + wFlags, + pdispparams, + pvarResult, + pexcepinfo, + puArgErr); + + pti->Release(); + return hr; +} + + +// --- Implementation of Deferred Commands ---------- + + +CDispParams::CDispParams(UINT nArgs, __in_ecount(nArgs) VARIANT* pArgs, __inout_opt HRESULT *phr) +{ + cNamedArgs = 0; + rgdispidNamedArgs = NULL; + cArgs = nArgs; + + if (cArgs) { + rgvarg = new VARIANTcArgs; + if (NULL == rgvarg) { + cArgs = 0; + if (phr) { + *phr = E_OUTOFMEMORY; + } + return; + } + + for (UINT i = 0; i < cArgs; i++) { + + // Why aren't we using VariantCopy? + + VARIANT * pDest = &rgvargi; + VARIANT * pSrc = &pArgsi; + + pDest->vt = pSrc->vt; + switch(pDest->vt) { + + case VT_I4: + pDest->lVal = pSrc->lVal; + break; + + case VT_UI1: + pDest->bVal = pSrc->bVal; + break; + + case VT_I2: + pDest->iVal = pSrc->iVal; + break; + + case VT_R4: + pDest->fltVal = pSrc->fltVal; + break; + + case VT_R8: + pDest->dblVal = pSrc->dblVal; + break; + + case VT_BOOL: + pDest->boolVal = pSrc->boolVal; + break; + + case VT_ERROR: + pDest->scode = pSrc->scode; + break; + + case VT_CY: + pDest->cyVal = pSrc->cyVal; + break; + + case VT_DATE: + pDest->date = pSrc->date; + break; + + case VT_BSTR: + if ((PVOID)pSrc->bstrVal == NULL) { + pDest->bstrVal = NULL; + } else { + + // a BSTR is a WORD followed by a UNICODE string. + // the pointer points just after the WORD + + WORD len = * (WORD*) (pSrc->bstrVal - (sizeof(WORD) / sizeof(OLECHAR))); + OLECHAR* pch = new OLECHARlen + (sizeof(WORD)/sizeof(OLECHAR)); + if (pch) { + WORD *pui = (WORD*)pch; + *pui = len; + pDest->bstrVal = pch + (sizeof(WORD)/sizeof(OLECHAR)); + CopyMemory(pDest->bstrVal, pSrc->bstrVal, len*sizeof(OLECHAR)); + } else { + cArgs = i; + if (phr) { + *phr = E_OUTOFMEMORY; + } + } + } + break; + + case VT_UNKNOWN: + pDest->punkVal = pSrc->punkVal; + pDest->punkVal->AddRef(); + break; + + case VT_DISPATCH: + pDest->pdispVal = pSrc->pdispVal; + pDest->pdispVal->AddRef(); + break; + + default: + // a type we haven't got round to adding yet! + ASSERT(0); + break; + } + } + + } else { + rgvarg = NULL; + } + +} + + +CDispParams::~CDispParams() +{ + for (UINT i = 0; i < cArgs; i++) { + switch(rgvargi.vt) { + case VT_BSTR: + // Explicitly cast BSTR to PVOID to tell code scanning tools we really mean to test the pointer + if ((PVOID)rgvargi.bstrVal != NULL) { + OLECHAR * pch = rgvargi.bstrVal - (sizeof(WORD)/sizeof(OLECHAR)); + delete pch; + } + break; + + case VT_UNKNOWN: + rgvargi.punkVal->Release(); + break; + + case VT_DISPATCH: + rgvargi.pdispVal->Release(); + break; + } + } + delete rgvarg; +} + + +// lifetime is controlled by refcounts (see defer.h) + +CDeferredCommand::CDeferredCommand( + __inout CCmdQueue * pQ, + __in_opt LPUNKNOWN pUnk, + __inout HRESULT * phr, + __in LPUNKNOWN pUnkExecutor, + REFTIME time, + __in GUID* iid, + long dispidMethod, + short wFlags, + long nArgs, + __in_ecount(nArgs) VARIANT* pDispParams, + __out VARIANT* pvarResult, + __out short* puArgErr, + BOOL bStream + ) : + CUnknown(NAME("DeferredCommand"), pUnk), + m_pQueue(pQ), + m_pUnk(pUnkExecutor), + m_iid(iid), + m_dispidMethod(dispidMethod), + m_wFlags(wFlags), + m_DispParams(nArgs, pDispParams, phr), + m_pvarResult(pvarResult), + m_bStream(bStream), + m_hrResult(E_ABORT) + +{ + // convert REFTIME to REFERENCE_TIME + COARefTime convertor(time); + m_time = convertor; + + // no check of time validity - it's ok to queue a command that's + // already late + + // check iid is supportable on pUnk by QueryInterface for it + IUnknown * pInterface; + HRESULT hr = m_pUnk->QueryInterface(GetIID(), (void**) &pInterface); + if (FAILED(hr)) { + *phr = hr; + return; + } + pInterface->Release(); + + + // !!! check dispidMethod and param/return types using typelib + ITypeInfo *pti; + hr = m_Dispatch.GetTypeInfo(*iid, 0, 0, &pti); + if (FAILED(hr)) { + *phr = hr; + return; + } + // !!! some sort of ITypeInfo validity check here + pti->Release(); + + + // Fix up the dispid for put and get + if (wFlags == DISPATCH_PROPERTYPUT) { + m_DispParams.cNamedArgs = 1; + m_DispId = DISPID_PROPERTYPUT; + m_DispParams.rgdispidNamedArgs = &m_DispId; + } + + // all checks ok - add to queue + hr = pQ->Insert(this); + if (FAILED(hr)) { + *phr = hr; + } +} + + +// refcounts are held by caller of InvokeAt... and by list. So if +// we get here, we can't be on the list + +#if 0 +CDeferredCommand::~CDeferredCommand() +{ + // this assert is invalid since if the queue is deleted while we are + // still on the queue, we will have been removed by the queue and this + // m_pQueue will not have been modified. + // ASSERT(m_pQueue == NULL); + + // we don't hold a ref count on pUnk, which is the object that should + // execute the command. + // This is because there would otherwise be a circular refcount problem + // since pUnk probably owns the CmdQueue object that has a refcount + // on us. + // The lifetime of pUnk is guaranteed by it being part of, or lifetime + // controlled by, our parent object. As long as we are on the list, pUnk + // must be valid. Once we are off the list, we do not use pUnk. + +} +#endif + + +// overriden to publicise our interfaces + +STDMETHODIMP +CDeferredCommand::NonDelegatingQueryInterface(REFIID riid, __out void **ppv) +{ + ValidateReadWritePtr(ppv,sizeof(PVOID)); + if (riid == IID_IDeferredCommand) { + return GetInterface( (IDeferredCommand *) this, ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } +} + + +// remove from q. this will reduce the refcount by one (since the q +// holds a count) but can't make us go away since he must have a +// refcount in order to call this method. + +STDMETHODIMP +CDeferredCommand::Cancel() +{ + if (m_pQueue == NULL) { + return VFW_E_ALREADY_CANCELLED; + } + + HRESULT hr = m_pQueue->Remove(this); + if (FAILED(hr)) { + return hr; + } + + m_pQueue = NULL; + return S_OK; +} + + +STDMETHODIMP +CDeferredCommand::Confidence(__out LONG* pConfidence) +{ + return E_NOTIMPL; +} + + +STDMETHODIMP +CDeferredCommand::GetHResult(__out HRESULT * phrResult) +{ + CheckPointer(phrResult,E_POINTER); + ValidateReadWritePtr(phrResult,sizeof(HRESULT)); + + if (m_pQueue != NULL) { + return E_ABORT; + } + *phrResult = m_hrResult; + return S_OK; +} + + +// set the time to be a new time (checking that it is valid) and +// then requeue + +STDMETHODIMP +CDeferredCommand::Postpone(REFTIME newtime) +{ + + // check that this time is not past + // convert REFTIME to REFERENCE_TIME + COARefTime convertor(newtime); + + // check that the time has not passed + if (m_pQueue->CheckTime(convertor, IsStreamTime())) { + return VFW_E_TIME_ALREADY_PASSED; + } + + // extract from list + HRESULT hr = m_pQueue->Remove(this); + if (FAILED(hr)) { + return hr; + } + + // change time + m_time = convertor; + + // requeue + hr = m_pQueue->Insert(this); + + return hr; +} + + +HRESULT +CDeferredCommand::Invoke() +{ + // check that we are still outstanding + if (m_pQueue == NULL) { + return VFW_E_ALREADY_CANCELLED; + } + + // get the type info + ITypeInfo* pti; + HRESULT hr = m_Dispatch.GetTypeInfo(GetIID(), 0, 0, &pti); + if (FAILED(hr)) { + return hr; + } + + // qi for the expected interface and then invoke it. Note that we have to + // treat the returned interface as IUnknown since we don't know its type. + IUnknown* pInterface; + + hr = m_pUnk->QueryInterface(GetIID(), (void**) &pInterface); + if (FAILED(hr)) { + pti->Release(); + return hr; + } + + EXCEPINFO expinfo; + UINT uArgErr; + m_hrResult = pti->Invoke( + pInterface, + GetMethod(), + GetFlags(), + GetParams(), + GetResult(), + &expinfo, + &uArgErr); + + // release the interface we QI'd for + pInterface->Release(); + pti->Release(); + + + // remove from list whether or not successful + // or we loop indefinitely + hr = m_pQueue->Remove(this); + m_pQueue = NULL; + return hr; +} + + + +// --- CCmdQueue methods ---------- + + +CCmdQueue::CCmdQueue(__inout_opt HRESULT *phr) : + m_listPresentation(NAME("Presentation time command list")), + m_listStream(NAME("Stream time command list")), + m_evDue(TRUE, phr), // manual reset + m_dwAdvise(0), + m_pClock(NULL), + m_bRunning(FALSE) +{ +} + + +CCmdQueue::~CCmdQueue() +{ + // empty all our lists + + // we hold a refcount on each, so traverse and Release each + // entry then RemoveAll to empty the list + POSITION pos = m_listPresentation.GetHeadPosition(); + + while(pos) { + CDeferredCommand* pCmd = m_listPresentation.GetNext(pos); + pCmd->Release(); + } + m_listPresentation.RemoveAll(); + + pos = m_listStream.GetHeadPosition(); + + while(pos) { + CDeferredCommand* pCmd = m_listStream.GetNext(pos); + pCmd->Release(); + } + m_listStream.RemoveAll(); + + if (m_pClock) { + if (m_dwAdvise) { + m_pClock->Unadvise(m_dwAdvise); + m_dwAdvise = 0; + } + m_pClock->Release(); + } +} + + +// returns a new CDeferredCommand object that will be initialised with +// the parameters and will be added to the queue during construction. +// returns S_OK if successfully created otherwise an error and +// no object has been queued. + +HRESULT +CCmdQueue::New( + __out CDeferredCommand **ppCmd, + __in LPUNKNOWN pUnk, // this object will execute command + REFTIME time, + __in GUID* iid, + long dispidMethod, + short wFlags, + long cArgs, + __in_ecount(cArgs) VARIANT* pDispParams, + __out VARIANT* pvarResult, + __out short* puArgErr, + BOOL bStream +) +{ + CAutoLock lock(&m_Lock); + + HRESULT hr = S_OK; + *ppCmd = NULL; + + CDeferredCommand* pCmd; + pCmd = new CDeferredCommand( + this, + NULL, // not aggregated + &hr, + pUnk, // this guy will execute + time, + iid, + dispidMethod, + wFlags, + cArgs, + pDispParams, + pvarResult, + puArgErr, + bStream); + + if (pCmd == NULL) { + hr = E_OUTOFMEMORY; + } else { + *ppCmd = pCmd; + } + return hr; +} + + +HRESULT +CCmdQueue::Insert(__in CDeferredCommand* pCmd) +{ + CAutoLock lock(&m_Lock); + + // addref the item + pCmd->AddRef(); + + CGenericList<CDeferredCommand> * pList; + if (pCmd->IsStreamTime()) { + pList = &m_listStream; + } else { + pList = &m_listPresentation; + } + POSITION pos = pList->GetHeadPosition(); + + // seek past all items that are before us + while (pos && + (pList->GetValid(pos)->GetTime() <= pCmd->GetTime())) { + + pList->GetNext(pos); + } + + // now at end of list or in front of items that come later + if (!pos) { + pList->AddTail(pCmd); + } else { + pList->AddBefore(pos, pCmd); + } + + SetTimeAdvise(); + return S_OK; +} + + +HRESULT +CCmdQueue::Remove(__in CDeferredCommand* pCmd) +{ + CAutoLock lock(&m_Lock); + HRESULT hr = S_OK; + + CGenericList<CDeferredCommand> * pList; + if (pCmd->IsStreamTime()) { + pList = &m_listStream; + } else { + pList = &m_listPresentation; + } + POSITION pos = pList->GetHeadPosition(); + + // traverse the list + while (pos && (pList->GetValid(pos) != pCmd)) { + pList->GetNext(pos); + } + + // did we drop off the end? + if (!pos) { + hr = VFW_E_NOT_FOUND; + } else { + + // found it - now take off list + pList->Remove(pos); + + // Insert did an AddRef, so release it + pCmd->Release(); + + // check that timer request is still for earliest time + SetTimeAdvise(); + } + return hr; +} + + +// set the clock used for timing + +HRESULT +CCmdQueue::SetSyncSource(__in_opt IReferenceClock* pClock) +{ + CAutoLock lock(&m_Lock); + + // addref the new clock first in case they are the same + if (pClock) { + pClock->AddRef(); + } + + // kill any advise on the old clock + if (m_pClock) { + if (m_dwAdvise) { + m_pClock->Unadvise(m_dwAdvise); + m_dwAdvise = 0; + } + m_pClock->Release(); + } + m_pClock = pClock; + + // set up a new advise + SetTimeAdvise(); + return S_OK; +} + + +// set up a timer event with the reference clock + +void +CCmdQueue::SetTimeAdvise(void) +{ + // make sure we have a clock to use + if (!m_pClock) { + return; + } + + // reset the event whenever we are requesting a new signal + m_evDue.Reset(); + + // time 0 is earliest + CRefTime current; + + // find the earliest presentation time + POSITION pos = m_listPresentation.GetHeadPosition(); + if (pos != NULL) { + current = m_listPresentation.GetValid(pos)->GetTime(); + } + + // if we're running, check the stream times too + if (m_bRunning) { + + CRefTime t; + pos = m_listStream.GetHeadPosition(); + if (NULL != pos) { + t = m_listStream.GetValid(pos)->GetTime(); + + // add on stream time offset to get presentation time + t += m_StreamTimeOffset; + + // is this earlier? + if ((current == TimeZero) || (t < current)) { + current = t; + } + } + } + + // need to change? + if ((current > TimeZero) && (current != m_tCurrentAdvise)) { + if (m_dwAdvise) { + m_pClock->Unadvise(m_dwAdvise); + // reset the event whenever we are requesting a new signal + m_evDue.Reset(); + } + + // ask for time advice - the first two params are either + // stream time offset and stream time or + // presentation time and 0. we always use the latter + HRESULT hr = m_pClock->AdviseTime( + (REFERENCE_TIME)current, + TimeZero, + (HEVENT) HANDLE(m_evDue), + &m_dwAdvise); + + ASSERT(SUCCEEDED(hr)); + m_tCurrentAdvise = current; + } +} + + +// switch to run mode. Streamtime to Presentation time mapping known. + +HRESULT +CCmdQueue::Run(REFERENCE_TIME tStreamTimeOffset) +{ + CAutoLock lock(&m_Lock); + + m_StreamTimeOffset = tStreamTimeOffset; + m_bRunning = TRUE; + + // ensure advise is accurate + SetTimeAdvise(); + return S_OK; +} + + +// switch to Stopped or Paused mode. Time mapping not known. + +HRESULT +CCmdQueue::EndRun() +{ + CAutoLock lock(&m_Lock); + + m_bRunning = FALSE; + + // check timer setting - stream times + SetTimeAdvise(); + return S_OK; +} + + +// return a pointer to the next due command. Blocks for msTimeout +// milliseconds until there is a due command. +// Stream-time commands will only become due between Run and Endrun calls. +// The command remains queued until invoked or cancelled. +// Returns E_ABORT if timeout occurs, otherwise S_OK (or other error). +// +// returns an AddRef'd object + +HRESULT +CCmdQueue::GetDueCommand(__out CDeferredCommand ** ppCmd, long msTimeout) +{ + // loop until we timeout or find a due command + for (;;) { + + { + CAutoLock lock(&m_Lock); + + + // find the earliest command + CDeferredCommand * pCmd = NULL; + + // check the presentation time and the + // stream time list to find the earliest + + POSITION pos = m_listPresentation.GetHeadPosition(); + + if (NULL != pos) { + pCmd = m_listPresentation.GetValid(pos); + } + + if (m_bRunning) { + pos = m_listStream.GetHeadPosition(); + if (NULL != pos) { + CDeferredCommand* pStrm = m_listStream.GetValid(pos); + + CRefTime t = pStrm->GetTime() + m_StreamTimeOffset; + if (!pCmd || (t < pCmd->GetTime())) { + pCmd = pStrm; + } + } + } + + // if we have found one, is it due? + if (pCmd) { + if (CheckTime(pCmd->GetTime(), pCmd->IsStreamTime())) { + + // yes it's due - addref it + pCmd->AddRef(); + *ppCmd = pCmd; + return S_OK; + } + } + } + + // block until the advise is signalled + if (WaitForSingleObject(m_evDue, msTimeout) != WAIT_OBJECT_0) { + return E_ABORT; + } + } +} + + +// return a pointer to a command that will be due for a given time. +// Pass in a stream time here. The stream time offset will be passed +// in via the Run method. +// Commands remain queued until invoked or cancelled. +// This method will not block. It will report E_ABORT if there are no +// commands due yet. +// +// returns an AddRef'd object + +HRESULT +CCmdQueue::GetCommandDueFor(REFERENCE_TIME rtStream, __out CDeferredCommand**ppCmd) +{ + CAutoLock lock(&m_Lock); + + CRefTime tStream(rtStream); + + // find the earliest stream and presentation time commands + CDeferredCommand* pStream = NULL; + POSITION pos = m_listStream.GetHeadPosition(); + if (NULL != pos) { + pStream = m_listStream.GetValid(pos); + } + CDeferredCommand* pPresent = NULL; + pos = m_listPresentation.GetHeadPosition(); + if (NULL != pos) { + pPresent = m_listPresentation.GetValid(pos); + } + + // is there a presentation time that has passed already + if (pPresent && CheckTime(pPresent->GetTime(), FALSE)) { + pPresent->AddRef(); + *ppCmd = pPresent; + return S_OK; + } + + // is there a stream time command due before this stream time + if (pStream && (pStream->GetTime() <= tStream)) { + pStream->AddRef(); + *ppCmd = pStream; + return S_OK; + } + + // if we are running, we can map presentation times to + // stream time. In this case, is there a presentation time command + // that will be due before this stream time is presented? + if (m_bRunning && pPresent) { + + // this stream time will appear at... + tStream += m_StreamTimeOffset; + + // due before that? + if (pPresent->GetTime() <= tStream) { + *ppCmd = pPresent; + return S_OK; + } + } + + // no commands due yet + return VFW_E_NOT_FOUND; +} +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/ctlutil.h
Added
@@ -0,0 +1,923 @@ +//------------------------------------------------------------------------------ +// File: CtlUtil.h +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// Base classes implementing IDispatch parsing for the basic control dual +// interfaces. Derive from these and implement just the custom method and +// property methods. We also implement CPosPassThru that can be used by +// renderers and transforms to pass by IMediaPosition and IMediaSeeking + +#ifndef __CTLUTIL__ +#define __CTLUTIL__ + +// OLE Automation has different ideas of TRUE and FALSE + +#define OATRUE (-1) +#define OAFALSE (0) + + +// It's possible that we could replace this class with CreateStdDispatch + +class CBaseDispatch +{ + ITypeInfo * m_pti; + +public: + + CBaseDispatch() : m_pti(NULL) {} + ~CBaseDispatch(); + + /* IDispatch methods */ + STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo); + + STDMETHODIMP GetTypeInfo( + REFIID riid, + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo); + + STDMETHODIMP GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid); +}; + + +class AM_NOVTABLE CMediaControl : + public IMediaControl, + public CUnknown +{ + CBaseDispatch m_basedisp; + +public: + + CMediaControl(const TCHAR *, LPUNKNOWN); + + DECLARE_IUNKNOWN + + // override this to publicise our interfaces + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv); + + /* IDispatch methods */ + STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo); + + STDMETHODIMP GetTypeInfo( + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo); + + STDMETHODIMP GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid); + + STDMETHODIMP Invoke( + DISPID dispidMember, + REFIID riid, + LCID lcid, + WORD wFlags, + __in DISPPARAMS * pdispparams, + __out_opt VARIANT * pvarResult, + __out_opt EXCEPINFO * pexcepinfo, + __out_opt UINT * puArgErr); +}; + + +class AM_NOVTABLE CMediaEvent : + public IMediaEventEx, + public CUnknown +{ + CBaseDispatch m_basedisp; + +public: + + CMediaEvent(__in_opt LPCTSTR, __in_opt LPUNKNOWN); + + DECLARE_IUNKNOWN + + // override this to publicise our interfaces + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv); + + /* IDispatch methods */ + STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo); + + STDMETHODIMP GetTypeInfo( + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo); + + STDMETHODIMP GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid); + + STDMETHODIMP Invoke( + DISPID dispidMember, + REFIID riid, + LCID lcid, + WORD wFlags, + __in DISPPARAMS * pdispparams, + __out_opt VARIANT * pvarResult, + __out_opt EXCEPINFO * pexcepinfo, + __out_opt UINT * puArgErr); +}; + + +class AM_NOVTABLE CMediaPosition : + public IMediaPosition, + public CUnknown +{ + CBaseDispatch m_basedisp; + + +public: + + CMediaPosition(__in_opt LPCTSTR, __in_opt LPUNKNOWN); + CMediaPosition(__in_opt LPCTSTR, __in_opt LPUNKNOWN, __inout HRESULT *phr); + + DECLARE_IUNKNOWN + + // override this to publicise our interfaces + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv); + + /* IDispatch methods */ + STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo); + + STDMETHODIMP GetTypeInfo( + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo); + + STDMETHODIMP GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid); + + STDMETHODIMP Invoke( + DISPID dispidMember, + REFIID riid, + LCID lcid, + WORD wFlags, + __in DISPPARAMS * pdispparams, + __out_opt VARIANT * pvarResult, + __out_opt EXCEPINFO * pexcepinfo, + __out_opt UINT * puArgErr); + +}; + + +// OA-compatibility means that we must use double as the RefTime value, +// and REFERENCE_TIME (essentially a LONGLONG) within filters. +// this class converts between the two + +class COARefTime : public CRefTime { +public: + + COARefTime() { + }; + + COARefTime(CRefTime t) + : CRefTime(t) + { + }; + + COARefTime(REFERENCE_TIME t) + : CRefTime(t) + { + }; + + COARefTime(double d) { + m_time = (LONGLONG) (d * 10000000); + }; + + operator double() { + return double(m_time) / 10000000; + }; + + operator REFERENCE_TIME() { + return m_time; + }; + + COARefTime& operator=(const double& rd) { + m_time = (LONGLONG) (rd * 10000000); + return *this; + } + + COARefTime& operator=(const REFERENCE_TIME& rt) { + m_time = rt; + return *this; + } + + inline BOOL operator==(const COARefTime& rt) + { + return m_time == rt.m_time; + }; + + inline BOOL operator!=(const COARefTime& rt) + { + return m_time != rt.m_time; + }; + + inline BOOL operator < (const COARefTime& rt) + { + return m_time < rt.m_time; + }; + + inline BOOL operator > (const COARefTime& rt) + { + return m_time > rt.m_time; + }; + + inline BOOL operator >= (const COARefTime& rt) + { + return m_time >= rt.m_time; + }; + + inline BOOL operator <= (const COARefTime& rt) + { + return m_time <= rt.m_time; + }; + + inline COARefTime operator+(const COARefTime& rt) + { + return COARefTime(m_time + rt.m_time); + }; + + inline COARefTime operator-(const COARefTime& rt) + { + return COARefTime(m_time - rt.m_time); + }; + + inline COARefTime operator*(LONG l) + { + return COARefTime(m_time * l); + }; + + inline COARefTime operator/(LONG l) + { + return COARefTime(m_time / l); + }; + +private: + // Prevent bugs from constructing from LONG (which gets + // converted to double and then multiplied by 10000000 + COARefTime(LONG); + LONG operator=(LONG); +}; + + +// A utility class that handles IMediaPosition and IMediaSeeking on behalf +// of single-input pin renderers, or transform filters. +// +// Renderers will expose this from the filter; transform filters will +// expose it from the output pin and not the renderer. +// +// Create one of these, giving it your IPin* for your input pin, and delegate +// all IMediaPosition methods to it. It will query the input pin for +// IMediaPosition and respond appropriately. +// +// Call ForceRefresh if the pin connection changes. +// +// This class no longer caches the upstream IMediaPosition or IMediaSeeking +// it acquires it on each method call. This means ForceRefresh is not needed. +// The method is kept for source compatibility and to minimise the changes +// if we need to put it back later for performance reasons. + +class CPosPassThru : public IMediaSeeking, public CMediaPosition +{ + IPin *m_pPin; + + HRESULT GetPeer(__deref_out IMediaPosition **ppMP); + HRESULT GetPeerSeeking(__deref_out IMediaSeeking **ppMS); + +public: + + CPosPassThru(__in_opt LPCTSTR, __in_opt LPUNKNOWN, __inout HRESULT*, IPin *); + DECLARE_IUNKNOWN + + HRESULT ForceRefresh() { + return S_OK; + }; + + // override to return an accurate current position + virtual HRESULT GetMediaTime(__out LONGLONG *pStartTime, __out_opt LONGLONG *pEndTime) { + return E_FAIL; + } + + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,__deref_out void **ppv); + + // IMediaSeeking methods + STDMETHODIMP GetCapabilities( __out DWORD * pCapabilities ); + STDMETHODIMP CheckCapabilities( __inout DWORD * pCapabilities ); + STDMETHODIMP SetTimeFormat(const GUID * pFormat); + STDMETHODIMP GetTimeFormat(__out GUID *pFormat); + STDMETHODIMP IsUsingTimeFormat(const GUID * pFormat); + STDMETHODIMP IsFormatSupported( const GUID * pFormat); + STDMETHODIMP QueryPreferredFormat( __out GUID *pFormat); + STDMETHODIMP ConvertTimeFormat(__out LONGLONG * pTarget, + __in_opt const GUID * pTargetFormat, + LONGLONG Source, + __in_opt const GUID * pSourceFormat ); + STDMETHODIMP SetPositions( __inout_opt LONGLONG * pCurrent, DWORD CurrentFlags + , __inout_opt LONGLONG * pStop, DWORD StopFlags ); + + STDMETHODIMP GetPositions( __out_opt LONGLONG * pCurrent, __out_opt LONGLONG * pStop ); + STDMETHODIMP GetCurrentPosition( __out LONGLONG * pCurrent ); + STDMETHODIMP GetStopPosition( __out LONGLONG * pStop ); + STDMETHODIMP SetRate( double dRate); + STDMETHODIMP GetRate( __out double * pdRate); + STDMETHODIMP GetDuration( __out LONGLONG *pDuration); + STDMETHODIMP GetAvailable( __out_opt LONGLONG *pEarliest, __out_opt LONGLONG *pLatest ); + STDMETHODIMP GetPreroll( __out LONGLONG *pllPreroll ); + + // IMediaPosition properties + STDMETHODIMP get_Duration(__out REFTIME * plength); + STDMETHODIMP put_CurrentPosition(REFTIME llTime); + STDMETHODIMP get_StopTime(__out REFTIME * pllTime); + STDMETHODIMP put_StopTime(REFTIME llTime); + STDMETHODIMP get_PrerollTime(__out REFTIME * pllTime); + STDMETHODIMP put_PrerollTime(REFTIME llTime); + STDMETHODIMP get_Rate(__out double * pdRate); + STDMETHODIMP put_Rate(double dRate); + STDMETHODIMP get_CurrentPosition(__out REFTIME * pllTime); + STDMETHODIMP CanSeekForward(__out LONG *pCanSeekForward); + STDMETHODIMP CanSeekBackward(__out LONG *pCanSeekBackward); + +private: + HRESULT GetSeekingLongLong( HRESULT (__stdcall IMediaSeeking::*pMethod)( LONGLONG * ), + __out LONGLONG * pll ); +}; + + +// Adds the ability to return a current position + +class CRendererPosPassThru : public CPosPassThru +{ + CCritSec m_PositionLock; // Locks access to our position + LONGLONG m_StartMedia; // Start media time last seen + LONGLONG m_EndMedia; // And likewise the end media + BOOL m_bReset; // Have media times been set + +public: + + // Used to help with passing media times through graph + + CRendererPosPassThru(__in_opt LPCTSTR, __in_opt LPUNKNOWN, __inout HRESULT*, IPin *); + HRESULT RegisterMediaTime(IMediaSample *pMediaSample); + HRESULT RegisterMediaTime(LONGLONG StartTime,LONGLONG EndTime); + HRESULT GetMediaTime(__out LONGLONG *pStartTime,__out_opt LONGLONG *pEndTime); + HRESULT ResetMediaTime(); + HRESULT EOS(); +}; + +STDAPI CreatePosPassThru( + __in_opt LPUNKNOWN pAgg, + BOOL bRenderer, + IPin *pPin, + __deref_out IUnknown **ppPassThru +); + +// A class that handles the IDispatch part of IBasicAudio and leaves the +// properties and methods themselves pure virtual. + +class AM_NOVTABLE CBasicAudio : public IBasicAudio, public CUnknown +{ + CBaseDispatch m_basedisp; + +public: + + CBasicAudio(__in_opt LPCTSTR, __in_opt LPUNKNOWN); + + DECLARE_IUNKNOWN + + // override this to publicise our interfaces + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv); + + /* IDispatch methods */ + STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo); + + STDMETHODIMP GetTypeInfo( + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo); + + STDMETHODIMP GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid); + + STDMETHODIMP Invoke( + DISPID dispidMember, + REFIID riid, + LCID lcid, + WORD wFlags, + __in DISPPARAMS * pdispparams, + __out_opt VARIANT * pvarResult, + __out_opt EXCEPINFO * pexcepinfo, + __out_opt UINT * puArgErr); +}; + + +// A class that handles the IDispatch part of IBasicVideo and leaves the +// properties and methods themselves pure virtual. + +class AM_NOVTABLE CBaseBasicVideo : public IBasicVideo2, public CUnknown +{ + CBaseDispatch m_basedisp; + +public: + + CBaseBasicVideo(__in_opt LPCTSTR, __in_opt LPUNKNOWN); + + DECLARE_IUNKNOWN + + // override this to publicise our interfaces + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv); + + /* IDispatch methods */ + STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo); + + STDMETHODIMP GetTypeInfo( + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo); + + STDMETHODIMP GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid); + + STDMETHODIMP Invoke( + DISPID dispidMember, + REFIID riid, + LCID lcid, + WORD wFlags, + __in DISPPARAMS * pdispparams, + __out_opt VARIANT * pvarResult, + __out_opt EXCEPINFO * pexcepinfo, + __out_opt UINT * puArgErr); + + STDMETHODIMP GetPreferredAspectRatio( + __out long *plAspectX, + __out long *plAspectY) + { + return E_NOTIMPL; + } +}; + + +// A class that handles the IDispatch part of IVideoWindow and leaves the +// properties and methods themselves pure virtual. + +class AM_NOVTABLE CBaseVideoWindow : public IVideoWindow, public CUnknown +{ + CBaseDispatch m_basedisp; + +public: + + CBaseVideoWindow(__in_opt LPCTSTR, __in_opt LPUNKNOWN); + + DECLARE_IUNKNOWN + + // override this to publicise our interfaces + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv); + + /* IDispatch methods */ + STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo); + + STDMETHODIMP GetTypeInfo( + UINT itinfo, + LCID lcid, + __deref_out ITypeInfo ** pptinfo); + + STDMETHODIMP GetIDsOfNames( + REFIID riid, + __in_ecount(cNames) LPOLESTR * rgszNames, + UINT cNames, + LCID lcid, + __out_ecount(cNames) DISPID * rgdispid); + + STDMETHODIMP Invoke( + DISPID dispidMember, + REFIID riid, + LCID lcid, + WORD wFlags, + __in DISPPARAMS * pdispparams, + __out_opt VARIANT * pvarResult, + __out_opt EXCEPINFO * pexcepinfo, + __out_opt UINT * puArgErr); +}; + + +// abstract class to help source filters with their implementation +// of IMediaPosition. Derive from this and set the duration (and stop +// position). Also override NotifyChange to do something when the properties +// change. + +class AM_NOVTABLE CSourcePosition : public CMediaPosition +{ + +public: + CSourcePosition(__in_opt LPCTSTR, __in_opt LPUNKNOWN, __inout HRESULT*, __in CCritSec *); + + // IMediaPosition methods + STDMETHODIMP get_Duration(__out REFTIME * plength); + STDMETHODIMP put_CurrentPosition(REFTIME llTime); + STDMETHODIMP get_StopTime(__out REFTIME * pllTime); + STDMETHODIMP put_StopTime(REFTIME llTime); + STDMETHODIMP get_PrerollTime(__out REFTIME * pllTime); + STDMETHODIMP put_PrerollTime(REFTIME llTime); + STDMETHODIMP get_Rate(__out double * pdRate); + STDMETHODIMP put_Rate(double dRate); + STDMETHODIMP CanSeekForward(__out LONG *pCanSeekForward); + STDMETHODIMP CanSeekBackward(__out LONG *pCanSeekBackward); + + // override if you can return the data you are actually working on + STDMETHODIMP get_CurrentPosition(__out REFTIME * pllTime) { + return E_NOTIMPL; + }; + +protected: + + // we call this to notify changes. Override to handle them + virtual HRESULT ChangeStart() PURE; + virtual HRESULT ChangeStop() PURE; + virtual HRESULT ChangeRate() PURE; + + COARefTime m_Duration; + COARefTime m_Start; + COARefTime m_Stop; + double m_Rate; + + CCritSec * m_pLock; +}; + +class AM_NOVTABLE CSourceSeeking : + public IMediaSeeking, + public CUnknown +{ + +public: + + DECLARE_IUNKNOWN; + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv); + + // IMediaSeeking methods + + STDMETHODIMP IsFormatSupported(const GUID * pFormat); + STDMETHODIMP QueryPreferredFormat(__out GUID *pFormat); + STDMETHODIMP SetTimeFormat(const GUID * pFormat); + STDMETHODIMP IsUsingTimeFormat(const GUID * pFormat); + STDMETHODIMP GetTimeFormat(__out GUID *pFormat); + STDMETHODIMP GetDuration(__out LONGLONG *pDuration); + STDMETHODIMP GetStopPosition(__out LONGLONG *pStop); + STDMETHODIMP GetCurrentPosition(__out LONGLONG *pCurrent); + STDMETHODIMP GetCapabilities( __out DWORD * pCapabilities ); + STDMETHODIMP CheckCapabilities( __inout DWORD * pCapabilities ); + STDMETHODIMP ConvertTimeFormat( __out LONGLONG * pTarget, + __in_opt const GUID * pTargetFormat, + LONGLONG Source, + __in_opt const GUID * pSourceFormat ); + + STDMETHODIMP SetPositions( __inout_opt LONGLONG * pCurrent, DWORD CurrentFlags + , __inout_opt LONGLONG * pStop, DWORD StopFlags ); + + STDMETHODIMP GetPositions( __out_opt LONGLONG * pCurrent, __out_opt LONGLONG * pStop ); + + STDMETHODIMP GetAvailable( __out_opt LONGLONG * pEarliest, __out_opt LONGLONG * pLatest ); + STDMETHODIMP SetRate( double dRate); + STDMETHODIMP GetRate( __out double * pdRate); + STDMETHODIMP GetPreroll(__out LONGLONG *pPreroll); + + +protected: + + // ctor + CSourceSeeking(__in_opt LPCTSTR, __in_opt LPUNKNOWN, __inout HRESULT*, __in CCritSec *); + + // we call this to notify changes. Override to handle them + virtual HRESULT ChangeStart() PURE; + virtual HRESULT ChangeStop() PURE; + virtual HRESULT ChangeRate() PURE; + + CRefTime m_rtDuration; // length of stream + CRefTime m_rtStart; // source will start here + CRefTime m_rtStop; // source will stop here + double m_dRateSeeking; + + // seeking capabilities + DWORD m_dwSeekingCaps; + + CCritSec * m_pLock; +}; + + +// Base classes supporting Deferred commands. + +// Deferred commands are queued by calls to methods on the IQueueCommand +// interface, exposed by the filtergraph and by some filters. A successful +// call to one of these methods will return an IDeferredCommand interface +// representing the queued command. +// +// A CDeferredCommand object represents a single deferred command, and exposes +// the IDeferredCommand interface as well as other methods permitting time +// checks and actual execution. It contains a reference to the CCommandQueue +// object on which it is queued. +// +// CCommandQueue is a base class providing a queue of CDeferredCommand +// objects, and methods to add, remove, check status and invoke the queued +// commands. A CCommandQueue object would be part of an object that +// implemented IQueueCommand. + +class CCmdQueue; + +// take a copy of the params and store them. Release any allocated +// memory in destructor + +class CDispParams : public DISPPARAMS +{ +public: + CDispParams(UINT nArgs, __in_ecount(nArgs) VARIANT* pArgs, __inout_opt HRESULT *phr = NULL); + ~CDispParams(); +}; + + +// CDeferredCommand lifetime is controlled by refcounts. Caller of +// InvokeAt.. gets a refcounted interface pointer, and the CCmdQueue +// object also holds a refcount on us. Calling Cancel or Invoke takes +// us off the CCmdQueue and thus reduces the refcount by 1. Once taken +// off the queue we cannot be put back on the queue. + +class CDeferredCommand + : public CUnknown, + public IDeferredCommand +{ +public: + + CDeferredCommand( + __inout CCmdQueue * pQ, + __in_opt LPUNKNOWN pUnk, // aggregation outer unk + __inout HRESULT * phr, + __in LPUNKNOWN pUnkExecutor, // object that will execute this cmd + REFTIME time, + __in GUID* iid, + long dispidMethod, + short wFlags, + long cArgs, + __in_ecount(cArgs) VARIANT* pDispParams, + __out VARIANT* pvarResult, + __out short* puArgErr, + BOOL bStream + ); + + DECLARE_IUNKNOWN + + // override this to publicise our interfaces + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __out void **ppv); + + // IDeferredCommand methods + STDMETHODIMP Cancel(); + STDMETHODIMP Confidence( + __out LONG* pConfidence); + STDMETHODIMP Postpone( + REFTIME newtime); + STDMETHODIMP GetHResult( + __out HRESULT* phrResult); + + // other public methods + + HRESULT Invoke(); + + // access methods + + // returns TRUE if streamtime, FALSE if presentation time + BOOL IsStreamTime() { + return m_bStream; + }; + + CRefTime GetTime() { + return m_time; + }; + + REFIID GetIID() { + return *m_iid; + }; + + long GetMethod() { + return m_dispidMethod; + }; + + short GetFlags() { + return m_wFlags; + }; + + DISPPARAMS* GetParams() { + return &m_DispParams; + }; + + VARIANT* GetResult() { + return m_pvarResult; + }; + +protected: + + CCmdQueue* m_pQueue; + + // pUnk for the interface that we will execute the command on + LPUNKNOWN m_pUnk; + + // stored command data + REFERENCE_TIME m_time; + GUID* m_iid; + long m_dispidMethod; + short m_wFlags; + VARIANT* m_pvarResult; + BOOL m_bStream; + CDispParams m_DispParams; + DISPID m_DispId; // For get and put + + // we use this for ITypeInfo access + CBaseDispatch m_Dispatch; + + // save retval here + HRESULT m_hrResult; +}; + + +// a list of CDeferredCommand objects. this is a base class providing +// the basics of access to the list. If you want to use CDeferredCommand +// objects then your queue needs to be derived from this class. + +class AM_NOVTABLE CCmdQueue +{ +public: + CCmdQueue(__inout_opt HRESULT *phr = NULL); + virtual ~CCmdQueue(); + + // returns a new CDeferredCommand object that will be initialised with + // the parameters and will be added to the queue during construction. + // returns S_OK if successfully created otherwise an error and + // no object has been queued. + virtual HRESULT New( + __out CDeferredCommand **ppCmd, + __in LPUNKNOWN pUnk, + REFTIME time, + __in GUID* iid, + long dispidMethod, + short wFlags, + long cArgs, + __in_ecount(cArgs) VARIANT* pDispParams, + __out VARIANT* pvarResult, + __out short* puArgErr, + BOOL bStream + ); + + // called by the CDeferredCommand object to add and remove itself + // from the queue + virtual HRESULT Insert(__in CDeferredCommand* pCmd); + virtual HRESULT Remove(__in CDeferredCommand* pCmd); + + // Command-Due Checking + // + // There are two schemes of synchronisation: coarse and accurate. In + // coarse mode, you wait till the time arrives and then execute the cmd. + // In accurate mode, you wait until you are processing the sample that + // will appear at the time, and then execute the command. It's up to the + // filter which one it will implement. The filtergraph will always + // implement coarse mode for commands queued at the filtergraph. + // + // If you want coarse sync, you probably want to wait until there is a + // command due, and then execute it. You can do this by calling + // GetDueCommand. If you have several things to wait for, get the + // event handle from GetDueHandle() and when this is signalled then call + // GetDueCommand. Stream time will only advance between calls to Run and + // EndRun. Note that to avoid an extra thread there is no guarantee that + // if the handle is set there will be a command ready. Each time the + // event is signalled, call GetDueCommand (probably with a 0 timeout); + // This may return E_ABORT. + // + // If you want accurate sync, you must call GetCommandDueFor, passing + // as a parameter the stream time of the samples you are about to process. + // This will return: + // -- a stream-time command due at or before that stream time + // -- a presentation-time command due at or before the + // time that stream time will be presented (only between Run + // and EndRun calls, since outside of this, the mapping from + // stream time to presentation time is not known. + // -- any presentation-time command due now. + // This means that if you want accurate synchronisation on samples that + // might be processed during Paused mode, you need to use + // stream-time commands. + // + // In all cases, commands remain queued until Invoked or Cancelled. The + // setting and resetting of the event handle is managed entirely by this + // queue object. + + // set the clock used for timing + virtual HRESULT SetSyncSource(__in_opt IReferenceClock*); + + // switch to run mode. Streamtime to Presentation time mapping known. + virtual HRESULT Run(REFERENCE_TIME tStreamTimeOffset); + + // switch to Stopped or Paused mode. Time mapping not known. + virtual HRESULT EndRun(); + + // return a pointer to the next due command. Blocks for msTimeout + // milliseconds until there is a due command. + // Stream-time commands will only become due between Run and Endrun calls. + // The command remains queued until invoked or cancelled. + // Returns E_ABORT if timeout occurs, otherwise S_OK (or other error). + // Returns an AddRef-ed object + virtual HRESULT GetDueCommand(__out CDeferredCommand ** ppCmd, long msTimeout); + + // return the event handle that will be signalled whenever + // there are deferred commands due for execution (when GetDueCommand + // will not block). + HANDLE GetDueHandle() { + return HANDLE(m_evDue); + }; + + // return a pointer to a command that will be due for a given time. + // Pass in a stream time here. The stream time offset will be passed + // in via the Run method. + // Commands remain queued until invoked or cancelled. + // This method will not block. It will report VFW_E_NOT_FOUND if there + // are no commands due yet. + // Returns an AddRef-ed object + virtual HRESULT GetCommandDueFor(REFERENCE_TIME tStream, __out CDeferredCommand**ppCmd); + + // check if a given time is due (TRUE if it is due yet) + BOOL CheckTime(CRefTime time, BOOL bStream) { + + // if no clock, nothing is due! + if (!m_pClock) { + return FALSE; + } + + // stream time + if (bStream) { + + // not valid if not running + if (!m_bRunning) { + return FALSE; + } + // add on known stream time offset to get presentation time + time += m_StreamTimeOffset; + } + + CRefTime Now; + m_pClock->GetTime((REFERENCE_TIME*)&Now); + return (time <= Now); + }; + +protected: + + // protect access to lists etc + CCritSec m_Lock; + + // commands queued in presentation time are stored here + CGenericList<CDeferredCommand> m_listPresentation; + + // commands queued in stream time are stored here + CGenericList<CDeferredCommand> m_listStream; + + // set when any commands are due + CAMEvent m_evDue; + + // creates an advise for the earliest time required, if any + void SetTimeAdvise(void); + + // advise id from reference clock (0 if no outstanding advise) + DWORD_PTR m_dwAdvise; + + // advise time is for this presentation time + CRefTime m_tCurrentAdvise; + + // the reference clock we are using (addrefed) + IReferenceClock* m_pClock; + + // true when running + BOOL m_bRunning; + + // contains stream time offset when m_bRunning is true + CRefTime m_StreamTimeOffset; +}; + +#endif // __CTLUTIL__
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/ddmm.cpp
Added
@@ -0,0 +1,129 @@ +//------------------------------------------------------------------------------ +// File: DDMM.cpp +// +// Desc: DirectShow base classes - implements routines for using DirectDraw +// on a multimonitor system. +// +// Copyright (c) 1995-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include <ddraw.h> +#include "ddmm.h" + +/* + * FindDeviceCallback + */ +typedef struct { + LPSTR szDevice; + GUID* lpGUID; + GUID GUID; + BOOL fFound; +} FindDeviceData; + +BOOL CALLBACK FindDeviceCallback(__in_opt GUID* lpGUID, __in LPSTR szName, __in LPSTR szDevice, __in LPVOID lParam) +{ + FindDeviceData *p = (FindDeviceData*)lParam; + + if (lstrcmpiA(p->szDevice, szDevice) == 0) { + if (lpGUID) { + p->GUID = *lpGUID; + p->lpGUID = &p->GUID; + } else { + p->lpGUID = NULL; + } + p->fFound = TRUE; + return FALSE; + } + return TRUE; +} + + +BOOL CALLBACK FindDeviceCallbackEx(__in_opt GUID* lpGUID, __in LPSTR szName, __in LPSTR szDevice, __in LPVOID lParam, HMONITOR hMonitor) +{ + FindDeviceData *p = (FindDeviceData*)lParam; + + if (lstrcmpiA(p->szDevice, szDevice) == 0) { + if (lpGUID) { + p->GUID = *lpGUID; + p->lpGUID = &p->GUID; + } else { + p->lpGUID = NULL; + } + p->fFound = TRUE; + return FALSE; + } + return TRUE; +} + + +/* + * DirectDrawCreateFromDevice + * + * create a DirectDraw object for a particular device + */ +IDirectDraw * DirectDrawCreateFromDevice(__in_opt LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, PDRAWENUM DirectDrawEnumerateP) +{ + IDirectDraw* pdd = NULL; + FindDeviceData find; + + if (szDevice == NULL) { + DirectDrawCreateP(NULL, &pdd, NULL); + return pdd; + } + + find.szDevice = szDevice; + find.fFound = FALSE; + DirectDrawEnumerateP(FindDeviceCallback, (LPVOID)&find); + + if (find.fFound) + { + // + // In 4bpp mode the following DDraw call causes a message box to be popped + // up by DDraw (!?!). It's DDraw's fault, but we don't like it. So we + // make sure it doesn't happen. + // + UINT ErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); + DirectDrawCreateP(find.lpGUID, &pdd, NULL); + SetErrorMode(ErrorMode); + } + + return pdd; +} + + +/* + * DirectDrawCreateFromDeviceEx + * + * create a DirectDraw object for a particular device + */ +IDirectDraw * DirectDrawCreateFromDeviceEx(__in_opt LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, LPDIRECTDRAWENUMERATEEXA DirectDrawEnumerateExP) +{ + IDirectDraw* pdd = NULL; + FindDeviceData find; + + if (szDevice == NULL) { + DirectDrawCreateP(NULL, &pdd, NULL); + return pdd; + } + + find.szDevice = szDevice; + find.fFound = FALSE; + DirectDrawEnumerateExP(FindDeviceCallbackEx, (LPVOID)&find, + DDENUM_ATTACHEDSECONDARYDEVICES); + + if (find.fFound) + { + // + // In 4bpp mode the following DDraw call causes a message box to be popped + // up by DDraw (!?!). It's DDraw's fault, but we don't like it. So we + // make sure it doesn't happen. + // + UINT ErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); + DirectDrawCreateP(find.lpGUID, &pdd, NULL); + SetErrorMode(ErrorMode); + } + + return pdd; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/ddmm.h
Added
@@ -0,0 +1,28 @@ +//------------------------------------------------------------------------------ +// File: DDMM.h +// +// Desc: DirectShow base classes - efines routines for using DirectDraw +// on a multimonitor system. +// +// Copyright (c) 1995-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifdef __cplusplus +extern "C" { /* Assume C declarations for C++ */ +#endif /* __cplusplus */ + +// DDRAW.H might not include these +#ifndef DDENUM_ATTACHEDSECONDARYDEVICES +#define DDENUM_ATTACHEDSECONDARYDEVICES 0x00000001L +#endif + +typedef HRESULT (*PDRAWCREATE)(IID *,LPDIRECTDRAW *,LPUNKNOWN); +typedef HRESULT (*PDRAWENUM)(LPDDENUMCALLBACKA, LPVOID); + +IDirectDraw * DirectDrawCreateFromDevice(__in_opt LPSTR, PDRAWCREATE, PDRAWENUM); +IDirectDraw * DirectDrawCreateFromDeviceEx(__in_opt LPSTR, PDRAWCREATE, LPDIRECTDRAWENUMERATEEXA); + +#ifdef __cplusplus +} +#endif /* __cplusplus */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/dllentry.cpp
Added
@@ -0,0 +1,367 @@ +//------------------------------------------------------------------------------ +// File: DlleEntry.cpp +// +// Desc: DirectShow base classes - implements classes used to support dll +// entry points for COM objects. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include <initguid.h> + +#ifdef DEBUG +#ifdef UNICODE +#ifndef _UNICODE +#define _UNICODE +#endif // _UNICODE +#endif // UNICODE + +#include <tchar.h> +#endif // DEBUG +#include <strsafe.h> + +extern CFactoryTemplate g_Templates; +extern int g_cTemplates; + +HINSTANCE g_hInst; +DWORD g_amPlatform; // VER_PLATFORM_WIN32_WINDOWS etc... (from GetVersionEx) +OSVERSIONINFO g_osInfo; + +// +// an instance of this is created by the DLLGetClassObject entrypoint +// it uses the CFactoryTemplate object it is given to support the +// IClassFactory interface + +class CClassFactory : public IClassFactory, public CBaseObject +{ + +private: + const CFactoryTemplate *const m_pTemplate; + + ULONG m_cRef; + + static int m_cLocked; +public: + CClassFactory(const CFactoryTemplate *); + + // IUnknown + STDMETHODIMP QueryInterface(REFIID riid, __deref_out void ** ppv); + STDMETHODIMP_(ULONG)AddRef(); + STDMETHODIMP_(ULONG)Release(); + + // IClassFactory + STDMETHODIMP CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, __deref_out void **pv); + STDMETHODIMP LockServer(BOOL fLock); + + // allow DLLGetClassObject to know about global server lock status + static BOOL IsLocked() { + return (m_cLocked > 0); + }; +}; + +// process-wide dll locked state +int CClassFactory::m_cLocked = 0; + +CClassFactory::CClassFactory(const CFactoryTemplate *pTemplate) +: CBaseObject(NAME("Class Factory")) +, m_cRef(0) +, m_pTemplate(pTemplate) +{ +} + + +STDMETHODIMP +CClassFactory::QueryInterface(REFIID riid,__deref_out void **ppv) +{ + CheckPointer(ppv,E_POINTER) + ValidateReadWritePtr(ppv,sizeof(PVOID)); + *ppv = NULL; + + // any interface on this object is the object pointer. + if ((riid == IID_IUnknown) || (riid == IID_IClassFactory)) { + *ppv = (LPVOID) this; + // AddRef returned interface pointer + ((LPUNKNOWN) *ppv)->AddRef(); + return NOERROR; + } + + return ResultFromScode(E_NOINTERFACE); +} + + +STDMETHODIMP_(ULONG) +CClassFactory::AddRef() +{ + return ++m_cRef; +} + +STDMETHODIMP_(ULONG) +CClassFactory::Release() +{ + LONG lRef = InterlockedDecrement((volatile LONG *)&m_cRef); + if (lRef == 0) { + delete this; + return 0; + } else { + return lRef; + } +} + +STDMETHODIMP +CClassFactory::CreateInstance( + LPUNKNOWN pUnkOuter, + REFIID riid, + __deref_out void **pv) +{ + CheckPointer(pv,E_POINTER) + ValidateReadWritePtr(pv,sizeof(void *)); + *pv = NULL; + + /* Enforce the normal OLE rules regarding interfaces and delegation */ + + if (pUnkOuter != NULL) { + if (IsEqualIID(riid,IID_IUnknown) == FALSE) { + *pv = NULL; + return ResultFromScode(E_NOINTERFACE); + } + } + + /* Create the new object through the derived class's create function */ + + HRESULT hr = NOERROR; + CUnknown *pObj = m_pTemplate->CreateInstance(pUnkOuter, &hr); + + if (pObj == NULL) { + *pv = NULL; + if (SUCCEEDED(hr)) { + hr = E_OUTOFMEMORY; + } + return hr; + } + + /* Delete the object if we got a construction error */ + + if (FAILED(hr)) { + delete pObj; + *pv = NULL; + return hr; + } + + /* Get a reference counted interface on the object */ + + /* We wrap the non-delegating QI with NDAddRef & NDRelease. */ + /* This protects any outer object from being prematurely */ + /* released by an inner object that may have to be created */ + /* in order to supply the requested interface. */ + pObj->NonDelegatingAddRef(); + hr = pObj->NonDelegatingQueryInterface(riid, pv); + pObj->NonDelegatingRelease(); + /* Note that if NonDelegatingQueryInterface fails, it will */ + /* not increment the ref count, so the NonDelegatingRelease */ + /* will drop the ref back to zero and the object will "self-*/ + /* destruct". Hence we don't need additional tidy-up code */ + /* to cope with NonDelegatingQueryInterface failing. */ + + if (SUCCEEDED(hr)) { + ASSERT(*pv); + } + + return hr; +} + +STDMETHODIMP +CClassFactory::LockServer(BOOL fLock) +{ + if (fLock) { + m_cLocked++; + } else { + m_cLocked--; + } + return NOERROR; +} + + +// --- COM entrypoints ----------------------------------------- + +//called by COM to get the class factory object for a given class +__control_entrypoint(DllExport) STDAPI +DllGetClassObject( + __in REFCLSID rClsID, + __in REFIID riid, + __deref_out void **pv) +{ + *pv = NULL; + if (!(riid == IID_IUnknown) && !(riid == IID_IClassFactory)) { + return E_NOINTERFACE; + } + + // traverse the array of templates looking for one with this + // class id + for (int i = 0; i < g_cTemplates; i++) { + const CFactoryTemplate * pT = &g_Templatesi; + if (pT->IsClassID(rClsID)) { + + // found a template - make a class factory based on this + // template + + *pv = (LPVOID) (LPUNKNOWN) new CClassFactory(pT); + if (*pv == NULL) { + return E_OUTOFMEMORY; + } + ((LPUNKNOWN)*pv)->AddRef(); + return NOERROR; + } + } + return CLASS_E_CLASSNOTAVAILABLE; +} + +// +// Call any initialization routines +// +void +DllInitClasses(BOOL bLoading) +{ + int i; + + // traverse the array of templates calling the init routine + // if they have one + for (i = 0; i < g_cTemplates; i++) { + const CFactoryTemplate * pT = &g_Templatesi; + if (pT->m_lpfnInit != NULL) { + (*pT->m_lpfnInit)(bLoading, pT->m_ClsID); + } + } + +} + +// called by COM to determine if this dll can be unloaded +// return ok unless there are outstanding objects or a lock requested +// by IClassFactory::LockServer +// +// CClassFactory has a static function that can tell us about the locks, +// and CCOMObject has a static function that can tell us about the active +// object count +STDAPI +DllCanUnloadNow() +{ + DbgLog((LOG_MEMORY,2,TEXT("DLLCanUnloadNow called - IsLocked = %d, Active objects = %d"), + CClassFactory::IsLocked(), + CBaseObject::ObjectsActive())); + + if (CClassFactory::IsLocked() || CBaseObject::ObjectsActive()) { + return S_FALSE; + } else { + return S_OK; + } +} + + +// --- standard WIN32 entrypoints -------------------------------------- + + +extern "C" void __cdecl __security_init_cookie(void); +extern "C" BOOL WINAPI _DllEntryPoint(HINSTANCE, ULONG, __inout_opt LPVOID); +#pragma comment(linker, "/merge:.CRT=.rdata") + +extern "C" +DECLSPEC_NOINLINE +BOOL +WINAPI +DllEntryPoint( + HINSTANCE hInstance, + ULONG ulReason, + __inout_opt LPVOID pv + ) +{ + if ( ulReason == DLL_PROCESS_ATTACH ) { + // Must happen before any other code is executed. Thankfully - it's re-entrant + __security_init_cookie(); + } + return _DllEntryPoint(hInstance, ulReason, pv); +} + + +DECLSPEC_NOINLINE +BOOL +WINAPI +_DllEntryPoint( + HINSTANCE hInstance, + ULONG ulReason, + __inout_opt LPVOID pv + ) +{ +#ifdef DEBUG + extern bool g_fDbgInDllEntryPoint; + g_fDbgInDllEntryPoint = true; +#endif + + switch (ulReason) + { + + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hInstance); + DbgInitialise(hInstance); + + { + // The platform identifier is used to work out whether + // full unicode support is available or not. Hence the + // default will be the lowest common denominator - i.e. N/A + g_amPlatform = VER_PLATFORM_WIN32_WINDOWS; // win95 assumed in case GetVersionEx fails + + g_osInfo.dwOSVersionInfoSize = sizeof(g_osInfo); + if (GetVersionEx(&g_osInfo)) { + g_amPlatform = g_osInfo.dwPlatformId; + } else { + DbgLog((LOG_ERROR, 1, TEXT("Failed to get the OS platform, assuming Win95"))); + } + } + + g_hInst = hInstance; + DllInitClasses(TRUE); + break; + + case DLL_PROCESS_DETACH: + DllInitClasses(FALSE); + +#ifdef DEBUG + if (CBaseObject::ObjectsActive()) { + DbgSetModuleLevel(LOG_MEMORY, 2); + TCHAR szInfo512; + extern TCHAR m_ModuleName; // Cut down module name + + TCHAR FullName_MAX_PATH; // Load the full path and module name + TCHAR *pName; // Searches from the end for a backslash + + GetModuleFileName(NULL,FullName,_MAX_PATH); + pName = _tcsrchr(FullName,'\\'); + if (pName == NULL) { + pName = FullName; + } else { + pName++; + } + + (void)StringCchPrintf(szInfo, NUMELMS(szInfo), TEXT("Executable: %s Pid %x Tid %x. "), + pName, GetCurrentProcessId(), GetCurrentThreadId()); + + (void)StringCchPrintf(szInfo+lstrlen(szInfo), NUMELMS(szInfo) - lstrlen(szInfo), TEXT("Module %s, %d objects left active!"), + m_ModuleName, CBaseObject::ObjectsActive()); + DbgAssert(szInfo, TEXT(__FILE__),__LINE__); + + // If running remotely wait for the Assert to be acknowledged + // before dumping out the object register + DbgDumpObjectRegister(); + } + DbgTerminate(); +#endif + break; + } + +#ifdef DEBUG + g_fDbgInDllEntryPoint = false; +#endif + return TRUE; +} + +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/dllsetup.cpp
Added
@@ -0,0 +1,693 @@ +//------------------------------------------------------------------------------ +// File: DllSetup.cpp +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include <strsafe.h> + +//--------------------------------------------------------------------------- +// defines + +#define MAX_KEY_LEN 260 + + +//--------------------------------------------------------------------------- +// externally defined functions/variable + +extern int g_cTemplates; +extern CFactoryTemplate g_Templates; + +//--------------------------------------------------------------------------- +// +// EliminateSubKey +// +// Try to enumerate all keys under this one. +// if we find anything, delete it completely. +// Otherwise just delete it. +// +// note - this was pinched/duplicated from +// Filgraph\Mapper.cpp - so should it be in +// a lib somewhere? +// +//--------------------------------------------------------------------------- + +STDAPI +EliminateSubKey( HKEY hkey, LPCTSTR strSubKey ) +{ + HKEY hk; + if (0 == lstrlen(strSubKey) ) { + // defensive approach + return E_FAIL; + } + + LONG lreturn = RegOpenKeyEx( hkey + , strSubKey + , 0 + , MAXIMUM_ALLOWED + , &hk ); + + ASSERT( lreturn == ERROR_SUCCESS + || lreturn == ERROR_FILE_NOT_FOUND + || lreturn == ERROR_INVALID_HANDLE ); + + if( ERROR_SUCCESS == lreturn ) + { + // Keep on enumerating the first (zero-th) + // key and deleting that + + for( ; ; ) + { + TCHAR BufferMAX_KEY_LEN; + DWORD dw = MAX_KEY_LEN; + FILETIME ft; + + lreturn = RegEnumKeyEx( hk + , 0 + , Buffer + , &dw + , NULL + , NULL + , NULL + , &ft); + + ASSERT( lreturn == ERROR_SUCCESS + || lreturn == ERROR_NO_MORE_ITEMS ); + + if( ERROR_SUCCESS == lreturn ) + { + EliminateSubKey(hk, Buffer); + } + else + { + break; + } + } + + RegCloseKey(hk); + RegDeleteKey(hkey, strSubKey); + } + + return NOERROR; +} + + +//--------------------------------------------------------------------------- +// +// AMovieSetupRegisterServer() +// +// registers specfied file "szFileName" as server for +// CLSID "clsServer". A description is also required. +// The ThreadingModel and ServerType are optional, as +// they default to InprocServer32 (i.e. dll) and Both. +// +//--------------------------------------------------------------------------- + +STDAPI +AMovieSetupRegisterServer( CLSID clsServer + , LPCWSTR szDescription + , LPCWSTR szFileName + , LPCWSTR szThreadingModel = L"Both" + , LPCWSTR szServerType = L"InprocServer32" ) +{ + // temp buffer + // + TCHAR achTempMAX_PATH; + + // convert CLSID uuid to string and write + // out subkey as string - CLSID\{} + // + OLECHAR szCLSIDCHARS_IN_GUID; + HRESULT hr = StringFromGUID2( clsServer + , szCLSID + , CHARS_IN_GUID ); + ASSERT( SUCCEEDED(hr) ); + + // create key + // + HKEY hkey; + (void)StringCchPrintf( achTemp, NUMELMS(achTemp), TEXT("CLSID\\%ls"), szCLSID ); + LONG lreturn = RegCreateKey( HKEY_CLASSES_ROOT + , (LPCTSTR)achTemp + , &hkey ); + if( ERROR_SUCCESS != lreturn ) + { + return AmHresultFromWin32(lreturn); + } + + // set description string + // + + (void)StringCchPrintf( achTemp, NUMELMS(achTemp), TEXT("%ls"), szDescription ); + lreturn = RegSetValue( hkey + , (LPCTSTR)NULL + , REG_SZ + , achTemp + , sizeof(achTemp) ); + if( ERROR_SUCCESS != lreturn ) + { + RegCloseKey( hkey ); + return AmHresultFromWin32(lreturn); + } + + // create CLSID\\{"CLSID"}\\"ServerType" key, + // using key to CLSID\\{"CLSID"} passed back by + // last call to RegCreateKey(). + // + HKEY hsubkey; + + (void)StringCchPrintf( achTemp, NUMELMS(achTemp), TEXT("%ls"), szServerType ); + lreturn = RegCreateKey( hkey + , achTemp + , &hsubkey ); + if( ERROR_SUCCESS != lreturn ) + { + RegCloseKey( hkey ); + return AmHresultFromWin32(lreturn); + } + + // set Server string + // + (void)StringCchPrintf( achTemp, NUMELMS(achTemp), TEXT("%ls"), szFileName ); + lreturn = RegSetValue( hsubkey + , (LPCTSTR)NULL + , REG_SZ + , (LPCTSTR)achTemp + , sizeof(TCHAR) * (lstrlen(achTemp)+1) ); + if( ERROR_SUCCESS != lreturn ) + { + RegCloseKey( hkey ); + RegCloseKey( hsubkey ); + return AmHresultFromWin32(lreturn); + } + + (void)StringCchPrintf( achTemp, NUMELMS(achTemp), TEXT("%ls"), szThreadingModel ); + lreturn = RegSetValueEx( hsubkey + , TEXT("ThreadingModel") + , 0L + , REG_SZ + , (CONST BYTE *)achTemp + , sizeof(TCHAR) * (lstrlen(achTemp)+1) ); + + // close hkeys + // + RegCloseKey( hkey ); + RegCloseKey( hsubkey ); + + // and return + // + return HRESULT_FROM_WIN32(lreturn); + +} + + +//--------------------------------------------------------------------------- +// +// AMovieSetupUnregisterServer() +// +// default ActiveMovie dll setup function +// - to use must be called from an exported +// function named DllRegisterServer() +// +//--------------------------------------------------------------------------- + +STDAPI +AMovieSetupUnregisterServer( CLSID clsServer ) +{ + // convert CLSID uuid to string and write + // out subkey CLSID\{} + // + OLECHAR szCLSIDCHARS_IN_GUID; + HRESULT hr = StringFromGUID2( clsServer + , szCLSID + , CHARS_IN_GUID ); + ASSERT( SUCCEEDED(hr) ); + + TCHAR achBufferMAX_KEY_LEN; + (void)StringCchPrintf( achBuffer, NUMELMS(achBuffer), TEXT("CLSID\\%ls"), szCLSID ); + + // delete subkey + // + + hr = EliminateSubKey( HKEY_CLASSES_ROOT, achBuffer ); + ASSERT( SUCCEEDED(hr) ); + + // return + // + return NOERROR; +} + + +//--------------------------------------------------------------------------- +// +// AMovieSetupRegisterFilter through IFilterMapper2 +// +//--------------------------------------------------------------------------- + +STDAPI +AMovieSetupRegisterFilter2( const AMOVIESETUP_FILTER * const psetupdata + , IFilterMapper2 * pIFM2 + , BOOL bRegister ) +{ + DbgLog((LOG_TRACE, 3, TEXT("= AMovieSetupRegisterFilter"))); + + // check we've got data + // + if( NULL == psetupdata ) return S_FALSE; + + + // unregister filter + // (as pins are subkeys of filter's CLSID key + // they do not need to be removed separately). + // + DbgLog((LOG_TRACE, 3, TEXT("= = unregister filter"))); + HRESULT hr = pIFM2->UnregisterFilter( + 0, // default category + 0, // default instance name + *psetupdata->clsID ); + + + if( bRegister ) + { + REGFILTER2 rf2; + rf2.dwVersion = 1; + rf2.dwMerit = psetupdata->dwMerit; + rf2.cPins = psetupdata->nPins; + rf2.rgPins = psetupdata->lpPin; + + // register filter + // + DbgLog((LOG_TRACE, 3, TEXT("= = register filter"))); + hr = pIFM2->RegisterFilter(*psetupdata->clsID + , psetupdata->strName + , 0 // moniker + , 0 // category + , NULL // instance + , &rf2); + } + + // handle one acceptable "error" - that + // of filter not being registered! + // (couldn't find a suitable #define'd + // name for the error!) + // + if( 0x80070002 == hr) + return NOERROR; + else + return hr; +} + + +//--------------------------------------------------------------------------- +// +// RegisterAllServers() +// +//--------------------------------------------------------------------------- + +STDAPI +RegisterAllServers( LPCWSTR szFileName, BOOL bRegister ) +{ + HRESULT hr = NOERROR; + + for( int i = 0; i < g_cTemplates; i++ ) + { + // get i'th template + // + const CFactoryTemplate *pT = &g_Templatesi; + + DbgLog((LOG_TRACE, 2, TEXT("- - register %ls"), + (LPCWSTR)pT->m_Name )); + + // register CLSID and InprocServer32 + // + if( bRegister ) + { + hr = AMovieSetupRegisterServer( *(pT->m_ClsID) + , (LPCWSTR)pT->m_Name + , szFileName ); + } + else + { + hr = AMovieSetupUnregisterServer( *(pT->m_ClsID) ); + } + + // check final error for this pass + // and break loop if we failed + // + if( FAILED(hr) ) + break; + } + + return hr; +} + + +//--------------------------------------------------------------------------- +// +// AMovieDllRegisterServer2() +// +// default ActiveMovie dll setup function +// - to use must be called from an exported +// function named DllRegisterServer() +// +// this function is table driven using the +// static members of the CFactoryTemplate +// class defined in the dll. +// +// it registers the Dll as the InprocServer32 +// and then calls the IAMovieSetup.Register +// method. +// +//--------------------------------------------------------------------------- + +STDAPI +AMovieDllRegisterServer2( BOOL bRegister ) +{ + HRESULT hr = NOERROR; + + DbgLog((LOG_TRACE, 2, TEXT("AMovieDllRegisterServer2()"))); + + // get file name (where g_hInst is the + // instance handle of the filter dll) + // + WCHAR achFileNameMAX_PATH; + + // WIN95 doesn't support GetModuleFileNameW + // + { + char achTempMAX_PATH; + + DbgLog((LOG_TRACE, 2, TEXT("- get module file name"))); + + // g_hInst handle is set in our dll entry point. Make sure + // DllEntryPoint in dllentry.cpp is called + ASSERT(g_hInst != 0); + + if( 0 == GetModuleFileNameA( g_hInst + , achTemp + , sizeof(achTemp) ) ) + { + // we've failed! + DWORD dwerr = GetLastError(); + return AmHresultFromWin32(dwerr); + } + + MultiByteToWideChar( CP_ACP + , 0L + , achTemp + , lstrlenA(achTemp) + 1 + , achFileName + , NUMELMS(achFileName) ); + } + + // + // first registering, register all OLE servers + // + if( bRegister ) + { + DbgLog((LOG_TRACE, 2, TEXT("- register OLE Servers"))); + hr = RegisterAllServers( achFileName, TRUE ); + } + + // + // next, register/unregister all filters + // + + if( SUCCEEDED(hr) ) + { + // init is ref counted so call just in case + // we're being called cold. + // + DbgLog((LOG_TRACE, 2, TEXT("- CoInitialize"))); + hr = CoInitialize( (LPVOID)NULL ); + ASSERT( SUCCEEDED(hr) ); + + // get hold of IFilterMapper2 + // + DbgLog((LOG_TRACE, 2, TEXT("- obtain IFilterMapper2"))); + IFilterMapper2 *pIFM2 = 0; + IFilterMapper *pIFM = 0; + hr = CoCreateInstance( CLSID_FilterMapper2 + , NULL + , CLSCTX_INPROC_SERVER + , IID_IFilterMapper2 + , (void **)&pIFM2 ); + if(FAILED(hr)) + { + DbgLog((LOG_TRACE, 2, TEXT("- trying IFilterMapper instead"))); + + hr = CoCreateInstance( + CLSID_FilterMapper, + NULL, + CLSCTX_INPROC_SERVER, + IID_IFilterMapper, + (void **)&pIFM); + } + if( SUCCEEDED(hr) ) + { + // scan through array of CFactoryTemplates + // registering servers and filters. + // + DbgLog((LOG_TRACE, 2, TEXT("- register Filters"))); + for( int i = 0; i < g_cTemplates; i++ ) + { + // get i'th template + // + const CFactoryTemplate *pT = &g_Templatesi; + + if( NULL != pT->m_pAMovieSetup_Filter ) + { + DbgLog((LOG_TRACE, 2, TEXT("- - register %ls"), (LPCWSTR)pT->m_Name )); + + if(pIFM2) + { + hr = AMovieSetupRegisterFilter2( pT->m_pAMovieSetup_Filter, pIFM2, bRegister ); + } + else + { + hr = AMovieSetupRegisterFilter( pT->m_pAMovieSetup_Filter, pIFM, bRegister ); + } + } + + // check final error for this pass + // and break loop if we failed + // + if( FAILED(hr) ) + break; + } + + // release interface + // + if(pIFM2) + pIFM2->Release(); + else + pIFM->Release(); + + } + + // and clear up + // + CoFreeUnusedLibraries(); + CoUninitialize(); + } + + // + // if unregistering, unregister all OLE servers + // + if( SUCCEEDED(hr) && !bRegister ) + { + DbgLog((LOG_TRACE, 2, TEXT("- register OLE Servers"))); + hr = RegisterAllServers( achFileName, FALSE ); + } + + DbgLog((LOG_TRACE, 2, TEXT("- return %0x"), hr)); + return hr; +} + + +//--------------------------------------------------------------------------- +// +// AMovieDllRegisterServer() +// +// default ActiveMovie dll setup function +// - to use must be called from an exported +// function named DllRegisterServer() +// +// this function is table driven using the +// static members of the CFactoryTemplate +// class defined in the dll. +// +// it registers the Dll as the InprocServer32 +// and then calls the IAMovieSetup.Register +// method. +// +//--------------------------------------------------------------------------- + + +STDAPI +AMovieDllRegisterServer( void ) +{ + HRESULT hr = NOERROR; + + // get file name (where g_hInst is the + // instance handle of the filter dll) + // + WCHAR achFileNameMAX_PATH; + + { + // WIN95 doesn't support GetModuleFileNameW + // + char achTempMAX_PATH; + + if( 0 == GetModuleFileNameA( g_hInst + , achTemp + , sizeof(achTemp) ) ) + { + // we've failed! + DWORD dwerr = GetLastError(); + return AmHresultFromWin32(dwerr); + } + + MultiByteToWideChar( CP_ACP + , 0L + , achTemp + , lstrlenA(achTemp) + 1 + , achFileName + , NUMELMS(achFileName) ); + } + + // scan through array of CFactoryTemplates + // registering servers and filters. + // + for( int i = 0; i < g_cTemplates; i++ ) + { + // get i'th template + // + const CFactoryTemplate *pT = &g_Templatesi; + + // register CLSID and InprocServer32 + // + hr = AMovieSetupRegisterServer( *(pT->m_ClsID) + , (LPCWSTR)pT->m_Name + , achFileName ); + + // instantiate all servers and get hold of + // IAMovieSetup, if implemented, and call + // IAMovieSetup.Register() method + // + if( SUCCEEDED(hr) && (NULL != pT->m_lpfnNew) ) + { + // instantiate object + // + PAMOVIESETUP psetup; + hr = CoCreateInstance( *(pT->m_ClsID) + , 0 + , CLSCTX_INPROC_SERVER + , IID_IAMovieSetup + , reinterpret_cast<void**>(&psetup) ); + if( SUCCEEDED(hr) ) + { + hr = psetup->Unregister(); + if( SUCCEEDED(hr) ) + hr = psetup->Register(); + psetup->Release(); + } + else + { + if( (E_NOINTERFACE == hr ) + || (VFW_E_NEED_OWNER == hr ) ) + hr = NOERROR; + } + } + + // check final error for this pass + // and break loop if we failed + // + if( FAILED(hr) ) + break; + + } // end-for + + return hr; +} + + +//--------------------------------------------------------------------------- +// +// AMovieDllUnregisterServer() +// +// default ActiveMovie dll uninstall function +// - to use must be called from an exported +// function named DllRegisterServer() +// +// this function is table driven using the +// static members of the CFactoryTemplate +// class defined in the dll. +// +// it calls the IAMovieSetup.Unregister +// method and then unregisters the Dll +// as the InprocServer32 +// +//--------------------------------------------------------------------------- + +STDAPI +AMovieDllUnregisterServer() +{ + // initialize return code + // + HRESULT hr = NOERROR; + + // scan through CFactory template and unregister + // all OLE servers and filters. + // + for( int i = g_cTemplates; i--; ) + { + // get i'th template + // + const CFactoryTemplate *pT = &g_Templatesi; + + // check method exists + // + if( NULL != pT->m_lpfnNew ) + { + // instantiate object + // + PAMOVIESETUP psetup; + hr = CoCreateInstance( *(pT->m_ClsID) + , 0 + , CLSCTX_INPROC_SERVER + , IID_IAMovieSetup + , reinterpret_cast<void**>(&psetup) ); + if( SUCCEEDED(hr) ) + { + hr = psetup->Unregister(); + psetup->Release(); + } + else + { + if( (E_NOINTERFACE == hr ) + || (VFW_E_NEED_OWNER == hr ) ) + hr = NOERROR; + } + } + + // unregister CLSID and InprocServer32 + // + if( SUCCEEDED(hr) ) + { + hr = AMovieSetupUnregisterServer( *(pT->m_ClsID) ); + } + + // check final error for this pass + // and break loop if we failed + // + if( FAILED(hr) ) + break; + } + + return hr; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/dllsetup.h
Added
@@ -0,0 +1,46 @@ +//------------------------------------------------------------------------------ +// File: DllSetup.h +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// To be self registering, OLE servers must +// export functions named DllRegisterServer +// and DllUnregisterServer. To allow use of +// custom and default implementations the +// defaults are named AMovieDllRegisterServer +// and AMovieDllUnregisterServer. +// +// To the use the default implementation you +// must provide stub functions. +// +// i.e. STDAPI DllRegisterServer() +// { +// return AMovieDllRegisterServer(); +// } +// +// STDAPI DllUnregisterServer() +// { +// return AMovieDllUnregisterServer(); +// } +// +// +// AMovieDllRegisterServer calls IAMovieSetup.Register(), and +// AMovieDllUnregisterServer calls IAMovieSetup.Unregister(). + +STDAPI AMovieDllRegisterServer2( BOOL ); +STDAPI AMovieDllRegisterServer(); +STDAPI AMovieDllUnregisterServer(); + +// helper functions +STDAPI EliminateSubKey( HKEY, LPCTSTR ); + + +STDAPI +AMovieSetupRegisterFilter2( const AMOVIESETUP_FILTER * const psetupdata + , IFilterMapper2 * pIFM2 + , BOOL bRegister ); +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/dxmperf.h
Added
@@ -0,0 +1,250 @@ +//------------------------------------------------------------------------------ +// File: DXMPerf.h +// +// Desc: Macros for DirectShow performance logging. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef _DXMPERF_H_ +#define _DXMPERF_H_ + +#include <perfstruct.h> +#include "perflog.h" + +#ifdef _IA64_ +extern "C" unsigned __int64 __getReg( int whichReg ); +#pragma intrinsic(__getReg) +#endif // _IA64_ + + +inline ULONGLONG _RDTSC( void ) { +#ifdef _X86_ + LARGE_INTEGER li; + __asm { + _emit 0x0F + _emit 0x31 + mov li.LowPart,eax + mov li.HighPart,edx + } + return li.QuadPart; + +#if 0 // This isn't tested yet + +#elif defined (_IA64_) + +#define INL_REGID_APITC 3116 + return __getReg( INL_REGID_APITC ); + +#endif // 0 + +#else // unsupported platform + // not implemented on non x86/IA64 platforms + return 0; +#endif // _X86_/_IA64_ +} + +#define DXMPERF_VIDEOREND 0x00000001 +#define DXMPERF_AUDIOGLITCH 0x00000002 +//#define GETTIME_BIT 0x00000001 +//#define AUDIOREND_BIT 0x00000004 +//#define FRAMEDROP_BIT 0x00000008 +#define AUDIOBREAK_BIT 0x00000010 +#define DXMPERF_AUDIORECV 0x00000020 +#define DXMPERF_AUDIOSLAVE 0x00000040 +#define DXMPERF_AUDIOBREAK 0x00000080 + +#define PERFLOG_CTOR( name, iface ) +#define PERFLOG_DTOR( name, iface ) +#define PERFLOG_DELIVER( name, source, dest, sample, pmt ) +#define PERFLOG_RECEIVE( name, source, dest, sample, pmt ) +#define PERFLOG_RUN( name, iface, time, oldstate ) +#define PERFLOG_PAUSE( name, iface, oldstate ) +#define PERFLOG_STOP( name, iface, oldstate ) +#define PERFLOG_JOINGRAPH( name, iface, graph ) +#define PERFLOG_GETBUFFER( allocator, sample ) +#define PERFLOG_RELBUFFER( allocator, sample ) +#define PERFLOG_CONNECT( connector, connectee, status, pmt ) +#define PERFLOG_RXCONNECT( connector, connectee, status, pmt ) +#define PERFLOG_DISCONNECT( disconnector, disconnectee, status ) + +#define PERFLOG_GETTIME( clock, time ) /*{ \ + PERFINFO_WMI_GETTIME perfData; \ + if (NULL != g_pTraceEvent) { \ + memset( &perfData, 0, sizeof( perfData ) ); \ + perfData.header.Size = sizeof( perfData ); \ + perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ + perfData.header.Guid = GUID_GETTIME; \ + perfData.data.cycleCounter = _RDTSC(); \ + perfData.data.dshowClock = (ULONGLONG) (time); \ + if (g_perfMasksGETTIME_INDEX & GETTIME_BIT) \ + (*g_pTraceEvent)( g_traceHandle, (PEVENT_TRACE_HEADER) &perfData ); \ + } \ + }*/ + +#define PERFLOG_AUDIOREND( clocktime, sampletime, psample, bytetime, cbytes ) /*{ \ + PERFINFO_WMI_AVREND perfData; \ + if (NULL != g_pTraceEvent) { \ + memset( &perfData, 0, sizeof( perfData ) ); \ + perfData.header.Size = sizeof( perfData ); \ + perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ + perfData.header.Guid = GUID_AUDIOREND; \ + perfData.data.cycleCounter = _RDTSC(); \ + perfData.data.dshowClock = (clocktime); \ + perfData.data.sampleTime = (sampletime); \ + if (g_perfMasksAUDIOREND_INDEX & AUDIOREND_BIT) \ + (*g_pTraceEvent)( g_traceHandle, (PEVENT_TRACE_HEADER) &perfData ); \ + } \ + }*/ + +#define PERFLOG_AUDIORECV(StreamTime,SampleStart,SampleStop,Discontinuity,Duration) \ + if (PerflogEnableFlags & DXMPERF_AUDIORECV) { \ + PERFINFO_WMI_AUDIORECV perfData; \ + memset( &perfData, 0, sizeof( perfData ) ); \ + perfData.header.Size = sizeof( perfData ); \ + perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ + perfData.header.Guid = GUID_AUDIORECV; \ + perfData.data.streamTime = StreamTime; \ + perfData.data.sampleStart = SampleStart; \ + perfData.data.sampleStop = SampleStop; \ + perfData.data.discontinuity = Discontinuity; \ + perfData.data.hwduration = Duration; \ + PerflogTraceEvent((PEVENT_TRACE_HEADER) &perfData); \ + } + +#define PERFLOG_AUDIOSLAVE(MasterClock,SlaveClock,ErrorAccum,LastHighErrorSeen,LastLowErrorSeen) \ + if (PerflogEnableFlags & DXMPERF_AUDIOSLAVE) { \ + PERFINFO_WMI_AUDIOSLAVE perfData; \ + memset( &perfData, 0, sizeof( perfData ) ); \ + perfData.header.Size = sizeof( perfData ); \ + perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ + perfData.header.Guid = GUID_AUDIOSLAVE; \ + perfData.data.masterClock = MasterClock; \ + perfData.data.slaveClock = SlaveClock; \ + perfData.data.errorAccum = ErrorAccum; \ + perfData.data.lastHighErrorSeen = LastHighErrorSeen;\ + perfData.data.lastLowErrorSeen = LastLowErrorSeen; \ + PerflogTraceEvent((PEVENT_TRACE_HEADER) &perfData); \ + } + +#define PERFLOG_AUDIOADDBREAK(IterNextWrite,OffsetNextWrite,IterWrite,OffsetWrite) \ + if (PerflogEnableFlags & DXMPERF_AUDIOBREAK) { \ + PERFINFO_WMI_AUDIOADDBREAK perfData; \ + memset( &perfData, 0, sizeof( perfData ) ); \ + perfData.header.Size = sizeof( perfData ); \ + perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ + perfData.header.Guid = GUID_AUDIOADDBREAK; \ + perfData.data.iterNextWrite = IterNextWrite; \ + perfData.data.offsetNextWrite = OffsetNextWrite; \ + perfData.data.iterWrite = IterWrite; \ + perfData.data.offsetWrite = OffsetWrite; \ + PerflogTraceEvent((PEVENT_TRACE_HEADER) &perfData); \ + } + +#define PERFLOG_VIDEOREND( sampletime, clocktime, psample ) \ + if (PerflogEnableFlags & DXMPERF_VIDEOREND) { \ + PERFINFO_WMI_AVREND perfData; \ + memset( &perfData, 0, sizeof( perfData ) ); \ + perfData.header.Size = sizeof( perfData ); \ + perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ + perfData.header.Guid = GUID_VIDEOREND; \ + perfData.data.cycleCounter = _RDTSC(); \ + perfData.data.dshowClock = (clocktime); \ + perfData.data.sampleTime = (sampletime); \ + PerflogTraceEvent ((PEVENT_TRACE_HEADER) &perfData); \ + } + +#define PERFLOG_AUDIOGLITCH( instance, glitchtype, currenttime, previoustime ) \ + if (PerflogEnableFlags & DXMPERF_AUDIOGLITCH) { \ + PERFINFO_WMI_AUDIOGLITCH perfData; \ + memset( &perfData, 0, sizeof( perfData ) ); \ + perfData.header.Size = sizeof( perfData ); \ + perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ + perfData.header.Guid = GUID_DSOUNDGLITCH; \ + perfData.data.cycleCounter = _RDTSC(); \ + perfData.data.glitchType = (glitchtype); \ + perfData.data.sampleTime = (currenttime); \ + perfData.data.previousTime = (previoustime); \ + perfData.data.instanceId = (instance); \ + PerflogTraceEvent ((PEVENT_TRACE_HEADER) &perfData); \ + } + +#define PERFLOG_FRAMEDROP( sampletime, clocktime, psample, renderer ) /*{ \ + PERFINFO_WMI_FRAMEDROP perfData; \ + if (NULL != g_pTraceEvent) { \ + memset( &perfData, 0, sizeof( perfData ) ); \ + perfData.header.Size = sizeof( perfData ); \ + perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ + perfData.header.Guid = GUID_FRAMEDROP; \ + perfData.data.cycleCounter = _RDTSC(); \ + perfData.data.dshowClock = (clocktime); \ + perfData.data.frameTime = (sampletime); \ + if (g_perfMasksFRAMEDROP_INDEX & FRAMEDROP_BIT) \ + (*g_pTraceEvent)( g_traceHandle, (PEVENT_TRACE_HEADER) &perfData ); \ + } \ + }*/ + +/* +#define PERFLOG_AUDIOBREAK( nextwrite, writepos, msecs ) { \ + PERFINFO_WMI_AUDIOBREAK perfData; \ + if (NULL != g_pTraceEvent) { \ + memset( &perfData, 0, sizeof( perfData ) ); \ + perfData.header.Size = sizeof( perfData ); \ + perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ + perfData.header.Guid = GUID_AUDIOBREAK; \ + perfData.data.cycleCounter = _RDTSC(); \ + perfData.data.dshowClock = (writepos); \ + perfData.data.sampleTime = (nextwrite); \ + perfData.data.sampleDuration = (msecs); \ + if (g_perfMasksAUDIOBREAK_INDEX & AUDIOBREAK_BIT) \ + (*g_pTraceEvent)( g_traceHandle, (PEVENT_TRACE_HEADER) &perfData ); \ + } \ + } +*/ + +#define PERFLOG_AUDIOBREAK( nextwrite, writepos, msecs ) \ + if (PerflogEnableFlags & AUDIOBREAK_BIT) { \ + PERFINFO_WMI_AUDIOBREAK perfData; \ + memset( &perfData, 0, sizeof( perfData ) ); \ + perfData.header.Size = sizeof( perfData ); \ + perfData.header.Flags = WNODE_FLAG_TRACED_GUID; \ + perfData.header.Guid = GUID_AUDIOBREAK; \ + perfData.data.cycleCounter = _RDTSC(); \ + perfData.data.dshowClock = (writepos); \ + perfData.data.sampleTime = (nextwrite); \ + perfData.data.sampleDuration = (msecs); \ + PerflogTraceEvent ((PEVENT_TRACE_HEADER) &perfData); \ + } \ + + +inline +VOID PERFLOG_STREAMTRACE( + ULONG Level, + ULONG Id, + ULONGLONG DShowClock, + ULONGLONG Data1, + ULONGLONG Data2, + ULONGLONG Data3, + ULONGLONG Data4 + ) +{ + if (Level <= PerflogModuleLevel) + { + PERFINFO_WMI_STREAMTRACE perfData; + memset( &perfData, 0, sizeof( perfData ) ); + perfData.header.Size = sizeof( perfData ); + perfData.header.Flags = WNODE_FLAG_TRACED_GUID; + perfData.header.Guid = GUID_STREAMTRACE; + perfData.data.dshowClock = DShowClock; + perfData.data.id = Id; + perfData.data.data0 = Data1; + perfData.data.data1 = Data2; + perfData.data.data2 = Data3; + perfData.data.data3 = Data4; + PerflogTraceEvent((PEVENT_TRACE_HEADER) &perfData); + } +} + + +#endif // _DXMPERF_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/fourcc.h
Added
@@ -0,0 +1,101 @@ +//------------------------------------------------------------------------------ +// File: FourCC.h +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// FOURCCMap +// +// provides a mapping between old-style multimedia format DWORDs +// and new-style GUIDs. +// +// A range of 4 billion GUIDs has been allocated to ensure that this +// mapping can be done straightforwardly one-to-one in both directions. +// +// January 95 + + +#ifndef __FOURCC__ +#define __FOURCC__ + + +// Multimedia format types are marked with DWORDs built from four 8-bit +// chars and known as FOURCCs. New multimedia AM_MEDIA_TYPE definitions include +// a subtype GUID. In order to simplify the mapping, GUIDs in the range: +// XXXXXXXX-0000-0010-8000-00AA00389B71 +// are reserved for FOURCCs. + +class FOURCCMap : public GUID +{ + +public: + FOURCCMap(); + FOURCCMap(DWORD Fourcc); + FOURCCMap(const GUID *); + + + DWORD GetFOURCC(void); + void SetFOURCC(DWORD fourcc); + void SetFOURCC(const GUID *); + +private: + void InitGUID(); +}; + +#define GUID_Data2 0 +#define GUID_Data3 0x10 +#define GUID_Data4_1 0xaa000080 +#define GUID_Data4_2 0x719b3800 + +inline void +FOURCCMap::InitGUID() { + Data2 = GUID_Data2; + Data3 = GUID_Data3; + ((DWORD *)Data4)0 = GUID_Data4_1; + ((DWORD *)Data4)1 = GUID_Data4_2; +} + +inline +FOURCCMap::FOURCCMap() { + InitGUID(); + SetFOURCC( DWORD(0)); +} + +inline +FOURCCMap::FOURCCMap(DWORD fourcc) +{ + InitGUID(); + SetFOURCC(fourcc); +} + +inline +FOURCCMap::FOURCCMap(const GUID * pGuid) +{ + InitGUID(); + SetFOURCC(pGuid); +} + +inline void +FOURCCMap::SetFOURCC(const GUID * pGuid) +{ + FOURCCMap * p = (FOURCCMap*) pGuid; + SetFOURCC(p->GetFOURCC()); +} + +inline void +FOURCCMap::SetFOURCC(DWORD fourcc) +{ + Data1 = fourcc; +} + +inline DWORD +FOURCCMap::GetFOURCC(void) +{ + return Data1; +} + +#endif /* __FOURCC__ */ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/measure.h
Added
@@ -0,0 +1,222 @@ +//------------------------------------------------------------------------------ +// File: Measure.h +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +/* + The idea is to pepper the source code with interesting measurements and + have the last few thousand of these recorded in a circular buffer that + can be post-processed to give interesting numbers. + + WHAT THE LOG LOOKS LIKE: + + Time (sec) Type Delta Incident_Name + 0.055,41 NOTE -. Incident Nine - Another note + 0.055,42 NOTE 0.000,01 Incident Nine - Another note + 0.055,44 NOTE 0.000,02 Incident Nine - Another note + 0.055,45 STOP -. Incident Eight - Also random + 0.055,47 START -. Incident Seven - Random + 0.055,49 NOTE 0.000,05 Incident Nine - Another note + ------- <etc. there is a lot of this> ---------------- + 0.125,60 STOP 0.000,03 Msr_Stop + 0.125,62 START -. Msr_Start + 0.125,63 START -. Incident Two - Start/Stop + 0.125,65 STOP 0.000,03 Msr_Start + 0.125,66 START -. Msr_Stop + 0.125,68 STOP 0.000,05 Incident Two - Start/Stop + 0.125,70 STOP 0.000,04 Msr_Stop + 0.125,72 START -. Msr_Start + 0.125,73 START -. Incident Two - Start/Stop + 0.125,75 STOP 0.000,03 Msr_Start + 0.125,77 START -. Msr_Stop + 0.125,78 STOP 0.000,05 Incident Two - Start/Stop + 0.125,80 STOP 0.000,03 Msr_Stop + 0.125,81 NOTE -. Incident Three - single Note + 0.125,83 START -. Incident Four - Start, no stop + 0.125,85 START -. Incident Five - Single Start/Stop + 0.125,87 STOP 0.000,02 Incident Five - Single Start/Stop + +Number Average StdDev Smallest Largest Incident_Name + 10 0.000,58 0.000,10 0.000,55 0.000,85 Incident One - Note + 50 0.000,05 0.000,00 0.000,05 0.000,05 Incident Two - Start/Stop + 1 -. -. -. -. Incident Three - single Note + 0 -. -. -. -. Incident Four - Start, no stop + 1 0.000,02 -. 0.000,02 0.000,02 Incident Five - Single Start/Stop + 0 -. -. -. -. Incident Six - zero occurrences + 100 0.000,25 0.000,12 0.000,02 0.000,62 Incident Seven - Random + 100 0.000,79 0.000,48 0.000,02 0.001,92 Incident Eight - Also random + 5895 0.000,01 0.000,01 0.000,01 0.000,56 Incident Nine - Another note + 10 0.000,03 0.000,00 0.000,03 0.000,04 Msr_Note + 50 0.000,03 0.000,00 0.000,03 0.000,04 Msr_Start + 50 0.000,04 0.000,03 0.000,03 0.000,31 Msr_Stop + + WHAT IT MEANS: + The log shows what happened and when. Each line shows the time at which + something happened (see WHAT YOU CODE below) what it was that happened + and (if approporate) the time since the corresponding previous event + (that's the delta column). + + The statistics show how many times each event occurred, what the average + delta time was, also the standard deviation, largest and smalles delta. + + WHAT YOU CODE: + + Before anything else executes: - register your ids + + int id1 = Msr_Register("Incident One - Note"); + int id2 = Msr_Register("Incident Two - Start/Stop"); + int id3 = Msr_Register("Incident Three - single Note"); + etc. + + At interesting moments: + + // To measure a repetitive event - e.g. end of bitblt to screen + Msr_Note(Id9); // e.g. "video frame hiting the screen NOW!" + + or + + // To measure an elapsed time e.g. time taken to decode an MPEG B-frame + Msr_Start(Id2); // e.g. "Starting to decode MPEG B-frame" + . . . + MsrStop(Id2); // "Finished MPEG decode" + + At the end: + + HANDLE hFile; + hFile = CreateFile("Perf.log", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + Msr_Dump(hFile); // This writes the log out to the file + CloseHandle(hFile); + + or + + Msr_Dump(NULL); // This writes it to DbgLog((LOG_TRACE,0, ... )); + // but if you are writing it out to the debugger + // then the times are probably all garbage because + // the debugger can make things run awfully slow. + + A given id should be used either for start / stop or Note calls. If Notes + are mixed in with Starts and Stops their statistics will be gibberish. + + If you code the calls in upper case i.e. MSR_START(idMunge); then you get + macros which will turn into nothing unless PERF is defined. + + You can reset the statistical counts for a given id by calling Reset(Id). + They are reset by default at the start. + It logs Reset as a special incident, so you can see it in the log. + + The log is a circular buffer in storage (to try to minimise disk I/O). + It overwrites the oldest entries once full. The statistics include ALL + incidents since the last Reset, whether still visible in the log or not. +*/ + +#ifndef __MEASURE__ +#define __MEASURE__ + +#ifdef PERF +#define MSR_INIT() Msr_Init() +#define MSR_TERMINATE() Msr_Terminate() +#define MSR_REGISTER(a) Msr_Register(a) +#define MSR_RESET(a) Msr_Reset(a) +#define MSR_CONTROL(a) Msr_Control(a) +#define MSR_START(a) Msr_Start(a) +#define MSR_STOP(a) Msr_Stop(a) +#define MSR_NOTE(a) Msr_Note(a) +#define MSR_INTEGER(a,b) Msr_Integer(a,b) +#define MSR_DUMP(a) Msr_Dump(a) +#define MSR_DUMPSTATS(a) Msr_DumpStats(a) +#else +#define MSR_INIT() ((void)0) +#define MSR_TERMINATE() ((void)0) +#define MSR_REGISTER(a) 0 +#define MSR_RESET(a) ((void)0) +#define MSR_CONTROL(a) ((void)0) +#define MSR_START(a) ((void)0) +#define MSR_STOP(a) ((void)0) +#define MSR_NOTE(a) ((void)0) +#define MSR_INTEGER(a,b) ((void)0) +#define MSR_DUMP(a) ((void)0) +#define MSR_DUMPSTATS(a) ((void)0) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// This must be called first - (called by the DllEntry) + +void WINAPI Msr_Init(void); + + +// Call this last to clean up (or just let it fall off the end - who cares?) + +void WINAPI Msr_Terminate(void); + + +// Call this to get an Id for an "incident" that you can pass to Start, Stop or Note +// everything that's logged is called an "incident". + +int WINAPI Msr_Register(__in LPTSTR Incident); + + +// Reset the statistical counts for an incident + +void WINAPI Msr_Reset(int Id); + + +// Reset all the counts for all incidents +#define MSR_RESET_ALL 0 +#define MSR_PAUSE 1 +#define MSR_RUN 2 + +void WINAPI Msr_Control(int iAction); + + +// log the start of an operation + +void WINAPI Msr_Start(int Id); + + +// log the end of an operation + +void WINAPI Msr_Stop(int Id); + + +// log a one-off or repetitive operation + +void WINAPI Msr_Note(int Id); + + +// log an integer (on which we can see statistics later) +void WINAPI Msr_Integer(int Id, int n); + + +// print out all the vaialable log (it may have wrapped) and then the statistics. +// When the log wraps you lose log but the statistics are still complete. +// hFIle==NULL => use DbgLog +// otherwise hFile must have come from CreateFile or OpenFile. + +void WINAPI Msr_Dump(HANDLE hFile); + + +// just dump the statistics - never mind the log + +void WINAPI Msr_DumpStats(HANDLE hFile); + +// Type definitions in case you want to declare a pointer to the dump functions +// (makes it a trifle easier to do dynamic linking +// i.e. LoadModule, GetProcAddress and call that) + +// Typedefs so can declare MSR_DUMPPROC *MsrDumpStats; or whatever +typedef void WINAPI MSR_DUMPPROC(HANDLE hFile); +typedef void WINAPI MSR_CONTROLPROC(int iAction); + + +#ifdef __cplusplus +} +#endif + +#endif // __MEASURE__
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/msgthrd.h
Added
@@ -0,0 +1,120 @@ +//------------------------------------------------------------------------------ +// File: MsgThrd.h +// +// Desc: DirectShow base classes - provides support for a worker thread +// class to which one can asynchronously post messages. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// Message class - really just a structure. +// +class CMsg { +public: + UINT uMsg; + DWORD dwFlags; + LPVOID lpParam; + CAMEvent *pEvent; + + CMsg(UINT u, DWORD dw, __inout_opt LPVOID lp, __in_opt CAMEvent *pEvnt) + : uMsg(u), dwFlags(dw), lpParam(lp), pEvent(pEvnt) {} + + CMsg() + : uMsg(0), dwFlags(0L), lpParam(NULL), pEvent(NULL) {} +}; + +// This is the actual thread class. It exports all the usual thread control +// functions. The created thread is different from a normal WIN32 thread in +// that it is prompted to perform particaular tasks by responding to messages +// posted to its message queue. +// +class AM_NOVTABLE CMsgThread { +private: + static DWORD WINAPI DefaultThreadProc(__inout LPVOID lpParam); + DWORD m_ThreadId; + HANDLE m_hThread; + +protected: + + // if you want to override GetThreadMsg to block on other things + // as well as this queue, you need access to this + CGenericList<CMsg> m_ThreadQueue; + CCritSec m_Lock; + HANDLE m_hSem; + LONG m_lWaiting; + +public: + CMsgThread() + : m_ThreadId(0), + m_hThread(NULL), + m_lWaiting(0), + m_hSem(NULL), + // make a list with a cache of 5 items + m_ThreadQueue(NAME("MsgThread list"), 5) + { + } + + ~CMsgThread(); + // override this if you want to block on other things as well + // as the message loop + void virtual GetThreadMsg(__out CMsg *msg); + + // override this if you want to do something on thread startup + virtual void OnThreadInit() { + }; + + BOOL CreateThread(); + + BOOL WaitForThreadExit(__out LPDWORD lpdwExitCode) { + if (m_hThread != NULL) { + WaitForSingleObject(m_hThread, INFINITE); + return GetExitCodeThread(m_hThread, lpdwExitCode); + } + return FALSE; + } + + DWORD ResumeThread() { + return ::ResumeThread(m_hThread); + } + + DWORD SuspendThread() { + return ::SuspendThread(m_hThread); + } + + int GetThreadPriority() { + return ::GetThreadPriority(m_hThread); + } + + BOOL SetThreadPriority(int nPriority) { + return ::SetThreadPriority(m_hThread, nPriority); + } + + HANDLE GetThreadHandle() { + return m_hThread; + } + + DWORD GetThreadId() { + return m_ThreadId; + } + + + void PutThreadMsg(UINT uMsg, DWORD dwMsgFlags, + __in_opt LPVOID lpMsgParam, __in_opt CAMEvent *pEvent = NULL) { + CAutoLock lck(&m_Lock); + CMsg* pMsg = new CMsg(uMsg, dwMsgFlags, lpMsgParam, pEvent); + m_ThreadQueue.AddTail(pMsg); + if (m_lWaiting != 0) { + ReleaseSemaphore(m_hSem, m_lWaiting, 0); + m_lWaiting = 0; + } + } + + // This is the function prototype of the function that the client + // supplies. It is always called on the created thread, never on + // the creator thread. + // + virtual LRESULT ThreadMessageProc( + UINT uMsg, DWORD dwFlags, __inout_opt LPVOID lpParam, __in_opt CAMEvent *pEvent) = 0; +}; +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/mtype.cpp
Added
@@ -0,0 +1,478 @@ +//------------------------------------------------------------------------------ +// File: MType.cpp +// +// Desc: DirectShow base classes - implements a class that holds and +// manages media type information. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// helper class that derived pin objects can use to compare media +// types etc. Has same data members as the struct AM_MEDIA_TYPE defined +// in the streams IDL file, but also has (non-virtual) functions + +#include <streams.h> +#include <mmreg.h> + +CMediaType::~CMediaType(){ + FreeMediaType(*this); +} + + +CMediaType::CMediaType() +{ + InitMediaType(); +} + + +CMediaType::CMediaType(const GUID * type) +{ + InitMediaType(); + majortype = *type; +} + + +// copy constructor does a deep copy of the format block + +CMediaType::CMediaType(const AM_MEDIA_TYPE& rt, __out_opt HRESULT* phr) +{ + HRESULT hr = CopyMediaType(this, &rt); + if (FAILED(hr) && (NULL != phr)) { + *phr = hr; + } +} + + +CMediaType::CMediaType(const CMediaType& rt, __out_opt HRESULT* phr) +{ + HRESULT hr = CopyMediaType(this, &rt); + if (FAILED(hr) && (NULL != phr)) { + *phr = hr; + } +} + + +// this class inherits publicly from AM_MEDIA_TYPE so the compiler could generate +// the following assignment operator itself, however it could introduce some +// memory conflicts and leaks in the process because the structure contains +// a dynamically allocated block (pbFormat) which it will not copy correctly + +CMediaType& +CMediaType::operator=(const AM_MEDIA_TYPE& rt) +{ + Set(rt); + return *this; +} + +CMediaType& +CMediaType::operator=(const CMediaType& rt) +{ + *this = (AM_MEDIA_TYPE &) rt; + return *this; +} + +BOOL +CMediaType::operator == (const CMediaType& rt) const +{ + // I don't believe we need to check sample size or + // temporal compression flags, since I think these must + // be represented in the type, subtype and format somehow. They + // are pulled out as separate flags so that people who don't understand + // the particular format representation can still see them, but + // they should duplicate information in the format block. + + return ((IsEqualGUID(majortype,rt.majortype) == TRUE) && + (IsEqualGUID(subtype,rt.subtype) == TRUE) && + (IsEqualGUID(formattype,rt.formattype) == TRUE) && + (cbFormat == rt.cbFormat) && + ( (cbFormat == 0) || + pbFormat != NULL && rt.pbFormat != NULL && + (memcmp(pbFormat, rt.pbFormat, cbFormat) == 0))); +} + + +BOOL +CMediaType::operator != (const CMediaType& rt) const +{ + /* Check to see if they are equal */ + + if (*this == rt) { + return FALSE; + } + return TRUE; +} + + +HRESULT +CMediaType::Set(const CMediaType& rt) +{ + return Set((AM_MEDIA_TYPE &) rt); +} + + +HRESULT +CMediaType::Set(const AM_MEDIA_TYPE& rt) +{ + if (&rt != this) { + FreeMediaType(*this); + HRESULT hr = CopyMediaType(this, &rt); + if (FAILED(hr)) { + return E_OUTOFMEMORY; + } + } + + return S_OK; +} + + +BOOL +CMediaType::IsValid() const +{ + return (!IsEqualGUID(majortype,GUID_NULL)); +} + + +void +CMediaType::SetType(const GUID* ptype) +{ + majortype = *ptype; +} + + +void +CMediaType::SetSubtype(const GUID* ptype) +{ + subtype = *ptype; +} + + +ULONG +CMediaType::GetSampleSize() const { + if (IsFixedSize()) { + return lSampleSize; + } else { + return 0; + } +} + + +void +CMediaType::SetSampleSize(ULONG sz) { + if (sz == 0) { + SetVariableSize(); + } else { + bFixedSizeSamples = TRUE; + lSampleSize = sz; + } +} + + +void +CMediaType::SetVariableSize() { + bFixedSizeSamples = FALSE; +} + + +void +CMediaType::SetTemporalCompression(BOOL bCompressed) { + bTemporalCompression = bCompressed; +} + +BOOL +CMediaType::SetFormat(__in_bcount(cb) BYTE * pformat, ULONG cb) +{ + if (NULL == AllocFormatBuffer(cb)) + return(FALSE); + + ASSERT(pbFormat); + memcpy(pbFormat, pformat, cb); + return(TRUE); +} + + +// set the type of the media type format block, this type defines what you +// will actually find in the format pointer. For example FORMAT_VideoInfo or +// FORMAT_WaveFormatEx. In the future this may be an interface pointer to a +// property set. Before sending out media types this should be filled in. + +void +CMediaType::SetFormatType(const GUID *pformattype) +{ + formattype = *pformattype; +} + + +// reset the format buffer + +void CMediaType::ResetFormatBuffer() +{ + if (cbFormat) { + CoTaskMemFree((PVOID)pbFormat); + } + cbFormat = 0; + pbFormat = NULL; +} + + +// allocate length bytes for the format and return a read/write pointer +// If we cannot allocate the new block of memory we return NULL leaving +// the original block of memory untouched (as does ReallocFormatBuffer) + +BYTE* +CMediaType::AllocFormatBuffer(ULONG length) +{ + ASSERT(length); + + // do the types have the same buffer size + + if (cbFormat == length) { + return pbFormat; + } + + // allocate the new format buffer + + BYTE *pNewFormat = (PBYTE)CoTaskMemAlloc(length); + if (pNewFormat == NULL) { + if (length <= cbFormat) return pbFormat; //reuse the old block anyway. + return NULL; + } + + // delete the old format + + if (cbFormat != 0) { + ASSERT(pbFormat); + CoTaskMemFree((PVOID)pbFormat); + } + + cbFormat = length; + pbFormat = pNewFormat; + return pbFormat; +} + + +// reallocate length bytes for the format and return a read/write pointer +// to it. We keep as much information as we can given the new buffer size +// if this fails the original format buffer is left untouched. The caller +// is responsible for ensuring the size of memory required is non zero + +BYTE* +CMediaType::ReallocFormatBuffer(ULONG length) +{ + ASSERT(length); + + // do the types have the same buffer size + + if (cbFormat == length) { + return pbFormat; + } + + // allocate the new format buffer + + BYTE *pNewFormat = (PBYTE)CoTaskMemAlloc(length); + if (pNewFormat == NULL) { + if (length <= cbFormat) return pbFormat; //reuse the old block anyway. + return NULL; + } + + // copy any previous format (or part of if new is smaller) + // delete the old format and replace with the new one + + if (cbFormat != 0) { + ASSERT(pbFormat); + memcpy(pNewFormat,pbFormat,min(length,cbFormat)); + CoTaskMemFree((PVOID)pbFormat); + } + + cbFormat = length; + pbFormat = pNewFormat; + return pNewFormat; +} + +// initialise a media type structure + +void CMediaType::InitMediaType() +{ + ZeroMemory((PVOID)this, sizeof(*this)); + lSampleSize = 1; + bFixedSizeSamples = TRUE; +} + + +// a partially specified media type can be passed to IPin::Connect +// as a constraint on the media type used in the connection. +// the type, subtype or format type can be null. +BOOL +CMediaType::IsPartiallySpecified(void) const +{ + if ((majortype == GUID_NULL) || + (formattype == GUID_NULL)) { + return TRUE; + } else { + return FALSE; + } +} + +BOOL +CMediaType::MatchesPartial(const CMediaType* ppartial) const +{ + if ((ppartial->majortype != GUID_NULL) && + (majortype != ppartial->majortype)) { + return FALSE; + } + if ((ppartial->subtype != GUID_NULL) && + (subtype != ppartial->subtype)) { + return FALSE; + } + + if (ppartial->formattype != GUID_NULL) { + // if the format block is specified then it must match exactly + if (formattype != ppartial->formattype) { + return FALSE; + } + if (cbFormat != ppartial->cbFormat) { + return FALSE; + } + if ((cbFormat != 0) && + (memcmp(pbFormat, ppartial->pbFormat, cbFormat) != 0)) { + return FALSE; + } + } + + return TRUE; + +} + + + +// general purpose function to delete a heap allocated AM_MEDIA_TYPE structure +// which is useful when calling IEnumMediaTypes::Next as the interface +// implementation allocates the structures which you must later delete +// the format block may also be a pointer to an interface to release + +void WINAPI DeleteMediaType(__inout_opt AM_MEDIA_TYPE *pmt) +{ + // allow NULL pointers for coding simplicity + + if (pmt == NULL) { + return; + } + + FreeMediaType(*pmt); + CoTaskMemFree((PVOID)pmt); +} + + +// this also comes in useful when using the IEnumMediaTypes interface so +// that you can copy a media type, you can do nearly the same by creating +// a CMediaType object but as soon as it goes out of scope the destructor +// will delete the memory it allocated (this takes a copy of the memory) + +AM_MEDIA_TYPE * WINAPI CreateMediaType(AM_MEDIA_TYPE const *pSrc) +{ + ASSERT(pSrc); + + // Allocate a block of memory for the media type + + AM_MEDIA_TYPE *pMediaType = + (AM_MEDIA_TYPE *)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); + + if (pMediaType == NULL) { + return NULL; + } + // Copy the variable length format block + + HRESULT hr = CopyMediaType(pMediaType,pSrc); + if (FAILED(hr)) { + CoTaskMemFree((PVOID)pMediaType); + return NULL; + } + + return pMediaType; +} + + +// Copy 1 media type to another + +HRESULT WINAPI CopyMediaType(__out AM_MEDIA_TYPE *pmtTarget, const AM_MEDIA_TYPE *pmtSource) +{ + // We'll leak if we copy onto one that already exists - there's one + // case we can check like that - copying to itself. + ASSERT(pmtSource != pmtTarget); + *pmtTarget = *pmtSource; + if (pmtSource->cbFormat != 0) { + ASSERT(pmtSource->pbFormat != NULL); + pmtTarget->pbFormat = (PBYTE)CoTaskMemAlloc(pmtSource->cbFormat); + if (pmtTarget->pbFormat == NULL) { + pmtTarget->cbFormat = 0; + return E_OUTOFMEMORY; + } else { + CopyMemory((PVOID)pmtTarget->pbFormat, (PVOID)pmtSource->pbFormat, + pmtTarget->cbFormat); + } + } + if (pmtTarget->pUnk != NULL) { + pmtTarget->pUnk->AddRef(); + } + + return S_OK; +} + +// Free an existing media type (ie free resources it holds) + +void WINAPI FreeMediaType(__inout AM_MEDIA_TYPE& mt) +{ + if (mt.cbFormat != 0) { + CoTaskMemFree((PVOID)mt.pbFormat); + + // Strictly unnecessary but tidier + mt.cbFormat = 0; + mt.pbFormat = NULL; + } + if (mt.pUnk != NULL) { + mt.pUnk->Release(); + mt.pUnk = NULL; + } +} + +// Initialize a media type from a WAVEFORMATEX + +STDAPI CreateAudioMediaType( + const WAVEFORMATEX *pwfx, + __out AM_MEDIA_TYPE *pmt, + BOOL bSetFormat +) +{ + pmt->majortype = MEDIATYPE_Audio; + if (pwfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE) { + pmt->subtype = ((PWAVEFORMATEXTENSIBLE)pwfx)->SubFormat; + } else { + pmt->subtype = FOURCCMap(pwfx->wFormatTag); + } + pmt->formattype = FORMAT_WaveFormatEx; + pmt->bFixedSizeSamples = TRUE; + pmt->bTemporalCompression = FALSE; + pmt->lSampleSize = pwfx->nBlockAlign; + pmt->pUnk = NULL; + if (bSetFormat) { + if (pwfx->wFormatTag == WAVE_FORMAT_PCM) { + pmt->cbFormat = sizeof(WAVEFORMATEX); + } else { + pmt->cbFormat = sizeof(WAVEFORMATEX) + pwfx->cbSize; + } + pmt->pbFormat = (PBYTE)CoTaskMemAlloc(pmt->cbFormat); + if (pmt->pbFormat == NULL) { + return E_OUTOFMEMORY; + } + if (pwfx->wFormatTag == WAVE_FORMAT_PCM) { + CopyMemory(pmt->pbFormat, pwfx, sizeof(PCMWAVEFORMAT)); + ((WAVEFORMATEX *)pmt->pbFormat)->cbSize = 0; + } else { + CopyMemory(pmt->pbFormat, pwfx, pmt->cbFormat); + } + } + return S_OK; +} + +// eliminate very many spurious warnings from MS compiler +#pragma warning(disable:4514)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/mtype.h
Added
@@ -0,0 +1,89 @@ +//------------------------------------------------------------------------------ +// File: MtType.h +// +// Desc: DirectShow base classes - defines a class that holds and manages +// media type information. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __MTYPE__ +#define __MTYPE__ + +/* Helper class that derived pin objects can use to compare media + types etc. Has same data members as the struct AM_MEDIA_TYPE defined + in the streams IDL file, but also has (non-virtual) functions */ + +class CMediaType : public _AMMediaType { + +public: + + ~CMediaType(); + CMediaType(); + CMediaType(const GUID * majortype); + CMediaType(const AM_MEDIA_TYPE&, __out_opt HRESULT* phr = NULL); + CMediaType(const CMediaType&, __out_opt HRESULT* phr = NULL); + + CMediaType& operator=(const CMediaType&); + CMediaType& operator=(const AM_MEDIA_TYPE&); + + BOOL operator == (const CMediaType&) const; + BOOL operator != (const CMediaType&) const; + + HRESULT Set(const CMediaType& rt); + HRESULT Set(const AM_MEDIA_TYPE& rt); + + BOOL IsValid() const; + + const GUID *Type() const { return &majortype;} ; + void SetType(const GUID *); + const GUID *Subtype() const { return &subtype;} ; + void SetSubtype(const GUID *); + + BOOL IsFixedSize() const {return bFixedSizeSamples; }; + BOOL IsTemporalCompressed() const {return bTemporalCompression; }; + ULONG GetSampleSize() const; + + void SetSampleSize(ULONG sz); + void SetVariableSize(); + void SetTemporalCompression(BOOL bCompressed); + + // read/write pointer to format - can't change length without + // calling SetFormat, AllocFormatBuffer or ReallocFormatBuffer + + BYTE* Format() const {return pbFormat; }; + ULONG FormatLength() const { return cbFormat; }; + + void SetFormatType(const GUID *); + const GUID *FormatType() const {return &formattype; }; + BOOL SetFormat(__in_bcount(length) BYTE *pFormat, ULONG length); + void ResetFormatBuffer(); + BYTE* AllocFormatBuffer(ULONG length); + BYTE* ReallocFormatBuffer(ULONG length); + + void InitMediaType(); + + BOOL MatchesPartial(const CMediaType* ppartial) const; + BOOL IsPartiallySpecified(void) const; +}; + + +/* General purpose functions to copy and delete a task allocated AM_MEDIA_TYPE + structure which is useful when using the IEnumMediaFormats interface as + the implementation allocates the structures which you must later delete */ + +void WINAPI DeleteMediaType(__inout_opt AM_MEDIA_TYPE *pmt); +AM_MEDIA_TYPE * WINAPI CreateMediaType(AM_MEDIA_TYPE const *pSrc); +HRESULT WINAPI CopyMediaType(__out AM_MEDIA_TYPE *pmtTarget, const AM_MEDIA_TYPE *pmtSource); +void WINAPI FreeMediaType(__inout AM_MEDIA_TYPE& mt); + +// Initialize a media type from a WAVEFORMATEX + +STDAPI CreateAudioMediaType( + const WAVEFORMATEX *pwfx, + __out AM_MEDIA_TYPE *pmt, + BOOL bSetFormat); + +#endif /* __MTYPE__ */ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/outputq.cpp
Added
@@ -0,0 +1,801 @@ +//------------------------------------------------------------------------------ +// File: OutputQ.cpp +// +// Desc: DirectShow base classes - implements COutputQueue class used by an +// output pin which may sometimes want to queue output samples on a +// separate thread and sometimes call Receive() directly on the input +// pin. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> + + +// +// COutputQueue Constructor : +// +// Determines if a thread is to be created and creates resources +// +// pInputPin - the downstream input pin we're queueing samples to +// +// phr - changed to a failure code if this function fails +// (otherwise unchanges) +// +// bAuto - Ask pInputPin if it can block in Receive by calling +// its ReceiveCanBlock method and create a thread if +// it can block, otherwise not. +// +// bQueue - if bAuto == FALSE then we create a thread if and only +// if bQueue == TRUE +// +// lBatchSize - work in batches of lBatchSize +// +// bBatchEact - Use exact batch sizes so don't send until the +// batch is full or SendAnyway() is called +// +// lListSize - If we create a thread make the list of samples queued +// to the thread have this size cache +// +// dwPriority - If we create a thread set its priority to this +// +COutputQueue::COutputQueue( + IPin *pInputPin, // Pin to send stuff to + __inout HRESULT *phr, // 'Return code' + BOOL bAuto, // Ask pin if queue or not + BOOL bQueue, // Send through queue + LONG lBatchSize, // Batch + BOOL bBatchExact, // Batch exactly to BatchSize + LONG lListSize, + DWORD dwPriority, + bool bFlushingOpt // flushing optimization + ) : m_lBatchSize(lBatchSize), + m_bBatchExact(bBatchExact && (lBatchSize > 1)), + m_hThread(NULL), + m_hSem(NULL), + m_List(NULL), + m_pPin(pInputPin), + m_ppSamples(NULL), + m_lWaiting(0), + m_evFlushComplete(FALSE, phr), + m_pInputPin(NULL), + m_bSendAnyway(FALSE), + m_nBatched(0), + m_bFlushing(FALSE), + m_bFlushed(TRUE), + m_bFlushingOpt(bFlushingOpt), + m_bTerminate(FALSE), + m_hEventPop(NULL), + m_hr(S_OK) +{ + ASSERT(m_lBatchSize > 0); + + + if (FAILED(*phr)) { + return; + } + + // Check the input pin is OK and cache its IMemInputPin interface + + *phr = pInputPin->QueryInterface(IID_IMemInputPin, (void **)&m_pInputPin); + if (FAILED(*phr)) { + return; + } + + // See if we should ask the downstream pin + + if (bAuto) { + HRESULT hr = m_pInputPin->ReceiveCanBlock(); + if (SUCCEEDED(hr)) { + bQueue = hr == S_OK; + } + } + + // Create our sample batch + + m_ppSamples = new PMEDIASAMPLEm_lBatchSize; + if (m_ppSamples == NULL) { + *phr = E_OUTOFMEMORY; + return; + } + + // If we're queueing allocate resources + + if (bQueue) { + DbgLog((LOG_TRACE, 2, TEXT("Creating thread for output pin"))); + m_hSem = CreateSemaphore(NULL, 0, 0x7FFFFFFF, NULL); + if (m_hSem == NULL) { + DWORD dwError = GetLastError(); + *phr = AmHresultFromWin32(dwError); + return; + } + m_List = new CSampleList(NAME("Sample Queue List"), + lListSize, + FALSE // No lock + ); + if (m_List == NULL) { + *phr = E_OUTOFMEMORY; + return; + } + + + DWORD dwThreadId; + m_hThread = CreateThread(NULL, + 0, + InitialThreadProc, + (LPVOID)this, + 0, + &dwThreadId); + if (m_hThread == NULL) { + DWORD dwError = GetLastError(); + *phr = AmHresultFromWin32(dwError); + return; + } + SetThreadPriority(m_hThread, dwPriority); + } else { + DbgLog((LOG_TRACE, 2, TEXT("Calling input pin directly - no thread"))); + } +} + +// +// COutputQueuee Destructor : +// +// Free all resources - +// +// Thread, +// Batched samples +// +COutputQueue::~COutputQueue() +{ + DbgLog((LOG_TRACE, 3, TEXT("COutputQueue::~COutputQueue"))); + /* Free our pointer */ + if (m_pInputPin != NULL) { + m_pInputPin->Release(); + } + if (m_hThread != NULL) { + { + CAutoLock lck(this); + m_bTerminate = TRUE; + m_hr = S_FALSE; + NotifyThread(); + } + DbgWaitForSingleObject(m_hThread); + EXECUTE_ASSERT(CloseHandle(m_hThread)); + + // The thread frees the samples when asked to terminate + + ASSERT(m_List->GetCount() == 0); + delete m_List; + } else { + FreeSamples(); + } + if (m_hSem != NULL) { + EXECUTE_ASSERT(CloseHandle(m_hSem)); + } + delete m_ppSamples; +} + +// +// Call the real thread proc as a member function +// +DWORD WINAPI COutputQueue::InitialThreadProc(__in LPVOID pv) +{ + HRESULT hrCoInit = CAMThread::CoInitializeHelper(); + + COutputQueue *pSampleQueue = (COutputQueue *)pv; + DWORD dwReturn = pSampleQueue->ThreadProc(); + + if(hrCoInit == S_OK) { + CoUninitialize(); + } + + return dwReturn; +} + +// +// Thread sending the samples downstream : +// +// When there is nothing to do the thread sets m_lWaiting (while +// holding the critical section) and then waits for m_hSem to be +// set (not holding the critical section) +// +DWORD COutputQueue::ThreadProc() +{ + while (TRUE) { + BOOL bWait = FALSE; + IMediaSample *pSample; + LONG lNumberToSend; // Local copy + NewSegmentPacket* ppacket; + + // + // Get a batch of samples and send it if possible + // In any case exit the loop if there is a control action + // requested + // + { + CAutoLock lck(this); + while (TRUE) { + + if (m_bTerminate) { + FreeSamples(); + return 0; + } + if (m_bFlushing) { + FreeSamples(); + SetEvent(m_evFlushComplete); + } + + // Get a sample off the list + + pSample = m_List->RemoveHead(); + // inform derived class we took something off the queue + if (m_hEventPop) { + //DbgLog((LOG_TRACE,3,TEXT("Queue: Delivered SET EVENT"))); + SetEvent(m_hEventPop); + } + + if (pSample != NULL && + !IsSpecialSample(pSample)) { + + // If its just a regular sample just add it to the batch + // and exit the loop if the batch is full + + m_ppSamplesm_nBatched++ = pSample; + if (m_nBatched == m_lBatchSize) { + break; + } + } else { + + // If there was nothing in the queue and there's nothing + // to send (either because there's nothing or the batch + // isn't full) then prepare to wait + + if (pSample == NULL && + (m_bBatchExact || m_nBatched == 0)) { + + // Tell other thread to set the event when there's + // something do to + + ASSERT(m_lWaiting == 0); + m_lWaiting++; + bWait = TRUE; + } else { + + // We break out of the loop on SEND_PACKET unless + // there's nothing to send + + if (pSample == SEND_PACKET && m_nBatched == 0) { + continue; + } + + if (pSample == NEW_SEGMENT) { + // now we need the parameters - we are + // guaranteed that the next packet contains them + ppacket = (NewSegmentPacket *) m_List->RemoveHead(); + // we took something off the queue + if (m_hEventPop) { + //DbgLog((LOG_TRACE,3,TEXT("Queue: Delivered SET EVENT"))); + SetEvent(m_hEventPop); + } + + ASSERT(ppacket); + } + // EOS_PACKET falls through here and we exit the loop + // In this way it acts like SEND_PACKET + } + break; + } + } + if (!bWait) { + // We look at m_nBatched from the client side so keep + // it up to date inside the critical section + lNumberToSend = m_nBatched; // Local copy + m_nBatched = 0; + } + } + + // Wait for some more data + + if (bWait) { + DbgWaitForSingleObject(m_hSem); + continue; + } + + + + // OK - send it if there's anything to send + // We DON'T check m_bBatchExact here because either we've got + // a full batch or we dropped through because we got + // SEND_PACKET or EOS_PACKET - both of which imply we should + // flush our batch + + if (lNumberToSend != 0) { + long nProcessed; + if (m_hr == S_OK) { + ASSERT(!m_bFlushed); + HRESULT hr = m_pInputPin->ReceiveMultiple(m_ppSamples, + lNumberToSend, + &nProcessed); + /* Don't overwrite a flushing state HRESULT */ + CAutoLock lck(this); + if (m_hr == S_OK) { + m_hr = hr; + } + ASSERT(!m_bFlushed); + } + while (lNumberToSend != 0) { + m_ppSamples--lNumberToSend->Release(); + } + if (m_hr != S_OK) { + + // In any case wait for more data - S_OK just + // means there wasn't an error + + DbgLog((LOG_ERROR, 2, TEXT("ReceiveMultiple returned %8.8X"), + m_hr)); + } + } + + // Check for end of stream + + if (pSample == EOS_PACKET) { + + // We don't send even end of stream on if we've previously + // returned something other than S_OK + // This is because in that case the pin which returned + // something other than S_OK should have either sent + // EndOfStream() or notified the filter graph + + if (m_hr == S_OK) { + DbgLog((LOG_TRACE, 2, TEXT("COutputQueue sending EndOfStream()"))); + HRESULT hr = m_pPin->EndOfStream(); + if (FAILED(hr)) { + DbgLog((LOG_ERROR, 2, TEXT("COutputQueue got code 0x%8.8X from EndOfStream()"))); + } + } + } + + // Data from a new source + + if (pSample == RESET_PACKET) { + m_hr = S_OK; + SetEvent(m_evFlushComplete); + } + + if (pSample == NEW_SEGMENT) { + m_pPin->NewSegment(ppacket->tStart, ppacket->tStop, ppacket->dRate); + delete ppacket; + } + } +} + +// Send batched stuff anyway +void COutputQueue::SendAnyway() +{ + if (!IsQueued()) { + + // m_bSendAnyway is a private parameter checked in ReceiveMultiple + + m_bSendAnyway = TRUE; + LONG nProcessed; + ReceiveMultiple(NULL, 0, &nProcessed); + m_bSendAnyway = FALSE; + + } else { + CAutoLock lck(this); + QueueSample(SEND_PACKET); + NotifyThread(); + } +} + +void +COutputQueue::NewSegment( + REFERENCE_TIME tStart, + REFERENCE_TIME tStop, + double dRate) +{ + if (!IsQueued()) { + if (S_OK == m_hr) { + if (m_bBatchExact) { + SendAnyway(); + } + m_pPin->NewSegment(tStart, tStop, dRate); + } + } else { + if (m_hr == S_OK) { + // + // we need to queue the new segment to appear in order in the + // data, but we need to pass parameters to it. Rather than + // take the hit of wrapping every single sample so we can tell + // special ones apart, we queue special pointers to indicate + // special packets, and we guarantee (by holding the + // critical section) that the packet immediately following a + // NEW_SEGMENT value is a NewSegmentPacket containing the + // parameters. + NewSegmentPacket * ppack = new NewSegmentPacket; + if (ppack == NULL) { + return; + } + ppack->tStart = tStart; + ppack->tStop = tStop; + ppack->dRate = dRate; + + CAutoLock lck(this); + QueueSample(NEW_SEGMENT); + QueueSample( (IMediaSample*) ppack); + NotifyThread(); + } + } +} + + +// +// End of Stream is queued to output device +// +void COutputQueue::EOS() +{ + CAutoLock lck(this); + if (!IsQueued()) { + if (m_bBatchExact) { + SendAnyway(); + } + if (m_hr == S_OK) { + DbgLog((LOG_TRACE, 2, TEXT("COutputQueue sending EndOfStream()"))); + m_bFlushed = FALSE; + HRESULT hr = m_pPin->EndOfStream(); + if (FAILED(hr)) { + DbgLog((LOG_ERROR, 2, TEXT("COutputQueue got code 0x%8.8X from EndOfStream()"))); + } + } + } else { + if (m_hr == S_OK) { + m_bFlushed = FALSE; + QueueSample(EOS_PACKET); + NotifyThread(); + } + } +} + +// +// Flush all the samples in the queue +// +void COutputQueue::BeginFlush() +{ + if (IsQueued()) { + { + CAutoLock lck(this); + + // block receives -- we assume this is done by the + // filter in which we are a component + + // discard all queued data + + m_bFlushing = TRUE; + + // Make sure we discard all samples from now on + + if (m_hr == S_OK) { + m_hr = S_FALSE; + } + + // Optimize so we don't keep calling downstream all the time + + if (m_bFlushed && m_bFlushingOpt) { + return; + } + + // Make sure we really wait for the flush to complete + m_evFlushComplete.Reset(); + + NotifyThread(); + } + + // pass this downstream + + m_pPin->BeginFlush(); + } else { + // pass downstream first to avoid deadlocks + m_pPin->BeginFlush(); + CAutoLock lck(this); + // discard all queued data + + m_bFlushing = TRUE; + + // Make sure we discard all samples from now on + + if (m_hr == S_OK) { + m_hr = S_FALSE; + } + } + +} + +// +// leave flush mode - pass this downstream +void COutputQueue::EndFlush() +{ + { + CAutoLock lck(this); + ASSERT(m_bFlushing); + if (m_bFlushingOpt && m_bFlushed && IsQueued()) { + m_bFlushing = FALSE; + m_hr = S_OK; + return; + } + } + + // sync with pushing thread -- done in BeginFlush + // ensure no more data to go downstream -- done in BeginFlush + // + // Because we are synching here there is no need to hold the critical + // section (in fact we'd deadlock if we did!) + + if (IsQueued()) { + m_evFlushComplete.Wait(); + } else { + FreeSamples(); + } + + // Be daring - the caller has guaranteed no samples will arrive + // before EndFlush() returns + + m_bFlushing = FALSE; + m_bFlushed = TRUE; + + // call EndFlush on downstream pins + + m_pPin->EndFlush(); + + m_hr = S_OK; +} + +// COutputQueue::QueueSample +// +// private method to Send a sample to the output queue +// The critical section MUST be held when this is called + +void COutputQueue::QueueSample(IMediaSample *pSample) +{ + if (NULL == m_List->AddTail(pSample)) { + if (!IsSpecialSample(pSample)) { + pSample->Release(); + } + } +} + +// +// COutputQueue::Receive() +// +// Send a single sample by the multiple sample route +// (NOTE - this could be optimized if necessary) +// +// On return the sample will have been Release()'d +// + +HRESULT COutputQueue::Receive(IMediaSample *pSample) +{ + LONG nProcessed; + return ReceiveMultiple(&pSample, 1, &nProcessed); +} + +// +// COutputQueue::ReceiveMultiple() +// +// Send a set of samples to the downstream pin +// +// ppSamples - array of samples +// nSamples - how many +// nSamplesProcessed - How many were processed +// +// On return all samples will have been Release()'d +// + +HRESULT COutputQueue::ReceiveMultiple ( + __in_ecount(nSamples) IMediaSample **ppSamples, + long nSamples, + __out long *nSamplesProcessed) +{ + if (nSamples < 0) { + return E_INVALIDARG; + } + + CAutoLock lck(this); + // Either call directly or queue up the samples + + if (!IsQueued()) { + + // If we already had a bad return code then just return + + if (S_OK != m_hr) { + + // If we've never received anything since the last Flush() + // and the sticky return code is not S_OK we must be + // flushing + // ((!A || B) is equivalent to A implies B) + ASSERT(!m_bFlushed || m_bFlushing); + + // We're supposed to Release() them anyway! + *nSamplesProcessed = 0; + for (int i = 0; i < nSamples; i++) { + DbgLog((LOG_TRACE, 3, TEXT("COutputQueue (direct) : Discarding %d samples code 0x%8.8X"), + nSamples, m_hr)); + ppSamplesi->Release(); + } + + return m_hr; + } + // + // If we're flushing the sticky return code should be S_FALSE + // + ASSERT(!m_bFlushing); + m_bFlushed = FALSE; + + ASSERT(m_nBatched < m_lBatchSize); + ASSERT(m_nBatched == 0 || m_bBatchExact); + + // Loop processing the samples in batches + + LONG iLost = 0; + long iDone = 0; + for (iDone = 0; + iDone < nSamples || (m_nBatched != 0 && m_bSendAnyway); + ) { + +//pragma message (REMIND("Implement threshold scheme")) + ASSERT(m_nBatched < m_lBatchSize); + if (iDone < nSamples) { + m_ppSamplesm_nBatched++ = ppSamplesiDone++; + } + if (m_nBatched == m_lBatchSize || + nSamples == 0 && (m_bSendAnyway || !m_bBatchExact)) { + LONG nDone; + DbgLog((LOG_TRACE, 4, TEXT("Batching %d samples"), + m_nBatched)); + + if (m_hr == S_OK) { + m_hr = m_pInputPin->ReceiveMultiple(m_ppSamples, + m_nBatched, + &nDone); + } else { + nDone = 0; + } + iLost += m_nBatched - nDone; + for (LONG i = 0; i < m_nBatched; i++) { + m_ppSamplesi->Release(); + } + m_nBatched = 0; + } + } + *nSamplesProcessed = iDone - iLost; + if (*nSamplesProcessed < 0) { + *nSamplesProcessed = 0; + } + return m_hr; + } else { + /* We're sending to our thread */ + + if (m_hr != S_OK) { + *nSamplesProcessed = 0; + DbgLog((LOG_TRACE, 3, TEXT("COutputQueue (queued) : Discarding %d samples code 0x%8.8X"), + nSamples, m_hr)); + for (int i = 0; i < nSamples; i++) { + ppSamplesi->Release(); + } + return m_hr; + } + m_bFlushed = FALSE; + for (long i = 0; i < nSamples; i++) { + QueueSample(ppSamplesi); + } + *nSamplesProcessed = nSamples; + if (!m_bBatchExact || + m_nBatched + m_List->GetCount() >= m_lBatchSize) { + NotifyThread(); + } + return S_OK; + } +} + +// Get ready for new data - cancels sticky m_hr +void COutputQueue::Reset() +{ + if (!IsQueued()) { + m_hr = S_OK; + } else { + { + CAutoLock lck(this); + QueueSample(RESET_PACKET); + NotifyThread(); + } + m_evFlushComplete.Wait(); + } +} + +// Remove and Release() all queued and Batched samples +void COutputQueue::FreeSamples() +{ + CAutoLock lck(this); + if (IsQueued()) { + while (TRUE) { + IMediaSample *pSample = m_List->RemoveHead(); + // inform derived class we took something off the queue + if (m_hEventPop) { + //DbgLog((LOG_TRACE,3,TEXT("Queue: Delivered SET EVENT"))); + SetEvent(m_hEventPop); + } + + if (pSample == NULL) { + break; + } + if (!IsSpecialSample(pSample)) { + pSample->Release(); + } else { + if (pSample == NEW_SEGMENT) { + // Free NEW_SEGMENT packet + NewSegmentPacket *ppacket = + (NewSegmentPacket *) m_List->RemoveHead(); + // inform derived class we took something off the queue + if (m_hEventPop) { + //DbgLog((LOG_TRACE,3,TEXT("Queue: Delivered SET EVENT"))); + SetEvent(m_hEventPop); + } + + ASSERT(ppacket != NULL); + delete ppacket; + } + } + } + } + for (int i = 0; i < m_nBatched; i++) { + m_ppSamplesi->Release(); + } + m_nBatched = 0; +} + +// Notify the thread if there is something to do +// +// The critical section MUST be held when this is called +void COutputQueue::NotifyThread() +{ + // Optimize - no need to signal if it's not waiting + ASSERT(IsQueued()); + if (m_lWaiting) { + ReleaseSemaphore(m_hSem, m_lWaiting, NULL); + m_lWaiting = 0; + } +} + +// See if there's any work to do +// Returns +// TRUE if there is nothing on the queue and nothing in the batch +// and all data has been sent +// FALSE otherwise +// +BOOL COutputQueue::IsIdle() +{ + CAutoLock lck(this); + + // We're idle if + // there is no thread (!IsQueued()) OR + // the thread is waiting for more work (m_lWaiting != 0) + // AND + // there's nothing in the current batch (m_nBatched == 0) + + if (IsQueued() && m_lWaiting == 0 || m_nBatched != 0) { + return FALSE; + } else { + + // If we're idle it shouldn't be possible for there + // to be anything on the work queue + + ASSERT(!IsQueued() || m_List->GetCount() == 0); + return TRUE; + } +} + + +void COutputQueue::SetPopEvent(HANDLE hEvent) +{ + m_hEventPop = hEvent; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/outputq.h
Added
@@ -0,0 +1,137 @@ +//------------------------------------------------------------------------------ +// File: OutputQ.h +// +// Desc: DirectShow base classes - defines the COutputQueue class, which +// makes a queue of samples and sends them to an output pin. The +// class will optionally send the samples to the pin directly. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +typedef CGenericList<IMediaSample> CSampleList; + +class COutputQueue : public CCritSec +{ +public: + // Constructor + COutputQueue(IPin *pInputPin, // Pin to send stuff to + __inout HRESULT *phr, // 'Return code' + BOOL bAuto = TRUE, // Ask pin if blocks + BOOL bQueue = TRUE, // Send through queue (ignored if + // bAuto set) + LONG lBatchSize = 1, // Batch + BOOL bBatchExact = FALSE,// Batch exactly to BatchSize + LONG lListSize = // Likely number in the list + DEFAULTCACHE, + DWORD dwPriority = // Priority of thread to create + THREAD_PRIORITY_NORMAL, + bool bFlushingOpt = false // flushing optimization + ); + ~COutputQueue(); + + // enter flush state - discard all data + void BeginFlush(); // Begin flushing samples + + // re-enable receives (pass this downstream) + void EndFlush(); // Complete flush of samples - downstream + // pin guaranteed not to block at this stage + + void EOS(); // Call this on End of stream + + void SendAnyway(); // Send batched samples anyway (if bBatchExact set) + + void NewSegment( + REFERENCE_TIME tStart, + REFERENCE_TIME tStop, + double dRate); + + HRESULT Receive(IMediaSample *pSample); + + // do something with these media samples + HRESULT ReceiveMultiple ( + __in_ecount(nSamples) IMediaSample **pSamples, + long nSamples, + __out long *nSamplesProcessed); + + void Reset(); // Reset m_hr ready for more data + + // See if its idle or not + BOOL IsIdle(); + + // give the class an event to fire after everything removed from the queue + void SetPopEvent(HANDLE hEvent); + +protected: + static DWORD WINAPI InitialThreadProc(__in LPVOID pv); + DWORD ThreadProc(); + BOOL IsQueued() + { + return m_List != NULL; + }; + + // The critical section MUST be held when this is called + void QueueSample(IMediaSample *pSample); + + BOOL IsSpecialSample(IMediaSample *pSample) + { + return (DWORD_PTR)pSample > (DWORD_PTR)(LONG_PTR)(-16); + }; + + // Remove and Release() batched and queued samples + void FreeSamples(); + + // Notify the thread there is something to do + void NotifyThread(); + + +protected: + // Queue 'messages' + #define SEND_PACKET ((IMediaSample *)(LONG_PTR)(-2)) // Send batch + #define EOS_PACKET ((IMediaSample *)(LONG_PTR)(-3)) // End of stream + #define RESET_PACKET ((IMediaSample *)(LONG_PTR)(-4)) // Reset m_hr + #define NEW_SEGMENT ((IMediaSample *)(LONG_PTR)(-5)) // send NewSegment + + // new segment packet is always followed by one of these + struct NewSegmentPacket { + REFERENCE_TIME tStart; + REFERENCE_TIME tStop; + double dRate; + }; + + // Remember input stuff + IPin * const m_pPin; + IMemInputPin * m_pInputPin; + BOOL const m_bBatchExact; + LONG const m_lBatchSize; + + CSampleList * m_List; + HANDLE m_hSem; + CAMEvent m_evFlushComplete; + HANDLE m_hThread; + __field_ecount_opt(m_lBatchSize) IMediaSample ** m_ppSamples; + __range(0, m_lBatchSize) LONG m_nBatched; + + // Wait optimization + LONG m_lWaiting; + // Flush synchronization + BOOL m_bFlushing; + + // flushing optimization. some downstream filters have trouble + // with the queue's flushing optimization. other rely on it + BOOL m_bFlushed; + bool m_bFlushingOpt; + + // Terminate now + BOOL m_bTerminate; + + // Send anyway flag for batching + BOOL m_bSendAnyway; + + // Deferred 'return code' + HRESULT volatile m_hr; + + // an event that can be fired after every deliver + HANDLE m_hEventPop; +}; +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/perflog.cpp
Added
@@ -0,0 +1,347 @@ +//------------------------------------------------------------------------------ +// File: perflog.cpp +// +// Desc: Macros for DirectShow performance logging. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + +#pragma warning (disable:4201) + +#include <streams.h> +#include <windows.h> +#include <tchar.h> +#include <winperf.h> +#include <wmistr.h> +#include <evntrace.h> +#include <strsafe.h> +#include "perflog.h" + +// +// Local function prototypes. +// + +ULONG +WINAPI +PerflogCallback ( + WMIDPREQUESTCODE RequestCode, + __in PVOID Context, + __out ULONG* BufferSize, + __in PVOID Buffer + ); + +// +// Event tracing function pointers. +// We have to do this to run on down-level platforms. +// + +#ifdef UNICODE + +ULONG +(__stdcall * _RegisterTraceGuids) ( + __in IN WMIDPREQUEST RequestAddress, + __in IN PVOID RequestContext, + IN LPCGUID ControlGuid, + IN ULONG GuidCount, + __in IN PTRACE_GUID_REGISTRATION TraceGuidReg, + IN LPCWSTR MofImagePath, + IN LPCWSTR MofResourceName, + OUT PTRACEHANDLE RegistrationHandle + ); + +#define REGISTERTRACEGUIDS_NAME "RegisterTraceGuidsW" + +#else + +ULONG +(__stdcall * _RegisterTraceGuids) ( + __in IN WMIDPREQUEST RequestAddress, + __in IN PVOID RequestContext, + IN LPCGUID ControlGuid, + IN ULONG GuidCount, + __in IN PTRACE_GUID_REGISTRATION TraceGuidReg, + IN LPCSTR MofImagePath, + IN LPCSTR MofResourceName, + __out OUT PTRACEHANDLE RegistrationHandle + ); + +#define REGISTERTRACEGUIDS_NAME "RegisterTraceGuidsA" + +#endif + +ULONG +(__stdcall * _UnregisterTraceGuids) ( + TRACEHANDLE RegistrationHandle + ); + +TRACEHANDLE +(__stdcall * _GetTraceLoggerHandle) ( + __in PVOID Buffer + ); + +UCHAR +(__stdcall * _GetTraceEnableLevel) ( + TRACEHANDLE TraceHandle + ); + +ULONG +(__stdcall * _GetTraceEnableFlags) ( + TRACEHANDLE TraceHandle + ); + +ULONG +(__stdcall * _TraceEvent) ( + TRACEHANDLE TraceHandle, + __in PEVENT_TRACE_HEADER EventTrace + ); + +HINSTANCE _Advapi32; + +// +// Global variables. +// + +BOOL EventTracingAvailable=FALSE; +ULONG PerflogEnableFlags; +UCHAR PerflogEnableLevel; +ULONG PerflogModuleLevel = 0; +void (*OnStateChanged)(void); +TRACEHANDLE PerflogTraceHandle=NULL; +TRACEHANDLE PerflogRegHandle; + +// The Win32 wsprintf() function writes a maximum of 1024 characters to it's output buffer. +// See the documentation for wsprintf()'s lpOut parameter for more information. +const INT iDEBUGINFO = 1024; // Used to format strings + +// +// This routine initializes performance logging. +// It should be called from DllMain(). +// + + +VOID +PerflogReadModuleLevel( + HINSTANCE hInstance + ) +{ + LONG lReturn; // Create key return value + TCHAR szInfoiDEBUGINFO; // Constructs key names + TCHAR szFullNameiDEBUGINFO; // Load the full path and module name + HKEY hModuleKey; // Module key handle + LPTSTR pName; // Searches from the end for a backslash + DWORD dwKeySize, dwKeyType, dwKeyValue; + + DWORD dwSize = GetModuleFileName( + (hInstance ? hInstance : GetModuleHandle( NULL )), + szFullName, + iDEBUGINFO ); + + if (0 == dwSize || iDEBUGINFO == dwSize) { + return; + } + + pName = _tcsrchr(szFullName,'\\'); + if (pName == NULL) { + pName = szFullName; + } else { + pName++; + } + + /* Construct the base key name */ + (void)StringCchPrintf(szInfo,NUMELMS(szInfo),TEXT("SOFTWARE\\Debug\\%s"),pName); + + /* Open the key for this module */ + lReturn = + RegOpenKeyEx( + HKEY_LOCAL_MACHINE, // Handle of an open key + szInfo, // Address of subkey name + (DWORD) 0, // Reserved value + KEY_QUERY_VALUE, // Desired security access + &hModuleKey ); // Opened handle buffer + + if (lReturn != ERROR_SUCCESS) { + return; + } + + dwKeySize = sizeof(DWORD); + lReturn = RegQueryValueEx( + hModuleKey, // Handle to an open key + TEXT("PERFLOG"), + NULL, // Reserved field + &dwKeyType, // Returns the field type + (LPBYTE) &dwKeyValue, // Returns the field's value + &dwKeySize ); // Number of bytes transferred + + if ((lReturn == ERROR_SUCCESS) && (dwKeyType == REG_DWORD)) + { + PerflogModuleLevel = dwKeyValue; + } + + RegCloseKey(hModuleKey); +} + +BOOL PerflogInitIfEnabled( + IN HINSTANCE hInstance, + __in IN PPERFLOG_LOGGING_PARAMS LogParams + ) +{ + PerflogReadModuleLevel( hInstance ); + if (PerflogModuleLevel) + { + return PerflogInitialize( LogParams ); + } + else + { + return FALSE; + } +} + +BOOL +PerflogInitialize ( + __in IN PPERFLOG_LOGGING_PARAMS LogParams + ) +{ + ULONG status; + + // + // If we're running on a recent-enough platform, this will get + // pointers to the event tracing routines. + // + + _Advapi32 = GetModuleHandle (_T("ADVAPI32.DLL")); + if (_Advapi32 == NULL) { + return FALSE; + } + + *((FARPROC*) &_RegisterTraceGuids) = GetProcAddress (_Advapi32, REGISTERTRACEGUIDS_NAME); + *((FARPROC*) &_UnregisterTraceGuids) = GetProcAddress (_Advapi32, "UnregisterTraceGuids"); + *((FARPROC*) &_GetTraceLoggerHandle) = GetProcAddress (_Advapi32, "GetTraceLoggerHandle"); + *((FARPROC*) &_GetTraceEnableLevel) = GetProcAddress (_Advapi32, "GetTraceEnableLevel"); + *((FARPROC*) &_GetTraceEnableFlags) = GetProcAddress (_Advapi32, "GetTraceEnableFlags"); + *((FARPROC*) &_TraceEvent) = GetProcAddress (_Advapi32, "TraceEvent"); + + if (_RegisterTraceGuids == NULL || + _UnregisterTraceGuids == NULL || + _GetTraceEnableLevel == NULL || + _GetTraceEnableFlags == NULL || + _TraceEvent == NULL) { + + return FALSE; + } + + EventTracingAvailable = TRUE; + + OnStateChanged = LogParams->OnStateChanged; + + // + // Register our GUIDs. + // + + status = _RegisterTraceGuids (PerflogCallback, + LogParams, + &LogParams->ControlGuid, + LogParams->NumberOfTraceGuids, + LogParams->TraceGuids, + NULL, + NULL, + &PerflogRegHandle); + + return (status == ERROR_SUCCESS); +} + +// +// This routine shuts down performance logging. +// + +VOID +PerflogShutdown ( + VOID + ) +{ + if (!EventTracingAvailable) { + return; + } + + _UnregisterTraceGuids (PerflogRegHandle); + PerflogRegHandle = NULL; + PerflogTraceHandle = NULL; +} + +// +// Event tracing callback routine. +// It's called when controllers call event tracing control functions. +// + +ULONG +WINAPI +PerflogCallback ( + WMIDPREQUESTCODE RequestCode, + __in PVOID Context, + __out ULONG* BufferSize, + __in PVOID Buffer + ) +{ + ULONG status; + + UNREFERENCED_PARAMETER (Context); + + ASSERT (EventTracingAvailable); + + status = ERROR_SUCCESS; + + switch (RequestCode) { + + case WMI_ENABLE_EVENTS: + PerflogTraceHandle = _GetTraceLoggerHandle (Buffer); + PerflogEnableFlags = _GetTraceEnableFlags (PerflogTraceHandle); + PerflogEnableLevel = _GetTraceEnableLevel (PerflogTraceHandle); + break; + + case WMI_DISABLE_EVENTS: + PerflogTraceHandle = NULL; + PerflogEnableFlags = 0; + PerflogEnableLevel = 0; + break; + + default: + status = ERROR_INVALID_PARAMETER; + } + + if (OnStateChanged != NULL) { + OnStateChanged(); + } + + *BufferSize = 0; + return status; +} + +// +// Logging routine. +// + +VOID +PerflogTraceEvent ( + __in PEVENT_TRACE_HEADER Event + ) +{ + if (!EventTracingAvailable) { + return; + } + + _TraceEvent (PerflogTraceHandle, Event); +} + +VOID +PerflogTraceEventLevel( + ULONG Level, + __in PEVENT_TRACE_HEADER Event + ) +{ + if ((!EventTracingAvailable) || (Level <= PerflogModuleLevel)) { + return; + } + + _TraceEvent (PerflogTraceHandle, Event); +} + +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/perflog.h
Added
@@ -0,0 +1,56 @@ +//------------------------------------------------------------------------------ +// File: perflog.h +// +// Desc: Performance logging framework. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + +typedef struct _PERFLOG_LOGGING_PARAMS { + GUID ControlGuid; + void (*OnStateChanged)(void); + ULONG NumberOfTraceGuids; + TRACE_GUID_REGISTRATION TraceGuidsANYSIZE_ARRAY; +} PERFLOG_LOGGING_PARAMS, *PPERFLOG_LOGGING_PARAMS; + +BOOL +PerflogInitIfEnabled( + IN HINSTANCE hInstance, + __in PPERFLOG_LOGGING_PARAMS LogParams + ); + +BOOL +PerflogInitialize ( + __in PPERFLOG_LOGGING_PARAMS LogParams + ); + +VOID +PerflogShutdown ( + VOID + ); + +VOID +PerflogTraceEvent ( + __in PEVENT_TRACE_HEADER Event + ); + +extern ULONG PerflogEnableFlags; +extern UCHAR PerflogEnableLevel; +extern ULONG PerflogModuleLevel; +extern TRACEHANDLE PerflogTraceHandle; +extern TRACEHANDLE PerflogRegHandle; + +#define PerflogTracingEnabled() (PerflogTraceHandle != 0) + +#define PerflogEvent( _x_ ) PerflogTraceEventLevel _x_ + +VOID +PerflogTraceEventLevel( + ULONG Level, + __in PEVENT_TRACE_HEADER Event + ); + +VOID +PerflogTraceEvent ( + __in PEVENT_TRACE_HEADER Event + );
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/perfstruct.h
Added
@@ -0,0 +1,194 @@ +//------------------------------------------------------------------------------ +// File: PerfStruct.h +// +// Desc: Structures for DirectShow performance logging. +// +// Copyright (c) 2000-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef _PERFSTRUCT_H_ +#define _PERFSTRUCT_H_ + +#include <wmistr.h> +#include <evntrace.h> + +// {28CF047A-2437-4b24-B653-B9446A419A69} +DEFINE_GUID(GUID_DSHOW_CTL, +0x28cf047a, 0x2437, 0x4b24, 0xb6, 0x53, 0xb9, 0x44, 0x6a, 0x41, 0x9a, 0x69); + +// {D0DA7AD6-AE80-4de5-AAFC-C126711E7593} +DEFINE_GUID(GUID_VIDEOREND, +0xd0da7ad6, 0xae80, 0x4de5, 0xaa, 0xfc, 0xc1, 0x26, 0x71, 0x1e, 0x75, 0x93); + +// {DC70AC3E-93E5-48db-88AB-E42064EC276A} +DEFINE_GUID(GUID_DSOUNDGLITCH, +0xdc70ac3e, 0x93e5, 0x48db, 0x88, 0xab, 0xe4, 0x20, 0x64, 0xec, 0x27, 0x6a); + +// {3d7e7d93-2fc8-4a07-a719-e0922ff2899} +DEFINE_GUID(GUID_STREAMTRACE, +0x3d7e7d93, 0x2fc8, 0x4a07, 0xa7, 0x19, 0xe0, 0x92, 0x2f, 0xf2, 0x89, 0x9e); + +// AZFIX: the following GUIDs aren't useful right now. + +// {3C33F7F5-EE54-493c-BA25-1656539C05AC} +DEFINE_GUID(GUID_GETTIME, +0x3c33f7f5, 0xee54, 0x493c, 0xba, 0x25, 0x16, 0x56, 0x53, 0x9c, 0x5, 0xac); + +// {CC44B44D-8169-4952-9E4A-A4E13295E492} +DEFINE_GUID(GUID_AUDIOREND, +0xcc44b44d, 0x8169, 0x4952, 0x9e, 0x4a, 0xa4, 0xe1, 0x32, 0x95, 0xe4, 0x92); + +// {775D19BF-4D8B-4de6-8DC9-66BAC7B310A2} +DEFINE_GUID(GUID_FRAMEDROP, +0x775d19bf, 0x4d8b, 0x4de6, 0x8d, 0xc9, 0x66, 0xba, 0xc7, 0xb3, 0x10, 0xa2); + +// {56D29065-EFBE-42dc-8C29-E325DC9C27D5} +DEFINE_GUID(GUID_AUDIOBREAK, +0x56d29065, 0xefbe, 0x42dc, 0x8c, 0x29, 0xe3, 0x25, 0xdc, 0x9c, 0x27, 0xd5); + +// {E1E6EA87-95A8-497e-BFBA-0295AEBCC707} +DEFINE_GUID(GUID_AUDIORECV, +0xe1e6ea87, 0x95a8, 0x497e, 0xbf, 0xba, 0x2, 0x95, 0xae, 0xbc, 0xc7, 0x7); + +// {10F7768A-B1E7-4242-AD90-A2D44683D9F0} +DEFINE_GUID(GUID_AUDIOSLAVE, +0x10f7768a, 0xb1e7, 0x4242, 0xad, 0x90, 0xa2, 0xd4, 0x46, 0x83, 0xd9, 0xf0); + +// {8983803D-691A-49bc-8FF6-962A39C0198F} +DEFINE_GUID(GUID_AUDIOADDBREAK, +0x8983803d, 0x691a, 0x49bc, 0x8f, 0xf6, 0x96, 0x2a, 0x39, 0xc0, 0x19, 0x8f); + +#define GLITCHTYPE_DSOUNDFIRSTGOOD 0 +#define GLITCHTYPE_DSOUNDFIRSTBAD 1 + +typedef struct PERFINFO_DSHOW_AUDIOGLITCH { + ULONGLONG cycleCounter; + DWORD glitchType; + LONGLONG sampleTime; + LONGLONG previousTime; + ULONG_PTR instanceId; +} PERFINFO_DSHOW_AUDIOGLITCH, *PPERFINFO_DSHOW_AUDIOGLITCH; + +typedef struct PERFINFO_WMI_AUDIOGLITCH { + EVENT_TRACE_HEADER header; + PERFINFO_DSHOW_AUDIOGLITCH data; +} PERFINFO_WMI_AUDIO_GLITCH, *PPERFINFO_WMI_AUDIOGLITCH; + +typedef struct PERFINFO_DSHOW_GETTIME { + ULONGLONG cycleCounter; + ULONGLONG dshowClock; +} PERFINFO_DSHOW_GETTIME, *PPERFINFO_DSHOW_GETTIME; + +typedef struct PERFINFO_WMI_GETTIME { + EVENT_TRACE_HEADER header; + PERFINFO_DSHOW_GETTIME data; +} PERFINFO_WMI_GETTIME, *PPERFINFO_WMI_GETTIME; + +typedef struct PERFINFO_DSHOW_AVREND { + ULONGLONG cycleCounter; + ULONGLONG dshowClock; + ULONGLONG sampleTime; +} PERFINFO_DSHOW_AVREND, *PPERFINFO_DSHOW_AVREND; + +typedef struct PERFINFO_WMI_AVREND { + EVENT_TRACE_HEADER header; + PERFINFO_DSHOW_AVREND data; +} PERFINFO_WMI_AVREND, *PPERFINFO_WMI_AVREND; + +typedef struct PERFINFO_DSHOW_AUDIOBREAK { + ULONGLONG cycleCounter; + ULONGLONG dshowClock; + ULONGLONG sampleTime; + ULONGLONG sampleDuration; +} PERFINFO_DSHOW_AUDIOBREAK, *PPERFINFO_DSHOW_AUDIOBREAK; + +typedef struct PERFINFO_WMI_AUDIOBREAK { + EVENT_TRACE_HEADER header; + PERFINFO_DSHOW_AUDIOBREAK data; +} PERFINFO_WMI_AUDIOBREAK, *PPERFINFO_WMI_AUDIOBREAK; + +typedef struct PERFINFO_DSHOW_FRAMEDROP { + ULONGLONG cycleCounter; + ULONGLONG dshowClock; + ULONGLONG frameTime; +} PERFINFO_DSHOW_FRAMEDROP, *PPERFINFO_DSHOW_FRAMEDROP; + +typedef struct PERFINFO_WMI_FRAMEDROP { + EVENT_TRACE_HEADER header; + PERFINFO_DSHOW_FRAMEDROP data; +} PERFINFO_WMI_FRAMEDROP, *PPERFINFO_WMI_FRAMEDROP; + +#define PERFINFO_STREAMTRACE_MPEG2DEMUX_PTS_TRANSLATION 1 +#define PERFINFO_STREAMTRACE_MPEG2DEMUX_SAMPLE_RECEIVED 2 +#define PERFINFO_STREAMTRACE_VMR_BEGIN_ADVISE 3 +#define PERFINFO_STREAMTRACE_VMR_END_ADVISE 4 +#define PERFINFO_STREAMTRACE_VMR_RECEIVE 5 +#define PERFINFO_STREAMTRACE_VMR_BEGIN_DEINTERLACE 6 +#define PERFINFO_STREAMTRACE_VMR_END_DEINTERLACE 7 +#define PERFINFO_STREAMTRACE_VMR_BEGIN_DECODE 8 +#define PERFINFO_STREAMTRACE_VMR_END_DECODE 9 +#define PERFINFO_STREAMTRACE_VMR_DROPPED_FRAME 10 +#define PERFINFO_STREAMTRACE_ENCDEC_DTFILTERINPUT 11 +#define PERFINFO_STREAMTRACE_ENCDEC_DTFILTEROUTPUT 12 +#define PERFINFO_STREAMTRACE_ENCDEC_ETFILTERINPUT 13 +#define PERFINFO_STREAMTRACE_ENCDEC_ETFILTEROUTPUT 14 +#define PERFINFO_STREAMTRACE_ENCDEC_XDSCODECINPUT 15 +#define PERFINFO_STREAMTRACE_SBE_DVRANALYSISINPUT_RECEIVE 16 +#define PERFINFO_STREAMTRACE_SBE_DVRANALYSISINPUT_DELIVER 17 +#define PERFINFO_STREAMTRACE_SBE_DVRINPUTPIN_RECEIVE 18 +#define PERFINFO_STREAMTRACE_SBE_DVROUTPUTPIN_RECEIVE 19 +#define PERFINFO_STREAMTRACE_VMR_RENDER_TIME 20 + +typedef struct _PERFINFO_DSHOW_STREAMTRACE { + ULONG id; + ULONG reserved; + ULONGLONG dshowClock; + ULONGLONG data 4 ; +} PERFINFO_DSHOW_STREAMTRACE, *PPERFINFO_DSHOW_STREAMTRACE; + +typedef struct _PERFINFO_WMI_STREAMTRACE { + EVENT_TRACE_HEADER header; + PERFINFO_DSHOW_STREAMTRACE data; +} PERFINFO_WMI_STREAMTRACE, *PPERFINFO_WMI_STREAMTRACE; + + +typedef struct PERFINFO_DSHOW_AUDIORECV { + LONGLONG streamTime ; + LONGLONG sampleStart ; + LONGLONG sampleStop ; + LONGLONG hwduration ; + BOOL discontinuity ; +} PERFINFO_DSHOW_AUDIORECV, *PPERFINFO_DSHOW_AUDIORECV; + +typedef struct PERFINFO_WMI_AUDIORECV { + EVENT_TRACE_HEADER header; + PERFINFO_DSHOW_AUDIORECV data; +} PERFINFO_WMI_AUDIORECV, *PPERFINFO_WMI_AUDIORECV; + +typedef struct PERFINFO_DSHOW_AUDIOSLAVE { + LONGLONG masterClock ; + LONGLONG slaveClock ; + LONGLONG errorAccum ; + LONGLONG lastHighErrorSeen ; + LONGLONG lastLowErrorSeen ; +} PERFINFO_DSHOW_AUDIOSLAVE, *PPERFINFO_DSHOW_AUDIOSLAVE; + +typedef struct PERFINFO_WMI_AUDIOSLAVE { + EVENT_TRACE_HEADER header; + PERFINFO_DSHOW_AUDIOSLAVE data; +} PERFINFO_WMI_AUDIOSLAVE, *PPERFINFO_WMI_AUDIOSLAVE; + +typedef struct PERFINFO_DSHOW_AUDIOADDBREAK { + DWORD iterNextWrite ; + DWORD offsetNextWrite ; + DWORD iterWrite ; + DWORD offsetWrite ; +} PERFINFO_DSHOW_AUDIOADDBREAK, *PPERFINFO_DSHOW_AUDIOADDBREAK; + +typedef struct PERFINFO_WMI_AUDIOADDBREAK { + EVENT_TRACE_HEADER header; + PERFINFO_DSHOW_AUDIOADDBREAK data; +} PERFINFO_WMI_AUDIOADDBREAK, *PPERFINFO_WMI_AUDIOADDBREAK; + +#endif // _PREFSTRUCT_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/pstream.cpp
Added
@@ -0,0 +1,197 @@ +//------------------------------------------------------------------------------ +// File: PStream.cpp +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include <strsafe.h> + +#ifdef PERF +#include <measure.h> +#endif +// #include "pstream.h" in streams.h + +// +// Constructor +// +CPersistStream::CPersistStream(IUnknown *punk, __inout HRESULT *phr) + : mPS_fDirty(FALSE) +{ + mPS_dwFileVersion = GetSoftwareVersion(); +} + + +// +// Destructor +// +CPersistStream::~CPersistStream() { + // Nothing to do +} + +#if 0 +SAMPLE CODE TO COPY - not active at the moment + +// +// NonDelegatingQueryInterface +// +// This object supports IPersist & IPersistStream +STDMETHODIMP CPersistStream::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + if (riid == IID_IPersist) { + return GetInterface((IPersist *) this, ppv); // ??? + } + else if (riid == IID_IPersistStream) { + return GetInterface((IPersistStream *) this, ppv); + } + else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } +} +#endif + + +// +// WriteToStream +// +// Writes to the stream (default action is to write nothing) +HRESULT CPersistStream::WriteToStream(IStream *pStream) +{ + // You can override this to do things like + // hr = pStream->Write(MyStructure, sizeof(MyStructure), NULL); + + return NOERROR; +} + + + +HRESULT CPersistStream::ReadFromStream(IStream * pStream) +{ + // You can override this to do things like + // hr = pStream->Read(MyStructure, sizeof(MyStructure), NULL); + + return NOERROR; +} + + +// +// Load +// +// Load all the data from the given stream +STDMETHODIMP CPersistStream::Load(LPSTREAM pStm) +{ + HRESULT hr; + // Load the version number then the data + mPS_dwFileVersion = ReadInt(pStm, hr); + if (FAILED(hr)) { + return hr; + } + + return ReadFromStream(pStm); +} // Load + + + +// +// Save +// +// Save the contents of this Stream. +STDMETHODIMP CPersistStream::Save(LPSTREAM pStm, BOOL fClearDirty) +{ + + HRESULT hr = WriteInt(pStm, GetSoftwareVersion()); + if (FAILED(hr)) { + return hr; + } + + hr = WriteToStream(pStm); + if (FAILED(hr)) { + return hr; + } + + mPS_fDirty = !fClearDirty; + + return hr; +} // Save + + +// WriteInt +// +// Writes an integer to an IStream as 11 UNICODE characters followed by one space. +// You could use this for shorts or unsigneds or anything (up to 32 bits) +// where the value isn't actually truncated by squeezing it into 32 bits. +// Values such as (unsigned) 0x80000000 would come out as -2147483648 +// but would then load as 0x80000000 through ReadInt. Cast as you please. + +STDAPI WriteInt(IStream *pIStream, int n) +{ + WCHAR Buff13; // Allows for trailing null that we don't write + (void)StringCchPrintfW(Buff, NUMELMS(Buff),L"%011d ",n); + return pIStream->Write(&(Buff0), 12*sizeof(WCHAR), NULL); +} // WriteInt + + +// ReadInt +// +// Reads an integer from an IStream. +// Read as 4 bytes. You could use this for shorts or unsigneds or anything +// where the value isn't actually truncated by squeezing it into 32 bits +// Striped down subset of what sscanf can do (without dragging in the C runtime) + +STDAPI_(int) ReadInt(IStream *pIStream, __out HRESULT &hr) +{ + + int Sign = 1; + unsigned int n = 0; // result wil be n*Sign + WCHAR wch; + + hr = pIStream->Read( &wch, sizeof(wch), NULL); + if (FAILED(hr)) { + return 0; + } + + if (wch==L'-'){ + Sign = -1; + hr = pIStream->Read( &wch, sizeof(wch), NULL); + if (FAILED(hr)) { + return 0; + } + } + + for( ; ; ) { + if (wch>=L'0' && wch<=L'9') { + n = 10*n+(int)(wch-L'0'); + } else if ( wch == L' ' + || wch == L'\t' + || wch == L'\r' + || wch == L'\n' + || wch == L'\0' + ) { + break; + } else { + hr = VFW_E_INVALID_FILE_FORMAT; + return 0; + } + + hr = pIStream->Read( &wch, sizeof(wch), NULL); + if (FAILED(hr)) { + return 0; + } + } + + if (n==0x80000000 && Sign==-1) { + // This is the negative number that has no positive version! + return (int)n; + } + else return (int)n * Sign; +} // ReadInt + + +// The microsoft C/C++ compile generates level 4 warnings to the effect that +// a particular inline function (from some base class) was not needed. +// This line gets rid of hundreds of such unwanted messages and makes +// -W4 compilation feasible: +#pragma warning(disable: 4514)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/pstream.h
Added
@@ -0,0 +1,114 @@ +//------------------------------------------------------------------------------ +// File: PStream.h +// +// Desc: DirectShow base classes - defines a class for persistent properties +// of filters. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __PSTREAM__ +#define __PSTREAM__ + +// Base class for persistent properties of filters +// (i.e. filter properties in saved graphs) + +// The simplest way to use this is: +// 1. Arrange for your filter to inherit this class +// 2. Implement in your class WriteToStream and ReadFromStream +// These will override the "do nothing" functions here. +// 3. Change your NonDelegatingQueryInterface to handle IPersistStream +// 4. Implement SizeMax to return the number of bytes of data you save. +// If you save UNICODE data, don't forget a char is 2 bytes. +// 5. Whenever your data changes, call SetDirty() +// +// At some point you may decide to alter, or extend the format of your data. +// At that point you will wish that you had a version number in all the old +// saved graphs, so that you can tell, when you read them, whether they +// represent the old or new form. To assist you in this, this class +// writes and reads a version number. +// When it writes, it calls GetSoftwareVersion() to enquire what version +// of the software we have at the moment. (In effect this is a version number +// of the data layout in the file). It writes this as the first thing in the data. +// If you want to change the version, implement (override) GetSoftwareVersion(). +// It reads this from the file into mPS_dwFileVersion before calling ReadFromStream, +// so in ReadFromStream you can check mPS_dwFileVersion to see if you are reading +// an old version file. +// Normally you should accept files whose version is no newer than the software +// version that's reading them. + + +// CPersistStream +// +// Implements IPersistStream. +// See 'OLE Programmers Reference (Vol 1):Structured Storage Overview' for +// more implementation information. +class CPersistStream : public IPersistStream { + private: + + // Internal state: + + protected: + DWORD mPS_dwFileVersion; // version number of file (being read) + BOOL mPS_fDirty; + + public: + + // IPersistStream methods + + STDMETHODIMP IsDirty() + {return (mPS_fDirty ? S_OK : S_FALSE);} // note FALSE means clean + STDMETHODIMP Load(LPSTREAM pStm); + STDMETHODIMP Save(LPSTREAM pStm, BOOL fClearDirty); + STDMETHODIMP GetSizeMax(__out ULARGE_INTEGER * pcbSize) + // Allow 24 bytes for version. + { pcbSize->QuadPart = 12*sizeof(WCHAR)+SizeMax(); return NOERROR; } + + // implementation + + CPersistStream(IUnknown *punk, __inout HRESULT *phr); + ~CPersistStream(); + + HRESULT SetDirty(BOOL fDirty) + { mPS_fDirty = fDirty; return NOERROR;} + + + // override to reveal IPersist & IPersistStream + // STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv); + + // --- IPersist --- + + // You must override this to provide your own class id + STDMETHODIMP GetClassID(__out CLSID *pClsid) PURE; + + // overrideable if you want + // file version number. Override it if you ever change format + virtual DWORD GetSoftwareVersion(void) { return 0; } + + + //========================================================================= + // OVERRIDE THESE to read and write your data + // OVERRIDE THESE to read and write your data + // OVERRIDE THESE to read and write your data + + virtual int SizeMax() {return 0;} + virtual HRESULT WriteToStream(IStream *pStream); + virtual HRESULT ReadFromStream(IStream *pStream); + //========================================================================= + + private: + +}; + + +// --- Useful helpers --- + + +// Writes an int to an IStream as UNICODE. +STDAPI WriteInt(IStream *pIStream, int n); + +// inverse of WriteInt +STDAPI_(int) ReadInt(IStream *pIStream, __out HRESULT &hr); + +#endif // __PSTREAM__
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/pullpin.cpp
Added
@@ -0,0 +1,588 @@ +//------------------------------------------------------------------------------ +// File: PullPin.cpp +// +// Desc: DirectShow base classes - implements CPullPin class that pulls data +// from IAsyncReader. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include "pullpin.h" + +#ifdef DXMPERF +#include "dxmperf.h" +#endif // DXMPERF + + +CPullPin::CPullPin() + : m_pReader(NULL), + m_pAlloc(NULL), + m_State(TM_Exit) +{ +#ifdef DXMPERF + PERFLOG_CTOR( L"CPullPin", this ); +#endif // DXMPERF + +} + +CPullPin::~CPullPin() +{ + Disconnect(); + +#ifdef DXMPERF + PERFLOG_DTOR( L"CPullPin", this ); +#endif // DXMPERF + +} + +// returns S_OK if successfully connected to an IAsyncReader interface +// from this object +// Optional allocator should be proposed as a preferred allocator if +// necessary +HRESULT +CPullPin::Connect(IUnknown* pUnk, IMemAllocator* pAlloc, BOOL bSync) +{ + CAutoLock lock(&m_AccessLock); + + if (m_pReader) { + return VFW_E_ALREADY_CONNECTED; + } + + HRESULT hr = pUnk->QueryInterface(IID_IAsyncReader, (void**)&m_pReader); + if (FAILED(hr)) { + +#ifdef DXMPERF + { + AM_MEDIA_TYPE * pmt = NULL; + PERFLOG_CONNECT( this, pUnk, hr, pmt ); + } +#endif // DXMPERF + + return(hr); + } + + hr = DecideAllocator(pAlloc, NULL); + if (FAILED(hr)) { + Disconnect(); + +#ifdef DXMPERF + { + AM_MEDIA_TYPE * pmt = NULL; + PERFLOG_CONNECT( this, pUnk, hr, pmt ); + } +#endif // DXMPERF + + return hr; + } + + LONGLONG llTotal, llAvail; + hr = m_pReader->Length(&llTotal, &llAvail); + if (FAILED(hr)) { + Disconnect(); + +#ifdef DXMPERF + { + AM_MEDIA_TYPE * pmt = NULL; + PERFLOG_CONNECT( this, pUnk, hr, pmt ); + } +#endif + + return hr; + } + + // convert from file position to reference time + m_tDuration = llTotal * UNITS; + m_tStop = m_tDuration; + m_tStart = 0; + + m_bSync = bSync; + +#ifdef DXMPERF + { + AM_MEDIA_TYPE * pmt = NULL; + PERFLOG_CONNECT( this, pUnk, S_OK, pmt ); + } +#endif // DXMPERF + + + return S_OK; +} + +// disconnect any connection made in Connect +HRESULT +CPullPin::Disconnect() +{ + CAutoLock lock(&m_AccessLock); + + StopThread(); + + +#ifdef DXMPERF + PERFLOG_DISCONNECT( this, m_pReader, S_OK ); +#endif // DXMPERF + + + if (m_pReader) { + m_pReader->Release(); + m_pReader = NULL; + } + + if (m_pAlloc) { + m_pAlloc->Release(); + m_pAlloc = NULL; + } + + return S_OK; +} + +// agree an allocator using RequestAllocator - optional +// props param specifies your requirements (non-zero fields). +// returns an error code if fail to match requirements. +// optional IMemAllocator interface is offered as a preferred allocator +// but no error occurs if it can't be met. +HRESULT +CPullPin::DecideAllocator( + IMemAllocator * pAlloc, + __inout_opt ALLOCATOR_PROPERTIES * pProps) +{ + ALLOCATOR_PROPERTIES *pRequest; + ALLOCATOR_PROPERTIES Request; + if (pProps == NULL) { + Request.cBuffers = 3; + Request.cbBuffer = 64*1024; + Request.cbAlign = 0; + Request.cbPrefix = 0; + pRequest = &Request; + } else { + pRequest = pProps; + } + HRESULT hr = m_pReader->RequestAllocator( + pAlloc, + pRequest, + &m_pAlloc); + return hr; +} + +// start pulling data +HRESULT +CPullPin::Active(void) +{ + ASSERT(!ThreadExists()); + return StartThread(); +} + +// stop pulling data +HRESULT +CPullPin::Inactive(void) +{ + StopThread(); + + return S_OK; +} + +HRESULT +CPullPin::Seek(REFERENCE_TIME tStart, REFERENCE_TIME tStop) +{ + CAutoLock lock(&m_AccessLock); + + ThreadMsg AtStart = m_State; + + if (AtStart == TM_Start) { + BeginFlush(); + PauseThread(); + EndFlush(); + } + + m_tStart = tStart; + m_tStop = tStop; + + HRESULT hr = S_OK; + if (AtStart == TM_Start) { + hr = StartThread(); + } + + return hr; +} + +HRESULT +CPullPin::Duration(__out REFERENCE_TIME* ptDuration) +{ + *ptDuration = m_tDuration; + return S_OK; +} + + +HRESULT +CPullPin::StartThread() +{ + CAutoLock lock(&m_AccessLock); + + if (!m_pAlloc || !m_pReader) { + return E_UNEXPECTED; + } + + HRESULT hr; + if (!ThreadExists()) { + + // commit allocator + hr = m_pAlloc->Commit(); + if (FAILED(hr)) { + return hr; + } + + // start thread + if (!Create()) { + return E_FAIL; + } + } + + m_State = TM_Start; + hr = (HRESULT) CallWorker(m_State); + return hr; +} + +HRESULT +CPullPin::PauseThread() +{ + CAutoLock lock(&m_AccessLock); + + if (!ThreadExists()) { + return E_UNEXPECTED; + } + + // need to flush to ensure the thread is not blocked + // in WaitForNext + HRESULT hr = m_pReader->BeginFlush(); + if (FAILED(hr)) { + return hr; + } + + m_State = TM_Pause; + hr = CallWorker(TM_Pause); + + m_pReader->EndFlush(); + return hr; +} + +HRESULT +CPullPin::StopThread() +{ + CAutoLock lock(&m_AccessLock); + + if (!ThreadExists()) { + return S_FALSE; + } + + // need to flush to ensure the thread is not blocked + // in WaitForNext + HRESULT hr = m_pReader->BeginFlush(); + if (FAILED(hr)) { + return hr; + } + + m_State = TM_Exit; + hr = CallWorker(TM_Exit); + + m_pReader->EndFlush(); + + // wait for thread to completely exit + Close(); + + // decommit allocator + if (m_pAlloc) { + m_pAlloc->Decommit(); + } + + return S_OK; +} + + +DWORD +CPullPin::ThreadProc(void) +{ + while(1) { + DWORD cmd = GetRequest(); + switch(cmd) { + case TM_Exit: + Reply(S_OK); + return 0; + + case TM_Pause: + // we are paused already + Reply(S_OK); + break; + + case TM_Start: + Reply(S_OK); + Process(); + break; + } + + // at this point, there should be no outstanding requests on the + // upstream filter. + // We should force begin/endflush to ensure that this is true. + // !!!Note that we may currently be inside a BeginFlush/EndFlush pair + // on another thread, but the premature EndFlush will do no harm now + // that we are idle. + m_pReader->BeginFlush(); + CleanupCancelled(); + m_pReader->EndFlush(); + } +} + +HRESULT +CPullPin::QueueSample( + __inout REFERENCE_TIME& tCurrent, + REFERENCE_TIME tAlignStop, + BOOL bDiscontinuity + ) +{ + IMediaSample* pSample; + + HRESULT hr = m_pAlloc->GetBuffer(&pSample, NULL, NULL, 0); + if (FAILED(hr)) { + return hr; + } + + LONGLONG tStopThis = tCurrent + (pSample->GetSize() * UNITS); + if (tStopThis > tAlignStop) { + tStopThis = tAlignStop; + } + pSample->SetTime(&tCurrent, &tStopThis); + tCurrent = tStopThis; + + pSample->SetDiscontinuity(bDiscontinuity); + + hr = m_pReader->Request( + pSample, + 0); + if (FAILED(hr)) { + pSample->Release(); + + CleanupCancelled(); + OnError(hr); + } + return hr; +} + +HRESULT +CPullPin::CollectAndDeliver( + REFERENCE_TIME tStart, + REFERENCE_TIME tStop) +{ + IMediaSample* pSample = NULL; // better be sure pSample is set + DWORD_PTR dwUnused; + HRESULT hr = m_pReader->WaitForNext( + INFINITE, + &pSample, + &dwUnused); + if (FAILED(hr)) { + if (pSample) { + pSample->Release(); + } + } else { + hr = DeliverSample(pSample, tStart, tStop); + } + if (FAILED(hr)) { + CleanupCancelled(); + OnError(hr); + } + return hr; + +} + +HRESULT +CPullPin::DeliverSample( + IMediaSample* pSample, + REFERENCE_TIME tStart, + REFERENCE_TIME tStop + ) +{ + // fix up sample if past actual stop (for sector alignment) + REFERENCE_TIME t1, t2; + if (S_OK == pSample->GetTime(&t1, &t2)) { + if (t2 > tStop) { + t2 = tStop; + } + + // adjust times to be relative to (aligned) start time + t1 -= tStart; + t2 -= tStart; + HRESULT hr = pSample->SetTime(&t1, &t2); + if (FAILED(hr)) { + return hr; + } + } + +#ifdef DXMPERF + { + AM_MEDIA_TYPE * pmt = NULL; + pSample->GetMediaType( &pmt ); + PERFLOG_RECEIVE( L"CPullPin", m_pReader, this, pSample, pmt ); + } +#endif + + HRESULT hr = Receive(pSample); + pSample->Release(); + return hr; +} + +void +CPullPin::Process(void) +{ + // is there anything to do? + if (m_tStop <= m_tStart) { + EndOfStream(); + return; + } + + BOOL bDiscontinuity = TRUE; + + // if there is more than one sample at the allocator, + // then try to queue 2 at once in order to overlap. + // -- get buffer count and required alignment + ALLOCATOR_PROPERTIES Actual; + HRESULT hr = m_pAlloc->GetProperties(&Actual); + + // align the start position downwards + REFERENCE_TIME tStart = AlignDown(m_tStart / UNITS, Actual.cbAlign) * UNITS; + REFERENCE_TIME tCurrent = tStart; + + REFERENCE_TIME tStop = m_tStop; + if (tStop > m_tDuration) { + tStop = m_tDuration; + } + + // align the stop position - may be past stop, but that + // doesn't matter + REFERENCE_TIME tAlignStop = AlignUp(tStop / UNITS, Actual.cbAlign) * UNITS; + + + DWORD dwRequest; + + if (!m_bSync) { + + // Break out of the loop either if we get to the end or we're asked + // to do something else + while (tCurrent < tAlignStop) { + + // Break out without calling EndOfStream if we're asked to + // do something different + if (CheckRequest(&dwRequest)) { + return; + } + + // queue a first sample + if (Actual.cBuffers > 1) { + + hr = QueueSample(tCurrent, tAlignStop, TRUE); + bDiscontinuity = FALSE; + + if (FAILED(hr)) { + return; + } + } + + + + // loop queueing second and waiting for first.. + while (tCurrent < tAlignStop) { + + hr = QueueSample(tCurrent, tAlignStop, bDiscontinuity); + bDiscontinuity = FALSE; + + if (FAILED(hr)) { + return; + } + + hr = CollectAndDeliver(tStart, tStop); + if (S_OK != hr) { + + // stop if error, or if downstream filter said + // to stop. + return; + } + } + + if (Actual.cBuffers > 1) { + hr = CollectAndDeliver(tStart, tStop); + if (FAILED(hr)) { + return; + } + } + } + } else { + + // sync version of above loop + while (tCurrent < tAlignStop) { + + // Break out without calling EndOfStream if we're asked to + // do something different + if (CheckRequest(&dwRequest)) { + return; + } + + IMediaSample* pSample; + + hr = m_pAlloc->GetBuffer(&pSample, NULL, NULL, 0); + if (FAILED(hr)) { + OnError(hr); + return; + } + + LONGLONG tStopThis = tCurrent + (pSample->GetSize() * UNITS); + if (tStopThis > tAlignStop) { + tStopThis = tAlignStop; + } + pSample->SetTime(&tCurrent, &tStopThis); + tCurrent = tStopThis; + + if (bDiscontinuity) { + pSample->SetDiscontinuity(TRUE); + bDiscontinuity = FALSE; + } + + hr = m_pReader->SyncReadAligned(pSample); + + if (FAILED(hr)) { + pSample->Release(); + OnError(hr); + return; + } + + hr = DeliverSample(pSample, tStart, tStop); + if (hr != S_OK) { + if (FAILED(hr)) { + OnError(hr); + } + return; + } + } + } + + EndOfStream(); +} + +// after a flush, cancelled i/o will be waiting for collection +// and release +void +CPullPin::CleanupCancelled(void) +{ + while (1) { + IMediaSample * pSample; + DWORD_PTR dwUnused; + + HRESULT hr = m_pReader->WaitForNext( + 0, // no wait + &pSample, + &dwUnused); + if(pSample) { + pSample->Release(); + } else { + // no more samples + return; + } + } +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/pullpin.h
Added
@@ -0,0 +1,152 @@ +//------------------------------------------------------------------------------ +// File: PullPin.h +// +// Desc: DirectShow base classes - defines CPullPin class. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __PULLPIN_H__ +#define __PULLPIN_H__ + +// +// CPullPin +// +// object supporting pulling data from an IAsyncReader interface. +// Given a start/stop position, calls a pure Receive method with each +// IMediaSample received. +// +// This is essentially for use in a MemInputPin when it finds itself +// connected to an IAsyncReader pin instead of a pushing pin. +// + +class CPullPin : public CAMThread +{ + IAsyncReader* m_pReader; + REFERENCE_TIME m_tStart; + REFERENCE_TIME m_tStop; + REFERENCE_TIME m_tDuration; + BOOL m_bSync; + + enum ThreadMsg { + TM_Pause, // stop pulling and wait for next message + TM_Start, // start pulling + TM_Exit, // stop and exit + }; + + ThreadMsg m_State; + + // override pure thread proc from CAMThread + DWORD ThreadProc(void); + + // running pull method (check m_bSync) + void Process(void); + + // clean up any cancelled i/o after a flush + void CleanupCancelled(void); + + // suspend thread from pulling, eg during seek + HRESULT PauseThread(); + + // start thread pulling - create thread if necy + HRESULT StartThread(); + + // stop and close thread + HRESULT StopThread(); + + // called from ProcessAsync to queue and collect requests + HRESULT QueueSample( + __inout REFERENCE_TIME& tCurrent, + REFERENCE_TIME tAlignStop, + BOOL bDiscontinuity); + + HRESULT CollectAndDeliver( + REFERENCE_TIME tStart, + REFERENCE_TIME tStop); + + HRESULT DeliverSample( + IMediaSample* pSample, + REFERENCE_TIME tStart, + REFERENCE_TIME tStop); + +protected: + IMemAllocator * m_pAlloc; + +public: + CPullPin(); + virtual ~CPullPin(); + + // returns S_OK if successfully connected to an IAsyncReader interface + // from this object + // Optional allocator should be proposed as a preferred allocator if + // necessary + // bSync is TRUE if we are to use sync reads instead of the + // async methods. + HRESULT Connect(IUnknown* pUnk, IMemAllocator* pAlloc, BOOL bSync); + + // disconnect any connection made in Connect + HRESULT Disconnect(); + + // agree an allocator using RequestAllocator - optional + // props param specifies your requirements (non-zero fields). + // returns an error code if fail to match requirements. + // optional IMemAllocator interface is offered as a preferred allocator + // but no error occurs if it can't be met. + virtual HRESULT DecideAllocator( + IMemAllocator* pAlloc, + __inout_opt ALLOCATOR_PROPERTIES * pProps); + + // set start and stop position. if active, will start immediately at + // the new position. Default is 0 to duration + HRESULT Seek(REFERENCE_TIME tStart, REFERENCE_TIME tStop); + + // return the total duration + HRESULT Duration(__out REFERENCE_TIME* ptDuration); + + // start pulling data + HRESULT Active(void); + + // stop pulling data + HRESULT Inactive(void); + + // helper functions + LONGLONG AlignDown(LONGLONG ll, LONG lAlign) { + // aligning downwards is just truncation + return ll & ~(lAlign-1); + }; + + LONGLONG AlignUp(LONGLONG ll, LONG lAlign) { + // align up: round up to next boundary + return (ll + (lAlign -1)) & ~(lAlign -1); + }; + + // GetReader returns the (addrefed) IAsyncReader interface + // for SyncRead etc + IAsyncReader* GetReader() { + m_pReader->AddRef(); + return m_pReader; + }; + + // -- pure -- + + // override this to handle data arrival + // return value other than S_OK will stop data + virtual HRESULT Receive(IMediaSample*) PURE; + + // override this to handle end-of-stream + virtual HRESULT EndOfStream(void) PURE; + + // called on runtime errors that will have caused pulling + // to stop + // these errors are all returned from the upstream filter, who + // will have already reported any errors to the filtergraph. + virtual void OnError(HRESULT hr) PURE; + + // flush this pin and all downstream + virtual HRESULT BeginFlush() PURE; + virtual HRESULT EndFlush() PURE; + +}; + +#endif //__PULLPIN_H__
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/refclock.cpp
Added
@@ -0,0 +1,402 @@ +//------------------------------------------------------------------------------ +// File: RefClock.cpp +// +// Desc: DirectShow base classes - implements the IReferenceClock interface. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include <limits.h> + +#ifdef DXMPERF +#include "dxmperf.h" +#endif // DXMPERF + + +// 'this' used in constructor list +#pragma warning(disable:4355) + + +STDMETHODIMP CBaseReferenceClock::NonDelegatingQueryInterface( + REFIID riid, + __deref_out void ** ppv) +{ + HRESULT hr; + + if (riid == IID_IReferenceClock) + { + hr = GetInterface((IReferenceClock *) this, ppv); + } + else if (riid == IID_IReferenceClockTimerControl) + { + hr = GetInterface((IReferenceClockTimerControl *) this, ppv); + } + else + { + hr = CUnknown::NonDelegatingQueryInterface(riid, ppv); + } + return hr; +} + +CBaseReferenceClock::~CBaseReferenceClock() +{ +#ifdef DXMPERF + PERFLOG_DTOR( L"CBaseReferenceClock", (IReferenceClock *) this ); +#endif // DXMPERF + + if (m_TimerResolution) timeEndPeriod(m_TimerResolution); + + if (m_pSchedule) + { + m_pSchedule->DumpLinkedList(); + } + + if (m_hThread) + { + m_bAbort = TRUE; + TriggerThread(); + WaitForSingleObject( m_hThread, INFINITE ); + EXECUTE_ASSERT( CloseHandle(m_hThread) ); + m_hThread = 0; + EXECUTE_ASSERT( CloseHandle(m_pSchedule->GetEvent()) ); + delete m_pSchedule; + } +} + +// A derived class may supply a hThreadEvent if it has its own thread that will take care +// of calling the schedulers Advise method. (Refere to CBaseReferenceClock::AdviseThread() +// to see what such a thread has to do.) +CBaseReferenceClock::CBaseReferenceClock( __in_opt LPCTSTR pName, + __inout_opt LPUNKNOWN pUnk, + __inout HRESULT *phr, + __inout_opt CAMSchedule * pShed ) +: CUnknown( pName, pUnk ) +, m_rtLastGotTime(0) +, m_TimerResolution(0) +, m_bAbort( FALSE ) +, m_pSchedule( pShed ? pShed : new CAMSchedule(CreateEvent(NULL, FALSE, FALSE, NULL)) ) +, m_hThread(0) +{ + +#ifdef DXMPERF + PERFLOG_CTOR( pName ? pName : L"CBaseReferenceClock", (IReferenceClock *) this ); +#endif // DXMPERF + + ASSERT(m_pSchedule); + if (!m_pSchedule) + { + *phr = E_OUTOFMEMORY; + } + else + { + // Set up the highest resolution timer we can manage + TIMECAPS tc; + m_TimerResolution = (TIMERR_NOERROR == timeGetDevCaps(&tc, sizeof(tc))) + ? tc.wPeriodMin + : 1; + + timeBeginPeriod(m_TimerResolution); + + /* Initialise our system times - the derived clock should set the right values */ + m_dwPrevSystemTime = timeGetTime(); + m_rtPrivateTime = (UNITS / MILLISECONDS) * m_dwPrevSystemTime; + + #ifdef PERF + m_idGetSystemTime = MSR_REGISTER(TEXT("CBaseReferenceClock::GetTime")); + #endif + + if ( !pShed ) + { + DWORD ThreadID; + m_hThread = ::CreateThread(NULL, // Security attributes + (DWORD) 0, // Initial stack size + AdviseThreadFunction, // Thread start address + (LPVOID) this, // Thread parameter + (DWORD) 0, // Creation flags + &ThreadID); // Thread identifier + + if (m_hThread) + { + SetThreadPriority( m_hThread, THREAD_PRIORITY_TIME_CRITICAL ); + } + else + { + *phr = E_FAIL; + EXECUTE_ASSERT( CloseHandle(m_pSchedule->GetEvent()) ); + delete m_pSchedule; + m_pSchedule = NULL; + } + } + } +} + +void CBaseReferenceClock::Restart (IN REFERENCE_TIME rtMinTime) +{ + Lock(); + m_rtLastGotTime = rtMinTime ; + Unlock(); +} + +STDMETHODIMP CBaseReferenceClock::GetTime(__out REFERENCE_TIME *pTime) +{ + HRESULT hr; + if (pTime) + { + REFERENCE_TIME rtNow; + Lock(); + rtNow = GetPrivateTime(); + if (rtNow > m_rtLastGotTime) + { + m_rtLastGotTime = rtNow; + hr = S_OK; + } + else + { + hr = S_FALSE; + } + *pTime = m_rtLastGotTime; + Unlock(); + MSR_INTEGER(m_idGetSystemTime, LONG((*pTime) / (UNITS/MILLISECONDS)) ); + +#ifdef DXMPERF + PERFLOG_GETTIME( (IReferenceClock *) this, *pTime ); +#endif // DXMPERF + + } + else hr = E_POINTER; + + return hr; +} + +/* Ask for an async notification that a time has elapsed */ + +STDMETHODIMP CBaseReferenceClock::AdviseTime( + REFERENCE_TIME baseTime, // base reference time + REFERENCE_TIME streamTime, // stream offset time + HEVENT hEvent, // advise via this event + __out DWORD_PTR *pdwAdviseCookie)// where your cookie goes +{ + CheckPointer(pdwAdviseCookie, E_POINTER); + *pdwAdviseCookie = 0; + + // Check that the event is not already set + ASSERT(WAIT_TIMEOUT == WaitForSingleObject(HANDLE(hEvent),0)); + + HRESULT hr; + + const REFERENCE_TIME lRefTime = baseTime + streamTime; + if ( lRefTime <= 0 || lRefTime == MAX_TIME ) + { + hr = E_INVALIDARG; + } + else + { + *pdwAdviseCookie = m_pSchedule->AddAdvisePacket( lRefTime, 0, HANDLE(hEvent), FALSE ); + hr = *pdwAdviseCookie ? NOERROR : E_OUTOFMEMORY; + } + return hr; +} + + +/* Ask for an asynchronous periodic notification that a time has elapsed */ + +STDMETHODIMP CBaseReferenceClock::AdvisePeriodic( + REFERENCE_TIME StartTime, // starting at this time + REFERENCE_TIME PeriodTime, // time between notifications + HSEMAPHORE hSemaphore, // advise via a semaphore + __out DWORD_PTR *pdwAdviseCookie) // where your cookie goes +{ + CheckPointer(pdwAdviseCookie, E_POINTER); + *pdwAdviseCookie = 0; + + HRESULT hr; + if (StartTime > 0 && PeriodTime > 0 && StartTime != MAX_TIME ) + { + *pdwAdviseCookie = m_pSchedule->AddAdvisePacket( StartTime, PeriodTime, HANDLE(hSemaphore), TRUE ); + hr = *pdwAdviseCookie ? NOERROR : E_OUTOFMEMORY; + } + else hr = E_INVALIDARG; + + return hr; +} + + +STDMETHODIMP CBaseReferenceClock::Unadvise(DWORD_PTR dwAdviseCookie) +{ + return m_pSchedule->Unadvise(dwAdviseCookie); +} + + +REFERENCE_TIME CBaseReferenceClock::GetPrivateTime() +{ + CAutoLock cObjectLock(this); + + + /* If the clock has wrapped then the current time will be less than + * the last time we were notified so add on the extra milliseconds + * + * The time period is long enough so that the likelihood of + * successive calls spanning the clock cycle is not considered. + */ + + DWORD dwTime = timeGetTime(); + { + m_rtPrivateTime += Int32x32To64(UNITS / MILLISECONDS, (DWORD)(dwTime - m_dwPrevSystemTime)); + m_dwPrevSystemTime = dwTime; + } + + return m_rtPrivateTime; +} + + +/* Adjust the current time by the input value. This allows an + external time source to work out some of the latency of the clock + system and adjust the "current" time accordingly. The intent is + that the time returned to the user is synchronised to a clock + source and allows drift to be catered for. + + For example: if the clock source detects a drift it can pass a delta + to the current time rather than having to set an explicit time. +*/ + +STDMETHODIMP CBaseReferenceClock::SetTimeDelta(const REFERENCE_TIME & TimeDelta) +{ +#ifdef DEBUG + + // Just break if passed an improper time delta value + LONGLONG llDelta = TimeDelta > 0 ? TimeDelta : -TimeDelta; + if (llDelta > UNITS * 1000) { + DbgLog((LOG_TRACE, 0, TEXT("Bad Time Delta"))); + //DebugBreak(); + } + + // We're going to calculate a "severity" for the time change. Max -1 + // min 8. We'll then use this as the debug logging level for a + // debug log message. + const LONG usDelta = LONG(TimeDelta/10); // Delta in micro-secs + + DWORD delta = abs(usDelta); // varying delta + // Severity == 8 - ceil(log<base 8>(abs( micro-secs delta))) + int Severity = 8; + while ( delta > 0 ) + { + delta >>= 3; // div 8 + Severity--; + } + + // Sev == 0 => > 2 second delta! + DbgLog((LOG_TIMING, Severity < 0 ? 0 : Severity, + TEXT("Sev %2i: CSystemClock::SetTimeDelta(%8ld us) %lu -> %lu ms."), + Severity, usDelta, DWORD(ConvertToMilliseconds(m_rtPrivateTime)), + DWORD(ConvertToMilliseconds(TimeDelta+m_rtPrivateTime)) )); + + // Don't want the DbgBreak to fire when running stress on debug-builds. + #ifdef BREAK_ON_SEVERE_TIME_DELTA + if (Severity < 0) + DbgBreakPoint(TEXT("SetTimeDelta > 16 seconds!"), + TEXT(__FILE__),__LINE__); + #endif + +#endif + + CAutoLock cObjectLock(this); + m_rtPrivateTime += TimeDelta; + // If time goes forwards, and we have advises, then we need to + // trigger the thread so that it can re-evaluate its wait time. + // Since we don't want the cost of the thread switches if the change + // is really small, only do it if clock goes forward by more than + // 0.5 millisecond. If the time goes backwards, the thread will + // wake up "early" (relativly speaking) and will re-evaluate at + // that time. + if ( TimeDelta > 5000 && m_pSchedule->GetAdviseCount() > 0 ) TriggerThread(); + return NOERROR; +} + +// Thread stuff + +DWORD __stdcall CBaseReferenceClock::AdviseThreadFunction(__in LPVOID p) +{ + return DWORD(reinterpret_cast<CBaseReferenceClock*>(p)->AdviseThread()); +} + +HRESULT CBaseReferenceClock::AdviseThread() +{ + DWORD dwWait = INFINITE; + + // The first thing we do is wait until something interesting happens + // (meaning a first advise or shutdown). This prevents us calling + // GetPrivateTime immediately which is goodness as that is a virtual + // routine and the derived class may not yet be constructed. (This + // thread is created in the base class constructor.) + + while ( !m_bAbort ) + { + // Wait for an interesting event to happen + DbgLog((LOG_TIMING, 3, TEXT("CBaseRefClock::AdviseThread() Delay: %lu ms"), dwWait )); + WaitForSingleObject(m_pSchedule->GetEvent(), dwWait); + if (m_bAbort) break; + + // There are several reasons why we need to work from the internal + // time, mainly to do with what happens when time goes backwards. + // Mainly, it stop us looping madly if an event is just about to + // expire when the clock goes backward (i.e. GetTime stop for a + // while). + const REFERENCE_TIME rtNow = GetPrivateTime(); + + DbgLog((LOG_TIMING, 3, + TEXT("CBaseRefClock::AdviseThread() Woke at = %lu ms"), + ConvertToMilliseconds(rtNow) )); + + // We must add in a millisecond, since this is the resolution of our + // WaitForSingleObject timer. Failure to do so will cause us to loop + // franticly for (approx) 1 a millisecond. + m_rtNextAdvise = m_pSchedule->Advise( 10000 + rtNow ); + LONGLONG llWait = m_rtNextAdvise - rtNow; + + ASSERT( llWait > 0 ); + + llWait = ConvertToMilliseconds(llWait); + // DON'T replace this with a max!! (The type's of these things is VERY important) + dwWait = (llWait > REFERENCE_TIME(UINT_MAX)) ? UINT_MAX : DWORD(llWait); + }; + return NOERROR; +} + +HRESULT CBaseReferenceClock::SetDefaultTimerResolution( + REFERENCE_TIME timerResolution // in 100ns + ) +{ + CAutoLock cObjectLock(this); + if( 0 == timerResolution ) { + if( m_TimerResolution ) { + timeEndPeriod( m_TimerResolution ); + m_TimerResolution = 0; + } + } else { + TIMECAPS tc; + DWORD dwMinResolution = (TIMERR_NOERROR == timeGetDevCaps(&tc, sizeof(tc))) + ? tc.wPeriodMin + : 1; + DWORD dwResolution = max( dwMinResolution, DWORD(timerResolution / 10000) ); + if( dwResolution != m_TimerResolution ) { + timeEndPeriod(m_TimerResolution); + m_TimerResolution = dwResolution; + timeBeginPeriod( m_TimerResolution ); + } + } + return S_OK; +} + +HRESULT CBaseReferenceClock::GetDefaultTimerResolution( + __out REFERENCE_TIME* pTimerResolution // in 100ns + ) +{ + if( !pTimerResolution ) { + return E_POINTER; + } + CAutoLock cObjectLock(this); + *pTimerResolution = m_TimerResolution * 10000; + return S_OK; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/refclock.h
Added
@@ -0,0 +1,184 @@ +//------------------------------------------------------------------------------ +// File: RefClock.h +// +// Desc: DirectShow base classes - defines the IReferenceClock interface. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __BASEREFCLOCK__ +#define __BASEREFCLOCK__ + +#include <Schedule.h> + +const UINT RESOLUTION = 1; /* High resolution timer */ +const INT ADVISE_CACHE = 4; /* Default cache size */ +const LONGLONG MAX_TIME = 0x7FFFFFFFFFFFFFFF; /* Maximum LONGLONG value */ + +inline LONGLONG WINAPI ConvertToMilliseconds(const REFERENCE_TIME& RT) +{ + /* This converts an arbitrary value representing a reference time + into a MILLISECONDS value for use in subsequent system calls */ + + return (RT / (UNITS / MILLISECONDS)); +} + +/* This class hierarchy will support an IReferenceClock interface so + that an audio card (or other externally driven clock) can update the + system wide clock that everyone uses. + + The interface will be pretty thin with probably just one update method + This interface has not yet been defined. + */ + +/* This abstract base class implements the IReferenceClock + * interface. Classes that actually provide clock signals (from + * whatever source) have to be derived from this class. + * + * The abstract class provides implementations for: + * CUnknown support + * locking support (CCritSec) + * client advise code (creates a thread) + * + * Question: what can we do about quality? Change the timer + * resolution to lower the system load? Up the priority of the + * timer thread to force more responsive signals? + * + * During class construction we create a worker thread that is destroyed during + * destuction. This thread executes a series of WaitForSingleObject calls, + * waking up when a command is given to the thread or the next wake up point + * is reached. The wakeup points are determined by clients making Advise + * calls. + * + * Each advise call defines a point in time when they wish to be notified. A + * periodic advise is a series of these such events. We maintain a list of + * advise links and calculate when the nearest event notification is due for. + * We then call WaitForSingleObject with a timeout equal to this time. The + * handle we wait on is used by the class to signal that something has changed + * and that we must reschedule the next event. This typically happens when + * someone comes in and asks for an advise link while we are waiting for an + * event to timeout. + * + * While we are modifying the list of advise requests we + * are protected from interference through a critical section. Clients are NOT + * advised through callbacks. One shot clients have an event set, while + * periodic clients have a semaphore released for each event notification. A + * semaphore allows a client to be kept up to date with the number of events + * actually triggered and be assured that they can't miss multiple events being + * set. + * + * Keeping track of advises is taken care of by the CAMSchedule class. + */ + +class CBaseReferenceClock +: public CUnknown, public IReferenceClock, public CCritSec, public IReferenceClockTimerControl +{ +protected: + virtual ~CBaseReferenceClock(); // Don't let me be created on the stack! +public: + CBaseReferenceClock(__in_opt LPCTSTR pName, + __inout_opt LPUNKNOWN pUnk, + __inout HRESULT *phr, + __inout_opt CAMSchedule * pSched = 0 ); + + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv); + + DECLARE_IUNKNOWN + + /* IReferenceClock methods */ + // Derived classes must implement GetPrivateTime(). All our GetTime + // does is call GetPrivateTime and then check so that time does not + // go backwards. A return code of S_FALSE implies that the internal + // clock has gone backwards and GetTime time has halted until internal + // time has caught up. (Don't know if this will be much use to folk, + // but it seems odd not to use the return code for something useful.) + STDMETHODIMP GetTime(__out REFERENCE_TIME *pTime); + // When this is called, it sets m_rtLastGotTime to the time it returns. + + /* Provide standard mechanisms for scheduling events */ + + /* Ask for an async notification that a time has elapsed */ + STDMETHODIMP AdviseTime( + REFERENCE_TIME baseTime, // base reference time + REFERENCE_TIME streamTime, // stream offset time + HEVENT hEvent, // advise via this event + __out DWORD_PTR *pdwAdviseCookie// where your cookie goes + ); + + /* Ask for an asynchronous periodic notification that a time has elapsed */ + STDMETHODIMP AdvisePeriodic( + REFERENCE_TIME StartTime, // starting at this time + REFERENCE_TIME PeriodTime, // time between notifications + HSEMAPHORE hSemaphore, // advise via a semaphore + __out DWORD_PTR *pdwAdviseCookie// where your cookie goes + ); + + /* Cancel a request for notification(s) - if the notification was + * a one shot timer then this function doesn't need to be called + * as the advise is automatically cancelled, however it does no + * harm to explicitly cancel a one-shot advise. It is REQUIRED that + * clients call Unadvise to clear a Periodic advise setting. + */ + + STDMETHODIMP Unadvise(DWORD_PTR dwAdviseCookie); + + /* Methods for the benefit of derived classes or outer objects */ + + // GetPrivateTime() is the REAL clock. GetTime is just a cover for + // it. Derived classes will probably override this method but not + // GetTime() itself. + // The important point about GetPrivateTime() is it's allowed to go + // backwards. Our GetTime() will keep returning the LastGotTime + // until GetPrivateTime() catches up. + virtual REFERENCE_TIME GetPrivateTime(); + + /* Provide a method for correcting drift */ + STDMETHODIMP SetTimeDelta( const REFERENCE_TIME& TimeDelta ); + + CAMSchedule * GetSchedule() const { return m_pSchedule; } + + // IReferenceClockTimerControl methods + // + // Setting a default of 0 disables the default of 1ms + STDMETHODIMP SetDefaultTimerResolution( + REFERENCE_TIME timerResolution // in 100ns + ); + STDMETHODIMP GetDefaultTimerResolution( + __out REFERENCE_TIME* pTimerResolution // in 100ns + ); + +private: + REFERENCE_TIME m_rtPrivateTime; // Current best estimate of time + DWORD m_dwPrevSystemTime; // Last vaule we got from timeGetTime + REFERENCE_TIME m_rtLastGotTime; // Last time returned by GetTime + REFERENCE_TIME m_rtNextAdvise; // Time of next advise + UINT m_TimerResolution; + +#ifdef PERF + int m_idGetSystemTime; +#endif + +// Thread stuff +public: + void TriggerThread() // Wakes thread up. Need to do this if + { // time to next advise needs reevaluating. + EXECUTE_ASSERT(SetEvent(m_pSchedule->GetEvent())); + } + + +private: + BOOL m_bAbort; // Flag used for thread shutdown + HANDLE m_hThread; // Thread handle + + HRESULT AdviseThread(); // Method in which the advise thread runs + static DWORD __stdcall AdviseThreadFunction(__in LPVOID); // Function used to get there + +protected: + CAMSchedule * m_pSchedule; + + void Restart (IN REFERENCE_TIME rtMinTime = 0I64) ; +}; + +#endif +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/reftime.h
Added
@@ -0,0 +1,116 @@ +//------------------------------------------------------------------------------ +// File: RefTime.h +// +// Desc: DirectShow base classes - defines CRefTime, a class that manages +// reference times. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// +// CRefTime +// +// Manage reference times. +// Shares same data layout as REFERENCE_TIME, but adds some (nonvirtual) +// functions providing simple comparison, conversion and arithmetic. +// +// A reference time (at the moment) is a unit of seconds represented in +// 100ns units as is used in the Win32 FILETIME structure. BUT the time +// a REFERENCE_TIME represents is NOT the time elapsed since 1/1/1601 it +// will either be stream time or reference time depending upon context +// +// This class provides simple arithmetic operations on reference times +// +// keep non-virtual otherwise the data layout will not be the same as +// REFERENCE_TIME + + +// ----- +// note that you are safe to cast a CRefTime* to a REFERENCE_TIME*, but +// you will need to do so explicitly +// ----- + + +#ifndef __REFTIME__ +#define __REFTIME__ + + +const LONGLONG MILLISECONDS = (1000); // 10 ^ 3 +const LONGLONG NANOSECONDS = (1000000000); // 10 ^ 9 +const LONGLONG UNITS = (NANOSECONDS / 100); // 10 ^ 7 + +/* Unfortunately an inline function here generates a call to __allmul + - even for constants! +*/ +#define MILLISECONDS_TO_100NS_UNITS(lMs) \ + Int32x32To64((lMs), (UNITS / MILLISECONDS)) + +class CRefTime +{ +public: + + // *MUST* be the only data member so that this class is exactly + // equivalent to a REFERENCE_TIME. + // Also, must be *no virtual functions* + + REFERENCE_TIME m_time; + + inline CRefTime() + { + // default to 0 time + m_time = 0; + }; + + inline CRefTime(LONG msecs) + { + m_time = MILLISECONDS_TO_100NS_UNITS(msecs); + }; + + inline CRefTime(REFERENCE_TIME rt) + { + m_time = rt; + }; + + inline operator REFERENCE_TIME() const + { + return m_time; + }; + + inline CRefTime& operator=(const CRefTime& rt) + { + m_time = rt.m_time; + return *this; + }; + + inline CRefTime& operator=(const LONGLONG ll) + { + m_time = ll; + return *this; + }; + + inline CRefTime& operator+=(const CRefTime& rt) + { + return (*this = *this + rt); + }; + + inline CRefTime& operator-=(const CRefTime& rt) + { + return (*this = *this - rt); + }; + + inline LONG Millisecs(void) + { + return (LONG)(m_time / (UNITS / MILLISECONDS)); + }; + + inline LONGLONG GetUnits(void) + { + return m_time; + }; +}; + +const LONGLONG TimeZero = 0; + +#endif /* __REFTIME__ */ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/renbase.cpp
Added
@@ -0,0 +1,2858 @@ +//------------------------------------------------------------------------------ +// File: RenBase.cpp +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> // DirectShow base class definitions +#include <mmsystem.h> // Needed for definition of timeGetTime +#include <limits.h> // Standard data type limit definitions +#include <measure.h> // Used for time critical log functions + +#pragma warning(disable:4355) + +// Helper function for clamping time differences +int inline TimeDiff(REFERENCE_TIME rt) +{ + if (rt < - (50 * UNITS)) { + return -(50 * UNITS); + } else + if (rt > 50 * UNITS) { + return 50 * UNITS; + } else return (int)rt; +} + +// Implements the CBaseRenderer class + +CBaseRenderer::CBaseRenderer(REFCLSID RenderClass, // CLSID for this renderer + __in_opt LPCTSTR pName, // Debug ONLY description + __inout_opt LPUNKNOWN pUnk, // Aggregated owner object + __inout HRESULT *phr) : // General OLE return code + + CBaseFilter(pName,pUnk,&m_InterfaceLock,RenderClass), + m_evComplete(TRUE, phr), + m_RenderEvent(FALSE, phr), + m_bAbort(FALSE), + m_pPosition(NULL), + m_ThreadSignal(TRUE, phr), + m_bStreaming(FALSE), + m_bEOS(FALSE), + m_bEOSDelivered(FALSE), + m_pMediaSample(NULL), + m_dwAdvise(0), + m_pQSink(NULL), + m_pInputPin(NULL), + m_bRepaintStatus(TRUE), + m_SignalTime(0), + m_bInReceive(FALSE), + m_EndOfStreamTimer(0) +{ + if (SUCCEEDED(*phr)) { + Ready(); +#ifdef PERF + m_idBaseStamp = MSR_REGISTER(TEXT("BaseRenderer: sample time stamp")); + m_idBaseRenderTime = MSR_REGISTER(TEXT("BaseRenderer: draw time (msec)")); + m_idBaseAccuracy = MSR_REGISTER(TEXT("BaseRenderer: Accuracy (msec)")); +#endif + } +} + + +// Delete the dynamically allocated IMediaPosition and IMediaSeeking helper +// object. The object is created when somebody queries us. These are standard +// control interfaces for seeking and setting start/stop positions and rates. +// We will probably also have made an input pin based on CRendererInputPin +// that has to be deleted, it's created when an enumerator calls our GetPin + +CBaseRenderer::~CBaseRenderer() +{ + ASSERT(m_bStreaming == FALSE); + ASSERT(m_EndOfStreamTimer == 0); + StopStreaming(); + ClearPendingSample(); + + // Delete any IMediaPosition implementation + + if (m_pPosition) { + delete m_pPosition; + m_pPosition = NULL; + } + + // Delete any input pin created + + if (m_pInputPin) { + delete m_pInputPin; + m_pInputPin = NULL; + } + + // Release any Quality sink + + ASSERT(m_pQSink == NULL); +} + + +// This returns the IMediaPosition and IMediaSeeking interfaces + +HRESULT CBaseRenderer::GetMediaPositionInterface(REFIID riid, __deref_out void **ppv) +{ + CAutoLock cObjectCreationLock(&m_ObjectCreationLock); + if (m_pPosition) { + return m_pPosition->NonDelegatingQueryInterface(riid,ppv); + } + + CBasePin *pPin = GetPin(0); + if (NULL == pPin) { + return E_OUTOFMEMORY; + } + + HRESULT hr = NOERROR; + + // Create implementation of this dynamically since sometimes we may + // never try and do a seek. The helper object implements a position + // control interface (IMediaPosition) which in fact simply takes the + // calls normally from the filter graph and passes them upstream + + m_pPosition = new CRendererPosPassThru(NAME("Renderer CPosPassThru"), + CBaseFilter::GetOwner(), + (HRESULT *) &hr, + pPin); + if (m_pPosition == NULL) { + return E_OUTOFMEMORY; + } + + if (FAILED(hr)) { + delete m_pPosition; + m_pPosition = NULL; + return E_NOINTERFACE; + } + return GetMediaPositionInterface(riid,ppv); +} + + +// Overriden to say what interfaces we support and where + +STDMETHODIMP CBaseRenderer::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + // Do we have this interface + + if (riid == IID_IMediaPosition || riid == IID_IMediaSeeking) { + return GetMediaPositionInterface(riid,ppv); + } else { + return CBaseFilter::NonDelegatingQueryInterface(riid,ppv); + } +} + + +// This is called whenever we change states, we have a manual reset event that +// is signalled whenever we don't won't the source filter thread to wait in us +// (such as in a stopped state) and likewise is not signalled whenever it can +// wait (during paused and running) this function sets or resets the thread +// event. The event is used to stop source filter threads waiting in Receive + +HRESULT CBaseRenderer::SourceThreadCanWait(BOOL bCanWait) +{ + if (bCanWait == TRUE) { + m_ThreadSignal.Reset(); + } else { + m_ThreadSignal.Set(); + } + return NOERROR; +} + + +#ifdef DEBUG +// Dump the current renderer state to the debug terminal. The hardest part of +// the renderer is the window where we unlock everything to wait for a clock +// to signal it is time to draw or for the application to cancel everything +// by stopping the filter. If we get things wrong we can leave the thread in +// WaitForRenderTime with no way for it to ever get out and we will deadlock + +void CBaseRenderer::DisplayRendererState() +{ + DbgLog((LOG_TIMING, 1, TEXT("\nTimed out in WaitForRenderTime"))); + + // No way should this be signalled at this point + + BOOL bSignalled = m_ThreadSignal.Check(); + DbgLog((LOG_TIMING, 1, TEXT("Signal sanity check %d"),bSignalled)); + + // Now output the current renderer state variables + + DbgLog((LOG_TIMING, 1, TEXT("Filter state %d"),m_State)); + + DbgLog((LOG_TIMING, 1, TEXT("Abort flag %d"),m_bAbort)); + + DbgLog((LOG_TIMING, 1, TEXT("Streaming flag %d"),m_bStreaming)); + + DbgLog((LOG_TIMING, 1, TEXT("Clock advise link %d"),m_dwAdvise)); + + DbgLog((LOG_TIMING, 1, TEXT("Current media sample %x"),m_pMediaSample)); + + DbgLog((LOG_TIMING, 1, TEXT("EOS signalled %d"),m_bEOS)); + + DbgLog((LOG_TIMING, 1, TEXT("EOS delivered %d"),m_bEOSDelivered)); + + DbgLog((LOG_TIMING, 1, TEXT("Repaint status %d"),m_bRepaintStatus)); + + + // Output the delayed end of stream timer information + + DbgLog((LOG_TIMING, 1, TEXT("End of stream timer %x"),m_EndOfStreamTimer)); + + DbgLog((LOG_TIMING, 1, TEXT("Deliver time %s"),CDisp((LONGLONG)m_SignalTime))); + + + // Should never timeout during a flushing state + + BOOL bFlushing = m_pInputPin->IsFlushing(); + DbgLog((LOG_TIMING, 1, TEXT("Flushing sanity check %d"),bFlushing)); + + // Display the time we were told to start at + DbgLog((LOG_TIMING, 1, TEXT("Last run time %s"),CDisp((LONGLONG)m_tStart.m_time))); + + // Have we got a reference clock + if (m_pClock == NULL) return; + + // Get the current time from the wall clock + + CRefTime CurrentTime,StartTime,EndTime; + m_pClock->GetTime((REFERENCE_TIME*) &CurrentTime); + CRefTime Offset = CurrentTime - m_tStart; + + // Display the current time from the clock + + DbgLog((LOG_TIMING, 1, TEXT("Clock time %s"),CDisp((LONGLONG)CurrentTime.m_time))); + + DbgLog((LOG_TIMING, 1, TEXT("Time difference %dms"),Offset.Millisecs())); + + + // Do we have a sample ready to render + if (m_pMediaSample == NULL) return; + + m_pMediaSample->GetTime((REFERENCE_TIME*)&StartTime, (REFERENCE_TIME*)&EndTime); + DbgLog((LOG_TIMING, 1, TEXT("Next sample stream times (Start %d End %d ms)"), + StartTime.Millisecs(),EndTime.Millisecs())); + + // Calculate how long it is until it is due for rendering + CRefTime Wait = (m_tStart + StartTime) - CurrentTime; + DbgLog((LOG_TIMING, 1, TEXT("Wait required %d ms"),Wait.Millisecs())); +} +#endif + + +// Wait until the clock sets the timer event or we're otherwise signalled. We +// set an arbitrary timeout for this wait and if it fires then we display the +// current renderer state on the debugger. It will often fire if the filter's +// left paused in an application however it may also fire during stress tests +// if the synchronisation with application seeks and state changes is faulty + +#define RENDER_TIMEOUT 10000 + +HRESULT CBaseRenderer::WaitForRenderTime() +{ + HANDLE WaitObjects = { m_ThreadSignal, m_RenderEvent }; + DWORD Result = WAIT_TIMEOUT; + + // Wait for either the time to arrive or for us to be stopped + + OnWaitStart(); + while (Result == WAIT_TIMEOUT) { + Result = WaitForMultipleObjects(2,WaitObjects,FALSE,RENDER_TIMEOUT); + +#ifdef DEBUG + if (Result == WAIT_TIMEOUT) DisplayRendererState(); +#endif + + } + OnWaitEnd(); + + // We may have been awoken without the timer firing + + if (Result == WAIT_OBJECT_0) { + return VFW_E_STATE_CHANGED; + } + + SignalTimerFired(); + return NOERROR; +} + + +// Poll waiting for Receive to complete. This really matters when +// Receive may set the palette and cause window messages +// The problem is that if we don't really wait for a renderer to +// stop processing we can deadlock waiting for a transform which +// is calling the renderer's Receive() method because the transform's +// Stop method doesn't know to process window messages to unblock +// the renderer's Receive processing +void CBaseRenderer::WaitForReceiveToComplete() +{ + for (;;) { + if (!m_bInReceive) { + break; + } + + MSG msg; + // Receive all interthread snedmessages + PeekMessage(&msg, NULL, WM_NULL, WM_NULL, PM_NOREMOVE); + + Sleep(1); + } + + // If the wakebit for QS_POSTMESSAGE is set, the PeekMessage call + // above just cleared the changebit which will cause some messaging + // calls to block (waitMessage, MsgWaitFor...) now. + // Post a dummy message to set the QS_POSTMESSAGE bit again + if (HIWORD(GetQueueStatus(QS_POSTMESSAGE)) & QS_POSTMESSAGE) { + // Send dummy message + PostThreadMessage(GetCurrentThreadId(), WM_NULL, 0, 0); + } +} + +// A filter can have four discrete states, namely Stopped, Running, Paused, +// Intermediate. We are in an intermediate state if we are currently trying +// to pause but haven't yet got the first sample (or if we have been flushed +// in paused state and therefore still have to wait for a sample to arrive) + +// This class contains an event called m_evComplete which is signalled when +// the current state is completed and is not signalled when we are waiting to +// complete the last state transition. As mentioned above the only time we +// use this at the moment is when we wait for a media sample in paused state +// If while we are waiting we receive an end of stream notification from the +// source filter then we know no data is imminent so we can reset the event +// This means that when we transition to paused the source filter must call +// end of stream on us or send us an image otherwise we'll hang indefinately + + +// Simple internal way of getting the real state + +FILTER_STATE CBaseRenderer::GetRealState() { + return m_State; +} + + +// The renderer doesn't complete the full transition to paused states until +// it has got one media sample to render. If you ask it for its state while +// it's waiting it will return the state along with VFW_S_STATE_INTERMEDIATE + +STDMETHODIMP CBaseRenderer::GetState(DWORD dwMSecs,FILTER_STATE *State) +{ + CheckPointer(State,E_POINTER); + + if (WaitDispatchingMessages(m_evComplete, dwMSecs) == WAIT_TIMEOUT) { + *State = m_State; + return VFW_S_STATE_INTERMEDIATE; + } + *State = m_State; + return NOERROR; +} + + +// If we're pausing and we have no samples we don't complete the transition +// to State_Paused and we return S_FALSE. However if the m_bAbort flag has +// been set then all samples are rejected so there is no point waiting for +// one. If we do have a sample then return NOERROR. We will only ever return +// VFW_S_STATE_INTERMEDIATE from GetState after being paused with no sample +// (calling GetState after either being stopped or Run will NOT return this) + +HRESULT CBaseRenderer::CompleteStateChange(FILTER_STATE OldState) +{ + // Allow us to be paused when disconnected + + if (m_pInputPin->IsConnected() == FALSE) { + Ready(); + return S_OK; + } + + // Have we run off the end of stream + + if (IsEndOfStream() == TRUE) { + Ready(); + return S_OK; + } + + // Make sure we get fresh data after being stopped + + if (HaveCurrentSample() == TRUE) { + if (OldState != State_Stopped) { + Ready(); + return S_OK; + } + } + NotReady(); + return S_FALSE; +} + + +// When we stop the filter the things we do are:- + +// Decommit the allocator being used in the connection +// Release the source filter if it's waiting in Receive +// Cancel any advise link we set up with the clock +// Any end of stream signalled is now obsolete so reset +// Allow us to be stopped when we are not connected + +STDMETHODIMP CBaseRenderer::Stop() +{ + CAutoLock cRendererLock(&m_InterfaceLock); + + // Make sure there really is a state change + + if (m_State == State_Stopped) { + return NOERROR; + } + + // Is our input pin connected + + if (m_pInputPin->IsConnected() == FALSE) { + NOTE("Input pin is not connected"); + m_State = State_Stopped; + return NOERROR; + } + + CBaseFilter::Stop(); + + // If we are going into a stopped state then we must decommit whatever + // allocator we are using it so that any source filter waiting in the + // GetBuffer can be released and unlock themselves for a state change + + if (m_pInputPin->Allocator()) { + m_pInputPin->Allocator()->Decommit(); + } + + // Cancel any scheduled rendering + + SetRepaintStatus(TRUE); + StopStreaming(); + SourceThreadCanWait(FALSE); + ResetEndOfStream(); + CancelNotification(); + + // There should be no outstanding clock advise + ASSERT(CancelNotification() == S_FALSE); + ASSERT(WAIT_TIMEOUT == WaitForSingleObject((HANDLE)m_RenderEvent,0)); + ASSERT(m_EndOfStreamTimer == 0); + + Ready(); + WaitForReceiveToComplete(); + m_bAbort = FALSE; + + return NOERROR; +} + + +// When we pause the filter the things we do are:- + +// Commit the allocator being used in the connection +// Allow a source filter thread to wait in Receive +// Cancel any clock advise link (we may be running) +// Possibly complete the state change if we have data +// Allow us to be paused when we are not connected + +STDMETHODIMP CBaseRenderer::Pause() +{ + CAutoLock cRendererLock(&m_InterfaceLock); + FILTER_STATE OldState = m_State; + ASSERT(m_pInputPin->IsFlushing() == FALSE); + + // Make sure there really is a state change + + if (m_State == State_Paused) { + return CompleteStateChange(State_Paused); + } + + // Has our input pin been connected + + if (m_pInputPin->IsConnected() == FALSE) { + NOTE("Input pin is not connected"); + m_State = State_Paused; + return CompleteStateChange(State_Paused); + } + + // Pause the base filter class + + HRESULT hr = CBaseFilter::Pause(); + if (FAILED(hr)) { + NOTE("Pause failed"); + return hr; + } + + // Enable EC_REPAINT events again + + SetRepaintStatus(TRUE); + StopStreaming(); + SourceThreadCanWait(TRUE); + CancelNotification(); + ResetEndOfStreamTimer(); + + // If we are going into a paused state then we must commit whatever + // allocator we are using it so that any source filter can call the + // GetBuffer and expect to get a buffer without returning an error + + if (m_pInputPin->Allocator()) { + m_pInputPin->Allocator()->Commit(); + } + + // There should be no outstanding advise + ASSERT(CancelNotification() == S_FALSE); + ASSERT(WAIT_TIMEOUT == WaitForSingleObject((HANDLE)m_RenderEvent,0)); + ASSERT(m_EndOfStreamTimer == 0); + ASSERT(m_pInputPin->IsFlushing() == FALSE); + + // When we come out of a stopped state we must clear any image we were + // holding onto for frame refreshing. Since renderers see state changes + // first we can reset ourselves ready to accept the source thread data + // Paused or running after being stopped causes the current position to + // be reset so we're not interested in passing end of stream signals + + if (OldState == State_Stopped) { + m_bAbort = FALSE; + ClearPendingSample(); + } + return CompleteStateChange(OldState); +} + + +// When we run the filter the things we do are:- + +// Commit the allocator being used in the connection +// Allow a source filter thread to wait in Receive +// Signal the render event just to get us going +// Start the base class by calling StartStreaming +// Allow us to be run when we are not connected +// Signal EC_COMPLETE if we are not connected + +STDMETHODIMP CBaseRenderer::Run(REFERENCE_TIME StartTime) +{ + CAutoLock cRendererLock(&m_InterfaceLock); + FILTER_STATE OldState = m_State; + + // Make sure there really is a state change + + if (m_State == State_Running) { + return NOERROR; + } + + // Send EC_COMPLETE if we're not connected + + if (m_pInputPin->IsConnected() == FALSE) { + NotifyEvent(EC_COMPLETE,S_OK,(LONG_PTR)(IBaseFilter *)this); + m_State = State_Running; + return NOERROR; + } + + Ready(); + + // Pause the base filter class + + HRESULT hr = CBaseFilter::Run(StartTime); + if (FAILED(hr)) { + NOTE("Run failed"); + return hr; + } + + // Allow the source thread to wait + ASSERT(m_pInputPin->IsFlushing() == FALSE); + SourceThreadCanWait(TRUE); + SetRepaintStatus(FALSE); + + // There should be no outstanding advise + ASSERT(CancelNotification() == S_FALSE); + ASSERT(WAIT_TIMEOUT == WaitForSingleObject((HANDLE)m_RenderEvent,0)); + ASSERT(m_EndOfStreamTimer == 0); + ASSERT(m_pInputPin->IsFlushing() == FALSE); + + // If we are going into a running state then we must commit whatever + // allocator we are using it so that any source filter can call the + // GetBuffer and expect to get a buffer without returning an error + + if (m_pInputPin->Allocator()) { + m_pInputPin->Allocator()->Commit(); + } + + // When we come out of a stopped state we must clear any image we were + // holding onto for frame refreshing. Since renderers see state changes + // first we can reset ourselves ready to accept the source thread data + // Paused or running after being stopped causes the current position to + // be reset so we're not interested in passing end of stream signals + + if (OldState == State_Stopped) { + m_bAbort = FALSE; + ClearPendingSample(); + } + return StartStreaming(); +} + + +// Return the number of input pins we support + +int CBaseRenderer::GetPinCount() +{ + if (m_pInputPin == NULL) { + // Try to create it + (void)GetPin(0); + } + return m_pInputPin != NULL ? 1 : 0; +} + + +// We only support one input pin and it is numbered zero + +CBasePin *CBaseRenderer::GetPin(int n) +{ + CAutoLock cObjectCreationLock(&m_ObjectCreationLock); + + // Should only ever be called with zero + ASSERT(n == 0); + + if (n != 0) { + return NULL; + } + + // Create the input pin if not already done so + + if (m_pInputPin == NULL) { + + // hr must be initialized to NOERROR because + // CRendererInputPin's constructor only changes + // hr's value if an error occurs. + HRESULT hr = NOERROR; + + m_pInputPin = new CRendererInputPin(this,&hr,L"In"); + if (NULL == m_pInputPin) { + return NULL; + } + + if (FAILED(hr)) { + delete m_pInputPin; + m_pInputPin = NULL; + return NULL; + } + } + return m_pInputPin; +} + + +// If "In" then return the IPin for our input pin, otherwise NULL and error + +STDMETHODIMP CBaseRenderer::FindPin(LPCWSTR Id, __deref_out IPin **ppPin) +{ + CheckPointer(ppPin,E_POINTER); + + if (0==lstrcmpW(Id,L"In")) { + *ppPin = GetPin(0); + if (*ppPin) { + (*ppPin)->AddRef(); + } else { + return E_OUTOFMEMORY; + } + } else { + *ppPin = NULL; + return VFW_E_NOT_FOUND; + } + return NOERROR; +} + + +// Called when the input pin receives an EndOfStream notification. If we have +// not got a sample, then notify EC_COMPLETE now. If we have samples, then set +// m_bEOS and check for this on completing samples. If we're waiting to pause +// then complete the transition to paused state by setting the state event + +HRESULT CBaseRenderer::EndOfStream() +{ + // Ignore these calls if we are stopped + + if (m_State == State_Stopped) { + return NOERROR; + } + + // If we have a sample then wait for it to be rendered + + m_bEOS = TRUE; + if (m_pMediaSample) { + return NOERROR; + } + + // If we are waiting for pause then we are now ready since we cannot now + // carry on waiting for a sample to arrive since we are being told there + // won't be any. This sets an event that the GetState function picks up + + Ready(); + + // Only signal completion now if we are running otherwise queue it until + // we do run in StartStreaming. This is used when we seek because a seek + // causes a pause where early notification of completion is misleading + + if (m_bStreaming) { + SendEndOfStream(); + } + return NOERROR; +} + + +// When we are told to flush we should release the source thread + +HRESULT CBaseRenderer::BeginFlush() +{ + // If paused then report state intermediate until we get some data + + if (m_State == State_Paused) { + NotReady(); + } + + SourceThreadCanWait(FALSE); + CancelNotification(); + ClearPendingSample(); + // Wait for Receive to complete + WaitForReceiveToComplete(); + + return NOERROR; +} + + +// After flushing the source thread can wait in Receive again + +HRESULT CBaseRenderer::EndFlush() +{ + // Reset the current sample media time + if (m_pPosition) m_pPosition->ResetMediaTime(); + + // There should be no outstanding advise + + ASSERT(CancelNotification() == S_FALSE); + SourceThreadCanWait(TRUE); + return NOERROR; +} + + +// We can now send EC_REPAINTs if so required + +HRESULT CBaseRenderer::CompleteConnect(IPin *pReceivePin) +{ + // The caller should always hold the interface lock because + // the function uses CBaseFilter::m_State. + ASSERT(CritCheckIn(&m_InterfaceLock)); + + m_bAbort = FALSE; + + if (State_Running == GetRealState()) { + HRESULT hr = StartStreaming(); + if (FAILED(hr)) { + return hr; + } + + SetRepaintStatus(FALSE); + } else { + SetRepaintStatus(TRUE); + } + + return NOERROR; +} + + +// Called when we go paused or running + +HRESULT CBaseRenderer::Active() +{ + return NOERROR; +} + + +// Called when we go into a stopped state + +HRESULT CBaseRenderer::Inactive() +{ + if (m_pPosition) { + m_pPosition->ResetMediaTime(); + } + // People who derive from this may want to override this behaviour + // to keep hold of the sample in some circumstances + ClearPendingSample(); + + return NOERROR; +} + + +// Tell derived classes about the media type agreed + +HRESULT CBaseRenderer::SetMediaType(const CMediaType *pmt) +{ + return NOERROR; +} + + +// When we break the input pin connection we should reset the EOS flags. When +// we are asked for either IMediaPosition or IMediaSeeking we will create a +// CPosPassThru object to handles media time pass through. When we're handed +// samples we store (by calling CPosPassThru::RegisterMediaTime) their media +// times so we can then return a real current position of data being rendered + +HRESULT CBaseRenderer::BreakConnect() +{ + // Do we have a quality management sink + + if (m_pQSink) { + m_pQSink->Release(); + m_pQSink = NULL; + } + + // Check we have a valid connection + + if (m_pInputPin->IsConnected() == FALSE) { + return S_FALSE; + } + + // Check we are stopped before disconnecting + if (m_State != State_Stopped && !m_pInputPin->CanReconnectWhenActive()) { + return VFW_E_NOT_STOPPED; + } + + SetRepaintStatus(FALSE); + ResetEndOfStream(); + ClearPendingSample(); + m_bAbort = FALSE; + + if (State_Running == m_State) { + StopStreaming(); + } + + return NOERROR; +} + + +// Retrieves the sample times for this samples (note the sample times are +// passed in by reference not value). We return S_FALSE to say schedule this +// sample according to the times on the sample. We also return S_OK in +// which case the object should simply render the sample data immediately + +HRESULT CBaseRenderer::GetSampleTimes(IMediaSample *pMediaSample, + __out REFERENCE_TIME *pStartTime, + __out REFERENCE_TIME *pEndTime) +{ + ASSERT(m_dwAdvise == 0); + ASSERT(pMediaSample); + + // If the stop time for this sample is before or the same as start time, + // then just ignore it (release it) and schedule the next one in line + // Source filters should always fill in the start and end times properly! + + if (SUCCEEDED(pMediaSample->GetTime(pStartTime, pEndTime))) { + if (*pEndTime < *pStartTime) { + return VFW_E_START_TIME_AFTER_END; + } + } else { + // no time set in the sample... draw it now? + return S_OK; + } + + // Can't synchronise without a clock so we return S_OK which tells the + // caller that the sample should be rendered immediately without going + // through the overhead of setting a timer advise link with the clock + + if (m_pClock == NULL) { + return S_OK; + } + return ShouldDrawSampleNow(pMediaSample,pStartTime,pEndTime); +} + + +// By default all samples are drawn according to their time stamps so we +// return S_FALSE. Returning S_OK means draw immediately, this is used +// by the derived video renderer class in its quality management. + +HRESULT CBaseRenderer::ShouldDrawSampleNow(IMediaSample *pMediaSample, + __out REFERENCE_TIME *ptrStart, + __out REFERENCE_TIME *ptrEnd) +{ + return S_FALSE; +} + + +// We must always reset the current advise time to zero after a timer fires +// because there are several possible ways which lead us not to do any more +// scheduling such as the pending image being cleared after state changes + +void CBaseRenderer::SignalTimerFired() +{ + m_dwAdvise = 0; +} + + +// Cancel any notification currently scheduled. This is called by the owning +// window object when it is told to stop streaming. If there is no timer link +// outstanding then calling this is benign otherwise we go ahead and cancel +// We must always reset the render event as the quality management code can +// signal immediate rendering by setting the event without setting an advise +// link. If we're subsequently stopped and run the first attempt to setup an +// advise link with the reference clock will find the event still signalled + +HRESULT CBaseRenderer::CancelNotification() +{ + ASSERT(m_dwAdvise == 0 || m_pClock); + DWORD_PTR dwAdvise = m_dwAdvise; + + // Have we a live advise link + + if (m_dwAdvise) { + m_pClock->Unadvise(m_dwAdvise); + SignalTimerFired(); + ASSERT(m_dwAdvise == 0); + } + + // Clear the event and return our status + + m_RenderEvent.Reset(); + return (dwAdvise ? S_OK : S_FALSE); +} + + +// Responsible for setting up one shot advise links with the clock +// Return FALSE if the sample is to be dropped (not drawn at all) +// Return TRUE if the sample is to be drawn and in this case also +// arrange for m_RenderEvent to be set at the appropriate time + +BOOL CBaseRenderer::ScheduleSample(IMediaSample *pMediaSample) +{ + REFERENCE_TIME StartSample, EndSample; + + // Is someone pulling our leg + + if (pMediaSample == NULL) { + return FALSE; + } + + // Get the next sample due up for rendering. If there aren't any ready + // then GetNextSampleTimes returns an error. If there is one to be done + // then it succeeds and yields the sample times. If it is due now then + // it returns S_OK other if it's to be done when due it returns S_FALSE + + HRESULT hr = GetSampleTimes(pMediaSample, &StartSample, &EndSample); + if (FAILED(hr)) { + return FALSE; + } + + // If we don't have a reference clock then we cannot set up the advise + // time so we simply set the event indicating an image to render. This + // will cause us to run flat out without any timing or synchronisation + + if (hr == S_OK) { + EXECUTE_ASSERT(SetEvent((HANDLE) m_RenderEvent)); + return TRUE; + } + + ASSERT(m_dwAdvise == 0); + ASSERT(m_pClock); + ASSERT(WAIT_TIMEOUT == WaitForSingleObject((HANDLE)m_RenderEvent,0)); + + // We do have a valid reference clock interface so we can ask it to + // set an event when the image comes due for rendering. We pass in + // the reference time we were told to start at and also the current + // stream time which is the offset from the start reference time + + hr = m_pClock->AdviseTime( + (REFERENCE_TIME) m_tStart, // Start run time + StartSample, // Stream time + (HEVENT)(HANDLE) m_RenderEvent, // Render notification + &m_dwAdvise); // Advise cookie + + if (SUCCEEDED(hr)) { + return TRUE; + } + + // We could not schedule the next sample for rendering despite the fact + // we have a valid sample here. This is a fair indication that either + // the system clock is wrong or the time stamp for the sample is duff + + ASSERT(m_dwAdvise == 0); + return FALSE; +} + + +// This is called when a sample comes due for rendering. We pass the sample +// on to the derived class. After rendering we will initialise the timer for +// the next sample, NOTE signal that the last one fired first, if we don't +// do this it thinks there is still one outstanding that hasn't completed + +HRESULT CBaseRenderer::Render(IMediaSample *pMediaSample) +{ + // If the media sample is NULL then we will have been notified by the + // clock that another sample is ready but in the mean time someone has + // stopped us streaming which causes the next sample to be released + + if (pMediaSample == NULL) { + return S_FALSE; + } + + // If we have stopped streaming then don't render any more samples, the + // thread that got in and locked us and then reset this flag does not + // clear the pending sample as we can use it to refresh any output device + + if (m_bStreaming == FALSE) { + return S_FALSE; + } + + // Time how long the rendering takes + + OnRenderStart(pMediaSample); + DoRenderSample(pMediaSample); + OnRenderEnd(pMediaSample); + + return NOERROR; +} + + +// Checks if there is a sample waiting at the renderer + +BOOL CBaseRenderer::HaveCurrentSample() +{ + CAutoLock cRendererLock(&m_RendererLock); + return (m_pMediaSample == NULL ? FALSE : TRUE); +} + + +// Returns the current sample waiting at the video renderer. We AddRef the +// sample before returning so that should it come due for rendering the +// person who called this method will hold the remaining reference count +// that will stop the sample being added back onto the allocator free list + +IMediaSample *CBaseRenderer::GetCurrentSample() +{ + CAutoLock cRendererLock(&m_RendererLock); + if (m_pMediaSample) { + m_pMediaSample->AddRef(); + } + return m_pMediaSample; +} + + +// Called when the source delivers us a sample. We go through a few checks to +// make sure the sample can be rendered. If we are running (streaming) then we +// have the sample scheduled with the reference clock, if we are not streaming +// then we have received an sample in paused mode so we can complete any state +// transition. On leaving this function everything will be unlocked so an app +// thread may get in and change our state to stopped (for example) in which +// case it will also signal the thread event so that our wait call is stopped + +HRESULT CBaseRenderer::PrepareReceive(IMediaSample *pMediaSample) +{ + CAutoLock cInterfaceLock(&m_InterfaceLock); + m_bInReceive = TRUE; + + // Check our flushing and filter state + + // This function must hold the interface lock because it calls + // CBaseInputPin::Receive() and CBaseInputPin::Receive() uses + // CBasePin::m_bRunTimeError. + HRESULT hr = m_pInputPin->CBaseInputPin::Receive(pMediaSample); + + if (hr != NOERROR) { + m_bInReceive = FALSE; + return E_FAIL; + } + + // Has the type changed on a media sample. We do all rendering + // synchronously on the source thread, which has a side effect + // that only one buffer is ever outstanding. Therefore when we + // have Receive called we can go ahead and change the format + // Since the format change can cause a SendMessage we just don't + // lock + if (m_pInputPin->SampleProps()->pMediaType) { + hr = m_pInputPin->SetMediaType( + (CMediaType *)m_pInputPin->SampleProps()->pMediaType); + if (FAILED(hr)) { + m_bInReceive = FALSE; + return hr; + } + } + + + CAutoLock cSampleLock(&m_RendererLock); + + ASSERT(IsActive() == TRUE); + ASSERT(m_pInputPin->IsFlushing() == FALSE); + ASSERT(m_pInputPin->IsConnected() == TRUE); + ASSERT(m_pMediaSample == NULL); + + // Return an error if we already have a sample waiting for rendering + // source pins must serialise the Receive calls - we also check that + // no data is being sent after the source signalled an end of stream + + if (m_pMediaSample || m_bEOS || m_bAbort) { + Ready(); + m_bInReceive = FALSE; + return E_UNEXPECTED; + } + + // Store the media times from this sample + if (m_pPosition) m_pPosition->RegisterMediaTime(pMediaSample); + + // Schedule the next sample if we are streaming + + if ((m_bStreaming == TRUE) && (ScheduleSample(pMediaSample) == FALSE)) { + ASSERT(WAIT_TIMEOUT == WaitForSingleObject((HANDLE)m_RenderEvent,0)); + ASSERT(CancelNotification() == S_FALSE); + m_bInReceive = FALSE; + return VFW_E_SAMPLE_REJECTED; + } + + // Store the sample end time for EC_COMPLETE handling + m_SignalTime = m_pInputPin->SampleProps()->tStop; + + // BEWARE we sometimes keep the sample even after returning the thread to + // the source filter such as when we go into a stopped state (we keep it + // to refresh the device with) so we must AddRef it to keep it safely. If + // we start flushing the source thread is released and any sample waiting + // will be released otherwise GetBuffer may never return (see BeginFlush) + + m_pMediaSample = pMediaSample; + m_pMediaSample->AddRef(); + + if (m_bStreaming == FALSE) { + SetRepaintStatus(TRUE); + } + return NOERROR; +} + + +// Called by the source filter when we have a sample to render. Under normal +// circumstances we set an advise link with the clock, wait for the time to +// arrive and then render the data using the PURE virtual DoRenderSample that +// the derived class will have overriden. After rendering the sample we may +// also signal EOS if it was the last one sent before EndOfStream was called + +HRESULT CBaseRenderer::Receive(IMediaSample *pSample) +{ + ASSERT(pSample); + + // It may return VFW_E_SAMPLE_REJECTED code to say don't bother + + HRESULT hr = PrepareReceive(pSample); + ASSERT(m_bInReceive == SUCCEEDED(hr)); + if (FAILED(hr)) { + if (hr == VFW_E_SAMPLE_REJECTED) { + return NOERROR; + } + return hr; + } + + // We realize the palette in "PrepareRender()" so we have to give away the + // filter lock here. + if (m_State == State_Paused) { + PrepareRender(); + // no need to use InterlockedExchange + m_bInReceive = FALSE; + { + // We must hold both these locks + CAutoLock cRendererLock(&m_InterfaceLock); + if (m_State == State_Stopped) + return NOERROR; + + m_bInReceive = TRUE; + CAutoLock cSampleLock(&m_RendererLock); + OnReceiveFirstSample(pSample); + } + Ready(); + } + // Having set an advise link with the clock we sit and wait. We may be + // awoken by the clock firing or by a state change. The rendering call + // will lock the critical section and check we can still render the data + + hr = WaitForRenderTime(); + if (FAILED(hr)) { + m_bInReceive = FALSE; + return NOERROR; + } + + PrepareRender(); + + // Set this here and poll it until we work out the locking correctly + // It can't be right that the streaming stuff grabs the interface + // lock - after all we want to be able to wait for this stuff + // to complete + m_bInReceive = FALSE; + + // We must hold both these locks + CAutoLock cRendererLock(&m_InterfaceLock); + + // since we gave away the filter wide lock, the sate of the filter could + // have chnaged to Stopped + if (m_State == State_Stopped) + return NOERROR; + + CAutoLock cSampleLock(&m_RendererLock); + + // Deal with this sample + + Render(m_pMediaSample); + ClearPendingSample(); + SendEndOfStream(); + CancelNotification(); + return NOERROR; +} + + +// This is called when we stop or are inactivated to clear the pending sample +// We release the media sample interface so that they can be allocated to the +// source filter again, unless of course we are changing state to inactive in +// which case GetBuffer will return an error. We must also reset the current +// media sample to NULL so that we know we do not currently have an image + +HRESULT CBaseRenderer::ClearPendingSample() +{ + CAutoLock cRendererLock(&m_RendererLock); + if (m_pMediaSample) { + m_pMediaSample->Release(); + m_pMediaSample = NULL; + } + return NOERROR; +} + + +// Used to signal end of stream according to the sample end time + +void CALLBACK EndOfStreamTimer(UINT uID, // Timer identifier + UINT uMsg, // Not currently used + DWORD_PTR dwUser,// User information + DWORD_PTR dw1, // Windows reserved + DWORD_PTR dw2) // is also reserved +{ + CBaseRenderer *pRenderer = (CBaseRenderer *) dwUser; + NOTE1("EndOfStreamTimer called (%d)",uID); + pRenderer->TimerCallback(); +} + +// Do the timer callback work +void CBaseRenderer::TimerCallback() +{ + // Lock for synchronization (but don't hold this lock when calling + // timeKillEvent) + CAutoLock cRendererLock(&m_RendererLock); + + // See if we should signal end of stream now + + if (m_EndOfStreamTimer) { + m_EndOfStreamTimer = 0; + SendEndOfStream(); + } +} + + +// If we are at the end of the stream signal the filter graph but do not set +// the state flag back to FALSE. Once we drop off the end of the stream we +// leave the flag set (until a subsequent ResetEndOfStream). Each sample we +// get delivered will update m_SignalTime to be the last sample's end time. +// We must wait this long before signalling end of stream to the filtergraph + +#define TIMEOUT_DELIVERYWAIT 50 +#define TIMEOUT_RESOLUTION 10 + +HRESULT CBaseRenderer::SendEndOfStream() +{ + ASSERT(CritCheckIn(&m_RendererLock)); + if (m_bEOS == FALSE || m_bEOSDelivered || m_EndOfStreamTimer) { + return NOERROR; + } + + // If there is no clock then signal immediately + if (m_pClock == NULL) { + return NotifyEndOfStream(); + } + + // How long into the future is the delivery time + + REFERENCE_TIME Signal = m_tStart + m_SignalTime; + REFERENCE_TIME CurrentTime; + m_pClock->GetTime(&CurrentTime); + LONG Delay = LONG((Signal - CurrentTime) / 10000); + + // Dump the timing information to the debugger + + NOTE1("Delay until end of stream delivery %d",Delay); + NOTE1("Current %s",(LPCTSTR)CDisp((LONGLONG)CurrentTime)); + NOTE1("Signal %s",(LPCTSTR)CDisp((LONGLONG)Signal)); + + // Wait for the delivery time to arrive + + if (Delay < TIMEOUT_DELIVERYWAIT) { + return NotifyEndOfStream(); + } + + // Signal a timer callback on another worker thread + + m_EndOfStreamTimer = CompatibleTimeSetEvent((UINT) Delay, // Period of timer + TIMEOUT_RESOLUTION, // Timer resolution + EndOfStreamTimer, // Callback function + DWORD_PTR(this), // Used information + TIME_ONESHOT); // Type of callback + if (m_EndOfStreamTimer == 0) { + return NotifyEndOfStream(); + } + return NOERROR; +} + + +// Signals EC_COMPLETE to the filtergraph manager + +HRESULT CBaseRenderer::NotifyEndOfStream() +{ + CAutoLock cRendererLock(&m_RendererLock); + ASSERT(m_bEOSDelivered == FALSE); + ASSERT(m_EndOfStreamTimer == 0); + + // Has the filter changed state + + if (m_bStreaming == FALSE) { + ASSERT(m_EndOfStreamTimer == 0); + return NOERROR; + } + + // Reset the end of stream timer + m_EndOfStreamTimer = 0; + + // If we've been using the IMediaPosition interface, set it's start + // and end media "times" to the stop position by hand. This ensures + // that we actually get to the end, even if the MPEG guestimate has + // been bad or if the quality management dropped the last few frames + + if (m_pPosition) m_pPosition->EOS(); + m_bEOSDelivered = TRUE; + NOTE("Sending EC_COMPLETE..."); + return NotifyEvent(EC_COMPLETE,S_OK,(LONG_PTR)(IBaseFilter *)this); +} + + +// Reset the end of stream flag, this is typically called when we transfer to +// stopped states since that resets the current position back to the start so +// we will receive more samples or another EndOfStream if there aren't any. We +// keep two separate flags one to say we have run off the end of the stream +// (this is the m_bEOS flag) and another to say we have delivered EC_COMPLETE +// to the filter graph. We need the latter otherwise we can end up sending an +// EC_COMPLETE every time the source changes state and calls our EndOfStream + +HRESULT CBaseRenderer::ResetEndOfStream() +{ + ResetEndOfStreamTimer(); + CAutoLock cRendererLock(&m_RendererLock); + + m_bEOS = FALSE; + m_bEOSDelivered = FALSE; + m_SignalTime = 0; + + return NOERROR; +} + + +// Kills any outstanding end of stream timer + +void CBaseRenderer::ResetEndOfStreamTimer() +{ + ASSERT(CritCheckOut(&m_RendererLock)); + if (m_EndOfStreamTimer) { + timeKillEvent(m_EndOfStreamTimer); + m_EndOfStreamTimer = 0; + } +} + + +// This is called when we start running so that we can schedule any pending +// image we have with the clock and display any timing information. If we +// don't have any sample but we have queued an EOS flag then we send it. If +// we do have a sample then we wait until that has been rendered before we +// signal the filter graph otherwise we may change state before it's done + +HRESULT CBaseRenderer::StartStreaming() +{ + CAutoLock cRendererLock(&m_RendererLock); + if (m_bStreaming == TRUE) { + return NOERROR; + } + + // Reset the streaming times ready for running + + m_bStreaming = TRUE; + + timeBeginPeriod(1); + OnStartStreaming(); + + // There should be no outstanding advise + ASSERT(WAIT_TIMEOUT == WaitForSingleObject((HANDLE)m_RenderEvent,0)); + ASSERT(CancelNotification() == S_FALSE); + + // If we have an EOS and no data then deliver it now + + if (m_pMediaSample == NULL) { + return SendEndOfStream(); + } + + // Have the data rendered + + ASSERT(m_pMediaSample); + if (!ScheduleSample(m_pMediaSample)) + m_RenderEvent.Set(); + + return NOERROR; +} + + +// This is called when we stop streaming so that we can set our internal flag +// indicating we are not now to schedule any more samples arriving. The state +// change methods in the filter implementation take care of cancelling any +// clock advise link we have set up and clearing any pending sample we have + +HRESULT CBaseRenderer::StopStreaming() +{ + CAutoLock cRendererLock(&m_RendererLock); + m_bEOSDelivered = FALSE; + + if (m_bStreaming == TRUE) { + m_bStreaming = FALSE; + OnStopStreaming(); + timeEndPeriod(1); + } + return NOERROR; +} + + +// We have a boolean flag that is reset when we have signalled EC_REPAINT to +// the filter graph. We set this when we receive an image so that should any +// conditions arise again we can send another one. By having a flag we ensure +// we don't flood the filter graph with redundant calls. We do not set the +// event when we receive an EndOfStream call since there is no point in us +// sending further EC_REPAINTs. In particular the AutoShowWindow method and +// the DirectDraw object use this method to control the window repainting + +void CBaseRenderer::SetRepaintStatus(BOOL bRepaint) +{ + CAutoLock cSampleLock(&m_RendererLock); + m_bRepaintStatus = bRepaint; +} + + +// Pass the window handle to the upstream filter + +void CBaseRenderer::SendNotifyWindow(IPin *pPin,HWND hwnd) +{ + IMediaEventSink *pSink; + + // Does the pin support IMediaEventSink + HRESULT hr = pPin->QueryInterface(IID_IMediaEventSink,(void **)&pSink); + if (SUCCEEDED(hr)) { + pSink->Notify(EC_NOTIFY_WINDOW,LONG_PTR(hwnd),0); + pSink->Release(); + } + NotifyEvent(EC_NOTIFY_WINDOW,LONG_PTR(hwnd),0); +} + + +// Signal an EC_REPAINT to the filter graph. This can be used to have data +// sent to us. For example when a video window is first displayed it may +// not have an image to display, at which point it signals EC_REPAINT. The +// filtergraph will either pause the graph if stopped or if already paused +// it will call put_CurrentPosition of the current position. Setting the +// current position to itself has the stream flushed and the image resent + +#define RLOG(_x_) DbgLog((LOG_TRACE,1,TEXT(_x_))); + +void CBaseRenderer::SendRepaint() +{ + CAutoLock cSampleLock(&m_RendererLock); + ASSERT(m_pInputPin); + + // We should not send repaint notifications when... + // - An end of stream has been notified + // - Our input pin is being flushed + // - The input pin is not connected + // - We have aborted a video playback + // - There is a repaint already sent + + if (m_bAbort == FALSE) { + if (m_pInputPin->IsConnected() == TRUE) { + if (m_pInputPin->IsFlushing() == FALSE) { + if (IsEndOfStream() == FALSE) { + if (m_bRepaintStatus == TRUE) { + IPin *pPin = (IPin *) m_pInputPin; + NotifyEvent(EC_REPAINT,(LONG_PTR) pPin,0); + SetRepaintStatus(FALSE); + RLOG("Sending repaint"); + } + } + } + } + } +} + + +// When a video window detects a display change (WM_DISPLAYCHANGE message) it +// can send an EC_DISPLAY_CHANGED event code along with the renderer pin. The +// filtergraph will stop everyone and reconnect our input pin. As we're then +// reconnected we can accept the media type that matches the new display mode +// since we may no longer be able to draw the current image type efficiently + +BOOL CBaseRenderer::OnDisplayChange() +{ + // Ignore if we are not connected yet + + CAutoLock cSampleLock(&m_RendererLock); + if (m_pInputPin->IsConnected() == FALSE) { + return FALSE; + } + + RLOG("Notification of EC_DISPLAY_CHANGE"); + + // Pass our input pin as parameter on the event + + IPin *pPin = (IPin *) m_pInputPin; + m_pInputPin->AddRef(); + NotifyEvent(EC_DISPLAY_CHANGED,(LONG_PTR) pPin,0); + SetAbortSignal(TRUE); + ClearPendingSample(); + m_pInputPin->Release(); + + return TRUE; +} + + +// Called just before we start drawing. +// Store the current time in m_trRenderStart to allow the rendering time to be +// logged. Log the time stamp of the sample and how late it is (neg is early) + +void CBaseRenderer::OnRenderStart(IMediaSample *pMediaSample) +{ +#ifdef PERF + REFERENCE_TIME trStart, trEnd; + pMediaSample->GetTime(&trStart, &trEnd); + + MSR_INTEGER(m_idBaseStamp, (int)trStart); // dump low order 32 bits + + m_pClock->GetTime(&m_trRenderStart); + MSR_INTEGER(0, (int)m_trRenderStart); + REFERENCE_TIME trStream; + trStream = m_trRenderStart-m_tStart; // convert reftime to stream time + MSR_INTEGER(0,(int)trStream); + + const int trLate = (int)(trStream - trStart); + MSR_INTEGER(m_idBaseAccuracy, trLate/10000); // dump in mSec +#endif + +} // OnRenderStart + + +// Called directly after drawing an image. +// calculate the time spent drawing and log it. + +void CBaseRenderer::OnRenderEnd(IMediaSample *pMediaSample) +{ +#ifdef PERF + REFERENCE_TIME trNow; + m_pClock->GetTime(&trNow); + MSR_INTEGER(0,(int)trNow); + int t = (int)((trNow - m_trRenderStart)/10000); // convert UNITS->msec + MSR_INTEGER(m_idBaseRenderTime, t); +#endif +} // OnRenderEnd + + + + +// Constructor must be passed the base renderer object + +CRendererInputPin::CRendererInputPin(__inout CBaseRenderer *pRenderer, + __inout HRESULT *phr, + __in_opt LPCWSTR pPinName) : + CBaseInputPin(NAME("Renderer pin"), + pRenderer, + &pRenderer->m_InterfaceLock, + (HRESULT *) phr, + pPinName) +{ + m_pRenderer = pRenderer; + ASSERT(m_pRenderer); +} + + +// Signals end of data stream on the input pin + +STDMETHODIMP CRendererInputPin::EndOfStream() +{ + CAutoLock cRendererLock(&m_pRenderer->m_InterfaceLock); + CAutoLock cSampleLock(&m_pRenderer->m_RendererLock); + + // Make sure we're streaming ok + + HRESULT hr = CheckStreaming(); + if (hr != NOERROR) { + return hr; + } + + // Pass it onto the renderer + + hr = m_pRenderer->EndOfStream(); + if (SUCCEEDED(hr)) { + hr = CBaseInputPin::EndOfStream(); + } + return hr; +} + + +// Signals start of flushing on the input pin - we do the final reset end of +// stream with the renderer lock unlocked but with the interface lock locked +// We must do this because we call timeKillEvent, our timer callback method +// has to take the renderer lock to serialise our state. Therefore holding a +// renderer lock when calling timeKillEvent could cause a deadlock condition + +STDMETHODIMP CRendererInputPin::BeginFlush() +{ + CAutoLock cRendererLock(&m_pRenderer->m_InterfaceLock); + { + CAutoLock cSampleLock(&m_pRenderer->m_RendererLock); + CBaseInputPin::BeginFlush(); + m_pRenderer->BeginFlush(); + } + return m_pRenderer->ResetEndOfStream(); +} + + +// Signals end of flushing on the input pin + +STDMETHODIMP CRendererInputPin::EndFlush() +{ + CAutoLock cRendererLock(&m_pRenderer->m_InterfaceLock); + CAutoLock cSampleLock(&m_pRenderer->m_RendererLock); + + HRESULT hr = m_pRenderer->EndFlush(); + if (SUCCEEDED(hr)) { + hr = CBaseInputPin::EndFlush(); + } + return hr; +} + + +// Pass the sample straight through to the renderer object + +STDMETHODIMP CRendererInputPin::Receive(IMediaSample *pSample) +{ + HRESULT hr = m_pRenderer->Receive(pSample); + if (FAILED(hr)) { + + // A deadlock could occur if the caller holds the renderer lock and + // attempts to acquire the interface lock. + ASSERT(CritCheckOut(&m_pRenderer->m_RendererLock)); + + { + // The interface lock must be held when the filter is calling + // IsStopped() or IsFlushing(). The interface lock must also + // be held because the function uses m_bRunTimeError. + CAutoLock cRendererLock(&m_pRenderer->m_InterfaceLock); + + // We do not report errors which occur while the filter is stopping, + // flushing or if the m_bAbort flag is set . Errors are expected to + // occur during these operations and the streaming thread correctly + // handles the errors. + if (!IsStopped() && !IsFlushing() && !m_pRenderer->m_bAbort && !m_bRunTimeError) { + + // EC_ERRORABORT's first parameter is the error which caused + // the event and its' last parameter is 0. See the Direct + // Show SDK documentation for more information. + m_pRenderer->NotifyEvent(EC_ERRORABORT,hr,0); + + { + CAutoLock alRendererLock(&m_pRenderer->m_RendererLock); + if (m_pRenderer->IsStreaming() && !m_pRenderer->IsEndOfStreamDelivered()) { + m_pRenderer->NotifyEndOfStream(); + } + } + + m_bRunTimeError = TRUE; + } + } + } + + return hr; +} + + +// Called when the input pin is disconnected + +HRESULT CRendererInputPin::BreakConnect() +{ + HRESULT hr = m_pRenderer->BreakConnect(); + if (FAILED(hr)) { + return hr; + } + return CBaseInputPin::BreakConnect(); +} + + +// Called when the input pin is connected + +HRESULT CRendererInputPin::CompleteConnect(IPin *pReceivePin) +{ + HRESULT hr = m_pRenderer->CompleteConnect(pReceivePin); + if (FAILED(hr)) { + return hr; + } + return CBaseInputPin::CompleteConnect(pReceivePin); +} + + +// Give the pin id of our one and only pin + +STDMETHODIMP CRendererInputPin::QueryId(__deref_out LPWSTR *Id) +{ + CheckPointer(Id,E_POINTER); + + const WCHAR szIn = L"In"; + + *Id = (LPWSTR)CoTaskMemAlloc(sizeof(szIn)); + if (*Id == NULL) { + return E_OUTOFMEMORY; + } + CopyMemory(*Id, szIn, sizeof(szIn)); + return NOERROR; +} + + +// Will the filter accept this media type + +HRESULT CRendererInputPin::CheckMediaType(const CMediaType *pmt) +{ + return m_pRenderer->CheckMediaType(pmt); +} + + +// Called when we go paused or running + +HRESULT CRendererInputPin::Active() +{ + return m_pRenderer->Active(); +} + + +// Called when we go into a stopped state + +HRESULT CRendererInputPin::Inactive() +{ + // The caller must hold the interface lock because + // this function uses m_bRunTimeError. + ASSERT(CritCheckIn(&m_pRenderer->m_InterfaceLock)); + + m_bRunTimeError = FALSE; + + return m_pRenderer->Inactive(); +} + + +// Tell derived classes about the media type agreed + +HRESULT CRendererInputPin::SetMediaType(const CMediaType *pmt) +{ + HRESULT hr = CBaseInputPin::SetMediaType(pmt); + if (FAILED(hr)) { + return hr; + } + return m_pRenderer->SetMediaType(pmt); +} + + +// We do not keep an event object to use when setting up a timer link with +// the clock but are given a pointer to one by the owning object through the +// SetNotificationObject method - this must be initialised before starting +// We can override the default quality management process to have it always +// draw late frames, this is currently done by having the following registry +// key (actually an INI key) called DrawLateFrames set to 1 (default is 0) + +const TCHAR AMQUALITY = TEXT("ActiveMovie"); +const TCHAR DRAWLATEFRAMES = TEXT("DrawLateFrames"); + +CBaseVideoRenderer::CBaseVideoRenderer( + REFCLSID RenderClass, // CLSID for this renderer + __in_opt LPCTSTR pName, // Debug ONLY description + __inout_opt LPUNKNOWN pUnk, // Aggregated owner object + __inout HRESULT *phr) : // General OLE return code + + CBaseRenderer(RenderClass,pName,pUnk,phr), + m_cFramesDropped(0), + m_cFramesDrawn(0), + m_bSupplierHandlingQuality(FALSE) +{ + ResetStreamingTimes(); + +#ifdef PERF + m_idTimeStamp = MSR_REGISTER(TEXT("Frame time stamp")); + m_idEarliness = MSR_REGISTER(TEXT("Earliness fudge")); + m_idTarget = MSR_REGISTER(TEXT("Target (mSec)")); + m_idSchLateTime = MSR_REGISTER(TEXT("mSec late when scheduled")); + m_idDecision = MSR_REGISTER(TEXT("Scheduler decision code")); + m_idQualityRate = MSR_REGISTER(TEXT("Quality rate sent")); + m_idQualityTime = MSR_REGISTER(TEXT("Quality time sent")); + m_idWaitReal = MSR_REGISTER(TEXT("Render wait")); + // m_idWait = MSR_REGISTER(TEXT("wait time recorded (msec)")); + m_idFrameAccuracy = MSR_REGISTER(TEXT("Frame accuracy (msecs)")); + m_bDrawLateFrames = GetProfileInt(AMQUALITY, DRAWLATEFRAMES, FALSE); + //m_idSendQuality = MSR_REGISTER(TEXT("Processing Quality message")); + + m_idRenderAvg = MSR_REGISTER(TEXT("Render draw time Avg")); + m_idFrameAvg = MSR_REGISTER(TEXT("FrameAvg")); + m_idWaitAvg = MSR_REGISTER(TEXT("WaitAvg")); + m_idDuration = MSR_REGISTER(TEXT("Duration")); + m_idThrottle = MSR_REGISTER(TEXT("Audio-video throttle wait")); + // m_idDebug = MSR_REGISTER(TEXT("Debug stuff")); +#endif // PERF +} // Constructor + + +// Destructor is just a placeholder + +CBaseVideoRenderer::~CBaseVideoRenderer() +{ + ASSERT(m_dwAdvise == 0); +} + + +// The timing functions in this class are called by the window object and by +// the renderer's allocator. +// The windows object calls timing functions as it receives media sample +// images for drawing using GDI. +// The allocator calls timing functions when it starts passing DCI/DirectDraw +// surfaces which are not rendered in the same way; The decompressor writes +// directly to the surface with no separate rendering, so those code paths +// call direct into us. Since we only ever hand out DCI/DirectDraw surfaces +// when we have allocated one and only one image we know there cannot be any +// conflict between the two. +// +// We use timeGetTime to return the timing counts we use (since it's relative +// performance we are interested in rather than absolute compared to a clock) +// The window object sets the accuracy of the system clock (normally 1ms) by +// calling timeBeginPeriod/timeEndPeriod when it changes streaming states + + +// Reset all times controlling streaming. +// Set them so that +// 1. Frames will not initially be dropped +// 2. The first frame will definitely be drawn (achieved by saying that there +// has not ben a frame drawn for a long time). + +HRESULT CBaseVideoRenderer::ResetStreamingTimes() +{ + m_trLastDraw = -1000; // set up as first frame since ages (1 sec) ago + m_tStreamingStart = timeGetTime(); + m_trRenderAvg = 0; + m_trFrameAvg = -1; // -1000 fps == "unset" + m_trDuration = 0; // 0 - strange value + m_trRenderLast = 0; + m_trWaitAvg = 0; + m_tRenderStart = 0; + m_cFramesDrawn = 0; + m_cFramesDropped = 0; + m_iTotAcc = 0; + m_iSumSqAcc = 0; + m_iSumSqFrameTime = 0; + m_trFrame = 0; // hygeine - not really needed + m_trLate = 0; // hygeine - not really needed + m_iSumFrameTime = 0; + m_nNormal = 0; + m_trEarliness = 0; + m_trTarget = -300000; // 30mSec early + m_trThrottle = 0; + m_trRememberStampForPerf = 0; + +#ifdef PERF + m_trRememberFrameForPerf = 0; +#endif + + return NOERROR; +} // ResetStreamingTimes + + +// Reset all times controlling streaming. Note that we're now streaming. We +// don't need to set the rendering event to have the source filter released +// as it is done during the Run processing. When we are run we immediately +// release the source filter thread and draw any image waiting (that image +// may already have been drawn once as a poster frame while we were paused) + +HRESULT CBaseVideoRenderer::OnStartStreaming() +{ + ResetStreamingTimes(); + return NOERROR; +} // OnStartStreaming + + +// Called at end of streaming. Fixes times for property page report + +HRESULT CBaseVideoRenderer::OnStopStreaming() +{ + m_tStreamingStart = timeGetTime()-m_tStreamingStart; + return NOERROR; +} // OnStopStreaming + + +// Called when we start waiting for a rendering event. +// Used to update times spent waiting and not waiting. + +void CBaseVideoRenderer::OnWaitStart() +{ + MSR_START(m_idWaitReal); +} // OnWaitStart + + +// Called when we are awoken from the wait in the window OR by our allocator +// when it is hanging around until the next sample is due for rendering on a +// DCI/DirectDraw surface. We add the wait time into our rolling average. +// We grab the interface lock so that we're serialised with the application +// thread going through the run code - which in due course ends up calling +// ResetStreaming times - possibly as we run through this section of code + +void CBaseVideoRenderer::OnWaitEnd() +{ +#ifdef PERF + MSR_STOP(m_idWaitReal); + // for a perf build we want to know just exactly how late we REALLY are. + // even if this means that we have to look at the clock again. + + REFERENCE_TIME trRealStream; // the real time now expressed as stream time. +#if 0 + m_pClock->GetTime(&trRealStream); // Calling clock here causes W95 deadlock! +#else + // We will be discarding overflows like mad here! + // This is wrong really because timeGetTime() can wrap but it's + // only for PERF + REFERENCE_TIME tr = timeGetTime()*10000; + trRealStream = tr + m_llTimeOffset; +#endif + trRealStream -= m_tStart; // convert to stream time (this is a reftime) + + if (m_trRememberStampForPerf==0) { + // This is probably the poster frame at the start, and it is not scheduled + // in the usual way at all. Just count it. The rememberstamp gets set + // in ShouldDrawSampleNow, so this does invalid frame recording until we + // actually start playing. + PreparePerformanceData(0, 0); + } else { + int trLate = (int)(trRealStream - m_trRememberStampForPerf); + int trFrame = (int)(tr - m_trRememberFrameForPerf); + PreparePerformanceData(trLate, trFrame); + } + m_trRememberFrameForPerf = tr; +#endif //PERF +} // OnWaitEnd + + +// Put data on one side that describes the lateness of the current frame. +// We don't yet know whether it will actually be drawn. In direct draw mode, +// this decision is up to the filter upstream, and it could change its mind. +// The rules say that if it did draw it must call Receive(). One way or +// another we eventually get into either OnRenderStart or OnDirectRender and +// these both call RecordFrameLateness to update the statistics. + +void CBaseVideoRenderer::PreparePerformanceData(int trLate, int trFrame) +{ + m_trLate = trLate; + m_trFrame = trFrame; +} // PreparePerformanceData + + +// update the statistics: +// m_iTotAcc, m_iSumSqAcc, m_iSumSqFrameTime, m_iSumFrameTime, m_cFramesDrawn +// Note that because the properties page reports using these variables, +// 1. We need to be inside a critical section +// 2. They must all be updated together. Updating the sums here and the count +// elsewhere can result in imaginary jitter (i.e. attempts to find square roots +// of negative numbers) in the property page code. + +void CBaseVideoRenderer::RecordFrameLateness(int trLate, int trFrame) +{ + // Record how timely we are. + int tLate = trLate/10000; + + // Best estimate of moment of appearing on the screen is average of + // start and end draw times. Here we have only the end time. This may + // tend to show us as spuriously late by up to 1/2 frame rate achieved. + // Decoder probably monitors draw time. We don't bother. + MSR_INTEGER( m_idFrameAccuracy, tLate ); + + // This is a kludge - we can get frames that are very late + // especially (at start-up) and they invalidate the statistics. + // So ignore things that are more than 1 sec off. + if (tLate>1000 || tLate<-1000) { + if (m_cFramesDrawn<=1) { + tLate = 0; + } else if (tLate>0) { + tLate = 1000; + } else { + tLate = -1000; + } + } + // The very first frame often has a invalid time, so don't + // count it into the statistics. (???) + if (m_cFramesDrawn>1) { + m_iTotAcc += tLate; + m_iSumSqAcc += (tLate*tLate); + } + + // calculate inter-frame time. Doesn't make sense for first frame + // second frame suffers from invalid first frame stamp. + if (m_cFramesDrawn>2) { + int tFrame = trFrame/10000; // convert to mSec else it overflows + + // This is a kludge. It can overflow anyway (a pause can cause + // a very long inter-frame time) and it overflows at 2**31/10**7 + // or about 215 seconds i.e. 3min 35sec + if (tFrame>1000||tFrame<0) tFrame = 1000; + m_iSumSqFrameTime += tFrame*tFrame; + ASSERT(m_iSumSqFrameTime>=0); + m_iSumFrameTime += tFrame; + } + ++m_cFramesDrawn; + +} // RecordFrameLateness + + +void CBaseVideoRenderer::ThrottleWait() +{ + if (m_trThrottle>0) { + int iThrottle = m_trThrottle/10000; // convert to mSec + MSR_INTEGER( m_idThrottle, iThrottle); + DbgLog((LOG_TRACE, 0, TEXT("Throttle %d ms"), iThrottle)); + Sleep(iThrottle); + } else { + Sleep(0); + } +} // ThrottleWait + + +// Whenever a frame is rendered it goes though either OnRenderStart +// or OnDirectRender. Data that are generated during ShouldDrawSample +// are added to the statistics by calling RecordFrameLateness from both +// these two places. + +// Called in place of OnRenderStart..OnRenderEnd +// When a DirectDraw image is drawn +void CBaseVideoRenderer::OnDirectRender(IMediaSample *pMediaSample) +{ + m_trRenderAvg = 0; + m_trRenderLast = 5000000; // If we mode switch, we do NOT want this + // to inhibit the new average getting going! + // so we set it to half a second + // MSR_INTEGER(m_idRenderAvg, m_trRenderAvg/10000); + RecordFrameLateness(m_trLate, m_trFrame); + ThrottleWait(); +} // OnDirectRender + + +// Called just before we start drawing. All we do is to get the current clock +// time (from the system) and return. We have to store the start render time +// in a member variable because it isn't used until we complete the drawing +// The rest is just performance logging. + +void CBaseVideoRenderer::OnRenderStart(IMediaSample *pMediaSample) +{ + RecordFrameLateness(m_trLate, m_trFrame); + m_tRenderStart = timeGetTime(); +} // OnRenderStart + + +// Called directly after drawing an image. We calculate the time spent in the +// drawing code and if this doesn't appear to have any odd looking spikes in +// it then we add it to the current average draw time. Measurement spikes may +// occur if the drawing thread is interrupted and switched to somewhere else. + +void CBaseVideoRenderer::OnRenderEnd(IMediaSample *pMediaSample) +{ + // The renderer time can vary erratically if we are interrupted so we do + // some smoothing to help get more sensible figures out but even that is + // not enough as figures can go 9,10,9,9,83,9 and we must disregard 83 + + int tr = (timeGetTime() - m_tRenderStart)*10000; // convert mSec->UNITS + if (tr < m_trRenderAvg*2 || tr < 2 * m_trRenderLast) { + // DO_MOVING_AVG(m_trRenderAvg, tr); + m_trRenderAvg = (tr + (AVGPERIOD-1)*m_trRenderAvg)/AVGPERIOD; + } + m_trRenderLast = tr; + ThrottleWait(); +} // OnRenderEnd + + +STDMETHODIMP CBaseVideoRenderer::SetSink( IQualityControl * piqc) +{ + + m_pQSink = piqc; + + return NOERROR; +} // SetSink + + +STDMETHODIMP CBaseVideoRenderer::Notify( IBaseFilter * pSelf, Quality q) +{ + // NOTE: We are NOT getting any locks here. We could be called + // asynchronously and possibly even on a time critical thread of + // someone else's - so we do the minumum. We only set one state + // variable (an integer) and if that happens to be in the middle + // of another thread reading it they will just get either the new + // or the old value. Locking would achieve no more than this. + + // It might be nice to check that we are being called from m_pGraph, but + // it turns out to be a millisecond or so per throw! + + // This is heuristics, these numbers are aimed at being "what works" + // rather than anything based on some theory. + // We use a hyperbola because it's easy to calculate and it includes + // a panic button asymptote (which we push off just to the left) + // The throttling fits the following table (roughly) + // Proportion Throttle (msec) + // >=1000 0 + // 900 3 + // 800 7 + // 700 11 + // 600 17 + // 500 25 + // 400 35 + // 300 50 + // 200 72 + // 125 100 + // 100 112 + // 50 146 + // 0 200 + + // (some evidence that we could go for a sharper kink - e.g. no throttling + // until below the 750 mark - might give fractionally more frames on a + // P60-ish machine). The easy way to get these coefficients is to use + // Renbase.xls follow the instructions therein using excel solver. + + if (q.Proportion>=1000) { m_trThrottle = 0; } + else { + // The DWORD is to make quite sure I get unsigned arithmetic + // as the constant is between 2**31 and 2**32 + m_trThrottle = -330000 + (388880000/(q.Proportion+167)); + } + return NOERROR; +} // Notify + + +// Send a message to indicate what our supplier should do about quality. +// Theory: +// What a supplier wants to know is "is the frame I'm working on NOW +// going to be late?". +// F1 is the frame at the supplier (as above) +// Tf1 is the due time for F1 +// T1 is the time at that point (NOW!) +// Tr1 is the time that f1 WILL actually be rendered +// L1 is the latency of the graph for frame F1 = Tr1-T1 +// D1 (for delay) is how late F1 will be beyond its due time i.e. +// D1 = (Tr1-Tf1) which is what the supplier really wants to know. +// Unfortunately Tr1 is in the future and is unknown, so is L1 +// +// We could estimate L1 by its value for a previous frame, +// L0 = Tr0-T0 and work off +// D1' = ((T1+L0)-Tf1) = (T1 + (Tr0-T0) -Tf1) +// Rearranging terms: +// D1' = (T1-T0) + (Tr0-Tf1) +// adding (Tf0-Tf0) and rearranging again: +// = (T1-T0) + (Tr0-Tf0) + (Tf0-Tf1) +// = (T1-T0) - (Tf1-Tf0) + (Tr0-Tf0) +// But (Tr0-Tf0) is just D0 - how late frame zero was, and this is the +// Late field in the quality message that we send. +// The other two terms just state what correction should be applied before +// using the lateness of F0 to predict the lateness of F1. +// (T1-T0) says how much time has actually passed (we have lost this much) +// (Tf1-Tf0) says how much time should have passed if we were keeping pace +// (we have gained this much). +// +// Suppliers should therefore work off: +// Quality.Late + (T1-T0) - (Tf1-Tf0) +// and see if this is "acceptably late" or even early (i.e. negative). +// They get T1 and T0 by polling the clock, they get Tf1 and Tf0 from +// the time stamps in the frames. They get Quality.Late from us. +// + +HRESULT CBaseVideoRenderer::SendQuality(REFERENCE_TIME trLate, + REFERENCE_TIME trRealStream) +{ + Quality q; + HRESULT hr; + + // If we are the main user of time, then report this as Flood/Dry. + // If our suppliers are, then report it as Famine/Glut. + // + // We need to take action, but avoid hunting. Hunting is caused by + // 1. Taking too much action too soon and overshooting + // 2. Taking too long to react (so averaging can CAUSE hunting). + // + // The reason why we use trLate as well as Wait is to reduce hunting; + // if the wait time is coming down and about to go into the red, we do + // NOT want to rely on some average which is only telling is that it used + // to be OK once. + + q.TimeStamp = (REFERENCE_TIME)trRealStream; + + if (m_trFrameAvg<0) { + q.Type = Famine; // guess + } + // Is the greater part of the time taken bltting or something else + else if (m_trFrameAvg > 2*m_trRenderAvg) { + q.Type = Famine; // mainly other + } else { + q.Type = Flood; // mainly bltting + } + + q.Proportion = 1000; // default + + if (m_trFrameAvg<0) { + // leave it alone - we don't know enough + } + else if ( trLate> 0 ) { + // try to catch up over the next second + // We could be Really, REALLY late, but rendering all the frames + // anyway, just because it's so cheap. + + q.Proportion = 1000 - (int)((trLate)/(UNITS/1000)); + if (q.Proportion<500) { + q.Proportion = 500; // don't go daft. (could've been negative!) + } else { + } + + } else if ( m_trWaitAvg>20000 + && trLate<-20000 + ){ + // Go cautiously faster - aim at 2mSec wait. + if (m_trWaitAvg>=m_trFrameAvg) { + // This can happen because of some fudges. + // The waitAvg is how long we originally planned to wait + // The frameAvg is more honest. + // It means that we are spending a LOT of time waiting + q.Proportion = 2000; // double. + } else { + if (m_trFrameAvg+20000 > m_trWaitAvg) { + q.Proportion + = 1000 * (m_trFrameAvg / (m_trFrameAvg + 20000 - m_trWaitAvg)); + } else { + // We're apparently spending more than the whole frame time waiting. + // Assume that the averages are slightly out of kilter, but that we + // are indeed doing a lot of waiting. (This leg probably never + // happens, but the code avoids any potential divide by zero). + q.Proportion = 2000; + } + } + + if (q.Proportion>2000) { + q.Proportion = 2000; // don't go crazy. + } + } + + // Tell the supplier how late frames are when they get rendered + // That's how late we are now. + // If we are in directdraw mode then the guy upstream can see the drawing + // times and we'll just report on the start time. He can figure out any + // offset to apply. If we are in DIB Section mode then we will apply an + // extra offset which is half of our drawing time. This is usually small + // but can sometimes be the dominant effect. For this we will use the + // average drawing time rather than the last frame. If the last frame took + // a long time to draw and made us late, that's already in the lateness + // figure. We should not add it in again unless we expect the next frame + // to be the same. We don't, we expect the average to be a better shot. + // In direct draw mode the RenderAvg will be zero. + + q.Late = trLate + m_trRenderAvg/2; + + // log what we're doing + MSR_INTEGER(m_idQualityRate, q.Proportion); + MSR_INTEGER( m_idQualityTime, (int)q.Late / 10000 ); + + // A specific sink interface may be set through IPin + + if (m_pQSink==NULL) { + // Get our input pin's peer. We send quality management messages + // to any nominated receiver of these things (set in the IPin + // interface), or else to our source filter. + + IQualityControl *pQC = NULL; + IPin *pOutputPin = m_pInputPin->GetConnected(); + ASSERT(pOutputPin != NULL); + + // And get an AddRef'd quality control interface + + hr = pOutputPin->QueryInterface(IID_IQualityControl,(void**) &pQC); + if (SUCCEEDED(hr)) { + m_pQSink = pQC; + } + } + if (m_pQSink) { + return m_pQSink->Notify(this,q); + } + + return S_FALSE; + +} // SendQuality + + +// We are called with a valid IMediaSample image to decide whether this is to +// be drawn or not. There must be a reference clock in operation. +// Return S_OK if it is to be drawn Now (as soon as possible) +// Return S_FALSE if it is to be drawn when it's due +// Return an error if we want to drop it +// m_nNormal=-1 indicates that we dropped the previous frame and so this +// one should be drawn early. Respect it and update it. +// Use current stream time plus a number of heuristics (detailed below) +// to make the decision + +HRESULT CBaseVideoRenderer::ShouldDrawSampleNow(IMediaSample *pMediaSample, + __inout REFERENCE_TIME *ptrStart, + __inout REFERENCE_TIME *ptrEnd) +{ + + // Don't call us unless there's a clock interface to synchronise with + ASSERT(m_pClock); + + MSR_INTEGER(m_idTimeStamp, (int)((*ptrStart)>>32)); // high order 32 bits + MSR_INTEGER(m_idTimeStamp, (int)(*ptrStart)); // low order 32 bits + + // We lose a bit of time depending on the monitor type waiting for the next + // screen refresh. On average this might be about 8mSec - so it will be + // later than we think when the picture appears. To compensate a bit + // we bias the media samples by -8mSec i.e. 80000 UNITs. + // We don't ever make a stream time negative (call it paranoia) + if (*ptrStart>=80000) { + *ptrStart -= 80000; + *ptrEnd -= 80000; // bias stop to to retain valid frame duration + } + + // Cache the time stamp now. We will want to compare what we did with what + // we started with (after making the monitor allowance). + m_trRememberStampForPerf = *ptrStart; + + // Get reference times (current and late) + REFERENCE_TIME trRealStream; // the real time now expressed as stream time. + m_pClock->GetTime(&trRealStream); +#ifdef PERF + // While the reference clock is expensive: + // Remember the offset from timeGetTime and use that. + // This overflows all over the place, but when we subtract to get + // differences the overflows all cancel out. + m_llTimeOffset = trRealStream-timeGetTime()*10000; +#endif + trRealStream -= m_tStart; // convert to stream time (this is a reftime) + + // We have to wory about two versions of "lateness". The truth, which we + // try to work out here and the one measured against m_trTarget which + // includes long term feedback. We report statistics against the truth + // but for operational decisions we work to the target. + // We use TimeDiff to make sure we get an integer because we + // may actually be late (or more likely early if there is a big time + // gap) by a very long time. + const int trTrueLate = TimeDiff(trRealStream - *ptrStart); + const int trLate = trTrueLate; + + MSR_INTEGER(m_idSchLateTime, trTrueLate/10000); + + // Send quality control messages upstream, measured against target + HRESULT hr = SendQuality(trLate, trRealStream); + // Note: the filter upstream is allowed to this FAIL meaning "you do it". + m_bSupplierHandlingQuality = (hr==S_OK); + + // Decision time! Do we drop, draw when ready or draw immediately? + + const int trDuration = (int)(*ptrEnd - *ptrStart); + { + // We need to see if the frame rate of the file has just changed. + // This would make comparing our previous frame rate with the current + // frame rate inefficent. Hang on a moment though. I've seen files + // where the frames vary between 33 and 34 mSec so as to average + // 30fps. A minor variation like that won't hurt us. + int t = m_trDuration/32; + if ( trDuration > m_trDuration+t + || trDuration < m_trDuration-t + ) { + // There's a major variation. Reset the average frame rate to + // exactly the current rate to disable decision 9002 for this frame, + // and remember the new rate. + m_trFrameAvg = trDuration; + m_trDuration = trDuration; + } + } + + MSR_INTEGER(m_idEarliness, m_trEarliness/10000); + MSR_INTEGER(m_idRenderAvg, m_trRenderAvg/10000); + MSR_INTEGER(m_idFrameAvg, m_trFrameAvg/10000); + MSR_INTEGER(m_idWaitAvg, m_trWaitAvg/10000); + MSR_INTEGER(m_idDuration, trDuration/10000); + +#ifdef PERF + if (S_OK==pMediaSample->IsDiscontinuity()) { + MSR_INTEGER(m_idDecision, 9000); + } +#endif + + // Control the graceful slide back from slow to fast machine mode. + // After a frame drop accept an early frame and set the earliness to here + // If this frame is already later than the earliness then slide it to here + // otherwise do the standard slide (reduce by about 12% per frame). + // Note: earliness is normally NEGATIVE + BOOL bJustDroppedFrame + = ( m_bSupplierHandlingQuality + // Can't use the pin sample properties because we might + // not be in Receive when we call this + && (S_OK == pMediaSample->IsDiscontinuity()) // he just dropped one + ) + || (m_nNormal==-1); // we just dropped one + + + // Set m_trEarliness (slide back from slow to fast machine mode) + if (trLate>0) { + m_trEarliness = 0; // we are no longer in fast machine mode at all! + } else if ( (trLate>=m_trEarliness) || bJustDroppedFrame) { + m_trEarliness = trLate; // Things have slipped of their own accord + } else { + m_trEarliness = m_trEarliness - m_trEarliness/8; // graceful slide + } + + // prepare the new wait average - but don't pollute the old one until + // we have finished with it. + int trWaitAvg; + { + // We never mix in a negative wait. This causes us to believe in fast machines + // slightly more. + int trL = trLate<0 ? -trLate : 0; + trWaitAvg = (trL + m_trWaitAvg*(AVGPERIOD-1))/AVGPERIOD; + } + + + int trFrame; + { + REFERENCE_TIME tr = trRealStream - m_trLastDraw; // Cd be large - 4 min pause! + if (tr>10000000) { + tr = 10000000; // 1 second - arbitrarily. + } + trFrame = int(tr); + } + + // We will DRAW this frame IF... + if ( + // ...the time we are spending drawing is a small fraction of the total + // observed inter-frame time so that dropping it won't help much. + (3*m_trRenderAvg <= m_trFrameAvg) + + // ...or our supplier is NOT handling things and the next frame would + // be less timely than this one or our supplier CLAIMS to be handling + // things, and is now less than a full FOUR frames late. + || ( m_bSupplierHandlingQuality + ? (trLate <= trDuration*4) + : (trLate+trLate < trDuration) + ) + + // ...or we are on average waiting for over eight milliseconds then + // this may be just a glitch. Draw it and we'll hope to catch up. + || (m_trWaitAvg > 80000) + + // ...or we haven't drawn an image for over a second. We will update + // the display, which stops the video looking hung. + // Do this regardless of how late this media sample is. + || ((trRealStream - m_trLastDraw) > UNITS) + + ) { + HRESULT Result; + + // We are going to play this frame. We may want to play it early. + // We will play it early if we think we are in slow machine mode. + // If we think we are NOT in slow machine mode, we will still play + // it early by m_trEarliness as this controls the graceful slide back. + // and in addition we aim at being m_trTarget late rather than "on time". + + BOOL bPlayASAP = FALSE; + + // we will play it AT ONCE (slow machine mode) if... + + // ...we are playing catch-up + if ( bJustDroppedFrame) { + bPlayASAP = TRUE; + MSR_INTEGER(m_idDecision, 9001); + } + + // ...or if we are running below the true frame rate + // exact comparisons are glitchy, for these measurements, + // so add an extra 5% or so + else if ( (m_trFrameAvg > trDuration + trDuration/16) + + // It's possible to get into a state where we are losing ground, but + // are a very long way ahead. To avoid this or recover from it + // we refuse to play early by more than 10 frames. + && (trLate > - trDuration*10) + ){ + bPlayASAP = TRUE; + MSR_INTEGER(m_idDecision, 9002); + } +#if 0 + // ...or if we have been late and are less than one frame early + else if ( (trLate + trDuration > 0) + && (m_trWaitAvg<=20000) + ) { + bPlayASAP = TRUE; + MSR_INTEGER(m_idDecision, 9003); + } +#endif + // We will NOT play it at once if we are grossly early. On very slow frame + // rate movies - e.g. clock.avi - it is not a good idea to leap ahead just + // because we got starved (for instance by the net) and dropped one frame + // some time or other. If we are more than 900mSec early, then wait. + if (trLate<-9000000) { + bPlayASAP = FALSE; + } + + if (bPlayASAP) { + + m_nNormal = 0; + MSR_INTEGER(m_idDecision, 0); + // When we are here, we are in slow-machine mode. trLate may well + // oscillate between negative and positive when the supplier is + // dropping frames to keep sync. We should not let that mislead + // us into thinking that we have as much as zero spare time! + // We just update with a zero wait. + m_trWaitAvg = (m_trWaitAvg*(AVGPERIOD-1))/AVGPERIOD; + + // Assume that we draw it immediately. Update inter-frame stats + m_trFrameAvg = (trFrame + m_trFrameAvg*(AVGPERIOD-1))/AVGPERIOD; +#ifndef PERF + // If this is NOT a perf build, then report what we know so far + // without looking at the clock any more. This assumes that we + // actually wait for exactly the time we hope to. It also reports + // how close we get to the manipulated time stamps that we now have + // rather than the ones we originally started with. It will + // therefore be a little optimistic. However it's fast. + PreparePerformanceData(trTrueLate, trFrame); +#endif + m_trLastDraw = trRealStream; + if (m_trEarliness > trLate) { + m_trEarliness = trLate; // if we are actually early, this is neg + } + Result = S_OK; // Draw it now + + } else { + ++m_nNormal; + // Set the average frame rate to EXACTLY the ideal rate. + // If we are exiting slow-machine mode then we will have caught up + // and be running ahead, so as we slide back to exact timing we will + // have a longer than usual gap at this point. If we record this + // real gap then we'll think that we're running slow and go back + // into slow-machine mode and vever get it straight. + m_trFrameAvg = trDuration; + MSR_INTEGER(m_idDecision, 1); + + // Play it early by m_trEarliness and by m_trTarget + + { + int trE = m_trEarliness; + if (trE < -m_trFrameAvg) { + trE = -m_trFrameAvg; + } + *ptrStart += trE; // N.B. earliness is negative + } + + int Delay = -trTrueLate; + Result = Delay<=0 ? S_OK : S_FALSE; // OK = draw now, FALSE = wait + + m_trWaitAvg = trWaitAvg; + + // Predict when it will actually be drawn and update frame stats + + if (Result==S_FALSE) { // We are going to wait + trFrame = TimeDiff(*ptrStart-m_trLastDraw); + m_trLastDraw = *ptrStart; + } else { + // trFrame is already = trRealStream-m_trLastDraw; + m_trLastDraw = trRealStream; + } +#ifndef PERF + int iAccuracy; + if (Delay>0) { + // Report lateness based on when we intend to play it + iAccuracy = TimeDiff(*ptrStart-m_trRememberStampForPerf); + } else { + // Report lateness based on playing it *now*. + iAccuracy = trTrueLate; // trRealStream-RememberStampForPerf; + } + PreparePerformanceData(iAccuracy, trFrame); +#endif + } + return Result; + } + + // We are going to drop this frame! + // Of course in DirectDraw mode the guy upstream may draw it anyway. + + // This will probably give a large negative wack to the wait avg. + m_trWaitAvg = trWaitAvg; + +#ifdef PERF + // Respect registry setting - debug only! + if (m_bDrawLateFrames) { + return S_OK; // draw it when it's ready + } // even though it's late. +#endif + + // We are going to drop this frame so draw the next one early + // n.b. if the supplier is doing direct draw then he may draw it anyway + // but he's doing something funny to arrive here in that case. + + MSR_INTEGER(m_idDecision, 2); + m_nNormal = -1; + return E_FAIL; // drop it + +} // ShouldDrawSampleNow + + +// NOTE we're called by both the window thread and the source filter thread +// so we have to be protected by a critical section (locked before called) +// Also, when the window thread gets signalled to render an image, it always +// does so regardless of how late it is. All the degradation is done when we +// are scheduling the next sample to be drawn. Hence when we start an advise +// link to draw a sample, that sample's time will always become the last one +// drawn - unless of course we stop streaming in which case we cancel links + +BOOL CBaseVideoRenderer::ScheduleSample(IMediaSample *pMediaSample) +{ + // We override ShouldDrawSampleNow to add quality management + + BOOL bDrawImage = CBaseRenderer::ScheduleSample(pMediaSample); + if (bDrawImage == FALSE) { + ++m_cFramesDropped; + return FALSE; + } + + // m_cFramesDrawn must NOT be updated here. It has to be updated + // in RecordFrameLateness at the same time as the other statistics. + return TRUE; +} + + +// Implementation of IQualProp interface needed to support the property page +// This is how the property page gets the data out of the scheduler. We are +// passed into the constructor the owning object in the COM sense, this will +// either be the video renderer or an external IUnknown if we're aggregated. +// We initialise our CUnknown base class with this interface pointer. Then +// all we have to do is to override NonDelegatingQueryInterface to expose +// our IQualProp interface. The AddRef and Release are handled automatically +// by the base class and will be passed on to the appropriate outer object + +STDMETHODIMP CBaseVideoRenderer::get_FramesDroppedInRenderer(__out int *pcFramesDropped) +{ + CheckPointer(pcFramesDropped,E_POINTER); + CAutoLock cVideoLock(&m_InterfaceLock); + *pcFramesDropped = m_cFramesDropped; + return NOERROR; +} // get_FramesDroppedInRenderer + + +// Set *pcFramesDrawn to the number of frames drawn since +// streaming started. + +STDMETHODIMP CBaseVideoRenderer::get_FramesDrawn( int *pcFramesDrawn) +{ + CheckPointer(pcFramesDrawn,E_POINTER); + CAutoLock cVideoLock(&m_InterfaceLock); + *pcFramesDrawn = m_cFramesDrawn; + return NOERROR; +} // get_FramesDrawn + + +// Set iAvgFrameRate to the frames per hundred secs since +// streaming started. 0 otherwise. + +STDMETHODIMP CBaseVideoRenderer::get_AvgFrameRate( int *piAvgFrameRate) +{ + CheckPointer(piAvgFrameRate,E_POINTER); + CAutoLock cVideoLock(&m_InterfaceLock); + + int t; + if (m_bStreaming) { + t = timeGetTime()-m_tStreamingStart; + } else { + t = m_tStreamingStart; + } + + if (t<=0) { + *piAvgFrameRate = 0; + ASSERT(m_cFramesDrawn == 0); + } else { + // i is frames per hundred seconds + *piAvgFrameRate = MulDiv(100000, m_cFramesDrawn, t); + } + return NOERROR; +} // get_AvgFrameRate + + +// Set *piAvg to the average sync offset since streaming started +// in mSec. The sync offset is the time in mSec between when the frame +// should have been drawn and when the frame was actually drawn. + +STDMETHODIMP CBaseVideoRenderer::get_AvgSyncOffset(__out int *piAvg) +{ + CheckPointer(piAvg,E_POINTER); + CAutoLock cVideoLock(&m_InterfaceLock); + + if (NULL==m_pClock) { + *piAvg = 0; + return NOERROR; + } + + // Note that we didn't gather the stats on the first frame + // so we use m_cFramesDrawn-1 here + if (m_cFramesDrawn<=1) { + *piAvg = 0; + } else { + *piAvg = (int)(m_iTotAcc / (m_cFramesDrawn-1)); + } + return NOERROR; +} // get_AvgSyncOffset + + +// To avoid dragging in the maths library - a cheap +// approximate integer square root. +// We do this by getting a starting guess which is between 1 +// and 2 times too large, followed by THREE iterations of +// Newton Raphson. (That will give accuracy to the nearest mSec +// for the range in question - roughly 0..1000) +// +// It would be faster to use a linear interpolation and ONE NR, but +// who cares. If anyone does - the best linear interpolation is +// to approximates sqrt(x) by +// y = x * (sqrt(2)-1) + 1 - 1/sqrt(2) + 1/(8*(sqrt(2)-1)) +// 0r y = x*0.41421 + 0.59467 +// This minimises the maximal error in the range in question. +// (error is about +0.008883 and then one NR will give error .0000something +// (Of course these are integers, so you can't just multiply by 0.41421 +// you'd have to do some sort of MulDiv). +// Anyone wanna check my maths? (This is only for a property display!) + +int isqrt(int x) +{ + int s = 1; + // Make s an initial guess for sqrt(x) + if (x > 0x40000000) { + s = 0x8000; // prevent any conceivable closed loop + } else { + while (s*s<x) { // loop cannot possible go more than 31 times + s = 2*s; // normally it goes about 6 times + } + // Three NR iterations. + if (x==0) { + s= 0; // Wouldn't it be tragic to divide by zero whenever our + // accuracy was perfect! + } else { + s = (s*s+x)/(2*s); + if (s>=0) s = (s*s+x)/(2*s); + if (s>=0) s = (s*s+x)/(2*s); + } + } + return s; +} + +// +// Do estimates for standard deviations for per-frame +// statistics +// +HRESULT CBaseVideoRenderer::GetStdDev( + int nSamples, + __out int *piResult, + LONGLONG llSumSq, + LONGLONG iTot +) +{ + CheckPointer(piResult,E_POINTER); + CAutoLock cVideoLock(&m_InterfaceLock); + + if (NULL==m_pClock) { + *piResult = 0; + return NOERROR; + } + + // If S is the Sum of the Squares of observations and + // T the Total (i.e. sum) of the observations and there were + // N observations, then an estimate of the standard deviation is + // sqrt( (S - T**2/N) / (N-1) ) + + if (nSamples<=1) { + *piResult = 0; + } else { + LONGLONG x; + // First frames have invalid stamps, so we get no stats for them + // So we need 2 frames to get 1 datum, so N is cFramesDrawn-1 + + // so we use m_cFramesDrawn-1 here + x = llSumSq - llMulDiv(iTot, iTot, nSamples, 0); + x = x / (nSamples-1); + ASSERT(x>=0); + *piResult = isqrt((LONG)x); + } + return NOERROR; +} + +// Set *piDev to the standard deviation in mSec of the sync offset +// of each frame since streaming started. + +STDMETHODIMP CBaseVideoRenderer::get_DevSyncOffset(__out int *piDev) +{ + // First frames have invalid stamps, so we get no stats for them + // So we need 2 frames to get 1 datum, so N is cFramesDrawn-1 + return GetStdDev(m_cFramesDrawn - 1, + piDev, + m_iSumSqAcc, + m_iTotAcc); +} // get_DevSyncOffset + + +// Set *piJitter to the standard deviation in mSec of the inter-frame time +// of frames since streaming started. + +STDMETHODIMP CBaseVideoRenderer::get_Jitter(__out int *piJitter) +{ + // First frames have invalid stamps, so we get no stats for them + // So second frame gives invalid inter-frame time + // So we need 3 frames to get 1 datum, so N is cFramesDrawn-2 + return GetStdDev(m_cFramesDrawn - 2, + piJitter, + m_iSumSqFrameTime, + m_iSumFrameTime); +} // get_Jitter + + +// Overidden to return our IQualProp interface + +STDMETHODIMP +CBaseVideoRenderer::NonDelegatingQueryInterface(REFIID riid,__deref_out VOID **ppv) +{ + // We return IQualProp and delegate everything else + + if (riid == IID_IQualProp) { + return GetInterface( (IQualProp *)this, ppv); + } else if (riid == IID_IQualityControl) { + return GetInterface( (IQualityControl *)this, ppv); + } + return CBaseRenderer::NonDelegatingQueryInterface(riid,ppv); +} + + +// Override JoinFilterGraph so that, just before leaving +// the graph we can send an EC_WINDOW_DESTROYED event + +STDMETHODIMP +CBaseVideoRenderer::JoinFilterGraph(__inout_opt IFilterGraph *pGraph, __in_opt LPCWSTR pName) +{ + // Since we send EC_ACTIVATE, we also need to ensure + // we send EC_WINDOW_DESTROYED or the resource manager may be + // holding us as a focus object + if (!pGraph && m_pGraph) { + + // We were in a graph and now we're not + // Do this properly in case we are aggregated + IBaseFilter* pFilter = this; + NotifyEvent(EC_WINDOW_DESTROYED, (LPARAM) pFilter, 0); + } + return CBaseFilter::JoinFilterGraph(pGraph, pName); +} + + +// This removes a large number of level 4 warnings from the +// Microsoft compiler which in this case are not very useful +#pragma warning(disable: 4514) +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/renbase.h
Added
@@ -0,0 +1,478 @@ +//------------------------------------------------------------------------------ +// File: RenBase.h +// +// Desc: DirectShow base classes - defines a generic ActiveX base renderer +// class. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __RENBASE__ +#define __RENBASE__ + +// Forward class declarations + +class CBaseRenderer; +class CBaseVideoRenderer; +class CRendererInputPin; + +// This is our input pin class that channels calls to the renderer + +class CRendererInputPin : public CBaseInputPin +{ +protected: + + CBaseRenderer *m_pRenderer; + +public: + + CRendererInputPin(__inout CBaseRenderer *pRenderer, + __inout HRESULT *phr, + __in_opt LPCWSTR Name); + + // Overriden from the base pin classes + + HRESULT BreakConnect(); + HRESULT CompleteConnect(IPin *pReceivePin); + HRESULT SetMediaType(const CMediaType *pmt); + HRESULT CheckMediaType(const CMediaType *pmt); + HRESULT Active(); + HRESULT Inactive(); + + // Add rendering behaviour to interface functions + + STDMETHODIMP QueryId(__deref_out LPWSTR *Id); + STDMETHODIMP EndOfStream(); + STDMETHODIMP BeginFlush(); + STDMETHODIMP EndFlush(); + STDMETHODIMP Receive(IMediaSample *pMediaSample); + + // Helper + IMemAllocator inline *Allocator() const + { + return m_pAllocator; + } +}; + +// Main renderer class that handles synchronisation and state changes + +class CBaseRenderer : public CBaseFilter +{ +protected: + + friend class CRendererInputPin; + + friend void CALLBACK EndOfStreamTimer(UINT uID, // Timer identifier + UINT uMsg, // Not currently used + DWORD_PTR dwUser, // User information + DWORD_PTR dw1, // Windows reserved + DWORD_PTR dw2); // Is also reserved + + CRendererPosPassThru *m_pPosition; // Media seeking pass by object + CAMEvent m_RenderEvent; // Used to signal timer events + CAMEvent m_ThreadSignal; // Signalled to release worker thread + CAMEvent m_evComplete; // Signalled when state complete + BOOL m_bAbort; // Stop us from rendering more data + BOOL m_bStreaming; // Are we currently streaming + DWORD_PTR m_dwAdvise; // Timer advise cookie + IMediaSample *m_pMediaSample; // Current image media sample + BOOL m_bEOS; // Any more samples in the stream + BOOL m_bEOSDelivered; // Have we delivered an EC_COMPLETE + CRendererInputPin *m_pInputPin; // Our renderer input pin object + CCritSec m_InterfaceLock; // Critical section for interfaces + CCritSec m_RendererLock; // Controls access to internals + IQualityControl * m_pQSink; // QualityControl sink + BOOL m_bRepaintStatus; // Can we signal an EC_REPAINT + // Avoid some deadlocks by tracking filter during stop + volatile BOOL m_bInReceive; // Inside Receive between PrepareReceive + // And actually processing the sample + REFERENCE_TIME m_SignalTime; // Time when we signal EC_COMPLETE + UINT m_EndOfStreamTimer; // Used to signal end of stream + CCritSec m_ObjectCreationLock; // This lock protects the creation and + // of m_pPosition and m_pInputPin. It + // ensures that two threads cannot create + // either object simultaneously. + +public: + + CBaseRenderer(REFCLSID RenderClass, // CLSID for this renderer + __in_opt LPCTSTR pName, // Debug ONLY description + __inout_opt LPUNKNOWN pUnk, // Aggregated owner object + __inout HRESULT *phr); // General OLE return code + + ~CBaseRenderer(); + + // Overriden to say what interfaces we support and where + + virtual HRESULT GetMediaPositionInterface(REFIID riid, __deref_out void **ppv); + STDMETHODIMP NonDelegatingQueryInterface(REFIID, __deref_out void **); + + virtual HRESULT SourceThreadCanWait(BOOL bCanWait); + +#ifdef DEBUG + // Debug only dump of the renderer state + void DisplayRendererState(); +#endif + virtual HRESULT WaitForRenderTime(); + virtual HRESULT CompleteStateChange(FILTER_STATE OldState); + + // Return internal information about this filter + + BOOL IsEndOfStream() { return m_bEOS; }; + BOOL IsEndOfStreamDelivered() { return m_bEOSDelivered; }; + BOOL IsStreaming() { return m_bStreaming; }; + void SetAbortSignal(BOOL bAbort) { m_bAbort = bAbort; }; + virtual void OnReceiveFirstSample(IMediaSample *pMediaSample) { }; + CAMEvent *GetRenderEvent() { return &m_RenderEvent; }; + + // Permit access to the transition state + + void Ready() { m_evComplete.Set(); }; + void NotReady() { m_evComplete.Reset(); }; + BOOL CheckReady() { return m_evComplete.Check(); }; + + virtual int GetPinCount(); + virtual CBasePin *GetPin(int n); + FILTER_STATE GetRealState(); + void SendRepaint(); + void SendNotifyWindow(IPin *pPin,HWND hwnd); + BOOL OnDisplayChange(); + void SetRepaintStatus(BOOL bRepaint); + + // Override the filter and pin interface functions + + STDMETHODIMP Stop(); + STDMETHODIMP Pause(); + STDMETHODIMP Run(REFERENCE_TIME StartTime); + STDMETHODIMP GetState(DWORD dwMSecs, __out FILTER_STATE *State); + STDMETHODIMP FindPin(LPCWSTR Id, __deref_out IPin **ppPin); + + // These are available for a quality management implementation + + virtual void OnRenderStart(IMediaSample *pMediaSample); + virtual void OnRenderEnd(IMediaSample *pMediaSample); + virtual HRESULT OnStartStreaming() { return NOERROR; }; + virtual HRESULT OnStopStreaming() { return NOERROR; }; + virtual void OnWaitStart() { }; + virtual void OnWaitEnd() { }; + virtual void PrepareRender() { }; + +#ifdef PERF + REFERENCE_TIME m_trRenderStart; // Just before we started drawing + // Set in OnRenderStart, Used in OnRenderEnd + int m_idBaseStamp; // MSR_id for frame time stamp + int m_idBaseRenderTime; // MSR_id for true wait time + int m_idBaseAccuracy; // MSR_id for time frame is late (int) +#endif + + // Quality management implementation for scheduling rendering + + virtual BOOL ScheduleSample(IMediaSample *pMediaSample); + virtual HRESULT GetSampleTimes(IMediaSample *pMediaSample, + __out REFERENCE_TIME *pStartTime, + __out REFERENCE_TIME *pEndTime); + + virtual HRESULT ShouldDrawSampleNow(IMediaSample *pMediaSample, + __out REFERENCE_TIME *ptrStart, + __out REFERENCE_TIME *ptrEnd); + + // Lots of end of stream complexities + + void TimerCallback(); + void ResetEndOfStreamTimer(); + HRESULT NotifyEndOfStream(); + virtual HRESULT SendEndOfStream(); + virtual HRESULT ResetEndOfStream(); + virtual HRESULT EndOfStream(); + + // Rendering is based around the clock + + void SignalTimerFired(); + virtual HRESULT CancelNotification(); + virtual HRESULT ClearPendingSample(); + + // Called when the filter changes state + + virtual HRESULT Active(); + virtual HRESULT Inactive(); + virtual HRESULT StartStreaming(); + virtual HRESULT StopStreaming(); + virtual HRESULT BeginFlush(); + virtual HRESULT EndFlush(); + + // Deal with connections and type changes + + virtual HRESULT BreakConnect(); + virtual HRESULT SetMediaType(const CMediaType *pmt); + virtual HRESULT CompleteConnect(IPin *pReceivePin); + + // These look after the handling of data samples + + virtual HRESULT PrepareReceive(IMediaSample *pMediaSample); + virtual HRESULT Receive(IMediaSample *pMediaSample); + virtual BOOL HaveCurrentSample(); + virtual IMediaSample *GetCurrentSample(); + virtual HRESULT Render(IMediaSample *pMediaSample); + + // Derived classes MUST override these + virtual HRESULT DoRenderSample(IMediaSample *pMediaSample) PURE; + virtual HRESULT CheckMediaType(const CMediaType *) PURE; + + // Helper + void WaitForReceiveToComplete(); +}; + + +// CBaseVideoRenderer is a renderer class (see its ancestor class) and +// it handles scheduling of media samples so that they are drawn at the +// correct time by the reference clock. It implements a degradation +// strategy. Possible degradation modes are: +// Drop frames here (only useful if the drawing takes significant time) +// Signal supplier (upstream) to drop some frame(s) - i.e. one-off skip. +// Signal supplier to change the frame rate - i.e. ongoing skipping. +// Or any combination of the above. +// In order to determine what's useful to try we need to know what's going +// on. This is done by timing various operations (including the supplier). +// This timing is done by using timeGetTime as it is accurate enough and +// usually cheaper than calling the reference clock. It also tells the +// truth if there is an audio break and the reference clock stops. +// We provide a number of public entry points (named OnXxxStart, OnXxxEnd) +// which the rest of the renderer calls at significant moments. These do +// the timing. + +// the number of frames that the sliding averages are averaged over. +// the rule is (1024*NewObservation + (AVGPERIOD-1) * PreviousAverage)/AVGPERIOD +#define AVGPERIOD 4 +#define DO_MOVING_AVG(avg,obs) (avg = (1024*obs + (AVGPERIOD-1)*avg)/AVGPERIOD) +// Spot the bug in this macro - I can't. but it doesn't work! + +class CBaseVideoRenderer : public CBaseRenderer, // Base renderer class + public IQualProp, // Property page guff + public IQualityControl // Allow throttling +{ +protected: + + // Hungarian: + // tFoo is the time Foo in mSec (beware m_tStart from filter.h) + // trBar is the time Bar by the reference clock + + //****************************************************************** + // State variables to control synchronisation + //****************************************************************** + + // Control of sending Quality messages. We need to know whether + // we are in trouble (e.g. frames being dropped) and where the time + // is being spent. + + // When we drop a frame we play the next one early. + // The frame after that is likely to wait before drawing and counting this + // wait as spare time is unfair, so we count it as a zero wait. + // We therefore need to know whether we are playing frames early or not. + + int m_nNormal; // The number of consecutive frames + // drawn at their normal time (not early) + // -1 means we just dropped a frame. + +#ifdef PERF + BOOL m_bDrawLateFrames; // Don't drop any frames (debug and I'm + // not keen on people using it!) +#endif + + BOOL m_bSupplierHandlingQuality;// The response to Quality messages says + // our supplier is handling things. + // We will allow things to go extra late + // before dropping frames. We will play + // very early after he has dropped one. + + // Control of scheduling, frame dropping etc. + // We need to know where the time is being spent so as to tell whether + // we should be taking action here, signalling supplier or what. + // The variables are initialised to a mode of NOT dropping frames. + // They will tell the truth after a few frames. + // We typically record a start time for an event, later we get the time + // again and subtract to get the elapsed time, and we average this over + // a few frames. The average is used to tell what mode we are in. + + // Although these are reference times (64 bit) they are all DIFFERENCES + // between times which are small. An int will go up to 214 secs before + // overflow. Avoiding 64 bit multiplications and divisions seems + // worth while. + + + + // Audio-video throttling. If the user has turned up audio quality + // very high (in principle it could be any other stream, not just audio) + // then we can receive cries for help via the graph manager. In this case + // we put in a wait for some time after rendering each frame. + int m_trThrottle; + + // The time taken to render (i.e. BitBlt) frames controls which component + // needs to degrade. If the blt is expensive, the renderer degrades. + // If the blt is cheap it's done anyway and the supplier degrades. + int m_trRenderAvg; // Time frames are taking to blt + int m_trRenderLast; // Time for last frame blt + int m_tRenderStart; // Just before we started drawing (mSec) + // derived from timeGetTime. + + // When frames are dropped we will play the next frame as early as we can. + // If it was a false alarm and the machine is fast we slide gently back to + // normal timing. To do this, we record the offset showing just how early + // we really are. This will normally be negative meaning early or zero. + int m_trEarliness; + + // Target provides slow long-term feedback to try to reduce the + // average sync offset to zero. Whenever a frame is actually rendered + // early we add a msec or two, whenever late we take off a few. + // We add or take off 1/32 of the error time. + // Eventually we should be hovering around zero. For a really bad case + // where we were (say) 300mSec off, it might take 100 odd frames to + // settle down. The rate of change of this is intended to be slower + // than any other mechanism in Quartz, thereby avoiding hunting. + int m_trTarget; + + // The proportion of time spent waiting for the right moment to blt + // controls whether we bother to drop a frame or whether we reckon that + // we're doing well enough that we can stand a one-frame glitch. + int m_trWaitAvg; // Average of last few wait times + // (actually we just average how early + // we were). Negative here means LATE. + + // The average inter-frame time. + // This is used to calculate the proportion of the time used by the + // three operations (supplying us, waiting, rendering) + int m_trFrameAvg; // Average inter-frame time + int m_trDuration; // duration of last frame. + +#ifdef PERF + // Performance logging identifiers + int m_idTimeStamp; // MSR_id for frame time stamp + int m_idEarliness; // MSR_id for earliness fudge + int m_idTarget; // MSR_id for Target fudge + int m_idWaitReal; // MSR_id for true wait time + int m_idWait; // MSR_id for wait time recorded + int m_idFrameAccuracy; // MSR_id for time frame is late (int) + int m_idRenderAvg; // MSR_id for Render time recorded (int) + int m_idSchLateTime; // MSR_id for lateness at scheduler + int m_idQualityRate; // MSR_id for Quality rate requested + int m_idQualityTime; // MSR_id for Quality time requested + int m_idDecision; // MSR_id for decision code + int m_idDuration; // MSR_id for duration of a frame + int m_idThrottle; // MSR_id for audio-video throttling + //int m_idDebug; // MSR_id for trace style debugging + //int m_idSendQuality; // MSR_id for timing the notifications per se +#endif // PERF + REFERENCE_TIME m_trRememberStampForPerf; // original time stamp of frame + // with no earliness fudges etc. +#ifdef PERF + REFERENCE_TIME m_trRememberFrameForPerf; // time when previous frame rendered + + // debug... + int m_idFrameAvg; + int m_idWaitAvg; +#endif + + // PROPERTY PAGE + // This has edit fields that show the user what's happening + // These member variables hold these counts. + + int m_cFramesDropped; // cumulative frames dropped IN THE RENDERER + int m_cFramesDrawn; // Frames since streaming started seen BY THE + // RENDERER (some may be dropped upstream) + + // Next two support average sync offset and standard deviation of sync offset. + LONGLONG m_iTotAcc; // Sum of accuracies in mSec + LONGLONG m_iSumSqAcc; // Sum of squares of (accuracies in mSec) + + // Next two allow jitter calculation. Jitter is std deviation of frame time. + REFERENCE_TIME m_trLastDraw; // Time of prev frame (for inter-frame times) + LONGLONG m_iSumSqFrameTime; // Sum of squares of (inter-frame time in mSec) + LONGLONG m_iSumFrameTime; // Sum of inter-frame times in mSec + + // To get performance statistics on frame rate, jitter etc, we need + // to record the lateness and inter-frame time. What we actually need are the + // data above (sum, sum of squares and number of entries for each) but the data + // is generated just ahead of time and only later do we discover whether the + // frame was actually drawn or not. So we have to hang on to the data + int m_trLate; // hold onto frame lateness + int m_trFrame; // hold onto inter-frame time + + int m_tStreamingStart; // if streaming then time streaming started + // else time of last streaming session + // used for property page statistics +#ifdef PERF + LONGLONG m_llTimeOffset; // timeGetTime()*10000+m_llTimeOffset==ref time +#endif + +public: + + + CBaseVideoRenderer(REFCLSID RenderClass, // CLSID for this renderer + __in_opt LPCTSTR pName, // Debug ONLY description + __inout_opt LPUNKNOWN pUnk, // Aggregated owner object + __inout HRESULT *phr); // General OLE return code + + ~CBaseVideoRenderer(); + + // IQualityControl methods - Notify allows audio-video throttling + + STDMETHODIMP SetSink( IQualityControl * piqc); + STDMETHODIMP Notify( IBaseFilter * pSelf, Quality q); + + // These provide a full video quality management implementation + + void OnRenderStart(IMediaSample *pMediaSample); + void OnRenderEnd(IMediaSample *pMediaSample); + void OnWaitStart(); + void OnWaitEnd(); + HRESULT OnStartStreaming(); + HRESULT OnStopStreaming(); + void ThrottleWait(); + + // Handle the statistics gathering for our quality management + + void PreparePerformanceData(int trLate, int trFrame); + virtual void RecordFrameLateness(int trLate, int trFrame); + virtual void OnDirectRender(IMediaSample *pMediaSample); + virtual HRESULT ResetStreamingTimes(); + BOOL ScheduleSample(IMediaSample *pMediaSample); + HRESULT ShouldDrawSampleNow(IMediaSample *pMediaSample, + __inout REFERENCE_TIME *ptrStart, + __inout REFERENCE_TIME *ptrEnd); + + virtual HRESULT SendQuality(REFERENCE_TIME trLate, REFERENCE_TIME trRealStream); + STDMETHODIMP JoinFilterGraph(__inout_opt IFilterGraph * pGraph, __in_opt LPCWSTR pName); + + // + // Do estimates for standard deviations for per-frame + // statistics + // + // *piResult = (llSumSq - iTot * iTot / m_cFramesDrawn - 1) / + // (m_cFramesDrawn - 2) + // or 0 if m_cFramesDrawn <= 3 + // + HRESULT GetStdDev( + int nSamples, + __out int *piResult, + LONGLONG llSumSq, + LONGLONG iTot + ); +public: + + // IQualProp property page support + + STDMETHODIMP get_FramesDroppedInRenderer(__out int *cFramesDropped); + STDMETHODIMP get_FramesDrawn(__out int *pcFramesDrawn); + STDMETHODIMP get_AvgFrameRate(__out int *piAvgFrameRate); + STDMETHODIMP get_Jitter(__out int *piJitter); + STDMETHODIMP get_AvgSyncOffset(__out int *piAvg); + STDMETHODIMP get_DevSyncOffset(__out int *piDev); + + // Implement an IUnknown interface and expose IQualProp + + DECLARE_IUNKNOWN + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,__deref_out VOID **ppv); +}; + +#endif // __RENBASE__ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/schedule.cpp
Added
@@ -0,0 +1,284 @@ +//------------------------------------------------------------------------------ +// File: Schedule.cpp +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1996-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> + +// DbgLog values (all on LOG_TIMING): +// +// 2 for schedulting, firing and shunting of events +// 3 for wait delays and wake-up times of event thread +// 4 for details of whats on the list when the thread awakes + +/* Construct & destructors */ + +CAMSchedule::CAMSchedule( HANDLE ev ) +: CBaseObject(TEXT("CAMSchedule")) +, head(&z, 0), z(0, MAX_TIME) +, m_dwNextCookie(0), m_dwAdviseCount(0) +, m_pAdviseCache(0), m_dwCacheCount(0) +, m_ev( ev ) +{ + head.m_dwAdviseCookie = z.m_dwAdviseCookie = 0; +} + +CAMSchedule::~CAMSchedule() +{ + m_Serialize.Lock(); + + // Delete cache + CAdvisePacket * p = m_pAdviseCache; + while (p) + { + CAdvisePacket *const p_next = p->m_next; + delete p; + p = p_next; + } + + ASSERT( m_dwAdviseCount == 0 ); + // Better to be safe than sorry + if ( m_dwAdviseCount > 0 ) + { + DumpLinkedList(); + while ( !head.m_next->IsZ() ) + { + head.DeleteNext(); + --m_dwAdviseCount; + } + } + + // If, in the debug version, we assert twice, it means, not only + // did we have left over advises, but we have also let m_dwAdviseCount + // get out of sync. with the number of advises actually on the list. + ASSERT( m_dwAdviseCount == 0 ); + + m_Serialize.Unlock(); +} + +/* Public methods */ + +DWORD CAMSchedule::GetAdviseCount() +{ + // No need to lock, m_dwAdviseCount is 32bits & declared volatile + return m_dwAdviseCount; +} + +REFERENCE_TIME CAMSchedule::GetNextAdviseTime() +{ + CAutoLock lck(&m_Serialize); // Need to stop the linked list from changing + return head.m_next->m_rtEventTime; +} + +DWORD_PTR CAMSchedule::AddAdvisePacket +( const REFERENCE_TIME & time1 +, const REFERENCE_TIME & time2 +, HANDLE h, BOOL periodic +) +{ + // Since we use MAX_TIME as a sentry, we can't afford to + // schedule a notification at MAX_TIME + ASSERT( time1 < MAX_TIME ); + DWORD_PTR Result; + CAdvisePacket * p; + + m_Serialize.Lock(); + + if (m_pAdviseCache) + { + p = m_pAdviseCache; + m_pAdviseCache = p->m_next; + --m_dwCacheCount; + } + else + { + p = new CAdvisePacket(); + } + if (p) + { + p->m_rtEventTime = time1; p->m_rtPeriod = time2; + p->m_hNotify = h; p->m_bPeriodic = periodic; + Result = AddAdvisePacket( p ); + } + else Result = 0; + + m_Serialize.Unlock(); + + return Result; +} + +HRESULT CAMSchedule::Unadvise(DWORD_PTR dwAdviseCookie) +{ + HRESULT hr = S_FALSE; + CAdvisePacket * p_prev = &head; + CAdvisePacket * p_n; + m_Serialize.Lock(); + while ( p_n = p_prev->Next() ) // The Next() method returns NULL when it hits z + { + if ( p_n->m_dwAdviseCookie == dwAdviseCookie ) + { + Delete( p_prev->RemoveNext() ); + --m_dwAdviseCount; + hr = S_OK; + // Having found one cookie that matches, there should be no more + #ifdef DEBUG + while (p_n = p_prev->Next()) + { + ASSERT(p_n->m_dwAdviseCookie != dwAdviseCookie); + p_prev = p_n; + } + #endif + break; + } + p_prev = p_n; + }; + m_Serialize.Unlock(); + return hr; +} + +REFERENCE_TIME CAMSchedule::Advise( const REFERENCE_TIME & rtTime ) +{ + REFERENCE_TIME rtNextTime; + CAdvisePacket * pAdvise; + + DbgLog((LOG_TIMING, 2, + TEXT("CAMSchedule::Advise( %lu ms )"), ULONG(rtTime / (UNITS / MILLISECONDS)))); + + CAutoLock lck(&m_Serialize); + + #ifdef DEBUG + if (DbgCheckModuleLevel(LOG_TIMING, 4)) DumpLinkedList(); + #endif + + // Note - DON'T cache the difference, it might overflow + while ( rtTime >= (rtNextTime = (pAdvise=head.m_next)->m_rtEventTime) && + !pAdvise->IsZ() ) + { + ASSERT(pAdvise->m_dwAdviseCookie); // If this is zero, its the head or the tail!! + + ASSERT(pAdvise->m_hNotify != INVALID_HANDLE_VALUE); + + if (pAdvise->m_bPeriodic == TRUE) + { + ReleaseSemaphore(pAdvise->m_hNotify,1,NULL); + pAdvise->m_rtEventTime += pAdvise->m_rtPeriod; + ShuntHead(); + } + else + { + ASSERT( pAdvise->m_bPeriodic == FALSE ); + EXECUTE_ASSERT(SetEvent(pAdvise->m_hNotify)); + --m_dwAdviseCount; + Delete( head.RemoveNext() ); + } + + } + + DbgLog((LOG_TIMING, 3, + TEXT("CAMSchedule::Advise() Next time stamp: %lu ms, for advise %lu."), + DWORD(rtNextTime / (UNITS / MILLISECONDS)), pAdvise->m_dwAdviseCookie )); + + return rtNextTime; +} + +/* Private methods */ + +DWORD_PTR CAMSchedule::AddAdvisePacket( __inout CAdvisePacket * pPacket ) +{ + ASSERT(pPacket->m_rtEventTime >= 0 && pPacket->m_rtEventTime < MAX_TIME); + ASSERT(CritCheckIn(&m_Serialize)); + + CAdvisePacket * p_prev = &head; + CAdvisePacket * p_n; + + const DWORD_PTR Result = pPacket->m_dwAdviseCookie = ++m_dwNextCookie; + // This relies on the fact that z is a sentry with a maximal m_rtEventTime + for(;;p_prev = p_n) + { + p_n = p_prev->m_next; + if ( p_n->m_rtEventTime >= pPacket->m_rtEventTime ) break; + } + p_prev->InsertAfter( pPacket ); + ++m_dwAdviseCount; + + DbgLog((LOG_TIMING, 2, TEXT("Added advise %lu, for thread 0x%02X, scheduled at %lu"), + pPacket->m_dwAdviseCookie, GetCurrentThreadId(), (pPacket->m_rtEventTime / (UNITS / MILLISECONDS)) )); + + // If packet added at the head, then clock needs to re-evaluate wait time. + if ( p_prev == &head ) SetEvent( m_ev ); + + return Result; +} + +void CAMSchedule::Delete( __inout CAdvisePacket * pPacket ) +{ + if ( m_dwCacheCount >= dwCacheMax ) delete pPacket; + else + { + m_Serialize.Lock(); + pPacket->m_next = m_pAdviseCache; + m_pAdviseCache = pPacket; + ++m_dwCacheCount; + m_Serialize.Unlock(); + } +} + + +// Takes the head of the list & repositions it +void CAMSchedule::ShuntHead() +{ + CAdvisePacket * p_prev = &head; + CAdvisePacket * p_n; + + m_Serialize.Lock(); + CAdvisePacket *const pPacket = head.m_next; + + // This will catch both an empty list, + // and if somehow a MAX_TIME time gets into the list + // (which would also break this method). + ASSERT( pPacket->m_rtEventTime < MAX_TIME ); + + // This relies on the fact that z is a sentry with a maximal m_rtEventTime + for(;;p_prev = p_n) + { + p_n = p_prev->m_next; + if ( p_n->m_rtEventTime > pPacket->m_rtEventTime ) break; + } + // If p_prev == pPacket then we're already in the right place + if (p_prev != pPacket) + { + head.m_next = pPacket->m_next; + (p_prev->m_next = pPacket)->m_next = p_n; + } + #ifdef DEBUG + DbgLog((LOG_TIMING, 2, TEXT("Periodic advise %lu, shunted to %lu"), + pPacket->m_dwAdviseCookie, (pPacket->m_rtEventTime / (UNITS / MILLISECONDS)) )); + #endif + m_Serialize.Unlock(); +} + + +#ifdef DEBUG +void CAMSchedule::DumpLinkedList() +{ + m_Serialize.Lock(); + int i=0; + DbgLog((LOG_TIMING, 1, TEXT("CAMSchedule::DumpLinkedList() this = 0x%p"), this)); + for ( CAdvisePacket * p = &head + ; p + ; p = p->m_next , i++ + ) + { + DbgLog((LOG_TIMING, 1, TEXT("Advise List # %lu, Cookie %d, RefTime %lu"), + i, + p->m_dwAdviseCookie, + p->m_rtEventTime / (UNITS / MILLISECONDS) + )); + } + m_Serialize.Unlock(); +} +#endif
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/schedule.h
Added
@@ -0,0 +1,128 @@ +//------------------------------------------------------------------------------ +// File: Schedule.h +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1996-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __CAMSchedule__ +#define __CAMSchedule__ + +class CAMSchedule : private CBaseObject +{ +public: + virtual ~CAMSchedule(); + // ev is the event we should fire if the advise time needs re-evaluating + CAMSchedule( HANDLE ev ); + + DWORD GetAdviseCount(); + REFERENCE_TIME GetNextAdviseTime(); + + // We need a method for derived classes to add advise packets, we return the cookie + DWORD_PTR AddAdvisePacket( const REFERENCE_TIME & time1, const REFERENCE_TIME & time2, HANDLE h, BOOL periodic ); + // And a way to cancel + HRESULT Unadvise(DWORD_PTR dwAdviseCookie); + + // Tell us the time please, and we'll dispatch the expired events. We return the time of the next event. + // NB: The time returned will be "useless" if you start adding extra Advises. But that's the problem of + // whoever is using this helper class (typically a clock). + REFERENCE_TIME Advise( const REFERENCE_TIME & rtTime ); + + // Get the event handle which will be set if advise time requires re-evaluation. + HANDLE GetEvent() const { return m_ev; } + +private: + // We define the nodes that will be used in our singly linked list + // of advise packets. The list is ordered by time, with the + // elements that will expire first at the front. + class CAdvisePacket + { + public: + CAdvisePacket() + {} + + CAdvisePacket * m_next; + DWORD_PTR m_dwAdviseCookie; + REFERENCE_TIME m_rtEventTime; // Time at which event should be set + REFERENCE_TIME m_rtPeriod; // Periodic time + HANDLE m_hNotify; // Handle to event or semephore + BOOL m_bPeriodic; // TRUE => Periodic event + + CAdvisePacket( __inout_opt CAdvisePacket * next, LONGLONG time ) : m_next(next), m_rtEventTime(time) + {} + + void InsertAfter( __inout CAdvisePacket * p ) + { + p->m_next = m_next; + m_next = p; + } + + int IsZ() const // That is, is it the node that represents the end of the list + { return m_next == 0; } + + CAdvisePacket * RemoveNext() + { + CAdvisePacket *const next = m_next; + CAdvisePacket *const new_next = next->m_next; + m_next = new_next; + return next; + } + + void DeleteNext() + { + delete RemoveNext(); + } + + CAdvisePacket * Next() const + { + CAdvisePacket * result = m_next; + if (result->IsZ()) result = 0; + return result; + } + + DWORD_PTR Cookie() const + { return m_dwAdviseCookie; } + }; + + // Structure is: + // head -> elmt1 -> elmt2 -> z -> null + // So an empty list is: head -> z -> null + // Having head & z as links makes insertaion, + // deletion and shunting much easier. + CAdvisePacket head, z; // z is both a tail and a sentry + + volatile DWORD_PTR m_dwNextCookie; // Strictly increasing + volatile DWORD m_dwAdviseCount; // Number of elements on list + + CCritSec m_Serialize; + + // AddAdvisePacket: adds the packet, returns the cookie (0 if failed) + DWORD_PTR AddAdvisePacket( __inout CAdvisePacket * pPacket ); + // Event that we should set if the packed added above will be the next to fire. + const HANDLE m_ev; + + // A Shunt is where we have changed the first element in the + // list and want it re-evaluating (i.e. repositioned) in + // the list. + void ShuntHead(); + + // Rather than delete advise packets, we cache them for future use + CAdvisePacket * m_pAdviseCache; + DWORD m_dwCacheCount; + enum { dwCacheMax = 5 }; // Don't bother caching more than five + + void Delete( __inout CAdvisePacket * pLink );// This "Delete" will cache the Link + +// Attributes and methods for debugging +public: +#ifdef DEBUG + void DumpLinkedList(); +#else + void DumpLinkedList() {} +#endif + +}; + +#endif // __CAMSchedule__
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/seekpt.cpp
Added
@@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// File: SeekPT.cpp +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include "seekpt.h" + +//================================================================== +// CreateInstance +// This goes in the factory template table to create new instances +// If there is already a mapper instance - return that, else make one +// and save it in a static variable so that forever after we can return that. +//================================================================== + +CUnknown * CSeekingPassThru::CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr) +{ + return new CSeekingPassThru(NAME("Seeking PassThru"),pUnk, phr); +} + + +STDMETHODIMP CSeekingPassThru::NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv) +{ + if (riid == IID_ISeekingPassThru) { + return GetInterface((ISeekingPassThru *) this, ppv); + } else { + if (m_pPosPassThru && + (riid == IID_IMediaSeeking || + riid == IID_IMediaPosition)) { + return m_pPosPassThru->NonDelegatingQueryInterface(riid,ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid, ppv); + } + } +} + + +CSeekingPassThru::CSeekingPassThru( __in_opt LPCTSTR pName, __inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr ) + : CUnknown(pName, pUnk, phr), + m_pPosPassThru(NULL) +{ +} + + +CSeekingPassThru::~CSeekingPassThru() +{ + delete m_pPosPassThru; +} + +STDMETHODIMP CSeekingPassThru::Init(BOOL bRendererSeeking, IPin *pPin) +{ + HRESULT hr = NOERROR; + if (m_pPosPassThru) { + hr = E_FAIL; + } else { + m_pPosPassThru = + bRendererSeeking ? + new CRendererPosPassThru( + NAME("Render Seeking COM object"), + (IUnknown *)this, + &hr, + pPin) : + new CPosPassThru( + NAME("Render Seeking COM object"), + (IUnknown *)this, + &hr, + pPin); + if (!m_pPosPassThru) { + hr = E_OUTOFMEMORY; + } else { + if (FAILED(hr)) { + delete m_pPosPassThru; + m_pPosPassThru = NULL; + } + } + } + return hr; +} +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/seekpt.h
Added
@@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// File: SeekPT.h +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __seekpt_h__ +#define __seekpt_h__ + + +class CSeekingPassThru : public ISeekingPassThru, public CUnknown +{ +public: + static CUnknown *CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr); + CSeekingPassThru(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr); + ~CSeekingPassThru(); + + DECLARE_IUNKNOWN; + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv); + + STDMETHODIMP Init(BOOL bSupportRendering, IPin *pPin); + +private: + CPosPassThru *m_pPosPassThru; +}; + +#endif
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/source.cpp
Added
@@ -0,0 +1,522 @@ +//------------------------------------------------------------------------------ +// File: Source.cpp +// +// Desc: DirectShow base classes - implements CSource, which is a Quartz +// source filter 'template.' +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// Locking Strategy. +// +// Hold the filter critical section (m_pFilter->pStateLock()) to serialise +// access to functions. Note that, in general, this lock may be held +// by a function when the worker thread may want to hold it. Therefore +// if you wish to access shared state from the worker thread you will +// need to add another critical section object. The execption is during +// the threads processing loop, when it is safe to get the filter critical +// section from within FillBuffer(). + +#include <streams.h> + + +// +// CSource::Constructor +// +// Initialise the pin count for the filter. The user will create the pins in +// the derived class. +CSource::CSource(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid) + : CBaseFilter(pName, lpunk, &m_cStateLock, clsid), + m_iPins(0), + m_paStreams(NULL) +{ +} + +CSource::CSource(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid, __inout HRESULT *phr) + : CBaseFilter(pName, lpunk, &m_cStateLock, clsid), + m_iPins(0), + m_paStreams(NULL) +{ + UNREFERENCED_PARAMETER(phr); +} + +#ifdef UNICODE +CSource::CSource(__in_opt LPCSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid) + : CBaseFilter(pName, lpunk, &m_cStateLock, clsid), + m_iPins(0), + m_paStreams(NULL) +{ +} + +CSource::CSource(__in_opt LPCSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid, __inout HRESULT *phr) + : CBaseFilter(pName, lpunk, &m_cStateLock, clsid), + m_iPins(0), + m_paStreams(NULL) +{ + UNREFERENCED_PARAMETER(phr); +} +#endif + +// +// CSource::Destructor +// +CSource::~CSource() +{ + /* Free our pins and pin array */ + while (m_iPins != 0) { + // deleting the pins causes them to be removed from the array... + delete m_paStreamsm_iPins - 1; + } + + ASSERT(m_paStreams == NULL); +} + + +// +// Add a new pin +// +HRESULT CSource::AddPin(__in CSourceStream *pStream) +{ + CAutoLock lock(&m_cStateLock); + + /* Allocate space for this pin and the old ones */ + CSourceStream **paStreams = new CSourceStream *m_iPins + 1; + if (paStreams == NULL) { + return E_OUTOFMEMORY; + } + if (m_paStreams != NULL) { + CopyMemory((PVOID)paStreams, (PVOID)m_paStreams, + m_iPins * sizeof(m_paStreams0)); + paStreamsm_iPins = pStream; + delete m_paStreams; + } + m_paStreams = paStreams; + m_paStreamsm_iPins = pStream; + m_iPins++; + return S_OK; +} + +// +// Remove a pin - pStream is NOT deleted +// +HRESULT CSource::RemovePin(__in CSourceStream *pStream) +{ + int i; + for (i = 0; i < m_iPins; i++) { + if (m_paStreamsi == pStream) { + if (m_iPins == 1) { + delete m_paStreams; + m_paStreams = NULL; + } else { + /* no need to reallocate */ + while (++i < m_iPins) + m_paStreamsi - 1 = m_paStreamsi; + } + m_iPins--; + return S_OK; + } + } + return S_FALSE; +} + +// +// FindPin +// +// Set *ppPin to the IPin* that has the id Id. +// or to NULL if the Id cannot be matched. +STDMETHODIMP CSource::FindPin(LPCWSTR Id, __deref_out IPin **ppPin) +{ + CheckPointer(ppPin,E_POINTER); + ValidateReadWritePtr(ppPin,sizeof(IPin *)); + // The -1 undoes the +1 in QueryId and ensures that totally invalid + // strings (for which WstrToInt delivers 0) give a deliver a NULL pin. + int i = WstrToInt(Id) -1; + *ppPin = GetPin(i); + if (*ppPin!=NULL){ + (*ppPin)->AddRef(); + return NOERROR; + } else { + return VFW_E_NOT_FOUND; + } +} + +// +// FindPinNumber +// +// return the number of the pin with this IPin* or -1 if none +int CSource::FindPinNumber(__in IPin *iPin) { + int i; + for (i=0; i<m_iPins; ++i) { + if ((IPin *)(m_paStreamsi)==iPin) { + return i; + } + } + return -1; +} + +// +// GetPinCount +// +// Returns the number of pins this filter has +int CSource::GetPinCount(void) { + + CAutoLock lock(&m_cStateLock); + return m_iPins; +} + + +// +// GetPin +// +// Return a non-addref'd pointer to pin n +// needed by CBaseFilter +CBasePin *CSource::GetPin(int n) { + + CAutoLock lock(&m_cStateLock); + + // n must be in the range 0..m_iPins-1 + // if m_iPins>n && n>=0 it follows that m_iPins>0 + // which is what used to be checked (i.e. checking that we have a pin) + if ((n >= 0) && (n < m_iPins)) { + + ASSERT(m_paStreamsn); + return m_paStreamsn; + } + return NULL; +} + + +// + + +// * +// * --- CSourceStream ---- +// * + +// +// Set Id to point to a CoTaskMemAlloc'd +STDMETHODIMP CSourceStream::QueryId(__deref_out LPWSTR *Id) { + CheckPointer(Id,E_POINTER); + ValidateReadWritePtr(Id,sizeof(LPWSTR)); + + // We give the pins id's which are 1,2,... + // FindPinNumber returns -1 for an invalid pin + int i = 1+ m_pFilter->FindPinNumber(this); + if (i<1) return VFW_E_NOT_FOUND; + *Id = (LPWSTR)CoTaskMemAlloc(sizeof(WCHAR) * 12); + if (*Id==NULL) { + return E_OUTOFMEMORY; + } + IntToWstr(i, *Id); + return NOERROR; +} + + + +// +// CSourceStream::Constructor +// +// increments the number of pins present on the filter +CSourceStream::CSourceStream( + __in_opt LPCTSTR pObjectName, + __inout HRESULT *phr, + __inout CSource *ps, + __in_opt LPCWSTR pPinName) + : CBaseOutputPin(pObjectName, ps, ps->pStateLock(), phr, pPinName), + m_pFilter(ps) { + + *phr = m_pFilter->AddPin(this); +} + +#ifdef UNICODE +CSourceStream::CSourceStream( + __in_opt LPCSTR pObjectName, + __inout HRESULT *phr, + __inout CSource *ps, + __in_opt LPCWSTR pPinName) + : CBaseOutputPin(pObjectName, ps, ps->pStateLock(), phr, pPinName), + m_pFilter(ps) { + + *phr = m_pFilter->AddPin(this); +} +#endif +// +// CSourceStream::Destructor +// +// Decrements the number of pins on this filter +CSourceStream::~CSourceStream(void) { + + m_pFilter->RemovePin(this); +} + + +// +// CheckMediaType +// +// Do we support this type? Provides the default support for 1 type. +HRESULT CSourceStream::CheckMediaType(const CMediaType *pMediaType) { + + CAutoLock lock(m_pFilter->pStateLock()); + + CMediaType mt; + GetMediaType(&mt); + + if (mt == *pMediaType) { + return NOERROR; + } + + return E_FAIL; +} + + +// +// GetMediaType/3 +// +// By default we support only one type +// iPosition indexes are 0-n +HRESULT CSourceStream::GetMediaType(int iPosition, __inout CMediaType *pMediaType) { + + CAutoLock lock(m_pFilter->pStateLock()); + + if (iPosition<0) { + return E_INVALIDARG; + } + if (iPosition>0) { + return VFW_S_NO_MORE_ITEMS; + } + return GetMediaType(pMediaType); +} + + +// +// Active +// +// The pin is active - start up the worker thread +HRESULT CSourceStream::Active(void) { + + CAutoLock lock(m_pFilter->pStateLock()); + + HRESULT hr; + + if (m_pFilter->IsActive()) { + return S_FALSE; // succeeded, but did not allocate resources (they already exist...) + } + + // do nothing if not connected - its ok not to connect to + // all pins of a source filter + if (!IsConnected()) { + return NOERROR; + } + + hr = CBaseOutputPin::Active(); + if (FAILED(hr)) { + return hr; + } + + ASSERT(!ThreadExists()); + + // start the thread + if (!Create()) { + return E_FAIL; + } + + // Tell thread to initialize. If OnThreadCreate Fails, so does this. + hr = Init(); + if (FAILED(hr)) + return hr; + + return Pause(); +} + + +// +// Inactive +// +// Pin is inactive - shut down the worker thread +// Waits for the worker to exit before returning. +HRESULT CSourceStream::Inactive(void) { + + CAutoLock lock(m_pFilter->pStateLock()); + + HRESULT hr; + + // do nothing if not connected - its ok not to connect to + // all pins of a source filter + if (!IsConnected()) { + return NOERROR; + } + + // !!! need to do this before trying to stop the thread, because + // we may be stuck waiting for our own allocator!!! + + hr = CBaseOutputPin::Inactive(); // call this first to Decommit the allocator + if (FAILED(hr)) { + return hr; + } + + if (ThreadExists()) { + hr = Stop(); + + if (FAILED(hr)) { + return hr; + } + + hr = Exit(); + if (FAILED(hr)) { + return hr; + } + + Close(); // Wait for the thread to exit, then tidy up. + } + + // hr = CBaseOutputPin::Inactive(); // call this first to Decommit the allocator + //if (FAILED(hr)) { + // return hr; + //} + + return NOERROR; +} + + +// +// ThreadProc +// +// When this returns the thread exits +// Return codes > 0 indicate an error occured +DWORD CSourceStream::ThreadProc(void) { + + HRESULT hr; // the return code from calls + Command com; + + do { + com = GetRequest(); + if (com != CMD_INIT) { + DbgLog((LOG_ERROR, 1, TEXT("Thread expected init command"))); + Reply((DWORD) E_UNEXPECTED); + } + } while (com != CMD_INIT); + + DbgLog((LOG_TRACE, 1, TEXT("CSourceStream worker thread initializing"))); + + hr = OnThreadCreate(); // perform set up tasks + if (FAILED(hr)) { + DbgLog((LOG_ERROR, 1, TEXT("CSourceStream::OnThreadCreate failed. Aborting thread."))); + OnThreadDestroy(); + Reply(hr); // send failed return code from OnThreadCreate + return 1; + } + + // Initialisation suceeded + Reply(NOERROR); + + Command cmd; + do { + cmd = GetRequest(); + + switch (cmd) { + + case CMD_EXIT: + Reply(NOERROR); + break; + + case CMD_RUN: + DbgLog((LOG_ERROR, 1, TEXT("CMD_RUN received before a CMD_PAUSE???"))); + // !!! fall through??? + + case CMD_PAUSE: + Reply(NOERROR); + DoBufferProcessingLoop(); + break; + + case CMD_STOP: + Reply(NOERROR); + break; + + default: + DbgLog((LOG_ERROR, 1, TEXT("Unknown command %d received!"), cmd)); + Reply((DWORD) E_NOTIMPL); + break; + } + } while (cmd != CMD_EXIT); + + hr = OnThreadDestroy(); // tidy up. + if (FAILED(hr)) { + DbgLog((LOG_ERROR, 1, TEXT("CSourceStream::OnThreadDestroy failed. Exiting thread."))); + return 1; + } + + DbgLog((LOG_TRACE, 1, TEXT("CSourceStream worker thread exiting"))); + return 0; +} + + +// +// DoBufferProcessingLoop +// +// Grabs a buffer and calls the users processing function. +// Overridable, so that different delivery styles can be catered for. +HRESULT CSourceStream::DoBufferProcessingLoop(void) { + + Command com; + + OnThreadStartPlay(); + + do { + while (!CheckRequest(&com)) { + + IMediaSample *pSample; + + HRESULT hr = GetDeliveryBuffer(&pSample,NULL,NULL,0); + if (FAILED(hr)) { + Sleep(1); + continue; // go round again. Perhaps the error will go away + // or the allocator is decommited & we will be asked to + // exit soon. + } + + // Virtual function user will override. + hr = FillBuffer(pSample); + + if (hr == S_OK) { + hr = Deliver(pSample); + pSample->Release(); + + // downstream filter returns S_FALSE if it wants us to + // stop or an error if it's reporting an error. + if(hr != S_OK) + { + DbgLog((LOG_TRACE, 2, TEXT("Deliver() returned %08x; stopping"), hr)); + return S_OK; + } + + } else if (hr == S_FALSE) { + // derived class wants us to stop pushing data + pSample->Release(); + DeliverEndOfStream(); + return S_OK; + } else { + // derived class encountered an error + pSample->Release(); + DbgLog((LOG_ERROR, 1, TEXT("Error %08lX from FillBuffer!!!"), hr)); + DeliverEndOfStream(); + m_pFilter->NotifyEvent(EC_ERRORABORT, hr, 0); + return hr; + } + + // all paths release the sample + } + + // For all commands sent to us there must be a Reply call! + + if (com == CMD_RUN || com == CMD_PAUSE) { + Reply(NOERROR); + } else if (com != CMD_STOP) { + Reply((DWORD) E_UNEXPECTED); + DbgLog((LOG_ERROR, 1, TEXT("Unexpected command!!!"))); + } + } while (com != CMD_STOP); + + return S_FALSE; +} +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/source.h
Added
@@ -0,0 +1,172 @@ +//------------------------------------------------------------------------------ +// File: Source.h +// +// Desc: DirectShow base classes - defines classes to simplify creation of +// ActiveX source filters that support continuous generation of data. +// No support is provided for IMediaControl or IMediaPosition. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// +// Derive your source filter from CSource. +// During construction either: +// Create some CSourceStream objects to manage your pins +// Provide the user with a means of doing so eg, an IPersistFile interface. +// +// CSource provides: +// IBaseFilter interface management +// IMediaFilter interface management, via CBaseFilter +// Pin counting for CBaseFilter +// +// Derive a class from CSourceStream to manage your output pin types +// Implement GetMediaType/1 to return the type you support. If you support multiple +// types then overide GetMediaType/3, CheckMediaType and GetMediaTypeCount. +// Implement Fillbuffer() to put data into one buffer. +// +// CSourceStream provides: +// IPin management via CBaseOutputPin +// Worker thread management + +#ifndef __CSOURCE__ +#define __CSOURCE__ + +class CSourceStream; // The class that will handle each pin + + +// +// CSource +// +// Override construction to provide a means of creating +// CSourceStream derived objects - ie a way of creating pins. +class CSource : public CBaseFilter { +public: + + CSource(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid, __inout HRESULT *phr); + CSource(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid); +#ifdef UNICODE + CSource(__in_opt LPCSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid, __inout HRESULT *phr); + CSource(__in_opt LPCSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid); +#endif + ~CSource(); + + int GetPinCount(void); + CBasePin *GetPin(int n); + + // -- Utilities -- + + CCritSec* pStateLock(void) { return &m_cStateLock; } // provide our critical section + + HRESULT AddPin(__in CSourceStream *); + HRESULT RemovePin(__in CSourceStream *); + + STDMETHODIMP FindPin( + LPCWSTR Id, + __deref_out IPin ** ppPin + ); + + int FindPinNumber(__in IPin *iPin); + +protected: + + int m_iPins; // The number of pins on this filter. Updated by CSourceStream + // constructors & destructors. + CSourceStream **m_paStreams; // the pins on this filter. + + CCritSec m_cStateLock; // Lock this to serialize function accesses to the filter state + +}; + + +// +// CSourceStream +// +// Use this class to manage a stream of data that comes from a +// pin. +// Uses a worker thread to put data on the pin. +class CSourceStream : public CAMThread, public CBaseOutputPin { +public: + + CSourceStream(__in_opt LPCTSTR pObjectName, + __inout HRESULT *phr, + __inout CSource *pms, + __in_opt LPCWSTR pName); +#ifdef UNICODE + CSourceStream(__in_opt LPCSTR pObjectName, + __inout HRESULT *phr, + __inout CSource *pms, + __in_opt LPCWSTR pName); +#endif + virtual ~CSourceStream(void); // virtual destructor ensures derived class destructors are called too. + +protected: + + CSource *m_pFilter; // The parent of this stream + + // * + // * Data Source + // * + // * The following three functions: FillBuffer, OnThreadCreate/Destroy, are + // * called from within the ThreadProc. They are used in the creation of + // * the media samples this pin will provide + // * + + // Override this to provide the worker thread a means + // of processing a buffer + virtual HRESULT FillBuffer(IMediaSample *pSamp) PURE; + + // Called as the thread is created/destroyed - use to perform + // jobs such as start/stop streaming mode + // If OnThreadCreate returns an error the thread will exit. + virtual HRESULT OnThreadCreate(void) {return NOERROR;}; + virtual HRESULT OnThreadDestroy(void) {return NOERROR;}; + virtual HRESULT OnThreadStartPlay(void) {return NOERROR;}; + + // * + // * Worker Thread + // * + + HRESULT Active(void); // Starts up the worker thread + HRESULT Inactive(void); // Exits the worker thread. + +public: + // thread commands + enum Command {CMD_INIT, CMD_PAUSE, CMD_RUN, CMD_STOP, CMD_EXIT}; + HRESULT Init(void) { return CallWorker(CMD_INIT); } + HRESULT Exit(void) { return CallWorker(CMD_EXIT); } + HRESULT Run(void) { return CallWorker(CMD_RUN); } + HRESULT Pause(void) { return CallWorker(CMD_PAUSE); } + HRESULT Stop(void) { return CallWorker(CMD_STOP); } + +protected: + Command GetRequest(void) { return (Command) CAMThread::GetRequest(); } + BOOL CheckRequest(Command *pCom) { return CAMThread::CheckRequest( (DWORD *) pCom); } + + // override these if you want to add thread commands + virtual DWORD ThreadProc(void); // the thread function + + virtual HRESULT DoBufferProcessingLoop(void); // the loop executed whilst running + + + // * + // * AM_MEDIA_TYPE support + // * + + // If you support more than one media type then override these 2 functions + virtual HRESULT CheckMediaType(const CMediaType *pMediaType); + virtual HRESULT GetMediaType(int iPosition, __inout CMediaType *pMediaType); // List pos. 0-n + + // If you support only one type then override this fn. + // This will only be called by the default implementations + // of CheckMediaType and GetMediaType(int, CMediaType*) + // You must override this fn. or the above 2! + virtual HRESULT GetMediaType(__inout CMediaType *pMediaType) {return E_UNEXPECTED;} + + STDMETHODIMP QueryId( + __deref_out LPWSTR * Id + ); +}; + +#endif // __CSOURCE__ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/streams.h
Added
@@ -0,0 +1,202 @@ +//------------------------------------------------------------------------------ +// File: Streams.h +// +// Desc: DirectShow base classes - defines overall streams architecture. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __STREAMS__ +#define __STREAMS__ + +#ifdef _MSC_VER +// disable some level-4 warnings, use #pragma warning(enable:###) to re-enable +#pragma warning(disable:4100) // warning C4100: unreferenced formal parameter +#pragma warning(disable:4201) // warning C4201: nonstandard extension used : nameless struct/union +#pragma warning(disable:4511) // warning C4511: copy constructor could not be generated +#pragma warning(disable:4512) // warning C4512: assignment operator could not be generated +#pragma warning(disable:4514) // warning C4514: "unreferenced inline function has been removed" + +#if _MSC_VER>=1100 +#define AM_NOVTABLE __declspec(novtable) +#else +#define AM_NOVTABLE +#endif +#endif // MSC_VER + + +// Because of differences between Visual C++ and older Microsoft SDKs, +// you may have defined _DEBUG without defining DEBUG. This logic +// ensures that both will be set if Visual C++ sets _DEBUG. +#ifdef _DEBUG +#ifndef DEBUG +#define DEBUG +#endif +#endif + + +#include <windows.h> +#include <windowsx.h> +#include <olectl.h> +#include <ddraw.h> +#include <mmsystem.h> + + +#ifndef NUMELMS +#if _WIN32_WINNT < 0x0600 + #define NUMELMS(aa) (sizeof(aa)/sizeof((aa)0)) +#else + #define NUMELMS(aa) ARRAYSIZE(aa) +#endif +#endif + +/////////////////////////////////////////////////////////////////////////// +// The following definitions come from the Platform SDK and are required if +// the applicaiton is being compiled with the headers from Visual C++ 6.0. +/////////////////////////////////////////////////// //////////////////////// +#ifndef InterlockedExchangePointer + #define InterlockedExchangePointer(Target, Value) \ + (PVOID)InterlockedExchange((PLONG)(Target), (LONG)(Value)) +#endif + +#ifndef _WAVEFORMATEXTENSIBLE_ +#define _WAVEFORMATEXTENSIBLE_ +typedef struct { + WAVEFORMATEX Format; + union { + WORD wValidBitsPerSample; /* bits of precision */ + WORD wSamplesPerBlock; /* valid if wBitsPerSample==0 */ + WORD wReserved; /* If neither applies, set to zero. */ + } Samples; + DWORD dwChannelMask; /* which channels are */ + /* present in stream */ + GUID SubFormat; +} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE; +#endif // !_WAVEFORMATEXTENSIBLE_ + +#if !defined(WAVE_FORMAT_EXTENSIBLE) +#define WAVE_FORMAT_EXTENSIBLE 0xFFFE +#endif // !defined(WAVE_FORMAT_EXTENSIBLE) + +#ifndef GetWindowLongPtr + #define GetWindowLongPtrA GetWindowLongA + #define GetWindowLongPtrW GetWindowLongW + #ifdef UNICODE + #define GetWindowLongPtr GetWindowLongPtrW + #else + #define GetWindowLongPtr GetWindowLongPtrA + #endif // !UNICODE +#endif // !GetWindowLongPtr + +#ifndef SetWindowLongPtr + #define SetWindowLongPtrA SetWindowLongA + #define SetWindowLongPtrW SetWindowLongW + #ifdef UNICODE + #define SetWindowLongPtr SetWindowLongPtrW + #else + #define SetWindowLongPtr SetWindowLongPtrA + #endif // !UNICODE +#endif // !SetWindowLongPtr + +#ifndef GWLP_WNDPROC + #define GWLP_WNDPROC (-4) +#endif +#ifndef GWLP_HINSTANCE + #define GWLP_HINSTANCE (-6) +#endif +#ifndef GWLP_HWNDPARENT + #define GWLP_HWNDPARENT (-8) +#endif +#ifndef GWLP_USERDATA + #define GWLP_USERDATA (-21) +#endif +#ifndef GWLP_ID + #define GWLP_ID (-12) +#endif +#ifndef DWLP_MSGRESULT + #define DWLP_MSGRESULT 0 +#endif +#ifndef DWLP_DLGPROC + #define DWLP_DLGPROC DWLP_MSGRESULT + sizeof(LRESULT) +#endif +#ifndef DWLP_USER + #define DWLP_USER DWLP_DLGPROC + sizeof(DLGPROC) +#endif + + +#pragma warning(push) +#pragma warning(disable: 4312 4244) +// _GetWindowLongPtr +// Templated version of GetWindowLongPtr, to suppress spurious compiler warning. +template <class T> +T _GetWindowLongPtr(HWND hwnd, int nIndex) +{ + return (T)GetWindowLongPtr(hwnd, nIndex); +} + +// _SetWindowLongPtr +// Templated version of SetWindowLongPtr, to suppress spurious compiler warning. +template <class T> +LONG_PTR _SetWindowLongPtr(HWND hwnd, int nIndex, T p) +{ + return SetWindowLongPtr(hwnd, nIndex, (LONG_PTR)p); +} +#pragma warning(pop) + +/////////////////////////////////////////////////////////////////////////// +// End Platform SDK definitions +/////////////////////////////////////////////////////////////////////////// + + +#include <strmif.h> // Generated IDL header file for streams interfaces +#include <intsafe.h> // required by amvideo.h + +#include <reftime.h> // Helper class for REFERENCE_TIME management +#include <wxdebug.h> // Debug support for logging and ASSERTs +#include <amvideo.h> // ActiveMovie video interfaces and definitions +//include amaudio.h explicitly if you need it. it requires the DX SDK. +//#include <amaudio.h> // ActiveMovie audio interfaces and definitions +#include <wxutil.h> // General helper classes for threads etc +#include <combase.h> // Base COM classes to support IUnknown +#include <dllsetup.h> // Filter registration support functions +#include <measure.h> // Performance measurement +#include <comlite.h> // Light weight com function prototypes + +#include <cache.h> // Simple cache container class +#include <wxlist.h> // Non MFC generic list class +#include <msgthrd.h> // CMsgThread +#include <mtype.h> // Helper class for managing media types +#include <fourcc.h> // conversions between FOURCCs and GUIDs +#include <control.h> // generated from control.odl +#include <ctlutil.h> // control interface utility classes +#include <evcode.h> // event code definitions +#include <amfilter.h> // Main streams architecture class hierachy +#include <transfrm.h> // Generic transform filter +#include <transip.h> // Generic transform-in-place filter +#include <uuids.h> // declaration of type GUIDs and well-known clsids +#include <source.h> // Generic source filter +#include <outputq.h> // Output pin queueing +#include <errors.h> // HRESULT status and error definitions +#include <renbase.h> // Base class for writing ActiveX renderers +#include <winutil.h> // Helps with filters that manage windows +#include <winctrl.h> // Implements the IVideoWindow interface +#include <videoctl.h> // Specifically video related classes +#include <refclock.h> // Base clock class +#include <sysclock.h> // System clock +#include <pstream.h> // IPersistStream helper class +#include <vtrans.h> // Video Transform Filter base class +#include <amextra.h> +#include <cprop.h> // Base property page class +#include <strmctl.h> // IAMStreamControl support +#include <edevdefs.h> // External device control interface defines +#include <audevcod.h> // audio filter device error event codes + + + +#else + #ifdef DEBUG + #pragma message("STREAMS.H included TWICE") + #endif +#endif // __STREAMS__ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/strmctl.cpp
Added
@@ -0,0 +1,402 @@ +//------------------------------------------------------------------------------ +// File: StrmCtl.cpp +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1996-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include <strmctl.h> + +CBaseStreamControl::CBaseStreamControl(__inout HRESULT *phr) +: m_StreamState(STREAM_FLOWING) +, m_StreamStateOnStop(STREAM_FLOWING) // means no pending stop +, m_tStartTime(MAX_TIME) +, m_tStopTime(MAX_TIME) +, m_StreamEvent(FALSE, phr) +, m_dwStartCookie(0) +, m_dwStopCookie(0) +, m_pRefClock(NULL) +, m_FilterState(State_Stopped) +, m_bIsFlushing(FALSE) +, m_bStopSendExtra(FALSE) +{} + +CBaseStreamControl::~CBaseStreamControl() +{ + // Make sure we release the clock. + SetSyncSource(NULL); + return; +} + + +STDMETHODIMP CBaseStreamControl::StopAt(const REFERENCE_TIME * ptStop, BOOL bSendExtra, DWORD dwCookie) +{ + CAutoLock lck(&m_CritSec); + m_bStopSendExtra = FALSE; // reset + m_bStopExtraSent = FALSE; + if (ptStop) + { + if (*ptStop == MAX_TIME) + { + DbgLog((LOG_TRACE,2,TEXT("StopAt: Cancel stop"))); + CancelStop(); + // If there's now a command to start in the future, we assume + // they want to be stopped when the graph is first run + if (m_FilterState == State_Stopped && m_tStartTime < MAX_TIME) { + m_StreamState = STREAM_DISCARDING; + DbgLog((LOG_TRACE,2,TEXT("graph will begin by DISCARDING"))); + } + return NOERROR; + } + DbgLog((LOG_TRACE,2,TEXT("StopAt: %dms extra=%d"), + (int)(*ptStop/10000), bSendExtra)); + // if the first command is to stop in the future, then we assume they + // want to be started when the graph is first run + if (m_FilterState == State_Stopped && m_tStartTime > *ptStop) { + m_StreamState = STREAM_FLOWING; + DbgLog((LOG_TRACE,2,TEXT("graph will begin by FLOWING"))); + } + m_bStopSendExtra = bSendExtra; + m_tStopTime = *ptStop; + m_dwStopCookie = dwCookie; + m_StreamStateOnStop = STREAM_DISCARDING; + } + else + { + DbgLog((LOG_TRACE,2,TEXT("StopAt: now"))); + // sending an extra frame when told to stop now would mess people up + m_bStopSendExtra = FALSE; + m_tStopTime = MAX_TIME; + m_dwStopCookie = 0; + m_StreamState = STREAM_DISCARDING; + m_StreamStateOnStop = STREAM_FLOWING; // no pending stop + } + // we might change our mind what to do with a sample we're blocking + m_StreamEvent.Set(); + return NOERROR; +} + +STDMETHODIMP CBaseStreamControl::StartAt +( const REFERENCE_TIME *ptStart, DWORD dwCookie ) +{ + CAutoLock lck(&m_CritSec); + if (ptStart) + { + if (*ptStart == MAX_TIME) + { + DbgLog((LOG_TRACE,2,TEXT("StartAt: Cancel start"))); + CancelStart(); + // If there's now a command to stop in the future, we assume + // they want to be started when the graph is first run + if (m_FilterState == State_Stopped && m_tStopTime < MAX_TIME) { + DbgLog((LOG_TRACE,2,TEXT("graph will begin by FLOWING"))); + m_StreamState = STREAM_FLOWING; + } + return NOERROR; + } + DbgLog((LOG_TRACE,2,TEXT("StartAt: %dms"), (int)(*ptStart/10000))); + // if the first command is to start in the future, then we assume they + // want to be stopped when the graph is first run + if (m_FilterState == State_Stopped && m_tStopTime >= *ptStart) { + DbgLog((LOG_TRACE,2,TEXT("graph will begin by DISCARDING"))); + m_StreamState = STREAM_DISCARDING; + } + m_tStartTime = *ptStart; + m_dwStartCookie = dwCookie; + // if (m_tStopTime == m_tStartTime) CancelStop(); + } + else + { + DbgLog((LOG_TRACE,2,TEXT("StartAt: now"))); + m_tStartTime = MAX_TIME; + m_dwStartCookie = 0; + m_StreamState = STREAM_FLOWING; + } + // we might change our mind what to do with a sample we're blocking + m_StreamEvent.Set(); + return NOERROR; +} + +// Retrieve information about current settings +STDMETHODIMP CBaseStreamControl::GetInfo(__out AM_STREAM_INFO *pInfo) +{ + if (pInfo == NULL) + return E_POINTER; + + pInfo->tStart = m_tStartTime; + pInfo->tStop = m_tStopTime; + pInfo->dwStartCookie = m_dwStartCookie; + pInfo->dwStopCookie = m_dwStopCookie; + pInfo->dwFlags = m_bStopSendExtra ? AM_STREAM_INFO_STOP_SEND_EXTRA : 0; + pInfo->dwFlags |= m_tStartTime == MAX_TIME ? 0 : AM_STREAM_INFO_START_DEFINED; + pInfo->dwFlags |= m_tStopTime == MAX_TIME ? 0 : AM_STREAM_INFO_STOP_DEFINED; + switch (m_StreamState) { + default: + DbgBreak("Invalid stream state"); + case STREAM_FLOWING: + break; + case STREAM_DISCARDING: + pInfo->dwFlags |= AM_STREAM_INFO_DISCARDING; + break; + } + return S_OK; +} + + +void CBaseStreamControl::ExecuteStop() +{ + ASSERT(CritCheckIn(&m_CritSec)); + m_StreamState = m_StreamStateOnStop; + if (m_dwStopCookie && m_pSink) { + DbgLog((LOG_TRACE,2,TEXT("*sending EC_STREAM_CONTROL_STOPPED (%d)"), + m_dwStopCookie)); + m_pSink->Notify(EC_STREAM_CONTROL_STOPPED, (LONG_PTR)this, m_dwStopCookie); + } + CancelStop(); // This will do the tidy up +} + +void CBaseStreamControl::ExecuteStart() +{ + ASSERT(CritCheckIn(&m_CritSec)); + m_StreamState = STREAM_FLOWING; + if (m_dwStartCookie) { + DbgLog((LOG_TRACE,2,TEXT("*sending EC_STREAM_CONTROL_STARTED (%d)"), + m_dwStartCookie)); + m_pSink->Notify(EC_STREAM_CONTROL_STARTED, (LONG_PTR)this, m_dwStartCookie); + } + CancelStart(); // This will do the tidy up +} + +void CBaseStreamControl::CancelStop() +{ + ASSERT(CritCheckIn(&m_CritSec)); + m_tStopTime = MAX_TIME; + m_dwStopCookie = 0; + m_StreamStateOnStop = STREAM_FLOWING; +} + +void CBaseStreamControl::CancelStart() +{ + ASSERT(CritCheckIn(&m_CritSec)); + m_tStartTime = MAX_TIME; + m_dwStartCookie = 0; +} + + +// This guy will return one of the three StreamControlState's. Here's what the caller +// should do for each one: +// +// STREAM_FLOWING: Proceed as usual (render or pass the sample on) +// STREAM_DISCARDING: Calculate the time 'til *pSampleStart and wait that long +// for the event handle (GetStreamEventHandle()). If the +// wait expires, throw the sample away. If the event +// fires, call me back, I've changed my mind. +// I use pSampleStart (not Stop) so that live sources don't +// block for the duration of their samples, since the clock +// will always read approximately pSampleStart when called + + +// All through this code, you'll notice the following rules: +// - When start and stop time are the same, it's as if start was first +// - An event is considered inside the sample when it's >= sample start time +// but < sample stop time +// - if any part of the sample is supposed to be sent, we'll send the whole +// thing since we don't break it into smaller pieces +// - If we skip over a start or stop without doing it, we still signal the event +// and reset ourselves in case somebody's waiting for the event, and to make +// sure we notice that the event is past and should be forgotten +// Here are the 19 cases that have to be handled (x=start o=stop <-->=sample): +// +// 1. xo<--> start then stop +// 2. ox<--> stop then start +// 3. x<o-> start +// 4. o<x-> stop then start +// 5. x<-->o start +// 6. o<-->x stop +// 7. <x->o start +// 8. <o->x no change +// 9. <xo> start +// 10. <ox> stop then start +// 11. <-->xo no change +// 12. <-->ox no change +// 13. x<--> start +// 14. <x-> start +// 15. <-->x no change +// 16. o<--> stop +// 17. <o-> no change +// 18. <-->o no change +// 19. <--> no change + + +enum CBaseStreamControl::StreamControlState CBaseStreamControl::CheckSampleTimes +( __in const REFERENCE_TIME * pSampleStart, __in const REFERENCE_TIME * pSampleStop ) +{ + CAutoLock lck(&m_CritSec); + + ASSERT(!m_bIsFlushing); + ASSERT(pSampleStart && pSampleStop); + + // Don't ask me how I came up with the code below to handle all 19 cases + // - DannyMi + + if (m_tStopTime >= *pSampleStart) + { + if (m_tStartTime >= *pSampleStop) + return m_StreamState; // cases 8 11 12 15 17 18 19 + if (m_tStopTime < m_tStartTime) + ExecuteStop(); // case 10 + ExecuteStart(); // cases 3 5 7 9 13 14 + return m_StreamState; + } + + if (m_tStartTime >= *pSampleStop) + { + ExecuteStop(); // cases 6 16 + return m_StreamState; + } + + if (m_tStartTime <= m_tStopTime) + { + ExecuteStart(); + ExecuteStop(); + return m_StreamState; // case 1 + } + else + { + ExecuteStop(); + ExecuteStart(); + return m_StreamState; // cases 2 4 + } +} + + +enum CBaseStreamControl::StreamControlState CBaseStreamControl::CheckStreamState( IMediaSample * pSample ) +{ + + REFERENCE_TIME rtBufferStart, rtBufferStop; + const BOOL bNoBufferTimes = + pSample == NULL || + FAILED(pSample->GetTime(&rtBufferStart, &rtBufferStop)); + + StreamControlState state; + LONG lWait; + + do + { + // something has to break out of the blocking + if (m_bIsFlushing || m_FilterState == State_Stopped) + return STREAM_DISCARDING; + + if (bNoBufferTimes) { + // Can't do anything until we get a time stamp + state = m_StreamState; + break; + } else { + state = CheckSampleTimes( &rtBufferStart, &rtBufferStop ); + if (state == STREAM_FLOWING) + break; + + // we aren't supposed to send this, but we've been + // told to send one more than we were supposed to + // (and the stop isn't still pending and we're streaming) + if (m_bStopSendExtra && !m_bStopExtraSent && + m_tStopTime == MAX_TIME && + m_FilterState != State_Stopped) { + m_bStopExtraSent = TRUE; + DbgLog((LOG_TRACE,2,TEXT("%d sending an EXTRA frame"), + m_dwStopCookie)); + state = STREAM_FLOWING; + break; + } + } + + // We're in discarding mode + + // If we've no clock, discard as fast as we can + if (!m_pRefClock) { + break; + + // If we're paused, we can't discard in a timely manner because + // there's no such thing as stream times. We must block until + // we run or stop, or we'll end up throwing the whole stream away + // as quickly as possible + } else if (m_FilterState == State_Paused) { + lWait = INFINITE; + + } else { + // wait until it's time for the sample until we say "discard" + // ("discard in a timely fashion") + REFERENCE_TIME rtNow; + EXECUTE_ASSERT(SUCCEEDED(m_pRefClock->GetTime(&rtNow))); + rtNow -= m_tRunStart; // Into relative ref-time + lWait = LONG((rtBufferStart - rtNow)/10000); // 100ns -> ms + if (lWait < 10) break; // Not worth waiting - discard early + } + + } while(WaitForSingleObject(GetStreamEventHandle(), lWait) != WAIT_TIMEOUT); + + return state; +} + + +void CBaseStreamControl::NotifyFilterState( FILTER_STATE new_state, REFERENCE_TIME tStart ) +{ + CAutoLock lck(&m_CritSec); + + // or we will get confused + if (m_FilterState == new_state) + return; + + switch (new_state) + { + case State_Stopped: + + DbgLog((LOG_TRACE,2,TEXT("Filter is STOPPED"))); + + // execute any pending starts and stops in the right order, + // to make sure all notifications get sent, and we end up + // in the right state to begin next time (??? why not?) + + if (m_tStartTime != MAX_TIME && m_tStopTime == MAX_TIME) { + ExecuteStart(); + } else if (m_tStopTime != MAX_TIME && m_tStartTime == MAX_TIME) { + ExecuteStop(); + } else if (m_tStopTime != MAX_TIME && m_tStartTime != MAX_TIME) { + if (m_tStartTime <= m_tStopTime) { + ExecuteStart(); + ExecuteStop(); + } else { + ExecuteStop(); + ExecuteStart(); + } + } + // always start off flowing when the graph starts streaming + // unless told otherwise + m_StreamState = STREAM_FLOWING; + m_FilterState = new_state; + break; + + case State_Running: + + DbgLog((LOG_TRACE,2,TEXT("Filter is RUNNING"))); + + m_tRunStart = tStart; + // fall-through + + default: // case State_Paused: + m_FilterState = new_state; + } + // unblock! + m_StreamEvent.Set(); +} + + +void CBaseStreamControl::Flushing(BOOL bInProgress) +{ + CAutoLock lck(&m_CritSec); + m_bIsFlushing = bInProgress; + m_StreamEvent.Set(); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/strmctl.h
Added
@@ -0,0 +1,157 @@ +//------------------------------------------------------------------------------ +// File: StrmCtl.h +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1996-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __strmctl_h__ +#define __strmctl_h__ + +class CBaseStreamControl : public IAMStreamControl +{ +public: + // Used by the implementation + enum StreamControlState + { STREAM_FLOWING = 0x1000, + STREAM_DISCARDING + }; + +private: + enum StreamControlState m_StreamState; // Current stream state + enum StreamControlState m_StreamStateOnStop; // State after next stop + // (i.e.Blocking or Discarding) + + REFERENCE_TIME m_tStartTime; // MAX_TIME implies none + REFERENCE_TIME m_tStopTime; // MAX_TIME implies none + DWORD m_dwStartCookie; // Cookie for notification to app + DWORD m_dwStopCookie; // Cookie for notification to app + volatile BOOL m_bIsFlushing; // No optimization pls! + volatile BOOL m_bStopSendExtra; // bSendExtra was set + volatile BOOL m_bStopExtraSent; // the extra one was sent + + CCritSec m_CritSec; // CritSec to guard above attributes + + // Event to fire when we can come + // out of blocking, or to come out of waiting + // to discard if we change our minds. + // + CAMEvent m_StreamEvent; + + // All of these methods execute immediately. Helpers for others. + // + void ExecuteStop(); + void ExecuteStart(); + void CancelStop(); + void CancelStart(); + + // Some things we need to be told by our owning filter + // Your pin must also expose IAMStreamControl when QI'd for it! + // + IReferenceClock * m_pRefClock; // Need it to set advises + // Filter must tell us via + // SetSyncSource + IMediaEventSink * m_pSink; // Event sink + // Filter must tell us after it + // creates it in JoinFilterGraph() + FILTER_STATE m_FilterState; // Just need it! + // Filter must tell us via + // NotifyFilterState + REFERENCE_TIME m_tRunStart; // Per the Run call to the filter + + // This guy will return one of the three StreamControlState's. Here's what + // the caller should do for each one: + // + // STREAM_FLOWING: Proceed as usual (render or pass the sample on) + // STREAM_DISCARDING: Calculate the time 'til *pSampleStop and wait + // that long for the event handle + // (GetStreamEventHandle()). If the wait + // expires, throw the sample away. If the event + // fires, call me back - I've changed my mind. + // + enum StreamControlState CheckSampleTimes( __in const REFERENCE_TIME * pSampleStart, + __in const REFERENCE_TIME * pSampleStop ); + +public: + // You don't have to tell us much when we're created, but there are other + // obligations that must be met. See SetSyncSource & NotifyFilterState + // below. + // + CBaseStreamControl(__inout_opt HRESULT *phr = NULL); + ~CBaseStreamControl(); + + // If you want this class to work properly, there are thing you need to + // (keep) telling it. Filters with pins that use this class + // should ensure that they pass through to this method any calls they + // receive on their SetSyncSource. + + // We need a clock to see what time it is. This is for the + // "discard in a timely fashion" logic. If we discard everything as + // quick as possible, a whole 60 minute file could get discarded in the + // first 10 seconds, and if somebody wants to turn streaming on at 30 + // minutes into the file, and they make the call more than a few seconds + // after the graph is run, it may be too late! + // So we hold every sample until it's time has gone, then we discard it. + // The filter should call this when it gets a SetSyncSource + // + void SetSyncSource( IReferenceClock * pRefClock ) + { + CAutoLock lck(&m_CritSec); + if (m_pRefClock) m_pRefClock->Release(); + m_pRefClock = pRefClock; + if (m_pRefClock) m_pRefClock->AddRef(); + } + + // Set event sink for notifications + // The filter should call this in its JoinFilterGraph after it creates the + // IMediaEventSink + // + void SetFilterGraph( IMediaEventSink *pSink ) { + m_pSink = pSink; + } + + // Since we schedule in stream time, we need the tStart and must track the + // state of our owning filter. + // The app should call this ever state change + // + void NotifyFilterState( FILTER_STATE new_state, REFERENCE_TIME tStart = 0 ); + + // Filter should call Flushing(TRUE) in BeginFlush, + // and Flushing(FALSE) in EndFlush. + // + void Flushing( BOOL bInProgress ); + + + // The two main methods of IAMStreamControl + + // Class adds default values suitable for immediate + // muting and unmuting of the stream. + + STDMETHODIMP StopAt( const REFERENCE_TIME * ptStop = NULL, + BOOL bSendExtra = FALSE, + DWORD dwCookie = 0 ); + STDMETHODIMP StartAt( const REFERENCE_TIME * ptStart = NULL, + DWORD dwCookie = 0 ); + STDMETHODIMP GetInfo( __out AM_STREAM_INFO *pInfo); + + // Helper function for pin's receive method. Call this with + // the sample and we'll tell you what to do with it. We'll do a + // WaitForSingleObject within this call if one is required. This is + // a "What should I do with this sample?" kind of call. We'll tell the + // caller to either flow it or discard it. + // If pSample is NULL we evaluate based on the current state + // settings + enum StreamControlState CheckStreamState( IMediaSample * pSample ); + +private: + // These don't require locking, but we are relying on the fact that + // m_StreamState can be retrieved with integrity, and is a snap shot that + // may have just been, or may be just about to be, changed. + HANDLE GetStreamEventHandle() const { return m_StreamEvent; } + enum StreamControlState GetStreamState() const { return m_StreamState; } + BOOL IsStreaming() const { return m_StreamState == STREAM_FLOWING; } +}; + +#endif
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/sysclock.cpp
Added
@@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// File: SysClock.cpp +// +// Desc: DirectShow base classes - implements a system clock based on +// IReferenceClock. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include <limits.h> + + +#ifdef FILTER_DLL + +/* List of class IDs and creator functions for the class factory. This + provides the link between the OLE entry point in the DLL and an object + being created. The class factory will call the static CreateInstance + function when it is asked to create a CLSID_SystemClock object */ + +CFactoryTemplate g_Templates1 = { + {&CLSID_SystemClock, CSystemClock::CreateInstance} +}; + +int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates0); +#endif + +/* This goes in the factory template table to create new instances */ +CUnknown * WINAPI CSystemClock::CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr) +{ + return new CSystemClock(NAME("System reference clock"),pUnk, phr); +} + + +CSystemClock::CSystemClock(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr) : + CBaseReferenceClock(pName, pUnk, phr) +{ +} + +STDMETHODIMP CSystemClock::NonDelegatingQueryInterface( + REFIID riid, + __deref_out void ** ppv) +{ + if (riid == IID_IPersist) + { + return GetInterface(static_cast<IPersist *>(this), ppv); + } + else if (riid == IID_IAMClockAdjust) + { + return GetInterface(static_cast<IAMClockAdjust *>(this), ppv); + } + else + { + return CBaseReferenceClock::NonDelegatingQueryInterface(riid, ppv); + } +} + +/* Return the clock's clsid */ +STDMETHODIMP +CSystemClock::GetClassID(__out CLSID *pClsID) +{ + CheckPointer(pClsID,E_POINTER); + ValidateReadWritePtr(pClsID,sizeof(CLSID)); + *pClsID = CLSID_SystemClock; + return NOERROR; +} + + +STDMETHODIMP +CSystemClock::SetClockDelta(REFERENCE_TIME rtDelta) +{ + return SetTimeDelta(rtDelta); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/sysclock.h
Added
@@ -0,0 +1,39 @@ +//------------------------------------------------------------------------------ +// File: SysClock.h +// +// Desc: DirectShow base classes - defines a system clock implementation of +// IReferenceClock. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __SYSTEMCLOCK__ +#define __SYSTEMCLOCK__ + +// +// Base clock. Uses timeGetTime ONLY +// Uses most of the code in the base reference clock. +// Provides GetTime +// + +class CSystemClock : public CBaseReferenceClock, public IAMClockAdjust, public IPersist +{ +public: + // We must be able to create an instance of ourselves + static CUnknown * WINAPI CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr); + CSystemClock(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr); + + DECLARE_IUNKNOWN + + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv); + + // Yield up our class id so that we can be persisted + // Implement required Ipersist method + STDMETHODIMP GetClassID(__out CLSID *pClsID); + + // IAMClockAdjust methods + STDMETHODIMP SetClockDelta(REFERENCE_TIME rtDelta); +}; //CSystemClock + +#endif /* __SYSTEMCLOCK__ */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/transfrm.cpp
Added
@@ -0,0 +1,1016 @@ +//------------------------------------------------------------------------------ +// File: Transfrm.cpp +// +// Desc: DirectShow base classes - implements class for simple transform +// filters such as video decompressors. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include <measure.h> + + +// ================================================================= +// Implements the CTransformFilter class +// ================================================================= + +CTransformFilter::CTransformFilter(__in_opt LPCTSTR pName, + __inout_opt LPUNKNOWN pUnk, + REFCLSID clsid) : + CBaseFilter(pName,pUnk,&m_csFilter, clsid), + m_pInput(NULL), + m_pOutput(NULL), + m_bEOSDelivered(FALSE), + m_bQualityChanged(FALSE), + m_bSampleSkipped(FALSE) +{ +#ifdef PERF + RegisterPerfId(); +#endif // PERF +} + +#ifdef UNICODE +CTransformFilter::CTransformFilter(__in_opt LPCSTR pName, + __inout_opt LPUNKNOWN pUnk, + REFCLSID clsid) : + CBaseFilter(pName,pUnk,&m_csFilter, clsid), + m_pInput(NULL), + m_pOutput(NULL), + m_bEOSDelivered(FALSE), + m_bQualityChanged(FALSE), + m_bSampleSkipped(FALSE) +{ +#ifdef PERF + RegisterPerfId(); +#endif // PERF +} +#endif + +// destructor + +CTransformFilter::~CTransformFilter() +{ + // Delete the pins + + delete m_pInput; + delete m_pOutput; +} + + +// Transform place holder - should never be called +HRESULT CTransformFilter::Transform(IMediaSample * pIn, IMediaSample *pOut) +{ + UNREFERENCED_PARAMETER(pIn); + UNREFERENCED_PARAMETER(pOut); + DbgBreak("CTransformFilter::Transform() should never be called"); + return E_UNEXPECTED; +} + + +// return the number of pins we provide + +int CTransformFilter::GetPinCount() +{ + return 2; +} + + +// return a non-addrefed CBasePin * for the user to addref if he holds onto it +// for longer than his pointer to us. We create the pins dynamically when they +// are asked for rather than in the constructor. This is because we want to +// give the derived class an oppportunity to return different pin objects + +// We return the objects as and when they are needed. If either of these fails +// then we return NULL, the assumption being that the caller will realise the +// whole deal is off and destroy us - which in turn will delete everything. + +CBasePin * +CTransformFilter::GetPin(int n) +{ + HRESULT hr = S_OK; + + // Create an input pin if necessary + + if (m_pInput == NULL) { + + m_pInput = new CTransformInputPin(NAME("Transform input pin"), + this, // Owner filter + &hr, // Result code + L"XForm In"); // Pin name + + + // Can't fail + ASSERT(SUCCEEDED(hr)); + if (m_pInput == NULL) { + return NULL; + } + m_pOutput = (CTransformOutputPin *) + new CTransformOutputPin(NAME("Transform output pin"), + this, // Owner filter + &hr, // Result code + L"XForm Out"); // Pin name + + + // Can't fail + ASSERT(SUCCEEDED(hr)); + if (m_pOutput == NULL) { + delete m_pInput; + m_pInput = NULL; + } + } + + // Return the appropriate pin + + if (n == 0) { + return m_pInput; + } else + if (n == 1) { + return m_pOutput; + } else { + return NULL; + } +} + + +// +// FindPin +// +// If Id is In or Out then return the IPin* for that pin +// creating the pin if need be. Otherwise return NULL with an error. + +STDMETHODIMP CTransformFilter::FindPin(LPCWSTR Id, __deref_out IPin **ppPin) +{ + CheckPointer(ppPin,E_POINTER); + ValidateReadWritePtr(ppPin,sizeof(IPin *)); + + if (0==lstrcmpW(Id,L"In")) { + *ppPin = GetPin(0); + } else if (0==lstrcmpW(Id,L"Out")) { + *ppPin = GetPin(1); + } else { + *ppPin = NULL; + return VFW_E_NOT_FOUND; + } + + HRESULT hr = NOERROR; + // AddRef() returned pointer - but GetPin could fail if memory is low. + if (*ppPin) { + (*ppPin)->AddRef(); + } else { + hr = E_OUTOFMEMORY; // probably. There's no pin anyway. + } + return hr; +} + + +// override these two functions if you want to inform something +// about entry to or exit from streaming state. + +HRESULT +CTransformFilter::StartStreaming() +{ + return NOERROR; +} + + +HRESULT +CTransformFilter::StopStreaming() +{ + return NOERROR; +} + + +// override this to grab extra interfaces on connection + +HRESULT +CTransformFilter::CheckConnect(PIN_DIRECTION dir, IPin *pPin) +{ + UNREFERENCED_PARAMETER(dir); + UNREFERENCED_PARAMETER(pPin); + return NOERROR; +} + + +// place holder to allow derived classes to release any extra interfaces + +HRESULT +CTransformFilter::BreakConnect(PIN_DIRECTION dir) +{ + UNREFERENCED_PARAMETER(dir); + return NOERROR; +} + + +// Let derived classes know about connection completion + +HRESULT +CTransformFilter::CompleteConnect(PIN_DIRECTION direction,IPin *pReceivePin) +{ + UNREFERENCED_PARAMETER(direction); + UNREFERENCED_PARAMETER(pReceivePin); + return NOERROR; +} + + +// override this to know when the media type is really set + +HRESULT +CTransformFilter::SetMediaType(PIN_DIRECTION direction,const CMediaType *pmt) +{ + UNREFERENCED_PARAMETER(direction); + UNREFERENCED_PARAMETER(pmt); + return NOERROR; +} + + +// Set up our output sample +HRESULT +CTransformFilter::InitializeOutputSample(IMediaSample *pSample, __deref_out IMediaSample **ppOutSample) +{ + IMediaSample *pOutSample; + + // default - times are the same + + AM_SAMPLE2_PROPERTIES * const pProps = m_pInput->SampleProps(); + DWORD dwFlags = m_bSampleSkipped ? AM_GBF_PREVFRAMESKIPPED : 0; + + // This will prevent the image renderer from switching us to DirectDraw + // when we can't do it without skipping frames because we're not on a + // keyframe. If it really has to switch us, it still will, but then we + // will have to wait for the next keyframe + if (!(pProps->dwSampleFlags & AM_SAMPLE_SPLICEPOINT)) { + dwFlags |= AM_GBF_NOTASYNCPOINT; + } + + ASSERT(m_pOutput->m_pAllocator != NULL); + HRESULT hr = m_pOutput->m_pAllocator->GetBuffer( + &pOutSample + , pProps->dwSampleFlags & AM_SAMPLE_TIMEVALID ? + &pProps->tStart : NULL + , pProps->dwSampleFlags & AM_SAMPLE_STOPVALID ? + &pProps->tStop : NULL + , dwFlags + ); + *ppOutSample = pOutSample; + if (FAILED(hr)) { + return hr; + } + + ASSERT(pOutSample); + IMediaSample2 *pOutSample2; + if (SUCCEEDED(pOutSample->QueryInterface(IID_IMediaSample2, + (void **)&pOutSample2))) { + /* Modify it */ + AM_SAMPLE2_PROPERTIES OutProps; + EXECUTE_ASSERT(SUCCEEDED(pOutSample2->GetProperties( + FIELD_OFFSET(AM_SAMPLE2_PROPERTIES, tStart), (PBYTE)&OutProps) + )); + OutProps.dwTypeSpecificFlags = pProps->dwTypeSpecificFlags; + OutProps.dwSampleFlags = + (OutProps.dwSampleFlags & AM_SAMPLE_TYPECHANGED) | + (pProps->dwSampleFlags & ~AM_SAMPLE_TYPECHANGED); + OutProps.tStart = pProps->tStart; + OutProps.tStop = pProps->tStop; + OutProps.cbData = FIELD_OFFSET(AM_SAMPLE2_PROPERTIES, dwStreamId); + hr = pOutSample2->SetProperties( + FIELD_OFFSET(AM_SAMPLE2_PROPERTIES, dwStreamId), + (PBYTE)&OutProps + ); + if (pProps->dwSampleFlags & AM_SAMPLE_DATADISCONTINUITY) { + m_bSampleSkipped = FALSE; + } + pOutSample2->Release(); + } else { + if (pProps->dwSampleFlags & AM_SAMPLE_TIMEVALID) { + pOutSample->SetTime(&pProps->tStart, + &pProps->tStop); + } + if (pProps->dwSampleFlags & AM_SAMPLE_SPLICEPOINT) { + pOutSample->SetSyncPoint(TRUE); + } + if (pProps->dwSampleFlags & AM_SAMPLE_DATADISCONTINUITY) { + pOutSample->SetDiscontinuity(TRUE); + m_bSampleSkipped = FALSE; + } + // Copy the media times + + LONGLONG MediaStart, MediaEnd; + if (pSample->GetMediaTime(&MediaStart,&MediaEnd) == NOERROR) { + pOutSample->SetMediaTime(&MediaStart,&MediaEnd); + } + } + return S_OK; +} + +// override this to customize the transform process + +HRESULT +CTransformFilter::Receive(IMediaSample *pSample) +{ + /* Check for other streams and pass them on */ + AM_SAMPLE2_PROPERTIES * const pProps = m_pInput->SampleProps(); + if (pProps->dwStreamId != AM_STREAM_MEDIA) { + return m_pOutput->m_pInputPin->Receive(pSample); + } + HRESULT hr; + ASSERT(pSample); + IMediaSample * pOutSample; + + // If no output to deliver to then no point sending us data + + ASSERT (m_pOutput != NULL) ; + + // Set up the output sample + hr = InitializeOutputSample(pSample, &pOutSample); + + if (FAILED(hr)) { + return hr; + } + + // Start timing the transform (if PERF is defined) + MSR_START(m_idTransform); + + // have the derived class transform the data + + hr = Transform(pSample, pOutSample); + + // Stop the clock and log it (if PERF is defined) + MSR_STOP(m_idTransform); + + if (FAILED(hr)) { + DbgLog((LOG_TRACE,1,TEXT("Error from transform"))); + } else { + // the Transform() function can return S_FALSE to indicate that the + // sample should not be delivered; we only deliver the sample if it's + // really S_OK (same as NOERROR, of course.) + if (hr == NOERROR) { + hr = m_pOutput->m_pInputPin->Receive(pOutSample); + m_bSampleSkipped = FALSE; // last thing no longer dropped + } else { + // S_FALSE returned from Transform is a PRIVATE agreement + // We should return NOERROR from Receive() in this cause because returning S_FALSE + // from Receive() means that this is the end of the stream and no more data should + // be sent. + if (S_FALSE == hr) { + + // Release the sample before calling notify to avoid + // deadlocks if the sample holds a lock on the system + // such as DirectDraw buffers do + pOutSample->Release(); + m_bSampleSkipped = TRUE; + if (!m_bQualityChanged) { + NotifyEvent(EC_QUALITY_CHANGE,0,0); + m_bQualityChanged = TRUE; + } + return NOERROR; + } + } + } + + // release the output buffer. If the connected pin still needs it, + // it will have addrefed it itself. + pOutSample->Release(); + + return hr; +} + + +// Return S_FALSE to mean "pass the note on upstream" +// Return NOERROR (Same as S_OK) +// to mean "I've done something about it, don't pass it on" +HRESULT CTransformFilter::AlterQuality(Quality q) +{ + UNREFERENCED_PARAMETER(q); + return S_FALSE; +} + + +// EndOfStream received. Default behaviour is to deliver straight +// downstream, since we have no queued data. If you overrode Receive +// and have queue data, then you need to handle this and deliver EOS after +// all queued data is sent +HRESULT +CTransformFilter::EndOfStream(void) +{ + HRESULT hr = NOERROR; + if (m_pOutput != NULL) { + hr = m_pOutput->DeliverEndOfStream(); + } + + return hr; +} + + +// enter flush state. Receives already blocked +// must override this if you have queued data or a worker thread +HRESULT +CTransformFilter::BeginFlush(void) +{ + HRESULT hr = NOERROR; + if (m_pOutput != NULL) { + // block receives -- done by caller (CBaseInputPin::BeginFlush) + + // discard queued data -- we have no queued data + + // free anyone blocked on receive - not possible in this filter + + // call downstream + hr = m_pOutput->DeliverBeginFlush(); + } + return hr; +} + + +// leave flush state. must override this if you have queued data +// or a worker thread +HRESULT +CTransformFilter::EndFlush(void) +{ + // sync with pushing thread -- we have no worker thread + + // ensure no more data to go downstream -- we have no queued data + + // call EndFlush on downstream pins + ASSERT (m_pOutput != NULL); + return m_pOutput->DeliverEndFlush(); + + // caller (the input pin's method) will unblock Receives +} + + +// override these so that the derived filter can catch them + +STDMETHODIMP +CTransformFilter::Stop() +{ + CAutoLock lck1(&m_csFilter); + if (m_State == State_Stopped) { + return NOERROR; + } + + // Succeed the Stop if we are not completely connected + + ASSERT(m_pInput == NULL || m_pOutput != NULL); + if (m_pInput == NULL || m_pInput->IsConnected() == FALSE || + m_pOutput->IsConnected() == FALSE) { + m_State = State_Stopped; + m_bEOSDelivered = FALSE; + return NOERROR; + } + + ASSERT(m_pInput); + ASSERT(m_pOutput); + + // decommit the input pin before locking or we can deadlock + m_pInput->Inactive(); + + // synchronize with Receive calls + + CAutoLock lck2(&m_csReceive); + m_pOutput->Inactive(); + + // allow a class derived from CTransformFilter + // to know about starting and stopping streaming + + HRESULT hr = StopStreaming(); + if (SUCCEEDED(hr)) { + // complete the state transition + m_State = State_Stopped; + m_bEOSDelivered = FALSE; + } + return hr; +} + + +STDMETHODIMP +CTransformFilter::Pause() +{ + CAutoLock lck(&m_csFilter); + HRESULT hr = NOERROR; + + if (m_State == State_Paused) { + // (This space left deliberately blank) + } + + // If we have no input pin or it isn't yet connected then when we are + // asked to pause we deliver an end of stream to the downstream filter. + // This makes sure that it doesn't sit there forever waiting for + // samples which we cannot ever deliver without an input connection. + + else if (m_pInput == NULL || m_pInput->IsConnected() == FALSE) { + if (m_pOutput && m_bEOSDelivered == FALSE) { + m_pOutput->DeliverEndOfStream(); + m_bEOSDelivered = TRUE; + } + m_State = State_Paused; + } + + // We may have an input connection but no output connection + // However, if we have an input pin we do have an output pin + + else if (m_pOutput->IsConnected() == FALSE) { + m_State = State_Paused; + } + + else { + if (m_State == State_Stopped) { + // allow a class derived from CTransformFilter + // to know about starting and stopping streaming + CAutoLock lck2(&m_csReceive); + hr = StartStreaming(); + } + if (SUCCEEDED(hr)) { + hr = CBaseFilter::Pause(); + } + } + + m_bSampleSkipped = FALSE; + m_bQualityChanged = FALSE; + return hr; +} + +HRESULT +CTransformFilter::NewSegment( + REFERENCE_TIME tStart, + REFERENCE_TIME tStop, + double dRate) +{ + if (m_pOutput != NULL) { + return m_pOutput->DeliverNewSegment(tStart, tStop, dRate); + } + return S_OK; +} + +// Check streaming status +HRESULT +CTransformInputPin::CheckStreaming() +{ + ASSERT(m_pTransformFilter->m_pOutput != NULL); + if (!m_pTransformFilter->m_pOutput->IsConnected()) { + return VFW_E_NOT_CONNECTED; + } else { + // Shouldn't be able to get any data if we're not connected! + ASSERT(IsConnected()); + + // we're flushing + if (m_bFlushing) { + return S_FALSE; + } + // Don't process stuff in Stopped state + if (IsStopped()) { + return VFW_E_WRONG_STATE; + } + if (m_bRunTimeError) { + return VFW_E_RUNTIME_ERROR; + } + return S_OK; + } +} + + +// ================================================================= +// Implements the CTransformInputPin class +// ================================================================= + + +// constructor + +CTransformInputPin::CTransformInputPin( + __in_opt LPCTSTR pObjectName, + __inout CTransformFilter *pTransformFilter, + __inout HRESULT * phr, + __in_opt LPCWSTR pName) + : CBaseInputPin(pObjectName, pTransformFilter, &pTransformFilter->m_csFilter, phr, pName) +{ + DbgLog((LOG_TRACE,2,TEXT("CTransformInputPin::CTransformInputPin"))); + m_pTransformFilter = pTransformFilter; +} + +#ifdef UNICODE +CTransformInputPin::CTransformInputPin( + __in_opt LPCSTR pObjectName, + __inout CTransformFilter *pTransformFilter, + __inout HRESULT * phr, + __in_opt LPCWSTR pName) + : CBaseInputPin(pObjectName, pTransformFilter, &pTransformFilter->m_csFilter, phr, pName) +{ + DbgLog((LOG_TRACE,2,TEXT("CTransformInputPin::CTransformInputPin"))); + m_pTransformFilter = pTransformFilter; +} +#endif + +// provides derived filter a chance to grab extra interfaces + +HRESULT +CTransformInputPin::CheckConnect(IPin *pPin) +{ + HRESULT hr = m_pTransformFilter->CheckConnect(PINDIR_INPUT,pPin); + if (FAILED(hr)) { + return hr; + } + return CBaseInputPin::CheckConnect(pPin); +} + + +// provides derived filter a chance to release it's extra interfaces + +HRESULT +CTransformInputPin::BreakConnect() +{ + // Can't disconnect unless stopped + ASSERT(IsStopped()); + m_pTransformFilter->BreakConnect(PINDIR_INPUT); + return CBaseInputPin::BreakConnect(); +} + + +// Let derived class know when the input pin is connected + +HRESULT +CTransformInputPin::CompleteConnect(IPin *pReceivePin) +{ + HRESULT hr = m_pTransformFilter->CompleteConnect(PINDIR_INPUT,pReceivePin); + if (FAILED(hr)) { + return hr; + } + return CBaseInputPin::CompleteConnect(pReceivePin); +} + + +// check that we can support a given media type + +HRESULT +CTransformInputPin::CheckMediaType(const CMediaType* pmt) +{ + // Check the input type + + HRESULT hr = m_pTransformFilter->CheckInputType(pmt); + if (S_OK != hr) { + return hr; + } + + // if the output pin is still connected, then we have + // to check the transform not just the input format + + if ((m_pTransformFilter->m_pOutput != NULL) && + (m_pTransformFilter->m_pOutput->IsConnected())) { + return m_pTransformFilter->CheckTransform( + pmt, + &m_pTransformFilter->m_pOutput->CurrentMediaType()); + } else { + return hr; + } +} + + +// set the media type for this connection + +HRESULT +CTransformInputPin::SetMediaType(const CMediaType* mtIn) +{ + // Set the base class media type (should always succeed) + HRESULT hr = CBasePin::SetMediaType(mtIn); + if (FAILED(hr)) { + return hr; + } + + // check the transform can be done (should always succeed) + ASSERT(SUCCEEDED(m_pTransformFilter->CheckInputType(mtIn))); + + return m_pTransformFilter->SetMediaType(PINDIR_INPUT,mtIn); +} + + +// ================================================================= +// Implements IMemInputPin interface +// ================================================================= + + +// provide EndOfStream that passes straight downstream +// (there is no queued data) +STDMETHODIMP +CTransformInputPin::EndOfStream(void) +{ + CAutoLock lck(&m_pTransformFilter->m_csReceive); + HRESULT hr = CheckStreaming(); + if (S_OK == hr) { + hr = m_pTransformFilter->EndOfStream(); + } + return hr; +} + + +// enter flushing state. Call default handler to block Receives, then +// pass to overridable method in filter +STDMETHODIMP +CTransformInputPin::BeginFlush(void) +{ + CAutoLock lck(&m_pTransformFilter->m_csFilter); + // Are we actually doing anything? + ASSERT(m_pTransformFilter->m_pOutput != NULL); + if (!IsConnected() || + !m_pTransformFilter->m_pOutput->IsConnected()) { + return VFW_E_NOT_CONNECTED; + } + HRESULT hr = CBaseInputPin::BeginFlush(); + if (FAILED(hr)) { + return hr; + } + + return m_pTransformFilter->BeginFlush(); +} + + +// leave flushing state. +// Pass to overridable method in filter, then call base class +// to unblock receives (finally) +STDMETHODIMP +CTransformInputPin::EndFlush(void) +{ + CAutoLock lck(&m_pTransformFilter->m_csFilter); + // Are we actually doing anything? + ASSERT(m_pTransformFilter->m_pOutput != NULL); + if (!IsConnected() || + !m_pTransformFilter->m_pOutput->IsConnected()) { + return VFW_E_NOT_CONNECTED; + } + + HRESULT hr = m_pTransformFilter->EndFlush(); + if (FAILED(hr)) { + return hr; + } + + return CBaseInputPin::EndFlush(); +} + + +// here's the next block of data from the stream. +// AddRef it yourself if you need to hold it beyond the end +// of this call. + +HRESULT +CTransformInputPin::Receive(IMediaSample * pSample) +{ + HRESULT hr; + CAutoLock lck(&m_pTransformFilter->m_csReceive); + ASSERT(pSample); + + // check all is well with the base class + hr = CBaseInputPin::Receive(pSample); + if (S_OK == hr) { + hr = m_pTransformFilter->Receive(pSample); + } + return hr; +} + + + + +// override to pass downstream +STDMETHODIMP +CTransformInputPin::NewSegment( + REFERENCE_TIME tStart, + REFERENCE_TIME tStop, + double dRate) +{ + // Save the values in the pin + CBasePin::NewSegment(tStart, tStop, dRate); + return m_pTransformFilter->NewSegment(tStart, tStop, dRate); +} + + + + +// ================================================================= +// Implements the CTransformOutputPin class +// ================================================================= + + +// constructor + +CTransformOutputPin::CTransformOutputPin( + __in_opt LPCTSTR pObjectName, + __inout CTransformFilter *pTransformFilter, + __inout HRESULT * phr, + __in_opt LPCWSTR pPinName) + : CBaseOutputPin(pObjectName, pTransformFilter, &pTransformFilter->m_csFilter, phr, pPinName), + m_pPosition(NULL) +{ + DbgLog((LOG_TRACE,2,TEXT("CTransformOutputPin::CTransformOutputPin"))); + m_pTransformFilter = pTransformFilter; + +} + +#ifdef UNICODE +CTransformOutputPin::CTransformOutputPin( + __in_opt LPCSTR pObjectName, + __inout CTransformFilter *pTransformFilter, + __inout HRESULT * phr, + __in_opt LPCWSTR pPinName) + : CBaseOutputPin(pObjectName, pTransformFilter, &pTransformFilter->m_csFilter, phr, pPinName), + m_pPosition(NULL) +{ + DbgLog((LOG_TRACE,2,TEXT("CTransformOutputPin::CTransformOutputPin"))); + m_pTransformFilter = pTransformFilter; + +} +#endif + +// destructor + +CTransformOutputPin::~CTransformOutputPin() +{ + DbgLog((LOG_TRACE,2,TEXT("CTransformOutputPin::~CTransformOutputPin"))); + + if (m_pPosition) m_pPosition->Release(); +} + + +// overriden to expose IMediaPosition and IMediaSeeking control interfaces + +STDMETHODIMP +CTransformOutputPin::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + CheckPointer(ppv,E_POINTER); + ValidateReadWritePtr(ppv,sizeof(PVOID)); + *ppv = NULL; + + if (riid == IID_IMediaPosition || riid == IID_IMediaSeeking) { + + // we should have an input pin by now + + ASSERT(m_pTransformFilter->m_pInput != NULL); + + if (m_pPosition == NULL) { + + HRESULT hr = CreatePosPassThru( + GetOwner(), + FALSE, + (IPin *)m_pTransformFilter->m_pInput, + &m_pPosition); + if (FAILED(hr)) { + return hr; + } + } + return m_pPosition->QueryInterface(riid, ppv); + } else { + return CBaseOutputPin::NonDelegatingQueryInterface(riid, ppv); + } +} + + +// provides derived filter a chance to grab extra interfaces + +HRESULT +CTransformOutputPin::CheckConnect(IPin *pPin) +{ + // we should have an input connection first + + ASSERT(m_pTransformFilter->m_pInput != NULL); + if ((m_pTransformFilter->m_pInput->IsConnected() == FALSE)) { + return E_UNEXPECTED; + } + + HRESULT hr = m_pTransformFilter->CheckConnect(PINDIR_OUTPUT,pPin); + if (FAILED(hr)) { + return hr; + } + return CBaseOutputPin::CheckConnect(pPin); +} + + +// provides derived filter a chance to release it's extra interfaces + +HRESULT +CTransformOutputPin::BreakConnect() +{ + // Can't disconnect unless stopped + ASSERT(IsStopped()); + m_pTransformFilter->BreakConnect(PINDIR_OUTPUT); + return CBaseOutputPin::BreakConnect(); +} + + +// Let derived class know when the output pin is connected + +HRESULT +CTransformOutputPin::CompleteConnect(IPin *pReceivePin) +{ + HRESULT hr = m_pTransformFilter->CompleteConnect(PINDIR_OUTPUT,pReceivePin); + if (FAILED(hr)) { + return hr; + } + return CBaseOutputPin::CompleteConnect(pReceivePin); +} + + +// check a given transform - must have selected input type first + +HRESULT +CTransformOutputPin::CheckMediaType(const CMediaType* pmtOut) +{ + // must have selected input first + ASSERT(m_pTransformFilter->m_pInput != NULL); + if ((m_pTransformFilter->m_pInput->IsConnected() == FALSE)) { + return E_INVALIDARG; + } + + return m_pTransformFilter->CheckTransform( + &m_pTransformFilter->m_pInput->CurrentMediaType(), + pmtOut); +} + + +// called after we have agreed a media type to actually set it in which case +// we run the CheckTransform function to get the output format type again + +HRESULT +CTransformOutputPin::SetMediaType(const CMediaType* pmtOut) +{ + HRESULT hr = NOERROR; + ASSERT(m_pTransformFilter->m_pInput != NULL); + + ASSERT(m_pTransformFilter->m_pInput->CurrentMediaType().IsValid()); + + // Set the base class media type (should always succeed) + hr = CBasePin::SetMediaType(pmtOut); + if (FAILED(hr)) { + return hr; + } + +#ifdef DEBUG + if (FAILED(m_pTransformFilter->CheckTransform(&m_pTransformFilter-> + m_pInput->CurrentMediaType(),pmtOut))) { + DbgLog((LOG_ERROR,0,TEXT("*** This filter is accepting an output media type"))); + DbgLog((LOG_ERROR,0,TEXT(" that it can't currently transform to. I hope"))); + DbgLog((LOG_ERROR,0,TEXT(" it's smart enough to reconnect its input."))); + } +#endif + + return m_pTransformFilter->SetMediaType(PINDIR_OUTPUT,pmtOut); +} + + +// pass the buffer size decision through to the main transform class + +HRESULT +CTransformOutputPin::DecideBufferSize( + IMemAllocator * pAllocator, + __inout ALLOCATOR_PROPERTIES* pProp) +{ + return m_pTransformFilter->DecideBufferSize(pAllocator, pProp); +} + + + +// return a specific media type indexed by iPosition + +HRESULT +CTransformOutputPin::GetMediaType( + int iPosition, + __inout CMediaType *pMediaType) +{ + ASSERT(m_pTransformFilter->m_pInput != NULL); + + // We don't have any media types if our input is not connected + + if (m_pTransformFilter->m_pInput->IsConnected()) { + return m_pTransformFilter->GetMediaType(iPosition,pMediaType); + } else { + return VFW_S_NO_MORE_ITEMS; + } +} + + +// Override this if you can do something constructive to act on the +// quality message. Consider passing it upstream as well + +// Pass the quality mesage on upstream. + +STDMETHODIMP +CTransformOutputPin::Notify(IBaseFilter * pSender, Quality q) +{ + UNREFERENCED_PARAMETER(pSender); + ValidateReadPtr(pSender,sizeof(IBaseFilter)); + + // First see if we want to handle this ourselves + HRESULT hr = m_pTransformFilter->AlterQuality(q); + if (hr!=S_FALSE) { + return hr; // either S_OK or a failure + } + + // S_FALSE means we pass the message on. + // Find the quality sink for our input pin and send it there + + ASSERT(m_pTransformFilter->m_pInput != NULL); + + return m_pTransformFilter->m_pInput->PassNotify(q); + +} // Notify + + +// the following removes a very large number of level 4 warnings from the microsoft +// compiler output, which are not useful at all in this case. +#pragma warning(disable:4514)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/transfrm.h
Added
@@ -0,0 +1,304 @@ +//------------------------------------------------------------------------------ +// File: Transfrm.h +// +// Desc: DirectShow base classes - defines classes from which simple +// transform codecs may be derived. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// It assumes the codec has one input and one output stream, and has no +// interest in memory management, interface negotiation or anything else. +// +// derive your class from this, and supply Transform and the media type/format +// negotiation functions. Implement that class, compile and link and +// you're done. + + +#ifndef __TRANSFRM__ +#define __TRANSFRM__ + +// ====================================================================== +// This is the com object that represents a simple transform filter. It +// supports IBaseFilter, IMediaFilter and two pins through nested interfaces +// ====================================================================== + +class CTransformFilter; + +// ================================================== +// Implements the input pin +// ================================================== + +class CTransformInputPin : public CBaseInputPin +{ + friend class CTransformFilter; + +protected: + CTransformFilter *m_pTransformFilter; + + +public: + + CTransformInputPin( + __in_opt LPCTSTR pObjectName, + __inout CTransformFilter *pTransformFilter, + __inout HRESULT * phr, + __in_opt LPCWSTR pName); +#ifdef UNICODE + CTransformInputPin( + __in_opt LPCSTR pObjectName, + __inout CTransformFilter *pTransformFilter, + __inout HRESULT * phr, + __in_opt LPCWSTR pName); +#endif + + STDMETHODIMP QueryId(__deref_out LPWSTR * Id) + { + return AMGetWideString(L"In", Id); + } + + // Grab and release extra interfaces if required + + HRESULT CheckConnect(IPin *pPin); + HRESULT BreakConnect(); + HRESULT CompleteConnect(IPin *pReceivePin); + + // check that we can support this output type + HRESULT CheckMediaType(const CMediaType* mtIn); + + // set the connection media type + HRESULT SetMediaType(const CMediaType* mt); + + // --- IMemInputPin ----- + + // here's the next block of data from the stream. + // AddRef it yourself if you need to hold it beyond the end + // of this call. + STDMETHODIMP Receive(IMediaSample * pSample); + + // provide EndOfStream that passes straight downstream + // (there is no queued data) + STDMETHODIMP EndOfStream(void); + + // passes it to CTransformFilter::BeginFlush + STDMETHODIMP BeginFlush(void); + + // passes it to CTransformFilter::EndFlush + STDMETHODIMP EndFlush(void); + + STDMETHODIMP NewSegment( + REFERENCE_TIME tStart, + REFERENCE_TIME tStop, + double dRate); + + // Check if it's OK to process samples + virtual HRESULT CheckStreaming(); + + // Media type +public: + CMediaType& CurrentMediaType() { return m_mt; }; + +}; + +// ================================================== +// Implements the output pin +// ================================================== + +class CTransformOutputPin : public CBaseOutputPin +{ + friend class CTransformFilter; + +protected: + CTransformFilter *m_pTransformFilter; + +public: + + // implement IMediaPosition by passing upstream + IUnknown * m_pPosition; + + CTransformOutputPin( + __in_opt LPCTSTR pObjectName, + __inout CTransformFilter *pTransformFilter, + __inout HRESULT * phr, + __in_opt LPCWSTR pName); +#ifdef UNICODE + CTransformOutputPin( + __in_opt LPCSTR pObjectName, + __inout CTransformFilter *pTransformFilter, + __inout HRESULT * phr, + __in_opt LPCWSTR pName); +#endif + ~CTransformOutputPin(); + + // override to expose IMediaPosition + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv); + + // --- CBaseOutputPin ------------ + + STDMETHODIMP QueryId(__deref_out LPWSTR * Id) + { + return AMGetWideString(L"Out", Id); + } + + // Grab and release extra interfaces if required + + HRESULT CheckConnect(IPin *pPin); + HRESULT BreakConnect(); + HRESULT CompleteConnect(IPin *pReceivePin); + + // check that we can support this output type + HRESULT CheckMediaType(const CMediaType* mtOut); + + // set the connection media type + HRESULT SetMediaType(const CMediaType *pmt); + + // called from CBaseOutputPin during connection to ask for + // the count and size of buffers we need. + HRESULT DecideBufferSize( + IMemAllocator * pAlloc, + __inout ALLOCATOR_PROPERTIES *pProp); + + // returns the preferred formats for a pin + HRESULT GetMediaType(int iPosition, __inout CMediaType *pMediaType); + + // inherited from IQualityControl via CBasePin + STDMETHODIMP Notify(IBaseFilter * pSender, Quality q); + + // Media type +public: + CMediaType& CurrentMediaType() { return m_mt; }; +}; + + +class AM_NOVTABLE CTransformFilter : public CBaseFilter +{ + +public: + + // map getpin/getpincount for base enum of pins to owner + // override this to return more specialised pin objects + + virtual int GetPinCount(); + virtual CBasePin * GetPin(int n); + STDMETHODIMP FindPin(LPCWSTR Id, __deref_out IPin **ppPin); + + // override state changes to allow derived transform filter + // to control streaming start/stop + STDMETHODIMP Stop(); + STDMETHODIMP Pause(); + +public: + + CTransformFilter(__in_opt LPCTSTR , __inout_opt LPUNKNOWN, REFCLSID clsid); +#ifdef UNICODE + CTransformFilter(__in_opt LPCSTR , __inout_opt LPUNKNOWN, REFCLSID clsid); +#endif + ~CTransformFilter(); + + // ================================================================= + // ----- override these bits --------------------------------------- + // ================================================================= + + // These must be supplied in a derived class + + virtual HRESULT Transform(IMediaSample * pIn, IMediaSample *pOut); + + // check if you can support mtIn + virtual HRESULT CheckInputType(const CMediaType* mtIn) PURE; + + // check if you can support the transform from this input to this output + virtual HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut) PURE; + + // this goes in the factory template table to create new instances + // static CCOMObject * CreateInstance(__inout_opt LPUNKNOWN, HRESULT *); + + // call the SetProperties function with appropriate arguments + virtual HRESULT DecideBufferSize( + IMemAllocator * pAllocator, + __inout ALLOCATOR_PROPERTIES *pprop) PURE; + + // override to suggest OUTPUT pin media types + virtual HRESULT GetMediaType(int iPosition, __inout CMediaType *pMediaType) PURE; + + + + // ================================================================= + // ----- Optional Override Methods ----------------------- + // ================================================================= + + // you can also override these if you want to know about streaming + virtual HRESULT StartStreaming(); + virtual HRESULT StopStreaming(); + + // override if you can do anything constructive with quality notifications + virtual HRESULT AlterQuality(Quality q); + + // override this to know when the media type is actually set + virtual HRESULT SetMediaType(PIN_DIRECTION direction,const CMediaType *pmt); + + // chance to grab extra interfaces on connection + virtual HRESULT CheckConnect(PIN_DIRECTION dir,IPin *pPin); + virtual HRESULT BreakConnect(PIN_DIRECTION dir); + virtual HRESULT CompleteConnect(PIN_DIRECTION direction,IPin *pReceivePin); + + // chance to customize the transform process + virtual HRESULT Receive(IMediaSample *pSample); + + // Standard setup for output sample + HRESULT InitializeOutputSample(IMediaSample *pSample, __deref_out IMediaSample **ppOutSample); + + // if you override Receive, you may need to override these three too + virtual HRESULT EndOfStream(void); + virtual HRESULT BeginFlush(void); + virtual HRESULT EndFlush(void); + virtual HRESULT NewSegment( + REFERENCE_TIME tStart, + REFERENCE_TIME tStop, + double dRate); + +#ifdef PERF + // Override to register performance measurement with a less generic string + // You should do this to avoid confusion with other filters + virtual void RegisterPerfId() + {m_idTransform = MSR_REGISTER(TEXT("Transform"));} +#endif // PERF + + +// implementation details + +protected: + +#ifdef PERF + int m_idTransform; // performance measuring id +#endif + BOOL m_bEOSDelivered; // have we sent EndOfStream + BOOL m_bSampleSkipped; // Did we just skip a frame + BOOL m_bQualityChanged; // Have we degraded? + + // critical section protecting filter state. + + CCritSec m_csFilter; + + // critical section stopping state changes (ie Stop) while we're + // processing a sample. + // + // This critical section is held when processing + // events that occur on the receive thread - Receive() and EndOfStream(). + // + // If you want to hold both m_csReceive and m_csFilter then grab + // m_csFilter FIRST - like CTransformFilter::Stop() does. + + CCritSec m_csReceive; + + // these hold our input and output pins + + friend class CTransformInputPin; + friend class CTransformOutputPin; + CTransformInputPin *m_pInput; + CTransformOutputPin *m_pOutput; +}; + +#endif /* __TRANSFRM__ */ + +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/transip.cpp
Added
@@ -0,0 +1,974 @@ +//------------------------------------------------------------------------------ +// File: TransIP.cpp +// +// Desc: DirectShow base classes - implements class for simple Transform- +// In-Place filters such as audio. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// How allocators are decided. +// +// An in-place transform tries to do its work in someone else's buffers. +// It tries to persuade the filters on either side to use the same allocator +// (and for that matter the same media type). In desperation, if the downstream +// filter refuses to supply an allocator and the upstream filter offers only +// a read-only one then it will provide an allocator. +// if the upstream filter insists on a read-only allocator then the transform +// filter will (reluctantly) copy the data before transforming it. +// +// In order to pass an allocator through it needs to remember the one it got +// from the first connection to pass it on to the second one. +// +// It is good if we can avoid insisting on a particular order of connection +// (There is a precedent for insisting on the input +// being connected first. Insisting on the output being connected first is +// not allowed. That would break RenderFile.) +// +// The base pin classes (CBaseOutputPin and CBaseInputPin) both have a +// m_pAllocator member which is used in places like +// CBaseOutputPin::GetDeliveryBuffer and CBaseInputPin::Inactive. +// To avoid lots of extra overriding, we should keep these happy +// by using these pointers. +// +// When each pin is connected, it will set the corresponding m_pAllocator +// and will have a single ref-count on that allocator. +// +// Refcounts are acquired by GetAllocator calls which return AddReffed +// allocators and are released in one of: +// CBaseInputPin::Disconnect +// CBaseOutputPin::BreakConect +// In each case m_pAllocator is set to NULL after the release, so this +// is the last chance to ever release it. If there should ever be +// multiple refcounts associated with the same pointer, this had better +// be cleared up before that happens. To avoid such problems, we'll +// stick with one per pointer. + + + +// RECONNECTING and STATE CHANGES +// +// Each pin could be disconnected, connected with a read-only allocator, +// connected with an upstream read/write allocator, connected with an +// allocator from downstream or connected with its own allocator. +// Five states for each pin gives a data space of 25 states. +// +// Notation: +// +// R/W == read/write +// R-O == read-only +// +// <input pin state> <output pin state> <comments> +// +// 00 means an unconnected pin. +// <- means using a R/W allocator from the upstream filter +// <= means using a R-O allocator from an upstream filter +// || means using our own (R/W) allocator. +// -> means using a R/W allocator from a downstream filter +// (a R-O allocator from downstream is nonsense, it can't ever work). +// +// +// That makes 25 possible states. Some states are nonsense (two different +// allocators from the same place). These are just an artifact of the notation. +// <= <- Nonsense. +// <- <= Nonsense +// Some states are illegal (the output pin never accepts a R-O allocator): +// 00 <= !! Error !! +// <= <= !! Error !! +// || <= !! Error !! +// -> <= !! Error !! +// Three states appears to be inaccessible: +// -> || Inaccessible +// || -> Inaccessible +// || <- Inaccessible +// Some states only ever occur as intermediates with a pending reconnect which +// is guaranteed to finish in another state. +// -> 00 ?? unstable goes to || 00 +// 00 <- ?? unstable goes to 00 || +// -> <- ?? unstable goes to -> -> +// <- || ?? unstable goes to <- <- +// <- -> ?? unstable goes to <- <- +// And that leaves 11 possible resting states: +// 1 00 00 Nothing connected. +// 2 <- 00 Input pin connected. +// 3 <= 00 Input pin connected using R-O allocator. +// 4 || 00 Needs several state changes to get here. +// 5 00 || Output pin connected using our allocator +// 6 00 -> Downstream only connected +// 7 || || Undesirable but can be forced upon us. +// 8 <= || Copy forced. <= -> is preferable +// 9 <= -> OK - forced to copy. +// 10 <- <- Transform in place (ideal) +// 11 -> -> Transform in place (ideal) +// +// The object of the exercise is to ensure that we finish up in states +// 10 or 11 whenever possible. State 10 is only possible if the upstream +// filter has a R/W allocator (the AVI splitter notoriously +// doesn't) and state 11 is only possible if the downstream filter does +// offer an allocator. +// +// The transition table (entries marked * go via a reconnect) +// +// There are 8 possible transitions: +// A: Connect upstream to filter with R-O allocator that insists on using it. +// B: Connect upstream to filter with R-O allocator but chooses not to use it. +// C: Connect upstream to filter with R/W allocator and insists on using it. +// D: Connect upstream to filter with R/W allocator but chooses not to use it. +// E: Connect downstream to a filter that offers an allocator +// F: Connect downstream to a filter that does not offer an allocator +// G: disconnect upstream +// H: Disconnect downstream +// +// A B C D E F G H +// --------------------------------------------------------- +// 00 00 1 | 3 3 2 2 6 5 . . |1 00 00 +// <- 00 2 | . . . . *10/11 10 1 . |2 <- 00 +// <= 00 3 | . . . . *9/11 *7/8 1 . |3 <= 00 +// || 00 4 | . . . . *8 *7 1 . |4 || 00 +// 00 || 5 | 8 7 *10 7 . . . 1 |5 00 || +// 00 -> 6 | 9 11 *10 11 . . . 1 |6 00 -> +// || || 7 | . . . . . . 5 4 |7 || || +// <= || 8 | . . . . . . 5 3 |8 <= || +// <= -> 9 | . . . . . . 6 3 |9 <= -> +// <- <- 10| . . . . . . *5/6 2 |10 <- <- +// -> -> 11| . . . . . . 6 *2/3 |11 -> -> +// --------------------------------------------------------- +// A B C D E F G H +// +// All these states are accessible without requiring any filter to +// change its behaviour but not all transitions are accessible, for +// instance a transition from state 4 to anywhere other than +// state 8 requires that the upstream filter first offer a R-O allocator +// and then changes its mind and offer R/W. This is NOT allowable - it +// leads to things like the output pin getting a R/W allocator from +// upstream and then the input pin being told it can only have a R-O one. +// Note that you CAN change (say) the upstream filter for a different one, but +// only as a disconnect / connect, not as a Reconnect. (Exercise for +// the reader is to see how you get into state 4). +// +// The reconnection stuff goes as follows (some of the cases shown here as +// "no reconnect" may get one to finalise media type - an old story). +// If there is a reconnect where it says "no reconnect" here then the +// reconnection must not change the allocator choice. +// +// state 2: <- 00 transition E <- <- case C <- <- (no change) +// case D -> <- and then to -> -> +// +// state 2: <- 00 transition F <- <- (no reconnect) +// +// state 3: <= 00 transition E <= -> case A <= -> (no change) +// case B -> -> +// transition F <= || case A <= || (no change) +// case B || || +// +// state 4: || 00 transition E || || case B -> || and then all cases to -> -> +// F || || case B || || (no change) +// +// state 5: 00 || transition A <= || (no reconnect) +// B || || (no reconnect) +// C <- || all cases <- <- +// D || || (unfortunate, but upstream's choice) +// +// state 6: 00 -> transition A <= -> (no reconnect) +// B -> -> (no reconnect) +// C <- -> all cases <- <- +// D -> -> (no reconnect) +// +// state 10:<- <- transition G 00 <- case E 00 -> +// case F 00 || +// +// state 11:-> -> transition H -> 00 case A <= 00 (schizo) +// case B <= 00 +// case C <- 00 (schizo) +// case D <- 00 +// +// The Rules: +// To sort out media types: +// The input is reconnected +// if the input pin is connected and the output pin connects +// The output is reconnected +// If the output pin is connected +// and the input pin connects to a different media type +// +// To sort out allocators: +// The input is reconnected +// if the output disconnects and the input was using a downstream allocator +// The output pin calls SetAllocator to pass on a new allocator +// if the output is connected and +// if the input disconnects and the output was using an upstream allocator +// if the input acquires an allocator different from the output one +// and that new allocator is not R-O +// +// Data is copied (i.e. call getbuffer and copy the data before transforming it) +// if the two allocators are different. + + + +// CHAINS of filters: +// +// We sit between two filters (call them A and Z). We should finish up +// with the same allocator on both of our pins and that should be the +// same one that A and Z would have agreed on if we hadn't been in the +// way. Furthermore, it should not matter how many in-place transforms +// are in the way. Let B, C, D... be in-place transforms ("us"). +// Here's how it goes: +// +// 1. +// A connects to B. They agree on A's allocator. +// A-a->B +// +// 2. +// B connects to C. Same story. There is no point in a reconnect, but +// B will request an input reconnect anyway. +// A-a->B-a->C +// +// 3. +// C connects to Z. +// C insists on using A's allocator, but compromises by requesting a reconnect. +// of C's input. +// A-a->B-?->C-a->Z +// +// We now have pending reconnects on both A--->B and B--->C +// +// 4. +// The A--->B link is reconnected. +// A asks B for an allocator. B sees that it has a downstream connection so +// asks its downstream input pin i.e. C's input pin for an allocator. C sees +// that it too has a downstream connection so asks Z for an allocator. +// +// Even though Z's input pin is connected, it is being asked for an allocator. +// It could refuse, in which case the chain is done and will use A's allocator +// Alternatively, Z may supply one. A chooses either Z's or A's own one. +// B's input pin gets NotifyAllocator called to tell it the decision and it +// propagates this downstream by calling ReceiveAllocator on its output pin +// which calls NotifyAllocator on the next input pin downstream etc. +// If the choice is Z then it goes: +// A-z->B-a->C-a->Z +// A-z->B-z->C-a->Z +// A-z->B-z->C-z->Z +// +// And that's IT!! Any further (essentially spurious) reconnects peter out +// with no change in the chain. + +#include <streams.h> +#include <measure.h> +#include <transip.h> + + +// ================================================================= +// Implements the CTransInPlaceFilter class +// ================================================================= + +CTransInPlaceFilter::CTransInPlaceFilter + ( __in_opt LPCTSTR pName, + __inout_opt LPUNKNOWN pUnk, + REFCLSID clsid, + __inout HRESULT *phr, + bool bModifiesData + ) + : CTransformFilter(pName, pUnk, clsid), + m_bModifiesData(bModifiesData) +{ +#ifdef PERF + RegisterPerfId(); +#endif // PERF + +} // constructor + +#ifdef UNICODE +CTransInPlaceFilter::CTransInPlaceFilter + ( __in_opt LPCSTR pName, + __inout_opt LPUNKNOWN pUnk, + REFCLSID clsid, + __inout HRESULT *phr, + bool bModifiesData + ) + : CTransformFilter(pName, pUnk, clsid), + m_bModifiesData(bModifiesData) +{ +#ifdef PERF + RegisterPerfId(); +#endif // PERF + +} // constructor +#endif + +// return a non-addrefed CBasePin * for the user to addref if he holds onto it +// for longer than his pointer to us. We create the pins dynamically when they +// are asked for rather than in the constructor. This is because we want to +// give the derived class an oppportunity to return different pin objects + +// As soon as any pin is needed we create both (this is different from the +// usual transform filter) because enumerators, allocators etc are passed +// through from one pin to another and it becomes very painful if the other +// pin isn't there. If we fail to create either pin we ensure we fail both. + +CBasePin * +CTransInPlaceFilter::GetPin(int n) +{ + HRESULT hr = S_OK; + + // Create an input pin if not already done + + if (m_pInput == NULL) { + + m_pInput = new CTransInPlaceInputPin( NAME("TransInPlace input pin") + , this // Owner filter + , &hr // Result code + , L"Input" // Pin name + ); + + // Constructor for CTransInPlaceInputPin can't fail + ASSERT(SUCCEEDED(hr)); + } + + // Create an output pin if not already done + + if (m_pInput!=NULL && m_pOutput == NULL) { + + m_pOutput = new CTransInPlaceOutputPin( NAME("TransInPlace output pin") + , this // Owner filter + , &hr // Result code + , L"Output" // Pin name + ); + + // a failed return code should delete the object + + ASSERT(SUCCEEDED(hr)); + if (m_pOutput == NULL) { + delete m_pInput; + m_pInput = NULL; + } + } + + // Return the appropriate pin + + ASSERT (n>=0 && n<=1); + if (n == 0) { + return m_pInput; + } else if (n==1) { + return m_pOutput; + } else { + return NULL; + } + +} // GetPin + + + +// dir is the direction of our pin. +// pReceivePin is the pin we are connecting to. +HRESULT CTransInPlaceFilter::CompleteConnect(PIN_DIRECTION dir, IPin *pReceivePin) +{ + UNREFERENCED_PARAMETER(pReceivePin); + ASSERT(m_pInput); + ASSERT(m_pOutput); + + // if we are not part of a graph, then don't indirect the pointer + // this probably prevents use of the filter without a filtergraph + if (!m_pGraph) { + return VFW_E_NOT_IN_GRAPH; + } + + // Always reconnect the input to account for buffering changes + // + // Because we don't get to suggest a type on ReceiveConnection + // we need another way of making sure the right type gets used. + // + // One way would be to have our EnumMediaTypes return our output + // connection type first but more deterministic and simple is to + // call ReconnectEx passing the type we want to reconnect with + // via the base class ReconeectPin method. + + if (dir == PINDIR_OUTPUT) { + if( m_pInput->IsConnected() ) { + return ReconnectPin( m_pInput, &m_pOutput->CurrentMediaType() ); + } + return NOERROR; + } + + ASSERT(dir == PINDIR_INPUT); + + // Reconnect output if necessary + + if( m_pOutput->IsConnected() ) { + + if ( m_pInput->CurrentMediaType() + != m_pOutput->CurrentMediaType() + ) { + return ReconnectPin( m_pOutput, &m_pInput->CurrentMediaType() ); + } + } + return NOERROR; + +} // ComnpleteConnect + + +// +// DecideBufferSize +// +// Tell the output pin's allocator what size buffers we require. +// *pAlloc will be the allocator our output pin is using. +// + +HRESULT CTransInPlaceFilter::DecideBufferSize + ( IMemAllocator *pAlloc + , __inout ALLOCATOR_PROPERTIES *pProperties + ) +{ + ALLOCATOR_PROPERTIES Request, Actual; + HRESULT hr; + + // If we are connected upstream, get his views + if (m_pInput->IsConnected()) { + // Get the input pin allocator, and get its size and count. + // we don't care about his alignment and prefix. + + hr = InputPin()->PeekAllocator()->GetProperties(&Request); + if (FAILED(hr)) { + // Input connected but with a secretive allocator - enough! + return hr; + } + } else { + // Propose one byte + // If this isn't enough then when the other pin does get connected + // we can revise it. + ZeroMemory(&Request, sizeof(Request)); + Request.cBuffers = 1; + Request.cbBuffer = 1; + } + + + DbgLog((LOG_MEMORY,1,TEXT("Setting Allocator Requirements"))); + DbgLog((LOG_MEMORY,1,TEXT("Count %d, Size %d"), + Request.cBuffers, Request.cbBuffer)); + + // Pass the allocator requirements to our output side + // but do a little sanity checking first or we'll just hit + // asserts in the allocator. + + pProperties->cBuffers = Request.cBuffers; + pProperties->cbBuffer = Request.cbBuffer; + pProperties->cbAlign = Request.cbAlign; + if (pProperties->cBuffers<=0) {pProperties->cBuffers = 1; } + if (pProperties->cbBuffer<=0) {pProperties->cbBuffer = 1; } + hr = pAlloc->SetProperties(pProperties, &Actual); + + if (FAILED(hr)) { + return hr; + } + + DbgLog((LOG_MEMORY,1,TEXT("Obtained Allocator Requirements"))); + DbgLog((LOG_MEMORY,1,TEXT("Count %d, Size %d, Alignment %d"), + Actual.cBuffers, Actual.cbBuffer, Actual.cbAlign)); + + // Make sure we got the right alignment and at least the minimum required + + if ( (Request.cBuffers > Actual.cBuffers) + || (Request.cbBuffer > Actual.cbBuffer) + || (Request.cbAlign > Actual.cbAlign) + ) { + return E_FAIL; + } + return NOERROR; + +} // DecideBufferSize + +// +// Copy +// +// return a pointer to an identical copy of pSample +__out_opt IMediaSample * CTransInPlaceFilter::Copy(IMediaSample *pSource) +{ + IMediaSample * pDest; + + HRESULT hr; + REFERENCE_TIME tStart, tStop; + const BOOL bTime = S_OK == pSource->GetTime( &tStart, &tStop); + + // this may block for an indeterminate amount of time + hr = OutputPin()->PeekAllocator()->GetBuffer( + &pDest + , bTime ? &tStart : NULL + , bTime ? &tStop : NULL + , m_bSampleSkipped ? AM_GBF_PREVFRAMESKIPPED : 0 + ); + + if (FAILED(hr)) { + return NULL; + } + + ASSERT(pDest); + IMediaSample2 *pSample2; + if (SUCCEEDED(pDest->QueryInterface(IID_IMediaSample2, (void **)&pSample2))) { + HRESULT hrProps = pSample2->SetProperties( + FIELD_OFFSET(AM_SAMPLE2_PROPERTIES, pbBuffer), + (PBYTE)m_pInput->SampleProps()); + pSample2->Release(); + if (FAILED(hrProps)) { + pDest->Release(); + return NULL; + } + } else { + if (bTime) { + pDest->SetTime(&tStart, &tStop); + } + + if (S_OK == pSource->IsSyncPoint()) { + pDest->SetSyncPoint(TRUE); + } + if (S_OK == pSource->IsDiscontinuity() || m_bSampleSkipped) { + pDest->SetDiscontinuity(TRUE); + } + if (S_OK == pSource->IsPreroll()) { + pDest->SetPreroll(TRUE); + } + + // Copy the media type + AM_MEDIA_TYPE *pMediaType; + if (S_OK == pSource->GetMediaType(&pMediaType)) { + pDest->SetMediaType(pMediaType); + DeleteMediaType( pMediaType ); + } + + } + + m_bSampleSkipped = FALSE; + + // Copy the sample media times + REFERENCE_TIME TimeStart, TimeEnd; + if (pSource->GetMediaTime(&TimeStart,&TimeEnd) == NOERROR) { + pDest->SetMediaTime(&TimeStart,&TimeEnd); + } + + // Copy the actual data length and the actual data. + { + const long lDataLength = pSource->GetActualDataLength(); + if (FAILED(pDest->SetActualDataLength(lDataLength))) { + pDest->Release(); + return NULL; + } + + // Copy the sample data + { + BYTE *pSourceBuffer, *pDestBuffer; + long lSourceSize = pSource->GetSize(); + long lDestSize = pDest->GetSize(); + + ASSERT(lDestSize >= lSourceSize && lDestSize >= lDataLength); + + if (FAILED(pSource->GetPointer(&pSourceBuffer)) || + FAILED(pDest->GetPointer(&pDestBuffer)) || + lDestSize < lDataLength || + lDataLength < 0) { + pDest->Release(); + return NULL; + } + ASSERT(lDestSize == 0 || pSourceBuffer != NULL && pDestBuffer != NULL); + + CopyMemory( (PVOID) pDestBuffer, (PVOID) pSourceBuffer, lDataLength ); + } + } + + return pDest; + +} // Copy + + +// override this to customize the transform process + +HRESULT +CTransInPlaceFilter::Receive(IMediaSample *pSample) +{ + /* Check for other streams and pass them on */ + AM_SAMPLE2_PROPERTIES * const pProps = m_pInput->SampleProps(); + if (pProps->dwStreamId != AM_STREAM_MEDIA) { + return m_pOutput->Deliver(pSample); + } + HRESULT hr; + + // Start timing the TransInPlace (if PERF is defined) + MSR_START(m_idTransInPlace); + + if (UsingDifferentAllocators()) { + + // We have to copy the data. + + pSample = Copy(pSample); + + if (pSample==NULL) { + MSR_STOP(m_idTransInPlace); + return E_UNEXPECTED; + } + } + + // have the derived class transform the data + hr = Transform(pSample); + + // Stop the clock and log it (if PERF is defined) + MSR_STOP(m_idTransInPlace); + + if (FAILED(hr)) { + DbgLog((LOG_TRACE, 1, TEXT("Error from TransInPlace"))); + if (UsingDifferentAllocators()) { + pSample->Release(); + } + return hr; + } + + // the Transform() function can return S_FALSE to indicate that the + // sample should not be delivered; we only deliver the sample if it's + // really S_OK (same as NOERROR, of course.) + if (hr == NOERROR) { + hr = m_pOutput->Deliver(pSample); + } else { + // But it would be an error to return this private workaround + // to the caller ... + if (S_FALSE == hr) { + // S_FALSE returned from Transform is a PRIVATE agreement + // We should return NOERROR from Receive() in this cause because + // returning S_FALSE from Receive() means that this is the end + // of the stream and no more data should be sent. + m_bSampleSkipped = TRUE; + if (!m_bQualityChanged) { + NotifyEvent(EC_QUALITY_CHANGE,0,0); + m_bQualityChanged = TRUE; + } + hr = NOERROR; + } + } + + // release the output buffer. If the connected pin still needs it, + // it will have addrefed it itself. + if (UsingDifferentAllocators()) { + pSample->Release(); + } + + return hr; + +} // Receive + + + +// ================================================================= +// Implements the CTransInPlaceInputPin class +// ================================================================= + + +// constructor + +CTransInPlaceInputPin::CTransInPlaceInputPin + ( __in_opt LPCTSTR pObjectName + , __inout CTransInPlaceFilter *pFilter + , __inout HRESULT *phr + , __in_opt LPCWSTR pName + ) + : CTransformInputPin(pObjectName, + pFilter, + phr, + pName) + , m_bReadOnly(FALSE) + , m_pTIPFilter(pFilter) +{ + DbgLog((LOG_TRACE, 2 + , TEXT("CTransInPlaceInputPin::CTransInPlaceInputPin"))); + +} // constructor + + +// ================================================================= +// Implements IMemInputPin interface +// ================================================================= + + +// If the downstream filter has one then offer that (even if our own output +// pin is not using it yet. If the upstream filter chooses it then we will +// tell our output pin to ReceiveAllocator). +// Else if our output pin is using an allocator then offer that. +// ( This could mean offering the upstream filter his own allocator, +// it could mean offerring our own +// ) or it could mean offering the one from downstream +// Else fail to offer any allocator at all. + +STDMETHODIMP CTransInPlaceInputPin::GetAllocator(__deref_out IMemAllocator ** ppAllocator) +{ + CheckPointer(ppAllocator,E_POINTER); + ValidateReadWritePtr(ppAllocator,sizeof(IMemAllocator *)); + CAutoLock cObjectLock(m_pLock); + + HRESULT hr; + + if ( m_pTIPFilter->m_pOutput->IsConnected() ) { + // Store the allocator we got + hr = m_pTIPFilter->OutputPin()->ConnectedIMemInputPin() + ->GetAllocator( ppAllocator ); + if (SUCCEEDED(hr)) { + m_pTIPFilter->OutputPin()->SetAllocator( *ppAllocator ); + } + } + else { + // Help upstream filter (eg TIP filter which is having to do a copy) + // by providing a temp allocator here - we'll never use + // this allocator because when our output is connected we'll + // reconnect this pin + hr = CTransformInputPin::GetAllocator( ppAllocator ); + } + return hr; + +} // GetAllocator + + + +/* Get told which allocator the upstream output pin is actually going to use */ + + +STDMETHODIMP +CTransInPlaceInputPin::NotifyAllocator( + IMemAllocator * pAllocator, + BOOL bReadOnly) +{ + HRESULT hr = S_OK; + CheckPointer(pAllocator,E_POINTER); + ValidateReadPtr(pAllocator,sizeof(IMemAllocator)); + + CAutoLock cObjectLock(m_pLock); + + m_bReadOnly = bReadOnly; + // If we modify data then don't accept the allocator if it's + // the same as the output pin's allocator + + // If our output is not connected just accept the allocator + // We're never going to use this allocator because when our + // output pin is connected we'll reconnect this pin + if (!m_pTIPFilter->OutputPin()->IsConnected()) { + return CTransformInputPin::NotifyAllocator(pAllocator, bReadOnly); + } + + // If the allocator is read-only and we're modifying data + // and the allocator is the same as the output pin's + // then reject + if (bReadOnly && m_pTIPFilter->m_bModifiesData) { + IMemAllocator *pOutputAllocator = + m_pTIPFilter->OutputPin()->PeekAllocator(); + + // Make sure we have an output allocator + if (pOutputAllocator == NULL) { + hr = m_pTIPFilter->OutputPin()->ConnectedIMemInputPin()-> + GetAllocator(&pOutputAllocator); + if(FAILED(hr)) { + hr = CreateMemoryAllocator(&pOutputAllocator); + } + if (SUCCEEDED(hr)) { + m_pTIPFilter->OutputPin()->SetAllocator(pOutputAllocator); + pOutputAllocator->Release(); + } + } + if (pAllocator == pOutputAllocator) { + hr = E_FAIL; + } else if(SUCCEEDED(hr)) { + // Must copy so set the allocator properties on the output + ALLOCATOR_PROPERTIES Props, Actual; + hr = pAllocator->GetProperties(&Props); + if (SUCCEEDED(hr)) { + hr = pOutputAllocator->SetProperties(&Props, &Actual); + } + if (SUCCEEDED(hr)) { + if ( (Props.cBuffers > Actual.cBuffers) + || (Props.cbBuffer > Actual.cbBuffer) + || (Props.cbAlign > Actual.cbAlign) + ) { + hr = E_FAIL; + } + } + + // Set the allocator on the output pin + if (SUCCEEDED(hr)) { + hr = m_pTIPFilter->OutputPin()->ConnectedIMemInputPin() + ->NotifyAllocator( pOutputAllocator, FALSE ); + } + } + } else { + hr = m_pTIPFilter->OutputPin()->ConnectedIMemInputPin() + ->NotifyAllocator( pAllocator, bReadOnly ); + if (SUCCEEDED(hr)) { + m_pTIPFilter->OutputPin()->SetAllocator( pAllocator ); + } + } + + if (SUCCEEDED(hr)) { + + // It's possible that the old and the new are the same thing. + // AddRef before release ensures that we don't unload it. + pAllocator->AddRef(); + + if( m_pAllocator != NULL ) + m_pAllocator->Release(); + + m_pAllocator = pAllocator; // We have an allocator for the input pin + } + + return hr; + +} // NotifyAllocator + + +// EnumMediaTypes +// - pass through to our downstream filter +STDMETHODIMP CTransInPlaceInputPin::EnumMediaTypes( __deref_out IEnumMediaTypes **ppEnum ) +{ + // Can only pass through if connected + if( !m_pTIPFilter->m_pOutput->IsConnected() ) + return VFW_E_NOT_CONNECTED; + + return m_pTIPFilter->m_pOutput->GetConnected()->EnumMediaTypes( ppEnum ); + +} // EnumMediaTypes + + +// CheckMediaType +// - agree to anything if not connected, +// otherwise pass through to the downstream filter. +// This assumes that the filter does not change the media type. + +HRESULT CTransInPlaceInputPin::CheckMediaType(const CMediaType *pmt ) +{ + HRESULT hr = m_pTIPFilter->CheckInputType(pmt); + if (hr!=S_OK) return hr; + + if( m_pTIPFilter->m_pOutput->IsConnected() ) + return m_pTIPFilter->m_pOutput->GetConnected()->QueryAccept( pmt ); + else + return S_OK; + +} // CheckMediaType + + +// If upstream asks us what our requirements are, we will try to ask downstream +// if that doesn't work, we'll just take the defaults. +STDMETHODIMP +CTransInPlaceInputPin::GetAllocatorRequirements(__out ALLOCATOR_PROPERTIES *pProps) +{ + + if( m_pTIPFilter->m_pOutput->IsConnected() ) + return m_pTIPFilter->OutputPin() + ->ConnectedIMemInputPin()->GetAllocatorRequirements( pProps ); + else + return E_NOTIMPL; + +} // GetAllocatorRequirements + + +// CTransInPlaceInputPin::CompleteConnect() calls CBaseInputPin::CompleteConnect() +// and then calls CTransInPlaceFilter::CompleteConnect(). It does this because +// CTransInPlaceFilter::CompleteConnect() can reconnect a pin and we do not +// want to reconnect a pin if CBaseInputPin::CompleteConnect() fails. +HRESULT +CTransInPlaceInputPin::CompleteConnect(IPin *pReceivePin) +{ + HRESULT hr = CBaseInputPin::CompleteConnect(pReceivePin); + if (FAILED(hr)) { + return hr; + } + + return m_pTransformFilter->CompleteConnect(PINDIR_INPUT,pReceivePin); +} // CompleteConnect + + +// ================================================================= +// Implements the CTransInPlaceOutputPin class +// ================================================================= + + +// constructor + +CTransInPlaceOutputPin::CTransInPlaceOutputPin( + __in_opt LPCTSTR pObjectName, + __inout CTransInPlaceFilter *pFilter, + __inout HRESULT * phr, + __in_opt LPCWSTR pPinName) + : CTransformOutputPin( pObjectName + , pFilter + , phr + , pPinName), + m_pTIPFilter(pFilter) +{ + DbgLog(( LOG_TRACE, 2 + , TEXT("CTransInPlaceOutputPin::CTransInPlaceOutputPin"))); + +} // constructor + + +// EnumMediaTypes +// - pass through to our upstream filter +STDMETHODIMP CTransInPlaceOutputPin::EnumMediaTypes( __deref_out IEnumMediaTypes **ppEnum ) +{ + // Can only pass through if connected. + if( ! m_pTIPFilter->m_pInput->IsConnected() ) + return VFW_E_NOT_CONNECTED; + + return m_pTIPFilter->m_pInput->GetConnected()->EnumMediaTypes( ppEnum ); + +} // EnumMediaTypes + + + +// CheckMediaType +// - agree to anything if not connected, +// otherwise pass through to the upstream filter. + +HRESULT CTransInPlaceOutputPin::CheckMediaType(const CMediaType *pmt ) +{ + // Don't accept any output pin type changes if we're copying + // between allocators - it's too late to change the input + // allocator size. + if (m_pTIPFilter->UsingDifferentAllocators() && !m_pFilter->IsStopped()) { + if (*pmt == m_mt) { + return S_OK; + } else { + return VFW_E_TYPE_NOT_ACCEPTED; + } + } + + // Assumes the type does not change. That's why we're calling + // CheckINPUTType here on the OUTPUT pin. + HRESULT hr = m_pTIPFilter->CheckInputType(pmt); + if (hr!=S_OK) return hr; + + if( m_pTIPFilter->m_pInput->IsConnected() ) + return m_pTIPFilter->m_pInput->GetConnected()->QueryAccept( pmt ); + else + return S_OK; + +} // CheckMediaType + + +/* Save the allocator pointer in the output pin +*/ +void +CTransInPlaceOutputPin::SetAllocator(IMemAllocator * pAllocator) +{ + pAllocator->AddRef(); + if (m_pAllocator) { + m_pAllocator->Release(); + } + m_pAllocator = pAllocator; +} // SetAllocator + + +// CTransInPlaceOutputPin::CompleteConnect() calls CBaseOutputPin::CompleteConnect() +// and then calls CTransInPlaceFilter::CompleteConnect(). It does this because +// CTransInPlaceFilter::CompleteConnect() can reconnect a pin and we do not want to +// reconnect a pin if CBaseOutputPin::CompleteConnect() fails. +// CBaseOutputPin::CompleteConnect() often fails when our output pin is being connected +// to the Video Mixing Renderer. +HRESULT +CTransInPlaceOutputPin::CompleteConnect(IPin *pReceivePin) +{ + HRESULT hr = CBaseOutputPin::CompleteConnect(pReceivePin); + if (FAILED(hr)) { + return hr; + } + + return m_pTransformFilter->CompleteConnect(PINDIR_OUTPUT,pReceivePin); +} // CompleteConnect
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/transip.h
Added
@@ -0,0 +1,250 @@ +//------------------------------------------------------------------------------ +// File: TransIP.h +// +// Desc: DirectShow base classes - defines classes from which simple +// Transform-In-Place filters may be derived. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// +// The difference between this and Transfrm.h is that Transfrm copies the data. +// +// It assumes the filter has one input and one output stream, and has no +// interest in memory management, interface negotiation or anything else. +// +// Derive your class from this, and supply Transform and the media type/format +// negotiation functions. Implement that class, compile and link and +// you're done. + + +#ifndef __TRANSIP__ +#define __TRANSIP__ + +// ====================================================================== +// This is the com object that represents a simple transform filter. It +// supports IBaseFilter, IMediaFilter and two pins through nested interfaces +// ====================================================================== + +class CTransInPlaceFilter; + +// Several of the pin functions call filter functions to do the work, +// so you can often use the pin classes unaltered, just overriding the +// functions in CTransInPlaceFilter. If that's not enough and you want +// to derive your own pin class, override GetPin in the filter to supply +// your own pin classes to the filter. + +// ================================================== +// Implements the input pin +// ================================================== + +class CTransInPlaceInputPin : public CTransformInputPin +{ + +protected: + CTransInPlaceFilter * const m_pTIPFilter; // our filter + BOOL m_bReadOnly; // incoming stream is read only + +public: + + CTransInPlaceInputPin( + __in_opt LPCTSTR pObjectName, + __inout CTransInPlaceFilter *pFilter, + __inout HRESULT *phr, + __in_opt LPCWSTR pName); + + // --- IMemInputPin ----- + + // Provide an enumerator for media types by getting one from downstream + STDMETHODIMP EnumMediaTypes( __deref_out IEnumMediaTypes **ppEnum ); + + // Say whether media type is acceptable. + HRESULT CheckMediaType(const CMediaType* pmt); + + // Return our upstream allocator + STDMETHODIMP GetAllocator(__deref_out IMemAllocator ** ppAllocator); + + // get told which allocator the upstream output pin is actually + // going to use. + STDMETHODIMP NotifyAllocator(IMemAllocator * pAllocator, + BOOL bReadOnly); + + // Allow the filter to see what allocator we have + // N.B. This does NOT AddRef + __out IMemAllocator * PeekAllocator() const + { return m_pAllocator; } + + // Pass this on downstream if it ever gets called. + STDMETHODIMP GetAllocatorRequirements(__out ALLOCATOR_PROPERTIES *pProps); + + HRESULT CompleteConnect(IPin *pReceivePin); + + inline const BOOL ReadOnly() { return m_bReadOnly ; } + +}; // CTransInPlaceInputPin + +// ================================================== +// Implements the output pin +// ================================================== + +class CTransInPlaceOutputPin : public CTransformOutputPin +{ + +protected: + // m_pFilter points to our CBaseFilter + CTransInPlaceFilter * const m_pTIPFilter; + +public: + + CTransInPlaceOutputPin( + __in_opt LPCTSTR pObjectName, + __inout CTransInPlaceFilter *pFilter, + __inout HRESULT *phr, + __in_opt LPCWSTR pName); + + + // --- CBaseOutputPin ------------ + + // negotiate the allocator and its buffer size/count + // Insists on using our own allocator. (Actually the one upstream of us). + // We don't override this - instead we just agree the default + // then let the upstream filter decide for itself on reconnect + // virtual HRESULT DecideAllocator(IMemInputPin * pPin, IMemAllocator ** pAlloc); + + // Provide a media type enumerator. Get it from upstream. + STDMETHODIMP EnumMediaTypes( __deref_out IEnumMediaTypes **ppEnum ); + + // Say whether media type is acceptable. + HRESULT CheckMediaType(const CMediaType* pmt); + + // This just saves the allocator being used on the output pin + // Also called by input pin's GetAllocator() + void SetAllocator(IMemAllocator * pAllocator); + + __out_opt IMemInputPin * ConnectedIMemInputPin() + { return m_pInputPin; } + + // Allow the filter to see what allocator we have + // N.B. This does NOT AddRef + __out IMemAllocator * PeekAllocator() const + { return m_pAllocator; } + + HRESULT CompleteConnect(IPin *pReceivePin); + +}; // CTransInPlaceOutputPin + + +class AM_NOVTABLE CTransInPlaceFilter : public CTransformFilter +{ + +public: + + // map getpin/getpincount for base enum of pins to owner + // override this to return more specialised pin objects + + virtual CBasePin *GetPin(int n); + +public: + + // Set bModifiesData == false if your derived filter does + // not modify the data samples (for instance it's just copying + // them somewhere else or looking at the timestamps). + + CTransInPlaceFilter(__in_opt LPCTSTR, __inout_opt LPUNKNOWN, REFCLSID clsid, __inout HRESULT *, + bool bModifiesData = true); +#ifdef UNICODE + CTransInPlaceFilter(__in_opt LPCSTR, __inout_opt LPUNKNOWN, REFCLSID clsid, __inout HRESULT *, + bool bModifiesData = true); +#endif + // The following are defined to avoid undefined pure virtuals. + // Even if they are never called, they will give linkage warnings/errors + + // We override EnumMediaTypes to bypass the transform class enumerator + // which would otherwise call this. + HRESULT GetMediaType(int iPosition, __inout CMediaType *pMediaType) + { DbgBreak("CTransInPlaceFilter::GetMediaType should never be called"); + return E_UNEXPECTED; + } + + // This is called when we actually have to provide our own allocator. + HRESULT DecideBufferSize(IMemAllocator*, __inout ALLOCATOR_PROPERTIES *); + + // The functions which call this in CTransform are overridden in this + // class to call CheckInputType with the assumption that the type + // does not change. In Debug builds some calls will be made and + // we just ensure that they do not assert. + HRESULT CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut) + { + return S_OK; + }; + + + // ================================================================= + // ----- You may want to override this ----------------------------- + // ================================================================= + + HRESULT CompleteConnect(PIN_DIRECTION dir,IPin *pReceivePin); + + // chance to customize the transform process + virtual HRESULT Receive(IMediaSample *pSample); + + // ================================================================= + // ----- You MUST override these ----------------------------------- + // ================================================================= + + virtual HRESULT Transform(IMediaSample *pSample) PURE; + + // this goes in the factory template table to create new instances + // static CCOMObject * CreateInstance(LPUNKNOWN, HRESULT *); + + +#ifdef PERF + // Override to register performance measurement with a less generic string + // You should do this to avoid confusion with other filters + virtual void RegisterPerfId() + {m_idTransInPlace = MSR_REGISTER(TEXT("TransInPlace"));} +#endif // PERF + + +// implementation details + +protected: + + __out_opt IMediaSample * CTransInPlaceFilter::Copy(IMediaSample *pSource); + +#ifdef PERF + int m_idTransInPlace; // performance measuring id +#endif // PERF + bool m_bModifiesData; // Does this filter change the data? + + // these hold our input and output pins + + friend class CTransInPlaceInputPin; + friend class CTransInPlaceOutputPin; + + __out CTransInPlaceInputPin *InputPin() const + { + return (CTransInPlaceInputPin *)m_pInput; + }; + __out CTransInPlaceOutputPin *OutputPin() const + { + return (CTransInPlaceOutputPin *)m_pOutput; + }; + + // Helper to see if the input and output types match + BOOL TypesMatch() + { + return InputPin()->CurrentMediaType() == + OutputPin()->CurrentMediaType(); + } + + // Are the input and output allocators different? + BOOL UsingDifferentAllocators() const + { + return InputPin()->PeekAllocator() != OutputPin()->PeekAllocator(); + } +}; // CTransInPlaceFilter + +#endif /* __TRANSIP__ */ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/videoctl.cpp
Added
@@ -0,0 +1,746 @@ +//------------------------------------------------------------------------------ +// File: VideoCtl.cpp +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include "ddmm.h" + +// Load a string from the resource file string table. The buffer must be at +// least STR_MAX_LENGTH bytes. The easiest way to use this is to declare a +// buffer in the property page class and use it for all string loading. It +// cannot be static as multiple property pages may be active simultaneously + +LPTSTR WINAPI StringFromResource(__out_ecount(STR_MAX_LENGTH) LPTSTR pBuffer, int iResourceID) +{ + if (LoadString(g_hInst,iResourceID,pBuffer,STR_MAX_LENGTH) == 0) { + return TEXT(""); + } + return pBuffer; +} + +#ifdef UNICODE +LPSTR WINAPI StringFromResource(__out_ecount(STR_MAX_LENGTH) LPSTR pBuffer, int iResourceID) +{ + if (LoadStringA(g_hInst,iResourceID,pBuffer,STR_MAX_LENGTH) == 0) { + return ""; + } + return pBuffer; +} +#endif + + + +// Property pages typically are called through their OLE interfaces. These +// use UNICODE strings regardless of how the binary is built. So when we +// load strings from the resource file we sometimes want to convert them +// to UNICODE. This method is passed the target UNICODE buffer and does a +// convert after loading the string (if built UNICODE this is not needed) +// On WinNT we can explicitly call LoadStringW which saves two conversions + +#ifndef UNICODE + +LPWSTR WINAPI WideStringFromResource(__out_ecount(STR_MAX_LENGTH) LPWSTR pBuffer, int iResourceID) +{ + *pBuffer = 0; + + if (g_amPlatform == VER_PLATFORM_WIN32_NT) { + LoadStringW(g_hInst,iResourceID,pBuffer,STR_MAX_LENGTH); + } else { + + CHAR szBufferSTR_MAX_LENGTH; + DWORD dwStringLength = LoadString(g_hInst,iResourceID,szBuffer,STR_MAX_LENGTH); + // if we loaded a string convert it to wide characters, ensuring + // that we also null terminate the result. + if (dwStringLength++) { + MultiByteToWideChar(CP_ACP,0,szBuffer,dwStringLength,pBuffer,STR_MAX_LENGTH); + } + } + return pBuffer; +} + +#endif + + +// Helper function to calculate the size of the dialog + +BOOL WINAPI GetDialogSize(int iResourceID, + DLGPROC pDlgProc, + LPARAM lParam, + __out SIZE *pResult) +{ + RECT rc; + HWND hwnd; + + // Create a temporary property page + + hwnd = CreateDialogParam(g_hInst, + MAKEINTRESOURCE(iResourceID), + GetDesktopWindow(), + pDlgProc, + lParam); + if (hwnd == NULL) { + return FALSE; + } + + GetWindowRect(hwnd, &rc); + pResult->cx = rc.right - rc.left; + pResult->cy = rc.bottom - rc.top; + + DestroyWindow(hwnd); + return TRUE; +} + + +// Class that aggregates on the IDirectDraw interface. Although DirectDraw +// has the ability in its interfaces to be aggregated they're not currently +// implemented. This makes it difficult for various parts of Quartz that want +// to aggregate these interfaces. In particular the video renderer passes out +// media samples that expose IDirectDraw and IDirectDrawSurface. The filter +// graph manager also exposes IDirectDraw as a plug in distributor. For these +// objects we provide these aggregation classes that republish the interfaces + +STDMETHODIMP CAggDirectDraw::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + ASSERT(m_pDirectDraw); + + // Do we have this interface + + if (riid == IID_IDirectDraw) { + return GetInterface((IDirectDraw *)this,ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid,ppv); + } +} + + +STDMETHODIMP CAggDirectDraw::Compact() +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->Compact(); +} + + +STDMETHODIMP CAggDirectDraw::CreateClipper(DWORD dwFlags, __deref_out LPDIRECTDRAWCLIPPER *lplpDDClipper, __inout_opt IUnknown *pUnkOuter) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->CreateClipper(dwFlags,lplpDDClipper,pUnkOuter); +} + + +STDMETHODIMP CAggDirectDraw::CreatePalette(DWORD dwFlags, + __in LPPALETTEENTRY lpColorTable, + __deref_out LPDIRECTDRAWPALETTE *lplpDDPalette, + __inout_opt IUnknown *pUnkOuter) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->CreatePalette(dwFlags,lpColorTable,lplpDDPalette,pUnkOuter); +} + + +STDMETHODIMP CAggDirectDraw::CreateSurface(__in LPDDSURFACEDESC lpDDSurfaceDesc, + __deref_out LPDIRECTDRAWSURFACE *lplpDDSurface, + __inout_opt IUnknown *pUnkOuter) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->CreateSurface(lpDDSurfaceDesc,lplpDDSurface,pUnkOuter); +} + + +STDMETHODIMP CAggDirectDraw::DuplicateSurface(__in LPDIRECTDRAWSURFACE lpDDSurface, + __deref_out LPDIRECTDRAWSURFACE *lplpDupDDSurface) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->DuplicateSurface(lpDDSurface,lplpDupDDSurface); +} + + +STDMETHODIMP CAggDirectDraw::EnumDisplayModes(DWORD dwSurfaceDescCount, + __in LPDDSURFACEDESC lplpDDSurfaceDescList, + __in LPVOID lpContext, + __in LPDDENUMMODESCALLBACK lpEnumCallback) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->EnumDisplayModes(dwSurfaceDescCount,lplpDDSurfaceDescList,lpContext,lpEnumCallback); +} + + +STDMETHODIMP CAggDirectDraw::EnumSurfaces(DWORD dwFlags, + __in LPDDSURFACEDESC lpDDSD, + __in LPVOID lpContext, + __in LPDDENUMSURFACESCALLBACK lpEnumCallback) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->EnumSurfaces(dwFlags,lpDDSD,lpContext,lpEnumCallback); +} + + +STDMETHODIMP CAggDirectDraw::FlipToGDISurface() +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->FlipToGDISurface(); +} + + +STDMETHODIMP CAggDirectDraw::GetCaps(__out LPDDCAPS lpDDDriverCaps,__out LPDDCAPS lpDDHELCaps) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->GetCaps(lpDDDriverCaps,lpDDHELCaps); +} + + +STDMETHODIMP CAggDirectDraw::GetDisplayMode(__out LPDDSURFACEDESC lpDDSurfaceDesc) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->GetDisplayMode(lpDDSurfaceDesc); +} + + +STDMETHODIMP CAggDirectDraw::GetFourCCCodes(__inout LPDWORD lpNumCodes,__out_ecount(*lpNumCodes) LPDWORD lpCodes) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->GetFourCCCodes(lpNumCodes,lpCodes); +} + + +STDMETHODIMP CAggDirectDraw::GetGDISurface(__deref_out LPDIRECTDRAWSURFACE *lplpGDIDDSurface) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->GetGDISurface(lplpGDIDDSurface); +} + + +STDMETHODIMP CAggDirectDraw::GetMonitorFrequency(__out LPDWORD lpdwFrequency) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->GetMonitorFrequency(lpdwFrequency); +} + + +STDMETHODIMP CAggDirectDraw::GetScanLine(__out LPDWORD lpdwScanLine) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->GetScanLine(lpdwScanLine); +} + + +STDMETHODIMP CAggDirectDraw::GetVerticalBlankStatus(__out LPBOOL lpblsInVB) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->GetVerticalBlankStatus(lpblsInVB); +} + + +STDMETHODIMP CAggDirectDraw::Initialize(__in GUID *lpGUID) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->Initialize(lpGUID); +} + + +STDMETHODIMP CAggDirectDraw::RestoreDisplayMode() +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->RestoreDisplayMode(); +} + + +STDMETHODIMP CAggDirectDraw::SetCooperativeLevel(HWND hWnd,DWORD dwFlags) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->SetCooperativeLevel(hWnd,dwFlags); +} + + +STDMETHODIMP CAggDirectDraw::SetDisplayMode(DWORD dwWidth,DWORD dwHeight,DWORD dwBpp) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->SetDisplayMode(dwWidth,dwHeight,dwBpp); +} + + +STDMETHODIMP CAggDirectDraw::WaitForVerticalBlank(DWORD dwFlags,HANDLE hEvent) +{ + ASSERT(m_pDirectDraw); + return m_pDirectDraw->WaitForVerticalBlank(dwFlags,hEvent); +} + + +// Class that aggregates an IDirectDrawSurface interface. Although DirectDraw +// has the ability in its interfaces to be aggregated they're not currently +// implemented. This makes it difficult for various parts of Quartz that want +// to aggregate these interfaces. In particular the video renderer passes out +// media samples that expose IDirectDraw and IDirectDrawSurface. The filter +// graph manager also exposes IDirectDraw as a plug in distributor. For these +// objects we provide these aggregation classes that republish the interfaces + +STDMETHODIMP CAggDrawSurface::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv) +{ + ASSERT(m_pDirectDrawSurface); + + // Do we have this interface + + if (riid == IID_IDirectDrawSurface) { + return GetInterface((IDirectDrawSurface *)this,ppv); + } else { + return CUnknown::NonDelegatingQueryInterface(riid,ppv); + } +} + + +STDMETHODIMP CAggDrawSurface::AddAttachedSurface(__in LPDIRECTDRAWSURFACE lpDDSAttachedSurface) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->AddAttachedSurface(lpDDSAttachedSurface); +} + + +STDMETHODIMP CAggDrawSurface::AddOverlayDirtyRect(__in LPRECT lpRect) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->AddOverlayDirtyRect(lpRect); +} + + +STDMETHODIMP CAggDrawSurface::Blt(__in LPRECT lpDestRect, + __in LPDIRECTDRAWSURFACE lpDDSrcSurface, + __in LPRECT lpSrcRect, + DWORD dwFlags, + __in LPDDBLTFX lpDDBltFx) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->Blt(lpDestRect,lpDDSrcSurface,lpSrcRect,dwFlags,lpDDBltFx); +} + + +STDMETHODIMP CAggDrawSurface::BltBatch(__in_ecount(dwCount) LPDDBLTBATCH lpDDBltBatch,DWORD dwCount,DWORD dwFlags) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->BltBatch(lpDDBltBatch,dwCount,dwFlags); +} + + +STDMETHODIMP CAggDrawSurface::BltFast(DWORD dwX,DWORD dwY, + __in LPDIRECTDRAWSURFACE lpDDSrcSurface, + __in LPRECT lpSrcRect, + DWORD dwTrans) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->BltFast(dwX,dwY,lpDDSrcSurface,lpSrcRect,dwTrans); +} + + +STDMETHODIMP CAggDrawSurface::DeleteAttachedSurface(DWORD dwFlags, + __in LPDIRECTDRAWSURFACE lpDDSAttachedSurface) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->DeleteAttachedSurface(dwFlags,lpDDSAttachedSurface); +} + + +STDMETHODIMP CAggDrawSurface::EnumAttachedSurfaces(__in LPVOID lpContext, + __in LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->EnumAttachedSurfaces(lpContext,lpEnumSurfacesCallback); +} + + +STDMETHODIMP CAggDrawSurface::EnumOverlayZOrders(DWORD dwFlags, + __in LPVOID lpContext, + __in LPDDENUMSURFACESCALLBACK lpfnCallback) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->EnumOverlayZOrders(dwFlags,lpContext,lpfnCallback); +} + + +STDMETHODIMP CAggDrawSurface::Flip(__in LPDIRECTDRAWSURFACE lpDDSurfaceTargetOverride,DWORD dwFlags) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->Flip(lpDDSurfaceTargetOverride,dwFlags); +} + + +STDMETHODIMP CAggDrawSurface::GetAttachedSurface(__in LPDDSCAPS lpDDSCaps, + __deref_out LPDIRECTDRAWSURFACE *lplpDDAttachedSurface) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->GetAttachedSurface(lpDDSCaps,lplpDDAttachedSurface); +} + + +STDMETHODIMP CAggDrawSurface::GetBltStatus(DWORD dwFlags) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->GetBltStatus(dwFlags); +} + + +STDMETHODIMP CAggDrawSurface::GetCaps(__out LPDDSCAPS lpDDSCaps) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->GetCaps(lpDDSCaps); +} + + +STDMETHODIMP CAggDrawSurface::GetClipper(__deref_out LPDIRECTDRAWCLIPPER *lplpDDClipper) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->GetClipper(lplpDDClipper); +} + + +STDMETHODIMP CAggDrawSurface::GetColorKey(DWORD dwFlags,__out LPDDCOLORKEY lpDDColorKey) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->GetColorKey(dwFlags,lpDDColorKey); +} + + +STDMETHODIMP CAggDrawSurface::GetDC(__out HDC *lphDC) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->GetDC(lphDC); +} + + +STDMETHODIMP CAggDrawSurface::GetFlipStatus(DWORD dwFlags) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->GetFlipStatus(dwFlags); +} + + +STDMETHODIMP CAggDrawSurface::GetOverlayPosition(__out LPLONG lpdwX,__out LPLONG lpdwY) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->GetOverlayPosition(lpdwX,lpdwY); +} + + +STDMETHODIMP CAggDrawSurface::GetPalette(__deref_out LPDIRECTDRAWPALETTE *lplpDDPalette) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->GetPalette(lplpDDPalette); +} + + +STDMETHODIMP CAggDrawSurface::GetPixelFormat(__out LPDDPIXELFORMAT lpDDPixelFormat) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->GetPixelFormat(lpDDPixelFormat); +} + + +// A bit of a warning here: Our media samples in DirectShow aggregate on +// IDirectDraw and IDirectDrawSurface (ie are available through IMediaSample +// by QueryInterface). Unfortunately the underlying DirectDraw code cannot +// be aggregated so we have to use these classes. The snag is that when we +// call a different surface and pass in this interface as perhaps the source +// surface the call will fail because DirectDraw dereferences the pointer to +// get at its private data structures. Therefore we supply this workaround to give +// access to the real IDirectDraw surface. A filter can call GetSurfaceDesc +// and we will fill in the lpSurface pointer with the real underlying surface + +STDMETHODIMP CAggDrawSurface::GetSurfaceDesc(__out LPDDSURFACEDESC lpDDSurfaceDesc) +{ + ASSERT(m_pDirectDrawSurface); + + // First call down to the underlying DirectDraw + + HRESULT hr = m_pDirectDrawSurface->GetSurfaceDesc(lpDDSurfaceDesc); + if (FAILED(hr)) { + return hr; + } + + // Store the real DirectDrawSurface interface + lpDDSurfaceDesc->lpSurface = m_pDirectDrawSurface; + return hr; +} + + +STDMETHODIMP CAggDrawSurface::Initialize(__in LPDIRECTDRAW lpDD,__in LPDDSURFACEDESC lpDDSurfaceDesc) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->Initialize(lpDD,lpDDSurfaceDesc); +} + + +STDMETHODIMP CAggDrawSurface::IsLost() +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->IsLost(); +} + + +STDMETHODIMP CAggDrawSurface::Lock(__in LPRECT lpDestRect, + __inout LPDDSURFACEDESC lpDDSurfaceDesc, + DWORD dwFlags, + HANDLE hEvent) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->Lock(lpDestRect,lpDDSurfaceDesc,dwFlags,hEvent); +} + + +STDMETHODIMP CAggDrawSurface::ReleaseDC(HDC hDC) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->ReleaseDC(hDC); +} + + +STDMETHODIMP CAggDrawSurface::Restore() +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->Restore(); +} + + +STDMETHODIMP CAggDrawSurface::SetClipper(__in LPDIRECTDRAWCLIPPER lpDDClipper) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->SetClipper(lpDDClipper); +} + + +STDMETHODIMP CAggDrawSurface::SetColorKey(DWORD dwFlags,__in LPDDCOLORKEY lpDDColorKey) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->SetColorKey(dwFlags,lpDDColorKey); +} + + +STDMETHODIMP CAggDrawSurface::SetOverlayPosition(LONG dwX,LONG dwY) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->SetOverlayPosition(dwX,dwY); +} + + +STDMETHODIMP CAggDrawSurface::SetPalette(__in LPDIRECTDRAWPALETTE lpDDPalette) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->SetPalette(lpDDPalette); +} + + +STDMETHODIMP CAggDrawSurface::Unlock(__in LPVOID lpSurfaceData) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->Unlock(lpSurfaceData); +} + + +STDMETHODIMP CAggDrawSurface::UpdateOverlay(__in LPRECT lpSrcRect, + __in LPDIRECTDRAWSURFACE lpDDDestSurface, + __in LPRECT lpDestRect, + DWORD dwFlags, + __in LPDDOVERLAYFX lpDDOverlayFX) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->UpdateOverlay(lpSrcRect,lpDDDestSurface,lpDestRect,dwFlags,lpDDOverlayFX); +} + + +STDMETHODIMP CAggDrawSurface::UpdateOverlayDisplay(DWORD dwFlags) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->UpdateOverlayDisplay(dwFlags); +} + + +STDMETHODIMP CAggDrawSurface::UpdateOverlayZOrder(DWORD dwFlags,__in LPDIRECTDRAWSURFACE lpDDSReference) +{ + ASSERT(m_pDirectDrawSurface); + return m_pDirectDrawSurface->UpdateOverlayZOrder(dwFlags,lpDDSReference); +} + + +// DirectShow must work on multiple platforms. In particular, it also runs on +// Windows NT 3.51 which does not have DirectDraw capabilities. The filters +// cannot therefore link statically to the DirectDraw library. To make their +// lives that little bit easier we provide this class that manages loading +// and unloading the library and creating the initial IDirectDraw interface + +CLoadDirectDraw::CLoadDirectDraw() : + m_pDirectDraw(NULL), + m_hDirectDraw(NULL) +{ +} + + +// Destructor forces unload + +CLoadDirectDraw::~CLoadDirectDraw() +{ + ReleaseDirectDraw(); + + if (m_hDirectDraw) { + NOTE("Unloading library"); + FreeLibrary(m_hDirectDraw); + } +} + + +// We can't be sure that DirectDraw is always available so we can't statically +// link to the library. Therefore we load the library, get the function entry +// point addresses and call them to create the driver objects. We return S_OK +// if we manage to load DirectDraw correctly otherwise we return E_NOINTERFACE +// We initialise a DirectDraw instance by explicitely loading the library and +// calling GetProcAddress on the DirectDrawCreate entry point that it exports + +// On a multi monitor system, we can get the DirectDraw object for any +// monitor (device) with the optional szDevice parameter + +HRESULT CLoadDirectDraw::LoadDirectDraw(__in LPSTR szDevice) +{ + PDRAWCREATE pDrawCreate; + PDRAWENUM pDrawEnum; + LPDIRECTDRAWENUMERATEEXA pDrawEnumEx; + HRESULT hr = NOERROR; + + NOTE("Entering DoLoadDirectDraw"); + + // Is DirectDraw already loaded + + if (m_pDirectDraw) { + NOTE("Already loaded"); + ASSERT(m_hDirectDraw); + return NOERROR; + } + + // Make sure the library is available + + if(!m_hDirectDraw) + { + UINT ErrorMode = SetErrorMode(SEM_NOOPENFILEERRORBOX); + m_hDirectDraw = LoadLibrary(TEXT("DDRAW.DLL")); + SetErrorMode(ErrorMode); + + if (m_hDirectDraw == NULL) { + DbgLog((LOG_ERROR,1,TEXT("Can't load DDRAW.DLL"))); + NOTE("No library"); + return E_NOINTERFACE; + } + } + + // Get the DLL address for the creator function + + pDrawCreate = (PDRAWCREATE)GetProcAddress(m_hDirectDraw,"DirectDrawCreate"); + // force ANSI, we assume it + pDrawEnum = (PDRAWENUM)GetProcAddress(m_hDirectDraw,"DirectDrawEnumerateA"); + pDrawEnumEx = (LPDIRECTDRAWENUMERATEEXA)GetProcAddress(m_hDirectDraw, + "DirectDrawEnumerateExA"); + + // We don't NEED DirectDrawEnumerateEx, that's just for multimon stuff + if (pDrawCreate == NULL || pDrawEnum == NULL) { + DbgLog((LOG_ERROR,1,TEXT("Can't get functions: Create=%x Enum=%x"), + pDrawCreate, pDrawEnum)); + NOTE("No entry point"); + ReleaseDirectDraw(); + return E_NOINTERFACE; + } + + DbgLog((LOG_TRACE,3,TEXT("Creating DDraw for device %s"), + szDevice ? szDevice : "<NULL>")); + + // Create a DirectDraw display provider for this device, using the fancy + // multimon-aware version, if it exists + if (pDrawEnumEx) + m_pDirectDraw = DirectDrawCreateFromDeviceEx(szDevice, pDrawCreate, + pDrawEnumEx); + else + m_pDirectDraw = DirectDrawCreateFromDevice(szDevice, pDrawCreate, + pDrawEnum); + + if (m_pDirectDraw == NULL) { + DbgLog((LOG_ERROR,1,TEXT("Can't create DDraw"))); + NOTE("No instance"); + ReleaseDirectDraw(); + return E_NOINTERFACE; + } + return NOERROR; +} + + +// Called to release any DirectDraw provider we previously loaded. We may be +// called at any time especially when something goes horribly wrong and when +// we need to clean up before returning so we can't guarantee that all state +// variables are consistent so free only those really allocated allocated +// This should only be called once all reference counts have been released + +void CLoadDirectDraw::ReleaseDirectDraw() +{ + NOTE("Releasing DirectDraw driver"); + + // Release any DirectDraw provider interface + + if (m_pDirectDraw) { + NOTE("Releasing instance"); + m_pDirectDraw->Release(); + m_pDirectDraw = NULL; + } + +} + + +// Return NOERROR (S_OK) if DirectDraw has been loaded by this object + +HRESULT CLoadDirectDraw::IsDirectDrawLoaded() +{ + NOTE("Entering IsDirectDrawLoaded"); + + if (m_pDirectDraw == NULL) { + NOTE("DirectDraw not loaded"); + return S_FALSE; + } + return NOERROR; +} + + +// Return the IDirectDraw interface we look after + +LPDIRECTDRAW CLoadDirectDraw::GetDirectDraw() +{ + NOTE("Entering GetDirectDraw"); + + if (m_pDirectDraw == NULL) { + NOTE("No DirectDraw"); + return NULL; + } + + NOTE("Returning DirectDraw"); + m_pDirectDraw->AddRef(); + return m_pDirectDraw; +} + + +// Are we running on Direct Draw version 1? We need to find out as +// we rely on specific bug fixes in DirectDraw 2 for fullscreen playback. To +// find out, we simply see if it supports IDirectDraw2. Only version 2 and +// higher support this. + +BOOL CLoadDirectDraw::IsDirectDrawVersion1() +{ + + if (m_pDirectDraw == NULL) + return FALSE; + + IDirectDraw2 *p = NULL; + HRESULT hr = m_pDirectDraw->QueryInterface(IID_IDirectDraw2, (void **)&p); + if (p) + p->Release(); + if (hr == NOERROR) { + DbgLog((LOG_TRACE,3,TEXT("Direct Draw Version 2 or greater"))); + return FALSE; + } else { + DbgLog((LOG_TRACE,3,TEXT("Direct Draw Version 1"))); + return TRUE; + } +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/videoctl.h
Added
@@ -0,0 +1,168 @@ +//------------------------------------------------------------------------------ +// File: VideoCtl.h +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __VIDEOCTL__ +#define __VIDEOCTL__ + +// These help with property page implementations. The first can be used to +// load any string from a resource file. The buffer to load into is passed +// as an input parameter. The same buffer is the return value if the string +// was found otherwise it returns TEXT(""). The GetDialogSize is passed the +// resource ID of a dialog box and returns the size of it in screen pixels + +#define STR_MAX_LENGTH 256 +LPTSTR WINAPI StringFromResource(__out_ecount(STR_MAX_LENGTH) LPTSTR pBuffer, int iResourceID); + +#ifdef UNICODE +#define WideStringFromResource StringFromResource +LPSTR WINAPI StringFromResource(__out_ecount(STR_MAX_LENGTH) LPSTR pBuffer, int iResourceID); +#else +LPWSTR WINAPI WideStringFromResource(__out_ecount(STR_MAX_LENGTH) LPWSTR pBuffer, int iResourceID); +#endif + + +BOOL WINAPI GetDialogSize(int iResourceID, // Dialog box resource identifier + DLGPROC pDlgProc, // Pointer to dialog procedure + LPARAM lParam, // Any user data wanted in pDlgProc + __out SIZE *pResult);// Returns the size of dialog box + +// Class that aggregates an IDirectDraw interface + +class CAggDirectDraw : public IDirectDraw, public CUnknown +{ +protected: + + LPDIRECTDRAW m_pDirectDraw; + +public: + + DECLARE_IUNKNOWN + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,__deref_out void **ppv); + + // Constructor and destructor + + CAggDirectDraw(__in_opt LPCTSTR pName,__inout_opt LPUNKNOWN pUnk) : + CUnknown(pName,pUnk), + m_pDirectDraw(NULL) { }; + + virtual CAggDirectDraw::~CAggDirectDraw() { }; + + // Set the object we should be aggregating + void SetDirectDraw(__inout LPDIRECTDRAW pDirectDraw) { + m_pDirectDraw = pDirectDraw; + } + + // IDirectDraw methods + + STDMETHODIMP Compact(); + STDMETHODIMP CreateClipper(DWORD dwFlags,__deref_out LPDIRECTDRAWCLIPPER *lplpDDClipper,__inout_opt IUnknown *pUnkOuter); + STDMETHODIMP CreatePalette(DWORD dwFlags,__in LPPALETTEENTRY lpColorTable,__deref_out LPDIRECTDRAWPALETTE *lplpDDPalette,__inout_opt IUnknown *pUnkOuter); + STDMETHODIMP CreateSurface(__in LPDDSURFACEDESC lpDDSurfaceDesc,__deref_out LPDIRECTDRAWSURFACE *lplpDDSurface,__inout_opt IUnknown *pUnkOuter); + STDMETHODIMP DuplicateSurface(__in LPDIRECTDRAWSURFACE lpDDSurface,__deref_out LPDIRECTDRAWSURFACE *lplpDupDDSurface); + STDMETHODIMP EnumDisplayModes(DWORD dwSurfaceDescCount,__in LPDDSURFACEDESC lplpDDSurfaceDescList,__in LPVOID lpContext,__in LPDDENUMMODESCALLBACK lpEnumCallback); + STDMETHODIMP EnumSurfaces(DWORD dwFlags,__in LPDDSURFACEDESC lpDDSD,__in LPVOID lpContext,__in LPDDENUMSURFACESCALLBACK lpEnumCallback); + STDMETHODIMP FlipToGDISurface(); + STDMETHODIMP GetCaps(__out LPDDCAPS lpDDDriverCaps,__out LPDDCAPS lpDDHELCaps); + STDMETHODIMP GetDisplayMode(__out LPDDSURFACEDESC lpDDSurfaceDesc); + STDMETHODIMP GetFourCCCodes(__inout LPDWORD lpNumCodes,__out_ecount(*lpNumCodes) LPDWORD lpCodes); + STDMETHODIMP GetGDISurface(__deref_out LPDIRECTDRAWSURFACE *lplpGDIDDSurface); + STDMETHODIMP GetMonitorFrequency(__out LPDWORD lpdwFrequency); + STDMETHODIMP GetScanLine(__out LPDWORD lpdwScanLine); + STDMETHODIMP GetVerticalBlankStatus(__out LPBOOL lpblsInVB); + STDMETHODIMP Initialize(__in GUID *lpGUID); + STDMETHODIMP RestoreDisplayMode(); + STDMETHODIMP SetCooperativeLevel(HWND hWnd,DWORD dwFlags); + STDMETHODIMP SetDisplayMode(DWORD dwWidth,DWORD dwHeight,DWORD dwBpp); + STDMETHODIMP WaitForVerticalBlank(DWORD dwFlags,HANDLE hEvent); +}; + + +// Class that aggregates an IDirectDrawSurface interface + +class CAggDrawSurface : public IDirectDrawSurface, public CUnknown +{ +protected: + + LPDIRECTDRAWSURFACE m_pDirectDrawSurface; + +public: + + DECLARE_IUNKNOWN + STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,__deref_out void **ppv); + + // Constructor and destructor + + CAggDrawSurface(__in_opt LPCTSTR pName,__inout_opt LPUNKNOWN pUnk) : + CUnknown(pName,pUnk), + m_pDirectDrawSurface(NULL) { }; + + virtual ~CAggDrawSurface() { }; + + // Set the object we should be aggregating + void SetDirectDrawSurface(__inout LPDIRECTDRAWSURFACE pDirectDrawSurface) { + m_pDirectDrawSurface = pDirectDrawSurface; + } + + // IDirectDrawSurface methods + + STDMETHODIMP AddAttachedSurface(__in LPDIRECTDRAWSURFACE lpDDSAttachedSurface); + STDMETHODIMP AddOverlayDirtyRect(__in LPRECT lpRect); + STDMETHODIMP Blt(__in LPRECT lpDestRect,__in LPDIRECTDRAWSURFACE lpDDSrcSurface,__in LPRECT lpSrcRect,DWORD dwFlags,__in LPDDBLTFX lpDDBltFx); + STDMETHODIMP BltBatch(__in_ecount(dwCount) LPDDBLTBATCH lpDDBltBatch,DWORD dwCount,DWORD dwFlags); + STDMETHODIMP BltFast(DWORD dwX,DWORD dwY,__in LPDIRECTDRAWSURFACE lpDDSrcSurface,__in LPRECT lpSrcRect,DWORD dwTrans); + STDMETHODIMP DeleteAttachedSurface(DWORD dwFlags,__in LPDIRECTDRAWSURFACE lpDDSAttachedSurface); + STDMETHODIMP EnumAttachedSurfaces(__in LPVOID lpContext,__in LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback); + STDMETHODIMP EnumOverlayZOrders(DWORD dwFlags,__in LPVOID lpContext,__in LPDDENUMSURFACESCALLBACK lpfnCallback); + STDMETHODIMP Flip(__in LPDIRECTDRAWSURFACE lpDDSurfaceTargetOverride,DWORD dwFlags); + STDMETHODIMP GetAttachedSurface(__in LPDDSCAPS lpDDSCaps,__deref_out LPDIRECTDRAWSURFACE *lplpDDAttachedSurface); + STDMETHODIMP GetBltStatus(DWORD dwFlags); + STDMETHODIMP GetCaps(__out LPDDSCAPS lpDDSCaps); + STDMETHODIMP GetClipper(__deref_out LPDIRECTDRAWCLIPPER *lplpDDClipper); + STDMETHODIMP GetColorKey(DWORD dwFlags,__out LPDDCOLORKEY lpDDColorKey); + STDMETHODIMP GetDC(__out HDC *lphDC); + STDMETHODIMP GetFlipStatus(DWORD dwFlags); + STDMETHODIMP GetOverlayPosition(__out LPLONG lpdwX,__out LPLONG lpdwY); + STDMETHODIMP GetPalette(__deref_out LPDIRECTDRAWPALETTE *lplpDDPalette); + STDMETHODIMP GetPixelFormat(__out LPDDPIXELFORMAT lpDDPixelFormat); + STDMETHODIMP GetSurfaceDesc(__out LPDDSURFACEDESC lpDDSurfaceDesc); + STDMETHODIMP Initialize(__in LPDIRECTDRAW lpDD,__in LPDDSURFACEDESC lpDDSurfaceDesc); + STDMETHODIMP IsLost(); + STDMETHODIMP Lock(__in LPRECT lpDestRect,__inout LPDDSURFACEDESC lpDDSurfaceDesc,DWORD dwFlags,HANDLE hEvent); + STDMETHODIMP ReleaseDC(HDC hDC); + STDMETHODIMP Restore(); + STDMETHODIMP SetClipper(__in LPDIRECTDRAWCLIPPER lpDDClipper); + STDMETHODIMP SetColorKey(DWORD dwFlags,__in LPDDCOLORKEY lpDDColorKey); + STDMETHODIMP SetOverlayPosition(LONG dwX,LONG dwY); + STDMETHODIMP SetPalette(__in LPDIRECTDRAWPALETTE lpDDPalette); + STDMETHODIMP Unlock(__in LPVOID lpSurfaceData); + STDMETHODIMP UpdateOverlay(__in LPRECT lpSrcRect,__in LPDIRECTDRAWSURFACE lpDDDestSurface,__in LPRECT lpDestRect,DWORD dwFlags,__in LPDDOVERLAYFX lpDDOverlayFX); + STDMETHODIMP UpdateOverlayDisplay(DWORD dwFlags); + STDMETHODIMP UpdateOverlayZOrder(DWORD dwFlags,__in LPDIRECTDRAWSURFACE lpDDSReference); +}; + + +class CLoadDirectDraw +{ + LPDIRECTDRAW m_pDirectDraw; // The DirectDraw driver instance + HINSTANCE m_hDirectDraw; // Handle to the loaded library + +public: + + CLoadDirectDraw(); + ~CLoadDirectDraw(); + + HRESULT LoadDirectDraw(__in LPSTR szDevice); + void ReleaseDirectDraw(); + HRESULT IsDirectDrawLoaded(); + LPDIRECTDRAW GetDirectDraw(); + BOOL IsDirectDrawVersion1(); +}; + +#endif // __VIDEOCTL__ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/vtrans.cpp
Added
@@ -0,0 +1,468 @@ +//------------------------------------------------------------------------------ +// File: Vtrans.cpp +// +// Desc: DirectShow base classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include <measure.h> +// #include <vtransfr.h> // now in precomp file streams.h + +CVideoTransformFilter::CVideoTransformFilter + ( __in_opt LPCTSTR pName, __inout_opt LPUNKNOWN pUnk, REFCLSID clsid) + : CTransformFilter(pName, pUnk, clsid) + , m_itrLate(0) + , m_nKeyFramePeriod(0) // No QM until we see at least 2 key frames + , m_nFramesSinceKeyFrame(0) + , m_bSkipping(FALSE) + , m_tDecodeStart(0) + , m_itrAvgDecode(300000) // 30mSec - probably allows skipping + , m_bQualityChanged(FALSE) +{ +#ifdef PERF + RegisterPerfId(); +#endif // PERF +} + + +CVideoTransformFilter::~CVideoTransformFilter() +{ + // nothing to do +} + + +// Reset our quality management state + +HRESULT CVideoTransformFilter::StartStreaming() +{ + m_itrLate = 0; + m_nKeyFramePeriod = 0; // No QM until we see at least 2 key frames + m_nFramesSinceKeyFrame = 0; + m_bSkipping = FALSE; + m_tDecodeStart = 0; + m_itrAvgDecode = 300000; // 30mSec - probably allows skipping + m_bQualityChanged = FALSE; + m_bSampleSkipped = FALSE; + return NOERROR; +} + + +// Overriden to reset quality management information + +HRESULT CVideoTransformFilter::EndFlush() +{ + { + // Synchronize + CAutoLock lck(&m_csReceive); + + // Reset our stats + // + // Note - we don't want to call derived classes here, + // we only want to reset our internal variables and this + // is a convenient way to do it + CVideoTransformFilter::StartStreaming(); + } + return CTransformFilter::EndFlush(); +} + + +HRESULT CVideoTransformFilter::AbortPlayback(HRESULT hr) +{ + NotifyEvent(EC_ERRORABORT, hr, 0); + m_pOutput->DeliverEndOfStream(); + return hr; +} + + +// Receive() +// +// Accept a sample from upstream, decide whether to process it +// or drop it. If we process it then get a buffer from the +// allocator of the downstream connection, transform it into the +// new buffer and deliver it to the downstream filter. +// If we decide not to process it then we do not get a buffer. + +// Remember that although this code will notice format changes coming into +// the input pin, it will NOT change its output format if that results +// in the filter needing to make a corresponding output format change. Your +// derived filter will have to take care of that. (eg. a palette change if +// the input and output is an 8 bit format). If the input sample is discarded +// and nothing is sent out for this Receive, please remember to put the format +// change on the first output sample that you actually do send. +// If your filter will produce the same output type even when the input type +// changes, then this base class code will do everything you need. + +HRESULT CVideoTransformFilter::Receive(IMediaSample *pSample) +{ + // If the next filter downstream is the video renderer, then it may + // be able to operate in DirectDraw mode which saves copying the data + // and gives higher performance. In that case the buffer which we + // get from GetDeliveryBuffer will be a DirectDraw buffer, and + // drawing into this buffer draws directly onto the display surface. + // This means that any waiting for the correct time to draw occurs + // during GetDeliveryBuffer, and that once the buffer is given to us + // the video renderer will count it in its statistics as a frame drawn. + // This means that any decision to drop the frame must be taken before + // calling GetDeliveryBuffer. + + ASSERT(CritCheckIn(&m_csReceive)); + AM_MEDIA_TYPE *pmtOut, *pmt; +#ifdef DEBUG + FOURCCMap fccOut; +#endif + HRESULT hr; + ASSERT(pSample); + IMediaSample * pOutSample; + + // If no output pin to deliver to then no point sending us data + ASSERT (m_pOutput != NULL) ; + + // The source filter may dynamically ask us to start transforming from a + // different media type than the one we're using now. If we don't, we'll + // draw garbage. (typically, this is a palette change in the movie, + // but could be something more sinister like the compression type changing, + // or even the video size changing) + +#define rcS1 ((VIDEOINFOHEADER *)(pmt->pbFormat))->rcSource +#define rcT1 ((VIDEOINFOHEADER *)(pmt->pbFormat))->rcTarget + + pSample->GetMediaType(&pmt); + if (pmt != NULL && pmt->pbFormat != NULL) { + + // spew some debug output + ASSERT(!IsEqualGUID(pmt->majortype, GUID_NULL)); +#ifdef DEBUG + fccOut.SetFOURCC(&pmt->subtype); + LONG lCompression = HEADER(pmt->pbFormat)->biCompression; + LONG lBitCount = HEADER(pmt->pbFormat)->biBitCount; + LONG lStride = (HEADER(pmt->pbFormat)->biWidth * lBitCount + 7) / 8; + lStride = (lStride + 3) & ~3; + DbgLog((LOG_TRACE,3,TEXT("*Changing input type on the fly to"))); + DbgLog((LOG_TRACE,3,TEXT("FourCC: %lx Compression: %lx BitCount: %ld"), + fccOut.GetFOURCC(), lCompression, lBitCount)); + DbgLog((LOG_TRACE,3,TEXT("biHeight: %ld rcDst: (%ld, %ld, %ld, %ld)"), + HEADER(pmt->pbFormat)->biHeight, + rcT1.left, rcT1.top, rcT1.right, rcT1.bottom)); + DbgLog((LOG_TRACE,3,TEXT("rcSrc: (%ld, %ld, %ld, %ld) Stride: %ld"), + rcS1.left, rcS1.top, rcS1.right, rcS1.bottom, + lStride)); +#endif + + // now switch to using the new format. I am assuming that the + // derived filter will do the right thing when its media type is + // switched and streaming is restarted. + + StopStreaming(); + m_pInput->CurrentMediaType() = *pmt; + DeleteMediaType(pmt); + // if this fails, playback will stop, so signal an error + hr = StartStreaming(); + if (FAILED(hr)) { + return AbortPlayback(hr); + } + } + + // Now that we have noticed any format changes on the input sample, it's + // OK to discard it. + + if (ShouldSkipFrame(pSample)) { + MSR_NOTE(m_idSkip); + m_bSampleSkipped = TRUE; + return NOERROR; + } + + // Set up the output sample + hr = InitializeOutputSample(pSample, &pOutSample); + + if (FAILED(hr)) { + return hr; + } + + m_bSampleSkipped = FALSE; + + // The renderer may ask us to on-the-fly to start transforming to a + // different format. If we don't obey it, we'll draw garbage + +#define rcS ((VIDEOINFOHEADER *)(pmtOut->pbFormat))->rcSource +#define rcT ((VIDEOINFOHEADER *)(pmtOut->pbFormat))->rcTarget + + pOutSample->GetMediaType(&pmtOut); + if (pmtOut != NULL && pmtOut->pbFormat != NULL) { + + // spew some debug output + ASSERT(!IsEqualGUID(pmtOut->majortype, GUID_NULL)); +#ifdef DEBUG + fccOut.SetFOURCC(&pmtOut->subtype); + LONG lCompression = HEADER(pmtOut->pbFormat)->biCompression; + LONG lBitCount = HEADER(pmtOut->pbFormat)->biBitCount; + LONG lStride = (HEADER(pmtOut->pbFormat)->biWidth * lBitCount + 7) / 8; + lStride = (lStride + 3) & ~3; + DbgLog((LOG_TRACE,3,TEXT("*Changing output type on the fly to"))); + DbgLog((LOG_TRACE,3,TEXT("FourCC: %lx Compression: %lx BitCount: %ld"), + fccOut.GetFOURCC(), lCompression, lBitCount)); + DbgLog((LOG_TRACE,3,TEXT("biHeight: %ld rcDst: (%ld, %ld, %ld, %ld)"), + HEADER(pmtOut->pbFormat)->biHeight, + rcT.left, rcT.top, rcT.right, rcT.bottom)); + DbgLog((LOG_TRACE,3,TEXT("rcSrc: (%ld, %ld, %ld, %ld) Stride: %ld"), + rcS.left, rcS.top, rcS.right, rcS.bottom, + lStride)); +#endif + + // now switch to using the new format. I am assuming that the + // derived filter will do the right thing when its media type is + // switched and streaming is restarted. + + StopStreaming(); + m_pOutput->CurrentMediaType() = *pmtOut; + DeleteMediaType(pmtOut); + hr = StartStreaming(); + + if (SUCCEEDED(hr)) { + // a new format, means a new empty buffer, so wait for a keyframe + // before passing anything on to the renderer. + // !!! a keyframe may never come, so give up after 30 frames + DbgLog((LOG_TRACE,3,TEXT("Output format change means we must wait for a keyframe"))); + m_nWaitForKey = 30; + + // if this fails, playback will stop, so signal an error + } else { + + // Must release the sample before calling AbortPlayback + // because we might be holding the win16 lock or + // ddraw lock + pOutSample->Release(); + AbortPlayback(hr); + return hr; + } + } + + // After a discontinuity, we need to wait for the next key frame + if (pSample->IsDiscontinuity() == S_OK) { + DbgLog((LOG_TRACE,3,TEXT("Non-key discontinuity - wait for keyframe"))); + m_nWaitForKey = 30; + } + + // Start timing the transform (and log it if PERF is defined) + + if (SUCCEEDED(hr)) { + m_tDecodeStart = timeGetTime(); + MSR_START(m_idTransform); + + // have the derived class transform the data + hr = Transform(pSample, pOutSample); + + // Stop the clock (and log it if PERF is defined) + MSR_STOP(m_idTransform); + m_tDecodeStart = timeGetTime()-m_tDecodeStart; + m_itrAvgDecode = m_tDecodeStart*(10000/16) + 15*(m_itrAvgDecode/16); + + // Maybe we're waiting for a keyframe still? + if (m_nWaitForKey) + m_nWaitForKey--; + if (m_nWaitForKey && pSample->IsSyncPoint() == S_OK) + m_nWaitForKey = FALSE; + + // if so, then we don't want to pass this on to the renderer + if (m_nWaitForKey && hr == NOERROR) { + DbgLog((LOG_TRACE,3,TEXT("still waiting for a keyframe"))); + hr = S_FALSE; + } + } + + if (FAILED(hr)) { + DbgLog((LOG_TRACE,1,TEXT("Error from video transform"))); + } else { + // the Transform() function can return S_FALSE to indicate that the + // sample should not be delivered; we only deliver the sample if it's + // really S_OK (same as NOERROR, of course.) + // Try not to return S_FALSE to a direct draw buffer (it's wasteful) + // Try to take the decision earlier - before you get it. + + if (hr == NOERROR) { + hr = m_pOutput->Deliver(pOutSample); + } else { + // S_FALSE returned from Transform is a PRIVATE agreement + // We should return NOERROR from Receive() in this case because returning S_FALSE + // from Receive() means that this is the end of the stream and no more data should + // be sent. + if (S_FALSE == hr) { + + // We must Release() the sample before doing anything + // like calling the filter graph because having the + // sample means we may have the DirectDraw lock + // (== win16 lock on some versions) + pOutSample->Release(); + m_bSampleSkipped = TRUE; + if (!m_bQualityChanged) { + m_bQualityChanged = TRUE; + NotifyEvent(EC_QUALITY_CHANGE,0,0); + } + return NOERROR; + } + } + } + + // release the output buffer. If the connected pin still needs it, + // it will have addrefed it itself. + pOutSample->Release(); + ASSERT(CritCheckIn(&m_csReceive)); + + return hr; +} + + + +BOOL CVideoTransformFilter::ShouldSkipFrame( IMediaSample * pIn) +{ + REFERENCE_TIME trStart, trStopAt; + HRESULT hr = pIn->GetTime(&trStart, &trStopAt); + + // Don't skip frames with no timestamps + if (hr != S_OK) + return FALSE; + + int itrFrame = (int)(trStopAt - trStart); // frame duration + + if(S_OK==pIn->IsSyncPoint()) { + MSR_INTEGER(m_idFrameType, 1); + if ( m_nKeyFramePeriod < m_nFramesSinceKeyFrame ) { + // record the max + m_nKeyFramePeriod = m_nFramesSinceKeyFrame; + } + m_nFramesSinceKeyFrame = 0; + m_bSkipping = FALSE; + } else { + MSR_INTEGER(m_idFrameType, 2); + if ( m_nFramesSinceKeyFrame>m_nKeyFramePeriod + && m_nKeyFramePeriod>0 + ) { + // We haven't seen the key frame yet, but we were clearly being + // overoptimistic about how frequent they are. + m_nKeyFramePeriod = m_nFramesSinceKeyFrame; + } + } + + + // Whatever we might otherwise decide, + // if we are taking only a small fraction of the required frame time to decode + // then any quality problems are actually coming from somewhere else. + // Could be a net problem at the source for instance. In this case there's + // no point in us skipping frames here. + if (m_itrAvgDecode*4>itrFrame) { + + // Don't skip unless we are at least a whole frame late. + // (We would skip B frames if more than 1/2 frame late, but they're safe). + if ( m_itrLate > itrFrame ) { + + // Don't skip unless the anticipated key frame would be no more than + // 1 frame early. If the renderer has not been waiting (we *guess* + // it hasn't because we're late) then it will allow frames to be + // played early by up to a frame. + + // Let T = Stream time from now to anticipated next key frame + // = (frame duration) * (KeyFramePeriod - FramesSinceKeyFrame) + // So we skip if T - Late < one frame i.e. + // (duration) * (freq - FramesSince) - Late < duration + // or (duration) * (freq - FramesSince - 1) < Late + + // We don't dare skip until we have seen some key frames and have + // some idea how often they occur and they are reasonably frequent. + if (m_nKeyFramePeriod>0) { + // It would be crazy - but we could have a stream with key frames + // a very long way apart - and if they are further than about + // 3.5 minutes apart then we could get arithmetic overflow in + // reference time units. Therefore we switch to mSec at this point + int it = (itrFrame/10000) + * (m_nKeyFramePeriod-m_nFramesSinceKeyFrame - 1); + MSR_INTEGER(m_idTimeTillKey, it); + + // For debug - might want to see the details - dump them as scratch pad +#ifdef VTRANSPERF + MSR_INTEGER(0, itrFrame); + MSR_INTEGER(0, m_nFramesSinceKeyFrame); + MSR_INTEGER(0, m_nKeyFramePeriod); +#endif + if (m_itrLate/10000 > it) { + m_bSkipping = TRUE; + // Now we are committed. Once we start skipping, we + // cannot stop until we hit a key frame. + } else { +#ifdef VTRANSPERF + MSR_INTEGER(0, 777770); // not near enough to next key +#endif + } + } else { +#ifdef VTRANSPERF + MSR_INTEGER(0, 777771); // Next key not predictable +#endif + } + } else { +#ifdef VTRANSPERF + MSR_INTEGER(0, 777772); // Less than one frame late + MSR_INTEGER(0, m_itrLate); + MSR_INTEGER(0, itrFrame); +#endif + } + } else { +#ifdef VTRANSPERF + MSR_INTEGER(0, 777773); // Decode time short - not not worth skipping + MSR_INTEGER(0, m_itrAvgDecode); + MSR_INTEGER(0, itrFrame); +#endif + } + + ++m_nFramesSinceKeyFrame; + + if (m_bSkipping) { + // We will count down the lateness as we skip each frame. + // We re-assess each frame. The key frame might not arrive when expected. + // We reset m_itrLate if we get a new Quality message, but actually that's + // not likely because we're not sending frames on to the Renderer. In + // fact if we DID get another one it would mean that there's a long + // pipe between us and the renderer and we might need an altogether + // better strategy to avoid hunting! + m_itrLate = m_itrLate - itrFrame; + } + + MSR_INTEGER(m_idLate, (int)m_itrLate/10000 ); // Note how late we think we are + if (m_bSkipping) { + if (!m_bQualityChanged) { + m_bQualityChanged = TRUE; + NotifyEvent(EC_QUALITY_CHANGE,0,0); + } + } + return m_bSkipping; +} + + +HRESULT CVideoTransformFilter::AlterQuality(Quality q) +{ + // to reduce the amount of 64 bit arithmetic, m_itrLate is an int. + // +, -, >, == etc are not too bad, but * and / are painful. + if (m_itrLate>300000000) { + // Avoid overflow and silliness - more than 30 secs late is already silly + m_itrLate = 300000000; + } else { + m_itrLate = (int)q.Late; + } + // We ignore the other fields + + // We're actually not very good at handling this. In non-direct draw mode + // most of the time can be spent in the renderer which can skip any frame. + // In that case we'd rather the renderer handled things. + // Nevertheless we will keep an eye on it and if we really start getting + // a very long way behind then we will actually skip - but we'll still tell + // the renderer (or whoever is downstream) that they should handle quality. + + return E_FAIL; // Tell the renderer to do his thing. + +} + + + +// This will avoid several hundred useless warnings if compiled -W4 by MS VC++ v4 +#pragma warning(disable:4514) +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/vtrans.h
Added
@@ -0,0 +1,143 @@ +//------------------------------------------------------------------------------ +// File: VTrans.h +// +// Desc: DirectShow base classes - defines a video transform class. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// This class is derived from CTransformFilter, but is specialised to handle +// the requirements of video quality control by frame dropping. +// This is a non-in-place transform, (i.e. it copies the data) such as a decoder. + +class CVideoTransformFilter : public CTransformFilter +{ + public: + + CVideoTransformFilter(__in_opt LPCTSTR, __inout_opt LPUNKNOWN, REFCLSID clsid); + ~CVideoTransformFilter(); + HRESULT EndFlush(); + + // ================================================================= + // ----- override these bits --------------------------------------- + // ================================================================= + // The following methods are in CTransformFilter which is inherited. + // They are mentioned here for completeness + // + // These MUST be supplied in a derived class + // + // NOTE: + // virtual HRESULT Transform(IMediaSample * pIn, IMediaSample *pOut); + // virtual HRESULT CheckInputType(const CMediaType* mtIn) PURE; + // virtual HRESULT CheckTransform + // (const CMediaType* mtIn, const CMediaType* mtOut) PURE; + // static CCOMObject * CreateInstance(LPUNKNOWN, HRESULT *); + // virtual HRESULT DecideBufferSize + // (IMemAllocator * pAllocator, ALLOCATOR_PROPERTIES *pprop) PURE; + // virtual HRESULT GetMediaType(int iPosition, CMediaType *pMediaType) PURE; + // + // These MAY also be overridden + // + // virtual HRESULT StopStreaming(); + // virtual HRESULT SetMediaType(PIN_DIRECTION direction,const CMediaType *pmt); + // virtual HRESULT CheckConnect(PIN_DIRECTION dir,IPin *pPin); + // virtual HRESULT BreakConnect(PIN_DIRECTION dir); + // virtual HRESULT CompleteConnect(PIN_DIRECTION direction,IPin *pReceivePin); + // virtual HRESULT EndOfStream(void); + // virtual HRESULT BeginFlush(void); + // virtual HRESULT EndFlush(void); + // virtual HRESULT NewSegment + // (REFERENCE_TIME tStart,REFERENCE_TIME tStop,double dRate); +#ifdef PERF + + // If you override this - ensure that you register all these ids + // as well as any of your own, + virtual void RegisterPerfId() { + m_idSkip = MSR_REGISTER(TEXT("Video Transform Skip frame")); + m_idFrameType = MSR_REGISTER(TEXT("Video transform frame type")); + m_idLate = MSR_REGISTER(TEXT("Video Transform Lateness")); + m_idTimeTillKey = MSR_REGISTER(TEXT("Video Transform Estd. time to next key")); + CTransformFilter::RegisterPerfId(); + } +#endif + + protected: + + // =========== QUALITY MANAGEMENT IMPLEMENTATION ======================== + // Frames are assumed to come in three types: + // Type 1: an AVI key frame or an MPEG I frame. + // This frame can be decoded with no history. + // Dropping this frame means that no further frame can be decoded + // until the next type 1 frame. + // Type 1 frames are sync points. + // Type 2: an AVI non-key frame or an MPEG P frame. + // This frame cannot be decoded unless the previous type 1 frame was + // decoded and all type 2 frames since have been decoded. + // Dropping this frame means that no further frame can be decoded + // until the next type 1 frame. + // Type 3: An MPEG B frame. + // This frame cannot be decoded unless the previous type 1 or 2 frame + // has been decoded AND the subsequent type 1 or 2 frame has also + // been decoded. (This requires decoding the frames out of sequence). + // Dropping this frame affects no other frames. This implementation + // does not allow for these. All non-sync-point frames are treated + // as being type 2. + // + // The spacing of frames of type 1 in a file is not guaranteed. There MUST + // be a type 1 frame at (well, near) the start of the file in order to start + // decoding at all. After that there could be one every half second or so, + // there could be one at the start of each scene (aka "cut", "shot") or + // there could be no more at all. + // If there is only a single type 1 frame then NO FRAMES CAN BE DROPPED + // without losing all the rest of the movie. There is no way to tell whether + // this is the case, so we find that we are in the gambling business. + // To try to improve the odds, we record the greatest interval between type 1s + // that we have seen and we bet on things being no worse than this in the + // future. + + // You can tell if it's a type 1 frame by calling IsSyncPoint(). + // there is no architected way to test for a type 3, so you should override + // the quality management here if you have B-frames. + + int m_nKeyFramePeriod; // the largest observed interval between type 1 frames + // 1 means every frame is type 1, 2 means every other. + + int m_nFramesSinceKeyFrame; // Used to count frames since the last type 1. + // becomes the new m_nKeyFramePeriod if greater. + + BOOL m_bSkipping; // we are skipping to the next type 1 frame + +#ifdef PERF + int m_idFrameType; // MSR id Frame type. 1=Key, 2="non-key" + int m_idSkip; // MSR id skipping + int m_idLate; // MSR id lateness + int m_idTimeTillKey; // MSR id for guessed time till next key frame. +#endif + + virtual HRESULT StartStreaming(); + + HRESULT AbortPlayback(HRESULT hr); // if something bad happens + + HRESULT Receive(IMediaSample *pSample); + + HRESULT AlterQuality(Quality q); + + BOOL ShouldSkipFrame(IMediaSample * pIn); + + int m_itrLate; // lateness from last Quality message + // (this overflows at 214 secs late). + int m_tDecodeStart; // timeGetTime when decode started. + int m_itrAvgDecode; // Average decode time in reference units. + + BOOL m_bNoSkip; // debug - no skipping. + + // We send an EC_QUALITY_CHANGE notification to the app if we have to degrade. + // We send one when we start degrading, not one for every frame, this means + // we track whether we've sent one yet. + BOOL m_bQualityChanged; + + // When non-zero, don't pass anything to renderer until next keyframe + // If there are few keys, give up and eventually draw something + int m_nWaitForKey; +};
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/winctrl.cpp
Added
@@ -0,0 +1,2081 @@ +//------------------------------------------------------------------------------ +// File: WinCtrl.cpp +// +// Desc: DirectShow base classes - implements video control interface class. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include <intsafe.h> +#include <checkbmi.h> + +// The control interface methods require us to be connected + +#define CheckConnected(pin,code) \ +{ \ + if (pin == NULL) { \ + ASSERT(!TEXT("Pin not set")); \ + } else if (pin->IsConnected() == FALSE) { \ + return (code); \ + } \ +} + +// This checks to see whether the window has a drain. An application can in +// most environments set the owner/parent of windows so that they appear in +// a compound document context (for example). In this case, the application +// would probably like to be told of any keyboard/mouse messages. Therefore +// we pass these messages on untranslated, returning TRUE if we're successful + +BOOL WINAPI PossiblyEatMessage(HWND hwndDrain, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if (hwndDrain != NULL && !InSendMessage()) + { + switch (uMsg) + { + case WM_CHAR: + case WM_DEADCHAR: + case WM_KEYDOWN: + case WM_KEYUP: + case WM_LBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_MBUTTONDBLCLK: + case WM_MBUTTONDOWN: + case WM_MBUTTONUP: + case WM_MOUSEACTIVATE: + case WM_MOUSEMOVE: + // If we pass this on we don't get any mouse clicks + //case WM_NCHITTEST: + case WM_NCLBUTTONDBLCLK: + case WM_NCLBUTTONDOWN: + case WM_NCLBUTTONUP: + case WM_NCMBUTTONDBLCLK: + case WM_NCMBUTTONDOWN: + case WM_NCMBUTTONUP: + case WM_NCMOUSEMOVE: + case WM_NCRBUTTONDBLCLK: + case WM_NCRBUTTONDOWN: + case WM_NCRBUTTONUP: + case WM_RBUTTONDBLCLK: + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + case WM_SYSCHAR: + case WM_SYSDEADCHAR: + case WM_SYSKEYDOWN: + case WM_SYSKEYUP: + + DbgLog((LOG_TRACE, 2, TEXT("Forwarding %x to drain"))); + PostMessage(hwndDrain, uMsg, wParam, lParam); + + return TRUE; + } + } + return FALSE; +} + + +// This class implements the IVideoWindow control functions (dual interface) +// we support a large number of properties and methods designed to allow the +// client (whether it be an automation controller or a C/C++ application) to +// set and get a number of window related properties such as it's position. +// We also support some methods that duplicate the properties but provide a +// more direct and efficient mechanism as many values may be changed in one + +CBaseControlWindow::CBaseControlWindow( + __inout CBaseFilter *pFilter, // Owning filter + __in CCritSec *pInterfaceLock, // Locking object + __in_opt LPCTSTR pName, // Object description + __inout_opt LPUNKNOWN pUnk, // Normal COM ownership + __inout HRESULT *phr) : // OLE return code + + CBaseVideoWindow(pName,pUnk), + m_pInterfaceLock(pInterfaceLock), + m_hwndOwner(NULL), + m_hwndDrain(NULL), + m_bAutoShow(TRUE), + m_pFilter(pFilter), + m_bCursorHidden(FALSE), + m_pPin(NULL) +{ + ASSERT(m_pFilter); + ASSERT(m_pInterfaceLock); + ASSERT(phr); + m_BorderColour = VIDEO_COLOUR; +} + + +// Set the title caption on the base window, we don't do any field checking +// as we really don't care what title they intend to have. We can always get +// it back again later with GetWindowText. The only other complication is to +// do the necessary string conversions between ANSI and OLE Unicode strings + +STDMETHODIMP CBaseControlWindow::put_Caption(__in BSTR strCaption) +{ + CheckPointer((PVOID)strCaption,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); +#ifdef UNICODE + SetWindowText(m_hwnd, strCaption); +#else + CHAR CaptionCAPTION; + + WideCharToMultiByte(CP_ACP,0,strCaption,-1,Caption,CAPTION,NULL,NULL); + SetWindowText(m_hwnd, Caption); +#endif + return NOERROR; +} + + +// Get the current base window title caption, once again we do no real field +// checking. We allocate a string for the window title to be filled in with +// which ensures the interface doesn't fiddle around with getting memory. A +// BSTR is a normal C string with the length at position (-1), we use the +// WriteBSTR helper function to create the caption to try and avoid OLE32 + +STDMETHODIMP CBaseControlWindow::get_Caption(__out BSTR *pstrCaption) +{ + CheckPointer(pstrCaption,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + WCHAR WideCaptionCAPTION; + +#ifdef UNICODE + GetWindowText(m_hwnd,WideCaption,CAPTION); +#else + // Convert the ASCII caption to a UNICODE string + + TCHAR CaptionCAPTION; + GetWindowText(m_hwnd,Caption,CAPTION); + MultiByteToWideChar(CP_ACP,0,Caption,-1,WideCaption,CAPTION); +#endif + return WriteBSTR(pstrCaption,WideCaption); +} + + +// Set the window style using GWL_EXSTYLE + +STDMETHODIMP CBaseControlWindow::put_WindowStyleEx(long WindowStyleEx) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + + // Should we be taking off WS_EX_TOPMOST + + if (GetWindowLong(m_hwnd,GWL_EXSTYLE) & WS_EX_TOPMOST) { + if ((WindowStyleEx & WS_EX_TOPMOST) == 0) { + SendMessage(m_hwnd,m_ShowStageTop,(WPARAM) FALSE,(LPARAM) 0); + } + } + + // Likewise should we be adding WS_EX_TOPMOST + + if (WindowStyleEx & WS_EX_TOPMOST) { + SendMessage(m_hwnd,m_ShowStageTop,(WPARAM) TRUE,(LPARAM) 0); + WindowStyleEx &= (~WS_EX_TOPMOST); + if (WindowStyleEx == 0) return NOERROR; + } + return DoSetWindowStyle(WindowStyleEx,GWL_EXSTYLE); +} + + +// Gets the current GWL_EXSTYLE base window style + +STDMETHODIMP CBaseControlWindow::get_WindowStyleEx(__out long *pWindowStyleEx) +{ + CheckPointer(pWindowStyleEx,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + return DoGetWindowStyle(pWindowStyleEx,GWL_EXSTYLE); +} + + +// Set the window style using GWL_STYLE + +STDMETHODIMP CBaseControlWindow::put_WindowStyle(long WindowStyle) +{ + // These styles cannot be changed dynamically + + if ((WindowStyle & WS_DISABLED) || + (WindowStyle & WS_ICONIC) || + (WindowStyle & WS_MAXIMIZE) || + (WindowStyle & WS_MINIMIZE) || + (WindowStyle & WS_HSCROLL) || + (WindowStyle & WS_VSCROLL)) { + + return E_INVALIDARG; + } + + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + return DoSetWindowStyle(WindowStyle,GWL_STYLE); +} + + +// Get the current GWL_STYLE base window style + +STDMETHODIMP CBaseControlWindow::get_WindowStyle(__out long *pWindowStyle) +{ + CheckPointer(pWindowStyle,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + return DoGetWindowStyle(pWindowStyle,GWL_STYLE); +} + + +// Change the base window style or the extended styles depending on whether +// WindowLong is GWL_STYLE or GWL_EXSTYLE. We must call SetWindowPos to have +// the window displayed in it's new style after the change which is a little +// tricky if the window is not currently visible as we realise it offscreen. +// In most cases the client will call get_WindowStyle before they call this +// and then AND and OR in extra bit settings according to the requirements + +HRESULT CBaseControlWindow::DoSetWindowStyle(long Style,long WindowLong) +{ + RECT WindowRect; + + // Get the window's visibility before setting the style + BOOL bVisible = IsWindowVisible(m_hwnd); + EXECUTE_ASSERT(GetWindowRect(m_hwnd,&WindowRect)); + + // Set the new style flags for the window + SetWindowLong(m_hwnd,WindowLong,Style); + UINT WindowFlags = SWP_SHOWWINDOW | SWP_FRAMECHANGED | SWP_NOACTIVATE; + WindowFlags |= SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE; + + // Show the window again in the current position + + if (bVisible == TRUE) { + + SetWindowPos(m_hwnd, // Base window handle + HWND_TOP, // Just a place holder + 0,0,0,0, // Leave size and position + WindowFlags); // Just draw it again + + return NOERROR; + } + + // Move the window offscreen so the user doesn't see the changes + + MoveWindow((HWND) m_hwnd, // Base window handle + GetSystemMetrics(SM_CXSCREEN), // Current desktop width + GetSystemMetrics(SM_CYSCREEN), // Likewise it's height + WIDTH(&WindowRect), // Use the same width + HEIGHT(&WindowRect), // Keep height same to + TRUE); // May as well repaint + + // Now show the previously hidden window + + SetWindowPos(m_hwnd, // Base window handle + HWND_TOP, // Just a place holder + 0,0,0,0, // Leave size and position + WindowFlags); // Just draw it again + + ShowWindow(m_hwnd,SW_HIDE); + + if (GetParent(m_hwnd)) { + + MapWindowPoints(HWND_DESKTOP, GetParent(m_hwnd), (LPPOINT)&WindowRect, 2); + } + + MoveWindow((HWND) m_hwnd, // Base window handle + WindowRect.left, // Existing x coordinate + WindowRect.top, // Existing y coordinate + WIDTH(&WindowRect), // Use the same width + HEIGHT(&WindowRect), // Keep height same to + TRUE); // May as well repaint + + return NOERROR; +} + + +// Get the current base window style (either GWL_STYLE or GWL_EXSTYLE) + +HRESULT CBaseControlWindow::DoGetWindowStyle(__out long *pStyle,long WindowLong) +{ + *pStyle = GetWindowLong(m_hwnd,WindowLong); + return NOERROR; +} + + +// Change the visibility of the base window, this takes the same parameters +// as the ShowWindow Win32 API does, so the client can have the window hidden +// or shown, minimised to an icon, or maximised to play in full screen mode +// We pass the request on to the base window to actually make the change + +STDMETHODIMP CBaseControlWindow::put_WindowState(long WindowState) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + DoShowWindow(WindowState); + return NOERROR; +} + + +// Get the current window state, this function returns a subset of the SW bit +// settings available in ShowWindow, if the window is visible then SW_SHOW is +// set, if it is hidden then the SW_HIDDEN is set, if it is either minimised +// or maximised then the SW_MINIMIZE or SW_MAXIMIZE is set respectively. The +// other SW bit settings are really set commands not readable output values + +STDMETHODIMP CBaseControlWindow::get_WindowState(__out long *pWindowState) +{ + CheckPointer(pWindowState,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + ASSERT(pWindowState); + *pWindowState = FALSE; + + // Is the window visible, a window is termed visible if it is somewhere on + // the current desktop even if it is completely obscured by other windows + // so the flag is a style for each window set with the WS_VISIBLE bit + + if (IsWindowVisible(m_hwnd) == TRUE) { + + // Is the base window iconic + if (IsIconic(m_hwnd) == TRUE) { + *pWindowState |= SW_MINIMIZE; + } + + // Has the window been maximised + else if (IsZoomed(m_hwnd) == TRUE) { + *pWindowState |= SW_MAXIMIZE; + } + + // Window is normal + else { + *pWindowState |= SW_SHOW; + } + + } else { + *pWindowState |= SW_HIDE; + } + return NOERROR; +} + + +// This makes sure that any palette we realise in the base window (through a +// media type or through the overlay interface) is done in the background and +// is therefore mapped to existing device entries rather than taking it over +// as it will do when we this window gets the keyboard focus. An application +// uses this to make sure it doesn't have it's palette removed by the window + +STDMETHODIMP CBaseControlWindow::put_BackgroundPalette(long BackgroundPalette) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cWindowLock(&m_WindowLock); + + // Check this is a valid automation boolean type + + if (BackgroundPalette != OATRUE) { + if (BackgroundPalette != OAFALSE) { + return E_INVALIDARG; + } + } + + // Make sure the window realises any palette it has again + + m_bBackground = (BackgroundPalette == OATRUE ? TRUE : FALSE); + PostMessage(m_hwnd,m_RealizePalette,0,0); + PaintWindow(FALSE); + + return NOERROR; +} + + +// This returns the current background realisation setting + +STDMETHODIMP +CBaseControlWindow::get_BackgroundPalette(__out long *pBackgroundPalette) +{ + CheckPointer(pBackgroundPalette,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cWindowLock(&m_WindowLock); + + // Get the current background palette setting + + *pBackgroundPalette = (m_bBackground == TRUE ? OATRUE : OAFALSE); + return NOERROR; +} + + +// Change the visibility of the base window + +STDMETHODIMP CBaseControlWindow::put_Visible(long Visible) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + + // Check this is a valid automation boolean type + + if (Visible != OATRUE) { + if (Visible != OAFALSE) { + return E_INVALIDARG; + } + } + + // Convert the boolean visibility into SW_SHOW and SW_HIDE + + INT Mode = (Visible == OATRUE ? SW_SHOWNORMAL : SW_HIDE); + DoShowWindow(Mode); + return NOERROR; +} + + +// Return OATRUE if the window is currently visible otherwise OAFALSE + +STDMETHODIMP CBaseControlWindow::get_Visible(__out long *pVisible) +{ + CheckPointer(pVisible,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + + // See if the base window has a WS_VISIBLE style - this will return TRUE + // even if the window is completely obscured by other desktop windows, we + // return FALSE if the window is not showing because of earlier calls + + BOOL Mode = IsWindowVisible(m_hwnd); + *pVisible = (Mode == TRUE ? OATRUE : OAFALSE); + return NOERROR; +} + + +// Change the left position of the base window. This keeps the window width +// and height properties the same so it effectively shunts the window left or +// right accordingly - there is the Width property to change that dimension + +STDMETHODIMP CBaseControlWindow::put_Left(long Left) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + BOOL bSuccess; + RECT WindowRect; + + // Get the current window position in a RECT + EXECUTE_ASSERT(GetWindowRect(m_hwnd,&WindowRect)); + + if (GetParent(m_hwnd)) { + + MapWindowPoints(HWND_DESKTOP, GetParent(m_hwnd), (LPPOINT)&WindowRect, 2); + } + + // Adjust the coordinates ready for SetWindowPos, the window rectangle we + // get back from GetWindowRect is in left,top,right and bottom while the + // coordinates SetWindowPos wants are left,top,width and height values + + WindowRect.bottom = WindowRect.bottom - WindowRect.top; + WindowRect.right = WindowRect.right - WindowRect.left; + UINT WindowFlags = SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOACTIVATE; + + bSuccess = SetWindowPos(m_hwnd, // Window handle + HWND_TOP, // Put it at the top + Left, // New left position + WindowRect.top, // Leave top alone + WindowRect.right, // The WIDTH (not right) + WindowRect.bottom, // The HEIGHT (not bottom) + WindowFlags); // Show window options + + if (bSuccess == FALSE) { + return E_INVALIDARG; + } + return NOERROR; +} + + +// Return the current base window left position + +STDMETHODIMP CBaseControlWindow::get_Left(__out long *pLeft) +{ + CheckPointer(pLeft,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + RECT WindowRect; + + EXECUTE_ASSERT(GetWindowRect(m_hwnd,&WindowRect)); + *pLeft = WindowRect.left; + return NOERROR; +} + + +// Change the current width of the base window. This property complements the +// left position property so we must keep the left edge constant and expand or +// contract to the right, the alternative would be to change the left edge so +// keeping the right edge constant but this is maybe a little more intuitive + +STDMETHODIMP CBaseControlWindow::put_Width(long Width) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + BOOL bSuccess; + RECT WindowRect; + + // Adjust the coordinates ready for SetWindowPos, the window rectangle we + // get back from GetWindowRect is in left,top,right and bottom while the + // coordinates SetWindowPos wants are left,top,width and height values + + EXECUTE_ASSERT(GetWindowRect(m_hwnd,&WindowRect)); + + if (GetParent(m_hwnd)) { + + MapWindowPoints(HWND_DESKTOP, GetParent(m_hwnd), (LPPOINT)&WindowRect, 2); + } + + WindowRect.bottom = WindowRect.bottom - WindowRect.top; + UINT WindowFlags = SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOACTIVATE; + + // This seems to have a bug in that calling SetWindowPos on a window with + // just the width changing causes it to ignore the width that you pass in + // and sets it to a mimimum value of 110 pixels wide (Windows NT 3.51) + + bSuccess = SetWindowPos(m_hwnd, // Window handle + HWND_TOP, // Put it at the top + WindowRect.left, // Leave left alone + WindowRect.top, // Leave top alone + Width, // New WIDTH dimension + WindowRect.bottom, // The HEIGHT (not bottom) + WindowFlags); // Show window options + + if (bSuccess == FALSE) { + return E_INVALIDARG; + } + return NOERROR; +} + + +// Return the current base window width + +STDMETHODIMP CBaseControlWindow::get_Width(__out long *pWidth) +{ + CheckPointer(pWidth,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + RECT WindowRect; + + EXECUTE_ASSERT(GetWindowRect(m_hwnd,&WindowRect)); + *pWidth = WindowRect.right - WindowRect.left; + return NOERROR; +} + + +// This allows the client program to change the top position for the window in +// the same way that changing the left position does not affect the width of +// the image so changing the top position does not affect the window height + +STDMETHODIMP CBaseControlWindow::put_Top(long Top) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + BOOL bSuccess; + RECT WindowRect; + + // Get the current window position in a RECT + EXECUTE_ASSERT(GetWindowRect(m_hwnd,&WindowRect)); + + if (GetParent(m_hwnd)) { + + MapWindowPoints(HWND_DESKTOP, GetParent(m_hwnd), (LPPOINT)&WindowRect, 2); + } + + // Adjust the coordinates ready for SetWindowPos, the window rectangle we + // get back from GetWindowRect is in left,top,right and bottom while the + // coordinates SetWindowPos wants are left,top,width and height values + + WindowRect.bottom = WindowRect.bottom - WindowRect.top; + WindowRect.right = WindowRect.right - WindowRect.left; + UINT WindowFlags = SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOACTIVATE; + + bSuccess = SetWindowPos(m_hwnd, // Window handle + HWND_TOP, // Put it at the top + WindowRect.left, // Leave left alone + Top, // New top position + WindowRect.right, // The WIDTH (not right) + WindowRect.bottom, // The HEIGHT (not bottom) + WindowFlags); // Show window flags + + if (bSuccess == FALSE) { + return E_INVALIDARG; + } + return NOERROR; +} + + +// Return the current base window top position + +STDMETHODIMP CBaseControlWindow::get_Top(long *pTop) +{ + CheckPointer(pTop,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + RECT WindowRect; + + EXECUTE_ASSERT(GetWindowRect(m_hwnd,&WindowRect)); + *pTop = WindowRect.top; + return NOERROR; +} + + +// Change the height of the window, this complements the top property so when +// we change this we must keep the top position for the base window, as said +// before we could keep the bottom and grow upwards although this is perhaps +// a little more intuitive since we already have a top position property + +STDMETHODIMP CBaseControlWindow::put_Height(long Height) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + BOOL bSuccess; + RECT WindowRect; + + // Adjust the coordinates ready for SetWindowPos, the window rectangle we + // get back from GetWindowRect is in left,top,right and bottom while the + // coordinates SetWindowPos wants are left,top,width and height values + + EXECUTE_ASSERT(GetWindowRect(m_hwnd,&WindowRect)); + + if (GetParent(m_hwnd)) { + + MapWindowPoints(HWND_DESKTOP, GetParent(m_hwnd), (LPPOINT)&WindowRect, 2); + } + + WindowRect.right = WindowRect.right - WindowRect.left; + UINT WindowFlags = SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOACTIVATE; + + bSuccess = SetWindowPos(m_hwnd, // Window handle + HWND_TOP, // Put it at the top + WindowRect.left, // Leave left alone + WindowRect.top, // Leave top alone + WindowRect.right, // The WIDTH (not right) + Height, // New height dimension + WindowFlags); // Show window flags + + if (bSuccess == FALSE) { + return E_INVALIDARG; + } + return NOERROR; +} + + +// Return the current base window height + +STDMETHODIMP CBaseControlWindow::get_Height(__out long *pHeight) +{ + CheckPointer(pHeight,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + RECT WindowRect; + + EXECUTE_ASSERT(GetWindowRect(m_hwnd,&WindowRect)); + *pHeight = WindowRect.bottom - WindowRect.top; + return NOERROR; +} + + +// This can be called to change the owning window. Setting the owner is done +// through this function, however to make the window a true child window the +// style must also be set to WS_CHILD. After resetting the owner to NULL an +// application should also set the style to WS_OVERLAPPED | WS_CLIPCHILDREN. + +// We cannot lock the object here because the SetParent causes an interthread +// SendMessage to the owner window. If they are in GetState we will sit here +// incomplete with the critical section locked therefore blocking out source +// filter threads from accessing us. Because the source thread can't enter us +// it can't get buffers or call EndOfStream so the GetState will not complete + +STDMETHODIMP CBaseControlWindow::put_Owner(OAHWND Owner) +{ + // Check we are connected otherwise reject the call + + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + m_hwndOwner = (HWND) Owner; + HWND hwndParent = m_hwndOwner; + + // Add or remove WS_CHILD as appropriate + + LONG Style = GetWindowLong(m_hwnd,GWL_STYLE); + if (Owner == NULL) { + Style &= (~WS_CHILD); + } else { + Style |= (WS_CHILD); + } + SetWindowLong(m_hwnd,GWL_STYLE,Style); + + // Don't call this with the filter locked + + SetParent(m_hwnd,hwndParent); + + PaintWindow(TRUE); + NOTE1("Changed parent %lx",hwndParent); + + return NOERROR; +} + + +// This complements the put_Owner to get the current owning window property +// we always return NOERROR although the returned window handle may be NULL +// to indicate no owning window (the desktop window doesn't qualify as one) +// If an application sets the owner we call SetParent, however that returns +// NULL until the WS_CHILD bit is set on, so we store the owner internally + +STDMETHODIMP CBaseControlWindow::get_Owner(__out OAHWND *Owner) +{ + CheckPointer(Owner,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + *Owner = (OAHWND) m_hwndOwner; + return NOERROR; +} + + +// And renderer supporting IVideoWindow may have an HWND set who will get any +// keyboard and mouse messages we receive posted on to them. This is separate +// from setting an owning window. By separating the two, applications may get +// messages sent on even when they have set no owner (perhaps it's maximised) + +STDMETHODIMP CBaseControlWindow::put_MessageDrain(OAHWND Drain) +{ + // Check we are connected otherwise reject the call + + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + m_hwndDrain = (HWND) Drain; + return NOERROR; +} + + +// Return the current message drain + +STDMETHODIMP CBaseControlWindow::get_MessageDrain(__out OAHWND *Drain) +{ + CheckPointer(Drain,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + *Drain = (OAHWND) m_hwndDrain; + return NOERROR; +} + + +// This is called by the filter graph to inform us of a message we should know +// is being sent to our owning window. We have this because as a child window +// we do not get certain messages that are only sent to top level windows. We +// must see the palette changed/changing/query messages so that we know if we +// have the foreground palette or not. We pass the message on to our window +// using SendMessage - this will cause an interthread send message to occur + +STDMETHODIMP +CBaseControlWindow::NotifyOwnerMessage(OAHWND hwnd, // Window handle + long uMsg, // Message ID + LONG_PTR wParam, // Parameters + LONG_PTR lParam) // for message +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + + // Only interested in these Windows messages + + switch (uMsg) { + + case WM_SYSCOLORCHANGE: + case WM_PALETTECHANGED: + case WM_PALETTEISCHANGING: + case WM_QUERYNEWPALETTE: + case WM_DEVMODECHANGE: + case WM_DISPLAYCHANGE: + case WM_ACTIVATEAPP: + + // If we do not have an owner then ignore + + if (m_hwndOwner == NULL) { + return NOERROR; + } + SendMessage(m_hwnd,uMsg,(WPARAM)wParam,(LPARAM)lParam); + break; + + // do NOT fwd WM_MOVE. the parameters are the location of the parent + // window, NOT what the renderer should be looking at. But we need + // to make sure the overlay is moved with the parent window, so we + // do this. + case WM_MOVE: + PostMessage(m_hwnd,WM_PAINT,0,0); + break; + } + return NOERROR; +} + + +// Allow an application to have us set the base window in the foreground. We +// have this because it is difficult for one thread to do do this to a window +// owned by another thread. We ask the base window class to do the real work + +STDMETHODIMP CBaseControlWindow::SetWindowForeground(long Focus) +{ + // Check this is a valid automation boolean type + + if (Focus != OATRUE) { + if (Focus != OAFALSE) { + return E_INVALIDARG; + } + } + + // We shouldn't lock as this sends a message + + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + BOOL bFocus = (Focus == OATRUE ? TRUE : FALSE); + DoSetWindowForeground(bFocus); + + return NOERROR; +} + + +// This allows a client to set the complete window size and position in one +// atomic operation. The same affect can be had by changing each dimension +// in turn through their individual properties although some flashing will +// occur as each of them gets updated (they are better set at design time) + +STDMETHODIMP +CBaseControlWindow::SetWindowPosition(long Left,long Top,long Width,long Height) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + BOOL bSuccess; + + // Set the new size and position + UINT WindowFlags = SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOACTIVATE; + + ASSERT(IsWindow(m_hwnd)); + bSuccess = SetWindowPos(m_hwnd, // Window handle + HWND_TOP, // Put it at the top + Left, // Left position + Top, // Top position + Width, // Window width + Height, // Window height + WindowFlags); // Show window flags + ASSERT(bSuccess); +#ifdef DEBUG + DbgLog((LOG_TRACE, 1, TEXT("SWP failed error %d"), GetLastError())); +#endif + if (bSuccess == FALSE) { + return E_INVALIDARG; + } + return NOERROR; +} + + +// This complements the SetWindowPosition to return the current window place +// in device coordinates. As before the same information can be retrived by +// calling the property get functions individually but this is atomic and is +// therefore more suitable to a live environment rather than design time + +STDMETHODIMP +CBaseControlWindow::GetWindowPosition(__out long *pLeft,__out long *pTop,__out long *pWidth,__out long *pHeight) +{ + // Should check the pointers are not NULL + + CheckPointer(pLeft,E_POINTER); + CheckPointer(pTop,E_POINTER); + CheckPointer(pWidth,E_POINTER); + CheckPointer(pHeight,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + RECT WindowRect; + + // Get the current window coordinates + + EXECUTE_ASSERT(GetWindowRect(m_hwnd,&WindowRect)); + + // Convert the RECT into left,top,width and height values + + *pLeft = WindowRect.left; + *pTop = WindowRect.top; + *pWidth = WindowRect.right - WindowRect.left; + *pHeight = WindowRect.bottom - WindowRect.top; + + return NOERROR; +} + + +// When a window is maximised or iconic calling GetWindowPosition will return +// the current window position (likewise for the properties). However if the +// restored size (ie the size we'll return to when normally shown) is needed +// then this should be used. When in a normal position (neither iconic nor +// maximised) then this returns the same coordinates as GetWindowPosition + +STDMETHODIMP +CBaseControlWindow::GetRestorePosition(__out long *pLeft,__out long *pTop,__out long *pWidth,__out long *pHeight) +{ + // Should check the pointers are not NULL + + CheckPointer(pLeft,E_POINTER); + CheckPointer(pTop,E_POINTER); + CheckPointer(pWidth,E_POINTER); + CheckPointer(pHeight,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + + // Use GetWindowPlacement to find the restore position + + WINDOWPLACEMENT Place; + Place.length = sizeof(WINDOWPLACEMENT); + EXECUTE_ASSERT(GetWindowPlacement(m_hwnd,&Place)); + + RECT WorkArea; + + // We must take into account any task bar present + + if (SystemParametersInfo(SPI_GETWORKAREA,0,&WorkArea,FALSE) == TRUE) { + if (GetParent(m_hwnd) == NULL) { + Place.rcNormalPosition.top += WorkArea.top; + Place.rcNormalPosition.bottom += WorkArea.top; + Place.rcNormalPosition.left += WorkArea.left; + Place.rcNormalPosition.right += WorkArea.left; + } + } + + // Convert the RECT into left,top,width and height values + + *pLeft = Place.rcNormalPosition.left; + *pTop = Place.rcNormalPosition.top; + *pWidth = Place.rcNormalPosition.right - Place.rcNormalPosition.left; + *pHeight = Place.rcNormalPosition.bottom - Place.rcNormalPosition.top; + + return NOERROR; +} + + +// Return the current border colour, if we are playing something to a subset +// of the base window display there is an outside area exposed. The default +// action is to paint this colour in the Windows background colour (defined +// as value COLOR_WINDOW) We reset to this default when we're disconnected + +STDMETHODIMP CBaseControlWindow::get_BorderColor(__out long *Color) +{ + CheckPointer(Color,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + *Color = (long) m_BorderColour; + return NOERROR; +} + + +// This can be called to set the current border colour + +STDMETHODIMP CBaseControlWindow::put_BorderColor(long Color) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + + // Have the window repainted with the new border colour + + m_BorderColour = (COLORREF) Color; + PaintWindow(TRUE); + return NOERROR; +} + + +// Delegate fullscreen handling to plug in distributor + +STDMETHODIMP CBaseControlWindow::get_FullScreenMode(__out long *FullScreenMode) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CheckPointer(FullScreenMode,E_POINTER); + return E_NOTIMPL; +} + + +// Delegate fullscreen handling to plug in distributor + +STDMETHODIMP CBaseControlWindow::put_FullScreenMode(long FullScreenMode) +{ + return E_NOTIMPL; +} + + +// This sets the auto show property, this property causes the base window to +// be displayed whenever we change state. This allows an application to have +// to do nothing to have the window appear but still allow them to change the +// default behaviour if for example they want to keep it hidden for longer + +STDMETHODIMP CBaseControlWindow::put_AutoShow(long AutoShow) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + + // Check this is a valid automation boolean type + + if (AutoShow != OATRUE) { + if (AutoShow != OAFALSE) { + return E_INVALIDARG; + } + } + + m_bAutoShow = (AutoShow == OATRUE ? TRUE : FALSE); + return NOERROR; +} + + +// This can be called to get the current auto show flag. The flag is updated +// when we connect and disconnect and through this interface all of which are +// controlled and serialised by means of the main renderer critical section + +STDMETHODIMP CBaseControlWindow::get_AutoShow(__out long *AutoShow) +{ + CheckPointer(AutoShow,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + *AutoShow = (m_bAutoShow == TRUE ? OATRUE : OAFALSE); + return NOERROR; +} + + +// Return the minimum ideal image size for the current video. This may differ +// to the actual video dimensions because we may be using DirectDraw hardware +// that has specific stretching requirements. For example the Cirrus Logic +// cards have a minimum stretch factor depending on the overlay surface size + +STDMETHODIMP +CBaseControlWindow::GetMinIdealImageSize(__out long *pWidth,__out long *pHeight) +{ + CheckPointer(pWidth,E_POINTER); + CheckPointer(pHeight,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + FILTER_STATE State; + + // Must not be stopped for this to work correctly + + m_pFilter->GetState(0,&State); + if (State == State_Stopped) { + return VFW_E_WRONG_STATE; + } + + RECT DefaultRect = GetDefaultRect(); + *pWidth = WIDTH(&DefaultRect); + *pHeight = HEIGHT(&DefaultRect); + return NOERROR; +} + + +// Return the maximum ideal image size for the current video. This may differ +// to the actual video dimensions because we may be using DirectDraw hardware +// that has specific stretching requirements. For example the Cirrus Logic +// cards have a maximum stretch factor depending on the overlay surface size + +STDMETHODIMP +CBaseControlWindow::GetMaxIdealImageSize(__out long *pWidth,__out long *pHeight) +{ + CheckPointer(pWidth,E_POINTER); + CheckPointer(pHeight,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + FILTER_STATE State; + + // Must not be stopped for this to work correctly + + m_pFilter->GetState(0,&State); + if (State == State_Stopped) { + return VFW_E_WRONG_STATE; + } + + RECT DefaultRect = GetDefaultRect(); + *pWidth = WIDTH(&DefaultRect); + *pHeight = HEIGHT(&DefaultRect); + return NOERROR; +} + + +// Allow an application to hide the cursor on our window + +STDMETHODIMP +CBaseControlWindow::HideCursor(long HideCursor) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + + // Check this is a valid automation boolean type + + if (HideCursor != OATRUE) { + if (HideCursor != OAFALSE) { + return E_INVALIDARG; + } + } + + m_bCursorHidden = (HideCursor == OATRUE ? TRUE : FALSE); + return NOERROR; +} + + +// Returns whether we have the cursor hidden or not + +STDMETHODIMP CBaseControlWindow::IsCursorHidden(__out long *CursorHidden) +{ + CheckPointer(CursorHidden,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + *CursorHidden = (m_bCursorHidden == TRUE ? OATRUE : OAFALSE); + return NOERROR; +} + + +// This class implements the IBasicVideo control functions (dual interface) +// we support a large number of properties and methods designed to allow the +// client (whether it be an automation controller or a C/C++ application) to +// set and get a number of video related properties such as the native video +// size. We support some methods that duplicate the properties but provide a +// more direct and efficient mechanism as many values may be changed in one + +CBaseControlVideo::CBaseControlVideo( + __inout CBaseFilter *pFilter, // Owning filter + __in CCritSec *pInterfaceLock, // Locking object + __in_opt LPCTSTR pName, // Object description + __inout_opt LPUNKNOWN pUnk, // Normal COM ownership + __inout HRESULT *phr) : // OLE return code + + CBaseBasicVideo(pName,pUnk), + m_pFilter(pFilter), + m_pInterfaceLock(pInterfaceLock), + m_pPin(NULL) +{ + ASSERT(m_pFilter); + ASSERT(m_pInterfaceLock); + ASSERT(phr); +} + +// Return an approximate average time per frame + +STDMETHODIMP CBaseControlVideo::get_AvgTimePerFrame(__out REFTIME *pAvgTimePerFrame) +{ + CheckPointer(pAvgTimePerFrame,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + + VIDEOINFOHEADER *pVideoInfo = GetVideoFormat(); + if (pVideoInfo == NULL) + return E_OUTOFMEMORY; + COARefTime AvgTime(pVideoInfo->AvgTimePerFrame); + *pAvgTimePerFrame = (REFTIME) AvgTime; + + return NOERROR; +} + + +// Return an approximate bit rate for the video + +STDMETHODIMP CBaseControlVideo::get_BitRate(__out long *pBitRate) +{ + CheckPointer(pBitRate,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + + VIDEOINFOHEADER *pVideoInfo = GetVideoFormat(); + if (pVideoInfo == NULL) + return E_OUTOFMEMORY; + *pBitRate = pVideoInfo->dwBitRate; + return NOERROR; +} + + +// Return an approximate bit error rate + +STDMETHODIMP CBaseControlVideo::get_BitErrorRate(__out long *pBitErrorRate) +{ + CheckPointer(pBitErrorRate,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + + VIDEOINFOHEADER *pVideoInfo = GetVideoFormat(); + if (pVideoInfo == NULL) + return E_OUTOFMEMORY; + *pBitErrorRate = pVideoInfo->dwBitErrorRate; + return NOERROR; +} + + +// This returns the current video width + +STDMETHODIMP CBaseControlVideo::get_VideoWidth(__out long *pVideoWidth) +{ + CheckPointer(pVideoWidth,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + + VIDEOINFOHEADER *pVideoInfo = GetVideoFormat(); + if (pVideoInfo == NULL) + return E_OUTOFMEMORY; + *pVideoWidth = pVideoInfo->bmiHeader.biWidth; + return NOERROR; +} + + +// This returns the current video height + +STDMETHODIMP CBaseControlVideo::get_VideoHeight(__out long *pVideoHeight) +{ + CheckPointer(pVideoHeight,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + + VIDEOINFOHEADER *pVideoInfo = GetVideoFormat(); + if (pVideoInfo == NULL) + return E_OUTOFMEMORY; + *pVideoHeight = pVideoInfo->bmiHeader.biHeight; + return NOERROR; +} + + +// This returns the current palette the video is using as an array allocated +// by the user. To remain consistent we use PALETTEENTRY fields to return the +// colours in rather than RGBQUADs that multimedia decided to use. The memory +// is allocated by the user so we simple copy each in turn. We check that the +// number of entries requested and the start position offset are both valid +// If the number of entries evaluates to zero then we return an S_FALSE code + +STDMETHODIMP CBaseControlVideo::GetVideoPaletteEntries(long StartIndex, + long Entries, + __out long *pRetrieved, + __out_ecount_part(Entries, *pRetrieved) long *pPalette) +{ + CheckPointer(pRetrieved,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + CMediaType MediaType; + + // Get the video format from the derived class + + VIDEOINFOHEADER *pVideoInfo = GetVideoFormat(); + if (pVideoInfo == NULL) + return E_OUTOFMEMORY; + BITMAPINFOHEADER *pHeader = HEADER(pVideoInfo); + + // Is the current format palettised + + if (PALETTISED(pVideoInfo) == FALSE) { + *pRetrieved = 0; + return VFW_E_NO_PALETTE_AVAILABLE; + } + + // Do they just want to know how many are available + + if (pPalette == NULL) { + *pRetrieved = pHeader->biClrUsed; + return NOERROR; + } + + // Make sure the start position is a valid offset + + if (StartIndex >= (LONG) pHeader->biClrUsed || StartIndex < 0) { + *pRetrieved = 0; + return E_INVALIDARG; + } + + // Correct the number we can retrieve + + LONG Available = (LONG) pHeader->biClrUsed - StartIndex; + *pRetrieved = max(0,min(Available,Entries)); + if (*pRetrieved == 0) { + return S_FALSE; + } + + // Copy the palette entries to the output buffer + + PALETTEENTRY *pEntries = (PALETTEENTRY *) pPalette; + RGBQUAD *pColours = COLORS(pVideoInfo) + StartIndex; + + for (LONG Count = 0;Count < *pRetrieved;Count++) { + pEntriesCount.peRed = pColoursCount.rgbRed; + pEntriesCount.peGreen = pColoursCount.rgbGreen; + pEntriesCount.peBlue = pColoursCount.rgbBlue; + pEntriesCount.peFlags = 0; + } + return NOERROR; +} + + +// This returns the current video dimensions as a method rather than a number +// of individual property get calls. For the same reasons as said before we +// cannot access the renderer media type directly as the window object thread +// may be updating it since dynamic format changes may change these values + +STDMETHODIMP CBaseControlVideo::GetVideoSize(__out long *pWidth,__out long *pHeight) +{ + CheckPointer(pWidth,E_POINTER); + CheckPointer(pHeight,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + + // Get the video format from the derived class + VIDEOINFOHEADER *pVideoInfo = GetVideoFormat(); + if (pVideoInfo == NULL) + return E_OUTOFMEMORY; + *pWidth = pVideoInfo->bmiHeader.biWidth; + *pHeight = pVideoInfo->bmiHeader.biHeight; + return NOERROR; +} + + +// Set the source video rectangle as left,top,right and bottom coordinates +// rather than left,top,width and height as per OLE automation interfaces +// Then pass the rectangle on to the window object to set the source + +STDMETHODIMP +CBaseControlVideo::SetSourcePosition(long Left,long Top,long Width,long Height) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT SourceRect; + SourceRect.left = Left; + SourceRect.top = Top; + SourceRect.right = Left + Width; + SourceRect.bottom = Top + Height; + + // Check the source rectangle is valid + + HRESULT hr = CheckSourceRect(&SourceRect); + if (FAILED(hr)) { + return hr; + } + + // Now set the source rectangle + + hr = SetSourceRect(&SourceRect); + if (FAILED(hr)) { + return hr; + } + return OnUpdateRectangles(); +} + + +// Return the source rectangle in left,top,width and height rather than the +// left,top,right and bottom values that RECT uses (and which the window +// object returns through GetSourceRect) which requires a little work + +STDMETHODIMP +CBaseControlVideo::GetSourcePosition(__out long *pLeft,__out long *pTop,__out long *pWidth,__out long *pHeight) +{ + // Should check the pointers are non NULL + + CheckPointer(pLeft,E_POINTER); + CheckPointer(pTop,E_POINTER); + CheckPointer(pWidth,E_POINTER); + CheckPointer(pHeight,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + RECT SourceRect; + + CAutoLock cInterfaceLock(m_pInterfaceLock); + GetSourceRect(&SourceRect); + + *pLeft = SourceRect.left; + *pTop = SourceRect.top; + *pWidth = WIDTH(&SourceRect); + *pHeight = HEIGHT(&SourceRect); + + return NOERROR; +} + + +// Set the video destination as left,top,right and bottom coordinates rather +// than the left,top,width and height uses as per OLE automation interfaces +// Then pass the rectangle on to the window object to set the destination + +STDMETHODIMP +CBaseControlVideo::SetDestinationPosition(long Left,long Top,long Width,long Height) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT DestinationRect; + + DestinationRect.left = Left; + DestinationRect.top = Top; + DestinationRect.right = Left + Width; + DestinationRect.bottom = Top + Height; + + // Check the target rectangle is valid + + HRESULT hr = CheckTargetRect(&DestinationRect); + if (FAILED(hr)) { + return hr; + } + + // Now set the new target rectangle + + hr = SetTargetRect(&DestinationRect); + if (FAILED(hr)) { + return hr; + } + return OnUpdateRectangles(); +} + + +// Return the destination rectangle in left,top,width and height rather than +// the left,top,right and bottom values that RECT uses (and which the window +// object returns through GetDestinationRect) which requires a little work + +STDMETHODIMP +CBaseControlVideo::GetDestinationPosition(__out long *pLeft,__out long *pTop,__out long *pWidth,__out long *pHeight) +{ + // Should check the pointers are not NULL + + CheckPointer(pLeft,E_POINTER); + CheckPointer(pTop,E_POINTER); + CheckPointer(pWidth,E_POINTER); + CheckPointer(pHeight,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + RECT DestinationRect; + + CAutoLock cInterfaceLock(m_pInterfaceLock); + GetTargetRect(&DestinationRect); + + *pLeft = DestinationRect.left; + *pTop = DestinationRect.top; + *pWidth = WIDTH(&DestinationRect); + *pHeight = HEIGHT(&DestinationRect); + + return NOERROR; +} + + +// Set the source left position, the source rectangle we get back from the +// window object is a true rectangle in left,top,right and bottom positions +// so all we have to do is to update the left position and pass it back. We +// must keep the current width constant when we're updating this property + +STDMETHODIMP CBaseControlVideo::put_SourceLeft(long SourceLeft) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT SourceRect; + GetSourceRect(&SourceRect); + SourceRect.right = SourceLeft + WIDTH(&SourceRect); + SourceRect.left = SourceLeft; + + // Check the source rectangle is valid + + HRESULT hr = CheckSourceRect(&SourceRect); + if (FAILED(hr)) { + return hr; + } + + // Now set the source rectangle + + hr = SetSourceRect(&SourceRect); + if (FAILED(hr)) { + return hr; + } + return OnUpdateRectangles(); +} + + +// Return the current left source video position + +STDMETHODIMP CBaseControlVideo::get_SourceLeft(__out long *pSourceLeft) +{ + CheckPointer(pSourceLeft,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT SourceRect; + + GetSourceRect(&SourceRect); + *pSourceLeft = SourceRect.left; + return NOERROR; +} + + +// Set the source width, we get the current source rectangle and then update +// the right position to be the left position (thereby keeping it constant) +// plus the new source width we are passed in (it expands to the right) + +STDMETHODIMP CBaseControlVideo::put_SourceWidth(long SourceWidth) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT SourceRect; + GetSourceRect(&SourceRect); + SourceRect.right = SourceRect.left + SourceWidth; + + // Check the source rectangle is valid + + HRESULT hr = CheckSourceRect(&SourceRect); + if (FAILED(hr)) { + return hr; + } + + // Now set the source rectangle + + hr = SetSourceRect(&SourceRect); + if (FAILED(hr)) { + return hr; + } + return OnUpdateRectangles(); +} + + +// Return the current source width + +STDMETHODIMP CBaseControlVideo::get_SourceWidth(__out long *pSourceWidth) +{ + CheckPointer(pSourceWidth,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT SourceRect; + + GetSourceRect(&SourceRect); + *pSourceWidth = WIDTH(&SourceRect); + return NOERROR; +} + + +// Set the source top position - changing this property does not affect the +// current source height. So changing this shunts the source rectangle up and +// down appropriately. Changing the height complements this functionality by +// keeping the top position constant and simply changing the source height + +STDMETHODIMP CBaseControlVideo::put_SourceTop(long SourceTop) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT SourceRect; + GetSourceRect(&SourceRect); + SourceRect.bottom = SourceTop + HEIGHT(&SourceRect); + SourceRect.top = SourceTop; + + // Check the source rectangle is valid + + HRESULT hr = CheckSourceRect(&SourceRect); + if (FAILED(hr)) { + return hr; + } + + // Now set the source rectangle + + hr = SetSourceRect(&SourceRect); + if (FAILED(hr)) { + return hr; + } + return OnUpdateRectangles(); +} + + +// Return the current top position + +STDMETHODIMP CBaseControlVideo::get_SourceTop(__out long *pSourceTop) +{ + CheckPointer(pSourceTop,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT SourceRect; + + GetSourceRect(&SourceRect); + *pSourceTop = SourceRect.top; + return NOERROR; +} + + +// Set the source height + +STDMETHODIMP CBaseControlVideo::put_SourceHeight(long SourceHeight) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT SourceRect; + GetSourceRect(&SourceRect); + SourceRect.bottom = SourceRect.top + SourceHeight; + + // Check the source rectangle is valid + + HRESULT hr = CheckSourceRect(&SourceRect); + if (FAILED(hr)) { + return hr; + } + + // Now set the source rectangle + + hr = SetSourceRect(&SourceRect); + if (FAILED(hr)) { + return hr; + } + return OnUpdateRectangles(); +} + + +// Return the current source height + +STDMETHODIMP CBaseControlVideo::get_SourceHeight(__out long *pSourceHeight) +{ + CheckPointer(pSourceHeight,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT SourceRect; + + GetSourceRect(&SourceRect); + *pSourceHeight = HEIGHT(&SourceRect); + return NOERROR; +} + + +// Set the target left position, the target rectangle we get back from the +// window object is a true rectangle in left,top,right and bottom positions +// so all we have to do is to update the left position and pass it back. We +// must keep the current width constant when we're updating this property + +STDMETHODIMP CBaseControlVideo::put_DestinationLeft(long DestinationLeft) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT DestinationRect; + GetTargetRect(&DestinationRect); + DestinationRect.right = DestinationLeft + WIDTH(&DestinationRect); + DestinationRect.left = DestinationLeft; + + // Check the target rectangle is valid + + HRESULT hr = CheckTargetRect(&DestinationRect); + if (FAILED(hr)) { + return hr; + } + + // Now set the new target rectangle + + hr = SetTargetRect(&DestinationRect); + if (FAILED(hr)) { + return hr; + } + return OnUpdateRectangles(); +} + + +// Return the left position for the destination rectangle + +STDMETHODIMP CBaseControlVideo::get_DestinationLeft(__out long *pDestinationLeft) +{ + CheckPointer(pDestinationLeft,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT DestinationRect; + + GetTargetRect(&DestinationRect); + *pDestinationLeft = DestinationRect.left; + return NOERROR; +} + + +// Set the destination width + +STDMETHODIMP CBaseControlVideo::put_DestinationWidth(long DestinationWidth) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT DestinationRect; + GetTargetRect(&DestinationRect); + DestinationRect.right = DestinationRect.left + DestinationWidth; + + // Check the target rectangle is valid + + HRESULT hr = CheckTargetRect(&DestinationRect); + if (FAILED(hr)) { + return hr; + } + + // Now set the new target rectangle + + hr = SetTargetRect(&DestinationRect); + if (FAILED(hr)) { + return hr; + } + return OnUpdateRectangles(); +} + + +// Return the width for the destination rectangle + +STDMETHODIMP CBaseControlVideo::get_DestinationWidth(__out long *pDestinationWidth) +{ + CheckPointer(pDestinationWidth,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT DestinationRect; + + GetTargetRect(&DestinationRect); + *pDestinationWidth = WIDTH(&DestinationRect); + return NOERROR; +} + + +// Set the target top position - changing this property does not affect the +// current target height. So changing this shunts the target rectangle up and +// down appropriately. Changing the height complements this functionality by +// keeping the top position constant and simply changing the target height + +STDMETHODIMP CBaseControlVideo::put_DestinationTop(long DestinationTop) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT DestinationRect; + GetTargetRect(&DestinationRect); + DestinationRect.bottom = DestinationTop + HEIGHT(&DestinationRect); + DestinationRect.top = DestinationTop; + + // Check the target rectangle is valid + + HRESULT hr = CheckTargetRect(&DestinationRect); + if (FAILED(hr)) { + return hr; + } + + // Now set the new target rectangle + + hr = SetTargetRect(&DestinationRect); + if (FAILED(hr)) { + return hr; + } + return OnUpdateRectangles(); +} + + +// Return the top position for the destination rectangle + +STDMETHODIMP CBaseControlVideo::get_DestinationTop(__out long *pDestinationTop) +{ + CheckPointer(pDestinationTop,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT DestinationRect; + + GetTargetRect(&DestinationRect); + *pDestinationTop = DestinationRect.top; + return NOERROR; +} + + +// Set the destination height + +STDMETHODIMP CBaseControlVideo::put_DestinationHeight(long DestinationHeight) +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT DestinationRect; + GetTargetRect(&DestinationRect); + DestinationRect.bottom = DestinationRect.top + DestinationHeight; + + // Check the target rectangle is valid + + HRESULT hr = CheckTargetRect(&DestinationRect); + if (FAILED(hr)) { + return hr; + } + + // Now set the new target rectangle + + hr = SetTargetRect(&DestinationRect); + if (FAILED(hr)) { + return hr; + } + return OnUpdateRectangles(); +} + + +// Return the height for the destination rectangle + +STDMETHODIMP CBaseControlVideo::get_DestinationHeight(__out long *pDestinationHeight) +{ + CheckPointer(pDestinationHeight,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + RECT DestinationRect; + + GetTargetRect(&DestinationRect); + *pDestinationHeight = HEIGHT(&DestinationRect); + return NOERROR; +} + + +// Reset the source rectangle to the full video dimensions + +STDMETHODIMP CBaseControlVideo::SetDefaultSourcePosition() +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + HRESULT hr = SetDefaultSourceRect(); + if (FAILED(hr)) { + return hr; + } + return OnUpdateRectangles(); +} + + +// Return S_OK if we're using the default source otherwise S_FALSE + +STDMETHODIMP CBaseControlVideo::IsUsingDefaultSource() +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + return IsDefaultSourceRect(); +} + + +// Reset the video renderer to use the entire playback area + +STDMETHODIMP CBaseControlVideo::SetDefaultDestinationPosition() +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + HRESULT hr = SetDefaultTargetRect(); + if (FAILED(hr)) { + return hr; + } + return OnUpdateRectangles(); +} + + +// Return S_OK if we're using the default target otherwise S_FALSE + +STDMETHODIMP CBaseControlVideo::IsUsingDefaultDestination() +{ + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + return IsDefaultTargetRect(); +} + + +// Return a copy of the current image in the video renderer + +STDMETHODIMP +CBaseControlVideo::GetCurrentImage(__inout long *pBufferSize,__out_bcount_part(*pBufferSize, *pBufferSize) long *pVideoImage) +{ + CheckPointer(pBufferSize,E_POINTER); + CheckConnected(m_pPin,VFW_E_NOT_CONNECTED); + CAutoLock cInterfaceLock(m_pInterfaceLock); + FILTER_STATE State; + + // Make sure we are in a paused state + + if (pVideoImage != NULL) { + m_pFilter->GetState(0,&State); + if (State != State_Paused) { + return VFW_E_NOT_PAUSED; + } + return GetStaticImage(pBufferSize,pVideoImage); + } + + // Just return the memory required + + VIDEOINFOHEADER *pVideoInfo = GetVideoFormat(); + if (pVideoInfo == NULL) + return E_OUTOFMEMORY; + RECT SourceRect; + GetSourceRect(&SourceRect); + return GetImageSize(pVideoInfo,pBufferSize,&SourceRect); +} + + +// An application has two ways of using GetCurrentImage, one is to pass a real +// buffer which should be filled with the current image. The other is to pass +// a NULL buffer pointer which is interpreted as asking us to return how much +// memory is required for the image. The constraints for when the latter can +// be called are much looser. To calculate the memory required we synthesize +// a VIDEOINFO that takes into account the source rectangle that's being used + +HRESULT CBaseControlVideo::GetImageSize(__in VIDEOINFOHEADER *pVideoInfo, + __out long *pBufferSize, + __in RECT *pSourceRect) +{ + NOTE("Entering GetImageSize"); + ASSERT(pSourceRect); + + // Check we have the correct input parameters + + if (pSourceRect == NULL || + pVideoInfo == NULL || + pBufferSize == NULL) { + + return E_UNEXPECTED; + } + + // Is the data format compatible + + if (pVideoInfo->bmiHeader.biCompression != BI_RGB) { + if (pVideoInfo->bmiHeader.biCompression != BI_BITFIELDS) { + return E_INVALIDARG; + } + } + + ASSERT(IsRectEmpty(pSourceRect) == FALSE); + + BITMAPINFOHEADER bih; + bih.biWidth = WIDTH(pSourceRect); + bih.biHeight = HEIGHT(pSourceRect); + bih.biBitCount = pVideoInfo->bmiHeader.biBitCount; + LONG Size = DIBSIZE(bih); + Size += GetBitmapFormatSize(HEADER(pVideoInfo)) - SIZE_PREHEADER; + *pBufferSize = Size; + + return NOERROR; +} + + +// Given an IMediaSample containing a linear buffer with an image and a type +// describing the bitmap make a rendering of the image into the output buffer +// This may be called by derived classes who render typical video images to +// handle the IBasicVideo GetCurrentImage method. The pVideoImage pointer may +// be NULL when passed to GetCurrentImage in which case GetImageSize will be +// called instead, which will just do the calculation of the memory required + +HRESULT CBaseControlVideo::CopyImage(IMediaSample *pMediaSample, + __in VIDEOINFOHEADER *pVideoInfo, + __inout long *pBufferSize, + __out_bcount_part(*pBufferSize, *pBufferSize) BYTE *pVideoImage, + __in RECT *pSourceRect) +{ + NOTE("Entering CopyImage"); + ASSERT(pSourceRect); + BYTE *pCurrentImage; + + // Check we have an image to copy + + if (pMediaSample == NULL || pSourceRect == NULL || + pVideoInfo == NULL || pVideoImage == NULL || + pBufferSize == NULL) { + + return E_UNEXPECTED; + } + + // Is the data format compatible + + if (pVideoInfo->bmiHeader.biCompression != BI_RGB) { + if (pVideoInfo->bmiHeader.biCompression != BI_BITFIELDS) { + return E_INVALIDARG; + } + } + + if (*pBufferSize < 0) { + return E_INVALIDARG; + } + + // Arbitrarily large size to prevent integer overflow problems + if (pVideoInfo->bmiHeader.biSize > 4096) + { + return E_INVALIDARG; + } + + ASSERT(IsRectEmpty(pSourceRect) == FALSE); + + BITMAPINFOHEADER bih; + bih.biWidth = WIDTH(pSourceRect); + bih.biHeight = HEIGHT(pSourceRect); + bih.biBitCount = pVideoInfo->bmiHeader.biBitCount; + DWORD Size = GetBitmapFormatSize(HEADER(pVideoInfo)) - SIZE_PREHEADER; + DWORD Total; + DWORD dwDibSize; + + if( !ValidateBitmapInfoHeader( HEADER(pVideoInfo), Size)) { + return E_INVALIDARG; + } + + // ValidateBitmapInfoHeader checks this but for some reason code scanning + // tools aren't picking up the annotation + __analysis_assume(Size >= sizeof(BITMAPINFOHEADER)); + + if (FAILED(SAFE_DIBSIZE(&bih, &dwDibSize))) { + return E_INVALIDARG; + } + + if (FAILED(DWordAdd(Size, dwDibSize, &Total))) { + return E_INVALIDARG; + } + + // Make sure we have a large enough buffer + + if ((DWORD)*pBufferSize < Total) { + return E_OUTOFMEMORY; + } + + // Copy the BITMAPINFO + + CopyMemory((PVOID)pVideoImage, (PVOID)&pVideoInfo->bmiHeader, Size); + ((BITMAPINFOHEADER *)pVideoImage)->biWidth = WIDTH(pSourceRect); + ((BITMAPINFOHEADER *)pVideoImage)->biHeight = HEIGHT(pSourceRect); + ((BITMAPINFOHEADER *)pVideoImage)->biSizeImage = DIBSIZE(bih); + BYTE *pImageData = pVideoImage + Size; + + // Get the pointer to it's image data + + HRESULT hr = pMediaSample->GetPointer(&pCurrentImage); + if (FAILED(hr)) { + return hr; + } + + // Now we are ready to start copying the source scan lines + + LONG ScanLine = (pVideoInfo->bmiHeader.biBitCount / 8) * WIDTH(pSourceRect); + LONG LinesToSkip = pVideoInfo->bmiHeader.biHeight; + LinesToSkip -= pSourceRect->top + HEIGHT(pSourceRect); + pCurrentImage += LinesToSkip * DIBWIDTHBYTES(pVideoInfo->bmiHeader); + pCurrentImage += pSourceRect->left * (pVideoInfo->bmiHeader.biBitCount / 8); + + // Even money on this GP faulting sometime... + + for (LONG Line = 0;Line < HEIGHT(pSourceRect);Line++) { + CopyMemory((PVOID)pImageData, (PVOID)pCurrentImage, ScanLine); + pImageData += DIBWIDTHBYTES(*(BITMAPINFOHEADER *)pVideoImage); + pCurrentImage += DIBWIDTHBYTES(pVideoInfo->bmiHeader); + } + return NOERROR; +} + + +// Called when we change media types either during connection or dynamically +// We inform the filter graph and therefore the application that the video +// size may have changed, we don't bother looking to see if it really has as +// we leave that to the application - the dimensions are the event parameters + +HRESULT CBaseControlVideo::OnVideoSizeChange() +{ + // Get the video format from the derived class + + VIDEOINFOHEADER *pVideoInfo = GetVideoFormat(); + if (pVideoInfo == NULL) + return E_OUTOFMEMORY; + WORD Width = (WORD) pVideoInfo->bmiHeader.biWidth; + WORD Height = (WORD) pVideoInfo->bmiHeader.biHeight; + + return m_pFilter->NotifyEvent(EC_VIDEO_SIZE_CHANGED, + MAKELPARAM(Width,Height), + MAKEWPARAM(0,0)); +} + + +// Set the video source rectangle. We must check the source rectangle against +// the actual video dimensions otherwise when we come to draw the pictures we +// get access violations as GDI tries to touch data outside of the image data +// Although we store the rectangle in left, top, right and bottom coordinates +// instead of left, top, width and height as OLE uses we do take into account +// that the rectangle is used up to, but not including, the right column and +// bottom row of pixels, see the Win32 documentation on RECT for more details + +HRESULT CBaseControlVideo::CheckSourceRect(__in RECT *pSourceRect) +{ + CheckPointer(pSourceRect,E_POINTER); + LONG Width,Height; + GetVideoSize(&Width,&Height); + + // Check the coordinates are greater than zero + // and that the rectangle is valid (left<right, top<bottom) + + if ((pSourceRect->left >= pSourceRect->right) || + (pSourceRect->left < 0) || + (pSourceRect->top >= pSourceRect->bottom) || + (pSourceRect->top < 0)) { + + return E_INVALIDARG; + } + + // Check the coordinates are less than the extents + + if ((pSourceRect->right > Width) || + (pSourceRect->bottom > Height)) { + + return E_INVALIDARG; + } + return NOERROR; +} + + +// Check the target rectangle has some valid coordinates, which amounts to +// little more than checking the destination rectangle isn't empty. Derived +// classes may call this when they have their SetTargetRect method called to +// check the rectangle validity, we do not update the rectangles passed in +// Although we store the rectangle in left, top, right and bottom coordinates +// instead of left, top, width and height as OLE uses we do take into account +// that the rectangle is used up to, but not including, the right column and +// bottom row of pixels, see the Win32 documentation on RECT for more details + +HRESULT CBaseControlVideo::CheckTargetRect(__in RECT *pTargetRect) +{ + // Check the pointer is valid + + if (pTargetRect == NULL) { + return E_POINTER; + } + + // These overflow the WIDTH and HEIGHT checks + + if (pTargetRect->left > pTargetRect->right || + pTargetRect->top > pTargetRect->bottom) { + return E_INVALIDARG; + } + + // Check the rectangle has valid coordinates + + if (WIDTH(pTargetRect) <= 0 || HEIGHT(pTargetRect) <= 0) { + return E_INVALIDARG; + } + + ASSERT(IsRectEmpty(pTargetRect) == FALSE); + return NOERROR; +} +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/winctrl.h
Added
@@ -0,0 +1,224 @@ +//------------------------------------------------------------------------------ +// File: WinCtrl.h +// +// Desc: DirectShow base classes - defines classes for video control +// interfaces. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __WINCTRL__ +#define __WINCTRL__ + +#define ABSOL(x) (x < 0 ? -x : x) +#define NEGAT(x) (x > 0 ? -x : x) + +// Helper +BOOL WINAPI PossiblyEatMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + +class CBaseControlWindow : public CBaseVideoWindow, public CBaseWindow +{ +protected: + + CBaseFilter *m_pFilter; // Pointer to owning media filter + CBasePin *m_pPin; // Controls media types for connection + CCritSec *m_pInterfaceLock; // Externally defined critical section + COLORREF m_BorderColour; // Current window border colour + BOOL m_bAutoShow; // What happens when the state changes + HWND m_hwndOwner; // Owner window that we optionally have + HWND m_hwndDrain; // HWND to post any messages received + BOOL m_bCursorHidden; // Should we hide the window cursor + +public: + + // Internal methods for other objects to get information out + + HRESULT DoSetWindowStyle(long Style,long WindowLong); + HRESULT DoGetWindowStyle(__out long *pStyle,long WindowLong); + BOOL IsAutoShowEnabled() { return m_bAutoShow; }; + COLORREF GetBorderColour() { return m_BorderColour; }; + HWND GetOwnerWindow() { return m_hwndOwner; }; + BOOL IsCursorHidden() { return m_bCursorHidden; }; + + inline BOOL PossiblyEatMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) + { + return ::PossiblyEatMessage(m_hwndDrain, uMsg, wParam, lParam); + } + + // Derived classes must call this to set the pin the filter is using + // We don't have the pin passed in to the constructor (as we do with + // the CBaseFilter object) because filters typically create the + // pins dynamically when requested in CBaseFilter::GetPin. This can + // not be called from our constructor because is is a virtual method + + void SetControlWindowPin(CBasePin *pPin) { + m_pPin = pPin; + } + +public: + + CBaseControlWindow(__inout CBaseFilter *pFilter, // Owning media filter + __in CCritSec *pInterfaceLock, // Locking object + __in_opt LPCTSTR pName, // Object description + __inout_opt LPUNKNOWN pUnk, // Normal COM ownership + __inout HRESULT *phr); // OLE return code + + // These are the properties we support + + STDMETHODIMP put_Caption(__in BSTR strCaption); + STDMETHODIMP get_Caption(__out BSTR *pstrCaption); + STDMETHODIMP put_AutoShow(long AutoShow); + STDMETHODIMP get_AutoShow(__out long *AutoShow); + STDMETHODIMP put_WindowStyle(long WindowStyle); + STDMETHODIMP get_WindowStyle(__out long *pWindowStyle); + STDMETHODIMP put_WindowStyleEx(long WindowStyleEx); + STDMETHODIMP get_WindowStyleEx(__out long *pWindowStyleEx); + STDMETHODIMP put_WindowState(long WindowState); + STDMETHODIMP get_WindowState(__out long *pWindowState); + STDMETHODIMP put_BackgroundPalette(long BackgroundPalette); + STDMETHODIMP get_BackgroundPalette(__out long *pBackgroundPalette); + STDMETHODIMP put_Visible(long Visible); + STDMETHODIMP get_Visible(__out long *pVisible); + STDMETHODIMP put_Left(long Left); + STDMETHODIMP get_Left(__out long *pLeft); + STDMETHODIMP put_Width(long Width); + STDMETHODIMP get_Width(__out long *pWidth); + STDMETHODIMP put_Top(long Top); + STDMETHODIMP get_Top(__out long *pTop); + STDMETHODIMP put_Height(long Height); + STDMETHODIMP get_Height(__out long *pHeight); + STDMETHODIMP put_Owner(OAHWND Owner); + STDMETHODIMP get_Owner(__out OAHWND *Owner); + STDMETHODIMP put_MessageDrain(OAHWND Drain); + STDMETHODIMP get_MessageDrain(__out OAHWND *Drain); + STDMETHODIMP get_BorderColor(__out long *Color); + STDMETHODIMP put_BorderColor(long Color); + STDMETHODIMP get_FullScreenMode(__out long *FullScreenMode); + STDMETHODIMP put_FullScreenMode(long FullScreenMode); + + // And these are the methods + + STDMETHODIMP SetWindowForeground(long Focus); + STDMETHODIMP NotifyOwnerMessage(OAHWND hwnd,long uMsg,LONG_PTR wParam,LONG_PTR lParam); + STDMETHODIMP GetMinIdealImageSize(__out long *pWidth,__out long *pHeight); + STDMETHODIMP GetMaxIdealImageSize(__out long *pWidth,__out long *pHeight); + STDMETHODIMP SetWindowPosition(long Left,long Top,long Width,long Height); + STDMETHODIMP GetWindowPosition(__out long *pLeft,__out long *pTop,__out long *pWidth,__out long *pHeight); + STDMETHODIMP GetRestorePosition(__out long *pLeft,__out long *pTop,__out long *pWidth,__out long *pHeight); + STDMETHODIMP HideCursor(long HideCursor); + STDMETHODIMP IsCursorHidden(__out long *CursorHidden); +}; + +// This class implements the IBasicVideo interface + +class CBaseControlVideo : public CBaseBasicVideo +{ +protected: + + CBaseFilter *m_pFilter; // Pointer to owning media filter + CBasePin *m_pPin; // Controls media types for connection + CCritSec *m_pInterfaceLock; // Externally defined critical section + +public: + + // Derived classes must provide these for the implementation + + virtual HRESULT IsDefaultTargetRect() PURE; + virtual HRESULT SetDefaultTargetRect() PURE; + virtual HRESULT SetTargetRect(RECT *pTargetRect) PURE; + virtual HRESULT GetTargetRect(RECT *pTargetRect) PURE; + virtual HRESULT IsDefaultSourceRect() PURE; + virtual HRESULT SetDefaultSourceRect() PURE; + virtual HRESULT SetSourceRect(RECT *pSourceRect) PURE; + virtual HRESULT GetSourceRect(RECT *pSourceRect) PURE; + virtual HRESULT GetStaticImage(__inout long *pBufferSize,__out_bcount_part(*pBufferSize, *pBufferSize) long *pDIBImage) PURE; + + // Derived classes must override this to return a VIDEOINFO representing + // the video format. We cannot call IPin ConnectionMediaType to get this + // format because various filters dynamically change the type when using + // DirectDraw such that the format shows the position of the logical + // bitmap in a frame buffer surface, so the size might be returned as + // 1024x768 pixels instead of 320x240 which is the real video dimensions + + __out virtual VIDEOINFOHEADER *GetVideoFormat() PURE; + + // Helper functions for creating memory renderings of a DIB image + + HRESULT GetImageSize(__in VIDEOINFOHEADER *pVideoInfo, + __out LONG *pBufferSize, + __in RECT *pSourceRect); + + HRESULT CopyImage(IMediaSample *pMediaSample, + __in VIDEOINFOHEADER *pVideoInfo, + __inout LONG *pBufferSize, + __out_bcount_part(*pBufferSize, *pBufferSize) BYTE *pVideoImage, + __in RECT *pSourceRect); + + // Override this if you want notifying when the rectangles change + virtual HRESULT OnUpdateRectangles() { return NOERROR; }; + virtual HRESULT OnVideoSizeChange(); + + // Derived classes must call this to set the pin the filter is using + // We don't have the pin passed in to the constructor (as we do with + // the CBaseFilter object) because filters typically create the + // pins dynamically when requested in CBaseFilter::GetPin. This can + // not be called from our constructor because is is a virtual method + + void SetControlVideoPin(__inout CBasePin *pPin) { + m_pPin = pPin; + } + + // Helper methods for checking rectangles + virtual HRESULT CheckSourceRect(__in RECT *pSourceRect); + virtual HRESULT CheckTargetRect(__in RECT *pTargetRect); + +public: + + CBaseControlVideo(__inout CBaseFilter *pFilter, // Owning media filter + __in CCritSec *pInterfaceLock, // Serialise interface + __in_opt LPCTSTR pName, // Object description + __inout_opt LPUNKNOWN pUnk, // Normal COM ownership + __inout HRESULT *phr); // OLE return code + + // These are the properties we support + + STDMETHODIMP get_AvgTimePerFrame(__out REFTIME *pAvgTimePerFrame); + STDMETHODIMP get_BitRate(__out long *pBitRate); + STDMETHODIMP get_BitErrorRate(__out long *pBitErrorRate); + STDMETHODIMP get_VideoWidth(__out long *pVideoWidth); + STDMETHODIMP get_VideoHeight(__out long *pVideoHeight); + STDMETHODIMP put_SourceLeft(long SourceLeft); + STDMETHODIMP get_SourceLeft(__out long *pSourceLeft); + STDMETHODIMP put_SourceWidth(long SourceWidth); + STDMETHODIMP get_SourceWidth(__out long *pSourceWidth); + STDMETHODIMP put_SourceTop(long SourceTop); + STDMETHODIMP get_SourceTop(__out long *pSourceTop); + STDMETHODIMP put_SourceHeight(long SourceHeight); + STDMETHODIMP get_SourceHeight(__out long *pSourceHeight); + STDMETHODIMP put_DestinationLeft(long DestinationLeft); + STDMETHODIMP get_DestinationLeft(__out long *pDestinationLeft); + STDMETHODIMP put_DestinationWidth(long DestinationWidth); + STDMETHODIMP get_DestinationWidth(__out long *pDestinationWidth); + STDMETHODIMP put_DestinationTop(long DestinationTop); + STDMETHODIMP get_DestinationTop(__out long *pDestinationTop); + STDMETHODIMP put_DestinationHeight(long DestinationHeight); + STDMETHODIMP get_DestinationHeight(__out long *pDestinationHeight); + + // And these are the methods + + STDMETHODIMP GetVideoSize(__out long *pWidth,__out long *pHeight); + STDMETHODIMP SetSourcePosition(long Left,long Top,long Width,long Height); + STDMETHODIMP GetSourcePosition(__out long *pLeft,__out long *pTop,__out long *pWidth,__out long *pHeight); + STDMETHODIMP GetVideoPaletteEntries(long StartIndex,long Entries,__out long *pRetrieved,__out_ecount_part(Entries, *pRetrieved) long *pPalette); + STDMETHODIMP SetDefaultSourcePosition(); + STDMETHODIMP IsUsingDefaultSource(); + STDMETHODIMP SetDestinationPosition(long Left,long Top,long Width,long Height); + STDMETHODIMP GetDestinationPosition(__out long *pLeft,__out long *pTop,__out long *pWidth,__out long *pHeight); + STDMETHODIMP SetDefaultDestinationPosition(); + STDMETHODIMP IsUsingDefaultDestination(); + STDMETHODIMP GetCurrentImage(__inout long *pBufferSize,__out_bcount_part(*pBufferSize, *pBufferSize) long *pVideoImage); +}; + +#endif // __WINCTRL__ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/winutil.cpp
Added
@@ -0,0 +1,2746 @@ +//------------------------------------------------------------------------------ +// File: WinUtil.cpp +// +// Desc: DirectShow base classes - implements generic window handler class. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#include <limits.h> +#include <dvdmedia.h> +#include <strsafe.h> +#include <checkbmi.h> + +static UINT MsgDestroy; + +// Constructor + +CBaseWindow::CBaseWindow(BOOL bDoGetDC, bool bDoPostToDestroy) : + m_hInstance(g_hInst), + m_hwnd(NULL), + m_hdc(NULL), + m_bActivated(FALSE), + m_pClassName(NULL), + m_ClassStyles(0), + m_WindowStyles(0), + m_WindowStylesEx(0), + m_ShowStageMessage(0), + m_ShowStageTop(0), + m_MemoryDC(NULL), + m_hPalette(NULL), + m_bBackground(FALSE), +#ifdef DEBUG + m_bRealizing(FALSE), +#endif + m_bNoRealize(FALSE), + m_bDoPostToDestroy(bDoPostToDestroy) +{ + m_bDoGetDC = bDoGetDC; +} + + +// Prepare a window by spinning off a worker thread to do the creation and +// also poll the message input queue. We leave this to be called by derived +// classes because they might want to override methods like MessageLoop and +// InitialiseWindow, if we do this during construction they'll ALWAYS call +// this base class methods. We make the worker thread create the window so +// it owns it rather than the filter graph thread which is constructing us + +HRESULT CBaseWindow::PrepareWindow() +{ + if (m_hwnd) return NOERROR; + ASSERT(m_hwnd == NULL); + ASSERT(m_hdc == NULL); + + // Get the derived object's window and class styles + + m_pClassName = GetClassWindowStyles(&m_ClassStyles, + &m_WindowStyles, + &m_WindowStylesEx); + if (m_pClassName == NULL) { + return E_FAIL; + } + + // Register our special private messages + m_ShowStageMessage = RegisterWindowMessage(SHOWSTAGE); + + // RegisterWindowMessage() returns 0 if an error occurs. + if (0 == m_ShowStageMessage) { + return AmGetLastErrorToHResult(); + } + + m_ShowStageTop = RegisterWindowMessage(SHOWSTAGETOP); + if (0 == m_ShowStageTop) { + return AmGetLastErrorToHResult(); + } + + m_RealizePalette = RegisterWindowMessage(REALIZEPALETTE); + if (0 == m_RealizePalette) { + return AmGetLastErrorToHResult(); + } + + MsgDestroy = RegisterWindowMessage(TEXT("AM_DESTROY")); + if (0 == MsgDestroy) { + return AmGetLastErrorToHResult(); + } + + return DoCreateWindow(); +} + + +// Destructor just a placeholder so that we know it becomes virtual +// Derived classes MUST call DoneWithWindow in their destructors so +// that no messages arrive after the derived class constructor ends + +#ifdef DEBUG +CBaseWindow::~CBaseWindow() +{ + ASSERT(m_hwnd == NULL); + ASSERT(m_hdc == NULL); +} +#endif + + +// We use the sync worker event to have the window destroyed. All we do is +// signal the event and wait on the window thread handle. Trying to send it +// messages causes too many problems, furthermore to be on the safe side we +// just wait on the thread handle while it returns WAIT_TIMEOUT or there is +// a sent message to process on this thread. If the constructor failed to +// create the thread in the first place then the loop will get terminated + +HRESULT CBaseWindow::DoneWithWindow() +{ + if (!IsWindow(m_hwnd) || (GetWindowThreadProcessId(m_hwnd, NULL) != GetCurrentThreadId())) { + + if (IsWindow(m_hwnd)) { + + // This code should only be executed if the window exists and if the window's + // messages are processed on a different thread. + ASSERT(GetWindowThreadProcessId(m_hwnd, NULL) != GetCurrentThreadId()); + + if (m_bDoPostToDestroy) { + + HRESULT hr = S_OK; + CAMEvent m_evDone(FALSE, &hr); + if (FAILED(hr)) { + return hr; + } + + // We must post a message to destroy the window + // That way we can't be in the middle of processing a + // message posted to our window when we do go away + // Sending a message gives less synchronization. + PostMessage(m_hwnd, MsgDestroy, (WPARAM)(HANDLE)m_evDone, 0); + WaitDispatchingMessages(m_evDone, INFINITE); + } else { + SendMessage(m_hwnd, MsgDestroy, 0, 0); + } + } + + // + // This is not a leak, the window manager automatically free's + // hdc's that were got via GetDC, which is the case here. + // We set it to NULL so that we don't get any asserts later. + // + m_hdc = NULL; + + // + // We need to free this DC though because USER32 does not know + // anything about it. + // + if (m_MemoryDC) + { + EXECUTE_ASSERT(DeleteDC(m_MemoryDC)); + m_MemoryDC = NULL; + } + + // Reset the window variables + m_hwnd = NULL; + + return NOERROR; + } + const HWND hwnd = m_hwnd; + if (hwnd == NULL) { + return NOERROR; + } + + InactivateWindow(); + NOTE("Inactivated"); + + // Reset the window styles before destruction + + SetWindowLong(hwnd,GWL_STYLE,m_WindowStyles); + ASSERT(GetParent(hwnd) == NULL); + NOTE1("Reset window styles %d",m_WindowStyles); + + // UnintialiseWindow sets m_hwnd to NULL so save a copy + UninitialiseWindow(); + DbgLog((LOG_TRACE, 2, TEXT("Destroying 0x%8.8X"), hwnd)); + if (!DestroyWindow(hwnd)) { + DbgLog((LOG_TRACE, 0, TEXT("DestroyWindow %8.8X failed code %d"), + hwnd, GetLastError())); + DbgBreak(""); + } + + // Reset our state so we can be prepared again + + m_pClassName = NULL; + m_ClassStyles = 0; + m_WindowStyles = 0; + m_WindowStylesEx = 0; + m_ShowStageMessage = 0; + m_ShowStageTop = 0; + + return NOERROR; +} + + +// Called at the end to put the window in an inactive state. The pending list +// will always have been cleared by this time so event if the worker thread +// gets has been signaled and gets in to render something it will find both +// the state has been changed and that there are no available sample images +// Since we wait on the window thread to complete we don't lock the object + +HRESULT CBaseWindow::InactivateWindow() +{ + // Has the window been activated + if (m_bActivated == FALSE) { + return S_FALSE; + } + + m_bActivated = FALSE; + ShowWindow(m_hwnd,SW_HIDE); + return NOERROR; +} + + +HRESULT CBaseWindow::CompleteConnect() +{ + m_bActivated = FALSE; + return NOERROR; +} + +// This displays a normal window. We ask the base window class for default +// sizes which unless overriden will return DEFWIDTH and DEFHEIGHT. We go +// through a couple of extra hoops to get the client area the right size +// as the object specifies which accounts for the AdjustWindowRectEx calls +// We also DWORD align the left and top coordinates of the window here to +// maximise the chance of being able to use DCI/DirectDraw primary surface + +HRESULT CBaseWindow::ActivateWindow() +{ + // Has the window been sized and positioned already + + if (m_bActivated == TRUE || GetParent(m_hwnd) != NULL) { + + SetWindowPos(m_hwnd, // Our window handle + HWND_TOP, // Put it at the top + 0, 0, 0, 0, // Leave in current position + SWP_NOMOVE | // Don't change it's place + SWP_NOSIZE); // Change Z-order only + + m_bActivated = TRUE; + return S_FALSE; + } + + // Calculate the desired client rectangle + + RECT WindowRect, ClientRect = GetDefaultRect(); + GetWindowRect(m_hwnd,&WindowRect); + AdjustWindowRectEx(&ClientRect,GetWindowLong(m_hwnd,GWL_STYLE), + FALSE,GetWindowLong(m_hwnd,GWL_EXSTYLE)); + + // Align left and top edges on DWORD boundaries + + UINT WindowFlags = (SWP_NOACTIVATE | SWP_FRAMECHANGED); + WindowRect.left -= (WindowRect.left & 3); + WindowRect.top -= (WindowRect.top & 3); + + SetWindowPos(m_hwnd, // Window handle + HWND_TOP, // Put it at the top + WindowRect.left, // Align left edge + WindowRect.top, // And also top place + WIDTH(&ClientRect), // Horizontal size + HEIGHT(&ClientRect), // Vertical size + WindowFlags); // Don't show window + + m_bActivated = TRUE; + return NOERROR; +} + + +// This can be used to DWORD align the window for maximum performance + +HRESULT CBaseWindow::PerformanceAlignWindow() +{ + RECT ClientRect,WindowRect; + GetWindowRect(m_hwnd,&WindowRect); + ASSERT(m_bActivated == TRUE); + + // Don't do this if we're owned + + if (GetParent(m_hwnd)) { + return NOERROR; + } + + // Align left and top edges on DWORD boundaries + + GetClientRect(m_hwnd, &ClientRect); + MapWindowPoints(m_hwnd, HWND_DESKTOP, (LPPOINT) &ClientRect, 2); + WindowRect.left -= (ClientRect.left & 3); + WindowRect.top -= (ClientRect.top & 3); + UINT WindowFlags = (SWP_NOACTIVATE | SWP_NOSIZE); + + SetWindowPos(m_hwnd, // Window handle + HWND_TOP, // Put it at the top + WindowRect.left, // Align left edge + WindowRect.top, // And also top place + (int) 0,(int) 0, // Ignore these sizes + WindowFlags); // Don't show window + + return NOERROR; +} + + +// Install a palette into the base window - we may be called by a different +// thread to the one that owns the window. We have to be careful how we do +// the palette realisation as we could be a different thread to the window +// which would cause an inter thread send message. Therefore we realise the +// palette by sending it a special message but without the window locked + +HRESULT CBaseWindow::SetPalette(HPALETTE hPalette) +{ + // We must own the window lock during the change + { + CAutoLock cWindowLock(&m_WindowLock); + CAutoLock cPaletteLock(&m_PaletteLock); + ASSERT(hPalette); + m_hPalette = hPalette; + } + return SetPalette(); +} + + +HRESULT CBaseWindow::SetPalette() +{ + if (!m_bNoRealize) { + SendMessage(m_hwnd, m_RealizePalette, 0, 0); + return S_OK; + } else { + // Just select the palette + ASSERT(m_hdc); + ASSERT(m_MemoryDC); + + CAutoLock cPaletteLock(&m_PaletteLock); + SelectPalette(m_hdc,m_hPalette,m_bBackground); + SelectPalette(m_MemoryDC,m_hPalette,m_bBackground); + + return S_OK; + } +} + + +void CBaseWindow::UnsetPalette() +{ + CAutoLock cWindowLock(&m_WindowLock); + CAutoLock cPaletteLock(&m_PaletteLock); + + // Get a standard VGA colour palette + + HPALETTE hPalette = (HPALETTE) GetStockObject(DEFAULT_PALETTE); + ASSERT(hPalette); + + SelectPalette(GetWindowHDC(), hPalette, TRUE); + SelectPalette(GetMemoryHDC(), hPalette, TRUE); + + m_hPalette = NULL; +} + + +void CBaseWindow::LockPaletteLock() +{ + m_PaletteLock.Lock(); +} + + +void CBaseWindow::UnlockPaletteLock() +{ + m_PaletteLock.Unlock(); +} + + +// Realise our palettes in the window and device contexts + +HRESULT CBaseWindow::DoRealisePalette(BOOL bForceBackground) +{ + { + CAutoLock cPaletteLock(&m_PaletteLock); + + if (m_hPalette == NULL) { + return NOERROR; + } + + // Realize the palette on the window thread + ASSERT(m_hdc); + ASSERT(m_MemoryDC); + + SelectPalette(m_hdc,m_hPalette,m_bBackground || bForceBackground); + SelectPalette(m_MemoryDC,m_hPalette,m_bBackground); + } + + // If we grab a critical section here we can deadlock + // with the window thread because one of the side effects + // of RealizePalette is to send a WM_PALETTECHANGED message + // to every window in the system. In our handling + // of WM_PALETTECHANGED we used to grab this CS too. + // The really bad case is when our renderer calls DoRealisePalette() + // while we're in the middle of processing a palette change + // for another window. + // So don't hold the critical section while actually realising + // the palette. In any case USER is meant to manage palette + // handling - we shouldn't have to serialize everything as well + ASSERT(CritCheckOut(&m_WindowLock)); + ASSERT(CritCheckOut(&m_PaletteLock)); + + EXECUTE_ASSERT(RealizePalette(m_hdc) != GDI_ERROR); + EXECUTE_ASSERT(RealizePalette(m_MemoryDC) != GDI_ERROR); + + return (GdiFlush() == FALSE ? S_FALSE : S_OK); +} + + +// This is the global window procedure + +LRESULT CALLBACK WndProc(HWND hwnd, // Window handle + UINT uMsg, // Message ID + WPARAM wParam, // First parameter + LPARAM lParam) // Other parameter +{ + + // Get the window long that holds our window object pointer + // If it is NULL then we are initialising the window in which + // case the object pointer has been passed in the window creation + // structure. IF we get any messages before WM_NCCREATE we will + // pass them to DefWindowProc. + + CBaseWindow *pBaseWindow = _GetWindowLongPtr<CBaseWindow*>(hwnd,0); + + if (pBaseWindow == NULL) { + + // Get the structure pointer from the create struct. + // We can only do this for WM_NCCREATE which should be one of + // the first messages we receive. Anything before this will + // have to be passed to DefWindowProc (i.e. WM_GETMINMAXINFO) + + // If the message is WM_NCCREATE we set our pBaseWindow pointer + // and will then place it in the window structure + + // turn off WS_EX_LAYOUTRTL style for quartz windows + if (uMsg == WM_NCCREATE) { + SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) & ~0x400000); + } + + if ((uMsg != WM_NCCREATE) + || (NULL == (pBaseWindow = *(CBaseWindow**) ((LPCREATESTRUCT)lParam)->lpCreateParams))) + { + return(DefWindowProc(hwnd, uMsg, wParam, lParam)); + } + + // Set the window LONG to be the object who created us +#ifdef DEBUG + SetLastError(0); // because of the way SetWindowLong works +#endif + + LONG_PTR rc = _SetWindowLongPtr(hwnd, (DWORD) 0, pBaseWindow); + + +#ifdef DEBUG + if (0 == rc) { + // SetWindowLong MIGHT have failed. (Read the docs which admit + // that it is awkward to work out if you have had an error.) + LONG lasterror = GetLastError(); + ASSERT(0 == lasterror); + // If this is not the case we have not set the pBaseWindow pointer + // into the window structure and we will blow up. + } +#endif + + } + // See if this is the packet of death + if (uMsg == MsgDestroy && uMsg != 0) { + pBaseWindow->DoneWithWindow(); + if (pBaseWindow->m_bDoPostToDestroy) { + EXECUTE_ASSERT(SetEvent((HANDLE)wParam)); + } + return 0; + } + return pBaseWindow->OnReceiveMessage(hwnd,uMsg,wParam,lParam); +} + + +// When the window size changes we adjust our member variables that +// contain the dimensions of the client rectangle for our window so +// that we come to render an image we will know whether to stretch + +BOOL CBaseWindow::OnSize(LONG Width, LONG Height) +{ + m_Width = Width; + m_Height = Height; + return TRUE; +} + + +// This function handles the WM_CLOSE message + +BOOL CBaseWindow::OnClose() +{ + ShowWindow(m_hwnd,SW_HIDE); + return TRUE; +} + + +// This is called by the worker window thread when it receives a terminate +// message from the window object destructor to delete all the resources we +// allocated during initialisation. By the time the worker thread exits all +// processing will have been completed as the source filter disconnection +// flushes the image pending sample, therefore the GdiFlush should succeed + +HRESULT CBaseWindow::UninitialiseWindow() +{ + // Have we already cleaned up + + if (m_hwnd == NULL) { + ASSERT(m_hdc == NULL); + ASSERT(m_MemoryDC == NULL); + return NOERROR; + } + + // Release the window resources + + EXECUTE_ASSERT(GdiFlush()); + + if (m_hdc) + { + EXECUTE_ASSERT(ReleaseDC(m_hwnd,m_hdc)); + m_hdc = NULL; + } + + if (m_MemoryDC) + { + EXECUTE_ASSERT(DeleteDC(m_MemoryDC)); + m_MemoryDC = NULL; + } + + // Reset the window variables + m_hwnd = NULL; + + return NOERROR; +} + + +// This is called by the worker window thread after it has created the main +// window and it wants to initialise the rest of the owner objects window +// variables such as the device contexts. We execute this function with the +// critical section still locked. Nothing in this function must generate any +// SendMessage calls to the window because this is executing on the window +// thread so the message will never be processed and we will deadlock + +HRESULT CBaseWindow::InitialiseWindow(HWND hwnd) +{ + // Initialise the window variables + + ASSERT(IsWindow(hwnd)); + m_hwnd = hwnd; + + if (m_bDoGetDC) + { + EXECUTE_ASSERT(m_hdc = GetDC(hwnd)); + EXECUTE_ASSERT(m_MemoryDC = CreateCompatibleDC(m_hdc)); + + EXECUTE_ASSERT(SetStretchBltMode(m_hdc,COLORONCOLOR)); + EXECUTE_ASSERT(SetStretchBltMode(m_MemoryDC,COLORONCOLOR)); + } + + return NOERROR; +} + +HRESULT CBaseWindow::DoCreateWindow() +{ + WNDCLASS wndclass; // Used to register classes + BOOL bRegistered; // Is this class registered + HWND hwnd; // Handle to our window + + bRegistered = GetClassInfo(m_hInstance, // Module instance + m_pClassName, // Window class + &wndclass); // Info structure + + // if the window is to be used for drawing puposes and we are getting a DC + // for the entire lifetime of the window then changes the class style to do + // say so. If we don't set this flag then the DC comes from the cache and is + // really bad. + if (m_bDoGetDC) + { + m_ClassStyles |= CS_OWNDC; + } + + if (bRegistered == FALSE) { + + // Register the renderer window class + + wndclass.lpszClassName = m_pClassName; + wndclass.style = m_ClassStyles; + wndclass.lpfnWndProc = WndProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = sizeof(CBaseWindow *); + wndclass.hInstance = m_hInstance; + wndclass.hIcon = NULL; + wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); + wndclass.hbrBackground = (HBRUSH) NULL; + wndclass.lpszMenuName = NULL; + + RegisterClass(&wndclass); + } + + // Create the frame window. Pass the pBaseWindow information in the + // CreateStruct which allows our message handling loop to get hold of + // the pBaseWindow pointer. + + CBaseWindow *pBaseWindow = this; // The owner window object + hwnd = CreateWindowEx(m_WindowStylesEx, // Extended styles + m_pClassName, // Registered name + TEXT("ActiveMovie Window"), // Window title + m_WindowStyles, // Window styles + CW_USEDEFAULT, // Start x position + CW_USEDEFAULT, // Start y position + DEFWIDTH, // Window width + DEFHEIGHT, // Window height + NULL, // Parent handle + NULL, // Menu handle + m_hInstance, // Instance handle + &pBaseWindow); // Creation data + + // If we failed signal an error to the object constructor (based on the + // last Win32 error on this thread) then signal the constructor thread + // to continue, release the mutex to let others have a go and exit + + if (hwnd == NULL) { + DWORD Error = GetLastError(); + return AmHresultFromWin32(Error); + } + + // Check the window LONG is the object who created us + ASSERT(GetWindowLongPtr(hwnd, 0) == (LONG_PTR)this); + + // Initialise the window and then signal the constructor so that it can + // continue and then finally unlock the object's critical section. The + // window class is left registered even after we terminate the thread + // as we don't know when the last window has been closed. So we allow + // the operating system to free the class resources as appropriate + + InitialiseWindow(hwnd); + + DbgLog((LOG_TRACE, 2, TEXT("Created window class (%s) HWND(%8.8X)"), + m_pClassName, hwnd)); + + return S_OK; +} + + +// The base class provides some default handling and calls DefWindowProc + +LRESULT CBaseWindow::OnReceiveMessage(HWND hwnd, // Window handle + UINT uMsg, // Message ID + WPARAM wParam, // First parameter + LPARAM lParam) // Other parameter +{ + ASSERT(IsWindow(hwnd)); + + if (PossiblyEatMessage(uMsg, wParam, lParam)) + return 0; + + // This is sent by the IVideoWindow SetWindowForeground method. If the + // window is invisible we will show it and make it topmost without the + // foreground focus. If the window is visible it will also be made the + // topmost window without the foreground focus. If wParam is TRUE then + // for both cases the window will be forced into the foreground focus + + if (uMsg == m_ShowStageMessage) { + + BOOL bVisible = IsWindowVisible(hwnd); + SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW | + (bVisible ? SWP_NOACTIVATE : 0)); + + // Should we bring the window to the foreground + if (wParam == TRUE) { + SetForegroundWindow(hwnd); + } + return (LRESULT) 1; + } + + // When we go fullscreen we have to add the WS_EX_TOPMOST style to the + // video window so that it comes out above any task bar (this is more + // relevant to WindowsNT than Windows95). However the SetWindowPos call + // must be on the same thread as that which created the window. The + // wParam parameter can be TRUE or FALSE to set and reset the topmost + + if (uMsg == m_ShowStageTop) { + HWND HwndTop = (wParam == TRUE ? HWND_TOPMOST : HWND_NOTOPMOST); + BOOL bVisible = IsWindowVisible(hwnd); + SetWindowPos(hwnd, HwndTop, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | + (wParam == TRUE ? SWP_SHOWWINDOW : 0) | + (bVisible ? SWP_NOACTIVATE : 0)); + return (LRESULT) 1; + } + + // New palette stuff + if (uMsg == m_RealizePalette) { + ASSERT(m_hwnd == hwnd); + return OnPaletteChange(m_hwnd,WM_QUERYNEWPALETTE); + } + + switch (uMsg) { + + // Repaint the window if the system colours change + + case WM_SYSCOLORCHANGE: + + InvalidateRect(hwnd,NULL,FALSE); + return (LRESULT) 1; + + // Somebody has changed the palette + case WM_PALETTECHANGED: + + OnPaletteChange((HWND)wParam,uMsg); + return (LRESULT) 0; + + // We are about to receive the keyboard focus so we ask GDI to realise + // our logical palette again and hopefully it will be fully installed + // without any mapping having to be done during any picture rendering + + case WM_QUERYNEWPALETTE: + ASSERT(m_hwnd == hwnd); + return OnPaletteChange(m_hwnd,uMsg); + + // do NOT fwd WM_MOVE. the parameters are the location of the parent + // window, NOT what the renderer should be looking at. But we need + // to make sure the overlay is moved with the parent window, so we + // do this. + case WM_MOVE: + if (IsWindowVisible(m_hwnd)) { + PostMessage(m_hwnd,WM_PAINT,0,0); + } + break; + + // Store the width and height as useful base class members + + case WM_SIZE: + + OnSize(LOWORD(lParam), HIWORD(lParam)); + return (LRESULT) 0; + + // Intercept the WM_CLOSE messages to hide the window + + case WM_CLOSE: + + OnClose(); + return (LRESULT) 0; + } + return DefWindowProc(hwnd,uMsg,wParam,lParam); +} + + +// This handles the Windows palette change messages - if we do realise our +// palette then we return TRUE otherwise we return FALSE. If our window is +// foreground application then we should get first choice of colours in the +// system palette entries. We get best performance when our logical palette +// includes the standard VGA colours (at the beginning and end) otherwise +// GDI may have to map from our palette to the device palette while drawing + +LRESULT CBaseWindow::OnPaletteChange(HWND hwnd,UINT Message) +{ + // First check we are not changing the palette during closedown + + if (m_hwnd == NULL || hwnd == NULL) { + return (LRESULT) 0; + } + ASSERT(!m_bRealizing); + + // Should we realise our palette again + + if ((Message == WM_QUERYNEWPALETTE || hwnd != m_hwnd)) { + // It seems that even if we're invisible that we can get asked + // to realize our palette and this can cause really ugly side-effects + // Seems like there's another bug but this masks it a least for the + // shutting down case. + if (!IsWindowVisible(m_hwnd)) { + DbgLog((LOG_TRACE, 1, TEXT("Realizing when invisible!"))); + return (LRESULT) 0; + } + + // Avoid recursion with multiple graphs in the same app +#ifdef DEBUG + m_bRealizing = TRUE; +#endif + DoRealisePalette(Message != WM_QUERYNEWPALETTE); +#ifdef DEBUG + m_bRealizing = FALSE; +#endif + + // Should we redraw the window with the new palette + if (Message == WM_PALETTECHANGED) { + InvalidateRect(m_hwnd,NULL,FALSE); + } + } + + return (LRESULT) 1; +} + + +// Determine if the window exists. + +bool CBaseWindow::WindowExists() +{ + return !!IsWindow(m_hwnd); +} + + +// Return the default window rectangle + +RECT CBaseWindow::GetDefaultRect() +{ + RECT DefaultRect = {0,0,DEFWIDTH,DEFHEIGHT}; + ASSERT(m_hwnd); + // ASSERT(m_hdc); + return DefaultRect; +} + + +// Return the current window width + +LONG CBaseWindow::GetWindowWidth() +{ + ASSERT(m_hwnd); + // ASSERT(m_hdc); + return m_Width; +} + + +// Return the current window height + +LONG CBaseWindow::GetWindowHeight() +{ + ASSERT(m_hwnd); + // ASSERT(m_hdc); + return m_Height; +} + + +// Return the window handle + +HWND CBaseWindow::GetWindowHWND() +{ + ASSERT(m_hwnd); + // ASSERT(m_hdc); + return m_hwnd; +} + + +// Return the window drawing device context + +HDC CBaseWindow::GetWindowHDC() +{ + ASSERT(m_hwnd); + ASSERT(m_hdc); + return m_hdc; +} + + +// Return the offscreen window drawing device context + +HDC CBaseWindow::GetMemoryHDC() +{ + ASSERT(m_hwnd); + ASSERT(m_MemoryDC); + return m_MemoryDC; +} + + +#ifdef DEBUG +HPALETTE CBaseWindow::GetPalette() +{ + // The palette lock should always be held when accessing + // m_hPalette. + ASSERT(CritCheckIn(&m_PaletteLock)); + return m_hPalette; +} +#endif // DEBUG + + +// This is available to clients who want to change the window visiblity. It's +// little more than an indirection to the Win32 ShowWindow although these is +// some benefit in going through here as this function may change sometime + +HRESULT CBaseWindow::DoShowWindow(LONG ShowCmd) +{ + ShowWindow(m_hwnd,ShowCmd); + return NOERROR; +} + + +// Generate a WM_PAINT message for the video window + +void CBaseWindow::PaintWindow(BOOL bErase) +{ + InvalidateRect(m_hwnd,NULL,bErase); +} + + +// Allow an application to have us set the video window in the foreground. We +// have this because it is difficult for one thread to do do this to a window +// owned by another thread. Rather than expose the message we use to execute +// the inter thread send message we provide the interface function. All we do +// is to SendMessage to the video window renderer thread with a WM_SHOWSTAGE + +void CBaseWindow::DoSetWindowForeground(BOOL bFocus) +{ + SendMessage(m_hwnd,m_ShowStageMessage,(WPARAM) bFocus,(LPARAM) 0); +} + + +// Constructor initialises the owning object pointer. Since we are a worker +// class for the main window object we have relatively few state variables to +// look after. We are given device context handles to use later on as well as +// the source and destination rectangles (but reset them here just in case) + +CDrawImage::CDrawImage(__inout CBaseWindow *pBaseWindow) : + m_pBaseWindow(pBaseWindow), + m_hdc(NULL), + m_MemoryDC(NULL), + m_bStretch(FALSE), + m_pMediaType(NULL), + m_bUsingImageAllocator(FALSE) +{ + ASSERT(pBaseWindow); + ResetPaletteVersion(); + SetRectEmpty(&m_TargetRect); + SetRectEmpty(&m_SourceRect); + + m_perfidRenderTime = MSR_REGISTER(TEXT("Single Blt time")); +} + + +// Overlay the image time stamps on the picture. Access to this method is +// serialised by the caller. We display the sample start and end times on +// top of the video using TextOut on the device context we are handed. If +// there isn't enough room in the window for the times we don't show them + +void CDrawImage::DisplaySampleTimes(IMediaSample *pSample) +{ +#ifdef DEBUG + // + // Only allow the "annoying" time messages if the users has turned the + // logging "way up" + // + BOOL bAccept = DbgCheckModuleLevel(LOG_TRACE, 5); + if (bAccept == FALSE) { + return; + } +#endif + + TCHAR szTimesTIMELENGTH; // Time stamp strings + ASSERT(pSample); // Quick sanity check + RECT ClientRect; // Client window size + SIZE Size; // Size of text output + + // Get the time stamps and window size + + pSample->GetTime((REFERENCE_TIME*)&m_StartSample, (REFERENCE_TIME*)&m_EndSample); + HWND hwnd = m_pBaseWindow->GetWindowHWND(); + EXECUTE_ASSERT(GetClientRect(hwnd,&ClientRect)); + + // Format the sample time stamps + + (void)StringCchPrintf(szTimes,NUMELMS(szTimes),TEXT("%08d : %08d"), + m_StartSample.Millisecs(), + m_EndSample.Millisecs()); + + ASSERT(lstrlen(szTimes) < TIMELENGTH); + + // Put the times in the middle at the bottom of the window + + GetTextExtentPoint32(m_hdc,szTimes,lstrlen(szTimes),&Size); + INT XPos = ((ClientRect.right - ClientRect.left) - Size.cx) / 2; + INT YPos = ((ClientRect.bottom - ClientRect.top) - Size.cy) * 4 / 5; + + // Check the window is big enough to have sample times displayed + + if ((XPos > 0) && (YPos > 0)) { + TextOut(m_hdc,XPos,YPos,szTimes,lstrlen(szTimes)); + } +} + + +// This is called when the drawing code sees that the image has a down level +// palette cookie. We simply call the SetDIBColorTable Windows API with the +// palette that is found after the BITMAPINFOHEADER - we return no errors + +void CDrawImage::UpdateColourTable(HDC hdc,__in BITMAPINFOHEADER *pbmi) +{ + ASSERT(pbmi->biClrUsed); + RGBQUAD *pColourTable = (RGBQUAD *)(pbmi+1); + + // Set the new palette in the device context + + UINT uiReturn = SetDIBColorTable(hdc,(UINT) 0, + pbmi->biClrUsed, + pColourTable); + + // Should always succeed but check in debug builds + ASSERT(uiReturn == pbmi->biClrUsed); +} + + +// No source rectangle scaling is done by the base class + +RECT CDrawImage::ScaleSourceRect(const RECT *pSource) +{ + ASSERT(pSource); + return *pSource; +} + + +// This is called when the funky output pin uses our allocator. The samples we +// allocate are special because the memory is shared between us and GDI thus +// removing one copy when we ask for the image to be rendered. The source type +// information is in the main renderer m_mtIn field which is initialised when +// the media type is agreed in SetMediaType, the media type may be changed on +// the fly if, for example, the source filter needs to change the palette + +void CDrawImage::FastRender(IMediaSample *pMediaSample) +{ + BITMAPINFOHEADER *pbmi; // Image format data + DIBDATA *pDibData; // Stores DIB information + BYTE *pImage; // Pointer to image data + HBITMAP hOldBitmap; // Store the old bitmap + CImageSample *pSample; // Pointer to C++ object + + ASSERT(m_pMediaType); + + // From the untyped source format block get the VIDEOINFO and subsequently + // the BITMAPINFOHEADER structure. We can cast the IMediaSample interface + // to a CImageSample object so we can retrieve it's DIBSECTION details + + pbmi = HEADER(m_pMediaType->Format()); + pSample = (CImageSample *) pMediaSample; + pDibData = pSample->GetDIBData(); + hOldBitmap = (HBITMAP) SelectObject(m_MemoryDC,pDibData->hBitmap); + + // Get a pointer to the real image data + + HRESULT hr = pMediaSample->GetPointer(&pImage); + if (FAILED(hr)) { + return; + } + + // Do we need to update the colour table, we increment our palette cookie + // each time we get a dynamic format change. The sample palette cookie is + // stored in the DIBDATA structure so we try to keep the fields in sync + // By the time we get to draw the images the format change will be done + // so all we do is ask the renderer for what it's palette version is + + if (pDibData->PaletteVersion < GetPaletteVersion()) { + ASSERT(pbmi->biBitCount <= iPALETTE); + UpdateColourTable(m_MemoryDC,pbmi); + pDibData->PaletteVersion = GetPaletteVersion(); + } + + // This allows derived classes to change the source rectangle that we do + // the drawing with. For example a renderer may ask a codec to stretch + // the video from 320x240 to 640x480, in which case the source we see in + // here will still be 320x240, although the source we want to draw with + // should be scaled up to 640x480. The base class implementation of this + // method does nothing but return the same rectangle as we are passed in + + RECT SourceRect = ScaleSourceRect(&m_SourceRect); + + // Is the window the same size as the video + + if (m_bStretch == FALSE) { + + // Put the image straight into the window + + BitBlt( + (HDC) m_hdc, // Target device HDC + m_TargetRect.left, // X sink position + m_TargetRect.top, // Y sink position + m_TargetRect.right - m_TargetRect.left, // Destination width + m_TargetRect.bottom - m_TargetRect.top, // Destination height + m_MemoryDC, // Source device context + SourceRect.left, // X source position + SourceRect.top, // Y source position + SRCCOPY); // Simple copy + + } else { + + // Stretch the image when copying to the window + + StretchBlt( + (HDC) m_hdc, // Target device HDC + m_TargetRect.left, // X sink position + m_TargetRect.top, // Y sink position + m_TargetRect.right - m_TargetRect.left, // Destination width + m_TargetRect.bottom - m_TargetRect.top, // Destination height + m_MemoryDC, // Source device HDC + SourceRect.left, // X source position + SourceRect.top, // Y source position + SourceRect.right - SourceRect.left, // Source width + SourceRect.bottom - SourceRect.top, // Source height + SRCCOPY); // Simple copy + } + + // This displays the sample times over the top of the image. This used to + // draw the times into the offscreen device context however that actually + // writes the text into the image data buffer which may not be writable + + #ifdef DEBUG + DisplaySampleTimes(pMediaSample); + #endif + + // Put the old bitmap back into the device context so we don't leak + SelectObject(m_MemoryDC,hOldBitmap); +} + + +// This is called when there is a sample ready to be drawn, unfortunately the +// output pin was being rotten and didn't choose our super excellent shared +// memory DIB allocator so we have to do this slow render using boring old GDI +// SetDIBitsToDevice and StretchDIBits. The down side of using these GDI +// functions is that the image data has to be copied across from our address +// space into theirs before going to the screen (although in reality the cost +// is small because all they do is to map the buffer into their address space) + +void CDrawImage::SlowRender(IMediaSample *pMediaSample) +{ + // Get the BITMAPINFOHEADER for the connection + + ASSERT(m_pMediaType); + BITMAPINFOHEADER *pbmi = HEADER(m_pMediaType->Format()); + BYTE *pImage; + + // Get the image data buffer + + HRESULT hr = pMediaSample->GetPointer(&pImage); + if (FAILED(hr)) { + return; + } + + // This allows derived classes to change the source rectangle that we do + // the drawing with. For example a renderer may ask a codec to stretch + // the video from 320x240 to 640x480, in which case the source we see in + // here will still be 320x240, although the source we want to draw with + // should be scaled up to 640x480. The base class implementation of this + // method does nothing but return the same rectangle as we are passed in + + RECT SourceRect = ScaleSourceRect(&m_SourceRect); + + LONG lAdjustedSourceTop = SourceRect.top; + // if the origin of bitmap is bottom-left, adjust soruce_rect_top + // to be the bottom-left corner instead of the top-left. + if (pbmi->biHeight > 0) { + lAdjustedSourceTop = pbmi->biHeight - SourceRect.bottom; + } + // Is the window the same size as the video + + if (m_bStretch == FALSE) { + + // Put the image straight into the window + + SetDIBitsToDevice( + (HDC) m_hdc, // Target device HDC + m_TargetRect.left, // X sink position + m_TargetRect.top, // Y sink position + m_TargetRect.right - m_TargetRect.left, // Destination width + m_TargetRect.bottom - m_TargetRect.top, // Destination height + SourceRect.left, // X source position + lAdjustedSourceTop, // Adjusted Y source position + (UINT) 0, // Start scan line + pbmi->biHeight, // Scan lines present + pImage, // Image data + (BITMAPINFO *) pbmi, // DIB header + DIB_RGB_COLORS); // Type of palette + + } else { + + // Stretch the image when copying to the window + + StretchDIBits( + (HDC) m_hdc, // Target device HDC + m_TargetRect.left, // X sink position + m_TargetRect.top, // Y sink position + m_TargetRect.right - m_TargetRect.left, // Destination width + m_TargetRect.bottom - m_TargetRect.top, // Destination height + SourceRect.left, // X source position + lAdjustedSourceTop, // Adjusted Y source position + SourceRect.right - SourceRect.left, // Source width + SourceRect.bottom - SourceRect.top, // Source height + pImage, // Image data + (BITMAPINFO *) pbmi, // DIB header + DIB_RGB_COLORS, // Type of palette + SRCCOPY); // Simple image copy + } + + // This shows the sample reference times over the top of the image which + // looks a little flickery. I tried using GdiSetBatchLimit and GdiFlush to + // control the screen updates but it doesn't quite work as expected and + // only partially reduces the flicker. I also tried using a memory context + // and combining the two in that before doing a final BitBlt operation to + // the screen, unfortunately this has considerable performance penalties + // and also means that this code is not executed when compiled retail + + #ifdef DEBUG + DisplaySampleTimes(pMediaSample); + #endif +} + + +// This is called with an IMediaSample interface on the image to be drawn. We +// decide on the drawing mechanism based on who's allocator we are using. We +// may be called when the window wants an image painted by WM_PAINT messages +// We can't realise the palette here because we have the renderer lock, any +// call to realise may cause an interthread send message to the window thread +// which may in turn be waiting to get the renderer lock before servicing it + +BOOL CDrawImage::DrawImage(IMediaSample *pMediaSample) +{ + ASSERT(m_hdc); + ASSERT(m_MemoryDC); + NotifyStartDraw(); + + // If the output pin used our allocator then the samples passed are in + // fact CVideoSample objects that contain CreateDIBSection data that we + // use to do faster image rendering, they may optionally also contain a + // DirectDraw surface pointer in which case we do not do the drawing + + if (m_bUsingImageAllocator == FALSE) { + SlowRender(pMediaSample); + EXECUTE_ASSERT(GdiFlush()); + NotifyEndDraw(); + return TRUE; + } + + // This is a DIBSECTION buffer + + FastRender(pMediaSample); + EXECUTE_ASSERT(GdiFlush()); + NotifyEndDraw(); + return TRUE; +} + + +BOOL CDrawImage::DrawVideoImageHere( + HDC hdc, + IMediaSample *pMediaSample, + __in LPRECT lprcSrc, + __in LPRECT lprcDst + ) +{ + ASSERT(m_pMediaType); + BITMAPINFOHEADER *pbmi = HEADER(m_pMediaType->Format()); + BYTE *pImage; + + // Get the image data buffer + + HRESULT hr = pMediaSample->GetPointer(&pImage); + if (FAILED(hr)) { + return FALSE; + } + + RECT SourceRect; + RECT TargetRect; + + if (lprcSrc) { + SourceRect = *lprcSrc; + } + else SourceRect = ScaleSourceRect(&m_SourceRect); + + if (lprcDst) { + TargetRect = *lprcDst; + } + else TargetRect = m_TargetRect; + + LONG lAdjustedSourceTop = SourceRect.top; + // if the origin of bitmap is bottom-left, adjust soruce_rect_top + // to be the bottom-left corner instead of the top-left. + if (pbmi->biHeight > 0) { + lAdjustedSourceTop = pbmi->biHeight - SourceRect.bottom; + } + + + // Stretch the image when copying to the DC + + BOOL bRet = (0 != StretchDIBits(hdc, + TargetRect.left, + TargetRect.top, + TargetRect.right - TargetRect.left, + TargetRect.bottom - TargetRect.top, + SourceRect.left, + lAdjustedSourceTop, + SourceRect.right - SourceRect.left, + SourceRect.bottom - SourceRect.top, + pImage, + (BITMAPINFO *)pbmi, + DIB_RGB_COLORS, + SRCCOPY)); + return bRet; +} + + +// This is called by the owning window object after it has created the window +// and it's drawing contexts. We are constructed with the base window we'll +// be drawing into so when given the notification we retrive the device HDCs +// to draw with. We cannot call these in our constructor as they are virtual + +void CDrawImage::SetDrawContext() +{ + m_MemoryDC = m_pBaseWindow->GetMemoryHDC(); + m_hdc = m_pBaseWindow->GetWindowHDC(); +} + + +// This is called to set the target rectangle in the video window, it will be +// called whenever a WM_SIZE message is retrieved from the message queue. We +// simply store the rectangle and use it later when we do the drawing calls + +void CDrawImage::SetTargetRect(__in RECT *pTargetRect) +{ + ASSERT(pTargetRect); + m_TargetRect = *pTargetRect; + SetStretchMode(); +} + + +// Return the current target rectangle + +void CDrawImage::GetTargetRect(__out RECT *pTargetRect) +{ + ASSERT(pTargetRect); + *pTargetRect = m_TargetRect; +} + + +// This is called when we want to change the section of the image to draw. We +// use this information in the drawing operation calls later on. We must also +// see if the source and destination rectangles have the same dimensions. If +// not we must stretch during the drawing rather than a direct pixel copy + +void CDrawImage::SetSourceRect(__in RECT *pSourceRect) +{ + ASSERT(pSourceRect); + m_SourceRect = *pSourceRect; + SetStretchMode(); +} + + +// Return the current source rectangle + +void CDrawImage::GetSourceRect(__out RECT *pSourceRect) +{ + ASSERT(pSourceRect); + *pSourceRect = m_SourceRect; +} + + +// This is called when either the source or destination rectanges change so we +// can update the stretch flag. If the rectangles don't match we stretch the +// video during the drawing otherwise we call the fast pixel copy functions +// NOTE the source and/or the destination rectangle may be completely empty + +void CDrawImage::SetStretchMode() +{ + // Calculate the overall rectangle dimensions + + LONG SourceWidth = m_SourceRect.right - m_SourceRect.left; + LONG SinkWidth = m_TargetRect.right - m_TargetRect.left; + LONG SourceHeight = m_SourceRect.bottom - m_SourceRect.top; + LONG SinkHeight = m_TargetRect.bottom - m_TargetRect.top; + + m_bStretch = TRUE; + if (SourceWidth == SinkWidth) { + if (SourceHeight == SinkHeight) { + m_bStretch = FALSE; + } + } +} + + +// Tell us whose allocator we are using. This should be called with TRUE if +// the filter agrees to use an allocator based around the CImageAllocator +// SDK base class - whose image buffers are made through CreateDIBSection. +// Otherwise this should be called with FALSE and we will draw the images +// using SetDIBitsToDevice and StretchDIBitsToDevice. None of these calls +// can handle buffers which have non zero strides (like DirectDraw uses) + +void CDrawImage::NotifyAllocator(BOOL bUsingImageAllocator) +{ + m_bUsingImageAllocator = bUsingImageAllocator; +} + + +// Are we using the image DIBSECTION allocator + +BOOL CDrawImage::UsingImageAllocator() +{ + return m_bUsingImageAllocator; +} + + +// We need the media type of the connection so that we can get the BITMAPINFO +// from it. We use that in the calls to draw the image such as StretchDIBits +// and also when updating the colour table held in shared memory DIBSECTIONs + +void CDrawImage::NotifyMediaType(__in CMediaType *pMediaType) +{ + m_pMediaType = pMediaType; +} + + +// We store in this object a cookie maintaining the current palette version. +// Each time a palettised format is changed we increment this value so that +// when we come to draw the images we look at the colour table value they +// have and if less than the current we know to update it. This version is +// only needed and indeed used when working with shared memory DIBSECTIONs + +LONG CDrawImage::GetPaletteVersion() +{ + return m_PaletteVersion; +} + + +// Resets the current palette version number + +void CDrawImage::ResetPaletteVersion() +{ + m_PaletteVersion = PALETTE_VERSION; +} + + +// Increment the current palette version + +void CDrawImage::IncrementPaletteVersion() +{ + m_PaletteVersion++; +} + + +// Constructor must initialise the base allocator. Each sample we create has a +// palette version cookie on board. When the source filter changes the palette +// during streaming the window object increments an internal cookie counter it +// keeps as well. When it comes to render the samples it looks at the cookie +// values and if they don't match then it knows to update the sample's colour +// table. However we always create samples with a cookie of PALETTE_VERSION +// If there have been multiple format changes and we disconnect and reconnect +// thereby causing the samples to be reallocated we will create them with a +// cookie much lower than the current version, this isn't a problem since it +// will be seen by the window object and the versions will then be updated + +CImageAllocator::CImageAllocator(__inout CBaseFilter *pFilter, + __in_opt LPCTSTR pName, + __inout HRESULT *phr) : + CBaseAllocator(pName,NULL,phr,TRUE,TRUE), + m_pFilter(pFilter) +{ + ASSERT(phr); + ASSERT(pFilter); +} + + +// Check our DIB buffers have been released + +#ifdef DEBUG +CImageAllocator::~CImageAllocator() +{ + ASSERT(m_bCommitted == FALSE); +} +#endif + + +// Called from destructor and also from base class to free resources. We work +// our way through the list of media samples deleting the DIBSECTION created +// for each. All samples should be back in our list so there is no chance a +// filter is still using one to write on the display or hold on a pending list + +void CImageAllocator::Free() +{ + ASSERT(m_lAllocated == m_lFree.GetCount()); + EXECUTE_ASSERT(GdiFlush()); + CImageSample *pSample; + DIBDATA *pDibData; + + while (m_lFree.GetCount() != 0) { + pSample = (CImageSample *) m_lFree.RemoveHead(); + pDibData = pSample->GetDIBData(); + EXECUTE_ASSERT(DeleteObject(pDibData->hBitmap)); + EXECUTE_ASSERT(CloseHandle(pDibData->hMapping)); + delete pSample; + } + + m_lAllocated = 0; +} + + +// Prepare the allocator by checking all the input parameters + +STDMETHODIMP CImageAllocator::CheckSizes(__in ALLOCATOR_PROPERTIES *pRequest) +{ + // Check we have a valid connection + + if (m_pMediaType == NULL) { + return VFW_E_NOT_CONNECTED; + } + + // NOTE We always create a DIB section with the source format type which + // may contain a source palette. When we do the BitBlt drawing operation + // the target display device may contain a different palette (we may not + // have the focus) in which case GDI will do after the palette mapping + + VIDEOINFOHEADER *pVideoInfo = (VIDEOINFOHEADER *) m_pMediaType->Format(); + + // When we call CreateDIBSection it implicitly maps only enough memory + // for the image as defined by thee BITMAPINFOHEADER. If the user asks + // for an image smaller than this then we reject the call, if they ask + // for an image larger than this then we return what they can have + + if ((DWORD) pRequest->cbBuffer < pVideoInfo->bmiHeader.biSizeImage) { + return E_INVALIDARG; + } + + // Reject buffer prefixes + + if (pRequest->cbPrefix > 0) { + return E_INVALIDARG; + } + + pRequest->cbBuffer = pVideoInfo->bmiHeader.biSizeImage; + return NOERROR; +} + + +// Agree the number of media sample buffers and their sizes. The base class +// this allocator is derived from allows samples to be aligned only on byte +// boundaries NOTE the buffers are not allocated until the Commit call + +STDMETHODIMP CImageAllocator::SetProperties( + __in ALLOCATOR_PROPERTIES * pRequest, + __out ALLOCATOR_PROPERTIES * pActual) +{ + ALLOCATOR_PROPERTIES Adjusted = *pRequest; + + // Check the parameters fit with the current connection + + HRESULT hr = CheckSizes(&Adjusted); + if (FAILED(hr)) { + return hr; + } + return CBaseAllocator::SetProperties(&Adjusted, pActual); +} + + +// Commit the memory by allocating the agreed number of media samples. For +// each sample we are committed to creating we have a CImageSample object +// that we use to manage it's resources. This is initialised with a DIBDATA +// structure that contains amongst other things the GDI DIBSECTION handle +// We will access the renderer media type during this so we must have locked +// (to prevent the format changing for example). The class overrides Commit +// and Decommit to do this locking (base class Commit in turn calls Alloc) + +HRESULT CImageAllocator::Alloc(void) +{ + ASSERT(m_pMediaType); + CImageSample *pSample; + DIBDATA DibData; + + // Check the base allocator says it's ok to continue + + HRESULT hr = CBaseAllocator::Alloc(); + if (FAILED(hr)) { + return hr; + } + + // We create a new memory mapped object although we don't map it into our + // address space because GDI does that in CreateDIBSection. It is possible + // that we run out of resources before creating all the samples in which + // case the available sample list is left with those already created + + ASSERT(m_lAllocated == 0); + while (m_lAllocated < m_lCount) { + + // Create and initialise a shared memory GDI buffer + + hr = CreateDIB(m_lSize,DibData); + if (FAILED(hr)) { + return hr; + } + + // Create the sample object and pass it the DIBDATA + + pSample = CreateImageSample(DibData.pBase,m_lSize); + if (pSample == NULL) { + EXECUTE_ASSERT(DeleteObject(DibData.hBitmap)); + EXECUTE_ASSERT(CloseHandle(DibData.hMapping)); + return E_OUTOFMEMORY; + } + + // Add the completed sample to the available list + + pSample->SetDIBData(&DibData); + m_lFree.Add(pSample); + m_lAllocated++; + } + return NOERROR; +} + + +// We have a virtual method that allocates the samples so that a derived class +// may override it and allocate more specialised sample objects. So long as it +// derives its samples from CImageSample then all this code will still work ok + +CImageSample *CImageAllocator::CreateImageSample(__in_bcount(Length) LPBYTE pData,LONG Length) +{ + HRESULT hr = NOERROR; + CImageSample *pSample; + + // Allocate the new sample and check the return codes + + pSample = new CImageSample((CBaseAllocator *) this, // Base class + NAME("Video sample"), // DEBUG name + (HRESULT *) &hr, // Return code + (LPBYTE) pData, // DIB address + (LONG) Length); // Size of DIB + + if (pSample == NULL || FAILED(hr)) { + delete pSample; + return NULL; + } + return pSample; +} + + +// This function allocates a shared memory block for use by the source filter +// generating DIBs for us to render. The memory block is created in shared +// memory so that GDI doesn't have to copy the memory when we do a BitBlt + +HRESULT CImageAllocator::CreateDIB(LONG InSize,DIBDATA &DibData) +{ + BITMAPINFO *pbmi; // Format information for pin + BYTE *pBase; // Pointer to the actual image + HANDLE hMapping; // Handle to mapped object + HBITMAP hBitmap; // DIB section bitmap handle + + // Create a file mapping object and map into our address space + + hMapping = CreateFileMapping(hMEMORY, // Use system page file + NULL, // No security attributes + PAGE_READWRITE, // Full access to memory + (DWORD) 0, // Less than 4Gb in size + InSize, // Size of buffer + NULL); // No name to section + if (hMapping == NULL) { + DWORD Error = GetLastError(); + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, Error); + } + + // NOTE We always create a DIB section with the source format type which + // may contain a source palette. When we do the BitBlt drawing operation + // the target display device may contain a different palette (we may not + // have the focus) in which case GDI will do after the palette mapping + + pbmi = (BITMAPINFO *) HEADER(m_pMediaType->Format()); + if (m_pMediaType == NULL) { + DbgBreak("Invalid media type"); + } + + hBitmap = CreateDIBSection((HDC) NULL, // NO device context + pbmi, // Format information + DIB_RGB_COLORS, // Use the palette + (VOID **) &pBase, // Pointer to image data + hMapping, // Mapped memory handle + (DWORD) 0); // Offset into memory + + if (hBitmap == NULL || pBase == NULL) { + EXECUTE_ASSERT(CloseHandle(hMapping)); + DWORD Error = GetLastError(); + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, Error); + } + + // Initialise the DIB information structure + + DibData.hBitmap = hBitmap; + DibData.hMapping = hMapping; + DibData.pBase = pBase; + DibData.PaletteVersion = PALETTE_VERSION; + GetObject(hBitmap,sizeof(DIBSECTION),(VOID *)&DibData.DibSection); + + return NOERROR; +} + + +// We use the media type during the DIBSECTION creation + +void CImageAllocator::NotifyMediaType(__in CMediaType *pMediaType) +{ + m_pMediaType = pMediaType; +} + + +// Overriden to increment the owning object's reference count + +STDMETHODIMP_(ULONG) CImageAllocator::NonDelegatingAddRef() +{ + return m_pFilter->AddRef(); +} + + +// Overriden to decrement the owning object's reference count + +STDMETHODIMP_(ULONG) CImageAllocator::NonDelegatingRelease() +{ + return m_pFilter->Release(); +} + + +// If you derive a class from CMediaSample that has to transport specialised +// member variables and entry points then there are three alternate solutions +// The first is to create a memory buffer larger than actually required by the +// sample and store your information either at the beginning of it or at the +// end, the former being moderately safer allowing for misbehaving transform +// filters. You then adjust the buffer address when you create the base media +// sample. This has the disadvantage of breaking up the memory allocated to +// the samples into separate blocks. The second solution is to implement a +// class derived from CMediaSample and support additional interface(s) that +// convey your private data. This means defining a custom interface. The final +// alternative is to create a class that inherits from CMediaSample and adds +// the private data structures, when you get an IMediaSample in your Receive() +// call check to see if your allocator is being used, and if it is then cast +// the IMediaSample into one of your objects. Additional checks can be made +// to ensure the sample's this pointer is known to be one of your own objects + +CImageSample::CImageSample(__inout CBaseAllocator *pAllocator, + __in_opt LPCTSTR pName, + __inout HRESULT *phr, + __in_bcount(length) LPBYTE pBuffer, + LONG length) : + CMediaSample(pName,pAllocator,phr,pBuffer,length), + m_bInit(FALSE) +{ + ASSERT(pAllocator); + ASSERT(pBuffer); +} + + +// Set the shared memory DIB information + +void CImageSample::SetDIBData(__in DIBDATA *pDibData) +{ + ASSERT(pDibData); + m_DibData = *pDibData; + m_bInit = TRUE; +} + + +// Retrieve the shared memory DIB data + +__out DIBDATA *CImageSample::GetDIBData() +{ + ASSERT(m_bInit == TRUE); + return &m_DibData; +} + + +// This class handles the creation of a palette. It is fairly specialist and +// is intended to simplify palette management for video renderer filters. It +// is for this reason that the constructor requires three other objects with +// which it interacts, namely a base media filter, a base window and a base +// drawing object although the base window or the draw object may be NULL to +// ignore that part of us. We try not to create and install palettes unless +// absolutely necessary as they typically require WM_PALETTECHANGED messages +// to be sent to every window thread in the system which is very expensive + +CImagePalette::CImagePalette(__inout CBaseFilter *pBaseFilter, + __inout CBaseWindow *pBaseWindow, + __inout CDrawImage *pDrawImage) : + m_pBaseWindow(pBaseWindow), + m_pFilter(pBaseFilter), + m_pDrawImage(pDrawImage), + m_hPalette(NULL) +{ + ASSERT(m_pFilter); +} + + +// Destructor + +#ifdef DEBUG +CImagePalette::~CImagePalette() +{ + ASSERT(m_hPalette == NULL); +} +#endif + + +// We allow dynamic format changes of the palette but rather than change the +// palette every time we call this to work out whether an update is required. +// If the original type didn't use a palette and the new one does (or vica +// versa) then we return TRUE. If neither formats use a palette we'll return +// FALSE. If both formats use a palette we compare their colours and return +// FALSE if they match. This therefore short circuits palette creation unless +// absolutely necessary since installing palettes is an expensive operation + +BOOL CImagePalette::ShouldUpdate(const VIDEOINFOHEADER *pNewInfo, + const VIDEOINFOHEADER *pOldInfo) +{ + // We may not have a current format yet + + if (pOldInfo == NULL) { + return TRUE; + } + + // Do both formats not require a palette + + if (ContainsPalette(pNewInfo) == FALSE) { + if (ContainsPalette(pOldInfo) == FALSE) { + return FALSE; + } + } + + // Compare the colours to see if they match + + DWORD VideoEntries = pNewInfo->bmiHeader.biClrUsed; + if (ContainsPalette(pNewInfo) == TRUE) + if (ContainsPalette(pOldInfo) == TRUE) + if (pOldInfo->bmiHeader.biClrUsed == VideoEntries) + if (pOldInfo->bmiHeader.biClrUsed > 0) + if (memcmp((PVOID) GetBitmapPalette(pNewInfo), + (PVOID) GetBitmapPalette(pOldInfo), + VideoEntries * sizeof(RGBQUAD)) == 0) { + + return FALSE; + } + return TRUE; +} + + +// This is normally called when the input pin type is set to install a palette +// We will typically be called from two different places. The first is when we +// have negotiated a palettised media type after connection, the other is when +// we receive a new type during processing with an updated palette in which +// case we must remove and release the resources held by the current palette + +// We can be passed an optional device name if we wish to prepare a palette +// for a specific monitor on a multi monitor system + +HRESULT CImagePalette::PreparePalette(const CMediaType *pmtNew, + const CMediaType *pmtOld, + __in LPSTR szDevice) +{ + const VIDEOINFOHEADER *pNewInfo = (VIDEOINFOHEADER *) pmtNew->Format(); + const VIDEOINFOHEADER *pOldInfo = (VIDEOINFOHEADER *) pmtOld->Format(); + ASSERT(pNewInfo); + + // This is an performance optimisation, when we get a media type we check + // to see if the format requires a palette change. If either we need one + // when previously we didn't or vica versa then this returns TRUE, if we + // previously needed a palette and we do now it compares their colours + + if (ShouldUpdate(pNewInfo,pOldInfo) == FALSE) { + NOTE("No update needed"); + return S_FALSE; + } + + // We must notify the filter graph that the application may have changed + // the palette although in practice we don't bother checking to see if it + // is really different. If it tries to get the palette either the window + // or renderer lock will ensure it doesn't get in until we are finished + + RemovePalette(); + m_pFilter->NotifyEvent(EC_PALETTE_CHANGED,0,0); + + // Do we need a palette for the new format + + if (ContainsPalette(pNewInfo) == FALSE) { + NOTE("New has no palette"); + return S_FALSE; + } + + if (m_pBaseWindow) { + m_pBaseWindow->LockPaletteLock(); + } + + // If we're changing the palette on the fly then we increment our palette + // cookie which is compared against the cookie also stored in all of our + // DIBSECTION media samples. If they don't match when we come to draw it + // then we know the sample is out of date and we'll update it's palette + + NOTE("Making new colour palette"); + m_hPalette = MakePalette(pNewInfo, szDevice); + ASSERT(m_hPalette != NULL); + + if (m_pBaseWindow) { + m_pBaseWindow->UnlockPaletteLock(); + } + + // The window in which the new palette is to be realised may be a NULL + // pointer to signal that no window is in use, if so we don't call it + // Some filters just want to use this object to create/manage palettes + + if (m_pBaseWindow) m_pBaseWindow->SetPalette(m_hPalette); + + // This is the only time where we need access to the draw object to say + // to it that a new palette will be arriving on a sample real soon. The + // constructor may take a NULL pointer in which case we don't call this + + if (m_pDrawImage) m_pDrawImage->IncrementPaletteVersion(); + return NOERROR; +} + + +// Helper function to copy a palette out of any kind of VIDEOINFO (ie it may +// be YUV or true colour) into a palettised VIDEOINFO. We use this changing +// palettes on DirectDraw samples as a source filter can attach a palette to +// any buffer (eg YUV) and hand it back. We make a new palette out of that +// format and then copy the palette colours into the current connection type + +HRESULT CImagePalette::CopyPalette(const CMediaType *pSrc,__out CMediaType *pDest) +{ + // Reset the destination palette before starting + + VIDEOINFOHEADER *pDestInfo = (VIDEOINFOHEADER *) pDest->Format(); + pDestInfo->bmiHeader.biClrUsed = 0; + pDestInfo->bmiHeader.biClrImportant = 0; + + // Does the destination have a palette + + if (PALETTISED(pDestInfo) == FALSE) { + NOTE("No destination palette"); + return S_FALSE; + } + + // Does the source contain a palette + + const VIDEOINFOHEADER *pSrcInfo = (VIDEOINFOHEADER *) pSrc->Format(); + if (ContainsPalette(pSrcInfo) == FALSE) { + NOTE("No source palette"); + return S_FALSE; + } + + // The number of colours may be zero filled + + DWORD PaletteEntries = pSrcInfo->bmiHeader.biClrUsed; + if (PaletteEntries == 0) { + DWORD Maximum = (1 << pSrcInfo->bmiHeader.biBitCount); + NOTE1("Setting maximum colours (%d)",Maximum); + PaletteEntries = Maximum; + } + + // Make sure the destination has enough room for the palette + + ASSERT(pSrcInfo->bmiHeader.biClrUsed <= iPALETTE_COLORS); + ASSERT(pSrcInfo->bmiHeader.biClrImportant <= PaletteEntries); + ASSERT(COLORS(pDestInfo) == GetBitmapPalette(pDestInfo)); + pDestInfo->bmiHeader.biClrUsed = PaletteEntries; + pDestInfo->bmiHeader.biClrImportant = pSrcInfo->bmiHeader.biClrImportant; + ULONG BitmapSize = GetBitmapFormatSize(HEADER(pSrcInfo)); + + if (pDest->FormatLength() < BitmapSize) { + NOTE("Reallocating destination"); + pDest->ReallocFormatBuffer(BitmapSize); + } + + // Now copy the palette colours across + + CopyMemory((PVOID) COLORS(pDestInfo), + (PVOID) GetBitmapPalette(pSrcInfo), + PaletteEntries * sizeof(RGBQUAD)); + + return NOERROR; +} + + +// This is normally called when the palette is changed (typically during a +// dynamic format change) to remove any palette we previously installed. We +// replace it (if necessary) in the video window with a standard VGA palette +// that should always be available even if this is a true colour display + +HRESULT CImagePalette::RemovePalette() +{ + if (m_pBaseWindow) { + m_pBaseWindow->LockPaletteLock(); + } + + // Do we have a palette to remove + + if (m_hPalette != NULL) { + + if (m_pBaseWindow) { + // Make sure that the window's palette handle matches + // our palette handle. + ASSERT(m_hPalette == m_pBaseWindow->GetPalette()); + + m_pBaseWindow->UnsetPalette(); + } + + EXECUTE_ASSERT(DeleteObject(m_hPalette)); + m_hPalette = NULL; + } + + if (m_pBaseWindow) { + m_pBaseWindow->UnlockPaletteLock(); + } + + return NOERROR; +} + + +// Called to create a palette for the object, the data structure used by GDI +// to describe a palette is a LOGPALETTE, this includes a variable number of +// PALETTEENTRY fields which are the colours, we have to convert the RGBQUAD +// colour fields we are handed in a BITMAPINFO from the media type into these +// This handles extraction of palettes from true colour and YUV media formats + +// We can be passed an optional device name if we wish to prepare a palette +// for a specific monitor on a multi monitor system + +HPALETTE CImagePalette::MakePalette(const VIDEOINFOHEADER *pVideoInfo, __in LPSTR szDevice) +{ + ASSERT(ContainsPalette(pVideoInfo) == TRUE); + ASSERT(pVideoInfo->bmiHeader.biClrUsed <= iPALETTE_COLORS); + BITMAPINFOHEADER *pHeader = HEADER(pVideoInfo); + + const RGBQUAD *pColours; // Pointer to the palette + LOGPALETTE *lp; // Used to create a palette + HPALETTE hPalette; // Logical palette object + + lp = (LOGPALETTE *) new BYTEsizeof(LOGPALETTE) + SIZE_PALETTE; + if (lp == NULL) { + return NULL; + } + + // Unfortunately for some hare brained reason a GDI palette entry (a + // PALETTEENTRY structure) is different to a palette entry from a DIB + // format (a RGBQUAD structure) so we have to do the field conversion + // The VIDEOINFO containing the palette may be a true colour type so + // we use GetBitmapPalette to skip over any bit fields if they exist + + lp->palVersion = PALVERSION; + lp->palNumEntries = (USHORT) pHeader->biClrUsed; + if (lp->palNumEntries == 0) lp->palNumEntries = (1 << pHeader->biBitCount); + pColours = GetBitmapPalette(pVideoInfo); + + for (DWORD dwCount = 0;dwCount < lp->palNumEntries;dwCount++) { + lp->palPalEntrydwCount.peRed = pColoursdwCount.rgbRed; + lp->palPalEntrydwCount.peGreen = pColoursdwCount.rgbGreen; + lp->palPalEntrydwCount.peBlue = pColoursdwCount.rgbBlue; + lp->palPalEntrydwCount.peFlags = 0; + } + + MakeIdentityPalette(lp->palPalEntry, lp->palNumEntries, szDevice); + + // Create a logical palette + + hPalette = CreatePalette(lp); + ASSERT(hPalette != NULL); + delete lp; + return hPalette; +} + + +// GDI does a fair job of compressing the palette entries you give it, so for +// example if you have five entries with an RGB colour (0,0,0) it will remove +// all but one of them. When you subsequently draw an image it will map from +// your logical palette to the compressed device palette. This function looks +// to see if it is trying to be an identity palette and if so sets the flags +// field in the PALETTEENTRYs so they remain expanded to boost performance + +// We can be passed an optional device name if we wish to prepare a palette +// for a specific monitor on a multi monitor system + +HRESULT CImagePalette::MakeIdentityPalette(__inout_ecount_full(iColours) PALETTEENTRY *pEntry,INT iColours, __in LPSTR szDevice) +{ + PALETTEENTRY SystemEntries10; // System palette entries + BOOL bIdentityPalette = TRUE; // Is an identity palette + ASSERT(iColours <= iPALETTE_COLORS); // Should have a palette + const int PalLoCount = 10; // First ten reserved colours + const int PalHiStart = 246; // Last VGA palette entries + + // Does this have the full colour range + + if (iColours < 10) { + return S_FALSE; + } + + // Apparently some displays have odd numbers of system colours + + // Get a DC on the right monitor - it's ugly, but this is the way you have + // to do it + HDC hdc; + if (szDevice == NULL || lstrcmpiLocaleIndependentA(szDevice, "DISPLAY") == 0) + hdc = CreateDCA("DISPLAY", NULL, NULL, NULL); + else + hdc = CreateDCA(NULL, szDevice, NULL, NULL); + if (NULL == hdc) { + return E_OUTOFMEMORY; + } + INT Reserved = GetDeviceCaps(hdc,NUMRESERVED); + if (Reserved != 20) { + DeleteDC(hdc); + return S_FALSE; + } + + // Compare our palette against the first ten system entries. The reason I + // don't do a memory compare between our two arrays of colours is because + // I am not sure what will be in the flags fields for the system entries + + UINT Result = GetSystemPaletteEntries(hdc,0,PalLoCount,SystemEntries); + for (UINT Count = 0;Count < Result;Count++) { + if (SystemEntriesCount.peRed != pEntryCount.peRed || + SystemEntriesCount.peGreen != pEntryCount.peGreen || + SystemEntriesCount.peBlue != pEntryCount.peBlue) { + bIdentityPalette = FALSE; + } + } + + // And likewise compare against the last ten entries + + Result = GetSystemPaletteEntries(hdc,PalHiStart,PalLoCount,SystemEntries); + for (UINT Count = 0;Count < Result;Count++) { + if (INT(Count) + PalHiStart < iColours) { + if (SystemEntriesCount.peRed != pEntryPalHiStart + Count.peRed || + SystemEntriesCount.peGreen != pEntryPalHiStart + Count.peGreen || + SystemEntriesCount.peBlue != pEntryPalHiStart + Count.peBlue) { + bIdentityPalette = FALSE; + } + } + } + + // If not an identity palette then return S_FALSE + + DeleteDC(hdc); + if (bIdentityPalette == FALSE) { + return S_FALSE; + } + + // Set the non VGA entries so that GDI doesn't map them + + for (UINT Count = PalLoCount;INT(Count) < min(PalHiStart,iColours);Count++) { + pEntryCount.peFlags = PC_NOCOLLAPSE; + } + return NOERROR; +} + + +// Constructor initialises the VIDEOINFO we keep storing the current display +// format. The format can be changed at any time, to reset the format held +// by us call the RefreshDisplayType directly (it's a public method). Since +// more than one thread will typically call us (ie window threads resetting +// the type and source threads in the type checking methods) we have a lock + +CImageDisplay::CImageDisplay() +{ + RefreshDisplayType(NULL); +} + + + +// This initialises the format we hold which contains the display device type +// We do a conversion on the display device type in here so that when we start +// type checking input formats we can assume that certain fields have been set +// correctly, an example is when we make the 16 bit mask fields explicit. This +// is normally called when we receive WM_DEVMODECHANGED device change messages + +// The optional szDeviceName parameter tells us which monitor we are interested +// in for a multi monitor system + +HRESULT CImageDisplay::RefreshDisplayType(__in_opt LPSTR szDeviceName) +{ + CAutoLock cDisplayLock(this); + + // Set the preferred format type + + ZeroMemory((PVOID)&m_Display,sizeof(VIDEOINFOHEADER)+sizeof(TRUECOLORINFO)); + m_Display.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + m_Display.bmiHeader.biBitCount = FALSE; + + // Get the bit depth of a device compatible bitmap + + // get caps of whichever monitor they are interested in (multi monitor) + HDC hdcDisplay; + // it's ugly, but this is the way you have to do it + if (szDeviceName == NULL || lstrcmpiLocaleIndependentA(szDeviceName, "DISPLAY") == 0) + hdcDisplay = CreateDCA("DISPLAY", NULL, NULL, NULL); + else + hdcDisplay = CreateDCA(NULL, szDeviceName, NULL, NULL); + if (hdcDisplay == NULL) { + ASSERT(FALSE); + DbgLog((LOG_ERROR,1,TEXT("ACK! Can't get a DC for %hs"), + szDeviceName ? szDeviceName : "<NULL>")); + return E_FAIL; + } else { + DbgLog((LOG_TRACE,3,TEXT("Created a DC for %s"), + szDeviceName ? szDeviceName : "<NULL>")); + } + HBITMAP hbm = CreateCompatibleBitmap(hdcDisplay,1,1); + if ( hbm ) + { + GetDIBits(hdcDisplay,hbm,0,1,NULL,(BITMAPINFO *)&m_Display.bmiHeader,DIB_RGB_COLORS); + + // This call will get the colour table or the proper bitfields + GetDIBits(hdcDisplay,hbm,0,1,NULL,(BITMAPINFO *)&m_Display.bmiHeader,DIB_RGB_COLORS); + DeleteObject(hbm); + } + DeleteDC(hdcDisplay); + + // Complete the display type initialisation + + ASSERT(CheckHeaderValidity(&m_Display)); + UpdateFormat(&m_Display); + DbgLog((LOG_TRACE,3,TEXT("New DISPLAY bit depth =%d"), + m_Display.bmiHeader.biBitCount)); + return NOERROR; +} + + +// We assume throughout this code that any bitfields masks are allowed no +// more than eight bits to store a colour component. This checks that the +// bit count assumption is enforced and also makes sure that all the bits +// set are contiguous. We return a boolean TRUE if the field checks out ok + +BOOL CImageDisplay::CheckBitFields(const VIDEOINFO *pInput) +{ + DWORD *pBitFields = (DWORD *) BITMASKS(pInput); + + for (INT iColour = iRED;iColour <= iBLUE;iColour++) { + + // First of all work out how many bits are set + + DWORD SetBits = CountSetBits(pBitFieldsiColour); + if (SetBits > iMAXBITS || SetBits == 0) { + NOTE1("Bit fields for component %d invalid",iColour); + return FALSE; + } + + // Next work out the number of zero bits prefix + DWORD PrefixBits = CountPrefixBits(pBitFieldsiColour); + + // This is going to see if all the bits set are contiguous (as they + // should be). We know how much to shift them right by from the + // count of prefix bits. The number of bits set defines a mask, we + // invert this (ones complement) and AND it with the shifted bit + // fields. If the result is NON zero then there are bit(s) sticking + // out the left hand end which means they are not contiguous + + DWORD TestField = pBitFieldsiColour >> PrefixBits; + DWORD Mask = ULONG_MAX << SetBits; + if (TestField & Mask) { + NOTE1("Bit fields for component %d not contiguous",iColour); + return FALSE; + } + } + return TRUE; +} + + +// This counts the number of bits set in the input field + +DWORD CImageDisplay::CountSetBits(DWORD Field) +{ + // This is a relatively well known bit counting algorithm + + DWORD Count = 0; + DWORD init = Field; + + // Until the input is exhausted, count the number of bits + + while (init) { + init = init & (init - 1); // Turn off the bottommost bit + Count++; + } + return Count; +} + + +// This counts the number of zero bits upto the first one set NOTE the input +// field should have been previously checked to ensure there is at least one +// set although if we don't find one set we return the impossible value 32 + +DWORD CImageDisplay::CountPrefixBits(DWORD Field) +{ + DWORD Mask = 1; + DWORD Count = 0; + + while (TRUE) { + if (Field & Mask) { + return Count; + } + Count++; + + ASSERT(Mask != 0x80000000); + if (Mask == 0x80000000) { + return Count; + } + Mask <<= 1; + } +} + + +// This is called to check the BITMAPINFOHEADER for the input type. There are +// many implicit dependancies between the fields in a header structure which +// if we validate now make for easier manipulation in subsequent handling. We +// also check that the BITMAPINFOHEADER matches it's specification such that +// fields likes the number of planes is one, that it's structure size is set +// correctly and that the bitmap dimensions have not been set as negative + +BOOL CImageDisplay::CheckHeaderValidity(const VIDEOINFO *pInput) +{ + // Check the bitmap width and height are not negative. + + if (pInput->bmiHeader.biWidth <= 0 || + pInput->bmiHeader.biHeight <= 0) { + NOTE("Invalid bitmap dimensions"); + return FALSE; + } + + // Check the compression is either BI_RGB or BI_BITFIELDS + + if (pInput->bmiHeader.biCompression != BI_RGB) { + if (pInput->bmiHeader.biCompression != BI_BITFIELDS) { + NOTE("Invalid compression format"); + return FALSE; + } + } + + // If BI_BITFIELDS compression format check the colour depth + + if (pInput->bmiHeader.biCompression == BI_BITFIELDS) { + if (pInput->bmiHeader.biBitCount != 16) { + if (pInput->bmiHeader.biBitCount != 32) { + NOTE("BI_BITFIELDS not 16/32 bit depth"); + return FALSE; + } + } + } + + // Check the assumptions about the layout of the bit fields + + if (pInput->bmiHeader.biCompression == BI_BITFIELDS) { + if (CheckBitFields(pInput) == FALSE) { + NOTE("Bit fields are not valid"); + return FALSE; + } + } + + // Are the number of planes equal to one + + if (pInput->bmiHeader.biPlanes != 1) { + NOTE("Number of planes not one"); + return FALSE; + } + + // Check the image size is consistent (it can be zero) + + if (pInput->bmiHeader.biSizeImage != GetBitmapSize(&pInput->bmiHeader)) { + if (pInput->bmiHeader.biSizeImage) { + NOTE("Image size incorrectly set"); + return FALSE; + } + } + + // Check the size of the structure + + if (pInput->bmiHeader.biSize != sizeof(BITMAPINFOHEADER)) { + NOTE("Size of BITMAPINFOHEADER wrong"); + return FALSE; + } + return CheckPaletteHeader(pInput); +} + + +// This runs a few simple tests against the palette fields in the input to +// see if it looks vaguely correct. The tests look at the number of palette +// colours present, the number considered important and the biCompression +// field which should always be BI_RGB as no other formats are meaningful + +BOOL CImageDisplay::CheckPaletteHeader(const VIDEOINFO *pInput) +{ + // The checks here are for palettised videos only + + if (PALETTISED(pInput) == FALSE) { + if (pInput->bmiHeader.biClrUsed) { + NOTE("Invalid palette entries"); + return FALSE; + } + return TRUE; + } + + // Compression type of BI_BITFIELDS is meaningless for palette video + + if (pInput->bmiHeader.biCompression != BI_RGB) { + NOTE("Palettised video must be BI_RGB"); + return FALSE; + } + + // Check the number of palette colours is correct + + if (pInput->bmiHeader.biClrUsed > PALETTE_ENTRIES(pInput)) { + NOTE("Too many colours in palette"); + return FALSE; + } + + // The number of important colours shouldn't exceed the number used + + if (pInput->bmiHeader.biClrImportant > pInput->bmiHeader.biClrUsed) { + NOTE("Too many important colours"); + return FALSE; + } + return TRUE; +} + + +// Return the format of the video display + +const VIDEOINFO *CImageDisplay::GetDisplayFormat() +{ + return &m_Display; +} + + +// Return TRUE if the display uses a palette + +BOOL CImageDisplay::IsPalettised() +{ + return PALETTISED(&m_Display); +} + + +// Return the bit depth of the current display setting + +WORD CImageDisplay::GetDisplayDepth() +{ + return m_Display.bmiHeader.biBitCount; +} + + +// Initialise the optional fields in a VIDEOINFO. These are mainly to do with +// the source and destination rectangles and palette information such as the +// number of colours present. It simplifies our code just a little if we don't +// have to keep checking for all the different valid permutations in a header +// every time we want to do anything with it (an example would be creating a +// palette). We set the base class media type before calling this function so +// that the media types between the pins match after a connection is made + +HRESULT CImageDisplay::UpdateFormat(__inout VIDEOINFO *pVideoInfo) +{ + ASSERT(pVideoInfo); + + BITMAPINFOHEADER *pbmi = HEADER(pVideoInfo); + SetRectEmpty(&pVideoInfo->rcSource); + SetRectEmpty(&pVideoInfo->rcTarget); + + // Set the number of colours explicitly + + if (PALETTISED(pVideoInfo)) { + if (pVideoInfo->bmiHeader.biClrUsed == 0) { + pVideoInfo->bmiHeader.biClrUsed = PALETTE_ENTRIES(pVideoInfo); + } + } + + // The number of important colours shouldn't exceed the number used, on + // some displays the number of important colours is not initialised when + // retrieving the display type so we set the colours used correctly + + if (pVideoInfo->bmiHeader.biClrImportant > pVideoInfo->bmiHeader.biClrUsed) { + pVideoInfo->bmiHeader.biClrImportant = PALETTE_ENTRIES(pVideoInfo); + } + + // Change the image size field to be explicit + + if (pVideoInfo->bmiHeader.biSizeImage == 0) { + pVideoInfo->bmiHeader.biSizeImage = GetBitmapSize(&pVideoInfo->bmiHeader); + } + return NOERROR; +} + + +// Lots of video rendering filters want code to check proposed formats are ok +// This checks the VIDEOINFO we are passed as a media type. If the media type +// is a valid media type then we return NOERROR otherwise E_INVALIDARG. Note +// however we only accept formats that can be easily displayed in the display +// so if we are on a 16 bit device we will not accept 24 bit images. The one +// complexity is that most displays draw 8 bit palettised images efficiently +// Also if the input format is less colour bits per pixel then we also accept + +HRESULT CImageDisplay::CheckVideoType(const VIDEOINFO *pInput) +{ + // First of all check the VIDEOINFOHEADER looks correct + + if (CheckHeaderValidity(pInput) == FALSE) { + return E_INVALIDARG; + } + + // Virtually all devices support palettised images efficiently + + if (m_Display.bmiHeader.biBitCount == pInput->bmiHeader.biBitCount) { + if (PALETTISED(pInput) == TRUE) { + ASSERT(PALETTISED(&m_Display) == TRUE); + NOTE("(Video) Type connection ACCEPTED"); + return NOERROR; + } + } + + + // Is the display depth greater than the input format + + if (m_Display.bmiHeader.biBitCount > pInput->bmiHeader.biBitCount) { + NOTE("(Video) Mismatch agreed"); + return NOERROR; + } + + // Is the display depth less than the input format + + if (m_Display.bmiHeader.biBitCount < pInput->bmiHeader.biBitCount) { + NOTE("(Video) Format mismatch"); + return E_INVALIDARG; + } + + + // Both input and display formats are either BI_RGB or BI_BITFIELDS + + ASSERT(m_Display.bmiHeader.biBitCount == pInput->bmiHeader.biBitCount); + ASSERT(PALETTISED(pInput) == FALSE); + ASSERT(PALETTISED(&m_Display) == FALSE); + + // BI_RGB 16 bit representation is implicitly RGB555, and likewise BI_RGB + // 24 bit representation is RGB888. So we initialise a pointer to the bit + // fields they really mean and check against the display device format + // This is only going to be called when both formats are equal bits pixel + + const DWORD *pInputMask = GetBitMasks(pInput); + const DWORD *pDisplayMask = GetBitMasks((VIDEOINFO *)&m_Display); + + if (pInputMaskiRED != pDisplayMaskiRED || + pInputMaskiGREEN != pDisplayMaskiGREEN || + pInputMaskiBLUE != pDisplayMaskiBLUE) { + + NOTE("(Video) Bit field mismatch"); + return E_INVALIDARG; + } + + NOTE("(Video) Type connection ACCEPTED"); + return NOERROR; +} + + +// Return the bit masks for the true colour VIDEOINFO provided + +const DWORD *CImageDisplay::GetBitMasks(const VIDEOINFO *pVideoInfo) +{ + static const DWORD FailMasks = {0,0,0}; + + if (pVideoInfo->bmiHeader.biCompression == BI_BITFIELDS) { + return BITMASKS(pVideoInfo); + } + + ASSERT(pVideoInfo->bmiHeader.biCompression == BI_RGB); + + switch (pVideoInfo->bmiHeader.biBitCount) { + case 16: return bits555; + case 24: return bits888; + case 32: return bits888; + default: return FailMasks; + } +} + + +// Check to see if we can support media type pmtIn as proposed by the output +// pin - We first check that the major media type is video and also identify +// the media sub type. Then we thoroughly check the VIDEOINFO type provided +// As well as the contained VIDEOINFO being correct the major type must be +// video, the subtype a recognised video format and the type GUID correct + +HRESULT CImageDisplay::CheckMediaType(const CMediaType *pmtIn) +{ + // Does this have a VIDEOINFOHEADER format block + + const GUID *pFormatType = pmtIn->FormatType(); + if (*pFormatType != FORMAT_VideoInfo) { + NOTE("Format GUID not a VIDEOINFOHEADER"); + return E_INVALIDARG; + } + ASSERT(pmtIn->Format()); + + // Check the format looks reasonably ok + + ULONG Length = pmtIn->FormatLength(); + if (Length < SIZE_VIDEOHEADER) { + NOTE("Format smaller than a VIDEOHEADER"); + return E_FAIL; + } + + VIDEOINFO *pInput = (VIDEOINFO *) pmtIn->Format(); + + // Check the major type is MEDIATYPE_Video + + const GUID *pMajorType = pmtIn->Type(); + if (*pMajorType != MEDIATYPE_Video) { + NOTE("Major type not MEDIATYPE_Video"); + return E_INVALIDARG; + } + + // Check we can identify the media subtype + + const GUID *pSubType = pmtIn->Subtype(); + if (GetBitCount(pSubType) == USHRT_MAX) { + NOTE("Invalid video media subtype"); + return E_INVALIDARG; + } + return CheckVideoType(pInput); +} + + +// Given a video format described by a VIDEOINFO structure we return the mask +// that is used to obtain the range of acceptable colours for this type, for +// example, the mask for a 24 bit true colour format is 0xFF in all cases. A +// 16 bit 5:6:5 display format uses 0xF8, 0xFC and 0xF8, therefore given any +// RGB triplets we can AND them with these fields to find one that is valid + +BOOL CImageDisplay::GetColourMask(__out DWORD *pMaskRed, + __out DWORD *pMaskGreen, + __out DWORD *pMaskBlue) +{ + CAutoLock cDisplayLock(this); + *pMaskRed = 0xFF; + *pMaskGreen = 0xFF; + *pMaskBlue = 0xFF; + + // If this format is palettised then it doesn't have bit fields + + if (m_Display.bmiHeader.biBitCount < 16) { + return FALSE; + } + + // If this is a 24 bit true colour display then it can handle all the + // possible colour component ranges described by a byte. It is never + // allowed for a 24 bit colour depth image to have BI_BITFIELDS set + + if (m_Display.bmiHeader.biBitCount == 24) { + ASSERT(m_Display.bmiHeader.biCompression == BI_RGB); + return TRUE; + } + + // Calculate the mask based on the format's bit fields + + const DWORD *pBitFields = (DWORD *) GetBitMasks((VIDEOINFO *)&m_Display); + DWORD *pOutputMask = { pMaskRed, pMaskGreen, pMaskBlue }; + + // We know from earlier testing that there are no more than iMAXBITS + // bits set in the mask and that they are all contiguous. All that + // therefore remains is to shift them into the correct position + + for (INT iColour = iRED;iColour <= iBLUE;iColour++) { + + // This works out how many bits there are and where they live + + DWORD PrefixBits = CountPrefixBits(pBitFieldsiColour); + DWORD SetBits = CountSetBits(pBitFieldsiColour); + + // The first shift moves the bit field so that it is right justified + // in the DWORD, after which we then shift it back left which then + // puts the leading bit in the bytes most significant bit position + + *(pOutputMaskiColour) = pBitFieldsiColour >> PrefixBits; + *(pOutputMaskiColour) <<= (iMAXBITS - SetBits); + } + return TRUE; +} + + +/* Helper to convert to VIDEOINFOHEADER2 +*/ +STDAPI ConvertVideoInfoToVideoInfo2(__inout AM_MEDIA_TYPE *pmt) +{ + if (pmt->formattype != FORMAT_VideoInfo) { + return E_INVALIDARG; + } + if (NULL == pmt->pbFormat || pmt->cbFormat < sizeof(VIDEOINFOHEADER)) { + return E_INVALIDARG; + } + VIDEOINFO *pVideoInfo = (VIDEOINFO *)pmt->pbFormat; + DWORD dwNewSize; + HRESULT hr = DWordAdd(pmt->cbFormat, sizeof(VIDEOINFOHEADER2) - sizeof(VIDEOINFOHEADER), &dwNewSize); + if (FAILED(hr)) { + return hr; + } + PVOID pvNew = CoTaskMemAlloc(dwNewSize); + if (pvNew == NULL) { + return E_OUTOFMEMORY; + } + CopyMemory(pvNew, pmt->pbFormat, FIELD_OFFSET(VIDEOINFOHEADER, bmiHeader)); + ZeroMemory((PBYTE)pvNew + FIELD_OFFSET(VIDEOINFOHEADER, bmiHeader), + sizeof(VIDEOINFOHEADER2) - sizeof(VIDEOINFOHEADER)); + CopyMemory((PBYTE)pvNew + FIELD_OFFSET(VIDEOINFOHEADER2, bmiHeader), + pmt->pbFormat + FIELD_OFFSET(VIDEOINFOHEADER, bmiHeader), + pmt->cbFormat - FIELD_OFFSET(VIDEOINFOHEADER, bmiHeader)); + VIDEOINFOHEADER2 *pVideoInfo2 = (VIDEOINFOHEADER2 *)pvNew; + pVideoInfo2->dwPictAspectRatioX = (DWORD)pVideoInfo2->bmiHeader.biWidth; + pVideoInfo2->dwPictAspectRatioY = (DWORD)abs(pVideoInfo2->bmiHeader.biHeight); + pmt->formattype = FORMAT_VideoInfo2; + CoTaskMemFree(pmt->pbFormat); + pmt->pbFormat = (PBYTE)pvNew; + pmt->cbFormat += sizeof(VIDEOINFOHEADER2) - sizeof(VIDEOINFOHEADER); + return S_OK; +} + + +// Check a media type containing VIDEOINFOHEADER +STDAPI CheckVideoInfoType(const AM_MEDIA_TYPE *pmt) +{ + if (NULL == pmt || NULL == pmt->pbFormat) { + return E_POINTER; + } + if (pmt->majortype != MEDIATYPE_Video || + pmt->formattype != FORMAT_VideoInfo || + pmt->cbFormat < sizeof(VIDEOINFOHEADER)) { + return VFW_E_TYPE_NOT_ACCEPTED; + } + const VIDEOINFOHEADER *pHeader = (const VIDEOINFOHEADER *)pmt->pbFormat; + if (!ValidateBitmapInfoHeader( + &pHeader->bmiHeader, + pmt->cbFormat - FIELD_OFFSET(VIDEOINFOHEADER, bmiHeader))) { + return VFW_E_TYPE_NOT_ACCEPTED; + } + + return S_OK; +} + +// Check a media type containing VIDEOINFOHEADER2 +STDAPI CheckVideoInfo2Type(const AM_MEDIA_TYPE *pmt) +{ + if (NULL == pmt || NULL == pmt->pbFormat) { + return E_POINTER; + } + if (pmt->majortype != MEDIATYPE_Video || + pmt->formattype != FORMAT_VideoInfo2 || + pmt->cbFormat < sizeof(VIDEOINFOHEADER2)) { + return VFW_E_TYPE_NOT_ACCEPTED; + } + const VIDEOINFOHEADER2 *pHeader = (const VIDEOINFOHEADER2 *)pmt->pbFormat; + if (!ValidateBitmapInfoHeader( + &pHeader->bmiHeader, + pmt->cbFormat - FIELD_OFFSET(VIDEOINFOHEADER2, bmiHeader))) { + return VFW_E_TYPE_NOT_ACCEPTED; + } + + return S_OK; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/winutil.h
Added
@@ -0,0 +1,419 @@ +//------------------------------------------------------------------------------ +// File: WinUtil.h +// +// Desc: DirectShow base classes - defines generic handler classes. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// Make sure that you call PrepareWindow to initialise the window after +// the object has been constructed. It is a separate method so that +// derived classes can override useful methods like MessageLoop. Also +// any derived class must call DoneWithWindow in its destructor. If it +// doesn't a message may be retrieved and call a derived class member +// function while a thread is executing the base class destructor code + +#ifndef __WINUTIL__ +#define __WINUTIL__ + +const int DEFWIDTH = 320; // Initial window width +const int DEFHEIGHT = 240; // Initial window height +const int CAPTION = 256; // Maximum length of caption +const int TIMELENGTH = 50; // Maximum length of times +const int PROFILESTR = 128; // Normal profile string +const WORD PALVERSION = 0x300; // GDI palette version +const LONG PALETTE_VERSION = (LONG) 1; // Initial palette version +const COLORREF VIDEO_COLOUR = 0; // Defaults to black background +const HANDLE hMEMORY = (HANDLE) (-1); // Says to open as memory file + +#define WIDTH(x) ((*(x)).right - (*(x)).left) +#define HEIGHT(x) ((*(x)).bottom - (*(x)).top) +#define SHOWSTAGE TEXT("WM_SHOWSTAGE") +#define SHOWSTAGETOP TEXT("WM_SHOWSTAGETOP") +#define REALIZEPALETTE TEXT("WM_REALIZEPALETTE") + +class AM_NOVTABLE CBaseWindow +{ +protected: + + HINSTANCE m_hInstance; // Global module instance handle + HWND m_hwnd; // Handle for our window + HDC m_hdc; // Device context for the window + LONG m_Width; // Client window width + LONG m_Height; // Client window height + BOOL m_bActivated; // Has the window been activated + LPTSTR m_pClassName; // Static string holding class name + DWORD m_ClassStyles; // Passed in to our constructor + DWORD m_WindowStyles; // Likewise the initial window styles + DWORD m_WindowStylesEx; // And the extended window styles + UINT m_ShowStageMessage; // Have the window shown with focus + UINT m_ShowStageTop; // Makes the window WS_EX_TOPMOST + UINT m_RealizePalette; // Makes us realize our new palette + HDC m_MemoryDC; // Used for fast BitBlt operations + HPALETTE m_hPalette; // Handle to any palette we may have + BYTE m_bNoRealize; // Don't realize palette now + BYTE m_bBackground; // Should we realise in background + BYTE m_bRealizing; // already realizing the palette + CCritSec m_WindowLock; // Serialise window object access + BOOL m_bDoGetDC; // Should this window get a DC + bool m_bDoPostToDestroy; // Use PostMessage to destroy + CCritSec m_PaletteLock; // This lock protects m_hPalette. + // It should be held anytime the + // program use the value of m_hPalette. + + // Maps windows message procedure into C++ methods + friend LRESULT CALLBACK WndProc(HWND hwnd, // Window handle + UINT uMsg, // Message ID + WPARAM wParam, // First parameter + LPARAM lParam); // Other parameter + + virtual LRESULT OnPaletteChange(HWND hwnd, UINT Message); + +public: + + CBaseWindow(BOOL bDoGetDC = TRUE, bool bPostToDestroy = false); + +#ifdef DEBUG + virtual ~CBaseWindow(); +#endif + + virtual HRESULT DoneWithWindow(); + virtual HRESULT PrepareWindow(); + virtual HRESULT InactivateWindow(); + virtual HRESULT ActivateWindow(); + virtual BOOL OnSize(LONG Width, LONG Height); + virtual BOOL OnClose(); + virtual RECT GetDefaultRect(); + virtual HRESULT UninitialiseWindow(); + virtual HRESULT InitialiseWindow(HWND hwnd); + + HRESULT CompleteConnect(); + HRESULT DoCreateWindow(); + + HRESULT PerformanceAlignWindow(); + HRESULT DoShowWindow(LONG ShowCmd); + void PaintWindow(BOOL bErase); + void DoSetWindowForeground(BOOL bFocus); + virtual HRESULT SetPalette(HPALETTE hPalette); + void SetRealize(BOOL bRealize) + { + m_bNoRealize = !bRealize; + } + + // Jump over to the window thread to set the current palette + HRESULT SetPalette(); + void UnsetPalette(void); + virtual HRESULT DoRealisePalette(BOOL bForceBackground = FALSE); + + void LockPaletteLock(); + void UnlockPaletteLock(); + + virtual BOOL PossiblyEatMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) + { return FALSE; }; + + // Access our window information + + bool WindowExists(); + LONG GetWindowWidth(); + LONG GetWindowHeight(); + HWND GetWindowHWND(); + HDC GetMemoryHDC(); + HDC GetWindowHDC(); + + #ifdef DEBUG + HPALETTE GetPalette(); + #endif // DEBUG + + // This is the window procedure the derived object should override + + virtual LRESULT OnReceiveMessage(HWND hwnd, // Window handle + UINT uMsg, // Message ID + WPARAM wParam, // First parameter + LPARAM lParam); // Other parameter + + // Must be overriden to return class and window styles + + virtual LPTSTR GetClassWindowStyles( + __out DWORD *pClassStyles, // Class styles + __out DWORD *pWindowStyles, // Window styles + __out DWORD *pWindowStylesEx) PURE; // Extended styles +}; + + +// This helper class is entirely subservient to the owning CBaseWindow object +// All this object does is to split out the actual drawing operation from the +// main object (because it was becoming too large). We have a number of entry +// points to set things like the draw device contexts, to implement the actual +// drawing and to set the destination rectangle in the client window. We have +// no critical section locking in this class because we are used exclusively +// by the owning window object which looks after serialising calls into us + +// If you want to use this class make sure you call NotifyAllocator once the +// allocate has been agreed, also call NotifyMediaType with a pointer to a +// NON stack based CMediaType once that has been set (we keep a pointer to +// the original rather than taking a copy). When the palette changes call +// IncrementPaletteVersion (easiest thing to do is to also call this method +// in the SetMediaType method most filters implement). Finally before you +// start rendering anything call SetDrawContext so that we can get the HDCs +// for drawing from the CBaseWindow object we are given during construction + +class CDrawImage +{ +protected: + + CBaseWindow *m_pBaseWindow; // Owning video window object + CRefTime m_StartSample; // Start time for the current sample + CRefTime m_EndSample; // And likewise it's end sample time + HDC m_hdc; // Main window device context + HDC m_MemoryDC; // Offscreen draw device context + RECT m_TargetRect; // Target destination rectangle + RECT m_SourceRect; // Source image rectangle + BOOL m_bStretch; // Do we have to stretch the images + BOOL m_bUsingImageAllocator; // Are the samples shared DIBSECTIONs + CMediaType *m_pMediaType; // Pointer to the current format + int m_perfidRenderTime; // Time taken to render an image + LONG m_PaletteVersion; // Current palette version cookie + + // Draw the video images in the window + + void SlowRender(IMediaSample *pMediaSample); + void FastRender(IMediaSample *pMediaSample); + void DisplaySampleTimes(IMediaSample *pSample); + void UpdateColourTable(HDC hdc,__in BITMAPINFOHEADER *pbmi); + void SetStretchMode(); + +public: + + // Used to control the image drawing + + CDrawImage(__inout CBaseWindow *pBaseWindow); + BOOL DrawImage(IMediaSample *pMediaSample); + BOOL DrawVideoImageHere(HDC hdc, IMediaSample *pMediaSample, + __in LPRECT lprcSrc, __in LPRECT lprcDst); + void SetDrawContext(); + void SetTargetRect(__in RECT *pTargetRect); + void SetSourceRect(__in RECT *pSourceRect); + void GetTargetRect(__out RECT *pTargetRect); + void GetSourceRect(__out RECT *pSourceRect); + virtual RECT ScaleSourceRect(const RECT *pSource); + + // Handle updating palettes as they change + + LONG GetPaletteVersion(); + void ResetPaletteVersion(); + void IncrementPaletteVersion(); + + // Tell us media types and allocator assignments + + void NotifyAllocator(BOOL bUsingImageAllocator); + void NotifyMediaType(__in CMediaType *pMediaType); + BOOL UsingImageAllocator(); + + // Called when we are about to draw an image + + void NotifyStartDraw() { + MSR_START(m_perfidRenderTime); + }; + + // Called when we complete an image rendering + + void NotifyEndDraw() { + MSR_STOP(m_perfidRenderTime); + }; +}; + + +// This is the structure used to keep information about each GDI DIB. All the +// samples we create from our allocator will have a DIBSECTION allocated to +// them. When we receive the sample we know we can BitBlt straight to an HDC + +typedef struct tagDIBDATA { + + LONG PaletteVersion; // Current palette version in use + DIBSECTION DibSection; // Details of DIB section allocated + HBITMAP hBitmap; // Handle to bitmap for drawing + HANDLE hMapping; // Handle to shared memory block + BYTE *pBase; // Pointer to base memory address + +} DIBDATA; + + +// This class inherits from CMediaSample and uses all of it's methods but it +// overrides the constructor to initialise itself with the DIBDATA structure +// When we come to render an IMediaSample we will know if we are using our own +// allocator, and if we are, we can cast the IMediaSample to a pointer to one +// of these are retrieve the DIB section information and hence the HBITMAP + +class CImageSample : public CMediaSample +{ +protected: + + DIBDATA m_DibData; // Information about the DIBSECTION + BOOL m_bInit; // Is the DIB information setup + +public: + + // Constructor + + CImageSample(__inout CBaseAllocator *pAllocator, + __in_opt LPCTSTR pName, + __inout HRESULT *phr, + __in_bcount(length) LPBYTE pBuffer, + LONG length); + + // Maintain the DIB/DirectDraw state + + void SetDIBData(__in DIBDATA *pDibData); + __out DIBDATA *GetDIBData(); +}; + + +// This is an allocator based on the abstract CBaseAllocator base class that +// allocates sample buffers in shared memory. The number and size of these +// are determined when the output pin calls Prepare on us. The shared memory +// blocks are used in subsequent calls to GDI CreateDIBSection, once that +// has been done the output pin can fill the buffers with data which will +// then be handed to GDI through BitBlt calls and thereby remove one copy + +class CImageAllocator : public CBaseAllocator +{ +protected: + + CBaseFilter *m_pFilter; // Delegate reference counts to + CMediaType *m_pMediaType; // Pointer to the current format + + // Used to create and delete samples + + HRESULT Alloc(); + void Free(); + + // Manage the shared DIBSECTION and DCI/DirectDraw buffers + + HRESULT CreateDIB(LONG InSize,DIBDATA &DibData); + STDMETHODIMP CheckSizes(__in ALLOCATOR_PROPERTIES *pRequest); + virtual CImageSample *CreateImageSample(__in_bcount(Length) LPBYTE pData,LONG Length); + +public: + + // Constructor and destructor + + CImageAllocator(__inout CBaseFilter *pFilter,__in_opt LPCTSTR pName,__inout HRESULT *phr); +#ifdef DEBUG + ~CImageAllocator(); +#endif + + STDMETHODIMP_(ULONG) NonDelegatingAddRef(); + STDMETHODIMP_(ULONG) NonDelegatingRelease(); + void NotifyMediaType(__in CMediaType *pMediaType); + + // Agree the number of buffers to be used and their size + + STDMETHODIMP SetProperties( + __in ALLOCATOR_PROPERTIES *pRequest, + __out ALLOCATOR_PROPERTIES *pActual); +}; + + +// This class is a fairly specialised helper class for image renderers that +// have to create and manage palettes. The CBaseWindow class looks after +// realising palettes once they have been installed. This class can be used +// to create the palette handles from a media format (which must contain a +// VIDEOINFO structure in the format block). We try to make the palette an +// identity palette to maximise performance and also only change palettes +// if actually required to (we compare palette colours before updating). +// All the methods are virtual so that they can be overriden if so required + +class CImagePalette +{ +protected: + + CBaseWindow *m_pBaseWindow; // Window to realise palette in + CBaseFilter *m_pFilter; // Media filter to send events + CDrawImage *m_pDrawImage; // Object who will be drawing + HPALETTE m_hPalette; // The palette handle we own + +public: + + CImagePalette(__inout CBaseFilter *pBaseFilter, + __inout CBaseWindow *pBaseWindow, + __inout CDrawImage *pDrawImage); + +#ifdef DEBUG + virtual ~CImagePalette(); +#endif + + static HPALETTE MakePalette(const VIDEOINFOHEADER *pVideoInfo, __in LPSTR szDevice); + HRESULT RemovePalette(); + static HRESULT MakeIdentityPalette(__inout_ecount_full(iColours) PALETTEENTRY *pEntry,INT iColours, __in LPSTR szDevice); + HRESULT CopyPalette(const CMediaType *pSrc,__out CMediaType *pDest); + BOOL ShouldUpdate(const VIDEOINFOHEADER *pNewInfo,const VIDEOINFOHEADER *pOldInfo); + HRESULT PreparePalette(const CMediaType *pmtNew,const CMediaType *pmtOld,__in LPSTR szDevice); + + BOOL DrawVideoImageHere(HDC hdc, IMediaSample *pMediaSample, __in LPRECT lprcSrc, __in LPRECT lprcDst) + { + return m_pDrawImage->DrawVideoImageHere(hdc, pMediaSample, lprcSrc,lprcDst); + } +}; + + +// Another helper class really for video based renderers. Most such renderers +// need to know what the display format is to some degree or another. This +// class initialises itself with the display format. The format can be asked +// for through GetDisplayFormat and various other accessor functions. If a +// filter detects a display format change (perhaps it gets a WM_DEVMODECHANGE +// message then it can call RefreshDisplayType to reset that format). Also +// many video renderers will want to check formats as they are proposed by +// source filters. This class provides methods to check formats and only +// accept those video formats that can be efficiently drawn using GDI calls + +class CImageDisplay : public CCritSec +{ +protected: + + // This holds the display format; biSize should not be too big, so we can + // safely use the VIDEOINFO structure + VIDEOINFO m_Display; + + static DWORD CountSetBits(const DWORD Field); + static DWORD CountPrefixBits(const DWORD Field); + static BOOL CheckBitFields(const VIDEOINFO *pInput); + +public: + + // Constructor and destructor + + CImageDisplay(); + + // Used to manage BITMAPINFOHEADERs and the display format + + const VIDEOINFO *GetDisplayFormat(); + HRESULT RefreshDisplayType(__in_opt LPSTR szDeviceName); + static BOOL CheckHeaderValidity(const VIDEOINFO *pInput); + static BOOL CheckPaletteHeader(const VIDEOINFO *pInput); + BOOL IsPalettised(); + WORD GetDisplayDepth(); + + // Provide simple video format type checking + + HRESULT CheckMediaType(const CMediaType *pmtIn); + HRESULT CheckVideoType(const VIDEOINFO *pInput); + HRESULT UpdateFormat(__inout VIDEOINFO *pVideoInfo); + const DWORD *GetBitMasks(const VIDEOINFO *pVideoInfo); + + BOOL GetColourMask(__out DWORD *pMaskRed, + __out DWORD *pMaskGreen, + __out DWORD *pMaskBlue); +}; + +// Convert a FORMAT_VideoInfo to FORMAT_VideoInfo2 +STDAPI ConvertVideoInfoToVideoInfo2(__inout AM_MEDIA_TYPE *pmt); + +// Check a media type containing VIDEOINFOHEADER +STDAPI CheckVideoInfoType(const AM_MEDIA_TYPE *pmt); + +// Check a media type containing VIDEOINFOHEADER +STDAPI CheckVideoInfo2Type(const AM_MEDIA_TYPE *pmt); + +#endif // __WINUTIL__ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/wxdebug.cpp
Added
@@ -0,0 +1,1474 @@ +//------------------------------------------------------------------------------ +// File: WXDebug.cpp +// +// Desc: DirectShow base classes - implements ActiveX system debugging +// facilities. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#define _WINDLL + +#include <streams.h> +#include <stdarg.h> +#include <stdio.h> +#include <dvdmedia.h> + +#ifdef DEBUG +#ifdef UNICODE +#ifndef _UNICODE +#define _UNICODE +#endif // _UNICODE +#endif // UNICODE +#endif // DEBUG + +#include <tchar.h> +#include <strsafe.h> + +#ifdef DEBUG +static void DisplayBITMAPINFO(const BITMAPINFOHEADER* pbmi); +static void DisplayRECT(LPCTSTR szLabel, const RECT& rc); + +// The Win32 wsprintf() function writes a maximum of 1024 characters to it's output buffer. +// See the documentation for wsprintf()'s lpOut parameter for more information. +const INT iDEBUGINFO = 1024; // Used to format strings + +/* For every module and executable we store a debugging level for each of + the five categories (eg LOG_ERROR and LOG_TIMING). This makes it easy + to isolate and debug individual modules without seeing everybody elses + spurious debug output. The keys are stored in the registry under the + HKEY_LOCAL_MACHINE\SOFTWARE\Debug\<Module Name>\<KeyName> key values + NOTE these must be in the same order as their enumeration definition */ + +const LPCTSTR pKeyNames = { + TEXT("TIMING"), // Timing and performance measurements + TEXT("TRACE"), // General step point call tracing + TEXT("MEMORY"), // Memory and object allocation/destruction + TEXT("LOCKING"), // Locking/unlocking of critical sections + TEXT("ERROR"), // Debug error notification + TEXT("CUSTOM1"), + TEXT("CUSTOM2"), + TEXT("CUSTOM3"), + TEXT("CUSTOM4"), + TEXT("CUSTOM5") + }; + +const TCHAR CAutoTrace::_szEntering = TEXT("->: %s"); +const TCHAR CAutoTrace::_szLeaving = TEXT("<-: %s"); + +const INT iMAXLEVELS = NUMELMS(pKeyNames); // Maximum debug categories + +HINSTANCE m_hInst; // Module instance handle +TCHAR m_ModuleNameiDEBUGINFO; // Cut down module name +DWORD m_LevelsiMAXLEVELS; // Debug level per category +CRITICAL_SECTION m_CSDebug; // Controls access to list +DWORD m_dwNextCookie; // Next active object ID +ObjectDesc *pListHead = NULL; // First active object +DWORD m_dwObjectCount; // Active object count +BOOL m_bInit = FALSE; // Have we been initialised +HANDLE m_hOutput = INVALID_HANDLE_VALUE; // Optional output written here +DWORD dwWaitTimeout = INFINITE; // Default timeout value +DWORD dwTimeOffset; // Time of first DbgLog call +bool g_fUseKASSERT = false; // don't create messagebox +bool g_fDbgInDllEntryPoint = false; +bool g_fAutoRefreshLevels = false; + +LPCTSTR pBaseKey = TEXT("SOFTWARE\\Microsoft\\DirectShow\\Debug"); +LPCTSTR pGlobalKey = TEXT("GLOBAL"); +static CHAR *pUnknownName = "UNKNOWN"; + +LPCTSTR TimeoutName = TEXT("TIMEOUT"); + +/* This sets the instance handle that the debug library uses to find + the module's file name from the Win32 GetModuleFileName function */ + +void WINAPI DbgInitialise(HINSTANCE hInst) +{ + InitializeCriticalSection(&m_CSDebug); + m_bInit = TRUE; + + m_hInst = hInst; + DbgInitModuleName(); + if (GetProfileInt(m_ModuleName, TEXT("BreakOnLoad"), 0)) + DebugBreak(); + DbgInitModuleSettings(false); + DbgInitGlobalSettings(true); + dwTimeOffset = timeGetTime(); +} + + +/* This is called to clear up any resources the debug library uses - at the + moment we delete our critical section and the object list. The values we + retrieve from the registry are all done during initialisation but we don't + go looking for update notifications while we are running, if the values + are changed then the application has to be restarted to pick them up */ + +void WINAPI DbgTerminate() +{ + if (m_hOutput != INVALID_HANDLE_VALUE) { + EXECUTE_ASSERT(CloseHandle(m_hOutput)); + m_hOutput = INVALID_HANDLE_VALUE; + } + DeleteCriticalSection(&m_CSDebug); + m_bInit = FALSE; +} + + +/* This is called by DbgInitLogLevels to read the debug settings + for each logging category for this module from the registry */ + +void WINAPI DbgInitKeyLevels(HKEY hKey, bool fTakeMax) +{ + LONG lReturn; // Create key return value + LONG lKeyPos; // Current key category + DWORD dwKeySize; // Size of the key value + DWORD dwKeyType; // Receives it's type + DWORD dwKeyValue; // This fields value + + /* Try and read a value for each key position in turn */ + for (lKeyPos = 0;lKeyPos < iMAXLEVELS;lKeyPos++) { + + dwKeySize = sizeof(DWORD); + lReturn = RegQueryValueEx( + hKey, // Handle to an open key + pKeyNameslKeyPos, // Subkey name derivation + NULL, // Reserved field + &dwKeyType, // Returns the field type + (LPBYTE) &dwKeyValue, // Returns the field's value + &dwKeySize ); // Number of bytes transferred + + /* If either the key was not available or it was not a DWORD value + then we ensure only the high priority debug logging is output + but we try and update the field to a zero filled DWORD value */ + + if (lReturn != ERROR_SUCCESS || dwKeyType != REG_DWORD) { + + dwKeyValue = 0; + lReturn = RegSetValueEx( + hKey, // Handle of an open key + pKeyNameslKeyPos, // Address of subkey name + (DWORD) 0, // Reserved field + REG_DWORD, // Type of the key field + (PBYTE) &dwKeyValue, // Value for the field + sizeof(DWORD)); // Size of the field buffer + + if (lReturn != ERROR_SUCCESS) { + DbgLog((LOG_ERROR,1,TEXT("Could not create subkey %s"),pKeyNameslKeyPos)); + dwKeyValue = 0; + } + } + if(fTakeMax) + { + m_LevelslKeyPos = max(dwKeyValue,m_LevelslKeyPos); + } + else + { + if((m_LevelslKeyPos & LOG_FORCIBLY_SET) == 0) { + m_LevelslKeyPos = dwKeyValue; + } + } + } + + /* Read the timeout value for catching hangs */ + dwKeySize = sizeof(DWORD); + lReturn = RegQueryValueEx( + hKey, // Handle to an open key + TimeoutName, // Subkey name derivation + NULL, // Reserved field + &dwKeyType, // Returns the field type + (LPBYTE) &dwWaitTimeout, // Returns the field's value + &dwKeySize ); // Number of bytes transferred + + /* If either the key was not available or it was not a DWORD value + then we ensure only the high priority debug logging is output + but we try and update the field to a zero filled DWORD value */ + + if (lReturn != ERROR_SUCCESS || dwKeyType != REG_DWORD) { + + dwWaitTimeout = INFINITE; + lReturn = RegSetValueEx( + hKey, // Handle of an open key + TimeoutName, // Address of subkey name + (DWORD) 0, // Reserved field + REG_DWORD, // Type of the key field + (PBYTE) &dwWaitTimeout, // Value for the field + sizeof(DWORD)); // Size of the field buffer + + if (lReturn != ERROR_SUCCESS) { + DbgLog((LOG_ERROR,1,TEXT("Could not create subkey %s"),pKeyNameslKeyPos)); + dwWaitTimeout = INFINITE; + } + } +} + +void WINAPI DbgOutString(LPCTSTR psz) +{ + if (m_hOutput != INVALID_HANDLE_VALUE) { + UINT cb = lstrlen(psz); + DWORD dw; +#ifdef UNICODE + CHAR szDest2048; + WideCharToMultiByte(CP_ACP, 0, psz, -1, szDest, NUMELMS(szDest), 0, 0); + WriteFile (m_hOutput, szDest, cb, &dw, NULL); +#else + WriteFile (m_hOutput, psz, cb, &dw, NULL); +#endif + } else { + OutputDebugString (psz); + } +} + + + + +HRESULT DbgUniqueProcessName(LPCTSTR inName, LPTSTR outName) +{ + HRESULT hr = S_OK; + const TCHAR *pIn = inName; + int dotPos = -1; + + //scan the input and record the last '.' position + while (*pIn && (pIn - inName) < MAX_PATH) + { + if ( TEXT('.') == *pIn ) + dotPos = (int)(pIn-inName); + ++pIn; + } + + if (*pIn) //input should be zero-terminated within MAX_PATH + return E_INVALIDARG; + + DWORD dwProcessId = GetCurrentProcessId(); + + if (dotPos < 0) + { + //no extension in the input, appending process id to the input + hr = StringCchPrintf(outName, MAX_PATH, TEXT("%s_%d"), inName, dwProcessId); + } + else + { + TCHAR pathAndBasenameMAX_PATH = {0}; + + //there's an extension - zero-terminate the path and basename first by copying + hr = StringCchCopyN(pathAndBasename, MAX_PATH, inName, (size_t)dotPos); + + //re-combine path, basename and extension with processId appended to a basename + if (SUCCEEDED(hr)) + hr = StringCchPrintf(outName, MAX_PATH, TEXT("%s_%d%s"), pathAndBasename, dwProcessId, inName + dotPos); + } + + return hr; +} + + +/* Called by DbgInitGlobalSettings to setup alternate logging destinations + */ + +void WINAPI DbgInitLogTo ( + HKEY hKey) +{ + LONG lReturn; + DWORD dwKeyType; + DWORD dwKeySize; + TCHAR szFileMAX_PATH = {0}; + static const TCHAR cszKey = TEXT("LogToFile"); + + dwKeySize = MAX_PATH; + lReturn = RegQueryValueEx( + hKey, // Handle to an open key + cszKey, // Subkey name derivation + NULL, // Reserved field + &dwKeyType, // Returns the field type + (LPBYTE) szFile, // Returns the field's value + &dwKeySize); // Number of bytes transferred + + // create an empty key if it does not already exist + // + if (lReturn != ERROR_SUCCESS || dwKeyType != REG_SZ) + { + dwKeySize = sizeof(TCHAR); + lReturn = RegSetValueEx( + hKey, // Handle of an open key + cszKey, // Address of subkey name + (DWORD) 0, // Reserved field + REG_SZ, // Type of the key field + (PBYTE)szFile, // Value for the field + dwKeySize); // Size of the field buffer + } + + // if an output-to was specified. try to open it. + // + if (m_hOutput != INVALID_HANDLE_VALUE) { + EXECUTE_ASSERT(CloseHandle (m_hOutput)); + m_hOutput = INVALID_HANDLE_VALUE; + } + if (szFile0 != 0) + { + if (!lstrcmpi(szFile, TEXT("Console"))) { + m_hOutput = GetStdHandle (STD_OUTPUT_HANDLE); + if (m_hOutput == INVALID_HANDLE_VALUE) { + AllocConsole (); + m_hOutput = GetStdHandle (STD_OUTPUT_HANDLE); + } + SetConsoleTitle (TEXT("ActiveX Debug Output")); + } else if (szFile0 && + lstrcmpi(szFile, TEXT("Debug")) && + lstrcmpi(szFile, TEXT("Debugger")) && + lstrcmpi(szFile, TEXT("Deb"))) + { + m_hOutput = CreateFile(szFile, GENERIC_WRITE, + FILE_SHARE_READ, + NULL, OPEN_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (INVALID_HANDLE_VALUE == m_hOutput && + GetLastError() == ERROR_SHARING_VIOLATION) + { + TCHAR uniqueNameMAX_PATH = {0}; + if (SUCCEEDED(DbgUniqueProcessName(szFile, uniqueName))) + { + m_hOutput = CreateFile(uniqueName, GENERIC_WRITE, + FILE_SHARE_READ, + NULL, OPEN_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + NULL); + } + } + + if (INVALID_HANDLE_VALUE != m_hOutput) + { + static const TCHAR cszBar = TEXT("\r\n\r\n=====DbgInitialize()=====\r\n\r\n"); + SetFilePointer (m_hOutput, 0, NULL, FILE_END); + DbgOutString (cszBar); + } + } + } +} + + + +/* This is called by DbgInitLogLevels to read the global debug settings for + each logging category for this module from the registry. Normally each + module has it's own values set for it's different debug categories but + setting the global SOFTWARE\Debug\Global applies them to ALL modules */ + +void WINAPI DbgInitGlobalSettings(bool fTakeMax) +{ + LONG lReturn; // Create key return value + TCHAR szInfoiDEBUGINFO; // Constructs key names + HKEY hGlobalKey; // Global override key + + /* Construct the global base key name */ + (void)StringCchPrintf(szInfo,NUMELMS(szInfo),TEXT("%s\\%s"),pBaseKey,pGlobalKey); + + /* Create or open the key for this module */ + lReturn = RegCreateKeyEx(HKEY_LOCAL_MACHINE, // Handle of an open key + szInfo, // Address of subkey name + (DWORD) 0, // Reserved value + NULL, // Address of class name + (DWORD) 0, // Special options flags + GENERIC_READ | GENERIC_WRITE, // Desired security access + NULL, // Key security descriptor + &hGlobalKey, // Opened handle buffer + NULL); // What really happened + + if (lReturn != ERROR_SUCCESS) { + lReturn = RegCreateKeyEx(HKEY_LOCAL_MACHINE, // Handle of an open key + szInfo, // Address of subkey name + (DWORD) 0, // Reserved value + NULL, // Address of class name + (DWORD) 0, // Special options flags + GENERIC_READ, // Desired security access + NULL, // Key security descriptor + &hGlobalKey, // Opened handle buffer + NULL); // What really happened + if (lReturn != ERROR_SUCCESS) { + DbgLog((LOG_ERROR,1,TEXT("Could not access GLOBAL module key"))); + } + return; + } + + DbgInitKeyLevels(hGlobalKey, fTakeMax); + RegCloseKey(hGlobalKey); +} + + +/* This sets the debugging log levels for the different categories. We start + by opening (or creating if not already available) the SOFTWARE\Debug key + that all these settings live under. We then look at the global values + set under SOFTWARE\Debug\Global which apply on top of the individual + module settings. We then load the individual module registry settings */ + +void WINAPI DbgInitModuleSettings(bool fTakeMax) +{ + LONG lReturn; // Create key return value + TCHAR szInfoiDEBUGINFO; // Constructs key names + HKEY hModuleKey; // Module key handle + + /* Construct the base key name */ + (void)StringCchPrintf(szInfo,NUMELMS(szInfo),TEXT("%s\\%s"),pBaseKey,m_ModuleName); + + /* Create or open the key for this module */ + lReturn = RegCreateKeyEx(HKEY_LOCAL_MACHINE, // Handle of an open key + szInfo, // Address of subkey name + (DWORD) 0, // Reserved value + NULL, // Address of class name + (DWORD) 0, // Special options flags + GENERIC_READ | GENERIC_WRITE, // Desired security access + NULL, // Key security descriptor + &hModuleKey, // Opened handle buffer + NULL); // What really happened + + if (lReturn != ERROR_SUCCESS) { + lReturn = RegCreateKeyEx(HKEY_LOCAL_MACHINE, // Handle of an open key + szInfo, // Address of subkey name + (DWORD) 0, // Reserved value + NULL, // Address of class name + (DWORD) 0, // Special options flags + GENERIC_READ, // Desired security access + NULL, // Key security descriptor + &hModuleKey, // Opened handle buffer + NULL); // What really happened + if (lReturn != ERROR_SUCCESS) { + DbgLog((LOG_ERROR,1,TEXT("Could not access module key"))); + } + return; + } + + DbgInitLogTo(hModuleKey); + DbgInitKeyLevels(hModuleKey, fTakeMax); + RegCloseKey(hModuleKey); +} + + +/* Initialise the module file name */ + +void WINAPI DbgInitModuleName() +{ + TCHAR FullNameiDEBUGINFO; // Load the full path and module name + LPTSTR pName; // Searches from the end for a backslash + + GetModuleFileName(m_hInst,FullName,iDEBUGINFO); + pName = _tcsrchr(FullName,'\\'); + if (pName == NULL) { + pName = FullName; + } else { + pName++; + } + (void)StringCchCopy(m_ModuleName,NUMELMS(m_ModuleName), pName); +} + +struct MsgBoxMsg +{ + HWND hwnd; + LPCTSTR szTitle; + LPCTSTR szMessage; + DWORD dwFlags; + INT iResult; +}; + +// +// create a thread to call MessageBox(). calling MessageBox() on +// random threads at bad times can confuse the host (eg IE). +// +DWORD WINAPI MsgBoxThread( + __inout LPVOID lpParameter // thread data + ) +{ + MsgBoxMsg *pmsg = (MsgBoxMsg *)lpParameter; + pmsg->iResult = MessageBox( + pmsg->hwnd, + pmsg->szTitle, + pmsg->szMessage, + pmsg->dwFlags); + + return 0; +} + +INT MessageBoxOtherThread( + HWND hwnd, + LPCTSTR szTitle, + LPCTSTR szMessage, + DWORD dwFlags) +{ + if(g_fDbgInDllEntryPoint) + { + // can't wait on another thread because we have the loader + // lock held in the dll entry point. + // This can crash sometimes so just skip it + // return MessageBox(hwnd, szTitle, szMessage, dwFlags); + return IDCANCEL; + } + else + { + MsgBoxMsg msg = {hwnd, szTitle, szMessage, dwFlags, 0}; + DWORD dwid; + HANDLE hThread = CreateThread( + 0, // security + 0, // stack size + MsgBoxThread, + (void *)&msg, // arg + 0, // flags + &dwid); + if(hThread) + { + WaitForSingleObject(hThread, INFINITE); + CloseHandle(hThread); + return msg.iResult; + } + + // break into debugger on failure. + return IDCANCEL; + } +} + +/* Displays a message box if the condition evaluated to FALSE */ + +void WINAPI DbgAssert(LPCTSTR pCondition,LPCTSTR pFileName,INT iLine) +{ + if(g_fUseKASSERT) + { + DbgKernelAssert(pCondition, pFileName, iLine); + } + else + { + + TCHAR szInfoiDEBUGINFO; + + (void)StringCchPrintf(szInfo, NUMELMS(szInfo),TEXT("%s \nAt line %d of %s\nContinue? (Cancel to debug)"), + pCondition, iLine, pFileName); + + INT MsgId = MessageBoxOtherThread(NULL,szInfo,TEXT("ASSERT Failed"), + MB_SYSTEMMODAL | + MB_ICONHAND | + MB_YESNOCANCEL | + MB_SETFOREGROUND); + switch (MsgId) + { + case IDNO: /* Kill the application */ + + FatalAppExit(FALSE, TEXT("Application terminated")); + break; + + case IDCANCEL: /* Break into the debugger */ + + DebugBreak(); + break; + + case IDYES: /* Ignore assertion continue execution */ + break; + } + } +} + +/* Displays a message box at a break point */ + +void WINAPI DbgBreakPoint(LPCTSTR pCondition,LPCTSTR pFileName,INT iLine) +{ + if(g_fUseKASSERT) + { + DbgKernelAssert(pCondition, pFileName, iLine); + } + else + { + TCHAR szInfoiDEBUGINFO; + + (void)StringCchPrintf(szInfo, NUMELMS(szInfo),TEXT("%s \nAt line %d of %s\nContinue? (Cancel to debug)"), + pCondition, iLine, pFileName); + + INT MsgId = MessageBoxOtherThread(NULL,szInfo,TEXT("Hard coded break point"), + MB_SYSTEMMODAL | + MB_ICONHAND | + MB_YESNOCANCEL | + MB_SETFOREGROUND); + switch (MsgId) + { + case IDNO: /* Kill the application */ + + FatalAppExit(FALSE, TEXT("Application terminated")); + break; + + case IDCANCEL: /* Break into the debugger */ + + DebugBreak(); + break; + + case IDYES: /* Ignore break point continue execution */ + break; + } + } +} + +void WINAPI DbgBreakPoint(LPCTSTR pFileName,INT iLine,__format_string LPCTSTR szFormatString,...) +{ + // A debug break point message can have at most 2000 characters if + // ANSI or UNICODE characters are being used. A debug break point message + // can have between 1000 and 2000 double byte characters in it. If a + // particular message needs more characters, then the value of this constant + // should be increased. + const DWORD MAX_BREAK_POINT_MESSAGE_SIZE = 2000; + + TCHAR szBreakPointMessageMAX_BREAK_POINT_MESSAGE_SIZE; + + va_list va; + va_start( va, szFormatString ); + + HRESULT hr = StringCchVPrintf( szBreakPointMessage, NUMELMS(szBreakPointMessage), szFormatString, va ); + + va_end(va); + + if( FAILED(hr) ) { + DbgBreak( "ERROR in DbgBreakPoint(). The variable length debug message could not be displayed because StringCchVPrintf() failed." ); + return; + } + + ::DbgBreakPoint( szBreakPointMessage, pFileName, iLine ); +} + + +/* When we initialised the library we stored in the m_Levels array the current + debug output level for this module for each of the five categories. When + some debug logging is sent to us it can be sent with a combination of the + categories (if it is applicable to many for example) in which case we map + the type's categories into their current debug levels and see if any of + them can be accepted. The function looks at each bit position in turn from + the input type field and then compares it's debug level with the modules. + + A level of 0 means that output is always sent to the debugger. This is + due to producing output if the input level is <= m_Levels. +*/ + + +BOOL WINAPI DbgCheckModuleLevel(DWORD Type,DWORD Level) +{ + if(g_fAutoRefreshLevels) + { + // re-read the registry every second. We cannot use RegNotify() to + // notice registry changes because it's not available on win9x. + static DWORD g_dwLastRefresh = 0; + DWORD dwTime = timeGetTime(); + if(dwTime - g_dwLastRefresh > 1000) { + g_dwLastRefresh = dwTime; + + // there's a race condition: multiple threads could update the + // values. plus read and write not synchronized. no harm + // though. + DbgInitModuleSettings(false); + } + } + + + DWORD Mask = 0x01; + + // If no valid bits are set return FALSE + if ((Type & ((1<<iMAXLEVELS)-1))) { + + // speed up unconditional output. + if (0==Level) + return(TRUE); + + for (LONG lKeyPos = 0;lKeyPos < iMAXLEVELS;lKeyPos++) { + if (Type & Mask) { + if (Level <= (m_LevelslKeyPos & ~LOG_FORCIBLY_SET)) { + return TRUE; + } + } + Mask <<= 1; + } + } + return FALSE; +} + + +/* Set debug levels to a given value */ + +void WINAPI DbgSetModuleLevel(DWORD Type, DWORD Level) +{ + DWORD Mask = 0x01; + + for (LONG lKeyPos = 0;lKeyPos < iMAXLEVELS;lKeyPos++) { + if (Type & Mask) { + m_LevelslKeyPos = Level | LOG_FORCIBLY_SET; + } + Mask <<= 1; + } +} + +/* whether to check registry values periodically. this isn't turned + automatically because of the potential performance hit. */ +void WINAPI DbgSetAutoRefreshLevels(bool fAuto) +{ + g_fAutoRefreshLevels = fAuto; +} + +#ifdef UNICODE +// +// warning -- this function is implemented twice for ansi applications +// linking to the unicode library +// +void WINAPI DbgLogInfo(DWORD Type,DWORD Level,__format_string LPCSTR pFormat,...) +{ + /* Check the current level for this type combination */ + + BOOL bAccept = DbgCheckModuleLevel(Type,Level); + if (bAccept == FALSE) { + return; + } + + TCHAR szInfo2000; + + /* Format the variable length parameter list */ + + va_list va; + va_start(va, pFormat); + + (void)StringCchPrintf(szInfo, NUMELMS(szInfo), + TEXT("%s(tid %x) %8d : "), + m_ModuleName, + GetCurrentThreadId(), timeGetTime() - dwTimeOffset); + + CHAR szInfoA2000; + WideCharToMultiByte(CP_ACP, 0, szInfo, -1, szInfoA, NUMELMS(szInfoA), 0, 0); + + (void)StringCchVPrintfA(szInfoA + lstrlenA(szInfoA), NUMELMS(szInfoA) - lstrlenA(szInfoA), pFormat, va); + (void)StringCchCatA(szInfoA, NUMELMS(szInfoA), "\r\n"); + + WCHAR wszOutString2000; + MultiByteToWideChar(CP_ACP, 0, szInfoA, -1, wszOutString, NUMELMS(wszOutString)); + DbgOutString(wszOutString); + + va_end(va); +} + +void WINAPI DbgAssert(LPCSTR pCondition,LPCSTR pFileName,INT iLine) +{ + if(g_fUseKASSERT) + { + DbgKernelAssert(pCondition, pFileName, iLine); + } + else + { + + TCHAR szInfoiDEBUGINFO; + + (void)StringCchPrintf(szInfo, NUMELMS(szInfo), TEXT("%hs \nAt line %d of %hs\nContinue? (Cancel to debug)"), + pCondition, iLine, pFileName); + + INT MsgId = MessageBoxOtherThread(NULL,szInfo,TEXT("ASSERT Failed"), + MB_SYSTEMMODAL | + MB_ICONHAND | + MB_YESNOCANCEL | + MB_SETFOREGROUND); + switch (MsgId) + { + case IDNO: /* Kill the application */ + + FatalAppExit(FALSE, TEXT("Application terminated")); + break; + + case IDCANCEL: /* Break into the debugger */ + + DebugBreak(); + break; + + case IDYES: /* Ignore assertion continue execution */ + break; + } + } +} + +/* Displays a message box at a break point */ + +void WINAPI DbgBreakPoint(LPCSTR pCondition,LPCSTR pFileName,INT iLine) +{ + if(g_fUseKASSERT) + { + DbgKernelAssert(pCondition, pFileName, iLine); + } + else + { + TCHAR szInfoiDEBUGINFO; + + (void)StringCchPrintf(szInfo, NUMELMS(szInfo),TEXT("%hs \nAt line %d of %hs\nContinue? (Cancel to debug)"), + pCondition, iLine, pFileName); + + INT MsgId = MessageBoxOtherThread(NULL,szInfo,TEXT("Hard coded break point"), + MB_SYSTEMMODAL | + MB_ICONHAND | + MB_YESNOCANCEL | + MB_SETFOREGROUND); + switch (MsgId) + { + case IDNO: /* Kill the application */ + + FatalAppExit(FALSE, TEXT("Application terminated")); + break; + + case IDCANCEL: /* Break into the debugger */ + + DebugBreak(); + break; + + case IDYES: /* Ignore break point continue execution */ + break; + } + } +} + +void WINAPI DbgKernelAssert(LPCSTR pCondition,LPCSTR pFileName,INT iLine) +{ + DbgLog((LOG_ERROR,0,TEXT("Assertion FAILED (%hs) at line %d in file %hs"), + pCondition, iLine, pFileName)); + DebugBreak(); +} + +#endif + +/* Print a formatted string to the debugger prefixed with this module's name + Because the COMBASE classes are linked statically every module loaded will + have their own copy of this code. It therefore helps if the module name is + included on the output so that the offending code can be easily found */ + +// +// warning -- this function is implemented twice for ansi applications +// linking to the unicode library +// +void WINAPI DbgLogInfo(DWORD Type,DWORD Level,LPCTSTR pFormat,...) +{ + + /* Check the current level for this type combination */ + + BOOL bAccept = DbgCheckModuleLevel(Type,Level); + if (bAccept == FALSE) { + return; + } + + TCHAR szInfo2000; + + /* Format the variable length parameter list */ + + va_list va; + va_start(va, pFormat); + + (void)StringCchPrintf(szInfo, NUMELMS(szInfo), + TEXT("%s(tid %x) %8d : "), + m_ModuleName, + GetCurrentThreadId(), timeGetTime() - dwTimeOffset); + + (void)StringCchVPrintf(szInfo + lstrlen(szInfo), NUMELMS(szInfo) - lstrlen(szInfo), pFormat, va); + (void)StringCchCat(szInfo, NUMELMS(szInfo), TEXT("\r\n")); + DbgOutString(szInfo); + + va_end(va); +} + + +/* If we are executing as a pure kernel filter we cannot display message + boxes to the user, this provides an alternative which puts the error + condition on the debugger output with a suitable eye catching message */ + +void WINAPI DbgKernelAssert(LPCTSTR pCondition,LPCTSTR pFileName,INT iLine) +{ + DbgLog((LOG_ERROR,0,TEXT("Assertion FAILED (%s) at line %d in file %s"), + pCondition, iLine, pFileName)); + DebugBreak(); +} + + + +/* Each time we create an object derived from CBaseObject the constructor will + call us to register the creation of the new object. We are passed a string + description which we store away. We return a cookie that the constructor + uses to identify the object when it is destroyed later on. We update the + total number of active objects in the DLL mainly for debugging purposes */ + +DWORD WINAPI DbgRegisterObjectCreation(LPCSTR szObjectName, + LPCWSTR wszObjectName) +{ + /* If this fires you have a mixed DEBUG/RETAIL build */ + + ASSERT(!!szObjectName ^ !!wszObjectName); + + /* Create a place holder for this object description */ + + ObjectDesc *pObject = new ObjectDesc; + ASSERT(pObject); + + /* It is valid to pass a NULL object name */ + if (pObject == NULL) { + return FALSE; + } + + /* Check we have been initialised - we may not be initialised when we are + being pulled in from an executable which has globally defined objects + as they are created by the C++ run time before WinMain is called */ + + if (m_bInit == FALSE) { + DbgInitialise(GetModuleHandle(NULL)); + } + + /* Grab the list critical section */ + EnterCriticalSection(&m_CSDebug); + + /* If no name then default to UNKNOWN */ + if (!szObjectName && !wszObjectName) { + szObjectName = pUnknownName; + } + + /* Put the new description at the head of the list */ + + pObject->m_szName = szObjectName; + pObject->m_wszName = wszObjectName; + pObject->m_dwCookie = ++m_dwNextCookie; + pObject->m_pNext = pListHead; + + pListHead = pObject; + m_dwObjectCount++; + + DWORD ObjectCookie = pObject->m_dwCookie; + ASSERT(ObjectCookie); + + if(wszObjectName) { + DbgLog((LOG_MEMORY,2,TEXT("Object created %d (%ls) %d Active"), + pObject->m_dwCookie, wszObjectName, m_dwObjectCount)); + } else { + DbgLog((LOG_MEMORY,2,TEXT("Object created %d (%hs) %d Active"), + pObject->m_dwCookie, szObjectName, m_dwObjectCount)); + } + + LeaveCriticalSection(&m_CSDebug); + return ObjectCookie; +} + + +/* This is called by the CBaseObject destructor when an object is about to be + destroyed, we are passed the cookie we returned during construction that + identifies this object. We scan the object list for a matching cookie and + remove the object if successful. We also update the active object count */ + +BOOL WINAPI DbgRegisterObjectDestruction(DWORD dwCookie) +{ + /* Grab the list critical section */ + EnterCriticalSection(&m_CSDebug); + + ObjectDesc *pObject = pListHead; + ObjectDesc *pPrevious = NULL; + + /* Scan the object list looking for a cookie match */ + + while (pObject) { + if (pObject->m_dwCookie == dwCookie) { + break; + } + pPrevious = pObject; + pObject = pObject->m_pNext; + } + + if (pObject == NULL) { + DbgBreak("Apparently destroying a bogus object"); + LeaveCriticalSection(&m_CSDebug); + return FALSE; + } + + /* Is the object at the head of the list */ + + if (pPrevious == NULL) { + pListHead = pObject->m_pNext; + } else { + pPrevious->m_pNext = pObject->m_pNext; + } + + /* Delete the object and update the housekeeping information */ + + m_dwObjectCount--; + + if(pObject->m_wszName) { + DbgLog((LOG_MEMORY,2,TEXT("Object destroyed %d (%ls) %d Active"), + pObject->m_dwCookie, pObject->m_wszName, m_dwObjectCount)); + } else { + DbgLog((LOG_MEMORY,2,TEXT("Object destroyed %d (%hs) %d Active"), + pObject->m_dwCookie, pObject->m_szName, m_dwObjectCount)); + } + + delete pObject; + LeaveCriticalSection(&m_CSDebug); + return TRUE; +} + + +/* This runs through the active object list displaying their details */ + +void WINAPI DbgDumpObjectRegister() +{ + TCHAR szInfoiDEBUGINFO; + + /* Grab the list critical section */ + + EnterCriticalSection(&m_CSDebug); + ObjectDesc *pObject = pListHead; + + /* Scan the object list displaying the name and cookie */ + + DbgLog((LOG_MEMORY,2,TEXT(""))); + DbgLog((LOG_MEMORY,2,TEXT(" ID Object Description"))); + DbgLog((LOG_MEMORY,2,TEXT(""))); + + while (pObject) { + if(pObject->m_wszName) { + (void)StringCchPrintf(szInfo,NUMELMS(szInfo),TEXT("%5d (%p) %30ls"),pObject->m_dwCookie, &pObject, pObject->m_wszName); + } else { + (void)StringCchPrintf(szInfo,NUMELMS(szInfo),TEXT("%5d (%p) %30hs"),pObject->m_dwCookie, &pObject, pObject->m_szName); + } + DbgLog((LOG_MEMORY,2,szInfo)); + pObject = pObject->m_pNext; + } + + (void)StringCchPrintf(szInfo,NUMELMS(szInfo),TEXT("Total object count %5d"),m_dwObjectCount); + DbgLog((LOG_MEMORY,2,TEXT(""))); + DbgLog((LOG_MEMORY,1,szInfo)); + LeaveCriticalSection(&m_CSDebug); +} + +/* Debug infinite wait stuff */ +DWORD WINAPI DbgWaitForSingleObject(HANDLE h) +{ + DWORD dwWaitResult; + do { + dwWaitResult = WaitForSingleObject(h, dwWaitTimeout); + ASSERT(dwWaitResult == WAIT_OBJECT_0); + } while (dwWaitResult == WAIT_TIMEOUT); + return dwWaitResult; +} +DWORD WINAPI DbgWaitForMultipleObjects(DWORD nCount, + __in_ecount(nCount) CONST HANDLE *lpHandles, + BOOL bWaitAll) +{ + DWORD dwWaitResult; + do { + dwWaitResult = WaitForMultipleObjects(nCount, + lpHandles, + bWaitAll, + dwWaitTimeout); + ASSERT((DWORD)(dwWaitResult - WAIT_OBJECT_0) < MAXIMUM_WAIT_OBJECTS); + } while (dwWaitResult == WAIT_TIMEOUT); + return dwWaitResult; +} + +void WINAPI DbgSetWaitTimeout(DWORD dwTimeout) +{ + dwWaitTimeout = dwTimeout; +} + +#endif /* DEBUG */ + +#ifdef _OBJBASE_H_ + + /* Stuff for printing out our GUID names */ + + GUID_STRING_ENTRY g_GuidNames = { + #define OUR_GUID_ENTRY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + { #name, { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } }, + #include <uuids.h> + }; + + CGuidNameList GuidNames; + int g_cGuidNames = sizeof(g_GuidNames) / sizeof(g_GuidNames0); + + char *CGuidNameList::operator (const GUID &guid) + { + for (int i = 0; i < g_cGuidNames; i++) { + if (g_GuidNamesi.guid == guid) { + return g_GuidNamesi.szName; + } + } + if (guid == GUID_NULL) { + return "GUID_NULL"; + } + + // !!! add something to print FOURCC guids? + + // shouldn't this print the hex CLSID? + return "Unknown GUID Name"; + } + +#endif /* _OBJBASE_H_ */ + +/* CDisp class - display our data types */ + +// clashes with REFERENCE_TIME +CDisp::CDisp(LONGLONG ll, int Format) +{ + // note: this could be combined with CDisp(LONGLONG) by + // introducing a default format of CDISP_REFTIME + LARGE_INTEGER li; + li.QuadPart = ll; + switch (Format) { + case CDISP_DEC: + { + TCHAR temp20; + int pos=20; + temp--pos = 0; + int digit; + // always output at least one digit + do { + // Get the rightmost digit - we only need the low word + digit = li.LowPart % 10; + li.QuadPart /= 10; + temp--pos = (TCHAR) digit+L'0'; + } while (li.QuadPart); + (void)StringCchCopy(m_String, NUMELMS(m_String), temp+pos); + break; + } + case CDISP_HEX: + default: + (void)StringCchPrintf(m_String, NUMELMS(m_String), TEXT("0x%X%8.8X"), li.HighPart, li.LowPart); + } +}; + +CDisp::CDisp(REFCLSID clsid) +{ +#ifdef UNICODE + (void)StringFromGUID2(clsid, m_String, NUMELMS(m_String)); +#else + WCHAR wszTemp50; + (void)StringFromGUID2(clsid, wszTemp, NUMELMS(wszTemp)); + (void)StringCchPrintf(m_String, NUMELMS(m_String), TEXT("%S"), wszTemp); +#endif +}; + +#ifdef __STREAMS__ +/* Display stuff */ +CDisp::CDisp(CRefTime llTime) +{ + LONGLONG llDiv; + if (llTime < 0) { + llTime = -llTime; + (void)StringCchCopy(m_String, NUMELMS(m_String), TEXT("-")); + } + llDiv = (LONGLONG)24 * 3600 * 10000000; + if (llTime >= llDiv) { + (void)StringCchPrintf(m_String + lstrlen(m_String), NUMELMS(m_String) - lstrlen(m_String), TEXT("%d days "), (LONG)(llTime / llDiv)); + llTime = llTime % llDiv; + } + llDiv = (LONGLONG)3600 * 10000000; + if (llTime >= llDiv) { + (void)StringCchPrintf(m_String + lstrlen(m_String), NUMELMS(m_String) - lstrlen(m_String), TEXT("%d hrs "), (LONG)(llTime / llDiv)); + llTime = llTime % llDiv; + } + llDiv = (LONGLONG)60 * 10000000; + if (llTime >= llDiv) { + (void)StringCchPrintf(m_String + lstrlen(m_String), NUMELMS(m_String) - lstrlen(m_String), TEXT("%d mins "), (LONG)(llTime / llDiv)); + llTime = llTime % llDiv; + } + (void)StringCchPrintf(m_String + lstrlen(m_String), NUMELMS(m_String) - lstrlen(m_String), TEXT("%d.%3.3d sec"), + (LONG)llTime / 10000000, + (LONG)((llTime % 10000000) / 10000)); +}; + +#endif // __STREAMS__ + + +/* Display pin */ +CDisp::CDisp(IPin *pPin) +{ + PIN_INFO pi; + TCHAR strMAX_PIN_NAME; + CLSID clsid; + + if (pPin) { + pPin->QueryPinInfo(&pi); + pi.pFilter->GetClassID(&clsid); + QueryPinInfoReleaseFilter(pi); + #ifndef UNICODE + WideCharToMultiByte(GetACP(), 0, pi.achName, lstrlenW(pi.achName) + 1, + str, MAX_PIN_NAME, NULL, NULL); + #else + (void)StringCchCopy(str, NUMELMS(str), pi.achName); + #endif + } else { + (void)StringCchCopy(str, NUMELMS(str), TEXT("NULL IPin")); + } + + m_pString = (PTCHAR) new TCHARlstrlen(str)+64; + if (!m_pString) { + return; + } + + (void)StringCchPrintf(m_pString, lstrlen(str) + 64, TEXT("%hs(%s)"), GuidNamesclsid, str); +} + +/* Display filter or pin */ +CDisp::CDisp(IUnknown *pUnk) +{ + IBaseFilter *pf; + HRESULT hr = pUnk->QueryInterface(IID_IBaseFilter, (void **)&pf); + if(SUCCEEDED(hr)) + { + FILTER_INFO fi; + hr = pf->QueryFilterInfo(&fi); + if(SUCCEEDED(hr)) + { + QueryFilterInfoReleaseGraph(fi); + + size_t len = lstrlenW(fi.achName) + 1; + + m_pString = new TCHARlen; + if(m_pString) + { +#ifdef UNICODE + (void)StringCchCopy(m_pString, len, fi.achName); +#else + (void)StringCchPrintf(m_pString, len, "%S", fi.achName); +#endif + } + } + + pf->Release(); + + return; + } + + IPin *pp; + hr = pUnk->QueryInterface(IID_IPin, (void **)&pp); + if(SUCCEEDED(hr)) + { + CDisp::CDisp(pp); + pp->Release(); + return; + } +} + + +CDisp::~CDisp() +{ +} + +CDispBasic::~CDispBasic() +{ + if (m_pString != m_String) { + delete m_pString; + } +} + +CDisp::CDisp(double d) +{ + (void)StringCchPrintf(m_String, NUMELMS(m_String), TEXT("%d.%03d"), (int) d, (int) ((d - (int) d) * 1000)); +} + + +/* If built for debug this will display the media type details. We convert the + major and subtypes into strings and also ask the base classes for a string + description of the subtype, so MEDIASUBTYPE_RGB565 becomes RGB 565 16 bit + We also display the fields in the BITMAPINFOHEADER structure, this should + succeed as we do not accept input types unless the format is big enough */ + +#ifdef DEBUG +void WINAPI DisplayType(LPCTSTR label, const AM_MEDIA_TYPE *pmtIn) +{ + + /* Dump the GUID types and a short description */ + + DbgLog((LOG_TRACE,5,TEXT(""))); + DbgLog((LOG_TRACE,2,TEXT("%s M type %hs S type %hs"), label, + GuidNamespmtIn->majortype, + GuidNamespmtIn->subtype)); + DbgLog((LOG_TRACE,5,TEXT("Subtype description %s"),GetSubtypeName(&pmtIn->subtype))); + + /* Dump the generic media types */ + + if (pmtIn->bTemporalCompression) { + DbgLog((LOG_TRACE,5,TEXT("Temporally compressed"))); + } else { + DbgLog((LOG_TRACE,5,TEXT("Not temporally compressed"))); + } + + if (pmtIn->bFixedSizeSamples) { + DbgLog((LOG_TRACE,5,TEXT("Sample size %d"),pmtIn->lSampleSize)); + } else { + DbgLog((LOG_TRACE,5,TEXT("Variable size samples"))); + } + + if (pmtIn->formattype == FORMAT_VideoInfo) { + + VIDEOINFOHEADER *pVideoInfo = (VIDEOINFOHEADER *)pmtIn->pbFormat; + + DisplayRECT(TEXT("Source rectangle"),pVideoInfo->rcSource); + DisplayRECT(TEXT("Target rectangle"),pVideoInfo->rcTarget); + DisplayBITMAPINFO(HEADER(pmtIn->pbFormat)); + + } if (pmtIn->formattype == FORMAT_VideoInfo2) { + + VIDEOINFOHEADER2 *pVideoInfo2 = (VIDEOINFOHEADER2 *)pmtIn->pbFormat; + + DisplayRECT(TEXT("Source rectangle"),pVideoInfo2->rcSource); + DisplayRECT(TEXT("Target rectangle"),pVideoInfo2->rcTarget); + DbgLog((LOG_TRACE, 5, TEXT("Aspect Ratio: %d:%d"), + pVideoInfo2->dwPictAspectRatioX, + pVideoInfo2->dwPictAspectRatioY)); + DisplayBITMAPINFO(&pVideoInfo2->bmiHeader); + + } else if (pmtIn->majortype == MEDIATYPE_Audio) { + DbgLog((LOG_TRACE,2,TEXT(" Format type %hs"), + GuidNamespmtIn->formattype)); + DbgLog((LOG_TRACE,2,TEXT(" Subtype %hs"), + GuidNamespmtIn->subtype)); + + if ((pmtIn->subtype != MEDIASUBTYPE_MPEG1Packet) + && (pmtIn->cbFormat >= sizeof(PCMWAVEFORMAT))) + { + /* Dump the contents of the WAVEFORMATEX type-specific format structure */ + + WAVEFORMATEX *pwfx = (WAVEFORMATEX *) pmtIn->pbFormat; + DbgLog((LOG_TRACE,2,TEXT("wFormatTag %u"), pwfx->wFormatTag)); + DbgLog((LOG_TRACE,2,TEXT("nChannels %u"), pwfx->nChannels)); + DbgLog((LOG_TRACE,2,TEXT("nSamplesPerSec %lu"), pwfx->nSamplesPerSec)); + DbgLog((LOG_TRACE,2,TEXT("nAvgBytesPerSec %lu"), pwfx->nAvgBytesPerSec)); + DbgLog((LOG_TRACE,2,TEXT("nBlockAlign %u"), pwfx->nBlockAlign)); + DbgLog((LOG_TRACE,2,TEXT("wBitsPerSample %u"), pwfx->wBitsPerSample)); + + /* PCM uses a WAVEFORMAT and does not have the extra size field */ + + if (pmtIn->cbFormat >= sizeof(WAVEFORMATEX)) { + DbgLog((LOG_TRACE,2,TEXT("cbSize %u"), pwfx->cbSize)); + } + } else { + } + + } else { + DbgLog((LOG_TRACE,2,TEXT(" Format type %hs"), + GuidNamespmtIn->formattype)); + } +} + + +void DisplayBITMAPINFO(const BITMAPINFOHEADER* pbmi) +{ + DbgLog((LOG_TRACE,5,TEXT("Size of BITMAPINFO structure %d"),pbmi->biSize)); + if (pbmi->biCompression < 256) { + DbgLog((LOG_TRACE,2,TEXT("%dx%dx%d bit (%d)"), + pbmi->biWidth, pbmi->biHeight, + pbmi->biBitCount, pbmi->biCompression)); + } else { + DbgLog((LOG_TRACE,2,TEXT("%dx%dx%d bit '%4.4hs'"), + pbmi->biWidth, pbmi->biHeight, + pbmi->biBitCount, &pbmi->biCompression)); + } + + DbgLog((LOG_TRACE,2,TEXT("Image size %d"),pbmi->biSizeImage)); + DbgLog((LOG_TRACE,5,TEXT("Planes %d"),pbmi->biPlanes)); + DbgLog((LOG_TRACE,5,TEXT("X Pels per metre %d"),pbmi->biXPelsPerMeter)); + DbgLog((LOG_TRACE,5,TEXT("Y Pels per metre %d"),pbmi->biYPelsPerMeter)); + DbgLog((LOG_TRACE,5,TEXT("Colours used %d"),pbmi->biClrUsed)); +} + + +void DisplayRECT(LPCTSTR szLabel, const RECT& rc) +{ + DbgLog((LOG_TRACE,5,TEXT("%s (Left %d Top %d Right %d Bottom %d)"), + szLabel, + rc.left, + rc.top, + rc.right, + rc.bottom)); +} + + +void WINAPI DumpGraph(IFilterGraph *pGraph, DWORD dwLevel) +{ + if( !pGraph ) + { + return; + } + + IEnumFilters *pFilters; + + DbgLog((LOG_TRACE,dwLevel,TEXT("DumpGraph %x"), pGraph)); + + if (FAILED(pGraph->EnumFilters(&pFilters))) { + DbgLog((LOG_TRACE,dwLevel,TEXT("EnumFilters failed!"))); + } + + IBaseFilter *pFilter; + ULONG n; + while (pFilters->Next(1, &pFilter, &n) == S_OK) { + FILTER_INFO info; + + if (FAILED(pFilter->QueryFilterInfo(&info))) { + DbgLog((LOG_TRACE,dwLevel,TEXT(" Filter %p -- failed QueryFilterInfo"), pFilter)); + } else { + QueryFilterInfoReleaseGraph(info); + + // !!! should QueryVendorInfo here! + + DbgLog((LOG_TRACE,dwLevel,TEXT(" Filter %p '%ls'"), pFilter, info.achName)); + + IEnumPins *pins; + + if (FAILED(pFilter->EnumPins(&pins))) { + DbgLog((LOG_TRACE,dwLevel,TEXT("EnumPins failed!"))); + } else { + + IPin *pPin; + while (pins->Next(1, &pPin, &n) == S_OK) { + PIN_INFO pinInfo; + + if (FAILED(pPin->QueryPinInfo(&pinInfo))) { + DbgLog((LOG_TRACE,dwLevel,TEXT(" Pin %x -- failed QueryPinInfo"), pPin)); + } else { + QueryPinInfoReleaseFilter(pinInfo); + + IPin *pPinConnected = NULL; + + HRESULT hr = pPin->ConnectedTo(&pPinConnected); + + if (pPinConnected) { + DbgLog((LOG_TRACE,dwLevel,TEXT(" Pin %p '%ls' %sput") + TEXT(" Connected to pin %p"), + pPin, pinInfo.achName, + pinInfo.dir == PINDIR_INPUT ? TEXT("In") : TEXT("Out"), + pPinConnected)); + + pPinConnected->Release(); + + // perhaps we should really dump the type both ways as a sanity + // check? + if (pinInfo.dir == PINDIR_OUTPUT) { + AM_MEDIA_TYPE mt; + + hr = pPin->ConnectionMediaType(&mt); + + if (SUCCEEDED(hr)) { + DisplayType(TEXT("Connection type"), &mt); + + FreeMediaType(mt); + } + } + } else { + DbgLog((LOG_TRACE,dwLevel, + TEXT(" Pin %x '%ls' %sput"), + pPin, pinInfo.achName, + pinInfo.dir == PINDIR_INPUT ? TEXT("In") : TEXT("Out"))); + + } + } + + pPin->Release(); + + } + + pins->Release(); + } + + } + + pFilter->Release(); + } + + pFilters->Release(); + +} + +#endif +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/wxdebug.h
Added
@@ -0,0 +1,359 @@ +//------------------------------------------------------------------------------ +// File: WXDebug.h +// +// Desc: DirectShow base classes - provides debugging facilities. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __WXDEBUG__ +#define __WXDEBUG__ + +// This library provides fairly straight forward debugging functionality, this +// is split into two main sections. The first is assertion handling, there are +// three types of assertions provided here. The most commonly used one is the +// ASSERT(condition) macro which will pop up a message box including the file +// and line number if the condition evaluates to FALSE. Then there is the +// EXECUTE_ASSERT macro which is the same as ASSERT except the condition will +// still be executed in NON debug builds. The final type of assertion is the +// KASSERT macro which is more suitable for pure (perhaps kernel) filters as +// the condition is printed onto the debugger rather than in a message box. +// +// The other part of the debug module facilties is general purpose logging. +// This is accessed by calling DbgLog(). The function takes a type and level +// field which define the type of informational string you are presenting and +// it's relative importance. The type field can be a combination (one or more) +// of LOG_TIMING, LOG_TRACE, LOG_MEMORY, LOG_LOCKING and LOG_ERROR. The level +// is a DWORD value where zero defines highest important. Use of zero as the +// debug logging level is to be encouraged ONLY for major errors or events as +// they will ALWAYS be displayed on the debugger. Other debug output has it's +// level matched against the current debug output level stored in the registry +// for this module and if less than the current setting it will be displayed. +// +// Each module or executable has it's own debug output level for each of the +// five types. These are read in when the DbgInitialise function is called +// for DLLs linking to STRMBASE.LIB this is done automatically when the DLL +// is loaded, executables must call it explicitely with the module instance +// handle given to them through the WINMAIN entry point. An executable must +// also call DbgTerminate when they have finished to clean up the resources +// the debug library uses, once again this is done automatically for DLLs + +// These are the five different categories of logging information + +enum { LOG_TIMING = 0x01, // Timing and performance measurements + LOG_TRACE = 0x02, // General step point call tracing + LOG_MEMORY = 0x04, // Memory and object allocation/destruction + LOG_LOCKING = 0x08, // Locking/unlocking of critical sections + LOG_ERROR = 0x10, // Debug error notification + LOG_CUSTOM1 = 0x20, + LOG_CUSTOM2 = 0x40, + LOG_CUSTOM3 = 0x80, + LOG_CUSTOM4 = 0x100, + LOG_CUSTOM5 = 0x200, +}; + +#define LOG_FORCIBLY_SET 0x80000000 + +enum { CDISP_HEX = 0x01, + CDISP_DEC = 0x02}; + +// For each object created derived from CBaseObject (in debug builds) we +// create a descriptor that holds it's name (statically allocated memory) +// and a cookie we assign it. We keep a list of all the active objects +// we have registered so that we can dump a list of remaining objects + +typedef struct tag_ObjectDesc { + LPCSTR m_szName; + LPCWSTR m_wszName; + DWORD m_dwCookie; + tag_ObjectDesc *m_pNext; +} ObjectDesc; + +#define DLLIMPORT __declspec(dllimport) +#define DLLEXPORT __declspec(dllexport) + +#ifdef DEBUG + + #define NAME(x) TEXT(x) + + // These are used internally by the debug library (PRIVATE) + + void WINAPI DbgInitKeyLevels(HKEY hKey, bool fTakeMax); + void WINAPI DbgInitGlobalSettings(bool fTakeMax); + void WINAPI DbgInitModuleSettings(bool fTakeMax); + void WINAPI DbgInitModuleName(); + DWORD WINAPI DbgRegisterObjectCreation( + LPCSTR szObjectName, LPCWSTR wszObjectName); + + BOOL WINAPI DbgRegisterObjectDestruction(DWORD dwCookie); + + // These are the PUBLIC entry points + + BOOL WINAPI DbgCheckModuleLevel(DWORD Type,DWORD Level); + void WINAPI DbgSetModuleLevel(DWORD Type,DWORD Level); + void WINAPI DbgSetAutoRefreshLevels(bool fAuto); + + // Initialise the library with the module handle + + void WINAPI DbgInitialise(HINSTANCE hInst); + void WINAPI DbgTerminate(); + + void WINAPI DbgDumpObjectRegister(); + + // Display error and logging to the user + + void WINAPI DbgAssert(LPCTSTR pCondition,LPCTSTR pFileName,INT iLine); + void WINAPI DbgBreakPoint(LPCTSTR pCondition,LPCTSTR pFileName,INT iLine); + void WINAPI DbgBreakPoint(LPCTSTR pFileName,INT iLine,__format_string LPCTSTR szFormatString,...); + + void WINAPI DbgKernelAssert(LPCTSTR pCondition,LPCTSTR pFileName,INT iLine); + void WINAPI DbgLogInfo(DWORD Type,DWORD Level,__format_string LPCTSTR pFormat,...); +#ifdef UNICODE + void WINAPI DbgLogInfo(DWORD Type,DWORD Level,__format_string LPCSTR pFormat,...); + void WINAPI DbgAssert(LPCSTR pCondition,LPCSTR pFileName,INT iLine); + void WINAPI DbgBreakPoint(LPCSTR pCondition,LPCSTR pFileName,INT iLine); + void WINAPI DbgKernelAssert(LPCSTR pCondition,LPCSTR pFileName,INT iLine); +#endif + void WINAPI DbgOutString(LPCTSTR psz); + + // Debug infinite wait stuff + DWORD WINAPI DbgWaitForSingleObject(HANDLE h); + DWORD WINAPI DbgWaitForMultipleObjects(DWORD nCount, + __in_ecount(nCount) CONST HANDLE *lpHandles, + BOOL bWaitAll); + void WINAPI DbgSetWaitTimeout(DWORD dwTimeout); + +#ifdef __strmif_h__ + // Display a media type: Terse at level 2, verbose at level 5 + void WINAPI DisplayType(LPCTSTR label, const AM_MEDIA_TYPE *pmtIn); + + // Dump lots of information about a filter graph + void WINAPI DumpGraph(IFilterGraph *pGraph, DWORD dwLevel); +#endif + + #define KASSERT(_x_) if (!(_x_)) \ + DbgKernelAssert(TEXT(#_x_),TEXT(__FILE__),__LINE__) + + // Break on the debugger without putting up a message box + // message goes to debugger instead + + #define KDbgBreak(_x_) \ + DbgKernelAssert(TEXT(#_x_),TEXT(__FILE__),__LINE__) + + // We chose a common name for our ASSERT macro, MFC also uses this name + // So long as the implementation evaluates the condition and handles it + // then we will be ok. Rather than override the behaviour expected we + // will leave whatever first defines ASSERT as the handler (i.e. MFC) + #ifndef ASSERT + #define ASSERT(_x_) if (!(_x_)) \ + DbgAssert(TEXT(#_x_),TEXT(__FILE__),__LINE__) + #endif + + #define DbgAssertAligned( _ptr_, _alignment_ ) ASSERT( ((DWORD_PTR) (_ptr_)) % (_alignment_) == 0) + + // Put up a message box informing the user of a halt + // condition in the program + + #define DbgBreak(_x_) \ + DbgBreakPoint(TEXT(#_x_),TEXT(__FILE__),__LINE__) + + #define EXECUTE_ASSERT(_x_) ASSERT(_x_) + #define DbgLog(_x_) DbgLogInfo _x_ + // MFC style trace macros + + #define NOTE(_x_) DbgLog((LOG_TRACE,5,TEXT(_x_))) + #define NOTE1(_x_,a) DbgLog((LOG_TRACE,5,TEXT(_x_),a)) + #define NOTE2(_x_,a,b) DbgLog((LOG_TRACE,5,TEXT(_x_),a,b)) + #define NOTE3(_x_,a,b,c) DbgLog((LOG_TRACE,5,TEXT(_x_),a,b,c)) + #define NOTE4(_x_,a,b,c,d) DbgLog((LOG_TRACE,5,TEXT(_x_),a,b,c,d)) + #define NOTE5(_x_,a,b,c,d,e) DbgLog((LOG_TRACE,5,TEXT(_x_),a,b,c,d,e)) + +#else + + // Retail builds make public debug functions inert - WARNING the source + // files do not define or build any of the entry points in debug builds + // (public entry points compile to nothing) so if you go trying to call + // any of the private entry points in your source they won't compile + + #define NAME(_x_) ((LPTSTR) NULL) + + #define DbgInitialise(hInst) + #define DbgTerminate() + #define DbgLog(_x_) 0 + #define DbgOutString(psz) + #define DbgAssertAligned( _ptr_, _alignment_ ) 0 + + #define DbgRegisterObjectCreation(pObjectName) + #define DbgRegisterObjectDestruction(dwCookie) + #define DbgDumpObjectRegister() + + #define DbgCheckModuleLevel(Type,Level) + #define DbgSetModuleLevel(Type,Level) + #define DbgSetAutoRefreshLevels(fAuto) + + #define DbgWaitForSingleObject(h) WaitForSingleObject(h, INFINITE) + #define DbgWaitForMultipleObjects(nCount, lpHandles, bWaitAll) \ + WaitForMultipleObjects(nCount, lpHandles, bWaitAll, INFINITE) + #define DbgSetWaitTimeout(dwTimeout) + + #define KDbgBreak(_x_) + #define DbgBreak(_x_) + + #define KASSERT(_x_) ((void)0) + #ifndef ASSERT + #define ASSERT(_x_) ((void)0) + #endif + #define EXECUTE_ASSERT(_x_) ((void)(_x_)) + + // MFC style trace macros + + #define NOTE(_x_) ((void)0) + #define NOTE1(_x_,a) ((void)0) + #define NOTE2(_x_,a,b) ((void)0) + #define NOTE3(_x_,a,b,c) ((void)0) + #define NOTE4(_x_,a,b,c,d) ((void)0) + #define NOTE5(_x_,a,b,c,d,e) ((void)0) + + #define DisplayType(label, pmtIn) ((void)0) + #define DumpGraph(pGraph, label) ((void)0) +#endif + + +// Checks a pointer which should be non NULL - can be used as follows. + +#define CheckPointer(p,ret) {if((p)==NULL) return (ret);} + +// HRESULT Foo(VOID *pBar) +// { +// CheckPointer(pBar,E_INVALIDARG) +// } +// +// Or if the function returns a boolean +// +// BOOL Foo(VOID *pBar) +// { +// CheckPointer(pBar,FALSE) +// } + +#define ValidateReadPtr(p,cb) 0 +#define ValidateWritePtr(p,cb) 0 +#define ValidateReadWritePtr(p,cb) 0 +#define ValidateStringPtr(p) 0 +#define ValidateStringPtrA(p) 0 +#define ValidateStringPtrW(p) 0 + + +#ifdef _OBJBASE_H_ + + // Outputting GUID names. If you want to include the name + // associated with a GUID (eg CLSID_...) then + // + // GuidNamesyourGUID + // + // Returns the name defined in uuids.h as a string + + typedef struct { + CHAR *szName; + GUID guid; + } GUID_STRING_ENTRY; + + class CGuidNameList { + public: + CHAR *operator (const GUID& guid); + }; + + extern CGuidNameList GuidNames; + +#endif + +#ifndef REMIND + // REMIND macro - generates warning as reminder to complete coding + // (eg) usage: + // + // #pragma message (REMIND("Add automation support")) + + + #define QUOTE(x) #x + #define QQUOTE(y) QUOTE(y) + #define REMIND(str) __FILE__ "(" QQUOTE(__LINE__) ") : " str +#endif + +// Method to display objects in a useful format +// +// eg If you want to display a LONGLONG ll in a debug string do (eg) +// +// DbgLog((LOG_TRACE, n, TEXT("Value is %s"), (LPCTSTR)CDisp(ll, CDISP_HEX))); + + +class CDispBasic +{ +public: + CDispBasic() { m_pString = m_String; }; + ~CDispBasic(); +protected: + PTCHAR m_pString; // normally points to m_String... unless too much data + TCHAR m_String50; +}; +class CDisp : public CDispBasic +{ +public: + CDisp(LONGLONG ll, int Format = CDISP_HEX); // Display a LONGLONG in CDISP_HEX or CDISP_DEC form + CDisp(REFCLSID clsid); // Display a GUID + CDisp(double d); // Display a floating point number +#ifdef __strmif_h__ +#ifdef __STREAMS__ + CDisp(CRefTime t); // Display a Reference Time +#endif + CDisp(IPin *pPin); // Display a pin as {filter clsid}(pin name) + CDisp(IUnknown *pUnk); // Display a filter or pin +#endif // __strmif_h__ + ~CDisp(); + + // Implement cast to (LPCTSTR) as parameter to logger + operator LPCTSTR() + { + return (LPCTSTR)m_pString; + }; +}; + + +#if defined(DEBUG) +class CAutoTrace +{ +private: + LPCTSTR _szBlkName; + const int _level; + static const TCHAR _szEntering; + static const TCHAR _szLeaving; +public: + CAutoTrace(LPCTSTR szBlkName, const int level = 15) + : _szBlkName(szBlkName), _level(level) + {DbgLog((LOG_TRACE, _level, _szEntering, _szBlkName));} + + ~CAutoTrace() + {DbgLog((LOG_TRACE, _level, _szLeaving, _szBlkName));} +}; + +#if defined (__FUNCTION__) + +#define AMTRACEFN() CAutoTrace __trace(TEXT(__FUNCTION__)) +#define AMTRACE(_x_) CAutoTrace __trace(TEXT(__FUNCTION__)) + +#else + +#define AMTRACE(_x_) CAutoTrace __trace _x_ +#define AMTRACEFN() + +#endif + +#else + +#define AMTRACE(_x_) +#define AMTRACEFN() + +#endif + +#endif // __WXDEBUG__ + +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/wxlist.cpp
Added
@@ -0,0 +1,891 @@ +//------------------------------------------------------------------------------ +// File: WXList.cpp +// +// Desc: DirectShow base classes - implements a non-MFC based generic list +// template class. +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +/* A generic list of pointers to objects. + Objectives: avoid using MFC libraries in ndm kernel mode and + provide a really useful list type. + + The class is thread safe in that separate threads may add and + delete items in the list concurrently although the application + must ensure that constructor and destructor access is suitably + synchronised. + + The list name must not conflict with MFC classes as an + application may use both + + The nodes form a doubly linked, NULL terminated chain with an anchor + block (the list object per se) holding pointers to the first and last + nodes and a count of the nodes. + There is a node cache to reduce the allocation and freeing overhead. + It optionally (determined at construction time) has an Event which is + set whenever the list becomes non-empty and reset whenever it becomes + empty. + It optionally (determined at construction time) has a Critical Section + which is entered during the important part of each operation. (About + all you can do outside it is some parameter checking). + + The node cache is a repository of nodes that are NOT in the list to speed + up storage allocation. Each list has its own cache to reduce locking and + serialising. The list accesses are serialised anyway for a given list - a + common cache would mean that we would have to separately serialise access + of all lists within the cache. Because the cache only stores nodes that are + not in the list, releasing the cache does not release any list nodes. This + means that list nodes can be copied or rechained from one list to another + without danger of creating a dangling reference if the original cache goes + away. + + Questionable design decisions: + 1. Retaining the warts for compatibility + 2. Keeping an element count -i.e. counting whenever we do anything + instead of only when we want the count. + 3. Making the chain pointers NULL terminated. If the list object + itself looks just like a node and the list is kept as a ring then + it reduces the number of special cases. All inserts look the same. +*/ + + +#include <streams.h> + +/* set cursor to the position of each element of list in turn */ +#define INTERNALTRAVERSELIST(list, cursor) \ +for ( cursor = (list).GetHeadPositionI() \ + ; cursor!=NULL \ + ; cursor = (list).Next(cursor) \ + ) + + +/* set cursor to the position of each element of list in turn + in reverse order +*/ +#define INTERNALREVERSETRAVERSELIST(list, cursor) \ +for ( cursor = (list).GetTailPositionI() \ + ; cursor!=NULL \ + ; cursor = (list).Prev(cursor) \ + ) + +/* Constructor calls a separate initialisation function that + creates a node cache, optionally creates a lock object + and optionally creates a signaling object. + + By default we create a locking object, a DEFAULTCACHE sized + cache but no event object so the list cannot be used in calls + to WaitForSingleObject +*/ +CBaseList::CBaseList(__in_opt LPCTSTR pName, // Descriptive list name + INT iItems) : // Node cache size +#ifdef DEBUG + CBaseObject(pName), +#endif + m_pFirst(NULL), + m_pLast(NULL), + m_Count(0), + m_Cache(iItems) +{ +} // constructor + +CBaseList::CBaseList(__in_opt LPCTSTR pName) : // Descriptive list name +#ifdef DEBUG + CBaseObject(pName), +#endif + m_pFirst(NULL), + m_pLast(NULL), + m_Count(0), + m_Cache(DEFAULTCACHE) +{ +} // constructor + +#ifdef UNICODE +CBaseList::CBaseList(__in_opt LPCSTR pName, // Descriptive list name + INT iItems) : // Node cache size +#ifdef DEBUG + CBaseObject(pName), +#endif + m_pFirst(NULL), + m_pLast(NULL), + m_Count(0), + m_Cache(iItems) +{ +} // constructor + +CBaseList::CBaseList(__in_opt LPCSTR pName) : // Descriptive list name +#ifdef DEBUG + CBaseObject(pName), +#endif + m_pFirst(NULL), + m_pLast(NULL), + m_Count(0), + m_Cache(DEFAULTCACHE) +{ +} // constructor + +#endif + +/* The destructor enumerates all the node objects in the list and + in the cache deleting each in turn. We do not do any processing + on the objects that the list holds (i.e. points to) so if they + represent interfaces for example the creator of the list should + ensure that each of them is released before deleting us +*/ +CBaseList::~CBaseList() +{ + /* Delete all our list nodes */ + + RemoveAll(); + +} // destructor + +/* Remove all the nodes from the list but don't do anything + with the objects that each node looks after (this is the + responsibility of the creator). + Aa a last act we reset the signalling event + (if available) to indicate to clients that the list + does not have any entries in it. +*/ +void CBaseList::RemoveAll() +{ + /* Free up all the CNode objects NOTE we don't bother putting the + deleted nodes into the cache as this method is only really called + in serious times of change such as when we are being deleted at + which point the cache will be deleted anway */ + + CNode *pn = m_pFirst; + while (pn) { + CNode *op = pn; + pn = pn->Next(); + delete op; + } + + /* Reset the object count and the list pointers */ + + m_Count = 0; + m_pFirst = m_pLast = NULL; + +} // RemoveAll + + + +/* Return a position enumerator for the entire list. + A position enumerator is a pointer to a node object cast to a + transparent type so all we do is return the head/tail node + pointer in the list. + WARNING because the position is a pointer to a node there is + an implicit assumption for users a the list class that after + deleting an object from the list that any other position + enumerators that you have may be invalid (since the node + may be gone). +*/ +__out_opt POSITION CBaseList::GetHeadPositionI() const +{ + return (POSITION) m_pFirst; +} // GetHeadPosition + + + +__out_opt POSITION CBaseList::GetTailPositionI() const +{ + return (POSITION) m_pLast; +} // GetTailPosition + + + +/* Get the number of objects in the list, + Get the lock before accessing the count. + Locking may not be entirely necessary but it has the side effect + of making sure that all operations are complete before we get it. + So for example if a list is being added to this list then that + will have completed in full before we continue rather than seeing + an intermediate albeit valid state +*/ +int CBaseList::GetCountI() const +{ + return m_Count; +} // GetCount + + + +/* Return the object at rp, update rp to the next object from + the list or NULL if you have moved over the last object. + You may still call this function once we return NULL but + we will continue to return a NULL position value +*/ +__out void *CBaseList::GetNextI(__inout POSITION& rp) const +{ + /* have we reached the end of the list */ + + if (rp == NULL) { + return NULL; + } + + /* Lock the object before continuing */ + + void *pObject; + + /* Copy the original position then step on */ + + CNode *pn = (CNode *) rp; + ASSERT(pn != NULL); + rp = (POSITION) pn->Next(); + + /* Get the object at the original position from the list */ + + pObject = pn->GetData(); + // ASSERT(pObject != NULL); // NULL pointers in the list are allowed. + return pObject; +} //GetNext + + + +/* Return the object at p. + Asking for the object at NULL ASSERTs then returns NULL + The object is NOT locked. The list is not being changed + in any way. If another thread is busy deleting the object + then locking would only result in a change from one bad + behaviour to another. +*/ +__out_opt void *CBaseList::GetI(__in_opt POSITION p) const +{ + if (p == NULL) { + return NULL; + } + + CNode * pn = (CNode *) p; + void *pObject = pn->GetData(); + // ASSERT(pObject != NULL); // NULL pointers in the list are allowed. + return pObject; +} //Get + +__out void *CBaseList::GetValidI(__in POSITION p) const +{ + CNode * pn = (CNode *) p; + void *pObject = pn->GetData(); + // ASSERT(pObject != NULL); // NULL pointers in the list are allowed. + return pObject; +} //Get + + +/* Return the first position in the list which holds the given pointer. + Return NULL if it's not found. +*/ +__out_opt POSITION CBaseList::FindI( __in void * pObj) const +{ + POSITION pn; + INTERNALTRAVERSELIST(*this, pn){ + if (GetI(pn)==pObj) { + return pn; + } + } + return NULL; +} // Find + + + +/* Remove the first node in the list (deletes the pointer to its object + from the list, does not free the object itself). + Return the pointer to its object or NULL if empty +*/ +__out_opt void *CBaseList::RemoveHeadI() +{ + /* All we do is get the head position and ask for that to be deleted. + We could special case this since some of the code path checking + in Remove() is redundant as we know there is no previous + node for example but it seems to gain little over the + added complexity + */ + + return RemoveI((POSITION)m_pFirst); +} // RemoveHead + + + +/* Remove the last node in the list (deletes the pointer to its object + from the list, does not free the object itself). + Return the pointer to its object or NULL if empty +*/ +__out_opt void *CBaseList::RemoveTailI() +{ + /* All we do is get the tail position and ask for that to be deleted. + We could special case this since some of the code path checking + in Remove() is redundant as we know there is no previous + node for example but it seems to gain little over the + added complexity + */ + + return RemoveI((POSITION)m_pLast); +} // RemoveTail + + + +/* Remove the pointer to the object in this position from the list. + Deal with all the chain pointers + Return a pointer to the object removed from the list. + The node object that is freed as a result + of this operation is added to the node cache where + it can be used again. + Remove(NULL) is a harmless no-op - but probably is a wart. +*/ +__out_opt void *CBaseList::RemoveI(__in_opt POSITION pos) +{ + /* Lock the critical section before continuing */ + + // ASSERT (pos!=NULL); // Removing NULL is to be harmless! + if (pos==NULL) return NULL; + + + CNode *pCurrent = (CNode *) pos; + ASSERT(pCurrent != NULL); + + /* Update the previous node */ + + CNode *pNode = pCurrent->Prev(); + if (pNode == NULL) { + m_pFirst = pCurrent->Next(); + } else { + pNode->SetNext(pCurrent->Next()); + } + + /* Update the following node */ + + pNode = pCurrent->Next(); + if (pNode == NULL) { + m_pLast = pCurrent->Prev(); + } else { + pNode->SetPrev(pCurrent->Prev()); + } + + /* Get the object this node was looking after */ + + void *pObject = pCurrent->GetData(); + + // ASSERT(pObject != NULL); // NULL pointers in the list are allowed. + + /* Try and add the node object to the cache - + a NULL return code from the cache means we ran out of room. + The cache size is fixed by a constructor argument when the + list is created and defaults to DEFAULTCACHE. + This means that the cache will have room for this many + node objects. So if you have a list of media samples + and you know there will never be more than five active at + any given time of them for example then override the default + constructor + */ + + m_Cache.AddToCache(pCurrent); + + /* If the list is empty then reset the list event */ + + --m_Count; + ASSERT(m_Count >= 0); + return pObject; +} // Remove + + + +/* Add this object to the tail end of our list + Return the new tail position. +*/ + +__out_opt POSITION CBaseList::AddTailI(__in void *pObject) +{ + /* Lock the critical section before continuing */ + + CNode *pNode; + // ASSERT(pObject); // NULL pointers in the list are allowed. + + /* If there is a node objects in the cache then use + that otherwise we will have to create a new one */ + + pNode = (CNode *) m_Cache.RemoveFromCache(); + if (pNode == NULL) { + pNode = new CNode; + } + + /* Check we have a valid object */ + + if (pNode == NULL) { + return NULL; + } + + /* Initialise all the CNode object + just in case it came from the cache + */ + + pNode->SetData(pObject); + pNode->SetNext(NULL); + pNode->SetPrev(m_pLast); + + if (m_pLast == NULL) { + m_pFirst = pNode; + } else { + m_pLast->SetNext(pNode); + } + + /* Set the new last node pointer and also increment the number + of list entries, the critical section is unlocked when we + exit the function + */ + + m_pLast = pNode; + ++m_Count; + + return (POSITION) pNode; +} // AddTail(object) + + + +/* Add this object to the head end of our list + Return the new head position. +*/ +__out_opt POSITION CBaseList::AddHeadI(__in void *pObject) +{ + CNode *pNode; + // ASSERT(pObject); // NULL pointers in the list are allowed. + + /* If there is a node objects in the cache then use + that otherwise we will have to create a new one */ + + pNode = (CNode *) m_Cache.RemoveFromCache(); + if (pNode == NULL) { + pNode = new CNode; + } + + /* Check we have a valid object */ + + if (pNode == NULL) { + return NULL; + } + + /* Initialise all the CNode object + just in case it came from the cache + */ + + pNode->SetData(pObject); + + /* chain it in (set four pointers) */ + pNode->SetPrev(NULL); + pNode->SetNext(m_pFirst); + + if (m_pFirst == NULL) { + m_pLast = pNode; + } else { + m_pFirst->SetPrev(pNode); + } + m_pFirst = pNode; + + ++m_Count; + + return (POSITION) pNode; +} // AddHead(object) + + + +/* Add all the elements in *pList to the tail of this list. + Return TRUE if it all worked, FALSE if it didn't. + If it fails some elements may have been added. +*/ +BOOL CBaseList::AddTail(__in CBaseList *pList) +{ + /* lock the object before starting then enumerate + each entry in the source list and add them one by one to + our list (while still holding the object lock) + Lock the other list too. + */ + POSITION pos = pList->GetHeadPositionI(); + + while (pos) { + if (NULL == AddTailI(pList->GetNextI(pos))) { + return FALSE; + } + } + return TRUE; +} // AddTail(list) + + + +/* Add all the elements in *pList to the head of this list. + Return TRUE if it all worked, FALSE if it didn't. + If it fails some elements may have been added. +*/ +BOOL CBaseList::AddHead(__in CBaseList *pList) +{ + /* lock the object before starting then enumerate + each entry in the source list and add them one by one to + our list (while still holding the object lock) + Lock the other list too. + + To avoid reversing the list, traverse it backwards. + */ + + POSITION pos; + + INTERNALREVERSETRAVERSELIST(*pList, pos) { + if (NULL== AddHeadI(pList->GetValidI(pos))){ + return FALSE; + } + } + return TRUE; +} // AddHead(list) + + + +/* Add the object after position p + p is still valid after the operation. + AddAfter(NULL,x) adds x to the start - same as AddHead + Return the position of the new object, NULL if it failed +*/ +__out_opt POSITION CBaseList::AddAfterI(__in_opt POSITION pos, __in void * pObj) +{ + if (pos==NULL) + return AddHeadI(pObj); + + /* As someone else might be furkling with the list - + Lock the critical section before continuing + */ + CNode *pAfter = (CNode *) pos; + ASSERT(pAfter != NULL); + if (pAfter==m_pLast) + return AddTailI(pObj); + + /* set pnode to point to a new node, preferably from the cache */ + + CNode *pNode = (CNode *) m_Cache.RemoveFromCache(); + if (pNode == NULL) { + pNode = new CNode; + } + + /* Check we have a valid object */ + + if (pNode == NULL) { + return NULL; + } + + /* Initialise all the CNode object + just in case it came from the cache + */ + + pNode->SetData(pObj); + + /* It is to be added to the middle of the list - there is a before + and after node. Chain it after pAfter, before pBefore. + */ + CNode * pBefore = pAfter->Next(); + ASSERT(pBefore != NULL); + + /* chain it in (set four pointers) */ + pNode->SetPrev(pAfter); + pNode->SetNext(pBefore); + pBefore->SetPrev(pNode); + pAfter->SetNext(pNode); + + ++m_Count; + + return (POSITION) pNode; + +} // AddAfter(object) + + + +BOOL CBaseList::AddAfter(__in_opt POSITION p, __in CBaseList *pList) +{ + POSITION pos; + INTERNALTRAVERSELIST(*pList, pos) { + /* p follows along the elements being added */ + p = AddAfterI(p, pList->GetValidI(pos)); + if (p==NULL) return FALSE; + } + return TRUE; +} // AddAfter(list) + + + +/* Mirror images: + Add the element or list after position p. + p is still valid after the operation. + AddBefore(NULL,x) adds x to the end - same as AddTail +*/ +__out_opt POSITION CBaseList::AddBeforeI(__in_opt POSITION pos, __in void * pObj) +{ + if (pos==NULL) + return AddTailI(pObj); + + /* set pnode to point to a new node, preferably from the cache */ + + CNode *pBefore = (CNode *) pos; + ASSERT(pBefore != NULL); + if (pBefore==m_pFirst) + return AddHeadI(pObj); + + CNode * pNode = (CNode *) m_Cache.RemoveFromCache(); + if (pNode == NULL) { + pNode = new CNode; + } + + /* Check we have a valid object */ + + if (pNode == NULL) { + return NULL; + } + + /* Initialise all the CNode object + just in case it came from the cache + */ + + pNode->SetData(pObj); + + /* It is to be added to the middle of the list - there is a before + and after node. Chain it after pAfter, before pBefore. + */ + + CNode * pAfter = pBefore->Prev(); + ASSERT(pAfter != NULL); + + /* chain it in (set four pointers) */ + pNode->SetPrev(pAfter); + pNode->SetNext(pBefore); + pBefore->SetPrev(pNode); + pAfter->SetNext(pNode); + + ++m_Count; + + return (POSITION) pNode; + +} // Addbefore(object) + + + +BOOL CBaseList::AddBefore(__in_opt POSITION p, __in CBaseList *pList) +{ + POSITION pos; + INTERNALREVERSETRAVERSELIST(*pList, pos) { + /* p follows along the elements being added */ + p = AddBeforeI(p, pList->GetValidI(pos)); + if (p==NULL) return FALSE; + } + return TRUE; +} // AddBefore(list) + + + +/* Split *this after position p in *this + Retain as *this the tail portion of the original *this + Add the head portion to the tail end of *pList + Return TRUE if it all worked, FALSE if it didn't. + + e.g. + foo->MoveToTail(foo->GetHeadPosition(), bar); + moves one element from the head of foo to the tail of bar + foo->MoveToTail(NULL, bar); + is a no-op + foo->MoveToTail(foo->GetTailPosition, bar); + concatenates foo onto the end of bar and empties foo. + + A better, except excessively long name might be + MoveElementsFromHeadThroughPositionToOtherTail +*/ +BOOL CBaseList::MoveToTail + (__in_opt POSITION pos, __in CBaseList *pList) +{ + /* Algorithm: + Note that the elements (including their order) in the concatenation + of *pList to the head of *this is invariant. + 1. Count elements to be moved + 2. Join *pList onto the head of this to make one long chain + 3. Set first/Last pointers in *this and *pList + 4. Break the chain at the new place + 5. Adjust counts + 6. Set/Reset any events + */ + + if (pos==NULL) return TRUE; // no-op. Eliminates special cases later. + + + /* Make cMove the number of nodes to move */ + CNode * p = (CNode *)pos; + int cMove = 0; // number of nodes to move + while(p!=NULL) { + p = p->Prev(); + ++cMove; + } + + + /* Join the two chains together */ + if (pList->m_pLast!=NULL) + pList->m_pLast->SetNext(m_pFirst); + if (m_pFirst!=NULL) + m_pFirst->SetPrev(pList->m_pLast); + + + /* set first and last pointers */ + p = (CNode *)pos; + + if (pList->m_pFirst==NULL) + pList->m_pFirst = m_pFirst; + m_pFirst = p->Next(); + if (m_pFirst==NULL) + m_pLast = NULL; + pList->m_pLast = p; + + + /* Break the chain after p to create the new pieces */ + if (m_pFirst!=NULL) + m_pFirst->SetPrev(NULL); + p->SetNext(NULL); + + + /* Adjust the counts */ + m_Count -= cMove; + pList->m_Count += cMove; + + return TRUE; + +} // MoveToTail + + + +/* Mirror image of MoveToTail: + Split *this before position p in *this. + Retain in *this the head portion of the original *this + Add the tail portion to the start (i.e. head) of *pList + Return TRUE if it all worked, FALSE if it didn't. + + e.g. + foo->MoveToHead(foo->GetTailPosition(), bar); + moves one element from the tail of foo to the head of bar + foo->MoveToHead(NULL, bar); + is a no-op + foo->MoveToHead(foo->GetHeadPosition, bar); + concatenates foo onto the start of bar and empties foo. +*/ +BOOL CBaseList::MoveToHead + (__in_opt POSITION pos, __in CBaseList *pList) +{ + + /* See the comments on the algorithm in MoveToTail */ + + if (pos==NULL) return TRUE; // no-op. Eliminates special cases later. + + /* Make cMove the number of nodes to move */ + CNode * p = (CNode *)pos; + int cMove = 0; // number of nodes to move + while(p!=NULL) { + p = p->Next(); + ++cMove; + } + + + /* Join the two chains together */ + if (pList->m_pFirst!=NULL) + pList->m_pFirst->SetPrev(m_pLast); + if (m_pLast!=NULL) + m_pLast->SetNext(pList->m_pFirst); + + + /* set first and last pointers */ + p = (CNode *)pos; + + + if (pList->m_pLast==NULL) + pList->m_pLast = m_pLast; + + m_pLast = p->Prev(); + if (m_pLast==NULL) + m_pFirst = NULL; + pList->m_pFirst = p; + + + /* Break the chain after p to create the new pieces */ + if (m_pLast!=NULL) + m_pLast->SetNext(NULL); + p->SetPrev(NULL); + + + /* Adjust the counts */ + m_Count -= cMove; + pList->m_Count += cMove; + + return TRUE; + +} // MoveToHead + + + +/* Reverse the order of the pointers to objects in *this +*/ +void CBaseList::Reverse() +{ + /* algorithm: + The obvious booby trap is that you flip pointers around and lose + addressability to the node that you are going to process next. + The easy way to avoid this is do do one chain at a time. + + Run along the forward chain, + For each node, set the reverse pointer to the one ahead of us. + The reverse chain is now a copy of the old forward chain, including + the NULL termination. + + Run along the reverse chain (i.e. old forward chain again) + For each node set the forward pointer of the node ahead to point back + to the one we're standing on. + The first node needs special treatment, + it's new forward pointer is NULL. + Finally set the First/Last pointers + + */ + CNode * p; + + // Yes we COULD use a traverse, but it would look funny! + p = m_pFirst; + while (p!=NULL) { + CNode * q; + q = p->Next(); + p->SetNext(p->Prev()); + p->SetPrev(q); + p = q; + } + + p = m_pFirst; + m_pFirst = m_pLast; + m_pLast = p; + + +#if 0 // old version + + if (m_pFirst==NULL) return; // empty list + if (m_pFirst->Next()==NULL) return; // single node list + + + /* run along forward chain */ + for ( p = m_pFirst + ; p!=NULL + ; p = p->Next() + ){ + p->SetPrev(p->Next()); + } + + + /* special case first element */ + m_pFirst->SetNext(NULL); // fix the old first element + + + /* run along new reverse chain i.e. old forward chain again */ + for ( p = m_pFirst // start at the old first element + ; p->Prev()!=NULL // while there's a node still to be set + ; p = p->Prev() // work in the same direction as before + ){ + p->Prev()->SetNext(p); + } + + + /* fix forward and reverse pointers + - the triple XOR swap would work but all the casts look hideous */ + p = m_pFirst; + m_pFirst = m_pLast; + m_pLast = p; +#endif + +} // Reverse
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/wxlist.h
Added
@@ -0,0 +1,553 @@ +//------------------------------------------------------------------------------ +// File: WXList.h +// +// Desc: DirectShow base classes - defines a non-MFC generic template list +// class. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +/* A generic list of pointers to objects. + No storage management or copying is done on the objects pointed to. + Objectives: avoid using MFC libraries in ndm kernel mode and + provide a really useful list type. + + The class is thread safe in that separate threads may add and + delete items in the list concurrently although the application + must ensure that constructor and destructor access is suitably + synchronised. An application can cause deadlock with operations + which use two lists by simultaneously calling + list1->Operation(list2) and list2->Operation(list1). So don't! + + The names must not conflict with MFC classes as an application + may use both. + */ + +#ifndef __WXLIST__ +#define __WXLIST__ + + /* A POSITION represents (in some fashion that's opaque) a cursor + on the list that can be set to identify any element. NULL is + a valid value and several operations regard NULL as the position + "one step off the end of the list". (In an n element list there + are n+1 places to insert and NULL is that "n+1-th" value). + The POSITION of an element in the list is only invalidated if + that element is deleted. Move operations may mean that what + was a valid POSITION in one list is now a valid POSITION in + a different list. + + Some operations which at first sight are illegal are allowed as + harmless no-ops. For instance RemoveHead is legal on an empty + list and it returns NULL. This allows an atomic way to test if + there is an element there, and if so, get it. The two operations + AddTail and RemoveHead thus implement a MONITOR (See Hoare's paper). + + Single element operations return POSITIONs, non-NULL means it worked. + whole list operations return a BOOL. TRUE means it all worked. + + This definition is the same as the POSITION type for MFCs, so we must + avoid defining it twice. + */ +#ifndef __AFX_H__ +struct __POSITION { int unused; }; +typedef __POSITION* POSITION; +#endif + +const int DEFAULTCACHE = 10; /* Default node object cache size */ + +/* A class representing one node in a list. + Each node knows a pointer to it's adjacent nodes and also a pointer + to the object that it looks after. + All of these pointers can be retrieved or set through member functions. +*/ +class CBaseList +#ifdef DEBUG + : public CBaseObject +#endif +{ + /* Making these classes inherit from CBaseObject does nothing + functionally but it allows us to check there are no memory + leaks in debug builds. + */ + +public: + +#ifdef DEBUG + class CNode : public CBaseObject { +#else + class CNode { +#endif + + CNode *m_pPrev; /* Previous node in the list */ + CNode *m_pNext; /* Next node in the list */ + void *m_pObject; /* Pointer to the object */ + + public: + + /* Constructor - initialise the object's pointers */ + CNode() +#ifdef DEBUG + : CBaseObject(NAME("List node")) +#endif + { + }; + + + /* Return the previous node before this one */ + __out CNode *Prev() const { return m_pPrev; }; + + + /* Return the next node after this one */ + __out CNode *Next() const { return m_pNext; }; + + + /* Set the previous node before this one */ + void SetPrev(__in_opt CNode *p) { m_pPrev = p; }; + + + /* Set the next node after this one */ + void SetNext(__in_opt CNode *p) { m_pNext = p; }; + + + /* Get the pointer to the object for this node */ + __out void *GetData() const { return m_pObject; }; + + + /* Set the pointer to the object for this node */ + void SetData(__in void *p) { m_pObject = p; }; + }; + + class CNodeCache + { + public: + CNodeCache(INT iCacheSize) : m_iCacheSize(iCacheSize), + m_pHead(NULL), + m_iUsed(0) + {}; + ~CNodeCache() { + CNode *pNode = m_pHead; + while (pNode) { + CNode *pCurrent = pNode; + pNode = pNode->Next(); + delete pCurrent; + } + }; + void AddToCache(__inout CNode *pNode) + { + if (m_iUsed < m_iCacheSize) { + pNode->SetNext(m_pHead); + m_pHead = pNode; + m_iUsed++; + } else { + delete pNode; + } + }; + CNode *RemoveFromCache() + { + CNode *pNode = m_pHead; + if (pNode != NULL) { + m_pHead = pNode->Next(); + m_iUsed--; + ASSERT(m_iUsed >= 0); + } else { + ASSERT(m_iUsed == 0); + } + return pNode; + }; + private: + INT m_iCacheSize; + INT m_iUsed; + CNode *m_pHead; + }; + +protected: + + CNode* m_pFirst; /* Pointer to first node in the list */ + CNode* m_pLast; /* Pointer to the last node in the list */ + LONG m_Count; /* Number of nodes currently in the list */ + +private: + + CNodeCache m_Cache; /* Cache of unused node pointers */ + +private: + + /* These override the default copy constructor and assignment + operator for all list classes. They are in the private class + declaration section so that anybody trying to pass a list + object by value will generate a compile time error of + "cannot access the private member function". If these were + not here then the compiler will create default constructors + and assignment operators which when executed first take a + copy of all member variables and then during destruction + delete them all. This must not be done for any heap + allocated data. + */ + CBaseList(const CBaseList &refList); + CBaseList &operator=(const CBaseList &refList); + +public: + + CBaseList(__in_opt LPCTSTR pName, + INT iItems); + + CBaseList(__in_opt LPCTSTR pName); +#ifdef UNICODE + CBaseList(__in_opt LPCSTR pName, + INT iItems); + + CBaseList(__in_opt LPCSTR pName); +#endif + ~CBaseList(); + + /* Remove all the nodes from *this i.e. make the list empty */ + void RemoveAll(); + + + /* Return a cursor which identifies the first element of *this */ + __out_opt POSITION GetHeadPositionI() const; + + + /* Return a cursor which identifies the last element of *this */ + __out_opt POSITION GetTailPositionI() const; + + + /* Return the number of objects in *this */ + int GetCountI() const; + +protected: + /* Return the pointer to the object at rp, + Update rp to the next node in *this + but make it NULL if it was at the end of *this. + This is a wart retained for backwards compatibility. + GetPrev is not implemented. + Use Next, Prev and Get separately. + */ + __out void *GetNextI(__inout POSITION& rp) const; + + + /* Return a pointer to the object at p + Asking for the object at NULL will return NULL harmlessly. + */ + __out_opt void *GetI(__in_opt POSITION p) const; + __out void *GetValidI(__in POSITION p) const; + +public: + /* return the next / prev position in *this + return NULL when going past the end/start. + Next(NULL) is same as GetHeadPosition() + Prev(NULL) is same as GetTailPosition() + An n element list therefore behaves like a n+1 element + cycle with NULL at the start/end. + + !!WARNING!! - This handling of NULL is DIFFERENT from GetNext. + + Some reasons are: + 1. For a list of n items there are n+1 positions to insert + These are conveniently encoded as the n POSITIONs and NULL. + 2. If you are keeping a list sorted (fairly common) and you + search forward for an element to insert before and don't + find it you finish up with NULL as the element before which + to insert. You then want that NULL to be a valid POSITION + so that you can insert before it and you want that insertion + point to mean the (n+1)-th one that doesn't have a POSITION. + (symmetrically if you are working backwards through the list). + 3. It simplifies the algebra which the methods generate. + e.g. AddBefore(p,x) is identical to AddAfter(Prev(p),x) + in ALL cases. All the other arguments probably are reflections + of the algebraic point. + */ + __out_opt POSITION Next(__in_opt POSITION pos) const + { + if (pos == NULL) { + return (POSITION) m_pFirst; + } + CNode *pn = (CNode *) pos; + return (POSITION) pn->Next(); + } //Next + + // See Next + __out_opt POSITION Prev(__in_opt POSITION pos) const + { + if (pos == NULL) { + return (POSITION) m_pLast; + } + CNode *pn = (CNode *) pos; + return (POSITION) pn->Prev(); + } //Prev + + + /* Return the first position in *this which holds the given + pointer. Return NULL if the pointer was not not found. + */ +protected: + __out_opt POSITION FindI( __in void * pObj) const; + + // ??? Should there be (or even should there be only) + // ??? POSITION FindNextAfter(void * pObj, POSITION p) + // ??? And of course FindPrevBefore too. + // ??? List.Find(&Obj) then becomes List.FindNextAfter(&Obj, NULL) + + + /* Remove the first node in *this (deletes the pointer to its + object from the list, does not free the object itself). + Return the pointer to its object. + If *this was already empty it will harmlessly return NULL. + */ + __out_opt void *RemoveHeadI(); + + + /* Remove the last node in *this (deletes the pointer to its + object from the list, does not free the object itself). + Return the pointer to its object. + If *this was already empty it will harmlessly return NULL. + */ + __out_opt void *RemoveTailI(); + + + /* Remove the node identified by p from the list (deletes the pointer + to its object from the list, does not free the object itself). + Asking to Remove the object at NULL will harmlessly return NULL. + Return the pointer to the object removed. + */ + __out_opt void *RemoveI(__in_opt POSITION p); + + /* Add single object *pObj to become a new last element of the list. + Return the new tail position, NULL if it fails. + If you are adding a COM objects, you might want AddRef it first. + Other existing POSITIONs in *this are still valid + */ + __out_opt POSITION AddTailI(__in void * pObj); +public: + + + /* Add all the elements in *pList to the tail of *this. + This duplicates all the nodes in *pList (i.e. duplicates + all its pointers to objects). It does not duplicate the objects. + If you are adding a list of pointers to a COM object into the list + it's a good idea to AddRef them all it when you AddTail it. + Return TRUE if it all worked, FALSE if it didn't. + If it fails some elements may have been added. + Existing POSITIONs in *this are still valid + + If you actually want to MOVE the elements, use MoveToTail instead. + */ + BOOL AddTail(__in CBaseList *pList); + + + /* Mirror images of AddHead: */ + + /* Add single object to become a new first element of the list. + Return the new head position, NULL if it fails. + Existing POSITIONs in *this are still valid + */ +protected: + __out_opt POSITION AddHeadI(__in void * pObj); +public: + + /* Add all the elements in *pList to the head of *this. + Same warnings apply as for AddTail. + Return TRUE if it all worked, FALSE if it didn't. + If it fails some of the objects may have been added. + + If you actually want to MOVE the elements, use MoveToHead instead. + */ + BOOL AddHead(__in CBaseList *pList); + + + /* Add the object *pObj to *this after position p in *this. + AddAfter(NULL,x) adds x to the start - equivalent to AddHead + Return the position of the object added, NULL if it failed. + Existing POSITIONs in *this are undisturbed, including p. + */ +protected: + __out_opt POSITION AddAfterI(__in_opt POSITION p, __in void * pObj); +public: + + /* Add the list *pList to *this after position p in *this + AddAfter(NULL,x) adds x to the start - equivalent to AddHead + Return TRUE if it all worked, FALSE if it didn't. + If it fails, some of the objects may be added + Existing POSITIONs in *this are undisturbed, including p. + */ + BOOL AddAfter(__in_opt POSITION p, __in CBaseList *pList); + + + /* Mirror images: + Add the object *pObj to this-List after position p in *this. + AddBefore(NULL,x) adds x to the end - equivalent to AddTail + Return the position of the new object, NULL if it fails + Existing POSITIONs in *this are undisturbed, including p. + */ + protected: + __out_opt POSITION AddBeforeI(__in_opt POSITION p, __in void * pObj); + public: + + /* Add the list *pList to *this before position p in *this + AddAfter(NULL,x) adds x to the start - equivalent to AddHead + Return TRUE if it all worked, FALSE if it didn't. + If it fails, some of the objects may be added + Existing POSITIONs in *this are undisturbed, including p. + */ + BOOL AddBefore(__in_opt POSITION p, __in CBaseList *pList); + + + /* Note that AddAfter(p,x) is equivalent to AddBefore(Next(p),x) + even in cases where p is NULL or Next(p) is NULL. + Similarly for mirror images etc. + This may make it easier to argue about programs. + */ + + + + /* The following operations do not copy any elements. + They move existing blocks of elements around by switching pointers. + They are fairly efficient for long lists as for short lists. + (Alas, the Count slows things down). + + They split the list into two parts. + One part remains as the original list, the other part + is appended to the second list. There are eight possible + variations: + Split the list {after/before} a given element + keep the {head/tail} portion in the original list + append the rest to the {head/tail} of the new list. + + Since After is strictly equivalent to Before Next + we are not in serious need of the Before/After variants. + That leaves only four. + + If you are processing a list left to right and dumping + the bits that you have processed into another list as + you go, the Tail/Tail variant gives the most natural result. + If you are processing in reverse order, Head/Head is best. + + By using NULL positions and empty lists judiciously either + of the other two can be built up in two operations. + + The definition of NULL (see Next/Prev etc) means that + degenerate cases include + "move all elements to new list" + "Split a list into two lists" + "Concatenate two lists" + (and quite a few no-ops) + + !!WARNING!! The type checking won't buy you much if you get list + positions muddled up - e.g. use a POSITION that's in a different + list and see what a mess you get! + */ + + /* Split *this after position p in *this + Retain as *this the tail portion of the original *this + Add the head portion to the tail end of *pList + Return TRUE if it all worked, FALSE if it didn't. + + e.g. + foo->MoveToTail(foo->GetHeadPosition(), bar); + moves one element from the head of foo to the tail of bar + foo->MoveToTail(NULL, bar); + is a no-op, returns NULL + foo->MoveToTail(foo->GetTailPosition, bar); + concatenates foo onto the end of bar and empties foo. + + A better, except excessively long name might be + MoveElementsFromHeadThroughPositionToOtherTail + */ + BOOL MoveToTail(__in_opt POSITION pos, __in CBaseList *pList); + + + /* Mirror image: + Split *this before position p in *this. + Retain in *this the head portion of the original *this + Add the tail portion to the start (i.e. head) of *pList + + e.g. + foo->MoveToHead(foo->GetTailPosition(), bar); + moves one element from the tail of foo to the head of bar + foo->MoveToHead(NULL, bar); + is a no-op, returns NULL + foo->MoveToHead(foo->GetHeadPosition, bar); + concatenates foo onto the start of bar and empties foo. + */ + BOOL MoveToHead(__in_opt POSITION pos, __in CBaseList *pList); + + + /* Reverse the order of the pointers to objects in *this + */ + void Reverse(); + + + /* set cursor to the position of each element of list in turn */ + #define TRAVERSELIST(list, cursor) \ + for ( cursor = (list).GetHeadPosition() \ + ; cursor!=NULL \ + ; cursor = (list).Next(cursor) \ + ) + + + /* set cursor to the position of each element of list in turn + in reverse order + */ + #define REVERSETRAVERSELIST(list, cursor) \ + for ( cursor = (list).GetTailPosition() \ + ; cursor!=NULL \ + ; cursor = (list).Prev(cursor) \ + ) + +}; // end of class declaration + +template<class OBJECT> class CGenericList : public CBaseList +{ +public: + CGenericList(__in_opt LPCTSTR pName, + INT iItems, + BOOL bLock = TRUE, + BOOL bAlert = FALSE) : + CBaseList(pName, iItems) { + UNREFERENCED_PARAMETER(bAlert); + UNREFERENCED_PARAMETER(bLock); + }; + CGenericList(__in_opt LPCTSTR pName) : + CBaseList(pName) { + }; + + __out_opt POSITION GetHeadPosition() const { return (POSITION)m_pFirst; } + __out_opt POSITION GetTailPosition() const { return (POSITION)m_pLast; } + int GetCount() const { return m_Count; } + + __out OBJECT *GetNext(__inout POSITION& rp) const { return (OBJECT *) GetNextI(rp); } + + __out_opt OBJECT *Get(__in_opt POSITION p) const { return (OBJECT *) GetI(p); } + __out OBJECT *GetValid(__in POSITION p) const { return (OBJECT *) GetValidI(p); } + __out_opt OBJECT *GetHead() const { return Get(GetHeadPosition()); } + + __out_opt OBJECT *RemoveHead() { return (OBJECT *) RemoveHeadI(); } + + __out_opt OBJECT *RemoveTail() { return (OBJECT *) RemoveTailI(); } + + __out_opt OBJECT *Remove(__in_opt POSITION p) { return (OBJECT *) RemoveI(p); } + __out_opt POSITION AddBefore(__in_opt POSITION p, __in OBJECT * pObj) { return AddBeforeI(p, pObj); } + __out_opt POSITION AddAfter(__in_opt POSITION p, __in OBJECT * pObj) { return AddAfterI(p, pObj); } + __out_opt POSITION AddHead(__in OBJECT * pObj) { return AddHeadI(pObj); } + __out_opt POSITION AddTail(__in OBJECT * pObj) { return AddTailI(pObj); } + BOOL AddTail(__in CGenericList<OBJECT> *pList) + { return CBaseList::AddTail((CBaseList *) pList); } + BOOL AddHead(__in CGenericList<OBJECT> *pList) + { return CBaseList::AddHead((CBaseList *) pList); } + BOOL AddAfter(__in_opt POSITION p, __in CGenericList<OBJECT> *pList) + { return CBaseList::AddAfter(p, (CBaseList *) pList); }; + BOOL AddBefore(__in_opt POSITION p, __in CGenericList<OBJECT> *pList) + { return CBaseList::AddBefore(p, (CBaseList *) pList); }; + __out_opt POSITION Find( __in OBJECT * pObj) const { return FindI(pObj); } +}; // end of class declaration + + + +/* These define the standard list types */ + +typedef CGenericList<CBaseObject> CBaseObjectList; +typedef CGenericList<IUnknown> CBaseInterfaceList; + +#endif /* __WXLIST__ */ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/wxutil.cpp
Added
@@ -0,0 +1,769 @@ +//------------------------------------------------------------------------------ +// File: WXUtil.cpp +// +// Desc: DirectShow base classes - implements helper classes for building +// multimedia filters. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#include <streams.h> +#define STRSAFE_NO_DEPRECATE +#include <strsafe.h> + + +// --- CAMEvent ----------------------- +CAMEvent::CAMEvent(BOOL fManualReset, __inout_opt HRESULT *phr) +{ + m_hEvent = CreateEvent(NULL, fManualReset, FALSE, NULL); + if (NULL == m_hEvent) { + if (NULL != phr && SUCCEEDED(*phr)) { + *phr = E_OUTOFMEMORY; + } + } +} + +CAMEvent::CAMEvent(__inout_opt HRESULT *phr) +{ + m_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + if (NULL == m_hEvent) { + if (NULL != phr && SUCCEEDED(*phr)) { + *phr = E_OUTOFMEMORY; + } + } +} + +CAMEvent::~CAMEvent() +{ + if (m_hEvent) { + EXECUTE_ASSERT(CloseHandle(m_hEvent)); + } +} + + +// --- CAMMsgEvent ----------------------- +// One routine. The rest is handled in CAMEvent + +CAMMsgEvent::CAMMsgEvent(__inout_opt HRESULT *phr) : CAMEvent(FALSE, phr) +{ +} + +BOOL CAMMsgEvent::WaitMsg(DWORD dwTimeout) +{ + // wait for the event to be signalled, or for the + // timeout (in MS) to expire. allow SENT messages + // to be processed while we wait + DWORD dwWait; + DWORD dwStartTime; + + // set the waiting period. + DWORD dwWaitTime = dwTimeout; + + // the timeout will eventually run down as we iterate + // processing messages. grab the start time so that + // we can calculate elapsed times. + if (dwWaitTime != INFINITE) { + dwStartTime = timeGetTime(); + } + + do { + dwWait = MsgWaitForMultipleObjects(1,&m_hEvent,FALSE, dwWaitTime, QS_SENDMESSAGE); + if (dwWait == WAIT_OBJECT_0 + 1) { + MSG Message; + PeekMessage(&Message,NULL,0,0,PM_NOREMOVE); + + // If we have an explicit length of time to wait calculate + // the next wake up point - which might be now. + // If dwTimeout is INFINITE, it stays INFINITE + if (dwWaitTime != INFINITE) { + + DWORD dwElapsed = timeGetTime()-dwStartTime; + + dwWaitTime = + (dwElapsed >= dwTimeout) + ? 0 // wake up with WAIT_TIMEOUT + : dwTimeout-dwElapsed; + } + } + } while (dwWait == WAIT_OBJECT_0 + 1); + + // return TRUE if we woke on the event handle, + // FALSE if we timed out. + return (dwWait == WAIT_OBJECT_0); +} + +// --- CAMThread ---------------------- + + +CAMThread::CAMThread(__inout_opt HRESULT *phr) + : m_EventSend(TRUE, phr), // must be manual-reset for CheckRequest() + m_EventComplete(FALSE, phr) +{ + m_hThread = NULL; +} + +CAMThread::~CAMThread() { + Close(); +} + + +// when the thread starts, it calls this function. We unwrap the 'this' +//pointer and call ThreadProc. +DWORD WINAPI +CAMThread::InitialThreadProc(__inout LPVOID pv) +{ + HRESULT hrCoInit = CAMThread::CoInitializeHelper(); + if(FAILED(hrCoInit)) { + DbgLog((LOG_ERROR, 1, TEXT("CoInitializeEx failed."))); + } + + CAMThread * pThread = (CAMThread *) pv; + + HRESULT hr = pThread->ThreadProc(); + + if(SUCCEEDED(hrCoInit)) { + CoUninitialize(); + } + + return hr; +} + +BOOL +CAMThread::Create() +{ + DWORD threadid; + + CAutoLock lock(&m_AccessLock); + + if (ThreadExists()) { + return FALSE; + } + + m_hThread = CreateThread( + NULL, + 0, + CAMThread::InitialThreadProc, + this, + 0, + &threadid); + + if (!m_hThread) { + return FALSE; + } + + return TRUE; +} + +DWORD +CAMThread::CallWorker(DWORD dwParam) +{ + // lock access to the worker thread for scope of this object + CAutoLock lock(&m_AccessLock); + + if (!ThreadExists()) { + return (DWORD) E_FAIL; + } + + // set the parameter + m_dwParam = dwParam; + + // signal the worker thread + m_EventSend.Set(); + + // wait for the completion to be signalled + m_EventComplete.Wait(); + + // done - this is the thread's return value + return m_dwReturnVal; +} + +// Wait for a request from the client +DWORD +CAMThread::GetRequest() +{ + m_EventSend.Wait(); + return m_dwParam; +} + +// is there a request? +BOOL +CAMThread::CheckRequest(__out_opt DWORD * pParam) +{ + if (!m_EventSend.Check()) { + return FALSE; + } else { + if (pParam) { + *pParam = m_dwParam; + } + return TRUE; + } +} + +// reply to the request +void +CAMThread::Reply(DWORD dw) +{ + m_dwReturnVal = dw; + + // The request is now complete so CheckRequest should fail from + // now on + // + // This event should be reset BEFORE we signal the client or + // the client may Set it before we reset it and we'll then + // reset it (!) + + m_EventSend.Reset(); + + // Tell the client we're finished + + m_EventComplete.Set(); +} + +HRESULT CAMThread::CoInitializeHelper() +{ + // call CoInitializeEx and tell OLE not to create a window (this + // thread probably won't dispatch messages and will hang on + // broadcast msgs o/w). + // + // If CoInitEx is not available, threads that don't call CoCreate + // aren't affected. Threads that do will have to handle the + // failure. Perhaps we should fall back to CoInitialize and risk + // hanging? + // + + // older versions of ole32.dll don't have CoInitializeEx + + HRESULT hr = E_FAIL; + HINSTANCE hOle = GetModuleHandle(TEXT("ole32.dll")); + if(hOle) + { + typedef HRESULT (STDAPICALLTYPE *PCoInitializeEx)( + LPVOID pvReserved, DWORD dwCoInit); + PCoInitializeEx pCoInitializeEx = + (PCoInitializeEx)(GetProcAddress(hOle, "CoInitializeEx")); + if(pCoInitializeEx) + { + hr = (*pCoInitializeEx)(0, COINIT_DISABLE_OLE1DDE ); + } + } + else + { + // caller must load ole32.dll + DbgBreak("couldn't locate ole32.dll"); + } + + return hr; +} + + +// destructor for CMsgThread - cleans up any messages left in the +// queue when the thread exited +CMsgThread::~CMsgThread() +{ + if (m_hThread != NULL) { + WaitForSingleObject(m_hThread, INFINITE); + EXECUTE_ASSERT(CloseHandle(m_hThread)); + } + + POSITION pos = m_ThreadQueue.GetHeadPosition(); + while (pos) { + CMsg * pMsg = m_ThreadQueue.GetNext(pos); + delete pMsg; + } + m_ThreadQueue.RemoveAll(); + + if (m_hSem != NULL) { + EXECUTE_ASSERT(CloseHandle(m_hSem)); + } +} + +BOOL +CMsgThread::CreateThread( + ) +{ + m_hSem = CreateSemaphore(NULL, 0, 0x7FFFFFFF, NULL); + if (m_hSem == NULL) { + return FALSE; + } + + m_hThread = ::CreateThread(NULL, 0, DefaultThreadProc, + (LPVOID)this, 0, &m_ThreadId); + return m_hThread != NULL; +} + + +// This is the threads message pump. Here we get and dispatch messages to +// clients thread proc until the client refuses to process a message. +// The client returns a non-zero value to stop the message pump, this +// value becomes the threads exit code. + +DWORD WINAPI +CMsgThread::DefaultThreadProc( + __inout LPVOID lpParam + ) +{ + CMsgThread *lpThis = (CMsgThread *)lpParam; + CMsg msg; + LRESULT lResult; + + // !!! + CoInitialize(NULL); + + // allow a derived class to handle thread startup + lpThis->OnThreadInit(); + + do { + lpThis->GetThreadMsg(&msg); + lResult = lpThis->ThreadMessageProc(msg.uMsg,msg.dwFlags, + msg.lpParam, msg.pEvent); + } while (lResult == 0L); + + // !!! + CoUninitialize(); + + return (DWORD)lResult; +} + + +// Block until the next message is placed on the list m_ThreadQueue. +// copies the message to the message pointed to by *pmsg +void +CMsgThread::GetThreadMsg(__out CMsg *msg) +{ + CMsg * pmsg = NULL; + + // keep trying until a message appears + while (TRUE) { + { + CAutoLock lck(&m_Lock); + pmsg = m_ThreadQueue.RemoveHead(); + if (pmsg == NULL) { + m_lWaiting++; + } else { + break; + } + } + // the semaphore will be signalled when it is non-empty + WaitForSingleObject(m_hSem, INFINITE); + } + // copy fields to caller's CMsg + *msg = *pmsg; + + // this CMsg was allocated by the 'new' in PutThreadMsg + delete pmsg; + +} + +// Helper function - convert int to WSTR +void WINAPI IntToWstr(int i, __out_ecount(12) LPWSTR wstr) +{ +#ifdef UNICODE + if (FAILED(StringCchPrintf(wstr, 12, L"%d", i))) { + wstr0 = 0; + } +#else + TCHAR temp12; + if (FAILED(StringCchPrintf(temp, NUMELMS(temp), "%d", i))) { + wstr0 = 0; + } else { + MultiByteToWideChar(CP_ACP, 0, temp, -1, wstr, 12); + } +#endif +} // IntToWstr + + +#define MEMORY_ALIGNMENT 4 +#define MEMORY_ALIGNMENT_LOG2 2 +#define MEMORY_ALIGNMENT_MASK MEMORY_ALIGNMENT - 1 + +void * __stdcall memmoveInternal(void * dst, const void * src, size_t count) +{ + void * ret = dst; + +#ifdef _X86_ + if (dst <= src || (char *)dst >= ((char *)src + count)) { + + /* + * Non-Overlapping Buffers + * copy from lower addresses to higher addresses + */ + _asm { + mov esi,src + mov edi,dst + mov ecx,count + cld + mov edx,ecx + and edx,MEMORY_ALIGNMENT_MASK + shr ecx,MEMORY_ALIGNMENT_LOG2 + rep movsd + or ecx,edx + jz memmove_done + rep movsb +memmove_done: + } + } + else { + + /* + * Overlapping Buffers + * copy from higher addresses to lower addresses + */ + _asm { + mov esi,src + mov edi,dst + mov ecx,count + std + add esi,ecx + add edi,ecx + dec esi + dec edi + rep movsb + cld + } + } +#else + MoveMemory(dst, src, count); +#endif + + return ret; +} + +HRESULT AMSafeMemMoveOffset( + __in_bcount(dst_size) void * dst, + __in size_t dst_size, + __in DWORD cb_dst_offset, + __in_bcount(src_size) const void * src, + __in size_t src_size, + __in DWORD cb_src_offset, + __in size_t count) +{ + // prevent read overruns + if( count + cb_src_offset < count || // prevent integer overflow + count + cb_src_offset > src_size) // prevent read overrun + { + return E_INVALIDARG; + } + + // prevent write overruns + if( count + cb_dst_offset < count || // prevent integer overflow + count + cb_dst_offset > dst_size) // prevent write overrun + { + return E_INVALIDARG; + } + + memmoveInternal( (BYTE *)dst+cb_dst_offset, (BYTE *)src+cb_src_offset, count); + return S_OK; +} + + +#ifdef DEBUG +/******************************Public*Routine******************************\ +* Debug CCritSec helpers +* +* We provide debug versions of the Constructor, destructor, Lock and Unlock +* routines. The debug code tracks who owns each critical section by +* maintaining a depth count. +* +* History: +* +\**************************************************************************/ + +CCritSec::CCritSec() +{ + InitializeCriticalSection(&m_CritSec); + m_currentOwner = m_lockCount = 0; + m_fTrace = FALSE; +} + +CCritSec::~CCritSec() +{ + DeleteCriticalSection(&m_CritSec); +} + +void CCritSec::Lock() +{ + UINT tracelevel=3; + DWORD us = GetCurrentThreadId(); + DWORD currentOwner = m_currentOwner; + if (currentOwner && (currentOwner != us)) { + // already owned, but not by us + if (m_fTrace) { + DbgLog((LOG_LOCKING, 2, TEXT("Thread %d about to wait for lock %x owned by %d"), + GetCurrentThreadId(), &m_CritSec, currentOwner)); + tracelevel=2; + // if we saw the message about waiting for the critical + // section we ensure we see the message when we get the + // critical section + } + } + EnterCriticalSection(&m_CritSec); + if (0 == m_lockCount++) { + // we now own it for the first time. Set owner information + m_currentOwner = us; + + if (m_fTrace) { + DbgLog((LOG_LOCKING, tracelevel, TEXT("Thread %d now owns lock %x"), m_currentOwner, &m_CritSec)); + } + } +} + +void CCritSec::Unlock() { + if (0 == --m_lockCount) { + // about to be unowned + if (m_fTrace) { + DbgLog((LOG_LOCKING, 3, TEXT("Thread %d releasing lock %x"), m_currentOwner, &m_CritSec)); + } + + m_currentOwner = 0; + } + LeaveCriticalSection(&m_CritSec); +} + +void WINAPI DbgLockTrace(CCritSec * pcCrit, BOOL fTrace) +{ + pcCrit->m_fTrace = fTrace; +} + +BOOL WINAPI CritCheckIn(CCritSec * pcCrit) +{ + return (GetCurrentThreadId() == pcCrit->m_currentOwner); +} + +BOOL WINAPI CritCheckIn(const CCritSec * pcCrit) +{ + return (GetCurrentThreadId() == pcCrit->m_currentOwner); +} + +BOOL WINAPI CritCheckOut(CCritSec * pcCrit) +{ + return (GetCurrentThreadId() != pcCrit->m_currentOwner); +} + +BOOL WINAPI CritCheckOut(const CCritSec * pcCrit) +{ + return (GetCurrentThreadId() != pcCrit->m_currentOwner); +} +#endif + + +STDAPI WriteBSTR(__deref_out BSTR *pstrDest, LPCWSTR szSrc) +{ + *pstrDest = SysAllocString( szSrc ); + if( !(*pstrDest) ) return E_OUTOFMEMORY; + return NOERROR; +} + + +STDAPI FreeBSTR(__deref_in BSTR* pstr) +{ + if( (PVOID)*pstr == NULL ) return S_FALSE; + SysFreeString( *pstr ); + return NOERROR; +} + + +// Return a wide string - allocating memory for it +// Returns: +// S_OK - no error +// E_POINTER - ppszReturn == NULL +// E_OUTOFMEMORY - can't allocate memory for returned string +STDAPI AMGetWideString(LPCWSTR psz, __deref_out LPWSTR *ppszReturn) +{ + CheckPointer(ppszReturn, E_POINTER); + ValidateReadWritePtr(ppszReturn, sizeof(LPWSTR)); + *ppszReturn = NULL; + size_t nameLen; + HRESULT hr = StringCbLengthW(psz, 100000, &nameLen); + if (FAILED(hr)) { + return hr; + } + *ppszReturn = (LPWSTR)CoTaskMemAlloc(nameLen + sizeof(WCHAR)); + if (*ppszReturn == NULL) { + return E_OUTOFMEMORY; + } + CopyMemory(*ppszReturn, psz, nameLen + sizeof(WCHAR)); + return NOERROR; +} + +// Waits for the HANDLE hObject. While waiting messages sent +// to windows on our thread by SendMessage will be processed. +// Using this function to do waits and mutual exclusion +// avoids some deadlocks in objects with windows. +// Return codes are the same as for WaitForSingleObject +DWORD WINAPI WaitDispatchingMessages( + HANDLE hObject, + DWORD dwWait, + HWND hwnd, + UINT uMsg, + HANDLE hEvent) +{ + BOOL bPeeked = FALSE; + DWORD dwResult; + DWORD dwStart; + DWORD dwThreadPriority; + + static UINT uMsgId = 0; + + HANDLE hObjects2 = { hObject, hEvent }; + if (dwWait != INFINITE && dwWait != 0) { + dwStart = GetTickCount(); + } + for (; ; ) { + DWORD nCount = NULL != hEvent ? 2 : 1; + + // Minimize the chance of actually dispatching any messages + // by seeing if we can lock immediately. + dwResult = WaitForMultipleObjects(nCount, hObjects, FALSE, 0); + if (dwResult < WAIT_OBJECT_0 + nCount) { + break; + } + + DWORD dwTimeOut = dwWait; + if (dwTimeOut > 10) { + dwTimeOut = 10; + } + dwResult = MsgWaitForMultipleObjects( + nCount, + hObjects, + FALSE, + dwTimeOut, + hwnd == NULL ? QS_SENDMESSAGE : + QS_SENDMESSAGE + QS_POSTMESSAGE); + if (dwResult == WAIT_OBJECT_0 + nCount || + dwResult == WAIT_TIMEOUT && dwTimeOut != dwWait) { + MSG msg; + if (hwnd != NULL) { + while (PeekMessage(&msg, hwnd, uMsg, uMsg, PM_REMOVE)) { + DispatchMessage(&msg); + } + } + // Do this anyway - the previous peek doesn't flush out the + // messages + PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); + + if (dwWait != INFINITE && dwWait != 0) { + DWORD dwNow = GetTickCount(); + + // Working with differences handles wrap-around + DWORD dwDiff = dwNow - dwStart; + if (dwDiff > dwWait) { + dwWait = 0; + } else { + dwWait -= dwDiff; + } + dwStart = dwNow; + } + if (!bPeeked) { + // Raise our priority to prevent our message queue + // building up + dwThreadPriority = GetThreadPriority(GetCurrentThread()); + if (dwThreadPriority < THREAD_PRIORITY_HIGHEST) { + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); + } + bPeeked = TRUE; + } + } else { + break; + } + } + if (bPeeked) { + SetThreadPriority(GetCurrentThread(), dwThreadPriority); + if (HIWORD(GetQueueStatus(QS_POSTMESSAGE)) & QS_POSTMESSAGE) { + if (uMsgId == 0) { + uMsgId = RegisterWindowMessage(TEXT("AMUnblock")); + } + if (uMsgId != 0) { + MSG msg; + // Remove old ones + while (PeekMessage(&msg, (HWND)-1, uMsgId, uMsgId, PM_REMOVE)) { + } + } + PostThreadMessage(GetCurrentThreadId(), uMsgId, 0, 0); + } + } + return dwResult; +} + +HRESULT AmGetLastErrorToHResult() +{ + DWORD dwLastError = GetLastError(); + if(dwLastError != 0) + { + return HRESULT_FROM_WIN32(dwLastError); + } + else + { + return E_FAIL; + } +} + +IUnknown* QzAtlComPtrAssign(__deref_inout_opt IUnknown** pp, __in_opt IUnknown* lp) +{ + if (lp != NULL) + lp->AddRef(); + if (*pp) + (*pp)->Release(); + *pp = lp; + return lp; +} + +/****************************************************************************** + +CompatibleTimeSetEvent + + CompatibleTimeSetEvent() sets the TIME_KILL_SYNCHRONOUS flag before calling +timeSetEvent() if the current operating system supports it. TIME_KILL_SYNCHRONOUS +is supported on Windows XP and later operating systems. + +Parameters: +- The same parameters as timeSetEvent(). See timeSetEvent()'s documentation in +the Platform SDK for more information. + +Return Value: +- The same return value as timeSetEvent(). See timeSetEvent()'s documentation in +the Platform SDK for more information. + +******************************************************************************/ +MMRESULT CompatibleTimeSetEvent( UINT uDelay, UINT uResolution, __in LPTIMECALLBACK lpTimeProc, DWORD_PTR dwUser, UINT fuEvent ) +{ + #if WINVER >= 0x0501 + { + static bool fCheckedVersion = false; + static bool fTimeKillSynchronousFlagAvailable = false; + + if( !fCheckedVersion ) { + fTimeKillSynchronousFlagAvailable = TimeKillSynchronousFlagAvailable(); + fCheckedVersion = true; + } + + if( fTimeKillSynchronousFlagAvailable ) { + fuEvent = fuEvent | TIME_KILL_SYNCHRONOUS; + } + } + #endif // WINVER >= 0x0501 + + return timeSetEvent( uDelay, uResolution, lpTimeProc, dwUser, fuEvent ); +} + +bool TimeKillSynchronousFlagAvailable( void ) +{ + OSVERSIONINFO osverinfo; + + osverinfo.dwOSVersionInfoSize = sizeof(osverinfo); + + if( GetVersionEx( &osverinfo ) ) { + + // Windows XP's major version is 5 and its' minor version is 1. + // timeSetEvent() started supporting the TIME_KILL_SYNCHRONOUS flag + // in Windows XP. + if( (osverinfo.dwMajorVersion > 5) || + ( (osverinfo.dwMajorVersion == 5) && (osverinfo.dwMinorVersion >= 1) ) ) { + return true; + } + } + + return false; +} + +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/baseclasses/wxutil.h
Added
@@ -0,0 +1,532 @@ +//------------------------------------------------------------------------------ +// File: WXUtil.h +// +// Desc: DirectShow base classes - defines helper classes and functions for +// building multimedia filters. +// +// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +#ifndef __WXUTIL__ +#define __WXUTIL__ + +// eliminate spurious "statement has no effect" warnings. +#pragma warning(disable: 4705) + +// wrapper for whatever critical section we have +class CCritSec { + + // make copy constructor and assignment operator inaccessible + + CCritSec(const CCritSec &refCritSec); + CCritSec &operator=(const CCritSec &refCritSec); + + CRITICAL_SECTION m_CritSec; + +#ifdef DEBUG +public: + DWORD m_currentOwner; + DWORD m_lockCount; + BOOL m_fTrace; // Trace this one +public: + CCritSec(); + ~CCritSec(); + void Lock(); + void Unlock(); +#else + +public: + CCritSec() { + InitializeCriticalSection(&m_CritSec); + }; + + ~CCritSec() { + DeleteCriticalSection(&m_CritSec); + }; + + void Lock() { + EnterCriticalSection(&m_CritSec); + }; + + void Unlock() { + LeaveCriticalSection(&m_CritSec); + }; +#endif +}; + +// +// To make deadlocks easier to track it is useful to insert in the +// code an assertion that says whether we own a critical section or +// not. We make the routines that do the checking globals to avoid +// having different numbers of member functions in the debug and +// retail class implementations of CCritSec. In addition we provide +// a routine that allows usage of specific critical sections to be +// traced. This is NOT on by default - there are far too many. +// + +#ifdef DEBUG + BOOL WINAPI CritCheckIn(CCritSec * pcCrit); + BOOL WINAPI CritCheckIn(const CCritSec * pcCrit); + BOOL WINAPI CritCheckOut(CCritSec * pcCrit); + BOOL WINAPI CritCheckOut(const CCritSec * pcCrit); + void WINAPI DbgLockTrace(CCritSec * pcCrit, BOOL fTrace); +#else + #define CritCheckIn(x) TRUE + #define CritCheckOut(x) TRUE + #define DbgLockTrace(pc, fT) +#endif + + +// locks a critical section, and unlocks it automatically +// when the lock goes out of scope +class CAutoLock { + + // make copy constructor and assignment operator inaccessible + + CAutoLock(const CAutoLock &refAutoLock); + CAutoLock &operator=(const CAutoLock &refAutoLock); + +protected: + CCritSec * m_pLock; + +public: + CAutoLock(CCritSec * plock) + { + m_pLock = plock; + m_pLock->Lock(); + }; + + ~CAutoLock() { + m_pLock->Unlock(); + }; +}; + + + +// wrapper for event objects +class CAMEvent +{ + + // make copy constructor and assignment operator inaccessible + + CAMEvent(const CAMEvent &refEvent); + CAMEvent &operator=(const CAMEvent &refEvent); + +protected: + HANDLE m_hEvent; +public: + CAMEvent(BOOL fManualReset = FALSE, __inout_opt HRESULT *phr = NULL); + CAMEvent(__inout_opt HRESULT *phr); + ~CAMEvent(); + + // Cast to HANDLE - we don't support this as an lvalue + operator HANDLE () const { return m_hEvent; }; + + void Set() {EXECUTE_ASSERT(SetEvent(m_hEvent));}; + BOOL Wait(DWORD dwTimeout = INFINITE) { + return (WaitForSingleObject(m_hEvent, dwTimeout) == WAIT_OBJECT_0); + }; + void Reset() { ResetEvent(m_hEvent); }; + BOOL Check() { return Wait(0); }; +}; + + +// wrapper for event objects that do message processing +// This adds ONE method to the CAMEvent object to allow sent +// messages to be processed while waiting + +class CAMMsgEvent : public CAMEvent +{ + +public: + + CAMMsgEvent(__inout_opt HRESULT *phr = NULL); + + // Allow SEND messages to be processed while waiting + BOOL WaitMsg(DWORD dwTimeout = INFINITE); +}; + +// old name supported for the time being +#define CTimeoutEvent CAMEvent + +// support for a worker thread + +#ifdef AM_NOVTABLE +// simple thread class supports creation of worker thread, synchronization +// and communication. Can be derived to simplify parameter passing +class AM_NOVTABLE CAMThread { + + // make copy constructor and assignment operator inaccessible + + CAMThread(const CAMThread &refThread); + CAMThread &operator=(const CAMThread &refThread); + + CAMEvent m_EventSend; + CAMEvent m_EventComplete; + + DWORD m_dwParam; + DWORD m_dwReturnVal; + +protected: + HANDLE m_hThread; + + // thread will run this function on startup + // must be supplied by derived class + virtual DWORD ThreadProc() = 0; + +public: + CAMThread(__inout_opt HRESULT *phr = NULL); + virtual ~CAMThread(); + + CCritSec m_AccessLock; // locks access by client threads + CCritSec m_WorkerLock; // locks access to shared objects + + // thread initially runs this. param is actually 'this'. function + // just gets this and calls ThreadProc + static DWORD WINAPI InitialThreadProc(__inout LPVOID pv); + + // start thread running - error if already running + BOOL Create(); + + // signal the thread, and block for a response + // + DWORD CallWorker(DWORD); + + // accessor thread calls this when done with thread (having told thread + // to exit) + void Close() { + + // Disable warning: Conversion from LONG to PVOID of greater size +#pragma warning(push) +#pragma warning(disable: 4312) + HANDLE hThread = (HANDLE)InterlockedExchangePointer(&m_hThread, 0); +#pragma warning(pop) + + if (hThread) { + WaitForSingleObject(hThread, INFINITE); + CloseHandle(hThread); + } + }; + + // ThreadExists + // Return TRUE if the thread exists. FALSE otherwise + BOOL ThreadExists(void) const + { + if (m_hThread == 0) { + return FALSE; + } else { + return TRUE; + } + } + + // wait for the next request + DWORD GetRequest(); + + // is there a request? + BOOL CheckRequest(__out_opt DWORD * pParam); + + // reply to the request + void Reply(DWORD); + + // If you want to do WaitForMultipleObjects you'll need to include + // this handle in your wait list or you won't be responsive + HANDLE GetRequestHandle() const { return m_EventSend; }; + + // Find out what the request was + DWORD GetRequestParam() const { return m_dwParam; }; + + // call CoInitializeEx (COINIT_DISABLE_OLE1DDE) if + // available. S_FALSE means it's not available. + static HRESULT CoInitializeHelper(); +}; +#endif // AM_NOVTABLE + + +// CQueue +// +// Implements a simple Queue ADT. The queue contains a finite number of +// objects, access to which is controlled by a semaphore. The semaphore +// is created with an initial count (N). Each time an object is added +// a call to WaitForSingleObject is made on the semaphore's handle. When +// this function returns a slot has been reserved in the queue for the new +// object. If no slots are available the function blocks until one becomes +// available. Each time an object is removed from the queue ReleaseSemaphore +// is called on the semaphore's handle, thus freeing a slot in the queue. +// If no objects are present in the queue the function blocks until an +// object has been added. + +#define DEFAULT_QUEUESIZE 2 + +template <class T> class CQueue { +private: + HANDLE hSemPut; // Semaphore controlling queue "putting" + HANDLE hSemGet; // Semaphore controlling queue "getting" + CRITICAL_SECTION CritSect; // Thread seriallization + int nMax; // Max objects allowed in queue + int iNextPut; // Array index of next "PutMsg" + int iNextGet; // Array index of next "GetMsg" + T *QueueObjects; // Array of objects (ptr's to void) + + void Initialize(int n) { + iNextPut = iNextGet = 0; + nMax = n; + InitializeCriticalSection(&CritSect); + hSemPut = CreateSemaphore(NULL, n, n, NULL); + hSemGet = CreateSemaphore(NULL, 0, n, NULL); + QueueObjects = new Tn; + } + + +public: + CQueue(int n) { + Initialize(n); + } + + CQueue() { + Initialize(DEFAULT_QUEUESIZE); + } + + ~CQueue() { + delete QueueObjects; + DeleteCriticalSection(&CritSect); + CloseHandle(hSemPut); + CloseHandle(hSemGet); + } + + T GetQueueObject() { + int iSlot; + T Object; + LONG lPrevious; + + // Wait for someone to put something on our queue, returns straight + // away is there is already an object on the queue. + // + WaitForSingleObject(hSemGet, INFINITE); + + EnterCriticalSection(&CritSect); + iSlot = iNextGet++ % nMax; + Object = QueueObjectsiSlot; + LeaveCriticalSection(&CritSect); + + // Release anyone waiting to put an object onto our queue as there + // is now space available in the queue. + // + ReleaseSemaphore(hSemPut, 1L, &lPrevious); + return Object; + } + + void PutQueueObject(T Object) { + int iSlot; + LONG lPrevious; + + // Wait for someone to get something from our queue, returns straight + // away is there is already an empty slot on the queue. + // + WaitForSingleObject(hSemPut, INFINITE); + + EnterCriticalSection(&CritSect); + iSlot = iNextPut++ % nMax; + QueueObjectsiSlot = Object; + LeaveCriticalSection(&CritSect); + + // Release anyone waiting to remove an object from our queue as there + // is now an object available to be removed. + // + ReleaseSemaphore(hSemGet, 1L, &lPrevious); + } +}; + +// Ensures that memory is not read past the length source buffer +// and that memory is not written past the length of the dst buffer +// dst - buffer to copy to +// dst_size - total size of destination buffer +// cb_dst_offset - offset, first byte copied to dst+cb_dst_offset +// src - buffer to copy from +// src_size - total size of source buffer +// cb_src_offset - offset, first byte copied from src+cb_src_offset +// count - number of bytes to copy +// +// Returns: +// S_OK - no error +// E_INVALIDARG - values passed would lead to overrun +HRESULT AMSafeMemMoveOffset( + __in_bcount(dst_size) void * dst, + __in size_t dst_size, + __in DWORD cb_dst_offset, + __in_bcount(src_size) const void * src, + __in size_t src_size, + __in DWORD cb_src_offset, + __in size_t count); + +extern "C" +void * __stdcall memmoveInternal(void *, const void *, size_t); + +inline void * __cdecl memchrInternal(const void *buf, int chr, size_t cnt) +{ +#ifdef _X86_ + void *pRet = NULL; + + _asm { + cld // make sure we get the direction right + mov ecx, cnt // num of bytes to scan + mov edi, buf // pointer byte stream + mov eax, chr // byte to scan for + repne scasb // look for the byte in the byte stream + jnz exit_memchr // Z flag set if byte found + dec edi // scasb always increments edi even when it + // finds the required byte + mov pRet, edi +exit_memchr: + } + return pRet; + +#else + while ( cnt && (*(unsigned char *)buf != (unsigned char)chr) ) { + buf = (unsigned char *)buf + 1; + cnt--; + } + + return(cnt ? (void *)buf : NULL); +#endif +} + +void WINAPI IntToWstr(int i, __out_ecount(12) LPWSTR wstr); + +#define WstrToInt(sz) _wtoi(sz) +#define atoiW(sz) _wtoi(sz) +#define atoiA(sz) atoi(sz) + +// These are available to help managing bitmap VIDEOINFOHEADER media structures + +extern const DWORD bits5553; +extern const DWORD bits5653; +extern const DWORD bits8883; + +// These help convert between VIDEOINFOHEADER and BITMAPINFO structures + +STDAPI_(const GUID) GetTrueColorType(const BITMAPINFOHEADER *pbmiHeader); +STDAPI_(const GUID) GetBitmapSubtype(const BITMAPINFOHEADER *pbmiHeader); +STDAPI_(WORD) GetBitCount(const GUID *pSubtype); + +// strmbase.lib implements this for compatibility with people who +// managed to link to this directly. we don't want to advertise it. +// +// STDAPI_(/* T */ CHAR *) GetSubtypeName(const GUID *pSubtype); + +STDAPI_(CHAR *) GetSubtypeNameA(const GUID *pSubtype); +STDAPI_(WCHAR *) GetSubtypeNameW(const GUID *pSubtype); + +#ifdef UNICODE +#define GetSubtypeName GetSubtypeNameW +#else +#define GetSubtypeName GetSubtypeNameA +#endif + +STDAPI_(LONG) GetBitmapFormatSize(const BITMAPINFOHEADER *pHeader); +STDAPI_(DWORD) GetBitmapSize(const BITMAPINFOHEADER *pHeader); + +#ifdef __AMVIDEO__ +STDAPI_(BOOL) ContainsPalette(const VIDEOINFOHEADER *pVideoInfo); +STDAPI_(const RGBQUAD *) GetBitmapPalette(const VIDEOINFOHEADER *pVideoInfo); +#endif // __AMVIDEO__ + + +// Compares two interfaces and returns TRUE if they are on the same object +BOOL WINAPI IsEqualObject(IUnknown *pFirst, IUnknown *pSecond); + +// This is for comparing pins +#define EqualPins(pPin1, pPin2) IsEqualObject(pPin1, pPin2) + + +// Arithmetic helper functions + +// Compute (a * b + rnd) / c +LONGLONG WINAPI llMulDiv(LONGLONG a, LONGLONG b, LONGLONG c, LONGLONG rnd); +LONGLONG WINAPI Int64x32Div32(LONGLONG a, LONG b, LONG c, LONG rnd); + + +// Avoids us dyna-linking to SysAllocString to copy BSTR strings +STDAPI WriteBSTR(__deref_out BSTR * pstrDest, LPCWSTR szSrc); +STDAPI FreeBSTR(__deref_in BSTR* pstr); + +// Return a wide string - allocating memory for it +// Returns: +// S_OK - no error +// E_POINTER - ppszReturn == NULL +// E_OUTOFMEMORY - can't allocate memory for returned string +STDAPI AMGetWideString(LPCWSTR pszString, __deref_out LPWSTR *ppszReturn); + +// Special wait for objects owning windows +DWORD WINAPI WaitDispatchingMessages( + HANDLE hObject, + DWORD dwWait, + HWND hwnd = NULL, + UINT uMsg = 0, + HANDLE hEvent = NULL); + +// HRESULT_FROM_WIN32 converts ERROR_SUCCESS to a success code, but in +// our use of HRESULT_FROM_WIN32, it typically means a function failed +// to call SetLastError(), and we still want a failure code. +// +#define AmHresultFromWin32(x) (MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, x)) + +// call GetLastError and return an HRESULT value that will fail the +// SUCCEEDED() macro. +HRESULT AmGetLastErrorToHResult(void); + +// duplicate of ATL's CComPtr to avoid linker conflicts. + +IUnknown* QzAtlComPtrAssign(__deref_inout_opt IUnknown** pp, __in_opt IUnknown* lp); + +template <class T> +class QzCComPtr +{ +public: + typedef T _PtrClass; + QzCComPtr() {p=NULL;} + QzCComPtr(T* lp) + { + if ((p = lp) != NULL) + p->AddRef(); + } + QzCComPtr(const QzCComPtr<T>& lp) + { + if ((p = lp.p) != NULL) + p->AddRef(); + } + ~QzCComPtr() {if (p) p->Release();} + void Release() {if (p) p->Release(); p=NULL;} + operator T*() {return (T*)p;} + T& operator*() {ASSERT(p!=NULL); return *p; } + //The assert on operator& usually indicates a bug. If this is really + //what is needed, however, take the address of the p member explicitly. + T** operator&() { ASSERT(p==NULL); return &p; } + T* operator->() { ASSERT(p!=NULL); return p; } + T* operator=(T* lp){return (T*)QzAtlComPtrAssign((IUnknown**)&p, lp);} + T* operator=(const QzCComPtr<T>& lp) + { + return (T*)QzAtlComPtrAssign((IUnknown**)&p, lp.p); + } +#if _MSC_VER>1020 + bool operator!(){return (p == NULL);} +#else + BOOL operator!(){return (p == NULL) ? TRUE : FALSE;} +#endif + T* p; +}; + +MMRESULT CompatibleTimeSetEvent( UINT uDelay, UINT uResolution, __in LPTIMECALLBACK lpTimeProc, DWORD_PTR dwUser, UINT fuEvent ); +bool TimeKillSynchronousFlagAvailable( void ); + +// Helper to replace lstrcpmi +__inline int lstrcmpiLocaleIndependentW(LPCWSTR lpsz1, LPCWSTR lpsz2) +{ + return CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, lpsz1, -1, lpsz2, -1) - CSTR_EQUAL; +} +__inline int lstrcmpiLocaleIndependentA(LPCSTR lpsz1, LPCSTR lpsz2) +{ + return CompareStringA(LOCALE_INVARIANT, NORM_IGNORECASE, lpsz1, -1, lpsz2, -1) - CSTR_EQUAL; +} + +#endif /* __WXUTIL__ */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/directshow/strmbase/meson.build
Added
@@ -0,0 +1,72 @@ +strmbase_sources = + 'amextra.cpp', + 'amfilter.cpp', + 'amvideo.cpp', + 'arithutil.cpp', + 'combase.cpp', + 'cprop.cpp', + 'ctlutil.cpp', + 'ddmm.cpp', + 'dllentry.cpp', + 'dllsetup.cpp', + 'mtype.cpp', + 'outputq.cpp', + 'perflog.cpp', + 'pstream.cpp', + 'pullpin.cpp', + 'refclock.cpp', + 'renbase.cpp', + 'schedule.cpp', + 'seekpt.cpp', + 'source.cpp', + 'strmctl.cpp', + 'sysclock.cpp', + 'transfrm.cpp', + 'transip.cpp', + 'videoctl.cpp', + 'vtrans.cpp', + 'winctrl.cpp', + 'winutil.cpp', + 'wxdebug.cpp', + 'wxlist.cpp', + 'wxutil.cpp' + + +strmbase_cpp_args = '-D_MBCS' +strmbase_cpp_args += cxx.get_supported_arguments( + '/wd4189', # 'identifier' : local variable is initialized but not referenced + '/wd4456', # declaration of 'identifier' hides previous local declaration + '/wd4701', # potentially uninitialized local variable 'name' used + '/wd4703', # potentially uninitialized local pointer variable 'name' used + '/wd4706', # assignment within conditional expression + '/wd4996' # code uses a function, class member, variable, or typedef that's marked deprecated +) + +strmbase_subdir = 'baseclasses' +strmbase_includes = include_directories(strmbase_subdir) + +strmiids_dep = cxx.find_library('strmiids', required: get_option('directshow')) +if not strmiids_dep.found() + message('strmiids not found, not building directshow strmbase') + strmbase_dep = disabler() + subdir_done() +endif + +strmbase_cpp_sources = +foreach file : strmbase_sources + strmbase_cpp_sources += strmbase_subdir + '/' + file +endforeach + +strmbase_lib = static_library( + 'strmbase', + strmbase_cpp_sources, + cpp_args: strmbase_cpp_args, + dependencies: strmiids_dep, + include_directories: strmbase_includes, + override_options: 'cpp_std=none') + +strmbase_dep = declare_dependency( + link_with: strmbase_lib, + compile_args: strmbase_cpp_args, + dependencies: strmiids_dep, + include_directories: strmbase_includes)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/directsound/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/directsound/meson.build
Changed
@@ -32,6 +32,5 @@ dependencies : gstaudio_dep, dsound_dep, winmm_dep, ole32_dep, install : true, install_dir : plugins_install_dir) - pkgconfig.generate(gstdirectsoundsrc, install_dir : plugins_pkgconfig_install_dir) plugins += gstdirectsoundsrc endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dvb/gstdvb.c -> gst-plugins-bad-1.22.0.tar.xz/sys/dvb/gstdvb.c
Changed
@@ -25,7 +25,7 @@ #include "config.h" #endif -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "gstdvbelements.h"
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dvb/gstdvbelement.c -> gst-plugins-bad-1.22.0.tar.xz/sys/dvb/gstdvbelement.c
Changed
@@ -24,7 +24,7 @@ #include "config.h" #endif -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "gstdvbelements.h"
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dvb/gstdvbsrc.c -> gst-plugins-bad-1.22.0.tar.xz/sys/dvb/gstdvbsrc.c
Changed
@@ -111,7 +111,7 @@ #include <linux/dvb/frontend.h> #include <linux/dvb/dmx.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> /* Before 5.6 we map A to AC */ #if !HAVE_V5_MINOR(6)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dvb/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/dvb/meson.build
Changed
@@ -36,10 +36,9 @@ dvb_sources, c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API' , include_directories : configinc, libsinc, - dependencies : gstmpegts_dep, gstbase_dep, glib_dep, + dependencies : gstmpegts_dep, gstbase_dep, install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstdvb, install_dir : plugins_pkgconfig_install_dir) plugins += gstdvb endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/dvb/parsechannels.c -> gst-plugins-bad-1.22.0.tar.xz/sys/dvb/parsechannels.c
Changed
@@ -31,7 +31,7 @@ #include <string.h> #include <gst/gst.h> -#include <gst/gst-i18n-plugin.h> +#include <glib/gi18n-lib.h> #include "parsechannels.h" @@ -212,11 +212,14 @@ GKeyFile * kf, const gchar * channel_name, const gchar * key) { guint64 v; + GError *err = NULL; - v = g_key_file_get_uint64 (kf, channel_name, key, NULL); - if (!v) { + v = g_key_file_get_uint64 (kf, channel_name, key, &err); + if (err != NULL) { GST_WARNING_OBJECT (dvbbasebin, - "Could not get value for '%s' on channel '%s'", key, channel_name); + "Could not get value for '%s' on channel '%s' error: '%s'", key, + channel_name, err->message); + g_error_free (err); return FALSE; } @@ -229,11 +232,14 @@ GKeyFile * kf, const gchar * channel_name, const gchar * key) { gint v; + GError *err = NULL; - v = g_key_file_get_integer (kf, channel_name, key, NULL); - if (!v) { + v = g_key_file_get_integer (kf, channel_name, key, &err); + if (err != NULL) { GST_WARNING_OBJECT (dvbbasebin, - "Could not get value for '%s' on channel '%s'", key, channel_name); + "Could not get value for '%s' on channel '%s' error: '%s'", key, + channel_name, err->message); + g_error_free (err); return FALSE; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/fbdev/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/fbdev/meson.build
Changed
@@ -20,6 +20,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstfbdevsink, install_dir : plugins_pkgconfig_install_dir) plugins += gstfbdevsink endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/ipcpipeline/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/ipcpipeline/meson.build
Changed
@@ -19,5 +19,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstipcpipeline, install_dir : plugins_pkgconfig_install_dir) plugins += gstipcpipeline
View file
gst-plugins-bad-1.20.5.tar.xz/sys/kms/gstkmsallocator.c -> gst-plugins-bad-1.22.0.tar.xz/sys/kms/gstkmsallocator.c
Changed
@@ -138,34 +138,6 @@ mem->bo = NULL; } -/* Copied from gst_v4l2_object_extrapolate_stride() */ -static gint -extrapolate_stride (const GstVideoFormatInfo * finfo, gint plane, gint stride) -{ - gint estride; - - switch (finfo->format) { - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV12_64Z32: - case GST_VIDEO_FORMAT_NV21: - case GST_VIDEO_FORMAT_NV16: - case GST_VIDEO_FORMAT_NV61: - case GST_VIDEO_FORMAT_NV24: - case GST_VIDEO_FORMAT_P010_10LE: - case GST_VIDEO_FORMAT_P010_10BE: - case GST_VIDEO_FORMAT_P016_LE: - case GST_VIDEO_FORMAT_P016_BE: - estride = (plane == 0 ? 1 : 2) * - GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (finfo, plane, stride); - break; - default: - estride = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (finfo, plane, stride); - break; - } - - return estride; -} - static gboolean gst_kms_allocator_memory_create (GstKMSAllocator * allocator, GstKMSMemory * kmsmem, GstVideoInfo * vinfo) @@ -207,7 +179,8 @@ /* Overwrite the video info's stride and offset using the pitch calculcated * by the kms driver. */ - pitch = extrapolate_stride (vinfo->finfo, i, arg.pitch); + pitch = gst_video_format_info_extrapolate_stride (vinfo->finfo, i, + arg.pitch); GST_VIDEO_INFO_PLANE_STRIDE (vinfo, i) = pitch; GST_VIDEO_INFO_PLANE_OFFSET (vinfo, i) = offs;
View file
gst-plugins-bad-1.22.0.tar.xz/sys/kms/gstkmsedid.c
Added
@@ -0,0 +1,111 @@ +/* +* Copyright © 2008-2011 Kristian Høgsberg +* Copyright © 2011 Intel Corporation +* Copyright © 2017, 2018 Collabora, Ltd. +* Copyright © 2017, 2018 General Electric Company +* Copyright (c) 2018 DisplayLink (UK) Ltd. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +#include <math.h> +#include "gstkmsedid.h" + +/* from libweston/backend-drm/modes.c unaccepted merge, modified slightly to + remove non HDR stuff, return -1 if no HDR in EDID. + https://gitlab.freedesktop.org/jcline/weston/-/commit/b3fa65d19ca60a45d0cc0fc1bfa68eea970344ee + */ +#define EDID_OFFSET_EXT_COUNT 0x7E +#define EDID_EXTENSION_SIZE 0x80 +// Indicates the EDID extension is a CTA extension +#define EDID_CTA_EXTENSION_TAG 0x02 +// Indicates the data block uses the extended tag field +#define EDID_CTA_EXTENDED_TAG 0x07 +// Value of the extended tag field for HDR static metadata blocks +#define EDID_CTA_STATIC_HDR_TAG 0x06 + +/* Extract the HDR static metadata from a CTA EDID extension. */ +static int +gst_kms_parse_hdr_metadata (const uint8_t * cta_ext_data, + struct gst_kms_hdr_static_metadata *metadata) +{ + int i, block_len; + uint8_t cta_revision = cta_ext_data1; + uint8_t dtd_offset = cta_ext_data2; + const uint8_t *data_blocks = cta_ext_data + 4; + + if (cta_revision != 3) { + return -1; + } + // The data block collection ranges from byte 4 to the dtd_offset; each + // block begins with the block size (in bytes) in bits 0-4 of the first byte. + for (i = 0; i < dtd_offset; i += (data_blocksi & 0x1f) + 1) { + if ((data_blocksi & 0xe0) >> 5 == EDID_CTA_EXTENDED_TAG) { + block_len = data_blocksi & 0x1f; + + if (data_blocksi + 1 == EDID_CTA_STATIC_HDR_TAG) { + if (block_len < 2) + continue; + + metadata->eotf = data_blocksi + 2; + metadata->metadata_type = data_blocksi + 3; + + if (block_len > 3 && data_blocksi + 4) + metadata->max_cll = 50.0 * pow (2, data_blocksi + 4 / 32.0); + if (block_len > 4 && data_blocksi + 5) + metadata->max_fall = 50.0 * pow (2, data_blocksi + 5 / 32.0); + if (block_len > 5) + metadata->min_cll = + metadata->max_cll * pow (data_blocksi + 6 / 255.0, 2) / 100.0; + return 0; + } + } + } + return -1; +} + +int +gst_kms_edid_parse (struct gst_kms_hdr_static_metadata *metadata, + const uint8_t * data, size_t length) +{ + int i; + const uint8_t *edid_extension; + + /* check header */ + if (length < 128 || length < ((size_t) dataEDID_OFFSET_EXT_COUNT + 1) * 128) + return -1; + if (data0 != 0x00 || data1 != 0xff) + return -1; + + edid_extension = data + 128; + for (i = 0; i < dataEDID_OFFSET_EXT_COUNT; i++) { + switch (edid_extension0) { + case EDID_CTA_EXTENSION_TAG: + return gst_kms_parse_hdr_metadata (edid_extension, metadata); + } + edid_extension += 128; + } + + return 0; +} + +/* END from libweston/backend-drm/modes.c unaccepted merge */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/kms/gstkmsedid.h
Added
@@ -0,0 +1,55 @@ +/* + * Copyright © 2008-2011 Kristian Høgsberg + * Copyright © 2011 Intel Corporation + * Copyright © 2017, 2018 Collabora, Ltd. + * Copyright © 2017, 2018 General Electric Company + * Copyright (c) 2018 DisplayLink (UK) Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef __GST_KMS_EDID_H__ +#define __GST_KMS_EDID_H__ + +/* from libweston/backend-drm/modes.c unaccepted merge, modified slightly to + remove non HDR stuff, return -1 if no HDR in EDID. + https://gitlab.freedesktop.org/jcline/weston/-/commit/b3fa65d19ca60a45d0cc0fc1bfa68eea970344ee + */ + +#include <stddef.h> +#include <stdint.h> + +/* HDR Metadata as per 861.G spec from linux/hdmi.h, modified for stdint.h */ +struct gst_kms_hdr_static_metadata +{ + uint8_t eotf; + uint8_t metadata_type; + uint16_t max_cll; + uint16_t max_fall; + uint16_t min_cll; +}; + +int +gst_kms_edid_parse (struct gst_kms_hdr_static_metadata *metadata, const uint8_t * data, + size_t length); + +#endif /* __GST_KMS_EDID_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/kms/gstkmssink.c -> gst-plugins-bad-1.22.0.tar.xz/sys/kms/gstkmssink.c
Changed
@@ -49,6 +49,7 @@ #include <gst/video/video.h> #include <gst/video/videooverlay.h> +#include <gst/video/video-color.h> #include <gst/allocators/gstdmabuf.h> #include <drm.h> @@ -62,6 +63,11 @@ #include "gstkmsbufferpool.h" #include "gstkmsallocator.h" +#ifdef HAVE_DRM_HDR +#include <math.h> +#include "gstkmsedid.h" +#endif + #define GST_PLUGIN_NAME "kmssink" #define GST_PLUGIN_DESC "Video sink using the Linux kernel mode setting API" @@ -97,11 +103,310 @@ PROP_DISPLAY_HEIGHT, PROP_CONNECTOR_PROPS, PROP_PLANE_PROPS, + PROP_FD, + PROP_SKIP_VSYNC, PROP_N, }; static GParamSpec *g_propertiesPROP_N = { NULL, }; +#ifdef HAVE_DRM_HDR +enum hdmi_metadata_type +{ + HDMI_STATIC_METADATA_TYPE1 = 0, +}; +enum hdmi_eotf +{ + HDMI_EOTF_TRADITIONAL_GAMMA_SDR = 0, + HDMI_EOTF_TRADITIONAL_GAMMA_HDR, + HDMI_EOTF_SMPTE_ST2084, + HDMI_EOTF_BT_2100_HLG, +}; + +static void +gst_kms_populate_infoframe (struct hdr_output_metadata *pinfo_frame, + GstVideoMasteringDisplayInfo * p_hdr_minfo, + GstVideoContentLightLevel * p_hdr_cll, + gchar colorimetry, gboolean clear_it_out) +{ + /* From CTA-861.3: + * When a source is transmitting the Dynamic Range and Mastering InfoFrame, + * it shall signal the end of Dynamic Range... by sending a ... InfoFrame with + * the EOTF field to '0', the Static_Metadata_Descriptor_ID field set to '0', + * and the fields of the Static_Metadata_Descriptor set to unknown (0)... + * + * See also https://dri.freedesktop.org/docs/drm/gpu/drm-uapi.html + */ + if (clear_it_out) { + /* Static_Metadata_Descriptor_ID */ + pinfo_frame->metadata_type = 0; + (void) memset ((void *) &pinfo_frame->hdmi_metadata_type1, 0, + sizeof (pinfo_frame->hdmi_metadata_type1)); + return; + } else { + pinfo_frame->metadata_type = HDMI_STATIC_METADATA_TYPE1; + pinfo_frame->hdmi_metadata_type1.eotf = colorimetry; + pinfo_frame->hdmi_metadata_type1.metadata_type = HDMI_STATIC_METADATA_TYPE1; + } + + /* For HDR Infoframe see CTA-861-G, Section 6.9.1 + * SEI message is in units of 0.0001 cd/m2, HDMI is units of 1 cd/m2 - see + * x265 specs */ + pinfo_frame->hdmi_metadata_type1.max_display_mastering_luminance = + round (p_hdr_minfo->max_display_mastering_luminance / 10000.0); + pinfo_frame->hdmi_metadata_type1.min_display_mastering_luminance = + p_hdr_minfo->min_display_mastering_luminance; + + pinfo_frame->hdmi_metadata_type1.max_cll = p_hdr_cll->max_content_light_level; + pinfo_frame->hdmi_metadata_type1.max_fall = + p_hdr_cll->max_frame_average_light_level; + + for (int i = 0; i < 3; i++) { + pinfo_frame->hdmi_metadata_type1.display_primariesi.x = + p_hdr_minfo->display_primariesi.x; + pinfo_frame->hdmi_metadata_type1.display_primariesi.y = + p_hdr_minfo->display_primariesi.y; + } + + pinfo_frame->hdmi_metadata_type1.white_point.x = p_hdr_minfo->white_point.x; + pinfo_frame->hdmi_metadata_type1.white_point.y = p_hdr_minfo->white_point.y; +} + +static void +gst_kms_push_hdr_infoframe (GstKMSSink * self, gboolean clear_it_out) +{ + struct hdr_output_metadata info_frame; + drmModeObjectPropertiesPtr props; + uint32_t hdrBlobID; + int drm_fd = self->fd; + uint32_t conn_id = self->conn_id; + int ret = 0; + + if (self->no_infoframe || !self->has_hdr_info || (!clear_it_out + && self->has_sent_hdrif)) { + return; + } + + /* Check to see if the connection has the HDR_OUTPUT_METADATA property if + * we haven't already found it */ + if (self->hdrPropID == 0 || self->edidPropID == 0) { + props = + drmModeObjectGetProperties (drm_fd, conn_id, DRM_MODE_OBJECT_CONNECTOR); + + if (!props) { + GST_ERROR_OBJECT (self, "Error on drmModeObjectGetProperties %d %s", + errno, g_strerror (errno)); + return; + } + + struct gst_kms_hdr_static_metadata hdr_edid_info = { 0, 0, 0, 0, 0 }; + for (uint32_t i = 0; + i < props->count_props && (self->hdrPropID == 0 + || self->edidPropID == 0); i++) { + drmModePropertyPtr pprop = drmModeGetProperty (drm_fd, props->propsi); + + if (pprop) { + /* 7 16 DRM_MODE_PROP_BLOB HDR_OUTPUT_METADATA */ + if (!strncmp ("HDR_OUTPUT_METADATA", pprop->name, + strlen ("HDR_OUTPUT_METADATA"))) { + self->hdrPropID = pprop->prop_id; + GST_DEBUG_OBJECT (self, "HDR prop ID = %d", self->hdrPropID); + } + + if (!strncmp ("EDID", pprop->name, strlen ("EDID"))) { + self->edidPropID = pprop->prop_id; + + /* Check if EDID indicates device supports HDR */ + drmModePropertyBlobPtr blob; + blob = drmModeGetPropertyBlob (drm_fd, props->prop_valuesi); + if (blob) { + int res = + gst_kms_edid_parse (&hdr_edid_info, blob->data, blob->length); + if (res != 0) { + hdr_edid_info.eotf = 0; + hdr_edid_info.metadata_type = 0; + } + } + + drmModeFreePropertyBlob (blob); + + GST_DEBUG_OBJECT (self, "EDID prop ID = %d", self->edidPropID); + /* only these two values are guaranteed to be populated for HDR */ + GST_DEBUG_OBJECT (self, "EDID EOTF = %u, metadata type = %u", + hdr_edid_info.eotf, hdr_edid_info.metadata_type); + } + + drmModeFreeProperty (pprop); + } else { + GST_ERROR_OBJECT (self, "Error on drmModeGetProperty(%d)", i); + } + } + + drmModeFreeObjectProperties (props); + + if (self->hdrPropID == 0 || self->edidPropID == 0 + || hdr_edid_info.eotf == 0) { + GST_DEBUG_OBJECT (self, "No HDR support on target display"); + self->no_infoframe = TRUE; + /* FIXME: maybe not the right flag here... */ + self->has_sent_hdrif = TRUE; + return; + } + } + + if (clear_it_out) + GST_INFO ("Clearing HDR Infoframe on connector %d", self->conn_id); + else + GST_INFO ("Setting HDR Infoframe, if available on connector %d", + self->conn_id); + + gst_kms_populate_infoframe (&info_frame, &self->hdr_minfo, &self->hdr_cll, + self->colorimetry, clear_it_out); + + /* Use non-atomic property setting */ + ret = drmModeCreatePropertyBlob (drm_fd, &info_frame, + sizeof (struct hdr_output_metadata), &hdrBlobID); + if (!ret) { + ret = + drmModeObjectSetProperty (drm_fd, conn_id, DRM_MODE_OBJECT_CONNECTOR, + self->hdrPropID, hdrBlobID); + if (ret) { + GST_ERROR_OBJECT (self, "drmModeObjectSetProperty result %d %d %s", ret, + errno, g_strerror (errno)); + } + drmModeDestroyPropertyBlob (drm_fd, hdrBlobID); + } else { + GST_ERROR_OBJECT (self, "Failed to drmModeCreatePropertyBlob %d %s", errno, + g_strerror (errno)); + } + + if (!ret) { + GST_INFO ("Set HDR Infoframe on connector %d", conn_id); + self->has_sent_hdrif = TRUE; // Hooray! + } +} + + +/* From an HDR10 stream caps: + * + * colorimetry=(string)bt2100-pq + * content-light-level=(string)10000:166 + * mastering-display-info=(string)35400:14600:8500:39850:6550:2300:15635:16450:10000000:1 + */ +static void +gst_kms_sink_set_hdr10_caps (GstKMSSink * self, GstCaps * caps) +{ + GstVideoMasteringDisplayInfo hdr_minfo; + GstVideoContentLightLevel hdr_cll; + GstStructure *structure; + const gchar *colorimetry_s; + GstVideoColorimetry colorimetry; + gboolean has_hdr_eotf = FALSE; + gboolean has_cll = FALSE; + + structure = gst_caps_get_structure (caps, 0); + if ((colorimetry_s = gst_structure_get_string (structure, + "colorimetry")) != NULL && + gst_video_colorimetry_from_string (&colorimetry, colorimetry_s)) { + switch (colorimetry.transfer) { + case GST_VIDEO_TRANSFER_SMPTE2084: + self->colorimetry = HDMI_EOTF_SMPTE_ST2084; + has_hdr_eotf = TRUE; + GST_DEBUG ("Got HDR transfer value GST_VIDEO_TRANSFER_SMPTE2084: %u", + self->colorimetry); + break; + case GST_VIDEO_TRANSFER_BT2020_10: + case GST_VIDEO_TRANSFER_ARIB_STD_B67: + self->colorimetry = HDMI_EOTF_BT_2100_HLG; + has_hdr_eotf = TRUE; + GST_DEBUG ("Got HDR transfer value HDMI_EOTF_BT_2100_HLG: %u", + self->colorimetry); + break; + case GST_VIDEO_TRANSFER_BT709: + self->colorimetry = HDMI_EOTF_TRADITIONAL_GAMMA_SDR; + GST_DEBUG ("Got HDR transfer value GST_VIDEO_TRANSFER_BT709, " + "not HDR: %u", self->colorimetry); + break; + default: + /* not an HDMI and/or HDR colorimetry, we will ignore */ + GST_DEBUG ("Unsupported transfer function, no HDR: %u", + colorimetry.transfer); + self->no_infoframe = TRUE; + self->has_hdr_info = FALSE; + break; + } + } + + if (gst_video_mastering_display_info_from_caps (&hdr_minfo, caps)) { + if (!gst_video_mastering_display_info_is_equal (&hdr_minfo, + &self->hdr_minfo)) { + self->hdr_minfo = hdr_minfo; + self->no_infoframe = FALSE; + self->has_hdr_info = TRUE; + /* to send again */ + self->has_sent_hdrif = FALSE; + } + + GST_DEBUG ("Got mastering info: " + "min %u max %u wp %u %u dp0 %u %u dp1 %u %u dp2 %u %u", + self->hdr_minfo.min_display_mastering_luminance, + self->hdr_minfo.max_display_mastering_luminance, + self->hdr_minfo.white_point.x, self->hdr_minfo.white_point.y, + self->hdr_minfo.display_primaries0.x, + self->hdr_minfo.display_primaries0.y, + self->hdr_minfo.display_primaries1.x, + self->hdr_minfo.display_primaries1.y, + self->hdr_minfo.display_primaries2.x, + self->hdr_minfo.display_primaries2.y); + + } else { + if (self->has_hdr_info == TRUE) { + GST_WARNING ("Missing mastering display info"); + } else { + self->no_infoframe = TRUE; + self->has_hdr_info = FALSE; + } + + gst_video_mastering_display_info_init (&self->hdr_minfo); + } + + if (gst_video_content_light_level_from_caps (&hdr_cll, caps)) { + GST_DEBUG ("Got content light level information: Max CLL: %u Max FALL: %u", + hdr_cll.max_content_light_level, hdr_cll.max_frame_average_light_level); + + if (!gst_video_content_light_level_is_equal (&hdr_cll, &self->hdr_cll)) { + self->hdr_cll = hdr_cll; + self->no_infoframe = FALSE; + self->has_hdr_info = TRUE; + /* to send again */ + self->has_sent_hdrif = FALSE; + } + + has_cll = TRUE; + } else { + gst_video_content_light_level_init (&self->hdr_cll); + + if (self->has_hdr_info == TRUE) { + GST_WARNING ("Missing content light level info"); + } + + self->no_infoframe = TRUE; + self->has_hdr_info = FALSE; + } + + /* need all caps set */ + if ((has_hdr_eotf || has_cll) && !(has_hdr_eotf && has_cll)) { + GST_ELEMENT_WARNING (self, STREAM, FORMAT, + ("Stream doesn't have all HDR components needed"), + ("Check stream caps")); + + self->no_infoframe = TRUE; + self->has_hdr_info = FALSE; + } +} + +#endif /* HAVE_DRM_HDR */ + static void gst_kms_sink_set_render_rectangle (GstVideoOverlay * overlay, gint x, gint y, gint width, gint height) @@ -729,10 +1034,14 @@ pres = NULL; plane = NULL; - if (self->devname || self->bus_id) - self->fd = drmOpen (self->devname, self->bus_id); - else - self->fd = kms_open (&self->devname); + /* open our own internal device fd if application did not supply its own */ + if (self->is_internal_fd) { + if (self->devname || self->bus_id) + self->fd = drmOpen (self->devname, self->bus_id); + else + self->fd = kms_open (&self->devname); + } + if (self->fd < 0) goto open_failed; @@ -838,7 +1147,8 @@ drmModeFreeResources (res); if (!ret && self->fd >= 0) { - drmClose (self->fd); + if (self->is_internal_fd) + drmClose (self->fd); self->fd = -1; } @@ -945,7 +1255,8 @@ } if (self->fd >= 0) { - drmClose (self->fd); + if (self->is_internal_fd) + drmClose (self->fd); self->fd = -1; } @@ -1140,6 +1451,10 @@ if (GST_VIDEO_SINK_WIDTH (self) <= 0 || GST_VIDEO_SINK_HEIGHT (self) <= 0) goto invalid_size; +#ifdef HAVE_DRM_HDR + gst_kms_sink_set_hdr10_caps (self, caps); +#endif + /* discard dumb buffer pool */ if (self->pool) { gst_buffer_pool_set_active (self->pool, FALSE); @@ -1657,6 +1972,10 @@ src.w = result.w; src.h = result.h; } +#ifdef HAVE_DRM_HDR + /* Send the HDR infoframes if appropriate */ + gst_kms_push_hdr_infoframe (self, FALSE); +#endif GST_TRACE_OBJECT (self, "drmModeSetPlane at (%i,%i) %ix%i sourcing at (%i,%i) %ix%i", @@ -1676,7 +1995,7 @@ sync_frame: /* Wait for the previous frame to complete redraw */ - if (!gst_kms_sink_sync (self)) { + if (!self->skip_vsync && !gst_kms_sink_sync (self)) { GST_OBJECT_UNLOCK (self); goto bail; } @@ -1776,6 +2095,51 @@ } static void +_validate_and_set_external_fd (GstKMSSink * self, gint fd) +{ + if (self->devname) { + GST_WARNING_OBJECT (self, "Can't set fd... %s already set.", + g_param_spec_get_name (g_propertiesPROP_DRIVER_NAME)); + return; + } + + if (self->bus_id) { + GST_WARNING_OBJECT (self, "Can't set fd... %s already set.", + g_param_spec_get_name (g_propertiesPROP_BUS_ID)); + return; + } + + if (self->fd >= 0) { + GST_WARNING_OBJECT (self, "Can't set fd... it is already set."); + return; + } + + if (fd >= 0) { + self->devname = drmGetDeviceNameFromFd (fd); + if (!self->devname) { + GST_WARNING_OBJECT (self, "Failed to verify fd is a DRM fd."); + return; + } + + self->fd = fd; + self->is_internal_fd = FALSE; + } +} + +static void +_invalidate_external_fd (GstKMSSink * self, GParamSpec * pspec) +{ + if (self->is_internal_fd) + return; + + GST_WARNING_OBJECT (self, "Unsetting fd... %s has priority.", + g_param_spec_get_name (pspec)); + + self->fd = -1; + self->is_internal_fd = TRUE; +} + +static void gst_kms_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { @@ -1785,10 +2149,12 @@ switch (prop_id) { case PROP_DRIVER_NAME: + _invalidate_external_fd (sink, pspec); g_free (sink->devname); sink->devname = g_value_dup_string (value); break; case PROP_BUS_ID: + _invalidate_external_fd (sink, pspec); g_free (sink->bus_id); sink->bus_id = g_value_dup_string (value); break; @@ -1827,6 +2193,12 @@ break; } + case PROP_FD: + _validate_and_set_external_fd (sink, g_value_get_int (value)); + break; + case PROP_SKIP_VSYNC: + sink->skip_vsync = g_value_get_boolean (value); + break; default: if (!gst_video_overlay_set_property (object, PROP_N, prop_id, value)) G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -1880,6 +2252,12 @@ case PROP_PLANE_PROPS: gst_value_set_structure (value, sink->plane_props); break; + case PROP_FD: + g_value_set_int (value, sink->fd); + break; + case PROP_SKIP_VSYNC: + g_value_set_boolean (value, sink->skip_vsync); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1906,12 +2284,25 @@ gst_kms_sink_init (GstKMSSink * sink) { sink->fd = -1; + sink->is_internal_fd = TRUE; sink->conn_id = -1; sink->plane_id = -1; sink->can_scale = TRUE; gst_poll_fd_init (&sink->pollfd); sink->poll = gst_poll_new (TRUE); gst_video_info_init (&sink->vinfo); + sink->skip_vsync = FALSE; + +#ifdef HAVE_DRM_HDR + sink->no_infoframe = FALSE; + sink->has_hdr_info = FALSE; + sink->has_sent_hdrif = FALSE; + sink->edidPropID = 0; + sink->hdrPropID = 0; + sink->colorimetry = HDMI_EOTF_TRADITIONAL_GAMMA_SDR; + gst_video_mastering_display_info_init (&sink->hdr_minfo); + gst_video_content_light_level_init (&sink->hdr_cll); +#endif } static void @@ -2078,6 +2469,33 @@ "Additional properties for the plane", GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + /** + * kmssink:fd: + * + * You can supply your own DRM file descriptor. By default, the sink will + * open its own DRM file descriptor. + * + * Since: 1.22 + */ + g_propertiesPROP_FD = + g_param_spec_int ("fd", "File Descriptor", + "DRM file descriptor", -1, G_MAXINT, -1, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); + + /** + * kmssink:skip-vsync: + * + * For some cases, to suppress internal vsync, which can drop framerate + * in half, set this to 1. + * + * Since: 1.22 + */ + g_propertiesPROP_SKIP_VSYNC = + g_param_spec_boolean ("skip-vsync", "Skip Internal VSync", + "When enabled will not wait internally for vsync. " + "Should be used for atomic drivers to avoid double vsync.", FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); + g_object_class_install_properties (gobject_class, PROP_N, g_properties); gst_video_overlay_install_properties (gobject_class, PROP_N);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/kms/gstkmssink.h -> gst-plugins-bad-1.22.0.tar.xz/sys/kms/gstkmssink.h
Changed
@@ -27,6 +27,7 @@ #define __GST_KMS_SINK_H__ #include <gst/video/gstvideosink.h> +#include <gst/video/video-hdr.h> G_BEGIN_DECLS @@ -93,6 +94,21 @@ /* reconfigure info if driver doesn't scale */ GstVideoRectangle pending_rect; gboolean reconfigure; + + gboolean is_internal_fd; + gboolean skip_vsync; + +#ifdef HAVE_DRM_HDR + /* HDR mastering related structure */ + gboolean no_infoframe; + gboolean has_hdr_info; + gboolean has_sent_hdrif; + guint32 edidPropID; + guint32 hdrPropID; + gchar colorimetry; + GstVideoMasteringDisplayInfo hdr_minfo; + GstVideoContentLightLevel hdr_cll; +#endif }; struct _GstKMSSinkClass {
View file
gst-plugins-bad-1.20.5.tar.xz/sys/kms/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/kms/meson.build
Changed
@@ -4,6 +4,7 @@ 'gstkmssink.c', 'gstkmsutils.c', +extra_deps = if host_system != 'linux' subdir_done() @@ -12,15 +13,24 @@ libdrm_dep = dependency('libdrm', version : '>= 2.4.98', required : get_option('kms'), fallback: 'libdrm', 'ext_libdrm') +libdrm_hdr_dep = dependency('libdrm', version : '>= 2.4.104', + required : false, + fallback: 'libdrm', 'ext_libdrm') +mathlib = cc.find_library('m', required : false) + +if libdrm_hdr_dep.found() and mathlib.found() + cdata.set('HAVE_DRM_HDR', 1) + kmssink_sources += 'gstkmsedid.c' +endif + if libdrm_dep.found() gstkmssink = library('gstkms', kmssink_sources, c_args : gst_plugins_bad_args, include_directories : configinc, - dependencies : gstbase_dep, gstvideo_dep, gstallocators_dep, libdrm_dep, + dependencies : gstbase_dep, gstvideo_dep, gstallocators_dep, libdrm_dep, mathlib, install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstkmssink, install_dir : plugins_pkgconfig_install_dir) plugins += gstkmssink endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/magicleap/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/magicleap/meson.build
Changed
@@ -22,6 +22,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstmagicleap, install_dir : plugins_pkgconfig_install_dir) plugins += gstmagicleap endif
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfaacdec.cpp
Added
@@ -0,0 +1,380 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-mfaacdec + * @title: mfaacdec + * + * This element decodes AAC compressed data into RAW audio data. + * + * Since: 1.22 + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include <gst/pbutils/pbutils.h> +#include "gstmfaudiodecoder.h" +#include "gstmfaacdec.h" +#include <wrl.h> +#include <string.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +GST_DEBUG_CATEGORY (gst_mf_aac_dec_debug); +#define GST_CAT_DEFAULT gst_mf_aac_dec_debug + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " + "mpegversion = (int) {2, 4}, " + "stream-format = (string) raw, framed = (boolean) true, " + "channels = (int) 1, 6, rate = (int) 8000, 48000") + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " GST_AUDIO_NE (S16) ", " + "layout = (string) interleaved, " + "channels = (int) 1, 6, rate = (int) 8000, 48000") + ); + +typedef struct _GstMFAacDec +{ + GstMFAudioDecoder parent; +} GstMFAacDec; + +typedef struct _GstMFAacDecClass +{ + GstMFAudioDecoderClass parent_class; +} GstMFAacDecClass; + +static GTypeClass *parent_class = nullptr; + +static gboolean gst_mf_aac_dec_set_format (GstMFAudioDecoder * decoder, + GstMFTransform * transform, GstCaps * caps); + +static void +gst_mf_aac_dec_class_init (GstMFAacDecClass * klass, gpointer data) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstMFAudioDecoderClass *decoder_class = GST_MF_AUDIO_DECODER_CLASS (klass); + GstMFAudioDecoderClassData *cdata = (GstMFAudioDecoderClassData *) data; + gchar *long_name; + + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + + long_name = g_strdup_printf ("Media Foundation %s", cdata->device_name); + gst_element_class_set_metadata (element_class, long_name, + "Codec/Decoder/Audio", + "Microsoft Media Foundation AAC Decoder", + "Seungha Yang <seungha@centricular.com>"); + g_free (long_name); + + gst_element_class_add_static_pad_template (element_class, &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_mf_aac_dec_set_format); + + decoder_class->codec_id = MFAudioFormat_AAC; + decoder_class->enum_flags = cdata->enum_flags; + decoder_class->device_index = cdata->device_index; + + g_free (cdata->device_name); + g_free (cdata); +} + +static void +gst_mf_aac_dec_init (GstMFAacDec * self) +{ +} + +/* Portion of HEAACWAVEINFO struct after wfx field + * plus 2 bytes AudioSpecificConfig() */ +typedef struct +{ + WORD wPayloadType; + WORD wAudioProfileLevelIndication; + WORD wStructType; + WORD wReserved1; + DWORD dwReserved2; + + WORD AudioSpecificConfig; +} AACWaveInfo; + +static gboolean +gst_mf_aac_dec_set_format (GstMFAudioDecoder * decoder, + GstMFTransform * transform, GstCaps * caps) +{ + GstMFAacDec *self = (GstMFAacDec *) decoder; + HRESULT hr; + const GValue *value; + GstStructure *structure; + GstBuffer *codec_data; + ComPtr < IMFMediaType > in_type; + ComPtr < IMFMediaType > out_type; + AACWaveInfo wave_info; + GstMapInfo map_info; + guint channels, rate; + const guint8 *data; + GstAudioInfo in_audio_info, out_audio_info; + GList *output_list, *iter; + GstCaps *out_caps; + + G_STATIC_ASSERT (sizeof (AACWaveInfo) >= 12); + + if (!gst_audio_info_from_caps (&in_audio_info, caps)) { + GST_ERROR_OBJECT (self, "Failed to get audio info from caps"); + return FALSE; + } + + structure = gst_caps_get_structure (caps, 0); + value = gst_structure_get_value (structure, "codec_data"); + if (!value) { + GST_ERROR_OBJECT (self, "Missing codec_data"); + return FALSE; + } + + codec_data = gst_value_get_buffer (value); + if (!codec_data || gst_buffer_get_size (codec_data) < 2) { + GST_ERROR_OBJECT (self, "Invalid codec_data"); + return FALSE; + } + + if (!gst_buffer_map (codec_data, &map_info, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Invalid codec_data buffer"); + return FALSE; + } + + data = (guint8 *) map_info.data; + channels = gst_codec_utils_aac_get_channels (data, map_info.size); + rate = gst_codec_utils_aac_get_sample_rate (data, map_info.size); + + /* Fallback to channels/rate values specified in caps */ + if (channels == 0) + channels = in_audio_info.channels; + + if (rate == 0) + rate = in_audio_info.rate; + + memset (&wave_info, 0, sizeof (AACWaveInfo)); + wave_info.wAudioProfileLevelIndication = 0xfe; + memcpy (&wave_info.AudioSpecificConfig, data, 2); + + hr = MFCreateMediaType (&in_type); + if (!gst_mf_result (hr)) + return FALSE; + + hr = in_type->SetGUID (MF_MT_MAJOR_TYPE, MFMediaType_Audio); + if (!gst_mf_result (hr)) + return FALSE; + + hr = in_type->SetGUID (MF_MT_SUBTYPE, MFAudioFormat_AAC); + if (!gst_mf_result (hr)) + return FALSE; + + hr = in_type->SetUINT32 (MF_MT_AAC_PAYLOAD_TYPE, 0); + if (!gst_mf_result (hr)) + return FALSE; + + hr = in_type->SetUINT32 (MF_MT_AUDIO_NUM_CHANNELS, channels); + if (!gst_mf_result (hr)) + return FALSE; + + hr = in_type->SetUINT32 (MF_MT_AUDIO_SAMPLES_PER_SECOND, rate); + if (!gst_mf_result (hr)) + return FALSE; + + /* FIXME: should parse this somehow? */ + hr = in_type->SetUINT32 (MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION, 0xfe); + if (!gst_mf_result (hr)) + return FALSE; + + hr = in_type->SetBlob (MF_MT_USER_DATA, (UINT8 *) & wave_info, 12); + if (!gst_mf_result (hr)) + return FALSE; + + if (!gst_mf_transform_set_input_type (transform, in_type.Get ())) { + GST_ERROR_OBJECT (self, "Failed to set format"); + return FALSE; + } + + if (!gst_mf_transform_get_output_available_types (transform, &output_list)) { + GST_ERROR_OBJECT (self, "Failed to get output types"); + return FALSE; + } + + for (iter = output_list; iter; iter = g_list_next (iter)) { + GUID guid; + IMFMediaType *type = (IMFMediaType *) iter->data; + UINT32 bps; + + hr = type->GetGUID (MF_MT_MAJOR_TYPE, &guid); + if (!gst_mf_result (hr)) + continue; + + if (!IsEqualGUID (guid, MFMediaType_Audio)) + continue; + + hr = type->GetGUID (MF_MT_SUBTYPE, &guid); + if (!gst_mf_result (hr)) + continue; + + if (!IsEqualGUID (guid, MFAudioFormat_PCM)) + continue; + + hr = type->GetUINT32 (MF_MT_AUDIO_BITS_PER_SAMPLE, &bps); + if (!gst_mf_result (hr)) + continue; + + if (bps != 16) + continue; + + out_type = type; + break; + } + + g_list_free_full (output_list, (GDestroyNotify) gst_mf_media_type_release); + + if (!out_type) { + GST_ERROR_OBJECT (self, "Failed to select output type"); + return FALSE; + } + + if (!gst_mf_transform_set_output_type (transform, out_type.Get ())) { + GST_ERROR_OBJECT (self, "Failed to select output type"); + return FALSE; + } + + out_caps = gst_mf_media_type_to_caps (out_type.Get ()); + if (!out_caps) { + GST_ERROR_OBJECT (self, "Failed to get output caps"); + return FALSE; + } + + GST_DEBUG_OBJECT (self, "Output caps %" GST_PTR_FORMAT, out_caps); + + if (!gst_audio_info_from_caps (&out_audio_info, out_caps)) { + GST_ERROR_OBJECT (self, + "Failed to convert caps to audio info %" GST_PTR_FORMAT, out_caps); + gst_caps_unref (out_caps); + } + + gst_caps_unref (out_caps); + + return gst_audio_decoder_set_output_format (GST_AUDIO_DECODER (self), + &out_audio_info); +} + +static void +gst_mf_aac_dec_register (GstPlugin * plugin, guint rank, + const gchar * device_name, guint32 enum_flags, guint device_index) +{ + GType type; + GstMFAudioDecoderClassData *cdata; + GTypeInfo type_info = { + sizeof (GstMFAacDecClass), + nullptr, + nullptr, + (GClassInitFunc) gst_mf_aac_dec_class_init, + nullptr, + nullptr, + sizeof (GstMFAacDec), + 0, + (GInstanceInitFunc) gst_mf_aac_dec_init, + }; + + cdata = g_new0 (GstMFAudioDecoderClassData, 1); + cdata->device_name = g_strdup (device_name); + cdata->enum_flags = enum_flags; + cdata->device_index = device_index; + type_info.class_data = cdata; + + type = g_type_register_static (GST_TYPE_MF_AUDIO_DECODER, "GstMFAacDec", + &type_info, (GTypeFlags) 0); + + if (!gst_element_register (plugin, "mfaacdec", rank, type)) + GST_WARNING ("Failed to register plugin"); +} + +static gboolean +gst_mf_aac_dec_plugin_init_internal (GstPlugin * plugin, guint rank, + GstMFTransform * transform, guint device_index, guint32 enum_flags) +{ + gchar *device_name = nullptr; + + if (!gst_mf_transform_open (transform)) + return FALSE; + + g_object_get (transform, "device-name", &device_name, nullptr); + if (!device_name) { + GST_WARNING_OBJECT (transform, "Unknown device name"); + return FALSE; + } + + gst_mf_aac_dec_register (plugin, rank, device_name, enum_flags, device_index); + g_free (device_name); + + return TRUE; +} + +void +gst_mf_aac_dec_plugin_init (GstPlugin * plugin, guint rank) +{ + GstMFTransformEnumParams enum_params = { 0, }; + MFT_REGISTER_TYPE_INFO input_type; + GstMFTransform *transform; + gint i; + gboolean do_next; + + GST_DEBUG_CATEGORY_INIT (gst_mf_aac_dec_debug, "mfaacdec", 0, "mfaacdec"); + + input_type.guidMajorType = MFMediaType_Audio; + input_type.guidSubtype = MFAudioFormat_AAC; + + enum_params.category = MFT_CATEGORY_AUDIO_DECODER; + enum_params.enum_flags = (MFT_ENUM_FLAG_SYNCMFT | + MFT_ENUM_FLAG_SORTANDFILTER | MFT_ENUM_FLAG_SORTANDFILTER_APPROVED_ONLY); + enum_params.input_typeinfo = &input_type; + + i = 0; + do { + enum_params.device_index = i++; + transform = gst_mf_transform_new (&enum_params); + do_next = TRUE; + + if (!transform) { + do_next = FALSE; + } else { + if (gst_mf_aac_dec_plugin_init_internal (plugin, rank, transform, + enum_params.device_index, enum_params.enum_flags)) { + do_next = FALSE; + } + gst_clear_object (&transform); + } + } while (do_next); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfaacdec.h
Added
@@ -0,0 +1,30 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> + +G_BEGIN_DECLS + +void gst_mf_aac_dec_plugin_init (GstPlugin * plugin, + guint rank); + +G_END_DECLS +
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfaacenc.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfaacenc.cpp
Changed
@@ -36,7 +36,7 @@ #include <gst/gst.h> #include <gst/pbutils/pbutils.h> -#include "gstmfaudioenc.h" +#include "gstmfaudioencoder.h" #include "gstmfaacenc.h" #include <wrl.h> #include <set> @@ -60,7 +60,7 @@ typedef struct _GstMFAacEnc { - GstMFAudioEnc parent; + GstMFAudioEncoder parent; /* properties */ guint bitrate; @@ -68,7 +68,7 @@ typedef struct _GstMFAacEncClass { - GstMFAudioEncClass parent_class; + GstMFAudioEncoderClass parent_class; } GstMFAacEncClass; @@ -84,17 +84,17 @@ } GstMFAacEncClassData; /* *INDENT-ON* */ -static GstElementClass *parent_class = NULL; +static GstElementClass *parent_class = nullptr; static void gst_mf_aac_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_mf_aac_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static gboolean gst_mf_aac_enc_get_output_type (GstMFAudioEnc * mfenc, +static gboolean gst_mf_aac_enc_get_output_type (GstMFAudioEncoder * encoder, GstAudioInfo * info, IMFMediaType ** output_type); -static gboolean gst_mf_aac_enc_get_input_type (GstMFAudioEnc * mfenc, +static gboolean gst_mf_aac_enc_get_input_type (GstMFAudioEncoder * encoder, GstAudioInfo * info, IMFMediaType ** input_type); -static gboolean gst_mf_aac_enc_set_src_caps (GstMFAudioEnc * mfenc, +static gboolean gst_mf_aac_enc_set_src_caps (GstMFAudioEncoder * encoder, GstAudioInfo * info); static void @@ -102,7 +102,7 @@ { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstMFAudioEncClass *mfenc_class = GST_MF_AUDIO_ENC_CLASS (klass); + GstMFAudioEncoderClass *encoder_class = GST_MF_AUDIO_ENCODER_CLASS (klass); GstMFAacEncClassData *cdata = (GstMFAacEncClassData *) data; gchar *long_name; gchar *classification; @@ -149,16 +149,16 @@ gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps)); - mfenc_class->get_output_type = + encoder_class->get_output_type = GST_DEBUG_FUNCPTR (gst_mf_aac_enc_get_output_type); - mfenc_class->get_input_type = + encoder_class->get_input_type = GST_DEBUG_FUNCPTR (gst_mf_aac_enc_get_input_type); - mfenc_class->set_src_caps = GST_DEBUG_FUNCPTR (gst_mf_aac_enc_set_src_caps); + encoder_class->set_src_caps = GST_DEBUG_FUNCPTR (gst_mf_aac_enc_set_src_caps); - mfenc_class->codec_id = MFAudioFormat_AAC; - mfenc_class->enum_flags = cdata->enum_flags; - mfenc_class->device_index = cdata->device_index; - mfenc_class->frame_samples = 1024; + encoder_class->codec_id = MFAudioFormat_AAC; + encoder_class->enum_flags = cdata->enum_flags; + encoder_class->device_index = cdata->device_index; + encoder_class->frame_samples = 1024; g_free (cdata->device_name); gst_caps_unref (cdata->sink_caps); @@ -205,12 +205,12 @@ } static gboolean -gst_mf_aac_enc_get_output_type (GstMFAudioEnc * mfenc, GstAudioInfo * info, - IMFMediaType ** output_type) +gst_mf_aac_enc_get_output_type (GstMFAudioEncoder * encoder, + GstAudioInfo * info, IMFMediaType ** output_type) { - GstMFAacEnc *self = (GstMFAacEnc *) mfenc; - GstMFTransform *transform = mfenc->transform; - GList *output_list = NULL; + GstMFAacEnc *self = (GstMFAacEnc *) encoder; + GstMFTransform *transform = encoder->transform; + GList *output_list = nullptr; GList *iter; ComPtr < IMFMediaType > target_output; std::vector < ComPtr < IMFMediaType >> filtered_types; @@ -355,12 +355,12 @@ } static gboolean -gst_mf_aac_enc_get_input_type (GstMFAudioEnc * mfenc, GstAudioInfo * info, +gst_mf_aac_enc_get_input_type (GstMFAudioEncoder * encoder, GstAudioInfo * info, IMFMediaType ** input_type) { - GstMFAacEnc *self = (GstMFAacEnc *) mfenc; - GstMFTransform *transform = mfenc->transform; - GList *input_list = NULL; + GstMFAacEnc *self = (GstMFAacEnc *) encoder; + GstMFTransform *transform = encoder->transform; + GList *input_list = nullptr; GList *iter; ComPtr < IMFMediaType > target_input; std::vector < ComPtr < IMFMediaType >> filtered_types; @@ -432,19 +432,19 @@ } static gboolean -gst_mf_aac_enc_set_src_caps (GstMFAudioEnc * mfenc, GstAudioInfo * info) +gst_mf_aac_enc_set_src_caps (GstMFAudioEncoder * encoder, GstAudioInfo * info) { - GstMFAacEnc *self = (GstMFAacEnc *) mfenc; + GstMFAacEnc *self = (GstMFAacEnc *) encoder; HRESULT hr; GstCaps *src_caps; GstBuffer *codec_data; - UINT8 *blob = NULL; + UINT8 *blob = nullptr; UINT32 blob_size = 0; gboolean ret; ComPtr < IMFMediaType > output_type; static const guint config_data_offset = 12; - if (!gst_mf_transform_get_output_current_type (mfenc->transform, + if (!gst_mf_transform_get_output_current_type (encoder->transform, &output_type)) { GST_ERROR_OBJECT (self, "Couldn't get current output type"); return FALSE; @@ -481,7 +481,7 @@ "channels", G_TYPE_INT, GST_AUDIO_INFO_CHANNELS (info), "rate", G_TYPE_INT, GST_AUDIO_INFO_RATE (info), "framed", G_TYPE_BOOLEAN, TRUE, - "codec_data", GST_TYPE_BUFFER, codec_data, NULL); + "codec_data", GST_TYPE_BUFFER, codec_data, nullptr); gst_buffer_unref (codec_data); gst_codec_utils_aac_caps_set_level_and_profile (src_caps, @@ -513,11 +513,11 @@ gboolean is_default = TRUE; GTypeInfo type_info = { sizeof (GstMFAacEncClass), - NULL, - NULL, + nullptr, + nullptr, (GClassInitFunc) gst_mf_aac_enc_class_init, - NULL, - NULL, + nullptr, + nullptr, sizeof (GstMFAacEnc), 0, (GInstanceInitFunc) gst_mf_aac_enc_init, @@ -546,7 +546,7 @@ } type = - g_type_register_static (GST_TYPE_MF_AUDIO_ENC, type_name, &type_info, + g_type_register_static (GST_TYPE_MF_AUDIO_ENCODER, type_name, &type_info, (GTypeFlags) 0); /* make lower rank than default device */ @@ -566,10 +566,10 @@ { HRESULT hr; gint i; - GstCaps *src_caps = NULL; - GstCaps *sink_caps = NULL; - gchar *device_name = NULL; - GList *output_list = NULL; + GstCaps *src_caps = nullptr; + GstCaps *sink_caps = nullptr; + gchar *device_name = nullptr; + GList *output_list = nullptr; GList *iter; std::set < UINT32 > channels_list; std::set < UINT32 > rate_list; @@ -581,7 +581,7 @@ if (!gst_mf_transform_open (transform)) return; - g_object_get (transform, "device-name", &device_name, NULL); + g_object_get (transform, "device-name", &device_name, nullptr); if (!device_name) { GST_WARNING_OBJECT (transform, "Unknown device name"); return;
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfaudiodecoder.cpp
Added
@@ -0,0 +1,292 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include "gstmfaudiodecoder.h" +#include <wrl.h> +#include <string.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +GST_DEBUG_CATEGORY (gst_mf_audio_decoder_debug); +#define GST_CAT_DEFAULT gst_mf_audio_decoder_debug + +/** + * GstMFAudioDecoder: + * + * Base class for MediaFoundation audio decoders + * + * Since: 1.22 + */ +#define gst_mf_audio_decoder_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstMFAudioDecoder, gst_mf_audio_decoder, + GST_TYPE_AUDIO_DECODER, + GST_DEBUG_CATEGORY_INIT (gst_mf_audio_decoder_debug, "mfaudiodecoder", 0, + "mfaudiodecoder")); + +static gboolean gst_mf_audio_decoder_open (GstAudioDecoder * dec); +static gboolean gst_mf_audio_decoder_close (GstAudioDecoder * dec); +static gboolean gst_mf_audio_decoder_set_format (GstAudioDecoder * dec, + GstCaps * caps); +static GstFlowReturn gst_mf_audio_decoder_handle_frame (GstAudioDecoder * dec, + GstBuffer * buffer); +static GstFlowReturn gst_mf_audio_decoder_drain (GstAudioDecoder * dec); +static void gst_mf_audio_decoder_flush (GstAudioDecoder * dec, gboolean hard); + +static void +gst_mf_audio_decoder_class_init (GstMFAudioDecoderClass * klass) +{ + GstAudioDecoderClass *audiodec_class = GST_AUDIO_DECODER_CLASS (klass); + + audiodec_class->open = GST_DEBUG_FUNCPTR (gst_mf_audio_decoder_open); + audiodec_class->close = GST_DEBUG_FUNCPTR (gst_mf_audio_decoder_close); + audiodec_class->set_format = + GST_DEBUG_FUNCPTR (gst_mf_audio_decoder_set_format); + audiodec_class->handle_frame = + GST_DEBUG_FUNCPTR (gst_mf_audio_decoder_handle_frame); + audiodec_class->flush = GST_DEBUG_FUNCPTR (gst_mf_audio_decoder_flush); + + gst_type_mark_as_plugin_api (GST_TYPE_MF_AUDIO_DECODER, + (GstPluginAPIFlags) 0); +} + +static void +gst_mf_audio_decoder_init (GstMFAudioDecoder * self) +{ + gst_audio_decoder_set_drainable (GST_AUDIO_DECODER (self), TRUE); +} + +static gboolean +gst_mf_audio_decoder_open (GstAudioDecoder * dec) +{ + GstMFAudioDecoder *self = GST_MF_AUDIO_DECODER (dec); + GstMFAudioDecoderClass *klass = GST_MF_AUDIO_DECODER_GET_CLASS (dec); + GstMFTransformEnumParams enum_params = { 0, }; + MFT_REGISTER_TYPE_INFO input_type; + + input_type.guidMajorType = MFMediaType_Audio; + input_type.guidSubtype = klass->codec_id; + + enum_params.category = MFT_CATEGORY_AUDIO_DECODER; + enum_params.enum_flags = klass->enum_flags; + enum_params.input_typeinfo = &input_type; + enum_params.device_index = klass->device_index; + + GST_DEBUG_OBJECT (self, "Create MFT with enum flags 0x%x, device index %d", + klass->enum_flags, klass->device_index); + + self->transform = gst_mf_transform_new (&enum_params); + if (!self->transform) { + GST_ERROR_OBJECT (self, "Cannot create MFT object"); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_mf_audio_decoder_close (GstAudioDecoder * dec) +{ + GstMFAudioDecoder *self = GST_MF_AUDIO_DECODER (dec); + + gst_clear_object (&self->transform); + + return TRUE; +} + +static gboolean +gst_mf_audio_decoder_set_format (GstAudioDecoder * dec, GstCaps * caps) +{ + GstMFAudioDecoder *self = GST_MF_AUDIO_DECODER (dec); + GstMFAudioDecoderClass *klass = GST_MF_AUDIO_DECODER_GET_CLASS (dec); + + g_assert (klass->set_format != nullptr); + + GST_DEBUG_OBJECT (self, "Set format"); + + gst_mf_audio_decoder_drain (dec); + + if (!gst_mf_transform_open (self->transform)) { + GST_ERROR_OBJECT (self, "Failed to open MFT"); + return FALSE; + } + + if (!klass->set_format (self, self->transform, caps)) { + GST_ERROR_OBJECT (self, "Failed to set format"); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_mf_audio_decoder_process_input (GstMFAudioDecoder * self, + GstBuffer * buffer) +{ + HRESULT hr; + ComPtr < IMFSample > sample; + ComPtr < IMFMediaBuffer > media_buffer; + BYTE *data; + gboolean res = FALSE; + GstMapInfo info; + + if (!gst_buffer_map (buffer, &info, GST_MAP_READ)) { + GST_ELEMENT_ERROR (self, + RESOURCE, READ, ("Couldn't map input buffer"), (nullptr)); + return FALSE; + } + + GST_TRACE_OBJECT (self, "Process buffer %" GST_PTR_FORMAT, buffer); + + hr = MFCreateSample (&sample); + if (!gst_mf_result (hr)) + goto done; + + hr = MFCreateMemoryBuffer (info.size, &media_buffer); + if (!gst_mf_result (hr)) + goto done; + + hr = media_buffer->Lock (&data, nullptr, nullptr); + if (!gst_mf_result (hr)) + goto done; + + memcpy (data, info.data, info.size); + media_buffer->Unlock (); + + hr = media_buffer->SetCurrentLength (info.size); + if (!gst_mf_result (hr)) + goto done; + + hr = sample->AddBuffer (media_buffer.Get ()); + if (!gst_mf_result (hr)) + goto done; + + if (!gst_mf_transform_process_input (self->transform, sample.Get ())) { + GST_ERROR_OBJECT (self, "Failed to process input"); + goto done; + } + + res = TRUE; + +done: + gst_buffer_unmap (buffer, &info); + + return res; +} + +static GstFlowReturn +gst_mf_audio_decoder_process_output (GstMFAudioDecoder * self) +{ + HRESULT hr; + BYTE *data = nullptr; + ComPtr < IMFMediaBuffer > media_buffer; + ComPtr < IMFSample > sample; + GstBuffer *buffer; + GstFlowReturn res = GST_FLOW_ERROR; + DWORD buffer_len = 0; + + res = gst_mf_transform_get_output (self->transform, &sample); + + if (res != GST_FLOW_OK) + return res; + + hr = sample->GetBufferByIndex (0, &media_buffer); + if (!gst_mf_result (hr)) + return GST_FLOW_ERROR; + + hr = media_buffer->Lock (&data, nullptr, &buffer_len); + if (!gst_mf_result (hr)) + return GST_FLOW_ERROR; + + /* Can happen while draining */ + if (buffer_len == 0 || !data) { + GST_DEBUG_OBJECT (self, "Empty media buffer"); + media_buffer->Unlock (); + return GST_FLOW_OK; + } + + buffer = gst_audio_decoder_allocate_output_buffer (GST_AUDIO_DECODER (self), + buffer_len); + gst_buffer_fill (buffer, 0, data, buffer_len); + media_buffer->Unlock (); + + return gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (self), buffer, 1); +} + +static GstFlowReturn +gst_mf_audio_decoder_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer) +{ + GstMFAudioDecoder *self = GST_MF_AUDIO_DECODER (dec); + GstFlowReturn ret; + + if (!buffer) + return gst_mf_audio_decoder_drain (dec); + + if (!gst_mf_audio_decoder_process_input (self, buffer)) { + GST_ERROR_OBJECT (self, "Failed to process input"); + return GST_FLOW_ERROR; + } + + do { + ret = gst_mf_audio_decoder_process_output (self); + } while (ret == GST_FLOW_OK); + + if (ret == GST_MF_TRANSFORM_FLOW_NEED_DATA) + ret = GST_FLOW_OK; + + return ret; +} + +static GstFlowReturn +gst_mf_audio_decoder_drain (GstAudioDecoder * dec) +{ + GstMFAudioDecoder *self = GST_MF_AUDIO_DECODER (dec); + GstFlowReturn ret = GST_FLOW_OK; + + if (!self->transform) + return GST_FLOW_OK; + + gst_mf_transform_drain (self->transform); + + do { + ret = gst_mf_audio_decoder_process_output (self); + } while (ret == GST_FLOW_OK); + + if (ret == GST_MF_TRANSFORM_FLOW_NEED_DATA) + ret = GST_FLOW_OK; + + return ret; +} + +static void +gst_mf_audio_decoder_flush (GstAudioDecoder * dec, gboolean hard) +{ + GstMFAudioDecoder *self = GST_MF_AUDIO_DECODER (dec); + + if (!self->transform) + return; + + gst_mf_transform_flush (self->transform); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfaudiodecoder.h
Added
@@ -0,0 +1,69 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/audio/audio.h> +#include "gstmfutils.h" +#include "gstmftransform.h" + +G_BEGIN_DECLS + +#define GST_TYPE_MF_AUDIO_DECODER (gst_mf_audio_decoder_get_type()) +#define GST_MF_AUDIO_DECODER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MF_AUDIO_DECODER,GstMFAudioDecoder)) +#define GST_MF_AUDIO_DECODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_MF_AUDIO_DECODER,GstMFAudioDecoderClass)) +#define GST_MF_AUDIO_DECODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_MF_AUDIO_DECODER,GstMFAudioDecoderClass)) +#define GST_IS_MF_AUDIO_DECODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MF_AUDIO_DECODER)) +#define GST_IS_MF_AUDIO_DECODER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_MF_AUDIO_DECODER)) + +typedef struct _GstMFAudioDecoder GstMFAudioDecoder; +typedef struct _GstMFAudioDecoderClass GstMFAudioDecoderClass; + +typedef struct +{ + gchar * device_name; + guint32 enum_flags; + guint device_index; +} GstMFAudioDecoderClassData; + +struct _GstMFAudioDecoder +{ + GstAudioDecoder parent; + + GstMFTransform *transform; +}; + +struct _GstMFAudioDecoderClass +{ + GstAudioDecoderClass parent_class; + + GUID codec_id; + guint32 enum_flags; + guint device_index; + + gboolean (*set_format) (GstMFAudioDecoder * decoder, + GstMFTransform * transform, + GstCaps * caps); +}; + +GType gst_mf_audio_decoder_get_type (void); + +G_END_DECLS +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfaudioencoder.cpp
Added
@@ -0,0 +1,346 @@ +/* GStreamer + * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include "gstmfaudioencoder.h" +#include <wrl.h> +#include <string.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +GST_DEBUG_CATEGORY (gst_mf_audio_encoder_debug); +#define GST_CAT_DEFAULT gst_mf_audio_encoder_debug + +/** + * GstMFAudioEncoder: + * + * Base class for MediaFoundation audio encoders + * + * Since: 1.22 + */ +#define gst_mf_audio_encoder_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstMFAudioEncoder, gst_mf_audio_encoder, + GST_TYPE_AUDIO_ENCODER, + GST_DEBUG_CATEGORY_INIT (gst_mf_audio_encoder_debug, "mfaudioencoder", 0, + "mfaudioencoder")); + +static gboolean gst_mf_audio_encoder_open (GstAudioEncoder * enc); +static gboolean gst_mf_audio_encoder_close (GstAudioEncoder * enc); +static gboolean gst_mf_audio_encoder_set_format (GstAudioEncoder * enc, + GstAudioInfo * info); +static GstFlowReturn gst_mf_audio_encoder_handle_frame (GstAudioEncoder * enc, + GstBuffer * buffer); +static GstFlowReturn gst_mf_audio_encoder_drain (GstAudioEncoder * enc); +static void gst_mf_audio_encoder_flush (GstAudioEncoder * enc); + +static void +gst_mf_audio_encoder_class_init (GstMFAudioEncoderClass * klass) +{ + GstAudioEncoderClass *audioenc_class = GST_AUDIO_ENCODER_CLASS (klass); + + audioenc_class->open = GST_DEBUG_FUNCPTR (gst_mf_audio_encoder_open); + audioenc_class->close = GST_DEBUG_FUNCPTR (gst_mf_audio_encoder_close); + audioenc_class->set_format = + GST_DEBUG_FUNCPTR (gst_mf_audio_encoder_set_format); + audioenc_class->handle_frame = + GST_DEBUG_FUNCPTR (gst_mf_audio_encoder_handle_frame); + audioenc_class->flush = GST_DEBUG_FUNCPTR (gst_mf_audio_encoder_flush); + + gst_type_mark_as_plugin_api (GST_TYPE_MF_AUDIO_ENCODER, + (GstPluginAPIFlags) 0); +} + +static void +gst_mf_audio_encoder_init (GstMFAudioEncoder * self) +{ + gst_audio_encoder_set_drainable (GST_AUDIO_ENCODER (self), TRUE); +} + +static gboolean +gst_mf_audio_encoder_open (GstAudioEncoder * enc) +{ + GstMFAudioEncoder *self = GST_MF_AUDIO_ENCODER (enc); + GstMFAudioEncoderClass *klass = GST_MF_AUDIO_ENCODER_GET_CLASS (enc); + GstMFTransformEnumParams enum_params = { 0, }; + MFT_REGISTER_TYPE_INFO output_type; + + output_type.guidMajorType = MFMediaType_Audio; + output_type.guidSubtype = klass->codec_id; + + enum_params.category = MFT_CATEGORY_AUDIO_ENCODER; + enum_params.enum_flags = klass->enum_flags; + enum_params.output_typeinfo = &output_type; + enum_params.device_index = klass->device_index; + + GST_DEBUG_OBJECT (self, "Create MFT with enum flags 0x%x, device index %d", + klass->enum_flags, klass->device_index); + + self->transform = gst_mf_transform_new (&enum_params); + if (!self->transform) { + GST_ERROR_OBJECT (self, "Cannot create MFT object"); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_mf_audio_encoder_close (GstAudioEncoder * enc) +{ + GstMFAudioEncoder *self = GST_MF_AUDIO_ENCODER (enc); + + gst_clear_object (&self->transform); + + return TRUE; +} + +static gboolean +gst_mf_audio_encoder_set_format (GstAudioEncoder * enc, GstAudioInfo * info) +{ + GstMFAudioEncoder *self = GST_MF_AUDIO_ENCODER (enc); + GstMFAudioEncoderClass *klass = GST_MF_AUDIO_ENCODER_GET_CLASS (enc); + ComPtr < IMFMediaType > in_type; + ComPtr < IMFMediaType > out_type; + + GST_DEBUG_OBJECT (self, "Set format"); + + gst_mf_audio_encoder_drain (enc); + + if (!gst_mf_transform_open (self->transform)) { + GST_ERROR_OBJECT (self, "Failed to open MFT"); + return FALSE; + } + + g_assert (klass->get_output_type != nullptr); + if (!klass->get_output_type (self, info, &out_type)) { + GST_ERROR_OBJECT (self, "subclass failed to set output type"); + return FALSE; + } + + gst_mf_dump_attributes (out_type.Get (), "Set output type", GST_LEVEL_DEBUG); + + if (!gst_mf_transform_set_output_type (self->transform, out_type.Get ())) { + GST_ERROR_OBJECT (self, "Couldn't set output type"); + return FALSE; + } + + g_assert (klass->get_input_type != nullptr); + if (!klass->get_input_type (self, info, &in_type)) { + GST_ERROR_OBJECT (self, "subclass didn't provide input type"); + return FALSE; + } + + gst_mf_dump_attributes (in_type.Get (), "Set input type", GST_LEVEL_DEBUG); + + if (!gst_mf_transform_set_input_type (self->transform, in_type.Get ())) { + GST_ERROR_OBJECT (self, "Couldn't set input media type"); + return FALSE; + } + + g_assert (klass->set_src_caps != nullptr); + if (!klass->set_src_caps (self, info)) + return FALSE; + + g_assert (klass->frame_samples > 0); + gst_audio_encoder_set_frame_samples_min (enc, klass->frame_samples); + gst_audio_encoder_set_frame_samples_max (enc, klass->frame_samples); + gst_audio_encoder_set_frame_max (enc, 1); + + /* mediafoundation encoder needs timestamp and duration */ + self->sample_count = 0; + self->sample_duration_in_mf = gst_util_uint64_scale (klass->frame_samples, + 10000000, GST_AUDIO_INFO_RATE (info)); + + GST_DEBUG_OBJECT (self, + "Calculated sample duration %" GST_TIME_FORMAT, + GST_TIME_ARGS (self->sample_duration_in_mf * 100)); + + return TRUE; +} + +static gboolean +gst_mf_audio_encoder_process_input (GstMFAudioEncoder * self, + GstBuffer * buffer) +{ + HRESULT hr; + ComPtr < IMFSample > sample; + ComPtr < IMFMediaBuffer > media_buffer; + BYTE *data; + gboolean res = FALSE; + GstMapInfo info; + guint64 timestamp; + + if (!gst_buffer_map (buffer, &info, GST_MAP_READ)) { + GST_ELEMENT_ERROR (self, + RESOURCE, READ, ("Couldn't map input buffer"), (nullptr)); + return FALSE; + } + + GST_TRACE_OBJECT (self, "Process buffer %" GST_PTR_FORMAT, buffer); + + timestamp = self->sample_count * self->sample_duration_in_mf; + + hr = MFCreateSample (&sample); + if (!gst_mf_result (hr)) + goto done; + + hr = MFCreateMemoryBuffer (info.size, &media_buffer); + if (!gst_mf_result (hr)) + goto done; + + hr = media_buffer->Lock (&data, nullptr, nullptr); + if (!gst_mf_result (hr)) + goto done; + + memcpy (data, info.data, info.size); + media_buffer->Unlock (); + + hr = media_buffer->SetCurrentLength (info.size); + if (!gst_mf_result (hr)) + goto done; + + hr = sample->AddBuffer (media_buffer.Get ()); + if (!gst_mf_result (hr)) + goto done; + + hr = sample->SetSampleTime (timestamp); + if (!gst_mf_result (hr)) + goto done; + + hr = sample->SetSampleDuration (self->sample_duration_in_mf); + if (!gst_mf_result (hr)) + goto done; + + if (!gst_mf_transform_process_input (self->transform, sample.Get ())) { + GST_ERROR_OBJECT (self, "Failed to process input"); + goto done; + } + + self->sample_count++; + + res = TRUE; + +done: + gst_buffer_unmap (buffer, &info); + + return res; +} + +static GstFlowReturn +gst_mf_audio_encoder_process_output (GstMFAudioEncoder * self) +{ + GstMFAudioEncoderClass *klass = GST_MF_AUDIO_ENCODER_GET_CLASS (self); + HRESULT hr; + BYTE *data = nullptr; + ComPtr < IMFMediaBuffer > media_buffer; + ComPtr < IMFSample > sample; + GstBuffer *buffer; + GstFlowReturn res = GST_FLOW_ERROR; + DWORD buffer_len = 0; + + res = gst_mf_transform_get_output (self->transform, &sample); + + if (res != GST_FLOW_OK) + return res; + + hr = sample->GetBufferByIndex (0, &media_buffer); + if (!gst_mf_result (hr)) + return GST_FLOW_ERROR; + + hr = media_buffer->Lock (&data, nullptr, &buffer_len); + if (!gst_mf_result (hr)) + return GST_FLOW_ERROR; + + /* Can happen while draining */ + if (buffer_len == 0 || !data) { + GST_DEBUG_OBJECT (self, "Empty media buffer"); + media_buffer->Unlock (); + return GST_FLOW_OK; + } + + buffer = gst_audio_encoder_allocate_output_buffer (GST_AUDIO_ENCODER (self), + buffer_len); + gst_buffer_fill (buffer, 0, data, buffer_len); + media_buffer->Unlock (); + + return gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (self), buffer, + klass->frame_samples); +} + +static GstFlowReturn +gst_mf_audio_encoder_handle_frame (GstAudioEncoder * enc, GstBuffer * buffer) +{ + GstMFAudioEncoder *self = GST_MF_AUDIO_ENCODER (enc); + GstFlowReturn ret; + + if (!buffer) + return gst_mf_audio_encoder_drain (enc); + + if (!gst_mf_audio_encoder_process_input (self, buffer)) { + GST_ERROR_OBJECT (self, "Failed to process input"); + return GST_FLOW_ERROR; + } + + do { + ret = gst_mf_audio_encoder_process_output (self); + } while (ret == GST_FLOW_OK); + + if (ret == GST_MF_TRANSFORM_FLOW_NEED_DATA) + ret = GST_FLOW_OK; + + return ret; +} + +static GstFlowReturn +gst_mf_audio_encoder_drain (GstAudioEncoder * enc) +{ + GstMFAudioEncoder *self = GST_MF_AUDIO_ENCODER (enc); + GstFlowReturn ret = GST_FLOW_OK; + + if (!self->transform) + return GST_FLOW_OK; + + gst_mf_transform_drain (self->transform); + + do { + ret = gst_mf_audio_encoder_process_output (self); + } while (ret == GST_FLOW_OK); + + if (ret == GST_MF_TRANSFORM_FLOW_NEED_DATA) + ret = GST_FLOW_OK; + + return ret; +} + +static void +gst_mf_audio_encoder_flush (GstAudioEncoder * enc) +{ + GstMFAudioEncoder *self = GST_MF_AUDIO_ENCODER (enc); + + if (!self->transform) + return; + + gst_mf_transform_flush (self->transform); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfaudioencoder.h
Added
@@ -0,0 +1,72 @@ +/* GStreamer + * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/audio/audio.h> +#include "gstmfutils.h" +#include "gstmftransform.h" + +G_BEGIN_DECLS + +#define GST_TYPE_MF_AUDIO_ENCODER (gst_mf_audio_encoder_get_type()) +#define GST_MF_AUDIO_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MF_AUDIO_ENCODER,GstMFAudioEncoder)) +#define GST_MF_AUDIO_ENCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_MF_AUDIO_ENCODER,GstMFAudioEncoderClass)) +#define GST_MF_AUDIO_ENCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_MF_AUDIO_ENCODER,GstMFAudioEncoderClass)) +#define GST_IS_MF_AUDIO_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MF_AUDIO_ENCODER)) +#define GST_IS_MF_AUDIO_ENCODER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_MF_AUDIO_ENCODER)) + +typedef struct _GstMFAudioEncoder GstMFAudioEncoder; +typedef struct _GstMFAudioEncoderClass GstMFAudioEncoderClass; + +struct _GstMFAudioEncoder +{ + GstAudioEncoder parent; + + GstMFTransform *transform; + guint64 sample_duration_in_mf; + guint64 sample_count; +}; + +struct _GstMFAudioEncoderClass +{ + GstAudioEncoderClass parent_class; + + GUID codec_id; + guint32 enum_flags; + guint device_index; + gint frame_samples; + + gboolean (*get_output_type) (GstMFAudioEncoder * encoder, + GstAudioInfo * info, + IMFMediaType ** output_type); + + gboolean (*get_input_type) (GstMFAudioEncoder * encoder, + GstAudioInfo * info, + IMFMediaType ** input_type); + + gboolean (*set_src_caps) (GstMFAudioEncoder * encoder, + GstAudioInfo * info); +}; + +GType gst_mf_audio_encoder_get_type (void); + +G_END_DECLS +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfcapturedshow.cpp
Added
@@ -0,0 +1,1421 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/base/base.h> +#include <gst/video/video.h> +#include "gstmfcapturedshow.h" +#include <string.h> +#include <wrl.h> +#include <dshow.h> +#include <objidl.h> +#include <string> +#include <locale> +#include <codecvt> +#include <vector> +#include <algorithm> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +GST_DEBUG_CATEGORY_EXTERN (gst_mf_source_object_debug); +#define GST_CAT_DEFAULT gst_mf_source_object_debug + +DEFINE_GUID (MEDIASUBTYPE_I420, 0x30323449, 0x0000, 0x0010, 0x80, 0x00, 0x00, + 0xAA, 0x00, 0x38, 0x9B, 0x71); + +/* From qedit.h */ +DEFINE_GUID (CLSID_SampleGrabber, 0xc1f400A0, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, + 0x60, 0x08, 0x03, 0x9e, 0x37); + +DEFINE_GUID (CLSID_NullRenderer, 0xc1f400a4, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, + 0x60, 0x08, 0x03, 0x9e, 0x37); + +/* *INDENT-OFF* */ +struct DECLSPEC_UUID("0579154a-2b53-4994-b0d0-e773148eff85") +ISampleGrabberCB : public IUnknown +{ + virtual HRESULT STDMETHODCALLTYPE SampleCB( + double SampleTime, + IMediaSample *pSample) = 0; + + virtual HRESULT STDMETHODCALLTYPE BufferCB( + double SampleTime, + BYTE *pBuffer, + LONG BufferLen) = 0; +}; + +struct DECLSPEC_UUID("6b652fff-11fe-4fce-92ad-0266b5d7c78f") +ISampleGrabber : public IUnknown +{ + virtual HRESULT STDMETHODCALLTYPE SetOneShot( + BOOL OneShot) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetMediaType( + const AM_MEDIA_TYPE *pType) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType( + AM_MEDIA_TYPE *pType) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetBufferSamples( + BOOL BufferThem) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer( + LONG *pBufferSize, + LONG *pBuffer) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetCurrentSample( + IMediaSample **ppSample) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetCallback( + ISampleGrabberCB *pCallback, + LONG WhichMethodToCallback) = 0; +}; + +typedef void (*OnBufferCB) (double sample_time, + BYTE * buffer, + LONG len, + gpointer user_data); + +class DECLSPEC_UUID("bfae6598-5df6-11ed-9b6a-0242ac120002") +IGstMFSampleGrabberCB : public ISampleGrabberCB +{ +public: + static HRESULT + CreateInstance (OnBufferCB callback, gpointer user_data, + IGstMFSampleGrabberCB ** cb) + { + IGstMFSampleGrabberCB *self = + new IGstMFSampleGrabberCB (callback, user_data); + + if (!self) + return E_OUTOFMEMORY; + + *cb = self; + + return S_OK; + } + + STDMETHODIMP_ (ULONG) + AddRef (void) + { + return InterlockedIncrement (&ref_count_); + } + + STDMETHODIMP_ (ULONG) + Release (void) + { + ULONG ref_count; + + ref_count = InterlockedDecrement (&ref_count_); + + if (ref_count == 0) + delete this; + + return ref_count; + } + + STDMETHODIMP + QueryInterface (REFIID riid, void ** object) + { + if (riid == __uuidof (IUnknown)) { + *object = static_cast<IUnknown *> + (static_cast<IGstMFSampleGrabberCB *> (this)); + } else if (riid == __uuidof (ISampleGrabberCB)) { + *object = static_cast<ISampleGrabberCB *> + (static_cast<IGstMFSampleGrabberCB *> (this)); + } else if (riid == __uuidof (IGstMFSampleGrabberCB)) { + *object = this; + } else { + *object = nullptr; + return E_NOINTERFACE; + } + + AddRef (); + + return S_OK; + } + + STDMETHODIMP + SampleCB (double SampleTime, IMediaSample *pSample) + { + return E_NOTIMPL; + } + + STDMETHODIMP + BufferCB (double SampleTime, BYTE *pBuffer, LONG BufferLen) + { + if (callback_) + callback_ (SampleTime, pBuffer, BufferLen, user_data_); + + return S_OK; + } + +private: + IGstMFSampleGrabberCB (OnBufferCB callback, gpointer user_data) + : callback_ (callback), user_data_ (user_data), ref_count_ (1) + { + } + + virtual ~IGstMFSampleGrabberCB (void) + { + } + +private: + OnBufferCB callback_; + gpointer user_data_; + ULONG ref_count_; +}; + +struct GStMFDShowMoniker +{ + GStMFDShowMoniker () + { + } + + GStMFDShowMoniker (ComPtr<IMoniker> m, const std::string &d, const std::string & n, + const std::string p, guint i) + { + moniker = m; + desc = d; + name = n; + path = p; + index = i; + } + + GStMFDShowMoniker (const GStMFDShowMoniker & other) + { + moniker = other.moniker; + desc = other.desc; + name = other.name; + path = other.path; + index = other.index; + } + + ComPtr<IMoniker> moniker; + std::string desc; + std::string name; + std::string path; + guint index = 0; +}; + +static void +ClearMediaType (AM_MEDIA_TYPE * type) +{ + if (type->cbFormat && type->pbFormat) + CoTaskMemFree (type->pbFormat); + + if (type->pUnk) + type->pUnk->Release (); +} + +static void +FreeMediaType (AM_MEDIA_TYPE * type) +{ + if (!type) + return; + + ClearMediaType (type); + CoTaskMemFree (type); +} + +static inline std::string +convert_to_string (const wchar_t * wstr) +{ + std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> conv; + + return conv.to_bytes (wstr); +} + +static HRESULT +FindFirstPin (IBaseFilter * filter, PIN_DIRECTION dir, IPin ** pin) +{ + ComPtr < IEnumPins > enum_pins; + HRESULT hr; + PIN_DIRECTION direction; + + hr = filter->EnumPins (&enum_pins); + if (!gst_mf_result (hr)) + return hr; + + do { + ComPtr < IPin > tmp; + + hr = enum_pins->Next (1, &tmp, nullptr); + if (hr != S_OK) + return hr; + + hr = tmp->QueryDirection (&direction); + if (!gst_mf_result (hr) || direction != dir) + continue; + + *pin = tmp.Detach (); + return S_OK; + } while (hr == S_OK); + + return E_FAIL; +} + +struct GstMFDShowPinInfo +{ + GstMFDShowPinInfo () + { + } + + GstMFDShowPinInfo (const std::wstring & id, GstCaps *c, gint i, + gboolean top_down) + { + pin_id = id; + caps = c; + index = i; + top_down_image = top_down; + } + + GstMFDShowPinInfo (const GstMFDShowPinInfo & other) + { + pin_id = other.pin_id; + if (other.caps) + caps = gst_caps_ref (other.caps); + index = other.index; + top_down_image = other.top_down_image; + } + + ~GstMFDShowPinInfo () + { + if (caps) + gst_caps_unref (caps); + } + + bool operator< (const GstMFDShowPinInfo & other) + { + return gst_mf_source_object_caps_compare (caps, other.caps) < 0; + } + + GstMFDShowPinInfo & operator= (const GstMFDShowPinInfo & other) + { + gst_clear_caps (&caps); + + pin_id = other.pin_id; + if (other.caps) + caps = gst_caps_ref (other.caps); + index = other.index; + top_down_image = other.top_down_image; + + return *this; + } + + std::wstring pin_id; + GstCaps *caps = nullptr; + gint index = 0; + gboolean top_down_image = TRUE; +}; + +struct GstMFCaptureDShowInner +{ + ~GstMFCaptureDShowInner() + { + if (grabber) + grabber->SetCallback (nullptr, 0); + } + + std::vector<GstMFDShowPinInfo> pin_infos; + ComPtr <IFilterGraph> graph; + ComPtr <IMediaControl> control; + ComPtr <IBaseFilter> capture; + ComPtr <ISampleGrabber> grabber; + ComPtr <IBaseFilter> fakesink; + GstMFDShowPinInfo selected_pin_info; +}; +/* *INDENT-ON* */ + +enum CAPTURE_STATE +{ + CAPTURE_STATE_STOPPED, + CAPTURE_STATE_RUNNING, + CAPTURE_STATE_ERROR, +}; + +struct _GstMFCaptureDShow +{ + GstMFSourceObject parent; + + GThread *thread; + GMutex lock; + GCond cond; + GMainContext *context; + GMainLoop *loop; + + GstMFCaptureDShowInner *inner; + GstBufferPool *pool; + + /* protected by lock */ + GQueue sample_queue; + CAPTURE_STATE state; + + GstCaps *supported_caps; + GstCaps *selected_caps; + GstVideoInfo info; + + gboolean top_down_image; + gboolean flushing; +}; + +static void gst_mf_capture_dshow_constructed (GObject * object); +static void gst_mf_capture_dshow_finalize (GObject * object); + +static gboolean gst_mf_capture_dshow_start (GstMFSourceObject * object); +static gboolean gst_mf_capture_dshow_stop (GstMFSourceObject * object); +static GstFlowReturn +gst_mf_capture_dshow_get_sample (GstMFSourceObject * object, + GstSample ** sample); +static gboolean gst_mf_capture_dshow_unlock (GstMFSourceObject * object); +static gboolean gst_mf_capture_dshow_unlock_stop (GstMFSourceObject * object); +static GstCaps *gst_mf_capture_dshow_get_caps (GstMFSourceObject * object); +static gboolean gst_mf_capture_dshow_set_caps (GstMFSourceObject * object, + GstCaps * caps); + +static gpointer gst_mf_capture_dshow_thread_func (GstMFCaptureDShow * self); +static void gst_mf_capture_dshow_on_buffer (double sample_time, + BYTE * buffer, LONG buffer_len, gpointer user_data); + +#define gst_mf_capture_dshow_parent_class parent_class +G_DEFINE_TYPE (GstMFCaptureDShow, gst_mf_capture_dshow, + GST_TYPE_MF_SOURCE_OBJECT); + +static void +gst_mf_capture_dshow_class_init (GstMFCaptureDShowClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstMFSourceObjectClass *source_class = GST_MF_SOURCE_OBJECT_CLASS (klass); + + gobject_class->constructed = gst_mf_capture_dshow_constructed; + gobject_class->finalize = gst_mf_capture_dshow_finalize; + + source_class->start = GST_DEBUG_FUNCPTR (gst_mf_capture_dshow_start); + source_class->stop = GST_DEBUG_FUNCPTR (gst_mf_capture_dshow_stop); + source_class->get_sample = + GST_DEBUG_FUNCPTR (gst_mf_capture_dshow_get_sample); + source_class->unlock = GST_DEBUG_FUNCPTR (gst_mf_capture_dshow_unlock); + source_class->unlock_stop = + GST_DEBUG_FUNCPTR (gst_mf_capture_dshow_unlock_stop); + source_class->get_caps = GST_DEBUG_FUNCPTR (gst_mf_capture_dshow_get_caps); + source_class->set_caps = GST_DEBUG_FUNCPTR (gst_mf_capture_dshow_set_caps); +} + +static void +gst_mf_capture_dshow_init (GstMFCaptureDShow * self) +{ + g_mutex_init (&self->lock); + g_cond_init (&self->cond); + g_queue_init (&self->sample_queue); + + self->state = CAPTURE_STATE_STOPPED; +} + +static void +gst_mf_capture_dshow_constructed (GObject * object) +{ + GstMFCaptureDShow *self = GST_MF_CAPTURE_DSHOW (object); + + self->context = g_main_context_new (); + self->loop = g_main_loop_new (self->context, FALSE); + + /* Create a new thread to ensure that COM thread can be MTA thread */ + g_mutex_lock (&self->lock); + self->thread = g_thread_new ("GstMFCaptureDShow", + (GThreadFunc) gst_mf_capture_dshow_thread_func, self); + while (!g_main_loop_is_running (self->loop)) + g_cond_wait (&self->cond, &self->lock); + g_mutex_unlock (&self->lock); + + G_OBJECT_CLASS (parent_class)->constructed (object); +} + +static void +gst_mf_capture_dshow_finalize (GObject * object) +{ + GstMFCaptureDShow *self = GST_MF_CAPTURE_DSHOW (object); + + g_main_loop_quit (self->loop); + g_thread_join (self->thread); + g_main_loop_unref (self->loop); + g_main_context_unref (self->context); + + gst_clear_caps (&self->supported_caps); + gst_clear_caps (&self->selected_caps); + g_queue_clear_full (&self->sample_queue, (GDestroyNotify) gst_sample_unref); + g_mutex_clear (&self->lock); + g_cond_clear (&self->cond); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +gst_mf_capture_dshow_start (GstMFSourceObject * object) +{ + GstMFCaptureDShow *self = GST_MF_CAPTURE_DSHOW (object); + GstMFCaptureDShowInner *inner = self->inner; + HRESULT hr; + ComPtr < IAMStreamConfig > config; + ComPtr < IBaseFilter > grabber; + ComPtr < IPin > output; + ComPtr < IPin > input; + AM_MEDIA_TYPE *type = nullptr; + VIDEO_STREAM_CONFIG_CAPS config_caps; + GstMFDShowPinInfo & selected = inner->selected_pin_info; + GstStructure *pool_config; + + if (!selected.caps) { + GST_ERROR_OBJECT (self, "No selected pin"); + return FALSE; + } + + gst_video_info_from_caps (&self->info, selected.caps); + gst_clear_caps (&self->selected_caps); + self->selected_caps = gst_caps_ref (selected.caps); + self->top_down_image = selected.top_down_image; + + /* Get pin and mediainfo of capture filter */ + hr = inner->capture->FindPin (selected.pin_id.c_str (), &output); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Could not find output pin of capture filter"); + return FALSE; + } + + hr = output.As (&config); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Could not get IAMStreamConfig interface"); + return FALSE; + } + + hr = config->GetStreamCaps (selected.index, &type, (BYTE *) & config_caps); + if (!gst_mf_result (hr) || !type) { + GST_ERROR_OBJECT (self, "Could not get type from pin"); + return FALSE; + } + + hr = inner->grabber.As (&grabber); + if (!gst_mf_result (hr)) { + FreeMediaType (type); + return FALSE; + } + + /* Find input pint of grabber */ + hr = FindFirstPin (grabber.Get (), PINDIR_INPUT, &input); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Couldn't get input pin from grabber"); + FreeMediaType (type); + return FALSE; + } + + hr = inner->graph->ConnectDirect (output.Get (), input.Get (), type); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Could not connect capture and grabber"); + FreeMediaType (type); + return FALSE; + } + + /* Link grabber and fakesink here */ + input = nullptr; + output = nullptr; + hr = FindFirstPin (grabber.Get (), PINDIR_OUTPUT, &output); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Couldn't get output pin from grabber"); + FreeMediaType (type); + return FALSE; + } + + hr = FindFirstPin (inner->fakesink.Get (), PINDIR_INPUT, &input); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Couldn't get input pin from fakesink"); + FreeMediaType (type); + return FALSE; + } + + hr = inner->graph->ConnectDirect (output.Get (), input.Get (), type); + FreeMediaType (type); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Could not connect grabber and fakesink"); + return FALSE; + } + + self->pool = gst_video_buffer_pool_new (); + pool_config = gst_buffer_pool_get_config (self->pool); + gst_buffer_pool_config_add_option (pool_config, + GST_BUFFER_POOL_OPTION_VIDEO_META); + gst_buffer_pool_config_set_params (pool_config, selected.caps, + GST_VIDEO_INFO_SIZE (&self->info), 0, 0); + if (!gst_buffer_pool_set_config (self->pool, pool_config)) { + GST_ERROR_OBJECT (self, "Couldn not set buffer pool config"); + gst_clear_object (&self->pool); + return FALSE; + } + + if (!gst_buffer_pool_set_active (self->pool, TRUE)) { + GST_ERROR_OBJECT (self, "Couldn't activate pool"); + gst_clear_object (&self->pool); + return FALSE; + } + + self->state = CAPTURE_STATE_RUNNING; + + hr = inner->control->Run (); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Couldn't start graph"); + self->state = CAPTURE_STATE_ERROR; + g_cond_broadcast (&self->cond); + gst_buffer_pool_set_active (self->pool, FALSE); + gst_clear_object (&self->pool); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_mf_capture_dshow_stop (GstMFSourceObject * object) +{ + GstMFCaptureDShow *self = GST_MF_CAPTURE_DSHOW (object); + GstMFCaptureDShowInner *inner = self->inner; + + GST_DEBUG_OBJECT (self, "Stop"); + + g_mutex_lock (&self->lock); + self->state = CAPTURE_STATE_STOPPED; + g_cond_broadcast (&self->cond); + g_mutex_unlock (&self->lock); + + if (inner->control) + inner->control->Stop (); + + if (self->pool) + gst_buffer_pool_set_active (self->pool, FALSE); + + return TRUE; +} + +static GstFlowReturn +gst_mf_capture_dshow_get_sample (GstMFSourceObject * object, + GstSample ** sample) +{ + GstMFCaptureDShow *self = GST_MF_CAPTURE_DSHOW (object); + + g_mutex_lock (&self->lock); + while (g_queue_is_empty (&self->sample_queue) && !self->flushing && + self->state == CAPTURE_STATE_RUNNING) { + g_cond_wait (&self->cond, &self->lock); + } + + if (self->flushing) { + g_mutex_unlock (&self->lock); + return GST_FLOW_FLUSHING; + } + + if (self->state == CAPTURE_STATE_ERROR) { + g_mutex_unlock (&self->lock); + return GST_FLOW_ERROR; + } + + *sample = (GstSample *) g_queue_pop_head (&self->sample_queue); + g_mutex_unlock (&self->lock); + + return GST_FLOW_OK; +} + +static gboolean +gst_mf_capture_dshow_unlock (GstMFSourceObject * object) +{ + GstMFCaptureDShow *self = GST_MF_CAPTURE_DSHOW (object); + + GST_DEBUG_OBJECT (self, "Unlock"); + + g_mutex_lock (&self->lock); + self->flushing = TRUE; + g_cond_broadcast (&self->cond); + g_mutex_unlock (&self->lock); + + return TRUE; +} + +static gboolean +gst_mf_capture_dshow_unlock_stop (GstMFSourceObject * object) +{ + GstMFCaptureDShow *self = GST_MF_CAPTURE_DSHOW (object); + + GST_DEBUG_OBJECT (self, "Unlock Stop"); + + g_mutex_lock (&self->lock); + self->flushing = FALSE; + g_cond_broadcast (&self->cond); + g_mutex_unlock (&self->lock); + + return TRUE; +} + +static GstCaps * +gst_mf_capture_dshow_get_caps (GstMFSourceObject * object) +{ + GstMFCaptureDShow *self = GST_MF_CAPTURE_DSHOW (object); + GstCaps *caps = nullptr; + + g_mutex_lock (&self->lock); + if (self->selected_caps) { + caps = gst_caps_ref (self->selected_caps); + } else if (self->supported_caps) { + caps = gst_caps_ref (self->supported_caps); + } + g_mutex_unlock (&self->lock); + + return caps; +} + +static gboolean +gst_mf_capture_dshow_set_caps (GstMFSourceObject * object, GstCaps * caps) +{ + GstMFCaptureDShow *self = GST_MF_CAPTURE_DSHOW (object); + GstMFCaptureDShowInner *inner = self->inner; + GstMFDShowPinInfo pin_info; + + /* *INDENT-OFF* */ + for (const auto & iter: inner->pin_infos) { + if (gst_caps_can_intersect (iter.caps, caps)) { + pin_info = iter; + break; + } + } + /* *INDENT-ON* */ + + if (!pin_info.caps) { + GST_ERROR_OBJECT (self, "Could not determine target pin with given caps %" + GST_PTR_FORMAT, caps); + return FALSE; + } + + GST_DEBUG_OBJECT (self, "Selecting caps %" GST_PTR_FORMAT " for caps %" + GST_PTR_FORMAT, pin_info.caps, caps); + + inner->selected_pin_info = pin_info; + + return TRUE; +} + +static gboolean +gst_mf_capture_dshow_main_loop_running_cb (GstMFCaptureDShow * self) +{ + GST_INFO_OBJECT (self, "Main loop running now"); + + g_mutex_lock (&self->lock); + g_cond_signal (&self->cond); + g_mutex_unlock (&self->lock); + + return G_SOURCE_REMOVE; +} + +static GstVideoFormat +subtype_to_format (REFGUID subtype) +{ + if (subtype == MEDIASUBTYPE_MJPG) + return GST_VIDEO_FORMAT_ENCODED; + else if (subtype == MEDIASUBTYPE_RGB555) + return GST_VIDEO_FORMAT_RGB15; + else if (subtype == MEDIASUBTYPE_RGB565) + return GST_VIDEO_FORMAT_RGB16; + else if (subtype == MEDIASUBTYPE_RGB24) + return GST_VIDEO_FORMAT_BGR; + else if (subtype == MEDIASUBTYPE_RGB32) + return GST_VIDEO_FORMAT_BGRx; + else if (subtype == MEDIASUBTYPE_ARGB32) + return GST_VIDEO_FORMAT_BGRA; + else if (subtype == MEDIASUBTYPE_AYUV) + return GST_VIDEO_FORMAT_VUYA; + else if (subtype == MEDIASUBTYPE_YUY2) + return GST_VIDEO_FORMAT_YUY2; + else if (subtype == MEDIASUBTYPE_UYVY) + return GST_VIDEO_FORMAT_UYVY; + else if (subtype == MEDIASUBTYPE_YV12) + return GST_VIDEO_FORMAT_YV12; + else if (subtype == MEDIASUBTYPE_NV12) + return GST_VIDEO_FORMAT_NV12; + else if (subtype == MEDIASUBTYPE_I420) + return GST_VIDEO_FORMAT_I420; + else if (subtype == MEDIASUBTYPE_IYUV) + return GST_VIDEO_FORMAT_I420; + + return GST_VIDEO_FORMAT_UNKNOWN; +} + +static GstCaps * +media_type_to_caps (AM_MEDIA_TYPE * type, gboolean * top_down_image) +{ + gint fps_n = 0; + gint fps_d = 1; + GstVideoFormat format; + VIDEOINFOHEADER *header; + GstCaps *caps; + + if (!type) + return nullptr; + + if (type->majortype != MEDIATYPE_Video || + type->formattype != FORMAT_VideoInfo) { + return nullptr; + } + + format = subtype_to_format (type->subtype); + if (format == GST_VIDEO_FORMAT_UNKNOWN || + /* TODO: support jpeg */ + format == GST_VIDEO_FORMAT_ENCODED) { + return nullptr; + } + + if (!type->pbFormat || type->cbFormat < sizeof (VIDEOINFOHEADER)) + return nullptr; + + header = (VIDEOINFOHEADER *) type->pbFormat; + if (header->bmiHeader.biWidth <= 0 || header->bmiHeader.biHeight <= 0) { + return nullptr; + } + + if (header->AvgTimePerFrame > 0) { + /* 100ns unit */ + gst_video_guess_framerate ((GstClockTime) header->AvgTimePerFrame * 100, + &fps_n, &fps_d); + } + + if (top_down_image) { + const GstVideoFormatInfo *finfo = gst_video_format_get_info (format); + if (GST_VIDEO_FORMAT_INFO_IS_RGB (finfo) && header->bmiHeader.biHeight < 0) { + *top_down_image = FALSE; + } else { + *top_down_image = TRUE; + } + } + + caps = gst_caps_new_empty_simple ("video/x-raw"); + gst_caps_set_simple (caps, "format", G_TYPE_STRING, + gst_video_format_to_string (format), + "width", G_TYPE_INT, (gint) header->bmiHeader.biWidth, + "height", G_TYPE_INT, (gint) header->bmiHeader.biHeight, + "framerate", GST_TYPE_FRACTION, fps_n, fps_d, nullptr); + + return caps; +} + +static gboolean +gst_mf_capture_dshow_open (GstMFCaptureDShow * self, IMoniker * moniker) +{ + ComPtr < IBaseFilter > capture; + ComPtr < IEnumPins > pin_list; + ComPtr < IFilterGraph > graph; + ComPtr < IMediaFilter > filter; + ComPtr < IMediaControl > control; + GstMFCaptureDShowInner *inner = self->inner; + HRESULT hr; + PIN_DIRECTION direction; + + hr = CoCreateInstance (CLSID_FilterGraph, nullptr, CLSCTX_INPROC_SERVER, + IID_PPV_ARGS (&graph)); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Could not get IGraphBuilder interface"); + return FALSE; + } + + hr = graph.As (&filter); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Could not get IMediaFilter interface"); + return FALSE; + } + + /* Make graph work as if sync=false */ + filter->SetSyncSource (nullptr); + + hr = graph.As (&control); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Could not get IMediaControl interface"); + return FALSE; + } + + hr = moniker->BindToObject (nullptr, nullptr, IID_PPV_ARGS (&capture)); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Could not bind capture object"); + return FALSE; + } + + hr = graph->AddFilter (capture.Get (), L"CaptureFilter"); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Could not add capture filter to graph"); + return FALSE; + } + + ComPtr < IBaseFilter > grabber; + hr = inner->grabber.As (&grabber); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Could not get IBaseFilter interface from grabber"); + return FALSE; + } + + hr = graph->AddFilter (grabber.Get (), L"SampleGrabber"); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Could not add grabber filter to graph"); + return FALSE; + } + + hr = graph->AddFilter (inner->fakesink.Get (), L"FakeSink"); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Could not add fakesink filter to graph"); + return FALSE; + } + + hr = capture->EnumPins (&pin_list); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Could not get pin enumerator"); + return FALSE; + } + + /* Enumerates pins and media types */ + do { + ComPtr < IPin > pin; + std::wstring id; + std::string id_str; + WCHAR *pin_id = nullptr; + GUID category = GUID_NULL; + DWORD returned = 0; + + hr = pin_list->Next (1, &pin, nullptr); + if (hr != S_OK) + break; + + hr = pin->QueryDirection (&direction); + if (!gst_mf_result (hr) || direction != PINDIR_OUTPUT) + continue; + + hr = pin->QueryId (&pin_id); + if (!gst_mf_result (hr) || !pin_id) + continue; + + id_str = convert_to_string (pin_id); + id = pin_id; + CoTaskMemFree (pin_id); + + ComPtr < IKsPropertySet > prop; + hr = pin.As (&prop); + if (!gst_mf_result (hr)) + continue; + + prop->Get (AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, nullptr, 0, + &category, sizeof (GUID), &returned); + + if (category == GUID_NULL) { + GST_INFO_OBJECT (self, "Unknown category, keep checking"); + } else if (category == PIN_CATEGORY_CAPTURE) { + GST_INFO_OBJECT (self, "Found capture pin"); + } else if (category == PIN_CATEGORY_PREVIEW) { + GST_INFO_OBJECT (self, "Found preview pin"); + } else { + continue; + } + + ComPtr < IAMStreamConfig > config; + hr = pin.As (&config); + if (!gst_mf_result (hr)) + continue; + + int count = 0; + int size = 0; + hr = config->GetNumberOfCapabilities (&count, &size); + if (!gst_mf_result (hr) || count == 0 || + size != sizeof (VIDEO_STREAM_CONFIG_CAPS)) { + continue; + } + + for (int i = 0; i < count; i++) { + AM_MEDIA_TYPE *type = nullptr; + VIDEO_STREAM_CONFIG_CAPS config_caps; + GstCaps *caps; + gboolean top_down = TRUE; + + hr = config->GetStreamCaps (i, &type, (BYTE *) & config_caps); + if (!gst_mf_result (hr) || !type) { + GST_WARNING_OBJECT (self, "Couldn't get caps for index %d", i); + continue; + } + + caps = media_type_to_caps (type, &top_down); + if (!caps) { + GST_WARNING_OBJECT (self, + "Couldn't convert type to caps for index %d", i); + FreeMediaType (type); + continue; + } + + GST_LOG_OBJECT (self, "Adding caps for pin id \"%s\", index %d, caps %" + GST_PTR_FORMAT, id_str.c_str (), i, caps); + + inner->pin_infos.emplace_back (id, caps, i, top_down); + FreeMediaType (type); + } + } while (hr == S_OK); + + if (inner->pin_infos.empty ()) { + GST_WARNING_OBJECT (self, "Couldn't get pin information"); + return FALSE; + } + + std::sort (inner->pin_infos.begin (), inner->pin_infos.end ()); + + self->supported_caps = gst_caps_new_empty (); + /* *INDENT-OFF* */ + for (const auto & iter : inner->pin_infos) + gst_caps_append (self->supported_caps, gst_caps_ref (iter.caps)); + /* *INDENT-ON* */ + + GST_DEBUG_OBJECT (self, "Available output caps %" GST_PTR_FORMAT, + self->supported_caps); + + inner->graph = graph; + inner->control = control; + inner->capture = capture; + + return TRUE; +} + +static gboolean +gst_mf_dshow_enum_device (GstMFCaptureDShow * self, + GstMFSourceType source_type, std::vector < GStMFDShowMoniker > &dev_list) +{ + HRESULT hr; + ComPtr < ICreateDevEnum > dev_enum; + ComPtr < IEnumMoniker > enum_moniker; + + hr = CoCreateInstance (CLSID_SystemDeviceEnum, nullptr, CLSCTX_INPROC_SERVER, + IID_PPV_ARGS (&dev_enum)); + if (!gst_mf_result (hr)) + return FALSE; + + switch (source_type) { + case GST_MF_SOURCE_TYPE_VIDEO: + /* directshow native filter only */ + hr = dev_enum->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, + &enum_moniker, CDEF_DEVMON_FILTER); + break; + default: + GST_ERROR_OBJECT (self, "Unknown source type %d", source_type); + return FALSE; + } + + // Documentation states that the result of CreateClassEnumerator must be checked against S_OK + if (hr != S_OK) + return FALSE; + + for (guint i = 0;; i++) { + ComPtr < IMoniker > moniker; + ComPtr < IPropertyBag > prop_bag; + WCHAR *display_name = nullptr; + VARIANT var; + std::string desc; + std::string name; + std::string path; + + hr = enum_moniker->Next (1, &moniker, nullptr); + if (hr != S_OK) + break; + + hr = moniker->BindToStorage (nullptr, nullptr, IID_PPV_ARGS (&prop_bag)); + if (!gst_mf_result (hr)) + continue; + + VariantInit (&var); + hr = prop_bag->Read (L"Description", &var, nullptr); + if (SUCCEEDED (hr)) { + desc = convert_to_string (var.bstrVal); + VariantClear (&var); + } + + hr = prop_bag->Read (L"FriendlyName", &var, nullptr); + if (SUCCEEDED (hr)) { + name = convert_to_string (var.bstrVal); + VariantClear (&var); + } + + if (desc.empty () && name.empty ()) { + desc = "Unknown capture device"; + name = "Unknown capture device"; + GST_WARNING_OBJECT (self, "Unknown device desc/name"); + } + + if (desc.empty ()) + desc = name; + else if (name.empty ()) + name = desc; + + hr = moniker->GetDisplayName (nullptr, nullptr, &display_name); + if (!gst_mf_result (hr) || !display_name) + continue; + + path = convert_to_string (display_name); + CoTaskMemFree (display_name); + + dev_list.push_back ( { + moniker, desc, name, path, i} + ); + } + + if (dev_list.empty ()) + return FALSE; + + return TRUE; +} + +/* *INDENT-OFF* */ +static gpointer +gst_mf_capture_dshow_thread_func (GstMFCaptureDShow * self) +{ + GstMFSourceObject *object = GST_MF_SOURCE_OBJECT (self); + GSource *source; + + CoInitializeEx (nullptr, COINIT_MULTITHREADED); + + g_main_context_push_thread_default (self->context); + + self->inner = new GstMFCaptureDShowInner (); + + source = g_idle_source_new (); + g_source_set_callback (source, + (GSourceFunc) gst_mf_capture_dshow_main_loop_running_cb, self, nullptr); + g_source_attach (source, self->context); + g_source_unref (source); + + { + std::vector<GStMFDShowMoniker> device_list; + GStMFDShowMoniker selected; + HRESULT hr; + + if (!gst_mf_dshow_enum_device (self, object->source_type, device_list)) { + GST_WARNING_OBJECT (self, "No available video capture device"); + goto run_loop; + } + + for (const auto & iter : device_list) { + GST_DEBUG_OBJECT (self, "device %d, name: \"%s\", path: \"%s\"", + iter.index, iter.name.c_str (), iter.path.c_str ()); + } + + GST_DEBUG_OBJECT (self, + "Requested device index: %d, name: \"%s\", path \"%s\"", + object->device_index, GST_STR_NULL (object->device_name), + GST_STR_NULL (object->device_path)); + + for (const auto & iter : device_list) { + bool match = false; + + if (object->device_path) { + match = (g_ascii_strcasecmp (iter.path.c_str (), + object->device_path) == 0); + } else if (object->device_name) { + match = (g_ascii_strcasecmp (iter.name.c_str (), + object->device_name) == 0); + } else if (object->device_index >= 0) { + match = iter.index == (guint) object->device_index; + } else { + /* pick the first entry */ + match = TRUE; + } + + if (match) { + selected = iter; + break; + } + } + + if (selected.moniker) { + ComPtr<ISampleGrabber> grabber; + ComPtr<IBaseFilter> fakesink; + ComPtr<IGstMFSampleGrabberCB> cb; + + /* Make sure ISampleGrabber and NullRenderer are available, + * MS may want to drop the the legacy implementations */ + hr = CoCreateInstance (CLSID_SampleGrabber, nullptr, CLSCTX_INPROC_SERVER, + IID_PPV_ARGS (&grabber)); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "ISampleGrabber interface is not available"); + goto run_loop; + } + + grabber->SetBufferSamples (FALSE); + grabber->SetOneShot (FALSE); + + hr = IGstMFSampleGrabberCB::CreateInstance (gst_mf_capture_dshow_on_buffer, + self, &cb); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Could not create callback object"); + goto run_loop; + } + + hr = grabber->SetCallback (cb.Get (), 1); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Could not set sample callback"); + goto run_loop; + } + + hr = CoCreateInstance (CLSID_NullRenderer, nullptr, CLSCTX_INPROC_SERVER, + IID_PPV_ARGS (&fakesink)); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "NullRenderer interface is not available"); + goto run_loop; + } + + self->inner->grabber = grabber; + self->inner->fakesink = fakesink; + + object->opened = + gst_mf_capture_dshow_open (self, selected.moniker.Get ()); + + g_free (object->device_path); + object->device_path = g_strdup (selected.path.c_str()); + + g_free (object->device_name); + object->device_name = g_strdup (selected.name.c_str()); + + object->device_index = selected.index; + } + } + +run_loop: + GST_DEBUG_OBJECT (self, "Starting main loop"); + g_main_loop_run (self->loop); + GST_DEBUG_OBJECT (self, "Stopped main loop"); + + gst_mf_capture_dshow_stop (object); + delete self->inner; + + if (self->pool) { + gst_buffer_pool_set_active (self->pool, FALSE); + gst_clear_object (&self->pool); + } + + g_main_context_pop_thread_default (self->context); + + CoUninitialize (); + + return nullptr; +} +/* *INDENT-ON* */ + +static void +gst_mf_capture_dshow_on_buffer (double sample_time, BYTE * data, LONG len, + gpointer user_data) +{ + GstMFCaptureDShow *self = GST_MF_CAPTURE_DSHOW (user_data); + GstFlowReturn ret; + GstClockTime time; + GstVideoFrame frame; + AM_MEDIA_TYPE type; + HRESULT hr; + GstBuffer *buf = nullptr; + GstCaps *caps = nullptr; + GstSample *sample; + + if (!data) { + GST_WARNING_OBJECT (self, "Null data"); + return; + } + + memset (&type, 0, sizeof (AM_MEDIA_TYPE)); + g_mutex_lock (&self->lock); + if (self->flushing || self->state != CAPTURE_STATE_RUNNING) { + GST_DEBUG_OBJECT (self, "Not running state"); + g_mutex_unlock (&self->lock); + return; + } + + hr = self->inner->grabber->GetConnectedMediaType (&type); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Couldn't get connected media type"); + goto error; + } + + caps = media_type_to_caps (&type, &self->top_down_image); + ClearMediaType (&type); + if (!caps) { + GST_ERROR_OBJECT (self, "Couldn't get caps from connected type"); + goto error; + } + + if (!gst_caps_is_equal (caps, self->selected_caps)) { + GstBufferPool *pool; + GstStructure *pool_config; + GstVideoInfo info; + + if (!gst_video_info_from_caps (&info, caps)) { + GST_ERROR_OBJECT (self, "Couldn't get video info from caps"); + gst_caps_unref (caps); + goto error; + } + + GST_WARNING_OBJECT (self, "Caps change %" GST_PTR_FORMAT " -> %" + GST_PTR_FORMAT, self->selected_caps, caps); + + gst_clear_caps (&self->selected_caps); + self->selected_caps = gst_caps_ref (caps); + self->info = info; + + pool = gst_video_buffer_pool_new (); + pool_config = gst_buffer_pool_get_config (self->pool); + gst_buffer_pool_config_add_option (pool_config, + GST_BUFFER_POOL_OPTION_VIDEO_META); + gst_buffer_pool_config_set_params (pool_config, caps, + GST_VIDEO_INFO_SIZE (&self->info), 0, 0); + if (!gst_buffer_pool_set_config (pool, pool_config)) { + GST_ERROR_OBJECT (self, "Couldn not set buffer pool config"); + gst_object_unref (pool); + goto error; + } + + if (!gst_buffer_pool_set_active (pool, TRUE)) { + GST_ERROR_OBJECT (self, "Couldn't activate pool"); + gst_object_unref (pool); + goto error; + } + + if (self->pool) { + gst_buffer_pool_set_active (self->pool, FALSE); + gst_object_unref (self->pool); + } + + self->pool = pool; + } else { + gst_clear_caps (&caps); + } + + if (len < GST_VIDEO_INFO_SIZE (&self->info)) { + GST_ERROR_OBJECT (self, "Too small size %d < %d", + (gint) len, GST_VIDEO_INFO_SIZE (&self->info)); + goto error; + } + + time = gst_mf_source_object_get_running_time (GST_MF_SOURCE_OBJECT (self)); + ret = gst_buffer_pool_acquire_buffer (self->pool, &buf, nullptr); + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (self, "Could not acquire buffer"); + goto error; + } + + if (!gst_video_frame_map (&frame, &self->info, buf, GST_MAP_WRITE)) { + GST_ERROR_OBJECT (self, "Could not map buffer"); + goto error; + } + + if (!self->top_down_image) { + guint8 *src, *dst; + gint src_stride, dst_stride; + gint width, height; + + /* must be single plane RGB */ + width = GST_VIDEO_INFO_COMP_WIDTH (&self->info, 0) + * GST_VIDEO_INFO_COMP_PSTRIDE (&self->info, 0); + height = GST_VIDEO_INFO_HEIGHT (&self->info); + + src_stride = GST_VIDEO_INFO_PLANE_STRIDE (&self->info, 0); + dst_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&frame, 0); + + /* This is bottom up image, should copy lines in reverse order */ + src = data + src_stride * (height - 1); + dst = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + + for (guint i = 0; i < height; i++) { + memcpy (dst, src, width); + src -= src_stride; + dst += dst_stride; + } + } else { + for (guint i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->info); i++) { + guint8 *src, *dst; + gint src_stride, dst_stride; + gint width; + + src = data + GST_VIDEO_INFO_PLANE_OFFSET (&self->info, i); + dst = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, i); + + src_stride = GST_VIDEO_INFO_PLANE_STRIDE (&self->info, i); + dst_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&frame, i); + width = GST_VIDEO_INFO_COMP_WIDTH (&self->info, i) + * GST_VIDEO_INFO_COMP_PSTRIDE (&self->info, i); + + for (guint j = 0; j < GST_VIDEO_INFO_COMP_HEIGHT (&self->info, i); j++) { + memcpy (dst, src, width); + src += src_stride; + dst += dst_stride; + } + } + } + + gst_video_frame_unmap (&frame); + + GST_BUFFER_PTS (buf) = time; + GST_BUFFER_DTS (buf) = GST_CLOCK_TIME_NONE; + + sample = gst_sample_new (buf, caps, nullptr, nullptr); + gst_clear_caps (&caps); + gst_buffer_unref (buf); + g_queue_push_tail (&self->sample_queue, sample); + /* Drop old buffers */ + while (g_queue_get_length (&self->sample_queue) > 30) { + sample = (GstSample *) g_queue_pop_head (&self->sample_queue); + GST_INFO_OBJECT (self, "Dropping old sample %p", sample); + gst_sample_unref (sample); + } + g_cond_broadcast (&self->cond); + g_mutex_unlock (&self->lock); + + return; + +error: + gst_clear_buffer (&buf); + gst_clear_caps (&caps); + self->state = CAPTURE_STATE_ERROR; + g_cond_signal (&self->cond); + g_mutex_unlock (&self->lock); +} + +GstMFSourceObject * +gst_mf_capture_dshow_new (GstMFSourceType type, gint device_index, + const gchar * device_name, const gchar * device_path) +{ + GstMFSourceObject *self; + + g_return_val_if_fail (type == GST_MF_SOURCE_TYPE_VIDEO, nullptr); + + self = (GstMFSourceObject *) g_object_new (GST_TYPE_MF_CAPTURE_DSHOW, + "source-type", type, "device-index", device_index, "device-name", + device_name, "device-path", device_path, nullptr); + + gst_object_ref_sink (self); + + if (!self->opened) { + GST_DEBUG_OBJECT (self, "Couldn't open device"); + gst_object_unref (self); + return nullptr; + } + + return self; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfcapturedshow.h
Added
@@ -0,0 +1,36 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include "gstmfsourceobject.h" + +G_BEGIN_DECLS + +#define GST_TYPE_MF_CAPTURE_DSHOW (gst_mf_capture_dshow_get_type()) +G_DECLARE_FINAL_TYPE (GstMFCaptureDShow, gst_mf_capture_dshow, + GST, MF_CAPTURE_DSHOW, GstMFSourceObject); + +GstMFSourceObject * gst_mf_capture_dshow_new (GstMFSourceType type, + gint device_index, + const gchar * device_name, + const gchar * device_path); + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfcapturewinrt.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfcapturewinrt.cpp
Changed
@@ -36,14 +36,11 @@ using namespace ABI::Windows::Media::MediaProperties; using namespace ABI::Windows::Graphics::Imaging; using namespace ABI::Windows::Foundation; - -G_BEGIN_DECLS +/* *INDENT-ON* */ GST_DEBUG_CATEGORY_EXTERN (gst_mf_source_object_debug); #define GST_CAT_DEFAULT gst_mf_source_object_debug -G_END_DECLS -/* *INDENT-ON* */ enum { @@ -250,7 +247,7 @@ idle_source = g_idle_source_new (); g_source_set_callback (idle_source, - (GSourceFunc) gst_mf_capture_winrt_main_loop_running_cb, self, NULL); + (GSourceFunc) gst_mf_capture_winrt_main_loop_running_cb, self, nullptr); g_source_attach (idle_source, self->context); g_source_unref (idle_source); @@ -341,9 +338,9 @@ gst_mf_capture_winrt_stop (source); delete self->capture; - self->capture = NULL; + self->capture = nullptr; - return NULL; + return nullptr; } static gboolean @@ -668,7 +665,7 @@ if (self->supported_caps) return gst_caps_ref (self->supported_caps); - return NULL; + return nullptr; } /* *INDENT-OFF* */ @@ -678,7 +675,7 @@ GstMFCaptureWinRT *self = GST_MF_CAPTURE_WINRT (object); std::vector<GstWinRTMediaDescription> desc_list; HRESULT hr; - GstCaps *target_caps = NULL; + GstCaps *target_caps = nullptr; hr = self->capture->GetAvailableDescriptions(desc_list); if (!gst_mf_result (hr) || desc_list.empty()) { @@ -732,7 +729,7 @@ RoInitializeWrapper init_wrapper (RO_INIT_MULTITHREADED); /* TODO: Add audio capture support */ - g_return_val_if_fail (type == GST_MF_SOURCE_TYPE_VIDEO, NULL); + g_return_val_if_fail (type == GST_MF_SOURCE_TYPE_VIDEO, nullptr); /* If application didn't pass ICoreDispatcher object, * try to get dispatcher object for the current thread */ @@ -752,7 +749,8 @@ self = (GstMFSourceObject *) g_object_new (GST_TYPE_MF_CAPTURE_WINRT, "source-type", type, "device-index", device_index, "device-name", - device_name, "device-path", device_path, "dispatcher", dispatcher, NULL); + device_name, "device-path", device_path, "dispatcher", dispatcher, + nullptr); /* Reset explicitly to ensure that it happens before * RoInitializeWrapper dtor is called */ @@ -761,7 +759,7 @@ if (!self->opened) { GST_WARNING_OBJECT (self, "Couldn't open device"); gst_object_unref (self); - return NULL; + return nullptr; } gst_object_ref_sink (self);
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfdevice.cpp
Added
@@ -0,0 +1,610 @@ +/* GStreamer + * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstmfconfig.h" + +#include "gstmfvideosrc.h" +#include "gstmfutils.h" +#include "gstmfsourceobject.h" + +#include "gstmfdevice.h" + +#if GST_MF_WINAPI_DESKTOP +#include "gstwin32devicewatcher.h" +#include "gstmfcapturedshow.h" + +#ifndef INITGUID +#include <initguid.h> +#endif + +#include <dbt.h> +DEFINE_GUID (GST_KSCATEGORY_CAPTURE, 0x65E8773DL, 0x8F56, + 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96); +#endif + +#if GST_MF_WINAPI_APP +#include <gst/winrt/gstwinrt.h> +/* *INDENT-OFF* */ +using namespace ABI::Windows::Devices::Enumeration; +/* *INDENT-ON* */ +#endif + +GST_DEBUG_CATEGORY_EXTERN (gst_mf_debug); +#define GST_CAT_DEFAULT gst_mf_debug + +enum +{ + PROP_0, + PROP_DEVICE_PATH, +}; + +struct _GstMFDevice +{ + GstDevice parent; + + gchar *device_path; +}; + +G_DEFINE_TYPE (GstMFDevice, gst_mf_device, GST_TYPE_DEVICE); + +static void gst_mf_device_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static void gst_mf_device_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_mf_device_finalize (GObject * object); +static GstElement *gst_mf_device_create_element (GstDevice * device, + const gchar * name); + +static void +gst_mf_device_class_init (GstMFDeviceClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstDeviceClass *dev_class = GST_DEVICE_CLASS (klass); + + dev_class->create_element = gst_mf_device_create_element; + + gobject_class->get_property = gst_mf_device_get_property; + gobject_class->set_property = gst_mf_device_set_property; + gobject_class->finalize = gst_mf_device_finalize; + + g_object_class_install_property (gobject_class, PROP_DEVICE_PATH, + g_param_spec_string ("device-path", "Device Path", + "The device path", nullptr, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS))); +} + +static void +gst_mf_device_init (GstMFDevice * self) +{ +} + +static void +gst_mf_device_finalize (GObject * object) +{ + GstMFDevice *self = GST_MF_DEVICE (object); + + g_free (self->device_path); + + G_OBJECT_CLASS (gst_mf_device_parent_class)->finalize (object); +} + +static GstElement * +gst_mf_device_create_element (GstDevice * device, const gchar * name) +{ + GstMFDevice *self = GST_MF_DEVICE (device); + GstElement *elem; + + elem = gst_element_factory_make ("mfvideosrc", name); + + g_object_set (elem, "device-path", self->device_path, nullptr); + + return elem; +} + +static void +gst_mf_device_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMFDevice *self = GST_MF_DEVICE (object); + + switch (prop_id) { + case PROP_DEVICE_PATH: + g_value_set_string (value, self->device_path); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_mf_device_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMFDevice *self = GST_MF_DEVICE (object); + + switch (prop_id) { + case PROP_DEVICE_PATH: + self->device_path = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +struct _GstMFDeviceProvider +{ + GstDeviceProvider parent; + + GstObject *watcher; + + GMutex lock; + GCond cond; + + gboolean enum_completed; +}; + +G_DEFINE_TYPE (GstMFDeviceProvider, gst_mf_device_provider, + GST_TYPE_DEVICE_PROVIDER); + +static void gst_mf_device_provider_dispose (GObject * object); +static void gst_mf_device_provider_finalize (GObject * object); + +static GList *gst_mf_device_provider_probe (GstDeviceProvider * provider); +static gboolean gst_mf_device_provider_start (GstDeviceProvider * provider); +static void gst_mf_device_provider_stop (GstDeviceProvider * provider); + +#if GST_MF_WINAPI_DESKTOP +static gboolean gst_mf_device_provider_start_win32 (GstDeviceProvider * self); +static void gst_mf_device_provider_device_changed (GstWin32DeviceWatcher * + watcher, WPARAM wparam, LPARAM lparam, gpointer user_data); +#endif + +#if GST_MF_WINAPI_APP +static gboolean gst_mf_device_provider_start_winrt (GstDeviceProvider * self); +static void +gst_mf_device_provider_device_added (GstWinRTDeviceWatcher * watcher, + IDeviceInformation * info, gpointer user_data); +static void +gst_mf_device_provider_device_updated (GstWinRTDeviceWatcher * watcher, + IDeviceInformationUpdate * info_update, gpointer user_data); +static void gst_mf_device_provider_device_removed (GstWinRTDeviceWatcher * + watcher, IDeviceInformationUpdate * info_update, gpointer user_data); +static void +gst_mf_device_provider_device_enum_completed (GstWinRTDeviceWatcher * + watcher, gpointer user_data); +#endif + +static void +gst_mf_device_provider_on_device_updated (GstMFDeviceProvider * self); + +static void +gst_mf_device_provider_class_init (GstMFDeviceProviderClass * klass) +{ + GstDeviceProviderClass *provider_class = GST_DEVICE_PROVIDER_CLASS (klass); + + provider_class->probe = GST_DEBUG_FUNCPTR (gst_mf_device_provider_probe); + provider_class->start = GST_DEBUG_FUNCPTR (gst_mf_device_provider_start); + provider_class->stop = GST_DEBUG_FUNCPTR (gst_mf_device_provider_stop); + + gst_device_provider_class_set_static_metadata (provider_class, + "Media Foundation Device Provider", + "Source/Video", "List Media Foundation source devices", + "Seungha Yang <seungha@centricular.com>"); +} + +static void +gst_mf_device_provider_init (GstMFDeviceProvider * self) +{ +#if GST_MF_WINAPI_DESKTOP + GstWin32DeviceWatcherCallbacks win32_callbacks; + + win32_callbacks.device_changed = gst_mf_device_provider_device_changed; + self->watcher = (GstObject *) + gst_win32_device_watcher_new (DBT_DEVTYP_DEVICEINTERFACE, + &GST_KSCATEGORY_CAPTURE, &win32_callbacks, self); +#endif +#if GST_MF_WINAPI_APP + if (!self->watcher) { + GstWinRTDeviceWatcherCallbacks winrt_callbacks; + winrt_callbacks.added = gst_mf_device_provider_device_added; + winrt_callbacks.updated = gst_mf_device_provider_device_updated; + winrt_callbacks.removed = gst_mf_device_provider_device_removed; + winrt_callbacks.enumeration_completed = + gst_mf_device_provider_device_enum_completed; + + self->watcher = (GstObject *) + gst_winrt_device_watcher_new (GST_WINRT_DEVICE_CLASS_VIDEO_CAPTURE, + &winrt_callbacks, self); + } +#endif + + g_mutex_init (&self->lock); + g_cond_init (&self->cond); +} + +static void +gst_mf_device_provider_dispose (GObject * object) +{ + GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (object); + + gst_clear_object (&self->watcher); + + G_OBJECT_CLASS (gst_mf_device_provider_parent_class)->dispose (object); +} + +static void +gst_mf_device_provider_finalize (GObject * object) +{ + GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (object); + + g_mutex_clear (&self->lock); + g_cond_clear (&self->cond); + + G_OBJECT_CLASS (gst_mf_device_provider_parent_class)->finalize (object); +} + +static void +gst_mf_device_provider_probe_internal (GstDeviceProvider * provider, + gboolean try_dshow, GList ** list) +{ + GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (provider); + gint i; + + for (i = 0;; i++) { + GstMFSourceObject *obj = nullptr; + GstDevice *device; + GstStructure *props = nullptr; + GstCaps *caps = nullptr; + gchar *device_name = nullptr; + gchar *device_path = nullptr; + +#if GST_MF_WINAPI_DESKTOP + if (try_dshow) { + obj = gst_mf_capture_dshow_new (GST_MF_SOURCE_TYPE_VIDEO, i, + nullptr, nullptr); + } else { + obj = gst_mf_source_object_new (GST_MF_SOURCE_TYPE_VIDEO, + i, nullptr, nullptr, nullptr); + } +#else + obj = gst_mf_source_object_new (GST_MF_SOURCE_TYPE_VIDEO, + i, nullptr, nullptr, nullptr); +#endif + if (!obj) + break; + + caps = gst_mf_source_object_get_caps (obj); + if (!caps) { + GST_WARNING_OBJECT (self, "Empty caps for device index %d", i); + goto next; + } + + g_object_get (obj, + "device-path", &device_path, "device-name", &device_name, nullptr); + + if (!device_path) { + GST_WARNING_OBJECT (self, "Device path is unavailable"); + goto next; + } + + if (!device_name) { + GST_WARNING_OBJECT (self, "Device name is unavailable"); + goto next; + } + + props = gst_structure_new ("mf-proplist", + "device.api", G_TYPE_STRING, "mediafoundation", + "device.path", G_TYPE_STRING, device_path, + "device.name", G_TYPE_STRING, device_name, nullptr); + + device = (GstDevice *) g_object_new (GST_TYPE_MF_DEVICE, + "device-path", device_path, + "display-name", device_name, "caps", caps, + "device-class", "Source/Video", "properties", props, nullptr); + + *list = g_list_append (*list, device); + + next: + if (caps) + gst_caps_unref (caps); + if (props) + gst_structure_free (props); + g_free (device_path); + g_free (device_name); + gst_object_unref (obj); + } +} + +static GList * +gst_mf_device_provider_probe (GstDeviceProvider * provider) +{ + GList *list = nullptr; + + gst_mf_device_provider_probe_internal (provider, FALSE, &list); +#if GST_MF_WINAPI_DESKTOP + gst_mf_device_provider_probe_internal (provider, TRUE, &list); +#endif + + return list; +} + +#if GST_MF_WINAPI_DESKTOP +static gboolean +gst_mf_device_provider_start_win32 (GstDeviceProvider * provider) +{ + GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (provider); + GstWin32DeviceWatcher *watcher; + GList *devices = nullptr; + GList *iter; + + if (!GST_IS_WIN32_DEVICE_WATCHER (self->watcher)) + return FALSE; + + GST_DEBUG_OBJECT (self, "Starting Win32 watcher"); + + watcher = GST_WIN32_DEVICE_WATCHER (self->watcher); + + devices = gst_mf_device_provider_probe (provider); + if (devices) { + for (iter = devices; iter; iter = g_list_next (iter)) { + gst_device_provider_device_add (provider, GST_DEVICE (iter->data)); + } + + g_list_free (devices); + } + + return gst_win32_device_watcher_start (watcher); +} +#endif + +#if GST_MF_WINAPI_APP +static gboolean +gst_mf_device_provider_start_winrt (GstDeviceProvider * provider) +{ + GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (provider); + GstWinRTDeviceWatcher *watcher; + GList *devices = nullptr; + GList *iter; + + if (!GST_IS_WINRT_DEVICE_WATCHER (self->watcher)) + return FALSE; + + GST_DEBUG_OBJECT (self, "Starting WinRT watcher"); + watcher = GST_WINRT_DEVICE_WATCHER (self->watcher); + + self->enum_completed = FALSE; + + if (!gst_winrt_device_watcher_start (watcher)) + return FALSE; + + /* Wait for initial enumeration to be completed */ + g_mutex_lock (&self->lock); + while (!self->enum_completed) + g_cond_wait (&self->cond, &self->lock); + + devices = gst_mf_device_provider_probe (provider); + if (devices) { + for (iter = devices; iter; iter = g_list_next (iter)) { + gst_device_provider_device_add (provider, GST_DEVICE (iter->data)); + } + + g_list_free (devices); + } + g_mutex_unlock (&self->lock); + + return TRUE; +} +#endif + +static gboolean +gst_mf_device_provider_start (GstDeviceProvider * provider) +{ + GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (provider); + gboolean ret = FALSE; + + if (!self->watcher) { + GST_ERROR_OBJECT (self, "DeviceWatcher object wasn't configured"); + return FALSE; + } +#if GST_MF_WINAPI_DESKTOP + ret = gst_mf_device_provider_start_win32 (provider); +#endif + +#if GST_MF_WINAPI_APP + if (!ret) + ret = gst_mf_device_provider_start_winrt (provider); +#endif + + return ret; +} + +static void +gst_mf_device_provider_stop (GstDeviceProvider * provider) +{ + GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (provider); + + if (self->watcher) { +#if GST_MF_WINAPI_DESKTOP + if (GST_IS_WIN32_DEVICE_WATCHER (self->watcher)) { + gst_win32_device_watcher_stop (GST_WIN32_DEVICE_WATCHER (self->watcher)); + } +#endif +#if GST_MF_WINAPI_APP + if (GST_IS_WINRT_DEVICE_WATCHER (self->watcher)) { + gst_winrt_device_watcher_stop (GST_WINRT_DEVICE_WATCHER (self->watcher)); + } +#endif + } +} + +static gboolean +gst_mf_device_is_in_list (GList * list, GstDevice * device) +{ + GList *iter; + GstStructure *s; + const gchar *device_id; + gboolean found = FALSE; + + s = gst_device_get_properties (device); + g_assert (s); + + device_id = gst_structure_get_string (s, "device.path"); + g_assert (device_id); + + for (iter = list; iter; iter = g_list_next (iter)) { + GstStructure *other_s; + const gchar *other_id; + + other_s = gst_device_get_properties (GST_DEVICE (iter->data)); + g_assert (other_s); + + other_id = gst_structure_get_string (other_s, "device.path"); + g_assert (other_id); + + if (g_ascii_strcasecmp (device_id, other_id) == 0) { + found = TRUE; + } + + gst_structure_free (other_s); + if (found) + break; + } + + gst_structure_free (s); + + return found; +} + +static void +gst_mf_device_provider_update_devices (GstMFDeviceProvider * self) +{ + GstDeviceProvider *provider = GST_DEVICE_PROVIDER_CAST (self); + GList *prev_devices = nullptr; + GList *new_devices = nullptr; + GList *to_add = nullptr; + GList *to_remove = nullptr; + GList *iter; + + GST_OBJECT_LOCK (self); + prev_devices = g_list_copy_deep (provider->devices, + (GCopyFunc) gst_object_ref, nullptr); + GST_OBJECT_UNLOCK (self); + + new_devices = gst_mf_device_provider_probe (provider); + + /* Ownership of GstDevice for gst_device_provider_device_add() + * and gst_device_provider_device_remove() is a bit complicated. + * Remove floating reference here for things to be clear */ + for (iter = new_devices; iter; iter = g_list_next (iter)) + gst_object_ref_sink (iter->data); + + /* Check newly added devices */ + for (iter = new_devices; iter; iter = g_list_next (iter)) { + if (!gst_mf_device_is_in_list (prev_devices, GST_DEVICE (iter->data))) { + to_add = g_list_prepend (to_add, gst_object_ref (iter->data)); + } + } + + /* Check removed device */ + for (iter = prev_devices; iter; iter = g_list_next (iter)) { + if (!gst_mf_device_is_in_list (new_devices, GST_DEVICE (iter->data))) { + to_remove = g_list_prepend (to_remove, gst_object_ref (iter->data)); + } + } + + for (iter = to_remove; iter; iter = g_list_next (iter)) + gst_device_provider_device_remove (provider, GST_DEVICE (iter->data)); + + for (iter = to_add; iter; iter = g_list_next (iter)) + gst_device_provider_device_add (provider, GST_DEVICE (iter->data)); + + if (prev_devices) + g_list_free_full (prev_devices, (GDestroyNotify) gst_object_unref); + + if (to_add) + g_list_free_full (to_add, (GDestroyNotify) gst_object_unref); + + if (to_remove) + g_list_free_full (to_remove, (GDestroyNotify) gst_object_unref); +} + +#if GST_MF_WINAPI_DESKTOP +static void +gst_mf_device_provider_device_changed (GstWin32DeviceWatcher * watcher, + WPARAM wparam, LPARAM lparam, gpointer user_data) +{ + GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (user_data); + + if (wparam == DBT_DEVICEARRIVAL || wparam == DBT_DEVICEREMOVECOMPLETE) { + gst_mf_device_provider_update_devices (self); + } +} +#endif + +#if GST_MF_WINAPI_APP +static void +gst_mf_device_provider_device_added (GstWinRTDeviceWatcher * watcher, + IDeviceInformation * info, gpointer user_data) +{ + GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (user_data); + + if (self->enum_completed) + gst_mf_device_provider_update_devices (self); +} + +static void +gst_mf_device_provider_device_removed (GstWinRTDeviceWatcher * watcher, + IDeviceInformationUpdate * info_update, gpointer user_data) +{ + GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (user_data); + + if (self->enum_completed) + gst_mf_device_provider_update_devices (self); +} + + +static void +gst_mf_device_provider_device_updated (GstWinRTDeviceWatcher * watcher, + IDeviceInformationUpdate * info_update, gpointer user_data) +{ + GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (user_data); + + gst_mf_device_provider_update_devices (self); +} + +static void +gst_mf_device_provider_device_enum_completed (GstWinRTDeviceWatcher * + watcher, gpointer user_data) +{ + GstMFDeviceProvider *self = GST_MF_DEVICE_PROVIDER (user_data); + + g_mutex_lock (&self->lock); + GST_DEBUG_OBJECT (self, "Enumeration completed"); + self->enum_completed = TRUE; + g_cond_signal (&self->cond); + g_mutex_unlock (&self->lock); +} +#endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfh264enc.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfh264enc.cpp
Changed
@@ -39,7 +39,7 @@ #include <gst/gst.h> #include <gst/pbutils/pbutils.h> -#include "gstmfvideoenc.h" +#include "gstmfvideoencoder.h" #include "gstmfh264enc.h" #include <wrl.h> @@ -62,6 +62,11 @@ GST_MF_H264_ENC_RC_MODE_QUALITY, }; +/** + * GstMFH264EncRCMode: + * + * Since: 1.18 + */ #define GST_TYPE_MF_H264_ENC_RC_MODE (gst_mf_h264_enc_rc_mode_get_type()) static GType gst_mf_h264_enc_rc_mode_get_type (void) @@ -75,7 +80,7 @@ {GST_MF_H264_ENC_RC_MODE_UNCONSTRAINED_VBR, "Unconstrained variable bitrate", "uvbr"}, {GST_MF_H264_ENC_RC_MODE_QUALITY, "Quality-based variable bitrate", "qvbr"}, - {0, NULL, NULL} + {0, nullptr, nullptr} }; if (!rc_mode_type) { @@ -90,6 +95,11 @@ GST_MF_H264_ENC_ADAPTIVE_MODE_FRAMERATE, }; +/** + * GstMFH264EncAdaptiveMode: + * + * Since: 1.18 + */ #define GST_TYPE_MF_H264_ENC_ADAPTIVE_MODE (gst_mf_h264_enc_adaptive_mode_get_type()) static GType gst_mf_h264_enc_adaptive_mode_get_type (void) @@ -100,7 +110,7 @@ {GST_MF_H264_ENC_ADAPTIVE_MODE_NONE, "None", "none"}, {GST_MF_H264_ENC_ADAPTIVE_MODE_FRAMERATE, "Adaptively change the frame rate", "framerate"}, - {0, NULL, NULL} + {0, nullptr, nullptr} }; if (!adaptive_mode_type) { @@ -117,6 +127,11 @@ GST_MF_H264_ENC_CONTENT_TYPE_FIXED_CAMERA_ANGLE, }; +/** + * GstMFH264EncContentType: + * + * Since: 1.18 + */ #define GST_TYPE_MF_H264_ENC_CONTENT_TYPE (gst_mf_h264_enc_content_type_get_type()) static GType gst_mf_h264_enc_content_type_get_type (void) @@ -127,7 +142,7 @@ {GST_MF_H264_ENC_CONTENT_TYPE_UNKNOWN, "Unknown", "unknown"}, {GST_MF_H264_ENC_CONTENT_TYPE_FIXED_CAMERA_ANGLE, "Fixed Camera Angle, such as a webcam", "fixed"}, - {0, NULL, NULL} + {0, nullptr, nullptr} }; if (!content_type) { @@ -189,9 +204,26 @@ #define DEFAULT_QP_B 26 #define DEFAULT_REF 2 +#define DOC_SINK_CAPS_COMM \ + "format = (string) NV12, " \ + "width = (int) 64, 8192 , height = (int) 64, 8192 " + +#define DOC_SINK_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw, " DOC_SINK_CAPS_COMM + +#define DOC_SRC_CAPS \ + "video/x-h264, width = (int) 64, 8192 , height = (int) 64, 8192 , " \ + "stream-format = (string) byte-stream, alignment = (string) au, " \ + "profile = (string) { high, main, constrained-baseline, baseline }" + typedef struct _GstMFH264Enc { - GstMFVideoEnc parent; + GstMFVideoEncoder parent; + + GMutex prop_lock; + + gboolean prop_updated; /* properties */ guint bitrate; @@ -223,31 +255,34 @@ typedef struct _GstMFH264EncClass { - GstMFVideoEncClass parent_class; + GstMFVideoEncoderClass parent_class; } GstMFH264EncClass; -static GstElementClass *parent_class = NULL; +static GstElementClass *parent_class = nullptr; static void gst_mf_h264_enc_finalize (GObject * object); static void gst_mf_h264_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_mf_h264_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static gboolean gst_mf_h264_enc_set_option (GstMFVideoEnc * mfenc, +static gboolean gst_mf_h264_enc_set_option (GstMFVideoEncoder * mfenc, GstVideoCodecState * state, IMFMediaType * output_type); -static gboolean gst_mf_h264_enc_set_src_caps (GstMFVideoEnc * mfenc, +static gboolean gst_mf_h264_enc_set_src_caps (GstMFVideoEncoder * mfenc, GstVideoCodecState * state, IMFMediaType * output_type); +static gboolean gst_mf_h264_enc_check_reconfigure (GstMFVideoEncoder * encoder); static void gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstMFVideoEncClass *mfenc_class = GST_MF_VIDEO_ENC_CLASS (klass); - GstMFVideoEncClassData *cdata = (GstMFVideoEncClassData *) data; - GstMFVideoEncDeviceCaps *device_caps = &cdata->device_caps; + GstMFVideoEncoderClass *mfenc_class = GST_MF_VIDEO_ENCODER_CLASS (klass); + GstMFVideoEncoderClassData *cdata = (GstMFVideoEncoderClassData *) data; + GstMFVideoEncoderDeviceCaps *device_caps = &cdata->device_caps; gchar *long_name; gchar *classification; + GstPadTemplate *pad_templ; + GstCaps *doc_caps; parent_class = (GstElementClass *) g_type_class_peek_parent (klass); @@ -261,6 +296,11 @@ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); if (device_caps->rc_mode) { + /** + * GstMFH264Enc:rc-mode: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_RC_MODE, g_param_spec_enum ("rc-mode", "Rate Control Mode", "Rate Control Mode", @@ -278,6 +318,11 @@ /* quality and qp has the identical meaning but scale is different * use qp if available */ if (device_caps->quality && !device_caps->qp) { + /** + * GstMFH264Enc:quality: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_QUALITY, g_param_spec_uint ("quality", "Quality", "Quality applied when rc-mode is qvbr", @@ -287,6 +332,11 @@ } if (device_caps->adaptive_mode) { + /** + * GstMFH264Enc:adaptive-mode: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_ADAPTIVE_MODE, g_param_spec_enum ("adaptive-mode", "Adaptive Mode", "Adaptive Mode", GST_TYPE_MF_H264_ENC_ADAPTIVE_MODE, @@ -302,6 +352,11 @@ } if (device_caps->buffer_size) { + /** + * GstMFH264Enc:vbv-buffer-size: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_BUFFER_SIZE, g_param_spec_uint ("vbv-buffer-size", "VBV Buffer Size", "VBV(HRD) Buffer Size in bytes (0 = MFT default)", @@ -311,6 +366,11 @@ } if (device_caps->max_bitrate) { + /** + * GstMFH264Enc:max-bitrate: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_MAX_BITRATE, g_param_spec_uint ("max-bitrate", "Max Bitrate", "The maximum bitrate applied when rc-mode is \"pcvbr\" in kbit/sec", @@ -320,6 +380,11 @@ } if (device_caps->quality_vs_speed) { + /** + * GstMFH264Enc:quality-vs-speed: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_QUALITY_VS_SPEED, g_param_spec_uint ("quality-vs-speed", "Quality Vs Speed", "Quality and speed tradeoff, 0, 33: Low complexity, " @@ -330,6 +395,11 @@ } if (device_caps->cabac) { + /** + * GstMFH264Enc:cabac: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_CABAC, g_param_spec_boolean ("cabac", "Use CABAC", "Enable CABAC entropy coding", @@ -339,6 +409,11 @@ } if (device_caps->sps_id) { + /** + * GstMFH264Enc:sps-id: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_SPS_ID, g_param_spec_uint ("sps-id", "SPS Id", "The SPS id to use", 0, 31, @@ -348,6 +423,11 @@ } if (device_caps->pps_id) { + /** + * GstMFH264Enc:pps-id: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_PPS_ID, g_param_spec_uint ("pps-id", "PPS Id", "The PPS id to use", 0, 255, @@ -357,6 +437,11 @@ } if (device_caps->bframes) { + /** + * GstMFH264Enc:bframes: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_BFRAMES, g_param_spec_uint ("bframes", "bframes", "The maximum number of consecutive B frames", 0, 2, @@ -366,6 +451,11 @@ } if (device_caps->gop_size) { + /** + * GstMFH264Enc:gop-size: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_GOP_SIZE, g_param_spec_int ("gop-size", "GOP size", "The number of pictures from one GOP header to the next. " @@ -377,6 +467,11 @@ } if (device_caps->threads) { + /** + * GstMFH264Enc:threads: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_THREADS, g_param_spec_uint ("threads", "Threads", "The number of worker threads used by a encoder, (0 = MFT default)", @@ -386,6 +481,11 @@ } if (device_caps->content_type) { + /** + * GstMFH264Enc:content-type: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_CONTENT_TYPE, g_param_spec_enum ("content-type", "Content Type", "Indicates the type of video content", @@ -401,6 +501,11 @@ } if (device_caps->qp) { + /** + * GstMFH264Enc:qp: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_QP, g_param_spec_uint ("qp", "qp", "QP applied when rc-mode is \"qvbr\"", 16, 51, @@ -410,6 +515,11 @@ } if (device_caps->low_latency) { + /** + * GstMFH264Enc:low-latency: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_LOW_LATENCY, g_param_spec_boolean ("low-latency", "Low Latency", "Enable low latency encoding", @@ -419,6 +529,11 @@ } if (device_caps->min_qp) { + /** + * GstMFH264Enc:min-qp: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_MIN_QP, g_param_spec_uint ("min-qp", "Min QP", "The minimum allowed QP applied to all rc-mode", 0, 51, @@ -428,6 +543,11 @@ } if (device_caps->max_qp) { + /** + * GstMFH264Enc:max-qp: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_MAX_QP, g_param_spec_uint ("max-qp", "Max QP", "The maximum allowed QP applied to all rc-mode", 0, 51, @@ -437,6 +557,11 @@ } if (device_caps->frame_type_qp) { + /** + * GstMFH264Enc:qp-i: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_QP_I, g_param_spec_uint ("qp-i", "QP I", "QP applied to I frames", 0, 51, @@ -444,6 +569,11 @@ (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + /** + * GstMFH264Enc:qp-p: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_QP_P, g_param_spec_uint ("qp-p", "QP P", "QP applied to P frames", 0, 51, @@ -451,6 +581,11 @@ (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + /** + * GstMFH264Enc:qp-b: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_QP_B, g_param_spec_uint ("qp-b", "QP B", "QP applied to B frames", 0, 51, @@ -460,6 +595,11 @@ } if (device_caps->max_num_ref) { + /** + * GstMFH264Enc:ref: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_REF, g_param_spec_uint ("ref", "Reference Frames", "The number of reference frames", @@ -493,8 +633,9 @@ g_object_class_install_property (gobject_class, PROP_ADAPTER_LUID, g_param_spec_int64 ("adapter-luid", "Adapter LUID", "DXGI Adapter LUID (Locally Unique Identifier) of created device", - G_MININT64, G_MAXINT64, device_caps->adapter_luid, - (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_MININT64, G_MAXINT64, 0, + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); } @@ -509,15 +650,24 @@ g_free (long_name); g_free (classification); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); mfenc_class->set_option = GST_DEBUG_FUNCPTR (gst_mf_h264_enc_set_option); mfenc_class->set_src_caps = GST_DEBUG_FUNCPTR (gst_mf_h264_enc_set_src_caps); + mfenc_class->check_reconfigure = + GST_DEBUG_FUNCPTR (gst_mf_h264_enc_check_reconfigure); mfenc_class->codec_id = MFVideoFormat_H264; mfenc_class->enum_flags = cdata->enum_flags; @@ -533,6 +683,8 @@ static void gst_mf_h264_enc_init (GstMFH264Enc * self) { + g_mutex_init (&self->prop_lock); + self->bitrate = DEFAULT_BITRATE; self->rc_mode = DEFAULT_RC_MODE; self->quality = DEFAULT_QUALITY_LEVEL; @@ -562,6 +714,7 @@ GstMFH264Enc *self = (GstMFH264Enc *) (object); g_free (self->profile_str); + g_mutex_clear (&self->prop_lock); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -571,7 +724,7 @@ GValue * value, GParamSpec * pspec) { GstMFH264Enc *self = (GstMFH264Enc *) (object); - GstMFVideoEncClass *klass = GST_MF_VIDEO_ENC_GET_CLASS (object); + GstMFVideoEncoderClass *klass = GST_MF_VIDEO_ENCODER_GET_CLASS (object); switch (prop_id) { case PROP_BITRATE: @@ -653,82 +806,132 @@ } static void +update_boolean (GstMFH264Enc * self, gboolean * old_val, const GValue * new_val) +{ + gboolean val = g_value_get_boolean (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->prop_updated = TRUE; +} + +static void +update_int (GstMFH264Enc * self, gint * old_val, const GValue * new_val) +{ + gint val = g_value_get_int (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->prop_updated = TRUE; +} + +static void +update_uint (GstMFH264Enc * self, guint * old_val, const GValue * new_val) +{ + guint val = g_value_get_uint (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->prop_updated = TRUE; +} + +static void +update_enum (GstMFH264Enc * self, guint * old_val, const GValue * new_val) +{ + gint val = g_value_get_enum (new_val); + + if (*old_val == (guint) val) + return; + + *old_val = val; + self->prop_updated = TRUE; +} + +static void gst_mf_h264_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstMFH264Enc *self = (GstMFH264Enc *) (object); + g_mutex_lock (&self->prop_lock); switch (prop_id) { case PROP_BITRATE: - self->bitrate = g_value_get_uint (value); + update_uint (self, &self->bitrate, value); break; case PROP_RC_MODE: - self->rc_mode = g_value_get_enum (value); + update_enum (self, &self->rc_mode, value); break; case PROP_QUALITY: - self->quality = g_value_get_uint (value); + update_uint (self, &self->quality, value); break; case PROP_ADAPTIVE_MODE: - self->adaptive_mode = g_value_get_enum (value); + update_enum (self, &self->adaptive_mode, value); break; case PROP_BUFFER_SIZE: - self->buffer_size = g_value_get_uint (value); + update_uint (self, &self->buffer_size, value); break; case PROP_MAX_BITRATE: - self->max_bitrate = g_value_get_uint (value); + update_uint (self, &self->max_bitrate, value); break; case PROP_QUALITY_VS_SPEED: - self->quality_vs_speed = g_value_get_uint (value); + update_uint (self, &self->quality_vs_speed, value); break; case PROP_CABAC: - self->cabac = g_value_get_boolean (value); + update_boolean (self, &self->cabac, value); break; case PROP_SPS_ID: - self->sps_id = g_value_get_uint (value); + update_uint (self, &self->sps_id, value); break; case PROP_PPS_ID: - self->pps_id = g_value_get_uint (value); + update_uint (self, &self->pps_id, value); break; case PROP_BFRAMES: - self->bframes = g_value_get_uint (value); + update_uint (self, &self->bframes, value); break; case PROP_GOP_SIZE: - self->gop_size = g_value_get_int (value); + update_int (self, &self->gop_size, value); break; case PROP_THREADS: - self->threads = g_value_get_uint (value); + update_uint (self, &self->threads, value); break; case PROP_CONTENT_TYPE: - self->content_type = g_value_get_enum (value); + update_enum (self, &self->content_type, value); break; case PROP_QP: - self->qp = g_value_get_uint (value); + update_uint (self, &self->qp, value); break; case PROP_LOW_LATENCY: - self->low_latency = g_value_get_boolean (value); + update_boolean (self, &self->low_latency, value); break; case PROP_MIN_QP: - self->min_qp = g_value_get_uint (value); + update_uint (self, &self->min_qp, value); break; case PROP_MAX_QP: - self->max_qp = g_value_get_uint (value); + update_uint (self, &self->max_qp, value); break; case PROP_QP_I: - self->qp_i = g_value_get_uint (value); + update_uint (self, &self->qp_i, value); break; case PROP_QP_P: - self->qp_p = g_value_get_uint (value); + update_uint (self, &self->qp_p, value); break; case PROP_QP_B: - self->qp_b = g_value_get_uint (value); + update_uint (self, &self->qp_b, value); break; case PROP_REF: - self->max_num_ref = g_value_get_uint (value); + update_uint (self, &self->max_num_ref, value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } + g_mutex_unlock (&self->prop_lock); } static guint @@ -782,12 +985,12 @@ } G_STMT_END static gboolean -gst_mf_h264_enc_set_option (GstMFVideoEnc * mfenc, GstVideoCodecState * state, - IMFMediaType * output_type) +gst_mf_h264_enc_set_option (GstMFVideoEncoder * mfenc, + GstVideoCodecState * state, IMFMediaType * output_type) { GstMFH264Enc *self = (GstMFH264Enc *) mfenc; - GstMFVideoEncClass *klass = GST_MF_VIDEO_ENC_GET_CLASS (mfenc); - GstMFVideoEncDeviceCaps *device_caps = &klass->device_caps; + GstMFVideoEncoderClass *klass = GST_MF_VIDEO_ENCODER_GET_CLASS (mfenc); + GstMFVideoEncoderDeviceCaps *device_caps = &klass->device_caps; HRESULT hr; GstCaps *allowed_caps, *template_caps; eAVEncH264VProfile selected_profile = eAVEncH264VProfile_Main; @@ -860,10 +1063,14 @@ return FALSE; } + g_mutex_lock (&self->prop_lock); hr = output_type->SetUINT32 (MF_MT_AVG_BITRATE, MIN (self->bitrate * 1024, G_MAXUINT - 1)); - if (!gst_mf_result (hr)) + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Failed to set bitrate"); + g_mutex_unlock (&self->prop_lock); return FALSE; + } if (device_caps->rc_mode) { guint rc_mode; @@ -1018,11 +1225,14 @@ WARNING_HR (hr, CODECAPI_AVEncVideoMaxNumRefFrame); } + self->prop_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + return TRUE; } static gboolean -gst_mf_h264_enc_set_src_caps (GstMFVideoEnc * mfenc, +gst_mf_h264_enc_set_src_caps (GstMFVideoEncoder * mfenc, GstVideoCodecState * state, IMFMediaType * output_type) { GstMFH264Enc *self = (GstMFH264Enc *) mfenc; @@ -1036,7 +1246,7 @@ gst_structure_set (s, "stream-format", G_TYPE_STRING, "byte-stream", "alignment", G_TYPE_STRING, "au", "profile", - G_TYPE_STRING, self->profile_str, NULL); + G_TYPE_STRING, self->profile_str, nullptr); out_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (self), out_caps, state); @@ -1049,7 +1259,7 @@ tags = gst_tag_list_new_empty (); gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, gst_element_get_metadata (GST_ELEMENT_CAST (self), - GST_ELEMENT_METADATA_LONGNAME), NULL); + GST_ELEMENT_METADATA_LONGNAME), nullptr); gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (self), tags, GST_TAG_MERGE_REPLACE); gst_tag_list_unref (tags); @@ -1057,17 +1267,31 @@ return TRUE; } +static gboolean +gst_mf_h264_enc_check_reconfigure (GstMFVideoEncoder * encoder) +{ + GstMFH264Enc *self = (GstMFH264Enc *) encoder; + gboolean ret; + + g_mutex_lock (&self->prop_lock); + ret = self->prop_updated; + self->prop_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return ret; +} + void gst_mf_h264_enc_plugin_init (GstPlugin * plugin, guint rank, GList * d3d11_device) { GTypeInfo type_info = { sizeof (GstMFH264EncClass), - NULL, - NULL, + nullptr, + nullptr, (GClassInitFunc) gst_mf_h264_enc_class_init, - NULL, - NULL, + nullptr, + nullptr, sizeof (GstMFH264Enc), 0, (GInstanceInitFunc) gst_mf_h264_enc_init, @@ -1076,5 +1300,6 @@ GST_DEBUG_CATEGORY_INIT (gst_mf_h264_enc_debug, "mfh264enc", 0, "mfh264enc"); - gst_mf_video_enc_register (plugin, rank, &subtype, &type_info, d3d11_device); + gst_mf_video_encoder_register (plugin, + rank, &subtype, &type_info, d3d11_device); }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfh265enc.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfh265enc.cpp
Changed
@@ -36,7 +36,7 @@ #endif #include <gst/gst.h> -#include "gstmfvideoenc.h" +#include "gstmfvideoencoder.h" #include "gstmfh265enc.h" #include <wrl.h> @@ -53,6 +53,11 @@ GST_MF_H265_ENC_RC_MODE_QUALITY, }; +/** + * GstMFH265EncRCMode: + * + * Since: 1.18 + */ #define GST_TYPE_MF_H265_ENC_RC_MODE (gst_mf_h265_enc_rc_mode_get_type()) static GType gst_mf_h265_enc_rc_mode_get_type (void) @@ -62,7 +67,7 @@ static const GEnumValue rc_mode_types = { {GST_MF_H265_ENC_RC_MODE_CBR, "Constant bitrate", "cbr"}, {GST_MF_H265_ENC_RC_MODE_QUALITY, "Quality-based variable bitrate", "qvbr"}, - {0, NULL, NULL} + {0, nullptr, nullptr} }; if (!rc_mode_type) { @@ -77,6 +82,11 @@ GST_MF_H265_ENC_CONTENT_TYPE_FIXED_CAMERA_ANGLE, }; +/** + * GstMFH265EncContentType: + * + * Since: 1.18 + */ #define GST_TYPE_MF_H265_ENC_CONTENT_TYPE (gst_mf_h265_enc_content_type_get_type()) static GType gst_mf_h265_enc_content_type_get_type (void) @@ -87,7 +97,7 @@ {GST_MF_H265_ENC_CONTENT_TYPE_UNKNOWN, "Unknown", "unknown"}, {GST_MF_H265_ENC_CONTENT_TYPE_FIXED_CAMERA_ANGLE, "Fixed Camera Angle, such as a webcam", "fixed"}, - {0, NULL, NULL} + {0, nullptr, nullptr} }; if (!content_type) { @@ -140,9 +150,26 @@ #define DEFAULT_QP_B 26 #define DEFAULT_REF 2 +#define DOC_SINK_CAPS_COMM \ + "format = (string) { NV12, P010_10LE }, " \ + "width = (int) 64, 8192 , height = (int) 64, 8192 " + +#define DOC_SINK_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw, " DOC_SINK_CAPS_COMM + +#define DOC_SRC_CAPS \ + "video/x-h265, width = (int) 64, 8192 , height = (int) 64, 8192 , " \ + "stream-format = (string) byte-stream, alignment = (string) au, " \ + "profile = (string) { main, main-10 }" + typedef struct _GstMFH265Enc { - GstMFVideoEnc parent; + GstMFVideoEncoder parent; + + GMutex prop_lock; + + gboolean prop_updated; /* properties */ guint bitrate; @@ -153,7 +180,7 @@ guint max_bitrate; guint quality_vs_speed; guint bframes; - guint gop_size; + gint gop_size; guint threads; guint content_type; guint qp; @@ -168,33 +195,38 @@ typedef struct _GstMFH265EncClass { - GstMFVideoEncClass parent_class; + GstMFVideoEncoderClass parent_class; } GstMFH265EncClass; -static GstElementClass *parent_class = NULL; +static GstElementClass *parent_class = nullptr; +static void gst_mf_h265_enc_finalize (GObject * object); static void gst_mf_h265_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_mf_h265_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static gboolean gst_mf_h265_enc_set_option (GstMFVideoEnc * mfenc, +static gboolean gst_mf_h265_enc_set_option (GstMFVideoEncoder * encoder, GstVideoCodecState * state, IMFMediaType * output_type); -static gboolean gst_mf_h265_enc_set_src_caps (GstMFVideoEnc * mfenc, +static gboolean gst_mf_h265_enc_set_src_caps (GstMFVideoEncoder * encoder, GstVideoCodecState * state, IMFMediaType * output_type); +static gboolean gst_mf_h265_enc_check_reconfigure (GstMFVideoEncoder * encoder); static void gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstMFVideoEncClass *mfenc_class = GST_MF_VIDEO_ENC_CLASS (klass); - GstMFVideoEncClassData *cdata = (GstMFVideoEncClassData *) data; - GstMFVideoEncDeviceCaps *device_caps = &cdata->device_caps; + GstMFVideoEncoderClass *encoder_class = GST_MF_VIDEO_ENCODER_CLASS (klass); + GstMFVideoEncoderClassData *cdata = (GstMFVideoEncoderClassData *) data; + GstMFVideoEncoderDeviceCaps *device_caps = &cdata->device_caps; gchar *long_name; gchar *classification; + GstPadTemplate *pad_templ; + GstCaps *doc_caps; parent_class = (GstElementClass *) g_type_class_peek_parent (klass); + gobject_class->finalize = gst_mf_h265_enc_finalize; gobject_class->get_property = gst_mf_h265_enc_get_property; gobject_class->set_property = gst_mf_h265_enc_set_property; @@ -204,6 +236,11 @@ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); if (device_caps->rc_mode) { + /** + * GstMFH264Enc:rc-mode: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_RC_MODE, g_param_spec_enum ("rc-mode", "Rate Control Mode", "Rate Control Mode", @@ -219,6 +256,11 @@ } if (device_caps->buffer_size) { + /** + * GstMFH264Enc:vbv-buffer-size: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_BUFFER_SIZE, g_param_spec_uint ("vbv-buffer-size", "VBV Buffer Size", "VBV(HRD) Buffer Size in bytes (0 = MFT default)", @@ -228,6 +270,11 @@ } if (device_caps->max_bitrate) { + /** + * GstMFH264Enc:max-bitrate: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_MAX_BITRATE, g_param_spec_uint ("max-bitrate", "Max Bitrate", "The maximum bitrate applied when rc-mode is \"pcvbr\" in kbit/sec " @@ -237,6 +284,11 @@ } if (device_caps->quality_vs_speed) { + /** + * GstMFH264Enc:quality-vs-speed: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_QUALITY_VS_SPEED, g_param_spec_uint ("quality-vs-speed", "Quality Vs Speed", "Quality and speed tradeoff, 0, 33: Low complexity, " @@ -247,6 +299,11 @@ } if (device_caps->bframes) { + /** + * GstMFH264Enc:bframes: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_BFRAMES, g_param_spec_uint ("bframes", "bframes", "The maximum number of consecutive B frames", @@ -256,6 +313,11 @@ } if (device_caps->gop_size) { + /** + * GstMFH264Enc:gop-size: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_GOP_SIZE, g_param_spec_int ("gop-size", "GOP size", "The number of pictures from one GOP header to the next. " @@ -267,6 +329,11 @@ } if (device_caps->threads) { + /** + * GstMFH264Enc:threads: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_THREADS, g_param_spec_uint ("threads", "Threads", "The number of worker threads used by a encoder, (0 = MFT default)", @@ -276,6 +343,11 @@ } if (device_caps->content_type) { + /** + * GstMFH264Enc:content-type: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_CONTENT_TYPE, g_param_spec_enum ("content-type", "Content Type", "Indicates the type of video content", @@ -291,6 +363,11 @@ } if (device_caps->qp) { + /** + * GstMFH264Enc:qp: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_QP, g_param_spec_uint ("qp", "qp", "QP applied when rc-mode is \"qvbr\"", 16, 51, DEFAULT_QP, @@ -299,6 +376,11 @@ } if (device_caps->low_latency) { + /** + * GstMFH264Enc:low-latency: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_LOW_LATENCY, g_param_spec_boolean ("low-latency", "Low Latency", "Enable low latency encoding", DEFAULT_LOW_LATENCY, @@ -307,6 +389,11 @@ } if (device_caps->min_qp) { + /** + * GstMFH265Enc:min-qp: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_MIN_QP, g_param_spec_uint ("min-qp", "Min QP", "The minimum allowed QP applied to all rc-mode", @@ -316,6 +403,11 @@ } if (device_caps->max_qp) { + /** + * GstMFH265Enc:max-qp: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_MAX_QP, g_param_spec_uint ("max-qp", "Max QP", "The maximum allowed QP applied to all rc-mode", @@ -325,6 +417,11 @@ } if (device_caps->frame_type_qp) { + /** + * GstMFH265Enc:qp-i: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_QP_I, g_param_spec_uint ("qp-i", "QP I", "QP applied to I frames", 0, 51, @@ -332,6 +429,11 @@ (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + /** + * GstMFH265Enc:qp-p: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_QP_P, g_param_spec_uint ("qp-p", "QP P", "QP applied to P frames", 0, 51, @@ -339,6 +441,11 @@ (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + /** + * GstMFH265Enc:qp-b: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_QP_B, g_param_spec_uint ("qp-b", "QP B", "QP applied to B frames", 0, 51, @@ -348,6 +455,11 @@ } if (device_caps->max_num_ref) { + /** + * GstMFH265Enc:ref: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_REF, g_param_spec_uint ("ref", "Reference Frames", "The number of reference frames", @@ -381,8 +493,9 @@ g_object_class_install_property (gobject_class, PROP_ADAPTER_LUID, g_param_spec_int64 ("adapter-luid", "Adapter LUID", "DXGI Adapter LUID (Locally Unique Identifier) of created device", - G_MININT64, G_MAXINT64, device_caps->adapter_luid, - (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_MININT64, G_MAXINT64, 0, + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); } @@ -397,20 +510,30 @@ g_free (long_name); g_free (classification); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); - - mfenc_class->set_option = GST_DEBUG_FUNCPTR (gst_mf_h265_enc_set_option); - mfenc_class->set_src_caps = GST_DEBUG_FUNCPTR (gst_mf_h265_enc_set_src_caps); - - mfenc_class->codec_id = MFVideoFormat_HEVC; - mfenc_class->enum_flags = cdata->enum_flags; - mfenc_class->device_index = cdata->device_index; - mfenc_class->device_caps = *device_caps; + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + encoder_class->set_option = GST_DEBUG_FUNCPTR (gst_mf_h265_enc_set_option); + encoder_class->set_src_caps = + GST_DEBUG_FUNCPTR (gst_mf_h265_enc_set_src_caps); + encoder_class->check_reconfigure = + GST_DEBUG_FUNCPTR (gst_mf_h265_enc_check_reconfigure); + + encoder_class->codec_id = MFVideoFormat_HEVC; + encoder_class->enum_flags = cdata->enum_flags; + encoder_class->device_index = cdata->device_index; + encoder_class->device_caps = *device_caps; g_free (cdata->device_name); gst_caps_unref (cdata->sink_caps); @@ -421,6 +544,8 @@ static void gst_mf_h265_enc_init (GstMFH265Enc * self) { + g_mutex_init (&self->prop_lock); + self->bitrate = DEFAULT_BITRATE; self->rc_mode = DEFAULT_RC_MODE; self->max_bitrate = DEFAULT_MAX_BITRATE; @@ -440,11 +565,21 @@ } static void +gst_mf_h265_enc_finalize (GObject * object) +{ + GstMFH265Enc *self = (GstMFH265Enc *) (object); + + g_mutex_clear (&self->prop_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void gst_mf_h265_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstMFH265Enc *self = (GstMFH265Enc *) (object); - GstMFVideoEncClass *klass = GST_MF_VIDEO_ENC_GET_CLASS (object); + GstMFVideoEncoderClass *klass = GST_MF_VIDEO_ENCODER_GET_CLASS (object); switch (prop_id) { case PROP_BITRATE: @@ -511,67 +646,117 @@ } static void +update_boolean (GstMFH265Enc * self, gboolean * old_val, const GValue * new_val) +{ + gboolean val = g_value_get_boolean (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->prop_updated = TRUE; +} + +static void +update_int (GstMFH265Enc * self, gint * old_val, const GValue * new_val) +{ + gint val = g_value_get_int (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->prop_updated = TRUE; +} + +static void +update_uint (GstMFH265Enc * self, guint * old_val, const GValue * new_val) +{ + guint val = g_value_get_uint (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->prop_updated = TRUE; +} + +static void +update_enum (GstMFH265Enc * self, guint * old_val, const GValue * new_val) +{ + gint val = g_value_get_enum (new_val); + + if (*old_val == (guint) val) + return; + + *old_val = val; + self->prop_updated = TRUE; +} + +static void gst_mf_h265_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstMFH265Enc *self = (GstMFH265Enc *) (object); + g_mutex_lock (&self->prop_lock); switch (prop_id) { case PROP_BITRATE: - self->bitrate = g_value_get_uint (value); + update_uint (self, &self->bitrate, value); break; case PROP_RC_MODE: - self->rc_mode = g_value_get_enum (value); + update_enum (self, &self->rc_mode, value); break; case PROP_BUFFER_SIZE: - self->buffer_size = g_value_get_uint (value); + update_uint (self, &self->buffer_size, value); break; case PROP_MAX_BITRATE: - self->max_bitrate = g_value_get_uint (value); + update_uint (self, &self->max_bitrate, value); break; case PROP_QUALITY_VS_SPEED: - self->quality_vs_speed = g_value_get_uint (value); + update_uint (self, &self->quality_vs_speed, value); break; case PROP_BFRAMES: - self->bframes = g_value_get_uint (value); + update_uint (self, &self->bframes, value); break; case PROP_GOP_SIZE: - self->gop_size = g_value_get_int (value); + update_int (self, &self->gop_size, value); break; case PROP_THREADS: - self->threads = g_value_get_uint (value); + update_uint (self, &self->threads, value); break; case PROP_CONTENT_TYPE: - self->content_type = g_value_get_enum (value); + update_enum (self, &self->content_type, value); break; case PROP_QP: - self->qp = g_value_get_uint (value); + update_uint (self, &self->qp, value); break; case PROP_LOW_LATENCY: - self->low_latency = g_value_get_boolean (value); + update_boolean (self, &self->low_latency, value); break; case PROP_MIN_QP: - self->min_qp = g_value_get_uint (value); + update_uint (self, &self->min_qp, value); break; case PROP_MAX_QP: - self->max_qp = g_value_get_uint (value); + update_uint (self, &self->max_qp, value); break; case PROP_QP_I: - self->qp_i = g_value_get_uint (value); + update_uint (self, &self->qp_i, value); break; case PROP_QP_P: - self->qp_p = g_value_get_uint (value); + update_uint (self, &self->qp_p, value); break; case PROP_QP_B: - self->qp_b = g_value_get_uint (value); + update_uint (self, &self->qp_b, value); break; case PROP_REF: - self->max_num_ref = g_value_get_uint (value); + update_uint (self, &self->max_num_ref, value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } + g_mutex_unlock (&self->prop_lock); } static guint @@ -608,20 +793,20 @@ } G_STMT_END static gboolean -gst_mf_h265_enc_set_option (GstMFVideoEnc * mfenc, GstVideoCodecState * state, - IMFMediaType * output_type) +gst_mf_h265_enc_set_option (GstMFVideoEncoder * encoder, + GstVideoCodecState * state, IMFMediaType * output_type) { - GstMFH265Enc *self = (GstMFH265Enc *) mfenc; - GstMFVideoEncClass *klass = GST_MF_VIDEO_ENC_GET_CLASS (mfenc); - GstMFVideoEncDeviceCaps *device_caps = &klass->device_caps; + GstMFH265Enc *self = (GstMFH265Enc *) encoder; + GstMFVideoEncoderClass *klass = GST_MF_VIDEO_ENCODER_GET_CLASS (encoder); + GstMFVideoEncoderDeviceCaps *device_caps = &klass->device_caps; HRESULT hr; - GstMFTransform *transform = mfenc->transform; + GstMFTransform *transform = encoder->transform; hr = output_type->SetGUID (MF_MT_SUBTYPE, MFVideoFormat_HEVC); if (!gst_mf_result (hr)) return FALSE; - if (GST_VIDEO_INFO_FORMAT (&mfenc->input_state->info) == + if (GST_VIDEO_INFO_FORMAT (&encoder->input_state->info) == GST_VIDEO_FORMAT_P010_10LE) { hr = output_type->SetUINT32 (MF_MT_MPEG2_PROFILE, eAVEncH265VProfile_Main_420_10); @@ -633,10 +818,14 @@ if (!gst_mf_result (hr)) return FALSE; + g_mutex_lock (&self->prop_lock); hr = output_type->SetUINT32 (MF_MT_AVG_BITRATE, MIN (self->bitrate * 1024, G_MAXUINT - 1)); - if (!gst_mf_result (hr)) + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Failed to set bitrate"); + g_mutex_unlock (&self->prop_lock); return FALSE; + } if (device_caps->rc_mode) { guint rc_mode; @@ -667,12 +856,12 @@ WARNING_HR (hr, CODECAPI_AVEncCommonQualityVsSpeed); } - mfenc->has_reorder_frame = FALSE; + encoder->has_reorder_frame = FALSE; if (device_caps->bframes) { hr = gst_mf_transform_set_codec_api_uint32 (transform, &CODECAPI_AVEncMPVDefaultBPictureCount, self->bframes); if (SUCCEEDED (hr) && self->bframes > 0) - mfenc->has_reorder_frame = TRUE; + encoder->has_reorder_frame = TRUE; WARNING_HR (hr, CODECAPI_AVEncMPVDefaultBPictureCount); } @@ -757,14 +946,17 @@ WARNING_HR (hr, CODECAPI_AVEncVideoMaxNumRefFrame); } + self->prop_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + return TRUE; } static gboolean -gst_mf_h265_enc_set_src_caps (GstMFVideoEnc * mfenc, +gst_mf_h265_enc_set_src_caps (GstMFVideoEncoder * encoder, GstVideoCodecState * state, IMFMediaType * output_type) { - GstMFH265Enc *self = (GstMFH265Enc *) mfenc; + GstMFH265Enc *self = (GstMFH265Enc *) encoder; GstVideoCodecState *out_state; GstStructure *s; GstCaps *out_caps; @@ -774,13 +966,13 @@ s = gst_caps_get_structure (out_caps, 0); gst_structure_set (s, "stream-format", G_TYPE_STRING, "byte-stream", - "alignment", G_TYPE_STRING, "au", NULL); + "alignment", G_TYPE_STRING, "au", nullptr); - if (GST_VIDEO_INFO_FORMAT (&mfenc->input_state->info) == + if (GST_VIDEO_INFO_FORMAT (&encoder->input_state->info) == GST_VIDEO_FORMAT_P010_10LE) { - gst_structure_set (s, "profile", G_TYPE_STRING, "main-10", NULL); + gst_structure_set (s, "profile", G_TYPE_STRING, "main-10", nullptr); } else { - gst_structure_set (s, "profile", G_TYPE_STRING, "main", NULL); + gst_structure_set (s, "profile", G_TYPE_STRING, "main", nullptr); } out_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (self), @@ -794,7 +986,7 @@ tags = gst_tag_list_new_empty (); gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, gst_element_get_metadata (GST_ELEMENT_CAST (self), - GST_ELEMENT_METADATA_LONGNAME), NULL); + GST_ELEMENT_METADATA_LONGNAME), nullptr); gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (self), tags, GST_TAG_MERGE_REPLACE); gst_tag_list_unref (tags); @@ -802,17 +994,31 @@ return TRUE; } +static gboolean +gst_mf_h265_enc_check_reconfigure (GstMFVideoEncoder * encoder) +{ + GstMFH265Enc *self = (GstMFH265Enc *) encoder; + gboolean ret; + + g_mutex_lock (&self->prop_lock); + ret = self->prop_updated; + self->prop_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return ret; +} + void gst_mf_h265_enc_plugin_init (GstPlugin * plugin, guint rank, GList * d3d11_device) { GTypeInfo type_info = { sizeof (GstMFH265EncClass), - NULL, - NULL, + nullptr, + nullptr, (GClassInitFunc) gst_mf_h265_enc_class_init, - NULL, - NULL, + nullptr, + nullptr, sizeof (GstMFH265Enc), 0, (GInstanceInitFunc) gst_mf_h265_enc_init, @@ -821,5 +1027,6 @@ GST_DEBUG_CATEGORY_INIT (gst_mf_h265_enc_debug, "mfh265enc", 0, "mfh265enc"); - gst_mf_video_enc_register (plugin, rank, &subtype, &type_info, d3d11_device); + gst_mf_video_encoder_register (plugin, + rank, &subtype, &type_info, d3d11_device); }
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfmp3dec.cpp
Added
@@ -0,0 +1,310 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-mfmp3dec + * @title: mfmp3dec + * + * This element decodes MP3 compressed data into RAW audio data. + * + * Since: 1.22 + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include <gst/pbutils/pbutils.h> +#include "gstmfaudiodecoder.h" +#include "gstmfmp3dec.h" +#include <wrl.h> +#include <string.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +GST_DEBUG_CATEGORY (gst_mf_mp3_dec_debug); +#define GST_CAT_DEFAULT gst_mf_mp3_dec_debug + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " + "mpegversion = (int) 1, layer = (int) 3, channels = (int) 1, 2, " + "rate = (int) 8000, 48000") + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " GST_AUDIO_NE (S16) ", " + "layout = (string) interleaved, " + "channels = (int) 1, 2, rate = (int) 8000, 48000") + ); + +typedef struct _GstMFMp3Dec +{ + GstMFAudioDecoder parent; +} GstMFMp3Dec; + +typedef struct _GstMFMp3DecClass +{ + GstMFAudioDecoderClass parent_class; +} GstMFMp3DecClass; + +static GTypeClass *parent_class = nullptr; + +static gboolean gst_mf_mp3_dec_set_format (GstMFAudioDecoder * decoder, + GstMFTransform * transform, GstCaps * caps); + +static void +gst_mf_mp3_dec_class_init (GstMFMp3DecClass * klass, gpointer data) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstMFAudioDecoderClass *decoder_class = GST_MF_AUDIO_DECODER_CLASS (klass); + GstMFAudioDecoderClassData *cdata = (GstMFAudioDecoderClassData *) data; + gchar *long_name; + + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + + long_name = g_strdup_printf ("Media Foundation %s", cdata->device_name); + gst_element_class_set_metadata (element_class, long_name, + "Codec/Decoder/Audio", + "Microsoft Media Foundation MP3 Decoder", + "Seungha Yang <seungha@centricular.com>"); + g_free (long_name); + + gst_element_class_add_static_pad_template (element_class, &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_mf_mp3_dec_set_format); + + decoder_class->codec_id = MFAudioFormat_MP3; + decoder_class->enum_flags = cdata->enum_flags; + decoder_class->device_index = cdata->device_index; + + g_free (cdata->device_name); + g_free (cdata); +} + +static void +gst_mf_mp3_dec_init (GstMFMp3Dec * self) +{ +} + +static gboolean +gst_mf_mp3_dec_set_format (GstMFAudioDecoder * decoder, + GstMFTransform * transform, GstCaps * caps) +{ + GstMFMp3Dec *self = (GstMFMp3Dec *) decoder; + HRESULT hr; + ComPtr < IMFMediaType > in_type; + ComPtr < IMFMediaType > out_type; + GstAudioInfo in_audio_info, out_audio_info; + GList *output_list, *iter; + GstCaps *out_caps; + + if (!gst_audio_info_from_caps (&in_audio_info, caps)) { + GST_ERROR_OBJECT (self, "Failed to get audio info from caps"); + return FALSE; + } + + hr = MFCreateMediaType (&in_type); + if (!gst_mf_result (hr)) + return FALSE; + + hr = in_type->SetGUID (MF_MT_MAJOR_TYPE, MFMediaType_Audio); + if (!gst_mf_result (hr)) + return FALSE; + + hr = in_type->SetGUID (MF_MT_SUBTYPE, MFAudioFormat_MP3); + if (!gst_mf_result (hr)) + return FALSE; + + hr = in_type->SetUINT32 (MF_MT_AUDIO_NUM_CHANNELS, in_audio_info.channels); + if (!gst_mf_result (hr)) + return FALSE; + + hr = in_type->SetUINT32 (MF_MT_AUDIO_SAMPLES_PER_SECOND, in_audio_info.rate); + if (!gst_mf_result (hr)) + return FALSE; + + if (!gst_mf_transform_set_input_type (transform, in_type.Get ())) { + GST_ERROR_OBJECT (self, "Failed to set format"); + return FALSE; + } + + if (!gst_mf_transform_get_output_available_types (transform, &output_list)) { + GST_ERROR_OBJECT (self, "Failed to get output types"); + return FALSE; + } + + for (iter = output_list; iter; iter = g_list_next (iter)) { + GUID guid; + IMFMediaType *type = (IMFMediaType *) iter->data; + UINT32 bps; + + hr = type->GetGUID (MF_MT_MAJOR_TYPE, &guid); + if (!gst_mf_result (hr)) + continue; + + if (!IsEqualGUID (guid, MFMediaType_Audio)) + continue; + + hr = type->GetGUID (MF_MT_SUBTYPE, &guid); + if (!gst_mf_result (hr)) + continue; + + if (!IsEqualGUID (guid, MFAudioFormat_PCM)) + continue; + + hr = type->GetUINT32 (MF_MT_AUDIO_BITS_PER_SAMPLE, &bps); + if (!gst_mf_result (hr)) + continue; + + if (bps != 16) + continue; + + out_type = type; + break; + } + + g_list_free_full (output_list, (GDestroyNotify) gst_mf_media_type_release); + + if (!out_type) { + GST_ERROR_OBJECT (self, "Failed to select output type"); + return FALSE; + } + + if (!gst_mf_transform_set_output_type (transform, out_type.Get ())) { + GST_ERROR_OBJECT (self, "Failed to select output type"); + return FALSE; + } + + out_caps = gst_mf_media_type_to_caps (out_type.Get ()); + if (!out_caps) { + GST_ERROR_OBJECT (self, "Failed to get output caps"); + return FALSE; + } + + GST_DEBUG_OBJECT (self, "Output caps %" GST_PTR_FORMAT, out_caps); + + if (!gst_audio_info_from_caps (&out_audio_info, out_caps)) { + GST_ERROR_OBJECT (self, + "Failed to convert caps to audio info %" GST_PTR_FORMAT, out_caps); + gst_caps_unref (out_caps); + } + gst_caps_unref (out_caps); + + return gst_audio_decoder_set_output_format (GST_AUDIO_DECODER (self), + &out_audio_info); +} + +static void +gst_mf_mp3_dec_register (GstPlugin * plugin, guint rank, + const gchar * device_name, guint32 enum_flags, guint device_index) +{ + GType type; + GstMFAudioDecoderClassData *cdata; + GTypeInfo type_info = { + sizeof (GstMFMp3DecClass), + nullptr, + nullptr, + (GClassInitFunc) gst_mf_mp3_dec_class_init, + nullptr, + nullptr, + sizeof (GstMFMp3Dec), + 0, + (GInstanceInitFunc) gst_mf_mp3_dec_init, + }; + + cdata = g_new0 (GstMFAudioDecoderClassData, 1); + cdata->device_name = g_strdup (device_name); + cdata->enum_flags = enum_flags; + cdata->device_index = device_index; + type_info.class_data = cdata; + + type = g_type_register_static (GST_TYPE_MF_AUDIO_DECODER, "GstMFMp3Dec", + &type_info, (GTypeFlags) 0); + + if (!gst_element_register (plugin, "mfmp3dec", rank, type)) + GST_WARNING ("Failed to register plugin"); +} + +static gboolean +gst_mf_mp3_dec_plugin_init_internal (GstPlugin * plugin, guint rank, + GstMFTransform * transform, guint device_index, guint32 enum_flags) +{ + gchar *device_name = nullptr; + + if (!gst_mf_transform_open (transform)) + return FALSE; + + g_object_get (transform, "device-name", &device_name, nullptr); + if (!device_name) { + GST_WARNING_OBJECT (transform, "Unknown device name"); + return FALSE; + } + + gst_mf_mp3_dec_register (plugin, rank, device_name, enum_flags, device_index); + g_free (device_name); + + return TRUE; +} + +void +gst_mf_mp3_dec_plugin_init (GstPlugin * plugin, guint rank) +{ + GstMFTransformEnumParams enum_params = { 0, }; + MFT_REGISTER_TYPE_INFO input_type; + GstMFTransform *transform; + gint i; + gboolean do_next; + + GST_DEBUG_CATEGORY_INIT (gst_mf_mp3_dec_debug, "mfmp3dec", 0, "mfmp3dec"); + + input_type.guidMajorType = MFMediaType_Audio; + input_type.guidSubtype = MFAudioFormat_MP3; + + enum_params.category = MFT_CATEGORY_AUDIO_DECODER; + enum_params.enum_flags = (MFT_ENUM_FLAG_SYNCMFT | + MFT_ENUM_FLAG_SORTANDFILTER | MFT_ENUM_FLAG_SORTANDFILTER_APPROVED_ONLY); + enum_params.input_typeinfo = &input_type; + + i = 0; + do { + enum_params.device_index = i++; + transform = gst_mf_transform_new (&enum_params); + do_next = TRUE; + + if (!transform) { + do_next = FALSE; + } else { + if (gst_mf_mp3_dec_plugin_init_internal (plugin, rank, transform, + enum_params.device_index, enum_params.enum_flags)) { + do_next = FALSE; + } + gst_clear_object (&transform); + } + } while (do_next); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfmp3dec.h
Added
@@ -0,0 +1,30 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> + +G_BEGIN_DECLS + +void gst_mf_mp3_dec_plugin_init (GstPlugin * plugin, + guint rank); + +G_END_DECLS +
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfmp3enc.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfmp3enc.cpp
Changed
@@ -36,7 +36,7 @@ #include <gst/gst.h> #include <gst/pbutils/pbutils.h> -#include "gstmfaudioenc.h" +#include "gstmfaudioencoder.h" #include "gstmfmp3enc.h" #include <wrl.h> #include <set> @@ -60,7 +60,7 @@ typedef struct _GstMFMp3Enc { - GstMFAudioEnc parent; + GstMFAudioEncoder parent; /* properties */ guint bitrate; @@ -68,7 +68,7 @@ typedef struct _GstMFMp3EncClass { - GstMFAudioEncClass parent_class; + GstMFAudioEncoderClass parent_class; } GstMFMp3EncClass; @@ -84,17 +84,17 @@ } GstMFMp3EncClassData; /* *INDENT-ON* */ -static GstElementClass *parent_class = NULL; +static GstElementClass *parent_class = nullptr; static void gst_mf_mp3_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_mf_mp3_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static gboolean gst_mf_mp3_enc_get_output_type (GstMFAudioEnc * mfenc, +static gboolean gst_mf_mp3_enc_get_output_type (GstMFAudioEncoder * encoder, GstAudioInfo * info, IMFMediaType ** output_type); -static gboolean gst_mf_mp3_enc_get_input_type (GstMFAudioEnc * mfenc, +static gboolean gst_mf_mp3_enc_get_input_type (GstMFAudioEncoder * encoder, GstAudioInfo * info, IMFMediaType ** input_type); -static gboolean gst_mf_mp3_enc_set_src_caps (GstMFAudioEnc * mfenc, +static gboolean gst_mf_mp3_enc_set_src_caps (GstMFAudioEncoder * encoder, GstAudioInfo * info); static void @@ -102,7 +102,7 @@ { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstMFAudioEncClass *mfenc_class = GST_MF_AUDIO_ENC_CLASS (klass); + GstMFAudioEncoderClass *encoder_class = GST_MF_AUDIO_ENCODER_CLASS (klass); GstMFMp3EncClassData *cdata = (GstMFMp3EncClassData *) data; gchar *long_name; gchar *classification; @@ -149,16 +149,16 @@ gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps)); - mfenc_class->get_output_type = + encoder_class->get_output_type = GST_DEBUG_FUNCPTR (gst_mf_mp3_enc_get_output_type); - mfenc_class->get_input_type = + encoder_class->get_input_type = GST_DEBUG_FUNCPTR (gst_mf_mp3_enc_get_input_type); - mfenc_class->set_src_caps = GST_DEBUG_FUNCPTR (gst_mf_mp3_enc_set_src_caps); + encoder_class->set_src_caps = GST_DEBUG_FUNCPTR (gst_mf_mp3_enc_set_src_caps); - mfenc_class->codec_id = MFAudioFormat_MP3; - mfenc_class->enum_flags = cdata->enum_flags; - mfenc_class->device_index = cdata->device_index; - mfenc_class->frame_samples = 1152; + encoder_class->codec_id = MFAudioFormat_MP3; + encoder_class->enum_flags = cdata->enum_flags; + encoder_class->device_index = cdata->device_index; + encoder_class->frame_samples = 1152; g_free (cdata->device_name); gst_caps_unref (cdata->sink_caps); @@ -205,12 +205,12 @@ } static gboolean -gst_mf_mp3_enc_get_output_type (GstMFAudioEnc * mfenc, GstAudioInfo * info, - IMFMediaType ** output_type) +gst_mf_mp3_enc_get_output_type (GstMFAudioEncoder * encoder, + GstAudioInfo * info, IMFMediaType ** output_type) { - GstMFMp3Enc *self = (GstMFMp3Enc *) mfenc; - GstMFTransform *transform = mfenc->transform; - GList *output_list = NULL; + GstMFMp3Enc *self = (GstMFMp3Enc *) encoder; + GstMFTransform *transform = encoder->transform; + GList *output_list = nullptr; GList *iter; ComPtr < IMFMediaType > target_output; std::vector < ComPtr < IMFMediaType >> filtered_types; @@ -339,12 +339,12 @@ } static gboolean -gst_mf_mp3_enc_get_input_type (GstMFAudioEnc * mfenc, GstAudioInfo * info, +gst_mf_mp3_enc_get_input_type (GstMFAudioEncoder * encoder, GstAudioInfo * info, IMFMediaType ** input_type) { - GstMFMp3Enc *self = (GstMFMp3Enc *) mfenc; - GstMFTransform *transform = mfenc->transform; - GList *input_list = NULL; + GstMFMp3Enc *self = (GstMFMp3Enc *) encoder; + GstMFTransform *transform = encoder->transform; + GList *input_list = nullptr; GList *iter; ComPtr < IMFMediaType > target_input; std::vector < ComPtr < IMFMediaType >> filtered_types; @@ -416,15 +416,15 @@ } static gboolean -gst_mf_mp3_enc_set_src_caps (GstMFAudioEnc * mfenc, GstAudioInfo * info) +gst_mf_mp3_enc_set_src_caps (GstMFAudioEncoder * encoder, GstAudioInfo * info) { - GstMFMp3Enc *self = (GstMFMp3Enc *) mfenc; + GstMFMp3Enc *self = (GstMFMp3Enc *) encoder; GstCaps *src_caps; gboolean ret; ComPtr < IMFMediaType > output_type; gint version = 1; - if (!gst_mf_transform_get_output_current_type (mfenc->transform, + if (!gst_mf_transform_get_output_current_type (encoder->transform, &output_type)) { GST_ERROR_OBJECT (self, "Couldn't get current output type"); return FALSE; @@ -442,7 +442,7 @@ "mpegaudioversion", G_TYPE_INT, version, "layer", G_TYPE_INT, 3, "channels", G_TYPE_INT, GST_AUDIO_INFO_CHANNELS (info), - "rate", G_TYPE_INT, GST_AUDIO_INFO_RATE (info), NULL); + "rate", G_TYPE_INT, GST_AUDIO_INFO_RATE (info), nullptr); ret = gst_audio_encoder_set_output_format (GST_AUDIO_ENCODER (self), src_caps); @@ -469,11 +469,11 @@ gboolean is_default = TRUE; GTypeInfo type_info = { sizeof (GstMFMp3EncClass), - NULL, - NULL, + nullptr, + nullptr, (GClassInitFunc) gst_mf_mp3_enc_class_init, - NULL, - NULL, + nullptr, + nullptr, sizeof (GstMFMp3Enc), 0, (GInstanceInitFunc) gst_mf_mp3_enc_init, @@ -502,7 +502,7 @@ } type = - g_type_register_static (GST_TYPE_MF_AUDIO_ENC, type_name, &type_info, + g_type_register_static (GST_TYPE_MF_AUDIO_ENCODER, type_name, &type_info, (GTypeFlags) 0); /* make lower rank than default device */ @@ -520,8 +520,8 @@ gst_mf_mp3_enc_create_template_caps (const std::set < UINT32 > &rate_list, gint channels, GstCaps ** sink_caps, GstCaps ** src_caps) { - GstCaps *sink = NULL; - GstCaps *src = NULL; + GstCaps *sink = nullptr; + GstCaps *src = nullptr; GValue rate_value = G_VALUE_INIT; if (rate_list.empty ()) { @@ -538,8 +538,8 @@ gst_caps_from_string ("audio/mpeg, mpegversion = (int) 1," "layer = (int) 3"); - gst_caps_set_simple (sink, "channels", G_TYPE_INT, channels, NULL); - gst_caps_set_simple (src, "channels", G_TYPE_INT, channels, NULL); + gst_caps_set_simple (sink, "channels", G_TYPE_INT, channels, nullptr); + gst_caps_set_simple (src, "channels", G_TYPE_INT, channels, nullptr); } else { sink = gst_caps_from_string ("audio/x-raw, " @@ -567,12 +567,12 @@ g_value_unset (&rate_value); - if (*sink_caps == NULL) + if (*sink_caps == nullptr) *sink_caps = sink; else *sink_caps = gst_caps_merge (*sink_caps, sink); - if (*src_caps == NULL) + if (*src_caps == nullptr) *src_caps = src; else *src_caps = gst_caps_merge (*src_caps, src); @@ -586,10 +586,10 @@ { HRESULT hr; gint i; - GstCaps *src_caps = NULL; - GstCaps *sink_caps = NULL; - gchar *device_name = NULL; - GList *output_list = NULL; + GstCaps *src_caps = nullptr; + GstCaps *sink_caps = nullptr; + gchar *device_name = nullptr; + GList *output_list = nullptr; GList *iter; std::set < UINT32 > mono_rate_list; std::set < UINT32 > stereo_rate_list; @@ -599,7 +599,7 @@ if (!gst_mf_transform_open (transform)) return; - g_object_get (transform, "device-name", &device_name, NULL); + g_object_get (transform, "device-name", &device_name, nullptr); if (!device_name) { GST_WARNING_OBJECT (transform, "Unknown device name"); return;
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfplatloader.cpp
Added
@@ -0,0 +1,125 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstmfplatloader.h" +#include "gstmfconfig.h" +#include <gmodule.h> + +GST_DEBUG_CATEGORY_EXTERN (gst_mf_debug); +#define GST_CAT_DEFAULT gst_mf_debug + +/* *INDENT-OFF* */ +#define LOAD_SYMBOL(name,func) G_STMT_START { \ + if (!g_module_symbol (module, G_STRINGIFY (name), (gpointer *) &vtable->func)) { \ + GST_WARNING ("Failed to load '%s', %s", G_STRINGIFY (name), g_module_error()); \ + goto out; \ + } \ +} G_STMT_END; + +typedef struct _GstMFPlatVTable +{ + gboolean loaded; + + HRESULT (__stdcall * GstMFTEnum2) (GUID guidCategory, + UINT32 Flags, + const MFT_REGISTER_TYPE_INFO * pInputType, + const MFT_REGISTER_TYPE_INFO * pOutputType, + IMFAttributes * pAttributes, + IMFActivate *** pppMFTActivate, + UINT32 * pnumMFTActivate); + + HRESULT (__stdcall * GstMFCreateDXGIDeviceManager) (UINT * resetToken, + IMFDXGIDeviceManager ** ppDeviceManager); + + HRESULT (__stdcall * GstMFCreateVideoSampleAllocatorEx) (REFIID riid, + void** ppSampleAllocator); +} GstMFPlatVTable; +/* *INDENT-ON* */ + +static GstMFPlatVTable gst_mf_plat_vtable = { 0, }; + +static gboolean +load_library_once (void) +{ + static gsize load_once = 0; + if (g_once_init_enter (&load_once)) { +#if GST_MF_HAVE_D3D11 + GModule *module; + GstMFPlatVTable *vtable = &gst_mf_plat_vtable; + + module = g_module_open ("mfplat.dll", G_MODULE_BIND_LAZY); + if (!module) + goto out; + + LOAD_SYMBOL (MFTEnum2, GstMFTEnum2); + LOAD_SYMBOL (MFCreateDXGIDeviceManager, GstMFCreateDXGIDeviceManager); + LOAD_SYMBOL (MFCreateVideoSampleAllocatorEx, + GstMFCreateVideoSampleAllocatorEx); + + vtable->loaded = TRUE; +#endif + + out: + g_once_init_leave (&load_once, 1); + } + + return gst_mf_plat_vtable.loaded; +} + +gboolean +gst_mf_plat_load_library (void) +{ + return load_library_once (); +} + +HRESULT __stdcall +GstMFTEnum2 (GUID guidCategory, UINT32 Flags, + const MFT_REGISTER_TYPE_INFO * pInputType, + const MFT_REGISTER_TYPE_INFO * pOutputType, + IMFAttributes * pAttributes, IMFActivate *** pppMFTActivate, + UINT32 * pnumMFTActivate) +{ + g_assert (gst_mf_plat_vtable.GstMFTEnum2 != nullptr); + + return gst_mf_plat_vtable.GstMFTEnum2 (guidCategory, Flags, pInputType, + pOutputType, pAttributes, pppMFTActivate, pnumMFTActivate); +} + +HRESULT __stdcall +GstMFCreateDXGIDeviceManager (UINT * resetToken, + IMFDXGIDeviceManager ** ppDeviceManager) +{ + g_assert (gst_mf_plat_vtable.GstMFCreateDXGIDeviceManager != nullptr); + + return gst_mf_plat_vtable.GstMFCreateDXGIDeviceManager (resetToken, + ppDeviceManager); +} + +HRESULT __stdcall +GstMFCreateVideoSampleAllocatorEx (REFIID riid, void **ppSampleAllocator) +{ + g_assert (gst_mf_plat_vtable.GstMFCreateVideoSampleAllocatorEx != nullptr); + + return gst_mf_plat_vtable.GstMFCreateVideoSampleAllocatorEx (riid, + ppSampleAllocator); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfsourceobject.cpp
Added
@@ -0,0 +1,458 @@ +/* GStreamer + * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> + * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstmfconfig.h" + +#include "gstmfsourceobject.h" + +#if GST_MF_WINAPI_APP +#include "gstmfcapturewinrt.h" +#endif +#if GST_MF_WINAPI_DESKTOP +#include "gstmfsourcereader.h" +#endif + +GST_DEBUG_CATEGORY_EXTERN (gst_mf_source_object_debug); +#define GST_CAT_DEFAULT gst_mf_source_object_debug + +enum +{ + PROP_0, + PROP_DEVICE_PATH, + PROP_DEVICE_NAME, + PROP_DEVICE_INDEX, + PROP_SOURCE_TYPE, +}; + +#define DEFAULT_DEVICE_PATH nullptr +#define DEFAULT_DEVICE_NAME nullptr +#define DEFAULT_DEVICE_INDEX -1 +#define DEFAULT_SOURCE_TYPE GST_MF_SOURCE_TYPE_VIDEO + +GType +gst_mf_source_type_get_type (void) +{ + static GType source_type = 0; + + static const GEnumValue source_types = { + {GST_MF_SOURCE_TYPE_VIDEO, "Video", "video"}, + {0, nullptr, nullptr} + }; + + if (!source_type) { + source_type = g_enum_register_static ("GstMFSourceMode", source_types); + } + + return source_type; +} + +static void gst_mf_source_object_finalize (GObject * object); +static void gst_mf_source_object_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_mf_source_object_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +#define gst_mf_source_object_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE (GstMFSourceObject, gst_mf_source_object, + GST_TYPE_OBJECT); + +static void +gst_mf_source_object_class_init (GstMFSourceObjectClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GParamFlags flags = + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + + gobject_class->finalize = gst_mf_source_object_finalize; + gobject_class->get_property = gst_mf_source_object_get_property; + gobject_class->set_property = gst_mf_source_object_set_property; + + g_object_class_install_property (gobject_class, PROP_DEVICE_PATH, + g_param_spec_string ("device-path", "Device Path", + "The device path", DEFAULT_DEVICE_PATH, flags)); + g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Device Name", + "The human-readable device name", DEFAULT_DEVICE_NAME, flags)); + g_object_class_install_property (gobject_class, PROP_DEVICE_INDEX, + g_param_spec_int ("device-index", "Device Index", + "The zero-based device index", -1, G_MAXINT, DEFAULT_DEVICE_INDEX, + flags)); + g_object_class_install_property (gobject_class, PROP_SOURCE_TYPE, + g_param_spec_enum ("source-type", "Source Type", + "Source Type", GST_TYPE_MF_SOURCE_TYPE, DEFAULT_SOURCE_TYPE, flags)); +} + +static void +gst_mf_source_object_init (GstMFSourceObject * self) +{ + self->device_index = DEFAULT_DEVICE_INDEX; + self->source_type = DEFAULT_SOURCE_TYPE; + + g_weak_ref_init (&self->client, nullptr); +} + +static void +gst_mf_source_object_finalize (GObject * object) +{ + GstMFSourceObject *self = GST_MF_SOURCE_OBJECT (object); + + g_free (self->device_path); + g_free (self->device_name); + + g_weak_ref_clear (&self->client); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_mf_source_object_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMFSourceObject *self = GST_MF_SOURCE_OBJECT (object); + + switch (prop_id) { + case PROP_DEVICE_PATH: + g_value_set_string (value, self->device_path); + break; + case PROP_DEVICE_NAME: + g_value_set_string (value, self->device_name); + break; + case PROP_DEVICE_INDEX: + g_value_set_int (value, self->device_index); + break; + case PROP_SOURCE_TYPE: + g_value_set_enum (value, self->source_type); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_mf_source_object_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMFSourceObject *self = GST_MF_SOURCE_OBJECT (object); + + switch (prop_id) { + case PROP_DEVICE_PATH: + g_free (self->device_path); + self->device_path = g_value_dup_string (value); + break; + case PROP_DEVICE_NAME: + g_free (self->device_name); + self->device_name = g_value_dup_string (value); + break; + case PROP_DEVICE_INDEX: + self->device_index = g_value_get_int (value); + break; + case PROP_SOURCE_TYPE: + self->source_type = (GstMFSourceType) g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +gboolean +gst_mf_source_object_start (GstMFSourceObject * object) +{ + GstMFSourceObjectClass *klass; + + g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), FALSE); + + klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); + g_assert (klass->start != nullptr); + + return klass->start (object); +} + +gboolean +gst_mf_source_object_stop (GstMFSourceObject * object) +{ + GstMFSourceObjectClass *klass; + + g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), FALSE); + + klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); + g_assert (klass->stop != nullptr); + + return klass->stop (object); +} + +GstFlowReturn +gst_mf_source_object_fill (GstMFSourceObject * object, GstBuffer * buffer) +{ + GstMFSourceObjectClass *klass; + + g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), GST_FLOW_ERROR); + g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR); + + klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); + g_assert (klass->fill != nullptr); + + return klass->fill (object, buffer); +} + +GstFlowReturn +gst_mf_source_object_create (GstMFSourceObject * object, GstBuffer ** buffer) +{ + GstMFSourceObjectClass *klass; + + g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), GST_FLOW_ERROR); + g_return_val_if_fail (buffer != nullptr, GST_FLOW_ERROR); + + klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); + g_assert (klass->create != nullptr); + + return klass->create (object, buffer); +} + +GstFlowReturn +gst_mf_source_object_get_sample (GstMFSourceObject * object, + GstSample ** sample) +{ + GstMFSourceObjectClass *klass; + + g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), GST_FLOW_ERROR); + g_return_val_if_fail (sample != nullptr, GST_FLOW_ERROR); + + klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); + g_assert (klass->get_sample != nullptr); + + return klass->get_sample (object, sample); +} + +void +gst_mf_source_object_set_flushing (GstMFSourceObject * object, + gboolean flushing) +{ + GstMFSourceObjectClass *klass; + + g_return_if_fail (GST_IS_MF_SOURCE_OBJECT (object)); + + klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); + + if (flushing) { + if (klass->unlock) + klass->unlock (object); + } else { + if (klass->unlock_stop) + klass->unlock_stop (object); + } +} + +gboolean +gst_mf_source_object_set_caps (GstMFSourceObject * object, GstCaps * caps) +{ + GstMFSourceObjectClass *klass; + + g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), FALSE); + + klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); + g_assert (klass->set_caps != nullptr); + + return klass->set_caps (object, caps); +} + +GstCaps * +gst_mf_source_object_get_caps (GstMFSourceObject * object) +{ + GstMFSourceObjectClass *klass; + + g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), nullptr); + + klass = GST_MF_SOURCE_OBJECT_GET_CLASS (object); + g_assert (klass->get_caps != nullptr); + + return klass->get_caps (object); +} + +gboolean +gst_mf_source_object_set_client (GstMFSourceObject * object, + GstElement * client) +{ + g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), FALSE); + + g_weak_ref_set (&object->client, client); + + return TRUE; +} + +GstClockTime +gst_mf_source_object_get_running_time (GstMFSourceObject * object) +{ + GstElement *client = nullptr; + GstClockTime timestamp = GST_CLOCK_TIME_NONE; + + g_return_val_if_fail (GST_IS_MF_SOURCE_OBJECT (object), GST_CLOCK_TIME_NONE); + + client = (GstElement *) g_weak_ref_get (&object->client); + if (client) { + GstClockTime basetime = client->base_time; + GstClock *clock; + + clock = gst_element_get_clock (client); + if (clock) { + GstClockTime now; + + now = gst_clock_get_time (clock); + timestamp = now - basetime; + gst_object_unref (clock); + } + + gst_object_unref (client); + } + + return timestamp; +} + +static gboolean +gst_mf_source_object_use_winrt_api (void) +{ + static gsize check_once = 0; + static gboolean ret = FALSE; + + if (g_once_init_enter (&check_once)) { +#if (!GST_MF_WINAPI_APP) + /* WinRT is not supported, always false */ + ret = FALSE; +#else +#if (!GST_MF_WINAPI_DESKTOP) + /* WinRT is supported but desktop API was disabled, + * always true */ + ret = TRUE; +#else + /* Both app and desktop APIs were enabled, check user choice */ + { + const gchar *env; + + env = g_getenv ("GST_USE_MF_WINRT_CAPTURE"); + if (env && g_str_has_prefix (env, "1")) + ret = TRUE; + else + ret = FALSE; + } +#endif +#endif + g_once_init_leave (&check_once, 1); + } + + return ret; +} + +GstMFSourceObject * +gst_mf_source_object_new (GstMFSourceType type, gint device_index, + const gchar * device_name, const gchar * device_path, gpointer dispatcher) +{ +#if (!GST_MF_WINAPI_APP) + GST_INFO ("Try IMFSourceReader implementation"); + return gst_mf_source_reader_new (type, + device_index, device_name, device_path); +#else +#if (!GST_MF_WINAPI_DESKTOP) + GST_INFO ("Try WinRT implementation"); + return gst_mf_capture_winrt_new (type, + device_index, device_name, device_path, dispatcher); +#else + if (gst_mf_source_object_use_winrt_api ()) { + GST_INFO ("Both Desktop and WinRT APIs were enabled, user choice: WinRT"); + return gst_mf_capture_winrt_new (type, + device_index, device_name, device_path, dispatcher); + } else { + GST_INFO + ("Both Desktop and WinRT APIs were enabled, default: IMFSourceReader"); + return gst_mf_source_reader_new (type, + device_index, device_name, device_path); + } +#endif +#endif + g_assert_not_reached (); + + return nullptr; +} + +gint +gst_mf_source_object_caps_compare (GstCaps * caps1, GstCaps * caps2) +{ + GstStructure *s1, *s2; + const gchar *n1, *n2; + gboolean m1_is_raw, m2_is_raw; + gint w1 = 0, h1 = 0, w2 = 0, h2 = 0; + gint r1, r2; + gint num1 = 0, den1 = 1, num2 = 0, den2 = 1; + gint fraction_cmp; + + /* sorting priority + * - raw video > comprssed + * - raw video format + * - higher resolution + * - higher framerate + */ + s1 = gst_caps_get_structure (caps1, 0); + n1 = gst_structure_get_name (s1); + + s2 = gst_caps_get_structure (caps2, 0); + n2 = gst_structure_get_name (s2); + + m1_is_raw = g_strcmp0 (n1, "video/x-raw") == 0; + m2_is_raw = g_strcmp0 (n2, "video/x-raw") == 0; + + if (m1_is_raw && !m2_is_raw) + return -1; + else if (!m1_is_raw && m2_is_raw) + return 1; + + /* if both are raw formats */ + if (m1_is_raw) { + gint format_cmp = g_strcmp0 (gst_structure_get_string (s1, "format"), + gst_structure_get_string (s2, "format")); + if (format_cmp) + return format_cmp; + } + + /* resolution */ + gst_structure_get_int (s1, "width", &w1); + gst_structure_get_int (s1, "height", &h1); + gst_structure_get_int (s2, "width", &w2); + gst_structure_get_int (s2, "height", &h2); + + r1 = w1 * h1; + r2 = w2 * h2; + + /* higher resolution first */ + if (r1 != r2) + return r2 - r1; + + gst_structure_get_fraction (s1, "framerate", &num1, &den1); + gst_structure_get_fraction (s2, "framerate", &num2, &den2); + + fraction_cmp = gst_util_fraction_compare (num1, den1, num2, den2); + + /* higher framerate first */ + return fraction_cmp * -1; +}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfsourceobject.h -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfsourceobject.h
Changed
@@ -72,6 +72,9 @@ GstFlowReturn (*create) (GstMFSourceObject * object, GstBuffer ** buffer); + GstFlowReturn (*get_sample) (GstMFSourceObject * object, + GstSample ** sample); + gboolean (*unlock) (GstMFSourceObject * object); gboolean (*unlock_stop) (GstMFSourceObject * object); @@ -96,6 +99,10 @@ GstFlowReturn gst_mf_source_object_create (GstMFSourceObject * object, GstBuffer ** buffer); +/* DirectShow filter */ +GstFlowReturn gst_mf_source_object_get_sample (GstMFSourceObject * object, + GstSample ** sample); + void gst_mf_source_object_set_flushing (GstMFSourceObject * object, gboolean flushing);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfsourcereader.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfsourcereader.cpp
Changed
@@ -33,15 +33,11 @@ /* *INDENT-OFF* */ using namespace Microsoft::WRL; - -G_BEGIN_DECLS +/* *INDENT-ON* */ GST_DEBUG_CATEGORY_EXTERN (gst_mf_source_object_debug); #define GST_CAT_DEFAULT gst_mf_source_object_debug -G_END_DECLS -/* *INDENT-ON* */ - typedef struct _GstMFStreamMediaType { IMFMediaType *media_type; @@ -181,11 +177,11 @@ { gint i, j; HRESULT hr; - GList *list = NULL; + GList *list = nullptr; std::vector < std::string > unhandled_caps; - g_return_val_if_fail (source_reader != NULL, FALSE); - g_return_val_if_fail (media_types != NULL, FALSE); + g_return_val_if_fail (source_reader != nullptr, FALSE); + g_return_val_if_fail (media_types != nullptr, FALSE); { /* Retrive only the first video stream. non-first video stream might be @@ -202,7 +198,7 @@ if (SUCCEEDED (hr)) { GstMFStreamMediaType *mtype; - GstCaps *caps = NULL; + GstCaps *caps = nullptr; GstStructure *s; std::string name; @@ -250,16 +246,19 @@ } done: + if (!list) + return FALSE; + list = g_list_reverse (list); *media_types = list; - return !!list; + return TRUE; } static void gst_mf_stream_media_type_free (GstMFStreamMediaType * media_type) { - g_return_if_fail (media_type != NULL); + g_return_if_fail (media_type != nullptr); if (media_type->media_type) media_type->media_type->Release (); @@ -344,24 +343,24 @@ if (self->activate) { self->activate->ShutdownObject (); self->activate->Release (); - self->activate = NULL; + self->activate = nullptr; } if (self->media_types) { g_list_free_full (self->media_types, (GDestroyNotify) gst_mf_stream_media_type_free); - self->media_types = NULL; + self->media_types = nullptr; } if (self->reader) { self->reader->Release (); - self->reader = NULL; + self->reader = nullptr; } if (self->source) { self->source->Shutdown (); self->source->Release (); - self->source = NULL; + self->source = nullptr; } return TRUE; @@ -437,7 +436,7 @@ return FALSE; hr = self->reader->SetCurrentMediaType (type->stream_index, - NULL, type->media_type); + nullptr, type->media_type); if (!gst_mf_result (hr)) return FALSE; @@ -474,8 +473,8 @@ IMFSample *sample = nullptr; GstMFSourceReaderSample reader_sample; - hr = self->reader->ReadSample (type->stream_index, 0, NULL, &stream_flags, - NULL, &sample); + hr = self->reader->ReadSample (type->stream_index, 0, nullptr, &stream_flags, + nullptr, &sample); if (!gst_mf_result (hr)) { GST_ERROR_OBJECT (self, "Failed to read sample"); @@ -586,7 +585,7 @@ if (ret != GST_FLOW_OK) return ret; - hr = media_buffer->Lock (&data, NULL, NULL); + hr = media_buffer->Lock (&data, nullptr, nullptr); if (!gst_mf_result (hr)) { GST_ERROR_OBJECT (self, "Failed to lock media buffer"); return GST_FLOW_ERROR; @@ -674,7 +673,7 @@ if (ret != GST_FLOW_OK) return ret; - hr = media_buffer->Lock (&data, NULL, &len); + hr = media_buffer->Lock (&data, nullptr, &len); if (!gst_mf_result (hr) || len == 0) { GST_ERROR_OBJECT (self, "Failed to lock media buffer"); return GST_FLOW_ERROR; @@ -735,7 +734,7 @@ if (self->supported_caps) return gst_caps_ref (self->supported_caps); - return NULL; + return nullptr; } static gboolean @@ -743,7 +742,7 @@ { GstMFSourceReader *self = GST_MF_SOURCE_READER (object); GList *iter; - GstMFStreamMediaType *best_type = NULL; + GstMFStreamMediaType *best_type = nullptr; for (iter = self->media_types; iter; iter = g_list_next (iter)) { GstMFStreamMediaType *minfo = (GstMFStreamMediaType *) iter->data; @@ -784,17 +783,17 @@ { GstMFSourceObject *object = GST_MF_SOURCE_OBJECT (self); GSource *source; - GList *activate_list = NULL; - GstMFDeviceActivate *target = NULL; + GList *activate_list = nullptr; + GstMFDeviceActivate *target = nullptr; GList *iter; - CoInitializeEx (NULL, COINIT_MULTITHREADED); + CoInitializeEx (nullptr, COINIT_MULTITHREADED); g_main_context_push_thread_default (self->context); source = g_idle_source_new (); g_source_set_callback (source, - (GSourceFunc) gst_mf_source_reader_main_loop_running_cb, self, NULL); + (GSourceFunc) gst_mf_source_reader_main_loop_running_cb, self, nullptr); g_source_attach (source, self->context); g_source_unref (source); @@ -867,7 +866,7 @@ CoUninitialize (); - return NULL; + return nullptr; } static gboolean @@ -875,9 +874,9 @@ GstMFSourceType source_type, GList ** device_sources) { HRESULT hr; - GList *ret = NULL; + GList *ret = nullptr; ComPtr < IMFAttributes > attr; - IMFActivate **devices = NULL; + IMFActivate **devices = nullptr; UINT32 i, count = 0; hr = MFCreateAttributes (&attr, 1); @@ -925,7 +924,7 @@ if (gst_mf_result (hr)) { entry->path = g_utf16_to_utf8 ((const gunichar2 *) name, - -1, NULL, NULL, NULL); + -1, nullptr, nullptr, nullptr); CoTaskMemFree (name); } @@ -933,7 +932,7 @@ &name, &name_len); if (gst_mf_result (hr)) { entry->name = g_utf16_to_utf8 ((const gunichar2 *) name, - -1, NULL, NULL, NULL); + -1, nullptr, nullptr, nullptr); CoTaskMemFree (name); } @@ -941,18 +940,20 @@ } done: - ret = g_list_reverse (ret); CoTaskMemFree (devices); - *device_sources = ret; + if (!ret) + return FALSE; - return !!ret; + *device_sources = g_list_reverse (ret); + + return TRUE; } static void gst_mf_device_activate_free (GstMFDeviceActivate * activate) { - g_return_if_fail (activate != NULL); + g_return_if_fail (activate != nullptr); if (activate->handle) activate->handle->Release (); @@ -982,18 +983,18 @@ GstMFSourceObject *self; /* TODO: add more type */ - g_return_val_if_fail (type == GST_MF_SOURCE_TYPE_VIDEO, NULL); + g_return_val_if_fail (type == GST_MF_SOURCE_TYPE_VIDEO, nullptr); self = (GstMFSourceObject *) g_object_new (GST_TYPE_MF_SOURCE_READER, "source-type", type, "device-index", device_index, "device-name", - device_name, "device-path", device_path, NULL); + device_name, "device-path", device_path, nullptr); gst_object_ref_sink (self); if (!self->opened) { - GST_WARNING_OBJECT (self, "Couldn't open device"); + GST_DEBUG_OBJECT (self, "Couldn't open device"); gst_object_unref (self); - return NULL; + return nullptr; } return self;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmftransform.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmftransform.cpp
Changed
@@ -34,13 +34,9 @@ /* *INDENT-OFF* */ using namespace Microsoft::WRL; -G_BEGIN_DECLS - GST_DEBUG_CATEGORY_EXTERN (gst_mf_transform_debug); #define GST_CAT_DEFAULT gst_mf_transform_debug -G_END_DECLS - typedef HRESULT (*GstMFTransformAsyncCallbackOnEvent) (MediaEventType event, GstObject * client); @@ -187,7 +183,7 @@ : ref_count_ (1) , running_ (false) { - g_weak_ref_init (&client_, NULL); + g_weak_ref_init (&client_, nullptr); } ~GstMFTransformAsyncCallback () @@ -295,7 +291,7 @@ g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, g_param_spec_string ("device-name", "device-name", - "Device name", NULL, + "Device name", nullptr, (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_HARDWARE, g_param_spec_boolean ("hardware", "Hardware", @@ -346,10 +342,10 @@ gst_mf_transform_clear_enum_params (GstMFTransformEnumParams * params) { g_free (params->input_typeinfo); - params->input_typeinfo = NULL; + params->input_typeinfo = nullptr; g_free (params->output_typeinfo); - params->output_typeinfo = NULL; + params->output_typeinfo = nullptr; } static void @@ -454,18 +450,18 @@ gst_mf_transform_thread_func (GstMFTransform * self) { HRESULT hr = S_OK; - IMFActivate **devices = NULL; + IMFActivate **devices = nullptr; UINT32 num_devices, i; - LPWSTR name = NULL; + LPWSTR name = nullptr; GSource *source; - CoInitializeEx (NULL, COINIT_MULTITHREADED); + CoInitializeEx (nullptr, COINIT_MULTITHREADED); g_main_context_push_thread_default (self->context); source = g_idle_source_new (); g_source_set_callback (source, - (GSourceFunc) gst_mf_transform_main_loop_running_cb, self, NULL); + (GSourceFunc) gst_mf_transform_main_loop_running_cb, self, nullptr); g_source_attach (source, self->context); g_source_unref (source); @@ -529,11 +525,11 @@ devicesi->Release (); hr = self->activate->GetAllocatedString (MFT_FRIENDLY_NAME_Attribute, - &name, NULL); + &name, nullptr); if (gst_mf_result (hr)) { self->device_name = g_utf16_to_utf8 ((const gunichar2 *) name, - -1, NULL, NULL, NULL); + -1, nullptr, nullptr, nullptr); GST_INFO_OBJECT (self, "Open device %s", self->device_name); CoTaskMemFree (name); @@ -541,7 +537,11 @@ CoTaskMemFree (devices); - self->hardware = !!(self->enum_params.enum_flags & MFT_ENUM_FLAG_HARDWARE); + if ((self->enum_params.enum_flags & MFT_ENUM_FLAG_HARDWARE) != 0) + self->hardware = TRUE; + else + self->hardware = FALSE; + self->initialized = TRUE; run_loop: @@ -556,12 +556,12 @@ if (self->activate) { self->activate->Release (); - self->activate = NULL; + self->activate = nullptr; } CoUninitialize (); - return NULL; + return nullptr; } static GstFlowReturn @@ -588,13 +588,13 @@ ComPtr < IMFMediaBuffer > buffer; ComPtr < IMFSample > new_sample; - hr = MFCreateMemoryBuffer (out_stream_info.cbSize, buffer.GetAddressOf ()); + hr = MFCreateMemoryBuffer (out_stream_info.cbSize, &buffer); if (!gst_mf_result (hr)) { GST_ERROR_OBJECT (self, "Couldn't create memory buffer"); return GST_FLOW_ERROR; } - hr = MFCreateSample (new_sample.GetAddressOf ()); + hr = MFCreateSample (&new_sample); if (!gst_mf_result (hr)) { GST_ERROR_OBJECT (self, "Couldn't create sample"); return GST_FLOW_ERROR; @@ -621,8 +621,7 @@ GST_DEBUG_OBJECT (self, "Stream change, set output type again"); - hr = transform->GetOutputAvailableType (stream_id, - 0, output_type.GetAddressOf ()); + hr = transform->GetOutputAvailableType (stream_id, 0, &output_type); if (!gst_mf_result (hr)) { GST_ERROR_OBJECT (self, "Couldn't get available output type"); ret = GST_FLOW_ERROR; @@ -692,7 +691,7 @@ gboolean ret = FALSE; g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), FALSE); - g_return_val_if_fail (sample != NULL, FALSE); + g_return_val_if_fail (sample != nullptr, FALSE); GST_TRACE_OBJECT (object, "Process input"); @@ -759,7 +758,7 @@ GstFlowReturn ret; g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), GST_FLOW_ERROR); - g_return_val_if_fail (sample != NULL, GST_FLOW_ERROR); + g_return_val_if_fail (sample != nullptr, GST_FLOW_ERROR); /* Hardware MFT must not call this method, instead client must install * new sample callback so that outputting data from Media Foundation's * worker thread */ @@ -879,7 +878,7 @@ ComPtr < IMFAttributes > attr; UINT32 supports_d3d11 = 0; - hr = object->transform->GetAttributes (attr.GetAddressOf ()); + hr = object->transform->GetAttributes (&attr); if (!gst_mf_result (hr)) { GST_ERROR_OBJECT (object, "Couldn't get attribute object"); goto done; @@ -942,7 +941,7 @@ GstMFTransformOpenData data; g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), FALSE); - g_return_val_if_fail (object->activate != NULL, FALSE); + g_return_val_if_fail (object->activate != nullptr, FALSE); data.object = object; data.invoked = FALSE; @@ -1011,12 +1010,12 @@ if (object->codec_api) { object->codec_api->Release (); - object->codec_api = NULL; + object->codec_api = nullptr; } if (object->transform) { object->transform->Release (); - object->transform = NULL; + object->transform = nullptr; } return TRUE; @@ -1075,7 +1074,7 @@ IMFActivate * gst_mf_transform_get_activate_handle (GstMFTransform * object) { - g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), NULL); + g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), nullptr); return object->activate; } @@ -1083,12 +1082,12 @@ IMFTransform * gst_mf_transform_get_transform_handle (GstMFTransform * object) { - g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), NULL); + g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), nullptr); if (!object->transform) { GST_WARNING_OBJECT (object, "IMFTransform is not configured, open MFT first"); - return NULL; + return nullptr; } return object->transform; @@ -1097,11 +1096,11 @@ ICodecAPI * gst_mf_transform_get_codec_api_handle (GstMFTransform * object) { - g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), NULL); + g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), nullptr); if (!object->codec_api) { GST_WARNING_OBJECT (object, "ICodecAPI is not configured, open MFT first"); - return NULL; + return nullptr; } return object->codec_api; @@ -1114,10 +1113,10 @@ IMFTransform *transform; HRESULT hr; DWORD index = 0; - GList *list = NULL; + GList *list = nullptr; g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), FALSE); - g_return_val_if_fail (input_types != NULL, FALSE); + g_return_val_if_fail (input_types != nullptr, FALSE); transform = object->transform; @@ -1127,7 +1126,7 @@ } do { - IMFMediaType *type = NULL; + IMFMediaType *type = nullptr; hr = transform->GetInputAvailableType (object->input_id, index, &type); if (SUCCEEDED (hr)) @@ -1136,9 +1135,12 @@ index++; } while (SUCCEEDED (hr)); + if (!list) + return FALSE; + *input_types = list; - return !!list; + return TRUE; } gboolean @@ -1148,10 +1150,10 @@ IMFTransform *transform; HRESULT hr; DWORD index = 0; - GList *list = NULL; + GList *list = nullptr; g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), FALSE); - g_return_val_if_fail (output_types != NULL, FALSE); + g_return_val_if_fail (output_types != nullptr, FALSE); transform = object->transform; @@ -1170,9 +1172,12 @@ index++; } while (SUCCEEDED (hr)); + if (!list) + return FALSE; + *output_types = list; - return !!list; + return TRUE; } gboolean @@ -1230,7 +1235,7 @@ HRESULT hr; g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), FALSE); - g_return_val_if_fail (input_type != NULL, FALSE); + g_return_val_if_fail (input_type != nullptr, FALSE); transform = object->transform; @@ -1255,7 +1260,7 @@ HRESULT hr; g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), FALSE); - g_return_val_if_fail (output_type != NULL, FALSE); + g_return_val_if_fail (output_type != nullptr, FALSE); transform = object->transform; @@ -1277,14 +1282,14 @@ { GstMFTransform *self; - g_return_val_if_fail (params != NULL, NULL); + g_return_val_if_fail (params != nullptr, nullptr); self = (GstMFTransform *) g_object_new (GST_TYPE_MF_TRANSFORM_OBJECT, - "enum-params", params, NULL); + "enum-params", params, nullptr); if (!self->initialized) { gst_object_unref (self); - return NULL; + return nullptr; } gst_object_ref_sink (self); @@ -1300,7 +1305,7 @@ VARIANT var; g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), FALSE); - g_return_val_if_fail (api != NULL, FALSE); + g_return_val_if_fail (api != nullptr, FALSE); if (!object->codec_api) { GST_WARNING_OBJECT (object, "codec api unavailable"); @@ -1325,7 +1330,7 @@ VARIANT var; g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), FALSE); - g_return_val_if_fail (api != NULL, FALSE); + g_return_val_if_fail (api != nullptr, FALSE); if (!object->codec_api) { GST_WARNING_OBJECT (object, "codec api unavailable"); @@ -1350,7 +1355,7 @@ VARIANT var; g_return_val_if_fail (GST_IS_MF_TRANSFORM (object), FALSE); - g_return_val_if_fail (api != NULL, FALSE); + g_return_val_if_fail (api != nullptr, FALSE); if (!object->codec_api) { GST_WARNING_OBJECT (object, "codec api unavailable");
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfutils.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfutils.cpp
Changed
@@ -30,13 +30,9 @@ /* *INDENT-OFF* */ using namespace Microsoft::WRL; -G_BEGIN_DECLS - GST_DEBUG_CATEGORY_EXTERN (gst_mf_utils_debug); #define GST_CAT_DEFAULT gst_mf_utils_debug -G_END_DECLS - #define MAKE_RAW_FORMAT_CAPS(format) \ "video/x-raw, format = (string) " format @@ -116,14 +112,14 @@ return &raw_video_format_mapi.mf_format; } - return NULL; + return nullptr; } static GstCaps * gst_mf_media_type_to_video_caps (IMFMediaType * media_type) { HRESULT hr; - GstCaps *caps = NULL; + GstCaps *caps = nullptr; gint i; guint32 width = 0; guint32 height = 0; @@ -138,7 +134,7 @@ hr = media_type->GetGUID (MF_MT_SUBTYPE, &subtype); if (FAILED (hr)) { GST_WARNING ("Failed to get subtype, hr: 0x%x", (guint) hr); - return NULL; + return nullptr; } for (i = 0; i < G_N_ELEMENTS (raw_video_format_map); i++) { @@ -161,7 +157,7 @@ if (!caps) { GST_WARNING ("Unknown format %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (subtype.Data1)); - return NULL; + return nullptr; } hr = MFGetAttributeSize (media_type, MF_MT_FRAME_SIZE, &width, &height); @@ -170,23 +166,24 @@ if (raw_format) { gst_caps_unref (caps); - return NULL; + return nullptr; } } if (width > 0 && height > 0) { gst_caps_set_simple (caps, "width", G_TYPE_INT, width, - "height", G_TYPE_INT, height, NULL); + "height", G_TYPE_INT, height, nullptr); } hr = MFGetAttributeRatio (media_type, MF_MT_FRAME_RATE, &num, &den); if (SUCCEEDED (hr) && num > 0 && den > 0) - gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, num, den, NULL); + gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, num, den, + nullptr); hr = MFGetAttributeRatio (media_type, MF_MT_PIXEL_ASPECT_RATIO, &num, &den); if (SUCCEEDED (hr) && num > 0 && den > 0) gst_caps_set_simple (caps, - "pixel-aspect-ratio", GST_TYPE_FRACTION, num, den, NULL); + "pixel-aspect-ratio", GST_TYPE_FRACTION, num, den, nullptr); colorimetry.range = GST_VIDEO_COLOR_RANGE_UNKNOWN; colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_UNKNOWN; @@ -311,9 +308,9 @@ str = gst_video_colorimetry_to_string (&colorimetry); if (str) { - gst_caps_set_simple (caps, "colorimetry", G_TYPE_STRING, str, NULL); + gst_caps_set_simple (caps, "colorimetry", G_TYPE_STRING, str, nullptr); g_free (str); - str = NULL; + str = nullptr; } chroma_site = GST_VIDEO_CHROMA_SITE_UNKNOWN; @@ -341,29 +338,224 @@ if (chroma_site != GST_VIDEO_CHROMA_SITE_UNKNOWN) gst_caps_set_simple (caps, "chroma-site", G_TYPE_STRING, - gst_video_chroma_to_string (chroma_site), NULL); + gst_video_chroma_to_string (chroma_site), nullptr); return caps; } +/* Desktop only defines */ +#ifndef KSAUDIO_SPEAKER_MONO +#define KSAUDIO_SPEAKER_MONO (SPEAKER_FRONT_CENTER) +#endif +#ifndef KSAUDIO_SPEAKER_1POINT1 +#define KSAUDIO_SPEAKER_1POINT1 (SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY) +#endif +#ifndef KSAUDIO_SPEAKER_STEREO +#define KSAUDIO_SPEAKER_STEREO (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT) +#endif +#ifndef KSAUDIO_SPEAKER_2POINT1 +#define KSAUDIO_SPEAKER_2POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY) +#endif +#ifndef KSAUDIO_SPEAKER_3POINT0 +#define KSAUDIO_SPEAKER_3POINT0 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER) +#endif +#ifndef KSAUDIO_SPEAKER_3POINT1 +#define KSAUDIO_SPEAKER_3POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY) +#endif +#ifndef KSAUDIO_SPEAKER_QUAD +#define KSAUDIO_SPEAKER_QUAD (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT) +#endif +#define KSAUDIO_SPEAKER_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER) +#ifndef KSAUDIO_SPEAKER_5POINT0 +#define KSAUDIO_SPEAKER_5POINT0 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | \ + SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT) +#endif +#define KSAUDIO_SPEAKER_5POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \ + SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT) +#ifndef KSAUDIO_SPEAKER_7POINT0 +#define KSAUDIO_SPEAKER_7POINT0 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | \ + SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | \ + SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT) +#endif +#ifndef KSAUDIO_SPEAKER_7POINT1 +#define KSAUDIO_SPEAKER_7POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \ + SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \ + SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | \ + SPEAKER_FRONT_LEFT_OF_CENTER | SPEAKER_FRONT_RIGHT_OF_CENTER) +#endif + +static struct +{ + guint64 mf_pos; + GstAudioChannelPosition gst_pos; +} mf_to_gst_pos = { + {SPEAKER_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT}, + {SPEAKER_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, + {SPEAKER_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}, + {SPEAKER_LOW_FREQUENCY, GST_AUDIO_CHANNEL_POSITION_LFE1}, + {SPEAKER_BACK_LEFT, GST_AUDIO_CHANNEL_POSITION_REAR_LEFT}, + {SPEAKER_BACK_RIGHT, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, + {SPEAKER_FRONT_LEFT_OF_CENTER, + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER}, + {SPEAKER_FRONT_RIGHT_OF_CENTER, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER}, + {SPEAKER_BACK_CENTER, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, + /* Enum values diverge from this point onwards */ + {SPEAKER_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT}, + {SPEAKER_SIDE_RIGHT, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}, + {SPEAKER_TOP_CENTER, GST_AUDIO_CHANNEL_POSITION_TOP_CENTER}, + {SPEAKER_TOP_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT}, + {SPEAKER_TOP_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER}, + {SPEAKER_TOP_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT}, + {SPEAKER_TOP_BACK_LEFT, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT}, + {SPEAKER_TOP_BACK_CENTER, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER}, + {SPEAKER_TOP_BACK_RIGHT, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT} +}; + +/* *INDENT-OFF* */ +static DWORD default_ch_masks = { + 0, + KSAUDIO_SPEAKER_MONO, + /* 2ch */ + KSAUDIO_SPEAKER_STEREO, + /* 2.1ch */ + /* KSAUDIO_SPEAKER_3POINT0 ? */ + KSAUDIO_SPEAKER_2POINT1, + /* 4ch */ + /* KSAUDIO_SPEAKER_3POINT1 or KSAUDIO_SPEAKER_SURROUND ? */ + KSAUDIO_SPEAKER_QUAD, + /* 5ch */ + KSAUDIO_SPEAKER_5POINT0, + /* 5.1ch */ + KSAUDIO_SPEAKER_5POINT1, + /* 7ch */ + KSAUDIO_SPEAKER_7POINT0, + /* 7.1ch */ + KSAUDIO_SPEAKER_7POINT1, +}; +/* *INDENT-ON* */ + +static void +gst_mf_media_audio_channel_mask_to_position (guint channels, DWORD mask, + GstAudioChannelPosition * position) +{ + guint i, ch; + + for (i = 0, ch = 0; i < G_N_ELEMENTS (mf_to_gst_pos) && ch < channels; i++) { + if ((mask & mf_to_gst_posi.mf_pos) == 0) + continue; + + positionch = mf_to_gst_posi.gst_pos; + ch++; + } +} + +static GstCaps * +gst_mf_media_type_to_audio_caps (IMFMediaType * media_type) +{ + GUID subtype; + HRESULT hr; + UINT32 bps; + GstAudioFormat format = GST_AUDIO_FORMAT_UNKNOWN; + GstAudioInfo info; + UINT32 rate, channels, mask; + GstAudioChannelPosition position64; + + hr = media_type->GetGUID (MF_MT_SUBTYPE, &subtype); + if (FAILED (hr)) { + GST_WARNING ("failed to get subtype, hr: 0x%x", (guint) hr); + return nullptr; + } + + if (!IsEqualGUID (subtype, MFAudioFormat_PCM) && + !IsEqualGUID (subtype, MFAudioFormat_Float)) { + GST_FIXME ("Unknown subtype"); + return nullptr; + } + + hr = media_type->GetUINT32 (MF_MT_AUDIO_BITS_PER_SAMPLE, &bps); + if (FAILED (hr)) { + GST_WARNING ("Failed to get bps, hr: 0x%x", (guint) hr); + return nullptr; + } + + if (IsEqualGUID (subtype, MFAudioFormat_PCM)) { + format = gst_audio_format_build_integer (TRUE, G_LITTLE_ENDIAN, bps, bps); + } else if (bps == 32) { + format = GST_AUDIO_FORMAT_F32LE; + } else if (bps == 64) { + format = GST_AUDIO_FORMAT_F64LE; + } + + if (format == GST_AUDIO_FORMAT_UNKNOWN) { + GST_WARNING ("Unknown audio format"); + return nullptr; + } + + hr = media_type->GetUINT32 (MF_MT_AUDIO_NUM_CHANNELS, &channels); + if (FAILED (hr) || channels == 0) { + GST_WARNING ("Unknown channels"); + return nullptr; + } + + hr = media_type->GetUINT32 (MF_MT_AUDIO_SAMPLES_PER_SECOND, &rate); + if (FAILED (hr) || rate == 0) { + GST_WARNING ("Unknown rate"); + return nullptr; + } + + for (guint i = 0; i < G_N_ELEMENTS (position); i++) + positioni = GST_AUDIO_CHANNEL_POSITION_NONE; + + hr = media_type->GetUINT32 (MF_MT_AUDIO_CHANNEL_MASK, &mask); + if (FAILED (hr)) { + if (channels == 1) { + position0 = GST_AUDIO_CHANNEL_POSITION_MONO; + } else if (channels == 2) { + position0 = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT; + position1 = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT; + } else if (channels <= 8) { + GST_WARNING ("Unknown channel position, use default value"); + gst_mf_media_audio_channel_mask_to_position (channels, + default_ch_maskschannels, position); + } else { + GST_WARNING ("Failed to determine channel position"); + return nullptr; + } + } else { + gst_mf_media_audio_channel_mask_to_position (channels, mask, position); + } + + gst_audio_info_set_format (&info, format, rate, channels, position); + + return gst_audio_info_to_caps (&info); +} + GstCaps * gst_mf_media_type_to_caps (IMFMediaType * media_type) { GUID major_type; HRESULT hr; - g_return_val_if_fail (media_type != NULL, NULL); + g_return_val_if_fail (media_type != nullptr, nullptr); hr = media_type->GetMajorType (&major_type); if (FAILED (hr)) { GST_WARNING ("failed to get major type, hr: 0x%x", (guint) hr); - return NULL; + return nullptr; } - if (IsEqualGUID (major_type, MFMediaType_Video)) + if (IsEqualGUID (major_type, MFMediaType_Video)) { return gst_mf_media_type_to_video_caps (media_type); + } else if (IsEqualGUID (major_type, MFMediaType_Audio)) { + return gst_mf_media_type_to_audio_caps (media_type); + } - return NULL; + return nullptr; } void @@ -480,14 +672,14 @@ gboolean ret = TRUE; if (FAILED (hr)) { - gchar *error_text = NULL; + gchar *error_text = nullptr; error_text = g_win32_error_message ((gint) hr); /* g_win32_error_message() doesn't cover all HERESULT return code, * so it could be empty string, or null if there was an error * in g_utf16_to_utf8() */ gst_debug_log (cat, GST_LEVEL_WARNING, file, function, line, - NULL, "MediaFoundation call failed: 0x%x, %s", (guint) hr, + nullptr, "MediaFoundation call failed: 0x%x, %s", (guint) hr, GST_STR_NULL (error_text)); g_free (error_text); @@ -675,16 +867,16 @@ GST_MF_IF_EQUAL_RETURN (guid, MF_MT_ORIGINAL_WAVE_FORMAT_TAG); #endif - return NULL; + return nullptr; } static gchar * gst_mf_guid_to_string (const GUID & guid) { - const gchar *str = NULL; + const gchar *str = nullptr; HRESULT hr; - WCHAR *name = NULL; - gchar *ret = NULL; + WCHAR *name = nullptr; + gchar *ret = nullptr; str = gst_mf_guid_to_static_string (guid); if (str) @@ -692,7 +884,9 @@ hr = StringFromCLSID (guid, &name); if (gst_mf_result (hr) && name) { - ret = g_utf16_to_utf8 ((const gunichar2 *) name, -1, NULL, NULL, NULL); + ret = + g_utf16_to_utf8 ((const gunichar2 *) name, -1, nullptr, nullptr, + nullptr); CoTaskMemFree (name); if (ret) @@ -740,14 +934,14 @@ return gst_mf_guid_to_string (*var.puuid); case VT_LPWSTR: return g_utf16_to_utf8 ((const gunichar2 *) var.pwszVal, - -1, NULL, NULL, NULL); + -1, nullptr, nullptr, nullptr); case VT_UNKNOWN: return g_strdup ("IUnknown"); default: return g_strdup_printf ("Unhandled type (vt = %d)", var.vt); } - return NULL; + return nullptr; } static void @@ -755,8 +949,8 @@ guint index, GstDebugLevel level, GstDebugCategory * cat, const gchar * file, const gchar * function, gint line) { - gchar *guid_name = NULL; - gchar *value = NULL; + gchar *guid_name = nullptr; + gchar *value = nullptr; GUID guid = GUID_NULL; HRESULT hr; @@ -776,7 +970,8 @@ goto done; gst_debug_log (cat, level, file, function, line, - NULL, "%s attribute %d, %s: %s", msg ? msg : "", index, guid_name, value); + nullptr, "%s attribute %d, %s: %s", msg ? msg : "", index, guid_name, + value); done: PropVariantClear (&var);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfutils.h -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfutils.h
Changed
@@ -23,6 +23,7 @@ #include <gst/gst.h> #include <gst/video/video.h> +#include <gst/audio/audio.h> #ifndef INITGUID #include <initguid.h> @@ -75,4 +76,4 @@ G_END_DECLS -#endif /* __GST_MF_UTILS_H__ */ \ No newline at end of file +#endif /* __GST_MF_UTILS_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfvideobuffer.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfvideobuffer.cpp
Changed
@@ -20,14 +20,10 @@ #include "gstmfvideobuffer.h" #include <string.h> -/* *INDENT-OFF* */ -G_BEGIN_DECLS - GST_DEBUG_CATEGORY_EXTERN (gst_mf_video_buffer_debug); #define GST_CAT_DEFAULT gst_mf_video_buffer_debug -G_END_DECLS - +/* *INDENT-OFF* */ IGstMFVideoBuffer::IGstMFVideoBuffer () : ref_count_ (1) , current_len_ (0) @@ -241,7 +237,7 @@ GST_TRACE ("query IGstMFVideoBuffer interface %p", this); *object = this; } else { - *object = NULL; + *object = nullptr; return E_NOINTERFACE; }
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfvideoencoder.cpp
Added
@@ -0,0 +1,2025 @@ +/* GStreamer + * Copyright (C) 2020 Seungha Yang <seungha.yang@navercorp.com> + * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include "gstmfvideoencoder.h" +#include "gstmfvideobuffer.h" +#include "gstmfplatloader.h" +#include <wrl.h> +#include <string.h> +#include <cmath> + +#if GST_MF_HAVE_D3D11 +#include <d3d10.h> +#endif + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +GST_DEBUG_CATEGORY_EXTERN (gst_mf_video_encoder_debug); +#define GST_CAT_DEFAULT gst_mf_video_encoder_debug + +/** + * GstMFVideoEncoder: + * + * Base class for MediaFoundation video encoders + * + * Since: 1.22 + */ +#define gst_mf_video_encoder_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE (GstMFVideoEncoder, gst_mf_video_encoder, + GST_TYPE_VIDEO_ENCODER); + +static void gst_mf_video_encoder_dispose (GObject * object); +static void gst_mf_video_encoder_set_context (GstElement * element, + GstContext * context); +static gboolean gst_mf_video_encoder_open (GstVideoEncoder * enc); +static gboolean gst_mf_video_encoder_close (GstVideoEncoder * enc); +static gboolean gst_mf_video_encoder_start (GstVideoEncoder * enc); +static gboolean gst_mf_video_encoder_set_format (GstVideoEncoder * enc, + GstVideoCodecState * state); +static GstFlowReturn gst_mf_video_encoder_handle_frame (GstVideoEncoder * enc, + GstVideoCodecFrame * frame); +static GstFlowReturn gst_mf_video_encoder_finish (GstVideoEncoder * enc); +static gboolean gst_mf_video_encoder_flush (GstVideoEncoder * enc); +static gboolean gst_mf_video_encoder_propose_allocation (GstVideoEncoder * enc, + GstQuery * query); +static gboolean gst_mf_video_encoder_sink_query (GstVideoEncoder * enc, + GstQuery * query); +static gboolean gst_mf_video_encoder_src_query (GstVideoEncoder * enc, + GstQuery * query); + +static HRESULT gst_mf_video_on_new_sample (GstMFTransform * object, + IMFSample * sample, GstMFVideoEncoder * self); + +static void +gst_mf_video_encoder_class_init (GstMFVideoEncoderClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoEncoderClass *videoenc_class = GST_VIDEO_ENCODER_CLASS (klass); + + gobject_class->dispose = gst_mf_video_encoder_dispose; + + element_class->set_context = + GST_DEBUG_FUNCPTR (gst_mf_video_encoder_set_context); + + videoenc_class->open = GST_DEBUG_FUNCPTR (gst_mf_video_encoder_open); + videoenc_class->close = GST_DEBUG_FUNCPTR (gst_mf_video_encoder_close); + videoenc_class->start = GST_DEBUG_FUNCPTR (gst_mf_video_encoder_start); + videoenc_class->set_format = + GST_DEBUG_FUNCPTR (gst_mf_video_encoder_set_format); + videoenc_class->handle_frame = + GST_DEBUG_FUNCPTR (gst_mf_video_encoder_handle_frame); + videoenc_class->finish = GST_DEBUG_FUNCPTR (gst_mf_video_encoder_finish); + videoenc_class->flush = GST_DEBUG_FUNCPTR (gst_mf_video_encoder_flush); + videoenc_class->propose_allocation = + GST_DEBUG_FUNCPTR (gst_mf_video_encoder_propose_allocation); + videoenc_class->sink_query = + GST_DEBUG_FUNCPTR (gst_mf_video_encoder_sink_query); + videoenc_class->src_query = + GST_DEBUG_FUNCPTR (gst_mf_video_encoder_src_query); + + gst_type_mark_as_plugin_api (GST_TYPE_MF_VIDEO_ENCODER, + (GstPluginAPIFlags) 0); +} + +static void +gst_mf_video_encoder_init (GstMFVideoEncoder * self) +{ +} + +static void +gst_mf_video_encoder_dispose (GObject * object) +{ +#if GST_MF_HAVE_D3D11 + GstMFVideoEncoder *self = GST_MF_VIDEO_ENCODER (object); + + gst_clear_object (&self->d3d11_device); + gst_clear_object (&self->other_d3d11_device); +#endif + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_mf_video_encoder_set_context (GstElement * element, GstContext * context) +{ +#if GST_MF_HAVE_D3D11 + GstMFVideoEncoder *self = GST_MF_VIDEO_ENCODER (element); + GstMFVideoEncoderClass *klass = GST_MF_VIDEO_ENCODER_GET_CLASS (self); + GstMFVideoEncoderDeviceCaps *device_caps = &klass->device_caps; + + if (device_caps->d3d11_aware) { + gst_d3d11_handle_set_context_for_adapter_luid (element, context, + device_caps->adapter_luid, &self->other_d3d11_device); + } +#endif + + GST_ELEMENT_CLASS (parent_class)->set_context (element, context); +} + +static gboolean +gst_mf_video_encoder_open (GstVideoEncoder * enc) +{ + GstMFVideoEncoder *self = GST_MF_VIDEO_ENCODER (enc); + GstMFVideoEncoderClass *klass = GST_MF_VIDEO_ENCODER_GET_CLASS (enc); + GstMFVideoEncoderDeviceCaps *device_caps = &klass->device_caps; + GstMFTransformEnumParams enum_params = { 0, }; + MFT_REGISTER_TYPE_INFO output_type; + +#if GST_MF_HAVE_D3D11 + if (device_caps->d3d11_aware) { + HRESULT hr; + ID3D11Device *device_handle; + ComPtr < ID3D10Multithread > multi_thread; + GstD3D11Device *device; + + if (!gst_d3d11_ensure_element_data_for_adapter_luid (GST_ELEMENT (self), + device_caps->adapter_luid, &self->other_d3d11_device)) { + GST_ERROR_OBJECT (self, "Other d3d11 device is unavailable"); + return FALSE; + } + + /* Create our own device with D3D11_CREATE_DEVICE_VIDEO_SUPPORT */ + self->d3d11_device = + gst_d3d11_device_new_for_adapter_luid (device_caps->adapter_luid, + D3D11_CREATE_DEVICE_VIDEO_SUPPORT); + if (!self->d3d11_device) { + GST_ERROR_OBJECT (self, "Couldn't create internal d3d11 device"); + gst_clear_object (&self->other_d3d11_device); + return FALSE; + } + + device = self->d3d11_device; + + hr = GstMFCreateDXGIDeviceManager (&self->reset_token, + &self->device_manager); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Couldn't create DXGI device manager"); + gst_clear_object (&self->other_d3d11_device); + gst_clear_object (&self->d3d11_device); + return FALSE; + } + + device_handle = gst_d3d11_device_get_device_handle (device); + /* Enable multi thread protection as this device will be shared with + * MFT */ + hr = device_handle->QueryInterface (IID_PPV_ARGS (&multi_thread)); + if (!gst_d3d11_result (hr, device)) { + GST_WARNING_OBJECT (self, + "device doesn't suport ID3D10Multithread interface"); + gst_clear_object (&self->other_d3d11_device); + gst_clear_object (&self->d3d11_device); + } + + multi_thread->SetMultithreadProtected (TRUE); + + hr = self->device_manager->ResetDevice ((IUnknown *) device_handle, + self->reset_token); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Couldn't reset device with given d3d11 device"); + gst_clear_object (&self->other_d3d11_device); + gst_clear_object (&self->d3d11_device); + return FALSE; + } + } +#endif + + output_type.guidMajorType = MFMediaType_Video; + output_type.guidSubtype = klass->codec_id; + + enum_params.category = MFT_CATEGORY_VIDEO_ENCODER; + enum_params.enum_flags = klass->enum_flags; + enum_params.output_typeinfo = &output_type; + enum_params.device_index = klass->device_index; + + if (device_caps->d3d11_aware) + enum_params.adapter_luid = device_caps->adapter_luid; + + GST_DEBUG_OBJECT (self, + "Create MFT with enum flags: 0x%x, device index: %d, d3d11 aware: %d, " + "adapter-luid %" G_GINT64_FORMAT, klass->enum_flags, klass->device_index, + device_caps->d3d11_aware, device_caps->adapter_luid); + + self->transform = gst_mf_transform_new (&enum_params); + if (!self->transform) { + GST_ERROR_OBJECT (self, "Cannot create MFT object"); + return FALSE; + } + + /* In case of hardware MFT, it will be running on async mode. + * And new output sample callback will be called from Media Foundation's + * internal worker queue thread */ + if (self->transform && + (enum_params.enum_flags & MFT_ENUM_FLAG_HARDWARE) == + MFT_ENUM_FLAG_HARDWARE) { + self->async_mft = TRUE; + gst_mf_transform_set_new_sample_callback (self->transform, + (GstMFTransformNewSampleCallback) gst_mf_video_on_new_sample, self); + } else { + self->async_mft = FALSE; + } + + return TRUE; +} + +static gboolean +gst_mf_video_encoder_close (GstVideoEncoder * enc) +{ + GstMFVideoEncoder *self = GST_MF_VIDEO_ENCODER (enc); + + gst_clear_object (&self->transform); + + if (self->input_state) { + gst_video_codec_state_unref (self->input_state); + self->input_state = nullptr; + } +#if GST_MF_HAVE_D3D11 + if (self->device_manager) { + self->device_manager->Release (); + self->device_manager = nullptr; + } + + if (self->mf_allocator) { + self->mf_allocator->UninitializeSampleAllocator (); + self->mf_allocator->Release (); + self->mf_allocator = nullptr; + } + + gst_clear_object (&self->other_d3d11_device); + gst_clear_object (&self->d3d11_device); + gst_clear_d3d11_fence (&self->fence); +#endif + + return TRUE; +} + +static gboolean +gst_mf_video_encoder_start (GstVideoEncoder * enc) +{ + /* Media Foundation Transform will shift PTS in case that B-frame is enabled. + * We need to adjust DTS correspondingly */ + gst_video_encoder_set_min_pts (enc, GST_SECOND * 60 * 60 * 1000); + + return TRUE; +} + +static gboolean +gst_mf_video_encoder_init_mft (GstMFVideoEncoder * self) +{ + GstMFVideoEncoderClass *klass = GST_MF_VIDEO_ENCODER_GET_CLASS (self); + GstVideoInfo *info = &self->input_state->info; + GstCaps *caps = self->input_state->caps; + ComPtr < IMFMediaType > in_type; + ComPtr < IMFMediaType > out_type; + GList *input_types = nullptr; + GList *iter; + HRESULT hr; + gint fps_n, fps_d; + + GST_DEBUG_OBJECT (self, "Set format"); + + gst_mf_video_encoder_finish (GST_VIDEO_ENCODER (self)); + + self->mf_pts_offset = 0; + self->has_reorder_frame = FALSE; + self->last_ret = GST_FLOW_OK; + + if (!gst_mf_transform_open (self->transform)) { + GST_ERROR_OBJECT (self, "Failed to open MFT"); + return FALSE; + } +#if GST_MF_HAVE_D3D11 + if (self->device_manager) { + if (!gst_mf_transform_set_device_manager (self->transform, + self->device_manager)) { + GST_ERROR_OBJECT (self, "Couldn't set device manager"); + return FALSE; + } else { + GST_DEBUG_OBJECT (self, "set device manager done"); + } + } +#endif + + /* TODO: We support I420/NV12/P010 only for now. + * Consider other subsampling once we add it */ + if ((info->width % 2) != 0 || (info->height % 2) != 0) { + self->need_align = TRUE; + } else { + self->need_align = FALSE; + } + + hr = MFCreateMediaType (&out_type); + if (!gst_mf_result (hr)) + return FALSE; + + hr = out_type->SetGUID (MF_MT_MAJOR_TYPE, MFMediaType_Video); + if (!gst_mf_result (hr)) + return FALSE; + + if (klass->set_option) { + if (!klass->set_option (self, self->input_state, out_type.Get ())) { + GST_ERROR_OBJECT (self, "subclass failed to set option"); + return FALSE; + } + } + + fps_n = GST_VIDEO_INFO_FPS_N (info); + fps_d = GST_VIDEO_INFO_FPS_D (info); + if (fps_n <= 0 || fps_d <= 0) { + /* XXX: not sure why. NVIDIA MFT accepts 0/1 framerate, but Intel or + * Microsoft's software MFT doesn't accept 0/1 framerate. + * Need to set something meaningful value here therefore */ + fps_n = 25; + fps_d = 1; + } + + hr = MFSetAttributeRatio (out_type.Get (), MF_MT_FRAME_RATE, fps_n, fps_d); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, + "Couldn't set framerate %d/%d, hr: 0x%x", (guint) hr); + return FALSE; + } + + hr = MFSetAttributeSize (out_type.Get (), MF_MT_FRAME_SIZE, + GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info)); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, + "Couldn't set resolution %dx%d, hr: 0x%x", GST_VIDEO_INFO_WIDTH (info), + GST_VIDEO_INFO_HEIGHT (info), (guint) hr); + return FALSE; + } + + hr = MFSetAttributeRatio (out_type.Get (), MF_MT_PIXEL_ASPECT_RATIO, + GST_VIDEO_INFO_PAR_N (info), GST_VIDEO_INFO_PAR_D (info)); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Couldn't set par %d/%d", + GST_VIDEO_INFO_PAR_N (info), GST_VIDEO_INFO_PAR_D (info)); + return FALSE; + } + + hr = out_type->SetUINT32 (MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, + "Couldn't set interlace mode, hr: 0x%x", (guint) hr); + return FALSE; + } + + if (!gst_mf_transform_set_output_type (self->transform, out_type.Get ())) { + GST_ERROR_OBJECT (self, "Couldn't set output type"); + return FALSE; + } + + if (!gst_mf_transform_get_input_available_types (self->transform, + &input_types)) { + GST_ERROR_OBJECT (self, "Couldn't get available input types"); + return FALSE; + } + + for (iter = input_types; iter; iter = g_list_next (iter)) { + GstVideoFormat format; + GUID subtype; + IMFMediaType *type = (IMFMediaType *) iter->data; + + hr = type->GetGUID (MF_MT_SUBTYPE, &subtype); + if (!gst_mf_result (hr)) + continue; + + format = gst_mf_video_subtype_to_video_format (&subtype); + if (format != GST_VIDEO_INFO_FORMAT (info)) + continue; + + in_type = type; + } + + g_list_free_full (input_types, (GDestroyNotify) gst_mf_media_type_release); + + if (!in_type) { + GST_ERROR_OBJECT (self, + "Couldn't convert input caps %" GST_PTR_FORMAT " to media type", caps); + return FALSE; + } + + hr = MFSetAttributeSize (in_type.Get (), MF_MT_FRAME_SIZE, + GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info)); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Couldn't set frame size %dx%d", + GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info)); + return FALSE; + } + + hr = in_type->SetUINT32 (MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, + "Couldn't set interlace mode, hr: 0x%x", (guint) hr); + return FALSE; + } + + hr = MFSetAttributeRatio (in_type.Get (), MF_MT_PIXEL_ASPECT_RATIO, + GST_VIDEO_INFO_PAR_N (info), GST_VIDEO_INFO_PAR_D (info)); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Couldn't set par %d/%d", + GST_VIDEO_INFO_PAR_N (info), GST_VIDEO_INFO_PAR_D (info)); + return FALSE; + } + + hr = MFSetAttributeRatio (in_type.Get (), MF_MT_FRAME_RATE, fps_n, fps_d); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Couldn't set framerate ratio %d/%d", fps_n, fps_d); + return FALSE; + } + + hr = in_type->SetUINT32 (MF_MT_DEFAULT_STRIDE, + GST_VIDEO_INFO_PLANE_STRIDE (info, 0)); + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Couldn't set default stride"); + return FALSE; + } + + if (!gst_mf_transform_set_input_type (self->transform, in_type.Get ())) { + GST_ERROR_OBJECT (self, "Couldn't set input media type"); + return FALSE; + } + + g_assert (klass->set_src_caps != nullptr); + if (!klass->set_src_caps (self, self->input_state, out_type.Get ())) { + GST_ERROR_OBJECT (self, "subclass couldn't set src caps"); + return FALSE; + } +#if GST_MF_HAVE_D3D11 + if (self->mf_allocator) { + self->mf_allocator->UninitializeSampleAllocator (); + self->mf_allocator->Release (); + self->mf_allocator = nullptr; + } + + /* Check whether upstream is d3d11 element */ + GstCapsFeatures *features; + ComPtr < IMFVideoSampleAllocatorEx > allocator; + + features = gst_caps_get_features (caps, 0); + + if (features && + gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { + GST_DEBUG_OBJECT (self, "found D3D11 memory feature"); + + hr = GstMFCreateVideoSampleAllocatorEx (IID_PPV_ARGS (&allocator)); + if (!gst_mf_result (hr)) + GST_WARNING_OBJECT (self, + "IMFVideoSampleAllocatorEx interface is unavailable"); + } + + if (allocator) { + do { + ComPtr < IMFAttributes > attr; + + hr = MFCreateAttributes (&attr, 4); + if (!gst_mf_result (hr)) + break; + + /* Only one buffer per sample + * (multiple sample is usually for multi-view things) */ + hr = attr->SetUINT32 (GST_GUID_MF_SA_BUFFERS_PER_SAMPLE, 1); + if (!gst_mf_result (hr)) + break; + + hr = attr->SetUINT32 (GST_GUID_MF_SA_D3D11_USAGE, D3D11_USAGE_DEFAULT); + if (!gst_mf_result (hr)) + break; + + /* TODO: Check if we need to use keyed-mutex */ + hr = attr->SetUINT32 (GST_GUID_MF_SA_D3D11_SHARED_WITHOUT_MUTEX, TRUE); + if (!gst_mf_result (hr)) + break; + + hr = attr->SetUINT32 (GST_GUID_MF_SA_D3D11_BINDFLAGS, + D3D11_BIND_VIDEO_ENCODER); + if (!gst_mf_result (hr)) + break; + + hr = allocator->SetDirectXManager (self->device_manager); + if (!gst_mf_result (hr)) + break; + + hr = allocator->InitializeSampleAllocatorEx ( + /* min samples, since we are running on async mode, + * at least 2 samples would be required */ + 2, + /* max samples, why 16 + 2? it's just magic number + * (H264 max dpb size 16 + our min sample size 2) */ + 16 + 2, attr.Get (), in_type.Get () + ); + + if (!gst_mf_result (hr)) + break; + + GST_DEBUG_OBJECT (self, "IMFVideoSampleAllocatorEx is initialized"); + + self->mf_allocator = allocator.Detach (); + } while (0); + } +#endif + + return TRUE; +} + +static gboolean +gst_mf_video_encoder_set_format (GstVideoEncoder * enc, + GstVideoCodecState * state) +{ + GstMFVideoEncoder *self = GST_MF_VIDEO_ENCODER (enc); + GST_DEBUG_OBJECT (self, "Set format"); + + if (self->input_state) + gst_video_codec_state_unref (self->input_state); + self->input_state = gst_video_codec_state_ref (state); + + return gst_mf_video_encoder_init_mft (self); +} + +static void +gst_mf_video_buffer_free (GstVideoFrame * frame) +{ + if (!frame) + return; + + gst_video_frame_unmap (frame); + g_free (frame); +} + +static gboolean +gst_mf_video_encoder_frame_needs_copy (GstVideoFrame * vframe) +{ + /* Single plane data can be used without copy */ + if (GST_VIDEO_FRAME_N_PLANES (vframe) == 1) + return FALSE; + + switch (GST_VIDEO_FRAME_FORMAT (vframe)) { + case GST_VIDEO_FORMAT_I420: + { + guint8 *data, *other_data; + guint size; + + /* Unexpected stride size, Media Foundation doesn't provide API for + * per plane stride information */ + if (GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 0) != + 2 * GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 1) || + GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 1) != + GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 2)) { + return TRUE; + } + + size = GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 0) * + GST_VIDEO_FRAME_HEIGHT (vframe); + if (size + GST_VIDEO_FRAME_PLANE_OFFSET (vframe, 0) != + GST_VIDEO_FRAME_PLANE_OFFSET (vframe, 1)) + return TRUE; + + data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 0); + other_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 1); + if (data + size != other_data) + return TRUE; + + size = GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 1) * + GST_VIDEO_FRAME_COMP_HEIGHT (vframe, 1); + if (size + GST_VIDEO_FRAME_PLANE_OFFSET (vframe, 1) != + GST_VIDEO_FRAME_PLANE_OFFSET (vframe, 2)) + return TRUE; + + data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 1); + other_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 2); + if (data + size != other_data) + return TRUE; + + return FALSE; + } + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P016_LE: + { + guint8 *data, *other_data; + guint size; + + /* Unexpected stride size, Media Foundation doesn't provide API for + * per plane stride information */ + if (GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 0) != + GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 1)) { + return TRUE; + } + + size = GST_VIDEO_FRAME_PLANE_STRIDE (vframe, 0) * + GST_VIDEO_FRAME_HEIGHT (vframe); + + /* Unexpected padding */ + if (size + GST_VIDEO_FRAME_PLANE_OFFSET (vframe, 0) != + GST_VIDEO_FRAME_PLANE_OFFSET (vframe, 1)) + return TRUE; + + data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 0); + other_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 1); + if (data + size != other_data) + return TRUE; + + return FALSE; + } + default: + g_assert_not_reached (); + return TRUE; + } + + return TRUE; +} + +typedef struct +{ + LONGLONG mf_pts; +} GstMFVideoEncoderFrameData; + +static gboolean +gst_mf_video_encoder_process_input (GstMFVideoEncoder * self, + GstVideoCodecFrame * frame, IMFSample * sample) +{ + GstMFVideoEncoderClass *klass = GST_MF_VIDEO_ENCODER_GET_CLASS (self); + HRESULT hr; + gboolean unset_force_keyframe = FALSE; + GstMFVideoEncoderFrameData *frame_data = nullptr; + gboolean res; + + frame_data = g_new0 (GstMFVideoEncoderFrameData, 1); + frame_data->mf_pts = frame->pts / 100; + + gst_video_codec_frame_set_user_data (frame, + frame_data, (GDestroyNotify) g_free); + + hr = sample->SetSampleTime (frame_data->mf_pts); + if (!gst_mf_result (hr)) + return FALSE; + + hr = sample-> + SetSampleDuration (GST_CLOCK_TIME_IS_VALID (frame->duration) ? frame-> + duration / 100 : 0); + if (!gst_mf_result (hr)) + return FALSE; + + if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame)) { + if (klass->device_caps.force_keyframe) { + unset_force_keyframe = + gst_mf_transform_set_codec_api_uint32 (self->transform, + &CODECAPI_AVEncVideoForceKeyFrame, TRUE); + } else { + GST_WARNING_OBJECT (self, "encoder does not support force keyframe"); + } + } + + /* Unlock temporary so that we can output frame from Media Foundation's + * worker thread. + * While we are processing input, MFT might notify + * METransformHaveOutput event from Media Foundation's internal worker queue + * thread. Then we will output encoded data from the thread synchroniously, + * not from streaming (this) thread */ + if (self->async_mft) + GST_VIDEO_ENCODER_STREAM_UNLOCK (self); + res = gst_mf_transform_process_input (self->transform, sample); + if (self->async_mft) + GST_VIDEO_ENCODER_STREAM_LOCK (self); + + if (unset_force_keyframe) { + gst_mf_transform_set_codec_api_uint32 (self->transform, + &CODECAPI_AVEncVideoForceKeyFrame, FALSE); + } + + if (!res) { + GST_ERROR_OBJECT (self, "Failed to process input"); + return FALSE; + } + + return TRUE; +} + +static GstVideoCodecFrame * +gst_mf_video_encoder_find_output_frame (GstMFVideoEncoder * self, + LONGLONG mf_pts) +{ + GList *l, *walk = gst_video_encoder_get_frames (GST_VIDEO_ENCODER (self)); + GstVideoCodecFrame *ret = nullptr; + GstVideoCodecFrame *closest = nullptr; + LONGLONG min_pts_abs_diff = 0; + + for (l = walk; l; l = l->next) { + GstVideoCodecFrame *frame = (GstVideoCodecFrame *) l->data; + GstMFVideoEncoderFrameData *data = (GstMFVideoEncoderFrameData *) + gst_video_codec_frame_get_user_data (frame); + LONGLONG abs_diff; + + if (!data) + continue; + + if (mf_pts == data->mf_pts) { + ret = frame; + break; + } + + abs_diff = std::abs (mf_pts - data->mf_pts); + + if (!closest || abs_diff < min_pts_abs_diff) { + closest = frame; + min_pts_abs_diff = abs_diff; + } + } + + if (!ret && closest) + ret = closest; + + if (ret) { + gst_video_codec_frame_ref (ret); + } else { + /* XXX: Shouldn't happen, but possible if no GstVideoCodecFrame holds + * user data for some reasons */ + GST_WARNING_OBJECT (self, + "Failed to find closest GstVideoCodecFrame with MF pts %" + G_GINT64_FORMAT, mf_pts); + ret = gst_video_encoder_get_oldest_frame (GST_VIDEO_ENCODER (self)); + } + + if (walk) + g_list_free_full (walk, (GDestroyNotify) gst_video_codec_frame_unref); + + return ret; +} + +static HRESULT +gst_mf_video_encoder_finish_sample (GstMFVideoEncoder * self, + IMFSample * sample) +{ + HRESULT hr = S_OK; + BYTE *data; + ComPtr < IMFMediaBuffer > media_buffer; + GstBuffer *buffer; + GstFlowReturn res = GST_FLOW_ERROR; + GstVideoCodecFrame *frame; + LONGLONG sample_timestamp; + LONGLONG sample_duration; + LONGLONG target_mf_pts; + UINT64 mf_dts; + UINT32 keyframe = FALSE; + DWORD buffer_len; + GstClockTime pts, dts, duration; + + hr = sample->GetBufferByIndex (0, &media_buffer); + if (!gst_mf_result (hr)) + goto done; + + hr = media_buffer->Lock (&data, nullptr, &buffer_len); + if (!gst_mf_result (hr)) + goto done; + + buffer = gst_buffer_new_allocate (nullptr, buffer_len, nullptr); + gst_buffer_fill (buffer, 0, data, buffer_len); + media_buffer->Unlock (); + + sample->GetSampleTime (&sample_timestamp); + target_mf_pts = sample_timestamp; + sample->GetSampleDuration (&sample_duration); + sample->GetUINT32 (MFSampleExtension_CleanPoint, &keyframe); + + hr = sample->GetUINT64 (MFSampleExtension_DecodeTimestamp, &mf_dts); + if (FAILED (hr)) { + mf_dts = sample_timestamp; + hr = S_OK; + } + + pts = sample_timestamp * 100; + dts = mf_dts * 100; + duration = sample_duration * 100; + + GST_LOG_OBJECT (self, "Finish sample, MF pts %" GST_TIME_FORMAT " MF dts %" + GST_TIME_FORMAT ", MF duration %" GST_TIME_FORMAT, + GST_TIME_ARGS (pts), GST_TIME_ARGS (dts), GST_TIME_ARGS (duration)); + + /* NOTE: When B-frame is enabled, MFT shows following pattern + * (input timestamp starts from 1000:00:00.000000000, and 30fps) + * + * Frame-1: MF pts 0:00.033333300 MF dts 0:00.000000000 + * Frame-2: MF pts 0:00.133333300 MF dts 0:00.033333300 + * Frame-3: MF pts 0:00.066666600 MF dts 0:00.066666600 + * Frame-4: MF pts 0:00.099999900 MF dts 0:00.100000000 + * + * - Sounds MFT doesn't support negative timestamp, so PTS of each frame seems + * to be shifthed + * - DTS is likely based on timestamp we've set to input sample, + * but some frames has (especially Frame-4 case) unexpected PTS and + * even PTS < DTS. That would be the result of PTS shifting + * + * To handle this case, + * - Calculate timestamp offset "Frame-1 PTS" - "Frame-1 DTS" (== duration), + * and compensate PTS/DTS of each frame + * - Needs additional offset for DTS to compenstate GST/MF timescale difference + * (MF uses 100ns timescale). So DTS offset should be "PTS offset + 100ns" + * - Find corresponding GstVideoCodecFrame by using compensated PTS. + * Note that MFT doesn't support user-data for tracing input/output sample + * pair. So, timestamp based lookup is the only way to map MF sample + * and our GstVideoCodecFrame + */ + if (self->has_reorder_frame) { + /* This would be the first frame */ + if (self->mf_pts_offset == 0) { + LONGLONG mf_pts_offset = -1; + if (sample_timestamp > mf_dts) { + mf_pts_offset = sample_timestamp - mf_dts; + GST_DEBUG_OBJECT (self, "Calculates PTS offset using \"PTS - DTS\": %" + G_GINT64_FORMAT, mf_pts_offset); + } else if (sample_duration > 0) { + mf_pts_offset = sample_duration; + GST_DEBUG_OBJECT (self, "Calculates PTS offset using duration: %" + G_GINT64_FORMAT, mf_pts_offset); + } else { + GST_WARNING_OBJECT (self, "Cannot calculate PTS offset"); + } + + self->mf_pts_offset = mf_pts_offset; + } + + if (self->mf_pts_offset > 0) { + target_mf_pts -= self->mf_pts_offset; + + pts -= (self->mf_pts_offset * 100); + /* +1 to compensate timescale difference */ + dts -= ((self->mf_pts_offset + 1) * 100); + } + } + + frame = gst_mf_video_encoder_find_output_frame (self, target_mf_pts); + + if (frame) { + if (keyframe) { + GST_DEBUG_OBJECT (self, "Keyframe pts %" GST_TIME_FORMAT, + GST_TIME_ARGS (frame->pts)); + GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); + } + + frame->output_buffer = buffer; + + /* Update DTS only if B-frame was enabled, but use input frame pts as-is. + * Otherwise we will lost at most 100ns precision */ + if (self->has_reorder_frame) { + frame->dts = dts; + } else { + frame->dts = frame->pts; + } + + /* make sure PTS > DTS */ + if (GST_CLOCK_TIME_IS_VALID (frame->pts) && + GST_CLOCK_TIME_IS_VALID (frame->dts) && frame->pts < frame->dts) { + GST_WARNING_OBJECT (self, "Calculated DTS %" GST_TIME_FORMAT + " is larger than PTS %" GST_TIME_FORMAT, GST_TIME_ARGS (frame->pts), + GST_TIME_ARGS (frame->dts)); + + /* XXX: just set clock-time-none? */ + frame->dts = frame->pts; + } + + GST_LOG_OBJECT (self, "Frame pts %" GST_TIME_FORMAT ", Frame DTS %" + GST_TIME_FORMAT, GST_TIME_ARGS (frame->pts), + GST_TIME_ARGS (frame->dts)); + + res = gst_video_encoder_finish_frame (GST_VIDEO_ENCODER (self), frame); + } else { + GST_BUFFER_PTS (buffer) = pts; + GST_BUFFER_DTS (buffer) = dts; + GST_BUFFER_DURATION (buffer) = duration; + + if (keyframe) { + GST_DEBUG_OBJECT (self, "Keyframe pts %" GST_TIME_FORMAT, + GST_BUFFER_PTS (buffer)); + GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); + } else { + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); + } + + GST_LOG_OBJECT (self, "Buffer pts %" GST_TIME_FORMAT ", Buffer DTS %" + GST_TIME_FORMAT, GST_TIME_ARGS (pts), GST_TIME_ARGS (dts)); + + res = gst_pad_push (GST_VIDEO_ENCODER_SRC_PAD (self), buffer); + } + +done: + self->last_ret = res; + + return hr; +} + +static GstFlowReturn +gst_mf_video_encoder_process_output (GstMFVideoEncoder * self) +{ + ComPtr < IMFSample > sample; + GstFlowReturn res = GST_FLOW_ERROR; + + res = gst_mf_transform_get_output (self->transform, &sample); + + if (res != GST_FLOW_OK) + return res; + + gst_mf_video_encoder_finish_sample (self, sample.Get ()); + + return self->last_ret; +} + +static gboolean +gst_mf_video_encoder_create_input_sample (GstMFVideoEncoder * self, + GstVideoCodecFrame * frame, IMFSample ** sample) +{ + HRESULT hr; + ComPtr < IMFSample > new_sample; + ComPtr < IMFMediaBuffer > media_buffer; + ComPtr < IGstMFVideoBuffer > video_buffer; + GstVideoInfo *info = &self->input_state->info; + gint i, j; + GstVideoFrame *vframe = nullptr; + BYTE *data = nullptr; + gboolean need_copy = self->need_align; + + vframe = g_new0 (GstVideoFrame, 1); + + if (!gst_video_frame_map (vframe, info, frame->input_buffer, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Couldn't map input frame"); + g_free (vframe); + return FALSE; + } + + hr = MFCreateSample (&new_sample); + if (!gst_mf_result (hr)) + goto error; + + /* Check if we can forward this memory to Media Foundation without copy */ + if (!need_copy) + need_copy = gst_mf_video_encoder_frame_needs_copy (vframe); + + if (need_copy) { + GST_TRACE_OBJECT (self, "Copy input buffer into Media Foundation memory"); + hr = MFCreateMemoryBuffer (GST_VIDEO_INFO_SIZE (info), &media_buffer); + } else { + GST_TRACE_OBJECT (self, "Can use input buffer without copy"); + hr = IGstMFVideoBuffer::CreateInstanceWrapped (&vframe->info, + (BYTE *) GST_VIDEO_FRAME_PLANE_DATA (vframe, 0), + GST_VIDEO_INFO_SIZE (&vframe->info), &media_buffer); + } + + if (!gst_mf_result (hr)) + goto error; + + if (!need_copy) { + hr = media_buffer.As (&video_buffer); + if (!gst_mf_result (hr)) + goto error; + } else { + hr = media_buffer->Lock (&data, nullptr, nullptr); + if (!gst_mf_result (hr)) + goto error; + + for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) { + guint8 *src, *dst; + gint src_stride, dst_stride; + gint width; + + src = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (vframe, i); + dst = data + GST_VIDEO_INFO_PLANE_OFFSET (info, i); + + src_stride = GST_VIDEO_FRAME_PLANE_STRIDE (vframe, i); + dst_stride = GST_VIDEO_INFO_PLANE_STRIDE (info, i); + + width = GST_VIDEO_INFO_COMP_WIDTH (info, i) + * GST_VIDEO_INFO_COMP_PSTRIDE (info, i); + + for (j = 0; j < GST_VIDEO_INFO_COMP_HEIGHT (info, i); j++) { + memcpy (dst, src, width); + src += src_stride; + dst += dst_stride; + } + } + + media_buffer->Unlock (); + } + + hr = media_buffer->SetCurrentLength (GST_VIDEO_INFO_SIZE (info)); + if (!gst_mf_result (hr)) + goto error; + + hr = new_sample->AddBuffer (media_buffer.Get ()); + if (!gst_mf_result (hr)) + goto error; + + if (!need_copy) { + /* IGstMFVideoBuffer will hold GstVideoFrame (+ GstBuffer), then it will be + * cleared when it's no more referenced by Media Foundation internals */ + hr = video_buffer->SetUserData ((gpointer) vframe, + (GDestroyNotify) gst_mf_video_buffer_free); + if (!gst_mf_result (hr)) + goto error; + } else { + gst_video_frame_unmap (vframe); + g_free (vframe); + vframe = nullptr; + } + + *sample = new_sample.Detach (); + + return TRUE; + +error: + if (vframe) { + gst_video_frame_unmap (vframe); + g_free (vframe); + } + + return FALSE; +} + +#if GST_MF_HAVE_D3D11 +static gboolean +gst_mf_video_encoder_create_input_sample_d3d11 (GstMFVideoEncoder * self, + GstVideoCodecFrame * frame, IMFSample ** sample) +{ + GstMFVideoEncoderClass *klass = GST_MF_VIDEO_ENCODER_GET_CLASS (self); + GstMFVideoEncoderDeviceCaps *device_caps = &klass->device_caps; + HRESULT hr; + ComPtr < IMFSample > new_sample; + ComPtr < IMFMediaBuffer > mf_buffer; + ComPtr < IMFDXGIBuffer > dxgi_buffer; + ComPtr < ID3D11Texture2D > mf_texture; + ComPtr < IDXGIResource > dxgi_resource; + ComPtr < ID3D11Texture2D > shared_texture; + HANDLE shared_handle; + GstMemory *mem; + GstD3D11Memory *dmem; + ID3D11Texture2D *texture; + ID3D11Device *device_handle; + ID3D11DeviceContext *context_handle; + GstMapInfo info; + D3D11_BOX src_box = { 0, }; + D3D11_TEXTURE2D_DESC dst_desc, src_desc; + guint subidx; + gint64 adapter_luid; + + if (!self->mf_allocator) { + GST_WARNING_OBJECT (self, "IMFVideoSampleAllocatorEx was configured"); + return FALSE; + } + + mem = gst_buffer_peek_memory (frame->input_buffer, 0); + if (!gst_is_d3d11_memory (mem)) { + GST_WARNING_OBJECT (self, "Non-d3d11 memory"); + return FALSE; + } + + dmem = GST_D3D11_MEMORY_CAST (mem); + g_object_get (dmem->device, "adapter-luid", &adapter_luid, nullptr); + if (adapter_luid != device_caps->adapter_luid) { + GST_LOG_OBJECT (self, "Buffer from different GPU"); + return FALSE; + } + + device_handle = gst_d3d11_device_get_device_handle (dmem->device); + context_handle = gst_d3d11_device_get_device_context_handle (dmem->device); + + /* 1) Allocate new encoding surface */ + hr = self->mf_allocator->AllocateSample (&new_sample); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, + "Couldn't allocate new sample via IMFVideoSampleAllocatorEx"); + return FALSE; + } + + hr = new_sample->GetBufferByIndex (0, &mf_buffer); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Couldn't get IMFMediaBuffer from sample"); + return FALSE; + } + + hr = mf_buffer.As (&dxgi_buffer); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Couldn't get IMFDXGIBuffer from IMFMediaBuffer"); + return FALSE; + } + + hr = dxgi_buffer->GetResource (IID_PPV_ARGS (&mf_texture)); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, + "Couldn't get ID3D11Texture2D from IMFDXGIBuffer"); + return FALSE; + } + + hr = mf_texture.As (&dxgi_resource); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, + "Couldn't get IDXGIResource from ID3D11Texture2D"); + return FALSE; + } + + hr = dxgi_resource->GetSharedHandle (&shared_handle); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Couldn't get shared handle from IDXGIResource"); + return FALSE; + } + + /* Allocation succeeded. Now open shared texture to access it from + * other device */ + hr = device_handle->OpenSharedResource (shared_handle, + IID_PPV_ARGS (&shared_texture)); + if (!gst_mf_result (hr)) { + GST_WARNING_OBJECT (self, "Couldn't open shared resource"); + return FALSE; + } + + /* 2) Copy upstream texture to mf's texture */ + /* Map memory so that ensure pending upload from staging texture */ + if (!gst_memory_map (mem, &info, + (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Couldn't map d3d11 memory"); + return FALSE; + } + + texture = (ID3D11Texture2D *) info.data; + texture->GetDesc (&src_desc); + shared_texture->GetDesc (&dst_desc); + subidx = gst_d3d11_memory_get_subresource_index (dmem); + + /* src/dst texture size might be different if padding was used. + * select smaller size */ + src_box.left = 0; + src_box.top = 0; + src_box.front = 0; + src_box.back = 1; + src_box.right = MIN (src_desc.Width, dst_desc.Width); + src_box.bottom = MIN (src_desc.Height, dst_desc.Height); + + gst_d3d11_device_lock (dmem->device); + if (self->fence && self->fence->device != dmem->device) + gst_clear_d3d11_fence (&self->fence); + + if (!self->fence) + self->fence = gst_d3d11_device_create_fence (dmem->device); + + if (!self->fence) { + GST_ERROR_OBJECT (self, "Couldn't create fence object"); + gst_d3d11_device_unlock (dmem->device); + gst_memory_unmap (mem, &info); + return FALSE; + } + + context_handle->CopySubresourceRegion (shared_texture.Get (), 0, 0, 0, 0, + texture, subidx, &src_box); + + if (!gst_d3d11_fence_signal (self->fence) || + !gst_d3d11_fence_wait (self->fence)) { + GST_ERROR_OBJECT (self, "Couldn't sync GPU operation"); + gst_clear_d3d11_fence (&self->fence); + gst_d3d11_device_unlock (dmem->device); + gst_memory_unmap (mem, &info); + + return FALSE; + } + + gst_d3d11_device_unlock (dmem->device); + gst_memory_unmap (mem, &info); + + *sample = new_sample.Detach (); + + return TRUE; +} +#endif + +static GstFlowReturn +gst_mf_video_encoder_handle_frame (GstVideoEncoder * enc, + GstVideoCodecFrame * frame) +{ + GstMFVideoEncoder *self = GST_MF_VIDEO_ENCODER (enc); + GstFlowReturn ret = GST_FLOW_OK; + ComPtr < IMFSample > sample; + GstMFVideoEncoderClass *klass = GST_MF_VIDEO_ENCODER_GET_CLASS (self); + + if (self->last_ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (self, "Last return was %s", gst_flow_get_name (ret)); + ret = self->last_ret; + goto done; + } + + if (klass->check_reconfigure (self) && !gst_mf_video_encoder_init_mft (self)) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (nullptr), + ("Failed to reconfigure encoder")); + return GST_FLOW_ERROR; + } +#if GST_MF_HAVE_D3D11 + if (self->mf_allocator && + !gst_mf_video_encoder_create_input_sample_d3d11 (self, frame, &sample)) { + GST_LOG_OBJECT (self, "Failed to create IMFSample for D3D11"); + sample = nullptr; + } +#endif + + if (!sample + && !gst_mf_video_encoder_create_input_sample (self, frame, &sample)) { + GST_ERROR_OBJECT (self, "Failed to create IMFSample"); + ret = GST_FLOW_ERROR; + goto done; + } + + if (!gst_mf_video_encoder_process_input (self, frame, sample.Get ())) { + GST_ERROR_OBJECT (self, "Failed to process input"); + ret = GST_FLOW_ERROR; + goto done; + } + + /* Don't call process_output for async (hardware) MFT. We will output + * encoded data from gst_mf_video_on_new_sample() callback which is called + * from Media Foundation's internal worker queue thread */ + if (!self->async_mft) { + do { + ret = gst_mf_video_encoder_process_output (self); + } while (ret == GST_FLOW_OK); + } + + if (ret == GST_MF_TRANSFORM_FLOW_NEED_DATA) + ret = GST_FLOW_OK; + +done: + gst_video_codec_frame_unref (frame); + + return ret; +} + +static GstFlowReturn +gst_mf_video_encoder_finish (GstVideoEncoder * enc) +{ + GstMFVideoEncoder *self = GST_MF_VIDEO_ENCODER (enc); + GstFlowReturn ret = GST_FLOW_OK; + + if (!self->transform) + return GST_FLOW_OK; + + /* Unlock temporary so that we can output frame from Media Foundation's + * worker thread */ + if (self->async_mft) + GST_VIDEO_ENCODER_STREAM_UNLOCK (enc); + + gst_mf_transform_drain (self->transform); + + if (self->async_mft) + GST_VIDEO_ENCODER_STREAM_LOCK (enc); + + if (!self->async_mft) { + do { + ret = gst_mf_video_encoder_process_output (self); + } while (ret == GST_FLOW_OK); + } + + if (ret == GST_MF_TRANSFORM_FLOW_NEED_DATA) + ret = GST_FLOW_OK; + + return ret; +} + +static gboolean +gst_mf_video_encoder_flush (GstVideoEncoder * enc) +{ + GstMFVideoEncoder *self = GST_MF_VIDEO_ENCODER (enc); + + if (!self->transform) + goto out; + + /* Unlock while flushing, while flushing, new sample callback might happen */ + if (self->async_mft) + GST_VIDEO_ENCODER_STREAM_UNLOCK (enc); + + gst_mf_transform_flush (self->transform); + + if (self->async_mft) + GST_VIDEO_ENCODER_STREAM_LOCK (enc); + +out: + self->last_ret = GST_FLOW_OK; + + return TRUE; +} + +static gboolean +gst_mf_video_encoder_propose_allocation (GstVideoEncoder * enc, + GstQuery * query) +{ +#if GST_MF_HAVE_D3D11 + GstMFVideoEncoder *self = GST_MF_VIDEO_ENCODER (enc); + GstVideoInfo info; + GstBufferPool *pool = nullptr; + GstCaps *caps; + guint size; + GstD3D11Device *device = self->other_d3d11_device; + + gst_query_parse_allocation (query, &caps, nullptr); + + if (caps == nullptr) + return FALSE; + + if (!gst_video_info_from_caps (&info, caps)) + return FALSE; + + if (gst_query_get_n_allocation_pools (query) == 0) { + GstCapsFeatures *features; + GstStructure *config; + gboolean is_d3d11 = FALSE; + + features = gst_caps_get_features (caps, 0); + + if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { + GST_DEBUG_OBJECT (self, "Allocation caps supports d3d11 memory"); + pool = gst_d3d11_buffer_pool_new (device); + is_d3d11 = TRUE; + } else { + pool = gst_video_buffer_pool_new (); + } + + config = gst_buffer_pool_get_config (pool); + + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_META); + + /* d3d11 pool does not support video alignment */ + if (!is_d3d11) { + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); + } + + size = GST_VIDEO_INFO_SIZE (&info); + gst_buffer_pool_config_set_params (config, caps, size, 0, 0); + + if (!gst_buffer_pool_set_config (pool, config)) + goto config_failed; + + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + if (is_d3d11) { + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, + nullptr, &size, nullptr, nullptr); + gst_structure_free (config); + } + + gst_query_add_allocation_pool (query, pool, size, 0, 0); + gst_object_unref (pool); + } + + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, nullptr); + + return TRUE; + + /* ERRORS */ +config_failed: + { + GST_ERROR_OBJECT (self, "failed to set config"); + gst_object_unref (pool); + return FALSE; + } + +#else + return GST_VIDEO_ENCODER_CLASS (parent_class)->propose_allocation (enc, + query); +#endif +} + +static gboolean +gst_mf_video_encoder_sink_query (GstVideoEncoder * enc, GstQuery * query) +{ +#if GST_MF_HAVE_D3D11 + GstMFVideoEncoder *self = GST_MF_VIDEO_ENCODER (enc); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + if (gst_d3d11_handle_context_query (GST_ELEMENT (self), + query, self->other_d3d11_device)) { + return TRUE; + } + break; + default: + break; + } +#endif + + return GST_VIDEO_ENCODER_CLASS (parent_class)->sink_query (enc, query); +} + +static gboolean +gst_mf_video_encoder_src_query (GstVideoEncoder * enc, GstQuery * query) +{ +#if GST_MF_HAVE_D3D11 + GstMFVideoEncoder *self = GST_MF_VIDEO_ENCODER (enc); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + if (gst_d3d11_handle_context_query (GST_ELEMENT (self), + query, self->other_d3d11_device)) { + return TRUE; + } + break; + default: + break; + } +#endif + + return GST_VIDEO_ENCODER_CLASS (parent_class)->src_query (enc, query); +} + +static HRESULT +gst_mf_video_on_new_sample (GstMFTransform * object, + IMFSample * sample, GstMFVideoEncoder * self) +{ + GST_LOG_OBJECT (self, "New Sample callback"); + + /* NOTE: this callback will be called from Media Foundation's internal + * worker queue thread */ + GST_VIDEO_ENCODER_STREAM_LOCK (self); + gst_mf_video_encoder_finish_sample (self, sample); + GST_VIDEO_ENCODER_STREAM_UNLOCK (self); + + return S_OK; +} + +typedef struct +{ + guint profile; + const gchar *profile_str; +} GstMFVideoEncoderProfileMap; + +static void +gst_mf_video_encoder_enum_internal (GstMFTransform * transform, GUID & subtype, + GstObject * d3d11_device, GstMFVideoEncoderDeviceCaps * device_caps, + GstCaps ** sink_template, GstCaps ** src_template) +{ + HRESULT hr; + MFT_REGISTER_TYPE_INFO *infos; + UINT32 info_size; + gint i; + GstCaps *src_caps = nullptr; + GstCaps *sink_caps = nullptr; + GstCaps *d3d11_caps = nullptr; + GValue *supported_formats = nullptr; + GValue *profiles = nullptr; + gboolean have_I420 = FALSE; + gboolean have_NV12 = FALSE; + gboolean have_P010 = FALSE; +#if GST_MF_HAVE_D3D11 + gboolean d3d11_aware = FALSE; +#endif + gchar *device_name = nullptr; + IMFActivate *activate; + IMFTransform *encoder; + ICodecAPI *codec_api; + ComPtr < IMFMediaType > out_type; + GstMFVideoEncoderProfileMap h264_profile_map = { + {eAVEncH264VProfile_High, "high"}, + {eAVEncH264VProfile_Main, "main"}, + {eAVEncH264VProfile_Base, "baseline"}, + {0, nullptr}, + }; + GstMFVideoEncoderProfileMap hevc_profile_map = { + {eAVEncH265VProfile_Main_420_8, "main"}, + {eAVEncH265VProfile_Main_420_10, "main-10"}, + {0, nullptr}, + }; + GstMFVideoEncoderProfileMap *profile_to_check = nullptr; + static const gchar *h264_caps_str = + "video/x-h264, stream-format=(string) byte-stream, alignment=(string) au"; + static const gchar *hevc_caps_str = + "video/x-h265, stream-format=(string) byte-stream, alignment=(string) au"; + static const gchar *vp9_caps_str = "video/x-vp9"; + const gchar *codec_caps_str = nullptr; + + /* NOTE: depending on environment, + * some enumerated h/w MFT might not be usable (e.g., multiple GPU case) */ + if (!gst_mf_transform_open (transform)) + return; + + activate = gst_mf_transform_get_activate_handle (transform); + if (!activate) { + GST_WARNING_OBJECT (transform, "No IMFActivate interface available"); + return; + } + + encoder = gst_mf_transform_get_transform_handle (transform); + if (!encoder) { + GST_WARNING_OBJECT (transform, "No IMFTransform interface available"); + return; + } + + codec_api = gst_mf_transform_get_codec_api_handle (transform); + if (!codec_api) { + GST_WARNING_OBJECT (transform, "No ICodecAPI interface available"); + return; + } + + g_object_get (transform, "device-name", &device_name, nullptr); + if (!device_name) { + GST_WARNING_OBJECT (transform, "Unknown device name"); + return; + } + g_free (device_name); + + hr = activate->GetAllocatedBlob (MFT_INPUT_TYPES_Attributes, + (UINT8 **) & infos, &info_size); + if (!gst_mf_result (hr)) + return; + + for (i = 0; i < info_size / sizeof (MFT_REGISTER_TYPE_INFO); i++) { + GstVideoFormat format; + const GstVideoFormatInfo *format_info; + GValue val = G_VALUE_INIT; + + format = gst_mf_video_subtype_to_video_format (&infosi.guidSubtype); + if (format == GST_VIDEO_FORMAT_UNKNOWN) + continue; + + format_info = gst_video_format_get_info (format); + if (GST_VIDEO_FORMAT_INFO_IS_RGB (format_info)) { + GST_DEBUG_OBJECT (transform, "Skip %s format", + GST_VIDEO_FORMAT_INFO_NAME (format_info)); + continue; + } + + if (!supported_formats) { + supported_formats = g_new0 (GValue, 1); + g_value_init (supported_formats, GST_TYPE_LIST); + } + + switch (format) { + /* media foundation has duplicated formats IYUV and I420 */ + case GST_VIDEO_FORMAT_I420: + if (have_I420) + continue; + + have_I420 = TRUE; + break; + case GST_VIDEO_FORMAT_NV12: + have_NV12 = TRUE; + break; + case GST_VIDEO_FORMAT_P010_10LE: + have_P010 = TRUE; + break; + default: + break; + } + + g_value_init (&val, G_TYPE_STRING); + g_value_set_static_string (&val, gst_video_format_to_string (format)); + gst_value_list_append_and_take_value (supported_formats, &val); + } + CoTaskMemFree (infos); + + if (!supported_formats) { + GST_WARNING_OBJECT (transform, "Couldn't figure out supported format"); + return; + } + + if (IsEqualGUID (MFVideoFormat_H264, subtype)) { + profile_to_check = h264_profile_map; + codec_caps_str = h264_caps_str; + } else if (IsEqualGUID (MFVideoFormat_HEVC, subtype)) { + profile_to_check = hevc_profile_map; + codec_caps_str = hevc_caps_str; + } else if (IsEqualGUID (MFVideoFormat_VP90, subtype)) { + codec_caps_str = vp9_caps_str; + } else { + g_assert_not_reached (); + return; + } + + if (profile_to_check) { + hr = MFCreateMediaType (&out_type); + if (!gst_mf_result (hr)) + return; + + hr = out_type->SetGUID (MF_MT_MAJOR_TYPE, MFMediaType_Video); + if (!gst_mf_result (hr)) + return; + + hr = out_type->SetGUID (MF_MT_SUBTYPE, subtype); + if (!gst_mf_result (hr)) + return; + + hr = out_type->SetUINT32 (MF_MT_AVG_BITRATE, 2048000); + if (!gst_mf_result (hr)) + return; + + hr = MFSetAttributeRatio (out_type.Get (), MF_MT_FRAME_RATE, 30, 1); + if (!gst_mf_result (hr)) + return; + + hr = out_type->SetUINT32 (MF_MT_INTERLACE_MODE, + MFVideoInterlace_Progressive); + if (!gst_mf_result (hr)) + return; + + hr = MFSetAttributeSize (out_type.Get (), MF_MT_FRAME_SIZE, 1920, 1080); + if (!gst_mf_result (hr)) + return; + + i = 0; + do { + GValue profile_val = G_VALUE_INIT; + guint mf_profile = profile_to_checki.profile; + const gchar *profile_str = profile_to_checki.profile_str; + + i++; + + if (mf_profile == 0) + break; + + g_assert (profile_str != nullptr); + + hr = out_type->SetUINT32 (MF_MT_MPEG2_PROFILE, mf_profile); + if (!gst_mf_result (hr)) + return; + + if (!gst_mf_transform_set_output_type (transform, out_type.Get ())) + continue; + + if (!profiles) { + profiles = g_new0 (GValue, 1); + g_value_init (profiles, GST_TYPE_LIST); + } + + /* Add "constrained-baseline" in addition to "baseline" */ + if (profile_str == "baseline") { + g_value_init (&profile_val, G_TYPE_STRING); + g_value_set_static_string (&profile_val, "constrained-baseline"); + gst_value_list_append_and_take_value (profiles, &profile_val); + } + + g_value_init (&profile_val, G_TYPE_STRING); + g_value_set_static_string (&profile_val, profile_str); + gst_value_list_append_and_take_value (profiles, &profile_val); + } while (1); + + if (!profiles) { + GST_WARNING_OBJECT (transform, "Couldn't query supported profile"); + return; + } + } + + src_caps = gst_caps_from_string (codec_caps_str); + if (profiles) { + gst_caps_set_value (src_caps, "profile", profiles); + g_value_unset (profiles); + g_free (profiles); + } + + sink_caps = gst_caps_new_empty_simple ("video/x-raw"); + /* FIXME: don't hardcode max resolution, but MF doesn't provide + * API for querying supported max resolution... */ + gst_caps_set_simple (sink_caps, + "width", GST_TYPE_INT_RANGE, 64, 8192, + "height", GST_TYPE_INT_RANGE, 64, 8192, nullptr); + gst_caps_set_simple (src_caps, + "width", GST_TYPE_INT_RANGE, 64, 8192, + "height", GST_TYPE_INT_RANGE, 64, 8192, nullptr); + +#if GST_MF_HAVE_D3D11 + /* Check whether this MFT can support D3D11 */ + if (d3d11_device && (have_NV12 || have_P010)) { + g_object_get (transform, "d3d11-aware", &d3d11_aware, nullptr); + GST_DEBUG_OBJECT (transform, "d3d11 aware %d", d3d11_aware); + } + + if (d3d11_device && (have_NV12 || have_P010) && d3d11_aware) { + gint64 adapter_luid = 0; + GValue d3d11_formats = G_VALUE_INIT; + + g_object_get (d3d11_device, "adapter-luid", &adapter_luid, nullptr); + + d3d11_caps = gst_caps_copy (sink_caps); + + g_value_init (&d3d11_formats, GST_TYPE_LIST); + if (have_NV12) { + GValue val = G_VALUE_INIT; + g_value_init (&val, G_TYPE_STRING); + g_value_set_static_string (&val, "NV12"); + gst_value_list_append_and_take_value (&d3d11_formats, &val); + } + + if (have_P010) { + GValue val = G_VALUE_INIT; + g_value_init (&val, G_TYPE_STRING); + g_value_set_static_string (&val, "P010_10LE"); + gst_value_list_append_and_take_value (&d3d11_formats, &val); + } + + gst_caps_set_value (d3d11_caps, "format", &d3d11_formats); + g_value_unset (&d3d11_formats); + gst_caps_set_features_simple (d3d11_caps, + gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)); + device_caps->d3d11_aware = TRUE; + device_caps->adapter_luid = adapter_luid; + } +#endif + + gst_caps_set_value (sink_caps, "format", supported_formats); + g_value_unset (supported_formats); + g_free (supported_formats); + + if (d3d11_caps) + gst_caps_append (sink_caps, d3d11_caps); + + *sink_template = sink_caps; + *src_template = src_caps; + +#define CHECK_DEVICE_CAPS(codec_obj,api,val) \ + if (SUCCEEDED((codec_obj)->IsSupported(&(api)))) {\ + (device_caps)->val = TRUE; \ + } + + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncCommonRateControlMode, rc_mode); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncCommonQuality, quality); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncAdaptiveMode, adaptive_mode); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncCommonBufferSize, buffer_size); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncCommonMeanBitRate, mean_bitrate); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncCommonMaxBitRate, max_bitrate); + CHECK_DEVICE_CAPS (codec_api, + CODECAPI_AVEncCommonQualityVsSpeed, quality_vs_speed); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncH264CABACEnable, cabac); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncH264SPSID, sps_id); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncH264PPSID, pps_id); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncMPVDefaultBPictureCount, bframes); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncMPVGOPSize, gop_size); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncNumWorkerThreads, threads); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncVideoContentType, content_type); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncVideoEncodeQP, qp); + CHECK_DEVICE_CAPS (codec_api, + CODECAPI_AVEncVideoForceKeyFrame, force_keyframe); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVLowLatencyMode, low_latency); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncVideoMinQP, min_qp); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncVideoMaxQP, max_qp); + CHECK_DEVICE_CAPS (codec_api, + CODECAPI_AVEncVideoEncodeFrameTypeQP, frame_type_qp); + CHECK_DEVICE_CAPS (codec_api, CODECAPI_AVEncVideoMaxNumRefFrame, max_num_ref); + if (device_caps->max_num_ref) { + VARIANT min; + VARIANT max; + VARIANT step; + + hr = codec_api->GetParameterRange (&CODECAPI_AVEncVideoMaxNumRefFrame, + &min, &max, &step); + if (SUCCEEDED (hr)) { + device_caps->max_num_ref_high = max.uiVal; + device_caps->max_num_ref_low = min.uiVal; + VariantClear (&min); + VariantClear (&max); + VariantClear (&step); + } else { + device_caps->max_num_ref = FALSE; + } + } +#undef CHECK_DEVICE_CAPS + + return; +} + +static GstMFTransform * +gst_mf_video_encoder_enum (guint enum_flags, GUID * subtype, guint device_index, + GstMFVideoEncoderDeviceCaps * device_caps, GstObject * d3d11_device, + GstCaps ** sink_template, GstCaps ** src_template) +{ + GstMFTransformEnumParams enum_params = { 0, }; + MFT_REGISTER_TYPE_INFO output_type; + GstMFTransform *transform; + gint64 adapter_luid = 0; + + *sink_template = nullptr; + *src_template = nullptr; + memset (device_caps, 0, sizeof (GstMFVideoEncoderDeviceCaps)); + + if (!IsEqualGUID (MFVideoFormat_H264, *subtype) && + !IsEqualGUID (MFVideoFormat_HEVC, *subtype) && + !IsEqualGUID (MFVideoFormat_VP90, *subtype)) { + GST_ERROR ("Unknown subtype GUID"); + + return nullptr; + } + + if (d3d11_device) { + g_object_get (d3d11_device, "adapter-luid", &adapter_luid, nullptr); + if (!adapter_luid) { + GST_ERROR ("Couldn't get adapter LUID"); + return nullptr; + } + } + + output_type.guidMajorType = MFMediaType_Video; + output_type.guidSubtype = *subtype; + + enum_params.category = MFT_CATEGORY_VIDEO_ENCODER; + enum_params.output_typeinfo = &output_type; + enum_params.device_index = device_index; + enum_params.enum_flags = enum_flags; + enum_params.adapter_luid = adapter_luid; + + transform = gst_mf_transform_new (&enum_params); + if (!transform) + return nullptr; + + gst_mf_video_encoder_enum_internal (transform, output_type.guidSubtype, + d3d11_device, device_caps, sink_template, src_template); + + return transform; +} + +static void +gst_mf_video_encoder_register_internal (GstPlugin * plugin, guint rank, + GUID * subtype, GTypeInfo * type_info, + const GstMFVideoEncoderDeviceCaps * device_caps, + guint32 enum_flags, guint device_index, GstMFTransform * transform, + GstCaps * sink_caps, GstCaps * src_caps) +{ + GType type; + GTypeInfo local_type_info; + gchar *type_name; + gchar *feature_name; + gint i; + GstMFVideoEncoderClassData *cdata; + gboolean is_default = TRUE; + gchar *device_name = nullptr; + const gchar *type_name_prefix = nullptr; + const gchar *feature_name_prefix = nullptr; + + if (IsEqualGUID (MFVideoFormat_H264, *subtype)) { + type_name_prefix = "H264"; + feature_name_prefix = "h264"; + } else if (IsEqualGUID (MFVideoFormat_HEVC, *subtype)) { + type_name_prefix = "H265"; + feature_name_prefix = "h265"; + } else if (IsEqualGUID (MFVideoFormat_VP90, *subtype)) { + type_name_prefix = "VP9"; + feature_name_prefix = "vp9"; + } else { + g_assert_not_reached (); + return; + } + + /* Must be checked already */ + g_object_get (transform, "device-name", &device_name, nullptr); + g_assert (device_name != nullptr); + + cdata = g_new0 (GstMFVideoEncoderClassData, 1); + cdata->sink_caps = gst_caps_copy (sink_caps); + cdata->src_caps = gst_caps_copy (src_caps); + cdata->device_name = device_name; + cdata->device_caps = *device_caps; + cdata->enum_flags = enum_flags; + cdata->device_index = device_index; + + local_type_info = *type_info; + local_type_info.class_data = cdata; + + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + type_name = g_strdup_printf ("GstMF%sEnc", type_name_prefix); + feature_name = g_strdup_printf ("mf%senc", feature_name_prefix); + + i = 1; + while (g_type_from_name (type_name) != 0) { + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstMF%sDevice%dEnc", type_name_prefix, i); + feature_name = g_strdup_printf ("mf%sdevice%denc", feature_name_prefix, i); + is_default = FALSE; + i++; + } + + cdata->is_default = is_default; + + type = + g_type_register_static (GST_TYPE_MF_VIDEO_ENCODER, type_name, + &local_type_info, (GTypeFlags) 0); + + /* make lower rank than default device */ + if (rank > 0 && !is_default) + rank--; + + if (!is_default || !device_caps->d3d11_aware) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +} + +void +gst_mf_video_encoder_register (GstPlugin * plugin, guint rank, GUID * subtype, + GTypeInfo * type_info, GList * d3d11_device) +{ + GstMFTransform *transform = nullptr; + GstCaps *sink_template = nullptr; + GstCaps *src_template = nullptr; + guint enum_flags; + GstMFVideoEncoderDeviceCaps device_caps; + guint i; + + /* register hardware encoders first */ + enum_flags = (MFT_ENUM_FLAG_HARDWARE | MFT_ENUM_FLAG_ASYNCMFT | + MFT_ENUM_FLAG_SORTANDFILTER_APPROVED_ONLY); + + if (d3d11_device) { + GList *iter; + for (iter = d3d11_device; iter; iter = g_list_next (iter)) { + GstObject *device = (GstObject *) iter->data; + + transform = + gst_mf_video_encoder_enum (enum_flags, subtype, 0, &device_caps, + device, &sink_template, &src_template); + + if (!transform) + continue; + + /* Failed to open MFT */ + if (!sink_template) { + gst_clear_object (&transform); + continue; + } + + gst_mf_video_encoder_register_internal (plugin, rank, subtype, type_info, + &device_caps, enum_flags, 0, transform, sink_template, src_template); + gst_clear_object (&transform); + gst_clear_caps (&sink_template); + gst_clear_caps (&src_template); + } + } else { + /* AMD seems to be able to support up to 12 GPUs */ + for (i = 0; i < 12; i++) { + transform = + gst_mf_video_encoder_enum (enum_flags, subtype, i, &device_caps, + nullptr, &sink_template, &src_template); + + /* No more MFT to enumerate */ + if (!transform) + break; + + /* Failed to open MFT */ + if (!sink_template) { + gst_clear_object (&transform); + continue; + } + + gst_mf_video_encoder_register_internal (plugin, rank, subtype, type_info, + &device_caps, enum_flags, i, transform, sink_template, src_template); + gst_clear_object (&transform); + gst_clear_caps (&sink_template); + gst_clear_caps (&src_template); + } + } + + /* register software encoders */ + enum_flags = (MFT_ENUM_FLAG_SYNCMFT | + MFT_ENUM_FLAG_SORTANDFILTER_APPROVED_ONLY); + + transform = gst_mf_video_encoder_enum (enum_flags, subtype, 0, &device_caps, + nullptr, &sink_template, &src_template); + + if (!transform) + goto done; + + if (!sink_template) + goto done; + + gst_mf_video_encoder_register_internal (plugin, rank, subtype, type_info, + &device_caps, enum_flags, 0, transform, sink_template, src_template); + +done: + gst_clear_object (&transform); + gst_clear_caps (&sink_template); + gst_clear_caps (&src_template); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfvideoencoder.h
Added
@@ -0,0 +1,152 @@ +/* GStreamer + * Copyright (C) 2020 Seungha Yang <seungha.yang@navercorp.com> + * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "gstmfconfig.h" + +#include <gst/gst.h> +#include <gst/video/video.h> +#include "gstmfutils.h" +#include "gstmftransform.h" + +#if GST_MF_HAVE_D3D11 +#include <gst/d3d11/gstd3d11.h> +#endif + +G_BEGIN_DECLS + +#define GST_TYPE_MF_VIDEO_ENCODER (gst_mf_video_encoder_get_type()) +#define GST_MF_VIDEO_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MF_VIDEO_ENCODER,GstMFVideoEncoder)) +#define GST_MF_VIDEO_ENCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_MF_VIDEO_ENCODER,GstMFVideoEncoderClass)) +#define GST_MF_VIDEO_ENCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_MF_VIDEO_ENCODER,GstMFVideoEncoderClass)) +#define GST_IS_MF_VIDEO_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MF_VIDEO_ENCODER)) +#define GST_IS_MF_VIDEO_ENCODER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_MF_VIDEO_ENCODER)) + +typedef struct _GstMFVideoEncoder GstMFVideoEncoder; +typedef struct _GstMFVideoEncoderClass GstMFVideoEncoderClass; +typedef struct _GstMFVideoEncoderDeviceCaps GstMFVideoEncoderDeviceCaps; +typedef struct _GstMFVideoEncoderClassData GstMFVideoEncoderClassData; + +struct _GstMFVideoEncoderDeviceCaps +{ + gboolean rc_mode; /* AVEncCommonRateControlMode */ + gboolean quality; /* AVEncCommonQuality */ + + gboolean adaptive_mode; /* AVEncAdaptiveMode */ + gboolean buffer_size; /* AVEncCommonBufferSize */ + gboolean mean_bitrate; /* AVEncCommonMeanBitRate */ + gboolean max_bitrate; /* AVEncCommonMaxBitRate */ + gboolean quality_vs_speed; /* AVEncCommonQualityVsSpeed */ + gboolean cabac; /* AVEncH264CABACEnable */ + gboolean sps_id; /* AVEncH264SPSID */ + gboolean pps_id; /* AVEncH264PPSID */ + gboolean bframes; /* AVEncMPVDefaultBPictureCount */ + gboolean gop_size; /* AVEncMPVGOPSize */ + gboolean threads; /* AVEncNumWorkerThreads */ + gboolean content_type; /* AVEncVideoContentType */ + gboolean qp; /* AVEncVideoEncodeQP */ + gboolean force_keyframe; /* AVEncVideoForceKeyFrame */ + gboolean low_latency; /* AVLowLatencyMode */ + + gboolean min_qp; /* AVEncVideoMinQP */ + gboolean max_qp; /* AVEncVideoMaxQP */ + gboolean frame_type_qp; /* AVEncVideoEncodeFrameTypeQP */ + gboolean max_num_ref; /* AVEncVideoMaxNumRefFrame */ + guint max_num_ref_high; + guint max_num_ref_low; + + /* TRUE if MFT support d3d11 and also we can use d3d11 interop */ + gboolean d3d11_aware; + /* DXGI adapter LUID, valid only when d3d11_aware == TRUE */ + gint64 adapter_luid; +}; + +struct _GstMFVideoEncoderClassData +{ + GstCaps *sink_caps; + GstCaps *src_caps; + gchar *device_name; + guint32 enum_flags; + guint device_index; + GstMFVideoEncoderDeviceCaps device_caps; + gboolean is_default; +}; + +struct _GstMFVideoEncoder +{ + GstVideoEncoder parent; + + GstMFTransform *transform; + gboolean async_mft; + GstFlowReturn last_ret; + + GstVideoCodecState *input_state; + + /* Set by subclass */ + gboolean has_reorder_frame; + + /* Calculated timestamp offset in MF timescale (100ns scale) + * when B-frame is enabled. */ + LONGLONG mf_pts_offset; + + gboolean need_align; + +#if GST_MF_HAVE_D3D11 + /* For D3D11 interop. */ + GstD3D11Device *other_d3d11_device; + GstD3D11Device *d3d11_device; + IMFDXGIDeviceManager *device_manager; + UINT reset_token; + IMFVideoSampleAllocatorEx *mf_allocator; + GstD3D11Fence *fence; +#endif +}; + +struct _GstMFVideoEncoderClass +{ + GstVideoEncoderClass parent_class; + + /* Set by subclass */ + GUID codec_id; /* Output subtype of MFT */ + guint32 enum_flags; /* MFT_ENUM_FLAG */ + guint device_index; /* Index of enumerated IMFActivate via MFTEnum */ + GstMFVideoEncoderDeviceCaps device_caps; + + gboolean (*set_option) (GstMFVideoEncoder * encoder, + GstVideoCodecState * state, + IMFMediaType * output_type); + + gboolean (*set_src_caps) (GstMFVideoEncoder * encoder, + GstVideoCodecState * state, + IMFMediaType * output_type); + + gboolean (*check_reconfigure) (GstMFVideoEncoder * encoder); +}; + +GType gst_mf_video_encoder_get_type (void); + +void gst_mf_video_encoder_register (GstPlugin * plugin, + guint rank, + GUID * subtype, + GTypeInfo * type_info, + GList * d3d11_device); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfvideosrc.cpp
Added
@@ -0,0 +1,515 @@ +/* GStreamer + * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> + * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-mfvideosrc + * @title: mfvideosrc + * + * Provides video capture from the Microsoft Media Foundation API. + * + * ## Example pipelines + * | + * gst-launch-1.0 -v mfvideosrc ! fakesink + * | Capture from the default video capture device and render to fakesink. + * + * | + * gst-launch-1.0 -v mfvideosrc device-index=1 ! fakesink + * | Capture from the second video device (if available) and render to fakesink. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstmfconfig.h" + +#include "gstmfvideosrc.h" +#include "gstmfutils.h" +#include "gstmfsourceobject.h" +#include <string.h> + +#if GST_MF_WINAPI_DESKTOP +#include "gstmfcapturedshow.h" +#endif + +GST_DEBUG_CATEGORY (gst_mf_video_src_debug); +#define GST_CAT_DEFAULT gst_mf_video_src_debug + +#if (GST_MF_WINAPI_APP && !GST_MF_WINAPI_DESKTOP) +/* FIXME: need support JPEG for UWP */ +#define SRC_TEMPLATE_CAPS \ + GST_VIDEO_CAPS_MAKE (GST_MF_VIDEO_FORMATS) +#else +#define SRC_TEMPLATE_CAPS \ + GST_VIDEO_CAPS_MAKE (GST_MF_VIDEO_FORMATS) "; " \ + "image/jpeg, width = " GST_VIDEO_SIZE_RANGE ", " \ + "height = " GST_VIDEO_SIZE_RANGE ", " \ + "framerate = " GST_VIDEO_FPS_RANGE +#endif + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (SRC_TEMPLATE_CAPS)); + +struct _GstMFVideoSrc +{ + GstPushSrc parent; + + GstMFSourceObject *source; + gboolean started; + GstVideoInfo info; + + guint64 n_frames; + GstClockTime latency; + + gboolean use_dshow; + + /* properties */ + gchar *device_path; + gchar *device_name; + gint device_index; + gpointer dispatcher; +}; + +enum +{ + PROP_0, + PROP_DEVICE_PATH, + PROP_DEVICE_NAME, + PROP_DEVICE_INDEX, + PROP_DISPATCHER, +}; + +#define DEFAULT_DEVICE_PATH nullptr +#define DEFAULT_DEVICE_NAME nullptr +#define DEFAULT_DEVICE_INDEX -1 + +static void gst_mf_video_src_finalize (GObject * object); +static void gst_mf_video_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_mf_video_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); + +static gboolean gst_mf_video_src_start (GstBaseSrc * src); +static gboolean gst_mf_video_src_stop (GstBaseSrc * src); +static gboolean gst_mf_video_src_set_caps (GstBaseSrc * src, GstCaps * caps); +static GstCaps *gst_mf_video_src_get_caps (GstBaseSrc * src, GstCaps * filter); +static GstCaps *gst_mf_video_src_fixate (GstBaseSrc * src, GstCaps * caps); +static gboolean gst_mf_video_src_unlock (GstBaseSrc * src); +static gboolean gst_mf_video_src_unlock_stop (GstBaseSrc * src); +static gboolean gst_mf_video_src_query (GstBaseSrc * src, GstQuery * query); + +static GstFlowReturn gst_mf_video_src_create (GstPushSrc * pushsrc, + GstBuffer ** buffer); + +#define gst_mf_video_src_parent_class parent_class +G_DEFINE_TYPE (GstMFVideoSrc, gst_mf_video_src, GST_TYPE_PUSH_SRC); + +static void +gst_mf_video_src_class_init (GstMFVideoSrcClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstBaseSrcClass *basesrc_class = GST_BASE_SRC_CLASS (klass); + GstPushSrcClass *pushsrc_class = GST_PUSH_SRC_CLASS (klass); + GParamFlags flags = (GParamFlags) (G_PARAM_READWRITE | + GST_PARAM_MUTABLE_READY | G_PARAM_STATIC_STRINGS); + + gobject_class->finalize = gst_mf_video_src_finalize; + gobject_class->get_property = gst_mf_video_src_get_property; + gobject_class->set_property = gst_mf_video_src_set_property; + + g_object_class_install_property (gobject_class, PROP_DEVICE_PATH, + g_param_spec_string ("device-path", "Device Path", + "The device path", DEFAULT_DEVICE_PATH, flags)); + g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Device Name", + "The human-readable device name", DEFAULT_DEVICE_NAME, flags)); + g_object_class_install_property (gobject_class, PROP_DEVICE_INDEX, + g_param_spec_int ("device-index", "Device Index", + "The zero-based device index", -1, G_MAXINT, DEFAULT_DEVICE_INDEX, + flags)); +#if GST_MF_WINAPI_APP + /** + * GstMFVideoSrc:dispatcher: + * + * ICoreDispatcher COM object used for activating device from UI thread. + * + * Since: 1.18 + */ + g_object_class_install_property (gobject_class, PROP_DISPATCHER, + g_param_spec_pointer ("dispatcher", "Dispatcher", + "ICoreDispatcher COM object to use. In order for application to ask " + "permission of capture device, device activation should be running " + "on UI thread via ICoreDispatcher. This element will increase " + "the reference count of given ICoreDispatcher and release it after " + "use. Therefore, caller does not need to consider additional " + "reference count management", + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + GST_PARAM_MUTABLE_READY | G_PARAM_WRITABLE | + G_PARAM_STATIC_STRINGS))); +#endif + + gst_element_class_set_static_metadata (element_class, + "Media Foundation Video Source", + "Source/Video/Hardware", + "Capture video stream through Windows Media Foundation", + "Seungha Yang <seungha.yang@navercorp.com>"); + + gst_element_class_add_static_pad_template (element_class, &src_template); + + basesrc_class->start = GST_DEBUG_FUNCPTR (gst_mf_video_src_start); + basesrc_class->stop = GST_DEBUG_FUNCPTR (gst_mf_video_src_stop); + basesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_mf_video_src_set_caps); + basesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_mf_video_src_get_caps); + basesrc_class->fixate = GST_DEBUG_FUNCPTR (gst_mf_video_src_fixate); + basesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_mf_video_src_unlock); + basesrc_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_mf_video_src_unlock_stop); + basesrc_class->query = GST_DEBUG_FUNCPTR (gst_mf_video_src_query); + + pushsrc_class->create = GST_DEBUG_FUNCPTR (gst_mf_video_src_create); + + GST_DEBUG_CATEGORY_INIT (gst_mf_video_src_debug, "mfvideosrc", 0, + "mfvideosrc"); +} + +static void +gst_mf_video_src_init (GstMFVideoSrc * self) +{ + gst_base_src_set_format (GST_BASE_SRC (self), GST_FORMAT_TIME); + gst_base_src_set_live (GST_BASE_SRC (self), TRUE); + + self->device_index = DEFAULT_DEVICE_INDEX; +} + +static void +gst_mf_video_src_finalize (GObject * object) +{ + GstMFVideoSrc *self = GST_MF_VIDEO_SRC (object); + + g_free (self->device_name); + g_free (self->device_path); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_mf_video_src_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstMFVideoSrc *self = GST_MF_VIDEO_SRC (object); + + switch (prop_id) { + case PROP_DEVICE_PATH: + g_value_set_string (value, self->device_path); + break; + case PROP_DEVICE_NAME: + g_value_set_string (value, self->device_name); + break; + case PROP_DEVICE_INDEX: + g_value_set_int (value, self->device_index); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_mf_video_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMFVideoSrc *self = GST_MF_VIDEO_SRC (object); + + switch (prop_id) { + case PROP_DEVICE_PATH: + g_free (self->device_path); + self->device_path = g_value_dup_string (value); + break; + case PROP_DEVICE_NAME: + g_free (self->device_name); + self->device_name = g_value_dup_string (value); + break; + case PROP_DEVICE_INDEX: + self->device_index = g_value_get_int (value); + break; +#if GST_MF_WINAPI_APP + case PROP_DISPATCHER: + self->dispatcher = g_value_get_pointer (value); + break; +#endif + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_mf_video_src_start (GstBaseSrc * src) +{ + GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); + + GST_DEBUG_OBJECT (self, "Start"); + + self->source = gst_mf_source_object_new (GST_MF_SOURCE_TYPE_VIDEO, + self->device_index, self->device_name, self->device_path, nullptr); + + self->n_frames = 0; + self->latency = 0; + self->use_dshow = FALSE; + + if (!self->source) { +#if GST_MF_WINAPI_DESKTOP + self->use_dshow = TRUE; + self->source = gst_mf_capture_dshow_new (GST_MF_SOURCE_TYPE_VIDEO, + self->device_index, self->device_name, self->device_path); +#endif + } + + if (!self->source) { + GST_ERROR_OBJECT (self, "Couldn't create capture object"); + return FALSE; + } + + gst_mf_source_object_set_client (self->source, GST_ELEMENT (self)); + + return TRUE; +} + +static gboolean +gst_mf_video_src_stop (GstBaseSrc * src) +{ + GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); + + GST_DEBUG_OBJECT (self, "Stop"); + + if (self->source) { + gst_mf_source_object_stop (self->source); + gst_object_unref (self->source); + self->source = nullptr; + } + + self->started = FALSE; + + return TRUE; +} + +static gboolean +gst_mf_video_src_set_caps (GstBaseSrc * src, GstCaps * caps) +{ + GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); + + GST_DEBUG_OBJECT (self, "Set caps %" GST_PTR_FORMAT, caps); + + if (!self->source) { + GST_ERROR_OBJECT (self, "No capture engine yet"); + return FALSE; + } + + if (!gst_mf_source_object_set_caps (self->source, caps)) { + GST_ERROR_OBJECT (self, "CaptureEngine couldn't accept caps"); + return FALSE; + } + + gst_video_info_from_caps (&self->info, caps); + if (GST_VIDEO_INFO_FORMAT (&self->info) != GST_VIDEO_FORMAT_ENCODED) + gst_base_src_set_blocksize (src, GST_VIDEO_INFO_SIZE (&self->info)); + + return TRUE; +} + +static GstCaps * +gst_mf_video_src_get_caps (GstBaseSrc * src, GstCaps * filter) +{ + GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); + GstCaps *caps = nullptr; + + if (self->source) + caps = gst_mf_source_object_get_caps (self->source); + + if (!caps) + caps = gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD (src)); + + if (filter) { + GstCaps *filtered = + gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (caps); + caps = filtered; + } + + GST_DEBUG_OBJECT (self, "Returning caps %" GST_PTR_FORMAT, caps); + + return caps; +} + +static GstCaps * +gst_mf_video_src_fixate (GstBaseSrc * src, GstCaps * caps) +{ + GstStructure *structure; + GstCaps *fixated_caps; + gint i; + + fixated_caps = gst_caps_make_writable (caps); + + for (i = 0; i < gst_caps_get_size (fixated_caps); ++i) { + structure = gst_caps_get_structure (fixated_caps, i); + gst_structure_fixate_field_nearest_int (structure, "width", G_MAXINT); + gst_structure_fixate_field_nearest_int (structure, "height", G_MAXINT); + gst_structure_fixate_field_nearest_fraction (structure, "framerate", + G_MAXINT, 1); + } + + fixated_caps = gst_caps_fixate (fixated_caps); + + return fixated_caps; +} + +static gboolean +gst_mf_video_src_unlock (GstBaseSrc * src) +{ + GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); + + if (self->source) + gst_mf_source_object_set_flushing (self->source, TRUE); + + return TRUE; +} + +static gboolean +gst_mf_video_src_unlock_stop (GstBaseSrc * src) +{ + GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); + + if (self->source) + gst_mf_source_object_set_flushing (self->source, FALSE); + + return TRUE; +} + +static gboolean +gst_mf_video_src_query (GstBaseSrc * src, GstQuery * query) +{ + GstMFVideoSrc *self = GST_MF_VIDEO_SRC (src); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY: + if (self->started) { + gst_query_set_latency (query, TRUE, 0, self->latency); + + return TRUE; + } + break; + default: + break; + } + + return GST_BASE_SRC_CLASS (parent_class)->query (src, query); +} + +static GstFlowReturn +gst_mf_video_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer) +{ + GstMFVideoSrc *self = GST_MF_VIDEO_SRC (pushsrc); + GstFlowReturn ret = GST_FLOW_OK; + GstBuffer *buf = nullptr; + GstSample *sample = nullptr; + GstClock *clock; + GstClockTime running_time = GST_CLOCK_TIME_NONE; + GstClockTimeDiff diff; + + if (!self->started) { + if (!gst_mf_source_object_start (self->source)) { + GST_ERROR_OBJECT (self, "Failed to start capture object"); + + return GST_FLOW_ERROR; + } + + self->started = TRUE; + } + + if (self->use_dshow) { + ret = gst_mf_source_object_get_sample (self->source, &sample); + } else if (GST_VIDEO_INFO_FORMAT (&self->info) != GST_VIDEO_FORMAT_ENCODED) { + ret = GST_BASE_SRC_CLASS (parent_class)->alloc (GST_BASE_SRC (self), 0, + GST_VIDEO_INFO_SIZE (&self->info), &buf); + + if (ret != GST_FLOW_OK) { + gst_clear_buffer (&buf); + return ret; + } + + ret = gst_mf_source_object_fill (self->source, buf); + } else { + ret = gst_mf_source_object_create (self->source, &buf); + } + + if (ret != GST_FLOW_OK) { + gst_clear_buffer (&buf); + return ret; + } + + /* DirectShow capture object will set caps if it's got updated */ + if (sample) { + if (gst_sample_get_caps (sample)) { + if (!gst_base_src_negotiate (GST_BASE_SRC (self))) { + GST_ERROR_OBJECT (self, "Failed to negotiate with new caps"); + gst_sample_unref (sample); + return GST_FLOW_NOT_NEGOTIATED; + } else { + GST_DEBUG_OBJECT (self, "Renegotiated"); + } + } + + buf = gst_sample_get_buffer (sample); + gst_buffer_ref (buf); + gst_sample_unref (sample); + } + + GST_BUFFER_OFFSET (buf) = self->n_frames; + GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET (buf) + 1; + self->n_frames++; + + GST_LOG_OBJECT (self, + "Captured buffer timestamp %" GST_TIME_FORMAT ", duration %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (buf))); + + /* Update latency */ + clock = gst_element_get_clock (GST_ELEMENT_CAST (self)); + if (clock) { + GstClockTime now; + + now = gst_clock_get_time (clock); + running_time = now - GST_ELEMENT_CAST (self)->base_time; + gst_object_unref (clock); + } + + diff = GST_CLOCK_DIFF (GST_BUFFER_PTS (buf), running_time); + if (diff > self->latency) { + self->latency = (GstClockTime) diff; + GST_DEBUG_OBJECT (self, "Updated latency value %" GST_TIME_FORMAT, + GST_TIME_ARGS (self->latency)); + } + + *buffer = buf; + + return GST_FLOW_OK; +}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstmfvp9enc.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstmfvp9enc.cpp
Changed
@@ -35,7 +35,7 @@ #endif #include <gst/gst.h> -#include "gstmfvideoenc.h" +#include "gstmfvideoencoder.h" #include "gstmfvp9enc.h" #include <wrl.h> @@ -52,6 +52,11 @@ GST_MF_VP9_ENC_RC_MODE_QUALITY, }; +/** + * GstMFVP9EncRCMode: + * + * Since: 1.22 + */ #define GST_TYPE_MF_VP9_ENC_RC_MODE (gst_mf_vp9_enc_rc_mode_get_type()) static GType gst_mf_vp9_enc_rc_mode_get_type (void) @@ -61,7 +66,7 @@ static const GEnumValue rc_mode_types = { {GST_MF_VP9_ENC_RC_MODE_CBR, "Constant bitrate", "cbr"}, {GST_MF_VP9_ENC_RC_MODE_QUALITY, "Quality-based variable bitrate", "qvbr"}, - {0, NULL, NULL} + {0, nullptr, nullptr} }; if (!rc_mode_type) { @@ -76,6 +81,11 @@ GST_MF_VP9_ENC_CONTENT_TYPE_FIXED_CAMERA_ANGLE, }; +/** + * GstMFVP9EncContentType: + * + * Since: 1.22 + */ #define GST_TYPE_MF_VP9_ENC_CONTENT_TYPE (gst_mf_vp9_enc_content_type_get_type()) static GType gst_mf_vp9_enc_content_type_get_type (void) @@ -86,7 +96,7 @@ {GST_MF_VP9_ENC_CONTENT_TYPE_UNKNOWN, "Unknown", "unknown"}, {GST_MF_VP9_ENC_CONTENT_TYPE_FIXED_CAMERA_ANGLE, "Fixed Camera Angle, such as a webcam", "fixed"}, - {0, NULL, NULL} + {0, nullptr, nullptr} }; if (!content_type) { @@ -120,9 +130,24 @@ #define DEFAULT_CONTENT_TYPE GST_MF_VP9_ENC_CONTENT_TYPE_UNKNOWN #define DEFAULT_LOW_LATENCY FALSE +#define DOC_SINK_CAPS_COMM \ + "format = (string) NV12, " \ + "width = (int) 64, 8192 , height = (int) 64, 8192 " + +#define DOC_SINK_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw, " DOC_SINK_CAPS_COMM + +#define DOC_SRC_CAPS \ + "video/x-vp9, width = (int) 64, 8192 , height = (int) 64, 8192 " + typedef struct _GstMFVP9Enc { - GstMFVideoEnc parent; + GstMFVideoEncoder parent; + + GMutex prop_lock; + + gboolean prop_updated; /* properties */ guint bitrate; @@ -131,7 +156,7 @@ guint rc_mode; guint max_bitrate; guint quality_vs_speed; - guint gop_size; + gint gop_size; guint threads; guint content_type; gboolean low_latency; @@ -139,33 +164,38 @@ typedef struct _GstMFVP9EncClass { - GstMFVideoEncClass parent_class; + GstMFVideoEncoderClass parent_class; } GstMFVP9EncClass; -static GstElementClass *parent_class = NULL; +static GstElementClass *parent_class = nullptr; +static void gst_mf_vp9_enc_finalize (GObject * object); static void gst_mf_vp9_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_mf_vp9_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static gboolean gst_mf_vp9_enc_set_option (GstMFVideoEnc * mfenc, +static gboolean gst_mf_vp9_enc_set_option (GstMFVideoEncoder * encoder, GstVideoCodecState * state, IMFMediaType * output_type); -static gboolean gst_mf_vp9_enc_set_src_caps (GstMFVideoEnc * mfenc, +static gboolean gst_mf_vp9_enc_set_src_caps (GstMFVideoEncoder * encoder, GstVideoCodecState * state, IMFMediaType * output_type); +static gboolean gst_mf_vp9_enc_check_reconfigure (GstMFVideoEncoder * encoder); static void gst_mf_vp9_enc_class_init (GstMFVP9EncClass * klass, gpointer data) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstMFVideoEncClass *mfenc_class = GST_MF_VIDEO_ENC_CLASS (klass); - GstMFVideoEncClassData *cdata = (GstMFVideoEncClassData *) data; - GstMFVideoEncDeviceCaps *device_caps = &cdata->device_caps; + GstMFVideoEncoderClass *encoder_class = GST_MF_VIDEO_ENCODER_CLASS (klass); + GstMFVideoEncoderClassData *cdata = (GstMFVideoEncoderClassData *) data; + GstMFVideoEncoderDeviceCaps *device_caps = &cdata->device_caps; gchar *long_name; gchar *classification; + GstPadTemplate *pad_templ; + GstCaps *doc_caps; parent_class = (GstElementClass *) g_type_class_peek_parent (klass); + gobject_class->finalize = gst_mf_vp9_enc_finalize; gobject_class->get_property = gst_mf_vp9_enc_get_property; gobject_class->set_property = gst_mf_vp9_enc_set_property; @@ -175,6 +205,11 @@ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); if (device_caps->rc_mode) { + /** + * GstMFVP9Enc:rc-mode: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_RC_MODE, g_param_spec_enum ("rc-mode", "Rate Control Mode", "Rate Control Mode", @@ -190,6 +225,11 @@ } if (device_caps->max_bitrate) { + /** + * GstMFVP9Enc:max-bitrate: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_MAX_BITRATE, g_param_spec_uint ("max-bitrate", "Max Bitrate", "The maximum bitrate applied when rc-mode is \"pcvbr\" in kbit/sec " @@ -200,6 +240,11 @@ } if (device_caps->quality_vs_speed) { + /** + * GstMFVP9Enc:quality-vs-speed: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_QUALITY_VS_SPEED, g_param_spec_uint ("quality-vs-speed", "Quality Vs Speed", "Quality and speed tradeoff, 0, 33: Low complexity, " @@ -210,6 +255,11 @@ } if (device_caps->gop_size) { + /** + * GstMFVP9Enc:gop-size: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_GOP_SIZE, g_param_spec_int ("gop-size", "GOP size", "The number of pictures from one GOP header to the next. " @@ -221,6 +271,11 @@ } if (device_caps->threads) { + /** + * GstMFVP9Enc:threads: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_THREADS, g_param_spec_uint ("threads", "Threads", "The number of worker threads used by a encoder, " @@ -231,6 +286,11 @@ } if (device_caps->content_type) { + /** + * GstMFVP9Enc:content-type: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_CONTENT_TYPE, g_param_spec_enum ("content-type", "Content Type", "Indicates the type of video content", @@ -246,6 +306,11 @@ } if (device_caps->low_latency) { + /** + * GstMFVP9Enc:low-latency: + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_LOW_LATENCY, g_param_spec_boolean ("low-latency", "Low Latency", "Enable low latency encoding", @@ -278,8 +343,9 @@ g_object_class_install_property (gobject_class, PROP_ADAPTER_LUID, g_param_spec_int64 ("adapter-luid", "Adapter LUID", "DXGI Adapter LUID (Locally Unique Identifier) of created device", - G_MININT64, G_MAXINT64, device_caps->adapter_luid, - (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_MININT64, G_MAXINT64, 0, + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); } @@ -294,20 +360,29 @@ g_free (long_name); g_free (classification); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); - - mfenc_class->set_option = GST_DEBUG_FUNCPTR (gst_mf_vp9_enc_set_option); - mfenc_class->set_src_caps = GST_DEBUG_FUNCPTR (gst_mf_vp9_enc_set_src_caps); - - mfenc_class->codec_id = MFVideoFormat_VP90; - mfenc_class->enum_flags = cdata->enum_flags; - mfenc_class->device_index = cdata->device_index; - mfenc_class->device_caps = *device_caps; + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + encoder_class->set_option = GST_DEBUG_FUNCPTR (gst_mf_vp9_enc_set_option); + encoder_class->set_src_caps = GST_DEBUG_FUNCPTR (gst_mf_vp9_enc_set_src_caps); + encoder_class->check_reconfigure = + GST_DEBUG_FUNCPTR (gst_mf_vp9_enc_check_reconfigure); + + encoder_class->codec_id = MFVideoFormat_VP90; + encoder_class->enum_flags = cdata->enum_flags; + encoder_class->device_index = cdata->device_index; + encoder_class->device_caps = *device_caps; g_free (cdata->device_name); gst_caps_unref (cdata->sink_caps); @@ -318,6 +393,8 @@ static void gst_mf_vp9_enc_init (GstMFVP9Enc * self) { + g_mutex_init (&self->prop_lock); + self->bitrate = DEFAULT_BITRATE; self->rc_mode = DEFAULT_RC_MODE; self->max_bitrate = DEFAULT_MAX_BITRATE; @@ -329,11 +406,21 @@ } static void +gst_mf_vp9_enc_finalize (GObject * object) +{ + GstMFVP9Enc *self = (GstMFVP9Enc *) (object); + + g_mutex_clear (&self->prop_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void gst_mf_vp9_enc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstMFVP9Enc *self = (GstMFVP9Enc *) (object); - GstMFVideoEncClass *klass = GST_MF_VIDEO_ENC_GET_CLASS (object); + GstMFVideoEncoderClass *klass = GST_MF_VIDEO_ENCODER_GET_CLASS (object); switch (prop_id) { case PROP_BITRATE: @@ -373,40 +460,90 @@ } static void +update_boolean (GstMFVP9Enc * self, gboolean * old_val, const GValue * new_val) +{ + gboolean val = g_value_get_boolean (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->prop_updated = TRUE; +} + +static void +update_int (GstMFVP9Enc * self, gint * old_val, const GValue * new_val) +{ + gint val = g_value_get_int (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->prop_updated = TRUE; +} + +static void +update_uint (GstMFVP9Enc * self, guint * old_val, const GValue * new_val) +{ + guint val = g_value_get_uint (new_val); + + if (*old_val == val) + return; + + *old_val = val; + self->prop_updated = TRUE; +} + +static void +update_enum (GstMFVP9Enc * self, guint * old_val, const GValue * new_val) +{ + gint val = g_value_get_enum (new_val); + + if (*old_val == (guint) val) + return; + + *old_val = val; + self->prop_updated = TRUE; +} + +static void gst_mf_vp9_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstMFVP9Enc *self = (GstMFVP9Enc *) (object); + g_mutex_lock (&self->prop_lock); switch (prop_id) { case PROP_BITRATE: - self->bitrate = g_value_get_uint (value); + update_uint (self, &self->bitrate, value); break; case PROP_RC_MODE: - self->rc_mode = g_value_get_enum (value); + update_enum (self, &self->rc_mode, value); break; case PROP_MAX_BITRATE: - self->max_bitrate = g_value_get_uint (value); + update_uint (self, &self->max_bitrate, value); break; case PROP_QUALITY_VS_SPEED: - self->quality_vs_speed = g_value_get_uint (value); + update_uint (self, &self->quality_vs_speed, value); break; case PROP_GOP_SIZE: - self->gop_size = g_value_get_int (value); + update_int (self, &self->gop_size, value); break; case PROP_THREADS: - self->threads = g_value_get_uint (value); + update_uint (self, &self->threads, value); break; case PROP_CONTENT_TYPE: - self->content_type = g_value_get_enum (value); + update_enum (self, &self->content_type, value); break; case PROP_LOW_LATENCY: - self->low_latency = g_value_get_boolean (value); + update_boolean (self, &self->low_latency, value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } + g_mutex_unlock (&self->prop_lock); } static guint @@ -443,14 +580,14 @@ } G_STMT_END static gboolean -gst_mf_vp9_enc_set_option (GstMFVideoEnc * mfenc, GstVideoCodecState * state, - IMFMediaType * output_type) +gst_mf_vp9_enc_set_option (GstMFVideoEncoder * encoder, + GstVideoCodecState * state, IMFMediaType * output_type) { - GstMFVP9Enc *self = (GstMFVP9Enc *) mfenc; - GstMFVideoEncClass *klass = GST_MF_VIDEO_ENC_GET_CLASS (mfenc); - GstMFVideoEncDeviceCaps *device_caps = &klass->device_caps; + GstMFVP9Enc *self = (GstMFVP9Enc *) encoder; + GstMFVideoEncoderClass *klass = GST_MF_VIDEO_ENCODER_GET_CLASS (encoder); + GstMFVideoEncoderDeviceCaps *device_caps = &klass->device_caps; HRESULT hr; - GstMFTransform *transform = mfenc->transform; + GstMFTransform *transform = encoder->transform; hr = output_type->SetGUID (MF_MT_SUBTYPE, MFVideoFormat_VP90); if (!gst_mf_result (hr)) @@ -459,10 +596,14 @@ if (!gst_mf_result (hr)) return FALSE; + g_mutex_lock (&self->prop_lock); hr = output_type->SetUINT32 (MF_MT_AVG_BITRATE, MIN (self->bitrate * 1024, G_MAXUINT - 1)); - if (!gst_mf_result (hr)) + if (!gst_mf_result (hr)) { + GST_ERROR_OBJECT (self, "Failed to set bitrate"); + g_mutex_unlock (&self->prop_lock); return FALSE; + } if (device_caps->rc_mode) { guint rc_mode; @@ -532,14 +673,17 @@ WARNING_HR (hr, CODECAPI_AVLowLatencyMode); } + self->prop_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + return TRUE; } static gboolean -gst_mf_vp9_enc_set_src_caps (GstMFVideoEnc * mfenc, +gst_mf_vp9_enc_set_src_caps (GstMFVideoEncoder * encoder, GstVideoCodecState * state, IMFMediaType * output_type) { - GstMFVP9Enc *self = (GstMFVP9Enc *) mfenc; + GstMFVP9Enc *self = (GstMFVP9Enc *) encoder; GstVideoCodecState *out_state; GstStructure *s; GstCaps *out_caps; @@ -559,7 +703,7 @@ tags = gst_tag_list_new_empty (); gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, gst_element_get_metadata (GST_ELEMENT_CAST (self), - GST_ELEMENT_METADATA_LONGNAME), NULL); + GST_ELEMENT_METADATA_LONGNAME), nullptr); gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (self), tags, GST_TAG_MERGE_REPLACE); gst_tag_list_unref (tags); @@ -567,17 +711,31 @@ return TRUE; } +static gboolean +gst_mf_vp9_enc_check_reconfigure (GstMFVideoEncoder * encoder) +{ + GstMFVP9Enc *self = (GstMFVP9Enc *) encoder; + gboolean ret; + + g_mutex_lock (&self->prop_lock); + ret = self->prop_updated; + self->prop_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return ret; +} + void gst_mf_vp9_enc_plugin_init (GstPlugin * plugin, guint rank, GList * d3d11_device) { GTypeInfo type_info = { sizeof (GstMFVP9EncClass), - NULL, - NULL, + nullptr, + nullptr, (GClassInitFunc) gst_mf_vp9_enc_class_init, - NULL, - NULL, + nullptr, + nullptr, sizeof (GstMFVP9Enc), 0, (GInstanceInitFunc) gst_mf_vp9_enc_init, @@ -586,5 +744,6 @@ GST_DEBUG_CATEGORY_INIT (gst_mf_vp9_enc_debug, "mfvp9enc", 0, "mfvp9enc"); - gst_mf_video_enc_register (plugin, rank, &subtype, &type_info, d3d11_device); + gst_mf_video_encoder_register (plugin, + rank, &subtype, &type_info, d3d11_device); }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/gstwin32devicewatcher.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/gstwin32devicewatcher.cpp
Changed
@@ -121,7 +121,7 @@ static LRESULT CALLBACK window_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { - GstWin32DeviceWatcher * self; + GstWin32DeviceWatcher *self; switch (msg) { case WM_CREATE: @@ -156,7 +156,7 @@ { WNDCLASSEXA wc; ATOM atom = 0; - HINSTANCE hinstance = GetModuleHandle (NULL); + HINSTANCE hinstance = GetModuleHandle (nullptr); static const gchar *klass_name = "GstWin32DeviceWatcher"; HWND hwnd; @@ -176,7 +176,7 @@ G_UNLOCK (create_lock); GST_ERROR_OBJECT (self, "Failed to register window class, lastError 0x%x", (guint) GetLastError ()); - return NULL; + return nullptr; } } else { GST_LOG_OBJECT (self, "window class was already registered"); @@ -184,7 +184,7 @@ G_UNLOCK (create_lock); hwnd = CreateWindowExA (0, klass_name, "", 0, 0, 0, 0, 0, - HWND_MESSAGE, NULL, hinstance, self); + HWND_MESSAGE, nullptr, hinstance, self); if (!hwnd) { GST_ERROR_OBJECT (self, "Failed to create window handle, lastError 0x%x", (guint) GetLastError ()); @@ -209,7 +209,7 @@ { MSG msg; - if (!PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) + if (!PeekMessage (&msg, nullptr, 0, 0, PM_REMOVE)) return G_SOURCE_CONTINUE; TranslateMessage (&msg); @@ -301,7 +301,7 @@ typedef struct { - GstWin32DeviceWatcher * self; + GstWin32DeviceWatcher *self; gboolean handled; gboolean ret; @@ -310,7 +310,7 @@ static gboolean register_device_notification (DeviceNotificationData * data) { - GstWin32DeviceWatcher * self = data->self; + GstWin32DeviceWatcher *self = data->self; DEV_BROADCAST_DEVICEINTERFACE di = { 0, }; if (self->device_notify) @@ -359,7 +359,7 @@ static gboolean unregister_device_notification (DeviceNotificationData * data) { - GstWin32DeviceWatcher * self = data->self; + GstWin32DeviceWatcher *self = data->self; if (!self->device_notify) goto out;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/mediacapturewrapper.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/mediacapturewrapper.cpp
Changed
@@ -40,13 +40,9 @@ using namespace ABI::Windows::Media::Devices; using namespace ABI::Windows::Media::MediaProperties; -G_BEGIN_DECLS - GST_DEBUG_CATEGORY_EXTERN (gst_mf_source_object_debug); #define GST_CAT_DEFAULT gst_mf_source_object_debug -G_END_DECLS - static std::string convert_hstring_to_string (HString * hstr) { @@ -187,11 +183,11 @@ caps = gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, format.c_str(), "width", G_TYPE_INT, width, - "height", G_TYPE_INT, height, NULL); + "height", G_TYPE_INT, height, nullptr); if (fps_n > 0 && fps_d > 0) gst_caps_set_simple (caps, - "framerate", GST_TYPE_FRACTION, fps_n, fps_d, NULL); + "framerate", GST_TYPE_FRACTION, fps_n, fps_d, nullptr); source_id.CopyTo (source_id_.GetAddressOf()); hstr_subtype.CopyTo (subtype_.GetAddressOf());
View file
gst-plugins-bad-1.20.5.tar.xz/sys/mediafoundation/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/meson.build
Changed
@@ -1,22 +1,26 @@ mf_sources = - 'plugin.c', - 'gstmfutils.cpp', - 'gstmftransform.cpp', - 'gstmfvideoenc.cpp', + 'gstmfaacdec.cpp', + 'gstmfaacenc.cpp', + 'gstmfaudiodecoder.cpp', + 'gstmfaudioencoder.cpp', + 'gstmfdevice.cpp', 'gstmfh264enc.cpp', 'gstmfh265enc.cpp', - 'gstmfvp9enc.cpp', - 'gstmfvideosrc.c', - 'gstmfsourceobject.c', - 'gstmfdevice.c', - 'gstmfaudioenc.cpp', - 'gstmfaacenc.cpp', + 'gstmfmp3dec.cpp', 'gstmfmp3enc.cpp', + 'gstmfplatloader.cpp', + 'gstmfsourceobject.cpp', + 'gstmftransform.cpp', + 'gstmfutils.cpp', 'gstmfvideobuffer.cpp', - 'gstmfplatloader.c', + 'gstmfvideoencoder.cpp', + 'gstmfvideosrc.cpp', + 'gstmfvp9enc.cpp', + 'plugin.cpp', mf_desktop_sources = + 'gstmfcapturedshow.cpp', 'gstmfsourcereader.cpp', 'gstwin32devicewatcher.cpp', @@ -168,5 +172,4 @@ install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstmediafoundation, install_dir : plugins_pkgconfig_install_dir) plugins += gstmediafoundation
View file
gst-plugins-bad-1.22.0.tar.xz/sys/mediafoundation/plugin.cpp
Added
@@ -0,0 +1,265 @@ +/* GStreamer + * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> + * Copyright (C) 2020 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:plugin-mediafoundation + * + * Microsoft MediaFoundation plugin. + * + * This plugin consists of various hardware/software video encoders + * software audio encoders, and video capture (from webcam) elements. + * + * GstMediaFoundation plugin supports H.264/AVC, H.265/HEVC, VP9, codecs for + * hardware-accelerate encoding. + * + * However, depending on the hardware it runs on, some elements might not be + * registered in case that underlying hardware doesn't support the feature. + * + * Moreover, depending on hardware vendor's MediaFoundation implementation, + * secendary GPU may not be usable. In that case, user could use vendor + * specific plugins, Intel Media SDK and NVCODEC plugins for example. + * + * For a system with multiple MediaFoundation compatible hardwares (i.e., GPU), + * there can be multiple plugin features having the same role. + * Also, there would be additional software video encoder element the system + * meets requirement. + * + * The naming rule for the non-primary encoder is `mf{codec}device{index}enc` + * where `index` is an arbitrary index number of hardware starting from 1. + * + * To get a list of all available elements, user can run + * ```sh + * gst-inspect-1.0.exe mediafoundation + * ``` + * + * Since: 1.18 + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstmfconfig.h" + +#include <winapifamily.h> +#include <wrl.h> + +#include <gst/gst.h> +#include <gst/video/video.h> +#include "gstmfvideosrc.h" +#include "gstmfdevice.h" +#include "gstmfutils.h" +#include "gstmfh264enc.h" +#include "gstmfh265enc.h" +#include "gstmfvp9enc.h" +#include "gstmfaacenc.h" +#include "gstmfmp3enc.h" +#include "gstmfaacdec.h" +#include "gstmfmp3dec.h" + +#if GST_MF_HAVE_D3D11 +#include <gst/d3d11/gstd3d11.h> +#include <d3d11_4.h> +#include <dxgi1_6.h> +#include <gstmfplatloader.h> +#endif + +GST_DEBUG_CATEGORY (gst_mf_debug); +GST_DEBUG_CATEGORY (gst_mf_utils_debug); +GST_DEBUG_CATEGORY (gst_mf_source_object_debug); +GST_DEBUG_CATEGORY (gst_mf_transform_debug); +GST_DEBUG_CATEGORY (gst_mf_video_buffer_debug); +GST_DEBUG_CATEGORY (gst_mf_video_encoder_debug); + +#define GST_CAT_DEFAULT gst_mf_debug + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +static void +plugin_deinit (gpointer data) +{ + MFShutdown (); +} + +#if GST_MF_HAVE_D3D11 +static GList * +get_d3d11_devices (void) +{ + GList *ret = nullptr; + guint i; + HRESULT hr; + ComPtr < IMFVideoSampleAllocatorEx > allocator; + + /* Check whether we can use IMFVideoSampleAllocatorEx interface */ + hr = GstMFCreateVideoSampleAllocatorEx (IID_IMFVideoSampleAllocatorEx, + &allocator); + if (!gst_mf_result (hr)) { + GST_DEBUG ("IMFVideoSampleAllocatorEx interface is unavailable"); + return nullptr; + } + + /* AMD seems supporting up to 12 cards, and 8 for NVIDIA */ + for (i = 0; i < 12; i++) { + GstD3D11Device *device; + gboolean is_hardware = FALSE; + GstD3D11Format d3d11_format; + ID3D11Device *device_handle; + D3D11_FEATURE_DATA_D3D11_OPTIONS4 options = { 0, }; + UINT supported = 0; + + device = gst_d3d11_device_new (i, D3D11_CREATE_DEVICE_VIDEO_SUPPORT); + + if (!device) + break; + + g_object_get (device, "hardware", &is_hardware, nullptr); + + if (!is_hardware) { + GST_DEBUG_OBJECT (device, "Given d3d11 device is not for hardware"); + gst_object_unref (device); + continue; + } + + /* device can support NV12 format? */ + if (!gst_d3d11_device_get_format (device, + GST_VIDEO_FORMAT_NV12, &d3d11_format) || + d3d11_format.dxgi_format != DXGI_FORMAT_NV12) { + GST_DEBUG_OBJECT (device, + "Given d3d11 device cannot support NV12 format"); + gst_object_unref (device); + continue; + } + + /* device can support ExtendedNV12SharedTextureSupported? + * + * NOTE: we will make use of per encoder object d3d11 device without + * sharing it in a pipeline because MF needs D3D11_CREATE_DEVICE_VIDEO_SUPPORT + * but the flag doesn't used for the other our use cases. + * So we need texture sharing feature so that we can copy d3d11 texture into + * MF specific texture pool without download texture */ + + device_handle = gst_d3d11_device_get_device_handle (device); + hr = device_handle->CheckFeatureSupport (D3D11_FEATURE_D3D11_OPTIONS4, + &options, sizeof (options)); + if (!gst_d3d11_result (hr, device) || + !options.ExtendedNV12SharedTextureSupported) { + GST_DEBUG_OBJECT (device, + "Given d3d11 device cannot support NV12 format for shared texture"); + gst_object_unref (device); + continue; + } + + /* can we bind NV12 texture for encoder? */ + hr = device_handle->CheckFormatSupport (DXGI_FORMAT_NV12, &supported); + + if (!gst_d3d11_result (hr, device)) { + GST_DEBUG_OBJECT (device, "Couldn't query format support"); + gst_object_unref (device); + continue; + } else if ((supported & D3D11_FORMAT_SUPPORT_VIDEO_ENCODER) == 0) { + GST_DEBUG_OBJECT (device, "We cannot bind NV12 format for encoding"); + gst_object_unref (device); + continue; + } + + ret = g_list_append (ret, device); + } + + return ret; +} +#endif + +static gboolean +plugin_init (GstPlugin * plugin) +{ + HRESULT hr; + guint rank = GST_RANK_SECONDARY; + GList *device_list = nullptr; + + GST_DEBUG_CATEGORY_INIT (gst_mf_debug, "mf", 0, "media foundation"); + GST_DEBUG_CATEGORY_INIT (gst_mf_utils_debug, + "mfutils", 0, "media foundation utility functions"); + GST_DEBUG_CATEGORY_INIT (gst_mf_source_object_debug, + "mfsourceobject", 0, "mfsourceobject"); + GST_DEBUG_CATEGORY_INIT (gst_mf_transform_debug, + "mftransform", 0, "mftransform"); + GST_DEBUG_CATEGORY_INIT (gst_mf_video_buffer_debug, + "mfvideobuffer", 0, "mfvideobuffer"); + GST_DEBUG_CATEGORY_INIT (gst_mf_video_encoder_debug, + "mfvideoencoder", 0, "mfvideoencoder"); + + hr = MFStartup (MF_VERSION, MFSTARTUP_NOSOCKET); + if (!gst_mf_result (hr)) { + GST_WARNING ("MFStartup failure, hr: 0x%x", hr); + return TRUE; + } + + /* mfvideosrc should be primary rank for UWP */ +#if (GST_MF_WINAPI_APP && !GST_MF_WINAPI_DESKTOP) + rank = GST_RANK_PRIMARY + 1; +#endif + + /* FIXME: In order to create MFT for a specific GPU, MFTEnum2() API is + * required API but it's desktop only. + * So, resulting MFT and D3D11 might not be compatible in case of multi-GPU + * environment on UWP. */ +#if GST_MF_HAVE_D3D11 + if (gst_mf_plat_load_library ()) + device_list = get_d3d11_devices (); +#endif + + gst_element_register (plugin, "mfvideosrc", rank, GST_TYPE_MF_VIDEO_SRC); + gst_device_provider_register (plugin, "mfdeviceprovider", + rank, GST_TYPE_MF_DEVICE_PROVIDER); + + gst_mf_h264_enc_plugin_init (plugin, GST_RANK_SECONDARY, device_list); + gst_mf_h265_enc_plugin_init (plugin, GST_RANK_SECONDARY, device_list); + gst_mf_vp9_enc_plugin_init (plugin, GST_RANK_SECONDARY, device_list); + + if (device_list) + g_list_free_full (device_list, gst_object_unref); + + gst_mf_aac_enc_plugin_init (plugin, GST_RANK_SECONDARY); + gst_mf_mp3_enc_plugin_init (plugin, GST_RANK_SECONDARY); + gst_mf_aac_dec_plugin_init (plugin, GST_RANK_SECONDARY); + gst_mf_mp3_dec_plugin_init (plugin, GST_RANK_SECONDARY); + + /* So that call MFShutdown() when this plugin is no more used + * (i.e., gst_deinit). Otherwise valgrind-like tools would complain + * about un-released media foundation resources. + * + * NOTE: MFStartup and MFShutdown can be called multiple times, but the number + * of each MFStartup and MFShutdown call should be identical. This rule is + * simliar to that of CoInitialize/CoUninitialize pair */ + g_object_set_data_full (G_OBJECT (plugin), + "plugin-mediafoundation-shutdown", (gpointer) "shutdown-data", + (GDestroyNotify) plugin_deinit); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + mediafoundation, + "Microsoft Media Foundation plugin", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/meson.build
Changed
@@ -1,3 +1,4 @@ +subdir('amfcodec') subdir('androidmedia') subdir('applemedia') subdir('asio') @@ -6,9 +7,7 @@ subdir('d3dvideosink') subdir('decklink') subdir('directsound') -#subdir('dshowdecwrapper') -#subdir('dshowsrcwrapper') -#subdir('dshowvideosink') +subdir('directshow') subdir('dvb') subdir('fbdev') subdir('ipcpipeline') @@ -18,6 +17,7 @@ subdir('msdk') subdir('nvcodec') subdir('opensles') +subdir('qsv') subdir('shm') subdir('tinyalsa') subdir('uvch264') @@ -25,5 +25,7 @@ subdir('va') subdir('wasapi') subdir('wasapi2') +subdir('wic') +subdir('win32ipc') subdir('winks') subdir('winscreencap')
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdk.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdk.c
Changed
@@ -62,6 +62,9 @@ #ifdef USE_MSDK_AV1_DEC #include "gstmsdkav1dec.h" #endif +#ifdef USE_MSDK_AV1_ENC +#include "gstmsdkav1enc.h" +#endif #include "gstmsdkvpp.h" GST_DEBUG_CATEGORY (gst_msdk_debug); @@ -81,6 +84,7 @@ GST_DEBUG_CATEGORY (gst_msdkvp9dec_debug); GST_DEBUG_CATEGORY (gst_msdkvp9enc_debug); GST_DEBUG_CATEGORY (gst_msdkav1dec_debug); +GST_DEBUG_CATEGORY (gst_msdkav1enc_debug); static void plugin_add_dependencies (GstPlugin * plugin) @@ -137,6 +141,7 @@ GST_DEBUG_CATEGORY_INIT (gst_msdkvp9dec_debug, "msdkvp9dec", 0, "msdkvp9dec"); GST_DEBUG_CATEGORY_INIT (gst_msdkvp9enc_debug, "msdkvp9enc", 0, "msdkvp9enc"); GST_DEBUG_CATEGORY_INIT (gst_msdkav1dec_debug, "msdkav1dec", 0, "msdkav1dec"); + GST_DEBUG_CATEGORY_INIT (gst_msdkav1dec_debug, "msdkav1enc", 0, "msdkav1enc"); plugin_add_dependencies (plugin); @@ -184,6 +189,10 @@ ret = gst_element_register (plugin, "msdkav1dec", GST_RANK_NONE, GST_TYPE_MSDKAV1DEC); #endif +#ifdef USE_MSDK_AV1_ENC + ret = gst_element_register (plugin, "msdkav1enc", GST_RANK_NONE, + GST_TYPE_MSDKAV1ENC); +#endif ret = gst_element_register (plugin, "msdkvpp", GST_RANK_NONE, GST_TYPE_MSDKVPP);
View file
gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkallocator.c
Added
@@ -0,0 +1,151 @@ +/* + * GStreamer Intel MSDK plugin + * Copyright (c) 2022 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "gstmsdkallocator.h" + +static gboolean +map_data (GstBuffer * buffer, mfxFrameSurface1 * mfx_surface, GstVideoInfo info) +{ + guint stride; + GstVideoFrame frame; + + if (!gst_video_frame_map (&frame, &info, buffer, GST_MAP_READWRITE)) + return FALSE; + + stride = GST_VIDEO_FRAME_PLANE_STRIDE (&frame, 0); + + switch (GST_VIDEO_INFO_FORMAT (&info)) { + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P012_LE: + mfx_surface->Data.Y = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + mfx_surface->Data.UV = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 1); + mfx_surface->Data.Pitch = (mfxU16) stride; + break; + case GST_VIDEO_FORMAT_YV12: + mfx_surface->Data.Y = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + mfx_surface->Data.U = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 2); + mfx_surface->Data.V = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 1); + mfx_surface->Data.Pitch = (mfxU16) stride; + break; + case GST_VIDEO_FORMAT_I420: + mfx_surface->Data.Y = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + mfx_surface->Data.U = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 1); + mfx_surface->Data.V = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 2); + mfx_surface->Data.Pitch = (mfxU16) stride; + break; + case GST_VIDEO_FORMAT_YUY2: + mfx_surface->Data.Y = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + mfx_surface->Data.U = mfx_surface->Data.Y + 1; + mfx_surface->Data.V = mfx_surface->Data.Y + 3; + mfx_surface->Data.Pitch = (mfxU16) stride; + break; + case GST_VIDEO_FORMAT_UYVY: + mfx_surface->Data.Y = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + mfx_surface->Data.U = mfx_surface->Data.Y; + mfx_surface->Data.V = mfx_surface->Data.U + 2; + mfx_surface->Data.Pitch = (mfxU16) stride; + break; + case GST_VIDEO_FORMAT_VUYA: + mfx_surface->Data.V = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + mfx_surface->Data.U = mfx_surface->Data.V + 1; + mfx_surface->Data.Y = mfx_surface->Data.V + 2; + mfx_surface->Data.A = mfx_surface->Data.V + 3; + mfx_surface->Data.PitchHigh = (mfxU16) (stride / (1 << 16)); + mfx_surface->Data.PitchLow = (mfxU16) (stride % (1 << 16)); + break; + case GST_VIDEO_FORMAT_BGRA: + case GST_VIDEO_FORMAT_BGRx: + mfx_surface->Data.B = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + mfx_surface->Data.G = mfx_surface->Data.B + 1; + mfx_surface->Data.R = mfx_surface->Data.B + 2; + mfx_surface->Data.A = mfx_surface->Data.B + 3; + mfx_surface->Data.Pitch = (mfxU16) stride; + break; + case GST_VIDEO_FORMAT_Y210: + case GST_VIDEO_FORMAT_Y212_LE: + mfx_surface->Data.Y = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + mfx_surface->Data.U = mfx_surface->Data.Y + 2; + mfx_surface->Data.V = mfx_surface->Data.Y + 6; + mfx_surface->Data.Pitch = (mfxU16) stride; + break; + case GST_VIDEO_FORMAT_Y410: + mfx_surface->Data.Y410 = + (mfxY410 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + mfx_surface->Data.Pitch = stride; + break; + case GST_VIDEO_FORMAT_Y412_LE: + mfx_surface->Data.U = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + mfx_surface->Data.Y = mfx_surface->Data.Y + 2; + mfx_surface->Data.V = mfx_surface->Data.Y + 4; + mfx_surface->Data.A = mfx_surface->Data.Y + 6; + mfx_surface->Data.Pitch = (mfxU16) stride; + break; + default: + g_assert_not_reached (); + break; + } + + gst_video_frame_unmap (&frame); + return TRUE; +} + +GstMsdkSurface * +gst_msdk_import_sys_mem_to_msdk_surface (GstBuffer * buf, GstVideoInfo info) +{ + GstMsdkSurface *msdk_surface = NULL; + GstMapInfo map_info; + mfxFrameInfo frame_info = { 0, }; + mfxFrameSurface1 *mfx_surface = NULL; + + if (!gst_buffer_map (buf, &map_info, GST_MAP_READ)) { + GST_ERROR ("Failed to map buffer"); + return msdk_surface; + } + + mfx_surface = g_slice_new0 (mfxFrameSurface1); + mfx_surface->Data.MemId = (mfxMemId) map_info.data; + + if (!map_data (buf, mfx_surface, info)) { + g_slice_free (mfxFrameSurface1, mfx_surface); + return msdk_surface; + } + + gst_buffer_unmap (buf, &map_info); + + gst_msdk_set_mfx_frame_info_from_video_info (&frame_info, &info); + mfx_surface->Info = frame_info; + + msdk_surface = g_slice_new0 (GstMsdkSurface); + msdk_surface->surface = mfx_surface; + + return msdk_surface; +}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkallocator.h -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkallocator.h
Changed
@@ -39,6 +39,7 @@ G_BEGIN_DECLS typedef struct _GstMsdkMemoryID GstMsdkMemoryID; +typedef struct _GstMsdkSurface GstMsdkSurface; struct _GstMsdkMemoryID { mfxU32 fourcc; @@ -48,14 +49,23 @@ VAImage image; VADRMPRIMESurfaceDescriptor desc; #else - /* TODO: This is just to avoid compile errors on Windows. - * Implement handling Windows-specific video-memory. - */ + ID3D11Texture2D *texture; + guint subresource_index; gint pitch; guint offset; #endif }; +struct _GstMsdkSurface +{ + mfxFrameSurface1 *surface; + GstBuffer *buf; + gboolean from_qdata; +}; + +GstMsdkSurface * +gst_msdk_import_sys_mem_to_msdk_surface (GstBuffer * buf, GstVideoInfo info); + mfxStatus gst_msdk_frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req, mfxFrameAllocResponse *resp); mfxStatus gst_msdk_frame_free(mfxHDL pthis, mfxFrameAllocResponse *resp); mfxStatus gst_msdk_frame_lock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); @@ -64,6 +74,10 @@ void gst_msdk_set_frame_allocator (GstMsdkContext * context); +GstMsdkSurface * +gst_msdk_import_to_msdk_surface (GstBuffer * buf, GstMsdkContext * msdk_context, + GstVideoInfo * vinfo, guint map_flag); + G_END_DECLS #endif /* GST_MSDK_ALLOCATOR_H_ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkallocator_d3d.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkallocator_d3d.c
Changed
@@ -30,8 +30,22 @@ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include <gst/d3d11/gstd3d11.h> #include "gstmsdkallocator.h" +#define GST_MSDK_FRAME_SURFACE gst_msdk_frame_surface_quark_get () +static GQuark +gst_msdk_frame_surface_quark_get (void) +{ + static gsize g_quark; + + if (g_once_init_enter (&g_quark)) { + gsize quark = (gsize) g_quark_from_static_string ("GstMsdkFrameSurface"); + g_once_init_leave (&g_quark, quark); + } + return g_quark; +} + mfxStatus gst_msdk_frame_alloc (mfxHDL pthis, mfxFrameAllocRequest * req, mfxFrameAllocResponse * resp) @@ -60,9 +74,76 @@ mfxStatus gst_msdk_frame_get_hdl (mfxHDL pthis, mfxMemId mid, mfxHDL * hdl) { + GstMsdkMemoryID *mem_id; + mfxHDLPair *pair; + + if (!hdl || !mid) + return MFX_ERR_INVALID_HANDLE; + + mem_id = (GstMsdkMemoryID *) mid; + pair = (mfxHDLPair *) hdl; + pair->first = (mfxHDL) mem_id->texture; + pair->second = (mfxHDL) GUINT_TO_POINTER (mem_id->subresource_index); + return MFX_ERR_NONE; } +GstMsdkSurface * +gst_msdk_import_to_msdk_surface (GstBuffer * buf, GstMsdkContext * msdk_context, + GstVideoInfo * vinfo, guint map_flag) +{ + GstMemory *mem = NULL; + mfxFrameInfo frame_info = { 0, }; + GstMsdkSurface *msdk_surface = NULL; + mfxFrameSurface1 *mfx_surface = NULL; + GstMsdkMemoryID *msdk_mid = NULL; + GstMapInfo map_info; + + mem = gst_buffer_peek_memory (buf, 0); + msdk_surface = g_slice_new0 (GstMsdkSurface); + + if (!gst_is_d3d11_memory (mem) || gst_buffer_n_memory (buf) > 1) { + /* d3d11 buffer should hold single memory object */ + g_slice_free (GstMsdkSurface, msdk_surface); + return NULL; + } + + if (!gst_buffer_map (buf, &map_info, map_flag | GST_MAP_D3D11)) { + GST_ERROR ("Failed to map buffer"); + g_slice_free (GstMsdkSurface, msdk_surface); + return NULL; + } + + /* If buffer has qdata pointing to mfxFrameSurface1, directly extract it */ + if ((mfx_surface = gst_mini_object_get_qdata (GST_MINI_OBJECT_CAST (mem), + GST_MSDK_FRAME_SURFACE))) { + msdk_surface->from_qdata = TRUE; + msdk_surface->surface = mfx_surface; + gst_buffer_unmap (buf, &map_info); + return msdk_surface; + } + + mfx_surface = g_slice_new0 (mfxFrameSurface1); + msdk_mid = g_slice_new0 (GstMsdkMemoryID); + mfx_surface->Data.MemId = (mfxMemId) msdk_mid; + + msdk_mid->texture = (ID3D11Texture2D *) (gpointer) map_info.data; + msdk_mid->subresource_index = GPOINTER_TO_UINT (map_info.user_data0); + + gst_buffer_unmap (buf, &map_info); + + gst_msdk_set_mfx_frame_info_from_video_info (&frame_info, vinfo); + mfx_surface->Info = frame_info; + + /* Set mfxFrameSurface1 as qdata in buffer */ + gst_mini_object_set_qdata (GST_MINI_OBJECT_CAST (mem), + GST_MSDK_FRAME_SURFACE, mfx_surface, NULL); + + msdk_surface->surface = mfx_surface; + + return msdk_surface; +} + void gst_msdk_set_frame_allocator (GstMsdkContext * context) {
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkallocator_libva.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkallocator_libva.c
Changed
@@ -37,6 +37,21 @@ #include "gstmsdkallocator_libva.h" #include "msdk_libva.h" +#include <gst/va/gstvaallocator.h> + +#define GST_MSDK_FRAME_SURFACE gst_msdk_frame_surface_quark_get () +static GQuark +gst_msdk_frame_surface_quark_get (void) +{ + static gsize g_quark; + + if (g_once_init_enter (&g_quark)) { + gsize quark = (gsize) g_quark_from_static_string ("GstMsdkFrameSurface"); + g_once_init_leave (&g_quark, quark); + } + return g_quark; +} + mfxStatus gst_msdk_frame_alloc (mfxHDL pthis, mfxFrameAllocRequest * req, mfxFrameAllocResponse * resp) @@ -704,6 +719,107 @@ } } +static VASurfaceID +_get_va_surface (GstBuffer * buf, GstVideoInfo * info, + GstMsdkContext * msdk_context) +{ + VASurfaceID va_surface = VA_INVALID_ID; + + if (!info) { + va_surface = gst_va_buffer_get_surface (buf); + } else { + /* Update offset/stride/size if there is VideoMeta attached to + * the dma buffer, which is then used to get vasurface */ + GstMemory *mem; + gint i, fd; + GstVideoMeta *vmeta; + + vmeta = gst_buffer_get_video_meta (buf); + if (vmeta) { + if (GST_VIDEO_INFO_FORMAT (info) != vmeta->format || + GST_VIDEO_INFO_WIDTH (info) != vmeta->width || + GST_VIDEO_INFO_HEIGHT (info) != vmeta->height || + GST_VIDEO_INFO_N_PLANES (info) != vmeta->n_planes) { + GST_ERROR ("VideoMeta attached to buffer is not matching" + "the negotiated width/height/format"); + return va_surface; + } + for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); ++i) { + GST_VIDEO_INFO_PLANE_OFFSET (info, i) = vmeta->offseti; + GST_VIDEO_INFO_PLANE_STRIDE (info, i) = vmeta->stridei; + } + GST_VIDEO_INFO_SIZE (info) = gst_buffer_get_size (buf); + } + + mem = gst_buffer_peek_memory (buf, 0); + fd = gst_dmabuf_memory_get_fd (mem); + if (fd < 0) + return va_surface; + /* export dmabuf to vasurface */ + if (!gst_msdk_export_dmabuf_to_vasurface (msdk_context, info, fd, + &va_surface)) + return VA_INVALID_ID; + } + + return va_surface; +} + +/* Currently parameter map_flag is not useful on Linux */ +GstMsdkSurface * +gst_msdk_import_to_msdk_surface (GstBuffer * buf, GstMsdkContext * msdk_context, + GstVideoInfo * vinfo, guint map_flag) +{ + VASurfaceID va_surface = VA_INVALID_ID; + GstMemory *mem = NULL; + mfxFrameInfo frame_info = { 0, }; + GstMsdkSurface *msdk_surface = NULL; + mfxFrameSurface1 *mfx_surface = NULL; + GstMsdkMemoryID *msdk_mid = NULL; + + mem = gst_buffer_peek_memory (buf, 0); + msdk_surface = g_slice_new0 (GstMsdkSurface); + + /* If buffer has qdata pointing to mfxFrameSurface1, directly extract it */ + if ((mfx_surface = gst_mini_object_get_qdata (GST_MINI_OBJECT_CAST (mem), + GST_MSDK_FRAME_SURFACE))) { + msdk_surface->surface = mfx_surface; + msdk_surface->from_qdata = TRUE; + return msdk_surface; + } + + if (gst_msdk_is_va_mem (mem)) { + va_surface = _get_va_surface (buf, NULL, NULL); + } else if (gst_is_dmabuf_memory (mem)) { + /* For dma memory, videoinfo is used with dma fd to create va surface. */ + GstVideoInfo info = *vinfo; + va_surface = _get_va_surface (buf, &info, msdk_context); + } + + if (va_surface == VA_INVALID_ID) { + g_slice_free (GstMsdkSurface, msdk_surface); + return NULL; + } + + mfx_surface = g_slice_new0 (mfxFrameSurface1); + msdk_mid = g_slice_new0 (GstMsdkMemoryID); + + msdk_mid->surface = g_slice_new0 (VASurfaceID); + *msdk_mid->surface = va_surface; + + mfx_surface->Data.MemId = (mfxMemId) msdk_mid; + + gst_msdk_set_mfx_frame_info_from_video_info (&frame_info, vinfo); + mfx_surface->Info = frame_info; + + /* Set mfxFrameSurface1 as qdata in buffer */ + gst_mini_object_set_qdata (GST_MINI_OBJECT_CAST (mem), + GST_MSDK_FRAME_SURFACE, mfx_surface, NULL); + + msdk_surface->surface = mfx_surface; + + return msdk_surface; +} + /** * gst_msdk_replace_mfx_memid: * This method replace the internal VA Suface in mfxSurface with a new one
View file
gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkav1enc.c
Added
@@ -0,0 +1,379 @@ +/* + * GStreamer Intel MSDK plugin + * Copyright (c) 2022 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * SECTION: element-msdkav1enc + * @title: msdkav1enc + * @short_description: Intel MSDK AV1 encoder + * + * AV1 video encoder based on Intel MFX + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc num-buffers=90 ! msdkav1enc ! av1parse ! matroskamux ! filesink location=output.webm + * ``` + * + * Since: 1.21 + * + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <gst/allocators/gstdmabuf.h> + +#include "gstmsdkav1enc.h" + +GST_DEBUG_CATEGORY_EXTERN (gst_msdkav1enc_debug); +#define GST_CAT_DEFAULT gst_msdkav1enc_debug + +enum +{ + PROP_TILE_ROW = GST_MSDKENC_PROP_MAX, + PROP_TILE_COL, + PROP_B_PYRAMID, + PROP_P_PYRAMID, +}; + +#define PROP_TILE_ROW_DEFAULT 1 +#define PROP_TILE_COL_DEFAULT 1 +#define PROP_B_PYRAMID_DEFAULT MFX_B_REF_UNKNOWN +#define PROP_P_PYRAMID_DEFAULT MFX_P_REF_DEFAULT + +#define RAW_FORMATS "NV12, P010_10LE" +#define PROFILES "main" + +#define COMMON_FORMAT "{ " RAW_FORMATS " }" +#define SRC_PROFILES "{ " PROFILES " }" + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, + COMMON_FORMAT))); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-av1, " + "framerate = (fraction) 0/1, MAX, " + "width = (int) 1, MAX , height = (int) 1, MAX , " + "profile = (string) " SRC_PROFILES) + ); + +#define gst_msdkav1enc_parent_class parent_class +G_DEFINE_TYPE (GstMsdkAV1Enc, gst_msdkav1enc, GST_TYPE_MSDKENC); + +static gboolean +gst_msdkav1enc_set_format (GstMsdkEnc * encoder) +{ + GstMsdkAV1Enc *thiz = GST_MSDKAV1ENC (encoder); + GstCaps *template_caps; + GstCaps *allowed_caps = NULL; + + thiz->profile = MFX_PROFILE_AV1_MAIN; + + allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder)); + + if (!allowed_caps || gst_caps_is_empty (allowed_caps)) { + if (allowed_caps) + gst_caps_unref (allowed_caps); + return FALSE; + } + + template_caps = gst_static_pad_template_get_caps (&src_factory); + + /* If downstream has ANY caps let encoder decide profile and level */ + if (gst_caps_is_equal (allowed_caps, template_caps)) { + GST_INFO_OBJECT (thiz, + "downstream has ANY caps, profile/level set to auto"); + } else { + GstStructure *s; + const gchar *profile; + + allowed_caps = gst_caps_make_writable (allowed_caps); + allowed_caps = gst_caps_fixate (allowed_caps); + s = gst_caps_get_structure (allowed_caps, 0); + profile = gst_structure_get_string (s, "profile"); + + if (profile) { + if (!strcmp (profile, "main")) + thiz->profile = MFX_PROFILE_AV1_MAIN; + else + g_assert_not_reached (); + } + } + + gst_caps_unref (allowed_caps); + gst_caps_unref (template_caps); + + return TRUE; +} + +static gboolean +gst_msdkav1enc_configure (GstMsdkEnc * encoder) +{ + GstMsdkAV1Enc *av1enc = GST_MSDKAV1ENC (encoder); + + encoder->num_extra_frames = encoder->async_depth - 1; + encoder->param.mfx.CodecId = MFX_CODEC_AV1; + encoder->param.mfx.CodecLevel = 0; + + switch (encoder->param.mfx.FrameInfo.FourCC) { + case MFX_FOURCC_NV12: + case MFX_FOURCC_P010: + encoder->param.mfx.CodecProfile = MFX_PROFILE_AV1_MAIN; + break; + + default: + g_assert_not_reached (); + break; + } + + /* Always turn on this flag for AV1 */ + /* encoder->param.mfx.LowPower = MFX_CODINGOPTION_ON; */ + + /* Enable Extended coding options */ + if (av1enc->b_pyramid) + encoder->option2.BRefType = MFX_B_REF_PYRAMID; + + if (av1enc->p_pyramid) { + encoder->option3.PRefType = MFX_P_REF_PYRAMID; + /* MFX_P_REF_PYRAMID is available for GopRefDist = 1 */ + encoder->param.mfx.GopRefDist = 1; + /* SDK decides the DPB size for P pyramid */ + encoder->param.mfx.NumRefFrame = 0; + } + + encoder->option3.GPB = MFX_CODINGOPTION_OFF; + encoder->enable_extopt3 = TRUE; + + gst_msdkenc_ensure_extended_coding_options (encoder); + + memset (&av1enc->ext_av1_bs_param, 0, sizeof (av1enc->ext_av1_bs_param)); + av1enc->ext_av1_bs_param.Header.BufferId = MFX_EXTBUFF_AV1_BITSTREAM_PARAM; + av1enc->ext_av1_bs_param.Header.BufferSz = sizeof (av1enc->ext_av1_bs_param); + av1enc->ext_av1_bs_param.WriteIVFHeaders = MFX_CODINGOPTION_OFF; + gst_msdkenc_add_extra_param (encoder, + (mfxExtBuffer *) & av1enc->ext_av1_bs_param); + + memset (&av1enc->ext_av1_res_param, 0, sizeof (av1enc->ext_av1_res_param)); + av1enc->ext_av1_res_param.Header.BufferId = MFX_EXTBUFF_AV1_RESOLUTION_PARAM; + av1enc->ext_av1_res_param.Header.BufferSz = + sizeof (av1enc->ext_av1_res_param); + av1enc->ext_av1_res_param.FrameWidth = encoder->param.mfx.FrameInfo.CropW; + av1enc->ext_av1_res_param.FrameHeight = encoder->param.mfx.FrameInfo.CropH; + gst_msdkenc_add_extra_param (encoder, + (mfxExtBuffer *) & av1enc->ext_av1_res_param); + + memset (&av1enc->ext_av1_tile_param, 0, sizeof (av1enc->ext_av1_tile_param)); + av1enc->ext_av1_tile_param.Header.BufferId = MFX_EXTBUFF_AV1_TILE_PARAM; + av1enc->ext_av1_tile_param.Header.BufferSz = + sizeof (av1enc->ext_av1_tile_param); + av1enc->ext_av1_tile_param.NumTileRows = av1enc->num_tile_rows; + av1enc->ext_av1_tile_param.NumTileColumns = av1enc->num_tile_cols; + gst_msdkenc_add_extra_param (encoder, + (mfxExtBuffer *) & av1enc->ext_av1_tile_param); + + return TRUE; +} + +static inline const gchar * +profile_to_string (gint profile) +{ + switch (profile) { + case MFX_PROFILE_AV1_MAIN: + return "main"; + default: + break; + } + + return NULL; +} + +static GstCaps * +gst_msdkav1enc_set_src_caps (GstMsdkEnc * encoder) +{ + GstCaps *caps; + GstStructure *structure; + const gchar *profile; + + caps = gst_caps_new_empty_simple ("video/x-av1"); + structure = gst_caps_get_structure (caps, 0); + + profile = profile_to_string (encoder->param.mfx.CodecProfile); + if (profile) + gst_structure_set (structure, "profile", G_TYPE_STRING, profile, NULL); + + return caps; +} + +static void +gst_msdkav1enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMsdkAV1Enc *thiz = GST_MSDKAV1ENC (object); + + if (gst_msdkenc_set_common_property (object, prop_id, value, pspec)) + return; + + GST_OBJECT_LOCK (thiz); + + switch (prop_id) { + case PROP_TILE_ROW: + thiz->num_tile_rows = g_value_get_uint (value); + break; + + case PROP_TILE_COL: + thiz->num_tile_cols = g_value_get_uint (value); + break; + + case PROP_B_PYRAMID: + thiz->b_pyramid = g_value_get_boolean (value); + break; + + case PROP_P_PYRAMID: + thiz->p_pyramid = g_value_get_boolean (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (thiz); +} + +static void +gst_msdkav1enc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstMsdkAV1Enc *thiz = GST_MSDKAV1ENC (object); + + if (gst_msdkenc_get_common_property (object, prop_id, value, pspec)) + return; + + GST_OBJECT_LOCK (thiz); + + switch (prop_id) { + case PROP_TILE_ROW: + g_value_set_uint (value, thiz->num_tile_rows); + break; + + case PROP_TILE_COL: + g_value_set_uint (value, thiz->num_tile_cols); + break; + + case PROP_B_PYRAMID: + g_value_set_boolean (value, thiz->b_pyramid); + break; + + case PROP_P_PYRAMID: + g_value_set_boolean (value, thiz->p_pyramid); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (thiz); +} + +static void +gst_msdkav1enc_finalize (GObject * object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_msdkav1enc_class_init (GstMsdkAV1EncClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *element_class; + GstMsdkEncClass *encoder_class; + + gobject_class = G_OBJECT_CLASS (klass); + element_class = GST_ELEMENT_CLASS (klass); + encoder_class = GST_MSDKENC_CLASS (klass); + + gobject_class->finalize = gst_msdkav1enc_finalize; + gobject_class->set_property = gst_msdkav1enc_set_property; + gobject_class->get_property = gst_msdkav1enc_get_property; + + encoder_class->set_format = gst_msdkav1enc_set_format; + encoder_class->configure = gst_msdkav1enc_configure; + encoder_class->set_src_caps = gst_msdkav1enc_set_src_caps; + encoder_class->qp_max = 255; + encoder_class->qp_min = 0; + + gst_msdkenc_install_common_properties (encoder_class); + + g_object_class_install_property (gobject_class, PROP_TILE_ROW, + g_param_spec_uint ("num-tile-rows", + "number of rows for tiled encoding", + "number of rows for tiled encoding", 1, 64, + PROP_TILE_ROW_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_TILE_COL, + g_param_spec_uint ("num-tile-cols", + "number of columns for tiled encoding", + "number of columns for tiled encoding", 1, 64, + PROP_TILE_COL_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_B_PYRAMID, + g_param_spec_boolean ("b-pyramid", "B-pyramid", + "Enable B-Pyramid Reference structure", PROP_B_PYRAMID_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_P_PYRAMID, + g_param_spec_boolean ("p-pyramid", "P-pyramid", + "Enable P-Pyramid Reference structure", PROP_P_PYRAMID_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gst_element_class_set_static_metadata (element_class, + "Intel MSDK AV1 encoder", + "Codec/Encoder/Video/Hardware", + "AV1 video encoder based on Intel Media SDK", + "Haihao Xiang <haihao.xiang@intel.com>, " + "Mengkejiergeli Ba <mengkejiergeli.ba@intel.com>"); + + gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_static_pad_template (element_class, &src_factory); +} + +static void +gst_msdkav1enc_init (GstMsdkAV1Enc * thiz) +{ + thiz->num_tile_rows = PROP_TILE_ROW_DEFAULT; + thiz->num_tile_cols = PROP_TILE_COL_DEFAULT; + thiz->b_pyramid = PROP_B_PYRAMID_DEFAULT; + thiz->p_pyramid = PROP_P_PYRAMID_DEFAULT; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkav1enc.h
Added
@@ -0,0 +1,78 @@ +/* + * GStreamer Intel MSDK plugin + * Copyright (c) 2022 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __GST_MSDKAV1ENC_H__ +#define __GST_MSDKAV1ENC_H__ + +#include <gst/codecparsers/gstav1parser.h> +#include "gstmsdkenc.h" + +G_BEGIN_DECLS + +#define GST_TYPE_MSDKAV1ENC \ + (gst_msdkav1enc_get_type()) +#define GST_MSDKAV1ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKAV1ENC,GstMsdkAV1Enc)) +#define GST_MSDKAV1ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKAV1ENC,GstMsdkAV1EncClass)) +#define GST_IS_MSDKAV1ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKAV1ENC)) +#define GST_IS_MSDKAV1ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKAV1ENC)) + +typedef struct _GstMsdkAV1Enc GstMsdkAV1Enc; +typedef struct _GstMsdkAV1EncClass GstMsdkAV1EncClass; + +struct _GstMsdkAV1Enc +{ + GstMsdkEnc base; + + gint profile; + gushort num_tile_rows; + gushort num_tile_cols; + guint b_pyramid; + guint p_pyramid; + + mfxExtAV1BitstreamParam ext_av1_bs_param; + mfxExtAV1ResolutionParam ext_av1_res_param; + mfxExtAV1TileParam ext_av1_tile_param; +}; + +struct _GstMsdkAV1EncClass +{ + GstMsdkEncClass parent_class; +}; + +GType gst_msdkav1enc_get_type (void); + +G_END_DECLS + +#endif /* __GST_MSDKAV1ENC_H__ */ \ No newline at end of file
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkcontext.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkcontext.c
Changed
@@ -37,6 +37,9 @@ #include <xf86drm.h> #include <va/va_drm.h> #include <gudev/gudev.h> +#include <gst/va/gstvadisplay_drm.h> +#else +#include <gst/d3d11/gstd3d11.h> #endif GST_DEBUG_CATEGORY_STATIC (gst_debug_msdkcontext); @@ -54,8 +57,9 @@ GList *child_session_list; GstMsdkContext *parent_context; #ifndef _WIN32 - gint fd; - VADisplay dpy; + GstVaDisplay *display; +#else + GstD3D11Device *device; #endif }; @@ -67,8 +71,8 @@ #ifndef _WIN32 -static gint -get_device_id (void) +static char * +get_device_path (void) { GUdevClient *client = NULL; GUdevEnumerator *e = NULL; @@ -78,6 +82,7 @@ const gchar *devnode_files2 = { "renderD0-9*", "card0-9*" }; int fd = -1, i; const gchar *user_choice = g_getenv ("GST_MSDK_DRM_DEVICE"); + gchar *ret_path = NULL; if (user_choice) { if (g_str_has_prefix (user_choice, "/dev/dri/")) @@ -99,7 +104,12 @@ GST_ERROR ("The specified device isn't a valid drm device"); } - return fd; + if (fd >= 0) { + ret_path = g_strdup (user_choice); + close (fd); + } + + return ret_path; } client = g_udev_client_new (NULL); @@ -131,6 +141,7 @@ if (fd < 0) continue; GST_DEBUG ("Opened the drm device node %s", devnode_path); + ret_path = g_strdup (devnode_path); break; } @@ -141,42 +152,40 @@ } done: + if (fd >= 0) + close (fd); + if (e) g_object_unref (e); if (client) g_object_unref (client); - return fd; + return ret_path; } - static gboolean gst_msdk_context_use_vaapi (GstMsdkContext * context) { - gint fd; - gint maj_ver, min_ver; + char *path; VADisplay va_dpy = NULL; - VAStatus va_status; + GstVaDisplay *display_drm = NULL; mfxStatus status; GstMsdkContextPrivate *priv = context->priv; - fd = get_device_id (); - if (fd < 0) { - GST_WARNING ("Couldn't find a valid drm device node"); + path = get_device_path (); + if (path == NULL) { + GST_WARNING ("Couldn't find a drm device node to open"); return FALSE; } - va_dpy = vaGetDisplayDRM (fd); - if (!va_dpy) { - GST_ERROR ("Couldn't get a VA DRM display"); + display_drm = gst_va_display_drm_new_from_path (path); + if (!display_drm) { + GST_ERROR ("Couldn't create a VA DRM display"); goto failed; } + g_free (path); - va_status = vaInitialize (va_dpy, &maj_ver, &min_ver); - if (va_status != VA_STATUS_SUCCESS) { - GST_ERROR ("Couldn't initialize VA DRM display"); - goto failed; - } + va_dpy = gst_va_display_get_va_dpy (display_drm); status = MFXVideoCORE_SetHandle (priv->session.session, MFX_HANDLE_VA_DISPLAY, (mfxHDL) va_dpy); @@ -186,17 +195,111 @@ goto failed; } - priv->fd = fd; - priv->dpy = va_dpy; + priv->display = display_drm; return TRUE; failed: - if (va_dpy) - vaTerminate (va_dpy); - close (fd); + if (display_drm) + gst_object_unref (display_drm); + return FALSE; } +#else +static GstD3D11Device * +get_device_by_index (IDXGIFactory1 * factory, guint idx) +{ + HRESULT hr; + IDXGIAdapter1 *adapter; + ID3D11Device *device_handle; + ID3D10Multithread *multi_thread; + DXGI_ADAPTER_DESC desc; + GstD3D11Device *device = NULL; + gint64 luid; + + hr = IDXGIFactory1_EnumAdapters1 (factory, idx, &adapter); + if (FAILED (hr)) { + return NULL; + } + + hr = IDXGIAdapter1_GetDesc (adapter, &desc); + if (FAILED (hr)) { + IDXGIAdapter1_Release (adapter); + return NULL; + } + + if (desc.VendorId != 0x8086) { + IDXGIAdapter1_Release (adapter); + return NULL; + } + + luid = gst_d3d11_luid_to_int64 (&desc.AdapterLuid); + device = gst_d3d11_device_new_for_adapter_luid (luid, + D3D11_CREATE_DEVICE_BGRA_SUPPORT); + IDXGIAdapter1_Release (adapter); + + device_handle = gst_d3d11_device_get_device_handle (device); + hr = ID3D11Device_QueryInterface (device_handle, + &IID_ID3D10Multithread, (void **) &multi_thread); + if (FAILED (hr)) { + gst_object_unref (device); + return NULL; + } + + hr = ID3D10Multithread_SetMultithreadProtected (multi_thread, TRUE); + ID3D10Multithread_Release (multi_thread); + + return device; +} + +static gboolean +gst_msdk_context_use_d3d11 (GstMsdkContext * context) +{ + HRESULT hr; + IDXGIFactory1 *factory = NULL; + GstD3D11Device *device = NULL; + ID3D11Device *device_handle; + GstMsdkContextPrivate *priv = context->priv; + mfxStatus status; + guint idx = 0; + gint user_idx = -1; + const gchar *user_choice = g_getenv ("GST_MSDK_DEVICE"); + + hr = CreateDXGIFactory1 (&IID_IDXGIFactory1, (void **) &factory); + if (FAILED (hr)) { + GST_ERROR ("Couldn't create DXGI factory"); + return FALSE; + } + + if (user_choice) { + user_idx = atoi (user_choice); + if (!(device = get_device_by_index (factory, user_idx))) + GST_WARNING + ("Failed to get device by user index, try to pick the first available device"); + } + + /* Pick the first available device */ + while (!device) { + device = get_device_by_index (factory, idx++); + } + + IDXGIFactory1_Release (factory); + device_handle = gst_d3d11_device_get_device_handle (device); + + status = + MFXVideoCORE_SetHandle (priv->session.session, MFX_HANDLE_D3D11_DEVICE, + gst_d3d11_device_get_device_handle (device)); + if (status != MFX_ERR_NONE) { + GST_ERROR ("Setting D3D11VA handle failed (%s)", + msdk_status_to_string (status)); + gst_object_unref (device); + return FALSE; + } + + priv->device = device; + + return TRUE; +} #endif static gboolean @@ -206,23 +309,32 @@ mfxU16 codename; GstMsdkContextPrivate *priv = context->priv; MsdkSession msdk_session; + mfxIMPL impl; priv->job_type = job_type; priv->hardware = hardware; - msdk_session = - msdk_open_session (hardware ? MFX_IMPL_HARDWARE_ANY : MFX_IMPL_SOFTWARE); + impl = hardware ? MFX_IMPL_HARDWARE_ANY : MFX_IMPL_SOFTWARE; + +#ifdef _WIN32 + impl |= MFX_IMPL_VIA_D3D11; +#endif + + msdk_session = msdk_open_session (impl); priv->session = msdk_session; if (!priv->session.session) goto failed; #ifndef _WIN32 - priv->fd = -1; - if (hardware) { if (!gst_msdk_context_use_vaapi (context)) goto failed; } +#else + if (hardware) { + if (!gst_msdk_context_use_d3d11 (context)) + goto failed; + } #endif codename = msdk_get_platform_codename (priv->session.session); @@ -277,10 +389,11 @@ g_mutex_clear (&priv->mutex); #ifndef _WIN32 - if (priv->dpy) - vaTerminate (priv->dpy); - if (priv->fd >= 0) - close (priv->fd); + if (priv->display) + gst_object_unref (priv->display); +#else + if (priv->device) + gst_object_unref (priv->device); #endif done: @@ -330,12 +443,14 @@ if (status != MFX_ERR_NONE) { GST_ERROR ("Failed to query the session attributes (%s)", msdk_status_to_string (status)); - g_object_unref (obj); + gst_object_unref (obj); return NULL; } if (MFX_IMPL_VIA_VAAPI == (0x0f00 & (impl))) handle_type = MFX_HANDLE_VA_DISPLAY; + else if (MFX_IMPL_VIA_D3D11 == (0x0f00 & (impl))) + handle_type = MFX_HANDLE_D3D11_DEVICE; if (handle_type) { status = @@ -345,7 +460,7 @@ if (status != MFX_ERR_NONE || !handle) { GST_ERROR ("Failed to get session handle (%s)", msdk_status_to_string (status)); - g_object_unref (obj); + gst_object_unref (obj); return NULL; } } @@ -357,7 +472,7 @@ if (status != MFX_ERR_NONE) { GST_ERROR ("Failed to create a child mfx session (%s)", msdk_status_to_string (status)); - g_object_unref (obj); + gst_object_unref (obj); return NULL; } @@ -370,7 +485,7 @@ GST_ERROR ("Failed to set a HW handle (%s)", msdk_status_to_string (status)); MFXClose (child_msdk_session.session); - g_object_unref (obj); + gst_object_unref (obj); return NULL; } } @@ -382,7 +497,7 @@ GST_ERROR ("Failed to join two sessions (%s)", msdk_status_to_string (status)); MFXClose (child_msdk_session.session); - g_object_unref (obj); + gst_object_unref (obj); return NULL; } #endif @@ -395,14 +510,130 @@ parent_priv->child_session_list = g_list_prepend (parent_priv->child_session_list, priv->session.session); #ifndef _WIN32 - priv->dpy = parent_priv->dpy; - priv->fd = parent_priv->fd; + priv->display = parent_priv->display; +#else + priv->device = parent_priv->device; #endif priv->parent_context = gst_object_ref (parent); return obj; } +#ifndef _WIN32 +GstMsdkContext * +gst_msdk_context_new_with_va_display (GstObject * display_obj, + gboolean hardware, GstMsdkContextJobType job_type) +{ + GstMsdkContext *obj = NULL; + + GstMsdkContextPrivate *priv; + mfxU16 codename; + mfxStatus status; + GstVaDisplay *va_display; + + va_display = GST_VA_DISPLAY (display_obj); + if (!va_display) + return NULL; + + obj = g_object_new (GST_TYPE_MSDK_CONTEXT, NULL); + + priv = obj->priv; + priv->display = gst_object_ref (va_display); + + priv->job_type = job_type; + priv->hardware = hardware; + priv->session = + msdk_open_session (hardware ? MFX_IMPL_HARDWARE_ANY : MFX_IMPL_SOFTWARE); + if (!priv->session.session) { + gst_object_unref (obj); + return NULL; + } + + if (hardware) { + status = + MFXVideoCORE_SetHandle (priv->session.session, MFX_HANDLE_VA_DISPLAY, + (mfxHDL) gst_va_display_get_va_dpy (priv->display)); + if (status != MFX_ERR_NONE) { + GST_ERROR ("Setting VAAPI handle failed (%s)", + msdk_status_to_string (status)); + gst_object_unref (obj); + return NULL; + } + } + + codename = msdk_get_platform_codename (priv->session.session); + + if (codename != MFX_PLATFORM_UNKNOWN) + GST_INFO ("Detected MFX platform with device code %d", codename); + else + GST_WARNING ("Unknown MFX platform"); + + return obj; +} +#else +GstMsdkContext * +gst_msdk_context_new_with_d3d11_device (GstD3D11Device * device, + gboolean hardware, GstMsdkContextJobType job_type) +{ + GstMsdkContext *obj = NULL; + GstMsdkContextPrivate *priv; + mfxU16 codename; + mfxStatus status; + ID3D10Multithread *multi_thread; + ID3D11Device *device_handle; + HRESULT hr; + + obj = g_object_new (GST_TYPE_MSDK_CONTEXT, NULL); + + priv = obj->priv; + priv->device = gst_object_ref (device); + + priv->job_type = job_type; + priv->hardware = hardware; + priv->session = + msdk_open_session (hardware ? MFX_IMPL_HARDWARE_ANY : MFX_IMPL_SOFTWARE); + if (!priv->session.session) { + goto failed; + } + + device_handle = gst_d3d11_device_get_device_handle (device); + hr = ID3D11Device_QueryInterface (device_handle, + &IID_ID3D10Multithread, (void **) &multi_thread); + if (FAILED (hr)) { + GST_ERROR ("ID3D10Multithread interface is unavailable"); + goto failed; + } + + hr = ID3D10Multithread_SetMultithreadProtected (multi_thread, TRUE); + ID3D10Multithread_Release (multi_thread); + + if (hardware) { + status = + MFXVideoCORE_SetHandle (priv->session.session, MFX_HANDLE_D3D11_DEVICE, + device_handle); + if (status != MFX_ERR_NONE) { + GST_ERROR ("Setting D3D11VA handle failed (%s)", + msdk_status_to_string (status)); + goto failed; + } + } + + codename = msdk_get_platform_codename (priv->session.session); + + if (codename != MFX_PLATFORM_UNKNOWN) + GST_INFO ("Detected MFX platform with device code %d", codename); + else + GST_WARNING ("Unknown MFX platform"); + + return obj; + +failed: + gst_object_unref (obj); + gst_object_unref (device); + return NULL; +} +#endif + mfxSession gst_msdk_context_get_session (GstMsdkContext * context) { @@ -413,21 +644,29 @@ gst_msdk_context_get_handle (GstMsdkContext * context) { #ifndef _WIN32 - return context->priv->dpy; + return gst_va_display_get_va_dpy (context->priv->display); #else return NULL; #endif } -gint -gst_msdk_context_get_fd (GstMsdkContext * context) -{ #ifndef _WIN32 - return context->priv->fd; +GstObject * +gst_msdk_context_get_va_display (GstMsdkContext * context) +{ + if (context->priv->display) + return gst_object_ref (GST_OBJECT_CAST (context->priv->display)); + return NULL; +} #else - return -1; -#endif +GstD3D11Device * +gst_msdk_context_get_d3d11_device (GstMsdkContext * context) +{ + if (context->priv->device) + return gst_object_ref (context->priv->device); + return NULL; } +#endif static gint _find_response (gconstpointer resp, gconstpointer comp_resp)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkcontext.h -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkcontext.h
Changed
@@ -37,6 +37,8 @@ #ifndef _WIN32 #include <va/va.h> #include <va/va_drmcommon.h> +#else +#include <gst/d3d11/gstd3d11_fwd.h> #endif G_BEGIN_DECLS @@ -87,10 +89,21 @@ GstMsdkContext * gst_msdk_context_new (gboolean hardware, GstMsdkContextJobType job_type); GstMsdkContext * gst_msdk_context_new_with_parent (GstMsdkContext * parent); +#ifndef _WIN32 +GstMsdkContext * gst_msdk_context_new_with_va_display (GstObject * display_obj, + gboolean hardware, GstMsdkContextJobType job_type); +#else +GstMsdkContext * gst_msdk_context_new_with_d3d11_device (GstD3D11Device * device, + gboolean hardware, GstMsdkContextJobType job_type); +#endif mfxSession gst_msdk_context_get_session (GstMsdkContext * context); gpointer gst_msdk_context_get_handle (GstMsdkContext * context); -gint gst_msdk_context_get_fd (GstMsdkContext * context); +#ifndef _WIN32 +GstObject * gst_msdk_context_get_va_display (GstMsdkContext * context); +#else +GstD3D11Device * gst_msdk_context_get_d3d11_device (GstMsdkContext * context); +#endif /* GstMsdkContext contains mfxFrameAllocResponses, * if app calls MFXVideoCORE_SetFrameAllocator.
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkcontextutil.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkcontextutil.c
Changed
@@ -31,6 +31,12 @@ */ #include "gstmsdkcontextutil.h" +#ifndef _WIN32 +#include <gst/va/gstvadisplay.h> +#include <gst/va/gstvautils.h> +#else +#include <gst/d3d11/gstd3d11device.h> +#endif GST_DEBUG_CATEGORY_STATIC (GST_CAT_CONTEXT); @@ -47,33 +53,35 @@ #endif } +#ifdef _WIN32 static gboolean -context_pad_query (const GValue * item, GValue * value, gpointer user_data) +_pad_query (const GValue * item, GValue * value, gpointer user_data) { - GstPad *const pad = g_value_get_object (item); - GstQuery *const query = user_data; + GstPad *pad = g_value_get_object (item); + GstQuery *query = user_data; + gboolean res; + + res = gst_pad_peer_query (pad, query); - if (gst_pad_peer_query (pad, query)) { + if (res) { g_value_set_boolean (value, TRUE); return FALSE; } - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, pad, "context pad peer query failed"); + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, pad, "pad peer query failed"); return TRUE; } static gboolean -_gst_context_run_query (GstElement * element, GstQuery * query, - GstPadDirection direction) +_run_query (GstElement * element, GstQuery * query, GstPadDirection direction) { - GstIteratorFoldFunction const func = context_pad_query; GstIterator *it; - GValue res = { 0 }; + GstIteratorFoldFunction func = _pad_query; + GValue res = G_VALUE_INIT; g_value_init (&res, G_TYPE_BOOLEAN); g_value_set_boolean (&res, FALSE); - /* Ask neighbour */ if (direction == GST_PAD_SRC) it = gst_element_iterate_src_pads (element); else @@ -81,79 +89,68 @@ while (gst_iterator_fold (it, func, &res, query) == GST_ITERATOR_RESYNC) gst_iterator_resync (it); + gst_iterator_free (it); return g_value_get_boolean (&res); } -static gboolean -_gst_context_get_from_query (GstElement * element, GstQuery * query, - GstPadDirection direction) -{ - GstContext *ctxt; - - if (!_gst_context_run_query (element, query, direction)) - return FALSE; - - gst_query_parse_context (query, &ctxt); - if (!ctxt) - return FALSE; - - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, - "found context (%" GST_PTR_FORMAT ") in %s query", ctxt, - direction == GST_PAD_SRC ? "downstream" : "upstream"); - - gst_element_set_context (element, ctxt); - return TRUE; -} - static void -_gst_context_query (GstElement * element, const gchar * context_type) +_context_query (GstElement * element, const gchar * context_type) { GstQuery *query; - GstMessage *msg; - - /* 2) Query downstream with GST_QUERY_CONTEXT for the context and - check if downstream already has a context of the specific - type */ + GstContext *ctxt = NULL; - /* 3) Query upstream with GST_QUERY_CONTEXT for the context and - check if upstream already has a context of the specific - type */ + /* 2a) Query downstream with GST_QUERY_CONTEXT for the context and + * check if downstream already has a context of the specific type + * 2b) Query upstream as above. + */ query = gst_query_new_context (context_type); - if (_gst_context_get_from_query (element, query, GST_PAD_SRC)) - goto found; - if (_gst_context_get_from_query (element, query, GST_PAD_SINK)) - goto found; - - /* 4) Post a GST_MESSAGE_NEED_CONTEXT message on the bus with - the required context types and afterwards check if an - usable context was set now as in 1). The message could - be handled by the parent bins of the element and the - application. */ - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, - "posting `need-context' message"); - - msg = gst_message_new_need_context (GST_OBJECT_CAST (element), context_type); - if (!gst_element_post_message (element, msg)) - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, "No bus attached"); + if (_run_query (element, query, GST_PAD_SRC)) { + gst_query_parse_context (query, &ctxt); + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, + "found context (%p) in downstream query", ctxt); + gst_element_set_context (element, ctxt); + } else if (_run_query (element, query, GST_PAD_SINK)) { + gst_query_parse_context (query, &ctxt); + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, + "found context (%p) in upstream query", ctxt); + gst_element_set_context (element, ctxt); + } else { + /* 3) Post a GST_MESSAGE_NEED_CONTEXT message on the bus with + * the required context type and afterwards check if a + * usable context was set now as in 1). The message could + * be handled by the parent bins of the element and the + * application. + */ + GstMessage *msg; + + GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, + "posting need context message"); + msg = gst_message_new_need_context (GST_OBJECT_CAST (element), + context_type); + gst_element_post_message (element, msg); + } - /* Whomever responds to the need-context message performs a - GstElement::set_context() with the required context in which the - element is required to update the display_ptr */ + /* + * Whomever responds to the need-context message performs a + * GstElement::set_context() with the required context in which the element + * is required to update the display_ptr or call gst_va_handle_set_context(). + */ -found: gst_query_unref (query); } +#endif +/* Find whether the other elements already have a msdk context. */ gboolean gst_msdk_context_find (GstElement * element, GstMsdkContext ** context_ptr) { + _init_context_debug (); + g_return_val_if_fail (element != NULL, FALSE); g_return_val_if_fail (context_ptr != NULL, FALSE); - _init_context_debug (); - /* 1) Check if the element already has a context of the specific type. */ if (*context_ptr) { GST_LOG_OBJECT (element, "already have a context %" GST_PTR_FORMAT, @@ -162,10 +159,16 @@ } /* This may indirectly set *context_ptr, see function body */ - _gst_context_query (element, GST_MSDK_CONTEXT_TYPE_NAME); +#ifndef _WIN32 + gst_va_context_query (element, GST_MSDK_CONTEXT_TYPE_NAME); +#else + _context_query (element, GST_MSDK_CONTEXT_TYPE_NAME); +#endif - if (*context_ptr) + if (*context_ptr) { GST_LOG_OBJECT (element, "found a context %" GST_PTR_FORMAT, *context_ptr); + return TRUE; + } return *context_ptr != NULL; } @@ -177,6 +180,8 @@ const GstStructure *structure; const gchar *type; + _init_context_debug (); + g_return_val_if_fail (GST_IS_CONTEXT (context), FALSE); type = gst_context_get_context_type (context); @@ -203,34 +208,247 @@ gst_structure_set (structure, GST_MSDK_CONTEXT_TYPE_NAME, GST_TYPE_MSDK_CONTEXT, msdk_context, NULL); - gst_element_set_context (element, context); - GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, "posting `have-context' message with MSDK context %" GST_PTR_FORMAT, msdk_context); msg = gst_message_new_have_context (GST_OBJECT_CAST (element), context); - if (!gst_element_post_message (element, msg)) { + if (!gst_element_post_message (element, msg)) GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element, "No bus attached"); - } } +/* When we can not find a suitable context from others, we ensure to create + a new context. */ gboolean -gst_msdk_context_ensure_context (GstElement * element, gboolean hardware, - GstMsdkContextJobType job) +gst_msdk_ensure_new_context (GstElement * element, gboolean hardware, + GstMsdkContextJobType job, GstMsdkContext ** context_ptr) { GstMsdkContext *msdk_context; + gboolean propagate_display = FALSE; + gboolean ret = FALSE; + + g_return_val_if_fail (element, FALSE); + g_return_val_if_fail (context_ptr, FALSE); + + _init_context_debug (); + /* 1) Already have. */ + if (g_atomic_pointer_get (context_ptr)) + return TRUE; + +#ifndef _WIN32 + /* 2) Query the neighbour the VA display. If already a valid VA display, + using it by gst_msdk_context_from_external_va_display() in set_context(). */ + gst_va_context_query (element, GST_VA_DISPLAY_HANDLE_CONTEXT_TYPE_STR); + msdk_context = g_atomic_pointer_get (context_ptr); + if (msdk_context) { + gst_object_ref (msdk_context); + propagate_display = FALSE; + ret = TRUE; + goto done; + } +#else + /* 2) Query the neighbour the D3D11 device. If already a valid D3D11 device, + using it by gst_msdk_context_from_external_d3d11_device() in set_context(). */ + _context_query (element, GST_D3D11_DEVICE_HANDLE_CONTEXT_TYPE); + msdk_context = g_atomic_pointer_get (context_ptr); + if (msdk_context) { + gst_object_ref (msdk_context); + propagate_display = FALSE; + ret = TRUE; + goto done; + } +#endif + + /* 3) Create a MSDK context from scratch. Currently we use environment variable + to enable user to choose GPU device in multi-GPU environment. This variable + is only valid when there's no context returned by upstream or downstream. + Otherwise it will use the device that created by upstream or downstream. */ msdk_context = gst_msdk_context_new (hardware, job); if (!msdk_context) { GST_ERROR_OBJECT (element, "Context creation failed"); return FALSE; } + propagate_display = TRUE; + ret = TRUE; GST_INFO_OBJECT (element, "New MSDK Context %p", msdk_context); + gst_object_replace ((GstObject **) context_ptr, (GstObject *) msdk_context); + +done: + if (propagate_display) { +#ifndef _WIN32 + GstVaDisplay *display = + (GstVaDisplay *) gst_msdk_context_get_va_display (msdk_context); + gst_va_element_propagate_display_context (element, display); + gst_clear_object (&display); +#endif + } + gst_msdk_context_propagate (element, msdk_context); gst_object_unref (msdk_context); - return TRUE; + return ret; +} + +#ifndef _WIN32 +gboolean +gst_msdk_context_from_external_va_display (GstContext * context, + gboolean hardware, GstMsdkContextJobType job_type, + GstMsdkContext ** msdk_context) +{ + GstObject *va_display = NULL; + const gchar *type; + const GstStructure *s; + GstMsdkContext *ctx = NULL; + + _init_context_debug (); + + type = gst_context_get_context_type (context); + if (g_strcmp0 (type, GST_VA_DISPLAY_HANDLE_CONTEXT_TYPE_STR)) + return FALSE; + + s = gst_context_get_structure (context); + if (gst_structure_get (s, "gst-display", GST_TYPE_OBJECT, &va_display, NULL)) { + if (GST_IS_VA_DISPLAY (va_display)) { + /* TODO: Need to check whether the display is the DEV we want. */ + ctx = + gst_msdk_context_new_with_va_display (va_display, hardware, job_type); + if (ctx) + *msdk_context = ctx; + } + + /* let's try other fields */ + gst_clear_object (&va_display); + } + + if (ctx) + return TRUE; + + return FALSE; +} +#else +gboolean +gst_msdk_context_from_external_d3d11_device (GstContext * context, + gboolean hardware, GstMsdkContextJobType job_type, + GstMsdkContext ** msdk_context) +{ + GstD3D11Device *d3d11_device = NULL; + const gchar *type; + const GstStructure *s; + GstMsdkContext *ctx = NULL; + guint vendor_id = 0; + + _init_context_debug (); + + type = gst_context_get_context_type (context); + if (g_strcmp0 (type, GST_D3D11_DEVICE_HANDLE_CONTEXT_TYPE)) + return FALSE; + + s = gst_context_get_structure (context); + if (gst_structure_get (s, "device", GST_TYPE_D3D11_DEVICE, &d3d11_device, + NULL)) { + g_object_get (d3d11_device, "vendor-id", &vendor_id, NULL); + if (vendor_id != 0x8086) { + GST_ERROR ("Not an Intel device"); + gst_clear_object (&d3d11_device); + return FALSE; + } + ctx = + gst_msdk_context_new_with_d3d11_device (d3d11_device, hardware, + job_type); + if (ctx) + *msdk_context = ctx; + + gst_clear_object (&d3d11_device); + } + + if (ctx) + return TRUE; + + return FALSE; +} +#endif + +gboolean +gst_msdk_handle_context_query (GstElement * element, GstQuery * query, + GstMsdkContext * msdk_context) +{ + const gchar *context_type; + GstContext *ctxt, *old_ctxt; + gboolean ret = FALSE; + + _init_context_debug (); + + g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE); + g_return_val_if_fail (GST_IS_QUERY (query), FALSE); + g_return_val_if_fail (!msdk_context + || GST_IS_MSDK_CONTEXT (msdk_context), FALSE); + + GST_CAT_LOG_OBJECT (GST_CAT_CONTEXT, element, + "handle context query %" GST_PTR_FORMAT, query); + + if (!msdk_context) + return FALSE; + + gst_query_parse_context_type (query, &context_type); + + gst_query_parse_context (query, &old_ctxt); + if (old_ctxt) + ctxt = gst_context_copy (old_ctxt); + else + ctxt = gst_context_new (context_type, TRUE); + +#ifndef _WIN32 + if (g_strcmp0 (context_type, GST_VA_DISPLAY_HANDLE_CONTEXT_TYPE_STR) == 0) { + GstStructure *s; + GstObject *display = gst_msdk_context_get_va_display (msdk_context); + + if (display) { + GST_CAT_LOG (GST_CAT_CONTEXT, + "setting GstVaDisplay (%" GST_PTR_FORMAT ") on context (%" + GST_PTR_FORMAT ")", display, ctxt); + + s = gst_context_writable_structure (ctxt); + gst_structure_set (s, "gst-display", GST_TYPE_OBJECT, display, NULL); + /* Structure hold one ref */ + gst_object_unref (display); + ret = TRUE; + } + } else +#else + if (g_strcmp0 (context_type, GST_D3D11_DEVICE_HANDLE_CONTEXT_TYPE) == 0) { + GstStructure *s; + GstD3D11Device *device = gst_msdk_context_get_d3d11_device (msdk_context); + + if (device) { + GST_CAT_LOG (GST_CAT_CONTEXT, + "setting GstD3D11Device (%" GST_PTR_FORMAT ") on context (%" + GST_PTR_FORMAT ")", device, ctxt); + + s = gst_context_writable_structure (ctxt); + gst_structure_set (s, "device", GST_TYPE_D3D11_DEVICE, device, NULL); + gst_object_unref (device); + ret = TRUE; + } + } else +#endif + if (g_strcmp0 (context_type, GST_MSDK_CONTEXT_TYPE_NAME) == 0) { + GstStructure *s; + + s = gst_context_writable_structure (ctxt); + GST_CAT_LOG (GST_CAT_CONTEXT, + "setting GstMsdkContext (%" GST_PTR_FORMAT ") on context (%" + GST_PTR_FORMAT ")", msdk_context, ctxt); + gst_structure_set (s, GST_MSDK_CONTEXT_TYPE_NAME, GST_TYPE_MSDK_CONTEXT, + msdk_context, NULL); + ret = TRUE; + } + + if (ret) + gst_query_set_context (query, ctxt); + + gst_context_unref (ctxt); + return ret; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkcontextutil.h -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkcontextutil.h
Changed
@@ -47,10 +47,23 @@ gst_msdk_context_find (GstElement * element, GstMsdkContext ** context_ptr); gboolean +gst_msdk_ensure_new_context (GstElement * element, gboolean hardware, GstMsdkContextJobType job, GstMsdkContext ** context_ptr); + +gboolean gst_msdk_context_get_context (GstContext * context, GstMsdkContext ** msdk_context); +#ifndef _WIN32 +gboolean +gst_msdk_context_from_external_va_display (GstContext * context, gboolean hardware, + GstMsdkContextJobType job_type, GstMsdkContext ** msdk_context); +#else +gboolean +gst_msdk_context_from_external_d3d11_device (GstContext * context, gboolean hardware, + GstMsdkContextJobType job_type, GstMsdkContext ** msdk_context); +#endif + gboolean -gst_msdk_context_ensure_context (GstElement * element, gboolean hardware, GstMsdkContextJobType job); +gst_msdk_handle_context_query (GstElement * element, GstQuery * query, GstMsdkContext * msdk_context); G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkdec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkdec.c
Changed
@@ -58,6 +58,9 @@ #define GST_TO_MFX_TIME(time) ((time) == GST_CLOCK_TIME_NONE ? \ MFX_TIMESTAMP_UNKNOWN : gst_util_uint64_scale_round ((time), 9, 100000)) +#define MFX_TO_GST_TIME(time) ((time) == MFX_TIMESTAMP_UNKNOWN ? \ + GST_CLOCK_TIME_NONE : gst_util_uint64_scale_round ((time), 100000, 9)) + #define MFX_TIME_IS_VALID(time) ((time) != MFX_TIMESTAMP_UNKNOWN) #define gst_msdkdec_parent_class parent_class @@ -92,6 +95,15 @@ } } +void +gst_msdkdec_add_video_extra_param (GstMsdkDec * thiz, mfxExtBuffer * param) +{ + if (thiz->num_video_extra_params < MAX_VIDEO_EXTRA_PARAMS) { + thiz->video_extra_paramsthiz->num_video_extra_params = param; + thiz->num_video_extra_params++; + } +} + static GstVideoCodecFrame * gst_msdkdec_get_oldest_frame (GstVideoDecoder * decoder) { @@ -253,8 +265,9 @@ goto failed_unref_buffer2; } - gst_msdk_update_mfx_frame_info_from_mfx_video_param (&i->surface->Info, - &thiz->param); + if (!thiz->sfc) + gst_msdk_update_mfx_frame_info_from_mfx_video_param (&i->surface->Info, + &thiz->param); thiz->locked_msdk_surfaces = g_list_append (thiz->locked_msdk_surfaces, i); return i; @@ -298,6 +311,7 @@ memset (&thiz->param, 0, sizeof (thiz->param)); thiz->num_bs_extra_params = 0; + thiz->num_video_extra_params = 0; thiz->initialized = FALSE; gst_adapter_clear (thiz->adapter); } @@ -312,7 +326,24 @@ gst_object_replace ((GstObject **) & thiz->context, (GstObject *) msdk_context); gst_object_unref (msdk_context); + } else +#ifndef _WIN32 + if (gst_msdk_context_from_external_va_display (context, + thiz->hardware, 0 /* GST_MSDK_JOB_DECODER will be set later */ , + &msdk_context)) { + gst_object_replace ((GstObject **) & thiz->context, + (GstObject *) msdk_context); + gst_object_unref (msdk_context); } +#else + if (gst_msdk_context_from_external_d3d11_device (context, + thiz->hardware, 0 /* GST_MSDK_JOB_DECODER will be set later */ , + &msdk_context)) { + gst_object_replace ((GstObject **) & thiz->context, + (GstObject *) msdk_context); + gst_object_unref (msdk_context); + } +#endif GST_ELEMENT_CLASS (parent_class)->set_context (element, context); } @@ -321,10 +352,16 @@ gst_msdkdec_init_decoder (GstMsdkDec * thiz) { GstMsdkDecClass *klass = GST_MSDKDEC_GET_CLASS (thiz); - GstVideoInfo *info; + GstVideoInfo *info, *output_info; mfxSession session; mfxStatus status; mfxFrameAllocRequest request; +#if (MFX_VERSION >= 1022) + mfxExtDecVideoProcessing ext_dec_video_proc; +#endif + + GstVideoCodecState *output_state = + gst_video_decoder_get_output_state (GST_VIDEO_DECODER (thiz)); if (thiz->initialized) return TRUE; @@ -339,6 +376,7 @@ return FALSE; } info = &thiz->input_state->info; + output_info = &output_state->info; GST_OBJECT_LOCK (thiz); @@ -383,6 +421,35 @@ thiz->param.mfx.FrameInfo.ChromaFormat ? thiz->param.mfx. FrameInfo.ChromaFormat : MFX_CHROMAFORMAT_YUV420; +#if (MFX_VERSION >= 1022) + if (output_info && thiz->sfc) { + memset (&ext_dec_video_proc, 0, sizeof (ext_dec_video_proc)); + ext_dec_video_proc.Header.BufferId = MFX_EXTBUFF_DEC_VIDEO_PROCESSING; + ext_dec_video_proc.Header.BufferSz = sizeof (ext_dec_video_proc); + ext_dec_video_proc.In.CropW = thiz->param.mfx.FrameInfo.CropW; + ext_dec_video_proc.In.CropH = thiz->param.mfx.FrameInfo.CropH; + ext_dec_video_proc.In.CropX = 0; + ext_dec_video_proc.In.CropY = 0; + ext_dec_video_proc.Out.FourCC = + gst_msdk_get_mfx_fourcc_from_format (output_info->finfo->format); + ext_dec_video_proc.Out.ChromaFormat = + gst_msdk_get_mfx_chroma_from_format (output_info->finfo->format); + ext_dec_video_proc.Out.Width = GST_ROUND_UP_16 (output_info->width); + ext_dec_video_proc.Out.Height = GST_ROUND_UP_32 (output_info->height); + ext_dec_video_proc.Out.CropW = output_info->width; + ext_dec_video_proc.Out.CropH = output_info->height; + ext_dec_video_proc.Out.CropX = 0; + ext_dec_video_proc.Out.CropY = 0; + gst_msdkdec_add_video_extra_param (thiz, + (mfxExtBuffer *) & ext_dec_video_proc); + } +#endif + + if (thiz->num_video_extra_params) { + thiz->param.NumExtParam = thiz->num_video_extra_params; + thiz->param.ExtParam = thiz->video_extra_params; + } + session = gst_msdk_context_get_session (thiz->context); /* validate parameters and allow MFX to make adjustments */ status = MFXVideoDECODE_Query (session, &thiz->param, &thiz->param); @@ -431,6 +498,13 @@ request.Type |= MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; if (thiz->use_dmabuf) request.Type |= MFX_MEMTYPE_EXPORT_FRAME; +#if (MFX_VERSION >= 1022) + if (thiz->sfc) { + request.Info.Width = ext_dec_video_proc.Out.Width; + request.Info.Height = ext_dec_video_proc.Out.Height; + } +#endif + gst_msdk_frame_alloc (thiz->context, &request, &thiz->alloc_resp); } @@ -521,6 +595,25 @@ return ret; } +static GstCaps * +gst_msdkdec_getcaps (GstVideoDecoder * decoder, GstCaps * filter) +{ + GstCaps *caps, *tmp = NULL; + + caps = gst_pad_get_pad_template_caps (decoder->sinkpad); + if (caps) { + if (filter) { + tmp = gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (caps); + caps = tmp; + } + } else { + caps = gst_video_decoder_proxy_getcaps (decoder, NULL, filter); + } + + return caps; +} + static gboolean gst_msdkdec_set_src_caps (GstMsdkDec * thiz, gboolean need_allocation) { @@ -528,10 +621,18 @@ GstVideoInfo *vinfo; GstVideoAlignment align; GstCaps *allocation_caps = NULL; + GstCaps *allowed_caps = NULL, *temp_caps; GstVideoFormat format; guint width, height; guint alloc_w, alloc_h; + int out_width = 0, out_height = 0; + gint dar_n = -1, dar_d = -1; const gchar *format_str; + GstStructure *outs = NULL; + const gchar *out_format; + GValue v_format = G_VALUE_INIT; + GValue v_width = G_VALUE_INIT; + GValue v_height = G_VALUE_INIT; /* use display width and display height in output state, which * will be used for caps negotiation */ @@ -550,6 +651,79 @@ GST_WARNING_OBJECT (thiz, "Failed to find a valid video format"); return FALSE; } +#if (MFX_VERSION >= 1022) + /* SFC is triggered (for AVC and HEVC) when default output format is not + * accepted by downstream or when downstream requests for a smaller + * resolution (i.e. SFC supports down-scaling) + * Here we need to do the query twice: the first time uses default color + * format and bitstream's original size to query peer pad, empty caps + * means default format and/or size are not accepted by downstream; + * then we need the second query to decide src caps' color format and size, + * and let SFC work. */ + if (thiz->param.mfx.CodecId == MFX_CODEC_AVC || + thiz->param.mfx.CodecId == MFX_CODEC_HEVC) { + temp_caps = gst_pad_query_caps (GST_VIDEO_DECODER (thiz)->srcpad, NULL); + temp_caps = gst_caps_make_writable (temp_caps); + + g_value_init (&v_format, G_TYPE_STRING); + g_value_init (&v_width, G_TYPE_INT); + g_value_init (&v_height, G_TYPE_INT); + + g_value_set_string (&v_format, gst_video_format_to_string (format)); + g_value_set_int (&v_width, width); + g_value_set_int (&v_height, height); + + gst_caps_set_value (temp_caps, "format", &v_format); + gst_caps_set_value (temp_caps, "width", &v_width); + gst_caps_set_value (temp_caps, "height", &v_height); + + if (gst_caps_is_empty (gst_pad_peer_query_caps (GST_VIDEO_DECODER + (thiz)->srcpad, temp_caps))) { + if (!gst_util_fraction_multiply (width, height, + GST_VIDEO_INFO_PAR_N (&thiz->input_state->info), + GST_VIDEO_INFO_PAR_D (&thiz->input_state->info), + &dar_n, &dar_d)) { + GST_ERROR_OBJECT (thiz, "Error to calculate the output scaled size"); + gst_caps_unref (temp_caps); + return FALSE; + } + + allowed_caps = + gst_pad_get_allowed_caps (GST_VIDEO_DECODER (thiz)->srcpad); + outs = gst_caps_get_structure (allowed_caps, 0); + out_format = gst_structure_get_string (outs, "format"); + gst_structure_get_int (outs, "width", &out_width); + gst_structure_get_int (outs, "height", &out_height); + + if (out_format) { + format = gst_video_format_from_string (out_format); + thiz->sfc = TRUE; + } + + if (!out_width && !out_height) { + out_width = width; + out_height = height; + } else { + /* When user does not set out_width, fill it to fit DAR */ + if (!out_width) + out_width = gst_util_uint64_scale (out_height, dar_n, dar_d); + /* When user does not set out_height, fill it to fit DAR */ + if (!out_height) + out_height = gst_util_uint64_scale (out_width, dar_d, dar_n); + + if (out_width > width || out_height > height) + goto sfc_error; + else if (out_width < width || out_height < height) { + width = out_width; + height = out_height; + thiz->sfc = TRUE; + } + } + gst_caps_unref (allowed_caps); + } + gst_caps_unref (temp_caps); + } +#endif output_state = gst_video_decoder_set_output_state (GST_VIDEO_DECODER (thiz), @@ -568,9 +742,13 @@ /* Ensure output_state->caps and info have same width and height * Also, mandate 32 bit alignment */ vinfo = &output_state->info; - gst_msdk_set_video_alignment (vinfo, alloc_w, alloc_h, &align); + if (width == out_width || height == out_height) + gst_msdk_set_video_alignment (vinfo, 0, 0, &align); + else + gst_msdk_set_video_alignment (vinfo, alloc_w, alloc_h, &align); gst_video_info_align (vinfo, &align); output_state->caps = gst_video_info_to_caps (vinfo); + if (srcpad_can_dmabuf (thiz)) gst_caps_set_features (output_state->caps, 0, gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_DMABUF, NULL)); @@ -605,6 +783,12 @@ gst_video_codec_state_unref (output_state); return TRUE; + +sfc_error: + GST_ERROR_OBJECT (thiz, "Decoder SFC cannot do up-scaling"); + gst_caps_unref (allowed_caps); + gst_caps_unref (temp_caps); + return FALSE; } static void @@ -741,7 +925,12 @@ GST_MINI_OBJECT_FLAG_SET (surface->buf, GST_MINI_OBJECT_FLAG_LOCKABLE); frame->output_buffer = gst_buffer_ref (surface->buf); } else { - gst_video_frame_copy (&surface->copy, &surface->data); + if (!gst_video_frame_copy (&surface->copy, &surface->data)) { + GST_ERROR_OBJECT (thiz, "Failed to copy surface data"); + gst_video_frame_unmap (&surface->copy); + gst_video_frame_unmap (&surface->data); + return GST_FLOW_ERROR; + } frame->output_buffer = gst_buffer_ref (surface->copy.buffer); unmap_frame (thiz, surface); } @@ -758,6 +947,8 @@ if (decode_only) GST_VIDEO_CODEC_FRAME_SET_DECODE_ONLY (frame); + + frame->pts = MFX_TO_GST_TIME (pts); flow = gst_video_decoder_finish_frame (decoder, frame); if (flow == GST_FLOW_ERROR) GST_ERROR_OBJECT (thiz, "Failed to finish frame"); @@ -829,8 +1020,8 @@ GstMsdkDec *thiz = GST_MSDKDEC (decoder); if (!gst_msdkdec_context_prepare (thiz)) { - if (!gst_msdk_context_ensure_context (GST_ELEMENT_CAST (thiz), - thiz->hardware, GST_MSDK_JOB_DECODER)) + if (!gst_msdk_ensure_new_context (GST_ELEMENT_CAST (thiz), + thiz->hardware, GST_MSDK_JOB_DECODER, &thiz->context)) return FALSE; GST_INFO_OBJECT (thiz, "Creating new context %" GST_PTR_FORMAT, thiz->context); @@ -1003,6 +1194,7 @@ { GList *l; task->surface = NULL; + if (!out_surface) return TRUE; l = g_list_find_custom (thiz->locked_msdk_surfaces, out_surface, @@ -1040,6 +1232,40 @@ if (thiz->error_report.ErrorTypes & MFX_ERROR_FRAME_GAP) GST_ELEMENT_WARNING (thiz, STREAM, DECODE, ("Error Frame Gap Error detected!"), (NULL)); + +#ifdef ONEVPL_EXPERIMENTAL + if (thiz->error_report.ErrorTypes & MFX_ERROR_JPEG_APP0_MARKER) + GST_ELEMENT_WARNING (thiz, STREAM, DECODE, + ("Error APP0 unknown marker detected!"), (NULL)); + + if (thiz->error_report.ErrorTypes & MFX_ERROR_JPEG_APP14_MARKER) + GST_ELEMENT_WARNING (thiz, STREAM, DECODE, + ("Error APP14 unknown marker detected!"), (NULL)); + + if (thiz->error_report.ErrorTypes & MFX_ERROR_JPEG_DQT_MARKER) + GST_ELEMENT_WARNING (thiz, STREAM, DECODE, + ("Error DQT unknown marker detected!"), (NULL)); + + if (thiz->error_report.ErrorTypes & MFX_ERROR_JPEG_SOF0_MARKER) + GST_ELEMENT_WARNING (thiz, STREAM, DECODE, + ("Error SOF0 unknown marker detected!"), (NULL)); + + if (thiz->error_report.ErrorTypes & MFX_ERROR_JPEG_DHT_MARKER) + GST_ELEMENT_WARNING (thiz, STREAM, DECODE, + ("Error DHT unknown marker detected!"), (NULL)); + + if (thiz->error_report.ErrorTypes & MFX_ERROR_JPEG_DRI_MARKER) + GST_ELEMENT_WARNING (thiz, STREAM, DECODE, + ("Error DRI unknown marker detected!"), (NULL)); + + if (thiz->error_report.ErrorTypes & MFX_ERROR_JPEG_SOS_MARKER) + GST_ELEMENT_WARNING (thiz, STREAM, DECODE, + ("Error SOS unknown marker detected!"), (NULL)); + + if (thiz->error_report.ErrorTypes & MFX_ERROR_JPEG_UNKNOWN_MARKER) + GST_ELEMENT_WARNING (thiz, STREAM, DECODE, + ("Error Error unknown marker detected!"), (NULL)); +#endif } #endif } @@ -1179,7 +1405,12 @@ gst_video_decoder_get_output_state (GST_VIDEO_DECODER (thiz)); if (output_state) { if (output_state->allocation_caps) { - gst_video_info_from_caps (&alloc_info, output_state->allocation_caps); + if (!gst_video_info_from_caps (&alloc_info, + output_state->allocation_caps)) { + GST_ERROR_OBJECT (thiz, "Failed to get video info from caps"); + flow = GST_FLOW_ERROR; + goto error; + } /* Check whether we need complete reset for dynamic resolution change */ if (thiz->param.mfx.FrameInfo.Width > @@ -1493,6 +1724,10 @@ GstStructure *pool_config = NULL; GstCaps *pool_caps /*, *negotiated_caps */ ; guint size, min_buffers, max_buffers; + GstAllocator *allocator = NULL; + + if (!thiz->param.mfx.FrameInfo.Width || !thiz->param.mfx.FrameInfo.Height) + return FALSE; if (!GST_VIDEO_DECODER_CLASS (parent_class)->decide_allocation (decoder, query)) @@ -1521,7 +1756,8 @@ if (_gst_caps_has_feature (pool_caps, GST_CAPS_FEATURE_MEMORY_DMABUF)) { GST_INFO_OBJECT (decoder, "This MSDK decoder uses DMABuf memory"); thiz->use_video_memory = thiz->use_dmabuf = TRUE; - } + } else if (thiz->sfc) + thiz->use_video_memory = TRUE; /* Initialize MSDK decoder before new bufferpool tries to alloc each buffer, * which requires information about frame allocation. @@ -1549,15 +1785,26 @@ } } - if (gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL) - && gst_buffer_pool_has_option (pool, - GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT)) { + + if (gst_query_get_n_allocation_params (query) > 0) { + gst_query_parse_nth_allocation_param (query, 0, &allocator, NULL); + if (!(GST_IS_MSDK_VIDEO_ALLOCATOR (allocator) || + GST_IS_MSDK_DMABUF_ALLOCATOR (allocator) || + GST_IS_MSDK_SYSTEM_ALLOCATOR (allocator))) + thiz->ds_has_no_msdk_allocator = TRUE; + } + + /* If downstream supports video meta and video alignment, + * or downstream doesn't have msdk_allocator, we can replace + * with our own msdk bufferpool and use it. + */ + if ((gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL) + && gst_buffer_pool_has_option + (pool, GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT)) + || thiz->ds_has_no_msdk_allocator) { GstStructure *config; GstAllocator *allocator; - /* If downstream supports video meta and video alignment, - * we can replace with our own msdk bufferpool and use it - */ /* Remove downstream's pool */ gst_structure_free (pool_config); gst_object_unref (pool); @@ -1584,7 +1831,10 @@ min_buffers, max_buffers); if (!gst_buffer_pool_set_config (pool, pool_config)) goto error_set_config; - gst_video_info_from_caps (&thiz->non_msdk_pool_info, pool_caps); + if (!gst_video_info_from_caps (&thiz->non_msdk_pool_info, pool_caps)) { + GST_ERROR_OBJECT (thiz, "Failed to get video info from caps"); + return FALSE; + } /* update width and height with actual negotiated values */ output_state = @@ -1716,6 +1966,50 @@ return gst_msdkdec_drain (decoder); } +static gboolean +gst_msdkdec_query (GstVideoDecoder * decoder, GstQuery * query, + GstPadDirection dir) +{ + GstMsdkDec *thiz = GST_MSDKDEC (decoder); + gboolean ret = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT:{ + GstMsdkContext *msdk_context = NULL; + + gst_object_replace ((GstObject **) & msdk_context, + (GstObject *) thiz->context); + ret = gst_msdk_handle_context_query (GST_ELEMENT_CAST (decoder), + query, msdk_context); + gst_clear_object (&msdk_context); + break; + } + default: + if (dir == GST_PAD_SRC) { + ret = + GST_VIDEO_DECODER_CLASS (parent_class)->src_query (decoder, query); + } else { + ret = + GST_VIDEO_DECODER_CLASS (parent_class)->sink_query (decoder, query); + } + break; + } + + return ret; +} + +static gboolean +gst_msdkdec_src_query (GstVideoDecoder * decoder, GstQuery * query) +{ + return gst_msdkdec_query (decoder, query, GST_PAD_SRC); +} + +static gboolean +gst_msdkdec_sink_query (GstVideoDecoder * decoder, GstQuery * query) +{ + return gst_msdkdec_query (decoder, query, GST_PAD_SINK); +} + static void gst_msdkdec_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -1870,10 +2164,13 @@ decoder_class->parse = GST_DEBUG_FUNCPTR (gst_msdkdec_parse); decoder_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_msdkdec_decide_allocation); + decoder_class->getcaps = GST_DEBUG_FUNCPTR (gst_msdkdec_getcaps); decoder_class->flush = GST_DEBUG_FUNCPTR (gst_msdkdec_flush); decoder_class->drain = GST_DEBUG_FUNCPTR (gst_msdkdec_drain); decoder_class->transform_meta = GST_DEBUG_FUNCPTR (gst_msdkdec_transform_meta); + decoder_class->src_query = GST_DEBUG_FUNCPTR (gst_msdkdec_src_query); + decoder_class->sink_query = GST_DEBUG_FUNCPTR (gst_msdkdec_sink_query); klass->post_configure = GST_DEBUG_FUNCPTR (gst_msdkdec_post_configure); klass->preinit_decoder = GST_DEBUG_FUNCPTR (gst_msdkdec_preinit_decoder); @@ -1903,6 +2200,8 @@ thiz->do_realloc = TRUE; thiz->force_reset_on_res_change = TRUE; thiz->report_error = FALSE; + thiz->sfc = FALSE; + thiz->ds_has_no_msdk_allocator = FALSE; thiz->adapter = gst_adapter_new (); thiz->input_state = NULL; thiz->pool = NULL;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkdec.h -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkdec.h
Changed
@@ -55,6 +55,7 @@ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKDEC)) #define MAX_BS_EXTRA_PARAMS 8 +#define MAX_VIDEO_EXTRA_PARAMS 8 typedef struct _GstMsdkDec GstMsdkDec; typedef struct _GstMsdkDecClass GstMsdkDecClass; @@ -74,6 +75,8 @@ gboolean use_video_memory; gboolean use_dmabuf; gboolean initialized; + gboolean sfc; + gboolean ds_has_no_msdk_allocator; /* for packetization */ GstAdapter *adapter; @@ -105,6 +108,9 @@ mfxExtBuffer *bs_extra_paramsMAX_BS_EXTRA_PARAMS; guint num_bs_extra_params; + mfxExtBuffer *video_extra_paramsMAX_VIDEO_EXTRA_PARAMS; + guint num_video_extra_params; + #if (MFX_VERSION >= 1025) mfxExtDecodeErrorReport error_report; #endif @@ -130,6 +136,9 @@ void gst_msdkdec_add_bs_extra_param (GstMsdkDec * thiz, mfxExtBuffer * param); +void +gst_msdkdec_add_video_extra_param (GstMsdkDec * thiz, mfxExtBuffer * param); + G_END_DECLS #endif /* __GST_MSDKDEC_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkenc.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkenc.c
Changed
@@ -53,6 +53,9 @@ #ifndef _WIN32 #include "gstmsdkallocator_libva.h" +#include <gst/va/gstvaallocator.h> +#else +#include <gst/d3d11/gstd3d11.h> #endif static inline void * @@ -77,12 +80,23 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkenc_debug); #define GST_CAT_DEFAULT gst_msdkenc_debug +#ifdef _WIN32 static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_MSDK_CAPS_STR - ("{ NV12, I420, YV12, YUY2, UYVY, BGRA }", "NV12")) + ("{ NV12, I420, YV12, YUY2, UYVY, BGRA }", "NV12") "; " + GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE ("NV12")) ); +#else +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_MSDK_CAPS_STR + ("{ NV12, I420, YV12, YUY2, UYVY, BGRA }", "NV12") "; " + GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("NV12")) + ); +#endif #define PROP_HARDWARE_DEFAULT TRUE #define PROP_ASYNC_DEPTH_DEFAULT 4 @@ -93,7 +107,7 @@ #define PROP_QPP_DEFAULT 0 #define PROP_QPB_DEFAULT 0 #define PROP_GOP_SIZE_DEFAULT 256 -#define PROP_REF_FRAMES_DEFAULT 1 +#define PROP_REF_FRAMES_DEFAULT 0 #define PROP_I_FRAMES_DEFAULT 0 #define PROP_B_FRAMES_DEFAULT 0 #define PROP_NUM_SLICES_DEFAULT 0 @@ -102,7 +116,10 @@ #define PROP_RC_LOOKAHEAD_DEPTH_DEFAULT 10 #define PROP_MAX_VBV_BITRATE_DEFAULT 0 #define PROP_MAX_FRAME_SIZE_DEFAULT 0 +#define PROP_MAX_FRAME_SIZE_I_DEFAULT 0 +#define PROP_MAX_FRAME_SIZE_P_DEFAULT 0 #define PROP_MBBRC_DEFAULT MFX_CODINGOPTION_OFF +#define PROP_LOWDELAY_BRC_DEFAULT MFX_CODINGOPTION_OFF #define PROP_ADAPTIVE_I_DEFAULT MFX_CODINGOPTION_OFF #define PROP_ADAPTIVE_B_DEFAULT MFX_CODINGOPTION_OFF @@ -113,12 +130,6 @@ #define gst_msdkenc_parent_class parent_class G_DEFINE_TYPE (GstMsdkEnc, gst_msdkenc, GST_TYPE_VIDEO_ENCODER); -typedef struct -{ - mfxFrameSurface1 *surface; - GstBuffer *buf; -} MsdkSurface; - void gst_msdkenc_add_extra_param (GstMsdkEnc * thiz, mfxExtBuffer * param) { @@ -138,7 +149,24 @@ gst_object_replace ((GstObject **) & thiz->context, (GstObject *) msdk_context); gst_object_unref (msdk_context); + } else +#ifndef _WIN32 + if (gst_msdk_context_from_external_va_display (context, + thiz->hardware, 0 /* GST_MSDK_JOB_ENCODER will be set later */ , + &msdk_context)) { + gst_object_replace ((GstObject **) & thiz->context, + (GstObject *) msdk_context); + gst_object_unref (msdk_context); } +#else + if (gst_msdk_context_from_external_d3d11_device (context, + thiz->hardware, 0 /* GST_MSDK_JOB_ENCODER will be set later */ , + &msdk_context)) { + gst_object_replace ((GstObject **) & thiz->context, + (GstObject *) msdk_context); + gst_object_unref (msdk_context); + } +#endif GST_ELEMENT_CLASS (parent_class)->set_context (element, context); } @@ -201,7 +229,15 @@ break; case MFX_RATECONTROL_VBR: + thiz->enable_extopt3 = TRUE; option2->MaxFrameSize = thiz->max_frame_size * 1000; + if (thiz->max_frame_size_i > 0) + option3->MaxFrameSizeI = thiz->max_frame_size_i * 1000; + if (thiz->max_frame_size_p > 0) + option3->MaxFrameSizeP = thiz->max_frame_size_p * 1000; + if (thiz->lowdelay_brc != MFX_CODINGOPTION_UNKNOWN) { + option3->LowDelayBRC = thiz->lowdelay_brc; + } break; case MFX_RATECONTROL_VCM: @@ -603,15 +639,10 @@ gst_msdk_context_get_shared_async_depth (thiz->context); thiz->num_vpp_surfaces = request0.NumFrameSuggested; - if (thiz->use_video_memory) - gst_msdk_frame_alloc (thiz->context, &(request0), - &thiz->vpp_alloc_resp); - status = MFXVideoVPP_Init (session, &thiz->vpp_param); if (status < MFX_ERR_NONE) { GST_ERROR_OBJECT (thiz, "Init failed (%s)", msdk_status_to_string (status)); - goto no_vpp_free_resource; } else if (status > MFX_ERR_NONE) { GST_WARNING_OBJECT (thiz, "Init returned: %s", msdk_status_to_string (status)); @@ -626,8 +657,6 @@ if (status1 != MFX_ERR_NONE && status1 != MFX_ERR_NOT_INITIALIZED) GST_WARNING_OBJECT (thiz, "VPP close failed (%s)", msdk_status_to_string (status1)); - - goto no_vpp_free_resource; } else if (status > MFX_ERR_NONE) { GST_WARNING_OBJECT (thiz, "Get VPP Parameters returned: %s", msdk_status_to_string (status)); @@ -787,12 +816,6 @@ if (thiz->has_vpp) request0.NumFrameSuggested += thiz->num_vpp_surfaces + 1 - 4; - if (thiz->use_video_memory) { - if (thiz->use_dmabuf && !thiz->has_vpp) - request0.Type |= MFX_MEMTYPE_EXPORT_FRAME; - gst_msdk_frame_alloc (thiz->context, &(request0), &thiz->alloc_resp); - } - /* Maximum of VPP output and encoder input, if using VPP */ if (thiz->has_vpp) request0.NumFrameSuggested = @@ -852,9 +875,6 @@ return TRUE; -no_vpp_free_resource: - if (thiz->use_video_memory) - gst_msdk_frame_free (thiz->context, &thiz->vpp_alloc_resp); failed: GST_OBJECT_UNLOCK (thiz); return FALSE; @@ -875,9 +895,6 @@ gst_clear_object (&thiz->msdk_pool); gst_clear_object (&thiz->msdk_converted_pool); - if (thiz->use_video_memory) - gst_msdk_frame_free (thiz->context, &thiz->alloc_resp); - status = MFXVideoENCODE_Close (gst_msdk_context_get_session (thiz->context)); if (status != MFX_ERR_NONE && status != MFX_ERR_NOT_INITIALIZED) { GST_WARNING_OBJECT (thiz, "Encoder close failed (%s)", @@ -898,9 +915,6 @@ /* Close VPP before freeing the surfaces. They are shared between encoder * and VPP */ if (thiz->has_vpp) { - if (thiz->use_video_memory) - gst_msdk_frame_free (thiz->context, &thiz->vpp_alloc_resp); - status = MFXVideoVPP_Close (gst_msdk_context_get_session (thiz->context)); if (status != MFX_ERR_NONE && status != MFX_ERR_NOT_INITIALIZED) { GST_WARNING_OBJECT (thiz, "VPP close failed (%s)", @@ -916,8 +930,8 @@ typedef struct { GstVideoCodecFrame *frame; - MsdkSurface *frame_surface; - MsdkSurface *converted_surface; + GstMsdkSurface *frame_surface; + GstMsdkSurface *converted_surface; } FrameData; static FrameData * @@ -934,24 +948,13 @@ return fdata; } -static MsdkSurface * -gst_msdkenc_create_surface (mfxFrameSurface1 * surface, GstBuffer * buf) -{ - MsdkSurface *msdk_surface; - msdk_surface = g_slice_new0 (MsdkSurface); - msdk_surface->surface = surface; - msdk_surface->buf = buf; - - return msdk_surface; -} - static void -gst_msdkenc_free_surface (MsdkSurface * surface) +gst_msdkenc_free_surface (GstMsdkSurface * surface) { if (surface->buf) gst_buffer_unref (surface->buf); - g_slice_free (MsdkSurface, surface); + g_slice_free (GstMsdkSurface, surface); } static void @@ -1120,7 +1123,6 @@ frame->dts = gst_util_uint64_scale (task->output_bitstream.DecodeTimeStamp, GST_SECOND, 90000); - if ((task->output_bitstream.FrameType & MFX_FRAMETYPE_IDR) != 0 || (task->output_bitstream.FrameType & MFX_FRAMETYPE_xIDR) != 0) { GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); @@ -1168,6 +1170,7 @@ status = MFXVideoENCODE_EncodeFrameAsync (session, &thiz->enc_cntrl, surface, &task->output_bitstream, &task->sync_point); + if (status != MFX_WRN_DEVICE_BUSY) break; /* If device is busy, wait 1ms and retry, as per MSDK's recomendation */ @@ -1299,51 +1302,131 @@ return TRUE; } +#ifndef _WIN32 +static GstBufferPool * +gst_msdk_create_va_pool (GstMsdkEnc * thiz, GstCaps * caps, guint num_buffers) +{ + GstBufferPool *pool = NULL; + GstAllocator *allocator; + GArray *formats = NULL; + GstAllocationParams alloc_params = { 0, 31, 0, 0 }; + GstVaDisplay *display = NULL; + GstVideoInfo info = thiz->input_state->info; + + display = (GstVaDisplay *) gst_msdk_context_get_va_display (thiz->context); + + if (thiz->use_dmabuf) { + allocator = gst_va_dmabuf_allocator_new (display); + } else { + formats = g_array_new (FALSE, FALSE, sizeof (GstVideoFormat)); + g_array_append_val (formats, GST_VIDEO_INFO_FORMAT (&info)); + allocator = gst_va_allocator_new (display, formats); + } + + if (!allocator) { + GST_ERROR_OBJECT (thiz, "failed to create allocator"); + if (formats) + g_array_unref (formats); + return NULL; + } + + pool = + gst_va_pool_new_with_config (caps, GST_VIDEO_INFO_SIZE (&info), + num_buffers, 0, VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC, GST_VA_FEATURE_AUTO, + allocator, &alloc_params); + + gst_object_unref (allocator); + + GST_LOG_OBJECT (thiz, "Creating va pool"); + return pool; +} +#else +static GstBufferPool * +gst_msdk_create_d3d11_pool (GstMsdkEnc * thiz, guint num_buffers) +{ + GstBufferPool *pool = NULL; + GstD3D11Device *device; + GstStructure *config; + GstD3D11AllocationParams *params; + GstD3D11Format device_format; + guint bind_flags = 0; + GstCaps *aligned_caps = NULL; + GstVideoInfo *info = &thiz->input_state->info; + GstVideoInfo aligned_info; + gint aligned_width; + gint aligned_height; + + device = gst_msdk_context_get_d3d11_device (thiz->context); + + aligned_width = GST_ROUND_UP_16 (info->width); + if (GST_VIDEO_INFO_IS_INTERLACED (info)) { + aligned_height = GST_ROUND_UP_32 (info->height); + } else { + aligned_height = GST_ROUND_UP_16 (info->height); + } + + gst_video_info_set_interlaced_format (&aligned_info, + GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_INTERLACE_MODE (info), + aligned_width, aligned_height); + + gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (&aligned_info), + &device_format); + if ((device_format.format_support0 & D3D11_FORMAT_SUPPORT_RENDER_TARGET) == + D3D11_FORMAT_SUPPORT_RENDER_TARGET) { + bind_flags = D3D11_BIND_RENDER_TARGET; + } + + aligned_caps = gst_video_info_to_caps (&aligned_info); + + pool = gst_d3d11_buffer_pool_new (device); + config = gst_buffer_pool_get_config (pool); + params = gst_d3d11_allocation_params_new (device, &aligned_info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, bind_flags, + D3D11_RESOURCE_MISC_SHARED); + + gst_buffer_pool_config_set_d3d11_allocation_params (config, params); + gst_d3d11_allocation_params_free (params); + gst_buffer_pool_config_set_params (config, aligned_caps, + GST_VIDEO_INFO_SIZE (&aligned_info), num_buffers, 0); + gst_buffer_pool_set_config (pool, config); + + gst_caps_unref (aligned_caps); + GST_LOG_OBJECT (thiz, "Creating d3d11 pool"); + + return pool; +} +#endif + static GstBufferPool * gst_msdkenc_create_buffer_pool (GstMsdkEnc * thiz, GstCaps * caps, guint num_buffers, gboolean set_align) { GstBufferPool *pool = NULL; GstStructure *config; - GstAllocator *allocator = NULL; GstVideoInfo info; GstVideoAlignment align; - GstAllocationParams params = { 0, 31, 0, 0, }; - mfxFrameAllocResponse *alloc_resp = NULL; - - if (thiz->has_vpp) - alloc_resp = set_align ? &thiz->vpp_alloc_resp : &thiz->alloc_resp; - else - alloc_resp = &thiz->alloc_resp; - - pool = gst_msdk_buffer_pool_new (thiz->context, alloc_resp); - if (!pool) - goto error_no_pool; if (!gst_video_info_from_caps (&info, caps)) { GST_INFO_OBJECT (thiz, "failed to get video info"); - return NULL; + return FALSE; } gst_msdk_set_video_alignment (&info, 0, 0, &align); gst_video_info_align (&info, &align); - - if (thiz->use_dmabuf) - allocator = - gst_msdk_dmabuf_allocator_new (thiz->context, &info, alloc_resp); - else if (thiz->use_video_memory) - allocator = gst_msdk_video_allocator_new (thiz->context, &info, alloc_resp); - else - allocator = gst_msdk_system_allocator_new (&info); - - if (!allocator) - goto error_no_allocator; +#ifndef _WIN32 + pool = gst_msdk_create_va_pool (thiz, caps, num_buffers); +#else + pool = gst_msdk_create_d3d11_pool (thiz, num_buffers); +#endif + if (!thiz->use_video_memory) + pool = gst_video_buffer_pool_new (); + if (!pool) + goto error_no_pool; config = gst_buffer_pool_get_config (GST_BUFFER_POOL_CAST (pool)); - gst_buffer_pool_config_set_params (config, caps, info.size, num_buffers, 0); - gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); - gst_buffer_pool_config_add_option (config, - GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); + gst_buffer_pool_config_set_params (config, caps, + GST_VIDEO_INFO_SIZE (&info), num_buffers, 0); + gst_buffer_pool_config_set_video_alignment (config, &align); if (thiz->use_video_memory) { gst_buffer_pool_config_add_option (config, @@ -1352,11 +1435,6 @@ gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_MSDK_USE_DMABUF); } - - gst_buffer_pool_config_set_video_alignment (config, &align); - gst_buffer_pool_config_set_allocator (config, allocator, ¶ms); - gst_object_unref (allocator); - if (!gst_buffer_pool_set_config (pool, config)) goto error_pool_config; @@ -1370,17 +1448,10 @@ GST_INFO_OBJECT (thiz, "failed to create bufferpool"); return NULL; } -error_no_allocator: - { - GST_INFO_OBJECT (thiz, "failed to create allocator"); - gst_object_unref (pool); - return NULL; - } error_pool_config: { GST_INFO_OBJECT (thiz, "failed to set config"); gst_object_unref (pool); - gst_object_unref (allocator); return NULL; } } @@ -1431,6 +1502,31 @@ return ret; } +#ifndef _WIN32 +static gboolean +sinkpad_is_va (GstMsdkEnc * thiz) +{ + GstCapsFeatures *features = + gst_caps_get_features (thiz->input_state->caps, 0); + if (gst_caps_features_contains (features, GST_CAPS_FEATURE_MEMORY_VA)) + return TRUE; + + return FALSE; +} +#else +static gboolean +sinkpad_is_d3d11 (GstMsdkEnc * thiz) +{ + GstCapsFeatures *features = + gst_caps_get_features (thiz->input_state->caps, 0); + if (gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) + return TRUE; + + return FALSE; +} +#endif + static gboolean gst_msdkenc_set_format (GstVideoEncoder * encoder, GstVideoCodecState * state) { @@ -1448,14 +1544,14 @@ } thiz->input_state = gst_video_codec_state_ref (state); } - - /* TODO: Currently d3d allocator is not implemented. - * So encoder uses system memory by default on Windows. - */ #ifndef _WIN32 thiz->use_video_memory = TRUE; + if (sinkpad_is_va (thiz)) + thiz->use_va = TRUE; #else - thiz->use_video_memory = FALSE; + thiz->use_video_memory = TRUE; + if (sinkpad_is_d3d11 (thiz)) + thiz->use_d3d11 = TRUE; #endif GST_INFO_OBJECT (encoder, "This MSDK encoder uses %s memory", @@ -1470,7 +1566,8 @@ * based pipeline usage. Ideally we should have dmabuf support even with * raw-caps negotiation, but we don't have dmabuf-import support in msdk * plugin yet */ - if (sinkpad_can_dmabuf (thiz)) { + /* If VA is set, we do not fallback to DMA. */ + if (!thiz->use_va && sinkpad_can_dmabuf (thiz)) { thiz->input_state->caps = gst_caps_make_writable (thiz->input_state->caps); gst_caps_set_features (thiz->input_state->caps, 0, gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_DMABUF, NULL)); @@ -1542,13 +1639,13 @@ return TRUE; } -static MsdkSurface * -gst_msdkenc_get_surface_from_pool (GstMsdkEnc * thiz, GstBufferPool * pool, +/* This function will be removed later */ +static GstMsdkSurface * +gst_msdkenc_get_surface_from_pool_old (GstMsdkEnc * thiz, GstBufferPool * pool, GstBufferPoolAcquireParams * params) { GstBuffer *new_buffer; - mfxFrameSurface1 *new_surface; - MsdkSurface *msdk_surface; + GstMsdkSurface *msdk_surface = NULL; if (!gst_buffer_pool_is_active (pool) && !gst_buffer_pool_set_active (pool, TRUE)) { @@ -1560,157 +1657,129 @@ GST_ERROR_OBJECT (pool, "failed to acquire a buffer from pool"); return NULL; } +#ifndef _WIN32 + msdk_surface = gst_msdk_import_to_msdk_surface (new_buffer, thiz->context, + &thiz->aligned_info, 0); +#else + msdk_surface = + gst_msdk_import_sys_mem_to_msdk_surface (new_buffer, thiz->aligned_info); +#endif - if (gst_msdk_is_msdk_buffer (new_buffer)) - new_surface = gst_msdk_get_surface_from_buffer (new_buffer); - else { - GST_ERROR_OBJECT (pool, "the acquired memory is not MSDK memory"); - return NULL; - } - - msdk_surface = gst_msdkenc_create_surface (new_surface, new_buffer); + if (msdk_surface) + msdk_surface->buf = new_buffer; return msdk_surface; } -#ifndef _WIN32 -static gboolean -import_dmabuf_to_msdk_surface (GstMsdkEnc * thiz, GstBuffer * buf, - MsdkSurface * msdk_surface) +static GstMsdkSurface * +gst_msdkenc_get_surface_from_pool (GstMsdkEnc * thiz, + GstVideoCodecFrame * frame, GstBuffer * buf) { - GstMemory *mem = NULL; - GstVideoInfo vinfo; - GstVideoMeta *vmeta; - GstMsdkMemoryID *msdk_mid = NULL; - mfxFrameSurface1 *mfx_surface = NULL; - gint fd, i; - mem = gst_buffer_peek_memory (buf, 0); - fd = gst_dmabuf_memory_get_fd (mem); - if (fd < 0) - return FALSE; + GstBuffer *upload_buf; + GstMsdkSurface *msdk_surface = NULL; + GstVideoFrame src_frame, dst_frame; - vinfo = thiz->input_state->info; - /* Update offset/stride/size if there is VideoMeta attached to - * the buffer */ - vmeta = gst_buffer_get_video_meta (buf); - if (vmeta) { - if (GST_VIDEO_INFO_FORMAT (&vinfo) != vmeta->format || - GST_VIDEO_INFO_WIDTH (&vinfo) != vmeta->width || - GST_VIDEO_INFO_HEIGHT (&vinfo) != vmeta->height || - GST_VIDEO_INFO_N_PLANES (&vinfo) != vmeta->n_planes) { - GST_ERROR_OBJECT (thiz, "VideoMeta attached to buffer is not matching" - "the negotiated width/height/format"); - return FALSE; - } - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&vinfo); ++i) { - GST_VIDEO_INFO_PLANE_OFFSET (&vinfo, i) = vmeta->offseti; - GST_VIDEO_INFO_PLANE_STRIDE (&vinfo, i) = vmeta->stridei; - } - GST_VIDEO_INFO_SIZE (&vinfo) = gst_buffer_get_size (buf); + if (!gst_buffer_pool_is_active (thiz->msdk_pool) && + !gst_buffer_pool_set_active (thiz->msdk_pool, TRUE)) { + GST_ERROR_OBJECT (thiz->msdk_pool, "failed to activate buffer pool"); + return NULL; } - /* Upstream neither accepted the msdk pool nor the msdk buffer size restrictions. - * Current media-driver and GMMLib will fail due to strict memory size restrictions. - * Ideally, media-driver should accept what ever memory coming from other drivers - * in case of dmabuf-import and this is how the intel-vaapi-driver works. - * For now, in order to avoid any crash we check the buffer size and fallback - * to copy frame method. - * - * See this: https://github.com/intel/media-driver/issues/169 - * */ - if (GST_VIDEO_INFO_SIZE (&vinfo) < GST_VIDEO_INFO_SIZE (&thiz->aligned_info)) - return FALSE; + if (gst_buffer_pool_acquire_buffer (thiz->msdk_pool, &upload_buf, + NULL) != GST_FLOW_OK) { + GST_ERROR_OBJECT (thiz->msdk_pool, "failed to acquire a buffer from pool"); + return NULL; + } + + if (!gst_video_frame_map (&src_frame, &thiz->input_state->info, buf, + GST_MAP_READ)) { + GST_WARNING ("Failed to map src frame"); + gst_buffer_unref (upload_buf); + return NULL; + } + + if (!gst_video_frame_map (&dst_frame, &thiz->aligned_info, upload_buf, + GST_MAP_WRITE)) { + GST_WARNING ("Failed to map dst frame"); + gst_video_frame_unmap (&src_frame); + gst_buffer_unref (upload_buf); + return NULL; + } - mfx_surface = msdk_surface->surface; - msdk_mid = (GstMsdkMemoryID *) mfx_surface->Data.MemId; + for (guint i = 0; i < GST_VIDEO_FRAME_N_PLANES (&src_frame); i++) { + guint src_width_in_bytes, src_height; + guint dst_width_in_bytes, dst_height; + guint width_in_bytes, height; + guint src_stride, dst_stride; + guint8 *src_data, *dst_data; - /* release the internal memory storage of associated mfxSurface */ - gst_msdk_replace_mfx_memid (thiz->context, mfx_surface, VA_INVALID_ID); + src_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&src_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&src_frame, i); + src_height = GST_VIDEO_FRAME_COMP_HEIGHT (&src_frame, i); + src_stride = GST_VIDEO_FRAME_COMP_STRIDE (&src_frame, i); - /* export dmabuf to vasurface */ - if (!gst_msdk_export_dmabuf_to_vasurface (thiz->context, &vinfo, fd, - msdk_mid->surface)) - return FALSE; + dst_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&dst_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&src_frame, i); + dst_height = GST_VIDEO_FRAME_COMP_HEIGHT (&src_frame, i); + dst_stride = GST_VIDEO_FRAME_COMP_STRIDE (&dst_frame, i); - return TRUE; + width_in_bytes = MIN (src_width_in_bytes, dst_width_in_bytes); + height = MIN (src_height, dst_height); + + src_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&src_frame, i); + dst_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&dst_frame, i); + + for (guint j = 0; j < height; j++) { + memcpy (dst_data, src_data, width_in_bytes); + dst_data += dst_stride; + src_data += src_stride; + } + } + + gst_video_frame_unmap (&dst_frame); + gst_video_frame_unmap (&src_frame); + + if (thiz->use_video_memory) { + msdk_surface = gst_msdk_import_to_msdk_surface (upload_buf, thiz->context, + &thiz->aligned_info, GST_MAP_READ); + } else { + msdk_surface = + gst_msdk_import_sys_mem_to_msdk_surface (upload_buf, + thiz->aligned_info); + } + + gst_buffer_replace (&frame->input_buffer, upload_buf); + gst_buffer_unref (upload_buf); + + return msdk_surface; } -#endif -static MsdkSurface * +static GstMsdkSurface * gst_msdkenc_get_surface_from_frame (GstMsdkEnc * thiz, GstVideoCodecFrame * frame) { - GstVideoFrame src_frame, out_frame; - MsdkSurface *msdk_surface; + GstMsdkSurface *msdk_surface; GstBuffer *inbuf; -#ifndef _WIN32 - GstMemory *mem = NULL; -#endif inbuf = frame->input_buffer; if (gst_msdk_is_msdk_buffer (inbuf)) { - msdk_surface = g_slice_new0 (MsdkSurface); + msdk_surface = g_slice_new0 (GstMsdkSurface); msdk_surface->surface = gst_msdk_get_surface_from_buffer (inbuf); return msdk_surface; } - /* If upstream hasn't accpeted the proposed msdk bufferpool, - * just copy frame (if not dmabuf backed )to msdk buffer and take a surface from it. - */ - if (!(msdk_surface = - gst_msdkenc_get_surface_from_pool (thiz, thiz->msdk_pool, NULL))) - goto error; - -#ifndef _WIN32 - /************ dmabuf-import ************* */ - /* if upstream provided a dmabuf backed memory, but not an msdk - * buffer, we could try to export the dmabuf to underlined vasurface */ - mem = gst_buffer_peek_memory (inbuf, 0); - if (gst_is_dmabuf_memory (mem)) { - if (import_dmabuf_to_msdk_surface (thiz, inbuf, msdk_surface)) - return msdk_surface; - else - GST_INFO_OBJECT (thiz, "Upstream dmabuf-backed memory is not imported" - "to the msdk surface, fall back to the copy input frame method"); - } -#endif - - if (!gst_video_frame_map (&src_frame, &thiz->input_state->info, inbuf, - GST_MAP_READ)) { - GST_ERROR_OBJECT (thiz, "failed to map the frame for source"); - goto error; - } - - if (!gst_video_frame_map (&out_frame, &thiz->aligned_info, msdk_surface->buf, - GST_MAP_WRITE)) { - GST_ERROR_OBJECT (thiz, "failed to map the frame for destination"); - gst_video_frame_unmap (&src_frame); - goto error; - } - - if (!gst_video_frame_copy (&out_frame, &src_frame)) { - GST_ERROR_OBJECT (thiz, "failed to copy frame"); - gst_video_frame_unmap (&out_frame); - gst_video_frame_unmap (&src_frame); - goto error; + msdk_surface = gst_msdk_import_to_msdk_surface (inbuf, thiz->context, + &thiz->input_state->info, GST_MAP_READ); + if (msdk_surface) { + msdk_surface->buf = gst_buffer_ref (inbuf); + return msdk_surface; } - gst_video_frame_unmap (&out_frame); - gst_video_frame_unmap (&src_frame); - - gst_buffer_replace (&frame->input_buffer, msdk_surface->buf); - gst_buffer_unref (msdk_surface->buf); - msdk_surface->buf = NULL; - - return msdk_surface; + /* If upstream hasn't accpeted the proposed msdk bufferpool, + * just copy frame to msdk buffer and take a surface from it. + */ -error: - if (msdk_surface) { - if (msdk_surface->buf) - gst_buffer_unref (msdk_surface->buf); - g_slice_free (MsdkSurface, msdk_surface); - } - return NULL; + return gst_msdkenc_get_surface_from_pool (thiz, frame, inbuf); } static GstFlowReturn @@ -1720,7 +1789,7 @@ GstMsdkEncClass *klass = GST_MSDKENC_GET_CLASS (thiz); GstVideoInfo *info = &thiz->input_state->info; FrameData *fdata; - MsdkSurface *surface; + GstMsdkSurface *surface; if (thiz->reconfig || klass->need_reconfig (thiz, frame)) { gst_msdkenc_flush_frames (thiz, FALSE); @@ -1736,7 +1805,7 @@ goto not_inited; if (thiz->has_vpp) { - MsdkSurface *vpp_surface; + GstMsdkSurface *vpp_surface; GstVideoFrame vframe; mfxSession session; mfxSyncPoint vpp_sync_point = NULL; @@ -1746,7 +1815,7 @@ if (!vpp_surface) goto invalid_surface; surface = - gst_msdkenc_get_surface_from_pool (thiz, thiz->msdk_converted_pool, + gst_msdkenc_get_surface_from_pool_old (thiz, thiz->msdk_converted_pool, NULL); if (!surface) goto invalid_surface; @@ -1887,8 +1956,8 @@ GstMsdkEnc *thiz = GST_MSDKENC (encoder); if (!gst_msdkenc_context_prepare (thiz)) { - if (!gst_msdk_context_ensure_context (GST_ELEMENT_CAST (thiz), - thiz->hardware, GST_MSDK_JOB_ENCODER)) + if (!gst_msdk_ensure_new_context (GST_ELEMENT_CAST (thiz), + thiz->hardware, GST_MSDK_JOB_ENCODER, &thiz->context)) return FALSE; GST_INFO_OBJECT (thiz, "Creating new context %" GST_PTR_FORMAT, thiz->context); @@ -1953,7 +2022,7 @@ return GST_FLOW_OK; } - +#ifndef _WIN32 static gboolean gst_msdkenc_propose_allocation (GstVideoEncoder * encoder, GstQuery * query) { @@ -1987,7 +2056,7 @@ } num_buffers = gst_msdkenc_maximum_delayed_frames (thiz) + 1; - pool = gst_msdkenc_create_buffer_pool (thiz, caps, num_buffers, TRUE); + pool = gst_msdkenc_create_buffer_pool (thiz, caps, num_buffers, FALSE); gst_query_add_allocation_pool (query, pool, GST_VIDEO_INFO_SIZE (&info), num_buffers, 0); @@ -2009,6 +2078,133 @@ return GST_VIDEO_ENCODER_CLASS (parent_class)->propose_allocation (encoder, query); } +#else +static gboolean +gst_msdkenc_propose_allocation (GstVideoEncoder * encoder, GstQuery * query) +{ + GstMsdkEnc *thiz = GST_MSDKENC (encoder); + GstVideoInfo info; + GstBufferPool *pool = NULL; + GstD3D11Device *device; + GstCaps *caps; + guint size; + GstCapsFeatures *features; + guint num_buffers; + GstStructure *config; + gboolean is_d3d11 = FALSE; + + if (!thiz->input_state) + return FALSE; + + gst_query_parse_allocation (query, &caps, NULL); + + if (!caps) { + GST_INFO_OBJECT (encoder, "failed to get caps"); + return FALSE; + } + + if (!gst_video_info_from_caps (&info, caps)) { + GST_INFO_OBJECT (encoder, "failed to get video info"); + return FALSE; + } + + features = gst_caps_get_features (caps, 0); + if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { + GST_DEBUG_OBJECT (thiz, "upstream support d3d11 memory"); + device = gst_msdk_context_get_d3d11_device (thiz->context); + pool = gst_d3d11_buffer_pool_new (device); + is_d3d11 = TRUE; + } else { + pool = gst_video_buffer_pool_new (); + } + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + + if (is_d3d11) { + GstD3D11AllocationParams *d3d11_params; + GstVideoAlignment align; + + /* d3d11 buffer pool doesn't support generic video alignment + * because memory layout of CPU accessible staging texture is uncontrollable. + * Do D3D11 specific handling */ + gst_msdk_set_video_alignment (&info, 0, 0, &align); + + d3d11_params = gst_d3d11_allocation_params_new (device, &info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, 0, 0); + + gst_d3d11_allocation_params_alignment (d3d11_params, &align); + gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params); + gst_d3d11_allocation_params_free (d3d11_params); + } else { + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); + } + + num_buffers = gst_msdkenc_maximum_delayed_frames (thiz) + 1; + gst_buffer_pool_config_set_params (config, + caps, GST_VIDEO_INFO_SIZE (&info), num_buffers, 0); + gst_buffer_pool_set_config (pool, config); + + /* d3d11 buffer pool will update actual CPU accessible buffer size based on + * allocated staging texture per gst_buffer_pool_set_config() call, + * need query again to get the size */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, NULL, &size, NULL, NULL); + gst_structure_free (config); + + gst_query_add_allocation_pool (query, pool, size, num_buffers, 0); + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + gst_object_unref (pool); + + return TRUE; +} +#endif + +static gboolean +gst_msdkenc_query (GstVideoEncoder * encoder, GstQuery * query, + GstPadDirection dir) +{ + GstMsdkEnc *thiz = GST_MSDKENC (encoder); + gboolean ret = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT:{ + GstMsdkContext *msdk_context = NULL; + + gst_object_replace ((GstObject **) & msdk_context, + (GstObject *) thiz->context); + ret = gst_msdk_handle_context_query (GST_ELEMENT_CAST (encoder), + query, msdk_context); + gst_clear_object (&msdk_context); + break; + } + default: + if (dir == GST_PAD_SRC) { + ret = + GST_VIDEO_ENCODER_CLASS (parent_class)->src_query (encoder, query); + } else { + ret = + GST_VIDEO_ENCODER_CLASS (parent_class)->sink_query (encoder, query); + } + break; + } + + return ret; +} + +static gboolean +gst_msdkenc_src_query (GstVideoEncoder * encoder, GstQuery * query) +{ + return gst_msdkenc_query (encoder, query, GST_PAD_SRC); +} + +static gboolean +gst_msdkenc_sink_query (GstVideoEncoder * encoder, GstQuery * query) +{ + return gst_msdkenc_query (encoder, query, GST_PAD_SINK); +} static void gst_msdkenc_dispose (GObject * object) @@ -2092,6 +2288,8 @@ gstencoder_class->finish = GST_DEBUG_FUNCPTR (gst_msdkenc_finish); gstencoder_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_msdkenc_propose_allocation); + gstencoder_class->src_query = GST_DEBUG_FUNCPTR (gst_msdkenc_src_query); + gstencoder_class->sink_query = GST_DEBUG_FUNCPTR (gst_msdkenc_sink_query); gst_element_class_add_static_pad_template (element_class, &sink_factory); } @@ -2105,6 +2303,8 @@ thiz->rate_control = PROP_RATE_CONTROL_DEFAULT; thiz->bitrate = PROP_BITRATE_DEFAULT; thiz->max_frame_size = PROP_MAX_FRAME_SIZE_DEFAULT; + thiz->max_frame_size_i = PROP_MAX_FRAME_SIZE_I_DEFAULT; + thiz->max_frame_size_p = PROP_MAX_FRAME_SIZE_P_DEFAULT; thiz->max_vbv_bitrate = PROP_MAX_VBV_BITRATE_DEFAULT; thiz->accuracy = PROP_AVBR_ACCURACY_DEFAULT; thiz->convergence = PROP_AVBR_ACCURACY_DEFAULT; @@ -2118,6 +2318,7 @@ thiz->b_frames = PROP_B_FRAMES_DEFAULT; thiz->num_slices = PROP_NUM_SLICES_DEFAULT; thiz->mbbrc = PROP_MBBRC_DEFAULT; + thiz->lowdelay_brc = PROP_LOWDELAY_BRC_DEFAULT; thiz->adaptive_i = PROP_ADAPTIVE_I_DEFAULT; thiz->adaptive_b = PROP_ADAPTIVE_B_DEFAULT; @@ -2174,6 +2375,12 @@ case GST_MSDKENC_PROP_MAX_FRAME_SIZE: thiz->max_frame_size = g_value_get_uint (value); break; + case GST_MSDKENC_PROP_MAX_FRAME_SIZE_I: + thiz->max_frame_size_i = g_value_get_uint (value); + break; + case GST_MSDKENC_PROP_MAX_FRAME_SIZE_P: + thiz->max_frame_size_p = g_value_get_uint (value); + break; case GST_MSDKENC_PROP_MAX_VBV_BITRATE: thiz->max_vbv_bitrate = g_value_get_uint (value); break; @@ -2213,6 +2420,9 @@ case GST_MSDKENC_PROP_MBBRC: thiz->mbbrc = g_value_get_enum (value); break; + case GST_MSDKENC_PROP_LOWDELAY_BRC: + thiz->lowdelay_brc = g_value_get_enum (value); + break; case GST_MSDKENC_PROP_ADAPTIVE_I: thiz->adaptive_i = g_value_get_enum (value); break; @@ -2277,6 +2487,12 @@ case GST_MSDKENC_PROP_MAX_FRAME_SIZE: g_value_set_uint (value, thiz->max_frame_size); break; + case GST_MSDKENC_PROP_MAX_FRAME_SIZE_I: + g_value_set_uint (value, thiz->max_frame_size_i); + break; + case GST_MSDKENC_PROP_MAX_FRAME_SIZE_P: + g_value_set_uint (value, thiz->max_frame_size_p); + break; case GST_MSDKENC_PROP_MAX_VBV_BITRATE: g_value_set_uint (value, thiz->max_vbv_bitrate); break; @@ -2316,6 +2532,9 @@ case GST_MSDKENC_PROP_MBBRC: g_value_set_enum (value, thiz->mbbrc); break; + case GST_MSDKENC_PROP_LOWDELAY_BRC: + g_value_set_enum (value, thiz->lowdelay_brc); + break; case GST_MSDKENC_PROP_ADAPTIVE_I: g_value_set_enum (value, thiz->adaptive_i); break; @@ -2381,6 +2600,18 @@ 0, G_MAXUINT16, PROP_MAX_FRAME_SIZE_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + obj_propertiesGST_MSDKENC_PROP_MAX_FRAME_SIZE_I = + g_param_spec_uint ("max-frame-size-i", "Max Frame Size for I frame", + "Maximum possible size (in kbyte) of I frames (0: auto-calculate)", + 0, G_MAXUINT16, PROP_MAX_FRAME_SIZE_I_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + obj_propertiesGST_MSDKENC_PROP_MAX_FRAME_SIZE_P = + g_param_spec_uint ("max-frame-size-p", "Max Frame Size for P frame", + "Maximum possible size (in kbyte) of P frames (0: auto-calculate)", + 0, G_MAXUINT16, PROP_MAX_FRAME_SIZE_P_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + /* Set the same upper bound with bitrate */ obj_propertiesGST_MSDKENC_PROP_MAX_VBV_BITRATE = g_param_spec_uint ("max-vbv-bitrate", "Max VBV Bitrate", @@ -2460,6 +2691,12 @@ gst_msdkenc_mbbrc_get_type (), PROP_MBBRC_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + obj_propertiesGST_MSDKENC_PROP_LOWDELAY_BRC = + g_param_spec_enum ("lowdelay-brc", "Low delay bitrate control", + "Bitrate control for low-delay user scenarios", + gst_msdkenc_lowdelay_brc_get_type (), + PROP_LOWDELAY_BRC_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + obj_propertiesGST_MSDKENC_PROP_ADAPTIVE_I = g_param_spec_enum ("i-adapt", "Adaptive I-Frame Insertion", "Adaptive I-Frame Insertion control",
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkenc.h -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkenc.h
Changed
@@ -84,6 +84,9 @@ GST_MSDKENC_PROP_ADAPTIVE_I, GST_MSDKENC_PROP_ADAPTIVE_B, GST_MSDKENC_PROP_EXT_CODING_PROPS, + GST_MSDKENC_PROP_LOWDELAY_BRC, + GST_MSDKENC_PROP_MAX_FRAME_SIZE_I, + GST_MSDKENC_PROP_MAX_FRAME_SIZE_P, GST_MSDKENC_PROP_MAX, }; @@ -133,6 +136,8 @@ GstVideoInfo aligned_info; gboolean use_video_memory; gboolean use_dmabuf; + gboolean use_va; + gboolean use_d3d11; gboolean initialized; /* element properties */ @@ -158,6 +163,9 @@ gint16 mbbrc; gint16 adaptive_i; gint16 adaptive_b; + guint max_frame_size_i; + guint max_frame_size_p; + gint16 lowdelay_brc; GstStructure *ext_coding_props;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkh264dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkh264dec.c
Changed
@@ -54,6 +54,8 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkh264dec_debug); #define GST_CAT_DEFAULT gst_msdkh264dec_debug +#define COMMON_FORMAT "{ NV12, BGRA, BGRx }" + static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, @@ -63,6 +65,12 @@ "profile = (string) { high, progressive-high, constrained-high, main, baseline, constrained-baseline }") ); +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, COMMON_FORMAT)) + ); + #define gst_msdkh264dec_parent_class parent_class G_DEFINE_TYPE (GstMsdkH264Dec, gst_msdkh264dec, GST_TYPE_MSDKDEC); @@ -181,6 +189,7 @@ #endif gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_element_class_add_static_pad_template (element_class, &src_factory); } static void
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkh264enc.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkh264enc.c
Changed
@@ -74,6 +74,9 @@ PROP_MIN_QP, PROP_MAX_QP, PROP_INTRA_REFRESH_TYPE, + PROP_INTRA_REFRESH_CYCLE_SIZE, + PROP_INTRA_REFRESH_QP_DELTA, + PROP_INTRA_REFRESH_CYCLE_DIST, PROP_DBLK_IDC, }; @@ -83,19 +86,22 @@ GST_MSDK_FLAG_TUNE_MODE = 1 << 1, }; -#define PROP_CABAC_DEFAULT TRUE -#define PROP_LOWPOWER_DEFAULT FALSE -#define PROP_FRAME_PACKING_DEFAULT -1 -#define PROP_RC_LA_DOWNSAMPLING_DEFAULT MFX_LOOKAHEAD_DS_UNKNOWN -#define PROP_TRELLIS_DEFAULT _MFX_TRELLIS_NONE -#define PROP_MAX_SLICE_SIZE_DEFAULT 0 -#define PROP_B_PYRAMID_DEFAULT FALSE -#define PROP_TUNE_MODE_DEFAULT MFX_CODINGOPTION_UNKNOWN -#define PROP_P_PYRAMID_DEFAULT FALSE -#define PROP_MIN_QP_DEFAULT 0 -#define PROP_MAX_QP_DEFAULT 0 -#define PROP_INTRA_REFRESH_TYPE_DEFAULT MFX_REFRESH_NO -#define PROP_DBLK_IDC_DEFAULT 0 +#define PROP_CABAC_DEFAULT TRUE +#define PROP_LOWPOWER_DEFAULT FALSE +#define PROP_FRAME_PACKING_DEFAULT -1 +#define PROP_RC_LA_DOWNSAMPLING_DEFAULT MFX_LOOKAHEAD_DS_UNKNOWN +#define PROP_TRELLIS_DEFAULT _MFX_TRELLIS_NONE +#define PROP_MAX_SLICE_SIZE_DEFAULT 0 +#define PROP_B_PYRAMID_DEFAULT FALSE +#define PROP_TUNE_MODE_DEFAULT MFX_CODINGOPTION_UNKNOWN +#define PROP_P_PYRAMID_DEFAULT FALSE +#define PROP_MIN_QP_DEFAULT 0 +#define PROP_MAX_QP_DEFAULT 0 +#define PROP_INTRA_REFRESH_TYPE_DEFAULT MFX_REFRESH_NO +#define PROP_INTRA_REFRESH_CYCLE_SIZE_DEFAULT 0 +#define PROP_INTRA_REFRESH_QP_DELTA_DEFAULT 0 +#define PROP_INTRA_REFRESH_CYCLE_DIST_DEFAULT 0 +#define PROP_DBLK_IDC_DEFAULT 0 static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, @@ -342,7 +348,7 @@ frame_packing->frame_packing_type = (mode == GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE ? GST_H264_FRAME_PACKING_SIDE_BY_SIDE : - GST_H264_FRMAE_PACKING_TOP_BOTTOM); + GST_H264_FRAME_PACKING_TOP_BOTTOM); /* we don't do this */ frame_packing->quincunx_sampling_flag = 0; /* 0: unspecified */ @@ -398,6 +404,10 @@ (thiz->cabac ? MFX_CODINGOPTION_OFF : MFX_CODINGOPTION_ON); } + if (encoder->option3.LowDelayBRC == MFX_CODINGOPTION_ON) { + thiz->option.NalHrdConformance = MFX_CODINGOPTION_OFF; + } + gst_msdkenc_add_extra_param (encoder, (mfxExtBuffer *) & thiz->option); encoder->option2.Trellis = thiz->trellis ? thiz->trellis : MFX_TRELLIS_OFF; @@ -407,6 +417,8 @@ encoder->option2.MaxQPI = encoder->option2.MaxQPP = encoder->option2.MaxQPB = thiz->max_qp; encoder->option2.IntRefType = thiz->intra_refresh_type; + encoder->option2.IntRefCycleSize = thiz->intra_refresh_cycle_size; + encoder->option2.IntRefQPDelta = thiz->intra_refresh_qp_delta; encoder->option2.DisableDeblockingIdc = thiz->dblk_idc; if (encoder->rate_control == MFX_RATECONTROL_LA || @@ -427,6 +439,9 @@ encoder->param.mfx.GopRefDist = 1; /* SDK decides the DPB size for P pyramid */ encoder->param.mfx.NumRefFrame = 0; + } + if (thiz->intra_refresh_cycle_dist) { + encoder->option3.IntRefCycleDist = thiz->intra_refresh_cycle_dist; encoder->enable_extopt3 = TRUE; } @@ -611,6 +626,15 @@ case PROP_INTRA_REFRESH_TYPE: thiz->intra_refresh_type = g_value_get_enum (value); break; + case PROP_INTRA_REFRESH_CYCLE_SIZE: + thiz->intra_refresh_cycle_size = g_value_get_uint (value); + break; + case PROP_INTRA_REFRESH_QP_DELTA: + thiz->intra_refresh_qp_delta = g_value_get_int (value); + break; + case PROP_INTRA_REFRESH_CYCLE_DIST: + thiz->intra_refresh_cycle_dist = g_value_get_uint (value); + break; case PROP_DBLK_IDC: thiz->dblk_idc = g_value_get_uint (value); break; @@ -671,6 +695,15 @@ case PROP_INTRA_REFRESH_TYPE: g_value_set_enum (value, thiz->intra_refresh_type); break; + case PROP_INTRA_REFRESH_CYCLE_SIZE: + g_value_set_uint (value, thiz->intra_refresh_cycle_size); + break; + case PROP_INTRA_REFRESH_QP_DELTA: + g_value_set_int (value, thiz->intra_refresh_qp_delta); + break; + case PROP_INTRA_REFRESH_CYCLE_DIST: + g_value_set_uint (value, thiz->intra_refresh_cycle_dist); + break; case PROP_DBLK_IDC: g_value_set_uint (value, thiz->dblk_idc); break; @@ -799,6 +832,24 @@ PROP_INTRA_REFRESH_TYPE_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_INTRA_REFRESH_CYCLE_SIZE, + g_param_spec_uint ("intra-refresh-cycle-size", "Intra refresh cycle size", + "Set intra refresh cycle size, valid value starts from 2", + 0, G_MAXUINT16, PROP_INTRA_REFRESH_CYCLE_SIZE_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_INTRA_REFRESH_QP_DELTA, + g_param_spec_int ("intra-refresh-qp-delta", "Intra refresh qp delta", + "Set intra refresh qp delta", + -51, 51, PROP_INTRA_REFRESH_QP_DELTA_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_INTRA_REFRESH_CYCLE_DIST, + g_param_spec_uint ("intra-refresh-cycle-dist", "Intra refresh cycle dist", + "Set intra refresh cycle dist", + 0, G_MAXUINT16, PROP_INTRA_REFRESH_CYCLE_DIST_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_DBLK_IDC, g_param_spec_uint ("dblk-idc", "Disable Deblocking Idc", "Option of disable deblocking idc", @@ -827,5 +878,8 @@ thiz->min_qp = PROP_MIN_QP_DEFAULT; thiz->max_qp = PROP_MAX_QP_DEFAULT; thiz->intra_refresh_type = PROP_INTRA_REFRESH_TYPE_DEFAULT; + thiz->intra_refresh_cycle_size = PROP_INTRA_REFRESH_CYCLE_SIZE_DEFAULT; + thiz->intra_refresh_qp_delta = PROP_INTRA_REFRESH_QP_DELTA_DEFAULT; + thiz->intra_refresh_cycle_dist = PROP_INTRA_REFRESH_CYCLE_DIST_DEFAULT; thiz->dblk_idc = PROP_DBLK_IDC_DEFAULT; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkh264enc.h -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkh264enc.h
Changed
@@ -75,6 +75,9 @@ guint min_qp; guint max_qp; guint intra_refresh_type; + guint intra_refresh_cycle_size; + gint intra_refresh_qp_delta; + guint intra_refresh_cycle_dist; guint dblk_idc; GstH264NalParser *parser;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkh265dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkh265dec.c
Changed
@@ -56,7 +56,7 @@ #define GST_CAT_DEFAULT gst_msdkh265dec_debug #define COMMON_FORMAT \ - "{ NV12, P010_10LE, YUY2, Y210, VUYA, Y410, P012_LE, Y212_LE, Y412_LE }" + "{ NV12, P010_10LE, YUY2, Y210, VUYA, Y410, P012_LE, Y212_LE, Y412_LE, BGRA, BGRx }" /* TODO: update both sink and src dynamically */ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkh265enc.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkh265enc.c
Changed
@@ -73,6 +73,9 @@ PROP_MIN_QP, PROP_MAX_QP, PROP_INTRA_REFRESH_TYPE, + PROP_INTRA_REFRESH_CYCLE_SIZE, + PROP_INTRA_REFRESH_QP_DELTA, + PROP_INTRA_REFRESH_CYCLE_DIST, PROP_DBLK_IDC, }; @@ -82,18 +85,21 @@ GST_MSDK_FLAG_TUNE_MODE = 1 << 1, }; -#define PROP_LOWPOWER_DEFAULT FALSE -#define PROP_TILE_ROW_DEFAULT 1 -#define PROP_TILE_COL_DEFAULT 1 -#define PROP_MAX_SLICE_SIZE_DEFAULT 0 -#define PROP_TUNE_MODE_DEFAULT MFX_CODINGOPTION_UNKNOWN -#define PROP_TRANSFORM_SKIP_DEFAULT MFX_CODINGOPTION_UNKNOWN -#define PROP_B_PYRAMID_DEFAULT FALSE -#define PROP_P_PYRAMID_DEFAULT FALSE -#define PROP_MIN_QP_DEFAULT 0 -#define PROP_MAX_QP_DEFAULT 0 -#define PROP_INTRA_REFRESH_TYPE_DEFAULT MFX_REFRESH_NO -#define PROP_DBLK_IDC_DEFAULT 0 +#define PROP_LOWPOWER_DEFAULT FALSE +#define PROP_TILE_ROW_DEFAULT 1 +#define PROP_TILE_COL_DEFAULT 1 +#define PROP_MAX_SLICE_SIZE_DEFAULT 0 +#define PROP_TUNE_MODE_DEFAULT MFX_CODINGOPTION_UNKNOWN +#define PROP_TRANSFORM_SKIP_DEFAULT MFX_CODINGOPTION_UNKNOWN +#define PROP_B_PYRAMID_DEFAULT FALSE +#define PROP_P_PYRAMID_DEFAULT FALSE +#define PROP_MIN_QP_DEFAULT 0 +#define PROP_MAX_QP_DEFAULT 0 +#define PROP_INTRA_REFRESH_TYPE_DEFAULT MFX_REFRESH_NO +#define PROP_INTRA_REFRESH_CYCLE_SIZE_DEFAULT 0 +#define PROP_INTRA_REFRESH_QP_DELTA_DEFAULT 0 +#define PROP_INTRA_REFRESH_CYCLE_DIST_DEFAULT 0 +#define PROP_DBLK_IDC_DEFAULT 0 #define RAW_FORMATS "NV12, I420, YV12, YUY2, UYVY, BGRA, BGR10A2_LE, P010_10LE, VUYA" #define PROFILES "main, main-10, main-444, main-still-picture, main-10-still-picture" @@ -130,11 +136,21 @@ #define PRFOLIE_STR "{ " PROFILES_1032 " }" #endif +#ifdef _WIN32 static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, - "{ NV12, P010_10LE }"))); + "{ NV12, P010_10LE }") "; " + GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE ("{ NV12, P010_10LE }"))); +#else +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, + "{ NV12, P010_10LE }") "; " + GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("NV12"))); +#endif static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, @@ -488,9 +504,19 @@ h265enc->min_qp; encoder->option2.MaxQPI = encoder->option2.MaxQPP = encoder->option2.MaxQPB = h265enc->max_qp; - encoder->option2.IntRefType = h265enc->intra_refresh_type; encoder->option2.DisableDeblockingIdc = h265enc->dblk_idc; + if (h265enc->tune_mode == 16 || h265enc->lowpower) { + encoder->option2.IntRefType = h265enc->intra_refresh_type; + encoder->option2.IntRefCycleSize = h265enc->intra_refresh_cycle_size; + encoder->option2.IntRefQPDelta = h265enc->intra_refresh_qp_delta; + encoder->option3.IntRefCycleDist = h265enc->intra_refresh_cycle_dist; + encoder->enable_extopt3 = TRUE; + } else if (h265enc->intra_refresh_type || h265enc->intra_refresh_cycle_size + || h265enc->intra_refresh_qp_delta || h265enc->intra_refresh_cycle_dist) { + GST_WARNING_OBJECT (h265enc, + "Intra refresh is only supported under lowpower mode, ingoring..."); + } #if (MFX_VERSION >= 1026) if (h265enc->transform_skip != MFX_CODINGOPTION_UNKNOWN) { encoder->option3.TransformSkip = h265enc->transform_skip; @@ -514,6 +540,13 @@ encoder->enable_extopt3 = TRUE; } + if (encoder->option3.LowDelayBRC == MFX_CODINGOPTION_ON) { + h265enc->option.Header.BufferId = MFX_EXTBUFF_CODING_OPTION; + h265enc->option.Header.BufferSz = sizeof (h265enc->option); + h265enc->option.NalHrdConformance = MFX_CODINGOPTION_OFF; + gst_msdkenc_add_extra_param (encoder, (mfxExtBuffer *) & h265enc->option); + } + gst_msdkenc_ensure_extended_coding_options (encoder); if (h265enc->num_tile_rows > 1 || h265enc->num_tile_cols > 1) { @@ -721,6 +754,18 @@ thiz->intra_refresh_type = g_value_get_enum (value); break; + case PROP_INTRA_REFRESH_CYCLE_SIZE: + thiz->intra_refresh_cycle_size = g_value_get_uint (value); + break; + + case PROP_INTRA_REFRESH_QP_DELTA: + thiz->intra_refresh_qp_delta = g_value_get_int (value); + break; + + case PROP_INTRA_REFRESH_CYCLE_DIST: + thiz->intra_refresh_cycle_dist = g_value_get_uint (value); + break; + case PROP_DBLK_IDC: thiz->dblk_idc = g_value_get_uint (value); break; @@ -789,6 +834,18 @@ g_value_set_enum (value, thiz->intra_refresh_type); break; + case PROP_INTRA_REFRESH_CYCLE_SIZE: + g_value_set_uint (value, thiz->intra_refresh_cycle_size); + break; + + case PROP_INTRA_REFRESH_QP_DELTA: + g_value_set_int (value, thiz->intra_refresh_qp_delta); + break; + + case PROP_INTRA_REFRESH_CYCLE_DIST: + g_value_set_uint (value, thiz->intra_refresh_cycle_dist); + break; + case PROP_DBLK_IDC: g_value_set_uint (value, thiz->dblk_idc); break; @@ -948,6 +1005,24 @@ PROP_INTRA_REFRESH_TYPE_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_INTRA_REFRESH_CYCLE_SIZE, + g_param_spec_uint ("intra-refresh-cycle-size", "Intra refresh cycle size", + "Set intra refresh cycle size, valid value starts from 2, only available when tune=low-power", + 0, G_MAXUINT16, PROP_INTRA_REFRESH_CYCLE_SIZE_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_INTRA_REFRESH_QP_DELTA, + g_param_spec_int ("intra-refresh-qp-delta", "Intra refresh qp delta", + "Set intra refresh qp delta, only available when tune=low-power", + -51, 51, PROP_INTRA_REFRESH_QP_DELTA_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_INTRA_REFRESH_CYCLE_DIST, + g_param_spec_uint ("intra-refresh-cycle-dist", "Intra refresh cycle dist", + "Set intra refresh cycle dist, only available when tune=low-power", + 0, G_MAXUINT16, PROP_INTRA_REFRESH_CYCLE_DIST_DEFAULT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_DBLK_IDC, g_param_spec_uint ("dblk-idc", "Disable Deblocking Idc", "Option of disable deblocking idc", @@ -979,6 +1054,9 @@ thiz->min_qp = PROP_MIN_QP_DEFAULT; thiz->max_qp = PROP_MAX_QP_DEFAULT; thiz->intra_refresh_type = PROP_INTRA_REFRESH_TYPE_DEFAULT; + thiz->intra_refresh_cycle_size = PROP_INTRA_REFRESH_CYCLE_SIZE_DEFAULT; + thiz->intra_refresh_qp_delta = PROP_INTRA_REFRESH_QP_DELTA_DEFAULT; + thiz->intra_refresh_cycle_dist = PROP_INTRA_REFRESH_CYCLE_DIST_DEFAULT; thiz->dblk_idc = PROP_DBLK_IDC_DEFAULT; msdk_enc->num_extra_frames = 1; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkh265enc.h -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkh265enc.h
Changed
@@ -68,10 +68,15 @@ guint min_qp; guint max_qp; guint intra_refresh_type; + guint intra_refresh_cycle_size; + gint intra_refresh_qp_delta; + guint intra_refresh_cycle_dist; guint dblk_idc; mfxExtHEVCTiles ext_tiles; mfxExtHEVCParam ext_param; + + mfxExtCodingOption option; /* roi0 for current ROI and roi1 for previous ROI */ mfxExtEncoderROI roi2;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkmjpegdec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkmjpegdec.c
Changed
@@ -89,6 +89,16 @@ of Interleaved samples, so let's hardcode it for now */ decoder->param.mfx.InterleavedDec = MFX_SCANTYPE_NONINTERLEAVED; +#if (MFX_VERSION >= 2006) + if (decoder->report_error) { + decoder->error_report.Header.BufferId = MFX_EXTBUFF_DECODE_ERROR_REPORT; + decoder->error_report.Header.BufferSz = sizeof (decoder->error_report); + decoder->error_report.ErrorTypes = 0; + gst_msdkdec_add_bs_extra_param (decoder, + (mfxExtBuffer *) & decoder->error_report); + } +#endif + return TRUE; } @@ -110,14 +120,74 @@ } static void +gst_msdkdec_mjpeg_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMsdkMJPEGDec *thiz = GST_MSDKMJPEGDEC (object); +#if (MFX_VERSION >= 2006) + GstMsdkDec *dec = GST_MSDKDEC (object); +#endif + GstState state; + + GST_OBJECT_LOCK (thiz); + state = GST_STATE (thiz); + + if (!gst_msdkdec_prop_check_state (state, pspec)) { + GST_WARNING_OBJECT (thiz, "setting property in wrong state"); + GST_OBJECT_UNLOCK (thiz); + return; + } + switch (prop_id) { +#if (MFX_VERSION >= 2006) + case GST_MSDKDEC_PROP_ERROR_REPORT: + dec->report_error = g_value_get_boolean (value); + break; +#endif + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (thiz); + return; +} + +static void +gst_msdkdec_mjpeg_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstMsdkMJPEGDec *thiz = GST_MSDKMJPEGDEC (object); +#if (MFX_VERSION >= 2006) + GstMsdkDec *dec = GST_MSDKDEC (object); +#endif + + GST_OBJECT_LOCK (thiz); + switch (prop_id) { +#if (MFX_VERSION >= 2006) + case GST_MSDKDEC_PROP_ERROR_REPORT: + g_value_set_boolean (value, dec->report_error); + break; +#endif + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (thiz); +} + +static void gst_msdkmjpegdec_class_init (GstMsdkMJPEGDecClass * klass) { + GObjectClass *gobject_class; GstElementClass *element_class; GstMsdkDecClass *decoder_class; + gobject_class = G_OBJECT_CLASS (klass); element_class = GST_ELEMENT_CLASS (klass); decoder_class = GST_MSDKDEC_CLASS (klass); + gobject_class->set_property = gst_msdkdec_mjpeg_set_property; + gobject_class->get_property = gst_msdkdec_mjpeg_get_property; + decoder_class->configure = GST_DEBUG_FUNCPTR (gst_msdkmjpegdec_configure); decoder_class->post_configure = GST_DEBUG_FUNCPTR (gst_msdkmjpegdec_post_configure); @@ -128,6 +198,10 @@ "MJPEG video decoder based on " MFX_API_SDK, "Scott D Phillips <scott.d.phillips@intel.com>"); +#if (MFX_VERSION >= 2006) + gst_msdkdec_prop_install_error_report_property (gobject_class); +#endif + gst_element_class_add_static_pad_template (element_class, &sink_factory); gst_element_class_add_static_pad_template (element_class, &src_factory); }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkvp9enc.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkvp9enc.c
Changed
@@ -67,11 +67,21 @@ #define SRC_PROFILES "{ " PROFILES " }" #endif +#ifdef _WIN32 static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, - "{ NV12, P010_10LE }"))); + "{ NV12, P010_10LE }") "; " + GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE ("{ NV12, P010_10LE }"))); +#else +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, + "{ NV12, P010_10LE }") "; " + GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("NV12"))); +#endif static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC,
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkvpp.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkvpp.c
Changed
@@ -64,10 +64,13 @@ #ifndef _WIN32 #include "gstmsdkallocator_libva.h" +#include <gst/va/gstvaallocator.h> #if VA_CHECK_VERSION(1, 4, 1) #undef EXT_FORMATS #define EXT_FORMATS ", BGR10A2_LE" #endif +#else +#include <gst/d3d11/gstd3d11.h> #endif #if (MFX_VERSION >= 2004) @@ -97,6 +100,10 @@ "{ NV12, YV12, I420, YUY2, UYVY, VUYA, BGRA, BGRx, P010_10LE" EXT_SINK_FORMATS "}" #define SUPPORTED_DMABUF_FORMAT \ "{ NV12, BGRA, YUY2, UYVY, VUYA, P010_10LE" EXT_SINK_FORMATS "}" +#define SUPPORTED_VA_FORMAT \ + "{ NV12, VUYA, P010_10LE }" +#define SUPPORTED_D3D11_FORMAT \ + "{ NV12, VUYA, P010_10LE }" #define SRC_SYSTEM_FORMAT \ "{ NV12, BGRA, YUY2, UYVY, VUYA, BGRx, P010_10LE" EXT_FORMATS EXT_SRC_FORMATS "}" #define SRC_DMABUF_FORMAT \ @@ -105,27 +112,33 @@ #ifndef _WIN32 #define DMABUF_SINK_CAPS_STR \ GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_DMABUF, \ - SUPPORTED_DMABUF_FORMAT) + SUPPORTED_DMABUF_FORMAT) ";" +#define VA_SINK_CAPS_STR \ + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory", SUPPORTED_VA_FORMAT) #else -#define DMABUF_SINK_CAPS_STR "" +#define D3D11_SINK_CAPS_STR \ + GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE (SUPPORTED_D3D11_FORMAT) #endif #ifndef _WIN32 #define DMABUF_SRC_CAPS_STR \ GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_DMABUF, \ SRC_DMABUF_FORMAT) ";" +#define VA_SRC_CAPS_STR \ + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory", SUPPORTED_VA_FORMAT) #else -#define DMABUF_SRC_CAPS_STR "" +#define D3D11_SRC_CAPS_STR \ + GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE (SUPPORTED_D3D11_FORMAT) #endif - +#ifndef _WIN32 static GstStaticPadTemplate gst_msdkvpp_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (SUPPORTED_SYSTEM_FORMAT) ", " "interlace-mode = (string){ progressive, interleaved, mixed }" ";" - DMABUF_SINK_CAPS_STR)); + DMABUF_SINK_CAPS_STR VA_SINK_CAPS_STR)); static GstStaticPadTemplate gst_msdkvpp_src_factory = GST_STATIC_PAD_TEMPLATE ("src", @@ -133,8 +146,25 @@ GST_PAD_ALWAYS, GST_STATIC_CAPS (DMABUF_SRC_CAPS_STR GST_VIDEO_CAPS_MAKE (SRC_SYSTEM_FORMAT) ", " - "interlace-mode = (string){ progressive, interleaved, mixed }" ";")); + "interlace-mode = (string){ progressive, interleaved, mixed }" ";" + VA_SRC_CAPS_STR)); +#else +static GstStaticPadTemplate gst_msdkvpp_sink_factory = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (SUPPORTED_SYSTEM_FORMAT) + ", " "interlace-mode = (string){ progressive, interleaved, mixed }" ";" + D3D11_SINK_CAPS_STR)); +static GstStaticPadTemplate gst_msdkvpp_src_factory = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (SRC_SYSTEM_FORMAT) ", " + "interlace-mode = (string){ progressive, interleaved, mixed }" ";" + D3D11_SRC_CAPS_STR)); +#endif enum { PROP_0, @@ -194,23 +224,18 @@ #define gst_msdkvpp_parent_class parent_class G_DEFINE_TYPE (GstMsdkVPP, gst_msdkvpp, GST_TYPE_BASE_TRANSFORM); -typedef struct -{ - mfxFrameSurface1 *surface; - GstBuffer *buf; -} MsdkSurface; - static void free_msdk_surface (gpointer p) { - MsdkSurface *surface = (MsdkSurface *) p; + GstMsdkSurface *surface = (GstMsdkSurface *) p; if (surface->buf) gst_buffer_unref (surface->buf); - g_slice_free (MsdkSurface, surface); + g_slice_free (GstMsdkSurface, surface); } static void -release_msdk_surface (GstMsdkVPP * thiz, MsdkSurface * surface, GList ** list) +release_msdk_surface (GstMsdkVPP * thiz, GstMsdkSurface * surface, + GList ** list) { if (surface->surface) { if (surface->surface->Data.Locked) { @@ -222,7 +247,7 @@ } static void -release_in_surface (GstMsdkVPP * thiz, MsdkSurface * surface, +release_in_surface (GstMsdkVPP * thiz, GstMsdkSurface * surface, gboolean locked_by_others) { if (locked_by_others) { @@ -235,7 +260,7 @@ } static void -release_out_surface (GstMsdkVPP * thiz, MsdkSurface * surface) +release_out_surface (GstMsdkVPP * thiz, GstMsdkSurface * surface) { release_msdk_surface (thiz, surface, &thiz->locked_out_surfaces); } @@ -244,7 +269,7 @@ free_unlocked_msdk_surfaces_from_list (GstMsdkVPP * thiz, GList ** list) { GList *l; - MsdkSurface *surface; + GstMsdkSurface *surface; for (l = *list; l;) { GList *next = l->next; @@ -339,8 +364,8 @@ GstMsdkVPP *thiz = GST_MSDKVPP (trans); if (!gst_msdkvpp_context_prepare (thiz)) { - if (!gst_msdk_context_ensure_context (GST_ELEMENT_CAST (thiz), - thiz->hardware, GST_MSDK_JOB_VPP)) + if (!gst_msdk_ensure_new_context (GST_ELEMENT_CAST (thiz), + thiz->hardware, GST_MSDK_JOB_VPP, &thiz->context)) return FALSE; GST_INFO_OBJECT (thiz, "Creating new context %" GST_PTR_FORMAT, thiz->context); @@ -404,59 +429,138 @@ return *outbuf_ptr ? GST_FLOW_OK : GST_FLOW_ERROR; } +#ifndef _WIN32 +static GstBufferPool * +gst_msdk_create_va_pool (GstVideoInfo * info, GstMsdkContext * msdk_context, + gboolean use_dmabuf, guint min_buffers) +{ + GstBufferPool *pool = NULL; + GstAllocator *allocator; + GArray *formats = NULL; + GstAllocationParams alloc_params = { 0, 31, 0, 0 }; + GstVaDisplay *display = NULL; + GstCaps *aligned_caps = NULL; + + display = (GstVaDisplay *) gst_msdk_context_get_va_display (msdk_context); + + if (use_dmabuf) + allocator = gst_va_dmabuf_allocator_new (display); + else { + formats = g_array_new (FALSE, FALSE, sizeof (GstVideoFormat)); + g_array_append_val (formats, GST_VIDEO_INFO_FORMAT (info)); + allocator = gst_va_allocator_new (display, formats); + } + if (!allocator) { + GST_ERROR ("Failed to create allocator"); + if (formats) + g_array_unref (formats); + return NULL; + } + aligned_caps = gst_video_info_to_caps (info); + pool = + gst_va_pool_new_with_config (aligned_caps, + GST_VIDEO_INFO_SIZE (info), min_buffers, 0, + VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC, GST_VA_FEATURE_AUTO, + allocator, &alloc_params); + + gst_object_unref (allocator); + gst_caps_unref (aligned_caps); + + return pool; +} +#else +static GstBufferPool * +gst_msdk_create_d3d11_pool (GstMsdkVPP * thiz, GstVideoInfo * info, + guint num_buffers, gboolean propose) +{ + GstBufferPool *pool = NULL; + GstD3D11Device *device; + GstStructure *config; + GstD3D11AllocationParams *params; + GstD3D11Format device_format; + guint bind_flags = 0; + GstCaps *aligned_caps = NULL; + GstVideoInfo aligned_info; + gint aligned_width; + gint aligned_height; + + device = gst_msdk_context_get_d3d11_device (thiz->context); + + aligned_width = GST_ROUND_UP_16 (info->width); + aligned_height = GST_ROUND_UP_32 (info->height); + + gst_video_info_set_interlaced_format (&aligned_info, + GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_INTERLACE_MODE (info), + aligned_width, aligned_height); + + gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (&aligned_info), + &device_format); + if (!propose + && ((device_format.format_support0 & D3D11_FORMAT_SUPPORT_RENDER_TARGET) + == D3D11_FORMAT_SUPPORT_RENDER_TARGET)) { + bind_flags = D3D11_BIND_RENDER_TARGET; + } + + aligned_caps = gst_video_info_to_caps (&aligned_info); + + pool = gst_d3d11_buffer_pool_new (device); + config = gst_buffer_pool_get_config (pool); + params = gst_d3d11_allocation_params_new (device, &aligned_info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, bind_flags, + D3D11_RESOURCE_MISC_SHARED); + + gst_buffer_pool_config_set_d3d11_allocation_params (config, params); + gst_d3d11_allocation_params_free (params); + gst_buffer_pool_config_set_params (config, aligned_caps, + GST_VIDEO_INFO_SIZE (&aligned_info), num_buffers, 0); + gst_buffer_pool_set_config (pool, config); + + gst_caps_unref (aligned_caps); + GST_LOG_OBJECT (thiz, "Creating d3d11 pool"); + + return pool; +} +#endif + static GstBufferPool * gst_msdkvpp_create_buffer_pool (GstMsdkVPP * thiz, GstPadDirection direction, - GstCaps * caps, guint min_num_buffers) + GstCaps * caps, guint min_num_buffers, gboolean propose) { GstBufferPool *pool = NULL; GstStructure *config; - GstAllocator *allocator = NULL; GstVideoInfo info; GstVideoInfo *pool_info = NULL; GstVideoAlignment align; - GstAllocationParams params = { 0, 31, 0, 0, }; - mfxFrameAllocResponse *alloc_resp = NULL; gboolean use_dmabuf = FALSE; if (direction == GST_PAD_SINK) { - alloc_resp = &thiz->in_alloc_resp; pool_info = &thiz->sinkpad_buffer_pool_info; use_dmabuf = thiz->use_sinkpad_dmabuf; } else if (direction == GST_PAD_SRC) { - alloc_resp = &thiz->out_alloc_resp; pool_info = &thiz->srcpad_buffer_pool_info; use_dmabuf = thiz->use_srcpad_dmabuf; } - pool = gst_msdk_buffer_pool_new (thiz->context, alloc_resp); - if (!pool) - goto error_no_pool; - - if (!gst_video_info_from_caps (&info, caps)) + if (!gst_video_info_from_caps (&info, caps)) { goto error_no_video_info; + } gst_msdk_set_video_alignment (&info, 0, 0, &align); gst_video_info_align (&info, &align); - if (use_dmabuf) - allocator = - gst_msdk_dmabuf_allocator_new (thiz->context, &info, alloc_resp); - else if (thiz->use_video_memory) - allocator = gst_msdk_video_allocator_new (thiz->context, &info, alloc_resp); - else - allocator = gst_msdk_system_allocator_new (&info); +#ifndef _WIN32 + pool = gst_msdk_create_va_pool (&info, thiz->context, use_dmabuf, + min_num_buffers); +#else + pool = gst_msdk_create_d3d11_pool (thiz, &info, min_num_buffers, propose); +#endif + if (!thiz->use_video_memory) + pool = gst_video_buffer_pool_new (); - if (!allocator) - goto error_no_allocator; + if (!pool) + goto error_no_pool; config = gst_buffer_pool_get_config (GST_BUFFER_POOL_CAST (pool)); - /* we do not support dynamic buffer count change */ - gst_buffer_pool_config_set_params (config, caps, info.size, min_num_buffers, - min_num_buffers); - - gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); - gst_buffer_pool_config_add_option (config, - GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); if (thiz->use_video_memory) { gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_MSDK_USE_VIDEO_MEMORY); @@ -465,14 +569,17 @@ GST_BUFFER_POOL_OPTION_MSDK_USE_DMABUF); } + gst_buffer_pool_config_set_params (config, caps, + GST_VIDEO_INFO_SIZE (&info), min_num_buffers, 0); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); gst_buffer_pool_config_set_video_alignment (config, &align); - gst_buffer_pool_config_set_allocator (config, allocator, ¶ms); - gst_object_unref (allocator); if (!gst_buffer_pool_set_config (pool, config)) goto error_pool_config; - /* Updating pool_info with aligned info of allocator */ + /* Updating pool_info with info which used to config pool */ *pool_info = info; return pool; @@ -488,17 +595,10 @@ gst_object_unref (pool); return NULL; } -error_no_allocator: - { - GST_INFO_OBJECT (thiz, "Failed to create allocator"); - gst_object_unref (pool); - return NULL; - } error_pool_config: { GST_INFO_OBJECT (thiz, "Failed to set config"); gst_object_unref (pool); - gst_object_unref (allocator); return NULL; } } @@ -553,23 +653,15 @@ min_buffers = SRC_POOL_SIZE_DEFAULT; } - /* Always create a pool for vpp out buffers. Each of the msdk element - * has to create it's own mfxsurfacepool which is an msdk constraint. - * For eg: Each Msdk component (vpp, dec and enc) will invoke the external - * Frame allocator for video-memory usage.So sharing the pool between - * gst-msdk elements might not be a good idea, rather each element - * can check the buffer type (whether it is from msdk-buffer pool) - * to make sure there is no copy. Since we share the context between - * msdk elements, using buffers from one sdk's framealloator in another - * sdk-components is perfectly fine */ - gst_msdk_frame_free (thiz->context, &thiz->out_alloc_resp); - + /* Always create a pool for vpp out buffers. For vpp, we don't use + * external mfxFrameAllocator for video-memory allocation. */ request = thiz->request1; min_buffers += thiz->async_depth + request.NumFrameSuggested; request.NumFrameSuggested = min_buffers; - gst_msdk_frame_alloc (thiz->context, &request, &thiz->out_alloc_resp); - pool = gst_msdkvpp_create_buffer_pool (thiz, GST_PAD_SRC, caps, min_buffers); + pool = + gst_msdkvpp_create_buffer_pool (thiz, GST_PAD_SRC, caps, min_buffers, + FALSE); if (!pool) return NULL; /* we do not support dynamic buffer count change */ @@ -599,12 +691,13 @@ GST_ERROR_OBJECT (thiz, "Failed to get video info"); return FALSE; } - /* if downstream allocation query supports dmabuf-capsfeatures, - * we do allocate dmabuf backed memory */ + /* We allocate the memory of type that downstream allocation requests */ +#ifndef _WIN32 if (_gst_caps_has_feature (caps, GST_CAPS_FEATURE_MEMORY_DMABUF)) { GST_INFO_OBJECT (thiz, "MSDK VPP srcpad uses DMABuf memory"); thiz->use_srcpad_dmabuf = TRUE; } +#endif if (gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL)) thiz->add_video_meta = TRUE; @@ -661,14 +754,14 @@ /* alwys provide a new pool for upstream to help re-negotiation * more info here: https://bugzilla.gnome.org/show_bug.cgi?id=748344 */ pool = gst_msdkvpp_create_buffer_pool (thiz, GST_PAD_SINK, caps, - min_buffers); + min_buffers, TRUE); } /* Update the internal pool if any allocation attribute changed */ if (!gst_video_info_is_equal (&thiz->sinkpad_buffer_pool_info, &info)) { gst_object_unref (thiz->sinkpad_buffer_pool); thiz->sinkpad_buffer_pool = gst_msdkvpp_create_buffer_pool (thiz, - GST_PAD_SINK, caps, min_buffers); + GST_PAD_SINK, caps, min_buffers, FALSE); } /* get the size and allocator params from configured pool and set it in query */ @@ -692,13 +785,13 @@ decide_query, query); } -static MsdkSurface * -get_surface_from_pool (GstMsdkVPP * thiz, GstBufferPool * pool, - GstBufferPoolAcquireParams * params) +static GstMsdkSurface * +gst_msdkvpp_get_surface_from_pool (GstMsdkVPP * thiz, GstBufferPool * pool, + GstBuffer * buf) { - GstBuffer *new_buffer; - mfxFrameSurface1 *new_surface; - MsdkSurface *msdk_surface; + GstBuffer *upload_buf; + GstMsdkSurface *msdk_surface = NULL; + GstVideoFrame src_frame, dst_frame; if (!gst_buffer_pool_is_active (pool) && !gst_buffer_pool_set_active (pool, TRUE)) { @@ -706,155 +799,98 @@ return NULL; } - if (gst_buffer_pool_acquire_buffer (pool, &new_buffer, params) != GST_FLOW_OK) { + if (gst_buffer_pool_acquire_buffer (pool, &upload_buf, NULL) != GST_FLOW_OK) { GST_ERROR_OBJECT (pool, "failed to acquire a buffer from pool"); return NULL; } - if (gst_msdk_is_msdk_buffer (new_buffer)) - new_surface = gst_msdk_get_surface_from_buffer (new_buffer); - else { - GST_ERROR_OBJECT (pool, "the acquired memory is not MSDK memory"); + if (!gst_video_frame_map (&src_frame, &thiz->sinkpad_info, buf, GST_MAP_READ)) { + GST_ERROR_OBJECT (thiz, "failed to map the frame for source"); + gst_buffer_unref (upload_buf); return NULL; } - msdk_surface = g_slice_new0 (MsdkSurface); - msdk_surface->surface = new_surface; - msdk_surface->buf = new_buffer; + if (!gst_video_frame_map (&dst_frame, &thiz->sinkpad_buffer_pool_info, + upload_buf, GST_MAP_WRITE)) { + GST_ERROR_OBJECT (thiz, "failed to map the frame for destination"); + gst_video_frame_unmap (&src_frame); + gst_buffer_unref (upload_buf); + return NULL; + } - return msdk_surface; -} + for (guint i = 0; i < GST_VIDEO_FRAME_N_PLANES (&src_frame); i++) { + guint src_width_in_bytes, src_height; + guint dst_width_in_bytes, dst_height; + guint width_in_bytes, height; + guint src_stride, dst_stride; + guint8 *src_data, *dst_data; -#ifndef _WIN32 -static gboolean -import_dmabuf_to_msdk_surface (GstMsdkVPP * thiz, GstBuffer * buf, - MsdkSurface * msdk_surface) -{ - GstMemory *mem = NULL; - GstVideoInfo vinfo; - GstVideoMeta *vmeta; - GstMsdkMemoryID *msdk_mid = NULL; - mfxFrameSurface1 *mfx_surface = NULL; - gint fd, i; - - mem = gst_buffer_peek_memory (buf, 0); - fd = gst_dmabuf_memory_get_fd (mem); - if (fd < 0) - return FALSE; + src_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&src_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&src_frame, i); + src_height = GST_VIDEO_FRAME_COMP_HEIGHT (&src_frame, i); + src_stride = GST_VIDEO_FRAME_COMP_STRIDE (&src_frame, i); - vinfo = thiz->sinkpad_info; - - /* Update offset/stride/size if there is VideoMeta attached to - * the buffer */ - vmeta = gst_buffer_get_video_meta (buf); - if (vmeta) { - if (GST_VIDEO_INFO_FORMAT (&vinfo) != vmeta->format || - GST_VIDEO_INFO_WIDTH (&vinfo) != vmeta->width || - GST_VIDEO_INFO_HEIGHT (&vinfo) != vmeta->height || - GST_VIDEO_INFO_N_PLANES (&vinfo) != vmeta->n_planes) { - GST_ERROR_OBJECT (thiz, "VideoMeta attached to buffer is not matching" - "the negotiated width/height/format"); - return FALSE; - } - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&vinfo); ++i) { - GST_VIDEO_INFO_PLANE_OFFSET (&vinfo, i) = vmeta->offseti; - GST_VIDEO_INFO_PLANE_STRIDE (&vinfo, i) = vmeta->stridei; + dst_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&dst_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&src_frame, i); + dst_height = GST_VIDEO_FRAME_COMP_HEIGHT (&src_frame, i); + dst_stride = GST_VIDEO_FRAME_COMP_STRIDE (&dst_frame, i); + + width_in_bytes = MIN (src_width_in_bytes, dst_width_in_bytes); + height = MIN (src_height, dst_height); + + src_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&src_frame, i); + dst_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&dst_frame, i); + + for (guint j = 0; j < height; j++) { + memcpy (dst_data, src_data, width_in_bytes); + dst_data += dst_stride; + src_data += src_stride; } - GST_VIDEO_INFO_SIZE (&vinfo) = gst_buffer_get_size (buf); - } - - /* Upstream neither accepted the msdk pool nor the msdk buffer size restrictions. - * Current media-driver and GMMLib will fail due to strict memory size restrictions. - * Ideally, media-driver should accept what ever memory coming from other drivers - * in case of dmabuf-import and this is how the intel-vaapi-driver works. - * For now, in order to avoid any crash we check the buffer size and fallback - * to copy frame method. - * - * See this: https://github.com/intel/media-driver/issues/169 - * */ - if (GST_VIDEO_INFO_SIZE (&vinfo) < - GST_VIDEO_INFO_SIZE (&thiz->sinkpad_buffer_pool_info)) - return FALSE; + } - mfx_surface = msdk_surface->surface; - msdk_mid = (GstMsdkMemoryID *) mfx_surface->Data.MemId; + gst_video_frame_unmap (&dst_frame); + gst_video_frame_unmap (&src_frame); - /* release the internal memory storage of associated mfxSurface */ - gst_msdk_replace_mfx_memid (thiz->context, mfx_surface, VA_INVALID_ID); + if (thiz->use_video_memory) { + msdk_surface = gst_msdk_import_to_msdk_surface (upload_buf, thiz->context, + &thiz->sinkpad_info, GST_MAP_READ); + } else { + msdk_surface = + gst_msdk_import_sys_mem_to_msdk_surface (upload_buf, + thiz->sinkpad_buffer_pool_info); + } - /* export dmabuf to vasurface */ - if (!gst_msdk_export_dmabuf_to_vasurface (thiz->context, &vinfo, fd, - msdk_mid->surface)) - return FALSE; + if (msdk_surface) + msdk_surface->buf = upload_buf; - return TRUE; + return msdk_surface; } -#endif -static MsdkSurface * +static GstMsdkSurface * get_msdk_surface_from_input_buffer (GstMsdkVPP * thiz, GstBuffer * inbuf) { - GstVideoFrame src_frame, out_frame; - MsdkSurface *msdk_surface; -#ifndef _WIN32 - GstMemory *mem = NULL; -#endif + GstMsdkSurface *msdk_surface = NULL; if (gst_msdk_is_msdk_buffer (inbuf)) { - msdk_surface = g_slice_new0 (MsdkSurface); + msdk_surface = g_slice_new0 (GstMsdkSurface); msdk_surface->surface = gst_msdk_get_surface_from_buffer (inbuf); msdk_surface->buf = gst_buffer_ref (inbuf); return msdk_surface; } - /* If upstream hasn't accpeted the proposed msdk bufferpool, - * just copy frame (if not dmabuf backed) to msdk buffer and - * take a surface from it. */ - if (!(msdk_surface = - get_surface_from_pool (thiz, thiz->sinkpad_buffer_pool, NULL))) - goto error; - -#ifndef _WIN32 - /************ dmabuf-import ************* */ - /* if upstream provided a dmabuf backed memory, but not an msdk - * buffer, we could export the dmabuf to underlined vasurface */ - mem = gst_buffer_peek_memory (inbuf, 0); - if (gst_is_dmabuf_memory (mem)) { - if (import_dmabuf_to_msdk_surface (thiz, inbuf, msdk_surface)) - return msdk_surface; - else - GST_INFO_OBJECT (thiz, "Upstream dmabuf-backed memory is not imported" - "to the msdk surface, fall back to the copy input frame method"); - } -#endif - - if (!gst_video_frame_map (&src_frame, &thiz->sinkpad_info, inbuf, - GST_MAP_READ)) { - GST_ERROR_OBJECT (thiz, "failed to map the frame for source"); - goto error; - } - - if (!gst_video_frame_map (&out_frame, &thiz->sinkpad_buffer_pool_info, - msdk_surface->buf, GST_MAP_WRITE)) { - GST_ERROR_OBJECT (thiz, "failed to map the frame for destination"); - gst_video_frame_unmap (&src_frame); - goto error; - } - - if (!gst_video_frame_copy (&out_frame, &src_frame)) { - GST_ERROR_OBJECT (thiz, "failed to copy frame"); - gst_video_frame_unmap (&out_frame); - gst_video_frame_unmap (&src_frame); - goto error; + msdk_surface = gst_msdk_import_to_msdk_surface (inbuf, thiz->context, + &thiz->sinkpad_info, GST_MAP_READ); + if (msdk_surface) { + msdk_surface->buf = gst_buffer_ref (inbuf); + return msdk_surface; } - gst_video_frame_unmap (&out_frame); - gst_video_frame_unmap (&src_frame); - - return msdk_surface; + /* If upstream hasn't accpeted the proposed msdk bufferpool, + * just copy frame to msdk buffer and take a surface from it. + */ -error: - return NULL; + return gst_msdkvpp_get_surface_from_pool (thiz, thiz->sinkpad_buffer_pool, + inbuf); } static GstFlowReturn @@ -868,8 +904,8 @@ mfxSyncPoint sync_point = NULL; mfxStatus status; mfxFrameInfo *in_info = NULL; - MsdkSurface *in_surface = NULL; - MsdkSurface *out_surface = NULL; + GstMsdkSurface *in_surface = NULL; + GstMsdkSurface *out_surface = NULL; GstBuffer *outbuf_new = NULL; gboolean locked_by_others; gboolean create_new_surface = FALSE; @@ -895,12 +931,22 @@ gst_util_uint64_scale_round (inbuf->pts, 90000, GST_SECOND); if (gst_msdk_is_msdk_buffer (outbuf)) { - out_surface = g_slice_new0 (MsdkSurface); + out_surface = g_slice_new0 (GstMsdkSurface); out_surface->surface = gst_msdk_get_surface_from_buffer (outbuf); } else { - GST_ERROR_OBJECT (thiz, "Failed to get msdk outsurface!"); - free_msdk_surface (in_surface); - return GST_FLOW_ERROR; + out_surface = gst_msdk_import_to_msdk_surface (outbuf, thiz->context, + &thiz->srcpad_info, GST_MAP_WRITE); + if (!thiz->use_video_memory) { + out_surface = + gst_msdk_import_sys_mem_to_msdk_surface (outbuf, thiz->srcpad_info); + } + if (out_surface) + out_surface->buf = gst_buffer_ref (outbuf); + else { + GST_ERROR_OBJECT (thiz, "Failed to get msdk outsurface!"); + free_msdk_surface (in_surface); + return GST_FLOW_ERROR; + } } /* update surface crop info (NOTE: msdk min frame size is 2x2) */ @@ -908,7 +954,11 @@ if ((thiz->crop_left + thiz->crop_right >= in_info->CropW - 1) || (thiz->crop_top + thiz->crop_bottom >= in_info->CropH - 1)) { GST_WARNING_OBJECT (thiz, "ignoring crop... cropping too much!"); - } else { + } else if (!in_surface->from_qdata) { + /* We only fill crop info when it is a new surface. + * If the surface is a cached one, it already has crop info, + * and we should avoid updating again. + */ in_info->CropX = thiz->crop_left; in_info->CropY = thiz->crop_top; in_info->CropW -= thiz->crop_left + thiz->crop_right; @@ -971,12 +1021,27 @@ if (gst_msdk_is_msdk_buffer (outbuf_new)) { release_out_surface (thiz, out_surface); - out_surface = g_slice_new0 (MsdkSurface); + out_surface = g_slice_new0 (GstMsdkSurface); out_surface->surface = gst_msdk_get_surface_from_buffer (outbuf_new); create_new_surface = TRUE; } else { - GST_ERROR_OBJECT (thiz, "Failed to get msdk outsurface!"); - goto vpp_error; + release_out_surface (thiz, out_surface); + out_surface = + gst_msdk_import_to_msdk_surface (outbuf_new, thiz->context, + &thiz->srcpad_buffer_pool_info, GST_MAP_WRITE); + if (!thiz->use_video_memory) { + out_surface = + gst_msdk_import_sys_mem_to_msdk_surface (outbuf_new, + thiz->srcpad_buffer_pool_info); + } + if (out_surface) { + out_surface->buf = gst_buffer_ref (outbuf_new); + create_new_surface = TRUE; + } else { + GST_ERROR_OBJECT (thiz, "Failed to get msdk outsurface!"); + release_in_surface (thiz, in_surface, locked_by_others); + return GST_FLOW_ERROR; + } } } else { GST_BUFFER_TIMESTAMP (outbuf) = timestamp; @@ -1017,11 +1082,6 @@ if (!thiz->context) return; - if (thiz->use_video_memory) { - gst_msdk_frame_free (thiz->context, &thiz->in_alloc_resp); - gst_msdk_frame_free (thiz->context, &thiz->out_alloc_resp); - } - GST_DEBUG_OBJECT (thiz, "Closing VPP 0x%p", thiz->context); status = MFXVideoVPP_Close (gst_msdk_context_get_session (thiz->context)); if (status != MFX_ERR_NONE && status != MFX_ERR_NOT_INITIALIZED) { @@ -1171,10 +1231,6 @@ * fail */ if (thiz->initialized) { - if (thiz->use_video_memory) { - gst_msdk_frame_free (thiz->context, &thiz->in_alloc_resp); - } - MFXVideoVPP_Close (session); memset (&thiz->param, 0, sizeof (thiz->param)); @@ -1257,7 +1313,6 @@ request0.Type |= MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET; if (thiz->use_sinkpad_dmabuf) request0.Type |= MFX_MEMTYPE_EXPORT_FRAME; - gst_msdk_frame_alloc (thiz->context, &(request0), &thiz->in_alloc_resp); /* Output surface pool pre-allocation */ request1.Type |= MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET; @@ -1300,8 +1355,10 @@ gst_caps_get_features (out_caps, 0))) thiz->need_vpp = 1; - gst_video_info_from_caps (&in_info, caps); - gst_video_info_from_caps (&out_info, out_caps); + if (!gst_video_info_from_caps (&in_info, caps)) + goto error_no_video_info; + if (!gst_video_info_from_caps (&out_info, out_caps)) + goto error_no_video_info; if (!gst_video_info_is_equal (&in_info, &thiz->sinkpad_info)) sinkpad_info_changed = TRUE; @@ -1313,11 +1370,8 @@ thiz->sinkpad_info = in_info; thiz->srcpad_info = out_info; -#ifndef _WIN32 + thiz->use_video_memory = TRUE; -#else - thiz->use_video_memory = FALSE; -#endif /* check for deinterlace requirement */ deinterlace = gst_msdkvpp_is_deinterlace_enabled (thiz, &in_info); @@ -1340,17 +1394,22 @@ thiz->sinkpad_buffer_pool = gst_msdkvpp_create_buffer_pool (thiz, GST_PAD_SINK, caps, - thiz->in_num_surfaces); + thiz->in_num_surfaces, FALSE); if (!thiz->sinkpad_buffer_pool) { GST_ERROR_OBJECT (thiz, "Failed to ensure the sinkpad buffer pool"); return FALSE; } return TRUE; + +error_no_video_info: + GST_ERROR_OBJECT (thiz, "Failed to get video info from caps"); + return FALSE; } static gboolean -pad_can_dmabuf (GstMsdkVPP * thiz, GstPadDirection direction, GstCaps * filter) +pad_accept_memory (GstMsdkVPP * thiz, const gchar * mem_type, + GstPadDirection direction, GstCaps * filter) { gboolean ret = FALSE; GstCaps *caps, *out_caps; @@ -1365,8 +1424,7 @@ /* make a copy of filter caps since we need to alter the structure * by adding dmabuf-capsfeatures */ caps = gst_caps_copy (filter); - gst_caps_set_features (caps, 0, - gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_DMABUF)); + gst_caps_set_features (caps, 0, gst_caps_features_from_string (mem_type)); out_caps = gst_pad_peer_query_caps (pad, caps); if (!out_caps) @@ -1376,7 +1434,7 @@ || out_caps == caps) goto done; - if (_gst_caps_has_feature (out_caps, GST_CAPS_FEATURE_MEMORY_DMABUF)) + if (_gst_caps_has_feature (out_caps, mem_type)) ret = TRUE; done: if (caps) @@ -1413,12 +1471,27 @@ GST_DEBUG_OBJECT (trans, "fixated to %" GST_PTR_FORMAT, result); gst_caps_unref (othercaps); - if (pad_can_dmabuf (thiz, + /* We let msdkvpp srcpad first query if downstream has va memory type caps, + * if not, will check the type of dma memory. + */ +#ifndef _WIN32 + if (pad_accept_memory (thiz, GST_CAPS_FEATURE_MEMORY_VA, + direction == GST_PAD_SRC ? GST_PAD_SINK : GST_PAD_SRC, result)) { + gst_caps_set_features (result, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_VA, NULL)); + } else if (pad_accept_memory (thiz, GST_CAPS_FEATURE_MEMORY_DMABUF, direction == GST_PAD_SRC ? GST_PAD_SINK : GST_PAD_SRC, result)) { gst_caps_set_features (result, 0, gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_DMABUF, NULL)); *use_dmabuf = TRUE; } +#else + if (pad_accept_memory (thiz, GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, + direction == GST_PAD_SRC ? GST_PAD_SINK : GST_PAD_SRC, result)) { + gst_caps_set_features (result, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, NULL)); + } +#endif return result; } @@ -1468,6 +1541,33 @@ return TRUE; } +static gboolean +gst_msdkvpp_query (GstBaseTransform * trans, GstPadDirection direction, + GstQuery * query) +{ + GstMsdkVPP *thiz = GST_MSDKVPP (trans); + gboolean ret = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT:{ + GstMsdkContext *msdk_context = NULL; + + gst_object_replace ((GstObject **) & msdk_context, + (GstObject *) thiz->context); + ret = gst_msdk_handle_context_query (GST_ELEMENT_CAST (trans), + query, msdk_context); + gst_clear_object (&msdk_context); + break; + } + default: + ret = GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, + direction, query); + break; + } + + return ret; +} + static void gst_msdkvpp_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -1648,7 +1748,24 @@ gst_object_replace ((GstObject **) & thiz->context, (GstObject *) msdk_context); gst_object_unref (msdk_context); + } else +#ifndef _WIN32 + if (gst_msdk_context_from_external_va_display (context, + thiz->hardware, 0 /* GST_MSDK_JOB_VPP will be set later */ , + &msdk_context)) { + gst_object_replace ((GstObject **) & thiz->context, + (GstObject *) msdk_context); + gst_object_unref (msdk_context); } +#else + if (gst_msdk_context_from_external_d3d11_device (context, + thiz->hardware, 0 /* GST_MSDK_JOB_VPP will be set later */ , + &msdk_context)) { + gst_object_replace ((GstObject **) & thiz->context, + (GstObject *) msdk_context); + gst_object_unref (msdk_context); + } +#endif GST_ELEMENT_CLASS (parent_class)->set_context (element, context); } @@ -1695,6 +1812,7 @@ GST_DEBUG_FUNCPTR (gst_msdkvpp_decide_allocation); trans_class->prepare_output_buffer = GST_DEBUG_FUNCPTR (gst_msdkvpp_prepare_output_buffer); + trans_class->query = GST_DEBUG_FUNCPTR (gst_msdkvpp_query); obj_propertiesPROP_HARDWARE = g_param_spec_boolean ("hardware", "Hardware", "Enable hardware VPP",
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/gstmsdkvpp.h -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/gstmsdkvpp.h
Changed
@@ -92,8 +92,6 @@ GstMsdkContext *old_context; mfxVideoParam param; guint in_num_surfaces; - mfxFrameAllocResponse in_alloc_resp; - mfxFrameAllocResponse out_alloc_resp; gboolean initialized; gboolean use_video_memory;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/meson.build
Changed
@@ -1,5 +1,6 @@ msdk_sources = 'gstmsdk.c', + 'gstmsdkallocator.c', 'gstmsdkbufferpool.c', 'gstmsdkcontext.c', 'gstmsdkcontextutil.c', @@ -24,22 +25,42 @@ 'msdk.c', -if host_machine.system() == 'windows' - msdk_sources += 'msdk_d3d.c', 'gstmsdkallocator_d3d.c' -else - msdk_sources += 'msdk_libva.c', 'gstmsdkallocator_libva.c' -endif - have_msdk = false msdk_dep = use_msdk = false use_onevpl = false +onevpl_extra_args = + +extra_args = + '-DGST_USE_UNSTABLE_API', + msdk_option = get_option('msdk') if msdk_option.disabled() subdir_done() endif +if host_machine.system() == 'windows' + msdk_sources += 'msdk_d3d.c', 'gstmsdkallocator_d3d.c' + if gstd3d11_dep.found() + extra_args += '-DCOBJMACROS' + else + if msdk_option.enabled() + error('The msdk plugin was enabled explicity, but required d3d11 dependencies were not found.') + endif + subdir_done() + endif + +else + if not gstva_dep.found() + if msdk_option.enabled() + error('The msdk plugin was enabled explicity, but required va dependencies were not found.') + endif + subdir_done() + endif + msdk_sources += 'msdk_libva.c', 'gstmsdkallocator_libva.c' +endif + mfx_api = get_option('mfx_api') if mfx_api != 'oneVPL' @@ -91,6 +112,7 @@ # Check oneVPL firstly if use_onevpl + onevpl_extra_args += '-DONEVPL_EXPERIMENTAL' mfx_incdir = join_paths(mfx_incdir, 'vpl') mfx_inc = include_directories(mfx_incdir) elif cxx.has_header('mfx/mfxdefs.h', args: '-I' + mfx_incdir) @@ -138,22 +160,34 @@ cdata.set('USE_MSDK_AV1_DEC', 1) endif +mfx_ver205_check_code = ''' +#include <mfxdefs.h> +#if MFX_VERSION < 2005 +#error "The current verison of mfx doesn't support AV1 encoding" +#endif +''' + +have_mfx_ver205 = cc.compiles(mfx_ver205_check_code, + include_directories: configinc, mfx_inc) + +if use_onevpl and have_mfx_ver205 + msdk_sources += 'gstmsdkav1enc.c' + cdata.set10('USE_MSDK_AV1_ENC', 1) +endif + if host_machine.system() == 'windows' if cc.get_id() != 'msvc' and msdk_option.enabled() error('msdk plugin can only be built with MSVC') endif legacy_stdio_dep = cc.find_library('legacy_stdio_definitions', required: get_option('msdk')) - d3d11_dep = cc.find_library('d3d11', required: get_option('msdk')) - msdk_deps = declare_dependency(dependencies: d3d11_dep, legacy_stdio_dep) - msdk_deps_found = d3d11_dep.found() and legacy_stdio_dep.found() and cc.get_id() == 'msvc' + msdk_deps = declare_dependency(dependencies: gstd3d11_dep, legacy_stdio_dep) + msdk_deps_found = gstd3d11_dep.found() and legacy_stdio_dep.found() and cc.get_id() == 'msvc' else - libva_dep = dependency('libva', required: get_option('msdk')) - libva_drm_dep = dependency('libva-drm', required: get_option('msdk')) libdl_dep = cc.find_library('dl', required: get_option('msdk')) libgudev_dep = dependency('gudev-1.0', required: get_option('msdk')) libdrm_dep = dependency('libdrm', required: get_option('msdk')) - msdk_deps = declare_dependency(dependencies: libva_dep, libva_drm_dep, libdl_dep, libgudev_dep, libdrm_dep) - msdk_deps_found = libva_dep.found() and libva_drm_dep.found() and libdl_dep.found() and libgudev_dep.found() and libdrm_dep.found() + msdk_deps = declare_dependency(dependencies: gstva_dep, libdl_dep, libgudev_dep, libdrm_dep) + msdk_deps_found = gstva_dep.found() and libdl_dep.found() and libgudev_dep.found() and libdrm_dep.found() endif if msdk_deps_found @@ -167,13 +201,12 @@ gstmsdktag = library('gstmsdk', msdk_sources, - c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', + c_args : gst_plugins_bad_args + extra_args + onevpl_extra_args, include_directories : configinc, mfx_inc, dependencies : gstbase_dep, gstvideo_dep, gstpbutils_dep, gstallocators_dep, gstcodecparsers_dep, mfx_dep, msdk_deps, install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstmsdktag, install_dir : plugins_pkgconfig_install_dir) plugins += gstmsdktag have_msdk = true endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/msdk-enums.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/msdk-enums.c
Changed
@@ -141,6 +141,24 @@ } GType +gst_msdkenc_lowdelay_brc_get_type (void) +{ + static GType type = 0; + + static const GEnumValue values = { + {MFX_CODINGOPTION_UNKNOWN, "SDK decides what to do", "auto"}, + {MFX_CODINGOPTION_OFF, "Disable LowDelay bit rate control", "off"}, + {MFX_CODINGOPTION_ON, "Enable LowDelay bit rate control ", "on"}, + {0, NULL, NULL} + }; + + if (!type) { + type = g_enum_register_static ("GstMsdkEncLowDelayBitrateControl", values); + } + return type; +} + +GType gst_msdkenc_adaptive_i_get_type (void) { static GType type = 0;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/msdk-enums.h -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/msdk-enums.h
Changed
@@ -64,6 +64,9 @@ gst_msdkenc_mbbrc_get_type (void); GType +gst_msdkenc_lowdelay_brc_get_type (void); + +GType gst_msdkenc_adaptive_i_get_type (void); GType
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/msdk.c -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/msdk.c
Changed
@@ -312,7 +312,7 @@ } void -MFXUnload (mfxLoader loader) +GstMFXUnload (mfxLoader loader) { g_assert (loader == NULL); } @@ -553,6 +553,18 @@ return FALSE; } +gboolean +gst_msdk_is_va_mem (GstMemory * mem) +{ + GstAllocator *allocator; + + allocator = mem->allocator; + if (!allocator) + return FALSE; + + return g_str_equal (allocator->mem_type, "VAMemory"); +} + mfxFrameSurface1 * gst_msdk_get_surface_from_buffer (GstBuffer * buf) {
View file
gst-plugins-bad-1.20.5.tar.xz/sys/msdk/msdk.h -> gst-plugins-bad-1.22.0.tar.xz/sys/msdk/msdk.h
Changed
@@ -75,21 +75,35 @@ #define GST_MSDK_CAPS_MAKE_WITH_DMABUF_FEATURE(dmaformat) \ GST_VIDEO_CAPS_MAKE_WITH_FEATURES(GST_CAPS_FEATURE_MEMORY_DMABUF, dmaformat) ", " \ "interlace-mode = (string) progressive" -#else -#define GST_MSDK_CAPS_MAKE_WITH_DMABUF_FEATURE(dmaformat) "" -#endif +#define GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE(vaformat) \ + GST_VIDEO_CAPS_MAKE_WITH_FEATURES("memory:VAMemory", vaformat) ", " \ + "interlace-mode = (string) progressive" #define GST_MSDK_CAPS_STR(format,dmaformat) \ GST_MSDK_CAPS_MAKE (format) "; " \ GST_MSDK_CAPS_MAKE_WITH_DMABUF_FEATURE (dmaformat) +#else +#define GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE(d3d11format) \ + GST_VIDEO_CAPS_MAKE_WITH_FEATURES("memory:D3D11Memory", d3d11format) ", " \ + "interlace-mode = (string) progressive" + +#define GST_MSDK_CAPS_STR(format,dmaformat) \ + GST_MSDK_CAPS_MAKE (format) +#endif #if (MFX_VERSION < 2000) typedef void * mfxLoader; -void MFXUnload (mfxLoader loader); +void GstMFXUnload (mfxLoader loader); + +/* To avoid MFXUnload symbol re-define build issue in case of static build. + * MFXUnload symbol may exists if other plugin built its own libmfx dispatcher + */ +#define MFXUnload GstMFXUnload #endif typedef struct _MsdkSession MsdkSession; +typedef struct _GstMsdkSurface GstMsdkSurface; struct _MsdkSession { @@ -121,6 +135,9 @@ gboolean gst_msdk_is_msdk_buffer (GstBuffer * buf); +gboolean +gst_msdk_is_va_mem (GstMemory * mem); + mfxFrameSurface1 * gst_msdk_get_surface_from_buffer (GstBuffer * buf);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/cuviddec.h -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/cuviddec.h
Changed
@@ -1,7 +1,7 @@ /* * This copyright notice applies to this header file only: * - * Copyright (c) 2010-2019 NVIDIA Corporation + * Copyright (c) 2010-2021 NVIDIA Corporation * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -28,7 +28,6 @@ /*****************************************************************************************************/ //! \file cuviddec.h //! NVDECODE API provides video decoding interface to NVIDIA GPU devices. -//! \date 2015-2019 //! This file contains constants, structure definitions and function prototypes used for decoding. /*****************************************************************************************************/ @@ -69,6 +68,7 @@ cudaVideoCodec_HEVC, /**< HEVC */ cudaVideoCodec_VP8, /**< VP8 */ cudaVideoCodec_VP9, /**< VP9 */ + cudaVideoCodec_AV1, /**< AV1 */ cudaVideoCodec_NumCodecs, /**< Max codecs */ // Uncompressed YUV cudaVideoCodec_YUV420 = (('I'<<24)|('Y'<<16)|('U'<<8)|('V')), /**< Y,U,V (4:2:0) */ @@ -157,7 +157,7 @@ unsigned int reserved13; /**< Reserved for future use - set to zero */ unsigned char bIsSupported; /**< OUT: 1 if codec supported, 0 if not supported */ - unsigned char reserved2; /**< Reserved for future use - set to zero */ + unsigned char nNumNVDECs; /**< OUT: Number of NVDECs that can support IN params */ unsigned short nOutputFormatMask; /**< OUT: each bit represents corresponding cudaVideoSurfaceFormat enum */ unsigned int nMaxWidth; /**< OUT: Max supported coded width in pixels */ unsigned int nMaxHeight; /**< OUT: Max supported coded height in pixels */ @@ -165,7 +165,12 @@ CodedWidth*CodedHeight/256 must be <= nMaxMBCount */ unsigned short nMinWidth; /**< OUT: Min supported coded width in pixels */ unsigned short nMinHeight; /**< OUT: Min supported coded height in pixels */ - unsigned int reserved311; /**< Reserved for future use - set to zero */ + unsigned char bIsHistogramSupported; /**< OUT: 1 if Y component histogram output is supported, 0 if not + Note: histogram is computed on original picture data before + any post-processing like scaling, cropping, etc. is applied */ + unsigned char nCounterBitDepth; /**< OUT: histogram counter bit depth */ + unsigned short nMaxHistogramBins; /**< OUT: Max number of histogram bins */ + unsigned int reserved310; /**< Reserved for future use - set to zero */ } CUVIDDECODECAPS; /**************************************************************************************************************/ @@ -216,7 +221,9 @@ short right; short bottom; } target_rect; - unsigned long Reserved25; /**< Reserved for future use - set to zero */ + + unsigned long enableHistogram; /**< IN: enable histogram output, if supported */ + unsigned long Reserved24; /**< Reserved for future use - set to zero */ } CUVIDDECODECREATEINFO; /*********************************************************/ @@ -715,6 +722,181 @@ } CUVIDVP9PICPARAMS; +/***********************************************************/ +//! \struct CUVIDAV1PICPARAMS +//! AV1 picture parameters +//! This structure is used in CUVIDPICPARAMS structure +/***********************************************************/ +typedef struct _CUVIDAV1PICPARAMS +{ + unsigned int width; // coded width, if superres enabled then it is upscaled width + unsigned int height; // coded height + unsigned int frame_offset; // defined as order_hint in AV1 specification + int decodePicIdx; // decoded output pic index, if film grain enabled, it will keep decoded (without film grain) output + // It can be used as reference frame for future frames + + // sequence header + unsigned int profile : 3; // 0 = profile0, 1 = profile1, 2 = profile2 + unsigned int use_128x128_superblock : 1; // superblock size 0:64x64, 1: 128x128 + unsigned int subsampling_x : 1; // (subsampling_x, _y) 1,1 = 420, 1,0 = 422, 0,0 = 444 + unsigned int subsampling_y : 1; + unsigned int mono_chrome : 1; // for monochrome content, mono_chrome = 1 and (subsampling_x, _y) should be 1,1 + unsigned int bit_depth_minus8 : 4; // bit depth minus 8 + unsigned int enable_filter_intra : 1; // tool enable in seq level, 0 : disable 1: frame header control + unsigned int enable_intra_edge_filter : 1; // intra edge filtering process, 0 : disable 1: enabled + unsigned int enable_interintra_compound : 1; // interintra, 0 : not present 1: present + unsigned int enable_masked_compound : 1; // 1: mode info for inter blocks may contain the syntax element compound_type. + // 0: syntax element compound_type will not be present + unsigned int enable_dual_filter : 1; // vertical and horiz filter selection, 1: enable and 0: disable + unsigned int enable_order_hint : 1; // order hint, and related tools, 1: enable and 0: disable + unsigned int order_hint_bits_minus1 : 3; // is used to compute OrderHintBits + unsigned int enable_jnt_comp : 1; // joint compound modes, 1: enable and 0: disable + unsigned int enable_superres : 1; // superres in seq level, 0 : disable 1: frame level control + unsigned int enable_cdef : 1; // cdef filtering in seq level, 0 : disable 1: frame level control + unsigned int enable_restoration : 1; // loop restoration filtering in seq level, 0 : disable 1: frame level control + unsigned int enable_fgs : 1; // defined as film_grain_params_present in AV1 specification + unsigned int reserved0_7bits : 7; // reserved bits; must be set to 0 + + // frame header + unsigned int frame_type : 2 ; // 0:Key frame, 1:Inter frame, 2:intra only, 3:s-frame + unsigned int show_frame : 1 ; // show_frame = 1 implies that frame should be immediately output once decoded + unsigned int disable_cdf_update : 1; // CDF update during symbol decoding, 1: disabled, 0: enabled + unsigned int allow_screen_content_tools : 1; // 1: intra blocks may use palette encoding, 0: palette encoding is never used + unsigned int force_integer_mv : 1; // 1: motion vectors will always be integers, 0: can contain fractional bits + unsigned int coded_denom : 3; // coded_denom of the superres scale as specified in AV1 specification + unsigned int allow_intrabc : 1; // 1: intra block copy may be used, 0: intra block copy is not allowed + unsigned int allow_high_precision_mv : 1; // 1/8 precision mv enable + unsigned int interp_filter : 3; // interpolation filter. Refer to section 6.8.9 of the AV1 specification Version 1.0.0 with Errata 1 + unsigned int switchable_motion_mode : 1; // defined as is_motion_mode_switchable in AV1 specification + unsigned int use_ref_frame_mvs : 1; // 1: current frame can use the previous frame mv information, 0: will not use. + unsigned int disable_frame_end_update_cdf : 1; // 1: indicates that the end of frame CDF update is disabled + unsigned int delta_q_present : 1; // quantizer index delta values are present in the block level + unsigned int delta_q_res : 2; // left shift which should be applied to decoded quantizer index delta values + unsigned int using_qmatrix : 1; // 1: quantizer matrix will be used to compute quantizers + unsigned int coded_lossless : 1; // 1: all segments use lossless coding + unsigned int use_superres : 1; // 1: superres enabled for frame + unsigned int tx_mode : 2; // 0: ONLY4x4,1:LARGEST,2:SELECT + unsigned int reference_mode : 1; // 0: SINGLE, 1: SELECT + unsigned int allow_warped_motion : 1; // 1: allow_warped_motion may be present, 0: allow_warped_motion will not be present + unsigned int reduced_tx_set : 1; // 1: frame is restricted to subset of the full set of transform types, 0: no such restriction + unsigned int skip_mode : 1; // 1: most of the mode info is skipped, 0: mode info is not skipped + unsigned int reserved1_3bits : 3; // reserved bits; must be set to 0 + + // tiling info + unsigned int num_tile_cols : 8; // number of tiles across the frame., max is 64 + unsigned int num_tile_rows : 8; // number of tiles down the frame., max is 64 + unsigned int context_update_tile_id : 16; // specifies which tile to use for the CDF update + unsigned short tile_widths64; // Width of each column in superblocks + unsigned short tile_heights64; // height of each row in superblocks + + // CDEF - refer to section 6.10.14 of the AV1 specification Version 1.0.0 with Errata 1 + unsigned char cdef_damping_minus_3 : 2; // controls the amount of damping in the deringing filter + unsigned char cdef_bits : 2; // the number of bits needed to specify which CDEF filter to apply + unsigned char reserved2_4bits : 4; // reserved bits; must be set to 0 + unsigned char cdef_y_strength8; // 0-3 bits: y_pri_strength, 4-7 bits y_sec_strength + unsigned char cdef_uv_strength8; // 0-3 bits: uv_pri_strength, 4-7 bits uv_sec_strength + + // SkipModeFrames + unsigned char SkipModeFrame0 : 4; // specifies the frames to use for compound prediction when skip_mode is equal to 1. + unsigned char SkipModeFrame1 : 4; + + // qp information - refer to section 6.8.11 of the AV1 specification Version 1.0.0 with Errata 1 + unsigned char base_qindex; // indicates the base frame qindex. Defined as base_q_idx in AV1 specification + char qp_y_dc_delta_q; // indicates the Y DC quantizer relative to base_q_idx. Defined as DeltaQYDc in AV1 specification + char qp_u_dc_delta_q; // indicates the U DC quantizer relative to base_q_idx. Defined as DeltaQUDc in AV1 specification + char qp_v_dc_delta_q; // indicates the V DC quantizer relative to base_q_idx. Defined as DeltaQVDc in AV1 specification + char qp_u_ac_delta_q; // indicates the U AC quantizer relative to base_q_idx. Defined as DeltaQUAc in AV1 specification + char qp_v_ac_delta_q; // indicates the V AC quantizer relative to base_q_idx. Defined as DeltaQVAc in AV1 specification + unsigned char qm_y; // specifies the level in the quantizer matrix that should be used for luma plane decoding + unsigned char qm_u; // specifies the level in the quantizer matrix that should be used for chroma U plane decoding + unsigned char qm_v; // specifies the level in the quantizer matrix that should be used for chroma V plane decoding + + // segmentation - refer to section 6.8.13 of the AV1 specification Version 1.0.0 with Errata 1 + unsigned char segmentation_enabled : 1; // 1 indicates that this frame makes use of the segmentation tool + unsigned char segmentation_update_map : 1; // 1 indicates that the segmentation map are updated during the decoding of this frame + unsigned char segmentation_update_data : 1; // 1 indicates that new parameters are about to be specified for each segment + unsigned char segmentation_temporal_update : 1; // 1 indicates that the updates to the segmentation map are coded relative to the existing segmentation map + unsigned char reserved3_4bits : 4; // reserved bits; must be set to 0 + short segmentation_feature_data88; // specifies the feature data for a segment feature + unsigned char segmentation_feature_mask8; // indicates that the corresponding feature is unused or feature value is coded + + // loopfilter - refer to section 6.8.10 of the AV1 specification Version 1.0.0 with Errata 1 + unsigned char loop_filter_level2; // contains loop filter strength values + unsigned char loop_filter_level_u; // loop filter strength value of U plane + unsigned char loop_filter_level_v; // loop filter strength value of V plane + unsigned char loop_filter_sharpness; // indicates the sharpness level + char loop_filter_ref_deltas8; // contains the adjustment needed for the filter level based on the chosen reference frame + char loop_filter_mode_deltas2; // contains the adjustment needed for the filter level based on the chosen mode + unsigned char loop_filter_delta_enabled : 1; // indicates that the filter level depends on the mode and reference frame used to predict a block + unsigned char loop_filter_delta_update : 1; // indicates that additional syntax elements are present that specify which mode and + // reference frame deltas are to be updated + unsigned char delta_lf_present : 1; // specifies whether loop filter delta values are present in the block level + unsigned char delta_lf_res : 2; // specifies the left shift to apply to the decoded loop filter values + unsigned char delta_lf_multi : 1; // separate loop filter deltas for Hy,Vy,U,V edges + unsigned char reserved4_2bits : 2; // reserved bits; must be set to 0 + + // restoration - refer to section 6.10.15 of the AV1 specification Version 1.0.0 with Errata 1 + unsigned char lr_unit_size3; // specifies the size of loop restoration units: 0: 32, 1: 64, 2: 128, 3: 256 + unsigned char lr_type3 ; // used to compute FrameRestorationType + + // reference frames + unsigned char primary_ref_frame; // specifies which reference frame contains the CDF values and other state that should be + // loaded at the start of the frame + unsigned char ref_frame_map8; // frames in dpb that can be used as reference for current or future frames + + unsigned char temporal_layer_id : 4; // temporal layer id + unsigned char spatial_layer_id : 4; // spatial layer id + + unsigned char reserved5_32bits4; // reserved bits; must be set to 0 + + // ref frame list + struct + { + unsigned int width; + unsigned int height; + unsigned char index; + unsigned char reserved24Bits3; // reserved bits; must be set to 0 + } ref_frame7; // frames used as reference frame for current frame. + + // global motion + struct { + unsigned char invalid : 1; + unsigned char wmtype : 2; // defined as GmType in AV1 specification + unsigned char reserved5Bits : 5; // reserved bits; must be set to 0 + char reserved24Bits3; // reserved bits; must be set to 0 + int wmmat6; // defined as gm_params in AV1 specification + } global_motion7; // global motion params for reference frames + + // film grain params - refer to section 6.8.20 of the AV1 specification Version 1.0.0 with Errata 1 + unsigned short apply_grain : 1; + unsigned short overlap_flag : 1; + unsigned short scaling_shift_minus8 : 2; + unsigned short chroma_scaling_from_luma : 1; + unsigned short ar_coeff_lag : 2; + unsigned short ar_coeff_shift_minus6 : 2; + unsigned short grain_scale_shift : 2; + unsigned short clip_to_restricted_range : 1; + unsigned short reserved6_4bits : 4; // reserved bits; must be set to 0 + unsigned char num_y_points; + unsigned char scaling_points_y142; + unsigned char num_cb_points; + unsigned char scaling_points_cb102; + unsigned char num_cr_points; + unsigned char scaling_points_cr102; + unsigned char reserved7_8bits; // reserved bits; must be set to 0 + unsigned short random_seed; + short ar_coeffs_y24; + short ar_coeffs_cb25; + short ar_coeffs_cr25; + unsigned char cb_mult; + unsigned char cb_luma_mult; + short cb_offset; + unsigned char cr_mult; + unsigned char cr_luma_mult; + short cr_offset; + + int reserved7; // reserved bits; must be set to 0 +} CUVIDAV1PICPARAMS; /******************************************************************************************/ //! \struct CUVIDPICPARAMS @@ -749,6 +931,7 @@ CUVIDHEVCPICPARAMS hevc; CUVIDVP8PICPARAMS vp8; CUVIDVP9PICPARAMS vp9; + CUVIDAV1PICPARAMS av1; unsigned int CodecReserved1024; } CodecSpecific; } CUVIDPICPARAMS; @@ -761,22 +944,23 @@ /******************************************************/ typedef struct _CUVIDPROCPARAMS { - int progressive_frame; /**< IN: Input is progressive (deinterlace_mode will be ignored) */ - int second_field; /**< IN: Output the second field (ignored if deinterlace mode is Weave) */ - int top_field_first; /**< IN: Input frame is top field first (1st field is top, 2nd field is bottom) */ - int unpaired_field; /**< IN: Input only contains one field (2nd field is invalid) */ + int progressive_frame; /**< IN: Input is progressive (deinterlace_mode will be ignored) */ + int second_field; /**< IN: Output the second field (ignored if deinterlace mode is Weave) */ + int top_field_first; /**< IN: Input frame is top field first (1st field is top, 2nd field is bottom) */ + int unpaired_field; /**< IN: Input only contains one field (2nd field is invalid) */ // The fields below are used for raw YUV input - unsigned int reserved_flags; /**< Reserved for future use (set to zero) */ - unsigned int reserved_zero; /**< Reserved (set to zero) */ - unsigned long long raw_input_dptr; /**< IN: Input CUdeviceptr for raw YUV extensions */ - unsigned int raw_input_pitch; /**< IN: pitch in bytes of raw YUV input (should be aligned appropriately) */ - unsigned int raw_input_format; /**< IN: Input YUV format (cudaVideoCodec_enum) */ - unsigned long long raw_output_dptr; /**< IN: Output CUdeviceptr for raw YUV extensions */ - unsigned int raw_output_pitch; /**< IN: pitch in bytes of raw YUV output (should be aligned appropriately) */ - unsigned int Reserved1; /**< Reserved for future use (set to zero) */ - CUstream output_stream; /**< IN: stream object used by cuvidMapVideoFrame */ - unsigned int Reserved46; /**< Reserved for future use (set to zero) */ - void *Reserved22; /**< Reserved for future use (set to zero) */ + unsigned int reserved_flags; /**< Reserved for future use (set to zero) */ + unsigned int reserved_zero; /**< Reserved (set to zero) */ + unsigned long long raw_input_dptr; /**< IN: Input CUdeviceptr for raw YUV extensions */ + unsigned int raw_input_pitch; /**< IN: pitch in bytes of raw YUV input (should be aligned appropriately) */ + unsigned int raw_input_format; /**< IN: Input YUV format (cudaVideoCodec_enum) */ + unsigned long long raw_output_dptr; /**< IN: Output CUdeviceptr for raw YUV extensions */ + unsigned int raw_output_pitch; /**< IN: pitch in bytes of raw YUV output (should be aligned appropriately) */ + unsigned int Reserved1; /**< Reserved for future use (set to zero) */ + CUstream output_stream; /**< IN: stream object used by cuvidMapVideoFrame */ + unsigned int Reserved46; /**< Reserved for future use (set to zero) */ + unsigned long long *histogram_dptr; /**< OUT: Output CUdeviceptr for histogram extensions */ + void *Reserved21; /**< Reserved for future use (set to zero) */ } CUVIDPROCPARAMS; /*********************************************************************************************************/ @@ -890,6 +1074,9 @@ /************************************************************************************************************/ //! \fn CUresult CUDAAPI cuvidGetDecodeStatus(CUvideodecoder hDecoder, int nPicIdx); //! Get the decode status for frame corresponding to nPicIdx +//! API is supported for Maxwell and above generation GPUs. +//! API is currently supported for HEVC, H264 and JPEG codecs. +//! API returns CUDA_ERROR_NOT_SUPPORTED error code for unsupported GPU or codec. /************************************************************************************************************/ extern CUresult CUDAAPI cuvidGetDecodeStatus(CUvideodecoder hDecoder, int nPicIdx, CUVIDGETDECODESTATUS* pDecodeStatus); @@ -942,6 +1129,7 @@ #endif + /********************************************************************************************************************/ //! //! Context-locking: to facilitate multi-threaded implementations, the following 4 functions
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudabasetransform.c -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcudabasetransform.c
Changed
@@ -29,8 +29,9 @@ # include <config.h> #endif +#include <gst/cuda/gstcudautils.h> + #include "gstcudabasetransform.h" -#include "gstcudautils.h" GST_DEBUG_CATEGORY_STATIC (gst_cuda_base_transform_debug); #define GST_CAT_DEFAULT gst_cuda_base_transform_debug @@ -58,20 +59,12 @@ static gboolean gst_cuda_base_transform_stop (GstBaseTransform * trans); static gboolean gst_cuda_base_transform_set_caps (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps); -static GstFlowReturn gst_cuda_base_transform_transform (GstBaseTransform * - trans, GstBuffer * inbuf, GstBuffer * outbuf); static gboolean gst_cuda_base_transform_get_unit_size (GstBaseTransform * trans, GstCaps * caps, gsize * size); -static gboolean gst_cuda_base_transform_propose_allocation (GstBaseTransform * - trans, GstQuery * decide_query, GstQuery * query); -static gboolean gst_cuda_base_transform_decide_allocation (GstBaseTransform * - trans, GstQuery * query); static gboolean gst_cuda_base_transform_query (GstBaseTransform * trans, GstPadDirection direction, GstQuery * query); -static GstFlowReturn -gst_cuda_base_transform_transform_frame_default (GstCudaBaseTransform * filter, - GstVideoFrame * in_frame, GstCudaMemory * in_cuda_mem, - GstVideoFrame * out_frame, GstCudaMemory * out_cuda_mem); +static void gst_cuda_base_transform_before_transform (GstBaseTransform * trans, + GstBuffer * buffer); static void gst_cuda_base_transform_class_init (GstCudaBaseTransformClass * klass) @@ -104,29 +97,22 @@ trans_class->start = GST_DEBUG_FUNCPTR (gst_cuda_base_transform_start); trans_class->stop = GST_DEBUG_FUNCPTR (gst_cuda_base_transform_stop); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_cuda_base_transform_set_caps); - trans_class->transform = - GST_DEBUG_FUNCPTR (gst_cuda_base_transform_transform); trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_cuda_base_transform_get_unit_size); - trans_class->propose_allocation = - GST_DEBUG_FUNCPTR (gst_cuda_base_transform_propose_allocation); - trans_class->decide_allocation = - GST_DEBUG_FUNCPTR (gst_cuda_base_transform_decide_allocation); trans_class->query = GST_DEBUG_FUNCPTR (gst_cuda_base_transform_query); - - klass->transform_frame = - GST_DEBUG_FUNCPTR (gst_cuda_base_transform_transform_frame_default); + trans_class->before_transform = + GST_DEBUG_FUNCPTR (gst_cuda_base_transform_before_transform); GST_DEBUG_CATEGORY_INIT (gst_cuda_base_transform_debug, "cudabasefilter", 0, "cudabasefilter Element"); + + gst_type_mark_as_plugin_api (GST_TYPE_CUDA_BASE_TRANSFORM, 0); } static void gst_cuda_base_transform_init (GstCudaBaseTransform * filter) { filter->device_id = DEFAULT_DEVICE_ID; - - filter->negotiated = FALSE; } static void @@ -240,12 +226,16 @@ } /* input caps */ - if (!gst_video_info_from_caps (&in_info, incaps)) - goto invalid_caps; + if (!gst_video_info_from_caps (&in_info, incaps)) { + GST_ERROR_OBJECT (filter, "invalid incaps %" GST_PTR_FORMAT, incaps); + return FALSE; + } /* output caps */ - if (!gst_video_info_from_caps (&out_info, outcaps)) - goto invalid_caps; + if (!gst_video_info_from_caps (&out_info, outcaps)) { + GST_ERROR_OBJECT (filter, "invalid incaps %" GST_PTR_FORMAT, incaps); + return FALSE; + } klass = GST_CUDA_BASE_TRANSFORM_GET_CLASS (filter); if (klass->set_info) @@ -258,17 +248,7 @@ filter->out_info = out_info; } - filter->negotiated = res; - return res; - - /* ERRORS */ -invalid_caps: - { - GST_ERROR_OBJECT (filter, "invalid caps"); - filter->negotiated = FALSE; - return FALSE; - } } static gboolean @@ -285,335 +265,106 @@ return TRUE; } -static GstFlowReturn -gst_cuda_base_transform_transform (GstBaseTransform * trans, - GstBuffer * inbuf, GstBuffer * outbuf) +static gboolean +gst_cuda_base_transform_query (GstBaseTransform * trans, + GstPadDirection direction, GstQuery * query) { GstCudaBaseTransform *filter = GST_CUDA_BASE_TRANSFORM (trans); - GstCudaBaseTransformClass *fclass = - GST_CUDA_BASE_TRANSFORM_GET_CLASS (filter); - GstVideoFrame in_frame, out_frame; - GstFlowReturn ret = GST_FLOW_OK; - GstMapFlags in_map_flags, out_map_flags; - GstMemory *mem; - GstCudaMemory *in_cuda_mem = NULL; - GstCudaMemory *out_cuda_mem = NULL; - - if (G_UNLIKELY (!filter->negotiated)) - goto unknown_format; - - in_map_flags = GST_MAP_READ | GST_VIDEO_FRAME_MAP_FLAG_NO_REF; - out_map_flags = GST_MAP_WRITE | GST_VIDEO_FRAME_MAP_FLAG_NO_REF; - - in_cuda_mem = out_cuda_mem = FALSE; - - if (gst_buffer_n_memory (inbuf) == 1 && - (mem = gst_buffer_peek_memory (inbuf, 0)) && gst_is_cuda_memory (mem)) { - GstCudaMemory *cmem = GST_CUDA_MEMORY_CAST (mem); - - if (cmem->context == filter->context || - gst_cuda_context_get_handle (cmem->context) == - gst_cuda_context_get_handle (filter->context) || - (gst_cuda_context_can_access_peer (cmem->context, filter->context) && - gst_cuda_context_can_access_peer (filter->context, - cmem->context))) { - in_map_flags |= GST_MAP_CUDA; - in_cuda_mem = cmem; - } - } - - if (gst_buffer_n_memory (outbuf) == 1 && - (mem = gst_buffer_peek_memory (outbuf, 0)) && gst_is_cuda_memory (mem)) { - GstCudaMemory *cmem = GST_CUDA_MEMORY_CAST (mem); - - if (cmem->context == filter->context || - gst_cuda_context_get_handle (cmem->context) == - gst_cuda_context_get_handle (filter->context) || - (gst_cuda_context_can_access_peer (cmem->context, filter->context) && - gst_cuda_context_can_access_peer (filter->context, - cmem->context))) { - out_map_flags |= GST_MAP_CUDA; - out_cuda_mem = cmem; - } - } - - if (!gst_video_frame_map (&in_frame, &filter->in_info, inbuf, in_map_flags)) - goto invalid_buffer; - - if (!gst_video_frame_map (&out_frame, &filter->out_info, outbuf, - out_map_flags)) { - gst_video_frame_unmap (&in_frame); - goto invalid_buffer; - } - - ret = fclass->transform_frame (filter, &in_frame, in_cuda_mem, &out_frame, - out_cuda_mem); - - gst_video_frame_unmap (&out_frame); - gst_video_frame_unmap (&in_frame); - return ret; - - /* ERRORS */ -unknown_format: - { - GST_ELEMENT_ERROR (filter, CORE, NOT_IMPLEMENTED, (NULL), - ("unknown format")); - return GST_FLOW_NOT_NEGOTIATED; - } -invalid_buffer: - { - GST_ELEMENT_WARNING (trans, CORE, NOT_IMPLEMENTED, (NULL), - ("invalid video buffer received")); - return GST_FLOW_OK; - } -} - -static GstFlowReturn -gst_cuda_base_transform_transform_frame_default (GstCudaBaseTransform * filter, - GstVideoFrame * in_frame, GstCudaMemory * in_cuda_mem, - GstVideoFrame * out_frame, GstCudaMemory * out_cuda_mem) -{ - gint i; - GstFlowReturn ret = GST_FLOW_OK; - - if (in_cuda_mem || out_cuda_mem) { - if (!gst_cuda_context_push (filter->context)) { - GST_ELEMENT_ERROR (filter, LIBRARY, FAILED, (NULL), - ("Cannot push CUDA context")); - - return GST_FLOW_ERROR; - } - - for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (in_frame); i++) { - CUDA_MEMCPY2D param = { 0, }; - guint width, height; - - width = GST_VIDEO_FRAME_COMP_WIDTH (in_frame, i) * - GST_VIDEO_FRAME_COMP_PSTRIDE (in_frame, i); - height = GST_VIDEO_FRAME_COMP_HEIGHT (in_frame, i); - - if (in_cuda_mem) { - param.srcMemoryType = CU_MEMORYTYPE_DEVICE; - param.srcDevice = in_cuda_mem->data + in_cuda_mem->offseti; - param.srcPitch = in_cuda_mem->stride; - } else { - param.srcMemoryType = CU_MEMORYTYPE_HOST; - param.srcHost = GST_VIDEO_FRAME_PLANE_DATA (in_frame, i); - param.srcPitch = GST_VIDEO_FRAME_PLANE_STRIDE (in_frame, i); - } - - if (out_cuda_mem) { - param.dstMemoryType = CU_MEMORYTYPE_DEVICE; - param.dstDevice = out_cuda_mem->data + out_cuda_mem->offseti; - param.dstPitch = out_cuda_mem->stride; - } else { - param.dstMemoryType = CU_MEMORYTYPE_HOST; - param.dstHost = GST_VIDEO_FRAME_PLANE_DATA (out_frame, i); - param.dstPitch = GST_VIDEO_FRAME_PLANE_STRIDE (out_frame, i); - } - - param.WidthInBytes = width; - param.Height = height; - - if (!gst_cuda_result (CuMemcpy2DAsync (¶m, filter->cuda_stream))) { - gst_cuda_context_pop (NULL); - GST_ELEMENT_ERROR (filter, LIBRARY, FAILED, (NULL), - ("Cannot upload input video frame")); - - return GST_FLOW_ERROR; - } - } - - CuStreamSynchronize (filter->cuda_stream); - - gst_cuda_context_pop (NULL); - } else { - for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (in_frame); i++) { - if (!gst_video_frame_copy_plane (out_frame, in_frame, i)) { - GST_ERROR_OBJECT (filter, "Couldn't copy %dth plane", i); - - return GST_FLOW_ERROR; - } + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + { + gboolean ret; + ret = gst_cuda_handle_context_query (GST_ELEMENT (filter), query, + filter->context); + if (ret) + return TRUE; + break; } + default: + break; } - return ret; + return GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction, + query); } -static gboolean -gst_cuda_base_transform_propose_allocation (GstBaseTransform * trans, - GstQuery * decide_query, GstQuery * query) +static void +gst_cuda_base_transform_before_transform (GstBaseTransform * trans, + GstBuffer * buffer) { - GstCudaBaseTransform *filter = GST_CUDA_BASE_TRANSFORM (trans); - GstVideoInfo info; - GstBufferPool *pool; - GstCaps *caps; - guint size; - - if (!GST_BASE_TRANSFORM_CLASS (parent_class)->propose_allocation (trans, - decide_query, query)) - return FALSE; - - /* passthrough, we're done */ - if (decide_query == NULL) - return TRUE; - - gst_query_parse_allocation (query, &caps, NULL); - - if (caps == NULL) - return FALSE; - - if (!gst_video_info_from_caps (&info, caps)) - return FALSE; - - if (gst_query_get_n_allocation_pools (query) == 0) { - GstCapsFeatures *features; - GstStructure *config; - GstVideoAlignment align; - GstAllocationParams params = { 0, 31, 0, 0, }; - GstAllocator *allocator = NULL; - gint i; - - features = gst_caps_get_features (caps, 0); - - if (features && gst_caps_features_contains (features, - GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY)) { - GST_DEBUG_OBJECT (filter, "upstream support CUDA memory"); - pool = gst_cuda_buffer_pool_new (filter->context); - } else { - pool = gst_video_buffer_pool_new (); - } - - config = gst_buffer_pool_get_config (pool); - - gst_video_alignment_reset (&align); - for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&info); i++) { - align.stride_aligni = 31; - } - gst_video_info_align (&info, &align); - - gst_buffer_pool_config_add_option (config, - GST_BUFFER_POOL_OPTION_VIDEO_META); - gst_buffer_pool_config_add_option (config, - GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); - - gst_buffer_pool_config_set_video_alignment (config, &align); - size = GST_VIDEO_INFO_SIZE (&info); - gst_buffer_pool_config_set_params (config, caps, size, 0, 0); - - gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); - gst_query_add_allocation_pool (query, pool, size, 0, 0); - - if (gst_buffer_pool_config_get_allocator (config, &allocator, ¶ms)) { - if (params.align < 31) - params.align = 31; - - gst_query_add_allocation_param (query, allocator, ¶ms); - gst_buffer_pool_config_set_allocator (config, allocator, ¶ms); - } - - if (!gst_buffer_pool_set_config (pool, config)) - goto config_failed; - - gst_object_unref (pool); + GstCudaBaseTransform *self = GST_CUDA_BASE_TRANSFORM (trans); + GstCudaMemory *cmem; + GstMemory *mem; + gboolean update_context = FALSE; + GstCaps *in_caps = NULL; + GstCaps *out_caps = NULL; + + in_caps = gst_pad_get_current_caps (GST_BASE_TRANSFORM_SINK_PAD (trans)); + if (!in_caps) { + GST_WARNING_OBJECT (self, "sinkpad has null caps"); + goto out; } - return TRUE; - - /* ERRORS */ -config_failed: - { - GST_ERROR_OBJECT (filter, "failed to set config"); - gst_object_unref (pool); - return FALSE; + out_caps = gst_pad_get_current_caps (GST_BASE_TRANSFORM_SRC_PAD (trans)); + if (!out_caps) { + GST_WARNING_OBJECT (self, "Has no configured output caps"); + goto out; } -} -static gboolean -gst_cuda_base_transform_decide_allocation (GstBaseTransform * trans, - GstQuery * query) -{ - GstCudaBaseTransform *filter = GST_CUDA_BASE_TRANSFORM (trans); - GstCaps *outcaps = NULL; - GstBufferPool *pool = NULL; - guint size, min, max; - GstStructure *config; - gboolean update_pool = FALSE; - gboolean need_cuda = FALSE; - GstCapsFeatures *features; + mem = gst_buffer_peek_memory (buffer, 0); + /* Can happens (e.g., d3d11upload) */ + if (!gst_is_cuda_memory (mem)) + goto out; - gst_query_parse_allocation (query, &outcaps, NULL); + cmem = GST_CUDA_MEMORY_CAST (mem); + /* Same context, nothing to do */ + if (self->context == cmem->context) + goto out; - if (!outcaps) - return FALSE; + /* Can accept any device, update */ + if (self->device_id < 0) { + update_context = TRUE; + } else { + guint device_id = 0; - features = gst_caps_get_features (outcaps, 0); - if (features && gst_caps_features_contains (features, - GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY)) { - need_cuda = TRUE; + g_object_get (cmem->context, "cuda-device-id", &device_id, NULL); + /* The same GPU as what user wanted, update */ + if (device_id == (guint) self->device_id) + update_context = TRUE; } - if (gst_query_get_n_allocation_pools (query) > 0) { - gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); - if (need_cuda && pool && !GST_IS_CUDA_BUFFER_POOL (pool)) { - /* when cuda device memory is supported, but pool is not cudabufferpool */ - gst_object_unref (pool); - pool = NULL; - } - - update_pool = TRUE; - } else { - GstVideoInfo vinfo; - gst_video_info_from_caps (&vinfo, outcaps); - size = GST_VIDEO_INFO_SIZE (&vinfo); - min = max = 0; - } + if (!update_context) + goto out; - if (!pool) { - GST_DEBUG_OBJECT (filter, "create our pool"); + GST_INFO_OBJECT (self, "Updating device %" GST_PTR_FORMAT " -> %" + GST_PTR_FORMAT, self->context, cmem->context); - if (need_cuda) - pool = gst_cuda_buffer_pool_new (filter->context); - else - pool = gst_video_buffer_pool_new (); + if (self->cuda_stream) { + gst_cuda_context_push (self->context); + CuStreamDestroy (self->cuda_stream); + gst_cuda_context_pop (NULL); + self->cuda_stream = NULL; } - config = gst_buffer_pool_get_config (pool); - gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); - gst_buffer_pool_config_set_params (config, outcaps, size, min, max); - gst_buffer_pool_set_config (pool, config); - if (update_pool) - gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); - else - gst_query_add_allocation_pool (query, pool, size, min, max); + gst_object_unref (self->context); + self->context = gst_object_ref (cmem->context); - gst_object_unref (pool); + gst_cuda_context_push (self->context); + CuStreamCreate (&self->cuda_stream, CU_STREAM_DEFAULT); + gst_cuda_context_pop (NULL); - return GST_BASE_TRANSFORM_CLASS (parent_class)->decide_allocation (trans, - query); -} + /* subclass will update internal object. + * Note that gst_base_transform_reconfigure() might not trigger this + * unless caps was changed meanwhile */ + gst_cuda_base_transform_set_caps (trans, in_caps, out_caps); -static gboolean -gst_cuda_base_transform_query (GstBaseTransform * trans, - GstPadDirection direction, GstQuery * query) -{ - GstCudaBaseTransform *filter = GST_CUDA_BASE_TRANSFORM (trans); + /* Mark reconfigure so that we can update pool */ + gst_base_transform_reconfigure_src (trans); - switch (GST_QUERY_TYPE (query)) { - case GST_QUERY_CONTEXT: - { - gboolean ret; - ret = gst_cuda_handle_context_query (GST_ELEMENT (filter), query, - filter->context); - if (ret) - return TRUE; - break; - } - default: - break; - } +out: + gst_clear_caps (&in_caps); + gst_clear_caps (&out_caps); - return GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction, - query); + return; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudabasetransform.h -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcudabasetransform.h
Changed
@@ -23,8 +23,8 @@ #include <gst/gst.h> #include <gst/base/gstbasetransform.h> #include <gst/video/video.h> -#include "gstcudacontext.h" -#include "gstcudabufferpool.h" +#include <gst/cuda/gstcudacontext.h> +#include <gst/cuda/gstcudabufferpool.h> G_BEGIN_DECLS @@ -42,14 +42,12 @@ { GstBaseTransform parent; - gboolean negotiated; + GstCudaContext *context; + CUstream cuda_stream; GstVideoInfo in_info; GstVideoInfo out_info; - GstCudaContext *context; - CUstream cuda_stream; - gint device_id; }; @@ -57,19 +55,17 @@ { GstBaseTransformClass parent_class; - gboolean (*set_info) (GstCudaBaseTransform *filter, - GstCaps *incaps, GstVideoInfo *in_info, - GstCaps *outcaps, GstVideoInfo *out_info); - - GstFlowReturn (*transform_frame) (GstCudaBaseTransform *filter, - GstVideoFrame *in_frame, - GstCudaMemory *in_cuda_mem, - GstVideoFrame *out_frame, - GstCudaMemory *out_cuda_mem); + gboolean (*set_info) (GstCudaBaseTransform *filter, + GstCaps *incaps, + GstVideoInfo *in_info, + GstCaps *outcaps, + GstVideoInfo *out_info); }; GType gst_cuda_base_transform_get_type (void); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstCudaBaseTransform, gst_object_unref) + G_END_DECLS #endif /* __GST_CUDA_BASE_TRANSFORM_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcudaconverter.c
Added
@@ -0,0 +1,2243 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstcudaconverter.h" +#include <gst/cuda/gstcudautils.h> +#include <gst/cuda/gstcudaloader.h> +#include <gst/cuda/gstcudanvrtc.h> +#include <string.h> + +GST_DEBUG_CATEGORY_STATIC (gst_cuda_converter_debug); +#define GST_CAT_DEFAULT gst_cuda_converter_debug + +#define CUDA_BLOCK_X 16 +#define CUDA_BLOCK_Y 16 +#define DIV_UP(size,block) (((size) + ((block) - 1)) / (block)) + +/* from GstD3D11 */ +typedef struct _GstCudaColorMatrix +{ + gdouble matrix33; + gdouble offset3; + gdouble min3; + gdouble max3; +} GstCudaColorMatrix; + +static gchar * +gst_cuda_dump_color_matrix (GstCudaColorMatrix * matrix) +{ + /* *INDENT-OFF* */ + static const gchar format = + "MATRIX\n" + "|% .6f, % .6f, % .6f|\n" + "|% .6f, % .6f, % .6f|\n" + "|% .6f, % .6f, % .6f|\n" + "OFFSET\n" + "|% .6f, % .6f, % .6f|\n" + "MIN\n" + "|% .6f, % .6f, % .6f|\n" + "MAX\n" + "|% .6f, % .6f, % .6f|"; + /* *INDENT-ON* */ + + return g_strdup_printf (format, + matrix->matrix00, matrix->matrix01, matrix->matrix02, + matrix->matrix10, matrix->matrix11, matrix->matrix12, + matrix->matrix20, matrix->matrix21, matrix->matrix22, + matrix->offset0, matrix->offset1, matrix->offset2, + matrix->min0, matrix->min1, matrix->min2, + matrix->max0, matrix->max1, matrix->max2); +} + +static void +color_matrix_copy (GstCudaColorMatrix * dst, const GstCudaColorMatrix * src) +{ + for (guint i = 0; i < 3; i++) { + for (guint j = 0; j < 3; j++) { + dst->matrixij = src->matrixij; + } + } +} + +static void +color_matrix_multiply (GstCudaColorMatrix * dst, GstCudaColorMatrix * a, + GstCudaColorMatrix * b) +{ + GstCudaColorMatrix tmp; + + for (guint i = 0; i < 3; i++) { + for (guint j = 0; j < 3; j++) { + gdouble val = 0; + for (guint k = 0; k < 3; k++) { + val += a->matrixik * b->matrixkj; + } + + tmp.matrixij = val; + } + } + + color_matrix_copy (dst, &tmp); +} + +static void +color_matrix_identity (GstCudaColorMatrix * m) +{ + for (guint i = 0; i < 3; i++) { + for (guint j = 0; j < 3; j++) { + if (i == j) + m->matrixij = 1.0; + else + m->matrixij = 0; + } + } +} + +/** + * gst_cuda_color_range_adjust_matrix_unorm: + * @in_info: a #GstVideoInfo + * @out_info: a #GstVideoInfo + * @matrix: a #GstCudaColorMatrix + * + * Calculates matrix for color range adjustment. Both input and output + * signals are in normalized 0.0..1.0 space. + * + * Resulting values can be calculated by + * | Yout | | Yin | | matrix.offset0 | + * | Uout | = clamp ( matrix.matrix * | Uin | + | matrix.offset1 |, matrix.min, matrix.max ) + * | Vout | | Vin | | matrix.offset2 | + * + * Returns: %TRUE if successful + */ +static gboolean +gst_cuda_color_range_adjust_matrix_unorm (const GstVideoInfo * in_info, + const GstVideoInfo * out_info, GstCudaColorMatrix * matrix) +{ + gboolean in_rgb, out_rgb; + gint in_offsetGST_VIDEO_MAX_COMPONENTS; + gint in_scaleGST_VIDEO_MAX_COMPONENTS; + gint out_offsetGST_VIDEO_MAX_COMPONENTS; + gint out_scaleGST_VIDEO_MAX_COMPONENTS; + GstVideoColorRange in_range; + GstVideoColorRange out_range; + gdouble src_fullscale, dst_fullscale; + + memset (matrix, 0, sizeof (GstCudaColorMatrix)); + for (guint i = 0; i < 3; i++) { + matrix->matrixii = 1.0; + matrix->matrixii = 1.0; + matrix->matrixii = 1.0; + matrix->maxi = 1.0; + } + + in_rgb = GST_VIDEO_INFO_IS_RGB (in_info); + out_rgb = GST_VIDEO_INFO_IS_RGB (out_info); + + if (in_rgb != out_rgb) { + GST_WARNING ("Invalid format conversion"); + return FALSE; + } + + in_range = in_info->colorimetry.range; + out_range = out_info->colorimetry.range; + + if (in_range == GST_VIDEO_COLOR_RANGE_UNKNOWN) { + GST_WARNING ("Unknown input color range"); + if (in_rgb || GST_VIDEO_INFO_IS_GRAY (in_info)) + in_range = GST_VIDEO_COLOR_RANGE_0_255; + else + in_range = GST_VIDEO_COLOR_RANGE_16_235; + } + + if (out_range == GST_VIDEO_COLOR_RANGE_UNKNOWN) { + GST_WARNING ("Unknown output color range"); + if (out_rgb || GST_VIDEO_INFO_IS_GRAY (out_info)) + out_range = GST_VIDEO_COLOR_RANGE_0_255; + else + out_range = GST_VIDEO_COLOR_RANGE_16_235; + } + + src_fullscale = (gdouble) ((1 << in_info->finfo->depth0) - 1); + dst_fullscale = (gdouble) ((1 << out_info->finfo->depth0) - 1); + + gst_video_color_range_offsets (in_range, in_info->finfo, in_offset, in_scale); + gst_video_color_range_offsets (out_range, + out_info->finfo, out_offset, out_scale); + + matrix->min0 = matrix->min1 = matrix->min2 = + (gdouble) out_offset0 / dst_fullscale; + + matrix->max0 = (out_scale0 + out_offset0) / dst_fullscale; + matrix->max1 = matrix->max2 = + (out_scale1 + out_offset0) / dst_fullscale; + + if (in_info->colorimetry.range == out_info->colorimetry.range) { + GST_DEBUG ("Same color range"); + return TRUE; + } + + /* Formula + * + * 1) Scales and offset compensates input to 0..1 range + * SRC_NORMi = (srci * src_fullscale - in_offseti) / in_scalei + * = (srci * src_fullscale / in_scalei) - in_offseti / in_scalei + * + * 2) Reverse to output UNIT scale + * DST_UINTi = SRC_NORMi * out_scalei + out_offseti + * = srci * src_fullscale * out_scalei / in_scalei + * - in_offseti * out_scalei / in_scalei + * + out_offseti + * + * 3) Back to 0..1 scale + * dsti = DST_UINTi / dst_fullscale + * = COEFFi * srci + OFFi + * where + * src_fullscale * out_scalei + * COEFFi = ------------------------------ + * dst_fullscale * in_scalei + * + * out_offseti in_offseti * out_scalei + * OFFi = -------------- - ------------------------------ + * dst_fullscale dst_fullscale * in_scalei + */ + for (guint i = 0; i < 3; i++) { + matrix->matrixii = (src_fullscale * out_scalei) / + (dst_fullscale * in_scalei); + matrix->offseti = (out_offseti / dst_fullscale) - + ((gdouble) in_offseti * out_scalei / (dst_fullscale * in_scalei)); + } + + return TRUE; +} + +/** + * gst_cuda_yuv_to_rgb_matrix_unorm: + * @in_yuv_info: a #GstVideoInfo of input YUV signal + * @out_rgb_info: a #GstVideoInfo of output RGB signal + * @matrix: a #GstCudaColorMatrix + * + * Calculates transform matrix from YUV to RGB conversion. Both input and output + * signals are in normalized 0.0..1.0 space and additional gamma decoding + * or primary/transfer function transform is not performed by this matrix. + * + * Resulting non-linear RGB values can be calculated by + * | R' | | Y' | | matrix.offset0 | + * | G' | = clamp ( matrix.matrix * | Cb | + | matrix.offset1 | matrix.min, matrix.max ) + * | B' | | Cr | | matrix.offset2 | + * + * Returns: %TRUE if successful + */ +static gboolean +gst_cuda_yuv_to_rgb_matrix_unorm (const GstVideoInfo * in_yuv_info, + const GstVideoInfo * out_rgb_info, GstCudaColorMatrix * matrix) +{ + gint offset4, scale4; + gdouble Kr, Kb, Kg; + + /* + * <Formula> + * + * Input: Unsigned normalized Y'CbCr(unorm), 0.0..1.0 range + * Output: Unsigned normalized non-linear R'G'B'(unorm), 0.0..1.0 range + * + * 1) Y'CbCr(unorm) to scaled Y'CbCr + * | Y' | | Y'(unorm) | + * | Cb | = S | Cb(unorm) | + * | Cb | | Cr(unorm) | + * where S = (2 ^ bitdepth) - 1 + * + * 2) Y'CbCr to YPbPr + * Y = (Y' - offsetY ) / scaleY + * Pb = (Cb - offsetCbCr) / scaleCbCr + * Pr = (Cr - offsetCrCr) / scaleCrCr + * => + * Y = Y'(unorm) * Sy + Oy + * Pb = Cb(unorm) * Suv + Ouv + * Pb = Cr(unorm) * Suv + Ouv + * where + * Sy = S / scaleY + * Suv = S / scaleCbCr + * Oy = -(offsetY / scaleY) + * Ouv = -(offsetCbCr / scaleCbCr) + * + * 3) YPbPr to R'G'B' + * | R' | | Y | + * | G' | = M *| Pb | + * | B' | | Pr | + * where + * | vecR | + * M = | vecG | + * | vecB | + * vecR = | 1, 0 , 2(1 - Kr) | + * vecG = | 1, -(Kb/Kg) * 2(1 - Kb), -(Kr/Kg) * 2(1 - Kr) | + * vecB = | 1, 2(1 - Kb) , 0 | + * => + * R' = dot(vecR, (Syuv * Y'CbCr(unorm))) + dot(vecR, Offset) + * G' = dot(vecG, (Svuy * Y'CbCr(unorm))) + dot(vecG, Offset) + * B' = dot(vecB, (Syuv * Y'CbCr(unorm)) + dot(vecB, Offset) + * where + * | Sy, 0, 0 | + * Syuv = | 0, Suv, 0 | + * | 0 0, Suv | + * + * | Oy | + * Offset = | Ouv | + * | Ouv | + * + * 4) YUV -> RGB matrix + * | R' | | Y'(unorm) | | offsetA | + * | G' | = Matrix * | Cb(unorm) | + | offsetB | + * | B' | | Cr(unorm) | | offsetC | + * + * where + * | vecR | + * Matrix = | vecG | * Syuv + * | vecB | + * + * offsetA = dot(vecR, Offset) + * offsetB = dot(vecG, Offset) + * offsetC = dot(vecB, Offset) + * + * 4) Consider 16-235 scale RGB + * RGBfull(0..255) -> RGBfull(16..235) matrix is represented by + * | Rs | | Rf | | Or | + * | Gs | = Ms | Gf | + | Og | + * | Bs | | Bf | | Ob | + * + * Combining all matrix into + * | Rs | | Y'(unorm) | | offsetA | | Or | + * | Gs | = Ms * ( Matrix * | Cb(unorm) | + | offsetB | ) + | Og | + * | Bs | | Cr(unorm) | | offsetC | | Ob | + * + * | Y'(unorm) | | offsetA | | Or | + * = Ms * Matrix * | Cb(unorm) | + Ms | offsetB | + | Og | + * | Cr(unorm) | | offsetC | | Ob | + */ + + memset (matrix, 0, sizeof (GstCudaColorMatrix)); + for (guint i = 0; i < 3; i++) + matrix->maxi = 1.0; + + gst_video_color_range_offsets (in_yuv_info->colorimetry.range, + in_yuv_info->finfo, offset, scale); + + if (gst_video_color_matrix_get_Kr_Kb (in_yuv_info->colorimetry.matrix, + &Kr, &Kb)) { + guint S; + gdouble Sy, Suv; + gdouble Oy, Ouv; + gdouble vecR3, vecG3, vecB3; + + Kg = 1.0 - Kr - Kb; + + vecR0 = 1.0; + vecR1 = 0; + vecR2 = 2 * (1 - Kr); + + vecG0 = 1.0; + vecG1 = -(Kb / Kg) * 2 * (1 - Kb); + vecG2 = -(Kr / Kg) * 2 * (1 - Kr); + + vecB0 = 1.0; + vecB1 = 2 * (1 - Kb); + vecB2 = 0; + + /* Assume all components has the same bitdepth */ + S = (1 << in_yuv_info->finfo->depth0) - 1; + Sy = (gdouble) S / scale0; + Suv = (gdouble) S / scale1; + Oy = -((gdouble) offset0 / scale0); + Ouv = -((gdouble) offset1 / scale1); + + matrix->matrix00 = Sy * vecR0; + matrix->matrix10 = Sy * vecG0; + matrix->matrix20 = Sy * vecB0; + + matrix->matrix01 = Suv * vecR1; + matrix->matrix11 = Suv * vecG1; + matrix->matrix21 = Suv * vecB1; + + matrix->matrix02 = Suv * vecR2; + matrix->matrix12 = Suv * vecG2; + matrix->matrix22 = Suv * vecB2; + + matrix->offset0 = vecR0 * Oy + vecR1 * Ouv + vecR2 * Ouv; + matrix->offset1 = vecG0 * Oy + vecG1 * Ouv + vecG2 * Ouv; + matrix->offset2 = vecB0 * Oy + vecB1 * Ouv + vecB2 * Ouv; + + /* Apply RGB range scale matrix */ + if (out_rgb_info->colorimetry.range == GST_VIDEO_COLOR_RANGE_16_235) { + GstCudaColorMatrix scale_matrix, rst; + GstVideoInfo full_rgb = *out_rgb_info; + + full_rgb.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + + if (gst_cuda_color_range_adjust_matrix_unorm (&full_rgb, + out_rgb_info, &scale_matrix)) { + /* Ms * Matrix */ + color_matrix_multiply (&rst, &scale_matrix, matrix); + + /* Ms * transform offsets */ + for (guint i = 0; i < 3; i++) { + gdouble val = 0; + for (guint j = 0; j < 3; j++) { + val += scale_matrix.matrixij * matrix->offsetj; + } + rst.offseti = val + scale_matrix.offseti; + } + + /* copy back to output matrix */ + for (guint i = 0; i < 3; i++) { + for (guint j = 0; j < 3; j++) { + matrix->matrixij = rst.matrixij; + } + matrix->offseti = rst.offseti; + matrix->mini = scale_matrix.mini; + matrix->maxi = scale_matrix.maxi; + } + } + } + } else { + /* Unknown matrix */ + matrix->matrix00 = 1.0; + matrix->matrix11 = 1.0; + matrix->matrix22 = 1.0; + } + + return TRUE; +} + +/** + * gst_cuda_rgb_to_yuv_matrix_unorm: + * @in_rgb_info: a #GstVideoInfo of input RGB signal + * @out_yuv_info: a #GstVideoInfo of output YUV signal + * @matrix: a #GstCudaColorMatrix + * + * Calculates transform matrix from RGB to YUV conversion. Both input and output + * signals are in normalized 0.0..1.0 space and additional gamma decoding + * or primary/transfer function transform is not performed by this matrix. + * + * Resulting RGB values can be calculated by + * | Y' | | R' | | matrix.offset0 | + * | Cb | = clamp ( matrix.matrix * | G' | + | matrix.offset1 |, matrix.min, matrix.max ) + * | Cr | | B' | | matrix.offset2 | + * + * Returns: %TRUE if successful + */ +static gboolean +gst_cuda_rgb_to_yuv_matrix_unorm (const GstVideoInfo * in_rgb_info, + const GstVideoInfo * out_yuv_info, GstCudaColorMatrix * matrix) +{ + gint offset4, scale4; + gdouble Kr, Kb, Kg; + + /* + * <Formula> + * + * Input: Unsigned normalized non-linear R'G'B'(unorm), 0.0..1.0 range + * Output: Unsigned normalized Y'CbCr(unorm), 0.0..1.0 range + * + * 1) R'G'B' to YPbPr + * | Y | | R' | + * | Pb | = M *| G' | + * | Pr | | B' | + * where + * | vecY | + * M = | vecU | + * | vecV | + * vecY = | Kr , Kg , Kb | + * vecU = | -0.5*Kr/(1-Kb), -0.5*Kg/(1-Kb), 0.5 | + * vecV = | 0.5 , -0.5*Kg/(1-Kr), -0.5*Kb(1-Kr) | + * + * 2) YPbPr to Y'CbCr(unorm) + * Y'(unorm) = (Y * scaleY + offsetY) / S + * Cb(unorm) = (Pb * scaleCbCr + offsetCbCr) / S + * Cr(unorm) = (Pr * scaleCbCr + offsetCbCr) / S + * => + * Y'(unorm) = (Y * scaleY / S) + (offsetY / S) + * Cb(unorm) = (Pb * scaleCbCr / S) + (offsetCbCr / S) + * Cr(unorm) = (Pb * scaleCbCr / S) + (offsetCbCr / S) + * where S = (2 ^ bitdepth) - 1 + * + * 3) RGB -> YUV matrix + * | Y'(unorm) | | R' | | offsetA | + * | Cb(unorm) | = Matrix * | G' | + | offsetB | + * | Cr(unorm) | | B' | | offsetC | + * + * where + * | (scaleY/S) * vecY | + * Matrix = | (scaleCbCr/S) * vecU | + * | (scaleCbCr/S) * vecV | + * + * offsetA = offsetY / S + * offsetB = offsetCbCr / S + * offsetC = offsetCbCr / S + * + * 4) Consider 16-235 scale RGB + * RGBstudio(16..235) -> RGBfull(0..255) matrix is represented by + * | Rf | | Rs | | Or | + * | Gf | = Ms | Gs | + | Og | + * | Bf | | Bs | | Ob | + * + * Combining all matrix into + * | Y'(unorm) | | Rs | | Or | | offsetA | + * | Cb(unorm) | = Matrix * ( Ms | Gs | + | Og | ) + | offsetB | + * | Cr(unorm) | | Bs | | Ob | | offsetC | + * + * | Rs | | Or | | offsetA | + * = Matrix * Ms | Gs | + Matrix | Og | + | offsetB | + * | Bs | | Ob | | offsetB | + */ + + memset (matrix, 0, sizeof (GstCudaColorMatrix)); + for (guint i = 0; i < 3; i++) + matrix->maxi = 1.0; + + gst_video_color_range_offsets (out_yuv_info->colorimetry.range, + out_yuv_info->finfo, offset, scale); + + if (gst_video_color_matrix_get_Kr_Kb (out_yuv_info->colorimetry.matrix, + &Kr, &Kb)) { + guint S; + gdouble Sy, Suv; + gdouble Oy, Ouv; + gdouble vecY3, vecU3, vecV3; + + Kg = 1.0 - Kr - Kb; + + vecY0 = Kr; + vecY1 = Kg; + vecY2 = Kb; + + vecU0 = -0.5 * Kr / (1 - Kb); + vecU1 = -0.5 * Kg / (1 - Kb); + vecU2 = 0.5; + + vecV0 = 0.5; + vecV1 = -0.5 * Kg / (1 - Kr); + vecV2 = -0.5 * Kb / (1 - Kr); + + /* Assume all components has the same bitdepth */ + S = (1 << out_yuv_info->finfo->depth0) - 1; + Sy = (gdouble) scale0 / S; + Suv = (gdouble) scale1 / S; + Oy = (gdouble) offset0 / S; + Ouv = (gdouble) offset1 / S; + + for (guint i = 0; i < 3; i++) { + matrix->matrix0i = Sy * vecYi; + matrix->matrix1i = Suv * vecUi; + matrix->matrix2i = Suv * vecVi; + } + + matrix->offset0 = Oy; + matrix->offset1 = Ouv; + matrix->offset2 = Ouv; + + matrix->min0 = Oy; + matrix->min1 = Oy; + matrix->min2 = Oy; + + matrix->max0 = ((gdouble) scale0 + offset0) / S; + matrix->max1 = ((gdouble) scale1 + offset0) / S; + matrix->max2 = ((gdouble) scale1 + offset0) / S; + + /* Apply RGB range scale matrix */ + if (in_rgb_info->colorimetry.range == GST_VIDEO_COLOR_RANGE_16_235) { + GstCudaColorMatrix scale_matrix, rst; + GstVideoInfo full_rgb = *in_rgb_info; + + full_rgb.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + + if (gst_cuda_color_range_adjust_matrix_unorm (in_rgb_info, + &full_rgb, &scale_matrix)) { + /* Matrix * Ms */ + color_matrix_multiply (&rst, matrix, &scale_matrix); + + /* Matrix * scale offsets */ + for (guint i = 0; i < 3; i++) { + gdouble val = 0; + for (guint j = 0; j < 3; j++) { + val += matrix->matrixij * scale_matrix.offsetj; + } + rst.offseti = val + matrix->offseti; + } + + /* copy back to output matrix */ + for (guint i = 0; i < 3; i++) { + for (guint j = 0; j < 3; j++) { + matrix->matrixij = rst.matrixij; + } + matrix->offseti = rst.offseti; + } + } + } + } else { + /* Unknown matrix */ + matrix->matrix00 = 1.0; + matrix->matrix11 = 1.0; + matrix->matrix22 = 1.0; + } + + return TRUE; +} + +typedef struct +{ + float coeffX3; + float coeffY3; + float coeffZ3; + float offset3; + float min3; + float max3; +} ColorMatrix; + +typedef struct +{ + ColorMatrix toRGBCoeff; + ColorMatrix toYuvCoeff; + ColorMatrix primariesCoeff; +} ConstBuffer; + +#define COLOR_SPACE_IDENTITY "color_space_identity" +#define COLOR_SPACE_CONVERT "color_space_convert" + +#define SAMPLE_YUV_PLANAR "sample_yuv_planar" +#define SAMPLE_YV12 "sample_yv12" +#define SAMPLE_YUV_PLANAR_10BIS "sample_yuv_planar_10bits" +#define SAMPLE_YUV_PLANAR_12BIS "sample_yuv_planar_12bits" +#define SAMPLE_SEMI_PLANAR "sample_semi_planar" +#define SAMPLE_SEMI_PLANAR_SWAP "sample_semi_planar_swap" +#define SAMPLE_RGBA "sample_rgba" +#define SAMPLE_BGRA "sample_bgra" +#define SAMPLE_RGBx "sample_rgbx" +#define SAMPLE_BGRx "sample_bgrx" +#define SAMPLE_ARGB "sample_argb" +/* same as ARGB */ +#define SAMPLE_ARGB64 "sample_argb" +#define SAMPLE_AGBR "sample_abgr" +#define SAMPLE_RGBP "sample_rgbp" +#define SAMPLE_BGRP "sample_bgrp" +#define SAMPLE_GBR "sample_gbr" +#define SAMPLE_GBRA "sample_gbra" + +#define WRITE_I420 "write_i420" +#define WRITE_YV12 "write_yv12" +#define WRITE_NV12 "write_nv12" +#define WRITE_NV21 "write_nv21" +#define WRITE_P010 "write_p010" +/* same as P010 */ +#define WRITE_P016 "write_p010" +#define WRITE_I420_10 "write_i420_10" +#define WRITE_Y444 "write_y444" +#define WRITE_Y444_16 "write_y444_16" +#define WRITE_RGBA "write_rgba" +#define WRITE_RGBx "write_rgbx" +#define WRITE_BGRA "write_bgra" +#define WRITE_BGRx "write_bgrx" +#define WRITE_ARGB "write_argb" +#define WRITE_ABGR "write_abgr" +#define WRITE_RGB "write_rgb" +#define WRITE_BGR "write_bgr" +#define WRITE_RGB10A2 "write_rgb10a2" +#define WRITE_BGR10A2 "write_bgr10a2" +#define WRITE_Y42B "write_y42b" +#define WRITE_I422_10 "write_i422_10" +#define WRITE_I422_12 "write_i422_12" +#define WRITE_RGBP "write_rgbp" +#define WRITE_BGRP "write_bgrp" +#define WRITE_GBR "write_gbr" +#define WRITE_GBRA "write_gbra" + +/* *INDENT-OFF* */ +const static gchar KERNEL_COMMON = +"struct ColorMatrix\n" +"{\n" +" float CoeffX3;\n" +" float CoeffY3;\n" +" float CoeffZ3;\n" +" float Offset3;\n" +" float Min3;\n" +" float Max3;\n" +"};\n" +"\n" +"__device__ inline float\n" +"dot (const float coeff3, float3 val)\n" +"{\n" +" return coeff0 * val.x + coeff1 * val.y + coeff2 * val.z;\n" +"}\n" +"\n" +"__device__ inline float\n" +"clamp (float val, float min_val, float max_val)\n" +"{\n" +" return max (min_val, min (val, max_val));\n" +"}\n" +"\n" +"__device__ inline float3\n" +"clamp3 (float3 val, const float min_val3, const float max_val3)\n" +"{\n" +" return make_float3 (clamp (val.x, min_val0, max_val0),\n" +" clamp (val.y, min_val1, max_val2),\n" +" clamp (val.z, min_val1, max_val2));\n" +"}\n" +"\n" +"__device__ inline unsigned char\n" +"scale_to_2bits (float val)\n" +"{\n" +" return (unsigned short) __float2int_rz (val * 3.0);\n" +"}\n" +"\n" +"__device__ inline unsigned char\n" +"scale_to_uchar (float val)\n" +"{\n" +" return (unsigned char) __float2int_rz (val * 255.0);\n" +"}\n" +"\n" +"__device__ inline unsigned short\n" +"scale_to_ushort (float val)\n" +"{\n" +" return (unsigned short) __float2int_rz (val * 65535.0);\n" +"}\n" +"\n" +"__device__ inline unsigned short\n" +"scale_to_10bits (float val)\n" +"{\n" +" return (unsigned short) __float2int_rz (val * 1023.0);\n" +"}\n" +"\n" +"__device__ inline unsigned short\n" +"scale_to_12bits (float val)\n" +"{\n" +" return (unsigned short) __float2int_rz (val * 4095.0);\n" +"}\n" +"\n" +"__device__ inline float3\n" +COLOR_SPACE_IDENTITY "(float3 sample, const ColorMatrix * matrix)\n" +"{\n" +" return sample;\n" +"}\n" +"\n" +"__device__ inline float3\n" +COLOR_SPACE_CONVERT "(float3 sample, const ColorMatrix * matrix)\n" +"{\n" +" float3 out;\n" +" out.x = dot (matrix->CoeffX, sample);\n" +" out.y = dot (matrix->CoeffY, sample);\n" +" out.z = dot (matrix->CoeffZ, sample);\n" +" out.x += matrix->Offset0;\n" +" out.y += matrix->Offset1;\n" +" out.z += matrix->Offset2;\n" +" return clamp3 (out, matrix->Min, matrix->Max);\n" +"}\n" +"/* All 8bits yuv planar except for yv12 */\n" +"__device__ inline float4\n" +SAMPLE_YUV_PLANAR "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float luma = tex2D<float>(tex0, x, y);\n" +" float u = tex2D<float>(tex1, x, y);\n" +" float v = tex2D<float>(tex2, x, y);\n" +" return make_float4 (luma, u, v, 1);\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_YV12 "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float luma = tex2D<float>(tex0, x, y);\n" +" float u = tex2D<float>(tex2, x, y);\n" +" float v = tex2D<float>(tex1, x, y);\n" +" return make_float4 (luma, u, v, 1);\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_YUV_PLANAR_10BIS "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float luma = tex2D<float>(tex0, x, y);\n" +" float u = tex2D<float>(tex1, x, y);\n" +" float v = tex2D<float>(tex2, x, y);\n" +" /* (1 << 6) to scale 0, 1.0) range */\n" +" return make_float4 (luma * 64, u * 64, v * 64, 1);\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_YUV_PLANAR_12BIS "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float luma = tex2D<float>(tex0, x, y);\n" +" float u = tex2D<float>(tex1, x, y);\n" +" float v = tex2D<float>(tex2, x, y);\n" +" /* (1 << 6) to scale 0, 1.0) range */\n" +" return make_float4 (luma * 16, u * 16, v * 16, 1);\n" +"}\n" +"\n" +"/* NV12, P010, and P016 */\n" +"__device__ inline float4\n" +SAMPLE_SEMI_PLANAR "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float luma = tex2D<float>(tex0, x, y);\n" +" float2 uv = tex2D<float2>(tex1, x, y);\n" +" return make_float4 (luma, uv.x, uv.y, 1);\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_SEMI_PLANAR_SWAP "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float luma = tex2D<float>(tex0, x, y);\n" +" float2 vu = tex2D<float2>(tex1, x, y);\n" +" return make_float4 (luma, vu.y, vu.x, 1);\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_RGBA "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" return tex2D<float4>(tex0, x, y);\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_BGRA "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float4 bgra = tex2D<float4>(tex0, x, y);\n" +" return make_float4 (bgra.z, bgra.y, bgra.x, bgra.w);\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_RGBx "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float4 rgbx = tex2D<float4>(tex0, x, y);\n" +" rgbx.w = 1;\n" +" return rgbx;\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_BGRx "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float4 bgrx = tex2D<float4>(tex0, x, y);\n" +" return make_float4 (bgrx.z, bgrx.y, bgrx.x, 1);\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_ARGB "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float4 argb = tex2D<float4>(tex0, x, y);\n" +" return make_float4 (argb.y, argb.z, argb.w, argb.x);\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_AGBR "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float4 abgr = tex2D<float4>(tex0, x, y);\n" +" return make_float4 (abgr.w, abgr.z, abgr.y, abgr.x);\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_RGBP "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float r = tex2D<float>(tex0, x, y);\n" +" float g = tex2D<float>(tex1, x, y);\n" +" float b = tex2D<float>(tex2, x, y);\n" +" return make_float4 (r, g, b, 1);\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_BGRP "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float b = tex2D<float>(tex0, x, y);\n" +" float g = tex2D<float>(tex1, x, y);\n" +" float r = tex2D<float>(tex2, x, y);\n" +" return make_float4 (r, g, b, 1);\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_GBR "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float g = tex2D<float>(tex0, x, y);\n" +" float b = tex2D<float>(tex1, x, y);\n" +" float r = tex2D<float>(tex2, x, y);\n" +" return make_float4 (r, g, b, 1);\n" +"}\n" +"\n" +"__device__ inline float4\n" +SAMPLE_GBRA "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, float x, float y)\n" +"{\n" +" float g = tex2D<float>(tex0, x, y);\n" +" float b = tex2D<float>(tex1, x, y);\n" +" float r = tex2D<float>(tex2, x, y);\n" +" float a = tex2D<float>(tex3, x, y);\n" +" return make_float4 (r, g, b, a);\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_I420 "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" dst0x + y * stride0 = scale_to_uchar (sample.x);\n" +" if (x % 2 == 0 && y % 2 == 0) {\n" +" unsigned int pos = x / 2 + (y / 2) * stride1;\n" +" dst1pos = scale_to_uchar (sample.y);\n" +" dst2pos = scale_to_uchar (sample.z);\n" +" }\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_YV12 "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" dst0x + y * stride0 = scale_to_uchar (sample.x);\n" +" if (x % 2 == 0 && y % 2 == 0) {\n" +" unsigned int pos = x / 2 + (y / 2) * stride1;\n" +" dst1pos = scale_to_uchar (sample.z);\n" +" dst2pos = scale_to_uchar (sample.y);\n" +" }\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_NV12 "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" dst0x + y * stride0 = scale_to_uchar (sample.x);\n" +" if (x % 2 == 0 && y % 2 == 0) {\n" +" unsigned int pos = x + (y / 2) * stride1;\n" +" dst1pos = scale_to_uchar (sample.y);\n" +" dst1pos + 1 = scale_to_uchar (sample.z);\n" +" }\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_NV21 "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" dst0x + y * stride0 = scale_to_uchar (sample.x);\n" +" if (x % 2 == 0 && y % 2 == 0) {\n" +" unsigned int pos = x + (y / 2) * stride1;\n" +" dst1pos = scale_to_uchar (sample.z);\n" +" dst1pos + 1 = scale_to_uchar (sample.y);\n" +" }\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_P010 "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" *(unsigned short *) &dst0x * 2 + y * stride0 = scale_to_ushort (sample.x);\n" +" if (x % 2 == 0 && y % 2 == 0) {\n" +" unsigned int pos = x * 2 + (y / 2) * stride1;\n" +" *(unsigned short *) &dst1pos = scale_to_ushort (sample.y);\n" +" *(unsigned short *) &dst1pos + 2 = scale_to_ushort (sample.z);\n" +" }\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_I420_10 "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" *(unsigned short *) &dst0x * 2 + y * stride0 = scale_to_10bits (sample.x);\n" +" if (x % 2 == 0 && y % 2 == 0) {\n" +" unsigned int pos = x + (y / 2) * stride1;\n" +" *(unsigned short *) &dst1pos = scale_to_10bits (sample.y);\n" +" *(unsigned short *) &dst2pos = scale_to_10bits (sample.z);\n" +" }\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_Y444 "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x + y * stride0;\n" +" dst0pos = scale_to_uchar (sample.x);\n" +" dst1pos = scale_to_uchar (sample.y);\n" +" dst2pos = scale_to_uchar (sample.z);\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_Y444_16 "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x * 2 + y * stride0;\n" +" *(unsigned short *) &dst0pos = scale_to_ushort (sample.x);\n" +" *(unsigned short *) &dst1pos = scale_to_ushort (sample.y);\n" +" *(unsigned short *) &dst2pos = scale_to_ushort (sample.z);\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_RGBA "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x * 4 + y * stride0;\n" +" dst0pos = scale_to_uchar (sample.x);\n" +" dst0pos + 1 = scale_to_uchar (sample.y);\n" +" dst0pos + 2 = scale_to_uchar (sample.z);\n" +" dst0pos + 3 = scale_to_uchar (sample.w);\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_RGBx "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x * 4 + y * stride0;\n" +" dst0pos = scale_to_uchar (sample.x);\n" +" dst0pos + 1 = scale_to_uchar (sample.y);\n" +" dst0pos + 2 = scale_to_uchar (sample.z);\n" +" dst0pos + 3 = 255;\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_BGRA "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x * 4 + y * stride0;\n" +" dst0pos = scale_to_uchar (sample.z);\n" +" dst0pos + 1 = scale_to_uchar (sample.y);\n" +" dst0pos + 2 = scale_to_uchar (sample.x);\n" +" dst0pos + 3 = scale_to_uchar (sample.w);\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_BGRx "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x * 4 + y * stride0;\n" +" dst0pos = scale_to_uchar (sample.z);\n" +" dst0pos + 1 = scale_to_uchar (sample.y);\n" +" dst0pos + 2 = scale_to_uchar (sample.x);\n" +" dst0pos + 3 = 255;\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_ARGB "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x * 4 + y * stride0;\n" +" dst0pos = scale_to_uchar (sample.w);\n" +" dst0pos + 1 = scale_to_uchar (sample.x);\n" +" dst0pos + 2 = scale_to_uchar (sample.y);\n" +" dst0pos + 3 = scale_to_uchar (sample.z);\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_ABGR "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x * 4 + y * stride0;\n" +" dst0pos = scale_to_uchar (sample.w);\n" +" dst0pos + 1 = scale_to_uchar (sample.z);\n" +" dst0pos + 2 = scale_to_uchar (sample.y);\n" +" dst0pos + 3 = scale_to_uchar (sample.x);\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_RGB "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x * 3 + y * stride0;\n" +" dst0pos = scale_to_uchar (sample.x);\n" +" dst0pos + 1 = scale_to_uchar (sample.y);\n" +" dst0pos + 2 = scale_to_uchar (sample.z);\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_BGR "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x * 3 + y * stride0;\n" +" dst0pos = scale_to_uchar (sample.z);\n" +" dst0pos + 1 = scale_to_uchar (sample.y);\n" +" dst0pos + 2 = scale_to_uchar (sample.x);\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_RGB10A2 "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" unsigned int alpha = (unsigned int) scale_to_2bits (sample.x);\n" +" unsigned int packed_rgb = alpha << 30;\n" +" packed_rgb |= ((unsigned int) scale_to_10bits (sample.x));\n" +" packed_rgb |= ((unsigned int) scale_to_10bits (sample.y)) << 10;\n" +" packed_rgb |= ((unsigned int) scale_to_10bits (sample.z)) << 20;\n" +" *(unsigned int *) &dst0x * 4 + y * stride0 = packed_rgb;\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_BGR10A2 "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" unsigned int alpha = (unsigned int) scale_to_2bits (sample.x);\n" +" unsigned int packed_rgb = alpha << 30;\n" +" packed_rgb |= ((unsigned int) scale_to_10bits (sample.x)) << 20;\n" +" packed_rgb |= ((unsigned int) scale_to_10bits (sample.y)) << 10;\n" +" packed_rgb |= ((unsigned int) scale_to_10bits (sample.z));\n" +" *(unsigned int *) &dst0x * 4 + y * stride0 = packed_rgb;\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_Y42B "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" dst0x + y * stride0 = scale_to_uchar (sample.x);\n" +" if (x % 2 == 0) {\n" +" unsigned int pos = x / 2 + y * stride1;\n" +" dst1pos = scale_to_uchar (sample.y);\n" +" dst2pos = scale_to_uchar (sample.z);\n" +" }\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_I422_10 "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" *(unsigned short *) &dst0x * 2 + y * stride0 = scale_to_10bits (sample.x);\n" +" if (x % 2 == 0) {\n" +" unsigned int pos = x + y * stride1;\n" +" *(unsigned short *) &dst1pos = scale_to_10bits (sample.y);\n" +" *(unsigned short *) &dst2pos = scale_to_10bits (sample.z);\n" +" }\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_I422_12 "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" *(unsigned short *) &dst0x * 2 + y * stride0 = scale_to_12bits (sample.x);\n" +" if (x % 2 == 0) {\n" +" unsigned int pos = x + y * stride1;\n" +" *(unsigned short *) &dst1pos = scale_to_12bits (sample.y);\n" +" *(unsigned short *) &dst2pos = scale_to_12bits (sample.z);\n" +" }\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_RGBP "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x + y * stride0;\n" +" dst0pos = scale_to_uchar (sample.x);\n" +" dst1pos = scale_to_uchar (sample.y);\n" +" dst2pos = scale_to_uchar (sample.z);\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_BGRP "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x + y * stride0;\n" +" dst0pos = scale_to_uchar (sample.z);\n" +" dst1pos = scale_to_uchar (sample.y);\n" +" dst2pos = scale_to_uchar (sample.x);\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_GBR "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x + y * stride0;\n" +" dst0pos = scale_to_uchar (sample.y);\n" +" dst1pos = scale_to_uchar (sample.z);\n" +" dst2pos = scale_to_uchar (sample.x);\n" +"}\n" +"\n" +"__device__ inline void\n" +WRITE_GBRA "(unsigned char * dst0, unsigned char * dst1, unsigned char * dst2,\n" +" unsigned char * dst3, float4 sample, int x, int y, int stride0, int stride1)\n" +"{\n" +" int pos = x + y * stride0;\n" +" dst0pos = scale_to_uchar (sample.y);\n" +" dst1pos = scale_to_uchar (sample.z);\n" +" dst2pos = scale_to_uchar (sample.x);\n" +" dst3pos = scale_to_uchar (sample.w);\n" +"}\n"; + +#define GST_CUDA_KERNEL_UNPACK_FUNC "gst_cuda_kernel_unpack_func" +static const gchar RGB_TO_RGBx = +"extern \"C\" {\n" +"__global__ void\n" +GST_CUDA_KERNEL_UNPACK_FUNC +"(unsigned char *src, unsigned char *dst, int width, int height,\n" +" int src_stride, int dst_stride)\n" +"{\n" +" int x_pos = blockIdx.x * blockDim.x + threadIdx.x;\n" +" int y_pos = blockIdx.y * blockDim.y + threadIdx.y;\n" +" if (x_pos < width && y_pos < height) {\n" +" int dst_pos = x_pos * 4 + y_pos * dst_stride;\n" +" int src_pos = x_pos * 3 + y_pos * src_stride;\n" +" dstdst_pos = srcsrc_pos;\n" +" dstdst_pos + 1 = srcsrc_pos + 1;\n" +" dstdst_pos + 2 = srcsrc_pos + 2;\n" +" dstdst_pos + 3 = 0xff;\n" +" }\n" +"}\n" +"}\n"; + +static const gchar RGB10A2_TO_ARGB64 = +"extern \"C\" {\n" +"__global__ void\n" +GST_CUDA_KERNEL_UNPACK_FUNC +"(unsigned char *src, unsigned char *dst, int width, int height,\n" +" int src_stride, int dst_stride)\n" +"{\n" +" int x_pos = blockIdx.x * blockDim.x + threadIdx.x;\n" +" int y_pos = blockIdx.y * blockDim.y + threadIdx.y;\n" +" if (x_pos < width && y_pos < height) {\n" +" unsigned short a, r, g, b;\n" +" unsigned int val;\n" +" int dst_pos = x_pos * 8 + y_pos * dst_stride;\n" +" val = *(unsigned int *)&srcx_pos * 4 + y_pos * src_stride;\n" +" a = (val >> 30) & 0x03;\n" +" a = (a << 14) | (a << 12) | (a << 10) | (a << 8) | (a << 6) | (a << 4) | (a << 2) | (a << 0);\n" +" r = (val & 0x3ff);\n" +" r = (r << 6) | (r >> 4);\n" +" g = ((val >> 10) & 0x3ff);\n" +" g = (g << 6) | (g >> 4);\n" +" b = ((val >> 20) & 0x3ff);\n" +" b = (b << 6) | (b >> 4);\n" +" *(unsigned short *) &dstdst_pos = a;\n" +" *(unsigned short *) &dstdst_pos + 2 = r;\n" +" *(unsigned short *) &dstdst_pos + 4 = g;\n" +" *(unsigned short *) &dstdst_pos + 6 = b;\n" +" }\n" +"}\n" +"}\n"; + +static const gchar BGR10A2_TO_ARGB64 = +"extern \"C\" {\n" +"__global__ void\n" +GST_CUDA_KERNEL_UNPACK_FUNC +"(unsigned char *src, unsigned char *dst, int width, int height,\n" +" int src_stride, int dst_stride)\n" +"{\n" +" int x_pos = blockIdx.x * blockDim.x + threadIdx.x;\n" +" int y_pos = blockIdx.y * blockDim.y + threadIdx.y;\n" +" if (x_pos < width && y_pos < height) {\n" +" unsigned short a, r, g, b;\n" +" unsigned int val;\n" +" int dst_pos = x_pos * 8 + y_pos * dst_stride;\n" +" val = *(unsigned int *)&srcx_pos * 4 + y_pos * src_stride;\n" +" a = (val >> 30) & 0x03;\n" +" a = (a << 14) | (a << 12) | (a << 10) | (a << 8) | (a << 6) | (a << 4) | (a << 2) | (a << 0);\n" +" b = (val & 0x3ff);\n" +" b = (b << 6) | (b >> 4);\n" +" g = ((val >> 10) & 0x3ff);\n" +" g = (g << 6) | (g >> 4);\n" +" r = ((val >> 20) & 0x3ff);\n" +" r = (r << 6) | (r >> 4);\n" +" *(unsigned short *) &dstdst_pos = a;\n" +" *(unsigned short *) &dstdst_pos + 2 = r;\n" +" *(unsigned short *) &dstdst_pos + 4 = g;\n" +" *(unsigned short *) &dstdst_pos + 6 = b;\n" +" }\n" +"}\n" +"}\n"; + +#define GST_CUDA_KERNEL_MAIN_FUNC "KernelMain" + +static const gchar TEMPLETA_KERNEL = +/* KERNEL_COMMON */ +"%s\n" +/* UNPACK FUNCTION */ +"%s\n" +"__constant__ ColorMatrix TO_RGB_MATRIX = { { %s, %s, %s },\n" +" { %s, %s, %s },\n" +" { %s, %s, %s },\n" +" { %s, %s, %s },\n" +" { %s, %s, %s },\n" +" { %s, %s, %s } };\n" +"__constant__ ColorMatrix TO_YUV_MATRIX = { { %s, %s, %s },\n" +" { %s, %s, %s },\n" +" { %s, %s, %s },\n" +" { %s, %s, %s },\n" +" { %s, %s, %s },\n" +" { %s, %s, %s } };\n" +"__constant__ int WIDTH = %d;\n" +"__constant__ int HEIGHT = %d;\n" +"__constant__ int LEFT = %d;\n" +"__constant__ int TOP = %d;\n" +"__constant__ int RIGHT = %d;\n" +"__constant__ int BOTTOM = %d;\n" +"__constant__ int VIEW_WIDTH = %d;\n" +"__constant__ int VIEW_HEIGHT = %d;\n" +"__constant__ float OFFSET_X = %s;\n" +"__constant__ float OFFSET_Y = %s;\n" +"__constant__ float BORDER_X = %s;\n" +"__constant__ float BORDER_Y = %s;\n" +"__constant__ float BORDER_Z = %s;\n" +"__constant__ float BORDER_W = %s;\n" +"\n" +"extern \"C\" {\n" +"__global__ void\n" +GST_CUDA_KERNEL_MAIN_FUNC "(cudaTextureObject_t tex0, cudaTextureObject_t tex1,\n" +" cudaTextureObject_t tex2, cudaTextureObject_t tex3, unsigned char * dst0,\n" +" unsigned char * dst1, unsigned char * dst2, unsigned char * dst3,\n" +" int stride0, int stride1)\n" +"{\n" +" int x_pos = blockIdx.x * blockDim.x + threadIdx.x;\n" +" int y_pos = blockIdx.y * blockDim.y + threadIdx.y;\n" +" float4 sample;\n" +" if (x_pos >= WIDTH || y_pos >= HEIGHT)\n" +" return;\n" +" if (x_pos < LEFT || x_pos >= RIGHT || y_pos < TOP || y_pos >= BOTTOM) {\n" +" sample = make_float4 (BORDER_X, BORDER_Y, BORDER_Z, BORDER_W);\n" +" } else {\n" +" float x = OFFSET_X + (float) (x_pos - LEFT) / VIEW_WIDTH;\n" +" float y = OFFSET_Y + (float) (y_pos - TOP) / VIEW_HEIGHT;\n" +" float4 s = %s (tex0, tex1, tex2, tex3, x, y);\n" +" float3 xyz = make_float3 (s.x, s.y, s.z);\n" +" float3 rgb = %s (xyz, &TO_RGB_MATRIX);\n" +" float3 yuv = %s (rgb, &TO_YUV_MATRIX);\n" +" sample = make_float4 (yuv.x, yuv.y, yuv.z, s.w);\n" +" }\n" +" %s (dst0, dst1, dst2, dst3, sample, x_pos, y_pos, stride0, stride1);\n" +"}\n" +"}\n"; +/* *INDENT-ON* */ + +typedef struct _TextureFormat +{ + GstVideoFormat format; + CUarray_format array_formatGST_VIDEO_MAX_COMPONENTS; + guint channelsGST_VIDEO_MAX_COMPONENTS; + const gchar *sample_func; +} TextureFormat; + +#define CU_AD_FORMAT_NONE 0 +#define MAKE_FORMAT_YUV_PLANAR(f,cf,sample_func) \ + { GST_VIDEO_FORMAT_ ##f, { CU_AD_FORMAT_ ##cf, CU_AD_FORMAT_ ##cf, \ + CU_AD_FORMAT_ ##cf, CU_AD_FORMAT_NONE }, {1, 1, 1, 0}, sample_func } +#define MAKE_FORMAT_YUV_SEMI_PLANAR(f,cf,sample_func) \ + { GST_VIDEO_FORMAT_ ##f, { CU_AD_FORMAT_ ##cf, CU_AD_FORMAT_ ##cf, \ + CU_AD_FORMAT_NONE, CU_AD_FORMAT_NONE }, {1, 2, 0, 0}, sample_func } +#define MAKE_FORMAT_RGB(f,cf,sample_func) \ + { GST_VIDEO_FORMAT_ ##f, { CU_AD_FORMAT_ ##cf, CU_AD_FORMAT_NONE, \ + CU_AD_FORMAT_NONE, CU_AD_FORMAT_NONE }, {4, 0, 0, 0}, sample_func } +#define MAKE_FORMAT_RGBP(f,cf,sample_func) \ + { GST_VIDEO_FORMAT_ ##f, { CU_AD_FORMAT_ ##cf, CU_AD_FORMAT_ ##cf, \ + CU_AD_FORMAT_ ##cf, CU_AD_FORMAT_NONE }, {1, 1, 1, 0}, sample_func } +#define MAKE_FORMAT_RGBAP(f,cf,sample_func) \ + { GST_VIDEO_FORMAT_ ##f, { CU_AD_FORMAT_ ##cf, CU_AD_FORMAT_ ##cf, \ + CU_AD_FORMAT_ ##cf, CU_AD_FORMAT_ ##cf }, {1, 1, 1, 1}, sample_func } + +static const TextureFormat format_map = { + MAKE_FORMAT_YUV_PLANAR (I420, UNSIGNED_INT8, SAMPLE_YUV_PLANAR), + MAKE_FORMAT_YUV_PLANAR (YV12, UNSIGNED_INT8, SAMPLE_YV12), + MAKE_FORMAT_YUV_SEMI_PLANAR (NV12, UNSIGNED_INT8, SAMPLE_SEMI_PLANAR), + MAKE_FORMAT_YUV_SEMI_PLANAR (NV21, UNSIGNED_INT8, SAMPLE_SEMI_PLANAR_SWAP), + MAKE_FORMAT_YUV_SEMI_PLANAR (P010_10LE, UNSIGNED_INT16, SAMPLE_SEMI_PLANAR), + MAKE_FORMAT_YUV_SEMI_PLANAR (P016_LE, UNSIGNED_INT16, SAMPLE_SEMI_PLANAR), + MAKE_FORMAT_YUV_PLANAR (I420_10LE, UNSIGNED_INT16, SAMPLE_YUV_PLANAR_10BIS), + MAKE_FORMAT_YUV_PLANAR (Y444, UNSIGNED_INT8, SAMPLE_YUV_PLANAR), + MAKE_FORMAT_YUV_PLANAR (Y444_16LE, UNSIGNED_INT16, SAMPLE_YUV_PLANAR), + MAKE_FORMAT_RGB (RGBA, UNSIGNED_INT8, SAMPLE_RGBA), + MAKE_FORMAT_RGB (BGRA, UNSIGNED_INT8, SAMPLE_BGRA), + MAKE_FORMAT_RGB (RGBx, UNSIGNED_INT8, SAMPLE_RGBx), + MAKE_FORMAT_RGB (BGRx, UNSIGNED_INT8, SAMPLE_BGRx), + MAKE_FORMAT_RGB (ARGB, UNSIGNED_INT8, SAMPLE_ARGB), + MAKE_FORMAT_RGB (ARGB64, UNSIGNED_INT16, SAMPLE_ARGB64), + MAKE_FORMAT_RGB (ABGR, UNSIGNED_INT8, SAMPLE_AGBR), + MAKE_FORMAT_YUV_PLANAR (Y42B, UNSIGNED_INT8, SAMPLE_YUV_PLANAR), + MAKE_FORMAT_YUV_PLANAR (I422_10LE, UNSIGNED_INT16, SAMPLE_YUV_PLANAR_10BIS), + MAKE_FORMAT_YUV_PLANAR (I422_12LE, UNSIGNED_INT16, SAMPLE_YUV_PLANAR_12BIS), + MAKE_FORMAT_RGBP (RGBP, UNSIGNED_INT8, SAMPLE_RGBP), + MAKE_FORMAT_RGBP (BGRP, UNSIGNED_INT8, SAMPLE_BGRP), + MAKE_FORMAT_RGBP (GBR, UNSIGNED_INT8, SAMPLE_GBR), + MAKE_FORMAT_RGBAP (GBRA, UNSIGNED_INT8, SAMPLE_GBRA), +}; + +typedef struct _TextureBuffer +{ + CUdeviceptr ptr; + gsize stride; +} TextureBuffer; + +typedef struct +{ + gint x; + gint y; + gint width; + gint height; +} ConverterRect; + +struct _GstCudaConverterPrivate +{ + GstVideoInfo in_info; + GstVideoInfo out_info; + + GstStructure *config; + + GstVideoInfo texture_info; + const TextureFormat *texture_fmt; + gint texture_align; + ConverterRect dest_rect; + + TextureBuffer fallback_bufferGST_VIDEO_MAX_COMPONENTS; + CUfilter_mode filter_modeGST_VIDEO_MAX_COMPONENTS; + TextureBuffer unpack_buffer; + + CUmodule module; + CUfunction main_func; + CUfunction unpack_func; +}; + +static void gst_cuda_converter_dispose (GObject * object); +static void gst_cuda_converter_finalize (GObject * object); + +#define gst_cuda_converter_parent_class parent_class +G_DEFINE_TYPE_WITH_PRIVATE (GstCudaConverter, gst_cuda_converter, + GST_TYPE_OBJECT); + +static void +gst_cuda_converter_class_init (GstCudaConverterClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = gst_cuda_converter_dispose; + object_class->finalize = gst_cuda_converter_finalize; + + GST_DEBUG_CATEGORY_INIT (gst_cuda_converter_debug, + "cudaconverter", 0, "cudaconverter"); +} + +static void +gst_cuda_converter_init (GstCudaConverter * self) +{ + GstCudaConverterPrivate *priv; + + self->priv = priv = gst_cuda_converter_get_instance_private (self); + priv->config = gst_structure_new_empty ("GstCudaConverter"); +} + +static void +gst_cuda_converter_dispose (GObject * object) +{ + GstCudaConverter *self = GST_CUDA_CONVERTER (object); + GstCudaConverterPrivate *priv = self->priv; + guint i; + + if (self->context && gst_cuda_context_push (self->context)) { + if (priv->module) { + CuModuleUnload (priv->module); + priv->module = NULL; + } + + for (i = 0; i < G_N_ELEMENTS (priv->fallback_buffer); i++) { + if (priv->fallback_bufferi.ptr) { + CuMemFree (priv->fallback_bufferi.ptr); + priv->fallback_bufferi.ptr = 0; + } + } + + if (priv->unpack_buffer.ptr) { + CuMemFree (priv->unpack_buffer.ptr); + priv->unpack_buffer.ptr = 0; + } + + gst_cuda_context_pop (NULL); + } + + gst_clear_object (&self->context); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_cuda_converter_finalize (GObject * object) +{ + GstCudaConverter *self = GST_CUDA_CONVERTER (object); + GstCudaConverterPrivate *priv = self->priv; + + gst_structure_free (priv->config); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static const gchar * +get_color_range_name (GstVideoColorRange range) +{ + switch (range) { + case GST_VIDEO_COLOR_RANGE_0_255: + return "FULL"; + case GST_VIDEO_COLOR_RANGE_16_235: + return "STUDIO"; + default: + break; + } + + return "UNKNOWN"; +} + +typedef struct _GstCudaColorMatrixString +{ + gchar matrix33G_ASCII_DTOSTR_BUF_SIZE; + gchar offset3G_ASCII_DTOSTR_BUF_SIZE; + gchar min3G_ASCII_DTOSTR_BUF_SIZE; + gchar max3G_ASCII_DTOSTR_BUF_SIZE; +} GstCudaColorMatrixString; + +static void +color_matrix_to_string (const GstCudaColorMatrix * m, + GstCudaColorMatrixString * str) +{ + guint i, j; + for (i = 0; i < 3; i++) { + for (j = 0; j < 3; j++) { + g_ascii_formatd (str->matrixij, G_ASCII_DTOSTR_BUF_SIZE, "%f", + m->matrixij); + } + + g_ascii_formatd (str->offseti, + G_ASCII_DTOSTR_BUF_SIZE, "%f", m->offseti); + g_ascii_formatd (str->mini, G_ASCII_DTOSTR_BUF_SIZE, "%f", m->mini); + g_ascii_formatd (str->maxi, G_ASCII_DTOSTR_BUF_SIZE, "%f", m->maxi); + } +} + +static gboolean +gst_cuda_converter_setup (GstCudaConverter * self) +{ + GstCudaConverterPrivate *priv = self->priv; + const GstVideoInfo *in_info; + const GstVideoInfo *out_info; + const GstVideoInfo *texture_info; + GstCudaColorMatrix to_rgb_matrix; + GstCudaColorMatrix to_yuv_matrix; + GstCudaColorMatrix border_color_matrix; + GstCudaColorMatrixString to_rgb_matrix_str; + GstCudaColorMatrixString to_yuv_matrix_str; + gchar border_color_str4G_ASCII_DTOSTR_BUF_SIZE; + gdouble border_color4; + gchar offset_xG_ASCII_DTOSTR_BUF_SIZE; + gchar offset_yG_ASCII_DTOSTR_BUF_SIZE; + gint i, j; + const gchar *unpack_function = NULL; + const gchar *write_func = NULL; + const gchar *to_rgb_func = COLOR_SPACE_IDENTITY; + const gchar *to_yuv_func = COLOR_SPACE_IDENTITY; + const GstVideoColorimetry *in_color; + const GstVideoColorimetry *out_color; + gchar *str; + gchar *ptx; + CUresult ret; + + in_info = &priv->in_info; + out_info = &priv->out_info; + texture_info = &priv->texture_info; + in_color = &in_info->colorimetry; + out_color = &out_info->colorimetry; + + memset (&to_rgb_matrix, 0, sizeof (GstCudaColorMatrix)); + color_matrix_identity (&to_rgb_matrix); + + memset (&to_yuv_matrix, 0, sizeof (GstCudaColorMatrix)); + color_matrix_identity (&to_yuv_matrix); + + switch (GST_VIDEO_INFO_FORMAT (out_info)) { + case GST_VIDEO_FORMAT_I420: + write_func = WRITE_I420; + break; + case GST_VIDEO_FORMAT_YV12: + write_func = WRITE_YV12; + break; + case GST_VIDEO_FORMAT_NV12: + write_func = WRITE_NV12; + break; + case GST_VIDEO_FORMAT_NV21: + write_func = WRITE_NV21; + break; + case GST_VIDEO_FORMAT_P010_10LE: + write_func = WRITE_P010; + break; + case GST_VIDEO_FORMAT_P016_LE: + write_func = WRITE_P016; + break; + case GST_VIDEO_FORMAT_I420_10LE: + write_func = WRITE_I420_10; + break; + case GST_VIDEO_FORMAT_Y444: + write_func = WRITE_Y444; + break; + case GST_VIDEO_FORMAT_Y444_16LE: + write_func = WRITE_Y444_16; + break; + case GST_VIDEO_FORMAT_RGBA: + write_func = WRITE_RGBA; + break; + case GST_VIDEO_FORMAT_RGBx: + write_func = WRITE_RGBx; + break; + case GST_VIDEO_FORMAT_BGRA: + write_func = WRITE_BGRA; + break; + case GST_VIDEO_FORMAT_BGRx: + write_func = WRITE_BGRx; + break; + case GST_VIDEO_FORMAT_ARGB: + write_func = WRITE_ARGB; + break; + case GST_VIDEO_FORMAT_ABGR: + write_func = WRITE_ABGR; + break; + case GST_VIDEO_FORMAT_RGB: + write_func = WRITE_RGB; + break; + case GST_VIDEO_FORMAT_BGR: + write_func = WRITE_BGR; + break; + case GST_VIDEO_FORMAT_RGB10A2_LE: + write_func = WRITE_RGB10A2; + break; + case GST_VIDEO_FORMAT_BGR10A2_LE: + write_func = WRITE_BGR10A2; + break; + case GST_VIDEO_FORMAT_Y42B: + write_func = WRITE_Y42B; + break; + case GST_VIDEO_FORMAT_I422_10LE: + write_func = WRITE_I422_10; + break; + case GST_VIDEO_FORMAT_I422_12LE: + write_func = WRITE_I422_12; + break; + case GST_VIDEO_FORMAT_RGBP: + write_func = WRITE_RGBP; + break; + case GST_VIDEO_FORMAT_BGRP: + write_func = WRITE_BGRP; + break; + case GST_VIDEO_FORMAT_GBR: + write_func = WRITE_GBR; + break; + case GST_VIDEO_FORMAT_GBRA: + write_func = WRITE_GBRA; + break; + default: + break; + } + + if (!write_func) { + GST_ERROR_OBJECT (self, "Unknown write function for format %s", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info))); + return FALSE; + } + + /* Decide texture info to use, 3 channel RGB or 10bits packed RGB + * need be converted to other format */ + priv->texture_info = priv->in_info; + switch (GST_VIDEO_INFO_FORMAT (in_info)) { + case GST_VIDEO_FORMAT_RGB: + gst_video_info_set_format (&priv->texture_info, + GST_VIDEO_FORMAT_RGBx, GST_VIDEO_INFO_WIDTH (in_info), + GST_VIDEO_INFO_HEIGHT (in_info)); + unpack_function = RGB_TO_RGBx; + break; + case GST_VIDEO_FORMAT_BGR: + gst_video_info_set_format (&priv->texture_info, + GST_VIDEO_FORMAT_BGRx, GST_VIDEO_INFO_WIDTH (in_info), + GST_VIDEO_INFO_HEIGHT (in_info)); + unpack_function = RGB_TO_RGBx; + break; + case GST_VIDEO_FORMAT_RGB10A2_LE: + gst_video_info_set_format (&priv->texture_info, + GST_VIDEO_FORMAT_ARGB64, GST_VIDEO_INFO_WIDTH (in_info), + GST_VIDEO_INFO_HEIGHT (in_info)); + unpack_function = RGB10A2_TO_ARGB64; + break; + case GST_VIDEO_FORMAT_BGR10A2_LE: + gst_video_info_set_format (&priv->texture_info, + GST_VIDEO_FORMAT_ARGB64, GST_VIDEO_INFO_WIDTH (in_info), + GST_VIDEO_INFO_HEIGHT (in_info)); + unpack_function = BGR10A2_TO_ARGB64; + break; + default: + break; + } + + for (i = 0; i < G_N_ELEMENTS (format_map); i++) { + if (format_mapi.format == GST_VIDEO_INFO_FORMAT (texture_info)) { + priv->texture_fmt = &format_mapi; + break; + } + } + + if (!priv->texture_fmt) { + GST_ERROR_OBJECT (self, "Couldn't find texture format for %s (%s)", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info)), + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (texture_info))); + return FALSE; + } + + /* calculate black color + * TODO: add support border color */ + if (GST_VIDEO_INFO_IS_RGB (out_info)) { + GstVideoInfo rgb_info = *out_info; + rgb_info.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + gst_cuda_color_range_adjust_matrix_unorm (&rgb_info, out_info, + &border_color_matrix); + } else { + GstVideoInfo rgb_info; + + gst_video_info_set_format (&rgb_info, GST_VIDEO_FORMAT_RGBA64_LE, + out_info->width, out_info->height); + + gst_cuda_rgb_to_yuv_matrix_unorm (&rgb_info, + out_info, &border_color_matrix); + } + + for (i = 0; i < 3; i++) { + /* TODO: property */ + gdouble border_rgba4 = { 0, 0, 0 }; + border_colori = 0; + for (j = 0; j < 3; j++) + border_colori += border_color_matrix.matrixij * border_rgbai; + border_colori = border_color_matrix.offseti; + border_colori = CLAMP (border_colori, + border_color_matrix.mini, border_color_matrix.maxi); + + g_ascii_formatd (border_color_stri, + G_ASCII_DTOSTR_BUF_SIZE, "%f", border_colori); + } + g_ascii_formatd (border_color_str3, G_ASCII_DTOSTR_BUF_SIZE, "%f", 1); + + /* FIXME: handle primaries and transfer functions */ + if (GST_VIDEO_INFO_IS_RGB (texture_info)) { + if (GST_VIDEO_INFO_IS_RGB (out_info)) { + /* RGB -> RGB */ + if (in_color->range == out_color->range) { + GST_DEBUG_OBJECT (self, "RGB -> RGB conversion without matrix"); + } else { + if (!gst_cuda_color_range_adjust_matrix_unorm (in_info, out_info, + &to_rgb_matrix)) { + GST_ERROR_OBJECT (self, "Failed to get RGB range adjust matrix"); + return FALSE; + } + + str = gst_cuda_dump_color_matrix (&to_rgb_matrix); + GST_DEBUG_OBJECT (self, "RGB range adjust %s -> %s\n%s", + get_color_range_name (in_color->range), + get_color_range_name (out_color->range), str); + g_free (str); + + to_rgb_func = COLOR_SPACE_CONVERT; + } + } else { + /* RGB -> YUV */ + if (!gst_cuda_rgb_to_yuv_matrix_unorm (in_info, out_info, &to_yuv_matrix)) { + GST_ERROR_OBJECT (self, "Failed to get RGB -> YUV transform matrix"); + return FALSE; + } + + str = gst_cuda_dump_color_matrix (&to_yuv_matrix); + GST_DEBUG_OBJECT (self, "RGB -> YUV matrix:\n%s", str); + g_free (str); + + to_yuv_func = COLOR_SPACE_CONVERT; + } + } else { + if (GST_VIDEO_INFO_IS_RGB (out_info)) { + /* YUV -> RGB */ + if (!gst_cuda_yuv_to_rgb_matrix_unorm (in_info, out_info, &to_rgb_matrix)) { + GST_ERROR_OBJECT (self, "Failed to get YUV -> RGB transform matrix"); + return FALSE; + } + + str = gst_cuda_dump_color_matrix (&to_rgb_matrix); + GST_DEBUG_OBJECT (self, "YUV -> RGB matrix:\n%s", str); + g_free (str); + + to_rgb_func = COLOR_SPACE_CONVERT; + } else { + /* YUV -> YUV */ + if (in_color->range == out_color->range) { + GST_DEBUG_OBJECT (self, "YUV -> YU conversion without matrix"); + } else { + if (!gst_cuda_color_range_adjust_matrix_unorm (in_info, out_info, + &to_yuv_matrix)) { + GST_ERROR_OBJECT (self, "Failed to get GRAY range adjust matrix"); + return FALSE; + } + + str = gst_cuda_dump_color_matrix (&to_yuv_matrix); + GST_DEBUG_OBJECT (self, "YUV range adjust matrix:\n%s", str); + g_free (str); + + to_yuv_func = COLOR_SPACE_CONVERT; + } + } + } + + color_matrix_to_string (&to_rgb_matrix, &to_rgb_matrix_str); + color_matrix_to_string (&to_yuv_matrix, &to_yuv_matrix_str); + + /* half pixel offset, to sample texture at center of the pixel position */ + g_ascii_formatd (offset_x, G_ASCII_DTOSTR_BUF_SIZE, "%f", + (gdouble) 0.5 / priv->dest_rect.width); + g_ascii_formatd (offset_y, G_ASCII_DTOSTR_BUF_SIZE, "%f", + (gdouble) 0.5 / priv->dest_rect.height); + + str = g_strdup_printf (TEMPLETA_KERNEL, KERNEL_COMMON, + unpack_function ? unpack_function : "", + /* TO RGB matrix */ + to_rgb_matrix_str.matrix00, + to_rgb_matrix_str.matrix01, + to_rgb_matrix_str.matrix02, + to_rgb_matrix_str.matrix10, + to_rgb_matrix_str.matrix11, + to_rgb_matrix_str.matrix12, + to_rgb_matrix_str.matrix20, + to_rgb_matrix_str.matrix21, + to_rgb_matrix_str.matrix22, + to_rgb_matrix_str.offset0, + to_rgb_matrix_str.offset1, + to_rgb_matrix_str.offset2, + to_rgb_matrix_str.min0, + to_rgb_matrix_str.min1, + to_rgb_matrix_str.min2, + to_rgb_matrix_str.max0, + to_rgb_matrix_str.max1, to_rgb_matrix_str.max2, + /* TO YUV matrix */ + to_yuv_matrix_str.matrix00, + to_yuv_matrix_str.matrix01, + to_yuv_matrix_str.matrix02, + to_yuv_matrix_str.matrix10, + to_yuv_matrix_str.matrix11, + to_yuv_matrix_str.matrix12, + to_yuv_matrix_str.matrix20, + to_yuv_matrix_str.matrix21, + to_yuv_matrix_str.matrix22, + to_yuv_matrix_str.offset0, + to_yuv_matrix_str.offset1, + to_yuv_matrix_str.offset2, + to_yuv_matrix_str.min0, + to_yuv_matrix_str.min1, + to_yuv_matrix_str.min2, + to_yuv_matrix_str.max0, + to_yuv_matrix_str.max1, to_yuv_matrix_str.max2, + /* width/height */ + GST_VIDEO_INFO_WIDTH (out_info), GST_VIDEO_INFO_HEIGHT (out_info), + /* viewport */ + priv->dest_rect.x, priv->dest_rect.y, + priv->dest_rect.x + priv->dest_rect.width, + priv->dest_rect.y + priv->dest_rect.height, + priv->dest_rect.width, priv->dest_rect.height, + /* half pixel offsets */ + offset_x, offset_y, + /* border colors */ + border_color_str0, border_color_str1, + border_color_str2, border_color_str3, + /* sampler function name */ + priv->texture_fmt->sample_func, + /* TO RGB conversion function name */ + to_rgb_func, + /* TO YUV conversion function name */ + to_yuv_func, + /* write function name */ + write_func); + + GST_LOG_OBJECT (self, "kernel code:\n%s\n", str); + ptx = gst_cuda_nvrtc_compile (str); + g_free (str); + + if (!ptx) { + GST_ERROR_OBJECT (self, "Could not compile code"); + return FALSE; + } + + if (!gst_cuda_context_push (self->context)) { + GST_ERROR_OBJECT (self, "Couldn't push context"); + return FALSE; + } + + /* Allocates intermediate memory for texture */ + if (unpack_function) { + ret = CuMemAllocPitch (&priv->unpack_buffer.ptr, + &priv->unpack_buffer.stride, + GST_VIDEO_INFO_COMP_WIDTH (texture_info, 0) * + GST_VIDEO_INFO_COMP_PSTRIDE (texture_info, 0), + GST_VIDEO_INFO_HEIGHT (texture_info), 16); + if (!gst_cuda_result (ret)) { + GST_ERROR_OBJECT (self, "Couldn't allocate unpack buffer"); + goto error; + } + } + + ret = CuModuleLoadData (&priv->module, ptx); + g_free (ptx); + if (!gst_cuda_result (ret)) { + GST_ERROR_OBJECT (self, "Could not load module"); + priv->module = NULL; + goto error; + } + + ret = CuModuleGetFunction (&priv->main_func, + priv->module, GST_CUDA_KERNEL_MAIN_FUNC); + if (!gst_cuda_result (ret)) { + GST_ERROR_OBJECT (self, "Could not get main function"); + goto error; + } + + if (unpack_function) { + ret = CuModuleGetFunction (&priv->unpack_func, + priv->module, GST_CUDA_KERNEL_UNPACK_FUNC); + if (!gst_cuda_result (ret)) { + GST_ERROR_OBJECT (self, "Could not get unpack function"); + goto error; + } + } + + gst_cuda_context_pop (NULL); + + if (priv->dest_rect.x != 0 || priv->dest_rect.y != 0 || + priv->dest_rect.width != out_info->width || + priv->dest_rect.height != out_info->height || + in_info->width != out_info->width + || in_info->height != out_info->height) { + for (i = 0; i < G_N_ELEMENTS (priv->filter_mode); i++) + priv->filter_modei = CU_TR_FILTER_MODE_LINEAR; + } else { + for (i = 0; i < G_N_ELEMENTS (priv->filter_mode); i++) + priv->filter_modei = CU_TR_FILTER_MODE_POINT; + } + + return TRUE; + +error: + gst_cuda_context_pop (NULL); + return FALSE; +} + +static gboolean +copy_config (GQuark field_id, const GValue * value, gpointer user_data) +{ + GstCudaConverter *self = (GstCudaConverter *) user_data; + + gst_structure_id_set_value (self->priv->config, field_id, value); + + return TRUE; +} + +static void +gst_cuda_converter_set_config (GstCudaConverter * self, GstStructure * config) +{ + gst_structure_foreach (config, copy_config, self); + gst_structure_free (config); +} + +static gint +get_opt_int (GstCudaConverter * self, const gchar * opt, gint def) +{ + gint res; + if (!gst_structure_get_int (self->priv->config, opt, &res)) + res = def; + return res; +} + +GstCudaConverter * +gst_cuda_converter_new (const GstVideoInfo * in_info, + const GstVideoInfo * out_info, GstCudaContext * context, + GstStructure * config) +{ + GstCudaConverter *self; + GstCudaConverterPrivate *priv; + + g_return_val_if_fail (in_info != NULL, NULL); + g_return_val_if_fail (out_info != NULL, NULL); + g_return_val_if_fail (GST_IS_CUDA_CONTEXT (context), NULL); + + self = g_object_new (GST_TYPE_CUDA_CONVERTER, NULL); + + if (!GST_IS_CUDA_CONTEXT (context)) { + GST_WARNING_OBJECT (self, "Not a valid cuda context object"); + goto error; + } + + self->context = gst_object_ref (context); + priv = self->priv; + priv->in_info = *in_info; + priv->out_info = *out_info; + + if (config) + gst_cuda_converter_set_config (self, config); + + priv->dest_rect.x = get_opt_int (self, GST_CUDA_CONVERTER_OPT_DEST_X, 0); + priv->dest_rect.y = get_opt_int (self, GST_CUDA_CONVERTER_OPT_DEST_Y, 0); + priv->dest_rect.width = get_opt_int (self, + GST_CUDA_CONVERTER_OPT_DEST_WIDTH, out_info->width); + priv->dest_rect.height = get_opt_int (self, + GST_CUDA_CONVERTER_OPT_DEST_HEIGHT, out_info->height); + + if (!gst_cuda_converter_setup (self)) + goto error; + + priv->texture_align = gst_cuda_context_get_texture_alignment (context); + + gst_object_ref_sink (self); + return self; + +error: + gst_object_unref (self); + return NULL; +} + + +static CUtexObject +gst_cuda_converter_create_texture_unchecked (GstCudaConverter * self, + CUdeviceptr src, gint width, gint height, CUarray_format format, + guint channels, gint stride, gint plane, CUfilter_mode mode) +{ + CUDA_TEXTURE_DESC texture_desc; + CUDA_RESOURCE_DESC resource_desc; + CUtexObject texture = 0; + CUresult cuda_ret; + + memset (&texture_desc, 0, sizeof (CUDA_TEXTURE_DESC)); + memset (&resource_desc, 0, sizeof (CUDA_RESOURCE_DESC)); + + resource_desc.resType = CU_RESOURCE_TYPE_PITCH2D; + resource_desc.res.pitch2D.format = format; + resource_desc.res.pitch2D.numChannels = channels; + resource_desc.res.pitch2D.width = width; + resource_desc.res.pitch2D.height = height; + resource_desc.res.pitch2D.pitchInBytes = stride; + resource_desc.res.pitch2D.devPtr = src; + + texture_desc.filterMode = mode; + /* Will read texture value as a normalized 0, 1 float value + * with 0, 1) coordinates */ + /* CU_TRSF_NORMALIZED_COORDINATES */ + texture_desc.flags = 0x2; + /* CU_TR_ADDRESS_MODE_CLAMP */ + texture_desc.addressMode0 = 1; + texture_desc.addressMode1 = 1; + texture_desc.addressMode2 = 1; + + cuda_ret = CuTexObjectCreate (&texture, &resource_desc, &texture_desc, NULL); + + if (!gst_cuda_result (cuda_ret)) { + GST_ERROR_OBJECT (self, "Could not create texture"); + return 0; + } + + return texture; +} + +static gboolean +ensure_fallback_buffer (GstCudaConverter * self, gint width_in_bytes, + gint height, guint plane) +{ + GstCudaConverterPrivate *priv = self->priv; + CUresult ret; + + if (priv->fallback_bufferplane.ptr) + return TRUE; + + ret = CuMemAllocPitch (&priv->fallback_bufferplane.ptr, + &priv->fallback_bufferplane.stride, width_in_bytes, height, 16); + + if (!gst_cuda_result (ret)) { + GST_ERROR_OBJECT (self, "Couldn't allocate fallback buffer"); + return FALSE; + } + + return TRUE; +} + +static CUtexObject +gst_cuda_converter_create_texture (GstCudaConverter * self, + CUdeviceptr src, gint width, gint height, gint stride, CUfilter_mode mode, + CUarray_format format, guint channles, gint plane, CUstream stream) +{ + GstCudaConverterPrivate *priv = self->priv; + CUresult ret; + CUdeviceptr src_ptr; + + src_ptr = src; + + if (priv->texture_align > 0 && (src_ptr % priv->texture_align) != 0) { + CUDA_MEMCPY2D params = { 0, }; + + GST_DEBUG_OBJECT (self, "Plane %d is not aligned, copying", plane); + + if (!ensure_fallback_buffer (self, stride, height, plane)) + return 0; + + params.srcMemoryType = CU_MEMORYTYPE_DEVICE; + params.srcPitch = stride; + params.srcDevice = (CUdeviceptr) src_ptr; + + params.dstMemoryType = CU_MEMORYTYPE_DEVICE; + params.dstPitch = priv->fallback_bufferplane.stride; + params.dstDevice = priv->fallback_bufferplane.ptr; + params.WidthInBytes = GST_VIDEO_INFO_COMP_WIDTH (&priv->in_info, plane) + * GST_VIDEO_INFO_COMP_PSTRIDE (&priv->in_info, plane), + params.Height = GST_VIDEO_INFO_COMP_HEIGHT (&priv->in_info, plane); + + ret = CuMemcpy2D (¶ms); + if (!gst_cuda_result (ret)) { + GST_ERROR_OBJECT (self, "Couldn't copy to fallback buffer"); + return 0; + } + + src_ptr = priv->fallback_bufferplane.ptr; + stride = priv->fallback_bufferplane.stride; + } + + return gst_cuda_converter_create_texture_unchecked (self, + src_ptr, width, height, format, channles, stride, plane, mode); +} + +static gboolean +gst_cuda_converter_unpack_rgb (GstCudaConverter * self, + GstVideoFrame * src_frame, CUstream stream) +{ + GstCudaConverterPrivate *priv = self->priv; + CUdeviceptr src; + gint width, height, src_stride, dst_stride; + CUresult ret; + gpointer args = { &src, &priv->unpack_buffer.ptr, + &width, &height, &src_stride, &dst_stride + }; + + g_assert (priv->unpack_buffer.ptr); + g_assert (priv->unpack_buffer.stride > 0); + + src = (CUdeviceptr) GST_VIDEO_FRAME_PLANE_DATA (src_frame, 0); + width = GST_VIDEO_FRAME_WIDTH (src_frame); + height = GST_VIDEO_FRAME_HEIGHT (src_frame); + src_stride = GST_VIDEO_FRAME_PLANE_STRIDE (src_frame, 0); + dst_stride = (gint) priv->unpack_buffer.stride; + + ret = CuLaunchKernel (priv->unpack_func, DIV_UP (width, CUDA_BLOCK_X), + DIV_UP (height, CUDA_BLOCK_Y), 1, CUDA_BLOCK_X, CUDA_BLOCK_Y, 1, 0, + stream, args, NULL); + + if (!gst_cuda_result (ret)) { + GST_ERROR_OBJECT (self, "Couldn't unpack source RGB"); + return FALSE; + } + + return TRUE; +} + +gboolean +gst_cuda_converter_convert_frame (GstCudaConverter * converter, + GstVideoFrame * src_frame, GstVideoFrame * dst_frame, CUstream stream) +{ + GstCudaConverterPrivate *priv; + const TextureFormat *format; + CUtexObject textureGST_VIDEO_MAX_COMPONENTS = { 0, }; + guint8 *dstGST_VIDEO_MAX_COMPONENTS = { NULL, }; + gint stride2 = { 0, }; + gint i; + gboolean ret = FALSE; + CUresult cuda_ret; + gint width, height; + gpointer args = { &texture0, &texture1, &texture2, &texture3, + &dst0, &dst1, &dst2, &dst3, &stride0, &stride1 + }; + + g_return_val_if_fail (GST_IS_CUDA_CONVERTER (converter), FALSE); + g_return_val_if_fail (src_frame != NULL, FALSE); + g_return_val_if_fail (dst_frame != NULL, FALSE); + + priv = converter->priv; + format = priv->texture_fmt; + + g_assert (format); + + if (!gst_cuda_context_push (converter->context)) { + GST_ERROR_OBJECT (converter, "Couldn't push context"); + return FALSE; + } + + if (priv->unpack_func) { + if (!gst_cuda_converter_unpack_rgb (converter, src_frame, stream)) + goto out; + + texture0 = gst_cuda_converter_create_texture_unchecked (converter, + priv->unpack_buffer.ptr, priv->in_info.width, priv->in_info.height, + format->array_format0, 4, priv->unpack_buffer.stride, 0, + priv->filter_mode0); + if (!texture0) { + GST_ERROR_OBJECT (converter, "Couldn't create texture"); + goto out; + } + } else { + for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (src_frame); i++) { + CUdeviceptr src; + + src = (CUdeviceptr) GST_VIDEO_FRAME_PLANE_DATA (src_frame, i); + texturei = gst_cuda_converter_create_texture (converter, + src, GST_VIDEO_FRAME_COMP_WIDTH (src_frame, i), + GST_VIDEO_FRAME_COMP_HEIGHT (src_frame, i), + GST_VIDEO_FRAME_PLANE_STRIDE (src_frame, i), + priv->filter_modei, format->array_formati, format->channelsi, i, + stream); + if (!texturei) { + GST_ERROR_OBJECT (converter, "Couldn't create texture %d", i); + goto out; + } + } + } + + width = GST_VIDEO_FRAME_WIDTH (dst_frame); + height = GST_VIDEO_FRAME_HEIGHT (dst_frame); + + for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (dst_frame); i++) + dsti = GST_VIDEO_FRAME_PLANE_DATA (dst_frame, i); + + stride0 = stride1 = GST_VIDEO_FRAME_PLANE_STRIDE (dst_frame, 0); + if (GST_VIDEO_FRAME_N_PLANES (dst_frame) > 1) + stride1 = GST_VIDEO_FRAME_PLANE_STRIDE (dst_frame, 1); + + cuda_ret = CuLaunchKernel (priv->main_func, DIV_UP (width, CUDA_BLOCK_X), + DIV_UP (height, CUDA_BLOCK_Y), 1, CUDA_BLOCK_X, CUDA_BLOCK_Y, 1, 0, + stream, args, NULL); + + if (!gst_cuda_result (cuda_ret)) { + GST_ERROR_OBJECT (converter, "Couldn't convert frame"); + goto out; + } + + CuStreamSynchronize (stream); + + ret = TRUE; + +out: + for (i = 0; i < G_N_ELEMENTS (texture); i++) { + if (texturei) + CuTexObjectDestroy (texturei); + else + break; + } + + gst_cuda_context_pop (NULL); + return ret; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcudaconverter.h
Added
@@ -0,0 +1,99 @@ +/* GStreamer + * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/video/video.h> +#include <gst/cuda/gstcudacontext.h> + +G_BEGIN_DECLS + +#define GST_TYPE_CUDA_CONVERTER (gst_cuda_converter_get_type()) +#define GST_CUDA_CONVERTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CUDA_CONVERTER,GstCudaConverter)) +#define GST_CUDA_CONVERTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CUDA_CONVERTER,GstCudaConverterClass)) +#define GST_CUDA_CONVERTER_GET_CLASS(obj) (GST_CUDA_CONVERTER_CLASS(G_OBJECT_GET_CLASS(obj))) +#define GST_IS_CUDA_CONVERTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CUDA_CONVERTER)) +#define GST_IS_CUDA_CONVERTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CUDA_CONVERTER)) +#define GST_CUDA_CONVERTER_CAST(obj) ((GstCudaConverter*)(obj)) + +typedef struct _GstCudaConverter GstCudaConverter; +typedef struct _GstCudaConverterClass GstCudaConverterClass; +typedef struct _GstCudaConverterPrivate GstCudaConverterPrivate; + +/** + * GST_CUDA_CONVERTER_OPT_DEST_X: + * + * #G_TYPE_INT, x position in the destination frame, default 0 + */ +#define GST_CUDA_CONVERTER_OPT_DEST_X "GstCudaConverter.dest-x" + +/** + * GST_CUDA_CONVERTER_OPT_DEST_Y: + * + * #G_TYPE_INT, y position in the destination frame, default 0 + */ +#define GST_CUDA_CONVERTER_OPT_DEST_Y "GstCudaConverter.dest-y" + +/** + * GST_CUDA_CONVERTER_OPT_DEST_WIDTH: + * + * #G_TYPE_INT, width in the destination frame, default destination width + */ +#define GST_CUDA_CONVERTER_OPT_DEST_WIDTH "GstCudaConverter.dest-width" + +/** + * GST_CUDA_CONVERTER_OPT_DEST_HEIGHT: + * + * #G_TYPE_INT, height in the destination frame, default destination height + */ +#define GST_CUDA_CONVERTER_OPT_DEST_HEIGHT "GstCudaConverter.dest-height" + +struct _GstCudaConverter +{ + GstObject parent; + + GstCudaContext *context; + + /*< private >*/ + GstCudaConverterPrivate *priv; + gpointer _gst_reservedGST_PADDING; +}; + +struct _GstCudaConverterClass +{ + GstObjectClass parent_class; + + /*< private >*/ + gpointer _gst_reservedGST_PADDING; +}; + +GType gst_cuda_converter_get_type (void); + +GstCudaConverter * gst_cuda_converter_new (const GstVideoInfo * in_info, + const GstVideoInfo * out_info, + GstCudaContext * context, + GstStructure * config); + +gboolean gst_cuda_converter_convert_frame (GstCudaConverter * converter, + GstVideoFrame * src_frame, + GstVideoFrame * dst_frame, + CUstream cuda_stream); + +G_END_DECLS +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcudaconvertscale.c
Added
@@ -0,0 +1,1747 @@ +/* GStreamer + * Copyright (C) 2020 Thibault Saunier <tsaunier@igalia.com> + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <gst/cuda/gstcudautils.h> +#include "gstcudaconvertscale.h" +#include "gstcudaconverter.h" + +GST_DEBUG_CATEGORY_STATIC (gst_cuda_base_convert_debug); +#define GST_CAT_DEFAULT gst_cuda_base_convert_debug + +#define GST_CUDA_CONVET_FORMATS \ + "{ I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, " \ + "BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, " \ + "Y42B, I422_10LE, I422_12LE, RGBP, BGRP, GBR, GBRA }" + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES + (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY, GST_CUDA_CONVET_FORMATS)) + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES + (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY, GST_CUDA_CONVET_FORMATS)) + ); + +#define DEFAULT_ADD_BORDERS TRUE + +struct _GstCudaBaseConvert +{ + GstCudaBaseTransform parent; + + GstCudaConverter *converter; + + gint borders_h; + gint borders_w; + gboolean add_borders; +}; + +static void gst_cuda_base_convert_dispose (GObject * object); +static GstCaps *gst_cuda_base_convert_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps, GstCaps * filter); +static GstCaps *gst_cuda_base_convert_fixate_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); +static gboolean +gst_cuda_base_convert_propose_allocation (GstBaseTransform * trans, + GstQuery * decide_query, GstQuery * query); +static gboolean gst_cuda_base_convert_decide_allocation (GstBaseTransform * + trans, GstQuery * query); +static gboolean gst_cuda_base_convert_filter_meta (GstBaseTransform * trans, + GstQuery * query, GType api, const GstStructure * params); +static GstFlowReturn gst_cuda_base_convert_transform (GstBaseTransform * trans, + GstBuffer * inbuf, GstBuffer * outbuf); +static gboolean gst_cuda_base_convert_set_info (GstCudaBaseTransform * btrans, + GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, + GstVideoInfo * out_info); + +/** + * GstCudaBaseConvert: + * + * A baseclass implementation for cuda convert elements + * + * Since: 1.22 + */ +#define gst_cuda_base_convert_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstCudaBaseConvert, + gst_cuda_base_convert, GST_TYPE_CUDA_BASE_TRANSFORM, + GST_DEBUG_CATEGORY_INIT (gst_cuda_base_convert_debug, + "cudaconvertscale", 0, "CUDA Base Filter")); + +static void +gst_cuda_base_convert_class_init (GstCudaBaseConvertClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); + GstCudaBaseTransformClass *btrans_class = + GST_CUDA_BASE_TRANSFORM_CLASS (klass); + + gobject_class->dispose = gst_cuda_base_convert_dispose; + + gst_element_class_add_static_pad_template (element_class, &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + trans_class->passthrough_on_same_caps = TRUE; + + trans_class->transform_caps = + GST_DEBUG_FUNCPTR (gst_cuda_base_convert_transform_caps); + trans_class->fixate_caps = + GST_DEBUG_FUNCPTR (gst_cuda_base_convert_fixate_caps); + trans_class->propose_allocation = + GST_DEBUG_FUNCPTR (gst_cuda_base_convert_propose_allocation); + trans_class->decide_allocation = + GST_DEBUG_FUNCPTR (gst_cuda_base_convert_decide_allocation); + trans_class->filter_meta = + GST_DEBUG_FUNCPTR (gst_cuda_base_convert_filter_meta); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_cuda_base_convert_transform); + + btrans_class->set_info = GST_DEBUG_FUNCPTR (gst_cuda_base_convert_set_info); + + gst_type_mark_as_plugin_api (GST_TYPE_CUDA_BASE_CONVERT, 0); +} + +static void +gst_cuda_base_convert_init (GstCudaBaseConvert * self) +{ + self->add_borders = DEFAULT_ADD_BORDERS; +} + +static void +gst_cuda_base_convert_dispose (GObject * object) +{ + GstCudaBaseConvert *self = GST_CUDA_BASE_CONVERT (object); + + gst_clear_object (&self->converter); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static GstCaps * +gst_cuda_base_convert_caps_remove_format_info (GstCaps * caps) +{ + GstStructure *st; + GstCapsFeatures *f; + gint i, n; + GstCaps *res; + GstCapsFeatures *feature = + gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY); + + res = gst_caps_new_empty (); + + n = gst_caps_get_size (caps); + for (i = 0; i < n; i++) { + st = gst_caps_get_structure (caps, i); + f = gst_caps_get_features (caps, i); + + /* If this is already expressed by the existing caps + * skip this structure */ + if (i > 0 && gst_caps_is_subset_structure_full (res, st, f)) + continue; + + st = gst_structure_copy (st); + /* Only remove format info for the cases when we can actually convert */ + if (!gst_caps_features_is_any (f) + && gst_caps_features_is_equal (f, feature)) { + gst_structure_remove_fields (st, "format", "colorimetry", "chroma-site", + NULL); + } + + gst_caps_append_structure_full (res, st, gst_caps_features_copy (f)); + } + gst_caps_features_free (feature); + + return res; +} + +static GstCaps * +gst_cuda_base_convert_caps_rangify_size_info (GstCaps * caps) +{ + GstStructure *st; + GstCapsFeatures *f; + gint i, n; + GstCaps *res; + GstCapsFeatures *feature = + gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY); + + res = gst_caps_new_empty (); + + n = gst_caps_get_size (caps); + for (i = 0; i < n; i++) { + st = gst_caps_get_structure (caps, i); + f = gst_caps_get_features (caps, i); + + /* If this is already expressed by the existing caps + * skip this structure */ + if (i > 0 && gst_caps_is_subset_structure_full (res, st, f)) + continue; + + st = gst_structure_copy (st); + /* Only remove format info for the cases when we can actually convert */ + if (!gst_caps_features_is_any (f) + && gst_caps_features_is_equal (f, feature)) { + gst_structure_set (st, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); + + /* if pixel aspect ratio, make a range of it */ + if (gst_structure_has_field (st, "pixel-aspect-ratio")) { + gst_structure_set (st, "pixel-aspect-ratio", + GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1, NULL); + } + } + + gst_caps_append_structure_full (res, st, gst_caps_features_copy (f)); + } + gst_caps_features_free (feature); + + return res; +} + +static GstCaps * +gst_cuda_base_convert_caps_remove_format_and_rangify_size_info (GstCaps * caps) +{ + GstStructure *st; + GstCapsFeatures *f; + gint i, n; + GstCaps *res; + GstCapsFeatures *feature = + gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY); + + res = gst_caps_new_empty (); + + n = gst_caps_get_size (caps); + for (i = 0; i < n; i++) { + st = gst_caps_get_structure (caps, i); + f = gst_caps_get_features (caps, i); + + /* If this is already expressed by the existing caps + * skip this structure */ + if (i > 0 && gst_caps_is_subset_structure_full (res, st, f)) + continue; + + st = gst_structure_copy (st); + /* Only remove format info for the cases when we can actually convert */ + if (!gst_caps_features_is_any (f) + && gst_caps_features_is_equal (f, feature)) { + gst_structure_set (st, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); + /* if pixel aspect ratio, make a range of it */ + if (gst_structure_has_field (st, "pixel-aspect-ratio")) { + gst_structure_set (st, "pixel-aspect-ratio", + GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1, NULL); + } + gst_structure_remove_fields (st, "format", "colorimetry", "chroma-site", + NULL); + } + + gst_caps_append_structure_full (res, st, gst_caps_features_copy (f)); + } + gst_caps_features_free (feature); + + return res; +} + +static GstCaps * +gst_cuda_base_convert_transform_caps (GstBaseTransform * + trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter) +{ + GstCaps *tmp, *tmp2; + GstCaps *result; + + /* Get all possible caps that we can transform to */ + tmp = gst_cuda_base_convert_caps_remove_format_and_rangify_size_info (caps); + + if (filter) { + tmp2 = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (tmp); + tmp = tmp2; + } + + result = tmp; + + GST_DEBUG_OBJECT (trans, "transformed %" GST_PTR_FORMAT " into %" + GST_PTR_FORMAT, caps, result); + + return result; +} + +/* + * This is an incomplete matrix of in formats and a score for the prefered output + * format. + * + * out: RGB24 RGB16 ARGB AYUV YUV444 YUV422 YUV420 YUV411 YUV410 PAL GRAY + * in + * RGB24 0 2 1 2 2 3 4 5 6 7 8 + * RGB16 1 0 1 2 2 3 4 5 6 7 8 + * ARGB 2 3 0 1 4 5 6 7 8 9 10 + * AYUV 3 4 1 0 2 5 6 7 8 9 10 + * YUV444 2 4 3 1 0 5 6 7 8 9 10 + * YUV422 3 5 4 2 1 0 6 7 8 9 10 + * YUV420 4 6 5 3 2 1 0 7 8 9 10 + * YUV411 4 6 5 3 2 1 7 0 8 9 10 + * YUV410 6 8 7 5 4 3 2 1 0 9 10 + * PAL 1 3 2 6 4 6 7 8 9 0 10 + * GRAY 1 4 3 2 1 5 6 7 8 9 0 + * + * PAL or GRAY are never prefered, if we can we would convert to PAL instead + * of GRAY, though + * less subsampling is prefered and if any, preferably horizontal + * We would like to keep the alpha, even if we would need to to colorspace conversion + * or lose depth. + */ +#define SCORE_FORMAT_CHANGE 1 +#define SCORE_DEPTH_CHANGE 1 +#define SCORE_ALPHA_CHANGE 1 +#define SCORE_CHROMA_W_CHANGE 1 +#define SCORE_CHROMA_H_CHANGE 1 +#define SCORE_PALETTE_CHANGE 1 + +#define SCORE_COLORSPACE_LOSS 2 /* RGB <-> YUV */ +#define SCORE_DEPTH_LOSS 4 /* change bit depth */ +#define SCORE_ALPHA_LOSS 8 /* lose the alpha channel */ +#define SCORE_CHROMA_W_LOSS 16 /* vertical subsample */ +#define SCORE_CHROMA_H_LOSS 32 /* horizontal subsample */ +#define SCORE_PALETTE_LOSS 64 /* convert to palette format */ +#define SCORE_COLOR_LOSS 128 /* convert to GRAY */ + +#define COLORSPACE_MASK (GST_VIDEO_FORMAT_FLAG_YUV | \ + GST_VIDEO_FORMAT_FLAG_RGB | GST_VIDEO_FORMAT_FLAG_GRAY) +#define ALPHA_MASK (GST_VIDEO_FORMAT_FLAG_ALPHA) +#define PALETTE_MASK (GST_VIDEO_FORMAT_FLAG_PALETTE) + +/* calculate how much loss a conversion would be */ +static void +score_value (GstBaseTransform * base, const GstVideoFormatInfo * in_info, + const GValue * val, gint * min_loss, const GstVideoFormatInfo ** out_info) +{ + const gchar *fname; + const GstVideoFormatInfo *t_info; + guint in_flags, t_flags; + gint loss; + + fname = g_value_get_string (val); + t_info = gst_video_format_get_info (gst_video_format_from_string (fname)); + if (!t_info || t_info->format == GST_VIDEO_FORMAT_UNKNOWN) + return; + + /* accept input format immediately without loss */ + if (in_info == t_info) { + *min_loss = 0; + *out_info = t_info; + return; + } + + loss = SCORE_FORMAT_CHANGE; + + in_flags = GST_VIDEO_FORMAT_INFO_FLAGS (in_info); + in_flags &= ~GST_VIDEO_FORMAT_FLAG_LE; + in_flags &= ~GST_VIDEO_FORMAT_FLAG_COMPLEX; + in_flags &= ~GST_VIDEO_FORMAT_FLAG_UNPACK; + + t_flags = GST_VIDEO_FORMAT_INFO_FLAGS (t_info); + t_flags &= ~GST_VIDEO_FORMAT_FLAG_LE; + t_flags &= ~GST_VIDEO_FORMAT_FLAG_COMPLEX; + t_flags &= ~GST_VIDEO_FORMAT_FLAG_UNPACK; + + if ((t_flags & PALETTE_MASK) != (in_flags & PALETTE_MASK)) { + loss += SCORE_PALETTE_CHANGE; + if (t_flags & PALETTE_MASK) + loss += SCORE_PALETTE_LOSS; + } + + if ((t_flags & COLORSPACE_MASK) != (in_flags & COLORSPACE_MASK)) { + loss += SCORE_COLORSPACE_LOSS; + if (t_flags & GST_VIDEO_FORMAT_FLAG_GRAY) + loss += SCORE_COLOR_LOSS; + } + + if ((t_flags & ALPHA_MASK) != (in_flags & ALPHA_MASK)) { + loss += SCORE_ALPHA_CHANGE; + if (in_flags & ALPHA_MASK) + loss += SCORE_ALPHA_LOSS; + } + + if ((in_info->h_sub1) != (t_info->h_sub1)) { + loss += SCORE_CHROMA_H_CHANGE; + if ((in_info->h_sub1) < (t_info->h_sub1)) + loss += SCORE_CHROMA_H_LOSS; + } + if ((in_info->w_sub1) != (t_info->w_sub1)) { + loss += SCORE_CHROMA_W_CHANGE; + if ((in_info->w_sub1) < (t_info->w_sub1)) + loss += SCORE_CHROMA_W_LOSS; + } + + if ((in_info->bits) != (t_info->bits)) { + loss += SCORE_DEPTH_CHANGE; + if ((in_info->bits) > (t_info->bits)) + loss += SCORE_DEPTH_LOSS + (in_info->bits - t_info->bits); + } + + GST_DEBUG_OBJECT (base, "score %s -> %s = %d", + GST_VIDEO_FORMAT_INFO_NAME (in_info), + GST_VIDEO_FORMAT_INFO_NAME (t_info), loss); + + if (loss < *min_loss) { + GST_DEBUG_OBJECT (base, "found new best %d", loss); + *out_info = t_info; + *min_loss = loss; + } +} + +static void +gst_cuda_base_convert_fixate_format (GstBaseTransform * trans, + GstCaps * caps, GstCaps * result) +{ + GstStructure *ins, *outs; + const gchar *in_format; + const GstVideoFormatInfo *in_info, *out_info = NULL; + gint min_loss = G_MAXINT; + guint i, capslen; + + ins = gst_caps_get_structure (caps, 0); + in_format = gst_structure_get_string (ins, "format"); + if (!in_format) { + return; + } + + GST_DEBUG_OBJECT (trans, "source format %s", in_format); + + in_info = + gst_video_format_get_info (gst_video_format_from_string (in_format)); + if (!in_info) + return; + + outs = gst_caps_get_structure (result, 0); + + capslen = gst_caps_get_size (result); + GST_DEBUG ("iterate %d structures", capslen); + for (i = 0; i < capslen; i++) { + GstStructure *tests; + const GValue *format; + + tests = gst_caps_get_structure (result, i); + format = gst_structure_get_value (tests, "format"); + + /* should not happen */ + if (format == NULL) + continue; + + if (GST_VALUE_HOLDS_LIST (format)) { + gint j, len; + + len = gst_value_list_get_size (format); + GST_DEBUG_OBJECT (trans, "have %d formats", len); + for (j = 0; j < len; j++) { + const GValue *val; + + val = gst_value_list_get_value (format, j); + if (G_VALUE_HOLDS_STRING (val)) { + score_value (trans, in_info, val, &min_loss, &out_info); + if (min_loss == 0) + break; + } + } + } else if (G_VALUE_HOLDS_STRING (format)) { + score_value (trans, in_info, format, &min_loss, &out_info); + } + } + if (out_info) + gst_structure_set (outs, "format", G_TYPE_STRING, + GST_VIDEO_FORMAT_INFO_NAME (out_info), NULL); +} + +static gboolean +subsampling_unchanged (GstVideoInfo * in_info, GstVideoInfo * out_info) +{ + guint i; + const GstVideoFormatInfo *in_format, *out_format; + + if (GST_VIDEO_INFO_N_COMPONENTS (in_info) != + GST_VIDEO_INFO_N_COMPONENTS (out_info)) + return FALSE; + + in_format = in_info->finfo; + out_format = out_info->finfo; + + for (i = 0; i < GST_VIDEO_INFO_N_COMPONENTS (in_info); i++) { + if (GST_VIDEO_FORMAT_INFO_W_SUB (in_format, + i) != GST_VIDEO_FORMAT_INFO_W_SUB (out_format, i)) + return FALSE; + if (GST_VIDEO_FORMAT_INFO_H_SUB (in_format, + i) != GST_VIDEO_FORMAT_INFO_H_SUB (out_format, i)) + return FALSE; + } + + return TRUE; +} + +static void +transfer_colorimetry_from_input (GstBaseTransform * trans, GstCaps * in_caps, + GstCaps * out_caps) +{ + GstStructure *out_caps_s = gst_caps_get_structure (out_caps, 0); + GstStructure *in_caps_s = gst_caps_get_structure (in_caps, 0); + gboolean have_colorimetry = + gst_structure_has_field (out_caps_s, "colorimetry"); + gboolean have_chroma_site = + gst_structure_has_field (out_caps_s, "chroma-site"); + + /* If the output already has colorimetry and chroma-site, stop, + * otherwise try and transfer what we can from the input caps */ + if (have_colorimetry && have_chroma_site) + return; + + { + GstVideoInfo in_info, out_info; + const GValue *in_colorimetry = + gst_structure_get_value (in_caps_s, "colorimetry"); + + if (!gst_video_info_from_caps (&in_info, in_caps)) { + GST_WARNING_OBJECT (trans, + "Failed to convert sink pad caps to video info"); + return; + } + if (!gst_video_info_from_caps (&out_info, out_caps)) { + GST_WARNING_OBJECT (trans, + "Failed to convert src pad caps to video info"); + return; + } + + if (!have_colorimetry && in_colorimetry != NULL) { + if ((GST_VIDEO_INFO_IS_YUV (&out_info) + && GST_VIDEO_INFO_IS_YUV (&in_info)) + || (GST_VIDEO_INFO_IS_RGB (&out_info) + && GST_VIDEO_INFO_IS_RGB (&in_info)) + || (GST_VIDEO_INFO_IS_GRAY (&out_info) + && GST_VIDEO_INFO_IS_GRAY (&in_info))) { + /* Can transfer the colorimetry intact from the input if it has it */ + gst_structure_set_value (out_caps_s, "colorimetry", in_colorimetry); + } else { + gchar *colorimetry_str; + + /* Changing between YUV/RGB - forward primaries and transfer function, but use + * default range and matrix. + * the primaries is used for conversion between RGB and XYZ (CIE 1931 coordinate). + * the transfer function could be another reference (e.g., HDR) + */ + out_info.colorimetry.primaries = in_info.colorimetry.primaries; + out_info.colorimetry.transfer = in_info.colorimetry.transfer; + + colorimetry_str = + gst_video_colorimetry_to_string (&out_info.colorimetry); + gst_caps_set_simple (out_caps, "colorimetry", G_TYPE_STRING, + colorimetry_str, NULL); + g_free (colorimetry_str); + } + } + + /* Only YUV output needs chroma-site. If the input was also YUV and had the same chroma + * subsampling, transfer the siting. If the sub-sampling is changing, then the planes get + * scaled anyway so there's no real reason to prefer the input siting. */ + if (!have_chroma_site && GST_VIDEO_INFO_IS_YUV (&out_info)) { + if (GST_VIDEO_INFO_IS_YUV (&in_info)) { + const GValue *in_chroma_site = + gst_structure_get_value (in_caps_s, "chroma-site"); + if (in_chroma_site != NULL + && subsampling_unchanged (&in_info, &out_info)) + gst_structure_set_value (out_caps_s, "chroma-site", in_chroma_site); + } + } + } +} + +static GstCaps * +gst_cuda_base_convert_get_fixed_format (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) +{ + GstCaps *result; + + result = gst_caps_intersect (othercaps, caps); + if (gst_caps_is_empty (result)) { + gst_caps_unref (result); + result = gst_caps_copy (othercaps); + } + + gst_cuda_base_convert_fixate_format (trans, caps, result); + + /* fixate remaining fields */ + result = gst_caps_fixate (result); + + if (direction == GST_PAD_SINK) { + if (gst_caps_is_subset (caps, result)) { + gst_caps_replace (&result, caps); + } else { + /* Try and preserve input colorimetry / chroma information */ + transfer_colorimetry_from_input (trans, caps, result); + } + } + + return result; +} + +static GstCaps * +gst_cuda_base_convert_fixate_size (GstBaseTransform * base, + GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) +{ + GstStructure *ins, *outs; + const GValue *from_par, *to_par; + GValue fpar = G_VALUE_INIT, tpar = G_VALUE_INIT; + + othercaps = gst_caps_truncate (othercaps); + othercaps = gst_caps_make_writable (othercaps); + ins = gst_caps_get_structure (caps, 0); + outs = gst_caps_get_structure (othercaps, 0); + + from_par = gst_structure_get_value (ins, "pixel-aspect-ratio"); + to_par = gst_structure_get_value (outs, "pixel-aspect-ratio"); + + if (direction == GST_PAD_SINK) { + if (!from_par) { + g_value_init (&fpar, GST_TYPE_FRACTION); + gst_value_set_fraction (&fpar, 1, 1); + from_par = &fpar; + } + if (!to_par) { + g_value_init (&tpar, GST_TYPE_FRACTION_RANGE); + gst_value_set_fraction_range_full (&tpar, 1, G_MAXINT, G_MAXINT, 1); + to_par = &tpar; + } + } else { + gint from_par_n, from_par_d; + + if (!from_par) { + g_value_init (&fpar, GST_TYPE_FRACTION); + gst_value_set_fraction (&fpar, 1, 1); + from_par = &fpar; + + from_par_n = from_par_d = 1; + } else { + from_par_n = gst_value_get_fraction_numerator (from_par); + from_par_d = gst_value_get_fraction_denominator (from_par); + } + + if (!to_par) { + gint to_par_n, to_par_d; + + to_par_n = from_par_n; + to_par_d = from_par_d; + + g_value_init (&tpar, GST_TYPE_FRACTION); + gst_value_set_fraction (&tpar, to_par_n, to_par_d); + to_par = &tpar; + + gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, + to_par_n, to_par_d, NULL); + } + } + + /* we have both PAR but they might not be fixated */ + { + gint from_w, from_h, from_par_n, from_par_d, to_par_n, to_par_d; + gint w = 0, h = 0; + gint from_dar_n, from_dar_d; + gint num, den; + + /* from_par should be fixed */ + g_return_val_if_fail (gst_value_is_fixed (from_par), othercaps); + + from_par_n = gst_value_get_fraction_numerator (from_par); + from_par_d = gst_value_get_fraction_denominator (from_par); + + gst_structure_get_int (ins, "width", &from_w); + gst_structure_get_int (ins, "height", &from_h); + + gst_structure_get_int (outs, "width", &w); + gst_structure_get_int (outs, "height", &h); + + /* if both width and height are already fixed, we can't do anything + * about it anymore */ + if (w && h) { + guint n, d; + + GST_DEBUG_OBJECT (base, "dimensions already set to %dx%d, not fixating", + w, h); + if (!gst_value_is_fixed (to_par)) { + if (gst_video_calculate_display_ratio (&n, &d, from_w, from_h, + from_par_n, from_par_d, w, h)) { + GST_DEBUG_OBJECT (base, "fixating to_par to %dx%d", n, d); + if (gst_structure_has_field (outs, "pixel-aspect-ratio")) + gst_structure_fixate_field_nearest_fraction (outs, + "pixel-aspect-ratio", n, d); + else if (n != d) + gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, + n, d, NULL); + } + } + goto done; + } + + /* Calculate input DAR */ + if (!gst_util_fraction_multiply (from_w, from_h, from_par_n, from_par_d, + &from_dar_n, &from_dar_d)) { + GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), + ("Error calculating the output scaled size - integer overflow")); + goto done; + } + + GST_DEBUG_OBJECT (base, "Input DAR is %d/%d", from_dar_n, from_dar_d); + + /* If either width or height are fixed there's not much we + * can do either except choosing a height or width and PAR + * that matches the DAR as good as possible + */ + if (h) { + GstStructure *tmp; + gint set_w, set_par_n, set_par_d; + + GST_DEBUG_OBJECT (base, "height is fixed (%d)", h); + + /* If the PAR is fixed too, there's not much to do + * except choosing the width that is nearest to the + * width with the same DAR */ + if (gst_value_is_fixed (to_par)) { + to_par_n = gst_value_get_fraction_numerator (to_par); + to_par_d = gst_value_get_fraction_denominator (to_par); + + GST_DEBUG_OBJECT (base, "PAR is fixed %d/%d", to_par_n, to_par_d); + + if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, to_par_d, + to_par_n, &num, &den)) { + GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), + ("Error calculating the output scaled size - integer overflow")); + goto done; + } + + w = (guint) gst_util_uint64_scale_int_round (h, num, den); + gst_structure_fixate_field_nearest_int (outs, "width", w); + + goto done; + } + + /* The PAR is not fixed and it's quite likely that we can set + * an arbitrary PAR. */ + + /* Check if we can keep the input width */ + tmp = gst_structure_copy (outs); + gst_structure_fixate_field_nearest_int (tmp, "width", from_w); + gst_structure_get_int (tmp, "width", &set_w); + + /* Might have failed but try to keep the DAR nonetheless by + * adjusting the PAR */ + if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, h, set_w, + &to_par_n, &to_par_d)) { + GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), + ("Error calculating the output scaled size - integer overflow")); + gst_structure_free (tmp); + goto done; + } + + if (!gst_structure_has_field (tmp, "pixel-aspect-ratio")) + gst_structure_set_value (tmp, "pixel-aspect-ratio", to_par); + gst_structure_fixate_field_nearest_fraction (tmp, "pixel-aspect-ratio", + to_par_n, to_par_d); + gst_structure_get_fraction (tmp, "pixel-aspect-ratio", &set_par_n, + &set_par_d); + gst_structure_free (tmp); + + /* Check if the adjusted PAR is accepted */ + if (set_par_n == to_par_n && set_par_d == to_par_d) { + if (gst_structure_has_field (outs, "pixel-aspect-ratio") || + set_par_n != set_par_d) + gst_structure_set (outs, "width", G_TYPE_INT, set_w, + "pixel-aspect-ratio", GST_TYPE_FRACTION, set_par_n, set_par_d, + NULL); + goto done; + } + + /* Otherwise scale the width to the new PAR and check if the + * adjusted with is accepted. If all that fails we can't keep + * the DAR */ + if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_par_d, + set_par_n, &num, &den)) { + GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), + ("Error calculating the output scaled size - integer overflow")); + goto done; + } + + w = (guint) gst_util_uint64_scale_int_round (h, num, den); + gst_structure_fixate_field_nearest_int (outs, "width", w); + if (gst_structure_has_field (outs, "pixel-aspect-ratio") || + set_par_n != set_par_d) + gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, + set_par_n, set_par_d, NULL); + + goto done; + } else if (w) { + GstStructure *tmp; + gint set_h, set_par_n, set_par_d; + + GST_DEBUG_OBJECT (base, "width is fixed (%d)", w); + + /* If the PAR is fixed too, there's not much to do + * except choosing the height that is nearest to the + * height with the same DAR */ + if (gst_value_is_fixed (to_par)) { + to_par_n = gst_value_get_fraction_numerator (to_par); + to_par_d = gst_value_get_fraction_denominator (to_par); + + GST_DEBUG_OBJECT (base, "PAR is fixed %d/%d", to_par_n, to_par_d); + + if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, to_par_d, + to_par_n, &num, &den)) { + GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), + ("Error calculating the output scaled size - integer overflow")); + goto done; + } + + h = (guint) gst_util_uint64_scale_int_round (w, den, num); + gst_structure_fixate_field_nearest_int (outs, "height", h); + + goto done; + } + + /* The PAR is not fixed and it's quite likely that we can set + * an arbitrary PAR. */ + + /* Check if we can keep the input height */ + tmp = gst_structure_copy (outs); + gst_structure_fixate_field_nearest_int (tmp, "height", from_h); + gst_structure_get_int (tmp, "height", &set_h); + + /* Might have failed but try to keep the DAR nonetheless by + * adjusting the PAR */ + if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_h, w, + &to_par_n, &to_par_d)) { + GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), + ("Error calculating the output scaled size - integer overflow")); + gst_structure_free (tmp); + goto done; + } + if (!gst_structure_has_field (tmp, "pixel-aspect-ratio")) + gst_structure_set_value (tmp, "pixel-aspect-ratio", to_par); + gst_structure_fixate_field_nearest_fraction (tmp, "pixel-aspect-ratio", + to_par_n, to_par_d); + gst_structure_get_fraction (tmp, "pixel-aspect-ratio", &set_par_n, + &set_par_d); + gst_structure_free (tmp); + + /* Check if the adjusted PAR is accepted */ + if (set_par_n == to_par_n && set_par_d == to_par_d) { + if (gst_structure_has_field (outs, "pixel-aspect-ratio") || + set_par_n != set_par_d) + gst_structure_set (outs, "height", G_TYPE_INT, set_h, + "pixel-aspect-ratio", GST_TYPE_FRACTION, set_par_n, set_par_d, + NULL); + goto done; + } + + /* Otherwise scale the height to the new PAR and check if the + * adjusted with is accepted. If all that fails we can't keep + * the DAR */ + if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_par_d, + set_par_n, &num, &den)) { + GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), + ("Error calculating the output scale sized - integer overflow")); + goto done; + } + + h = (guint) gst_util_uint64_scale_int_round (w, den, num); + gst_structure_fixate_field_nearest_int (outs, "height", h); + if (gst_structure_has_field (outs, "pixel-aspect-ratio") || + set_par_n != set_par_d) + gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, + set_par_n, set_par_d, NULL); + + goto done; + } else if (gst_value_is_fixed (to_par)) { + GstStructure *tmp; + gint set_h, set_w, f_h, f_w; + + to_par_n = gst_value_get_fraction_numerator (to_par); + to_par_d = gst_value_get_fraction_denominator (to_par); + + /* Calculate scale factor for the PAR change */ + if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, to_par_n, + to_par_d, &num, &den)) { + GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), + ("Error calculating the output scaled size - integer overflow")); + goto done; + } + + /* Try to keep the input height (because of interlacing) */ + tmp = gst_structure_copy (outs); + gst_structure_fixate_field_nearest_int (tmp, "height", from_h); + gst_structure_get_int (tmp, "height", &set_h); + + /* This might have failed but try to scale the width + * to keep the DAR nonetheless */ + w = (guint) gst_util_uint64_scale_int_round (set_h, num, den); + gst_structure_fixate_field_nearest_int (tmp, "width", w); + gst_structure_get_int (tmp, "width", &set_w); + gst_structure_free (tmp); + + /* We kept the DAR and the height is nearest to the original height */ + if (set_w == w) { + gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height", + G_TYPE_INT, set_h, NULL); + goto done; + } + + f_h = set_h; + f_w = set_w; + + /* If the former failed, try to keep the input width at least */ + tmp = gst_structure_copy (outs); + gst_structure_fixate_field_nearest_int (tmp, "width", from_w); + gst_structure_get_int (tmp, "width", &set_w); + + /* This might have failed but try to scale the width + * to keep the DAR nonetheless */ + h = (guint) gst_util_uint64_scale_int_round (set_w, den, num); + gst_structure_fixate_field_nearest_int (tmp, "height", h); + gst_structure_get_int (tmp, "height", &set_h); + gst_structure_free (tmp); + + /* We kept the DAR and the width is nearest to the original width */ + if (set_h == h) { + gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height", + G_TYPE_INT, set_h, NULL); + goto done; + } + + /* If all this failed, keep the dimensions with the DAR that was closest + * to the correct DAR. This changes the DAR but there's not much else to + * do here. + */ + if (set_w * ABS (set_h - h) < ABS (f_w - w) * f_h) { + f_h = set_h; + f_w = set_w; + } + gst_structure_set (outs, "width", G_TYPE_INT, f_w, "height", G_TYPE_INT, + f_h, NULL); + goto done; + } else { + GstStructure *tmp; + gint set_h, set_w, set_par_n, set_par_d, tmp2; + + /* width, height and PAR are not fixed but passthrough is not possible */ + + /* First try to keep the height and width as good as possible + * and scale PAR */ + tmp = gst_structure_copy (outs); + gst_structure_fixate_field_nearest_int (tmp, "height", from_h); + gst_structure_get_int (tmp, "height", &set_h); + gst_structure_fixate_field_nearest_int (tmp, "width", from_w); + gst_structure_get_int (tmp, "width", &set_w); + + if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_h, set_w, + &to_par_n, &to_par_d)) { + GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), + ("Error calculating the output scaled size - integer overflow")); + gst_structure_free (tmp); + goto done; + } + + if (!gst_structure_has_field (tmp, "pixel-aspect-ratio")) + gst_structure_set_value (tmp, "pixel-aspect-ratio", to_par); + gst_structure_fixate_field_nearest_fraction (tmp, "pixel-aspect-ratio", + to_par_n, to_par_d); + gst_structure_get_fraction (tmp, "pixel-aspect-ratio", &set_par_n, + &set_par_d); + gst_structure_free (tmp); + + if (set_par_n == to_par_n && set_par_d == to_par_d) { + gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height", + G_TYPE_INT, set_h, NULL); + + if (gst_structure_has_field (outs, "pixel-aspect-ratio") || + set_par_n != set_par_d) + gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, + set_par_n, set_par_d, NULL); + goto done; + } + + /* Otherwise try to scale width to keep the DAR with the set + * PAR and height */ + if (!gst_util_fraction_multiply (from_dar_n, from_dar_d, set_par_d, + set_par_n, &num, &den)) { + GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), + ("Error calculating the output scaled size - integer overflow")); + goto done; + } + + w = (guint) gst_util_uint64_scale_int_round (set_h, num, den); + tmp = gst_structure_copy (outs); + gst_structure_fixate_field_nearest_int (tmp, "width", w); + gst_structure_get_int (tmp, "width", &tmp2); + gst_structure_free (tmp); + + if (tmp2 == w) { + gst_structure_set (outs, "width", G_TYPE_INT, tmp2, "height", + G_TYPE_INT, set_h, NULL); + if (gst_structure_has_field (outs, "pixel-aspect-ratio") || + set_par_n != set_par_d) + gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, + set_par_n, set_par_d, NULL); + goto done; + } + + /* ... or try the same with the height */ + h = (guint) gst_util_uint64_scale_int_round (set_w, den, num); + tmp = gst_structure_copy (outs); + gst_structure_fixate_field_nearest_int (tmp, "height", h); + gst_structure_get_int (tmp, "height", &tmp2); + gst_structure_free (tmp); + + if (tmp2 == h) { + gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height", + G_TYPE_INT, tmp2, NULL); + if (gst_structure_has_field (outs, "pixel-aspect-ratio") || + set_par_n != set_par_d) + gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, + set_par_n, set_par_d, NULL); + goto done; + } + + /* If all fails we can't keep the DAR and take the nearest values + * for everything from the first try */ + gst_structure_set (outs, "width", G_TYPE_INT, set_w, "height", + G_TYPE_INT, set_h, NULL); + if (gst_structure_has_field (outs, "pixel-aspect-ratio") || + set_par_n != set_par_d) + gst_structure_set (outs, "pixel-aspect-ratio", GST_TYPE_FRACTION, + set_par_n, set_par_d, NULL); + } + } + +done: + if (from_par == &fpar) + g_value_unset (&fpar); + if (to_par == &tpar) + g_value_unset (&tpar); + + return othercaps; +} + +static GstCaps * +gst_cuda_base_convert_fixate_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) +{ + GstCaps *format = NULL; + + GST_DEBUG_OBJECT (trans, + "trying to fixate othercaps %" GST_PTR_FORMAT " based on caps %" + GST_PTR_FORMAT, othercaps, caps); + + format = gst_cuda_base_convert_get_fixed_format (trans, direction, caps, + othercaps); + + if (gst_caps_is_empty (format)) { + GST_ERROR_OBJECT (trans, "Could not convert formats"); + return format; + } + + /* convert mode is "all" or "size" here */ + othercaps = + gst_cuda_base_convert_fixate_size (trans, direction, caps, othercaps); + + if (gst_caps_get_size (othercaps) == 1) { + guint i; + const gchar *format_fields = { "format", "colorimetry", "chroma-site" }; + GstStructure *format_struct = gst_caps_get_structure (format, 0); + GstStructure *fixated_struct; + + othercaps = gst_caps_make_writable (othercaps); + fixated_struct = gst_caps_get_structure (othercaps, 0); + + for (i = 0; i < G_N_ELEMENTS (format_fields); i++) { + if (gst_structure_has_field (format_struct, format_fieldsi)) { + gst_structure_set (fixated_struct, format_fieldsi, G_TYPE_STRING, + gst_structure_get_string (format_struct, format_fieldsi), NULL); + } else { + gst_structure_remove_field (fixated_struct, format_fieldsi); + } + } + } + gst_caps_unref (format); + + GST_DEBUG_OBJECT (trans, "fixated othercaps to %" GST_PTR_FORMAT, othercaps); + + return othercaps; +} + +static gboolean +gst_cuda_base_convert_propose_allocation (GstBaseTransform * trans, + GstQuery * decide_query, GstQuery * query) +{ + GstCudaBaseTransform *ctrans = GST_CUDA_BASE_TRANSFORM (trans); + GstVideoInfo info; + GstBufferPool *pool; + GstCaps *caps; + guint size; + + if (!GST_BASE_TRANSFORM_CLASS (parent_class)->propose_allocation (trans, + decide_query, query)) + return FALSE; + + /* passthrough, we're done */ + if (decide_query == NULL) + return TRUE; + + gst_query_parse_allocation (query, &caps, NULL); + + if (caps == NULL) + return FALSE; + + if (!gst_video_info_from_caps (&info, caps)) + return FALSE; + + if (gst_query_get_n_allocation_pools (query) == 0) { + GstStructure *config; + + pool = gst_cuda_buffer_pool_new (ctrans->context); + + config = gst_buffer_pool_get_config (pool); + + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_META); + + size = GST_VIDEO_INFO_SIZE (&info); + gst_buffer_pool_config_set_params (config, caps, size, 0, 0); + + if (!gst_buffer_pool_set_config (pool, config)) { + GST_ERROR_OBJECT (ctrans, "failed to set config"); + gst_object_unref (pool); + return FALSE; + } + + /* Get updated size by cuda buffer pool */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, NULL, &size, NULL, NULL); + gst_structure_free (config); + + gst_query_add_allocation_pool (query, pool, size, 0, 0); + + gst_object_unref (pool); + } + + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + + return TRUE; +} + +static gboolean +gst_cuda_base_convert_decide_allocation (GstBaseTransform * trans, + GstQuery * query) +{ + GstCudaBaseTransform *ctrans = GST_CUDA_BASE_TRANSFORM (trans); + GstCaps *outcaps = NULL; + GstBufferPool *pool = NULL; + guint size, min, max; + GstStructure *config; + gboolean update_pool = FALSE; + + gst_query_parse_allocation (query, &outcaps, NULL); + + if (!outcaps) + return FALSE; + + if (gst_query_get_n_allocation_pools (query) > 0) { + gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); + if (pool) { + if (!GST_IS_CUDA_BUFFER_POOL (pool)) { + gst_clear_object (&pool); + } else { + GstCudaBufferPool *cpool = GST_CUDA_BUFFER_POOL (pool); + + if (cpool->context != ctrans->context) { + gst_clear_object (&pool); + } + } + } + + update_pool = TRUE; + } else { + GstVideoInfo vinfo; + gst_video_info_from_caps (&vinfo, outcaps); + size = GST_VIDEO_INFO_SIZE (&vinfo); + min = max = 0; + } + + if (!pool) { + GST_DEBUG_OBJECT (ctrans, "create our pool"); + + pool = gst_cuda_buffer_pool_new (ctrans->context); + } + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + gst_buffer_pool_config_set_params (config, outcaps, size, min, max); + gst_buffer_pool_set_config (pool, config); + + /* Get updated size by cuda buffer pool */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, NULL, &size, NULL, NULL); + gst_structure_free (config); + + if (update_pool) + gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); + else + gst_query_add_allocation_pool (query, pool, size, min, max); + + gst_object_unref (pool); + + return GST_BASE_TRANSFORM_CLASS (parent_class)->decide_allocation (trans, + query); +} + +static gboolean +gst_cuda_base_convert_set_info (GstCudaBaseTransform * btrans, + GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, + GstVideoInfo * out_info) +{ + GstCudaBaseConvert *self = GST_CUDA_BASE_CONVERT (btrans); + gint from_dar_n, from_dar_d, to_dar_n, to_dar_d; + GstVideoInfo tmp_info; + + gst_clear_object (&self->converter); + + if (!gst_util_fraction_multiply (in_info->width, + in_info->height, in_info->par_n, in_info->par_d, &from_dar_n, + &from_dar_d)) { + from_dar_n = from_dar_d = -1; + } + + if (!gst_util_fraction_multiply (out_info->width, + out_info->height, out_info->par_n, out_info->par_d, &to_dar_n, + &to_dar_d)) { + to_dar_n = to_dar_d = -1; + } + + self->borders_w = self->borders_h = 0; + if (to_dar_n != from_dar_n || to_dar_d != from_dar_d) { + if (self->add_borders) { + gint n, d, to_h, to_w; + + if (from_dar_n != -1 && from_dar_d != -1 + && gst_util_fraction_multiply (from_dar_n, from_dar_d, + out_info->par_d, out_info->par_n, &n, &d)) { + to_h = gst_util_uint64_scale_int (out_info->width, d, n); + if (to_h <= out_info->height) { + self->borders_h = out_info->height - to_h; + self->borders_w = 0; + } else { + to_w = gst_util_uint64_scale_int (out_info->height, n, d); + g_assert (to_w <= out_info->width); + self->borders_h = 0; + self->borders_w = out_info->width - to_w; + } + } else { + GST_WARNING_OBJECT (self, "Can't calculate borders"); + } + } else { + GST_WARNING_OBJECT (self, "Can't keep DAR!"); + } + } + + /* if present, these must match */ + if (in_info->interlace_mode != out_info->interlace_mode) { + GST_ERROR_OBJECT (self, "input and output formats do not match"); + return FALSE; + } + + /* if the only thing different in the caps is the transfer function, and + * we're converting between equivalent transfer functions, do passthrough */ + tmp_info = *in_info; + tmp_info.colorimetry.transfer = out_info->colorimetry.transfer; + if (gst_video_info_is_equal (&tmp_info, out_info) && + gst_video_transfer_function_is_equivalent (in_info->colorimetry.transfer, + in_info->finfo->bits, out_info->colorimetry.transfer, + out_info->finfo->bits)) { + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (self), TRUE); + } else { + GstStructure *config; + + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (self), FALSE); + + config = gst_structure_new_empty ("GstCudaConverter"); + gst_structure_set (config, + GST_CUDA_CONVERTER_OPT_DEST_X, G_TYPE_INT, self->borders_w / 2, + GST_CUDA_CONVERTER_OPT_DEST_Y, G_TYPE_INT, self->borders_h / 2, + GST_CUDA_CONVERTER_OPT_DEST_WIDTH, + G_TYPE_INT, out_info->width - self->borders_w, + GST_CUDA_CONVERTER_OPT_DEST_HEIGHT, + G_TYPE_INT, out_info->height - self->borders_h, NULL); + + self->converter = gst_cuda_converter_new (in_info, + out_info, btrans->context, config); + if (!self->converter) { + GST_ERROR_OBJECT (self, "Couldn't create converter"); + return FALSE; + } + } + + GST_DEBUG_OBJECT (self, "%s from=%dx%d (par=%d/%d dar=%d/%d), size %" + G_GSIZE_FORMAT " -> %s to=%dx%d (par=%d/%d dar=%d/%d borders=%d:%d), " + "size %" G_GSIZE_FORMAT, + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info)), + in_info->width, in_info->height, in_info->par_n, in_info->par_d, + from_dar_n, from_dar_d, in_info->size, + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info)), + out_info->width, + out_info->height, out_info->par_n, out_info->par_d, to_dar_n, to_dar_d, + self->borders_w, self->borders_h, out_info->size); + + return TRUE; +} + +static gboolean +gst_cuda_base_convert_filter_meta (GstBaseTransform * trans, GstQuery * query, + GType api, const GstStructure * params) +{ + /* This element cannot passthrough the crop meta, because it would convert the + * wrong sub-region of the image, and worst, our output image may not be large + * enough for the crop to be applied later */ + if (api == GST_VIDEO_CROP_META_API_TYPE) + return FALSE; + + /* propose all other metadata upstream */ + return TRUE; +} + +static GstFlowReturn +gst_cuda_base_convert_transform (GstBaseTransform * trans, + GstBuffer * inbuf, GstBuffer * outbuf) +{ + GstCudaBaseConvert *self = GST_CUDA_BASE_CONVERT (trans); + GstCudaBaseTransform *btrans = GST_CUDA_BASE_TRANSFORM (trans); + GstVideoFrame in_frame, out_frame; + GstFlowReturn ret = GST_FLOW_OK; + GstMemory *mem; + + if (gst_buffer_n_memory (inbuf) != 1) { + GST_ERROR_OBJECT (self, "Invalid input buffer"); + return GST_FLOW_ERROR; + } + + mem = gst_buffer_peek_memory (inbuf, 0); + if (!gst_is_cuda_memory (mem)) { + GST_ERROR_OBJECT (self, "Input buffer is not CUDA"); + return GST_FLOW_ERROR; + } + + if (gst_buffer_n_memory (outbuf) != 1) { + GST_ERROR_OBJECT (self, "Invalid output buffer"); + return GST_FLOW_ERROR; + } + + mem = gst_buffer_peek_memory (outbuf, 0); + if (!gst_is_cuda_memory (mem)) { + GST_ERROR_OBJECT (self, "Input buffer is not CUDA"); + return GST_FLOW_ERROR; + } + + if (!gst_video_frame_map (&in_frame, &btrans->in_info, inbuf, + GST_MAP_READ | GST_MAP_CUDA)) { + GST_ERROR_OBJECT (self, "Failed to map input buffer"); + return GST_FLOW_ERROR; + } + + if (!gst_video_frame_map (&out_frame, &btrans->out_info, outbuf, + GST_MAP_WRITE | GST_MAP_CUDA)) { + gst_video_frame_unmap (&in_frame); + GST_ERROR_OBJECT (self, "Failed to map output buffer"); + return GST_FLOW_ERROR; + } + + if (!gst_cuda_converter_convert_frame (self->converter, &in_frame, &out_frame, + btrans->cuda_stream)) { + GST_ERROR_OBJECT (self, "Failed to convert frame"); + ret = GST_FLOW_ERROR; + } + + gst_video_frame_unmap (&out_frame); + gst_video_frame_unmap (&in_frame); + + return ret; +} + +static void +gst_cuda_base_convert_set_add_border (GstCudaBaseConvert * self, + gboolean add_border) +{ + gboolean prev = self->add_borders; + + self->add_borders = add_border; + if (prev != self->add_borders) + gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM_CAST (self)); +} + +/** + * SECTION:element-cudaconvertscale + * @title: cudaconvertscale + * @short_description: A CUDA based color conversion and video resizing element + * + * This element resizes video frames and change color space. + * By default the element will try to negotiate to the same size on the source + * and sinkpad so that no scaling is needed. + * It is therefore safe to insert this element in a pipeline to + * get more robust behaviour without any cost if no scaling is needed. + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc ! cudaupload ! cudaconvertscale ! cudadownload ! autovideosink + * ``` + * + * Since: 1.22 + */ + +enum +{ + PROP_CONVERT_SCALE_0, + PROP_CONVERT_SCALE_ADD_BORDERS, +}; + +struct _GstCudaConvertScale +{ + GstCudaBaseConvert parent; +}; + +static void gst_cuda_convert_scale_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_cuda_convert_scale_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); + +G_DEFINE_TYPE (GstCudaConvertScale, gst_cuda_convert_scale, + GST_TYPE_CUDA_BASE_CONVERT); + +static void +gst_cuda_convert_scale_class_init (GstCudaConvertScaleClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gobject_class->set_property = gst_cuda_convert_scale_set_property; + gobject_class->get_property = gst_cuda_convert_scale_get_property; + + g_object_class_install_property (gobject_class, + PROP_CONVERT_SCALE_ADD_BORDERS, + g_param_spec_boolean ("add-borders", "Add Borders", + "Add borders if necessary to keep the display aspect ratio", + DEFAULT_ADD_BORDERS, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + gst_element_class_set_static_metadata (element_class, + "CUDA colorspace converter and scaler", + "Filter/Converter/Video/Scaler/Colorspace/Hardware", + "Resizes video and allow color conversion using CUDA", + "Seungha Yang <seungha@centricular.com>"); +} + +static void +gst_cuda_convert_scale_init (GstCudaConvertScale * self) +{ +} + +static void +gst_cuda_convert_scale_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstCudaBaseConvert *base = GST_CUDA_BASE_CONVERT (object); + + switch (prop_id) { + case PROP_CONVERT_SCALE_ADD_BORDERS: + gst_cuda_base_convert_set_add_border (base, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_cuda_convert_scale_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstCudaBaseConvert *base = GST_CUDA_BASE_CONVERT (object); + + switch (prop_id) { + case PROP_CONVERT_SCALE_ADD_BORDERS: + g_value_set_boolean (value, base->add_borders); + break; + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * SECTION:element-cudaconvert + * @title: cudaconvert + * + * Convert video frames between supported video formats. + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc ! cudaupload ! cudaconvert ! cudadownload ! autovideosink + * ``` + * + * Since: 1.20 + */ + +struct _GstCudaConvert +{ + GstCudaBaseConvert parent; +}; + +static GstCaps *gst_cuda_convert_transform_caps (GstBaseTransform * + trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter); +static GstCaps *gst_cuda_convert_fixate_caps (GstBaseTransform * base, + GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); + +G_DEFINE_TYPE (GstCudaConvert, gst_cuda_convert, GST_TYPE_CUDA_BASE_CONVERT); + +static void +gst_cuda_convert_class_init (GstCudaConvertClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); + + gst_element_class_set_static_metadata (element_class, + "CUDA colorspace converter", + "Filter/Converter/Video/Hardware", + "Converts video from one colorspace to another using CUDA", + "Seungha Yang <seungha.yang@navercorp.com>"); + + trans_class->transform_caps = + GST_DEBUG_FUNCPTR (gst_cuda_convert_transform_caps); + trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_cuda_convert_fixate_caps); +} + +static void +gst_cuda_convert_init (GstCudaConvert * self) +{ +} + +static GstCaps * +gst_cuda_convert_transform_caps (GstBaseTransform * + trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter) +{ + GstCaps *tmp, *tmp2; + GstCaps *result; + + /* Get all possible caps that we can transform to */ + tmp = gst_cuda_base_convert_caps_remove_format_info (caps); + + if (filter) { + tmp2 = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (tmp); + tmp = tmp2; + } + + result = tmp; + + GST_DEBUG_OBJECT (trans, "transformed %" GST_PTR_FORMAT " into %" + GST_PTR_FORMAT, caps, result); + + return result; +} + +static GstCaps * +gst_cuda_convert_fixate_caps (GstBaseTransform * base, + GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) +{ + GstCaps *format = NULL; + + GST_DEBUG_OBJECT (base, + "trying to fixate othercaps %" GST_PTR_FORMAT " based on caps %" + GST_PTR_FORMAT, othercaps, caps); + + format = gst_cuda_base_convert_get_fixed_format (base, direction, caps, + othercaps); + gst_caps_unref (othercaps); + + if (gst_caps_is_empty (format)) { + GST_ERROR_OBJECT (base, "Could not convert formats"); + } else { + GST_DEBUG_OBJECT (base, "fixated othercaps to %" GST_PTR_FORMAT, format); + } + + return format; +} + +/** + * SECTION:element-cudascale + * @title: cudascale + * + * A CUDA based video resizing element + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc ! video/x-raw,width=640,height=480 ! cudaupload ! cudascale ! cudadownload ! video/x-raw,width=1280,height=720 ! fakesink + * ``` + * This will upload a 640x480 resolution test video to CUDA + * memory space and resize it to 1280x720 resolution. Then a resized CUDA + * frame will be downloaded to system memory space. + * + * Since: 1.20 + */ + +enum +{ + PROP_SCALE_0, + PROP_SCALE_ADD_BORDERS, +}; + +struct _GstCudaScale +{ + GstCudaBaseConvert parent; +}; + +static void gst_cuda_scale_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_cuda_scale_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstCaps *gst_cuda_scale_transform_caps (GstBaseTransform * + trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter); +static GstCaps *gst_cuda_scale_fixate_caps (GstBaseTransform * base, + GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); + +G_DEFINE_TYPE (GstCudaScale, gst_cuda_scale, GST_TYPE_CUDA_BASE_CONVERT); + +static void +gst_cuda_scale_class_init (GstCudaScaleClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); + + gobject_class->set_property = gst_cuda_scale_set_property; + gobject_class->get_property = gst_cuda_scale_get_property; + + /** + * GstCudaScale:add-borders: + * + * Add borders if necessary to keep the display aspect ratio + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_SCALE_ADD_BORDERS, + g_param_spec_boolean ("add-borders", "Add Borders", + "Add borders if necessary to keep the display aspect ratio", + DEFAULT_ADD_BORDERS, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + gst_element_class_set_static_metadata (element_class, + "CUDA video scaler", + "Filter/Converter/Video/Scaler/Hardware", + "Resize video using CUDA", "Seungha Yang <seungha.yang@navercorp.com>"); + + trans_class->transform_caps = + GST_DEBUG_FUNCPTR (gst_cuda_scale_transform_caps); + trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_cuda_scale_fixate_caps); +} + +static void +gst_cuda_scale_init (GstCudaScale * self) +{ +} + +static void +gst_cuda_scale_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstCudaBaseConvert *base = GST_CUDA_BASE_CONVERT (object); + + switch (prop_id) { + case PROP_SCALE_ADD_BORDERS: + gst_cuda_base_convert_set_add_border (base, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_cuda_scale_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstCudaBaseConvert *base = GST_CUDA_BASE_CONVERT (object); + + switch (prop_id) { + case PROP_SCALE_ADD_BORDERS: + g_value_set_boolean (value, base->add_borders); + break; + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstCaps * +gst_cuda_scale_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps, GstCaps * filter) +{ + GstCaps *tmp, *tmp2; + GstCaps *result; + + /* Get all possible caps that we can transform to */ + tmp = gst_cuda_base_convert_caps_rangify_size_info (caps); + + if (filter) { + tmp2 = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (tmp); + tmp = tmp2; + } + + result = tmp; + + GST_DEBUG_OBJECT (trans, "transformed %" GST_PTR_FORMAT " into %" + GST_PTR_FORMAT, caps, result); + + return result; +} + +static GstCaps * +gst_cuda_scale_fixate_caps (GstBaseTransform * base, + GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) +{ + GST_DEBUG_OBJECT (base, + "trying to fixate othercaps %" GST_PTR_FORMAT " based on caps %" + GST_PTR_FORMAT, othercaps, caps); + + othercaps = + gst_cuda_base_convert_fixate_size (base, direction, caps, othercaps); + + GST_DEBUG_OBJECT (base, "fixated othercaps to %" GST_PTR_FORMAT, othercaps); + + return othercaps; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcudaconvertscale.h
Added
@@ -0,0 +1,58 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include "gstcudabasetransform.h" + +G_BEGIN_DECLS + +#define GST_TYPE_CUDA_BASE_CONVERT (gst_cuda_base_convert_get_type()) +#define GST_CUDA_BASE_CONVERT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CUDA_BASE_CONVERT,GstCudaBaseConvert)) +#define GST_CUDA_BASE_CONVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CUDA_BASE_CONVERT,GstCudaBaseConvertClass)) +#define GST_CUDA_BASE_CONVERT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CUDA_BASE_CONVERT,GstCudaBaseConvertClass)) +#define GST_IS_CUDA_BASE_CONVERT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CUDA_BASE_CONVERT)) +#define GST_IS_CUDA_BASE_CONVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CUDA_BASE_CONVERT)) + +typedef struct _GstCudaBaseConvert GstCudaBaseConvert; +typedef struct _GstCudaBaseConvertClass GstCudaBaseConvertClass; + +struct _GstCudaBaseConvertClass +{ + GstCudaBaseTransform parent_class; +}; + +GType gst_cuda_base_convert_get_type (void); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstCudaBaseConvert, gst_object_unref) + +#define GST_TYPE_CUDA_CONVERT_SCALE (gst_cuda_convert_scale_get_type()) +G_DECLARE_FINAL_TYPE (GstCudaConvertScale, gst_cuda_convert_scale, + GST, CUDA_CONVERT_SCALE, GstCudaBaseConvert) + +#define GST_TYPE_CUDA_CONVERT (gst_cuda_convert_get_type()) +G_DECLARE_FINAL_TYPE (GstCudaConvert, gst_cuda_convert, + GST, CUDA_CONVERT, GstCudaBaseConvert) + +#define GST_TYPE_CUDA_SCALE (gst_cuda_scale_get_type()) +G_DECLARE_FINAL_TYPE (GstCudaScale, gst_cuda_scale, + GST, CUDA_SCALE, GstCudaBaseConvert) + +G_END_DECLS +
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcudafilter.c -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcudafilter.c
Changed
@@ -21,12 +21,11 @@ #include "config.h" #endif +#include <gst/cuda/gstcudaloader.h> +#include <gst/cuda/gstcudanvrtc.h> + #include "gstcudafilter.h" -#include "gstcudaloader.h" -#include "gstnvrtcloader.h" -#include "gstcudanvrtc.h" -#include "gstcudaconvert.h" -#include "gstcudascale.h" +#include "gstcudaconvertscale.h" /* *INDENT-OFF* */ const gchar *nvrtc_test_source = @@ -39,7 +38,7 @@ { gchar *test_ptx = NULL; - if (!gst_nvrtc_load_library ()) + if (!gst_cuda_nvrtc_load_library ()) return; test_ptx = gst_cuda_nvrtc_compile (nvrtc_test_source); @@ -53,4 +52,6 @@ GST_TYPE_CUDA_CONVERT); gst_element_register (plugin, "cudascale", GST_RANK_NONE, GST_TYPE_CUDA_SCALE); + gst_element_register (plugin, "cudaconvertscale", GST_RANK_NONE, + GST_TYPE_CUDA_CONVERT_SCALE); }
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcudaformat.h
Added
@@ -0,0 +1,44 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> + +G_BEGIN_DECLS + +#define GST_CUDA_FORMATS \ + "{ I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, " \ + "BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, " \ + "Y42B, I422_10LE, I422_12LE, YUY2, UYVY, RGBP, BGRP, GBR, GBRA }" + +#define GST_CUDA_GL_FORMATS \ + "{ I420, YV12, NV12, NV21, P010_10LE, P016_LE, Y444, " \ + "BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, " \ + "YUY2, UYVY, RGBP, BGRP, GBR, GBRA }" + +#define GST_CUDA_D3D11_FORMATS \ + "{ I420, YV12, I420_10LE, Y444, Y444_16LE, " \ + "BGRA, RGBA, BGRx, RGBx, Y42B, I422_10LE, I422_12LE }" + +#define GST_CUDA_NVMM_FORMATS \ + "{ I420, YV12, NV12, NV21, P010_10LE, Y444, " \ + "BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR }" + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcudamemorycopy.c
Added
@@ -0,0 +1,1277 @@ +/* GStreamer + * Copyright (C) <2019> Seungha Yang <seungha.yang@navercorp.com> + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * element-cudaupload: + * + * Uploads data to NVIDIA GPU via CUDA APIs + * + * Since: 1.20 + */ + +/** + * element-cudadownload: + * + * Downloads data from NVIDIA GPU via CUDA APIs + * + * Since: 1.20 + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "gstcudabasetransform.h" +#include "gstcudamemorycopy.h" +#include "gstcudaformat.h" +#include <gst/cuda/gstcudautils.h> +#include <gst/cuda/gstcuda-private.h> +#ifdef HAVE_NVCODEC_NVMM +#include "gstcudanvmm.h" +#endif + +#ifdef HAVE_NVCODEC_GST_GL +#include <gst/gl/gl.h> +#endif +#ifdef GST_CUDA_HAS_D3D +#include <gst/d3d11/gstd3d11.h> +#endif + +#include <string.h> + +GST_DEBUG_CATEGORY_STATIC (gst_cuda_memory_copy_debug); +#define GST_CAT_DEFAULT gst_cuda_memory_copy_debug + +typedef struct _GstCudaMemoryCopyClassData +{ + GstCaps *sink_caps; + GstCaps *src_caps; +} GstCudaMemoryCopyClassData; + +struct _GstCudaMemoryCopy +{ + GstCudaBaseTransform parent; + GstCudaBufferCopyType in_type; + GstCudaBufferCopyType out_type; + + gboolean downstream_supports_video_meta; + +#ifdef HAVE_NVCODEC_GST_GL + GstGLDisplay *gl_display; + GstGLContext *gl_context; + GstGLContext *other_gl_context; +#endif +#ifdef GST_CUDA_HAS_D3D + GstD3D11Device *d3d11_device; +#endif +}; + +typedef struct _GstCudaUpload +{ + GstCudaMemoryCopy parent; +} GstCudaUpload; + +typedef struct _GstCudaUploadClass +{ + GstCudaMemoryCopyClass parent_class; +} GstCudaUploadClass; + +typedef struct _GstCudaDownload +{ + GstCudaMemoryCopy parent; +} GstCudaDownload; + +typedef struct _GstCudaDownloadClass +{ + GstCudaMemoryCopyClass parent_class; +} GstCudaDownloadClass; + +/** + * GstCudaMemoryCopy: + * + * Since: 1.22 + */ +#define gst_cuda_memory_copy_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE (GstCudaMemoryCopy, gst_cuda_memory_copy, + GST_TYPE_CUDA_BASE_TRANSFORM); + +static void gst_cuda_memory_copy_set_context (GstElement * element, + GstContext * context); +static gboolean gst_cuda_memory_copy_transform_stop (GstBaseTransform * trans); +static GstCaps *gst_cuda_memory_copy_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps, GstCaps * filter); +static gboolean gst_cuda_memory_copy_query (GstBaseTransform * trans, + GstPadDirection direction, GstQuery * query); +static gboolean gst_cuda_memory_copy_propose_allocation (GstBaseTransform * + trans, GstQuery * decide_query, GstQuery * query); +static gboolean gst_cuda_memory_copy_decide_allocation (GstBaseTransform * + trans, GstQuery * query); +static gboolean gst_cuda_memory_copy_set_info (GstCudaBaseTransform * btrans, + GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, + GstVideoInfo * out_info); +static GstFlowReturn gst_cuda_memory_copy_transform (GstBaseTransform * trans, + GstBuffer * inbuf, GstBuffer * outbuf); +#ifdef GST_CUDA_HAS_D3D +static gboolean +gst_cuda_memory_copy_ensure_d3d11_interop (GstCudaContext * context, + GstD3D11Device * device); +#endif + +static void +gst_cuda_memory_copy_class_init (GstCudaMemoryCopyClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); + GstCudaBaseTransformClass *btrans_class = + GST_CUDA_BASE_TRANSFORM_CLASS (klass); + + element_class->set_context = + GST_DEBUG_FUNCPTR (gst_cuda_memory_copy_set_context); + + trans_class->stop = GST_DEBUG_FUNCPTR (gst_cuda_memory_copy_transform_stop); + trans_class->transform_caps = + GST_DEBUG_FUNCPTR (gst_cuda_memory_copy_transform_caps); + trans_class->propose_allocation = + GST_DEBUG_FUNCPTR (gst_cuda_memory_copy_propose_allocation); + trans_class->decide_allocation = + GST_DEBUG_FUNCPTR (gst_cuda_memory_copy_decide_allocation); + trans_class->query = GST_DEBUG_FUNCPTR (gst_cuda_memory_copy_query); + + btrans_class->set_info = GST_DEBUG_FUNCPTR (gst_cuda_memory_copy_set_info); + + gst_type_mark_as_plugin_api (GST_TYPE_CUDA_MEMORY_COPY, + (GstPluginAPIFlags) 0); +} + +static void +gst_cuda_memory_copy_init (GstCudaMemoryCopy * self) +{ +} + +static void +gst_cuda_memory_copy_set_context (GstElement * element, GstContext * context) +{ + /* CUDA context is handled by parent class, handle only non-CUDA context */ +#if defined (HAVE_NVCODEC_GST_GL) || defined (GST_CUDA_HAS_D3D) + GstCudaMemoryCopy *self = GST_CUDA_MEMORY_COPY (element); + +#ifdef HAVE_NVCODEC_GST_GL + gst_gl_handle_set_context (element, context, &self->gl_display, + &self->other_gl_context); +#endif /* HAVE_NVCODEC_GST_GL */ + +#ifdef GST_CUDA_HAS_D3D + GstCudaBaseTransform *base = GST_CUDA_BASE_TRANSFORM (element); + if (gst_d3d11_handle_set_context (element, context, -1, &self->d3d11_device)) { + gboolean compatible = TRUE; + + if (base->context) { + if (!gst_cuda_memory_copy_ensure_d3d11_interop (base->context, + self->d3d11_device)) { + GST_INFO_OBJECT (self, "%" GST_PTR_FORMAT + " is not CUDA compatible with %" GST_PTR_FORMAT, + self->d3d11_device, base->context); + compatible = FALSE; + } + } else { + guint device_count = 0; + CUdevice device_list1 = { 0, }; + CUresult cuda_ret; + + cuda_ret = CuD3D11GetDevices (&device_count, device_list, 1, + gst_d3d11_device_get_device_handle (self->d3d11_device), + CU_D3D11_DEVICE_LIST_ALL); + if (cuda_ret != CUDA_SUCCESS || device_count == 0) { + GST_INFO_OBJECT (self, "%" GST_PTR_FORMAT " is not CUDA compatible", + self->d3d11_device); + compatible = FALSE; + } + } + + if (!compatible) { + gst_clear_object (&self->d3d11_device); + } else { + GST_INFO_OBJECT (self, "%" GST_PTR_FORMAT " is CUDA compatible", + self->d3d11_device); + } + } +#endif /* GST_CUDA_HAS_D3D */ +#endif /* defined (HAVE_NVCODEC_GST_GL) || defined (GST_CUDA_HAS_D3D) */ + + GST_ELEMENT_CLASS (parent_class)->set_context (element, context); +} + +static gboolean +gst_cuda_memory_copy_transform_stop (GstBaseTransform * trans) +{ +#if defined(HAVE_NVCODEC_GST_GL) || defined(GST_CUDA_HAS_D3D) + GstCudaMemoryCopy *self = GST_CUDA_MEMORY_COPY (trans); + +# ifdef HAVE_NVCODEC_GST_GL + gst_clear_object (&self->gl_display); + gst_clear_object (&self->gl_context); + gst_clear_object (&self->other_gl_context); +# endif +# ifdef GST_CUDA_HAS_D3D + gst_clear_object (&self->d3d11_device); +# endif +#endif + + return GST_BASE_TRANSFORM_CLASS (parent_class)->stop (trans); +} + +static GstCaps * +_set_caps_features (const GstCaps * caps, const gchar * feature_name) +{ + GstCaps *tmp = gst_caps_copy (caps); + guint n = gst_caps_get_size (tmp); + guint i = 0; + + for (i = 0; i < n; i++) + gst_caps_set_features (tmp, i, + gst_caps_features_from_string (feature_name)); + + return tmp; +} + +static void +_remove_field (GstCaps * caps, const gchar * field) +{ + guint n = gst_caps_get_size (caps); + guint i = 0; + + for (i = 0; i < n; i++) { + GstStructure *s = gst_caps_get_structure (caps, i); + gst_structure_remove_field (s, field); + } +} + +static GstCaps * +create_transform_caps (GstCaps * caps, gboolean to_cuda) +{ + GstCaps *ret = NULL; + GstCaps *new_caps = NULL; + + if (to_cuda) { + /* SRC -> SINK of cudadownload or SINK -> SRC of cudaupload */ + ret = gst_caps_copy (caps); + +#ifdef HAVE_NVCODEC_NVMM + if (gst_cuda_nvmm_init_once ()) { + new_caps = _set_caps_features (caps, + GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY); + ret = gst_caps_merge (ret, new_caps); + } +#endif + + new_caps = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY); + ret = gst_caps_merge (ret, new_caps); + + ret = gst_caps_make_writable (ret); + _remove_field (ret, "texture-target"); + } else { + /* SINK -> SRC of cudadownload or SRC -> SINK of cudaupload */ + ret = gst_caps_ref (caps); + +#ifdef HAVE_NVCODEC_NVMM + if (gst_cuda_nvmm_init_once ()) { + new_caps = _set_caps_features (caps, + GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY); + ret = gst_caps_merge (ret, new_caps); + } +#endif + +#ifdef HAVE_NVCODEC_GST_GL + new_caps = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_GL_MEMORY); + ret = gst_caps_merge (ret, new_caps); +#endif +#ifdef GST_CUDA_HAS_D3D + new_caps = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY); + ret = gst_caps_merge (ret, new_caps); +#endif + + new_caps = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY); + ret = gst_caps_merge (ret, new_caps); + + ret = gst_caps_make_writable (ret); + _remove_field (ret, "texture-target"); + } + + return ret; +} + +static GstCaps * +gst_cuda_memory_copy_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps, GstCaps * filter) +{ + GstCudaMemoryCopyClass *klass = GST_CUDA_MEMORY_COPY_GET_CLASS (trans); + GstCaps *result, *tmp; + + GST_DEBUG_OBJECT (trans, + "Transforming caps %" GST_PTR_FORMAT " in direction %s", caps, + (direction == GST_PAD_SINK) ? "sink" : "src"); + + if (direction == GST_PAD_SINK) { + tmp = create_transform_caps (caps, klass->uploader); + } else { + tmp = create_transform_caps (caps, !klass->uploader); + } + + if (filter) { + result = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (tmp); + } else { + result = tmp; + } + + GST_DEBUG_OBJECT (trans, "returning caps: %" GST_PTR_FORMAT, result); + + return result; +} + +#ifdef HAVE_NVCODEC_GST_GL +static void +gst_cuda_memory_copy_ensure_gl_interop (GstGLContext * context, gboolean * ret) +{ + guint device_count = 0; + CUdevice device_list1 = { 0, }; + CUresult cuda_ret; + + *ret = FALSE; + + cuda_ret = CuGLGetDevices (&device_count, + device_list, 1, CU_GL_DEVICE_LIST_ALL); + + if (cuda_ret != CUDA_SUCCESS || device_count == 0) + return; + + *ret = TRUE; + + return; +} + +static gboolean +gst_cuda_memory_copy_ensure_gl_context (GstCudaMemoryCopy * self) +{ + GstGLDisplay *display; + GstGLContext *context; + gboolean ret = FALSE; + + if (!gst_gl_ensure_element_data (GST_ELEMENT (self), + &self->gl_display, &self->other_gl_context)) { + GST_DEBUG_OBJECT (self, "No available OpenGL display"); + return FALSE; + } + + display = self->gl_display; + + if (!gst_gl_query_local_gl_context (GST_ELEMENT (self), GST_PAD_SRC, + &self->gl_context) && + !gst_gl_query_local_gl_context (GST_ELEMENT (self), GST_PAD_SINK, + &self->gl_context)) { + GST_INFO_OBJECT (self, "failed to query local OpenGL context"); + + gst_clear_object (&self->gl_context); + self->gl_context = gst_gl_display_get_gl_context_for_thread (display, NULL); + if (!self->gl_context + || !gst_gl_display_add_context (display, + GST_GL_CONTEXT (self->gl_context))) { + gst_clear_object (&self->gl_context); + if (!gst_gl_display_create_context (display, + self->other_gl_context, &self->gl_context, NULL)) { + GST_WARNING_OBJECT (self, "failed to create OpenGL context"); + return FALSE; + } + + if (!gst_gl_display_add_context (display, self->gl_context)) { + GST_WARNING_OBJECT (self, + "failed to add the OpenGL context to the display"); + return FALSE; + } + } + } + + context = self->gl_context; + + if (!gst_gl_context_check_gl_version (context, + (GstGLAPI) (GST_GL_API_OPENGL | GST_GL_API_OPENGL3), 3, 0)) { + GST_WARNING_OBJECT (self, "OpenGL context could not support PBO download"); + return FALSE; + } + + gst_gl_context_thread_add (context, + (GstGLContextThreadFunc) gst_cuda_memory_copy_ensure_gl_interop, &ret); + if (!ret) { + GST_WARNING_OBJECT (self, "Current GL context is not CUDA compatible"); + return FALSE; + } + + return TRUE; +} +#endif + +#ifdef GST_CUDA_HAS_D3D +static gboolean +gst_cuda_memory_copy_ensure_d3d11_interop (GstCudaContext * context, + GstD3D11Device * device) +{ + guint device_count = 0; + CUdevice cuda_device_id; + CUdevice device_list1 = { 0, }; + CUresult cuda_ret; + + g_object_get (context, "cuda-device-id", &cuda_device_id, NULL); + + cuda_ret = CuD3D11GetDevices (&device_count, + device_list, 1, gst_d3d11_device_get_device_handle (device), + CU_D3D11_DEVICE_LIST_ALL); + + if (cuda_ret != CUDA_SUCCESS || device_count == 0) + return FALSE; + + if (device_list0 != cuda_device_id) + return FALSE; + + return TRUE; +} + +static gboolean +gst_cuda_memory_copy_ensure_d3d11_context (GstCudaMemoryCopy * self) +{ + gint64 dxgi_adapter_luid = 0; + + g_object_get (GST_CUDA_BASE_TRANSFORM (self)->context, "dxgi-adapter-luid", + &dxgi_adapter_luid, NULL); + + if (!gst_d3d11_ensure_element_data_for_adapter_luid (GST_ELEMENT (self), + dxgi_adapter_luid, &self->d3d11_device)) { + GST_DEBUG_OBJECT (self, "No available D3D11 device"); + return FALSE; + } + + if (!gst_cuda_memory_copy_ensure_d3d11_interop (GST_CUDA_BASE_TRANSFORM + (self)->context, self->d3d11_device)) { + GST_WARNING_OBJECT (self, "Current D3D11 device is not CUDA compatible"); + return FALSE; + } + + return TRUE; +} +#endif + +static gboolean +gst_cuda_memory_copy_propose_allocation (GstBaseTransform * trans, + GstQuery * decide_query, GstQuery * query) +{ + GstCudaMemoryCopy *self = GST_CUDA_MEMORY_COPY (trans); + GstCudaBaseTransform *ctrans = GST_CUDA_BASE_TRANSFORM (trans); + GstVideoInfo info; + GstBufferPool *pool = NULL; + GstCaps *caps; + guint size; + + if (!GST_BASE_TRANSFORM_CLASS (parent_class)->propose_allocation (trans, + decide_query, query)) + return FALSE; + + /* passthrough, we're done */ + if (decide_query == NULL) + return TRUE; + + gst_query_parse_allocation (query, &caps, NULL); + + if (caps == NULL) + return FALSE; + + if (!gst_video_info_from_caps (&info, caps)) + return FALSE; + + if (gst_query_get_n_allocation_pools (query) == 0) { + GstCapsFeatures *features; + GstStructure *config; + + features = gst_caps_get_features (caps, 0); + + if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY)) { + GST_DEBUG_OBJECT (self, "upstream support CUDA memory"); + pool = gst_cuda_buffer_pool_new (ctrans->context); +#ifdef HAVE_NVCODEC_GST_GL + } else if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_GL_MEMORY) && + gst_cuda_memory_copy_ensure_gl_context (self)) { + GST_DEBUG_OBJECT (self, "upstream support GL memory"); + + pool = gst_gl_buffer_pool_new (self->gl_context); +#endif +#ifdef GST_CUDA_HAS_D3D + } else if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY) && + gst_cuda_memory_copy_ensure_d3d11_context (self)) { + GST_DEBUG_OBJECT (self, "upstream support D3D11 memory"); + + pool = gst_d3d11_buffer_pool_new (self->d3d11_device); +#endif +#ifdef HAVE_NVCODEC_NVMM + } else if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY) && + gst_cuda_nvmm_init_once ()) { + guint gpu_id = 0; + GST_DEBUG_OBJECT (self, "upstream support NVMM memory"); + + g_object_get (ctrans->context, "cuda-device-id", &gpu_id, NULL); + + pool = gst_cuda_nvmm_buffer_pool_new (); + if (!pool) { + GST_ERROR_OBJECT (self, "Failed to create pool"); + return FALSE; + } + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_params (config, caps, + sizeof (NvBufSurface), 0, 0); + + gst_structure_set (config, "memtype", G_TYPE_UINT, NVBUF_MEM_DEFAULT, + "gpu-id", G_TYPE_UINT, gpu_id, "batch-size", G_TYPE_UINT, 1, NULL); + + if (!gst_buffer_pool_set_config (pool, config)) { + GST_ERROR_OBJECT (self, "Failed to set config"); + gst_object_unref (pool); + return FALSE; + } + + gst_query_add_allocation_pool (query, pool, sizeof (NvBufSurface), 0, 0); + + return TRUE; +#endif + } + + if (!pool) { + GST_DEBUG_OBJECT (self, "creating system buffer pool"); + pool = gst_video_buffer_pool_new (); + } + + config = gst_buffer_pool_get_config (pool); + + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_META); + + size = GST_VIDEO_INFO_SIZE (&info); + gst_buffer_pool_config_set_params (config, caps, size, 0, 0); + + if (!gst_buffer_pool_set_config (pool, config)) { + GST_ERROR_OBJECT (ctrans, "failed to set config"); + gst_object_unref (pool); + return FALSE; + } + + /* Get updated size by cuda buffer pool */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, NULL, &size, NULL, NULL); + gst_structure_free (config); + + gst_query_add_allocation_pool (query, pool, size, 0, 0); + + gst_object_unref (pool); + } + + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + + return TRUE; +} + +static gboolean +gst_cuda_memory_copy_decide_allocation (GstBaseTransform * trans, + GstQuery * query) +{ + GstCudaMemoryCopy *self = GST_CUDA_MEMORY_COPY (trans); + GstCudaBaseTransform *ctrans = GST_CUDA_BASE_TRANSFORM (trans); + GstCaps *outcaps = NULL; + GstBufferPool *pool = NULL; + guint size, min, max; + GstStructure *config; + gboolean update_pool = FALSE; + GstCapsFeatures *features; + gboolean need_cuda = FALSE; +#ifdef HAVE_NVCODEC_GST_GL + gboolean need_gl = FALSE; +#endif +#ifdef GST_CUDA_HAS_D3D + gboolean need_d3d11 = FALSE; +#endif +#ifdef HAVE_NVCODEC_NVMM + gboolean need_nvmm = FALSE; +#endif + + gst_query_parse_allocation (query, &outcaps, NULL); + + if (!outcaps) + return FALSE; + + self->downstream_supports_video_meta = + gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + + GST_DEBUG_OBJECT (self, "Downstream supports video meta: %d", + self->downstream_supports_video_meta); + + features = gst_caps_get_features (outcaps, 0); + if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY)) { + need_cuda = TRUE; + } +#ifdef HAVE_NVCODEC_GST_GL + else if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_GL_MEMORY) && + gst_cuda_memory_copy_ensure_gl_context (self)) { + need_gl = TRUE; + } +#endif +#ifdef GST_CUDA_HAS_D3D + else if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY) && + gst_cuda_memory_copy_ensure_d3d11_context (self)) { + need_d3d11 = TRUE; + } +#endif +#ifdef HAVE_NVCODEC_NVMM + else if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY) && + gst_cuda_nvmm_init_once ()) { + need_nvmm = TRUE; + } +#endif + + if (gst_query_get_n_allocation_pools (query) > 0) { + gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); + if (need_cuda && pool) { + if (!GST_IS_CUDA_BUFFER_POOL (pool)) { + gst_clear_object (&pool); + } else { + GstCudaBufferPool *cpool = GST_CUDA_BUFFER_POOL (pool); + + if (cpool->context != ctrans->context) { + gst_clear_object (&pool); + } + } + } +#ifdef HAVE_NVCODEC_NVMM + if (need_nvmm) { + /* XXX: Always create new pool to set config option */ + gst_clear_object (&pool); + } +#endif + + update_pool = TRUE; + } else { + GstVideoInfo vinfo; + gst_video_info_from_caps (&vinfo, outcaps); + size = GST_VIDEO_INFO_SIZE (&vinfo); + min = max = 0; + } + + if (!pool) { + if (need_cuda) { + GST_DEBUG_OBJECT (self, "creating cuda pool"); + pool = gst_cuda_buffer_pool_new (ctrans->context); + } +#ifdef HAVE_NVCODEC_GST_GL + else if (need_gl) { + GST_DEBUG_OBJECT (self, "creating gl pool"); + pool = gst_gl_buffer_pool_new (self->gl_context); + } +#endif +#ifdef GST_CUDA_HAS_D3D + else if (need_d3d11) { + GST_DEBUG_OBJECT (self, "creating d3d11 pool"); + pool = gst_d3d11_buffer_pool_new (self->d3d11_device); + } +#endif +#ifdef HAVE_NVCODEC_NVMM + else if (need_nvmm) { + guint gpu_id = 0; + GST_DEBUG_OBJECT (self, "create nvmm pool"); + + g_object_get (ctrans->context, "cuda-device-id", &gpu_id, NULL); + + pool = gst_cuda_nvmm_buffer_pool_new (); + if (!pool) { + GST_ERROR_OBJECT (self, "Failed to create pool"); + return FALSE; + } + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_params (config, outcaps, + sizeof (NvBufSurface), min, max); + + gst_structure_set (config, "memtype", G_TYPE_UINT, NVBUF_MEM_DEFAULT, + "gpu-id", G_TYPE_UINT, gpu_id, "batch-size", G_TYPE_UINT, 1, NULL); + + if (!gst_buffer_pool_set_config (pool, config)) { + GST_ERROR_OBJECT (self, "Failed to set config"); + gst_object_unref (pool); + return FALSE; + } + + if (update_pool) { + gst_query_set_nth_allocation_pool (query, + 0, pool, sizeof (NvBufSurface), min, max); + } else { + gst_query_add_allocation_pool (query, + pool, sizeof (NvBufSurface), min, max); + } + + gst_object_unref (pool); + + /* Don't chain up to parent method, which will break NVMM specific + * config */ + + return TRUE; + } +#endif + else { + GST_DEBUG_OBJECT (self, "creating system pool"); + pool = gst_video_buffer_pool_new (); + } + } + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + gst_buffer_pool_config_set_params (config, outcaps, size, min, max); + gst_buffer_pool_set_config (pool, config); + + /* Get updated size by cuda buffer pool */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, NULL, &size, NULL, NULL); + gst_structure_free (config); + + if (update_pool) + gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); + else + gst_query_add_allocation_pool (query, pool, size, min, max); + + gst_object_unref (pool); + + return GST_BASE_TRANSFORM_CLASS (parent_class)->decide_allocation (trans, + query); +} + +static gboolean +gst_cuda_memory_copy_query (GstBaseTransform * trans, + GstPadDirection direction, GstQuery * query) +{ +#if defined(HAVE_NVCODEC_GST_GL) || defined(GST_CUDA_HAS_D3D) + GstCudaMemoryCopy *self = GST_CUDA_MEMORY_COPY (trans); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + { + gboolean ret; +# ifdef HAVE_NVCODEC_GST_GL + ret = gst_gl_handle_context_query (GST_ELEMENT (self), query, + self->gl_display, self->gl_context, self->other_gl_context); + if (ret) + return TRUE; +# endif +# ifdef GST_CUDA_HAS_D3D + ret = gst_d3d11_handle_context_query (GST_ELEMENT (self), query, + self->d3d11_device); + if (ret) + return TRUE; +# endif + break; + } + default: + break; + } +#endif + + return GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction, + query); +} + +static gboolean +gst_cuda_memory_copy_set_info (GstCudaBaseTransform * btrans, + GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, + GstVideoInfo * out_info) +{ + GstCudaMemoryCopy *self = GST_CUDA_MEMORY_COPY (btrans); + GstCapsFeatures *in_features; + GstCapsFeatures *out_features; + + self->in_type = GST_CUDA_BUFFER_COPY_SYSTEM; + self->out_type = GST_CUDA_BUFFER_COPY_SYSTEM; + + in_features = gst_caps_get_features (incaps, 0); + out_features = gst_caps_get_features (outcaps, 0); + if (in_features && gst_caps_features_contains (in_features, + GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY)) { + self->in_type = GST_CUDA_BUFFER_COPY_CUDA; + } + + if (out_features && gst_caps_features_contains (out_features, + GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY)) { + self->out_type = GST_CUDA_BUFFER_COPY_CUDA; + } +#ifdef HAVE_NVCODEC_GST_GL + if (in_features && gst_caps_features_contains (in_features, + GST_CAPS_FEATURE_MEMORY_GL_MEMORY)) { + self->in_type = GST_CUDA_BUFFER_COPY_GL; + } + + if (out_features && gst_caps_features_contains (out_features, + GST_CAPS_FEATURE_MEMORY_GL_MEMORY)) { + self->out_type = GST_CUDA_BUFFER_COPY_GL; + } +#endif + +#ifdef GST_CUDA_HAS_D3D + if (in_features && gst_caps_features_contains (in_features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { + self->in_type = GST_CUDA_BUFFER_COPY_D3D11; + } + + if (out_features && gst_caps_features_contains (out_features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { + self->out_type = GST_CUDA_BUFFER_COPY_D3D11; + } + + /* Clear d3d11 device, this set_info() might be called to update + * cuda context and therefore d3d11 device object should be updated as well */ + gst_clear_object (&self->d3d11_device); +#endif + +#ifdef HAVE_NVCODEC_NVMM + if (gst_cuda_nvmm_init_once ()) { + if (in_features && gst_caps_features_contains (in_features, + GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY)) { + GST_DEBUG_OBJECT (self, "Input memory type is NVMM"); + self->in_type = GST_CUDA_BUFFER_COPY_NVMM; + } + + if (out_features && gst_caps_features_contains (out_features, + GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY)) { + GST_DEBUG_OBJECT (self, "Output memory type is NVMM"); + self->out_type = GST_CUDA_BUFFER_COPY_NVMM; + } + } +#endif + + return TRUE; +} + +static GstFlowReturn +gst_cuda_memory_copy_transform (GstBaseTransform * trans, GstBuffer * inbuf, + GstBuffer * outbuf) +{ + GstCudaMemoryCopy *self = GST_CUDA_MEMORY_COPY (trans); + GstCudaBaseTransform *ctrans = GST_CUDA_BASE_TRANSFORM (trans); + GstMemory *in_mem; + GstMemory *out_mem; + GstVideoInfo *in_info, *out_info; + gboolean ret = FALSE; + GstCudaBufferCopyType in_type = GST_CUDA_BUFFER_COPY_SYSTEM; + GstCudaBufferCopyType out_type = GST_CUDA_BUFFER_COPY_SYSTEM; + gboolean use_device_copy = FALSE; +#ifdef GST_CUDA_HAS_D3D + D3D11_TEXTURE2D_DESC desc; +#endif + + in_info = &ctrans->in_info; + out_info = &ctrans->out_info; + + in_mem = gst_buffer_peek_memory (inbuf, 0); + if (!in_mem) { + GST_ERROR_OBJECT (self, "Empty input buffer"); + return GST_FLOW_ERROR; + } + + out_mem = gst_buffer_peek_memory (outbuf, 0); + if (!out_mem) { + GST_ERROR_OBJECT (self, "Empty output buffer"); + return GST_FLOW_ERROR; + } + + if (self->in_type == GST_CUDA_BUFFER_COPY_NVMM) { + in_type = GST_CUDA_BUFFER_COPY_NVMM; + use_device_copy = TRUE; + } else if (gst_is_cuda_memory (in_mem)) { + in_type = GST_CUDA_BUFFER_COPY_CUDA; + use_device_copy = TRUE; +#ifdef HAVE_NVCODEC_GST_GL + } else if (self->gl_context && gst_is_gl_memory_pbo (in_mem)) { + in_type = GST_CUDA_BUFFER_COPY_GL; +#endif +#ifdef GST_CUDA_HAS_D3D + } else if (self->d3d11_device && gst_is_d3d11_memory (in_mem) + && gst_d3d11_memory_get_texture_desc (GST_D3D11_MEMORY_CAST (in_mem), + &desc) && desc.Usage == D3D11_USAGE_DEFAULT) { + in_type = GST_CUDA_BUFFER_COPY_D3D11; +#endif + } else { + in_type = GST_CUDA_BUFFER_COPY_SYSTEM; + } + + if (self->out_type == GST_CUDA_BUFFER_COPY_NVMM) { + out_type = GST_CUDA_BUFFER_COPY_NVMM; + use_device_copy = TRUE; + } else if (gst_is_cuda_memory (out_mem)) { + out_type = GST_CUDA_BUFFER_COPY_CUDA; + use_device_copy = TRUE; +#ifdef HAVE_NVCODEC_GST_GL + } else if (self->gl_context && gst_is_gl_memory_pbo (out_mem)) { + out_type = GST_CUDA_BUFFER_COPY_GL; +#endif +#ifdef GST_CUDA_HAS_D3D + } else if (self->d3d11_device && gst_is_d3d11_memory (out_mem) + && gst_d3d11_memory_get_texture_desc (GST_D3D11_MEMORY_CAST (out_mem), + &desc) && desc.Usage == D3D11_USAGE_DEFAULT) { + out_type = GST_CUDA_BUFFER_COPY_D3D11; +#endif + } else { + out_type = GST_CUDA_BUFFER_COPY_SYSTEM; + } + + if (!use_device_copy) { + GST_TRACE_OBJECT (self, "Both in/out buffers are not CUDA"); + if (!gst_cuda_buffer_copy (outbuf, GST_CUDA_BUFFER_COPY_SYSTEM, out_info, + inbuf, GST_CUDA_BUFFER_COPY_SYSTEM, in_info, ctrans->context, + ctrans->cuda_stream)) { + return GST_FLOW_ERROR; + } + + return GST_FLOW_OK; + } + + ret = gst_cuda_buffer_copy (outbuf, out_type, out_info, inbuf, in_type, + in_info, ctrans->context, ctrans->cuda_stream); + + /* system memory <-> CUDA copy fallback if possible */ + if (!ret) { + GstCudaBufferCopyType fallback_in_type = in_type; + GstCudaBufferCopyType fallback_out_type = out_type; + + GST_LOG_OBJECT (self, + "Copy %s -> %s failed, checking whether fallback is possible", + gst_cuda_buffer_copy_type_to_string (in_type), + gst_cuda_buffer_copy_type_to_string (out_type)); + + switch (in_type) { + case GST_CUDA_BUFFER_COPY_GL: + case GST_CUDA_BUFFER_COPY_D3D11: + fallback_in_type = GST_CUDA_BUFFER_COPY_SYSTEM; + break; + default: + break; + } + + switch (out_type) { + case GST_CUDA_BUFFER_COPY_GL: + case GST_CUDA_BUFFER_COPY_D3D11: + fallback_out_type = GST_CUDA_BUFFER_COPY_SYSTEM; + break; + default: + break; + } + + if (in_type == fallback_in_type && out_type == fallback_out_type) { + GST_ERROR_OBJECT (self, "Failed to copy %s -> %s", + gst_cuda_buffer_copy_type_to_string (in_type), + gst_cuda_buffer_copy_type_to_string (out_type)); + + return GST_FLOW_ERROR; + } + + GST_LOG_OBJECT (self, "Trying %s -> %s fallback", + gst_cuda_buffer_copy_type_to_string (fallback_in_type), + gst_cuda_buffer_copy_type_to_string (fallback_out_type)); + + ret = gst_cuda_buffer_copy (outbuf, fallback_out_type, out_info, inbuf, + fallback_in_type, in_info, ctrans->context, ctrans->cuda_stream); + } + + if (ret) + return GST_FLOW_OK; + + if (in_type == GST_CUDA_BUFFER_COPY_NVMM || + out_type == GST_CUDA_BUFFER_COPY_NVMM) { + GST_ERROR_OBJECT (self, "Failed to copy NVMM memory"); + return GST_FLOW_ERROR; + } + + /* final fallback using system memory */ + ret = gst_cuda_buffer_copy (outbuf, GST_CUDA_BUFFER_COPY_SYSTEM, out_info, + inbuf, GST_CUDA_BUFFER_COPY_SYSTEM, in_info, ctrans->context, + ctrans->cuda_stream); + + if (ret) + return GST_FLOW_OK; + + GST_ERROR_OBJECT (self, "Failed to copy %s -> %s", + gst_cuda_buffer_copy_type_to_string (in_type), + gst_cuda_buffer_copy_type_to_string (out_type)); + + return GST_FLOW_ERROR; +} + +static void +gst_cuda_upload_class_init (GstCudaUploadClass * klass, gpointer data) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); + GstCudaMemoryCopyClass *copy_class = GST_CUDA_MEMORY_COPY_CLASS (klass); + GstCudaMemoryCopyClassData *cdata = (GstCudaMemoryCopyClassData *) data; + + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + cdata->sink_caps)); + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + cdata->src_caps)); + + gst_element_class_set_static_metadata (element_class, + "CUDA uploader", "Filter/Video", + "Uploads data into NVIDA GPU via CUDA APIs", + "Seungha Yang <seungha.yang@navercorp.com>"); + + trans_class->transform = GST_DEBUG_FUNCPTR (gst_cuda_memory_copy_transform); + + copy_class->uploader = TRUE; + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); +} + +static void +gst_cuda_upload_init (GstCudaUpload * self) +{ +} + +static void +gst_cuda_download_before_transform (GstBaseTransform * trans, + GstBuffer * buffer) +{ + GstCudaMemoryCopy *copy = GST_CUDA_MEMORY_COPY (trans); + gboolean old; + gboolean new = FALSE; + + GST_BASE_TRANSFORM_CLASS (parent_class)->before_transform (trans, buffer); + + old = gst_base_transform_is_passthrough (trans); + if (copy->in_type == copy->out_type || + (copy->in_type == GST_CUDA_BUFFER_COPY_CUDA && + copy->out_type == GST_CUDA_BUFFER_COPY_SYSTEM && + copy->downstream_supports_video_meta)) { + new = TRUE; + } + + if (new != old) { + GST_INFO_OBJECT (trans, "Updated passthrough: %d", new); + gst_base_transform_reconfigure_src (trans); + gst_base_transform_set_passthrough (trans, new); + } +} + +static void +gst_cuda_download_class_init (GstCudaDownloadClass * klass, gpointer data) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); + GstCudaMemoryCopyClass *copy_class = GST_CUDA_MEMORY_COPY_CLASS (klass); + GstCudaMemoryCopyClassData *cdata = (GstCudaMemoryCopyClassData *) data; + + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + cdata->sink_caps)); + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + cdata->src_caps)); + + gst_element_class_set_static_metadata (element_class, + "CUDA downloader", "Filter/Video", + "Downloads data from NVIDA GPU via CUDA APIs", + "Seungha Yang <seungha.yang@navercorp.com>"); + + trans_class->before_transform = + GST_DEBUG_FUNCPTR (gst_cuda_download_before_transform); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_cuda_memory_copy_transform); + + copy_class->uploader = FALSE; + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); +} + +static void +gst_cuda_download_init (GstCudaDownload * self) +{ +} + +void +gst_cuda_memory_copy_register (GstPlugin * plugin, guint rank) +{ + GType upload_type, download_type; + GTypeInfo upload_type_info = { + sizeof (GstCudaUploadClass), + NULL, + NULL, + (GClassInitFunc) gst_cuda_upload_class_init, + NULL, + NULL, + sizeof (GstCudaUpload), + 0, + (GInstanceInitFunc) gst_cuda_upload_init, + }; + GTypeInfo download_type_info = { + sizeof (GstCudaDownloadClass), + NULL, + NULL, + (GClassInitFunc) gst_cuda_download_class_init, + NULL, + NULL, + sizeof (GstCudaDownload), + 0, + (GInstanceInitFunc) gst_cuda_download_init, + }; + GstCaps *sys_caps; + GstCaps *cuda_caps; +#ifdef HAVE_NVCODEC_NVMM + GstCaps *nvmm_caps = NULL; +#endif +#ifdef HAVE_NVCODEC_GST_GL + GstCaps *gl_caps; +#endif +#ifdef GST_CUDA_HAS_D3D + GstCaps *d3d11_caps; +#endif + GstCaps *upload_sink_caps; + GstCaps *upload_src_caps; + GstCaps *download_sink_caps; + GstCaps *download_src_caps; + GstCudaMemoryCopyClassData *upload_cdata; + GstCudaMemoryCopyClassData *download_cdata; + + GST_DEBUG_CATEGORY_INIT (gst_cuda_memory_copy_debug, + "cudamemorycopy", 0, "cudamemorycopy"); + + sys_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE (GST_CUDA_FORMATS)); + cuda_caps = + gst_caps_from_string (GST_VIDEO_CAPS_MAKE_WITH_FEATURES + (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY, GST_CUDA_FORMATS)); +#ifdef HAVE_NVCODEC_NVMM + if (gst_cuda_nvmm_init_once ()) { + nvmm_caps = + gst_caps_from_string (GST_VIDEO_CAPS_MAKE_WITH_FEATURES + (GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY, GST_CUDA_NVMM_FORMATS)); + } +#endif +#ifdef HAVE_NVCODEC_GST_GL + gl_caps = + gst_caps_from_string (GST_VIDEO_CAPS_MAKE_WITH_FEATURES + (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, GST_CUDA_GL_FORMATS)); +#endif +#ifdef GST_CUDA_HAS_D3D + d3d11_caps = + gst_caps_from_string (GST_VIDEO_CAPS_MAKE_WITH_FEATURES + (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, GST_CUDA_D3D11_FORMATS)); +#endif + + upload_sink_caps = gst_caps_copy (sys_caps); +#ifdef HAVE_NVCODEC_GST_GL + upload_sink_caps = gst_caps_merge (upload_sink_caps, gst_caps_copy (gl_caps)); +#endif +#ifdef GST_CUDA_HAS_D3D + upload_sink_caps = + gst_caps_merge (upload_sink_caps, gst_caps_copy (d3d11_caps)); +#endif +#ifdef HAVE_NVCODEC_NVMM + if (nvmm_caps) { + upload_sink_caps = gst_caps_merge (upload_sink_caps, + gst_caps_copy (nvmm_caps)); + } +#endif + upload_sink_caps = + gst_caps_merge (upload_sink_caps, gst_caps_copy (cuda_caps)); + + upload_src_caps = gst_caps_copy (cuda_caps); +#ifdef HAVE_NVCODEC_NVMM + if (nvmm_caps) { + upload_src_caps = gst_caps_merge (upload_src_caps, + gst_caps_copy (nvmm_caps)); + } +#endif + upload_src_caps = gst_caps_merge (upload_src_caps, gst_caps_copy (sys_caps)); + + download_sink_caps = gst_caps_copy (cuda_caps); +#ifdef HAVE_NVCODEC_NVMM + if (nvmm_caps) { + download_sink_caps = gst_caps_merge (download_sink_caps, + gst_caps_copy (nvmm_caps)); + } +#endif + download_sink_caps = + gst_caps_merge (download_sink_caps, gst_caps_copy (sys_caps)); + + download_src_caps = sys_caps; +#ifdef HAVE_NVCODEC_GST_GL + download_src_caps = gst_caps_merge (download_src_caps, gl_caps); +#endif +#ifdef GST_CUDA_HAS_D3D + download_src_caps = gst_caps_merge (download_src_caps, d3d11_caps); +#endif +#ifdef HAVE_NVCODEC_NVMM + if (nvmm_caps) { + download_src_caps = gst_caps_merge (download_src_caps, nvmm_caps); + } +#endif + download_src_caps = gst_caps_merge (download_src_caps, cuda_caps); + + GST_MINI_OBJECT_FLAG_SET (upload_sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (upload_src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GST_MINI_OBJECT_FLAG_SET (download_sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (download_src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + upload_cdata = g_new0 (GstCudaMemoryCopyClassData, 1); + upload_cdata->sink_caps = upload_sink_caps; + upload_cdata->src_caps = upload_src_caps; + upload_type_info.class_data = upload_cdata; + + download_cdata = g_new0 (GstCudaMemoryCopyClassData, 1); + download_cdata->sink_caps = download_sink_caps; + download_cdata->src_caps = download_src_caps; + download_type_info.class_data = download_cdata; + + upload_type = g_type_register_static (GST_TYPE_CUDA_MEMORY_COPY, + "GstCudaUpload", &upload_type_info, 0); + download_type = g_type_register_static (GST_TYPE_CUDA_MEMORY_COPY, + "GstCudaDownload", &download_type_info, 0); + + if (!gst_element_register (plugin, "cudaupload", rank, upload_type)) + GST_WARNING ("Failed to register cudaupload element"); + + if (!gst_element_register (plugin, "cudadownload", rank, download_type)) + GST_WARNING ("Failed to register cudadownload element"); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcudamemorycopy.h
Added
@@ -0,0 +1,50 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include "gstcudabasetransform.h" + +G_BEGIN_DECLS + +#define GST_TYPE_CUDA_MEMORY_COPY (gst_cuda_memory_copy_get_type()) +#define GST_CUDA_MEMORY_COPY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CUDA_MEMORY_COPY,GstCudaMemoryCopy)) +#define GST_CUDA_MEMORY_COPY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_CUDA_MEMORY_COPY,GstCudaMemoryCopyClass)) +#define GST_CUDA_MEMORY_COPY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_CUDA_MEMORY_COPY,GstCudaMemoryCopyClass)) +#define GST_IS_CUDA_MEMORY_COPY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CUDA_MEMORY_COPY)) +#define GST_IS_CUDA_MEMORY_COPY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_CUDA_MEMORY_COPY)) + +typedef struct _GstCudaMemoryCopy GstCudaMemoryCopy; +typedef struct _GstCudaMemoryCopyClass GstCudaMemoryCopyClass; + +struct _GstCudaMemoryCopyClass +{ + GstCudaBaseTransform parent_class; + + gboolean uploader; +}; + +GType gst_cuda_memory_copy_get_type (void); + +void gst_cuda_memory_copy_register (GstPlugin * plugin, + guint rank); + +G_END_DECLS +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcudanvmm.c
Added
@@ -0,0 +1,101 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstcudanvmm.h" +#include <gmodule.h> +#include <string.h> + +GST_DEBUG_CATEGORY_EXTERN (gst_cuda_nvmm_debug); +#define GST_CAT_DEFAULT gst_cuda_nvmm_debug + +#define LOAD_SYMBOL(name) G_STMT_START { \ + if (!g_module_symbol (module, G_STRINGIFY (name), (gpointer *) &vtable->name)) { \ + GST_ERROR ("Failed to load symbol '%s', %s", G_STRINGIFY (name), g_module_error()); \ + goto error; \ + } \ +} G_STMT_END; + +/* *INDENT-OFF* */ +typedef struct _GstCudaNvmmVTable +{ + gboolean loaded; + + GstBufferPool * (*gst_nvds_buffer_pool_new) (void); + +} GstCudaNvmmVTable; +/* *INDENT-ON* */ + +static GstCudaNvmmVTable gst_cuda_nvmm_vtable = { 0, }; + +static gboolean +gst_cuda_nvmm_load_library (void) +{ + GModule *module; + GstCudaNvmmVTable *vtable; + + if (gst_cuda_nvmm_vtable.loaded) + return TRUE; + + module = g_module_open ("libnvdsbufferpool.so", G_MODULE_BIND_LAZY); + if (!module) { + GST_INFO ("libnvdsbufferpool library is unavailable"); + return FALSE; + } + + vtable = &gst_cuda_nvmm_vtable; + + LOAD_SYMBOL (gst_nvds_buffer_pool_new); + + vtable->loaded = TRUE; + return TRUE; + +error: + g_module_close (module); + + return FALSE; +} + +gboolean +gst_cuda_nvmm_init_once (void) +{ + static gboolean loaded = FALSE; + static gsize load_once = 0; + + if (g_once_init_enter (&load_once)) { + loaded = gst_cuda_nvmm_load_library (); + g_once_init_leave (&load_once, 1); + } + + return loaded; +} + +GstBufferPool * +gst_cuda_nvmm_buffer_pool_new (void) +{ + if (!gst_cuda_nvmm_init_once ()) + return NULL; + + g_assert (gst_cuda_nvmm_vtable.gst_nvds_buffer_pool_new != NULL); + + return gst_cuda_nvmm_vtable.gst_nvds_buffer_pool_new (); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcudanvmm.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <nvbufsurface.h> + +G_BEGIN_DECLS + +#define GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY "memory:NVMM" + +gboolean gst_cuda_nvmm_init_once (void); + +GstBufferPool * gst_cuda_nvmm_buffer_pool_new (void); + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcuvidloader.c -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcuvidloader.c
Changed
@@ -136,7 +136,10 @@ gboolean gst_cuvid_can_get_decoder_caps (void) { - return ! !gst_cuvid_vtable.CuvidGetDecoderCaps; + if (gst_cuvid_vtable.CuvidGetDecoderCaps) + return TRUE; + + return FALSE; } CUresult CUDAAPI
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstcuvidloader.h -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstcuvidloader.h
Changed
@@ -21,7 +21,7 @@ #define __GST_CUVID_LOADER_H__ #include <gst/gst.h> -#include "stub/cuda.h" +#include "cuda.h" #include "nvcuvid.h" G_BEGIN_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvav1dec.c
Added
@@ -0,0 +1,951 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-nvav1dec + * @title: nvav1dec + * + * GstCodecs based NVIDIA AV1 video decoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 filesrc location=/path/to/av1/file ! parsebin ! nvav1dec ! videoconvert ! autovideosink + * ``` + * + * Since: 1.22 + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/cuda/gstcudautils.h> + +#include "gstnvav1dec.h" +#include "gstnvdecoder.h" + +#include <string.h> + +GST_DEBUG_CATEGORY_STATIC (gst_nv_av1_dec_debug); +#define GST_CAT_DEFAULT gst_nv_av1_dec_debug + +typedef struct _GstNvAV1Dec +{ + GstAV1Decoder parent; + + GstCudaContext *context; + GstNvDecoder *decoder; + + GstAV1SequenceHeaderOBU seq_hdr; + CUVIDPICPARAMS params; + + /* slice buffer which will be passed to CUVIDPICPARAMS::pBitstreamData */ + guint8 *bitstream_buffer; + /* allocated memory size of bitstream_buffer */ + gsize bitstream_buffer_alloc_size; + /* current offset of bitstream_buffer (per frame) */ + gsize bitstream_buffer_offset; + + guint *tile_offsets; + guint tile_offsets_alloc_len; + guint num_tiles; + + guint max_width; + guint max_height; + guint bitdepth; + guint8 film_grain_params_present; +} GstNvAV1Dec; + +typedef struct _GstNvAV1DecClass +{ + GstAV1DecoderClass parent_class; + guint cuda_device_id; +} GstNvAV1DecClass; + +enum +{ + PROP_0, + PROP_CUDA_DEVICE_ID, +}; + +static GTypeClass *parent_class = NULL; + +#define GST_NV_AV1_DEC(object) ((GstNvAV1Dec *) (object)) +#define GST_NV_AV1_DEC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstNvAV1DecClass)) + +static void gst_nv_av1_dec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void gst_nv_av1_dec_set_context (GstElement * element, + GstContext * context); +static gboolean gst_nv_av1_dec_open (GstVideoDecoder * decoder); +static gboolean gst_nv_av1_dec_close (GstVideoDecoder * decoder); +static gboolean gst_nv_av1_dec_negotiate (GstVideoDecoder * decoder); +static gboolean gst_nv_av1_dec_decide_allocation (GstVideoDecoder * + decoder, GstQuery * query); +static gboolean gst_nv_av1_dec_src_query (GstVideoDecoder * decoder, + GstQuery * query); + +static GstFlowReturn gst_nv_av1_dec_new_sequence (GstAV1Decoder * decoder, + const GstAV1SequenceHeaderOBU * seq_hdr, gint max_dpb_size); +static GstFlowReturn gst_nv_av1_dec_new_picture (GstAV1Decoder * decoder, + GstVideoCodecFrame * frame, GstAV1Picture * picture); +static GstAV1Picture *gst_nv_av1_dec_duplicate_picture (GstAV1Decoder * + decoder, GstVideoCodecFrame * frame, GstAV1Picture * picture); +static GstFlowReturn gst_nv_av1_dec_start_picture (GstAV1Decoder * decoder, + GstAV1Picture * picture, GstAV1Dpb * dpb); +static GstFlowReturn gst_nv_av1_dec_decode_tile (GstAV1Decoder * decoder, + GstAV1Picture * picture, GstAV1Tile * tile); +static GstFlowReturn gst_nv_av1_dec_end_picture (GstAV1Decoder * decoder, + GstAV1Picture * picture); +static GstFlowReturn gst_nv_av1_dec_output_picture (GstAV1Decoder * + decoder, GstVideoCodecFrame * frame, GstAV1Picture * picture); +static guint gst_nv_av1_dec_get_preferred_output_delay (GstAV1Decoder * decoder, + gboolean is_live); + +static void +gst_nv_av1_dec_class_init (GstNvAV1DecClass * klass, + GstNvDecoderClassData * cdata) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_CLASS (klass); + GstAV1DecoderClass *av1decoder_class = GST_AV1_DECODER_CLASS (klass); + + object_class->get_property = gst_nv_av1_dec_get_property; + + g_object_class_install_property (object_class, PROP_CUDA_DEVICE_ID, + g_param_spec_uint ("cuda-device-id", "CUDA device id", + "Assigned CUDA device id", 0, G_MAXINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + element_class->set_context = GST_DEBUG_FUNCPTR (gst_nv_av1_dec_set_context); + + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + gst_element_class_set_static_metadata (element_class, "NVDEC AV1 Decoder", + "Codec/Decoder/Video/Hardware", + "NVIDIA AV1 video decoder", "Seungha Yang <seungha@centricular.com>"); + + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + cdata->sink_caps)); + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + cdata->src_caps)); + + decoder_class->open = GST_DEBUG_FUNCPTR (gst_nv_av1_dec_open); + decoder_class->close = GST_DEBUG_FUNCPTR (gst_nv_av1_dec_close); + decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_nv_av1_dec_negotiate); + decoder_class->decide_allocation = + GST_DEBUG_FUNCPTR (gst_nv_av1_dec_decide_allocation); + decoder_class->src_query = GST_DEBUG_FUNCPTR (gst_nv_av1_dec_src_query); + + av1decoder_class->new_sequence = + GST_DEBUG_FUNCPTR (gst_nv_av1_dec_new_sequence); + av1decoder_class->new_picture = + GST_DEBUG_FUNCPTR (gst_nv_av1_dec_new_picture); + av1decoder_class->duplicate_picture = + GST_DEBUG_FUNCPTR (gst_nv_av1_dec_duplicate_picture); + av1decoder_class->start_picture = + GST_DEBUG_FUNCPTR (gst_nv_av1_dec_start_picture); + av1decoder_class->decode_tile = + GST_DEBUG_FUNCPTR (gst_nv_av1_dec_decode_tile); + av1decoder_class->end_picture = + GST_DEBUG_FUNCPTR (gst_nv_av1_dec_end_picture); + av1decoder_class->output_picture = + GST_DEBUG_FUNCPTR (gst_nv_av1_dec_output_picture); + av1decoder_class->get_preferred_output_delay = + GST_DEBUG_FUNCPTR (gst_nv_av1_dec_get_preferred_output_delay); + + klass->cuda_device_id = cdata->cuda_device_id; + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); +} + +static void +gst_nv_av1_dec_init (GstNvAV1Dec * self) +{ +} + +static void +gst_nv_av1_dec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstNvAV1DecClass *klass = GST_NV_AV1_DEC_GET_CLASS (object); + + switch (prop_id) { + case PROP_CUDA_DEVICE_ID: + g_value_set_uint (value, klass->cuda_device_id); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_nv_av1_dec_set_context (GstElement * element, GstContext * context) +{ + GstNvAV1Dec *self = GST_NV_AV1_DEC (element); + GstNvAV1DecClass *klass = GST_NV_AV1_DEC_GET_CLASS (self); + + GST_DEBUG_OBJECT (self, "set context %s", + gst_context_get_context_type (context)); + + if (gst_cuda_handle_set_context (element, context, klass->cuda_device_id, + &self->context)) { + goto done; + } + + if (self->decoder) + gst_nv_decoder_handle_set_context (self->decoder, element, context); + +done: + GST_ELEMENT_CLASS (parent_class)->set_context (element, context); +} + +static gboolean +gst_nv_av1_dec_open (GstVideoDecoder * decoder) +{ + GstNvAV1Dec *self = GST_NV_AV1_DEC (decoder); + GstNvAV1DecClass *klass = GST_NV_AV1_DEC_GET_CLASS (self); + + if (!gst_cuda_ensure_element_context (GST_ELEMENT (self), + klass->cuda_device_id, &self->context)) { + GST_ERROR_OBJECT (self, "Required element data is unavailable"); + return FALSE; + } + + self->decoder = gst_nv_decoder_new (self->context); + if (!self->decoder) { + GST_ERROR_OBJECT (self, "Failed to create decoder object"); + gst_clear_object (&self->context); + + return FALSE; + } + + return TRUE; +} + +static void +gst_nv_av1_dec_reset_bitstream_params (GstNvAV1Dec * self) +{ + self->bitstream_buffer_offset = 0; + self->num_tiles = 0; + + self->params.nBitstreamDataLen = 0; + self->params.pBitstreamData = NULL; + self->params.nNumSlices = 0; + self->params.pSliceDataOffsets = NULL; +} + +static gboolean +gst_nv_av1_dec_close (GstVideoDecoder * decoder) +{ + GstNvAV1Dec *self = GST_NV_AV1_DEC (decoder); + + gst_clear_object (&self->decoder); + gst_clear_object (&self->context); + + gst_nv_av1_dec_reset_bitstream_params (self); + + g_free (self->bitstream_buffer); + self->bitstream_buffer = NULL; + + g_free (self->tile_offsets); + self->tile_offsets = NULL; + + self->bitstream_buffer_alloc_size = 0; + self->tile_offsets_alloc_len = 0; + + return TRUE; +} + +static gboolean +gst_nv_av1_dec_negotiate (GstVideoDecoder * decoder) +{ + GstNvAV1Dec *self = GST_NV_AV1_DEC (decoder); + GstAV1Decoder *av1dec = GST_AV1_DECODER (decoder); + + GST_DEBUG_OBJECT (self, "negotiate"); + + gst_nv_decoder_negotiate (self->decoder, decoder, av1dec->input_state); + + return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); +} + +static gboolean +gst_nv_av1_dec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query) +{ + GstNvAV1Dec *self = GST_NV_AV1_DEC (decoder); + + if (!gst_nv_decoder_decide_allocation (self->decoder, decoder, query)) { + GST_WARNING_OBJECT (self, "Failed to handle decide allocation"); + return FALSE; + } + + return GST_VIDEO_DECODER_CLASS (parent_class)->decide_allocation + (decoder, query); +} + +static gboolean +gst_nv_av1_dec_src_query (GstVideoDecoder * decoder, GstQuery * query) +{ + GstNvAV1Dec *self = GST_NV_AV1_DEC (decoder); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + if (gst_cuda_handle_context_query (GST_ELEMENT (decoder), query, + self->context)) { + return TRUE; + } else if (self->decoder && + gst_nv_decoder_handle_context_query (self->decoder, decoder, query)) { + return TRUE; + } + break; + default: + break; + } + + return GST_VIDEO_DECODER_CLASS (parent_class)->src_query (decoder, query); +} + +static GstFlowReturn +gst_nv_av1_dec_new_sequence (GstAV1Decoder * decoder, + const GstAV1SequenceHeaderOBU * seq_hdr, gint max_dpb_size) +{ + GstNvAV1Dec *self = GST_NV_AV1_DEC (decoder); + gboolean modified = FALSE; + guint max_width, max_height; + + GST_LOG_OBJECT (self, "new sequence"); + + if (seq_hdr->seq_profile != GST_AV1_PROFILE_0) { + GST_WARNING_OBJECT (self, "Unsupported profile %d", seq_hdr->seq_profile); + return GST_FLOW_NOT_NEGOTIATED; + } + + if (seq_hdr->num_planes != 3) { + GST_WARNING_OBJECT (self, "Monochrome is not supported"); + return GST_FLOW_NOT_NEGOTIATED; + } + + self->seq_hdr = *seq_hdr; + + if (self->bitdepth != seq_hdr->bit_depth) { + GST_INFO_OBJECT (self, "Bitdepth changed %d -> %d", self->bitdepth, + seq_hdr->bit_depth); + self->bitdepth = seq_hdr->bit_depth; + modified = TRUE; + } + + max_width = seq_hdr->max_frame_width_minus_1 + 1; + max_height = seq_hdr->max_frame_height_minus_1 + 1; + + if (self->max_width != max_width || self->max_height != max_height) { + GST_INFO_OBJECT (self, "Resolution changed %dx%d -> %dx%d", + self->max_width, self->max_height, max_width, max_height); + self->max_width = max_width; + self->max_height = max_height; + modified = TRUE; + } + + if (self->film_grain_params_present != seq_hdr->film_grain_params_present) { + GST_INFO_OBJECT (self, "Film grain present changed %d -> %d", + self->film_grain_params_present, seq_hdr->film_grain_params_present); + self->film_grain_params_present = seq_hdr->film_grain_params_present; + modified = TRUE; + } + + if (modified || !gst_nv_decoder_is_configured (self->decoder)) { + GstVideoInfo info; + GstVideoFormat out_format = GST_VIDEO_FORMAT_UNKNOWN; + + if (self->bitdepth == 8) { + out_format = GST_VIDEO_FORMAT_NV12; + } else if (self->bitdepth == 10) { + out_format = GST_VIDEO_FORMAT_P010_10LE; + } else { + GST_WARNING_OBJECT (self, "Invalid bit-depth %d", seq_hdr->bit_depth); + return GST_FLOW_NOT_NEGOTIATED; + } + + gst_video_info_set_format (&info, + out_format, self->max_width, self->max_height); + + if (!gst_nv_decoder_configure (self->decoder, cudaVideoCodec_AV1, + &info, self->max_width, self->max_height, self->bitdepth, + max_dpb_size, self->film_grain_params_present ? TRUE : FALSE)) { + GST_ERROR_OBJECT (self, "Failed to create decoder"); + return GST_FLOW_NOT_NEGOTIATED; + } + + if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { + GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); + return GST_FLOW_NOT_NEGOTIATED; + } + } + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_nv_av1_dec_new_picture (GstAV1Decoder * decoder, + GstVideoCodecFrame * frame, GstAV1Picture * picture) +{ + GstNvAV1Dec *self = GST_NV_AV1_DEC (decoder); + GstNvDecoderFrame *nv_frame; + + nv_frame = gst_nv_decoder_new_frame (self->decoder); + if (!nv_frame) { + GST_ERROR_OBJECT (self, "No available decoder frame"); + return GST_FLOW_ERROR; + } + + GST_LOG_OBJECT (self, + "New decoder frame %p (index %d)", nv_frame, nv_frame->index); + + gst_av1_picture_set_user_data (picture, + nv_frame, (GDestroyNotify) gst_nv_decoder_frame_unref); + + return GST_FLOW_OK; +} + +static GstNvDecoderFrame * +gst_nv_av1_dec_get_decoder_frame_from_picture (GstNvAV1Dec * self, + GstAV1Picture * picture) +{ + GstNvDecoderFrame *frame; + + frame = (GstNvDecoderFrame *) gst_av1_picture_get_user_data (picture); + + if (!frame) + GST_DEBUG_OBJECT (self, "current picture does not have decoder frame"); + + return frame; +} + +static GstAV1Picture * +gst_nv_av1_dec_duplicate_picture (GstAV1Decoder * decoder, + GstVideoCodecFrame * frame, GstAV1Picture * picture) +{ + GstNvAV1Dec *self = GST_NV_AV1_DEC (decoder); + GstNvDecoderFrame *nv_frame; + GstAV1Picture *new_picture; + + nv_frame = gst_nv_av1_dec_get_decoder_frame_from_picture (self, picture); + + if (!nv_frame) { + GST_ERROR_OBJECT (self, "Parent picture does not have decoder frame"); + return NULL; + } + + new_picture = gst_av1_picture_new (); + new_picture->frame_hdr = picture->frame_hdr; + + gst_av1_picture_set_user_data (new_picture, + gst_nv_decoder_frame_ref (nv_frame), + (GDestroyNotify) gst_nv_decoder_frame_unref); + + return new_picture; +} + +static inline guint8 +gst_nv_av1_dec_get_lr_unit_size (guint size) +{ + switch (size) { + case 32: + return 0; + case 64: + return 1; + case 128: + return 2; + case 256: + return 3; + default: + break; + } + + return 3; +} + +static GstFlowReturn +gst_nv_av1_dec_start_picture (GstAV1Decoder * decoder, GstAV1Picture * picture, + GstAV1Dpb * dpb) +{ + GstNvAV1Dec *self = GST_NV_AV1_DEC (decoder); + CUVIDPICPARAMS *params = &self->params; + CUVIDAV1PICPARAMS *av1_params = ¶ms->CodecSpecific.av1; + const GstAV1SequenceHeaderOBU *seq_hdr = &self->seq_hdr; + const GstAV1FrameHeaderOBU *frame_hdr = &picture->frame_hdr; + const GstAV1GlobalMotionParams *gmp = &frame_hdr->global_motion_params; + const GstAV1QuantizationParams *qp = &frame_hdr->quantization_params; + const GstAV1TileInfo *ti = &frame_hdr->tile_info; + const GstAV1CDEFParams *cp = &frame_hdr->cdef_params; + const GstAV1SegmenationParams *sp = &frame_hdr->segmentation_params; + const GstAV1LoopFilterParams *lp = &frame_hdr->loop_filter_params; + const GstAV1LoopRestorationParams *lrp = &frame_hdr->loop_restoration_params; + const GstAV1FilmGrainParams *fgp = &frame_hdr->film_grain_params; + GstNvDecoderFrame *frame; + GstNvDecoderFrame *other_frame; + GstAV1Picture *other_pic; + guint i, j; + + frame = gst_nv_av1_dec_get_decoder_frame_from_picture (self, picture); + if (!frame) { + GST_ERROR_OBJECT (self, "Decoder frame is unavailable"); + return GST_FLOW_ERROR; + } + + memset (params, 0, sizeof (CUVIDPICPARAMS)); + + params->PicWidthInMbs = GST_ROUND_UP_16 (frame_hdr->frame_width) >> 4; + params->FrameHeightInMbs = GST_ROUND_UP_16 (frame_hdr->frame_height) >> 4; + params->CurrPicIdx = frame->index; + params->intra_pic_flag = frame_hdr->frame_is_intra; + + av1_params->width = frame_hdr->frame_width; + av1_params->height = frame_hdr->frame_height; + av1_params->frame_offset = frame_hdr->order_hint; + av1_params->decodePicIdx = frame->decode_frame_index; + + /* sequence header */ + av1_params->profile = seq_hdr->seq_profile; + av1_params->use_128x128_superblock = seq_hdr->use_128x128_superblock; + av1_params->subsampling_x = seq_hdr->color_config.subsampling_x; + av1_params->subsampling_y = seq_hdr->color_config.subsampling_y; + av1_params->mono_chrome = seq_hdr->color_config.mono_chrome; + av1_params->bit_depth_minus8 = seq_hdr->bit_depth - 8; + av1_params->enable_filter_intra = seq_hdr->enable_filter_intra; + av1_params->enable_intra_edge_filter = seq_hdr->enable_intra_edge_filter; + av1_params->enable_interintra_compound = seq_hdr->enable_interintra_compound; + av1_params->enable_masked_compound = seq_hdr->enable_masked_compound; + av1_params->enable_dual_filter = seq_hdr->enable_dual_filter; + av1_params->enable_order_hint = seq_hdr->enable_order_hint; + av1_params->order_hint_bits_minus1 = seq_hdr->order_hint_bits_minus_1; + av1_params->enable_jnt_comp = seq_hdr->enable_jnt_comp; + av1_params->enable_superres = seq_hdr->enable_superres; + av1_params->enable_cdef = seq_hdr->enable_cdef; + av1_params->enable_restoration = seq_hdr->enable_restoration; + av1_params->enable_fgs = seq_hdr->film_grain_params_present; + + /* frame header */ + av1_params->frame_type = frame_hdr->frame_type; + av1_params->show_frame = frame_hdr->show_frame; + av1_params->disable_cdf_update = frame_hdr->disable_cdf_update; + av1_params->allow_screen_content_tools = + frame_hdr->allow_screen_content_tools; + if (frame_hdr->force_integer_mv || frame_hdr->frame_is_intra) + av1_params->force_integer_mv = 1; + else + av1_params->force_integer_mv = 0; + if (frame_hdr->use_superres) { + av1_params->coded_denom = + frame_hdr->superres_denom - GST_AV1_SUPERRES_DENOM_MIN; + } else { + av1_params->coded_denom = 0; + } + av1_params->allow_intrabc = frame_hdr->allow_intrabc; + av1_params->allow_high_precision_mv = frame_hdr->allow_high_precision_mv; + av1_params->interp_filter = frame_hdr->interpolation_filter; + av1_params->switchable_motion_mode = frame_hdr->is_motion_mode_switchable; + av1_params->use_ref_frame_mvs = frame_hdr->use_ref_frame_mvs; + av1_params->disable_frame_end_update_cdf = + frame_hdr->disable_frame_end_update_cdf; + av1_params->delta_q_present = qp->delta_q_present; + av1_params->delta_q_res = qp->delta_q_res; + av1_params->using_qmatrix = qp->using_qmatrix; + av1_params->coded_lossless = frame_hdr->coded_lossless; + av1_params->use_superres = frame_hdr->use_superres; + av1_params->tx_mode = frame_hdr->tx_mode; + av1_params->reference_mode = frame_hdr->reference_select; + av1_params->allow_warped_motion = frame_hdr->allow_warped_motion; + av1_params->reduced_tx_set = frame_hdr->reduced_tx_set; + av1_params->skip_mode = frame_hdr->skip_mode_present; + + /* tiling info */ + av1_params->num_tile_cols = ti->tile_cols; + av1_params->num_tile_rows = ti->tile_rows; + av1_params->context_update_tile_id = ti->context_update_tile_id; + for (i = 0; i < ti->tile_cols; i++) + av1_params->tile_widthsi = ti->width_in_sbs_minus_1i + 1; + + for (i = 0; i < ti->tile_rows; i++) + av1_params->tile_heightsi = ti->height_in_sbs_minus_1i + 1; + + /* CDEF */ + av1_params->cdef_damping_minus_3 = cp->cdef_damping - 3; + av1_params->cdef_bits = cp->cdef_bits; + for (i = 0; i < GST_AV1_CDEF_MAX; i++) { + guint8 primary; + guint8 secondary; + + primary = cp->cdef_y_pri_strengthi; + secondary = cp->cdef_y_sec_strengthi; + if (secondary == 4) + secondary--; + + av1_params->cdef_y_strengthi = (primary & 0x0f) | (secondary << 4); + + primary = cp->cdef_uv_pri_strengthi; + secondary = cp->cdef_uv_sec_strengthi; + if (secondary == 4) + secondary--; + + av1_params->cdef_uv_strengthi = (primary & 0x0f) | (secondary << 4); + } + + /* SkipModeFrames */ + if (frame_hdr->skip_mode_present) { + av1_params->SkipModeFrame0 = frame_hdr->skip_mode_frame0; + av1_params->SkipModeFrame1 = frame_hdr->skip_mode_frame1; + } + + /* qp information */ + av1_params->base_qindex = qp->base_q_idx; + av1_params->qp_y_dc_delta_q = qp->delta_q_y_dc; + av1_params->qp_u_dc_delta_q = qp->delta_q_u_dc; + av1_params->qp_u_ac_delta_q = qp->delta_q_u_ac; + av1_params->qp_v_dc_delta_q = qp->delta_q_v_dc; + av1_params->qp_v_ac_delta_q = qp->delta_q_v_ac; + av1_params->qm_y = qp->qm_y; + av1_params->qm_u = qp->qm_u; + av1_params->qm_v = qp->qm_v; + + /* segmentation */ + av1_params->segmentation_enabled = sp->segmentation_enabled; + av1_params->segmentation_update_map = sp->segmentation_update_map; + av1_params->segmentation_update_data = sp->segmentation_update_data; + av1_params->segmentation_temporal_update = sp->segmentation_temporal_update; + for (i = 0; i < GST_AV1_MAX_SEGMENTS; i++) { + for (j = 0; j < GST_AV1_SEG_LVL_MAX; j++) { + av1_params->segmentation_feature_dataij = sp->feature_dataij; + av1_params->segmentation_feature_maski |= + sp->feature_enabledij << j; + } + } + + /* loopfilter */ + av1_params->loop_filter_level0 = lp->loop_filter_level0; + av1_params->loop_filter_level1 = lp->loop_filter_level1; + av1_params->loop_filter_level_u = lp->loop_filter_level2; + av1_params->loop_filter_level_v = lp->loop_filter_level3; + av1_params->loop_filter_sharpness = lp->loop_filter_sharpness; + for (i = 0; i < GST_AV1_TOTAL_REFS_PER_FRAME; i++) { + av1_params->loop_filter_ref_deltasi = lp->loop_filter_ref_deltasi; + } + av1_params->loop_filter_mode_deltas0 = lp->loop_filter_mode_deltas0; + av1_params->loop_filter_mode_deltas1 = lp->loop_filter_mode_deltas1; + av1_params->loop_filter_delta_enabled = lp->loop_filter_delta_enabled; + av1_params->loop_filter_delta_update = lp->loop_filter_delta_update; + av1_params->delta_lf_present = lp->delta_lf_present; + av1_params->delta_lf_res = lp->delta_lf_res; + av1_params->delta_lf_multi = lp->delta_lf_multi; + + /* restoration */ + for (i = 0; i < 3; i++) { + av1_params->lr_unit_sizei = + gst_nv_av1_dec_get_lr_unit_size (lrp->loop_restoration_sizei); + } + av1_params->lr_type0 = lrp->frame_restoration_type0; + av1_params->lr_type1 = lrp->frame_restoration_type1; + av1_params->lr_type2 = lrp->frame_restoration_type2; + + /* reference frames */ + for (i = 0; i < GST_AV1_TOTAL_REFS_PER_FRAME; i++) { + guint8 ref_idx = 0xff; + + other_pic = dpb->pic_listi; + if (other_pic) { + other_frame = + gst_nv_av1_dec_get_decoder_frame_from_picture (self, other_pic); + if (!other_frame) { + GST_ERROR_OBJECT (self, "reference frame is unavailable"); + return GST_FLOW_ERROR; + } + + ref_idx = other_frame->decode_frame_index; + } + + av1_params->ref_frame_mapi = ref_idx; + } + + if (frame_hdr->primary_ref_frame == GST_AV1_PRIMARY_REF_NONE) { + av1_params->primary_ref_frame = 0xff; + } else { + guint8 primary_ref_idx; + + g_assert (frame_hdr->primary_ref_frame < 8); + + primary_ref_idx = frame_hdr->ref_frame_idxframe_hdr->primary_ref_frame; + av1_params->primary_ref_frame = av1_params->ref_frame_mapprimary_ref_idx; + } + av1_params->temporal_layer_id = picture->temporal_id; + av1_params->spatial_layer_id = picture->spatial_id; + + /* ref frame list and global motion */ + for (i = 0; i < GST_AV1_REFS_PER_FRAME; i++) { + gint8 ref_idx = frame_hdr->ref_frame_idxi; + + other_pic = NULL; + + if (ref_idx >= 0) + other_pic = dpb->pic_listref_idx; + + if (other_pic) { + other_frame = + gst_nv_av1_dec_get_decoder_frame_from_picture (self, other_pic); + + av1_params->ref_framei.index = other_frame->decode_frame_index; + av1_params->ref_framei.width = other_pic->frame_hdr.frame_width; + av1_params->ref_framei.height = other_pic->frame_hdr.frame_height; + } else { + av1_params->ref_framei.index = 0xff; + } + + av1_params->global_motioni.invalid = gmp->invalidi; + av1_params->global_motioni.wmtype = + gmp->gm_typeGST_AV1_REF_LAST_FRAME + i; + for (j = 0; j < 6; j++) { + av1_params->global_motioni.wmmatj = + gmp->gm_paramsGST_AV1_REF_LAST_FRAME + ij; + } + } + + /* film grain params */ + if (seq_hdr->film_grain_params_present) { + av1_params->apply_grain = fgp->apply_grain; + av1_params->overlap_flag = fgp->overlap_flag; + av1_params->scaling_shift_minus8 = fgp->grain_scaling_minus_8; + av1_params->chroma_scaling_from_luma = fgp->chroma_scaling_from_luma; + av1_params->ar_coeff_lag = fgp->ar_coeff_lag; + av1_params->ar_coeff_shift_minus6 = fgp->ar_coeff_shift_minus_6; + av1_params->grain_scale_shift = fgp->grain_scale_shift; + av1_params->clip_to_restricted_range = fgp->clip_to_restricted_range; + av1_params->num_y_points = fgp->num_y_points; + for (i = 0; i < fgp->num_y_points && i < 14; i++) { + av1_params->scaling_points_yi0 = fgp->point_y_valuei; + av1_params->scaling_points_yi1 = fgp->point_y_scalingi; + } + + av1_params->num_cb_points = fgp->num_cb_points; + for (i = 0; i < fgp->num_cb_points && i < 10; i++) { + av1_params->scaling_points_cbi0 = fgp->point_cb_valuei; + av1_params->scaling_points_cbi1 = fgp->point_cb_scalingi; + } + + av1_params->num_cr_points = fgp->num_cr_points; + for (i = 0; i < fgp->num_cr_points && i < 10; i++) { + av1_params->scaling_points_cri0 = fgp->point_cr_valuei; + av1_params->scaling_points_cri1 = fgp->point_cr_scalingi; + } + + av1_params->random_seed = fgp->grain_seed; + for (i = 0; i < 24; i++) { + av1_params->ar_coeffs_yi = (short) fgp->ar_coeffs_y_plus_128i - 128; + } + + for (i = 0; i < 25; i++) { + av1_params->ar_coeffs_cbi = (short) fgp->ar_coeffs_cb_plus_128i - 128; + av1_params->ar_coeffs_cri = (short) fgp->ar_coeffs_cr_plus_128i - 128; + } + av1_params->cb_mult = fgp->cb_mult; + av1_params->cb_luma_mult = fgp->cb_luma_mult; + av1_params->cb_offset = fgp->cb_offset; + av1_params->cr_mult = fgp->cr_mult; + av1_params->cr_luma_mult = fgp->cr_luma_mult; + av1_params->cr_offset = fgp->cr_offset; + } + + gst_nv_av1_dec_reset_bitstream_params (self); + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_nv_av1_dec_decode_tile (GstAV1Decoder * decoder, + GstAV1Picture * picture, GstAV1Tile * tile) +{ + GstNvAV1Dec *self = GST_NV_AV1_DEC (decoder); + GstAV1TileGroupOBU *tile_group = &tile->tile_group; + guint i; + guint buffer_size; + + if (tile_group->num_tiles * 2 > self->tile_offsets_alloc_len) { + self->tile_offsets_alloc_len = tile_group->num_tiles * 2; + + self->tile_offsets = (guint *) g_realloc_n (self->tile_offsets, + self->tile_offsets_alloc_len, sizeof (guint)); + } + + self->num_tiles = tile_group->num_tiles; + + for (i = tile_group->tg_start; i <= tile_group->tg_end; i++) { + guint offset = self->bitstream_buffer_offset + + tile_group->entryi.tile_offset; + + self->tile_offsetsi * 2 = offset; + self->tile_offsetsi * 2 + 1 = offset + tile_group->entryi.tile_size; + } + + buffer_size = self->bitstream_buffer_offset + tile->obu.obu_size; + if (buffer_size > self->bitstream_buffer_alloc_size) { + guint alloc_size = buffer_size * 2; + + self->bitstream_buffer = (guint8 *) g_realloc (self->bitstream_buffer, + alloc_size); + self->bitstream_buffer_alloc_size = alloc_size; + } + + memcpy (self->bitstream_buffer + self->bitstream_buffer_offset, + tile->obu.data, tile->obu.obu_size); + + self->bitstream_buffer_offset += tile->obu.obu_size; + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_nv_av1_dec_end_picture (GstAV1Decoder * decoder, GstAV1Picture * picture) +{ + GstNvAV1Dec *self = GST_NV_AV1_DEC (decoder); + gboolean ret; + CUVIDPICPARAMS *params = &self->params; + + params->nBitstreamDataLen = self->bitstream_buffer_offset; + params->pBitstreamData = self->bitstream_buffer; + params->nNumSlices = self->num_tiles; + params->pSliceDataOffsets = self->tile_offsets; + + ret = gst_nv_decoder_decode_picture (self->decoder, params); + + if (!ret) { + GST_ERROR_OBJECT (self, "Failed to decode picture"); + return GST_FLOW_ERROR; + } + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_nv_av1_dec_output_picture (GstAV1Decoder * decoder, + GstVideoCodecFrame * frame, GstAV1Picture * picture) +{ + GstNvAV1Dec *self = GST_NV_AV1_DEC (decoder); + GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); + GstNvDecoderFrame *decoder_frame; + + GST_LOG_OBJECT (self, "Outputting picture %p", picture); + + decoder_frame = (GstNvDecoderFrame *) gst_av1_picture_get_user_data (picture); + if (!decoder_frame) { + GST_ERROR_OBJECT (self, "No decoder frame in picture %p", picture); + goto error; + } + + if (!gst_nv_decoder_finish_frame (self->decoder, vdec, picture->discont_state, + decoder_frame, &frame->output_buffer)) { + GST_ERROR_OBJECT (self, "Failed to handle output picture"); + goto error; + } + + gst_av1_picture_unref (picture); + + return gst_video_decoder_finish_frame (vdec, frame); + +error: + gst_video_decoder_drop_frame (vdec, frame); + gst_av1_picture_unref (picture); + + return GST_FLOW_ERROR; +} + +static guint +gst_nv_av1_dec_get_preferred_output_delay (GstAV1Decoder * decoder, + gboolean is_live) +{ + /* Prefer to zero latency for live pipeline */ + if (is_live) + return 0; + + /* NVCODEC SDK uses 4 frame delay for better throughput performance */ + return 4; +} + +void +gst_nv_av1_dec_register (GstPlugin * plugin, guint device_id, guint rank, + GstCaps * sink_caps, GstCaps * src_caps) +{ + GType type; + gchar *type_name; + gchar *feature_name; + guint index = 0; + GTypeInfo type_info = { + sizeof (GstNvAV1DecClass), + NULL, + NULL, + (GClassInitFunc) gst_nv_av1_dec_class_init, + NULL, + NULL, + sizeof (GstNvAV1Dec), + 0, + (GInstanceInitFunc) gst_nv_av1_dec_init, + }; + GstNvDecoderClassData *cdata; + + GST_DEBUG_CATEGORY_INIT (gst_nv_av1_dec_debug, "nvav1dec", 0, "nvav1dec"); + + cdata = g_new0 (GstNvDecoderClassData, 1); + cdata->sink_caps = gst_caps_ref (sink_caps); + cdata->src_caps = gst_caps_ref (src_caps); + cdata->cuda_device_id = device_id; + + type_info.class_data = cdata; + + type_name = g_strdup ("GstNvAV1Dec"); + feature_name = g_strdup ("nvav1dec"); + + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstNvAV1Device%dDec", index); + feature_name = g_strdup_printf ("nvav1device%ddec", index); + } + + type = g_type_register_static (GST_TYPE_AV1_DECODER, + type_name, &type_info, 0); + + /* make lower rank than default device */ + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvav1dec.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/codecs/gstav1decoder.h> + +G_BEGIN_DECLS + +void gst_nv_av1_dec_register (GstPlugin * plugin, + guint device_id, + guint rank, + GstCaps * sink_caps, + GstCaps * src_caps); + +G_END_DECLS +
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvbaseenc.c -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvbaseenc.c
Changed
@@ -22,8 +22,8 @@ #endif #include "gstnvbaseenc.h" -#include "gstcudautils.h" -#include "gstcudabufferpool.h" +#include <gst/cuda/gstcudautils.h> +#include <gst/cuda/gstcudabufferpool.h> #include <gst/pbutils/codec-utils.h> @@ -625,6 +625,7 @@ GstBufferPool *pool; GstStructure *config; GstCapsFeatures *features; + guint size; GST_DEBUG_OBJECT (nvenc, "propose allocation"); @@ -665,18 +666,23 @@ goto done; } - config = gst_buffer_pool_get_config (pool); - gst_buffer_pool_config_set_params (config, caps, GST_VIDEO_INFO_SIZE (&info), - nvenc->items->len, 0); + size = GST_VIDEO_INFO_SIZE (&info); - gst_query_add_allocation_pool (query, pool, GST_VIDEO_INFO_SIZE (&info), - nvenc->items->len, 0); + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_params (config, caps, size, nvenc->items->len, 0); gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); - gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); if (!gst_buffer_pool_set_config (pool, config)) goto error_pool_config; + /* Get updated size by cuda buffer pool */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, NULL, &size, NULL, NULL); + gst_structure_free (config); + + gst_query_add_allocation_pool (query, pool, size, nvenc->items->len, 0); + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + gst_object_unref (pool); done: @@ -1841,7 +1847,8 @@ if (nv_ret != NV_ENC_SUCCESS) { GST_ELEMENT_ERROR (nvenc, LIBRARY, SETTINGS, (NULL), - ("Failed to %sinit encoder: %d", reconfigure ? "re" : "", nv_ret)); + ("Failed to %sinit encoder: %d- %s", reconfigure ? "re" : "", nv_ret, + NvEncGetLastErrorString (nvenc->encoder))); NvEncDestroyEncoder (nvenc->encoder); nvenc->encoder = NULL; return FALSE; @@ -2231,17 +2238,12 @@ CUdeviceptr dst = resource->cuda_pointer; GstVideoInfo *info = &frame->info; CUresult cuda_ret; - GstCudaMemory *cuda_mem = NULL; if (!gst_cuda_context_push (nvenc->cuda_ctx)) { GST_ERROR_OBJECT (nvenc, "cannot push context"); return FALSE; } - if (use_device_memory) { - cuda_mem = (GstCudaMemory *) gst_buffer_peek_memory (frame->buffer, 0); - } - for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (frame); i++) { CUDA_MEMCPY2D param = { 0, }; guint dest_stride = _get_cuda_device_stride (&nvenc->input_info, i, @@ -2249,13 +2251,12 @@ if (use_device_memory) { param.srcMemoryType = CU_MEMORYTYPE_DEVICE; - param.srcDevice = cuda_mem->data + cuda_mem->offseti; - param.srcPitch = cuda_mem->stride; + param.srcDevice = (CUdeviceptr) GST_VIDEO_FRAME_PLANE_DATA (frame, i); } else { param.srcMemoryType = CU_MEMORYTYPE_HOST; param.srcHost = GST_VIDEO_FRAME_PLANE_DATA (frame, i); - param.srcPitch = GST_VIDEO_FRAME_PLANE_STRIDE (frame, i); } + param.srcPitch = GST_VIDEO_FRAME_PLANE_STRIDE (frame, i); param.dstMemoryType = CU_MEMORYTYPE_DEVICE; param.dstDevice = dst;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvbaseenc.h -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvbaseenc.h
Changed
@@ -23,7 +23,7 @@ #include "gstnvenc.h" #include <gst/video/gstvideoencoder.h> -#include "gstcudacontext.h" +#include <gst/cuda/gstcudacontext.h> #define GST_TYPE_NV_BASE_ENC \ (gst_nv_base_enc_get_type())
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvdec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvdec.c
Changed
@@ -29,9 +29,11 @@ #include "config.h" #endif +#include <gst/cuda/gstcudautils.h> +#include <gst/cuda/gstcudabufferpool.h> + +#include "gstcuvidloader.h" #include "gstnvdec.h" -#include "gstcudautils.h" -#include "gstcudabufferpool.h" #include <string.h> @@ -44,6 +46,7 @@ { PROP_0, PROP_MAX_DISPLAY_DELAY, + PROP_CUDA_DEVICE_ID, }; #ifdef HAVE_NVCODEC_GST_GL @@ -195,11 +198,15 @@ GParamSpec * pspec) { GstNvDec *nvdec = GST_NVDEC (object); + GstNvDecClass *klass = GST_NVDEC_GET_CLASS (nvdec); switch (prop_id) { case PROP_MAX_DISPLAY_DELAY: g_value_set_int (value, nvdec->max_display_delay); break; + case PROP_CUDA_DEVICE_ID: + g_value_set_uint (value, klass->cuda_device_id); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -245,6 +252,18 @@ "(auto = -1)", -1, G_MAXINT, DEFAULT_MAX_DISPLAY_DELAY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstNvDec:cuda-device-id: + * + * Assigned CUDA device id + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_CUDA_DEVICE_ID, + g_param_spec_uint ("cuda-device-id", "CUDA device id", + "Assigned CUDA device id", 0, G_MAXINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } static void @@ -1148,6 +1167,7 @@ proc_params.progressive_frame = dispinfo->progressive_frame; proc_params.top_field_first = dispinfo->top_field_first; proc_params.unpaired_field = dispinfo->repeat_first_field == -1; + proc_params.output_stream = nvdec->cuda_stream; data->ret = TRUE; @@ -1265,40 +1285,32 @@ GstVideoInfo *info = &nvdec->output_state->info; gint i; GstMemory *mem; - GstCudaMemory *cuda_mem = NULL; - - if (!gst_cuda_context_push (nvdec->cuda_ctx)) { - GST_WARNING_OBJECT (nvdec, "failed to lock CUDA context"); - return FALSE; - } + gboolean use_device_copy = FALSE; + GstMapFlags map_flags = GST_MAP_WRITE; if (nvdec->mem_type == GST_NVDEC_MEM_TYPE_CUDA && (mem = gst_buffer_peek_memory (output_buffer, 0)) && gst_is_cuda_memory (mem)) { - GstCudaMemory *cmem = GST_CUDA_MEMORY_CAST (mem); - - if (cmem->context == nvdec->cuda_ctx || - gst_cuda_context_get_handle (cmem->context) == - gst_cuda_context_get_handle (nvdec->cuda_ctx) || - (gst_cuda_context_can_access_peer (cmem->context, nvdec->cuda_ctx) && - gst_cuda_context_can_access_peer (nvdec->cuda_ctx, - cmem->context))) { - cuda_mem = cmem; - } + map_flags |= GST_MAP_CUDA; + use_device_copy = TRUE; } - if (!cuda_mem) { - if (!gst_video_frame_map (&video_frame, info, output_buffer, GST_MAP_WRITE)) { - GST_ERROR_OBJECT (nvdec, "frame map failure"); - gst_cuda_context_pop (NULL); - return FALSE; - } + if (!gst_video_frame_map (&video_frame, info, output_buffer, map_flags)) { + GST_ERROR_OBJECT (nvdec, "frame map failure"); + return FALSE; + } + + if (!gst_cuda_context_push (nvdec->cuda_ctx)) { + gst_video_frame_unmap (&video_frame); + GST_WARNING_OBJECT (nvdec, "failed to lock CUDA context"); + return FALSE; } params.progressive_frame = dispinfo->progressive_frame; params.second_field = dispinfo->repeat_first_field + 1; params.top_field_first = dispinfo->top_field_first; params.unpaired_field = dispinfo->repeat_first_field < 0; + params.output_stream = nvdec->cuda_stream; if (!gst_cuda_result (CuvidMapVideoFrame (nvdec->decoder, dispinfo->picture_index, &dptr, &pitch, ¶ms))) { @@ -1310,17 +1322,17 @@ copy_params.srcMemoryType = CU_MEMORYTYPE_DEVICE; copy_params.srcPitch = pitch; copy_params.dstMemoryType = - cuda_mem ? CU_MEMORYTYPE_DEVICE : CU_MEMORYTYPE_HOST; + use_device_copy ? CU_MEMORYTYPE_DEVICE : CU_MEMORYTYPE_HOST; for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) { copy_params.srcDevice = dptr + (i * pitch * GST_VIDEO_INFO_HEIGHT (info)); - if (cuda_mem) { - copy_params.dstDevice = cuda_mem->data + cuda_mem->offseti; - copy_params.dstPitch = cuda_mem->stride; + if (use_device_copy) { + copy_params.dstDevice = + (CUdeviceptr) GST_VIDEO_FRAME_PLANE_DATA (&video_frame, i); } else { copy_params.dstHost = GST_VIDEO_FRAME_PLANE_DATA (&video_frame, i); - copy_params.dstPitch = GST_VIDEO_FRAME_PLANE_STRIDE (&video_frame, i); } + copy_params.dstPitch = GST_VIDEO_FRAME_PLANE_STRIDE (&video_frame, i); copy_params.WidthInBytes = GST_VIDEO_INFO_COMP_WIDTH (info, i) * GST_VIDEO_INFO_COMP_PSTRIDE (info, i); copy_params.Height = GST_VIDEO_INFO_COMP_HEIGHT (info, i); @@ -1328,8 +1340,7 @@ if (!gst_cuda_result (CuMemcpy2DAsync (©_params, nvdec->cuda_stream))) { GST_ERROR_OBJECT (nvdec, "failed to copy %dth plane", i); CuvidUnmapVideoFrame (nvdec->decoder, dptr); - if (!cuda_mem) - gst_video_frame_unmap (&video_frame); + gst_video_frame_unmap (&video_frame); gst_cuda_context_pop (NULL); return FALSE; } @@ -1337,8 +1348,7 @@ gst_cuda_result (CuStreamSynchronize (nvdec->cuda_stream)); - if (!cuda_mem) - gst_video_frame_unmap (&video_frame); + gst_video_frame_unmap (&video_frame); if (!gst_cuda_result (CuvidUnmapVideoFrame (nvdec->decoder, dptr))) GST_WARNING_OBJECT (nvdec, "failed to unmap video frame"); @@ -1884,9 +1894,15 @@ n = gst_query_get_n_allocation_pools (query); if (n > 0) { gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); - if (pool && !GST_IS_CUDA_BUFFER_POOL (pool)) { - gst_object_unref (pool); - pool = NULL; + if (pool) { + if (!GST_IS_CUDA_BUFFER_POOL (pool)) { + gst_clear_object (&pool); + } else { + GstCudaBufferPool *cpool = GST_CUDA_BUFFER_POOL (pool); + + if (cpool->context != nvdec->cuda_ctx) + gst_clear_object (&pool); + } } } @@ -1904,6 +1920,12 @@ gst_buffer_pool_config_set_params (config, outcaps, size, min, max); gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); gst_buffer_pool_set_config (pool, config); + + /* Get updated size by cuda buffer pool */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, NULL, &size, NULL, NULL); + gst_structure_free (config); + if (n > 0) gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); else @@ -2047,6 +2069,7 @@ gchar *type_name; GstNvDecClassData *cdata; gboolean is_default = TRUE; + gint index = 0; cdata = g_new0 (GstNvDecClassData, 1); cdata->sink_caps = gst_caps_ref (sink_caps); @@ -2063,10 +2086,10 @@ type_info.class_data = cdata; type_name = g_strdup_printf ("nv%sdec", codec); - - if (g_type_from_name (type_name) != 0) { + while (g_type_from_name (type_name)) { + index++; g_free (type_name); - type_name = g_strdup_printf ("nv%sdevice%ddec", codec, device_id); + type_name = g_strdup_printf ("nv%sdevice%ddec", codec, index); is_default = FALSE; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvdec.h -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvdec.h
Changed
@@ -33,12 +33,12 @@ #include <gst/gl/gstglfuncs.h> #endif +#include "nvcuvid.h" #include <gst/video/video.h> #include <gst/codecparsers/gsth264parser.h> #include <gst/codecparsers/gsth265parser.h> -#include "gstcuvidloader.h" -#include "gstcudaloader.h" -#include "gstcudacontext.h" +#include <gst/cuda/gstcudaloader.h> +#include <gst/cuda/gstcudacontext.h> G_BEGIN_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvdecoder.c -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvdecoder.c
Changed
@@ -50,9 +50,9 @@ #include <gst/gl/gstglfuncs.h> #endif -#include "gstcudamemory.h" +#include <gst/cuda/gstcudamemory.h> +#include <gst/cuda/gstcudabufferpool.h> #include "gstnvdecoder.h" -#include "gstcudabufferpool.h" #include <string.h> GST_DEBUG_CATEGORY_EXTERN (gst_nv_decoder_debug); @@ -84,6 +84,7 @@ GstNvDecoderFrameInfo *frame_pool; guint pool_size; + gboolean alloc_aux_frame; GstVideoInfo info; GstVideoInfo coded_info; @@ -254,11 +255,12 @@ gboolean gst_nv_decoder_configure (GstNvDecoder * decoder, cudaVideoCodec codec, GstVideoInfo * info, gint coded_width, gint coded_height, - guint coded_bitdepth, guint pool_size) + guint coded_bitdepth, guint pool_size, gboolean alloc_aux_frame) { CUVIDDECODECREATEINFO create_info = { 0, }; GstVideoFormat format; gboolean ret; + guint alloc_size; g_return_val_if_fail (GST_IS_NV_DECODER (decoder), FALSE); g_return_val_if_fail (codec < cudaVideoCodec_NumCodecs, FALSE); @@ -276,10 +278,23 @@ format = GST_VIDEO_INFO_FORMAT (info); + /* Additional 2 frame margin */ + pool_size += 2; + + /* Need pool size * 2 for decode-only (used for reference) frame + * and output frame, AV1 film grain case for example */ + if (alloc_aux_frame) { + alloc_size = pool_size * 2; + } else { + alloc_size = pool_size; + } + + decoder->alloc_aux_frame = alloc_aux_frame; + /* FIXME: check aligned resolution or actual coded resolution */ create_info.ulWidth = GST_VIDEO_INFO_WIDTH (&decoder->coded_info); create_info.ulHeight = GST_VIDEO_INFO_HEIGHT (&decoder->coded_info); - create_info.ulNumDecodeSurfaces = pool_size; + create_info.ulNumDecodeSurfaces = alloc_size; create_info.CodecType = codec; create_info.ChromaFormat = chroma_format_from_video_format (format); create_info.ulCreationFlags = cudaVideoCreate_Default; @@ -352,8 +367,15 @@ frame = g_new0 (GstNvDecoderFrame, 1); frame->index = index_to_use; + frame->decode_frame_index = index_to_use; frame->decoder = gst_object_ref (decoder); frame->ref_count = 1; + if (decoder->alloc_aux_frame) { + /* 0, pool_size - 1: output picture + * pool_size, pool_size * 2 - 1: decoder output without film-grain, + * used for reference picture */ + frame->decode_frame_index = index_to_use + decoder->pool_size; + } GST_LOG_OBJECT (decoder, "New frame %p (index %d)", frame, frame->index); @@ -375,6 +397,7 @@ /* TODO: check interlaced */ params.progressive_frame = 1; + params.output_stream = self->cuda_stream; if (frame->mapped) { GST_WARNING_OBJECT (self, "Frame %p is mapped already", frame); @@ -644,13 +667,13 @@ copy_params.dstDevice = dst_ptr; copy_params.Height = GST_VIDEO_INFO_COMP_HEIGHT (info, i); - if (!gst_cuda_result (CuMemcpy2DAsync (©_params, NULL))) { + if (!gst_cuda_result (CuMemcpy2DAsync (©_params, self->cuda_stream))) { GST_WARNING_OBJECT (self, "memcpy to mapped array failed"); data->ret = FALSE; } } - gst_cuda_result (CuStreamSynchronize (NULL)); + gst_cuda_result (CuStreamSynchronize (self->cuda_stream)); unmap_video_frame: for (i = 0; i < num_resources; i++) { @@ -740,33 +763,24 @@ { CUDA_MEMCPY2D copy_params = { 0, }; GstMemory *mem; - GstCudaMemory *cuda_mem = NULL; gint i; gboolean ret = FALSE; + GstVideoFrame video_frame; mem = gst_buffer_peek_memory (buffer, 0); if (!gst_is_cuda_memory (mem)) { GST_WARNING_OBJECT (decoder, "Not a CUDA memory"); return FALSE; - } else { - GstCudaMemory *cmem = GST_CUDA_MEMORY_CAST (mem); - - if (cmem->context == decoder->context || - gst_cuda_context_get_handle (cmem->context) == - gst_cuda_context_get_handle (decoder->context) || - (gst_cuda_context_can_access_peer (cmem->context, decoder->context) && - gst_cuda_context_can_access_peer (decoder->context, - cmem->context))) { - cuda_mem = cmem; - } } - if (!cuda_mem) { - GST_WARNING_OBJECT (decoder, "Access to CUDA memory is not allowed"); + if (!gst_video_frame_map (&video_frame, + &decoder->info, buffer, GST_MAP_WRITE | GST_MAP_CUDA)) { + GST_ERROR_OBJECT (decoder, "frame map failure"); return FALSE; } if (!gst_cuda_context_push (decoder->context)) { + gst_video_frame_unmap (&video_frame); GST_ERROR_OBJECT (decoder, "Failed to push CUDA context"); return FALSE; } @@ -778,8 +792,9 @@ for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&decoder->info); i++) { copy_params.srcDevice = frame->devptr + (i * frame->pitch * GST_VIDEO_INFO_HEIGHT (&decoder->info)); - copy_params.dstDevice = cuda_mem->data + cuda_mem->offseti; - copy_params.dstPitch = cuda_mem->stride; + copy_params.dstDevice = + (CUdeviceptr) GST_VIDEO_FRAME_PLANE_DATA (&video_frame, i); + copy_params.dstPitch = GST_VIDEO_FRAME_PLANE_STRIDE (&video_frame, i); copy_params.WidthInBytes = GST_VIDEO_INFO_COMP_WIDTH (&decoder->info, 0) * GST_VIDEO_INFO_COMP_PSTRIDE (&decoder->info, 0); copy_params.Height = GST_VIDEO_INFO_COMP_HEIGHT (&decoder->info, i); @@ -795,6 +810,7 @@ ret = TRUE; done: + gst_video_frame_unmap (&video_frame); gst_cuda_context_pop (NULL); GST_LOG_OBJECT (decoder, "Copy frame to CUDA ret %d", ret); @@ -804,7 +820,8 @@ gboolean gst_nv_decoder_finish_frame (GstNvDecoder * decoder, GstVideoDecoder * videodec, - GstNvDecoderFrame * frame, GstBuffer ** buffer) + GstVideoCodecState * input_state, GstNvDecoderFrame * frame, + GstBuffer ** buffer) { GstBuffer *outbuf = NULL; gboolean ret = FALSE; @@ -814,6 +831,13 @@ g_return_val_if_fail (frame != NULL, GST_FLOW_ERROR); g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR); + if (input_state) { + if (!gst_nv_decoder_negotiate (decoder, videodec, input_state)) { + GST_ERROR_OBJECT (videodec, "Couldn't re-negotiate with updated state"); + return FALSE; + } + } + outbuf = gst_video_decoder_allocate_output_buffer (videodec); if (!outbuf) { GST_ERROR_OBJECT (videodec, "Couldn't allocate output buffer"); @@ -1005,6 +1029,10 @@ ret = TRUE; break; + case cudaVideoCodec_AV1: + g_value_set_static_string (&val, "main"); + gst_value_list_append_value (profiles, &val); + ret = TRUE; default: break; } @@ -1049,7 +1077,8 @@ "video/x-h265, stream-format = (string) byte-stream" ", alignment = (string) au, profile = (string) { main }"}, {cudaVideoCodec_VP8, "vp8", "video/x-vp8"}, - {cudaVideoCodec_VP9, "vp9", "video/x-vp9"} + {cudaVideoCodec_VP9, "vp9", "video/x-vp9"}, + {cudaVideoCodec_AV1, "av1", "video/x-av1, alignment = (string) frame"} }; gboolean @@ -1434,8 +1463,7 @@ gboolean gst_nv_decoder_negotiate (GstNvDecoder * decoder, - GstVideoDecoder * videodec, GstVideoCodecState * input_state, - GstVideoCodecState ** output_state) + GstVideoDecoder * videodec, GstVideoCodecState * input_state) { GstVideoCodecState *state; GstVideoInfo *info; @@ -1443,7 +1471,6 @@ g_return_val_if_fail (GST_IS_NV_DECODER (decoder), FALSE); g_return_val_if_fail (GST_IS_VIDEO_DECODER (videodec), FALSE); g_return_val_if_fail (input_state != NULL, FALSE); - g_return_val_if_fail (output_state != NULL, FALSE); if (!decoder->configured) { GST_ERROR_OBJECT (videodec, "Should configure decoder first"); @@ -1456,9 +1483,8 @@ GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info), input_state); state->caps = gst_video_info_to_caps (&state->info); - if (*output_state) - gst_video_codec_state_unref (*output_state); - *output_state = state; + /* decoder baseclass will hold other reference to output state */ + gst_video_codec_state_unref (state); decoder->output_type = GST_NV_DECODER_OUTPUT_TYPE_SYSTEM; @@ -1567,6 +1593,12 @@ gst_buffer_pool_config_set_params (config, outcaps, size, min, max); gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); gst_buffer_pool_set_config (pool, config); + + /* Get updated size by cuda buffer pool */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, NULL, &size, NULL, NULL); + gst_structure_free (config); + if (n > 0) gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); else
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvdecoder.h -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvdecoder.h
Changed
@@ -22,7 +22,7 @@ #include <gst/gst.h> #include <gst/video/video.h> -#include "gstcudautils.h" +#include <gst/cuda/gstcudautils.h> #include "gstcuvidloader.h" G_BEGIN_DECLS @@ -40,12 +40,22 @@ gboolean mapped; + /* Extra frame allocated for AV1 film grain */ + gint decode_frame_index; + /*< private >*/ GstNvDecoder *decoder; gint ref_count; } GstNvDecoderFrame; +typedef struct _GstNvDecoderClassData +{ + GstCaps *sink_caps; + GstCaps *src_caps; + guint cuda_device_id; +} GstNvDecoderClassData; + GstNvDecoder * gst_nv_decoder_new (GstCudaContext * context); gboolean gst_nv_decoder_is_configured (GstNvDecoder * decoder); @@ -56,7 +66,8 @@ gint coded_width, gint coded_height, guint coded_bitdepth, - guint pool_size); + guint pool_size, + gboolean alloc_aux_frame); GstNvDecoderFrame * gst_nv_decoder_new_frame (GstNvDecoder * decoder); @@ -69,6 +80,7 @@ gboolean gst_nv_decoder_finish_frame (GstNvDecoder * decoder, GstVideoDecoder * videodec, + GstVideoCodecState * input_state, GstNvDecoderFrame *frame, GstBuffer ** buffer); @@ -91,8 +103,7 @@ gboolean gst_nv_decoder_negotiate (GstNvDecoder * decoder, GstVideoDecoder * videodec, - GstVideoCodecState * input_state, - GstVideoCodecState ** output_state); + GstVideoCodecState * input_state); gboolean gst_nv_decoder_decide_allocation (GstNvDecoder * decoder, GstVideoDecoder * videodec,
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvenc.c -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvenc.c
Changed
@@ -24,7 +24,9 @@ #include "gstnvenc.h" #include "gstnvh264enc.h" #include "gstnvh265enc.h" -#include "gstcudabufferpool.h" +#include <gst/cuda/gstcudautils.h> +#include <gst/cuda/gstcudabufferpool.h> +#include <string.h> #include <gmodule.h> @@ -50,6 +52,7 @@ #define GST_NVENCAPI_STRUCT_VERSION(ver,api_ver) ((uint32_t)(api_ver) | ((ver)<<16) | (0x7 << 28)) static guint32 gst_nvenc_api_version = NVENCAPI_VERSION; +static gboolean gst_nvenc_supports_cuda_stream = FALSE; typedef NVENCSTATUS NVENCAPI tNvEncodeAPICreateInstance (NV_ENCODE_API_FUNCTION_LIST * functionList); @@ -79,6 +82,13 @@ return nvenc_api.nvEncDestroyEncoder (encoder); } +const char *NVENCAPI +NvEncGetLastErrorString (void *encoder) +{ + g_assert (nvenc_api.nvEncGetLastErrorString != NULL); + return nvenc_api.nvEncGetLastErrorString (encoder); +} + NVENCSTATUS NVENCAPI NvEncGetEncodeGUIDs (void *encoder, GUID * array, uint32_t array_size, uint32_t * count) @@ -261,6 +271,28 @@ return nvenc_api.nvEncEncodePicture (encoder, pic_params); } +NVENCSTATUS NVENCAPI +NvEncRegisterAsyncEvent (void *encoder, NV_ENC_EVENT_PARAMS * event_params) +{ + g_assert (nvenc_api.nvEncRegisterAsyncEvent != NULL); + return nvenc_api.nvEncRegisterAsyncEvent (encoder, event_params); +} + +NVENCSTATUS NVENCAPI +NvEncUnregisterAsyncEvent (void *encoder, NV_ENC_EVENT_PARAMS * event_params) +{ + g_assert (nvenc_api.nvEncUnregisterAsyncEvent != NULL); + return nvenc_api.nvEncUnregisterAsyncEvent (encoder, event_params); +} + +NVENCSTATUS NVENCAPI +NvEncSetIOCudaStreams (void *encoder, NV_ENC_CUSTREAM_PTR input_stream, + NV_ENC_CUSTREAM_PTR output_stream) +{ + g_assert (nvenc_api.nvEncSetIOCudaStreams != NULL); + return nvenc_api.nvEncSetIOCudaStreams (encoder, input_stream, output_stream); +} + gboolean gst_nvenc_cmp_guid (GUID g1, GUID g2) { @@ -869,6 +901,7 @@ gint i; static const GstNvEncVersion version_list = { {NVENCAPI_MAJOR_VERSION, NVENCAPI_MINOR_VERSION}, + {9, 1}, {9, 0}, {GST_NVENC_MIN_API_MAJOR_VERSION, GST_NVENC_MIN_API_MINOR_VERSION} }; @@ -947,9 +980,13 @@ continue; } + GST_INFO ("Checking version %d.%d", version_listi.major, + version_listi.minor); + gst_nvenc_api_version = GST_NVENCAPI_VERSION (version_listi.major, version_listi.minor); + memset (&nvenc_api, 0, sizeof (NV_ENCODE_API_FUNCTION_LIST)); nvenc_api.version = GST_NVENCAPI_STRUCT_VERSION (2, gst_nvenc_api_version); ret = nvEncodeAPICreateInstance (&nvenc_api); @@ -959,7 +996,18 @@ *api_major_ver = version_listi.major; *api_minor_ver = version_listi.minor; + + if ((version_listi.major > 9 || + (version_listi.major == 9 && version_listi.minor > 0)) && + nvenc_api.nvEncSetIOCudaStreams) { + GST_INFO ("nvEncSetIOCudaStreams is supported"); + gst_nvenc_supports_cuda_stream = TRUE; + } + break; + } else { + GST_INFO ("Version %d.%d is not supported", version_listi.major, + version_listi.minor); } } @@ -1127,3 +1175,9 @@ /* NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS_VER == NVENCAPI_STRUCT_VERSION(1) */ return GST_NVENCAPI_STRUCT_VERSION (1, gst_nvenc_api_version); } + +gboolean +gst_nvenc_have_set_io_cuda_streams (void) +{ + return gst_nvenc_supports_cuda_stream; +}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvenc.h -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvenc.h
Changed
@@ -22,10 +22,12 @@ #include <gst/gst.h> #include <gst/video/video.h> +#include <gst/cuda/gstcudaloader.h> -#include "gstcudaloader.h" #include "nvEncodeAPI.h" +G_BEGIN_DECLS + gboolean gst_nvenc_cmp_guid (GUID g1, GUID g2); NV_ENC_BUFFER_FORMAT gst_nvenc_get_nv_buffer_format (GstVideoFormat fmt); @@ -86,7 +88,11 @@ guint32 gst_nvenc_get_open_encode_session_ex_params_version (void); +gboolean gst_nvenc_have_set_io_cuda_streams (void); + gboolean gst_nvenc_load_library (guint * api_major_ver, guint * api_minor_ver); +G_END_DECLS + #endif /* __GST_NVENC_H_INCLUDED__ */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvencoder.cpp
Added
@@ -0,0 +1,2381 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstnvencoder.h" + +#include <gst/cuda/gstcudautils.h> +#include <gst/cuda/gstcudamemory.h> +#include <gst/cuda/gstcudabufferpool.h> +#include <string.h> + +#ifdef GST_CUDA_HAS_D3D +#include <gst/d3d11/gstd3d11.h> +#endif + +#ifdef G_OS_WIN32 +#include <wrl.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_nv_encoder_debug); +#define GST_CAT_DEFAULT gst_nv_encoder_debug + +#define GET_LOCK(e) (&(GST_NV_ENCODER_CAST(e)->priv->lock)) +#define GST_NV_ENCODER_LOCK(e) G_STMT_START { \ + GST_TRACE_OBJECT (e, "Locking from thread %p", g_thread_self ()); \ + g_mutex_lock(GET_LOCK(e)); \ + GST_TRACE_OBJECT (e, "Locked from thread %p", g_thread_self ()); \ +} G_STMT_END + +#define GST_NV_ENCODER_UNLOCK(e) G_STMT_START { \ + GST_TRACE_OBJECT (e, "Unlocking from thread %p", g_thread_self ()); \ + g_mutex_unlock(GET_LOCK(e)); \ +} G_STMT_END + +struct _GstNvEncoderPrivate +{ + GstCudaContext *context; + CUstream cuda_stream; + +#ifdef GST_CUDA_HAS_D3D + GstD3D11Device *device; + GstD3D11Fence *fence; +#endif + + GstNvEncoderDeviceMode subclass_device_mode; + GstNvEncoderDeviceMode selected_device_mode; + gint64 dxgi_adapter_luid; + guint cuda_device_id; + + NV_ENC_INITIALIZE_PARAMS init_params; + NV_ENC_CONFIG config; + gpointer session; + + GstVideoCodecState *input_state; + + GstBufferPool *internal_pool; + + GstClockTime dts_offset; + + /* Array of GstNvEncoderTask, holding ownership */ + GArray *task_pool; + + GQueue free_tasks; + GQueue output_tasks; + + GMutex lock; + GCond cond; + + GRecMutex context_lock; + + GThread *encoding_thread; + + GstFlowReturn last_flow; +}; + +/** + * GstNvEncoder: + * + * Since: 1.22 + */ +#define gst_nv_encoder_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GstNvEncoder, gst_nv_encoder, + GST_TYPE_VIDEO_ENCODER); + +static void gst_nv_encoder_finalize (GObject * object); +static void gst_nv_encoder_set_context (GstElement * element, + GstContext * context); +static gboolean gst_nv_encoder_open (GstVideoEncoder * encoder); +static gboolean gst_nv_encoder_close (GstVideoEncoder * encoder); +static gboolean gst_nv_encoder_stop (GstVideoEncoder * encoder); +static gboolean gst_nv_encoder_sink_query (GstVideoEncoder * encoder, + GstQuery * query); +static gboolean gst_nv_encoder_src_query (GstVideoEncoder * encoder, + GstQuery * query); +static gboolean gst_nv_encoder_propose_allocation (GstVideoEncoder * + encoder, GstQuery * query); +static gboolean gst_nv_encoder_set_format (GstVideoEncoder * encoder, + GstVideoCodecState * state); +static GstFlowReturn gst_nv_encoder_handle_frame (GstVideoEncoder * + encoder, GstVideoCodecFrame * frame); +static GstFlowReturn gst_nv_encoder_finish (GstVideoEncoder * encoder); +static gboolean gst_nv_encoder_flush (GstVideoEncoder * encoder); +static void gst_nv_encoder_task_clear (GstNvEncoderTask * task); + +static void +gst_nv_encoder_class_init (GstNvEncoderClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoEncoderClass *videoenc_class = GST_VIDEO_ENCODER_CLASS (klass); + + object_class->finalize = gst_nv_encoder_finalize; + + element_class->set_context = GST_DEBUG_FUNCPTR (gst_nv_encoder_set_context); + + videoenc_class->open = GST_DEBUG_FUNCPTR (gst_nv_encoder_open); + videoenc_class->close = GST_DEBUG_FUNCPTR (gst_nv_encoder_close); + videoenc_class->stop = GST_DEBUG_FUNCPTR (gst_nv_encoder_stop); + videoenc_class->sink_query = GST_DEBUG_FUNCPTR (gst_nv_encoder_sink_query); + videoenc_class->src_query = GST_DEBUG_FUNCPTR (gst_nv_encoder_src_query); + videoenc_class->propose_allocation = + GST_DEBUG_FUNCPTR (gst_nv_encoder_propose_allocation); + videoenc_class->set_format = GST_DEBUG_FUNCPTR (gst_nv_encoder_set_format); + videoenc_class->handle_frame = + GST_DEBUG_FUNCPTR (gst_nv_encoder_handle_frame); + videoenc_class->finish = GST_DEBUG_FUNCPTR (gst_nv_encoder_finish); + videoenc_class->flush = GST_DEBUG_FUNCPTR (gst_nv_encoder_flush); + + GST_DEBUG_CATEGORY_INIT (gst_nv_encoder_debug, "nvencoder", 0, "nvencoder"); + + gst_type_mark_as_plugin_api (GST_TYPE_NV_ENCODER, (GstPluginAPIFlags) 0); + gst_type_mark_as_plugin_api (GST_TYPE_NV_ENCODER_PRESET, + (GstPluginAPIFlags) 0); + gst_type_mark_as_plugin_api (GST_TYPE_NV_ENCODER_RC_MODE, + (GstPluginAPIFlags) 0); +} + +static void +gst_nv_encoder_init (GstNvEncoder * self) +{ + GstNvEncoderPrivate *priv; + + self->priv = priv = (GstNvEncoderPrivate *) + gst_nv_encoder_get_instance_private (self); + + priv->task_pool = g_array_new (FALSE, TRUE, sizeof (GstNvEncoderTask)); + g_array_set_clear_func (priv->task_pool, + (GDestroyNotify) gst_nv_encoder_task_clear); + + g_queue_init (&priv->free_tasks); + g_queue_init (&priv->output_tasks); + + g_mutex_init (&priv->lock); + g_cond_init (&priv->cond); + + g_rec_mutex_init (&priv->context_lock); + + gst_video_encoder_set_min_pts (GST_VIDEO_ENCODER (self), + GST_SECOND * 60 * 60 * 1000); +} + +static void +gst_nv_encoder_finalize (GObject * object) +{ + GstNvEncoder *self = GST_NV_ENCODER (object); + GstNvEncoderPrivate *priv = self->priv; + + g_array_unref (priv->task_pool); + + g_mutex_clear (&priv->lock); + g_cond_clear (&priv->cond); + + g_rec_mutex_clear (&priv->context_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_nv_encoder_set_context (GstElement * element, GstContext * context) +{ + GstNvEncoder *self = GST_NV_ENCODER (element); + GstNvEncoderPrivate *priv = self->priv; + + g_rec_mutex_lock (&priv->context_lock); + + switch (priv->selected_device_mode) { +#ifdef GST_CUDA_HAS_D3D + case GST_NV_ENCODER_DEVICE_D3D11: + gst_d3d11_handle_set_context_for_adapter_luid (element, + context, priv->dxgi_adapter_luid, &priv->device); + break; +#endif + case GST_NV_ENCODER_DEVICE_CUDA: + gst_cuda_handle_set_context (element, context, priv->cuda_device_id, + &priv->context); + break; + default: + break; + } + + g_rec_mutex_unlock (&priv->context_lock); + + GST_ELEMENT_CLASS (parent_class)->set_context (element, context); +} + +static gboolean +gst_nv_encoder_reset (GstNvEncoder * self) +{ + GstNvEncoderPrivate *priv = self->priv; + + GST_LOG_OBJECT (self, "Reset"); + + g_array_set_size (priv->task_pool, 0); + + if (priv->internal_pool) { + gst_buffer_pool_set_active (priv->internal_pool, FALSE); + gst_clear_object (&priv->internal_pool); + } + + if (priv->session) { + NvEncDestroyEncoder (priv->session); + priv->session = NULL; + } + + if (priv->context && priv->cuda_stream) { + gst_cuda_context_push (priv->context); + CuStreamDestroy (priv->cuda_stream); + gst_cuda_context_pop (nullptr); + priv->cuda_stream = nullptr; + } + + g_queue_clear (&priv->free_tasks); + g_queue_clear (&priv->output_tasks); + + priv->last_flow = GST_FLOW_OK; + + return TRUE; +} + +static gboolean +gst_nv_encoder_device_lock (GstNvEncoder * self) +{ + GstNvEncoderPrivate *priv = self->priv; + gboolean ret = TRUE; + + switch (priv->selected_device_mode) { +#ifdef GST_CUDA_HAS_D3D + case GST_NV_ENCODER_DEVICE_D3D11: + gst_d3d11_device_lock (priv->device); + break; +#endif + case GST_NV_ENCODER_DEVICE_CUDA: + ret = gst_cuda_context_push (priv->context); + break; + default: + break; + } + + return ret; +} + +static gboolean +gst_nv_encoder_device_unlock (GstNvEncoder * self) +{ + GstNvEncoderPrivate *priv = self->priv; + gboolean ret = TRUE; + + switch (priv->selected_device_mode) { +#ifdef GST_CUDA_HAS_D3D + case GST_NV_ENCODER_DEVICE_D3D11: + gst_d3d11_device_unlock (priv->device); + break; +#endif + case GST_NV_ENCODER_DEVICE_CUDA: + ret = gst_cuda_context_pop (nullptr); + break; + default: + break; + } + + return ret; +} + +static GstFlowReturn +gst_nv_encoder_get_free_task (GstNvEncoder * self, GstNvEncoderTask ** task, + gboolean check_last_flow) +{ + GstNvEncoderPrivate *priv = self->priv; + GstFlowReturn ret = GST_FLOW_OK; + GstNvEncoderTask *free_task = NULL; + + GST_NV_ENCODER_LOCK (self); + if (check_last_flow) { + if (priv->last_flow != GST_FLOW_OK) { + ret = priv->last_flow; + GST_NV_ENCODER_UNLOCK (self); + return ret; + } + + while (priv->last_flow == GST_FLOW_OK && (free_task = (GstNvEncoderTask *) + g_queue_pop_head (&priv->free_tasks)) == NULL) { + g_cond_wait (&priv->cond, &priv->lock); + } + + ret = priv->last_flow; + if (ret != GST_FLOW_OK && free_task) { + g_queue_push_tail (&priv->free_tasks, free_task); + free_task = NULL; + } + } else { + while ((free_task = (GstNvEncoderTask *) + g_queue_pop_head (&priv->free_tasks)) == NULL) + g_cond_wait (&priv->cond, &priv->lock); + } + GST_NV_ENCODER_UNLOCK (self); + + *task = free_task; + + return ret; +} + +static gboolean +gst_nv_encoder_drain (GstNvEncoder * self, gboolean locked) +{ + GstNvEncoderPrivate *priv = self->priv; + NV_ENC_PIC_PARAMS pic_params = { 0, }; + NVENCSTATUS status; + GstNvEncoderTask *task; + + if (!priv->session || !priv->encoding_thread) + return TRUE; + + GST_DEBUG_OBJECT (self, "Drain"); + + if (locked) + GST_VIDEO_ENCODER_STREAM_UNLOCK (self); + + gst_nv_encoder_get_free_task (self, &task, FALSE); + + task->is_eos = TRUE; + + pic_params.version = gst_nvenc_get_pic_params_version (); + pic_params.encodePicFlags = NV_ENC_PIC_FLAG_EOS; + pic_params.completionEvent = task->event_handle; + + gst_nv_encoder_device_lock (self); + status = NvEncEncodePicture (priv->session, &pic_params); + if (status != NV_ENC_SUCCESS) { + GST_DEBUG_OBJECT (self, "Drain returned status %" GST_NVENC_STATUS_FORMAT, + GST_NVENC_STATUS_ARGS (status)); +#ifdef G_OS_WIN32 + if (task->event_handle) { + SetEvent (task->event_handle); + } +#endif + } + gst_nv_encoder_device_unlock (self); + + GST_NV_ENCODER_LOCK (self); + g_queue_push_tail (&priv->output_tasks, task); + g_cond_broadcast (&priv->cond); + GST_NV_ENCODER_UNLOCK (self); + + g_clear_pointer (&priv->encoding_thread, g_thread_join); + gst_nv_encoder_reset (self); + + if (locked) + GST_VIDEO_ENCODER_STREAM_LOCK (self); + + return TRUE; +} + +#ifdef GST_CUDA_HAS_D3D +static gboolean +gst_nv_encoder_open_d3d11_device (GstNvEncoder * self) +{ + GstNvEncoderPrivate *priv = self->priv; + ComPtr < ID3D10Multithread > multi_thread; + ID3D11Device *device_handle; + HRESULT hr; + + if (!gst_d3d11_ensure_element_data_for_adapter_luid (GST_ELEMENT (self), + priv->dxgi_adapter_luid, &priv->device)) { + GST_ERROR_OBJECT (self, "Cannot create d3d11device"); + return FALSE; + } + + device_handle = gst_d3d11_device_get_device_handle (priv->device); + hr = device_handle->QueryInterface (IID_PPV_ARGS (&multi_thread)); + if (!gst_d3d11_result (hr, priv->device)) { + GST_ERROR_OBJECT (self, "ID3D10Multithread interface is unavailable"); + gst_clear_object (&priv->device); + + return FALSE; + } + + multi_thread->SetMultithreadProtected (TRUE); + + return TRUE; +} +#endif + +static gboolean +gst_nv_encoder_open (GstVideoEncoder * encoder) +{ + GstNvEncoder *self = GST_NV_ENCODER (encoder); + GstNvEncoderPrivate *priv = self->priv; + + switch (priv->selected_device_mode) { + case GST_NV_ENCODER_DEVICE_AUTO_SELECT: + /* Will open GPU later */ + return TRUE; +#ifdef GST_CUDA_HAS_D3D + case GST_NV_ENCODER_DEVICE_D3D11: + return gst_nv_encoder_open_d3d11_device (self); +#endif + case GST_NV_ENCODER_DEVICE_CUDA: + if (!gst_cuda_ensure_element_context (GST_ELEMENT_CAST (encoder), + priv->cuda_device_id, &priv->context)) { + GST_ERROR_OBJECT (self, "failed to create CUDA context"); + return FALSE; + } + break; + default: + g_assert_not_reached (); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_nv_encoder_close (GstVideoEncoder * encoder) +{ + GstNvEncoder *self = GST_NV_ENCODER (encoder); + GstNvEncoderPrivate *priv = self->priv; + + gst_clear_object (&priv->context); +#ifdef GST_CUDA_HAS_D3D + gst_clear_d3d11_fence (&priv->fence); + gst_clear_object (&priv->device); +#endif + + return TRUE; +} + +static gboolean +gst_nv_encoder_stop (GstVideoEncoder * encoder) +{ + GstNvEncoder *self = GST_NV_ENCODER (encoder); + GstNvEncoderPrivate *priv = self->priv; + + GST_DEBUG_OBJECT (self, "Stop"); + + gst_nv_encoder_drain (self, FALSE); + + if (priv->subclass_device_mode == GST_NV_ENCODER_DEVICE_AUTO_SELECT) { + gst_clear_object (&priv->context); +#ifdef GST_CUDA_HAS_D3D + gst_clear_object (&priv->device); +#endif + priv->selected_device_mode = GST_NV_ENCODER_DEVICE_AUTO_SELECT; + } + + g_clear_pointer (&priv->input_state, gst_video_codec_state_unref); + + return TRUE; +} + +static gboolean +gst_nv_encoder_handle_context_query (GstNvEncoder * self, GstQuery * query) +{ + GstNvEncoderPrivate *priv = self->priv; + gboolean ret = FALSE; + + g_rec_mutex_lock (&priv->context_lock); + + switch (priv->selected_device_mode) { +#ifdef GST_CUDA_HAS_D3D + case GST_NV_ENCODER_DEVICE_D3D11: + ret = gst_d3d11_handle_context_query (GST_ELEMENT (self), + query, priv->device); + break; +#endif + case GST_NV_ENCODER_DEVICE_CUDA: + ret = gst_cuda_handle_context_query (GST_ELEMENT (self), + query, priv->context); + break; + default: + break; + } + + g_rec_mutex_unlock (&priv->context_lock); + + return ret; +} + +static gboolean +gst_nv_encoder_sink_query (GstVideoEncoder * encoder, GstQuery * query) +{ + GstNvEncoder *self = GST_NV_ENCODER (encoder); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + if (gst_nv_encoder_handle_context_query (self, query)) + return TRUE; + break; + default: + break; + } + + return GST_VIDEO_ENCODER_CLASS (parent_class)->sink_query (encoder, query); +} + +static gboolean +gst_nv_encoder_src_query (GstVideoEncoder * encoder, GstQuery * query) +{ + GstNvEncoder *self = GST_NV_ENCODER (encoder); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + if (gst_nv_encoder_handle_context_query (self, query)) + return TRUE; + break; + default: + break; + } + + return GST_VIDEO_ENCODER_CLASS (parent_class)->src_query (encoder, query); +} + +static gboolean +gst_nv_encoder_propose_allocation (GstVideoEncoder * encoder, GstQuery * query) +{ + GstNvEncoder *self = GST_NV_ENCODER (encoder); + GstNvEncoderPrivate *priv = self->priv; + GstVideoInfo info; + GstBufferPool *pool = NULL; + GstCaps *caps; + guint size; + GstStructure *config; + GstCapsFeatures *features; + guint min_buffers; + + gst_query_parse_allocation (query, &caps, NULL); + if (!caps) { + GST_WARNING_OBJECT (self, "null caps in query"); + return FALSE; + } + + if (!gst_video_info_from_caps (&info, caps)) { + GST_WARNING_OBJECT (self, "Failed to convert caps into info"); + return FALSE; + } + + features = gst_caps_get_features (caps, 0); + min_buffers = gst_nv_encoder_get_task_size (self); + + switch (priv->subclass_device_mode) { + case GST_NV_ENCODER_DEVICE_AUTO_SELECT: + /* Use upstream pool in case of auto select mode. We don't know which + * GPU to use at this moment */ + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, nullptr); + gst_query_add_allocation_pool (query, nullptr, info.size, min_buffers, 0); + return TRUE; +#ifdef GST_CUDA_HAS_D3D + case GST_NV_ENCODER_DEVICE_D3D11: + if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { + GST_DEBUG_OBJECT (self, "upstream support d3d11 memory"); + pool = gst_d3d11_buffer_pool_new (priv->device); + } + break; +#endif + case GST_NV_ENCODER_DEVICE_CUDA: + if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY)) { + GST_DEBUG_OBJECT (self, "upstream support CUDA memory"); + pool = gst_cuda_buffer_pool_new (priv->context); + } + break; + default: + g_assert_not_reached (); + return FALSE; + } + + if (!pool) + pool = gst_video_buffer_pool_new (); + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + + + size = GST_VIDEO_INFO_SIZE (&info); + gst_buffer_pool_config_set_params (config, caps, size, min_buffers, 0); + + if (!gst_buffer_pool_set_config (pool, config)) { + GST_WARNING_OBJECT (self, "Failed to set pool config"); + gst_object_unref (pool); + return FALSE; + } + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, NULL, &size, NULL, NULL); + gst_structure_free (config); + + gst_query_add_allocation_pool (query, pool, size, min_buffers, 0); + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + gst_object_unref (pool); + + return TRUE; +} + +/* called with lock */ +static void +gst_nv_encoder_task_reset (GstNvEncoder * self, GstNvEncoderTask * task) +{ + GstNvEncoderPrivate *priv = self->priv; + + if (!task) + return; + + if (task->buffer) { + gst_nv_encoder_device_lock (self); + if (priv->session) { + NvEncUnmapInputResource (priv->session, + task->mapped_resource.mappedResource); + NvEncUnregisterResource (priv->session, + task->register_resource.registeredResource); + } + gst_nv_encoder_device_unlock (self); + + gst_buffer_unmap (task->buffer, &task->map_info); + gst_clear_buffer (&task->buffer); + } +#ifdef G_OS_WIN32 + if (task->event_handle) + ResetEvent (task->event_handle); +#endif + + task->is_eos = FALSE; + + g_queue_push_head (&priv->free_tasks, task); +} + +static gboolean +gst_nv_encoder_create_event_handle (GstNvEncoder * self, gpointer session, + gpointer * event_handle) +{ +#ifdef G_OS_WIN32 + NV_ENC_EVENT_PARAMS event_params = { 0, }; + NVENCSTATUS status; + + event_params.version = gst_nvenc_get_event_params_version (); + event_params.completionEvent = CreateEvent (NULL, FALSE, FALSE, NULL); + status = NvEncRegisterAsyncEvent (session, &event_params); + + if (status != NV_ENC_SUCCESS) { + GST_ERROR_OBJECT (self, + "Failed to register async event handle, status %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + CloseHandle (event_params.completionEvent); + return FALSE; + } + + *event_handle = event_params.completionEvent; +#endif + + return TRUE; +} + +static gboolean +gst_d3d11_encoder_wait_for_event_handle (GstNvEncoder * self, + gpointer event_handle) +{ +#ifdef G_OS_WIN32 + /* NVCODEC SDK uses 20s */ + if (WaitForSingleObject (event_handle, 20000) == WAIT_FAILED) { + GST_ERROR_OBJECT (self, "Failed to wait for completion event"); + return FALSE; + } +#endif + + return TRUE; +} + +static void +gst_nv_encoder_destroy_event_handle (GstNvEncoder * self, gpointer session, + gpointer event_handle) +{ +#ifdef G_OS_WIN32 + NV_ENC_EVENT_PARAMS event_params = { 0, }; + NVENCSTATUS status; + + event_params.version = gst_nvenc_get_event_params_version (); + event_params.completionEvent = event_handle; + status = NvEncUnregisterAsyncEvent (session, &event_params); + CloseHandle (event_handle); + + if (status != NV_ENC_SUCCESS) { + GST_ERROR_OBJECT (self, + "Failed to unregister async event handle, status %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + } +#endif +} + +static void +gst_nv_encoder_task_clear (GstNvEncoderTask * task) +{ + GstNvEncoder *self; + GstNvEncoderPrivate *priv; + + if (!task) + return; + + self = task->encoder; + priv = self->priv; + + if (priv->session) { + gst_nv_encoder_device_lock (self); + if (task->buffer) { + NvEncUnmapInputResource (priv->session, + task->mapped_resource.mappedResource); + NvEncUnregisterResource (priv->session, + task->register_resource.registeredResource); + } + if (task->output_ptr) + NvEncDestroyBitstreamBuffer (priv->session, task->output_ptr); + if (task->input_buffer.inputBuffer) + NvEncDestroyInputBuffer (priv->session, task->input_buffer.inputBuffer); + if (task->event_handle) { + gst_nv_encoder_destroy_event_handle (self, priv->session, + task->event_handle); + } + + gst_nv_encoder_device_unlock (self); + } + + if (task->buffer) { + gst_buffer_unmap (task->buffer, &task->map_info); + gst_clear_buffer (&task->buffer); + } + + memset (task, 0, sizeof (GstNvEncoderTask)); +} + +static NV_ENC_PIC_STRUCT +gst_nv_encoder_get_pic_struct (GstNvEncoder * self, GstBuffer * buffer) +{ + GstNvEncoderPrivate *priv = self->priv; + GstVideoInfo *info = &priv->input_state->info; + + if (!GST_VIDEO_INFO_IS_INTERLACED (info)) + return NV_ENC_PIC_STRUCT_FRAME; + + if (GST_VIDEO_INFO_INTERLACE_MODE (info) == GST_VIDEO_INTERLACE_MODE_MIXED) { + if (!GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_FLAG_INTERLACED)) { + return NV_ENC_PIC_STRUCT_FRAME; + } + + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_FLAG_TFF)) + return NV_ENC_PIC_STRUCT_FIELD_TOP_BOTTOM; + + return NV_ENC_PIC_STRUCT_FIELD_BOTTOM_TOP; + } + + switch (GST_VIDEO_INFO_FIELD_ORDER (info)) { + case GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST: + return NV_ENC_PIC_STRUCT_FIELD_TOP_BOTTOM; + break; + case GST_VIDEO_FIELD_ORDER_BOTTOM_FIELD_FIRST: + return NV_ENC_PIC_STRUCT_FIELD_BOTTOM_TOP; + break; + default: + break; + } + + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_FLAG_TFF)) + return NV_ENC_PIC_STRUCT_FIELD_TOP_BOTTOM; + + return NV_ENC_PIC_STRUCT_FIELD_BOTTOM_TOP; +} + +static GstFlowReturn +gst_nv_encoder_encode_frame (GstNvEncoder * self, + GstVideoCodecFrame * frame, GstNvEncoderTask * task) +{ + GstNvEncoderPrivate *priv = self->priv; + NV_ENC_PIC_PARAMS pic_params = { 0, }; + NVENCSTATUS status; + guint retry_count = 0; + const guint retry_threshold = 100; + + pic_params.version = gst_nvenc_get_pic_params_version (); + if (task->buffer) { + pic_params.inputWidth = task->register_resource.width; + pic_params.inputHeight = task->register_resource.height; + pic_params.inputPitch = task->register_resource.pitch; + pic_params.inputBuffer = task->mapped_resource.mappedResource; + pic_params.bufferFmt = task->mapped_resource.mappedBufferFmt; + } else { + pic_params.inputWidth = task->input_buffer.width; + pic_params.inputHeight = task->input_buffer.height; + pic_params.inputPitch = task->lk_input_buffer.pitch; + pic_params.inputBuffer = task->input_buffer.inputBuffer; + pic_params.bufferFmt = task->input_buffer.bufferFmt; + } + + pic_params.frameIdx = frame->system_frame_number; + pic_params.inputTimeStamp = frame->pts; + pic_params.inputDuration = frame->duration; + pic_params.outputBitstream = task->output_ptr; + pic_params.completionEvent = task->event_handle; + pic_params.pictureStruct = gst_nv_encoder_get_pic_struct (self, task->buffer); + if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame)) + pic_params.encodePicFlags = NV_ENC_PIC_FLAG_FORCEIDR; + + do { + gst_nv_encoder_device_lock (self); + status = NvEncEncodePicture (priv->session, &pic_params); + gst_nv_encoder_device_unlock (self); + + if (status == NV_ENC_ERR_ENCODER_BUSY) { + if (retry_count < 100) { + GST_DEBUG_OBJECT (self, "GPU is busy, retry count (%d/%d)", retry_count, + retry_threshold); + retry_count++; + + /* Magic number 1ms */ + g_usleep (1000); + continue; + } else { + GST_ERROR_OBJECT (self, "GPU is keep busy, give up"); + break; + } + } + + break; + } while (TRUE); + + GST_NV_ENCODER_LOCK (self); + if (status != NV_ENC_SUCCESS && status != NV_ENC_ERR_NEED_MORE_INPUT) { + GST_ERROR_OBJECT (self, "Encode return %" GST_NVENC_STATUS_FORMAT, + GST_NVENC_STATUS_ARGS (status)); + gst_nv_encoder_task_reset (self, task); + GST_NV_ENCODER_UNLOCK (self); + + return GST_FLOW_ERROR; + } + + gst_video_codec_frame_set_user_data (frame, task, NULL); + g_queue_push_tail (&priv->output_tasks, task); + g_cond_broadcast (&priv->cond); + GST_NV_ENCODER_UNLOCK (self); + + return GST_FLOW_OK; +} + +static GstVideoCodecFrame * +gst_nv_encoder_find_output_frame (GstVideoEncoder * self, + GstNvEncoderTask * task) +{ + GList *frames, *iter; + GstVideoCodecFrame *ret = NULL; + + frames = gst_video_encoder_get_frames (self); + + for (iter = frames; iter; iter = g_list_next (iter)) { + GstVideoCodecFrame *frame = (GstVideoCodecFrame *) iter->data; + GstNvEncoderTask *other = (GstNvEncoderTask *) + gst_video_codec_frame_get_user_data (frame); + + if (!other) + continue; + + if (other == task) { + ret = frame; + break; + } + } + + if (ret) + gst_video_codec_frame_ref (ret); + + if (frames) + g_list_free_full (frames, (GDestroyNotify) gst_video_codec_frame_unref); + + return ret; +} + +static gpointer +gst_nv_encoder_thread_func (GstNvEncoder * self) +{ + GstVideoEncoder *encoder = GST_VIDEO_ENCODER (self); + GstNvEncoderClass *klass = GST_NV_ENCODER_GET_CLASS (self); + GstNvEncoderPrivate *priv = self->priv; + GstNvEncoderTask *task = NULL; + + do { + NV_ENC_LOCK_BITSTREAM bitstream = { 0, }; + NVENCSTATUS status; + GstVideoCodecFrame *frame; + GstFlowReturn ret; + + GST_NV_ENCODER_LOCK (self); + while ((task = (GstNvEncoderTask *) + g_queue_pop_head (&priv->output_tasks)) == NULL) { + g_cond_wait (&priv->cond, &priv->lock); + } + GST_NV_ENCODER_UNLOCK (self); + + if (task->event_handle) { + if (!gst_d3d11_encoder_wait_for_event_handle (self, task->event_handle)) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), + ("Failed to wait for event signal")); + goto error; + } + } + + if (task->is_eos) { + GST_INFO_OBJECT (self, "Got EOS packet"); + + GST_NV_ENCODER_LOCK (self); + gst_nv_encoder_task_reset (self, task); + g_cond_broadcast (&priv->cond); + GST_NV_ENCODER_UNLOCK (self); + + goto exit_thread; + } + + frame = gst_nv_encoder_find_output_frame (encoder, task); + if (!frame) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), + ("Failed to find associated codec frame")); + goto error; + } + + if (!gst_nv_encoder_device_lock (self)) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), + ("Failed to lock device")); + goto error; + } + + bitstream.version = gst_nvenc_get_lock_bitstream_version (); + bitstream.outputBitstream = task->output_ptr; + + status = NvEncLockBitstream (priv->session, &bitstream); + if (status != NV_ENC_SUCCESS) { + gst_nv_encoder_device_unlock (self); + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), + ("Failed to lock bitstream, status: %" GST_NVENC_STATUS_FORMAT, + GST_NVENC_STATUS_ARGS (status))); + goto error; + } + + if (klass->create_output_buffer) { + frame->output_buffer = klass->create_output_buffer (self, &bitstream); + } else { + frame->output_buffer = + gst_buffer_new_memdup (bitstream.bitstreamBufferPtr, + bitstream.bitstreamSizeInBytes); + } + + GST_BUFFER_FLAG_SET (frame->output_buffer, GST_BUFFER_FLAG_MARKER); + + if (bitstream.pictureType == NV_ENC_PIC_TYPE_IDR) + GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); + + NvEncUnlockBitstream (priv->session, task->output_ptr); + gst_nv_encoder_device_unlock (self); + + frame->dts = frame->pts - priv->dts_offset; + frame->pts = bitstream.outputTimeStamp; + frame->duration = bitstream.outputDuration; + + ret = gst_video_encoder_finish_frame (encoder, frame); + if (ret != GST_FLOW_OK) { + GST_INFO_OBJECT (self, + "Finish frame returned %s", gst_flow_get_name (ret)); + } + + GST_NV_ENCODER_LOCK (self); + gst_nv_encoder_task_reset (self, task); + priv->last_flow = ret; + g_cond_broadcast (&priv->cond); + GST_NV_ENCODER_UNLOCK (self); + + if (ret != GST_FLOW_OK) { + GST_INFO_OBJECT (self, "Push returned %s", gst_flow_get_name (ret)); + goto exit_thread; + } + } while (TRUE); + +exit_thread: + { + GST_INFO_OBJECT (self, "Exiting thread"); + + return NULL; + + } +error: + { + GST_NV_ENCODER_LOCK (self); + gst_nv_encoder_task_reset (self, task); + priv->last_flow = GST_FLOW_ERROR; + g_cond_broadcast (&priv->cond); + GST_NV_ENCODER_UNLOCK (self); + + goto exit_thread; + } +} + +static guint +gst_nv_encoder_calculate_task_pool_size (GstNvEncoder * self, + NV_ENC_CONFIG * config) +{ + guint num_tasks; + + /* At least 4 surfaces are required as documented by Nvidia Encoder guide */ + num_tasks = 4; + + /* lookahead depth */ + num_tasks += config->rcParams.lookaheadDepth; + + /* B frames + 1 */ + num_tasks += MAX (0, config->frameIntervalP - 1) + 1; + + GST_DEBUG_OBJECT (self, "Calculated task pool size: %d " + "(lookahead %d, frameIntervalP %d)", + num_tasks, config->rcParams.lookaheadDepth, config->frameIntervalP); + + return num_tasks; +} + +static gboolean +gst_nv_encoder_open_encode_session (GstNvEncoder * self, gpointer * session) +{ + GstNvEncoderPrivate *priv = self->priv; + NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS session_params = { 0, }; + session_params.version = + gst_nvenc_get_open_encode_session_ex_params_version (); + session_params.apiVersion = gst_nvenc_get_api_version (); + NVENCSTATUS status; + + switch (priv->selected_device_mode) { +#ifdef GST_CUDA_HAS_D3D + case GST_NV_ENCODER_DEVICE_D3D11: + session_params.deviceType = NV_ENC_DEVICE_TYPE_DIRECTX; + session_params.device = gst_d3d11_device_get_device_handle (priv->device); + break; +#endif + case GST_NV_ENCODER_DEVICE_CUDA: + session_params.deviceType = NV_ENC_DEVICE_TYPE_CUDA; + session_params.device = gst_cuda_context_get_handle (priv->context); + break; + default: + g_assert_not_reached (); + return FALSE; + } + + status = NvEncOpenEncodeSessionEx (&session_params, session); + if (status != NV_ENC_SUCCESS) { + GST_ERROR_OBJECT (self, "Failed to open session, status: %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + return FALSE; + } + + return TRUE; +} + +#ifdef GST_CUDA_HAS_D3D +static GstBufferPool * +gst_nv_encoder_create_d3d11_pool (GstNvEncoder * self, + GstVideoCodecState * state) +{ + GstNvEncoderPrivate *priv = self->priv; + GstStructure *config; + GstBufferPool *pool = NULL; + GstD3D11AllocationParams *params; + + params = gst_d3d11_allocation_params_new (priv->device, &state->info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, 0, D3D11_RESOURCE_MISC_SHARED); + + pool = gst_d3d11_buffer_pool_new (priv->device); + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_d3d11_allocation_params (config, params); + gst_d3d11_allocation_params_free (params); + + gst_buffer_pool_config_set_params (config, state->caps, + GST_VIDEO_INFO_SIZE (&state->info), 0, 0); + if (!gst_buffer_pool_set_config (pool, config)) { + GST_ERROR_OBJECT (self, "Failed to set pool config"); + gst_object_unref (pool); + + return NULL; + } + + if (!gst_buffer_pool_set_active (pool, TRUE)) { + GST_ERROR_OBJECT (self, "Failed to set active"); + gst_object_unref (pool); + return NULL; + } + + return pool; +} +#endif + +static GstBufferPool * +gst_nv_encoder_create_pool (GstNvEncoder * self, GstVideoCodecState * state) +{ + GstNvEncoderPrivate *priv = self->priv; + GstStructure *config; + GstBufferPool *pool = NULL; + + /* At this moment device type must be selected already */ + switch (priv->selected_device_mode) { +#ifdef GST_CUDA_HAS_D3D + case GST_NV_ENCODER_DEVICE_D3D11: + return gst_nv_encoder_create_d3d11_pool (self, state); +#endif + case GST_NV_ENCODER_DEVICE_CUDA: + pool = gst_cuda_buffer_pool_new (priv->context); + break; + default: + g_assert_not_reached (); + return FALSE; + } + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_params (config, state->caps, + GST_VIDEO_INFO_SIZE (&state->info), 0, 0); + if (!gst_buffer_pool_set_config (pool, config)) { + GST_ERROR_OBJECT (self, "Failed to set pool config"); + gst_object_unref (pool); + + return NULL; + } + + if (!gst_buffer_pool_set_active (pool, TRUE)) { + GST_ERROR_OBJECT (self, "Failed to set active"); + gst_object_unref (pool); + return NULL; + } + + return pool; +} + +static gboolean +gst_nv_encoder_init_session (GstNvEncoder * self, GstBuffer * in_buf) +{ + GstNvEncoderPrivate *priv = self->priv; + GstNvEncoderClass *klass = GST_NV_ENCODER_GET_CLASS (self); + GstVideoCodecState *state = priv->input_state; + GstVideoInfo *info = &state->info; + NVENCSTATUS status; + guint task_pool_size; + gint fps_n, fps_d; + GstClockTime frame_duration, min_latency, max_latency; + guint i; + + gst_nv_encoder_reset (self); + + memset (&priv->init_params, 0, sizeof (NV_ENC_INITIALIZE_PARAMS)); + memset (&priv->config, 0, sizeof (NV_ENC_CONFIG)); + + if (priv->selected_device_mode == GST_NV_ENCODER_DEVICE_AUTO_SELECT) { + GstNvEncoderDeviceData data; + gboolean ret; + + if (!in_buf) { + GST_DEBUG_OBJECT (self, "Unknown device mode, open session later"); + return TRUE; + } + + if (!klass->select_device (self, info, in_buf, &data)) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), + ("Failed to select device mode")); + return FALSE; + } + + GST_DEBUG_OBJECT (self, + "Selected device mode: %d, cuda-device-id: %d, adapter-luid %" + G_GINT64_FORMAT, data.device_mode, data.cuda_device_id, + data.adapter_luid); + + g_assert (data.device_mode == GST_NV_ENCODER_DEVICE_CUDA || + data.device_mode == GST_NV_ENCODER_DEVICE_D3D11); + + g_rec_mutex_lock (&priv->context_lock); + priv->selected_device_mode = data.device_mode; + priv->cuda_device_id = data.cuda_device_id; + priv->dxgi_adapter_luid = data.adapter_luid; + gst_clear_object (&priv->context); + if (data.device_mode == GST_NV_ENCODER_DEVICE_CUDA) + priv->context = (GstCudaContext *) data.device; +#ifdef GST_CUDA_HAS_D3D + gst_clear_object (&priv->device); + if (data.device_mode == GST_NV_ENCODER_DEVICE_D3D11) + priv->device = (GstD3D11Device *) data.device; +#endif + + ret = gst_nv_encoder_open (GST_VIDEO_ENCODER (self)); + g_rec_mutex_unlock (&priv->context_lock); + + if (!ret) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), + ("Failed to open device")); + return FALSE; + } + } + + priv->internal_pool = gst_nv_encoder_create_pool (self, state); + if (!priv->internal_pool) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), + ("Failed to create internal pool")); + return FALSE; + } + + if (!gst_nv_encoder_device_lock (self)) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), ("Failed to lock device")); + gst_nv_encoder_reset (self); + return FALSE; + } + + if (!gst_nv_encoder_open_encode_session (self, &priv->session)) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), + ("Failed to open session")); + goto error; + } + + if (!klass->set_format (self, state, priv->session, &priv->init_params, + &priv->config)) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), ("Failed to set format")); + goto error; + } + + priv->init_params.encodeConfig = &priv->config; + status = NvEncInitializeEncoder (priv->session, &priv->init_params); + if (status != NV_ENC_SUCCESS) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), + ("Failed to init encoder, status: %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status))); + goto error; + } + + if (priv->selected_device_mode == GST_NV_ENCODER_DEVICE_CUDA && + gst_nvenc_have_set_io_cuda_streams ()) { + CUresult cuda_ret = CuStreamCreate (&priv->cuda_stream, CU_STREAM_DEFAULT); + + if (gst_cuda_result (cuda_ret)) { + status = NvEncSetIOCudaStreams (priv->session, + (NV_ENC_CUSTREAM_PTR) & priv->cuda_stream, + (NV_ENC_CUSTREAM_PTR) & priv->cuda_stream); + if (status != NV_ENC_SUCCESS) { + GST_WARNING_OBJECT (self, "NvEncSetIOCudaStreams failed, status: %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + } + } + } + + task_pool_size = gst_nv_encoder_calculate_task_pool_size (self, + &priv->config); + g_array_set_size (priv->task_pool, task_pool_size); + + for (i = 0; i < task_pool_size; i++) { + NV_ENC_CREATE_BITSTREAM_BUFFER buffer_params = { 0, }; + GstNvEncoderTask *task = (GstNvEncoderTask *) + & g_array_index (priv->task_pool, GstNvEncoderTask, i); + + task->encoder = self; + + buffer_params.version = gst_nvenc_get_create_bitstream_buffer_version (); + status = NvEncCreateBitstreamBuffer (priv->session, &buffer_params); + + if (status != NV_ENC_SUCCESS) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), + ("Failed to create bitstream buffer, status: %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status))); + goto error; + } + + task->output_ptr = buffer_params.bitstreamBuffer; + + if (priv->init_params.enableEncodeAsync) { + if (!gst_nv_encoder_create_event_handle (self, + priv->session, &task->event_handle)) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), + ("Failed to create async event handle")); + goto error; + } + } + + g_queue_push_tail (&priv->free_tasks, task); + } + gst_nv_encoder_device_unlock (self); + + if (!klass->set_output_state (self, priv->input_state, priv->session)) { + GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL), + ("Failed to set output state")); + gst_nv_encoder_reset (self); + return FALSE; + } + + priv->encoding_thread = g_thread_new ("GstNvEncoderThread", + (GThreadFunc) gst_nv_encoder_thread_func, self); + + if (info->fps_n > 0 && info->fps_d > 0) { + fps_n = info->fps_n; + fps_d = info->fps_d; + } else { + fps_n = 25; + fps_d = 1; + } + + frame_duration = gst_util_uint64_scale (GST_SECOND, fps_d, fps_n); + + priv->dts_offset = 0; + /* Calculate DTS offset for B frame. NVENC does not provide DTS */ + if (priv->config.frameIntervalP > 1) + priv->dts_offset = frame_duration * (priv->config.frameIntervalP - 1); + + min_latency = priv->dts_offset + + priv->config.rcParams.lookaheadDepth * frame_duration; + max_latency = frame_duration * priv->task_pool->len; + gst_video_encoder_set_latency (GST_VIDEO_ENCODER (self), + min_latency, max_latency); + + return TRUE; + +error: + gst_nv_encoder_device_unlock (self); + + gst_nv_encoder_reset (self); + + return FALSE; +} + +static gboolean +gst_nv_encoder_reconfigure_session (GstNvEncoder * self) +{ + GstNvEncoderPrivate *priv = self->priv; + NV_ENC_RECONFIGURE_PARAMS params = { 0, }; + NVENCSTATUS status; + + if (!priv->session) { + GST_WARNING_OBJECT (self, + "Encoding session was not configured, open session"); + gst_nv_encoder_drain (self, TRUE); + + return gst_nv_encoder_init_session (self, nullptr); + } + + params.version = gst_nvenc_get_reconfigure_params_version (); + params.reInitEncodeParams = priv->init_params; + params.reInitEncodeParams.encodeConfig = &priv->config; + + status = NvEncReconfigureEncoder (priv->session, ¶ms); + if (status != NV_ENC_SUCCESS) { + GST_WARNING_OBJECT (self, "Failed to reconfigure encoder, status %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + gst_nv_encoder_drain (self, TRUE); + + return gst_nv_encoder_init_session (self, nullptr); + } + + return TRUE; +} + +static gboolean +gst_nv_encoder_set_format (GstVideoEncoder * encoder, + GstVideoCodecState * state) +{ + GstNvEncoder *self = GST_NV_ENCODER (encoder); + GstNvEncoderPrivate *priv = self->priv; + + gst_nv_encoder_drain (self, TRUE); + + g_clear_pointer (&priv->input_state, gst_video_codec_state_unref); + priv->input_state = gst_video_codec_state_ref (state); + priv->last_flow = GST_FLOW_OK; + + /* select device again on next buffer */ + if (priv->subclass_device_mode == GST_NV_ENCODER_DEVICE_AUTO_SELECT) + priv->selected_device_mode = GST_NV_ENCODER_DEVICE_AUTO_SELECT; + + return gst_nv_encoder_init_session (self, nullptr); +} + +static NV_ENC_BUFFER_FORMAT +gst_nv_encoder_get_buffer_format (GstNvEncoder * self, GstVideoFormat format) +{ + switch (format) { + case GST_VIDEO_FORMAT_NV12: + return NV_ENC_BUFFER_FORMAT_NV12; + case GST_VIDEO_FORMAT_Y444: + return NV_ENC_BUFFER_FORMAT_YUV444; + case GST_VIDEO_FORMAT_P010_10LE: + return NV_ENC_BUFFER_FORMAT_YUV420_10BIT; + case GST_VIDEO_FORMAT_Y444_16LE: + return NV_ENC_BUFFER_FORMAT_YUV444_10BIT; + default: + GST_ERROR_OBJECT (self, "Unexpected format %s", + gst_video_format_to_string (format)); + g_assert_not_reached (); + break; + } + + return NV_ENC_BUFFER_FORMAT_UNDEFINED; +} + +static GstFlowReturn +gst_nv_encoder_copy_system (GstNvEncoder * self, const GstVideoInfo * info, + GstBuffer * buffer, gpointer session, GstNvEncoderTask * task) +{ + NVENCSTATUS status; + GstVideoFrame frame; + guint8 *dst_data; + NV_ENC_BUFFER_FORMAT format; + + format = + gst_nv_encoder_get_buffer_format (self, GST_VIDEO_INFO_FORMAT (info)); + if (format == NV_ENC_BUFFER_FORMAT_UNDEFINED) + return GST_FLOW_ERROR; + + if (!gst_video_frame_map (&frame, info, buffer, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Failed to map buffer"); + return GST_FLOW_ERROR; + } + + if (!task->input_buffer.inputBuffer) { + NV_ENC_CREATE_INPUT_BUFFER input_buffer = { 0, }; + input_buffer.version = gst_nvenc_get_create_input_buffer_version (); + input_buffer.width = info->width; + input_buffer.height = info->height; + input_buffer.bufferFmt = format; + + status = NvEncCreateInputBuffer (session, &input_buffer); + if (status != NV_ENC_SUCCESS) { + GST_ERROR_OBJECT (self, "Failed to create input buffer, status %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + gst_video_frame_unmap (&frame); + return GST_FLOW_ERROR; + } + + task->input_buffer = input_buffer; + } + + task->lk_input_buffer.version = gst_nvenc_get_lock_input_buffer_version (); + task->lk_input_buffer.inputBuffer = task->input_buffer.inputBuffer; + status = NvEncLockInputBuffer (session, &task->lk_input_buffer); + if (status != NV_ENC_SUCCESS) { + GST_ERROR_OBJECT (self, "Failed to lock input buffer, status %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + gst_video_frame_unmap (&frame); + return GST_FLOW_ERROR; + } + + dst_data = (guint8 *) task->lk_input_buffer.bufferDataPtr; + + for (guint i = 0; i < GST_VIDEO_FRAME_N_PLANES (&frame); i++) { + guint8 *src_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, i); + guint width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&frame, i); + guint stride = GST_VIDEO_FRAME_PLANE_STRIDE (&frame, i); + guint height = GST_VIDEO_FRAME_COMP_HEIGHT (&frame, i); + + for (guint j = 0; j < height; j++) { + memcpy (dst_data, src_data, width_in_bytes); + dst_data += task->lk_input_buffer.pitch; + src_data += stride; + } + } + + NvEncUnlockInputBuffer (session, task->input_buffer.inputBuffer); + gst_video_frame_unmap (&frame); + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_nv_encoder_prepare_task_input_cuda (GstNvEncoder * self, + const GstVideoInfo * info, GstBuffer * buffer, gpointer session, + GstNvEncoderTask * task) +{ + GstNvEncoderPrivate *priv = self->priv; + GstMemory *mem; + GstCudaMemory *cmem; + NVENCSTATUS status; + + mem = gst_buffer_peek_memory (buffer, 0); + if (!gst_is_cuda_memory (mem)) { + GST_LOG_OBJECT (self, "Not a CUDA buffer, system copy"); + return gst_nv_encoder_copy_system (self, info, buffer, session, task); + } + + cmem = GST_CUDA_MEMORY_CAST (mem); + if (cmem->context != priv->context) { + GST_LOG_OBJECT (self, "Different context, system copy"); + return gst_nv_encoder_copy_system (self, info, buffer, session, task); + } + + task->buffer = gst_buffer_ref (buffer); + if (!gst_buffer_map (task->buffer, &task->map_info, + (GstMapFlags) (GST_MAP_READ | GST_MAP_CUDA))) { + GST_ERROR_OBJECT (self, "Failed to map buffer"); + gst_clear_buffer (&task->buffer); + + return GST_FLOW_ERROR; + } + + cmem = (GstCudaMemory *) gst_buffer_peek_memory (task->buffer, 0); + + task->register_resource.version = gst_nvenc_get_register_resource_version (); + task->register_resource.resourceType = + NV_ENC_INPUT_RESOURCE_TYPE_CUDADEVICEPTR; + task->register_resource.width = cmem->info.width; + task->register_resource.height = cmem->info.height; + task->register_resource.pitch = cmem->info.stride0; + task->register_resource.resourceToRegister = task->map_info.data; + task->register_resource.bufferFormat = + gst_nv_encoder_get_buffer_format (self, GST_VIDEO_INFO_FORMAT (info)); + if (task->register_resource.bufferFormat == NV_ENC_BUFFER_FORMAT_UNDEFINED) + return GST_FLOW_ERROR; + + status = NvEncRegisterResource (session, &task->register_resource); + if (status != NV_ENC_SUCCESS) { + GST_ERROR_OBJECT (self, "Failed to register resource, status %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + + gst_buffer_unmap (task->buffer, &task->map_info); + gst_clear_buffer (&task->buffer); + + return GST_FLOW_ERROR; + } + + task->mapped_resource.version = gst_nvenc_get_map_input_resource_version (); + task->mapped_resource.registeredResource = + task->register_resource.registeredResource; + status = NvEncMapInputResource (session, &task->mapped_resource); + if (status != NV_ENC_SUCCESS) { + GST_ERROR_OBJECT (self, "Failed to map input resource, status %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + NvEncUnregisterResource (session, + task->register_resource.registeredResource); + + gst_buffer_unmap (task->buffer, &task->map_info); + gst_clear_buffer (&task->buffer); + + return GST_FLOW_ERROR; + } + + return GST_FLOW_OK; +} + +#ifdef GST_CUDA_HAS_D3D +static GstBuffer * +gst_nv_encoder_copy_d3d11 (GstNvEncoder * self, + GstBuffer * src_buffer, GstBufferPool * pool, gboolean shared) +{ + GstNvEncoderPrivate *priv = self->priv; + D3D11_TEXTURE2D_DESC src_desc, dst_desc; + D3D11_BOX src_box; + guint subresource_idx; + GstMemory *src_mem, *dst_mem; + GstMapInfo src_info, dst_info; + ID3D11Texture2D *src_tex, *dst_tex; + ID3D11Device *device_handle; + ID3D11DeviceContext *device_context; + GstBuffer *dst_buffer; + GstFlowReturn ret; + ComPtr < IDXGIResource > dxgi_resource; + ComPtr < ID3D11Texture2D > shared_texture; + HANDLE shared_handle; + GstD3D11Device *device; + HRESULT hr; + + ret = gst_buffer_pool_acquire_buffer (pool, &dst_buffer, NULL); + if (ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (self, "Failed to acquire buffer"); + return NULL; + } + + src_mem = gst_buffer_peek_memory (src_buffer, 0); + dst_mem = gst_buffer_peek_memory (dst_buffer, 0); + + device = GST_D3D11_MEMORY_CAST (src_mem)->device; + + device_handle = gst_d3d11_device_get_device_handle (device); + device_context = gst_d3d11_device_get_device_context_handle (device); + + if (!gst_memory_map (src_mem, &src_info, + (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { + GST_WARNING ("Failed to map src memory"); + gst_buffer_unref (dst_buffer); + return NULL; + } + + if (!gst_memory_map (dst_mem, &dst_info, + (GstMapFlags) (GST_MAP_WRITE | GST_MAP_D3D11))) { + GST_WARNING ("Failed to map dst memory"); + gst_memory_unmap (src_mem, &src_info); + gst_buffer_unref (dst_buffer); + return NULL; + } + + src_tex = (ID3D11Texture2D *) src_info.data; + dst_tex = (ID3D11Texture2D *) dst_info.data; + + gst_d3d11_memory_get_texture_desc (GST_D3D11_MEMORY_CAST (src_mem), + &src_desc); + gst_d3d11_memory_get_texture_desc (GST_D3D11_MEMORY_CAST (dst_mem), + &dst_desc); + subresource_idx = + gst_d3d11_memory_get_subresource_index (GST_D3D11_MEMORY_CAST (src_mem)); + + if (shared) { + hr = dst_tex->QueryInterface (IID_PPV_ARGS (&dxgi_resource)); + if (!gst_d3d11_result (hr, priv->device)) { + GST_ERROR_OBJECT (self, + "IDXGIResource interface is not available, hr: 0x%x", (guint) hr); + goto error; + } + + hr = dxgi_resource->GetSharedHandle (&shared_handle); + if (!gst_d3d11_result (hr, priv->device)) { + GST_ERROR_OBJECT (self, "Failed to get shared handle, hr: 0x%x", + (guint) hr); + goto error; + } + + hr = device_handle->OpenSharedResource (shared_handle, + IID_PPV_ARGS (&shared_texture)); + + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Failed to get shared texture, hr: 0x%x", + (guint) hr); + goto error; + } + + dst_tex = shared_texture.Get (); + } + + src_box.left = 0; + src_box.top = 0; + src_box.front = 0; + src_box.back = 1; + src_box.right = MIN (src_desc.Width, dst_desc.Width); + src_box.bottom = MIN (src_desc.Height, dst_desc.Height); + + if (shared) { + if (priv->fence && priv->fence->device != device) + gst_clear_d3d11_fence (&priv->fence); + + if (!priv->fence) + priv->fence = gst_d3d11_device_create_fence (device); + + if (!priv->fence) { + GST_ERROR_OBJECT (self, "Couldn't crete fence"); + goto error; + } + + gst_d3d11_device_lock (device); + } + + device_context->CopySubresourceRegion (dst_tex, 0, + 0, 0, 0, src_tex, subresource_idx, &src_box); + + if (shared) { + if (!gst_d3d11_fence_signal (priv->fence) || + !gst_d3d11_fence_wait (priv->fence)) { + GST_ERROR_OBJECT (self, "Couldn't sync GPU operation"); + gst_d3d11_device_unlock (device); + gst_clear_d3d11_fence (&priv->fence); + goto error; + } + + gst_d3d11_device_unlock (device); + } + + gst_memory_unmap (dst_mem, &dst_info); + gst_memory_unmap (src_mem, &src_info); + + return dst_buffer; + +error: + gst_memory_unmap (dst_mem, &dst_info); + gst_memory_unmap (src_mem, &src_info); + gst_buffer_unref (dst_buffer); + + return NULL; +} + +static GstBuffer * +gst_nv_encoder_upload_d3d11_frame (GstNvEncoder * self, + const GstVideoInfo * info, GstBuffer * buffer, GstBufferPool * pool) +{ + GstD3D11Memory *dmem; + D3D11_TEXTURE2D_DESC desc; + + dmem = (GstD3D11Memory *) gst_buffer_peek_memory (buffer, 0); + + gst_d3d11_memory_get_texture_desc (dmem, &desc); + if (desc.Usage != D3D11_USAGE_DEFAULT) { + GST_TRACE_OBJECT (self, "Not a default usage texture, d3d11 copy"); + return gst_nv_encoder_copy_d3d11 (self, buffer, pool, FALSE); + } + + GST_TRACE_OBJECT (self, "Use input buffer without copy"); + + return gst_buffer_ref (buffer); +} + +static GstFlowReturn +gst_nv_encoder_prepare_task_input_d3d11 (GstNvEncoder * self, + const GstVideoInfo * info, GstBuffer * buffer, gpointer session, + GstBufferPool * pool, GstNvEncoderTask * task) +{ + GstNvEncoderPrivate *priv = self->priv; + GstMemory *mem; + GstD3D11Memory *dmem; + D3D11_TEXTURE2D_DESC desc; + NVENCSTATUS status; + + if (gst_buffer_n_memory (buffer) > 1) { + GST_LOG_OBJECT (self, "Not a native DXGI format, system copy"); + return gst_nv_encoder_copy_system (self, info, buffer, session, task); + } + + mem = gst_buffer_peek_memory (buffer, 0); + if (!gst_is_d3d11_memory (mem)) { + GST_LOG_OBJECT (self, "Not a D3D11 buffer, system copy"); + return gst_nv_encoder_copy_system (self, info, buffer, session, task); + } + + dmem = GST_D3D11_MEMORY_CAST (mem); + if (dmem->device != priv->device) { + gint64 adapter_luid; + + g_object_get (dmem->device, "adapter-luid", &adapter_luid, NULL); + if (adapter_luid == priv->dxgi_adapter_luid) { + GST_LOG_OBJECT (self, "Different device but same GPU, copy d3d11"); + task->buffer = gst_nv_encoder_copy_d3d11 (self, buffer, pool, TRUE); + } else { + GST_LOG_OBJECT (self, "Different device, system copy"); + return gst_nv_encoder_copy_system (self, info, buffer, session, task); + } + } + + if (!task->buffer) + task->buffer = gst_nv_encoder_upload_d3d11_frame (self, info, buffer, pool); + + if (!task->buffer) { + GST_ERROR_OBJECT (self, "Failed to upload buffer"); + return GST_FLOW_ERROR; + } + + if (!gst_buffer_map (task->buffer, &task->map_info, + (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { + GST_ERROR_OBJECT (self, "Failed to map buffer"); + gst_clear_buffer (&task->buffer); + + return GST_FLOW_ERROR; + } + + dmem = (GstD3D11Memory *) gst_buffer_peek_memory (task->buffer, 0); + gst_d3d11_memory_get_texture_desc (dmem, &desc); + + task->register_resource.version = gst_nvenc_get_register_resource_version (); + task->register_resource.resourceType = NV_ENC_INPUT_RESOURCE_TYPE_DIRECTX; + task->register_resource.width = desc.Width; + task->register_resource.height = desc.Height; + switch (desc.Format) { + case DXGI_FORMAT_NV12: + task->register_resource.bufferFormat = NV_ENC_BUFFER_FORMAT_NV12; + break; + case DXGI_FORMAT_P010: + task->register_resource.bufferFormat = NV_ENC_BUFFER_FORMAT_YUV420_10BIT; + break; + default: + GST_ERROR_OBJECT (self, "Unexpected DXGI format %d", desc.Format); + g_assert_not_reached (); + return GST_FLOW_ERROR; + } + + task->register_resource.subResourceIndex = + gst_d3d11_memory_get_subresource_index (dmem); + task->register_resource.resourceToRegister = + gst_d3d11_memory_get_resource_handle (dmem); + + status = NvEncRegisterResource (session, &task->register_resource); + if (status != NV_ENC_SUCCESS) { + GST_ERROR_OBJECT (self, "Failed to register resource, status %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + + gst_buffer_unmap (task->buffer, &task->map_info); + gst_clear_buffer (&task->buffer); + + return GST_FLOW_ERROR; + } + + task->mapped_resource.version = gst_nvenc_get_map_input_resource_version (); + task->mapped_resource.registeredResource = + task->register_resource.registeredResource; + status = NvEncMapInputResource (session, &task->mapped_resource); + if (status != NV_ENC_SUCCESS) { + GST_ERROR_OBJECT (self, "Failed to map input resource, status %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + NvEncUnregisterResource (session, + task->register_resource.registeredResource); + + gst_buffer_unmap (task->buffer, &task->map_info); + gst_clear_buffer (&task->buffer); + + return GST_FLOW_ERROR; + } + + return GST_FLOW_OK; +} +#endif + +static GstFlowReturn +gst_nv_encoder_prepare_task_input (GstNvEncoder * self, + const GstVideoInfo * info, GstBuffer * buffer, gpointer session, + GstBufferPool * pool, GstNvEncoderTask * task) +{ + GstNvEncoderPrivate *priv = self->priv; + GstFlowReturn ret = GST_FLOW_ERROR; + + switch (priv->selected_device_mode) { +#ifdef GST_CUDA_HAS_D3D + case GST_NV_ENCODER_DEVICE_D3D11: + ret = gst_nv_encoder_prepare_task_input_d3d11 (self, info, buffer, + session, pool, task); + break; +#endif + case GST_NV_ENCODER_DEVICE_CUDA: + ret = gst_nv_encoder_prepare_task_input_cuda (self, info, buffer, + session, task); + break; + default: + g_assert_not_reached (); + break; + } + + return ret; +} + +static GstFlowReturn +gst_nv_encoder_handle_frame (GstVideoEncoder * encoder, + GstVideoCodecFrame * frame) +{ + GstNvEncoder *self = GST_NV_ENCODER (encoder); + GstNvEncoderPrivate *priv = self->priv; + GstNvEncoderClass *klass = GST_NV_ENCODER_GET_CLASS (self); + GstFlowReturn ret = GST_FLOW_ERROR; + GstNvEncoderTask *task = NULL; + GstNvEncoderReconfigure reconfig; + GstBuffer *in_buf = frame->input_buffer; + + GST_TRACE_OBJECT (self, "Handle frame"); + + GST_NV_ENCODER_LOCK (self); + ret = priv->last_flow; + GST_NV_ENCODER_UNLOCK (self); + + if (ret != GST_FLOW_OK) { + GST_INFO_OBJECT (self, "Last flow was %s", gst_flow_get_name (ret)); + gst_video_encoder_finish_frame (encoder, frame); + + return ret; + } + + if (!priv->session && !gst_nv_encoder_init_session (self, in_buf)) { + GST_ERROR_OBJECT (self, "Encoder object was not configured"); + gst_video_encoder_finish_frame (encoder, frame); + + return GST_FLOW_NOT_NEGOTIATED; + } + + reconfig = klass->check_reconfigure (self, &priv->config); + switch (reconfig) { + case GST_NV_ENCODER_RECONFIGURE_BITRATE: + if (!gst_nv_encoder_reconfigure_session (self)) { + gst_video_encoder_finish_frame (encoder, frame); + return GST_FLOW_NOT_NEGOTIATED; + } + break; + case GST_NV_ENCODER_RECONFIGURE_FULL: + { + gst_nv_encoder_drain (self, TRUE); + if (!gst_nv_encoder_init_session (self, nullptr)) { + gst_video_encoder_finish_frame (encoder, frame); + return GST_FLOW_NOT_NEGOTIATED; + } + break; + } + default: + break; + } + + /* Release stream lock temporarily for encoding thread to be able to + * push encoded data */ + GST_VIDEO_ENCODER_STREAM_UNLOCK (self); + ret = gst_nv_encoder_get_free_task (self, &task, TRUE); + GST_VIDEO_ENCODER_STREAM_LOCK (self); + if (ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (self, "Last flow was %s", gst_flow_get_name (ret)); + gst_video_encoder_finish_frame (encoder, frame); + return ret; + } + + if (!gst_nv_encoder_device_lock (self)) { + GST_ERROR_OBJECT (self, "Failed to lock device"); + gst_video_encoder_finish_frame (encoder, frame); + + return GST_FLOW_ERROR; + } + + g_assert (task->buffer == NULL); + ret = gst_nv_encoder_prepare_task_input (self, &priv->input_state->info, + in_buf, priv->session, priv->internal_pool, task); + gst_nv_encoder_device_unlock (self); + + if (ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (self, "Failed to upload frame"); + GST_NV_ENCODER_LOCK (self); + gst_nv_encoder_task_reset (self, task); + GST_NV_ENCODER_UNLOCK (self); + + gst_video_encoder_finish_frame (encoder, frame); + + return ret; + } + + ret = gst_nv_encoder_encode_frame (self, frame, task); + if (ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (self, "Failed to encode frame"); + gst_video_encoder_finish_frame (encoder, frame); + + return ret; + } + + gst_video_codec_frame_unref (frame); + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_nv_encoder_finish (GstVideoEncoder * encoder) +{ + GstNvEncoder *self = GST_NV_ENCODER (encoder); + + GST_DEBUG_OBJECT (self, "Finish"); + + gst_nv_encoder_drain (self, TRUE); + + return GST_FLOW_OK; +} + +static gboolean +gst_nv_encoder_flush (GstVideoEncoder * encoder) +{ + GstNvEncoder *self = GST_NV_ENCODER (encoder); + GstNvEncoderPrivate *priv = self->priv; + + GST_DEBUG_OBJECT (self, "Flush"); + + gst_nv_encoder_drain (self, TRUE); + + priv->last_flow = GST_FLOW_OK; + + return TRUE; +} + +guint +gst_nv_encoder_get_task_size (GstNvEncoder * encoder) +{ + g_return_val_if_fail (GST_IS_NV_ENCODER (encoder), 0); + + return encoder->priv->task_pool->len; +} + +void +gst_nv_encoder_set_device_mode (GstNvEncoder * encoder, + GstNvEncoderDeviceMode mode, guint cuda_device_id, gint64 adapter_luid) +{ + GstNvEncoderPrivate *priv = encoder->priv; + + priv->subclass_device_mode = mode; + priv->selected_device_mode = mode; + priv->cuda_device_id = cuda_device_id; + priv->dxgi_adapter_luid = adapter_luid; +} + +/** + * GstNvEncoderPreset: + * + * Since: 1.22 + */ +GType +gst_nv_encoder_preset_get_type (void) +{ + static GType preset_type = 0; + static const GEnumValue presets = { + {GST_NV_ENCODER_PRESET_DEFAULT, "Default", "default"}, + {GST_NV_ENCODER_PRESET_HP, "High Performance", "hp"}, + {GST_NV_ENCODER_PRESET_HQ, "High Quality", "hq"}, + {GST_NV_ENCODER_PRESET_LOW_LATENCY_DEFAULT, "Low Latency", "low-latency"}, + {GST_NV_ENCODER_PRESET_LOW_LATENCY_HQ, "Low Latency, High Quality", + "low-latency-hq"}, + {GST_NV_ENCODER_PRESET_LOW_LATENCY_HP, "Low Latency, High Performance", + "low-latency-hp"}, + {GST_NV_ENCODER_PRESET_LOSSLESS_DEFAULT, "Lossless", "lossless"}, + {GST_NV_ENCODER_PRESET_LOSSLESS_HP, "Lossless, High Performance", + "lossless-hp"}, + {0, NULL, NULL}, + }; + + if (g_once_init_enter (&preset_type)) { + GType type = g_enum_register_static ("GstNvEncoderPreset", presets); + + g_once_init_leave (&preset_type, type); + } + + return preset_type; +} + +void +gst_nv_encoder_preset_to_guid (GstNvEncoderPreset preset, GUID * guid) +{ + switch (preset) { + case GST_NV_ENCODER_PRESET_DEFAULT: + *guid = NV_ENC_PRESET_DEFAULT_GUID; + break; + case GST_NV_ENCODER_PRESET_HP: + *guid = NV_ENC_PRESET_HP_GUID; + break; + case GST_NV_ENCODER_PRESET_HQ: + *guid = NV_ENC_PRESET_HQ_GUID; + break; + case GST_NV_ENCODER_PRESET_LOW_LATENCY_DEFAULT: + *guid = NV_ENC_PRESET_LOW_LATENCY_DEFAULT_GUID; + break; + case GST_NV_ENCODER_PRESET_LOW_LATENCY_HQ: + *guid = NV_ENC_PRESET_LOW_LATENCY_HQ_GUID; + break; + case GST_NV_ENCODER_PRESET_LOW_LATENCY_HP: + *guid = NV_ENC_PRESET_LOW_LATENCY_HP_GUID; + break; + case GST_NV_ENCODER_PRESET_LOSSLESS_DEFAULT: + *guid = NV_ENC_PRESET_LOSSLESS_DEFAULT_GUID; + break; + case GST_NV_ENCODER_PRESET_LOSSLESS_HP: + *guid = NV_ENC_PRESET_LOSSLESS_HP_GUID; + break; + default: + break; + } + + *guid = NV_ENC_PRESET_DEFAULT_GUID; +} + +/** + * GstNvEncoderRCMode: + * + * Since: 1.22 + */ +GType +gst_nv_encoder_rc_mode_get_type (void) +{ + static GType rc_mode_type = 0; + static const GEnumValue rc_modes = { + {GST_NV_ENCODER_RC_MODE_CONSTQP, "Constant Quantization", "cqp"}, + {GST_NV_ENCODER_RC_MODE_VBR, "Variable Bit Rate", "vbr"}, + {GST_NV_ENCODER_RC_MODE_CBR, "Constant Bit Rate", "cbr"}, + {GST_NV_ENCODER_RC_MODE_CBR_LOWDELAY_HQ, + "Low-Delay CBR, High Quality", "cbr-ld-hq"}, + {GST_NV_ENCODER_RC_MODE_CBR_HQ, "CBR, High Quality (slower)", "cbr-hq"}, + {GST_NV_ENCODER_RC_MODE_VBR_HQ, "VBR, High Quality (slower)", "vbr-hq"}, + {0, NULL, NULL}, + }; + + if (g_once_init_enter (&rc_mode_type)) { + GType type = g_enum_register_static ("GstNvEncoderRCMode", rc_modes); + + g_once_init_leave (&rc_mode_type, type); + } + + return rc_mode_type; +} + +NV_ENC_PARAMS_RC_MODE +gst_nv_encoder_rc_mode_to_native (GstNvEncoderRCMode rc_mode) +{ + switch (rc_mode) { + case GST_NV_ENCODER_RC_MODE_CONSTQP: + return NV_ENC_PARAMS_RC_CONSTQP; + case GST_NV_ENCODER_RC_MODE_VBR: + return NV_ENC_PARAMS_RC_VBR; + case GST_NV_ENCODER_RC_MODE_CBR: + return NV_ENC_PARAMS_RC_CBR; + case GST_NV_ENCODER_RC_MODE_CBR_LOWDELAY_HQ: + return NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ; + case GST_NV_ENCODER_RC_MODE_CBR_HQ: + return NV_ENC_PARAMS_RC_CBR_HQ; + case GST_NV_ENCODER_RC_MODE_VBR_HQ: + return NV_ENC_PARAMS_RC_VBR_HQ; + default: + break; + } + + return NV_ENC_PARAMS_RC_VBR; +} + +const gchar * +gst_nv_encoder_status_to_string (NVENCSTATUS status) +{ +#define CASE(err) \ + case err: \ + return G_STRINGIFY (err); + + switch (status) { + CASE (NV_ENC_SUCCESS); + CASE (NV_ENC_ERR_NO_ENCODE_DEVICE); + CASE (NV_ENC_ERR_UNSUPPORTED_DEVICE); + CASE (NV_ENC_ERR_INVALID_ENCODERDEVICE); + CASE (NV_ENC_ERR_INVALID_DEVICE); + CASE (NV_ENC_ERR_DEVICE_NOT_EXIST); + CASE (NV_ENC_ERR_INVALID_PTR); + CASE (NV_ENC_ERR_INVALID_EVENT); + CASE (NV_ENC_ERR_INVALID_PARAM); + CASE (NV_ENC_ERR_INVALID_CALL); + CASE (NV_ENC_ERR_OUT_OF_MEMORY); + CASE (NV_ENC_ERR_ENCODER_NOT_INITIALIZED); + CASE (NV_ENC_ERR_UNSUPPORTED_PARAM); + CASE (NV_ENC_ERR_LOCK_BUSY); + CASE (NV_ENC_ERR_NOT_ENOUGH_BUFFER); + CASE (NV_ENC_ERR_INVALID_VERSION); + CASE (NV_ENC_ERR_MAP_FAILED); + CASE (NV_ENC_ERR_NEED_MORE_INPUT); + CASE (NV_ENC_ERR_ENCODER_BUSY); + CASE (NV_ENC_ERR_EVENT_NOT_REGISTERD); + CASE (NV_ENC_ERR_GENERIC); + CASE (NV_ENC_ERR_INCOMPATIBLE_CLIENT_KEY); + CASE (NV_ENC_ERR_UNIMPLEMENTED); + CASE (NV_ENC_ERR_RESOURCE_REGISTER_FAILED); + CASE (NV_ENC_ERR_RESOURCE_NOT_REGISTERED); + CASE (NV_ENC_ERR_RESOURCE_NOT_MAPPED); + default: + break; + } +#undef CASE + + return "Unknown"; +} + +GstNvEncoderClassData * +gst_nv_encoder_class_data_new (void) +{ + GstNvEncoderClassData *data = g_new0 (GstNvEncoderClassData, 1); + data->ref_count = 1; + + return data; +} + +GstNvEncoderClassData * +gst_nv_encoder_class_data_ref (GstNvEncoderClassData * cdata) +{ + g_atomic_int_add (&cdata->ref_count, 1); + + return cdata; +} + +void +gst_nv_encoder_class_data_unref (GstNvEncoderClassData * cdata) +{ + if (g_atomic_int_dec_and_test (&cdata->ref_count)) { + gst_clear_caps (&cdata->sink_caps); + gst_clear_caps (&cdata->src_caps); + if (cdata->formats) + g_list_free_full (cdata->formats, (GDestroyNotify) g_free); + if (cdata->profiles) + g_list_free_full (cdata->profiles, (GDestroyNotify) g_free); + g_free (cdata); + } +} + +void +gst_nv_encoder_get_encoder_caps (gpointer session, const GUID * encode_guid, + GstNvEncoderDeviceCaps * device_caps) +{ + GstNvEncoderDeviceCaps dev_caps = { 0, }; + NV_ENC_CAPS_PARAM caps_param = { 0, }; + NVENCSTATUS status; + GUID guid = *encode_guid; + + GST_DEBUG_CATEGORY_INIT (gst_nv_encoder_debug, "nvencoder", 0, "nvencoder"); + + caps_param.version = gst_nvenc_get_caps_param_version (); + +#define CHECK_CAPS(to_query,val,default_val) G_STMT_START { \ + gint _val; \ + caps_param.capsToQuery = to_query; \ + status = NvEncGetEncodeCaps (session, guid, &caps_param, \ + &_val); \ + if (status != NV_ENC_SUCCESS) { \ + GST_WARNING ("Unable to query %s, status: %" \ + GST_NVENC_STATUS_FORMAT, G_STRINGIFY (to_query), \ + GST_NVENC_STATUS_ARGS (status)); \ + val = default_val; \ + } else { \ + GST_DEBUG ("%s: %d", G_STRINGIFY (to_query), _val); \ + val = _val; \ + } \ +} G_STMT_END + + CHECK_CAPS (NV_ENC_CAPS_NUM_MAX_BFRAMES, dev_caps.max_bframes, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORTED_RATECONTROL_MODES, + dev_caps.ratecontrol_modes, NV_ENC_PARAMS_RC_VBR); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_FIELD_ENCODING, dev_caps.field_encoding, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_MONOCHROME, dev_caps.monochrome, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_FMO, dev_caps.fmo, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_QPELMV, dev_caps.qpelmv, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_BDIRECT_MODE, dev_caps.bdirect_mode, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_CABAC, dev_caps.cabac, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_ADAPTIVE_TRANSFORM, + dev_caps.adaptive_transform, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_STEREO_MVC, dev_caps.stereo_mvc, 0); + CHECK_CAPS (NV_ENC_CAPS_NUM_MAX_TEMPORAL_LAYERS, dev_caps.temoral_layers, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_HIERARCHICAL_PFRAMES, + dev_caps.hierarchical_pframes, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_HIERARCHICAL_BFRAMES, + dev_caps.hierarchical_bframes, 0); + CHECK_CAPS (NV_ENC_CAPS_LEVEL_MAX, dev_caps.level_max, 0); + CHECK_CAPS (NV_ENC_CAPS_LEVEL_MIN, dev_caps.level_min, 0); + CHECK_CAPS (NV_ENC_CAPS_SEPARATE_COLOUR_PLANE, + dev_caps.separate_colour_plane, 0); + CHECK_CAPS (NV_ENC_CAPS_WIDTH_MAX, dev_caps.width_max, 4096); + CHECK_CAPS (NV_ENC_CAPS_HEIGHT_MAX, dev_caps.height_max, 4096); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_TEMPORAL_SVC, dev_caps.temporal_svc, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_DYN_RES_CHANGE, dev_caps.dyn_res_change, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_DYN_BITRATE_CHANGE, + dev_caps.dyn_bitrate_change, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_DYN_FORCE_CONSTQP, + dev_caps.dyn_force_constqp, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_DYN_RCMODE_CHANGE, + dev_caps.dyn_rcmode_change, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_SUBFRAME_READBACK, + dev_caps.subframe_readback, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_CONSTRAINED_ENCODING, + dev_caps.constrained_encoding, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_INTRA_REFRESH, dev_caps.intra_refresh, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_CUSTOM_VBV_BUF_SIZE, + dev_caps.custom_vbv_buf_size, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_DYNAMIC_SLICE_MODE, + dev_caps.dynamic_slice_mode, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_REF_PIC_INVALIDATION, + dev_caps.ref_pic_invalidation, 0); + CHECK_CAPS (NV_ENC_CAPS_PREPROC_SUPPORT, dev_caps.preproc_support, 0); + /* NOTE: Async is Windows only */ +#ifdef G_OS_WIN32 + CHECK_CAPS (NV_ENC_CAPS_ASYNC_ENCODE_SUPPORT, + dev_caps.async_encoding_support, 0); +#endif + CHECK_CAPS (NV_ENC_CAPS_MB_NUM_MAX, dev_caps.mb_num_max, 0); + CHECK_CAPS (NV_ENC_CAPS_MB_PER_SEC_MAX, dev_caps.mb_per_sec_max, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_YUV444_ENCODE, dev_caps.yuv444_encode, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_LOSSLESS_ENCODE, dev_caps.lossless_encode, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_SAO, dev_caps.sao, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_MEONLY_MODE, dev_caps.meonly_mode, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_LOOKAHEAD, dev_caps.lookahead, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_TEMPORAL_AQ, dev_caps.temporal_aq, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_10BIT_ENCODE, + dev_caps.supports_10bit_encode, 0); + CHECK_CAPS (NV_ENC_CAPS_NUM_MAX_LTR_FRAMES, dev_caps.num_max_ltr_frames, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_WEIGHTED_PREDICTION, + dev_caps.weighted_prediction, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_BFRAME_REF_MODE, dev_caps.bframe_ref_mode, 0); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_EMPHASIS_LEVEL_MAP, + dev_caps.emphasis_level_map, 0); + CHECK_CAPS (NV_ENC_CAPS_WIDTH_MIN, dev_caps.width_min, 16); + CHECK_CAPS (NV_ENC_CAPS_HEIGHT_MIN, dev_caps.height_min, 16); + CHECK_CAPS (NV_ENC_CAPS_SUPPORT_MULTIPLE_REF_FRAMES, + dev_caps.multiple_ref_frames, 0); +#undef CHECK_CAPS + + *device_caps = dev_caps; +} + +void +gst_nv_encoder_merge_device_caps (const GstNvEncoderDeviceCaps * a, + const GstNvEncoderDeviceCaps * b, GstNvEncoderDeviceCaps * merged) +{ + GstNvEncoderDeviceCaps caps; + +#define SELECT_MAX(value) G_STMT_START { \ + caps.value = MAX (a->value, b->value); \ +} G_STMT_END + +#define SELECT_MIN(value) G_STMT_START { \ + caps.value = MAX (MIN (a->value, b->value), 1); \ +} G_STMT_END + + SELECT_MAX (max_bframes); + SELECT_MAX (ratecontrol_modes); + SELECT_MAX (field_encoding); + SELECT_MAX (monochrome); + SELECT_MAX (fmo); + SELECT_MAX (qpelmv); + SELECT_MAX (bdirect_mode); + SELECT_MAX (cabac); + SELECT_MAX (adaptive_transform); + SELECT_MAX (stereo_mvc); + SELECT_MAX (temoral_layers); + SELECT_MAX (hierarchical_pframes); + SELECT_MAX (hierarchical_bframes); + SELECT_MAX (level_max); + SELECT_MAX (level_min); + SELECT_MAX (separate_colour_plane); + SELECT_MAX (width_max); + SELECT_MAX (height_max); + SELECT_MAX (temporal_svc); + SELECT_MAX (dyn_res_change); + SELECT_MAX (dyn_bitrate_change); + SELECT_MAX (dyn_force_constqp); + SELECT_MAX (dyn_rcmode_change); + SELECT_MAX (subframe_readback); + SELECT_MAX (constrained_encoding); + SELECT_MAX (intra_refresh); + SELECT_MAX (custom_vbv_buf_size); + SELECT_MAX (dynamic_slice_mode); + SELECT_MAX (ref_pic_invalidation); + SELECT_MAX (preproc_support); + SELECT_MAX (async_encoding_support); + SELECT_MAX (mb_num_max); + SELECT_MAX (mb_per_sec_max); + SELECT_MAX (yuv444_encode); + SELECT_MAX (lossless_encode); + SELECT_MAX (sao); + SELECT_MAX (meonly_mode); + SELECT_MAX (lookahead); + SELECT_MAX (temporal_aq); + SELECT_MAX (supports_10bit_encode); + SELECT_MAX (num_max_ltr_frames); + SELECT_MAX (weighted_prediction); + SELECT_MAX (bframe_ref_mode); + SELECT_MAX (emphasis_level_map); + SELECT_MIN (width_min); + SELECT_MIN (height_min); + SELECT_MAX (multiple_ref_frames); + +#undef SELECT_MAX +#undef SELECT_MIN + + *merged = caps; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvencoder.h
Added
@@ -0,0 +1,281 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> + +#ifdef GST_CUDA_HAS_D3D +#include <gst/d3d11/gstd3d11.h> +#endif + +#include <string.h> + +#include "nvEncodeAPI.h" +#include "gstnvenc.h" +#include <gst/cuda/gstcudamemory.h> + +G_BEGIN_DECLS + +#define GST_TYPE_NV_ENCODER (gst_nv_encoder_get_type()) +#define GST_NV_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_NV_ENCODER, GstNvEncoder)) +#define GST_NV_ENCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_NV_ENCODER, GstNvEncoderClass)) +#define GST_IS_NV_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_NV_ENCODER)) +#define GST_IS_NV_ENCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_NV_ENCODER)) +#define GST_NV_ENCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_NV_ENCODER, GstNvEncoderClass)) +#define GST_NV_ENCODER_CAST(obj) ((GstNvEncoder *)obj) + +typedef struct _GstNvEncoder GstNvEncoder; +typedef struct _GstNvEncoderClass GstNvEncoderClass; +typedef struct _GstNvEncoderPrivate GstNvEncoderPrivate; + +typedef enum +{ + GST_NV_ENCODER_RECONFIGURE_NONE, + GST_NV_ENCODER_RECONFIGURE_BITRATE, + GST_NV_ENCODER_RECONFIGURE_FULL, +} GstNvEncoderReconfigure; + +#define GST_TYPE_NV_ENCODER_PRESET (gst_nv_encoder_preset_get_type()) +GType gst_nv_encoder_preset_get_type (void); +typedef enum +{ + GST_NV_ENCODER_PRESET_DEFAULT, + GST_NV_ENCODER_PRESET_HP, + GST_NV_ENCODER_PRESET_HQ, + GST_NV_ENCODER_PRESET_LOW_LATENCY_DEFAULT, + GST_NV_ENCODER_PRESET_LOW_LATENCY_HQ, + GST_NV_ENCODER_PRESET_LOW_LATENCY_HP, + GST_NV_ENCODER_PRESET_LOSSLESS_DEFAULT, + GST_NV_ENCODER_PRESET_LOSSLESS_HP, +} GstNvEncoderPreset; + +#define GST_TYPE_NV_ENCODER_RC_MODE (gst_nv_encoder_rc_mode_get_type()) +GType gst_nv_encoder_rc_mode_get_type (void); + +typedef enum +{ + GST_NV_ENCODER_RC_MODE_CONSTQP, + GST_NV_ENCODER_RC_MODE_VBR, + GST_NV_ENCODER_RC_MODE_CBR, + GST_NV_ENCODER_RC_MODE_CBR_LOWDELAY_HQ, + GST_NV_ENCODER_RC_MODE_CBR_HQ, + GST_NV_ENCODER_RC_MODE_VBR_HQ, +} GstNvEncoderRCMode; + +typedef struct +{ + gint max_bframes; + gint ratecontrol_modes; + gint field_encoding; + gint monochrome; + gint fmo; + gint qpelmv; + gint bdirect_mode; + gint cabac; + gint adaptive_transform; + gint stereo_mvc; + gint temoral_layers; + gint hierarchical_pframes; + gint hierarchical_bframes; + gint level_max; + gint level_min; + gint separate_colour_plane; + gint width_max; + gint height_max; + gint temporal_svc; + gint dyn_res_change; + gint dyn_bitrate_change; + gint dyn_force_constqp; + gint dyn_rcmode_change; + gint subframe_readback; + gint constrained_encoding; + gint intra_refresh; + gint custom_vbv_buf_size; + gint dynamic_slice_mode; + gint ref_pic_invalidation; + gint preproc_support; + gint async_encoding_support; + gint mb_num_max; + gint mb_per_sec_max; + gint yuv444_encode; + gint lossless_encode; + gint sao; + gint meonly_mode; + gint lookahead; + gint temporal_aq; + gint supports_10bit_encode; + gint num_max_ltr_frames; + gint weighted_prediction; + gint bframe_ref_mode; + gint emphasis_level_map; + gint width_min; + gint height_min; + gint multiple_ref_frames; +} GstNvEncoderDeviceCaps; + +typedef enum +{ + GST_NV_ENCODER_DEVICE_D3D11, + GST_NV_ENCODER_DEVICE_CUDA, + GST_NV_ENCODER_DEVICE_AUTO_SELECT, +} GstNvEncoderDeviceMode; + +typedef struct +{ + GstCaps *sink_caps; + GstCaps *src_caps; + + guint cuda_device_id; + gint64 adapter_luid; + + GstNvEncoderDeviceMode device_mode; + GstNvEncoderDeviceCaps device_caps; + + GList *formats; + GList *profiles; + + /* auto gpu select mode */ + guint adapter_luid_size; + gint64 adapter_luid_list8; + + guint cuda_device_id_size; + guint cuda_device_id_list8; + + gint ref_count; +} GstNvEncoderClassData; + +typedef struct +{ + /* without ref */ + GstNvEncoder *encoder; + + /* Holds ownership */ + GstBuffer *buffer; + GstMapInfo map_info; + + NV_ENC_REGISTER_RESOURCE register_resource; + NV_ENC_MAP_INPUT_RESOURCE mapped_resource; + + /* Used when input resource cannot be registered */ + NV_ENC_CREATE_INPUT_BUFFER input_buffer; + NV_ENC_LOCK_INPUT_BUFFER lk_input_buffer; + + NV_ENC_OUTPUT_PTR output_ptr; + gpointer event_handle; + gboolean is_eos; +} GstNvEncoderTask; + +typedef struct +{ + GstNvEncoderDeviceMode device_mode; + guint cuda_device_id; + gint64 adapter_luid; + GstObject *device; +} GstNvEncoderDeviceData; + +struct _GstNvEncoder +{ + GstVideoEncoder parent; + + GstNvEncoderPrivate *priv; +}; + +struct _GstNvEncoderClass +{ + GstVideoEncoderClass parent_class; + + gboolean (*set_format) (GstNvEncoder * encoder, + GstVideoCodecState * state, + gpointer session, + NV_ENC_INITIALIZE_PARAMS * init_params, + NV_ENC_CONFIG * config); + + gboolean (*set_output_state) (GstNvEncoder * encoder, + GstVideoCodecState * state, + gpointer session); + + GstBuffer * (*create_output_buffer) (GstNvEncoder * encoder, + NV_ENC_LOCK_BITSTREAM * bitstream); + + GstNvEncoderReconfigure (*check_reconfigure) (GstNvEncoder * encoder, + NV_ENC_CONFIG * config); + + gboolean (*select_device) (GstNvEncoder * encoder, + const GstVideoInfo * info, + GstBuffer * buffer, + GstNvEncoderDeviceData * data); +}; + +GType gst_nv_encoder_get_type (void); + +guint gst_nv_encoder_get_task_size (GstNvEncoder * encoder); + +const gchar * gst_nv_encoder_status_to_string (NVENCSTATUS status); +#define GST_NVENC_STATUS_FORMAT "s (%d)" +#define GST_NVENC_STATUS_ARGS(s) gst_nv_encoder_status_to_string (s), s + +void gst_nv_encoder_preset_to_guid (GstNvEncoderPreset preset, + GUID * guid); + +NV_ENC_PARAMS_RC_MODE gst_nv_encoder_rc_mode_to_native (GstNvEncoderRCMode rc_mode); + +void gst_nv_encoder_set_device_mode (GstNvEncoder * encoder, + GstNvEncoderDeviceMode mode, + guint cuda_device_id, + gint64 adapter_luid); + +GstNvEncoderClassData * gst_nv_encoder_class_data_new (void); + +GstNvEncoderClassData * gst_nv_encoder_class_data_ref (GstNvEncoderClassData * cdata); + +void gst_nv_encoder_class_data_unref (GstNvEncoderClassData * cdata); + +void gst_nv_encoder_get_encoder_caps (gpointer session, + const GUID * encode_guid, + GstNvEncoderDeviceCaps * device_caps); + +void gst_nv_encoder_merge_device_caps (const GstNvEncoderDeviceCaps * a, + const GstNvEncoderDeviceCaps * b, + GstNvEncoderDeviceCaps * merged); + + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstNvEncoder, gst_object_unref) + +G_END_DECLS + +#ifdef __cplusplus +#ifndef G_OS_WIN32 +inline bool is_equal_guid(const GUID & lhs, const GUID & rhs) +{ + return memcmp(&lhs, &rhs, sizeof (GUID)) == 0; +} + +inline bool operator==(const GUID & lhs, const GUID & rhs) +{ + return is_equal_guid(lhs, rhs); +} + +inline bool operator!=(const GUID & lhs, const GUID & rhs) +{ + return !is_equal_guid(lhs, rhs); +} +#endif /* G_OS_WIN32 */ +#endif /* __cplusplus */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvh264dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvh264dec.c
Changed
@@ -70,12 +70,28 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/** + * SECTION:element-nvh264sldec + * @title: nvh264sldec + * + * GstCodecs based NVIDIA H.264 video decoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 filesrc location=/path/to/h264/file ! parsebin ! nvh264sldec ! videoconvert ! autovideosink + * ``` + * + * Since: 1.18 + * + */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif +#include <gst/cuda/gstcudautils.h> + #include "gstnvh264dec.h" -#include "gstcudautils.h" #include "gstnvdecoder.h" #include <string.h> @@ -83,12 +99,10 @@ GST_DEBUG_CATEGORY_STATIC (gst_nv_h264_dec_debug); #define GST_CAT_DEFAULT gst_nv_h264_dec_debug -struct _GstNvH264Dec +typedef struct _GstNvH264Dec { GstH264Decoder parent; - GstVideoCodecState *output_state; - GstCudaContext *context; GstNvDecoder *decoder; CUVIDPICPARAMS params; @@ -113,18 +127,30 @@ gboolean interlaced; GArray *ref_list; -}; +} GstNvH264Dec; -struct _GstNvH264DecClass +typedef struct _GstNvH264DecClass { GstH264DecoderClass parent_class; guint cuda_device_id; +} GstNvH264DecClass; + +enum +{ + PROP_0, + PROP_CUDA_DEVICE_ID, }; -#define gst_nv_h264_dec_parent_class parent_class -G_DEFINE_TYPE (GstNvH264Dec, gst_nv_h264_dec, GST_TYPE_H264_DECODER); +static GTypeClass *parent_class = NULL; + +#define GST_NV_H264_DEC(object) ((GstNvH264Dec *) (object)) +#define GST_NV_H264_DEC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstNvH264DecClass)) static void gst_nv_h264_decoder_dispose (GObject * object); +static void gst_nv_h264_dec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + static void gst_nv_h264_dec_set_context (GstElement * element, GstContext * context); static gboolean gst_nv_h264_dec_open (GstVideoDecoder * decoder); @@ -140,8 +166,9 @@ const GstH264SPS * sps, gint max_dpb_size); static GstFlowReturn gst_nv_h264_dec_new_picture (GstH264Decoder * decoder, GstVideoCodecFrame * frame, GstH264Picture * picture); -static GstFlowReturn gst_nv_h264_dec_new_field_picture (GstH264Decoder * - decoder, const GstH264Picture * first_field, GstH264Picture * second_field); +static GstFlowReturn +gst_nv_h264_dec_new_field_picture (GstH264Decoder * decoder, + GstH264Picture * first_field, GstH264Picture * second_field); static GstFlowReturn gst_nv_h264_dec_output_picture (GstH264Decoder * decoder, GstVideoCodecFrame * frame, GstH264Picture * picture); static GstFlowReturn gst_nv_h264_dec_start_picture (GstH264Decoder * decoder, @@ -156,23 +183,44 @@ gboolean live); static void -gst_nv_h264_dec_class_init (GstNvH264DecClass * klass) +gst_nv_h264_dec_class_init (GstNvH264DecClass * klass, + GstNvDecoderClassData * cdata) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_CLASS (klass); GstH264DecoderClass *h264decoder_class = GST_H264_DECODER_CLASS (klass); + object_class->dispose = gst_nv_h264_decoder_dispose; + object_class->get_property = gst_nv_h264_dec_get_property; + /** - * GstNvH264Dec + * GstNvH264SLDec:cuda-device-id: * - * Since: 1.18 + * Assigned CUDA device id + * + * Since: 1.22 */ - - object_class->dispose = gst_nv_h264_decoder_dispose; + g_object_class_install_property (object_class, PROP_CUDA_DEVICE_ID, + g_param_spec_uint ("cuda-device-id", "CUDA device id", + "Assigned CUDA device id", 0, G_MAXINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); element_class->set_context = GST_DEBUG_FUNCPTR (gst_nv_h264_dec_set_context); + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + gst_element_class_set_static_metadata (element_class, + "NVDEC H.264 Stateless Decoder", + "Codec/Decoder/Video/Hardware", + "NVIDIA H.264 video decoder", "Seungha Yang <seungha@centricular.com>"); + + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + cdata->sink_caps)); + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + cdata->src_caps)); + decoder_class->open = GST_DEBUG_FUNCPTR (gst_nv_h264_dec_open); decoder_class->close = GST_DEBUG_FUNCPTR (gst_nv_h264_dec_close); decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_nv_h264_dec_negotiate); @@ -197,10 +245,11 @@ h264decoder_class->get_preferred_output_delay = GST_DEBUG_FUNCPTR (gst_nv_h264_dec_get_preferred_output_delay); - GST_DEBUG_CATEGORY_INIT (gst_nv_h264_dec_debug, - "nvh264dec", 0, "Nvidia H.264 Decoder"); + klass->cuda_device_id = cdata->cuda_device_id; - gst_type_mark_as_plugin_api (GST_TYPE_NV_H264_DEC, 0); + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); } static void @@ -209,7 +258,7 @@ self->ref_list = g_array_sized_new (FALSE, TRUE, sizeof (GstH264Picture *), 16); g_array_set_clear_func (self->ref_list, - (GDestroyNotify) gst_h264_picture_clear); + (GDestroyNotify) gst_clear_h264_picture); } static void @@ -223,6 +272,22 @@ } static void +gst_nv_h264_dec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstNvH264DecClass *klass = GST_NV_H264_DEC_GET_CLASS (object); + + switch (prop_id) { + case PROP_CUDA_DEVICE_ID: + g_value_set_uint (value, klass->cuda_device_id); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void gst_nv_h264_dec_set_context (GstElement * element, GstContext * context) { GstNvH264Dec *self = GST_NV_H264_DEC (element); @@ -287,7 +352,6 @@ { GstNvH264Dec *self = GST_NV_H264_DEC (decoder); - g_clear_pointer (&self->output_state, gst_video_codec_state_unref); gst_clear_object (&self->decoder); gst_clear_object (&self->context); @@ -308,8 +372,7 @@ GST_DEBUG_OBJECT (self, "negotiate"); - gst_nv_decoder_negotiate (self->decoder, decoder, h264dec->input_state, - &self->output_state); + gst_nv_decoder_negotiate (self->decoder, decoder, h264dec->input_state); /* TODO: add support D3D11 memory */ @@ -438,9 +501,7 @@ /* FIXME: add support cudaVideoCodec_H264_SVC and cudaVideoCodec_H264_MVC */ if (!gst_nv_decoder_configure (self->decoder, cudaVideoCodec_H264, &info, self->coded_width, self->coded_height, - self->bitdepth, - /* Additional 4 buffers for render delay */ - max_dpb_size + 4)) { + self->bitdepth, max_dpb_size, FALSE)) { GST_ERROR_OBJECT (self, "Failed to configure decoder"); return GST_FLOW_NOT_NEGOTIATED; } @@ -480,12 +541,12 @@ static GstFlowReturn gst_nv_h264_dec_new_field_picture (GstH264Decoder * decoder, - const GstH264Picture * first_field, GstH264Picture * second_field) + GstH264Picture * first_field, GstH264Picture * second_field) { GstNvDecoderFrame *nv_frame; nv_frame = (GstNvDecoderFrame *) - gst_h264_picture_get_user_data ((GstH264Picture *) first_field); + gst_h264_picture_get_user_data (first_field); if (!nv_frame) { GST_ERROR_OBJECT (decoder, "No decoder frame in the first picture %p", first_field); @@ -517,8 +578,8 @@ goto error; } - if (!gst_nv_decoder_finish_frame (self->decoder, vdec, decoder_frame, - &frame->output_buffer)) { + if (!gst_nv_decoder_finish_frame (self->decoder, vdec, picture->discont_state, + decoder_frame, &frame->output_buffer)) { GST_ERROR_OBJECT (self, "Failed to handle output picture"); goto error; } @@ -885,68 +946,32 @@ return 4; } -typedef struct -{ - GstCaps *sink_caps; - GstCaps *src_caps; - guint cuda_device_id; - gboolean is_default; -} GstNvH264DecClassData; - -static void -gst_nv_h264_dec_subclass_init (gpointer klass, GstNvH264DecClassData * cdata) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstNvH264DecClass *nvdec_class = (GstNvH264DecClass *) (klass); - gchar *long_name; - - if (cdata->is_default) { - long_name = g_strdup_printf ("NVDEC H.264 Stateless Decoder"); - } else { - long_name = g_strdup_printf ("NVDEC H.264 Stateless Decoder with device %d", - cdata->cuda_device_id); - } - - gst_element_class_set_metadata (element_class, long_name, - "Codec/Decoder/Video/Hardware", - "Nvidia H.264 video decoder", "Seungha Yang <seungha@centricular.com>"); - g_free (long_name); - - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); - - nvdec_class->cuda_device_id = cdata->cuda_device_id; - - gst_caps_unref (cdata->sink_caps); - gst_caps_unref (cdata->src_caps); - g_free (cdata); -} - void gst_nv_h264_dec_register (GstPlugin * plugin, guint device_id, guint rank, GstCaps * sink_caps, GstCaps * src_caps, gboolean is_primary) { - GTypeQuery type_query; - GTypeInfo type_info = { 0, }; - GType subtype; + GType type; gchar *type_name; gchar *feature_name; - GstNvH264DecClassData *cdata; - gboolean is_default = TRUE; + GstNvDecoderClassData *cdata; + gint index = 0; const GValue *value; GstStructure *s; - - /** - * element-nvh264sldec - * - * Since: 1.18 - */ - - cdata = g_new0 (GstNvH264DecClassData, 1); + GTypeInfo type_info = { + sizeof (GstNvH264DecClass), + NULL, + NULL, + (GClassInitFunc) gst_nv_h264_dec_class_init, + NULL, + NULL, + sizeof (GstNvH264Dec), + 0, + (GInstanceInitFunc) gst_nv_h264_dec_init, + }; + + GST_DEBUG_CATEGORY_INIT (gst_nv_h264_dec_debug, "nvh264dec", 0, "nvh264dec"); + + cdata = g_new0 (GstNvDecoderClassData, 1); cdata->sink_caps = gst_caps_from_string ("video/x-h264, " "stream-format= (string) { avc, avc3, byte-stream }, " "alignment= (string) au, " @@ -965,45 +990,37 @@ cdata->src_caps = gst_caps_ref (src_caps); cdata->cuda_device_id = device_id; - g_type_query (GST_TYPE_NV_H264_DEC, &type_query); - memset (&type_info, 0, sizeof (type_info)); - type_info.class_size = type_query.class_size; - type_info.instance_size = type_query.instance_size; - type_info.class_init = (GClassInitFunc) gst_nv_h264_dec_subclass_init; - type_info.class_data = cdata; - if (is_primary) { - type_name = g_strdup ("GstNvH264StatelessPrimaryDec"); + type_name = g_strdup ("GstNvH264Dec"); feature_name = g_strdup ("nvh264dec"); } else { - type_name = g_strdup ("GstNvH264StatelessDec"); + type_name = g_strdup ("GstNvH264SLDec"); feature_name = g_strdup ("nvh264sldec"); } - if (g_type_from_name (type_name) != 0) { + while (g_type_from_name (type_name)) { + index++; g_free (type_name); g_free (feature_name); if (is_primary) { - type_name = - g_strdup_printf ("GstNvH264StatelessPrimaryDevice%dDec", device_id); - feature_name = g_strdup_printf ("nvh264device%ddec", device_id); + type_name = g_strdup_printf ("GstNvH264Device%dDec", index); + feature_name = g_strdup_printf ("nvh264device%ddec", index); } else { - type_name = g_strdup_printf ("GstNvH264StatelessDevice%dDec", device_id); - feature_name = g_strdup_printf ("nvh264sldevice%ddec", device_id); + type_name = g_strdup_printf ("GstNvH264SLDevice%dDec", index); + feature_name = g_strdup_printf ("nvh264sldevice%ddec", index); } - - is_default = FALSE; } - cdata->is_default = is_default; - subtype = g_type_register_static (GST_TYPE_NV_H264_DEC, + type_info.class_data = cdata; + + type = g_type_register_static (GST_TYPE_H264_DECODER, type_name, &type_info, 0); /* make lower rank than default device */ - if (rank > 0 && !is_default) + if (rank > 0 && index > 0) rank--; - if (!gst_element_register (plugin, feature_name, rank, subtype)) + if (!gst_element_register (plugin, feature_name, rank, type)) GST_WARNING ("Failed to register plugin '%s'", type_name); g_free (type_name);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvh264dec.h -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvh264dec.h
Changed
@@ -25,16 +25,6 @@ G_BEGIN_DECLS -#define GST_TYPE_NV_H264_DEC (gst_nv_h264_dec_get_type()) -#define GST_NV_H264_DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_NV_H264_DEC, GstNvH264Dec)) -#define GST_NV_H264_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_NV_H264_DEC, GstNvH264DecClass)) -#define GST_NV_H264_DEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_NV_H264_DEC, GstNvH264DecClass)) - -typedef struct _GstNvH264Dec GstNvH264Dec; -typedef struct _GstNvH264DecClass GstNvH264DecClass; - -GType gst_nv_h264_dec_get_type (void); - void gst_nv_h264_dec_register (GstPlugin * plugin, guint device_id, guint rank,
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvh264encoder.cpp
Added
@@ -0,0 +1,2248 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * element-nvcudah264enc: + * + * NVIDIA CUDA mode H.264 encoder + * + * Since: 1.22 + */ + +/** + * element-nvd3d11h264enc: + * + * NVIDIA Direct3D11 mode H.264 encoder + * + * Since: 1.22 + */ + +/** + * element-nvautogpuh264enc: + * + * NVIDIA auto GPU select mode H.264 encoder + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstnvh264encoder.h" +#include <gst/codecparsers/gsth264parser.h> +#include <gst/pbutils/codec-utils.h> +#include <string> +#include <set> +#include <string.h> + +GST_DEBUG_CATEGORY_STATIC (gst_nv_h264_encoder_debug); +#define GST_CAT_DEFAULT gst_nv_h264_encoder_debug + +static GTypeClass *parent_class = nullptr; + +enum +{ + PROP_0, + PROP_ADAPTER_LUID, + PROP_CUDA_DEVICE_ID, + + /* init params */ + PROP_PRESET, + PROP_WEIGHTED_PRED, + + /* encoding config */ + PROP_GOP_SIZE, + PROP_B_FRAMES, + + /* rate-control params */ + PROP_RATE_CONTROL, + + PROP_QP_I, + PROP_QP_P, + PROP_QP_B, + + PROP_BITRATE, + PROP_MAX_BITRATE, + PROP_VBV_BUFFER_SIZE, + + PROP_RC_LOOKAHEAD, + PROP_I_ADAPT, + PROP_B_ADAPT, + PROP_SPATIAL_AQ, + PROP_TEMPORAL_AQ, + PROP_ZERO_REORDER_DELAY, + PROP_NON_REF_P, + PROP_STRICT_GOP, + PROP_AQ_STRENGTH, + + PROP_MIN_QP_I, + PROP_MIN_QP_P, + PROP_MIN_QP_B, + + PROP_MAX_QP_I, + PROP_MAX_QP_P, + PROP_MAX_QP_B, + + PROP_CONST_QUALITY, + + /* h264 specific */ + PROP_AUD, + PROP_CABAC, + PROP_REPEAT_SEQUENCE_HEADER, +}; + +#define DEFAULT_PRESET GST_NV_ENCODER_PRESET_DEFAULT +#define DEFAULT_WEIGHTED_PRED FALSE +#define DEFAULT_GOP_SIZE 30 +#define DEFAULT_B_FRAMES 0 +#define DEFAULT_RATE_CONTROL GST_NV_ENCODER_RC_MODE_VBR +#define DEFAULT_QP -1 +#define DEFAULT_BITRATE 0 +#define DEFAULT_MAX_BITRATE 0 +#define DEFAULT_VBV_BUFFER_SIZE 0 +#define DEFAULT_RC_LOOKAHEAD 0 +#define DEFAULT_I_ADAPT FALSE +#define DEFAULT_B_ADAPT FALSE +#define DEFAULT_SPATIAL_AQ FALSE +#define DEFAULT_TEMPORAL_AQ FALSE +#define DEFAULT_ZERO_REORDER_DELAY FALSE +#define DEFAULT_NON_REF_P FALSE +#define DEFAULT_STRICT_GOP FALSE +#define DEFAULT_AQ_STRENGTH FALSE +#define DEFAULT_CONST_QUALITY 0 +#define DEFAULT_AUD TRUE +#define DEFAULT_REPEAT_SEQUENCE_HEADER FALSE + +typedef struct _GstNvH264Encoder +{ + GstNvEncoder parent; + GMutex prop_lock; + + gboolean init_param_updated; + gboolean rc_param_updated; + gboolean bitrate_updated; + + gboolean packetized; + GstH264NalParser *parser; + + GstNvEncoderDeviceMode selected_device_mode; + + /* Properties */ + guint cuda_device_id; + gint64 adapter_luid; + + GstNvEncoderPreset preset; + gboolean weighted_pred; + + gint gop_size; + guint bframes; + + GstNvEncoderRCMode rc_mode; + gint qp_i; + gint qp_p; + gint qp_b; + guint bitrate; + guint max_bitrate; + guint vbv_buffer_size; + guint rc_lookahead; + gboolean i_adapt; + gboolean b_adapt; + gboolean spatial_aq; + gboolean temporal_aq; + gboolean zero_reorder_delay; + gboolean non_ref_p; + gboolean strict_gop; + guint aq_strength; + gint min_qp_i; + gint min_qp_p; + gint min_qp_b; + gint max_qp_i; + gint max_qp_p; + gint max_qp_b; + gdouble const_quality; + + gboolean aud; + gboolean cabac; + gboolean repeat_sequence_header; +} GstNvH264Encoder; + +typedef struct _GstNvH264EncoderClass +{ + GstNvEncoderClass parent_class; + + guint cuda_device_id; + gint64 adapter_luid; + + GstNvEncoderDeviceMode device_mode; + + /* representative device caps */ + GstNvEncoderDeviceCaps device_caps; + + /* auto gpu select mode */ + guint cuda_device_id_size; + guint cuda_device_id_list8; + + guint adapter_luid_size; + gint64 adapter_luid_list8; +} GstNvH264EncoderClass; + +#define GST_NV_H264_ENCODER(object) ((GstNvH264Encoder *) (object)) +#define GST_NV_H264_ENCODER_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstNvH264EncoderClass)) + +static void gst_nv_h264_encoder_finalize (GObject * object); +static void gst_nv_h264_encoder_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_nv_h264_encoder_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstCaps *gst_nv_h264_encoder_getcaps (GstVideoEncoder * encoder, + GstCaps * filter); +static gboolean gst_nv_h264_encoder_set_format (GstNvEncoder * encoder, + GstVideoCodecState * state, gpointer session, + NV_ENC_INITIALIZE_PARAMS * init_params, NV_ENC_CONFIG * config); +static gboolean gst_nv_h264_encoder_set_output_state (GstNvEncoder * encoder, + GstVideoCodecState * state, gpointer session); +static GstBuffer *gst_nv_h264_encoder_create_output_buffer (GstNvEncoder * + encoder, NV_ENC_LOCK_BITSTREAM * bitstream); +static GstNvEncoderReconfigure +gst_nv_h264_encoder_check_reconfigure (GstNvEncoder * encoder, + NV_ENC_CONFIG * config); +static gboolean gst_nv_h264_encoder_select_device (GstNvEncoder * encoder, + const GstVideoInfo * info, GstBuffer * buffer, + GstNvEncoderDeviceData * data); + +static void +gst_nv_h264_encoder_class_init (GstNvH264EncoderClass * klass, gpointer data) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoEncoderClass *videoenc_class = GST_VIDEO_ENCODER_CLASS (klass); + GstNvEncoderClass *nvenc_class = GST_NV_ENCODER_CLASS (klass); + GstNvEncoderClassData *cdata = (GstNvEncoderClassData *) data; + GstNvEncoderDeviceCaps *dev_caps = &cdata->device_caps; + GParamFlags param_flags = (GParamFlags) (G_PARAM_READWRITE | + GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS); + GParamFlags conditional_param_flags = (GParamFlags) (G_PARAM_READWRITE | + GST_PARAM_CONDITIONALLY_AVAILABLE | GST_PARAM_MUTABLE_PLAYING | + G_PARAM_STATIC_STRINGS); + + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + + object_class->finalize = gst_nv_h264_encoder_finalize; + object_class->set_property = gst_nv_h264_encoder_set_property; + object_class->get_property = gst_nv_h264_encoder_get_property; + + switch (cdata->device_mode) { + case GST_NV_ENCODER_DEVICE_CUDA: + g_object_class_install_property (object_class, PROP_CUDA_DEVICE_ID, + g_param_spec_uint ("cuda-device-id", "CUDA Device ID", + "CUDA device ID of associated GPU", + 0, G_MAXINT, 0, + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + break; + case GST_NV_ENCODER_DEVICE_D3D11: + g_object_class_install_property (object_class, PROP_ADAPTER_LUID, + g_param_spec_int64 ("adapter-luid", "Adapter LUID", + "DXGI Adapter LUID (Locally Unique Identifier) of associated GPU", + G_MININT64, G_MAXINT64, 0, + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + break; + case GST_NV_ENCODER_DEVICE_AUTO_SELECT: + if (cdata->cuda_device_id_size > 0) { + g_object_class_install_property (object_class, PROP_CUDA_DEVICE_ID, + g_param_spec_uint ("cuda-device-id", "CUDA Device ID", + "CUDA device ID to use", + 0, G_MAXINT, 0, + (GParamFlags) (conditional_param_flags | + GST_PARAM_DOC_SHOW_DEFAULT))); + } + if (cdata->adapter_luid_size > 0) { + g_object_class_install_property (object_class, PROP_ADAPTER_LUID, + g_param_spec_int64 ("adapter-luid", "Adapter LUID", + "DXGI Adapter LUID (Locally Unique Identifier) to use", + G_MININT64, G_MAXINT64, 0, + (GParamFlags) (conditional_param_flags | + GST_PARAM_DOC_SHOW_DEFAULT))); + } + break; + default: + g_assert_not_reached (); + break; + } + + g_object_class_install_property (object_class, PROP_PRESET, + g_param_spec_enum ("preset", "Encoding Preset", + "Encoding Preset", GST_TYPE_NV_ENCODER_PRESET, + DEFAULT_PRESET, param_flags)); + if (dev_caps->weighted_prediction) { + g_object_class_install_property (object_class, PROP_WEIGHTED_PRED, + g_param_spec_boolean ("weighted-pred", "Weighted Pred", + "Enables Weighted Prediction", DEFAULT_WEIGHTED_PRED, + conditional_param_flags)); + } + g_object_class_install_property (object_class, PROP_GOP_SIZE, + g_param_spec_int ("gop-size", "GOP size", + "Number of frames between intra frames (-1 = infinite)", + -1, G_MAXINT, DEFAULT_GOP_SIZE, param_flags)); + if (dev_caps->max_bframes > 0) { + g_object_class_install_property (object_class, PROP_B_FRAMES, + g_param_spec_uint ("b-frames", "B-Frames", + "Number of B-frames between I and P", 0, dev_caps->max_bframes, + DEFAULT_B_FRAMES, conditional_param_flags)); + } + g_object_class_install_property (object_class, PROP_RATE_CONTROL, + g_param_spec_enum ("rate-control", "Rate Control", "Rate Control Method", + GST_TYPE_NV_ENCODER_RC_MODE, DEFAULT_RATE_CONTROL, param_flags)); + g_object_class_install_property (object_class, PROP_QP_I, + g_param_spec_int ("qp-i", "QP I", + "Constant QP value for I frame (-1 = default)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_QP_P, + g_param_spec_int ("qp-p", "QP P", + "Constant QP value for P frame (-1 = default)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_QP_B, + g_param_spec_int ("qp-b", "QP B", + "Constant QP value for B frame (-1 = default)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_BITRATE, + g_param_spec_uint ("bitrate", "Bitrate", + "Bitrate in kbit/sec (0 = automatic)", 0, 2000 * 1024, + DEFAULT_BITRATE, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_BITRATE, + g_param_spec_uint ("max-bitrate", "Max Bitrate", + "Maximum Bitrate in kbit/sec (ignored in CBR mode)", 0, 2000 * 1024, + DEFAULT_MAX_BITRATE, param_flags)); + if (dev_caps->custom_vbv_buf_size) { + g_object_class_install_property (object_class, + PROP_VBV_BUFFER_SIZE, + g_param_spec_uint ("vbv-buffer-size", "VBV Buffer Size", + "VBV(HRD) Buffer Size in kbits (0 = NVENC default)", + 0, G_MAXUINT, DEFAULT_VBV_BUFFER_SIZE, conditional_param_flags)); + } + if (dev_caps->lookahead) { + g_object_class_install_property (object_class, PROP_RC_LOOKAHEAD, + g_param_spec_uint ("rc-lookahead", "Rate Control Lookahead", + "Number of frames for frame type lookahead", + 0, 32, DEFAULT_RC_LOOKAHEAD, conditional_param_flags)); + g_object_class_install_property (object_class, PROP_I_ADAPT, + g_param_spec_boolean ("i-adapt", "I Adapt", + "Enable adaptive I-frame insert when lookahead is enabled", + DEFAULT_I_ADAPT, conditional_param_flags)); + if (dev_caps->max_bframes > 0) { + g_object_class_install_property (object_class, PROP_B_ADAPT, + g_param_spec_boolean ("b-adapt", "B Adapt", + "Enable adaptive B-frame insert when lookahead is enabled", + DEFAULT_B_ADAPT, conditional_param_flags)); + } + } + g_object_class_install_property (object_class, PROP_SPATIAL_AQ, + g_param_spec_boolean ("spatial-aq", "Spatial AQ", + "Spatial Adaptive Quantization", DEFAULT_SPATIAL_AQ, param_flags)); + if (dev_caps->temporal_aq) { + g_object_class_install_property (object_class, PROP_TEMPORAL_AQ, + g_param_spec_boolean ("temporal-aq", "Temporal AQ", + "Temporal Adaptive Quantization", DEFAULT_TEMPORAL_AQ, + conditional_param_flags)); + } + g_object_class_install_property (object_class, PROP_ZERO_REORDER_DELAY, + g_param_spec_boolean ("zero-reorder-delay", "Zero Reorder Delay", + "Zero latency operation (i.e., num_reorder_frames = 0)", + DEFAULT_ZERO_REORDER_DELAY, param_flags)); + g_object_class_install_property (object_class, PROP_NON_REF_P, + g_param_spec_boolean ("nonref-p", "Nonref P", + "Automatic insertion of non-reference P-frames", DEFAULT_NON_REF_P, + param_flags)); + g_object_class_install_property (object_class, PROP_STRICT_GOP, + g_param_spec_boolean ("strict-gop", "Strict GOP", + "Minimize GOP-to-GOP rate fluctuations", DEFAULT_STRICT_GOP, + param_flags)); + g_object_class_install_property (object_class, PROP_AQ_STRENGTH, + g_param_spec_uint ("aq-strength", "AQ Strength", + "Adaptive Quantization Strength when spatial-aq is enabled" + " from 1 (low) to 15 (aggressive), (0 = autoselect)", + 0, 15, DEFAULT_AQ_STRENGTH, param_flags)); + g_object_class_install_property (object_class, PROP_MIN_QP_I, + g_param_spec_int ("min-qp-i", "Min QP I", + "Minimum QP value for I frame, (-1 = disabled)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MIN_QP_P, + g_param_spec_int ("min-qp-p", "Min QP P", + "Minimum QP value for P frame, (-1 = automatic)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MIN_QP_B, + g_param_spec_int ("min-qp-b", "Min QP B", + "Minimum QP value for B frame, (-1 = automatic)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_QP_I, + g_param_spec_int ("max-qp-i", "Max QP I", + "Maximum QP value for I frame, (-1 = disabled)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_QP_P, + g_param_spec_int ("max-qp-p", "Max QP P", + "Maximum QP value for P frame, (-1 = automatic)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_QP_B, + g_param_spec_int ("max-qp-b", "Max QP B", + "Maximum QP value for B frame, (-1 = automatic)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_CONST_QUALITY, + g_param_spec_double ("const-quality", "Constant Quality", + "Target Constant Quality level for VBR mode (0 = automatic)", + 0, 51, DEFAULT_CONST_QUALITY, param_flags)); + g_object_class_install_property (object_class, PROP_AUD, + g_param_spec_boolean ("aud", "AUD", + "Use AU (Access Unit) delimiter", DEFAULT_AUD, param_flags)); + if (dev_caps->cabac) { + g_object_class_install_property (object_class, PROP_CABAC, + g_param_spec_boolean ("cabac", "CABAC", + "Enable CABAC entropy coding", TRUE, conditional_param_flags)); + } + g_object_class_install_property (object_class, PROP_REPEAT_SEQUENCE_HEADER, + g_param_spec_boolean ("repeat-sequence-header", "Repeat Sequence Header", + "Insert sequence headers (SPS/PPS) per IDR", + DEFAULT_REPEAT_SEQUENCE_HEADER, param_flags)); + + switch (cdata->device_mode) { + case GST_NV_ENCODER_DEVICE_CUDA: + gst_element_class_set_static_metadata (element_class, + "NVENC H.264 Video Encoder CUDA Mode", + "Codec/Encoder/Video/Hardware", + "Encode H.264 video streams using NVCODEC API CUDA Mode", + "Seungha Yang <seungha@centricular.com>"); + break; + case GST_NV_ENCODER_DEVICE_D3D11: + gst_element_class_set_static_metadata (element_class, + "NVENC H.264 Video Encoder Direct3D11 Mode", + "Codec/Encoder/Video/Hardware", + "Encode H.264 video streams using NVCODEC API Direct3D11 Mode", + "Seungha Yang <seungha@centricular.com>"); + break; + case GST_NV_ENCODER_DEVICE_AUTO_SELECT: + gst_element_class_set_static_metadata (element_class, + "NVENC H.264 Video Encoder Auto GPU select Mode", + "Codec/Encoder/Video/Hardware", + "Encode H.264 video streams using NVCODEC API auto GPU select Mode", + "Seungha Yang <seungha@centricular.com>"); + break; + default: + g_assert_not_reached (); + break; + } + + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + cdata->sink_caps)); + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + cdata->src_caps)); + + videoenc_class->getcaps = GST_DEBUG_FUNCPTR (gst_nv_h264_encoder_getcaps); + + nvenc_class->set_format = GST_DEBUG_FUNCPTR (gst_nv_h264_encoder_set_format); + nvenc_class->set_output_state = + GST_DEBUG_FUNCPTR (gst_nv_h264_encoder_set_output_state); + nvenc_class->create_output_buffer = + GST_DEBUG_FUNCPTR (gst_nv_h264_encoder_create_output_buffer); + nvenc_class->check_reconfigure = + GST_DEBUG_FUNCPTR (gst_nv_h264_encoder_check_reconfigure); + nvenc_class->select_device = + GST_DEBUG_FUNCPTR (gst_nv_h264_encoder_select_device); + + klass->device_caps = cdata->device_caps; + klass->cuda_device_id = cdata->cuda_device_id; + klass->adapter_luid = cdata->adapter_luid; + klass->device_mode = cdata->device_mode; + klass->cuda_device_id_size = cdata->cuda_device_id_size; + klass->adapter_luid_size = cdata->adapter_luid_size; + memcpy (klass->cuda_device_id_list, cdata->cuda_device_id_list, + sizeof (klass->cuda_device_id_list)); + memcpy (klass->adapter_luid_list, cdata->adapter_luid_list, + sizeof (klass->adapter_luid_list)); + + gst_nv_encoder_class_data_unref (cdata); +} + +static void +gst_nv_h264_encoder_init (GstNvH264Encoder * self) +{ + GstNvH264EncoderClass *klass = GST_NV_H264_ENCODER_GET_CLASS (self); + + g_mutex_init (&self->prop_lock); + + self->selected_device_mode = klass->device_mode; + self->cuda_device_id = klass->cuda_device_id; + self->adapter_luid = klass->adapter_luid; + self->preset = DEFAULT_PRESET; + self->weighted_pred = DEFAULT_WEIGHTED_PRED; + self->gop_size = DEFAULT_GOP_SIZE; + self->bframes = DEFAULT_B_FRAMES; + self->rc_mode = DEFAULT_RATE_CONTROL; + self->qp_i = DEFAULT_QP; + self->qp_p = DEFAULT_QP; + self->qp_b = DEFAULT_QP; + self->bitrate = DEFAULT_BITRATE; + self->max_bitrate = DEFAULT_MAX_BITRATE; + self->vbv_buffer_size = DEFAULT_VBV_BUFFER_SIZE; + self->rc_lookahead = DEFAULT_RC_LOOKAHEAD; + self->i_adapt = DEFAULT_I_ADAPT; + self->b_adapt = DEFAULT_B_ADAPT; + self->spatial_aq = DEFAULT_SPATIAL_AQ; + self->temporal_aq = DEFAULT_TEMPORAL_AQ; + self->zero_reorder_delay = DEFAULT_ZERO_REORDER_DELAY; + self->non_ref_p = DEFAULT_NON_REF_P; + self->strict_gop = DEFAULT_STRICT_GOP; + self->aq_strength = DEFAULT_AQ_STRENGTH; + self->min_qp_i = DEFAULT_QP; + self->min_qp_p = DEFAULT_QP; + self->min_qp_b = DEFAULT_QP; + self->max_qp_i = DEFAULT_QP; + self->max_qp_p = DEFAULT_QP; + self->max_qp_b = DEFAULT_QP; + self->const_quality = DEFAULT_CONST_QUALITY; + self->aud = DEFAULT_AUD; + if (klass->device_caps.cabac) + self->cabac = TRUE; + self->repeat_sequence_header = DEFAULT_REPEAT_SEQUENCE_HEADER; + + self->parser = gst_h264_nal_parser_new (); + + gst_nv_encoder_set_device_mode (GST_NV_ENCODER (self), klass->device_mode, + klass->cuda_device_id, klass->adapter_luid); +} + +static void +gst_nv_h264_encoder_finalize (GObject * object) +{ + GstNvH264Encoder *self = GST_NV_H264_ENCODER (object); + + g_mutex_clear (&self->prop_lock); + gst_h264_nal_parser_free (self->parser); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +typedef enum +{ + UPDATE_INIT_PARAM, + UPDATE_RC_PARAM, + UPDATE_BITRATE, +} PropUpdateLevel; + +static void +update_boolean (GstNvH264Encoder * self, gboolean * old_val, + const GValue * new_val, PropUpdateLevel level) +{ + gboolean val = g_value_get_boolean (new_val); + + if (*old_val == val) + return; + + *old_val = val; + switch (level) { + case UPDATE_INIT_PARAM: + self->init_param_updated = TRUE; + break; + case UPDATE_RC_PARAM: + self->rc_param_updated = TRUE; + break; + case UPDATE_BITRATE: + self->bitrate_updated = TRUE; + break; + } +} + +static void +update_int (GstNvH264Encoder * self, gint * old_val, + const GValue * new_val, PropUpdateLevel level) +{ + gint val = g_value_get_int (new_val); + + if (*old_val == val) + return; + + *old_val = val; + switch (level) { + case UPDATE_INIT_PARAM: + self->init_param_updated = TRUE; + break; + case UPDATE_RC_PARAM: + self->rc_param_updated = TRUE; + break; + case UPDATE_BITRATE: + self->bitrate_updated = TRUE; + break; + } +} + +static void +update_uint (GstNvH264Encoder * self, guint * old_val, + const GValue * new_val, PropUpdateLevel level) +{ + guint val = g_value_get_uint (new_val); + + if (*old_val == val) + return; + + *old_val = val; + switch (level) { + case UPDATE_INIT_PARAM: + self->init_param_updated = TRUE; + break; + case UPDATE_RC_PARAM: + self->rc_param_updated = TRUE; + break; + case UPDATE_BITRATE: + self->bitrate_updated = TRUE; + break; + } +} + +static void +update_double (GstNvH264Encoder * self, gdouble * old_val, + const GValue * new_val, PropUpdateLevel level) +{ + gdouble val = g_value_get_double (new_val); + + if (*old_val == val) + return; + + *old_val = val; + switch (level) { + case UPDATE_INIT_PARAM: + self->init_param_updated = TRUE; + break; + case UPDATE_RC_PARAM: + self->rc_param_updated = TRUE; + break; + case UPDATE_BITRATE: + self->bitrate_updated = TRUE; + break; + } +} + +static void +gst_nv_h264_encoder_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstNvH264Encoder *self = GST_NV_H264_ENCODER (object); + GstNvH264EncoderClass *klass = GST_NV_H264_ENCODER_GET_CLASS (self); + + g_mutex_lock (&self->prop_lock); + switch (prop_id) { + case PROP_ADAPTER_LUID:{ + gint64 adapter_luid = g_value_get_int64 (value); + gboolean is_valid = FALSE; + + for (guint i = 0; i < klass->adapter_luid_size; i++) { + if (klass->adapter_luid_listi == adapter_luid) { + self->adapter_luid = adapter_luid; + is_valid = TRUE; + break; + } + } + + if (!is_valid) + g_warning ("%" G_GINT64_FORMAT " is not a valid adapter luid", + adapter_luid); + break; + } + case PROP_CUDA_DEVICE_ID:{ + guint cuda_device_id = g_value_get_uint (value); + gboolean is_valid = FALSE; + + for (guint i = 0; i < klass->cuda_device_id_size; i++) { + if (klass->cuda_device_id_listi == cuda_device_id) { + self->cuda_device_id = cuda_device_id; + is_valid = TRUE; + break; + } + } + + if (!is_valid) + g_warning ("%d is not a valid cuda device id", cuda_device_id); + break; + } + case PROP_PRESET:{ + GstNvEncoderPreset preset = (GstNvEncoderPreset) g_value_get_enum (value); + if (preset != self->preset) { + self->preset = preset; + self->init_param_updated = TRUE; + } + break; + } + case PROP_WEIGHTED_PRED: + update_boolean (self, &self->weighted_pred, value, UPDATE_INIT_PARAM); + break; + case PROP_GOP_SIZE: + update_int (self, &self->gop_size, value, UPDATE_INIT_PARAM); + break; + case PROP_B_FRAMES: + update_uint (self, &self->bframes, value, UPDATE_INIT_PARAM); + break; + case PROP_RATE_CONTROL:{ + GstNvEncoderRCMode mode = (GstNvEncoderRCMode) g_value_get_enum (value); + if (mode != self->rc_mode) { + self->rc_mode = mode; + self->rc_param_updated = TRUE; + } + break; + } + case PROP_QP_I: + update_int (self, &self->qp_i, value, UPDATE_RC_PARAM); + break; + case PROP_QP_P: + update_int (self, &self->qp_p, value, UPDATE_RC_PARAM); + break; + case PROP_QP_B: + update_int (self, &self->qp_b, value, UPDATE_RC_PARAM); + break; + case PROP_BITRATE: + update_uint (self, &self->bitrate, value, UPDATE_BITRATE); + break; + case PROP_MAX_BITRATE: + update_uint (self, &self->max_bitrate, value, UPDATE_BITRATE); + break; + case PROP_VBV_BUFFER_SIZE: + update_uint (self, &self->vbv_buffer_size, value, UPDATE_RC_PARAM); + break; + case PROP_RC_LOOKAHEAD: + /* rc-lookahead update requires pool size change */ + update_uint (self, &self->rc_lookahead, value, UPDATE_INIT_PARAM); + break; + case PROP_I_ADAPT: + update_boolean (self, &self->i_adapt, value, UPDATE_RC_PARAM); + break; + case PROP_B_ADAPT: + update_boolean (self, &self->b_adapt, value, UPDATE_RC_PARAM); + break; + case PROP_SPATIAL_AQ: + update_boolean (self, &self->spatial_aq, value, UPDATE_RC_PARAM); + break; + case PROP_TEMPORAL_AQ: + update_boolean (self, &self->temporal_aq, value, UPDATE_RC_PARAM); + break; + case PROP_ZERO_REORDER_DELAY: + update_boolean (self, &self->zero_reorder_delay, value, UPDATE_RC_PARAM); + break; + case PROP_NON_REF_P: + update_boolean (self, &self->non_ref_p, value, UPDATE_RC_PARAM); + break; + case PROP_STRICT_GOP: + update_boolean (self, &self->strict_gop, value, UPDATE_RC_PARAM); + break; + case PROP_AQ_STRENGTH: + update_uint (self, &self->aq_strength, value, UPDATE_RC_PARAM); + break; + case PROP_MIN_QP_I: + update_int (self, &self->min_qp_i, value, UPDATE_RC_PARAM); + break; + case PROP_MIN_QP_P: + update_int (self, &self->min_qp_p, value, UPDATE_RC_PARAM); + break; + case PROP_MIN_QP_B: + update_int (self, &self->min_qp_b, value, UPDATE_RC_PARAM); + break; + case PROP_MAX_QP_I: + update_int (self, &self->min_qp_i, value, UPDATE_RC_PARAM); + break; + case PROP_MAX_QP_P: + update_int (self, &self->min_qp_p, value, UPDATE_RC_PARAM); + break; + case PROP_MAX_QP_B: + update_int (self, &self->min_qp_b, value, UPDATE_RC_PARAM); + break; + case PROP_CONST_QUALITY: + update_double (self, &self->const_quality, value, UPDATE_RC_PARAM); + break; + case PROP_AUD: + update_boolean (self, &self->aud, value, UPDATE_INIT_PARAM); + break; + case PROP_CABAC: + update_boolean (self, &self->cabac, value, UPDATE_INIT_PARAM); + break; + case PROP_REPEAT_SEQUENCE_HEADER: + update_boolean (self, + &self->repeat_sequence_header, value, UPDATE_INIT_PARAM); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_nv_h264_encoder_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstNvH264Encoder *self = GST_NV_H264_ENCODER (object); + + switch (prop_id) { + case PROP_ADAPTER_LUID: + g_value_set_int64 (value, self->adapter_luid); + break; + case PROP_CUDA_DEVICE_ID: + g_value_set_uint (value, self->cuda_device_id); + break; + case PROP_PRESET: + g_value_set_enum (value, self->preset); + break; + case PROP_WEIGHTED_PRED: + g_value_set_boolean (value, self->weighted_pred); + break; + case PROP_GOP_SIZE: + g_value_set_int (value, self->gop_size); + break; + case PROP_B_FRAMES: + g_value_set_uint (value, self->bframes); + break; + case PROP_RATE_CONTROL: + g_value_set_enum (value, self->rc_mode); + break; + case PROP_QP_I: + g_value_set_int (value, self->qp_i); + break; + case PROP_QP_P: + g_value_set_int (value, self->qp_p); + break; + case PROP_QP_B: + g_value_set_int (value, self->qp_b); + break; + case PROP_BITRATE: + g_value_set_uint (value, self->bitrate); + break; + case PROP_MAX_BITRATE: + g_value_set_uint (value, self->max_bitrate); + break; + case PROP_VBV_BUFFER_SIZE: + g_value_set_uint (value, self->vbv_buffer_size); + break; + case PROP_RC_LOOKAHEAD: + g_value_set_uint (value, self->rc_lookahead); + break; + case PROP_I_ADAPT: + g_value_set_boolean (value, self->i_adapt); + break; + case PROP_B_ADAPT: + g_value_set_boolean (value, self->b_adapt); + break; + case PROP_SPATIAL_AQ: + g_value_set_boolean (value, self->spatial_aq); + break; + case PROP_TEMPORAL_AQ: + g_value_set_boolean (value, self->temporal_aq); + break; + case PROP_ZERO_REORDER_DELAY: + g_value_set_boolean (value, self->zero_reorder_delay); + break; + case PROP_NON_REF_P: + g_value_set_boolean (value, self->non_ref_p); + break; + case PROP_STRICT_GOP: + g_value_set_boolean (value, self->strict_gop); + break; + case PROP_AQ_STRENGTH: + g_value_set_uint (value, self->aq_strength); + break; + case PROP_MIN_QP_I: + g_value_set_int (value, self->min_qp_i); + break; + case PROP_MIN_QP_P: + g_value_set_int (value, self->min_qp_p); + break; + case PROP_MIN_QP_B: + g_value_set_int (value, self->min_qp_b); + break; + case PROP_MAX_QP_I: + g_value_set_int (value, self->max_qp_i); + break; + case PROP_MAX_QP_P: + g_value_set_int (value, self->max_qp_p); + break; + case PROP_MAX_QP_B: + g_value_set_int (value, self->max_qp_b); + break; + case PROP_CONST_QUALITY: + g_value_set_double (value, self->const_quality); + break; + case PROP_AUD: + g_value_set_boolean (value, self->aud); + break; + case PROP_CABAC: + g_value_set_boolean (value, self->cabac); + break; + case PROP_REPEAT_SEQUENCE_HEADER: + g_value_set_boolean (value, self->repeat_sequence_header); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_nv_h264_encoder_get_downstream_profiles_and_format (GstNvH264Encoder * self, + std::set < std::string > &downstream_profiles, gboolean * packetized) +{ + GstCaps *allowed_caps; + GstStructure *s; + const gchar *stream_format; + + allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (self)); + + if (!allowed_caps || gst_caps_is_empty (allowed_caps) || + gst_caps_is_any (allowed_caps)) { + gst_clear_caps (&allowed_caps); + + return; + } + + for (guint i = 0; i < gst_caps_get_size (allowed_caps); i++) { + const GValue *profile_value; + const gchar *profile; + + s = gst_caps_get_structure (allowed_caps, i); + profile_value = gst_structure_get_value (s, "profile"); + if (!profile_value) + continue; + + if (GST_VALUE_HOLDS_LIST (profile_value)) { + for (guint j = 0; j < gst_value_list_get_size (profile_value); j++) { + const GValue *p = gst_value_list_get_value (profile_value, j); + + if (!G_VALUE_HOLDS_STRING (p)) + continue; + + profile = g_value_get_string (p); + if (profile) + downstream_profiles.insert (profile); + } + + } else if (G_VALUE_HOLDS_STRING (profile_value)) { + profile = g_value_get_string (profile_value); + if (profile) + downstream_profiles.insert (profile); + } + } + + if (packetized) { + *packetized = FALSE; + allowed_caps = gst_caps_fixate (allowed_caps); + s = gst_caps_get_structure (allowed_caps, 0); + stream_format = gst_structure_get_string (s, "stream-format"); + if (g_strcmp0 (stream_format, "avc") == 0) + *packetized = TRUE; + } + + gst_caps_unref (allowed_caps); +} + +static GstCaps * +gst_nv_h264_encoder_getcaps (GstVideoEncoder * encoder, GstCaps * filter) +{ + GstNvH264Encoder *self = GST_NV_H264_ENCODER (encoder); + GstNvH264EncoderClass *klass = GST_NV_H264_ENCODER_GET_CLASS (self); + GstCaps *allowed_caps; + GstCaps *template_caps; + GstCaps *filtered_caps; + GstCaps *supported_caps; + std::set < std::string > downstream_profiles; + std::set < std::string > allowed_formats; + gboolean profile_support_interlaced = FALSE; + + gst_nv_h264_encoder_get_downstream_profiles_and_format (self, + downstream_profiles, nullptr); + + GST_DEBUG_OBJECT (self, "Downstream specified %" G_GSIZE_FORMAT " profiles", + downstream_profiles.size ()); + + if (downstream_profiles.size () == 0) + return gst_video_encoder_proxy_getcaps (encoder, nullptr, filter); + + /* *INDENT-OFF* */ + for (const auto &iter: downstream_profiles) { + if (iter == "high" || iter == "main") { + profile_support_interlaced = TRUE; + } + + if (iter == "high-4:4:4") { + profile_support_interlaced = TRUE; + allowed_formats.insert("Y444"); + } else { + allowed_formats.insert("NV12"); + } + } + /* *INDENT-ON* */ + + GST_DEBUG_OBJECT (self, "Downstream %s support interlaced format", + profile_support_interlaced ? "can" : "cannot"); + + template_caps = gst_pad_get_pad_template_caps (encoder->sinkpad); + allowed_caps = gst_caps_copy (template_caps); + + if (klass->device_caps.field_encoding == 0 || !profile_support_interlaced) { + gst_caps_set_simple (allowed_caps, "interlace-mode", G_TYPE_STRING, + "progressive", nullptr); + } + + GValue formats = G_VALUE_INIT; + + g_value_init (&formats, GST_TYPE_LIST); + /* *INDENT-OFF* */ + for (const auto &iter: allowed_formats) { + GValue val = G_VALUE_INIT; + g_value_init (&val, G_TYPE_STRING); + + g_value_set_string (&val, iter.c_str()); + gst_value_list_append_and_take_value (&formats, &val); + } + /* *INDENT-ON* */ + + gst_caps_set_value (allowed_caps, "format", &formats); + g_value_unset (&formats); + + filtered_caps = gst_caps_intersect_full (template_caps, allowed_caps, + GST_CAPS_INTERSECT_FIRST); + + supported_caps = gst_video_encoder_proxy_getcaps (encoder, + filtered_caps, filter); + gst_caps_unref (filtered_caps); + gst_caps_unref (allowed_caps); + gst_caps_unref (template_caps); + + GST_DEBUG_OBJECT (self, "Returning %" GST_PTR_FORMAT, supported_caps); + + return supported_caps; +} + +static gboolean +gst_nv_h264_encoder_set_format (GstNvEncoder * encoder, + GstVideoCodecState * state, gpointer session, + NV_ENC_INITIALIZE_PARAMS * init_params, NV_ENC_CONFIG * config) +{ + GstNvH264Encoder *self = GST_NV_H264_ENCODER (encoder); + GstNvH264EncoderClass *klass = GST_NV_H264_ENCODER_GET_CLASS (self); + GstNvEncoderDeviceCaps *dev_caps = &klass->device_caps; + NV_ENC_RC_PARAMS *rc_params; + GstVideoInfo *info = &state->info; + NVENCSTATUS status; + NV_ENC_PRESET_CONFIG preset_config = { 0, }; + gint dar_n, dar_d; + GstNvEncoderRCMode rc_mode; + NV_ENC_CONFIG_H264 *h264_config; + NV_ENC_CONFIG_H264_VUI_PARAMETERS *vui; + std::set < std::string > downstream_profiles; + GUID selected_profile = NV_ENC_CODEC_PROFILE_AUTOSELECT_GUID; + gboolean downstream_supports_bframe = FALSE; + gboolean bframe_aborted = FALSE; + gboolean weight_pred_aborted = FALSE; + gboolean vbv_buffer_size_aborted = FALSE; + gboolean lookahead_aborted = FALSE; + gboolean temporal_aq_aborted = FALSE; + + self->packetized = FALSE; + + gst_nv_h264_encoder_get_downstream_profiles_and_format (self, + downstream_profiles, &self->packetized); + + if (downstream_profiles.empty ()) { + GST_ERROR_OBJECT (self, "Unable to get downstream profile"); + return FALSE; + } + + if (GST_VIDEO_INFO_IS_INTERLACED (info)) { + downstream_profiles.erase ("progressive-high"); + downstream_profiles.erase ("constrained-high"); + downstream_profiles.erase ("constrained-baseline"); + downstream_profiles.erase ("baseline"); + + if (downstream_profiles.empty ()) { + GST_ERROR_OBJECT (self, + "None of downstream profile supports interlaced encoding"); + return FALSE; + } + } + + if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_Y444) { + if (downstream_profiles.find ("high-4:4:4") == downstream_profiles.end ()) { + GST_ERROR_OBJECT (self, "Downstream does not support 4:4:4 profile"); + return FALSE; + } else { + selected_profile = NV_ENC_H264_PROFILE_HIGH_444_GUID; + downstream_supports_bframe = TRUE; + } + } else { + /* *INDENT-OFF* */ + for (const auto &iter: downstream_profiles) { + if (iter == "high" || iter == "main" || iter == "progressive-high") { + downstream_supports_bframe = TRUE; + } + } + /* *INDENT-ON* */ + } + + g_mutex_lock (&self->prop_lock); + + if (klass->device_mode == GST_NV_ENCODER_DEVICE_AUTO_SELECT) { + GstNvEncoderDeviceCaps dev_caps; + + gst_nv_encoder_get_encoder_caps (session, + &NV_ENC_CODEC_H264_GUID, &dev_caps); + + if (self->bframes > 0 && !dev_caps.max_bframes) { + self->bframes = 0; + bframe_aborted = TRUE; + + GST_INFO_OBJECT (self, "B-frame was enabled but not support by device"); + } + + if (self->weighted_pred && !dev_caps.weighted_prediction) { + self->weighted_pred = FALSE; + weight_pred_aborted = TRUE; + + GST_INFO_OBJECT (self, + "Weighted prediction was enabled but not support by device"); + } + + if (self->vbv_buffer_size && !dev_caps.custom_vbv_buf_size) { + self->vbv_buffer_size = 0; + vbv_buffer_size_aborted = TRUE; + + GST_INFO_OBJECT (self, + "VBV buffer size was specified but not supported by device"); + } + + if (self->rc_lookahead && !dev_caps.lookahead) { + self->rc_lookahead = 0; + lookahead_aborted = TRUE; + + GST_INFO_OBJECT (self, + "VBV buffer size was specified but not supported by device"); + } + + if (self->temporal_aq && !dev_caps.temporal_aq) { + self->temporal_aq = FALSE; + temporal_aq_aborted = TRUE; + + GST_INFO_OBJECT (self, + "temporal-aq was enabled but not supported by device"); + } + } + + init_params->version = gst_nvenc_get_initialize_params_version (); + init_params->encodeGUID = NV_ENC_CODEC_H264_GUID; + + init_params->encodeWidth = GST_VIDEO_INFO_WIDTH (info); + init_params->maxEncodeWidth = GST_VIDEO_INFO_WIDTH (info); + init_params->encodeHeight = GST_VIDEO_INFO_HEIGHT (info); + init_params->maxEncodeHeight = GST_VIDEO_INFO_HEIGHT (info); + init_params->enablePTD = TRUE; + if (dev_caps->async_encoding_support) + init_params->enableEncodeAsync = 1; + if (info->fps_d > 0 && info->fps_n > 0) { + init_params->frameRateNum = info->fps_n; + init_params->frameRateDen = info->fps_d; + } else { + init_params->frameRateNum = 0; + init_params->frameRateDen = 1; + } + + init_params->enableWeightedPrediction = self->weighted_pred; + + if (gst_util_fraction_multiply (GST_VIDEO_INFO_WIDTH (info), + GST_VIDEO_INFO_HEIGHT (info), GST_VIDEO_INFO_PAR_N (info), + GST_VIDEO_INFO_PAR_D (info), &dar_n, &dar_d) && dar_n > 0 + && dar_d > 0) { + init_params->darWidth = dar_n; + init_params->darHeight = dar_d; + } + + if (GST_VIDEO_INFO_IS_INTERLACED (info) && dev_caps->field_encoding > 0) { + switch (GST_VIDEO_INFO_INTERLACE_MODE (info)) { + case GST_VIDEO_INTERLACE_MODE_INTERLEAVED: + case GST_VIDEO_INTERLACE_MODE_MIXED: + config->frameFieldMode = NV_ENC_PARAMS_FRAME_FIELD_MODE_FIELD; + preset_config.presetCfg.frameFieldMode = + NV_ENC_PARAMS_FRAME_FIELD_MODE_FIELD; + break; + default: + break; + } + } + + gst_nv_encoder_preset_to_guid (self->preset, &init_params->presetGUID); + + preset_config.version = gst_nvenc_get_preset_config_version (); + preset_config.presetCfg.version = gst_nvenc_get_config_version (); + + status = NvEncGetEncodePresetConfig (session, NV_ENC_CODEC_H264_GUID, + init_params->presetGUID, &preset_config); + if (status != NV_ENC_SUCCESS) { + GST_ERROR_OBJECT (self, "Failed to get preset config %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + g_mutex_unlock (&self->prop_lock); + return FALSE; + } + + *config = preset_config.presetCfg; + if (self->gop_size < 0) { + config->gopLength = NVENC_INFINITE_GOPLENGTH; + config->frameIntervalP = 1; + } else if (self->gop_size > 0) { + config->gopLength = self->gop_size; + /* frameIntervalP + * 0: All Intra frames + * 1: I/P only + * 2: IBP + * 3: IBBP + */ + config->frameIntervalP = 1; + if (self->bframes > 0 && !downstream_supports_bframe) { + GST_WARNING_OBJECT (self, + "B-frame was enabled but downstream profile does not support it"); + bframe_aborted = TRUE; + self->bframes = 0; + } + + config->frameIntervalP = self->bframes + 1; + } else { + /* gop size == 0 means all intra frames */ + config->gopLength = 1; + config->frameIntervalP = 0; + } + + rc_params = &config->rcParams; + rc_mode = self->rc_mode; + + if (self->bitrate) + rc_params->averageBitRate = self->bitrate * 1024; + if (self->max_bitrate) + rc_params->maxBitRate = self->max_bitrate * 1024; + if (self->vbv_buffer_size) + rc_params->vbvBufferSize = self->vbv_buffer_size * 1024; + + if (self->min_qp_i >= 0) { + rc_params->enableMinQP = TRUE; + rc_params->minQP.qpIntra = self->min_qp_i; + if (self->min_qp_p >= 0) { + rc_params->minQP.qpInterP = self->min_qp_p; + } else { + rc_params->minQP.qpInterP = rc_params->minQP.qpIntra; + } + if (self->min_qp_b >= 0) { + rc_params->minQP.qpInterB = self->min_qp_b; + } else { + rc_params->minQP.qpInterB = rc_params->minQP.qpInterP; + } + } + + if (self->max_qp_i >= 0) { + rc_params->enableMaxQP = TRUE; + rc_params->maxQP.qpIntra = self->max_qp_i; + if (self->max_qp_p >= 0) { + rc_params->maxQP.qpInterP = self->max_qp_p; + } else { + rc_params->maxQP.qpInterP = rc_params->maxQP.qpIntra; + } + if (self->max_qp_b >= 0) { + rc_params->maxQP.qpInterB = self->max_qp_b; + } else { + rc_params->maxQP.qpInterB = rc_params->maxQP.qpInterP; + } + } + + if (rc_mode == GST_NV_ENCODER_RC_MODE_CONSTQP) { + if (self->qp_i >= 0) + rc_params->constQP.qpIntra = self->qp_i; + if (self->qp_p >= 0) + rc_params->constQP.qpInterP = self->qp_p; + if (self->qp_p >= 0) + rc_params->constQP.qpInterB = self->qp_b; + } + + rc_params->rateControlMode = gst_nv_encoder_rc_mode_to_native (rc_mode); + + if (self->spatial_aq) { + rc_params->enableAQ = TRUE; + rc_params->aqStrength = self->aq_strength; + } + + rc_params->enableTemporalAQ = self->temporal_aq; + + if (self->rc_lookahead) { + rc_params->enableLookahead = 1; + rc_params->lookaheadDepth = self->rc_lookahead; + rc_params->disableIadapt = !self->i_adapt; + rc_params->disableBadapt = !self->b_adapt; + } + + rc_params->strictGOPTarget = self->strict_gop; + rc_params->enableNonRefP = self->non_ref_p; + rc_params->zeroReorderDelay = self->zero_reorder_delay; + + if (self->const_quality) { + guint scaled = (gint) (self->const_quality * 256.0); + + rc_params->targetQuality = (guint8) (scaled >> 8); + rc_params->targetQualityLSB = (guint8) (scaled & 0xff); + } + self->init_param_updated = FALSE; + self->bitrate_updated = FALSE; + self->rc_param_updated = FALSE; + + if (selected_profile == NV_ENC_CODEC_PROFILE_AUTOSELECT_GUID && + config->frameIntervalP > 1) { + if (downstream_profiles.find ("main") != downstream_profiles.end ()) { + selected_profile = NV_ENC_H264_PROFILE_MAIN_GUID; + } else if (downstream_profiles.find ("high") != downstream_profiles.end ()) { + selected_profile = NV_ENC_H264_PROFILE_HIGH_GUID; + } else if (downstream_profiles.find ("progressive-high") != + downstream_profiles.end ()) { + selected_profile = NV_ENC_H264_PROFILE_PROGRESSIVE_HIGH_GUID; + } + } + + /* Pick the first profile */ + if (selected_profile == NV_ENC_CODEC_PROFILE_AUTOSELECT_GUID) { + if (*downstream_profiles.begin () == "baseline" || + *downstream_profiles.begin () == "constrained-baseline") { + selected_profile = NV_ENC_H264_PROFILE_BASELINE_GUID; + } else if (*downstream_profiles.begin () == "main") { + selected_profile = NV_ENC_H264_PROFILE_MAIN_GUID; + } else if (*downstream_profiles.begin () == "progressive-high") { + selected_profile = NV_ENC_H264_PROFILE_PROGRESSIVE_HIGH_GUID; + } else if (*downstream_profiles.begin () == "constrained-high") { + selected_profile = NV_ENC_H264_PROFILE_CONSTRAINED_HIGH_GUID; + } + } + + config->profileGUID = selected_profile; + + h264_config = &config->encodeCodecConfig.h264Config; + vui = &h264_config->h264VUIParameters; + + h264_config->level = NV_ENC_LEVEL_AUTOSELECT; + h264_config->chromaFormatIDC = 1; + if (selected_profile == NV_ENC_H264_PROFILE_HIGH_444_GUID) + h264_config->chromaFormatIDC = 3; + h264_config->idrPeriod = config->gopLength; + h264_config->outputAUD = self->aud; + if (self->repeat_sequence_header) { + h264_config->disableSPSPPS = 0; + h264_config->repeatSPSPPS = 1; + } else { + if (self->packetized) + h264_config->disableSPSPPS = 1; + else + h264_config->disableSPSPPS = 0; + } + + if (dev_caps->cabac && selected_profile != NV_ENC_H264_PROFILE_BASELINE_GUID) { + if (self->cabac) + h264_config->entropyCodingMode = NV_ENC_H264_ENTROPY_CODING_MODE_CABAC; + else + h264_config->entropyCodingMode = NV_ENC_H264_ENTROPY_CODING_MODE_CAVLC; + } else { + h264_config->entropyCodingMode = NV_ENC_H264_ENTROPY_CODING_MODE_AUTOSELECT; + } + + vui->videoSignalTypePresentFlag = 1; + /* Unspecified */ + vui->videoFormat = 5; + if (info->colorimetry.range == GST_VIDEO_COLOR_RANGE_0_255) { + vui->videoFullRangeFlag = 1; + } else { + vui->videoFullRangeFlag = 0; + } + + vui->colourDescriptionPresentFlag = 1; + vui->colourMatrix = gst_video_color_matrix_to_iso (info->colorimetry.matrix); + vui->colourPrimaries = + gst_video_color_primaries_to_iso (info->colorimetry.primaries); + vui->transferCharacteristics = + gst_video_transfer_function_to_iso (info->colorimetry.transfer); + + g_mutex_unlock (&self->prop_lock); + + if (bframe_aborted) + g_object_notify (G_OBJECT (self), "b-frames"); + if (weight_pred_aborted) + g_object_notify (G_OBJECT (self), "weighted-pred"); + if (vbv_buffer_size_aborted) + g_object_notify (G_OBJECT (self), "vbv-buffer-size"); + if (lookahead_aborted) + g_object_notify (G_OBJECT (self), "rc-lookahead"); + if (temporal_aq_aborted) + g_object_notify (G_OBJECT (self), "temporal-aq"); + + return TRUE; +} + +static gboolean +gst_nv_h264_encoder_set_output_state (GstNvEncoder * encoder, + GstVideoCodecState * state, gpointer session) +{ + GstNvH264Encoder *self = GST_NV_H264_ENCODER (encoder); + GstVideoCodecState *output_state; + NV_ENC_SEQUENCE_PARAM_PAYLOAD seq_params = { 0, }; + guint8 spspps1024; + guint32 seq_size; + GstCaps *caps; + const gchar *profile_from_sps; + NVENCSTATUS status; + std::set < std::string > downstream_profiles; + std::string caps_str; + GstTagList *tags; + GstBuffer *codec_data = nullptr; + GstH264NalUnit sps_nalu, pps_nalu; + GstH264ParserResult rst; + + caps_str = "video/x-h264, alignment = (string) au"; + + gst_nv_h264_encoder_get_downstream_profiles_and_format (self, + downstream_profiles, nullptr); + + seq_params.version = gst_nvenc_get_sequence_param_payload_version (); + seq_params.inBufferSize = sizeof (spspps); + seq_params.spsppsBuffer = &spspps; + seq_params.outSPSPPSPayloadSize = &seq_size; + status = NvEncGetSequenceParams (session, &seq_params); + if (status != NV_ENC_SUCCESS) { + GST_ERROR_OBJECT (self, "Failed to get sequence header, status %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + return FALSE; + } + + rst = gst_h264_parser_identify_nalu (self->parser, + spspps, 0, seq_size, &sps_nalu); + if (rst != GST_H264_PARSER_OK) { + GST_ERROR_OBJECT (self, "Failed to identify SPS nal"); + return FALSE; + } + + if (sps_nalu.size < 4) { + GST_ERROR_OBJECT (self, "Too small sps nal size %d", sps_nalu.size); + return FALSE; + } + + rst = gst_h264_parser_identify_nalu_unchecked (self->parser, + spspps, sps_nalu.offset + sps_nalu.size, seq_size, &pps_nalu); + if (rst != GST_H264_PARSER_OK && self->packetized) { + GST_ERROR_OBJECT (self, "Failed to identify PPS nal, %d", rst); + return FALSE; + } + + if (self->packetized) { + GstMapInfo info; + guint8 *data; + guint8 profile_idc, profile_comp, level_idc; + const guint nal_length_size = 4; + const guint num_sps = 1; + const guint num_pps = 1; + + data = sps_nalu.data + sps_nalu.offset + sps_nalu.header_bytes; + profile_idc = data0; + profile_comp = data1; + level_idc = data2; + + /* 5: configuration version, profile, compatibility, level, nal length + * 1: num sps + * 2: sps size bytes + * sizeof (sps) + * 1: num pps + * 2: pps size bytes + * sizeof (pps) + * + * -> 11 + sps_size + pps_size + */ + codec_data = gst_buffer_new_and_alloc (11 + sps_nalu.size + pps_nalu.size); + + gst_buffer_map (codec_data, &info, GST_MAP_WRITE); + + data = (guint8 *) info.data; + data0 = 1; + data1 = profile_idc; + data2 = profile_comp; + data3 = level_idc; + data4 = 0xfc | (nal_length_size - 1); + data5 = 0xe0 | num_sps; + data += 6; + GST_WRITE_UINT16_BE (data, sps_nalu.size); + data += 2; + memcpy (data, sps_nalu.data + sps_nalu.offset, sps_nalu.size); + data += sps_nalu.size; + + data0 = num_pps; + data++; + + GST_WRITE_UINT16_BE (data, pps_nalu.size); + data += 2; + memcpy (data, pps_nalu.data + pps_nalu.offset, pps_nalu.size); + + gst_buffer_unmap (codec_data, &info); + } + + profile_from_sps = + gst_codec_utils_h264_get_profile (sps_nalu.data + sps_nalu.offset + + sps_nalu.header_bytes, 3); + + if (!profile_from_sps) { + GST_WARNING_OBJECT (self, "Failed to parse profile from SPS"); + } else if (!downstream_profiles.empty ()) { + if (downstream_profiles.find (profile_from_sps) != + downstream_profiles.end ()) { + caps_str += ", profile = (string) " + std::string (profile_from_sps); + } else if (downstream_profiles.find ("baseline") != + downstream_profiles.end () && + strcmp (profile_from_sps, "constrained-baseline") == 0) { + caps_str += ", profile = (string) baseline"; + } else if (downstream_profiles.find ("constrained-baseline") != + downstream_profiles.end () && + strcmp (profile_from_sps, "constrained-baseline") == 0) { + caps_str += ", profile = (string) constrained-baseline"; + } + } else { + caps_str += ", profile = (string) " + std::string (profile_from_sps); + } + + if (self->packetized) { + caps_str += ", stream-format = (string) avc"; + } else { + caps_str += ", stream-format = (string) byte-stream"; + } + + caps = gst_caps_from_string (caps_str.c_str ()); + + if (self->packetized) { + gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, codec_data, + nullptr); + gst_buffer_unref (codec_data); + } + + output_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (self), + caps, state); + + GST_INFO_OBJECT (self, "Output caps: %" GST_PTR_FORMAT, output_state->caps); + gst_video_codec_state_unref (output_state); + + tags = gst_tag_list_new_empty (); + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, + "nvh264encoder", nullptr); + + gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (encoder), + tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (tags); + + return TRUE; +} + +static GstBuffer * +gst_nv_h264_encoder_create_output_buffer (GstNvEncoder * encoder, + NV_ENC_LOCK_BITSTREAM * bitstream) +{ + GstNvH264Encoder *self = GST_NV_H264_ENCODER (encoder); + GstBuffer *buffer; + GstH264ParserResult rst; + GstH264NalUnit nalu; + + if (!self->packetized) { + return gst_buffer_new_memdup (bitstream->bitstreamBufferPtr, + bitstream->bitstreamSizeInBytes); + } + + buffer = gst_buffer_new (); + rst = gst_h264_parser_identify_nalu (self->parser, + (guint8 *) bitstream->bitstreamBufferPtr, 0, + bitstream->bitstreamSizeInBytes, &nalu); + + if (rst == GST_H264_PARSER_NO_NAL_END) + rst = GST_H264_PARSER_OK; + + while (rst == GST_H264_PARSER_OK) { + GstMemory *mem; + guint8 *data; + + data = (guint8 *) g_malloc0 (nalu.size + 4); + GST_WRITE_UINT32_BE (data, nalu.size); + memcpy (data + 4, nalu.data + nalu.offset, nalu.size); + + mem = gst_memory_new_wrapped ((GstMemoryFlags) 0, data, nalu.size + 4, + 0, nalu.size + 4, data, (GDestroyNotify) g_free); + gst_buffer_append_memory (buffer, mem); + + rst = gst_h264_parser_identify_nalu (self->parser, + (guint8 *) bitstream->bitstreamBufferPtr, nalu.offset + nalu.size, + bitstream->bitstreamSizeInBytes, &nalu); + + if (rst == GST_H264_PARSER_NO_NAL_END) + rst = GST_H264_PARSER_OK; + } + + return buffer; +} + +static GstNvEncoderReconfigure +gst_nv_h264_encoder_check_reconfigure (GstNvEncoder * encoder, + NV_ENC_CONFIG * config) +{ + GstNvH264Encoder *self = GST_NV_H264_ENCODER (encoder); + GstNvEncoderReconfigure reconfig = GST_NV_ENCODER_RECONFIGURE_NONE; + + /* Dynamic RC param update is not tested, do soft-reconfigure only for + * bitrate update */ + g_mutex_lock (&self->prop_lock); + if (self->init_param_updated || self->rc_param_updated) { + reconfig = GST_NV_ENCODER_RECONFIGURE_FULL; + goto done; + } + + if (self->bitrate_updated) { + GstNvH264EncoderClass *klass = GST_NV_H264_ENCODER_GET_CLASS (self); + if (klass->device_caps.dyn_bitrate_change > 0) { + config->rcParams.averageBitRate = self->bitrate * 1024; + config->rcParams.maxBitRate = self->max_bitrate * 1024; + reconfig = GST_NV_ENCODER_RECONFIGURE_BITRATE; + } else { + reconfig = GST_NV_ENCODER_RECONFIGURE_FULL; + } + } + +done: + self->init_param_updated = FALSE; + self->rc_param_updated = FALSE; + self->bitrate_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return reconfig; +} + +static gboolean +gst_nv_h264_encoder_select_device (GstNvEncoder * encoder, + const GstVideoInfo * info, GstBuffer * buffer, + GstNvEncoderDeviceData * data) +{ + GstNvH264Encoder *self = GST_NV_H264_ENCODER (encoder); + GstNvH264EncoderClass *klass = GST_NV_H264_ENCODER_GET_CLASS (self); + GstMemory *mem; + + memset (data, 0, sizeof (GstNvEncoderDeviceData)); + + g_assert (klass->device_mode == GST_NV_ENCODER_DEVICE_AUTO_SELECT); + + mem = gst_buffer_peek_memory (buffer, 0); + if (klass->cuda_device_id_size > 0 && gst_is_cuda_memory (mem)) { + GstCudaMemory *cmem = GST_CUDA_MEMORY_CAST (mem); + GstCudaContext *context = cmem->context; + guint device_id; + gboolean found = FALSE; + + g_object_get (context, "cuda-device-id", &device_id, nullptr); + + data->device_mode = GST_NV_ENCODER_DEVICE_CUDA; + self->selected_device_mode = GST_NV_ENCODER_DEVICE_CUDA; + + for (guint i = 0; i < klass->cuda_device_id_size; i++) { + if (klass->cuda_device_id_listi == device_id) { + data->cuda_device_id = device_id; + found = TRUE; + break; + } + } + + if (!found) { + GST_INFO_OBJECT (self, + "Upstream CUDA device is not in supported device list"); + data->cuda_device_id = self->cuda_device_id; + } else { + data->device = (GstObject *) gst_object_ref (context); + } + + if (data->cuda_device_id != self->cuda_device_id) { + self->cuda_device_id = data->cuda_device_id; + g_object_notify (G_OBJECT (self), "cuda-device-id"); + } + + return TRUE; + } +#ifdef GST_CUDA_HAS_D3D + if (klass->adapter_luid_size > 0 && gst_is_d3d11_memory (mem)) { + GstD3D11Memory *dmem = GST_D3D11_MEMORY_CAST (mem); + GstD3D11Device *device = dmem->device; + gint64 adapter_luid; + gboolean found = FALSE; + + g_object_get (device, "adapter-luid", &adapter_luid, nullptr); + + data->device_mode = GST_NV_ENCODER_DEVICE_D3D11; + self->selected_device_mode = GST_NV_ENCODER_DEVICE_D3D11; + + for (guint i = 0; i < klass->cuda_device_id_size; i++) { + if (klass->adapter_luid_listi == adapter_luid) { + data->adapter_luid = adapter_luid; + found = TRUE; + break; + } + } + + if (!found) { + GST_INFO_OBJECT (self, + "Upstream D3D11 device is not in supported device list"); + data->adapter_luid = self->adapter_luid; + } else { + data->device = (GstObject *) gst_object_ref (device); + } + + if (data->adapter_luid != self->adapter_luid) { + self->adapter_luid = data->adapter_luid; + g_object_notify (G_OBJECT (self), "adapter-luid"); + } + + return TRUE; + } +#endif + + if (klass->cuda_device_id_size > 0 && + (self->selected_device_mode != GST_NV_ENCODER_DEVICE_D3D11)) { + GST_INFO_OBJECT (self, "Upstream is system memory, use CUDA mode"); + data->device_mode = GST_NV_ENCODER_DEVICE_CUDA; + data->cuda_device_id = self->cuda_device_id; + } else { + GST_INFO_OBJECT (self, "Upstream is system memory, use D3D11 mode"); + data->device_mode = GST_NV_ENCODER_DEVICE_D3D11; + data->adapter_luid = klass->adapter_luid; + } + + self->selected_device_mode = data->device_mode; + + return TRUE; +} + +static GstNvEncoderClassData * +gst_nv_h264_encoder_create_class_data (GstObject * device, gpointer session, + GstNvEncoderDeviceMode device_mode) +{ + NVENCSTATUS status; + GstNvEncoderDeviceCaps dev_caps = { 0, }; + GUID profile_guids16; + NV_ENC_BUFFER_FORMAT input_formats16; + guint32 profile_guid_count = 0; + guint32 input_format_count = 0; + std::string sink_caps_str; + std::string src_caps_str; + std::string format_str; + std::set < std::string > formats; + std::set < std::string > profiles; + std::string profile_str; + std::string resolution_str; + GstNvEncoderClassData *cdata; + GstCaps *sink_caps; + GstCaps *system_caps; + + status = NvEncGetEncodeProfileGUIDs (session, NV_ENC_CODEC_H264_GUID, + profile_guids, G_N_ELEMENTS (profile_guids), &profile_guid_count); + if (status != NV_ENC_SUCCESS || profile_guid_count == 0) { + GST_WARNING_OBJECT (device, "Unable to get supported profiles"); + return nullptr; + } + + status = NvEncGetInputFormats (session, NV_ENC_CODEC_H264_GUID, input_formats, + G_N_ELEMENTS (input_formats), &input_format_count); + if (status != NV_ENC_SUCCESS || input_format_count == 0) { + GST_WARNING_OBJECT (device, "Unable to get supported input formats"); + return nullptr; + } + + gst_nv_encoder_get_encoder_caps (session, &NV_ENC_CODEC_H264_GUID, &dev_caps); + + for (guint32 i = 0; i < input_format_count; i++) { + switch (input_formatsi) { + case NV_ENC_BUFFER_FORMAT_NV12: + formats.insert ("NV12"); + break; + case NV_ENC_BUFFER_FORMAT_YUV444: + if (dev_caps.yuv444_encode) + formats.insert ("Y444"); + break; + default: + break; + } + } + + if (formats.empty ()) { + GST_WARNING_OBJECT (device, "Empty supported input format"); + return nullptr; + } +#define APPEND_STRING(dst,set,str) G_STMT_START { \ + if (set.find(str) != set.end()) { \ + if (!first) \ + dst += ", "; \ + dst += str; \ + first = false; \ + } \ +} G_STMT_END + + if (formats.size () == 1) { + format_str = "format = (string) " + *(formats.begin ()); + } else { + bool first = true; + + format_str = "format = (string) { "; + APPEND_STRING (format_str, formats, "NV12"); + APPEND_STRING (format_str, formats, "Y444"); + format_str += " }"; + } + + for (guint32 i = 0; i < profile_guid_count; i++) { + if (profile_guidsi == NV_ENC_H264_PROFILE_BASELINE_GUID) { + profiles.insert ("baseline"); + profiles.insert ("constrained-baseline"); + } else if (profile_guidsi == NV_ENC_H264_PROFILE_MAIN_GUID) { + profiles.insert ("main"); + } else if (profile_guidsi == NV_ENC_H264_PROFILE_HIGH_GUID) { + profiles.insert ("high"); + } else if (profile_guidsi == NV_ENC_H264_PROFILE_HIGH_444_GUID) { + profiles.insert ("high-4:4:4"); + } else if (profile_guidsi == NV_ENC_H264_PROFILE_PROGRESSIVE_HIGH_GUID) { + profiles.insert ("progressive-high"); + } else if (profile_guidsi == NV_ENC_H264_PROFILE_CONSTRAINED_HIGH_GUID) { + profiles.insert ("constrained-high"); + } + } + + if (profiles.empty ()) { + GST_WARNING_OBJECT (device, "Empty supported h264 profile"); + return nullptr; + } + + if (profiles.size () == 1) { + profile_str = "profile = (string) " + *(profiles.begin ()); + } else { + bool first = true; + + profile_str = "profile = (string) { "; + APPEND_STRING (profile_str, profiles, "main"); + APPEND_STRING (profile_str, profiles, "high"); + APPEND_STRING (profile_str, profiles, "progressive-high"); + APPEND_STRING (profile_str, profiles, "constrained-high"); + APPEND_STRING (profile_str, profiles, "constrained-baseline"); + APPEND_STRING (profile_str, profiles, "baseline"); + APPEND_STRING (profile_str, profiles, "high-4:4:4"); + profile_str += " }"; + } +#undef APPEND_STRING + + resolution_str = "width = (int) " + + std::to_string (GST_ROUND_UP_16 (dev_caps.width_min)) + + ", " + std::to_string (dev_caps.width_max) + " "; + resolution_str += ", height = (int) " + + std::to_string (GST_ROUND_UP_16 (dev_caps.height_min)) + + ", " + std::to_string (dev_caps.height_max) + " "; + + sink_caps_str = "video/x-raw, " + format_str + ", " + resolution_str; + + if (dev_caps.field_encoding > 0) { + sink_caps_str += ", interlace-mode = (string) { interleaved, mixed }"; + } else { + sink_caps_str += ", interlace-mode = (string) progressive"; + } + + src_caps_str = "video/x-h264, " + resolution_str + ", " + profile_str + + ", stream-format = (string) { avc, byte-stream }, alignment = (string) au"; + + system_caps = gst_caps_from_string (sink_caps_str.c_str ()); + sink_caps = gst_caps_copy (system_caps); +#ifdef GST_CUDA_HAS_D3D + if (device_mode == GST_NV_ENCODER_DEVICE_D3D11) { + gst_caps_set_features (sink_caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr)); + } +#endif + + if (device_mode == GST_NV_ENCODER_DEVICE_CUDA) { + gst_caps_set_features (sink_caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY, nullptr)); + } + + gst_caps_append (sink_caps, system_caps); + + cdata = gst_nv_encoder_class_data_new (); + cdata->sink_caps = sink_caps; + cdata->src_caps = gst_caps_from_string (src_caps_str.c_str ()); + cdata->device_caps = dev_caps; + cdata->device_mode = device_mode; + + /* *INDENT-OFF* */ + for (const auto &iter: formats) + cdata->formats = g_list_append (cdata->formats, g_strdup (iter.c_str())); + + for (const auto &iter: profiles) + cdata->profiles = g_list_append (cdata->profiles, g_strdup (iter.c_str())); + /* *INDENT-ON* */ + + if (device_mode == GST_NV_ENCODER_DEVICE_D3D11) + g_object_get (device, "adapter-luid", &cdata->adapter_luid, nullptr); + + if (device_mode == GST_NV_ENCODER_DEVICE_CUDA) + g_object_get (device, "cuda-device-id", &cdata->cuda_device_id, nullptr); + + /* class data will be leaked if the element never gets instantiated */ + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + return cdata; +} + +GstNvEncoderClassData * +gst_nv_h264_encoder_register_cuda (GstPlugin * plugin, GstCudaContext * context, + guint rank) +{ + NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS session_params = { 0, }; + gpointer session; + NVENCSTATUS status; + GstNvEncoderClassData *cdata; + + GST_DEBUG_CATEGORY_INIT (gst_nv_h264_encoder_debug, "nvh264encoder", 0, + "nvh264encoder"); + + session_params.version = + gst_nvenc_get_open_encode_session_ex_params_version (); + session_params.deviceType = NV_ENC_DEVICE_TYPE_CUDA; + session_params.device = gst_cuda_context_get_handle (context); + session_params.apiVersion = gst_nvenc_get_api_version (); + + status = NvEncOpenEncodeSessionEx (&session_params, &session); + if (status != NV_ENC_SUCCESS) { + GST_WARNING_OBJECT (context, "Failed to open session"); + return nullptr; + } + + cdata = gst_nv_h264_encoder_create_class_data (GST_OBJECT (context), session, + GST_NV_ENCODER_DEVICE_CUDA); + NvEncDestroyEncoder (session); + + if (!cdata) + return nullptr; + + gst_nv_encoder_class_data_ref (cdata); + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstNvH264EncoderClass), + nullptr, + nullptr, + (GClassInitFunc) gst_nv_h264_encoder_class_init, + nullptr, + cdata, + sizeof (GstNvH264Encoder), + 0, + (GInstanceInitFunc) gst_nv_h264_encoder_init, + }; + + type_name = g_strdup ("GstNvCudaH264Enc"); + feature_name = g_strdup ("nvcudah264enc"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstNvCudaH264Device%dEnc", index); + feature_name = g_strdup_printf ("nvcudah264device%denc", index); + } + + type = g_type_register_static (GST_TYPE_NV_ENCODER, type_name, + &type_info, (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); + + return cdata; +} + +#ifdef GST_CUDA_HAS_D3D +GstNvEncoderClassData * +gst_nv_h264_encoder_register_d3d11 (GstPlugin * plugin, GstD3D11Device * device, + guint rank) +{ + NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS session_params = { 0, }; + gpointer session; + NVENCSTATUS status; + GstNvEncoderClassData *cdata; + + GST_DEBUG_CATEGORY_INIT (gst_nv_h264_encoder_debug, "nvh264encoder", 0, + "nvh264encoder"); + + session_params.version = + gst_nvenc_get_open_encode_session_ex_params_version (); + session_params.deviceType = NV_ENC_DEVICE_TYPE_DIRECTX; + session_params.device = gst_d3d11_device_get_device_handle (device); + session_params.apiVersion = gst_nvenc_get_api_version (); + + status = NvEncOpenEncodeSessionEx (&session_params, &session); + if (status != NV_ENC_SUCCESS) { + GST_WARNING_OBJECT (device, "Failed to open session"); + return nullptr; + } + + cdata = gst_nv_h264_encoder_create_class_data (GST_OBJECT (device), session, + GST_NV_ENCODER_DEVICE_D3D11); + NvEncDestroyEncoder (session); + + if (!cdata) + return nullptr; + + gst_nv_encoder_class_data_ref (cdata); + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstNvH264EncoderClass), + nullptr, + nullptr, + (GClassInitFunc) gst_nv_h264_encoder_class_init, + nullptr, + cdata, + sizeof (GstNvH264Encoder), + 0, + (GInstanceInitFunc) gst_nv_h264_encoder_init, + }; + + type_name = g_strdup ("GstNvD3D11H264Enc"); + feature_name = g_strdup ("nvd3d11h264enc"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstNvD3D11H264Device%dEnc", index); + feature_name = g_strdup_printf ("nvd3d11h264device%denc", index); + } + + type = g_type_register_static (GST_TYPE_NV_ENCODER, type_name, + &type_info, (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); + + return cdata; +} +#endif + +void +gst_nv_h264_encoder_register_auto_select (GstPlugin * plugin, + GList * device_caps_list, guint rank) +{ + std::set < std::string > formats; + std::set < std::string > profiles; + std::string sink_caps_str; + std::string src_caps_str; + std::string format_str; + std::string profile_str; + std::string resolution_str; + GList *iter; + guint adapter_luid_size = 0; + gint64 adapter_luid_list8; + guint cuda_device_id_size = 0; + guint cuda_device_id_list8; + GstNvEncoderDeviceCaps dev_caps; + GstNvEncoderClassData *cdata; + GstCaps *sink_caps = nullptr; + GstCaps *system_caps; + + GST_DEBUG_CATEGORY_INIT (gst_nv_h264_encoder_debug, "nvh264encoder", 0, + "nvh264encoder"); + + for (iter = device_caps_list; iter; iter = g_list_next (iter)) { + GstNvEncoderClassData *cdata = (GstNvEncoderClassData *) iter->data; + GList *walk; + + for (walk = cdata->formats; walk; walk = g_list_next (walk)) + formats.insert ((gchar *) walk->data); + + for (walk = cdata->profiles; walk; walk = g_list_next (walk)) + profiles.insert ((gchar *) walk->data); + + if (cdata->device_mode == GST_NV_ENCODER_DEVICE_D3D11 && + adapter_luid_size < G_N_ELEMENTS (adapter_luid_list) - 1) { + adapter_luid_listadapter_luid_size = cdata->adapter_luid; + adapter_luid_size++; + } + + if (cdata->device_mode == GST_NV_ENCODER_DEVICE_CUDA && + cuda_device_id_size < G_N_ELEMENTS (cuda_device_id_list) - 1) { + cuda_device_id_listcuda_device_id_size = cdata->cuda_device_id; + cuda_device_id_size++; + } + + if (iter == device_caps_list) { + dev_caps = cdata->device_caps; + } else { + gst_nv_encoder_merge_device_caps (&dev_caps, &cdata->device_caps, + &dev_caps); + } + } + + g_list_free_full (device_caps_list, + (GDestroyNotify) gst_nv_encoder_class_data_unref); + if (formats.empty () || profiles.empty ()) + return; + +#define APPEND_STRING(dst,set,str) G_STMT_START { \ + if (set.find(str) != set.end()) { \ + if (!first) \ + dst += ", "; \ + dst += str; \ + first = false; \ + } \ +} G_STMT_END + + if (formats.size () == 1) { + format_str = "format = (string) " + *(formats.begin ()); + } else { + bool first = true; + + format_str = "format = (string) { "; + APPEND_STRING (format_str, formats, "NV12"); + APPEND_STRING (format_str, formats, "Y444"); + format_str += " }"; + } + + if (profiles.size () == 1) { + profile_str = "profile = (string) " + *(profiles.begin ()); + } else { + bool first = true; + + profile_str = "profile = (string) { "; + APPEND_STRING (profile_str, profiles, "main"); + APPEND_STRING (profile_str, profiles, "high"); + APPEND_STRING (profile_str, profiles, "progressive-high"); + APPEND_STRING (profile_str, profiles, "constrained-high"); + APPEND_STRING (profile_str, profiles, "constrained-baseline"); + APPEND_STRING (profile_str, profiles, "baseline"); + APPEND_STRING (profile_str, profiles, "high-4:4:4"); + profile_str += " }"; + } +#undef APPEND_STRING + + resolution_str = "width = (int) " + + std::to_string (GST_ROUND_UP_16 (dev_caps.width_min)) + + ", " + std::to_string (dev_caps.width_max) + " "; + resolution_str += ", height = (int) " + + std::to_string (GST_ROUND_UP_16 (dev_caps.height_min)) + + ", " + std::to_string (dev_caps.height_max) + " "; + + sink_caps_str = "video/x-raw, " + format_str + ", " + resolution_str; + + if (dev_caps.field_encoding > 0) { + sink_caps_str += ", interlace-mode = (string) { interleaved, mixed }"; + } else { + sink_caps_str += ", interlace-mode = (string) progressive"; + } + + src_caps_str = "video/x-h264, " + resolution_str + ", " + profile_str + + ", stream-format = (string) { avc, byte-stream }, alignment = (string) au"; + + system_caps = gst_caps_from_string (sink_caps_str.c_str ()); + sink_caps = gst_caps_new_empty (); + + if (cuda_device_id_size > 0) { + GstCaps *cuda_caps = gst_caps_copy (system_caps); + gst_caps_set_features (cuda_caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY, nullptr)); + gst_caps_append (sink_caps, cuda_caps); + } +#ifdef GST_CUDA_HAS_D3D + if (adapter_luid_size > 0) { + GstCaps *d3d11_caps = gst_caps_copy (system_caps); + gst_caps_set_features (d3d11_caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr)); + gst_caps_append (sink_caps, d3d11_caps); + } +#endif + + gst_caps_append (sink_caps, system_caps); + + cdata = gst_nv_encoder_class_data_new (); + cdata->sink_caps = sink_caps; + cdata->src_caps = gst_caps_from_string (src_caps_str.c_str ()); + cdata->device_caps = dev_caps; + cdata->device_mode = GST_NV_ENCODER_DEVICE_AUTO_SELECT; + cdata->adapter_luid = adapter_luid_list0; + cdata->adapter_luid_size = adapter_luid_size; + memcpy (&cdata->adapter_luid_list, + adapter_luid_list, sizeof (adapter_luid_list)); + cdata->cuda_device_id = cuda_device_id_list0; + cdata->cuda_device_id_size = cuda_device_id_size; + memcpy (&cdata->cuda_device_id_list, + cuda_device_id_list, sizeof (cuda_device_id_list)); + + /* class data will be leaked if the element never gets instantiated */ + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GType type; + GTypeInfo type_info = { + sizeof (GstNvH264EncoderClass), + nullptr, + nullptr, + (GClassInitFunc) gst_nv_h264_encoder_class_init, + nullptr, + cdata, + sizeof (GstNvH264Encoder), + 0, + (GInstanceInitFunc) gst_nv_h264_encoder_init, + }; + + type = g_type_register_static (GST_TYPE_NV_ENCODER, "GstNvAutoGpuH264Enc", + &type_info, (GTypeFlags) 0); + + if (!gst_element_register (plugin, "nvautogpuh264enc", rank, type)) + GST_WARNING ("Failed to register plugin 'GstNvAutoGpuH264Enc'"); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvh264encoder.h
Added
@@ -0,0 +1,40 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "gstnvencoder.h" + +G_BEGIN_DECLS + +GstNvEncoderClassData * gst_nv_h264_encoder_register_cuda (GstPlugin * plugin, + GstCudaContext * context, + guint rank); + +#ifdef GST_CUDA_HAS_D3D +GstNvEncoderClassData * gst_nv_h264_encoder_register_d3d11 (GstPlugin * plugin, + GstD3D11Device * device, + guint rank); +#endif + +void gst_nv_h264_encoder_register_auto_select (GstPlugin * plugin, + GList * device_caps, + guint rank); + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvh265dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvh265dec.c
Changed
@@ -70,12 +70,27 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/** + * SECTION:element-nvh265sldec + * @title: nvh265sldec + * + * GstCodecs based NVIDIA H.265 video decoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 filesrc location=/path/to/h265/file ! parsebin ! nvh265sldec ! videoconvert ! autovideosink + * ``` + * + * Since: 1.18 + * + */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif +#include <gst/cuda/gstcudautils.h> #include "gstnvh265dec.h" -#include "gstcudautils.h" #include "gstnvdecoder.h" #include <string.h> @@ -83,12 +98,10 @@ GST_DEBUG_CATEGORY_STATIC (gst_nv_h265_dec_debug); #define GST_CAT_DEFAULT gst_nv_h265_dec_debug -struct _GstNvH265Dec +typedef struct _GstNvH265Dec { GstH265Decoder parent; - GstVideoCodecState *output_state; - GstCudaContext *context; GstNvDecoder *decoder; CUVIDPICPARAMS params; @@ -108,16 +121,28 @@ guint coded_width, coded_height; guint bitdepth; guint chroma_format_idc; -}; +} GstNvH265Dec; -struct _GstNvH265DecClass +typedef struct _GstNvH265DecClass { GstH265DecoderClass parent_class; guint cuda_device_id; +} GstNvH265DecClass; + +enum +{ + PROP_0, + PROP_CUDA_DEVICE_ID, }; -#define gst_nv_h265_dec_parent_class parent_class -G_DEFINE_TYPE (GstNvH265Dec, gst_nv_h265_dec, GST_TYPE_H265_DECODER); +static GTypeClass *parent_class = NULL; + +#define GST_NV_H265_DEC(object) ((GstNvH265Dec *) (object)) +#define GST_NV_H265_DEC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstNvH265DecClass)) + +static void gst_nv_h265_dec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static void gst_nv_h265_dec_set_context (GstElement * element, GstContext * context); @@ -143,22 +168,48 @@ GArray * ref_pic_list0, GArray * ref_pic_list1); static GstFlowReturn gst_nv_h265_dec_end_picture (GstH265Decoder * decoder, GstH265Picture * picture); +static guint +gst_nv_h265_dec_get_preferred_output_delay (GstH265Decoder * decoder, + gboolean live); static void -gst_nv_h265_dec_class_init (GstNvH265DecClass * klass) +gst_nv_h265_dec_class_init (GstNvH265DecClass * klass, + GstNvDecoderClassData * cdata) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_CLASS (klass); GstH265DecoderClass *h265decoder_class = GST_H265_DECODER_CLASS (klass); + object_class->get_property = gst_nv_h265_dec_get_property; + /** - * GstNvH265Dec + * GstNvH265SLDec:cuda-device-id: * - * Since: 1.18 + * Assigned CUDA device id + * + * Since: 1.22 */ + g_object_class_install_property (object_class, PROP_CUDA_DEVICE_ID, + g_param_spec_uint ("cuda-device-id", "CUDA device id", + "Assigned CUDA device id", 0, G_MAXINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); element_class->set_context = GST_DEBUG_FUNCPTR (gst_nv_h265_dec_set_context); + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + gst_element_class_set_static_metadata (element_class, + "NVDEC H.265 Stateless Decoder", + "Codec/Decoder/Video/Hardware", + "NVIDIA H.265 video decoder", "Seungha Yang <seungha@centricular.com>"); + + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + cdata->sink_caps)); + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + cdata->src_caps)); + decoder_class->open = GST_DEBUG_FUNCPTR (gst_nv_h265_dec_open); decoder_class->close = GST_DEBUG_FUNCPTR (gst_nv_h265_dec_close); decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_nv_h265_dec_negotiate); @@ -178,11 +229,14 @@ GST_DEBUG_FUNCPTR (gst_nv_h265_dec_decode_slice); h265decoder_class->end_picture = GST_DEBUG_FUNCPTR (gst_nv_h265_dec_end_picture); + h265decoder_class->get_preferred_output_delay = + GST_DEBUG_FUNCPTR (gst_nv_h265_dec_get_preferred_output_delay); - GST_DEBUG_CATEGORY_INIT (gst_nv_h265_dec_debug, - "nvh265dec", 0, "Nvidia H.265 Decoder"); + klass->cuda_device_id = cdata->cuda_device_id; - gst_type_mark_as_plugin_api (GST_TYPE_NV_H265_DEC, 0); + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); } static void @@ -191,6 +245,22 @@ } static void +gst_nv_h265_dec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstNvH265DecClass *klass = GST_NV_H265_DEC_GET_CLASS (object); + + switch (prop_id) { + case PROP_CUDA_DEVICE_ID: + g_value_set_uint (value, klass->cuda_device_id); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void gst_nv_h265_dec_set_context (GstElement * element, GstContext * context) { GstNvH265Dec *self = GST_NV_H265_DEC (element); @@ -239,7 +309,6 @@ { GstNvH265Dec *self = GST_NV_H265_DEC (decoder); - g_clear_pointer (&self->output_state, gst_video_codec_state_unref); gst_clear_object (&self->decoder); gst_clear_object (&self->context); @@ -260,8 +329,7 @@ GST_DEBUG_OBJECT (self, "negotiate"); - gst_nv_decoder_negotiate (self->decoder, decoder, h265dec->input_state, - &self->output_state); + gst_nv_decoder_negotiate (self->decoder, decoder, h265dec->input_state); /* TODO: add support D3D11 memory */ @@ -385,9 +453,7 @@ if (!gst_nv_decoder_configure (self->decoder, cudaVideoCodec_HEVC, &info, self->coded_width, self->coded_height, - self->bitdepth, - /* Additional 2 buffers for margin */ - max_dpb_size + 2)) { + self->bitdepth, max_dpb_size, FALSE)) { GST_ERROR_OBJECT (self, "Failed to configure decoder"); return GST_FLOW_NOT_NEGOTIATED; } @@ -442,8 +508,8 @@ goto error; } - if (!gst_nv_decoder_finish_frame (self->decoder, vdec, decoder_frame, - &frame->output_buffer)) { + if (!gst_nv_decoder_finish_frame (self->decoder, vdec, picture->discont_state, + decoder_frame, &frame->output_buffer)) { GST_ERROR_OBJECT (self, "Failed to handle output picture"); goto error; } @@ -482,7 +548,7 @@ #define COPY_FIELD_WITH_PREFIX(f) \ (params)->G_PASTE(sps_,f) = (sps)->f #define COPY_FIELD_EXTENSION(f) \ - (params)->f = (sps)->sps_extnsion_params.f + (params)->f = (sps)->sps_extension_params.f params->pic_width_in_luma_samples = sps->width; params->pic_height_in_luma_samples = sps->height; @@ -655,7 +721,7 @@ GstNvDecoderFrame *frame; GArray *dpb_array; gint num_ref_pic; - gint i, j; + gint i, j, k; const GstH265ScalingList *scaling_list = NULL; /* both NVDEC and h265parser are using the same order */ @@ -749,7 +815,6 @@ } other_frame = gst_nv_h265_dec_get_decoder_frame_from_picture (self, other); - if (other_frame) picture_index = other_frame->index; @@ -759,62 +824,52 @@ num_ref_pic++; } - g_array_unref (dpb_array); - for (i = num_ref_pic; i < G_N_ELEMENTS (h265_params->RefPicIdx); i++) - h265_params->RefPicIdxi = -1; + for (i = 0, j = 0; i < num_ref_pic; i++) { + GstH265Picture *other = NULL; - for (i = 0; i < decoder->NumPocStCurrBefore; i++) { - GstH265Picture *other; + while (!other && j < decoder->NumPocStCurrBefore) + other = decoder->RefPicSetStCurrBeforej++; - if (!decoder->RefPicSetStCurrBeforei) { - GST_ERROR_OBJECT (self, "Empty RefPicSetStCurrBefore%d", i); - return GST_FLOW_ERROR; - } - - other = decoder->RefPicSetStCurrBeforei; - - for (j = 0; j < num_ref_pic; j++) { - if (h265_params->PicOrderCntValj == other->pic_order_cnt) { - h265_params->RefPicSetStCurrBeforei = j; - break; + if (other) { + for (k = 0; k < num_ref_pic; k++) { + if (h265_params->PicOrderCntValk == other->pic_order_cnt) { + h265_params->RefPicSetStCurrBeforei = k; + break; + } } } } - for (i = 0; i < decoder->NumPocStCurrAfter; i++) { - GstH265Picture *other; - - if (!decoder->RefPicSetStCurrAfteri) { - GST_ERROR_OBJECT (self, "Empty RefPicSetStCurrAfter%d", i); - return GST_FLOW_ERROR; - } + for (i = 0, j = 0; i < num_ref_pic; i++) { + GstH265Picture *other = NULL; - other = decoder->RefPicSetStCurrAfteri; + while (!other && j < decoder->NumPocStCurrAfter) + other = decoder->RefPicSetStCurrAfterj++; - for (j = 0; j < num_ref_pic; j++) { - if (h265_params->PicOrderCntValj == other->pic_order_cnt) { - h265_params->RefPicSetStCurrAfteri = j; - break; + if (other) { + for (k = 0; k < num_ref_pic; k++) { + if (h265_params->PicOrderCntValk == other->pic_order_cnt) { + h265_params->RefPicSetStCurrAfteri = k; + break; + } } } } - for (i = 0; i < decoder->NumPocLtCurr; i++) { - GstH265Picture *other; + for (i = 0, j = 0; i < num_ref_pic; i++) { + GstH265Picture *other = NULL; - if (!decoder->RefPicSetLtCurri) { - GST_ERROR_OBJECT (self, "Empty RefPicSetLtCurr%d", i); - return GST_FLOW_ERROR; - } - - other = decoder->RefPicSetLtCurri; + while (!other && j < decoder->NumPocLtCurr) + other = decoder->RefPicSetLtCurrj++; - for (j = 0; j < num_ref_pic; j++) { - if (h265_params->PicOrderCntValj == other->pic_order_cnt) { - h265_params->RefPicSetLtCurri = j; - break; + if (other) { + for (k = 0; k < num_ref_pic; k++) { + if (h265_params->PicOrderCntValk == other->pic_order_cnt) { + h265_params->RefPicSetLtCurri = k; + break; + } } } } @@ -916,68 +971,44 @@ return GST_FLOW_OK; } -typedef struct +static guint +gst_nv_h265_dec_get_preferred_output_delay (GstH265Decoder * decoder, + gboolean live) { - GstCaps *sink_caps; - GstCaps *src_caps; - guint cuda_device_id; - gboolean is_default; -} GstNvH265DecClassData; - -static void -gst_nv_h265_dec_subclass_init (gpointer klass, GstNvH265DecClassData * cdata) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstNvH265DecClass *nvdec_class = (GstNvH265DecClass *) (klass); - gchar *long_name; - - if (cdata->is_default) { - long_name = g_strdup_printf ("NVDEC H.265 Stateless Decoder"); - } else { - long_name = g_strdup_printf ("NVDEC H.265 Stateless Decoder with device %d", - cdata->cuda_device_id); - } - - gst_element_class_set_metadata (element_class, long_name, - "Codec/Decoder/Video/Hardware", - "Nvidia H.265 video decoder", "Seungha Yang <seungha@centricular.com>"); - g_free (long_name); - - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); - - nvdec_class->cuda_device_id = cdata->cuda_device_id; + /* Prefer to zero latency for live pipeline */ + if (live) + return 0; - gst_caps_unref (cdata->sink_caps); - gst_caps_unref (cdata->src_caps); - g_free (cdata); + /* NVCODEC SDK uses 4 frame delay for better throughput performance */ + return 4; } void gst_nv_h265_dec_register (GstPlugin * plugin, guint device_id, guint rank, GstCaps * sink_caps, GstCaps * src_caps, gboolean is_primary) { - GTypeQuery type_query; - GTypeInfo type_info = { 0, }; - GType subtype; + GType type; gchar *type_name; gchar *feature_name; - GstNvH265DecClassData *cdata; - gboolean is_default = TRUE; + GstNvDecoderClassData *cdata; + gint index = 0; GValue value_list = G_VALUE_INIT; GValue value = G_VALUE_INIT; - - /** - * element-nvh265sldec - * - * Since: 1.18 - */ - - cdata = g_new0 (GstNvH265DecClassData, 1); + GTypeInfo type_info = { + sizeof (GstNvH265DecClass), + NULL, + NULL, + (GClassInitFunc) gst_nv_h265_dec_class_init, + NULL, + NULL, + sizeof (GstNvH265Dec), + 0, + (GInstanceInitFunc) gst_nv_h265_dec_init, + }; + + GST_DEBUG_CATEGORY_INIT (gst_nv_h265_dec_debug, "nvh265dec", 0, "nvh265dec"); + + cdata = g_new0 (GstNvDecoderClassData, 1); cdata->sink_caps = gst_caps_copy (sink_caps); /* Update stream-format since we support packetized format as well */ @@ -1002,45 +1033,36 @@ cdata->src_caps = gst_caps_ref (src_caps); cdata->cuda_device_id = device_id; - g_type_query (GST_TYPE_NV_H265_DEC, &type_query); - memset (&type_info, 0, sizeof (type_info)); - type_info.class_size = type_query.class_size; - type_info.instance_size = type_query.instance_size; - type_info.class_init = (GClassInitFunc) gst_nv_h265_dec_subclass_init; - type_info.class_data = cdata; - if (is_primary) { - type_name = g_strdup ("GstNvH265StatelessPrimaryDec"); + type_name = g_strdup ("GstNvH265Dec"); feature_name = g_strdup ("nvh265dec"); } else { - type_name = g_strdup ("GstNvH265StatelessDec"); + type_name = g_strdup ("GstNvH265SLDec"); feature_name = g_strdup ("nvh265sldec"); } - if (g_type_from_name (type_name) != 0) { + while (g_type_from_name (type_name)) { + index++; g_free (type_name); g_free (feature_name); if (is_primary) { - type_name = - g_strdup_printf ("GstNvH265StatelessPrimaryDevice%dDec", device_id); - feature_name = g_strdup_printf ("nvh265device%ddec", device_id); + type_name = g_strdup_printf ("GstNvH265Device%dDec", index); + feature_name = g_strdup_printf ("nvh265device%ddec", index); } else { - type_name = g_strdup_printf ("GstNvH265StatelessDevice%dDec", device_id); - feature_name = g_strdup_printf ("nvh265sldevice%ddec", device_id); + type_name = g_strdup_printf ("GstNvH265SLDevice%dDec", index); + feature_name = g_strdup_printf ("nvh265sldevice%ddec", index); } - - is_default = FALSE; } - cdata->is_default = is_default; - subtype = g_type_register_static (GST_TYPE_NV_H265_DEC, + type_info.class_data = cdata; + type = g_type_register_static (GST_TYPE_H265_DECODER, type_name, &type_info, 0); /* make lower rank than default device */ - if (rank > 0 && !is_default) + if (rank > 0 && index > 0) rank--; - if (!gst_element_register (plugin, feature_name, rank, subtype)) + if (!gst_element_register (plugin, feature_name, rank, type)) GST_WARNING ("Failed to register plugin '%s'", type_name); g_free (type_name);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvh265dec.h -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvh265dec.h
Changed
@@ -25,16 +25,6 @@ G_BEGIN_DECLS -#define GST_TYPE_NV_H265_DEC (gst_nv_h265_dec_get_type()) -#define GST_NV_H265_DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_NV_H265_DEC, GstNvH265Dec)) -#define GST_NV_H265_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_NV_H265_DEC, GstNvH265DecClass)) -#define GST_NV_H265_DEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_NV_H265_DEC, GstNvH265DecClass)) - -typedef struct _GstNvH265Dec GstNvH265Dec; -typedef struct _GstNvH265DecClass GstNvH265DecClass; - -GType gst_nv_h265_dec_get_type (void); - void gst_nv_h265_dec_register (GstPlugin * plugin, guint device_id, guint rank,
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvh265encoder.cpp
Added
@@ -0,0 +1,2254 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * element-nvcudah265enc: + * + * NVIDIA CUDA mode H.265 encoder + * + * Since: 1.22 + */ + +/** + * element-nvd3d11h265enc: + * + * NVIDIA Direct3D11 mode H.265 encoder + * + * Since: 1.22 + */ + +/** + * element-nvautogpuh265enc: + * + * NVIDIA auto GPU select mode H.265 encoder + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstnvh265encoder.h" +#include <gst/codecparsers/gsth265parser.h> +#include <gst/pbutils/codec-utils.h> +#include <string> +#include <set> +#include <string.h> + +GST_DEBUG_CATEGORY_STATIC (gst_nv_h265_encoder_debug); +#define GST_CAT_DEFAULT gst_nv_h265_encoder_debug + +static GTypeClass *parent_class = NULL; + +enum +{ + PROP_0, + PROP_ADAPTER_LUID, + PROP_CUDA_DEVICE_ID, + + /* init params */ + PROP_PRESET, + PROP_WEIGHTED_PRED, + + /* encoding config */ + PROP_GOP_SIZE, + PROP_B_FRAMES, + + /* rate-control params */ + PROP_RATE_CONTROL, + + PROP_QP_I, + PROP_QP_P, + PROP_QP_B, + + PROP_BITRATE, + PROP_MAX_BITRATE, + PROP_VBV_BUFFER_SIZE, + + PROP_RC_LOOKAHEAD, + PROP_I_ADAPT, + PROP_B_ADAPT, + PROP_SPATIAL_AQ, + PROP_TEMPORAL_AQ, + PROP_ZERO_REORDER_DELAY, + PROP_NON_REF_P, + PROP_STRICT_GOP, + PROP_AQ_STRENGTH, + + PROP_MIN_QP_I, + PROP_MIN_QP_P, + PROP_MIN_QP_B, + + PROP_MAX_QP_I, + PROP_MAX_QP_P, + PROP_MAX_QP_B, + + PROP_CONST_QUALITY, + + /* h265 specific */ + PROP_AUD, + PROP_REPEAT_SEQUENCE_HEADER, +}; + +#define DEFAULT_PRESET GST_NV_ENCODER_PRESET_DEFAULT +#define DEFAULT_WEIGHTED_PRED FALSE +#define DEFAULT_GOP_SIZE 30 +#define DEFAULT_B_FRAMES 0 +#define DEFAULT_RATE_CONTROL GST_NV_ENCODER_RC_MODE_VBR +#define DEFAULT_QP -1 +#define DEFAULT_BITRATE 0 +#define DEFAULT_MAX_BITRATE 0 +#define DEFAULT_VBV_BUFFER_SIZE 0 +#define DEFAULT_RC_LOOKAHEAD 0 +#define DEFAULT_I_ADAPT FALSE +#define DEFAULT_B_ADAPT FALSE +#define DEFAULT_SPATIAL_AQ FALSE +#define DEFAULT_TEMPORAL_AQ FALSE +#define DEFAULT_ZERO_REORDER_DELAY FALSE +#define DEFAULT_NON_REF_P FALSE +#define DEFAULT_STRICT_GOP FALSE +#define DEFAULT_AQ_STRENGTH FALSE +#define DEFAULT_CONST_QUALITY 0 +#define DEFAULT_AUD TRUE +#define DEFAULT_REPEAT_SEQUENCE_HEADER FALSE + +typedef enum +{ + GST_NV_H265_ENCODER_BYTE_STREAM, + GST_NV_H265_ENCODER_HVC1, + GST_NV_H265_ENCODER_HEV1, +} GstNvH265EncoderStreamFormat; + +typedef struct _GstNvH265Encoder +{ + GstNvEncoder parent; + GMutex prop_lock; + + gboolean init_param_updated; + gboolean rc_param_updated; + gboolean bitrate_updated; + + GstNvH265EncoderStreamFormat stream_format; + GstH265Parser *parser; + + GstNvEncoderDeviceMode selected_device_mode; + + /* Properties */ + guint cuda_device_id; + gint64 adapter_luid; + + GstNvEncoderPreset preset; + gboolean weighted_pred; + + gint gop_size; + guint bframes; + + GstNvEncoderRCMode rc_mode; + gint qp_i; + gint qp_p; + gint qp_b; + guint bitrate; + guint max_bitrate; + guint vbv_buffer_size; + guint rc_lookahead; + gboolean i_adapt; + gboolean b_adapt; + gboolean spatial_aq; + gboolean temporal_aq; + gboolean zero_reorder_delay; + gboolean non_ref_p; + gboolean strict_gop; + guint aq_strength; + gint min_qp_i; + gint min_qp_p; + gint min_qp_b; + gint max_qp_i; + gint max_qp_p; + gint max_qp_b; + gdouble const_quality; + + gboolean aud; + gboolean repeat_sequence_header; +} GstNvH265Encoder; + +typedef struct _GstNvH265EncoderClass +{ + GstNvEncoderClass parent_class; + + guint cuda_device_id; + gint64 adapter_luid; + + GstNvEncoderDeviceMode device_mode; + + /* representative device caps */ + GstNvEncoderDeviceCaps device_caps; + + /* auto gpu select mode */ + guint cuda_device_id_list8; + guint cuda_device_id_size; + + gint64 adapter_luid_list8; + guint adapter_luid_size; +} GstNvH265EncoderClass; + +#define GST_NV_H265_ENCODER(object) ((GstNvH265Encoder *) (object)) +#define GST_NV_H265_ENCODER_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstNvH265EncoderClass)) + +static void gst_nv_h265_encoder_finalize (GObject * object); +static void gst_nv_h265_encoder_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_nv_h265_encoder_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstCaps *gst_nv_h265_encoder_getcaps (GstVideoEncoder * encoder, + GstCaps * filter); +static gboolean gst_nv_h265_encoder_set_format (GstNvEncoder * encoder, + GstVideoCodecState * state, gpointer session, + NV_ENC_INITIALIZE_PARAMS * init_params, NV_ENC_CONFIG * config); +static gboolean gst_nv_h265_encoder_set_output_state (GstNvEncoder * encoder, + GstVideoCodecState * state, gpointer session); +static GstBuffer *gst_nv_h265_encoder_create_output_buffer (GstNvEncoder * + encoder, NV_ENC_LOCK_BITSTREAM * bitstream); +static GstNvEncoderReconfigure +gst_nv_h265_encoder_check_reconfigure (GstNvEncoder * encoder, + NV_ENC_CONFIG * config); +static gboolean gst_nv_h265_encoder_select_device (GstNvEncoder * encoder, + const GstVideoInfo * info, GstBuffer * buffer, + GstNvEncoderDeviceData * data); + +static void +gst_nv_h265_encoder_class_init (GstNvH265EncoderClass * klass, gpointer data) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoEncoderClass *videoenc_class = GST_VIDEO_ENCODER_CLASS (klass); + GstNvEncoderClass *nvenc_class = GST_NV_ENCODER_CLASS (klass); + GstNvEncoderClassData *cdata = (GstNvEncoderClassData *) data; + GstNvEncoderDeviceCaps *dev_caps = &cdata->device_caps; + GParamFlags param_flags = (GParamFlags) (G_PARAM_READWRITE | + GST_PARAM_MUTABLE_PLAYING | G_PARAM_STATIC_STRINGS); + GParamFlags conditional_param_flags = (GParamFlags) (G_PARAM_READWRITE | + GST_PARAM_CONDITIONALLY_AVAILABLE | GST_PARAM_MUTABLE_PLAYING | + G_PARAM_STATIC_STRINGS); + + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + + object_class->finalize = gst_nv_h265_encoder_finalize; + object_class->set_property = gst_nv_h265_encoder_set_property; + object_class->get_property = gst_nv_h265_encoder_get_property; + + switch (cdata->device_mode) { + case GST_NV_ENCODER_DEVICE_CUDA: + g_object_class_install_property (object_class, PROP_CUDA_DEVICE_ID, + g_param_spec_uint ("cuda-device-id", "CUDA Device ID", + "CUDA device ID of associated GPU", + 0, G_MAXINT, 0, + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + break; + case GST_NV_ENCODER_DEVICE_D3D11: + g_object_class_install_property (object_class, PROP_ADAPTER_LUID, + g_param_spec_int64 ("adapter-luid", "Adapter LUID", + "DXGI Adapter LUID (Locally Unique Identifier) of associated GPU", + G_MININT64, G_MAXINT64, 0, + (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + break; + case GST_NV_ENCODER_DEVICE_AUTO_SELECT: + if (cdata->cuda_device_id_size > 0) { + g_object_class_install_property (object_class, PROP_CUDA_DEVICE_ID, + g_param_spec_uint ("cuda-device-id", "CUDA Device ID", + "CUDA device ID to use", + 0, G_MAXINT, 0, + (GParamFlags) (conditional_param_flags | + GST_PARAM_DOC_SHOW_DEFAULT))); + } + if (cdata->adapter_luid_size > 0) { + g_object_class_install_property (object_class, PROP_ADAPTER_LUID, + g_param_spec_int64 ("adapter-luid", "Adapter LUID", + "DXGI Adapter LUID (Locally Unique Identifier) to use", + G_MININT64, G_MAXINT64, 0, + (GParamFlags) (conditional_param_flags | + GST_PARAM_DOC_SHOW_DEFAULT))); + } + break; + default: + g_assert_not_reached (); + break; + } + + g_object_class_install_property (object_class, PROP_PRESET, + g_param_spec_enum ("preset", "Encoding Preset", + "Encoding Preset", GST_TYPE_NV_ENCODER_PRESET, + DEFAULT_PRESET, param_flags)); + if (dev_caps->weighted_prediction) { + g_object_class_install_property (object_class, PROP_WEIGHTED_PRED, + g_param_spec_boolean ("weighted-pred", "Weighted Pred", + "Enables Weighted Prediction", DEFAULT_WEIGHTED_PRED, + conditional_param_flags)); + } + g_object_class_install_property (object_class, PROP_GOP_SIZE, + g_param_spec_int ("gop-size", "GOP size", + "Number of frames between intra frames (-1 = infinite)", + -1, G_MAXINT, DEFAULT_GOP_SIZE, param_flags)); + if (dev_caps->max_bframes > 0) { + g_object_class_install_property (object_class, PROP_B_FRAMES, + g_param_spec_uint ("b-frames", "B-Frames", + "Number of B-frames between I and P", 0, dev_caps->max_bframes, + DEFAULT_B_FRAMES, conditional_param_flags)); + } + g_object_class_install_property (object_class, PROP_RATE_CONTROL, + g_param_spec_enum ("rate-control", "Rate Control", "Rate Control Method", + GST_TYPE_NV_ENCODER_RC_MODE, DEFAULT_RATE_CONTROL, param_flags)); + g_object_class_install_property (object_class, PROP_QP_I, + g_param_spec_int ("qp-i", "QP I", + "Constant QP value for I frame (-1 = default)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_QP_P, + g_param_spec_int ("qp-p", "QP P", + "Constant QP value for P frame (-1 = default)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_QP_B, + g_param_spec_int ("qp-b", "QP B", + "Constant QP value for B frame (-1 = default)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_BITRATE, + g_param_spec_uint ("bitrate", "Bitrate", + "Bitrate in kbit/sec (0 = automatic)", 0, 2000 * 1024, + DEFAULT_BITRATE, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_BITRATE, + g_param_spec_uint ("max-bitrate", "Max Bitrate", + "Maximum Bitrate in kbit/sec (ignored in CBR mode)", 0, 2000 * 1024, + DEFAULT_MAX_BITRATE, param_flags)); + if (dev_caps->custom_vbv_buf_size) { + g_object_class_install_property (object_class, + PROP_VBV_BUFFER_SIZE, + g_param_spec_uint ("vbv-buffer-size", "VBV Buffer Size", + "VBV(HRD) Buffer Size in kbits (0 = NVENC default)", + 0, G_MAXUINT, DEFAULT_VBV_BUFFER_SIZE, conditional_param_flags)); + } + if (dev_caps->lookahead) { + g_object_class_install_property (object_class, PROP_RC_LOOKAHEAD, + g_param_spec_uint ("rc-lookahead", "Rate Control Lookahead", + "Number of frames for frame type lookahead", + 0, 32, DEFAULT_RC_LOOKAHEAD, conditional_param_flags)); + g_object_class_install_property (object_class, PROP_I_ADAPT, + g_param_spec_boolean ("i-adapt", "I Adapt", + "Enable adaptive I-frame insert when lookahead is enabled", + DEFAULT_I_ADAPT, conditional_param_flags)); + if (dev_caps->max_bframes > 0) { + g_object_class_install_property (object_class, PROP_B_ADAPT, + g_param_spec_boolean ("b-adapt", "B Adapt", + "Enable adaptive B-frame insert when lookahead is enabled", + DEFAULT_B_ADAPT, conditional_param_flags)); + } + } + g_object_class_install_property (object_class, PROP_SPATIAL_AQ, + g_param_spec_boolean ("spatial-aq", "Spatial AQ", + "Spatial Adaptive Quantization", DEFAULT_SPATIAL_AQ, param_flags)); + if (dev_caps->temporal_aq) { + g_object_class_install_property (object_class, PROP_TEMPORAL_AQ, + g_param_spec_boolean ("temporal-aq", "Temporal AQ", + "Temporal Adaptive Quantization", DEFAULT_TEMPORAL_AQ, + conditional_param_flags)); + } + g_object_class_install_property (object_class, PROP_ZERO_REORDER_DELAY, + g_param_spec_boolean ("zero-reorder-delay", "Zero Reorder Delay", + "Zero latency operation (i.e., num_reorder_frames = 0)", + DEFAULT_ZERO_REORDER_DELAY, param_flags)); + g_object_class_install_property (object_class, PROP_NON_REF_P, + g_param_spec_boolean ("nonref-p", "Nonref P", + "Automatic insertion of non-reference P-frames", DEFAULT_NON_REF_P, + param_flags)); + g_object_class_install_property (object_class, PROP_STRICT_GOP, + g_param_spec_boolean ("strict-gop", "Strict GOP", + "Minimize GOP-to-GOP rate fluctuations", DEFAULT_STRICT_GOP, + param_flags)); + g_object_class_install_property (object_class, PROP_AQ_STRENGTH, + g_param_spec_uint ("aq-strength", "AQ Strength", + "Adaptive Quantization Strength when spatial-aq is enabled" + " from 1 (low) to 15 (aggressive), (0 = autoselect)", + 0, 15, DEFAULT_AQ_STRENGTH, param_flags)); + g_object_class_install_property (object_class, PROP_MIN_QP_I, + g_param_spec_int ("min-qp-i", "Min QP I", + "Minimum QP value for I frame, (-1 = disabled)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MIN_QP_P, + g_param_spec_int ("min-qp-p", "Min QP P", + "Minimum QP value for P frame, (-1 = automatic)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MIN_QP_B, + g_param_spec_int ("min-qp-b", "Min QP B", + "Minimum QP value for B frame, (-1 = automatic)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_QP_I, + g_param_spec_int ("max-qp-i", "Max QP I", + "Maximum QP value for I frame, (-1 = disabled)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_QP_P, + g_param_spec_int ("max-qp-p", "Max QP P", + "Maximum QP value for P frame, (-1 = automatic)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_MAX_QP_B, + g_param_spec_int ("max-qp-b", "Max QP B", + "Maximum QP value for B frame, (-1 = automatic)", -1, 51, + DEFAULT_QP, param_flags)); + g_object_class_install_property (object_class, PROP_CONST_QUALITY, + g_param_spec_double ("const-quality", "Constant Quality", + "Target Constant Quality level for VBR mode (0 = automatic)", + 0, 51, DEFAULT_CONST_QUALITY, param_flags)); + g_object_class_install_property (object_class, PROP_AUD, + g_param_spec_boolean ("aud", "AUD", + "Use AU (Access Unit) delimiter", DEFAULT_AUD, param_flags)); + g_object_class_install_property (object_class, PROP_REPEAT_SEQUENCE_HEADER, + g_param_spec_boolean ("repeat-sequence-header", "Repeat Sequence Header", + "Insert sequence headers (SPS/PPS) per IDR, " + "ignored if negotiated stream-format is \"hvc1\"", + DEFAULT_REPEAT_SEQUENCE_HEADER, param_flags)); + + switch (cdata->device_mode) { + case GST_NV_ENCODER_DEVICE_CUDA: + gst_element_class_set_static_metadata (element_class, + "NVENC H.265 Video Encoder CUDA Mode", + "Codec/Encoder/Video/Hardware", + "Encode H.265 video streams using NVCODEC API CUDA Mode", + "Seungha Yang <seungha@centricular.com>"); + break; + case GST_NV_ENCODER_DEVICE_D3D11: + gst_element_class_set_static_metadata (element_class, + "NVENC H.265 Video Encoder Direct3D11 Mode", + "Codec/Encoder/Video/Hardware", + "Encode H.265 video streams using NVCODEC API Direct3D11 Mode", + "Seungha Yang <seungha@centricular.com>"); + break; + case GST_NV_ENCODER_DEVICE_AUTO_SELECT: + gst_element_class_set_static_metadata (element_class, + "NVENC H.265 Video Encoder Auto GPU select Mode", + "Codec/Encoder/Video/Hardware", + "Encode H.265 video streams using NVCODEC API auto GPU select Mode", + "Seungha Yang <seungha@centricular.com>"); + break; + default: + g_assert_not_reached (); + break; + } + + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + cdata->sink_caps)); + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + cdata->src_caps)); + + videoenc_class->getcaps = GST_DEBUG_FUNCPTR (gst_nv_h265_encoder_getcaps); + + nvenc_class->set_format = GST_DEBUG_FUNCPTR (gst_nv_h265_encoder_set_format); + nvenc_class->set_output_state = + GST_DEBUG_FUNCPTR (gst_nv_h265_encoder_set_output_state); + nvenc_class->create_output_buffer = + GST_DEBUG_FUNCPTR (gst_nv_h265_encoder_create_output_buffer); + nvenc_class->check_reconfigure = + GST_DEBUG_FUNCPTR (gst_nv_h265_encoder_check_reconfigure); + nvenc_class->select_device = + GST_DEBUG_FUNCPTR (gst_nv_h265_encoder_select_device); + + klass->device_caps = cdata->device_caps; + klass->cuda_device_id = cdata->cuda_device_id; + klass->adapter_luid = cdata->adapter_luid; + klass->device_mode = cdata->device_mode; + klass->cuda_device_id_size = cdata->cuda_device_id_size; + klass->adapter_luid_size = cdata->adapter_luid_size; + memcpy (klass->cuda_device_id_list, cdata->cuda_device_id_list, + sizeof (klass->cuda_device_id_list)); + memcpy (klass->adapter_luid_list, cdata->adapter_luid_list, + sizeof (klass->adapter_luid_list)); + + gst_nv_encoder_class_data_unref (cdata); +} + +static void +gst_nv_h265_encoder_init (GstNvH265Encoder * self) +{ + GstNvH265EncoderClass *klass = GST_NV_H265_ENCODER_GET_CLASS (self); + + g_mutex_init (&self->prop_lock); + + self->selected_device_mode = klass->device_mode; + self->cuda_device_id = klass->cuda_device_id; + self->adapter_luid = klass->adapter_luid; + self->preset = DEFAULT_PRESET; + self->weighted_pred = DEFAULT_WEIGHTED_PRED; + self->gop_size = DEFAULT_GOP_SIZE; + self->bframes = DEFAULT_B_FRAMES; + self->rc_mode = DEFAULT_RATE_CONTROL; + self->qp_i = DEFAULT_QP; + self->qp_p = DEFAULT_QP; + self->qp_b = DEFAULT_QP; + self->bitrate = DEFAULT_BITRATE; + self->max_bitrate = DEFAULT_MAX_BITRATE; + self->vbv_buffer_size = DEFAULT_VBV_BUFFER_SIZE; + self->rc_lookahead = DEFAULT_RC_LOOKAHEAD; + self->i_adapt = DEFAULT_I_ADAPT; + self->b_adapt = DEFAULT_B_ADAPT; + self->spatial_aq = DEFAULT_SPATIAL_AQ; + self->temporal_aq = DEFAULT_TEMPORAL_AQ; + self->zero_reorder_delay = DEFAULT_ZERO_REORDER_DELAY; + self->non_ref_p = DEFAULT_NON_REF_P; + self->strict_gop = DEFAULT_STRICT_GOP; + self->aq_strength = DEFAULT_AQ_STRENGTH; + self->min_qp_i = DEFAULT_QP; + self->min_qp_p = DEFAULT_QP; + self->min_qp_b = DEFAULT_QP; + self->max_qp_i = DEFAULT_QP; + self->max_qp_p = DEFAULT_QP; + self->max_qp_b = DEFAULT_QP; + self->const_quality = DEFAULT_CONST_QUALITY; + self->aud = DEFAULT_AUD; + self->repeat_sequence_header = DEFAULT_REPEAT_SEQUENCE_HEADER; + + self->parser = gst_h265_parser_new (); + + gst_nv_encoder_set_device_mode (GST_NV_ENCODER (self), klass->device_mode, + klass->cuda_device_id, klass->adapter_luid); +} + +static void +gst_nv_h265_encoder_finalize (GObject * object) +{ + GstNvH265Encoder *self = GST_NV_H265_ENCODER (object); + + g_mutex_clear (&self->prop_lock); + gst_h265_parser_free (self->parser); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +typedef enum +{ + UPDATE_INIT_PARAM, + UPDATE_RC_PARAM, + UPDATE_BITRATE, +} PropUpdateLevel; + +static void +update_boolean (GstNvH265Encoder * self, gboolean * old_val, + const GValue * new_val, PropUpdateLevel level) +{ + gboolean val = g_value_get_boolean (new_val); + + if (*old_val == val) + return; + + *old_val = val; + switch (level) { + case UPDATE_INIT_PARAM: + self->init_param_updated = TRUE; + break; + case UPDATE_RC_PARAM: + self->rc_param_updated = TRUE; + break; + case UPDATE_BITRATE: + self->bitrate_updated = TRUE; + break; + } +} + +static void +update_int (GstNvH265Encoder * self, gint * old_val, + const GValue * new_val, PropUpdateLevel level) +{ + gint val = g_value_get_int (new_val); + + if (*old_val == val) + return; + + *old_val = val; + switch (level) { + case UPDATE_INIT_PARAM: + self->init_param_updated = TRUE; + break; + case UPDATE_RC_PARAM: + self->rc_param_updated = TRUE; + break; + case UPDATE_BITRATE: + self->bitrate_updated = TRUE; + break; + } +} + +static void +update_uint (GstNvH265Encoder * self, guint * old_val, + const GValue * new_val, PropUpdateLevel level) +{ + guint val = g_value_get_uint (new_val); + + if (*old_val == val) + return; + + *old_val = val; + switch (level) { + case UPDATE_INIT_PARAM: + self->init_param_updated = TRUE; + break; + case UPDATE_RC_PARAM: + self->rc_param_updated = TRUE; + break; + case UPDATE_BITRATE: + self->bitrate_updated = TRUE; + break; + } +} + +static void +update_double (GstNvH265Encoder * self, gdouble * old_val, + const GValue * new_val, PropUpdateLevel level) +{ + gdouble val = g_value_get_double (new_val); + + if (*old_val == val) + return; + + *old_val = val; + switch (level) { + case UPDATE_INIT_PARAM: + self->init_param_updated = TRUE; + break; + case UPDATE_RC_PARAM: + self->rc_param_updated = TRUE; + break; + case UPDATE_BITRATE: + self->bitrate_updated = TRUE; + break; + } +} + +static void +gst_nv_h265_encoder_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstNvH265Encoder *self = GST_NV_H265_ENCODER (object); + GstNvH265EncoderClass *klass = GST_NV_H265_ENCODER_GET_CLASS (self); + + g_mutex_lock (&self->prop_lock); + switch (prop_id) { + case PROP_ADAPTER_LUID:{ + gint64 adapter_luid = g_value_get_int64 (value); + gboolean is_valid = FALSE; + + for (guint i = 0; i < klass->adapter_luid_size; i++) { + if (klass->adapter_luid_listi == adapter_luid) { + self->adapter_luid = adapter_luid; + is_valid = TRUE; + break; + } + } + + if (!is_valid) + g_warning ("%" G_GINT64_FORMAT " is not a valid adapter luid", + adapter_luid); + break; + } + case PROP_CUDA_DEVICE_ID:{ + guint cuda_device_id = g_value_get_uint (value); + gboolean is_valid = FALSE; + + for (guint i = 0; i < klass->cuda_device_id_size; i++) { + if (klass->cuda_device_id_listi == cuda_device_id) { + self->cuda_device_id = cuda_device_id; + is_valid = TRUE; + break; + } + } + + if (!is_valid) + g_warning ("%d is not a valid cuda device id", cuda_device_id); + break; + } + case PROP_PRESET:{ + GstNvEncoderPreset preset = (GstNvEncoderPreset) g_value_get_enum (value); + if (preset != self->preset) { + self->preset = preset; + self->init_param_updated = TRUE; + } + break; + } + case PROP_WEIGHTED_PRED: + update_boolean (self, &self->weighted_pred, value, UPDATE_INIT_PARAM); + break; + case PROP_GOP_SIZE: + update_int (self, &self->gop_size, value, UPDATE_INIT_PARAM); + break; + case PROP_B_FRAMES: + update_uint (self, &self->bframes, value, UPDATE_INIT_PARAM); + break; + case PROP_RATE_CONTROL:{ + GstNvEncoderRCMode mode = (GstNvEncoderRCMode) g_value_get_enum (value); + if (mode != self->rc_mode) { + self->rc_mode = mode; + self->rc_param_updated = TRUE; + } + break; + } + case PROP_QP_I: + update_int (self, &self->qp_i, value, UPDATE_RC_PARAM); + break; + case PROP_QP_P: + update_int (self, &self->qp_p, value, UPDATE_RC_PARAM); + break; + case PROP_QP_B: + update_int (self, &self->qp_b, value, UPDATE_RC_PARAM); + break; + case PROP_BITRATE: + update_uint (self, &self->bitrate, value, UPDATE_BITRATE); + break; + case PROP_MAX_BITRATE: + update_uint (self, &self->max_bitrate, value, UPDATE_BITRATE); + break; + case PROP_VBV_BUFFER_SIZE: + update_uint (self, &self->vbv_buffer_size, value, UPDATE_RC_PARAM); + break; + case PROP_RC_LOOKAHEAD: + /* rc-lookahead update requires pool size change */ + update_uint (self, &self->rc_lookahead, value, UPDATE_INIT_PARAM); + break; + case PROP_I_ADAPT: + update_boolean (self, &self->i_adapt, value, UPDATE_RC_PARAM); + break; + case PROP_B_ADAPT: + update_boolean (self, &self->b_adapt, value, UPDATE_RC_PARAM); + break; + case PROP_SPATIAL_AQ: + update_boolean (self, &self->spatial_aq, value, UPDATE_RC_PARAM); + break; + case PROP_TEMPORAL_AQ: + update_boolean (self, &self->temporal_aq, value, UPDATE_RC_PARAM); + break; + case PROP_ZERO_REORDER_DELAY: + update_boolean (self, &self->zero_reorder_delay, value, UPDATE_RC_PARAM); + break; + case PROP_NON_REF_P: + update_boolean (self, &self->non_ref_p, value, UPDATE_RC_PARAM); + break; + case PROP_STRICT_GOP: + update_boolean (self, &self->strict_gop, value, UPDATE_RC_PARAM); + break; + case PROP_AQ_STRENGTH: + update_uint (self, &self->aq_strength, value, UPDATE_RC_PARAM); + break; + case PROP_MIN_QP_I: + update_int (self, &self->min_qp_i, value, UPDATE_RC_PARAM); + break; + case PROP_MIN_QP_P: + update_int (self, &self->min_qp_p, value, UPDATE_RC_PARAM); + break; + case PROP_MIN_QP_B: + update_int (self, &self->min_qp_b, value, UPDATE_RC_PARAM); + break; + case PROP_MAX_QP_I: + update_int (self, &self->min_qp_i, value, UPDATE_RC_PARAM); + break; + case PROP_MAX_QP_P: + update_int (self, &self->min_qp_p, value, UPDATE_RC_PARAM); + break; + case PROP_MAX_QP_B: + update_int (self, &self->min_qp_b, value, UPDATE_RC_PARAM); + break; + case PROP_CONST_QUALITY: + update_double (self, &self->const_quality, value, UPDATE_RC_PARAM); + break; + case PROP_AUD: + update_boolean (self, &self->aud, value, UPDATE_INIT_PARAM); + break; + case PROP_REPEAT_SEQUENCE_HEADER: + update_boolean (self, + &self->repeat_sequence_header, value, UPDATE_INIT_PARAM); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_nv_h265_encoder_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstNvH265Encoder *self = GST_NV_H265_ENCODER (object); + + switch (prop_id) { + case PROP_ADAPTER_LUID: + g_value_set_int64 (value, self->adapter_luid); + break; + case PROP_CUDA_DEVICE_ID: + g_value_set_uint (value, self->cuda_device_id); + break; + case PROP_PRESET: + g_value_set_enum (value, self->preset); + break; + case PROP_WEIGHTED_PRED: + g_value_set_boolean (value, self->weighted_pred); + break; + case PROP_GOP_SIZE: + g_value_set_int (value, self->gop_size); + break; + case PROP_B_FRAMES: + g_value_set_uint (value, self->bframes); + break; + case PROP_RATE_CONTROL: + g_value_set_enum (value, self->rc_mode); + break; + case PROP_QP_I: + g_value_set_int (value, self->qp_i); + break; + case PROP_QP_P: + g_value_set_int (value, self->qp_p); + break; + case PROP_QP_B: + g_value_set_int (value, self->qp_b); + break; + case PROP_BITRATE: + g_value_set_uint (value, self->bitrate); + break; + case PROP_MAX_BITRATE: + g_value_set_uint (value, self->max_bitrate); + break; + case PROP_VBV_BUFFER_SIZE: + g_value_set_uint (value, self->vbv_buffer_size); + break; + case PROP_RC_LOOKAHEAD: + g_value_set_uint (value, self->rc_lookahead); + break; + case PROP_I_ADAPT: + g_value_set_boolean (value, self->i_adapt); + break; + case PROP_B_ADAPT: + g_value_set_boolean (value, self->b_adapt); + break; + case PROP_SPATIAL_AQ: + g_value_set_boolean (value, self->spatial_aq); + break; + case PROP_TEMPORAL_AQ: + g_value_set_boolean (value, self->temporal_aq); + break; + case PROP_ZERO_REORDER_DELAY: + g_value_set_boolean (value, self->zero_reorder_delay); + break; + case PROP_NON_REF_P: + g_value_set_boolean (value, self->non_ref_p); + break; + case PROP_STRICT_GOP: + g_value_set_boolean (value, self->strict_gop); + break; + case PROP_AQ_STRENGTH: + g_value_set_uint (value, self->aq_strength); + break; + case PROP_MIN_QP_I: + g_value_set_int (value, self->min_qp_i); + break; + case PROP_MIN_QP_P: + g_value_set_int (value, self->min_qp_p); + break; + case PROP_MIN_QP_B: + g_value_set_int (value, self->min_qp_b); + break; + case PROP_MAX_QP_I: + g_value_set_int (value, self->max_qp_i); + break; + case PROP_MAX_QP_P: + g_value_set_int (value, self->max_qp_p); + break; + case PROP_MAX_QP_B: + g_value_set_int (value, self->max_qp_b); + break; + case PROP_CONST_QUALITY: + g_value_set_double (value, self->const_quality); + break; + case PROP_AUD: + g_value_set_boolean (value, self->aud); + break; + case PROP_REPEAT_SEQUENCE_HEADER: + g_value_set_boolean (value, self->repeat_sequence_header); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_nv_h265_encoder_get_downstream_profiles_and_format (GstNvH265Encoder * self, + std::set < std::string > &downstream_profiles, + GstNvH265EncoderStreamFormat * format) +{ + GstCaps *allowed_caps; + GstStructure *s; + const gchar *stream_format; + + allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (self)); + + if (!allowed_caps || gst_caps_is_empty (allowed_caps) || + gst_caps_is_any (allowed_caps)) { + gst_clear_caps (&allowed_caps); + + return; + } + + for (guint i = 0; i < gst_caps_get_size (allowed_caps); i++) { + const GValue *profile_value; + const gchar *profile; + + s = gst_caps_get_structure (allowed_caps, i); + profile_value = gst_structure_get_value (s, "profile"); + if (!profile_value) + continue; + + if (GST_VALUE_HOLDS_LIST (profile_value)) { + for (guint j = 0; j < gst_value_list_get_size (profile_value); j++) { + const GValue *p = gst_value_list_get_value (profile_value, j); + + if (!G_VALUE_HOLDS_STRING (p)) + continue; + + profile = g_value_get_string (p); + if (profile) + downstream_profiles.insert (profile); + } + + } else if (G_VALUE_HOLDS_STRING (profile_value)) { + profile = g_value_get_string (profile_value); + if (profile) + downstream_profiles.insert (profile); + } + } + + if (format) { + *format = GST_NV_H265_ENCODER_BYTE_STREAM; + + allowed_caps = gst_caps_fixate (allowed_caps); + s = gst_caps_get_structure (allowed_caps, 0); + stream_format = gst_structure_get_string (s, "stream-format"); + if (g_strcmp0 (stream_format, "hvc1") == 0) + *format = GST_NV_H265_ENCODER_HVC1; + else if (g_strcmp0 (stream_format, "hev1") == 0) + *format = GST_NV_H265_ENCODER_HEV1; + } + + gst_caps_unref (allowed_caps); +} + +static GstCaps * +gst_nv_h265_encoder_getcaps (GstVideoEncoder * encoder, GstCaps * filter) +{ + GstNvH265Encoder *self = GST_NV_H265_ENCODER (encoder); + GstCaps *template_caps; + GstCaps *supported_caps; + std::set < std::string > downstream_profiles; + std::set < std::string > allowed_formats; + + gst_nv_h265_encoder_get_downstream_profiles_and_format (self, + downstream_profiles, NULL); + + GST_DEBUG_OBJECT (self, "Downstream specified %" G_GSIZE_FORMAT " profiles", + downstream_profiles.size ()); + + if (downstream_profiles.size () == 0) + return gst_video_encoder_proxy_getcaps (encoder, NULL, filter); + + /* *INDENT-OFF* */ + for (const auto &iter: downstream_profiles) { + if (iter == "main") { + allowed_formats.insert("NV12"); + } else if (iter == "main-10") { + allowed_formats.insert("P010_10LE"); + } else if (iter == "main-444") { + allowed_formats.insert("Y444"); + } else if (iter == "main-444-10") { + allowed_formats.insert("Y444_16LE"); + } + } + /* *INDENT-ON* */ + + template_caps = gst_pad_get_pad_template_caps (encoder->sinkpad); + template_caps = gst_caps_make_writable (template_caps); + + GValue formats = G_VALUE_INIT; + + g_value_init (&formats, GST_TYPE_LIST); + /* *INDENT-OFF* */ + for (const auto &iter: allowed_formats) { + GValue val = G_VALUE_INIT; + g_value_init (&val, G_TYPE_STRING); + + g_value_set_string (&val, iter.c_str()); + gst_value_list_append_and_take_value (&formats, &val); + } + /* *INDENT-ON* */ + + gst_caps_set_value (template_caps, "format", &formats); + g_value_unset (&formats); + + supported_caps = gst_video_encoder_proxy_getcaps (encoder, + template_caps, filter); + gst_caps_unref (template_caps); + + GST_DEBUG_OBJECT (self, "Returning %" GST_PTR_FORMAT, supported_caps); + + return supported_caps; +} + +static gboolean +gst_nv_h265_encoder_set_format (GstNvEncoder * encoder, + GstVideoCodecState * state, gpointer session, + NV_ENC_INITIALIZE_PARAMS * init_params, NV_ENC_CONFIG * config) +{ + GstNvH265Encoder *self = GST_NV_H265_ENCODER (encoder); + GstNvH265EncoderClass *klass = GST_NV_H265_ENCODER_GET_CLASS (self); + GstNvEncoderDeviceCaps *dev_caps = &klass->device_caps; + NV_ENC_RC_PARAMS *rc_params; + GstVideoInfo *info = &state->info; + NVENCSTATUS status; + NV_ENC_PRESET_CONFIG preset_config = { 0, }; + gint dar_n, dar_d; + GstNvEncoderRCMode rc_mode; + NV_ENC_CONFIG_HEVC *hevc_config; + NV_ENC_CONFIG_HEVC_VUI_PARAMETERS *vui; + std::set < std::string > downstream_profiles; + GUID selected_profile = NV_ENC_CODEC_PROFILE_AUTOSELECT_GUID; + guint chroma_format_index = 1; + guint bitdepth_minus8 = 0; + gboolean bframe_aborted = FALSE; + gboolean weight_pred_aborted = FALSE; + gboolean vbv_buffer_size_aborted = FALSE; + gboolean lookahead_aborted = FALSE; + gboolean temporal_aq_aborted = FALSE; + + self->stream_format = GST_NV_H265_ENCODER_BYTE_STREAM; + + gst_nv_h265_encoder_get_downstream_profiles_and_format (self, + downstream_profiles, &self->stream_format); + + if (downstream_profiles.empty ()) { + GST_ERROR_OBJECT (self, "Unable to get downstream profile"); + return FALSE; + } + + /* XXX: we may need to relax condition a little */ + switch (GST_VIDEO_INFO_FORMAT (info)) { + case GST_VIDEO_FORMAT_NV12: + if (downstream_profiles.find ("main") == downstream_profiles.end ()) { + GST_ERROR_OBJECT (self, "Downstream does not support main profile"); + return FALSE; + } else { + selected_profile = NV_ENC_HEVC_PROFILE_MAIN_GUID; + } + break; + case GST_VIDEO_FORMAT_P010_10LE: + if (downstream_profiles.find ("main-10") == downstream_profiles.end ()) { + GST_ERROR_OBJECT (self, "Downstream does not support main profile"); + return FALSE; + } else { + selected_profile = NV_ENC_HEVC_PROFILE_MAIN10_GUID; + bitdepth_minus8 = 2; + } + break; + case GST_VIDEO_FORMAT_Y444: + if (downstream_profiles.find ("main-444") == downstream_profiles.end ()) { + GST_ERROR_OBJECT (self, "Downstream does not support 4:4:4 profile"); + return FALSE; + } else { + selected_profile = NV_ENC_HEVC_PROFILE_FREXT_GUID; + chroma_format_index = 3; + } + break; + case GST_VIDEO_FORMAT_Y444_16LE: + if (downstream_profiles.find ("main-444-10") == + downstream_profiles.end ()) { + GST_ERROR_OBJECT (self, + "Downstream does not support 4:4:4 10bits profile"); + return FALSE; + } else { + selected_profile = NV_ENC_HEVC_PROFILE_FREXT_GUID; + chroma_format_index = 3; + bitdepth_minus8 = 2; + } + break; + default: + GST_ERROR_OBJECT (self, "Unexpected format %s", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info))); + g_assert_not_reached (); + return FALSE; + } + + g_mutex_lock (&self->prop_lock); + + if (klass->device_mode == GST_NV_ENCODER_DEVICE_AUTO_SELECT) { + GstNvEncoderDeviceCaps dev_caps; + + gst_nv_encoder_get_encoder_caps (session, + &NV_ENC_CODEC_HEVC_GUID, &dev_caps); + + if (self->bframes > 0 && !dev_caps.max_bframes) { + self->bframes = 0; + bframe_aborted = TRUE; + + GST_INFO_OBJECT (self, "B-frame was enabled but not support by device"); + } + + if (self->weighted_pred && !dev_caps.weighted_prediction) { + self->weighted_pred = FALSE; + weight_pred_aborted = TRUE; + + GST_INFO_OBJECT (self, + "Weighted prediction was enabled but not support by device"); + } + + if (self->vbv_buffer_size && !dev_caps.custom_vbv_buf_size) { + self->vbv_buffer_size = 0; + vbv_buffer_size_aborted = TRUE; + + GST_INFO_OBJECT (self, + "VBV buffer size was specified but not supported by device"); + } + + if (self->rc_lookahead && !dev_caps.lookahead) { + self->rc_lookahead = 0; + lookahead_aborted = TRUE; + + GST_INFO_OBJECT (self, + "VBV buffer size was specified but not supported by device"); + } + + if (self->temporal_aq && !dev_caps.temporal_aq) { + self->temporal_aq = FALSE; + temporal_aq_aborted = TRUE; + + GST_INFO_OBJECT (self, + "temporal-aq was enabled but not supported by device"); + } + } + + init_params->version = gst_nvenc_get_initialize_params_version (); + init_params->encodeGUID = NV_ENC_CODEC_HEVC_GUID; + + init_params->encodeWidth = GST_VIDEO_INFO_WIDTH (info); + init_params->maxEncodeWidth = GST_VIDEO_INFO_WIDTH (info); + init_params->encodeHeight = GST_VIDEO_INFO_HEIGHT (info); + init_params->maxEncodeHeight = GST_VIDEO_INFO_HEIGHT (info); + init_params->enablePTD = TRUE; + if (dev_caps->async_encoding_support) + init_params->enableEncodeAsync = 1; + if (info->fps_d > 0 && info->fps_n > 0) { + init_params->frameRateNum = info->fps_n; + init_params->frameRateDen = info->fps_d; + } else { + init_params->frameRateNum = 0; + init_params->frameRateDen = 1; + } + + init_params->enableWeightedPrediction = self->weighted_pred; + + if (gst_util_fraction_multiply (GST_VIDEO_INFO_WIDTH (info), + GST_VIDEO_INFO_HEIGHT (info), GST_VIDEO_INFO_PAR_N (info), + GST_VIDEO_INFO_PAR_D (info), &dar_n, &dar_d) && dar_n > 0 + && dar_d > 0) { + init_params->darWidth = dar_n; + init_params->darHeight = dar_d; + } + + gst_nv_encoder_preset_to_guid (self->preset, &init_params->presetGUID); + + preset_config.version = gst_nvenc_get_preset_config_version (); + preset_config.presetCfg.version = gst_nvenc_get_config_version (); + + status = NvEncGetEncodePresetConfig (session, NV_ENC_CODEC_HEVC_GUID, + init_params->presetGUID, &preset_config); + if (status != NV_ENC_SUCCESS) { + GST_ERROR_OBJECT (self, "Failed to get preset config %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + g_mutex_unlock (&self->prop_lock); + return FALSE; + } + + *config = preset_config.presetCfg; + if (self->gop_size < 0) { + config->gopLength = NVENC_INFINITE_GOPLENGTH; + config->frameIntervalP = 1; + } else if (self->gop_size > 0) { + config->gopLength = self->gop_size; + /* frameIntervalP + * 0: All Intra frames + * 1: I/P only + * 2: IBP + * 3: IBBP + */ + config->frameIntervalP = self->bframes + 1; + } else { + /* gop size == 0 means all intra frames */ + config->gopLength = 1; + config->frameIntervalP = 0; + } + + rc_params = &config->rcParams; + rc_mode = self->rc_mode; + + if (self->bitrate) + rc_params->averageBitRate = self->bitrate * 1024; + if (self->max_bitrate) + rc_params->maxBitRate = self->max_bitrate * 1024; + if (self->vbv_buffer_size) + rc_params->vbvBufferSize = self->vbv_buffer_size * 1024; + + if (self->min_qp_i >= 0) { + rc_params->enableMinQP = TRUE; + rc_params->minQP.qpIntra = self->min_qp_i; + if (self->min_qp_p >= 0) { + rc_params->minQP.qpInterP = self->min_qp_p; + } else { + rc_params->minQP.qpInterP = rc_params->minQP.qpIntra; + } + if (self->min_qp_b >= 0) { + rc_params->minQP.qpInterB = self->min_qp_b; + } else { + rc_params->minQP.qpInterB = rc_params->minQP.qpInterP; + } + } + + if (self->max_qp_i >= 0) { + rc_params->enableMaxQP = TRUE; + rc_params->maxQP.qpIntra = self->max_qp_i; + if (self->max_qp_p >= 0) { + rc_params->maxQP.qpInterP = self->max_qp_p; + } else { + rc_params->maxQP.qpInterP = rc_params->maxQP.qpIntra; + } + if (self->max_qp_b >= 0) { + rc_params->maxQP.qpInterB = self->max_qp_b; + } else { + rc_params->maxQP.qpInterB = rc_params->maxQP.qpInterP; + } + } + + if (rc_mode == GST_NV_ENCODER_RC_MODE_CONSTQP) { + if (self->qp_i >= 0) + rc_params->constQP.qpIntra = self->qp_i; + if (self->qp_p >= 0) + rc_params->constQP.qpInterP = self->qp_p; + if (self->qp_p >= 0) + rc_params->constQP.qpInterB = self->qp_b; + } + + rc_params->rateControlMode = gst_nv_encoder_rc_mode_to_native (rc_mode); + + if (self->spatial_aq) { + rc_params->enableAQ = TRUE; + rc_params->aqStrength = self->aq_strength; + } + + rc_params->enableTemporalAQ = self->temporal_aq; + + if (self->rc_lookahead) { + rc_params->enableLookahead = 1; + rc_params->lookaheadDepth = self->rc_lookahead; + rc_params->disableIadapt = !self->i_adapt; + rc_params->disableBadapt = !self->b_adapt; + } + + rc_params->strictGOPTarget = self->strict_gop; + rc_params->enableNonRefP = self->non_ref_p; + rc_params->zeroReorderDelay = self->zero_reorder_delay; + + if (self->const_quality) { + guint scaled = (gint) (self->const_quality * 256.0); + + rc_params->targetQuality = (guint8) (scaled >> 8); + rc_params->targetQualityLSB = (guint8) (scaled & 0xff); + } + self->init_param_updated = FALSE; + self->bitrate_updated = FALSE; + self->rc_param_updated = FALSE; + + config->profileGUID = selected_profile; + + hevc_config = &config->encodeCodecConfig.hevcConfig; + vui = &hevc_config->hevcVUIParameters; + + hevc_config->level = NV_ENC_LEVEL_AUTOSELECT; + hevc_config->chromaFormatIDC = chroma_format_index; + hevc_config->pixelBitDepthMinus8 = bitdepth_minus8; + hevc_config->idrPeriod = config->gopLength; + hevc_config->outputAUD = self->aud; + if (self->stream_format == GST_NV_H265_ENCODER_HVC1) { + hevc_config->disableSPSPPS = 1; + hevc_config->repeatSPSPPS = 0; + } else if (self->repeat_sequence_header) { + hevc_config->disableSPSPPS = 0; + hevc_config->repeatSPSPPS = 1; + } else { + hevc_config->disableSPSPPS = 0; + hevc_config->repeatSPSPPS = 0; + } + + vui->videoSignalTypePresentFlag = 1; + /* Unspecified */ + vui->videoFormat = 5; + if (info->colorimetry.range == GST_VIDEO_COLOR_RANGE_0_255) { + vui->videoFullRangeFlag = 1; + } else { + vui->videoFullRangeFlag = 0; + } + + vui->colourDescriptionPresentFlag = 1; + vui->colourMatrix = gst_video_color_matrix_to_iso (info->colorimetry.matrix); + vui->colourPrimaries = + gst_video_color_primaries_to_iso (info->colorimetry.primaries); + vui->transferCharacteristics = + gst_video_transfer_function_to_iso (info->colorimetry.transfer); + + g_mutex_unlock (&self->prop_lock); + + if (bframe_aborted) + g_object_notify (G_OBJECT (self), "b-frames"); + if (weight_pred_aborted) + g_object_notify (G_OBJECT (self), "weighted-pred"); + if (vbv_buffer_size_aborted) + g_object_notify (G_OBJECT (self), "vbv-buffer-size"); + if (lookahead_aborted) + g_object_notify (G_OBJECT (self), "rc-lookahead"); + if (temporal_aq_aborted) + g_object_notify (G_OBJECT (self), "temporal-aq"); + + return TRUE; +} + +static gboolean +gst_nv_h265_encoder_set_output_state (GstNvEncoder * encoder, + GstVideoCodecState * state, gpointer session) +{ + GstNvH265Encoder *self = GST_NV_H265_ENCODER (encoder); + GstVideoCodecState *output_state; + NV_ENC_SEQUENCE_PARAM_PAYLOAD seq_params = { 0, }; + guint8 vpsspspps1024; + guint32 seq_size; + GstCaps *caps; + const gchar *profile_from_vps; + NVENCSTATUS status; + std::set < std::string > downstream_profiles; + std::string caps_str; + GstTagList *tags; + GstBuffer *codec_data = NULL; + GstH265NalUnit vps_nalu, sps_nalu, pps_nalu; + GstH265ParserResult rst; + gboolean packetized = FALSE; + GstH265VPS vps; + GstH265SPS sps; + gint i, j, k = 0; + + if (self->stream_format != GST_NV_H265_ENCODER_BYTE_STREAM) + packetized = TRUE; + + caps_str = "video/x-h265, alignment = (string) au"; + + gst_nv_h265_encoder_get_downstream_profiles_and_format (self, + downstream_profiles, NULL); + + seq_params.version = gst_nvenc_get_sequence_param_payload_version (); + seq_params.inBufferSize = sizeof (vpsspspps); + seq_params.spsppsBuffer = &vpsspspps; + seq_params.outSPSPPSPayloadSize = &seq_size; + status = NvEncGetSequenceParams (session, &seq_params); + if (status != NV_ENC_SUCCESS) { + GST_ERROR_OBJECT (self, "Failed to get sequence header, status %" + GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status)); + return FALSE; + } + + rst = gst_h265_parser_identify_nalu (self->parser, + vpsspspps, 0, seq_size, &vps_nalu); + if (rst != GST_H265_PARSER_OK) { + GST_ERROR_OBJECT (self, "Failed to identify VPS nal"); + return FALSE; + } + + rst = gst_h265_parser_parse_vps (self->parser, &vps_nalu, &vps); + if (rst != GST_H265_PARSER_OK) { + GST_ERROR_OBJECT (self, "Failed to parse VPS"); + return FALSE; + } + + rst = gst_h265_parser_identify_nalu (self->parser, + vpsspspps, vps_nalu.offset + vps_nalu.size, seq_size, &sps_nalu); + if (rst != GST_H265_PARSER_OK && packetized) { + GST_ERROR_OBJECT (self, "Failed to identify SPS nal, %d", rst); + return FALSE; + } + + if (packetized) { + rst = gst_h265_parser_parse_sps (self->parser, &sps_nalu, &sps, TRUE); + if (rst != GST_H265_PARSER_OK) { + GST_ERROR_OBJECT (self, "Failed to parse SPS"); + return FALSE; + } + } + + rst = gst_h265_parser_identify_nalu_unchecked (self->parser, + vpsspspps, sps_nalu.offset + sps_nalu.size, seq_size, &pps_nalu); + if (rst != GST_H265_PARSER_OK && packetized) { + GST_ERROR_OBJECT (self, "Failed to identify PPS nal, %d", rst); + return FALSE; + } + + if (packetized) { + GstMapInfo info; + guint8 *data; + guint16 min_spatial_segmentation_idc = 0; + GstH265ProfileTierLevel *ptl; + + codec_data = gst_buffer_new_and_alloc (38 + + vps_nalu.size + sps_nalu.size + pps_nalu.size); + + gst_buffer_map (codec_data, &info, GST_MAP_WRITE); + data = (guint8 *) info.data; + + memset (data, 0, info.size); + + ptl = &sps.profile_tier_level; + if (sps.vui_parameters_present_flag) { + min_spatial_segmentation_idc = + sps.vui_params.min_spatial_segmentation_idc; + } + + data0 = 1; + data1 = + (ptl->profile_space << 5) | (ptl->tier_flag << 5) | ptl->profile_idc; + for (i = 2; i < 6; i++) { + for (j = 7; j >= 0; j--) { + datai |= (ptl->profile_compatibility_flagk << j); + k++; + } + } + + data6 = + (ptl->progressive_source_flag << 7) | + (ptl->interlaced_source_flag << 6) | + (ptl->non_packed_constraint_flag << 5) | + (ptl->frame_only_constraint_flag << 4) | + (ptl->max_12bit_constraint_flag << 3) | + (ptl->max_10bit_constraint_flag << 2) | + (ptl->max_8bit_constraint_flag << 1) | + (ptl->max_422chroma_constraint_flag); + + data7 = + (ptl->max_420chroma_constraint_flag << 7) | + (ptl->max_monochrome_constraint_flag << 6) | + (ptl->intra_constraint_flag << 5) | + (ptl->one_picture_only_constraint_flag << 4) | + (ptl->lower_bit_rate_constraint_flag << 3) | + (ptl->max_14bit_constraint_flag << 2); + + data12 = ptl->level_idc; + + GST_WRITE_UINT16_BE (data + 13, min_spatial_segmentation_idc); + data13 |= 0xf0; + data15 = 0xfc; + data16 = 0xfc | sps.chroma_format_idc; + data17 = 0xf8 | sps.bit_depth_luma_minus8; + data18 = 0xf8 | sps.bit_depth_chroma_minus8; + data19 = 0x00; + data20 = 0x00; + data21 = + 0x00 | ((sps.max_sub_layers_minus1 + + 1) << 3) | (sps.temporal_id_nesting_flag << 2) | 3; + GST_WRITE_UINT8 (data + 22, 3); /* numOfArrays */ + + data += 23; + + /* vps */ + data0 = 0x00 | 0x20; + data++; + GST_WRITE_UINT16_BE (data, 1); + data += 2; + GST_WRITE_UINT16_BE (data, vps_nalu.size); + data += 2; + memcpy (data, vps_nalu.data + vps_nalu.offset, vps_nalu.size); + data += vps_nalu.size; + + /* sps */ + data0 = 0x00 | 0x21; + data++; + GST_WRITE_UINT16_BE (data, 1); + data += 2; + GST_WRITE_UINT16_BE (data, sps_nalu.size); + data += 2; + memcpy (data, sps_nalu.data + sps_nalu.offset, sps_nalu.size); + data += sps_nalu.size; + + /* pps */ + data0 = 0x00 | 0x22; + data++; + GST_WRITE_UINT16_BE (data, 1); + data += 2; + GST_WRITE_UINT16_BE (data, pps_nalu.size); + data += 2; + memcpy (data, pps_nalu.data + pps_nalu.offset, pps_nalu.size); + gst_buffer_unmap (codec_data, &info); + } + + profile_from_vps = + gst_codec_utils_h265_get_profile (vps_nalu.data + vps_nalu.offset + + vps_nalu.header_bytes + 4, vps_nalu.size - vps_nalu.header_bytes - 4); + if (!profile_from_vps) { + GST_WARNING_OBJECT (self, "Failed to parse profile from SPS"); + } else if (!downstream_profiles.empty ()) { + if (downstream_profiles.find (profile_from_vps) != + downstream_profiles.end ()) { + caps_str += ", profile = (string) " + std::string (profile_from_vps); + } else if (downstream_profiles.find ("main-10") != + downstream_profiles.end () && strcmp (profile_from_vps, "main") == 0) { + caps_str += ", profile = (string) main-10"; + } else if (downstream_profiles.find ("main-444-10") != + downstream_profiles.end () && + strcmp (profile_from_vps, "main-444") == 0) { + caps_str += ", profile = (string) main-444-10"; + } + } else { + caps_str += ", profile = (string) " + std::string (profile_from_vps); + } + + switch (self->stream_format) { + case GST_NV_H265_ENCODER_HVC1: + caps_str += ", stream-format = (string) hvc1"; + break; + case GST_NV_H265_ENCODER_HEV1: + caps_str += ", stream-format = (string) hev1"; + break; + default: + caps_str += ", stream-format = (string) byte-stream"; + break; + } + + caps = gst_caps_from_string (caps_str.c_str ()); + + if (packetized) { + gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, codec_data, NULL); + gst_buffer_unref (codec_data); + } + + output_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (self), + caps, state); + + GST_INFO_OBJECT (self, "Output caps: %" GST_PTR_FORMAT, output_state->caps); + gst_video_codec_state_unref (output_state); + + tags = gst_tag_list_new_empty (); + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, + "nvh265encoder", NULL); + + gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (encoder), + tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (tags); + + return TRUE; +} + +static GstBuffer * +gst_nv_h265_encoder_create_output_buffer (GstNvEncoder * + encoder, NV_ENC_LOCK_BITSTREAM * bitstream) +{ + GstNvH265Encoder *self = GST_NV_H265_ENCODER (encoder); + GstBuffer *buffer; + GstH265ParserResult rst; + GstH265NalUnit nalu; + + if (self->stream_format == GST_NV_H265_ENCODER_BYTE_STREAM) { + return gst_buffer_new_memdup (bitstream->bitstreamBufferPtr, + bitstream->bitstreamSizeInBytes); + } + + buffer = gst_buffer_new (); + rst = gst_h265_parser_identify_nalu (self->parser, + (guint8 *) bitstream->bitstreamBufferPtr, 0, + bitstream->bitstreamSizeInBytes, &nalu); + + if (rst == GST_H265_PARSER_NO_NAL_END) + rst = GST_H265_PARSER_OK; + + while (rst == GST_H265_PARSER_OK) { + GstMemory *mem; + guint8 *data; + + data = (guint8 *) g_malloc0 (nalu.size + 4); + GST_WRITE_UINT32_BE (data, nalu.size); + memcpy (data + 4, nalu.data + nalu.offset, nalu.size); + + mem = gst_memory_new_wrapped ((GstMemoryFlags) 0, data, nalu.size + 4, + 0, nalu.size + 4, data, (GDestroyNotify) g_free); + gst_buffer_append_memory (buffer, mem); + + rst = gst_h265_parser_identify_nalu (self->parser, + (guint8 *) bitstream->bitstreamBufferPtr, nalu.offset + nalu.size, + bitstream->bitstreamSizeInBytes, &nalu); + + if (rst == GST_H265_PARSER_NO_NAL_END) + rst = GST_H265_PARSER_OK; + } + + return buffer; +} + +static GstNvEncoderReconfigure +gst_nv_h265_encoder_check_reconfigure (GstNvEncoder * encoder, + NV_ENC_CONFIG * config) +{ + GstNvH265Encoder *self = GST_NV_H265_ENCODER (encoder); + GstNvEncoderReconfigure reconfig = GST_NV_ENCODER_RECONFIGURE_NONE; + + /* Dynamic RC param update is not tested, do soft-reconfigure only for + * bitrate update */ + g_mutex_lock (&self->prop_lock); + if (self->init_param_updated || self->rc_param_updated) { + reconfig = GST_NV_ENCODER_RECONFIGURE_FULL; + goto done; + } + + if (self->bitrate_updated) { + GstNvH265EncoderClass *klass = GST_NV_H265_ENCODER_GET_CLASS (self); + if (klass->device_caps.dyn_bitrate_change > 0) { + config->rcParams.averageBitRate = self->bitrate * 1024; + config->rcParams.maxBitRate = self->max_bitrate * 1024; + reconfig = GST_NV_ENCODER_RECONFIGURE_BITRATE; + } else { + reconfig = GST_NV_ENCODER_RECONFIGURE_FULL; + } + } + +done: + self->init_param_updated = FALSE; + self->rc_param_updated = FALSE; + self->bitrate_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return reconfig; +} + +static gboolean +gst_nv_h265_encoder_select_device (GstNvEncoder * encoder, + const GstVideoInfo * info, GstBuffer * buffer, + GstNvEncoderDeviceData * data) +{ + GstNvH265Encoder *self = GST_NV_H265_ENCODER (encoder); + GstNvH265EncoderClass *klass = GST_NV_H265_ENCODER_GET_CLASS (self); + GstMemory *mem; + + memset (data, 0, sizeof (GstNvEncoderDeviceData)); + + g_assert (klass->device_mode == GST_NV_ENCODER_DEVICE_AUTO_SELECT); + + mem = gst_buffer_peek_memory (buffer, 0); + if (klass->cuda_device_id_size > 0 && gst_is_cuda_memory (mem)) { + GstCudaMemory *cmem = GST_CUDA_MEMORY_CAST (mem); + GstCudaContext *context = cmem->context; + guint device_id; + gboolean found = FALSE; + + g_object_get (context, "cuda-device-id", &device_id, nullptr); + + data->device_mode = GST_NV_ENCODER_DEVICE_CUDA; + self->selected_device_mode = GST_NV_ENCODER_DEVICE_CUDA; + + for (guint i = 0; i < klass->cuda_device_id_size; i++) { + if (klass->cuda_device_id_listi == device_id) { + data->cuda_device_id = device_id; + found = TRUE; + break; + } + } + + if (!found) { + GST_INFO_OBJECT (self, + "Upstream CUDA device is not in supported device list"); + data->cuda_device_id = self->cuda_device_id; + } else { + data->device = (GstObject *) gst_object_ref (context); + } + + if (data->cuda_device_id != self->cuda_device_id) { + self->cuda_device_id = data->cuda_device_id; + g_object_notify (G_OBJECT (self), "cuda-device-id"); + } + + return TRUE; + } +#ifdef GST_CUDA_HAS_D3D + if (klass->adapter_luid_size > 0 && gst_is_d3d11_memory (mem)) { + GstD3D11Memory *dmem = GST_D3D11_MEMORY_CAST (mem); + GstD3D11Device *device = dmem->device; + gint64 adapter_luid; + gboolean found = FALSE; + + g_object_get (device, "adapter-luid", &adapter_luid, nullptr); + + data->device_mode = GST_NV_ENCODER_DEVICE_D3D11; + self->selected_device_mode = GST_NV_ENCODER_DEVICE_D3D11; + + for (guint i = 0; i < klass->cuda_device_id_size; i++) { + if (klass->adapter_luid_listi == adapter_luid) { + data->adapter_luid = adapter_luid; + found = TRUE; + break; + } + } + + if (!found) { + GST_INFO_OBJECT (self, + "Upstream D3D11 device is not in supported device list"); + data->adapter_luid = self->adapter_luid; + } else { + data->device = (GstObject *) gst_object_ref (device); + } + + if (data->adapter_luid != self->adapter_luid) { + self->adapter_luid = data->adapter_luid; + g_object_notify (G_OBJECT (self), "adapter-luid"); + } + + return TRUE; + } +#endif + + if (klass->cuda_device_id_size > 0 && + (self->selected_device_mode != GST_NV_ENCODER_DEVICE_D3D11)) { + GST_INFO_OBJECT (self, "Upstream is system memory, use CUDA mode"); + data->device_mode = GST_NV_ENCODER_DEVICE_CUDA; + data->cuda_device_id = self->cuda_device_id; + } else { + GST_INFO_OBJECT (self, "Upstream is system memory, use CUDA mode"); + data->device_mode = GST_NV_ENCODER_DEVICE_D3D11; + data->adapter_luid = self->adapter_luid; + } + + self->selected_device_mode = data->device_mode; + + return TRUE; +} + +static GstNvEncoderClassData * +gst_nv_h265_encoder_create_class_data (GstObject * device, gpointer session, + GstNvEncoderDeviceMode device_mode) +{ + NVENCSTATUS status; + GstNvEncoderDeviceCaps dev_caps = { 0, }; + GUID profile_guids16; + NV_ENC_BUFFER_FORMAT input_formats16; + guint32 profile_guid_count = 0; + guint32 input_format_count = 0; + std::string sink_caps_str; + std::string src_caps_str; + std::string format_str; + std::set < std::string > formats; + std::set < std::string > profiles; + std::string profile_str; + std::string resolution_str; + GstNvEncoderClassData *cdata; + GstCaps *sink_caps; + GstCaps *system_caps; + + status = NvEncGetEncodeProfileGUIDs (session, NV_ENC_CODEC_HEVC_GUID, + profile_guids, G_N_ELEMENTS (profile_guids), &profile_guid_count); + if (status != NV_ENC_SUCCESS || profile_guid_count == 0) { + GST_WARNING_OBJECT (device, "Unable to get supported profiles"); + return NULL; + } + + status = NvEncGetInputFormats (session, NV_ENC_CODEC_HEVC_GUID, input_formats, + G_N_ELEMENTS (input_formats), &input_format_count); + if (status != NV_ENC_SUCCESS || input_format_count == 0) { + GST_WARNING_OBJECT (device, "Unable to get supported input formats"); + return NULL; + } + + gst_nv_encoder_get_encoder_caps (session, &NV_ENC_CODEC_HEVC_GUID, &dev_caps); + + for (guint32 i = 0; i < input_format_count; i++) { + switch (input_formatsi) { + case NV_ENC_BUFFER_FORMAT_NV12: + formats.insert ("NV12"); + break; + case NV_ENC_BUFFER_FORMAT_YUV444: + if (dev_caps.yuv444_encode) + formats.insert ("Y444"); + break; + case NV_ENC_BUFFER_FORMAT_YUV420_10BIT: + if (dev_caps.supports_10bit_encode) + formats.insert ("P010_10LE"); + break; + case NV_ENC_BUFFER_FORMAT_YUV444_10BIT: + if (dev_caps.supports_10bit_encode && dev_caps.yuv444_encode) + formats.insert ("Y444_16LE"); + break; + default: + break; + } + } + + if (formats.empty ()) { + GST_WARNING_OBJECT (device, "Empty supported input format"); + return NULL; + } +#define APPEND_STRING(dst,set,str) G_STMT_START { \ + if (set.find(str) != set.end()) { \ + if (!first) \ + dst += ", "; \ + dst += str; \ + first = false; \ + } \ +} G_STMT_END + + if (formats.size () == 1) { + format_str = "format = (string) " + *(formats.begin ()); + } else { + bool first = true; + + format_str = "format = (string) { "; + APPEND_STRING (format_str, formats, "NV12"); + APPEND_STRING (format_str, formats, "P010_10LE"); + APPEND_STRING (format_str, formats, "Y444"); + APPEND_STRING (format_str, formats, "Y444_16LE"); + format_str += " }"; + } + + for (guint32 i = 0; i < profile_guid_count; i++) { + if (profile_guidsi == NV_ENC_HEVC_PROFILE_MAIN_GUID) { + profiles.insert ("main"); + } else if (profile_guidsi == NV_ENC_HEVC_PROFILE_MAIN10_GUID) { + profiles.insert ("main-10"); + } else if (profile_guidsi == NV_ENC_HEVC_PROFILE_FREXT_GUID) { + if (formats.find ("Y444") != formats.end ()) + profiles.insert ("main-444"); + if (formats.find ("Y444_16LE") != formats.end ()) + profiles.insert ("main-444-10"); + } + } + + if (profiles.empty ()) { + GST_WARNING_OBJECT (device, "Empty supported h265 profile"); + return NULL; + } + + if (profiles.size () == 1) { + profile_str = "profile = (string) " + *(profiles.begin ()); + } else { + bool first = true; + + profile_str = "profile = (string) { "; + APPEND_STRING (profile_str, profiles, "main"); + APPEND_STRING (profile_str, profiles, "main-10"); + APPEND_STRING (profile_str, profiles, "main-444"); + APPEND_STRING (profile_str, profiles, "main-444-10"); + profile_str += " }"; + } +#undef APPEND_STRING + + resolution_str = "width = (int) " + + std::to_string (GST_ROUND_UP_16 (dev_caps.width_min)) + + ", " + std::to_string (dev_caps.width_max) + " "; + resolution_str += ", height = (int) " + + std::to_string (GST_ROUND_UP_16 (dev_caps.height_min)) + + ", " + std::to_string (dev_caps.height_max) + " "; + + sink_caps_str = "video/x-raw, " + format_str + ", " + resolution_str + + ", interlace-mode = (string) progressive"; + + src_caps_str = "video/x-h265, " + resolution_str + ", " + profile_str + + ", stream-format = (string) { hvc1, hev1, byte-stream }" + + ", alignment = (string) au"; + + system_caps = gst_caps_from_string (sink_caps_str.c_str ()); + sink_caps = gst_caps_copy (system_caps); +#ifdef GST_CUDA_HAS_D3D + if (device_mode == GST_NV_ENCODER_DEVICE_D3D11) { + gst_caps_set_features (sink_caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr)); + } +#endif + + if (device_mode == GST_NV_ENCODER_DEVICE_CUDA) { + gst_caps_set_features (sink_caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY, nullptr)); + } + + gst_caps_append (sink_caps, system_caps); + + cdata = gst_nv_encoder_class_data_new (); + cdata->sink_caps = sink_caps; + cdata->src_caps = gst_caps_from_string (src_caps_str.c_str ()); + cdata->device_caps = dev_caps; + cdata->device_mode = device_mode; + + /* *INDENT-OFF* */ + for (const auto &iter: formats) + cdata->formats = g_list_append (cdata->formats, g_strdup (iter.c_str())); + + for (const auto &iter: profiles) + cdata->profiles = g_list_append (cdata->profiles, g_strdup (iter.c_str())); + /* *INDENT-ON* */ + + if (device_mode == GST_NV_ENCODER_DEVICE_D3D11) + g_object_get (device, "adapter-luid", &cdata->adapter_luid, nullptr); + + if (device_mode == GST_NV_ENCODER_DEVICE_CUDA) + g_object_get (device, "cuda-device-id", &cdata->cuda_device_id, nullptr); + + /* class data will be leaked if the element never gets instantiated */ + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + return cdata; +} + +GstNvEncoderClassData * +gst_nv_h265_encoder_register_cuda (GstPlugin * plugin, GstCudaContext * context, + guint rank) +{ + NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS session_params = { 0, }; + gpointer session; + NVENCSTATUS status; + GstNvEncoderClassData *cdata; + + GST_DEBUG_CATEGORY_INIT (gst_nv_h265_encoder_debug, "nvh265encoder", 0, + "nvh265encoder"); + + session_params.version = + gst_nvenc_get_open_encode_session_ex_params_version (); + session_params.deviceType = NV_ENC_DEVICE_TYPE_CUDA; + session_params.device = gst_cuda_context_get_handle (context); + session_params.apiVersion = gst_nvenc_get_api_version (); + + status = NvEncOpenEncodeSessionEx (&session_params, &session); + if (status != NV_ENC_SUCCESS) { + GST_WARNING_OBJECT (context, "Failed to open session"); + return nullptr; + } + + cdata = gst_nv_h265_encoder_create_class_data (GST_OBJECT (context), session, + GST_NV_ENCODER_DEVICE_CUDA); + NvEncDestroyEncoder (session); + + if (!cdata) + return nullptr; + + gst_nv_encoder_class_data_ref (cdata); + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstNvH265EncoderClass), + NULL, + NULL, + (GClassInitFunc) gst_nv_h265_encoder_class_init, + NULL, + cdata, + sizeof (GstNvH265Encoder), + 0, + (GInstanceInitFunc) gst_nv_h265_encoder_init, + }; + + type_name = g_strdup ("GstNvCudaH265Enc"); + feature_name = g_strdup ("nvcudah265enc"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstNvCudaH265Device%dEnc", index); + feature_name = g_strdup_printf ("nvcudah265device%denc", index); + } + + type = g_type_register_static (GST_TYPE_NV_ENCODER, type_name, + &type_info, (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); + + return cdata; +} + +#ifdef GST_CUDA_HAS_D3D +GstNvEncoderClassData * +gst_nv_h265_encoder_register_d3d11 (GstPlugin * plugin, GstD3D11Device * device, + guint rank) +{ + NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS session_params = { 0, }; + gpointer session; + NVENCSTATUS status; + GstNvEncoderClassData *cdata; + + GST_DEBUG_CATEGORY_INIT (gst_nv_h265_encoder_debug, "nvh265encoder", 0, + "nvh265encoder"); + + session_params.version = + gst_nvenc_get_open_encode_session_ex_params_version (); + session_params.deviceType = NV_ENC_DEVICE_TYPE_DIRECTX; + session_params.device = gst_d3d11_device_get_device_handle (device); + session_params.apiVersion = gst_nvenc_get_api_version (); + + status = NvEncOpenEncodeSessionEx (&session_params, &session); + if (status != NV_ENC_SUCCESS) { + GST_WARNING_OBJECT (device, "Failed to open session"); + return nullptr; + } + + cdata = gst_nv_h265_encoder_create_class_data (GST_OBJECT (device), session, + GST_NV_ENCODER_DEVICE_D3D11); + NvEncDestroyEncoder (session); + + if (!cdata) + return nullptr; + + gst_nv_encoder_class_data_ref (cdata); + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstNvH265EncoderClass), + NULL, + NULL, + (GClassInitFunc) gst_nv_h265_encoder_class_init, + NULL, + cdata, + sizeof (GstNvH265Encoder), + 0, + (GInstanceInitFunc) gst_nv_h265_encoder_init, + }; + + type_name = g_strdup ("GstNvD3D11H265Enc"); + feature_name = g_strdup ("nvd3d11h265enc"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstNvD3D11H265Device%dEnc", index); + feature_name = g_strdup_printf ("nvd3d11h265device%denc", index); + } + + type = g_type_register_static (GST_TYPE_NV_ENCODER, type_name, + &type_info, (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); + + return cdata; +} +#endif + +void +gst_nv_h265_encoder_register_auto_select (GstPlugin * plugin, + GList * device_caps_list, guint rank) +{ + std::set < std::string > formats; + std::set < std::string > profiles; + std::string sink_caps_str; + std::string src_caps_str; + std::string format_str; + std::string profile_str; + std::string resolution_str; + GList *iter; + guint adapter_luid_size = 0; + gint64 adapter_luid_list8; + guint cuda_device_id_size = 0; + guint cuda_device_id_list8; + GstNvEncoderDeviceCaps dev_caps; + GstNvEncoderClassData *cdata; + GstCaps *sink_caps = nullptr; + GstCaps *system_caps; + + GST_DEBUG_CATEGORY_INIT (gst_nv_h265_encoder_debug, "nvh265encoder", 0, + "nvh265encoder"); + + for (iter = device_caps_list; iter; iter = g_list_next (iter)) { + GstNvEncoderClassData *cdata = (GstNvEncoderClassData *) iter->data; + GList *walk; + + for (walk = cdata->formats; walk; walk = g_list_next (walk)) + formats.insert ((gchar *) walk->data); + + for (walk = cdata->profiles; walk; walk = g_list_next (walk)) + profiles.insert ((gchar *) walk->data); + + if (cdata->device_mode == GST_NV_ENCODER_DEVICE_D3D11 && + adapter_luid_size < G_N_ELEMENTS (adapter_luid_list) - 1) { + adapter_luid_listadapter_luid_size = cdata->adapter_luid; + adapter_luid_size++; + } + + if (cdata->device_mode == GST_NV_ENCODER_DEVICE_CUDA && + cuda_device_id_size < G_N_ELEMENTS (cuda_device_id_list) - 1) { + cuda_device_id_listcuda_device_id_size = cdata->cuda_device_id; + cuda_device_id_size++; + } + + if (iter == device_caps_list) { + dev_caps = cdata->device_caps; + } else { + gst_nv_encoder_merge_device_caps (&dev_caps, &cdata->device_caps, + &dev_caps); + } + } + + g_list_free_full (device_caps_list, + (GDestroyNotify) gst_nv_encoder_class_data_unref); + if (formats.empty () || profiles.empty ()) + return; + +#define APPEND_STRING(dst,set,str) G_STMT_START { \ + if (set.find(str) != set.end()) { \ + if (!first) \ + dst += ", "; \ + dst += str; \ + first = false; \ + } \ +} G_STMT_END + + if (formats.size () == 1) { + format_str = "format = (string) " + *(formats.begin ()); + } else { + bool first = true; + + format_str = "format = (string) { "; + APPEND_STRING (format_str, formats, "NV12"); + APPEND_STRING (format_str, formats, "P010_10LE"); + APPEND_STRING (format_str, formats, "Y444"); + APPEND_STRING (format_str, formats, "Y444_16LE"); + format_str += " }"; + } + + if (profiles.size () == 1) { + profile_str = "profile = (string) " + *(profiles.begin ()); + } else { + bool first = true; + + profile_str = "profile = (string) { "; + APPEND_STRING (profile_str, profiles, "main"); + APPEND_STRING (profile_str, profiles, "main-10"); + APPEND_STRING (profile_str, profiles, "main-444"); + APPEND_STRING (profile_str, profiles, "main-444-10"); + profile_str += " }"; + } +#undef APPEND_STRING + + resolution_str = "width = (int) " + + std::to_string (GST_ROUND_UP_16 (dev_caps.width_min)) + + ", " + std::to_string (dev_caps.width_max) + " "; + resolution_str += ", height = (int) " + + std::to_string (GST_ROUND_UP_16 (dev_caps.height_min)) + + ", " + std::to_string (dev_caps.height_max) + " "; + + sink_caps_str = "video/x-raw, " + format_str + ", " + resolution_str + + ", interlace-mode = (string) progressive"; + + src_caps_str = "video/x-h265, " + resolution_str + ", " + profile_str + + ", stream-format = (string) { hvc1, hev1, byte-stream }" + + ", alignment = (string) au"; + + system_caps = gst_caps_from_string (sink_caps_str.c_str ()); + sink_caps = gst_caps_new_empty (); + + if (cuda_device_id_size > 0) { + GstCaps *cuda_caps = gst_caps_copy (system_caps); + gst_caps_set_features (cuda_caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY, nullptr)); + gst_caps_append (sink_caps, cuda_caps); + } +#ifdef GST_CUDA_HAS_D3D + if (adapter_luid_size > 0) { + GstCaps *d3d11_caps = gst_caps_copy (system_caps); + gst_caps_set_features (d3d11_caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr)); + gst_caps_append (sink_caps, d3d11_caps); + } +#endif + + gst_caps_append (sink_caps, system_caps); + + cdata = gst_nv_encoder_class_data_new (); + cdata->sink_caps = sink_caps; + cdata->src_caps = gst_caps_from_string (src_caps_str.c_str ()); + cdata->device_caps = dev_caps; + cdata->device_mode = GST_NV_ENCODER_DEVICE_AUTO_SELECT; + cdata->adapter_luid = adapter_luid_list0; + cdata->adapter_luid_size = adapter_luid_size; + memcpy (&cdata->adapter_luid_list, + adapter_luid_list, sizeof (adapter_luid_list)); + cdata->cuda_device_id = cuda_device_id_list0; + cdata->cuda_device_id_size = cuda_device_id_size; + memcpy (&cdata->cuda_device_id_list, + cuda_device_id_list, sizeof (cuda_device_id_list)); + + /* class data will be leaked if the element never gets instantiated */ + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GType type; + GTypeInfo type_info = { + sizeof (GstNvH265EncoderClass), + nullptr, + nullptr, + (GClassInitFunc) gst_nv_h265_encoder_class_init, + nullptr, + cdata, + sizeof (GstNvH265Encoder), + 0, + (GInstanceInitFunc) gst_nv_h265_encoder_init, + }; + + type = g_type_register_static (GST_TYPE_NV_ENCODER, "GstNvAutoGpuH265Enc", + &type_info, (GTypeFlags) 0); + + if (!gst_element_register (plugin, "nvautogpuh265enc", rank, type)) + GST_WARNING ("Failed to register plugin 'GstNvAutoGpuH265Enc'"); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvh265encoder.h
Added
@@ -0,0 +1,41 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "gstnvencoder.h" + +G_BEGIN_DECLS + +GstNvEncoderClassData * gst_nv_h265_encoder_register_cuda (GstPlugin * plugin, + GstCudaContext * context, + guint rank); + +#ifdef GST_CUDA_HAS_D3D +GstNvEncoderClassData * gst_nv_h265_encoder_register_d3d11 (GstPlugin * plugin, + GstD3D11Device * device, + guint rank); +#endif + +void gst_nv_h265_encoder_register_auto_select (GstPlugin * plugin, + GList * device_caps_list, + guint rank); + + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvvp8dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvvp8dec.c
Changed
@@ -17,12 +17,28 @@ * Boston, MA 02110-1301, USA. */ +/** + * SECTION:element-nvvp8sldec + * @title: nvvp8sldec + * + * GstCodecs based NVIDIA VP8 video decoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 filesrc location=/path/to/vp8/file ! parsebin ! nvvp8sldec ! videoconvert ! autovideosink + * ``` + * + * Since: 1.20 + * + */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif +#include <gst/cuda/gstcudautils.h> + #include "gstnvvp8dec.h" -#include "gstcudautils.h" #include "gstnvdecoder.h" #include <string.h> @@ -30,36 +46,37 @@ GST_DEBUG_CATEGORY_STATIC (gst_nv_vp8_dec_debug); #define GST_CAT_DEFAULT gst_nv_vp8_dec_debug -/* reference list 4 + 2 margin */ -#define NUM_OUTPUT_VIEW 6 - -struct _GstNvVp8Dec +typedef struct _GstNvVp8Dec { GstVp8Decoder parent; - GstVideoCodecState *output_state; - GstCudaContext *context; GstNvDecoder *decoder; CUVIDPICPARAMS params; guint width, height; -}; +} GstNvVp8Dec; -struct _GstNvVp8DecClass +typedef struct _GstNvVp8DecClass { GstVp8DecoderClass parent_class; guint cuda_device_id; +} GstNvVp8DecClass; + +enum +{ + PROP_0, + PROP_CUDA_DEVICE_ID, }; -#define gst_nv_vp8_dec_parent_class parent_class +static GTypeClass *parent_class = NULL; -/** - * GstNvVp8Dec: - * - * Since: 1.20 - */ -G_DEFINE_TYPE (GstNvVp8Dec, gst_nv_vp8_dec, GST_TYPE_VP8_DECODER); +#define GST_NV_VP8_DEC(object) ((GstNvVp8Dec *) (object)) +#define GST_NV_VP8_DEC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstNvVp8DecClass)) + +static void gst_nv_vp8_dec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static void gst_nv_vp8_dec_set_context (GstElement * element, GstContext * context); @@ -73,7 +90,7 @@ /* GstVp8Decoder */ static GstFlowReturn gst_nv_vp8_dec_new_sequence (GstVp8Decoder * decoder, - const GstVp8FrameHdr * frame_hdr); + const GstVp8FrameHdr * frame_hdr, gint max_dpb_size); static GstFlowReturn gst_nv_vp8_dec_new_picture (GstVp8Decoder * decoder, GstVideoCodecFrame * frame, GstVp8Picture * picture); static GstFlowReturn gst_nv_vp8_dec_decode_picture (GstVp8Decoder * decoder, @@ -84,14 +101,43 @@ gboolean is_live); static void -gst_nv_vp8_dec_class_init (GstNvVp8DecClass * klass) +gst_nv_vp8_dec_class_init (GstNvVp8DecClass * klass, + GstNvDecoderClassData * cdata) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_CLASS (klass); GstVp8DecoderClass *vp8decoder_class = GST_VP8_DECODER_CLASS (klass); + object_class->get_property = gst_nv_vp8_dec_get_property; + + /** + * GstNvVp8SLDec:cuda-device-id: + * + * Assigned CUDA device id + * + * Since: 1.22 + */ + g_object_class_install_property (object_class, PROP_CUDA_DEVICE_ID, + g_param_spec_uint ("cuda-device-id", "CUDA device id", + "Assigned CUDA device id", 0, G_MAXINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + element_class->set_context = GST_DEBUG_FUNCPTR (gst_nv_vp8_dec_set_context); + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + gst_element_class_set_metadata (element_class, + "NVDEC VP8 Stateless Decoder", + "Codec/Decoder/Video/Hardware", + "NVIDIA VP8 video decoder", "Seungha Yang <seungha@centricular.com>"); + + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + cdata->sink_caps)); + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + cdata->src_caps)); + decoder_class->open = GST_DEBUG_FUNCPTR (gst_nv_vp8_dec_open); decoder_class->close = GST_DEBUG_FUNCPTR (gst_nv_vp8_dec_close); decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_nv_vp8_dec_negotiate); @@ -110,10 +156,11 @@ vp8decoder_class->get_preferred_output_delay = GST_DEBUG_FUNCPTR (gst_nv_vp8_dec_get_preferred_output_delay); - GST_DEBUG_CATEGORY_INIT (gst_nv_vp8_dec_debug, - "nvvp8dec", 0, "NVIDIA VP8 Decoder"); + klass->cuda_device_id = cdata->cuda_device_id; - gst_type_mark_as_plugin_api (GST_TYPE_NV_VP8_DEC, 0); + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); } static void @@ -122,6 +169,22 @@ } static void +gst_nv_vp8_dec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstNvVp8DecClass *klass = GST_NV_VP8_DEC_GET_CLASS (object); + + switch (prop_id) { + case PROP_CUDA_DEVICE_ID: + g_value_set_uint (value, klass->cuda_device_id); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void gst_nv_vp8_dec_set_context (GstElement * element, GstContext * context) { GstNvVp8Dec *self = GST_NV_VP8_DEC (element); @@ -170,7 +233,6 @@ { GstNvVp8Dec *self = GST_NV_VP8_DEC (decoder); - g_clear_pointer (&self->output_state, gst_video_codec_state_unref); gst_clear_object (&self->decoder); gst_clear_object (&self->context); @@ -185,8 +247,7 @@ GST_DEBUG_OBJECT (self, "negotiate"); - gst_nv_decoder_negotiate (self->decoder, decoder, vp8dec->input_state, - &self->output_state); + gst_nv_decoder_negotiate (self->decoder, decoder, vp8dec->input_state); /* TODO: add support D3D11 memory */ @@ -231,7 +292,7 @@ static GstFlowReturn gst_nv_vp8_dec_new_sequence (GstVp8Decoder * decoder, - const GstVp8FrameHdr * frame_hdr) + const GstVp8FrameHdr * frame_hdr, gint max_dpb_size) { GstNvVp8Dec *self = GST_NV_VP8_DEC (decoder); gboolean modified = FALSE; @@ -258,8 +319,7 @@ if (!gst_nv_decoder_configure (self->decoder, cudaVideoCodec_VP8, &info, self->width, self->height, 8, - /* +4 for render delay */ - NUM_OUTPUT_VIEW + 4)) { + max_dpb_size, FALSE)) { GST_ERROR_OBJECT (self, "Failed to configure decoder"); return GST_FLOW_NOT_NEGOTIATED; } @@ -418,8 +478,8 @@ goto error; } - if (!gst_nv_decoder_finish_frame (self->decoder, vdec, decoder_frame, - &frame->output_buffer)) { + if (!gst_nv_decoder_finish_frame (self->decoder, vdec, picture->discont_state, + decoder_frame, &frame->output_buffer)) { GST_ERROR_OBJECT (self, "Failed to handle output picture"); goto error; } @@ -447,109 +507,64 @@ return 4; } -typedef struct -{ - GstCaps *sink_caps; - GstCaps *src_caps; - guint cuda_device_id; - gboolean is_default; -} GstNvVp8DecClassData; - -static void -gst_nv_vp8_dec_subclass_init (gpointer klass, GstNvVp8DecClassData * cdata) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstNvVp8DecClass *nvdec_class = (GstNvVp8DecClass *) (klass); - gchar *long_name; - - if (cdata->is_default) { - long_name = g_strdup_printf ("NVDEC VP8 Stateless Decoder"); - } else { - long_name = g_strdup_printf ("NVDEC VP8 Stateless Decoder with device %d", - cdata->cuda_device_id); - } - - gst_element_class_set_metadata (element_class, long_name, - "Codec/Decoder/Video/Hardware", - "NVIDIA VP8 video decoder", "Seungha Yang <seungha@centricular.com>"); - g_free (long_name); - - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); - - nvdec_class->cuda_device_id = cdata->cuda_device_id; - - gst_caps_unref (cdata->sink_caps); - gst_caps_unref (cdata->src_caps); - g_free (cdata); -} - void gst_nv_vp8_dec_register (GstPlugin * plugin, guint device_id, guint rank, GstCaps * sink_caps, GstCaps * src_caps, gboolean is_primary) { - GTypeQuery type_query; - GTypeInfo type_info = { 0, }; - GType subtype; + GType type; gchar *type_name; gchar *feature_name; - GstNvVp8DecClassData *cdata; - gboolean is_default = TRUE; - - /** - * element-nvvp8sldec: - * - * Since: 1.20 - */ - - cdata = g_new0 (GstNvVp8DecClassData, 1); + GstNvDecoderClassData *cdata; + gint index = 0; + GTypeInfo type_info = { + sizeof (GstNvVp8DecClass), + NULL, + NULL, + (GClassInitFunc) gst_nv_vp8_dec_class_init, + NULL, + NULL, + sizeof (GstNvVp8Dec), + 0, + (GInstanceInitFunc) gst_nv_vp8_dec_init, + }; + + GST_DEBUG_CATEGORY_INIT (gst_nv_vp8_dec_debug, "nvvp8dec", 0, "nvvp8dec"); + + cdata = g_new0 (GstNvDecoderClassData, 1); cdata->sink_caps = gst_caps_ref (sink_caps); cdata->src_caps = gst_caps_ref (src_caps); cdata->cuda_device_id = device_id; - g_type_query (GST_TYPE_NV_VP8_DEC, &type_query); - memset (&type_info, 0, sizeof (type_info)); - type_info.class_size = type_query.class_size; - type_info.instance_size = type_query.instance_size; - type_info.class_init = (GClassInitFunc) gst_nv_vp8_dec_subclass_init; - type_info.class_data = cdata; - if (is_primary) { - type_name = g_strdup ("GstNvVP8StatelessPrimaryDec"); + type_name = g_strdup ("GstNvVp8Dec"); feature_name = g_strdup ("nvvp8dec"); } else { - type_name = g_strdup ("GstNvVP8StatelessDec"); + type_name = g_strdup ("GstNvVp8SLDec"); feature_name = g_strdup ("nvvp8sldec"); } - if (g_type_from_name (type_name) != 0) { + while (g_type_from_name (type_name)) { + index++; g_free (type_name); g_free (feature_name); if (is_primary) { - type_name = - g_strdup_printf ("GstNvVP8StatelessPrimaryDevice%dDec", device_id); - feature_name = g_strdup_printf ("nvvp8device%ddec", device_id); + type_name = g_strdup_printf ("GstNvVp8Device%dDec", index); + feature_name = g_strdup_printf ("nvvp8device%ddec", index); } else { - type_name = g_strdup_printf ("GstNvVP8StatelessDevice%dDec", device_id); - feature_name = g_strdup_printf ("nvvp8sldevice%ddec", device_id); + type_name = g_strdup_printf ("GstNvVp8SLDevice%dDec", index); + feature_name = g_strdup_printf ("nvvp8sldevice%ddec", index); } - - is_default = FALSE; } - cdata->is_default = is_default; - subtype = g_type_register_static (GST_TYPE_NV_VP8_DEC, + type_info.class_data = cdata; + type = g_type_register_static (GST_TYPE_VP8_DECODER, type_name, &type_info, 0); /* make lower rank than default device */ - if (rank > 0 && !is_default) + if (rank > 0 && index > 0) rank--; - if (!gst_element_register (plugin, feature_name, rank, subtype)) + if (!gst_element_register (plugin, feature_name, rank, type)) GST_WARNING ("Failed to register plugin '%s'", type_name); g_free (type_name);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvvp8dec.h -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvvp8dec.h
Changed
@@ -25,16 +25,6 @@ G_BEGIN_DECLS -#define GST_TYPE_NV_VP8_DEC (gst_nv_vp8_dec_get_type()) -#define GST_NV_VP8_DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_NV_VP8_DEC, GstNvVp8Dec)) -#define GST_NV_VP8_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_NV_VP8_DEC, GstNvVp8DecClass)) -#define GST_NV_VP8_DEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_NV_VP8_DEC, GstNvVp8DecClass)) - -typedef struct _GstNvVp8Dec GstNvVp8Dec; -typedef struct _GstNvVp8DecClass GstNvVp8DecClass; - -GType gst_nv_vp8_dec_get_type (void); - void gst_nv_vp8_dec_register (GstPlugin * plugin, guint device_id, guint rank,
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvvp9dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvvp9dec.c
Changed
@@ -17,12 +17,28 @@ * Boston, MA 02110-1301, USA. */ +/** + * SECTION:element-nvvp9sldec + * @title: nvvp9sldec + * + * GstCodecs based NVIDIA VP9 video decoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 filesrc location=/path/to/vp9/file ! parsebin ! nvvp9sldec ! videoconvert ! autovideosink + * ``` + * + * Since: 1.20 + * + */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif +#include <gst/cuda/gstcudautils.h> + #include "gstnvvp9dec.h" -#include "gstcudautils.h" #include "gstnvdecoder.h" #include <string.h> @@ -30,37 +46,38 @@ GST_DEBUG_CATEGORY_STATIC (gst_nv_vp9_dec_debug); #define GST_CAT_DEFAULT gst_nv_vp9_dec_debug -/* reference list 8 + 2 margin */ -#define NUM_OUTPUT_VIEW 10 - -struct _GstNvVp9Dec +typedef struct _GstNvVp9Dec { GstVp9Decoder parent; - GstVideoCodecState *output_state; - GstCudaContext *context; GstNvDecoder *decoder; CUVIDPICPARAMS params; guint width, height; GstVP9Profile profile; -}; +} GstNvVp9Dec; -struct _GstNvVp9DecClass +typedef struct _GstNvVp9DecClass { GstVp9DecoderClass parent_class; guint cuda_device_id; +} GstNvVp9DecClass; + +enum +{ + PROP_0, + PROP_CUDA_DEVICE_ID, }; -#define gst_nv_vp9_dec_parent_class parent_class +static GTypeClass *parent_class = NULL; -/** - * GstNvVp9Dec: - * - * Since: 1.20 - */ -G_DEFINE_TYPE (GstNvVp9Dec, gst_nv_vp9_dec, GST_TYPE_VP9_DECODER); +#define GST_NV_VP9_DEC(object) ((GstNvVp9Dec *) (object)) +#define GST_NV_VP9_DEC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstNvVp9DecClass)) + +static void gst_nv_vp9_dec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static void gst_nv_vp9_dec_set_context (GstElement * element, GstContext * context); @@ -74,7 +91,7 @@ /* GstVp9Decoder */ static GstFlowReturn gst_nv_vp9_dec_new_sequence (GstVp9Decoder * decoder, - const GstVp9FrameHeader * frame_hdr); + const GstVp9FrameHeader * frame_hdr, gint max_dpb_size); static GstFlowReturn gst_nv_vp9_dec_new_picture (GstVp9Decoder * decoder, GstVideoCodecFrame * frame, GstVp9Picture * picture); static GstVp9Picture *gst_nv_vp9_dec_duplicate_picture (GstVp9Decoder * @@ -87,14 +104,43 @@ gboolean is_live); static void -gst_nv_vp9_dec_class_init (GstNvVp9DecClass * klass) +gst_nv_vp9_dec_class_init (GstNvVp9DecClass * klass, + GstNvDecoderClassData * cdata) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_CLASS (klass); GstVp9DecoderClass *vp9decoder_class = GST_VP9_DECODER_CLASS (klass); + object_class->get_property = gst_nv_vp9_dec_get_property; + + /** + * GstNvVp9SLDec:cuda-device-id: + * + * Assigned CUDA device id + * + * Since: 1.22 + */ + g_object_class_install_property (object_class, PROP_CUDA_DEVICE_ID, + g_param_spec_uint ("cuda-device-id", "CUDA device id", + "Assigned CUDA device id", 0, G_MAXINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + element_class->set_context = GST_DEBUG_FUNCPTR (gst_nv_vp9_dec_set_context); + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + gst_element_class_set_metadata (element_class, + "NVDEC VP9 Stateless Decoder", + "Codec/Decoder/Video/Hardware", + "NVIDIA VP9 video decoder", "Seungha Yang <seungha@centricular.com>"); + + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + cdata->sink_caps)); + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + cdata->src_caps)); + decoder_class->open = GST_DEBUG_FUNCPTR (gst_nv_vp9_dec_open); decoder_class->close = GST_DEBUG_FUNCPTR (gst_nv_vp9_dec_close); decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_nv_vp9_dec_negotiate); @@ -115,10 +161,11 @@ vp9decoder_class->get_preferred_output_delay = GST_DEBUG_FUNCPTR (gst_nv_vp9_dec_get_preferred_output_delay); - GST_DEBUG_CATEGORY_INIT (gst_nv_vp9_dec_debug, - "nvvp9dec", 0, "NVIDIA VP9 Decoder"); + klass->cuda_device_id = cdata->cuda_device_id; - gst_type_mark_as_plugin_api (GST_TYPE_NV_VP9_DEC, 0); + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); } static void @@ -127,6 +174,22 @@ } static void +gst_nv_vp9_dec_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstNvVp9DecClass *klass = GST_NV_VP9_DEC_GET_CLASS (object); + + switch (prop_id) { + case PROP_CUDA_DEVICE_ID: + g_value_set_uint (value, klass->cuda_device_id); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void gst_nv_vp9_dec_set_context (GstElement * element, GstContext * context) { GstNvVp9Dec *self = GST_NV_VP9_DEC (element); @@ -180,7 +243,6 @@ { GstNvVp9Dec *self = GST_NV_VP9_DEC (decoder); - g_clear_pointer (&self->output_state, gst_video_codec_state_unref); gst_clear_object (&self->decoder); gst_clear_object (&self->context); @@ -195,8 +257,7 @@ GST_DEBUG_OBJECT (self, "negotiate"); - gst_nv_decoder_negotiate (self->decoder, decoder, vp9dec->input_state, - &self->output_state); + gst_nv_decoder_negotiate (self->decoder, decoder, vp9dec->input_state); /* TODO: add support D3D11 memory */ @@ -241,7 +302,7 @@ static GstFlowReturn gst_nv_vp9_dec_new_sequence (GstVp9Decoder * decoder, - const GstVp9FrameHeader * frame_hdr) + const GstVp9FrameHeader * frame_hdr, gint max_dpb_size) { GstNvVp9Dec *self = GST_NV_VP9_DEC (decoder); GstVideoFormat out_format = GST_VIDEO_FORMAT_UNKNOWN; @@ -271,9 +332,7 @@ gst_video_info_set_format (&info, out_format, self->width, self->height); if (!gst_nv_decoder_configure (self->decoder, cudaVideoCodec_VP9, &info, self->width, self->height, - frame_hdr->bit_depth, - /* +4 for render delay */ - NUM_OUTPUT_VIEW + 4)) { + frame_hdr->bit_depth, max_dpb_size, FALSE)) { GST_ERROR_OBJECT (self, "Failed to configure decoder"); return GST_FLOW_NOT_NEGOTIATED; } @@ -514,8 +573,8 @@ goto error; } - if (!gst_nv_decoder_finish_frame (self->decoder, vdec, decoder_frame, - &frame->output_buffer)) { + if (!gst_nv_decoder_finish_frame (self->decoder, vdec, picture->discont_state, + decoder_frame, &frame->output_buffer)) { GST_ERROR_OBJECT (self, "Failed to handle output picture"); goto error; } @@ -543,66 +602,30 @@ return 4; } -typedef struct -{ - GstCaps *sink_caps; - GstCaps *src_caps; - guint cuda_device_id; - gboolean is_default; -} GstNvVp9DecClassData; - -static void -gst_nv_vp9_dec_subclass_init (gpointer klass, GstNvVp9DecClassData * cdata) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstNvVp9DecClass *nvdec_class = (GstNvVp9DecClass *) (klass); - gchar *long_name; - - if (cdata->is_default) { - long_name = g_strdup_printf ("NVDEC VP9 Stateless Decoder"); - } else { - long_name = g_strdup_printf ("NVDEC VP9 Stateless Decoder with device %d", - cdata->cuda_device_id); - } - - gst_element_class_set_metadata (element_class, long_name, - "Codec/Decoder/Video/Hardware", - "NVIDIA VP9 video decoder", "Seungha Yang <seungha@centricular.com>"); - g_free (long_name); - - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); - - nvdec_class->cuda_device_id = cdata->cuda_device_id; - - gst_caps_unref (cdata->sink_caps); - gst_caps_unref (cdata->src_caps); - g_free (cdata); -} - void gst_nv_vp9_dec_register (GstPlugin * plugin, guint device_id, guint rank, GstCaps * sink_caps, GstCaps * src_caps, gboolean is_primary) { - GTypeQuery type_query; - GTypeInfo type_info = { 0, }; - GType subtype; + GType type; gchar *type_name; gchar *feature_name; - GstNvVp9DecClassData *cdata; - gboolean is_default = TRUE; - - /** - * element-nvvp9sldec: - * - * Since: 1.20 - */ - - cdata = g_new0 (GstNvVp9DecClassData, 1); + GstNvDecoderClassData *cdata; + gint index = 0; + GTypeInfo type_info = { + sizeof (GstNvVp9DecClass), + NULL, + NULL, + (GClassInitFunc) gst_nv_vp9_dec_class_init, + NULL, + NULL, + sizeof (GstNvVp9Dec), + 0, + (GInstanceInitFunc) gst_nv_vp9_dec_init, + }; + + GST_DEBUG_CATEGORY_INIT (gst_nv_vp9_dec_debug, "nvvp9dec", 0, "nvvp9dec"); + + cdata = g_new0 (GstNvDecoderClassData, 1); cdata->sink_caps = gst_caps_copy (sink_caps); gst_caps_set_simple (cdata->sink_caps, "alignment", G_TYPE_STRING, "frame", NULL); @@ -611,45 +634,37 @@ cdata->src_caps = gst_caps_ref (src_caps); cdata->cuda_device_id = device_id; - g_type_query (GST_TYPE_NV_VP9_DEC, &type_query); - memset (&type_info, 0, sizeof (type_info)); - type_info.class_size = type_query.class_size; - type_info.instance_size = type_query.instance_size; - type_info.class_init = (GClassInitFunc) gst_nv_vp9_dec_subclass_init; - type_info.class_data = cdata; - if (is_primary) { - type_name = g_strdup ("GstNvVP9StatelessPrimaryDec"); + type_name = g_strdup ("GstNvVp9Dec"); feature_name = g_strdup ("nvvp9dec"); } else { - type_name = g_strdup ("GstNvVP9StatelessDec"); + type_name = g_strdup ("GstNvVp9SLDec"); feature_name = g_strdup ("nvvp9sldec"); } - if (g_type_from_name (type_name) != 0) { + while (g_type_from_name (type_name)) { + index++; g_free (type_name); g_free (feature_name); if (is_primary) { - type_name = - g_strdup_printf ("GstNvVP9StatelessPrimaryDevice%dDec", device_id); - feature_name = g_strdup_printf ("nvvp9device%ddec", device_id); + type_name = g_strdup_printf ("GstNvVp9Device%dDec", index); + feature_name = g_strdup_printf ("nvvp9device%ddec", index); } else { - type_name = g_strdup_printf ("GstNvVP9StatelessDevice%dDec", device_id); - feature_name = g_strdup_printf ("nvvp9sldevice%ddec", device_id); + type_name = g_strdup_printf ("GstNvVp9SLDevice%dDec", index); + feature_name = g_strdup_printf ("nvvp9sldevice%ddec", index); } - - is_default = FALSE; } - cdata->is_default = is_default; - subtype = g_type_register_static (GST_TYPE_NV_VP9_DEC, + type_info.class_data = cdata; + + type = g_type_register_static (GST_TYPE_VP9_DECODER, type_name, &type_info, 0); /* make lower rank than default device */ - if (rank > 0 && !is_default) + if (rank > 0 && index > 0) rank--; - if (!gst_element_register (plugin, feature_name, rank, subtype)) + if (!gst_element_register (plugin, feature_name, rank, type)) GST_WARNING ("Failed to register plugin '%s'", type_name); g_free (type_name);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/gstnvvp9dec.h -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/gstnvvp9dec.h
Changed
@@ -25,16 +25,6 @@ G_BEGIN_DECLS -#define GST_TYPE_NV_VP9_DEC (gst_nv_vp9_dec_get_type()) -#define GST_NV_VP9_DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_NV_VP9_DEC, GstNvVp9Dec)) -#define GST_NV_VP9_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_NV_VP9_DEC, GstNvVp9DecClass)) -#define GST_NV_VP9_DEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_NV_VP9_DEC, GstNvVp9DecClass)) - -typedef struct _GstNvVp9Dec GstNvVp9Dec; -typedef struct _GstNvVp9DecClass GstNvVp9DecClass; - -GType gst_nv_vp9_dec_get_type (void); - void gst_nv_vp9_dec_register (GstPlugin * plugin, guint device_id, guint rank,
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/meson.build
Changed
@@ -1,52 +1,92 @@ nvcodec_sources = - 'plugin.c', - 'gstnvenc.c', + 'gstcudabasetransform.c', + 'gstcudaconverter.c', + 'gstcudaconvertscale.c', + 'gstcudafilter.c', + 'gstcudamemorycopy.c', + 'gstcuvidloader.c', + 'gstnvav1dec.c', 'gstnvbaseenc.c', - 'gstnvh264enc.c', - 'gstnvh265enc.c', - 'gstcudaloader.c', 'gstnvdec.c', - 'gstcuvidloader.c', - 'gstcudacontext.c', - 'gstcudautils.c', 'gstnvdecoder.c', + 'gstnvenc.c', + 'gstnvencoder.cpp', + 'gstnvh264enc.c', + 'gstnvh264encoder.cpp', + 'gstnvh265enc.c', + 'gstnvh265encoder.cpp', 'gstnvh264dec.c', 'gstnvh265dec.c', - 'gstcudamemory.c', - 'gstcudabufferpool.c', - 'gstcudabasetransform.c', - 'gstcudadownload.c', - 'gstcudaupload.c', - 'gstcudanvrtc.c', - 'gstnvrtcloader.c', - 'cuda-converter.c', - 'gstcudafilter.c', - 'gstcudabasefilter.c', - 'gstcudaconvert.c', - 'gstcudascale.c', 'gstnvvp8dec.c', 'gstnvvp9dec.c', + 'plugin.c', + + +nvmm_sources = + 'gstcudanvmm.c', if get_option('nvcodec').disabled() subdir_done() endif -plugin_incdirs = configinc, include_directories('./stub') -extra_c_args = '-DGST_USE_UNSTABLE_API' +if not gstcuda_dep.found() + if get_option('nvcodec').enabled() + error('The nvcodec was enabled explicitly, but required gstcuda dependency is not found') + endif + subdir_done() +endif + +plugin_incdirs = configinc, cuda_stubinc +extra_args = '-DGST_USE_UNSTABLE_API' if gstgl_dep.found() - extra_c_args += '-DHAVE_NVCODEC_GST_GL=1' + extra_args += '-DHAVE_NVCODEC_GST_GL=1' +endif + +if gstd3d11_dep.found() + extra_args += '-DGST_CUDA_HAS_D3D=1', '-DCOBJMACROS' +endif + +if host_system == 'linux' + have_nvmm = false + if cc.has_header('nvbufsurface.h') + have_nvmm = true + elif cc.has_header('/opt/nvidia/deepstream/deepstream/sources/includes/nvbufsurface.h') + # XXX: Should add an option for SDK path?? + have_nvmm = true + plugin_incdirs += include_directories('/opt/nvidia/deepstream/deepstream/sources/includes') + endif + + if have_nvmm + extra_args += '-DHAVE_NVCODEC_NVMM' + nvcodec_sources += nvmm_sources + endif +endif + +if cc.get_id() != 'msvc' + if host_system == 'windows' + # MinGW 32bits compiler seems to be complaining about redundant-decls + # when ComPtr is in use. Let's just disable the warning + extra_args += cc.get_supported_arguments( + '-Wno-redundant-decls', + ) + endif + + # Allow deprecated decls since it's part of SDK header + extra_args += cc.get_supported_arguments( + '-Wno-deprecated-declarations', + ) endif gstnvcodec = library('gstnvcodec', nvcodec_sources, - c_args : gst_plugins_bad_args + extra_c_args, + c_args : gst_plugins_bad_args + extra_args, + cpp_args : gst_plugins_bad_args + extra_args, include_directories : plugin_incdirs, - dependencies : gstbase_dep, gstvideo_dep, gstpbutils_dep, gstgl_dep, gstglproto_dep, gmodule_dep, gstcodecs_dep, + dependencies : gstbase_dep, gstvideo_dep, gstpbutils_dep, gstgl_dep, gstglproto_dep, gmodule_dep, gstcodecs_dep, gstd3d11_dep, gstcuda_dep, install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstnvcodec, install_dir : plugins_pkgconfig_install_dir) plugins += gstnvcodec
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/nvEncodeAPI.h -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/nvEncodeAPI.h
Changed
@@ -1,7 +1,7 @@ /* * This copyright notice applies to this header file only: * - * Copyright (c) 2010-2019 NVIDIA Corporation + * Copyright (c) 2010-2021 NVIDIA Corporation * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -30,7 +30,7 @@ * NVIDIA GPUs - beginning with the Kepler generation - contain a hardware-based encoder * (referred to as NVENC) which provides fully-accelerated hardware-based video encoding. * NvEncodeAPI provides the interface for NVIDIA video encoder (NVENC). - * \date 2011-2019 + * \date 2011-2020 * This file contains the interface constants, structure definitions and function prototypes. */ @@ -73,7 +73,7 @@ #else #define NVENCAPI // ========================================================================================= -#ifndef GUID +#if !defined(GUID) && !defined(GUID_DEFINED) /*! * \struct GUID * Abstracts the GUID structure for non-windows platforms. @@ -110,7 +110,7 @@ typedef void* NV_ENC_REGISTERED_PTR; /**< A Resource that has been registered with NVENCODE API*/ typedef void* NV_ENC_CUSTREAM_PTR; /**< Pointer to CUstream*/ -#define NVENCAPI_MAJOR_VERSION 9 +#define NVENCAPI_MAJOR_VERSION 11 #define NVENCAPI_MINOR_VERSION 1 #define NVENCAPI_VERSION (NVENCAPI_MAJOR_VERSION | (NVENCAPI_MINOR_VERSION << 24)) @@ -125,6 +125,12 @@ #define NV_MAX_SEQ_HDR_LEN (512) +#ifdef __GNUC__ +#define NV_ENC_DEPRECATED __attribute__ ((deprecated("WILL BE REMOVED IN A FUTURE VIDEO CODEC SDK VERSION"))) +#elif defined(_MSC_VER) +#define NV_ENC_DEPRECATED __declspec(deprecated("WILL BE REMOVED IN A FUTURE VIDEO CODEC SDK VERSION")) +#endif + // ========================================================================================= // Encode Codec GUIDS supported by the NvEncodeAPI interface. // ========================================================================================= @@ -167,10 +173,6 @@ static const GUID NV_ENC_H264_PROFILE_STEREO_GUID = { 0x40847bf5, 0x33f7, 0x4601, { 0x90, 0x84, 0xe8, 0xfe, 0x3c, 0x1d, 0xb8, 0xb7 } }; -// {CE788D20-AAA9-4318-92BB-AC7E858C8D36} -static const GUID NV_ENC_H264_PROFILE_SVC_TEMPORAL_SCALABILTY = -{ 0xce788d20, 0xaaa9, 0x4318, { 0x92, 0xbb, 0xac, 0x7e, 0x85, 0x8c, 0x8d, 0x36 } }; - // {B405AFAC-F32B-417B-89C4-9ABEED3E5978} static const GUID NV_ENC_H264_PROFILE_PROGRESSIVE_HIGH_GUID = { 0xb405afac, 0xf32b, 0x417b, { 0x89, 0xc4, 0x9a, 0xbe, 0xed, 0x3e, 0x59, 0x78 } }; @@ -196,41 +198,72 @@ // * Preset GUIDS supported by the NvEncodeAPI interface. // ========================================================================================= // {B2DFB705-4EBD-4C49-9B5F-24A777D3E587} -static const GUID NV_ENC_PRESET_DEFAULT_GUID = +NV_ENC_DEPRECATED static const GUID NV_ENC_PRESET_DEFAULT_GUID = { 0xb2dfb705, 0x4ebd, 0x4c49, { 0x9b, 0x5f, 0x24, 0xa7, 0x77, 0xd3, 0xe5, 0x87 } }; // {60E4C59F-E846-4484-A56D-CD45BE9FDDF6} -static const GUID NV_ENC_PRESET_HP_GUID = +NV_ENC_DEPRECATED static const GUID NV_ENC_PRESET_HP_GUID = { 0x60e4c59f, 0xe846, 0x4484, { 0xa5, 0x6d, 0xcd, 0x45, 0xbe, 0x9f, 0xdd, 0xf6 } }; // {34DBA71D-A77B-4B8F-9C3E-B6D5DA24C012} -static const GUID NV_ENC_PRESET_HQ_GUID = +NV_ENC_DEPRECATED static const GUID NV_ENC_PRESET_HQ_GUID = { 0x34dba71d, 0xa77b, 0x4b8f, { 0x9c, 0x3e, 0xb6, 0xd5, 0xda, 0x24, 0xc0, 0x12 } }; // {82E3E450-BDBB-4e40-989C-82A90DF9EF32} -static const GUID NV_ENC_PRESET_BD_GUID = +NV_ENC_DEPRECATED static const GUID NV_ENC_PRESET_BD_GUID = { 0x82e3e450, 0xbdbb, 0x4e40, { 0x98, 0x9c, 0x82, 0xa9, 0xd, 0xf9, 0xef, 0x32 } }; // {49DF21C5-6DFA-4feb-9787-6ACC9EFFB726} -static const GUID NV_ENC_PRESET_LOW_LATENCY_DEFAULT_GUID = +NV_ENC_DEPRECATED static const GUID NV_ENC_PRESET_LOW_LATENCY_DEFAULT_GUID = { 0x49df21c5, 0x6dfa, 0x4feb, { 0x97, 0x87, 0x6a, 0xcc, 0x9e, 0xff, 0xb7, 0x26 } }; // {C5F733B9-EA97-4cf9-BEC2-BF78A74FD105} -static const GUID NV_ENC_PRESET_LOW_LATENCY_HQ_GUID = +NV_ENC_DEPRECATED static const GUID NV_ENC_PRESET_LOW_LATENCY_HQ_GUID = { 0xc5f733b9, 0xea97, 0x4cf9, { 0xbe, 0xc2, 0xbf, 0x78, 0xa7, 0x4f, 0xd1, 0x5 } }; // {67082A44-4BAD-48FA-98EA-93056D150A58} -static const GUID NV_ENC_PRESET_LOW_LATENCY_HP_GUID = +NV_ENC_DEPRECATED static const GUID NV_ENC_PRESET_LOW_LATENCY_HP_GUID = { 0x67082a44, 0x4bad, 0x48fa, { 0x98, 0xea, 0x93, 0x5, 0x6d, 0x15, 0xa, 0x58 } }; // {D5BFB716-C604-44e7-9BB8-DEA5510FC3AC} -static const GUID NV_ENC_PRESET_LOSSLESS_DEFAULT_GUID = +NV_ENC_DEPRECATED static const GUID NV_ENC_PRESET_LOSSLESS_DEFAULT_GUID = { 0xd5bfb716, 0xc604, 0x44e7, { 0x9b, 0xb8, 0xde, 0xa5, 0x51, 0xf, 0xc3, 0xac } }; // {149998E7-2364-411d-82EF-179888093409} -static const GUID NV_ENC_PRESET_LOSSLESS_HP_GUID = +NV_ENC_DEPRECATED static const GUID NV_ENC_PRESET_LOSSLESS_HP_GUID = { 0x149998e7, 0x2364, 0x411d, { 0x82, 0xef, 0x17, 0x98, 0x88, 0x9, 0x34, 0x9 } }; +// Performance degrades and quality improves as we move from P1 to P7. Presets P3 to P7 for H264 and Presets P2 to P7 for HEVC have B frames enabled by default +// for HIGH_QUALITY and LOSSLESS tuning info, and will not work with Weighted Prediction enabled. In case Weighted Prediction is required, disable B frames by +// setting frameIntervalP = 1 +// {FC0A8D3E-45F8-4CF8-80C7-298871590EBF} +static const GUID NV_ENC_PRESET_P1_GUID = +{ 0xfc0a8d3e, 0x45f8, 0x4cf8, { 0x80, 0xc7, 0x29, 0x88, 0x71, 0x59, 0xe, 0xbf } }; + +// {F581CFB8-88D6-4381-93F0-DF13F9C27DAB} +static const GUID NV_ENC_PRESET_P2_GUID = +{ 0xf581cfb8, 0x88d6, 0x4381, { 0x93, 0xf0, 0xdf, 0x13, 0xf9, 0xc2, 0x7d, 0xab } }; + +// {36850110-3A07-441F-94D5-3670631F91F6} +static const GUID NV_ENC_PRESET_P3_GUID = +{ 0x36850110, 0x3a07, 0x441f, { 0x94, 0xd5, 0x36, 0x70, 0x63, 0x1f, 0x91, 0xf6 } }; + +// {90A7B826-DF06-4862-B9D2-CD6D73A08681} +static const GUID NV_ENC_PRESET_P4_GUID = +{ 0x90a7b826, 0xdf06, 0x4862, { 0xb9, 0xd2, 0xcd, 0x6d, 0x73, 0xa0, 0x86, 0x81 } }; + +// {21C6E6B4-297A-4CBA-998F-B6CBDE72ADE3} +static const GUID NV_ENC_PRESET_P5_GUID = +{ 0x21c6e6b4, 0x297a, 0x4cba, { 0x99, 0x8f, 0xb6, 0xcb, 0xde, 0x72, 0xad, 0xe3 } }; + +// {8E75C279-6299-4AB6-8302-0B215A335CF5} +static const GUID NV_ENC_PRESET_P6_GUID = +{ 0x8e75c279, 0x6299, 0x4ab6, { 0x83, 0x2, 0xb, 0x21, 0x5a, 0x33, 0x5c, 0xf5 } }; + +// {84848C12-6F71-4C13-931B-53E283F57974} +static const GUID NV_ENC_PRESET_P7_GUID = +{ 0x84848c12, 0x6f71, 0x4c13, { 0x93, 0x1b, 0x53, 0xe2, 0x83, 0xf5, 0x79, 0x74 } }; + /** * \addtogroup ENCODER_STRUCTURE NvEncodeAPI Data structures * @{ @@ -254,12 +287,23 @@ NV_ENC_PARAMS_RC_CONSTQP = 0x0, /**< Constant QP mode */ NV_ENC_PARAMS_RC_VBR = 0x1, /**< Variable bitrate mode */ NV_ENC_PARAMS_RC_CBR = 0x2, /**< Constant bitrate mode */ - NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ = 0x8, /**< low-delay CBR, high quality */ - NV_ENC_PARAMS_RC_CBR_HQ = 0x10, /**< CBR, high quality (slower) */ - NV_ENC_PARAMS_RC_VBR_HQ = 0x20 /**< VBR, high quality (slower) */ + NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ = 0x8, /**< Deprecated, use NV_ENC_PARAMS_RC_CBR + NV_ENC_TWO_PASS_QUARTER_RESOLUTION / NV_ENC_TWO_PASS_FULL_RESOLUTION + + lowDelayKeyFrameScale=1 */ + NV_ENC_PARAMS_RC_CBR_HQ = 0x10, /**< Deprecated, use NV_ENC_PARAMS_RC_CBR + NV_ENC_TWO_PASS_QUARTER_RESOLUTION / NV_ENC_TWO_PASS_FULL_RESOLUTION */ + NV_ENC_PARAMS_RC_VBR_HQ = 0x20 /**< Deprecated, use NV_ENC_PARAMS_RC_VBR + NV_ENC_TWO_PASS_QUARTER_RESOLUTION / NV_ENC_TWO_PASS_FULL_RESOLUTION */ } NV_ENC_PARAMS_RC_MODE; /** + * Multi Pass encoding + */ +typedef enum _NV_ENC_MULTI_PASS +{ + NV_ENC_MULTI_PASS_DISABLED = 0x0, /**< Single Pass */ + NV_ENC_TWO_PASS_QUARTER_RESOLUTION = 0x1, /**< Two Pass encoding is enabled where first Pass is quarter resolution */ + NV_ENC_TWO_PASS_FULL_RESOLUTION = 0x2, /**< Two Pass encoding is enabled where first Pass is full resolution */ +} NV_ENC_MULTI_PASS; + +/** * Emphasis Levels */ typedef enum _NV_ENC_EMPHASIS_MAP_LEVEL @@ -278,7 +322,7 @@ typedef enum _NV_ENC_QP_MAP_MODE { NV_ENC_QP_MAP_DISABLED = 0x0, /**< Value in NV_ENC_PIC_PARAMS::qpDeltaMap have no effect. */ - NV_ENC_QP_MAP_EMPHASIS = 0x1, /**< Value in NV_ENC_PIC_PARAMS::qpDeltaMap will be treated as Empasis level. Currently this is only supported for H264 */ + NV_ENC_QP_MAP_EMPHASIS = 0x1, /**< Value in NV_ENC_PIC_PARAMS::qpDeltaMap will be treated as Emphasis level. Currently this is only supported for H264 */ NV_ENC_QP_MAP_DELTA = 0x2, /**< Value in NV_ENC_PIC_PARAMS::qpDeltaMap will be treated as QP delta map. */ NV_ENC_QP_MAP = 0x3, /**< Currently This is not supported. Value in NV_ENC_PIC_PARAMS::qpDeltaMap will be treated as QP value. */ } NV_ENC_QP_MAP_MODE; @@ -320,10 +364,10 @@ */ typedef enum _NV_ENC_MV_PRECISION { - NV_ENC_MV_PRECISION_DEFAULT = 0x0, /**<Driver selects QuarterPel motion vector precision by default*/ - NV_ENC_MV_PRECISION_FULL_PEL = 0x01, /**< FullPel motion vector precision */ - NV_ENC_MV_PRECISION_HALF_PEL = 0x02, /**< HalfPel motion vector precision */ - NV_ENC_MV_PRECISION_QUARTER_PEL = 0x03 /**< QuarterPel motion vector precision */ + NV_ENC_MV_PRECISION_DEFAULT = 0x0, /**< Driver selects Quarter-Pel motion vector precision by default */ + NV_ENC_MV_PRECISION_FULL_PEL = 0x01, /**< Full-Pel motion vector precision */ + NV_ENC_MV_PRECISION_HALF_PEL = 0x02, /**< Half-Pel motion vector precision */ + NV_ENC_MV_PRECISION_QUARTER_PEL = 0x03 /**< Quarter-Pel motion vector precision */ } NV_ENC_MV_PRECISION; @@ -395,7 +439,9 @@ NV_ENC_LEVEL_H264_5 = 50, NV_ENC_LEVEL_H264_51 = 51, NV_ENC_LEVEL_H264_52 = 52, - + NV_ENC_LEVEL_H264_60 = 60, + NV_ENC_LEVEL_H264_61 = 61, + NV_ENC_LEVEL_H264_62 = 62, NV_ENC_LEVEL_HEVC_1 = 30, NV_ENC_LEVEL_HEVC_2 = 60, @@ -632,7 +678,7 @@ } NV_ENC_H264_ENTROPY_CODING_MODE; /** - * H.264 specific Bdirect modes + * H.264 specific BDirect modes */ typedef enum _NV_ENC_H264_BDIRECT_MODE { @@ -649,7 +695,7 @@ { NV_ENC_H264_FMO_AUTOSELECT = 0x0, /**< FMO usage is auto selected by the encoder driver */ NV_ENC_H264_FMO_ENABLE = 0x1, /**< Enable FMO */ - NV_ENC_H264_FMO_DISABLE = 0x2, /**< Disble FMO */ + NV_ENC_H264_FMO_DISABLE = 0x2, /**< Disable FMO */ } NV_ENC_H264_FMO_MODE; /** @@ -766,8 +812,8 @@ /** * Indicates HW capability for Quarter pel motion estimation. - * \n 0 : QuarterPel Motion Estimation not supported. - * \n 1 : QuarterPel Motion Estimation supported. + * \n 0 : Quarter-Pel Motion Estimation not supported. + * \n 1 : Quarter-Pel Motion Estimation supported. */ NV_ENC_CAPS_SUPPORT_QPELMV, @@ -886,21 +932,20 @@ NV_ENC_CAPS_SUPPORT_DYN_RCMODE_CHANGE, /** - * Indicates Subframe readback support for slice-based encoding. + * Indicates Subframe readback support for slice-based encoding. If this feature is supported, it can be enabled by setting enableSubFrameWrite = 1. * \n 0 : Subframe readback not supported. * \n 1 : Subframe readback supported. */ NV_ENC_CAPS_SUPPORT_SUBFRAME_READBACK, - + /** * Indicates Constrained Encoding mode support. * Support added from NvEncodeAPI version 2.0. * \n 0 : Constrained encoding mode not supported. - * \n 1 : Constarined encoding mode supported. - * If this mode is supported client can enable this during initialisation. + * \n 1 : Constrained encoding mode supported. + * If this mode is supported client can enable this during initialization. * Client can then force a picture to be coded as constrained picture where - * each slice in a constrained picture will have constrained_intra_pred_flag set to 1 - * and disable_deblocking_filter_idc will be set to 2 and prediction vectors for inter + * in-loop filtering is disabled across slice boundaries and prediction vectors for inter * macroblocks in each slice will be restricted to the slice region. */ NV_ENC_CAPS_SUPPORT_CONSTRAINED_ENCODING, @@ -914,7 +959,7 @@ NV_ENC_CAPS_SUPPORT_INTRA_REFRESH, /** - * Indicates Custom VBV Bufer Size support. It can be used for capping frame size. + * Indicates Custom VBV Buffer Size support. It can be used for capping frame size. * Support added from NvEncodeAPI version 2.0. * \n 0 : Custom VBV buffer size specification from client, not supported. * \n 1 : Custom VBV buffer size specification from client, supported. @@ -938,7 +983,7 @@ NV_ENC_CAPS_SUPPORT_REF_PIC_INVALIDATION, /** - * Indicates support for PreProcessing. + * Indicates support for Pre-Processing. * The API return value is a bitmask of the values defined in ::NV_ENC_PREPROC_FLAGS */ NV_ENC_CAPS_PREPROC_SUPPORT, @@ -982,7 +1027,7 @@ NV_ENC_CAPS_SUPPORT_SAO, /** - * Indicates HW support for MEOnly Mode. + * Indicates HW support for Motion Estimation Only Mode. * \n 0 : MEOnly Mode not supported. * \n 1 : MEOnly Mode supported for I and P frames. * \n 2 : MEOnly Mode supported for I, P and B frames. @@ -1014,9 +1059,9 @@ NV_ENC_CAPS_NUM_MAX_LTR_FRAMES, /** - * Indicates HW support for Weighted Predicition. - * \n 0 : Weighted Predicition not supported. - * \n 1 : Weighted Predicition supported. + * Indicates HW support for Weighted Prediction. + * \n 0 : Weighted Prediction not supported. + * \n 1 : Weighted Prediction supported. */ NV_ENC_CAPS_SUPPORT_WEIGHTED_PREDICTION, @@ -1028,12 +1073,12 @@ * If the available encoder capacity is returned as zero, applications may choose to switch to software encoding * and continue to call this API (e.g. polling once per second) until capacity becomes available. * - * On baremetal (non-virtualized GPU) and linux platforms, this API always returns 100. + * On bare metal (non-virtualized GPU) and linux platforms, this API always returns 100. */ NV_ENC_CAPS_DYNAMIC_QUERY_ENCODER_CAPACITY, /** - * Indicates B as refererence support. + * Indicates B as reference support. * \n 0 : B as reference is not supported. * \n 1 : each B-Frame as reference is supported. * \n 2 : only Middle B-frame as reference is supported. @@ -1062,6 +1107,23 @@ */ NV_ENC_CAPS_SUPPORT_MULTIPLE_REF_FRAMES, + /** + * Indicates HW support for HEVC with alpha encoding. + * \n 0 : HEVC with alpha encoding not supported. + * \n 1 : HEVC with alpha encoding is supported. + */ + NV_ENC_CAPS_SUPPORT_ALPHA_LAYER_ENCODING, + + /** + * Indicates number of Encoding engines present on GPU. + */ + NV_ENC_CAPS_NUM_ENCODER_ENGINES, + + /** + * Indicates single slice intra refresh support. + */ + NV_ENC_CAPS_SINGLE_SLICE_INTRA_REFRESH, + /** * Reserved - Not to be used by clients. */ @@ -1113,13 +1175,13 @@ typedef struct _NV_ENC_CREATE_INPUT_BUFFER { uint32_t version; /**< in: Struct version. Must be set to ::NV_ENC_CREATE_INPUT_BUFFER_VER */ - uint32_t width; /**< in: Input buffer width */ - uint32_t height; /**< in: Input buffer width */ + uint32_t width; /**< in: Input frame width */ + uint32_t height; /**< in: Input frame height */ NV_ENC_MEMORY_HEAP memoryHeap; /**< in: Deprecated. Do not use */ NV_ENC_BUFFER_FORMAT bufferFmt; /**< in: Input buffer format */ uint32_t reserved; /**< in: Reserved and must be set to 0 */ NV_ENC_INPUT_PTR inputBuffer; /**< out: Pointer to input buffer */ - void* pSysMemBuffer; /**< in: Pointer to existing sysmem buffer */ + void* pSysMemBuffer; /**< in: Pointer to existing system memory buffer */ uint32_t reserved157; /**< in: Reserved and must be set to 0 */ void* reserved263; /**< in: Reserved and must be set to NULL */ } NV_ENC_CREATE_INPUT_BUFFER; @@ -1150,8 +1212,8 @@ */ typedef struct _NV_ENC_MVECTOR { - int16_t mvx; /**< the x component of MV in qpel units */ - int16_t mvy; /**< the y component of MV in qpel units */ + int16_t mvx; /**< the x component of MV in quarter-pel units */ + int16_t mvy; /**< the y component of MV in quarter-pel units */ } NV_ENC_MVECTOR; /** @@ -1205,7 +1267,7 @@ } NV_ENC_QP; /** - * Rate Control Configuration Paramters + * Rate Control Configuration Parameters */ typedef struct _NV_ENC_RC_PARAMS { @@ -1218,7 +1280,7 @@ uint32_t vbvInitialDelay; /**< in: Specifies the VBV(HRD) initial delay in bits. Set 0 to use the default VBV initial delay .*/ uint32_t enableMinQP :1; /**< in: Set this to 1 if minimum QP used for rate control. */ uint32_t enableMaxQP :1; /**< in: Set this to 1 if maximum QP used for rate control. */ - uint32_t enableInitialRCQP :1; /**< in: Set this to 1 if user suppplied initial QP is used for rate control. */ + uint32_t enableInitialRCQP :1; /**< in: Set this to 1 if user supplied initial QP is used for rate control. */ uint32_t enableAQ :1; /**< in: Set this to 1 to enable adaptive quantization (Spatial). */ uint32_t reservedBitField1 :1; /**< in: Reserved bitfields and must be set to 0. */ uint32_t enableLookahead :1; /**< in: Set this to 1 to enable lookahead with depth <lookaheadDepth> (if lookahead is enabled, input frames must remain available to the encoder until encode completion) */ @@ -1228,17 +1290,23 @@ uint32_t zeroReorderDelay :1; /**< in: Set this to 1 to indicate zero latency operation (no reordering delay, num_reorder_frames=0) */ uint32_t enableNonRefP :1; /**< in: Set this to 1 to enable automatic insertion of non-reference P-frames (no effect if enablePTD=0) */ uint32_t strictGOPTarget :1; /**< in: Set this to 1 to minimize GOP-to-GOP rate fluctuations */ - uint32_t aqStrength :4; /**< in: When AQ (Spatial) is enabled (i.e. NV_ENC_RC_PARAMS::enableAQ is set), this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive). If not set, strength is autoselected by driver. */ + uint32_t aqStrength :4; /**< in: When AQ (Spatial) is enabled (i.e. NV_ENC_RC_PARAMS::enableAQ is set), this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive). + If not set, strength is auto selected by driver. */ uint32_t reservedBitFields :16; /**< in: Reserved bitfields and must be set to 0 */ NV_ENC_QP minQP; /**< in: Specifies the minimum QP used for rate control. Client must set NV_ENC_CONFIG::enableMinQP to 1. */ NV_ENC_QP maxQP; /**< in: Specifies the maximum QP used for rate control. Client must set NV_ENC_CONFIG::enableMaxQP to 1. */ NV_ENC_QP initialRCQP; /**< in: Specifies the initial QP used for rate control. Client must set NV_ENC_CONFIG::enableInitialRCQP to 1. */ - uint32_t temporallayerIdxMask; /**< in: Specifies the temporal layers (as a bitmask) whose QPs have changed. Valid max bitmask is 2^NV_ENC_CAPS_NUM_MAX_TEMPORAL_LAYERS - 1 */ - uint8_t temporalLayerQP8; /**< in: Specifies the temporal layer QPs used for rate control. Temporal layer index is used as as the array index */ + uint32_t temporallayerIdxMask; /**< in: Specifies the temporal layers (as a bitmask) whose QPs have changed. Valid max bitmask is 2^NV_ENC_CAPS_NUM_MAX_TEMPORAL_LAYERS - 1. + Applicable only for constant QP mode (NV_ENC_RC_PARAMS::rateControlMode = NV_ENC_PARAMS_RC_CONSTQP). */ + uint8_t temporalLayerQP8; /**< in: Specifies the temporal layer QPs used for rate control. Temporal layer index is used as the array index. + Applicable only for constant QP mode (NV_ENC_RC_PARAMS::rateControlMode = NV_ENC_PARAMS_RC_CONSTQP). */ uint8_t targetQuality; /**< in: Target CQ (Constant Quality) level for VBR mode (range 0-51 with 0-automatic) */ uint8_t targetQualityLSB; /**< in: Fractional part of target quality (as 8.8 fixed point format) */ - uint16_t lookaheadDepth; /**< in: Maximum depth of lookahead with range 0-32 (only used if enableLookahead=1) */ - uint32_t reserved1; + uint16_t lookaheadDepth; /**< in: Maximum depth of lookahead with range 0-(31 - number of B frames). + lookaheadDepth is only used if enableLookahead=1.*/ + uint8_t lowDelayKeyFrameScale; /**< in: Specifies the ratio of I frame bits to P frame bits in case of single frame VBV and CBR rate control mode, + is set to 2 by default for low latency tuning info and 1 by default for ultra low latency tuning info */ + uint8_t reserved13; NV_ENC_QP_MAP_MODE qpMapMode; /**< in: This flag is used to interpret values in array specified by NV_ENC_PIC_PARAMS::qpDeltaMap. Set this to NV_ENC_QP_MAP_EMPHASIS to treat values specified by NV_ENC_PIC_PARAMS::qpDeltaMap as Emphasis Level Map. Emphasis Level can be assigned any value specified in enum NV_ENC_EMPHASIS_MAP_LEVEL. @@ -1251,14 +1319,20 @@ This feature is not supported when AQ( Spatial/Temporal) is enabled. This feature is only supported for H264 codec currently. - Set this to NV_ENC_QP_MAP_DELTA to treat values specified by NV_ENC_PIC_PARAMS::qpDeltaMap as QPDelta. This specifies QP modifier to be applied on top of the QP chosen by rate control + Set this to NV_ENC_QP_MAP_DELTA to treat values specified by NV_ENC_PIC_PARAMS::qpDeltaMap as QP Delta. This specifies QP modifier to be applied on top of the QP chosen by rate control Set this to NV_ENC_QP_MAP_DISABLED to ignore NV_ENC_PIC_PARAMS::qpDeltaMap values. In this case, qpDeltaMap should be set to NULL. Other values are reserved for future use.*/ - uint32_t reserved7; + NV_ENC_MULTI_PASS multiPass; /**< in: This flag is used to enable multi-pass encoding for a given ::NV_ENC_PARAMS_RC_MODE. This flag is not valid for H264 and HEVC MEOnly mode */ + uint32_t alphaLayerBitrateRatio; /**< in: Specifies the ratio in which bitrate should be split between base and alpha layer. A value 'x' for this field will split the target bitrate in a ratio of x : 1 between base and alpha layer. + The default split ratio is 15.*/ + int8_t cbQPIndexOffset; /**< in: Specifies the value of 'chroma_qp_index_offset' in H264 / 'pps_cb_qp_offset' in HEVC.*/ + int8_t crQPIndexOffset; /**< in: Specifies the value of 'second_chroma_qp_index_offset' in H264 / 'pps_cr_qp_offset' in HEVC.*/ + uint16_t reserved2; + uint32_t reserved4; } NV_ENC_RC_PARAMS; - + /** macro for constructing the version field of ::_NV_ENC_RC_PARAMS */ #define NV_ENC_RC_PARAMS_VER NVENCAPI_STRUCT_VERSION(1) @@ -1295,10 +1369,10 @@ */ typedef struct _NVENC_EXTERNAL_ME_HINT_COUNTS_PER_BLOCKTYPE { - uint32_t numCandsPerBlk16x16 : 4; /**< in: Supported for H264,HEVC.It Specifies the number of candidates per 16x16 block. */ - uint32_t numCandsPerBlk16x8 : 4; /**< in: Supported for H264 only.Specifies the number of candidates per 16x8 block. */ - uint32_t numCandsPerBlk8x16 : 4; /**< in: Supported for H264 only.Specifies the number of candidates per 8x16 block. */ - uint32_t numCandsPerBlk8x8 : 4; /**< in: Supported for H264,HEVC.Specifies the number of candidates per 8x8 block. */ + uint32_t numCandsPerBlk16x16 : 4; /**< in: Supported for H264, HEVC. It Specifies the number of candidates per 16x16 block. */ + uint32_t numCandsPerBlk16x8 : 4; /**< in: Supported for H264 only. Specifies the number of candidates per 16x8 block. */ + uint32_t numCandsPerBlk8x16 : 4; /**< in: Supported for H264 only. Specifies the number of candidates per 8x16 block. */ + uint32_t numCandsPerBlk8x8 : 4; /**< in: Supported for H264, HEVC. Specifies the number of candidates per 8x8 block. */ uint32_t reserved : 16; /**< in: Reserved for padding. */ uint32_t reserved13; /**< in: Reserved for future use. */ } NVENC_EXTERNAL_ME_HINT_COUNTS_PER_BLOCKTYPE; @@ -1306,7 +1380,7 @@ /** * \struct _NVENC_EXTERNAL_ME_HINT - * External Motion Vector hint structure. + * External Motion Vector hint structure for H264 and HEVC. */ typedef struct _NVENC_EXTERNAL_ME_HINT { @@ -1326,22 +1400,24 @@ */ typedef struct _NV_ENC_CONFIG_H264 { - uint32_t reserved :1; /**< in: Reserved and must be set to 0 */ + uint32_t enableTemporalSVC :1; /**< in: Set to 1 to enable SVC temporal*/ uint32_t enableStereoMVC :1; /**< in: Set to 1 to enable stereo MVC*/ - uint32_t hierarchicalPFrames :1; /**< in: Set to 1 to enable hierarchical PFrames */ - uint32_t hierarchicalBFrames :1; /**< in: Set to 1 to enable hierarchical BFrames */ + uint32_t hierarchicalPFrames :1; /**< in: Set to 1 to enable hierarchical P Frames */ + uint32_t hierarchicalBFrames :1; /**< in: Set to 1 to enable hierarchical B Frames */ uint32_t outputBufferingPeriodSEI :1; /**< in: Set to 1 to write SEI buffering period syntax in the bitstream */ uint32_t outputPictureTimingSEI :1; /**< in: Set to 1 to write SEI picture timing syntax in the bitstream. When set for following rateControlMode : NV_ENC_PARAMS_RC_CBR, NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ, - NV_ENC_PARAMS_RC_CBR_HQ, filler data is inserted if needed to achieve hrd bitrate */ + NV_ENC_PARAMS_RC_CBR_HQ, filler data is inserted if needed to achieve HRD bitrate */ uint32_t outputAUD :1; /**< in: Set to 1 to write access unit delimiter syntax in bitstream */ uint32_t disableSPSPPS :1; /**< in: Set to 1 to disable writing of Sequence and Picture parameter info in bitstream */ uint32_t outputFramePackingSEI :1; /**< in: Set to 1 to enable writing of frame packing arrangement SEI messages to bitstream */ uint32_t outputRecoveryPointSEI :1; /**< in: Set to 1 to enable writing of recovery point SEI message */ uint32_t enableIntraRefresh :1; /**< in: Set to 1 to enable gradual decoder refresh or intra refresh. If the GOP structure uses B frames this will be ignored */ - uint32_t enableConstrainedEncoding :1; /**< in: Set this to 1 to enable constrainedFrame encoding where each slice in the constarined picture is independent of other slices + uint32_t enableConstrainedEncoding :1; /**< in: Set this to 1 to enable constrainedFrame encoding where each slice in the constrained picture is independent of other slices. + Constrained encoding works only with rectangular slices. Check support for constrained encoding using ::NV_ENC_CAPS_SUPPORT_CONSTRAINED_ENCODING caps. */ uint32_t repeatSPSPPS :1; /**< in: Set to 1 to enable writing of Sequence and Picture parameter for every IDR frame */ - uint32_t enableVFR :1; /**< in: Set to 1 to enable variable frame rate. */ + uint32_t enableVFR :1; /**< in: Setting enableVFR=1 currently only sets the fixed_frame_rate_flag=0 in the VUI but otherwise + has no impact on the encoder behavior. For more details please refer to E.1 VUI syntax of H.264 standard. Note, however, that NVENC does not support VFR encoding and rate control. */ uint32_t enableLTR :1; /**< in: Set to 1 to enable LTR (Long Term Reference) frame support. LTR can be used in two modes: "LTR Trust" mode and "LTR Per Picture" mode. LTR Trust mode: In this mode, ltrNumFrames pictures after IDR are automatically marked as LTR. This mode is enabled by setting ltrTrustMode = 1. Use of LTR Trust mode is strongly discouraged as this mode may be deprecated in future. @@ -1362,23 +1438,34 @@ NV_ENC_INITIALIZE_PARAMS::enableOutputInVidmem is also set is currently not supported and will make ::NvEncInitializeEncoder() return an error. */ - uint32_t reservedBitFields :14; /**< in: Reserved bitfields and must be set to 0 */ + uint32_t disableSVCPrefixNalu :1; /**< in: Set to 1 to disable writing of SVC Prefix NALU preceding each slice in bitstream. + Applicable only when temporal SVC is enabled (NV_ENC_CONFIG_H264::enableTemporalSVC = 1). */ + uint32_t enableScalabilityInfoSEI :1; /**< in: Set to 1 to enable writing of Scalability Information SEI message preceding each IDR picture in bitstream + Applicable only when temporal SVC is enabled (NV_ENC_CONFIG_H264::enableTemporalSVC = 1). */ + uint32_t singleSliceIntraRefresh : 1; /**< in: Set to 1 to maintain single slice in frames during intra refresh. + Check support for single slice intra refresh using ::NV_ENC_CAPS_SINGLE_SLICE_INTRA_REFRESH caps. + This flag will be ignored if the value returned for ::NV_ENC_CAPS_SINGLE_SLICE_INTRA_REFRESH caps is false. */ + uint32_t reservedBitFields : 11; /**< in: Reserved bitfields and must be set to 0 */ uint32_t level; /**< in: Specifies the encoding level. Client is recommended to set this to NV_ENC_LEVEL_AUTOSELECT in order to enable the NvEncodeAPI interface to select the correct level. */ uint32_t idrPeriod; /**< in: Specifies the IDR interval. If not set, this is made equal to gopLength in NV_ENC_CONFIG.Low latency application client can set IDR interval to NVENC_INFINITE_GOPLENGTH so that IDR frames are not inserted automatically. */ uint32_t separateColourPlaneFlag; /**< in: Set to 1 to enable 4:4:4 separate colour planes */ - uint32_t disableDeblockingFilterIDC; /**< in: Specifies the deblocking filter mode. Permissible value range: 0,2 */ - uint32_t numTemporalLayers; /**< in: Specifies max temporal layers to be used for hierarchical coding. Valid value range is 1,::NV_ENC_CAPS_NUM_MAX_TEMPORAL_LAYERS */ + uint32_t disableDeblockingFilterIDC; /**< in: Specifies the deblocking filter mode. Permissible value range: 0,2. This flag corresponds + to the flag disable_deblocking_filter_idc specified in section 7.4.3 of H.264 specification, + which specifies whether the operation of the deblocking filter shall be disabled across some + block edges of the slice and specifies for which edges the filtering is disabled. See section + 7.4.3 of H.264 specification for more details.*/ + uint32_t numTemporalLayers; /**< in: Specifies number of temporal layers to be used for hierarchical coding / temporal SVC. Valid value range is 1,::NV_ENC_CAPS_NUM_MAX_TEMPORAL_LAYERS */ uint32_t spsId; /**< in: Specifies the SPS id of the sequence header */ uint32_t ppsId; /**< in: Specifies the PPS id of the picture header */ NV_ENC_H264_ADAPTIVE_TRANSFORM_MODE adaptiveTransformMode; /**< in: Specifies the AdaptiveTransform Mode. Check support for AdaptiveTransform mode using ::NV_ENC_CAPS_SUPPORT_ADAPTIVE_TRANSFORM caps. */ NV_ENC_H264_FMO_MODE fmoMode; /**< in: Specified the FMO Mode. Check support for FMO using ::NV_ENC_CAPS_SUPPORT_FMO caps. */ NV_ENC_H264_BDIRECT_MODE bdirectMode; /**< in: Specifies the BDirect mode. Check support for BDirect mode using ::NV_ENC_CAPS_SUPPORT_BDIRECT_MODE caps.*/ NV_ENC_H264_ENTROPY_CODING_MODE entropyCodingMode; /**< in: Specifies the entropy coding mode. Check support for CABAC mode using ::NV_ENC_CAPS_SUPPORT_CABAC caps. */ - NV_ENC_STEREO_PACKING_MODE stereoMode; /**< in: Specifies the stereo frame packing mode which is to be signalled in frame packing arrangement SEI */ + NV_ENC_STEREO_PACKING_MODE stereoMode; /**< in: Specifies the stereo frame packing mode which is to be signaled in frame packing arrangement SEI */ uint32_t intraRefreshPeriod; /**< in: Specifies the interval between successive intra refresh if enableIntrarefresh is set. Requires enableIntraRefresh to be set. Will be disabled if NV_ENC_CONFIG::gopLength is not set to NVENC_INFINITE_GOPLENGTH. */ uint32_t intraRefreshCnt; /**< in: Specifies the length of intra refresh in number of frames for periodic intra refresh. This value should be smaller than intraRefreshPeriod */ - uint32_t maxNumRefFrames; /**< in: Specifies the DPB size used for encoding. Setting it to 0 will let driver use the default dpb size. + uint32_t maxNumRefFrames; /**< in: Specifies the DPB size used for encoding. Setting it to 0 will let driver use the default DPB size. The low latency application which wants to invalidate reference frame as an error resilience tool is recommended to use a large DPB size so that the encoder can keep old reference frames which can be used if recent frames are invalidated. */ @@ -1391,7 +1478,7 @@ sliceMode = 1, sliceModeData specifies maximum # of bytes in each slice (except last slice) sliceMode = 2, sliceModeData specifies # of MB rows in each slice (except last slice) sliceMode = 3, sliceModeData specifies number of slices in the picture. Driver will divide picture into slices optimally */ - NV_ENC_CONFIG_H264_VUI_PARAMETERS h264VUIParameters; /**< in: Specifies the H264 video usability info pamameters */ + NV_ENC_CONFIG_H264_VUI_PARAMETERS h264VUIParameters; /**< in: Specifies the H264 video usability info parameters */ uint32_t ltrNumFrames; /**< in: Specifies the number of LTR frames. This parameter has different meaning in two LTR modes. In "LTR Trust" mode (ltrTrustMode = 1), encoder will mark the first ltrNumFrames base layer reference frames within each IDR interval as LTR. In "LTR Per Picture" mode (ltrTrustMode = 0 and ltrMarkFrame = 1), ltrNumFrames specifies maximum number of LTR frames in DPB. */ @@ -1401,7 +1488,9 @@ Set to 0 when using "LTR Per Picture" mode of LTR operation. */ uint32_t chromaFormatIDC; /**< in: Specifies the chroma format. Should be set to 1 for yuv420 input, 3 for yuv444 input. Check support for YUV444 encoding using ::NV_ENC_CAPS_SUPPORT_YUV444_ENCODE caps.*/ - uint32_t maxTemporalLayers; /**< in: Specifies the max temporal layer used for hierarchical coding. */ + uint32_t maxTemporalLayers; /**< in: Specifies the maximum temporal layer used for temporal SVC / hierarchical coding. + Defaut value of this field is NV_ENC_CAPS::NV_ENC_CAPS_NUM_MAX_TEMPORAL_LAYERS. Note that the value NV_ENC_CONFIG_H264::maxNumRefFrames should + be greater than or equal to (NV_ENC_CONFIG_H264::maxTemporalLayers - 2) * 2, for NV_ENC_CONFIG_H264::maxTemporalLayers >= 2.*/ NV_ENC_BFRAME_REF_MODE useBFramesAsRef; /**< in: Specifies the B-Frame as reference mode. Check support for useBFramesAsRef mode using ::NV_ENC_CAPS_SUPPORT_BFRAME_REF_MODE caps.*/ NV_ENC_NUM_REF_FRAMES numRefL0; /**< in: Specifies max number of reference frames in reference picture list L0, that can be used by hardware for prediction of a frame. Check support for numRefL0 using ::NV_ENC_CAPS_SUPPORT_MULTIPLE_REF_FRAMES caps. */ @@ -1433,7 +1522,7 @@ ltrTrustMode = 0 and ltrMarkFrame = 1 for the picture to be marked as LTR. This is the preferred mode for using LTR. Note that LTRs are not supported if encoding session is configured with B-frames */ - uint32_t disableSPSPPS :1; /**< in: Set 1 to disable VPS,SPS and PPS signalling in the bitstream. */ + uint32_t disableSPSPPS :1; /**< in: Set 1 to disable VPS, SPS and PPS signaling in the bitstream. */ uint32_t repeatSPSPPS :1; /**< in: Set 1 to output VPS,SPS and PPS for every IDR frame.*/ uint32_t enableIntraRefresh :1; /**< in: Set 1 to enable gradual decoder refresh or intra refresh. If the GOP structure uses B frames this will be ignored */ uint32_t chromaFormatIDC :2; /**< in: Specifies the chroma format. Should be set to 1 for yuv420 input, 3 for yuv444 input.*/ @@ -1448,8 +1537,15 @@ NV_ENC_INITIALIZE_PARAMS::enableOutputInVidmem is also set is currently not supported and will make ::NvEncInitializeEncoder() return an error. */ - uint32_t reserved :17; /**< in: Reserved bitfields.*/ - uint32_t idrPeriod; /**< in: Specifies the IDR interval. If not set, this is made equal to gopLength in NV_ENC_CONFIG.Low latency application client can set IDR interval to NVENC_INFINITE_GOPLENGTH so that IDR frames are not inserted automatically. */ + uint32_t enableConstrainedEncoding :1; /**< in: Set this to 1 to enable constrainedFrame encoding where each slice in the constrained picture is independent of other slices. + Constrained encoding works only with rectangular slices. + Check support for constrained encoding using ::NV_ENC_CAPS_SUPPORT_CONSTRAINED_ENCODING caps. */ + uint32_t enableAlphaLayerEncoding :1; /**< in: Set this to 1 to enable HEVC encode with alpha layer. */ + uint32_t singleSliceIntraRefresh : 1; /**< in: Set this to 1 to maintain single slice frames during intra refresh. + Check support for single slice intra refresh using ::NV_ENC_CAPS_SINGLE_SLICE_INTRA_REFRESH caps. + This flag will be ignored if the value returned for ::NV_ENC_CAPS_SINGLE_SLICE_INTRA_REFRESH caps is false. */ + uint32_t reserved : 14; /**< in: Reserved bitfields.*/ + uint32_t idrPeriod; /**< in: Specifies the IDR interval. If not set, this is made equal to gopLength in NV_ENC_CONFIG. Low latency application client can set IDR interval to NVENC_INFINITE_GOPLENGTH so that IDR frames are not inserted automatically. */ uint32_t intraRefreshPeriod; /**< in: Specifies the interval between successive intra refresh if enableIntrarefresh is set. Requires enableIntraRefresh to be set. Will be disabled if NV_ENC_CONFIG::gopLength is not set to NVENC_INFINITE_GOPLENGTH. */ uint32_t intraRefreshCnt; /**< in: Specifies the length of intra refresh in number of frames for periodic intra refresh. This value should be smaller than intraRefreshPeriod */ @@ -1469,7 +1565,7 @@ sliceMode = 2, sliceModeData specifies # of CTU rows in each slice (except last slice) sliceMode = 3, sliceModeData specifies number of slices in the picture. Driver will divide picture into slices optimally */ uint32_t maxTemporalLayersMinus1; /**< in: Specifies the max temporal layer used for hierarchical coding. */ - NV_ENC_CONFIG_HEVC_VUI_PARAMETERS hevcVUIParameters; /**< in: Specifies the HEVC video usability info pamameters */ + NV_ENC_CONFIG_HEVC_VUI_PARAMETERS hevcVUIParameters; /**< in: Specifies the HEVC video usability info parameters */ uint32_t ltrTrustMode; /**< in: Specifies the LTR operating mode. See comments near NV_ENC_CONFIG_HEVC::enableLTR for description of the two modes. Set to 1 to use "LTR Trust" mode of LTR operation. Clients are discouraged to use "LTR Trust" mode as this mode may be deprecated in future releases. @@ -1490,11 +1586,11 @@ */ typedef struct _NV_ENC_CONFIG_H264_MEONLY { - uint32_t disablePartition16x16 :1; /**< in: Disable MotionEstimation on 16x16 blocks*/ - uint32_t disablePartition8x16 :1; /**< in: Disable MotionEstimation on 8x16 blocks*/ - uint32_t disablePartition16x8 :1; /**< in: Disable MotionEstimation on 16x8 blocks*/ - uint32_t disablePartition8x8 :1; /**< in: Disable MotionEstimation on 8x8 blocks*/ - uint32_t disableIntraSearch :1; /**< in: Disable Intra search during MotionEstimation*/ + uint32_t disablePartition16x16 :1; /**< in: Disable Motion Estimation on 16x16 blocks*/ + uint32_t disablePartition8x16 :1; /**< in: Disable Motion Estimation on 8x16 blocks*/ + uint32_t disablePartition16x8 :1; /**< in: Disable Motion Estimation on 16x8 blocks*/ + uint32_t disablePartition8x8 :1; /**< in: Disable Motion Estimation on 8x8 blocks*/ + uint32_t disableIntraSearch :1; /**< in: Disable Intra search during Motion Estimation*/ uint32_t bStereoEnable :1; /**< in: Enable Stereo Mode for Motion Estimation where each view is independently executed*/ uint32_t reserved :26; /**< in: Reserved and must be set to 0 */ uint32_t reserved1 255; /**< in: Reserved and must be set to 0 */ @@ -1534,7 +1630,7 @@ typedef struct _NV_ENC_CONFIG { uint32_t version; /**< in: Struct version. Must be set to ::NV_ENC_CONFIG_VER. */ - GUID profileGUID; /**< in: Specifies the codec profile guid. If client specifies \p NV_ENC_CODEC_PROFILE_AUTOSELECT_GUID the NvEncodeAPI interface will select the appropriate codec profile. */ + GUID profileGUID; /**< in: Specifies the codec profile GUID. If client specifies \p NV_ENC_CODEC_PROFILE_AUTOSELECT_GUID the NvEncodeAPI interface will select the appropriate codec profile. */ uint32_t gopLength; /**< in: Specifies the number of pictures in one GOP. Low latency application client can set goplength to NVENC_INFINITE_GOPLENGTH so that keyframes are not inserted automatically. */ int32_t frameIntervalP; /**< in: Specifies the GOP pattern as follows: \p frameIntervalP = 0: I, 1: IPP, 2: IBP, 3: IBBP If goplength is set to NVENC_INFINITE_GOPLENGTH \p frameIntervalP should be set to 1. */ uint32_t monoChromeEncoding; /**< in: Set this to 1 to enable monochrome encoding for this session. */ @@ -1551,6 +1647,18 @@ /** macro for constructing the version field of ::_NV_ENC_CONFIG */ #define NV_ENC_CONFIG_VER (NVENCAPI_STRUCT_VERSION(7) | ( 1<<31 )) +/** + * Tuning information of NVENC encoding (TuningInfo is not applicable to H264 and HEVC MEOnly mode). + */ +typedef enum NV_ENC_TUNING_INFO +{ + NV_ENC_TUNING_INFO_UNDEFINED = 0, /**< Undefined tuningInfo. Invalid value for encoding. */ + NV_ENC_TUNING_INFO_HIGH_QUALITY = 1, /**< Tune presets for latency tolerant encoding.*/ + NV_ENC_TUNING_INFO_LOW_LATENCY = 2, /**< Tune presets for low latency streaming.*/ + NV_ENC_TUNING_INFO_ULTRA_LOW_LATENCY = 3, /**< Tune presets for ultra low latency streaming.*/ + NV_ENC_TUNING_INFO_LOSSLESS = 4, /**< Tune presets for lossless encoding.*/ + NV_ENC_TUNING_INFO_COUNT /**< Count number of tuningInfos. Invalid value. */ +}NV_ENC_TUNING_INFO; /** * \struct _NV_ENC_INITIALIZE_PARAMS @@ -1570,11 +1678,15 @@ uint32_t enableEncodeAsync; /**< in: Set this to 1 to enable asynchronous mode and is expected to use events to get picture completion notification. */ uint32_t enablePTD; /**< in: Set this to 1 to enable the Picture Type Decision is be taken by the NvEncodeAPI interface. */ uint32_t reportSliceOffsets :1; /**< in: Set this to 1 to enable reporting slice offsets in ::_NV_ENC_LOCK_BITSTREAM. NV_ENC_INITIALIZE_PARAMS::enableEncodeAsync must be set to 0 to use this feature. Client must set this to 0 if NV_ENC_CONFIG_H264::sliceMode is 1 on Kepler GPUs */ - uint32_t enableSubFrameWrite :1; /**< in: Set this to 1 to write out available bitstream to memory at subframe intervals */ + uint32_t enableSubFrameWrite :1; /**< in: Set this to 1 to write out available bitstream to memory at subframe intervals. + If enableSubFrameWrite = 1, then the hardware encoder returns data as soon as a slice has completed encoding. + This results in better encoding latency, but the downside is that the application has to keep polling via a call to nvEncLockBitstream API continuously to see if any encoded slice data is available. + Use this mode if you feel that the marginal reduction in latency from sub-frame encoding is worth the increase in complexity due to CPU-based polling. */ uint32_t enableExternalMEHints :1; /**< in: Set to 1 to enable external ME hints for the current frame. For NV_ENC_INITIALIZE_PARAMS::enablePTD=1 with B frames, programming L1 hints is optional for B frames since Client doesn't know internal GOP structure. NV_ENC_PIC_PARAMS::meHintRefPicDist should preferably be set with enablePTD=1. */ uint32_t enableMEOnlyMode :1; /**< in: Set to 1 to enable ME Only Mode .*/ - uint32_t enableWeightedPrediction :1; /**< in: Set this to 1 to enable weighted prediction. Not supported if encode session is configured for B-Frames( 'frameIntervalP' in NV_ENC_CONFIG is greater than 1).*/ + uint32_t enableWeightedPrediction :1; /**< in: Set this to 1 to enable weighted prediction. Not supported if encode session is configured for B-Frames (i.e. NV_ENC_CONFIG::frameIntervalP > 1 or preset >=P3 when tuningInfo = ::NV_ENC_TUNING_INFO_HIGH_QUALITY or + tuningInfo = ::NV_ENC_TUNING_INFO_LOSSLESS. This is because preset >=p3 internally enables B frames when tuningInfo = ::NV_ENC_TUNING_INFO_HIGH_QUALITY or ::NV_ENC_TUNING_INFO_LOSSLESS). */ uint32_t enableOutputInVidmem :1; /**< in: Set this to 1 to enable output of NVENC in video memory buffer created by application. This feature is not supported for HEVC ME only mode. */ uint32_t reservedBitFields :26; /**< in: Reserved bitfields and must be set to 0 */ uint32_t privDataSize; /**< in: Reserved private data buffer size and must be set to 0 */ @@ -1589,7 +1701,9 @@ NVENC_EXTERNAL_ME_HINT_COUNTS_PER_BLOCKTYPE maxMEHintCountsPerBlock2; /**< in: If Client wants to pass external motion vectors in NV_ENC_PIC_PARAMS::meExternalHints buffer it must specify the maximum number of hint candidates per block per direction for the encode session. The NV_ENC_INITIALIZE_PARAMS::maxMEHintCountsPerBlock0 is for L0 predictors and NV_ENC_INITIALIZE_PARAMS::maxMEHintCountsPerBlock1 is for L1 predictors. This client must also set NV_ENC_INITIALIZE_PARAMS::enableExternalMEHints to 1. */ - uint32_t reserved 289; /**< in: Reserved and must be set to 0 */ + NV_ENC_TUNING_INFO tuningInfo; /**< in: Tuning Info of NVENC encoding(TuningInfo is not applicable to H264 and HEVC meonly mode). */ + NV_ENC_BUFFER_FORMAT bufferFormat; /**< in: Specifies input buffer format. Client should set input buffer format only when D3D12 interface type is used. */ + uint32_t reserved287; /**< in: Reserved and must be set to 0 */ void* reserved264; /**< in: Reserved and must be set to NULL */ } NV_ENC_INITIALIZE_PARAMS; @@ -1721,9 +1835,9 @@ sliceMode = 2, sliceModeData specifies # of MB rows in each slice (except last slice) sliceMode = 3, sliceModeData specifies number of slices in the picture. Driver will divide picture into slices optimally */ uint32_t ltrMarkFrameIdx; /**< in: Specifies the long term referenceframe index to use for marking this frame as LTR.*/ - uint32_t ltrUseFrameBitmap; /**< in: Specifies the the associated bitmap of LTR frame indices to use when encoding this frame. */ + uint32_t ltrUseFrameBitmap; /**< in: Specifies the associated bitmap of LTR frame indices to use when encoding this frame. */ uint32_t ltrUsageMode; /**< in: Not supported. Reserved for future use and must be set to 0. */ - uint32_t forceIntraSliceCount; /**< in: Specfies the number of slices to be forced to Intra in the current picture. + uint32_t forceIntraSliceCount; /**< in: Specifies the number of slices to be forced to Intra in the current picture. This option along with forceIntraSliceIdx array needs to be used with sliceMode = 3 only */ uint32_t *forceIntraSliceIdx; /**< in: Slice indices to be forced to intra in the current picture. Each slice index should be <= num_slices_in_picture -1. Index starts from 0 for first slice. The number of entries in this array should be equal to forceIntraSliceCount */ @@ -1792,12 +1906,14 @@ typedef struct _NV_ENC_PIC_PARAMS { uint32_t version; /**< in: Struct version. Must be set to ::NV_ENC_PIC_PARAMS_VER. */ - uint32_t inputWidth; /**< in: Specifies the input buffer width */ - uint32_t inputHeight; /**< in: Specifies the input buffer height */ + uint32_t inputWidth; /**< in: Specifies the input frame width */ + uint32_t inputHeight; /**< in: Specifies the input frame height */ uint32_t inputPitch; /**< in: Specifies the input buffer pitch. If pitch value is not known, set this to inputWidth. */ - uint32_t encodePicFlags; /**< in: Specifies bit-wise OR`ed encode pic flags. See ::NV_ENC_PIC_FLAGS enum. */ + uint32_t encodePicFlags; /**< in: Specifies bit-wise OR of encode picture flags. See ::NV_ENC_PIC_FLAGS enum. */ uint32_t frameIdx; /**< in: Specifies the frame index associated with the input frame optional. */ - uint64_t inputTimeStamp; /**< in: Specifies presentation timestamp associated with the input picture. */ + uint64_t inputTimeStamp; /**< in: Specifies opaque data which is associated with the encoded frame, but not actually encoded in the output bitstream. + This opaque data can be used later to uniquely refer to the corresponding encoded frame. For example, it can be used + for identifying the frame to be invalidated in the reference picture buffer, if lost at the client. */ uint64_t inputDuration; /**< in: Specifies duration of the input picture */ NV_ENC_INPUT_PTR inputBuffer; /**< in: Specifies the input buffer pointer. Client must use a pointer obtained from ::NvEncCreateInputBuffer() or ::NvEncMapInputResource() APIs.*/ NV_ENC_OUTPUT_PTR outputBitstream; /**< in: Specifies the output buffer pointer. @@ -1808,29 +1924,31 @@ NV_ENC_ENCODE_OUT_PARAMS struct and twice the input frame size for lower resolution eg. CIF and 1.5 times the input frame size for higher resolutions. If encoded bitstream size is greater than the allocated buffer size for encoded bitstream, then the output buffer will have encoded bitstream data equal to buffer size. All CUDA operations on this buffer must use the default stream. */ - void* completionEvent; /**< in: Specifies an event to be signalled on completion of encoding of this Frame only if operating in Asynchronous mode. Each output buffer should be associated with a distinct event pointer. */ + void* completionEvent; /**< in: Specifies an event to be signaled on completion of encoding of this Frame only if operating in Asynchronous mode. Each output buffer should be associated with a distinct event pointer. */ NV_ENC_BUFFER_FORMAT bufferFmt; /**< in: Specifies the input buffer format. */ NV_ENC_PIC_STRUCT pictureStruct; /**< in: Specifies structure of the input picture. */ NV_ENC_PIC_TYPE pictureType; /**< in: Specifies input picture type. Client required to be set explicitly by the client if the client has not set NV_ENC_INITALIZE_PARAMS::enablePTD to 1 while calling NvInitializeEncoder. */ NV_ENC_CODEC_PIC_PARAMS codecPicParams; /**< in: Specifies the codec specific per-picture encoding parameters. */ - NVENC_EXTERNAL_ME_HINT_COUNTS_PER_BLOCKTYPE meHintCountsPerBlock2; /**< in: Specifies the number of hint candidates per block per direction for the current frame. meHintCountsPerBlock0 is for L0 predictors and meHintCountsPerBlock1 is for L1 predictors. - The candidate count in NV_ENC_PIC_PARAMS::meHintCountsPerBlocklx must never exceed NV_ENC_INITIALIZE_PARAMS::maxMEHintCountsPerBlocklx provided during encoder intialization. */ - NVENC_EXTERNAL_ME_HINT *meExternalHints; /**< in: Specifies the pointer to ME external hints for the current frame. The size of ME hint buffer should be equal to number of macroblocks * the total number of candidates per macroblock. + NVENC_EXTERNAL_ME_HINT_COUNTS_PER_BLOCKTYPE meHintCountsPerBlock2; /**< in: For H264 and Hevc, specifies the number of hint candidates per block per direction for the current frame. meHintCountsPerBlock0 is for L0 predictors and meHintCountsPerBlock1 is for L1 predictors. + The candidate count in NV_ENC_PIC_PARAMS::meHintCountsPerBlocklx must never exceed NV_ENC_INITIALIZE_PARAMS::maxMEHintCountsPerBlocklx provided during encoder initialization. */ + NVENC_EXTERNAL_ME_HINT* meExternalHints; /**< in: For H264 and Hevc, Specifies the pointer to ME external hints for the current frame. The size of ME hint buffer should be equal to number of macroblocks * the total number of candidates per macroblock. The total number of candidates per MB per direction = 1*meHintCountsPerBlockLx.numCandsPerBlk16x16 + 2*meHintCountsPerBlockLx.numCandsPerBlk16x8 + 2*meHintCountsPerBlockLx.numCandsPerBlk8x8 + 4*meHintCountsPerBlockLx.numCandsPerBlk8x8. For frames using bidirectional ME , the total number of candidates for single macroblock is sum of total number of candidates per MB for each direction (L0 and L1) */ uint32_t reserved16; /**< in: Reserved and must be set to 0 */ void* reserved22; /**< in: Reserved and must be set to NULL */ - int8_t *qpDeltaMap; /**< in: Specifies the pointer to signed byte array containing value per MB in raster scan order for the current picture, which will be interpreted depending on NV_ENC_RC_PARAMS::qpMapMode. - If NV_ENC_RC_PARAMS::qpMapMode is NV_ENC_QP_MAP_DELTA, qpDeltaMap specifies QP modifier per MB. This QP modifier will be applied on top of the QP chosen by rate control. - If NV_ENC_RC_PARAMS::qpMapMode is NV_ENC_QP_MAP_EMPHASIS, qpDeltaMap specifies Emphasis Level Map per MB. This level value along with QP chosen by rate control is used to + int8_t *qpDeltaMap; /**< in: Specifies the pointer to signed byte array containing value per MB for H264 and per CTB for HEVC in raster scan order for the current picture, which will be interpreted depending on NV_ENC_RC_PARAMS::qpMapMode. + If NV_ENC_RC_PARAMS::qpMapMode is NV_ENC_QP_MAP_DELTA, qpDeltaMap specifies QP modifier per MB for H264 and per CTB for HEVC. This QP modifier will be applied on top of the QP chosen by rate control. + If NV_ENC_RC_PARAMS::qpMapMode is NV_ENC_QP_MAP_EMPHASIS, qpDeltaMap specifies Emphasis Level Map per MB for H264. This level value along with QP chosen by rate control is used to compute the QP modifier, which in turn is applied on top of QP chosen by rate control. If NV_ENC_RC_PARAMS::qpMapMode is NV_ENC_QP_MAP_DISABLED, value in qpDeltaMap will be ignored.*/ - uint32_t qpDeltaMapSize; /**< in: Specifies the size in bytes of qpDeltaMap surface allocated by client and pointed to by NV_ENC_PIC_PARAMS::qpDeltaMap. Surface (array) should be picWidthInMbs * picHeightInMbs */ + uint32_t qpDeltaMapSize; /**< in: Specifies the size in bytes of qpDeltaMap surface allocated by client and pointed to by NV_ENC_PIC_PARAMS::qpDeltaMap. Surface (array) should be picWidthInMbs * picHeightInMbs for H264 and picWidthInCtbs * picHeightInCtbs for HEVC */ uint32_t reservedBitFields; /**< in: Reserved bitfields and must be set to 0 */ uint16_t meHintRefPicDist2; /**< in: Specifies temporal distance for reference picture (NVENC_EXTERNAL_ME_HINT::refidx = 0) used during external ME with NV_ENC_INITALIZE_PARAMS::enablePTD = 1 . meHintRefPicDist0 is for L0 hints and meHintRefPicDist1 is for L1 hints. If not set, will internally infer distance of 1. Ignored for NV_ENC_INITALIZE_PARAMS::enablePTD = 0 */ + NV_ENC_INPUT_PTR alphaBuffer; /**< in: Specifies the input alpha buffer pointer. Client must use a pointer obtained from ::NvEncCreateInputBuffer() or ::NvEncMapInputResource() APIs. + Applicable only when encoding hevc with alpha layer is enabled. */ uint32_t reserved3286; /**< in: Reserved and must be set to 0 */ - void* reserved460; /**< in: Reserved and must be set to NULL */ + void* reserved459; /**< in: Reserved and must be set to NULL */ } NV_ENC_PIC_PARAMS; /** Macro for constructing the version field of ::_NV_ENC_PIC_PARAMS */ @@ -1845,8 +1963,8 @@ typedef struct _NV_ENC_MEONLY_PARAMS { uint32_t version; /**< in: Struct version. Must be set to NV_ENC_MEONLY_PARAMS_VER.*/ - uint32_t inputWidth; /**< in: Specifies the input buffer width */ - uint32_t inputHeight; /**< in: Specifies the input buffer height */ + uint32_t inputWidth; /**< in: Specifies the input frame width */ + uint32_t inputHeight; /**< in: Specifies the input frame height */ NV_ENC_INPUT_PTR inputBuffer; /**< in: Specifies the input buffer pointer. Client must use a pointer obtained from NvEncCreateInputBuffer() or NvEncMapInputResource() APIs. */ NV_ENC_INPUT_PTR referenceFrame; /**< in: Specifies the reference frame pointer */ NV_ENC_OUTPUT_PTR mvBuffer; /**< in: Specifies the output buffer pointer. @@ -1856,14 +1974,14 @@ be equal to total number of macroblocks multiplied by size of NV_ENC_H264_MV_DATA struct. Client should use a pointer obtained from ::NvEncMapInputResource() API, when mapping this output buffer and assign it to NV_ENC_MEONLY_PARAMS::mvBuffer. All CUDA operations on this buffer must use the default stream. */ NV_ENC_BUFFER_FORMAT bufferFmt; /**< in: Specifies the input buffer format. */ - void* completionEvent; /**< in: Specifies an event to be signalled on completion of motion estimation + void* completionEvent; /**< in: Specifies an event to be signaled on completion of motion estimation of this Frame only if operating in Asynchronous mode. Each output buffer should be associated with a distinct event pointer. */ - uint32_t viewID; /**< in: Specifies left,right viewID if NV_ENC_CONFIG_H264_MEONLY::bStereoEnable is set. + uint32_t viewID; /**< in: Specifies left or right viewID if NV_ENC_CONFIG_H264_MEONLY::bStereoEnable is set. viewID can be 0,1 if bStereoEnable is set, 0 otherwise. */ NVENC_EXTERNAL_ME_HINT_COUNTS_PER_BLOCKTYPE meHintCountsPerBlock2; /**< in: Specifies the number of hint candidates per block for the current frame. meHintCountsPerBlock0 is for L0 predictors. - The candidate count in NV_ENC_PIC_PARAMS::meHintCountsPerBlocklx must never exceed NV_ENC_INITIALIZE_PARAMS::maxMEHintCountsPerBlocklx provided during encoder intialization. */ + The candidate count in NV_ENC_PIC_PARAMS::meHintCountsPerBlocklx must never exceed NV_ENC_INITIALIZE_PARAMS::maxMEHintCountsPerBlocklx provided during encoder initialization. */ NVENC_EXTERNAL_ME_HINT *meExternalHints; /**< in: Specifies the pointer to ME external hints for the current frame. The size of ME hint buffer should be equal to number of macroblocks * the total number of candidates per macroblock. The total number of candidates per MB per direction = 1*meHintCountsPerBlockLx.numCandsPerBlk16x16 + 2*meHintCountsPerBlockLx.numCandsPerBlk16x8 + 2*meHintCountsPerBlockLx.numCandsPerBlk8x8 + 4*meHintCountsPerBlockLx.numCandsPerBlk8x8. For frames using bidirectional ME , the total number of candidates for single macroblock is sum of total number of candidates per MB for each direction (L0 and L1) */ @@ -1887,11 +2005,12 @@ uint32_t getRCStats :1; /**< in: If this flag is set then lockBitstream call will add additional intra-inter MB count and average MVX, MVY */ uint32_t reservedBitFields :29; /**< in: Reserved bit fields and must be set to 0 */ void* outputBitstream; /**< in: Pointer to the bitstream buffer being locked. */ - uint32_t* sliceOffsets; /**< in,out: Array which receives the slice offsets. This is not supported if NV_ENC_CONFIG_H264::sliceMode is 1 on Kepler GPUs. Array size must be equal to size of frame in MBs. */ + uint32_t* sliceOffsets; /**< in, out: Array which receives the slice offsets. This is not supported if NV_ENC_CONFIG_H264::sliceMode is 1 on Kepler GPUs. Array size must be equal to size of frame in MBs. */ uint32_t frameIdx; /**< out: Frame no. for which the bitstream is being retrieved. */ uint32_t hwEncodeStatus; /**< out: The NvEncodeAPI interface status for the locked picture. */ uint32_t numSlices; /**< out: Number of slices in the encoded picture. Will be reported only if NV_ENC_INITIALIZE_PARAMS::reportSliceOffsets set to 1. */ - uint32_t bitstreamSizeInBytes; /**< out: Actual number of bytes generated and copied to the memory pointed by bitstreamBufferPtr. */ + uint32_t bitstreamSizeInBytes; /**< out: Actual number of bytes generated and copied to the memory pointed by bitstreamBufferPtr. + When HEVC alpha layer encoding is enabled, this field reports the total encoded size in bytes i.e it is the encoded size of the base plus the alpha layer. */ uint64_t outputTimeStamp; /**< out: Presentation timestamp associated with the encoded output. */ uint64_t outputDuration; /**< out: Presentation duration associates with the encoded output. */ void* bitstreamBufferPtr; /**< out: Pointer to the generated output bitstream. @@ -1903,12 +2022,15 @@ uint32_t frameSatd; /**< out: Total SATD cost for whole frame. */ uint32_t ltrFrameIdx; /**< out: Frame index associated with this LTR frame. */ uint32_t ltrFrameBitmap; /**< out: Bitmap of LTR frames indices which were used for encoding this frame. Value of 0 if no LTR frames were used. */ - uint32_t reserved13; /**< in: Reserved and must be set to 0 */ + uint32_t temporalId; /**< out: TemporalId value of the frame when using temporalSVC encoding */ + uint32_t reserved12; /**< in: Reserved and must be set to 0 */ uint32_t intraMBCount; /**< out: For H264, Number of Intra MBs in the encoded frame. For HEVC, Number of Intra CTBs in the encoded frame. Supported only if _NV_ENC_LOCK_BITSTREAM::getRCStats set to 1. */ uint32_t interMBCount; /**< out: For H264, Number of Inter MBs in the encoded frame, includes skip MBs. For HEVC, Number of Inter CTBs in the encoded frame. Supported only if _NV_ENC_LOCK_BITSTREAM::getRCStats set to 1. */ int32_t averageMVX; /**< out: Average Motion Vector in X direction for the encoded frame. Supported only if _NV_ENC_LOCK_BITSTREAM::getRCStats set to 1. */ int32_t averageMVY; /**< out: Average Motion Vector in y direction for the encoded frame. Supported only if _NV_ENC_LOCK_BITSTREAM::getRCStats set to 1. */ - uint32_t reserved1219; /**< in: Reserved and must be set to 0 */ + uint32_t alphaLayerSizeInBytes; /**< out: Number of bytes generated for the alpha layer in the encoded output. Applicable only when HEVC with alpha encoding is enabled. */ + + uint32_t reserved1218; /**< in: Reserved and must be set to 0 */ void* reserved264; /**< in: Reserved and must be set to NULL */ } NV_ENC_LOCK_BITSTREAM; @@ -1966,6 +2088,45 @@ uint32_t target; /**< in: Accepted values are GL_TEXTURE_RECTANGLE and GL_TEXTURE_2D. */ } NV_ENC_INPUT_RESOURCE_OPENGL_TEX; +/** \struct NV_ENC_FENCE_POINT_D3D12 + * Fence and fence value for synchronization. + */ +typedef struct _NV_ENC_FENCE_POINT_D3D12 +{ + void* pFence; /**< in: Pointer to ID3D12Fence. This fence object is used for synchronization. */ + uint64_t value; /**< in: Fence value to reach or exceed before the GPU operation or + fence value to set the fence to, after the GPU operation. */ +} NV_ENC_FENCE_POINT_D3D12; + +/** + * \struct _NV_ENC_INPUT_RESOURCE_D3D12 + * NV_ENC_PIC_PARAMS::inputBuffer and NV_ENC_PIC_PARAMS::alphaBuffer must be a pointer to a struct of this type, + * when D3D12 interface is used + */ +typedef struct _NV_ENC_INPUT_RESOURCE_D3D12 +{ + NV_ENC_REGISTERED_PTR pInputBuffer; /**< in: Specifies the input surface pointer. Client must use a pointer obtained from NvEncRegisterResource() in NV_ENC_REGISTER_RESOURCE::registeredResource + when registering input surface. */ + NV_ENC_FENCE_POINT_D3D12 inputFencePoint; /**< in: Specifies the input fence and corresponding fence value to do GPU wait. + This fence will be used to do GPU wait until the specified fence reaches or exceeds the specified value. */ + uint32_t reserved116; /**< in: Reserved and must be set to 0. */ + void* reserved216; /**< in: Reserved and must be set to NULL. */ +} NV_ENC_INPUT_RESOURCE_D3D12; + +/** + * \struct _NV_ENC_OUTPUT_RESOURCE_D3D12 + * NV_ENC_PIC_PARAMS::outputBitstream and NV_ENC_LOCK_BITSTREAM::outputBitstream must be a pointer to a struct of this type, + * when D3D12 interface is used + */ +typedef struct _NV_ENC_OUTPUT_RESOURCE_D3D12 +{ + NV_ENC_REGISTERED_PTR pOutputBuffer; /**< in: Specifies the output buffer pointer. Client must use a pointer obtained from NvEncRegisterResource() in NV_ENC_REGISTER_RESOURCE::registeredResource + when registering output bitstream buffer */ + NV_ENC_FENCE_POINT_D3D12 outputFencePoint; /**< in: Specifies the output fence and corresponding fence value to set after GPU operation is finished.*/ + uint32_t reserved116; /**< in: Reserved and must be set to 0. */ + void* reserved216; /**< in: Reserved and must be set to NULL. */ +} NV_ENC_OUTPUT_RESOURCE_D3D12; + /** * \struct _NV_ENC_REGISTER_RESOURCE * Register a resource for future use with the Nvidia Video Encoder Interface. @@ -1978,9 +2139,9 @@ ::NV_ENC_INPUT_RESOURCE_TYPE_DIRECTX, ::NV_ENC_INPUT_RESOURCE_TYPE_CUDADEVICEPTR, ::NV_ENC_INPUT_RESOURCE_TYPE_OPENGL_TEX */ - uint32_t width; /**< in: Input buffer Width. */ - uint32_t height; /**< in: Input buffer Height. */ - uint32_t pitch; /**< in: Input buffer Pitch. + uint32_t width; /**< in: Input frame width. */ + uint32_t height; /**< in: Input frame height. */ + uint32_t pitch; /**< in: Input buffer pitch. For ::NV_ENC_INPUT_RESOURCE_TYPE_DIRECTX resources, set this to 0. For ::NV_ENC_INPUT_RESOURCE_TYPE_CUDADEVICEPTR resources, set this to the pitch as obtained from cuMemAllocPitch(), or to the width in @@ -1997,8 +2158,15 @@ NV_ENC_REGISTERED_PTR registeredResource; /**< out: Registered resource handle. This should be used in future interactions with the Nvidia Video Encoder Interface. */ NV_ENC_BUFFER_FORMAT bufferFormat; /**< in: Buffer format of resource to be registered. */ NV_ENC_BUFFER_USAGE bufferUsage; /**< in: Usage of resource to be registered. */ + NV_ENC_FENCE_POINT_D3D12* pInputFencePoint; /**< in: Specifies the pointer to input fence and corresponding fence value to do GPU wait. + To be used only when NV_ENC_REGISTER_RESOURCE::resourceToRegister represents D3D12 surface and + NV_ENC_BUFFER_USAGE::bufferUsage is NV_ENC_INPUT_IMAGE. + This fence will be used to do GPU wait until the specified fence reaches or exceeds the specified value. */ + NV_ENC_FENCE_POINT_D3D12* pOutputFencePoint; /**< in: Specifies the pointer to output fence and corresponding fence value to set after GPU operation is finished. + To be used only when NV_ENC_REGISTER_RESOURCE::resourceToRegister represents D3D12 surface and + NV_ENC_BUFFER_USAGE::bufferUsage is NV_ENC_INPUT_IMAGE. */ uint32_t reserved1247; /**< in: Reserved and must be set to 0. */ - void* reserved262; /**< in: Reserved and must be set to NULL. */ + void* reserved260; /**< in: Reserved and must be set to NULL. */ } NV_ENC_REGISTER_RESOURCE; /** Macro for constructing the version field of ::_NV_ENC_REGISTER_RESOURCE */ @@ -2018,7 +2186,15 @@ uint32_t lastValidByteOffset; /**< out: Offset of last valid bytes of completed bitstream */ uint32_t sliceOffsets16; /**< out: Offsets of each slice */ uint32_t picIdx; /**< out: Picture number */ - uint32_t reserved1233; /**< in: Reserved and must be set to 0 */ + uint32_t frameAvgQP; /**< out: Average QP of the frame. */ + uint32_t ltrFrame :1; /**< out: Flag indicating this frame is marked as LTR frame */ + uint32_t reservedBitFields :31; /**< in: Reserved bit fields and must be set to 0 */ + uint32_t ltrFrameIdx; /**< out: Frame index associated with this LTR frame. */ + uint32_t intraMBCount; /**< out: For H264, Number of Intra MBs in the encoded frame. For HEVC, Number of Intra CTBs in the encoded frame. */ + uint32_t interMBCount; /**< out: For H264, Number of Inter MBs in the encoded frame, includes skip MBs. For HEVC, Number of Inter CTBs in the encoded frame. */ + int32_t averageMVX; /**< out: Average Motion Vector in X direction for the encoded frame. */ + int32_t averageMVY; /**< out: Average Motion Vector in y direction for the encoded frame. */ + uint32_t reserved1226; /**< in: Reserved and must be set to 0 */ void* reserved264; /**< in: Reserved and must be set to NULL */ } NV_ENC_STAT; @@ -2033,11 +2209,12 @@ typedef struct _NV_ENC_SEQUENCE_PARAM_PAYLOAD { uint32_t version; /**< in: Struct version. Must be set to ::NV_ENC_INITIALIZE_PARAMS_VER. */ - uint32_t inBufferSize; /**< in: Specifies the size of the spsppsBuffer provied by the client */ + uint32_t inBufferSize; /**< in: Specifies the size of the spsppsBuffer provided by the client */ uint32_t spsId; /**< in: Specifies the SPS id to be used in sequence header. Default value is 0. */ uint32_t ppsId; /**< in: Specifies the PPS id to be used in picture header. Default value is 0. */ - void* spsppsBuffer; /**< in: Specifies bitstream header pointer of size NV_ENC_SEQUENCE_PARAM_PAYLOAD::inBufferSize. It is the client's responsibility to manage this memory. */ - uint32_t* outSPSPPSPayloadSize; /**< out: Size of the sequence and picture header in bytes written by the NvEncodeAPI interface to the SPSPPSBuffer. */ + void* spsppsBuffer; /**< in: Specifies bitstream header pointer of size NV_ENC_SEQUENCE_PARAM_PAYLOAD::inBufferSize. + It is the client's responsibility to manage this memory. */ + uint32_t* outSPSPPSPayloadSize; /**< out: Size of the sequence and picture header in bytes. */ uint32_t reserved 250; /**< in: Reserved and must be set to 0 */ void* reserved264; /**< in: Reserved and must be set to NULL */ } NV_ENC_SEQUENCE_PARAM_PAYLOAD; @@ -2101,7 +2278,7 @@ /** * \brief Retrieves the number of supported encode GUIDs. * - * The function returns the number of codec guids supported by the NvEncodeAPI + * The function returns the number of codec GUIDs supported by the NvEncodeAPI * interface. * * \param in encoder @@ -2127,12 +2304,12 @@ /** * \brief Retrieves an array of supported encoder codec GUIDs. * - * The function returns an array of codec guids supported by the NvEncodeAPI interface. + * The function returns an array of codec GUIDs supported by the NvEncodeAPI interface. * The client must allocate an array where the NvEncodeAPI interface can - * fill the supported guids and pass the pointer in \p *GUIDs parameter. + * fill the supported GUIDs and pass the pointer in \p *GUIDs parameter. * The size of the array can be determined by using ::NvEncGetEncodeGUIDCount() API. - * The Nvidia Encoding interface returns the number of codec guids it has actually - * filled in the guid array in the \p GUIDCount parameter. + * The Nvidia Encoding interface returns the number of codec GUIDs it has actually + * filled in the GUID array in the \p GUIDCount parameter. * * \param in encoder * Pointer to the NvEncodeAPI interface. @@ -2163,15 +2340,15 @@ * \brief Retrieves the number of supported profile GUIDs. * * The function returns the number of profile GUIDs supported for a given codec. - * The client must first enumerate the codec guids supported by the NvEncodeAPI - * interface. After determining the codec guid, it can query the NvEncodeAPI - * interface to determine the number of profile guids supported for a particular - * codec guid. + * The client must first enumerate the codec GUIDs supported by the NvEncodeAPI + * interface. After determining the codec GUID, it can query the NvEncodeAPI + * interface to determine the number of profile GUIDs supported for a particular + * codec GUID. * * \param in encoder * Pointer to the NvEncodeAPI interface. * \param in encodeGUID - * The codec guid for which the profile guids are being enumerated. + * The codec GUID for which the profile GUIDs are being enumerated. * \param out encodeProfileGUIDCount * Number of encode profiles supported for the given encodeGUID. * @@ -2193,9 +2370,9 @@ /** * \brief Retrieves an array of supported encode profile GUIDs. * - * The function returns an array of supported profile guids for a particular - * codec guid. The client must allocate an array where the NvEncodeAPI interface - * can populate the profile guids. The client can determine the array size using + * The function returns an array of supported profile GUIDs for a particular + * codec GUID. The client must allocate an array where the NvEncodeAPI interface + * can populate the profile GUIDs. The client can determine the array size using * ::NvEncGetEncodeProfileGUIDCount() API. The client must also validiate that the * NvEncodeAPI interface supports the GUID the client wants to pass as \p encodeGUID * parameter. @@ -2203,7 +2380,7 @@ * \param in encoder * Pointer to the NvEncodeAPI interface. * \param in encodeGUID - * The encode guid whose profile guids are being enumerated. + * The encode GUID whose profile GUIDs are being enumerated. * \param in guidArraySize * Number of GUIDs to be retrieved. Should be set to the number retrieved using * ::NvEncGetEncodeProfileGUIDCount. @@ -2325,7 +2502,7 @@ * \brief Retrieves the number of supported preset GUIDs. * * The function returns the number of preset GUIDs available for a given codec. - * The client must validate the codec guid using ::NvEncGetEncodeGUIDs() API + * The client must validate the codec GUID using ::NvEncGetEncodeGUIDs() API * before calling this function. * * \param in encoder @@ -2354,11 +2531,11 @@ /** * \brief Receives an array of supported encoder preset GUIDs. * - * The function returns an array of encode preset guids available for a given codec. - * The client can directly use one of the preset guids based upon the use case - * or target device. The preset guid chosen can be directly used in + * The function returns an array of encode preset GUIDs available for a given codec. + * The client can directly use one of the preset GUIDs based upon the use case + * or target device. The preset GUID chosen can be directly used in * NV_ENC_INITIALIZE_PARAMS::presetGUID parameter to ::NvEncEncodePicture() API. - * Alternately client can also use the preset guid to retrieve the encoding config + * Alternately client can also use the preset GUID to retrieve the encoding config * parameters being used by NvEncodeAPI interface for that given preset, using * ::NvEncGetEncodePresetConfig() API. It can then modify preset config parameters * as per its use case and send it to NvEncodeAPI interface as part of @@ -2372,7 +2549,7 @@ * Encode GUID, corresponding to which the list of supported presets is to be * retrieved. * \param in guidArraySize - * Size of array of preset guids passed in \p preset GUIDs + * Size of array of preset GUIDs passed in \p preset GUIDs * \param out presetGUIDs * Array of supported Encode preset GUIDs from the NvEncodeAPI interface * to client. @@ -2398,13 +2575,13 @@ /** * \brief Returns a preset config structure supported for given preset GUID. * - * The function returns a preset config structure for a given preset guid. Before - * using this function the client must enumerate the preset guids available for + * The function returns a preset config structure for a given preset GUID. Before + * using this function the client must enumerate the preset GUIDs available for * a given codec. The preset config structure can be modified by the client depending * upon its use case and can be then used to initialize the encoder using * ::NvEncInitializeEncoder() API. The client can use this function only if it * wants to modify the NvEncodeAPI preset configuration, otherwise it can - * directly use the preset guid. + * directly use the preset GUID. * * \param in encoder * Pointer to the NvEncodeAPI interface. @@ -2432,6 +2609,48 @@ */ NVENCSTATUS NVENCAPI NvEncGetEncodePresetConfig (void* encoder, GUID encodeGUID, GUID presetGUID, NV_ENC_PRESET_CONFIG* presetConfig); +// NvEncGetEncodePresetConfigEx +/** + * \brief Returns a preset config structure supported for given preset GUID. + * + * The function returns a preset config structure for a given preset GUID and tuning info. + * NvEncGetEncodePresetConfigEx() API is not applicable to H264 and HEVC meonly mode. + * Before using this function the client must enumerate the preset GUIDs available for + * a given codec. The preset config structure can be modified by the client depending + * upon its use case and can be then used to initialize the encoder using + * ::NvEncInitializeEncoder() API. The client can use this function only if it + * wants to modify the NvEncodeAPI preset configuration, otherwise it can + * directly use the preset GUID. + * + * \param in encoder + * Pointer to the NvEncodeAPI interface. + * \param in encodeGUID + * Encode GUID, corresponding to which the list of supported presets is to be + * retrieved. + * \param in presetGUID + * Preset GUID, corresponding to which the Encoding configurations is to be + * retrieved. + * \param in tuningInfo + * tuning info, corresponding to which the Encoding configurations is to be + * retrieved. + * \param out presetConfig + * The requested Preset Encoder Attribute set. Refer ::_NV_ENC_CONFIG for + * more details. + * + * \return + * ::NV_ENC_SUCCESS \n + * ::NV_ENC_ERR_INVALID_PTR \n + * ::NV_ENC_ERR_INVALID_ENCODERDEVICE \n + * ::NV_ENC_ERR_DEVICE_NOT_EXIST \n + * ::NV_ENC_ERR_UNSUPPORTED_PARAM \n + * ::NV_ENC_ERR_OUT_OF_MEMORY \n + * ::NV_ENC_ERR_INVALID_PARAM \n + * ::NV_ENC_ERR_INVALID_VERSION \n + * ::NV_ENC_ERR_GENERIC \n + * + */ +NVENCSTATUS NVENCAPI NvEncGetEncodePresetConfigEx (void* encoder, GUID encodeGUID, GUID presetGUID, NV_ENC_TUNING_INFO tuningInfo, NV_ENC_PRESET_CONFIG* presetConfig); + // NvEncInitializeEncoder /** * \brief Initialize the encoder. @@ -2443,15 +2662,15 @@ * - NV_ENC_INITIALIZE_PARAMS::encodeWidth * - NV_ENC_INITIALIZE_PARAMS::encodeHeight * - * The client can pass a preset guid directly to the NvEncodeAPI interface using + * The client can pass a preset GUID directly to the NvEncodeAPI interface using * NV_ENC_INITIALIZE_PARAMS::presetGUID field. If the client doesn't pass * NV_ENC_INITIALIZE_PARAMS::encodeConfig structure, the codec specific parameters - * will be selected based on the preset guid. The preset guid must have been + * will be selected based on the preset GUID. The preset GUID must have been * validated by the client using ::NvEncGetEncodePresetGUIDs() API. * If the client passes a custom ::_NV_ENC_CONFIG structure through * NV_ENC_INITIALIZE_PARAMS::encodeConfig , it will override the codec specific parameters - * based on the preset guid. It is recommended that even if the client passes a custom config, - * it should also send a preset guid. In this case, the preset guid passed by the client + * based on the preset GUID. It is recommended that even if the client passes a custom config, + * it should also send a preset GUID. In this case, the preset GUID passed by the client * will not override any of the custom config parameters programmed by the client, * it is only used as a hint by the NvEncodeAPI interface to determine certain encoder parameters * which are not exposed to the client. @@ -2467,9 +2686,9 @@ * The client operating in asynchronous mode must allocate completion event object * for each output buffer and pass the completion event object in the * ::NvEncEncodePicture() API. The client can create another thread and wait on - * the event object to be signalled by NvEncodeAPI interface on completion of the + * the event object to be signaled by NvEncodeAPI interface on completion of the * encoding process for the output frame. This should unblock the main thread from - * submitting work to the encoder. When the event is signalled the client can call + * submitting work to the encoder. When the event is signaled the client can call * NvEncodeAPI interfaces to copy the bitstream data using ::NvEncLockBitstream() * API. This is the preferred mode of operation. * @@ -2624,7 +2843,7 @@ * initialized using ::NvEncInitializeEncoder() API. The minimum number of output * buffers allocated by the client must be at least 4 more than the number of B * B frames being used for encoding. The client can only access the output - * bitsteam data by locking the \p bitstreamBuffer using the ::NvEncLockBitstream() + * bitstream data by locking the \p bitstreamBuffer using the ::NvEncLockBitstream() * function. * * \param in encoder @@ -2692,7 +2911,7 @@ * - NV_ENC_PIC_PARAMS_H264::refPicFlag(H264 only) * *\par MVC Encoding: - * For MVC encoding the client must call encode picture api for each view separately + * For MVC encoding the client must call encode picture API for each view separately * and must pass valid view id in NV_ENC_PIC_PARAMS_MVC::viewID field. Currently * NvEncodeAPI only support stereo MVC so client must send viewID as 0 for base * view and view ID as 1 for dependent view. @@ -2710,6 +2929,10 @@ * submitted for encoding. The NvEncodeAPI interface is responsible for any * re-ordering required for B frames and will always ensure that encoded bitstream * data is written in the same order in which output buffer is submitted. + * The NvEncodeAPI interface may return ::NV_ENC_ERR_NEED_MORE_INPUT error code for + * some ::NvEncEncodePicture() API calls but the client must not treat it as a fatal error. + * The NvEncodeAPI interface might not be able to submit an input picture buffer for encoding + * immediately due to re-ordering for B frames. *\code The below example shows how asynchronous encoding in case of 1 B frames ------------------------------------------------------------------------ @@ -2739,14 +2962,21 @@ (I3, O3, E3) ---P3 Frame c) NvEncodeAPI interface will make a copy of the input buffers to its internal - buffersfor re-ordering. These copies are done as part of nvEncEncodePicture + buffers for re-ordering. These copies are done as part of nvEncEncodePicture function call from the client and NvEncodeAPI interface is responsible for synchronization of copy operation with the actual encoding operation. I1 --> NvI1 I2 --> NvI2 I3 --> NvI3 - d) After returning from ::NvEncEncodePicture() call , the client must queue the output + d) The NvEncodeAPI encodes I1 as P frame and submits I1 to encoder HW and returns ::NV_ENC_SUCCESS. + The NvEncodeAPI tries to encode I2 as B frame and fails with ::NV_ENC_ERR_NEED_MORE_INPUT error code. + The error is not fatal and it notifies client that I2 is not submitted to encoder immediately. + The NvEncodeAPI encodes I3 as P frame and submits I3 for encoding which will be used as backward + reference frame for I2. The NvEncodeAPI then submits I2 for encoding and returns ::NV_ENC_SUCESS. + Both the submission are part of the same ::NvEncEncodePicture() function call. + + e) After returning from ::NvEncEncodePicture() call , the client must queue the output bitstream processing work to the secondary thread. The output bitstream processing for asynchronous mode consist of first waiting on completion event(E1, E2..) and then locking the output bitstream buffer(O1, O2..) for reading the encoded @@ -2757,32 +2987,32 @@ Note they are in the same order in which client calls ::NvEncEncodePicture() API in \p step a). - e) NvEncodeAPI interface will do the re-ordering such that Encoder HW will receive + f) NvEncodeAPI interface will do the re-ordering such that Encoder HW will receive the following encode commands: (NvI1, O1, E1) ---P1 Frame (NvI3, O2, E2) ---P3 Frame (NvI2, O3, E3) ---B2 frame - f) After the encoding operations are completed, the events will be signalled + g) After the encoding operations are completed, the events will be signaled by NvEncodeAPI interface in the following order : - (O1, E1) ---P1 Frame ,output bitstream copied to O1 and event E1 signalled. - (O2, E2) ---P3 Frame ,output bitstream copied to O2 and event E2 signalled. - (O3, E3) ---B2 Frame ,output bitstream copied to O3 and event E3 signalled. + (O1, E1) ---P1 Frame ,output bitstream copied to O1 and event E1 signaled. + (O2, E2) ---P3 Frame ,output bitstream copied to O2 and event E2 signaled. + (O3, E3) ---B2 Frame ,output bitstream copied to O3 and event E3 signaled. - g) The client must lock the bitstream data using ::NvEncLockBitstream() API in + h) The client must lock the bitstream data using ::NvEncLockBitstream() API in the order O1,O2,O3 to read the encoded data, after waiting for the events - to be signalled in the same order i.e E1, E2 and E3.The output processing is + to be signaled in the same order i.e E1, E2 and E3.The output processing is done in the secondary thread in the following order: Waits on E1, copies encoded bitstream from O1 Waits on E2, copies encoded bitstream from O2 Waits on E3, copies encoded bitstream from O3 - -Note the client will receive the events signalling and output buffer in the + -Note the client will receive the events signaling and output buffer in the same order in which they have submitted for encoding. -Note the LockBitstream will have picture type field which will notify the output picture type to the clients. -Note the input, output buffer and the output completion event are free to be - reused once NvEncodeAPI interfaced has signalled the event and the client has + reused once NvEncodeAPI interfaced has signaled the event and the client has copied the data from the output buffer. * \endcode @@ -3058,6 +3288,44 @@ */ NVENCSTATUS NVENCAPI NvEncGetSequenceParams (void* encoder, NV_ENC_SEQUENCE_PARAM_PAYLOAD* sequenceParamPayload); +// NvEncGetSequenceParamEx +/** + * \brief Get sequence and picture header. + * + * This function can be used to retrieve the sequence and picture header out of band, even when + * encoder has not been initialized using ::NvEncInitializeEncoder() function. + * The client must allocate the memory where the NvEncodeAPI interface can copy the bitstream + * header and pass the pointer to the memory in NV_ENC_SEQUENCE_PARAM_PAYLOAD::spsppsBuffer. + * The size of buffer is passed in the field NV_ENC_SEQUENCE_PARAM_PAYLOAD::inBufferSize. + * If encoder has not been initialized using ::NvEncInitializeEncoder() function, client must + * send NV_ENC_INITIALIZE_PARAMS as input. The NV_ENC_INITIALIZE_PARAMS passed must be same as the + * one which will be used for initializing encoder using ::NvEncInitializeEncoder() function later. + * If encoder is already initialized using ::NvEncInitializeEncoder() function, the provided + * NV_ENC_INITIALIZE_PARAMS structure is ignored. The NvEncodeAPI interface will copy the bitstream + * header payload and returns the actual size of the bitstream header in the field + * NV_ENC_SEQUENCE_PARAM_PAYLOAD::outSPSPPSPayloadSize. The client must call ::NvEncGetSequenceParamsEx() + * function from the same thread which is being used to call ::NvEncEncodePicture() function. + * + * \param in encoder + * Pointer to the NvEncodeAPI interface. + * \param in encInitParams + * Pointer to the _NV_ENC_INITIALIZE_PARAMS structure. + * \param in,out sequenceParamPayload + * Pointer to the ::_NV_ENC_SEQUENCE_PARAM_PAYLOAD structure. + * + * \return + * ::NV_ENC_SUCCESS \n + * ::NV_ENC_ERR_INVALID_PTR \n + * ::NV_ENC_ERR_INVALID_ENCODERDEVICE \n + * ::NV_ENC_ERR_DEVICE_NOT_EXIST \n + * ::NV_ENC_ERR_UNSUPPORTED_PARAM \n + * ::NV_ENC_ERR_OUT_OF_MEMORY \n + * ::NV_ENC_ERR_INVALID_VERSION \n + * ::NV_ENC_ERR_INVALID_PARAM \n + * ::NV_ENC_ERR_GENERIC \n + * + */ +NVENCSTATUS NVENCAPI NvEncGetSequenceParamEx (void* encoder, NV_ENC_INITIALIZE_PARAMS* encInitParams, NV_ENC_SEQUENCE_PARAM_PAYLOAD* sequenceParamPayload); // NvEncRegisterAsyncEvent /** @@ -3068,7 +3336,7 @@ * work in asynchronous mode. In this mode the client needs to send a completion * event with every output buffer. The NvEncodeAPI interface will signal the * completion of the encoding process using this event. Only after the event is - * signalled the client can get the encoded data using ::NvEncLockBitstream() function. + * signaled the client can get the encoded data using ::NvEncLockBitstream() function. * * \param in encoder * Pointer to the NvEncodeAPI interface. @@ -3134,6 +3402,7 @@ * also true for compute (i.e. CUDA) work, provided that the previous workload using * the input resource was submitted to the default stream. * The client should not access any input buffer while they are mapped by the encoder. + * For D3D12 interface type, this function does not provide synchronization guarantee. * * \param in encoder * Pointer to the NvEncodeAPI interface. @@ -3166,7 +3435,7 @@ * UnMaps an input buffer which was previously mapped using ::NvEncMapInputResource() * API. The mapping created using ::NvEncMapInputResource() should be invalidated * using this API before the external resource is destroyed by the client. The client - * must unmap the buffer after ::NvEncLockBitstream() API returns succuessfully for encode + * must unmap the buffer after ::NvEncLockBitstream() API returns successfully for encode * work submitted using the mapped input buffer. * * @@ -3357,7 +3626,7 @@ * Change in GOP structure. * Change in sync-Async mode. * Change in MaxWidth & MaxHeight. - * Change in PTDmode. + * Change in PTD mode. * * Resolution change is possible only if maxEncodeWidth & maxEncodeHeight of NV_ENC_INITIALIZE_PARAMS * is set while creating encoder session. @@ -3489,7 +3758,7 @@ NVENCSTATUS NVENCAPI NvEncodeAPIGetMaxSupportedVersion (uint32_t* version); -// NvEncodeAPIGetLastErrorString +// NvEncGetLastErrorString /** * \brief Get the description of the last error reported by the API. * @@ -3520,6 +3789,7 @@ typedef NVENCSTATUS (NVENCAPI* PNVENCGETENCODEPRESETCOUNT) (void* encoder, GUID encodeGUID, uint32_t* encodePresetGUIDCount); typedef NVENCSTATUS (NVENCAPI* PNVENCGETENCODEPRESETGUIDS) (void* encoder, GUID encodeGUID, GUID* presetGUIDs, uint32_t guidArraySize, uint32_t* encodePresetGUIDCount); typedef NVENCSTATUS (NVENCAPI* PNVENCGETENCODEPRESETCONFIG) (void* encoder, GUID encodeGUID, GUID presetGUID, NV_ENC_PRESET_CONFIG* presetConfig); +typedef NVENCSTATUS (NVENCAPI* PNVENCGETENCODEPRESETCONFIGEX) (void* encoder, GUID encodeGUID, GUID presetGUID, NV_ENC_TUNING_INFO tuningInfo, NV_ENC_PRESET_CONFIG* presetConfig); typedef NVENCSTATUS (NVENCAPI* PNVENCINITIALIZEENCODER) (void* encoder, NV_ENC_INITIALIZE_PARAMS* createEncodeParams); typedef NVENCSTATUS (NVENCAPI* PNVENCCREATEINPUTBUFFER) (void* encoder, NV_ENC_CREATE_INPUT_BUFFER* createInputBufferParams); typedef NVENCSTATUS (NVENCAPI* PNVENCDESTROYINPUTBUFFER) (void* encoder, NV_ENC_INPUT_PTR inputBuffer); @@ -3548,6 +3818,7 @@ typedef NVENCSTATUS (NVENCAPI* PNVENCRUNMOTIONESTIMATIONONLY) (void* encoder, NV_ENC_MEONLY_PARAMS* meOnlyParams); typedef const char * (NVENCAPI* PNVENCGETLASTERROR) (void* encoder); typedef NVENCSTATUS (NVENCAPI* PNVENCSETIOCUDASTREAMS) (void* encoder, NV_ENC_CUSTREAM_PTR inputStream, NV_ENC_CUSTREAM_PTR outputStream); +typedef NVENCSTATUS (NVENCAPI* PNVENCGETSEQUENCEPARAMEX) (void* encoder, NV_ENC_INITIALIZE_PARAMS* encInitParams, NV_ENC_SEQUENCE_PARAM_PAYLOAD* sequenceParamPayload); /// \endcond @@ -3602,7 +3873,9 @@ PNVENCRUNMOTIONESTIMATIONONLY nvEncRunMotionEstimationOnly; /**< out: Client should access ::NvEncRunMotionEstimationOnly API through this pointer. */ PNVENCGETLASTERROR nvEncGetLastErrorString; /**< out: Client should access ::nvEncGetLastErrorString API through this pointer. */ PNVENCSETIOCUDASTREAMS nvEncSetIOCudaStreams; /**< out: Client should access ::nvEncSetIOCudaStreams API through this pointer. */ - void* reserved2279; /**< in: Reserved and must be set to NULL */ + PNVENCGETENCODEPRESETCONFIGEX nvEncGetEncodePresetConfigEx; /**< out: Client should access ::NvEncGetEncodePresetConfigEx() API through this pointer. */ + PNVENCGETSEQUENCEPARAMEX nvEncGetSequenceParamEx; /**< out: Client should access ::NvEncGetSequenceParamEx() API through this pointer. */ + void* reserved2277; /**< in: Reserved and must be set to NULL */ } NV_ENCODE_API_FUNCTION_LIST; /** Macro for constructing the version field of ::_NV_ENCODEAPI_FUNCTION_LIST. */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/nvcuvid.h -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/nvcuvid.h
Changed
@@ -1,7 +1,7 @@ /* * This copyright notice applies to this header file only: * - * Copyright (c) 2010-2019 NVIDIA Corporation + * Copyright (c) 2010-2021 NVIDIA Corporation * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -28,7 +28,7 @@ /********************************************************************************************************************/ //! \file nvcuvid.h //! NVDECODE API provides video decoding interface to NVIDIA GPU devices. -//! \date 2015-2019 +//! \date 2015-2020 //! This file contains the interface constants, structure definitions and function prototypes. /********************************************************************************************************************/ @@ -150,6 +150,37 @@ /****************************************************************/ //! \ingroup STRUCTS +//! \struct CUVIDOPERATINGPOINTINFO +//! Operating point information of scalable bitstream +/****************************************************************/ +typedef struct +{ + cudaVideoCodec codec; + union + { + struct + { + unsigned char operating_points_cnt; + unsigned char reserved24_bits3; + unsigned short operating_points_idc32; + } av1; + unsigned char CodecReserved1024; + }; +} CUVIDOPERATINGPOINTINFO; + +/****************************************************************/ +//! \ingroup STRUCTS +//! \struct CUVIDAV1SEQHDR +//! AV1 specific sequence header information +/****************************************************************/ +typedef struct { + unsigned int max_width; + unsigned int max_height; + unsigned char reserved1016; +} CUVIDAV1SEQHDR; + +/****************************************************************/ +//! \ingroup STRUCTS //! \struct CUVIDEOFORMATEX //! Video format including raw sequence header information //! Used in cuvidGetSourceVideoFormat API @@ -157,7 +188,10 @@ typedef struct { CUVIDEOFORMAT format; /**< OUT: CUVIDEOFORMAT structure */ - unsigned char raw_seqhdr_data1024; /**< OUT: Sequence header data */ + union { + CUVIDAV1SEQHDR av1; + unsigned char raw_seqhdr_data1024; /**< OUT: Sequence header data */ + }; } CUVIDEOFORMATEX; /****************************************************************/ @@ -221,7 +255,9 @@ typedef struct _CUVIDSOURCEPARAMS { unsigned int ulClockRate; /**< IN: Time stamp units in Hz (0=default=10000000Hz) */ - unsigned int uReserved17; /**< Reserved for future use - set to zero */ + unsigned int bAnnexb : 1; /**< IN: AV1 annexB stream */ + unsigned int uReserved : 31; /**< Reserved for future use - set to zero */ + unsigned int uReserved16; /**< Reserved for future use - set to zero */ void *pUserData; /**< IN: User private data passed in to the data handlers */ PFNVIDSOURCECALLBACK pfnVideoDataHandler; /**< IN: Called to deliver video packets */ PFNVIDSOURCECALLBACK pfnAudioDataHandler; /**< IN: Called to deliver audio packets. */ @@ -323,14 +359,18 @@ //! is ready to be decoded and/or displayed. First argument in functions is "void *pUserData" member of structure CUVIDSOURCEPARAMS //! Return values from these callbacks are interpreted as below. If the callbacks return failure, it will be propagated by //! cuvidParseVideoData() to the application. +//! Parser picks default operating point as 0 and outputAllLayers flag as 0 if PFNVIDOPPOINTCALLBACK is not set or return value is +//! -1 or invalid operating point. //! PFNVIDSEQUENCECALLBACK : 0: fail, 1: succeeded, > 1: override dpb size of parser (set by CUVIDPARSERPARAMS::ulMaxNumDecodeSurfaces //! while creating parser) //! PFNVIDDECODECALLBACK : 0: fail, >=1: succeeded //! PFNVIDDISPLAYCALLBACK : 0: fail, >=1: succeeded +//! PFNVIDOPPOINTCALLBACK : <0: fail, >=0: succeeded (bit 0-9: OperatingPoint, bit 10-10: outputAllLayers, bit 11-30: reserved) /***********************************************************************************************************************/ typedef int (CUDAAPI *PFNVIDSEQUENCECALLBACK)(void *, CUVIDEOFORMAT *); typedef int (CUDAAPI *PFNVIDDECODECALLBACK)(void *, CUVIDPICPARAMS *); typedef int (CUDAAPI *PFNVIDDISPLAYCALLBACK)(void *, CUVIDPARSERDISPINFO *); +typedef int (CUDAAPI *PFNVIDOPPOINTCALLBACK)(void *, CUVIDOPERATINGPOINTINFO*); /**************************************/ //! \ingroup STRUCTS @@ -346,12 +386,16 @@ IN: call pfnDecodePicture even if picture bitstream is fully corrupted) */ unsigned int ulMaxDisplayDelay; /**< IN: Max display queue delay (improves pipelining of decode with display) 0=no delay (recommended values: 2..4) */ - unsigned int uReserved15; /**< IN: Reserved for future use - set to 0 */ + unsigned int bAnnexb : 1; /**< IN: AV1 annexB stream */ + unsigned int uReserved : 31; /**< Reserved for future use - set to zero */ + unsigned int uReserved14; /**< IN: Reserved for future use - set to 0 */ void *pUserData; /**< IN: User data for callbacks */ PFNVIDSEQUENCECALLBACK pfnSequenceCallback; /**< IN: Called before decoding frames and/or whenever there is a fmt change */ PFNVIDDECODECALLBACK pfnDecodePicture; /**< IN: Called when a picture is ready to be decoded (decode order) */ PFNVIDDISPLAYCALLBACK pfnDisplayPicture; /**< IN: Called whenever a picture is ready to be displayed (display order) */ - void *pvReserved27; /**< Reserved for future use - set to NULL */ + PFNVIDOPPOINTCALLBACK pfnGetOperatingPoint; /**< IN: Called from AV1 sequence header to get operating point of a AV1 + scalable bitstream */ + void *pvReserved26; /**< Reserved for future use - set to NULL */ CUVIDEOFORMATEX *pExtVideoInfo; /**< IN: Optional sequence header data from system layer */ } CUVIDPARSERPARAMS;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/nvcodec/plugin.c -> gst-plugins-bad-1.22.0.tar.xz/sys/nvcodec/plugin.c
Changed
@@ -31,20 +31,34 @@ #include "gstnvdec.h" #include "gstnvenc.h" +#include "gstnvav1dec.h" #include "gstnvh264dec.h" #include "gstnvh265dec.h" #include "gstnvvp8dec.h" #include "gstnvvp9dec.h" #include "gstnvdecoder.h" -#include "gstcudadownload.h" -#include "gstcudaupload.h" +#include "gstcudamemorycopy.h" #include "gstcudafilter.h" +#include <gst/cuda/gstcudamemory.h> +#ifdef HAVE_NVCODEC_NVMM +#include "gstcudanvmm.h" +#endif + +#ifdef GST_CUDA_HAS_D3D +#include <gst/d3d11/gstd3d11.h> +#endif +#include "gstnvh264encoder.h" +#include "gstnvh265encoder.h" GST_DEBUG_CATEGORY (gst_nvcodec_debug); GST_DEBUG_CATEGORY (gst_nvdec_debug); GST_DEBUG_CATEGORY (gst_nvenc_debug); GST_DEBUG_CATEGORY (gst_nv_decoder_debug); +#ifdef HAVE_NVCODEC_NVMM +GST_DEBUG_CATEGORY (gst_cuda_nvmm_debug); +#endif + #define GST_CAT_DEFAULT gst_nvcodec_debug static gboolean @@ -52,7 +66,7 @@ { CUresult cuda_ret; gint dev_count = 0; - gint i; + guint i; gboolean nvdec_available = TRUE; gboolean nvenc_available = TRUE; /* hardcoded minimum supported version */ @@ -63,12 +77,18 @@ gboolean use_h265_sl_dec = FALSE; gboolean use_vp8_sl_dec = FALSE; gboolean use_vp9_sl_dec = FALSE; + GList *h264_enc_cdata = NULL; + GList *h265_enc_cdata = NULL; GST_DEBUG_CATEGORY_INIT (gst_nvcodec_debug, "nvcodec", 0, "nvcodec"); GST_DEBUG_CATEGORY_INIT (gst_nvdec_debug, "nvdec", 0, "nvdec"); GST_DEBUG_CATEGORY_INIT (gst_nvenc_debug, "nvenc", 0, "nvenc"); GST_DEBUG_CATEGORY_INIT (gst_nv_decoder_debug, "nvdecoder", 0, "nvdecoder"); +#ifdef HAVE_NVCODEC_NVMM + GST_DEBUG_CATEGORY_INIT (gst_cuda_nvmm_debug, "cudanvmm", 0, "cudanvmm"); +#endif + if (!gst_cuda_load_library ()) { GST_WARNING ("Failed to load cuda library"); return TRUE; @@ -128,24 +148,15 @@ } for (i = 0; i < dev_count; i++) { - CUdevice cuda_device; + GstCudaContext *context = gst_cuda_context_new (i); CUcontext cuda_ctx; - cuda_ret = CuDeviceGet (&cuda_device, i); - if (cuda_ret != CUDA_SUCCESS) { - GST_WARNING ("Failed to get device handle %d, ret: 0x%x", i, - (gint) cuda_ret); - continue; - } - - cuda_ret = CuCtxCreate (&cuda_ctx, 0, cuda_device); - if (cuda_ret != CUDA_SUCCESS) { - GST_WARNING ("Failed to create cuda context, ret: 0x%x", (gint) cuda_ret); + if (!context) { + GST_WARNING ("Failed to create context for deevice %d", i); continue; } - CuCtxPopCurrent (NULL); - + cuda_ctx = gst_cuda_context_get_handle (context); if (nvdec_available) { gint j; @@ -211,6 +222,12 @@ i, GST_RANK_PRIMARY, sink_template, src_template, TRUE); } break; + case cudaVideoCodec_AV1: + gst_nv_av1_dec_register (plugin, i, GST_RANK_PRIMARY, + sink_template, src_template); + /* Stateless decoder only in case of AV1 */ + register_cuviddec = FALSE; + break; default: break; } @@ -226,18 +243,69 @@ } } - if (nvenc_available) + if (nvenc_available) { + GstNvEncoderClassData *cdata; + +#ifdef GST_CUDA_HAS_D3D + if (g_win32_check_windows_version (6, 0, 0, G_WIN32_OS_ANY)) { + gint64 adapter_luid; + GstD3D11Device *d3d11_device; + + g_object_get (context, "dxgi-adapter-luid", &adapter_luid, NULL); + d3d11_device = gst_d3d11_device_new_for_adapter_luid (adapter_luid, + D3D11_CREATE_DEVICE_BGRA_SUPPORT); + if (!d3d11_device) { + GST_WARNING ("Failed to d3d11 create device"); + } else { + cdata = gst_nv_h264_encoder_register_d3d11 (plugin, + d3d11_device, GST_RANK_NONE); + if (cdata) + h264_enc_cdata = g_list_append (h264_enc_cdata, cdata); + + cdata = gst_nv_h265_encoder_register_d3d11 (plugin, + d3d11_device, GST_RANK_NONE); + if (cdata) + h265_enc_cdata = g_list_append (h265_enc_cdata, cdata); + + gst_object_unref (d3d11_device); + } + } +#endif + cdata = + gst_nv_h264_encoder_register_cuda (plugin, context, GST_RANK_NONE); + if (cdata) + h264_enc_cdata = g_list_append (h264_enc_cdata, cdata); + + cdata = + gst_nv_h265_encoder_register_cuda (plugin, context, GST_RANK_NONE); + if (cdata) + h265_enc_cdata = g_list_append (h265_enc_cdata, cdata); + gst_nvenc_plugin_init (plugin, i, cuda_ctx); + } - CuCtxDestroy (cuda_ctx); + gst_object_unref (context); } - gst_element_register (plugin, "cudadownload", GST_RANK_NONE, - GST_TYPE_CUDA_DOWNLOAD); - gst_element_register (plugin, "cudaupload", GST_RANK_NONE, - GST_TYPE_CUDA_UPLOAD); + if (h264_enc_cdata) { + gst_nv_h264_encoder_register_auto_select (plugin, h264_enc_cdata, + GST_RANK_NONE); + } + if (h265_enc_cdata) { + gst_nv_h265_encoder_register_auto_select (plugin, h265_enc_cdata, + GST_RANK_NONE); + } + + gst_cuda_memory_copy_register (plugin, GST_RANK_NONE); gst_cuda_filter_plugin_init (plugin); + gst_cuda_memory_init_once (); + +#ifdef HAVE_NVCODEC_NVMM + if (gst_cuda_nvmm_init_once ()) { + GST_INFO ("Enable NVMM support"); + } +#endif return TRUE; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/opensles/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/opensles/meson.build
Changed
@@ -26,6 +26,5 @@ dependencies : gstaudio_dep, opensles_dep, install : true, install_dir : plugins_install_dir) - pkgconfig.generate(gstopensles, install_dir : plugins_pkgconfig_install_dir) plugins += gstopensles endif
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvallocator.cpp
Added
@@ -0,0 +1,848 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvallocator.h" + +GST_DEBUG_CATEGORY_EXTERN (gst_qsv_allocator_debug); +#define GST_CAT_DEFAULT gst_qsv_allocator_debug + +/* Both d3d11 and va use (GST_MAP_FLAG_LAST << 1) value + * for GPU access */ +#define GST_MAP_QSV (GST_MAP_FLAG_LAST << 1) + +struct _GstQsvFrame +{ + GstMiniObject parent; + + GstQsvAllocator *allocator; + + GMutex lock; + + guint map_count; + GstBuffer *buffer; + GstVideoInfo info; + GstVideoFrame frame; + GstQsvMemoryType mem_type; + GstMapFlags map_flags; +}; + +GST_DEFINE_MINI_OBJECT_TYPE (GstQsvFrame, gst_qsv_frame); + +static void +_gst_qsv_frame_free (GstQsvFrame * frame) +{ + g_mutex_clear (&frame->lock); + gst_clear_buffer (&frame->buffer); + gst_clear_object (&frame->allocator); + g_free (frame); +} + +static GstQsvFrame * +gst_qsv_frame_new (void) +{ + GstQsvFrame *self; + + self = g_new0 (GstQsvFrame, 1); + g_mutex_init (&self->lock); + + gst_mini_object_init (GST_MINI_OBJECT_CAST (self), 0, + GST_TYPE_QSV_FRAME, nullptr, nullptr, + (GstMiniObjectFreeFunction) _gst_qsv_frame_free); + + return self; +} + +GstBuffer * +gst_qsv_frame_peek_buffer (GstQsvFrame * frame) +{ + g_return_val_if_fail (GST_IS_QSV_FRAME (frame), nullptr); + + return frame->buffer; +} + +gboolean +gst_qsv_frame_set_buffer (GstQsvFrame * frame, GstBuffer * buffer) +{ + g_return_val_if_fail (GST_IS_QSV_FRAME (frame), FALSE); + + g_mutex_lock (&frame->lock); + if (frame->buffer == buffer) { + g_mutex_unlock (&frame->lock); + return TRUE; + } + + if (frame->map_count > 0) { + GST_ERROR ("frame is locked"); + g_mutex_unlock (&frame->lock); + + return FALSE; + } + + gst_clear_buffer (&frame->buffer); + frame->buffer = buffer; + g_mutex_unlock (&frame->lock); + + return TRUE; +} + +struct _GstQsvAllocatorPrivate +{ + GstAtomicQueue *queue; + + mfxFrameAllocator allocator; + mfxFrameAllocResponse response; + guint16 extra_alloc_size; + gboolean dummy_alloc; +}; + +#define gst_qsv_allocator_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GstQsvAllocator, + gst_qsv_allocator, GST_TYPE_OBJECT); + +static void gst_qsv_allocator_finalize (GObject * object); +static mfxStatus gst_qsv_allocator_alloc (mfxHDL pthis, + mfxFrameAllocRequest * request, mfxFrameAllocResponse * response); +static mfxStatus gst_qsv_allocator_lock (mfxHDL pthis, mfxMemId mid, + mfxFrameData * ptr); +static mfxStatus gst_qsv_allocator_unlock (mfxHDL pthis, mfxMemId mid, + mfxFrameData * ptr); +static mfxStatus gst_qsv_allocator_get_hdl (mfxHDL pthis, mfxMemId mid, + mfxHDL * handle); +static mfxStatus gst_qsv_allocator_free (mfxHDL pthis, + mfxFrameAllocResponse * response); +static GstBuffer *gst_qsv_allocator_download_default (GstQsvAllocator * self, + const GstVideoInfo * info, gboolean force_copy, GstQsvFrame * frame, + GstBufferPool * pool); + +static void +gst_qsv_allocator_class_init (GstQsvAllocatorClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = gst_qsv_allocator_finalize; + + klass->download = GST_DEBUG_FUNCPTR (gst_qsv_allocator_download_default); +} + +static void +gst_qsv_allocator_init (GstQsvAllocator * self) +{ + GstQsvAllocatorPrivate *priv; + + priv = self->priv = (GstQsvAllocatorPrivate *) + gst_qsv_allocator_get_instance_private (self); + + priv->queue = gst_atomic_queue_new (16); + + priv->allocator.pthis = self; + priv->allocator.Alloc = gst_qsv_allocator_alloc; + priv->allocator.Lock = gst_qsv_allocator_lock; + priv->allocator.Unlock = gst_qsv_allocator_unlock; + priv->allocator.GetHDL = gst_qsv_allocator_get_hdl; + priv->allocator.Free = gst_qsv_allocator_free; +} + +static void +gst_qsv_allocator_finalize (GObject * object) +{ + GstQsvAllocator *self = GST_QSV_ALLOCATOR (object); + GstQsvAllocatorPrivate *priv = self->priv; + GstQsvFrame *frame; + + GST_DEBUG_OBJECT (object, "finalize"); + + while ((frame = (GstQsvFrame *) gst_atomic_queue_pop (priv->queue))) + gst_qsv_frame_unref (frame); + + gst_atomic_queue_unref (priv->queue); + gst_qsv_allocator_free ((mfxHDL) self, &priv->response); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static mfxStatus +gst_qsv_allocator_alloc_default (GstQsvAllocator * self, gboolean dummy_alloc, + mfxFrameAllocRequest * request, mfxFrameAllocResponse * response) +{ + GstQsvFrame **mids = nullptr; + GstVideoInfo info; + GstVideoAlignment align; + GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; + GstBufferPool *pool; + GstCaps *caps; + GstStructure *config; + + /* Something unexpected and went wrong */ + if ((request->Type & MFX_MEMTYPE_SYSTEM_MEMORY) == 0) { + GST_ERROR_OBJECT (self, + "MFX is requesting system memory, type 0x%x", request->Type); + return MFX_ERR_UNSUPPORTED; + } + + switch (request->Info.FourCC) { + case MFX_FOURCC_NV12: + format = GST_VIDEO_FORMAT_NV12; + break; + case MFX_FOURCC_P010: + format = GST_VIDEO_FORMAT_P010_10LE; + break; + case MFX_FOURCC_P016: + format = GST_VIDEO_FORMAT_P016_LE; + break; + case MFX_FOURCC_AYUV: + format = GST_VIDEO_FORMAT_VUYA; + break; + case MFX_FOURCC_Y410: + format = GST_VIDEO_FORMAT_Y410; + break; + case MFX_FOURCC_YUY2: + format = GST_VIDEO_FORMAT_YUY2; + break; + case MFX_FOURCC_RGB4: + format = GST_VIDEO_FORMAT_BGRA; + break; + default: + /* TODO: add more formats */ + break; + } + + if (format == GST_VIDEO_FORMAT_UNKNOWN) { + GST_ERROR_OBJECT (self, "Unknown MFX format fourcc %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (request->Info.FourCC)); + + return MFX_ERR_UNSUPPORTED; + } + + mids = g_new0 (GstQsvFrame *, request->NumFrameSuggested); + response->NumFrameActual = request->NumFrameSuggested; + + gst_video_info_set_format (&info, + format, request->Info.CropW, request->Info.CropH); + + if (dummy_alloc) { + for (guint i = 0; i < request->NumFrameSuggested; i++) { + midsi = gst_qsv_allocator_acquire_frame (self, + GST_QSV_SYSTEM_MEMORY, &info, nullptr, nullptr); + } + + response->mids = (mfxMemId *) mids; + + return MFX_ERR_NONE; + } + + caps = gst_video_info_to_caps (&info); + if (!caps) { + GST_ERROR_OBJECT (self, "Failed to convert video-info to caps"); + return MFX_ERR_UNSUPPORTED; + } + + gst_video_alignment_reset (&align); + align.padding_right = request->Info.Width - request->Info.CropW; + align.padding_bottom = request->Info.Height - request->Info.CropH; + + pool = gst_video_buffer_pool_new (); + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); + gst_buffer_pool_config_set_video_alignment (config, &align); + gst_buffer_pool_config_set_params (config, caps, GST_VIDEO_INFO_SIZE (&info), + 0, 0); + gst_caps_unref (caps); + gst_buffer_pool_set_config (pool, config); + gst_buffer_pool_set_active (pool, TRUE); + + for (guint i = 0; i < request->NumFrameSuggested; i++) { + GstBuffer *buffer; + + if (gst_buffer_pool_acquire_buffer (pool, &buffer, nullptr) != GST_FLOW_OK) { + GST_ERROR_OBJECT (self, "Failed to allocate texture buffer"); + gst_buffer_pool_set_active (pool, FALSE); + gst_object_unref (pool); + goto error; + } + + midsi = gst_qsv_allocator_acquire_frame (self, + GST_QSV_SYSTEM_MEMORY, &info, buffer, nullptr); + } + + gst_buffer_pool_set_active (pool, FALSE); + gst_object_unref (pool); + + response->mids = (mfxMemId *) mids; + + return MFX_ERR_NONE; + +error: + if (mids) { + for (guint i = 0; i < response->NumFrameActual; i++) + gst_clear_qsv_frame (&midsi); + + g_free (mids); + } + + response->NumFrameActual = 0; + + return MFX_ERR_MEMORY_ALLOC; +} + +static gboolean +gst_qsv_allocator_copy_cached_response (GstQsvAllocator * self, + mfxFrameAllocResponse * dst, mfxFrameAllocResponse * src) +{ + GstQsvFrame **mids; + + if (src->NumFrameActual == 0) + return FALSE; + + mids = g_new0 (GstQsvFrame *, src->NumFrameActual); + + for (guint i = 0; i < src->NumFrameActual; i++) { + GstQsvFrame *frame = (GstQsvFrame *) src->midsi; + + midsi = gst_qsv_frame_ref (frame); + } + + dst->NumFrameActual = src->NumFrameActual; + dst->mids = (mfxMemId *) mids; + + return TRUE; +} + +static mfxStatus +gst_qsv_allocator_alloc (mfxHDL pthis, + mfxFrameAllocRequest * request, mfxFrameAllocResponse * response) +{ + GstQsvAllocator *self = GST_QSV_ALLOCATOR (pthis); + GstQsvAllocatorPrivate *priv = self->priv; + GstQsvAllocatorClass *klass; + mfxStatus status; + mfxFrameAllocRequest req = *request; + gboolean dummy_alloc = priv->dummy_alloc; + + GST_INFO_OBJECT (self, "Alloc, Request Type: 0x%x, %dx%d (%dx%d)", + req.Type, req.Info.Width, req.Info.Height, + req.Info.CropW, req.Info.CropH); + + /* Apply extra_alloc_size only for GST internal use case */ + if ((request->Type & MFX_MEMTYPE_EXTERNAL_FRAME) != 0) + req.NumFrameSuggested += priv->extra_alloc_size; + + if (req.Info.CropW == 0 || req.Info.CropH == 0) { + req.Info.CropW = req.Info.Width; + req.Info.CropH = req.Info.Height; + } + + if (request->Info.FourCC == MFX_FOURCC_P8 || + (request->Type & MFX_MEMTYPE_EXTERNAL_FRAME) == 0) { + dummy_alloc = FALSE; + } + + GST_INFO_OBJECT (self, "Dummy alloc %d", dummy_alloc); + + if ((request->Type & MFX_MEMTYPE_SYSTEM_MEMORY) != 0) { + status = gst_qsv_allocator_alloc_default (self, + dummy_alloc, &req, response); + } else { + klass = GST_QSV_ALLOCATOR_GET_CLASS (self); + g_assert (klass->alloc); + + status = klass->alloc (self, dummy_alloc, &req, response); + } + + if (status != MFX_ERR_NONE) + return status; + + /* Cache this respons so that this can be accessible from GST side */ + if (dummy_alloc) { + gst_qsv_allocator_free ((mfxHDL) self, &priv->response); + gst_qsv_allocator_copy_cached_response (self, &priv->response, response); + } + + return MFX_ERR_NONE; +} + +static mfxStatus +gst_qsv_allocator_lock (mfxHDL pthis, mfxMemId mid, mfxFrameData * ptr) +{ + GstQsvAllocator *self = GST_QSV_ALLOCATOR (pthis); + GstQsvFrame *frame = (GstQsvFrame *) mid; + guint stride; + + GST_TRACE_OBJECT (self, "Lock mfxMemId %p", mid); + + g_mutex_lock (&frame->lock); + if (!frame->buffer) { + GST_ERROR_OBJECT (self, "MemId %p doesn't hold buffer", mid); + g_mutex_unlock (&frame->lock); + return MFX_ERR_LOCK_MEMORY; + } + + if (frame->map_count == 0) { + guint map_flags = (guint) frame->map_flags; + map_flags &= ~((guint) GST_MAP_QSV); + + gst_video_frame_map (&frame->frame, &frame->info, frame->buffer, + (GstMapFlags) map_flags); + } + + frame->map_count++; + stride = GST_VIDEO_FRAME_PLANE_STRIDE (&frame->frame, 0); + + /* FIXME: check and handle other formats */ + switch (GST_VIDEO_INFO_FORMAT (&frame->info)) { + case GST_VIDEO_FORMAT_NV12: + case GST_VIDEO_FORMAT_P010_10LE: + case GST_VIDEO_FORMAT_P016_LE: + ptr->Pitch = (mfxU16) stride; + ptr->Y = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); + ptr->UV = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 1); + break; + case GST_VIDEO_FORMAT_VUYA: + ptr->PitchHigh = (mfxU16) (stride / (1 << 16)); + ptr->PitchLow = (mfxU16) (stride % (1 << 16)); + ptr->V = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); + ptr->U = ptr->V + 1; + ptr->Y = ptr->V + 2; + ptr->A = ptr->V + 3; + break; + case GST_VIDEO_FORMAT_Y410: + ptr->PitchHigh = (mfxU16) (stride / (1 << 16)); + ptr->PitchLow = (mfxU16) (stride % (1 << 16)); + ptr->Y410 = (mfxY410 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); + break; + case GST_VIDEO_FORMAT_BGRA: + ptr->Pitch = (mfxU16) stride; + ptr->B = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); + ptr->G = ptr->B + 1; + ptr->R = ptr->B + 2; + ptr->A = ptr->B + 3; + break; + case GST_VIDEO_FORMAT_RGBA: + ptr->Pitch = (mfxU16) stride; + ptr->R = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); + ptr->G = ptr->R + 1; + ptr->B = ptr->R + 2; + ptr->A = ptr->R + 3; + break; + case GST_VIDEO_FORMAT_YUY2: + ptr->Pitch = (mfxU16) stride; + ptr->Y = (mfxU8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame->frame, 0); + ptr->U = ptr->Y + 1; + ptr->V = ptr->Y + 3; + break; + default: + break; + } + + g_mutex_unlock (&frame->lock); + + return MFX_ERR_NONE; +} + +static mfxStatus +gst_qsv_allocator_unlock (mfxHDL pthis, mfxMemId mid, mfxFrameData * ptr) +{ + GstQsvAllocator *self = GST_QSV_ALLOCATOR (pthis); + GstQsvFrame *frame = (GstQsvFrame *) mid; + + GST_TRACE_OBJECT (self, "Unlock mfxMemId %p", mid); + + g_mutex_lock (&frame->lock); + + if (frame->map_count > 0) { + frame->map_count--; + + if (frame->map_count == 0) + gst_video_frame_unmap (&frame->frame); + } else { + GST_WARNING_OBJECT (self, "Unlock request for non-locked memory"); + } + + g_mutex_unlock (&frame->lock); + + /* SDK will not re-lock unless we clear data pointer here. It happens + * on Linux with BGRA JPEG encoding */ + ptr->R = nullptr; + ptr->G = nullptr; + ptr->B = nullptr; + ptr->A = nullptr; + + return MFX_ERR_NONE; +} + +static mfxStatus +gst_qsv_allocator_get_hdl (mfxHDL pthis, mfxMemId mid, mfxHDL * handle) +{ + GstQsvAllocator *self = GST_QSV_ALLOCATOR (pthis); + GstQsvFrame *frame = GST_QSV_FRAME_CAST (mid); + GstMapInfo map_info; + + if (!GST_QSV_MEM_TYPE_IS_VIDEO (frame->mem_type)) + return MFX_ERR_UNSUPPORTED; + + g_mutex_lock (&frame->lock); + if (!frame->buffer) { + GST_ERROR_OBJECT (self, "MemId %p doesn't hold buffer", mid); + g_mutex_unlock (&frame->lock); + + return MFX_ERR_UNSUPPORTED; + } + + g_assert ((frame->map_flags & GST_MAP_QSV) != 0); + if (!gst_buffer_map (frame->buffer, &map_info, frame->map_flags)) { + GST_ERROR_OBJECT (self, "Failed to map buffer"); + g_mutex_unlock (&frame->lock); + + return MFX_ERR_UNSUPPORTED; + } + + GST_TRACE_OBJECT (self, "Get handle for mfxMemId %p", mid); + +#ifdef G_OS_WIN32 + mfxHDLPair *pair = (mfxHDLPair *) handle; + pair->first = (mfxHDL) map_info.data; + + /* GstD3D11 will fill user_data0 with subresource index */ + pair->second = (mfxHDL) map_info.user_data0; +#else + *handle = (mfxHDL) map_info.data; +#endif + + /* XXX: Ideally we should unmap only when this surface is unlocked... */ + gst_buffer_unmap (frame->buffer, &map_info); + g_mutex_unlock (&frame->lock); + + return MFX_ERR_NONE; +} + +static mfxStatus +gst_qsv_allocator_free (mfxHDL pthis, mfxFrameAllocResponse * response) +{ + GstQsvFrame **frames = (GstQsvFrame **) response->mids; + + for (guint i = 0; i < response->NumFrameActual; i++) + gst_clear_qsv_frame (&framesi); + + g_clear_pointer (&response->mids, g_free); + response->NumFrameActual = 0; + + return MFX_ERR_NONE; +} + +static void +gst_qsv_frame_release (GstQsvFrame * frame) +{ + GstQsvAllocator *allocator = frame->allocator; + + g_mutex_lock (&frame->lock); + if (frame->map_count > 0) { + GST_WARNING_OBJECT (allocator, "Releasing mapped frame %p", frame); + gst_video_frame_unmap (&frame->frame); + } + frame->map_count = 0; + gst_clear_buffer (&frame->buffer); + g_mutex_unlock (&frame->lock); + + GST_MINI_OBJECT_CAST (frame)->dispose = nullptr; + frame->allocator = nullptr; + + GST_TRACE_OBJECT (allocator, "Moving frame %p back to pool", frame); + + gst_atomic_queue_push (allocator->priv->queue, frame); + gst_object_unref (allocator); +} + +static gboolean +gst_qsv_frame_dispose (GstQsvFrame * frame) +{ + g_assert (frame->allocator); + + gst_qsv_frame_ref (frame); + gst_qsv_frame_release (frame); + + return FALSE; +} + +static GstBuffer * +gst_qsv_allocator_upload_default (GstQsvAllocator * allocator, + const GstVideoInfo * info, GstBuffer * buffer, GstBufferPool * pool) +{ + GstBuffer *dst_buf; + GstFlowReturn flow_ret; + GstVideoFrame src_frame, dst_frame; + + flow_ret = gst_buffer_pool_acquire_buffer (pool, &dst_buf, nullptr); + if (flow_ret != GST_FLOW_OK) { + GST_WARNING ("Failed to acquire buffer from pool, return %s", + gst_flow_get_name (flow_ret)); + return nullptr; + } + + gst_video_frame_map (&src_frame, info, buffer, GST_MAP_READ); + gst_video_frame_map (&dst_frame, info, dst_buf, GST_MAP_WRITE); + + if (GST_VIDEO_FRAME_WIDTH (&src_frame) == GST_VIDEO_FRAME_WIDTH (&dst_frame) + && GST_VIDEO_FRAME_HEIGHT (&src_frame) == + GST_VIDEO_FRAME_HEIGHT (&dst_frame)) { + gst_video_frame_unmap (&src_frame); + gst_video_frame_unmap (&dst_frame); + + gst_buffer_unref (dst_buf); + return gst_buffer_ref (buffer); + } + + for (guint i = 0; i < GST_VIDEO_FRAME_N_PLANES (&src_frame); i++) { + guint src_width_in_bytes, src_height; + guint dst_width_in_bytes, dst_height; + guint width_in_bytes, height; + guint src_stride, dst_stride; + guint8 *src_data, *dst_data; + + src_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&src_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&src_frame, i); + src_height = GST_VIDEO_FRAME_COMP_HEIGHT (&src_frame, i); + src_stride = GST_VIDEO_FRAME_COMP_STRIDE (&src_frame, i); + + dst_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&dst_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&dst_frame, i); + dst_height = GST_VIDEO_FRAME_COMP_HEIGHT (&dst_frame, i); + dst_stride = GST_VIDEO_FRAME_COMP_STRIDE (&dst_frame, i); + + width_in_bytes = MIN (src_width_in_bytes, dst_width_in_bytes); + height = MIN (src_height, dst_height); + + src_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&src_frame, i); + dst_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&dst_frame, i); + + for (guint j = 0; j < height; j++) { + memcpy (dst_data, src_data, width_in_bytes); + dst_data += dst_stride; + src_data += src_stride; + } + } + + gst_video_frame_unmap (&dst_frame); + gst_video_frame_unmap (&src_frame); + + return dst_buf; +} + +/** + * gst_qsv_allocator_acquire_frame: + * @allocator: a #GstQsvAllocator + * @mem_type: a memory type + * @info: a #GstVideoInfo + * @buffer: (nullable) (transfer full): a #GstBuffer + * @pool: (nullable): a #GstBufferPool + * + * Uploads @buffer to video memory if required, and wraps GstBuffer using + * #GstQsvFrame object so that QSV API can access native memory handle + * via mfxFrameAllocator interface. + * + * Returns: a #GstQsvFrame object + */ +GstQsvFrame * +gst_qsv_allocator_acquire_frame (GstQsvAllocator * allocator, + GstQsvMemoryType mem_type, const GstVideoInfo * info, GstBuffer * buffer, + GstBufferPool * pool) +{ + GstQsvAllocatorPrivate *priv; + GstQsvFrame *frame; + guint32 map_flags = 0; + + g_return_val_if_fail (GST_IS_QSV_ALLOCATOR (allocator), nullptr); + + if (GST_QSV_MEM_TYPE_IS_SYSTEM (mem_type) && + GST_QSV_MEM_TYPE_IS_VIDEO (mem_type)) { + GST_ERROR_OBJECT (allocator, "Invalid memory type"); + return nullptr; + } + + if (GST_QSV_MEM_TYPE_IS_VIDEO (mem_type)) { + map_flags = GST_MAP_QSV; + + if ((mem_type & GST_QSV_ENCODER_IN_MEMORY) != 0) { + map_flags |= GST_MAP_READ; + } else if ((mem_type & GST_QSV_DECODER_OUT_MEMORY) != 0 || + (mem_type & GST_QSV_PROCESS_TARGET) != 0) { + map_flags |= GST_MAP_WRITE; + } else { + GST_ERROR_OBJECT (allocator, + "Unknown read/write access for video memory"); + return nullptr; + } + } else if ((mem_type & GST_QSV_ENCODER_IN_MEMORY) != 0) { + map_flags = GST_MAP_READ; + } else { + map_flags = GST_MAP_READWRITE; + } + + priv = allocator->priv; + frame = (GstQsvFrame *) gst_atomic_queue_pop (priv->queue); + + if (!frame) + frame = gst_qsv_frame_new (); + + frame->mem_type = mem_type; + frame->map_flags = (GstMapFlags) map_flags; + frame->info = *info; + + if (!pool) { + frame->buffer = buffer; + } else if (buffer) { + GstBuffer *upload_buf; + + frame->allocator = (GstQsvAllocator *) gst_object_ref (allocator); + GST_MINI_OBJECT_CAST (frame)->dispose = + (GstMiniObjectDisposeFunction) gst_qsv_frame_dispose; + + if (GST_QSV_MEM_TYPE_IS_SYSTEM (mem_type)) { + upload_buf = gst_qsv_allocator_upload_default (allocator, info, buffer, + pool); + } else { + GstQsvAllocatorClass *klass; + + klass = GST_QSV_ALLOCATOR_GET_CLASS (allocator); + g_assert (klass->upload); + + upload_buf = klass->upload (allocator, info, buffer, pool); + } + + gst_buffer_unref (buffer); + + if (!upload_buf) { + GST_WARNING_OBJECT (allocator, "Failed to upload buffer"); + gst_qsv_frame_unref (frame); + + return nullptr; + } + + frame->buffer = upload_buf; + } + + return frame; +} + +static GstBuffer * +gst_qsv_allocator_download_default (GstQsvAllocator * self, + const GstVideoInfo * info, gboolean force_copy, GstQsvFrame * frame, + GstBufferPool * pool) +{ + GstBuffer *buffer = nullptr; + GstFlowReturn ret; + GstVideoFrame dst_frame; + mfxStatus status; + mfxFrameData dummy; + gboolean copy_ret; + + GST_TRACE_OBJECT (self, "Download"); + + if (!force_copy) + return gst_buffer_ref (frame->buffer); + + ret = gst_buffer_pool_acquire_buffer (pool, &buffer, nullptr); + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (self, "Failed to acquire buffer"); + return nullptr; + } + + /* Use gst_qsv_allocator_lock() instead of gst_video_frame_map() to avoid + * redundant map if it's already locked by driver, already locked by driver + * sounds unsafe situaltion though */ + status = gst_qsv_allocator_lock ((mfxHDL) self, (mfxMemId) frame, &dummy); + if (status != MFX_ERR_NONE) { + gst_buffer_unref (buffer); + GST_ERROR_OBJECT (self, "Failed to lock frame"); + return nullptr; + } + + if (!gst_video_frame_map (&dst_frame, info, buffer, GST_MAP_WRITE)) { + gst_qsv_allocator_unlock ((mfxHDL) self, (mfxMemId) frame, &dummy); + gst_buffer_unref (buffer); + GST_ERROR_OBJECT (self, "Failed to map output buffer"); + return nullptr; + } + + copy_ret = gst_video_frame_copy (&dst_frame, &frame->frame); + gst_qsv_allocator_unlock ((mfxHDL) self, (mfxMemId) frame, &dummy); + gst_video_frame_unmap (&dst_frame); + + if (!copy_ret) { + GST_ERROR_OBJECT (self, "Failed to copy frame"); + gst_buffer_unref (buffer); + return nullptr; + } + + return buffer; +} + +GstBuffer * +gst_qsv_allocator_download_frame (GstQsvAllocator * allocator, + gboolean force_copy, GstQsvFrame * frame, const GstVideoInfo * pool_info, + GstBufferPool * pool) +{ + GstQsvAllocatorClass *klass; + + g_return_val_if_fail (GST_IS_QSV_ALLOCATOR (allocator), nullptr); + g_return_val_if_fail (GST_IS_QSV_FRAME (frame), nullptr); + g_return_val_if_fail (GST_IS_BUFFER_POOL (pool), nullptr); + + if (GST_QSV_MEM_TYPE_IS_SYSTEM (frame->mem_type)) { + return gst_qsv_allocator_download_default (allocator, pool_info, + force_copy, frame, pool); + } + + klass = GST_QSV_ALLOCATOR_GET_CLASS (allocator); + g_assert (klass->download); + + return klass->download (allocator, pool_info, force_copy, frame, pool); +} + +mfxFrameAllocator * +gst_qsv_allocator_get_allocator_handle (GstQsvAllocator * allocator) +{ + g_return_val_if_fail (GST_IS_QSV_ALLOCATOR (allocator), nullptr); + + return &allocator->priv->allocator; +} + +gboolean +gst_qsv_allocator_get_cached_response (GstQsvAllocator * allocator, + mfxFrameAllocResponse * response) +{ + g_return_val_if_fail (GST_IS_QSV_ALLOCATOR (allocator), FALSE); + + return gst_qsv_allocator_copy_cached_response (allocator, + response, &allocator->priv->response); +} + +void +gst_qsv_allocator_set_options (GstQsvAllocator * allocator, + guint16 extra_alloc_size, gboolean dummy_alloc) +{ + g_return_if_fail (GST_IS_QSV_ALLOCATOR (allocator)); + + allocator->priv->extra_alloc_size = extra_alloc_size; + allocator->priv->dummy_alloc = dummy_alloc; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvallocator.h
Added
@@ -0,0 +1,150 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <mfx.h> + +G_BEGIN_DECLS + +#define GST_TYPE_QSV_FRAME (gst_qsv_frame_get_type()) +#define GST_IS_QSV_FRAME(obj) (GST_IS_MINI_OBJECT_TYPE(obj, GST_TYPE_QSV_FRAME)) +#define GST_QSV_FRAME_CAST(obj) ((GstQsvFrame *) obj) + +#define GST_TYPE_QSV_ALLOCATOR (gst_qsv_allocator_get_type()) +#define GST_QSV_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_QSV_ALLOCATOR, GstQsvAllocator)) +#define GST_QSV_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_QSV_ALLOCATOR, GstQsvAllocatorClass)) +#define GST_IS_QSV_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_QSV_ALLOCATOR)) +#define GST_IS_QSV_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_QSV_ALLOCATOR)) +#define GST_QSV_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_QSV_ALLOCATOR, GstQsvAllocatorClass)) +#define GST_QSV_ALLOCATOR_CAST(obj) ((GstQsvAllocator *)obj) + +typedef struct _GstQsvFrame GstQsvFrame; +typedef struct _GstQsvAllocator GstQsvAllocator; +typedef struct _GstQsvAllocatorClass GstQsvAllocatorClass; +typedef struct _GstQsvAllocatorPrivate GstQsvAllocatorPrivate; + +GType gst_qsv_frame_get_type (void); + +GstBuffer * gst_qsv_frame_peek_buffer (GstQsvFrame * frame); + +gboolean gst_qsv_frame_set_buffer (GstQsvFrame * frame, + GstBuffer * buffer); + +static inline GstQsvFrame * +gst_qsv_frame_ref (GstQsvFrame * frame) +{ + return (GstQsvFrame *) gst_mini_object_ref (GST_MINI_OBJECT_CAST (frame)); +} + +static inline void +gst_qsv_frame_unref (GstQsvFrame * frame) +{ + gst_mini_object_unref (GST_MINI_OBJECT_CAST (frame)); +} + +static inline void +gst_clear_qsv_frame (GstQsvFrame ** frame) +{ + gst_clear_mini_object ((GstMiniObject **) frame); +} + +typedef enum +{ + GST_QSV_SYSTEM_MEMORY = (1 << 0), + GST_QSV_VIDEO_MEMORY = (1 << 1), + GST_QSV_ENCODER_IN_MEMORY = (1 << 2), + GST_QSV_DECODER_OUT_MEMORY = (1 << 3), + GST_QSV_PROCESS_TARGET = (1 << 4), +} GstQsvMemoryType; + +#define GST_QSV_MEM_TYPE_IS_SYSTEM(type) ((type & GST_QSV_SYSTEM_MEMORY) != 0) +#define GST_QSV_MEM_TYPE_IS_VIDEO(type) ((type & GST_QSV_VIDEO_MEMORY) != 0) + +struct _GstQsvAllocator +{ + GstObject parent; + + GstQsvAllocatorPrivate *priv; +}; + +struct _GstQsvAllocatorClass +{ + GstObjectClass parent_class; + + mfxStatus (*alloc) (GstQsvAllocator * allocator, + gboolean dummy_alloc, + mfxFrameAllocRequest * request, + mfxFrameAllocResponse * response); + + GstBuffer * (*upload) (GstQsvAllocator * allocator, + const GstVideoInfo * info, + GstBuffer * buffer, + GstBufferPool * pool); + + GstBuffer * (*download) (GstQsvAllocator * allocator, + const GstVideoInfo * info, + gboolean force_copy, + GstQsvFrame * frame, + GstBufferPool * pool); +}; + +GType gst_qsv_allocator_get_type (void); + +GstQsvFrame * gst_qsv_allocator_acquire_frame (GstQsvAllocator * allocator, + GstQsvMemoryType mem_type, + const GstVideoInfo * info, + GstBuffer * buffer, + GstBufferPool * pool); + +GstBuffer * gst_qsv_allocator_download_frame (GstQsvAllocator * allocator, + gboolean force_copy, + GstQsvFrame * frame, + const GstVideoInfo *pool_info, + GstBufferPool * pool); + +mfxFrameAllocator * gst_qsv_allocator_get_allocator_handle (GstQsvAllocator * allocator); + +gboolean gst_qsv_allocator_get_cached_response (GstQsvAllocator * allocator, + mfxFrameAllocResponse * response); + +void gst_qsv_allocator_set_options (GstQsvAllocator * allocator, + guint16 extra_alloc_size, + gboolean dummy_alloc); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstQsvAllocator, gst_object_unref) + +G_END_DECLS + +#ifdef __cplusplus +inline GstQsvMemoryType +operator | (const GstQsvMemoryType & lhs, const GstQsvMemoryType & rhs) +{ + return static_cast<GstQsvMemoryType> (static_cast<guint>(lhs) | + static_cast<guint> (rhs)); +} + +inline GstQsvMemoryType & +operator |= (GstQsvMemoryType & lhs, const GstQsvMemoryType & rhs) +{ + return lhs = lhs | rhs; +} +#endif
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvallocator_d3d11.cpp
Added
@@ -0,0 +1,603 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvallocator_d3d11.h" +#include <string.h> +#include <wrl.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +GST_DEBUG_CATEGORY_EXTERN (gst_qsv_allocator_debug); +#define GST_CAT_DEFAULT gst_qsv_allocator_debug + +struct _GstQsvD3D11Allocator +{ + GstQsvAllocator parent; + + GstD3D11Device *device; + GstD3D11Fence *fence; +}; + +#define gst_qsv_d3d11_allocator_parent_class parent_class +G_DEFINE_TYPE (GstQsvD3D11Allocator, gst_qsv_d3d11_allocator, + GST_TYPE_QSV_ALLOCATOR); + +static void gst_qsv_d3d11_allocator_dispose (GObject * object); +static mfxStatus gst_qsv_d3d11_allocator_alloc (GstQsvAllocator * allocator, + gboolean dummy_alloc, mfxFrameAllocRequest * request, + mfxFrameAllocResponse * response); +static GstBuffer *gst_qsv_d3d11_allocator_upload (GstQsvAllocator * allocator, + const GstVideoInfo * info, GstBuffer * buffer, GstBufferPool * pool); +static GstBuffer *gst_qsv_d3d11_allocator_download (GstQsvAllocator * allocator, + const GstVideoInfo * info, gboolean force_copy, GstQsvFrame * frame, + GstBufferPool * pool); + +static void +gst_qsv_d3d11_allocator_class_init (GstQsvD3D11AllocatorClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstQsvAllocatorClass *alloc_class = GST_QSV_ALLOCATOR_CLASS (klass); + + object_class->dispose = gst_qsv_d3d11_allocator_dispose; + + alloc_class->alloc = GST_DEBUG_FUNCPTR (gst_qsv_d3d11_allocator_alloc); + alloc_class->upload = GST_DEBUG_FUNCPTR (gst_qsv_d3d11_allocator_upload); + alloc_class->download = GST_DEBUG_FUNCPTR (gst_qsv_d3d11_allocator_download); +} + +static void +gst_qsv_d3d11_allocator_init (GstQsvD3D11Allocator * self) +{ +} + +static void +gst_qsv_d3d11_allocator_dispose (GObject * object) +{ + GstQsvD3D11Allocator *self = GST_QSV_D3D11_ALLOCATOR (object); + + gst_clear_d3d11_fence (&self->fence); + gst_clear_object (&self->device); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static mfxStatus +gst_qsv_d3d11_allocator_alloc (GstQsvAllocator * allocator, + gboolean dummy_alloc, mfxFrameAllocRequest * request, + mfxFrameAllocResponse * response) +{ + GstQsvD3D11Allocator *self = GST_QSV_D3D11_ALLOCATOR (allocator); + DXGI_FORMAT dxgi_format = DXGI_FORMAT_UNKNOWN; + GstQsvFrame **mids = nullptr; + + /* Something unexpected and went wrong */ + if ((request->Type & MFX_MEMTYPE_SYSTEM_MEMORY) != 0) { + GST_ERROR_OBJECT (self, + "MFX is requesting system memory, type 0x%x", request->Type); + return MFX_ERR_UNSUPPORTED; + } + + switch (request->Info.FourCC) { + case MFX_FOURCC_NV12: + dxgi_format = DXGI_FORMAT_NV12; + break; + case MFX_FOURCC_P010: + dxgi_format = DXGI_FORMAT_P010; + break; + case MFX_FOURCC_P016: + dxgi_format = DXGI_FORMAT_P016; + break; + case MFX_FOURCC_AYUV: + dxgi_format = DXGI_FORMAT_AYUV; + break; + case MFX_FOURCC_Y410: + dxgi_format = DXGI_FORMAT_Y410; + break; + case MFX_FOURCC_RGB4: + dxgi_format = DXGI_FORMAT_B8G8R8A8_UNORM; + break; + case MFX_FOURCC_BGR4: + dxgi_format = DXGI_FORMAT_R8G8B8A8_UNORM; + break; + case MFX_FOURCC_YUY2: + dxgi_format = DXGI_FORMAT_YUY2; + break; + default: + /* TODO: add more formats */ + break; + } + + if (dxgi_format == DXGI_FORMAT_UNKNOWN && + request->Info.FourCC != MFX_FOURCC_P8) { + GST_ERROR_OBJECT (self, "Failed to convert %d to DXGI format", + request->Info.FourCC); + + return MFX_ERR_UNSUPPORTED; + } + + if (request->Info.FourCC == MFX_FOURCC_P8) { + D3D11_BUFFER_DESC desc; + GstVideoInfo info; + GstMemory *mem; + GstBuffer *buffer; + gsize offsetGST_VIDEO_MAX_PLANES = { 0, }; + gint strideGST_VIDEO_MAX_PLANES = { 0, }; + guint size; + + memset (&desc, 0, sizeof (D3D11_BUFFER_DESC)); + + desc.ByteWidth = request->Info.Width * request->Info.Height; + desc.Usage = D3D11_USAGE_STAGING; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + + mem = gst_d3d11_allocator_alloc_buffer (nullptr, self->device, &desc); + if (!mem) { + GST_ERROR_OBJECT (self, "Failed to allocate buffer"); + return MFX_ERR_MEMORY_ALLOC; + } + + size = request->Info.Width * request->Info.Height; + stride0 = size; + + gst_video_info_set_format (&info, GST_VIDEO_FORMAT_GRAY8, size, 1); + + buffer = gst_buffer_new (); + gst_buffer_append_memory (buffer, mem); + gst_buffer_add_video_meta_full (buffer, GST_VIDEO_FRAME_FLAG_NONE, + GST_VIDEO_FORMAT_GRAY8, size, 1, 1, offset, stride); + + mids = g_new0 (GstQsvFrame *, 1); + response->NumFrameActual = 1; + mids0 = gst_qsv_allocator_acquire_frame (allocator, + GST_QSV_VIDEO_MEMORY | GST_QSV_ENCODER_IN_MEMORY, &info, buffer, + nullptr); + } else { + GstBufferPool *pool; + GstVideoFormat format; + GstVideoInfo info; + GstCaps *caps; + GstStructure *config; + GstD3D11AllocationParams *params; + guint bind_flags = 0; + GstVideoAlignment align; + GstQsvMemoryType mem_type = GST_QSV_VIDEO_MEMORY; + + if ((request->Type & MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET) != 0) { + bind_flags |= D3D11_BIND_VIDEO_ENCODER; + mem_type |= GST_QSV_ENCODER_IN_MEMORY; + } + + if ((request->Type & MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET) != 0) { + bind_flags |= D3D11_BIND_DECODER; + mem_type |= GST_QSV_DECODER_OUT_MEMORY; + } + + if ((request->Type & MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET) != 0) { + bind_flags |= D3D11_BIND_RENDER_TARGET; + mem_type |= GST_QSV_PROCESS_TARGET; + } + + if (mem_type == GST_QSV_VIDEO_MEMORY) { + GST_ERROR_OBJECT (self, "Unknown read/write access"); + return MFX_ERR_UNSUPPORTED; + } + + mids = g_new0 (GstQsvFrame *, request->NumFrameSuggested); + response->NumFrameActual = request->NumFrameSuggested; + + format = gst_d3d11_dxgi_format_to_gst (dxgi_format); + gst_video_info_set_format (&info, + format, request->Info.CropW, request->Info.CropH); + + if (dummy_alloc) { + for (guint i = 0; i < request->NumFrameSuggested; i++) { + midsi = gst_qsv_allocator_acquire_frame (allocator, + mem_type, &info, nullptr, nullptr); + } + + response->mids = (mfxMemId *) mids; + + return MFX_ERR_NONE; + } + + caps = gst_video_info_to_caps (&info); + gst_video_alignment_reset (&align); + align.padding_right = request->Info.Width - request->Info.CropW; + align.padding_bottom = request->Info.Height - request->Info.CropH; + + pool = gst_d3d11_buffer_pool_new (self->device); + params = gst_d3d11_allocation_params_new (self->device, &info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, bind_flags, 0); + + gst_d3d11_allocation_params_alignment (params, &align); + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_d3d11_allocation_params (config, params); + gst_d3d11_allocation_params_free (params); + gst_buffer_pool_config_set_params (config, caps, + GST_VIDEO_INFO_SIZE (&info), 0, 0); + gst_caps_unref (caps); + gst_buffer_pool_set_config (pool, config); + gst_buffer_pool_set_active (pool, TRUE); + + for (guint i = 0; i < request->NumFrameSuggested; i++) { + GstBuffer *buffer; + + if (gst_buffer_pool_acquire_buffer (pool, &buffer, nullptr) != + GST_FLOW_OK) { + GST_ERROR_OBJECT (self, "Failed to allocate texture buffer"); + gst_buffer_pool_set_active (pool, FALSE); + gst_object_unref (pool); + goto error; + } + + midsi = gst_qsv_allocator_acquire_frame (allocator, + mem_type, &info, buffer, nullptr); + } + + gst_buffer_pool_set_active (pool, FALSE); + gst_object_unref (pool); + } + + response->mids = (mfxMemId *) mids; + + return MFX_ERR_NONE; + +error: + if (mids) { + for (guint i = 0; i < response->NumFrameActual; i++) + gst_clear_qsv_frame (&midsi); + + g_free (mids); + } + + response->NumFrameActual = 0; + + return MFX_ERR_MEMORY_ALLOC; +} + +static GstBuffer * +gst_qsv_frame_copy_d3d11 (GstQsvD3D11Allocator * self, + const GstVideoInfo * info, GstBuffer * src_buf, GstBuffer * dst_buf, + gboolean shared) +{ + D3D11_TEXTURE2D_DESC src_desc, dst_desc; + D3D11_BOX src_box; + guint subresource_idx; + GstMemory *src_mem, *dst_mem; + GstMapInfo src_info, dst_info; + ID3D11Texture2D *src_tex, *dst_tex; + GstD3D11Device *device; + ID3D11Device *device_handle; + ID3D11DeviceContext *device_context; + ComPtr < IDXGIResource > dxgi_resource; + ComPtr < ID3D11Texture2D > shared_texture; + HANDLE shared_handle; + HRESULT hr; + + GST_TRACE_OBJECT (self, "Copying D3D11 buffer %" GST_PTR_FORMAT, src_buf); + + src_mem = gst_buffer_peek_memory (src_buf, 0); + dst_mem = gst_buffer_peek_memory (dst_buf, 0); + + device = GST_D3D11_MEMORY_CAST (src_mem)->device; + device_handle = gst_d3d11_device_get_device_handle (device); + device_context = gst_d3d11_device_get_device_context_handle (device); + + if (!gst_memory_map (src_mem, + &src_info, (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { + GST_WARNING ("Failed to map src memory"); + gst_buffer_unref (dst_buf); + return nullptr; + } + + if (!gst_memory_map (dst_mem, + &dst_info, (GstMapFlags) (GST_MAP_WRITE | GST_MAP_D3D11))) { + GST_WARNING ("Failed to map dst memory"); + gst_memory_unmap (src_mem, &src_info); + gst_buffer_unref (dst_buf); + return nullptr; + } + + src_tex = (ID3D11Texture2D *) src_info.data; + dst_tex = (ID3D11Texture2D *) dst_info.data; + + src_tex->GetDesc (&src_desc); + dst_tex->GetDesc (&dst_desc); + + subresource_idx = + gst_d3d11_memory_get_subresource_index (GST_D3D11_MEMORY_CAST (src_mem)); + + if (shared) { + hr = dst_tex->QueryInterface (IID_PPV_ARGS (&dxgi_resource)); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, + "IDXGIResource interface is not available, hr: 0x%x", (guint) hr); + goto error; + } + + hr = dxgi_resource->GetSharedHandle (&shared_handle); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Failed to get shared handle, hr: 0x%x", + (guint) hr); + goto error; + } + + hr = device_handle->OpenSharedResource (shared_handle, + IID_PPV_ARGS (&shared_texture)); + + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "Failed to get shared texture, hr: 0x%x", + (guint) hr); + goto error; + } + + dst_tex = shared_texture.Get (); + } + + src_box.left = 0; + src_box.top = 0; + src_box.front = 0; + src_box.back = 1; + src_box.right = MIN (src_desc.Width, dst_desc.Width); + src_box.bottom = MIN (src_desc.Height, dst_desc.Height); + + gst_d3d11_device_lock (device); + if (shared) { + if (self->fence && self->fence->device != device) + gst_clear_d3d11_fence (&self->fence); + + if (!self->fence) + self->fence = gst_d3d11_device_create_fence (device); + + if (!self->fence) { + GST_ERROR_OBJECT (self, "Couldn't crete fence"); + gst_d3d11_device_unlock (device); + goto error; + } + } + + device_context->CopySubresourceRegion (dst_tex, 0, + 0, 0, 0, src_tex, subresource_idx, &src_box); + + if (shared) { + if (!gst_d3d11_fence_signal (self->fence) || + !gst_d3d11_fence_wait (self->fence)) { + GST_ERROR_OBJECT (self, "Couldn't sync GPU operation"); + gst_clear_d3d11_fence (&self->fence); + gst_d3d11_device_unlock (device); + goto error; + } + } + + gst_d3d11_device_unlock (device); + + gst_memory_unmap (dst_mem, &dst_info); + gst_memory_unmap (src_mem, &src_info); + + return dst_buf; + +error: + gst_memory_unmap (dst_mem, &dst_info); + gst_memory_unmap (src_mem, &src_info); + gst_buffer_unref (dst_buf); + + return nullptr; +} + +static GstBuffer * +gst_qsv_frame_upload_sysmem (const GstVideoInfo * info, GstBuffer * src_buf, + GstBuffer * dst_buf) +{ + GstVideoFrame src_frame, dst_frame; + + GST_TRACE ("Uploading sysmem buffer %" GST_PTR_FORMAT, src_buf); + + if (!gst_video_frame_map (&src_frame, info, src_buf, GST_MAP_READ)) { + GST_WARNING ("Failed to map src frame"); + gst_buffer_unref (dst_buf); + return nullptr; + } + + if (!gst_video_frame_map (&dst_frame, info, dst_buf, GST_MAP_WRITE)) { + GST_WARNING ("Failed to map src frame"); + gst_video_frame_unmap (&src_frame); + gst_buffer_unref (dst_buf); + return nullptr; + } + + for (guint i = 0; i < GST_VIDEO_FRAME_N_PLANES (&src_frame); i++) { + guint src_width_in_bytes, src_height; + guint dst_width_in_bytes, dst_height; + guint width_in_bytes, height; + guint src_stride, dst_stride; + guint8 *src_data, *dst_data; + + src_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&src_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&src_frame, i); + src_height = GST_VIDEO_FRAME_COMP_HEIGHT (&src_frame, i); + src_stride = GST_VIDEO_FRAME_COMP_STRIDE (&src_frame, i); + + dst_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&dst_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&src_frame, i); + dst_height = GST_VIDEO_FRAME_COMP_HEIGHT (&src_frame, i); + dst_stride = GST_VIDEO_FRAME_COMP_STRIDE (&dst_frame, i); + + width_in_bytes = MIN (src_width_in_bytes, dst_width_in_bytes); + height = MIN (src_height, dst_height); + + src_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&src_frame, i); + dst_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&dst_frame, i); + + for (guint j = 0; j < height; j++) { + memcpy (dst_data, src_data, width_in_bytes); + dst_data += dst_stride; + src_data += src_stride; + } + } + + gst_video_frame_unmap (&dst_frame); + gst_video_frame_unmap (&src_frame); + + return dst_buf; +} + +static GstBuffer * +gst_qsv_d3d11_allocator_upload (GstQsvAllocator * allocator, + const GstVideoInfo * info, GstBuffer * buffer, GstBufferPool * pool) +{ + GstMemory *mem; + GstD3D11Memory *dmem; + D3D11_TEXTURE2D_DESC desc; + GstBuffer *dst_buf; + GstFlowReturn flow_ret; + gboolean shared_copy = FALSE; + + /* 1) D3D11 buffer from the same d3d11device with ours + * 1-1) Same resolution + * -> Increase refcount and wrap with GstQsvFrame + * 1-2) Different resolution + * -> GPU copy + * 2) non-D3D11 buffer or from other d3d11 device + * -> Always CPU copy + */ + + if (!GST_IS_D3D11_BUFFER_POOL (pool)) { + GST_ERROR_OBJECT (allocator, "Not a d3d11 buffer pool"); + return nullptr; + } + + flow_ret = gst_buffer_pool_acquire_buffer (pool, &dst_buf, nullptr); + if (flow_ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (allocator, + "Failed to acquire buffer from pool, return %s", + gst_flow_get_name (flow_ret)); + return nullptr; + } + + mem = gst_buffer_peek_memory (buffer, 0); + if (!gst_is_d3d11_memory (mem) || gst_buffer_n_memory (buffer) > 1) { + /* d3d11 buffer should hold single memory object */ + return gst_qsv_frame_upload_sysmem (info, buffer, dst_buf); + } + + /* FIXME: Add support for shared texture for GPU copy or wrapping + * texture from different device */ + dmem = GST_D3D11_MEMORY_CAST (mem); + if (dmem->device != GST_D3D11_BUFFER_POOL (pool)->device) { + gint64 luid, other_luid; + g_object_get (dmem->device, "adapter-luid", &luid, nullptr); + g_object_get (GST_D3D11_BUFFER_POOL (pool)->device, + "adapter-luid", &other_luid, nullptr); + if (luid == other_luid) { + shared_copy = TRUE; + } else { + return gst_qsv_frame_upload_sysmem (info, buffer, dst_buf); + } + } + + gst_d3d11_memory_get_texture_desc (dmem, &desc); + + if (desc.Usage == D3D11_USAGE_DEFAULT && !shared_copy) { + GST_TRACE_OBJECT (allocator, "Wrapping D3D11 buffer without copy"); + gst_buffer_unref (dst_buf); + + return gst_buffer_ref (buffer); + } + + return gst_qsv_frame_copy_d3d11 (GST_QSV_D3D11_ALLOCATOR (allocator), info, + buffer, dst_buf, shared_copy); +} + +static GstBuffer * +gst_qsv_d3d11_allocator_download (GstQsvAllocator * allocator, + const GstVideoInfo * info, gboolean force_copy, GstQsvFrame * frame, + GstBufferPool * pool) +{ + GstD3D11BufferPool *d3d11_pool; + GstBuffer *src_buf, *dst_buf; + GstMemory *mem; + GstD3D11Memory *dmem; + GstFlowReturn ret; + + GST_TRACE_OBJECT (allocator, "Download"); + + src_buf = gst_qsv_frame_peek_buffer (frame); + + if (!force_copy) + return gst_buffer_ref (src_buf); + + mem = gst_buffer_peek_memory (src_buf, 0); + if (!gst_is_d3d11_memory (mem) || gst_buffer_n_memory (src_buf) != 1) { + GST_ERROR_OBJECT (allocator, "frame holds invalid d3d11 memory"); + return nullptr; + } + + if (!GST_IS_D3D11_BUFFER_POOL (pool)) { + GST_TRACE_OBJECT (allocator, "Output is not d3d11 memory"); + goto fallback; + } + + dmem = GST_D3D11_MEMORY_CAST (mem); + + /* both pool and qsvframe should hold the same d3d11 device already, + * but checking again */ + d3d11_pool = GST_D3D11_BUFFER_POOL (pool); + if (d3d11_pool->device != dmem->device) { + GST_WARNING_OBJECT (allocator, "Pool holds different device"); + goto fallback; + } + + ret = gst_buffer_pool_acquire_buffer (pool, &dst_buf, nullptr); + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (allocator, "Failed to allocate output buffer"); + return nullptr; + } + + return gst_qsv_frame_copy_d3d11 (GST_QSV_D3D11_ALLOCATOR (allocator), + info, src_buf, dst_buf, FALSE); + +fallback: + GST_MINI_OBJECT_FLAG_SET (mem, GST_D3D11_MEMORY_TRANSFER_NEED_DOWNLOAD); + + return GST_QSV_ALLOCATOR_CLASS (parent_class)->download (allocator, + info, TRUE, frame, pool); +} + +GstQsvAllocator * +gst_qsv_d3d11_allocator_new (GstD3D11Device * device) +{ + GstQsvD3D11Allocator *self; + + g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), nullptr); + + self = (GstQsvD3D11Allocator *) + g_object_new (GST_TYPE_QSV_D3D11_ALLOCATOR, nullptr); + self->device = (GstD3D11Device *) gst_object_ref (device); + + gst_object_ref_sink (self); + + return GST_QSV_ALLOCATOR (self); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvallocator_d3d11.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/d3d11/gstd3d11.h> +#include "gstqsvallocator.h" + +G_BEGIN_DECLS + +#define GST_TYPE_QSV_D3D11_ALLOCATOR (gst_qsv_d3d11_allocator_get_type()) +G_DECLARE_FINAL_TYPE (GstQsvD3D11Allocator, gst_qsv_d3d11_allocator, + GST, QSV_D3D11_ALLOCATOR, GstQsvAllocator); + +GstQsvAllocator * gst_qsv_d3d11_allocator_new (GstD3D11Device * device); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvallocator_va.cpp
Added
@@ -0,0 +1,181 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvallocator_va.h" + +GST_DEBUG_CATEGORY_EXTERN (gst_qsv_allocator_debug); +#define GST_CAT_DEFAULT gst_qsv_allocator_debug + +struct _GstQsvVaAllocator +{ + GstQsvAllocator parent; + + GstVaDisplay *display; +}; + +#define gst_qsv_va_allocator_parent_class parent_class +G_DEFINE_TYPE (GstQsvVaAllocator, gst_qsv_va_allocator, GST_TYPE_QSV_ALLOCATOR); + +static void gst_qsv_va_allocator_dispose (GObject * object); +static mfxStatus gst_qsv_va_allocator_alloc (GstQsvAllocator * allocator, + gboolean dummy_alloc, mfxFrameAllocRequest * request, + mfxFrameAllocResponse * response); +static GstBuffer *gst_qsv_va_allocator_upload (GstQsvAllocator * allocator, + const GstVideoInfo * info, GstBuffer * buffer, GstBufferPool * pool); +static GstBuffer *gst_qsv_va_allocator_download (GstQsvAllocator * allocator, + const GstVideoInfo * info, gboolean force_copy, GstQsvFrame * frame, + GstBufferPool * pool); + +static void +gst_qsv_va_allocator_class_init (GstQsvVaAllocatorClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstQsvAllocatorClass *alloc_class = GST_QSV_ALLOCATOR_CLASS (klass); + + object_class->dispose = gst_qsv_va_allocator_dispose; + + alloc_class->alloc = GST_DEBUG_FUNCPTR (gst_qsv_va_allocator_alloc); + alloc_class->upload = GST_DEBUG_FUNCPTR (gst_qsv_va_allocator_upload); + alloc_class->download = GST_DEBUG_FUNCPTR (gst_qsv_va_allocator_download); +} + +static void +gst_qsv_va_allocator_init (GstQsvVaAllocator * self) +{ +} + +static void +gst_qsv_va_allocator_dispose (GObject * object) +{ + GstQsvVaAllocator *self = GST_QSV_VA_ALLOCATOR (object); + + gst_clear_object (&self->display); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static mfxStatus +gst_qsv_va_allocator_alloc (GstQsvAllocator * allocator, gboolean dummy_alloc, + mfxFrameAllocRequest * request, mfxFrameAllocResponse * response) +{ + GST_ERROR_OBJECT (allocator, "Not implemented"); + + return MFX_ERR_UNSUPPORTED; +} + +static GstBuffer * +gst_qsv_va_allocator_upload (GstQsvAllocator * allocator, + const GstVideoInfo * info, GstBuffer * buffer, GstBufferPool * pool) +{ + GstQsvVaAllocator *self = GST_QSV_VA_ALLOCATOR (allocator); + GstVideoFrame src_frame, dst_frame; + VASurfaceID surface; + GstBuffer *dst_buf; + GstFlowReturn ret; + + surface = gst_va_buffer_get_surface (buffer); + if (surface != VA_INVALID_ID && gst_va_buffer_peek_display (buffer) == + self->display) { + return gst_buffer_ref (buffer); + } + + ret = gst_buffer_pool_acquire_buffer (pool, &dst_buf, nullptr); + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (allocator, "Failed to acquire buffer"); + return nullptr; + } + + if (!gst_video_frame_map (&src_frame, info, buffer, GST_MAP_READ)) { + GST_WARNING_OBJECT (allocator, "Failed to map src frame"); + gst_buffer_unref (dst_buf); + return nullptr; + } + + if (!gst_video_frame_map (&dst_frame, info, dst_buf, GST_MAP_WRITE)) { + GST_WARNING_OBJECT (allocator, "Failed to map src frame"); + gst_video_frame_unmap (&src_frame); + gst_buffer_unref (dst_buf); + return nullptr; + } + + for (guint i = 0; i < GST_VIDEO_FRAME_N_PLANES (&src_frame); i++) { + guint src_width_in_bytes, src_height; + guint dst_width_in_bytes, dst_height; + guint width_in_bytes, height; + guint src_stride, dst_stride; + guint8 *src_data, *dst_data; + + src_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&src_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&src_frame, i); + src_height = GST_VIDEO_FRAME_COMP_HEIGHT (&src_frame, i); + src_stride = GST_VIDEO_FRAME_COMP_STRIDE (&src_frame, i); + + dst_width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&dst_frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&src_frame, i); + dst_height = GST_VIDEO_FRAME_COMP_HEIGHT (&src_frame, i); + dst_stride = GST_VIDEO_FRAME_COMP_STRIDE (&dst_frame, i); + + width_in_bytes = MIN (src_width_in_bytes, dst_width_in_bytes); + height = MIN (src_height, dst_height); + + src_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&src_frame, i); + dst_data = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&dst_frame, i); + + for (guint j = 0; j < height; j++) { + memcpy (dst_data, src_data, width_in_bytes); + dst_data += dst_stride; + src_data += src_stride; + } + } + + gst_video_frame_unmap (&dst_frame); + gst_video_frame_unmap (&src_frame); + + return dst_buf; +} + +static GstBuffer * +gst_qsv_va_allocator_download (GstQsvAllocator * allocator, + const GstVideoInfo * info, gboolean force_copy, GstQsvFrame * frame, + GstBufferPool * pool) +{ + GST_ERROR_OBJECT (allocator, "Not implemented"); + + return nullptr; +} + +GstQsvAllocator * +gst_qsv_va_allocator_new (GstVaDisplay * display) +{ + GstQsvVaAllocator *self; + + g_return_val_if_fail (GST_IS_VA_DISPLAY (display), nullptr); + + self = (GstQsvVaAllocator *) + g_object_new (GST_TYPE_QSV_VA_ALLOCATOR, nullptr); + self->display = (GstVaDisplay *) gst_object_ref (display); + + gst_object_ref_sink (self); + + return GST_QSV_ALLOCATOR (self); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvallocator_va.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/va/gstva.h> +#include "gstqsvallocator.h" + +G_BEGIN_DECLS + +#define GST_TYPE_QSV_VA_ALLOCATOR (gst_qsv_va_allocator_get_type()) +G_DECLARE_FINAL_TYPE (GstQsvVaAllocator, gst_qsv_va_allocator, + GST, QSV_VA_ALLOCATOR, GstQsvAllocator); + +GstQsvAllocator * gst_qsv_va_allocator_new (GstVaDisplay * display); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvav1enc.cpp
Added
@@ -0,0 +1,843 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-qsvav1enc + * @title: qsvav1enc + * + * Intel Quick Sync AV1 encoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc ! qsvav1enc ! av1parse ! matroskamux ! filesink location=out.mkv + * ``` + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvav1enc.h" +#include <vector> +#include <string> +#include <string.h> + +#ifdef G_OS_WIN32 +#include <gst/d3d11/gstd3d11.h> +#else +#include <gst/va/gstva.h> +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_qsv_av1_enc_debug); +#define GST_CAT_DEFAULT gst_qsv_av1_enc_debug + +/** + * GstQsvAV1EncRateControl: + * + * Since: 1.22 + */ +#define GST_TYPE_QSV_AV1_ENC_RATE_CONTROL (gst_qsv_av1_enc_rate_control_get_type ()) +static GType +gst_qsv_av1_enc_rate_control_get_type (void) +{ + static GType rate_control_type = 0; + static const GEnumValue rate_controls = { + /** + * GstQsvAV1EncRateControl::cbr: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_CBR, "Constant Bitrate", "cbr"}, + + /** + * GstQsvAV1EncRateControl::vbr: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_VBR, "Variable Bitrate", "vbr"}, + + /** + * GstQsvAV1EncRateControl::cqp: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_CQP, "Constant Quantizer", "cqp"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&rate_control_type)) { + GType type = + g_enum_register_static ("GstQsvAV1EncRateControl", rate_controls); + g_once_init_leave (&rate_control_type, type); + } + + return rate_control_type; +} + +enum +{ + PROP_0, + PROP_QP_I, + PROP_QP_P, + PROP_GOP_SIZE, + PROP_REF_FRAMES, + PROP_BITRATE, + PROP_MAX_BITRATE, + PROP_RATE_CONTROL, +}; + +#define DEFAULT_QP 0 +#define DEFAULT_GOP_SIZE 0 +#define DEFAULT_REF_FRAMES 1 +#define DEFAULT_BITRATE 2000 +#define DEFAULT_MAX_BITRATE 0 +#define DEFAULT_RATE_CONTROL MFX_RATECONTROL_VBR + +#define DOC_SINK_CAPS_COMM \ + "format = (string) { NV12, P010_10LE }, " \ + "width = (int) 16, 8192 , height = (int) 16, 8192 " + +#define DOC_SINK_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw(memory:VAMemory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw, " DOC_SINK_CAPS_COMM + +#define DOC_SRC_CAPS \ + "video/x-av1, width = (int) 16, 8192 , height = (int) 16, 8192 , " \ + "alignment = (string) tu" + +typedef struct _GstQsvAV1EncClassData +{ + GstCaps *sink_caps; + GstCaps *src_caps; + guint impl_index; + gint64 adapter_luid; + gchar *display_path; + gchar *description; +} GstQsvAV1EncClassData; + +typedef struct _GstQsvAV1Enc +{ + GstQsvEncoder parent; + + mfxExtAV1ResolutionParam resolution_param; + mfxExtAV1BitstreamParam bitstream_param; + + GMutex prop_lock; + /* protected by prop_lock */ + gboolean bitrate_updated; + gboolean property_updated; + + /* properties */ + guint qp_i; + guint qp_p; + guint gop_size; + guint ref_frames; + guint bitrate; + guint max_bitrate; + mfxU16 rate_control; +} GstQsvAV1Enc; + +typedef struct _GstQsvAV1EncClass +{ + GstQsvEncoderClass parent_class; +} GstQsvAV1EncClass; + +static GstElementClass *parent_class = nullptr; + +#define GST_QSV_AV1_ENC(object) ((GstQsvAV1Enc *) (object)) +#define GST_QSV_AV1_ENC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstQsvAV1EncClass)) + +static void gst_qsv_av1_enc_finalize (GObject * object); +static void gst_qsv_av1_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_qsv_av1_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_qsv_av1_enc_set_format (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxVideoParam * param, + GPtrArray * extra_params); +static gboolean gst_qsv_av1_enc_set_output_state (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxSession session); +static GstQsvEncoderReconfigure +gst_qsv_av1_enc_check_reconfigure (GstQsvEncoder * encoder, mfxSession session, + mfxVideoParam * param, GPtrArray * extra_params); + +static void +gst_qsv_av1_enc_class_init (GstQsvAV1EncClass * klass, gpointer data) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstQsvEncoderClass *qsvenc_class = GST_QSV_ENCODER_CLASS (klass); + GstQsvAV1EncClassData *cdata = (GstQsvAV1EncClassData *) data; + GstPadTemplate *pad_templ; + GstCaps *doc_caps; + + qsvenc_class->codec_id = MFX_CODEC_AV1; + qsvenc_class->impl_index = cdata->impl_index; + qsvenc_class->adapter_luid = cdata->adapter_luid; + qsvenc_class->display_path = cdata->display_path; + + object_class->finalize = gst_qsv_av1_enc_finalize; + object_class->set_property = gst_qsv_av1_enc_set_property; + object_class->get_property = gst_qsv_av1_enc_get_property; + + g_object_class_install_property (object_class, PROP_QP_I, + g_param_spec_uint ("qp-i", "QP I", + "Constant quantizer for I frames (0: default)", + 0, 255, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_QP_P, + g_param_spec_uint ("qp-p", "QP P", + "Constant quantizer for P frames (0: default)", + 0, 255, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_GOP_SIZE, + g_param_spec_uint ("gop-size", "GOP Size", + "Number of pictures within a GOP (0: unspecified)", + 0, G_MAXINT, DEFAULT_GOP_SIZE, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_REF_FRAMES, + g_param_spec_uint ("ref-frames", "Reference Frames", + "Number of reference frames (0: unspecified)", + 0, 3, DEFAULT_REF_FRAMES, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_BITRATE, + g_param_spec_uint ("bitrate", "Bitrate", + "Target bitrate in kbit/sec, Ignored when selected rate-control mode " + "is constant QP variants (i.e., \"cqp\" and \"icq\")", + 0, G_MAXUINT16, DEFAULT_BITRATE, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MAX_BITRATE, + g_param_spec_uint ("max-bitrate", "Max Bitrate", + "Maximum bitrate in kbit/sec, Ignored when selected rate-control mode " + "is constant QP variants (i.e., \"cqp\" and \"icq\")", + 0, G_MAXUINT16, DEFAULT_MAX_BITRATE, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_RATE_CONTROL, + g_param_spec_enum ("rate-control", "Rate Control", + "Rate Control Method", GST_TYPE_QSV_AV1_ENC_RATE_CONTROL, + DEFAULT_RATE_CONTROL, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + parent_class = (GstElementClass *) g_type_class_peek_parent (klass); + +#ifdef G_OS_WIN32 + std::string long_name = "Intel Quick Sync Video " + + std::string (cdata->description) + " AV1 Encoder"; + + gst_element_class_set_metadata (element_class, long_name.c_str (), + "Codec/Encoder/Video/Hardware", + "Intel Quick Sync Video AV1 Encoder", + "Seungha Yang <seungha@centricular.com>"); +#else + gst_element_class_set_static_metadata (element_class, + "Intel Quick Sync Video AV1 Encoder", + "Codec/Encoder/Video/Hardware", + "Intel Quick Sync Video AV1 Encoder", + "Seungha Yang <seungha@centricular.com>"); +#endif + + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + qsvenc_class->set_format = GST_DEBUG_FUNCPTR (gst_qsv_av1_enc_set_format); + qsvenc_class->set_output_state = + GST_DEBUG_FUNCPTR (gst_qsv_av1_enc_set_output_state); + qsvenc_class->check_reconfigure = + GST_DEBUG_FUNCPTR (gst_qsv_av1_enc_check_reconfigure); + + gst_type_mark_as_plugin_api (GST_TYPE_QSV_AV1_ENC_RATE_CONTROL, + (GstPluginAPIFlags) 0); + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata->description); + g_free (cdata); +} + +static void +gst_qsv_av1_enc_init (GstQsvAV1Enc * self) +{ + self->qp_i = DEFAULT_QP; + self->qp_p = DEFAULT_QP; + self->gop_size = DEFAULT_GOP_SIZE; + self->ref_frames = DEFAULT_REF_FRAMES; + self->bitrate = DEFAULT_BITRATE; + self->max_bitrate = DEFAULT_MAX_BITRATE; + self->rate_control = DEFAULT_RATE_CONTROL; + + g_mutex_init (&self->prop_lock); +} + +static void +gst_qsv_av1_enc_finalize (GObject * object) +{ + GstQsvAV1Enc *self = GST_QSV_AV1_ENC (object); + + g_mutex_clear (&self->prop_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_qsv_av1_enc_check_update_uint (GstQsvAV1Enc * self, guint * old_val, + guint new_val, gboolean is_bitrate_param) +{ + if (*old_val == new_val) + return; + + g_mutex_lock (&self->prop_lock); + *old_val = new_val; + if (is_bitrate_param) + self->bitrate_updated = TRUE; + else + self->property_updated = TRUE; + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_qsv_av1_enc_check_update_enum (GstQsvAV1Enc * self, mfxU16 * old_val, + gint new_val) +{ + if (*old_val == (mfxU16) new_val) + return; + + g_mutex_lock (&self->prop_lock); + *old_val = (mfxU16) new_val; + self->property_updated = TRUE; + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_qsv_av1_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstQsvAV1Enc *self = GST_QSV_AV1_ENC (object); + + switch (prop_id) { + case PROP_QP_I: + gst_qsv_av1_enc_check_update_uint (self, &self->qp_i, + g_value_get_uint (value), TRUE); + break; + case PROP_QP_P: + gst_qsv_av1_enc_check_update_uint (self, &self->qp_p, + g_value_get_uint (value), TRUE); + break; + case PROP_GOP_SIZE: + gst_qsv_av1_enc_check_update_uint (self, &self->gop_size, + g_value_get_uint (value), FALSE); + break; + case PROP_REF_FRAMES: + gst_qsv_av1_enc_check_update_uint (self, &self->ref_frames, + g_value_get_uint (value), FALSE); + break; + case PROP_BITRATE: + gst_qsv_av1_enc_check_update_uint (self, &self->bitrate, + g_value_get_uint (value), TRUE); + break; + case PROP_MAX_BITRATE: + gst_qsv_av1_enc_check_update_uint (self, &self->max_bitrate, + g_value_get_uint (value), TRUE); + break; + case PROP_RATE_CONTROL: + gst_qsv_av1_enc_check_update_enum (self, &self->rate_control, + g_value_get_enum (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_qsv_av1_enc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstQsvAV1Enc *self = GST_QSV_AV1_ENC (object); + + switch (prop_id) { + case PROP_QP_I: + g_value_set_uint (value, self->qp_i); + break; + case PROP_QP_P: + g_value_set_uint (value, self->qp_p); + break; + case PROP_GOP_SIZE: + g_value_set_uint (value, self->gop_size); + break; + case PROP_REF_FRAMES: + g_value_set_uint (value, self->ref_frames); + break; + case PROP_BITRATE: + g_value_set_uint (value, self->bitrate); + break; + case PROP_MAX_BITRATE: + g_value_set_uint (value, self->max_bitrate); + break; + case PROP_RATE_CONTROL: + g_value_set_enum (value, self->rate_control); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_qsv_av1_enc_init_extra_params (GstQsvAV1Enc * self) +{ + memset (&self->resolution_param, 0, sizeof (mfxExtAV1ResolutionParam)); + memset (&self->bitstream_param, 0, sizeof (mfxExtAV1BitstreamParam)); + + self->resolution_param.Header.BufferId = MFX_EXTBUFF_AV1_RESOLUTION_PARAM; + self->resolution_param.Header.BufferSz = sizeof (mfxExtAV1ResolutionParam); + + self->bitstream_param.Header.BufferId = MFX_EXTBUFF_AV1_BITSTREAM_PARAM; + self->bitstream_param.Header.BufferSz = sizeof (mfxExtAV1BitstreamParam); +} + +static void +gst_qsv_av1_enc_set_bitrate (GstQsvAV1Enc * self, mfxVideoParam * param) +{ + switch (param->mfx.RateControlMethod) { + case MFX_RATECONTROL_CBR: + param->mfx.TargetKbps = param->mfx.MaxKbps = self->bitrate; + param->mfx.BRCParamMultiplier = 1; + break; + case MFX_RATECONTROL_VBR: + param->mfx.TargetKbps = self->bitrate; + param->mfx.MaxKbps = self->max_bitrate; + param->mfx.BRCParamMultiplier = 1; + break; + case MFX_RATECONTROL_CQP: + param->mfx.QPI = self->qp_i; + param->mfx.QPP = self->qp_p; + break; + default: + GST_WARNING_OBJECT (self, + "Unhandled rate-control method %d", self->rate_control); + break; + } +} + +static gboolean +gst_qsv_av1_enc_set_format (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxVideoParam * param, GPtrArray * extra_params) +{ + GstQsvAV1Enc *self = GST_QSV_AV1_ENC (encoder); + GstVideoInfo *info = &state->info; + mfxFrameInfo *frame_info; + mfxExtAV1BitstreamParam *bs_param; + mfxExtAV1ResolutionParam *res_param; + + frame_info = ¶m->mfx.FrameInfo; + + /* QSV expects this resolution, but actual coded frame resolution will be + * signalled via mfxExtAV1Param */ + frame_info->Width = frame_info->CropW = GST_ROUND_UP_16 (info->width); + frame_info->Height = frame_info->CropH = GST_ROUND_UP_16 (info->height); + + frame_info->PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + + if (GST_VIDEO_INFO_FPS_N (info) > 0 && GST_VIDEO_INFO_FPS_D (info) > 0) { + frame_info->FrameRateExtN = GST_VIDEO_INFO_FPS_N (info); + frame_info->FrameRateExtD = GST_VIDEO_INFO_FPS_D (info); + } else { + /* HACK: Same as x264enc */ + frame_info->FrameRateExtN = 25; + frame_info->FrameRateExtD = 1; + } + + frame_info->AspectRatioW = GST_VIDEO_INFO_PAR_N (info); + frame_info->AspectRatioH = GST_VIDEO_INFO_PAR_D (info); + + switch (GST_VIDEO_INFO_FORMAT (info)) { + case GST_VIDEO_FORMAT_NV12: + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; + frame_info->FourCC = MFX_FOURCC_NV12; + frame_info->BitDepthLuma = 8; + frame_info->BitDepthChroma = 8; + frame_info->Shift = 0; + break; + case GST_VIDEO_FORMAT_P010_10LE: + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; + frame_info->FourCC = MFX_FOURCC_P010; + frame_info->BitDepthLuma = 10; + frame_info->BitDepthChroma = 10; + frame_info->Shift = 1; + break; + default: + GST_ERROR_OBJECT (self, "Unexpected format %s", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info))); + return FALSE; + } + + gst_qsv_av1_enc_init_extra_params (self); + res_param = &self->resolution_param; + bs_param = &self->bitstream_param; + + res_param->FrameWidth = GST_VIDEO_INFO_WIDTH (info); + res_param->FrameHeight = GST_VIDEO_INFO_HEIGHT (info); + + /* We will always output raw AV1 frames */ + bs_param->WriteIVFHeaders = MFX_CODINGOPTION_OFF; + + g_mutex_lock (&self->prop_lock); + param->mfx.CodecId = MFX_CODEC_AV1; + param->mfx.CodecProfile = MFX_PROFILE_AV1_MAIN; + param->mfx.GopRefDist = 1; + param->mfx.GopPicSize = self->gop_size; + param->mfx.RateControlMethod = self->rate_control; + param->mfx.NumRefFrame = self->ref_frames; + + gst_qsv_av1_enc_set_bitrate (self, param); + + g_ptr_array_add (extra_params, res_param); + g_ptr_array_add (extra_params, bs_param); + + param->ExtParam = (mfxExtBuffer **) extra_params->pdata; + param->NumExtParam = extra_params->len; + + self->bitrate_updated = FALSE; + self->property_updated = FALSE; + + g_mutex_unlock (&self->prop_lock); + + return TRUE; +} + +static gboolean +gst_qsv_av1_enc_set_output_state (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxSession session) +{ + GstQsvAV1Enc *self = GST_QSV_AV1_ENC (encoder); + GstCaps *caps; + GstTagList *tags; + GstVideoCodecState *out_state; + guint bitrate, max_bitrate; + mfxVideoParam param; + mfxStatus status; + + memset (¶m, 0, sizeof (mfxVideoParam)); + status = MFXVideoENCODE_GetVideoParam (session, ¶m); + if (status < MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to get video param %d (%s)", + QSV_STATUS_ARGS (status)); + return FALSE; + } else if (status != MFX_ERR_NONE) { + GST_WARNING_OBJECT (self, "GetVideoParam returned warning %d (%s)", + QSV_STATUS_ARGS (status)); + } + + caps = gst_caps_from_string ("video/x-av1, profile = (string) main, " + "alignment= (string) tu"); + out_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (encoder), + caps, state); + gst_video_codec_state_unref (out_state); + + tags = gst_tag_list_new_empty (); + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, "qsvav1enc", + nullptr); + + switch (param.mfx.RateControlMethod) { + case MFX_RATECONTROL_CQP: + /* We don't know target/max bitrate in this case */ + break; + default: + max_bitrate = (guint) param.mfx.MaxKbps; + bitrate = (guint) param.mfx.TargetKbps; + if (bitrate > 0) { + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, + GST_TAG_NOMINAL_BITRATE, bitrate * 1000, nullptr); + } + + if (max_bitrate > 0) { + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, + GST_TAG_MAXIMUM_BITRATE, max_bitrate * 1000, nullptr); + } + break; + } + + gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (encoder), + tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (tags); + + return TRUE; +} + +static GstQsvEncoderReconfigure +gst_qsv_av1_enc_check_reconfigure (GstQsvEncoder * encoder, mfxSession session, + mfxVideoParam * param, GPtrArray * extra_params) +{ + GstQsvAV1Enc *self = GST_QSV_AV1_ENC (encoder); + GstQsvEncoderReconfigure ret = GST_QSV_ENCODER_RECONFIGURE_NONE; + + g_mutex_lock (&self->prop_lock); + if (self->property_updated) { + ret = GST_QSV_ENCODER_RECONFIGURE_FULL; + goto done; + } + + if (self->bitrate_updated) { + /* AV1 does not support query with MFX_EXTBUFF_ENCODER_RESET_OPTION + * Just return GST_QSV_ENCODER_RECONFIGURE_BITRATE here. + * Baseclass will care error */ + gst_qsv_av1_enc_set_bitrate (self, param); + + ret = GST_QSV_ENCODER_RECONFIGURE_BITRATE; + } + +done: + self->property_updated = FALSE; + self->bitrate_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return ret; +} + +void +gst_qsv_av1_enc_register (GstPlugin * plugin, guint rank, guint impl_index, + GstObject * device, mfxSession session) +{ + mfxVideoParam param; + mfxInfoMFX *mfx; + std::vector < std::string > supported_formats; + GstQsvResolution max_resolution; + mfxExtAV1ResolutionParam resolution_param; + mfxExtAV1BitstreamParam bitstream_param; + mfxExtBuffer *ext_bufs2; + + GST_DEBUG_CATEGORY_INIT (gst_qsv_av1_enc_debug, "qsvav1enc", 0, "qsvav1enc"); + + memset (¶m, 0, sizeof (mfxVideoParam)); + memset (&max_resolution, 0, sizeof (GstQsvResolution)); + memset (&resolution_param, 0, sizeof (mfxExtAV1ResolutionParam)); + memset (&bitstream_param, 0, sizeof (mfxExtAV1BitstreamParam)); + + resolution_param.Header.BufferId = MFX_EXTBUFF_AV1_RESOLUTION_PARAM; + resolution_param.Header.BufferSz = sizeof (mfxExtAV1ResolutionParam); + + bitstream_param.Header.BufferId = MFX_EXTBUFF_AV1_BITSTREAM_PARAM; + bitstream_param.Header.BufferSz = sizeof (mfxExtAV1BitstreamParam); + bitstream_param.WriteIVFHeaders = MFX_CODINGOPTION_OFF; + + ext_bufs0 = (mfxExtBuffer *) & resolution_param; + ext_bufs1 = (mfxExtBuffer *) & bitstream_param; + + param.AsyncDepth = 4; + param.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; + + mfx = ¶m.mfx; + mfx->LowPower = MFX_CODINGOPTION_UNKNOWN; + mfx->CodecId = MFX_CODEC_AV1; + mfx->CodecProfile = MFX_PROFILE_AV1_MAIN; + + mfx->FrameInfo.Width = mfx->FrameInfo.CropW = GST_ROUND_UP_16 (320); + mfx->FrameInfo.Height = mfx->FrameInfo.CropH = GST_ROUND_UP_16 (240); + mfx->FrameInfo.FrameRateExtN = 30; + mfx->FrameInfo.FrameRateExtD = 1; + mfx->FrameInfo.AspectRatioW = 1; + mfx->FrameInfo.AspectRatioH = 1; + mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + + param.NumExtParam = 2; + param.ExtParam = ext_bufs; + + resolution_param.FrameWidth = 320; + resolution_param.FrameHeight = 240; + + /* MAIN profile covers NV12 and P010 */ + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; + mfx->FrameInfo.BitDepthLuma = 8; + mfx->FrameInfo.BitDepthChroma = 8; + mfx->FrameInfo.Shift = 0; + + if (MFXVideoENCODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) + supported_formats.push_back ("NV12"); + + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_P010; + mfx->FrameInfo.BitDepthLuma = 10; + mfx->FrameInfo.BitDepthChroma = 10; + mfx->FrameInfo.Shift = 1; + + if (MFXVideoENCODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) + supported_formats.push_back ("P010_10LE"); + + if (supported_formats.empty ()) { + GST_INFO_OBJECT (device, "Device doesn't support AV1 encoding"); + return; + } + + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; + mfx->FrameInfo.BitDepthLuma = 8; + mfx->FrameInfo.BitDepthChroma = 8; + mfx->FrameInfo.Shift = 0; + + /* Check max-resolution */ + for (guint i = 0; i < G_N_ELEMENTS (gst_qsv_resolutions); i++) { + mfx->FrameInfo.Width = mfx->FrameInfo.CropW = + GST_ROUND_UP_16 (gst_qsv_resolutionsi.width); + mfx->FrameInfo.Height = mfx->FrameInfo.CropH = + GST_ROUND_UP_16 (gst_qsv_resolutionsi.height); + + resolution_param.FrameWidth = gst_qsv_resolutionsi.width; + resolution_param.FrameHeight = gst_qsv_resolutionsi.height; + + bitstream_param.WriteIVFHeaders = MFX_CODINGOPTION_OFF; + + if (MFXVideoENCODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) + break; + + max_resolution.width = gst_qsv_resolutionsi.width; + max_resolution.height = gst_qsv_resolutionsi.height; + } + + GST_INFO ("Maximum supported resolution: %dx%d", + max_resolution.width, max_resolution.height); + + /* TODO: check supported rate-control methods and expose only supported + * methods, since the device might not be able to support some of them */ + + /* To cover both landscape and portrait, + * select max value (width in this case) */ + guint resolution = MAX (max_resolution.width, max_resolution.height); + std::string sink_caps_str = "video/x-raw"; + + sink_caps_str += ", width=(int) 16, " + std::to_string (resolution) + " "; + sink_caps_str += ", height=(int) 16, " + std::to_string (resolution) + " "; + + /* *INDENT-OFF* */ + if (supported_formats.size () > 1) { + sink_caps_str += ", format=(string) { "; + bool first = true; + for (const auto &iter: supported_formats) { + if (!first) { + sink_caps_str += ", "; + } + + sink_caps_str += iter; + first = false; + } + sink_caps_str += " }"; + } else { + sink_caps_str += ", format=(string) " + supported_formats0; + } + /* *INDENT-ON* */ + + GstCaps *sink_caps = gst_caps_from_string (sink_caps_str.c_str ()); + + /* TODO: Add support for VA */ +#ifdef G_OS_WIN32 + GstCaps *d3d11_caps = gst_caps_copy (sink_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr); + gst_caps_set_features_simple (d3d11_caps, caps_features); + gst_caps_append (d3d11_caps, sink_caps); + sink_caps = d3d11_caps; +#else + GstCaps *va_caps = gst_caps_copy (sink_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_VA, nullptr); + gst_caps_set_features_simple (va_caps, caps_features); + gst_caps_append (va_caps, sink_caps); + sink_caps = va_caps; +#endif + + std::string src_caps_str = "video/x-av1, profile = (string) main, " + "alignment = (string) tu"; + src_caps_str += ", width=(int) 16, " + std::to_string (resolution) + " "; + src_caps_str += ", height=(int) 16, " + std::to_string (resolution) + " "; + + GstCaps *src_caps = gst_caps_from_string (src_caps_str.c_str ()); + + GST_MINI_OBJECT_FLAG_SET (sink_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (src_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GstQsvAV1EncClassData *cdata = g_new0 (GstQsvAV1EncClassData, 1); + cdata->sink_caps = sink_caps; + cdata->src_caps = src_caps; + cdata->impl_index = impl_index; + +#ifdef G_OS_WIN32 + g_object_get (device, "adapter-luid", &cdata->adapter_luid, + "description", &cdata->description, nullptr); +#else + g_object_get (device, "path", &cdata->display_path, nullptr); +#endif + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstQsvAV1EncClass), + nullptr, + nullptr, + (GClassInitFunc) gst_qsv_av1_enc_class_init, + nullptr, + cdata, + sizeof (GstQsvAV1Enc), + 0, + (GInstanceInitFunc) gst_qsv_av1_enc_init, + }; + + type_name = g_strdup ("GstQsvAV1Enc"); + feature_name = g_strdup ("qsvav1enc"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstQsvAV1Device%dEnc", index); + feature_name = g_strdup_printf ("qsvav1device%denc", index); + } + + type = g_type_register_static (GST_TYPE_QSV_ENCODER, type_name, &type_info, + (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvav1enc.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include "gstqsvencoder.h" + +G_BEGIN_DECLS + +void gst_qsv_av1_enc_register (GstPlugin * plugin, + guint rank, + guint impl_index, + GstObject * device, + mfxSession session); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvdecoder.cpp
Added
@@ -0,0 +1,1568 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvdecoder.h" +#include <mfxvideo++.h> +#include <string.h> + +#ifdef G_OS_WIN32 +#include "gstqsvallocator_d3d11.h" + +#include <wrl.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ +#else +#include "gstqsvallocator_va.h" +#endif /* G_OS_WIN32 */ + +GST_DEBUG_CATEGORY_STATIC (gst_qsv_decoder_debug); +#define GST_CAT_DEFAULT gst_qsv_decoder_debug + +#define GST_QSV_DECODER_FLOW_NEW_SEQUENCE GST_FLOW_CUSTOM_SUCCESS_1 + +enum +{ + PROP_0, + PROP_ADAPTER_LUID, + PROP_DEVICE_PATH, +}; + +typedef struct _GstQsvDecoderSurface +{ + mfxFrameSurface1 surface; + + /* mfxFrameSurface1:Data:MemId */ + GstQsvFrame *frame; + gboolean need_output; +} GstQsvDecoderSurface; + +typedef struct _GstQsvDecoderTask +{ + mfxSyncPoint sync_point; + + /* without ownership */ + GstQsvDecoderSurface *surface; +} GstQsvDecoderTask; + +struct _GstQsvDecoderPrivate +{ + GstObject *device; + + GstVideoCodecState *input_state; + GstVideoCodecState *output_state; + GstQsvAllocator *allocator; + + GstBufferPool *internal_pool; + + GstVideoInfo info; + GstVideoInfo aligned_info; + + mfxSession session; + mfxVideoParam video_param; + + /* holding allocated GstQsvFrame, should be cleared via + * mfxFrameAllocator::Free() */ + mfxFrameAllocResponse response; + + MFXVideoDECODE *decoder; + GstQsvMemoryType mem_type; + gboolean use_video_memory; + gboolean have_video_meta; + + gboolean is_live; + + /* Array of GstQsvDecoderSurface */ + GArray *surface_pool; + + /* Array of GstQsvDecoderTask */ + GArray *task_pool; + guint next_task_index; +}; + +/** + * GstQsvDecoder: + * + * Base class for Intel Quick Sync video decoders + * + * Since: 1.22 + */ +#define gst_qsv_decoder_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstQsvDecoder, gst_qsv_decoder, + GST_TYPE_VIDEO_DECODER, G_ADD_PRIVATE (GstQsvDecoder); + GST_DEBUG_CATEGORY_INIT (gst_qsv_decoder_debug, + "qsvdecoder", 0, "qsvdecoder")); + +static void gst_qsv_decoder_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_qsv_decoder_dispose (GObject * object); +static void gst_qsv_decoder_finalize (GObject * object); + +static void gst_qsv_decoder_set_context (GstElement * element, + GstContext * context); + +static gboolean gst_qsv_decoder_open (GstVideoDecoder * decoder); +static gboolean gst_qsv_decoder_stop (GstVideoDecoder * decoder); +static gboolean gst_qsv_decoder_close (GstVideoDecoder * decoder); +static gboolean gst_qsv_decoder_set_format (GstVideoDecoder * decoder, + GstVideoCodecState * state); +static gboolean gst_qsv_decoder_negotiate (GstVideoDecoder * decoder); +static gboolean gst_qsv_decoder_decide_allocation (GstVideoDecoder * decoder, + GstQuery * query); +static gboolean gst_qsv_decoder_sink_query (GstVideoDecoder * decoder, + GstQuery * query); +static gboolean gst_qsv_decoder_src_query (GstVideoDecoder * decoder, + GstQuery * query); +static GstFlowReturn gst_qsv_decoder_handle_frame (GstVideoDecoder * decoder, + GstVideoCodecFrame * frame); +static gboolean gst_qsv_decoder_flush (GstVideoDecoder * decoder); +static GstFlowReturn gst_qsv_decoder_finish (GstVideoDecoder * decoder); +static GstFlowReturn gst_qsv_decoder_drain (GstVideoDecoder * decoder); + +static void gst_qsv_decoder_surface_clear (GstQsvDecoderSurface * surface); +static void gst_qsv_decoder_task_clear (GstQsvDecoderTask * task); +static gboolean gst_qsv_decoder_negotiate_internal (GstVideoDecoder * decoder, + const mfxFrameInfo * frame_info); + +static void +gst_qsv_decoder_class_init (GstQsvDecoderClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoDecoderClass *videodec_class = GST_VIDEO_DECODER_CLASS (klass); + GParamFlags param_flags = (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS); + + object_class->get_property = gst_qsv_decoder_get_property; + object_class->dispose = gst_qsv_decoder_dispose; + object_class->finalize = gst_qsv_decoder_finalize; + +#ifdef G_OS_WIN32 + g_object_class_install_property (object_class, PROP_ADAPTER_LUID, + g_param_spec_int64 ("adapter-luid", "Adapter LUID", + "DXGI Adapter LUID (Locally Unique Identifier) of created device", + G_MININT64, G_MAXINT64, 0, param_flags)); +#else + g_object_class_install_property (object_class, PROP_DEVICE_PATH, + g_param_spec_string ("device-path", "Device Path", + "DRM device path", nullptr, param_flags)); +#endif + + element_class->set_context = GST_DEBUG_FUNCPTR (gst_qsv_decoder_set_context); + + videodec_class->open = GST_DEBUG_FUNCPTR (gst_qsv_decoder_open); + videodec_class->stop = GST_DEBUG_FUNCPTR (gst_qsv_decoder_stop); + videodec_class->close = GST_DEBUG_FUNCPTR (gst_qsv_decoder_close); + videodec_class->negotiate = GST_DEBUG_FUNCPTR (gst_qsv_decoder_negotiate); + videodec_class->decide_allocation = + GST_DEBUG_FUNCPTR (gst_qsv_decoder_decide_allocation); + videodec_class->sink_query = GST_DEBUG_FUNCPTR (gst_qsv_decoder_sink_query); + videodec_class->src_query = GST_DEBUG_FUNCPTR (gst_qsv_decoder_src_query); + videodec_class->set_format = GST_DEBUG_FUNCPTR (gst_qsv_decoder_set_format); + videodec_class->handle_frame = + GST_DEBUG_FUNCPTR (gst_qsv_decoder_handle_frame); + videodec_class->drain = GST_DEBUG_FUNCPTR (gst_qsv_decoder_drain); + videodec_class->finish = GST_DEBUG_FUNCPTR (gst_qsv_decoder_finish); + videodec_class->flush = GST_DEBUG_FUNCPTR (gst_qsv_decoder_flush); + + gst_type_mark_as_plugin_api (GST_TYPE_QSV_DECODER, (GstPluginAPIFlags) 0); +} + +static void +gst_qsv_decoder_init (GstQsvDecoder * self) +{ + GstQsvDecoderPrivate *priv; + + priv = self->priv = + (GstQsvDecoderPrivate *) gst_qsv_decoder_get_instance_private (self); + + priv->surface_pool = g_array_new (FALSE, TRUE, sizeof (GstQsvDecoderSurface)); + g_array_set_clear_func (priv->surface_pool, + (GDestroyNotify) gst_qsv_decoder_surface_clear); + + priv->task_pool = g_array_new (FALSE, TRUE, sizeof (GstQsvDecoderTask)); + g_array_set_clear_func (priv->task_pool, + (GDestroyNotify) gst_qsv_decoder_task_clear); + + gst_video_decoder_set_packetized (GST_VIDEO_DECODER (self), TRUE); +} + +static void +gst_qsv_decoder_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstQsvDecoderClass *klass = GST_QSV_DECODER_GET_CLASS (object); + + switch (prop_id) { + case PROP_ADAPTER_LUID: + g_value_set_int64 (value, klass->adapter_luid); + break; + case PROP_DEVICE_PATH: + g_value_set_string (value, klass->display_path); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_qsv_decoder_dispose (GObject * object) +{ + GstQsvDecoder *self = GST_QSV_DECODER (object); + GstQsvDecoderPrivate *priv = self->priv; + + gst_clear_object (&priv->device); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_qsv_decoder_finalize (GObject * object) +{ + GstQsvDecoder *self = GST_QSV_DECODER (object); + GstQsvDecoderPrivate *priv = self->priv; + + g_array_unref (priv->task_pool); + g_array_unref (priv->surface_pool); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_qsv_decoder_set_context (GstElement * element, GstContext * context) +{ + GstQsvDecoder *self = GST_QSV_DECODER (element); + GstQsvDecoderClass *klass = GST_QSV_DECODER_GET_CLASS (element); + GstQsvDecoderPrivate *priv = self->priv; + +#ifdef G_OS_WIN32 + gst_d3d11_handle_set_context_for_adapter_luid (element, + context, klass->adapter_luid, (GstD3D11Device **) & priv->device); +#else + gst_va_handle_set_context (element, context, klass->display_path, + (GstVaDisplay **) & priv->device); +#endif + + GST_ELEMENT_CLASS (parent_class)->set_context (element, context); +} + +#ifdef G_OS_WIN32 +static gboolean +gst_qsv_decoder_open_platform_device (GstQsvDecoder * self) +{ + GstQsvDecoderPrivate *priv = self->priv; + GstQsvDecoderClass *klass = GST_QSV_DECODER_GET_CLASS (self); + ComPtr < ID3D10Multithread > multi_thread; + HRESULT hr; + ID3D11Device *device_handle; + mfxStatus status; + GstD3D11Device *device; + + if (!gst_d3d11_ensure_element_data_for_adapter_luid (GST_ELEMENT (self), + klass->adapter_luid, (GstD3D11Device **) & priv->device)) { + GST_ERROR_OBJECT (self, "d3d11 device is unavailable"); + return FALSE; + } + + device = GST_D3D11_DEVICE_CAST (priv->device); + priv->allocator = gst_qsv_d3d11_allocator_new (device); + + /* For D3D11 device handle to be used by QSV, multithread protection layer + * must be enabled before the MFXVideoCORE_SetHandle() call. + * + * TODO: Need to check performance impact by this mutithread protection layer, + * since it may have a negative impact on overall pipeline performance. + * If so, we should create decoding session dedicated d3d11 device and + * make use of shared resource */ + device_handle = gst_d3d11_device_get_device_handle (device); + hr = device_handle->QueryInterface (IID_PPV_ARGS (&multi_thread)); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "ID3D10Multithread interface is unavailable"); + return FALSE; + } + + multi_thread->SetMultithreadProtected (TRUE); + status = MFXVideoCORE_SetHandle (priv->session, MFX_HANDLE_D3D11_DEVICE, + device_handle); + if (status != MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to set d3d11 device handle"); + return FALSE; + } + + /* Similar to the QSV encoder, we don't use this allocator for actual + * D3D11 texture allocation. But still required because of QSV API design. + */ + status = MFXVideoCORE_SetFrameAllocator (priv->session, + gst_qsv_allocator_get_allocator_handle (priv->allocator)); + if (status != MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to set frame allocator %d", status); + return FALSE; + } + + return TRUE; +} +#else +static gboolean +gst_qsv_decoder_open_platform_device (GstQsvDecoder * self) +{ + GstQsvDecoderPrivate *priv = self->priv; + GstQsvDecoderClass *klass = GST_QSV_DECODER_GET_CLASS (self); + mfxStatus status; + GstVaDisplay *display; + + if (!gst_va_ensure_element_data (GST_ELEMENT (self), klass->display_path, + (GstVaDisplay **) & priv->device)) { + GST_ERROR_OBJECT (self, "VA display is unavailable"); + return FALSE; + } + + display = GST_VA_DISPLAY (priv->device); + + priv->allocator = gst_qsv_va_allocator_new (display); + + status = MFXVideoCORE_SetHandle (priv->session, MFX_HANDLE_VA_DISPLAY, + gst_va_display_get_va_dpy (display)); + if (status != MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to set VA display handle"); + return FALSE; + } + + status = MFXVideoCORE_SetFrameAllocator (priv->session, + gst_qsv_allocator_get_allocator_handle (priv->allocator)); + if (status != MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to set frame allocator %d", status); + return FALSE; + } + + return TRUE; +} +#endif + +static gboolean +gst_qsv_decoder_open (GstVideoDecoder * decoder) +{ + GstQsvDecoder *self = GST_QSV_DECODER (decoder); + GstQsvDecoderPrivate *priv = self->priv; + GstQsvDecoderClass *klass = GST_QSV_DECODER_GET_CLASS (self); + mfxStatus status; + + status = MFXCreateSession (gst_qsv_get_loader (), klass->impl_index, + &priv->session); + if (status != MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to create session"); + return FALSE; + } + + if (!gst_qsv_decoder_open_platform_device (self)) { + g_clear_pointer (&priv->session, MFXClose); + gst_clear_object (&priv->allocator); + gst_clear_object (&priv->device); + + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_qsv_decoder_reset (GstQsvDecoder * self) +{ + GstQsvDecoderPrivate *priv = self->priv; + + GST_DEBUG_OBJECT (self, "Reset"); + + if (priv->decoder) { + delete priv->decoder; + priv->decoder = nullptr; + } + + if (priv->internal_pool) { + gst_buffer_pool_set_active (priv->internal_pool, FALSE); + gst_clear_object (&priv->internal_pool); + } + + if (priv->allocator) { + mfxFrameAllocator *alloc = + gst_qsv_allocator_get_allocator_handle (priv->allocator); + alloc->Free ((mfxHDL) priv->allocator, &priv->response); + } + memset (&priv->response, 0, sizeof (mfxFrameAllocResponse)); + + g_array_set_size (priv->surface_pool, 0); + g_array_set_size (priv->task_pool, 0); + + return TRUE; +} + +static gboolean +gst_qsv_decoder_stop (GstVideoDecoder * decoder) +{ + GstQsvDecoder *self = GST_QSV_DECODER (decoder); + GstQsvDecoderPrivate *priv = self->priv; + + g_clear_pointer (&priv->input_state, gst_video_codec_state_unref); + g_clear_pointer (&priv->output_state, gst_video_codec_state_unref); + + return gst_qsv_decoder_reset (self); +} + +static gboolean +gst_qsv_decoder_close (GstVideoDecoder * decoder) +{ + GstQsvDecoder *self = GST_QSV_DECODER (decoder); + GstQsvDecoderPrivate *priv = self->priv; + + g_clear_pointer (&priv->session, MFXClose); + gst_clear_object (&priv->allocator); + gst_clear_object (&priv->device); + + return TRUE; +} + +static void +gst_qsv_decoder_surface_clear (GstQsvDecoderSurface * surface) +{ + if (!surface) + return; + + memset (surface, 0, sizeof (GstQsvDecoderSurface)); +} + +static void +gst_qsv_decoder_task_clear (GstQsvDecoderTask * task) +{ + if (!task) + return; + + if (task->surface) { + task->surface->need_output = FALSE; + if (task->surface->frame && task->surface->surface.Data.Locked == 0) + gst_qsv_frame_set_buffer (task->surface->frame, nullptr); + } + + task->surface = nullptr; + task->sync_point = nullptr; +} + +static GstQsvDecoderSurface * +gst_qsv_decoder_get_next_surface (GstQsvDecoder * self) +{ + GstQsvDecoderPrivate *priv = self->priv; + GstQsvDecoderSurface *surface = nullptr; + GstBuffer *buffer; + GstFlowReturn ret; + + /* Clear unlocked frames as well */ + for (guint i = 0; i < priv->surface_pool->len; i++) { + GstQsvDecoderSurface *iter = + &g_array_index (priv->surface_pool, GstQsvDecoderSurface, i); + + if (iter->surface.Data.Locked > 0 || iter->need_output) + continue; + + gst_qsv_frame_set_buffer (iter->frame, nullptr); + + if (!surface) + surface = iter; + } + + if (!surface) { + GST_ERROR_OBJECT (self, "Failed to find unlocked surface"); + return nullptr; + } + + ret = gst_buffer_pool_acquire_buffer (priv->internal_pool, &buffer, nullptr); + if (ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (self, "Failed to allocate buffer"); + return nullptr; + } + + gst_qsv_frame_set_buffer (surface->frame, buffer); + + return surface; +} + +static GstQsvDecoderTask * +gst_qsv_decoder_get_next_task (GstQsvDecoder * self) +{ + GstQsvDecoderPrivate *priv = self->priv; + GstQsvDecoderTask *task; + + task = &g_array_index (priv->task_pool, + GstQsvDecoderTask, priv->next_task_index); + priv->next_task_index++; + priv->next_task_index %= priv->task_pool->len; + + return task; +} + +static GstVideoCodecFrame * +gst_qsv_decoder_find_output_frame (GstQsvDecoder * self, GstClockTime pts) +{ + GList *frames, *iter; + GstVideoCodecFrame *ret = nullptr; + GstVideoCodecFrame *closest = nullptr; + guint64 min_pts_abs_diff = 0; + + /* give up, just returns the oldest frame */ + if (!GST_CLOCK_TIME_IS_VALID (pts)) + return gst_video_decoder_get_oldest_frame (GST_VIDEO_DECODER (self)); + + frames = gst_video_decoder_get_frames (GST_VIDEO_DECODER (self)); + + for (iter = frames; iter; iter = g_list_next (iter)) { + GstVideoCodecFrame *frame = (GstVideoCodecFrame *) iter->data; + guint64 abs_diff; + + if (!GST_CLOCK_TIME_IS_VALID (frame->pts)) + continue; + + if (pts == frame->pts) { + ret = frame; + break; + } + + if (pts >= frame->pts) + abs_diff = pts - frame->pts; + else + abs_diff = frame->pts - pts; + + if (!closest || abs_diff < min_pts_abs_diff) { + closest = frame; + min_pts_abs_diff = abs_diff; + } + } + + if (!ret && closest) + ret = closest; + + if (ret) { + gst_video_codec_frame_ref (ret); + + /* Release older frames, it can happen if input buffer holds only single + * field in case of H264 */ + for (iter = frames; iter; iter = g_list_next (iter)) { + GstVideoCodecFrame *frame = (GstVideoCodecFrame *) iter->data; + + if (frame == ret) + continue; + + if (!GST_CLOCK_TIME_IS_VALID (frame->pts)) + continue; + + if (frame->pts < ret->pts) { + gst_video_decoder_release_frame (GST_VIDEO_DECODER (self), + gst_video_codec_frame_ref (frame)); + } + } + } else { + ret = gst_video_decoder_get_oldest_frame (GST_VIDEO_DECODER (self)); + } + + if (frames) + g_list_free_full (frames, (GDestroyNotify) gst_video_codec_frame_unref); + + return ret; +} + +static GstFlowReturn +gst_qsv_decoder_finish_frame (GstQsvDecoder * self, GstQsvDecoderTask * task, + gboolean flushing) +{ + GstVideoDecoder *vdec = GST_VIDEO_DECODER (self); + GstQsvDecoderPrivate *priv = self->priv; + GstQsvDecoderClass *klass = GST_QSV_DECODER_GET_CLASS (self); + mfxStatus status; + GstVideoCodecFrame *frame; + GstClockTime pts = GST_CLOCK_TIME_NONE; + GstBuffer *buffer; + guint retry_count = 0; + /* magic number */ + const guint retry_threshold = 100; + GstQsvDecoderSurface *surface = task->surface; + GstBufferPool *pool; + gboolean force_copy = FALSE; + + g_assert (surface != nullptr); + g_assert (task->sync_point != nullptr); + + status = MFX_ERR_NONE; + do { + /* magic number 100 ms */ + status = MFXVideoCORE_SyncOperation (priv->session, task->sync_point, 100); + + /* Retry up to 10 sec (100 ms x 100 times), that should be enough time for + * decoding a frame using hardware */ + if (status == MFX_WRN_IN_EXECUTION && retry_count < retry_threshold) { + GST_DEBUG_OBJECT (self, + "Operation is still in execution, retry count (%d/%d)", + retry_count, retry_threshold); + retry_count++; + continue; + } + + break; + } while (TRUE); + + if (flushing) { + gst_qsv_decoder_task_clear (task); + return GST_FLOW_OK; + } + + if (status != MFX_ERR_NONE) { + gst_qsv_decoder_task_clear (task); + + if (status == MFX_ERR_ABORTED) { + GST_INFO_OBJECT (self, "Operation was aborted"); + return GST_FLOW_FLUSHING; + } + + GST_WARNING_OBJECT (self, "SyncOperation returned %d (%s)", + QSV_STATUS_ARGS (status)); + + return GST_FLOW_ERROR; + } + + /* Handle non-keyframe resolution change */ + if (klass->codec_id == MFX_CODEC_VP9) { + guint width, height; + + if (surface->surface.Info.CropW > 0 && surface->surface.Info.CropH > 0) { + width = surface->surface.Info.CropW; + height = surface->surface.Info.CropH; + } else { + width = surface->surface.Info.Width; + height = surface->surface.Info.Height; + } + + if (width != (guint) priv->output_state->info.width || + height != (guint) priv->output_state->info.height) { + GST_DEBUG_OBJECT (self, + "VP9 resolution change %dx%d -> %dx%d, negotiate again", + priv->output_state->info.width, priv->output_state->info.height, + width, height); + if (!gst_qsv_decoder_negotiate_internal (vdec, &surface->surface.Info)) { + GST_ERROR_OBJECT (self, "Could not negotiate with downstream"); + return GST_FLOW_NOT_NEGOTIATED; + } + } + + /* TODO: Use crop meta if supported by downstream. + * Most d3d11 elements supports crop meta */ + if (width != (guint) priv->info.width + || height != (guint) priv->info.height) + force_copy = TRUE; + } + + pts = gst_qsv_timestamp_to_gst (surface->surface.Data.TimeStamp); + pool = gst_video_decoder_get_buffer_pool (vdec); + if (!pool) { + GST_ERROR_OBJECT (self, "Decoder doesn't hold buffer pool"); + gst_qsv_decoder_task_clear (task); + return GST_FLOW_ERROR; + } + + if (priv->use_video_memory) { + /* Copy decoded frame in case of reverse playback, too many bound frame to + * decoder may cause driver unhappy */ + if (vdec->input_segment.rate < 0.0) + force_copy = TRUE; + } else if (!priv->have_video_meta) { + /* downstream does not support video meta, need copy */ + force_copy = TRUE; + } + + /* TODO: Handle non-zero crop-{x,y} position via crop meta or similar */ + buffer = gst_qsv_allocator_download_frame (priv->allocator, force_copy, + surface->frame, &priv->output_state->info, pool); + gst_object_unref (pool); + gst_qsv_decoder_task_clear (task); + + if (!buffer) { + GST_ERROR_OBJECT (self, "No output buffer"); + return GST_FLOW_ERROR; + } + + if (priv->aligned_info.interlace_mode == GST_VIDEO_INTERLACE_MODE_MIXED) { + if ((surface->surface.Info.PicStruct & MFX_PICSTRUCT_FIELD_TFF) != 0) { + GST_BUFFER_FLAG_SET (buffer, + GST_VIDEO_BUFFER_FLAG_TFF | GST_VIDEO_BUFFER_FLAG_INTERLACED); + } else if ((surface->surface.Info.PicStruct & MFX_PICSTRUCT_FIELD_BFF) != 0) { + GST_BUFFER_FLAG_SET (buffer, GST_VIDEO_BUFFER_FLAG_INTERLACED); + GST_BUFFER_FLAG_UNSET (buffer, GST_VIDEO_BUFFER_FLAG_TFF); + } + } + + frame = gst_qsv_decoder_find_output_frame (self, pts); + if (frame) { + frame->pts = pts; + frame->output_buffer = buffer; + + return gst_video_decoder_finish_frame (vdec, frame); + } + + /* Empty available frame, something went wrong but we can just push this + * buffer */ + GST_WARNING_OBJECT (self, "Failed to find corresponding frame"); + GST_BUFFER_PTS (buffer) = pts; + + return gst_pad_push (GST_VIDEO_DECODER_SRC_PAD (self), buffer); +} + +static GstFlowReturn +gst_qsv_decoder_decode_frame (GstQsvDecoder * self, mfxBitstream * bitstream, + gboolean flushing) +{ + GstQsvDecoderPrivate *priv = self->priv; + mfxStatus status; + guint retry_count = 0; + /* magic number */ + const guint retry_threshold = 1000; + GstQsvDecoderSurface *surface = nullptr; + GstFlowReturn ret; + + do { + mfxFrameSurface1 *out_surface = nullptr; + GstQsvDecoderTask *task = gst_qsv_decoder_get_next_task (self); + if (task->sync_point) { + ret = gst_qsv_decoder_finish_frame (self, task, flushing); + + if (ret != GST_FLOW_OK) + return ret; + } + + if (!surface) + surface = gst_qsv_decoder_get_next_surface (self); + + if (!surface) { + GST_ERROR_OBJECT (self, "No available surface"); + return GST_FLOW_ERROR; + } + + status = priv->decoder->DecodeFrameAsync (bitstream, &surface->surface, + &out_surface, &task->sync_point); + + if (status != MFX_ERR_NONE) { + GST_LOG_OBJECT (self, "DecodeFrameAsync returned %d (%s)", + QSV_STATUS_ARGS (status)); + } + + if (out_surface) { + g_assert (task->sync_point != nullptr); + + for (guint i = 0; i < priv->surface_pool->len; i++) { + GstQsvDecoderSurface *iter = + &g_array_index (priv->surface_pool, GstQsvDecoderSurface, i); + + if (iter->surface.Data.MemId == out_surface->Data.MemId) { + task->surface = iter; + break; + } + } + + if (!task->surface) { + GST_ERROR_OBJECT (self, "Failed to find surface"); + gst_qsv_decoder_task_clear (task); + return GST_FLOW_ERROR; + } + + /* Make need-output to hold underlying GstBuffer until output happens */ + task->surface->need_output = TRUE; + } + + switch (status) { + case MFX_ERR_NONE: + case MFX_WRN_VIDEO_PARAM_CHANGED: + if (surface->surface.Data.Locked > 0) + surface = nullptr; + + if (bitstream && bitstream->DataLength == 0) + return GST_FLOW_OK; + break; + case MFX_ERR_MORE_SURFACE: + return GST_FLOW_OK; + case MFX_ERR_INCOMPATIBLE_VIDEO_PARAM: + GST_DEBUG_OBJECT (self, "Found new sequence"); + return GST_QSV_DECODER_FLOW_NEW_SEQUENCE; + case MFX_ERR_MORE_DATA: + return GST_VIDEO_DECODER_FLOW_NEED_DATA; + case MFX_WRN_DEVICE_BUSY: + GST_LOG_OBJECT (self, "GPU is busy, retry count (%d/%d)", + retry_count, retry_threshold); + + if (retry_count > retry_threshold) { + GST_ERROR_OBJECT (self, "Give up"); + return GST_FLOW_ERROR; + } + + retry_count++; + + /* Magic number 1ms */ + g_usleep (1000); + break; + default: + if (status < MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Got error %d (%s)", + QSV_STATUS_ARGS (status)); + return GST_FLOW_ERROR; + } + break; + } + } while (TRUE); + + return GST_FLOW_ERROR; +} + +static GstFlowReturn +gst_qsv_decoder_drain_internal (GstQsvDecoder * self, gboolean flushing) +{ + GstQsvDecoderPrivate *priv = self->priv; + GstFlowReturn ret = GST_FLOW_OK; + + if (!priv->session || !priv->decoder) + return GST_FLOW_OK; + + do { + ret = gst_qsv_decoder_decode_frame (self, nullptr, flushing); + } while (ret != GST_VIDEO_DECODER_FLOW_NEED_DATA && ret >= GST_FLOW_OK); + + for (guint i = 0; i < priv->task_pool->len; i++) { + GstQsvDecoderTask *task = gst_qsv_decoder_get_next_task (self); + + if (!task->sync_point) + continue; + + ret = gst_qsv_decoder_finish_frame (self, task, flushing); + } + + switch (ret) { + case GST_VIDEO_DECODER_FLOW_NEED_DATA: + case GST_QSV_DECODER_FLOW_NEW_SEQUENCE: + return GST_FLOW_OK; + default: + break; + } + + return ret; +} + +static gboolean +gst_qsv_decoder_set_format (GstVideoDecoder * decoder, + GstVideoCodecState * state) +{ + GstQsvDecoder *self = GST_QSV_DECODER (decoder); + GstQsvDecoderPrivate *priv = self->priv; + GstQsvDecoderClass *klass = GST_QSV_DECODER_GET_CLASS (self); + GstQuery *query; + + GST_DEBUG_OBJECT (self, "Set format with %" GST_PTR_FORMAT, state->caps); + + gst_qsv_decoder_drain_internal (self, FALSE); + + g_clear_pointer (&priv->input_state, gst_video_codec_state_unref); + + priv->input_state = gst_video_codec_state_ref (state); + + memset (&priv->video_param, 0, sizeof (mfxVideoParam)); + priv->video_param.mfx.CodecId = klass->codec_id; + + /* If upstream is live, we will use single async-depth for low-latency + * decoding */ + query = gst_query_new_latency (); + if (gst_pad_peer_query (GST_VIDEO_DECODER_SINK_PAD (self), query)) + gst_query_parse_latency (query, &priv->is_live, nullptr, nullptr); + gst_query_unref (query); + + /* We will open decoder later once sequence header is parsed */ + if (klass->set_format) + return klass->set_format (self, state); + + return TRUE; +} + +#ifdef G_OS_WIN32 +static gboolean +gst_qsv_decoder_prepare_d3d11_pool (GstQsvDecoder * self, + GstCaps * caps, GstVideoInfo * info, GstVideoAlignment * align) +{ + GstQsvDecoderPrivate *priv = self->priv; + GstStructure *config; + GstD3D11AllocationParams *params; + GstD3D11Device *device = GST_D3D11_DEVICE_CAST (priv->device); + guint bind_flags = 0; + GstD3D11Format d3d11_format; + + GST_DEBUG_OBJECT (self, "Use d3d11 memory pool"); + + priv->internal_pool = gst_d3d11_buffer_pool_new (device); + config = gst_buffer_pool_get_config (priv->internal_pool); + + gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (info), + &d3d11_format); + + /* May not support DOV, specifically RGB output case */ + if ((d3d11_format.format_support0 & + (guint) D3D11_FORMAT_SUPPORT_DECODER_OUTPUT) != 0) { + bind_flags |= D3D11_BIND_DECODER; + } else if ((d3d11_format.format_support0 & + (guint) D3D11_FORMAT_SUPPORT_RENDER_TARGET) != 0) { + bind_flags |= D3D11_BIND_RENDER_TARGET; + } + /* Bind to shader resource as well for this texture can be used + * in generic pixel shader */ + if ((d3d11_format.format_support0 & (guint) + D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) != 0) + bind_flags |= D3D11_BIND_SHADER_RESOURCE; + + params = gst_d3d11_allocation_params_new (device, info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, bind_flags, 0); + gst_d3d11_allocation_params_alignment (params, align); + gst_buffer_pool_config_set_d3d11_allocation_params (config, params); + gst_d3d11_allocation_params_free (params); + gst_buffer_pool_config_set_params (config, caps, + GST_VIDEO_INFO_SIZE (info), 0, 0); + gst_buffer_pool_set_config (priv->internal_pool, config); + gst_buffer_pool_set_active (priv->internal_pool, TRUE); + + return TRUE; +} +#endif + +static gboolean +gst_qsv_decoder_prepare_system_pool (GstQsvDecoder * self, + GstCaps * caps, GstVideoInfo * info, GstVideoAlignment * align) +{ + GstQsvDecoderPrivate *priv = self->priv; + GstStructure *config; + + GST_DEBUG_OBJECT (self, "Use system memory pool"); + + priv->internal_pool = gst_video_buffer_pool_new (); + config = gst_buffer_pool_get_config (priv->internal_pool); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); + gst_buffer_pool_config_set_video_alignment (config, align); + gst_buffer_pool_config_set_params (config, + caps, GST_VIDEO_INFO_SIZE (info), 0, 0); + + gst_buffer_pool_set_config (priv->internal_pool, config); + gst_buffer_pool_set_active (priv->internal_pool, TRUE); + + return TRUE; +} + +static gboolean +gst_qsv_decoder_prepare_pool (GstQsvDecoder * self, mfxU16 * io_pattern) +{ + GstQsvDecoderPrivate *priv = self->priv; + gboolean ret = FALSE; + GstCaps *caps; + GstVideoAlignment align; + + if (priv->internal_pool) { + gst_buffer_pool_set_active (priv->internal_pool, FALSE); + gst_clear_object (&priv->internal_pool); + } + + caps = gst_video_info_to_caps (&priv->info); + if (!caps) { + GST_ERROR_OBJECT (self, "Failed to convet video-info to caps"); + return FALSE; + } + + gst_video_alignment_reset (&align); + align.padding_right = priv->aligned_info.width - priv->info.width; + align.padding_bottom = priv->aligned_info.height - priv->info.height; + + /* TODO: Add Linux video memory (VA/DMABuf) support */ +#ifdef G_OS_WIN32 + if (priv->use_video_memory) { + priv->mem_type = GST_QSV_VIDEO_MEMORY | GST_QSV_DECODER_OUT_MEMORY; + *io_pattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; + + ret = gst_qsv_decoder_prepare_d3d11_pool (self, caps, &priv->info, &align); + } +#endif + + if (!ret) { + priv->mem_type = GST_QSV_SYSTEM_MEMORY | GST_QSV_DECODER_OUT_MEMORY; + *io_pattern = MFX_IOPATTERN_OUT_SYSTEM_MEMORY; + + ret = gst_qsv_decoder_prepare_system_pool (self, caps, &priv->info, &align); + } + gst_caps_unref (caps); + + return ret; +} + +static gboolean +gst_qsv_decoder_init_session (GstQsvDecoder * self) +{ + GstQsvDecoderPrivate *priv = self->priv; + mfxVideoParam *param = &priv->video_param; + mfxFrameInfo *frame_info = ¶m->mfx.FrameInfo; + MFXVideoDECODE *decoder_handle = nullptr; + mfxFrameAllocRequest request; + mfxStatus status; + + GST_DEBUG_OBJECT (self, "Init session"); + + memset (&request, 0, sizeof (mfxFrameAllocRequest)); + + gst_qsv_decoder_reset (self); + + if (!gst_qsv_decoder_prepare_pool (self, ¶m->IOPattern)) { + GST_ERROR_OBJECT (self, "Failed to prepare pool"); + goto error; + } + + param->AsyncDepth = priv->is_live ? 1 : 4; + + decoder_handle = new MFXVideoDECODE (priv->session); + + /* Additional 4 frames for margin. Actually large pool size would be fine + * because we don't pre-allocate underlying output memory objects */ + gst_qsv_allocator_set_options (priv->allocator, param->AsyncDepth + 4, TRUE); + + status = decoder_handle->Query (param, param); + QSV_CHECK_STATUS (self, status, MFXVideoDECODE::Query); + + status = decoder_handle->QueryIOSurf (param, &request); + QSV_CHECK_STATUS (self, status, MFXVideoDECODE::QueryIOSurf); + + status = decoder_handle->Init (param); + QSV_CHECK_STATUS (self, status, MFXVideoDECODE::Init); + + status = decoder_handle->GetVideoParam (param); + QSV_CHECK_STATUS (self, status, MFXVideoDECODE::GetVideoParam); + + /* In case that we use video memory, MFXVideoDECODE::Init() will invoke + * mfxFrameAllocator::Alloc(). Pull the pre-allocated dummy GstQsvFrame + * objects here and fill with GstBuffer later when needed */ + if (GST_QSV_MEM_TYPE_IS_SYSTEM (priv->mem_type)) { + mfxFrameAllocator *alloc_handle = + gst_qsv_allocator_get_allocator_handle (priv->allocator); + + request.Type |= MFX_MEMTYPE_EXTERNAL_FRAME; + status = alloc_handle->Alloc ((mfxHDL) priv->allocator, &request, + &priv->response); + if (status != MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to allocate system memory frames"); + goto error; + } + } else if (!gst_qsv_allocator_get_cached_response (priv->allocator, + &priv->response)) { + GST_ERROR_OBJECT (self, "Failed to get cached response"); + goto error; + } + + g_array_set_size (priv->surface_pool, priv->response.NumFrameActual); + for (guint i = 0; i < priv->surface_pool->len; i++) { + GstQsvDecoderSurface *surface = &g_array_index (priv->surface_pool, + GstQsvDecoderSurface, i); + GstBuffer *buf; + + gst_qsv_decoder_surface_clear (surface); + surface->surface.Info = *frame_info; + surface->surface.Data.MemId = priv->response.midsi; + + /* holds casted object without ref, to make code cleaner */ + surface->frame = (GstQsvFrame *) surface->surface.Data.MemId; + + /* This frame must not hold buffer at this moment */ + buf = gst_qsv_frame_peek_buffer (surface->frame); + g_assert (buf == nullptr); + } + + g_array_set_size (priv->task_pool, param->AsyncDepth); + for (guint i = 0; i < priv->task_pool->len; i++) { + GstQsvDecoderTask *task = &g_array_index (priv->task_pool, + GstQsvDecoderTask, i); + + gst_qsv_decoder_task_clear (task); + } + priv->next_task_index = 0; + + priv->decoder = decoder_handle; + + return TRUE; + +error: + if (decoder_handle) + delete decoder_handle; + + gst_qsv_decoder_reset (self); + + return FALSE; +} + +static gboolean +gst_qsv_decoder_negotiate_internal (GstVideoDecoder * decoder, + const mfxFrameInfo * frame_info) +{ + GstQsvDecoder *self = GST_QSV_DECODER (decoder); + GstQsvDecoderPrivate *priv = self->priv; + guint width, height; + + width = frame_info->Width; + height = frame_info->Height; + + if (frame_info->CropW > 0 && frame_info->CropH > 0) { + width = frame_info->CropW; + height = frame_info->CropH; + } + + g_clear_pointer (&priv->output_state, gst_video_codec_state_unref); + priv->output_state = + gst_video_decoder_set_interlaced_output_state (GST_VIDEO_DECODER (self), + GST_VIDEO_INFO_FORMAT (&priv->info), + GST_VIDEO_INFO_INTERLACE_MODE (&priv->info), + width, height, priv->input_state); + + priv->output_state->caps = gst_video_info_to_caps (&priv->output_state->info); + priv->use_video_memory = FALSE; + +#ifdef G_OS_WIN32 + GstCaps *peer_caps = + gst_pad_get_allowed_caps (GST_VIDEO_DECODER_SRC_PAD (self)); + GST_DEBUG_OBJECT (self, "Allowed caps %" GST_PTR_FORMAT, peer_caps); + + if (!peer_caps || gst_caps_is_any (peer_caps)) { + GST_DEBUG_OBJECT (self, + "cannot determine output format, use system memory"); + } else { + GstCapsFeatures *features; + guint size = gst_caps_get_size (peer_caps); + + for (guint i = 0; i < size; i++) { + features = gst_caps_get_features (peer_caps, i); + + if (!features) + continue; + + if (gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { + priv->use_video_memory = TRUE; + break; + } + } + } + gst_clear_caps (&peer_caps); + + if (priv->use_video_memory) { + GST_DEBUG_OBJECT (self, "Downstream supports D3D11 memory"); + gst_caps_set_features (priv->output_state->caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr)); + } +#endif + + GST_DEBUG_OBJECT (self, + "Negotiating with %" GST_PTR_FORMAT, priv->output_state->caps); + + return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); +} + +static gboolean +gst_qsv_decoder_negotiate (GstVideoDecoder * decoder) +{ + GstQsvDecoder *self = GST_QSV_DECODER (decoder); + GstQsvDecoderPrivate *priv = self->priv; + GstQsvDecoderClass *klass = GST_QSV_DECODER_GET_CLASS (self); + guint width, height; + guint coded_width, coded_height; + guint aligned_width, aligned_height; + mfxVideoParam *param = &priv->video_param; + mfxFrameInfo *frame_info = ¶m->mfx.FrameInfo; + GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; + GstVideoInterlaceMode interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE; + + width = coded_width = frame_info->Width; + height = coded_height = frame_info->Height; + + if (frame_info->CropW > 0 && frame_info->CropH > 0) { + width = frame_info->CropW; + height = frame_info->CropH; + } + + switch (frame_info->FourCC) { + case MFX_FOURCC_NV12: + format = GST_VIDEO_FORMAT_NV12; + break; + case MFX_FOURCC_P010: + format = GST_VIDEO_FORMAT_P010_10LE; + break; + case MFX_FOURCC_P016: + format = GST_VIDEO_FORMAT_P016_LE; + break; + case MFX_FOURCC_RGB4: + format = GST_VIDEO_FORMAT_BGRA; + break; + default: + break; + } + + if (klass->codec_id == MFX_CODEC_JPEG) { + if (param->mfx.JPEGChromaFormat == MFX_CHROMAFORMAT_YUV422) { + format = GST_VIDEO_FORMAT_YUY2; + frame_info->FourCC = MFX_FOURCC_YUY2; + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV422; + } else if (param->mfx.JPEGColorFormat == MFX_JPEG_COLORFORMAT_RGB) { + format = GST_VIDEO_FORMAT_BGRA; + frame_info->FourCC = MFX_FOURCC_RGB4; + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV444; + } + } + + if (format == GST_VIDEO_FORMAT_UNKNOWN) { + GST_ERROR_OBJECT (self, "Unknown video format"); + return FALSE; + } + + aligned_width = GST_ROUND_UP_16 (coded_width); + if (klass->codec_id == MFX_CODEC_AVC) { + if (frame_info->PicStruct == MFX_PICSTRUCT_PROGRESSIVE) { + aligned_height = GST_ROUND_UP_16 (coded_height); + } else { + aligned_height = GST_ROUND_UP_32 (coded_height); + /* In theory, tff/bff can be altered in a sequence */ + interlace_mode = GST_VIDEO_INTERLACE_MODE_MIXED; + } + } else { + aligned_height = GST_ROUND_UP_16 (coded_height); + } + + frame_info->Width = aligned_width; + frame_info->Height = aligned_height; + + gst_video_info_set_interlaced_format (&priv->info, format, + interlace_mode, width, height); + gst_video_info_set_interlaced_format (&priv->aligned_info, format, + interlace_mode, aligned_width, aligned_height); + + return gst_qsv_decoder_negotiate_internal (decoder, + &priv->video_param.mfx.FrameInfo); +} + +#ifdef G_OS_WIN32 +static gboolean +gst_qsv_decoder_decide_allocation (GstVideoDecoder * decoder, GstQuery * query) +{ + GstQsvDecoder *self = GST_QSV_DECODER (decoder); + GstQsvDecoderPrivate *priv = self->priv; + GstCaps *outcaps; + GstBufferPool *pool = nullptr; + guint n, size, min = 0, max = 0; + GstVideoInfo vinfo; + GstStructure *config; + GstD3D11AllocationParams *d3d11_params; + gboolean use_d3d11_pool; + GstD3D11Device *device = GST_D3D11_DEVICE (priv->device); + + gst_query_parse_allocation (query, &outcaps, nullptr); + + if (!outcaps) { + GST_DEBUG_OBJECT (decoder, "No output caps"); + return FALSE; + } + + priv->have_video_meta = gst_query_find_allocation_meta (query, + GST_VIDEO_META_API_TYPE, nullptr); + use_d3d11_pool = priv->use_video_memory; + + gst_video_info_from_caps (&vinfo, outcaps); + n = gst_query_get_n_allocation_pools (query); + if (n > 0) + gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); + + if (pool && use_d3d11_pool) { + if (!GST_IS_D3D11_BUFFER_POOL (pool)) { + GST_DEBUG_OBJECT (self, + "Downstream pool is not d3d11, will create new one"); + gst_clear_object (&pool); + } else { + GstD3D11BufferPool *dpool = GST_D3D11_BUFFER_POOL (pool); + if (dpool->device != device) { + GST_DEBUG_OBJECT (self, "Different device, will create new one"); + gst_clear_object (&pool); + } + } + } + + if (!pool) { + if (use_d3d11_pool) + pool = gst_d3d11_buffer_pool_new (device); + else + pool = gst_video_buffer_pool_new (); + + size = (guint) vinfo.size; + } + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_params (config, outcaps, size, min, max); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + + /* Decoder will use internal pool to output but this pool is required for + * copying in case of reverse playback */ + if (use_d3d11_pool) { + guint bind_flags = 0; + GstD3D11Format d3d11_format; + + d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); + if (!d3d11_params) { + d3d11_params = gst_d3d11_allocation_params_new (device, &vinfo, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, 0, 0); + } + + gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (&vinfo), + &d3d11_format); + + /* Use both render target (for videoprocessor) and shader resource + * for (pixel shader) bind flags for downstream to be able to use consistent + * conversion path even when we copy textures */ + if ((d3d11_format.format_support0 & + (guint) D3D11_FORMAT_SUPPORT_RENDER_TARGET) != 0) { + bind_flags |= D3D11_BIND_RENDER_TARGET; + } + + if ((d3d11_format.format_support0 & (guint) + D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) != 0) + bind_flags |= D3D11_BIND_SHADER_RESOURCE; + + d3d11_params->desc0.BindFlags |= bind_flags; + gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params); + gst_d3d11_allocation_params_free (d3d11_params); + } + + gst_buffer_pool_set_config (pool, config); + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); + + if (n > 0) + gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); + else + gst_query_add_allocation_pool (query, pool, size, min, max); + gst_object_unref (pool); + + return GST_VIDEO_DECODER_CLASS (parent_class)->decide_allocation (decoder, + query); +} +#else +static gboolean +gst_qsv_decoder_decide_allocation (GstVideoDecoder * decoder, GstQuery * query) +{ + /* TODO: add VA support */ + return GST_VIDEO_DECODER_CLASS (parent_class)->decide_allocation (decoder, + query); +} +#endif /* G_OS_WIN32 */ + +static gboolean +gst_qsv_decoder_handle_context_query (GstQsvDecoder * self, GstQuery * query) +{ + GstQsvDecoderPrivate *priv = self->priv; + +#ifdef G_OS_WIN32 + return gst_d3d11_handle_context_query (GST_ELEMENT (self), query, + (GstD3D11Device *) priv->device); +#else + return gst_va_handle_context_query (GST_ELEMENT (self), query, + (GstVaDisplay *) priv->device); +#endif +} + +static gboolean +gst_qsv_decoder_sink_query (GstVideoDecoder * decoder, GstQuery * query) +{ + GstQsvDecoder *self = GST_QSV_DECODER (decoder); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + if (gst_qsv_decoder_handle_context_query (self, query)) + return TRUE; + break; + default: + break; + } + + return GST_VIDEO_DECODER_CLASS (parent_class)->sink_query (decoder, query); +} + +static gboolean +gst_qsv_decoder_src_query (GstVideoDecoder * decoder, GstQuery * query) +{ + GstQsvDecoder *self = GST_QSV_DECODER (decoder); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + if (gst_qsv_decoder_handle_context_query (self, query)) + return TRUE; + break; + default: + break; + } + + return GST_VIDEO_DECODER_CLASS (parent_class)->src_query (decoder, query); +} + +static GstFlowReturn +gst_qsv_decoder_handle_frame (GstVideoDecoder * decoder, + GstVideoCodecFrame * frame) +{ + GstQsvDecoder *self = GST_QSV_DECODER (decoder); + GstQsvDecoderClass *klass = GST_QSV_DECODER_GET_CLASS (self); + GstQsvDecoderPrivate *priv = self->priv; + mfxBitstream bs; + GstMapInfo info; + mfxStatus status; + GstFlowReturn ret = GST_FLOW_ERROR; + gboolean was_reconfigured = FALSE; + GstBuffer *input_buf = nullptr; + + if (klass->process_input) { + input_buf = klass->process_input (self, priv->decoder ? FALSE : TRUE, + frame->input_buffer); + } else { + input_buf = gst_buffer_ref (frame->input_buffer); + } + + if (!input_buf || !gst_buffer_map (input_buf, &info, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Failed to map input buffer"); + gst_clear_buffer (&input_buf); + gst_video_decoder_release_frame (decoder, frame); + return GST_FLOW_ERROR; + } + + memset (&bs, 0, sizeof (mfxBitstream)); + + bs.Data = (mfxU8 *) info.data; + bs.DataLength = bs.MaxLength = (mfxU32) info.size; + bs.TimeStamp = gst_qsv_timestamp_from_gst (frame->pts); + +new_sequence: + if (!priv->decoder) { + status = MFXVideoDECODE_DecodeHeader (priv->session, + &bs, &priv->video_param); + + if (status != MFX_ERR_NONE) { + if (status == MFX_ERR_MORE_DATA) { + GST_WARNING_OBJECT (self, "Need more date to parse header"); + ret = GST_FLOW_OK; + } else { + GST_ERROR_OBJECT (self, "Failed to parse header %d (%s)", + QSV_STATUS_ARGS (status)); + } + + goto unmap_and_error; + } + + if (!gst_video_decoder_negotiate (decoder)) { + GST_ERROR_OBJECT (self, "Failed to negotiate"); + ret = GST_FLOW_NOT_NEGOTIATED; + goto unmap_and_error; + } + + if (!gst_qsv_decoder_init_session (self)) { + GST_ERROR_OBJECT (self, "Failed to init session"); + return GST_FLOW_ERROR; + } + } + + if (!priv->decoder) { + GST_ERROR_OBJECT (self, "Decoder object was not configured"); + ret = GST_FLOW_NOT_NEGOTIATED; + goto unmap_and_error; + } + + ret = gst_qsv_decoder_decode_frame (self, &bs, FALSE); + + switch (ret) { + case GST_QSV_DECODER_FLOW_NEW_SEQUENCE: + if (!was_reconfigured) { + gst_qsv_decoder_drain_internal (self, FALSE); + gst_qsv_decoder_reset (self); + was_reconfigured = TRUE; + + goto new_sequence; + } + + ret = GST_FLOW_ERROR; + break; + case GST_VIDEO_DECODER_FLOW_NEED_DATA: + ret = GST_FLOW_OK; + break; + default: + break; + } + + gst_buffer_unmap (input_buf, &info); + gst_buffer_unref (input_buf); + gst_video_codec_frame_unref (frame); + + return ret; + +unmap_and_error: + gst_buffer_unmap (input_buf, &info); + gst_buffer_unref (input_buf); + gst_video_decoder_release_frame (decoder, frame); + + return ret; +} + +static gboolean +gst_qsv_decoder_flush (GstVideoDecoder * decoder) +{ + GstQsvDecoder *self = GST_QSV_DECODER (decoder); + + GST_DEBUG_OBJECT (self, "Flush"); + + gst_qsv_decoder_drain_internal (self, TRUE); + + return TRUE; +} + +static GstFlowReturn +gst_qsv_decoder_finish (GstVideoDecoder * decoder) +{ + GstQsvDecoder *self = GST_QSV_DECODER (decoder); + + GST_DEBUG_OBJECT (self, "Finish"); + + return gst_qsv_decoder_drain_internal (self, FALSE); +} + +static GstFlowReturn +gst_qsv_decoder_drain (GstVideoDecoder * decoder) +{ + GstQsvDecoder *self = GST_QSV_DECODER (decoder); + + GST_DEBUG_OBJECT (self, "Drain"); + + return gst_qsv_decoder_drain_internal (self, FALSE); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvdecoder.h
Added
@@ -0,0 +1,84 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <mfx.h> +#include "gstqsvutils.h" + +G_BEGIN_DECLS + +#define GST_TYPE_QSV_DECODER (gst_qsv_decoder_get_type()) +#define GST_QSV_DECODER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_QSV_DECODER, GstQsvDecoder)) +#define GST_QSV_DECODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_QSV_DECODER, GstQsvDecoderClass)) +#define GST_IS_QSV_DECODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_QSV_DECODER)) +#define GST_IS_QSV_DECODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_QSV_DECODER)) +#define GST_QSV_DECODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_QSV_DECODER, GstQsvDecoderClass)) +#define GST_QSV_DECODER_CAST(obj) ((GstQsvDecoder *)obj) + +typedef struct _GstQsvDecoder GstQsvDecoder; +typedef struct _GstQsvDecoderClass GstQsvDecoderClass; +typedef struct _GstQsvDecoderPrivate GstQsvDecoderPrivate; + +typedef struct _GstQsvDecoderClassData +{ + guint impl_index; + gint64 adapter_luid; + gchar *display_path; + gchar *description; + + GstCaps *sink_caps; + GstCaps *src_caps; +} GstQsvDecoderClassData; + +struct _GstQsvDecoder +{ + GstVideoDecoder parent; + + GstQsvDecoderPrivate *priv; +}; + +struct _GstQsvDecoderClass +{ + GstVideoDecoderClass parent_class; + + mfxU32 codec_id; + mfxU32 impl_index; + + /* DXGI adapter LUID, for Windows */ + gint64 adapter_luid; + + /* VA display device path, for Linux */ + gchar *display_path; + + gboolean (*set_format) (GstQsvDecoder * decoder, + GstVideoCodecState * state); + + GstBuffer * (*process_input) (GstQsvDecoder * decoder, + gboolean need_codec_data, + GstBuffer * buffer); +}; + +GType gst_qsv_decoder_get_type (void); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstQsvDecoder, gst_object_unref) + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvencoder.cpp
Added
@@ -0,0 +1,1645 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvencoder.h" +#include <mfxvideo++.h> +#include <string.h> +#include <string> + +#ifdef G_OS_WIN32 +#include "gstqsvallocator_d3d11.h" + +#include <wrl.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ +#else +#include "gstqsvallocator_va.h" +#endif /* G_OS_WIN32 */ + +GST_DEBUG_CATEGORY_STATIC (gst_qsv_encoder_debug); +#define GST_CAT_DEFAULT gst_qsv_encoder_debug + +/** + * GstQsvCodingOption: + * + * Since: 1.22 + */ +GType +gst_qsv_coding_option_get_type (void) +{ + static GType coding_opt_type = 0; + static const GEnumValue coding_opts = { + /** + * GstQsvCodingOption::unknown: + * + * Since: 1.22 + */ + {MFX_CODINGOPTION_UNKNOWN, "Unknown", "unknown"}, + + /** + * GstQsvCodingOption::on: + * + * Since: 1.22 + */ + {MFX_CODINGOPTION_ON, "On", "on"}, + + /** + * GstQsvCodingOption::off: + * + * Since: 1.22 + */ + {MFX_CODINGOPTION_OFF, "Off", "off"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&coding_opt_type)) { + GType type = g_enum_register_static ("GstQsvCodingOption", + coding_opts); + g_once_init_leave (&coding_opt_type, type); + } + + return coding_opt_type; +} + +enum +{ + PROP_0, + PROP_ADAPTER_LUID, + PROP_DEVICE_PATH, + PROP_TARGET_USAGE, + PROP_LOW_LATENCY, +}; + +#define DEFAULT_TARGET_USAGE MFX_TARGETUSAGE_BALANCED +#define DEFAULT_LOW_LATENCY FALSE + +typedef struct _GstQsvEncoderSurface +{ + mfxFrameSurface1 surface; + mfxEncodeCtrl encode_control; + + /* array of mfxPayload (e.g., SEI data) associated with this surface */ + GPtrArray *payload; + + /* holds ownership */ + GstQsvFrame *qsv_frame; +} GstQsvEncoderSurface; + +typedef struct _GstQsvEncoderTask +{ + mfxSyncPoint sync_point; + mfxBitstream bitstream; +} GstQsvEncoderTask; + +struct _GstQsvEncoderPrivate +{ + GstObject *device; + + GstVideoCodecState *input_state; + GstQsvAllocator *allocator; + + /* API specific alignment requirement (multiple of 16 or 32) */ + GstVideoInfo aligned_info; + + mfxSession session; + mfxVideoParam video_param; + + /* List of mfxExtBuffer configured by subclass, subclass will hold + * allocated memory for each mfxExtBuffer */ + GPtrArray *extra_params; + + MFXVideoENCODE *encoder; + GstQsvMemoryType mem_type; + + /* Internal buffer pool used to allocate fallback buffer when input buffer + * is not compatible with expected format/type/resolution etc */ + GstBufferPool *internal_pool; + + /* Array of GstQsvEncoderSurface, holding ownership */ + GArray *surface_pool; + guint next_surface_index; + + /* Array of GstQsvEncoderTask, holding ownership */ + GArray *task_pool; + + GQueue free_tasks; + GQueue pending_tasks; + + /* Properties */ + guint target_usage; + gboolean low_latency; +}; + +/** + * GstQsvEncoder: + * + * Base class for Intel Quick Sync video encoders + * + * Since: 1.22 + */ +#define gst_qsv_encoder_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstQsvEncoder, gst_qsv_encoder, + GST_TYPE_VIDEO_ENCODER, G_ADD_PRIVATE (GstQsvEncoder); + GST_DEBUG_CATEGORY_INIT (gst_qsv_encoder_debug, + "qsvencoder", 0, "qsvencoder")); + +static void gst_qsv_encoder_dispose (GObject * object); +static void gst_qsv_encoder_finalize (GObject * object); +static void gst_qsv_encoder_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_qsv_encoder_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static void gst_qsv_encoder_set_context (GstElement * element, + GstContext * context); + +static gboolean gst_qsv_encoder_open (GstVideoEncoder * encoder); +static gboolean gst_qsv_encoder_stop (GstVideoEncoder * encoder); +static gboolean gst_qsv_encoder_close (GstVideoEncoder * encoder); +static gboolean gst_qsv_encoder_set_format (GstVideoEncoder * encoder, + GstVideoCodecState * state); +static GstFlowReturn gst_qsv_encoder_handle_frame (GstVideoEncoder * encoder, + GstVideoCodecFrame * frame); +static GstFlowReturn gst_qsv_encoder_finish (GstVideoEncoder * encoder); +static gboolean gst_qsv_encoder_flush (GstVideoEncoder * encoder); +static gboolean gst_qsv_encoder_sink_query (GstVideoEncoder * encoder, + GstQuery * query); +static gboolean gst_qsv_encoder_src_query (GstVideoEncoder * encoder, + GstQuery * query); +static gboolean gst_qsv_encoder_propose_allocation (GstVideoEncoder * encoder, + GstQuery * query); + +static void gst_qsv_encoder_surface_clear (GstQsvEncoderSurface * task); +static void gst_qsv_encoder_task_clear (GstQsvEncoderTask * task); + +static void +gst_qsv_encoder_class_init (GstQsvEncoderClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoEncoderClass *videoenc_class = GST_VIDEO_ENCODER_CLASS (klass); + GParamFlags param_flags = (GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT | + GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS); + + object_class->dispose = gst_qsv_encoder_dispose; + object_class->finalize = gst_qsv_encoder_finalize; + object_class->set_property = gst_qsv_encoder_set_property; + object_class->get_property = gst_qsv_encoder_get_property; + +#ifdef G_OS_WIN32 + g_object_class_install_property (object_class, PROP_ADAPTER_LUID, + g_param_spec_int64 ("adapter-luid", "Adapter LUID", + "DXGI Adapter LUID (Locally Unique Identifier) of created device", + G_MININT64, G_MAXINT64, 0, param_flags)); +#else + g_object_class_install_property (object_class, PROP_DEVICE_PATH, + g_param_spec_string ("device-path", "Device Path", + "DRM device path", nullptr, param_flags)); +#endif + + g_object_class_install_property (object_class, PROP_TARGET_USAGE, + g_param_spec_uint ("target-usage", "Target Usage", + "1: Best quality, 4: Balanced, 7: Best speed", + 1, 7, DEFAULT_TARGET_USAGE, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + g_object_class_install_property (object_class, PROP_LOW_LATENCY, + g_param_spec_boolean ("low-latency", "Low Latency", + "Enables low-latency encoding", DEFAULT_LOW_LATENCY, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + element_class->set_context = GST_DEBUG_FUNCPTR (gst_qsv_encoder_set_context); + + videoenc_class->open = GST_DEBUG_FUNCPTR (gst_qsv_encoder_open); + videoenc_class->stop = GST_DEBUG_FUNCPTR (gst_qsv_encoder_stop); + videoenc_class->close = GST_DEBUG_FUNCPTR (gst_qsv_encoder_close); + videoenc_class->set_format = GST_DEBUG_FUNCPTR (gst_qsv_encoder_set_format); + videoenc_class->handle_frame = + GST_DEBUG_FUNCPTR (gst_qsv_encoder_handle_frame); + videoenc_class->finish = GST_DEBUG_FUNCPTR (gst_qsv_encoder_finish); + videoenc_class->flush = GST_DEBUG_FUNCPTR (gst_qsv_encoder_flush); + videoenc_class->sink_query = GST_DEBUG_FUNCPTR (gst_qsv_encoder_sink_query); + videoenc_class->src_query = GST_DEBUG_FUNCPTR (gst_qsv_encoder_src_query); + videoenc_class->propose_allocation = + GST_DEBUG_FUNCPTR (gst_qsv_encoder_propose_allocation); + + gst_type_mark_as_plugin_api (GST_TYPE_QSV_ENCODER, (GstPluginAPIFlags) 0); + gst_type_mark_as_plugin_api (GST_TYPE_QSV_CODING_OPTION, + (GstPluginAPIFlags) 0); +} + +static void +gst_qsv_encoder_init (GstQsvEncoder * self) +{ + GstQsvEncoderPrivate *priv; + + priv = self->priv = + (GstQsvEncoderPrivate *) gst_qsv_encoder_get_instance_private (self); + + priv->extra_params = g_ptr_array_sized_new (8); + + priv->surface_pool = g_array_new (FALSE, TRUE, sizeof (GstQsvEncoderSurface)); + g_array_set_clear_func (priv->surface_pool, + (GDestroyNotify) gst_qsv_encoder_surface_clear); + + priv->task_pool = g_array_new (FALSE, TRUE, sizeof (GstQsvEncoderTask)); + g_array_set_clear_func (priv->task_pool, + (GDestroyNotify) gst_qsv_encoder_task_clear); + + g_queue_init (&priv->free_tasks); + g_queue_init (&priv->pending_tasks); + + priv->target_usage = DEFAULT_TARGET_USAGE; + priv->low_latency = DEFAULT_LOW_LATENCY; +} + +static void +gst_qsv_encoder_dispose (GObject * object) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (object); + GstQsvEncoderPrivate *priv = self->priv; + + gst_clear_object (&priv->device); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_qsv_encoder_finalize (GObject * object) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (object); + GstQsvEncoderPrivate *priv = self->priv; + + g_ptr_array_unref (priv->extra_params); + g_array_unref (priv->task_pool); + g_array_unref (priv->surface_pool); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_qsv_encoder_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (object); + GstQsvEncoderPrivate *priv = self->priv; + + switch (prop_id) { + case PROP_TARGET_USAGE: + priv->target_usage = g_value_get_uint (value); + break; + case PROP_LOW_LATENCY: + priv->low_latency = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_qsv_encoder_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (object); + GstQsvEncoderPrivate *priv = self->priv; + GstQsvEncoderClass *klass = GST_QSV_ENCODER_GET_CLASS (self); + + switch (prop_id) { + case PROP_ADAPTER_LUID: + g_value_set_int64 (value, klass->adapter_luid); + break; + case PROP_DEVICE_PATH: + g_value_set_string (value, klass->display_path); + break; + case PROP_TARGET_USAGE: + g_value_set_uint (value, priv->target_usage); + break; + case PROP_LOW_LATENCY: + g_value_set_boolean (value, priv->low_latency); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_qsv_encoder_set_context (GstElement * element, GstContext * context) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (element); + GstQsvEncoderClass *klass = GST_QSV_ENCODER_GET_CLASS (element); + GstQsvEncoderPrivate *priv = self->priv; + +#ifdef G_OS_WIN32 + gst_d3d11_handle_set_context_for_adapter_luid (element, + context, klass->adapter_luid, (GstD3D11Device **) & priv->device); +#else + gst_va_handle_set_context (element, context, klass->display_path, + (GstVaDisplay **) & priv->device); +#endif + + GST_ELEMENT_CLASS (parent_class)->set_context (element, context); +} + +#ifdef G_OS_WIN32 +static gboolean +gst_qsv_encoder_open_platform_device (GstQsvEncoder * self) +{ + GstQsvEncoderPrivate *priv = self->priv; + GstQsvEncoderClass *klass = GST_QSV_ENCODER_GET_CLASS (self); + ComPtr < ID3D10Multithread > multi_thread; + HRESULT hr; + ID3D11Device *device_handle; + mfxStatus status; + GstD3D11Device *device; + + if (!gst_d3d11_ensure_element_data_for_adapter_luid (GST_ELEMENT (self), + klass->adapter_luid, (GstD3D11Device **) & priv->device)) { + GST_ERROR_OBJECT (self, "d3d11 device is unavailable"); + return FALSE; + } + + device = GST_D3D11_DEVICE_CAST (priv->device); + priv->allocator = gst_qsv_d3d11_allocator_new (device); + + /* For D3D11 device handle to be used by QSV, multithread protection layer + * must be enabled before the MFXVideoCORE_SetHandle() call. + * + * TODO: Need to check performance impact by this mutithread protection layer, + * since it may have a negative impact on overall pipeline performance. + * If so, we should create encoding session dedicated d3d11 device and + * make use of shared resource */ + device_handle = gst_d3d11_device_get_device_handle (device); + hr = device_handle->QueryInterface (IID_PPV_ARGS (&multi_thread)); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, "ID3D10Multithread interface is unavailable"); + return FALSE; + } + + multi_thread->SetMultithreadProtected (TRUE); + status = MFXVideoCORE_SetHandle (priv->session, MFX_HANDLE_D3D11_DEVICE, + device_handle); + if (status != MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to set d3d11 device handle"); + return FALSE; + } + + /* NOTE: We never use this mfxFrameAllocator to allocate memory from our side, + * but required for QSV because: + * 1) QSV may request memory allocation for encoder's internal usage, + * MFX_FOURCC_P8 for example + * 2) Our mfxFrameAllocator provides bridge layer for + * gst_video_frame_{map,unmap} and mfxFrameAllocator::{Lock,Unlock}, + * including mfxFrameAllocator::GetHDL. + * 3) GstQsvAllocator provides GstQsvFrame pool, and therefore allocated + * GstQsvFrame struct can be re-used without per-frame malloc/free + */ + status = MFXVideoCORE_SetFrameAllocator (priv->session, + gst_qsv_allocator_get_allocator_handle (priv->allocator)); + if (status != MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to set frame allocator %d", status); + return FALSE; + } + + return TRUE; +} +#else +static gboolean +gst_qsv_encoder_open_platform_device (GstQsvEncoder * self) +{ + GstQsvEncoderPrivate *priv = self->priv; + GstQsvEncoderClass *klass = GST_QSV_ENCODER_GET_CLASS (self); + mfxStatus status; + GstVaDisplay *display; + + if (!gst_va_ensure_element_data (GST_ELEMENT (self), klass->display_path, + (GstVaDisplay **) & priv->device)) { + GST_ERROR_OBJECT (self, "VA display is unavailable"); + return FALSE; + } + + display = GST_VA_DISPLAY (priv->device); + + priv->allocator = gst_qsv_va_allocator_new (display); + + status = MFXVideoCORE_SetHandle (priv->session, MFX_HANDLE_VA_DISPLAY, + gst_va_display_get_va_dpy (display)); + if (status != MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to set VA display handle"); + return FALSE; + } + + status = MFXVideoCORE_SetFrameAllocator (priv->session, + gst_qsv_allocator_get_allocator_handle (priv->allocator)); + if (status != MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to set frame allocator %d", status); + return FALSE; + } + + return TRUE; +} +#endif + +static gboolean +gst_qsv_encoder_open (GstVideoEncoder * encoder) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (encoder); + GstQsvEncoderPrivate *priv = self->priv; + GstQsvEncoderClass *klass = GST_QSV_ENCODER_GET_CLASS (self); + mfxStatus status; + + status = MFXCreateSession (gst_qsv_get_loader (), klass->impl_index, + &priv->session); + if (status != MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to create session"); + return FALSE; + } + + if (!gst_qsv_encoder_open_platform_device (self)) { + g_clear_pointer (&priv->session, MFXClose); + gst_clear_object (&priv->allocator); + gst_clear_object (&priv->device); + + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_qsv_encoder_reset (GstQsvEncoder * self) +{ + GstQsvEncoderPrivate *priv = self->priv; + + if (priv->encoder) { + delete priv->encoder; + priv->encoder = nullptr; + } + + if (priv->internal_pool) { + gst_buffer_pool_set_active (priv->internal_pool, FALSE); + gst_clear_object (&priv->internal_pool); + } + + g_array_set_size (priv->surface_pool, 0); + g_array_set_size (priv->task_pool, 0); + g_queue_clear (&priv->free_tasks); + g_queue_clear (&priv->pending_tasks); + + return TRUE; +} + +static gboolean +gst_qsv_encoder_stop (GstVideoEncoder * encoder) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (encoder); + GstQsvEncoderPrivate *priv = self->priv; + + gst_qsv_encoder_reset (self); + g_clear_pointer (&priv->input_state, gst_video_codec_state_unref); + + return TRUE; +} + +static gboolean +gst_qsv_encoder_close (GstVideoEncoder * encoder) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (encoder); + GstQsvEncoderPrivate *priv = self->priv; + + g_clear_pointer (&priv->session, MFXClose); + gst_clear_object (&priv->allocator); + gst_clear_object (&priv->device); + + return TRUE; +} + +static void +gst_qsv_encoder_payload_clear (mfxPayload * payload) +{ + if (!payload) + return; + + g_free (payload->Data); + g_free (payload); +} + +static void +gst_qsv_encoder_surface_reset (GstQsvEncoderSurface * surface) +{ + if (!surface) + return; + + gst_clear_qsv_frame (&surface->qsv_frame); + g_ptr_array_set_size (surface->payload, 0); + memset (&surface->encode_control, 0, sizeof (mfxEncodeCtrl)); +} + +static void +gst_qsv_encoder_surface_clear (GstQsvEncoderSurface * surface) +{ + if (!surface) + return; + + gst_qsv_encoder_surface_reset (surface); + g_clear_pointer (&surface->payload, g_ptr_array_unref); + memset (&surface->surface, 0, sizeof (mfxFrameSurface1)); +} + +static void +gst_qsv_encoder_task_reset (GstQsvEncoder * self, GstQsvEncoderTask * task) +{ + GstQsvEncoderPrivate *priv = self->priv; + + if (!task) + return; + + task->sync_point = nullptr; + task->bitstream.DataLength = 0; + g_queue_push_head (&priv->free_tasks, task); +} + +static void +gst_qsv_encoder_task_clear (GstQsvEncoderTask * task) +{ + if (!task) + return; + + g_clear_pointer (&task->bitstream.Data, g_free); + memset (&task->bitstream, 0, sizeof (mfxBitstream)); +} + +static GstQsvEncoderSurface * +gst_qsv_encoder_get_next_surface (GstQsvEncoder * self) +{ + GstQsvEncoderPrivate *priv = self->priv; + GstQsvEncoderSurface *surface = nullptr; + + for (guint i = priv->next_surface_index; i < priv->surface_pool->len; i++) { + GstQsvEncoderSurface *iter = + &g_array_index (priv->surface_pool, GstQsvEncoderSurface, i); + + /* This means surface is still being used by QSV */ + if (iter->surface.Data.Locked > 0) + continue; + + surface = iter; + priv->next_surface_index = i; + goto out; + } + + for (guint i = 0; i < priv->next_surface_index; i++) { + GstQsvEncoderSurface *iter = + &g_array_index (priv->surface_pool, GstQsvEncoderSurface, i); + + /* This means surface is still being used by QSV */ + if (iter->surface.Data.Locked > 0) + continue; + + surface = iter; + priv->next_surface_index = i; + goto out; + } + + /* Magic number to avoid too large pool size */ + if (priv->surface_pool->len > 64) { + GST_ERROR_OBJECT (self, + "No availble surface but pool size is too large already"); + return nullptr; + } + + /* Something went wrong, increase surface pool size */ + GST_INFO_OBJECT (self, "No useable surfaces, increasing pool size to %d", + priv->surface_pool->len + 1); + + g_array_set_size (priv->surface_pool, priv->surface_pool->len + 1); + surface = &g_array_index (priv->surface_pool, GstQsvEncoderSurface, + priv->surface_pool->len - 1); + + memset (surface, 0, sizeof (GstQsvEncoderSurface)); + surface->surface.Info = + g_array_index (priv->surface_pool, GstQsvEncoderSurface, 0).surface.Info; + surface->payload = g_ptr_array_new_with_free_func ((GDestroyNotify) + gst_qsv_encoder_payload_clear); + +out: + priv->next_surface_index++; + priv->next_surface_index %= priv->surface_pool->len; + + gst_qsv_encoder_surface_reset (surface); + return surface; +} + +static mfxStatus +gst_qsv_encoder_encode_frame (GstQsvEncoder * self, + GstQsvEncoderSurface * surface, GstQsvEncoderTask * task, mfxU64 timestamp) +{ + mfxFrameSurface1 *s; + GstQsvEncoderPrivate *priv = self->priv; + mfxStatus status; + guint retry_count = 0; + /* magic number */ + const guint retry_threshold = 100; + mfxEncodeCtrl *encode_ctrl; + + if (surface) { + s = &surface->surface; + s->Data.MemId = (mfxMemId) surface->qsv_frame; + s->Data.TimeStamp = timestamp; + encode_ctrl = &surface->encode_control; + } else { + /* draining */ + s = nullptr; + encode_ctrl = nullptr; + } + + do { + status = priv->encoder->EncodeFrameAsync (encode_ctrl, + s, &task->bitstream, &task->sync_point); + + /* XXX: probably we should try to drain pending tasks if any in this case + * as documented? */ + if (status == MFX_WRN_DEVICE_BUSY && retry_count < retry_threshold) { + GST_INFO_OBJECT (self, "GPU is busy, retry count (%d/%d)", + retry_count, retry_threshold); + retry_count++; + + /* Magic number 10ms */ + g_usleep (10000); + continue; + } + + break; + } while (TRUE); + + return status; +} + +static GstVideoCodecFrame * +gst_qsv_encoder_find_output_frame (GstQsvEncoder * self, GstClockTime pts) +{ + GList *frames, *iter; + GstVideoCodecFrame *ret = nullptr; + GstVideoCodecFrame *closest = nullptr; + guint64 min_pts_abs_diff = 0; + + /* give up, just returns the oldest frame */ + if (!GST_CLOCK_TIME_IS_VALID (pts)) + return gst_video_encoder_get_oldest_frame (GST_VIDEO_ENCODER (self)); + + frames = gst_video_encoder_get_frames (GST_VIDEO_ENCODER (self)); + + for (iter = frames; iter; iter = g_list_next (iter)) { + GstVideoCodecFrame *frame = (GstVideoCodecFrame *) iter->data; + guint64 abs_diff; + + if (!GST_CLOCK_TIME_IS_VALID (frame->pts)) + continue; + + if (pts == frame->pts) { + ret = frame; + break; + } + + if (pts >= frame->pts) + abs_diff = pts - frame->pts; + else + abs_diff = frame->pts - pts; + + if (!closest || abs_diff < min_pts_abs_diff) { + closest = frame; + min_pts_abs_diff = abs_diff; + } + } + + if (!ret && closest) + ret = closest; + + if (ret) { + gst_video_codec_frame_ref (ret); + } else { + ret = gst_video_encoder_get_oldest_frame (GST_VIDEO_ENCODER (self)); + } + + if (frames) + g_list_free_full (frames, (GDestroyNotify) gst_video_codec_frame_unref); + + return ret; +} + +static GstFlowReturn +gst_qsv_encoder_finish_frame (GstQsvEncoder * self, GstQsvEncoderTask * task, + gboolean discard) +{ + GstQsvEncoderPrivate *priv = self->priv; + GstQsvEncoderClass *klass = GST_QSV_ENCODER_GET_CLASS (self); + mfxStatus status; + mfxBitstream *bs; + GstVideoCodecFrame *frame; + GstClockTime qsv_pts = GST_CLOCK_TIME_NONE; + GstClockTime qsv_dts = GST_CLOCK_TIME_NONE; + GstBuffer *buffer; + gboolean keyframe = FALSE; + guint retry_count = 0; + /* magic number */ + const guint retry_threshold = 100; + + status = MFX_ERR_NONE; + do { + /* magic number 100 ms */ + status = MFXVideoCORE_SyncOperation (priv->session, task->sync_point, 100); + + /* Retry up to 10 sec (100 ms x 100 times), that should be enough time for + * encoding a frame using hardware */ + if (status == MFX_WRN_IN_EXECUTION && retry_count < retry_threshold) { + GST_DEBUG_OBJECT (self, + "Operation is still in execution, retry count (%d/%d)", + retry_count, retry_threshold); + retry_count++; + continue; + } + + break; + } while (TRUE); + + if (discard) { + gst_qsv_encoder_task_reset (self, task); + return GST_FLOW_OK; + } + + if (status != MFX_ERR_NONE && status != MFX_ERR_NONE_PARTIAL_OUTPUT) { + gst_qsv_encoder_task_reset (self, task); + + if (status == MFX_ERR_ABORTED) { + GST_INFO_OBJECT (self, "Operation was aborted"); + return GST_FLOW_FLUSHING; + } + + GST_WARNING_OBJECT (self, "SyncOperation returned %d (%s)", + QSV_STATUS_ARGS (status)); + + return GST_FLOW_ERROR; + } + + bs = &task->bitstream; + qsv_pts = gst_qsv_timestamp_to_gst (bs->TimeStamp); + + /* SDK runtime seems to report zero DTS for all fraems in case of VP9. + * It sounds SDK bug, but we can workaround it safely because VP9 B-frame is + * not supported in this implementation. + * + * Also we perfer our nanoseconds timestamp instead of QSV's timescale. + * So let' ignore QSV's timescale for non-{h264,h265} cases. + * + * TODO: We may need to use DTS for MPEG2 (not implemented yet) + */ + if (klass->codec_id == MFX_CODEC_AVC || klass->codec_id == MFX_CODEC_HEVC) + qsv_dts = gst_qsv_timestamp_to_gst ((mfxU64) bs->DecodeTimeStamp); + + if ((bs->FrameType & MFX_FRAMETYPE_IDR) != 0) + keyframe = TRUE; + + if (klass->create_output_buffer) { + buffer = klass->create_output_buffer (self, bs); + } else { + buffer = gst_buffer_new_memdup (bs->Data + bs->DataOffset, bs->DataLength); + } + gst_qsv_encoder_task_reset (self, task); + + if (!buffer) { + GST_ERROR_OBJECT (self, "No output buffer"); + return GST_FLOW_ERROR; + } + + frame = gst_qsv_encoder_find_output_frame (self, qsv_pts); + if (frame) { + if (GST_CLOCK_TIME_IS_VALID (qsv_dts)) { + frame->pts = qsv_pts; + frame->dts = qsv_dts; + } else { + frame->dts = frame->pts; + } + + frame->output_buffer = buffer; + + if (keyframe) + GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); + + return gst_video_encoder_finish_frame (GST_VIDEO_ENCODER (self), frame); + } + + /* Empty available frame, something went wrong but we can just push this + * buffer */ + GST_WARNING_OBJECT (self, "Failed to find corresponding frame"); + GST_BUFFER_PTS (buffer) = qsv_pts; + if (GST_CLOCK_TIME_IS_VALID (qsv_dts)) + GST_BUFFER_DTS (buffer) = qsv_dts; + else + GST_BUFFER_DTS (buffer) = qsv_pts; + + if (!keyframe) + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); + + return gst_pad_push (GST_VIDEO_ENCODER_SRC_PAD (self), buffer); +} + +static GstFlowReturn +gst_qsv_encoder_drain (GstQsvEncoder * self, gboolean discard) +{ + GstQsvEncoderPrivate *priv = self->priv; + mfxStatus status = MFX_ERR_NONE; + GstFlowReturn ret = GST_FLOW_OK; + GstQsvEncoderTask *task; + + if (!priv->session || !priv->encoder) + return GST_FLOW_OK; + + GST_DEBUG_OBJECT (self, "Drain"); + + /* Drain pending tasks first if any */ + while (g_queue_get_length (&priv->pending_tasks) > 0) { + task = (GstQsvEncoderTask *) g_queue_pop_tail (&priv->pending_tasks); + ret = gst_qsv_encoder_finish_frame (self, task, discard); + } + + while (status == MFX_ERR_NONE) { + task = (GstQsvEncoderTask *) g_queue_pop_tail (&priv->free_tasks); + status = gst_qsv_encoder_encode_frame (self, + nullptr, task, MFX_TIMESTAMP_UNKNOWN); + + /* once it's fully drained, then driver will return more data */ + if (status == MFX_ERR_NONE && task->sync_point) { + ret = gst_qsv_encoder_finish_frame (self, task, discard); + continue; + } + + if (status != MFX_ERR_MORE_DATA) + GST_WARNING_OBJECT (self, "Unexpected status return %d (%s)", + QSV_STATUS_ARGS (status)); + + g_queue_push_head (&priv->free_tasks, task); + } + + /* Release GstQsvFrame objects */ + for (guint i = 0; i < priv->surface_pool->len; i++) { + GstQsvEncoderSurface *iter = + &g_array_index (priv->surface_pool, GstQsvEncoderSurface, i); + + if (iter->surface.Data.Locked > 0) { + GST_WARNING_OBJECT (self, + "Encoder was drained but QSV is holding surface %d", i); + continue; + } + + gst_qsv_encoder_surface_reset (iter); + } + + return ret; +} + +#ifdef G_OS_WIN32 +static gboolean +gst_qsv_encoder_prepare_d3d11_pool (GstQsvEncoder * self, + GstCaps * caps, GstVideoInfo * aligned_info) +{ + GstQsvEncoderPrivate *priv = self->priv; + GstStructure *config; + GstD3D11AllocationParams *params; + GstD3D11Device *device = GST_D3D11_DEVICE_CAST (priv->device); + guint bind_flags = 0; + GstD3D11Format device_format; + + gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (aligned_info), + &device_format); + if ((device_format.format_support0 & D3D11_FORMAT_SUPPORT_RENDER_TARGET) == + D3D11_FORMAT_SUPPORT_RENDER_TARGET) { + /* XXX: workaround for greenish artifacts + * https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1238 + * bind to render target so that d3d11 memory allocator can clear texture + * with black color */ + bind_flags = D3D11_BIND_RENDER_TARGET; + } + + priv->internal_pool = gst_d3d11_buffer_pool_new (device); + config = gst_buffer_pool_get_config (priv->internal_pool); + params = gst_d3d11_allocation_params_new (device, aligned_info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, bind_flags, + D3D11_RESOURCE_MISC_SHARED); + + gst_buffer_pool_config_set_d3d11_allocation_params (config, params); + gst_d3d11_allocation_params_free (params); + gst_buffer_pool_config_set_params (config, caps, + GST_VIDEO_INFO_SIZE (aligned_info), 0, 0); + gst_buffer_pool_set_config (priv->internal_pool, config); + gst_buffer_pool_set_active (priv->internal_pool, TRUE); + + return TRUE; +} +#else +static gboolean +gst_qsv_encoder_prepare_va_pool (GstQsvEncoder * self, + GstCaps * caps, GstVideoInfo * aligned_info) +{ + GstQsvEncoderPrivate *priv = self->priv; + GstAllocator *allocator; + GstStructure *config; + GArray *formats; + GstAllocationParams params; + GstVaDisplay *display = GST_VA_DISPLAY (priv->device); + + formats = g_array_new (FALSE, FALSE, sizeof (GstVideoFormat)); + g_array_append_val (formats, GST_VIDEO_INFO_FORMAT (aligned_info)); + + allocator = gst_va_allocator_new (display, formats); + if (!allocator) { + GST_ERROR_OBJECT (self, "Failed to create allocator"); + return FALSE; + } + + gst_allocation_params_init (¶ms); + + priv->internal_pool = gst_va_pool_new_with_config (caps, + GST_VIDEO_INFO_SIZE (aligned_info), 0, 0, + VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC, GST_VA_FEATURE_AUTO, + allocator, ¶ms); + gst_object_unref (allocator); + + + if (!priv->internal_pool) { + GST_ERROR_OBJECT (self, "Failed to create va pool"); + return FALSE; + } + + config = gst_buffer_pool_get_config (priv->internal_pool); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + gst_buffer_pool_config_set_params (config, caps, + GST_VIDEO_INFO_SIZE (aligned_info), 0, 0); + gst_buffer_pool_set_config (priv->internal_pool, config); + gst_buffer_pool_set_active (priv->internal_pool, TRUE); + + return TRUE; +} +#endif + +/* Prepare internal pool, which is used to allocate fallback buffer + * when upstream buffer is not directly accessible by QSV */ +static gboolean +gst_qsv_encoder_prepare_pool (GstQsvEncoder * self, GstCaps * caps, + GstVideoInfo * aligned_info) +{ + GstQsvEncoderPrivate *priv = self->priv; + gboolean ret = FALSE; + GstCaps *aligned_caps; + + if (priv->internal_pool) { + gst_buffer_pool_set_active (priv->internal_pool, FALSE); + gst_clear_object (&priv->internal_pool); + } + + aligned_caps = gst_video_info_to_caps (aligned_info); + +#ifdef G_OS_WIN32 + ret = gst_qsv_encoder_prepare_d3d11_pool (self, aligned_caps, aligned_info); +#else + ret = gst_qsv_encoder_prepare_va_pool (self, aligned_caps, aligned_info); +#endif + + gst_caps_unref (aligned_caps); + + return ret; +} + +static gboolean +gst_qsv_encoder_init_encode_session (GstQsvEncoder * self) +{ + GstQsvEncoderPrivate *priv = self->priv; + GstQsvEncoderClass *klass = GST_QSV_ENCODER_GET_CLASS (self); + GstVideoInfo *info = &priv->input_state->info; + GstCaps *caps = priv->input_state->caps; + mfxVideoParam param; + mfxFrameInfo *frame_info; + mfxFrameAllocRequest alloc_request; + mfxStatus status; + MFXVideoENCODE *encoder_handle = nullptr; + guint bitstream_size; + gboolean ret; + guint64 min_delay_frames, max_delay_frames; + GstClockTime min_latency, max_latency; + + gst_qsv_encoder_drain (self, FALSE); + gst_qsv_encoder_reset (self); + + encoder_handle = new MFXVideoENCODE (priv->session); + + memset (¶m, 0, sizeof (mfxVideoParam)); + + g_ptr_array_set_size (priv->extra_params, 0); + g_assert (klass->set_format); + if (!klass->set_format (self, priv->input_state, ¶m, priv->extra_params)) { + GST_ERROR_OBJECT (self, "Subclass failed to set format"); + goto error; + } + + /* LowPower mode supports smaller set of features, don't enable it for now */ + param.mfx.LowPower = MFX_CODINGOPTION_OFF; + if (priv->low_latency) + param.AsyncDepth = 1; + else + param.AsyncDepth = 4; + + param.mfx.TargetUsage = priv->target_usage; + + frame_info = ¶m.mfx.FrameInfo; + + gst_video_info_set_interlaced_format (&priv->aligned_info, + GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_INTERLACE_MODE (info), + frame_info->Width, frame_info->Height); + + /* Always video memory, even when upstream is non-hardware element */ + priv->mem_type = GST_QSV_VIDEO_MEMORY | GST_QSV_ENCODER_IN_MEMORY; + param.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; + if (!gst_qsv_encoder_prepare_pool (self, caps, &priv->aligned_info)) { + GST_ERROR_OBJECT (self, "Failed to prepare pool"); + goto error; + } + + status = encoder_handle->Query (¶m, ¶m); + /* If device is unhappy with LowPower = OFF, try again with unknown */ + if (status < MFX_ERR_NONE) { + GST_INFO_OBJECT (self, "LowPower - OFF returned %d (%s)", + QSV_STATUS_ARGS (status)); + param.mfx.LowPower = MFX_CODINGOPTION_UNKNOWN; + status = encoder_handle->Query (¶m, ¶m); + } + QSV_CHECK_STATUS (self, status, MFXVideoENCODE::Query); + + status = encoder_handle->QueryIOSurf (¶m, &alloc_request); + QSV_CHECK_STATUS (self, status, MFXVideoENCODE::QueryIOSurf); + + status = encoder_handle->Init (¶m); + QSV_CHECK_STATUS (self, status, MFXVideoENCODE::Init); + + status = encoder_handle->GetVideoParam (¶m); + QSV_CHECK_STATUS (self, status, MFXVideoENCODE::GetVideoParam); + + GST_DEBUG_OBJECT (self, "NumFrameSuggested: %d, AsyncDepth %d", + alloc_request.NumFrameSuggested, param.AsyncDepth); + + g_assert (klass->set_output_state); + ret = klass->set_output_state (self, priv->input_state, priv->session); + if (!ret) { + GST_ERROR_OBJECT (self, "Subclass failed to set output state"); + goto error; + } + + /* Prepare surface pool with size NumFrameSuggested, then if it's not + * sufficient while encoding, we can increse the pool size dynamically + * if needed */ + g_array_set_size (priv->surface_pool, alloc_request.NumFrameSuggested); + for (guint i = 0; i < priv->surface_pool->len; i++) { + GstQsvEncoderSurface *surface = &g_array_index (priv->surface_pool, + GstQsvEncoderSurface, i); + + surface->surface.Info = param.mfx.FrameInfo; + surface->payload = g_ptr_array_new_with_free_func ((GDestroyNotify) + gst_qsv_encoder_payload_clear); + } + priv->next_surface_index = 0; + + g_array_set_size (priv->task_pool, param.AsyncDepth); + if (klass->codec_id == MFX_CODEC_JPEG) { + gdouble factor = 4.0; + + /* jpeg zero returns buffer size */ + switch (GST_VIDEO_INFO_FORMAT (info)) { + case GST_VIDEO_FORMAT_NV12: + factor = 1.5; + break; + case GST_VIDEO_FORMAT_YUY2: + factor = 2.0; + break; + default: + break; + } + bitstream_size = (guint) + (factor * GST_VIDEO_INFO_WIDTH (info) * GST_VIDEO_INFO_HEIGHT (info)); + } else { + bitstream_size = + (guint) param.mfx.BufferSizeInKB * param.mfx.BRCParamMultiplier * 1024; + } + + for (guint i = 0; i < priv->task_pool->len; i++) { + GstQsvEncoderTask *task = &g_array_index (priv->task_pool, + GstQsvEncoderTask, i); + + task->bitstream.Data = (mfxU8 *) g_malloc (bitstream_size); + task->bitstream.MaxLength = bitstream_size; + + g_queue_push_head (&priv->free_tasks, task); + } + + min_delay_frames = priv->task_pool->len; + /* takes the number of bframes into account */ + if (param.mfx.GopRefDist > 1) + min_delay_frames += (param.mfx.GopRefDist - 1); + max_delay_frames = priv->surface_pool->len + priv->task_pool->len; + + min_latency = gst_util_uint64_scale (min_delay_frames * GST_SECOND, + param.mfx.FrameInfo.FrameRateExtD, param.mfx.FrameInfo.FrameRateExtN); + max_latency = gst_util_uint64_scale (max_delay_frames * GST_SECOND, + param.mfx.FrameInfo.FrameRateExtD, param.mfx.FrameInfo.FrameRateExtN); + gst_video_encoder_set_latency (GST_VIDEO_ENCODER (self), + min_latency, max_latency); + + priv->video_param = param; + priv->encoder = encoder_handle; + + return TRUE; + +error: + if (encoder_handle) + delete encoder_handle; + + gst_qsv_encoder_reset (self); + + return FALSE; +} + +static gboolean +gst_qsv_encoder_reset_encode_session (GstQsvEncoder * self) +{ + GstQsvEncoderPrivate *priv = self->priv; + GPtrArray *extra_params = priv->extra_params; + mfxStatus status; + mfxExtEncoderResetOption reset_opt; + + if (!priv->encoder) { + GST_WARNING_OBJECT (self, "Encoder was not configured"); + return gst_qsv_encoder_init_encode_session (self); + } + + reset_opt.Header.BufferId = MFX_EXTBUFF_ENCODER_RESET_OPTION; + reset_opt.Header.BufferSz = sizeof (mfxExtEncoderResetOption); + reset_opt.StartNewSequence = MFX_CODINGOPTION_OFF; + + gst_qsv_encoder_drain (self, FALSE); + + g_ptr_array_add (extra_params, &reset_opt); + priv->video_param.ExtParam = (mfxExtBuffer **) extra_params->pdata; + priv->video_param.NumExtParam = extra_params->len; + + status = priv->encoder->Reset (&priv->video_param); + g_ptr_array_remove_index (extra_params, extra_params->len - 1); + priv->video_param.NumExtParam = extra_params->len; + + if (status != MFX_ERR_NONE) { + GST_WARNING_OBJECT (self, "MFXVideoENCODE_Reset returned %d (%s)", + QSV_STATUS_ARGS (status)); + return gst_qsv_encoder_init_encode_session (self); + } + + GST_DEBUG_OBJECT (self, "Encode session reset done"); + + return TRUE; +} + +static gboolean +gst_qsv_encoder_set_format (GstVideoEncoder * encoder, + GstVideoCodecState * state) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (encoder); + GstQsvEncoderPrivate *priv = self->priv; + + g_clear_pointer (&priv->input_state, gst_video_codec_state_unref); + priv->input_state = gst_video_codec_state_ref (state); + + return gst_qsv_encoder_init_encode_session (self); +} + +static mfxU16 +gst_qsv_encoder_get_pic_struct (GstQsvEncoder * self, + GstVideoCodecFrame * frame) +{ + GstQsvEncoderClass *klass = GST_QSV_ENCODER_GET_CLASS (self); + GstQsvEncoderPrivate *priv = self->priv; + GstVideoInfo *info = &priv->input_state->info; + + if (klass->codec_id != MFX_CODEC_AVC) + return MFX_PICSTRUCT_PROGRESSIVE; + + if (!GST_VIDEO_INFO_IS_INTERLACED (info)) + return MFX_PICSTRUCT_PROGRESSIVE; + + if (GST_VIDEO_INFO_INTERLACE_MODE (info) == GST_VIDEO_INTERLACE_MODE_MIXED) { + if (!GST_BUFFER_FLAG_IS_SET (frame->input_buffer, + GST_VIDEO_BUFFER_FLAG_INTERLACED)) { + return MFX_PICSTRUCT_PROGRESSIVE; + } + + if (GST_BUFFER_FLAG_IS_SET (frame->input_buffer, GST_VIDEO_BUFFER_FLAG_TFF)) + return MFX_PICSTRUCT_FIELD_TFF; + + return MFX_PICSTRUCT_FIELD_BFF; + } + + switch (GST_VIDEO_INFO_FIELD_ORDER (info)) { + case GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST: + return MFX_PICSTRUCT_FIELD_TFF; + break; + case GST_VIDEO_FIELD_ORDER_BOTTOM_FIELD_FIRST: + return MFX_PICSTRUCT_FIELD_BFF; + break; + default: + break; + } + + if (GST_BUFFER_FLAG_IS_SET (frame->input_buffer, GST_VIDEO_BUFFER_FLAG_TFF)) + return MFX_PICSTRUCT_FIELD_TFF; + + return MFX_PICSTRUCT_FIELD_BFF; +} + +static GstFlowReturn +gst_qsv_encoder_handle_frame (GstVideoEncoder * encoder, + GstVideoCodecFrame * frame) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (encoder); + GstQsvEncoderPrivate *priv = self->priv; + GstQsvEncoderClass *klass = GST_QSV_ENCODER_GET_CLASS (self); + GstFlowReturn ret = GST_FLOW_ERROR; + GstQsvEncoderSurface *surface; + GstQsvEncoderTask *task; + mfxU64 timestamp; + mfxStatus status; + + if (klass->check_reconfigure && priv->encoder) { + GstQsvEncoderReconfigure reconfigure; + + reconfigure = klass->check_reconfigure (self, priv->session, + &priv->video_param, priv->extra_params); + + switch (reconfigure) { + case GST_QSV_ENCODER_RECONFIGURE_BITRATE: + if (!gst_qsv_encoder_reset_encode_session (self)) { + GST_ERROR_OBJECT (self, "Failed to reset session"); + gst_video_encoder_finish_frame (encoder, frame); + + return GST_FLOW_ERROR; + } + break; + case GST_QSV_ENCODER_RECONFIGURE_FULL: + if (!gst_qsv_encoder_init_encode_session (self)) { + GST_ERROR_OBJECT (self, "Failed to init session"); + gst_video_encoder_finish_frame (encoder, frame); + + return GST_FLOW_ERROR; + } + break; + default: + break; + } + } + + if (!priv->encoder) { + GST_ERROR_OBJECT (self, "Encoder object was not configured"); + gst_video_encoder_finish_frame (encoder, frame); + + return GST_FLOW_NOT_NEGOTIATED; + } + + surface = gst_qsv_encoder_get_next_surface (self); + if (!surface) { + GST_ERROR_OBJECT (self, "No available surface"); + goto out; + } + + task = (GstQsvEncoderTask *) g_queue_pop_tail (&priv->free_tasks); + g_assert (task); + + surface->qsv_frame = + gst_qsv_allocator_acquire_frame (priv->allocator, priv->mem_type, + &priv->input_state->info, gst_buffer_ref (frame->input_buffer), + priv->internal_pool); + + if (!surface->qsv_frame) { + GST_ERROR_OBJECT (self, "Failed to wrap buffer with qsv frame"); + gst_qsv_encoder_task_reset (self, task); + goto out; + } + + surface->surface.Info.PicStruct = + gst_qsv_encoder_get_pic_struct (self, frame); + + if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame)) { + surface->encode_control.FrameType = + MFX_FRAMETYPE_IDR | MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF; + } else { + surface->encode_control.FrameType = MFX_FRAMETYPE_UNKNOWN; + } + + if (klass->attach_payload) { + klass->attach_payload (self, frame, surface->payload); + if (surface->payload->len > 0) { + surface->encode_control.NumPayload = surface->payload->len; + surface->encode_control.Payload = (mfxPayload **) surface->payload->pdata; + } + } + + timestamp = gst_qsv_timestamp_from_gst (frame->pts); + status = gst_qsv_encoder_encode_frame (self, surface, task, timestamp); + if (status != MFX_ERR_NONE && status != MFX_ERR_MORE_DATA) { + GST_ERROR_OBJECT (self, "Failed to encode frame, ret %d (%s)", + QSV_STATUS_ARGS (status)); + gst_qsv_encoder_task_reset (self, task); + goto out; + } + + if (status == MFX_ERR_NONE && task->sync_point) { + g_queue_push_head (&priv->pending_tasks, task); + } else { + gst_qsv_encoder_task_reset (self, task); + } + + ret = GST_FLOW_OK; + /* Do not sync immediately, but record tasks which have output buffer here + * to improve throughput. + * In this way, hardware may be able to run encoding job from its background + * threads (if any). We will do sync only when there's no more free task item + */ + while (g_queue_get_length (&priv->pending_tasks) >= priv->task_pool->len) { + GstQsvEncoderTask *task = + (GstQsvEncoderTask *) g_queue_pop_tail (&priv->pending_tasks); + ret = gst_qsv_encoder_finish_frame (self, task, FALSE); + } + +out: + gst_video_codec_frame_unref (frame); + + return ret; +} + +static GstFlowReturn +gst_qsv_encoder_finish (GstVideoEncoder * encoder) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (encoder); + + return gst_qsv_encoder_drain (self, FALSE); +} + +static gboolean +gst_qsv_encoder_flush (GstVideoEncoder * encoder) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (encoder); + + gst_qsv_encoder_drain (self, TRUE); + + return TRUE; +} + +static gboolean +gst_qsv_encoder_handle_context_query (GstQsvEncoder * self, GstQuery * query) +{ + GstQsvEncoderPrivate *priv = self->priv; + +#ifdef G_OS_WIN32 + return gst_d3d11_handle_context_query (GST_ELEMENT (self), query, + (GstD3D11Device *) priv->device); +#else + return gst_va_handle_context_query (GST_ELEMENT (self), query, + (GstVaDisplay *) priv->device); +#endif +} + +static gboolean +gst_qsv_encoder_sink_query (GstVideoEncoder * encoder, GstQuery * query) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (encoder); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + if (gst_qsv_encoder_handle_context_query (self, query)) + return TRUE; + break; + default: + break; + } + + return GST_VIDEO_ENCODER_CLASS (parent_class)->sink_query (encoder, query); +} + +static gboolean +gst_qsv_encoder_src_query (GstVideoEncoder * encoder, GstQuery * query) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (encoder); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + if (gst_qsv_encoder_handle_context_query (self, query)) + return TRUE; + break; + default: + break; + } + + return GST_VIDEO_ENCODER_CLASS (parent_class)->src_query (encoder, query); +} + +#ifdef G_OS_WIN32 +static gboolean +gst_qsv_encoder_propose_allocation (GstVideoEncoder * encoder, GstQuery * query) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (encoder); + GstQsvEncoderPrivate *priv = self->priv; + GstD3D11Device *device = GST_D3D11_DEVICE (priv->device); + GstVideoInfo info; + GstBufferPool *pool; + GstCaps *caps; + guint size; + GstStructure *config; + GstCapsFeatures *features; + gboolean is_d3d11 = FALSE; + + gst_query_parse_allocation (query, &caps, nullptr); + if (!caps) { + GST_WARNING_OBJECT (self, "null caps in query"); + return FALSE; + } + + if (!gst_video_info_from_caps (&info, caps)) { + GST_WARNING_OBJECT (self, "Failed to convert caps into info"); + return FALSE; + } + + features = gst_caps_get_features (caps, 0); + if (features && gst_caps_features_contains (features, + GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY)) { + GST_DEBUG_OBJECT (self, "upstream support d3d11 memory"); + pool = gst_d3d11_buffer_pool_new (device); + is_d3d11 = TRUE; + } else { + pool = gst_video_buffer_pool_new (); + } + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + + if (is_d3d11) { + GstD3D11AllocationParams *d3d11_params; + GstVideoAlignment align; + + /* d3d11 buffer pool doesn't support generic video alignment + * because memory layout of CPU accessible staging texture is uncontrollable. + * Do D3D11 specific handling */ + gst_video_alignment_reset (&align); + + align.padding_right = GST_VIDEO_INFO_WIDTH (&priv->aligned_info) - + GST_VIDEO_INFO_WIDTH (&info); + align.padding_bottom = GST_VIDEO_INFO_HEIGHT (&priv->aligned_info) - + GST_VIDEO_INFO_HEIGHT (&info); + + d3d11_params = gst_d3d11_allocation_params_new (device, &info, + GST_D3D11_ALLOCATION_FLAG_DEFAULT, 0, 0); + + gst_d3d11_allocation_params_alignment (d3d11_params, &align); + gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params); + gst_d3d11_allocation_params_free (d3d11_params); + } else { + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); + } + + size = GST_VIDEO_INFO_SIZE (&info); + gst_buffer_pool_config_set_params (config, + caps, size, priv->surface_pool->len, 0); + + if (!gst_buffer_pool_set_config (pool, config)) { + GST_WARNING_OBJECT (self, "Failed to set pool config"); + gst_object_unref (pool); + return FALSE; + } + + /* d3d11 buffer pool will update actual CPU accessible buffer size based on + * allocated staging texture per gst_buffer_pool_set_config() call, + * need query again to get the size */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); + + gst_query_add_allocation_pool (query, pool, size, priv->surface_pool->len, 0); + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, nullptr); + gst_object_unref (pool); + + return TRUE; +} +#else +static gboolean +gst_qsv_encoder_propose_allocation (GstVideoEncoder * encoder, GstQuery * query) +{ + GstQsvEncoder *self = GST_QSV_ENCODER (encoder); + GstQsvEncoderPrivate *priv = self->priv; + GstVideoInfo info; + GstAllocator *allocator = nullptr; + GstBufferPool *pool; + GstCaps *caps; + guint size; + GstStructure *config; + GstVideoAlignment align; + GstAllocationParams params; + GArray *formats; + + gst_query_parse_allocation (query, &caps, nullptr); + if (!caps) { + GST_WARNING_OBJECT (self, "null caps in query"); + return FALSE; + } + + if (!gst_video_info_from_caps (&info, caps)) { + GST_WARNING_OBJECT (self, "Failed to convert caps into info"); + return FALSE; + } + + gst_allocation_params_init (¶ms); + + formats = g_array_new (FALSE, FALSE, sizeof (GstVideoFormat)); + g_array_append_val (formats, GST_VIDEO_INFO_FORMAT (&info)); + + allocator = gst_va_allocator_new (GST_VA_DISPLAY (priv->device), formats); + if (!allocator) { + GST_ERROR_OBJECT (self, "Failed to create allocator"); + return FALSE; + } + + pool = gst_va_pool_new_with_config (caps, + GST_VIDEO_INFO_SIZE (&info), priv->surface_pool->len, 0, + VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC, GST_VA_FEATURE_AUTO, + allocator, ¶ms); + + if (!pool) { + GST_ERROR_OBJECT (self, "Failed to create va pool"); + gst_object_unref (allocator); + + return FALSE; + } + + gst_video_alignment_reset (&align); + align.padding_right = GST_VIDEO_INFO_WIDTH (&priv->aligned_info) - + GST_VIDEO_INFO_WIDTH (&info); + align.padding_bottom = GST_VIDEO_INFO_HEIGHT (&priv->aligned_info) - + GST_VIDEO_INFO_HEIGHT (&info); + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT); + gst_buffer_pool_config_set_video_alignment (config, &align); + + gst_buffer_pool_config_set_params (config, + caps, GST_VIDEO_INFO_SIZE (&info), priv->surface_pool->len, 0); + + if (!gst_buffer_pool_set_config (pool, config)) { + GST_ERROR_OBJECT (self, "Failed to set pool config"); + gst_clear_object (&allocator); + gst_object_unref (pool); + return FALSE; + } + + if (allocator) + gst_query_add_allocation_param (query, allocator, ¶ms); + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); + + gst_query_add_allocation_pool (query, pool, size, priv->surface_pool->len, 0); + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, nullptr); + + gst_clear_object (&allocator); + gst_object_unref (pool); + + return TRUE; +} +#endif
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvencoder.h
Added
@@ -0,0 +1,97 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <mfx.h> +#include "gstqsvutils.h" + +G_BEGIN_DECLS + +#define GST_TYPE_QSV_ENCODER (gst_qsv_encoder_get_type()) +#define GST_QSV_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_QSV_ENCODER, GstQsvEncoder)) +#define GST_QSV_ENCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_QSV_ENCODER, GstQsvEncoderClass)) +#define GST_IS_QSV_ENCODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_QSV_ENCODER)) +#define GST_IS_QSV_ENCODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_QSV_ENCODER)) +#define GST_QSV_ENCODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_QSV_ENCODER, GstQsvEncoderClass)) +#define GST_QSV_ENCODER_CAST(obj) ((GstQsvEncoder *)obj) + +typedef struct _GstQsvEncoder GstQsvEncoder; +typedef struct _GstQsvEncoderClass GstQsvEncoderClass; +typedef struct _GstQsvEncoderPrivate GstQsvEncoderPrivate; + +#define GST_TYPE_QSV_CODING_OPTION (gst_qsv_coding_option_get_type()) +GType gst_qsv_coding_option_get_type (void); + +typedef enum +{ + GST_QSV_ENCODER_RECONFIGURE_NONE, + GST_QSV_ENCODER_RECONFIGURE_BITRATE, + GST_QSV_ENCODER_RECONFIGURE_FULL, +} GstQsvEncoderReconfigure; + +struct _GstQsvEncoder +{ + GstVideoEncoder parent; + + GstQsvEncoderPrivate *priv; +}; + +struct _GstQsvEncoderClass +{ + GstVideoEncoderClass parent_class; + + mfxU32 codec_id; + mfxU32 impl_index; + + /* DXGI adapter LUID, for Windows */ + gint64 adapter_luid; + + /* VA display device path, for Linux */ + gchar *display_path; + + gboolean (*set_format) (GstQsvEncoder * encoder, + GstVideoCodecState * state, + mfxVideoParam * param, + GPtrArray * extra_params); + + gboolean (*set_output_state) (GstQsvEncoder * encoder, + GstVideoCodecState * state, + mfxSession session); + + gboolean (*attach_payload) (GstQsvEncoder * encoder, + GstVideoCodecFrame * frame, + GPtrArray * payload); + + GstBuffer * (*create_output_buffer) (GstQsvEncoder * encoder, + mfxBitstream * bitstream); + + GstQsvEncoderReconfigure (*check_reconfigure) (GstQsvEncoder * encoder, + mfxSession session, + mfxVideoParam * param, + GPtrArray * extra_params); +}; + +GType gst_qsv_encoder_get_type (void); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstQsvEncoder, gst_object_unref) + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvh264dec.cpp
Added
@@ -0,0 +1,577 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-qsvh264dec + * @title: qsvh264dec + * + * Intel Quick Sync H.264 decoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 filesrc location=/path/to/h264/file ! parsebin ! qsvh264dec ! videoconvert ! autovideosink + * ``` + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvh264dec.h" +#include <gst/codecparsers/gsth264parser.h> +#include <string> +#include <string.h> + +#ifdef G_OS_WIN32 +#include <gst/d3d11/gstd3d11.h> +#else +#include <gst/va/gstva.h> +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_qsv_h264_dec_debug); +#define GST_CAT_DEFAULT gst_qsv_h264_dec_debug + +#define DOC_SINK_CAPS \ + "video/x-h264, width = (int) 1, 4096 , height = (int) 1, 4096 , " \ + "stream-format = (string) { byte-stream, avc, avc3 }, " \ + "alignment = (string) au, " \ + "profile = (string) { high, progressive-high, constrained-high, main, " \ + "constrained-baseline, baseline }" + +#define DOC_SRC_CAPS_COMM \ + "format = (string) NV12, " \ + "width = (int) 1, 4096 , height = (int) 1, 4096 " + +#define DOC_SRC_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SRC_CAPS_COMM "; " \ + "video/x-raw, " DOC_SRC_CAPS_COMM + +typedef struct _GstQsvH264Dec +{ + GstQsvDecoder parent; + GstH264NalParser *parser; + gboolean packetized; + gboolean nal_length_size; + + GstBuffer *sps_nalsGST_H264_MAX_SPS_COUNT; + GstBuffer *pps_nalsGST_H264_MAX_PPS_COUNT; +} GstQsvH264Dec; + +typedef struct _GstQsvH264DecClass +{ + GstQsvDecoderClass parent_class; +} GstQsvH264DecClass; + +static GTypeClass *parent_class = nullptr; + +#define GST_QSV_H264_DEC(object) ((GstQsvH264Dec *) (object)) +#define GST_QSV_H264_DEC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstQsvH264DecClass)) + +static gboolean gst_qsv_h264_dec_start (GstVideoDecoder * decoder); +static gboolean gst_qsv_h264_dec_stop (GstVideoDecoder * decoder); +static gboolean gst_qsv_h264_dec_set_format (GstQsvDecoder * decoder, + GstVideoCodecState * state); +static GstBuffer *gst_qsv_h264_dec_process_input (GstQsvDecoder * decoder, + gboolean need_codec_data, GstBuffer * buffer); + +static void +gst_qsv_h264_dec_class_init (GstQsvH264DecClass * klass, gpointer data) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoDecoderClass *videodec_class = GST_VIDEO_DECODER_CLASS (klass); + GstQsvDecoderClass *qsvdec_class = GST_QSV_DECODER_CLASS (klass); + GstQsvDecoderClassData *cdata = (GstQsvDecoderClassData *) data; + GstPadTemplate *pad_templ; + GstCaps *doc_caps; + + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + +#ifdef G_OS_WIN32 + std::string long_name = "Intel Quick Sync Video " + + std::string (cdata->description) + " H.264 Decoder"; + + gst_element_class_set_metadata (element_class, long_name.c_str (), + "Codec/Decoder/Video/Hardware", + "Intel Quick Sync Video H.264 Decoder", + "Seungha Yang <seungha@centricular.com>"); +#else + gst_element_class_set_static_metadata (element_class, + "Intel Quick Sync Video H.264 Decoder", + "Codec/Decoder/Video/Hardware", + "Intel Quick Sync Video H.264 Decoder", + "Seungha Yang <seungha@centricular.com>"); +#endif + + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + videodec_class->start = GST_DEBUG_FUNCPTR (gst_qsv_h264_dec_start); + videodec_class->stop = GST_DEBUG_FUNCPTR (gst_qsv_h264_dec_stop); + + qsvdec_class->set_format = GST_DEBUG_FUNCPTR (gst_qsv_h264_dec_set_format); + qsvdec_class->process_input = + GST_DEBUG_FUNCPTR (gst_qsv_h264_dec_process_input); + + qsvdec_class->codec_id = MFX_CODEC_AVC; + qsvdec_class->impl_index = cdata->impl_index; + qsvdec_class->adapter_luid = cdata->adapter_luid; + qsvdec_class->display_path = cdata->display_path; + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata->description); + g_free (cdata); +} + +static void +gst_qsv_h264_dec_init (GstQsvH264Dec * self) +{ +} + +static gboolean +gst_qsv_h264_dec_start (GstVideoDecoder * decoder) +{ + GstQsvH264Dec *self = GST_QSV_H264_DEC (decoder); + + self->parser = gst_h264_nal_parser_new (); + + return TRUE; +} + +static void +gst_qsv_h264_dec_clear_codec_data (GstQsvH264Dec * self) +{ + guint i; + + for (i = 0; i < G_N_ELEMENTS (self->sps_nals); i++) + gst_clear_buffer (&self->sps_nalsi); + + for (i = 0; i < G_N_ELEMENTS (self->pps_nals); i++) + gst_clear_buffer (&self->pps_nalsi); +} + +static gboolean +gst_qsv_h264_dec_stop (GstVideoDecoder * decoder) +{ + GstQsvH264Dec *self = GST_QSV_H264_DEC (decoder); + + gst_qsv_h264_dec_clear_codec_data (self); + + return GST_VIDEO_DECODER_CLASS (parent_class)->stop (decoder); +} + +static void +gst_qsv_h264_dec_store_nal (GstQsvH264Dec * self, guint id, + GstH264NalUnitType nal_type, GstH264NalUnit * nalu) +{ + GstBuffer *buf, **store; + guint size = nalu->size, store_size; + static const guint8 start_code = { 0, 0, 1 }; + + if (nal_type == GST_H264_NAL_SPS || nal_type == GST_H264_NAL_SUBSET_SPS) { + store_size = GST_H264_MAX_SPS_COUNT; + store = self->sps_nals; + GST_DEBUG_OBJECT (self, "storing sps %u", id); + } else if (nal_type == GST_H264_NAL_PPS) { + store_size = GST_H264_MAX_PPS_COUNT; + store = self->pps_nals; + GST_DEBUG_OBJECT (self, "storing pps %u", id); + } else { + return; + } + + if (id >= store_size) { + GST_DEBUG_OBJECT (self, "unable to store nal, id out-of-range %d", id); + return; + } + + buf = gst_buffer_new_allocate (nullptr, size + sizeof (start_code), nullptr); + gst_buffer_fill (buf, 0, start_code, sizeof (start_code)); + gst_buffer_fill (buf, sizeof (start_code), nalu->data + nalu->offset, size); + + if (storeid) + gst_buffer_unref (storeid); + + storeid = buf; +} + +static gboolean +gst_qsv_h264_dec_parse_codec_data (GstQsvH264Dec * self, const guint8 * data, + gsize size) +{ + GstH264NalParser *parser = self->parser; + GstH264DecoderConfigRecord *config = nullptr; + GstH264NalUnit *nalu; + GstH264ParserResult pres = GST_H264_PARSER_OK; + gboolean ret = TRUE; + guint i; + + if (gst_h264_parser_parse_decoder_config_record (parser, data, size, + &config) != GST_H264_PARSER_OK) { + GST_WARNING_OBJECT (self, "Failed to parse codec-data"); + return FALSE; + } + + self->nal_length_size = config->length_size_minus_one + 1; + for (i = 0; i < config->sps->len; i++) { + GstH264SPS sps; + nalu = &g_array_index (config->sps, GstH264NalUnit, i); + + if (nalu->type == GST_H264_NAL_SPS) + pres = gst_h264_parser_parse_sps (parser, nalu, &sps); + else if (nalu->type == GST_H264_NAL_SUBSET_SPS) + pres = gst_h264_parser_parse_subset_sps (parser, nalu, &sps); + else + continue; + + if (pres != GST_H264_PARSER_OK) { + GST_WARNING_OBJECT (self, "Failed to parse SPS"); + ret = FALSE; + goto out; + } + + gst_qsv_h264_dec_store_nal (self, + sps.id, (GstH264NalUnitType) nalu->type, nalu); + gst_h264_sps_clear (&sps); + } + + for (i = 0; i < config->pps->len; i++) { + GstH264PPS pps; + + nalu = &g_array_index (config->pps, GstH264NalUnit, i); + if (nalu->type != GST_H264_NAL_PPS) + continue; + + pres = gst_h264_parser_parse_pps (parser, nalu, &pps); + if (pres != GST_H264_PARSER_OK) { + GST_WARNING_OBJECT (self, "Failed to parse PPS nalu"); + ret = FALSE; + goto out; + } + + gst_qsv_h264_dec_store_nal (self, pps.id, GST_H264_NAL_PPS, nalu); + gst_h264_pps_clear (&pps); + } + +out: + gst_h264_decoder_config_record_free (config); + return ret; +} + +static gboolean +gst_qsv_h264_dec_set_format (GstQsvDecoder * decoder, + GstVideoCodecState * state) +{ + GstQsvH264Dec *self = GST_QSV_H264_DEC (decoder); + GstStructure *s; + const gchar *str; + GstMapInfo map; + + gst_qsv_h264_dec_clear_codec_data (self); + self->packetized = FALSE; + + s = gst_caps_get_structure (state->caps, 0); + str = gst_structure_get_string (s, "stream-format"); + if ((g_strcmp0 (str, "avc") == 0 || g_strcmp0 (str, "avc3")) && + state->codec_data) { + self->packetized = TRUE; + /* Will be updated */ + self->nal_length_size = 4; + } + + if (!self->packetized) + return TRUE; + + if (!gst_buffer_map (state->codec_data, &map, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Failed to map codec data"); + return FALSE; + } + + gst_qsv_h264_dec_parse_codec_data (self, map.data, map.size); + gst_buffer_unmap (state->codec_data, &map); + + return TRUE; +} + +static GstBuffer * +gst_qsv_h264_dec_process_input (GstQsvDecoder * decoder, + gboolean need_codec_data, GstBuffer * buffer) +{ + GstQsvH264Dec *self = GST_QSV_H264_DEC (decoder); + GstH264NalParser *parser = self->parser; + GstH264NalUnit nalu; + GstH264ParserResult pres; + GstMapInfo map; + gboolean have_sps = FALSE; + gboolean have_pps = FALSE; + guint i; + GstBuffer *new_buf; + static const guint8 start_code = { 0, 0, 1 }; + + if (!self->packetized) + return gst_buffer_ref (buffer); + + if (!gst_buffer_map (buffer, &map, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Failed to map input buffer"); + return nullptr; + } + + memset (&nalu, 0, sizeof (GstH264NalUnit)); + new_buf = gst_buffer_new (); + + do { + GstMemory *mem; + guint8 *data; + gsize size; + + pres = gst_h264_parser_identify_nalu_avc (parser, map.data, + nalu.offset + nalu.size, map.size, self->nal_length_size, &nalu); + + if (pres == GST_H264_PARSER_NO_NAL_END) + pres = GST_H264_PARSER_OK; + + switch (nalu.type) { + case GST_H264_NAL_SPS: + case GST_H264_NAL_SUBSET_SPS:{ + GstH264SPS sps; + + if (nalu.type == GST_H264_NAL_SPS) { + pres = gst_h264_parser_parse_sps (parser, &nalu, &sps); + } else { + pres = gst_h264_parser_parse_subset_sps (parser, &nalu, &sps); + } + + if (pres != GST_H264_PARSER_OK) + break; + + have_sps = TRUE; + gst_qsv_h264_dec_store_nal (self, + sps.id, (GstH264NalUnitType) nalu.type, &nalu); + gst_h264_sps_clear (&sps); + break; + } + case GST_H264_NAL_PPS:{ + GstH264PPS pps; + + pres = gst_h264_parser_parse_pps (parser, &nalu, &pps); + if (pres != GST_H264_PARSER_OK) + break; + + have_pps = TRUE; + gst_qsv_h264_dec_store_nal (self, + pps.id, (GstH264NalUnitType) nalu.type, &nalu); + gst_h264_pps_clear (&pps); + break; + } + default: + break; + } + + size = sizeof (start_code) + nalu.size; + data = (guint8 *) g_malloc (size); + memcpy (data, start_code, sizeof (start_code)); + memcpy (data + sizeof (start_code), nalu.data + nalu.offset, nalu.size); + + mem = gst_memory_new_wrapped ((GstMemoryFlags) 0, data, size, 0, size, + nullptr, (GDestroyNotify) g_free); + gst_buffer_append_memory (new_buf, mem); + } while (pres == GST_H264_PARSER_OK); + + gst_buffer_unmap (buffer, &map); + + if (need_codec_data) { + GstBuffer *tmp = gst_buffer_new (); + + if (!have_sps) { + for (i = 0; i < GST_H264_MAX_SPS_COUNT; i++) { + if (!self->sps_nalsi) + continue; + + tmp = gst_buffer_append (tmp, gst_buffer_ref (self->sps_nalsi)); + } + } + + if (!have_pps) { + for (i = 0; i < GST_H264_MAX_PPS_COUNT; i++) { + if (!self->pps_nalsi) + continue; + + tmp = gst_buffer_append (tmp, gst_buffer_ref (self->pps_nalsi)); + } + } + + new_buf = gst_buffer_append (tmp, new_buf); + } + + return new_buf; +} + +void +gst_qsv_h264_dec_register (GstPlugin * plugin, guint rank, guint impl_index, + GstObject * device, mfxSession session) +{ + mfxVideoParam param; + mfxInfoMFX *mfx; + GstQsvResolution max_resolution; + + GST_DEBUG_CATEGORY_INIT (gst_qsv_h264_dec_debug, + "qsvh264dec", 0, "qsvh264dec"); + + memset (¶m, 0, sizeof (mfxVideoParam)); + memset (&max_resolution, 0, sizeof (GstQsvResolution)); + + param.AsyncDepth = 4; + param.IOPattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; + + mfx = ¶m.mfx; + mfx->CodecId = MFX_CODEC_AVC; + + mfx->FrameInfo.FrameRateExtN = 30; + mfx->FrameInfo.FrameRateExtD = 1; + mfx->FrameInfo.AspectRatioW = 1; + mfx->FrameInfo.AspectRatioH = 1; + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; + mfx->FrameInfo.BitDepthLuma = 8; + mfx->FrameInfo.BitDepthChroma = 8; + mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + mfx->CodecProfile = MFX_PROFILE_AVC_MAIN; + + /* Check max-resolution */ + for (guint i = 0; i < G_N_ELEMENTS (gst_qsv_resolutions); i++) { + mfx->FrameInfo.Width = GST_ROUND_UP_16 (gst_qsv_resolutionsi.width); + mfx->FrameInfo.Height = GST_ROUND_UP_16 (gst_qsv_resolutionsi.height); + mfx->FrameInfo.CropW = gst_qsv_resolutionsi.width; + mfx->FrameInfo.CropH = gst_qsv_resolutionsi.height; + + if (MFXVideoDECODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) + break; + + max_resolution.width = gst_qsv_resolutionsi.width; + max_resolution.height = gst_qsv_resolutionsi.height; + } + + if (max_resolution.width == 0 || max_resolution.height == 0) + return; + + GST_INFO ("Maximum supported resolution: %dx%d", + max_resolution.width, max_resolution.height); + + /* To cover both landscape and portrait, + * select max value (width in this case) */ + guint resolution = MAX (max_resolution.width, max_resolution.height); + std::string src_caps_str = "video/x-raw, format=(string) NV12"; + + src_caps_str += ", width=(int) 1, " + std::to_string (resolution) + " "; + src_caps_str += ", height=(int) 1, " + std::to_string (resolution) + " "; + + GstCaps *src_caps = gst_caps_from_string (src_caps_str.c_str ()); + + /* TODO: Add support for VA */ +#ifdef G_OS_WIN32 + GstCaps *d3d11_caps = gst_caps_copy (src_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr); + gst_caps_set_features_simple (d3d11_caps, caps_features); + gst_caps_append (d3d11_caps, src_caps); + src_caps = d3d11_caps; +#endif + + std::string sink_caps_str = "video/x-h264"; + sink_caps_str += ", width=(int) 1, " + std::to_string (resolution) + " "; + sink_caps_str += ", height=(int) 1, " + std::to_string (resolution) + " "; + + sink_caps_str += ", stream-format=(string) { byte-stream, avc, avc3 }"; + sink_caps_str += ", alignment=(string) au"; + sink_caps_str += ", profile=(string) { high, progressive-high, " + "constrained-high, main, constrained-baseline, baseline } "; + + GstCaps *sink_caps = gst_caps_from_string (sink_caps_str.c_str ()); + + GST_MINI_OBJECT_FLAG_SET (sink_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (src_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GstQsvDecoderClassData *cdata = g_new0 (GstQsvDecoderClassData, 1); + cdata->sink_caps = sink_caps; + cdata->src_caps = src_caps; + cdata->impl_index = impl_index; + +#ifdef G_OS_WIN32 + g_object_get (device, "adapter-luid", &cdata->adapter_luid, + "description", &cdata->description, nullptr); +#else + g_object_get (device, "path", &cdata->display_path, nullptr); +#endif + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstQsvH264DecClass), + nullptr, + nullptr, + (GClassInitFunc) gst_qsv_h264_dec_class_init, + nullptr, + cdata, + sizeof (GstQsvH264Dec), + 0, + (GInstanceInitFunc) gst_qsv_h264_dec_init, + }; + + type_name = g_strdup ("GstQsvH264Dec"); + feature_name = g_strdup ("qsvh264dec"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstQsvH264Device%dDec", index); + feature_name = g_strdup_printf ("qsvh264device%ddec", index); + } + + type = g_type_register_static (GST_TYPE_QSV_DECODER, type_name, &type_info, + (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvh264dec.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include "gstqsvdecoder.h" + +G_BEGIN_DECLS + +void gst_qsv_h264_dec_register (GstPlugin * plugin, + guint rank, + guint impl_index, + GstObject * device, + mfxSession session); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvh264enc.cpp
Added
@@ -0,0 +1,2066 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-qsvh264enc + * @title: qsvh264enc + * + * Intel Quick Sync H.264 encoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc ! qsvh264enc ! h264parse ! matroskamux ! filesink location=out.mkv + * ``` + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvh264enc.h" +#include <gst/base/gstbytewriter.h> +#include <gst/codecparsers/gsth264parser.h> +#include <vector> +#include <string> +#include <set> +#include <string.h> + +#ifdef G_OS_WIN32 +#include <gst/d3d11/gstd3d11.h> +#else +#include <gst/va/gstva.h> +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_qsv_h264_enc_debug); +#define GST_CAT_DEFAULT gst_qsv_h264_enc_debug + +typedef enum +{ + GST_QSV_H264_ENC_SEI_INSERT, + GST_QSV_H264_ENC_SEI_INSERT_AND_DROP, + GST_QSV_H264_ENC_SEI_DISABLED, +} GstQsvH264EncSeiInsertMode; + +/** + * GstQsvH264EncSeiInsertMode: + * + * Since: 1.22 + */ +#define GST_TYPE_QSV_H264_ENC_SEI_INSERT_MODE (gst_qsv_h264_enc_sei_insert_mode_get_type ()) +static GType +gst_qsv_h264_enc_sei_insert_mode_get_type (void) +{ + static GType sei_insert_mode_type = 0; + static const GEnumValue insert_modes = { + /** + * GstQsvH264EncSeiInsertMode::insert: + * + * Since: 1.22 + */ + {GST_QSV_H264_ENC_SEI_INSERT, "Insert SEI", "insert"}, + + /** + * GstQsvH264EncSeiInsertMode::insert-and-drop: + * + * Since: 1.22 + */ + {GST_QSV_H264_ENC_SEI_INSERT_AND_DROP, + "Insert SEI and remove corresponding meta from output buffer", + "insert-and-drop"}, + + /** + * GstQsvH264EncSeiInsertMode::disabled: + * + * Since: 1.22 + */ + {GST_QSV_H264_ENC_SEI_DISABLED, "Disable SEI insertion", "disabled"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&sei_insert_mode_type)) { + GType type = + g_enum_register_static ("GstQsvH264EncSeiInsertMode", insert_modes); + g_once_init_leave (&sei_insert_mode_type, type); + } + + return sei_insert_mode_type; +} + +/** + * GstQsvH264EncRateControl: + * + * Since: 1.22 + */ +#define GST_TYPE_QSV_H264_ENC_RATE_CONTROL (gst_qsv_h264_enc_rate_control_get_type ()) +static GType +gst_qsv_h264_enc_rate_control_get_type (void) +{ + static GType rate_control_type = 0; + static const GEnumValue rate_controls = { + /** + * GstQsvH264EncRateControl::cbr: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_CBR, "Constant Bitrate", "cbr"}, + + /** + * GstQsvH264EncRateControl::vbr: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_VBR, "Variable Bitrate", "vbr"}, + + /** + * GstQsvH264EncRateControl::cqp: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_CQP, "Constant Quantizer", "cqp"}, + + /** + * GstQsvH264EncRateControl::avbr: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_AVBR, "Average Variable Bitrate", "avbr"}, + + /** + * GstQsvH264EncRateControl::la-vbr: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_LA, "VBR with look ahead (Non HRD compliant)", "la-vbr"}, + + /** + * GstQsvH264EncRateControl::icq: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_ICQ, "Intelligent CQP", "icq"}, + + /** + * GstQsvH264EncRateControl::vcm: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_VCM, "Video Conferencing Mode (Non HRD compliant)", "vcm"}, + + /** + * GstQsvH264EncRateControl::la-icq: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_LA_ICQ, "Intelligent CQP with LA (Non HRD compliant)", + "la-icq"}, + + /** + * GstQsvH264EncRateControl::la-hrd: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_LA_HRD, "HRD compliant LA", "la-hrd"}, + + /** + * GstQsvH264EncRateControl::qvbr: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_QVBR, "VBR with CQP", "qvbr"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&rate_control_type)) { + GType type = + g_enum_register_static ("GstQsvH264EncRateControl", rate_controls); + g_once_init_leave (&rate_control_type, type); + } + + return rate_control_type; +} + +/** + * GstQsvH264EncRCLookAheadDS: + * + * Since: 1.22 + */ +#define GST_TYPE_QSV_H264_ENC_RC_LOOKAHEAD_DS (gst_qsv_h264_enc_rc_lookahead_ds_get_type ()) +static GType +gst_qsv_h264_enc_rc_lookahead_ds_get_type (void) +{ + static GType rc_lookahead_ds_type = 0; + static const GEnumValue rc_lookahead_ds = { + /** + * GstQsvH264EncRCLookAheadDS::unknown + * + * Since: 1.22 + */ + {MFX_LOOKAHEAD_DS_UNKNOWN, "Unknown", "unknown"}, + + /** + * GstQsvH264EncRCLookAheadDS::off + * + * Since: 1.22 + */ + {MFX_LOOKAHEAD_DS_OFF, "Do not use down sampling", "off"}, + + /** + * GstQsvH264EncRCLookAheadDS::2x + * + * Since: 1.22 + */ + {MFX_LOOKAHEAD_DS_2x, + "Down sample frames two times before estimation", "2x"}, + + /** + * GstQsvH264EncRCLookAheadDS::4x + * + * Since: 1.22 + */ + {MFX_LOOKAHEAD_DS_4x, + "Down sample frames four times before estimation", "4x"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&rc_lookahead_ds_type)) { + GType type = + g_enum_register_static ("GstQsvH264EncRCLookAheadDS", rc_lookahead_ds); + g_once_init_leave (&rc_lookahead_ds_type, type); + } + + return rc_lookahead_ds_type; +} + +enum +{ + PROP_0, + PROP_CABAC, + PROP_MIN_QP_I, + PROP_MIN_QP_P, + PROP_MIN_QP_B, + PROP_MAX_QP_I, + PROP_MAX_QP_P, + PROP_MAX_QP_B, + PROP_QP_I, + PROP_QP_P, + PROP_QP_B, + PROP_GOP_SIZE, + PROP_IDR_INTERVAL, + PROP_B_FRAMES, + PROP_REF_FRAMES, + PROP_BITRATE, + PROP_MAX_BITRATE, + PROP_RATE_CONTROL, + PROP_RC_LOOKAHEAD, + PROP_RC_LOOKAHEAD_DS, + PROP_AVBR_ACCURACY, + PROP_AVBR_CONVERGENCE, + PROP_ICQ_QUALITY, + PROP_QVBR_QUALITY, + PROP_DISABLE_HRD_CONFORMANCE, + PROP_CC_INSERT, +}; + +#define DEFAULT_CABAC MFX_CODINGOPTION_UNKNOWN +#define DEFAULT_QP 0 +#define DEFAULT_GOP_SIZE 30 +#define DEFAULT_IDR_INTERVAL 0 +#define DEFAULT_B_FRAMES 0 +#define DEFAULT_REF_FRAMES 2 +#define DEFAULT_BITRATE 2000 +#define DEFAULT_MAX_BITRATE 0 +#define DEFAULT_RATE_CONTROL MFX_RATECONTROL_VBR +#define DEFAULT_RC_LOOKAHEAD 10 +#define DEFAULT_RC_LOOKAHEAD_DS MFX_LOOKAHEAD_DS_UNKNOWN +#define DEFAULT_AVBR_ACCURACY 0 +#define DEFAULT_AVBR_CONVERGENCE 0 +#define DEFAULT_IQC_QUALITY 0 +#define DEFAULT_QVBR_QUALITY 0 +#define DEFAULT_DISABLE_HRD_CONFORMANCE FALSE +#define DEFAULT_CC_INSERT GST_QSV_H264_ENC_SEI_INSERT + +#define DOC_SINK_CAPS_COMM \ + "format = (string) NV12, " \ + "width = (int) 16, 8192 , height = (int) 16, 8192 " + +#define DOC_SINK_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw(memory:VAMemory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw, " DOC_SINK_CAPS_COMM + +#define DOC_SRC_CAPS \ + "video/x-h264, width = (int) 16, 8192 , height = (int) 16, 8192 , " \ + "stream-format = (string) { avc, byte-stream }, alignment = (string) au, " \ + "profile = (string) { high, main, constrained-baseline, " \ + "progressive-high, constrained-high, baseline }" + +typedef struct _GstQsvH264EncClassData +{ + GstCaps *sink_caps; + GstCaps *src_caps; + guint impl_index; + gint64 adapter_luid; + gchar *display_path; + gchar *description; +} GstQsvH264EncClassData; + +typedef struct _GstQsvH264Enc +{ + GstQsvEncoder parent; + + mfxExtVideoSignalInfo signal_info; + mfxExtCodingOption option; + mfxExtCodingOption2 option2; + mfxExtCodingOption3 option3; + + gboolean packetized; + GstH264NalParser *parser; + + mfxU16 profile; + + GMutex prop_lock; + /* protected by prop_lock */ + gboolean bitrate_updated; + gboolean property_updated; + + /* properties */ + mfxU16 cabac; + guint min_qp_i; + guint min_qp_p; + guint min_qp_b; + guint max_qp_i; + guint max_qp_p; + guint max_qp_b; + guint qp_i; + guint qp_p; + guint qp_b; + guint gop_size; + guint idr_interval; + guint bframes; + guint ref_frames; + guint bitrate; + guint max_bitrate; + mfxU16 rate_control; + guint rc_lookahead; + mfxU16 rc_lookahead_ds; + guint avbr_accuracy; + guint avbr_convergence; + guint icq_quality; + guint qvbr_quality; + gboolean disable_hrd_conformance; + GstQsvH264EncSeiInsertMode cc_insert; +} GstQsvH264Enc; + +typedef struct _GstQsvH264EncClass +{ + GstQsvEncoderClass parent_class; +} GstQsvH264EncClass; + +static GstElementClass *parent_class = nullptr; + +#define GST_QSV_H264_ENC(object) ((GstQsvH264Enc *) (object)) +#define GST_QSV_H264_ENC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstQsvH264EncClass)) + +static void gst_qsv_h264_enc_finalize (GObject * object); +static void gst_qsv_h264_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_qsv_h264_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_qsv_h264_enc_start (GstVideoEncoder * encoder); +static gboolean gst_qsv_h264_enc_transform_meta (GstVideoEncoder * encoder, + GstVideoCodecFrame * frame, GstMeta * meta); +static GstCaps *gst_qsv_h264_enc_getcaps (GstVideoEncoder * encoder, + GstCaps * filter); + +static gboolean gst_qsv_h264_enc_set_format (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxVideoParam * param, + GPtrArray * extra_params); +static gboolean gst_qsv_h264_enc_set_output_state (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxSession session); +static gboolean gst_qsv_h264_enc_attach_payload (GstQsvEncoder * encoder, + GstVideoCodecFrame * frame, GPtrArray * payload); +static GstBuffer *gst_qsv_h264_enc_create_output_buffer (GstQsvEncoder * + encoder, mfxBitstream * bitstream); +static GstQsvEncoderReconfigure +gst_qsv_h264_enc_check_reconfigure (GstQsvEncoder * encoder, mfxSession session, + mfxVideoParam * param, GPtrArray * extra_params); + +static void +gst_qsv_h264_enc_class_init (GstQsvH264EncClass * klass, gpointer data) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoEncoderClass *encoder_class = GST_VIDEO_ENCODER_CLASS (klass); + GstQsvEncoderClass *qsvenc_class = GST_QSV_ENCODER_CLASS (klass); + GstQsvH264EncClassData *cdata = (GstQsvH264EncClassData *) data; + GstPadTemplate *pad_templ; + GstCaps *doc_caps; + + qsvenc_class->codec_id = MFX_CODEC_AVC; + qsvenc_class->impl_index = cdata->impl_index; + qsvenc_class->adapter_luid = cdata->adapter_luid; + qsvenc_class->display_path = cdata->display_path; + + object_class->finalize = gst_qsv_h264_enc_finalize; + object_class->set_property = gst_qsv_h264_enc_set_property; + object_class->get_property = gst_qsv_h264_enc_get_property; + + g_object_class_install_property (object_class, PROP_CABAC, + g_param_spec_enum ("cabac", "Cabac", "Enables CABAC entropy coding", + GST_TYPE_QSV_CODING_OPTION, DEFAULT_CABAC, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MIN_QP_I, + g_param_spec_uint ("min-qp-i", "Min QP I", + "Minimum allowed QP value for I-frame types (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MIN_QP_P, + g_param_spec_uint ("min-qp-p", "Min QP P", + "Minimum allowed QP value for P-frame types (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MIN_QP_B, + g_param_spec_uint ("min-qp-b", "Min QP B", + "Minimum allowed QP value for B-frame types (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MAX_QP_I, + g_param_spec_uint ("max-qp-i", "Max QP I", + "Maximum allowed QP value for I-frame types (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MAX_QP_P, + g_param_spec_uint ("max-qp-p", "Max QP P", + "Maximum allowed QP value for P-frame types (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MAX_QP_B, + g_param_spec_uint ("max-qp-b", "Max QP B", + "Maximum allowed QP value for B-frame types (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_QP_I, + g_param_spec_uint ("qp-i", "QP I", + "Constant quantizer for I frames (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_QP_P, + g_param_spec_uint ("qp-p", "QP P", + "Constant quantizer for P frames (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_QP_B, + g_param_spec_uint ("qp-b", "QP B", + "Constant quantizer for B frames (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_GOP_SIZE, + g_param_spec_uint ("gop-size", "GOP Size", + "Number of pictures within a GOP (0: unspecified)", + 0, G_MAXUSHORT, DEFAULT_GOP_SIZE, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_IDR_INTERVAL, + g_param_spec_uint ("idr-interval", "IDR interval", + "IDR-frame interval in terms of I-frames. " + "0: every I-frame is an IDR frame, " + "N: \"N\" I-frames are inserted between IDR-frames", + 0, G_MAXUSHORT, DEFAULT_IDR_INTERVAL, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_B_FRAMES, + g_param_spec_uint ("b-frames", "B Frames", + "Number of B frames between I and P frames", + 0, G_MAXUSHORT, DEFAULT_B_FRAMES, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_REF_FRAMES, + g_param_spec_uint ("ref-frames", "Reference Frames", + "Number of reference frames (0: unspecified)", + 0, 16, DEFAULT_REF_FRAMES, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_BITRATE, + g_param_spec_uint ("bitrate", "Bitrate", + "Target bitrate in kbit/sec, Ignored when selected rate-control mode " + "is constant QP variants (i.e., \"cqp\", \"icq\", and \"la_icq\")", + 0, G_MAXINT, DEFAULT_BITRATE, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MAX_BITRATE, + g_param_spec_uint ("max-bitrate", "Max Bitrate", + "Maximum bitrate in kbit/sec, Ignored when selected rate-control mode " + "is constant QP variants (i.e., \"cqp\", \"icq\", and \"la_icq\")", + 0, G_MAXINT, DEFAULT_MAX_BITRATE, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_RATE_CONTROL, + g_param_spec_enum ("rate-control", "Rate Control", + "Rate Control Method", GST_TYPE_QSV_H264_ENC_RATE_CONTROL, + DEFAULT_RATE_CONTROL, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_RC_LOOKAHEAD, + g_param_spec_uint ("rc-lookahead", "Rate Control Look-ahead", + "Number of frames to look ahead for Rate Control, used for " + "\"la_vbr\", \"la_icq\", and \"la_hrd\" rate-control modes", + 10, 100, DEFAULT_RC_LOOKAHEAD, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_RC_LOOKAHEAD_DS, + g_param_spec_enum ("rc-lookahead-ds", + "Rate Control Look-ahead Downsampling", + "Downsampling method in look-ahead rate control", + GST_TYPE_QSV_H264_ENC_RC_LOOKAHEAD_DS, DEFAULT_RC_LOOKAHEAD_DS, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_AVBR_ACCURACY, + g_param_spec_uint ("avbr-accuracy", "AVBR Accuracy", + "AVBR Accuracy in the unit of tenth of percent", + 0, G_MAXUINT16, DEFAULT_AVBR_ACCURACY, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_AVBR_CONVERGENCE, + g_param_spec_uint ("avbr-convergence", "AVBR Convergence", + "AVBR Convergence in the unit of 100 frames", + 0, G_MAXUINT16, DEFAULT_AVBR_ACCURACY, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_ICQ_QUALITY, + g_param_spec_uint ("icq-quality", "ICQ Quality", + "Intelligent Constant Quality for \"icq\" rate-control (0: default)", + 0, 51, DEFAULT_IQC_QUALITY, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_QVBR_QUALITY, + g_param_spec_uint ("qvbr-quality", "QVBR Quality", + "Quality level used for \"qvbr\" rate-control mode (0: default)", + 0, 51, DEFAULT_QVBR_QUALITY, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_DISABLE_HRD_CONFORMANCE, + g_param_spec_boolean ("disable-hrd-conformance", + "Disable HRD Conformance", "Allow NAL HRD non-conformant stream", + DEFAULT_DISABLE_HRD_CONFORMANCE, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_CC_INSERT, + g_param_spec_enum ("cc-insert", "Closed Caption Insert", + "Closed Caption Insert mode. " + "Only CEA-708 RAW format is supported for now", + GST_TYPE_QSV_H264_ENC_SEI_INSERT_MODE, DEFAULT_CC_INSERT, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + parent_class = (GstElementClass *) g_type_class_peek_parent (klass); + +#ifdef G_OS_WIN32 + std::string long_name = "Intel Quick Sync Video " + + std::string (cdata->description) + " H.264 Encoder"; + + gst_element_class_set_metadata (element_class, long_name.c_str (), + "Codec/Encoder/Video/Hardware", + "Intel Quick Sync Video H.264 Encoder", + "Seungha Yang <seungha@centricular.com>"); +#else + gst_element_class_set_static_metadata (element_class, + "Intel Quick Sync Video H.264 Encoder", + "Codec/Encoder/Video/Hardware", + "Intel Quick Sync Video H.264 Encoder", + "Seungha Yang <seungha@centricular.com>"); +#endif + + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + encoder_class->start = GST_DEBUG_FUNCPTR (gst_qsv_h264_enc_start); + encoder_class->transform_meta = + GST_DEBUG_FUNCPTR (gst_qsv_h264_enc_transform_meta); + encoder_class->getcaps = GST_DEBUG_FUNCPTR (gst_qsv_h264_enc_getcaps); + + qsvenc_class->set_format = GST_DEBUG_FUNCPTR (gst_qsv_h264_enc_set_format); + qsvenc_class->set_output_state = + GST_DEBUG_FUNCPTR (gst_qsv_h264_enc_set_output_state); + qsvenc_class->attach_payload = + GST_DEBUG_FUNCPTR (gst_qsv_h264_enc_attach_payload); + qsvenc_class->create_output_buffer = + GST_DEBUG_FUNCPTR (gst_qsv_h264_enc_create_output_buffer); + qsvenc_class->check_reconfigure = + GST_DEBUG_FUNCPTR (gst_qsv_h264_enc_check_reconfigure); + + gst_type_mark_as_plugin_api (GST_TYPE_QSV_H264_ENC_SEI_INSERT_MODE, + (GstPluginAPIFlags) 0); + gst_type_mark_as_plugin_api (GST_TYPE_QSV_H264_ENC_RATE_CONTROL, + (GstPluginAPIFlags) 0); + gst_type_mark_as_plugin_api (GST_TYPE_QSV_H264_ENC_RC_LOOKAHEAD_DS, + (GstPluginAPIFlags) 0); + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata->description); + g_free (cdata); +} + +static void +gst_qsv_h264_enc_init (GstQsvH264Enc * self) +{ + self->cabac = DEFAULT_CABAC; + self->min_qp_i = DEFAULT_QP; + self->min_qp_p = DEFAULT_QP; + self->min_qp_b = DEFAULT_QP; + self->max_qp_i = DEFAULT_QP; + self->max_qp_p = DEFAULT_QP; + self->max_qp_p = DEFAULT_QP; + self->qp_i = DEFAULT_QP; + self->qp_p = DEFAULT_QP; + self->qp_b = DEFAULT_QP; + self->gop_size = DEFAULT_GOP_SIZE; + self->idr_interval = DEFAULT_IDR_INTERVAL; + self->bframes = DEFAULT_B_FRAMES; + self->ref_frames = DEFAULT_REF_FRAMES; + self->bitrate = DEFAULT_BITRATE; + self->max_bitrate = DEFAULT_MAX_BITRATE; + self->rate_control = DEFAULT_RATE_CONTROL; + self->rc_lookahead = DEFAULT_RC_LOOKAHEAD; + self->rc_lookahead_ds = DEFAULT_RC_LOOKAHEAD_DS; + self->avbr_accuracy = DEFAULT_AVBR_ACCURACY; + self->avbr_convergence = DEFAULT_AVBR_CONVERGENCE; + self->icq_quality = DEFAULT_IQC_QUALITY; + self->qvbr_quality = DEFAULT_QVBR_QUALITY; + self->disable_hrd_conformance = DEFAULT_DISABLE_HRD_CONFORMANCE; + self->cc_insert = DEFAULT_CC_INSERT; + + g_mutex_init (&self->prop_lock); + + self->parser = gst_h264_nal_parser_new (); +} + +static void +gst_qsv_h264_enc_finalize (GObject * object) +{ + GstQsvH264Enc *self = GST_QSV_H264_ENC (object); + + g_mutex_clear (&self->prop_lock); + gst_h264_nal_parser_free (self->parser); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_qsv_h264_enc_check_update_uint (GstQsvH264Enc * self, guint * old_val, + guint new_val, gboolean is_bitrate_param) +{ + if (*old_val == new_val) + return; + + g_mutex_lock (&self->prop_lock); + *old_val = new_val; + if (is_bitrate_param) + self->bitrate_updated = TRUE; + else + self->property_updated = TRUE; + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_qsv_h264_enc_check_update_enum (GstQsvH264Enc * self, mfxU16 * old_val, + gint new_val) +{ + if (*old_val == (mfxU16) new_val) + return; + + g_mutex_lock (&self->prop_lock); + *old_val = (mfxU16) new_val; + self->property_updated = TRUE; + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_qsv_h264_enc_check_update_boolean (GstQsvH264Enc * self, gboolean * old_val, + gboolean new_val) +{ + if (*old_val == new_val) + return; + + g_mutex_lock (&self->prop_lock); + *old_val = new_val; + self->property_updated = TRUE; + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_qsv_h264_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstQsvH264Enc *self = GST_QSV_H264_ENC (object); + + switch (prop_id) { + case PROP_CABAC: + gst_qsv_h264_enc_check_update_enum (self, &self->cabac, + g_value_get_enum (value)); + break; + /* MIN/MAX QP change requires new sequence */ + case PROP_MIN_QP_I: + gst_qsv_h264_enc_check_update_uint (self, &self->min_qp_i, + g_value_get_uint (value), FALSE); + break; + case PROP_MIN_QP_P: + gst_qsv_h264_enc_check_update_uint (self, &self->min_qp_p, + g_value_get_uint (value), FALSE); + break; + case PROP_MIN_QP_B: + gst_qsv_h264_enc_check_update_uint (self, &self->min_qp_b, + g_value_get_uint (value), FALSE); + break; + case PROP_MAX_QP_I: + gst_qsv_h264_enc_check_update_uint (self, &self->max_qp_i, + g_value_get_uint (value), FALSE); + break; + case PROP_MAX_QP_P: + gst_qsv_h264_enc_check_update_uint (self, &self->max_qp_p, + g_value_get_uint (value), FALSE); + break; + case PROP_MAX_QP_B: + gst_qsv_h264_enc_check_update_uint (self, &self->max_qp_b, + g_value_get_uint (value), FALSE); + break; + case PROP_QP_I: + gst_qsv_h264_enc_check_update_uint (self, &self->qp_i, + g_value_get_uint (value), TRUE); + break; + case PROP_QP_P: + gst_qsv_h264_enc_check_update_uint (self, &self->qp_p, + g_value_get_uint (value), TRUE); + break; + case PROP_QP_B: + gst_qsv_h264_enc_check_update_uint (self, &self->qp_b, + g_value_get_uint (value), TRUE); + break; + case PROP_GOP_SIZE: + gst_qsv_h264_enc_check_update_uint (self, &self->gop_size, + g_value_get_uint (value), FALSE); + break; + case PROP_IDR_INTERVAL: + gst_qsv_h264_enc_check_update_uint (self, &self->idr_interval, + g_value_get_uint (value), FALSE); + break; + case PROP_B_FRAMES: + gst_qsv_h264_enc_check_update_uint (self, &self->bframes, + g_value_get_uint (value), FALSE); + break; + case PROP_REF_FRAMES: + gst_qsv_h264_enc_check_update_uint (self, &self->ref_frames, + g_value_get_uint (value), FALSE); + break; + case PROP_BITRATE: + gst_qsv_h264_enc_check_update_uint (self, &self->bitrate, + g_value_get_uint (value), TRUE); + break; + case PROP_MAX_BITRATE: + gst_qsv_h264_enc_check_update_uint (self, &self->max_bitrate, + g_value_get_uint (value), TRUE); + break; + case PROP_RATE_CONTROL: + gst_qsv_h264_enc_check_update_enum (self, &self->rate_control, + g_value_get_enum (value)); + break; + case PROP_RC_LOOKAHEAD: + gst_qsv_h264_enc_check_update_uint (self, &self->rc_lookahead, + g_value_get_uint (value), FALSE); + break; + case PROP_RC_LOOKAHEAD_DS: + gst_qsv_h264_enc_check_update_enum (self, &self->rc_lookahead_ds, + g_value_get_enum (value)); + break; + case PROP_AVBR_ACCURACY: + gst_qsv_h264_enc_check_update_uint (self, &self->avbr_accuracy, + g_value_get_uint (value), FALSE); + break; + case PROP_AVBR_CONVERGENCE: + gst_qsv_h264_enc_check_update_uint (self, &self->avbr_convergence, + g_value_get_uint (value), FALSE); + break; + case PROP_ICQ_QUALITY: + gst_qsv_h264_enc_check_update_uint (self, &self->icq_quality, + g_value_get_uint (value), FALSE); + break; + case PROP_QVBR_QUALITY: + gst_qsv_h264_enc_check_update_uint (self, &self->qvbr_quality, + g_value_get_uint (value), FALSE); + break; + case PROP_DISABLE_HRD_CONFORMANCE: + gst_qsv_h264_enc_check_update_boolean (self, + &self->disable_hrd_conformance, g_value_get_boolean (value)); + break; + case PROP_CC_INSERT: + /* This property is unrelated to encoder-reset */ + self->cc_insert = (GstQsvH264EncSeiInsertMode) g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_qsv_h264_enc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstQsvH264Enc *self = GST_QSV_H264_ENC (object); + + switch (prop_id) { + case PROP_CABAC: + g_value_set_enum (value, self->cabac); + break; + case PROP_MIN_QP_I: + g_value_set_uint (value, self->min_qp_i); + break; + case PROP_MIN_QP_P: + g_value_set_uint (value, self->min_qp_p); + break; + case PROP_MIN_QP_B: + g_value_set_uint (value, self->min_qp_b); + break; + case PROP_MAX_QP_I: + g_value_set_uint (value, self->max_qp_i); + break; + case PROP_MAX_QP_P: + g_value_set_uint (value, self->max_qp_p); + break; + case PROP_MAX_QP_B: + g_value_set_uint (value, self->max_qp_b); + break; + case PROP_QP_I: + g_value_set_uint (value, self->qp_i); + break; + case PROP_QP_P: + g_value_set_uint (value, self->qp_p); + break; + case PROP_QP_B: + g_value_set_uint (value, self->qp_b); + break; + case PROP_GOP_SIZE: + g_value_set_uint (value, self->gop_size); + break; + case PROP_IDR_INTERVAL: + g_value_set_uint (value, self->idr_interval); + break; + case PROP_B_FRAMES: + g_value_set_uint (value, self->bframes); + break; + case PROP_REF_FRAMES: + g_value_set_uint (value, self->ref_frames); + break; + case PROP_BITRATE: + g_value_set_uint (value, self->bitrate); + break; + case PROP_MAX_BITRATE: + g_value_set_uint (value, self->max_bitrate); + break; + case PROP_RATE_CONTROL: + g_value_set_enum (value, self->rate_control); + break; + case PROP_RC_LOOKAHEAD: + g_value_set_uint (value, self->rc_lookahead); + break; + case PROP_RC_LOOKAHEAD_DS: + g_value_set_enum (value, self->rc_lookahead_ds); + break; + case PROP_AVBR_ACCURACY: + g_value_set_uint (value, self->avbr_accuracy); + break; + case PROP_AVBR_CONVERGENCE: + g_value_set_uint (value, self->avbr_convergence); + break; + case PROP_ICQ_QUALITY: + g_value_set_uint (value, self->icq_quality); + break; + case PROP_QVBR_QUALITY: + g_value_set_uint (value, self->qvbr_quality); + break; + case PROP_CC_INSERT: + g_value_set_enum (value, self->cc_insert); + break; + case PROP_DISABLE_HRD_CONFORMANCE: + g_value_set_boolean (value, self->disable_hrd_conformance); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_qsv_h264_enc_start (GstVideoEncoder * encoder) +{ + /* To avoid negative DTS when B frame is enabled */ + gst_video_encoder_set_min_pts (encoder, GST_SECOND * 60 * 60 * 1000); + + return TRUE; +} + +static gboolean +gst_qsv_h264_enc_transform_meta (GstVideoEncoder * encoder, + GstVideoCodecFrame * frame, GstMeta * meta) +{ + GstQsvH264Enc *self = GST_QSV_H264_ENC (encoder); + GstVideoCaptionMeta *cc_meta; + + /* We need to handle only case CC meta should be dropped */ + if (self->cc_insert != GST_QSV_H264_ENC_SEI_INSERT_AND_DROP) + goto out; + + if (meta->info->api != GST_VIDEO_CAPTION_META_API_TYPE) + goto out; + + cc_meta = (GstVideoCaptionMeta *) meta; + if (cc_meta->caption_type != GST_VIDEO_CAPTION_TYPE_CEA708_RAW) + goto out; + + /* Don't copy this meta into output buffer */ + return FALSE; + +out: + return GST_VIDEO_ENCODER_CLASS (parent_class)->transform_meta (encoder, + frame, meta); +} + +static GstCaps * +gst_qsv_h264_enc_getcaps (GstVideoEncoder * encoder, GstCaps * filter) +{ + GstQsvH264Enc *self = GST_QSV_H264_ENC (encoder); + GstCaps *allowed_caps; + GstCaps *template_caps; + GstCaps *supported_caps; + std::set < std::string > downstream_profiles; + + allowed_caps = gst_pad_get_allowed_caps (encoder->srcpad); + + /* Shouldn't be any or empty though, just return template caps in this case */ + if (!allowed_caps || gst_caps_is_empty (allowed_caps) || + gst_caps_is_any (allowed_caps)) { + gst_clear_caps (&allowed_caps); + + return gst_video_encoder_proxy_getcaps (encoder, nullptr, filter); + } + + /* Check if downstream specified profile explicitly, then filter out + * incompatible interlaced field */ + for (guint i = 0; i < gst_caps_get_size (allowed_caps); i++) { + const GValue *profile_value; + const gchar *profile; + GstStructure *s; + + s = gst_caps_get_structure (allowed_caps, i); + profile_value = gst_structure_get_value (s, "profile"); + if (!profile_value) + continue; + + if (GST_VALUE_HOLDS_LIST (profile_value)) { + for (guint j = 0; j < gst_value_list_get_size (profile_value); j++) { + const GValue *p = gst_value_list_get_value (profile_value, j); + + if (!G_VALUE_HOLDS_STRING (p)) + continue; + + profile = g_value_get_string (p); + if (profile) + downstream_profiles.insert (profile); + } + + } else if (G_VALUE_HOLDS_STRING (profile_value)) { + profile = g_value_get_string (profile_value); + if (profile) + downstream_profiles.insert (profile); + } + } + + GST_DEBUG_OBJECT (self, "Downstream specified %" G_GSIZE_FORMAT " profiles", + downstream_profiles.size ()); + + /* Caps returned by gst_pad_get_allowed_caps() should hold profile field + * already */ + if (downstream_profiles.size () == 0) { + GST_WARNING_OBJECT (self, + "Allowed caps holds no profile field %" GST_PTR_FORMAT, allowed_caps); + + gst_clear_caps (&allowed_caps); + + return gst_video_encoder_proxy_getcaps (encoder, nullptr, filter); + } + + gst_clear_caps (&allowed_caps); + + /* Profile allows interlaced? */ + /* *INDENT-OFF* */ + gboolean can_support_interlaced = FALSE; + for (const auto &iter: downstream_profiles) { + if (iter == "high" || iter == "main") { + can_support_interlaced = TRUE; + break; + } + } + /* *INDENT-ON* */ + + GST_DEBUG_OBJECT (self, "Downstream %s support interlaced format", + can_support_interlaced ? "can" : "cannot"); + + if (can_support_interlaced) { + /* No special handling is needed */ + return gst_video_encoder_proxy_getcaps (encoder, nullptr, filter); + } + + template_caps = gst_pad_get_pad_template_caps (encoder->sinkpad); + template_caps = gst_caps_make_writable (template_caps); + + gst_caps_set_simple (template_caps, "interlace-mode", G_TYPE_STRING, + "progressive", nullptr); + + supported_caps = gst_video_encoder_proxy_getcaps (encoder, + template_caps, filter); + gst_caps_unref (template_caps); + + GST_DEBUG_OBJECT (self, "Returning %" GST_PTR_FORMAT, supported_caps); + + return supported_caps; +} + +typedef struct +{ + mfxU16 profile; + const gchar *profile_str; +} H264Profile; + +static const H264Profile profile_map = { + {MFX_PROFILE_AVC_HIGH, "high"}, + {MFX_PROFILE_AVC_MAIN, "main"}, + {MFX_PROFILE_AVC_CONSTRAINED_BASELINE, "constrained-baseline"}, + {MFX_PROFILE_AVC_PROGRESSIVE_HIGH, "progressive-high"}, + {MFX_PROFILE_AVC_CONSTRAINED_HIGH, "constrained-high"}, + {MFX_PROFILE_AVC_BASELINE, "baseline"} +}; + +static const gchar * +gst_qsv_h264_profile_to_string (mfxU16 profile) +{ + for (guint i = 0; i < G_N_ELEMENTS (profile_map); i++) { + if (profile_mapi.profile == profile) + return profile_mapi.profile_str; + } + + return nullptr; +} + +static mfxU16 +gst_qsv_h264_profile_string_to_value (const gchar * profile_str) +{ + for (guint i = 0; i < G_N_ELEMENTS (profile_map); i++) { + if (g_strcmp0 (profile_mapi.profile_str, profile_str) == 0) + return profile_mapi.profile; + } + + return MFX_PROFILE_UNKNOWN; +} + +static void +gst_qsv_h264_enc_init_extra_params (GstQsvH264Enc * self) +{ + memset (&self->signal_info, 0, sizeof (mfxExtVideoSignalInfo)); + memset (&self->option, 0, sizeof (mfxExtCodingOption)); + memset (&self->option2, 0, sizeof (mfxExtCodingOption2)); + memset (&self->option3, 0, sizeof (mfxExtCodingOption3)); + + self->signal_info.Header.BufferId = MFX_EXTBUFF_VIDEO_SIGNAL_INFO; + self->signal_info.Header.BufferSz = sizeof (mfxExtVideoSignalInfo); + + self->option.Header.BufferId = MFX_EXTBUFF_CODING_OPTION; + self->option.Header.BufferSz = sizeof (mfxExtCodingOption); + + self->option2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION2; + self->option2.Header.BufferSz = sizeof (mfxExtCodingOption2); + + self->option3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3; + self->option3.Header.BufferSz = sizeof (mfxExtCodingOption3); +} + +static void +gst_qsv_h264_enc_set_bitrate (GstQsvH264Enc * self, mfxVideoParam * param) +{ + guint max_val; + guint multiplier; + + switch (param->mfx.RateControlMethod) { + case MFX_RATECONTROL_CBR: + multiplier = (self->bitrate + 0x10000) / 0x10000; + param->mfx.TargetKbps = param->mfx.MaxKbps = self->bitrate / multiplier; + param->mfx.BRCParamMultiplier = (mfxU16) multiplier; + break; + case MFX_RATECONTROL_VBR: + case MFX_RATECONTROL_VCM: + case MFX_RATECONTROL_QVBR: + max_val = MAX (self->bitrate, self->max_bitrate); + multiplier = (max_val + 0x10000) / 0x10000; + param->mfx.TargetKbps = self->bitrate / multiplier; + param->mfx.MaxKbps = self->max_bitrate / multiplier; + param->mfx.BRCParamMultiplier = (mfxU16) multiplier; + break; + case MFX_RATECONTROL_CQP: + param->mfx.QPI = self->qp_i; + param->mfx.QPP = self->qp_p; + param->mfx.QPB = self->qp_b; + break; + case MFX_RATECONTROL_AVBR: + multiplier = (self->bitrate + 0x10000) / 0x10000; + param->mfx.TargetKbps = self->bitrate / multiplier; + param->mfx.Accuracy = self->avbr_accuracy; + param->mfx.Convergence = self->avbr_convergence; + param->mfx.BRCParamMultiplier = (mfxU16) multiplier; + break; + case MFX_RATECONTROL_LA: + multiplier = (self->bitrate + 0x10000) / 0x10000; + param->mfx.TargetKbps = self->bitrate / multiplier; + param->mfx.BRCParamMultiplier = (mfxU16) multiplier; + break; + case MFX_RATECONTROL_LA_HRD: + max_val = MAX (self->bitrate, self->max_bitrate); + multiplier = (max_val + 0x10000) / 0x10000; + param->mfx.TargetKbps = self->bitrate / multiplier; + param->mfx.MaxKbps = self->max_bitrate / multiplier; + param->mfx.BRCParamMultiplier = (mfxU16) multiplier; + break; + case MFX_RATECONTROL_ICQ: + case MFX_RATECONTROL_LA_ICQ: + param->mfx.ICQQuality = self->icq_quality; + break; + default: + GST_WARNING_OBJECT (self, + "Unhandled rate-control method %d", self->rate_control); + break; + } +} + +static gboolean +gst_qsv_h264_enc_set_format (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxVideoParam * param, GPtrArray * extra_params) +{ + GstQsvH264Enc *self = GST_QSV_H264_ENC (encoder); + GstCaps *allowed_caps, *fixated_caps; + std::set < std::string > downstream_profiles; + std::set < std::string > tmp; + guint bframes = self->bframes; + mfxU16 cabac = self->cabac; + std::string profile_str; + mfxU16 mfx_profile = MFX_PROFILE_UNKNOWN; + GstVideoInfo *info = &state->info; + mfxExtVideoSignalInfo *signal_info = nullptr; + mfxExtCodingOption *option; + mfxExtCodingOption2 *option2; + mfxExtCodingOption3 *option3; + GstStructure *s; + const gchar *stream_format; + mfxFrameInfo *frame_info; + + frame_info = ¶m->mfx.FrameInfo; + + /* QSV specific alignment requirement: + * width/height should be multiple of 16, and for interlaced encoding, + * height should be multiple of 32 */ + frame_info->Width = GST_ROUND_UP_16 (info->width); + if (GST_VIDEO_INFO_IS_INTERLACED (info)) { + frame_info->Height = GST_ROUND_UP_32 (info->height); + switch (GST_VIDEO_INFO_FIELD_ORDER (info)) { + case GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST: + frame_info->PicStruct = MFX_PICSTRUCT_FIELD_TFF; + break; + case GST_VIDEO_FIELD_ORDER_BOTTOM_FIELD_FIRST: + frame_info->PicStruct = MFX_PICSTRUCT_FIELD_BFF; + break; + default: + frame_info->PicStruct = MFX_PICSTRUCT_UNKNOWN; + break; + } + } else { + frame_info->Height = GST_ROUND_UP_16 (info->height); + frame_info->PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + } + + /* QSV wouldn't be happy with this size, increase */ + if (frame_info->Width == 16) + frame_info->Width = 32; + + if (frame_info->Height == 16) + frame_info->Height = 32; + + frame_info->CropW = info->width; + frame_info->CropH = info->height; + if (GST_VIDEO_INFO_FPS_N (info) > 0 && GST_VIDEO_INFO_FPS_D (info) > 0) { + frame_info->FrameRateExtN = GST_VIDEO_INFO_FPS_N (info); + frame_info->FrameRateExtD = GST_VIDEO_INFO_FPS_D (info); + } else { + /* HACK: Same as x264enc */ + frame_info->FrameRateExtN = 25; + frame_info->FrameRateExtD = 1; + } + + frame_info->AspectRatioW = GST_VIDEO_INFO_PAR_N (info); + frame_info->AspectRatioH = GST_VIDEO_INFO_PAR_D (info); + + /* TODO: update for non 4:2:0 formats. Currently NV12 only */ + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; + switch (GST_VIDEO_INFO_FORMAT (info)) { + case GST_VIDEO_FORMAT_NV12: + frame_info->FourCC = MFX_FOURCC_NV12; + frame_info->BitDepthLuma = 8; + frame_info->BitDepthChroma = 8; + break; + default: + GST_ERROR_OBJECT (self, "Unexpected format %s", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info))); + return FALSE; + } + + allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder)); + if (!allowed_caps) { + GST_WARNING_OBJECT (self, "Failed to get allowed caps"); + return FALSE; + } + + gst_qsv_h264_enc_init_extra_params (self); + option = &self->option; + option2 = &self->option2; + option3 = &self->option3; + + self->packetized = FALSE; + + fixated_caps = gst_caps_fixate (gst_caps_copy (allowed_caps)); + s = gst_caps_get_structure (fixated_caps, 0); + stream_format = gst_structure_get_string (s, "stream-format"); + if (g_strcmp0 (stream_format, "avc") == 0) + self->packetized = TRUE; + gst_caps_unref (fixated_caps); + + for (guint i = 0; i < gst_caps_get_size (allowed_caps); i++) { + const GValue *profile_value; + const gchar *profile; + + s = gst_caps_get_structure (allowed_caps, i); + profile_value = gst_structure_get_value (s, "profile"); + if (!profile_value) + continue; + + if (GST_VALUE_HOLDS_LIST (profile_value)) { + for (guint j = 0; j < gst_value_list_get_size (profile_value); j++) { + const GValue *p = gst_value_list_get_value (profile_value, j); + + if (!G_VALUE_HOLDS_STRING (p)) + continue; + + profile = g_value_get_string (p); + if (profile) + downstream_profiles.insert (profile); + } + + } else if (G_VALUE_HOLDS_STRING (profile_value)) { + profile = g_value_get_string (profile_value); + if (profile) + downstream_profiles.insert (profile); + } + } + + GST_DEBUG_OBJECT (self, "Downstream supports %" G_GSIZE_FORMAT " profiles", + downstream_profiles.size ()); + + /* Prune incompatible profiles */ + if ((param->mfx.FrameInfo.PicStruct & MFX_PICSTRUCT_PROGRESSIVE) == 0) { + /* Interlaced, only main and high profiles are allowed */ + downstream_profiles.erase (gst_qsv_h264_profile_to_string + (MFX_PROFILE_AVC_CONSTRAINED_BASELINE)); + downstream_profiles.erase (gst_qsv_h264_profile_to_string + (MFX_PROFILE_AVC_PROGRESSIVE_HIGH)); + downstream_profiles.erase (gst_qsv_h264_profile_to_string + (MFX_PROFILE_AVC_CONSTRAINED_HIGH)); + downstream_profiles.erase (gst_qsv_h264_profile_to_string + (MFX_PROFILE_AVC_BASELINE)); + } + + if (downstream_profiles.empty ()) { + GST_WARNING_OBJECT (self, "No compatible profile was detected"); + gst_clear_caps (&allowed_caps); + return FALSE; + } + + if (bframes > 0) { + /* baseline and constrained-high doesn't support bframe */ + tmp = downstream_profiles; + tmp.erase (gst_qsv_h264_profile_to_string + (MFX_PROFILE_AVC_CONSTRAINED_BASELINE)); + tmp.erase (gst_qsv_h264_profile_to_string + (MFX_PROFILE_AVC_CONSTRAINED_HIGH)); + tmp.erase (gst_qsv_h264_profile_to_string (MFX_PROFILE_AVC_BASELINE)); + + if (tmp.empty ()) { + GST_WARNING_OBJECT (self, "None of downstream profile supports bframes"); + bframes = 0; + tmp = downstream_profiles; + } + + downstream_profiles = tmp; + } + + if (cabac == MFX_CODINGOPTION_ON) { + /* baseline doesn't support cabac */ + tmp = downstream_profiles; + tmp.erase (gst_qsv_h264_profile_to_string + (MFX_PROFILE_AVC_CONSTRAINED_BASELINE)); + tmp.erase (gst_qsv_h264_profile_to_string (MFX_PROFILE_AVC_BASELINE)); + + if (tmp.empty ()) { + GST_WARNING_OBJECT (self, "None of downstream profile supports cabac"); + cabac = MFX_CODINGOPTION_OFF; + tmp = downstream_profiles; + } + downstream_profiles = tmp; + } + + /* we have our preference order */ + /* *INDENT-OFF* */ + for (guint i = 0; i < G_N_ELEMENTS (profile_map); i++) { + auto it = downstream_profiles.find (profile_mapi.profile_str); + if (it != downstream_profiles.end ()) { + profile_str = *it; + break; + } + } + /* *INDENT-ON* */ + + if (profile_str.empty ()) { + GST_WARNING_OBJECT (self, "Failed to determine profile"); + return FALSE; + } + + GST_DEBUG_OBJECT (self, "Selected profile %s", profile_str.c_str ()); + mfx_profile = gst_qsv_h264_profile_string_to_value (profile_str.c_str ()); + + gst_clear_caps (&allowed_caps); + + if (cabac == MFX_CODINGOPTION_UNKNOWN) { + switch (mfx_profile) { + case MFX_PROFILE_AVC_CONSTRAINED_BASELINE: + case MFX_PROFILE_AVC_BASELINE: + cabac = MFX_CODINGOPTION_OFF; + break; + default: + cabac = MFX_CODINGOPTION_ON; + break; + } + } + + g_mutex_lock (&self->prop_lock); + param->mfx.CodecId = MFX_CODEC_AVC; + param->mfx.CodecProfile = mfx_profile; + param->mfx.GopRefDist = bframes + 1; + param->mfx.GopPicSize = self->gop_size; + param->mfx.IdrInterval = self->idr_interval; + param->mfx.RateControlMethod = self->rate_control; + param->mfx.NumRefFrame = self->ref_frames; + + gst_qsv_h264_enc_set_bitrate (self, param); + + /* Write signal info only when upstream caps contains valid colorimetry, + * because derived default colorimetry in gst_video_info_from_caps() tends to + * very wrong in various cases, and it's even worse than "unknown" */ + if (state->caps) { + GstStructure *s = gst_caps_get_structure (state->caps, 0); + GstVideoColorimetry cinfo; + const gchar *str; + + str = gst_structure_get_string (s, "colorimetry"); + if (str && gst_video_colorimetry_from_string (&cinfo, str)) { + signal_info = &self->signal_info; + + /* 0: Component, 1: PAL, 2: NTSC, 3: SECAM, 4: MAC, 5: Unspecified */ + signal_info->VideoFormat = 5; + if (cinfo.range == GST_VIDEO_COLOR_RANGE_0_255) + signal_info->VideoFullRange = 1; + else + signal_info->VideoFullRange = 0; + signal_info->ColourDescriptionPresent = 1; + signal_info->ColourPrimaries = + gst_video_color_primaries_to_iso (cinfo.primaries); + signal_info->TransferCharacteristics = + gst_video_transfer_function_to_iso (cinfo.transfer); + signal_info->MatrixCoefficients = + gst_video_color_matrix_to_iso (cinfo.matrix); + } + } + + if (cabac == MFX_CODINGOPTION_OFF) + option->CAVLC = MFX_CODINGOPTION_ON; + else + option->CAVLC = MFX_CODINGOPTION_OFF; + + /* TODO: property ? */ + option->AUDelimiter = MFX_CODINGOPTION_ON; + + if (self->disable_hrd_conformance) { + option->NalHrdConformance = MFX_CODINGOPTION_OFF; + option->VuiVclHrdParameters = MFX_CODINGOPTION_OFF; + } + + /* Enables PicTiming SEI by default */ + option->PicTimingSEI = MFX_CODINGOPTION_ON; + + /* VUI is useful in various cases, so we don't want to disable it */ + option2->DisableVUI = MFX_CODINGOPTION_OFF; + + /* Do not repeat PPS */ + option2->RepeatPPS = MFX_CODINGOPTION_OFF; + + if (param->mfx.RateControlMethod == MFX_RATECONTROL_LA || + param->mfx.RateControlMethod == MFX_RATECONTROL_LA_HRD || + param->mfx.RateControlMethod == MFX_RATECONTROL_LA_ICQ) { + option2->LookAheadDS = self->rc_lookahead_ds; + option2->LookAheadDepth = self->rc_lookahead; + } + + option2->MinQPI = self->min_qp_i; + option2->MinQPP = self->min_qp_p; + option2->MinQPB = self->min_qp_b; + option2->MaxQPI = self->max_qp_i; + option2->MaxQPP = self->max_qp_p; + option2->MaxQPB = self->max_qp_b; + + /* QSV wants MFX_B_REF_PYRAMID when more than 1 b-frame is enabled */ + if (param->mfx.GopRefDist > 2) + option2->BRefType = MFX_B_REF_PYRAMID; + + /* Upstream specified framerate, we will believe it's fixed framerate */ + if (GST_VIDEO_INFO_FPS_N (info) > 0 && GST_VIDEO_INFO_FPS_D (info) > 0) { + option2->FixedFrameRate = MFX_CODINGOPTION_ON; + option3->TimingInfoPresent = MFX_CODINGOPTION_ON; + } + + if (param->mfx.RateControlMethod == MFX_RATECONTROL_QVBR) + option3->QVBRQuality = self->qvbr_quality; + + if (signal_info) + g_ptr_array_add (extra_params, signal_info); + g_ptr_array_add (extra_params, option); + g_ptr_array_add (extra_params, option2); + g_ptr_array_add (extra_params, option3); + + param->ExtParam = (mfxExtBuffer **) extra_params->pdata; + param->NumExtParam = extra_params->len; + + self->bitrate_updated = FALSE; + self->property_updated = FALSE; + + g_mutex_unlock (&self->prop_lock); + + return TRUE; +} + +static gboolean +gst_qsv_h264_enc_set_output_state (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxSession session) +{ + GstQsvH264Enc *self = GST_QSV_H264_ENC (encoder); + GstCaps *caps; + GstTagList *tags; + GstVideoCodecState *out_state; + guint bitrate, max_bitrate; + guint multiplier = 1; + mfxVideoParam param; + const gchar *profile_str; + mfxStatus status; + mfxExtCodingOptionSPSPPS sps_pps; + mfxExtBuffer *ext_buffers1; + mfxU8 sps1024; + mfxU8 pps1024; + GstBuffer *codec_data = nullptr; + + memset (¶m, 0, sizeof (mfxVideoParam)); + memset (&sps_pps, 0, sizeof (mfxExtCodingOptionSPSPPS)); + if (self->packetized) { + sps_pps.Header.BufferId = MFX_EXTBUFF_CODING_OPTION_SPSPPS; + sps_pps.Header.BufferSz = sizeof (mfxExtCodingOptionSPSPPS); + + sps_pps.SPSBuffer = sps; + sps_pps.SPSBufSize = sizeof (sps); + + sps_pps.PPSBuffer = pps; + sps_pps.PPSBufSize = sizeof (pps); + + ext_buffers0 = (mfxExtBuffer *) & sps_pps; + + param.NumExtParam = 1; + param.ExtParam = ext_buffers; + } + + status = MFXVideoENCODE_GetVideoParam (session, ¶m); + if (status < MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to get video param %d (%s)", + QSV_STATUS_ARGS (status)); + return FALSE; + } else if (status != MFX_ERR_NONE) { + GST_WARNING_OBJECT (self, "GetVideoParam returned warning %d (%s)", + QSV_STATUS_ARGS (status)); + } + + if (self->packetized) { + GstH264ParserResult rst; + GstH264NalUnit sps_nalu, pps_nalu; + GstMapInfo info; + guint8 *data; + guint8 profile_idc, profile_comp, level_idc; + const guint nal_length_size = 4; + const guint num_sps = 1; + const guint num_pps = 1; + + rst = gst_h264_parser_identify_nalu_unchecked (self->parser, + sps, 0, sps_pps.SPSBufSize, &sps_nalu); + if (rst != GST_H264_PARSER_OK) { + GST_ERROR_OBJECT (self, "Failed to identify SPS nal"); + return FALSE; + } + + if (sps_nalu.size < 4) { + GST_ERROR_OBJECT (self, "Too small sps nal size %d", sps_nalu.size); + return FALSE; + } + + data = sps_nalu.data + sps_nalu.offset + sps_nalu.header_bytes; + profile_idc = data0; + profile_comp = data1; + level_idc = data2; + + rst = gst_h264_parser_identify_nalu_unchecked (self->parser, + pps, 0, sps_pps.PPSBufSize, &pps_nalu); + if (rst != GST_H264_PARSER_OK) { + GST_ERROR_OBJECT (self, "Failed to identify PPS nal"); + return FALSE; + } + + /* 5: configuration version, profile, compatibility, level, nal length + * 1: num sps + * 2: sps size bytes + * sizeof (sps) + * 1: num pps + * 2: pps size bytes + * sizeof (pps) + * + * -> 11 + sps_size + pps_size + */ + codec_data = gst_buffer_new_and_alloc (11 + sps_nalu.size + pps_nalu.size); + + gst_buffer_map (codec_data, &info, GST_MAP_WRITE); + + data = (guint8 *) info.data; + data0 = 1; + data1 = profile_idc; + data2 = profile_comp; + data3 = level_idc; + data4 = 0xfc | (nal_length_size - 1); + data5 = 0xe0 | num_sps; + data += 6; + GST_WRITE_UINT16_BE (data, sps_nalu.size); + data += 2; + memcpy (data, sps_nalu.data + sps_nalu.offset, sps_nalu.size); + data += sps_nalu.size; + + data0 = num_pps; + data++; + + GST_WRITE_UINT16_BE (data, pps_nalu.size); + data += 2; + memcpy (data, pps_nalu.data + pps_nalu.offset, pps_nalu.size); + + gst_buffer_unmap (codec_data, &info); + } + + caps = gst_caps_from_string ("video/x-h264, alignment = (string) au"); + profile_str = gst_qsv_h264_profile_to_string (param.mfx.CodecProfile); + if (profile_str) + gst_caps_set_simple (caps, "profile", G_TYPE_STRING, profile_str, nullptr); + + if (self->packetized) { + gst_caps_set_simple (caps, "stream-format", G_TYPE_STRING, "avc", + "codec_data", GST_TYPE_BUFFER, codec_data, nullptr); + gst_buffer_unref (codec_data); + } else { + gst_caps_set_simple (caps, "stream-format", G_TYPE_STRING, "byte-stream", + nullptr); + } + + out_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (encoder), + caps, state); + gst_video_codec_state_unref (out_state); + + tags = gst_tag_list_new_empty (); + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, "qsvh264enc", + nullptr); + + if (param.mfx.BRCParamMultiplier > 0) + multiplier = param.mfx.BRCParamMultiplier; + + switch (param.mfx.RateControlMethod) { + case MFX_RATECONTROL_CQP: + case MFX_RATECONTROL_ICQ: + case MFX_RATECONTROL_LA_ICQ: + /* We don't know target/max bitrate in this case */ + break; + default: + max_bitrate = (guint) param.mfx.MaxKbps * multiplier; + bitrate = (guint) param.mfx.TargetKbps * multiplier; + if (bitrate > 0) { + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, + GST_TAG_NOMINAL_BITRATE, bitrate * 1000, nullptr); + } + + if (max_bitrate > 0) { + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, + GST_TAG_MAXIMUM_BITRATE, max_bitrate * 1000, nullptr); + } + break; + } + + gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (encoder), + tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (tags); + + return TRUE; +} + +static gboolean +gst_qsv_h264_enc_foreach_caption_meta (GstBuffer * buffer, GstMeta ** meta, + GPtrArray * payload) +{ + GstVideoCaptionMeta *cc_meta; + GstByteWriter br; + guint payload_size; + guint extra_size; + mfxPayload *p; + + if ((*meta)->info->api != GST_VIDEO_CAPTION_META_API_TYPE) + return TRUE; + + cc_meta = (GstVideoCaptionMeta *) (*meta); + + if (cc_meta->caption_type != GST_VIDEO_CAPTION_TYPE_CEA708_RAW) + return TRUE; + + /* QSV requires full sei_message() structure */ + /* 1 byte contry_code + 10 bytes CEA-708 specific data + caption data */ + payload_size = 11 + cc_meta->size; + extra_size = payload_size / 255; + + /* 1 byte SEI type + 1 byte SEI payload size (+ extra) + payload data */ + gst_byte_writer_init_with_size (&br, 2 + extra_size + payload_size, FALSE); + + /* SEI type */ + gst_byte_writer_put_uint8 (&br, 4); + + /* SEI payload size */ + while (payload_size >= 0xff) { + gst_byte_writer_put_uint8 (&br, 0xff); + payload_size -= 0xff; + } + gst_byte_writer_put_uint8 (&br, payload_size); + + /* 8-bits itu_t_t35_country_code */ + gst_byte_writer_put_uint8 (&br, 181); + + /* 16-bits itu_t_t35_provider_code */ + gst_byte_writer_put_uint8 (&br, 0); + gst_byte_writer_put_uint8 (&br, 49); + + /* 32-bits ATSC_user_identifier */ + gst_byte_writer_put_uint8 (&br, 'G'); + gst_byte_writer_put_uint8 (&br, 'A'); + gst_byte_writer_put_uint8 (&br, '9'); + gst_byte_writer_put_uint8 (&br, '4'); + + /* 8-bits ATSC1_data_user_data_type_code */ + gst_byte_writer_put_uint8 (&br, 3); + + /* 8-bits: + * 1 bit process_em_data_flag (0) + * 1 bit process_cc_data_flag (1) + * 1 bit additional_data_flag (0) + * 5-bits cc_count + */ + gst_byte_writer_put_uint8 (&br, ((cc_meta->size / 3) & 0x1f) | 0x40); + + /* 8 bits em_data, unused */ + gst_byte_writer_put_uint8 (&br, 255); + + gst_byte_writer_put_data (&br, cc_meta->data, cc_meta->size); + + /* 8 marker bits */ + gst_byte_writer_put_uint8 (&br, 255); + + p = g_new0 (mfxPayload, 1); + p->BufSize = gst_byte_writer_get_pos (&br); + p->NumBit = p->BufSize * 8; + p->Type = 4; + p->Data = gst_byte_writer_reset_and_get_data (&br); + + g_ptr_array_add (payload, p); + + return TRUE; +} + +static gboolean +gst_qsv_h264_enc_attach_payload (GstQsvEncoder * encoder, + GstVideoCodecFrame * frame, GPtrArray * payload) +{ + GstQsvH264Enc *self = GST_QSV_H264_ENC (encoder); + + if (self->cc_insert == GST_QSV_H264_ENC_SEI_DISABLED) + return TRUE; + + gst_buffer_foreach_meta (frame->input_buffer, + (GstBufferForeachMetaFunc) gst_qsv_h264_enc_foreach_caption_meta, + payload); + + return TRUE; +} + +static GstBuffer * +gst_qsv_h264_enc_create_output_buffer (GstQsvEncoder * encoder, + mfxBitstream * bitstream) +{ + GstQsvH264Enc *self = GST_QSV_H264_ENC (encoder); + GstBuffer *buf; + GstH264ParserResult rst; + GstH264NalUnit nalu; + + if (!self->packetized) { + buf = gst_buffer_new_memdup (bitstream->Data + bitstream->DataOffset, + bitstream->DataLength); + } else { + buf = gst_buffer_new (); + rst = gst_h264_parser_identify_nalu (self->parser, + bitstream->Data + bitstream->DataOffset, 0, bitstream->DataLength, + &nalu); + if (rst == GST_H264_PARSER_NO_NAL_END) + rst = GST_H264_PARSER_OK; + + while (rst == GST_H264_PARSER_OK) { + GstMemory *mem; + guint8 *data; + + data = (guint8 *) g_malloc0 (nalu.size + 4); + GST_WRITE_UINT32_BE (data, nalu.size); + memcpy (data + 4, nalu.data + nalu.offset, nalu.size); + + mem = gst_memory_new_wrapped ((GstMemoryFlags) 0, data, nalu.size + 4, + 0, nalu.size + 4, data, (GDestroyNotify) g_free); + gst_buffer_append_memory (buf, mem); + + rst = gst_h264_parser_identify_nalu (self->parser, + bitstream->Data + bitstream->DataOffset, nalu.offset + nalu.size, + bitstream->DataLength, &nalu); + + if (rst == GST_H264_PARSER_NO_NAL_END) + rst = GST_H264_PARSER_OK; + } + } + + /* This buffer must be the end of a frame boundary */ + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_MARKER); + + return buf; +} + +static GstQsvEncoderReconfigure +gst_qsv_h264_enc_check_reconfigure (GstQsvEncoder * encoder, mfxSession session, + mfxVideoParam * param, GPtrArray * extra_params) +{ + GstQsvH264Enc *self = GST_QSV_H264_ENC (encoder); + GstQsvEncoderReconfigure ret = GST_QSV_ENCODER_RECONFIGURE_NONE; + + g_mutex_lock (&self->prop_lock); + if (self->property_updated) { + ret = GST_QSV_ENCODER_RECONFIGURE_FULL; + goto done; + } + + if (self->bitrate_updated) { + mfxStatus status; + mfxExtEncoderResetOption reset_opt; + reset_opt.Header.BufferId = MFX_EXTBUFF_ENCODER_RESET_OPTION; + reset_opt.Header.BufferSz = sizeof (mfxExtEncoderResetOption); + reset_opt.StartNewSequence = MFX_CODINGOPTION_UNKNOWN; + + gst_qsv_h264_enc_set_bitrate (self, param); + + g_ptr_array_add (extra_params, &reset_opt); + param->ExtParam = (mfxExtBuffer **) extra_params->pdata; + param->NumExtParam = extra_params->len; + + status = MFXVideoENCODE_Query (session, param, param); + g_ptr_array_remove_index (extra_params, extra_params->len - 1); + param->NumExtParam = extra_params->len; + + if (status != MFX_ERR_NONE) { + GST_WARNING_OBJECT (self, "MFXVideoENCODE_Query returned %d (%s)", + QSV_STATUS_ARGS (status)); + ret = GST_QSV_ENCODER_RECONFIGURE_FULL; + } else { + if (reset_opt.StartNewSequence == MFX_CODINGOPTION_OFF) { + GST_DEBUG_OBJECT (self, "Can update without new sequence"); + ret = GST_QSV_ENCODER_RECONFIGURE_BITRATE; + } else { + GST_DEBUG_OBJECT (self, "Need new sequence"); + ret = GST_QSV_ENCODER_RECONFIGURE_FULL; + } + } + } + +done: + self->property_updated = FALSE; + self->bitrate_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return ret; +} + +void +gst_qsv_h264_enc_register (GstPlugin * plugin, guint rank, guint impl_index, + GstObject * device, mfxSession session) +{ + mfxStatus status; + mfxVideoParam param; + mfxInfoMFX *mfx; + std::vector < mfxU16 > supported_profiles; + GstQsvResolution max_resolution; + bool supports_interlaced = false; + + GST_DEBUG_CATEGORY_INIT (gst_qsv_h264_enc_debug, + "qsvh264enc", 0, "qsvh264enc"); + + memset (¶m, 0, sizeof (mfxVideoParam)); + memset (&max_resolution, 0, sizeof (GstQsvResolution)); + + param.AsyncDepth = 4; + param.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; + + mfx = ¶m.mfx; + mfx->CodecId = MFX_CODEC_AVC; + + mfx->FrameInfo.Width = GST_ROUND_UP_16 (320); + mfx->FrameInfo.Height = GST_ROUND_UP_16 (240); + mfx->FrameInfo.CropW = 320; + mfx->FrameInfo.CropH = 240; + mfx->FrameInfo.FrameRateExtN = 30; + mfx->FrameInfo.FrameRateExtD = 1; + mfx->FrameInfo.AspectRatioW = 1; + mfx->FrameInfo.AspectRatioH = 1; + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; + mfx->FrameInfo.BitDepthLuma = 8; + mfx->FrameInfo.BitDepthChroma = 8; + mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + + /* Check supported profiles */ + for (guint i = 0; i < G_N_ELEMENTS (profile_map); i++) { + mfx->CodecProfile = profile_mapi.profile; + + if (MFXVideoENCODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) + continue; + + supported_profiles.push_back (profile_mapi.profile); + } + + if (supported_profiles.empty ()) { + GST_INFO ("Device doesn't support H.264 encoding"); + return; + } + + mfx->CodecProfile = supported_profiles0; + + /* Check max-resolution */ + for (guint i = 0; i < G_N_ELEMENTS (gst_qsv_resolutions); i++) { + mfx->FrameInfo.Width = GST_ROUND_UP_16 (gst_qsv_resolutionsi.width); + mfx->FrameInfo.Height = GST_ROUND_UP_16 (gst_qsv_resolutionsi.height); + mfx->FrameInfo.CropW = gst_qsv_resolutionsi.width; + mfx->FrameInfo.CropH = gst_qsv_resolutionsi.height; + + if (MFXVideoENCODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) + break; + + max_resolution.width = gst_qsv_resolutionsi.width; + max_resolution.height = gst_qsv_resolutionsi.height; + } + + GST_INFO ("Maximum supported resolution: %dx%d", + max_resolution.width, max_resolution.height); + + /* TODO: check supported rate-control methods and expose only supported + * methods, since the device might not be able to support some of them */ + + /* Check interlaced encoding */ + /* *INDENT-OFF* */ + for (const auto &iter: supported_profiles) { + if (iter == MFX_PROFILE_AVC_MAIN || + iter == MFX_PROFILE_AVC_HIGH) { + /* Make sure non-lowpower mode, otherwise QSV will not accept + * interlaced format during Query() */ + mfx->LowPower = MFX_CODINGOPTION_UNKNOWN; + + /* Interlaced encoding is not compatible with MFX_RATECONTROL_VCM, + * make sure profile */ + mfx->RateControlMethod = MFX_RATECONTROL_CBR; + + /* Too high (MFX_LEVEL_AVC_41) or low (MFX_LEVEL_AVC_21) level will not be + * accepted for interlaced encoding */ + mfx->CodecLevel = MFX_LEVEL_UNKNOWN; + mfx->CodecProfile = iter; + + mfx->FrameInfo.Width = GST_ROUND_UP_16 (320); + mfx->FrameInfo.Height = GST_ROUND_UP_32 (240); + mfx->FrameInfo.CropW = 320; + mfx->FrameInfo.CropH = 240; + mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_FIELD_TFF; + + status = MFXVideoENCODE_Query (session, ¶m, ¶m); + + if (status == MFX_ERR_NONE) { + GST_INFO ("Interlaced encoding is supported"); + supports_interlaced = true; + break; + } + } + } + /* *INDENT-ON* */ + + /* To cover both landscape and portrait, + * select max value (width in this case) */ + guint resolution = MAX (max_resolution.width, max_resolution.height); + std::string sink_caps_str = "video/x-raw, format=(string) NV12"; + + sink_caps_str += ", width=(int) 16, " + std::to_string (resolution) + " "; + sink_caps_str += ", height=(int) 16, " + std::to_string (resolution) + " "; + if (!supports_interlaced) + sink_caps_str += ", interlace-mode = (string) progressive"; + + GstCaps *sink_caps = gst_caps_from_string (sink_caps_str.c_str ()); + + /* TODO: Add support for VA */ +#ifdef G_OS_WIN32 + GstCaps *d3d11_caps = gst_caps_copy (sink_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr); + gst_caps_set_features_simple (d3d11_caps, caps_features); + gst_caps_append (d3d11_caps, sink_caps); + sink_caps = d3d11_caps; +#else + GstCaps *va_caps = gst_caps_copy (sink_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_VA, nullptr); + gst_caps_set_features_simple (va_caps, caps_features); + gst_caps_append (va_caps, sink_caps); + sink_caps = va_caps; +#endif + + std::string src_caps_str = "video/x-h264"; + src_caps_str += ", width=(int) 16, " + std::to_string (resolution) + " "; + src_caps_str += ", height=(int) 16, " + std::to_string (resolution) + " "; + + src_caps_str += ", stream-format= (string) { avc, byte-stream }"; + src_caps_str += ", alignment=(string) au"; + /* *INDENT-OFF* */ + if (supported_profiles.size () > 1) { + src_caps_str += ", profile=(string) { "; + bool first = true; + for (const auto &iter: supported_profiles) { + if (!first) { + src_caps_str += ", "; + } + + src_caps_str += gst_qsv_h264_profile_to_string (iter); + first = false; + } + src_caps_str += " }"; + } else { + src_caps_str += ", profile=(string) "; + src_caps_str += gst_qsv_h264_profile_to_string (supported_profiles0); + } + /* *INDENT-ON* */ + + GstCaps *src_caps = gst_caps_from_string (src_caps_str.c_str ()); + + GST_MINI_OBJECT_FLAG_SET (sink_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (src_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GstQsvH264EncClassData *cdata = g_new0 (GstQsvH264EncClassData, 1); + cdata->sink_caps = sink_caps; + cdata->src_caps = src_caps; + cdata->impl_index = impl_index; + +#ifdef G_OS_WIN32 + g_object_get (device, "adapter-luid", &cdata->adapter_luid, + "description", &cdata->description, nullptr); +#else + g_object_get (device, "path", &cdata->display_path, nullptr); +#endif + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstQsvH264EncClass), + nullptr, + nullptr, + (GClassInitFunc) gst_qsv_h264_enc_class_init, + nullptr, + cdata, + sizeof (GstQsvH264Enc), + 0, + (GInstanceInitFunc) gst_qsv_h264_enc_init, + }; + + type_name = g_strdup ("GstQsvH264Enc"); + feature_name = g_strdup ("qsvh264enc"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstQsvH264Device%dEnc", index); + feature_name = g_strdup_printf ("qsvh264device%denc", index); + } + + type = g_type_register_static (GST_TYPE_QSV_ENCODER, type_name, &type_info, + (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvh264enc.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include "gstqsvencoder.h" + +G_BEGIN_DECLS + +void gst_qsv_h264_enc_register (GstPlugin * plugin, + guint rank, + guint impl_index, + GstObject * device, + mfxSession session); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvh265dec.cpp
Added
@@ -0,0 +1,674 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-qsvh265dec + * @title: qsvh264dec + * + * Intel Quick Sync H.265 decoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 filesrc location=/path/to/h265/file ! parsebin ! qsvh265dec ! videoconvert ! autovideosink + * ``` + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvh265dec.h" +#include <gst/codecparsers/gsth265parser.h> +#include <string> +#include <string.h> +#include <vector> + +#ifdef G_OS_WIN32 +#include <gst/d3d11/gstd3d11.h> +#else +#include <gst/va/gstva.h> +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_qsv_h265_dec_debug); +#define GST_CAT_DEFAULT gst_qsv_h265_dec_debug + +#define DOC_SINK_CAPS \ + "video/x-h265, width = (int) 1, 16384 , height = (int) 1, 16384 , " \ + "stream-format = (string) { byte-stream, hev1, hvc1 }, " \ + "alignment = (string) au, profile = (string) { main, main-10 }" + +#define DOC_SRC_CAPS_COMM \ + "format = (string) NV12, " \ + "width = (int) 1, 16384 , height = (int) 1, 16384 " + +#define DOC_SRC_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SRC_CAPS_COMM "; " \ + "video/x-raw, " DOC_SRC_CAPS_COMM + +typedef struct _GstQsvH265Dec +{ + GstQsvDecoder parent; + GstH265Parser *parser; + gboolean packetized; + gboolean nal_length_size; + + GstBuffer *vps_nalsGST_H265_MAX_VPS_COUNT; + GstBuffer *sps_nalsGST_H265_MAX_SPS_COUNT; + GstBuffer *pps_nalsGST_H265_MAX_PPS_COUNT; +} GstQsvH265Dec; + +typedef struct _GstQsvH265DecClass +{ + GstQsvDecoderClass parent_class; +} GstQsvH265DecClass; + +static GTypeClass *parent_class = nullptr; + +#define GST_QSV_H265_DEC(object) ((GstQsvH265Dec *) (object)) +#define GST_QSV_H265_DEC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstQsvH265DecClass)) + +static gboolean gst_qsv_h265_dec_start (GstVideoDecoder * decoder); +static gboolean gst_qsv_h265_dec_stop (GstVideoDecoder * decoder); +static gboolean gst_qsv_h265_dec_set_format (GstQsvDecoder * decoder, + GstVideoCodecState * state); +static GstBuffer *gst_qsv_h265_dec_process_input (GstQsvDecoder * decoder, + gboolean need_codec_data, GstBuffer * buffer); + +static void +gst_qsv_h265_dec_class_init (GstQsvH265DecClass * klass, gpointer data) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoDecoderClass *videodec_class = GST_VIDEO_DECODER_CLASS (klass); + GstQsvDecoderClass *qsvdec_class = GST_QSV_DECODER_CLASS (klass); + GstQsvDecoderClassData *cdata = (GstQsvDecoderClassData *) data; + GstPadTemplate *pad_templ; + GstCaps *doc_caps; + + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + +#ifdef G_OS_WIN32 + std::string long_name = "Intel Quick Sync Video " + + std::string (cdata->description) + " H.265 Decoder"; + + gst_element_class_set_metadata (element_class, long_name.c_str (), + "Codec/Decoder/Video/Hardware", + "Intel Quick Sync Video H.265 Decoder", + "Seungha Yang <seungha@centricular.com>"); +#else + gst_element_class_set_static_metadata (element_class, + "Intel Quick Sync Video H.265 Decoder", + "Codec/Decoder/Video/Hardware", + "Intel Quick Sync Video H.265 Decoder", + "Seungha Yang <seungha@centricular.com>"); +#endif + + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + videodec_class->start = GST_DEBUG_FUNCPTR (gst_qsv_h265_dec_start); + videodec_class->stop = GST_DEBUG_FUNCPTR (gst_qsv_h265_dec_stop); + + qsvdec_class->set_format = GST_DEBUG_FUNCPTR (gst_qsv_h265_dec_set_format); + qsvdec_class->process_input = + GST_DEBUG_FUNCPTR (gst_qsv_h265_dec_process_input); + + qsvdec_class->codec_id = MFX_CODEC_HEVC; + qsvdec_class->impl_index = cdata->impl_index; + qsvdec_class->adapter_luid = cdata->adapter_luid; + qsvdec_class->display_path = cdata->display_path; + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); +} + +static void +gst_qsv_h265_dec_init (GstQsvH265Dec * self) +{ +} + +static gboolean +gst_qsv_h265_dec_start (GstVideoDecoder * decoder) +{ + GstQsvH265Dec *self = GST_QSV_H265_DEC (decoder); + + self->parser = gst_h265_parser_new (); + + return TRUE; +} + +static void +gst_qsv_h265_dec_clear_codec_data (GstQsvH265Dec * self) +{ + guint i; + + for (i = 0; i < G_N_ELEMENTS (self->vps_nals); i++) + gst_clear_buffer (&self->vps_nalsi); + + for (i = 0; i < G_N_ELEMENTS (self->sps_nals); i++) + gst_clear_buffer (&self->sps_nalsi); + + for (i = 0; i < G_N_ELEMENTS (self->pps_nals); i++) + gst_clear_buffer (&self->pps_nalsi); +} + +static gboolean +gst_qsv_h265_dec_stop (GstVideoDecoder * decoder) +{ + GstQsvH265Dec *self = GST_QSV_H265_DEC (decoder); + + gst_qsv_h265_dec_clear_codec_data (self); + + return GST_VIDEO_DECODER_CLASS (parent_class)->stop (decoder); +} + +static void +gst_qsv_h265_dec_store_nal (GstQsvH265Dec * self, guint id, + GstH265NalUnitType nal_type, GstH265NalUnit * nalu) +{ + GstBuffer *buf, **store; + guint size = nalu->size, store_size; + static const guint8 start_code = { 0, 0, 1 }; + + if (nal_type == GST_H265_NAL_VPS) { + store_size = GST_H265_MAX_VPS_COUNT; + store = self->vps_nals; + GST_DEBUG_OBJECT (self, "storing vps %u", id); + } else if (nal_type == GST_H265_NAL_SPS) { + store_size = GST_H265_MAX_SPS_COUNT; + store = self->sps_nals; + GST_DEBUG_OBJECT (self, "storing sps %u", id); + } else if (nal_type == GST_H265_NAL_PPS) { + store_size = GST_H265_MAX_PPS_COUNT; + store = self->pps_nals; + GST_DEBUG_OBJECT (self, "storing pps %u", id); + } else { + return; + } + + if (id >= store_size) { + GST_DEBUG_OBJECT (self, "unable to store nal, id out-of-range %d", id); + return; + } + + buf = gst_buffer_new_allocate (nullptr, size + sizeof (start_code), nullptr); + gst_buffer_fill (buf, 0, start_code, sizeof (start_code)); + gst_buffer_fill (buf, sizeof (start_code), nalu->data + nalu->offset, size); + + if (storeid) + gst_buffer_unref (storeid); + + storeid = buf; +} + +static gboolean +gst_qsv_h265_dec_parse_codec_data (GstQsvH265Dec * self, const guint8 * data, + gsize size) +{ + GstH265Parser *parser = self->parser; + guint num_nal_arrays; + guint off; + guint num_nals, i, j; + GstH265ParserResult pres; + GstH265NalUnit nalu; + GstH265VPS vps; + GstH265SPS sps; + GstH265PPS pps; + + /* parse the hvcC data */ + if (size < 23) { + GST_WARNING_OBJECT (self, "hvcC too small"); + return FALSE; + } + + /* wrong hvcC version */ + if (data0 != 0 && data0 != 1) { + return FALSE; + } + + self->nal_length_size = (data21 & 0x03) + 1; + GST_DEBUG_OBJECT (self, "nal length size %u", self->nal_length_size); + + num_nal_arrays = data22; + off = 23; + + for (i = 0; i < num_nal_arrays; i++) { + if (off + 3 >= size) { + GST_WARNING_OBJECT (self, "hvcC too small"); + return FALSE; + } + + num_nals = GST_READ_UINT16_BE (data + off + 1); + off += 3; + for (j = 0; j < num_nals; j++) { + pres = gst_h265_parser_identify_nalu_hevc (parser, + data, off, size, 2, &nalu); + + if (pres != GST_H265_PARSER_OK) { + GST_WARNING_OBJECT (self, "hvcC too small"); + return FALSE; + } + + switch (nalu.type) { + case GST_H265_NAL_VPS: + pres = gst_h265_parser_parse_vps (parser, &nalu, &vps); + if (pres != GST_H265_PARSER_OK) { + GST_WARNING_OBJECT (self, "Failed to parse VPS"); + return FALSE; + } + + gst_qsv_h265_dec_store_nal (self, vps.id, + (GstH265NalUnitType) nalu.type, &nalu); + break; + case GST_H265_NAL_SPS: + pres = gst_h265_parser_parse_sps (self->parser, &nalu, &sps, FALSE); + if (pres != GST_H265_PARSER_OK) { + GST_WARNING_OBJECT (self, "Failed to parse SPS"); + return FALSE; + } + + gst_qsv_h265_dec_store_nal (self, sps.id, + (GstH265NalUnitType) nalu.type, &nalu); + break; + case GST_H265_NAL_PPS: + pres = gst_h265_parser_parse_pps (parser, &nalu, &pps); + if (pres != GST_H265_PARSER_OK) { + GST_WARNING_OBJECT (self, "Failed to parse PPS"); + return FALSE; + } + + gst_qsv_h265_dec_store_nal (self, pps.id, + (GstH265NalUnitType) nalu.type, &nalu); + break; + default: + break; + } + + off = nalu.offset + nalu.size; + } + } + + return TRUE; +} + +static gboolean +gst_qsv_h265_dec_set_format (GstQsvDecoder * decoder, + GstVideoCodecState * state) +{ + GstQsvH265Dec *self = GST_QSV_H265_DEC (decoder); + GstStructure *s; + const gchar *str; + GstMapInfo map; + + gst_qsv_h265_dec_clear_codec_data (self); + self->packetized = FALSE; + + s = gst_caps_get_structure (state->caps, 0); + str = gst_structure_get_string (s, "stream-format"); + if ((g_strcmp0 (str, "avc") == 0 || g_strcmp0 (str, "avc3")) && + state->codec_data) { + self->packetized = TRUE; + /* Will be updated */ + self->nal_length_size = 4; + } + + if (!self->packetized) + return TRUE; + + if (!gst_buffer_map (state->codec_data, &map, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Failed to map codec data"); + return FALSE; + } + + gst_qsv_h265_dec_parse_codec_data (self, map.data, map.size); + gst_buffer_unmap (state->codec_data, &map); + + return TRUE; +} + +static GstBuffer * +gst_qsv_h265_dec_process_input (GstQsvDecoder * decoder, + gboolean need_codec_data, GstBuffer * buffer) +{ + GstQsvH265Dec *self = GST_QSV_H265_DEC (decoder); + GstH265Parser *parser = self->parser; + GstH265NalUnit nalu; + GstH265ParserResult pres; + GstMapInfo map; + GstH265VPS vps; + GstH265SPS sps; + GstH265PPS pps; + gboolean have_vps = FALSE; + gboolean have_sps = FALSE; + gboolean have_pps = FALSE; + guint i; + GstBuffer *new_buf; + static const guint8 start_code = { 0, 0, 1 }; + + if (!self->packetized) + return gst_buffer_ref (buffer); + + if (!gst_buffer_map (buffer, &map, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Failed to map input buffer"); + return nullptr; + } + + memset (&nalu, 0, sizeof (GstH265NalUnit)); + new_buf = gst_buffer_new (); + + do { + GstMemory *mem; + guint8 *data; + gsize size; + + pres = gst_h265_parser_identify_nalu_hevc (parser, map.data, + nalu.offset + nalu.size, map.size, self->nal_length_size, &nalu); + + if (pres == GST_H265_PARSER_NO_NAL_END) + pres = GST_H265_PARSER_OK; + + switch (nalu.type) { + case GST_H265_NAL_VPS: + pres = gst_h265_parser_parse_vps (parser, &nalu, &vps); + if (pres != GST_H265_PARSER_OK) + break; + + have_vps = TRUE; + gst_qsv_h265_dec_store_nal (self, vps.id, + (GstH265NalUnitType) nalu.type, &nalu); + break; + case GST_H265_NAL_SPS: + pres = gst_h265_parser_parse_sps (parser, &nalu, &sps, FALSE); + if (pres != GST_H265_PARSER_OK) + break; + + have_sps = TRUE; + gst_qsv_h265_dec_store_nal (self, + sps.id, (GstH265NalUnitType) nalu.type, &nalu); + break; + case GST_H265_NAL_PPS: + pres = gst_h265_parser_parse_pps (parser, &nalu, &pps); + if (pres != GST_H265_PARSER_OK) + break; + + have_pps = TRUE; + gst_qsv_h265_dec_store_nal (self, + pps.id, (GstH265NalUnitType) nalu.type, &nalu); + break; + default: + break; + } + + size = sizeof (start_code) + nalu.size; + data = (guint8 *) g_malloc (size); + memcpy (data, start_code, sizeof (start_code)); + memcpy (data + sizeof (start_code), nalu.data + nalu.offset, nalu.size); + + mem = gst_memory_new_wrapped ((GstMemoryFlags) 0, data, size, 0, size, + nullptr, (GDestroyNotify) g_free); + gst_buffer_append_memory (new_buf, mem); + } while (pres == GST_H265_PARSER_OK); + + gst_buffer_unmap (buffer, &map); + + if (need_codec_data) { + GstBuffer *tmp = gst_buffer_new (); + + if (!have_vps) { + for (i = 0; i < GST_H265_MAX_VPS_COUNT; i++) { + if (!self->vps_nalsi) + continue; + + tmp = gst_buffer_append (tmp, gst_buffer_ref (self->vps_nalsi)); + } + } + + if (!have_sps) { + for (i = 0; i < GST_H265_MAX_SPS_COUNT; i++) { + if (!self->sps_nalsi) + continue; + + tmp = gst_buffer_append (tmp, gst_buffer_ref (self->sps_nalsi)); + } + } + + if (!have_pps) { + for (i = 0; i < GST_H265_MAX_PPS_COUNT; i++) { + if (!self->pps_nalsi) + continue; + + tmp = gst_buffer_append (tmp, gst_buffer_ref (self->pps_nalsi)); + } + } + + new_buf = gst_buffer_append (tmp, new_buf); + } + + return new_buf; +} + +void +gst_qsv_h265_dec_register (GstPlugin * plugin, guint rank, guint impl_index, + GstObject * device, mfxSession session) +{ + mfxVideoParam param; + mfxInfoMFX *mfx; + GstQsvResolution max_resolution; + std::vector < std::string > supported_profiles; + std::vector < std::string > supported_formats; + + GST_DEBUG_CATEGORY_INIT (gst_qsv_h265_dec_debug, + "qsvh265dec", 0, "qsvh265dec"); + + memset (¶m, 0, sizeof (mfxVideoParam)); + memset (&max_resolution, 0, sizeof (GstQsvResolution)); + + param.AsyncDepth = 4; + param.IOPattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; + + mfx = ¶m.mfx; + mfx->CodecId = MFX_CODEC_HEVC; + + mfx->FrameInfo.FrameRateExtN = 30; + mfx->FrameInfo.FrameRateExtD = 1; + mfx->FrameInfo.AspectRatioW = 1; + mfx->FrameInfo.AspectRatioH = 1; + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; + mfx->FrameInfo.BitDepthLuma = 8; + mfx->FrameInfo.BitDepthChroma = 8; + mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + mfx->CodecProfile = MFX_PROFILE_HEVC_MAIN; + + /* Check max-resolution */ + for (guint i = 0; i < G_N_ELEMENTS (gst_qsv_resolutions); i++) { + mfx->FrameInfo.Width = GST_ROUND_UP_16 (gst_qsv_resolutionsi.width); + mfx->FrameInfo.Height = GST_ROUND_UP_16 (gst_qsv_resolutionsi.height); + mfx->FrameInfo.CropW = gst_qsv_resolutionsi.width; + mfx->FrameInfo.CropH = gst_qsv_resolutionsi.height; + + if (MFXVideoDECODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) + break; + + max_resolution.width = gst_qsv_resolutionsi.width; + max_resolution.height = gst_qsv_resolutionsi.height; + } + + if (max_resolution.width == 0 || max_resolution.height == 0) + return; + + GST_INFO ("Maximum supported resolution: %dx%d", + max_resolution.width, max_resolution.height); + + supported_profiles.push_back ("main"); + supported_formats.push_back ("NV12"); + + /* Check other profile/formats */ + /* TODO: check other profiles too */ + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_P010; + mfx->FrameInfo.BitDepthLuma = 10; + mfx->FrameInfo.BitDepthChroma = 10; + mfx->FrameInfo.Shift = 1; + mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + mfx->CodecProfile = MFX_PROFILE_HEVC_MAIN10; + mfx->FrameInfo.Width = GST_ROUND_UP_16 (gst_qsv_resolutions0.width); + mfx->FrameInfo.Height = GST_ROUND_UP_16 (gst_qsv_resolutions0.height); + mfx->FrameInfo.CropW = gst_qsv_resolutions0.width; + mfx->FrameInfo.CropH = gst_qsv_resolutions0.height; + if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) { + supported_profiles.push_back ("main-10"); + supported_formats.push_back ("P010_10LE"); + } + + /* To cover both landscape and portrait, + * select max value (width in this case) */ + guint resolution = MAX (max_resolution.width, max_resolution.height); + std::string src_caps_str = "video/x-raw"; + + src_caps_str += ", width=(int) 1, " + std::to_string (resolution) + " "; + src_caps_str += ", height=(int) 1, " + std::to_string (resolution) + " "; + + /* *INDENT-OFF* */ + if (supported_formats.size () > 1) { + src_caps_str += ", format=(string) { "; + bool first = true; + for (const auto &iter: supported_formats) { + if (!first) { + src_caps_str += ", "; + } + + src_caps_str += iter; + first = false; + } + src_caps_str += " }"; + } else { + src_caps_str += ", format=(string) " + supported_formats0; + } + /* *INDENT-ON* */ + + GstCaps *src_caps = gst_caps_from_string (src_caps_str.c_str ()); + + /* TODO: Add support for VA */ +#ifdef G_OS_WIN32 + GstCaps *d3d11_caps = gst_caps_copy (src_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr); + gst_caps_set_features_simple (d3d11_caps, caps_features); + gst_caps_append (d3d11_caps, src_caps); + src_caps = d3d11_caps; +#endif + + std::string sink_caps_str = "video/x-h265"; + sink_caps_str += ", width=(int) 1, " + std::to_string (resolution) + " "; + sink_caps_str += ", height=(int) 1, " + std::to_string (resolution) + " "; + + sink_caps_str += ", stream-format=(string) { byte-stream, hev1, hvc1 }"; + sink_caps_str += ", alignment=(string) au"; + /* *INDENT-OFF* */ + if (supported_profiles.size () > 1) { + sink_caps_str += ", profile=(string) { "; + bool first = true; + for (const auto &iter: supported_profiles) { + if (!first) { + sink_caps_str += ", "; + } + + sink_caps_str += iter; + first = false; + } + sink_caps_str += " }"; + } else { + sink_caps_str += ", profile=(string) " + supported_profiles0; + } + /* *INDENT-ON* */ + + GstCaps *sink_caps = gst_caps_from_string (sink_caps_str.c_str ()); + + GST_MINI_OBJECT_FLAG_SET (sink_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (src_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GstQsvDecoderClassData *cdata = g_new0 (GstQsvDecoderClassData, 1); + cdata->sink_caps = sink_caps; + cdata->src_caps = src_caps; + cdata->impl_index = impl_index; + +#ifdef G_OS_WIN32 + g_object_get (device, "adapter-luid", &cdata->adapter_luid, + "description", &cdata->description, nullptr); +#else + g_object_get (device, "path", &cdata->display_path, nullptr); +#endif + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstQsvH265DecClass), + nullptr, + nullptr, + (GClassInitFunc) gst_qsv_h265_dec_class_init, + nullptr, + cdata, + sizeof (GstQsvH265Dec), + 0, + (GInstanceInitFunc) gst_qsv_h265_dec_init, + }; + + type_name = g_strdup ("GstQsvH265Dec"); + feature_name = g_strdup ("qsvh265dec"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstQsvH265Device%dDec", index); + feature_name = g_strdup_printf ("qsvh265device%ddec", index); + } + + type = g_type_register_static (GST_TYPE_QSV_DECODER, type_name, &type_info, + (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvh265dec.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include "gstqsvdecoder.h" + +G_BEGIN_DECLS + +void gst_qsv_h265_dec_register (GstPlugin * plugin, + guint rank, + guint impl_index, + GstObject * device, + mfxSession session); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvh265enc.cpp
Added
@@ -0,0 +1,1684 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-qsvh265enc + * @title: qsvh265enc + * + * Intel Quick Sync H.265 encoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc ! qsvh265enc ! h265parse ! matroskamux ! filesink location=out.mkv + * ``` + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvh265enc.h" +#include <gst/base/gstbytewriter.h> +#include <vector> +#include <string> +#include <set> +#include <string.h> + +#ifdef G_OS_WIN32 +#include <gst/d3d11/gstd3d11.h> +#else +#include <gst/va/gstva.h> +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_qsv_h265_enc_debug); +#define GST_CAT_DEFAULT gst_qsv_h265_enc_debug + +typedef enum +{ + GST_QSV_H265_ENC_SEI_INSERT, + GST_QSV_H265_ENC_SEI_INSERT_AND_DROP, + GST_QSV_H265_ENC_SEI_DISABLED, +} GstQsvH265EncSeiInsertMode; + +/** + * GstQsvH265EncSeiInsertMode: + * + * Since: 1.22 + */ +#define GST_TYPE_QSV_H265_ENC_SEI_INSERT_MODE (gst_qsv_h265_enc_sei_insert_mode_get_type ()) +static GType +gst_qsv_h265_enc_sei_insert_mode_get_type (void) +{ + static GType sei_insert_mode_type = 0; + static const GEnumValue insert_modes = { + /** + * GstQsvH265EncSeiInsertMode::insert: + * + * Since: 1.22 + */ + {GST_QSV_H265_ENC_SEI_INSERT, "Insert SEI", "insert"}, + + /** + * GstQsvH265EncSeiInsertMode::insert-and-drop: + * + * Since: 1.22 + */ + {GST_QSV_H265_ENC_SEI_INSERT_AND_DROP, + "Insert SEI and remove corresponding meta from output buffer", + "insert-and-drop"}, + + /** + * GstQsvH265EncSeiInsertMode::disabled: + * + * Since: 1.22 + */ + {GST_QSV_H265_ENC_SEI_DISABLED, "Disable SEI insertion", "disabled"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&sei_insert_mode_type)) { + GType type = + g_enum_register_static ("GstQsvH265EncSeiInsertMode", insert_modes); + g_once_init_leave (&sei_insert_mode_type, type); + } + + return sei_insert_mode_type; +} + +/** + * GstQsvH265EncRateControl: + * + * Since: 1.22 + */ +#define GST_TYPE_QSV_H265_ENC_RATE_CONTROL (gst_qsv_h265_enc_rate_control_get_type ()) +static GType +gst_qsv_h265_enc_rate_control_get_type (void) +{ + static GType rate_control_type = 0; + static const GEnumValue rate_controls = { + /** + * GstQsvH265EncSeiInsertMode::cbr: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_CBR, "Constant Bitrate", "cbr"}, + + /** + * GstQsvH265EncSeiInsertMode::vbr: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_VBR, "Variable Bitrate", "vbr"}, + + /** + * GstQsvH265EncSeiInsertMode::cqp: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_CQP, "Constant Quantizer", "cqp"}, + + /** + * GstQsvH265EncSeiInsertMode::icq: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_ICQ, "Intelligent CQP", "icq"}, + + /** + * GstQsvH265EncSeiInsertMode::vcm: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_VCM, "Video Conferencing Mode (Non HRD compliant)", "vcm"}, + + /** + * GstQsvH265EncSeiInsertMode::qvbr: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_QVBR, "VBR with CQP", "qvbr"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&rate_control_type)) { + GType type = + g_enum_register_static ("GstQsvH265EncRateControl", rate_controls); + g_once_init_leave (&rate_control_type, type); + } + + return rate_control_type; +} + +enum +{ + PROP_0, + PROP_MIN_QP_I, + PROP_MIN_QP_P, + PROP_MIN_QP_B, + PROP_MAX_QP_I, + PROP_MAX_QP_P, + PROP_MAX_QP_B, + PROP_QP_I, + PROP_QP_P, + PROP_QP_B, + PROP_GOP_SIZE, + PROP_IDR_INTERVAL, + PROP_B_FRAMES, + PROP_REF_FRAMES, + PROP_BITRATE, + PROP_MAX_BITRATE, + PROP_RATE_CONTROL, + PROP_ICQ_QUALITY, + PROP_QVBR_QUALITY, + PROP_DISABLE_HRD_CONFORMANCE, + PROP_CC_INSERT, +}; + +#define DEFAULT_QP 0 +#define DEFAULT_GOP_SIZE 30 +#define DEFAULT_IDR_INTERVAL 1 +#define DEFAULT_B_FRAMES 0 +#define DEFAULT_REF_FRAMES 2 +#define DEFAULT_BITRATE 2000 +#define DEFAULT_MAX_BITRATE 0 +#define DEFAULT_RATE_CONTROL MFX_RATECONTROL_VBR +#define DEFAULT_IQC_QUALITY 0 +#define DEFAULT_QVBR_QUALITY 0 +#define DEFAULT_DISABLE_HRD_CONFORMANCE FALSE +#define DEFAULT_CC_INSERT GST_QSV_H265_ENC_SEI_INSERT + +#define DOC_SINK_CAPS_COMM \ + "format = (string) { NV12, P010_10LE }, " \ + "width = (int) 16, 8192 , height = (int) 16, 8192 " + +#define DOC_SINK_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw(memory:VAMemory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw, " DOC_SINK_CAPS_COMM + +#define DOC_SRC_CAPS \ + "video/x-h265, width = (int) 16, 8192 , height = (int) 16, 8192 , " \ + "stream-format = (string) byte-stream, alignment = (string) au, " \ + "profile = (string) { main, main-10 }" + +typedef struct _GstQsvH265EncClassData +{ + GstCaps *sink_caps; + GstCaps *src_caps; + guint impl_index; + gint64 adapter_luid; + gchar *display_path; + gchar *description; + gboolean hdr10_aware; +} GstQsvH265EncClassData; + +typedef struct _GstQsvH265Enc +{ + GstQsvEncoder parent; + + mfxExtVideoSignalInfo signal_info; + mfxExtCodingOption option; + mfxExtCodingOption2 option2; + mfxExtCodingOption3 option3; + mfxExtContentLightLevelInfo cll; + mfxExtMasteringDisplayColourVolume mdcv; + + mfxU16 profile; + + GMutex prop_lock; + /* protected by prop_lock */ + gboolean bitrate_updated; + gboolean property_updated; + + /* properties */ + guint min_qp_i; + guint min_qp_p; + guint min_qp_b; + guint max_qp_i; + guint max_qp_p; + guint max_qp_b; + guint qp_i; + guint qp_p; + guint qp_b; + guint gop_size; + guint idr_interval; + guint bframes; + guint ref_frames; + guint bitrate; + guint max_bitrate; + mfxU16 rate_control; + guint icq_quality; + guint qvbr_quality; + gboolean disable_hrd_conformance; + GstQsvH265EncSeiInsertMode cc_insert; +} GstQsvH265Enc; + +typedef struct _GstQsvH265EncClass +{ + GstQsvEncoderClass parent_class; + + gboolean hdr10_aware; +} GstQsvH265EncClass; + +static GstElementClass *parent_class = nullptr; + +#define GST_QSV_H265_ENC(object) ((GstQsvH265Enc *) (object)) +#define GST_QSV_H265_ENC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstQsvH265EncClass)) + +static void gst_qsv_h265_enc_finalize (GObject * object); +static void gst_qsv_h265_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_qsv_h265_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_qsv_h265_enc_start (GstVideoEncoder * encoder); +static gboolean gst_qsv_h265_enc_transform_meta (GstVideoEncoder * encoder, + GstVideoCodecFrame * frame, GstMeta * meta); +static GstCaps *gst_qsv_h265_enc_getcaps (GstVideoEncoder * encoder, + GstCaps * filter); + +static gboolean gst_qsv_h265_enc_set_format (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxVideoParam * param, + GPtrArray * extra_params); +static gboolean gst_qsv_h265_enc_set_output_state (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxSession session); +static gboolean gst_qsv_h265_enc_attach_payload (GstQsvEncoder * encoder, + GstVideoCodecFrame * frame, GPtrArray * payload); +static GstBuffer *gst_qsv_h265_enc_create_output_buffer (GstQsvEncoder * + encoder, mfxBitstream * bitstream); +static GstQsvEncoderReconfigure +gst_qsv_h265_enc_check_reconfigure (GstQsvEncoder * encoder, mfxSession session, + mfxVideoParam * param, GPtrArray * extra_params); + +static void +gst_qsv_h265_enc_class_init (GstQsvH265EncClass * klass, gpointer data) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoEncoderClass *encoder_class = GST_VIDEO_ENCODER_CLASS (klass); + GstQsvEncoderClass *qsvenc_class = GST_QSV_ENCODER_CLASS (klass); + GstQsvH265EncClassData *cdata = (GstQsvH265EncClassData *) data; + GstPadTemplate *pad_templ; + GstCaps *doc_caps; + + qsvenc_class->codec_id = MFX_CODEC_AVC; + qsvenc_class->impl_index = cdata->impl_index; + qsvenc_class->adapter_luid = cdata->adapter_luid; + qsvenc_class->display_path = cdata->display_path; + + object_class->finalize = gst_qsv_h265_enc_finalize; + object_class->set_property = gst_qsv_h265_enc_set_property; + object_class->get_property = gst_qsv_h265_enc_get_property; + + g_object_class_install_property (object_class, PROP_MIN_QP_I, + g_param_spec_uint ("min-qp-i", "Min QP I", + "Minimum allowed QP value for I-frame types (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MIN_QP_P, + g_param_spec_uint ("min-qp-p", "Min QP P", + "Minimum allowed QP value for P-frame types (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MIN_QP_B, + g_param_spec_uint ("min-qp-b", "Min QP B", + "Minimum allowed QP value for B-frame types (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MAX_QP_I, + g_param_spec_uint ("max-qp-i", "Max QP I", + "Maximum allowed QP value for I-frame types (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MAX_QP_P, + g_param_spec_uint ("max-qp-p", "Max QP P", + "Maximum allowed QP value for P-frame types (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MAX_QP_B, + g_param_spec_uint ("max-qp-b", "Max QP B", + "Maximum allowed QP value for B-frame types (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_QP_I, + g_param_spec_uint ("qp-i", "QP I", + "Constant quantizer for I frames (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_QP_P, + g_param_spec_uint ("qp-p", "QP P", + "Constant quantizer for P frames (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_QP_B, + g_param_spec_uint ("qp-b", "QP B", + "Constant quantizer for B frames (0: default)", + 0, 51, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_GOP_SIZE, + g_param_spec_uint ("gop-size", "GOP Size", + "Number of pictures within a GOP (0: unspecified)", + 0, G_MAXUSHORT, DEFAULT_GOP_SIZE, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_IDR_INTERVAL, + g_param_spec_uint ("idr-interval", "IDR interval", + "IDR-frame interval in terms of I-frames. " + "0: only first I-frame is is an IDR frame, " + "1: every I-frame is an IDR frame, " + "N: \"N - 1\" I-frames are inserted between IDR-frames", + 0, G_MAXUSHORT, DEFAULT_IDR_INTERVAL, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_B_FRAMES, + g_param_spec_uint ("b-frames", "B Frames", + "Number of B frames between I and P frames", + 0, G_MAXUSHORT, DEFAULT_B_FRAMES, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_REF_FRAMES, + g_param_spec_uint ("ref-frames", "Reference Frames", + "Number of reference frames (0: unspecified)", + 0, 16, DEFAULT_REF_FRAMES, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_BITRATE, + g_param_spec_uint ("bitrate", "Bitrate", + "Target bitrate in kbit/sec, Ignored when selected rate-control mode " + "is constant QP variants (i.e., \"cqp\" and \"icq\")", + 0, G_MAXINT, DEFAULT_BITRATE, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MAX_BITRATE, + g_param_spec_uint ("max-bitrate", "Max Bitrate", + "Maximum bitrate in kbit/sec, Ignored when selected rate-control mode " + "is constant QP variants (i.e., \"cqp\" and \"icq\")", + 0, G_MAXINT, DEFAULT_MAX_BITRATE, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_RATE_CONTROL, + g_param_spec_enum ("rate-control", "Rate Control", + "Rate Control Method", GST_TYPE_QSV_H265_ENC_RATE_CONTROL, + DEFAULT_RATE_CONTROL, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_ICQ_QUALITY, + g_param_spec_uint ("icq-quality", "ICQ Quality", + "Intelligent Constant Quality for \"icq\" rate-control (0: default)", + 0, 51, DEFAULT_IQC_QUALITY, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_QVBR_QUALITY, + g_param_spec_uint ("qvbr-quality", "QVBR Quality", + "Quality level used for \"qvbr\" rate-control mode (0: default)", + 0, 51, DEFAULT_QVBR_QUALITY, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_DISABLE_HRD_CONFORMANCE, + g_param_spec_boolean ("disable-hrd-conformance", + "Disable HRD Conformance", "Allow NAL HRD non-conformant stream", + DEFAULT_DISABLE_HRD_CONFORMANCE, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_CC_INSERT, + g_param_spec_enum ("cc-insert", "Closed Caption Insert", + "Closed Caption Insert mode. " + "Only CEA-708 RAW format is supported for now", + GST_TYPE_QSV_H265_ENC_SEI_INSERT_MODE, DEFAULT_CC_INSERT, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + parent_class = (GstElementClass *) g_type_class_peek_parent (klass); + +#ifdef G_OS_WIN32 + std::string long_name = "Intel Quick Sync Video " + + std::string (cdata->description) + " H.265 Encoder"; + + gst_element_class_set_metadata (element_class, long_name.c_str (), + "Codec/Encoder/Video/Hardware", + "Intel Quick Sync Video H.265 Encoder", + "Seungha Yang <seungha@centricular.com>"); +#else + gst_element_class_set_static_metadata (element_class, + "Intel Quick Sync Video H.265 Encoder", + "Codec/Encoder/Video/Hardware", + "Intel Quick Sync Video H.265 Encoder", + "Seungha Yang <seungha@centricular.com>"); +#endif + + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + encoder_class->start = GST_DEBUG_FUNCPTR (gst_qsv_h265_enc_start); + encoder_class->transform_meta = + GST_DEBUG_FUNCPTR (gst_qsv_h265_enc_transform_meta); + encoder_class->getcaps = GST_DEBUG_FUNCPTR (gst_qsv_h265_enc_getcaps); + + qsvenc_class->set_format = GST_DEBUG_FUNCPTR (gst_qsv_h265_enc_set_format); + qsvenc_class->set_output_state = + GST_DEBUG_FUNCPTR (gst_qsv_h265_enc_set_output_state); + qsvenc_class->attach_payload = + GST_DEBUG_FUNCPTR (gst_qsv_h265_enc_attach_payload); + qsvenc_class->create_output_buffer = + GST_DEBUG_FUNCPTR (gst_qsv_h265_enc_create_output_buffer); + qsvenc_class->check_reconfigure = + GST_DEBUG_FUNCPTR (gst_qsv_h265_enc_check_reconfigure); + + klass->hdr10_aware = cdata->hdr10_aware; + + gst_type_mark_as_plugin_api (GST_TYPE_QSV_H265_ENC_SEI_INSERT_MODE, + (GstPluginAPIFlags) 0); + gst_type_mark_as_plugin_api (GST_TYPE_QSV_H265_ENC_RATE_CONTROL, + (GstPluginAPIFlags) 0); + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata->description); + g_free (cdata); +} + +static void +gst_qsv_h265_enc_init (GstQsvH265Enc * self) +{ + self->min_qp_i = DEFAULT_QP; + self->min_qp_p = DEFAULT_QP; + self->min_qp_b = DEFAULT_QP; + self->max_qp_i = DEFAULT_QP; + self->max_qp_p = DEFAULT_QP; + self->max_qp_p = DEFAULT_QP; + self->qp_i = DEFAULT_QP; + self->qp_p = DEFAULT_QP; + self->qp_b = DEFAULT_QP; + self->gop_size = DEFAULT_GOP_SIZE; + self->idr_interval = DEFAULT_IDR_INTERVAL; + self->bframes = DEFAULT_B_FRAMES; + self->ref_frames = DEFAULT_REF_FRAMES; + self->bitrate = DEFAULT_BITRATE; + self->max_bitrate = DEFAULT_MAX_BITRATE; + self->rate_control = DEFAULT_RATE_CONTROL; + self->icq_quality = DEFAULT_IQC_QUALITY; + self->qvbr_quality = DEFAULT_QVBR_QUALITY; + self->disable_hrd_conformance = DEFAULT_DISABLE_HRD_CONFORMANCE; + self->cc_insert = DEFAULT_CC_INSERT; + + g_mutex_init (&self->prop_lock); +} + +static void +gst_qsv_h265_enc_finalize (GObject * object) +{ + GstQsvH265Enc *self = GST_QSV_H265_ENC (object); + + g_mutex_clear (&self->prop_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_qsv_h265_enc_check_update_uint (GstQsvH265Enc * self, guint * old_val, + guint new_val, gboolean is_bitrate_param) +{ + if (*old_val == new_val) + return; + + g_mutex_lock (&self->prop_lock); + *old_val = new_val; + if (is_bitrate_param) + self->bitrate_updated = TRUE; + else + self->property_updated = TRUE; + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_qsv_h265_enc_check_update_enum (GstQsvH265Enc * self, mfxU16 * old_val, + gint new_val) +{ + if (*old_val == (mfxU16) new_val) + return; + + g_mutex_lock (&self->prop_lock); + *old_val = (mfxU16) new_val; + self->property_updated = TRUE; + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_qsv_h265_enc_check_update_boolean (GstQsvH265Enc * self, gboolean * old_val, + gboolean new_val) +{ + if (*old_val == new_val) + return; + + g_mutex_lock (&self->prop_lock); + *old_val = new_val; + self->property_updated = TRUE; + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_qsv_h265_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstQsvH265Enc *self = GST_QSV_H265_ENC (object); + + switch (prop_id) { + case PROP_MIN_QP_I: + gst_qsv_h265_enc_check_update_uint (self, &self->min_qp_i, + g_value_get_uint (value), FALSE); + break; + case PROP_MIN_QP_P: + gst_qsv_h265_enc_check_update_uint (self, &self->min_qp_p, + g_value_get_uint (value), FALSE); + break; + case PROP_MIN_QP_B: + gst_qsv_h265_enc_check_update_uint (self, &self->min_qp_b, + g_value_get_uint (value), FALSE); + break; + case PROP_MAX_QP_I: + gst_qsv_h265_enc_check_update_uint (self, &self->max_qp_i, + g_value_get_uint (value), FALSE); + break; + case PROP_MAX_QP_P: + gst_qsv_h265_enc_check_update_uint (self, &self->max_qp_p, + g_value_get_uint (value), FALSE); + break; + case PROP_MAX_QP_B: + gst_qsv_h265_enc_check_update_uint (self, &self->max_qp_b, + g_value_get_uint (value), FALSE); + break; + case PROP_QP_I: + gst_qsv_h265_enc_check_update_uint (self, &self->qp_i, + g_value_get_uint (value), TRUE); + break; + case PROP_QP_P: + gst_qsv_h265_enc_check_update_uint (self, &self->qp_p, + g_value_get_uint (value), TRUE); + break; + case PROP_QP_B: + gst_qsv_h265_enc_check_update_uint (self, &self->qp_b, + g_value_get_uint (value), TRUE); + break; + case PROP_GOP_SIZE: + gst_qsv_h265_enc_check_update_uint (self, &self->gop_size, + g_value_get_uint (value), FALSE); + break; + case PROP_IDR_INTERVAL: + gst_qsv_h265_enc_check_update_uint (self, &self->idr_interval, + g_value_get_uint (value), FALSE); + break; + case PROP_B_FRAMES: + gst_qsv_h265_enc_check_update_uint (self, &self->bframes, + g_value_get_uint (value), FALSE); + break; + case PROP_REF_FRAMES: + gst_qsv_h265_enc_check_update_uint (self, &self->ref_frames, + g_value_get_uint (value), FALSE); + break; + case PROP_BITRATE: + gst_qsv_h265_enc_check_update_uint (self, &self->bitrate, + g_value_get_uint (value), TRUE); + break; + case PROP_MAX_BITRATE: + gst_qsv_h265_enc_check_update_uint (self, &self->max_bitrate, + g_value_get_uint (value), TRUE); + break; + case PROP_RATE_CONTROL: + gst_qsv_h265_enc_check_update_enum (self, &self->rate_control, + g_value_get_enum (value)); + break; + case PROP_ICQ_QUALITY: + gst_qsv_h265_enc_check_update_uint (self, &self->icq_quality, + g_value_get_uint (value), FALSE); + break; + case PROP_QVBR_QUALITY: + gst_qsv_h265_enc_check_update_uint (self, &self->qvbr_quality, + g_value_get_uint (value), FALSE); + break; + case PROP_DISABLE_HRD_CONFORMANCE: + gst_qsv_h265_enc_check_update_boolean (self, + &self->disable_hrd_conformance, g_value_get_boolean (value)); + break; + case PROP_CC_INSERT: + /* This property is unrelated to encoder-reset */ + self->cc_insert = (GstQsvH265EncSeiInsertMode) g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_qsv_h265_enc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstQsvH265Enc *self = GST_QSV_H265_ENC (object); + + switch (prop_id) { + case PROP_MIN_QP_I: + g_value_set_uint (value, self->min_qp_i); + break; + case PROP_MIN_QP_P: + g_value_set_uint (value, self->min_qp_p); + break; + case PROP_MIN_QP_B: + g_value_set_uint (value, self->min_qp_b); + break; + case PROP_MAX_QP_I: + g_value_set_uint (value, self->max_qp_i); + break; + case PROP_MAX_QP_P: + g_value_set_uint (value, self->max_qp_p); + break; + case PROP_MAX_QP_B: + g_value_set_uint (value, self->max_qp_b); + break; + case PROP_QP_I: + g_value_set_uint (value, self->qp_i); + break; + case PROP_QP_P: + g_value_set_uint (value, self->qp_p); + break; + case PROP_QP_B: + g_value_set_uint (value, self->qp_b); + break; + case PROP_GOP_SIZE: + g_value_set_uint (value, self->gop_size); + break; + case PROP_IDR_INTERVAL: + g_value_set_uint (value, self->idr_interval); + break; + case PROP_B_FRAMES: + g_value_set_uint (value, self->bframes); + break; + case PROP_REF_FRAMES: + g_value_set_uint (value, self->ref_frames); + break; + case PROP_BITRATE: + g_value_set_uint (value, self->bitrate); + break; + case PROP_MAX_BITRATE: + g_value_set_uint (value, self->max_bitrate); + break; + case PROP_RATE_CONTROL: + g_value_set_enum (value, self->rate_control); + break; + case PROP_ICQ_QUALITY: + g_value_set_uint (value, self->icq_quality); + break; + case PROP_QVBR_QUALITY: + g_value_set_uint (value, self->qvbr_quality); + break; + case PROP_CC_INSERT: + g_value_set_enum (value, self->cc_insert); + break; + case PROP_DISABLE_HRD_CONFORMANCE: + g_value_set_boolean (value, self->disable_hrd_conformance); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_qsv_h265_enc_start (GstVideoEncoder * encoder) +{ + /* To avoid negative DTS when B frame is enabled */ + gst_video_encoder_set_min_pts (encoder, GST_SECOND * 60 * 60 * 1000); + + return TRUE; +} + +static gboolean +gst_qsv_h265_enc_transform_meta (GstVideoEncoder * encoder, + GstVideoCodecFrame * frame, GstMeta * meta) +{ + GstQsvH265Enc *self = GST_QSV_H265_ENC (encoder); + GstVideoCaptionMeta *cc_meta; + + /* We need to handle only case CC meta should be dropped */ + if (self->cc_insert != GST_QSV_H265_ENC_SEI_INSERT_AND_DROP) + goto out; + + if (meta->info->api != GST_VIDEO_CAPTION_META_API_TYPE) + goto out; + + cc_meta = (GstVideoCaptionMeta *) meta; + if (cc_meta->caption_type != GST_VIDEO_CAPTION_TYPE_CEA708_RAW) + goto out; + + /* Don't copy this meta into output buffer */ + return FALSE; + +out: + return GST_VIDEO_ENCODER_CLASS (parent_class)->transform_meta (encoder, + frame, meta); +} + +static GstCaps * +gst_qsv_h265_enc_getcaps (GstVideoEncoder * encoder, GstCaps * filter) +{ + GstQsvH265Enc *self = GST_QSV_H265_ENC (encoder); + GstCaps *allowed_caps; + GstCaps *template_caps; + GstCaps *supported_caps; + std::set < std::string > downstream_profiles; + + allowed_caps = gst_pad_get_allowed_caps (encoder->srcpad); + + /* Shouldn't be any or empty though, just return template caps in this case */ + if (!allowed_caps || gst_caps_is_empty (allowed_caps) || + gst_caps_is_any (allowed_caps)) { + gst_clear_caps (&allowed_caps); + + return gst_video_encoder_proxy_getcaps (encoder, nullptr, filter); + } + + /* Check if downstream specified profile explicitly, then filter out + * incompatible raw video format */ + for (guint i = 0; i < gst_caps_get_size (allowed_caps); i++) { + const GValue *profile_value; + const gchar *profile; + GstStructure *s; + + s = gst_caps_get_structure (allowed_caps, i); + profile_value = gst_structure_get_value (s, "profile"); + if (!profile_value) + continue; + + if (GST_VALUE_HOLDS_LIST (profile_value)) { + for (guint j = 0; j < gst_value_list_get_size (profile_value); j++) { + const GValue *p = gst_value_list_get_value (profile_value, j); + + if (!G_VALUE_HOLDS_STRING (p)) + continue; + + profile = g_value_get_string (p); + if (profile) + downstream_profiles.insert (profile); + } + + } else if (G_VALUE_HOLDS_STRING (profile_value)) { + profile = g_value_get_string (profile_value); + if (g_strcmp0 (profile, "main") == 0 || + g_strcmp0 (profile, "main-10") == 0) { + downstream_profiles.insert (profile); + } + } + } + + GST_DEBUG_OBJECT (self, "Downstream specified %" G_GSIZE_FORMAT " profiles", + downstream_profiles.size ()); + + /* Caps returned by gst_pad_get_allowed_caps() should hold profile field + * already */ + if (downstream_profiles.size () == 0) { + GST_WARNING_OBJECT (self, + "Allowed caps holds no profile field %" GST_PTR_FORMAT, allowed_caps); + + gst_clear_caps (&allowed_caps); + + return gst_video_encoder_proxy_getcaps (encoder, nullptr, filter); + } + + gst_clear_caps (&allowed_caps); + + template_caps = gst_pad_get_pad_template_caps (encoder->sinkpad); + template_caps = gst_caps_make_writable (template_caps); + + if (downstream_profiles.size () == 1) { + std::string format; + const std::string & profile = *downstream_profiles.begin (); + + if (profile == "main") { + format = "NV12"; + } else if (profile == "main-10") { + format = "P010_10LE"; + } else { + gst_clear_caps (&template_caps); + g_assert_not_reached (); + return nullptr; + } + + gst_caps_set_simple (template_caps, "format", G_TYPE_STRING, + format.c_str (), nullptr); + } else { + GValue formats = G_VALUE_INIT; + + g_value_init (&formats, GST_TYPE_LIST); + + /* *INDENT-OFF* */ + for (const auto & iter : downstream_profiles) { + GValue val = G_VALUE_INIT; + g_value_init (&val, G_TYPE_STRING); + if (iter == "main") { + g_value_set_static_string (&val, "NV12"); + } else if (iter == "main-10") { + g_value_set_static_string (&val, "P010_10LE"); + } else { + g_value_unset (&val); + gst_clear_caps (&template_caps); + g_assert_not_reached (); + return nullptr; + } + + gst_value_list_append_and_take_value (&formats, &val); + } + /* *INDENT-ON* */ + + gst_caps_set_value (template_caps, "format", &formats); + g_value_unset (&formats); + } + + supported_caps = gst_video_encoder_proxy_getcaps (encoder, + template_caps, filter); + gst_caps_unref (template_caps); + + GST_DEBUG_OBJECT (self, "Returning %" GST_PTR_FORMAT, supported_caps); + + return supported_caps; +} + +typedef struct +{ + mfxU16 profile; + const gchar *profile_str; + const gchar *raw_format; +} H265Profile; + +static const H265Profile profile_map = { + {MFX_PROFILE_HEVC_MAIN, "main", "NV12"}, + {MFX_PROFILE_HEVC_MAIN10, "main-10", "P010_10LE"}, +}; + +static const gchar * +gst_qsv_h265_profile_to_string (mfxU16 profile) +{ + for (guint i = 0; i < G_N_ELEMENTS (profile_map); i++) { + if (profile_mapi.profile == profile) + return profile_mapi.profile_str; + } + + return nullptr; +} + +static void +gst_qsv_h265_enc_init_extra_params (GstQsvH265Enc * self) +{ + memset (&self->signal_info, 0, sizeof (mfxExtVideoSignalInfo)); + memset (&self->option, 0, sizeof (mfxExtCodingOption)); + memset (&self->option2, 0, sizeof (mfxExtCodingOption2)); + memset (&self->option3, 0, sizeof (mfxExtCodingOption3)); + memset (&self->cll, 0, sizeof (mfxExtContentLightLevelInfo)); + memset (&self->mdcv, 0, sizeof (mfxExtMasteringDisplayColourVolume)); + + self->signal_info.Header.BufferId = MFX_EXTBUFF_VIDEO_SIGNAL_INFO; + self->signal_info.Header.BufferSz = sizeof (mfxExtVideoSignalInfo); + + self->option.Header.BufferId = MFX_EXTBUFF_CODING_OPTION; + self->option.Header.BufferSz = sizeof (mfxExtCodingOption); + + self->option2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION2; + self->option2.Header.BufferSz = sizeof (mfxExtCodingOption2); + + self->option3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3; + self->option3.Header.BufferSz = sizeof (mfxExtCodingOption3); + + self->cll.Header.BufferId = MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO; + self->cll.Header.BufferSz = sizeof (mfxExtContentLightLevelInfo); + self->cll.InsertPayloadToggle = MFX_PAYLOAD_IDR; + + self->mdcv.Header.BufferId = MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME; + self->mdcv.Header.BufferSz = sizeof (mfxExtMasteringDisplayColourVolume); + self->mdcv.InsertPayloadToggle = MFX_PAYLOAD_IDR; +} + +static void +gst_qsv_h265_enc_set_bitrate (GstQsvH265Enc * self, mfxVideoParam * param) +{ + guint max_val; + guint multiplier; + + switch (param->mfx.RateControlMethod) { + case MFX_RATECONTROL_CBR: + multiplier = (self->bitrate + 0x10000) / 0x10000; + param->mfx.TargetKbps = param->mfx.MaxKbps = self->bitrate / multiplier; + param->mfx.BRCParamMultiplier = (mfxU16) multiplier; + break; + case MFX_RATECONTROL_VBR: + case MFX_RATECONTROL_VCM: + case MFX_RATECONTROL_QVBR: + max_val = MAX (self->bitrate, self->max_bitrate); + multiplier = (max_val + 0x10000) / 0x10000; + param->mfx.TargetKbps = self->bitrate / multiplier; + param->mfx.MaxKbps = self->max_bitrate / multiplier; + param->mfx.BRCParamMultiplier = (mfxU16) multiplier; + break; + case MFX_RATECONTROL_CQP: + param->mfx.QPI = self->qp_i; + param->mfx.QPP = self->qp_p; + param->mfx.QPB = self->qp_b; + break; + case MFX_RATECONTROL_ICQ: + param->mfx.ICQQuality = self->icq_quality; + break; + default: + GST_WARNING_OBJECT (self, + "Unhandled rate-control method %d", self->rate_control); + break; + } +} + +static gboolean +gst_qsv_h265_enc_set_format (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxVideoParam * param, GPtrArray * extra_params) +{ + GstQsvH265Enc *self = GST_QSV_H265_ENC (encoder); + GstQsvH265EncClass *klass = GST_QSV_H265_ENC_GET_CLASS (self); + mfxU16 mfx_profile = MFX_PROFILE_UNKNOWN; + GstVideoInfo *info = &state->info; + mfxExtVideoSignalInfo *signal_info = nullptr; + mfxExtCodingOption *option; + mfxExtCodingOption2 *option2; + mfxExtCodingOption3 *option3; + mfxExtContentLightLevelInfo *cll; + mfxExtMasteringDisplayColourVolume *mdcv; + gboolean have_cll = FALSE; + gboolean have_mdcv = FALSE; + + mfxFrameInfo *frame_info; + + frame_info = ¶m->mfx.FrameInfo; + + frame_info->Width = GST_ROUND_UP_16 (info->width); + frame_info->Height = GST_ROUND_UP_16 (info->height); + frame_info->PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + + /* QSV wouldn't be happy with this size, increase */ + if (frame_info->Width == 16) + frame_info->Width = 32; + + if (frame_info->Height == 16) + frame_info->Height = 32; + + frame_info->CropW = info->width; + frame_info->CropH = info->height; + if (GST_VIDEO_INFO_FPS_N (info) > 0 && GST_VIDEO_INFO_FPS_D (info) > 0) { + frame_info->FrameRateExtN = GST_VIDEO_INFO_FPS_N (info); + frame_info->FrameRateExtD = GST_VIDEO_INFO_FPS_D (info); + } else { + /* HACK: Same as x265enc */ + frame_info->FrameRateExtN = 25; + frame_info->FrameRateExtD = 1; + } + + frame_info->AspectRatioW = GST_VIDEO_INFO_PAR_N (info); + frame_info->AspectRatioH = GST_VIDEO_INFO_PAR_D (info); + + switch (GST_VIDEO_INFO_FORMAT (info)) { + case GST_VIDEO_FORMAT_NV12: + mfx_profile = MFX_PROFILE_HEVC_MAIN; + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; + frame_info->FourCC = MFX_FOURCC_NV12; + frame_info->BitDepthLuma = 8; + frame_info->BitDepthChroma = 8; + frame_info->Shift = 0; + break; + case GST_VIDEO_FORMAT_P010_10LE: + mfx_profile = MFX_PROFILE_HEVC_MAIN10; + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; + frame_info->FourCC = MFX_FOURCC_P010; + frame_info->BitDepthLuma = 10; + frame_info->BitDepthChroma = 10; + frame_info->Shift = 1; + break; + default: + GST_ERROR_OBJECT (self, "Unexpected format %s", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info))); + return FALSE; + } + + gst_qsv_h265_enc_init_extra_params (self); + option = &self->option; + option2 = &self->option2; + option3 = &self->option3; + cll = &self->cll; + mdcv = &self->mdcv; + + if (klass->hdr10_aware) { + GstVideoMasteringDisplayInfo mdcv_info; + GstVideoContentLightLevel cll_info; + + if (gst_video_content_light_level_from_caps (&cll_info, state->caps)) { + cll->MaxContentLightLevel = cll_info.max_content_light_level; + cll->MaxPicAverageLightLevel = cll_info.max_frame_average_light_level; + have_cll = TRUE; + } + + if (gst_video_mastering_display_info_from_caps (&mdcv_info, state->caps)) { + /* GBR order is used in HEVC */ + mdcv->DisplayPrimariesX0 = mdcv_info.display_primaries1.x; + mdcv->DisplayPrimariesY0 = mdcv_info.display_primaries1.y; + mdcv->DisplayPrimariesX1 = mdcv_info.display_primaries2.x; + mdcv->DisplayPrimariesY1 = mdcv_info.display_primaries2.y; + mdcv->DisplayPrimariesX2 = mdcv_info.display_primaries0.x; + mdcv->DisplayPrimariesY2 = mdcv_info.display_primaries0.y; + + mdcv->WhitePointX = mdcv_info.white_point.x; + mdcv->WhitePointY = mdcv_info.white_point.y; + mdcv->MaxDisplayMasteringLuminance = + mdcv_info.max_display_mastering_luminance; + mdcv->MinDisplayMasteringLuminance = + mdcv_info.min_display_mastering_luminance; + have_mdcv = TRUE; + } + } + + g_mutex_lock (&self->prop_lock); + param->mfx.CodecId = MFX_CODEC_HEVC; + param->mfx.CodecProfile = mfx_profile; + param->mfx.GopRefDist = self->bframes + 1; + param->mfx.GopPicSize = self->gop_size; + param->mfx.IdrInterval = self->idr_interval; + param->mfx.RateControlMethod = self->rate_control; + param->mfx.NumRefFrame = self->ref_frames; + + gst_qsv_h265_enc_set_bitrate (self, param); + + /* Write signal info only when upstream caps contains valid colorimetry, + * because derived default colorimetry in gst_video_info_from_caps() tends to + * very wrong in various cases, and it's even worse than "unknown" */ + if (state->caps) { + GstStructure *s = gst_caps_get_structure (state->caps, 0); + GstVideoColorimetry cinfo; + const gchar *str; + + str = gst_structure_get_string (s, "colorimetry"); + if (str && gst_video_colorimetry_from_string (&cinfo, str)) { + signal_info = &self->signal_info; + + /* 0: Component, 1: PAL, 2: NTSC, 3: SECAM, 4: MAC, 5: Unspecified */ + signal_info->VideoFormat = 5; + if (cinfo.range == GST_VIDEO_COLOR_RANGE_0_255) + signal_info->VideoFullRange = 1; + else + signal_info->VideoFullRange = 0; + signal_info->ColourDescriptionPresent = 1; + signal_info->ColourPrimaries = + gst_video_color_primaries_to_iso (cinfo.primaries); + signal_info->TransferCharacteristics = + gst_video_transfer_function_to_iso (cinfo.transfer); + signal_info->MatrixCoefficients = + gst_video_color_matrix_to_iso (cinfo.matrix); + } + } + + /* TODO: property ? */ + option->AUDelimiter = MFX_CODINGOPTION_ON; + + if (self->disable_hrd_conformance) { + option->NalHrdConformance = MFX_CODINGOPTION_OFF; + option->VuiVclHrdParameters = MFX_CODINGOPTION_OFF; + } + + /* Enables PicTiming SEI by default */ + option->PicTimingSEI = MFX_CODINGOPTION_ON; + + /* VUI is useful in various cases, so we don't want to disable it */ + option2->DisableVUI = MFX_CODINGOPTION_OFF; + + /* Do not repeat PPS */ + option2->RepeatPPS = MFX_CODINGOPTION_OFF; + + option2->MinQPI = self->min_qp_i; + option2->MinQPP = self->min_qp_p; + option2->MinQPB = self->min_qp_b; + option2->MaxQPI = self->max_qp_i; + option2->MaxQPP = self->max_qp_p; + option2->MaxQPB = self->max_qp_b; + + /* QSV wants MFX_B_REF_PYRAMID when more than 1 b-frame is enabled */ + if (param->mfx.GopRefDist > 2) + option2->BRefType = MFX_B_REF_PYRAMID; + + /* Upstream specified framerate, we will believe it's fixed framerate */ + if (GST_VIDEO_INFO_FPS_N (info) > 0 && GST_VIDEO_INFO_FPS_D (info) > 0) { + option2->FixedFrameRate = MFX_CODINGOPTION_ON; + option3->TimingInfoPresent = MFX_CODINGOPTION_ON; + } + + if (param->mfx.RateControlMethod == MFX_RATECONTROL_QVBR) + option3->QVBRQuality = self->qvbr_quality; + + if (signal_info) + g_ptr_array_add (extra_params, signal_info); + g_ptr_array_add (extra_params, option); + g_ptr_array_add (extra_params, option2); + g_ptr_array_add (extra_params, option3); + if (have_cll) + g_ptr_array_add (extra_params, cll); + if (have_mdcv) + g_ptr_array_add (extra_params, mdcv); + + param->ExtParam = (mfxExtBuffer **) extra_params->pdata; + param->NumExtParam = extra_params->len; + + self->bitrate_updated = FALSE; + self->property_updated = FALSE; + + g_mutex_unlock (&self->prop_lock); + + return TRUE; +} + +static gboolean +gst_qsv_h265_enc_set_output_state (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxSession session) +{ + GstQsvH265Enc *self = GST_QSV_H265_ENC (encoder); + GstCaps *caps; + GstTagList *tags; + GstVideoCodecState *out_state; + guint bitrate, max_bitrate; + guint multiplier = 1; + mfxVideoParam param; + const gchar *profile_str; + mfxStatus status; + + memset (¶m, 0, sizeof (mfxVideoParam)); + status = MFXVideoENCODE_GetVideoParam (session, ¶m); + if (status < MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to get video param %d (%s)", + QSV_STATUS_ARGS (status)); + return FALSE; + } else if (status != MFX_ERR_NONE) { + GST_WARNING_OBJECT (self, "GetVideoParam returned warning %d (%s)", + QSV_STATUS_ARGS (status)); + } + + caps = gst_caps_from_string ("video/x-h265, alignment = (string) au, " + "stream-format = (string) byte-stream"); + profile_str = gst_qsv_h265_profile_to_string (param.mfx.CodecProfile); + if (profile_str) + gst_caps_set_simple (caps, "profile", G_TYPE_STRING, profile_str, nullptr); + + out_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (encoder), + caps, state); + gst_video_codec_state_unref (out_state); + + tags = gst_tag_list_new_empty (); + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, "qsvh265enc", + nullptr); + + if (param.mfx.BRCParamMultiplier > 0) + multiplier = param.mfx.BRCParamMultiplier; + + switch (param.mfx.RateControlMethod) { + case MFX_RATECONTROL_CQP: + case MFX_RATECONTROL_ICQ: + /* We don't know target/max bitrate in this case */ + break; + default: + max_bitrate = (guint) param.mfx.MaxKbps * multiplier; + bitrate = (guint) param.mfx.TargetKbps * multiplier; + if (bitrate > 0) { + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, + GST_TAG_NOMINAL_BITRATE, bitrate * 1000, nullptr); + } + + if (max_bitrate > 0) { + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, + GST_TAG_MAXIMUM_BITRATE, max_bitrate * 1000, nullptr); + } + break; + } + + gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (encoder), + tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (tags); + + return TRUE; +} + +static gboolean +gst_qsv_h265_enc_foreach_caption_meta (GstBuffer * buffer, GstMeta ** meta, + GPtrArray * payload) +{ + GstVideoCaptionMeta *cc_meta; + GstByteWriter br; + guint payload_size; + guint extra_size; + mfxPayload *p; + + if ((*meta)->info->api != GST_VIDEO_CAPTION_META_API_TYPE) + return TRUE; + + cc_meta = (GstVideoCaptionMeta *) (*meta); + + if (cc_meta->caption_type != GST_VIDEO_CAPTION_TYPE_CEA708_RAW) + return TRUE; + + /* QSV requires full sei_message() structure */ + /* 1 byte contry_code + 10 bytes CEA-708 specific data + caption data */ + payload_size = 11 + cc_meta->size; + extra_size = payload_size / 255; + + /* 1 byte SEI type + 1 byte SEI payload size (+ extra) + payload data */ + gst_byte_writer_init_with_size (&br, 2 + extra_size + payload_size, FALSE); + + /* SEI type */ + gst_byte_writer_put_uint8 (&br, 4); + + /* SEI payload size */ + while (payload_size >= 0xff) { + gst_byte_writer_put_uint8 (&br, 0xff); + payload_size -= 0xff; + } + gst_byte_writer_put_uint8 (&br, payload_size); + + /* 8-bits itu_t_t35_country_code */ + gst_byte_writer_put_uint8 (&br, 181); + + /* 16-bits itu_t_t35_provider_code */ + gst_byte_writer_put_uint8 (&br, 0); + gst_byte_writer_put_uint8 (&br, 49); + + /* 32-bits ATSC_user_identifier */ + gst_byte_writer_put_uint8 (&br, 'G'); + gst_byte_writer_put_uint8 (&br, 'A'); + gst_byte_writer_put_uint8 (&br, '9'); + gst_byte_writer_put_uint8 (&br, '4'); + + /* 8-bits ATSC1_data_user_data_type_code */ + gst_byte_writer_put_uint8 (&br, 3); + + /* 8-bits: + * 1 bit process_em_data_flag (0) + * 1 bit process_cc_data_flag (1) + * 1 bit additional_data_flag (0) + * 5-bits cc_count + */ + gst_byte_writer_put_uint8 (&br, ((cc_meta->size / 3) & 0x1f) | 0x40); + + /* 8 bits em_data, unused */ + gst_byte_writer_put_uint8 (&br, 255); + + gst_byte_writer_put_data (&br, cc_meta->data, cc_meta->size); + + /* 8 marker bits */ + gst_byte_writer_put_uint8 (&br, 255); + + p = g_new0 (mfxPayload, 1); + p->BufSize = gst_byte_writer_get_pos (&br); + p->NumBit = p->BufSize * 8; + p->Type = 4; + p->Data = gst_byte_writer_reset_and_get_data (&br); + + g_ptr_array_add (payload, p); + + return TRUE; +} + +static gboolean +gst_qsv_h265_enc_attach_payload (GstQsvEncoder * encoder, + GstVideoCodecFrame * frame, GPtrArray * payload) +{ + GstQsvH265Enc *self = GST_QSV_H265_ENC (encoder); + + if (self->cc_insert == GST_QSV_H265_ENC_SEI_DISABLED) + return TRUE; + + gst_buffer_foreach_meta (frame->input_buffer, + (GstBufferForeachMetaFunc) gst_qsv_h265_enc_foreach_caption_meta, + payload); + + return TRUE; +} + +static GstBuffer * +gst_qsv_h265_enc_create_output_buffer (GstQsvEncoder * encoder, + mfxBitstream * bitstream) +{ + GstBuffer *buf; + + buf = gst_buffer_new_memdup (bitstream->Data + bitstream->DataOffset, + bitstream->DataLength); + + /* This buffer must be the end of a frame boundary */ + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_MARKER); + + return buf; +} + +static GstQsvEncoderReconfigure +gst_qsv_h265_enc_check_reconfigure (GstQsvEncoder * encoder, mfxSession session, + mfxVideoParam * param, GPtrArray * extra_params) +{ + GstQsvH265Enc *self = GST_QSV_H265_ENC (encoder); + GstQsvEncoderReconfigure ret = GST_QSV_ENCODER_RECONFIGURE_NONE; + + g_mutex_lock (&self->prop_lock); + if (self->property_updated) { + ret = GST_QSV_ENCODER_RECONFIGURE_FULL; + goto done; + } + + if (self->bitrate_updated) { + mfxStatus status; + mfxExtEncoderResetOption reset_opt; + reset_opt.Header.BufferId = MFX_EXTBUFF_ENCODER_RESET_OPTION; + reset_opt.Header.BufferSz = sizeof (mfxExtEncoderResetOption); + reset_opt.StartNewSequence = MFX_CODINGOPTION_UNKNOWN; + + gst_qsv_h265_enc_set_bitrate (self, param); + + g_ptr_array_add (extra_params, &reset_opt); + param->ExtParam = (mfxExtBuffer **) extra_params->pdata; + param->NumExtParam = extra_params->len; + + status = MFXVideoENCODE_Query (session, param, param); + g_ptr_array_remove_index (extra_params, extra_params->len - 1); + param->NumExtParam = extra_params->len; + + if (status != MFX_ERR_NONE) { + GST_WARNING_OBJECT (self, "MFXVideoENCODE_Query returned %d (%s)", + QSV_STATUS_ARGS (status)); + ret = GST_QSV_ENCODER_RECONFIGURE_FULL; + } else { + if (reset_opt.StartNewSequence == MFX_CODINGOPTION_OFF) { + GST_DEBUG_OBJECT (self, "Can update without new sequence"); + ret = GST_QSV_ENCODER_RECONFIGURE_BITRATE; + } else { + GST_DEBUG_OBJECT (self, "Need new sequence"); + ret = GST_QSV_ENCODER_RECONFIGURE_FULL; + } + } + } + +done: + self->property_updated = FALSE; + self->bitrate_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return ret; +} + +void +gst_qsv_h265_enc_register (GstPlugin * plugin, guint rank, guint impl_index, + GstObject * device, mfxSession session) +{ + mfxVideoParam param; + mfxInfoMFX *mfx; + std::vector < mfxU16 > supported_profiles; + std::vector < std::string > supported_formats; + GstQsvResolution max_resolution; + mfxExtContentLightLevelInfo cll; + mfxExtMasteringDisplayColourVolume mdcv; + mfxExtBuffer *ext_buffers2; + gboolean hdr10_aware = FALSE; + + GST_DEBUG_CATEGORY_INIT (gst_qsv_h265_enc_debug, + "qsvh265enc", 0, "qsvh265enc"); + + memset (¶m, 0, sizeof (mfxVideoParam)); + memset (&max_resolution, 0, sizeof (GstQsvResolution)); + memset (&cll, 0, sizeof (mfxExtContentLightLevelInfo)); + memset (&mdcv, 0, sizeof (mfxExtMasteringDisplayColourVolume)); + + param.AsyncDepth = 4; + param.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; + + mfx = ¶m.mfx; + mfx->CodecId = MFX_CODEC_HEVC; + + mfx->FrameInfo.Width = GST_ROUND_UP_16 (320); + mfx->FrameInfo.Height = GST_ROUND_UP_16 (240); + mfx->FrameInfo.CropW = 320; + mfx->FrameInfo.CropH = 240; + mfx->FrameInfo.FrameRateExtN = 30; + mfx->FrameInfo.FrameRateExtD = 1; + mfx->FrameInfo.AspectRatioW = 1; + mfx->FrameInfo.AspectRatioH = 1; + mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + + /* Check supported profiles */ + for (guint i = 0; i < G_N_ELEMENTS (profile_map); i++) { + mfx->CodecProfile = profile_mapi.profile; + mfx->CodecLevel = MFX_LEVEL_UNKNOWN; + + switch (mfx->CodecProfile) { + case MFX_PROFILE_HEVC_MAIN: + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; + mfx->FrameInfo.BitDepthLuma = 8; + mfx->FrameInfo.BitDepthChroma = 8; + mfx->FrameInfo.Shift = 0; + break; + case MFX_PROFILE_HEVC_MAIN10: + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_P010; + mfx->FrameInfo.BitDepthLuma = 10; + mfx->FrameInfo.BitDepthChroma = 10; + mfx->FrameInfo.Shift = 1; + break; + default: + g_assert_not_reached (); + return; + } + + if (MFXVideoENCODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) + continue; + + supported_profiles.push_back (profile_mapi.profile); + supported_formats.push_back (profile_mapi.raw_format); + } + + if (supported_profiles.empty ()) { + GST_INFO ("Device doesn't support H.265 encoding"); + return; + } + + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; + mfx->FrameInfo.BitDepthLuma = 8; + mfx->FrameInfo.BitDepthChroma = 8; + mfx->FrameInfo.Shift = 0; + mfx->CodecProfile = MFX_PROFILE_HEVC_MAIN; + + /* check hdr10 metadata SEI support */ + cll.Header.BufferId = MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO; + cll.Header.BufferSz = sizeof (mfxExtContentLightLevelInfo); + cll.InsertPayloadToggle = MFX_PAYLOAD_IDR; + cll.MaxContentLightLevel = 1; + cll.MaxPicAverageLightLevel = 1; + + mdcv.Header.BufferId = MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME; + mdcv.Header.BufferSz = sizeof (mfxExtMasteringDisplayColourVolume); + mdcv.InsertPayloadToggle = MFX_PAYLOAD_IDR; + mdcv.MaxDisplayMasteringLuminance = 1; + mdcv.MinDisplayMasteringLuminance = 1; + + ext_buffers0 = (mfxExtBuffer *) & cll; + ext_buffers1 = (mfxExtBuffer *) & mdcv; + + param.NumExtParam = 2; + param.ExtParam = ext_buffers; + if (MFXVideoENCODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) { + GST_INFO ("HDR10 metadata SEI is supported"); + hdr10_aware = TRUE; + } + + param.NumExtParam = 0; + param.ExtParam = nullptr; + + /* Check max-resolution */ + for (guint i = 0; i < G_N_ELEMENTS (gst_qsv_resolutions); i++) { + mfx->FrameInfo.Width = GST_ROUND_UP_16 (gst_qsv_resolutionsi.width); + mfx->FrameInfo.Height = GST_ROUND_UP_16 (gst_qsv_resolutionsi.height); + mfx->FrameInfo.CropW = gst_qsv_resolutionsi.width; + mfx->FrameInfo.CropH = gst_qsv_resolutionsi.height; + + if (MFXVideoENCODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) + break; + + max_resolution.width = gst_qsv_resolutionsi.width; + max_resolution.height = gst_qsv_resolutionsi.height; + } + + GST_INFO ("Maximum supported resolution: %dx%d", + max_resolution.width, max_resolution.height); + + /* TODO: check supported rate-control methods and expose only supported + * methods, since the device might not be able to support some of them */ + + /* To cover both landscape and portrait, + * select max value (width in this case) */ + guint resolution = MAX (max_resolution.width, max_resolution.height); + std::string sink_caps_str = "video/x-raw"; + + sink_caps_str += ", width=(int) 16, " + std::to_string (resolution) + " "; + sink_caps_str += ", height=(int) 16, " + std::to_string (resolution) + " "; + + /* *INDENT-OFF* */ + if (supported_formats.size () > 1) { + sink_caps_str += ", format=(string) { "; + bool first = true; + for (const auto &iter: supported_formats) { + if (!first) { + sink_caps_str += ", "; + } + + sink_caps_str += iter; + first = false; + } + sink_caps_str += " }"; + } else { + sink_caps_str += ", format=(string) " + supported_formats0; + } + /* *INDENT-ON* */ + + GstCaps *sink_caps = gst_caps_from_string (sink_caps_str.c_str ()); + + /* TODO: Add support for VA */ +#ifdef G_OS_WIN32 + GstCaps *d3d11_caps = gst_caps_copy (sink_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr); + gst_caps_set_features_simple (d3d11_caps, caps_features); + gst_caps_append (d3d11_caps, sink_caps); + sink_caps = d3d11_caps; +#else + GstCaps *va_caps = gst_caps_copy (sink_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_VA, nullptr); + gst_caps_set_features_simple (va_caps, caps_features); + gst_caps_append (va_caps, sink_caps); + sink_caps = va_caps; +#endif + + std::string src_caps_str = "video/x-h265"; + src_caps_str += ", width=(int) 16, " + std::to_string (resolution) + " "; + src_caps_str += ", height=(int) 16, " + std::to_string (resolution) + " "; + + src_caps_str += ", stream-format= (string) byte-stream"; + src_caps_str += ", alignment=(string) au"; + /* *INDENT-OFF* */ + if (supported_profiles.size () > 1) { + src_caps_str += ", profile=(string) { "; + bool first = true; + for (const auto &iter: supported_profiles) { + if (!first) { + src_caps_str += ", "; + } + + src_caps_str += gst_qsv_h265_profile_to_string (iter); + first = false; + } + src_caps_str += " }"; + } else { + src_caps_str += ", profile=(string) "; + src_caps_str += gst_qsv_h265_profile_to_string (supported_profiles0); + } + /* *INDENT-ON* */ + + GstCaps *src_caps = gst_caps_from_string (src_caps_str.c_str ()); + + GST_MINI_OBJECT_FLAG_SET (sink_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (src_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GstQsvH265EncClassData *cdata = g_new0 (GstQsvH265EncClassData, 1); + cdata->sink_caps = sink_caps; + cdata->src_caps = src_caps; + cdata->impl_index = impl_index; + cdata->hdr10_aware = hdr10_aware; + +#ifdef G_OS_WIN32 + g_object_get (device, "adapter-luid", &cdata->adapter_luid, + "description", &cdata->description, nullptr); +#else + g_object_get (device, "path", &cdata->display_path, nullptr); +#endif + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstQsvH265EncClass), + nullptr, + nullptr, + (GClassInitFunc) gst_qsv_h265_enc_class_init, + nullptr, + cdata, + sizeof (GstQsvH265Enc), + 0, + (GInstanceInitFunc) gst_qsv_h265_enc_init, + }; + + type_name = g_strdup ("GstQsvH265Enc"); + feature_name = g_strdup ("qsvh265enc"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstQsvH265Device%dEnc", index); + feature_name = g_strdup_printf ("qsvh265device%denc", index); + } + + type = g_type_register_static (GST_TYPE_QSV_ENCODER, type_name, &type_info, + (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvh265enc.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include "gstqsvencoder.h" + +G_BEGIN_DECLS + +void gst_qsv_h265_enc_register (GstPlugin * plugin, + guint rank, + guint impl_index, + GstObject * device, + mfxSession session); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvjpegdec.cpp
Added
@@ -0,0 +1,303 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-qsvjpegdec + * @title: qsvjpegdec + * + * Intel Quick Sync JPEG decoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 filesrc location=/path/to/jpeg/file ! parsebin ! qsvjpegdec ! videoconvert ! autovideosink + * ``` + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvjpegdec.h" +#include <string> +#include <string.h> +#include <vector> + +#ifdef G_OS_WIN32 +#include <gst/d3d11/gstd3d11.h> +#else +#include <gst/va/gstva.h> +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_qsv_jpeg_dec_debug); +#define GST_CAT_DEFAULT gst_qsv_jpeg_dec_debug + +#define DOC_SINK_CAPS \ + "image/jpeg, width = (int) 1, 16384 , height = (int) 1, 16384 " + +#define DOC_SRC_CAPS_COMM \ + "format = (string) { NV12, YUY2, BGRA }, " \ + "width = (int) 1, 16384 , height = (int) 1, 16384 " + +#define DOC_SRC_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SRC_CAPS_COMM "; " \ + "video/x-raw, " DOC_SRC_CAPS_COMM + +typedef struct _GstQsvJpegDec +{ + GstQsvDecoder parent; +} GstQsvJpegDec; + +typedef struct _GstQsvJpegDecClass +{ + GstQsvDecoderClass parent_class; +} GstQsvJpegDecClass; + +static GTypeClass *parent_class = nullptr; + +#define GST_QSV_JPEG_DEC(object) ((GstQsvJpegDec *) (object)) +#define GST_QSV_JPEG_DEC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstQsvJpegDecClass)) + +static void +gst_qsv_jpeg_dec_class_init (GstQsvJpegDecClass * klass, gpointer data) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstQsvDecoderClass *qsvdec_class = GST_QSV_DECODER_CLASS (klass); + GstQsvDecoderClassData *cdata = (GstQsvDecoderClassData *) data; + GstPadTemplate *pad_templ; + GstCaps *doc_caps; + + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + +#ifdef G_OS_WIN32 + std::string long_name = "Intel Quick Sync Video " + + std::string (cdata->description) + " JPEG Decoder"; + + gst_element_class_set_metadata (element_class, long_name.c_str (), + "Codec/Decoder/Video/Hardware", + "Intel Quick Sync Video JPEG Decoder", + "Seungha Yang <seungha@centricular.com>"); +#else + gst_element_class_set_static_metadata (element_class, + "Intel Quick Sync Video JPEG Decoder", + "Codec/Decoder/Video/Hardware", + "Intel Quick Sync Video JPEG Decoder", + "Seungha Yang <seungha@centricular.com>"); +#endif + + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + qsvdec_class->codec_id = MFX_CODEC_JPEG; + qsvdec_class->impl_index = cdata->impl_index; + qsvdec_class->adapter_luid = cdata->adapter_luid; + qsvdec_class->display_path = cdata->display_path; + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); +} + +static void +gst_qsv_jpeg_dec_init (GstQsvJpegDec * self) +{ +} + +void +gst_qsv_jpeg_dec_register (GstPlugin * plugin, guint rank, guint impl_index, + GstObject * device, mfxSession session) +{ + mfxVideoParam param; + mfxInfoMFX *mfx; + GstQsvResolution max_resolution; + std::vector < std::string > supported_formats; + + GST_DEBUG_CATEGORY_INIT (gst_qsv_jpeg_dec_debug, "qsvjpegdec", 0, + "qsvjpegdec"); + + memset (¶m, 0, sizeof (mfxVideoParam)); + memset (&max_resolution, 0, sizeof (GstQsvResolution)); + + param.AsyncDepth = 4; + param.IOPattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; + + mfx = ¶m.mfx; + mfx->CodecId = MFX_CODEC_JPEG; + + mfx->FrameInfo.FrameRateExtN = 30; + mfx->FrameInfo.FrameRateExtD = 1; + mfx->FrameInfo.AspectRatioW = 1; + mfx->FrameInfo.AspectRatioH = 1; + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; + mfx->FrameInfo.BitDepthLuma = 8; + mfx->FrameInfo.BitDepthChroma = 8; + mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + mfx->CodecProfile = MFX_PROFILE_JPEG_BASELINE; + mfx->JPEGChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->JPEGColorFormat = MFX_JPEG_COLORFORMAT_YCbCr; + + /* Check max-resolution */ + for (guint i = 0; i < G_N_ELEMENTS (gst_qsv_resolutions); i++) { + mfx->FrameInfo.Width = GST_ROUND_UP_16 (gst_qsv_resolutionsi.width); + mfx->FrameInfo.Height = GST_ROUND_UP_16 (gst_qsv_resolutionsi.height); + mfx->FrameInfo.CropW = gst_qsv_resolutionsi.width; + mfx->FrameInfo.CropH = gst_qsv_resolutionsi.height; + + if (MFXVideoDECODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) + break; + + max_resolution.width = gst_qsv_resolutionsi.width; + max_resolution.height = gst_qsv_resolutionsi.height; + } + + if (max_resolution.width == 0 || max_resolution.height == 0) + return; + + GST_INFO ("Maximum supported resolution: %dx%d", + max_resolution.width, max_resolution.height); + + supported_formats.push_back ("NV12"); + + mfx->FrameInfo.FourCC = MFX_FOURCC_YUY2; + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV422; + mfx->JPEGChromaFormat = MFX_CHROMAFORMAT_YUV422; + if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) + supported_formats.push_back ("YUY2"); + + mfx->FrameInfo.FourCC = MFX_FOURCC_RGB4; + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV444; + mfx->JPEGChromaFormat = MFX_CHROMAFORMAT_YUV444; + mfx->JPEGColorFormat = MFX_JPEG_COLORFORMAT_RGB; + if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) + supported_formats.push_back ("BGRA"); + + /* To cover both landscape and portrait, + * select max value (width in this case) */ + guint resolution = MAX (max_resolution.width, max_resolution.height); + std::string src_caps_str = "video/x-raw"; + + src_caps_str += ", width=(int) 1, " + std::to_string (resolution) + " "; + src_caps_str += ", height=(int) 1, " + std::to_string (resolution) + " "; + + /* *INDENT-OFF* */ + if (supported_formats.size () > 1) { + src_caps_str += ", format=(string) { "; + bool first = true; + for (const auto &iter: supported_formats) { + if (!first) { + src_caps_str += ", "; + } + + src_caps_str += iter; + first = false; + } + src_caps_str += " }"; + } else { + src_caps_str += ", format=(string) " + supported_formats0; + } + /* *INDENT-ON* */ + + GstCaps *src_caps = gst_caps_from_string (src_caps_str.c_str ()); + + /* TODO: Add support for VA */ +#ifdef G_OS_WIN32 + GstCaps *d3d11_caps = gst_caps_copy (src_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr); + gst_caps_set_features_simple (d3d11_caps, caps_features); + gst_caps_append (d3d11_caps, src_caps); + src_caps = d3d11_caps; +#endif + std::string sink_caps_str = "image/jpeg"; + sink_caps_str += ", width=(int) 1, " + std::to_string (resolution) + " "; + sink_caps_str += ", height=(int) 1, " + std::to_string (resolution) + " "; + + GstCaps *sink_caps = gst_caps_from_string (sink_caps_str.c_str ()); + + GST_MINI_OBJECT_FLAG_SET (sink_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (src_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GstQsvDecoderClassData *cdata = g_new0 (GstQsvDecoderClassData, 1); + cdata->sink_caps = sink_caps; + cdata->src_caps = src_caps; + cdata->impl_index = impl_index; + +#ifdef G_OS_WIN32 + g_object_get (device, "adapter-luid", &cdata->adapter_luid, + "description", &cdata->description, nullptr); +#else + g_object_get (device, "path", &cdata->display_path, nullptr); +#endif + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstQsvJpegDecClass), + nullptr, + nullptr, + (GClassInitFunc) gst_qsv_jpeg_dec_class_init, + nullptr, + cdata, + sizeof (GstQsvJpegDec), + 0, + (GInstanceInitFunc) gst_qsv_jpeg_dec_init, + }; + + type_name = g_strdup ("GstQsvJpegDec"); + feature_name = g_strdup ("qsvjpegdec"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstQsvJPEGDevice%dDec", index); + feature_name = g_strdup_printf ("qsvjpegdevice%ddec", index); + } + + type = g_type_register_static (GST_TYPE_QSV_DECODER, type_name, &type_info, + (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvjpegdec.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include "gstqsvdecoder.h" + +G_BEGIN_DECLS + +void gst_qsv_jpeg_dec_register (GstPlugin * plugin, + guint rank, + guint impl_index, + GstObject * device, + mfxSession session); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvjpegenc.cpp
Added
@@ -0,0 +1,559 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-qsvjpegenc + * @title: qsvvp9enc + * + * Intel Quick Sync JPEG encoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc ! qsvjpegenc ! qtmux ! filesink location=out.mp4 + * ``` + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvjpegenc.h" +#include <vector> +#include <string> +#include <set> +#include <string.h> + +#ifdef G_OS_WIN32 +#include <gst/d3d11/gstd3d11.h> +#else +#include <gst/va/gstva.h> +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_qsv_jpeg_enc_debug); +#define GST_CAT_DEFAULT gst_qsv_jpeg_enc_debug + +enum +{ + PROP_0, + PROP_QUALITY, +}; + +#define DEFAULT_JPEG_QUALITY 85 + +#define DOC_SINK_CAPS_COMM \ + "format = (string) { NV12, YUY2, BGRA }, " \ + "width = (int) 16, 16384 , height = (int) 16, 16384 " + +#define DOC_SINK_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw(memory:VAMemory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw, " DOC_SINK_CAPS_COMM + +#define DOC_SRC_CAPS \ + "image/jpeg, width = (int) 16, 16384 , height = (int) 16, 16384 " + +typedef struct _GstQsvJpegEncClassData +{ + GstCaps *sink_caps; + GstCaps *src_caps; + guint impl_index; + gint64 adapter_luid; + gchar *display_path; + gchar *description; + gboolean interlaved; +} GstQsvJpegEncClassData; + +typedef struct _GstQsvJpegEnc +{ + GstQsvEncoder parent; + + GMutex prop_lock; + /* protected by prop_lock */ + gboolean property_updated; + + /* properties */ + guint quality; +} GstQsvJpegEnc; + +typedef struct _GstQsvJpegEncClass +{ + GstQsvEncoderClass parent_class; + gboolean interlaved; +} GstQsvJpegEncClass; + +static GstElementClass *parent_class = nullptr; + +#define GST_QSV_JPEG_ENC(object) ((GstQsvJpegEnc *) (object)) +#define GST_QSV_JPEG_ENC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstQsvJpegEncClass)) + +static void gst_qsv_jpeg_enc_finalize (GObject * object); +static void gst_qsv_jpeg_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_qsv_jpeg_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_qsv_jpeg_enc_set_format (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxVideoParam * param, + GPtrArray * extra_params); +static gboolean gst_qsv_jpeg_enc_set_output_state (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxSession session); +static GstQsvEncoderReconfigure +gst_qsv_jpeg_enc_check_reconfigure (GstQsvEncoder * encoder, mfxSession session, + mfxVideoParam * param, GPtrArray * extra_params); + +static void +gst_qsv_jpeg_enc_class_init (GstQsvJpegEncClass * klass, gpointer data) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstQsvEncoderClass *qsvenc_class = GST_QSV_ENCODER_CLASS (klass); + GstQsvJpegEncClassData *cdata = (GstQsvJpegEncClassData *) data; + GstPadTemplate *pad_templ; + GstCaps *doc_caps; + + qsvenc_class->codec_id = MFX_CODEC_JPEG; + qsvenc_class->impl_index = cdata->impl_index; + qsvenc_class->adapter_luid = cdata->adapter_luid; + qsvenc_class->display_path = cdata->display_path; + + object_class->finalize = gst_qsv_jpeg_enc_finalize; + object_class->set_property = gst_qsv_jpeg_enc_set_property; + object_class->get_property = gst_qsv_jpeg_enc_get_property; + + g_object_class_install_property (object_class, PROP_QUALITY, + g_param_spec_uint ("quality", "Quality", + "Encoding quality, 100 for best quality", + 1, 100, DEFAULT_JPEG_QUALITY, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + parent_class = (GstElementClass *) g_type_class_peek_parent (klass); + +#ifdef G_OS_WIN32 + std::string long_name = "Intel Quick Sync Video " + + std::string (cdata->description) + " JPEG Encoder"; + + gst_element_class_set_metadata (element_class, long_name.c_str (), + "Codec/Encoder/Video/Hardware", + "Intel Quick Sync Video JPEG Encoder", + "Seungha Yang <seungha@centricular.com>"); +#else + gst_element_class_set_static_metadata (element_class, + "Intel Quick Sync Video JPEG Encoder", + "Codec/Encoder/Video/Hardware", + "Intel Quick Sync Video JPEG Encoder", + "Seungha Yang <seungha@centricular.com>"); +#endif + + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + qsvenc_class->set_format = GST_DEBUG_FUNCPTR (gst_qsv_jpeg_enc_set_format); + qsvenc_class->set_output_state = + GST_DEBUG_FUNCPTR (gst_qsv_jpeg_enc_set_output_state); + qsvenc_class->check_reconfigure = + GST_DEBUG_FUNCPTR (gst_qsv_jpeg_enc_check_reconfigure); + + klass->interlaved = cdata->interlaved; + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata->description); + g_free (cdata); +} + +static void +gst_qsv_jpeg_enc_init (GstQsvJpegEnc * self) +{ + self->quality = DEFAULT_JPEG_QUALITY; + + g_mutex_init (&self->prop_lock); +} + +static void +gst_qsv_jpeg_enc_finalize (GObject * object) +{ + GstQsvJpegEnc *self = GST_QSV_JPEG_ENC (object); + + g_mutex_clear (&self->prop_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_qsv_jpeg_enc_check_update_uint (GstQsvJpegEnc * self, guint * old_val, + guint new_val) +{ + if (*old_val == new_val) + return; + + g_mutex_lock (&self->prop_lock); + *old_val = new_val; + self->property_updated = TRUE; + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_qsv_jpeg_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstQsvJpegEnc *self = GST_QSV_JPEG_ENC (object); + + switch (prop_id) { + case PROP_QUALITY: + gst_qsv_jpeg_enc_check_update_uint (self, &self->quality, + g_value_get_uint (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_qsv_jpeg_enc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstQsvJpegEnc *self = GST_QSV_JPEG_ENC (object); + + switch (prop_id) { + case PROP_QUALITY: + g_value_set_uint (value, self->quality); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_qsv_jpeg_enc_set_format (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxVideoParam * param, GPtrArray * extra_params) +{ + GstQsvJpegEnc *self = GST_QSV_JPEG_ENC (encoder); + GstQsvJpegEncClass *klass = GST_QSV_JPEG_ENC_GET_CLASS (self); + GstVideoInfo *info = &state->info; + mfxFrameInfo *frame_info; + + frame_info = ¶m->mfx.FrameInfo; + + frame_info->Width = frame_info->CropW = info->width; + frame_info->Height = frame_info->CropH = info->height; + + frame_info->PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + + if (GST_VIDEO_INFO_FPS_N (info) > 0 && GST_VIDEO_INFO_FPS_D (info) > 0) { + frame_info->FrameRateExtN = GST_VIDEO_INFO_FPS_N (info); + frame_info->FrameRateExtD = GST_VIDEO_INFO_FPS_D (info); + } else { + /* HACK: Same as x264enc */ + frame_info->FrameRateExtN = 25; + frame_info->FrameRateExtD = 1; + } + + frame_info->AspectRatioW = GST_VIDEO_INFO_PAR_N (info); + frame_info->AspectRatioH = GST_VIDEO_INFO_PAR_D (info); + + switch (GST_VIDEO_INFO_FORMAT (info)) { + case GST_VIDEO_FORMAT_NV12: + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; + frame_info->FourCC = MFX_FOURCC_NV12; + frame_info->BitDepthLuma = 8; + frame_info->BitDepthChroma = 8; + break; + case GST_VIDEO_FORMAT_YUY2: + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV422; + frame_info->FourCC = MFX_FOURCC_YUY2; + frame_info->BitDepthLuma = 8; + frame_info->BitDepthChroma = 8; + break; + case GST_VIDEO_FORMAT_BGRA: + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV444; + frame_info->FourCC = MFX_FOURCC_RGB4; + break; + default: + GST_ERROR_OBJECT (self, "Unexpected format %s", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info))); + return FALSE; + } + + g_mutex_lock (&self->prop_lock); + param->mfx.CodecId = MFX_CODEC_JPEG; + param->mfx.CodecProfile = MFX_PROFILE_JPEG_BASELINE; + param->mfx.Quality = self->quality; + if (klass->interlaved) + param->mfx.Interleaved = 1; + else + param->mfx.Interleaved = 0; + param->mfx.RestartInterval = 0; + param->ExtParam = (mfxExtBuffer **) extra_params->pdata; + param->NumExtParam = extra_params->len; + + self->property_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return TRUE; +} + +static gboolean +gst_qsv_jpeg_enc_set_output_state (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxSession session) +{ + GstCaps *caps; + GstTagList *tags; + GstVideoCodecState *out_state; + + caps = gst_caps_from_string ("image/jpeg"); + out_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (encoder), + caps, state); + gst_video_codec_state_unref (out_state); + + tags = gst_tag_list_new_empty (); + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, "qsvjpegenc", + nullptr); + + gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (encoder), + tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (tags); + + return TRUE; +} + +static GstQsvEncoderReconfigure +gst_qsv_jpeg_enc_check_reconfigure (GstQsvEncoder * encoder, mfxSession session, + mfxVideoParam * param, GPtrArray * extra_params) +{ + GstQsvJpegEnc *self = GST_QSV_JPEG_ENC (encoder); + GstQsvEncoderReconfigure ret = GST_QSV_ENCODER_RECONFIGURE_NONE; + + g_mutex_lock (&self->prop_lock); + if (self->property_updated) + ret = GST_QSV_ENCODER_RECONFIGURE_FULL; + + self->property_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return ret; +} + +void +gst_qsv_jpeg_enc_register (GstPlugin * plugin, guint rank, guint impl_index, + GstObject * device, mfxSession session) +{ + mfxVideoParam param; + mfxInfoMFX *mfx; + std::vector < std::string > supported_formats; + GstQsvResolution max_resolution; + mfxStatus status; + gboolean interlaved = TRUE; + + GST_DEBUG_CATEGORY_INIT (gst_qsv_jpeg_enc_debug, + "qsvjpegenc", 0, "qsvjpegenc"); + + memset (¶m, 0, sizeof (mfxVideoParam)); + memset (&max_resolution, 0, sizeof (GstQsvResolution)); + + param.AsyncDepth = 4; + param.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; + + mfx = ¶m.mfx; + mfx->LowPower = MFX_CODINGOPTION_UNKNOWN; + mfx->CodecId = MFX_CODEC_JPEG; + mfx->CodecProfile = MFX_PROFILE_JPEG_BASELINE; + mfx->Quality = DEFAULT_JPEG_QUALITY; + mfx->Interleaved = 1; + mfx->RestartInterval = 0; + + mfx->FrameInfo.Width = mfx->FrameInfo.CropW = GST_ROUND_UP_16 (320); + mfx->FrameInfo.Height = mfx->FrameInfo.CropH = GST_ROUND_UP_16 (240); + + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; + mfx->FrameInfo.FrameRateExtN = 30; + mfx->FrameInfo.FrameRateExtD = 1; + mfx->FrameInfo.AspectRatioW = 1; + mfx->FrameInfo.AspectRatioH = 1; + mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + + status = MFXVideoENCODE_Query (session, ¶m, ¶m); + if (status == MFX_WRN_PARTIAL_ACCELERATION) { + mfx->Interleaved = 0; + interlaved = FALSE; + + status = MFXVideoENCODE_Query (session, ¶m, ¶m); + } + + if (status != MFX_ERR_NONE) + return; + + supported_formats.push_back ("NV12"); + + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV422; + mfx->FrameInfo.FourCC = MFX_FOURCC_YUY2; + status = MFXVideoENCODE_Query (session, ¶m, ¶m); + if (status == MFX_ERR_NONE) + supported_formats.push_back ("YUY2"); + + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV444; + mfx->FrameInfo.FourCC = MFX_FOURCC_RGB4; + status = MFXVideoENCODE_Query (session, ¶m, ¶m); + + if (status == MFX_ERR_NONE) + supported_formats.push_back ("BGRA"); + + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; + + /* Check max-resolution */ + for (guint i = 0; i < G_N_ELEMENTS (gst_qsv_resolutions); i++) { + mfx->FrameInfo.Width = mfx->FrameInfo.CropW = gst_qsv_resolutionsi.width; + mfx->FrameInfo.Height = mfx->FrameInfo.CropH = + gst_qsv_resolutionsi.height; + + if (MFXVideoENCODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) + break; + + max_resolution.width = gst_qsv_resolutionsi.width; + max_resolution.height = gst_qsv_resolutionsi.height; + } + + GST_INFO ("Maximum supported resolution: %dx%d", + max_resolution.width, max_resolution.height); + + /* To cover both landscape and portrait, + * select max value (width in this case) */ + guint resolution = MAX (max_resolution.width, max_resolution.height); + std::string sink_caps_str = "video/x-raw"; + + sink_caps_str += ", width=(int) 16, " + std::to_string (resolution) + " "; + sink_caps_str += ", height=(int) 16, " + std::to_string (resolution) + " "; + + /* *INDENT-OFF* */ + if (supported_formats.size () > 1) { + sink_caps_str += ", format=(string) { "; + bool first = true; + for (const auto &iter: supported_formats) { + if (!first) { + sink_caps_str += ", "; + } + + sink_caps_str += iter; + first = false; + } + sink_caps_str += " }"; + } else { + sink_caps_str += ", format=(string) " + supported_formats0; + } + /* *INDENT-ON* */ + + GstCaps *sink_caps = gst_caps_from_string (sink_caps_str.c_str ()); + +#ifdef G_OS_WIN32 + GstCaps *d3d11_caps = gst_caps_copy (sink_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr); + gst_caps_set_features_simple (d3d11_caps, caps_features); + gst_caps_append (d3d11_caps, sink_caps); + sink_caps = d3d11_caps; +#else + GstCaps *va_caps = gst_caps_copy (sink_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_VA, nullptr); + gst_caps_set_features_simple (va_caps, caps_features); + gst_caps_append (va_caps, sink_caps); + sink_caps = va_caps; +#endif + + std::string src_caps_str = "image/jpeg"; + src_caps_str += ", width=(int) 16, " + std::to_string (resolution) + " "; + src_caps_str += ", height=(int) 16, " + std::to_string (resolution) + " "; + + GstCaps *src_caps = gst_caps_from_string (src_caps_str.c_str ()); + + GST_MINI_OBJECT_FLAG_SET (sink_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (src_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GstQsvJpegEncClassData *cdata = g_new0 (GstQsvJpegEncClassData, 1); + cdata->sink_caps = sink_caps; + cdata->src_caps = src_caps; + cdata->impl_index = impl_index; + cdata->interlaved = interlaved; + +#ifdef G_OS_WIN32 + g_object_get (device, "adapter-luid", &cdata->adapter_luid, + "description", &cdata->description, nullptr); +#else + g_object_get (device, "path", &cdata->display_path, nullptr); +#endif + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstQsvJpegEncClass), + nullptr, + nullptr, + (GClassInitFunc) gst_qsv_jpeg_enc_class_init, + nullptr, + cdata, + sizeof (GstQsvJpegEnc), + 0, + (GInstanceInitFunc) gst_qsv_jpeg_enc_init, + }; + + type_name = g_strdup ("GstQsvJpegEnc"); + feature_name = g_strdup ("qsvjpegenc"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstQsvJpegDevice%dEnc", index); + feature_name = g_strdup_printf ("qsvjpegdevice%denc", index); + } + + type = g_type_register_static (GST_TYPE_QSV_ENCODER, type_name, &type_info, + (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvjpegenc.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include "gstqsvencoder.h" + +G_BEGIN_DECLS + +void gst_qsv_jpeg_enc_register (GstPlugin * plugin, + guint rank, + guint impl_index, + GstObject * device, + mfxSession session); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvutils.cpp
Added
@@ -0,0 +1,203 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvutils.h" + +#ifdef G_OS_WIN32 +#include <gst/d3d11/gstd3d11.h> +#include <wrl.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ +#else +#include <gst/va/gstva.h> +#endif + +static mfxLoader _loader = nullptr; + +mfxLoader +gst_qsv_get_loader (void) +{ + static gsize load_once = 0; + + if (g_once_init_enter (&load_once)) { + _loader = MFXLoad (); + g_once_init_leave (&load_once, 1); + } + + return _loader; +} + +void +gst_qsv_deinit (void) +{ + g_clear_pointer (&_loader, MFXUnload); +} + +#ifdef G_OS_WIN32 +static GList * +gst_qsv_get_d3d11_devices (void) +{ + GList *rst = nullptr; + HRESULT hr; + ComPtr < IDXGIFactory1 > factory; + + hr = CreateDXGIFactory1 (IID_PPV_ARGS (&factory)); + if (FAILED (hr)) + return nullptr; + + for (guint idx = 0;; idx++) { + ComPtr < IDXGIAdapter1 > adapter; + DXGI_ADAPTER_DESC desc; + gint64 luid; + GstD3D11Device *device; + ComPtr < ID3D10Multithread > multi_thread; + ID3D11Device *device_handle; + + hr = factory->EnumAdapters1 (idx, &adapter); + if (FAILED (hr)) + return rst; + + hr = adapter->GetDesc (&desc); + if (FAILED (hr)) + continue; + + if (desc.VendorId != 0x8086) + continue; + + luid = gst_d3d11_luid_to_int64 (&desc.AdapterLuid); + device = gst_d3d11_device_new_for_adapter_luid (luid, + D3D11_CREATE_DEVICE_BGRA_SUPPORT); + + if (!device) + continue; + + device_handle = gst_d3d11_device_get_device_handle (device); + hr = device_handle->QueryInterface (IID_PPV_ARGS (&multi_thread)); + if (FAILED (hr)) { + gst_object_unref (device); + continue; + } + + /* Should enable mutithread protection layer, otherwise QSV will return + * error code when this handle is passed to QSV via + * MFXVideoCORE_SetHandle() */ + multi_thread->SetMultithreadProtected (TRUE); + + rst = g_list_append (rst, device); + } + + return rst; +} +#else /* G_OS_WIN32 */ +static GList * +gst_qsv_get_va_displays (void) +{ + gchar path64; + GList *rst = nullptr; + + for (guint i = 0; i < 8; i++) { + GstVaDisplay *display; + GstVaImplementation impl; + + g_snprintf (path, sizeof (path), "/dev/dri/renderD%d", 128 + i); + if (!g_file_test (path, G_FILE_TEST_EXISTS)) + continue; + + display = gst_va_display_drm_new_from_path (path); + if (!display) + continue; + + impl = gst_va_display_get_implementation (display); + if (impl != GST_VA_IMPLEMENTATION_INTEL_I965 && + impl != GST_VA_IMPLEMENTATION_INTEL_IHD) { + gst_object_unref (display); + continue; + } + + rst = g_list_append (rst, display); + } + + return rst; +} +#endif + +GList * +gst_qsv_get_platform_devices (void) +{ +#ifdef G_OS_WIN32 + return gst_qsv_get_d3d11_devices (); +#else + return gst_qsv_get_va_displays (); +#endif +} + +const gchar * +gst_qsv_status_to_string (mfxStatus status) +{ +#define CASE(err) \ + case err: \ + return G_STRINGIFY (err); + + switch (status) { + CASE (MFX_ERR_NONE); + CASE (MFX_ERR_UNKNOWN); + CASE (MFX_ERR_NULL_PTR); + CASE (MFX_ERR_UNSUPPORTED); + CASE (MFX_ERR_MEMORY_ALLOC); + CASE (MFX_ERR_NOT_ENOUGH_BUFFER); + CASE (MFX_ERR_INVALID_HANDLE); + CASE (MFX_ERR_LOCK_MEMORY); + CASE (MFX_ERR_NOT_INITIALIZED); + CASE (MFX_ERR_NOT_FOUND); + CASE (MFX_ERR_MORE_DATA); + CASE (MFX_ERR_MORE_SURFACE); + CASE (MFX_ERR_ABORTED); + CASE (MFX_ERR_DEVICE_LOST); + CASE (MFX_ERR_INCOMPATIBLE_VIDEO_PARAM); + CASE (MFX_ERR_INVALID_VIDEO_PARAM); + CASE (MFX_ERR_UNDEFINED_BEHAVIOR); + CASE (MFX_ERR_DEVICE_FAILED); + CASE (MFX_ERR_MORE_BITSTREAM); + CASE (MFX_ERR_GPU_HANG); + CASE (MFX_ERR_REALLOC_SURFACE); + CASE (MFX_ERR_RESOURCE_MAPPED); + CASE (MFX_ERR_NOT_IMPLEMENTED); + CASE (MFX_WRN_IN_EXECUTION); + CASE (MFX_WRN_DEVICE_BUSY); + CASE (MFX_WRN_VIDEO_PARAM_CHANGED); + CASE (MFX_WRN_PARTIAL_ACCELERATION); + CASE (MFX_WRN_INCOMPATIBLE_VIDEO_PARAM); + CASE (MFX_WRN_VALUE_NOT_CHANGED); + CASE (MFX_WRN_OUT_OF_RANGE); + CASE (MFX_WRN_FILTER_SKIPPED); + CASE (MFX_ERR_NONE_PARTIAL_OUTPUT); + CASE (MFX_WRN_ALLOC_TIMEOUT_EXPIRED); + default: + break; + } +#undef CASE + + return "Unknown"; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvutils.h
Added
@@ -0,0 +1,78 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <mfx.h> + +G_BEGIN_DECLS + +mfxLoader gst_qsv_get_loader (void); + +void gst_qsv_deinit (void); + +GList * gst_qsv_get_platform_devices (void); + +const gchar * gst_qsv_status_to_string (mfxStatus status); + +#define QSV_STATUS_ARGS(status) \ + status, gst_qsv_status_to_string (status) + +#define QSV_CHECK_STATUS(e,s,f) G_STMT_START { \ + if (s < MFX_ERR_NONE) { \ + GST_ERROR_OBJECT (e, G_STRINGIFY (f) " failed %d (%s)", \ + QSV_STATUS_ARGS (s)); \ + goto error; \ + } else if (status != MFX_ERR_NONE) { \ + GST_WARNING_OBJECT (e, G_STRINGIFY (f) " returned warning %d (%s)", \ + QSV_STATUS_ARGS (s)); \ + } \ +} G_STMT_END + +static inline GstClockTime +gst_qsv_timestamp_to_gst (mfxU64 timestamp) +{ + if (timestamp == (mfxU64) MFX_TIMESTAMP_UNKNOWN) + return GST_CLOCK_TIME_NONE; + + return gst_util_uint64_scale (timestamp, GST_SECOND, 90000); +} + +static inline mfxU64 +gst_qsv_timestamp_from_gst (GstClockTime timestamp) +{ + if (!GST_CLOCK_TIME_IS_VALID (timestamp)) + return (mfxU64) MFX_TIMESTAMP_UNKNOWN; + + return gst_util_uint64_scale (timestamp, 90000, GST_SECOND); +} + +typedef struct _GstQsvResolution +{ + guint width; + guint height; +} GstQsvResolution; + +static const GstQsvResolution gst_qsv_resolutions = { + {1920, 1088}, {2560, 1440}, {3840, 2160}, {4096, 2160}, + {7680, 4320}, {8192, 4320}, {15360, 8640}, {16384, 8640} +}; + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvvp9dec.cpp
Added
@@ -0,0 +1,321 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-qsvvp9dec + * @title: qsvvp9dec + * + * Intel Quick Sync VP9 decoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 filesrc location=/path/to/vp9/file ! parsebin ! qsvvp9dec ! videoconvert ! autovideosink + * ``` + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvvp9dec.h" +#include <string> +#include <string.h> +#include <vector> + +#ifdef G_OS_WIN32 +#include <gst/d3d11/gstd3d11.h> +#else +#include <gst/va/gstva.h> +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_qsv_vp9_dec_debug); +#define GST_CAT_DEFAULT gst_qsv_vp9_dec_debug + +#define DOC_SINK_CAPS \ + "video/x-vp9, width = (int) 1, 16384 , height = (int) 1, 16384 , " \ + "alignment = (string) frame, profile = (string) { 0, 2 }" + +#define DOC_SRC_CAPS_COMM \ + "format = (string) { NV12, P010_10LE, P016_LE}, " \ + "width = (int) 1, 16384 , height = (int) 1, 16384 " + +#define DOC_SRC_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SRC_CAPS_COMM "; " \ + "video/x-raw, " DOC_SRC_CAPS_COMM + +typedef struct _GstQsvVP9Dec +{ + GstQsvDecoder parent; +} GstQsvVP9Dec; + +typedef struct _GstQsvVP9DecClass +{ + GstQsvDecoderClass parent_class; +} GstQsvVP9DecClass; + +static GTypeClass *parent_class = nullptr; + +#define GST_QSV_VP9_DEC(object) ((GstQsvVP9Dec *) (object)) +#define GST_QSV_VP9_DEC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstQsvVP9DecClass)) + +static void +gst_qsv_vp9_dec_class_init (GstQsvVP9DecClass * klass, gpointer data) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstQsvDecoderClass *qsvdec_class = GST_QSV_DECODER_CLASS (klass); + GstQsvDecoderClassData *cdata = (GstQsvDecoderClassData *) data; + GstPadTemplate *pad_templ; + GstCaps *doc_caps; + + parent_class = (GTypeClass *) g_type_class_peek_parent (klass); + +#ifdef G_OS_WIN32 + std::string long_name = "Intel Quick Sync Video " + + std::string (cdata->description) + " VP9 Decoder"; + + gst_element_class_set_metadata (element_class, long_name.c_str (), + "Codec/Decoder/Video/Hardware", + "Intel Quick Sync Video VP9 Decoder", + "Seungha Yang <seungha@centricular.com>"); +#else + gst_element_class_set_static_metadata (element_class, + "Intel Quick Sync Video VP9 Decoder", + "Codec/Decoder/Video/Hardware", + "Intel Quick Sync Video VP9 Decoder", + "Seungha Yang <seungha@centricular.com>"); +#endif + + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + qsvdec_class->codec_id = MFX_CODEC_VP9; + qsvdec_class->impl_index = cdata->impl_index; + qsvdec_class->adapter_luid = cdata->adapter_luid; + qsvdec_class->display_path = cdata->display_path; + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); +} + +static void +gst_qsv_vp9_dec_init (GstQsvVP9Dec * self) +{ +} + +void +gst_qsv_vp9_dec_register (GstPlugin * plugin, guint rank, guint impl_index, + GstObject * device, mfxSession session) +{ + mfxVideoParam param; + mfxInfoMFX *mfx; + GstQsvResolution max_resolution; + std::vector < std::string > supported_formats; + gboolean have_profile_2 = FALSE; + gboolean have_profile_2_12bits = FALSE; + + GST_DEBUG_CATEGORY_INIT (gst_qsv_vp9_dec_debug, "qsvvp9dec", 0, "qsvvp9dec"); + + memset (¶m, 0, sizeof (mfxVideoParam)); + memset (&max_resolution, 0, sizeof (GstQsvResolution)); + + param.AsyncDepth = 4; + param.IOPattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY; + + mfx = ¶m.mfx; + mfx->CodecId = MFX_CODEC_VP9; + + mfx->FrameInfo.FrameRateExtN = 30; + mfx->FrameInfo.FrameRateExtD = 1; + mfx->FrameInfo.AspectRatioW = 1; + mfx->FrameInfo.AspectRatioH = 1; + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; + mfx->FrameInfo.BitDepthLuma = 8; + mfx->FrameInfo.BitDepthChroma = 8; + mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + mfx->CodecProfile = MFX_PROFILE_VP9_0; + + /* Check max-resolution */ + for (guint i = 0; i < G_N_ELEMENTS (gst_qsv_resolutions); i++) { + mfx->FrameInfo.Width = GST_ROUND_UP_16 (gst_qsv_resolutionsi.width); + mfx->FrameInfo.Height = GST_ROUND_UP_16 (gst_qsv_resolutionsi.height); + mfx->FrameInfo.CropW = gst_qsv_resolutionsi.width; + mfx->FrameInfo.CropH = gst_qsv_resolutionsi.height; + + if (MFXVideoDECODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) + break; + + max_resolution.width = gst_qsv_resolutionsi.width; + max_resolution.height = gst_qsv_resolutionsi.height; + } + + if (max_resolution.width == 0 || max_resolution.height == 0) + return; + + GST_INFO ("Maximum supported resolution: %dx%d", + max_resolution.width, max_resolution.height); + + supported_formats.push_back ("NV12"); + + /* Check other profile/formats */ + mfx->FrameInfo.FourCC = MFX_FOURCC_P010; + mfx->FrameInfo.BitDepthLuma = 10; + mfx->FrameInfo.BitDepthChroma = 10; + mfx->FrameInfo.Shift = 1; + mfx->CodecProfile = MFX_PROFILE_VP9_2; + if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) { + have_profile_2 = TRUE; + supported_formats.push_back ("P010_10LE"); + + mfx->FrameInfo.FourCC = MFX_FOURCC_P016; + mfx->FrameInfo.BitDepthLuma = 12; + mfx->FrameInfo.BitDepthChroma = 12; + + if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) { + have_profile_2_12bits = TRUE; + supported_formats.push_back ("P016_LE"); + } + } + + /* To cover both landscape and portrait, + * select max value (width in this case) */ + guint resolution = MAX (max_resolution.width, max_resolution.height); + std::string src_caps_str = "video/x-raw"; + + src_caps_str += ", width=(int) 1, " + std::to_string (resolution) + " "; + src_caps_str += ", height=(int) 1, " + std::to_string (resolution) + " "; + + /* *INDENT-OFF* */ + if (supported_formats.size () > 1) { + src_caps_str += ", format=(string) { "; + bool first = true; + for (const auto &iter: supported_formats) { + if (!first) { + src_caps_str += ", "; + } + + src_caps_str += iter; + first = false; + } + src_caps_str += " }"; + } else { + src_caps_str += ", format=(string) " + supported_formats0; + } + /* *INDENT-ON* */ + + GstCaps *src_caps = gst_caps_from_string (src_caps_str.c_str ()); + + /* TODO: Add support for VA */ +#ifdef G_OS_WIN32 + GstCaps *d3d11_caps = gst_caps_copy (src_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr); + gst_caps_set_features_simple (d3d11_caps, caps_features); + gst_caps_append (d3d11_caps, src_caps); + src_caps = d3d11_caps; +#endif + std::string sink_caps_str = "video/x-vp9"; + sink_caps_str += ", width=(int) 1, " + std::to_string (resolution) + " "; + sink_caps_str += ", height=(int) 1, " + std::to_string (resolution) + " "; + sink_caps_str += ", alignment=(string) frame"; + if (have_profile_2 && have_profile_2_12bits) { + sink_caps_str += ", profile=(string) { 0, 2 }"; + } else if (have_profile_2) { + std::string profile2_str = sink_caps_str; + + profile2_str += ", profile = (string) 2, bit-depth-luma = (uint) 10, " + "bit-depth-chroma = (uint) 10"; + + sink_caps_str += ", profile = (string) 0; " + profile2_str; + } + + GstCaps *sink_caps = gst_caps_from_string (sink_caps_str.c_str ()); + + GST_MINI_OBJECT_FLAG_SET (sink_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (src_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GstQsvDecoderClassData *cdata = g_new0 (GstQsvDecoderClassData, 1); + cdata->sink_caps = sink_caps; + cdata->src_caps = src_caps; + cdata->impl_index = impl_index; + +#ifdef G_OS_WIN32 + g_object_get (device, "adapter-luid", &cdata->adapter_luid, + "description", &cdata->description, nullptr); +#else + g_object_get (device, "path", &cdata->display_path, nullptr); +#endif + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstQsvVP9DecClass), + nullptr, + nullptr, + (GClassInitFunc) gst_qsv_vp9_dec_class_init, + nullptr, + cdata, + sizeof (GstQsvVP9Dec), + 0, + (GInstanceInitFunc) gst_qsv_vp9_dec_init, + }; + + type_name = g_strdup ("GstQsvVP9Dec"); + feature_name = g_strdup ("qsvvp9dec"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstQsvVP9Device%dDec", index); + feature_name = g_strdup_printf ("qsvvp9device%ddec", index); + } + + type = g_type_register_static (GST_TYPE_QSV_DECODER, type_name, &type_info, + (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvvp9dec.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include "gstqsvdecoder.h" + +G_BEGIN_DECLS + +void gst_qsv_vp9_dec_register (GstPlugin * plugin, + guint rank, + guint impl_index, + GstObject * device, + mfxSession session); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvvp9enc.cpp
Added
@@ -0,0 +1,1090 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-qsvvp9enc + * @title: qsvvp9enc + * + * Intel Quick Sync VP9 encoder + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc ! qsvvp9enc ! vp9parse ! matroskamux ! filesink location=out.mkv + * ``` + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstqsvvp9enc.h" +#include <vector> +#include <string> +#include <set> +#include <string.h> + +#ifdef G_OS_WIN32 +#include <gst/d3d11/gstd3d11.h> +#else +#include <gst/va/gstva.h> +#endif + +GST_DEBUG_CATEGORY_STATIC (gst_qsv_vp9_enc_debug); +#define GST_CAT_DEFAULT gst_qsv_vp9_enc_debug + +/** + * GstQsvVP9EncRateControl: + * + * Since: 1.22 + */ +#define GST_TYPE_QSV_VP9_ENC_RATE_CONTROL (gst_qsv_vp9_enc_rate_control_get_type ()) +static GType +gst_qsv_vp9_enc_rate_control_get_type (void) +{ + static GType rate_control_type = 0; + static const GEnumValue rate_controls = { + /** + * GstQsvVP9EncRateControl::cbr: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_CBR, "Constant Bitrate", "cbr"}, + + /** + * GstQsvVP9EncRateControl::vbr: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_VBR, "Variable Bitrate", "vbr"}, + + /** + * GstQsvVP9EncRateControl::cqp: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_CQP, "Constant Quantizer", "cqp"}, + + /** + * GstQsvVP9EncRateControl::icq: + * + * Since: 1.22 + */ + {MFX_RATECONTROL_ICQ, "Intelligent CQP", "icq"}, + {0, nullptr, nullptr} + }; + + if (g_once_init_enter (&rate_control_type)) { + GType type = + g_enum_register_static ("GstQsvVP9EncRateControl", rate_controls); + g_once_init_leave (&rate_control_type, type); + } + + return rate_control_type; +} + +enum +{ + PROP_0, + PROP_QP_I, + PROP_QP_P, + PROP_GOP_SIZE, + PROP_REF_FRAMES, + PROP_BITRATE, + PROP_MAX_BITRATE, + PROP_RATE_CONTROL, + PROP_ICQ_QUALITY, +}; + +#define DEFAULT_QP 0 +#define DEFAULT_GOP_SIZE 0 +#define DEFAULT_REF_FRAMES 1 +#define DEFAULT_BITRATE 2000 +#define DEFAULT_MAX_BITRATE 0 +#define DEFAULT_RATE_CONTROL MFX_RATECONTROL_VBR +#define DEFAULT_IQC_QUALITY 0 + +#define DOC_SINK_CAPS_COMM \ + "format = (string) { NV12, P010_10LE, VUYA, Y410 }, " \ + "width = (int) 16, 8192 , " \ + "height = (int) 16, 8192 " + +#define DOC_SINK_CAPS \ + "video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw(memory:VAMemory), " DOC_SINK_CAPS_COMM "; " \ + "video/x-raw, " DOC_SINK_CAPS_COMM + +#define DOC_SRC_CAPS \ + "video/x-vp9, width = (int) 16, 8192 , height = (int) 16, 8192 , " \ + "profile = (string) { 0, 2, 1, 3 }" + +typedef struct _GstQsvVP9EncClassData +{ + GstCaps *sink_caps; + GstCaps *src_caps; + guint impl_index; + gint64 adapter_luid; + gchar *display_path; + gchar *description; +} GstQsvVP9EncClassData; + +typedef struct _GstQsvVP9Enc +{ + GstQsvEncoder parent; + + mfxExtVP9Param vp9_param; + + mfxU16 profile; + + GMutex prop_lock; + /* protected by prop_lock */ + gboolean bitrate_updated; + gboolean property_updated; + + /* properties */ + guint qp_i; + guint qp_p; + guint gop_size; + guint ref_frames; + guint bitrate; + guint max_bitrate; + mfxU16 rate_control; + guint icq_quality; +} GstQsvVP9Enc; + +typedef struct _GstQsvVP9EncClass +{ + GstQsvEncoderClass parent_class; +} GstQsvVP9EncClass; + +static GstElementClass *parent_class = nullptr; + +#define GST_QSV_VP9_ENC(object) ((GstQsvVP9Enc *) (object)) +#define GST_QSV_VP9_ENC_GET_CLASS(object) \ + (G_TYPE_INSTANCE_GET_CLASS ((object),G_TYPE_FROM_INSTANCE (object),GstQsvVP9EncClass)) + +static void gst_qsv_vp9_enc_finalize (GObject * object); +static void gst_qsv_vp9_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_qsv_vp9_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstCaps *gst_qsv_vp9_enc_getcaps (GstVideoEncoder * encoder, + GstCaps * filter); + +static gboolean gst_qsv_vp9_enc_set_format (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxVideoParam * param, + GPtrArray * extra_params); +static gboolean gst_qsv_vp9_enc_set_output_state (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxSession session); +static GstQsvEncoderReconfigure +gst_qsv_vp9_enc_check_reconfigure (GstQsvEncoder * encoder, mfxSession session, + mfxVideoParam * param, GPtrArray * extra_params); + +static void +gst_qsv_vp9_enc_class_init (GstQsvVP9EncClass * klass, gpointer data) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoEncoderClass *encoder_class = GST_VIDEO_ENCODER_CLASS (klass); + GstQsvEncoderClass *qsvenc_class = GST_QSV_ENCODER_CLASS (klass); + GstQsvVP9EncClassData *cdata = (GstQsvVP9EncClassData *) data; + GstPadTemplate *pad_templ; + GstCaps *doc_caps; + + qsvenc_class->codec_id = MFX_CODEC_VP9; + qsvenc_class->impl_index = cdata->impl_index; + qsvenc_class->adapter_luid = cdata->adapter_luid; + qsvenc_class->display_path = cdata->display_path; + + object_class->finalize = gst_qsv_vp9_enc_finalize; + object_class->set_property = gst_qsv_vp9_enc_set_property; + object_class->get_property = gst_qsv_vp9_enc_get_property; + + g_object_class_install_property (object_class, PROP_QP_I, + g_param_spec_uint ("qp-i", "QP I", + "Constant quantizer for I frames (0: default)", + 0, 255, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_QP_P, + g_param_spec_uint ("qp-p", "QP P", + "Constant quantizer for P frames (0: default)", + 0, 255, DEFAULT_QP, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_GOP_SIZE, + g_param_spec_uint ("gop-size", "GOP Size", + "Number of pictures within a GOP (0: unspecified)", + 0, G_MAXINT, DEFAULT_GOP_SIZE, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_REF_FRAMES, + g_param_spec_uint ("ref-frames", "Reference Frames", + "Number of reference frames (0: unspecified)", + 0, 3, DEFAULT_REF_FRAMES, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_BITRATE, + g_param_spec_uint ("bitrate", "Bitrate", + "Target bitrate in kbit/sec, Ignored when selected rate-control mode " + "is constant QP variants (i.e., \"cqp\" and \"icq\")", + 0, G_MAXUINT16, DEFAULT_BITRATE, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_MAX_BITRATE, + g_param_spec_uint ("max-bitrate", "Max Bitrate", + "Maximum bitrate in kbit/sec, Ignored when selected rate-control mode " + "is constant QP variants (i.e., \"cqp\" and \"icq\")", + 0, G_MAXUINT16, DEFAULT_MAX_BITRATE, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_RATE_CONTROL, + g_param_spec_enum ("rate-control", "Rate Control", + "Rate Control Method", GST_TYPE_QSV_VP9_ENC_RATE_CONTROL, + DEFAULT_RATE_CONTROL, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, PROP_ICQ_QUALITY, + g_param_spec_uint ("icq-quality", "ICQ Quality", + "Intelligent Constant Quality for \"icq\" rate-control (0: default)", + 0, 255, DEFAULT_IQC_QUALITY, (GParamFlags) + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + parent_class = (GstElementClass *) g_type_class_peek_parent (klass); + +#ifdef G_OS_WIN32 + std::string long_name = "Intel Quick Sync Video " + + std::string (cdata->description) + " VP9 Encoder"; + + gst_element_class_set_metadata (element_class, long_name.c_str (), + "Codec/Encoder/Video/Hardware", + "Intel Quick Sync Video VP9 Encoder", + "Seungha Yang <seungha@centricular.com>"); +#else + gst_element_class_set_static_metadata (element_class, + "Intel Quick Sync Video VP9 Encoder", + "Codec/Encoder/Video/Hardware", + "Intel Quick Sync Video VP9 Encoder", + "Seungha Yang <seungha@centricular.com>"); +#endif + + pad_templ = gst_pad_template_new ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps); + doc_caps = gst_caps_from_string (DOC_SINK_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + pad_templ = gst_pad_template_new ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps); + doc_caps = gst_caps_from_string (DOC_SRC_CAPS); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + gst_element_class_add_pad_template (element_class, pad_templ); + + encoder_class->getcaps = GST_DEBUG_FUNCPTR (gst_qsv_vp9_enc_getcaps); + + qsvenc_class->set_format = GST_DEBUG_FUNCPTR (gst_qsv_vp9_enc_set_format); + qsvenc_class->set_output_state = + GST_DEBUG_FUNCPTR (gst_qsv_vp9_enc_set_output_state); + qsvenc_class->check_reconfigure = + GST_DEBUG_FUNCPTR (gst_qsv_vp9_enc_check_reconfigure); + + gst_type_mark_as_plugin_api (GST_TYPE_QSV_VP9_ENC_RATE_CONTROL, + (GstPluginAPIFlags) 0); + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata->description); + g_free (cdata); +} + +static void +gst_qsv_vp9_enc_init (GstQsvVP9Enc * self) +{ + self->qp_i = DEFAULT_QP; + self->qp_p = DEFAULT_QP; + self->gop_size = DEFAULT_GOP_SIZE; + self->ref_frames = DEFAULT_REF_FRAMES; + self->bitrate = DEFAULT_BITRATE; + self->max_bitrate = DEFAULT_MAX_BITRATE; + self->rate_control = DEFAULT_RATE_CONTROL; + self->icq_quality = DEFAULT_IQC_QUALITY; + + g_mutex_init (&self->prop_lock); +} + +static void +gst_qsv_vp9_enc_finalize (GObject * object) +{ + GstQsvVP9Enc *self = GST_QSV_VP9_ENC (object); + + g_mutex_clear (&self->prop_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_qsv_vp9_enc_check_update_uint (GstQsvVP9Enc * self, guint * old_val, + guint new_val, gboolean is_bitrate_param) +{ + if (*old_val == new_val) + return; + + g_mutex_lock (&self->prop_lock); + *old_val = new_val; + if (is_bitrate_param) + self->bitrate_updated = TRUE; + else + self->property_updated = TRUE; + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_qsv_vp9_enc_check_update_enum (GstQsvVP9Enc * self, mfxU16 * old_val, + gint new_val) +{ + if (*old_val == (mfxU16) new_val) + return; + + g_mutex_lock (&self->prop_lock); + *old_val = (mfxU16) new_val; + self->property_updated = TRUE; + g_mutex_unlock (&self->prop_lock); +} + +static void +gst_qsv_vp9_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstQsvVP9Enc *self = GST_QSV_VP9_ENC (object); + + switch (prop_id) { + case PROP_QP_I: + gst_qsv_vp9_enc_check_update_uint (self, &self->qp_i, + g_value_get_uint (value), TRUE); + break; + case PROP_QP_P: + gst_qsv_vp9_enc_check_update_uint (self, &self->qp_p, + g_value_get_uint (value), TRUE); + break; + case PROP_GOP_SIZE: + gst_qsv_vp9_enc_check_update_uint (self, &self->gop_size, + g_value_get_uint (value), FALSE); + break; + case PROP_REF_FRAMES: + gst_qsv_vp9_enc_check_update_uint (self, &self->ref_frames, + g_value_get_uint (value), FALSE); + break; + case PROP_BITRATE: + gst_qsv_vp9_enc_check_update_uint (self, &self->bitrate, + g_value_get_uint (value), TRUE); + break; + case PROP_MAX_BITRATE: + gst_qsv_vp9_enc_check_update_uint (self, &self->max_bitrate, + g_value_get_uint (value), TRUE); + break; + case PROP_RATE_CONTROL: + gst_qsv_vp9_enc_check_update_enum (self, &self->rate_control, + g_value_get_enum (value)); + break; + case PROP_ICQ_QUALITY: + gst_qsv_vp9_enc_check_update_uint (self, &self->icq_quality, + g_value_get_uint (value), FALSE); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_qsv_vp9_enc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstQsvVP9Enc *self = GST_QSV_VP9_ENC (object); + + switch (prop_id) { + case PROP_QP_I: + g_value_set_uint (value, self->qp_i); + break; + case PROP_QP_P: + g_value_set_uint (value, self->qp_p); + break; + case PROP_GOP_SIZE: + g_value_set_uint (value, self->gop_size); + break; + case PROP_REF_FRAMES: + g_value_set_uint (value, self->ref_frames); + break; + case PROP_BITRATE: + g_value_set_uint (value, self->bitrate); + break; + case PROP_MAX_BITRATE: + g_value_set_uint (value, self->max_bitrate); + break; + case PROP_RATE_CONTROL: + g_value_set_enum (value, self->rate_control); + break; + case PROP_ICQ_QUALITY: + g_value_set_uint (value, self->icq_quality); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstCaps * +gst_qsv_vp9_enc_getcaps (GstVideoEncoder * encoder, GstCaps * filter) +{ + GstQsvVP9Enc *self = GST_QSV_VP9_ENC (encoder); + GstCaps *allowed_caps; + GstCaps *template_caps; + GstCaps *supported_caps; + std::set < std::string > downstream_profiles; + + allowed_caps = gst_pad_get_allowed_caps (encoder->srcpad); + + /* Shouldn't be any or empty though, just return template caps in this case */ + if (!allowed_caps || gst_caps_is_empty (allowed_caps) || + gst_caps_is_any (allowed_caps)) { + gst_clear_caps (&allowed_caps); + + return gst_video_encoder_proxy_getcaps (encoder, nullptr, filter); + } + + /* Check if downstream specified profile explicitly, then filter out + * incompatible raw video format */ + for (guint i = 0; i < gst_caps_get_size (allowed_caps); i++) { + const GValue *profile_value; + const gchar *profile; + GstStructure *s; + + s = gst_caps_get_structure (allowed_caps, i); + profile_value = gst_structure_get_value (s, "profile"); + if (!profile_value) + continue; + + if (GST_VALUE_HOLDS_LIST (profile_value)) { + for (guint j = 0; j < gst_value_list_get_size (profile_value); j++) { + const GValue *p = gst_value_list_get_value (profile_value, j); + + if (!G_VALUE_HOLDS_STRING (p)) + continue; + + profile = g_value_get_string (p); + if (profile) + downstream_profiles.insert (profile); + } + } else if (G_VALUE_HOLDS_STRING (profile_value)) { + profile = g_value_get_string (profile_value); + if (g_strcmp0 (profile, "0") == 0 || g_strcmp0 (profile, "1") == 0 || + g_strcmp0 (profile, "2") == 0 || g_strcmp0 (profile, "3") == 0) { + downstream_profiles.insert (profile); + } + } + } + + GST_DEBUG_OBJECT (self, "Downstream specified %" G_GSIZE_FORMAT " profiles", + downstream_profiles.size ()); + + /* Caps returned by gst_pad_get_allowed_caps() should hold profile field + * already */ + if (downstream_profiles.size () == 0) { + GST_WARNING_OBJECT (self, + "Allowed caps holds no profile field %" GST_PTR_FORMAT, allowed_caps); + + gst_clear_caps (&allowed_caps); + + return gst_video_encoder_proxy_getcaps (encoder, nullptr, filter); + } + + gst_clear_caps (&allowed_caps); + + template_caps = gst_pad_get_pad_template_caps (encoder->sinkpad); + template_caps = gst_caps_make_writable (template_caps); + + if (downstream_profiles.size () == 1) { + std::string format; + const std::string & profile = *downstream_profiles.begin (); + + if (profile == "0") { + format = "NV12"; + } else if (profile == "1") { + format = "VUYA"; + } else if (profile == "2") { + format = "P010_10LE"; + } else if (profile == "3") { + format = "Y410"; + } else { + gst_clear_caps (&template_caps); + g_assert_not_reached (); + return nullptr; + } + + gst_caps_set_simple (template_caps, "format", G_TYPE_STRING, + format.c_str (), nullptr); + } else { + GValue formats = G_VALUE_INIT; + + g_value_init (&formats, GST_TYPE_LIST); + + /* *INDENT-OFF* */ + for (const auto & iter : downstream_profiles) { + GValue val = G_VALUE_INIT; + g_value_init (&val, G_TYPE_STRING); + if (iter == "0") { + g_value_set_static_string (&val, "NV12"); + } else if (iter == "1") { + g_value_set_static_string (&val, "VUYA"); + } else if (iter == "2") { + g_value_set_static_string (&val, "P010_10LE"); + } else if (iter == "3") { + g_value_set_static_string (&val, "Y410"); + } else { + g_value_unset (&val); + gst_clear_caps (&template_caps); + g_assert_not_reached (); + return nullptr; + } + + gst_value_list_append_and_take_value (&formats, &val); + } + /* *INDENT-ON* */ + + gst_caps_set_value (template_caps, "format", &formats); + g_value_unset (&formats); + } + + supported_caps = gst_video_encoder_proxy_getcaps (encoder, + template_caps, filter); + gst_caps_unref (template_caps); + + GST_DEBUG_OBJECT (self, "Returning %" GST_PTR_FORMAT, supported_caps); + + return supported_caps; +} + +typedef struct +{ + mfxU16 profile; + const gchar *profile_str; + const gchar *raw_format; +} VP9Profile; + +static const VP9Profile profile_map = { + /* preference order */ + {MFX_PROFILE_VP9_0, "0", "NV12"}, + {MFX_PROFILE_VP9_2, "2", "P010_10LE"}, + {MFX_PROFILE_VP9_1, "1", "VUYA"}, + {MFX_PROFILE_VP9_3, "3", "Y410"}, +}; + +static const gchar * +gst_qsv_vp9_profile_to_string (mfxU16 profile) +{ + for (guint i = 0; i < G_N_ELEMENTS (profile_map); i++) { + if (profile_mapi.profile == profile) + return profile_mapi.profile_str; + } + + return nullptr; +} + +static void +gst_qsv_vp9_enc_init_vp9_param (mfxExtVP9Param * param) +{ + memset (param, 0, sizeof (mfxExtVP9Param)); + + param->Header.BufferId = MFX_EXTBUFF_VP9_PARAM; + param->Header.BufferSz = sizeof (mfxExtVP9Param); +} + +static void +gst_qsv_vp9_enc_set_bitrate (GstQsvVP9Enc * self, mfxVideoParam * param) +{ + switch (param->mfx.RateControlMethod) { + case MFX_RATECONTROL_CBR: + param->mfx.TargetKbps = param->mfx.MaxKbps = self->bitrate; + param->mfx.BRCParamMultiplier = 1; + break; + case MFX_RATECONTROL_VBR: + param->mfx.TargetKbps = self->bitrate; + param->mfx.MaxKbps = self->max_bitrate; + param->mfx.BRCParamMultiplier = 1; + break; + case MFX_RATECONTROL_CQP: + param->mfx.QPI = self->qp_i; + param->mfx.QPP = self->qp_p; + break; + case MFX_RATECONTROL_ICQ: + param->mfx.ICQQuality = self->icq_quality; + break; + default: + GST_WARNING_OBJECT (self, + "Unhandled rate-control method %d", self->rate_control); + break; + } +} + +static gboolean +gst_qsv_vp9_enc_set_format (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxVideoParam * param, GPtrArray * extra_params) +{ + GstQsvVP9Enc *self = GST_QSV_VP9_ENC (encoder); + mfxU16 mfx_profile = MFX_PROFILE_UNKNOWN; + GstVideoInfo *info = &state->info; + mfxExtVP9Param *vp9_param; + mfxFrameInfo *frame_info; + + frame_info = ¶m->mfx.FrameInfo; + + /* QSV expects this resolution, but actual coded frame resolution will be + * signalled via mfxExtVP9Param */ + frame_info->Width = frame_info->CropW = GST_ROUND_UP_16 (info->width); + frame_info->Height = frame_info->CropH = GST_ROUND_UP_16 (info->height); + + frame_info->PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + + if (GST_VIDEO_INFO_FPS_N (info) > 0 && GST_VIDEO_INFO_FPS_D (info) > 0) { + frame_info->FrameRateExtN = GST_VIDEO_INFO_FPS_N (info); + frame_info->FrameRateExtD = GST_VIDEO_INFO_FPS_D (info); + } else { + /* HACK: Same as x264enc */ + frame_info->FrameRateExtN = 25; + frame_info->FrameRateExtD = 1; + } + + frame_info->AspectRatioW = GST_VIDEO_INFO_PAR_N (info); + frame_info->AspectRatioH = GST_VIDEO_INFO_PAR_D (info); + + switch (GST_VIDEO_INFO_FORMAT (info)) { + case GST_VIDEO_FORMAT_NV12: + mfx_profile = MFX_PROFILE_VP9_0; + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; + frame_info->FourCC = MFX_FOURCC_NV12; + frame_info->BitDepthLuma = 8; + frame_info->BitDepthChroma = 8; + frame_info->Shift = 0; + break; + case GST_VIDEO_FORMAT_VUYA: + mfx_profile = MFX_PROFILE_VP9_1; + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV444; + frame_info->FourCC = MFX_FOURCC_AYUV; + frame_info->BitDepthLuma = 8; + frame_info->BitDepthChroma = 8; + frame_info->Shift = 0; + break; + case GST_VIDEO_FORMAT_P010_10LE: + mfx_profile = MFX_PROFILE_VP9_2; + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV420; + frame_info->FourCC = MFX_FOURCC_P010; + frame_info->BitDepthLuma = 10; + frame_info->BitDepthChroma = 10; + frame_info->Shift = 1; + break; + case GST_VIDEO_FORMAT_Y410: + mfx_profile = MFX_PROFILE_VP9_3; + frame_info->ChromaFormat = MFX_CHROMAFORMAT_YUV444; + frame_info->FourCC = MFX_FOURCC_Y410; + frame_info->BitDepthLuma = 10; + frame_info->BitDepthChroma = 10; + frame_info->Shift = 0; + break; + default: + GST_ERROR_OBJECT (self, "Unexpected format %s", + gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info))); + return FALSE; + } + + gst_qsv_vp9_enc_init_vp9_param (&self->vp9_param); + vp9_param = &self->vp9_param; + + vp9_param->FrameWidth = GST_VIDEO_INFO_WIDTH (info); + vp9_param->FrameHeight = GST_VIDEO_INFO_HEIGHT (info); + + /* We will always output raw VP9 frames */ + vp9_param->WriteIVFHeaders = MFX_CODINGOPTION_OFF; + + g_mutex_lock (&self->prop_lock); + param->mfx.CodecId = MFX_CODEC_VP9; + param->mfx.CodecProfile = mfx_profile; + param->mfx.GopRefDist = 1; + param->mfx.GopPicSize = self->gop_size; + param->mfx.RateControlMethod = self->rate_control; + param->mfx.NumRefFrame = self->ref_frames; + + gst_qsv_vp9_enc_set_bitrate (self, param); + + g_ptr_array_add (extra_params, vp9_param); + + param->ExtParam = (mfxExtBuffer **) extra_params->pdata; + param->NumExtParam = extra_params->len; + + self->bitrate_updated = FALSE; + self->property_updated = FALSE; + + g_mutex_unlock (&self->prop_lock); + + return TRUE; +} + +static gboolean +gst_qsv_vp9_enc_set_output_state (GstQsvEncoder * encoder, + GstVideoCodecState * state, mfxSession session) +{ + GstQsvVP9Enc *self = GST_QSV_VP9_ENC (encoder); + GstCaps *caps; + GstTagList *tags; + GstVideoCodecState *out_state; + guint bitrate, max_bitrate; + mfxVideoParam param; + const gchar *profile_str; + mfxStatus status; + + memset (¶m, 0, sizeof (mfxVideoParam)); + status = MFXVideoENCODE_GetVideoParam (session, ¶m); + if (status < MFX_ERR_NONE) { + GST_ERROR_OBJECT (self, "Failed to get video param %d (%s)", + QSV_STATUS_ARGS (status)); + return FALSE; + } else if (status != MFX_ERR_NONE) { + GST_WARNING_OBJECT (self, "GetVideoParam returned warning %d (%s)", + QSV_STATUS_ARGS (status)); + } + + caps = gst_caps_from_string ("video/x-vp9"); + profile_str = gst_qsv_vp9_profile_to_string (param.mfx.CodecProfile); + if (profile_str) + gst_caps_set_simple (caps, "profile", G_TYPE_STRING, profile_str, nullptr); + + out_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (encoder), + caps, state); + gst_video_codec_state_unref (out_state); + + tags = gst_tag_list_new_empty (); + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, "qsvvp9enc", + nullptr); + + switch (param.mfx.RateControlMethod) { + case MFX_RATECONTROL_CQP: + case MFX_RATECONTROL_ICQ: + /* We don't know target/max bitrate in this case */ + break; + default: + max_bitrate = (guint) param.mfx.MaxKbps; + bitrate = (guint) param.mfx.TargetKbps; + if (bitrate > 0) { + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, + GST_TAG_NOMINAL_BITRATE, bitrate * 1000, nullptr); + } + + if (max_bitrate > 0) { + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, + GST_TAG_MAXIMUM_BITRATE, max_bitrate * 1000, nullptr); + } + break; + } + + gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (encoder), + tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (tags); + + return TRUE; +} + +static GstQsvEncoderReconfigure +gst_qsv_vp9_enc_check_reconfigure (GstQsvEncoder * encoder, mfxSession session, + mfxVideoParam * param, GPtrArray * extra_params) +{ + GstQsvVP9Enc *self = GST_QSV_VP9_ENC (encoder); + GstQsvEncoderReconfigure ret = GST_QSV_ENCODER_RECONFIGURE_NONE; + + g_mutex_lock (&self->prop_lock); + if (self->property_updated) { + ret = GST_QSV_ENCODER_RECONFIGURE_FULL; + goto done; + } + + if (self->bitrate_updated) { + /* VP9 does not support query with MFX_EXTBUFF_ENCODER_RESET_OPTION + * Just return GST_QSV_ENCODER_RECONFIGURE_BITRATE here. + * Baseclass will care error */ + gst_qsv_vp9_enc_set_bitrate (self, param); + + ret = GST_QSV_ENCODER_RECONFIGURE_BITRATE; + } + +done: + self->property_updated = FALSE; + self->bitrate_updated = FALSE; + g_mutex_unlock (&self->prop_lock); + + return ret; +} + +void +gst_qsv_vp9_enc_register (GstPlugin * plugin, guint rank, guint impl_index, + GstObject * device, mfxSession session) +{ + mfxVideoParam param; + mfxInfoMFX *mfx; + std::vector < mfxU16 > supported_profiles; + std::vector < std::string > supported_formats; + GstQsvResolution max_resolution; + mfxExtVP9Param vp9_param; + mfxExtBuffer *ext_bufs1; + + GST_DEBUG_CATEGORY_INIT (gst_qsv_vp9_enc_debug, "qsvvp9enc", 0, "qsvvp9enc"); + + memset (¶m, 0, sizeof (mfxVideoParam)); + memset (&max_resolution, 0, sizeof (GstQsvResolution)); + + ext_bufs0 = (mfxExtBuffer *) & vp9_param; + + param.AsyncDepth = 4; + param.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY; + + mfx = ¶m.mfx; + mfx->LowPower = MFX_CODINGOPTION_UNKNOWN; + mfx->CodecId = MFX_CODEC_VP9; + + mfx->FrameInfo.Width = mfx->FrameInfo.CropW = GST_ROUND_UP_16 (320); + mfx->FrameInfo.Height = mfx->FrameInfo.CropH = GST_ROUND_UP_16 (240); + mfx->FrameInfo.FrameRateExtN = 30; + mfx->FrameInfo.FrameRateExtD = 1; + mfx->FrameInfo.AspectRatioW = 1; + mfx->FrameInfo.AspectRatioH = 1; + mfx->FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; + + param.NumExtParam = 1; + param.ExtParam = ext_bufs; + + for (guint i = 0; i < G_N_ELEMENTS (profile_map); i++) { + mfx->CodecProfile = profile_mapi.profile; + + gst_qsv_vp9_enc_init_vp9_param (&vp9_param); + vp9_param.FrameWidth = 320; + vp9_param.FrameHeight = 240; + + vp9_param.WriteIVFHeaders = MFX_CODINGOPTION_OFF; + + switch (mfx->CodecProfile) { + case MFX_PROFILE_VP9_0: + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; + mfx->FrameInfo.BitDepthLuma = 8; + mfx->FrameInfo.BitDepthChroma = 8; + mfx->FrameInfo.Shift = 0; + break; + case MFX_PROFILE_VP9_1: + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV444; + mfx->FrameInfo.FourCC = MFX_FOURCC_AYUV; + mfx->FrameInfo.BitDepthLuma = 8; + mfx->FrameInfo.BitDepthChroma = 8; + mfx->FrameInfo.Shift = 0; + break; + case MFX_PROFILE_VP9_2: + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_P010; + mfx->FrameInfo.BitDepthLuma = 10; + mfx->FrameInfo.BitDepthChroma = 10; + mfx->FrameInfo.Shift = 1; + break; + case MFX_PROFILE_VP9_3: + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV444; + mfx->FrameInfo.FourCC = MFX_FOURCC_Y410; + mfx->FrameInfo.BitDepthLuma = 10; + mfx->FrameInfo.BitDepthChroma = 10; + mfx->FrameInfo.Shift = 0; + break; + default: + g_assert_not_reached (); + return; + } + + if (MFXVideoENCODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) + continue; + + supported_profiles.push_back (profile_mapi.profile); + supported_formats.push_back (profile_mapi.raw_format); + } + + if (supported_profiles.empty ()) { + GST_INFO ("Device doesn't support VP9 encoding"); + return; + } + + mfx->CodecProfile = MFX_PROFILE_VP9_0; + mfx->FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + mfx->FrameInfo.FourCC = MFX_FOURCC_NV12; + mfx->FrameInfo.BitDepthLuma = 8; + mfx->FrameInfo.BitDepthChroma = 8; + mfx->FrameInfo.Shift = 0; + + /* Check max-resolution */ + for (guint i = 0; i < G_N_ELEMENTS (gst_qsv_resolutions); i++) { + mfx->FrameInfo.Width = mfx->FrameInfo.CropW = + GST_ROUND_UP_16 (gst_qsv_resolutionsi.width); + mfx->FrameInfo.Height = mfx->FrameInfo.CropH = + GST_ROUND_UP_16 (gst_qsv_resolutionsi.height); + + gst_qsv_vp9_enc_init_vp9_param (&vp9_param); + + vp9_param.FrameWidth = gst_qsv_resolutionsi.width; + vp9_param.FrameHeight = gst_qsv_resolutionsi.height; + + vp9_param.WriteIVFHeaders = MFX_CODINGOPTION_OFF; + + if (MFXVideoENCODE_Query (session, ¶m, ¶m) != MFX_ERR_NONE) + break; + + max_resolution.width = gst_qsv_resolutionsi.width; + max_resolution.height = gst_qsv_resolutionsi.height; + } + + GST_INFO ("Maximum supported resolution: %dx%d", + max_resolution.width, max_resolution.height); + + /* TODO: check supported rate-control methods and expose only supported + * methods, since the device might not be able to support some of them */ + + /* To cover both landscape and portrait, + * select max value (width in this case) */ + guint resolution = MAX (max_resolution.width, max_resolution.height); + std::string sink_caps_str = "video/x-raw"; + + sink_caps_str += ", width=(int) 16, " + std::to_string (resolution) + " "; + sink_caps_str += ", height=(int) 16, " + std::to_string (resolution) + " "; + + /* *INDENT-OFF* */ + if (supported_formats.size () > 1) { + sink_caps_str += ", format=(string) { "; + bool first = true; + for (const auto &iter: supported_formats) { + if (!first) { + sink_caps_str += ", "; + } + + sink_caps_str += iter; + first = false; + } + sink_caps_str += " }"; + } else { + sink_caps_str += ", format=(string) " + supported_formats0; + } + /* *INDENT-ON* */ + + GstCaps *sink_caps = gst_caps_from_string (sink_caps_str.c_str ()); + + /* TODO: Add support for VA */ +#ifdef G_OS_WIN32 + GstCaps *d3d11_caps = gst_caps_copy (sink_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr); + gst_caps_set_features_simple (d3d11_caps, caps_features); + gst_caps_append (d3d11_caps, sink_caps); + sink_caps = d3d11_caps; +#else + GstCaps *va_caps = gst_caps_copy (sink_caps); + GstCapsFeatures *caps_features = + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_VA, nullptr); + gst_caps_set_features_simple (va_caps, caps_features); + gst_caps_append (va_caps, sink_caps); + sink_caps = va_caps; +#endif + + std::string src_caps_str = "video/x-vp9"; + src_caps_str += ", width=(int) 16, " + std::to_string (resolution) + " "; + src_caps_str += ", height=(int) 16, " + std::to_string (resolution) + " "; + + /* *INDENT-OFF* */ + if (supported_profiles.size () > 1) { + src_caps_str += ", profile=(string) { "; + bool first = true; + for (const auto &iter: supported_profiles) { + if (!first) { + src_caps_str += ", "; + } + + src_caps_str += gst_qsv_vp9_profile_to_string (iter); + first = false; + } + src_caps_str += " }"; + } else { + src_caps_str += ", profile=(string) "; + src_caps_str += gst_qsv_vp9_profile_to_string (supported_profiles0); + } + /* *INDENT-ON* */ + + GstCaps *src_caps = gst_caps_from_string (src_caps_str.c_str ()); + + GST_MINI_OBJECT_FLAG_SET (sink_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (src_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + GstQsvVP9EncClassData *cdata = g_new0 (GstQsvVP9EncClassData, 1); + cdata->sink_caps = sink_caps; + cdata->src_caps = src_caps; + cdata->impl_index = impl_index; + +#ifdef G_OS_WIN32 + g_object_get (device, "adapter-luid", &cdata->adapter_luid, + "description", &cdata->description, nullptr); +#else + g_object_get (device, "path", &cdata->display_path, nullptr); +#endif + + GType type; + gchar *type_name; + gchar *feature_name; + GTypeInfo type_info = { + sizeof (GstQsvVP9EncClass), + nullptr, + nullptr, + (GClassInitFunc) gst_qsv_vp9_enc_class_init, + nullptr, + cdata, + sizeof (GstQsvVP9Enc), + 0, + (GInstanceInitFunc) gst_qsv_vp9_enc_init, + }; + + type_name = g_strdup ("GstQsvVP9Enc"); + feature_name = g_strdup ("qsvvp9enc"); + + gint index = 0; + while (g_type_from_name (type_name)) { + index++; + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstQsvVP9Device%dEnc", index); + feature_name = g_strdup_printf ("qsvvp9device%denc", index); + } + + type = g_type_register_static (GST_TYPE_QSV_ENCODER, type_name, &type_info, + (GTypeFlags) 0); + + if (rank > 0 && index != 0) + rank--; + + if (index != 0) + gst_element_type_set_skip_documentation (type); + + if (!gst_element_register (plugin, feature_name, rank, type)) + GST_WARNING ("Failed to register plugin '%s'", type_name); + + g_free (type_name); + g_free (feature_name); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/gstqsvvp9enc.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include "gstqsvencoder.h" + +G_BEGIN_DECLS + +void gst_qsv_vp9_enc_register (GstPlugin * plugin, + guint rank, + guint impl_index, + GstObject * device, + mfxSession session); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfx.h
Added
@@ -0,0 +1,31 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFX_H__ +#define __MFX_H__ + +#include "mfxdefs.h" +#include "mfxcommon.h" +#include "mfxstructures.h" +#include "mfxdispatcher.h" +#include "mfximplcaps.h" +#include "mfxsession.h" +#include "mfxvideo.h" +#include "mfxadapter.h" + +#include "mfxbrc.h" +#include "mfxmvc.h" +#include "mfxpcp.h" +#include "mfxvp8.h" +#include "mfxjpeg.h" + +#include "mfxsurfacepool.h" + +#ifdef ONEVPL_EXPERIMENTAL +#include "mfxencodestats.h" +#endif + +#endif /* __MFXDEFS_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxadapter.h
Added
@@ -0,0 +1,73 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include "mfxdefs.h" +#ifndef __MFXADAPTER_H__ +#define __MFXADAPTER_H__ + +#include "mfxstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*! + @brief + Returns a list of adapters that are suitable to handle workload @p input_info. The list is sorted in priority order, with iGPU given the highest precedence. + This rule may change in the future. If the @p input_info pointer is NULL, the list of all available adapters will be returned. + + @paramin input_info Pointer to workload description. See mfxComponentInfo description for details. + @paramout adapters Pointer to output description of all suitable adapters for input workload. See mfxAdaptersInfo description for details. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_NULL_PTR + @p input_info or adapters pointer is NULL. \n + MFX_ERR_NOT_FOUND No suitable adapters found. \n + MFX_WRN_OUT_OF_RANGE Not enough memory to report back entire list of adapters. In this case as many adapters as possible will be returned. + + @since This function is available since API version 1.31. +*/ +mfxStatus MFX_CDECL MFXQueryAdapters(mfxComponentInfo* input_info, mfxAdaptersInfo* adapters); + +/*! + @brief + Returns list of adapters that are suitable to decode the input bitstream. The list is sorted in priority order, with iGPU given the highest precedence. This rule may change in the future. This function is a simplification of MFXQueryAdapters, because bitstream is a description of the workload itself. + + @paramin bitstream Pointer to bitstream with input data. + @paramin codec_id Codec ID to determine the type of codec for the input bitstream. + @paramout adapters Pointer to the output list of adapters. Memory should be allocated by user. See mfxAdaptersInfo description for details. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_NULL_PTR bitstream or @p adapters pointer is NULL. \n + MFX_ERR_NOT_FOUND No suitable adapters found. \n + MFX_WRN_OUT_OF_RANGE Not enough memory to report back entire list of adapters. In this case as many adapters as possible will be returned. + + @since This function is available since API version 1.31. +*/ +mfxStatus MFX_CDECL MFXQueryAdaptersDecode(mfxBitstream* bitstream, mfxU32 codec_id, mfxAdaptersInfo* adapters); + +/*! + @brief + Returns the number of detected graphics adapters. It can be used before calling MFXQueryAdapters to determine the size of input data that the user will need to allocate. + + @paramout num_adapters Pointer for the output number of detected graphics adapters. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_NULL_PTR num_adapters pointer is NULL. + + @since This function is available since API version 1.31. +*/ +mfxStatus MFX_CDECL MFXQueryAdaptersNumber(mfxU32* num_adapters); +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // __MFXADAPTER_H__ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxbrc.h
Added
@@ -0,0 +1,175 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFXBRC_H__ +#define __MFXBRC_H__ + +#include "mfxstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/*! See the mfxExtBRC structure for details. */ +enum { + MFX_EXTBUFF_BRC = MFX_MAKEFOURCC('E','B','R','C') +}; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Describes frame parameters required for external BRC functions. +*/ +typedef struct { + mfxU32 reserved23; + mfxU16 SceneChange; /*!< Frame belongs to a new scene if non zero. */ + mfxU16 LongTerm; /*!< Frame is a Long Term Reference frame if non zero. */ + mfxU32 FrameCmplx; /*!< Frame Complexity Frame spatial complexity if non zero. Zero if complexity is not available. */ + mfxU32 EncodedOrder; /*!< The frame number in a sequence of reordered frames starting from encoder Init. */ + mfxU32 DisplayOrder; /*!< The frame number in a sequence of frames in display order starting from last IDR. */ + mfxU32 CodedFrameSize; /*!< Size of the frame in bytes after encoding. */ + mfxU16 FrameType; /*!< Frame type. See FrameType enumerator for possible values. */ + mfxU16 PyramidLayer; /*!< B-pyramid or P-pyramid layer that the frame belongs to. */ + mfxU16 NumRecode; /*!< Number of recodings performed for this frame. */ + mfxU16 NumExtParam; /*!< Reserved for future use. */ + mfxExtBuffer** ExtParam;/*!< Reserved for future use. */ +} mfxBRCFrameParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Specifies controls for next frame encoding provided by external BRC functions. +*/ +typedef struct { + mfxI32 QpY; /*!< Frame-level Luma QP. */ + mfxU32 InitialCpbRemovalDelay; /*!< See initial_cpb_removal_delay in codec standard. Ignored if no HRD control: + mfxExtCodingOption::VuiNalHrdParameters = MFX_CODINGOPTION_OFF. Calculated by encoder if + initial_cpb_removal_delay==0 && initial_cpb_removal_offset == 0 && HRD control is switched on. */ + mfxU32 InitialCpbRemovalOffset; /*!< See initial_cpb_removal_offset in codec standard. Ignored if no HRD control: + mfxExtCodingOption::VuiNalHrdParameters = MFX_CODINGOPTION_OFF. Calculated by encoder if + initial_cpb_removal_delay==0 && initial_cpb_removal_offset == 0 && HRD control is switched on. */ + mfxU32 reserved17; + mfxU32 MaxFrameSize; /*!< Max frame size in bytes. Option for repack feature. Driver calls PAK until current frame size is + less than or equal to maxFrameSize, or number of repacking for this frame is equal to maxNumRePak. Repack is available + if there is driver support, MaxFrameSize !=0, and MaxNumRePak != 0. Ignored if maxNumRePak == 0. */ + mfxU8 DeltaQP8; /*!< Option for repack feature. Ignored if maxNumRePak == 0 or maxNumRePak==0. If current + frame size > maxFrameSize and/or number of repacking (nRepack) for this frame <= maxNumRePak, + PAK is called with QP = mfxBRCFrameCtrl::QpY + Sum(DeltaQPi), where i = 0,nRepack. + Non zero DeltaQPnRepack are ignored if nRepack > maxNumRePak. + If repacking feature is on ( maxFrameSize & maxNumRePak are not zero), it is calculated by the encoder. */ + mfxU16 MaxNumRepak; /*!< Number of possible repacks in driver if current frame size > maxFrameSize. Ignored if maxFrameSize==0. + See maxFrameSize description. Possible values are in the range of 0 to 8. */ + mfxU16 NumExtParam; /*!< Reserved for future use. */ + mfxExtBuffer** ExtParam; /*!< Reserved for future use. */ +} mfxBRCFrameCtrl; +MFX_PACK_END() + +/*! The BRCStatus enumerator itemizes instructions to the encoder by mfxExtBrc::Update. */ +enum { + MFX_BRC_OK = 0, /*!< CodedFrameSize is acceptable, no further recoding/padding/skip required, proceed to next frame. */ + MFX_BRC_BIG_FRAME = 1, /*!< Coded frame is too big, recoding required. */ + MFX_BRC_SMALL_FRAME = 2, /*!< Coded frame is too small, recoding required. */ + MFX_BRC_PANIC_BIG_FRAME = 3, /*!< Coded frame is too big, no further recoding possible - skip frame. */ + MFX_BRC_PANIC_SMALL_FRAME = 4 /*!< Coded frame is too small, no further recoding possible - required padding to mfxBRCFrameStatus::MinFrameSize. */ +}; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Specifies instructions for the encoder provided by external BRC after each frame encoding. See the BRCStatus enumerator for details. +*/ +typedef struct { + mfxU32 MinFrameSize; /*!< Size in bytes, coded frame must be padded to when Status = MFX_BRC_PANIC_SMALL_FRAME. */ + mfxU16 BRCStatus; /*!< BRC status. See the BRCStatus enumerator for possible values. */ + mfxU16 reserved25; + mfxHDL reserved1; +} mfxBRCFrameStatus; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Contains a set of callbacks to perform external bitrate control. Can be attached to the mfxVideoParam structure during + encoder initialization. Set the mfxExtCodingOption2::ExtBRC option to ON to make the encoder use the external BRC instead of the native one. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_BRC. */ + + mfxU32 reserved14; + mfxHDL pthis; /*!< Pointer to the BRC object. */ + + /*! + @brief Initializes the BRC session according to parameters from input mfxVideoParam and attached structures. It does not modify the input mfxVideoParam and attached structures. Invoked during MFXVideoENCODE_Init. + + @paramin pthis Pointer to the BRC object. + @paramin par Pointer to the mfxVideoParam structure that was used for the encoder initialization. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_UNSUPPORTED The function detected unsupported video parameters. + */ + mfxStatus (MFX_CDECL *Init) (mfxHDL pthis, mfxVideoParam* par); + + /*! + @brief Resets BRC session according to new parameters. It does not modify the input mfxVideoParam and attached structures. Invoked during MFXVideoENCODE_Reset. + + @paramin pthis Pointer to the BRC object. + @paramin par Pointer to the mfxVideoParam structure that was used for the encoder initialization. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_UNSUPPORTED The function detected unsupported video parameters. \n + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The function detected that the video parameters provided by the application are incompatible with + initialization parameters. Reset requires additional memory allocation and cannot be executed. + */ + mfxStatus (MFX_CDECL *Reset) (mfxHDL pthis, mfxVideoParam* par); + + /*! + @brief Deallocates any internal resources acquired in Init for this BRC session. Invoked during MFXVideoENCODE_Close. + + @paramin pthis Pointer to the BRC object. + + @return + MFX_ERR_NONE The function completed successfully. + */ + mfxStatus (MFX_CDECL *Close) (mfxHDL pthis); + + /*! @brief Returns controls (@p ctrl) to encode next frame based on info from input mfxBRCFrameParam structure (@p par) and + internal BRC state. Invoked asynchronously before each frame encoding or recoding. + + @paramin pthis Pointer to the BRC object. + @paramin par Pointer to the mfxVideoParam structure that was used for the encoder initialization. + @paramout ctrl Pointer to the output mfxBRCFrameCtrl structure. + + @return + MFX_ERR_NONE The function completed successfully. + */ + mfxStatus (MFX_CDECL* GetFrameCtrl) (mfxHDL pthis, mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl); + + /*! + @brief Updates internal BRC state and returns status to instruct encoder whether it should recode the previous frame, + skip the previous frame, do padding, or proceed to next frame based on info from input mfxBRCFrameParam and mfxBRCFrameCtrl structures. + Invoked asynchronously after each frame encoding or recoding. + + @paramin pthis Pointer to the BRC object. + @paramin par Pointer to the mfxVideoParam structure that was used for the encoder initialization. + @paramin ctrl Pointer to the output mfxBRCFrameCtrl structure. + @paramin status Pointer to the output mfxBRCFrameStatus structure. + + + @return + MFX_ERR_NONE The function completed successfully. + */ + mfxStatus (MFX_CDECL* Update) (mfxHDL pthis, mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl, mfxBRCFrameStatus* status); + + mfxHDL reserved110; +} mfxExtBRC; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxcommon.h
Added
@@ -0,0 +1,608 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFXCOMMON_H__ +#define __MFXCOMMON_H__ +#include "mfxdefs.h" + +#if !defined (__GNUC__) +#pragma warning(disable: 4201) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#define MFX_MAKEFOURCC(A,B,C,D) ((((int)A))+(((int)B)<<8)+(((int)C)<<16)+(((int)D)<<24)) + +/* Extended Configuration Header Structure */ +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! The common header definition for external buffers and video + processing hints. */ +typedef struct { + mfxU32 BufferId; /*!< Identifier of the buffer content. See the ExtendedBufferID enumerator for a complete list of extended buffers. */ + mfxU32 BufferSz; /*!< Size of the buffer. */ +} mfxExtBuffer; +MFX_PACK_END() + +#ifdef ONEVPL_EXPERIMENTAL + +#define MFX_REFINTERFACE_VERSION MFX_STRUCT_VERSION(1, 0) + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! The structure respresents reference counted interface structure. + The memory is allocated and released by the implementation. +*/ +typedef struct mfxRefInterface { + mfxHDL Context; /*!< The context of the container interface. User should not touch (change, set, null) this pointer. */ + mfxStructVersion Version; /*!< The version of the structure. */ + /*! @brief + Increments the internal reference counter of the container. The container is not destroyed until the container + is released using the mfxRefInterface::Release function. + mfxRefInterface::AddRef should be used each time a new link to the container is created + (for example, copy structure) for proper management. + + @paramin ref_interface Valid interface. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If interface is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxRefInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNKNOWN Any internal error. + + */ + mfxStatus (MFX_CDECL *AddRef)(struct mfxRefInterface* ref_interface); + /*! @brief + Decrements the internal reference counter of the container. mfxRefInterface::Release should be called after using the + mfxRefInterface::AddRef function to add a container or when allocation logic requires it. + + @paramin ref_interface Valid interface. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If interface is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxRefInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNDEFINED_BEHAVIOR If Reference Counter of container is zero before call. \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *Release)(struct mfxRefInterface* ref_interface); + /*! @brief + Returns current reference counter of mfxRefInterface structure. + + @paramin ref_interface Valid interface. + @paramout counter Sets counter to the current reference counter value. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If interface or counter is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxRefInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *GetRefCounter)(struct mfxRefInterface* ref_interface, mfxU32* counter); + mfxHDL reserved4; + +}mfxRefInterface; +MFX_PACK_END() +#endif + +/* Library initialization and deinitialization */ +/*! + This enumerator itemizes implementation types. + The implementation type is a bit OR'ed value of the base type and any decorative flags. + @note This enumerator is for legacy dispatcher compatibility only. The new dispatcher does not use it. + */ +typedef mfxI32 mfxIMPL; +/*! + The application can use the macro MFX_IMPL_BASETYPE(x) to obtain the base implementation type. +*/ +#define MFX_IMPL_BASETYPE(x) (0x00ff & (x)) + +enum { + MFX_IMPL_AUTO = 0x0000, /*!< Auto Selection/In or Not Supported/Out. */ + MFX_IMPL_SOFTWARE = 0x0001, /*!< Pure software implementation. */ + MFX_IMPL_HARDWARE = 0x0002, /*!< Hardware accelerated implementation (default device). */ + MFX_IMPL_AUTO_ANY = 0x0003, /*!< Auto selection of any hardware/software implementation. */ + MFX_IMPL_HARDWARE_ANY = 0x0004, /*!< Auto selection of any hardware implementation. */ + MFX_IMPL_HARDWARE2 = 0x0005, /*!< Hardware accelerated implementation (2nd device). */ + MFX_IMPL_HARDWARE3 = 0x0006, /*!< Hardware accelerated implementation (3rd device). */ + MFX_IMPL_HARDWARE4 = 0x0007, /*!< Hardware accelerated implementation (4th device). */ + MFX_IMPL_RUNTIME = 0x0008, /*!< This value cannot be used for session initialization. It may be returned by the MFXQueryIMPL + function to show that the session has been initialized in run-time mode. */ + MFX_IMPL_VIA_ANY = 0x0100, /*!< Hardware acceleration can go through any supported OS infrastructure. This is the default value. The default value + is used by the legacy Intel(r) Media SDK if none of the MFX_IMPL_VIA_xxx flags are specified by the application. */ + MFX_IMPL_VIA_D3D9 = 0x0200, /*!< Hardware acceleration goes through the Microsoft* Direct3D* 9 infrastructure. */ + MFX_IMPL_VIA_D3D11 = 0x0300, /*!< Hardware acceleration goes through the Microsoft* Direct3D* 11 infrastructure. */ + MFX_IMPL_VIA_VAAPI = 0x0400, /*!< Hardware acceleration goes through the Linux* VA-API infrastructure. */ + MFX_IMPL_VIA_HDDLUNITE = 0x0500, /*!< Hardware acceleration goes through the HDDL* Unite*. */ + + MFX_IMPL_UNSUPPORTED = 0x0000 /*!< One of the MFXQueryIMPL returns. */ +}; + +/* Version Info */ +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! The mfxVersion union describes the version of the implementation.*/ +typedef union { + /*! @brief Structure with Major and Minor fields. */ + /*! @struct Anonymous */ + struct { + /*! @{ + @name Major and Minor fields + Anonymous structure with Major and Minor fields. + */ + mfxU16 Minor; /*!< Minor number of the implementation. */ + mfxU16 Major; /*!< Major number of the implementation. */ + /*! @} */ + }; + mfxU32 Version; /*!< Implementation version number. */ +} mfxVersion; +MFX_PACK_END() + +/*! The mfxPriority enumerator describes the session priority. */ +typedef enum +{ + MFX_PRIORITY_LOW = 0, /*!< Low priority: the session operation halts when high priority tasks are executing and more than 75% of the CPU is being used for normal priority tasks.*/ + MFX_PRIORITY_NORMAL = 1, /*!< Normal priority: the session operation is halted if there are high priority tasks.*/ + MFX_PRIORITY_HIGH = 2 /*!< High priority: the session operation blocks other lower priority session operations.*/ + +} mfxPriority; + +typedef struct _mfxEncryptedData mfxEncryptedData; +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +/*! Defines the buffer that holds compressed video data. */ +typedef struct { + /*! @internal :unnamed(union) @endinternal */ + union { + struct { + mfxEncryptedData* EncryptedData; /*!< Reserved and must be zero. */ + mfxExtBuffer **ExtParam; /*!< Array of extended buffers for additional bitstream configuration. See the ExtendedBufferID enumerator for a complete list of extended buffers. */ + mfxU16 NumExtParam; /*!< The number of extended buffers attached to this structure. */ + mfxU32 CodecId; /*!< Specifies the codec format identifier in the FourCC code. See the CodecFormatFourCC enumerator for details. This optional parameter is required for the simplified decode initialization. */ + + }; + mfxU32 reserved6; + }; + /*! Decode time stamp of the compressed bitstream in units of 90KHz. A value of MFX_TIMESTAMP_UNKNOWN indicates that there is no time stamp. + + This value is calculated by the encoder from the presentation time stamp provided by the application in the mfxFrameSurface1 structure and + from the frame rate provided by the application during the encoder initialization. */ + mfxI64 DecodeTimeStamp; + mfxU64 TimeStamp; /*!< Time stamp of the compressed bitstream in units of 90KHz. A value of MFX_TIMESTAMP_UNKNOWN indicates that there is no time stamp. */ + mfxU8* Data; /*!< Bitstream buffer pointer, 32-bytes aligned. */ + mfxU32 DataOffset; /*!< Next reading or writing position in the bitstream buffer. */ + mfxU32 DataLength; /*!< Size of the actual bitstream data in bytes. */ + mfxU32 MaxLength; /*!< Allocated bitstream buffer size in bytes. */ + + mfxU16 PicStruct; /*!< Type of the picture in the bitstream. Output parameter. */ + mfxU16 FrameType; /*!< Frame type of the picture in the bitstream. Output parameter. */ + mfxU16 DataFlag; /*!< Indicates additional bitstream properties. See the BitstreamDataFlag enumerator for details. */ + mfxU16 reserved2; /*!< Reserved for future use. */ +} mfxBitstream; +MFX_PACK_END() + +/*! Synchronization point object handle. */ +typedef struct _mfxSyncPoint *mfxSyncPoint; + +/*! The GPUCopy enumerator controls usage of GPU accelerated copying between video and system memory in the legacy Intel(r) Media SDK components. */ +enum { + MFX_GPUCOPY_DEFAULT = 0, /*!< Use default mode for the legacy Intel(r) Media SDK implementation. */ + MFX_GPUCOPY_ON = 1, /*!< The hint to enable GPU accelerated copying when it is supported by the library. + If the library doesn't support GPU accelerated copy the operation will be made by CPU. */ + MFX_GPUCOPY_OFF = 2 /*!< Disable GPU accelerated copying. */ +}; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! Specifies advanced initialization parameters. + A zero value in any of the fields indicates that the corresponding field + is not explicitly specified. +*/ +typedef struct { + mfxIMPL Implementation; /*!< Enumerator that indicates the desired legacy Intel(r) Media SDK implementation. */ + mfxVersion Version; /*!< Structure which specifies minimum library version or zero, if not specified. */ + mfxU16 ExternalThreads; /*!< Desired threading mode. Value 0 means internal threading, 1 - external. */ + /*! @internal :unnamed(union) @endinternal */ + union { + struct { + mfxExtBuffer **ExtParam; /*!< Points to an array of pointers to the extra configuration structures; see the ExtendedBufferID enumerator for a list of extended configurations. */ + mfxU16 NumExtParam; /*!< The number of extra configuration structures attached to this structure. */ + }; + mfxU16 reserved25; + }; + mfxU16 GPUCopy; /*!< Enables or disables GPU accelerated copying between video and system memory in legacy Intel(r) Media SDK components. See the GPUCopy enumerator for a list of valid values. */ + mfxU16 reserved21; +} mfxInitParam; +MFX_PACK_END() + +enum { + MFX_EXTBUFF_THREADS_PARAM = MFX_MAKEFOURCC('T','H','D','P') /*!< mfxExtThreadsParam buffer ID. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Specifies options for threads created by this session. Attached to the + mfxInitParam structure during legacy Intel(r) Media SDK session initialization + or to mfxInitializationParam by the dispatcher in MFXCreateSession function. */ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_THREADS_PARAM. */ + + mfxU16 NumThread; /*!< The number of threads. */ + mfxI32 SchedulingType; /*!< Scheduling policy for all threads.*/ + mfxI32 Priority; /*!< Priority for all threads. */ + mfxU16 reserved55; /*!< Reserved for future use. */ +} mfxExtThreadsParam; +MFX_PACK_END() + +/*! The PlatformCodeName enumerator itemizes product code names for platforms. + For details about Intel code names, see ark.intel.com. */ +enum { + MFX_PLATFORM_UNKNOWN = 0, /*!< Unknown platform. */ + MFX_PLATFORM_SANDYBRIDGE = 1, /*!< Intel(r) microarchitecture code name Sandy Bridge. */ + MFX_PLATFORM_IVYBRIDGE = 2, /*!< Intel(r) microarchitecture code name Ivy Bridge. */ + MFX_PLATFORM_HASWELL = 3, /*!< Code name Haswell. */ + MFX_PLATFORM_BAYTRAIL = 4, /*!< Code name Bay Trail. */ + MFX_PLATFORM_BROADWELL = 5, /*!< Intel(r) microarchitecture code name Broadwell. */ + MFX_PLATFORM_CHERRYTRAIL = 6, /*!< Code name Cherry Trail. */ + MFX_PLATFORM_SKYLAKE = 7, /*!< Intel(r) microarchitecture code name Skylake. */ + MFX_PLATFORM_APOLLOLAKE = 8, /*!< Code name Apollo Lake. */ + MFX_PLATFORM_KABYLAKE = 9, /*!< Code name Kaby Lake. */ + MFX_PLATFORM_GEMINILAKE = 10, /*!< Code name Gemini Lake. */ + MFX_PLATFORM_COFFEELAKE = 11, /*!< Code name Coffee Lake. */ + MFX_PLATFORM_CANNONLAKE = 20, /*!< Code name Cannon Lake. */ + MFX_PLATFORM_ICELAKE = 30, /*!< Code name Ice Lake. */ + MFX_PLATFORM_JASPERLAKE = 32, /*!< Code name Jasper Lake. */ + MFX_PLATFORM_ELKHARTLAKE = 33, /*!< Code name Elkhart Lake. */ + MFX_PLATFORM_TIGERLAKE = 40, /*!< Code name Tiger Lake. */ + MFX_PLATFORM_ROCKETLAKE = 42, /*!< Code name Rocket Lake. */ + MFX_PLATFORM_ALDERLAKE_S = 43, /*!< Code name Alder Lake S. */ + MFX_PLATFORM_ALDERLAKE_P = 44, /*!< Code name Alder Lake P. */ + MFX_PLATFORM_ARCTICSOUND_P = 45, + MFX_PLATFORM_XEHP_SDV = 45, /*!< Code name XeHP SDV. */ + MFX_PLATFORM_DG2 = 46, /*!< Code name DG2. */ + MFX_PLATFORM_ATS_M = 46, /*!< Code name ATS-M, same media functionality as DG2. */ + MFX_PLATFORM_ALDERLAKE_N = 55, /*!< Code name Alder Lake N. */ + MFX_PLATFORM_KEEMBAY = 50, /*!< Code name Keem Bay. */ +}; + +/*! The mfxMediaAdapterType enumerator itemizes types of graphics adapters. */ +typedef enum +{ + MFX_MEDIA_UNKNOWN = 0xffff, /*!< Unknown type. */ + MFX_MEDIA_INTEGRATED = 0, /*!< Integrated graphics adapter. */ + MFX_MEDIA_DISCRETE = 1 /*!< Discrete graphics adapter. */ +} mfxMediaAdapterType; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Contains information about hardware platform for the Legacy mode. */ +typedef struct { + mfxU16 CodeName; /*!< Microarchitecture code name. See the PlatformCodeName enumerator for a list of possible values. */ + mfxU16 DeviceId; /*!< Unique identifier of graphics device. */ + mfxU16 MediaAdapterType; /*!< Description of graphics adapter type. See the mfxMediaAdapterType enumerator for a list of possible values. */ + mfxU16 reserved13; /*!< Reserved for future use. */ +} mfxPlatform; +MFX_PACK_END() + + +/* The mfxResourceType enumerator specifies types of different native data frames and buffers. */ +typedef enum { + MFX_RESOURCE_SYSTEM_SURFACE = 1, /*!< System memory. */ + MFX_RESOURCE_VA_SURFACE_PTR = 2, /*!< Pointer to VA surface index. */ + MFX_RESOURCE_VA_SURFACE = MFX_RESOURCE_VA_SURFACE_PTR, /*!< Pointer to VA surface index. */ + MFX_RESOURCE_VA_BUFFER_PTR = 3, /*!< Pointer to VA buffer index. */ + MFX_RESOURCE_VA_BUFFER = MFX_RESOURCE_VA_BUFFER_PTR, /*!< Pointer to VA buffer index. */ + MFX_RESOURCE_DX9_SURFACE = 4, /*!< IDirect3DSurface9. */ + MFX_RESOURCE_DX11_TEXTURE = 5, /*!< ID3D11Texture2D. */ + MFX_RESOURCE_DX12_RESOURCE = 6, /*!< ID3D12Resource. */ + MFX_RESOURCE_DMA_RESOURCE = 7, /*!< DMA resource. */ + MFX_RESOURCE_HDDLUNITE_REMOTE_MEMORY = 8, /*!< HDDL Unite Remote memory handle. */ +} mfxResourceType; + +/*! Maximum allowed length of the implementation name. */ +#define MFX_IMPL_NAME_LEN 32 +/*! Maximum allowed length of the implementation name. */ +#define MFX_STRFIELD_LEN 128 + +#define MFX_DECODERDESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 0) + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! The mfxDecoderDescription structure represents the description of a decoder. */ +typedef struct { + mfxStructVersion Version; /*!< Version of the structure. */ + mfxU16 reserved7; /*!< Reserved for future use. */ + mfxU16 NumCodecs; /*!< Number of supported decoders. */ + /*! This structure represents the decoder description. */ + struct decoder { + mfxU32 CodecID; /*!< Decoder ID in FourCC format. */ + mfxU16 reserved8; /*!< Reserved for future use. */ + mfxU16 MaxcodecLevel; /*!< Maximum supported codec level. See the CodecProfile enumerator for possible values. */ + mfxU16 NumProfiles; /*!< Number of supported profiles. */ + /*! This structure represents the codec profile description. */ + struct decprofile { + mfxU32 Profile; /*!< Profile ID. See the CodecProfile enumerator for possible values.*/ + mfxU16 reserved7; /*!< Reserved for future use. */ + mfxU16 NumMemTypes; /*!< Number of supported memory types. */ + /*! This structure represents the underlying details of the memory type. */ + struct decmemdesc { + mfxResourceType MemHandleType; /*!< Memory handle type. */ + mfxRange32U Width; /*!< Range of supported image widths. */ + mfxRange32U Height; /*!< Range of supported image heights. */ + mfxU16 reserved7; /*!< Reserved for future use. */ + mfxU16 NumColorFormats; /*!< Number of supported output color formats. */ + mfxU32* ColorFormats; /*!< Pointer to the array of supported output color formats (in FOURCC). */ + } * MemDesc; /*!< Pointer to the array of memory types. */ + } * Profiles; /*!< Pointer to the array of profiles supported by the codec. */ + } * Codecs; /*!< Pointer to the array of decoders. */ +} mfxDecoderDescription; +MFX_PACK_END() + +#define MFX_ENCODERDESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 0) + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! This structure represents an encoder description. */ +typedef struct { + mfxStructVersion Version; /*!< Version of the structure. */ + mfxU16 reserved7; /*!< Reserved for future use. */ + mfxU16 NumCodecs; /*!< Number of supported encoders. */ + /*! This structure represents encoder description. */ + struct encoder { + mfxU32 CodecID; /*!< Encoder ID in FourCC format. */ + mfxU16 MaxcodecLevel; /*!< Maximum supported codec level. See the CodecProfile enumerator for possible values. */ + mfxU16 BiDirectionalPrediction; /*!< Indicates B-frames support. */ +#ifdef ONEVPL_EXPERIMENTAL + mfxU16 ReportedStats; /*!< Indicates what type of statistics can be reported: block/slice/tile/frame. */ + mfxU16 reserved6; /*!< Reserved for future use. */ +#else + mfxU16 reserved7; /*!< Reserved for future use. */ +#endif + mfxU16 NumProfiles; /*!< Number of supported profiles. */ + /*! This structure represents the codec profile description. */ + struct encprofile { + mfxU32 Profile; /*!< Profile ID. See the CodecProfile enumerator for possible values.*/ + mfxU16 reserved7; /*!< Reserved for future use. */ + mfxU16 NumMemTypes; /*!< Number of supported memory types. */ + /*! This structure represents the underlying details of the memory type. */ + struct encmemdesc { + mfxResourceType MemHandleType; /*!< Memory handle type. */ + mfxRange32U Width; /*!< Range of supported image widths. */ + mfxRange32U Height; /*!< Range of supported image heights. */ + mfxU16 reserved7; /*!< Reserved for future use. */ + mfxU16 NumColorFormats; /*!< Number of supported input color formats. */ + mfxU32* ColorFormats; /*!< Pointer to the array of supported input color formats (in FOURCC). */ + } * MemDesc; /*!< Pointer to the array of memory types. */ + } * Profiles; /*!< Pointer to the array of profiles supported by the codec. */ + } * Codecs; /*!< Pointer to the array of encoders. */ +} mfxEncoderDescription; +MFX_PACK_END() + +#define MFX_VPPDESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 0) + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! This structure represents VPP description. */ +typedef struct { + mfxStructVersion Version; /*!< Version of the structure. */ + mfxU16 reserved7; /*!< Reserved for future use. */ + mfxU16 NumFilters; /*!< Number of supported VPP filters. */ + /*! This structure represents the VPP filters description. */ + struct filter { + mfxU32 FilterFourCC; /*!< Filter ID in FourCC format. */ + mfxU16 MaxDelayInFrames; /*!< Introduced output delay in frames. */ + mfxU16 reserved7; /*!< Reserved for future use. */ + mfxU16 NumMemTypes; /*!< Number of supported memory types. */ + /*! This structure represents the underlying details of the memory type. */ + struct memdesc { + mfxResourceType MemHandleType; /*!< Memory handle type. */ + mfxRange32U Width; /*!< Range of supported image widths. */ + mfxRange32U Height; /*!< Range of supported image heights. */ + mfxU16 reserved7; /*!< Reserved for future use. */ + mfxU16 NumInFormats; /*!< Number of supported input color formats. */ + /*! This structure represents the input color format description. */ + struct format { + mfxU32 InFormat; /*!< Input color in FourCC format. */ + mfxU16 reserved5; /*!< Reserved for future use. */ + mfxU16 NumOutFormat; /*!< Number of supported output color formats. */ + mfxU32* OutFormats; /*!< Pointer to the array of supported output color formats (in FOURCC). */ + } * Formats; /*!< Pointer to the array of supported formats. */ + } * MemDesc; /*!< Pointer to the array of memory types. */ + } * Filters; /*!< Pointer to the array of supported filters. */ +} mfxVPPDescription; +MFX_PACK_END() + +/*! The current version of mfxDeviceDescription structure. */ +#define MFX_DEVICEDESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 1) + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! This structure represents device description. */ +typedef struct { + mfxStructVersion Version; /*!< Version of the structure. */ + mfxU16 reserved6; /*!< reserved for future use. */ + mfxU16 MediaAdapterType; /*!< Graphics adapter type. See the mfxMediaAdapterType enumerator for a list of possible values. */ + mfxChar DeviceIDMFX_STRFIELD_LEN; /*!< Null terminated string with device ID. */ + mfxU16 NumSubDevices; /*!< Number of available uniform sub-devices. Pure software implementation can report 0. */ + /*! This structure represents sub-device description. */ + struct subdevices { + mfxU32 Index; /*!< Index of the sub-device, started from 0 and increased by 1.*/ + mfxChar SubDeviceIDMFX_STRFIELD_LEN; /*!< Null terminated string with unique sub-device ID, mapped to the system ID. */ + mfxU32 reserved7; /*!< reserved for future use. */ + } * SubDevices; /*!< Pointer to the array of available sub-devices. */ +} mfxDeviceDescription; +MFX_PACK_END() + +/*! This enum itemizes implementation type. */ +typedef enum { + MFX_IMPL_TYPE_SOFTWARE = 0x0001, /*!< Pure Software Implementation. */ + MFX_IMPL_TYPE_HARDWARE = 0x0002, /*!< Hardware Accelerated Implementation. */ +} mfxImplType; + +/*! This enum itemizes hardware acceleration stack to use. */ +typedef enum { + MFX_ACCEL_MODE_NA = 0, /*!< Hardware acceleration is not applicable. */ + MFX_ACCEL_MODE_VIA_D3D9 = 0x0200, /*!< Hardware acceleration goes through the Microsoft* Direct3D9* infrastructure. */ + MFX_ACCEL_MODE_VIA_D3D11 = 0x0300, /*!< Hardware acceleration goes through the Microsoft* Direct3D11* infrastructure. */ + MFX_ACCEL_MODE_VIA_VAAPI = 0x0400, /*!< Hardware acceleration goes through the Linux* VA-API infrastructure. */ + MFX_ACCEL_MODE_VIA_VAAPI_DRM_RENDER_NODE = MFX_ACCEL_MODE_VIA_VAAPI, /*!< Hardware acceleration goes through the Linux* VA-API infrastructure with DRM RENDER MODE as default acceleration access point. */ + MFX_ACCEL_MODE_VIA_VAAPI_DRM_MODESET = 0x0401, /*!< Hardware acceleration goes through the Linux* VA-API infrastructure with DRM MODESET as default acceleration access point. */ + MFX_ACCEL_MODE_VIA_VAAPI_GLX = 0x0402, /*! Hardware acceleration goes through the Linux* VA-API infrastructure with OpenGL Extension to the X Window System + as default acceleration access point. */ + MFX_ACCEL_MODE_VIA_VAAPI_X11 = 0x0403, /*!< Hardware acceleration goes through the Linux* VA-API infrastructure with X11 as default acceleration access point. */ + MFX_ACCEL_MODE_VIA_VAAPI_WAYLAND = 0x0404, /*!< Hardware acceleration goes through the Linux* VA-API infrastructure with Wayland as default acceleration access point. */ + MFX_ACCEL_MODE_VIA_HDDLUNITE = 0x0500, /*!< Hardware acceleration goes through the HDDL* Unite*. */ +} mfxAccelerationMode; + +#define MFX_ACCELERATIONMODESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 0) + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! This structure represents acceleration modes description. */ +typedef struct { + mfxStructVersion Version; /*!< Version of the structure. */ + mfxU16 reserved2; /*!< reserved for future use. */ + mfxU16 NumAccelerationModes; /*!< Number of supported acceleration modes. */ + mfxAccelerationMode* Mode; /*!< Pointer to the array of supported acceleration modes. */ +} mfxAccelerationModeDescription; +MFX_PACK_END() + +/*! Specifies the surface pool allocation policies. */ + typedef enum { + /*! Recommends to limit max pool size by sum of requested surfaces asked by components. */ + MFX_ALLOCATION_OPTIMAL = 0, + + /*! Dynamic allocation with no limit. */ + MFX_ALLOCATION_UNLIMITED = 1, + + /*! Max pool size is limited by NumberToPreAllocate + DeltaToAllocateOnTheFly. */ + MFX_ALLOCATION_LIMITED = 2, + +} mfxPoolAllocationPolicy; + +/*! The current version of mfxPoolPolicyDescription structure. */ +#define MFX_POOLPOLICYDESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 0) + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! This structure represents pool policy description. */ +typedef struct { + mfxStructVersion Version; /*!< Version of the structure. */ + mfxU16 reserved2; /*!< reserved for future use. */ + mfxU16 NumPoolPolicies; /*!< Number of supported pool policies. */ + mfxPoolAllocationPolicy* Policy; /*!< Pointer to the array of supported pool policies. */ +} mfxPoolPolicyDescription; +MFX_PACK_END() + +/*! The current version of mfxImplDescription structure. */ +#define MFX_IMPLDESCRIPTION_VERSION MFX_STRUCT_VERSION(1, 2) + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! This structure represents the implementation description. */ +typedef struct { + mfxStructVersion Version; /*!< Version of the structure. */ + mfxImplType Impl; /*!< Impl type: software/hardware. */ + mfxAccelerationMode AccelerationMode; /*!< Default Hardware acceleration stack to use. OS dependent parameter. Use VA for Linux* and DX* for Windows*. */ + mfxVersion ApiVersion; /*!< Supported API version. */ + mfxChar ImplNameMFX_IMPL_NAME_LEN; /*!< Null-terminated string with implementation name given by vendor. */ + mfxChar LicenseMFX_STRFIELD_LEN; /*!< Null-terminated string with comma-separated list of license names of the implementation. */ + mfxChar KeywordsMFX_STRFIELD_LEN; /*!< Null-terminated string with comma-separated list of keywords specific to this implementation that dispatcher can search for. */ + mfxU32 VendorID; /*!< Standard vendor ID 0x8086 - Intel. */ + mfxU32 VendorImplID; /*!< Vendor specific number with given implementation ID. */ + mfxDeviceDescription Dev; /*!< Supported device. */ + mfxDecoderDescription Dec; /*!< Decoder configuration. */ + mfxEncoderDescription Enc; /*!< Encoder configuration. */ + mfxVPPDescription VPP; /*!< VPP configuration. */ + union + { + mfxAccelerationModeDescription AccelerationModeDescription; /*!< Supported acceleration modes. */ + mfxU32 reserved34; + }; + mfxPoolPolicyDescription PoolPolicies; /*!< Supported surface pool polices. */ + mfxU32 reserved8; /*!< Reserved for future use. */ + mfxU32 NumExtParam; /*!< Number of extension buffers. Reserved for future use. Must be 0. */ + union { + mfxExtBuffer **ExtParam; /*!< Array of extension buffers. */ + mfxU64 Reserved2; /*!< Reserved for future use. */ + } ExtParams; /*!< Extension buffers. Reserved for future. */ +} mfxImplDescription; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! This structure represents the list of names of implemented functions. */ +typedef struct { + mfxU16 NumFunctions; /*!< Number of function names in the FunctionsName array. */ + mfxChar** FunctionsName; /*!< Array of the null-terminated strings. Each string contains name of the implemented function. */ +} mfxImplementedFunctions; +MFX_PACK_END() + +#ifdef ONEVPL_EXPERIMENTAL + +#define MFX_EXTENDEDDEVICEID_VERSION MFX_STRUCT_VERSION(1, 0) + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Specifies variouse physical device properties for device matching and identification outside of oneVPL. */ +typedef struct { + mfxStructVersion Version; /*!< Version of the structure. */ + mfxU16 VendorID; /*!< PCI vendor ID. */ + mfxU16 DeviceID; /*!< PCI device ID. */ + mfxU32 PCIDomain; /*!< PCI bus domain. Equals to '0' if OS doesn't support it or + has sequential numbering of buses accross domains. */ + mfxU32 PCIBus; /*!< The number of the bus that the physical device is located on. */ + mfxU32 PCIDevice; /*!< The index of the physical device on the bus. */ + mfxU32 PCIFunction; /*!< The function number of the device on the physical device. */ + mfxU8 DeviceLUID8; /*!< LUID of DXGI adapter. */ + mfxU32 LUIDDeviceNodeMask; /*!< Bitfield identifying the node within a linked + device adapter corresponding to the device. */ + mfxU32 LUIDValid; /*!< Boolean value that will be 1 if DeviceLUID contains a valid LUID + and LUIDDeviceNodeMask contains a valid node mask, + and 0 if they do not. */ + mfxU32 DRMRenderNodeNum; /*!< Number of the DRM render node from the path /dev/dri/RenderD<num>. + Value equals to 0 means that this field doesn't contain valid DRM Render + Node number.*/ + mfxU32 DRMPrimaryNodeNum; /*!< Number of the DRM primary node from the path /dev/dri/card<num>. + Value equals to 0x7FFFFFFF means that this field doesn't contain valid DRM Primary + Node number.*/ + mfxU8 reserved120; /*!< Reserved for future use. */ + mfxChar DeviceNameMFX_STRFIELD_LEN; /*!< Null-terminated string in utf-8 with the name of the device. */ +} mfxExtendedDeviceId; +MFX_PACK_END() + +#endif + +/* The mfxImplCapsDeliveryFormat enumerator specifies delivery format of the implementation capability. */ +typedef enum { + MFX_IMPLCAPS_IMPLDESCSTRUCTURE = 1, /*!< Deliver capabilities as mfxImplDescription structure. */ + MFX_IMPLCAPS_IMPLEMENTEDFUNCTIONS = 2, /*!< Deliver capabilities as mfxImplementedFunctions structure. */ + MFX_IMPLCAPS_IMPLPATH = 3, /*!< Deliver pointer to the null-terminated string with the path to the + implementation. String is delivered in a form of buffer of + mfxChar type. */ +#ifdef ONEVPL_EXPERIMENTAL + MFX_IMPLCAPS_DEVICE_ID_EXTENDED = 4 /*!< Deliver extended device ID information as mfxExtendedDeviceId + structure.*/ +#endif +} mfxImplCapsDeliveryFormat; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! Specifies initialization parameters for API version starting from 2.0. +*/ +typedef struct { + mfxAccelerationMode AccelerationMode; /*!< Hardware acceleration stack to use. OS dependent parameter. Use VA for Linux*, DX* for Windows* or HDDL. */ +#ifdef ONEVPL_EXPERIMENTAL + mfxU16 DeviceCopy; /*!< Enables or disables device's accelerated copying between device and + host. See the GPUCopy enumerator for a list of valid values. + This parameter is the equivalent of mfxInitParam::GPUCopy. */ + mfxU16 reserved2; /*!< Reserved for future use. */ +#else + mfxU16 reserved3; /*!< Reserved for future use. */ +#endif + mfxU16 NumExtParam; /*!< The number of extra configuration structures attached to this + structure. */ + mfxExtBuffer **ExtParam; /*!< Points to an array of pointers to the extra configuration structures; + see the ExtendedBufferID enumerator for a list of extended + configurations. */ + mfxU32 VendorImplID; /*!< Vendor specific number with given implementation ID. Represents + the same field from mfxImplDescription. */ + mfxU32 reserved23; /*!< Reserved for future use. */ +} mfxInitializationParam; +MFX_PACK_END() + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxdefs.h
Added
@@ -0,0 +1,337 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFXDEFS_H__ +#define __MFXDEFS_H__ + +#define MFX_VERSION_MAJOR 2 +#define MFX_VERSION_MINOR 7 + +// MFX_VERSION - version of API that 'assumed' by build may be provided externally +// if it omitted then latest stable API derived from Major.Minor is assumed + + +#if !defined(MFX_VERSION) + #define MFX_VERSION (MFX_VERSION_MAJOR * 1000 + MFX_VERSION_MINOR) +#else + #undef MFX_VERSION_MAJOR + #define MFX_VERSION_MAJOR ((MFX_VERSION) / 1000) + + #undef MFX_VERSION_MINOR + #define MFX_VERSION_MINOR ((MFX_VERSION) % 1000) +#endif + +/*! The corresponding version of the Intel(r) Media SDK legacy API that is used as a basis + for the current API. */ + +#define MFX_LEGACY_VERSION 1035 + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* In preprocessor syntax # symbol has stringize meaning, + so to expand some macro to preprocessor pragma we need to use + special compiler dependent construction */ + +#if defined(_MSC_VER) + #define MFX_PRAGMA_IMPL(x) __pragma(x) +#else + #define MFX_PRAGMA_IMPL(x) _Pragma(#x) +#endif + +#define MFX_PACK_BEGIN_X(x) MFX_PRAGMA_IMPL(pack(push, x)) +#define MFX_PACK_END() MFX_PRAGMA_IMPL(pack(pop)) + +/* The general rule for alignment is following: + - structures with pointers have 4/8 bytes alignment on 32/64 bit systems + - structures with fields of type mfxU64/mfxF64 (unsigned long long / double) + have alignment 8 bytes on 64 bit and 32 bit Windows, on Linux alignment is 4 bytes + - all the rest structures are 4 bytes aligned + - there are several exceptions: some structs which had 4-byte alignment were extended + with pointer / long type fields; such structs have 4-byte alignment to keep binary + compatibility with previously release API */ + +#define MFX_PACK_BEGIN_USUAL_STRUCT() MFX_PACK_BEGIN_X(4) + +/* 64-bit LP64 data model */ +#if defined(_WIN64) || defined(__LP64__) + #define MFX_PACK_BEGIN_STRUCT_W_PTR() MFX_PACK_BEGIN_X(8) + #define MFX_PACK_BEGIN_STRUCT_W_L_TYPE() MFX_PACK_BEGIN_X(8) +/* 32-bit ILP32 data model Windows* (Intel(r) architecture) */ +#elif defined(_WIN32) || defined(_M_IX86) && !defined(__linux__) + #define MFX_PACK_BEGIN_STRUCT_W_PTR() MFX_PACK_BEGIN_X(4) + #define MFX_PACK_BEGIN_STRUCT_W_L_TYPE() MFX_PACK_BEGIN_X(8) +/* 32-bit ILP32 data model Linux* */ +#elif defined(__ILP32__) + #define MFX_PACK_BEGIN_STRUCT_W_PTR() MFX_PACK_BEGIN_X(4) + #define MFX_PACK_BEGIN_STRUCT_W_L_TYPE() MFX_PACK_BEGIN_X(4) +#else + #error Unknown packing +#endif + +#ifdef _WIN32 + #define MFX_CDECL __cdecl + #define MFX_STDCALL __stdcall +#else + #define MFX_CDECL + #define MFX_STDCALL +#endif /* _WIN32 */ + +#define MFX_INFINITE 0xFFFFFFFF + +#ifndef MFX_DEPRECATED_OFF + #if defined(__cplusplus) && __cplusplus >= 201402L + #define MFX_DEPRECATED deprecated + #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg deprecated + #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) + #elif defined(__clang__) + #define MFX_DEPRECATED __attribute__((deprecated)) + #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg __attribute__((deprecated)) + #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) + #elif defined(__INTEL_COMPILER) + #if (defined(_WIN32) || defined(_WIN64)) + #define MFX_DEPRECATED __declspec(deprecated) + #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg + #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) __pragma(deprecated(arg)) + #elif defined(__linux__) + #define MFX_DEPRECATED __attribute__((deprecated)) + #if defined(__cplusplus) + #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg __attribute__((deprecated)) + #else + #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg + #endif + #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) + #endif + #elif defined(_MSC_VER) && _MSC_VER > 1200 // VS 6 doesn't support deprecation + #define MFX_DEPRECATED __declspec(deprecated) + #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg + #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) __pragma(deprecated(arg)) + #elif defined(__GNUC__) + #define MFX_DEPRECATED __attribute__((deprecated)) + #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg __attribute__((deprecated)) + #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) + #else + #define MFX_DEPRECATED + #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg + #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) + #endif + #else + #define MFX_DEPRECATED + #define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg + #define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) + #endif + +typedef unsigned char mfxU8; /*!< Unsigned integer, 8 bit type. */ +typedef char mfxI8; /*!< Signed integer, 8 bit type. */ +typedef short mfxI16; /*!< Signed integer, 16 bit type. */ +typedef unsigned short mfxU16; /*!< Unsigned integer, 16 bit type. */ +typedef unsigned int mfxU32; /*!< Unsigned integer, 32 bit type. */ +typedef int mfxI32; /*!< Signed integer, 32 bit type. */ +#if defined( _WIN32 ) || defined ( _WIN64 ) +typedef unsigned long mfxUL32; /*!< Unsigned integer, 32 bit type. */ +typedef long mfxL32; /*!< Signed integer, 32 bit type. */ +#else +typedef unsigned int mfxUL32; /*!< Unsigned integer, 32 bit type. */ +typedef int mfxL32; /*!< Signed integer, 32 bit type. */ +#endif +typedef float mfxF32; /*!< Single-precision floating point, 32 bit type. */ +typedef double mfxF64; /*!< Double-precision floating point, 64 bit type. */ +typedef unsigned long long mfxU64; /*!< Unsigned integer, 64 bit type. */ +typedef long long mfxI64; /*!< Signed integer, 64 bit type. */ +typedef void* mfxHDL; /*!< Handle type. */ +typedef mfxHDL mfxMemId; /*!< Memory ID type. */ +typedef void* mfxThreadTask; /*!< Thread task type. */ +typedef char mfxChar; /*!< UTF-8 byte. */ + +/* MFX structures version info */ +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Introduce the field Version for any structure. +Assumed that any structure changes are backward binary compatible. + mfxStructVersion starts from {1,0} for any new API structures. If mfxStructVersion is + added to the existent legacy structure (replacing reserved fields) it starts from {1, 1}. +*/ +typedef union { + /*! Structure with Major and Minor fields. */ + /*! @struct Anonymous */ + struct { + /*! @{ + @name Major and Minor fields + Anonymous structure with Major and Minor fields. Minor number is incremented when reserved fields are used. Major number is incremented when the size of structure is increased. */ + mfxU8 Minor; /*!< Minor number of the correspondent structure. */ + mfxU8 Major; /*!< Major number of the correspondent structure. */ + /*! @} */ + }; + mfxU16 Version; /*!< Structure version number. */ +} mfxStructVersion; +MFX_PACK_END() + +#define MFX_STRUCT_VERSION(MAJOR, MINOR) (256*(MAJOR) + (MINOR)) + + +#define MFX_VARIANT_VERSION MFX_STRUCT_VERSION(1, 0) + +/*! The mfxDataType enumerates data type for mfxDataType. */ +typedef enum { + MFX_DATA_TYPE_UNSET = 0, /*!< Undefined type. */ + MFX_DATA_TYPE_U8, /*!< 8-bit unsigned integer. */ + MFX_DATA_TYPE_I8, /*!< 8-bit signed integer. */ + MFX_DATA_TYPE_U16, /*!< 16-bit unsigned integer. */ + MFX_DATA_TYPE_I16, /*!< 16-bit signed integer. */ + MFX_DATA_TYPE_U32, /*!< 32-bit unsigned integer. */ + MFX_DATA_TYPE_I32, /*!< 32-bit signed integer. */ + MFX_DATA_TYPE_U64, /*!< 64-bit unsigned integer. */ + MFX_DATA_TYPE_I64, /*!< 64-bit signed integer. */ + MFX_DATA_TYPE_F32, /*!< 32-bit single precision floating point. */ + MFX_DATA_TYPE_F64, /*!< 64-bit double precision floating point. */ +}mfxDataType; + +/*! The mfxVariantType enumerator data types for mfxVariantType. */ +typedef enum { + MFX_VARIANT_TYPE_UNSET = MFX_DATA_TYPE_UNSET, /*!< Undefined type. */ + MFX_VARIANT_TYPE_U8 = MFX_DATA_TYPE_U8, /*!< 8-bit unsigned integer. */ + MFX_VARIANT_TYPE_I8 = MFX_DATA_TYPE_I8, /*!< 8-bit signed integer. */ + MFX_VARIANT_TYPE_U16 = MFX_DATA_TYPE_U16, /*!< 16-bit unsigned integer. */ + MFX_VARIANT_TYPE_I16 = MFX_DATA_TYPE_I16, /*!< 16-bit signed integer. */ + MFX_VARIANT_TYPE_U32 = MFX_DATA_TYPE_U32, /*!< 32-bit unsigned integer. */ + MFX_VARIANT_TYPE_I32 = MFX_DATA_TYPE_I32, /*!< 32-bit signed integer. */ + MFX_VARIANT_TYPE_U64 = MFX_DATA_TYPE_U64, /*!< 64-bit unsigned integer. */ + MFX_VARIANT_TYPE_I64 = MFX_DATA_TYPE_I64, /*!< 64-bit signed integer. */ + MFX_VARIANT_TYPE_F32 = MFX_DATA_TYPE_F32, /*!< 32-bit single precision floating point. */ + MFX_VARIANT_TYPE_F64 = MFX_DATA_TYPE_F64, /*!< 64-bit double precision floating point. */ + MFX_VARIANT_TYPE_PTR, /*!< Generic type pointer. */ +} mfxVariantType; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! The mfxVariantType enumerator data types for mfxVariant type. */ +typedef struct { + mfxStructVersion Version; /*!< Version of the structure. */ + mfxVariantType Type; /*!< Value type. */ + /*! Value data holder. */ + union data { + mfxU8 U8; /*!< mfxU8 data. */ + mfxI8 I8; /*!< mfxI8 data. */ + mfxU16 U16; /*!< mfxU16 data. */ + mfxI16 I16; /*!< mfxI16 data. */ + mfxU32 U32; /*!< mfxU32 data. */ + mfxI32 I32; /*!< mfxI32 data. */ + mfxU64 U64; /*!< mfxU64 data. */ + mfxI64 I64; /*!< mfxI64 data. */ + mfxF32 F32; /*!< mfxF32 data. */ + mfxF64 F64; /*!< mfxF64 data. */ + mfxHDL Ptr; /*!< Pointer. When this points to a string the string must be null terminated. */ + } Data; /*!< Value data member. */ +} mfxVariant; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Represents a range of unsigned values. */ +typedef struct { + mfxU32 Min; /*!< Minimal value of the range. */ + mfxU32 Max; /*!< Maximal value of the range. */ + mfxU32 Step; /*!< Value increment. */ +} mfxRange32U; +MFX_PACK_END() + + +/*! Represents a pair of numbers of type mfxI16. */ +typedef struct { + mfxI16 x; /*!< First number. */ + mfxI16 y; /*!< Second number. */ +} mfxI16Pair; + +/*! Represents pair of handles of type mfxHDL. */ +typedef struct { + mfxHDL first; /*!< First handle. */ + mfxHDL second; /*!< Second handle. */ +} mfxHDLPair; + + +/*********************************************************************************\ +Error message +\*********************************************************************************/ +/*! @enum mfxStatus Itemizes status codes returned by API functions. */ +typedef enum +{ + /* no error */ + MFX_ERR_NONE = 0, /*!< No error. */ + /* reserved for unexpected errors */ + MFX_ERR_UNKNOWN = -1, /*!< Unknown error. */ + + /* error codes <0 */ + MFX_ERR_NULL_PTR = -2, /*!< Null pointer. */ + MFX_ERR_UNSUPPORTED = -3, /*!< Unsupported feature. */ + MFX_ERR_MEMORY_ALLOC = -4, /*!< Failed to allocate memory. */ + MFX_ERR_NOT_ENOUGH_BUFFER = -5, /*!< Insufficient buffer at input/output. */ + MFX_ERR_INVALID_HANDLE = -6, /*!< Invalid handle. */ + MFX_ERR_LOCK_MEMORY = -7, /*!< Failed to lock the memory block. */ + MFX_ERR_NOT_INITIALIZED = -8, /*!< Member function called before initialization. */ + MFX_ERR_NOT_FOUND = -9, /*!< The specified object is not found. */ + MFX_ERR_MORE_DATA = -10, /*!< Expect more data at input. */ + MFX_ERR_MORE_SURFACE = -11, /*!< Expect more surface at output. */ + MFX_ERR_ABORTED = -12, /*!< Operation aborted. */ + MFX_ERR_DEVICE_LOST = -13, /*!< Lose the hardware acceleration device. */ + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM = -14, /*!< Incompatible video parameters. */ + MFX_ERR_INVALID_VIDEO_PARAM = -15, /*!< Invalid video parameters. */ + MFX_ERR_UNDEFINED_BEHAVIOR = -16, /*!< Undefined behavior. */ + MFX_ERR_DEVICE_FAILED = -17, /*!< Device operation failure. */ + MFX_ERR_MORE_BITSTREAM = -18, /*!< Expect more bitstream buffers at output. */ + MFX_ERR_GPU_HANG = -21, /*!< Device operation failure caused by GPU hang. */ + MFX_ERR_REALLOC_SURFACE = -22, /*!< Bigger output surface required. */ + MFX_ERR_RESOURCE_MAPPED = -23, /*!< Write access is already acquired and user requested + another write access, or read access with MFX_MEMORY_NO_WAIT flag. */ + MFX_ERR_NOT_IMPLEMENTED = -24, /*!< Feature or function not implemented. */ + /* warnings >0 */ + MFX_WRN_IN_EXECUTION = 1, /*!< The previous asynchronous operation is in execution. */ + MFX_WRN_DEVICE_BUSY = 2, /*!< The hardware acceleration device is busy. */ + MFX_WRN_VIDEO_PARAM_CHANGED = 3, /*!< The video parameters are changed during decoding. */ + MFX_WRN_PARTIAL_ACCELERATION = 4, /*!< Software acceleration is used. */ + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM = 5, /*!< Incompatible video parameters. */ + MFX_WRN_VALUE_NOT_CHANGED = 6, /*!< The value is saturated based on its valid range. */ + MFX_WRN_OUT_OF_RANGE = 7, /*!< The value is out of valid range. */ + MFX_WRN_FILTER_SKIPPED = 10, /*!< One of requested filters has been skipped. */ + /* low-delay partial output */ + MFX_ERR_NONE_PARTIAL_OUTPUT = 12, /*!< Frame is not ready, but bitstream contains partial output. */ + + MFX_WRN_ALLOC_TIMEOUT_EXPIRED = 13, /*!< Timeout expired for internal frame allocation. */ + + /* threading statuses */ + MFX_TASK_DONE = MFX_ERR_NONE, /*!< Task has been completed. */ + MFX_TASK_WORKING = 8, /*!< There is some more work to do. */ + MFX_TASK_BUSY = 9, /*!< Task is waiting for resources. */ + + /* plug-in statuses */ + MFX_ERR_MORE_DATA_SUBMIT_TASK = -10000, /*!< Return MFX_ERR_MORE_DATA but submit internal asynchronous task. */ + +} mfxStatus; + + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Represents Globally Unique Identifier (GUID) with memory layout + compliant to RFC 4122. See https://www.rfc-editor.org/info/rfc4122 for details. */ +typedef struct +{ + mfxU8 Data16; /*!< Array to keep GUID. */ +} mfxGUID; +MFX_PACK_END() + + + +// Application +#if defined(MFX_DISPATCHER_EXPOSED_PREFIX) + +#include "mfxdispatcherprefixedfunctions.h" + +#endif // MFX_DISPATCHER_EXPOSED_PREFIX + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __MFXDEFS_H__ */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxdispatcher.h
Added
@@ -0,0 +1,247 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFXDISPATCHER_H__ +#define __MFXDISPATCHER_H__ + +#include "mfxdefs.h" +#include "mfxcommon.h" +#include "mfxsession.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! Loader handle. */ +typedef struct _mfxLoader *mfxLoader; + +/*! Config handle. */ +typedef struct _mfxConfig *mfxConfig; + +/*! + @brief Creates the loader. + @return Loader Loader handle or NULL if failed. + + @since This function is available since API version 2.0. +*/ +mfxLoader MFX_CDECL MFXLoad(void); + +/*! + @brief Destroys the dispatcher. + @paramin loader Loader handle. + + @since This function is available since API version 2.0. +*/ +void MFX_CDECL MFXUnload(mfxLoader loader); + +/*! + @brief Creates dispatcher configuration. + @details Creates the dispatcher internal configuration, which is used to filter out available implementations. + This configuration is used to walk through selected implementations to gather more details and select the appropriate + implementation to load. The loader object remembers all created mfxConfig objects and destroys them during the mfxUnload + function call. + + Multiple configurations per single mfxLoader object are possible. + + Usage example: + @code + mfxLoader loader = MFXLoad(); + mfxConfig cfg = MFXCreateConfig(loader); + MFXCreateSession(loader,0,&session); + @endcode + @paramin loader Loader handle. + @return Config handle or NULL pointer is failed. + + @since This function is available since API version 2.0. +*/ +mfxConfig MFX_CDECL MFXCreateConfig(mfxLoader loader); + +/*! + @brief Adds additional filter properties (any fields of the mfxImplDescription structure) to the configuration of the loader object. + One mfxConfig properties can hold only single filter property. + @note Each new call with the same parameter name will overwrite the previously set value. This may invalidate other properties. + @note Each new call with another parameter name will delete the previous property and create a new property based on new name's value. + + @paramin config Config handle. + @paramin name Name of the parameter (see mfxImplDescription structure and example). + @paramin value Value of the parameter. + @return + MFX_ERR_NONE The function completed successfully. + MFX_ERR_NULL_PTR If config is NULL. \n + MFX_ERR_NULL_PTR If name is NULL. \n + MFX_ERR_NOT_FOUND If name contains unknown parameter name. + MFX_ERR_UNSUPPORTED If value data type does not equal the parameter with provided name. + + @since This function is available since API version 2.0. +*/ +mfxStatus MFX_CDECL MFXSetConfigFilterProperty(mfxConfig config, const mfxU8* name, mfxVariant value); + +/*! + @brief Iterates over filtered out implementations to gather their details. This function allocates memory to store + mfxImplDescription structure instance. Use the MFXDispReleaseImplDescription function to free memory allocated to the mfxImplDescription structure. + @paramin loader Loader handle. + @paramin i Index of the implementation. + @paramin format Format in which capabilities need to be delivered. See the mfxImplCapsDeliveryFormat enumerator for more details. + @paramout idesc Pointer to the mfxImplDescription structure. + @return + MFX_ERR_NONE The function completed successfully. The idesc contains valid information.\n + MFX_ERR_NULL_PTR If loader is NULL. \n + MFX_ERR_NULL_PTR If idesc is NULL. \n + MFX_ERR_NOT_FOUND Provided index is out of possible range. \n + MFX_ERR_UNSUPPORTED If requested format is not supported. + + @since This function is available since API version 2.0. +*/ +mfxStatus MFX_CDECL MFXEnumImplementations(mfxLoader loader, mfxU32 i, mfxImplCapsDeliveryFormat format, mfxHDL* idesc); + + +/*! + @brief Loads and initializes the implementation. + @code + mfxLoader loader = MFXLoad(); + int i=0; + while(1) { + mfxImplDescription *idesc; + MFXEnumImplementations(loader, i, MFX_IMPLCAPS_IMPLDESCSTRUCTURE, (mfxHDL*)&idesc); + if(is_good(idesc)) { + MFXCreateSession(loader, i,&session); + // ... + MFXDispReleaseImplDescription(loader, idesc); + } + else + { + MFXDispReleaseImplDescription(loader, idesc); + break; + } + } + @endcode + @paramin loader Loader handle. + @paramin i Index of the implementation. + @paramout session Pointer to the session handle. + @return + MFX_ERR_NONE The function completed successfully. The session contains a pointer to the session handle.\n + MFX_ERR_NULL_PTR If loader is NULL. \n + MFX_ERR_NULL_PTR If session is NULL. \n + MFX_ERR_NOT_FOUND Provided index is out of possible range. + + @since This function is available since API version 2.0. +*/ +mfxStatus MFX_CDECL MFXCreateSession(mfxLoader loader, mfxU32 i, mfxSession* session); + +/*! + @brief + Destroys handle allocated by the MFXEnumImplementations function. + + @paramin loader Loader handle. + @paramin hdl Handle to destroy. Can be equal to NULL. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_NULL_PTR If loader is NULL. \n + MFX_ERR_INVALID_HANDLE Provided hdl handle is not associated with this loader. + + @since This function is available since API version 2.0. +*/ +mfxStatus MFX_CDECL MFXDispReleaseImplDescription(mfxLoader loader, mfxHDL hdl); + +/* Helper macro definitions to add config filter properties. */ + +/*! Adds single property of mfxU32 type. + @paramin loader Valid mfxLoader object + @paramin name Property name string + @paramin value Property value +*/ +#define MFX_ADD_PROPERTY_U32(loader, name, value) \ +{ \ + mfxVariant impl_value; \ + mfxConfig cfg = MFXCreateConfig(loader); \ + impl_value.Version.Version = MFX_VARIANT_VERSION; \ + impl_value.Type = MFX_VARIANT_TYPE_U32; \ + impl_value.Data.U32 = value; \ + MFXSetConfigFilterProperty(cfg, (mfxU8 *)name, impl_value); \ +} + +/*! Adds single property of mfxU16 type. + @paramin loader Valid mfxLoader object + @paramin name Property name string + @paramin value Property value +*/ +#define MFX_ADD_PROPERTY_U16(loader, name, value) \ +{ \ + mfxVariant impl_value = { 0 }; \ + mfxConfig cfg = MFXCreateConfig(loader); \ + impl_value.Version.Version = MFX_VARIANT_VERSION; \ + impl_value.Type = MFX_VARIANT_TYPE_U16; \ + impl_value.Data.U16 = value; \ + MFXSetConfigFilterProperty(cfg, (mfxU8 *)name, impl_value); \ +} + +/*! Adds single property of pointer type. + @paramin loader Valid mfxLoader object + @paramin name Property name string + @paramin value Property value +*/ +#define MFX_ADD_PROPERTY_PTR(loader, name, value) \ +{ \ + mfxVariant impl_value = { 0 }; \ + mfxConfig cfg = MFXCreateConfig(loader); \ + impl_value.Version.Version = MFX_VARIANT_VERSION; \ + impl_value.Type = MFX_VARIANT_TYPE_PTR; \ + impl_value.Data.Ptr = (mfxHDL)value; \ + MFXSetConfigFilterProperty(cfg, (mfxU8 *)name, impl_value); \ +} + +/*! Update existing property of mfxU32 type. + @paramin loader Valid mfxLoader object + @paramin config Valid mfxConfig object + @paramin name Property name string + @paramin value Property value +*/ +#define MFX_UPDATE_PROPERTY_U32(loader, config, name, value) \ +{ \ + mfxVariant impl_value; \ + impl_value.Version.Version = MFX_VARIANT_VERSION; \ + impl_value.Type = MFX_VARIANT_TYPE_U32; \ + impl_value.Data.U32 = value; \ + MFXSetConfigFilterProperty(config, (mfxU8 *)name, impl_value); \ +} + +/*! Update existing property of mfxU16 type. + @paramin loader Valid mfxLoader object + @paramin config Valid mfxConfig object + @paramin name Property name string + @paramin value Property value +*/ +#define MFX_UPDATE_PROPERTY_U16(loader, config, name, value) \ +{ \ + mfxVariant impl_value; \ + impl_value.Version.Version = MFX_VARIANT_VERSION; \ + impl_value.Type = MFX_VARIANT_TYPE_U16; \ + impl_value.Data.U16 = value; \ + MFXSetConfigFilterProperty(config, (mfxU8 *)name, impl_value); \ +} + +/*! Update existing property of pointer type. + @paramin loader Valid mfxLoader object + @paramin config Valid mfxConfig object + @paramin name Property name string + @paramin value Property value +*/ +#define MFX_UPDATE_PROPERTY_PTR(loader, config, name, value) \ +{ \ + mfxVariant impl_value; \ + impl_value.Version.Version = MFX_VARIANT_VERSION; \ + impl_value.Type = MFX_VARIANT_TYPE_PTR; \ + impl_value.Data.Ptr = (mfxHDL)value; \ + MFXSetConfigFilterProperty(config, (mfxU8 *)name, impl_value); \ +} + +#ifdef __cplusplus +} +#endif + +#endif +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxdispatcherprefixedfunctions.h
Added
@@ -0,0 +1,150 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFXDISPATCHERPREFIXEDFUNCTIONS_H__ +#define __MFXDISPATCHERPREFIXEDFUNCTIONS_H__ + +// API 1.0 functions +#define MFXInit disp_MFXInit +#define MFXClose disp_MFXClose +#define MFXQueryIMPL disp_MFXQueryIMPL +#define MFXQueryVersion disp_MFXQueryVersion + +#define MFXJoinSession disp_MFXJoinSession +#define MFXDisjoinSession disp_MFXDisjoinSession +#define MFXCloneSession disp_MFXCloneSession +#define MFXSetPriority disp_MFXSetPriority +#define MFXGetPriority disp_MFXGetPriority + +#define MFXVideoCORE_SetFrameAllocator disp_MFXVideoCORE_SetFrameAllocator +#define MFXVideoCORE_SetHandle disp_MFXVideoCORE_SetHandle +#define MFXVideoCORE_GetHandle disp_MFXVideoCORE_GetHandle +#define MFXVideoCORE_SyncOperation disp_MFXVideoCORE_SyncOperation + +#define MFXVideoENCODE_Query disp_MFXVideoENCODE_Query +#define MFXVideoENCODE_QueryIOSurf disp_MFXVideoENCODE_QueryIOSurf +#define MFXVideoENCODE_Init disp_MFXVideoENCODE_Init +#define MFXVideoENCODE_Reset disp_MFXVideoENCODE_Reset +#define MFXVideoENCODE_Close disp_MFXVideoENCODE_Close +#define MFXVideoENCODE_GetVideoParam disp_MFXVideoENCODE_GetVideoParam +#define MFXVideoENCODE_GetEncodeStat disp_MFXVideoENCODE_GetEncodeStat +#define MFXVideoENCODE_EncodeFrameAsync disp_MFXVideoENCODE_EncodeFrameAsync + +#define MFXVideoDECODE_Query disp_MFXVideoDECODE_Query +#define MFXVideoDECODE_DecodeHeader disp_MFXVideoDECODE_DecodeHeader +#define MFXVideoDECODE_QueryIOSurf disp_MFXVideoDECODE_QueryIOSurf +#define MFXVideoDECODE_Init disp_MFXVideoDECODE_Init +#define MFXVideoDECODE_Reset disp_MFXVideoDECODE_Reset +#define MFXVideoDECODE_Close disp_MFXVideoDECODE_Close +#define MFXVideoDECODE_GetVideoParam disp_MFXVideoDECODE_GetVideoParam +#define MFXVideoDECODE_GetDecodeStat disp_MFXVideoDECODE_GetDecodeStat +#define MFXVideoDECODE_SetSkipMode disp_MFXVideoDECODE_SetSkipMode +#define MFXVideoDECODE_GetPayload disp_MFXVideoDECODE_GetPayload +#define MFXVideoDECODE_DecodeFrameAsync disp_MFXVideoDECODE_DecodeFrameAsync + +#define MFXVideoVPP_Query disp_MFXVideoVPP_Query +#define MFXVideoVPP_QueryIOSurf disp_MFXVideoVPP_QueryIOSurf +#define MFXVideoVPP_Init disp_MFXVideoVPP_Init +#define MFXVideoVPP_Reset disp_MFXVideoVPP_Reset +#define MFXVideoVPP_Close disp_MFXVideoVPP_Close + +#define MFXVideoVPP_GetVideoParam disp_MFXVideoVPP_GetVideoParam +#define MFXVideoVPP_GetVPPStat disp_MFXVideoVPP_GetVPPStat +#define MFXVideoVPP_RunFrameVPPAsync disp_MFXVideoVPP_RunFrameVPPAsync + +// API 1.1 functions +#define MFXVideoUSER_Register disp_MFXVideoUSER_Register +#define MFXVideoUSER_Unregister disp_MFXVideoUSER_Unregister +#define MFXVideoUSER_ProcessFrameAsync disp_MFXVideoUSER_ProcessFrameAsync + +// API 1.10 functions + +#define MFXVideoENC_Query disp_MFXVideoENC_Query +#define MFXVideoENC_QueryIOSurf disp_MFXVideoENC_QueryIOSurf +#define MFXVideoENC_Init disp_MFXVideoENC_Init +#define MFXVideoENC_Reset disp_MFXVideoENC_Reset +#define MFXVideoENC_Close disp_MFXVideoENC_Close +#define MFXVideoENC_ProcessFrameAsync disp_MFXVideoENC_ProcessFrameAsync +#define MFXVideoVPP_RunFrameVPPAsyncEx disp_MFXVideoVPP_RunFrameVPPAsyncEx +#define MFXVideoUSER_Load disp_MFXVideoUSER_Load +#define MFXVideoUSER_UnLoad disp_MFXVideoUSER_UnLoad + +// API 1.11 functions + +#define MFXVideoPAK_Query disp_MFXVideoPAK_Query +#define MFXVideoPAK_QueryIOSurf disp_MFXVideoPAK_QueryIOSurf +#define MFXVideoPAK_Init disp_MFXVideoPAK_Init +#define MFXVideoPAK_Reset disp_MFXVideoPAK_Reset +#define MFXVideoPAK_Close disp_MFXVideoPAK_Close +#define MFXVideoPAK_ProcessFrameAsync disp_MFXVideoPAK_ProcessFrameAsync + +// API 1.13 functions + +#define MFXVideoUSER_LoadByPath disp_MFXVideoUSER_LoadByPath + +// API 1.14 functions +#define MFXInitEx disp_MFXInitEx + +// Audio library functions + +// API 1.8 functions + +#define MFXAudioCORE_SyncOperation disp_MFXAudioCORE_SyncOperation +#define MFXAudioENCODE_Query disp_MFXAudioENCODE_Query +#define MFXAudioENCODE_QueryIOSize disp_MFXAudioENCODE_QueryIOSize +#define MFXAudioENCODE_Init disp_MFXAudioENCODE_Init +#define MFXAudioENCODE_Reset disp_MFXAudioENCODE_Reset +#define MFXAudioENCODE_Close disp_MFXAudioENCODE_Close +#define MFXAudioENCODE_GetAudioParam disp_MFXAudioENCODE_GetAudioParam +#define MFXAudioENCODE_EncodeFrameAsync disp_MFXAudioENCODE_EncodeFrameAsync + +#define MFXAudioDECODE_Query disp_MFXAudioDECODE_Query +#define MFXAudioDECODE_DecodeHeader disp_MFXAudioDECODE_DecodeHeader +#define MFXAudioDECODE_Init disp_MFXAudioDECODE_Init +#define MFXAudioDECODE_Reset disp_MFXAudioDECODE_Reset +#define MFXAudioDECODE_Close disp_MFXAudioDECODE_Close +#define MFXAudioDECODE_QueryIOSize disp_MFXAudioDECODE_QueryIOSize +#define MFXAudioDECODE_GetAudioParam disp_MFXAudioDECODE_GetAudioParam +#define MFXAudioDECODE_DecodeFrameAsync disp_MFXAudioDECODE_DecodeFrameAsync + +// API 1.9 functions + +#define MFXAudioUSER_Register disp_MFXAudioUSER_Register +#define MFXAudioUSER_Unregister disp_MFXAudioUSER_Unregister +#define MFXAudioUSER_ProcessFrameAsync disp_MFXAudioUSER_ProcessFrameAsync +#define MFXAudioUSER_Load disp_MFXAudioUSER_Load +#define MFXAudioUSER_UnLoad disp_MFXAudioUSER_UnLoad + +// API 1.19 functions + +#define MFXVideoENC_GetVideoParam disp_MFXVideoENC_GetVideoParam +#define MFXVideoPAK_GetVideoParam disp_MFXVideoPAK_GetVideoParam +#define MFXVideoCORE_QueryPlatform disp_MFXVideoCORE_QueryPlatform +#define MFXVideoUSER_GetPlugin disp_MFXVideoUSER_GetPlugin + +// API 2.0 functions +#define MFXMemory_GetSurfaceForVPP disp_MFXMemory_GetSurfaceForVPP +#define MFXMemory_GetSurfaceForEncode disp_MFXMemory_GetSurfaceForEncode +#define MFXMemory_GetSurfaceForDecode disp_MFXMemory_GetSurfaceForDecode + +#define MFXQueryImplsDescription disp_MFXQueryImplsDescription +#define MFXReleaseImplDescription disp_MFXReleaseImplDescription + +#define MFXInitialize disp_MFXInitialize + +// API 2.1 functions +#define MFXMemory_GetSurfaceForVPPOut disp_MFXMemory_GetSurfaceForVPPOut + +#define MFXVideoDECODE_VPP_Init disp_MFXVideoDECODE_VPP_Init +#define MFXVideoDECODE_VPP_DecodeFrameAsync disp_MFXVideoDECODE_VPP_DecodeFrameAsync +#define MFXVideoDECODE_VPP_Reset disp_MFXVideoDECODE_VPP_Reset +#define MFXVideoDECODE_VPP_GetChannelParam disp_MFXVideoDECODE_VPP_GetChannelParam +#define MFXVideoDECODE_VPP_Close disp_MFXVideoDECODE_VPP_Close + +#define MFXVideoVPP_ProcessFrameAsync disp_MFXVideoVPP_ProcessFrameAsync + + +#endif
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxencodestats.h
Added
@@ -0,0 +1,458 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifdef ONEVPL_EXPERIMENTAL + + +#ifndef __MFXENCODESTATS_H__ +#define __MFXENCODESTATS_H__ +#include "mfxcommon.h" +#include "mfxstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/*!< The enum to specify memory layout for statistics. */ +typedef enum { + MFX_ENCODESTATS_MEMORY_LAYOUT_DEFAULT = 0, /*!< The default memory layout for statistics. */ +} mfxEncodeBlkStatsMemLayout; + +/*!< The enum to specify mode to gather statistics. */ +typedef enum { + MFX_ENCODESTATS_MODE_DEFAULT = 0, /*!< Encode mode is selected by the implementation. */ + MFX_ENCODESTATS_MODE_ENCODE = 1, /*!< Full encode mode. */ +} mfxEncodeStatsMode; + +/*!< Flags to specify what statistics will be reported by the implementation. */ +enum { + MFX_ENCODESTATS_LEVEL_BLK = 0x1, /*!< Block level statistics. */ + MFX_ENCODESTATS_LEVEL_SLICE = 0x2, /*!< Slice level statistics. */ + MFX_ENCODESTATS_LEVEL_TILE = 0x4, /*!< Tile level statistics. */ + MFX_ENCODESTATS_LEVEL_FRAME = 0x8, /*!< Frame level statistics. */ +}; + + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*!< Specifies H.265 CTU header. */ +typedef struct { + union { + struct { + mfxU32 CUcountminus1 : 6; /*!< Number of CU per CTU. */ + mfxU32 MaxDepth : 2; /*!< Max quad-tree depth of CU in CTU. */ + mfxU32 reserved : 24; + } bitfields0; + mfxU32 dword0; + }; + mfxU16 CurrXAddr; /*!< Horizontal address of CTU. */ + mfxU16 CurrYAddr; /*!< Vertical address of CTU. */ + mfxU32 reserved1; +} mfxCTUHeader; +MFX_PACK_END() + + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*!< Specifies H.265 CU info. */ +typedef struct { + union { + struct { + mfxU32 CU_Size : 2; /*!< indicates the CU size of the current CU. 0: 8x8 1: 16x16 2: 32x32 3: 64x64 */ + mfxU32 CU_pred_mode : 1; /*!< indicates the prediction mode for the current CU. 0: intra 1: inter */ + /*! + indicates the PU partition mode for the current CU. + 0: 2Nx2N + 1: 2NxN (inter) + 2: Nx2N (inter) + 3: NXN (intra only, CU Size=8x8 only. Luma Intra Mode indicates the intra prediction mode for 4x4_0. The additional prediction modes are overloaded on 4x4_1, 4x4_2, 4x4_3 below) + 4: 2NxnT (inter only) + 5: 2NxnB (inter only) + 6: nLx2N (inter only) + 7: nRx2N (inter only). + */ + mfxU32 CU_part_mode : 3; + mfxU32 InterPred_IDC_MV0 : 2; /*!< indicates the prediction direction for PU0 of the current CU. 0: L0 1: L1 2: Bi 3: reserved */ + mfxU32 InterPred_IDC_MV1 : 2; /*!< indicates the prediction direction for PU1 of the current CU. 0: L0 1: L1 2: Bi 3: reserved */ + /*! + Final explicit Luma Intra Mode 4x4_0 for NxN. + Valid values 0..34 + Note: CU_part_mode==NxN. + */ + mfxU32 LumaIntraMode : 6; + /*! + indicates the final explicit Luma Intra Mode for the CU. + 0: DM (use Luma mode, from block 0 if NxN) + 1: reserved + 2: Planar + 3: Vertical + 4: Horizontal + 5: DC */ + mfxU32 ChromaIntraMode : 3; + mfxU32 reserved : 13; + } bitfields0; + mfxU32 dword0; + }; + + union { + struct { + /*! + Final explicit Luma Intra Mode 4x4_1. + Valid values 0..34 + Note: CU_part_mode==NxN. + */ + mfxU32 LumaIntraMode4x4_1 : 6; + /*! + Final explicit Luma Intra Mode 4x4_2. + Valid values 0..34 + Note: CU_part_mode==NxN. + */ + mfxU32 LumaIntraMode4x4_2 : 6; + /*! + Final explicit Luma Intra Mode 4x4_3. + Valid values 0..34 + Note: CU_part_mode==NxN. + */ + mfxU32 LumaIntraMode4x4_3 : 6; + mfxU32 reserved1 : 14; + } bitfields1; + mfxU32 dword1; + }; + + mfxI8 QP; // signed QP value + mfxU8 reserved23; + /*! distortion measure, approximation to SAD. + Will deviate significantly (pre, post reconstruction) and due to variation in algorithm. + */ + mfxU32 SAD; + + /*! + These parameters indicate motion vectors that are associated with the PU0/PU1 winners + range -2048.00..2047.75. + L0/PU0 - MV00 + L0/PU1 - MV01 + L1/PU0 - MV10 + L1/PU1 - MV11 + */ + mfxI16Pair MV22; + + union { + struct { + /*! + This parameter indicates the reference index associated with the MV X/Y + that is populated in the L0_MV0.X and L0_MV0.Y fields. */ + mfxU32 L0_MV0_RefID : 4; + /*! + This parameter indicates the reference index associated with the MV X/Y + that is populated in the L0_MV1.X and L0_MV1.Y fields. */ + mfxU32 L0_MV1_RefID : 4; + /*! + This parameter indicates the reference index associated with the MV X/Y + that is populated in the L1_MV0.X and L1_MV0.Y fields. */ + mfxU32 L1_MV0_RefID : 4; + /*! + This parameter indicates the reference index associated with the MV X/Y + that is populated in the L1_MV1.X and L1_MV1.Y fields. */ + mfxU32 L1_MV1_RefID : 4; + + mfxU32 reserved3 : 16; + } bitfields8; + mfxU32 dword8; + }; + mfxU32 reserved410; /*< should be minimized! */ +} mfxCUInfo; +MFX_PACK_END() + + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*!< Specifies H.265 CTU. */ +typedef struct { + mfxCTUHeader CtuHeader; /*!< H.265 CTU header. */ + mfxCUInfo CuInfo64; /*!< Array of CU. */ + mfxU32 reserved; +} mfxCTUInfo; +MFX_PACK_END() + + + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + The structure describes H.264 stats per MB. +*/ +typedef struct { + union { + struct { + /*! + Together with @p IntraMbFlag this parameter specifies macroblock type according to the + ISO\*\/IEC\* 14496-10 with the following difference - it stores either intra or inter + values according to @p IntraMbFlag, but not intra after inter. + Values for P-slices are mapped to B-slice values. For example P_16x8 is coded with + B_FWD_16x8 value. + */ + mfxU32 MBType : 5; + /*! + This field specifies inter macroblock mode and is ignored for intra MB. It is derived from @p MbType and has next values: + @li 0 - 16x16 mode + @li 1 - 16x8 mode + @li 2 - 8x16 mode + @li 3 - 8x8 mode + */ + mfxU32 InterMBMode : 2; + /*! + This field specifies intra macroblock mode and is ignored for inter MB. It is derived from @p MbType and has next values: + @li 0 - 16x16 mode + @li 1 - 8x8 mode + @li 2 - 4x4 mode + @li 3 - PCM + */ + mfxU32 IntraMBMode : 2; + /*! + This flag specifies intra/inter MB type and has next values: + 0 - Inter prediction MB type + 1 - Intra prediction MB type + */ + mfxU32 IntraMBFlag : 1; + /*! + This field specifies subblock shapes for the current MB. Each block is described by 2 bits starting from lower bits for block 0. + + @li 0 - 8x8 + @li 1 - 8x4 + @li 2 - 4x8 + @li 3 - 4x4 + */ + mfxU32 SubMBShapes : 8; + /*! + This field specifies prediction modes for the current MB partition blocks. Each block is described by 2 bits starting from lower bits for block 0. + @li 0 - Pred_L0 + @li 1 - Pred_L1 + @li 2 - BiPred + @li 3 - reserved + + Only one prediction value for partition is reported, the rest values are set to zero. For example: + @li 16x16 Pred_L1 - 0x01 (only 2 lower bits are used) + @li 16x8 Pred_L1 / BiPred - 0x09 (1001b) + @li 8x16 BiPred / BiPred - 0x0a (1010b) + + For P MBs this value is always zero. + */ + mfxU32 SubMBShapeMode : 8; + /*! + This value specifies chroma intra prediction mode. + @li 0 - DC + @li 1 - Horizontal + @li 2 - Vertical + @li 3 - Plane + */ + mfxU32 ChromaIntraPredMode : 2; + mfxU32 reserved : 4; + } bitfields0; + mfxU32 dword0; + } ; + /*! + Distortion measure, approximation to SAD. + Deviate significantly (pre, post reconstruction) and due to variation in algorithm. + */ + mfxU32 SAD; + mfxI8 Qp; /*!< MB QP. */ + mfxU8 reserved13; + + /*! + These values specify luma intra prediction modes for current MB. Each element of the array + corresponds to 8x8 block and each holds prediction modes for four 4x4 subblocks. + Four bits per mode, lowest bits for left top subblock. + All 16 prediction modes are always specified. For 8x8 case, block prediction mode is + populated to all subblocks of the 8x8 block. For 16x16 case - to all subblocks of the MB. + + Prediction directions for 4x4 and 8x8 blocks: + @li 0 - Vertical + @li 1 - Horizontal + @li 2 - DC + @li 3 - Diagonal Down Left + @li 4 - Diagonal Down Right + @li 5 - Vertical Right + @li 6 - Horizontal Down + @li 7 - Vertical Left + @li 8 - Horizontal Up + + Prediction directions for 16x16 blocks: + @li 0 - Vertical + @li 1 - Horizontal + @li 2 - DC + @li 3 - Plane + */ + mfxU16 LumaIntraMode4; + + mfxU32 reserved2; +} mfxMBInfo; +MFX_PACK_END() + +/*! + The enum specifies block size. +*/ +typedef enum { + MFX_BLOCK_4X4 = 0, /*!< 4x4 block size. */ + MFX_BLOCK_16X16 = 1, /*!< 16x16 block size. */ +} mfxBlockSize; + + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + The structure describes H.264 and H.265 stats per MB or CTUs. +*/ +typedef struct { + union { + mfxU32 NumMB; /*!< Number of MBs per frame for H.264. */ + mfxU32 NumCTU; /*!< number of CTUs per frame for H.265. */ + }; + union { + mfxCTUInfo *HEVCCTUArray; /*!< Array of CTU statistics. */ + mfxMBInfo *AVCMBArray; /*!< Array of MB statistics. */ + }; + mfxU32 reserved8; + +} mfxEncodeBlkStats; +MFX_PACK_END() + + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +/*! + The structure describes H.264/H.265 frame/slice/tile level statistics. +*/ +typedef struct { + mfxF32 PSNRLuma; /*!< PSNR for LUMA samples. */ + mfxF32 PSNRCb; /*!< PSNR for Chroma (Cb) samples. */ + mfxF32 PSNRCr; /*!< PSNR for Chroma (Cr) samples. */ + /*! distortion measure, approximation to SAD. + Will deviate significantly (pre, post reconstruction) and due to variation in algorithm. + */ + mfxU64 SADLuma; + mfxF32 Qp; /*< average frame QP, may have fractional part in case of MBQP. */ + + union { + mfxU32 NumMB; /*!< Number of MBs per frame for H.264. */ + mfxU32 NumCTU; /*!< number of CTUs per frame for H.265. */ + }; + + mfxBlockSize BlockSize; /*! For H.264 it is always 16x16 coresponding to MB size. + In H.265 it's normalized to 4x4, so for each CU we calculate number of 4x4 which belongs to the block. */ + + mfxU32 NumIntraBlock; /*! Number of intra blocks in the frame. The size of block is defined by BlockSize. + For H.265 it can be more than number of intra CU. */ + mfxU32 NumInterBlock; /*! Number of inter blocks in the frame. The size of block is defined by BlockSize. + For H.265 it can be more than number of inter CU. */ + mfxU32 NumSkippedBlock; /*! Number of skipped blocks in the frame. The size of block is defined by BlockSize. + For H.265 it can be more than number of skipped CU. */ + + mfxU32 reserved8; + +} mfxEncodeHighLevelStats; +MFX_PACK_END() + +/*! + Alias for the structure to describe H.264 and H.265 frame level stats. +*/ +typedef mfxEncodeHighLevelStats mfxEncodeFrameStats; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + The structure describes H.264 and H.265 stats per Slice or Tile. +*/ +typedef struct { + mfxU32 NumElements; /*!< Number of Slices or Tiles per frame for H.264/H.265. */ + mfxEncodeHighLevelStats *HighLevelStatsArray; /*!< Array of CTU statistics. */ + mfxU32 reserved8; + +} mfxEncodeSliceStats; +MFX_PACK_END() + +/*! + Alias for the structure to describe H.264 and H.265 tile level stats. +*/ +typedef mfxEncodeSliceStats mfxEncodeTileStats; + + +#define MFX_ENCODESTATSCONTAINER_VERSION MFX_STRUCT_VERSION(1, 0) + + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! The structure respresnts reference counted container for output after encoding operation which includes statistics + and synchronization primitive for compressed bitstream. + The memory is allocated and released by the library. +*/ +typedef struct mfxEncodeStatsContainer { + mfxStructVersion Version; /*!< The version of the structure. */ + mfxRefInterface RefInterface; /*! < Reference counting interface. */ + /*! @brief + Guarantees readiness of the statistics after a function completes. + Instead of MFXVideoCORE_SyncOperation which leads to the synchronization of all output objects, + users may directly call the mfxEncodeStatsContainer::SynchronizeStatistics function to get output statistics. + + + @paramin ref_interface Valid interface. + @paramout wait Wait time in milliseconds. + + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If interface is NULL. \n + MFX_ERR_INVALID_HANDLE If any of container is not valid object . \n + MFX_WRN_IN_EXECUTION If the given timeout is expired and the container is not ready. \n + MFX_ERR_ABORTED If the specified asynchronous function aborted due to data dependency on a previous asynchronous function that did not complete. \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *SynchronizeStatistics)(mfxRefInterface* ref_interface, mfxU32 wait); + /*! @brief + Guarantees readiness of associated compressed bitstream after a function completes. + Instead of MFXVideoCORE_SyncOperation which leads to the synchronization of all output objects, + users may directly call the mfxEncodeStatsContainer::SynchronizeStatistics function to get output bitstream. + + + @paramin ref_interface Valid interface. + @paramout wait Wait time in milliseconds. + + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If interface is NULL. \n + MFX_ERR_INVALID_HANDLE If any of container is not valid object . \n + MFX_WRN_IN_EXECUTION If the given timeout is expired and the container is not ready. \n + MFX_ERR_ABORTED If the specified asynchronous function aborted due to data dependency on a previous asynchronous function that did not complete. \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *SynchronizeBitstream)(mfxRefInterface* ref_interface, mfxU32 wait); + mfxHDL reserved4; + mfxU32 reserved12; + mfxU32 DisplayOrder; /*< To which frame number statistics belong. */ + mfxEncodeBlkStatsMemLayout MemLayout; /*< Memory layout for statistics. */ + mfxEncodeBlkStats *EncodeBlkStats; /*< Block level statistics. */ + mfxEncodeSliceStats *EncodeSliceStats; /*< Slice level statistics. */ + mfxEncodeTileStats *EncodeTileStats; /*< Tile level statistics. */ + mfxEncodeFrameStats *EncodeFrameStats; /*< Frame level statistics. */ + mfxU32 reserved28; +}mfxEncodeStatsContainer; +MFX_PACK_END() + + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! The extension buffer which should be attached by application for mfxBitstream buffer before + encode operation. As result the encoder will allocate memory for statistics and fill appropriate structures. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODESTATS_BLK. */ + mfxU16 EncodeStatsFlags; /*! What statistics is required: block/slice/tile/frame level or any combinations. + In case of slice or tile output statistics for one slice or tile will be availbale only.*/ + mfxEncodeStatsMode Mode; /*!< What encoding mode should be used to gather statistics. */ + mfxEncodeStatsContainer *EncodeStatsContainer; /*!< encode output, filled by the implementation. */ + mfxU32 reserved8; +} mfxExtEncodeStatsOutput; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif + +#endif \ No newline at end of file
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfximplcaps.h
Added
@@ -0,0 +1,54 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include "mfxdefs.h" + +#ifndef __MFXIMPLCAPS_H__ +#define __MFXIMPLCAPS_H__ + +#include "mfxstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*! + @brief + Delivers implementation capabilities in the requested format according to the format value. + + @paramin format Format in which capabilities must be delivered. See mfxImplCapsDeliveryFormat for more details. + @paramout num_impls Number of the implementations. + + @return + Array of handles to the capability report or NULL in case of unsupported format or NULL num_impls pointer. + Length of array is equal to num_impls. + + @since This function is available since API version 2.0. +*/ +mfxHDL* MFX_CDECL MFXQueryImplsDescription(mfxImplCapsDeliveryFormat format, mfxU32* num_impls); + +/*! + @brief + Destroys the handle allocated by the MFXQueryImplsDescription function. + Implementation must remember which handles are released. Once the last handle is released, this function must release memory + allocated for the array of handles. + + @paramin hdl Handle to destroy. Can be equal to NULL. + + @return + MFX_ERR_NONE The function completed successfully. + + @since This function is available since API version 2.0. +*/ +mfxStatus MFX_CDECL MFXReleaseImplDescription(mfxHDL hdl); + + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // __MFXIMPLCAPS_H__
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxjpeg.h
Added
@@ -0,0 +1,136 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFX_JPEG_H__ +#define __MFX_JPEG_H__ + +#include "mfxdefs.h" +#include "mfxstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* CodecId */ +enum { + MFX_CODEC_JPEG = MFX_MAKEFOURCC('J','P','E','G') /*!< JPEG codec */ +}; + +/* CodecProfile, CodecLevel */ +enum +{ + MFX_PROFILE_JPEG_BASELINE = 1 /*!< Baseline JPEG profile. */ +}; + +/*! The Rotation enumerator itemizes the JPEG rotation options. */ +enum +{ + MFX_ROTATION_0 = 0, /*!< No rotation. */ + MFX_ROTATION_90 = 1, /*!< 90 degree rotation. */ + MFX_ROTATION_180 = 2, /*!< 180 degree rotation. */ + MFX_ROTATION_270 = 3 /*!< 270 degree rotation. */ +}; + +enum { + MFX_EXTBUFF_JPEG_QT = MFX_MAKEFOURCC('J','P','G','Q'), /*!< This extended buffer defines quantization tables for JPEG encoder. */ + MFX_EXTBUFF_JPEG_HUFFMAN = MFX_MAKEFOURCC('J','P','G','H') /*!< This extended buffer defines Huffman tables for JPEG encoder. */ +}; + +/*! The JPEGColorFormat enumerator itemizes the JPEG color format options. */ +enum { + MFX_JPEG_COLORFORMAT_UNKNOWN = 0, /*! Unknown color format. The decoder tries to determine color format from available in bitstream information. + If such information is not present, then MFX_JPEG_COLORFORMAT_YCbCr color format is assumed. */ + MFX_JPEG_COLORFORMAT_YCbCr = 1, /*! Bitstream contains Y, Cb and Cr components. */ + MFX_JPEG_COLORFORMAT_RGB = 2 /*! Bitstream contains R, G and B components. */ +}; + +/*! The JPEGScanType enumerator itemizes the JPEG scan types. */ +enum { + MFX_SCANTYPE_UNKNOWN = 0, /*!< Unknown scan type. */ + MFX_SCANTYPE_INTERLEAVED = 1, /*!< Interleaved scan. */ + MFX_SCANTYPE_NONINTERLEAVED = 2 /*!< Non-interleaved scan. */ +}; + +enum { + MFX_CHROMAFORMAT_JPEG_SAMPLING = 6 /*!< Color sampling specified via mfxInfoMFX::SamplingFactorH and SamplingFactorV. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Specifies quantization tables. The application may specify up to 4 quantization tables. The encoder assigns an ID to each table. + That ID is equal to the table index in the Qm array. Table "0" is used for encoding of the Y component, table "1" for the U component, and table "2" + for the V component. The application may specify fewer tables than the number of components in the image. If two tables are specified, + then table "1" is used for both U and V components. If only one table is specified then it is used for all components in the image. + The following table illustrates this behavior. + + @internal + +------------------+---------+------+---+ + | Table ID | 0 | 1 | 2 | + +------------------+---------+------+---+ + | Number of tables | | | | + +==================+=========+======+===+ + | 0 | Y, U, V | | | + +------------------+---------+------+---+ + | 1 | Y | U, V | | + +------------------+---------+------+---+ + | 2 | Y | U | V | + +------------------+---------+------+---+ + @endinternal +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_JPEG_QT. */ + + mfxU16 reserved7; + mfxU16 NumTable; /*!< Number of quantization tables defined in Qmarray. */ + + mfxU16 Qm464; /*!< Quantization table values. */ +} mfxExtJPEGQuantTables; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Specifies Huffman tables. The application may specify up to 2 quantization table pairs for baseline process. The encoder + assigns an ID to each table. That ID is equal to the table index in the DCTables and ACTables arrays. Table "0" is used for encoding of the Y component and + table "1" is used for encoding of the U and V component. The application may specify only one table, in which case the table will be used for all components in the image. + The following table illustrates this behavior. + + @internal + +------------------+---------+------+ + | Table ID | 0 | 1 | + +------------------+---------+------+ + | Number of tables | | | + +==================+=========+======+ + | 0 | Y, U, V | | + +------------------+---------+------+ + | 1 | Y | U, V | + +------------------+---------+------+ + @endinternal +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_JPEG_HUFFMAN. */ + + mfxU16 reserved2; + mfxU16 NumDCTable; /*!< Number of DC quantization table in DCTables array. */ + mfxU16 NumACTable; /*!< Number of AC quantization table in ACTables array. */ + + struct { + mfxU8 Bits16; /*!< Number of codes for each code length. */ + mfxU8 Values12; /*!< List of the 8-bit symbol values. */ + } DCTables4; /*!< Array of DC tables. */ + + struct { + mfxU8 Bits16; /*!< Number of codes for each code length. */ + mfxU8 Values162; /*!< Array of AC tables. */ + } ACTables4; /*!< List of the 8-bit symbol values. */ +} mfxExtJPEGHuffmanTables; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif // __MFX_JPEG_H__
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxmvc.h
Added
@@ -0,0 +1,105 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFXMVC_H__ +#define __MFXMVC_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* CodecProfile, CodecLevel */ +enum { + /* MVC profiles */ + MFX_PROFILE_AVC_MULTIVIEW_HIGH =118, /*!< Multi-view high profile. */ + MFX_PROFILE_AVC_STEREO_HIGH =128 /*!< Stereo high profile. */ +}; + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_MVC_SEQ_DESC = MFX_MAKEFOURCC('M','V','C','D'), /*!< This extended buffer describes the MVC stream information of view dependencies, view identifiers, and operation points. See the ITU*-T H.264 specification chapter H.7.3.2.1.4 for details. */ + MFX_EXTBUFF_MVC_TARGET_VIEWS = MFX_MAKEFOURCC('M','V','C','T') /*!< This extended buffer defines target views at the decoder output.*/ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Describes MVC view dependencies. +*/ +typedef struct { + mfxU16 ViewId; /*!< View identifier of this dependency structure. */ + + mfxU16 NumAnchorRefsL0; /*!< Number of view components for inter-view prediction in the initial reference picture list RefPicList0 for anchor view components. */ + mfxU16 NumAnchorRefsL1; /*!< Number of view components for inter-view prediction in the initial reference picture list RefPicList1 for anchor view components. */ + mfxU16 AnchorRefL016; /*!<View identifiers of the view components for inter-view prediction in the initial reference picture list RefPicList0 for anchor view components. */ + mfxU16 AnchorRefL116; /*!<View identifiers of the view components for inter-view prediction in the initial reference picture list RefPicList1 for anchor view components. */ + + mfxU16 NumNonAnchorRefsL0; /*!<Number of view components for inter-view prediction in the initial reference picture list RefPicList0 for non-anchor view components. */ + mfxU16 NumNonAnchorRefsL1; /*!<Number of view components for inter-view prediction in the initial reference picture list RefPicList1 for non-anchor view components. */ + mfxU16 NonAnchorRefL016; /*!<View identifiers of the view components for inter-view prediction in the initial reference picture list RefPicList0 for non-anchor view components. */ + mfxU16 NonAnchorRefL116; /*!View identifiers of the view components for inter-view prediction in the initial reference picture list RefPicList0 for non-anchor view components. */ +} mfxMVCViewDependency; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Describes the MVC operation point. +*/ +typedef struct { + mfxU16 TemporalId; /*!< Temporal identifier of the operation point. */ + mfxU16 LevelIdc; /*!< Level value signaled for the operation point. */ + + mfxU16 NumViews; /*!< Number of views required for decoding the target output views that correspond to the operation point. */ + mfxU16 NumTargetViews; /*!< Number of target output views for the operation point. */ + mfxU16 *TargetViewId; /*!< Target output view identifiers for operation point. */ +} mfxMVCOperationPoint; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Describes the MVC stream information of view dependencies, view identifiers, and operation points. See the ITU*-T H.264 specification chapter H.7.3.2.1.4 for details. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MVC_SEQUENCE_DESCRIPTION. */ + + mfxU32 NumView; /*!< Number of views. */ + mfxU32 NumViewAlloc; /*!< The allocated view dependency array size. */ + mfxMVCViewDependency *View; /*!< Pointer to a list of the mfxMVCViewDependency. */ + + mfxU32 NumViewId; /*!< Number of view identifiers. */ + mfxU32 NumViewIdAlloc; /*!< The allocated view identifier array size. */ + mfxU16 *ViewId; /*!< Pointer to the list of view identifier. */ + + mfxU32 NumOP; /*!< Number of operation points. */ + mfxU32 NumOPAlloc; /*!< The allocated operation point array size. */ + mfxMVCOperationPoint *OP; /*!< Pointer to a list of the mfxMVCOperationPoint structure. */ + + mfxU16 NumRefsTotal; /*!< Total number of reference frames in all views required to decode the stream. This value is returned from the MFXVideoDECODE_Decodeheader function. Do not modify this value. */ + mfxU32 Reserved16; + +} mfxExtMVCSeqDesc; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Configures views for the decoding output. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MVC_TARGET_VIEWS. */ + + mfxU16 TemporalId; /*!< The temporal identifier to be decoded. */ + mfxU32 NumView; /*!< The number of views to be decoded. */ + mfxU16 ViewId1024; /*!< List of view identifiers to be decoded. */ +} mfxExtMVCTargetViews ; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxpcp.h
Added
@@ -0,0 +1,45 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFXPCP_H__ +#define __MFXPCP_H__ +#include "mfxstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/*! The Protected enumerator describes the protection schemes. */ +enum { + MFX_PROTECTION_CENC_WV_CLASSIC = 0x0004, /*!< The protection scheme is based on the Widevine* DRM from Google*. */ + MFX_PROTECTION_CENC_WV_GOOGLE_DASH = 0x0005, /*!< The protection scheme is based on the Widevine* Modular DRM* from Google*. */ +}; + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_CENC_PARAM = MFX_MAKEFOURCC('C','E','N','P') /*!< This structure is used to pass decryption status report index for Common + Encryption usage model. See the mfxExtCencParam structure for more details. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used to pass the decryption status report index for the Common Encryption usage model. The application can + attach this extended buffer to the mfxBitstream structure at runtime. +*/ +typedef struct _mfxExtCencParam{ + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_CENC_PARAM. */ + + mfxU32 StatusReportIndex; /*!< Decryption status report index. */ + mfxU32 reserved15; +} mfxExtCencParam; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxsession.h
Added
@@ -0,0 +1,234 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFXSESSION_H__ +#define __MFXSESSION_H__ +#include "mfxcommon.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* Global Functions */ + +/*! Session handle. */ +typedef struct _mfxSession *mfxSession; + +/*! + @brief + Creates and initializes a session in the legacy mode for compatibility with Intel(r) Media SDK applications. + This function is deprecated starting from API version 2.0, applications must use MFXLoad with mfxCreateSession + to select the implementation and initialize the session. + + Call this function before calling + any other API function. If the desired implementation specified by ``impl`` is MFX_IMPL_AUTO, + the function will search for the platform-specific implementation. + If the function cannot find the platform-specific implementation, it will use the software implementation instead. + + The ``ver`` argument indicates the desired version of the library implementation. + The loaded implementation will have an API version compatible to the specified version (equal in + the major version number, and no less in the minor version number.) If the desired version + is not specified, the default is to use the API version from the library release with + which an application is built. + + Production applications should always specify the minimum API version that meets the + functional requirements. For example, if an application uses only H.264 decoding as described + in API v1.0, the application should initialize the library with API v1.0. This ensures + backward compatibility. + + @paramin impl mfxIMPL enumerator that indicates the desired legacy Intel(r) Media SDK implementation. + @paramin ver Pointer to the minimum library version or zero, if not specified. + @paramout session Pointer to the legacy Intel(r) Media SDK session handle. + + @return + MFX_ERR_NONE The function completed successfully. The output parameter contains the handle of the session.\n + MFX_ERR_UNSUPPORTED The function cannot find the desired legacy Intel(r) Media SDK implementation or version. + + @since This function is available since API version 1.0. + + @deprecated Deprecated in API version 2.3. Use MFXLoad and MFXCreateSession to initialize the session. + Use MFX_DEPRECATED_OFF macro to turn off the deprecation message visualization. +*/ +MFX_DEPRECATED mfxStatus MFX_CDECL MFXInit(mfxIMPL impl, mfxVersion *ver, mfxSession *session); + +/*! + @brief + Creates and initializes a session in the legacy mode for compatibility with Intel(r) Media SDK applications. + This function is deprecated starting from API version 2.0, applications must use MFXLoad with mfxCreateSession + to select the implementation and initialize the session. + + Call this function before calling any other API functions. + If the desired implementation specified by ``par`` is MFX_IMPL_AUTO, the function will search for + the platform-specific implementation. If the function cannot find the platform-specific implementation, it will use the software implementation instead. + + The argument ``par.Version`` indicates the desired version of the implementation. The loaded implementation will have an API + version compatible to the specified version (equal in the major version number, and no less in the minor version number.) + If the desired version is not specified, the default is to use the API version from the library release with + which an application is built. + + Production applications should always specify the minimum API version that meets the functional requirements. + For example, if an application uses only H.264 decoding as described in API v1.0, the application should initialize the library with API v1.0. This ensures backward compatibility. + + The argument ``par.ExternalThreads`` specifies threading mode. Value 0 means that the implementation should create and + handle work threads internally (this is essentially the equivalent of the regular MFXInit). + + @paramin par mfxInitParam structure that indicates the desired implementation, minimum library version and desired threading mode. + @paramout session Pointer to the session handle. + + @return + MFX_ERR_NONE The function completed successfully. The output parameter contains the handle of the session.\n + MFX_ERR_UNSUPPORTED The function cannot find the desired implementation or version. + + @since This function is available since API version 1.14. + + @deprecated Deprecated in API version 2.3. Use MFXLoad and MFXCreateSession to initialize the session. + Use MFX_DEPRECATED_OFF macro to turn off the deprecation message visualization. +*/ +MFX_DEPRECATED mfxStatus MFX_CDECL MFXInitEx(mfxInitParam par, mfxSession *session); + +/*! + @brief + Creates and initializes a session starting from API version 2.0. This function is used by the dispatcher. + The dispatcher creates and fills the mfxInitializationParam structure according to mfxConfig values set by an application. + Calling this function directly is not recommended. Instead, applications must call the mfxCreateSession function. + + + @paramin par mfxInitializationParam structure that indicates the minimum library version and acceleration type. + @paramout session Pointer to the session handle. + + @return + MFX_ERR_NONE The function completed successfully. The output parameter contains the handle of the session.\n + MFX_ERR_UNSUPPORTED The function cannot find the desired implementation or version. + + @since This function is available since API version 2.0. +*/ +mfxStatus MFX_CDECL MFXInitialize(mfxInitializationParam par, mfxSession *session); + +/*! + @brief Completes and deinitializes a session. Any active tasks in execution or + in queue are aborted. The application cannot call any API function after calling this function. + + All child sessions must be disjoined before closing a parent session. + @paramin session session handle. + + @return MFX_ERR_NONE The function completed successfully. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXClose(mfxSession session); + +/*! + @brief Returns the implementation type of a given session. + + @paramin session Session handle. + @paramout impl Pointer to the implementation type + + @return MFX_ERR_NONE The function completed successfully. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXQueryIMPL(mfxSession session, mfxIMPL *impl); + +/*! + @brief Returns the implementation version. + + @paramin session Session handle. + @paramout version Pointer to the returned implementation version. + + @return MFX_ERR_NONE The function completed successfully. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXQueryVersion(mfxSession session, mfxVersion *version); + +/*! + @brief Joins the child session to the current session. + + After joining, the two sessions share thread and resource scheduling for asynchronous + operations. However, each session still maintains its own device manager and buffer/frame + allocator. Therefore, the application must use a compatible device manager and buffer/frame + allocator to share data between two joined sessions. + + The application can join multiple sessions by calling this function multiple times. When joining + the first two sessions, the current session becomes the parent responsible for thread and + resource scheduling of any later joined sessions. + + Joining of two parent sessions is not supported. + + @paramin,out session The current session handle. + @paramin child The child session handle to be joined + + @return MFX_ERR_NONE The function completed successfully. \n + MFX_WRN_IN_EXECUTION Active tasks are executing or in queue in one of the + sessions. Call this function again after all tasks are completed. \n + MFX_ERR_UNSUPPORTED The child session cannot be joined with the current session. + + @since This function is available since API version 1.1. +*/ +mfxStatus MFX_CDECL MFXJoinSession(mfxSession session, mfxSession child); + +/*! + @brief Removes the joined state of the current session. + + After disjoining, the current session becomes independent. The application must ensure there is no active task running in the session before calling this API function. + + @paramin,out session The current session handle. + + @return MFX_ERR_NONE The function completed successfully. \n + MFX_WRN_IN_EXECUTION Active tasks are executing or in queue in one of the + sessions. Call this function again after all tasks are completed. \n + MFX_ERR_UNDEFINED_BEHAVIOR The session is independent, or this session is the parent of all joined sessions. + + @since This function is available since API version 1.1. +*/ +mfxStatus MFX_CDECL MFXDisjoinSession(mfxSession session); + +/*! + @brief Creates a clean copy of the current session. + + The cloned session is an independent session and does not inherit any user-defined buffer, frame allocator, or device manager handles from the current session. + This function is a light-weight equivalent of MFXJoinSession after MFXInit. + + @paramin session The current session handle. + @paramout clone Pointer to the cloned session handle. + + @return MFX_ERR_NONE The function completed successfully. + + @since This function is available since API version 1.1. +*/ +mfxStatus MFX_CDECL MFXCloneSession(mfxSession session, mfxSession *clone); + +/*! + @brief Sets the current session priority. + + @paramin session The current session handle. + @paramin priority Priority value. + + @return MFX_ERR_NONE The function completed successfully. + + @since This function is available since API version 1.1. +*/ +mfxStatus MFX_CDECL MFXSetPriority(mfxSession session, mfxPriority priority); + +/*! + @brief Returns the current session priority. + + @paramin session The current session handle. + @paramout priority Pointer to the priority value. + + @return MFX_ERR_NONE The function completed successfully. + + @since This function is available since API version 1.1. +*/ +mfxStatus MFX_CDECL MFXGetPriority(mfxSession session, mfxPriority *priority); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxstructures.h
Added
@@ -0,0 +1,4783 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFXSTRUCTURES_H__ +#define __MFXSTRUCTURES_H__ +#include "mfxcommon.h" + +#if !defined (__GNUC__) +#pragma warning(disable: 4201) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Frame ID for MVC */ +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Describes the view and layer of a frame picture. */ +typedef struct { + mfxU16 TemporalId; /*!< The temporal identifier as defined in the annex H of the ITU*-T H.264 specification. */ + mfxU16 PriorityId; /*!< Reserved and must be zero. */ + union { + struct { + mfxU16 DependencyId; /*!< Reserved for future use. */ + mfxU16 QualityId; /*!< Reserved for future use. */ + }; + struct { + mfxU16 ViewId; /*!< The view identifier as defined in the annex H of the ITU-T H.264 specification. */ + }; + }; +} mfxFrameId; +MFX_PACK_END() + +/* This struct has 4-byte alignment for binary compatibility with previously released versions of API. */ +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Specifies properties of video frames. See also "Configuration Parameter Constraints" chapter. */ +typedef struct { + mfxU32 reserved4; /*!< Reserved for future use. */ + /*! The unique ID of each VPP channel set by application. It's required that during Init/Reset application fills ChannelId for + each mfxVideoChannelParam provided by the application and the SDK sets it back to the correspondent + mfxSurfaceArray::mfxFrameSurface1 to distinguish different channels. It's expected that surfaces for some channels might be + returned with some delay so application has to use mfxFrameInfo::ChannelId to distinguish what returned surface belongs to + what VPP channel. Decoder's initialization parameters are always sent through channel with mfxFrameInfo::ChannelId equals to + zero. It's allowed to skip setting of decoder's parameters for simplified decoding procedure */ + mfxU16 ChannelId; + /*! Number of bits used to represent luma samples. + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ + mfxU16 BitDepthLuma; + /*! Number of bits used to represent chroma samples. + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ + mfxU16 BitDepthChroma; + /*! When the value is not zero, indicates that values of luma and chroma samples are shifted. Use BitDepthLuma and BitDepthChroma to calculate + shift size. Use zero value to indicate absence of shift. See example data alignment below. + + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. + */ + mfxU16 Shift; + mfxFrameId FrameId; /*!< Describes the view and layer of a frame picture. */ + mfxU32 FourCC; /*!< FourCC code of the color format. See the ColorFourCC enumerator for details. */ + union { + struct { /* Frame parameters */ + mfxU16 Width; /*!< Width of the video frame in pixels. Must be a multiple of 16. */ + mfxU16 Height; /*!< Height of the video frame in pixels. Must be a multiple of 16 for progressive frame sequence and a multiple of 32 otherwise. */ + + /*! @{ + @name ROI + The region of interest of the frame. Specify the display width and height in mfxVideoParam. */ + mfxU16 CropX; /*!< X coordinate. */ + mfxU16 CropY; /*!< Y coordinate. */ + mfxU16 CropW; /*!< Width in pixels. */ + mfxU16 CropH; /*!< Height in pixels. */ + /*! @} */ + }; + struct { /* Buffer parameters (for plain formats like P8) */ + mfxU64 BufferSize; /*!< Size of frame buffer in bytes. Valid only for plain formats (when FourCC is P8). In this case, Width, Height, and crop values are invalid. */ + mfxU32 reserved5; + }; + }; + + /*! @{ + @name FrameRate + Specify the frame rate with the following formula: FrameRateExtN / FrameRateExtD. + + For encoding, frame rate must be specified. For decoding, frame rate may be unspecified (FrameRateExtN and FrameRateExtD + are all zeros.) In this case, the frame rate is defaulted to 30 frames per second. + */ + mfxU32 FrameRateExtN; /*!< Frame rate numerator. */ + mfxU32 FrameRateExtD; /*!< Frame rate denominator. */ + /*! @} */ + mfxU16 reserved3; + + /*! @{ + @name AspectRatio + AspectRatioW and AspectRatioH are used to specify the sample aspect ratio. If sample aspect ratio is explicitly defined by the standards (see + Table 6-3 in the MPEG-2 specification or Table E-1 in the H.264 specification), AspectRatioW and AspectRatioH should be the defined values. + Otherwise, the sample aspect ratio can be derived as follows: + + @li @c AspectRatioW=display_aspect_ratio_width*display_height + + @li @c AspectRatioH=display_aspect_ratio_height*display_width + + For MPEG-2, the above display aspect ratio must be one of the defined values in Table 6-3 in the MPEG-2 specification. For H.264, there is no restriction + on display aspect ratio values. + + If both parameters are zero, the encoder uses the default value of sample aspect ratio. + */ + mfxU16 AspectRatioW; /*!< Aspect Ratio for width. */ + mfxU16 AspectRatioH; /*!< Aspect Ratio for height. */ + /*! @} */ + + mfxU16 PicStruct; /*!< Picture type as specified in the PicStruct enumerator. */ + mfxU16 ChromaFormat; /*!< Color sampling method. Value is the same as that of ChromaFormatIdc. + ChromaFormat is not defined if FourCC is zero.*/ + mfxU16 reserved2; +} mfxFrameInfo; +MFX_PACK_END() + +/*! The ColorFourCC enumerator itemizes color formats. */ +enum { + MFX_FOURCC_NV12 = MFX_MAKEFOURCC('N','V','1','2'), /*!< NV12 color planes. Native format for 4:2:0/8b Gen hardware implementation. */ + MFX_FOURCC_YV12 = MFX_MAKEFOURCC('Y','V','1','2'), /*!< YV12 color planes. */ + MFX_FOURCC_NV16 = MFX_MAKEFOURCC('N','V','1','6'), /*!< 4:2:2 color format with similar to NV12 layout. */ + MFX_FOURCC_YUY2 = MFX_MAKEFOURCC('Y','U','Y','2'), /*!< YUY2 color planes. */ + MFX_FOURCC_RGB565 = MFX_MAKEFOURCC('R','G','B','2'), /*!< 2 bytes per pixel, uint16 in little-endian format, where 0-4 bits are blue, bits 5-10 are green and bits 11-15 are red. */ + /*! RGB 24 bit planar layout (3 separate channels, 8-bits per sample each). This format should be mapped to D3DFMT_R8G8B8 or VA_FOURCC_RGBP. */ + MFX_FOURCC_RGBP = MFX_MAKEFOURCC('R','G','B','P'), + MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_FOURCC_RGB3) = MFX_MAKEFOURCC('R','G','B','3'), /* Deprecated. */ + MFX_FOURCC_RGB4 = MFX_MAKEFOURCC('R','G','B','4'), /*!< RGB4 (RGB32) color planes. BGRA is the order, 'B' is 8 MSBs, then 8 bits for 'G' channel, then 'R' and 'A' channels. */ + /*! + Internal color format. The application should use the following functions to create a surface that corresponds to the Direct3D* version in use. + + For Direct3D* 9: IDirectXVideoDecoderService::CreateSurface() + + For Direct3D* 11: ID3D11Device::CreateBuffer() + */ + MFX_FOURCC_P8 = 41, + /*! + Internal color format. The application should use the following functions to create a surface that corresponds to the Direct3D* version in use. + + For Direct3D 9: IDirectXVideoDecoderService::CreateSurface() + + For Direct3D 11: ID3D11Device::CreateTexture2D() + */ + MFX_FOURCC_P8_TEXTURE = MFX_MAKEFOURCC('P','8','M','B'), + MFX_FOURCC_P010 = MFX_MAKEFOURCC('P','0','1','0'), /*!< P010 color format. This is 10 bit per sample format with similar to NV12 layout. This format should be mapped to DXGI_FORMAT_P010. */ + MFX_FOURCC_P016 = MFX_MAKEFOURCC('P','0','1','6'), /*!< P016 color format. This is 16 bit per sample format with similar to NV12 layout. This format should be mapped to DXGI_FORMAT_P016. */ + MFX_FOURCC_P210 = MFX_MAKEFOURCC('P','2','1','0'), /*!< 10 bit per sample 4:2:2 color format with similar to NV12 layout. */ + MFX_FOURCC_BGR4 = MFX_MAKEFOURCC('B','G','R','4'), /*!< RGBA color format. It is similar to MFX_FOURCC_RGB4 but with different order of channels. 'R' is 8 MSBs, then 8 bits for 'G' channel, then 'B' and 'A' channels. */ + MFX_FOURCC_A2RGB10 = MFX_MAKEFOURCC('R','G','1','0'), /*!< 10 bits ARGB color format packed in 32 bits. 'A' channel is two MSBs, then 'R', then 'G' and then 'B' channels. This format should be mapped to DXGI_FORMAT_R10G10B10A2_UNORM or D3DFMT_A2R10G10B10. */ + MFX_FOURCC_ARGB16 = MFX_MAKEFOURCC('R','G','1','6'), /*!< 10 bits ARGB color format packed in 64 bits. 'A' channel is 16 MSBs, then 'R', then 'G' and then 'B' channels. This format should be mapped to DXGI_FORMAT_R16G16B16A16_UINT or D3DFMT_A16B16G16R16 formats. */ + MFX_FOURCC_ABGR16 = MFX_MAKEFOURCC('B','G','1','6'), /*!< 10 bits ABGR color format packed in 64 bits. 'A' channel is 16 MSBs, then 'B', then 'G' and then 'R' channels. This format should be mapped to DXGI_FORMAT_R16G16B16A16_UINT or D3DFMT_A16B16G16R16 formats. */ + MFX_FOURCC_R16 = MFX_MAKEFOURCC('R','1','6','U'), /*!< 16 bits single channel color format. This format should be mapped to DXGI_FORMAT_R16_TYPELESS or D3DFMT_R16F. */ + MFX_FOURCC_AYUV = MFX_MAKEFOURCC('A','Y','U','V'), /*!< YUV 4:4:4, AYUV color format. This format should be mapped to DXGI_FORMAT_AYUV. */ + MFX_FOURCC_AYUV_RGB4 = MFX_MAKEFOURCC('A','V','U','Y'), /*!< RGB4 stored in AYUV surface. This format should be mapped to DXGI_FORMAT_AYUV. */ + MFX_FOURCC_UYVY = MFX_MAKEFOURCC('U','Y','V','Y'), /*!< UYVY color planes. Same as YUY2 except the byte order is reversed. */ + MFX_FOURCC_Y210 = MFX_MAKEFOURCC('Y','2','1','0'), /*!< 10 bit per sample 4:2:2 packed color format with similar to YUY2 layout. This format should be mapped to DXGI_FORMAT_Y210. */ + MFX_FOURCC_Y410 = MFX_MAKEFOURCC('Y','4','1','0'), /*!< 10 bit per sample 4:4:4 packed color format. This format should be mapped to DXGI_FORMAT_Y410. */ + MFX_FOURCC_Y216 = MFX_MAKEFOURCC('Y','2','1','6'), /*!< 16 bit per sample 4:2:2 packed color format with similar to YUY2 layout. This format should be mapped to DXGI_FORMAT_Y216. */ + MFX_FOURCC_Y416 = MFX_MAKEFOURCC('Y','4','1','6'), /*!< 16 bit per sample 4:4:4 packed color format. This format should be mapped to DXGI_FORMAT_Y416. */ + MFX_FOURCC_NV21 = MFX_MAKEFOURCC('N', 'V', '2', '1'), /*!< Same as NV12 but with weaved V and U values. */ + MFX_FOURCC_IYUV = MFX_MAKEFOURCC('I', 'Y', 'U', 'V'), /*!< Same as YV12 except that the U and V plane order is reversed. */ + MFX_FOURCC_I010 = MFX_MAKEFOURCC('I', '0', '1', '0'), /*!< 10-bit YUV 4:2:0, each component has its own plane. */ + MFX_FOURCC_I210 = MFX_MAKEFOURCC('I', '2', '1', '0'), /*!< 10-bit YUV 4:2:2, each component has its own plane. */ + MFX_FOURCC_I420 = MFX_FOURCC_IYUV, /*!< Alias for the IYUV color format. */ + MFX_FOURCC_I422 = MFX_MAKEFOURCC('I', '4', '2', '2'), /*!< Same as YV16 except that the U and V plane order is reversed */ + MFX_FOURCC_BGRA = MFX_FOURCC_RGB4, /*!< Alias for the RGB4 color format. */ + /*! BGR 24 bit planar layout (3 separate channels, 8-bits per sample each). This format should be mapped to VA_FOURCC_BGRP. */ + MFX_FOURCC_BGRP = MFX_MAKEFOURCC('B','G','R','P'), +#ifdef ONEVPL_EXPERIMENTAL + /*! 8bit per sample 4:4:4 format packed in 32 bits, X=unused/undefined, 'X' channel is 8 MSBs, then 'Y', then 'U', and then 'V' channels. This format should be mapped to VA_FOURCC_XYUV. */ + MFX_FOURCC_XYUV = MFX_MAKEFOURCC('X','Y','U','V'), +#endif +}; + +/* PicStruct */ +enum { + MFX_PICSTRUCT_UNKNOWN =0x00, /*!< Unspecified or mixed progressive/interlaced/field pictures. */ + MFX_PICSTRUCT_PROGRESSIVE =0x01, /*!< Progressive picture. */ + MFX_PICSTRUCT_FIELD_TFF =0x02, /*!< Top field in first interlaced picture. */ + MFX_PICSTRUCT_FIELD_BFF =0x04, /*!< Bottom field in first interlaced picture. */ + + MFX_PICSTRUCT_FIELD_REPEATED=0x10, /*!< First field repeated: pic_struct=5 or 6 in H.264. */ + MFX_PICSTRUCT_FRAME_DOUBLING=0x20, /*!< Double the frame for display: pic_struct=7 in H.264. */ + MFX_PICSTRUCT_FRAME_TRIPLING=0x40, /*!< Triple the frame for display: pic_struct=8 in H.264. */ + + MFX_PICSTRUCT_FIELD_SINGLE =0x100, /*!< Single field in a picture. */ + MFX_PICSTRUCT_FIELD_TOP =MFX_PICSTRUCT_FIELD_SINGLE | MFX_PICSTRUCT_FIELD_TFF, /*!< Top field in a picture: pic_struct = 1 in H.265. */ + MFX_PICSTRUCT_FIELD_BOTTOM =MFX_PICSTRUCT_FIELD_SINGLE | MFX_PICSTRUCT_FIELD_BFF, /*!< Bottom field in a picture: pic_struct = 2 in H.265. */ + MFX_PICSTRUCT_FIELD_PAIRED_PREV =0x200, /*!< Paired with previous field: pic_struct = 9 or 10 in H.265. */ + MFX_PICSTRUCT_FIELD_PAIRED_NEXT =0x400, /*!< Paired with next field: pic_struct = 11 or 12 in H.265 */ +}; + +/* The ChromaFormatIdc enumerator itemizes color-sampling formats. */ +enum { + MFX_CHROMAFORMAT_MONOCHROME =0, /*!< Monochrome. */ + MFX_CHROMAFORMAT_YUV420 =1, /*!< 4:2:0 color. */ + MFX_CHROMAFORMAT_YUV422 =2, /*!< 4:2:2 color. */ + MFX_CHROMAFORMAT_YUV444 =3, /*!< 4:4:4 color. */ + MFX_CHROMAFORMAT_YUV400 = MFX_CHROMAFORMAT_MONOCHROME, /*!< Equal to monochrome. */ + MFX_CHROMAFORMAT_YUV411 = 4, /*!< 4:1:1 color. */ + MFX_CHROMAFORMAT_YUV422H = MFX_CHROMAFORMAT_YUV422, /*!< 4:2:2 color, horizontal sub-sampling. It is equal to 4:2:2 color. */ + MFX_CHROMAFORMAT_YUV422V = 5, /*!< 4:2:2 color, vertical sub-sampling. */ + MFX_CHROMAFORMAT_RESERVED1 = 6 /*!< Reserved. */ +}; + +enum { + MFX_TIMESTAMP_UNKNOWN = -1 /*!< Indicates that time stamp is unknown for this frame/bitstream portion. */ +}; + +enum { + MFX_FRAMEORDER_UNKNOWN = -1 /*!< Unused entry or API functions that generate the frame output do not use this frame. */ +}; + +/* The FrameDataFlag enumerator itemizes DataFlag value in mfxFrameData. */ +enum { + MFX_FRAMEDATA_TIMESTAMP_UNKNOWN = 0x0000,/*!< Indicates the time stamp of this frame is unknown and will be calculated by SDK. */ + MFX_FRAMEDATA_ORIGINAL_TIMESTAMP = 0x0001 /*!< Indicates the time stamp of this frame is not calculated and is a pass-through of the original time stamp. */ +}; + +/* Corrupted in mfxFrameData */ +enum { + MFX_CORRUPTION_NO = 0x0000, /*!< No corruption. */ + MFX_CORRUPTION_MINOR = 0x0001, /*!< Minor corruption in decoding certain macro-blocks. */ + MFX_CORRUPTION_MAJOR = 0x0002, /*!< Major corruption in decoding the frame - incomplete data, for example. */ + MFX_CORRUPTION_ABSENT_TOP_FIELD = 0x0004, /*!< Top field of frame is absent in bitstream. Only bottom field has been decoded. */ + MFX_CORRUPTION_ABSENT_BOTTOM_FIELD = 0x0008, /*!< Bottom field of frame is absent in bitstream. Only top filed has been decoded. */ + MFX_CORRUPTION_REFERENCE_FRAME = 0x0010, /*!< Decoding used a corrupted reference frame. A corrupted reference frame was used for decoding this + frame. For example, if the frame uses a reference frame that was decoded with minor/major corruption flag, then this + frame is also marked with a reference corruption flag. */ + MFX_CORRUPTION_REFERENCE_LIST = 0x0020 /*!< The reference list information of this frame does not match what is specified in the Reference Picture Marking + Repetition SEI message. (ITU-T H.264 D.1.8 dec_ref_pic_marking_repetition) */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Specifies "pixel" in Y410 color format. */ +typedef struct +{ + mfxU32 U : 10; /*!< U component. */ + mfxU32 Y : 10; /*!< Y component. */ + mfxU32 V : 10; /*!< V component. */ + mfxU32 A : 2; /*!< A component. */ +} mfxY410; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Specifies "pixel" in Y416 color format. */ +typedef struct +{ + mfxU32 U : 16; /*!< U component. */ + mfxU32 Y : 16; /*!< Y component. */ + mfxU32 V : 16; /*!< V component. */ + mfxU32 A : 16; /*!< A component. */ +} mfxY416; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Specifies "pixel" in A2RGB10 color format */ +typedef struct +{ + mfxU32 B : 10; /*!< B component. */ + mfxU32 G : 10; /*!< G component. */ + mfxU32 R : 10; /*!< R component. */ + mfxU32 A : 2; /*!< A component. */ +} mfxA2RGB10; +MFX_PACK_END() + +/*! Describes frame buffer pointers. */ +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + /*! @name Extension Buffers */ + /*! @{ */ + union { + mfxExtBuffer **ExtParam; /*!< Points to an array of pointers to the extra configuration structures. See the ExtendedBufferID + enumerator for a list of extended configurations. */ + mfxU64 reserved2; + }; + mfxU16 NumExtParam; /*!< The number of extra configuration structures attached to this structure. */ + /*! @} */ + + /*! @name General members */ + /*! @{ */ + mfxU16 reserved9; /*!< Reserved for future use. */ + mfxU16 MemType; /*!< Allocated memory type. See the ExtMemFrameType enumerator for details. Used for better integration of + 3rd party plugins into the pipeline. */ + mfxU16 PitchHigh; /*!< Distance in bytes between the start of two consecutive rows in a frame. */ + + mfxU64 TimeStamp; /*!< Time stamp of the video frame in units of 90KHz. Divide TimeStamp by 90,000 (90 KHz) to obtain the time in seconds. + A value of MFX_TIMESTAMP_UNKNOWN indicates that there is no time stamp. */ + mfxU32 FrameOrder; /*!< Current frame counter for the top field of the current frame. An invalid value of MFX_FRAMEORDER_UNKNOWN indicates that + API functions that generate the frame output do not use this frame. */ + mfxU16 Locked; /*!< Counter flag for the application. If Locked is greater than zero then the application locks the frame or field pair. + Do not move, alter or delete the frame. */ + union{ + mfxU16 Pitch; + mfxU16 PitchLow; /*!< Distance in bytes between the start of two consecutive rows in a frame. */ + }; + /*! @} */ + + /*! + @name Color Planes + Data pointers to corresponding color channels (planes). The frame buffer pointers must be 16-byte aligned. The application has to specify pointers to + all color channels even for packed formats. For example, for YUY2 format the application must specify Y, U, and V pointers. + For RGB32 format, the application must specify R, G, B, and A pointers. + */ + /*! @{ */ + union { + mfxU8 *Y; /*!< Y channel. */ + mfxU16 *Y16; /*!< Y16 channel. */ + mfxU8 *R; /*!< R channel. */ + }; + union { + mfxU8 *UV; /*!< UV channel for UV merged formats. */ + mfxU8 *VU; /*!< YU channel for VU merged formats. */ + mfxU8 *CbCr; /*!< CbCr channel for CbCr merged formats. */ + mfxU8 *CrCb; /*!< CrCb channel for CrCb merged formats. */ + mfxU8 *Cb; /*!< Cb channel. */ + mfxU8 *U; /*!< U channel. */ + mfxU16 *U16; /*!< U16 channel. */ + mfxU8 *G; /*!< G channel. */ + mfxY410 *Y410; /*!< T410 channel for Y410 format (merged AVYU). */ + mfxY416 *Y416; /*!< This format is a packed 16-bit representation that includes 16 bits of alpha. */ + }; + union { + mfxU8 *Cr; /*!< Cr channel. */ + mfxU8 *V; /*!< V channel. */ + mfxU16 *V16; /*!< V16 channel. */ + mfxU8 *B; /*!< B channel. */ + mfxA2RGB10 *A2RGB10; /*!< A2RGB10 channel for A2RGB10 format (merged ARGB). */ + }; + mfxU8 *A; /*!< A channel. */ + mfxMemId MemId; /*!< Memory ID of the data buffers. Ignored if any of the preceding data pointers is non-zero. */ + /*! @} */ + + /*! + @name Additional Flags + */ + /*! @{ */ + mfxU16 Corrupted; /*!< Some part of the frame or field pair is corrupted. See the Corruption enumerator for details. */ + mfxU16 DataFlag; /*!< Additional flags to indicate frame data properties. See the FrameDataFlag enumerator for details. */ + /*! @} */ +} mfxFrameData; +MFX_PACK_END() + +/*! The mfxHandleType enumerator itemizes system handle types that implementations might use. */ +typedef enum { + MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9 =1, /*!< Pointer to the IDirect3DDeviceManager9 interface. See Working with Microsoft* DirectX* Applications for more details on how to use this handle. */ + MFX_HANDLE_D3D9_DEVICE_MANAGER = MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9, /*!< Pointer to the IDirect3DDeviceManager9 interface. See Working with Microsoft* DirectX* Applications for more details on how to use this handle. */ + MFX_HANDLE_RESERVED1 = 2, /* Reserved. */ + MFX_HANDLE_D3D11_DEVICE = 3, /*!< Pointer to the ID3D11Device interface. See Working with Microsoft* DirectX* Applications for more details on how to use this handle. */ + MFX_HANDLE_VA_DISPLAY = 4, /*!< Pointer to VADisplay interface. See Working with VA-API Applications for more details on how to use this handle. */ + MFX_HANDLE_RESERVED3 = 5, /* Reserved. */ + MFX_HANDLE_VA_CONFIG_ID = 6, /*!< Pointer to VAConfigID interface. It represents external VA config for Common Encryption usage model. */ + MFX_HANDLE_VA_CONTEXT_ID = 7, /*!< Pointer to VAContextID interface. It represents external VA context for Common Encryption usage model. */ + MFX_HANDLE_CM_DEVICE = 8, /*!< Pointer to CmDevice interface ( Intel(r) C for Metal Runtime ). */ + MFX_HANDLE_HDDLUNITE_WORKLOADCONTEXT = 9, /*!< Pointer to HddlUnite::WorkloadContext interface. */ + MFX_HANDLE_PXP_CONTEXT = 10, /*!< Pointer to PXP context for protected content support. */ +} mfxHandleType; + +/*! The mfxMemoryFlags enumerator specifies memory access mode. */ +typedef enum +{ + MFX_MAP_READ = 0x1, /*!< The surface is mapped for reading. */ + MFX_MAP_WRITE = 0x2, /*!< The surface is mapped for writing. */ + MFX_MAP_READ_WRITE = MFX_MAP_READ|MFX_MAP_WRITE, /*!< The surface is mapped for reading and writing. */ + /*! + * The mapping would be done immediately without any implicit synchronizations. + * \attention This flag is optional. + */ + MFX_MAP_NOWAIT = 0x10 +} mfxMemoryFlags; + +#define MFX_FRAMESURFACE1_VERSION MFX_STRUCT_VERSION(1, 1) + +/* Frame Surface */ +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +/*! Defines the uncompressed frames surface information and data buffers. + The frame surface is in the frame or complementary field pairs of pixels up to four color-channels, in two parts: + mfxFrameInfo and mfxFrameData. +*/ +typedef struct { + union + { + struct mfxFrameSurfaceInterface* FrameInterface; /*!< Specifies interface to work with surface. */ + mfxU32 reserved2; + }; + mfxStructVersion Version; /* Specifies version of mfxFrameSurface1 structure. */ + mfxU16 reserved13; + mfxFrameInfo Info; /*!< Specifies surface properties. */ + mfxFrameData Data; /*!< Describes the actual frame buffer. */ +} mfxFrameSurface1; +MFX_PACK_END() + + +#define MFX_FRAMESURFACEINTERFACE_VERSION MFX_STRUCT_VERSION(1, 0) + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +/* Specifies frame surface interface. */ +typedef struct mfxFrameSurfaceInterface { + mfxHDL Context; /*!< The context of the memory interface. User should not touch (change, set, null) this pointer. */ + mfxStructVersion Version; /*!< The version of the structure. */ + mfxU16 reserved13; + /*! @brief + Increments the internal reference counter of the surface. The surface is not destroyed until the surface is released using the mfxFrameSurfaceInterface::Release function. + mfxFrameSurfaceInterface::AddRef should be used each time a new link to the surface is created (for example, copy structure) for proper surface management. + + @paramin surface Valid surface. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If surface is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxFrameSurfaceInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNKNOWN Any internal error. + + */ + mfxStatus (MFX_CDECL *AddRef)(mfxFrameSurface1* surface); + /*! @brief + Decrements the internal reference counter of the surface. mfxFrameSurfaceInterface::Release should be called after using the + mfxFrameSurfaceInterface::AddRef function to add a surface or when allocation logic requires it. For example, call + mfxFrameSurfaceInterface::Release to release a surface obtained with the GetSurfaceForXXX function. + + @paramin surface Valid surface. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If surface is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxFrameSurfaceInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNDEFINED_BEHAVIOR If Reference Counter of surface is zero before call. \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *Release)(mfxFrameSurface1* surface); + + /*! @brief + Returns current reference counter of mfxFrameSurface1 structure. + + @paramin surface Valid surface. + @paramout counter Sets counter to the current reference counter value. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If surface or counter is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxFrameSurfaceInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *GetRefCounter)(mfxFrameSurface1* surface, mfxU32* counter); + + /*! @brief + Sets pointers of surface->Info.Data to actual pixel data, providing read-write access. + + In case of video memory, the surface with data in video memory becomes mapped to system memory. + An application can map a surface for read access with any value of mfxFrameSurface1::Data::Locked, but can map a surface for write access only when mfxFrameSurface1::Data::Locked equals to 0. + + Note: A surface allows shared read access, but exclusive write access. Consider the following cases: + @li Map with Write or Read|Write flags. A request during active another read or write access returns MFX_ERR_LOCK_MEMORY error immediately, without waiting. + MFX_MAP_NOWAIT does not impact behavior. This type of request does not lead to any implicit synchronizations. + @li Map with Read flag. A request during active write access will wait for resource to become free, + or exits immediately with error if MFX_MAP_NOWAIT flag was set. This request may lead to the implicit synchronization (with same logic as Synchronize call) + waiting for surface to become ready to use (all dependencies should be resolved and upstream components finished writing to this surface). + + It is guaranteed that read access will be acquired right after synchronization without allowing another thread to acquire this surface for writing. + + If MFX_MAP_NOWAIT was set and the surface is not ready yet (for example the surface has unresolved data dependencies or active processing), the read access request exits immediately with error. + + Read-write access with MFX_MAP_READ_WRITE provides exclusive simultaneous reading and writing access. + + @note Bitwise copying of mfxFrameSurface1 object between map / unmap calls may result in having dangling data pointers in copies. + + @paramin surface Valid surface. + @paramout flags Specify mapping mode. + @paramout surface->Info.Data Pointers set to actual pixel data. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If surface is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxFrameSurfaceInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNSUPPORTED If flags are invalid. \n + MFX_ERR_LOCK_MEMORY If user wants to map the surface for write and surface->Data.Locked does not equal to 0. \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *Map)(mfxFrameSurface1* surface, mfxU32 flags); + + /*! @brief + Invalidates pointers of surface->Info.Data and sets them to NULL. + In case of video memory, the underlying texture becomes unmapped after last reader or writer unmap. + + + @paramin surface Valid surface. + @paramout surface->Info.Data Pointers set to NULL. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If surface is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxFrameSurfaceInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNSUPPORTED If surface is already unmapped. \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *Unmap)(mfxFrameSurface1* surface); + + /*! @brief + Returns a native resource's handle and type. The handle is returned *as-is*, meaning that the reference counter of base resources is not incremented. + The native resource is not detached from surface and the library still owns the resource. User must not destroy + the native resource or assume that the resource will be alive after mfxFrameSurfaceInterface::Release. + + + + @paramin surface Valid surface. + @paramout resource Pointer is set to the native handle of the resource. + @paramout resource_type Type of native resource. See mfxResourceType enumeration). + + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If any of surface, resource or resource_type is NULL. \n + MFX_ERR_INVALID_HANDLE If any of surface, resource or resource_type is not valid object (no native resource was allocated). \n + MFX_ERR_UNSUPPORTED If surface is in system memory. \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *GetNativeHandle)(mfxFrameSurface1* surface, mfxHDL* resource, mfxResourceType* resource_type); + + /*! @brief + Returns a device abstraction that was used to create that resource. + The handle is returned *as-is*, meaning that the reference counter for the device abstraction is not incremented. + The native resource is not detached from the surface and the library still has a reference to the resource. + User must not destroy the device or assume that the device will be alive after mfxFrameSurfaceInterface::Release. + + + @paramin surface Valid surface. + @paramout device_handle Pointer is set to the device which created the resource + @paramout device_type Type of device (see mfxHandleType enumeration). + + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If any of surface, device_handle or device_type is NULL. \n + MFX_ERR_INVALID_HANDLE If any of surface, resource or resource_type is not valid object (no native resource was allocated). \n + MFX_ERR_UNSUPPORTED If surface is in system memory. \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *GetDeviceHandle)(mfxFrameSurface1* surface, mfxHDL* device_handle, mfxHandleType* device_type); + + /*! @brief + Guarantees readiness of both the data (pixels) and any frame's meta information (for example corruption flags) after a function completes. + + Instead of MFXVideoCORE_SyncOperation, users may directly call the mfxFrameSurfaceInterface::Synchronize function after the corresponding + Decode or VPP function calls (MFXVideoDECODE_DecodeFrameAsync or MFXVideoVPP_RunFrameVPPAsync). + The prerequisites to call the functions are: + + @li The main processing functions return MFX_ERR_NONE. + @li A valid mfxFrameSurface1 object. + + + + @paramin surface Valid surface. + @paramout wait Wait time in milliseconds. + + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If surface is NULL. \n + MFX_ERR_INVALID_HANDLE If any of surface is not valid object . \n + MFX_WRN_IN_EXECUTION If the given timeout is expired and the surface is not ready. \n + MFX_ERR_ABORTED If the specified asynchronous function aborted due to data dependency on a previous asynchronous function that did not complete. \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *Synchronize)(mfxFrameSurface1* surface, mfxU32 wait); + + /*! @brief + The library calls the function after complete of associated video operation + notifying the application that frame surface is ready. + + @attention This is callback function and intended to be called by + the library only. + + @note The library calls this callback only when this surface is used as the output surface. + + It is expected that the function is low-intrusive designed otherwise it may + impact performance. + + @paramin sts The status of completed operation. + + */ + void (MFX_CDECL *OnComplete)(mfxStatus sts); + + /*! @brief + Returns an interface defined by the GUID. If the returned interface is a reference + counted object the caller should release the obtained interface to avoid memory leaks. + + @paramin surface Valid surface. + @paramin guid GUID of the requested interface. + @paramout iface Interface. + + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If interface or surface is NULL. \n + MFX_ERR_UNSUPPORTED If requested interface is not supported. \n + MFX_ERR_NOT_IMPLEMENTED If requested interface is not implemented. \n + MFX_ERR_NOT_INITIALIZED If requested interface is not available (not created or already deleted). \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *QueryInterface)(mfxFrameSurface1* surface, mfxGUID guid, mfxHDL* iface); + + mfxHDL reserved22; +} mfxFrameSurfaceInterface; +MFX_PACK_END() + +/*! The TimeStampCalc enumerator itemizes time-stamp calculation methods. */ +enum { + /*! The time stamp calculation is based on the input frame rate if time stamp is not explicitly specified. */ + MFX_TIMESTAMPCALC_UNKNOWN = 0, + /*! Adjust time stamp to 29.97fps on 24fps progressively encoded sequences if telecine attributes are available in the bitstream and + time stamp is not explicitly specified. The input frame rate must be specified. */ + MFX_TIMESTAMPCALC_TELECINE = 1, +}; + +/* Transcoding Info */ +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Specifies configurations for decoding, encoding, and transcoding processes. + A zero value in any of these fields indicates that the field is not explicitly specified. */ +typedef struct { + mfxU32 reserved7; /*!< Reserved for future use. */ + + /*! Hint to enable low power consumption mode for encoders. See the CodingOptionValue enumerator for values + of this option. Use the Query API function to check if this feature is supported. */ + mfxU16 LowPower; + /*! Specifies a multiplier for bitrate control parameters. Affects the following variables: InitialDelayInKB, BufferSizeInKB, + TargetKbps, MaxKbps. If this value is not equal to zero, the encoder calculates BRC parameters as ``value * BRCParamMultiplier``. */ + mfxU16 BRCParamMultiplier; + + mfxFrameInfo FrameInfo; /*!< mfxFrameInfo structure that specifies frame parameters. */ + mfxU32 CodecId; /*!< Specifies the codec format identifier in the FourCC code; see the CodecFormatFourCC enumerator for details. + This is a mandated input parameter for the QueryIOSurf and Init API functions. */ + mfxU16 CodecProfile; /*!< Specifies the codec profile; see the CodecProfile enumerator for details. Specify the codec profile explicitly or the API functions will determine + the correct profile from other sources, such as resolution and bitrate. */ + mfxU16 CodecLevel; /*!< Codec level; see the CodecLevel enumerator for details. Specify the codec level explicitly or the functions will determine the correct level from other sources, + such as resolution and bitrate. */ + mfxU16 NumThread; + + union { + struct { /* Encoding Options */ + mfxU16 TargetUsage; /*!< Target usage model that guides the encoding process; see the TargetUsage enumerator for details. */ + + /*! Number of pictures within the current GOP (Group of Pictures); if GopPicSize = 0, then the GOP size is unspecified. If GopPicSize = 1, only I-frames are used. + The following pseudo-code that shows how the library uses this parameter: + @code + mfxU16 get_gop_sequence (...) { + pos=display_frame_order; + if (pos == 0) + return MFX_FRAMETYPE_I | MFX_FRAMETYPE_IDR | MFX_FRAMETYPE_REF; + + If (GopPicSize == 1) // Only I-frames + return MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF; + + if (GopPicSize == 0) + frameInGOP = pos; //Unlimited GOP + else + frameInGOP = pos%GopPicSize; + + if (frameInGOP == 0) + return MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF; + + if (GopRefDist == 1 || GopRefDist == 0) // Only I,P frames + return MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; + + frameInPattern = (frameInGOP-1)%GopRefDist; + if (frameInPattern == GopRefDist - 1) + return MFX_FRAMETYPE_P | MFX_FRAMETYPE_REF; + + return MFX_FRAMETYPE_B; + } + @endcode */ + mfxU16 GopPicSize; + /*! Distance between I- or P (or GPB) - key frames; if it is zero, the GOP structure is unspecified. Note: If GopRefDist = 1, + there are no regular B-frames used (only P or GPB); if mfxExtCodingOption3::GPB is ON, GPB frames (B without backward + references) are used instead of P. */ + mfxU16 GopRefDist; + /*! ORs of the GopOptFlag enumerator indicate the additional flags for the GOP specification. */ + mfxU16 GopOptFlag; + /*! For H.264, specifies IDR-frame interval in terms of I-frames. + For example: + @li If IdrInterval = 0, then every I-frame is an IDR-frame. + @li If IdrInterval = 1, then every other I-frame is an IDR-frame. + + For HEVC, if IdrInterval = 0, then only first I-frame is an IDR-frame. For example: + @li If IdrInterval = 1, then every I-frame is an IDR-frame. + @li If IdrInterval = 2, then every other I-frame is an IDR-frame. + + For MPEG2, IdrInterval defines sequence header interval in terms of I-frames. For example: + @li If IdrInterval = 0 (default), then the sequence header is inserted once at the beginning of the stream. + @li If IdrInterval = N, then the sequence header is inserted before every Nth I-frame. + + + If GopPicSize or GopRefDist is zero, IdrInterval is undefined. */ + mfxU16 IdrInterval; + + mfxU16 RateControlMethod; /*! Rate control method; see the RateControlMethod enumerator for details. */ + union { + /*! Initial size of the Video Buffering Verifier (VBV) buffer. + @note In this context, KB is 1000 bytes and Kbps is 1000 bps. */ + mfxU16 InitialDelayInKB; + /*! Quantization Parameter (QP) for I-frames for constant QP mode (CQP). Zero QP is not valid and means that the default value is assigned by the library. + Non-zero QPI might be clipped to supported QPI range. + @note Default QPI value is implementation dependent and subject to change without additional notice in this document. */ + mfxU16 QPI; + mfxU16 Accuracy; /*!< Specifies accuracy range in the unit of tenth of percent. */ + }; + mfxU16 BufferSizeInKB; /*!< Represents the maximum possible size of any compressed frames. */ + union { + /*! Constant bitrate TargetKbps. Used to estimate the targeted frame size by dividing the frame rate by the bitrate. */ + mfxU16 TargetKbps; + /*! Quantization Parameter (QP) for P-frames for constant QP mode (CQP). Zero QP is not valid and means that the default value is assigned by the library. + Non-zero QPP might be clipped to supported QPI range. + @note Default QPP value is implementation dependent and subject to change without additional notice in this document. */ + mfxU16 QPP; + mfxU16 ICQQuality; /*!< Used by the Intelligent Constant Quality (ICQ) bitrate control algorithm. Values are in the 1 to 51 range, where 1 corresponds the best quality. */ + }; + union { + /*! The maximum bitrate at which the encoded data enters the Video Buffering Verifier (VBV) buffer. */ + mfxU16 MaxKbps; + /*! Quantization Parameter (QP) for B-frames for constant QP mode (CQP). Zero QP is not valid and means that the default value is assigned by the library. + Non-zero QPI might be clipped to supported QPB range. + @note Default QPB value is implementation dependent and subject to change without additional notice in this document. */ + mfxU16 QPB; + mfxU16 Convergence; /*!< Convergence period in the unit of 100 frames. */ + }; + + /*! Number of slices in each video frame. Each slice contains one or more macro-block rows. If NumSlice equals zero, the encoder may choose any slice partitioning + allowed by the codec standard. See also mfxExtCodingOption2::NumMbPerSlice. */ + mfxU16 NumSlice; + /*! Max number of all available reference frames (for AVC/HEVC, NumRefFrame defines DPB size). If NumRefFrame = 0, this parameter is not specified. + See also NumRefActiveP, NumRefActiveBL0, and NumRefActiveBL1 in the mfxExtCodingOption3 structure, which set a number of active references. */ + mfxU16 NumRefFrame; + /*! If not zero, specifies that ENCODE takes the input surfaces in the encoded order and uses explicit frame type control. + The application must still provide GopRefDist and mfxExtCodingOption2::BRefType so the library can pack headers and build reference + lists correctly. */ + mfxU16 EncodedOrder; + }; + struct { /* Decoding Options */ + /*! For AVC and HEVC, used to instruct the decoder to return output frames in the decoded order. Must be zero for all other decoders. + When enabled, correctness of mfxFrameData::TimeStamp and FrameOrder for output surface is not guaranteed, the application should ignore them. */ + mfxU16 DecodedOrder; + /*! Instructs DECODE to output extended picture structure values for additional display attributes. See the PicStruct description for details. */ + mfxU16 ExtendedPicStruct; + /*! Time stamp calculation method. See the TimeStampCalc description for details. */ + mfxU16 TimeStampCalc; + /*! Nonzero value indicates that slice groups are present in the bitstream. Used only by AVC decoder. */ + mfxU16 SliceGroupsPresent; + /*! Nonzero value specifies the maximum required size of the decoded picture buffer in frames for AVC and HEVC decoders. */ + mfxU16 MaxDecFrameBuffering; + /*! For decoders supporting dynamic resolution change (VP9), set this option to ON to allow MFXVideoDECODE_DecodeFrameAsync + return MFX_ERR_REALLOC_SURFACE. See the CodingOptionValue enumerator for values of this option. Use the Query API + function to check if this feature is supported. */ + mfxU16 EnableReallocRequest; + /*! Special parameter for AV1 decoder. Indicates presence/absence of film grain parameters in bitstream. + Also controls decoding behavior for streams with film grain parameters. MFXVideoDECODE_DecodeHeader returns nonzero FilmGrain + for streams with film grain parameters and zero for streams w/o them. Decoding with film grain requires additional output surfaces. + If FilmGrain` is non-zero then MFXVideoDECODE_QueryIOSurf will request more surfaces in case of external allocated video memory at decoder output. + FilmGrain is passed to MFXVideoDECODE_Init function to control decoding operation for AV1 streams with film grain parameters. + If FilmGrain is nonzero decoding of each frame require two output surfaces (one for reconstructed frame and one for output frame with film grain applied). + The decoder returns MFX_ERR_MORE_SURFACE from MFXVideoDECODE_DecodeFrameAsync if it has insufficient output surfaces to decode frame. + Application can forcibly disable the feature passing zero value of `FilmGrain` to `MFXVideoDECODE_Init`. + In this case the decoder will output reconstructed frames w/o film grain applied. + Application can retrieve film grain parameters for a frame by attaching extended buffer mfxExtAV1FilmGrainParam to mfxFrameSurface1. + If stream has no film grain parameters `FilmGrain` passed to `MFXVideoDECODE_Init` is ignored by the decoder. */ + mfxU16 FilmGrain; + /*! If not zero, it forces SDK to attempt to decode bitstream even if a decoder may not support all features associated with given CodecLevel. Decoder may produce visual artifacts. Only AVC decoder supports this field. */ + mfxU16 IgnoreLevelConstrain; + /*! This flag is used to disable output of main decoding channel. When it's ON SkipOutput = MFX_CODINGOPTION_ON decoder outputs only video processed channels. For pure decode this flag should be always disabled. */ + mfxU16 SkipOutput; + mfxU16 reserved24; + }; + struct { /* JPEG Decoding Options */ + /*! Specify the chroma sampling format that has been used to encode a JPEG picture. See the ChromaFormat enumerator for details. */ + mfxU16 JPEGChromaFormat; + /*! Rotation option of the output JPEG picture. See the Rotation enumerator for details. */ + mfxU16 Rotation; + /*! Specify the color format that has been used to encode a JPEG picture. See the JPEGColorFormat enumerator for details. */ + mfxU16 JPEGColorFormat; + /*! Specify JPEG scan type for decoder. See the JPEGScanType enumerator for details. */ + mfxU16 InterleavedDec; + mfxU8 SamplingFactorH4; /*!< Horizontal sampling factor. */ + mfxU8 SamplingFactorV4; /*!< Vertical sampling factor. */ + mfxU16 reserved35; + }; + struct { /* JPEG Encoding Options */ + /*! Specify interleaved or non-interleaved scans. If it is equal to MFX_SCANTYPE_INTERLEAVED then the image is encoded as interleaved, + all components are encoded in one scan. See the JPEG Scan Type enumerator for details. */ + mfxU16 Interleaved; + /*! Specifies the image quality if the application does not specified quantization table. + The value is from 1 to 100 inclusive. "100" is the best quality. */ + mfxU16 Quality; + /*! Specifies the number of MCU in the restart interval. "0" means no restart interval. */ + mfxU16 RestartInterval; + mfxU16 reserved510; + }; + }; +} mfxInfoMFX; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Specifies configurations for video processing. A zero value in any of the fields indicates + that the corresponding field is not explicitly specified. */ +typedef struct { + mfxU32 reserved8; + mfxFrameInfo In; /*!< Input format for video processing. */ + mfxFrameInfo Out; /*!< Output format for video processing. */ +} mfxInfoVPP; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! Configuration parameters for encoding, decoding, transcoding, and video processing. */ +typedef struct { + /*! Unique component ID that will be passed by the library to mfxFrameAllocRequest. Useful in pipelines where several + components of the same type share the same allocator. */ + mfxU32 AllocId; + mfxU32 reserved2; + mfxU16 reserved3; + /*! Specifies how many asynchronous operations an application performs before the application explicitly synchronizes the result. + If zero, the value is not specified. */ + mfxU16 AsyncDepth; + + union { + mfxInfoMFX mfx; /*!< Configurations related to encoding, decoding, and transcoding. See the definition of the mfxInfoMFX structure for details. */ + mfxInfoVPP vpp; /*!< Configurations related to video processing. See the definition of the mfxInfoVPP structure for details. */ + }; + /*! Specifies the content protection mechanism. See the Protected enumerator for a list of supported protection schemes. */ + mfxU16 Protected; + /*! Input and output memory access types for functions. See the enumerator IOPattern for details. + The Query API functions return the natively supported IOPattern if the Query input argument is NULL. + This parameter is a mandated input for QueryIOSurf and Init API functions. The output pattern must be specified for DECODE. + The input pattern must be specified for ENCODE. Both input and output pattern must be specified for VPP. */ + mfxU16 IOPattern; + mfxExtBuffer** ExtParam; /*!< The number of extra configuration structures attached to this structure. */ + mfxU16 NumExtParam; /*!< Points to an array of pointers to the extra configuration structures. See the ExtendedBufferID enumerator + for a list of extended configurations. + The list of extended buffers should not contain duplicated entries, such as entries of the same type. + If the mfxVideoParam structure is used to query library capability, then the list of extended buffers attached to the input + and output mfxVideoParam structure should be equal, that is, it should contain the same number of extended + buffers of the same type. */ + mfxU16 reserved2; +} mfxVideoParam; +MFX_PACK_END() + +/*! The IOPattern enumerator itemizes memory access patterns for API functions. Use bit-ORed values to specify an input access + pattern and an output access pattern. */ +enum { + MFX_IOPATTERN_IN_VIDEO_MEMORY = 0x01, /*!< Input to functions is a video memory surface. */ + MFX_IOPATTERN_IN_SYSTEM_MEMORY = 0x02, /*!< Input to functions is a linear buffer directly in system memory or in system memory through an external allocator. */ + MFX_IOPATTERN_OUT_VIDEO_MEMORY = 0x10, /*!< Output to functions is a video memory surface. */ + MFX_IOPATTERN_OUT_SYSTEM_MEMORY = 0x20 /*!< Output to functions is a linear buffer directly in system memory or in system memory through an external allocator. */ +}; + +/*! The CodecFormatFourCC enumerator itemizes codecs in the FourCC format. */ +enum { + MFX_CODEC_AVC =MFX_MAKEFOURCC('A','V','C',' '), /*!< AVC, H.264, or MPEG-4, part 10 codec. */ + MFX_CODEC_HEVC =MFX_MAKEFOURCC('H','E','V','C'), /*!< HEVC codec. */ + MFX_CODEC_MPEG2 =MFX_MAKEFOURCC('M','P','G','2'), /*!< MPEG-2 codec. */ + MFX_CODEC_VC1 =MFX_MAKEFOURCC('V','C','1',' '), /*!< VC-1 codec. */ + MFX_CODEC_CAPTURE =MFX_MAKEFOURCC('C','A','P','T'), /*!< */ + MFX_CODEC_VP9 =MFX_MAKEFOURCC('V','P','9',' '), /*!< VP9 codec. */ + MFX_CODEC_AV1 =MFX_MAKEFOURCC('A','V','1',' ') /*!< AV1 codec. */ +}; + +/*! +The CodecProfile enumerator itemizes codec profiles for all codecs. +CodecLevel +*/ +enum { + MFX_PROFILE_UNKNOWN =0, /*!< Unspecified profile. */ + MFX_LEVEL_UNKNOWN =0, /*!< Unspecified level. */ + + /*! @{ */ + /* Combined with H.264 profile these flags impose additional constrains. See H.264 specification for the list of constrains. */ + MFX_PROFILE_AVC_CONSTRAINT_SET0 = (0x100 << 0), + MFX_PROFILE_AVC_CONSTRAINT_SET1 = (0x100 << 1), + MFX_PROFILE_AVC_CONSTRAINT_SET2 = (0x100 << 2), + MFX_PROFILE_AVC_CONSTRAINT_SET3 = (0x100 << 3), + MFX_PROFILE_AVC_CONSTRAINT_SET4 = (0x100 << 4), + MFX_PROFILE_AVC_CONSTRAINT_SET5 = (0x100 << 5), + /*! @} */ + + /*! @{ */ + /* H.264 Profiles. */ + MFX_PROFILE_AVC_BASELINE =66, + MFX_PROFILE_AVC_MAIN =77, + MFX_PROFILE_AVC_EXTENDED =88, + MFX_PROFILE_AVC_HIGH =100, + MFX_PROFILE_AVC_HIGH10 =110, + MFX_PROFILE_AVC_HIGH_422 =122, + MFX_PROFILE_AVC_CONSTRAINED_BASELINE =MFX_PROFILE_AVC_BASELINE + MFX_PROFILE_AVC_CONSTRAINT_SET1, + MFX_PROFILE_AVC_CONSTRAINED_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4 + + MFX_PROFILE_AVC_CONSTRAINT_SET5, + MFX_PROFILE_AVC_PROGRESSIVE_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4, + /*! @} */ + + /*! @{ */ + /* H.264 level 1-1.3 */ + MFX_LEVEL_AVC_1 =10, + MFX_LEVEL_AVC_1b =9, + MFX_LEVEL_AVC_11 =11, + MFX_LEVEL_AVC_12 =12, + MFX_LEVEL_AVC_13 =13, + /*! @} */ + /*! @{ */ + /* H.264 level 2-2.2 */ + MFX_LEVEL_AVC_2 =20, + MFX_LEVEL_AVC_21 =21, + MFX_LEVEL_AVC_22 =22, + /*! @} */ + /*! @{ */ + /* H.264 level 3-3.2 */ + MFX_LEVEL_AVC_3 =30, + MFX_LEVEL_AVC_31 =31, + MFX_LEVEL_AVC_32 =32, + /*! @} */ + /*! @{ */ + /* H.264 level 4-4.2 */ + MFX_LEVEL_AVC_4 =40, + MFX_LEVEL_AVC_41 =41, + MFX_LEVEL_AVC_42 =42, + /*! @} */ + /*! @{ */ + /* H.264 level 5-5.2 */ + MFX_LEVEL_AVC_5 =50, + MFX_LEVEL_AVC_51 =51, + MFX_LEVEL_AVC_52 =52, + /*! @} */ + /*! @{ */ + /* H.264 level 6-6.2 */ + MFX_LEVEL_AVC_6 =60, + MFX_LEVEL_AVC_61 =61, + MFX_LEVEL_AVC_62 =62, + /*! @} */ + + /*! @{ */ + /* MPEG2 Profiles. */ + MFX_PROFILE_MPEG2_SIMPLE =0x50, + MFX_PROFILE_MPEG2_MAIN =0x40, + MFX_PROFILE_MPEG2_HIGH =0x10, + /*! @} */ + + /*! @{ */ + /* MPEG2 Levels. */ + MFX_LEVEL_MPEG2_LOW =0xA, + MFX_LEVEL_MPEG2_MAIN =0x8, + MFX_LEVEL_MPEG2_HIGH =0x4, + MFX_LEVEL_MPEG2_HIGH1440 =0x6, + /*! @} */ + + /*! @{ */ + /* VC-1 Profiles. */ + MFX_PROFILE_VC1_SIMPLE =(0+1), + MFX_PROFILE_VC1_MAIN =(4+1), + MFX_PROFILE_VC1_ADVANCED =(12+1), + /*! @} */ + + /*! @{ */ + /* VC-1 Level Low (simple & main profiles) */ + MFX_LEVEL_VC1_LOW =(0+1), + MFX_LEVEL_VC1_MEDIAN =(2+1), + MFX_LEVEL_VC1_HIGH =(4+1), + /*! @} */ + + /*! @{ */ + /* VC-1 advanced profile levels */ + MFX_LEVEL_VC1_0 =(0x00+1), + MFX_LEVEL_VC1_1 =(0x01+1), + MFX_LEVEL_VC1_2 =(0x02+1), + MFX_LEVEL_VC1_3 =(0x03+1), + MFX_LEVEL_VC1_4 =(0x04+1), + /*! @} */ + + /*! @{ */ + /* HEVC profiles */ + MFX_PROFILE_HEVC_MAIN =1, + MFX_PROFILE_HEVC_MAIN10 =2, + MFX_PROFILE_HEVC_MAINSP =3, + MFX_PROFILE_HEVC_REXT =4, + MFX_PROFILE_HEVC_SCC =9, + /*! @} */ + + /*! @{ */ + /* HEVC levels */ + MFX_LEVEL_HEVC_1 = 10, + MFX_LEVEL_HEVC_2 = 20, + MFX_LEVEL_HEVC_21 = 21, + MFX_LEVEL_HEVC_3 = 30, + MFX_LEVEL_HEVC_31 = 31, + MFX_LEVEL_HEVC_4 = 40, + MFX_LEVEL_HEVC_41 = 41, + MFX_LEVEL_HEVC_5 = 50, + MFX_LEVEL_HEVC_51 = 51, + MFX_LEVEL_HEVC_52 = 52, + MFX_LEVEL_HEVC_6 = 60, + MFX_LEVEL_HEVC_61 = 61, + MFX_LEVEL_HEVC_62 = 62, + /*! @} */ + + /*! @{ */ + /* HEVC tiers */ + MFX_TIER_HEVC_MAIN = 0, + MFX_TIER_HEVC_HIGH = 0x100, + /*! @} */ + + /*! @{ */ + /* VP9 Profiles */ + MFX_PROFILE_VP9_0 = 1, + MFX_PROFILE_VP9_1 = 2, + MFX_PROFILE_VP9_2 = 3, + MFX_PROFILE_VP9_3 = 4, + /*! @} */ + + /*! @{ */ + /* AV1 Profiles */ + MFX_PROFILE_AV1_MAIN = 1, + MFX_PROFILE_AV1_HIGH = 2, + MFX_PROFILE_AV1_PRO = 3, + /*! @} */ + + /*! @{ */ + /* AV1 Levels */ + MFX_LEVEL_AV1_2 = 20, + MFX_LEVEL_AV1_21 = 21, + MFX_LEVEL_AV1_22 = 22, + MFX_LEVEL_AV1_23 = 23, + MFX_LEVEL_AV1_3 = 30, + MFX_LEVEL_AV1_31 = 31, + MFX_LEVEL_AV1_32 = 32, + MFX_LEVEL_AV1_33 = 33, + MFX_LEVEL_AV1_4 = 40, + MFX_LEVEL_AV1_41 = 41, + MFX_LEVEL_AV1_42 = 42, + MFX_LEVEL_AV1_43 = 43, + MFX_LEVEL_AV1_5 = 50, + MFX_LEVEL_AV1_51 = 51, + MFX_LEVEL_AV1_52 = 52, + MFX_LEVEL_AV1_53 = 53, + MFX_LEVEL_AV1_6 = 60, + MFX_LEVEL_AV1_61 = 61, + MFX_LEVEL_AV1_62 = 62, + MFX_LEVEL_AV1_63 = 63, + MFX_LEVEL_AV1_7 = 70, + MFX_LEVEL_AV1_71 = 71, + MFX_LEVEL_AV1_72 = 72, + MFX_LEVEL_AV1_73 = 73, + /*! @} */ +}; + +/*! The GopOptFlag enumerator itemizes special properties in the GOP (Group of Pictures) sequence. */ +enum { + /*! + The encoder generates closed GOP if this flag is set. Frames in this GOP do not use frames in previous GOP as reference. + + The encoder generates open GOP if this flag is not set. In this GOP frames prior to the first frame of GOP in display order may use + frames from previous GOP as reference. Frames subsequent to the first frame of GOP in display order do not use frames from previous + GOP as reference. + + The AVC encoder ignores this flag if IdrInterval in mfxInfoMFX structure is set to 0, i.e. if every GOP starts from IDR frame. + In this case, GOP is encoded as closed. + + This flag does not affect long-term reference frames. + */ + MFX_GOP_CLOSED =1, + /*! + The encoder must strictly follow the given GOP structure as defined by parameter GopPicSize, GopRefDist etc in the mfxVideoParam structure. + Otherwise, the encoder can adapt the GOP structure for better efficiency, whose range is constrained by parameter GopPicSize and + GopRefDist etc. See also description of AdaptiveI and AdaptiveB fields in the mfxExtCodingOption2 structure. + */ + MFX_GOP_STRICT =2 +}; + +/*! The TargetUsage enumerator itemizes a range of numbers from MFX_TARGETUSAGE_1, best quality, to MFX_TARGETUSAGE_7, best speed. + It indicates trade-offs between quality and speed. The application can use any number in the range. The actual number of supported + target usages depends on implementation. If specified target usage is not supported, the encoder will use the closest supported value. */ +enum { + MFX_TARGETUSAGE_1 =1, /*!< Best quality */ + MFX_TARGETUSAGE_2 =2, + MFX_TARGETUSAGE_3 =3, + MFX_TARGETUSAGE_4 =4, /*!< Balanced quality and speed. */ + MFX_TARGETUSAGE_5 =5, + MFX_TARGETUSAGE_6 =6, + MFX_TARGETUSAGE_7 =7, /*!< Best speed */ + + MFX_TARGETUSAGE_UNKNOWN =0, /*!< Unspecified target usage. */ + MFX_TARGETUSAGE_BEST_QUALITY =MFX_TARGETUSAGE_1, /*!< Best quality. */ + MFX_TARGETUSAGE_BALANCED =MFX_TARGETUSAGE_4, /*!< Balanced quality and speed. */ + MFX_TARGETUSAGE_BEST_SPEED =MFX_TARGETUSAGE_7 /*!< Best speed. */ +}; + +/*! The RateControlMethod enumerator itemizes bitrate control methods. */ +enum { + MFX_RATECONTROL_CBR =1, /*!< Use the constant bitrate control algorithm. */ + MFX_RATECONTROL_VBR =2, /*!< Use the variable bitrate control algorithm. */ + MFX_RATECONTROL_CQP =3, /*!< Use the constant quantization parameter algorithm. */ + MFX_RATECONTROL_AVBR =4, /*!< Use the average variable bitrate control algorithm. */ + MFX_RATECONTROL_RESERVED1 =5, + MFX_RATECONTROL_RESERVED2 =6, + MFX_RATECONTROL_RESERVED3 =100, + MFX_RATECONTROL_RESERVED4 =7, + /*! + Use the VBR algorithm with look ahead. It is a special bitrate control mode in the AVC encoder that has been designed + to improve encoding quality. It works by performing extensive analysis of several dozen frames before the actual encoding and as a side + effect significantly increases encoding delay and memory consumption. + + The only available rate control parameter in this mode is mfxInfoMFX::TargetKbps. Two other parameters, MaxKbps and InitialDelayInKB, + are ignored. To control LA depth the application can use mfxExtCodingOption2::LookAheadDepth parameter. + + This method is not HRD compliant. + */ + MFX_RATECONTROL_LA =8, + /*! + Use the Intelligent Constant Quality algorithm. This algorithm improves subjective video quality of encoded stream. Depending on content, + it may or may not decrease objective video quality. Only one control parameter is used - quality factor, specified by mfxInfoMFX::ICQQuality. + */ + MFX_RATECONTROL_ICQ =9, + /*! + Use the Video Conferencing Mode algorithm. This algorithm is similar to the VBR and uses the same set of parameters mfxInfoMFX::InitialDelayInKB, + TargetKbpsandMaxKbps. It is tuned for IPPP GOP pattern and streams with strong temporal correlation between frames. + It produces better objective and subjective video quality in these conditions than other bitrate control algorithms. + It does not support interlaced content, B-frames and produced stream is not HRD compliant. + */ + MFX_RATECONTROL_VCM =10, + /*! + Use Intelligent Constant Quality algorithm with look ahead. Quality factor is specified by mfxInfoMFX::ICQQuality. + To control LA depth the application can use mfxExtCodingOption2::LookAheadDepth parameter. + + This method is not HRD compliant. + */ + MFX_RATECONTROL_LA_ICQ =11, + /*! + MFX_RATECONTROL_LA_EXT has been removed + */ + + /*! Use HRD compliant look ahead rate control algorithm. */ + MFX_RATECONTROL_LA_HRD =13, + /*! + Use the variable bitrate control algorithm with constant quality. This algorithm trying to achieve the target subjective quality with + the minimum number of bits, while the bitrate constraint and HRD compliance are satisfied. It uses the same set of parameters + as VBR and quality factor specified by mfxExtCodingOption3::QVBRQuality. + */ + MFX_RATECONTROL_QVBR =14, +}; + +/*! + The TrellisControl enumerator is used to control trellis quantization in AVC encoder. The application can turn it on + or off for any combination of I-, P- and B-frames by combining different enumerator values. For example, MFX_TRELLIS_I | MFX_TRELLIS_B + turns it on for I- and B-frames. + + @note Due to performance reason on some target usages trellis quantization is always turned off and this control is ignored by the encoder. +*/ +enum { + MFX_TRELLIS_UNKNOWN =0, /*!< Default value, it is up to the encoder to turn trellis quantization on or off. */ + MFX_TRELLIS_OFF =0x01, /*!< Turn trellis quantization off for all frame types. */ + MFX_TRELLIS_I =0x02, /*!< Turn trellis quantization on for I-frames. */ + MFX_TRELLIS_P =0x04, /*!< Turn trellis quantization on for P-frames. */ + MFX_TRELLIS_B =0x08 /*!< Turn trellis quantization on for B-frames. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Specifies additional options for encoding. + + The application can attach this extended buffer to the mfxVideoParam structure to configure initialization. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_CODING_OPTION. */ + + mfxU16 reserved1; + mfxU16 RateDistortionOpt; /*!< Set this flag if rate distortion optimization is needed. See the CodingOptionValue enumerator for values of this option. */ + mfxU16 MECostType; /*!< Motion estimation cost type. This value is reserved and must be zero. */ + mfxU16 MESearchType; /*!< Motion estimation search algorithm. This value is reserved and must be zero. */ + mfxI16Pair MVSearchWindow; /*!< Rectangular size of the search window for motion estimation. This parameter is reserved and must be (0, 0). */ + MFX_DEPRECATED mfxU16 EndOfSequence; /* Deprecated */ + mfxU16 FramePicture; /*!< Set this flag to encode interlaced fields as interlaced frames. This flag does not affect progressive input frames. See the CodingOptionValue enumerator for values of this option. */ + + mfxU16 CAVLC; /*!< If set, CAVLC is used; if unset, CABAC is used for encoding. See the CodingOptionValue enumerator for values of this option. */ + mfxU16 reserved22; + /*! + Set this flag to insert the recovery point SEI message at the beginning of every intra refresh cycle. See the description of + IntRefType in mfxExtCodingOption2 structure for details on how to enable and configure intra refresh. + + If intra refresh is not enabled then this flag is ignored. + + See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 RecoveryPointSEI; + /*! + Set this flag to instruct the MVC encoder to output each view in separate bitstream buffer. See the CodingOptionValue enumerator + for values of this option and the Multi-View Video Coding section for more details about usage of this flag. + */ + mfxU16 ViewOutput; + /*! + If this option is turned ON, then AVC encoder produces an HRD conformant bitstream. If it is turned OFF, then the AVC encoder may (but not necessarily) violate HRD conformance. That is, this option can force the encoder to produce an HRD conformant stream, but + cannot force it to produce a non-conformant stream. + + See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 NalHrdConformance; + /*! + If set, encoder puts all SEI messages in the singe NAL unit. It includes messages provided by application and created + by encoder. It is a three-states option. See CodingOptionValue enumerator for values of this option. The three states are: + + @li UNKNOWN Put each SEI in its own NAL unit. + + @li ON Put all SEI messages in the same NAL unit. + + @li OFF The same as unknown. + */ + mfxU16 SingleSeiNalUnit; + /*! + If set and VBR rate control method is used, then VCL HRD parameters are written in bitstream with values identical to the values of the NAL HRD parameters. + See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 VuiVclHrdParameters; + + mfxU16 RefPicListReordering; /*!< Set this flag to activate reference picture list reordering. This value is reserved and must be zero. */ + mfxU16 ResetRefList; /*!< Set this flag to reset the reference list to non-IDR I-frames of a GOP sequence. See the CodingOptionValue enumerator for values of this option. */ + /*! + Set this flag to write the reference picture marking repetition SEI message into the output bitstream. + See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 RefPicMarkRep; + /*! + Set this flag to instruct the AVC encoder to output bitstreams immediately after the encoder encodes a field, + in the field-encoding mode. See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 FieldOutput; + + mfxU16 IntraPredBlockSize; /*!< Minimum block size of intra-prediction. This value is reserved and must be zero. */ + mfxU16 InterPredBlockSize; /*!< Minimum block size of inter-prediction. This value is reserved and must be zero. */ + mfxU16 MVPrecision; /*!< Specify the motion estimation precision. This parameter is reserved and must be zero. */ + mfxU16 MaxDecFrameBuffering; /*!< Specifies the maximum number of frames buffered in a DPB. A value of zero means unspecified. */ + + mfxU16 AUDelimiter; /*!< Set this flag to insert the Access Unit Delimiter NAL. See the CodingOptionValue enumerator for values of this option. */ + MFX_DEPRECATED mfxU16 EndOfStream; /* Deprecated */ + /*! + Set this flag to insert the picture timing SEI with pic_struct syntax element. See sub-clauses D.1.2 and D.2.2 of the ISO/IEC 14496-10 + specification for the definition of this syntax element. See the CodingOptionValue enumerator for values of this option. + The default value is ON. + */ + mfxU16 PicTimingSEI; + mfxU16 VuiNalHrdParameters; /*!< Set this flag to insert NAL HRD parameters in the VUI header. See the CodingOptionValue enumerator for values of this option. */ +} mfxExtCodingOption; +MFX_PACK_END() + +/*! The BRefControl enumerator is used to control usage of B-frames as reference in AVC encoder. */ +enum { + MFX_B_REF_UNKNOWN = 0, /*!< Default value, it is up to the encoder to use B-frames as reference. */ + MFX_B_REF_OFF = 1, /*!< Do not use B-frames as reference. */ + MFX_B_REF_PYRAMID = 2 /*!< Arrange B-frames in so-called "B pyramid" reference structure. */ +}; + +/*! The LookAheadDownSampling enumerator is used to control down sampling in look ahead bitrate control mode in AVC encoder. */ +enum { + MFX_LOOKAHEAD_DS_UNKNOWN = 0, /*!< Default value, it is up to the encoder what down sampling value to use. */ + MFX_LOOKAHEAD_DS_OFF = 1, /*!< Do not use down sampling, perform estimation on original size frames. This is the slowest setting that produces the best quality. */ + MFX_LOOKAHEAD_DS_2x = 2, /*!< Down sample frames two times before estimation. */ + MFX_LOOKAHEAD_DS_4x = 3 /*!< Down sample frames four times before estimation. This option may significantly degrade quality. */ +}; + +/*! The BPSEIControl enumerator is used to control insertion of buffering period SEI in the encoded bitstream. */ +enum { + MFX_BPSEI_DEFAULT = 0x00, /*!< encoder decides when to insert BP SEI. */ + MFX_BPSEI_IFRAME = 0x01 /*!< BP SEI should be inserted with every I-frame */ +}; + +/*! The SkipFrame enumerator is used to define usage of mfxEncodeCtrl::SkipFrame parameter. */ +enum { + MFX_SKIPFRAME_NO_SKIP = 0, /*!< Frame skipping is disabled, mfxEncodeCtrl::SkipFrame is ignored. */ + MFX_SKIPFRAME_INSERT_DUMMY = 1, /*!< Skipping is allowed, when mfxEncodeCtrl::SkipFrame is set encoder inserts into bitstream frame + where all macroblocks are encoded as skipped. Only non-reference P- and B-frames can be skipped. + If GopRefDist = 1 and mfxEncodeCtrl::SkipFrame is set for reference P-frame, it will be encoded + as non-reference. */ + MFX_SKIPFRAME_INSERT_NOTHING = 2, /*!< Similar to MFX_SKIPFRAME_INSERT_DUMMY, but when mfxEncodeCtrl::SkipFrame is set encoder inserts nothing into bitstream. */ + MFX_SKIPFRAME_BRC_ONLY = 3, /*!< mfxEncodeCtrl::SkipFrame indicates number of missed frames before the current frame. Affects only BRC, current frame will be encoded as usual. */ +}; + +/*! The IntraRefreshTypes enumerator itemizes types of intra refresh. */ +enum { + MFX_REFRESH_NO = 0, /*!< Encode without refresh. */ + MFX_REFRESH_VERTICAL = 1, /*!< Vertical refresh, by column of MBs. */ + MFX_REFRESH_HORIZONTAL = 2, /*!< Horizontal refresh, by rows of MBs. */ + MFX_REFRESH_SLICE = 3 /*!< Horizontal refresh by slices without overlapping. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used with the mfxExtCodingOption structure to specify additional options for encoding. + + The application can attach this extended buffer to the mfxVideoParam structure to configure initialization and to the mfxEncodeCtrl during runtime. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_CODING_OPTION2. */ + + /*! + Specifies intra refresh type. See the IntraRefreshTypes. The major goal of intra refresh is improvement of error resilience without + significant impact on encoded bitstream size caused by I-frames. The encoder achieves this by encoding part of each frame in the refresh + cycle using intra MBs. + + This parameter is valid during initialization and + runtime. When used with temporal scalability, intra refresh applied only to base layer. + + MFX_REFRESH_NO No refresh. + + MFX_REFRESH_VERTICAL Vertical refresh, by column of MBs. + + MFX_REFRESH_HORIZONTAL Horizontal refresh, by rows of MBs. + + MFX_REFRESH_SLICE Horizontal refresh by slices without overlapping. + + MFX_REFRESH_SLICE Library ignores IntRefCycleSize (size of refresh cycle equals number slices). + */ + mfxU16 IntRefType; + /*! + Specifies number of pictures within refresh cycle starting from 2. 0 and 1 are invalid values. This parameter is valid only during initialization. + */ + mfxU16 IntRefCycleSize; + /*! + Specifies QP difference for inserted intra MBs. Signed values are in the -51 to 51 range. This parameter is valid during initialization and runtime. + */ + mfxI16 IntRefQPDelta; + + /*! + Specify maximum encoded frame size in byte. This parameter is used in VBR based bitrate control modes and ignored in others. + The encoder tries to keep frame size below specified limit but minor overshoots are possible to preserve visual quality. + This parameter is valid during initialization and runtime. It is recommended to set MaxFrameSize to 5x-10x target frame size + ((TargetKbps*1000)/(8* FrameRateExtN/FrameRateExtD)) for I-frames and 2x-4x target frame size for P- and B-frames. + */ + mfxU32 MaxFrameSize; + /*! + Specify maximum slice size in bytes. If this parameter is specified other controls over number of slices are ignored. + + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. + */ + mfxU32 MaxSliceSize; + + /*! + Modifies bitrate to be in the range imposed by the encoder. The default value is ON, that is, bitrate is limited. Setting this flag to OFF may lead to violation of HRD conformance.Specifying bitrate below the encoder range might significantly affect quality. + + If set to ON, this option takes effect in non CQP modes: + if TargetKbps is not in the range imposed by the encoder, it will be changed to be in the range. + + This parameter is valid only during initialization. Flag works with MFX_CODEC_AVC only, it is ignored with other codecs. + See the CodingOptionValue + enumerator for values of this option. + */ + mfxU16 BitrateLimit; + /*! + Setting this flag enables macroblock level bitrate control that generally improves subjective visual quality. Enabling this flag may + have negative impact on performance and objective visual quality metric. See the CodingOptionValue enumerator for values of this option. + The default value depends on target usage settings. + */ + mfxU16 MBBRC; + /*! + Set this option to ON to enable external BRC. See the CodingOptionValue enumerator for values of this option. + Use the Query API function to check if this feature is supported. + */ + mfxU16 ExtBRC; + /*! + Specifies the depth of the look ahead rate control algorithm. The depth value is the number of frames that the encoder analyzes before encoding. Values are in the 10 to 100 range, inclusive. + To instruct the encoder to use the default value the application should zero this field. + */ + mfxU16 LookAheadDepth; + /*! + Used to control trellis quantization in AVC encoder. See TrellisControl enumerator for values of this option. + This parameter is valid only during initialization. + */ + mfxU16 Trellis; + /*! + Controls picture parameter set repetition in AVC encoder. Set this flag to ON to repeat PPS with each frame. + See the CodingOptionValue enumerator for values of this option. The default value is ON. This parameter is valid only during initialization. + */ + mfxU16 RepeatPPS; + /*! + Controls usage of B-frames as reference. See BRefControl enumerator for values of this option. + This parameter is valid only during initialization. + */ + mfxU16 BRefType; + /*! + Controls insertion of I-frames by the encoder. Set this flag to ON to allow changing of frame type from P and B to I. + This option is ignored if GopOptFlag in mfxInfoMFX structure is equal to MFX_GOP_STRICT. See the CodingOptionValue enumerator + for values of this option. This parameter is valid only during initialization. + */ + mfxU16 AdaptiveI; + /*! + Controls changing of frame type from B to P. Set this flag to ON enable changing of frame type from B to P. This option is ignored if + GopOptFlag in mfxInfoMFX structure is equal to MFX_GOP_STRICT. See the CodingOptionValue enumerator for values of this option. + This parameter is valid only during initialization. + */ + mfxU16 AdaptiveB; + /*! + Controls down sampling in look ahead bitrate control mode. See LookAheadDownSampling enumerator for values + of this option. This parameter is valid only during initialization. + */ + mfxU16 LookAheadDS; + /*! + Specifies suggested slice size in number of macroblocks. The library can adjust this number based on platform capability. + If this option is specified, that is, if it is not equal to zero, the library ignores mfxInfoMFX::NumSlice parameter. + */ + mfxU16 NumMbPerSlice; + /*! + Enables usage of mfxEncodeCtrl::SkipFrameparameter. See the SkipFrame enumerator for values of this option. + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. + */ + mfxU16 SkipFrame; + mfxU8 MinQPI; /*!< Minimum allowed QP value for I-frame types. Valid range is 1 to 51 inclusive. Zero means default value, that is, no limitations on QP. + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ + mfxU8 MaxQPI; /*!< Maximum allowed QP value for I-frame types. Valid range is 1 to 51 inclusive. Zero means default value, that is, no limitations on QP. + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ + mfxU8 MinQPP; /*!< Minimum allowed QP value for P-frame types. Valid range is 1 to 51 inclusive. Zero means default value, that is, no limitations on QP. + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ + mfxU8 MaxQPP; /*!< Maximum allowed QP value for P-frame types. Valid range is 1 to 51 inclusive. Zero means default value, that is, no limitations on QP. + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ + mfxU8 MinQPB; /*!< Minimum allowed QP value for B-frame types. Valid range is 1 to 51 inclusive. Zero means default value, that is, no limitations on QP. + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ + mfxU8 MaxQPB; /*!< Maximum allowed QP value for B-frame types. Valid range is 1 to 51 inclusive. Zero means default value, that is, no limitations on QP. + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. */ + /*! + Sets fixed_frame_rate_flag in VUI. + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. + */ + mfxU16 FixedFrameRate; + /*! Disables deblocking. + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. + */ + mfxU16 DisableDeblockingIdc; + /*! + Completely disables VUI in the output bitstream. + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. + */ + mfxU16 DisableVUI; + /*! + Controls insertion of buffering period SEI in the encoded bitstream. It should be one of the following values: + + MFX_BPSEI_DEFAULT Encoder decides when to insert BP SEI, + + MFX_BPSEI_IFRAME BP SEI should be inserted with every I-frame. + */ + mfxU16 BufferingPeriodSEI; + /*! + Set this flag to ON to enable per-frame reporting of Mean Absolute Difference. This parameter is valid only during initialization. + */ + mfxU16 EnableMAD; + /*! + Set this flag to ON to use raw frames for reference instead of reconstructed frames. This parameter is valid during + initialization and runtime (only if was turned ON during initialization). + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. + */ + mfxU16 UseRawRef; +} mfxExtCodingOption2; +MFX_PACK_END() + +/*! The WeightedPred enumerator itemizes weighted prediction modes. */ +enum { + MFX_WEIGHTED_PRED_UNKNOWN = 0, /*!< Allow encoder to decide. */ + MFX_WEIGHTED_PRED_DEFAULT = 1, /*!< Use default weighted prediction. */ + MFX_WEIGHTED_PRED_EXPLICIT = 2, /*!< Use explicit weighted prediction. */ + MFX_WEIGHTED_PRED_IMPLICIT = 3 /*!< Use implicit weighted prediction (for B-frames only). */ +}; + +/*! The ScenarioInfo enumerator itemizes scenarios for the encoding session. */ +enum { + MFX_SCENARIO_UNKNOWN = 0, + MFX_SCENARIO_DISPLAY_REMOTING = 1, + MFX_SCENARIO_VIDEO_CONFERENCE = 2, + MFX_SCENARIO_ARCHIVE = 3, + MFX_SCENARIO_LIVE_STREAMING = 4, + MFX_SCENARIO_CAMERA_CAPTURE = 5, + MFX_SCENARIO_VIDEO_SURVEILLANCE = 6, + MFX_SCENARIO_GAME_STREAMING = 7, + MFX_SCENARIO_REMOTE_GAMING = 8 +}; + +/*! The ContentInfo enumerator itemizes content types for the encoding session. */ +enum { + MFX_CONTENT_UNKNOWN = 0, + MFX_CONTENT_FULL_SCREEN_VIDEO = 1, + MFX_CONTENT_NON_VIDEO_SCREEN = 2 +}; + +/*! The PRefType enumerator itemizes models of reference list construction and DPB management when GopRefDist=1. */ +enum { + MFX_P_REF_DEFAULT = 0, /*!< Allow encoder to decide. */ + MFX_P_REF_SIMPLE = 1, /*!< Regular sliding window used for DPB removal process. */ + MFX_P_REF_PYRAMID = 2 /*!< Let N be the max reference list's size. Encoder treats each N's frame as a 'strong' + reference and the others as 'weak' references. The encoder uses a 'weak' reference only for + prediction of the next frame and removes it from DPB immediately after use. 'Strong' references are removed from + DPB by a sliding window. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used with mfxExtCodingOption and mfxExtCodingOption2 structures to specify additional options for encoding. + The application can attach this extended buffer to the mfxVideoParam structure to configure initialization and to the mfxEncodeCtrl during runtime. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_CODING_OPTION3. */ + + mfxU16 NumSliceI; /*!< The number of slices for I-frames. + @note Not all codecs and implementations support these values. Use the Query API function to check if this feature is supported */ + mfxU16 NumSliceP; /*!< The number of slices for P-frames. + @note Not all codecs and implementations support these values. Use the Query API function to check if this feature is supported */ + mfxU16 NumSliceB; /*!< The number of slices for B-frames. + @note Not all codecs and implementations support these values. Use the Query API function to check if this feature is supported */ + + /*! + When rate control method is MFX_RATECONTROL_VBR, MFX_RATECONTROL_LA, MFX_RATECONTROL_LA_HRD, or MFX_RATECONTROL_QVBR this parameter + specifies the maximum bitrate averaged over a sliding window specified by WinBRCSize. For MFX_RATECONTROL_CBR this parameter is ignored and + equals TargetKbps. + */ + mfxU16 WinBRCMaxAvgKbps; + /*! + When rate control method is MFX_RATECONTROL_CBR, MFX_RATECONTROL_VBR, MFX_RATECONTROL_LA, MFX_RATECONTROL_LA_HRD, or MFX_RATECONTROL_QVBR + this parameter specifies sliding window size in frames. Set this parameter to zero to disable sliding window. + */ + mfxU16 WinBRCSize; + + /*! When rate control method is MFX_RATECONTROL_QVBR, this parameter specifies quality factor. + Values are in the 1 to 51 range, where 1 corresponds to the best quality. + */ + mfxU16 QVBRQuality; + /*! + Set this flag to ON to enable per-macroblock QP control. Rate control method must be MFX_RATECONTROL_CQP. See the CodingOptionValue + enumerator for values of this option. This parameter is valid only during initialization. + */ + mfxU16 EnableMBQP; + /*! + Distance between the beginnings of the intra-refresh cycles in frames. Zero means no distance between cycles. + */ + mfxU16 IntRefCycleDist; + /*! + Set this flag to ON to enable the ENC mode decision algorithm to bias to fewer B Direct/Skip types. Applies only to B-frames, + all other frames will ignore this setting. See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 DirectBiasAdjustment; + /*! + Enables global motion bias. See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 GlobalMotionBiasAdjustment; + /*! + Values are: + + @li 0: Set MV cost to be 0. + + @li 1: Scale MV cost to be 1/2 of the default value. + + @li 2: Scale MV cost to be 1/4 of the default value. + + @li 3: Scale MV cost to be 1/8 of the default value. + */ + mfxU16 MVCostScalingFactor; + /*! + Set this flag to ON to enable usage of mfxExtMBDisableSkipMap. See the CodingOptionValue enumerator for values of this option. + This parameter is valid only during initialization. + */ + mfxU16 MBDisableSkipMap; + + mfxU16 WeightedPred; /*!< Weighted prediction mode. See the WeightedPred enumerator for values of these options. */ + mfxU16 WeightedBiPred; /*!< Weighted prediction mode. See the WeightedPred enumerator for values of these options. */ + + /*! + Instructs encoder whether aspect ratio info should present in VUI parameters. See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 AspectRatioInfoPresent; + /*! + Instructs encoder whether overscan info should present in VUI parameters. See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 OverscanInfoPresent; + /*! + ON indicates that the cropped decoded pictures output are suitable for display using overscan. OFF indicates that the cropped decoded + pictures output contain visually important information in the entire region out to the edges of the cropping rectangle of the picture. + See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 OverscanAppropriate; + /*! + Instructs encoder whether frame rate info should present in VUI parameters. See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 TimingInfoPresent; + /*! + Instructs encoder whether bitstream restriction info should present in VUI parameters. See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 BitstreamRestriction; + /*! + Corresponds to AVC syntax element low_delay_hrd_flag (VUI). See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 LowDelayHrd; + /*! + When set to OFF, no sample outside the picture boundaries and no sample at a fractional sample position for which the sample value + is derived using one or more samples outside the picture boundaries is used for inter prediction of any sample. + + When set to ON, one or more samples outside picture boundaries may be used in inter prediction. + + See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 MotionVectorsOverPicBoundaries; + mfxU16 reserved12; + + mfxU16 ScenarioInfo; /*!< Provides a hint to encoder about the scenario for the encoding session. See the ScenarioInfo enumerator for values of this option. */ + mfxU16 ContentInfo; /*!< Provides a hint to encoder about the content for the encoding session. See the ContentInfo enumerator for values of this option. */ + + mfxU16 PRefType; /*!< When GopRefDist=1, specifies the model of reference list construction and DPB management. See the PRefType enumerator for values of this option. */ + /*! + Instructs encoder whether internal fade detection algorithm should be used for calculation of weigh/offset values for pred_weight_table + unless application provided mfxExtPredWeightTable for this frame. See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 FadeDetection; + mfxU16 reserved22; + /*! + Set this flag to OFF to make HEVC encoder use regular P-frames instead of GPB. See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 GPB; + + /*! + Same as mfxExtCodingOption2::MaxFrameSize but affects only I-frames. MaxFrameSizeI must be set if MaxFrameSizeP is set. + If MaxFrameSizeI is not specified or greater than spec limitation, spec limitation will be applied to the sizes of I-frames. + */ + mfxU32 MaxFrameSizeI; + /*! + Same as mfxExtCodingOption2::MaxFrameSize but affects only P/B-frames. If MaxFrameSizeP equals 0, the library sets MaxFrameSizeP + equal to MaxFrameSizeI. If MaxFrameSizeP is not specified or greater than spec limitation, spec limitation will be applied to the + sizes of P/B-frames. + */ + mfxU32 MaxFrameSizeP; + mfxU32 reserved33; + + /*! + Enables QPOffset control. See the CodingOptionValue enumerator for values of this option. + */ + mfxU16 EnableQPOffset; + /*! + Specifies QP offset per pyramid layer when EnableQPOffset is set to ON and RateControlMethod is CQP. + + For B-pyramid, B-frame QP = QPB + QPOffsetlayer. + + For P-pyramid, P-frame QP = QPP + QPOffsetlayer. + */ + mfxI16 QPOffset8; /* FrameQP = QPX + QPOffsetpyramid_layer; QPX = QPB for B-pyramid, QPP for P-pyramid */ + + + mfxU16 NumRefActiveP8; /*!< Max number of active references for P-frames. Array index is pyramid layer. */ + mfxU16 NumRefActiveBL08; /*!< Max number of active references for B-frames in reference picture list 0. Array index is pyramid layer. */ + mfxU16 NumRefActiveBL18; /*!< Max number of active references for B-frames in reference picture list 1. Array index is pyramid layer. */ + + mfxU16 reserved6; + /*! + For HEVC if this option is turned ON, the transform_skip_enabled_flag will be set to 1 in PPS. OFF specifies that transform_skip_enabled_flag will be set to 0. + */ + mfxU16 TransformSkip; + /*! + Minus 1 specifies target encoding chroma format (see ChromaFormatIdc enumerator). May differ from the source format. + TargetChromaFormatPlus1 = 0 specifies the default target chroma format which is equal to source (mfxVideoParam::mfx::FrameInfo::ChromaFormat + 1), + except RGB4 source format. In case of RGB4 source format default target , chroma format is 4:2:0 (instead of 4:4:4) + for the purpose of backward compatibility. + */ + mfxU16 TargetChromaFormatPlus1; + /*! + Target encoding bit-depth for luma samples. May differ from source bit-depth. 0 specifies a default target bit-depth that is equal to + source (mfxVideoParam::mfx::FrameInfo::BitDepthLuma). + */ + mfxU16 TargetBitDepthLuma; + /*! + Target encoding bit-depth for chroma samples. May differ from source bit-depth. 0 specifies a default target bit-depth that is equal to + source (mfxVideoParam::mfx::FrameInfo::BitDepthChroma). + */ + mfxU16 TargetBitDepthChroma; + mfxU16 BRCPanicMode; /*!< Controls panic mode in AVC and MPEG2 encoders. */ + + /*! + When rate control method is MFX_RATECONTROL_VBR, MFX_RATECONTROL_QVBR or MFX_RATECONTROL_VCM this parameter specifies frame size + tolerance. Set this parameter to MFX_CODINGOPTION_ON to allow strictly obey average frame size set by MaxKbps, for example cases when + MaxFrameSize == (MaxKbps*1000)/(8* FrameRateExtN/FrameRateExtD). Also MaxFrameSizeI and MaxFrameSizeP can be set separately. + */ + mfxU16 LowDelayBRC; + /*! + Set this flag to ON to enable usage of mfxExtMBForceIntra for AVC encoder. See the CodingOptionValue enumerator + for values of this option. This parameter is valid only during initialization. + */ + mfxU16 EnableMBForceIntra; + /*! + If this flag is set to ON, BRC may decide a larger P- or B-frame size than what MaxFrameSizeP dictates when the scene change is detected. + It may benefit the video quality. AdaptiveMaxFrameSize feature is not supported with LowPower ON or if the value of MaxFrameSizeP = 0. + */ + mfxU16 AdaptiveMaxFrameSize; + + /*! + Controls AVC encoder attempts to predict from small partitions. Default value allows encoder to choose preferred mode. + MFX_CODINGOPTION_ON forces encoder to favor quality and MFX_CODINGOPTION_OFF forces encoder to favor performance. + */ + mfxU16 RepartitionCheckEnable; + mfxU16 reserved53; + mfxU16 EncodedUnitsInfo; /*!< Set this flag to ON to make encoded units info available in mfxExtEncodedUnitsInfo. */ + /*! + If this flag is set to ON, the HEVC encoder uses the NAL unit type provided by the application in the mfxEncodeCtrl::MfxNalUnitType field. + This parameter is valid only during initialization. + @note Not all codecs and implementations support this value. Use the Query API function to check if this feature is supported. + */ + mfxU16 EnableNalUnitType; + + union { + MFX_DEPRECATED mfxU16 ExtBrcAdaptiveLTR; /* Deprecated */ + + /*! + If this flag is set to ON, encoder will mark, modify, or remove LTR frames based on encoding parameters and content + properties. Turn OFF to prevent Adaptive marking of Long Term Reference Frames. + */ + mfxU16 AdaptiveLTR; + }; + /*! + If this flag is set to ON, encoder adaptively selects one of implementation-defined quantization matrices for each frame. + Non-default quantization matrices aim to improve subjective visual quality under certain conditions. + Their number and definitions are API implementation specific. + If this flag is set to OFF, default quantization matrix is used for all frames. + This parameter is valid only during initialization. + */ + mfxU16 AdaptiveCQM; + /*! + If this flag is set to ON, encoder adaptively selects list of reference frames to imrove encoding quality. + Enabling of the flag can increase computation complexity and introduce additional delay. + If this flag is set to OFF, regular reference frames are used for encoding. + */ + mfxU16 AdaptiveRef; + +#ifdef ONEVPL_EXPERIMENTAL + /*! + The tri-state option specifies hint for the library to execute encoding tools processing on CPU. + It may give better encoding quality, but leads to higher CPU utilization. + The library can ignore MFX_CODINGOPTION_ON if processing on CPU is not supported. + */ + mfxU16 CPUEncToolsProcessing; + mfxU16 reserved160; +#else + mfxU16 reserved161; +#endif + +} mfxExtCodingOption3; +MFX_PACK_END() + +/*! IntraPredBlockSize/InterPredBlockSize specifies the minimum block size of inter-prediction. */ +enum { + MFX_BLOCKSIZE_UNKNOWN = 0, /*!< Unspecified. */ + MFX_BLOCKSIZE_MIN_16X16 = 1, /*!< 16x16 minimum block size. */ + MFX_BLOCKSIZE_MIN_8X8 = 2, /*!< 8x8 minimum block size. May be 16x16 or 8x8. */ + MFX_BLOCKSIZE_MIN_4X4 = 3 /*!< 4x4 minimum block size. May be 16x16, 8x8, or 4x4. */ +}; + +/*! The MVPrecision enumerator specifies the motion estimation precision. */ +enum { + MFX_MVPRECISION_UNKNOWN = 0, + MFX_MVPRECISION_INTEGER = (1 << 0), + MFX_MVPRECISION_HALFPEL = (1 << 1), + MFX_MVPRECISION_QUARTERPEL = (1 << 2) +}; + +/*! The CodingOptionValue enumerator defines a three-state coding option setting. */ +enum { + MFX_CODINGOPTION_UNKNOWN =0, /*!< Unspecified. */ + MFX_CODINGOPTION_ON =0x10, /*!< Coding option set. */ + MFX_CODINGOPTION_OFF =0x20, /*!< Coding option not set. */ + MFX_CODINGOPTION_ADAPTIVE =0x30 /*!< Reserved. */ +}; + +/*! The BitstreamDataFlag enumerator uses bit-ORed values to itemize additional information about the bitstream buffer. */ +enum { + MFX_BITSTREAM_NO_FLAG = 0x0000, /*!< The bitstream doesn't contain any flags. */ + /*! + The bitstream buffer contains a complete frame or complementary field pair of data for the bitstream. For decoding, this means + that the decoder can proceed with this buffer without waiting for the start of the next frame, which effectively reduces decoding latency. + If this flag is set, but the bitstream buffer contains incomplete frame or pair of field, then decoder will produce corrupted output. + */ + MFX_BITSTREAM_COMPLETE_FRAME = 0x0001, + /*! + The bitstream buffer contains the end of the stream. For decoding, + this means that the application does not have any additional bitstream data to send to decoder. + */ + MFX_BITSTREAM_EOS = 0x0002 +}; +/*! The ExtendedBufferID enumerator itemizes and defines identifiers (BufferId) for extended buffers or video processing algorithm identifiers. */ +enum { + /*! + This extended buffer defines additional encoding controls. See the mfxExtCodingOption structure for details. + The application can attach this buffer to the structure for encoding initialization. + */ + MFX_EXTBUFF_CODING_OPTION = MFX_MAKEFOURCC('C','D','O','P'), + /*! + This extended buffer defines sequence header and picture header for encoders and decoders. See the mfxExtCodingOptionSPSPPS + structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding initialization, + and for obtaining raw headers from the decoders and encoders. + */ + MFX_EXTBUFF_CODING_OPTION_SPSPPS = MFX_MAKEFOURCC('C','O','S','P'), + /*! + This extended buffer defines a list of VPP algorithms that applications should not use. See the mfxExtVPPDoNotUse structure + for details. The application can attach this buffer to the mfxVideoParam structure for video processing initialization. + */ + MFX_EXTBUFF_VPP_DONOTUSE = MFX_MAKEFOURCC('N','U','S','E'), + /*! + This extended buffer defines auxiliary information at the VPP output. See the mfxExtVppAuxData structure for details. The application + can attach this buffer to the mfxEncodeCtrl structure for per-frame encoding control. + */ + MFX_EXTBUFF_VPP_AUXDATA = MFX_MAKEFOURCC('A','U','X','D'), + /*! + The extended buffer defines control parameters for the VPP denoise filter algorithm. See the mfxExtVPPDenoise2 structure for details. + The application can attach this buffer to the mfxVideoParam structure for video processing initialization. + */ + MFX_EXTBUFF_VPP_DENOISE2 = MFX_MAKEFOURCC('D','N','I','2'), + MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_EXTBUFF_VPP_DENOISE) = MFX_MAKEFOURCC('D','N','I','S'), /*!< Deprecated in 2.2 API version.*/ + MFX_EXTBUFF_VPP_SCENE_ANALYSIS = MFX_MAKEFOURCC('S','C','L','Y'), /*!< Reserved for future use. */ + MFX_DEPRECATED_ENUM_FIELD_INSIDE(MFX_EXTBUFF_VPP_SCENE_CHANGE) = MFX_EXTBUFF_VPP_SCENE_ANALYSIS, /* Deprecated. */ + /*! + The extended buffer defines control parameters for the VPP ProcAmp filter algorithm. See the mfxExtVPPProcAmp structure for details. + The application can attach this buffer to the mfxVideoParam structure for video processing initialization or to the mfxFrameData + structure in the mfxFrameSurface1 structure of output surface for per-frame processing configuration. + */ + MFX_EXTBUFF_VPP_PROCAMP = MFX_MAKEFOURCC('P','A','M','P'), + /*! + The extended buffer defines control parameters for the VPP detail filter algorithm. See the mfxExtVPPDetail structure for details. + The application can attach this buffer to the structure for video processing initialization. + */ + MFX_EXTBUFF_VPP_DETAIL = MFX_MAKEFOURCC('D','E','T',' '), + /*! + This extended buffer defines video signal type. See the mfxExtVideoSignalInfo structure for details. The application can attach this + buffer to the mfxVideoParam structure for encoding initialization, and for retrieving such information from the decoders. If video + signal info changes per frame, the application can attach this buffer to the mfxFrameData structure for video processing. + */ + MFX_EXTBUFF_VIDEO_SIGNAL_INFO = MFX_MAKEFOURCC('V','S','I','N'), + /*! + This extended buffer defines video signal type. See the mfxExtVideoSignalInfo structure for details. The application can attach this + buffer to the mfxVideoParam structure for the input of video processing if the input video signal information changes in sequence + base. + */ + MFX_EXTBUFF_VIDEO_SIGNAL_INFO_IN = MFX_MAKEFOURCC('V','S','I','I'), + /*! + This extended buffer defines video signal type. See the mfxExtVideoSignalInfo structure for details. The application can attach this + buffer to the mfxVideoParam structure for the output of video processing if the output video signal information changes in sequence + base. + */ + MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT = MFX_MAKEFOURCC('V','S','I','O'), + /*! + This extended buffer defines a list of VPP algorithms that applications should use. See the mfxExtVPPDoUse structure for details. + The application can attach this buffer to the structure for video processing initialization. + */ + MFX_EXTBUFF_VPP_DOUSE = MFX_MAKEFOURCC('D','U','S','E'), + /*! + This extended buffer defines additional encoding controls for reference list. See the mfxExtAVCRefListCtrl structure for details. + The application can attach this buffer to the mfxVideoParam structure for encoding & decoding initialization, or the mfxEncodeCtrl + structure for per-frame encoding configuration. + */ + MFX_EXTBUFF_AVC_REFLIST_CTRL = MFX_MAKEFOURCC('R','L','S','T'), + /*! + This extended buffer defines control parameters for the VPP frame rate conversion algorithm. See the mfxExtVPPFrameRateConversion structure + for details. The application can attach this buffer to the mfxVideoParam structure for video processing initialization. + */ + MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION = MFX_MAKEFOURCC('F','R','C',' '), + /*! + This extended buffer configures the H.264 picture timing SEI message. See the mfxExtPictureTimingSEI structure for details. + The application can attach this buffer to the mfxVideoParam structure for encoding initialization, or the mfxEncodeCtrl structure + for per-frame encoding configuration. + */ + MFX_EXTBUFF_PICTURE_TIMING_SEI = MFX_MAKEFOURCC('P','T','S','E'), + /*! + This extended buffer configures the structure of temporal layers inside the encoded H.264 bitstream. See the mfxExtAvcTemporalLayers + structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding initialization. + */ + MFX_EXTBUFF_AVC_TEMPORAL_LAYERS = MFX_MAKEFOURCC('A','T','M','L'), + /*! + This extended buffer defines additional encoding controls. See the mfxExtCodingOption2 structure for details. + The application can attach this buffer to the structure for encoding initialization. + */ + MFX_EXTBUFF_CODING_OPTION2 = MFX_MAKEFOURCC('C','D','O','2'), + /*! + This extended buffer defines control parameters for the VPP image stabilization filter algorithm. See the mfxExtVPPImageStab structure + for details. The application can attach this buffer to the mfxVideoParam structure for video processing initialization. + */ + MFX_EXTBUFF_VPP_IMAGE_STABILIZATION = MFX_MAKEFOURCC('I','S','T','B'), + /*! + This extended buffer is used to retrieve encoder capability. See the mfxExtEncoderCapability structure for details. + The application can attach this buffer to the mfxVideoParam structure before calling MFXVideoENCODE_Query function. + */ + MFX_EXTBUFF_ENCODER_CAPABILITY = MFX_MAKEFOURCC('E','N','C','P'), + /*! + This extended buffer is used to control encoder reset behavior and also to query possible encoder reset outcome. + See the mfxExtEncoderResetOption structure for details. The application can attach this buffer to the mfxVideoParam structure + before calling MFXVideoENCODE_Query or MFXVideoENCODE_Reset functions. + */ + MFX_EXTBUFF_ENCODER_RESET_OPTION = MFX_MAKEFOURCC('E','N','R','O'), + /*! + This extended buffer is used by the encoder to report additional information about encoded picture. + See the mfxExtAVCEncodedFrameInfo structure for details. The application can attach this buffer to the mfxBitstream structure + before calling MFXVideoENCODE_EncodeFrameAsync function. + */ + MFX_EXTBUFF_ENCODED_FRAME_INFO = MFX_MAKEFOURCC('E','N','F','I'), + /*! + This extended buffer is used to control composition of several input surfaces in the one output. In this mode, + the VPP skips any other filters. The VPP returns error if any mandatory filter is specified and filter skipped warning + for optional filter. The only supported filters are deinterlacing and interlaced scaling. + */ + MFX_EXTBUFF_VPP_COMPOSITE = MFX_MAKEFOURCC('V','C','M','P'), + /*! + This extended buffer is used to control transfer matrix and nominal range of YUV frames. + The application should provide it during initialization. + */ + MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO = MFX_MAKEFOURCC('V','V','S','I'), + /*! + This extended buffer is used by the application to specify different Region Of Interests during encoding. + The application should provide it at initialization or at runtime. + */ + MFX_EXTBUFF_ENCODER_ROI = MFX_MAKEFOURCC('E','R','O','I'), + /*! + This extended buffer is used by the application to specify different deinterlacing algorithms. + */ + MFX_EXTBUFF_VPP_DEINTERLACING = MFX_MAKEFOURCC('V','P','D','I'), + /*! + This extended buffer specifies reference lists for the encoder. + */ + MFX_EXTBUFF_AVC_REFLISTS = MFX_MAKEFOURCC('R','L','T','S'), + /*! + See the mfxExtDecVideoProcessing structure for details. + */ + MFX_EXTBUFF_DEC_VIDEO_PROCESSING = MFX_MAKEFOURCC('D','E','C','V'), + /*! + The extended buffer defines control parameters for the VPP field-processing algorithm. See the mfxExtVPPFieldProcessing + structure for details. The application can attach this buffer to the mfxVideoParam structure for video processing initialization + or to the mfxFrameData structure during runtime. + */ + MFX_EXTBUFF_VPP_FIELD_PROCESSING = MFX_MAKEFOURCC('F','P','R','O'), + /*! + This extended buffer defines additional encoding controls. See the mfxExtCodingOption3 structure for details. + The application can attach this buffer to the structure for encoding initialization. + */ + MFX_EXTBUFF_CODING_OPTION3 = MFX_MAKEFOURCC('C','D','O','3'), + /*! + This extended buffer defines chroma samples location information. See the mfxExtChromaLocInfo structure for details. + The application can attach this buffer to the mfxVideoParam structure for encoding initialization. + */ + MFX_EXTBUFF_CHROMA_LOC_INFO = MFX_MAKEFOURCC('C','L','I','N'), + /*! + This extended buffer defines per-macroblock QP. See the mfxExtMBQP structure for details. + The application can attach this buffer to the mfxEncodeCtrl structure for per-frame encoding configuration. + */ + MFX_EXTBUFF_MBQP = MFX_MAKEFOURCC('M','B','Q','P'), + /*! + This extended buffer defines per-macroblock force intra flag. See the mfxExtMBForceIntra structure for details. + The application can attach this buffer to the mfxEncodeCtrl structure for per-frame encoding configuration. + */ + MFX_EXTBUFF_MB_FORCE_INTRA = MFX_MAKEFOURCC('M','B','F','I'), + /*! + This extended buffer defines additional encoding controls for HEVC tiles. See the mfxExtHEVCTiles structure for details. + The application can attach this buffer to the mfxVideoParam structure for encoding initialization. + */ + MFX_EXTBUFF_HEVC_TILES = MFX_MAKEFOURCC('2','6','5','T'), + /*! + This extended buffer defines macroblock map for current frame which forces specified macroblocks to be non skip. See the + mfxExtMBDisableSkipMap structure for details. The application can attach this buffer to the mfxEncodeCtrl structure for + per-frame encoding configuration. + */ + MFX_EXTBUFF_MB_DISABLE_SKIP_MAP = MFX_MAKEFOURCC('M','D','S','M'), + /*! + See the mfxExtHEVCParam structure for details. + */ + MFX_EXTBUFF_HEVC_PARAM = MFX_MAKEFOURCC('2','6','5','P'), + /*! + This extended buffer is used by decoders to report additional information about decoded frame. See the + mfxExtDecodedFrameInfo structure for more details. + */ + MFX_EXTBUFF_DECODED_FRAME_INFO = MFX_MAKEFOURCC('D','E','F','I'), + /*! + See the mfxExtTimeCode structure for more details. + */ + MFX_EXTBUFF_TIME_CODE = MFX_MAKEFOURCC('T','M','C','D'), + /*! + This extended buffer specifies the region to encode. The application can attach this buffer to the + mfxVideoParam structure during HEVC encoder initialization. + */ + MFX_EXTBUFF_HEVC_REGION = MFX_MAKEFOURCC('2','6','5','R'), + /*! + See the mfxExtPredWeightTable structure for details. + */ + MFX_EXTBUFF_PRED_WEIGHT_TABLE = MFX_MAKEFOURCC('E','P','W','T'), + /*! + See the mfxExtDitrtyRect structure for details. + */ + MFX_EXTBUFF_DIRTY_RECTANGLES = MFX_MAKEFOURCC('D','R','O','I'), + /*! + See the mfxExtMoveRect structure for details. + */ + MFX_EXTBUFF_MOVING_RECTANGLES = MFX_MAKEFOURCC('M','R','O','I'), + /*! + See the mfxExtCodingOptionVPS structure for details. + */ + MFX_EXTBUFF_CODING_OPTION_VPS = MFX_MAKEFOURCC('C','O','V','P'), + /*! + See the mfxExtVPPRotation structure for details. + */ + MFX_EXTBUFF_VPP_ROTATION = MFX_MAKEFOURCC('R','O','T',' '), + /*! + See the mfxExtEncodedSlicesInfo structure for details. + */ + MFX_EXTBUFF_ENCODED_SLICES_INFO = MFX_MAKEFOURCC('E','N','S','I'), + /*! + See the mfxExtVPPScaling structure for details. + */ + MFX_EXTBUFF_VPP_SCALING = MFX_MAKEFOURCC('V','S','C','L'), + /*! + This extended buffer defines additional encoding controls for reference list. See the mfxExtAVCRefListCtrl structure for details. + The application can attach this buffer to the mfxVideoParam structure for encoding & decoding initialization, or + the mfxEncodeCtrl structure for per-frame encoding configuration. + */ + MFX_EXTBUFF_HEVC_REFLIST_CTRL = MFX_EXTBUFF_AVC_REFLIST_CTRL, + /*! + This extended buffer specifies reference lists for the encoder. + */ + MFX_EXTBUFF_HEVC_REFLISTS = MFX_EXTBUFF_AVC_REFLISTS, + /*! + This extended buffer configures the structure of temporal layers inside the encoded H.264 bitstream. See the mfxExtAvcTemporalLayers + structure for details. The application can attach this buffer to the mfxVideoParam structure for encoding initialization. + */ + MFX_EXTBUFF_HEVC_TEMPORAL_LAYERS = MFX_EXTBUFF_AVC_TEMPORAL_LAYERS, + /*! + See the mfxExtVPPMirroring structure for details. + */ + MFX_EXTBUFF_VPP_MIRRORING = MFX_MAKEFOURCC('M','I','R','R'), + /*! + See the mfxExtMVOverPicBoundaries structure for details. + */ + MFX_EXTBUFF_MV_OVER_PIC_BOUNDARIES = MFX_MAKEFOURCC('M','V','P','B'), + /*! + See the mfxExtVPPColorFill structure for details. + */ + MFX_EXTBUFF_VPP_COLORFILL = MFX_MAKEFOURCC('V','C','L','F'), + /*! + This extended buffer is used by decoders to report error information before frames get decoded. + See the mfxExtDecodeErrorReport structure for more details. + */ + MFX_EXTBUFF_DECODE_ERROR_REPORT = MFX_MAKEFOURCC('D', 'E', 'R', 'R'), + /*! + See the mfxExtColorConversion structure for details. + */ + MFX_EXTBUFF_VPP_COLOR_CONVERSION = MFX_MAKEFOURCC('V', 'C', 'S', 'C'), + /*! + This extended buffer configures HDR SEI message. See the mfxExtContentLightLevelInfo structure for details. + */ + MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO = MFX_MAKEFOURCC('L', 'L', 'I', 'S'), + /*! + This extended buffer configures HDR SEI message. See the mfxExtMasteringDisplayColourVolume structure for details. If colour volume changes + per frame, the application can attach this buffer to the mfxFrameData structure for video processing. + */ + MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME = MFX_MAKEFOURCC('D', 'C', 'V', 'S'), + /*! + This extended buffer configures HDR SEI message. See the mfxExtMasteringDisplayColourVolume structure for details. The application can + attach this buffer to the mfxVideoParam structure for the input of video processing if the mastering display colour volume changes per + sequence. In this case, this buffer should be together with MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO to indicate the light level and mastering + colour volume of the input of video processing. If colour Volume changes per frame instead of per sequence, the application can attach + MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME to mfxFrameData for frame based processing. + */ + MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_IN = MFX_MAKEFOURCC('D', 'C', 'V', 'I'), + /*! + This extended buffer configures HDR SEI message. See the mfxExtMasteringDisplayColourVolume structure for details. The application can + attach this buffer to the mfxVideoParam structure for the output of video processing if the mastering display colour volume changes per + sequence. If colour volume changes per frame instead of per sequence, the application can attach the buffer with MFX_EXTBUFF_MASTERING_ + DISPLAY_COLOUR_VOLUME to mfxFrameData for frame based processing. + */ + MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME_OUT = MFX_MAKEFOURCC('D', 'C', 'V', 'O'), + /*! + See the mfxExtEncodedUnitsInfo structure for details. + */ + MFX_EXTBUFF_ENCODED_UNITS_INFO = MFX_MAKEFOURCC('E', 'N', 'U', 'I'), + /*! + This video processing algorithm identifier is used to enable MCTF via mfxExtVPPDoUse and together with mfxExtVppMctf + */ + MFX_EXTBUFF_VPP_MCTF = MFX_MAKEFOURCC('M', 'C', 'T', 'F'), + /*! + Extends mfxVideoParam structure with VP9 segmentation parameters. See the mfxExtVP9Segmentation structure for details. + */ + MFX_EXTBUFF_VP9_SEGMENTATION = MFX_MAKEFOURCC('9', 'S', 'E', 'G'), + /*! + Extends mfxVideoParam structure with parameters for VP9 temporal scalability. See the mfxExtVP9TemporalLayers structure for details. + */ + MFX_EXTBUFF_VP9_TEMPORAL_LAYERS = MFX_MAKEFOURCC('9', 'T', 'M', 'L'), + /*! + Extends mfxVideoParam structure with VP9-specific parameters. See the mfxExtVP9Param structure for details. + */ + MFX_EXTBUFF_VP9_PARAM = MFX_MAKEFOURCC('9', 'P', 'A', 'R'), + /*! + See the mfxExtAVCRoundingOffset structure for details. + */ + MFX_EXTBUFF_AVC_ROUNDING_OFFSET = MFX_MAKEFOURCC('R','N','D','O'), + /*! + See the mfxExtPartialBitstreamParam structure for details. + */ + MFX_EXTBUFF_PARTIAL_BITSTREAM_PARAM = MFX_MAKEFOURCC('P','B','O','P'), + + /*! + See the mfxExtEncoderIPCMArea structure for details. + */ + MFX_EXTBUFF_ENCODER_IPCM_AREA = MFX_MAKEFOURCC('P', 'C', 'M', 'R'), + /*! + See the mfxExtInsertHeaders structure for details. + */ + MFX_EXTBUFF_INSERT_HEADERS = MFX_MAKEFOURCC('S', 'P', 'R', 'E'), + + /*! + See the mfxExtDeviceAffinityMask structure for details. + */ + MFX_EXTBUFF_DEVICE_AFFINITY_MASK = MFX_MAKEFOURCC('D', 'A', 'F', 'M'), + + /*! + See the mfxExtInCrops structure for details. + */ + MFX_EXTBUFF_CROPS = MFX_MAKEFOURCC('C', 'R', 'O', 'P'), + + /*! + See the mfxExtAV1BitstreamParam structure for more details. + */ + MFX_EXTBUFF_AV1_BITSTREAM_PARAM = MFX_MAKEFOURCC('A', '1', 'B', 'S'), + + /*! + See the mfxExtAV1ResolutionParam structure for more details. + */ + MFX_EXTBUFF_AV1_RESOLUTION_PARAM = MFX_MAKEFOURCC('A', '1', 'R', 'S'), + + /*! + See the mfxExtAV1TileParam structure for more details. + */ + MFX_EXTBUFF_AV1_TILE_PARAM = MFX_MAKEFOURCC('A', '1', 'T', 'L'), + + /*! + See the mfxExtAV1Segmentation structure for more details. + */ + MFX_EXTBUFF_AV1_SEGMENTATION = MFX_MAKEFOURCC('1', 'S', 'E', 'G'), + + /*! + See the mfxExtAV1FilmGrainParam structure for more details. + */ + MFX_EXTBUFF_AV1_FILM_GRAIN_PARAM = MFX_MAKEFOURCC('A','1','F','G'), + + /*! + See the mfxExtHyperModeParam structure for more details. + */ + MFX_EXTBUFF_HYPER_MODE_PARAM = MFX_MAKEFOURCC('H', 'Y', 'P', 'M'), + /*! + See the mfxExtTemporalLayers structure for more details. + */ + MFX_EXTBUFF_UNIVERSAL_TEMPORAL_LAYERS = MFX_MAKEFOURCC('U', 'T', 'M', 'P'), +#ifdef ONEVPL_EXPERIMENTAL + /*! + This extended buffer defines additional encoding controls for reference list. See the mfxExtRefListCtrl structure for details. + The application can attach this buffer to the mfxVideoParam structure for encoding & decoding initialization, or + the mfxEncodeCtrl structure for per-frame encoding configuration. + */ + MFX_EXTBUFF_UNIVERSAL_REFLIST_CTRL = MFX_EXTBUFF_AVC_REFLIST_CTRL, + /*! + See the mfxExtEncodeStats structure for details. + */ + MFX_EXTBUFF_ENCODESTATS = MFX_MAKEFOURCC('E','N','S','B'), +#endif + /*! + See the mfxExtVPP3DLut structure for more details. + */ + MFX_EXTBUFF_VPP_3DLUT = MFX_MAKEFOURCC('T','D','L','T'), + + /*! + See the mfxExtAllocationHints structure for more details. + */ + MFX_EXTBUFF_ALLOCATION_HINTS = MFX_MAKEFOURCC('A','L','C','H'), +}; + +/* VPP Conf: Do not use certain algorithms */ +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Tells the VPP not to use certain filters in pipeline. See "Configurable VPP filters" table for complete + list of configurable filters. The user can attach this structure to the mfxVideoParam structure when initializing video processing. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_DONOTUSE. */ + mfxU32 NumAlg; /*!< Number of filters (algorithms) not to use */ + mfxU32* AlgList; /*!< Pointer to a list of filters (algorithms) not to use */ +} mfxExtVPPDoNotUse; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + A hint structure that configures the VPP denoise filter algorithm. + @deprecated Deprecated in API version 2.5. Use mfxExtVPPDenoise2 instead. +*/ +MFX_DEPRECATED typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_DENOISE. */ + mfxU16 DenoiseFactor; /*!< Indicates the level of noise to remove. Value range of 0 to 100 (inclusive). */ +} mfxExtVPPDenoise; +MFX_PACK_END() + +/*! The mfxDenoiseMode enumerator specifies the mode of denoise. */ +typedef enum { + MFX_DENOISE_MODE_DEFAULT = 0, /*!< Default denoise mode. The library selects the most appropriate denoise mode. */ + MFX_DENOISE_MODE_VENDOR = 1000, /*!< The enumeration to separate common denoise mode above and vendor specific. */ + + MFX_DENOISE_MODE_INTEL_HVS_AUTO_BDRATE = MFX_DENOISE_MODE_VENDOR + 1, /*!< Indicates auto BD rate improvement in pre-processing before video encoding, + ignore Strength.*/ + MFX_DENOISE_MODE_INTEL_HVS_AUTO_SUBJECTIVE = MFX_DENOISE_MODE_VENDOR + 2, /*!< Indicates auto subjective quality improvement in pre-processing before video encoding, + ignore Strength.*/ + MFX_DENOISE_MODE_INTEL_HVS_AUTO_ADJUST = MFX_DENOISE_MODE_VENDOR + 3, /*!< Indicates auto adjust subjective quality in post-processing (after decoding) for video playback, + ignore Strength.*/ + MFX_DENOISE_MODE_INTEL_HVS_PRE_MANUAL = MFX_DENOISE_MODE_VENDOR + 4, /*!< Indicates manual mode for pre-processing before video encoding, + allow to adjust the denoise strength manually.*/ + MFX_DENOISE_MODE_INTEL_HVS_POST_MANUAL = MFX_DENOISE_MODE_VENDOR + 5, /*!< Indicates manual mode for post-processing for video playback, + allow to adjust the denoise strength manually.*/ +} mfxDenoiseMode; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + A hint structure that configures the VPP denoise filter algorithm. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_DENOISE2. */ + mfxDenoiseMode Mode; /*!< Indicates the mode of denoise. mfxDenoiseMode enumerator. */ + mfxU16 Strength; /*!< Denoise strength in manaul mode. Value of 0-100 (inclusive) indicates the strength of denoise. + The strength of denoise controls degree of possible changes of pixel values; the bigger the strength + the larger the change is. */ + mfxU16 reserved15; +} mfxExtVPPDenoise2; +MFX_PACK_END() + +/*! The mfx3DLutChannelMapping enumerator specifies the channel mapping of 3DLUT. */ +typedef enum { + MFX_3DLUT_CHANNEL_MAPPING_DEFAULT = 0, /*!< Default 3DLUT channel mapping. The library selects the most appropriate 3DLUT channel mapping. */ + MFX_3DLUT_CHANNEL_MAPPING_RGB_RGB = 1, /*!< 3DLUT RGB channels map to RGB channels. */ + MFX_3DLUT_CHANNEL_MAPPING_YUV_RGB = 2, /*!< 3DLUT YUV channels map to RGB channels. */ + MFX_3DLUT_CHANNEL_MAPPING_VUY_RGB = 3, /*!< 3DLUT VUY channels map to RGB channels. */ +} mfx3DLutChannelMapping; + +/*! The mfx3DLutMemoryLayout enumerator specifies the memory layout of 3DLUT. */ +typedef enum { + MFX_3DLUT_MEMORY_LAYOUT_DEFAULT = 0, /*!< Default 3DLUT memory layout. The library selects the most appropriate 3DLUT memory layout.*/ + + MFX_3DLUT_MEMORY_LAYOUT_VENDOR = 0x1000, /*!< The enumeration to separate default above and vendor specific.*/ + /*! + Intel specific memory layout. The enumerator indicates the attributes and memory layout of 3DLUT. + 3DLUT size is 17(the number of elements per dimension), 4 channels(3 valid channels, 1 channel is reserved), every channel must be 16-bit unsigned integer. + 3DLUT contains 17x17x32 entries with holes that are not filled. Take RGB as example, the nodes RxGx17 to RxGx31 are not filled, are "don't care" bits, and not accessed for the 17x17x17 nodes. + */ + MFX_3DLUT_MEMORY_LAYOUT_INTEL_17LUT = MFX_3DLUT_MEMORY_LAYOUT_VENDOR + 1, + /*! + Intel specific memory layout. The enumerator indicates the attributes and memory layout of 3DLUT. + 3DLUT size is 33(the number of elements per dimension), 4 channels(3 valid channels, 1 channel is reserved), every channel must be 16-bit unsigned integer. + 3DLUT contains 33x33x64 entries with holes that are not filled. Take RGB as example, the nodes RxGx33 to RxGx63 are not filled, are "don't care" bits, and not accessed for the 33x33x33 nodes. + */ + MFX_3DLUT_MEMORY_LAYOUT_INTEL_33LUT = MFX_3DLUT_MEMORY_LAYOUT_VENDOR + 2, + /*! + Intel specific memory layout. The enumerator indicates the attributes and memory layout of 3DLUT. + 3DLUT size is 65(the number of elements per dimension), 4 channels(3 valid channels, 1 channel is reserved), every channel must be 16-bit unsigned integer. + 3DLUT contains 65x65x128 entries with holes that are not filled. Take RGB as example, the nodes RxGx65 to RxGx127 are not filled, are "don't care" bits, and not accessed for the 65x65x65 nodes. + */ + MFX_3DLUT_MEMORY_LAYOUT_INTEL_65LUT = MFX_3DLUT_MEMORY_LAYOUT_VENDOR + 3, +} mfx3DLutMemoryLayout; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + A hint structure that configures the data channel. +*/ +typedef struct { + mfxDataType DataType; /*!< Data type, mfxDataType enumerator.*/ + mfxU32 Size; /*!< Size of Look up table, the number of elements per dimension.*/ + union + { + mfxU8* Data; /*!< The pointer to 3DLUT data, 8 bit unsigned integer.*/ + mfxU16* Data16; /*!< The pointer to 3DLUT data, 16 bit unsigned integer.*/ + }; + mfxU32 reserved4; /*!< Reserved for future extension.*/ +} mfxChannel; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + A hint structure that configures 3DLUT system buffer. +*/ +typedef struct { + mfxChannel Channel3; /*!< 3 Channels, can be RGB or YUV, mfxChannel structure.*/ + mfxU32 reserved8; /*!< Reserved for future extension.*/ +} mfx3DLutSystemBuffer; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + A hint structure that configures 3DLUT video buffer. +*/ +typedef struct { + mfxDataType DataType; /*!< Data type, mfxDataType enumerator.*/ + mfx3DLutMemoryLayout MemLayout; /*!< Indicates 3DLUT memory layout. mfx3DLutMemoryLayout enumerator.*/ + mfxMemId MemId; /*!< Memory ID for holding the lookup table data. One MemID is dedicated for one instance of VPP.*/ + mfxU32 reserved8; /*!< Reserved for future extension.*/ +} mfx3DLutVideoBuffer; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + A hint structure that configures 3DLUT filter. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_3DLUT..*/ + mfx3DLutChannelMapping ChannelMapping; /*!< Indicates 3DLUT channel mapping. mfx3DLutChannelMapping enumerator.*/ + mfxResourceType BufferType; /*!< Indicates 3DLUT buffer type. mfxResourceType enumerator, can be system memory, VA surface, DX11 texture/buffer etc.*/ + union + { + mfx3DLutSystemBuffer SystemBuffer; /*!< The 3DLUT system buffer. mfx3DLutSystemBuffer structure describes the details of the buffer.*/ + mfx3DLutVideoBuffer VideoBuffer; /*!< The 3DLUT video buffer. mfx3DLutVideoBuffer describes the details of 3DLUT video buffer.*/ + }; + mfxU32 reserved4; /*!< Reserved for future extension.*/ +} mfxExtVPP3DLut; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + A hint structure that configures the VPP detail/edge enhancement filter algorithm. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_DETAIL. */ + mfxU16 DetailFactor; /*!< Indicates the level of details to be enhanced. Value range of 0 to 100 (inclusive). */ +} mfxExtVPPDetail; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +/*! + A hint structure that configures the VPP ProcAmp filter algorithm. + The structure parameters will be clipped to their corresponding range and rounded by their corresponding increment. + @note There are no default values for fields in this structure, all settings must be explicitly specified every time this + buffer is submitted for processing. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_PROCAMP. */ + mfxF64 Brightness; /*!< The brightness parameter is in the range of -100.0F to 100.0F, in increments of 0.1F. + Setting this field to 0.0F will disable brightness adjustment. */ + mfxF64 Contrast; /*!< The contrast parameter in the range of 0.0F to 10.0F, in increments of 0.01F, is used for manual + contrast adjustment. Setting this field to 1.0F will disable contrast adjustment. If the parameter + is negative, contrast will be adjusted automatically. */ + mfxF64 Hue; /*!< The hue parameter is in the range of -180F to 180F, in increments of 0.1F. Setting this field to 0.0F + will disable hue adjustment. */ + mfxF64 Saturation; /*!< The saturation parameter is in the range of 0.0F to 10.0F, in increments of 0.01F. + Setting this field to 1.0F will disable saturation adjustment. */ +} mfxExtVPPProcAmp; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +/*! + Returns statistics collected during encoding. +*/ +typedef struct { + mfxU32 reserved16; + mfxU32 NumFrame; /*!< Number of encoded frames. */ + mfxU64 NumBit; /*!< Number of bits for all encoded frames. */ + mfxU32 NumCachedFrame; /*!< Number of internally cached frames. */ +} mfxEncodeStat; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Returns statistics collected during decoding. +*/ +typedef struct { + mfxU32 reserved16; + mfxU32 NumFrame; /*!< Number of total decoded frames. */ + mfxU32 NumSkippedFrame; /*!< Number of skipped frames. */ + mfxU32 NumError; /*!< Number of errors recovered. */ + mfxU32 NumCachedFrame; /*!< Number of internally cached frames. */ +} mfxDecodeStat; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Returns statistics collected during video processing. +*/ +typedef struct { + mfxU32 reserved16; + mfxU32 NumFrame; /*!< Total number of frames processed. */ + mfxU32 NumCachedFrame; /*!< Number of internally cached frames. */ +} mfxVPPStat; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Returns auxiliary data generated by the video processing pipeline. + The encoding process may use the auxiliary data by attaching this structure to the mfxEncodeCtrl structure. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_AUXDATA. */ + + union{ + struct{ + MFX_DEPRECATED mfxU32 SpatialComplexity; /* Deprecated */ + MFX_DEPRECATED mfxU32 TemporalComplexity; /* Deprecated */ + }; + struct{ + /*! + Detected picture structure - top field first, bottom field first, progressive or unknown if video processor cannot + detect picture structure. See the PicStruct enumerator for definition of these values. + + */ + mfxU16 PicStruct; + mfxU16 reserved3; + }; + }; + MFX_DEPRECATED mfxU16 SceneChangeRate; /* Deprecated */ + mfxU16 RepeatedFrame; /*!< The flag signalizes that the frame is identical to the previous one. */ +} mfxExtVppAuxData; +MFX_PACK_END() + +/*! The PayloadCtrlFlags enumerator itemizes additional payload properties. */ +enum { + MFX_PAYLOAD_CTRL_SUFFIX = 0x00000001 /*!< Insert this payload into HEVC Suffix SEI NAL-unit. */ +}; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Describes user data payload in MPEG-2 or SEI message payload in H.264. + + For encoding, these payloads can be + inserted into the bitstream. The payload buffer must contain a valid formatted payload. + + For H.264, this is the sei_message() as + specified in the section 7.3.2.3.1 'Supplemental enhancement information message syntax' of the ISO/IEC 14496-10 specification. + + For MPEG-2, + this is the section 6.2.2.2.2 'User data' of the ISO/IEC 13818-2 specification, excluding the user data start_code. + + For decoding, + these payloads can be retrieved as the decoder parses the bitstream and caches them in an internal buffer. + + @internal + +-----------+-------------------------------------------+ + | **Codec** | **Supported Types** | + +===========+===========================================+ + | MPEG2 | 0x01B2 //User Data | + +-----------+-------------------------------------------+ + | AVC | 02 //pan_scan_rect | + | | 03 //filler_payload | + | | 04 //user_data_registered_itu_t_t35 | + | | 05 //user_data_unregistered | + | | 06 //recovery_point | + | | 09 //scene_info | + | | 13 //full_frame_freeze | + | | 14 //full_frame_freeze_release | + | | 15 //full_frame_snapshot | + | | 16 //progressive_refinement_segment_start | + | | 17 //progressive_refinement_segment_end | + | | 19 //film_grain_characteristics | + | | 20 //deblocking_filter_display_preference | + | | 21 //stereo_video_info | + | | 45 //frame_packing_arrangement | + +-----------+-------------------------------------------+ + | HEVC | All | + +-----------+-------------------------------------------+ + @endinternal + +*/ +typedef struct { + mfxU32 CtrlFlags; /*!< Additional payload properties. See the PayloadCtrlFlags enumerator for details. */ + mfxU32 reserved3; + mfxU8 *Data; /*!< Pointer to the actual payload data buffer. */ + mfxU32 NumBit; /*!< Number of bits in the payload data */ + mfxU16 Type; /*!< MPEG-2 user data start code or H.264 SEI message type. */ + mfxU16 BufSize; /*!< Payload buffer size in bytes. */ +} mfxPayload; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Contains parameters for per-frame based encoding control. +*/ +typedef struct { + mfxExtBuffer Header; /*!< This extension buffer doesn't have assigned buffer ID. Ignored. */ + mfxU32 reserved4; + mfxU16 reserved1; + /*! + Type of NAL unit that contains encoding frame. All supported values are defined by MfxNalUnitType enumerator. Other values + defined in ITU-T H.265 specification are not supported. + + The encoder uses this field only if application sets mfxExtCodingOption3::EnableNalUnitType option to ON during encoder initialization. + + @note Only encoded order is supported. If application specifies this value in display order or uses value inappropriate for current frame or + invalid value, then the encoder silently ignores it. + */ + mfxU16 MfxNalUnitType; + mfxU16 SkipFrame; /*!< Indicates that current frame should be skipped or the number of missed frames before the current frame. See mfxExtCodingOption2::SkipFrame for details. */ + + mfxU16 QP; /*!< If nonzero, this value overwrites the global QP value for the current frame in the constant QP mode. */ + + /*! + Encoding frame type. See the FrameType enumerator for details. If the encoder works in the encoded order, the application must + specify the frame type. If the encoder works in the display order, only key frames are enforceable. + */ + mfxU16 FrameType; + mfxU16 NumExtParam; /*!< Number of extra control buffers. */ + mfxU16 NumPayload; /*!< Number of payload records to insert into the bitstream. */ + mfxU16 reserved2; + + /*! + Pointer to an array of pointers to external buffers that provide additional information or control to the encoder for this + frame or field pair. A typical use is to pass the VPP auxiliary data generated by the video processing pipeline to the encoder. + See the ExtendedBufferID for the list of extended buffers. + */ + mfxExtBuffer **ExtParam; + /*! + Pointer to an array of pointers to user data (MPEG-2) or SEI messages (H.264) for insertion into the bitstream. For field pictures, + odd payloads are associated with the first field and even payloads are associated with the second field. See the mfxPayload structure + for payload definitions. + */ + mfxPayload **Payload; +} mfxEncodeCtrl; +MFX_PACK_END() + +/*! The ExtMemBufferType enumerator specifies the buffer type. It is a bit-ORed value of the following. */ +enum { + MFX_MEMTYPE_PERSISTENT_MEMORY =0x0002 /*!< Memory page for persistent use. */ +}; + +/* Frame Memory Types */ +#define MFX_MEMTYPE_BASE(x) (0x90ff & (x)) + +/*! + The ExtMemFrameType enumerator specifies the memory type of frame. It is a bit-ORed value of the following. + \verbatim embed:rst + For information on working with video memory surfaces, see the :ref:`Working with Hardware Acceleration section<hw-acceleration>`. + \endverbatim +*/ +enum { + MFX_MEMTYPE_DXVA2_DECODER_TARGET =0x0010, /*!< Frames are in video memory and belong to video decoder render targets. */ + MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET =0x0020, /*!< Frames are in video memory and belong to video processor render targets. */ + MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET = MFX_MEMTYPE_DXVA2_DECODER_TARGET, /*!< Frames are in video memory and belong to video decoder render targets. */ + MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET = MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET,/*!< Frames are in video memory and belong to video processor render targets. */ + MFX_MEMTYPE_SYSTEM_MEMORY =0x0040, /*!< The frames are in system memory. */ + MFX_MEMTYPE_RESERVED1 =0x0080, /*!< */ + + MFX_MEMTYPE_FROM_ENCODE = 0x0100, /*!< Allocation request comes from an ENCODE function */ + MFX_MEMTYPE_FROM_DECODE = 0x0200, /*!< Allocation request comes from a DECODE function */ + MFX_MEMTYPE_FROM_VPPIN = 0x0400, /*!< Allocation request comes from a VPP function for input frame allocation */ + MFX_MEMTYPE_FROM_VPPOUT = 0x0800, /*!< Allocation request comes from a VPP function for output frame allocation */ + MFX_MEMTYPE_FROM_ENC = 0x2000, /*!< Allocation request comes from an ENC function */ + MFX_MEMTYPE_FROM_PAK = 0x4000, /* Reserved */ + + MFX_MEMTYPE_INTERNAL_FRAME = 0x0001, /*!< Allocation request for internal frames */ + MFX_MEMTYPE_EXTERNAL_FRAME = 0x0002, /*!< Allocation request for I/O frames */ + MFX_MEMTYPE_EXPORT_FRAME = 0x0008, /*!< Application requests frame handle export to some associated object. For Linux frame handle can be + considered to be exported to DRM Prime FD, DRM FLink or DRM FrameBuffer Handle. Specifics of export + types and export procedure depends on external frame allocator implementation */ + MFX_MEMTYPE_SHARED_RESOURCE = MFX_MEMTYPE_EXPORT_FRAME, /*!< For DX11 allocation use shared resource bind flag. */ + MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET = 0x1000 /*!< Frames are in video memory and belong to video encoder render targets. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Describes multiple frame allocations when initializing encoders, decoders, and video preprocessors. + A range specifies the number of video frames. Applications are free to allocate additional frames. In all cases, the minimum number of + frames must be at least NumFrameMin or the called API function will return an error. +*/ +typedef struct { + union { + mfxU32 AllocId; /*!< Unique (within the session) ID of component requested the allocation. */ + mfxU32 reserved1; + }; + mfxU32 reserved33; + mfxFrameInfo Info; /*!< Describes the properties of allocated frames. */ + mfxU16 Type; /*!< Allocated memory type. See the ExtMemFrameType enumerator for details. */ + mfxU16 NumFrameMin; /*!< Minimum number of allocated frames. */ + mfxU16 NumFrameSuggested; /*!< Suggested number of allocated frames. */ + mfxU16 reserved2; +} mfxFrameAllocRequest; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Describes the response to multiple frame allocations. The calling API function returns the number of + video frames actually allocated and pointers to their memory IDs. +*/ +typedef struct { + mfxU32 AllocId; /*!< Unique (within the session) ID of component requested the allocation. */ + mfxU32 reserved3; + mfxMemId *mids; /*!< Pointer to the array of the returned memory IDs. The application allocates or frees this array. */ + mfxU16 NumFrameActual; /*!< Number of frames actually allocated. */ + mfxU16 reserved2; +} mfxFrameAllocResponse; +MFX_PACK_END() + +/*! The FrameType enumerator itemizes frame types. Use bit-ORed values to specify all that apply. */ +enum { + MFX_FRAMETYPE_UNKNOWN =0x0000, /*!< Frame type is unspecified. */ + + MFX_FRAMETYPE_I =0x0001, /*!< This frame or the first field is encoded as an I-frame/field. */ + MFX_FRAMETYPE_P =0x0002, /*!< This frame or the first field is encoded as an P-frame/field. */ + MFX_FRAMETYPE_B =0x0004, /*!< This frame or the first field is encoded as an B-frame/field. */ + MFX_FRAMETYPE_S =0x0008, /*!< This frame or the first field is either an SI- or SP-frame/field. */ + + MFX_FRAMETYPE_REF =0x0040, /*!< This frame or the first field is encoded as a reference. */ + MFX_FRAMETYPE_IDR =0x0080, /*!< This frame or the first field is encoded as an IDR. */ + + MFX_FRAMETYPE_xI =0x0100, /*!< The second field is encoded as an I-field. */ + MFX_FRAMETYPE_xP =0x0200, /*!< The second field is encoded as an P-field. */ + MFX_FRAMETYPE_xB =0x0400, /*!< The second field is encoded as an S-field. */ + MFX_FRAMETYPE_xS =0x0800, /*!< The second field is an SI- or SP-field. */ + + MFX_FRAMETYPE_xREF =0x4000, /*!< The second field is encoded as a reference. */ + MFX_FRAMETYPE_xIDR =0x8000 /*!< The second field is encoded as an IDR. */ +}; + +/*! + The MfxNalUnitType enumerator specifies NAL unit types supported by the HEVC encoder. +*/ +enum { + MFX_HEVC_NALU_TYPE_UNKNOWN = 0, /*!< The encoder will decide what NAL unit type to use. */ + MFX_HEVC_NALU_TYPE_TRAIL_N = ( 0+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ + MFX_HEVC_NALU_TYPE_TRAIL_R = ( 1+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ + MFX_HEVC_NALU_TYPE_RADL_N = ( 6+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ + MFX_HEVC_NALU_TYPE_RADL_R = ( 7+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ + MFX_HEVC_NALU_TYPE_RASL_N = ( 8+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ + MFX_HEVC_NALU_TYPE_RASL_R = ( 9+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ + MFX_HEVC_NALU_TYPE_IDR_W_RADL = (19+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ + MFX_HEVC_NALU_TYPE_IDR_N_LP = (20+1), /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ + MFX_HEVC_NALU_TYPE_CRA_NUT = (21+1) /*!< See Table 7-1 of the ITU-T H.265 specification for the definition of these type. */ +}; + +/*! The mfxSkipMode enumerator describes the decoder skip-mode options. */ +typedef enum { + MFX_SKIPMODE_NOSKIP=0, /*! Do not skip any frames. */ + MFX_SKIPMODE_MORE=1, /*! Skip more frames. */ + MFX_SKIPMODE_LESS=2 /*! Skip less frames. */ +} mfxSkipMode; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Attach this structure as part of the extended buffers to configure the encoder during MFXVideoENCODE_Init. The sequence or picture + parameters specified by this structure overwrite any parameters specified by the structure or any other attached extended buffers attached. + + For H.264, SPSBuffer and PPSBuffer must point to valid bitstreams that contain the sequence parameter set and picture parameter set, + respectively. + + For MPEG-2, SPSBuffer must point to valid bitstreams that contain the sequence header followed by any sequence header extension. The PPSBuffer pointer is ignored. + + The encoder imports parameters from these buffers. If the encoder does not support the specified parameters, + the encoder does not initialize and returns the status code MFX_ERR_INCOMPATIBLE_VIDEO_PARAM. + + Check with the MFXVideoENCODE_Query function for the support of this multiple segment encoding feature. If this feature is not supported, + the query returns MFX_ERR_UNSUPPORTED. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_CODING_OPTION_SPSPPS. */ + mfxU8 *SPSBuffer; /*!< Pointer to a valid bitstream that contains the SPS (sequence parameter set for H.264 or sequence header + followed by any sequence header extension for MPEG-2) buffer. Can be NULL to skip specifying the SPS. */ + mfxU8 *PPSBuffer; /*!< Pointer to a valid bitstream that contains the PPS (picture parameter set for H.264 or picture header + followed by any picture header extension for MPEG-2) buffer. Can be NULL to skip specifying the PPS. */ + mfxU16 SPSBufSize; /*!< Size of the SPS in bytes. */ + mfxU16 PPSBufSize; /*!< Size of the PPS in bytes. */ + mfxU16 SPSId; /*!< SPS identifier. The value is reserved and must be zero. */ + mfxU16 PPSId; /*!< PPS identifier. The value is reserved and must be zero. */ +} mfxExtCodingOptionSPSPPS; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +/*! + Attach this structure as part of the extended buffers to configure the encoder during MFXVideoENCODE_Init. The sequence or picture + parameters specified by this structure overwrite any parameters specified by the structure or any other attached extended buffers attached. + + If the encoder does not support the specified parameters, the encoder does not initialize and returns the status code + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM. + + Check with the MFXVideoENCODE_Query function for the support of this multiple segment encoding feature. If this feature is not supported, + the query returns MFX_ERR_UNSUPPORTED. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_CODING_OPTION_VPS. */ + + union { + mfxU8 *VPSBuffer; /*!< Pointer to a valid bitstream that contains the VPS (video parameter set for HEVC) buffer. */ + mfxU64 reserved1; + }; + mfxU16 VPSBufSize; /*!< Size of the VPS in bytes. */ + mfxU16 VPSId; /*!< VPS identifier; the value is reserved and must be zero. */ + + mfxU16 reserved6; +} mfxExtCodingOptionVPS; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Defines the video signal information. + + For H.264, see Annex E of the ISO/IEC 14496-10 specification for the definition of these parameters. + + For MPEG-2, see section 6.3.6 of the ITU* H.262 specification for the definition of these parameters. The field VideoFullRange is ignored. + + For VC-1, see section 6.1.14.5 of the SMPTE* 421M specification. The fields VideoFormat and VideoFullRange are ignored. + + @note If ColourDescriptionPresent is zero, the color description information (including ColourPrimaries, TransferCharacteristics, + and MatrixCoefficients) does not present in the bitstream. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VIDEO_SIGNAL_INFO. */ + mfxU16 VideoFormat; + mfxU16 VideoFullRange; + mfxU16 ColourDescriptionPresent; + mfxU16 ColourPrimaries; + mfxU16 TransferCharacteristics; + mfxU16 MatrixCoefficients; +} mfxExtVideoSignalInfo; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Tells the VPP to include certain filters in the pipeline. + + Each filter may be included in the pipeline in one of two different ways: + + @li Adding a filter ID to this structure. In this method, + the default filter parameters are used. + + @li Attaching a filter configuration structure directly to the mfxVideoParam structure. + In this method, adding filter ID to the mfxExtVPPDoUse structure is optional. + + See Table "Configurable VPP filters" for complete list of + configurable filters, their IDs, and configuration structures. + + The user can attach this structure to the mfxVideoParam structure when initializing video processing. + + @note MFX_EXTBUFF_VPP_COMPOSITE cannot be enabled using mfxExtVPPDoUse because default parameters are undefined for this filter. + The application must attach the appropriate filter configuration structure directly to the mfxVideoParam structure to enable it. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_DOUSE. */ + mfxU32 NumAlg; /*!< Number of filters (algorithms) to use */ + mfxU32 *AlgList; /*!< Pointer to a list of filters (algorithms) to use */ +} mfxExtVPPDoUse; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Configures reference frame options for the H.264 encoder. + \verbatim embed:rst + See the :ref:`Reference List Selection <sec_reference_list_selection>` and :ref:`Long Term Reference Frame <sec_long_term_reference_frame>` sections for more details. + \endverbatim + + + @note Not all implementations of the encoder support LongTermIdx and ApplyLongTermIdx fields in this structure. The application must use + query mode 1 to determine if such functionality is supported. To do this, the application must attach this extended buffer to the + mfxVideoParam structure and call the MFXVideoENCODE_Query function. If the function returns MFX_ERR_NONE and these fields were set to one, + then the functionality is supported. If the function fails or sets fields to zero, then the functionality is not supported. + +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AVC_REFLIST_CTRL. */ + mfxU16 NumRefIdxL0Active; /*!< Specify the number of reference frames in the active reference list L0. This number should be less or equal to the NumRefFrame parameter from encoding initialization. */ + mfxU16 NumRefIdxL1Active; /*!< Specify the number of reference frames in the active reference list L1. This number should be less or equal to the NumRefFrame parameter from encoding initialization. */ + + struct { + /*! @{ + @name Reference Lists + The following structure members are used by the reference lists contained in the parent structure. */ + mfxU32 FrameOrder; /*!< Together FrameOrder and PicStruct fields are used to identify reference picture. Use FrameOrder = MFX_FRAMEORDER_UNKNOWN to mark unused entry. */ + mfxU16 PicStruct; /*!< Together FrameOrder and PicStruct fields are used to identify reference picture. Use FrameOrder = MFX_FRAMEORDER_UNKNOWN to mark unused entry. */ + mfxU16 ViewId; /*!< Reserved and must be zero. */ + mfxU16 LongTermIdx; /*!< Index that should be used by the encoder to mark long-term reference frame. */ + mfxU16 reserved3; /*!< Reserved */ + /*! @} */ + } PreferredRefList32, /*!< Reference list that specifies the list of frames that should be used to predict the current frame. */ + RejectedRefList16, /*!< Reference list that specifies the list of frames that should not be used for prediction. */ + LongTermRefList16; /*!< Reference list that specifies the list of frames that should be marked as long-term reference frame. */ + + mfxU16 ApplyLongTermIdx;/*!< If it is equal to zero, the encoder assigns long-term index according to internal algorithm. + If it is equal to one, the encoder uses LongTermIdx value as long-term index. */ + mfxU16 reserved15; +} mfxExtAVCRefListCtrl; +MFX_PACK_END() + +/*! The FrcAlgm enumerator itemizes frame rate conversion algorithms. See description of mfxExtVPPFrameRateConversion structure for more details. */ +enum { + MFX_FRCALGM_PRESERVE_TIMESTAMP = 0x0001, /*!< Frame dropping/repetition based frame rate conversion algorithm with preserved original + time stamps. Any inserted frames will carry MFX_TIMESTAMP_UNKNOWN. */ + MFX_FRCALGM_DISTRIBUTED_TIMESTAMP = 0x0002, /*!< Frame dropping/repetition based frame rate conversion algorithm with distributed time stamps. + The algorithm distributes output time stamps evenly according to the output frame rate. */ + MFX_FRCALGM_FRAME_INTERPOLATION = 0x0004 /*!< Frame rate conversion algorithm based on frame interpolation. This flag may be combined with + MFX_FRCALGM_PRESERVE_TIMESTAMP or MFX_FRCALGM_DISTRIBUTED_TIMESTAMP flags. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Configures the VPP frame rate conversion filter. The user can attach this structure to the + mfxVideoParam structure when initializing, resetting, or querying capability of video processing. + + On some platforms the advanced frame rate conversion algorithm (the algorithm based on frame interpolation) is not supported. To query its support, + the application should add the MFX_FRCALGM_FRAME_INTERPOLATION flag to the Algorithm value in the mfxExtVPPFrameRateConversion structure, attach it to the + structure, and call the MFXVideoVPP_Query function. If the filter is supported, the function returns a MFX_ERR_NONE status and copies the content of the + input structure to the output structure. If an advanced filter is not supported, then a simple filter will be used and the function returns + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM, copies content of the input structure to the output structure, and corrects the Algorithm value. + + If advanced FRC algorithm is not supported, both MFXVideoVPP_Init and MFXVideoVPP_Reset functions return the MFX_WRN_INCOMPATIBLE_VIDEO_PARAM status. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION. */ + mfxU16 Algorithm; /*!< See the FrcAlgm enumerator for a list of frame rate conversion algorithms. */ + mfxU16 reserved; + mfxU32 reserved215; +} mfxExtVPPFrameRateConversion; +MFX_PACK_END() + +/*! The ImageStabMode enumerator itemizes image stabilization modes. See description of mfxExtVPPImageStab structure for more details. */ +enum { + MFX_IMAGESTAB_MODE_UPSCALE = 0x0001, /*!< Upscale mode. */ + MFX_IMAGESTAB_MODE_BOXING = 0x0002 /*!< Boxing mode. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + A hint structure that configures the VPP image stabilization filter. + + On some platforms this filter is not supported. To query its support, the application should use the same approach that it uses + to configure VPP filters: adding the filter ID to the mfxExtVPPDoUse structure or by attaching the mfxExtVPPImageStab structure + directly to the mfxVideoParam structure and calling the MFXVideoVPP_Query function. + + If this filter is supported, the function returns a MFX_ERR_NONE + status and copies the content of the input structure to the output structure. If the filter is not supported, the function returns MFX_WRN_FILTER_SKIPPED, removes the + filter from the mfxExtVPPDoUse structure, and zeroes the mfxExtVPPImageStab structure. + + If the image stabilization filter is not supported, both MFXVideoVPP_Init and MFXVideoVPP_Reset functions return a MFX_WRN_FILTER_SKIPPED status. + + The application can retrieve the list of active filters by attaching the mfxExtVPPDoUse structure to the mfxVideoParam structure and calling the + MFXVideoVPP_GetVideoParam function. The application must allocate enough memory for the filter list. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_IMAGE_STABILIZATION. */ + mfxU16 Mode; /*!< Image stabilization mode. See ImageStabMode enumerator for values. */ + mfxU16 reserved11; +} mfxExtVPPImageStab; +MFX_PACK_END() + + +/*! The InsertHDRPayload enumerator itemizes HDR payloads insertion rules. */ +enum { + MFX_PAYLOAD_OFF = 0, /*!< Do not insert payload. */ + MFX_PAYLOAD_IDR = 1 /*!< Insert payload on IDR frames. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Handle the HDR SEI message. + + If the application attaches this structure to the mfxEncodeCtrl structure + at runtime, the encoder inserts the HDR SEI message for the current frame and ignores InsertPayloadToggle. + + If the application attaches this + structure to the mfxVideoParam structure during initialization or reset, the encoder inserts the HDR SEI message based on InsertPayloadToggle. + + If the application attaches this structure for video processing, InsertPayloadToggle will be ignored. + + If the application attaches this structure to the mfxFrameSurface1 structure at runtime + which will seed to the MFXVideoDECODE_DecodeFrameAsync() as surface_work parameter, + the decoder will parse the HDR SEI message if the bitstream include HDR SEI message per frame. + The parsed HDR SEI will be attached to the ExtendBuffer of surface_out parameter of MFXVideoDECODE_DecodeFrameAsync(). + This function is support for HEVC only now. + + Field semantics are defined in ITU-T* H.265 Annex D. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME. */ + mfxU16 reserved15; + + mfxU16 InsertPayloadToggle; /*!< InsertHDRPayload enumerator value. */ + mfxU16 DisplayPrimariesX3; /*!< Color primaries for a video source in increments of 0.00002. Consist of RGB x coordinates and + define how to convert colors from RGB color space to CIE XYZ color space. Fields range is + 0 to 50000. */ + mfxU16 DisplayPrimariesY3; /*!< Color primaries for a video source in increments of 0.00002. Consists of RGB y coordinates and + defines how to convert colors from RGB color space to CIE XYZ color space. Field range is + 0 to 50000. */ + mfxU16 WhitePointX; /*!< White point X coordinate. */ + mfxU16 WhitePointY; /*!< White point Y coordinate. */ + mfxU32 MaxDisplayMasteringLuminance; /*!< Specify maximum luminance of the display on which the content was authored in units of 0.00001 + candelas per square meter. Field range is 1 to 65535. */ + mfxU32 MinDisplayMasteringLuminance; /*!< Specify minimum luminance of the display on which the content was authored in units of 0.00001 + candelas per square meter. Field range is 1 to 65535. */ +} mfxExtMasteringDisplayColourVolume; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Handle the HDR SEI message. + + If the application attaches this structure to the mfxEncodeCtrl + structure at runtime, the encoder inserts the HDR SEI message for the current frame and ignores InsertPayloadToggle. + + If the application + attaches this structure to the mfxVideoParam structure during initialization or reset, the encoder inserts the HDR SEI message based on + InsertPayloadToggle. + + If the application attaches this structure for video processing, InsertPayloadToggle will be ignored. + + If the application attaches this structure to the mfxFrameSurface1 structure at runtime + which will seed to the MFXVideoDECODE_DecodeFrameAsync() as surface_work parameter, + the decoder will parse the HDR SEI message if the bitstream include HDR SEI message per frame. + The parsed HDR SEI will be attached to the ExtendBuffer of surface_out parameter of MFXVideoDECODE_DecodeFrameAsync(). + This function is support for HEVC only now. + + Field semantics are defined in ITU-T* H.265 Annex D. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to EXTBUFF_CONTENT_LIGHT_LEVEL_INFO. */ + mfxU16 reserved9; + + mfxU16 InsertPayloadToggle; /*!< InsertHDRPayload enumerator value. */ + mfxU16 MaxContentLightLevel; /*!< Maximum luminance level of the content. Field range is 1 to 65535. */ + mfxU16 MaxPicAverageLightLevel; /*!< Maximum average per-frame luminance level of the content. Field range is 1 to 65535. */ +} mfxExtContentLightLevelInfo; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Configures the H.264 picture timing SEI message. The encoder ignores it if HRD information in + the stream is absent and the PicTimingSEI option in the mfxExtCodingOption structure is turned off. See mfxExtCodingOption for details. + + If the application attaches this structure to the mfxVideoParam structure during initialization, the encoder inserts the picture timing + SEI message based on provided template in every access unit of coded bitstream. + + If application attaches this structure to the mfxEncodeCtrl structure at runtime, the encoder inserts the picture timing SEI message + based on provided template in access unit that represents current frame. + + These parameters define the picture timing information. An invalid value of 0xFFFF indicates that application does not set the value and + encoder must calculate it. + + See Annex D of the ISO*\/IEC* 14496-10 specification for the definition of these parameters. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_PICTURE_TIMING_SEI. */ + mfxU32 reserved14; + + struct { + mfxU16 ClockTimestampFlag; + mfxU16 CtType; + mfxU16 NuitFieldBasedFlag; + mfxU16 CountingType; + mfxU16 FullTimestampFlag; + mfxU16 DiscontinuityFlag; + mfxU16 CntDroppedFlag; + mfxU16 NFrames; + mfxU16 SecondsFlag; + mfxU16 MinutesFlag; + mfxU16 HoursFlag; + mfxU16 SecondsValue; + mfxU16 MinutesValue; + mfxU16 HoursValue; + mfxU32 TimeOffset; + } TimeStamp3; +} mfxExtPictureTimingSEI; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Configures the H.264 temporal layers hierarchy. + + If the application attaches it to the mfxVideoParam + structure during initialization, the encoder generates the temporal layers and inserts the prefix NAL unit before each slice to + indicate the temporal and priority IDs of the layer. + + This structure can be used with the display-order encoding mode only. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AVC_TEMPORAL_LAYERS. */ + mfxU32 reserved14; + mfxU16 reserved2; + mfxU16 BaseLayerPID; /*!< The priority ID of the base layer. The encoder increases the ID for each temporal layer and writes to the prefix NAL unit. */ + + struct { + mfxU16 Scale; /*!< The ratio between the frame rates of the current temporal layer and the base layer. */ + mfxU16 reserved3; + }Layer8; +} mfxExtAvcTemporalLayers; /*!< The array of temporal layers; Use Scale=0 to specify absent layers. */ +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used to retrieve encoder capability. See the description of mode 4 of the MFXVideoENCODE_Query function + for details on how to use this structure. + + @note Not all implementations of the encoder support this extended buffer. The application must use query mode 1 to determine + if the functionality is supported. To do this, the application must attach this extended buffer to the mfxVideoParam structure and + call the MFXVideoENCODE_Query function. If the function returns MFX_ERR_NONE then the functionality is supported. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODER_CAPABILITY. */ + + mfxU32 MBPerSec; /*!< Specify the maximum processing rate in macro blocks per second. */ + mfxU16 reserved58; +} mfxExtEncoderCapability; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used to control the encoder behavior during reset. By using this structure, the application + instructs the encoder to start a new coded sequence after reset or to continue encoding of the current sequence. + + This structure is also used in mode 3 of the MFXVideoENCODE_Query function to check for reset outcome before actual reset. The application + should set StartNewSequence to the required behavior and call the query function. If the query fails (see status codes below), then reset is not + possible in current encoder state. If the application sets StartNewSequence to MFX_CODINGOPTION_UNKNOWN, then the query function replaces the coding option with the + actual reset type: MFX_CODINGOPTION_ON if the encoder will begin a new sequence after reset or MFX_CODINGOPTION_OFF if the encoder will continue the current sequence. + + Using this structure may cause one of the following status codes from the MFXVideoENCODE_Reset and MFXVideoENCODE_Queryfunctions: + + @li MFX_ERR_INVALID_VIDEO_PARAM If a reset is not possible. For example, the application sets StartNewSequence to off and requests resolution change. + + @li MFX_ERR_INCOMPATIBLE_VIDEO_PARAM If the application requests change that leads to memory allocation. For example, the application sets StartNewSequence to on and + requests resolution change to greater than the initialization value. + + @li MFX_ERR_NONE If reset is possible. + + The following limited list of parameters can be changed without starting a new coded sequence: + + @li The bitrate parameters, TargetKbps and MaxKbps, in the mfxInfoMFX structure. + + @li The number of slices, NumSlice, in the mfxInfoMFX structure. Number of slices should be equal to or less than the number of slices during initialization. + + @li The number of temporal layers in the mfxExtAvcTemporalLayers structure. Reset should be called immediately before encoding of frame from base layer and + number of reference frames should be large enough for the new temporal layers structure. + + @li The quantization parameters, QPI, QPP and QPB, in the mfxInfoMFX structure. + + The application should retrieve all cached frames before calling reset. When the Query API function + checks for reset outcome, it expects that this requirement be satisfied. If it is not true and there are some cached frames inside the + encoder, then the query result may differ from the reset result, because the encoder may insert an IDR frame to produce valid coded sequence. + \verbatim embed:rst + See the :ref:`Configuration Change <config-change>` section for more information. + \endverbatim + + @note Not all implementations of the encoder support this extended buffer. The application must use query mode 1 to determine if the + functionality is supported. To do this, the application must attach this extended buffer to the mfxVideoParam structure and call the + MFXVideoENCODE_Query function. If the function returns MFX_ERR_NONE, then the functionality is supported. + + \verbatim embed:rst + See the :ref:`Streaming and Video Conferencing Features <stream_vid_conf_features>` section for more information. + \endverbatim + +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODER_RESET_OPTION. */ + + /*! + Instructs encoder to start new sequence after reset. Use one of the CodingOptionValue options: + + @li MFX_CODINGOPTION_ON The encoder completely reset internal state and begins new coded sequence after reset, including + insertion of IDR frame, sequence, and picture headers. + + @li MFX_CODINGOPTION_OFF The encoder continues encoding of current coded sequence after reset, without insertion of IDR frame. + + @li MFX_CODINGOPTION_UNKNOWN Depending on the current encoder state and changes in configuration parameters, the encoder may or may not + start new coded sequence. This value is also used to query reset outcome. + */ + mfxU16 StartNewSequence; + mfxU16 reserved11; +} mfxExtEncoderResetOption; +MFX_PACK_END() + +/*! The LongTermIdx specifies long term index of picture control. */ +enum { + MFX_LONGTERM_IDX_NO_IDX = 0xFFFF /*!< Long term index of picture is undefined. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used by the encoder to report additional information about the encoded picture. The application can attach + this buffer to the mfxBitstream structure before calling MFXVideoENCODE_EncodeFrameAsync function. For interlaced content the encoder + requires two such structures. They correspond to fields in encoded order. + + @note Not all implementations of the encoder support this extended buffer. The application must use query mode 1 to determine if + the functionality is supported. To do this, the application must attach this extended buffer to the mfxVideoParam structure and + call the MFXVideoENCODE_Query function. If the function returns MFX_ERR_NONE then the functionality is supported. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODED_FRAME_INFO. */ + + mfxU32 FrameOrder; /*!< Frame order of encoded picture. */ + mfxU16 PicStruct; /*!< Picture structure of encoded picture. */ + mfxU16 LongTermIdx; /*!< Long term index of encoded picture if applicable. */ + mfxU32 MAD; /*!< Mean Absolute Difference between original pixels of the frame and motion compensated (for inter macroblocks) or + spatially predicted (for intra macroblocks) pixels. Only luma component, Y plane, is used in calculation. */ + mfxU16 BRCPanicMode; /*!< Bitrate control was not able to allocate enough bits for this frame. Frame quality may be unacceptably low. */ + mfxU16 QP; /*!< Luma QP. */ + mfxU32 SecondFieldOffset; /*!< Offset to second field. Second field starts at mfxBitstream::Data + mfxBitstream::DataOffset + mfxExtAVCEncodedFrameInfo::SecondFieldOffset. */ + mfxU16 reserved2; + + struct { + /*! @{ + @name Reference Lists + The following structure members are used by the reference lists contained in the parent structure. */ + mfxU32 FrameOrder; /*!< Frame order of reference picture. */ + mfxU16 PicStruct; /*!< Picture structure of reference picture. */ + mfxU16 LongTermIdx; /*!< Long term index of reference picture if applicable. */ + mfxU16 reserved4; + /*! @} */ + } UsedRefListL032, /*!< Reference list that has been used to encode picture. */ + UsedRefListL132; /*!< Reference list that has been used to encode picture. */ +} mfxExtAVCEncodedFrameInfo; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used to specify input stream details for composition of several input surfaces in the one output. +*/ +typedef struct mfxVPPCompInputStream { + mfxU32 DstX; /*!< X coordinate of location of input stream in output surface. */ + mfxU32 DstY; /*!< Y coordinate of location of input stream in output surface. */ + mfxU32 DstW; /*!< Width of of location of input stream in output surface.*/ + mfxU32 DstH; /*!< Height of of location of input stream in output surface.*/ + + mfxU16 LumaKeyEnable; /*!< Non-zero value enables luma keying for the input stream. Luma keying is used to mark some of the areas + of the frame with specified luma values as transparent. It may, for example, be used for closed captioning. */ + mfxU16 LumaKeyMin; /*!< Minimum value of luma key, inclusive. Pixels whose luma values fit in this range are rendered transparent. */ + mfxU16 LumaKeyMax; /*!< Maximum value of luma key, inclusive. Pixels whose luma values fit in this range are rendered transparent. */ + + mfxU16 GlobalAlphaEnable; /*!< Non-zero value enables global alpha blending for this input stream. */ + mfxU16 GlobalAlpha; /*!< Alpha value for this stream. Should be in the range of 0 to 255, where 0 is transparent and 255 is opaque. */ + mfxU16 PixelAlphaEnable; /*!< Non-zero value enables per pixel alpha blending for this input stream. The stream should have RGB color format. */ + + mfxU16 TileId; /*!< Specify the tile this video stream is assigned to. Should be in the range of 0 to NumTiles. Valid only if NumTiles > 0. */ + + mfxU16 reserved217; +} mfxVPPCompInputStream; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Used to control composition of several input surfaces in one output. In this mode, the VPP skips + any other filters. The VPP returns an error if any mandatory filter is specified and returns the filter skipped warning if an optional filter is specified. The only + supported filters are deinterlacing and interlaced scaling. The only supported combinations of input and output color formats are: + + - RGB to RGB, + + - NV12 to NV12, + + - RGB and NV12 to NV12, for per the pixel alpha blending use case. + + The VPP returns MFX_ERR_MORE_DATA for additional input until an output is ready. When the output is ready, the VPP returns MFX_ERR_NONE. + The application must process the output frame after synchronization. + + The composition process is controlled by: + + - mfxFrameInfo::CropXYWH in the input surface defines the location of the picture in the input frame. + + - InputStreami.DstXYWH defines the location of the cropped input picture in the output frame. + + - mfxFrameInfo::CropXYWH in the output surface defines the actual part of the output frame. All pixels in the output frame outside this region will be filled by the specified color. + + If the application uses the composition process on video streams with different frame sizes, the application should provide maximum frame size in the + mfxVideoParam structure during the initialization, reset, or query operations. + + If the application uses the composition process, the MFXVideoVPP_QueryIOSurf function returns the cumulative number of input surfaces, that is, the number + required to process all input video streams. The function sets the frame size in the mfxFrameAllocRequest equal to the size provided by the + application in the mfxVideoParam structure. + + The composition process supports all types of surfaces. + + All input surfaces should have the same type and color format, except for the per pixel alpha blending case, where it is allowable to mix NV12 and RGB + surfaces. + + There are three different blending use cases: + + - <b>Luma keying.</b> All input surfaces should have the NV12 color format specified during VPP initialization. Part of each surface, including the + first one, may be rendered transparent by using LumaKeyEnable, LumaKeyMin, and LumaKeyMax values. + + - <b>Global alpha blending.</b> All input surfaces should have the same color format, NV12 or RGB, specified during VPP initialization. Each input surface, including the first one, can be blended with underlying surfaces by using GlobalAlphaEnable and + GlobalAlpha values. + + - <b>Per-pixel alpha blending.</b> It is allowed to mix NV12 and RGB input surfaces. Each RGB input surface, including the first one, + can be blended with underlying surfaces by using PixelAlphaEnable value. + + It is not allowed to mix different blending use cases in the same function call. + + In the special case where the destination region of the output surface defined by output crops is fully covered with destination sub-regions of the + surfaces, the fast compositing mode can be enabled. The main use case for this mode is a video-wall scenario with a fixed destination surface + partition into sub-regions of potentially different size. + + In order to trigger this mode, the application must cluster input surfaces into tiles, defining at least one tile by setting the NumTiles + field to be greater than 0, and assigning surfaces to the corresponding tiles by setting the TileId field to the value within the 0 to NumTiles range per + input surface. Tiles should also satisfy the following additional constraints: + + - Each tile should not have more than 8 surfaces assigned to it. + + - Tile bounding boxes, as defined by the enclosing rectangles of a union of a surfaces assigned to this tile, should not intersect. + + Background color may be changed dynamically through Reset. There is no default value. YUV black is (0;128;128) or (16;128;128) depending + on the sample range. The library uses a YUV or RGB triple depending on output color format. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_COMPOSITE. */ + + /* background color*/ + union { + mfxU16 Y; /*!< Y value of the background color. */ + mfxU16 R; /*!< R value of the background color. */ + }; + union { + mfxU16 U; /*!< U value of the background color. */ + mfxU16 G; /*!< G value of the background color. */ + }; + union { + mfxU16 V; /*!< V value of the background color. */ + mfxU16 B; /*!< B value of the background color. */ + }; + mfxU16 NumTiles; /*!< Number of input surface clusters grouped together to enable fast compositing. May be changed dynamically + at runtime through Reset. */ + mfxU16 reserved123; + + mfxU16 NumInputStream; /*!< Number of input surfaces to compose one output. May be changed dynamically at runtime through Reset. Number of surfaces + can be decreased or increased, but should not exceed the number specified during initialization. Query mode 2 should be used + to find the maximum supported number. */ + mfxVPPCompInputStream *InputStream; /*!< An array of mfxVPPCompInputStream structures that describe composition of input video streams. It should consist of exactly NumInputStream elements. */ +} mfxExtVPPComposite; +MFX_PACK_END() + +/*! The TransferMatrix enumerator itemizes color transfer matrices. */ +enum { + MFX_TRANSFERMATRIX_UNKNOWN = 0, /*!< Transfer matrix is not specified */ + MFX_TRANSFERMATRIX_BT709 = 1, /*!< Transfer matrix from ITU-R BT.709 standard. */ + MFX_TRANSFERMATRIX_BT601 = 2 /*!< Transfer matrix from ITU-R BT.601 standard. */ +}; + +/* The NominalRange enumerator itemizes pixel's value nominal range. */ +enum { + MFX_NOMINALRANGE_UNKNOWN = 0, /*!< Range is not defined. */ + MFX_NOMINALRANGE_0_255 = 1, /*!< Range is from 0 to 255. */ + MFX_NOMINALRANGE_16_235 = 2 /*!< Range is from 16 to 235. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used to control transfer matrix and nominal range of YUV frames. The application + should provide this during initialization. Supported for multiple conversions, for example YUV to YUV, YUV to RGB, and RGB to YUV. + + @note This structure is used by VPP only and is not compatible with mfxExtVideoSignalInfo. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO. */ + mfxU16 reserved14; + + union { + struct { // Init + struct { + mfxU16 TransferMatrix; /*!< Transfer matrix. */ + mfxU16 NominalRange; /*!< Nominal range. */ + mfxU16 reserved26; + } In, Out; + }; + struct { // Runtime< + mfxU16 TransferMatrix; /*!< Transfer matrix. */ + mfxU16 NominalRange; /*!< Nominal range. */ + mfxU16 reserved314; + }; + }; +} mfxExtVPPVideoSignalInfo; +MFX_PACK_END() + +/*! The ROImode enumerator itemizes QP adjustment mode for ROIs. */ +enum { + MFX_ROI_MODE_PRIORITY = 0, /*!< Priority mode. */ + MFX_ROI_MODE_QP_DELTA = 1, /*!< QP mode */ + MFX_ROI_MODE_QP_VALUE = 2 /*!< Absolute QP */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used by the application to specify different Region Of Interests during encoding. It may be used at + initialization or at runtime. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODER_ROI. */ + + mfxU16 NumROI; /*!< Number of ROI descriptions in array. The Query API function mode 2 returns maximum supported value (set it to 256 and + query will update it to maximum supported value). */ + mfxU16 ROIMode; /*!< QP adjustment mode for ROIs. Defines if Priority or DeltaQP is used during encoding. */ + mfxU16 reserved110; + + struct { + /*! @{ + @name ROI location rectangle + The ROI rectangle definition uses end-point exclusive notation. In other words, the pixel with (Right, Bottom) + coordinates lies immediately outside of the ROI. Left, Top, Right, Bottom should be aligned by codec-specific block boundaries + (should be dividable by 16 for AVC, or by 32 for HEVC). Every ROI with unaligned coordinates will be expanded by the library to minimal-area + block-aligned ROI, enclosing the original one. For example (5, 5, 15, 31) ROI will be expanded to (0, 0, 16, 32) for AVC encoder, + or to (0, 0, 32, 32) for HEVC. + */ + mfxU32 Left; /*!< Left ROI's coordinate. */ + mfxU32 Top; /*!< Top ROI's coordinate. */ + mfxU32 Right; /*!< Right ROI's coordinate. */ + mfxU32 Bottom; /*!< Bottom ROI's coordinate. */ + union { + /*! Priority of ROI. Used if ROIMode = MFX_ROI_MODE_PRIORITY.This is an absolute value in the range of -3 to 3, + which will be added to the MB QP. Priority is deprecated mode and is used only for backward compatibility. + Bigger value produces better quality. */ + mfxI16 Priority; + /*! Delta QP of ROI. Used if ROIMode = MFX_ROI_MODE_QP_DELTA. This is an absolute value in the range of -51 to 51, + which will be added to the MB QP. Lesser value produces better quality. */ + mfxI16 DeltaQP; + }; + mfxU16 reserved27; + /*! @} */ + } ROI256; /*!< Array of ROIs. Different ROI may overlap each other. If macroblock belongs to several ROI, + Priority from ROI with lowest index is used. */ +} mfxExtEncoderROI; +MFX_PACK_END() + +/*! The DeinterlacingMode enumerator itemizes VPP deinterlacing modes. */ +enum { + MFX_DEINTERLACING_BOB = 1, /*!< BOB deinterlacing mode. */ + MFX_DEINTERLACING_ADVANCED = 2, /*!< Advanced deinterlacing mode. */ + MFX_DEINTERLACING_AUTO_DOUBLE = 3, /*!< Auto mode with deinterlacing double frame rate output. */ + MFX_DEINTERLACING_AUTO_SINGLE = 4, /*!< Auto mode with deinterlacing single frame rate output. */ + MFX_DEINTERLACING_FULL_FR_OUT = 5, /*!< Deinterlace only mode with full frame rate output. */ + MFX_DEINTERLACING_HALF_FR_OUT = 6, /*!< Deinterlace only Mode with half frame rate output. */ + MFX_DEINTERLACING_24FPS_OUT = 7, /*!< 24 fps fixed output mode. */ + MFX_DEINTERLACING_FIXED_TELECINE_PATTERN = 8, /*!< Fixed telecine pattern removal mode. */ + MFX_DEINTERLACING_30FPS_OUT = 9, /*!< 30 fps fixed output mode. */ + MFX_DEINTERLACING_DETECT_INTERLACE = 10, /*!< Only interlace detection. */ + MFX_DEINTERLACING_ADVANCED_NOREF = 11, /*!< Advanced deinterlacing mode without using of reference frames. */ + MFX_DEINTERLACING_ADVANCED_SCD = 12, /*!< Advanced deinterlacing mode with scene change detection. */ + MFX_DEINTERLACING_FIELD_WEAVING = 13 /*!< Field weaving. */ +}; + +/*! The TelecinePattern enumerator itemizes telecine patterns. */ +enum { + MFX_TELECINE_PATTERN_32 = 0, /*!< 3:2 telecine. */ + MFX_TELECINE_PATTERN_2332 = 1, /*!< 2:3:3:2 telecine. */ + MFX_TELECINE_PATTERN_FRAME_REPEAT = 2, /*!< One frame repeat telecine. */ + MFX_TELECINE_PATTERN_41 = 3, /*!< 4:1 telecine. */ + MFX_TELECINE_POSITION_PROVIDED = 4 /*!< User must provide position inside a sequence of 5 frames where the artifacts start. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used by the application to specify different deinterlacing algorithms. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_DEINTERLACING. */ + mfxU16 Mode; /*!< Deinterlacing algorithm. See the DeinterlacingMode enumerator for details. */ + mfxU16 TelecinePattern; /*!< Specifies telecine pattern when Mode = MFX_DEINTERLACING_FIXED_TELECINE_PATTERN. See the TelecinePattern enumerator for details.*/ + mfxU16 TelecineLocation; /*!< Specifies position inside a sequence of 5 frames where the artifacts start when TelecinePattern = MFX_TELECINE_POSITION_PROVIDED*/ + mfxU16 reserved9; /*!< Reserved for future use. */ +} mfxExtVPPDeinterlacing; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Specifies reference lists for the encoder. It may be used together with the mfxExtAVCRefListCtrl + structure to create customized reference lists. If both structures are used together, then the encoder takes reference lists from the + mfxExtAVCRefLists structure and modifies them according to the mfxExtAVCRefListCtrl instructions. In case of interlaced coding, + the first mfxExtAVCRefLists structure affects TOP field and the second - BOTTOM field. + + @note Not all implementations of the encoder support this structure. The application must use the Query API function to determine if it is supported. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AVC_REFLISTS. */ + mfxU16 NumRefIdxL0Active; /*!< Specify the number of reference frames in the active reference list L0. This number should be less than or + equal to the NumRefFrame parameter from encoding initialization. */ + mfxU16 NumRefIdxL1Active; /*!< Specify the number of reference frames in the active reference list L1. This number should be less than or + equal to the NumRefFrame parameter from encoding initialization. */ + mfxU16 reserved2; + + /*! Used by the reference lists contained in the parent structure. Together these fields are used to identify reference picture. */ + struct mfxRefPic{ + mfxU32 FrameOrder; /*!< Use FrameOrder = MFX_FRAMEORDER_UNKNOWN to mark + unused entry. */ + mfxU16 PicStruct; /*!< Use PicStruct = MFX_PICSTRUCT_FIELD_TFF for TOP field, PicStruct = MFX_PICSTRUCT_FIELD_BFF for + BOTTOM field. */ + mfxU16 reserved5; + } RefPicList032, /*!< Specify L0 reference list. */ + RefPicList132; /*!< Specify L1 reference list. */ + +}mfxExtAVCRefLists; +MFX_PACK_END() + +/*! The VPPFieldProcessingMode enumerator is used to control VPP field processing algorithm. */ +enum { + MFX_VPP_COPY_FRAME =0x01, /*!< Copy the whole frame. */ + MFX_VPP_COPY_FIELD =0x02, /*!< Copy only one field. */ + MFX_VPP_SWAP_FIELDS =0x03 /*!< Swap top and bottom fields. */ +}; + +/*! The PicType enumerator itemizes picture type. */ +enum { + MFX_PICTYPE_UNKNOWN =0x00, /*!< Picture type is unknown. */ + MFX_PICTYPE_FRAME =0x01, /*!< Picture is a frame. */ + MFX_PICTYPE_TOPFIELD =0x02, /*!< Picture is a top field. */ + MFX_PICTYPE_BOTTOMFIELD =0x04 /*!< Picture is a bottom field. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Configures the VPP field processing algorithm. The application can attach this extended buffer to + the mfxVideoParam structure to configure initialization and/or to the mfxFrameData during runtime. Runtime configuration has priority + over initialization configuration. If the field processing algorithm was activated via the mfxExtVPPDoUse structure and the mfxExtVPPFieldProcessing + extended buffer was not provided during initialization, this buffer must be attached to the mfxFrameData structure of each input surface. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_FIELD_PROCESSING. */ + + mfxU16 Mode; /*!< Specifies the mode of the field processing algorithm. See the VPPFieldProcessingMode enumerator for values of this option. */ + mfxU16 InField; /*!< When Mode is MFX_VPP_COPY_FIELD, specifies input field. See the PicType enumerator for values of this parameter. */ + mfxU16 OutField; /*!< When Mode is MFX_VPP_COPY_FIELD, specifies output field. See the PicType enumerator for values of this parameter. */ + mfxU16 reserved25; +} mfxExtVPPFieldProcessing; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + If attached to the mfxVideoParam structure during the Init stage, this buffer will instruct the decoder to resize output frames via the + fixed function resize engine (if supported by hardware), utilizing direct pipe connection and bypassing intermediate memory operations. + The main benefits of this mode of pipeline operation are offloading resize operation to a dedicated engine, thus reducing power + consumption and memory traffic. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_DEC_VIDEO_PROCESSING. */ + + /*! Input surface description. */ + struct mfxIn{ + mfxU16 CropX; /*!< X coordinate of region of interest of the input surface. */ + mfxU16 CropY; /*!< Y coordinate of region of interest of the input surface. */ + mfxU16 CropW; /*!< Width coordinate of region of interest of the input surface. */ + mfxU16 CropH; /*!< Height coordinate of region of interest of the input surface. */ + mfxU16 reserved12; + }In; /*!< Input surface description. */ + + /*! Output surface description. */ + struct mfxOut{ + mfxU32 FourCC; /*!< FourCC of output surface Note: Should be MFX_FOURCC_NV12. */ + mfxU16 ChromaFormat; /*!< Chroma Format of output surface. + @note Should be MFX_CHROMAFORMAT_YUV420 */ + mfxU16 reserved1; + + mfxU16 Width; /*!< Width of output surface. */ + mfxU16 Height; /*!< Height of output surface. */ + + mfxU16 CropX; /*!< X coordinate of region of interest of the output surface. */ + mfxU16 CropY; /*!< Y coordinate of region of interest of the output surface. */ + mfxU16 CropW; /*!< Width coordinate of region of interest of the output surface. */ + mfxU16 CropH; /*!< Height coordinate of region of interest of the output surface. */ + mfxU16 reserved22; + }Out; /*!< Output surface description. */ + + mfxU16 reserved13; +} mfxExtDecVideoProcessing; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Members of this structure define the location of chroma samples information. + + See Annex E of the ISO*\/IEC* 14496-10 specification for the definition of these parameters. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_CHROMA_LOC_INFO. */ + + mfxU16 ChromaLocInfoPresentFlag; + mfxU16 ChromaSampleLocTypeTopField; + mfxU16 ChromaSampleLocTypeBottomField; + mfxU16 reserved9; +} mfxExtChromaLocInfo; +MFX_PACK_END() + +/*! The MBQPMode enumerator itemizes QP update modes. */ +enum { + MFX_MBQP_MODE_QP_VALUE = 0, /*!< QP array contains QP values. */ + MFX_MBQP_MODE_QP_DELTA = 1, /*!< QP array contains deltas for QP. */ + MFX_MBQP_MODE_QP_ADAPTIVE = 2 /*!< QP array contains deltas for QP or absolute QP values. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Specifies per-MB or per-CU mode and QP or deltaQP value depending on the mode type. + */ +typedef struct{ + union { + /*! + QP for MB or CU. Valid when Mode = MFX_MBQP_MODE_QP_VALUE. + + For AVC, the valid range is 1 to 51. + + For HEVC, the valid range is 1 to 51. The application's provided QP values should be valid, otherwise invalid QP values may cause undefined behavior. + + MBQP map should be aligned for 16x16 block size. The align rule is: (width +15 /16) && (height +15 /16). + + For MPEG2, the valid range is 1 to 112. QP corresponds to quantizer_scale of the ISO*\/IEC* 13818-2 specification. + */ + mfxU8 QP; + /*! + Per-macroblock QP delta. Valid when Mode = MFX_MBQP_MODE_QP_DELTA. + */ + mfxI8 DeltaQP; + }; + mfxU16 Mode; /*!< Defines QP update mode. Can be equal to MFX_MBQP_MODE_QP_VALUE or MFX_MBQP_MODE_QP_DELTA. */ +} mfxQPandMode; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +/*! + Specifies per-macroblock QP for current frame if mfxExtCodingOption3::EnableMBQP was turned ON during + encoder initialization. The application can attach this extended buffer to the mfxEncodeCtrl structure during runtime. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MBQP. */ + + mfxU32 reserved10; + mfxU16 Mode; /*!< Defines QP update mode. See MBQPMode enumerator for more details. */ + mfxU16 BlockSize; /*!< QP block size, valid for HEVC only during Init and Runtime. */ + mfxU32 NumQPAlloc; /*!< Size of allocated by application QP or DeltaQP array. */ + union { + /*! + Pointer to a list of per-macroblock QP in raster scan order. In case of interlaced encoding the first half of QP array affects the top + field and the second half of QP array affects the bottom field. Valid when Mode = MFX_MBQP_MODE_QP_VALUE. + + For AVC, the valid range is 1 to 51. + + For HEVC, the valid range is 1 to 51. Application's provided QP values should be valid. Otherwise invalid QP values may cause undefined behavior. + MBQP map should be aligned for 16x16 block size. The alignment rule is (width +15 /16) && (height +15 /16). + + For MPEG2, QP corresponds to quantizer_scale of the ISO*\/IEC* 13818-2 specification and has a valid range of 1 to 112. + */ + mfxU8 *QP; + mfxI8 *DeltaQP; /*!< Pointer to a list of per-macroblock QP deltas in raster scan order. + For block i: QPi = BrcQPi + DeltaQPi. Valid when Mode = MFX_MBQP_MODE_QP_DELTA. */ + mfxQPandMode *QPmode; /*!< Block-granularity modes when MFX_MBQP_MODE_QP_ADAPTIVE is set. */ + + mfxU64 reserved2; + }; +} mfxExtMBQP; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Runtime ctrl buffer for SPS/PPS insertion with current encoding frame. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_INSERT_HEADERS. */ + mfxU16 SPS; /*!< Tri-state option to insert SPS. */ + mfxU16 PPS; /*!< Tri-state option to insert PPS. */ + mfxU16 reserved8; +} mfxExtInsertHeaders; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Specifies rectangle areas for IPCM coding mode. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODER_IPCM_AREA. */ + mfxU16 reserve110; + + mfxU16 NumArea; /*! Number of areas */ + struct area { + + mfxU32 Left; /*!< Left area coordinate. */ + mfxU32 Top; /*!< Top area coordinate. */ + mfxU32 Right; /*!< Right area coordinate. */ + mfxU32 Bottom; /*!< Bottom area coordinate. */ + + mfxU16 reserved28; + + } * Areas; /*!< Array of areas. */ +} mfxExtEncoderIPCMArea; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +/*! + Specifies macroblock map for current frame which forces specified macroblocks to be encoded as intra + if mfxExtCodingOption3::EnableMBForceIntra was turned ON during encoder initialization. The application can attach this extended + buffer to the mfxEncodeCtrl structure during runtime. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MB_FORCE_INTRA. */ + + mfxU32 reserved11; + mfxU32 MapSize; /*!< Macroblock map size. */ + union { + mfxU8 *Map; /*!< Pointer to a list of force intra macroblock flags in raster scan order. Each flag is one byte in map. Set flag to 1 + to force corresponding macroblock to be encoded as intra. In case of interlaced encoding, the first half of map + affects top field and the second half of map affects the bottom field. */ + mfxU64 reserved2; + }; +} mfxExtMBForceIntra; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Configures tiles options for the HEVC encoder. The application can attach this extended buffer to the + mfxVideoParam structure to configure initialization. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_HEVC_TILES. */ + + mfxU16 NumTileRows; /*!< Number of tile rows. */ + mfxU16 NumTileColumns; /*!< Number of tile columns. */ + mfxU16 reserved74; +}mfxExtHEVCTiles; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +/*! + Specifies macroblock map for current frame which forces specified macroblocks to be non-skip if + mfxExtCodingOption3::MBDisableSkipMap was turned ON during encoder initialization. The application can attach this + extended buffer to the mfxEncodeCtrl structure during runtime. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MB_DISABLE_SKIP_MAP. */ + + mfxU32 reserved11; + mfxU32 MapSize; /*!< Macroblock map size. */ + union { + mfxU8 *Map; /*!< Pointer to a list of non-skip macroblock flags in raster scan order. Each flag is one byte in map. Set flag to 1 to force + corresponding macroblock to be non-skip. In case of interlaced encoding, the first half of map affects + the top field and the second half of map affects the bottom field. */ + mfxU64 reserved2; + }; +} mfxExtMBDisableSkipMap; +MFX_PACK_END() + +/*! The GeneralConstraintFlags enumerator uses bit-ORed values to itemize HEVC bitstream indications for specific profiles. Each value + indicates for format range extensions profiles. + To specify HEVC Main 10 Still Picture profile applications have to set mfxInfoMFX::CodecProfile == MFX_PROFILE_HEVC_MAIN10 and + mfxExtHEVCParam::GeneralConstraintFlags == MFX_HEVC_CONSTR_REXT_ONE_PICTURE_ONLY. */ +enum { + /* REXT Profile constraint flags*/ + MFX_HEVC_CONSTR_REXT_MAX_12BIT = (1 << 0), + MFX_HEVC_CONSTR_REXT_MAX_10BIT = (1 << 1), + MFX_HEVC_CONSTR_REXT_MAX_8BIT = (1 << 2), + MFX_HEVC_CONSTR_REXT_MAX_422CHROMA = (1 << 3), + MFX_HEVC_CONSTR_REXT_MAX_420CHROMA = (1 << 4), + MFX_HEVC_CONSTR_REXT_MAX_MONOCHROME = (1 << 5), + MFX_HEVC_CONSTR_REXT_INTRA = (1 << 6), + MFX_HEVC_CONSTR_REXT_ONE_PICTURE_ONLY = (1 << 7), + MFX_HEVC_CONSTR_REXT_LOWER_BIT_RATE = (1 << 8) +}; + + +/*! The SampleAdaptiveOffset enumerator uses bit-ORed values to itemize corresponding HEVC encoding feature. */ +enum { + MFX_SAO_UNKNOWN = 0x00, /*!< Use default value for platform/TargetUsage. */ + MFX_SAO_DISABLE = 0x01, /*!< Disable SAO. If set during Init leads to SPS sample_adaptive_offset_enabled_flag = 0. + If set during Runtime, leads to to slice_sao_luma_flag = 0 and slice_sao_chroma_flag = 0 + for current frame. */ + MFX_SAO_ENABLE_LUMA = 0x02, /*!< Enable SAO for luma (slice_sao_luma_flag = 1). */ + MFX_SAO_ENABLE_CHROMA = 0x04 /*!< Enable SAO for chroma (slice_sao_chroma_flag = 1). */ +}; + + +/* This struct has 4-byte alignment for binary compatibility with previously released versions of API */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_HEVC_PARAM. */ + + mfxU16 PicWidthInLumaSamples; /*!< Specifies the width of each coded picture in units of luma samples. */ + mfxU16 PicHeightInLumaSamples; /*!< Specifies the height of each coded picture in units of luma samples. */ + mfxU64 GeneralConstraintFlags; /*!< Additional flags to specify exact profile and constraints. See the GeneralConstraintFlags enumerator for values of this field. */ + mfxU16 SampleAdaptiveOffset; /*!< Controls SampleAdaptiveOffset encoding feature. See the SampleAdaptiveOffset enumerator for supported values + (bit-ORed). Valid during encoder Init and Runtime. */ + mfxU16 LCUSize; /*!< Specifies largest coding unit size (max luma coding block). Valid during encoder Init. */ + mfxU16 reserved116; +} mfxExtHEVCParam; +MFX_PACK_END() + +/*! The ErrorTypes enumerator uses bit-ORed values to itemize bitstream error types. */ +enum { + MFX_ERROR_NO = 0, /*!< No error in bitstream. */ + MFX_ERROR_PPS = (1 << 0), /*!< Invalid/corrupted PPS. */ + MFX_ERROR_SPS = (1 << 1), /*!< Invalid/corrupted SPS. */ + MFX_ERROR_SLICEHEADER = (1 << 2), /*!< Invalid/corrupted slice header. */ + MFX_ERROR_SLICEDATA = (1 << 3), /*!< Invalid/corrupted slice data. */ + MFX_ERROR_FRAME_GAP = (1 << 4), /*!< Missed frames. */ + MFX_ERROR_JPEG_APP0_MARKER = (1 << 5), /*!< Invalid/corrupted APP0 marker. */ + MFX_ERROR_JPEG_APP1_MARKER = (1 << 6), /*!< Invalid/corrupted APP1 marker. */ + MFX_ERROR_JPEG_APP2_MARKER = (1 << 7), /*!< Invalid/corrupted APP2 marker. */ + MFX_ERROR_JPEG_APP3_MARKER = (1 << 8), /*!< Invalid/corrupted APP3 marker. */ + MFX_ERROR_JPEG_APP4_MARKER = (1 << 9), /*!< Invalid/corrupted APP4 marker. */ + MFX_ERROR_JPEG_APP5_MARKER = (1 << 10), /*!< Invalid/corrupted APP5 marker. */ + MFX_ERROR_JPEG_APP6_MARKER = (1 << 11), /*!< Invalid/corrupted APP6 marker. */ + MFX_ERROR_JPEG_APP7_MARKER = (1 << 12), /*!< Invalid/corrupted APP7 marker. */ + MFX_ERROR_JPEG_APP8_MARKER = (1 << 13), /*!< Invalid/corrupted APP8 marker. */ + MFX_ERROR_JPEG_APP9_MARKER = (1 << 14), /*!< Invalid/corrupted APP9 marker. */ + MFX_ERROR_JPEG_APP10_MARKER = (1 << 15), /*!< Invalid/corrupted APP10 marker. */ + MFX_ERROR_JPEG_APP11_MARKER = (1 << 16), /*!< Invalid/corrupted APP11 marker. */ + MFX_ERROR_JPEG_APP12_MARKER = (1 << 17), /*!< Invalid/corrupted APP12 marker. */ + MFX_ERROR_JPEG_APP13_MARKER = (1 << 18), /*!< Invalid/corrupted APP13 marker. */ + MFX_ERROR_JPEG_APP14_MARKER = (1 << 19), /*!< Invalid/corrupted APP14 marker. */ + MFX_ERROR_JPEG_DQT_MARKER = (1 << 20), /*!< Invalid/corrupted DQT marker. */ + MFX_ERROR_JPEG_SOF0_MARKER = (1 << 21), /*!< Invalid/corrupted SOF0 marker. */ + MFX_ERROR_JPEG_DHT_MARKER = (1 << 22), /*!< Invalid/corrupted DHT marker. */ + MFX_ERROR_JPEG_DRI_MARKER = (1 << 23), /*!< Invalid/corrupted DRI marker. */ + MFX_ERROR_JPEG_SOS_MARKER = (1 << 24), /*!< Invalid/corrupted SOS marker. */ + MFX_ERROR_JPEG_UNKNOWN_MARKER = (1 << 25), /*!< Unknown Marker. */ +}; + + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used by the decoders to report bitstream error information right after DecodeHeader or DecodeFrameAsync. + The application can attach this extended buffer to the mfxBitstream structure at runtime. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_DECODE_ERROR_REPORT. */ + + mfxU32 ErrorTypes; /*!< Bitstream error types (bit-ORed values). See ErrorTypes enumerator for the list of types. */ + mfxU16 reserved10; +} mfxExtDecodeErrorReport; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used by the decoders to report additional information about a decoded frame. The application can attach this + extended buffer to the mfxFrameSurface1::mfxFrameData structure at runtime. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_DECODED_FRAME_INFO. */ + + mfxU16 FrameType; /*!< Frame type. See FrameType enumerator for the list of types. */ + mfxU16 reserved59; +} mfxExtDecodedFrameInfo; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used by the library to pass MPEG 2 specific timing information. + + See ISO/IEC 13818-2 and ITU-T H.262, MPEG-2 Part 2 for the definition of these parameters. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_TIME_CODE. */ + + mfxU16 DropFrameFlag; /*!< Indicated dropped frame. */ + mfxU16 TimeCodeHours; /*!< Hours. */ + mfxU16 TimeCodeMinutes; /*!< Minutes. */ + mfxU16 TimeCodeSeconds; /*!< Seconds. */ + mfxU16 TimeCodePictures; /*!< Pictures. */ + mfxU16 reserved7; +} mfxExtTimeCode; +MFX_PACK_END() + +/*! The HEVCRegionType enumerator itemizes type of HEVC region. */ +enum { + MFX_HEVC_REGION_SLICE = 0 /*!< Slice type. */ +}; + +/*! The HEVCRegionEncoding enumerator itemizes HEVC region's encoding. */ +enum { + MFX_HEVC_REGION_ENCODING_ON = 0, + MFX_HEVC_REGION_ENCODING_OFF = 1 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Attached to the mfxVideoParam structure during HEVC encoder initialization. Specifies the region to encode. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_HEVC_REGION. */ + + mfxU32 RegionId; /*!< ID of region. */ + mfxU16 RegionType; /*!< Type of region. See HEVCRegionType enumerator for the list of types. */ + mfxU16 RegionEncoding; /*!< Set to MFX_HEVC_REGION_ENCODING_ON to encode only specified region. */ + mfxU16 reserved24; +} mfxExtHEVCRegion; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Specifies weighted prediction table for current frame when all of the following conditions are met: + + @li mfxExtCodingOption3::WeightedPred was set to explicit during encoder Init or Reset . + + @li The current frame is P-frame or mfxExtCodingOption3::WeightedBiPred was set to explicit during encoder Init or Reset. + + @li The current frame is B-frame and is attached to the mfxEncodeCtrl structure. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_PRED_WEIGHT_TABLE. */ + + mfxU16 LumaLog2WeightDenom; /*!< Base 2 logarithm of the denominator for all luma weighting factors. Value must be in the range of 0 to 7, inclusive. */ + mfxU16 ChromaLog2WeightDenom; /*!< Base 2 logarithm of the denominator for all chroma weighting factors. Value must be in the range of 0 to 7, inclusive. */ + mfxU16 LumaWeightFlag232; /*!< LumaWeightFlagLR equal to 1 specifies that the weighting factors for the luma component are specified for R's entry of RefPicList L. */ + mfxU16 ChromaWeightFlag232; /*!< ChromaWeightFlagLR equal to 1 specifies that the weighting factors for the chroma component are specified for R's entry of RefPicList L. */ + mfxI16 Weights23232; /*!< The values of the weights and offsets used in the encoding processing. The value of Weightsijkm is + interpreted as: i refers to reference picture list 0 or 1; j refers to reference list entry 0-31; + k refers to data for the luma component when it is 0, the Cb chroma component when it is 1 and + the Cr chroma component when it is 2; m refers to weight when it is 0 and offset when it is 1 */ + mfxU16 reserved58; +} mfxExtPredWeightTable; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used by encoders to set rounding offset parameters for quantization. It is per-frame based encoding control, + and can be attached to some frames and skipped for others. When the extension buffer is set the application can attach it to the mfxEncodeCtrl + during runtime. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AVC_ROUNDING_OFFSET. */ + + mfxU16 EnableRoundingIntra; /*!< Enable rounding offset for intra blocks. See the CodingOptionValue enumerator for values of this option. */ + mfxU16 RoundingOffsetIntra; /*!< Intra rounding offset. Value must be in the range of 0 to 7, inclusive. */ + mfxU16 EnableRoundingInter; /*!< Enable rounding offset for inter blocks. See the CodingOptionValue enumerator for values of this option. */ + mfxU16 RoundingOffsetInter; /*!< Inter rounding offset. Value must be in the range of 0 to 7, inclusive. */ + + mfxU16 reserved24; +} mfxExtAVCRoundingOffset; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used by the application to specify dirty regions within a frame during encoding. It may be used at initialization or at runtime. + + Dirty rectangle definition is using end-point exclusive notation. In other words, the pixel with (Right, Bottom) coordinates lies + immediately outside of the dirty rectangle. Left, Top, Right, Bottom should be aligned by codec-specific block boundaries (should be + dividable by 16 for AVC, or by block size (8, 16, 32 or 64, depends on platform) for HEVC). + + Every dirty rectangle with unaligned + coordinates will be expanded to a minimal-area block-aligned dirty rectangle, enclosing the original one. + For example, a (5, 5, 15, 31) dirty rectangle will be expanded to (0, 0, 16, 32) for AVC encoder, or to (0, 0, 32, 32) for HEVC, + if block size is 32. + + Dirty rectangle (0, 0, 0, 0) is a valid dirty rectangle and means that the frame is not changed. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_DIRTY_RECTANGLES. */ + + mfxU16 NumRect; /*!< Number of dirty rectangles. */ + mfxU16 reserved111; + + struct { + /*! @{ + @name Dirty rectangle coordinates + The following structure members are used by the Rect array contained in the parent structure. + + */ + mfxU32 Left; /*!< Dirty region left coordinate. */ + mfxU32 Top; /*!< Dirty region top coordinate. */ + mfxU32 Right; /*!< Dirty region right coordinate. */ + mfxU32 Bottom; /*!< Dirty region bottom coordinate. */ + + mfxU16 reserved28; + /*! @} */ + } Rect256; /*!< Array of dirty rectangles. */ +} mfxExtDirtyRect; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used by the application to specify moving regions within a frame during encoding. + + Destination rectangle location should be aligned to MB boundaries (should be dividable by 16). If not, the encoder + truncates it to MB boundaries, for example, both 17 and 31 will be truncated to 16. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MOVING_RECTANGLE. */ + + mfxU16 NumRect; /*!< Number of moving rectangles. */ + mfxU16 reserved111; + + struct { + /*! @{ + @name Destination and source rectangle location + The following structure members are used by the Rect array contained in the parent structure. + */ + mfxU32 DestLeft; /*!< Destination rectangle location. */ + mfxU32 DestTop; /*!< Destination rectangle location. */ + mfxU32 DestRight; /*!< Destination rectangle location. */ + mfxU32 DestBottom; /*!< Destination rectangle location. */ + + mfxU32 SourceLeft; /*!< Source rectangle location. */ + mfxU32 SourceTop; /*!< Source rectangle location. */ + mfxU16 reserved24; + /*! @} */ + } Rect256; /*!< Array of moving rectangles. */ +} mfxExtMoveRect; +MFX_PACK_END() + +/*! The Angle enumerator itemizes valid rotation angles. */ +enum { + MFX_ANGLE_0 = 0, /*!< 0 degrees. */ + MFX_ANGLE_90 = 90, /*!< 90 degrees. */ + MFX_ANGLE_180 = 180, /*!< 180 degrees. */ + MFX_ANGLE_270 = 270 /*!< 270 degrees. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Configures the VPP Rotation filter algorithm. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_ROTATION. */ + + mfxU16 Angle; /*!< Rotation angle. See Angle enumerator for supported values. */ + mfxU16 reserved11; +} mfxExtVPPRotation; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +/*! + Used by the encoder to report additional information about encoded slices. The application can attach this + buffer to the mfxBitstream structure before calling the MFXVideoENCODE_EncodeFrameAsync function. + + @note Not all implementations of the encoder support this extended buffer. The application must use query mode 1 to determine if the + functionality is supported. To do this, the application must attach this extended buffer to the mfxVideoParam structure and call the + MFXVideoENCODE_Query function. If the function returns MFX_ERR_NONE, then the functionality is supported. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODED_SLICES_INFO. */ + + mfxU16 SliceSizeOverflow; /*!< When mfxExtCodingOption2::MaxSliceSize is used, indicates the requested slice size was not met for one or more generated slices. */ + mfxU16 NumSliceNonCopliant; /*!< When mfxExtCodingOption2::MaxSliceSize is used, indicates the number of generated slices exceeds specification limits. */ + mfxU16 NumEncodedSlice; /*!< Number of encoded slices. */ + mfxU16 NumSliceSizeAlloc; /*!< SliceSize array allocation size. Must be specified by application. */ + union { + mfxU16 *SliceSize; /*!< Slice size in bytes. Array must be allocated by application. */ + mfxU64 reserved1; + }; + + mfxU16 reserved20; +} mfxExtEncodedSlicesInfo; +MFX_PACK_END() + +/*! The ScalingMode enumerator itemizes variants of scaling filter implementation. */ +enum { + MFX_SCALING_MODE_DEFAULT = 0, /*!< Default scaling mode. The library selects the most appropriate scaling method. */ + MFX_SCALING_MODE_LOWPOWER = 1, /*!< Low power scaling mode which is applicable for library implementations. + The exact scaling algorithm is defined by the library. */ + MFX_SCALING_MODE_QUALITY = 2, /*!< The best quality scaling mode. */ + MFX_SCALING_MODE_VENDOR = 1000, /*!< The enumeration to separate common scaling controls above and vendor specific. */ + MFX_SCALING_MODE_INTEL_GEN_COMPUTE = MFX_SCALING_MODE_VENDOR + 1, /*! The mode to run scaling operation on Execution Units (EUs). */ + MFX_SCALING_MODE_INTEL_GEN_VDBOX = MFX_SCALING_MODE_VENDOR + 2, /*! The special optimization mode where scaling operation running on SFC (Scaler & Format Converter) is coupled with VDBOX (also known as Multi-Format Codec fixed-function engine). This mode is applicable for DECODE_VPP domain functions. */ + MFX_SCALING_MODE_INTEL_GEN_VEBOX = MFX_SCALING_MODE_VENDOR + 3 /*! The special optimization mode where scaling operation running on SFC is coupled with VEBOX (HW video processing pipe). */ +}; + +/*! The InterpolationMode enumerator specifies type of interpolation method used by VPP scaling filter. */ +enum { + MFX_INTERPOLATION_DEFAULT = 0, /*!< Default interpolation mode for scaling. Library selects the most appropriate + scaling method. */ + MFX_INTERPOLATION_NEAREST_NEIGHBOR = 1, /*!< Nearest neighbor interpolation method. */ + MFX_INTERPOLATION_BILINEAR = 2, /*!< Bilinear interpolation method. */ + MFX_INTERPOLATION_ADVANCED = 3 /*!< Advanced interpolation method is defined by each implementation and usually gives best quality. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Configures the VPP Scaling filter algorithm. + Not all combinations of ScalingMode and InterpolationMethod are supported in the library. The application must use the Query API function to determine if a combination is supported. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_SCALING. */ + + mfxU16 ScalingMode; /*!< Scaling mode. See ScalingMode for values. */ + mfxU16 InterpolationMethod; /*!< Interpolation mode for scaling algorithm. See InterpolationMode for values. */ + mfxU16 reserved10; +} mfxExtVPPScaling; +MFX_PACK_END() + +typedef mfxExtAVCRefListCtrl mfxExtHEVCRefListCtrl; +typedef mfxExtAVCRefLists mfxExtHEVCRefLists; +typedef mfxExtAvcTemporalLayers mfxExtHEVCTemporalLayers; + +#ifdef ONEVPL_EXPERIMENTAL +typedef mfxExtAVCRefListCtrl mfxExtRefListCtrl; +#endif + +/* The MirroringType enumerator itemizes mirroring types. */ +enum +{ + MFX_MIRRORING_DISABLED = 0, + MFX_MIRRORING_HORIZONTAL = 1, + MFX_MIRRORING_VERTICAL = 2 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Configures the VPP Mirroring filter algorithm. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_MIRRORING. */ + + mfxU16 Type; /*!< Mirroring type. See MirroringType for values. */ + mfxU16 reserved11; +} mfxExtVPPMirroring; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Instructs encoder to use or not use samples over specified picture border for inter prediction. Attached to the mfxVideoParam structure. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_MV_OVER_PIC_BOUNDARIES. */ + + mfxU16 StickTop; /*!< When set to OFF, one or more samples outside corresponding picture boundary may be used in inter prediction. + See the CodingOptionValue enumerator for values of this option. */ + mfxU16 StickBottom; /*!< When set to OFF, one or more samples outside corresponding picture boundary may be used in inter prediction. + See the CodingOptionValue enumerator for values of this option. */ + mfxU16 StickLeft; /*!< When set to OFF, one or more samples outside corresponding picture boundary may be used in inter prediction. + See the CodingOptionValue enumerator for values of this option. */ + mfxU16 StickRight; /*!< When set to OFF, one or more samples outside corresponding picture boundary may be used in inter prediction. + See the CodingOptionValue enumerator for values of this option. */ + mfxU16 reserved8; +} mfxExtMVOverPicBoundaries; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Configures the VPP ColorFill filter algorithm. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_COLORFILL. */ + + mfxU16 Enable; /*!< Set to ON makes VPP fill the area between Width/Height and Crop borders. + See the CodingOptionValue enumerator for values of this option. */ + mfxU16 reserved11; +} mfxExtVPPColorFill; +MFX_PACK_END() + + +/*! The ChromaSiting enumerator defines chroma location. Use bit-OR'ed values to specify the desired location. */ +enum { + MFX_CHROMA_SITING_UNKNOWN = 0x0000, /*!< Unspecified. */ + MFX_CHROMA_SITING_VERTICAL_TOP = 0x0001, /*!< Chroma samples are co-sited vertically on the top with the luma samples. */ + MFX_CHROMA_SITING_VERTICAL_CENTER = 0x0002, /*!< Chroma samples are not co-sited vertically with the luma samples. */ + MFX_CHROMA_SITING_VERTICAL_BOTTOM = 0x0004, /*!< Chroma samples are co-sited vertically on the bottom with the luma samples. */ + MFX_CHROMA_SITING_HORIZONTAL_LEFT = 0x0010, /*!< Chroma samples are co-sited horizontally on the left with the luma samples. */ + MFX_CHROMA_SITING_HORIZONTAL_CENTER = 0x0020 /*!< Chroma samples are not co-sited horizontally with the luma samples. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + A hint structure that tunes the VPP Color Conversion algorithm when + attached to the mfxVideoParam structure during VPP Init. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_COLOR_CONVERSION. */ + + mfxU16 ChromaSiting; /*!< See ChromaSiting enumerator for details. */ + mfxU16 reserved27; +} mfxExtColorConversion; +MFX_PACK_END() + + +/*! The VP9ReferenceFrame enumerator itemizes reference frame type by mfxVP9SegmentParam::ReferenceFrame parameter. */ +enum { + MFX_VP9_REF_INTRA = 0, /*!< Intra. */ + MFX_VP9_REF_LAST = 1, /*!< Last. */ + MFX_VP9_REF_GOLDEN = 2, /*!< Golden. */ + MFX_VP9_REF_ALTREF = 3 /*!< Alternative reference. */ +}; + +/*! + The SegmentIdBlockSize enumerator indicates the block size represented by each segment_id in segmentation map. + These values are used with the mfxExtVP9Segmentation::SegmentIdBlockSize parameter. +*/ +enum { + MFX_VP9_SEGMENT_ID_BLOCK_SIZE_UNKNOWN = 0, /*!< Unspecified block size. */ + MFX_VP9_SEGMENT_ID_BLOCK_SIZE_8x8 = 8, /*!< 8x8 block size. */ + MFX_VP9_SEGMENT_ID_BLOCK_SIZE_16x16 = 16, /*!< 16x16 block size. */ + MFX_VP9_SEGMENT_ID_BLOCK_SIZE_32x32 = 32, /*!< 32x32 block size. */ + MFX_VP9_SEGMENT_ID_BLOCK_SIZE_64x64 = 64, /*!< 64x64 block size. */ +}; + +/*! + The SegmentFeature enumerator indicates features enabled for the segment. + These values are used with the mfxVP9SegmentParam::FeatureEnabled parameter. +*/ +enum { + MFX_VP9_SEGMENT_FEATURE_QINDEX = 0x0001, /*!< Quantization index delta. */ + MFX_VP9_SEGMENT_FEATURE_LOOP_FILTER = 0x0002, /*!< Loop filter level delta. */ + MFX_VP9_SEGMENT_FEATURE_REFERENCE = 0x0004, /*!< Reference frame. */ + MFX_VP9_SEGMENT_FEATURE_SKIP = 0x0008 /*!< Skip. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Contains features and parameters for the segment. +*/ +typedef struct { + mfxU16 FeatureEnabled; /*!< Indicates which features are enabled for the segment. See the SegmentFeature enumerator for values for this + option. Values from the enumerator can be bit-OR'ed. Support of a particular feature depends on underlying + hardware platform. Application can check which features are supported by calling Query. */ + mfxI16 QIndexDelta; /*!< Quantization index delta for the segment. Ignored if MFX_VP9_SEGMENT_FEATURE_QINDEX isn't set in FeatureEnabled. + Valid range for this parameter is -255, 255. If QIndexDelta is out of this range, it will be ignored. + If QIndexDelta is within valid range, but sum of base quantization index and QIndexDelta is out of 0, 255, + QIndexDelta will be clamped. */ + mfxI16 LoopFilterLevelDelta; /*!< Loop filter level delta for the segment. Ignored if MFX_VP9_SEGMENT_FEATURE_LOOP_FILTER is not set in + FeatureEnabled. Valid range for this parameter is -63, 63. If LoopFilterLevelDelta is out of this range, + it will be ignored. If LoopFilterLevelDelta is within valid range, but sum of base loop filter level and + LoopFilterLevelDelta is out of 0, 63, LoopFilterLevelDelta will be clamped. */ + mfxU16 ReferenceFrame; /*!< Reference frame for the segment. See VP9ReferenceFrame enumerator for values for this option. Ignored + if MFX_VP9_SEGMENT_FEATURE_REFERENCE isn't set in FeatureEnabled. */ + mfxU16 reserved12; +} mfxVP9SegmentParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +/*! + In the VP9 encoder it is possible to divide a frame into up to 8 segments and apply particular features (like delta for quantization index or for + loop filter level) on a per-segment basis. "Uncompressed header" of every frame indicates if segmentation is enabled for the current frame, + and (if segmentation enabled) contains full information about features applied to every segment. Every "Mode info block" of a coded + frame has segment_id in the range of 0 to 7. + + To enable Segmentation, the mfxExtVP9Segmentation structure with correct settings should be passed to the encoder. It can be attached to the + mfxVideoParam structure during initialization or the MFXVideoENCODE_Reset call (static configuration). If the mfxExtVP9Segmentation buffer isn't + attached during initialization, segmentation is disabled for static configuration. If the buffer isn't attached for the Reset call, the encoder + continues to use static configuration for segmentation which was the default before this Reset call. If the mfxExtVP9Segmentation buffer with + NumSegments=0 is provided during initialization or Reset call, segmentation becomes disabled for static configuration. + + The buffer can be attached to the mfxEncodeCtrl structure during runtime (dynamic configuration). Dynamic configuration is applied to the + current frame only. After encoding of the current frame, the encoder will switch to the next dynamic configuration or to static configuration if dynamic configuration + is not provided for next frame). + + The SegmentIdBlockSize, NumSegmentIdAlloc, and SegmentId parameters represent a segmentation map. Here, the segmentation map is an array of segment_ids (one + byte per segment_id) for blocks of size NxN in raster scan order. The size NxN is specified by the application and is constant for the whole frame. + If mfxExtVP9Segmentation is attached during initialization and/or during runtime, all three parameters should be set to proper values that do not + conflict with each other and with NumSegments. If any of the parameters are not set or any conflict or error in these parameters is detected by the library, the segmentation + map will be discarded. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VP9_SEGMENTATION. */ + mfxU16 NumSegments; /*!< Number of segments for frame. Value 0 means that segmentation is disabled. Sending 0 for a + particular frame will disable segmentation for this frame only. Sending 0 to the Reset API function will + disable segmentation permanently. Segmentation can be enabled again by a subsequent Reset call. */ + mfxVP9SegmentParam Segment8; /*!< Array of mfxVP9SegmentParam structures containing features and parameters for every segment. + Entries with indexes bigger than NumSegments-1 are ignored. See the mfxVP9SegmentParam structure for + definitions of segment features and their parameters. */ + mfxU16 SegmentIdBlockSize; /*!< Size of block (NxN) for segmentation map. See SegmentIdBlockSize enumerator for values for this + option. An encoded block that is bigger than SegmentIdBlockSize uses segment_id taken from it's + top-left sub-block from the segmentation map. The application can check if a particular block size is + supported by calling Query. */ + mfxU32 NumSegmentIdAlloc; /*!< Size of buffer allocated for segmentation map (in bytes). Application must assure that + NumSegmentIdAlloc is large enough to cover frame resolution with blocks of size SegmentIdBlockSize. + Otherwise the segmentation map will be discarded. */ + union { + mfxU8 *SegmentId; /*!< Pointer to the segmentation map buffer which holds the array of segment_ids in raster scan order. The application + is responsible for allocation and release of this memory. The buffer pointed to by SegmentId, provided during + initialization or Reset call should be considered in use until another SegmentId is provided via Reset + call (if any), or until MFXVideoENCODE_Close is called. The buffer pointed to by SegmentId provided with + mfxEncodeCtrl should be considered in use while the input surface is locked by the library. Every segment_id in the + map should be in the range of 0 to NumSegments-1. If some segment_id is out of valid range, the + segmentation map cannot be applied. If the mfxExtVP9Segmentation buffer is attached to the mfxEncodeCtrl structure in + runtime, SegmentId can be zero. In this case, the segmentation map from static configuration will be used. */ + mfxU64 reserved1; + }; + mfxU16 reserved52; +} mfxExtVP9Segmentation; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Specifies temporal layer. +*/ +typedef struct { + mfxU16 FrameRateScale; /*!< The ratio between the frame rates of the current temporal layer and the base layer. The library treats a particular + temporal layer as "defined" if it has FrameRateScale > 0. If the base layer is defined, it must have FrameRateScale = 1. FrameRateScale of each subsequent layer (if defined) must be a multiple of and greater than the + FrameRateScale value of previous layer. */ + mfxU16 TargetKbps; /*!< Target bitrate for the current temporal layer. Ignored if RateControlMethod is CQP. If RateControlMethod is not CQP, the + application must provide TargetKbps for every defined temporal layer. TargetKbps of each subsequent layer (if defined) + must be greater than the TargetKbps value of the previous layer. */ + mfxU16 reserved14; +} mfxVP9TemporalLayer; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + API allows the encoding of VP9 bitstreams that contain several subset bitstreams that differ in frame rates, also called "temporal layers". + + When decoding, each temporal layer can be extracted from the coded stream and decoded separately. The mfxExtVP9TemporalLayers structure + configures the temporal layers for the VP9 encoder. It can be attached to the mfxVideoParam structure during initialization or the + MFXVideoENCODE_Reset call. If the mfxExtVP9TemporalLayers buffer isn't attached during initialization, temporal scalability is disabled. If the buffer isn't attached for the Reset call, the encoder continues to use the temporal scalability configuration that was defined before the Reset call. + + In the API, temporal layers are ordered by their frame rates in ascending order. Temporal layer 0 (having the lowest frame rate) is called the base layer. + Each subsequent temporal layer includes all previous layers. + + The temporal scalability feature requires a minimum number of allocated reference + frames (controlled by the NumRefFrame parameter). If the NumRefFrame value set by the application isn't enough to build the reference structure for the requested + number of temporal layers, the library corrects the NumRefFrame value. The temporal layer structure is reset (re-started) after key-frames. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VP9_TEMPORAL_LAYERS. */ + /*! + The array of temporal layers. Layer0 specifies the base layer. + + The library reads layers from the array when they are defined (FrameRateScale > 0). + All layers starting from first layer with FrameRateScale = 0 are ignored. The last layer that is not ignored is considered the "highest layer". + + The frame rate of the highest layer is specified in the mfxVideoParam structure. Frame rates of lower layers are calculated using their FrameRateScale. + + TargetKbps of the highest layer should be equal to the TargetKbps value specified in the mfxVideoParam structure. If it is not true, TargetKbps of highest temporal layers has priority. + + If there are no defined layers in the Layer array, the temporal scalability feature is disabled. For example, to disable temporal scalability in runtime, the application should + pass mfxExtVP9TemporalLayers buffer to Reset with all FrameRateScales set to 0. + */ + mfxVP9TemporalLayer Layer8; + mfxU16 reserved60; +} mfxExtVP9TemporalLayers; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Structure attached to the mfxVideoParam structure. Extends the mfxVideoParam structure with VP9-specific parameters. Used by both decoder and encoder. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VP9_PARAM. */ + + mfxU16 FrameWidth; /*!< Width of the coded frame in pixels. */ + mfxU16 FrameHeight; /*!< Height of the coded frame in pixels. */ + + mfxU16 WriteIVFHeaders; /*!< Set this option to ON to make the encoder insert IVF container headers to the output stream. The NumFrame field of the IVF + sequence header will be zero. It is the responsibility of the application to update the NumFrame field with the correct value. See the + CodingOptionValue enumerator for values of this option. */ + + mfxI16 reserved16; + mfxI16 QIndexDeltaLumaDC; /*!< Specifies an offset for a particular quantization parameter. */ + mfxI16 QIndexDeltaChromaAC; /*!< Specifies an offset for a particular quantization parameter. */ + mfxI16 QIndexDeltaChromaDC; /*!< Specifies an offset for a particular quantization parameter. */ + /*! + Number of tile rows. Should be power of two. The maximum number of tile rows is 4, per the VP9 specification. In addition, the maximum supported number + of tile rows may depend on the underlying library implementation. + + Use the Query API function to check if a particular pair of values (NumTileRows, NumTileColumns) + is supported. In VP9, tile rows have dependencies and cannot be encoded or decoded in parallel. Therefore, tile rows are always encoded by the library in + serial mode (one-by-one). + */ + mfxU16 NumTileRows; + /*! + Number of tile columns. Should be power of two. Restricted with maximum and minimum tile width in luma pixels, as defined in the VP9 + specification (4096 and 256 respectively). In addition, the maximum supported number of tile columns may depend on the underlying library + implementation. + + Use the Query API function to check if a particular pair of values (NumTileRows, NumTileColumns) is supported. In VP9, tile columns do not have + dependencies and can be encoded/decoded in parallel. Therefore, tile columns can be encoded by the library in both parallel and serial modes. + + Parallel mode is automatically utilized by the library when NumTileColumns exceeds 1 and does not exceed the number of tile coding engines on the + platform. In other cases, serial mode is used. Parallel mode is capable of encoding more than 1 tile row (within limitations provided by VP9 + specification and particular platform). Serial mode supports only tile grids 1xN and Nx1. + */ + mfxU16 NumTileColumns; + mfxU16 reserved110; +} mfxExtVP9Param; +MFX_PACK_END() + + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used to report encoded unit information. +*/ +typedef struct { + mfxU16 Type; /*!< Codec-dependent coding unit type (NALU type for AVC/HEVC, start_code for MPEG2 etc). */ + mfxU16 reserved1; + mfxU32 Offset; /*!< Offset relative to the associated mfxBitstream::DataOffset. */ + mfxU32 Size; /*!< Unit size, including delimiter. */ + mfxU32 reserved5; +} mfxEncodedUnitInfo; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +/*! + If mfxExtCodingOption3::EncodedUnitsInfo was set to MFX_CODINGOPTION_ON during encoder initialization, the mfxExtEncodedUnitsInfo structure is + attached to the mfxBitstream structure during encoding. It is used to report information about coding units in the resulting bitstream. + + The number of filled items in UnitInfo is min(NumUnitsEncoded, NumUnitsAlloc). + + For counting a minimal amount of encoded units you can use the following algorithm: + @code + nSEI = amountOfApplicationDefinedSEI; + if (CodingOption3.NumSliceIPB != 0 || mfxVideoParam.mfx.NumSlice != 0) + ExpectedAmount = 10 + nSEI + Max(CodingOption3.NumSliceIPB, mfxVideoParam.mfx.NumSlice); + else if (CodingOption2.NumMBPerSlice != 0) + ExpectedAmount = 10 + nSEI + (FrameWidth * FrameHeight) / (256 * CodingOption2.NumMBPerSlice); + else if (CodingOption2.MaxSliceSize != 0) + ExpectedAmount = 10 + nSEI + Round(MaxBitrate / (FrameRate*CodingOption2.MaxSliceSize)); + else + ExpectedAmount = 10 + nSEI; + + if (mfxFrameInfo.PictStruct != MFX_PICSTRUCT_PROGRESSIVE) + ExpectedAmount = ExpectedAmount * 2; + + if (temporalScaleabilityEnabled) + ExpectedAmount = ExpectedAmount * 2; + @endcode + @note Only supported by the AVC encoder. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODED_UNITS_INFO. */ + + union { + mfxEncodedUnitInfo *UnitInfo; /*!< Pointer to an array of mfxEncodedUnitsInfo structures whose size is equal to or greater than NumUnitsAlloc. */ + mfxU64 reserved1; + }; + mfxU16 NumUnitsAlloc; /*!< UnitInfo array size. */ + mfxU16 NumUnitsEncoded; /*!< Output field. Number of coding units to report. If NumUnitsEncoded is greater than NumUnitsAlloc, the UnitInfo + array will contain information only for the first NumUnitsAlloc units. User may consider reallocating the + UnitInfo array to avoid this for subsequent frames. */ + + mfxU16 reserved22; +} mfxExtEncodedUnitsInfo; +MFX_PACK_END() + + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Provides setup for the Motion-Compensated Temporal Filter (MCTF) during the VPP initialization and for control + parameters at runtime. By default, MCTF is off. An application may enable it by adding MFX_EXTBUFF_VPP_MCTF to the mfxExtVPPDoUse buffer or by + attaching mfxExtVppMctf to the mfxVideoParam structure during initialization or reset. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VPP_MCTF. */ + mfxU16 FilterStrength; /*!< Value in range of 0 to 20 (inclusive) to indicate the filter strength of MCTF. + + The strength of the MCTF process controls the degree of possible change of pixel values eligible for MCTF - the greater the strength value, the larger the change. It is a dimensionless quantity - values in the range of 1 to 20 inclusively imply strength; value 0 stands for AUTO mode and is + valid during initialization or reset only + + If an invalid value is given, it is fixed to the default value of 0. + If the field value is in the range of 1 to 20 inclusive, MCTF operates in fixed-strength mode with the given strength of MCTF process. + + At runtime, values of 0 and greater than 20 are ignored. */ + mfxU16 reserved27; +} mfxExtVppMctf; +MFX_PACK_END() + +/*! Describes type of workload passed to MFXQueryAdapters. */ +typedef enum +{ + MFX_COMPONENT_ENCODE = 1, /*!< Encode workload. */ + MFX_COMPONENT_DECODE = 2, /*!< Decode workload. */ + MFX_COMPONENT_VPP = 3 /*!< VPP workload. */ +} mfxComponentType; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Contains workload description, which is accepted by MFXQueryAdapters function. +*/ +typedef struct +{ + mfxComponentType Type; /*!< Type of workload: Encode, Decode, VPP. See mfxComponentType enumerator for values. */ + mfxVideoParam Requirements; /*!< Detailed description of workload. See mfxVideoParam for details. */ + + mfxU16 reserved4; +} mfxComponentInfo; +MFX_PACK_END() + +/* Adapter description */ +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Contains a description of the graphics adapter for the Legacy mode. +*/ +typedef struct +{ + mfxPlatform Platform; /*!< Platform type description. See mfxPlatform for details. */ + mfxU32 Number; /*!< Value which uniquely characterizes media adapter. On Windows* this number can be used for initialization through + DXVA interface (see <a href="https://docs.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgifactory1-enumadapters1">example</a>). */ + + mfxU16 reserved14; +} mfxAdapterInfo; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Contains description of all graphics adapters available on the current system. +*/ +typedef struct +{ + mfxAdapterInfo * Adapters; /*!< Pointer to array of mfxAdapterInfo structs allocated by user. */ + mfxU32 NumAlloc; /*!< Length of Adapters array. */ + mfxU32 NumActual; /*!< Number of Adapters entries filled by MFXQueryAdapters. */ + + mfxU16 reserved4; +} mfxAdaptersInfo; +MFX_PACK_END() + + +/*! The PartialBitstreamOutput enumerator indicates flags of partial bitstream output type. */ +enum { + MFX_PARTIAL_BITSTREAM_NONE = 0, /*!< Do not use partial output */ + MFX_PARTIAL_BITSTREAM_SLICE = 1, /*!< Partial bitstream output will be aligned to slice granularity */ + MFX_PARTIAL_BITSTREAM_BLOCK = 2, /*!< Partial bitstream output will be aligned to user-defined block size granularity */ + MFX_PARTIAL_BITSTREAM_ANY = 3 /*!< Partial bitstream output will be return any coded data available at the end of SyncOperation timeout */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Used by an encoder to output parts of the bitstream as soon as they are ready. The application can attach this extended buffer to the + mfxVideoParam structure at initialization. If this option is turned ON (Granularity != MFX_PARTIAL_BITSTREAM_NONE), then the encoder can output + bitstream by part based on the required granularity. + + This parameter is valid only during initialization and reset. Absence of this buffer means default or previously configured bitstream output + behavior. + + @note Not all codecs and implementations support this feature. Use the Query API function to check if this feature is supported. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_PARTIAL_BITSTREAM_PARAM. */ + mfxU32 BlockSize; /*!< Output block granularity for PartialBitstreamGranularity. Valid only for MFX_PARTIAL_BITSTREAM_BLOCK. */ + mfxU16 Granularity; /*!< Granularity of the partial bitstream: slice/block/any, all types of granularity state in PartialBitstreamOutput enum. */ + mfxU16 reserved8; +} mfxExtPartialBitstreamParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + The mfxExtDeviceAffinityMask structure is used by the application to specify + affinity mask for the device with given device ID. See mfxDeviceDescription + for the device ID definition and sub device indexes. If the implementation + manages CPU threads for some purpose, the user can set the CPU thread affinity + mask by using this structure with DeviceID set to "CPU". +*/ +typedef struct { + /*! Extension buffer header. Header.BufferId must be equal to + MFX_EXTBUFF_DEVICE_AFFINITY_MASK. */ + mfxExtBuffer Header; + /*! Null terminated string with device ID. In case of CPU affinity mask + it must be equal to "CPU". */ + mfxChar DeviceIDMFX_STRFIELD_LEN; + /*! Number of sub devices or threads in case of CPU in the mask. */ + mfxU32 NumSubDevices; + /*! Mask array. Every bit represents sub-device (or thread for CPU). + "1" means execution is allowed. "0" means that execution is prohibited on + this sub-device (or thread). Length of the array is equal to the: + "NumSubDevices / 8" and rounded to the closest (from the right) integer. + Bits order within each entry of the mask array is LSB: bit 0 holds data + for sub device with index 0 and bit 8 for sub device with index 8. + Index of sub device is defined by the mfxDeviceDescription structure. */ + mfxU8 *Mask; + mfxU32 reserved4; /*! Reserved for future use. */ +} mfxExtDeviceAffinityMask; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! The structure is used by AV1 encoder with more parameter control to encode frame. */ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AV1_BITSTREAM_PARAM. */ + + mfxU16 WriteIVFHeaders; /*!< Tri-state option to control IVF headers insertion, default is ON. + Writing IVF headers is enabled in the encoder when mfxExtAV1BitstreamParam is attached and its value is ON or zero. + Writing IVF headers is disabled by default in the encoder when mfxExtAV1BitstreamParam is not attached. */ + + mfxU16 reserved31; +} mfxExtAV1BitstreamParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! The structure is used by AV1 encoder with more parameter control to encode frame. */ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AV1_RESOLUTION_PARAM. */ + + mfxU32 FrameWidth; /*!< Width of the coded frame in pixels, default value is from mfxFrameInfo. */ + mfxU32 FrameHeight; /*!< Height of the coded frame in pixels, default value is from mfxFrameInfo. */ + + mfxU32 reserved6; +} mfxExtAV1ResolutionParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() + /*! The structure is used by AV1 encoder with more parameter control to encode frame. */ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AV1_TILE_PARAM. */ + + mfxU16 NumTileRows; /*!< Number of tile rows, default value is 1. */ + mfxU16 NumTileColumns; /*!< Number of tile columns, default value is 1. */ + mfxU16 NumTileGroups; /*!< Number of tile groups, it will be ingored if the tile groups num is invalid, default value is 1. */ + + mfxU16 reserved5; +} mfxExtAV1TileParam; +MFX_PACK_END() + +/*! + The AV1 SegmentIdBlockSize enumerator indicates the block size represented by each segment_id in segmentation map. + These values are used with the mfxExtAV1Segmentation::SegmentIdBlockSize parameter. +*/ +typedef enum { + MFX_AV1_SEGMENT_ID_BLOCK_SIZE_UNSPECIFIED = 0, /*!< Unspecified block size. */ + MFX_AV1_SEGMENT_ID_BLOCK_SIZE_4x4 = 4, /*!< block size 4x4 */ + MFX_AV1_SEGMENT_ID_BLOCK_SIZE_8x8 = 8, /*!< block size 8x8 */ + MFX_AV1_SEGMENT_ID_BLOCK_SIZE_16x16 = 16, /*!< block size 16x16 */ + MFX_AV1_SEGMENT_ID_BLOCK_SIZE_32x32 = 32, /*!< block size 32x32 */ + MFX_AV1_SEGMENT_ID_BLOCK_SIZE_64x64 = 64, /*!< block size 64x64 */ + MFX_AV1_SEGMENT_ID_BLOCK_SIZE_128x128 = 128 /*!< block size 128x128 */ +} mfxAV1SegmentIdBlockSize; + +/*! + The AV1 SegmentFeature enumerator indicates features enabled for the segment. + These values are used with the mfxAV1SegmentParam::FeatureEnabled parameter. +*/ +enum { + MFX_AV1_SEGMENT_FEATURE_ALT_QINDEX = 0x0001, /*!< use alternate Quantizer. */ + MFX_AV1_SEGMENT_FEATURE_ALT_LF_Y_VERT = 0x0002, /*!< use alternate loop filter value on y plane vertical. */ + MFX_AV1_SEGMENT_FEATURE_ALT_LF_Y_HORZ = 0x0004, /*!< use alternate loop filter value on y plane horizontal. */ + MFX_AV1_SEGMENT_FEATURE_ALT_LF_U = 0x0008, /*!< use alternate loop filter value on u plane. */ + MFX_AV1_SEGMENT_FEATURE_ALT_LF_V = 0x0010, /*!< use alternate loop filter value on v plane. */ + MFX_AV1_SEGMENT_FEATURE_REFERENCE = 0x0020, /*!< use segment reference frame. */ + MFX_AV1_SEGMENT_FEATURE_SKIP = 0x0040, /*!< use segment (0,0) + skip mode. */ + MFX_AV1_SEGMENT_FEATURE_GLOBALMV = 0x0080 /*!< use global motion vector. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! + Contains features and parameters for the segment. +*/ +typedef struct { + mfxU16 FeatureEnabled; /*!< Indicates which features are enabled for the segment. See the AV1 SegmentFeature enumerator for values for + this option. Values from the enumerator can be bit-OR'ed. Support of a particular feature depends on underlying + hardware platform. Application can check which features are supported by calling Query. */ + mfxI16 AltQIndex; /*!< Quantization index delta for the segment. Ignored if MFX_AV1_SEGMENT_FEATURE_ALT_QINDEX isn't set in FeatureEnabled. + Valid range for this parameter is -255, 255. If AltQIndex is out of this range, it will be ignored. If AltQIndex + is within valid range, but sum of base quantization index and AltQIndex is out of 0, 255, AltQIndex will be clamped. */ + mfxU16 reserved30; +} mfxAV1SegmentParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + In the AV1 encoder it is possible to divide a frame into up to 8 segments and apply particular features (like delta for quantization index or for + loop filter level) on a per-segment basis. "Uncompressed header" of every frame indicates if segmentation is enabled for the current frame, + and (if segmentation enabled) contains full information about features applied to every segment. Every "Mode info block" of a coded + frame has segment_id in the range of 0 to 7. + To enable Segmentation, the mfxExtAV1Segmentation structure with correct settings should be passed to the encoder. It can be attached to the + mfxVideoParam structure during initialization or the MFXVideoENCODE_Reset call (static configuration). If the mfxExtAV1Segmentation buffer isn't + attached during initialization, segmentation is disabled for static configuration. If the buffer isn't attached for the Reset call, the encoder + continues to use static configuration for segmentation which was the default before this Reset call. If the mfxExtAV1Segmentation buffer with + NumSegments=0 is provided during initialization or Reset call, segmentation becomes disabled for static configuration. + The buffer can be attached to the mfxEncodeCtrl structure during runtime (dynamic configuration). Dynamic configuration is applied to the + current frame only. After encoding of the current frame, the encoder will switch to the next dynamic configuration or to static configuration if + dynamic configuration is not provided for next frame). + The SegmentIdBlockSize, NumSegmentIdAlloc, and SegmentId parameters represent a segmentation map. Here, the segmentation map is an array of + segment_ids (one byte per segment_id) for blocks of size NxN in raster scan order. The size NxN is specified by the application and is constant + for the whole frame. + If mfxExtAV1Segmentation is attached during initialization and/or during runtime, all three parameters should be set to proper values that do not + conflict with each other and with NumSegments. If any of the parameters are not set or any conflict or error in these parameters is detected by + the library, the segmentation map will be discarded. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AV1_SEGMENTATION. */ + mfxU8 NumSegments; /*!< Number of segments for frame. Value 0 means that segmentation is disabled. Sending 0 for a + particular frame will disable segmentation for this frame only. Sending 0 to the Reset API function will + disable segmentation permanently. Segmentation can be enabled again by a subsequent Reset call. */ + mfxU8 reserved13; + mfxAV1SegmentParam Segment8; /*!< Array of mfxAV1SegmentParam structures containing features and parameters for every segment. + Entries with indexes bigger than NumSegments-1 are ignored. See the mfxAV1SegmentParam structure for + definitions of segment features and their parameters. */ + mfxU16 SegmentIdBlockSize;/*!< Size of block (NxN) for segmentation map. See AV1 SegmentIdBlockSize enumerator for values for this + option. An encoded block that is bigger than AV1 SegmentIdBlockSize uses segment_id taken from it's + top-left sub-block from the segmentation map. The application can check if a particular block size is + supported by calling Query. */ + mfxU16 reserved2; + mfxU32 NumSegmentIdAlloc; /*!< Size of buffer allocated for segmentation map (in bytes). Application must assure that + NumSegmentIdAlloc is large enough to cover frame resolution with blocks of size SegmentIdBlockSize. + Otherwise the segmentation map will be discarded. */ + mfxU8 * SegmentIds; /*!< Pointer to the segmentation map buffer which holds the array of segment_ids in raster scan order. The application + is responsible for allocation and release of this memory. The buffer pointed to by SegmentId, provided during + initialization or Reset call should be considered in use until another SegmentId is provided via Reset + call (if any), or until MFXVideoENCODE_Close is called. The buffer pointed to by SegmentId provided with + mfxEncodeCtrl should be considered in use while the input surface is locked by the library. Every segment_id in the + map should be in the range of 0 to NumSegments-1. If some segment_id is out of valid range, the + segmentation map cannot be applied. If the mfxExtAV1Segmentation buffer is attached to the mfxEncodeCtrl structure in + runtime, SegmentId can be zero. In this case, the segmentation map from static configuration will be used. */ + mfxU16 reserved36; +} mfxExtAV1Segmentation; +MFX_PACK_END() + +/*! The FilmGrainFlags enumerator itemizes flags in AV1 film grain parameters. + The flags are equivalent to respective syntax elements from film_grain_params() section of uncompressed header. */ +enum { + MFX_FILM_GRAIN_NO = 0, /*!< Film grain isn't added to this frame. */ + MFX_FILM_GRAIN_APPLY = (1 << 0), /*!< Film grain is added to this frame. */ + MFX_FILM_GRAIN_UPDATE = (1 << 1), /*!< New set of film grain parameters is sent for this frame. */ + MFX_FILM_GRAIN_CHROMA_SCALING_FROM_LUMA = (1 << 2), /*!< Chroma scaling is inferred from luma scaling. */ + MFX_FILM_GRAIN_OVERLAP = (1 << 3), /*!< Overlap between film grain blocks is applied. */ + MFX_FILM_GRAIN_CLIP_TO_RESTRICTED_RANGE = (1 << 4) /*!< Clipping to the restricted (studio) range is applied after adding the film grain. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Defines film grain point. */ +typedef struct { + mfxU8 Value; /*!< The x coordinate for the i-th point of the piece-wise linear scaling function for luma/Cb/Cr component. */ + mfxU8 Scaling; /*!< The scaling (output) value for the i-th point of the piecewise linear scaling function for luma/Cb/Cr component. */ +} mfxAV1FilmGrainPoint; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! The structure is used by AV-1 decoder to report film grain parameters for decoded frame. */ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_AV1_FILM_GRAIN_PARAM. */ + + mfxU16 FilmGrainFlags; /*!< Bit map with bit-ORed flags from FilmGrainFlags enum. */ + mfxU16 GrainSeed; /*!< Starting value for pseudo-random numbers used during film grain synthesis. */ + + mfxU8 RefIdx; /*!< Indicate which reference frame contains the film grain parameters to be used for this frame. */ + mfxU8 NumYPoints; /*!< The number of points for the piece-wise linear scaling function of the luma component. */ + mfxU8 NumCbPoints; /*!< The number of points for the piece-wise linear scaling function of the Cb component. */ + mfxU8 NumCrPoints; /*!< The number of points for the piece-wise linear scaling function of the Cr component.*/ + + mfxAV1FilmGrainPoint PointY14; /*!< The array of points for luma component. */ + mfxAV1FilmGrainPoint PointCb10; /*!< The array of points for Cb component. */ + mfxAV1FilmGrainPoint PointCr10; /*!< The array of points for Cr component. */ + + mfxU8 GrainScalingMinus8; /*!< The shift - 8 applied to the values of the chroma component. The grain_scaling_minus_8 can take values of 0..3 and + determines the range and quantization step of the standard deviation of film grain.*/ + mfxU8 ArCoeffLag; /*!< The number of auto-regressive coefficients for luma and chroma.*/ + + mfxU8 ArCoeffsYPlus12824; /*!< Auto-regressive coefficients used for the Y plane. */ + mfxU8 ArCoeffsCbPlus12825; /*!< Auto-regressive coefficients used for the Cb plane. */ + mfxU8 ArCoeffsCrPlus12825; /*!< The number of points for the piece-wise linear scaling function of the Cr component.*/ + + mfxU8 ArCoeffShiftMinus6; /*!< The range of the auto-regressive coefficients. + Values of 0, 1, 2, and 3 correspond to the ranges for auto-regressive coefficients of + -2, 2), -1, 1), -0.5, 0.5) and -0.25, 0.25) respectively.*/ + mfxU8 GrainScaleShift; /*!< Downscaling factor of the grain synthesis process for the Gaussian random numbers .*/ + + mfxU8 CbMult; /*!< The multiplier for the Cb component used in derivation of the input index to the Cb component scaling function.*/ + mfxU8 CbLumaMult; /*!< The multiplier for the average luma component used in derivation of the input index to the Cb component scaling function. */ + mfxU16 CbOffset; /*!< The offset used in derivation of the input index to the Cb component scaling function.*/ + + mfxU8 CrMult; /*!< The multiplier for the Cr component used in derivation of the input index to the Cr component scaling function.*/ + mfxU8 CrLumaMult; /*!< The multiplier for the average luma component used in derivation of the input index to the Cr component scaling function.*/ + mfxU16 CrOffset; /*!< The offset used in derivation of the input index to the Cr component scaling function.*/ + + mfxU16 reserved43; +} mfxExtAV1FilmGrainParam; +MFX_PACK_END() + +#define MFX_SURFACEARRAY_VERSION MFX_STRUCT_VERSION(1, 0) + + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! The structure is reference counted object to return array of surfaces allocated and processed by the library. */ +typedef struct mfxSurfaceArray +{ + mfxHDL Context; /*!< The context of the memory interface. User should not touch (change, set, null) this pointer. */ + mfxStructVersion Version; /*!< The version of the structure. */ + mfxU16 reserved3; + /*! @brief + Increments the internal reference counter of the surface. The surface is not destroyed until the surface is released using the mfxSurfaceArray::Release function. + mfxSurfaceArray::AddRef should be used each time a new link to the surface is created (for example, copy structure) for proper surface management. + + @paramin surface Valid mfxSurfaceArray. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If surface is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxSurfaceArray->Context is invalid (for example NULL). \n + MFX_ERR_UNKNOWN Any internal error. + + */ + mfxStatus (MFX_CDECL *AddRef)(struct mfxSurfaceArray* surface_array); + /*! @brief + Decrements the internal reference counter of the surface. mfxSurfaceArray::Release should be called after + using the mfxSurfaceArray::AddRef function to add a surface or when allocation logic requires it. + + @paramin surface_array Valid mfxSurfaceArray. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If surface is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxSurfaceArray->Context is invalid (for example NULL). \n + MFX_ERR_UNDEFINED_BEHAVIOR If Reference Counter of surface is zero before call. \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *Release)(struct mfxSurfaceArray* surface_array); + + /*! @brief + Returns current reference counter of mfxSurfaceArray structure. + + @paramin surface Valid surface_array. + @paramout counter Sets counter to the current reference counter value. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If surface or counter is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxSurfaceArray->Context is invalid (for example NULL). \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *GetRefCounter)(struct mfxSurfaceArray* surface_array, mfxU32* counter); + + mfxFrameSurface1** Surfaces; /*!< The array of pointers to mfxFrameSurface1. mfxFrameSurface1 surfaces are allocated by the same + agent who allocates mfxSurfaceArray. */ + mfxU32 NumSurfaces; /*!<The size of array of pointers to mfxFrameSurface1. */ + mfxU32 reserved1; +} mfxSurfaceArray; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! The structure is used for VPP channels initializtion in Decode_VPP component. */ +typedef struct { + mfxFrameInfo VPP; /*!< The configuration parameters of VPP filters per each channel. */ + mfxU16 Protected; /*!< Specifies the content protection mechanism. */ + mfxU16 IOPattern; /*!< Output memory access types for SDK functions. */ + mfxExtBuffer** ExtParam; /*!< Points to an array of pointers to the extra configuration structures; see the ExtendedBufferID enumerator for a list of extended configurations. */ + mfxU16 NumExtParam; /*!< The number of extra configuration structures attached to the structure. */ + mfxU16 reserved17; +} mfxVideoChannelParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! The structure describes rectangle coordinates wat can bse used for ROI or for Cropping. */ + typedef struct { + mfxU16 Left; /*!< X coordinate of region of top-left corner of rectangle. */ + mfxU16 Top; /*!< Y coordinate of region of top-left corner of rectangle. */ + mfxU16 Right; /*!< X coordinate of region of bottom-right corner of rectangle. */ + mfxU16 Bottom; /*!< Y coordinate of region of bottom-right corner of rectangle. */ + } mfxRect; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! The structure contains crop parameters which applied by Decode_VPP component to input surfaces before video processing operation. + It is used for letterboxing operations. +*/ +typedef struct { + mfxExtBuffer Header; /*! Extension buffer header. BufferId must be equal to MFX_EXTBUFF_CROPS. */ + mfxRect Crops; /*!< Crops parameters for letterboxing operations. */ + mfxU32 reserved4; +}mfxExtInCrops; +MFX_PACK_END() + +/*! The mfxHyperMode enumerator describes HyperMode implementation behavior. */ +typedef enum { + MFX_HYPERMODE_OFF = 0x0, /*!< Don't use HyperMode implementation. */ + MFX_HYPERMODE_ON = 0x1, /*!< Enable HyperMode implementation and return error if some issue on initialization. */ + MFX_HYPERMODE_ADAPTIVE = 0x2, /*!< Enable HyperMode implementation and switch to single fallback if some issue on initialization. */ +} mfxHyperMode; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! The structure is used for HyperMode initialization. */ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. BufferId must be equal to MFX_EXTBUFF_HYPER_MODE_PARAM. */ + mfxHyperMode Mode; /*!< HyperMode implementation behavior. */ + mfxU16 reserved19; +} mfxExtHyperModeParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! The structure is used for universal temporal layer description. */ +typedef struct { + mfxU16 FrameRateScale; /*!< The ratio between the frame rates of the current temporal layer and the base layer. The library treats a particular + temporal layer as "defined" if it has FrameRateScale > 0. If the base layer is defined, it must have FrameRateScale = 1. + FrameRateScale of each subsequent layer (if defined) must be a multiple of and greater than the + FrameRateScale value of previous layer. */ + mfxU16 reserved3; /*!< Reserved for future use. */ + + union { + /*!< Type of bitrate controls is currently the same across all temporal layers and inherits from common parameters. */ + struct { + mfxU32 InitialDelayInKB;/*!< Initial size of the Video Buffering Verifier (VBV) buffer for the current temporal layer. + @note In this context, KB is 1000 bytes and Kbps is 1000 bps. */ + mfxU32 BufferSizeInKB; /*!< Represents the maximum possible size of any compressed frames for the current temporal layer. */ + mfxU32 TargetKbps; /*!< Target bitrate for the current temporal layer. If RateControlMethod is not CQP, the + application can provide TargetKbps for every defined temporal layer. If TargetKbps per temporal layer is not set then + encoder doesn't apply any special bitrate limitations for the layer. */ + mfxU32 MaxKbps; /*!< The maximum bitrate at which the encoded data enters the Video Buffering Verifier (VBV) buffer for the current temporal layer. */ + + mfxU32 reserved116; /*!< Reserved for future use. */ + + }; + struct { + mfxI32 QPI; /*!< Quantization Parameter (QP) for I-frames for constant QP mode (CQP) for the current temporal layer. Zero QP is not valid and means that the default value is assigned by the library. + Non-zero QPI might be clipped to supported QPI range. + @note Default QPI value is implementation dependent and subject to change without additional notice in this document. */ + mfxI32 QPP; /*!< Quantization Parameter (QP) for P-frames for constant QP mode (CQP) for the current temporal layer. Zero QP is not valid and means that the default value is assigned by the library. + Non-zero QPP might be clipped to supported QPI range. + @note Default QPP value is implementation dependent and subject to change without additional notice in this document. */ + mfxI32 QPB; /*!< Quantization Parameter (QP) for B-frames for constant QP mode (CQP) for the current temporal layer. Zero QP is not valid and means that the default value is assigned by the library. + Non-zero QPI might be clipped to supported QPB range. + @note Default QPB value is implementation dependent and subject to change without additional notice in this document. */ + }; + }; + mfxU16 reserved24; /*!< Reserved for future use. */ + +} mfxTemporalLayer; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! The structure is used for universal temporal layers description. */ +typedef struct { + mfxExtBuffer Header; /*! Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_UNIVERSAL_TEMPORAL_LAYERS. */ + mfxU16 NumLayers; /*!< The number of temporal layers. */ + mfxU16 BaseLayerPID; /*!< The priority ID of the base layer. The encoder increases the ID for each temporal layer and writes to the prefix NAL unit for AVC and HEVC. */ + mfxU16 reserved2; /*!< Reserved for future use. */ + mfxTemporalLayer *Layers; /*!< The array of temporal layers. */ + + mfxU16 reserved18; /*!< Reserved for future use. */ +} mfxExtTemporalLayers; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxsurfacepool.h
Added
@@ -0,0 +1,183 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFX_SURFACE_POOL_H__ +#define __MFX_SURFACE_POOL_H__ + +#include "mfxstructures.h" + +/*! GUID to obtain mfxSurfacePoolInterface. */ +static const mfxGUID MFX_GUID_SURFACE_POOL = {{0x35, 0x24, 0xf3, 0xda, 0x96, 0x4e, 0x47, 0xf1, 0xaf, 0xb4, 0xec, 0xb1, 0x15, 0x08, 0x06, 0xb1}}; + +//*! Specifies type of pool for VPP component. */ +typedef enum { + MFX_VPP_POOL_IN = 0, /*!< Input pool. */ + MFX_VPP_POOL_OUT = 1 /*!< Output pool. */ +} mfxVPPPoolType; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! The extension buffer specifies surface pool management policy. + Absence of the attached buffer means MFX_ALLOCATION_UNLIMITED policy: + each call of GetSurfaceForXXX leads to surface allocation. +*/ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ALLOCATION_HINTS. */ + mfxPoolAllocationPolicy AllocationPolicy; /*!< Allocation policy. */ + /*! How many surfaces to allocate during Init. + It's applicable for any polices set by mfxPoolAllocationPolicy::AllocationPolicy + even if the requested number exceeds recommended size of the pool. */ + mfxU32 NumberToPreAllocate; + /*! DeltaToAllocateOnTheFly specifies how many surfaces are allocated + in addition to NumberToPreAllocate in MFX_ALLOCATION_LIMITED mode. + Maximum number of allocated frames will be + NumberToPreAllocate + DeltaToAllocateOnTheFly. + */ + mfxU32 DeltaToAllocateOnTheFly; + union { + mfxVPPPoolType VPPPoolType; /*!< Defines what VPP pool is targeted - input or ouput. Ignored for other components. */ + mfxU32 reserved; + }; + mfxU32 Wait; /*!< Time in milliseconds for GetSurfaceForXXX() and DecodeFrameAsync functions to wait until surface will be available. */ + mfxU32 reserved14; /*!< Reserved for future use */ +} mfxExtAllocationHints; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! Specifies the surface pool interface. */ +typedef struct mfxSurfacePoolInterface +{ + mfxHDL Context; /*!< The context of the surface pool interface. User should not touch (change, set, null) this pointer. */ + + /*! @brief + Increments the internal reference counter of the mfxSurfacePoolInterface. The mfxSurfacePoolInterface is not destroyed until the + mfxSurfacePoolInterface is destroyed with mfxSurfacePoolInterface::Release function. mfxSurfacePoolInterface::AddRef should be used each time a new link to the + mfxSurfacePoolInterface is created for proper management. + + @paramin pool Valid pool. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If pool is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNKNOWN Any internal error. + + */ + mfxStatus (MFX_CDECL *AddRef)(struct mfxSurfacePoolInterface *pool); + /*! @brief + Decrements the internal reference counter of the mfxSurfacePoolInterface. mfxSurfacePoolInterface::Release + should be called after using the mfxSurfacePoolInterface::AddRef function to add a mfxSurfacePoolInterface or when allocation logic requires it. + For example, call mfxSurfacePoolInterface::Release to release a mfxSurfacePoolInterface obtained with + the mfxFrameSurfaceInterface::QueryInterface function. + + @paramin pool Valid pool. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If pool is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNDEFINED_BEHAVIOR If Reference Counter of mfxSurfacePoolInterface is zero before call. \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *Release)(struct mfxSurfacePoolInterface *pool); + /*! @brief + Returns current reference counter of mfxSurfacePoolInterface structure. + + @paramin pool Valid pool. + @paramout counter Sets counter to the current reference counter value. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If pool or counter is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *GetRefCounter)(struct mfxSurfacePoolInterface *pool, mfxU32* counter); + /*! @brief + The function should be called by oneVPL components or application to specify how many surfaces it will use concurrently. + Internally, oneVPL allocates surfaces in the shared pool according to the component's policy set by mfxPoolAllocationPolicy. + The exact moment of surfaces allocation is defined by the component and generally independent from that call. + + @paramin pool Valid pool. + @paramin num_surfaces The number of surfaces required by the component. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If pool is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM If pool has MFX_ALLOCATION_UNLIMITED or MFX_ALLOCATION_LIMITED policy. \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *SetNumSurfaces)(struct mfxSurfacePoolInterface *pool, mfxU32 num_surfaces); + + /*! @brief + The function should be called by oneVPL components when component is closed or reset and doesn't need to use pool more. It helps + to manage memory accordingly and release redundant memory. Important to specify the same number of surfaces which is requested + during SetNumSurfaces call, otherwise it may lead to the pipeline stalls. + + @paramin pool Valid pool. + @paramin num_surfaces The number of surfaces used by the component. + + @return + MFX_ERR_NONE If no error. \n + + MFX_WRN_OUT_OF_RANGE If num_surfaces doesn't equal to num_surfaces requested during SetNumSurfaces call. \n + + MFX_ERR_NULL_PTR If pool is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM If pool has MFX_ALLOCATION_UNLIMITED or MFX_ALLOCATION_LIMITED policy. \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *RevokeSurfaces)(struct mfxSurfacePoolInterface *pool, mfxU32 num_surfaces); + /*! @brief + Returns current allocation policy. + + @paramin pool Valid pool. + @paramout policy Sets policy to the current allocation policy value. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If pool or policy is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *GetAllocationPolicy)(struct mfxSurfacePoolInterface *pool, mfxPoolAllocationPolicy *policy); + + /*! @brief + Returns maximum pool size. In case of mfxPoolAllocationPolicy::MFX_ALLOCATION_UNLIMITED policy 0xFFFFFFFF will be returned. + + @paramin pool Valid pool. + @paramout size Sets size to the maximum pool size value. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If pool or size is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *GetMaximumPoolSize)(struct mfxSurfacePoolInterface *pool, mfxU32 *size); + + /*! @brief + Returns current pool size. + + @paramin pool Valid pool. + @paramout size Sets size to the current pool size value. + + @return + MFX_ERR_NONE If no error. \n + MFX_ERR_NULL_PTR If pool or size is NULL. \n + MFX_ERR_INVALID_HANDLE If mfxSurfacePoolInterface->Context is invalid (for example NULL). \n + MFX_ERR_UNKNOWN Any internal error. + */ + mfxStatus (MFX_CDECL *GetCurrentPoolSize)(struct mfxSurfacePoolInterface *pool, mfxU32 *size); + + mfxHDL reserved4; /*!< Reserved for future use. */ + +} mfxSurfacePoolInterface; +MFX_PACK_END() + + +#endif /* __MFX_SURFACE_POOL_H__ */ +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxvideo++.h
Added
@@ -0,0 +1,397 @@ +/*########################################################################### + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ###########################################################################*/ + +#ifndef __MFXVIDEOPLUSPLUS_H +#define __MFXVIDEOPLUSPLUS_H + +#include "mfxvideo.h" + +class MFXVideoSessionBase { +public: + virtual ~MFXVideoSessionBase() {} + + virtual mfxStatus Init(mfxIMPL impl, mfxVersion* ver) = 0; + virtual mfxStatus InitEx(mfxInitParam par) = 0; + virtual mfxStatus Close(void) = 0; + + virtual mfxStatus QueryIMPL(mfxIMPL* impl) = 0; + virtual mfxStatus QueryVersion(mfxVersion* version) = 0; + + virtual mfxStatus JoinSession(mfxSession child_session) = 0; + virtual mfxStatus DisjoinSession() = 0; + virtual mfxStatus CloneSession(mfxSession* clone) = 0; + virtual mfxStatus SetPriority(mfxPriority priority) = 0; + virtual mfxStatus GetPriority(mfxPriority* priority) = 0; + + virtual mfxStatus SetFrameAllocator(mfxFrameAllocator* allocator) = 0; + virtual mfxStatus SetHandle(mfxHandleType type, mfxHDL hdl) = 0; + virtual mfxStatus GetHandle(mfxHandleType type, mfxHDL* hdl) = 0; + virtual mfxStatus QueryPlatform(mfxPlatform* platform) = 0; + + virtual mfxStatus SyncOperation(mfxSyncPoint syncp, mfxU32 wait) = 0; + + virtual mfxStatus GetSurfaceForEncode(mfxFrameSurface1** output_surf) = 0; + virtual mfxStatus GetSurfaceForDecode(mfxFrameSurface1** output_surf) = 0; + virtual mfxStatus GetSurfaceForVPP(mfxFrameSurface1** output_surf) = 0; + virtual mfxStatus GetSurfaceForVPPOut(mfxFrameSurface1** output_surf) = 0; + + virtual operator mfxSession(void) = 0; +}; + +class MFXVideoENCODEBase { +public: + virtual ~MFXVideoENCODEBase() {} + + virtual mfxStatus Query(mfxVideoParam* in, mfxVideoParam* out) = 0; + virtual mfxStatus QueryIOSurf(mfxVideoParam* par, mfxFrameAllocRequest* request) = 0; + virtual mfxStatus Init(mfxVideoParam* par) = 0; + virtual mfxStatus Reset(mfxVideoParam* par) = 0; + virtual mfxStatus Close(void) = 0; + + virtual mfxStatus GetVideoParam(mfxVideoParam* par) = 0; + virtual mfxStatus GetEncodeStat(mfxEncodeStat* stat) = 0; + + virtual mfxStatus EncodeFrameAsync(mfxEncodeCtrl* ctrl, + mfxFrameSurface1* surface, + mfxBitstream* bs, + mfxSyncPoint* syncp) = 0; + + virtual mfxStatus GetSurface(mfxFrameSurface1** output_surf) = 0; +}; + +class MFXVideoDECODEBase { +public: + virtual ~MFXVideoDECODEBase() {} + + virtual mfxStatus Query(mfxVideoParam* in, mfxVideoParam* out) = 0; + virtual mfxStatus DecodeHeader(mfxBitstream* bs, mfxVideoParam* par) = 0; + virtual mfxStatus QueryIOSurf(mfxVideoParam* par, mfxFrameAllocRequest* request) = 0; + virtual mfxStatus Init(mfxVideoParam* par) = 0; + virtual mfxStatus Reset(mfxVideoParam* par) = 0; + virtual mfxStatus Close(void) = 0; + + virtual mfxStatus GetVideoParam(mfxVideoParam* par) = 0; + + virtual mfxStatus GetDecodeStat(mfxDecodeStat* stat) = 0; + virtual mfxStatus GetPayload(mfxU64* ts, mfxPayload* payload) = 0; + virtual mfxStatus SetSkipMode(mfxSkipMode mode) = 0; + virtual mfxStatus DecodeFrameAsync(mfxBitstream* bs, + mfxFrameSurface1* surface_work, + mfxFrameSurface1** surface_out, + mfxSyncPoint* syncp) = 0; + + virtual mfxStatus GetSurface(mfxFrameSurface1** output_surf) = 0; +}; + +class MFXVideoVPPBase { +public: + virtual ~MFXVideoVPPBase() {} + + virtual mfxStatus Query(mfxVideoParam* in, mfxVideoParam* out) = 0; + virtual mfxStatus QueryIOSurf(mfxVideoParam* par, mfxFrameAllocRequest request2) = 0; + virtual mfxStatus Init(mfxVideoParam* par) = 0; + virtual mfxStatus Reset(mfxVideoParam* par) = 0; + virtual mfxStatus Close(void) = 0; + + virtual mfxStatus GetVideoParam(mfxVideoParam* par) = 0; + virtual mfxStatus GetVPPStat(mfxVPPStat* stat) = 0; + virtual mfxStatus RunFrameVPPAsync(mfxFrameSurface1* in, + mfxFrameSurface1* out, + mfxExtVppAuxData* aux, + mfxSyncPoint* syncp) = 0; + + virtual mfxStatus GetSurfaceIn(mfxFrameSurface1** output_surf) = 0; + virtual mfxStatus GetSurfaceOut(mfxFrameSurface1** output_surf) = 0; + virtual mfxStatus ProcessFrameAsync(mfxFrameSurface1* in, mfxFrameSurface1** out) = 0; +}; + +class MFXVideoSession : public MFXVideoSessionBase { +public: + MFXVideoSession(void) { + m_session = (mfxSession)0; + } + virtual ~MFXVideoSession(void) { + Close(); + } + + virtual mfxStatus Init(mfxIMPL impl, mfxVersion *ver) override { + return MFXInit(impl, ver, &m_session); + } + virtual mfxStatus InitEx(mfxInitParam par) override { + return MFXInitEx(par, &m_session); + } + virtual mfxStatus Close(void) override { + mfxStatus mfxRes; + mfxRes = MFXClose(m_session); + m_session = (mfxSession)0; + return mfxRes; + } + + virtual mfxStatus QueryIMPL(mfxIMPL *impl) override { + return MFXQueryIMPL(m_session, impl); + } + virtual mfxStatus QueryVersion(mfxVersion *version) override { + return MFXQueryVersion(m_session, version); + } + + virtual mfxStatus JoinSession(mfxSession child_session) override { + return MFXJoinSession(m_session, child_session); + } + virtual mfxStatus DisjoinSession() override { + return MFXDisjoinSession(m_session); + } + virtual mfxStatus CloneSession(mfxSession *clone) override { + return MFXCloneSession(m_session, clone); + } + virtual mfxStatus SetPriority(mfxPriority priority) override { + return MFXSetPriority(m_session, priority); + } + virtual mfxStatus GetPriority(mfxPriority *priority) override { + return MFXGetPriority(m_session, priority); + } + + virtual mfxStatus SetFrameAllocator(mfxFrameAllocator *allocator) override { + return MFXVideoCORE_SetFrameAllocator(m_session, allocator); + } + virtual mfxStatus SetHandle(mfxHandleType type, mfxHDL hdl) override { + return MFXVideoCORE_SetHandle(m_session, type, hdl); + } + virtual mfxStatus GetHandle(mfxHandleType type, mfxHDL *hdl) override { + return MFXVideoCORE_GetHandle(m_session, type, hdl); + } + virtual mfxStatus QueryPlatform(mfxPlatform *platform) override { + return MFXVideoCORE_QueryPlatform(m_session, platform); + } + + virtual mfxStatus SyncOperation(mfxSyncPoint syncp, mfxU32 wait) override { + return MFXVideoCORE_SyncOperation(m_session, syncp, wait); + } + + virtual mfxStatus GetSurfaceForEncode(mfxFrameSurface1** output_surf) override { + return MFXMemory_GetSurfaceForEncode(m_session, output_surf); + } + virtual mfxStatus GetSurfaceForDecode(mfxFrameSurface1** output_surf) override { + return MFXMemory_GetSurfaceForDecode(m_session, output_surf); + } + virtual mfxStatus GetSurfaceForVPP (mfxFrameSurface1** output_surf) override { + return MFXMemory_GetSurfaceForVPP (m_session, output_surf); + } + virtual mfxStatus GetSurfaceForVPPOut(mfxFrameSurface1** output_surf) override { + return MFXMemory_GetSurfaceForVPPOut(m_session, output_surf); + } + + virtual operator mfxSession(void) override { + return m_session; + } + +protected: + mfxSession m_session; // (mfxSession) handle to the owning session +private: + MFXVideoSession(const MFXVideoSession &); + void operator=(MFXVideoSession &); +}; + +class MFXVideoENCODE : public MFXVideoENCODEBase { +public: + explicit MFXVideoENCODE(mfxSession session) { + m_session = session; + } + virtual ~MFXVideoENCODE(void) { + Close(); + } + + virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) override { + return MFXVideoENCODE_Query(m_session, in, out); + } + virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) override { + return MFXVideoENCODE_QueryIOSurf(m_session, par, request); + } + virtual mfxStatus Init(mfxVideoParam *par) override { + return MFXVideoENCODE_Init(m_session, par); + } + virtual mfxStatus Reset(mfxVideoParam *par) override { + return MFXVideoENCODE_Reset(m_session, par); + } + virtual mfxStatus Close(void) override { + return MFXVideoENCODE_Close(m_session); + } + + virtual mfxStatus GetVideoParam(mfxVideoParam *par) override { + return MFXVideoENCODE_GetVideoParam(m_session, par); + } + virtual mfxStatus GetEncodeStat(mfxEncodeStat *stat) override { + return MFXVideoENCODE_GetEncodeStat(m_session, stat); + } + + virtual mfxStatus EncodeFrameAsync(mfxEncodeCtrl *ctrl, + mfxFrameSurface1 *surface, + mfxBitstream *bs, + mfxSyncPoint *syncp) override { + return MFXVideoENCODE_EncodeFrameAsync(m_session, ctrl, surface, bs, syncp); + } + + virtual mfxStatus GetSurface(mfxFrameSurface1** output_surf) override { + return MFXMemory_GetSurfaceForEncode(m_session, output_surf); + } + +protected: + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoDECODE : public MFXVideoDECODEBase { +public: + explicit MFXVideoDECODE(mfxSession session) { + m_session = session; + } + virtual ~MFXVideoDECODE(void) { + Close(); + } + + virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) override { + return MFXVideoDECODE_Query(m_session, in, out); + } + virtual mfxStatus DecodeHeader(mfxBitstream *bs, mfxVideoParam *par) override { + return MFXVideoDECODE_DecodeHeader(m_session, bs, par); + } + virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) override { + return MFXVideoDECODE_QueryIOSurf(m_session, par, request); + } + virtual mfxStatus Init(mfxVideoParam *par) override { + return MFXVideoDECODE_Init(m_session, par); + } + virtual mfxStatus Reset(mfxVideoParam *par) override { + return MFXVideoDECODE_Reset(m_session, par); + } + virtual mfxStatus Close(void) override { + return MFXVideoDECODE_Close(m_session); + } + + virtual mfxStatus GetVideoParam(mfxVideoParam *par) override { + return MFXVideoDECODE_GetVideoParam(m_session, par); + } + + virtual mfxStatus GetDecodeStat(mfxDecodeStat *stat) override { + return MFXVideoDECODE_GetDecodeStat(m_session, stat); + } + virtual mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) override { + return MFXVideoDECODE_GetPayload(m_session, ts, payload); + } + virtual mfxStatus SetSkipMode(mfxSkipMode mode) override { + return MFXVideoDECODE_SetSkipMode(m_session, mode); + } + virtual mfxStatus DecodeFrameAsync(mfxBitstream *bs, + mfxFrameSurface1 *surface_work, + mfxFrameSurface1 **surface_out, + mfxSyncPoint *syncp) override { + return MFXVideoDECODE_DecodeFrameAsync(m_session, bs, surface_work, surface_out, syncp); + } + + virtual mfxStatus GetSurface(mfxFrameSurface1** output_surf) override { + return MFXMemory_GetSurfaceForDecode(m_session, output_surf); + } + +protected: + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoVPP : public MFXVideoVPPBase { +public: + explicit MFXVideoVPP(mfxSession session) { + m_session = session; + } + virtual ~MFXVideoVPP(void) { + Close(); + } + + virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) override { + return MFXVideoVPP_Query(m_session, in, out); + } + virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest request2) override { + return MFXVideoVPP_QueryIOSurf(m_session, par, request); + } + virtual mfxStatus Init(mfxVideoParam *par) override { + return MFXVideoVPP_Init(m_session, par); + } + virtual mfxStatus Reset(mfxVideoParam *par) override { + return MFXVideoVPP_Reset(m_session, par); + } + virtual mfxStatus Close(void) override { + return MFXVideoVPP_Close(m_session); + } + + virtual mfxStatus GetVideoParam(mfxVideoParam *par) override { + return MFXVideoVPP_GetVideoParam(m_session, par); + } + virtual mfxStatus GetVPPStat(mfxVPPStat *stat) override { + return MFXVideoVPP_GetVPPStat(m_session, stat); + } + virtual mfxStatus RunFrameVPPAsync(mfxFrameSurface1 *in, + mfxFrameSurface1 *out, + mfxExtVppAuxData *aux, + mfxSyncPoint *syncp) override { + return MFXVideoVPP_RunFrameVPPAsync(m_session, in, out, aux, syncp); + } + + virtual mfxStatus GetSurfaceIn(mfxFrameSurface1** output_surf) override { + return MFXMemory_GetSurfaceForVPP(m_session, output_surf); + } + virtual mfxStatus GetSurfaceOut(mfxFrameSurface1** output_surf) override { + return MFXMemory_GetSurfaceForVPPOut(m_session, output_surf); + } + + virtual mfxStatus ProcessFrameAsync(mfxFrameSurface1 *in, mfxFrameSurface1 **out) override { + return MFXVideoVPP_ProcessFrameAsync(m_session, in, out); + } + +protected: + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoDECODE_VPP +{ +public: + explicit MFXVideoDECODE_VPP(mfxSession session) { m_session = session; } + virtual ~MFXVideoDECODE_VPP(void) { + Close(); + } + + virtual mfxStatus Init(mfxVideoParam* decode_par, mfxVideoChannelParam** vpp_par_array, mfxU32 num_channel_par) { + return MFXVideoDECODE_VPP_Init(m_session, decode_par, vpp_par_array, num_channel_par); + } + virtual mfxStatus Reset(mfxVideoParam* decode_par, mfxVideoChannelParam** vpp_par_array, mfxU32 num_channel_par) { + return MFXVideoDECODE_VPP_Reset(m_session, decode_par, vpp_par_array, num_channel_par); + } + virtual mfxStatus GetChannelParam(mfxVideoChannelParam *par, mfxU32 channel_id) { + return MFXVideoDECODE_VPP_GetChannelParam(m_session, par, channel_id); + } + virtual mfxStatus DecodeFrameAsync(mfxBitstream *bs, mfxU32* skip_channels, mfxU32 num_skip_channels, mfxSurfaceArray **surf_array_out) { + return MFXVideoDECODE_VPP_DecodeFrameAsync(m_session, bs, skip_channels, num_skip_channels, surf_array_out); + } + + virtual mfxStatus DecodeHeader(mfxBitstream *bs, mfxVideoParam *par) { + return MFXVideoDECODE_VPP_DecodeHeader(m_session, bs, par); + } + virtual mfxStatus Close(void) { + return MFXVideoDECODE_VPP_Close(m_session); + } + virtual mfxStatus GetVideoParam(mfxVideoParam *par) { + return MFXVideoDECODE_VPP_GetVideoParam(m_session, par); + } + virtual mfxStatus GetDecodeStat(mfxDecodeStat *stat) { + return MFXVideoDECODE_VPP_GetDecodeStat(m_session, stat); + } + virtual mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) { + return MFXVideoDECODE_VPP_GetPayload(m_session, ts, payload); + } + virtual mfxStatus SetSkipMode(mfxSkipMode mode) { + return MFXVideoDECODE_VPP_SetSkipMode(m_session, mode); + } + +protected: + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +#endif //__MFXVIDEOPLUSPLUS_H
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxvideo.h
Added
@@ -0,0 +1,1134 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFXVIDEO_H__ +#define __MFXVIDEO_H__ +#include "mfxsession.h" +#include "mfxstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/*! + Describes the API callback functions Alloc, Lock, Unlock, GetHDL, and Free that the + implementation might use for allocating internal frames. Applications that operate on OS-specific video surfaces must + implement these API callback functions. + + Using the default allocator implies that frame data passes in or out of functions through pointers, + as opposed to using memory IDs. + + Behavior is undefined when using an incompletely defined external allocator. + \verbatim embed:rst + See the :ref:`Memory Allocation and External Allocators section <mem-alloc-ext-alloc>` for additional information. + \endverbatim +*/ +typedef struct { + mfxU32 reserved4; + mfxHDL pthis; /*!< Pointer to the allocator object. */ + + /*! + @brief Allocates surface frames. For decoders, MFXVideoDECODE_Init calls Alloc only once. That call + includes all frame allocation requests. For encoders, MFXVideoENCODE_Init calls Alloc twice: once for the + input surfaces and again for the internal reconstructed surfaces. + + If two library components must share DirectX* surfaces, this function should pass the pre-allocated surface + chain to the library instead of allocating new DirectX surfaces. + \verbatim embed:rst + See the :ref:`Surface Pool Allocation section <surface_pool_alloc>` for additional information. + \endverbatim + + @paramin pthis Pointer to the allocator object. + @paramin request Pointer to the mfxFrameAllocRequest structure that specifies the type and number of required frames. + @paramout response Pointer to the mfxFrameAllocResponse structure that retrieves frames actually allocated. + @return + MFX_ERR_NONE The function successfully allocated the memory block. \n + MFX_ERR_MEMORY_ALLOC The function failed to allocate the video frames. \n + MFX_ERR_UNSUPPORTED The function does not support allocating the specified type of memory. + */ + mfxStatus (MFX_CDECL *Alloc) (mfxHDL pthis, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response); + + /*! + @brief Locks a frame and returns its pointer. + @paramin pthis Pointer to the allocator object. + @paramin mid Memory block ID. + @paramout ptr Pointer to the returned frame structure. + @return + MFX_ERR_NONE The function successfully locked the memory block. \n + MFX_ERR_LOCK_MEMORY This function failed to lock the frame. + */ + mfxStatus (MFX_CDECL *Lock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); + + /*! + @brief Unlocks a frame and invalidates the specified frame structure. + @paramin pthis Pointer to the allocator object. + @paramin mid Memory block ID. + @paramout ptr Pointer to the frame structure. This pointer can be NULL. + @return + MFX_ERR_NONE The function successfully locked the memory block. + */ + mfxStatus (MFX_CDECL *Unlock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); + + /*! + @brief Returns the OS-specific handle associated with a video frame. If the handle is a COM interface, + the reference counter must increase. The library will release the interface afterward. + @paramin pthis Pointer to the allocator object. + @paramin mid Memory block ID. + @paramout handle Pointer to the returned OS-specific handle. + @return + MFX_ERR_NONE The function successfully returned the OS-specific handle. \n + MFX_ERR_UNSUPPORTED The function does not support obtaining OS-specific handle.. + */ + mfxStatus (MFX_CDECL *GetHDL) (mfxHDL pthis, mfxMemId mid, mfxHDL *handle); + + /*! + @brief De-allocates all allocated frames. + @paramin pthis Pointer to the allocator object. + @paramin response Pointer to the mfxFrameAllocResponse structure returned by the Alloc function. + @return + MFX_ERR_NONE The function successfully de-allocated the memory block. + */ + mfxStatus (MFX_CDECL *Free) (mfxHDL pthis, mfxFrameAllocResponse *response); +} mfxFrameAllocator; +MFX_PACK_END() + +/*! + @brief + Sets the external allocator callback structure for frame allocation. + + If the allocator argument is NULL, the library uses the + default allocator, which allocates frames from system memory or hardware devices. The behavior of the API is undefined if it uses this + function while the previous allocator is in use. A general guideline is to set the allocator immediately after initializing the session. + + @paramin session Session handle. + @paramin allocator Pointer to the mfxFrameAllocator structure + + @return + MFX_ERR_NONE The function completed successfully. \n + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoCORE_SetFrameAllocator(mfxSession session, mfxFrameAllocator *allocator); + +/*! + @brief + Sets any essential system handle that the library might use. + + If the specified system handle is a COM interface, the reference counter of the COM interface will increase. + The counter will decrease when the session closes. + + @paramin session Session handle. + @paramin type Handle type + @paramin hdl Handle to be set + + @returns + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_UNDEFINED_BEHAVIOR The same handle is redefined. + For example, the function has been called twice with the same handle type or an + internal handle has been created before this function call. + MFX_ERR_DEVICE_FAILED The SDK cannot initialize using the handle. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoCORE_SetHandle(mfxSession session, mfxHandleType type, mfxHDL hdl); + +/*! + @brief + Obtains system handles previously set by the MFXVideoCORE_SetHandle function. + + If the handler is a COM interface, the reference counter of the interface increases. + The calling application must release the COM interface. + + @paramin session Session handle. + @paramin type Handle type + @paramin hdl Pointer to the handle to be set + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_UNDEFINED_BEHAVIOR Specified handle type not found. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoCORE_GetHandle(mfxSession session, mfxHandleType type, mfxHDL *hdl); + +/*! + @brief + Returns information about current hardware platform in the Legacy mode. + + @paramin session Session handle. + @paramout platform Pointer to the mfxPlatform structure + + @return + MFX_ERR_NONE The function completed successfully. + + @since This function is available since API version 1.19. +*/ +mfxStatus MFX_CDECL MFXVideoCORE_QueryPlatform(mfxSession session, mfxPlatform* platform); + +/*! + @brief + Initiates execution of an asynchronous function not already started and returns the status code after the specified asynchronous operation completes. + If wait is zero, the function returns immediately + + @paramin session Session handle. + @paramin syncp Sync point + @paramin wait wait time in milliseconds + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_NONE_PARTIAL_OUTPUT The function completed successfully, bitstream contains a portion of the encoded frame according to required granularity. \n + MFX_WRN_IN_EXECUTION The specified asynchronous function is in execution. \n + MFX_ERR_ABORTED The specified asynchronous function aborted due to data dependency on a previous asynchronous function that did not complete. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoCORE_SyncOperation(mfxSession session, mfxSyncPoint syncp, mfxU32 wait); + +/* MFXMemory */ + +/*! + @brief + Returns surface which can be used as input for VPP. + + VPP should be initialized before this call. + Surface should be released with mfxFrameSurface1::FrameInterface.Release(...) after usage. The value of mfxFrameSurface1::Data.Locked for the returned surface is 0. + + + @paramin session Session handle. + @paramout surface Pointer is set to valid mfxFrameSurface1 object. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_NULL_PTR If double-pointer to the @p surface is NULL. \n + MFX_ERR_INVALID_HANDLE If @p session was not initialized. \n + MFX_ERR_NOT_INITIALIZED If VPP was not initialized (allocator needs to know surface size from somewhere). \n + MFX_ERR_MEMORY_ALLOC In case of any other internal allocation error. \n + MFX_WRN_ALLOC_TIMEOUT_EXPIRED In case of waiting timeout expired (if set with mfxExtAllocationHints). + + @since This function is available since API version 2.0. + +*/ +mfxStatus MFX_CDECL MFXMemory_GetSurfaceForVPP(mfxSession session, mfxFrameSurface1** surface); + +/*! + @brief + Returns surface which can be used as output of VPP. + + VPP should be initialized before this call. + Surface should be released with mfxFrameSurface1::FrameInterface.Release(...) after usage. The value of mfxFrameSurface1::Data.Locked for the returned surface is 0. + + + @paramin session Session handle. + @paramout surface Pointer is set to valid mfxFrameSurface1 object. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_NULL_PTR If double-pointer to the @p surface is NULL. \n + MFX_ERR_INVALID_HANDLE If @p session was not initialized. \n + MFX_ERR_NOT_INITIALIZED If VPP was not initialized (allocator needs to know surface size from somewhere). \n + MFX_ERR_MEMORY_ALLOC In case of any other internal allocation error. \n + MFX_WRN_ALLOC_TIMEOUT_EXPIRED In case of waiting timeout expired (if set with mfxExtAllocationHints). + + @since This function is available since API version 2.1. + +*/ +mfxStatus MFX_CDECL MFXMemory_GetSurfaceForVPPOut(mfxSession session, mfxFrameSurface1** surface); + +/*! Alias for MFXMemory_GetSurfaceForVPP function. */ +#define MFXMemory_GetSurfaceForVPPIn MFXMemory_GetSurfaceForVPP + +/*! + @brief + Returns a surface which can be used as input for the encoder. + + Encoder should be initialized before this call. + Surface should be released with mfxFrameSurface1::FrameInterface.Release(...) after usage. The value of mfxFrameSurface1::Data.Locked for the returned surface is 0. + + + + @paramin session Session handle. + @paramout surface Pointer is set to valid mfxFrameSurface1 object. + + @return + MFX_ERR_NONE The function completed successfully.\n + MFX_ERR_NULL_PTR If surface is NULL.\n + MFX_ERR_INVALID_HANDLE If session was not initialized.\n + MFX_ERR_NOT_INITIALIZED If the encoder was not initialized (allocator needs to know surface size from somewhere).\n + MFX_ERR_MEMORY_ALLOC In case of any other internal allocation error. \n + MFX_WRN_ALLOC_TIMEOUT_EXPIRED In case of waiting timeout expired (if set with mfxExtAllocationHints). + + @since This function is available since API version 2.0. + +*/ +mfxStatus MFX_CDECL MFXMemory_GetSurfaceForEncode(mfxSession session, mfxFrameSurface1** surface); + +/*! + @brief + Returns a surface which can be used as output of the decoder. + + Decoder should be initialized before this call. + Surface should be released with mfxFrameSurface1::FrameInterface.Release(...) after usage. The value of mfxFrameSurface1::Data.Locked for the returned surface is 0.' + + @note This function was added to simplify transition from legacy surface management to the proposed internal allocation approach. + Previously, the user allocated surfaces for the working pool and fed them to the decoder using DecodeFrameAsync calls. With MFXMemory_GetSurfaceForDecode + it is possible to change the existing pipeline by just changing the source of work surfaces. + Newly developed applications should prefer direct usage of DecodeFrameAsync with internal allocation. + + + @paramin session Session handle. + @paramout surface Pointer is set to valid mfxFrameSurface1 object. + + @return + MFX_ERR_NONE The function completed successfully.\n + MFX_ERR_NULL_PTR If surface is NULL.\n + MFX_ERR_INVALID_HANDLE If session was not initialized.\n + MFX_ERR_NOT_INITIALIZED If the decoder was not initialized (allocator needs to know surface size from somewhere).\n + MFX_ERR_MEMORY_ALLOC Other internal allocation error. \n + MFX_WRN_ALLOC_TIMEOUT_EXPIRED In case of waiting timeout expired (if set with mfxExtAllocationHints). + + @since This function is available since API version 2.0. + +*/ +mfxStatus MFX_CDECL MFXMemory_GetSurfaceForDecode(mfxSession session, mfxFrameSurface1** surface); + +/* VideoENCODE */ + +/*! + @brief + Works in either of four modes: + + @li If the @p in parameter is zero, the function returns the class configurability in the output structure. The application must set to zero the fields it wants to check for support. If the field is supported, function sets non-zero value to this field, otherwise it would be ignored. It indicates that the SDK implementation can configure the field with Init. + + @li If the @p in parameter is non-zero, the function checks the validity of the fields in the input structure. Then the function returns the corrected values in + the output structure. If there is insufficient information to determine the validity or correction is impossible, the function zeroes the fields. + This feature can verify whether the implementation supports certain profiles, levels or bitrates. + + @li If the @p in parameter is non-zero and mfxExtEncoderResetOption structure is attached to it, the function queries for the outcome of the MFXVideoENCODE_Reset function + and returns it in the mfxExtEncoderResetOption structure attached to out. The query function succeeds if a reset is possible and returns an error otherwise. Unlike other + modes that are independent of the encoder state, this one checks if reset is possible in the present encoder state. + This mode also requires a completely defined mfxVideoParam structure, unlike other modes that support partially defined configurations. + See mfxExtEncoderResetOption description for more details. + + @li If the @p in parameter is non-zero and mfxExtEncoderCapability structure is attached to it, the function returns encoder capability in the mfxExtEncoderCapability structure + attached to out. It is recommended to fill in the mfxVideoParam structure and set the hardware acceleration device handle before calling the function in this mode. + + The application can call this function before or after it initializes the encoder. The ``CodecId`` field of the output structure is a mandated field (to be filled by the + application) to identify the coding standard. + + @paramin session Session handle. + @paramin in Pointer to the mfxVideoParam structure as input. + @paramout out Pointer to the mfxVideoParam structure as output. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_UNSUPPORTED The function failed to identify a specific implementation for the required features. \n + MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. + The encoding may be partially accelerated. Only hardware implementations may return this status code. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoENCODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); + +/*! + @brief + Returns minimum and suggested numbers of the input frame surfaces required for encoding initialization and their type. + + Init will call the external allocator for the required frames with the same set of numbers. + This function does not validate I/O parameters except those used in calculating the number of input surfaces. + + The use of this function is recommended. + \verbatim embed:rst + For more information, see the :ref:`Working with Hardware Acceleration section<hw-acceleration>`. + \endverbatim + + + @paramin session Session handle. + @paramin par Pointer to the mfxVideoParam structure as input. + @paramin request Pointer to the mfxFrameAllocRequest structure as output. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range or the combination of them + resulted in incompatibility. Incompatibility not resolved. \n + MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. + The encoding may be partially accelerated. Only hardware implementations may return this status code. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoENCODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); + +/*! + @brief + Allocates memory and prepares tables and necessary structures for encoding. + + This function also does extensive validation to ensure if the + configuration, as specified in the input parameters, is supported. + + @paramin session Session handle. + @paramin par Pointer to the mfxVideoParam structure. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or the combination of them + resulted in incompatibility. Incompatibility not resolved. \n + MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. + The encoding may be partially accelerated. Only hardware implementations may return this status code. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. \n + MFX_ERR_UNDEFINED_BEHAVIOR The function is called twice without a close; + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoENCODE_Init(mfxSession session, mfxVideoParam *par); + +/*! + @brief + Stops the current encoding operation and restores internal structures or parameters for a new encoding operation, possibly with new parameters. + + @paramin session Session handle. + @paramin par Pointer to the mfxVideoParam structure. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or the combination of them + resulted in incompatibility. Incompatibility not resolved. \n + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The function detected that video parameters provided by the application are incompatible with initialization parameters. + Reset requires additional memory allocation and cannot be executed. The application should close the + component and then reinitialize it. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoENCODE_Reset(mfxSession session, mfxVideoParam *par); + +/*! + @brief + Terminates the current encoding operation and de-allocates any internal tables or structures. + + @paramin session Session handle. + + @return + MFX_ERR_NONE The function completed successfully. \n + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoENCODE_Close(mfxSession session); + +/*! + @brief + Retrieves current working parameters to the specified output structure. + + If extended buffers are to be returned, the + application must allocate those extended buffers and attach them as part of the output structure. + The application can retrieve a copy of the bitstream header by attaching the mfxExtCodingOptionSPSPPS structure to the mfxVideoParam structure. + + @paramin session Session handle. + @paramin par Pointer to the corresponding parameter structure. + + @return + MFX_ERR_NONE The function completed successfully. \n + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoENCODE_GetVideoParam(mfxSession session, mfxVideoParam *par); + +/*! + @brief + Obtains statistics collected during encoding. + + @paramin session Session handle. + @paramin stat Pointer to the mfxEncodeStat structure. + + @return MFX_ERR_NONE The function completed successfully. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoENCODE_GetEncodeStat(mfxSession session, mfxEncodeStat *stat); + +/*! + @brief + Takes a single input frame in either encoded or display order and generates its output bitstream. + + In the case of encoded ordering, the mfxEncodeCtrl + structure must specify the explicit frame type. In the case of display ordering, this function handles frame order shuffling according to the GOP structure + parameters specified during initialization. + + Since encoding may process frames differently from the input order, not every call of the function generates output and the function returns MFX_ERR_MORE_DATA. + If the encoder needs to cache the frame, the function locks the frame. The application should not alter the frame until the encoder unlocks the frame. + If there is output (with return status MFX_ERR_NONE), the return is a frame's worth of bitstream. + + It is the calling application's responsibility to ensure that there is sufficient space in the output buffer. The value ``BufferSizeInKB`` in the + mfxVideoParam structure at encoding initialization specifies the maximum possible size for any compressed frames. This value can also be obtained from the + MFXVideoENCODE_GetVideoParam function after encoding initialization. + + To mark the end of the encoding sequence, call this function with a NULL surface pointer. Repeat the call to drain any remaining internally cached bitstreams + (one frame at a time) until MFX_ERR_MORE_DATA is returned. + + This function is asynchronous. + + @paramin session Session handle. + @paramin ctrl Pointer to the mfxEncodeCtrl structure for per-frame encoding control; this parameter is optional (it can be NULL) if the encoder works in the display order mode. + @paramin surface Pointer to the frame surface structure. + @paramout bs Pointer to the output bitstream. + @paramout syncp Pointer to the returned sync point associated with this operation. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_NOT_ENOUGH_BUFFER The bitstream buffer size is insufficient. \n + MFX_ERR_MORE_DATA The function requires more data to generate any output. \n + MFX_ERR_DEVICE_LOST Hardware device was lost. + \verbatim embed:rst + See the :ref:`Working with Microsoft* DirectX* Applications section<work_ms_directx_app>` for further information. + \endverbatim + \n + MFX_WRN_DEVICE_BUSY Hardware device is currently busy. Call this function again after MFXVideoCORE_SyncOperation or in a few milliseconds. \n + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM Inconsistent parameters detected not conforming to Configuration Parameter Constraints. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoENCODE_EncodeFrameAsync(mfxSession session, mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp); + +/*! + @brief + Works in one of two modes: + + @li If the @p in parameter is zero, the function returns the class configurability in the output structure. A non-zero value in each field of the output structure + indicates that the field is configurable by the implementation with the MFXVideoDECODE_Init function. + + @li If the @p in parameter is non-zero, the function checks the validity of the fields in the input structure. Then the function returns the corrected values to + the output structure. If there is insufficient information to determine the validity or correction is impossible, the function zeros the fields. This + feature can verify whether the implementation supports certain profiles, levels, or bitrates. + + The application can call this function before or after it initializes the decoder. The ``CodecId`` field of the output structure is a mandated field + (to be filled by the application) to identify the coding standard. + + @paramin session Session handle. + @paramin in Pointer to the mfxVideoParam structure as input. + @paramout out Pointer to the mfxVideoParam structure as output. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_UNSUPPORTED The function failed to identify a specific implementation for the required features. \n + MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. + The decoding may be partially accelerated. Only hardware implementations may return this status code. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. + + @since This function is available since API version 1.0. +*/ + +mfxStatus MFX_CDECL MFXVideoDECODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); + +/*! + @brief + Parses the input bitstream and fills the mfxVideoParam structure with appropriate values, such as resolution and frame rate, for the Init API function. + + The application can then pass the resulting structure to the MFXVideoDECODE_Init function for decoder initialization. + + An application can call this API function at any time before or after decoder initialization. If the library finds a sequence header in the bitstream, the function + moves the bitstream pointer to the first bit of the sequence header. Otherwise, the function moves the bitstream pointer close to the end of the bitstream buffer but leaves enough data in the buffer to avoid possible loss of start code. + + The ``CodecId`` field of the mfxVideoParam structure is a mandated field (to be filled by the application) to identify the coding standard. + + The application can retrieve a copy of the bitstream header, by attaching the mfxExtCodingOptionSPSPPS structure to the mfxVideoParam structure. + + @paramin session Session handle. + @paramin bs Pointer to the bitstream. + @paramin par Pointer to the mfxVideoParam structure. + + @return + - MFX_ERR_NONE The function successfully filled the structure. It does not mean that the stream can be decoded by the library. + The application should call MFXVideoDECODE_Query function to check if decoding of the stream is supported. \n + - MFX_ERR_MORE_DATA The function requires more bitstream data. \n + - MFX_ERR_UNSUPPORTED ``CodecId`` field of the mfxVideoParam structure indicates some unsupported codec. \n + - MFX_ERR_INVALID_HANDLE Session is not initialized. \n + - MFX_ERR_NULL_PTR @p bs or @p par pointer is NULL. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_DecodeHeader(mfxSession session, mfxBitstream *bs, mfxVideoParam *par); + +/*! + @brief + Returns minimum and suggested numbers of the output frame surfaces required for decoding initialization and their type. + + Init will call the external allocator for the required frames with the same set of numbers. + The use of this function is recommended. + \verbatim embed:rst + For more information, see the :ref:`Working with Hardware Acceleration section<hw-acceleration>`. + \endverbatim + + The ``CodecId`` field of the mfxVideoParam structure is a mandated field (to be filled by the application) to identify the coding standard. + This function does not validate I/O parameters except those used in calculating the number of output surfaces. + + @paramin session Session handle. + @paramin par Pointer to the mfxVideoParam structure as input. + @paramin request Pointer to the mfxFrameAllocRequest structure as output. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or the combination of them + resulted in incompatibility. Incompatibility not resolved. \n + MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. + The encoding may be partially accelerated. Only hardware implementations may return this status code. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); + +/*! + @brief + Allocates memory and prepares tables and necessary structures for encoding. + + This function also does extensive validation to ensure if the + configuration, as specified in the input parameters, is supported. + + @paramin session Session handle. + @paramin par Pointer to the mfxVideoParam structure. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or the combination of them + resulted in incompatibility. Incompatibility not resolved. \n + MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. + The encoding may be partially accelerated. Only hardware implementations may return this status code. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. \n + MFX_ERR_UNDEFINED_BEHAVIOR The function is called twice without a close. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_Init(mfxSession session, mfxVideoParam *par); + +/*! + @brief + Stops the current decoding operation and restores internal structures or parameters for a new decoding operation. + + Reset serves two purposes: + + @li It recovers the decoder from errors. + @li It restarts decoding from a new position + + The function resets the old sequence header (sequence parameter set in H.264, or sequence header in MPEG-2 and VC-1). The decoder will expect a new sequence header + before it decodes the next frame and will skip any bitstream before encountering the new sequence header. + + @paramin session Session handle. + @paramin par Pointer to the mfxVideoParam structure. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_INVALID_VIDEO_PARAM The function detected that video parameters are wrong or they conflict with initialization parameters. Reset is impossible. \n + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The function detected that video parameters provided by the application are incompatible with initialization parameters. + Reset requires additional memory allocation and cannot be executed. The application should close the + component and then reinitialize it. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_Reset(mfxSession session, mfxVideoParam *par); + +/*! + @brief + Terminates the current decoding operation and de-allocates any internal tables or structures. + + @paramin session Session handle. + + @return + MFX_ERR_NONE The function completed successfully. \n + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_Close(mfxSession session); + +/*! + @brief + Retrieves current working parameters to the specified output structure. + + If extended buffers are to be returned, the + application must allocate those extended buffers and attach them as part of the output structure. + The application can retrieve a copy of the bitstream header, by attaching the mfxExtCodingOptionSPSPPS structure to the mfxVideoParam structure. + + @paramin session Session handle. + @paramin par Pointer to the corresponding parameter structure. + + @return + MFX_ERR_NONE The function completed successfully. \n + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_GetVideoParam(mfxSession session, mfxVideoParam *par); + +/*! + @brief + Obtains statistics collected during decoding. + + @paramin session Session handle. + @paramin stat Pointer to the mfxDecodeStat structure. + + @return + MFX_ERR_NONE The function completed successfully. \n + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_GetDecodeStat(mfxSession session, mfxDecodeStat *stat); + +/*! + @brief + Sets the decoder skip mode. + + The application may use this API function to increase decoding performance by sacrificing output quality. Increasing the skip + level first results in skipping of some decoding operations like deblocking and then leads to frame skipping; first B, then P. Particular details are platform dependent. + + @paramin session Session handle. + @paramin mode Decoder skip mode. See the mfxSkipMode enumerator for details. + + @return + MFX_ERR_NONE The function completed successfully and the output surface is ready for decoding \n + MFX_WRN_VALUE_NOT_CHANGED The skip mode is not affected as the maximum or minimum skip range is reached. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_SetSkipMode(mfxSession session, mfxSkipMode mode); + +/*! + @brief + Extracts user data (MPEG-2) or SEI (H.264) messages from the bitstream. + + Internally, the decoder implementation stores encountered user data or + SEI messages. The application may call this API function multiple times to retrieve the user data or SEI messages, one at a time. + + If there is no payload available, the function returns with payload->NumBit=0. + + @paramin session Session handle. + @paramin ts Pointer to the user data time stamp in units of 90 KHz; divide ts by 90,000 (90 KHz) to obtain the time in seconds; the time stamp matches the payload + with a specific decoded frame. + @paramin payload Pointer to the mfxPayload structure; the payload contains user data in MPEG-2 or SEI messages in H.264. + + @return + MFX_ERR_NONE The function completed successfully and the output buffer is ready for decoding. \n + MFX_ERR_NOT_ENOUGH_BUFFER The payload buffer size is insufficient. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_GetPayload(mfxSession session, mfxU64 *ts, mfxPayload *payload); + +/*! + @brief + Decodes the input bitstream to a single output frame. + + The @p surface_work parameter provides a working frame buffer for the decoder. The application should allocate the working frame buffer, which stores decoded frames. + If the function requires caching frames after decoding, it locks the frames and the application must provide a new frame buffer in the next call. + + If, and only if, the function returns MFX_ERR_NONE, the pointer @p surface_out points to the output frame in the display order. If there are no further frames, + the function will reset the pointer to zero and return the appropriate status code. + + Before decoding the first frame, a sequence header (sequence parameter set in H.264 or sequence header in MPEG-2 and VC-1) must be present. The function skips any + bitstreams before it encounters the new sequence header. + + The input bitstream @p bs can be of any size. If there are not enough bits to decode a frame, the function returns MFX_ERR_MORE_DATA, and consumes all input bits except if + a partial start code or sequence header is at the end of the buffer. In this case, the function leaves the last few bytes in the bitstream buffer. + If there is more incoming bitstream, the application should append the incoming bitstream to the bitstream buffer. Otherwise, the application should ignore the + remaining bytes in the bitstream buffer and apply the end of stream procedure described below. + + The application must set @p bs to NULL to signal end of stream. The application may need to call this API function several times to drain any internally cached frames until the + function returns MFX_ERR_MORE_DATA. + + If more than one frame is in the bitstream buffer, the function decodes until the buffer is consumed. The decoding process can be interrupted for events such as if the + decoder needs additional working buffers, is readying a frame for retrieval, or encountering a new header. In these cases, the function returns appropriate status code + and moves the bitstream pointer to the remaining data. + + The decoder may return MFX_ERR_NONE without taking any data from the input bitstream buffer. If the application appends additional data to the bitstream buffer, it + is possible that the bitstream buffer may contain more than one frame. It is recommended that the application invoke the function repeatedly until the function + returns MFX_ERR_MORE_DATA, before appending any more data to the bitstream buffer. + + Starting from API 2.0 it is possible to pass NULL instead of surface_work. In such case runtime will allocate output frames internally. + + This function is asynchronous. + + @paramin session Session handle. + @paramin bs Pointer to the input bitstream. + @paramin surface_work Pointer to the working frame buffer for the decoder. + @paramout surface_out Pointer to the output frame in the display order. + @paramout syncp Pointer to the sync point associated with this operation. + + @return + MFX_ERR_NONE The function completed successfully and the output surface is ready for decoding. \n + MFX_ERR_MORE_DATA The function requires more bitstream at input before decoding can proceed. \n + MFX_ERR_MORE_SURFACE The function requires more frame surface at output before decoding can proceed. \n + MFX_ERR_DEVICE_LOST Hardware device was lost. + \verbatim embed:rst + See the :ref:`Working with Microsoft* DirectX* Applications section<work_ms_directx_app>` for further information. + \endverbatim + \n + MFX_WRN_DEVICE_BUSY Hardware device is currently busy. Call this function again after MFXVideoCORE_SyncOperation or in a few milliseconds. \n + MFX_WRN_VIDEO_PARAM_CHANGED The decoder detected a new sequence header in the bitstream. Video parameters may have changed. \n + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The decoder detected incompatible video parameters in the bitstream and failed to follow them. \n + MFX_ERR_REALLOC_SURFACE Bigger surface_work required. May be returned only if mfxInfoMFX::EnableReallocRequest was set to ON during initialization. \n + MFX_WRN_ALLOC_TIMEOUT_EXPIRED Timeout expired for internal output frame allocation (if set with mfxExtAllocationHints and NULL passed as surface_work). Repeat the call in a few milliseconds or re-initialize decoder with higher surface limit. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_DecodeFrameAsync(mfxSession session, mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp); + +/* VideoVPP */ + +/*! + @brief + Works in one of two modes: + + @li If the @p in pointer is zero, the function returns the class configurability in the output structure. A non-zero value in a field indicates that the + implementation can configure it with Init. + + @li If the @p in parameter is non-zero, the function checks the validity of the fields in the input structure. Then the function returns the corrected values to + the output structure. If there is insufficient information to determine the validity or correction is impossible, the function zeroes the fields. + + The application can call this function before or after it initializes the preprocessor. + + @paramin session Session handle. + @paramin in Pointer to the mfxVideoParam structure as input. + @paramout out Pointer to the mfxVideoParam structure as output. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_UNSUPPORTED The implementation does not support the specified configuration. \n + MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. + The video processing may be partially accelerated. Only hardware implementations may return this status code. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoVPP_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); + +/*! + @brief + Returns minimum and suggested numbers of the input frame surfaces required for video processing initialization and their type. + + The parameter ``request0`` refers to the input requirements; ``request1`` refers to output requirements. Init will call the external allocator for the + required frames with the same set of numbers. + This function does not validate I/O parameters except those used in calculating the number of input surfaces. + + The use of this function is recommended. + \verbatim embed:rst + For more information, see the :ref:`Working with Hardware Acceleration section<hw-acceleration>`. + \endverbatim + + @paramin session Session handle. + @paramin par Pointer to the mfxVideoParam structure as input. + @paramin request Pointer to the mfxFrameAllocRequest structure; use ``request0`` for input requirements and ``request1`` for output requirements for video processing. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or the combination of them + resulted in incompatibility. Incompatibility not resolved. \n + MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. + The video processing may be partially accelerated. Only hardware implementations may return this status code. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoVPP_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest request2); + +/*! + @brief + Allocates memory and prepares tables and necessary structures for video processing. + + This function also does extensive validation to ensure if the + configuration, as specified in the input parameters, is supported. + + @paramin session Session handle. + @paramin par Pointer to the mfxVideoParam structure. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or the combination of them + resulted in incompatibility. Incompatibility not resolved. \n + MFX_WRN_PARTIAL_ACCELERATION The underlying hardware does not fully support the specified video parameters. + The video processing may be partially accelerated. Only hardware implementations may return this status code. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. \n + MFX_ERR_UNDEFINED_BEHAVIOR The function is called twice without a close. \n + MFX_WRN_FILTER_SKIPPED The VPP skipped one or more filters requested by the application. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoVPP_Init(mfxSession session, mfxVideoParam *par); + +/*! + @brief + Stops the current video processing operation and restores internal structures or parameters for a new operation + + @paramin session Session handle. + @paramin par Pointer to the mfxVideoParam structure. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_INVALID_VIDEO_PARAM The function detected that video parameters are wrong or they conflict with initialization parameters. Reset is impossible. \n + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The function detected that video parameters provided by the application are incompatible with initialization parameters. + Reset requires additional memory allocation and cannot be executed. The application should close the + component and then reinitialize it. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoVPP_Reset(mfxSession session, mfxVideoParam *par); + +/*! + @brief + Terminates the current video processing operation and de-allocates any internal tables or structures. + + @paramin session Session handle. + + @return MFX_ERR_NONE + The function completed successfully. \n + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoVPP_Close(mfxSession session); + +/*! + @brief + Retrieves current working parameters to the specified output structure. + + If extended buffers are to be returned, the + application must allocate those extended buffers and attach them as part of the output structure. + + @paramin session Session handle. + @paramin par Pointer to the corresponding parameter structure. + + @return + MFX_ERR_NONE The function completed successfully. \n + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoVPP_GetVideoParam(mfxSession session, mfxVideoParam *par); + +/*! + @brief + Obtains statistics collected during video processing. + + @paramin session Session handle. + @paramin stat Pointer to the mfxVPPStat structure. + + @return + MFX_ERR_NONE The function completed successfully. \n + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoVPP_GetVPPStat(mfxSession session, mfxVPPStat *stat); + +/*! + @brief + Processes a single input frame to a single output frame. + + Retrieval of the auxiliary data is optional; the encoding process may use it. + The video processing process may not generate an instant output given an input. + \verbatim embed:rst + See the :ref:`Video Processing Procedures section<vid_process_procedure>` for details on how to + correctly send input and retrieve output. + \endverbatim + + + At the end of the stream, call this function with the input argument ``in=NULL`` to retrieve any remaining frames, until the function returns MFX_ERR_MORE_DATA. + This function is asynchronous. + + @paramin session Session handle. + @paramin in Pointer to the input video surface structure. + @paramout out Pointer to the output video surface structure. + @paramin aux Optional pointer to the auxiliary data structure. + @paramout syncp Pointer to the output sync point. + + @return + MFX_ERR_NONE The output frame is ready after synchronization. \n + MFX_ERR_MORE_DATA Need more input frames before VPP can produce an output. \n + MFX_ERR_MORE_SURFACE The output frame is ready after synchronization. Need more surfaces at output for additional output frames available. \n + MFX_ERR_DEVICE_LOST Hardware device was lost. + \verbatim embed:rst + See the :ref:`Working with Microsoft* DirectX* Applications section<work_ms_directx_app>` for further information. + \endverbatim + \n + MFX_WRN_DEVICE_BUSY Hardware device is currently busy. Call this function again after MFXVideoCORE_SyncOperation or in a few milliseconds. + + @since This function is available since API version 1.0. +*/ +mfxStatus MFX_CDECL MFXVideoVPP_RunFrameVPPAsync(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp); + +/*! + @brief + The function processes a single input frame to a single output frame with internal allocation of output frame. + + At the end of the stream, call this function with the input argument ``in=NULL`` to retrieve any remaining frames, until the function returns MFX_ERR_MORE_DATA. + This function is asynchronous. + + @paramin session Session handle. + @paramin in Pointer to the input video surface structure. + @paramout out Pointer to the output video surface structure which is reference counted object allocated by the library. + + @return + MFX_ERR_NONE The output frame is ready after synchronization. \n + MFX_ERR_MORE_DATA Need more input frames before VPP can produce an output. \n + MFX_ERR_MEMORY_ALLOC The function failed to allocate output videoframe. \n + + MFX_ERR_DEVICE_LOST Hardware device was lost. + \verbatim embed:rst + See the :ref:`Working with Microsoft* DirectX* Applications section<work_ms_directx_app>` for further information. + \endverbatim + \n + MFX_WRN_DEVICE_BUSY Hardware device is currently busy. Call this function again after MFXVideoCORE_SyncOperation or in a few milliseconds. \n + MFX_WRN_ALLOC_TIMEOUT_EXPIRED Timeout expired for internal output frame allocation (if set with mfxExtAllocationHints). Repeat the call in a few milliseconds or reinitialize VPP with higher surface limit. + + @since This function is available since API version 2.1. +*/ +mfxStatus MFX_CDECL MFXVideoVPP_ProcessFrameAsync(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 **out); + +/*! + @brief + Initialize the SDK in (decode + vpp) mode. The logic of this function is similar to MFXVideoDECODE_Init, + but application has to provide array of pointers to mfxVideoChannelParam and num_channel_param - number of channels. Application is responsible for + memory allocation for mfxVideoChannelParam parameters and for each channel it should specify channel IDs: + mfxVideoChannelParam::mfxFrameInfo::ChannelId. ChannelId should be unique value within one session. ChannelID equals to the 0 + is reserved for the orginal decoded frame. + The application can attach mfxExtInCrops to mfxVideoChannelParam::ExtParam to annotate input video frame if it wants to enable + letterboxing operation. + @paramin session SDK session handle. + @paramin decode_par Pointer to the mfxVideoParam structure which contains initialization parameters for decoder. + @paramin vpp_par_array Array of pointers to `mfxVideoChannelParam`structures. Each mfxVideoChannelParam contains initialization + parameters for each VPP channel. + @paramin num_vpp_par Size of array of pointers to mfxVideoChannelParam structures. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_INVALID_VIDEO_PARAM The function detected invalid video parameters. These parameters may be out of the valid range, or + the combination of them resulted in incompatibility. Incompatibility not resolved. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility + resolved. \n + MFX_ERR_UNDEFINED_BEHAVIOR The component is already initialized. \n + MFX_WRN_FILTER_SKIPPED The VPP skipped one or more filters requested by the application. + + @since This function is available since API version 2.1. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_VPP_Init(mfxSession session, mfxVideoParam* decode_par, mfxVideoChannelParam** vpp_par_array, mfxU32 num_vpp_par); + +/*! + @brief + This function is similar to MFXVideoDECODE_DecodeFrameAsync and inherits all bitstream processing logic. As output, + it allocates and returns @p surf_array_out array of processed surfaces according to the chain of filters specified + by application in MFXVideoDECODE_VPP_Init, including original decoded frames. In the @p surf_array_out, the original + decoded frames are returned through surfaces with mfxFrameInfo::ChannelId == 0, followed by each of the subsequent + frame surfaces for each of the requested mfxVideoChannelParam entries provided to the MFXVideoCECODE_VPP_Init + function. At maximum, the number of frame surfaces return is 1 + the value of @p num_vpp_par to the + MFXVideoDECODE_VPP_Init function, but the application must be prepared to the case when some particular filters + are not ready to output surfaces, so the length of @p surf_array_out will be less. Application should use + mfxFrameInfo::ChannelId parameter to match output surface against configured filter. + + An application must synchronize each output surface from the @p surf_array_out surface array independently. + + @paramin session SDK session handle. + @paramin bs Pointer to the input bitstream. + @paramin skip_channels Pointer to the array of `ChannelId`s which specifies channels with skip output frames. Memory for + the array is allocated by application. + @paramin num_skip_channels Number of channels addressed by skip_channels. + @paramout surf_array_out The address of a pointer to the structure with frame surfaces. + + @return + MFX_ERR_NONE The function completed successfully and the output surface is ready for decoding. \n + MFX_ERR_MORE_DATA The function requires more bitstream at input before decoding can proceed. \n + MFX_ERR_MORE_SURFACE The function requires more frame surface at output before decoding can proceed. \n + MFX_ERR_DEVICE_LOST Hardware device was lost. + \verbatim embed:rst + See the :ref:`Working with Microsoft* DirectX* Applications section<work_ms_directx_app>` for further information. + \endverbatim + \n + MFX_WRN_DEVICE_BUSY Hardware device is currently busy. Call this function again after MFXVideoCORE_SyncOperation or in a few milliseconds. \n + MFX_WRN_VIDEO_PARAM_CHANGED The decoder detected a new sequence header in the bitstream. Video parameters may have changed. \n + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The decoder detected incompatible video parameters in the bitstream and failed to follow them. \n + MFX_ERR_NULL_PTR num_skip_channels doesn't equal to 0 when skip_channels is NULL. + + @since This function is available since API version 2.1. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_VPP_DecodeFrameAsync(mfxSession session, mfxBitstream *bs, mfxU32* skip_channels, mfxU32 num_skip_channels, mfxSurfaceArray **surf_array_out); + +/*! + @brief + This function is similar to MFXVideoDECODE_Reset and stops the current decoding and vpp operation, and restores internal + structures or parameters for a new decoding plus vpp operation. It resets the state of the decoder and/or all initialized vpp + channels. Applications have to care about draining of buffered frames for decode and all vpp channels before call this function. + The application can attach mfxExtInCrops to mfxVideoChannelParam::ExtParam to annotate input video frame if it wants to enable + letterboxing operation. + + @paramin session Session handle. + @paramin decode_par Pointer to the `mfxVideoParam` structure which contains new initialization parameters for decoder. Might + be NULL if application wants to Reset only VPP channels. + @paramin vpp_par_array Array of pointers to mfxVideoChannelParam structures. Each mfxVideoChannelParam contains new + initialization parameters for each VPP channel. + @paramin num_vpp_par Size of array of pointers to mfxVideoChannelParam structures. + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_INVALID_VIDEO_PARAM The function detected that video parameters are wrong or they conflict with initialization parameters. Reset is impossible. \n + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM The function detected that video parameters provided by the application are incompatible with initialization parameters. + Reset requires additional memory allocation and cannot be executed. The application should close the + component and then reinitialize it. \n + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM The function detected some video parameters were incompatible with others; incompatibility resolved. + MFX_ERR_NULL_PTR Both pointers decode_par and vpp_par_array` equal to zero. + + @since This function is available since API version 2.1. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_VPP_Reset(mfxSession session, mfxVideoParam* decode_par, mfxVideoChannelParam** vpp_par_array, mfxU32 num_vpp_par); + +/*! + @brief + Returns actual VPP parameters for selected channel which should be specified by application through + mfxVideoChannelParam::mfxFrameInfo::ChannelId. + + @paramin session Session handle. + @paramin par Pointer to the `mfxVideoChannelParam` structure which allocated by application + @paramin channel_id specifies the requested channel's info + + @return + MFX_ERR_NONE The function completed successfully. \n + MFX_ERR_NULL_PTR par pointer is NULL. \n + MFX_ERR_NOT_FOUND the library is not able to find VPP channel with such channel_id. + + @since This function is available since API version 2.1. +*/ +mfxStatus MFX_CDECL MFXVideoDECODE_VPP_GetChannelParam(mfxSession session, mfxVideoChannelParam *par, mfxU32 channel_id); + +/*! + @brief + This function is similar to MFXVideoDECODE_Close. It terminates the current decoding and vpp operation and de-allocates any internal tables or structures. + + @paramin session Session handle. + + @return + MFX_ERR_NONE The function completed successfully. \n + + @since This function is available since API version 2.1. +*/ + +mfxStatus MFX_CDECL MFXVideoDECODE_VPP_Close(mfxSession session); + +/*! Alias for MFXVideoDECODE_DecodeHeader function. */ +#define MFXVideoDECODE_VPP_DecodeHeader MFXVideoDECODE_DecodeHeader + +/*! Alias for MFXVideoDECODE_GetVideoParam function. */ +#define MFXVideoDECODE_VPP_GetVideoParam MFXVideoDECODE_GetVideoParam + +/*! Alias for MFXVideoDECODE_GetDecodeStat function. */ +#define MFXVideoDECODE_VPP_GetDecodeStat MFXVideoDECODE_GetDecodeStat + +/*! Alias for MFXVideoDECODE_SetSkipMode function. */ +#define MFXVideoDECODE_VPP_SetSkipMode MFXVideoDECODE_SetSkipMode + +/*! Alias for MFXVideoDECODE_GetPayload function. */ +#define MFXVideoDECODE_VPP_GetPayload MFXVideoDECODE_GetPayload + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/api/vpl/mfxvp8.h
Added
@@ -0,0 +1,65 @@ +/*############################################################################ + # Copyright Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef __MFXVP8_H__ +#define __MFXVP8_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + MFX_CODEC_VP8 = MFX_MAKEFOURCC('V','P','8',' '), +}; + +/* VP8 CodecProfile*/ +enum { + MFX_PROFILE_VP8_0 = 0+1, + MFX_PROFILE_VP8_1 = 1+1, + MFX_PROFILE_VP8_2 = 2+1, + MFX_PROFILE_VP8_3 = 3+1, +}; + +/* Extended Buffer Ids */ +enum { + /*! + This extended buffer describes VP8 encoder configuration parameters. See the mfxExtVP8CodingOption structure for details. + The application can attach this buffer to the mfxVideoParam structure for encoding initialization. + */ + MFX_EXTBUFF_VP8_CODING_OPTION = MFX_MAKEFOURCC('V','P','8','E'), +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +/*! Describes VP8 coding options. */ +typedef struct { + mfxExtBuffer Header; /*!< Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_VP8_CODING_OPTION. */ + + mfxU16 Version; /*!< Determines the bitstream version. Corresponds to the same VP8 syntax element in frame_tag. */ + mfxU16 EnableMultipleSegments; /*!< Set this option to ON to enable segmentation. This is tri-state option. See the CodingOptionValue + enumerator for values of this option. */ + mfxU16 LoopFilterType; /*!< Select the type of filter (normal or simple). Corresponds to VP8 syntax element filter_type. */ + mfxU16 LoopFilterLevel4; /*!< Controls the filter strength. Corresponds to VP8 syntax element loop_filter_level. */ + mfxU16 SharpnessLevel; /*!< Controls the filter sensitivity. Corresponds to VP8 syntax element sharpness_level. */ + mfxU16 NumTokenPartitions; /*!< Specifies number of token partitions in the coded frame. */ + mfxI16 LoopFilterRefTypeDelta4; /*!< Loop filter level delta for reference type (intra, last, golden, altref). */ + mfxI16 LoopFilterMbModeDelta4; /*!< Loop filter level delta for MB modes. */ + mfxI16 SegmentQPDelta4; /*!< QP delta for segment. */ + mfxI16 CoeffTypeQPDelta5; /*!< QP delta for coefficient type (YDC, Y2AC, Y2DC, UVAC, UVDC). */ + mfxU16 WriteIVFHeaders; /*!< Set this option to ON to enable insertion of IVF container headers into bitstream. This is tri-state + option. See the CodingOptionValue enumerator for values of this option */ + mfxU32 NumFramesForIVFHeader; /*!< Specifies number of frames for IVF header when WriteIVFHeaders is ON. */ + mfxU16 reserved223; +} mfxExtVP8CodingOption; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/linux
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/linux/device_ids.h
Added
@@ -0,0 +1,428 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_LINUX_DEVICE_IDS_H_ +#define DISPATCHER_LINUX_DEVICE_IDS_H_ + +// Tables from: +// https://github.com/Intel-Media-SDK/MediaSDK/blob/master/_studio/shared/src/libmfx_core_vaapi.cpp +// https://github.com/Intel-Media-SDK/MediaSDK/blob/master/_studio/shared/include/mfxstructures-int.h + +#include <algorithm> +#include <string> +#include <vector> + +enum eMFXHWType { + MFX_HW_UNKNOWN = 0, + MFX_HW_SNB = 0x300000, + + MFX_HW_IVB = 0x400000, + + MFX_HW_HSW = 0x500000, + MFX_HW_HSW_ULT = 0x500001, + + MFX_HW_VLV = 0x600000, + + MFX_HW_BDW = 0x700000, + + MFX_HW_CHT = 0x800000, + + MFX_HW_SCL = 0x900000, + + MFX_HW_APL = 0x1000000, + + MFX_HW_KBL = 0x1100000, + MFX_HW_GLK = MFX_HW_KBL + 1, + MFX_HW_CFL = MFX_HW_KBL + 2, + + MFX_HW_CNL = 0x1200000, + MFX_HW_ICL = 0x1400000, + MFX_HW_ICL_LP = MFX_HW_ICL + 1, + + MFX_HW_JSL = 0x1500001, + MFX_HW_EHL = 0x1500002, +}; + +enum eMFXGTConfig { MFX_GT_UNKNOWN = 0, MFX_GT1 = 1, MFX_GT2 = 2, MFX_GT3 = 3, MFX_GT4 = 4 }; + +typedef struct { + unsigned int device_id; + eMFXHWType platform; + eMFXGTConfig config; +} mfx_device_item; + +// list of legal dev ID for Intel's graphics +static const mfx_device_item listLegalDevIDs = { + /*IVB*/ + { 0x0156, MFX_HW_IVB, MFX_GT1 }, /* GT1 mobile */ + { 0x0166, MFX_HW_IVB, MFX_GT2 }, /* GT2 mobile */ + { 0x0152, MFX_HW_IVB, MFX_GT1 }, /* GT1 desktop */ + { 0x0162, MFX_HW_IVB, MFX_GT2 }, /* GT2 desktop */ + { 0x015a, MFX_HW_IVB, MFX_GT1 }, /* GT1 server */ + { 0x016a, MFX_HW_IVB, MFX_GT2 }, /* GT2 server */ + /*HSW*/ + { 0x0402, MFX_HW_HSW, MFX_GT1 }, /* GT1 desktop */ + { 0x0412, MFX_HW_HSW, MFX_GT2 }, /* GT2 desktop */ + { 0x0422, MFX_HW_HSW, MFX_GT2 }, /* GT2 desktop */ + { 0x041e, MFX_HW_HSW, MFX_GT2 }, /* Core i3-4130 */ + { 0x040a, MFX_HW_HSW, MFX_GT1 }, /* GT1 server */ + { 0x041a, MFX_HW_HSW, MFX_GT2 }, /* GT2 server */ + { 0x042a, MFX_HW_HSW, MFX_GT2 }, /* GT2 server */ + { 0x0406, MFX_HW_HSW, MFX_GT1 }, /* GT1 mobile */ + { 0x0416, MFX_HW_HSW, MFX_GT2 }, /* GT2 mobile */ + { 0x0426, MFX_HW_HSW, MFX_GT2 }, /* GT2 mobile */ + { 0x0C02, MFX_HW_HSW, MFX_GT1 }, /* SDV GT1 desktop */ + { 0x0C12, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 desktop */ + { 0x0C22, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 desktop */ + { 0x0C0A, MFX_HW_HSW, MFX_GT1 }, /* SDV GT1 server */ + { 0x0C1A, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 server */ + { 0x0C2A, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 server */ + { 0x0C06, MFX_HW_HSW, MFX_GT1 }, /* SDV GT1 mobile */ + { 0x0C16, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 mobile */ + { 0x0C26, MFX_HW_HSW, MFX_GT2 }, /* SDV GT2 mobile */ + { 0x0A02, MFX_HW_HSW, MFX_GT1 }, /* ULT GT1 desktop */ + { 0x0A12, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 desktop */ + { 0x0A22, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 desktop */ + { 0x0A0A, MFX_HW_HSW, MFX_GT1 }, /* ULT GT1 server */ + { 0x0A1A, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 server */ + { 0x0A2A, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 server */ + { 0x0A06, MFX_HW_HSW, MFX_GT1 }, /* ULT GT1 mobile */ + { 0x0A16, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 mobile */ + { 0x0A26, MFX_HW_HSW, MFX_GT2 }, /* ULT GT2 mobile */ + { 0x0D02, MFX_HW_HSW, MFX_GT1 }, /* CRW GT1 desktop */ + { 0x0D12, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 desktop */ + { 0x0D22, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 desktop */ + { 0x0D0A, MFX_HW_HSW, MFX_GT1 }, /* CRW GT1 server */ + { 0x0D1A, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 server */ + { 0x0D2A, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 server */ + { 0x0D06, MFX_HW_HSW, MFX_GT1 }, /* CRW GT1 mobile */ + { 0x0D16, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 mobile */ + { 0x0D26, MFX_HW_HSW, MFX_GT2 }, /* CRW GT2 mobile */ + /* this dev IDs added per HSD 5264859 request */ + { 0x040B, MFX_HW_HSW, MFX_GT1 }, + /*HASWELL_B_GT1 */ /* Reserved */ + { 0x041B, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_B_GT2*/ + { 0x042B, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_B_GT3*/ + { 0x040E, MFX_HW_HSW, MFX_GT1 }, + /*HASWELL_E_GT1*/ /* Reserved */ + { 0x041E, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_E_GT2*/ + { 0x042E, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_E_GT3*/ + + { 0x0C0B, MFX_HW_HSW, MFX_GT1 }, + /*HASWELL_SDV_B_GT1*/ /* Reserved */ + { 0x0C1B, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_SDV_B_GT2*/ + { 0x0C2B, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_SDV_B_GT3*/ + { 0x0C0E, MFX_HW_HSW, MFX_GT1 }, + /*HASWELL_SDV_B_GT1*/ /* Reserved */ + { 0x0C1E, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_SDV_B_GT2*/ + { 0x0C2E, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_SDV_B_GT3*/ + + { 0x0A0B, MFX_HW_HSW, MFX_GT1 }, + /*HASWELL_ULT_B_GT1*/ /* Reserved */ + { 0x0A1B, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_ULT_B_GT2*/ + { 0x0A2B, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_ULT_B_GT3*/ + { 0x0A0E, MFX_HW_HSW, MFX_GT1 }, + /*HASWELL_ULT_E_GT1*/ /* Reserved */ + { 0x0A1E, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_ULT_E_GT2*/ + { 0x0A2E, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_ULT_E_GT3*/ + + { 0x0D0B, MFX_HW_HSW, MFX_GT1 }, + /*HASWELL_CRW_B_GT1*/ /* Reserved */ + { 0x0D1B, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_CRW_B_GT2*/ + { 0x0D2B, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_CRW_B_GT3*/ + { 0x0D0E, MFX_HW_HSW, MFX_GT1 }, + /*HASWELL_CRW_E_GT1*/ /* Reserved */ + { 0x0D1E, MFX_HW_HSW, MFX_GT2 }, /*HASWELL_CRW_E_GT2*/ + { 0x0D2E, MFX_HW_HSW, MFX_GT3 }, /*HASWELL_CRW_E_GT3*/ + + /* VLV */ + { 0x0f30, MFX_HW_VLV, MFX_GT1 }, /* VLV mobile */ + { 0x0f31, MFX_HW_VLV, MFX_GT1 }, /* VLV mobile */ + { 0x0f32, MFX_HW_VLV, MFX_GT1 }, /* VLV mobile */ + { 0x0f33, MFX_HW_VLV, MFX_GT1 }, /* VLV mobile */ + { 0x0157, MFX_HW_VLV, MFX_GT1 }, + { 0x0155, MFX_HW_VLV, MFX_GT1 }, + + /* BDW */ + /*GT3: */ + { 0x162D, MFX_HW_BDW, MFX_GT3 }, + { 0x162A, MFX_HW_BDW, MFX_GT3 }, + /*GT2: */ + { 0x161D, MFX_HW_BDW, MFX_GT2 }, + { 0x161A, MFX_HW_BDW, MFX_GT2 }, + /* GT1: */ + { 0x160D, MFX_HW_BDW, MFX_GT1 }, + { 0x160A, MFX_HW_BDW, MFX_GT1 }, + /* BDW-ULT */ + /* (16x2 - ULT, 16x6 - ULT, 16xB - Iris, 16xE - ULX) */ + /*GT3: */ + { 0x162E, MFX_HW_BDW, MFX_GT3 }, + { 0x162B, MFX_HW_BDW, MFX_GT3 }, + { 0x1626, MFX_HW_BDW, MFX_GT3 }, + { 0x1622, MFX_HW_BDW, MFX_GT3 }, + { 0x1636, MFX_HW_BDW, MFX_GT3 }, /* ULT */ + { 0x163B, MFX_HW_BDW, MFX_GT3 }, /* Iris */ + { 0x163E, MFX_HW_BDW, MFX_GT3 }, /* ULX */ + { 0x1632, MFX_HW_BDW, MFX_GT3 }, /* ULT */ + { 0x163A, MFX_HW_BDW, MFX_GT3 }, /* Server */ + { 0x163D, MFX_HW_BDW, MFX_GT3 }, /* Workstation */ + + /* GT2: */ + { 0x161E, MFX_HW_BDW, MFX_GT2 }, + { 0x161B, MFX_HW_BDW, MFX_GT2 }, + { 0x1616, MFX_HW_BDW, MFX_GT2 }, + { 0x1612, MFX_HW_BDW, MFX_GT2 }, + /* GT1: */ + { 0x160E, MFX_HW_BDW, MFX_GT1 }, + { 0x160B, MFX_HW_BDW, MFX_GT1 }, + { 0x1606, MFX_HW_BDW, MFX_GT1 }, + { 0x1602, MFX_HW_BDW, MFX_GT1 }, + + /* CHT */ + { 0x22b0, MFX_HW_CHT, MFX_GT1 }, + { 0x22b1, MFX_HW_CHT, MFX_GT1 }, + { 0x22b2, MFX_HW_CHT, MFX_GT1 }, + { 0x22b3, MFX_HW_CHT, MFX_GT1 }, + + /* SCL */ + /* GT1F */ + { 0x1902, MFX_HW_SCL, MFX_GT1 }, // DT, 2x1F, 510 + { 0x1906, MFX_HW_SCL, MFX_GT1 }, // U-ULT, 2x1F, 510 + { 0x190A, MFX_HW_SCL, MFX_GT1 }, // Server, 4x1F + { 0x190B, MFX_HW_SCL, MFX_GT1 }, + { 0x190E, MFX_HW_SCL, MFX_GT1 }, // Y-ULX 2x1F + /*GT1.5*/ + { 0x1913, MFX_HW_SCL, MFX_GT1 }, // U-ULT, 2x1.5 + { 0x1915, MFX_HW_SCL, MFX_GT1 }, // Y-ULX, 2x1.5 + { 0x1917, MFX_HW_SCL, MFX_GT1 }, // DT, 2x1.5 + /* GT2 */ + { 0x1912, MFX_HW_SCL, MFX_GT2 }, // DT, 2x2, 530 + { 0x1916, MFX_HW_SCL, MFX_GT2 }, // U-ULD 2x2, 520 + { 0x191A, MFX_HW_SCL, MFX_GT2 }, // 2x2,4x2, Server + { 0x191B, MFX_HW_SCL, MFX_GT2 }, // DT, 2x2, 530 + { 0x191D, MFX_HW_SCL, MFX_GT2 }, // 4x2, WKS, P530 + { 0x191E, MFX_HW_SCL, MFX_GT2 }, // Y-ULX, 2x2, P510,515 + { 0x1921, MFX_HW_SCL, MFX_GT2 }, // U-ULT, 2x2F, 540 + /* GT3 */ + { 0x1923, MFX_HW_SCL, MFX_GT3 }, // U-ULT, 2x3, 535 + { 0x1926, MFX_HW_SCL, MFX_GT3 }, // U-ULT, 2x3, 540 (15W) + { 0x1927, MFX_HW_SCL, MFX_GT3 }, // U-ULT, 2x3e, 550 (28W) + { 0x192A, MFX_HW_SCL, MFX_GT3 }, // Server, 2x3 + { 0x192B, MFX_HW_SCL, MFX_GT3 }, // Halo 3e + { 0x192D, MFX_HW_SCL, MFX_GT3 }, + /* GT4e*/ + { 0x1932, MFX_HW_SCL, MFX_GT4 }, // DT + { 0x193A, MFX_HW_SCL, MFX_GT4 }, // SRV + { 0x193B, MFX_HW_SCL, MFX_GT4 }, // Halo + { 0x193D, MFX_HW_SCL, MFX_GT4 }, // WKS + + /* APL */ + { 0x0A84, MFX_HW_APL, MFX_GT1 }, + { 0x0A85, MFX_HW_APL, MFX_GT1 }, + { 0x0A86, MFX_HW_APL, MFX_GT1 }, + { 0x0A87, MFX_HW_APL, MFX_GT1 }, + { 0x1A84, MFX_HW_APL, MFX_GT1 }, + { 0x1A85, MFX_HW_APL, MFX_GT1 }, + { 0x5A84, MFX_HW_APL, MFX_GT1 }, + { 0x5A85, MFX_HW_APL, MFX_GT1 }, + + /* KBL */ + { 0x5902, MFX_HW_KBL, MFX_GT1 }, // DT GT1 + { 0x5906, MFX_HW_KBL, MFX_GT1 }, // ULT GT1 + { 0x5908, MFX_HW_KBL, MFX_GT1 }, // HALO GT1F + { 0x590A, MFX_HW_KBL, MFX_GT1 }, // SERV GT1 + { 0x590B, MFX_HW_KBL, MFX_GT1 }, // HALO GT1 + { 0x590E, MFX_HW_KBL, MFX_GT1 }, // ULX GT1 + { 0x5912, MFX_HW_KBL, MFX_GT2 }, // DT GT2 + { 0x5913, MFX_HW_KBL, MFX_GT1 }, // ULT GT1 5 + { 0x5915, MFX_HW_KBL, MFX_GT1 }, // ULX GT1 5 + { 0x5916, MFX_HW_KBL, MFX_GT2 }, // ULT GT2 + { 0x5917, MFX_HW_KBL, MFX_GT2 }, // ULT GT2 R + { 0x591A, MFX_HW_KBL, MFX_GT2 }, // SERV GT2 + { 0x591B, MFX_HW_KBL, MFX_GT2 }, // HALO GT2 + { 0x591C, MFX_HW_KBL, MFX_GT2 }, // ULX GT2 + { 0x591D, MFX_HW_KBL, MFX_GT2 }, // WRK GT2 + { 0x591E, MFX_HW_KBL, MFX_GT2 }, // ULX GT2 + { 0x5921, MFX_HW_KBL, MFX_GT2 }, // ULT GT2F + { 0x5923, MFX_HW_KBL, MFX_GT3 }, // ULT GT3 + { 0x5926, MFX_HW_KBL, MFX_GT3 }, // ULT GT3 15W + { 0x5927, MFX_HW_KBL, MFX_GT3 }, // ULT GT3 28W + { 0x592A, MFX_HW_KBL, MFX_GT3 }, // SERV GT3 + { 0x592B, MFX_HW_KBL, MFX_GT3 }, // HALO GT3 + { 0x5932, MFX_HW_KBL, MFX_GT4 }, // DT GT4 + { 0x593A, MFX_HW_KBL, MFX_GT4 }, // SERV GT4 + { 0x593B, MFX_HW_KBL, MFX_GT4 }, // HALO GT4 + { 0x593D, MFX_HW_KBL, MFX_GT4 }, // WRK GT4 + { 0x87C0, MFX_HW_KBL, MFX_GT2 }, // ULX GT2 + + /* GLK */ + { 0x3184, MFX_HW_GLK, MFX_GT1 }, + { 0x3185, MFX_HW_GLK, MFX_GT1 }, + + /* CFL */ + { 0x3E90, MFX_HW_CFL, MFX_GT1 }, + { 0x3E91, MFX_HW_CFL, MFX_GT2 }, + { 0x3E92, MFX_HW_CFL, MFX_GT2 }, + { 0x3E93, MFX_HW_CFL, MFX_GT1 }, + { 0x3E94, MFX_HW_CFL, MFX_GT2 }, + { 0x3E96, MFX_HW_CFL, MFX_GT2 }, + { 0x3E98, MFX_HW_CFL, MFX_GT2 }, + { 0x3E99, MFX_HW_CFL, MFX_GT1 }, + { 0x3E9A, MFX_HW_CFL, MFX_GT2 }, + { 0x3E9C, MFX_HW_CFL, MFX_GT1 }, + { 0x3E9B, MFX_HW_CFL, MFX_GT2 }, + { 0x3EA5, MFX_HW_CFL, MFX_GT3 }, + { 0x3EA6, MFX_HW_CFL, MFX_GT3 }, + { 0x3EA7, MFX_HW_CFL, MFX_GT3 }, + { 0x3EA8, MFX_HW_CFL, MFX_GT3 }, + { 0x3EA9, MFX_HW_CFL, MFX_GT2 }, + { 0x87CA, MFX_HW_CFL, MFX_GT2 }, + + /* WHL */ + { 0x3EA0, MFX_HW_CFL, MFX_GT2 }, + { 0x3EA1, MFX_HW_CFL, MFX_GT1 }, + { 0x3EA2, MFX_HW_CFL, MFX_GT3 }, + { 0x3EA3, MFX_HW_CFL, MFX_GT2 }, + { 0x3EA4, MFX_HW_CFL, MFX_GT1 }, + + /* CML GT1 */ + { 0x9b21, MFX_HW_CFL, MFX_GT1 }, + { 0x9baa, MFX_HW_CFL, MFX_GT1 }, + { 0x9bab, MFX_HW_CFL, MFX_GT1 }, + { 0x9bac, MFX_HW_CFL, MFX_GT1 }, + { 0x9ba0, MFX_HW_CFL, MFX_GT1 }, + { 0x9ba5, MFX_HW_CFL, MFX_GT1 }, + { 0x9ba8, MFX_HW_CFL, MFX_GT1 }, + { 0x9ba4, MFX_HW_CFL, MFX_GT1 }, + { 0x9ba2, MFX_HW_CFL, MFX_GT1 }, + + /* CML GT2 */ + { 0x9b41, MFX_HW_CFL, MFX_GT2 }, + { 0x9bca, MFX_HW_CFL, MFX_GT2 }, + { 0x9bcb, MFX_HW_CFL, MFX_GT2 }, + { 0x9bcc, MFX_HW_CFL, MFX_GT2 }, + { 0x9bc0, MFX_HW_CFL, MFX_GT2 }, + { 0x9bc5, MFX_HW_CFL, MFX_GT2 }, + { 0x9bc8, MFX_HW_CFL, MFX_GT2 }, + { 0x9bc4, MFX_HW_CFL, MFX_GT2 }, + { 0x9bc2, MFX_HW_CFL, MFX_GT2 }, + { 0x9bc6, MFX_HW_CFL, MFX_GT2 }, + { 0x9be6, MFX_HW_CFL, MFX_GT2 }, + { 0x9bf6, MFX_HW_CFL, MFX_GT2 }, + + /* CNL */ + { 0x5A51, MFX_HW_CNL, MFX_GT2 }, + { 0x5A52, MFX_HW_CNL, MFX_GT2 }, + { 0x5A5A, MFX_HW_CNL, MFX_GT2 }, + { 0x5A40, MFX_HW_CNL, MFX_GT2 }, + { 0x5A42, MFX_HW_CNL, MFX_GT2 }, + { 0x5A4A, MFX_HW_CNL, MFX_GT2 }, + { 0x5A4C, MFX_HW_CNL, MFX_GT1 }, + { 0x5A50, MFX_HW_CNL, MFX_GT2 }, + { 0x5A54, MFX_HW_CNL, MFX_GT1 }, + { 0x5A59, MFX_HW_CNL, MFX_GT2 }, + { 0x5A5C, MFX_HW_CNL, MFX_GT1 }, + { 0x5A41, MFX_HW_CNL, MFX_GT2 }, + { 0x5A44, MFX_HW_CNL, MFX_GT1 }, + { 0x5A49, MFX_HW_CNL, MFX_GT2 }, + + /* ICL LP */ + { 0xFF05, MFX_HW_ICL_LP, MFX_GT1 }, + { 0x8A50, MFX_HW_ICL_LP, MFX_GT2 }, + { 0x8A51, MFX_HW_ICL_LP, MFX_GT2 }, + { 0x8A52, MFX_HW_ICL_LP, MFX_GT2 }, + { 0x8A53, MFX_HW_ICL_LP, MFX_GT2 }, + { 0x8A54, MFX_HW_ICL_LP, MFX_GT1 }, + { 0x8A56, MFX_HW_ICL_LP, MFX_GT1 }, + { 0x8A57, MFX_HW_ICL_LP, MFX_GT1 }, + { 0x8A58, MFX_HW_ICL_LP, MFX_GT1 }, + { 0x8A59, MFX_HW_ICL_LP, MFX_GT1 }, + { 0x8A5A, MFX_HW_ICL_LP, MFX_GT1 }, + { 0x8A5B, MFX_HW_ICL_LP, MFX_GT1 }, + { 0x8A5C, MFX_HW_ICL_LP, MFX_GT1 }, + { 0x8A5D, MFX_HW_ICL_LP, MFX_GT1 }, + { 0x8A70, MFX_HW_ICL_LP, MFX_GT1 }, + { 0x8A71, MFX_HW_ICL_LP, MFX_GT1 }, // GT05, but 1 ok in this context + + /* JSL */ + { 0x4E51, MFX_HW_JSL, MFX_GT2 }, + { 0x4E55, MFX_HW_JSL, MFX_GT2 }, + { 0x4E61, MFX_HW_JSL, MFX_GT2 }, + { 0x4E71, MFX_HW_JSL, MFX_GT2 }, + + /* EHL */ + { 0x4500, MFX_HW_EHL, MFX_GT2 }, + { 0x4541, MFX_HW_EHL, MFX_GT2 }, + { 0x4551, MFX_HW_EHL, MFX_GT2 }, + { 0x4555, MFX_HW_EHL, MFX_GT2 }, + { 0x4569, MFX_HW_EHL, MFX_GT2 }, + { 0x4571, MFX_HW_EHL, MFX_GT2 }, +}; + +typedef struct { + unsigned int vendor_id; + unsigned int device_id; + eMFXHWType platform; +} Device; + +static inline eMFXHWType get_platform(unsigned int device_id) { + for (unsigned i = 0; i < sizeof(listLegalDevIDs) / sizeof(listLegalDevIDs0); ++i) { + if (listLegalDevIDsi.device_id == device_id) { + return listLegalDevIDsi.platform; + } + } + return MFX_HW_UNKNOWN; +} + +static mfxStatus get_devices(std::vector<Device> &allDevices) { + const char *dir = "/sys/class/drm"; + const char *device_id_file = "/device/device"; + const char *vendor_id_file = "/device/vendor"; + + int i = 0; + for (; i < 64; ++i) { + int ret; + Device device; + std::string path = std::string(dir) + "/renderD" + std::to_string(128 + i) + vendor_id_file; + + FILE *file = fopen(path.c_str(), "r"); + if (!file) + continue; + ret = fscanf(file, "%x", &device.vendor_id); + fclose(file); + if (ret != 1) + continue; + + // Filter out non-Intel devices + if (device.vendor_id != 0x8086) + continue; + + path = std::string(dir) + "/renderD" + std::to_string(128 + i) + device_id_file; + file = fopen(path.c_str(), "r"); + if (!file) + continue; + ret = fscanf(file, "%x", &device.device_id); + fclose(file); + if (ret != 1) + continue; + + device.platform = get_platform(device.device_id); + + allDevices.emplace_back(device); + } + + // sort by platform, unknown will appear at beginning + std::sort(allDevices.begin(), allDevices.end(), (const Device &a, const Device &b) { + return a.platform < b.platform; + }); + + if (allDevices.size() == 0) + return MFX_ERR_NOT_FOUND; + + return MFX_ERR_NONE; +} + +#endif // DISPATCHER_LINUX_DEVICE_IDS_H_ \ No newline at end of file
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/linux/libvpl.map
Added
@@ -0,0 +1,81 @@ +LIBVPL_2.0 { + global: + MFXInit; + MFXClose; + MFXQueryIMPL; + MFXQueryVersion; + + MFXJoinSession; + MFXDisjoinSession; + MFXCloneSession; + MFXSetPriority; + MFXGetPriority; + + MFXVideoCORE_SetFrameAllocator; + MFXVideoCORE_SetHandle; + MFXVideoCORE_GetHandle; + MFXVideoCORE_QueryPlatform; + MFXVideoCORE_SyncOperation; + + MFXVideoENCODE_Query; + MFXVideoENCODE_QueryIOSurf; + MFXVideoENCODE_Init; + MFXVideoENCODE_Reset; + MFXVideoENCODE_Close; + MFXVideoENCODE_GetVideoParam; + MFXVideoENCODE_GetEncodeStat; + MFXVideoENCODE_EncodeFrameAsync; + + MFXVideoDECODE_Query; + MFXVideoDECODE_DecodeHeader; + MFXVideoDECODE_QueryIOSurf; + MFXVideoDECODE_Init; + MFXVideoDECODE_Reset; + MFXVideoDECODE_Close; + MFXVideoDECODE_GetVideoParam; + MFXVideoDECODE_GetDecodeStat; + MFXVideoDECODE_SetSkipMode; + MFXVideoDECODE_GetPayload; + MFXVideoDECODE_DecodeFrameAsync; + + MFXVideoVPP_Query; + MFXVideoVPP_QueryIOSurf; + MFXVideoVPP_Init; + MFXVideoVPP_Reset; + MFXVideoVPP_Close; + + MFXVideoVPP_GetVideoParam; + MFXVideoVPP_GetVPPStat; + MFXVideoVPP_RunFrameVPPAsync; + + MFXInitEx; + + MFXLoad; + MFXUnload; + MFXCreateConfig; + MFXSetConfigFilterProperty; + MFXEnumImplementations; + MFXCreateSession; + MFXDispReleaseImplDescription; + + MFXMemory_GetSurfaceForVPP; + MFXMemory_GetSurfaceForEncode; + MFXMemory_GetSurfaceForDecode; + + local: + *; +}; + +LIBVPL_2.1 { + global: + MFXMemory_GetSurfaceForVPPOut; + MFXVideoDECODE_VPP_Init; + MFXVideoDECODE_VPP_DecodeFrameAsync; + MFXVideoDECODE_VPP_Reset; + MFXVideoDECODE_VPP_GetChannelParam; + MFXVideoDECODE_VPP_Close; + MFXVideoVPP_ProcessFrameAsync; + + local: + *; +} LIBVPL_2.0;
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/linux/mfxloader.cpp
Added
@@ -0,0 +1,804 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include <assert.h> +#include <dlfcn.h> +#include <string.h> +#include <unistd.h> + +#include <algorithm> +#include <list> +#include <memory> +#include <mutex> +#include <utility> +#include <vector> + +#include "vpl/mfxvideo.h" + +#include "linux/device_ids.h" +#include "linux/mfxloader.h" + +namespace MFX { + +#if defined(__x86_64__) + #define LIBMFXSW "libmfxsw64.so.1" + #define LIBMFXHW "libmfxhw64.so.1" + + #define ONEVPLSW "libvplswref64.so.1" + #define ONEVPLHW "libmfx-gen.so.1.2" +#else + #error Unsupported architecture +#endif + +#undef FUNCTION +#define FUNCTION(return_value, func_name, formal_param_list, actual_param_list) e##func_name, + +enum Function { + eMFXInit, + eMFXInitEx, + eMFXClose, + eMFXJoinSession, +#include "linux/mfxvideo_functions.h" + eFunctionsNum, + eNoMoreFunctions = eFunctionsNum +}; + +// new functions for API 2.x +enum Function2 { + // 2.0 + eMFXQueryImplsDescription = 0, + eMFXReleaseImplDescription, + eMFXMemory_GetSurfaceForVPP, + eMFXMemory_GetSurfaceForEncode, + eMFXMemory_GetSurfaceForDecode, + eMFXInitialize, + + // 2.1 + eMFXMemory_GetSurfaceForVPPOut, + eMFXVideoDECODE_VPP_Init, + eMFXVideoDECODE_VPP_DecodeFrameAsync, + eMFXVideoDECODE_VPP_Reset, + eMFXVideoDECODE_VPP_GetChannelParam, + eMFXVideoDECODE_VPP_Close, + eMFXVideoVPP_ProcessFrameAsync, + + eFunctionsNum2, +}; + +struct FunctionsTable { + Function id; + const char *name; + mfxVersion version; +}; + +struct FunctionsTable2 { + Function2 id; + const char *name; + mfxVersion version; +}; + +#define VERSION(major, minor) \ + { \ + { minor, major } \ + } + +#undef FUNCTION +#define FUNCTION(return_value, func_name, formal_param_list, actual_param_list) \ + { e##func_name, #func_name, API_VERSION }, + +static const FunctionsTable g_mfxFuncTable = { + { eMFXInit, "MFXInit", VERSION(1, 0) }, + { eMFXInitEx, "MFXInitEx", VERSION(1, 14) }, + { eMFXClose, "MFXClose", VERSION(1, 0) }, + { eMFXJoinSession, "MFXJoinSession", VERSION(1, 1) }, +#include "linux/mfxvideo_functions.h" // NOLINT(build/include) + { eNoMoreFunctions } +}; + +static const FunctionsTable2 g_mfxFuncTable2 = { + { eMFXQueryImplsDescription, "MFXQueryImplsDescription", VERSION(2, 0) }, + { eMFXReleaseImplDescription, "MFXReleaseImplDescription", VERSION(2, 0) }, + { eMFXMemory_GetSurfaceForVPP, "MFXMemory_GetSurfaceForVPP", VERSION(2, 0) }, + { eMFXMemory_GetSurfaceForEncode, "MFXMemory_GetSurfaceForEncode", VERSION(2, 0) }, + { eMFXMemory_GetSurfaceForDecode, "MFXMemory_GetSurfaceForDecode", VERSION(2, 0) }, + { eMFXInitialize, "MFXInitialize", VERSION(2, 0) }, + + { eMFXMemory_GetSurfaceForVPPOut, "MFXMemory_GetSurfaceForVPPOut", VERSION(2, 1) }, + { eMFXVideoDECODE_VPP_Init, "MFXVideoDECODE_VPP_Init", VERSION(2, 1) }, + { eMFXVideoDECODE_VPP_DecodeFrameAsync, "MFXVideoDECODE_VPP_DecodeFrameAsync", VERSION(2, 1) }, + { eMFXVideoDECODE_VPP_Reset, "MFXVideoDECODE_VPP_Reset", VERSION(2, 1) }, + { eMFXVideoDECODE_VPP_GetChannelParam, "MFXVideoDECODE_VPP_GetChannelParam", VERSION(2, 1) }, + { eMFXVideoDECODE_VPP_Close, "MFXVideoDECODE_VPP_Close", VERSION(2, 1) }, + { eMFXVideoVPP_ProcessFrameAsync, "MFXVideoVPP_ProcessFrameAsync", VERSION(2, 1) }, +}; + +class LoaderCtx { +public: + mfxStatus Init(mfxInitParam &par, + mfxInitializationParam &vplParam, + mfxU16 *pDeviceID, + char *dllName, + bool bCloneSession = false); + mfxStatus Close(); + + inline void *getFunction(Function func) const { + return m_tablefunc; + } + + inline void *getFunction2(Function2 func) const { + return m_table2func; + } + + inline mfxSession getSession() const { + return m_session; + } + + inline mfxIMPL getImpl() const { + return m_implementation; + } + + inline mfxVersion getVersion() const { + return m_version; + } + + inline void *getHandle() const { + return m_dlh.get(); + } + + inline const char *getLibPath() const { + return m_libToLoad.c_str(); + } + + // special operations to set session pointer and version from MFXCloneSession() + inline void setSession(const mfxSession session) { + m_session = session; + } + + inline void setVersion(const mfxVersion version) { + m_version = version; + } + +private: + std::shared_ptr<void> m_dlh; + mfxVersion m_version{}; + mfxIMPL m_implementation{}; + mfxSession m_session = nullptr; + void *m_tableeFunctionsNum{}; + void *m_table2eFunctionsNum2{}; + std::string m_libToLoad; +}; + +std::shared_ptr<void> make_dlopen(const char *filename, int flags) { + return std::shared_ptr<void>(dlopen(filename, flags), (void *handle) { + if (handle) + dlclose(handle); + }); +} + +mfxStatus LoaderCtx::Init(mfxInitParam &par, + mfxInitializationParam &vplParam, + mfxU16 *pDeviceID, + char *dllName, + bool bCloneSession) { + mfxStatus mfx_res = MFX_ERR_NONE; + + std::vector<std::string> libs; + std::vector<Device> devices; + eMFXHWType msdk_platform; + + // query graphics device_id + // if it is found on list of legacy devices, load MSDK RT + // otherwise load oneVPL RT + mfxU16 deviceID = 0; + mfx_res = get_devices(devices); + if (mfx_res == MFX_ERR_NOT_FOUND) { + // query failed + msdk_platform = MFX_HW_UNKNOWN; + } + else { + // query succeeded: + // may be a valid platform from listLegalDevIDs or MFX_HW_UNKNOWN + // if underlying device_id is unrecognized (i.e. new platform) + msdk_platform = devices0.platform; + deviceID = devices0.device_id; + } + + if (pDeviceID) + *pDeviceID = deviceID; + + if (dllName) { + // attempt to load only this DLL, fail if unsuccessful + // this may also be used later by MFXCloneSession() + m_libToLoad = dllName; + libs.emplace_back(m_libToLoad); + } + else { + mfxIMPL implType = MFX_IMPL_BASETYPE(par.Implementation); + // add HW lib + if (implType == MFX_IMPL_AUTO || implType == MFX_IMPL_AUTO_ANY || + (implType & MFX_IMPL_HARDWARE) || (implType & MFX_IMPL_HARDWARE_ANY)) { + if (msdk_platform == MFX_HW_UNKNOWN) { + // if not on list of known MSDK platforms, prefer oneVPL + libs.emplace_back(ONEVPLHW); + libs.emplace_back(MFX_MODULES_DIR "/" ONEVPLHW); + } + + // use MSDK (fallback if oneVPL is not installed) + libs.emplace_back(LIBMFXHW); + libs.emplace_back(MFX_MODULES_DIR "/" LIBMFXHW); + } + + // add SW lib (oneVPL only) + if (implType == MFX_IMPL_AUTO || implType == MFX_IMPL_AUTO_ANY || + (implType & MFX_IMPL_SOFTWARE)) { + libs.emplace_back(ONEVPLSW); + libs.emplace_back(MFX_MODULES_DIR "/" ONEVPLSW); + } + } + + // fail if libs is empty (invalid Implementation) + mfx_res = MFX_ERR_UNSUPPORTED; + + for (auto &lib : libs) { + std::shared_ptr<void> hdl = make_dlopen(lib.c_str(), RTLD_LOCAL | RTLD_NOW); + if (hdl) { + do { + /* Loading functions table */ + bool wrong_version = false; + for (int i = 0; i < eFunctionsNum; ++i) { + assert(i == g_mfxFuncTablei.id); + m_tablei = dlsym(hdl.get(), g_mfxFuncTablei.name); + if (!m_tablei && ((g_mfxFuncTablei.version <= par.Version))) { + wrong_version = true; + break; + } + } + + // if version >= 2.0, load these functions as well + if (par.Version.Major >= 2) { + for (int i = 0; i < eFunctionsNum2; ++i) { + assert(i == g_mfxFuncTable2i.id); + m_table2i = dlsym(hdl.get(), g_mfxFuncTable2i.name); + if (!m_table2i && (g_mfxFuncTable2i.version <= par.Version)) { + wrong_version = true; + break; + } + } + } + + if (wrong_version) { + mfx_res = MFX_ERR_UNSUPPORTED; + break; + } + + if (bCloneSession == true) { + // success - exit loop since caller will create session with MFXCloneSession() + mfx_res = MFX_ERR_NONE; + break; + } + + if (par.Version.Major >= 2) { + // for API >= 2.0 call MFXInitialize instead of MFXInitEx + mfx_res = + ((decltype(MFXInitialize) *)m_table2eMFXInitialize)(vplParam, &m_session); + } + else { + if (m_tableeMFXInitEx) { + // initialize with MFXInitEx if present (API >= 1.14) + mfx_res = ((decltype(MFXInitEx) *)m_tableeMFXInitEx)(par, &m_session); + } + else { + // initialize with MFXInit for API < 1.14 + mfx_res = ((decltype(MFXInit) *)m_tableeMFXInit)(par.Implementation, + &(par.Version), + &m_session); + } + } + + if (MFX_ERR_NONE != mfx_res) { + break; + } + + // Below we just get some data and double check that we got what we have expected + // to get. Some of these checks are done inside mediasdk init function + mfx_res = + ((decltype(MFXQueryVersion) *)m_tableeMFXQueryVersion)(m_session, &m_version); + if (MFX_ERR_NONE != mfx_res) { + break; + } + + if (m_version < par.Version) { + mfx_res = MFX_ERR_UNSUPPORTED; + break; + } + + mfx_res = ((decltype(MFXQueryIMPL) *)m_tableeMFXQueryIMPL)(m_session, + &m_implementation); + if (MFX_ERR_NONE != mfx_res) { + mfx_res = MFX_ERR_UNSUPPORTED; + break; + } + } while (false); + + if (MFX_ERR_NONE == mfx_res) { + m_dlh = std::move(hdl); + break; + } + else { + Close(); + } + } + } + + return mfx_res; +} + +mfxStatus LoaderCtx::Close() { + auto proc = (decltype(MFXClose) *)m_tableeMFXClose; + mfxStatus mfx_res = (proc) ? (*proc)(m_session) : MFX_ERR_NONE; + + m_implementation = {}; + m_version = {}; + m_session = nullptr; + std::fill(std::begin(m_table), std::end(m_table), nullptr); + return mfx_res; +} + +} // namespace MFX + +// internal function - load a specific DLL, return unsupported if it fails +// vplParam is required for API >= 2.0 (load via MFXInitialize) +mfxStatus MFXInitEx2(mfxVersion version, + mfxInitializationParam vplParam, + mfxIMPL hwImpl, + mfxSession *session, + mfxU16 *deviceID, + char *dllName) { + if (!session) + return MFX_ERR_NULL_PTR; + + *deviceID = 0; + + // fill minimal 1.x parameters for Init to choose correct initialization path + mfxInitParam par = {}; + par.Version = version; + + // select first adapter if not specified + // only relevant for MSDK-via-MFXLoad path + if (!hwImpl) + hwImpl = MFX_IMPL_HARDWARE; + + switch (vplParam.AccelerationMode) { + case MFX_ACCEL_MODE_NA: + par.Implementation = MFX_IMPL_SOFTWARE; + break; + case MFX_ACCEL_MODE_VIA_D3D9: + par.Implementation = hwImpl | MFX_IMPL_VIA_D3D9; + break; + case MFX_ACCEL_MODE_VIA_D3D11: + par.Implementation = hwImpl | MFX_IMPL_VIA_D3D11; + break; + case MFX_ACCEL_MODE_VIA_VAAPI: + par.Implementation = hwImpl | MFX_IMPL_VIA_VAAPI; + break; + default: + par.Implementation = hwImpl; + break; + } + + // also pass extBuf array (if any) to MFXInitEx for 1.x API + par.NumExtParam = vplParam.NumExtParam; + par.ExtParam = (vplParam.NumExtParam ? vplParam.ExtParam : nullptr); + +#ifdef ONEVPL_EXPERIMENTAL + // if GPUCopy is enabled via MFXSetConfigProperty(DeviceCopy), set corresponding + // flag in mfxInitParam for legacy RTs + par.GPUCopy = vplParam.DeviceCopy; +#endif + + try { + std::unique_ptr<MFX::LoaderCtx> loader; + + loader.reset(new MFX::LoaderCtx{}); + + mfxStatus mfx_res = loader->Init(par, vplParam, deviceID, dllName); + if (MFX_ERR_NONE == mfx_res) { + *session = (mfxSession)loader.release(); + } + else { + *session = nullptr; + } + + return mfx_res; + } + catch (...) { + return MFX_ERR_MEMORY_ALLOC; + } +} + +#ifdef __cplusplus +extern "C" { +#endif + +mfxStatus MFXInit(mfxIMPL impl, mfxVersion *ver, mfxSession *session) { + mfxInitParam par{}; + + par.Implementation = impl; + if (ver) { + par.Version = *ver; + } + else { + par.Version = VERSION(MFX_VERSION_MAJOR, MFX_VERSION_MINOR); + } + + return MFXInitEx(par, session); +} + +mfxStatus MFXInitEx(mfxInitParam par, mfxSession *session) { + if (!session) + return MFX_ERR_NULL_PTR; + + const mfxIMPL implMethod = par.Implementation & (MFX_IMPL_VIA_ANY - 1); + mfxInitializationParam vplParam = {}; + if (implMethod == MFX_IMPL_SOFTWARE) { + vplParam.AccelerationMode = MFX_ACCEL_MODE_NA; + } + else { + vplParam.AccelerationMode = MFX_ACCEL_MODE_VIA_VAAPI; + } + + try { + std::unique_ptr<MFX::LoaderCtx> loader; + + loader.reset(new MFX::LoaderCtx{}); + + mfxStatus mfx_res = loader->Init(par, vplParam, nullptr, nullptr); + if (MFX_ERR_NONE == mfx_res) { + *session = (mfxSession)loader.release(); + } + else { + *session = nullptr; + } + + return mfx_res; + } + catch (...) { + return MFX_ERR_MEMORY_ALLOC; + } +} + +mfxStatus MFXClose(mfxSession session) { + if (!session) + return MFX_ERR_INVALID_HANDLE; + + try { + std::unique_ptr<MFX::LoaderCtx> loader((MFX::LoaderCtx *)session); + mfxStatus mfx_res = loader->Close(); + + if (mfx_res == MFX_ERR_UNDEFINED_BEHAVIOR) { + // It is possible, that there is an active child session. + // Can't unload library in this case. + loader.release(); + } + return mfx_res; + } + catch (...) { + return MFX_ERR_MEMORY_ALLOC; + } +} + +// passthrough functions to implementation +mfxStatus MFXMemory_GetSurfaceForVPP(mfxSession session, mfxFrameSurface1 **surface) { + if (!session) + return MFX_ERR_INVALID_HANDLE; + + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; + + auto proc = (decltype(MFXMemory_GetSurfaceForVPP) *)loader->getFunction2( + MFX::eMFXMemory_GetSurfaceForVPP); + if (!proc) { + return MFX_ERR_INVALID_HANDLE; + } + + return (*proc)(loader->getSession(), surface); +} + +mfxStatus MFXMemory_GetSurfaceForVPPOut(mfxSession session, mfxFrameSurface1 **surface) { + if (!session) + return MFX_ERR_INVALID_HANDLE; + + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; + + auto proc = (decltype(MFXMemory_GetSurfaceForVPPOut) *)loader->getFunction2( + MFX::eMFXMemory_GetSurfaceForVPPOut); + if (!proc) { + return MFX_ERR_INVALID_HANDLE; + } + + return (*proc)(loader->getSession(), surface); +} + +mfxStatus MFXMemory_GetSurfaceForEncode(mfxSession session, mfxFrameSurface1 **surface) { + if (!session) + return MFX_ERR_INVALID_HANDLE; + + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; + + auto proc = (decltype(MFXMemory_GetSurfaceForEncode) *)loader->getFunction2( + MFX::eMFXMemory_GetSurfaceForEncode); + if (!proc) { + return MFX_ERR_INVALID_HANDLE; + } + + return (*proc)(loader->getSession(), surface); +} + +mfxStatus MFXMemory_GetSurfaceForDecode(mfxSession session, mfxFrameSurface1 **surface) { + if (!session) + return MFX_ERR_INVALID_HANDLE; + + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; + + auto proc = (decltype(MFXMemory_GetSurfaceForDecode) *)loader->getFunction2( + MFX::eMFXMemory_GetSurfaceForDecode); + if (!proc) { + return MFX_ERR_INVALID_HANDLE; + } + + return (*proc)(loader->getSession(), surface); +} + +mfxStatus MFXVideoDECODE_VPP_Init(mfxSession session, + mfxVideoParam *decode_par, + mfxVideoChannelParam **vpp_par_array, + mfxU32 num_vpp_par) { + if (!session) + return MFX_ERR_INVALID_HANDLE; + + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; + + auto proc = + (decltype(MFXVideoDECODE_VPP_Init) *)loader->getFunction2(MFX::eMFXVideoDECODE_VPP_Init); + if (!proc) { + return MFX_ERR_INVALID_HANDLE; + } + + return (*proc)(loader->getSession(), decode_par, vpp_par_array, num_vpp_par); +} + +mfxStatus MFXVideoDECODE_VPP_DecodeFrameAsync(mfxSession session, + mfxBitstream *bs, + mfxU32 *skip_channels, + mfxU32 num_skip_channels, + mfxSurfaceArray **surf_array_out) { + if (!session) + return MFX_ERR_INVALID_HANDLE; + + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; + + auto proc = (decltype(MFXVideoDECODE_VPP_DecodeFrameAsync) *)loader->getFunction2( + MFX::eMFXVideoDECODE_VPP_DecodeFrameAsync); + if (!proc) { + return MFX_ERR_INVALID_HANDLE; + } + + return (*proc)(loader->getSession(), bs, skip_channels, num_skip_channels, surf_array_out); +} + +mfxStatus MFXVideoDECODE_VPP_Reset(mfxSession session, + mfxVideoParam *decode_par, + mfxVideoChannelParam **vpp_par_array, + mfxU32 num_vpp_par) { + if (!session) + return MFX_ERR_INVALID_HANDLE; + + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; + + auto proc = + (decltype(MFXVideoDECODE_VPP_Reset) *)loader->getFunction2(MFX::eMFXVideoDECODE_VPP_Reset); + if (!proc) { + return MFX_ERR_INVALID_HANDLE; + } + + return (*proc)(loader->getSession(), decode_par, vpp_par_array, num_vpp_par); +} + +mfxStatus MFXVideoDECODE_VPP_GetChannelParam(mfxSession session, + mfxVideoChannelParam *par, + mfxU32 channel_id) { + if (!session) + return MFX_ERR_INVALID_HANDLE; + + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; + + auto proc = (decltype(MFXVideoDECODE_VPP_GetChannelParam) *)loader->getFunction2( + MFX::eMFXVideoDECODE_VPP_GetChannelParam); + if (!proc) { + return MFX_ERR_INVALID_HANDLE; + } + + return (*proc)(loader->getSession(), par, channel_id); +} + +mfxStatus MFXVideoDECODE_VPP_Close(mfxSession session) { + if (!session) + return MFX_ERR_INVALID_HANDLE; + + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; + + auto proc = + (decltype(MFXVideoDECODE_VPP_Close) *)loader->getFunction2(MFX::eMFXVideoDECODE_VPP_Close); + if (!proc) { + return MFX_ERR_INVALID_HANDLE; + } + + return (*proc)(loader->getSession()); +} + +mfxStatus MFXVideoVPP_ProcessFrameAsync(mfxSession session, + mfxFrameSurface1 *in, + mfxFrameSurface1 **out) { + if (!session) + return MFX_ERR_INVALID_HANDLE; + + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; + + auto proc = (decltype(MFXVideoVPP_ProcessFrameAsync) *)loader->getFunction2( + MFX::eMFXVideoVPP_ProcessFrameAsync); + if (!proc) { + return MFX_ERR_INVALID_HANDLE; + } + + return (*proc)(loader->getSession(), in, out); +} + +mfxStatus MFXJoinSession(mfxSession session, mfxSession child_session) { + if (!session || !child_session) { + return MFX_ERR_INVALID_HANDLE; + } + + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; + MFX::LoaderCtx *child_loader = (MFX::LoaderCtx *)child_session; + + if (loader->getVersion().Version != child_loader->getVersion().Version) { + return MFX_ERR_INVALID_HANDLE; + } + + auto proc = (decltype(MFXJoinSession) *)loader->getFunction(MFX::eMFXJoinSession); + if (!proc) { + return MFX_ERR_INVALID_HANDLE; + } + + return (*proc)(loader->getSession(), child_loader->getSession()); +} + +static mfxStatus AllocateCloneLoader(MFX::LoaderCtx *parentLoader, MFX::LoaderCtx **cloneLoader) { + // initialization param structs are not used when bCloneSession == true + mfxInitParam par = {}; + mfxInitializationParam vplParam = {}; + mfxU16 deviceID = 0; + + // initialization extBufs are not saved at this level + // the RT should save these when the parent session is created and may use + // them when creating the cloned session + par.NumExtParam = 0; + + try { + std::unique_ptr<MFX::LoaderCtx> cl; + + cl.reset(new MFX::LoaderCtx{}); + + mfxStatus mfx_res = + cl->Init(par, vplParam, &deviceID, (char *)parentLoader->getLibPath(), true); + if (MFX_ERR_NONE == mfx_res) { + *cloneLoader = cl.release(); + } + else { + *cloneLoader = nullptr; + } + + return mfx_res; + } + catch (...) { + return MFX_ERR_MEMORY_ALLOC; + } +} + +mfxStatus MFXCloneSession(mfxSession session, mfxSession *clone) { + if (!session || !clone) + return MFX_ERR_INVALID_HANDLE; + + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; + mfxVersion version = loader->getVersion(); + *clone = nullptr; + + // initialize the clone session + // for runtimes with 1.x API, call MFXInit followed by MFXJoinSession + // for runtimes with 2.x API, use RT implementation of MFXCloneSession (passthrough) + if (version.Major == 1) { + mfxStatus mfx_res = MFXInit(loader->getImpl(), &version, clone); + if (MFX_ERR_NONE != mfx_res) { + return mfx_res; + } + + // join the sessions + mfx_res = MFXJoinSession(session, *clone); + if (MFX_ERR_NONE != mfx_res) { + MFXClose(*clone); + *clone = nullptr; + return mfx_res; + } + } + else if (version.Major == 2) { + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; + + // MFXCloneSession not included in function pointer search during init + // for bwd-compat, check for it here and fail gracefully if missing + void *libHandle = loader->getHandle(); + auto proc = (decltype(MFXCloneSession) *)(dlsym(libHandle, "MFXCloneSession")); + if (!proc) + return MFX_ERR_UNSUPPORTED; + + // allocate new dispatcher-level session object and copy + // state from parent session (function pointer tables, impl type, etc.) + MFX::LoaderCtx *cloneLoader; + mfxStatus mfx_res = AllocateCloneLoader(loader, &cloneLoader); + if (mfx_res != MFX_ERR_NONE) + return mfx_res; + + // call RT implementation of MFXCloneSession + mfxSession cloneRT; + mfx_res = (*proc)(loader->getSession(), &cloneRT); + + if (mfx_res != MFX_ERR_NONE || cloneRT == NULL) { + // RT call failed, delete cloned loader (no valid session created) + delete cloneLoader; + return MFX_ERR_UNSUPPORTED; + } + cloneLoader->setSession(cloneRT); + + // get version of cloned session + mfxVersion cloneVersion = {}; + mfx_res = MFXQueryVersion((mfxSession)cloneLoader, &cloneVersion); + cloneLoader->setVersion(cloneVersion); + if (mfx_res != MFX_ERR_NONE) { + MFXClose((mfxSession)cloneLoader); + return mfx_res; + } + + *clone = (mfxSession)cloneLoader; + } + else { + return MFX_ERR_UNSUPPORTED; + } + + return MFX_ERR_NONE; +} + +#undef FUNCTION +#define FUNCTION(return_value, func_name, formal_param_list, actual_param_list) \ + return_value MFX_CDECL func_name formal_param_list { \ + /* get the function's address and make a call */ \ + if (!session) \ + return MFX_ERR_INVALID_HANDLE; \ + \ + MFX::LoaderCtx *loader = (MFX::LoaderCtx *)session; \ + \ + auto proc = (decltype(func_name) *)loader->getFunction(MFX::e##func_name); \ + if (!proc) \ + return MFX_ERR_INVALID_HANDLE; \ + \ + /* get the real session pointer */ \ + session = loader->getSession(); \ + /* pass down the call */ \ + return (*proc)actual_param_list; \ + } + +#include "linux/mfxvideo_functions.h" // NOLINT(build/include) + +#ifdef __cplusplus +} +#endif
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/linux/mfxloader.h
Added
@@ -0,0 +1,26 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_LINUX_MFXLOADER_H_ +#define DISPATCHER_LINUX_MFXLOADER_H_ + +#include <limits.h> + +#include <list> +#include <sstream> +#include <string> + +#include "vpl/mfxdefs.h" + +inline bool operator<(const mfxVersion &lhs, const mfxVersion &rhs) { + return (lhs.Major < rhs.Major || (lhs.Major == rhs.Major && lhs.Minor < rhs.Minor)); +} + +inline bool operator<=(const mfxVersion &lhs, const mfxVersion &rhs) { + return (lhs < rhs || (lhs.Major == rhs.Major && lhs.Minor == rhs.Minor)); +} + +#endif // DISPATCHER_LINUX_MFXLOADER_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/linux/mfxvideo_functions.h
Added
@@ -0,0 +1,180 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +// +// WARNING: +// this file doesn't contain an include guard by design. +// The file may be included into a source file many times. +// That is why this header doesn't contain any include directive. +// Please, do no try to fix it. +// +// NOLINT(build/header_guard) + +// Use define API_VERSION to set the API of functions listed further +// When new functions are added new section with functions declarations must be started with updated define + +// +// API version 1.0 functions +// + +// API version where a function is added. Minor value should precedes the major value +#define API_VERSION \ + { \ + { 0, 1 } \ + } + +FUNCTION(mfxStatus, MFXQueryIMPL, (mfxSession session, mfxIMPL *impl), (session, impl)) +FUNCTION(mfxStatus, MFXQueryVersion, (mfxSession session, mfxVersion *version), (session, version)) + +// CORE interface functions +FUNCTION(mfxStatus, + MFXVideoCORE_SetFrameAllocator, + (mfxSession session, mfxFrameAllocator *allocator), + (session, allocator)) +FUNCTION(mfxStatus, + MFXVideoCORE_SetHandle, + (mfxSession session, mfxHandleType type, mfxHDL hdl), + (session, type, hdl)) +FUNCTION(mfxStatus, + MFXVideoCORE_GetHandle, + (mfxSession session, mfxHandleType type, mfxHDL *hdl), + (session, type, hdl)) + +FUNCTION(mfxStatus, + MFXVideoCORE_SyncOperation, + (mfxSession session, mfxSyncPoint syncp, mfxU32 wait), + (session, syncp, wait)) + +// ENCODE interface functions +FUNCTION(mfxStatus, + MFXVideoENCODE_Query, + (mfxSession session, mfxVideoParam *in, mfxVideoParam *out), + (session, in, out)) +FUNCTION(mfxStatus, + MFXVideoENCODE_QueryIOSurf, + (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request), + (session, par, request)) +FUNCTION(mfxStatus, MFXVideoENCODE_Init, (mfxSession session, mfxVideoParam *par), (session, par)) +FUNCTION(mfxStatus, MFXVideoENCODE_Reset, (mfxSession session, mfxVideoParam *par), (session, par)) +FUNCTION(mfxStatus, MFXVideoENCODE_Close, (mfxSession session), (session)) + +FUNCTION(mfxStatus, + MFXVideoENCODE_GetVideoParam, + (mfxSession session, mfxVideoParam *par), + (session, par)) +FUNCTION(mfxStatus, + MFXVideoENCODE_GetEncodeStat, + (mfxSession session, mfxEncodeStat *stat), + (session, stat)) +FUNCTION(mfxStatus, + MFXVideoENCODE_EncodeFrameAsync, + (mfxSession session, + mfxEncodeCtrl *ctrl, + mfxFrameSurface1 *surface, + mfxBitstream *bs, + mfxSyncPoint *syncp), + (session, ctrl, surface, bs, syncp)) + +// DECODE interface functions +FUNCTION(mfxStatus, + MFXVideoDECODE_Query, + (mfxSession session, mfxVideoParam *in, mfxVideoParam *out), + (session, in, out)) +FUNCTION(mfxStatus, + MFXVideoDECODE_DecodeHeader, + (mfxSession session, mfxBitstream *bs, mfxVideoParam *par), + (session, bs, par)) +FUNCTION(mfxStatus, + MFXVideoDECODE_QueryIOSurf, + (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request), + (session, par, request)) +FUNCTION(mfxStatus, MFXVideoDECODE_Init, (mfxSession session, mfxVideoParam *par), (session, par)) +FUNCTION(mfxStatus, MFXVideoDECODE_Reset, (mfxSession session, mfxVideoParam *par), (session, par)) +FUNCTION(mfxStatus, MFXVideoDECODE_Close, (mfxSession session), (session)) + +FUNCTION(mfxStatus, + MFXVideoDECODE_GetVideoParam, + (mfxSession session, mfxVideoParam *par), + (session, par)) +FUNCTION(mfxStatus, + MFXVideoDECODE_GetDecodeStat, + (mfxSession session, mfxDecodeStat *stat), + (session, stat)) +FUNCTION(mfxStatus, + MFXVideoDECODE_SetSkipMode, + (mfxSession session, mfxSkipMode mode), + (session, mode)) +FUNCTION(mfxStatus, + MFXVideoDECODE_GetPayload, + (mfxSession session, mfxU64 *ts, mfxPayload *payload), + (session, ts, payload)) +FUNCTION(mfxStatus, + MFXVideoDECODE_DecodeFrameAsync, + (mfxSession session, + mfxBitstream *bs, + mfxFrameSurface1 *surface_work, + mfxFrameSurface1 **surface_out, + mfxSyncPoint *syncp), + (session, bs, surface_work, surface_out, syncp)) + +// VPP interface functions +FUNCTION(mfxStatus, + MFXVideoVPP_Query, + (mfxSession session, mfxVideoParam *in, mfxVideoParam *out), + (session, in, out)) +FUNCTION(mfxStatus, + MFXVideoVPP_QueryIOSurf, + (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request), + (session, par, request)) +FUNCTION(mfxStatus, MFXVideoVPP_Init, (mfxSession session, mfxVideoParam *par), (session, par)) +FUNCTION(mfxStatus, MFXVideoVPP_Reset, (mfxSession session, mfxVideoParam *par), (session, par)) +FUNCTION(mfxStatus, MFXVideoVPP_Close, (mfxSession session), (session)) + +FUNCTION(mfxStatus, + MFXVideoVPP_GetVideoParam, + (mfxSession session, mfxVideoParam *par), + (session, par)) +FUNCTION(mfxStatus, MFXVideoVPP_GetVPPStat, (mfxSession session, mfxVPPStat *stat), (session, stat)) +FUNCTION(mfxStatus, + MFXVideoVPP_RunFrameVPPAsync, + (mfxSession session, + mfxFrameSurface1 *in, + mfxFrameSurface1 *out, + mfxExtVppAuxData *aux, + mfxSyncPoint *syncp), + (session, in, out, aux, syncp)) + +#undef API_VERSION + +// +// API version 1.1 functions +// + +#define API_VERSION \ + { \ + { 1, 1 } \ + } + +FUNCTION(mfxStatus, MFXDisjoinSession, (mfxSession session), (session)) +FUNCTION(mfxStatus, MFXSetPriority, (mfxSession session, mfxPriority priority), (session, priority)) +FUNCTION(mfxStatus, + MFXGetPriority, + (mfxSession session, mfxPriority *priority), + (session, priority)) + +#undef API_VERSION + +#define API_VERSION \ + { \ + { 19, 1 } \ + } + +FUNCTION(mfxStatus, + MFXVideoCORE_QueryPlatform, + (mfxSession session, mfxPlatform *platform), + (session, platform)) + +#undef API_VERSION
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/vpl
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl.cpp
Added
@@ -0,0 +1,195 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include "vpl/mfx_dispatcher_vpl.h" + +// exported functions for API >= 2.0 + +// create unique loader context +mfxLoader MFXLoad() { + LoaderCtxVPL *loaderCtx; + + try { + std::unique_ptr<LoaderCtxVPL> pLoaderCtx; + pLoaderCtx.reset(new LoaderCtxVPL{}); + loaderCtx = (LoaderCtxVPL *)pLoaderCtx.release(); + } + catch (...) { + return nullptr; + } + + // initialize logging if appropriate environment variables are set + loaderCtx->InitDispatcherLog(); + + return (mfxLoader)loaderCtx; +} + +// unload libraries, destroy all created mfxConfig objects, free other memory +void MFXUnload(mfxLoader loader) { + if (loader) { + LoaderCtxVPL *loaderCtx = (LoaderCtxVPL *)loader; + + loaderCtx->UnloadAllLibraries(); + + loaderCtx->FreeConfigFilters(); + + delete loaderCtx; + } + + return; +} + +// create config context +// each loader may have more than one config context +mfxConfig MFXCreateConfig(mfxLoader loader) { + if (!loader) + return nullptr; + + LoaderCtxVPL *loaderCtx = (LoaderCtxVPL *)loader; + ConfigCtxVPL *configCtx; + + DispatcherLogVPL *dispLog = loaderCtx->GetLogger(); + DISP_LOG_FUNCTION(dispLog); + + try { + configCtx = loaderCtx->AddConfigFilter(); + } + catch (...) { + return nullptr; + } + + return (mfxConfig)(configCtx); +} + +// set a config proprerty to use in enumerating implementations +mfxStatus MFXSetConfigFilterProperty(mfxConfig config, const mfxU8 *name, mfxVariant value) { + if (!config) + return MFX_ERR_NULL_PTR; + + ConfigCtxVPL *configCtx = (ConfigCtxVPL *)config; + LoaderCtxVPL *loaderCtx = configCtx->m_parentLoader; + + DispatcherLogVPL *dispLog = loaderCtx->GetLogger(); + DISP_LOG_FUNCTION(dispLog); + + mfxStatus sts = configCtx->SetFilterProperty(name, value); + if (sts) + return sts; + + loaderCtx->m_bNeedUpdateValidImpls = true; + + sts = loaderCtx->UpdateLowLatency(); + + return sts; +} + +// iterate over available implementations +// capabilities are returned in idesc +mfxStatus MFXEnumImplementations(mfxLoader loader, + mfxU32 i, + mfxImplCapsDeliveryFormat format, + mfxHDL *idesc) { + if (!loader || !idesc) + return MFX_ERR_NULL_PTR; + + LoaderCtxVPL *loaderCtx = (LoaderCtxVPL *)loader; + + DispatcherLogVPL *dispLog = loaderCtx->GetLogger(); + DISP_LOG_FUNCTION(dispLog); + + mfxStatus sts = MFX_ERR_NONE; + + // load and query all libraries + if (loaderCtx->m_bNeedFullQuery) { + // if a session was already created in low-latency mode, unload all implementations + // before running full load and query + if (loaderCtx->m_bLowLatency && !loaderCtx->m_bNeedLowLatencyQuery) { + loaderCtx->UnloadAllLibraries(); + } + + sts = loaderCtx->FullLoadAndQuery(); + if (sts) + return MFX_ERR_NOT_FOUND; + } + + // update list of valid libraries based on updated set of + // mfxConfig properties + if (loaderCtx->m_bNeedUpdateValidImpls) { + sts = loaderCtx->UpdateValidImplList(); + if (sts) + return MFX_ERR_NOT_FOUND; + } + + sts = loaderCtx->QueryImpl(i, format, idesc); + + return sts; +} + +// create a new session with implementation i +mfxStatus MFXCreateSession(mfxLoader loader, mfxU32 i, mfxSession *session) { + if (!loader || !session) + return MFX_ERR_NULL_PTR; + + LoaderCtxVPL *loaderCtx = (LoaderCtxVPL *)loader; + + DispatcherLogVPL *dispLog = loaderCtx->GetLogger(); + DISP_LOG_FUNCTION(dispLog); + + mfxStatus sts = MFX_ERR_NONE; + + if (loaderCtx->m_bLowLatency) { + DISP_LOG_MESSAGE(dispLog, "message: low latency mode enabled"); + + if (loaderCtx->m_bNeedLowLatencyQuery) { + // load low latency libraries + sts = loaderCtx->LoadLibsLowLatency(); + if (sts != MFX_ERR_NONE) + return MFX_ERR_NOT_FOUND; + + // run limited query operations for low latency init + sts = loaderCtx->QueryLibraryCaps(); + if (sts != MFX_ERR_NONE) + return MFX_ERR_NOT_FOUND; + } + } + else { + DISP_LOG_MESSAGE(dispLog, "message: low latency mode disabled"); + + // load and query all libraries + if (loaderCtx->m_bNeedFullQuery) { + sts = loaderCtx->FullLoadAndQuery(); + if (sts) + return MFX_ERR_NOT_FOUND; + } + + // update list of valid libraries based on updated set of + // mfxConfig properties + if (loaderCtx->m_bNeedUpdateValidImpls) { + sts = loaderCtx->UpdateValidImplList(); + if (sts) + return MFX_ERR_NOT_FOUND; + } + } + + sts = loaderCtx->CreateSession(i, session); + + return sts; +} + +// release memory associated with implementation description hdl +mfxStatus MFXDispReleaseImplDescription(mfxLoader loader, mfxHDL hdl) { + if (!loader) + return MFX_ERR_NULL_PTR; + + LoaderCtxVPL *loaderCtx = (LoaderCtxVPL *)loader; + + DispatcherLogVPL *dispLog = loaderCtx->GetLogger(); + DISP_LOG_FUNCTION(dispLog); + + mfxStatus sts = loaderCtx->ReleaseImpl(hdl); + + return sts; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl.h
Added
@@ -0,0 +1,614 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_VPL_MFX_DISPATCHER_VPL_H_ +#define DISPATCHER_VPL_MFX_DISPATCHER_VPL_H_ + +#include <algorithm> +#include <cstdlib> +#include <list> +#include <memory> +#include <sstream> +#include <string> +#include <vector> + +#include "vpl/mfxdispatcher.h" +#include "vpl/mfxvideo.h" + +#include "./mfx_dispatcher_vpl_log.h" + +#if defined(_WIN32) || defined(_WIN64) + #include <windows.h> + + // use wide char on Windows + #define MAKE_STRING(x) L##x +typedef std::wstring STRING_TYPE; +typedef wchar_t CHAR_TYPE; +#else + #include <dirent.h> + #include <dlfcn.h> + #include <string.h> + #include <unistd.h> + + // use standard char on Linux + #define MAKE_STRING(x) x +typedef std::string STRING_TYPE; +typedef char CHAR_TYPE; +#endif + +#if defined(_WIN32) || defined(_WIN64) + #if defined _M_IX86 + // Windows x86 + #define MSDK_LIB_NAME L"libmfxhw32." + #else + // Windows x64 + #define MSDK_LIB_NAME L"libmfxhw64." + #endif + #define ONEVPL_PRIORITY_PATH_VAR L"ONEVPL_PRIORITY_PATH" +#elif defined(__linux__) + // Linux x64 + #define MSDK_LIB_NAME "libmfxhw64." + #define ONEVPL_PRIORITY_PATH_VAR "ONEVPL_PRIORITY_PATH" +#endif + +#define MSDK_MIN_VERSION_MAJOR 1 +#define MSDK_MIN_VERSION_MINOR 0 + +#define MAX_MSDK_ACCEL_MODES 16 // see mfxcommon.h --> mfxAccelerationMode + +#define MAX_WINDOWS_ADAPTER_ID 3 // check adapterID in range 0,3 + +#define MAX_NUM_IMPL_MSDK 4 + +#define MAX_VPL_SEARCH_PATH 4096 + +#define MAX_ENV_VAR_LEN 32768 + +#define DEVICE_ID_UNKNOWN 0xffffffff +#define ADAPTER_IDX_UNKNOWN 0xffffffff + +#define TAB_SIZE(type, tab) (sizeof(tab) / sizeof(type)) +#define MAKE_MFX_VERSION(major, minor) \ + { (minor), (major) } + +// internal function to load dll by full path, fail if unsuccessful +mfxStatus MFXInitEx2(mfxVersion version, + mfxInitializationParam vplParam, + mfxIMPL hwImpl, + mfxSession *session, + mfxU16 *deviceID, + CHAR_TYPE *dllName); + +typedef void(MFX_CDECL *VPLFunctionPtr)(void); + +extern const mfxIMPL msdkImplTabMAX_NUM_IMPL_MSDK; + +enum LibType { + LibTypeUnknown = -1, + + LibTypeVPL = 0, + LibTypeMSDK, + + NumLibTypes +}; + +enum VPLFunctionIdx { + // 2.0 + IdxMFXQueryImplsDescription = 0, + IdxMFXReleaseImplDescription, + IdxMFXMemory_GetSurfaceForVPP, + IdxMFXMemory_GetSurfaceForEncode, + IdxMFXMemory_GetSurfaceForDecode, + IdxMFXInitialize, + + // 2.1 + IdxMFXMemory_GetSurfaceForVPPOut, + IdxMFXVideoDECODE_VPP_Init, + IdxMFXVideoDECODE_VPP_DecodeFrameAsync, + IdxMFXVideoDECODE_VPP_Reset, + IdxMFXVideoDECODE_VPP_GetChannelParam, + IdxMFXVideoDECODE_VPP_Close, + IdxMFXVideoVPP_ProcessFrameAsync, + + NumVPLFunctions +}; + +// select MSDK functions for 1.x style caps query +enum MSDKCompatFunctionIdx { + IdxMFXInitEx = 0, + IdxMFXClose, + + NumMSDKFunctions +}; + +// both Windows and Linux use char* for function names +struct VPLFunctionDesc { + const char *pName; + mfxVersion apiVersion; +}; + +// DX adapter info +struct DXGI1DeviceInfo { + mfxU32 vendorID; + mfxU32 deviceID; + mfxU64 luid; +}; + +// priority of runtime loading, based on oneAPI-spec +enum LibPriority { + LIB_PRIORITY_SPECIAL = 0, // highest priority regardless of other priority rules + + LIB_PRIORITY_01 = 1, + LIB_PRIORITY_02 = 2, + LIB_PRIORITY_03 = 3, + LIB_PRIORITY_04 = 4, + LIB_PRIORITY_05 = 5, + + LIB_PRIORITY_LEGACY_DRIVERSTORE = 10000, + LIB_PRIORITY_LEGACY, +}; + +enum CfgPropState { + CFG_PROP_STATE_NOT_SET = 0, + CFG_PROP_STATE_SUPPORTED, + CFG_PROP_STATE_UNSUPPORTED, +}; + +enum PropRanges { + PROP_RANGE_DEC_W = 0, + PROP_RANGE_DEC_H, + PROP_RANGE_ENC_W, + PROP_RANGE_ENC_H, + PROP_RANGE_VPP_W, + PROP_RANGE_VPP_H, + + NUM_PROP_RANGES +}; + +// must match eProp_TotalProps, is checked with static_assert in _config.cpp +// (should throw error at compile time if !=) +#define NUM_TOTAL_FILTER_PROPS 55 + +// typedef child structures for easier reading +typedef struct mfxDecoderDescription::decoder DecCodec; +typedef struct mfxDecoderDescription::decoder::decprofile DecProfile; +typedef struct mfxDecoderDescription::decoder::decprofile::decmemdesc DecMemDesc; + +typedef struct mfxEncoderDescription::encoder EncCodec; +typedef struct mfxEncoderDescription::encoder::encprofile EncProfile; +typedef struct mfxEncoderDescription::encoder::encprofile::encmemdesc EncMemDesc; + +typedef struct mfxVPPDescription::filter VPPFilter; +typedef struct mfxVPPDescription::filter::memdesc VPPMemDesc; +typedef struct mfxVPPDescription::filter::memdesc::format VPPFormat; + +// flattened version of single enc/dec/vpp configs +// each struct contains all _settable_ props +// i.e. not implied values like NumCodecs +struct DecConfig { + mfxU32 CodecID; + mfxU16 MaxcodecLevel; + mfxU32 Profile; + mfxResourceType MemHandleType; + mfxRange32U Width; + mfxRange32U Height; + mfxU32 ColorFormat; +}; + +struct EncConfig { + mfxU32 CodecID; + mfxU16 MaxcodecLevel; + mfxU16 BiDirectionalPrediction; + mfxU16 ReportedStats; + mfxU32 Profile; + mfxResourceType MemHandleType; + mfxRange32U Width; + mfxRange32U Height; + mfxU32 ColorFormat; +}; + +struct VPPConfig { + mfxU32 FilterFourCC; + mfxU16 MaxDelayInFrames; + mfxResourceType MemHandleType; + mfxRange32U Width; + mfxRange32U Height; + mfxU32 InFormat; + mfxU32 OutFormat; +}; + +// special props which are passed in via MFXSetConfigProperty() +// these are updated with every call to ValidateConfig() and may +// be used in MFXCreateSession() +struct SpecialConfig { + bool bIsSet_deviceHandleType; + mfxHandleType deviceHandleType; + + bool bIsSet_deviceHandle; + mfxHDL deviceHandle; + + bool bIsSet_accelerationMode; + mfxAccelerationMode accelerationMode; + + bool bIsSet_ApiVersion; + mfxVersion ApiVersion; + + bool bIsSet_dxgiAdapterIdx; + mfxU32 dxgiAdapterIdx; + + bool bIsSet_NumThread; + mfxU32 NumThread; + + bool bIsSet_DeviceCopy; + mfxU16 DeviceCopy; + + bool bIsSet_ExtBuffer; + std::vector<mfxExtBuffer *> ExtBuffers; +}; + +// config class implementation +class ConfigCtxVPL { +public: + ConfigCtxVPL(); + ~ConfigCtxVPL(); + + // set a single filter property (KV pair) + mfxStatus SetFilterProperty(const mfxU8 *name, mfxVariant value); + + static bool CheckLowLatencyConfig(std::list<ConfigCtxVPL *> configCtxList, + SpecialConfig *specialConfig); + + // compare library caps vs. set of configuration filters + static mfxStatus ValidateConfig(const mfxImplDescription *libImplDesc, + const mfxImplementedFunctions *libImplFuncs, +#ifdef ONEVPL_EXPERIMENTAL + const mfxExtendedDeviceId *libImplExtDevID, +#endif + std::list<ConfigCtxVPL *> configCtxList, + LibType libType, + SpecialConfig *specialConfig); + + // parse deviceID for x86 devices + static bool ParseDeviceIDx86(mfxChar *cDeviceID, mfxU32 &deviceID, mfxU32 &adapterIdx); + + // loader object this config is associated with - needed to + // rebuild valid implementation list after each calling + // MFXSetConfigFilterProperty() + class LoaderCtxVPL *m_parentLoader; + +private: + static __inline std::string GetNextProp(std::list<std::string> &s) { + if (s.empty()) + return ""; + std::string t = s.front(); + s.pop_front(); + return t; + } + + mfxStatus ValidateAndSetProp(mfxI32 idx, mfxVariant value); + mfxStatus SetFilterPropertyDec(std::list<std::string> &propParsedString, mfxVariant value); + mfxStatus SetFilterPropertyEnc(std::list<std::string> &propParsedString, mfxVariant value); + mfxStatus SetFilterPropertyVPP(std::list<std::string> &propParsedString, mfxVariant value); + + static mfxStatus GetFlatDescriptionsDec(const mfxImplDescription *libImplDesc, + std::list<DecConfig> &decConfigList); + + static mfxStatus GetFlatDescriptionsEnc(const mfxImplDescription *libImplDesc, + std::list<EncConfig> &encConfigList); + + static mfxStatus GetFlatDescriptionsVPP(const mfxImplDescription *libImplDesc, + std::list<VPPConfig> &vppConfigList); + + static mfxStatus CheckPropsGeneral(const mfxVariant cfgPropsAll, + const mfxImplDescription *libImplDesc); + + static mfxStatus CheckPropsDec(const mfxVariant cfgPropsAll, + std::list<DecConfig> decConfigList); + + static mfxStatus CheckPropsEnc(const mfxVariant cfgPropsAll, + std::list<EncConfig> encConfigList); + + static mfxStatus CheckPropsVPP(const mfxVariant cfgPropsAll, + std::list<VPPConfig> vppConfigList); + + static mfxStatus CheckPropString(const mfxChar *implString, const std::string filtString); + +#ifdef ONEVPL_EXPERIMENTAL + static mfxStatus CheckPropsExtDevID(const mfxVariant cfgPropsAll, + const mfxExtendedDeviceId *libImplExtDevID); + +#endif + + mfxVariant m_propVarNUM_TOTAL_FILTER_PROPS; + + // special containers for properties which are passed by pointer + // (save a copy of the whole object based on property name) + mfxRange32U m_propRange32UNUM_PROP_RANGES; + std::string m_implName; + std::string m_implLicense; + std::string m_implKeywords; + std::string m_deviceIdStr; + std::string m_implFunctionName; + + mfxU8 m_extDevLUID8U8; + std::string m_extDevNameStr; + + std::vector<mfxU8> m_extBuf; + + __inline bool SetExtBuf(mfxExtBuffer *extBuf) { + if (!extBuf) + return false; + + mfxU32 BufferSz = extBuf->BufferSz; + if (BufferSz > 0) { + m_extBuf.resize(BufferSz); + std::copy((mfxU8 *)extBuf, (mfxU8 *)extBuf + BufferSz, m_extBuf.begin()); + return true; + } + return false; + } + + __inline bool GetExtBuf(mfxExtBuffer **extBuf) { + if (!extBuf) + return false; + + *extBuf = nullptr; + if (!m_extBuf.empty()) { + *extBuf = (mfxExtBuffer *)m_extBuf.data(); + return true; + } + return false; + } + + __inline void ClearExtBuf() { + m_extBuf.clear(); + } +}; + +// MSDK compatibility loader implementation +class LoaderCtxMSDK { +public: + LoaderCtxMSDK(); + ~LoaderCtxMSDK(); + + // public function to be called by VPL dispatcher + // do not allocate any new memory here, so no need for a matching Release functions + mfxStatus QueryMSDKCaps(STRING_TYPE libNameFull, + mfxImplDescription **implDesc, + mfxImplementedFunctions **implFuncs, + mfxU32 adapterID, + bool bSkipD3D9Check); + + static mfxStatus QueryAPIVersion(STRING_TYPE libNameFull, mfxVersion *msdkVersion); + +#ifdef ONEVPL_EXPERIMENTAL + static mfxStatus QueryExtDeviceID(mfxExtendedDeviceId *extDeviceID, + mfxU32 adapterID, + mfxU16 deviceID, + mfxU64 luid); +#endif + + // required by MFXCreateSession + mfxIMPL m_msdkAdapter; + mfxIMPL m_msdkAdapterD3D9; + + mfxU16 m_deviceID; + mfxU64 m_luid; + +#ifdef ONEVPL_EXPERIMENTAL + mfxExtendedDeviceId m_extDeviceID; +#endif + +private: + // session management + mfxStatus OpenSession(mfxSession *session, + STRING_TYPE libNameFull, + mfxAccelerationMode accelMode, + mfxIMPL hwImpl); + void CloseSession(mfxSession *session); + + // utility functions + static mfxAccelerationMode CvtAccelType(mfxIMPL implType, mfxIMPL implMethod); + static mfxStatus GetDefaultAccelType(mfxU32 adapterID, mfxIMPL *implDefault, mfxU64 *luid); + static mfxStatus CheckD3D9Support(mfxU64 luid, STRING_TYPE libNameFull, mfxIMPL *implD3D9); + static mfxStatus GetRenderNodeDescription(mfxU32 adapterID, mfxU32 &vendorID, mfxU16 &deviceID); + + // internal state variables + STRING_TYPE m_libNameFull; + mfxImplDescription m_id; // base description struct + mfxAccelerationMode m_accelModeMAX_MSDK_ACCEL_MODES; + mfxU16 m_loaderDeviceID; + + __inline bool IsVersionSupported(mfxVersion reqVersion, mfxVersion actualVersion) { + if (actualVersion.Major > reqVersion.Major) { + return true; + } + else if ((actualVersion.Major == reqVersion.Major) && + (actualVersion.Minor >= reqVersion.Minor)) { + return true; + } + return false; + } +}; + +struct LibInfo { + // during search store candidate file names + // and priority based on rules in spec + STRING_TYPE libNameFull; + mfxU32 libPriority; + LibType libType; + + // if valid library, store file handle + // and table of exported functions + void *hModuleVPL; + VPLFunctionPtr vplFuncTableNumVPLFunctions; // NOLINT + + // loader context for legacy MSDK + LoaderCtxMSDK msdkCtxMAX_NUM_IMPL_MSDK; + + // API version of legacy MSDK + mfxVersion msdkVersion; + + // user-friendly version of path for MFX_IMPLCAPS_IMPLPATH query + mfxChar implCapsPathMAX_VPL_SEARCH_PATH; + + // avoid warnings + LibInfo() + : libNameFull(), + libPriority(0), + libType(LibTypeUnknown), + hModuleVPL(nullptr), + vplFuncTable(), + msdkCtx(), + msdkVersion(), + implCapsPath() {} + +private: + // make this class non-copyable + LibInfo(const LibInfo &); + void operator=(const LibInfo &); +}; + +struct ImplInfo { + // library containing this implementation + LibInfo *libInfo; + + // description of implementation + mfxHDL implDesc; + + // list of implemented functions + mfxHDL implFuncs; + +#ifdef ONEVPL_EXPERIMENTAL + mfxHDL implExtDeviceID; +#endif + + // used for session initialization with this implementation + mfxInitializationParam vplParam; + mfxVersion version; + + // if MSDK library, index of corresponding adapter (i.e. which LoaderCtxMSDK) + mfxU32 msdkImplIdx; + + // adapter index in multi-adapter systems + mfxU32 adapterIdx; + + // local index for libraries with more than one implementation + mfxU32 libImplIdx; + + // index of valid libraries - updates with every call to MFXSetConfigFilterProperty() + mfxI32 validImplIdx; + + // avoid warnings + ImplInfo() + : libInfo(nullptr), + implDesc(nullptr), + implFuncs(nullptr), +#ifdef ONEVPL_EXPERIMENTAL + implExtDeviceID(nullptr), +#endif + vplParam(), + version(), + msdkImplIdx(0), + adapterIdx(ADAPTER_IDX_UNKNOWN), + libImplIdx(0), + validImplIdx(-1) { + } +}; + +// loader class implementation +class LoaderCtxVPL { +public: + LoaderCtxVPL(); + ~LoaderCtxVPL(); + + // manage library implementations + mfxStatus BuildListOfCandidateLibs(); + mfxU32 CheckValidLibraries(); + mfxStatus QueryLibraryCaps(); + mfxStatus UnloadAllLibraries(); + + // query capabilities of each implementation + mfxStatus FullLoadAndQuery(); + mfxStatus QueryImpl(mfxU32 idx, mfxImplCapsDeliveryFormat format, mfxHDL *idesc); + mfxStatus ReleaseImpl(mfxHDL idesc); + + // update list of valid implementations based on current filter props + mfxStatus UpdateValidImplList(void); + mfxStatus PrioritizeImplList(void); + + // create mfxSession + mfxStatus CreateSession(mfxU32 idx, mfxSession *session); + + // manage configuration filters + ConfigCtxVPL *AddConfigFilter(); + mfxStatus FreeConfigFilters(); + + // manage logging + mfxStatus InitDispatcherLog(); + DispatcherLogVPL *GetLogger(); + + // low latency initialization + mfxStatus LoadLibsLowLatency(); + mfxStatus UpdateLowLatency(); + + bool m_bLowLatency; + bool m_bNeedUpdateValidImpls; + bool m_bNeedFullQuery; + bool m_bNeedLowLatencyQuery; + bool m_bPriorityPathEnabled; + +private: + // helper functions + mfxStatus LoadSingleLibrary(LibInfo *libInfo); + mfxStatus UnloadSingleLibrary(LibInfo *libInfo); + mfxStatus UnloadSingleImplementation(ImplInfo *implInfo); + VPLFunctionPtr GetFunctionAddr(void *hModuleVPL, const char *pName); + + mfxU32 GetSearchPathsDriverStore(std::list<STRING_TYPE> &searchDirs, LibType libType); + mfxU32 GetSearchPathsSystemDefault(std::list<STRING_TYPE> &searchDirs); + mfxU32 GetSearchPathsCurrentExe(std::list<STRING_TYPE> &searchDirs); + mfxU32 GetSearchPathsCurrentDir(std::list<STRING_TYPE> &searchDirs); + mfxU32 GetSearchPathsLegacy(std::list<STRING_TYPE> &searchDirs); + + mfxU32 ParseEnvSearchPaths(const CHAR_TYPE *envVarName, std::list<STRING_TYPE> &searchDirs); + mfxU32 ParseLegacySearchPaths(std::list<STRING_TYPE> &searchDirs); + + mfxStatus SearchDirForLibs(STRING_TYPE searchDir, + std::list<LibInfo *> &libInfoList, + mfxU32 priority, + bool bLoadVPLOnly = false); + + mfxU32 LoadAPIExports(LibInfo *libInfo, LibType libType); + mfxStatus ValidateAPIExports(VPLFunctionPtr *vplFuncTable, mfxVersion reportedVersion); + bool IsValidX86GPU(ImplInfo *implInfo, mfxU32 &deviceID, mfxU32 &adapterIdx); + mfxStatus UpdateImplPath(LibInfo *libInfo); + + mfxStatus LoadLibsFromDriverStore(mfxU32 numAdapters, + const std::vector<DXGI1DeviceInfo> &adapterInfo, + LibType libType); + mfxStatus LoadLibsFromSystemDir(LibType libType); + mfxStatus LoadLibsFromMultipleDirs(LibType libType); + + LibInfo *AddSingleLibrary(STRING_TYPE libPath, LibType libType); + mfxStatus QuerySessionLowLatency(LibInfo *libInfo, mfxU32 adapterID, mfxVersion *ver); + + std::list<LibInfo *> m_libInfoList; + std::list<ImplInfo *> m_implInfoList; + std::list<ConfigCtxVPL *> m_configCtxList; + std::vector<DXGI1DeviceInfo> m_gpuAdapterInfo; + + SpecialConfig m_specialConfig; + + mfxU32 m_implIdxNext; + bool m_bKeepCapsUntilUnload; + CHAR_TYPE m_envVarMAX_ENV_VAR_LEN; + + // logger object - enabled with ONEVPL_DISPATCHER_LOG environment variable + DispatcherLogVPL m_dispLog; +}; + +#endif // DISPATCHER_VPL_MFX_DISPATCHER_VPL_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_config.cpp
Added
@@ -0,0 +1,1597 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include "vpl/mfx_dispatcher_vpl.h" + +#include <assert.h> + +#include <regex> + +// implementation of config context (mfxConfig) +// each loader instance can have one or more configs +// associated with it - used for filtering implementations +// based on what they support (codec types, etc.) +ConfigCtxVPL::ConfigCtxVPL() + : m_propVar(), + m_propRange32U(), + m_implName(), + m_implLicense(), + m_implKeywords(), + m_deviceIdStr(), + m_implFunctionName(), + m_extDevLUID8U(), + m_extDevNameStr(), + m_extBuf() { + // initially set Type = unset (invalid) + // if valid property string and value are passed in, + // this will be updated + // otherwise loader will ignore this cfg during EnumImplementations + for (mfxU32 idx = 0; idx < NUM_TOTAL_FILTER_PROPS; idx++) { + m_propVaridx.Version.Version = MFX_VARIANT_VERSION; + m_propVaridx.Type = MFX_VARIANT_TYPE_UNSET; + m_propVaridx.Data.U64 = 0; + } + + m_parentLoader = nullptr; + return; +} + +ConfigCtxVPL::~ConfigCtxVPL() { + return; +} + +struct PropVariant { + const char *Name; + mfxVariantType Type; +}; + +enum PropIdx { + // settable config properties for mfxImplDescription + ePropMain_Impl = 0, + ePropMain_AccelerationMode, + ePropMain_ApiVersion, + ePropMain_ApiVersion_Major, + ePropMain_ApiVersion_Minor, + ePropMain_ImplName, + ePropMain_License, + ePropMain_Keywords, + ePropMain_VendorID, + ePropMain_VendorImplID, + ePropMain_PoolAllocationPolicy, + + // settable config properties for mfxDeviceDescription + ePropDevice_DeviceID, + ePropDevice_DeviceIDStr, + ePropDevice_MediaAdapterType, + + // settable config properties for mfxDecoderDescription + ePropDec_CodecID, + ePropDec_MaxcodecLevel, + ePropDec_Profile, + ePropDec_MemHandleType, + ePropDec_Width, + ePropDec_Height, + ePropDec_ColorFormats, + + // settable config properties for mfxEncoderDescription + ePropEnc_CodecID, + ePropEnc_MaxcodecLevel, + ePropEnc_BiDirectionalPrediction, + ePropEnc_ReportedStats, + ePropEnc_Profile, + ePropEnc_MemHandleType, + ePropEnc_Width, + ePropEnc_Height, + ePropEnc_ColorFormats, + + // settable config properties for mfxVPPDescription + ePropVPP_FilterFourCC, + ePropVPP_MaxDelayInFrames, + ePropVPP_MemHandleType, + ePropVPP_Width, + ePropVPP_Height, + ePropVPP_InFormat, + ePropVPP_OutFormat, + + // settable config properties for mfxExtendedDeviceId + ePropExtDev_VendorID, + ePropExtDev_DeviceID, + ePropExtDev_PCIDomain, + ePropExtDev_PCIBus, + ePropExtDev_PCIDevice, + ePropExtDev_PCIFunction, + ePropExtDev_DeviceLUID, + ePropExtDev_LUIDDeviceNodeMask, + ePropExtDev_DRMRenderNodeNum, + ePropExtDev_DRMPrimaryNodeNum, + ePropExtDev_DeviceName, + + // special properties not part of description struct + ePropSpecial_HandleType, + ePropSpecial_Handle, + ePropSpecial_NumThread, + ePropSpecial_DeviceCopy, + ePropSpecial_ExtBuffer, + ePropSpecial_DXGIAdapterIndex, + + // functions which must report as implemented + ePropFunc_FunctionName, + + // number of entries (always last) + eProp_TotalProps +}; + +// leave table formatting alone +// clang-format off + +// order must align exactly with PropIdx list +// to avoid mismatches, this should be automated (e.g. pre-processor step) +static const PropVariant PropIdxTab = { + { "ePropMain_Impl", MFX_VARIANT_TYPE_U32 }, + { "ePropMain_AccelerationMode", MFX_VARIANT_TYPE_U32 }, + { "ePropMain_ApiVersion", MFX_VARIANT_TYPE_U32 }, + { "ePropMain_ApiVersion_Major", MFX_VARIANT_TYPE_U16 }, + { "ePropMain_ApiVersion_Minor", MFX_VARIANT_TYPE_U16 }, + { "ePropMain_ImplName", MFX_VARIANT_TYPE_PTR }, + { "ePropMain_License", MFX_VARIANT_TYPE_PTR }, + { "ePropMain_Keywords", MFX_VARIANT_TYPE_PTR }, + { "ePropMain_VendorID", MFX_VARIANT_TYPE_U32 }, + { "ePropMain_VendorImplID", MFX_VARIANT_TYPE_U32 }, + { "ePropMain_PoolAllocationPolicy", MFX_VARIANT_TYPE_U32 }, + + { "ePropDevice_DeviceID", MFX_VARIANT_TYPE_U16 }, + { "ePropDevice_DeviceIDStr", MFX_VARIANT_TYPE_PTR }, + { "ePropDevice_MediaAdapterType", MFX_VARIANT_TYPE_U16 }, + + { "ePropDec_CodecID", MFX_VARIANT_TYPE_U32 }, + { "ePropDec_MaxcodecLevel", MFX_VARIANT_TYPE_U16 }, + { "ePropDec_Profile", MFX_VARIANT_TYPE_U32 }, + { "ePropDec_MemHandleType", MFX_VARIANT_TYPE_U32 }, + { "ePropDec_Width", MFX_VARIANT_TYPE_PTR }, + { "ePropDec_Height", MFX_VARIANT_TYPE_PTR }, + { "ePropDec_ColorFormats", MFX_VARIANT_TYPE_U32 }, + + { "ePropEnc_CodecID", MFX_VARIANT_TYPE_U32 }, + { "ePropEnc_MaxcodecLevel", MFX_VARIANT_TYPE_U16 }, + { "ePropEnc_BiDirectionalPrediction", MFX_VARIANT_TYPE_U16 }, + { "ePropEnc_ReportedStats", MFX_VARIANT_TYPE_U16 }, + { "ePropEnc_Profile", MFX_VARIANT_TYPE_U32 }, + { "ePropEnc_MemHandleType", MFX_VARIANT_TYPE_U32 }, + { "ePropEnc_Width", MFX_VARIANT_TYPE_PTR }, + { "ePropEnc_Height", MFX_VARIANT_TYPE_PTR }, + { "ePropEnc_ColorFormats", MFX_VARIANT_TYPE_U32 }, + + { "ePropVPP_FilterFourCC", MFX_VARIANT_TYPE_U32 }, + { "ePropVPP_MaxDelayInFrames", MFX_VARIANT_TYPE_U16 }, + { "ePropVPP_MemHandleType", MFX_VARIANT_TYPE_U32 }, + { "ePropVPP_Width", MFX_VARIANT_TYPE_PTR }, + { "ePropVPP_Height", MFX_VARIANT_TYPE_PTR }, + { "ePropVPP_InFormat", MFX_VARIANT_TYPE_U32 }, + { "ePropVPP_OutFormat", MFX_VARIANT_TYPE_U32 }, + + { "ePropExtDev_VendorID", MFX_VARIANT_TYPE_U16 }, + { "ePropExtDev_DeviceID", MFX_VARIANT_TYPE_U16 }, + { "ePropExtDev_PCIDomain", MFX_VARIANT_TYPE_U32 }, + { "ePropExtDev_PCIBus", MFX_VARIANT_TYPE_U32 }, + { "ePropExtDev_PCIDevice", MFX_VARIANT_TYPE_U32 }, + { "ePropExtDev_PCIFunction", MFX_VARIANT_TYPE_U32 }, + { "ePropExtDev_DeviceLUID", MFX_VARIANT_TYPE_PTR }, + { "ePropExtDev_LUIDDeviceNodeMask", MFX_VARIANT_TYPE_U32 }, + { "ePropExtDev_DRMRenderNodeNum", MFX_VARIANT_TYPE_U32 }, + { "ePropExtDev_DRMPrimaryNodeNum", MFX_VARIANT_TYPE_U32 }, + { "ePropExtDev_DeviceName", MFX_VARIANT_TYPE_PTR }, + + { "ePropSpecial_HandleType", MFX_VARIANT_TYPE_U32 }, + { "ePropSpecial_Handle", MFX_VARIANT_TYPE_PTR }, + { "ePropSpecial_NumThread", MFX_VARIANT_TYPE_U32 }, + { "ePropSpecial_DeviceCopy", MFX_VARIANT_TYPE_U16 }, + { "ePropSpecial_ExtBuffer", MFX_VARIANT_TYPE_PTR }, + { "ePropSpecial_DXGIAdapterIndex", MFX_VARIANT_TYPE_U32 }, + + { "ePropFunc_FunctionName", MFX_VARIANT_TYPE_PTR }, +}; + +// end table formatting +// clang-format on + +// sanity check - property table and indexes must have same number of entries +static_assert((sizeof(PropIdxTab) / sizeof(PropVariant)) == eProp_TotalProps, + "PropIdx and PropIdxTab are misaligned"); + +static_assert(NUM_TOTAL_FILTER_PROPS == eProp_TotalProps, + "NUM_TOTAL_FILTER_PROPS and eProp_TotalProps are misaligned"); + +mfxStatus ConfigCtxVPL::ValidateAndSetProp(mfxI32 idx, mfxVariant value) { + if (idx < 0 || idx >= eProp_TotalProps) + return MFX_ERR_NOT_FOUND; + + if (value.Type != PropIdxTabidx.Type) + return MFX_ERR_UNSUPPORTED; + + m_propVaridx.Version.Version = MFX_VARIANT_VERSION; + m_propVaridx.Type = value.Type; + + if (value.Type == MFX_VARIANT_TYPE_PTR) { + if (value.Data.Ptr == nullptr) { + // unset property to avoid possibly dereferencing null if app ignores error code + m_propVaridx.Type = MFX_VARIANT_TYPE_UNSET; + return MFX_ERR_NULL_PTR; + } + + // local ptr for copying from array + mfxU8 *pU8 = (mfxU8 *)(value.Data.Ptr); + + mfxExtBuffer *extBuf = nullptr; + + // save copy of data passed by pointer, into object of the appropriate type + switch (idx) { + case ePropDec_Width: + m_propRange32UPROP_RANGE_DEC_W = *((mfxRange32U *)(value.Data.Ptr)); + m_propVaridx.Data.Ptr = &(m_propRange32UPROP_RANGE_DEC_W); + break; + case ePropDec_Height: + m_propRange32UPROP_RANGE_DEC_H = *((mfxRange32U *)(value.Data.Ptr)); + m_propVaridx.Data.Ptr = &(m_propRange32UPROP_RANGE_DEC_H); + break; + case ePropEnc_Width: + m_propRange32UPROP_RANGE_ENC_W = *((mfxRange32U *)(value.Data.Ptr)); + m_propVaridx.Data.Ptr = &(m_propRange32UPROP_RANGE_ENC_W); + break; + case ePropEnc_Height: + m_propRange32UPROP_RANGE_ENC_H = *((mfxRange32U *)(value.Data.Ptr)); + m_propVaridx.Data.Ptr = &(m_propRange32UPROP_RANGE_ENC_H); + break; + case ePropVPP_Width: + m_propRange32UPROP_RANGE_VPP_W = *((mfxRange32U *)(value.Data.Ptr)); + m_propVaridx.Data.Ptr = &(m_propRange32UPROP_RANGE_VPP_W); + break; + case ePropVPP_Height: + m_propRange32UPROP_RANGE_VPP_H = *((mfxRange32U *)(value.Data.Ptr)); + m_propVaridx.Data.Ptr = &(m_propRange32UPROP_RANGE_VPP_H); + break; + case ePropSpecial_Handle: + m_propVaridx.Data.Ptr = (mfxHDL)(value.Data.Ptr); + break; + case ePropMain_ImplName: + m_implName = (char *)(value.Data.Ptr); + m_propVaridx.Data.Ptr = &(m_implName); + break; + case ePropMain_License: + m_implLicense = (char *)(value.Data.Ptr); + m_propVaridx.Data.Ptr = &(m_implLicense); + break; + case ePropMain_Keywords: + m_implKeywords = (char *)(value.Data.Ptr); + m_propVaridx.Data.Ptr = &(m_implKeywords); + break; + case ePropDevice_DeviceIDStr: + m_deviceIdStr = (char *)(value.Data.Ptr); + m_propVaridx.Data.Ptr = &(m_deviceIdStr); + break; + case ePropFunc_FunctionName: + // no need to save Data.Ptr - parsed in main loop + m_implFunctionName = (char *)(value.Data.Ptr); + break; + case ePropExtDev_DeviceLUID: + for (mfxU32 j = 0; j < 8; j++) + m_extDevLUID8Uj = pU8j; + m_propVaridx.Data.Ptr = &(m_extDevLUID8U0); + break; + case ePropExtDev_DeviceName: + m_extDevNameStr = (char *)(value.Data.Ptr); + m_propVaridx.Data.Ptr = &(m_extDevNameStr); + break; + case ePropSpecial_ExtBuffer: + // Don't assume anything about the lifetime of input mfxExtBuffer in Data.Ptr + // Instead, we copy the full extBuf into a vector owned by ConfixCtxVPL and will pass this to MFXInitialize() + // if app calls MFXSetConfigFilterProperty('ExtBuffer') again with a different extBuf, the old copy will be overwritten + SetExtBuf((mfxExtBuffer *)(value.Data.Ptr)); + + if (GetExtBuf(&extBuf)) + m_propVaridx.Data.Ptr = extBuf; + break; + default: + break; + } + } + else { + m_propVaridx.Data = value.Data; + } + + return MFX_ERR_NONE; +} + +mfxStatus ConfigCtxVPL::SetFilterPropertyDec(std::list<std::string> &propParsedString, + mfxVariant value) { + std::string nextProp; + + nextProp = GetNextProp(propParsedString); + + // no settable top-level members + if (nextProp != "decoder") + return MFX_ERR_NOT_FOUND; + + // parse 'decoder' + nextProp = GetNextProp(propParsedString); + if (nextProp == "CodecID") { + return ValidateAndSetProp(ePropDec_CodecID, value); + } + else if (nextProp == "MaxcodecLevel") { + return ValidateAndSetProp(ePropDec_MaxcodecLevel, value); + } + else if (nextProp != "decprofile") { + return MFX_ERR_NOT_FOUND; + } + + // parse 'decprofile' + nextProp = GetNextProp(propParsedString); + if (nextProp == "Profile") { + return ValidateAndSetProp(ePropDec_Profile, value); + } + else if (nextProp != "decmemdesc") { + return MFX_ERR_NOT_FOUND; + } + + // parse 'decmemdesc' + nextProp = GetNextProp(propParsedString); + if (nextProp == "MemHandleType") { + return ValidateAndSetProp(ePropDec_MemHandleType, value); + } + else if (nextProp == "Width") { + return ValidateAndSetProp(ePropDec_Width, value); + } + else if (nextProp == "Height") { + return ValidateAndSetProp(ePropDec_Height, value); + } + else if (nextProp == "ColorFormat" || nextProp == "ColorFormats") { + return ValidateAndSetProp(ePropDec_ColorFormats, value); + } + + // end of mfxDecoderDescription options + return MFX_ERR_NOT_FOUND; +} + +mfxStatus ConfigCtxVPL::SetFilterPropertyEnc(std::list<std::string> &propParsedString, + mfxVariant value) { + std::string nextProp; + + nextProp = GetNextProp(propParsedString); + + // no settable top-level members + if (nextProp != "encoder") + return MFX_ERR_NOT_FOUND; + + // parse 'encoder' + nextProp = GetNextProp(propParsedString); + if (nextProp == "CodecID") { + return ValidateAndSetProp(ePropEnc_CodecID, value); + } + else if (nextProp == "MaxcodecLevel") { + return ValidateAndSetProp(ePropEnc_MaxcodecLevel, value); + } + else if (nextProp == "BiDirectionalPrediction") { + return ValidateAndSetProp(ePropEnc_BiDirectionalPrediction, value); + } +#ifdef ONEVPL_EXPERIMENTAL + else if (nextProp == "ReportedStats") { + return ValidateAndSetProp(ePropEnc_ReportedStats, value); + } +#endif + else if (nextProp != "encprofile") { + return MFX_ERR_NOT_FOUND; + } + + // parse 'encprofile' + nextProp = GetNextProp(propParsedString); + if (nextProp == "Profile") { + return ValidateAndSetProp(ePropEnc_Profile, value); + } + else if (nextProp != "encmemdesc") { + return MFX_ERR_NOT_FOUND; + } + + // parse 'encmemdesc' + nextProp = GetNextProp(propParsedString); + if (nextProp == "MemHandleType") { + return ValidateAndSetProp(ePropEnc_MemHandleType, value); + } + else if (nextProp == "Width") { + return ValidateAndSetProp(ePropEnc_Width, value); + } + else if (nextProp == "Height") { + return ValidateAndSetProp(ePropEnc_Height, value); + } + else if (nextProp == "ColorFormat" || nextProp == "ColorFormats") { + return ValidateAndSetProp(ePropEnc_ColorFormats, value); + } + + // end of mfxEncoderDescription options + return MFX_ERR_NOT_FOUND; +} + +mfxStatus ConfigCtxVPL::SetFilterPropertyVPP(std::list<std::string> &propParsedString, + mfxVariant value) { + std::string nextProp; + + nextProp = GetNextProp(propParsedString); + + // no settable top-level members + if (nextProp != "filter") + return MFX_ERR_NOT_FOUND; + + // parse 'filter' + nextProp = GetNextProp(propParsedString); + if (nextProp == "FilterFourCC") { + return ValidateAndSetProp(ePropVPP_FilterFourCC, value); + } + else if (nextProp == "MaxDelayInFrames") { + return ValidateAndSetProp(ePropVPP_MaxDelayInFrames, value); + } + else if (nextProp != "memdesc") { + return MFX_ERR_NOT_FOUND; + } + + // parse 'memdesc' + nextProp = GetNextProp(propParsedString); + if (nextProp == "MemHandleType") { + return ValidateAndSetProp(ePropVPP_MemHandleType, value); + } + else if (nextProp == "Width") { + return ValidateAndSetProp(ePropVPP_Width, value); + } + else if (nextProp == "Height") { + return ValidateAndSetProp(ePropVPP_Height, value); + } + else if (nextProp != "format") { + return MFX_ERR_NOT_FOUND; + } + + // parse 'format' + nextProp = GetNextProp(propParsedString); + if (nextProp == "InFormat") { + return ValidateAndSetProp(ePropVPP_InFormat, value); + } + else if (nextProp == "OutFormat" || nextProp == "OutFormats") { + return ValidateAndSetProp(ePropVPP_OutFormat, value); + } + + // end of mfxVPPDescription options + return MFX_ERR_NOT_FOUND; +} + +// return codes (from spec): +// MFX_ERR_NOT_FOUND - name contains unknown parameter name +// MFX_ERR_UNSUPPORTED - value data type != parameter with provided name +mfxStatus ConfigCtxVPL::SetFilterProperty(const mfxU8 *name, mfxVariant value) { + if (!name) + return MFX_ERR_NULL_PTR; + + std::list<std::string> propParsedString; + + // parse property string into individual properties, + // separated by '.' + std::stringstream prop((char *)name); + std::string s; + propParsedString.clear(); + while (getline(prop, s, '.')) { + propParsedString.push_back(s); + } + + // get first property descriptor + std::string nextProp = GetNextProp(propParsedString); + + // check for special-case properties, not part of mfxImplDescription + if (nextProp == "mfxHandleType") { + return ValidateAndSetProp(ePropSpecial_HandleType, value); + } + else if (nextProp == "mfxHDL") { + return ValidateAndSetProp(ePropSpecial_Handle, value); + } + else if (nextProp == "NumThread") { + return ValidateAndSetProp(ePropSpecial_NumThread, value); + } +#ifdef ONEVPL_EXPERIMENTAL + else if (nextProp == "DeviceCopy") { + return ValidateAndSetProp(ePropSpecial_DeviceCopy, value); + } +#endif + else if (nextProp == "ExtBuffer") { + return ValidateAndSetProp(ePropSpecial_ExtBuffer, value); + } + else if (nextProp == "DXGIAdapterIndex") { +#if defined(_WIN32) || defined(_WIN64) + // this property is only valid on Windows + return ValidateAndSetProp(ePropSpecial_DXGIAdapterIndex, value); +#else + return MFX_ERR_NOT_FOUND; +#endif + } + + // to require that a specific function is implemented, use the property name + // "mfxImplementedFunctions.FunctionsName" + if (nextProp == "mfxImplementedFunctions") { + nextProp = GetNextProp(propParsedString); + if (nextProp == "FunctionsName") { + return ValidateAndSetProp(ePropFunc_FunctionName, value); + } + return MFX_ERR_NOT_FOUND; + } + +#ifdef ONEVPL_EXPERIMENTAL + // extended device ID properties must begin with mfxExtendedDeviceId + if (nextProp == "mfxExtendedDeviceId") { + nextProp = GetNextProp(propParsedString); + if (nextProp == "VendorID") { + return ValidateAndSetProp(ePropExtDev_VendorID, value); + } + else if (nextProp == "DeviceID") { + return ValidateAndSetProp(ePropExtDev_DeviceID, value); + } + else if (nextProp == "PCIDomain") { + return ValidateAndSetProp(ePropExtDev_PCIDomain, value); + } + else if (nextProp == "PCIBus") { + return ValidateAndSetProp(ePropExtDev_PCIBus, value); + } + else if (nextProp == "PCIDevice") { + return ValidateAndSetProp(ePropExtDev_PCIDevice, value); + } + else if (nextProp == "PCIFunction") { + return ValidateAndSetProp(ePropExtDev_PCIFunction, value); + } + else if (nextProp == "DeviceLUID") { + return ValidateAndSetProp(ePropExtDev_DeviceLUID, value); + } + else if (nextProp == "LUIDDeviceNodeMask") { + return ValidateAndSetProp(ePropExtDev_LUIDDeviceNodeMask, value); + } + else if (nextProp == "DRMRenderNodeNum") { + return ValidateAndSetProp(ePropExtDev_DRMRenderNodeNum, value); + } + else if (nextProp == "DRMPrimaryNodeNum") { + return ValidateAndSetProp(ePropExtDev_DRMPrimaryNodeNum, value); + } + else if (nextProp == "DeviceName") { + return ValidateAndSetProp(ePropExtDev_DeviceName, value); + } + return MFX_ERR_NOT_FOUND; + } +#endif + + // standard properties must begin with "mfxImplDescription" + if (nextProp != "mfxImplDescription") { + return MFX_ERR_NOT_FOUND; + } + + // get next property descriptor + nextProp = GetNextProp(propParsedString); + + // property is a top-level member of mfxImplDescription + if (nextProp == "Impl") { + return ValidateAndSetProp(ePropMain_Impl, value); + } + else if (nextProp == "AccelerationMode") { + return ValidateAndSetProp(ePropMain_AccelerationMode, value); + } + else if (nextProp == "mfxSurfacePoolMode") { + return ValidateAndSetProp(ePropMain_PoolAllocationPolicy, value); + } + else if (nextProp == "ApiVersion") { + // ApiVersion may be passed as single U32 (Version) or two U16's (Major, Minor) + nextProp = GetNextProp(propParsedString); + if (nextProp == "Version") + return ValidateAndSetProp(ePropMain_ApiVersion, value); + else if (nextProp == "Major") + return ValidateAndSetProp(ePropMain_ApiVersion_Major, value); + else if (nextProp == "Minor") + return ValidateAndSetProp(ePropMain_ApiVersion_Minor, value); + else + return MFX_ERR_NOT_FOUND; + } + else if (nextProp == "VendorID") { + return ValidateAndSetProp(ePropMain_VendorID, value); + } + else if (nextProp == "ImplName") { + return ValidateAndSetProp(ePropMain_ImplName, value); + } + else if (nextProp == "License") { + return ValidateAndSetProp(ePropMain_License, value); + } + else if (nextProp == "Keywords") { + return ValidateAndSetProp(ePropMain_Keywords, value); + } + else if (nextProp == "VendorImplID") { + return ValidateAndSetProp(ePropMain_VendorImplID, value); + } + + // property is a member of mfxDeviceDescription + if (nextProp == "mfxDeviceDescription") { + nextProp = GetNextProp(propParsedString); + // old version of table in spec had extra "device", just skip if present + if (nextProp == "device") + nextProp = GetNextProp(propParsedString); + + // special case - deviceID may be passed as U16 (default) or string (since API 2.4) + // for compatibility, both are supported (value.Type distinguishes between them) + if (nextProp == "DeviceID") { + if (value.Type == MFX_VARIANT_TYPE_PTR) + return ValidateAndSetProp(ePropDevice_DeviceIDStr, value); + else + return ValidateAndSetProp(ePropDevice_DeviceID, value); + } + + if (nextProp == "MediaAdapterType") { + return ValidateAndSetProp(ePropDevice_MediaAdapterType, value); + } + + return MFX_ERR_NOT_FOUND; + } + + // property is a member of mfxDecoderDescription + if (nextProp == "mfxDecoderDescription") { + return SetFilterPropertyDec(propParsedString, value); + } + + if (nextProp == "mfxEncoderDescription") { + return SetFilterPropertyEnc(propParsedString, value); + } + + if (nextProp == "mfxVPPDescription") { + return SetFilterPropertyVPP(propParsedString, value); + } + + return MFX_ERR_NOT_FOUND; +} + +#define CHECK_IDX(idxA, idxB, numB) \ + if ((idxB) == (numB)) { \ + (idxA)++; \ + (idxB) = 0; \ + continue; \ + } + +mfxStatus ConfigCtxVPL::GetFlatDescriptionsDec(const mfxImplDescription *libImplDesc, + std::list<DecConfig> &decConfigList) { + mfxU32 codecIdx = 0; + mfxU32 profileIdx = 0; + mfxU32 memIdx = 0; + mfxU32 outFmtIdx = 0; + + DecCodec *decCodec = nullptr; + DecProfile *decProfile = nullptr; + DecMemDesc *decMemDesc = nullptr; + + while (codecIdx < libImplDesc->Dec.NumCodecs) { + DecConfig dc = {}; + + decCodec = &(libImplDesc->Dec.CodecscodecIdx); + dc.CodecID = decCodec->CodecID; + dc.MaxcodecLevel = decCodec->MaxcodecLevel; + CHECK_IDX(codecIdx, profileIdx, decCodec->NumProfiles); + + decProfile = &(decCodec->ProfilesprofileIdx); + dc.Profile = decProfile->Profile; + CHECK_IDX(profileIdx, memIdx, decProfile->NumMemTypes); + + decMemDesc = &(decProfile->MemDescmemIdx); + dc.MemHandleType = decMemDesc->MemHandleType; + dc.Width = decMemDesc->Width; + dc.Height = decMemDesc->Height; + CHECK_IDX(memIdx, outFmtIdx, decMemDesc->NumColorFormats); + + dc.ColorFormat = decMemDesc->ColorFormatsoutFmtIdx; + outFmtIdx++; + + // we have a valid, unique description - add to list + decConfigList.push_back(dc); + } + + if (decConfigList.empty()) + return MFX_ERR_INVALID_VIDEO_PARAM; + + return MFX_ERR_NONE; +} + +mfxStatus ConfigCtxVPL::GetFlatDescriptionsEnc(const mfxImplDescription *libImplDesc, + std::list<EncConfig> &encConfigList) { + mfxU32 codecIdx = 0; + mfxU32 profileIdx = 0; + mfxU32 memIdx = 0; + mfxU32 inFmtIdx = 0; + + EncCodec *encCodec = nullptr; + EncProfile *encProfile = nullptr; + EncMemDesc *encMemDesc = nullptr; + +#ifdef ONEVPL_EXPERIMENTAL + // ReportedStats was added with API 2.7 under ONEVPL_EXPERIMENTAL. + // When it is promoted to production API, MFX_ENCODERDESCRIPTION_VERSION should be bumped up + // and we should check mfxEncoderDescription.Version instead to know whether ReportedStats + // is a valid field (taken from reserved space). + // Until then, best we can do is to check the overall API version for this impl. + mfxVersion reqApiVersionReportedStats = {}; + reqApiVersionReportedStats.Major = 2; + reqApiVersionReportedStats.Minor = 7; +#endif + + while (codecIdx < libImplDesc->Enc.NumCodecs) { + EncConfig ec = {}; + + encCodec = &(libImplDesc->Enc.CodecscodecIdx); + ec.CodecID = encCodec->CodecID; + ec.MaxcodecLevel = encCodec->MaxcodecLevel; + ec.BiDirectionalPrediction = encCodec->BiDirectionalPrediction; + +#ifdef ONEVPL_EXPERIMENTAL + // see comment above about checking mfxEncoderDescription version once this is moved out + // of experimental API + if (libImplDesc->ApiVersion.Version >= reqApiVersionReportedStats.Version) + ec.ReportedStats = encCodec->ReportedStats; +#endif + + CHECK_IDX(codecIdx, profileIdx, encCodec->NumProfiles); + + encProfile = &(encCodec->ProfilesprofileIdx); + ec.Profile = encProfile->Profile; + CHECK_IDX(profileIdx, memIdx, encProfile->NumMemTypes); + + encMemDesc = &(encProfile->MemDescmemIdx); + ec.MemHandleType = encMemDesc->MemHandleType; + ec.Width = encMemDesc->Width; + ec.Height = encMemDesc->Height; + CHECK_IDX(memIdx, inFmtIdx, encMemDesc->NumColorFormats); + + ec.ColorFormat = encMemDesc->ColorFormatsinFmtIdx; + inFmtIdx++; + + // we have a valid, unique description - add to list + encConfigList.push_back(ec); + } + + if (encConfigList.empty()) + return MFX_ERR_INVALID_VIDEO_PARAM; + + return MFX_ERR_NONE; +} + +mfxStatus ConfigCtxVPL::GetFlatDescriptionsVPP(const mfxImplDescription *libImplDesc, + std::list<VPPConfig> &vppConfigList) { + mfxU32 filterIdx = 0; + mfxU32 memIdx = 0; + mfxU32 inFmtIdx = 0; + mfxU32 outFmtIdx = 0; + + VPPFilter *vppFilter = nullptr; + VPPMemDesc *vppMemDesc = nullptr; + VPPFormat *vppFormat = nullptr; + + while (filterIdx < libImplDesc->VPP.NumFilters) { + VPPConfig vc = {}; + + vppFilter = &(libImplDesc->VPP.FiltersfilterIdx); + vc.FilterFourCC = vppFilter->FilterFourCC; + vc.MaxDelayInFrames = vppFilter->MaxDelayInFrames; + CHECK_IDX(filterIdx, memIdx, vppFilter->NumMemTypes); + + vppMemDesc = &(vppFilter->MemDescmemIdx); + vc.MemHandleType = vppMemDesc->MemHandleType; + vc.Width = vppMemDesc->Width; + vc.Height = vppMemDesc->Height; + CHECK_IDX(memIdx, inFmtIdx, vppMemDesc->NumInFormats); + + vppFormat = &(vppMemDesc->FormatsinFmtIdx); + vc.InFormat = vppFormat->InFormat; + CHECK_IDX(inFmtIdx, outFmtIdx, vppFormat->NumOutFormat); + + vc.OutFormat = vppFormat->OutFormatsoutFmtIdx; + outFmtIdx++; + + // we have a valid, unique description - add to list + vppConfigList.push_back(vc); + } + + if (vppConfigList.empty()) + return MFX_ERR_INVALID_VIDEO_PARAM; + + return MFX_ERR_NONE; +} + +#define CHECK_PROP(idx, type, val) \ + if ((cfgPropsAll(idx).Type != MFX_VARIANT_TYPE_UNSET) && \ + (cfgPropsAll(idx).Data.type != val)) \ + isCompatible = false; + +mfxStatus ConfigCtxVPL::CheckPropsGeneral(const mfxVariant cfgPropsAll, + const mfxImplDescription *libImplDesc) { + bool isCompatible = true; + + // check if this implementation includes + // all of the required top-level properties + CHECK_PROP(ePropMain_Impl, U32, libImplDesc->Impl); + CHECK_PROP(ePropMain_VendorID, U32, libImplDesc->VendorID); + CHECK_PROP(ePropMain_VendorImplID, U32, libImplDesc->VendorImplID); + + // check API version in calling function since major and minor may be passed + // in separate cfg objects + + if (libImplDesc->AccelerationModeDescription.NumAccelerationModes > 0) { + if (cfgPropsAllePropMain_AccelerationMode.Type != MFX_VARIANT_TYPE_UNSET) { + // check all supported modes if list is filled out + mfxU16 numModes = libImplDesc->AccelerationModeDescription.NumAccelerationModes; + mfxAccelerationMode modeRequested = + (mfxAccelerationMode)(cfgPropsAllePropMain_AccelerationMode.Data.U32); + auto *modeTab = libImplDesc->AccelerationModeDescription.Mode; + + auto *m = std::find(modeTab, modeTab + numModes, modeRequested); + if (m == modeTab + numModes) + isCompatible = false; + } + } + else { + // check default mode + CHECK_PROP(ePropMain_AccelerationMode, U32, libImplDesc->AccelerationMode); + } + + if (cfgPropsAllePropMain_PoolAllocationPolicy.Type != MFX_VARIANT_TYPE_UNSET) { + // mfxPoolAllocationPolicy added with struct version 1.2 + mfxU16 numPolicies = 0; + if (libImplDesc->Version.Version >= MFX_STRUCT_VERSION(1, 2)) + numPolicies = libImplDesc->PoolPolicies.NumPoolPolicies; + + // check all supported policies if list is filled out + // if structure is not present (old version) numPolicies will be 0, so skipped + if (isCompatible == true && numPolicies > 0) { + mfxPoolAllocationPolicy policyRequested = + (mfxPoolAllocationPolicy)(cfgPropsAllePropMain_PoolAllocationPolicy.Data.U32); + auto *policyTab = libImplDesc->PoolPolicies.Policy; + + auto *m = std::find(policyTab, policyTab + numPolicies, policyRequested); + if (m == policyTab + numPolicies) + isCompatible = false; + } + else { + isCompatible = false; + } + } + + // check string: ImplName (string match) + if (cfgPropsAllePropMain_ImplName.Type != MFX_VARIANT_TYPE_UNSET) { + std::string filtName = *(std::string *)(cfgPropsAllePropMain_ImplName.Data.Ptr); + std::string implName = libImplDesc->ImplName; + if (filtName != implName) + isCompatible = false; + } + + // check string: License (tokenized) + if (cfgPropsAllePropMain_License.Type != MFX_VARIANT_TYPE_UNSET) { + std::string license = *(std::string *)(cfgPropsAllePropMain_License.Data.Ptr); + if (CheckPropString(libImplDesc->License, license) != MFX_ERR_NONE) + isCompatible = false; + } + + // check string: Keywords (tokenized) + if (cfgPropsAllePropMain_Keywords.Type != MFX_VARIANT_TYPE_UNSET) { + std::string keywords = *(std::string *)(cfgPropsAllePropMain_Keywords.Data.Ptr); + if (CheckPropString(libImplDesc->Keywords, keywords) != MFX_ERR_NONE) + isCompatible = false; + } + + // check DeviceID - stored as char*, but passed in for filtering as U16 + // convert both to unsigned ints and compare + if (cfgPropsAllePropDevice_DeviceID.Type != MFX_VARIANT_TYPE_UNSET) { + unsigned int implDeviceID = 0; + try { + implDeviceID = std::stoi(libImplDesc->Dev.DeviceID, 0, 16); + } + catch (...) { + return MFX_ERR_UNSUPPORTED; + } + + unsigned int filtDeviceID = (unsigned int)(cfgPropsAllePropDevice_DeviceID.Data.U16); + if (implDeviceID != filtDeviceID) + isCompatible = false; + } + + if (cfgPropsAllePropDevice_DeviceIDStr.Type != MFX_VARIANT_TYPE_UNSET) { + // since API 2.4 - pass DeviceID as string (do string match) + std::string filtDeviceID = *(std::string *)(cfgPropsAllePropDevice_DeviceIDStr.Data.Ptr); + std::string implDeviceID = libImplDesc->Dev.DeviceID; + if (filtDeviceID != implDeviceID) + isCompatible = false; + } + + // mfxDeviceDescription.MediaAdapterType introduced in API 2.5, structure version 1.1 + // do not check this for MSDK libs (allow it to pass) + if (libImplDesc->ApiVersion.Major >= 2) { + if (cfgPropsAllePropDevice_MediaAdapterType.Type != MFX_VARIANT_TYPE_UNSET) { + if (libImplDesc->Dev.Version.Version < MFX_STRUCT_VERSION(1, 1)) + isCompatible = false; + + CHECK_PROP(ePropDevice_MediaAdapterType, U16, libImplDesc->Dev.MediaAdapterType); + } + } + + if (isCompatible == true) + return MFX_ERR_NONE; + + return MFX_ERR_UNSUPPORTED; +} + +mfxStatus ConfigCtxVPL::CheckPropsDec(const mfxVariant cfgPropsAll, + std::list<DecConfig> decConfigList) { + auto it = decConfigList.begin(); + while (it != decConfigList.end()) { + DecConfig dc = (DecConfig)(*it); + bool isCompatible = true; + + // check if this decode description includes + // all of the required decoder properties + CHECK_PROP(ePropDec_CodecID, U32, dc.CodecID); + CHECK_PROP(ePropDec_MaxcodecLevel, U16, dc.MaxcodecLevel); + CHECK_PROP(ePropDec_Profile, U32, dc.Profile); + CHECK_PROP(ePropDec_MemHandleType, U32, dc.MemHandleType); + CHECK_PROP(ePropDec_ColorFormats, U32, dc.ColorFormat); + + // special handling for properties passed via pointer + if (cfgPropsAllePropDec_Width.Type != MFX_VARIANT_TYPE_UNSET) { + mfxRange32U width = {}; + if (cfgPropsAllePropDec_Width.Data.Ptr) + width = *((mfxRange32U *)(cfgPropsAllePropDec_Width.Data.Ptr)); + + if ((width.Max > dc.Width.Max) || (width.Min < dc.Width.Min) || + (width.Step < dc.Width.Step)) + isCompatible = false; + } + + if (cfgPropsAllePropDec_Height.Type != MFX_VARIANT_TYPE_UNSET) { + mfxRange32U height = {}; + if (cfgPropsAllePropDec_Height.Data.Ptr) + height = *((mfxRange32U *)(cfgPropsAllePropDec_Height.Data.Ptr)); + + if ((height.Max > dc.Height.Max) || (height.Min < dc.Height.Min) || + (height.Step < dc.Height.Step)) + isCompatible = false; + } + + if (isCompatible == true) + return MFX_ERR_NONE; + + it++; + } + + return MFX_ERR_UNSUPPORTED; +} + +mfxStatus ConfigCtxVPL::CheckPropsEnc(const mfxVariant cfgPropsAll, + std::list<EncConfig> encConfigList) { + auto it = encConfigList.begin(); + while (it != encConfigList.end()) { + EncConfig ec = (EncConfig)(*it); + bool isCompatible = true; + + // check if this encode description includes + // all of the required encoder properties + CHECK_PROP(ePropEnc_CodecID, U32, ec.CodecID); + CHECK_PROP(ePropEnc_MaxcodecLevel, U16, ec.MaxcodecLevel); + CHECK_PROP(ePropEnc_BiDirectionalPrediction, U16, ec.BiDirectionalPrediction); + CHECK_PROP(ePropEnc_Profile, U32, ec.Profile); + CHECK_PROP(ePropEnc_MemHandleType, U32, ec.MemHandleType); + CHECK_PROP(ePropEnc_ColorFormats, U32, ec.ColorFormat); + + // special handling for properties passed via pointer + if (cfgPropsAllePropEnc_Width.Type != MFX_VARIANT_TYPE_UNSET) { + mfxRange32U width = {}; + if (cfgPropsAllePropEnc_Width.Data.Ptr) + width = *((mfxRange32U *)(cfgPropsAllePropEnc_Width.Data.Ptr)); + + if ((width.Max > ec.Width.Max) || (width.Min < ec.Width.Min) || + (width.Step < ec.Width.Step)) + isCompatible = false; + } + + if (cfgPropsAllePropEnc_Height.Type != MFX_VARIANT_TYPE_UNSET) { + mfxRange32U height = {}; + if (cfgPropsAllePropEnc_Height.Data.Ptr) + height = *((mfxRange32U *)(cfgPropsAllePropEnc_Height.Data.Ptr)); + + if ((height.Max > ec.Height.Max) || (height.Min < ec.Height.Min) || + (height.Step < ec.Height.Step)) + isCompatible = false; + } + + if (cfgPropsAllePropEnc_ReportedStats.Type != MFX_VARIANT_TYPE_UNSET) { + mfxU16 requestedStats = cfgPropsAllePropEnc_ReportedStats.Data.U16; + + // ReportedStats is a logical OR of one or more flags: MFX_ENCODESTATS_LEVEL_xxx + if ((requestedStats & ec.ReportedStats) != requestedStats) + isCompatible = false; + } + + if (isCompatible == true) + return MFX_ERR_NONE; + + it++; + } + + return MFX_ERR_UNSUPPORTED; +} + +mfxStatus ConfigCtxVPL::CheckPropsVPP(const mfxVariant cfgPropsAll, + std::list<VPPConfig> vppConfigList) { + auto it = vppConfigList.begin(); + while (it != vppConfigList.end()) { + VPPConfig vc = (VPPConfig)(*it); + bool isCompatible = true; + + // check if this filter description includes + // all of the required VPP properties + CHECK_PROP(ePropVPP_FilterFourCC, U32, vc.FilterFourCC); + CHECK_PROP(ePropVPP_MaxDelayInFrames, U16, vc.MaxDelayInFrames); + CHECK_PROP(ePropVPP_MemHandleType, U32, vc.MemHandleType); + CHECK_PROP(ePropVPP_InFormat, U32, vc.InFormat); + CHECK_PROP(ePropVPP_OutFormat, U32, vc.OutFormat); + + // special handling for properties passed via pointer + if (cfgPropsAllePropVPP_Width.Type != MFX_VARIANT_TYPE_UNSET) { + mfxRange32U width = {}; + if (cfgPropsAllePropVPP_Width.Data.Ptr) + width = *((mfxRange32U *)(cfgPropsAllePropVPP_Width.Data.Ptr)); + + if ((width.Max > vc.Width.Max) || (width.Min < vc.Width.Min) || + (width.Step < vc.Width.Step)) + isCompatible = false; + } + + if (cfgPropsAllePropVPP_Height.Type != MFX_VARIANT_TYPE_UNSET) { + mfxRange32U height = {}; + if (cfgPropsAllePropVPP_Height.Data.Ptr) + height = *((mfxRange32U *)(cfgPropsAllePropVPP_Height.Data.Ptr)); + + if ((height.Max > vc.Height.Max) || (height.Min < vc.Height.Min) || + (height.Step < vc.Height.Step)) + isCompatible = false; + } + + if (isCompatible == true) + return MFX_ERR_NONE; + + it++; + } + + return MFX_ERR_UNSUPPORTED; +} + +#ifdef ONEVPL_EXPERIMENTAL +mfxStatus ConfigCtxVPL::CheckPropsExtDevID(const mfxVariant cfgPropsAll, + const mfxExtendedDeviceId *libImplExtDevID) { + bool isCompatible = true; + + // check if this implementation includes + // all of the required extended device ID properties + CHECK_PROP(ePropExtDev_VendorID, U16, libImplExtDevID->VendorID); + CHECK_PROP(ePropExtDev_DeviceID, U16, libImplExtDevID->DeviceID); + + CHECK_PROP(ePropExtDev_PCIDomain, U32, libImplExtDevID->PCIDomain); + CHECK_PROP(ePropExtDev_PCIBus, U32, libImplExtDevID->PCIBus); + CHECK_PROP(ePropExtDev_PCIDevice, U32, libImplExtDevID->PCIDevice); + CHECK_PROP(ePropExtDev_PCIFunction, U32, libImplExtDevID->PCIFunction); + + // check DeviceLUID, require LUIDValid == true + if (cfgPropsAllePropExtDev_DeviceLUID.Type != MFX_VARIANT_TYPE_UNSET) { + // LUID filter is passed as ptr to 8-byte array, which was saved in local copy + mfxU8 *pU8 = (mfxU8 *)(cfgPropsAllePropExtDev_DeviceLUID.Data.Ptr); + if (libImplExtDevID->LUIDValid) { + for (mfxU32 j = 0; j < 8; j++) { + if (pU8j != libImplExtDevID->DeviceLUIDj) + isCompatible = false; + } + } + else { + isCompatible = false; + } + } + + // check LUIDDeviceNodeMask, require LUIDValid == true + if (cfgPropsAllePropExtDev_LUIDDeviceNodeMask.Type != MFX_VARIANT_TYPE_UNSET) { + if (libImplExtDevID->LUIDValid) { + CHECK_PROP(ePropExtDev_LUIDDeviceNodeMask, U32, libImplExtDevID->LUIDDeviceNodeMask); + } + else { + isCompatible = false; + } + } + + // check DRMRenderNodeNum + if (cfgPropsAllePropExtDev_DRMRenderNodeNum.Type != MFX_VARIANT_TYPE_UNSET) { + if (libImplExtDevID->DRMRenderNodeNum != 0) { + CHECK_PROP(ePropExtDev_DRMRenderNodeNum, U32, libImplExtDevID->DRMRenderNodeNum); + } + else { + isCompatible = false; + } + } + + // check DRMPrimaryNodeNum + if (cfgPropsAllePropExtDev_DRMPrimaryNodeNum.Type != MFX_VARIANT_TYPE_UNSET) { + if (libImplExtDevID->DRMRenderNodeNum != 0x7FFFFFFF) { + CHECK_PROP(ePropExtDev_DRMPrimaryNodeNum, U32, libImplExtDevID->DRMPrimaryNodeNum); + } + else { + isCompatible = false; + } + } + + // check string: DeviceName (string match) + if (cfgPropsAllePropExtDev_DeviceName.Type != MFX_VARIANT_TYPE_UNSET) { + std::string filtName = *(std::string *)(cfgPropsAllePropExtDev_DeviceName.Data.Ptr); + std::string implName = libImplExtDevID->DeviceName; + if (filtName != implName) + isCompatible = false; + } + + if (isCompatible == true) + return MFX_ERR_NONE; + + return MFX_ERR_UNSUPPORTED; +} +#endif + +// implString = string from implDesc - one or more comma-separated tokens +// filtString = string user is looking for - one or more comma-separated tokens +// we parse filtString into tokens, then check if all of them are present in implString +mfxStatus ConfigCtxVPL::CheckPropString(const mfxChar *implString, const std::string filtString) { + std::list<std::string> tokenString; + std::string s; + + // parse implString string into tokens, separated by ',' + std::stringstream implSS((char *)implString); + while (getline(implSS, s, ',')) { + tokenString.push_back(s); + } + + // parse filtString string into tokens, separated by ',' + // check that each token is present in implString, otherwise return error + std::stringstream filtSS(filtString); + while (getline(filtSS, s, ',')) { + if (std::find(tokenString.begin(), tokenString.end(), s) == tokenString.end()) + return MFX_ERR_UNSUPPORTED; + } + + return MFX_ERR_NONE; +} + +mfxStatus ConfigCtxVPL::ValidateConfig(const mfxImplDescription *libImplDesc, + const mfxImplementedFunctions *libImplFuncs, +#ifdef ONEVPL_EXPERIMENTAL + const mfxExtendedDeviceId *libImplExtDevID, +#endif + std::list<ConfigCtxVPL *> configCtxList, + LibType libType, + SpecialConfig *specialConfig) { + mfxU32 idx; + bool decRequested = false; + bool encRequested = false; + bool vppRequested = false; + bool extDevRequested = false; + + bool bImplValid = true; + + if (!libImplDesc) + return MFX_ERR_NULL_PTR; + + std::list<DecConfig> decConfigList; + std::list<EncConfig> encConfigList; + std::list<VPPConfig> vppConfigList; + + // generate "flat" descriptions of each combination + // (e.g. multiple profiles from the same codec) + GetFlatDescriptionsDec(libImplDesc, decConfigList); + GetFlatDescriptionsEnc(libImplDesc, encConfigList); + GetFlatDescriptionsVPP(libImplDesc, vppConfigList); + + // list of functions required to be implemented + std::list<std::string> implFunctionList; + implFunctionList.clear(); + + // check requested API version + mfxVersion reqVersion = {}; + bool bVerSetMajor = false; + bool bVerSetMinor = false; + + // clear list of extension buffers + specialConfig->bIsSet_ExtBuffer = false; + specialConfig->ExtBuffers.clear(); + + // iterate through all filters and populate cfgPropsAll + auto it = configCtxList.begin(); + + while (it != configCtxList.end()) { + ConfigCtxVPL *config = (*it); + it++; + + // initially all properties are unset + mfxVariant cfgPropsAlleProp_TotalProps = {}; + for (idx = 0; idx < eProp_TotalProps; idx++) { + cfgPropsAllidx.Type = MFX_VARIANT_TYPE_UNSET; + } + + for (idx = 0; idx < eProp_TotalProps; idx++) { + // ignore unset properties + if (config->m_propVaridx.Type == MFX_VARIANT_TYPE_UNSET) + continue; + + // if property is required function, add to list which will be checked below + if (idx == ePropFunc_FunctionName) { + implFunctionList.push_back(config->m_implFunctionName); + continue; + } + + cfgPropsAllidx.Type = config->m_propVaridx.Type; + cfgPropsAllidx.Data = config->m_propVaridx.Data; + + if (idx >= ePropDec_CodecID && idx <= ePropDec_ColorFormats) + decRequested = true; + else if (idx >= ePropEnc_CodecID && idx <= ePropEnc_ColorFormats) + encRequested = true; + else if (idx >= ePropVPP_FilterFourCC && idx <= ePropVPP_OutFormat) + vppRequested = true; + else if (idx >= ePropExtDev_VendorID && idx <= ePropExtDev_DeviceName) + extDevRequested = true; + } + + // if already marked invalid, no need to check props again + // however we still need to iterate over all of the config objects + // to get any non-filtering properties (returned in SpecialConfig) + if (bImplValid == true) { + if (CheckPropsGeneral(cfgPropsAll, libImplDesc)) + bImplValid = false; + +#ifdef ONEVPL_EXPERIMENTAL + if (extDevRequested) { + // fail if extDevID is not available (null) or if prop is not supported + if (!libImplExtDevID || CheckPropsExtDevID(cfgPropsAll, libImplExtDevID)) + bImplValid = false; + } +#else + if (extDevRequested) + bImplValid = false; +#endif + + // MSDK RT compatibility mode (1.x) does not provide Dec/Enc/VPP caps + // ignore these filters if set (do not use them to _exclude_ the library) + if (libType != LibTypeMSDK) { + if (decRequested && CheckPropsDec(cfgPropsAll, decConfigList)) + bImplValid = false; + + if (encRequested && CheckPropsEnc(cfgPropsAll, encConfigList)) + bImplValid = false; + + if (vppRequested && CheckPropsVPP(cfgPropsAll, vppConfigList)) + bImplValid = false; + } + } + + // update any special (including non-filtering) properties, for use by caller + // if multiple cfg objects set the same non-filtering property, the last (most recent) one is used + if (cfgPropsAllePropSpecial_HandleType.Type != MFX_VARIANT_TYPE_UNSET) { + specialConfig->deviceHandleType = + (mfxHandleType)cfgPropsAllePropSpecial_HandleType.Data.U32; + specialConfig->bIsSet_deviceHandleType = true; + } + + if (cfgPropsAllePropSpecial_Handle.Type != MFX_VARIANT_TYPE_UNSET) { + specialConfig->deviceHandle = (mfxHDL)cfgPropsAllePropSpecial_Handle.Data.Ptr; + specialConfig->bIsSet_deviceHandle = true; + } + + if (cfgPropsAllePropSpecial_NumThread.Type != MFX_VARIANT_TYPE_UNSET) { + specialConfig->NumThread = cfgPropsAllePropSpecial_NumThread.Data.U32; + specialConfig->bIsSet_NumThread = true; + } + + if (cfgPropsAllePropSpecial_DeviceCopy.Type != MFX_VARIANT_TYPE_UNSET) { + specialConfig->DeviceCopy = cfgPropsAllePropSpecial_DeviceCopy.Data.U16; + specialConfig->bIsSet_DeviceCopy = true; + } + + if (cfgPropsAllePropSpecial_DXGIAdapterIndex.Type != MFX_VARIANT_TYPE_UNSET) { + specialConfig->dxgiAdapterIdx = + (mfxU32)cfgPropsAllePropSpecial_DXGIAdapterIndex.Data.U32; + specialConfig->bIsSet_dxgiAdapterIdx = true; + } + + if (cfgPropsAllePropMain_AccelerationMode.Type != MFX_VARIANT_TYPE_UNSET) { + specialConfig->accelerationMode = + (mfxAccelerationMode)cfgPropsAllePropMain_AccelerationMode.Data.U32; + specialConfig->bIsSet_accelerationMode = true; + } + + if (cfgPropsAllePropSpecial_ExtBuffer.Type != MFX_VARIANT_TYPE_UNSET) { + specialConfig->ExtBuffers.push_back( + (mfxExtBuffer *)cfgPropsAllePropSpecial_ExtBuffer.Data.Ptr); + specialConfig->bIsSet_ExtBuffer = true; + } + + // special handling for API version which may be passed either as single U32 (Version) + // or two U16 (Major, Minor) which could come in separate cfg objects + if (cfgPropsAllePropMain_ApiVersion.Type != MFX_VARIANT_TYPE_UNSET) { + reqVersion.Version = (mfxU32)cfgPropsAllePropMain_ApiVersion.Data.U32; + bVerSetMajor = true; + bVerSetMinor = true; + } + else { + if (cfgPropsAllePropMain_ApiVersion_Major.Type != MFX_VARIANT_TYPE_UNSET) { + reqVersion.Major = (mfxU32)cfgPropsAllePropMain_ApiVersion_Major.Data.U16; + bVerSetMajor = true; + } + + if (cfgPropsAllePropMain_ApiVersion_Minor.Type != MFX_VARIANT_TYPE_UNSET) { + reqVersion.Minor = (mfxU32)cfgPropsAllePropMain_ApiVersion_Minor.Data.U16; + bVerSetMinor = true; + } + } + } + + if (bVerSetMajor && bVerSetMinor) { + // require both Major and Minor to be set if filtering this way + if (libImplDesc->ApiVersion.Version < reqVersion.Version) + bImplValid = false; + + specialConfig->ApiVersion.Version = reqVersion.Version; + specialConfig->bIsSet_ApiVersion = true; + } + + if (bImplValid == false) + return MFX_ERR_UNSUPPORTED; + + // check whether required functions are implemented + if (!implFunctionList.empty()) { + if (!libImplFuncs) { + // library did not provide list of implemented functions + return MFX_ERR_UNSUPPORTED; + } + + auto fn = implFunctionList.begin(); + while (fn != implFunctionList.end()) { + std::string fnName = (*fn++); + mfxU32 fnIdx; + + // search for fnName in list of implemented functions + for (fnIdx = 0; fnIdx < libImplFuncs->NumFunctions; fnIdx++) { + if (fnName == libImplFuncs->FunctionsNamefnIdx) + break; + } + + if (fnIdx == libImplFuncs->NumFunctions) + return MFX_ERR_UNSUPPORTED; + } + } + + return MFX_ERR_NONE; +} + +bool ConfigCtxVPL::CheckLowLatencyConfig(std::list<ConfigCtxVPL *> configCtxList, + SpecialConfig *specialConfig) { + mfxU32 idx; + bool bLowLatency = true; + + // initially all properties are unset + mfxVariant cfgPropsAlleProp_TotalProps = {}; + for (idx = 0; idx < eProp_TotalProps; idx++) + cfgPropsAllidx.Type = MFX_VARIANT_TYPE_UNSET; + + // iterate through all filters and populate cfgPropsAll + // for purposes of low-latency enabling, we check the last (most recent) value of each filter + // property, in the case that multiple mfxConfig objects were created + // preferred usage is just to create one mfxConfig and set all of the required props in it + // Exception: there can be more than one ExtBuffer attached via multiple mfxConfig objects (API >= 2.7) + + // clear list of extension buffers + specialConfig->bIsSet_ExtBuffer = false; + specialConfig->ExtBuffers.clear(); + + auto it = configCtxList.begin(); + while (it != configCtxList.end()) { + ConfigCtxVPL *config = (*it); + it++; + + for (idx = 0; idx < eProp_TotalProps; idx++) { + // ignore unset properties + if (config->m_propVaridx.Type == MFX_VARIANT_TYPE_UNSET) + continue; + + cfgPropsAllidx.Type = config->m_propVaridx.Type; + cfgPropsAllidx.Data = config->m_propVaridx.Data; + + if (idx == ePropSpecial_ExtBuffer) { + specialConfig->ExtBuffers.push_back( + (mfxExtBuffer *)cfgPropsAllePropSpecial_ExtBuffer.Data.Ptr); + specialConfig->bIsSet_ExtBuffer = true; + } + } + } + + for (mfxU32 idx = 0; idx < eProp_TotalProps; idx++) { + switch (idx) { + case ePropMain_Impl: + if (cfgPropsAllidx.Type == MFX_VARIANT_TYPE_U32) { + if (cfgPropsAllidx.Data.U32 == MFX_IMPL_TYPE_HARDWARE) + continue; + } + bLowLatency = false; + break; + + case ePropMain_ImplName: + if (cfgPropsAllidx.Type == MFX_VARIANT_TYPE_PTR && cfgPropsAllidx.Data.Ptr) { + std::string s = *(std::string *)(cfgPropsAllidx.Data.Ptr); + if (s == "mfx-gen") + continue; + } + bLowLatency = false; + break; + + case ePropMain_VendorID: + if (cfgPropsAllidx.Type == MFX_VARIANT_TYPE_U32) { + if (cfgPropsAllidx.Data.U32 == 0x8086) + continue; + } + bLowLatency = false; + break; + + // application must set AccelerationMode for lowlatency - will be passed to RT in MFXInitialize() + case ePropMain_AccelerationMode: + if (cfgPropsAllidx.Type == MFX_VARIANT_TYPE_U32) { + specialConfig->accelerationMode = + (mfxAccelerationMode)cfgPropsAllePropMain_AccelerationMode.Data.U32; + specialConfig->bIsSet_accelerationMode = true; + continue; + } + bLowLatency = false; + break; + + // application may set ApiVersion with lowlatency, but not required + case ePropMain_ApiVersion: + if (cfgPropsAllePropMain_ApiVersion.Type != MFX_VARIANT_TYPE_UNSET) { + specialConfig->ApiVersion.Version = + (mfxU32)cfgPropsAllePropMain_ApiVersion.Data.U32; + specialConfig->bIsSet_ApiVersion = true; + } + break; + + // following are non-filtering properties - they may be set here or not (don't affect low latency) + case ePropSpecial_HandleType: + if (cfgPropsAllePropSpecial_HandleType.Type != MFX_VARIANT_TYPE_UNSET) { + specialConfig->deviceHandleType = + (mfxHandleType)cfgPropsAllePropSpecial_HandleType.Data.U32; + specialConfig->bIsSet_deviceHandleType = true; + } + break; + + case ePropSpecial_Handle: + if (cfgPropsAllePropSpecial_Handle.Type != MFX_VARIANT_TYPE_UNSET) { + specialConfig->deviceHandle = (mfxHDL)cfgPropsAllePropSpecial_Handle.Data.Ptr; + specialConfig->bIsSet_deviceHandle = true; + } + break; + + case ePropSpecial_NumThread: + if (cfgPropsAllePropSpecial_NumThread.Type != MFX_VARIANT_TYPE_UNSET) { + specialConfig->NumThread = cfgPropsAllePropSpecial_NumThread.Data.U32; + specialConfig->bIsSet_NumThread = true; + } + break; + + case ePropSpecial_DeviceCopy: + if (cfgPropsAllePropSpecial_DeviceCopy.Type != MFX_VARIANT_TYPE_UNSET) { + specialConfig->DeviceCopy = cfgPropsAllePropSpecial_DeviceCopy.Data.U16; + specialConfig->bIsSet_DeviceCopy = true; + } + break; + + case ePropSpecial_ExtBuffer: + // extBufs were already pushed into the overall list, above + break; + + // will be passed to RT in MFXInitialize(), if unset will be 0 + case ePropSpecial_DXGIAdapterIndex: + if (cfgPropsAllidx.Type == MFX_VARIANT_TYPE_U32) { + specialConfig->dxgiAdapterIdx = + (mfxU32)cfgPropsAllePropSpecial_DXGIAdapterIndex.Data.U32; + specialConfig->bIsSet_dxgiAdapterIdx = true; + continue; + } + break; + + default: + if (cfgPropsAllidx.Type != MFX_VARIANT_TYPE_UNSET) + bLowLatency = false; + break; + } + } + + return bLowLatency; +} + +#include <gst/gst.h> + +bool ConfigCtxVPL::ParseDeviceIDx86(mfxChar *cDeviceID, mfxU32 &deviceID, mfxU32 &adapterIdx) { + std::string strDevID(cDeviceID); + // XXX: std::regex is crashing on Windows + gcc +#if 0 + std::regex reDevIDAll("0-9a-fA-F+/0-9+"); + std::regex reDevIDMin("0-9a-fA-F+"); +#else + static const gchar *reDevIDAll = "0-9a-fA-F+/0-9+"; + static const gchar *reDevIDMin = "0-9a-fA-F+"; + + if (!cDeviceID) + return false; +#endif + + deviceID = DEVICE_ID_UNKNOWN; + adapterIdx = ADAPTER_IDX_UNKNOWN; + + bool bHasAdapterIdx = false; +#if 0 + if (std::regex_match(strDevID, reDevIDAll)) { + // check for DeviceID in format "devID/adapterIdx" + // devID = hex value + // adapterIdx = decimal integer + bHasAdapterIdx = true; + } + else if (std::regex_match(strDevID, reDevIDMin)) { + // check for DeviceID in format "devID" + // (no adpaterIdx) + bHasAdapterIdx = false; + } + else { + // invalid format + return false; + } +#else + if (g_regex_match_simple(reDevIDAll, cDeviceID, + (GRegexCompileFlags)0, (GRegexMatchFlags)0)) { + // check for DeviceID in format "devID/adapterIdx" + // devID = hex value + // adapterIdx = decimal integer + bHasAdapterIdx = true; + } + else if (g_regex_match_simple(reDevIDMin, cDeviceID, + (GRegexCompileFlags)0, (GRegexMatchFlags)0)) { + // check for DeviceID in format "devID" + // (no adpaterIdx) + bHasAdapterIdx = false; + } + else { + // invalid format + return false; + } +#endif + + // get deviceID (value before the slash, if present) + try { + deviceID = std::stoi(strDevID, 0, 16); + } + catch (...) { + return false; + } + + if (bHasAdapterIdx) { + // get adapter index (value after the slash) + size_t idx = strDevID.rfind('/'); + if (idx == std::string::npos) + return false; + + try { + adapterIdx = std::stoi(strDevID.substr(idx + 1)); + } + catch (...) { + return false; + } + } + + return true; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_loader.cpp
Added
@@ -0,0 +1,1737 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include <algorithm> + +#include "vpl/mfx_dispatcher_vpl.h" + +#if defined(_WIN32) || defined(_WIN64) + #include "vpl/mfx_dispatcher_vpl_win.h" +#endif + +// leave table formatting alone +// clang-format off + +// new functions for API >= 2.0 +static const VPLFunctionDesc FunctionDesc2NumVPLFunctions = { + { "MFXQueryImplsDescription", { { 0, 2 } } }, + { "MFXReleaseImplDescription", { { 0, 2 } } }, + { "MFXMemory_GetSurfaceForVPP", { { 0, 2 } } }, + { "MFXMemory_GetSurfaceForEncode", { { 0, 2 } } }, + { "MFXMemory_GetSurfaceForDecode", { { 0, 2 } } }, + { "MFXInitialize", { { 0, 2 } } }, + + { "MFXMemory_GetSurfaceForVPPOut", { { 1, 2 } } }, + { "MFXVideoDECODE_VPP_Init", { { 1, 2 } } }, + { "MFXVideoDECODE_VPP_DecodeFrameAsync", { { 1, 2 } } }, + { "MFXVideoDECODE_VPP_Reset", { { 1, 2 } } }, + { "MFXVideoDECODE_VPP_GetChannelParam", { { 1, 2 } } }, + { "MFXVideoDECODE_VPP_Close", { { 1, 2 } } }, + { "MFXVideoVPP_ProcessFrameAsync", { { 1, 2 } } }, +}; + +static const VPLFunctionDesc MSDKCompatFunctionsNumMSDKFunctions = { + { "MFXInitEx", { { 14, 1 } } }, + { "MFXClose" , { { 0, 1 } } }, +}; + +// end table formatting +// clang-format on + +// implementation of loader context (mfxLoader) +// each loader instance will build a list of valid runtimes and allow +// application to create sessions with them +LoaderCtxVPL::LoaderCtxVPL() + : m_libInfoList(), + m_implInfoList(), + m_configCtxList(), + m_gpuAdapterInfo(), + m_specialConfig(), + m_implIdxNext(0), + m_bKeepCapsUntilUnload(true), + m_envVar(), + m_dispLog() { + // allow loader to distinguish between property value of 0 + // and property not set + m_specialConfig.bIsSet_deviceHandleType = false; + m_specialConfig.bIsSet_deviceHandle = false; + m_specialConfig.bIsSet_accelerationMode = false; + m_specialConfig.bIsSet_ApiVersion = false; + m_specialConfig.bIsSet_dxgiAdapterIdx = false; + m_specialConfig.bIsSet_NumThread = false; + m_specialConfig.bIsSet_DeviceCopy = false; + m_specialConfig.bIsSet_ExtBuffer = false; + + // initial state + m_bLowLatency = false; + m_bNeedUpdateValidImpls = true; + m_bNeedFullQuery = true; + m_bNeedLowLatencyQuery = true; + m_bPriorityPathEnabled = false; + + return; +} + +LoaderCtxVPL::~LoaderCtxVPL() { + return; +} + +mfxStatus LoaderCtxVPL::FullLoadAndQuery() { + // disable low latency mode + m_bLowLatency = false; + + // search directories for candidate implementations based on search order in + // spec + mfxStatus sts = BuildListOfCandidateLibs(); + if (MFX_ERR_NONE != sts) + return sts; + + // prune libraries which are not actually implementations, filling function + // ptr table for each library which is + mfxU32 numLibs = CheckValidLibraries(); + if (numLibs == 0) + return MFX_ERR_UNSUPPORTED; + + // query capabilities of each implementation + // may be more than one implementation per library + sts = QueryLibraryCaps(); + if (MFX_ERR_NONE != sts) + return MFX_ERR_NOT_FOUND; + + m_bNeedFullQuery = false; + m_bNeedUpdateValidImpls = true; + + return MFX_ERR_NONE; +} + +// creates ordered list of user-specified directories to search +mfxU32 LoaderCtxVPL::ParseEnvSearchPaths(const CHAR_TYPE *envVarName, + std::list<STRING_TYPE> &searchDirs) { + searchDirs.clear(); + +#if defined(_WIN32) || defined(_WIN64) + DWORD err; + m_envVar0 = 0; + + err = GetEnvironmentVariableW(envVarName, m_envVar, MAX_ENV_VAR_LEN); + if (err == 0 || err >= MAX_ENV_VAR_LEN) + return 0; // environment variable not defined or string too long + + // parse env variable into individual directories + std::wstringstream envPath((CHAR_TYPE *)m_envVar); + STRING_TYPE s; + while (std::getline(envPath, s, L';')) { + searchDirs.push_back(s); + } +#else + CHAR_TYPE *envVar = getenv(envVarName); + if (!envVar) + return 0; // environment variable not defined + + // parse env variable into individual directories + std::stringstream envPath((CHAR_TYPE *)envVar); + STRING_TYPE s; + while (std::getline(envPath, s, ':')) { + searchDirs.push_back(s); + } +#endif + + return (mfxU32)searchDirs.size(); +} + +#define NUM_LIB_PREFIXES 3 + +mfxStatus LoaderCtxVPL::SearchDirForLibs(STRING_TYPE searchDir, + std::list<LibInfo *> &libInfoList, + mfxU32 priority, + bool bLoadVPLOnly) { + // okay to call with empty searchDir + if (searchDir.empty()) + return MFX_ERR_NONE; + +#if defined(_WIN32) || defined(_WIN64) + HANDLE hTestFile = nullptr; + WIN32_FIND_DATAW testFileData; + DWORD err; + STRING_TYPE testFileNameNUM_LIB_PREFIXES = { + searchDir + MAKE_STRING("/libvpl*.dll"), + #if defined _M_IX86 + // 32-bit GPU RT names + searchDir + MAKE_STRING("/libmfx32-gen.dll"), + searchDir + MAKE_STRING("/libmfxhw32.dll") + #else + // 64-bit GPU RT names + searchDir + MAKE_STRING("/libmfx64-gen.dll"), + searchDir + MAKE_STRING("/libmfxhw64.dll") + #endif + }; + + CHAR_TYPE currDirMAX_VPL_SEARCH_PATH = L""; + if (GetCurrentDirectoryW(MAX_VPL_SEARCH_PATH, currDir)) + SetCurrentDirectoryW(searchDir.c_str()); + + // skip search for MSDK runtime (last entry) if bLoadVPLOnly is set + mfxU32 numLibPrefixes = NUM_LIB_PREFIXES; + if (bLoadVPLOnly) + numLibPrefixes--; + + // iterate over all candidate files in directory + for (mfxU32 i = 0; i < numLibPrefixes; i++) { + hTestFile = FindFirstFileW(testFileNamei.c_str(), &testFileData); + if (hTestFile != INVALID_HANDLE_VALUE) { + do { + wchar_t libNameFullMAX_VPL_SEARCH_PATH; + wchar_t *libNameBase; + + // special case: do not include dispatcher itself (libmfx.dll, libvpl.dll) + if (wcsstr(testFileData.cFileName, L"libmfx.dll") || + wcsstr(testFileData.cFileName, L"libvpl.dll") || + wcsstr(testFileData.cFileName, L"libvpld.dll")) + continue; + + err = GetFullPathNameW(testFileData.cFileName, + MAX_VPL_SEARCH_PATH, + libNameFull, + &libNameBase); + // unknown error - skip it and move on to next file + if (!err) + continue; + + // skip duplicates + auto libFound = + std::find_if(libInfoList.begin(), libInfoList.end(), &(LibInfo *li) { + return (li->libNameFull == libNameFull); + }); + if (libFound != libInfoList.end()) + continue; + + LibInfo *libInfo = new LibInfo; + if (!libInfo) + return MFX_ERR_MEMORY_ALLOC; + + libInfo->libNameFull = libNameFull; + libInfo->libPriority = priority; + + // add to list + libInfoList.push_back(libInfo); + } while (FindNextFileW(hTestFile, &testFileData)); + + FindClose(hTestFile); + } + } + + // restore current directory + if (currDir0) + SetCurrentDirectoryW(currDir); + +#else + DIR *pSearchDir; + struct dirent *currFile; + + pSearchDir = opendir(searchDir.c_str()); + if (pSearchDir) { + while (1) { + currFile = readdir(pSearchDir); + if (!currFile) + break; + + // save files with ".so" (including .so.1, etc.) + if (strstr(currFile->d_name, ".so")) { + // library names must begin with "libvpl*" or "libmfx*" + if ((strstr(currFile->d_name, "libvpl") != currFile->d_name) && + (strcmp(currFile->d_name, "libmfx-gen.so.1.2") != 0) && + (strcmp(currFile->d_name, "libmfxhw64.so.1") != 0)) + continue; + + // special case: do not include dispatcher itself (libmfx.so*, libvpl.so*) or tracer library + if (strstr(currFile->d_name, "libmfx.so") || + strstr(currFile->d_name, "libvpl.so") || + strstr(currFile->d_name, "libmfx-tracer")) + continue; + + char filePathCMAX_VPL_SEARCH_PATH; + + // get full path to found library + snprintf(filePathC, + MAX_VPL_SEARCH_PATH, + "%s/%s", + searchDir.c_str(), + currFile->d_name); + char *fullPath = realpath(filePathC, NULL); + + // unknown error - skip it and move on to next file + if (!fullPath) + continue; + + // skip duplicates + auto libFound = + std::find_if(libInfoList.begin(), libInfoList.end(), &(LibInfo *li) { + return (li->libNameFull == fullPath); + }); + if (libFound != libInfoList.end()) { + free(fullPath); + continue; + } + + LibInfo *libInfo = new LibInfo; + if (!libInfo) + return MFX_ERR_MEMORY_ALLOC; + + libInfo->libNameFull = fullPath; + libInfo->libPriority = priority; + free(fullPath); + + // add to list + libInfoList.push_back(libInfo); + } + } + closedir(pSearchDir); + } +#endif + + return MFX_ERR_NONE; +} + +// fill in m_gpuAdapterInfo before calling +mfxU32 LoaderCtxVPL::GetSearchPathsDriverStore(std::list<STRING_TYPE> &searchDirs, + LibType libType) { + searchDirs.clear(); + +#if defined(_WIN32) || defined(_WIN64) + mfxStatus sts = MFX_ERR_UNSUPPORTED; + STRING_TYPE vplPath; + + int storageID = MFX::MFX_DRIVER_STORE_ONEVPL; + if (libType == LibTypeMSDK) + storageID = MFX::MFX_DRIVER_STORE; + + // get path to Windows driver store (if any) for each adapter + for (mfxU32 adapterID = 0; adapterID < (mfxU32)m_gpuAdapterInfo.size(); adapterID++) { + vplPath.clear(); + sts = MFX::MFXLibraryIterator::GetDriverStoreDir(vplPath, + MAX_VPL_SEARCH_PATH, + m_gpuAdapterInfoadapterID.deviceID, + storageID); + if (sts == MFX_ERR_NONE) + searchDirs.push_back(vplPath); + } +#endif + + return (mfxU32)searchDirs.size(); +} + +mfxU32 LoaderCtxVPL::GetSearchPathsCurrentExe(std::list<STRING_TYPE> &searchDirs) { + searchDirs.clear(); + +#if defined(_WIN32) || defined(_WIN64) + // get path to location of current executable + wchar_t implPathMFX::msdk_disp_path_len; + MFX::GetImplPath(MFX::MFX_APP_FOLDER, implPath); + STRING_TYPE exePath = implPath; + + // strip trailing backslash + size_t exePathLen = exePath.find_last_of(L"\\"); + if (exePathLen > 0) + exePath.erase(exePathLen); + + if (!exePath.empty()) + searchDirs.push_back(exePath); + +#endif + + return (mfxU32)searchDirs.size(); +} + +mfxU32 LoaderCtxVPL::GetSearchPathsCurrentDir(std::list<STRING_TYPE> &searchDirs) { + searchDirs.clear(); + +#if defined(_WIN32) || defined(_WIN64) + CHAR_TYPE currDirMAX_VPL_SEARCH_PATH = L""; + if (GetCurrentDirectoryW(MAX_VPL_SEARCH_PATH, currDir)) { + searchDirs.push_back(currDir); + } +#else + CHAR_TYPE currDirMAX_VPL_SEARCH_PATH = ""; + if (getcwd(currDir, MAX_VPL_SEARCH_PATH)) { + searchDirs.push_back(currDir); + } +#endif + + return (mfxU32)searchDirs.size(); +} + +// get legacy MSDK dispatcher search paths +// see "oneVPL Session" section in spec +mfxU32 LoaderCtxVPL::GetSearchPathsLegacy(std::list<STRING_TYPE> &searchDirs) { + searchDirs.clear(); + +#if defined(_WIN32) || defined(_WIN64) + mfxStatus sts = MFX_ERR_UNSUPPORTED; + STRING_TYPE msdkPath; + + // get path via dispatcher regkey - HKCU + msdkPath.clear(); + sts = MFX::MFXLibraryIterator::GetRegkeyDir(msdkPath, + MAX_VPL_SEARCH_PATH, + MFX::MFX_CURRENT_USER_KEY); + if (sts == MFX_ERR_NONE) + searchDirs.push_back(msdkPath); + + // get path via dispatcher regkey - HKLM + msdkPath.clear(); + sts = MFX::MFXLibraryIterator::GetRegkeyDir(msdkPath, + MAX_VPL_SEARCH_PATH, + MFX::MFX_LOCAL_MACHINE_KEY); + if (sts == MFX_ERR_NONE) + searchDirs.push_back(msdkPath); + + // get path to %windir%\system32 and %windir%\syswow64 + std::list<STRING_TYPE> winSysDir; + ParseEnvSearchPaths(L"windir", winSysDir); + + // should resolve to a single directory, otherwise something went wrong + if (winSysDir.size() == 1) { + msdkPath = winSysDir.front() + L"\\system32"; + searchDirs.push_back(msdkPath); + + msdkPath = winSysDir.front() + L"\\syswow64"; + searchDirs.push_back(msdkPath); + } + +#else + // MSDK open-source installation directories + searchDirs.push_back("/opt/intel/mediasdk/lib"); + searchDirs.push_back("/opt/intel/mediasdk/lib64"); +#endif + + return (mfxU32)searchDirs.size(); +} + +mfxU32 LoaderCtxVPL::GetSearchPathsSystemDefault(std::list<STRING_TYPE> &searchDirs) { + searchDirs.clear(); + +#ifdef __linux__ + // Add the standard path for libmfx1 install in Ubuntu + searchDirs.push_back("/usr/lib/x86_64-linux-gnu"); + + // Add other default paths + searchDirs.push_back("/lib"); + searchDirs.push_back("/usr/lib"); + searchDirs.push_back("/lib64"); + searchDirs.push_back("/usr/lib64"); +#endif + + return (mfxU32)searchDirs.size(); +} + +// search for implementations of oneAPI Video Processing Library (oneVPL) +// according to the rules in the spec +mfxStatus LoaderCtxVPL::BuildListOfCandidateLibs() { + DISP_LOG_FUNCTION(&m_dispLog); + + mfxStatus sts = MFX_ERR_NONE; + + STRING_TYPE emptyPath; // default construction = empty + std::list<STRING_TYPE> searchDirList; + std::list<STRING_TYPE>::iterator it; + + // special case: ONEVPL_PRIORITY_PATH may be used to specify user-defined path + // and bypass priority sorting (API >= 2.6) + searchDirList.clear(); + ParseEnvSearchPaths(ONEVPL_PRIORITY_PATH_VAR, searchDirList); + it = searchDirList.begin(); + while (it != searchDirList.end()) { + STRING_TYPE nextDir = (*it); + sts = SearchDirForLibs(nextDir, m_libInfoList, LIB_PRIORITY_SPECIAL); + it++; + } + + if (searchDirList.size() > 0) + m_bPriorityPathEnabled = true; + +#if defined(_WIN32) || defined(_WIN64) + // retrieve list of DX11 graphics adapters (lightweight) + // used for both VPL and legacy driver store search + m_gpuAdapterInfo.clear(); + bool bEnumSuccess = MFX::DXGI1Device::GetAdapterList(m_gpuAdapterInfo); + + // unknown error or no adapters found - clear list + if (!bEnumSuccess) + m_gpuAdapterInfo.clear(); + + // first priority: Windows driver store + searchDirList.clear(); + GetSearchPathsDriverStore(searchDirList, LibTypeVPL); + it = searchDirList.begin(); + while (it != searchDirList.end()) { + STRING_TYPE nextDir = (*it); + sts = SearchDirForLibs(nextDir, m_libInfoList, LIB_PRIORITY_01, true); + it++; + } + + // second priority: path to current executable + searchDirList.clear(); + GetSearchPathsCurrentExe(searchDirList); + it = searchDirList.begin(); + while (it != searchDirList.end()) { + STRING_TYPE nextDir = (*it); + sts = SearchDirForLibs(nextDir, m_libInfoList, LIB_PRIORITY_02); + it++; + } + + // third priority: current working directory + searchDirList.clear(); + GetSearchPathsCurrentDir(searchDirList); + it = searchDirList.begin(); + while (it != searchDirList.end()) { + STRING_TYPE nextDir = (*it); + sts = SearchDirForLibs(nextDir, m_libInfoList, LIB_PRIORITY_03); + it++; + } + + // fourth priority: PATH environment variable + searchDirList.clear(); + ParseEnvSearchPaths(L"PATH", searchDirList); + it = searchDirList.begin(); + while (it != searchDirList.end()) { + STRING_TYPE nextDir = (*it); + sts = SearchDirForLibs(nextDir, m_libInfoList, LIB_PRIORITY_04); + it++; + } + + // fifth priority: ONEVPL_SEARCH_PATH environment variable + searchDirList.clear(); + ParseEnvSearchPaths(L"ONEVPL_SEARCH_PATH", searchDirList); + it = searchDirList.begin(); + while (it != searchDirList.end()) { + STRING_TYPE nextDir = (*it); + sts = SearchDirForLibs(nextDir, m_libInfoList, LIB_PRIORITY_05); + it++; + } + + // legacy MSDK installation: DriverStore has priority + searchDirList.clear(); + GetSearchPathsDriverStore(searchDirList, LibTypeMSDK); + it = searchDirList.begin(); + while (it != searchDirList.end()) { + STRING_TYPE nextDir = (*it); + sts = SearchDirForLibs(nextDir, m_libInfoList, LIB_PRIORITY_LEGACY_DRIVERSTORE); + it++; + } + + // lowest priority: other legacy search paths + searchDirList.clear(); + GetSearchPathsLegacy(searchDirList); + it = searchDirList.begin(); + while (it != searchDirList.end()) { + STRING_TYPE nextDir = (*it); + sts = SearchDirForLibs(nextDir, m_libInfoList, LIB_PRIORITY_LEGACY); + it++; + } +#else + // first priority: LD_LIBRARY_PATH environment variable + searchDirList.clear(); + ParseEnvSearchPaths("LD_LIBRARY_PATH", searchDirList); + it = searchDirList.begin(); + while (it != searchDirList.end()) { + STRING_TYPE nextDir = (*it); + sts = SearchDirForLibs(nextDir, m_libInfoList, LIB_PRIORITY_01); + it++; + } + + // second priority: Linux default paths + searchDirList.clear(); + GetSearchPathsSystemDefault(searchDirList); + it = searchDirList.begin(); + while (it != searchDirList.end()) { + STRING_TYPE nextDir = (*it); + sts = SearchDirForLibs(nextDir, m_libInfoList, LIB_PRIORITY_03); + it++; + } + + // third priority: current working directory + searchDirList.clear(); + GetSearchPathsCurrentDir(searchDirList); + it = searchDirList.begin(); + while (it != searchDirList.end()) { + STRING_TYPE nextDir = (*it); + sts = SearchDirForLibs(nextDir, m_libInfoList, LIB_PRIORITY_04); + it++; + } + + // fourth priority: ONEVPL_SEARCH_PATH environment variable + searchDirList.clear(); + ParseEnvSearchPaths("ONEVPL_SEARCH_PATH", searchDirList); + it = searchDirList.begin(); + while (it != searchDirList.end()) { + STRING_TYPE nextDir = (*it); + sts = SearchDirForLibs(nextDir, m_libInfoList, LIB_PRIORITY_05); + it++; + } + + // lowest priority: legacy MSDK installation + searchDirList.clear(); + GetSearchPathsLegacy(searchDirList); + it = searchDirList.begin(); + while (it != searchDirList.end()) { + STRING_TYPE nextDir = (*it); + sts = SearchDirForLibs(nextDir, m_libInfoList, LIB_PRIORITY_LEGACY); + it++; + } +#endif + + return sts; +} + +// return number of valid libraries found +mfxU32 LoaderCtxVPL::CheckValidLibraries() { + DISP_LOG_FUNCTION(&m_dispLog); + + LibInfo *msdkLibBest = nullptr; + LibInfo *msdkLibBestDS = nullptr; + + // load all libraries + std::list<LibInfo *>::iterator it = m_libInfoList.begin(); + while (it != m_libInfoList.end()) { + LibInfo *libInfo = (*it); + mfxStatus sts = MFX_ERR_NONE; + + // load DLL + sts = LoadSingleLibrary(libInfo); + + // load video functions: pointers to exposed functions + // not all function pointers may be filled in (depends on API version) + if (sts == MFX_ERR_NONE && libInfo->hModuleVPL) + LoadAPIExports(libInfo, LibTypeVPL); + + // all runtime libraries with API >= 2.0 must export MFXInitialize() + // validation of additional functions vs. API version takes place + // during UpdateValidImplList() since the minimum API version requested + // by application is not known yet (use SetConfigFilterProperty) + if (libInfo->vplFuncTableIdxMFXInitialize && + libInfo->libPriority < LIB_PRIORITY_LEGACY_DRIVERSTORE) { + libInfo->libType = LibTypeVPL; + it++; + continue; + } + + // not a valid 2.x runtime - check for 1.x API (legacy caps query) + mfxU32 numFunctions = 0; + if (sts == MFX_ERR_NONE && libInfo->hModuleVPL) { + if (libInfo->libNameFull.find(MSDK_LIB_NAME) != std::string::npos) { + // legacy runtime must be named libmfxhw64 (or 32) + // MSDK must export all of the required functions + numFunctions = LoadAPIExports(libInfo, LibTypeMSDK); + } + } + + // check if all of the required MSDK functions were found + // and this is valid library (can create session, query version) + if (numFunctions == NumMSDKFunctions) { + sts = LoaderCtxMSDK::QueryAPIVersion(libInfo->libNameFull, &(libInfo->msdkVersion)); + + if (sts == MFX_ERR_NONE) { + libInfo->libType = LibTypeMSDK; + if (msdkLibBest == nullptr || + (libInfo->msdkVersion.Version > msdkLibBest->msdkVersion.Version)) { + msdkLibBest = libInfo; + } + + if (libInfo->libPriority == LIB_PRIORITY_LEGACY_DRIVERSTORE) { + if (msdkLibBestDS == nullptr || + (libInfo->msdkVersion.Version > msdkLibBestDS->msdkVersion.Version)) { + msdkLibBestDS = libInfo; + } + } + +#if defined(_WIN32) || defined(_WIN64) + // workaround for double-init issue in old versions of MSDK runtime + // (allow DLL to be fully unloaded after each call to MFXClose) + // apply to MSDK with API version <= 1.27 + if (libInfo->hModuleVPL && (libInfo->msdkVersion.Major == 1) && + (libInfo->msdkVersion.Minor <= 27)) { + MFX::mfx_dll_free(libInfo->hModuleVPL); + libInfo->hModuleVPL = nullptr; + } +#endif + + it++; + continue; + } + } + + // required functions missing from DLL, or DLL failed to load + // remove this library from the list of options + UnloadSingleLibrary(libInfo); + it = m_libInfoList.erase(it); + } + + if (msdkLibBestDS) + msdkLibBest = msdkLibBestDS; + + // prune duplicate MSDK libraries (only keep one with highest API version) + it = m_libInfoList.begin(); + while (it != m_libInfoList.end()) { + LibInfo *libInfo = (*it); + + if (libInfo->libType == LibTypeMSDK && libInfo != msdkLibBest) { + UnloadSingleLibrary(libInfo); + it = m_libInfoList.erase(it); + } + else { + it++; + } + } + + // number of valid oneVPL libs + return (mfxU32)m_libInfoList.size(); +} + +VPLFunctionPtr LoaderCtxVPL::GetFunctionAddr(void *hModuleVPL, const char *pName) { + VPLFunctionPtr pProc = nullptr; + + if (hModuleVPL) { +#if defined(_WIN32) || defined(_WIN64) + pProc = (VPLFunctionPtr)MFX::mfx_dll_get_addr(hModuleVPL, pName); +#else + pProc = (VPLFunctionPtr)dlsym(hModuleVPL, pName); +#endif + } + + return pProc; +} + +// load single runtime +mfxStatus LoaderCtxVPL::LoadSingleLibrary(LibInfo *libInfo) { + if (!libInfo) + return MFX_ERR_NULL_PTR; + +#if defined(_WIN32) || defined(_WIN64) + libInfo->hModuleVPL = MFX::mfx_dll_load(libInfo->libNameFull.c_str()); +#else + libInfo->hModuleVPL = dlopen(libInfo->libNameFull.c_str(), RTLD_LOCAL | RTLD_NOW); +#endif + + if (!libInfo->hModuleVPL) + return MFX_ERR_NOT_FOUND; + + return MFX_ERR_NONE; +} + +// unload single runtime +mfxStatus LoaderCtxVPL::UnloadSingleLibrary(LibInfo *libInfo) { + if (libInfo) { + if (libInfo->hModuleVPL) { +#if defined(_WIN32) || defined(_WIN64) + MFX::mfx_dll_free(libInfo->hModuleVPL); +#else + dlclose(libInfo->hModuleVPL); +#endif + } + delete libInfo; + return MFX_ERR_NONE; + } + else { + return MFX_ERR_INVALID_HANDLE; + } +} + +// iterate over all implementation runtimes +// unload DLL's and free memory +mfxStatus LoaderCtxVPL::UnloadAllLibraries() { + DISP_LOG_FUNCTION(&m_dispLog); + + std::list<ImplInfo *>::iterator it2 = m_implInfoList.begin(); + while (it2 != m_implInfoList.end()) { + ImplInfo *implInfo = (*it2); + + if (implInfo) { + UnloadSingleImplementation(implInfo); + } + it2++; + } + + // lastly, unload and destroy LibInfo for each library + std::list<LibInfo *>::iterator it = m_libInfoList.begin(); + while (it != m_libInfoList.end()) { + LibInfo *libInfo = (*it); + + if (libInfo) { + UnloadSingleLibrary(libInfo); + } + it++; + } + + m_implInfoList.clear(); + m_libInfoList.clear(); + m_implIdxNext = 0; + + return MFX_ERR_NONE; +} + +// unload single implementation +// each runtime library may contain 1 or more implementations +mfxStatus LoaderCtxVPL::UnloadSingleImplementation(ImplInfo *implInfo) { + if (implInfo && implInfo->libInfo) { + LibInfo *libInfo = implInfo->libInfo; + VPLFunctionPtr pFunc = libInfo->vplFuncTableIdxMFXReleaseImplDescription; + + // call MFXReleaseImplDescription() for this implementation if it + // was never called by the application + // this is a valid scenario, e.g. app did not call MFXEnumImplementations() + // and just used the first available implementation provided by dispatcher + if (libInfo->libType == LibTypeVPL) { + if (implInfo->implDesc) { + // MFX_IMPLCAPS_IMPLDESCSTRUCTURE; + (*(mfxStatus(MFX_CDECL *)(mfxHDL))pFunc)(implInfo->implDesc); + implInfo->implDesc = nullptr; + } + + if (implInfo->implFuncs) { + // MFX_IMPLCAPS_IMPLEMENTEDFUNCTIONS; + (*(mfxStatus(MFX_CDECL *)(mfxHDL))pFunc)(implInfo->implFuncs); + implInfo->implFuncs = nullptr; + } +#ifdef ONEVPL_EXPERIMENTAL + if (implInfo->implExtDeviceID) { + // MFX_IMPLCAPS_DEVICE_ID_EXTENDED; + (*(mfxStatus(MFX_CDECL *)(mfxHDL))pFunc)(implInfo->implExtDeviceID); + implInfo->implExtDeviceID = nullptr; + } +#endif + + // nothing to do if (capsFormat == MFX_IMPLCAPS_IMPLPATH) since no new memory was allocated + } + delete implInfo; + return MFX_ERR_NONE; + } + else { + return MFX_ERR_INVALID_HANDLE; + } +} + +// return number of functions loaded +mfxU32 LoaderCtxVPL::LoadAPIExports(LibInfo *libInfo, LibType libType) { + mfxU32 i, numFunctions = 0; + + if (libType == LibTypeVPL) { + for (i = 0; i < NumVPLFunctions; i += 1) { + VPLFunctionPtr pProc = + (VPLFunctionPtr)GetFunctionAddr(libInfo->hModuleVPL, FunctionDesc2i.pName); + if (pProc) { + libInfo->vplFuncTablei = pProc; + numFunctions++; + } + } + } + else if (libType == LibTypeMSDK) { + // don't actually need to save the function pointers for MSDK, just check if they are defined + for (i = 0; i < NumMSDKFunctions; i += 1) { + VPLFunctionPtr pProc = + (VPLFunctionPtr)GetFunctionAddr(libInfo->hModuleVPL, MSDKCompatFunctionsi.pName); + if (pProc) { + numFunctions++; + } + } + } + + return numFunctions; +} + +// check that all functions for this API version are available in library +mfxStatus LoaderCtxVPL::ValidateAPIExports(VPLFunctionPtr *vplFuncTable, + mfxVersion reportedVersion) { + for (mfxU32 i = 0; i < NumVPLFunctions; i += 1) { + if (!vplFuncTablei && (FunctionDesc2i.apiVersion.Version <= reportedVersion.Version)) + return MFX_ERR_UNSUPPORTED; + } + + return MFX_ERR_NONE; +} + +// convert full path into char* for MFX_IMPLCAPS_IMPLPATH query +mfxStatus LoaderCtxVPL::UpdateImplPath(LibInfo *libInfo) { +#if defined(_WIN32) || defined(_WIN64) + // Windows - strings are 16-bit + size_t nCvt = 0; + if (wcstombs_s(&nCvt, + libInfo->implCapsPath, + sizeof(libInfo->implCapsPath), + libInfo->libNameFull.c_str(), + _TRUNCATE)) { + // unknown error - set to empty string + libInfo->implCapsPath0 = 0; + return MFX_ERR_UNSUPPORTED; + } +#else + // Linux - strings are 8-bit + strncpy(libInfo->implCapsPath, libInfo->libNameFull.c_str(), sizeof(libInfo->implCapsPath) - 1); +#endif + + return MFX_ERR_NONE; +} + +bool LoaderCtxVPL::IsValidX86GPU(ImplInfo *implInfo, mfxU32 &deviceID, mfxU32 &adapterIdx) { + mfxImplDescription *implDesc = (mfxImplDescription *)(implInfo->implDesc); + + // may be null in low-latency mode, ID unknown + if (!implDesc) + return false; + + if (implInfo->validImplIdx >= 0 && implDesc->VendorID == 0x8086 && + implDesc->Impl == MFX_IMPL_TYPE_HARDWARE) { + // verify that DeviceID is a valid format for x86 GPU + // either "DeviceID" (hex) or "DeviceID/AdapterIdx" (hex/dec) + return ConfigCtxVPL::ParseDeviceIDx86(implDesc->Dev.DeviceID, deviceID, adapterIdx); + } + + return false; +} + +// query capabilities of all valid libraries +// and add to list for future calls to EnumImplementations() +// as well as filtering by functionality +// assume MFX_IMPLCAPS_IMPLDESCSTRUCTURE is the only format supported +mfxStatus LoaderCtxVPL::QueryLibraryCaps() { + DISP_LOG_FUNCTION(&m_dispLog); + + mfxStatus sts = MFX_ERR_NONE; + + std::list<LibInfo *>::iterator it = m_libInfoList.begin(); + while (it != m_libInfoList.end()) { + LibInfo *libInfo = (*it); + + if (libInfo->libType == LibTypeVPL) { + VPLFunctionPtr pFunc = libInfo->vplFuncTableIdxMFXQueryImplsDescription; + + // handle to implDesc structure, null in low-latency mode (no query) + mfxHDL *hImpl = nullptr; + mfxU32 numImpls = 0; + +#ifdef ONEVPL_EXPERIMENTAL + mfxHDL *hImplExtDeviceID = nullptr; + mfxU32 numImplsExtDeviceID = 0; +#endif + + if (m_bLowLatency == false) { + // call MFXQueryImplsDescription() for this implementation + // return handle to description in requested format + hImpl = (*(mfxHDL * (MFX_CDECL *)(mfxImplCapsDeliveryFormat, mfxU32 *)) + pFunc)(MFX_IMPLCAPS_IMPLDESCSTRUCTURE, &numImpls); + + // validate description pointer for each implementation + bool b_isValidDesc = true; + if (!hImpl) { + b_isValidDesc = false; + } + else { + for (mfxU32 i = 0; i < numImpls; i++) { + if (!hImpli) { + b_isValidDesc = false; + break; + } + } + } + + if (!b_isValidDesc) { + // the required function is implemented incorrectly + // remove this library from the list of valid libraries + UnloadSingleLibrary(libInfo); + it = m_libInfoList.erase(it); + continue; + } + +#ifdef ONEVPL_EXPERIMENTAL + hImplExtDeviceID = + (*(mfxHDL * (MFX_CDECL *)(mfxImplCapsDeliveryFormat, mfxU32 *)) + pFunc)(MFX_IMPLCAPS_DEVICE_ID_EXTENDED, &numImplsExtDeviceID); +#endif + } + + // query for list of implemented functions + // prior to API 2.2, this will return null since the format was not defined yet + // so we need to check whether the returned handle is valid before attempting to use it + mfxHDL *hImplFuncs = nullptr; + mfxU32 numImplsFuncs = 0; + hImplFuncs = (*(mfxHDL * (MFX_CDECL *)(mfxImplCapsDeliveryFormat, mfxU32 *)) + pFunc)(MFX_IMPLCAPS_IMPLEMENTEDFUNCTIONS, &numImplsFuncs); + + // only report single impl, but application may still attempt to create session using + // any of VendorImplID via the DXGIAdapterIndex filter property + if (m_bLowLatency == true) + numImpls = 1; + + // save user-friendly path for MFX_IMPLCAPS_IMPLPATH query (API >= 2.4) + UpdateImplPath(libInfo); + + for (mfxU32 i = 0; i < numImpls; i++) { + ImplInfo *implInfo = new ImplInfo; + if (!implInfo) + return MFX_ERR_MEMORY_ALLOC; + + // library which contains this implementation + implInfo->libInfo = libInfo; + +#ifdef ONEVPL_EXPERIMENTAL + if (hImplExtDeviceID && i < numImplsExtDeviceID) + implInfo->implExtDeviceID = hImplExtDeviceIDi; +#endif + + // implemented function description, if available + if (hImplFuncs && i < numImplsFuncs) + implInfo->implFuncs = hImplFuncsi; + + // fill out mfxInitializationParam for use in CreateSession (MFXInitialize path) + memset(&(implInfo->vplParam), 0, sizeof(mfxInitializationParam)); + + if (m_bLowLatency == false) { + // implementation descriptor returned from runtime + implInfo->implDesc = hImpli; + + // fill out mfxInitParam struct for when we call MFXInitEx + // in CreateSession() + mfxImplDescription *implDesc = reinterpret_cast<mfxImplDescription *>(hImpli); + + // default mode for this impl + // this may be changed later by MFXSetConfigFilterProperty(AccelerationMode) + implInfo->vplParam.AccelerationMode = implDesc->AccelerationMode; + + implInfo->version = implDesc->ApiVersion; + } + else { + implInfo->implDesc = nullptr; + + // application must set requested mode using MFXSetConfigFilterProperty() + // will be updated during CreateSession + implInfo->vplParam.AccelerationMode = MFX_ACCEL_MODE_NA; + + mfxVersion queryVersion = {}; + + // create test session to get API version + sts = QuerySessionLowLatency(libInfo, i, &queryVersion); + if (sts != MFX_ERR_NONE) { + UnloadSingleImplementation(implInfo); + continue; + } + implInfo->version.Version = queryVersion.Version; + } + + // save local index for this library + implInfo->libImplIdx = i; + + // validate that library exports all required functions for the reported API version + if (ValidateAPIExports(libInfo->vplFuncTable, implInfo->version)) { + UnloadSingleImplementation(implInfo); + continue; + } + + // initially all libraries have a valid, sequential value (>= 0) + // list of valid libraries is updated with every call to MFXSetConfigFilterProperty() + // (see UpdateValidImplList) + // libraries that do not support all the required props get a value of -1, and + // indexing of the valid libs is recalculated from 0,1,... + implInfo->validImplIdx = m_implIdxNext++; + + // add implementation to overall list + m_implInfoList.push_back(implInfo); + } + } + else if (libInfo->libType == LibTypeMSDK) { + // save user-friendly path for MFX_IMPLCAPS_IMPLPATH query (API >= 2.4) + UpdateImplPath(libInfo); + + mfxU32 maxImplMSDK = MAX_NUM_IMPL_MSDK; + + // call once on adapter 0 to get MSDK API version (same for any adapter) + mfxVersion queryVersion = {}; + if (m_bLowLatency) { + sts = LoaderCtxMSDK::QueryAPIVersion(libInfo->libNameFull, &queryVersion); + if (sts != MFX_ERR_NONE) + queryVersion.Version = 0; + + // only report single impl, but application may still attempt to create session using + // any of MFX_IMPL_HARDWAREx via the DXGIAdapterIndex filter property + maxImplMSDK = 1; + } + + mfxU32 numImplMSDK = 0; + for (mfxU32 i = 0; i < maxImplMSDK; i++) { + mfxImplDescription *implDesc = nullptr; + mfxImplementedFunctions *implFuncs = nullptr; +#ifdef ONEVPL_EXPERIMENTAL + mfxExtendedDeviceId *implExtDeviceID = nullptr; +#endif + + LoaderCtxMSDK *msdkCtx = &(libInfo->msdkCtxi); + if (m_bLowLatency == false) { + // perf. optimization: if app requested bIsSet_accelerationMode other than D3D9, don't test whether MSDK supports D3D9 + bool bSkipD3D9Check = false; + if (m_specialConfig.bIsSet_accelerationMode && + m_specialConfig.accelerationMode != MFX_ACCEL_MODE_VIA_D3D9) { + bSkipD3D9Check = true; + } + + sts = msdkCtx->QueryMSDKCaps(libInfo->libNameFull, + &implDesc, + &implFuncs, + i, + bSkipD3D9Check); + + if (sts || !implDesc || !implFuncs) { + // this adapter (i) is not supported + continue; + } + +#ifdef ONEVPL_EXPERIMENTAL + sts = LoaderCtxMSDK::QueryExtDeviceID(&(msdkCtx->m_extDeviceID), + i, + msdkCtx->m_deviceID, + msdkCtx->m_luid); + if (sts == MFX_ERR_NONE) + implExtDeviceID = &(msdkCtx->m_extDeviceID); + +#endif + } + else { + // unknown API - unable to create session on any adapter + if (queryVersion.Version == 0) + continue; + + // these are the only values filled in for msdkCtx in low latency mode + // used during CreateSession + msdkCtx->m_msdkAdapter = msdkImplTabi; + msdkCtx->m_msdkAdapterD3D9 = msdkImplTabi; + } + + ImplInfo *implInfo = new ImplInfo; + if (!implInfo) + return MFX_ERR_MEMORY_ALLOC; + + // library which contains this implementation + implInfo->libInfo = libInfo; + + // implemented function description, if available + implInfo->implFuncs = implFuncs; + +#ifdef ONEVPL_EXPERIMENTAL + // extended device ID description, if available + implInfo->implExtDeviceID = implExtDeviceID; +#endif + // fill out mfxInitializationParam for use in CreateSession (MFXInitialize path) + memset(&(implInfo->vplParam), 0, sizeof(mfxInitializationParam)); + + if (m_bLowLatency == false) { + // implementation descriptor returned from runtime + implInfo->implDesc = implDesc; + + // default mode for this impl + // this may be changed later by MFXSetConfigFilterProperty(AccelerationMode) + implInfo->vplParam.AccelerationMode = implDesc->AccelerationMode; + + implInfo->version = implDesc->ApiVersion; + } + else { + implInfo->implDesc = nullptr; + + // application must set requested mode using MFXSetConfigFilterProperty() + // will be updated during CreateSession + implInfo->vplParam.AccelerationMode = MFX_ACCEL_MODE_NA; + + // save API version from creating test MSDK session above + implInfo->version.Version = queryVersion.Version; + } + + // adapter number + implInfo->msdkImplIdx = i; + + // save local index for this library + implInfo->libImplIdx = 0; + + // initially all libraries have a valid, sequential value (>= 0) + // list of valid libraries is updated with every call to MFXSetConfigFilterProperty() + // (see UpdateValidImplList) + // libraries that do not support all the required props get a value of -1, and + // indexing of the valid libs is recalculated from 0,1,... + implInfo->validImplIdx = m_implIdxNext++; + + // add implementation to overall list + m_implInfoList.push_back(implInfo); + + // update number of valid MSDK adapters + numImplMSDK++; + } + + if (numImplMSDK == 0) { + // error loading MSDK library in compatibility mode - remove from list + UnloadSingleLibrary(libInfo); + it = m_libInfoList.erase(it); + continue; + } + } + it++; + } + + if (m_bLowLatency == false && !m_implInfoList.empty()) { + bool bD3D9Requested = (m_specialConfig.bIsSet_accelerationMode && + m_specialConfig.accelerationMode == MFX_ACCEL_MODE_VIA_D3D9); + + std::list<ImplInfo *>::iterator it2 = m_implInfoList.begin(); + while (it2 != m_implInfoList.end()) { + ImplInfo *implInfo = (*it2); + + mfxU32 deviceID = 0; + mfxU32 adapterIdx = 0; + if (IsValidX86GPU(implInfo, deviceID, adapterIdx)) { + // save the adapterIdx for any x86 GPU devices (may be used later for filtering) + implInfo->adapterIdx = adapterIdx; + } + + // per spec: if both VPL (HW) and MSDK are installed for the same accelerator, only load + // the VPL implementation (mark MSDK as invalid) + // exception: if application requests D3D9, load MSDK if available + if (implInfo->libInfo->libType == LibTypeMSDK) { + mfxImplDescription *msdkImplDesc = (mfxImplDescription *)(implInfo->implDesc); + std::string msdkDeviceID = (msdkImplDesc ? msdkImplDesc->Dev.DeviceID : ""); + + // check if VPL impl also exists for this deviceID + auto vplIdx = std::find_if( + m_implInfoList.begin(), + m_implInfoList.end(), + + &(const ImplInfo *t) { + mfxImplDescription *implDesc = (mfxImplDescription *)(t->implDesc); + + bool bMatchingDeviceID = false; + if (implDesc) { + std::string vplDeviceID = implDesc->Dev.DeviceID; + if (vplDeviceID == msdkDeviceID) + bMatchingDeviceID = true; + } + + return (t->libInfo->libType == LibTypeVPL && implDesc != nullptr && + implDesc->Impl == MFX_IMPL_TYPE_HARDWARE && bMatchingDeviceID); + }); + + if (vplIdx != m_implInfoList.end() && bD3D9Requested == false) + implInfo->validImplIdx = -1; + + // avoid loading VPL RT via compatibility entrypoint + if (msdkImplDesc && msdkImplDesc->ApiVersion.Major == 1 && + msdkImplDesc->ApiVersion.Minor == 255) + implInfo->validImplIdx = -1; + } + + if (implInfo->libInfo->libType == LibTypeVPL && !implInfo->implDesc) { + //library was loaded in low-delay mode, need to query caps for it + mfxU32 numImpls = 0; + VPLFunctionPtr pFunc = implInfo->libInfo->vplFuncTableIdxMFXQueryImplsDescription; + mfxHDL *hImpl = (*(mfxHDL * (MFX_CDECL *)(mfxImplCapsDeliveryFormat, mfxU32 *)) + pFunc)(MFX_IMPLCAPS_IMPLDESCSTRUCTURE, &numImpls); + + //only single impl was reported + implInfo->implDesc = reinterpret_cast<mfxImplDescription *>(hImpl0); + } + else if (implInfo->libInfo->libType == LibTypeMSDK && !implInfo->implDesc) { + mfxImplDescription *implDesc = nullptr; + mfxImplementedFunctions *implFuncs = nullptr; + + LoaderCtxMSDK *msdkCtx = &(implInfo->libInfo->msdkCtx0); + + // perf. optimization: if app requested bIsSet_accelerationMode other than D3D9, don't test whether MSDK supports D3D9 + bool bSkipD3D9Check = false; + if (m_specialConfig.bIsSet_accelerationMode && + m_specialConfig.accelerationMode != MFX_ACCEL_MODE_VIA_D3D9) { + bSkipD3D9Check = true; + } + + sts = msdkCtx->QueryMSDKCaps(implInfo->libInfo->libNameFull, + &implDesc, + &implFuncs, + 0, + bSkipD3D9Check); + + if (sts || !implDesc || !implFuncs) { + // this adapter (i) is not supported + continue; + } + implInfo->implDesc = implDesc; + implInfo->implFuncs = implFuncs; + } + + it2++; + } + + // sort valid implementations according to priority rules in spec + PrioritizeImplList(); + } + + return m_implInfoList.empty() ? MFX_ERR_UNSUPPORTED : MFX_ERR_NONE; +} + +// query implementation i +mfxStatus LoaderCtxVPL::QueryImpl(mfxU32 idx, mfxImplCapsDeliveryFormat format, mfxHDL *idesc) { + DISP_LOG_FUNCTION(&m_dispLog); + + *idesc = nullptr; + + std::list<ImplInfo *>::iterator it = m_implInfoList.begin(); + while (it != m_implInfoList.end()) { + ImplInfo *implInfo = (*it); + if (implInfo->validImplIdx == (mfxI32)idx) { + if (format == MFX_IMPLCAPS_IMPLDESCSTRUCTURE) { + *idesc = implInfo->implDesc; + } + else if (format == MFX_IMPLCAPS_IMPLEMENTEDFUNCTIONS) { + *idesc = implInfo->implFuncs; + } + else if (format == MFX_IMPLCAPS_IMPLPATH) { + *idesc = implInfo->libInfo->implCapsPath; + } +#ifdef ONEVPL_EXPERIMENTAL + else if (format == MFX_IMPLCAPS_DEVICE_ID_EXTENDED) { + *idesc = implInfo->implExtDeviceID; + } +#endif + + // implementation found, but requested query format is not supported + if (*idesc == nullptr) + return MFX_ERR_UNSUPPORTED; + + return MFX_ERR_NONE; + } + it++; + } + + // invalid idx + return MFX_ERR_NOT_FOUND; +} + +mfxStatus LoaderCtxVPL::ReleaseImpl(mfxHDL idesc) { + DISP_LOG_FUNCTION(&m_dispLog); + + mfxStatus sts = MFX_ERR_NONE; + + if (idesc == nullptr) + return MFX_ERR_NULL_PTR; + + // all we get from the application is a handle to the descriptor, + // not the implementation associated with it, so we search + // through the full list until we find a match + std::list<ImplInfo *>::iterator it = m_implInfoList.begin(); + while (it != m_implInfoList.end()) { + ImplInfo *implInfo = (*it); + mfxImplCapsDeliveryFormat capsFormat = (mfxImplCapsDeliveryFormat)0; // unknown format + + // in low latency mode implDesc will be empty + if (implInfo->implDesc == nullptr) + continue; + + // determine type of descriptor so we know which handle to + // invalidate in the Loader context + if (implInfo->implDesc == idesc) { + capsFormat = MFX_IMPLCAPS_IMPLDESCSTRUCTURE; + } + else if (implInfo->implFuncs == idesc) { + capsFormat = MFX_IMPLCAPS_IMPLEMENTEDFUNCTIONS; + } + else if (implInfo->libInfo->implCapsPath == idesc) { + capsFormat = MFX_IMPLCAPS_IMPLPATH; + } +#ifdef ONEVPL_EXPERIMENTAL + else if (implInfo->implExtDeviceID == idesc) { + capsFormat = MFX_IMPLCAPS_DEVICE_ID_EXTENDED; + } +#endif + else { + // no match - try next implementation + it++; + continue; + } + + // if true, do not actually call ReleaseImplDescription() until + // MFXUnload() --> UnloadAllLibraries() + // this permits the application to call Enum/CreateSession/DispRelease multiple + // times on the same implementation + if (m_bKeepCapsUntilUnload) + return MFX_ERR_NONE; + + // LibTypeMSDK does not require calling a release function + if (implInfo->libInfo->libType == LibTypeVPL) { + // call MFXReleaseImplDescription() for this implementation + VPLFunctionPtr pFunc = implInfo->libInfo->vplFuncTableIdxMFXReleaseImplDescription; + + if (capsFormat == MFX_IMPLCAPS_IMPLDESCSTRUCTURE) { + sts = (*(mfxStatus(MFX_CDECL *)(mfxHDL))pFunc)(implInfo->implDesc); + implInfo->implDesc = nullptr; + } + else if (capsFormat == MFX_IMPLCAPS_IMPLEMENTEDFUNCTIONS) { + sts = (*(mfxStatus(MFX_CDECL *)(mfxHDL))pFunc)(implInfo->implFuncs); + implInfo->implFuncs = nullptr; + } +#ifdef ONEVPL_EXPERIMENTAL + else if (capsFormat == MFX_IMPLCAPS_DEVICE_ID_EXTENDED) { + sts = (*(mfxStatus(MFX_CDECL *)(mfxHDL))pFunc)(implInfo->implExtDeviceID); + implInfo->implExtDeviceID = nullptr; + } +#endif + + // nothing to do if (capsFormat == MFX_IMPLCAPS_IMPLPATH) since no new memory was allocated + } + + return sts; + } + + // did not find a matching handle - should not happen + return MFX_ERR_INVALID_HANDLE; +} + +mfxStatus LoaderCtxVPL::UpdateLowLatency() { + m_bLowLatency = false; + + m_bLowLatency = ConfigCtxVPL::CheckLowLatencyConfig(m_configCtxList, &m_specialConfig); + + return MFX_ERR_NONE; +} + +mfxStatus LoaderCtxVPL::UpdateValidImplList(void) { + DISP_LOG_FUNCTION(&m_dispLog); + + mfxStatus sts = MFX_ERR_NONE; + + mfxI32 validImplIdx = 0; + + // iterate over all libraries and update list of those that + // meet current current set of config props + std::list<ImplInfo *>::iterator it = m_implInfoList.begin(); + while (it != m_implInfoList.end()) { + ImplInfo *implInfo = (*it); + + // already invalidated by previous filter + if (implInfo->validImplIdx == -1) { + it++; + continue; + } + + // compare caps from this library vs. config filters + sts = ConfigCtxVPL::ValidateConfig((mfxImplDescription *)implInfo->implDesc, + (mfxImplementedFunctions *)implInfo->implFuncs, +#ifdef ONEVPL_EXPERIMENTAL + (mfxExtendedDeviceId *)implInfo->implExtDeviceID, +#endif + m_configCtxList, + implInfo->libInfo->libType, + &m_specialConfig); + + // check special filter properties which are not part of mfxImplDescription + if (m_specialConfig.bIsSet_dxgiAdapterIdx && + (m_specialConfig.dxgiAdapterIdx != implInfo->adapterIdx)) { + sts = MFX_ERR_UNSUPPORTED; + } + + if (sts == MFX_ERR_NONE) { + // library supports all required properties + implInfo->validImplIdx = validImplIdx++; + } + else { + // library does not support required props, do not include in list for + // MFXEnumImplementations() or MFXCreateSession() + implInfo->validImplIdx = -1; + } + + it++; + } + + // re-sort valid implementations according to priority rules in spec + PrioritizeImplList(); + + m_bNeedUpdateValidImpls = false; + + return MFX_ERR_NONE; +} + +// From specification section "oneVPL Session": +// +// When the dispatcher searches for the implementation, it uses the following priority rules +// 1) Hardware implementation has priority over software implementation. +// 2) General hardware implementation has priority over VSI hardware implementation. +// 3) Highest API version has higher priority over lower API version. +// 4) Search path priority: lower values = higher priority +mfxStatus LoaderCtxVPL::PrioritizeImplList(void) { + DISP_LOG_FUNCTION(&m_dispLog); + + // API 2.6 introduced special search location ONEVPL_PRIORITY_PATH + // Libs here always have highest priority = LIB_PRIORITY_SPECIAL + // and are not sorted by the other priority rules, + // so we move them to a temporary list before priority sorting and + // then add back to the full implementation list at the end. + std::list<ImplInfo *> implInfoListPriority; + if (m_bPriorityPathEnabled) { + auto it = m_implInfoList.begin(); + while (it != m_implInfoList.end()) { + ImplInfo *implInfo = (*it); + + auto it2 = std::next(it, 1); + if (implInfo->libInfo->libPriority == LIB_PRIORITY_SPECIAL) + implInfoListPriority.splice(implInfoListPriority.end(), m_implInfoList, it); + + it = it2; + } + } + + // stable sort - work from lowest to highest priority conditions + + // 4 - sort by search path priority + m_implInfoList.sort((const ImplInfo *impl1, const ImplInfo *impl2) { + // prioritize lowest value for libPriority (1 = highest priority) + return (impl1->libInfo->libPriority < impl2->libInfo->libPriority); + }); + + // 3 - sort by API version + m_implInfoList.sort((const ImplInfo *impl1, const ImplInfo *impl2) { + mfxImplDescription *implDesc1 = (mfxImplDescription *)(impl1->implDesc); + mfxImplDescription *implDesc2 = (mfxImplDescription *)(impl2->implDesc); + + // prioritize greatest API version + return (implDesc1->ApiVersion.Version > implDesc2->ApiVersion.Version); + }); + + // 2 - sort by general HW vs. VSI + m_implInfoList.sort((const ImplInfo *impl1, const ImplInfo *impl2) { + mfxImplDescription *implDesc1 = (mfxImplDescription *)(impl1->implDesc); + mfxImplDescription *implDesc2 = (mfxImplDescription *)(impl2->implDesc); + + // prioritize general HW accelerator over VSI (if none, i.e. SW, will be sorted in final step) + return (implDesc1->AccelerationMode != MFX_ACCEL_MODE_VIA_HDDLUNITE && + implDesc2->AccelerationMode == MFX_ACCEL_MODE_VIA_HDDLUNITE); + }); + + // 1 - sort by implementation type (HW > SW) + m_implInfoList.sort((const ImplInfo *impl1, const ImplInfo *impl2) { + mfxImplDescription *implDesc1 = (mfxImplDescription *)(impl1->implDesc); + mfxImplDescription *implDesc2 = (mfxImplDescription *)(impl2->implDesc); + + // prioritize greatest Impl value (HW = 2, SW = 1) + return (implDesc1->Impl > implDesc2->Impl); + }); + + if (m_bPriorityPathEnabled) { + // add back unsorted ONEVPL_PRIORITY_PATH libs to beginning of list + m_implInfoList.splice(m_implInfoList.begin(), implInfoListPriority); + } + + // final pass - update index to match new priority order + // validImplIdx will be the index associated with MFXEnumImplememntations() + mfxI32 validImplIdx = 0; + std::list<ImplInfo *>::iterator it = m_implInfoList.begin(); + while (it != m_implInfoList.end()) { + ImplInfo *implInfo = (*it); + + if (implInfo->validImplIdx >= 0) { + implInfo->validImplIdx = validImplIdx++; + } + it++; + } + + return MFX_ERR_NONE; +} + +mfxStatus LoaderCtxVPL::CreateSession(mfxU32 idx, mfxSession *session) { + DISP_LOG_FUNCTION(&m_dispLog); + + mfxStatus sts = MFX_ERR_NONE; + + // find library with given implementation index + // list of valid implementations (and associated indices) is updated + // every time a filter property is added/modified + std::list<ImplInfo *>::iterator it = m_implInfoList.begin(); + while (it != m_implInfoList.end()) { + ImplInfo *implInfo = (*it); + + if (implInfo->validImplIdx == (mfxI32)idx) { + LibInfo *libInfo = implInfo->libInfo; + mfxU16 deviceID = 0; + + // pass VendorImplID for this implementation (disambiguate if one + // library contains multiple implementations) + // NOTE: implDesc may be null in low latency mode (RT query not called) + // so this value will not be available + mfxImplDescription *implDesc = (mfxImplDescription *)(implInfo->implDesc); + if (implDesc) { + implInfo->vplParam.VendorImplID = implDesc->VendorImplID; + } + + // set any special parameters passed in via SetConfigProperty + // if application did not specify accelerationMode, use default + if (m_specialConfig.bIsSet_accelerationMode) + implInfo->vplParam.AccelerationMode = m_specialConfig.accelerationMode; + +#ifdef ONEVPL_EXPERIMENTAL + if (m_specialConfig.bIsSet_DeviceCopy) + implInfo->vplParam.DeviceCopy = m_specialConfig.DeviceCopy; +#endif + + // in low latency mode there was no implementation filtering, so check here + // for minimum API version + if (m_bLowLatency && m_specialConfig.bIsSet_ApiVersion) { + if (implInfo->version.Version < m_specialConfig.ApiVersion.Version) + return MFX_ERR_NOT_FOUND; + } + + mfxIMPL msdkImpl = 0; + if (libInfo->libType == LibTypeMSDK) { + if (implInfo->vplParam.AccelerationMode == MFX_ACCEL_MODE_VIA_D3D9) + msdkImpl = libInfo->msdkCtximplInfo->msdkImplIdx.m_msdkAdapterD3D9; + else + msdkImpl = libInfo->msdkCtximplInfo->msdkImplIdx.m_msdkAdapter; + } + + // in low latency mode implDesc is not available, but application may set adapter number via DXGIAdapterIndex filter + if (m_bLowLatency) { + if (m_specialConfig.bIsSet_dxgiAdapterIdx && libInfo->libType == LibTypeVPL) + implInfo->vplParam.VendorImplID = m_specialConfig.dxgiAdapterIdx; + else if (m_specialConfig.bIsSet_dxgiAdapterIdx && libInfo->libType == LibTypeMSDK) + msdkImpl = msdkImplTabm_specialConfig.dxgiAdapterIdx; + } + + // add any extension buffers set via special filter properties + std::vector<mfxExtBuffer *> extBufs; + + // pass NumThread via mfxExtThreadsParam + mfxExtThreadsParam extThreadsParam = {}; + if (m_specialConfig.bIsSet_NumThread) { + DISP_LOG_MESSAGE(&m_dispLog, + "message: extBuf enabled -- NumThread (%d)", + m_specialConfig.NumThread); + + extThreadsParam.Header.BufferId = MFX_EXTBUFF_THREADS_PARAM; + extThreadsParam.Header.BufferSz = sizeof(mfxExtThreadsParam); + extThreadsParam.NumThread = m_specialConfig.NumThread; + + extBufs.push_back((mfxExtBuffer *)&extThreadsParam); + } + + // add extBufs provided via mfxConfig filter property "ExtBuffer" + if (m_specialConfig.bIsSet_ExtBuffer) { + for (auto extBuf : m_specialConfig.ExtBuffers) { + extBufs.push_back((mfxExtBuffer *)extBuf); + } + } + + // attach vector of extBufs to mfxInitializationParam + implInfo->vplParam.NumExtParam = static_cast<mfxU16>(extBufs.size()); + implInfo->vplParam.ExtParam = + (implInfo->vplParam.NumExtParam ? extBufs.data() : nullptr); + + // initialize this library via MFXInitialize or else fail + // (specify full path to library) + sts = MFXInitEx2(implInfo->version, + implInfo->vplParam, + msdkImpl, + session, + &deviceID, + (CHAR_TYPE *)libInfo->libNameFull.c_str()); + + // optionally call MFXSetHandle() if present via SetConfigProperty + if (sts == MFX_ERR_NONE && m_specialConfig.bIsSet_deviceHandleType && + m_specialConfig.bIsSet_deviceHandle && m_specialConfig.deviceHandleType && + m_specialConfig.deviceHandle) { + sts = MFXVideoCORE_SetHandle(*session, + m_specialConfig.deviceHandleType, + m_specialConfig.deviceHandle); + } + + return sts; + } + it++; + } + + // invalid idx + return MFX_ERR_NOT_FOUND; +} + +ConfigCtxVPL *LoaderCtxVPL::AddConfigFilter() { + DISP_LOG_FUNCTION(&m_dispLog); + + // create new config filter context and add + // to list associated with this loader + std::unique_ptr<ConfigCtxVPL> configCtx; + try { + configCtx.reset(new ConfigCtxVPL{}); + } + catch (...) { + return nullptr; + } + + ConfigCtxVPL *config = (ConfigCtxVPL *)(configCtx.release()); + config->m_parentLoader = this; + + m_configCtxList.push_back(config); + + return config; +} + +mfxStatus LoaderCtxVPL::FreeConfigFilters() { + DISP_LOG_FUNCTION(&m_dispLog); + + std::list<ConfigCtxVPL *>::iterator it = m_configCtxList.begin(); + + while (it != m_configCtxList.end()) { + ConfigCtxVPL *config = (*it); + if (config) + delete config; + it++; + } + + return MFX_ERR_NONE; +} + +mfxStatus LoaderCtxVPL::InitDispatcherLog() { + std::string strLogEnabled, strLogFile; + +#if defined(_WIN32) || defined(_WIN64) + DWORD err; + + char logEnabledMAX_VPL_SEARCH_PATH = ""; + err = GetEnvironmentVariable("ONEVPL_DISPATCHER_LOG", logEnabled, MAX_VPL_SEARCH_PATH); + if (err == 0 || err >= MAX_VPL_SEARCH_PATH) + return MFX_ERR_UNSUPPORTED; // environment variable not defined or string too long + + strLogEnabled = logEnabled; + + char logFileMAX_VPL_SEARCH_PATH = ""; + err = GetEnvironmentVariable("ONEVPL_DISPATCHER_LOG_FILE", logFile, MAX_VPL_SEARCH_PATH); + if (err == 0 || err >= MAX_VPL_SEARCH_PATH) { + // nothing to do - strLogFile is an empty string + } + else { + strLogFile = logFile; + } + +#else + const char *logEnabled = std::getenv("ONEVPL_DISPATCHER_LOG"); + if (!logEnabled) + return MFX_ERR_UNSUPPORTED; + + strLogEnabled = logEnabled; + + const char *logFile = std::getenv("ONEVPL_DISPATCHER_LOG_FILE"); + if (logFile) + strLogFile = logFile; +#endif + + if (strLogEnabled != "ON") + return MFX_ERR_UNSUPPORTED; + + // currently logLevel is either 0 or non-zero + // additional levels will be added with future API updates + return m_dispLog.Init(1, strLogFile); +} + +// public function to return logger object +// allows logging from C API functions outside of loaderCtx +DispatcherLogVPL *LoaderCtxVPL::GetLogger() { + return &m_dispLog; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_log.cpp
Added
@@ -0,0 +1,63 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include "vpl/mfx_dispatcher_vpl_log.h" + +DispatcherLogVPL::DispatcherLogVPL() : m_logLevel(0), m_logFileName(), m_logFile(nullptr) {} + +DispatcherLogVPL::~DispatcherLogVPL() { + if (!m_logFileName.empty() && m_logFile) + fclose(m_logFile); + m_logFile = nullptr; +} + +mfxStatus DispatcherLogVPL::Init(mfxU32 logLevel, const std::string &logFileName) { + // avoid leaking file handle if Init is accidentally called more than once + if (m_logFile) + return MFX_ERR_UNSUPPORTED; + + m_logLevel = logLevel; + m_logFileName = logFileName; + + // append to file if it already exists, otherwise create a new one + // m_logFile will be closed in dtor + if (m_logLevel) { + if (m_logFileName.empty()) { + m_logFile = stdout; + } + else { +#if defined(_WIN32) || defined(_WIN64) + fopen_s(&m_logFile, m_logFileName.c_str(), "a"); +#else + m_logFile = fopen(m_logFileName.c_str(), "a"); +#endif + if (!m_logFile) { + m_logFile = stdout; + fprintf(m_logFile, + "Warning - unable to create logfile %s\n", + m_logFileName.c_str()); + fprintf(m_logFile, "Log output will be sent to stdout\n"); + m_logFileName.clear(); + } + } + } + + return MFX_ERR_NONE; +} + +mfxStatus DispatcherLogVPL::LogMessage(const char *msg, ...) { + if (!m_logLevel || !m_logFile) + return MFX_ERR_NONE; + + va_list args; + va_start(args, msg); + vfprintf(m_logFile, msg, args); + va_end(args); + + fprintf(m_logFile, "\n"); + + return MFX_ERR_NONE; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_log.h
Added
@@ -0,0 +1,81 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_VPL_MFX_DISPATCHER_VPL_LOG_H_ +#define DISPATCHER_VPL_MFX_DISPATCHER_VPL_LOG_H_ + +/* oneVPL Dispatcher Debug Log + * The debug output of the dispatcher is controlled with the ONEVPL_DISPATCHER_LOG environment variable. + * To enable log output, set the ONEVPL_DISPATCHER_LOG environment variable value equals to "ON". + * + * By default, oneVPL dispatcher prints all log messages to the console. + * To redirect log output to the desired file, set the ONEVPL_DISPATCHER_LOG_FILE environmental + * variable with the file name of the log file. + */ + +#include <stdarg.h> +#include <stdio.h> + +#include <string> + +#include "vpl/mfxdispatcher.h" +#include "vpl/mfxvideo.h" + +#ifndef __FUNC_NAME__ + #if defined(_WIN32) || defined(_WIN64) + #define __FUNC_NAME__ __FUNCTION__ + #else + #define __FUNC_NAME__ __PRETTY_FUNCTION__ + #endif +#endif + +class DispatcherLogVPL { +public: + DispatcherLogVPL(); + ~DispatcherLogVPL(); + + mfxStatus Init(mfxU32 logLevel, const std::string &logFileName); + mfxStatus LogMessage(const char *msdk, ...); + + mfxU32 m_logLevel; + +private: + std::string m_logFileName; + FILE *m_logFile; +}; + +class DispatcherLogVPLFunction { +public: + DispatcherLogVPLFunction(DispatcherLogVPL *dispLog, const char *fnName) + : m_dispLog(), + m_fnName() { + m_dispLog = dispLog; + + if (m_dispLog && m_dispLog->m_logLevel) { + m_fnName = fnName; + m_dispLog->LogMessage("function: %s (enter)", m_fnName.c_str()); + } + } + + ~DispatcherLogVPLFunction() { + if (m_dispLog && m_dispLog->m_logLevel) + m_dispLog->LogMessage("function: %s (return)", m_fnName.c_str()); + } + +private: + DispatcherLogVPL *m_dispLog; + std::string m_fnName; +}; + +#define DISP_LOG_FUNCTION(dispLog) DispatcherLogVPLFunction _dispLogFn(dispLog, __FUNC_NAME__); +#define DISP_LOG_MESSAGE(dispLog, ...) \ + { \ + if (dispLog) { \ + (dispLog)->LogMessage(__VA_ARGS__); \ + } \ + } + +#endif // DISPATCHER_VPL_MFX_DISPATCHER_VPL_LOG_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_lowlatency.cpp
Added
@@ -0,0 +1,438 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include "vpl/mfx_dispatcher_vpl.h" + +#if defined(_WIN32) || defined(_WIN64) + #include "vpl/mfx_dispatcher_vpl_win.h" + + #if defined _M_IX86 + // Windows x86 + #define LIB_ONEVPL L"libmfx32-gen.dll" + #define LIB_MSDK L"libmfxhw32.dll" + #else + // Windows x64 + #define LIB_ONEVPL L"libmfx64-gen.dll" + #define LIB_MSDK L"libmfxhw64.dll" + #endif +#elif defined(__linux__) + // Linux x64 + #define LIB_ONEVPL "libmfx-gen.so.1.2" + #define LIB_MSDK "libmfxhw64.so.1" +#endif + +// For Windows: +// VPL - load from Driver Store, look only for libmfx64-gen.dll (32) +// MSDK - load from Driver Store, look only for libmfxhw64.dll (32) +// MSDK - fallback, load from %windir%\system32 or %windir%\syswow64 + +// For Linux: +// VPL - load from system paths in LoadLibsFromMultipleDirs(), look only for libmfx-gen.so.1.2 +// MSDK - load from system paths in LoadLibsFromMultipleDirs(), look only for libmfxhw64.so.1 + +// library names +static const CHAR_TYPE *libNameVPL = LIB_ONEVPL; +static const CHAR_TYPE *libNameMSDK = LIB_MSDK; + +// required exports +static const char *reqFuncVPL = "MFXInitialize"; +static const char *reqFuncMSDK = "MFXInitEx"; + +LibInfo *LoaderCtxVPL::AddSingleLibrary(STRING_TYPE libPath, LibType libType) { + LibInfo *libInfo = nullptr; + +#if defined(_WIN32) || defined(_WIN64) + // try to open library + mfxModuleHandle hLib = MFX::mfx_dll_load(libPath.c_str()); + if (!hLib) + return nullptr; + + // check for required entrypoint function + const char *reqFunc = (libType == LibTypeVPL ? reqFuncVPL : reqFuncMSDK); + VPLFunctionPtr pProc = (VPLFunctionPtr)MFX::mfx_dll_get_addr(hLib, reqFunc); + MFX::mfx_dll_free(hLib); + + // entrypoint function missing - invalid library + if (!pProc) + return nullptr; +#else + // try to open library + void *hLib = dlopen(libPath.c_str(), RTLD_LOCAL | RTLD_NOW); + if (!hLib) + return nullptr; + + // check for required entrypoint function + const char *reqFunc = (libType == LibTypeVPL ? reqFuncVPL : reqFuncMSDK); + VPLFunctionPtr pProc = (VPLFunctionPtr)dlsym(hLib, reqFunc); + dlclose(hLib); + + // entrypoint function missing - invalid library + if (!pProc) + return nullptr; +#endif + + // create new LibInfo and add to list + libInfo = new LibInfo; + if (!libInfo) + return nullptr; + + libInfo->libNameFull = libPath; + libInfo->libType = libType; + libInfo->libPriority = (libType == LibTypeVPL ? LIB_PRIORITY_01 : LIB_PRIORITY_LEGACY); + + return libInfo; +} + +mfxStatus LoaderCtxVPL::LoadLibsFromDriverStore(mfxU32 numAdapters, + const std::vector<DXGI1DeviceInfo> &adapterInfo, + LibType libType) { +#if defined(_WIN32) || defined(_WIN64) + mfxStatus sts = MFX_ERR_NONE; + + mfxI32 storageID = MFX::MFX_UNKNOWN_KEY; + const CHAR_TYPE *libName = nullptr; + const char *reqFunc = nullptr; + + if (libType == LibTypeVPL) { + storageID = MFX::MFX_DRIVER_STORE_ONEVPL; + libName = libNameVPL; + reqFunc = reqFuncVPL; + } + else if (libType == LibTypeMSDK) { + storageID = MFX::MFX_DRIVER_STORE; + libName = libNameMSDK; + reqFunc = reqFuncMSDK; + } + else { + return MFX_ERR_UNSUPPORTED; + } + + // get path to Windows driver store + STRING_TYPE libPath; + mfxU32 adapterID; + for (adapterID = 0; adapterID < numAdapters; adapterID++) { + // get driver store path for this adapter + libPath.clear(); + sts = MFX::MFXLibraryIterator::GetDriverStoreDir(libPath, + MAX_VPL_SEARCH_PATH, + adapterInfoadapterID.deviceID, + storageID); + if (sts != MFX_ERR_NONE || libPath.size() == 0) + continue; + + // try to open library + libPath += libName; + LibInfo *libInfo = AddSingleLibrary(libPath, libType); + + // if successful, add to list and return (stop at first + if (libInfo) { + m_libInfoList.push_back(libInfo); + return MFX_ERR_NONE; + } + } + + return MFX_ERR_UNSUPPORTED; +#else + // Linux - not supported + return MFX_ERR_UNSUPPORTED; +#endif +} + +mfxStatus LoaderCtxVPL::LoadLibsFromSystemDir(LibType libType) { +#if defined(_WIN32) || defined(_WIN64) + mfxStatus sts = MFX_ERR_NONE; + + const CHAR_TYPE *libName = nullptr; + const char *reqFunc = nullptr; + + if (libType == LibTypeVPL) { + libName = libNameVPL; + reqFunc = reqFuncVPL; + } + else if (libType == LibTypeMSDK) { + libName = libNameMSDK; + reqFunc = reqFuncMSDK; + } + else { + return MFX_ERR_UNSUPPORTED; + } + + // get path to Windows system dir + STRING_TYPE libPath; + libPath.clear(); + + std::list<STRING_TYPE> winSysDir; + ParseEnvSearchPaths(L"windir", winSysDir); + + // should resolve to a single directory, otherwise something went wrong + if (winSysDir.size() == 1) { + #if defined _M_IX86 + libPath = winSysDir.front() + L"\\syswow64\\"; + #else + libPath = winSysDir.front() + L"\\system32\\"; + #endif + } + else { + return MFX_ERR_UNSUPPORTED; + } + + // try to open library + libPath += libName; + LibInfo *libInfo = AddSingleLibrary(libPath, libType); + + // if successful, add to list and return (stop at first + if (libInfo) { + m_libInfoList.push_back(libInfo); + return MFX_ERR_NONE; + } + + return MFX_ERR_UNSUPPORTED; +#else + // Linux - not supported + return MFX_ERR_UNSUPPORTED; +#endif +} + +mfxStatus LoaderCtxVPL::LoadLibsFromMultipleDirs(LibType libType) { +#ifdef __linux__ + // clang-format off + + // standard paths for RT installation on Linux + std::vector<std::string> llSearchDir = { + "/usr/lib/x86_64-linux-gnu", + "/lib", + "/usr/lib", + "/lib64", + "/usr/lib64", + }; + + // clang-format on + + const CHAR_TYPE *libName = nullptr; + + if (libType == LibTypeVPL) { + libName = libNameVPL; + } + else if (libType == LibTypeMSDK) { + libName = libNameMSDK; + + // additional search directories for MSDK + llSearchDir.push_back("/opt/intel/mediasdk/lib"); + llSearchDir.push_back("/opt/intel/mediasdk/lib64"); + } + else { + return MFX_ERR_UNSUPPORTED; + } + + for (const auto &searchDir : llSearchDir) { + STRING_TYPE libPath; + libPath = searchDir; + libPath += "/"; + libPath += libName; + + // try to open library + LibInfo *libInfo = AddSingleLibrary(libPath, libType); + + // if successful, add to list and return (stop at first success) + if (libInfo) { + m_libInfoList.push_back(libInfo); + return MFX_ERR_NONE; + } + } + + return MFX_ERR_UNSUPPORTED; +#else + return MFX_ERR_UNSUPPORTED; +#endif +} + +mfxStatus LoaderCtxVPL::LoadLibsLowLatency() { + DISP_LOG_FUNCTION(&m_dispLog); + +#if defined(_WIN32) || defined(_WIN64) + mfxStatus sts = MFX_ERR_NONE; + + // check driver store + mfxU32 numAdapters = 0; + + std::vector<DXGI1DeviceInfo> adapterInfo; + bool bEnumSuccess = MFX::DXGI1Device::GetAdapterList(adapterInfo); + numAdapters = (mfxU32)adapterInfo.size(); + + // error - no graphics adapters found + if (!bEnumSuccess || numAdapters == 0) + return MFX_ERR_UNSUPPORTED; + + // try loading oneVPL from driver store + sts = LoadLibsFromDriverStore(numAdapters, adapterInfo, LibTypeVPL); + if (sts == MFX_ERR_NONE) { + LibInfo *libInfo = m_libInfoList.back(); + + sts = LoadSingleLibrary(libInfo); + if (sts == MFX_ERR_NONE) { + LoadAPIExports(libInfo, LibTypeVPL); + m_bNeedLowLatencyQuery = false; + return MFX_ERR_NONE; + } + UnloadSingleLibrary(libInfo); // failed - unload and move to next location + } + + // try loading MSDK from driver store + sts = LoadLibsFromDriverStore(numAdapters, adapterInfo, LibTypeMSDK); + if (sts == MFX_ERR_NONE) { + LibInfo *libInfo = m_libInfoList.back(); + + sts = LoadSingleLibrary(libInfo); + if (sts == MFX_ERR_NONE) { + mfxU32 numFunctions = LoadAPIExports(libInfo, LibTypeMSDK); + + if (numFunctions == NumMSDKFunctions) { + mfxVariant var = {}; + var.Type = MFX_VARIANT_TYPE_PTR; + var.Data.Ptr = (mfxHDL) "mfxhw64"; + + auto it = m_configCtxList.begin(); + + while (it != m_configCtxList.end()) { + ConfigCtxVPL *config = (*it); + sts = config->SetFilterProperty((const mfxU8 *)"mfxImplDescription.ImplName", + var); + if (sts != MFX_ERR_NONE) + return MFX_ERR_UNSUPPORTED; + it++; + } + + m_bNeedLowLatencyQuery = false; + return MFX_ERR_NONE; + } + } + UnloadSingleLibrary(libInfo); // failed - unload and move to next location + } + + // try loading MSDK from sysdir %windir%\system32 and %windir%\syswow64 + sts = LoadLibsFromSystemDir(LibTypeMSDK); + if (sts == MFX_ERR_NONE) { + LibInfo *libInfo = m_libInfoList.front(); + + sts = LoadSingleLibrary(libInfo); + if (sts == MFX_ERR_NONE) { + mfxU32 numFunctions = LoadAPIExports(libInfo, LibTypeMSDK); + + if (numFunctions == NumMSDKFunctions) { + mfxVariant var = {}; + var.Type = MFX_VARIANT_TYPE_PTR; + var.Data.Ptr = (mfxHDL) "mfxhw64"; + + auto it = m_configCtxList.begin(); + + while (it != m_configCtxList.end()) { + ConfigCtxVPL *config = (*it); + sts = config->SetFilterProperty((const mfxU8 *)"mfxImplDescription.ImplName", + var); + if (sts != MFX_ERR_NONE) + return MFX_ERR_UNSUPPORTED; + it++; + } + m_bNeedLowLatencyQuery = false; + return MFX_ERR_NONE; + } + } + UnloadSingleLibrary(libInfo); // failed - unload and move to next location + } + + return MFX_ERR_UNSUPPORTED; +#else + mfxStatus sts = MFX_ERR_NONE; + + // try loading VPL from Linux system directories + sts = LoadLibsFromMultipleDirs(LibTypeVPL); + if (sts == MFX_ERR_NONE) { + LibInfo *libInfo = m_libInfoList.back(); + + sts = LoadSingleLibrary(libInfo); + if (sts == MFX_ERR_NONE) { + LoadAPIExports(libInfo, LibTypeVPL); + m_bNeedLowLatencyQuery = false; + return MFX_ERR_NONE; + } + UnloadSingleLibrary(libInfo); // failed - unload and move to next location + } + + // try loading MSDK from Linux system directories + sts = LoadLibsFromMultipleDirs(LibTypeMSDK); + if (sts == MFX_ERR_NONE) { + LibInfo *libInfo = m_libInfoList.back(); + + sts = LoadSingleLibrary(libInfo); + if (sts == MFX_ERR_NONE) { + mfxU32 numFunctions = LoadAPIExports(libInfo, LibTypeMSDK); + + if (numFunctions == NumMSDKFunctions) { + mfxVariant var = {}; + var.Type = MFX_VARIANT_TYPE_PTR; + var.Data.Ptr = (mfxHDL) "mfxhw64"; + + auto it = m_configCtxList.begin(); + + while (it != m_configCtxList.end()) { + ConfigCtxVPL *config = (*it); + sts = config->SetFilterProperty((const mfxU8 *)"mfxImplDescription.ImplName", + var); + if (sts != MFX_ERR_NONE) + return MFX_ERR_UNSUPPORTED; + it++; + } + m_bNeedLowLatencyQuery = false; + return MFX_ERR_NONE; + } + } + UnloadSingleLibrary(libInfo); // failed - unload and move to next location + } + + return MFX_ERR_UNSUPPORTED; +#endif +} + +// try creating a session in order to get runtime API version +mfxStatus LoaderCtxVPL::QuerySessionLowLatency(LibInfo *libInfo, + mfxU32 adapterID, + mfxVersion *ver) { + mfxStatus sts; + mfxSession session = nullptr; + + mfxVersion reqVersion; + if (libInfo->libType == LibTypeVPL) { + reqVersion.Major = 2; + reqVersion.Minor = 0; + } + else { + reqVersion.Major = 1; + reqVersion.Minor = 0; + } + + // set acceleration mode + mfxInitializationParam vplParam = {}; + vplParam.AccelerationMode = m_specialConfig.accelerationMode; + + // set adapter ID for both MSDK and VPL + vplParam.VendorImplID = adapterID; + mfxIMPL hwImpl = msdkImplTabadapterID; + + mfxU16 deviceID; + sts = MFXInitEx2(reqVersion, + vplParam, + hwImpl, + &session, + &deviceID, + (CHAR_TYPE *)libInfo->libNameFull.c_str()); + + if (sts == MFX_ERR_NONE) { + sts = MFXQueryVersion(session, ver); + MFXClose(session); + } + + return sts; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_msdk.cpp
Added
@@ -0,0 +1,552 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include "vpl/mfx_dispatcher_vpl.h" + +#if defined(_WIN32) || defined(_WIN64) + #include "vpl/mfx_dispatcher_vpl_win.h" +#endif + +#ifdef __linux__ + #include <pthread.h> + #define strncpy_s(dst, size, src, cnt) strcpy((dst), (src)) // NOLINT +#endif + +// leave table formatting alone +// clang-format off + +static const mfxChar strImplNameMFX_IMPL_NAME_LEN = "mfxhw64"; +static const mfxChar strLicenseMFX_STRFIELD_LEN = ""; + +#if defined _M_IX86 +static const mfxChar strKeywordsMFX_STRFIELD_LEN = "MSDK,x86"; +#else +static const mfxChar strKeywordsMFX_STRFIELD_LEN = "MSDK,x64"; +#endif + +// also used in main loader routine +const mfxIMPL msdkImplTabMAX_NUM_IMPL_MSDK = { + MFX_IMPL_HARDWARE, + MFX_IMPL_HARDWARE2, + MFX_IMPL_HARDWARE3, + MFX_IMPL_HARDWARE4, +}; + +// not relevant for 1.x runtimes (no internal memory management) +#define NUM_POOL_POLICIES_MSDK 0 + +static const mfxPoolPolicyDescription PoolPolicies = { + { 0, 1 }, // struct Version + {}, // reserved + NUM_POOL_POLICIES_MSDK, // NumPoolPolicies + nullptr, +}; + +// 1.x function names should match list in enum eFunc +static const mfxChar* msdkImplFuncsNames = { + "MFXInit", + "MFXClose", + "MFXQueryIMPL", + "MFXQueryVersion", + "MFXJoinSession", + "MFXDisjoinSession", + "MFXCloneSession", + "MFXSetPriority", + "MFXGetPriority", + "MFXInitEx", + "MFXVideoCORE_SetFrameAllocator", + "MFXVideoCORE_SetHandle", + "MFXVideoCORE_GetHandle", + "MFXVideoCORE_SyncOperation", + "MFXVideoENCODE_Query", + "MFXVideoENCODE_QueryIOSurf", + "MFXVideoENCODE_Init", + "MFXVideoENCODE_Reset", + "MFXVideoENCODE_Close", + "MFXVideoENCODE_GetVideoParam", + "MFXVideoENCODE_GetEncodeStat", + "MFXVideoENCODE_EncodeFrameAsync", + "MFXVideoDECODE_Query", + "MFXVideoDECODE_DecodeHeader", + "MFXVideoDECODE_QueryIOSurf", + "MFXVideoDECODE_Init", + "MFXVideoDECODE_Reset", + "MFXVideoDECODE_Close", + "MFXVideoDECODE_GetVideoParam", + "MFXVideoDECODE_GetDecodeStat", + "MFXVideoDECODE_SetSkipMode", + "MFXVideoDECODE_GetPayload", + "MFXVideoDECODE_DecodeFrameAsync", + "MFXVideoVPP_Query", + "MFXVideoVPP_QueryIOSurf", + "MFXVideoVPP_Init", + "MFXVideoVPP_Reset", + "MFXVideoVPP_Close", + "MFXVideoVPP_GetVideoParam", + "MFXVideoVPP_GetVPPStat", + "MFXVideoVPP_RunFrameVPPAsync", + "MFXVideoCORE_QueryPlatform", +}; + +static const mfxImplementedFunctions msdkImplFuncs = { + sizeof(msdkImplFuncsNames) / sizeof(mfxChar*), + (mfxChar**)msdkImplFuncsNames +}; + +// end table formatting +// clang-format on + +LoaderCtxMSDK::LoaderCtxMSDK() + : m_msdkAdapter(), + m_msdkAdapterD3D9(), + m_deviceID(0), + m_luid(0), +#ifdef ONEVPL_EXPERIMENTAL + m_extDeviceID(), +#endif + m_libNameFull(), + m_id(), + m_accelMode(), + m_loaderDeviceID(0) { +} + +LoaderCtxMSDK::~LoaderCtxMSDK() {} + +mfxStatus LoaderCtxMSDK::OpenSession(mfxSession *session, + STRING_TYPE libNameFull, + mfxAccelerationMode accelMode, + mfxIMPL hwImpl) { + // require API 1.0 or later (both MFXInit and MFXInitEx supported) + mfxVersion reqVersion; + reqVersion.Major = MSDK_MIN_VERSION_MAJOR; + reqVersion.Minor = MSDK_MIN_VERSION_MINOR; + + // set acceleration mode - will be mapped to 1.x API + mfxInitializationParam vplParam = {}; + vplParam.AccelerationMode = accelMode; + + return MFXInitEx2(reqVersion, + vplParam, + hwImpl, + session, + &m_loaderDeviceID, + (CHAR_TYPE *)libNameFull.c_str()); +} + +// safe to call more than once (sets/checks for null session) +void LoaderCtxMSDK::CloseSession(mfxSession *session) { + if (*session) + MFXClose(*session); + + *session = nullptr; +} + +// map mfxIMPL (1.x) to mfxAccelerationMode (2.x) +mfxAccelerationMode LoaderCtxMSDK::CvtAccelType(mfxIMPL implType, mfxIMPL implMethod) { + if (implType == MFX_IMPL_HARDWARE) { + switch (implMethod) { + case MFX_IMPL_VIA_D3D9: + return MFX_ACCEL_MODE_VIA_D3D9; + case MFX_IMPL_VIA_D3D11: + return MFX_ACCEL_MODE_VIA_D3D11; + case MFX_IMPL_VIA_VAAPI: + return MFX_ACCEL_MODE_VIA_VAAPI; + } + } + + return MFX_ACCEL_MODE_NA; +} + +mfxStatus LoaderCtxMSDK::GetDefaultAccelType(mfxU32 adapterID, mfxIMPL *implDefault, mfxU64 *luid) { +#ifdef __linux__ + // VAAPI only + *implDefault = MFX_IMPL_VIA_VAAPI; + *luid = 0; + return MFX_ERR_NONE; +#else + // Windows - D3D11 only + mfxU32 VendorID = 0, DeviceID = 0; + mfxIMPL implTest; + mfxStatus sts; + + // check whether adapterID supports D3D11 and has correct VendorID + implTest = MFX_IMPL_VIA_D3D11; + sts = MFX::SelectImplementationType(adapterID, &implTest, &VendorID, &DeviceID, luid); + + if (sts != MFX_ERR_NONE || VendorID != 0x8086) { + implTest = MFX_IMPL_UNSUPPORTED; + return MFX_ERR_UNSUPPORTED; + } + + *implDefault = implTest; + + return MFX_ERR_NONE; +#endif +} + +mfxStatus LoaderCtxMSDK::QueryAPIVersion(STRING_TYPE libNameFull, mfxVersion *msdkVersion) { + mfxStatus sts; + mfxSession session = nullptr; + + mfxVersion reqVersion; + reqVersion.Major = MSDK_MIN_VERSION_MAJOR; + reqVersion.Minor = MSDK_MIN_VERSION_MINOR; + + // try creating a session with each adapter in order to get MSDK API version + // stop with first successful session creation + for (mfxU32 adapterID = 0; adapterID < MAX_NUM_IMPL_MSDK; adapterID++) { + // try HW session, default acceleration mode + mfxIMPL hwImpl = msdkImplTabadapterID; + mfxIMPL implDefault = MFX_IMPL_UNSUPPORTED; + mfxU64 luid; + + // if not a valid HW device, try next adapter + sts = GetDefaultAccelType(adapterID, &implDefault, &luid); + if (sts != MFX_ERR_NONE) + continue; + + // set acceleration mode - will be mapped to 1.x API + mfxInitializationParam vplParam = {}; + vplParam.AccelerationMode = + (mfxAccelerationMode)CvtAccelType(MFX_IMPL_HARDWARE, implDefault & 0xFF00); + + mfxU16 deviceID; + sts = MFXInitEx2(reqVersion, + vplParam, + hwImpl, + &session, + &deviceID, + (CHAR_TYPE *)libNameFull.c_str()); + + if (sts == MFX_ERR_NONE) { + sts = MFXQueryVersion(session, msdkVersion); + MFXClose(session); + + if (sts == MFX_ERR_NONE) + return sts; + } + } + + return MFX_ERR_UNSUPPORTED; +} + +mfxStatus LoaderCtxMSDK::QueryMSDKCaps(STRING_TYPE libNameFull, + mfxImplDescription **implDesc, + mfxImplementedFunctions **implFuncs, + mfxU32 adapterID, + bool bSkipD3D9Check) { +#ifdef DISABLE_MSDK_COMPAT + // disable support for legacy MSDK + return MFX_ERR_UNSUPPORTED; +#endif + + mfxStatus sts; + mfxSession session = nullptr; + + m_libNameFull = libNameFull; + m_deviceID = 0; + +#ifdef __linux__ + // require pthreads to be linked in for MSDK RT to load + pthread_key_t pkey; + if (pthread_key_create(&pkey, NULL) == 0) { + pthread_key_delete(pkey); + } + + mfxU32 vendorID = 0; + mfxU16 deviceID = 0; + sts = GetRenderNodeDescription(adapterID, vendorID, deviceID); + if (sts != MFX_ERR_NONE) + return MFX_ERR_UNSUPPORTED; + + // on Linux read deviceID from the render node path + m_deviceID = deviceID; +#endif + + // try HW session, default acceleration mode + mfxIMPL hwImpl = msdkImplTabadapterID; + mfxIMPL implDefault = MFX_IMPL_UNSUPPORTED; + + sts = GetDefaultAccelType(adapterID, &implDefault, &m_luid); + if (sts != MFX_ERR_NONE) + return MFX_ERR_UNSUPPORTED; + + sts = OpenSession(&session, + m_libNameFull, + (mfxAccelerationMode)CvtAccelType(MFX_IMPL_HARDWARE, implDefault & 0xFF00), + hwImpl); + + // adapter unsupported + if (sts != MFX_ERR_NONE) + return MFX_ERR_UNSUPPORTED; + + // return list of implemented functions + *implFuncs = (mfxImplementedFunctions *)(&msdkImplFuncs); + + // clear new 2.0 style description struct + memset(&m_id, 0, sizeof(mfxImplDescription)); + *implDesc = &m_id; + + // fill in top-level capabilities + m_id.Version.Version = MFX_IMPLDESCRIPTION_VERSION; + m_id.Impl = MFX_IMPL_TYPE_HARDWARE; + + // query API version + sts = MFXQueryVersion(session, &m_id.ApiVersion); + if (sts != MFX_ERR_NONE) { + CloseSession(&session); + return sts; + } + + // set default acceleration mode + m_id.AccelerationMode = CvtAccelType(MFX_IMPL_HARDWARE, implDefault & 0xFF00); + + // fill in acceleration description struct + mfxAccelerationModeDescription *accelDesc = &(m_id.AccelerationModeDescription); + accelDesc->Version.Version = MFX_ACCELERATIONMODESCRIPTION_VERSION; + + // fill in mode description with just the single (default) mode + accelDesc->NumAccelerationModes = 1; + accelDesc->Mode = m_accelMode; + accelDesc->Mode0 = m_id.AccelerationMode; + + // return HW accelerator - required by MFXCreateSession + m_msdkAdapter = hwImpl; + + // map MFX HW number to VendorImplID + m_id.VendorImplID = 0; + switch (hwImpl) { + case MFX_IMPL_HARDWARE: + m_id.VendorImplID = 0; + break; + case MFX_IMPL_HARDWARE2: + m_id.VendorImplID = 1; + break; + case MFX_IMPL_HARDWARE3: + m_id.VendorImplID = 2; + break; + case MFX_IMPL_HARDWARE4: + m_id.VendorImplID = 3; + break; + } + + // fill in strings + strncpy_s(m_id.ImplName, sizeof(m_id.ImplName), strImplName, sizeof(strImplName)); + strncpy_s(m_id.License, sizeof(m_id.License), strLicense, sizeof(strLicense)); + strncpy_s(m_id.Keywords, sizeof(m_id.Keywords), strKeywords, sizeof(strKeywords)); + + m_id.VendorID = 0x8086; + m_id.NumExtParam = 0; + + // fill in pool policies + m_id.PoolPolicies = PoolPolicies; + + // fill in device description + mfxDeviceDescription *Dev = &(m_id.Dev); + memset(Dev, 0, sizeof(mfxDeviceDescription)); // initially empty + Dev->MediaAdapterType = MFX_MEDIA_UNKNOWN; + + // query for underlying deviceID (requires API >= 1.19) + // for Linux, we may already have the deviceID from parsing render node path earlier + if (m_deviceID == 0) { + if (IsVersionSupported(MAKE_MFX_VERSION(1, 19), m_id.ApiVersion)) { + mfxPlatform platform = {}; + + sts = MFXVideoCORE_QueryPlatform(session, &platform); + if (sts == MFX_ERR_NONE) + m_deviceID = platform.DeviceId; + + // mfxPlatform::MediaAdapterType was added in API 1.31 + if (IsVersionSupported(MAKE_MFX_VERSION(1, 31), m_id.ApiVersion)) { + Dev->MediaAdapterType = platform.MediaAdapterType; + } + } + } + + // if QueryPlatform did not return deviceID, we may have received + // it from the loader (MFXInitEx2) + if (m_deviceID == 0) + m_deviceID = m_loaderDeviceID; + + // store DeviceID as "DevID" (hex) / "AdapterIdx" (dec) to match GPU RT + Dev->Version.Version = MFX_DEVICEDESCRIPTION_VERSION; + snprintf(Dev->DeviceID, sizeof(Dev->DeviceID), "%x/%d", m_deviceID, m_id.VendorImplID); + Dev->NumSubDevices = 0; + + CloseSession(&session); + +#if defined(_WIN32) || defined(_WIN64) + if (bSkipD3D9Check == false) { + mfxIMPL implD3D9; + m_msdkAdapterD3D9 = MFX_IMPL_UNSUPPORTED; + + sts = CheckD3D9Support(m_luid, libNameFull, &implD3D9); + if (sts == MFX_ERR_NONE) { + m_msdkAdapterD3D9 = implD3D9; + + accelDesc->ModeaccelDesc->NumAccelerationModes = MFX_ACCEL_MODE_VIA_D3D9; + accelDesc->NumAccelerationModes++; + } + } +#endif + + return MFX_ERR_NONE; +} + +mfxStatus LoaderCtxMSDK::CheckD3D9Support(mfxU64 luid, STRING_TYPE libNameFull, mfxIMPL *implD3D9) { +#if defined(_WIN32) || defined(_WIN64) + mfxU32 VendorID = 0, DeviceID = 0; + mfxIMPL implTest = MFX_IMPL_VIA_D3D9; + + mfxStatus sts; + mfxSession session = nullptr; + + mfxVersion reqVersion; + reqVersion.Major = MSDK_MIN_VERSION_MAJOR; + reqVersion.Minor = MSDK_MIN_VERSION_MINOR; + + *implD3D9 = MFX_IMPL_UNSUPPORTED; + + mfxU32 idx; + for (idx = 0; idx < MAX_NUM_IMPL_MSDK; idx++) { + mfxU64 luidD3D9 = 0; + sts = MFX::SelectImplementationType(idx, &implTest, &VendorID, &DeviceID, &luidD3D9); + + if (sts != MFX_ERR_NONE || VendorID != 0x8086 || luid != luidD3D9) + continue; + + // matching LUID - try creating a D3D9 session + mfxInitializationParam vplParam = {}; + vplParam.AccelerationMode = MFX_ACCEL_MODE_VIA_D3D9; + + mfxU16 deviceID; + sts = MFXInitEx2(reqVersion, + vplParam, + msdkImplTabidx, + &session, + &deviceID, + (CHAR_TYPE *)libNameFull.c_str()); + + if (sts == MFX_ERR_NONE) { + *implD3D9 = msdkImplTabidx; + MFXClose(session); + return MFX_ERR_NONE; + } + + break; // D3D9 not supported + } + + // this adapter (input luid) does not support D3D9 + return MFX_ERR_UNSUPPORTED; +#else + return MFX_ERR_UNSUPPORTED; +#endif +} + +mfxStatus LoaderCtxMSDK::GetRenderNodeDescription(mfxU32 adapterID, + mfxU32 &vendorID, + mfxU16 &deviceID) { + vendorID = 0; + deviceID = 0; + +#if defined(__linux__) + mfxU32 DRMRenderNodeNum = 128 + adapterID; + std::string nodeStr = std::to_string(DRMRenderNodeNum); + + std::string vendorPath = "/sys/class/drm/renderD" + nodeStr + "/device/vendor"; + std::string devPath = "/sys/class/drm/renderD" + nodeStr + "/device/device"; + + // check if vendor == 0x8086 + FILE *vendorFile = fopen(vendorPath.c_str(), "r"); + if (vendorFile) { + unsigned int u32 = 0; + int nRead = fscanf(vendorFile, "%x", &u32); + if (nRead == 1) + vendorID = (mfxU32)u32; + fclose(vendorFile); + } + + if (vendorID != 0x8086) + return MFX_ERR_UNSUPPORTED; + + // get deviceID for this node + FILE *devFile = fopen(devPath.c_str(), "r"); + if (devFile) { + unsigned int u32 = 0; + int nRead = fscanf(devFile, "%x", &u32); + if (nRead == 1) + deviceID = (mfxU32)u32; + fclose(devFile); + } + + if (deviceID == 0) + return MFX_ERR_UNSUPPORTED; + + return MFX_ERR_NONE; +#else + return MFX_ERR_UNSUPPORTED; +#endif +} + +// avoid confusing #ifdef indentation +// clang-format off + +#ifdef ONEVPL_EXPERIMENTAL + +mfxStatus LoaderCtxMSDK::QueryExtDeviceID(mfxExtendedDeviceId *extDeviceID, + mfxU32 adapterID, + mfxU16 deviceID, + mfxU64 luid) { + // fill extended device ID struct (API >= 2.6) + memset(extDeviceID, 0, sizeof(mfxExtendedDeviceId)); + + // common properties + extDeviceID->Version.Version = MFX_EXTENDEDDEVICEID_VERSION; + extDeviceID->VendorID = 0x8086; + extDeviceID->DeviceID = deviceID; + + // default - no PCI info + // additional dependencies required to obtain these props + extDeviceID->PCIDomain = 0xFFFFFFFF; + extDeviceID->PCIBus = 0xFFFFFFFF; + extDeviceID->PCIDevice = 0xFFFFFFFF; + extDeviceID->PCIFunction = 0xFFFFFFFF; + + // default - no LUID + extDeviceID->LUIDDeviceNodeMask = 0; + extDeviceID->LUIDValid = 0; + for (mfxU32 idx = 0; idx < 8; idx++) + extDeviceID->DeviceLUIDidx = 0; + + // default - no DRM node + extDeviceID->DRMRenderNodeNum = 0; + extDeviceID->DRMPrimaryNodeNum = 0x7FFFFFFF; + + snprintf(extDeviceID->DeviceName, sizeof(extDeviceID->DeviceName), "%s", strImplName); + +#if defined(_WIN32) || defined(_WIN64) + // fill in Windows-specific properties + if (luid) { + extDeviceID->LUIDDeviceNodeMask = 1; + extDeviceID->LUIDValid = 1; + + // map 64-bit LUID into mfxU88 + mfxU64 luidArr = luid; + for (mfxU32 idx = 0; idx < 8; idx++) { + extDeviceID->DeviceLUIDidx = mfxU8((luidArr)&0xFF); + luidArr >>= 8; + } + } +#elif defined(__linux__) + extDeviceID->DRMPrimaryNodeNum = adapterID; + extDeviceID->DRMRenderNodeNum = 128 + adapterID; +#endif + + return MFX_ERR_NONE; +} +#endif // ONEVPL_EXPERIMENTAL + +// clang-format on
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/vpl/mfx_dispatcher_vpl_win.h
Added
@@ -0,0 +1,19 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_VPL_MFX_DISPATCHER_VPL_WIN_H_ +#define DISPATCHER_VPL_MFX_DISPATCHER_VPL_WIN_H_ + +// headers for Windows legacy dispatcher +#if defined(_WIN32) || defined(_WIN64) + #include "windows/mfx_dispatcher.h" + #include "windows/mfx_dispatcher_defs.h" + #include "windows/mfx_dxva2_device.h" + #include "windows/mfx_library_iterator.h" + #include "windows/mfx_load_dll.h" +#endif + +#endif // DISPATCHER_VPL_MFX_DISPATCHER_VPL_WIN_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/libmfx.def
Added
@@ -0,0 +1,76 @@ +EXPORTS + MFXInit + MFXClose + MFXQueryIMPL + MFXQueryVersion + + MFXJoinSession + MFXDisjoinSession + MFXCloneSession + MFXSetPriority + MFXGetPriority + + MFXVideoCORE_SetFrameAllocator + MFXVideoCORE_SetHandle + MFXVideoCORE_GetHandle + MFXVideoCORE_QueryPlatform + MFXVideoCORE_SyncOperation + + MFXVideoENCODE_Query + MFXVideoENCODE_QueryIOSurf + MFXVideoENCODE_Init + MFXVideoENCODE_Reset + MFXVideoENCODE_Close + MFXVideoENCODE_GetVideoParam + MFXVideoENCODE_GetEncodeStat + MFXVideoENCODE_EncodeFrameAsync + + MFXVideoDECODE_Query + MFXVideoDECODE_DecodeHeader + MFXVideoDECODE_QueryIOSurf + MFXVideoDECODE_Init + MFXVideoDECODE_Reset + MFXVideoDECODE_Close + MFXVideoDECODE_GetVideoParam + MFXVideoDECODE_GetDecodeStat + MFXVideoDECODE_SetSkipMode + MFXVideoDECODE_GetPayload + MFXVideoDECODE_DecodeFrameAsync + + MFXVideoVPP_Query + MFXVideoVPP_QueryIOSurf + MFXVideoVPP_Init + MFXVideoVPP_Reset + MFXVideoVPP_Close + + MFXVideoVPP_GetVideoParam + MFXVideoVPP_GetVPPStat + MFXVideoVPP_RunFrameVPPAsync + + MFXInitEx + + MFXQueryAdapters + MFXQueryAdaptersNumber + MFXQueryAdaptersDecode + + MFXLoad + MFXUnload + MFXCreateConfig + MFXSetConfigFilterProperty + MFXEnumImplementations + MFXCreateSession + MFXDispReleaseImplDescription + + MFXMemory_GetSurfaceForVPP + MFXMemory_GetSurfaceForEncode + MFXMemory_GetSurfaceForDecode + + MFXMemory_GetSurfaceForVPPOut + MFXVideoDECODE_VPP_Init + MFXVideoDECODE_VPP_DecodeFrameAsync + MFXVideoDECODE_VPP_Reset + MFXVideoDECODE_VPP_GetChannelParam + MFXVideoDECODE_VPP_Close + MFXVideoVPP_ProcessFrameAsync + +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/main.cpp
Added
@@ -0,0 +1,1173 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include <windows.h> + +#include <stringapiset.h> + +#include <memory> +#include <new> + +#include "windows/mfx_critical_section.h" +#include "windows/mfx_dispatcher.h" +#include "windows/mfx_dispatcher_log.h" +#include "windows/mfx_library_iterator.h" +#include "windows/mfx_load_dll.h" + +#include "windows/mfx_vector.h" + +#if defined(MEDIASDK_UWP_DISPATCHER) + #include "windows/mfx_driver_store_loader.h" +#endif + +#include <string.h> /* for memset on Linux */ + +#include <stdlib.h> /* for qsort on Linux */ + +// module-local definitions +namespace { + +const struct { + // instance implementation type + eMfxImplType implType; + // real implementation + mfxIMPL impl; + // adapter numbers + mfxU32 adapterID; + +} implTypes = { + // MFX_IMPL_AUTO case + { MFX_LIB_HARDWARE, MFX_IMPL_HARDWARE, 0 }, + { MFX_LIB_SOFTWARE, MFX_IMPL_SOFTWARE, 0 }, + + // MFX_IMPL_ANY case + { MFX_LIB_HARDWARE, MFX_IMPL_HARDWARE, 0 }, + { MFX_LIB_HARDWARE, MFX_IMPL_HARDWARE2, 1 }, + { MFX_LIB_HARDWARE, MFX_IMPL_HARDWARE3, 2 }, + { MFX_LIB_HARDWARE, MFX_IMPL_HARDWARE4, 3 }, + { MFX_LIB_SOFTWARE, MFX_IMPL_SOFTWARE, 0 }, + { MFX_LIB_SOFTWARE, MFX_IMPL_SOFTWARE, 0 }, // unused - was MFX_IMPL_AUDIO +}; + +const struct { + // start index in implTypes table for specified implementation + mfxU32 minIndex; + // last index in implTypes table for specified implementation + mfxU32 maxIndex; + +} implTypesRange = { + { 0, 1 }, // MFX_IMPL_AUTO + { 1, 1 }, // MFX_IMPL_SOFTWARE + { 0, 0 }, // MFX_IMPL_HARDWARE + { 2, 6 }, // MFX_IMPL_AUTO_ANY + { 2, 5 }, // MFX_IMPL_HARDWARE_ANY + { 3, 3 }, // MFX_IMPL_HARDWARE2 + { 4, 4 }, // MFX_IMPL_HARDWARE3 + { 5, 5 }, // MFX_IMPL_HARDWARE4 + { 2, 6 }, // MFX_IMPL_RUNTIME, same as MFX_IMPL_HARDWARE_ANY +}; + +MFX::mfxCriticalSection dispGuard = 0; + +} // namespace + +using namespace MFX; + +#if !defined(MEDIASDK_UWP_DISPATCHER) + +// +// Implement DLL exposed functions. MFXInit and MFXClose have to do +// slightly more than other. They require to be implemented explicitly. +// All other functions are implemented implicitly. +// + +typedef MFXVector<MFX_DISP_HANDLE_EX *> HandleVector; +typedef MFXVector<mfxStatus> StatusVector; + +struct VectorHandleGuard { + explicit VectorHandleGuard(HandleVector &aVector) : m_vector(aVector) {} + ~VectorHandleGuard() { + HandleVector::iterator it = m_vector.begin(), et = m_vector.end(); + for (; it != et; ++it) { + delete *it; + } + } + + HandleVector &m_vector; + +private: + void operator=(const VectorHandleGuard &); +}; + +static int HandleSort(const void *plhs, const void *prhs) { + const MFX_DISP_HANDLE_EX *lhs = *(const MFX_DISP_HANDLE_EX **)plhs; + const MFX_DISP_HANDLE_EX *rhs = *(const MFX_DISP_HANDLE_EX **)prhs; + const mfxVersion vplInitVersion = { 255, 1 }; + + // prefer oneVPL runtime (API = 1.255) + if ((lhs->actualApiVersion.Version == vplInitVersion.Version) && + (rhs->actualApiVersion < lhs->actualApiVersion)) { + return -1; + } + if ((rhs->actualApiVersion.Version == vplInitVersion.Version) && + (lhs->actualApiVersion < rhs->actualApiVersion)) { + return 1; + } + + // prefer HW implementation + if (lhs->implType != MFX_LIB_HARDWARE && rhs->implType == MFX_LIB_HARDWARE) { + return 1; + } + if (lhs->implType == MFX_LIB_HARDWARE && rhs->implType != MFX_LIB_HARDWARE) { + return -1; + } + + // prefer integrated GPU + if (lhs->mediaAdapterType != MFX_MEDIA_INTEGRATED && + rhs->mediaAdapterType == MFX_MEDIA_INTEGRATED) { + return 1; + } + if (lhs->mediaAdapterType == MFX_MEDIA_INTEGRATED && + rhs->mediaAdapterType != MFX_MEDIA_INTEGRATED) { + return -1; + } + + // prefer dll with lower API version + if (lhs->actualApiVersion < rhs->actualApiVersion) { + return -1; + } + if (rhs->actualApiVersion < lhs->actualApiVersion) { + return 1; + } + + // if versions are equal prefer library with HW + if (lhs->loadStatus == MFX_WRN_PARTIAL_ACCELERATION && rhs->loadStatus == MFX_ERR_NONE) { + return 1; + } + if (lhs->loadStatus == MFX_ERR_NONE && rhs->loadStatus == MFX_WRN_PARTIAL_ACCELERATION) { + return -1; + } + + return 0; +} + +mfxStatus MFXInitEx(mfxInitParam par, mfxSession *session) { + MFX::MFXAutomaticCriticalSection guard(&dispGuard); + + DISPATCHER_LOG_BLOCK(("MFXInitEx (impl=%s, pVer=%d.%d, ExternalThreads=%d session=0x%p\n", + DispatcherLog_GetMFXImplString(par.Implementation).c_str(), + par.Version.Major, + par.Version.Minor, + par.ExternalThreads, + session)); + + mfxStatus mfxRes = MFX_ERR_UNSUPPORTED; + HandleVector allocatedHandle; + VectorHandleGuard handleGuard(allocatedHandle); + + MFX_DISP_HANDLE_EX *pHandle; + wchar_t dllNameMFX_MAX_DLL_PATH = { 0 }; + MFX::MFXLibraryIterator libIterator; + + // there iterators are used only if the caller specified implicit type like AUTO + mfxU32 curImplIdx, maxImplIdx; + // implementation method masked from the input parameter + // special case for audio library + const mfxIMPL implMethod = par.Implementation & (MFX_IMPL_VIA_ANY - 1); + + // implementation interface masked from the input parameter + mfxIMPL implInterface = par.Implementation & -MFX_IMPL_VIA_ANY; + mfxIMPL implInterfaceOrig = implInterface; + mfxVersion requiredVersion = { { MFX_VERSION_MINOR, MFX_VERSION_MAJOR } }; + + mfxInitializationParam vplParam = {}; + if (implMethod == MFX_IMPL_SOFTWARE) { + vplParam.AccelerationMode = MFX_ACCEL_MODE_NA; + } + else { + // hardware - D3D11 by default + if (implInterface == MFX_IMPL_VIA_D3D9) + vplParam.AccelerationMode = MFX_ACCEL_MODE_VIA_D3D9; + else + vplParam.AccelerationMode = MFX_ACCEL_MODE_VIA_D3D11; + } + + // check error(s) + if (NULL == session) { + return MFX_ERR_NULL_PTR; + } + + if (((MFX_IMPL_AUTO > implMethod) || (MFX_IMPL_RUNTIME < implMethod))) { + return MFX_ERR_UNSUPPORTED; + } + + // set the minimal required version + requiredVersion = par.Version; + + try { + // reset the session value + *session = 0; + + // allocate the dispatching handle and call-table + pHandle = new MFX_DISP_HANDLE_EX(requiredVersion); + } + catch (...) { + return MFX_ERR_MEMORY_ALLOC; + } + + DISPATCHER_LOG_INFO( + (("Required API version is %u.%u\n"), requiredVersion.Major, requiredVersion.Minor)); + // particular implementation value + mfxIMPL curImpl; + + // Load HW library or RT from system location + curImplIdx = implTypesRangeimplMethod.minIndex; + maxImplIdx = implTypesRangeimplMethod.maxIndex; + do { + int currentStorage = MFX::MFX_STORAGE_ID_FIRST; + implInterface = implInterfaceOrig; + do { + // this storage will be checked below + if (currentStorage == MFX::MFX_APP_FOLDER) { + currentStorage += 1; + continue; + } + + // initialize the library iterator + mfxRes = libIterator.Init(implTypescurImplIdx.implType, + implInterface, + implTypescurImplIdx.adapterID, + currentStorage); + + // look through the list of installed SDK version, + // looking for a suitable library with higher merit value. + if (MFX_ERR_NONE == mfxRes) { + if (MFX_LIB_HARDWARE == implTypescurImplIdx.implType && + (!implInterface || MFX_IMPL_VIA_ANY == implInterface)) { + implInterface = libIterator.GetImplementationType(); + } + + do { + eMfxImplType implType = implTypescurImplIdx.implType; + + // select a desired DLL + mfxRes = libIterator.SelectDLLVersion(dllName, + sizeof(dllName) / sizeof(dllName0), + &implType, + pHandle->apiVersion); + if (MFX_ERR_NONE != mfxRes) { + break; + } + DISPATCHER_LOG_INFO((("loading library %S\n"), dllName)); + // try to load the selected DLL + curImpl = implTypescurImplIdx.impl; + mfxRes = pHandle->LoadSelectedDLL(dllName, + implType, + curImpl, + implInterface, + par, + vplParam); + // unload the failed DLL + if (MFX_ERR_NONE != mfxRes) { + pHandle->Close(); + continue; + } + + mfxPlatform platform = { MFX_PLATFORM_UNKNOWN, 0, MFX_MEDIA_UNKNOWN }; + if (pHandle->callTableeMFXVideoCORE_QueryPlatform) { + mfxRes = MFXVideoCORE_QueryPlatform((mfxSession)pHandle, &platform); + if (MFX_ERR_NONE != mfxRes) { + DISPATCHER_LOG_WRN( + ("MFXVideoCORE_QueryPlatform failed, rejecting loaded library\n")); + pHandle->Close(); + continue; + } + } + pHandle->mediaAdapterType = platform.MediaAdapterType; + DISPATCHER_LOG_INFO( + (("media adapter type is %d\n"), pHandle->mediaAdapterType)); + + libIterator.GetSubKeyName( + pHandle->subkeyName, + sizeof(pHandle->subkeyName) / sizeof(pHandle->subkeyName0)); + pHandle->storageID = libIterator.GetStorageID(); + allocatedHandle.push_back(pHandle); + pHandle = new MFX_DISP_HANDLE_EX(requiredVersion); + } while (MFX_ERR_NONE != mfxRes); + } + + // select another place for loading engine + currentStorage += 1; + + } while ((MFX_ERR_NONE != mfxRes) && (MFX::MFX_STORAGE_ID_LAST >= currentStorage)); + + } while ((MFX_ERR_NONE != mfxRes) && (++curImplIdx <= maxImplIdx)); + + curImplIdx = implTypesRangeimplMethod.minIndex; + maxImplIdx = implTypesRangeimplMethod.maxIndex; + + // Load RT from app folder (libmfxsw64 with API >= 1.10) + do { + implInterface = implInterfaceOrig; + // initialize the library iterator + mfxRes = libIterator.Init(implTypescurImplIdx.implType, + implInterface, + implTypescurImplIdx.adapterID, + MFX::MFX_APP_FOLDER); + + if (MFX_ERR_NONE == mfxRes) { + if (MFX_LIB_HARDWARE == implTypescurImplIdx.implType && + (!implInterface || MFX_IMPL_VIA_ANY == implInterface)) { + implInterface = libIterator.GetImplementationType(); + } + + do { + eMfxImplType implType; + + // select a desired DLL + mfxRes = libIterator.SelectDLLVersion(dllName, + sizeof(dllName) / sizeof(dllName0), + &implType, + pHandle->apiVersion); + if (MFX_ERR_NONE != mfxRes) { + break; + } + DISPATCHER_LOG_INFO((("loading library %S\n"), dllName)); + + // try to load the selected DLL + curImpl = implTypescurImplIdx.impl; + mfxRes = pHandle->LoadSelectedDLL(dllName, + implType, + curImpl, + implInterface, + par, + vplParam); + // unload the failed DLL + if (MFX_ERR_NONE != mfxRes) { + pHandle->Close(); + } + else { + if (pHandle->actualApiVersion.Major == 1 && + pHandle->actualApiVersion.Minor <= 9) { + // this is not RT, skip it + mfxRes = MFX_ERR_ABORTED; + break; + } + pHandle->storageID = MFX::MFX_UNKNOWN_KEY; + allocatedHandle.push_back(pHandle); + pHandle = new MFX_DISP_HANDLE_EX(requiredVersion); + } + + } while (MFX_ERR_NONE != mfxRes); + } + } while ((MFX_ERR_NONE != mfxRes) && (++curImplIdx <= maxImplIdx)); + + // Load HW and SW libraries using legacy default DLL search mechanism + // set current library index again + curImplIdx = implTypesRangeimplMethod.minIndex; + do { + implInterface = implInterfaceOrig; + + mfxRes = MFX::mfx_get_default_dll_name(dllName, + sizeof(dllName) / sizeof(dllName0), + implTypescurImplIdx.implType); + + if (MFX_ERR_NONE == mfxRes) { + DISPATCHER_LOG_INFO((("loading default library %S\n"), dllName)) + + // try to load the selected DLL using default DLL search mechanism + if (MFX_LIB_HARDWARE == implTypescurImplIdx.implType) { + if (!implInterface) { + implInterface = MFX_IMPL_VIA_ANY; + } + mfxU32 curVendorID = 0, curDeviceID = 0; + mfxRes = MFX::SelectImplementationType(implTypescurImplIdx.adapterID, + &implInterface, + &curVendorID, + &curDeviceID); + if (curVendorID != INTEL_VENDOR_ID) + mfxRes = MFX_ERR_UNKNOWN; + } + if (MFX_ERR_NONE == mfxRes) { + // try to load the selected DLL using default DLL search mechanism + mfxRes = pHandle->LoadSelectedDLL(dllName, + implTypescurImplIdx.implType, + implTypescurImplIdx.impl, + implInterface, + par, + vplParam); + } + // unload the failed DLL + if ((MFX_ERR_NONE != mfxRes) && (MFX_WRN_PARTIAL_ACCELERATION != mfxRes)) { + pHandle->Close(); + } + else { + pHandle->storageID = MFX::MFX_UNKNOWN_KEY; + allocatedHandle.push_back(pHandle); + pHandle = new MFX_DISP_HANDLE_EX(requiredVersion); + } + } + } while ((MFX_ERR_NONE > mfxRes) && (++curImplIdx <= maxImplIdx)); + delete pHandle; + + if (allocatedHandle.size() == 0) + return MFX_ERR_UNSUPPORTED; + + { // sort candidate list + bool NeedSort = false; + HandleVector::iterator first = allocatedHandle.begin(), it = allocatedHandle.begin(), + et = allocatedHandle.end(); + for (it++; it != et; ++it) + if (HandleSort(&(*first), &(*it)) != 0) + NeedSort = true; + + // sort allocatedHandle so that the most preferred dll is at the beginning + if (NeedSort) + qsort(&(*allocatedHandle.begin()), + allocatedHandle.size(), + sizeof(MFX_DISP_HANDLE_EX *), + &HandleSort); + } + HandleVector::iterator candidate = allocatedHandle.begin(); + // check the final result of loading + try { + pHandle = *candidate; + //pulling up current mediasdk version, that required to match plugin version + //block for now to avoid KW scanning failure (UNUSED) + //mfxVersion apiVerActual = { { 0, 0 } }; + //mfxStatus stsQueryVersion = + // MFXQueryVersion((mfxSession)pHandle, &apiVerActual); + } + catch (...) { + DISPATCHER_LOG_ERROR((("unknown exception while loading plugins\n"))) + } + + // everything is OK. Save pointers to the output variable + *candidate = 0; // keep this one safe from guard destructor + + //=================================== + + // MFXVideoCORE_QueryPlatform call creates d3d device handle, so we have handle right after MFXInit and can't accept external handle + // This is a workaround which calls close-init to remove that handle + + mfxFunctionPointer *actualTable = pHandle->callTable; + mfxFunctionPointer pFunc; + + pFunc = actualTableeMFXClose; + mfxRes = (*(mfxStatus(MFX_CDECL *)(mfxSession))pFunc)(pHandle->session); + if (mfxRes != MFX_ERR_NONE) + return mfxRes; + + pHandle->session = 0; + bool callOldInit = !actualTableeMFXInitEx; + pFunc = actualTable(callOldInit) ? eMFXInit : eMFXInitEx; + + mfxVersion version(pHandle->apiVersion); + if (callOldInit) { + pHandle->loadStatus = (*(mfxStatus(MFX_CDECL *)(mfxIMPL, mfxVersion *, mfxSession *))pFunc)( + pHandle->impl | pHandle->implInterface, + &version, + &pHandle->session); + } + else { + mfxInitParam initPar = par; + initPar.Implementation = pHandle->impl | pHandle->implInterface; + initPar.Version = version; + pHandle->loadStatus = + (*(mfxStatus(MFX_CDECL *)(mfxInitParam, mfxSession *))pFunc)(initPar, + &pHandle->session); + } + + //=================================== + + *((MFX_DISP_HANDLE_EX **)session) = pHandle; + + return pHandle->loadStatus; + +} // mfxStatus MFXInitEx(mfxIMPL impl, mfxVersion *ver, mfxSession *session) + +// internal function - load a specific DLL, return unsupported if it fails +// vplParam is required for API >= 2.0 (load via MFXInitialize) +mfxStatus MFXInitEx2(mfxVersion version, + mfxInitializationParam vplParam, + mfxIMPL hwImpl, + mfxSession *session, + mfxU16 *deviceID, + wchar_t *dllName) { + MFX::MFXAutomaticCriticalSection guard(&dispGuard); + + mfxStatus mfxRes = MFX_ERR_NONE; + HandleVector allocatedHandle; + VectorHandleGuard handleGuard(allocatedHandle); + + MFX_DISP_HANDLE *pHandle; + + *deviceID = 0; + + // fill minimal 1.x parameters for LoadSelectedDLL to choose correct initialization path + mfxInitParam par = {}; + par.Version = version; + + // select first adapter if not specified + // only relevant for MSDK-via-MFXLoad path + if (!hwImpl) + hwImpl = MFX_IMPL_HARDWARE; + + switch (vplParam.AccelerationMode) { + case MFX_ACCEL_MODE_NA: + par.Implementation = MFX_IMPL_SOFTWARE; + break; + case MFX_ACCEL_MODE_VIA_D3D9: + par.Implementation = hwImpl | MFX_IMPL_VIA_D3D9; + break; + case MFX_ACCEL_MODE_VIA_D3D11: + par.Implementation = hwImpl | MFX_IMPL_VIA_D3D11; + break; + case MFX_ACCEL_MODE_VIA_VAAPI: + par.Implementation = hwImpl | MFX_IMPL_VIA_VAAPI; + break; + default: + par.Implementation = hwImpl; + break; + } + + #ifdef ONEVPL_EXPERIMENTAL + // if GPUCopy is enabled via MFXSetConfigProperty(DeviceCopy), set corresponding + // flag in mfxInitParam for legacy RTs + par.GPUCopy = vplParam.DeviceCopy; + #endif + + // also pass extBuf array (if any) to MFXInitEx for 1.x API + par.NumExtParam = vplParam.NumExtParam; + par.ExtParam = (vplParam.NumExtParam ? vplParam.ExtParam : nullptr); + + eMfxImplType implType = + (par.Implementation == MFX_IMPL_SOFTWARE ? MFX_LIB_SOFTWARE : MFX_LIB_HARDWARE); + mfxIMPL implInterface = par.Implementation & -MFX_IMPL_VIA_ANY; + const mfxIMPL implMethod = par.Implementation & (MFX_IMPL_VIA_ANY - 1); + + // check error(s) + if (NULL == session || NULL == dllName) { + return MFX_ERR_NULL_PTR; + } + + try { + // reset the session value + *session = 0; + + // allocate the dispatching handle and call-table + pHandle = new MFX_DISP_HANDLE(par.Version); + } + catch (...) { + return MFX_ERR_MEMORY_ALLOC; + } + + if (MFX_ERR_NONE == mfxRes) { + DISPATCHER_LOG_INFO((("loading default library %S\n"), dllName)) + + if (MFX_ERR_NONE == mfxRes) { + // try to load the selected DLL using given DLL name + mfxRes = pHandle->LoadSelectedDLL(dllName, + implType, + implMethod, + implInterface, + par, + vplParam); + } + // unload the failed DLL + if (MFX_ERR_NONE != mfxRes) { + pHandle->Close(); + delete pHandle; + return MFX_ERR_UNSUPPORTED; + } + else { + pHandle->storageID = MFX::MFX_UNKNOWN_KEY; + } + } + + // everything is OK. Save pointers to the output variable + *((MFX_DISP_HANDLE **)session) = pHandle; + + return pHandle->loadStatus; +} + +mfxStatus MFXClose(mfxSession session) { + MFX::MFXAutomaticCriticalSection guard(&dispGuard); + + mfxStatus mfxRes = MFX_ERR_INVALID_HANDLE; + MFX_DISP_HANDLE *pHandle = (MFX_DISP_HANDLE *)session; + + // check error(s) + if (pHandle) { + try { + // unload the DLL library + mfxRes = pHandle->Close(); + + // it is possible, that there is an active child session. + // can't unload library in that case. + if (MFX_ERR_UNDEFINED_BEHAVIOR != mfxRes) { + // release the handle + delete pHandle; + } + } + catch (...) { + mfxRes = MFX_ERR_INVALID_HANDLE; + } + } + + return mfxRes; + +} // mfxStatus MFXClose(mfxSession session) + +#else // relates to !defined (MEDIASDK_UWP_DISPATCHER), i.e. #else part as if MEDIASDK_UWP_DISPATCHER defined + +static mfxModuleHandle hModule; + +// for the UWP_DISPATCHER purposes implementation of MFXinitEx is calling +// InitialiseMediaSession() implemented in intel_gfx_api.dll +mfxStatus MFXInitEx(mfxInitParam par, mfxSession *session) { + #if defined(MEDIASDK_ARM_LOADER) + + return MFX_ERR_UNSUPPORTED; + + #else + + wchar_t IntelGFXAPIdllNameMFX_MAX_DLL_PATH = { 0 }; + mfxI32 adapterNum = -1; + + switch (par.Implementation & 0xf) { + case MFX_IMPL_SOFTWARE: + #if (MFX_VERSION >= MFX_VERSION_NEXT) + case MFX_IMPL_SINGLE_THREAD: + #endif + return MFX_ERR_UNSUPPORTED; + case MFX_IMPL_AUTO: + case MFX_IMPL_HARDWARE: + adapterNum = 0; + break; + case MFX_IMPL_HARDWARE2: + adapterNum = 1; + break; + case MFX_IMPL_HARDWARE3: + adapterNum = 2; + break; + case MFX_IMPL_HARDWARE4: + adapterNum = 3; + break; + default: + return GfxApiInitPriorityIntegrated(par, session, hModule); + } + + return GfxApiInitByAdapterNum(par, adapterNum, session, hModule); + + #endif +} + +// for the UWP_DISPATCHER purposes implementation of MFXClose is calling +// DisposeMediaSession() implemented in intel_gfx_api.dll +mfxStatus MFXClose(mfxSession session) { + if (NULL == session) { + return MFX_ERR_INVALID_HANDLE; + } + + mfxStatus sts = MFX_ERR_NONE; + + #if defined(MEDIASDK_ARM_LOADER) + + sts = MFX_ERR_UNSUPPORTED; + + #else + + sts = GfxApiClose(session, hModule); + + #endif + + session = (mfxSession)NULL; + return sts; +} + + #undef FUNCTION + #define FUNCTION(return_value, func_name, formal_param_list, actual_param_list) \ + return_value func_name formal_param_list { \ + mfxStatus mfxRes = MFX_ERR_INVALID_HANDLE; \ + \ + _mfxSession *pHandle = (_mfxSession *)session; \ + \ + /* get the function's address and make a call */ \ + if (pHandle) { \ + mfxFunctionPointer pFunc = pHandle->callPlugInsTablee##func_name; \ + if (pFunc) { \ + /* pass down the call */ \ + mfxRes = (*(mfxStatus(MFX_CDECL *) formal_param_list)pFunc)actual_param_list; \ + } \ + } \ + return mfxRes; \ + } + +FUNCTION(mfxStatus, + MFXVideoUSER_Load, + (mfxSession session, const mfxPluginUID *uid, mfxU32 version), + (session, uid, version)) +FUNCTION( + mfxStatus, + MFXVideoUSER_LoadByPath, + (mfxSession session, const mfxPluginUID *uid, mfxU32 version, const mfxChar *path, mfxU32 len), + (session, uid, version, path, len)) +FUNCTION(mfxStatus, + MFXVideoUSER_UnLoad, + (mfxSession session, const mfxPluginUID *uid), + (session, uid)) +FUNCTION(mfxStatus, + MFXAudioUSER_Load, + (mfxSession session, const mfxPluginUID *uid, mfxU32 version), + (session, uid, version)) +FUNCTION(mfxStatus, + MFXAudioUSER_UnLoad, + (mfxSession session, const mfxPluginUID *uid), + (session, uid)) + +#endif //!defined(MEDIASDK_UWP_DISPATCHER) + +mfxStatus MFXJoinSession(mfxSession session, mfxSession child_session) { + mfxStatus mfxRes = MFX_ERR_INVALID_HANDLE; + MFX_DISP_HANDLE *pHandle = (MFX_DISP_HANDLE *)session; + MFX_DISP_HANDLE *pChildHandle = (MFX_DISP_HANDLE *)child_session; + + // get the function's address and make a call + if ((pHandle) && (pChildHandle) && + (pHandle->actualApiVersion == pChildHandle->actualApiVersion)) { + /* check whether it is audio session or video */ + int tableIndex = eMFXJoinSession; + mfxFunctionPointer pFunc; + pFunc = pHandle->callTabletableIndex; + + if (pFunc) { + // pass down the call + mfxRes = + (*(mfxStatus(MFX_CDECL *)(mfxSession, mfxSession))pFunc)(pHandle->session, + pChildHandle->session); + } + } + + return mfxRes; + +} // mfxStatus MFXJoinSession(mfxSession session, mfxSession child_session) + +static mfxStatus AllocateCloneHandle(MFX_DISP_HANDLE *parentHandle, MFX_DISP_HANDLE **cloneHandle) { + MFX_DISP_HANDLE *ph = parentHandle; + MFX_DISP_HANDLE *ch = nullptr; + + if (!ph || !ph->hModule) + return MFX_ERR_NULL_PTR; + + // get full path to the DLL of the parent session + wchar_t dllNameMFX::msdk_disp_path_len; + DWORD nSize = GetModuleFileNameW((HMODULE)(ph->hModule), dllName, msdk_disp_path_len); + if (nSize == 0 || nSize == msdk_disp_path_len) + return MFX_ERR_UNSUPPORTED; + + try { + // requested version matches original session + ch = new MFX_DISP_HANDLE(ph->apiVersion); + } + catch (...) { + return MFX_ERR_MEMORY_ALLOC; + } + + // initialization param structs are not used when bCloneSession == true + mfxInitParam par = {}; + mfxInitializationParam vplParam = {}; + + // initialization extBufs are not saved at this level + // the RT should save these when the parent session is created and may use + // them when creating the cloned session + par.NumExtParam = 0; + + // load the selected DLL, fill out function pointer tables and other state + mfxStatus sts = ch->LoadSelectedDLL(dllName, + ph->implType, + ph->impl, + ph->implInterface, + par, + vplParam, + true); + + // unload the failed DLL + if (sts) { + ch->Close(); + delete ch; + return MFX_ERR_UNSUPPORTED; + } + else { + ch->storageID = MFX::MFX_UNKNOWN_KEY; + } + + *cloneHandle = ch; + + return MFX_ERR_NONE; +} + +mfxStatus MFXCloneSession(mfxSession session, mfxSession *clone) { + mfxStatus mfxRes = MFX_ERR_INVALID_HANDLE; + MFX_DISP_HANDLE *pHandle = (MFX_DISP_HANDLE *)session; + mfxVersion apiVersion; + mfxIMPL impl; + + if (!clone) + return MFX_ERR_NULL_PTR; + *clone = NULL; + + // check error(s) + if (pHandle) { + // initialize the clone session + // for runtimes with 1.x API, call MFXInit followed by MFXJoinSession + // for runtimes with 2.x API, use RT implementation of MFXCloneSession (passthrough) + apiVersion = pHandle->actualApiVersion; + + if (apiVersion.Major == 1) { + impl = pHandle->impl | pHandle->implInterface; + mfxRes = MFXInit(impl, &apiVersion, clone); + if (MFX_ERR_NONE != mfxRes) { + return mfxRes; + } + + // join the sessions + mfxRes = MFXJoinSession(session, *clone); + if (MFX_ERR_NONE != mfxRes) { + MFXClose(*clone); + *clone = NULL; + return mfxRes; + } + } + else if (apiVersion.Major == 2) { + int tableIndex = eMFXCloneSession; + mfxFunctionPointer pFunc; + pFunc = pHandle->callTabletableIndex; + if (!pFunc) + return MFX_ERR_UNSUPPORTED; + + // allocate new dispatcher-level session object and initialize state + // (function pointer tables, impl type, etc.) + MFX_DISP_HANDLE *cloneHandle; + mfxRes = AllocateCloneHandle(pHandle, &cloneHandle); + if (mfxRes != MFX_ERR_NONE) + return mfxRes; + + // call RT implementation of MFXCloneSession + mfxSession cloneRT; + mfxRes = (*(mfxStatus(MFX_CDECL *)(mfxSession, mfxSession *))pFunc)(pHandle->session, + &cloneRT); + + if (mfxRes != MFX_ERR_NONE || cloneRT == NULL) { + // RT call failed, delete cloned session + delete cloneHandle; + return MFX_ERR_UNSUPPORTED; + } + cloneHandle->session = cloneRT; + + // get version of cloned session + mfxVersion cloneVersion = {}; + mfxRes = MFXQueryVersion((mfxSession)cloneHandle, &cloneVersion); + if (mfxRes != MFX_ERR_NONE) { + MFXClose(cloneHandle); + return MFX_ERR_UNSUPPORTED; + } + + cloneHandle->actualApiVersion = cloneVersion; + *clone = (mfxSession)cloneHandle; + } + else { + return MFX_ERR_UNSUPPORTED; + } + } + + return mfxRes; + +} // mfxStatus MFXCloneSession(mfxSession session, mfxSession *clone) + +mfxStatus MFXInit(mfxIMPL impl, mfxVersion *pVer, mfxSession *session) { + mfxInitParam par = {}; + + par.Implementation = impl; + if (pVer) { + par.Version = *pVer; + } + else { + par.Version.Major = DEFAULT_API_VERSION_MAJOR; + par.Version.Minor = DEFAULT_API_VERSION_MINOR; + } + par.ExternalThreads = 0; + + return MFXInitEx(par, session); +} + +// passthrough functions to implementation +mfxStatus MFXMemory_GetSurfaceForVPP(mfxSession session, mfxFrameSurface1 **surface) { + mfxStatus sts = MFX_ERR_INVALID_HANDLE; + + if (!session) + return MFX_ERR_INVALID_HANDLE; + + struct _mfxSession *pHandle = (struct _mfxSession *)session; + + mfxFunctionPointer pFunc; + pFunc = pHandle->callVideoTable2eMFXMemory_GetSurfaceForVPP; + if (pFunc) { + session = pHandle->session; + sts = (*(mfxStatus(MFX_CDECL *)(mfxSession, mfxFrameSurface1 **))pFunc)(session, surface); + } + + return sts; +} + +mfxStatus MFXMemory_GetSurfaceForVPPOut(mfxSession session, mfxFrameSurface1 **surface) { + mfxStatus sts = MFX_ERR_INVALID_HANDLE; + + if (!session) + return MFX_ERR_INVALID_HANDLE; + + struct _mfxSession *pHandle = (struct _mfxSession *)session; + + mfxFunctionPointer pFunc; + pFunc = pHandle->callVideoTable2eMFXMemory_GetSurfaceForVPPOut; + if (pFunc) { + session = pHandle->session; + sts = (*(mfxStatus(MFX_CDECL *)(mfxSession, mfxFrameSurface1 **))pFunc)(session, surface); + } + + return sts; +} + +mfxStatus MFXMemory_GetSurfaceForEncode(mfxSession session, mfxFrameSurface1 **surface) { + mfxStatus sts = MFX_ERR_INVALID_HANDLE; + + if (!session) + return MFX_ERR_INVALID_HANDLE; + + struct _mfxSession *pHandle = (struct _mfxSession *)session; + + mfxFunctionPointer pFunc; + pFunc = pHandle->callVideoTable2eMFXMemory_GetSurfaceForEncode; + if (pFunc) { + session = pHandle->session; + sts = (*(mfxStatus(MFX_CDECL *)(mfxSession, mfxFrameSurface1 **))pFunc)(session, surface); + } + + return sts; +} + +mfxStatus MFXMemory_GetSurfaceForDecode(mfxSession session, mfxFrameSurface1 **surface) { + mfxStatus sts = MFX_ERR_INVALID_HANDLE; + + if (!session) + return MFX_ERR_INVALID_HANDLE; + + struct _mfxSession *pHandle = (struct _mfxSession *)session; + + mfxFunctionPointer pFunc; + pFunc = pHandle->callVideoTable2eMFXMemory_GetSurfaceForDecode; + if (pFunc) { + session = pHandle->session; + sts = (*(mfxStatus(MFX_CDECL *)(mfxSession, mfxFrameSurface1 **))pFunc)(session, surface); + } + + return sts; +} + +mfxStatus MFXVideoDECODE_VPP_Init(mfxSession session, + mfxVideoParam *decode_par, + mfxVideoChannelParam **vpp_par_array, + mfxU32 num_vpp_par) { + mfxStatus sts = MFX_ERR_INVALID_HANDLE; + + if (!session) + return MFX_ERR_INVALID_HANDLE; + + struct _mfxSession *pHandle = (struct _mfxSession *)session; + + mfxFunctionPointer pFunc; + pFunc = pHandle->callVideoTable2eMFXVideoDECODE_VPP_Init; + if (pFunc) { + session = pHandle->session; + sts = + (*(mfxStatus(MFX_CDECL *)(mfxSession, mfxVideoParam *, mfxVideoChannelParam **, mfxU32)) + pFunc)(session, decode_par, vpp_par_array, num_vpp_par); + } + + return sts; +} + +mfxStatus MFXVideoDECODE_VPP_DecodeFrameAsync(mfxSession session, + mfxBitstream *bs, + mfxU32 *skip_channels, + mfxU32 num_skip_channels, + mfxSurfaceArray **surf_array_out) { + mfxStatus sts = MFX_ERR_INVALID_HANDLE; + + if (!session) + return MFX_ERR_INVALID_HANDLE; + + struct _mfxSession *pHandle = (struct _mfxSession *)session; + + mfxFunctionPointer pFunc; + pFunc = pHandle->callVideoTable2eMFXVideoDECODE_VPP_DecodeFrameAsync; + if (pFunc) { + session = pHandle->session; + sts = (*(mfxStatus( + MFX_CDECL *)(mfxSession, mfxBitstream *, mfxU32 *, mfxU32, mfxSurfaceArray **)) + pFunc)(session, bs, skip_channels, num_skip_channels, surf_array_out); + } + + return sts; +} + +mfxStatus MFXVideoDECODE_VPP_Reset(mfxSession session, + mfxVideoParam *decode_par, + mfxVideoChannelParam **vpp_par_array, + mfxU32 num_vpp_par) { + mfxStatus sts = MFX_ERR_INVALID_HANDLE; + + if (!session) + return MFX_ERR_INVALID_HANDLE; + + struct _mfxSession *pHandle = (struct _mfxSession *)session; + + mfxFunctionPointer pFunc; + pFunc = pHandle->callVideoTable2eMFXVideoDECODE_VPP_Reset; + if (pFunc) { + session = pHandle->session; + sts = + (*(mfxStatus(MFX_CDECL *)(mfxSession, mfxVideoParam *, mfxVideoChannelParam **, mfxU32)) + pFunc)(session, decode_par, vpp_par_array, num_vpp_par); + } + + return sts; +} + +mfxStatus MFXVideoDECODE_VPP_GetChannelParam(mfxSession session, + mfxVideoChannelParam *par, + mfxU32 channel_id) { + mfxStatus sts = MFX_ERR_INVALID_HANDLE; + + if (!session) + return MFX_ERR_INVALID_HANDLE; + + struct _mfxSession *pHandle = (struct _mfxSession *)session; + + mfxFunctionPointer pFunc; + pFunc = pHandle->callVideoTable2eMFXVideoDECODE_VPP_GetChannelParam; + if (pFunc) { + session = pHandle->session; + sts = (*(mfxStatus(MFX_CDECL *)(mfxSession, mfxVideoChannelParam *, mfxU32))pFunc)( + session, + par, + channel_id); + } + + return sts; +} + +mfxStatus MFXVideoDECODE_VPP_Close(mfxSession session) { + mfxStatus sts = MFX_ERR_INVALID_HANDLE; + + if (!session) + return MFX_ERR_INVALID_HANDLE; + + struct _mfxSession *pHandle = (struct _mfxSession *)session; + + mfxFunctionPointer pFunc; + pFunc = pHandle->callVideoTable2eMFXVideoDECODE_VPP_Close; + if (pFunc) { + session = pHandle->session; + sts = (*(mfxStatus(MFX_CDECL *)(mfxSession))pFunc)(session); + } + + return sts; +} + +mfxStatus MFXVideoVPP_ProcessFrameAsync(mfxSession session, + mfxFrameSurface1 *in, + mfxFrameSurface1 **out) { + mfxStatus sts = MFX_ERR_INVALID_HANDLE; + + if (!session) + return MFX_ERR_INVALID_HANDLE; + + struct _mfxSession *pHandle = (struct _mfxSession *)session; + + mfxFunctionPointer pFunc; + pFunc = pHandle->callVideoTable2eMFXVideoVPP_ProcessFrameAsync; + if (pFunc) { + session = pHandle->session; + sts = (*(mfxStatus(MFX_CDECL *)(mfxSession, mfxFrameSurface1 *, mfxFrameSurface1 **))pFunc)( + session, + in, + out); + } + + return sts; +} + +// +// +// implement all other calling functions. +// They just call a procedure of DLL library from the table. +// + +// define for common functions (from mfxsession.h) +#undef FUNCTION +#define FUNCTION(return_value, func_name, formal_param_list, actual_param_list) \ + return_value func_name formal_param_list { \ + mfxStatus mfxRes = MFX_ERR_INVALID_HANDLE; \ + _mfxSession *pHandle = (_mfxSession *)session; \ + /* get the function's address and make a call */ \ + if (pHandle) { \ + /* check whether it is audio session or video */ \ + int tableIndex = e##func_name; \ + mfxFunctionPointer pFunc; \ + pFunc = pHandle->callTabletableIndex; \ + if (pFunc) { \ + /* get the real session pointer */ \ + session = pHandle->session; \ + /* pass down the call */ \ + mfxRes = (*(mfxStatus(MFX_CDECL *) formal_param_list)pFunc)actual_param_list; \ + } \ + } \ + return mfxRes; \ + } + +FUNCTION(mfxStatus, MFXQueryIMPL, (mfxSession session, mfxIMPL *impl), (session, impl)) +FUNCTION(mfxStatus, MFXQueryVersion, (mfxSession session, mfxVersion *version), (session, version)) + +// these functions are not necessary in LOADER part of dispatcher and +// need to be included only in in SOLID dispatcher or PROCTABLE part of dispatcher + +FUNCTION(mfxStatus, MFXDisjoinSession, (mfxSession session), (session)) +FUNCTION(mfxStatus, MFXSetPriority, (mfxSession session, mfxPriority priority), (session, priority)) +FUNCTION(mfxStatus, + MFXGetPriority, + (mfxSession session, mfxPriority *priority), + (session, priority)) + +#undef FUNCTION +#define FUNCTION(return_value, func_name, formal_param_list, actual_param_list) \ + return_value func_name formal_param_list { \ + mfxStatus mfxRes = MFX_ERR_INVALID_HANDLE; \ + _mfxSession *pHandle = (_mfxSession *)session; \ + /* get the function's address and make a call */ \ + if (pHandle) { \ + mfxFunctionPointer pFunc = pHandle->callTablee##func_name; \ + if (pFunc) { \ + /* get the real session pointer */ \ + session = pHandle->session; \ + /* pass down the call */ \ + mfxRes = (*(mfxStatus(MFX_CDECL *) formal_param_list)pFunc)actual_param_list; \ + } \ + } \ + return mfxRes; \ + } + +#include "windows/mfx_exposed_functions_list.h"
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_critical_section.cpp
Added
@@ -0,0 +1,49 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include "windows/mfx_critical_section.h" + +#include <windows.h> +// SDK re-declares the following functions with different call declarator. +// We don't need them. Just redefine them to nothing. +#define _interlockedbittestandset fake_set +#define _interlockedbittestandreset fake_reset +#define _interlockedbittestandset64 fake_set64 +#define _interlockedbittestandreset64 fake_reset64 +#include <intrin.h> + +#define MFX_WAIT() SwitchToThread() + +// static section of the file +namespace { + +enum { MFX_SC_IS_FREE = 0, MFX_SC_IS_TAKEN = 1 }; + +} // namespace + +namespace MFX { + +mfxU32 mfxInterlockedCas32(mfxCriticalSection *pCSection, + mfxU32 value_to_exchange, + mfxU32 value_to_compare) { + return _InterlockedCompareExchange(pCSection, value_to_exchange, value_to_compare); +} + +mfxU32 mfxInterlockedXchg32(mfxCriticalSection *pCSection, mfxU32 value) { + return _InterlockedExchange(pCSection, value); +} + +void mfxEnterCriticalSection(mfxCriticalSection *pCSection) { + while (MFX_SC_IS_TAKEN == mfxInterlockedCas32(pCSection, MFX_SC_IS_TAKEN, MFX_SC_IS_FREE)) { + MFX_WAIT(); + } +} // void mfxEnterCriticalSection(mfxCriticalSection *pCSection) + +void mfxLeaveCriticalSection(mfxCriticalSection *pCSection) { + mfxInterlockedXchg32(pCSection, MFX_SC_IS_FREE); +} // void mfxLeaveCriticalSection(mfxCriticalSection *pCSection) + +} // namespace MFX
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_critical_section.h
Added
@@ -0,0 +1,48 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_WINDOWS_MFX_CRITICAL_SECTION_H_ +#define DISPATCHER_WINDOWS_MFX_CRITICAL_SECTION_H_ + +#include "vpl/mfxdefs.h" + +namespace MFX { + +// Just set "critical section" instance to zero for initialization. +typedef volatile mfxL32 mfxCriticalSection; + +// Enter the global critical section. +void mfxEnterCriticalSection(mfxCriticalSection *pCSection); + +// Leave the global critical section. +void mfxLeaveCriticalSection(mfxCriticalSection *pCSection); + +class MFXAutomaticCriticalSection { +public: + // Constructor + explicit MFXAutomaticCriticalSection(mfxCriticalSection *pCSection) { + m_pCSection = pCSection; + mfxEnterCriticalSection(m_pCSection); + } + + // Destructor + ~MFXAutomaticCriticalSection() { + mfxLeaveCriticalSection(m_pCSection); + } + +protected: + // Pointer to a critical section + mfxCriticalSection *m_pCSection; + +private: + // unimplemented by intent to make this class non-copyable + MFXAutomaticCriticalSection(const MFXAutomaticCriticalSection &); + void operator=(const MFXAutomaticCriticalSection &); +}; + +} // namespace MFX + +#endif // DISPATCHER_WINDOWS_MFX_CRITICAL_SECTION_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher.cpp
Added
@@ -0,0 +1,594 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include "windows/mfx_dispatcher.h" +#include "windows/mfx_dispatcher_log.h" +#include "windows/mfx_load_dll.h" + +#include <assert.h> + +#include <string.h> +#include <windows.h> + +#include <algorithm> +#include "vpl/mfxadapter.h" +#include "windows/mfx_dxva2_device.h" +#include "windows/mfx_vector.h" +#include "windows/mfxvideo++.h" + +#if _MSC_VER + #pragma warning(disable : 4355) +#endif + +MFX_DISP_HANDLE::MFX_DISP_HANDLE(const mfxVersion requiredVersion) + : _mfxSession(), + apiVersion(requiredVersion) { + actualApiVersion.Version = 0; + implType = MFX_LIB_SOFTWARE; + impl = MFX_IMPL_SOFTWARE; + loadStatus = MFX_ERR_NOT_FOUND; + dispVersion.Major = MFX_DISPATCHER_VERSION_MAJOR; + dispVersion.Minor = MFX_DISPATCHER_VERSION_MINOR; + storageID = 0; + implInterface = MFX_IMPL_HARDWARE_ANY; + + hModule = (mfxModuleHandle)0; + +} // MFX_DISP_HANDLE::MFX_DISP_HANDLE(const mfxVersion requiredVersion) + +MFX_DISP_HANDLE::~MFX_DISP_HANDLE(void) { + Close(); + +} // MFX_DISP_HANDLE::~MFX_DISP_HANDLE(void) + +mfxStatus MFX_DISP_HANDLE::Close(void) { + mfxStatus mfxRes; + + mfxRes = UnLoadSelectedDLL(); + + // need to reset dispatcher state after unloading dll + if (MFX_ERR_NONE == mfxRes) { + implType = MFX_LIB_SOFTWARE; + impl = MFX_IMPL_SOFTWARE; + loadStatus = MFX_ERR_NOT_FOUND; + dispVersion.Major = MFX_DISPATCHER_VERSION_MAJOR; + dispVersion.Minor = MFX_DISPATCHER_VERSION_MINOR; + *static_cast<_mfxSession *>(this) = _mfxSession(); + hModule = (mfxModuleHandle)0; + } + + return mfxRes; + +} // mfxStatus MFX_DISP_HANDLE::Close(void) + +mfxStatus MFX_DISP_HANDLE::LoadSelectedDLL(const wchar_t *pPath, + eMfxImplType reqImplType, + mfxIMPL reqImpl, + mfxIMPL reqImplInterface, + mfxInitParam &par, + mfxInitializationParam &vplParam, + bool bCloneSession) { + mfxStatus mfxRes = MFX_ERR_NONE; + + // check error(s) + if ((MFX_LIB_SOFTWARE != reqImplType) && (MFX_LIB_HARDWARE != reqImplType)) { + DISPATCHER_LOG_ERROR( + (("implType == %s, should be either MFX_LIB_SOFTWARE ot MFX_LIB_HARDWARE\n"), + DispatcherLog_GetMFXImplString(reqImplType).c_str())); + loadStatus = MFX_ERR_ABORTED; + return loadStatus; + } + // only exact types of implementation is allowed + if ((MFX_IMPL_SOFTWARE != reqImpl) && (MFX_IMPL_HARDWARE != reqImpl) && + (MFX_IMPL_HARDWARE2 != reqImpl) && (MFX_IMPL_HARDWARE3 != reqImpl) && + (MFX_IMPL_HARDWARE4 != reqImpl)) { + DISPATCHER_LOG_ERROR((("invalid implementation impl == %s\n"), + DispatcherLog_GetMFXImplString(impl).c_str())); + loadStatus = MFX_ERR_ABORTED; + return loadStatus; + } + + // close the handle before initialization + Close(); + + // save the library's type + this->implType = reqImplType; + this->impl = reqImpl; + this->implInterface = reqImplInterface; + + { + assert(hModule == (mfxModuleHandle)0); + DISPATCHER_LOG_BLOCK(("invoking LoadLibrary(%S)\n", pPath)); + + // load the DLL into the memory + hModule = MFX::mfx_dll_load(pPath); + + if (hModule) { + int i; + + DISPATCHER_LOG_OPERATION({ + wchar_t modulePath1024; + GetModuleFileNameW((HMODULE)hModule, + modulePath, + sizeof(modulePath) / sizeof(modulePath0)); + DISPATCHER_LOG_INFO((("loaded module %S\n"), modulePath)) + }); + + // load video functions: pointers to exposed functions + for (i = 0; i < eVideoFuncTotal; i += 1) { + mfxFunctionPointer pProc = + (mfxFunctionPointer)MFX::mfx_dll_get_addr(hModule, APIFunci.pName); + if (pProc) { + // function exists in the library, + // save the pointer. + callTablei = pProc; + } + else { + // The library doesn't contain the function + DISPATCHER_LOG_WRN((("Can't find API function \"%s\"\n"), APIFunci.pName)); + if (apiVersion.Version >= APIFunci.apiVersion.Version) { + DISPATCHER_LOG_ERROR((("\"%s\" is required for API %u.%u\n"), + APIFunci.pName, + apiVersion.Major, + apiVersion.Minor)); + mfxRes = MFX_ERR_UNSUPPORTED; + break; + } + } + } + + // if version >= 2.0, load these functions as well + if (apiVersion.Major >= 2) { + for (i = 0; i < eVideoFunc2Total; i += 1) { + mfxFunctionPointer pProc = + (mfxFunctionPointer)MFX::mfx_dll_get_addr(hModule, APIVideoFunc2i.pName); + if (pProc) { + // function exists in the library, + // save the pointer. + callVideoTable2i = pProc; + } + else { + // The library doesn't contain the function + DISPATCHER_LOG_WRN( + (("Can't find API function \"%s\"\n"), APIVideoFunc2i.pName)); + if (apiVersion.Version >= APIVideoFunc2i.apiVersion.Version) { + DISPATCHER_LOG_ERROR((("\"%s\" is required for API %u.%u\n"), + APIVideoFunc2i.pName, + apiVersion.Major, + apiVersion.Minor)); + mfxRes = MFX_ERR_UNSUPPORTED; + break; + } + } + } + } + } + else { + DISPATCHER_LOG_WRN((("can't find DLL: GetLastErr()=0x%x\n"), GetLastError())) + mfxRes = MFX_ERR_UNSUPPORTED; + } + } + + if (bCloneSession == true) { + loadStatus = mfxRes; + return mfxRes; + } + + // initialize the loaded DLL + if (MFX_ERR_NONE == mfxRes) { + mfxVersion version(apiVersion); + + if (version.Major >= 2) { + // for API >= 2.0 call MFXInitialize instead of MFXInitEx + int tableIndex = eMFXInitialize; + mfxFunctionPointer pFunc = callVideoTable2tableIndex; + + // filled-in mfxInitializationParam must be provided for MFXInitialize path + mfxRes = + (*(mfxStatus(MFX_CDECL *)(mfxInitializationParam, mfxSession *))pFunc)(vplParam, + &session); + } + else { + // Call old-style MFXInit init for older libraries + bool callOldInit = + !callTableeMFXInitEx; // if true call eMFXInit, if false - eMFXInitEx + int tableIndex = (callOldInit) ? eMFXInit : eMFXInitEx; + mfxFunctionPointer pFunc = callTabletableIndex; + + if (callOldInit) { + DISPATCHER_LOG_BLOCK(("MFXInit(%s,ver=%u.%u,session=0x%p)\n", + DispatcherLog_GetMFXImplString(impl | implInterface).c_str(), + apiVersion.Major, + apiVersion.Minor, + &session)); + + mfxRes = (*(mfxStatus(MFX_CDECL *)(mfxIMPL, mfxVersion *, mfxSession *))pFunc)( + impl | implInterface, + &version, + &session); + } + else { + DISPATCHER_LOG_BLOCK(("MFXInitEx(%s,ver=%u.%u,ExtThreads=%d,session=0x%p)\n", + DispatcherLog_GetMFXImplString(impl | implInterface).c_str(), + apiVersion.Major, + apiVersion.Minor, + par.ExternalThreads, + &session)); + + mfxInitParam initPar = par; + // adjusting user parameters + initPar.Implementation = impl | implInterface; + initPar.Version = version; + mfxRes = + (*(mfxStatus(MFX_CDECL *)(mfxInitParam, mfxSession *))pFunc)(initPar, &session); + } + } + + if (MFX_ERR_NONE != mfxRes) { + DISPATCHER_LOG_WRN((("library can't be load. MFXInit returned %s \n"), + DispatcherLog_GetMFXStatusString(mfxRes))) + } + else { + mfxRes = MFXQueryVersion((mfxSession)this, &actualApiVersion); + + if (MFX_ERR_NONE != mfxRes) { + DISPATCHER_LOG_ERROR( + (("MFXQueryVersion returned: %d, skiped this library\n"), mfxRes)) + } + else { + DISPATCHER_LOG_INFO((("MFXQueryVersion returned API: %d.%d\n"), + actualApiVersion.Major, + actualApiVersion.Minor)) + //special hook for applications that uses sink api to get loaded library path + DISPATCHER_LOG_LIBRARY(("%p", hModule)); + DISPATCHER_LOG_INFO(("library loaded succesfully\n")) + } + } + } + + loadStatus = mfxRes; + return mfxRes; + +} // mfxStatus MFX_DISP_HANDLE::LoadSelectedDLL(const wchar_t* pPath, eMfxImplType reqImplType, mfxIMPL reqImpl, mfxIMPL reqImplInterface, mfxInitParam& par, mfxInitializationParam &vplParam) + +mfxStatus MFX_DISP_HANDLE::UnLoadSelectedDLL(void) { + mfxStatus mfxRes = MFX_ERR_NONE; + + // close the loaded DLL + if (session) { + /* check whether it is audio session or video */ + int tableIndex = eMFXClose; + mfxFunctionPointer pFunc; + pFunc = callTabletableIndex; + + mfxRes = (*(mfxStatus(MFX_CDECL *)(mfxSession))pFunc)(session); + if (MFX_ERR_NONE == mfxRes) { + session = (mfxSession)0; + } + + DISPATCHER_LOG_INFO((("MFXClose(0x%x) returned %d\n"), session, mfxRes)); + // actually, the return value is required to pass outside only. + } + + // it is possible, that there is an active child session. + // can't unload library in that case. + if ((MFX_ERR_UNDEFINED_BEHAVIOR != mfxRes) && (hModule)) { + // unload the library. + if (!MFX::mfx_dll_free(hModule)) { + mfxRes = MFX_ERR_UNDEFINED_BEHAVIOR; + } + hModule = (mfxModuleHandle)0; + } + + return mfxRes; + +} // mfxStatus MFX_DISP_HANDLE::UnLoadSelectedDLL(void) + +MFX_DISP_HANDLE_EX::MFX_DISP_HANDLE_EX(const mfxVersion requiredVersion) + : MFX_DISP_HANDLE(requiredVersion), + mediaAdapterType(MFX_MEDIA_UNKNOWN) {} + +#if (defined(_WIN64) || defined(_WIN32)) && (MFX_VERSION >= 1031) +static mfxStatus InitDummySession(mfxU32 adapter_n, MFXVideoSession &dummy_session) { + mfxInitParam initPar; + memset(&initPar, 0, sizeof(initPar)); + + initPar.Version.Major = 1; + initPar.Version.Minor = 0; + + switch (adapter_n) { + case 0: + initPar.Implementation = MFX_IMPL_HARDWARE; + break; + case 1: + initPar.Implementation = MFX_IMPL_HARDWARE2; + break; + case 2: + initPar.Implementation = MFX_IMPL_HARDWARE3; + break; + case 3: + initPar.Implementation = MFX_IMPL_HARDWARE4; + break; + + default: + // try searching on all display adapters + initPar.Implementation = MFX_IMPL_HARDWARE_ANY; + break; + } + + initPar.Implementation |= MFX_IMPL_VIA_D3D11; + + return dummy_session.InitEx(initPar); +} + +static inline bool is_iGPU(const mfxAdapterInfo &adapter_info) { + return adapter_info.Platform.MediaAdapterType == MFX_MEDIA_INTEGRATED; +} + +static inline bool is_dGPU(const mfxAdapterInfo &adapter_info) { + return adapter_info.Platform.MediaAdapterType == MFX_MEDIA_DISCRETE; +} + +// This function implies that iGPU has higher priority +static inline mfxI32 iGPU_priority(const void *ll, const void *rr) { + const mfxAdapterInfo &l = *(reinterpret_cast<const mfxAdapterInfo *>(ll)); + const mfxAdapterInfo &r = *(reinterpret_cast<const mfxAdapterInfo *>(rr)); + + if ((is_iGPU(l) && is_iGPU(r)) || (is_dGPU(l) && is_dGPU(r))) + return 0; + + if (is_iGPU(l) && is_dGPU(r)) + return -1; + + // The only combination left is_dGPU(l) && is_iGPU(r)) + return 1; +} + +static void RearrangeInPriorityOrder(const mfxComponentInfo &info, + MFX::MFXVector<mfxAdapterInfo> &vec) { + (void)info; + { + // Move iGPU to top priority + qsort(vec.data(), vec.size(), sizeof(mfxAdapterInfo), &iGPU_priority); + } +} + +static mfxStatus PrepareAdaptersInfo(const mfxComponentInfo *info, + MFX::MFXVector<mfxAdapterInfo> &vec, + mfxAdaptersInfo &adapters) { + // No suitable adapters on system to handle user's workload + if (vec.empty()) { + adapters.NumActual = 0; + return MFX_ERR_NOT_FOUND; + } + + if (info) { + RearrangeInPriorityOrder(*info, vec); + } + + mfxU32 num_to_copy = (std::min)(mfxU32(vec.size()), adapters.NumAlloc); + for (mfxU32 i = 0; i < num_to_copy; ++i) { + adapters.Adaptersi = veci; + } + + adapters.NumActual = num_to_copy; + + if (vec.size() > adapters.NumAlloc) { + return MFX_WRN_OUT_OF_RANGE; + } + + return MFX_ERR_NONE; +} + +static inline bool QueryAdapterInfo(mfxU32 adapter_n, mfxU32 &VendorID, mfxU32 &DeviceID) { + MFX::DXVA2Device dxvaDevice; + + if (!dxvaDevice.InitDXGI1(adapter_n)) + return false; + + VendorID = dxvaDevice.GetVendorID(); + DeviceID = dxvaDevice.GetDeviceID(); + + return true; +} + +static inline mfxU32 MakeVersion(mfxU16 major, mfxU16 minor) { + return major * 1000 + minor; +} + +mfxStatus MFXQueryAdaptersDecode(mfxBitstream *bitstream, + mfxU32 codec_id, + mfxAdaptersInfo *adapters) { + if (!adapters || !bitstream) + return MFX_ERR_NULL_PTR; + + MFX::MFXVector<mfxAdapterInfo> obtained_info; + + mfxU32 adapter_n = 0, VendorID, DeviceID; + + mfxComponentInfo input_info; + memset(&input_info, 0, sizeof(input_info)); + input_info.Type = mfxComponentType::MFX_COMPONENT_DECODE; + input_info.Requirements.mfx.CodecId = codec_id; + + for (;;) { + if (!QueryAdapterInfo(adapter_n, VendorID, DeviceID)) + break; + + ++adapter_n; + + if (VendorID != INTEL_VENDOR_ID) + continue; + + // Check if requested capabilities are supported + MFXVideoSession dummy_session; + + mfxStatus sts = InitDummySession(adapter_n - 1, dummy_session); + if (sts != MFX_ERR_NONE) { + continue; + } + + mfxVideoParam stream_params, out; + memset(&out, 0, sizeof(out)); + memset(&stream_params, 0, sizeof(stream_params)); + out.mfx.CodecId = stream_params.mfx.CodecId = codec_id; + + sts = MFXVideoDECODE_DecodeHeader(dummy_session.operator mfxSession(), + bitstream, + &stream_params); + + if (sts != MFX_ERR_NONE) { + continue; + } + + sts = MFXVideoDECODE_Query(dummy_session.operator mfxSession(), &stream_params, &out); + + if (sts != + MFX_ERR_NONE) // skip MFX_ERR_UNSUPPORTED as well as MFX_WRN_INCOMPATIBLE_VIDEO_PARAM + continue; + + mfxAdapterInfo info; + memset(&info, 0, sizeof(info)); + + //WA for initialization when application built w/ new API, but lib w/ old one. + mfxVersion apiVersion; + sts = dummy_session.QueryVersion(&apiVersion); + if (sts != MFX_ERR_NONE) + continue; + + mfxU32 version = MakeVersion(apiVersion.Major, apiVersion.Minor); + + if (version >= 1019) { + sts = MFXVideoCORE_QueryPlatform(dummy_session.operator mfxSession(), &info.Platform); + + if (sts != MFX_ERR_NONE) { + continue; + } + } + else { + // for API versions greater than 1.19 Device id is set inside QueryPlatform call + info.Platform.DeviceId = static_cast<mfxU16>(DeviceID); + } + + info.Number = adapter_n - 1; + + obtained_info.push_back(info); + } + + return PrepareAdaptersInfo(&input_info, obtained_info, *adapters); +} + +mfxStatus MFXQueryAdapters(mfxComponentInfo *input_info, mfxAdaptersInfo *adapters) { + if (!adapters) + return MFX_ERR_NULL_PTR; + + MFX::MFXVector<mfxAdapterInfo> obtained_info; + //obtained_info.reserve(adapters->NumAdaptersAlloc); + + mfxU32 adapter_n = 0, VendorID, DeviceID; + + for (;;) { + if (!QueryAdapterInfo(adapter_n, VendorID, DeviceID)) + break; + + ++adapter_n; + + if (VendorID != INTEL_VENDOR_ID) + continue; + + // Check if requested capabilities are supported + MFXVideoSession dummy_session; + + mfxStatus sts = InitDummySession(adapter_n - 1, dummy_session); + if (sts != MFX_ERR_NONE) { + continue; + } + + // If input_info is NULL just return all Intel adapters and information about them + if (input_info) { + mfxVideoParam out; + memset(&out, 0, sizeof(out)); + + switch (input_info->Type) { + case mfxComponentType::MFX_COMPONENT_ENCODE: { + out.mfx.CodecId = input_info->Requirements.mfx.CodecId; + + sts = MFXVideoENCODE_Query(dummy_session.operator mfxSession(), + &input_info->Requirements, + &out); + } break; + case mfxComponentType::MFX_COMPONENT_DECODE: { + out.mfx.CodecId = input_info->Requirements.mfx.CodecId; + + sts = MFXVideoDECODE_Query(dummy_session.operator mfxSession(), + &input_info->Requirements, + &out); + } break; + case mfxComponentType::MFX_COMPONENT_VPP: { + sts = MFXVideoVPP_Query(dummy_session.operator mfxSession(), + &input_info->Requirements, + &out); + } break; + default: + sts = MFX_ERR_UNSUPPORTED; + } + } + + if (sts != + MFX_ERR_NONE) // skip MFX_ERR_UNSUPPORTED as well as MFX_WRN_INCOMPATIBLE_VIDEO_PARAM + continue; + + mfxAdapterInfo info; + memset(&info, 0, sizeof(info)); + + //WA for initialization when application built w/ new API, but lib w/ old one. + mfxVersion apiVersion; + sts = dummy_session.QueryVersion(&apiVersion); + if (sts != MFX_ERR_NONE) + continue; + + mfxU32 version = MakeVersion(apiVersion.Major, apiVersion.Minor); + + if (version >= 1019) { + sts = MFXVideoCORE_QueryPlatform(dummy_session.operator mfxSession(), &info.Platform); + + if (sts != MFX_ERR_NONE) { + continue; + } + } + else { + // for API versions greater than 1.19 Device id is set inside QueryPlatform call + info.Platform.DeviceId = static_cast<mfxU16>(DeviceID); + } + + info.Number = adapter_n - 1; + + obtained_info.push_back(info); + } + + return PrepareAdaptersInfo(input_info, obtained_info, *adapters); +} + +mfxStatus MFXQueryAdaptersNumber(mfxU32 *num_adapters) { + if (!num_adapters) + return MFX_ERR_NULL_PTR; + + mfxU32 intel_adapter_count = 0, VendorID, DeviceID; + + for (mfxU32 cur_adapter = 0;; ++cur_adapter) { + if (!QueryAdapterInfo(cur_adapter, VendorID, DeviceID)) + break; + + if (VendorID == INTEL_VENDOR_ID) + ++intel_adapter_count; + } + + *num_adapters = intel_adapter_count; + + return MFX_ERR_NONE; +} + +#endif // (defined(_WIN64) || defined(_WIN32)) && (MFX_VERSION >= 1031)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher.h
Added
@@ -0,0 +1,202 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_WINDOWS_MFX_DISPATCHER_H_ +#define DISPATCHER_WINDOWS_MFX_DISPATCHER_H_ + +#include <stddef.h> + +#include "vpl/mfxdispatcher.h" +#include "vpl/mfxvideo.h" + +#include "windows/mfx_dispatcher_defs.h" + +#define INTEL_VENDOR_ID 0x8086 + +mfxStatus MFXQueryVersion(mfxSession session, mfxVersion *version); + +enum { + // to avoid code changing versions are just inherited + // from the API header file. + DEFAULT_API_VERSION_MAJOR = MFX_VERSION_MAJOR, + DEFAULT_API_VERSION_MINOR = MFX_VERSION_MINOR +}; + +enum { VPL_MINIMUM_VERSION_MAJOR = 2, VPL_MINIMUM_VERSION_MINOR = 0 }; + +// +// declare functions' integer identifiers. +// + +#undef FUNCTION +#define FUNCTION(return_value, func_name, formal_param_list, actual_param_list) e##func_name, + +enum eFunc { + eMFXInit, + eMFXClose, + eMFXQueryIMPL, + eMFXQueryVersion, + eMFXJoinSession, + eMFXDisjoinSession, + eMFXCloneSession, + eMFXSetPriority, + eMFXGetPriority, + eMFXInitEx, +#include "windows/mfx_exposed_functions_list.h" + eVideoFuncTotal +}; + +enum ePluginFunc { + eMFXVideoUSER_Load, + eMFXVideoUSER_LoadByPath, + eMFXVideoUSER_UnLoad, + eMFXAudioUSER_Load, + eMFXAudioUSER_UnLoad, + ePluginFuncTotal +}; + +enum eVideoFunc2 { + // 2.0 + eMFXQueryImplsDescription, + eMFXReleaseImplDescription, + eMFXMemory_GetSurfaceForVPP, + eMFXMemory_GetSurfaceForEncode, + eMFXMemory_GetSurfaceForDecode, + eMFXInitialize, + + // 2.1 + eMFXMemory_GetSurfaceForVPPOut, + eMFXVideoDECODE_VPP_Init, + eMFXVideoDECODE_VPP_DecodeFrameAsync, + eMFXVideoDECODE_VPP_Reset, + eMFXVideoDECODE_VPP_GetChannelParam, + eMFXVideoDECODE_VPP_Close, + eMFXVideoVPP_ProcessFrameAsync, + + eVideoFunc2Total +}; + +// declare max buffer length for regsitry key name +enum { MFX_MAX_REGISTRY_KEY_NAME = 256 }; + +// declare the maximum DLL path +enum { MFX_MAX_DLL_PATH = 1024 }; + +// declare library's implementation types +enum eMfxImplType { + MFX_LIB_HARDWARE = 0, + MFX_LIB_SOFTWARE = 1, + MFX_LIB_PSEUDO = 2, + + MFX_LIB_IMPL_TYPES +}; + +// declare dispatcher's version +enum { MFX_DISPATCHER_VERSION_MAJOR = 1, MFX_DISPATCHER_VERSION_MINOR = 3 }; + +struct _mfxSession { + // A real handle from MFX engine passed to a called function + mfxSession session; + + mfxFunctionPointer callTableeVideoFuncTotal; // NOLINT(runtime/arrays) + mfxFunctionPointer callPlugInsTableePluginFuncTotal; // NOLINT(runtime/arrays) + mfxFunctionPointer callVideoTable2eVideoFunc2Total; // NOLINT(runtime/arrays) + + // Current library's implementation (exact implementation) + mfxIMPL impl; +}; + +// declare a dispatcher's handle +struct MFX_DISP_HANDLE : public _mfxSession { + // Default constructor + explicit MFX_DISP_HANDLE(const mfxVersion requiredVersion); + // Destructor + ~MFX_DISP_HANDLE(void); + + // Load the library's module + mfxStatus LoadSelectedDLL(const wchar_t *pPath, + eMfxImplType implType, + mfxIMPL impl, + mfxIMPL implInterface, + mfxInitParam &par, + mfxInitializationParam &vplParam, + bool bCloneSession = false); + // Unload the library's module + mfxStatus UnLoadSelectedDLL(void); + + // Close the handle + mfxStatus Close(void); + + // NOTE: changing order of struct's members can make different version of + // dispatchers incompatible. Think of different modules (e.g. MFT filters) + // within a single application. + + // Library's implementation type (hardware or software) + eMfxImplType implType; + // Current library's VIA interface + mfxIMPL implInterface; + // Dispatcher's version. If version is 1.1 or lower, then old dispatcher's + // architecture is used. Otherwise it means current dispatcher's version. + mfxVersion dispVersion; + // Required API version of session initialized + const mfxVersion apiVersion; + // Actual library API version + mfxVersion actualApiVersion; + // Status of loaded dll + mfxStatus loadStatus; + // Resgistry subkey name for windows version + wchar_t subkeyNameMFX_MAX_REGISTRY_KEY_NAME; + // Storage ID for windows version + int storageID; + + // Library's module handle + mfxModuleHandle hModule; + +private: + // Declare assignment operator and copy constructor to prevent occasional assignment + MFX_DISP_HANDLE(const MFX_DISP_HANDLE &); + MFX_DISP_HANDLE &operator=(const MFX_DISP_HANDLE &); +}; + +// This struct extends MFX_DISP_HANDLE, we cannot extend MFX_DISP_HANDLE itself due to possible compatibility issues +// This struct was added in dispatcher version 1.3 +// Check dispatcher handle's version when you cast session struct which came from outside of MSDK API function to this +struct MFX_DISP_HANDLE_EX : public MFX_DISP_HANDLE { + explicit MFX_DISP_HANDLE_EX(const mfxVersion requiredVersion); + + mfxU16 mediaAdapterType; + mfxU16 reserved10; +}; + +// declare comparison operator +inline bool operator==(const mfxVersion &one, const mfxVersion &two) { + return (one.Version == two.Version); +} + +inline bool operator<(const mfxVersion &one, const mfxVersion &two) { + return (one.Major < two.Major) || ((one.Major == two.Major) && (one.Minor < two.Minor)); +} + +inline bool operator<=(const mfxVersion &one, const mfxVersion &two) { + return (one == two) || (one < two); +} + +// +// declare a table with functions descriptions +// + +typedef struct FUNCTION_DESCRIPTION { + // Literal function's name + const char *pName; + // API version when function appeared first time + mfxVersion apiVersion; +} FUNCTION_DESCRIPTION; + +extern const FUNCTION_DESCRIPTION APIFunceVideoFuncTotal; + +extern const FUNCTION_DESCRIPTION APIVideoFunc2eVideoFunc2Total; + +#endif // DISPATCHER_WINDOWS_MFX_DISPATCHER_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher_defs.h
Added
@@ -0,0 +1,37 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#pragma once +#include <cstdio> +#include <cstring> +#include "vpl/mfxdefs.h" + +#if defined(MFX_DISPATCHER_LOG) + #include <string.h> + #include <string> +#endif + +#define MAX_PLUGIN_PATH 4096 +#define MAX_PLUGIN_NAME 4096 + +#if _MSC_VER < 1400 + #define wcscpy_s(to, to_size, from) \ + (void)(to_size); \ + wcscpy(to, from) + #define wcscat_s(to, to_size, from) \ + (void)(to_size); \ + wcscat(to, from) +#endif + +// declare library module's handle +typedef void *mfxModuleHandle; + +typedef void(MFX_CDECL *mfxFunctionPointer)(void); + +// Tracer uses lib loading from Program Files logic (via Dispatch reg key) to make dispatcher load tracer dll. +// With DriverStore loading put at 1st place, dispatcher loads real lib before it finds tracer dll. +// This workaround explicitly checks tracer presence in Dispatch reg key and loads tracer dll before the search for lib in all other places. +#define MFX_TRACER_WA_FOR_DS 1
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher_log.cpp
Added
@@ -0,0 +1,366 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#if defined(MFX_DISPATCHER_LOG) + + #include "windows/mfx_dispatcher_log.h" + #include <windows.h> + #include "vpl/mfxstructures.h" + #if defined(DISPATCHER_LOG_REGISTER_EVENT_PROVIDER) + #include <evntprov.h> + #include <winmeta.h> + #endif + #include <stdarg.h> + #include <algorithm> + #include <sstream> + #include <string> + +struct CodeStringTable { + int code; + const char *string; +} LevelStrings = { { DL_INFO, "INFO: " }, { DL_WRN, "WARNING:" }, { DL_ERROR, "ERROR: " } }; + + #define DEFINE_CODE(code) \ + { code, #code } + +static CodeStringTable StringsOfImpl = { + DEFINE_CODE(MFX_IMPL_AUTO), DEFINE_CODE(MFX_IMPL_SOFTWARE), + DEFINE_CODE(MFX_IMPL_HARDWARE), DEFINE_CODE(MFX_IMPL_AUTO_ANY), + DEFINE_CODE(MFX_IMPL_HARDWARE_ANY), DEFINE_CODE(MFX_IMPL_HARDWARE2), + DEFINE_CODE(MFX_IMPL_HARDWARE3), DEFINE_CODE(MFX_IMPL_HARDWARE4), + + DEFINE_CODE(MFX_IMPL_UNSUPPORTED) +}; + +static CodeStringTable StringsOfImplVIA = { + DEFINE_CODE(MFX_IMPL_VIA_ANY), + DEFINE_CODE(MFX_IMPL_VIA_D3D9), + DEFINE_CODE(MFX_IMPL_VIA_D3D11), +}; + +static CodeStringTable StringsOfStatus = { + DEFINE_CODE(MFX_ERR_NONE), + DEFINE_CODE(MFX_ERR_UNKNOWN), + DEFINE_CODE(MFX_ERR_NULL_PTR), + DEFINE_CODE(MFX_ERR_UNSUPPORTED), + DEFINE_CODE(MFX_ERR_MEMORY_ALLOC), + DEFINE_CODE(MFX_ERR_NOT_ENOUGH_BUFFER), + DEFINE_CODE(MFX_ERR_INVALID_HANDLE), + DEFINE_CODE(MFX_ERR_LOCK_MEMORY), + DEFINE_CODE(MFX_ERR_NOT_INITIALIZED), + DEFINE_CODE(MFX_ERR_NOT_FOUND), + DEFINE_CODE(MFX_ERR_MORE_DATA), + DEFINE_CODE(MFX_ERR_MORE_SURFACE), + DEFINE_CODE(MFX_ERR_ABORTED), + DEFINE_CODE(MFX_ERR_DEVICE_LOST), + DEFINE_CODE(MFX_ERR_INCOMPATIBLE_VIDEO_PARAM), + DEFINE_CODE(MFX_ERR_INVALID_VIDEO_PARAM), + DEFINE_CODE(MFX_ERR_UNDEFINED_BEHAVIOR), + DEFINE_CODE(MFX_ERR_DEVICE_FAILED), + DEFINE_CODE(MFX_WRN_IN_EXECUTION), + DEFINE_CODE(MFX_WRN_DEVICE_BUSY), + DEFINE_CODE(MFX_WRN_VIDEO_PARAM_CHANGED), + DEFINE_CODE(MFX_WRN_PARTIAL_ACCELERATION), + DEFINE_CODE(MFX_WRN_INCOMPATIBLE_VIDEO_PARAM), + DEFINE_CODE(MFX_WRN_VALUE_NOT_CHANGED), + DEFINE_CODE(MFX_WRN_OUT_OF_RANGE), + +}; + + #define CODE_TO_STRING(code, array) CodeToString(code, array, sizeof(array) / sizeof(array0)) + +const char *CodeToString(int code, CodeStringTable array, int len) { + for (int i = 0; i < len; i++) { + if (arrayi.code == code) + return arrayi.string; + } + return "undef"; +} + +std::string DispatcherLog_GetMFXImplString(int impl) { + std::string str1 = CODE_TO_STRING(impl & ~(-MFX_IMPL_VIA_ANY), StringsOfImpl); + std::string str2 = CODE_TO_STRING(impl & (-MFX_IMPL_VIA_ANY), StringsOfImplVIA); + + return str1 + (str2 == "undef" ? "" : "|" + str2); +} + +const char *DispatcherLog_GetMFXStatusString(int sts) { + return CODE_TO_STRING(sts, StringsOfStatus); +} + +////////////////////////////////////////////////////////////////////////// + +void DispatcherLogBracketsHelper::Write(const char *str, ...) { + va_list argsptr; + va_start(argsptr, str); + DispatchLog::get().Write(m_level, m_opcode, str, argsptr); + va_end(argsptr); +} + +void DispatchLogBlockHelper::Write(const char *str, ...) { + va_list argsptr; + va_start(argsptr, str); + DispatchLog::get().Write(m_level, DL_EVENT_START, str, argsptr); + va_end(argsptr); +} + +DispatchLogBlockHelper::~DispatchLogBlockHelper() { + DispatchLog::get().Write(m_level, DL_EVENT_STOP, NULL, NULL); +} + +////////////////////////////////////////////////////////////////////////// + +DispatchLog::DispatchLog() : m_DispatcherLogSink(DL_SINK_PRINTF) {} + +void DispatchLog::SetSink(int nSink, IMsgHandler *pHandler) { + DetachAllSinks(); + AttachSink(nSink, pHandler); +} + +void DispatchLog::AttachSink(int nsink, IMsgHandler *pHandler) { + m_DispatcherLogSink |= nsink; + if (NULL != pHandler) + m_Recepients.push_back(pHandler); +} + +void DispatchLog::DetachSink(int nsink, IMsgHandler *pHandler) { + if (nsink & DL_SINK_IMsgHandler) { + m_Recepients.remove(pHandler); + } + + m_DispatcherLogSink &= ~nsink; +} + +void DispatchLog::ExchangeSink(int nsink, IMsgHandler *oldHdl, IMsgHandler *newHdl) { + if (nsink & DL_SINK_IMsgHandler) { + std::list<IMsgHandler *>::iterator it = + std::find(m_Recepients.begin(), m_Recepients.end(), oldHdl); + + //cannot exchange in that case + if (m_Recepients.end() == it) + return; + + *it = newHdl; + } +} + +void DispatchLog::DetachAllSinks() { + m_Recepients.clear(); + m_DispatcherLogSink = DL_SINK_NULL; +} + +void DispatchLog::Write(int level, int opcode, const char *msg, va_list argptr) { + int sinkTable = { + DL_SINK_PRINTF, + DL_SINK_IMsgHandler, + }; + + for (size_t i = 0; i < sizeof(sinkTable) / sizeof(sinkTable0); i++) { + switch (m_DispatcherLogSink & sinkTablei) { + case DL_SINK_NULL: + break; + + case DL_SINK_PRINTF: { + char msg_formated8048 = { 0 }; + + if (NULL != msg && level != DL_LOADED_LIBRARY) { + #if _MSC_VER >= 1400 + vsprintf_s(msg_formated, + sizeof(msg_formated) / sizeof(msg_formated0), + msg, + argptr); + #else + vsnprintf(msg_formated, + sizeof(msg_formated) / sizeof(msg_formated0), + msg, + argptr); + #endif + //TODO(XX): improve this , add opcode handling + printf("%s %s", CODE_TO_STRING(level, LevelStrings), msg_formated); + } + break; + } + + case DL_SINK_IMsgHandler: { + std::list<IMsgHandler *>::iterator it; + + for (it = m_Recepients.begin(); it != m_Recepients.end(); ++it) { + (*it)->Write(level, opcode, msg, argptr); + } + break; + } + } + } +} + + #if defined(DISPATCHER_LOG_REGISTER_EVENT_PROVIDER) +class ETWHandler : public IMsgHandler { +public: + explicit ETWHandler(const wchar_t *guid_str) + : m_bUseFormatter(DISPATCHER_LOG_USE_FORMATING), + m_EventHandle(), + m_bProviderEnable() { + GUID rguid = GUID_NULL; + if (FAILED(CLSIDFromString(guid_str, &rguid))) { + return; + } + + EventRegister(&rguid, NULL, NULL, &m_EventHandle); + + m_bProviderEnable = 0 != EventProviderEnabled(m_EventHandle, 1, 0); + } + + ~ETWHandler() { + if (m_EventHandle) { + EventUnregister(m_EventHandle); + } + } + + virtual void Write(int level, int opcode, const char *msg, va_list argptr) { + //event not registered + if (0 == m_EventHandle) { + return; + } + if (!m_bProviderEnable) { + return; + } + if (level == DL_LOADED_LIBRARY) { + return; + } + + char msg_formated1024; + EVENT_DESCRIPTOR descriptor; + EVENT_DATA_DESCRIPTOR data_descriptor; + + EventDescZero(&descriptor); + + descriptor.Opcode = (UCHAR)opcode; + descriptor.Level = (UCHAR)level; + + if (m_bUseFormatter) { + if (NULL != msg) { + #if _MSC_VER >= 1400 + vsprintf_s(msg_formated, + sizeof(msg_formated) / sizeof(msg_formated0), + msg, + argptr); + #else + vsnprintf(msg_formated, + sizeof(msg_formated) / sizeof(msg_formated0), + msg, + argptr); + #endif + EventDataDescCreate(&data_descriptor, + msg_formated, + (ULONG)(strlen(msg_formated) + 1)); + } + else { + EventDataDescCreate(&data_descriptor, NULL, 0); + } + } + else { + //TODO(XX): non formated events supports under zbb + } + + EventWrite(m_EventHandle, &descriptor, 1, &data_descriptor); + } + +protected: + //we may not use formatter in some cases described in dispatch_log macro + //it significantly increases performance by eliminating any vsprintf operations + bool m_bUseFormatter; + //consumer is attached, dispatcher trace to reduce formating overhead + //submits event only if consumer attached + bool m_bProviderEnable; + REGHANDLE m_EventHandle; +}; +// + +IMsgHandler *ETWHandlerFactory::GetSink(const wchar_t *sguid) { + _storage_type::iterator it; + it = m_storage.find(sguid); + if (it == m_storage.end()) { + ETWHandler *handler = new ETWHandler(sguid); + _storage_type::_Pairib it_bool = + m_storage.insert(_storage_type::value_type(sguid, handler)); + it = it_bool.first; + } + + return it->second; +} + +ETWHandlerFactory::~ETWHandlerFactory() { + for + each (_storage_type::value_type val in m_storage) { + delete val.second; + } +} + +class EventRegistrator : public IMsgHandler { + const wchar_t *m_sguid; + +public: + explicit EventRegistrator(const wchar_t *sguid = DISPATCHER_LOG_EVENT_GUID) : m_sguid(sguid) { + DispatchLog::get().AttachSink(DL_SINK_IMsgHandler, this); + } + + virtual void Write(int level, int opcode, const char *msg, va_list argptr) { + //we cannot call attach sink since we may have been called from iteration + //we axchanging preserve that placeholding + IMsgHandler *pSink = NULL; + DispatchLog::get().ExchangeSink(DL_SINK_IMsgHandler, + this, + pSink = ETWHandlerFactory::get().GetSink(m_sguid)); + //need to call only once here all next calls will be done inside dispatcherlog + if (NULL != pSink) { + pSink->Write(level, opcode, msg, argptr); + } + } +}; + #endif + +template <class TSink> +class SinkRegistrator {}; + + #if defined(DISPATCHER_LOG_REGISTER_EVENT_PROVIDER) +template <> +class SinkRegistrator<ETWHandlerFactory> { +public: + explicit SinkRegistrator(const wchar_t *sguid = DISPATCHER_LOG_EVENT_GUID) { + DispatchLog::get().AttachSink(DL_SINK_IMsgHandler, ETWHandlerFactory::get().GetSink(sguid)); + } +}; + #endif + + #if defined(DISPATCHER_LOG_REGISTER_FILE_WRITER) +template <> +class SinkRegistrator<FileSink> { +public: + SinkRegistrator() { + DispatchLog::get().AttachSink(DL_SINK_IMsgHandler, &FileSink::get(DISPACTHER_LOG_FW_PATH)); + } +}; + +void FileSink::Write(int level, int /*opcode*/, const char *msg, va_list argptr) { + if (NULL != m_hdl && NULL != msg) { + fprintf(m_hdl, "%s", CODE_TO_STRING(level, LevelStrings)); + vfprintf(m_hdl, msg, argptr); + } +} + #endif + +////////////////////////////////////////////////////////////////////////// +//singletons initialization section + + #ifdef DISPATCHER_LOG_REGISTER_EVENT_PROVIDER +static SinkRegistrator<ETWHandlerFactory> g_registrator1; + #endif + + #ifdef DISPATCHER_LOG_REGISTER_FILE_WRITER +static SinkRegistrator<FileSink> g_registrator2; + #endif + +#endif //(MFX_DISPATCHER_LOG)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_dispatcher_log.h
Added
@@ -0,0 +1,225 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_WINDOWS_MFX_DISPATCHER_LOG_H_ +#define DISPATCHER_WINDOWS_MFX_DISPATCHER_LOG_H_ + +////////////////////////////////////////////////////////////////////////// +//dispatcher log (DL) level +#define DL_INFO 1 +#define DL_WRN 2 +#define DL_ERROR 4 +#define DL_LOADED_LIBRARY 8 +////////////////////////////////////////////////////////////////////////// +//opcodes used only in events +enum { DL_EVENT_START = 1, DL_EVENT_STOP, DL_EVENT_MSG }; +////////////////////////////////////////////////////////////////////////// +#define DL_SINK_NULL 0 +#define DL_SINK_PRINTF 1 +#define DL_SINK_IMsgHandler 2 + +#define MFXFOURCCTYPE() "%c%c%c%c" +#define ZERO_OR_SPACE(value) ((0 == (value)) ? '0' : (value)) +#define MFXU32TOFOURCC(mfxu32) \ + ZERO_OR_SPACE((char)(mfxu32 & 0xFF)), ZERO_OR_SPACE((char)((mfxu32 >> 8) & 0xFF)), \ + ZERO_OR_SPACE((char)((mfxu32 >> 16) & 0xFF)), ZERO_OR_SPACE((char)((mfxu32 >> 24) & 0xFF)) + +#define MFXGUIDTYPE() "%X-%X-%X-%X-%X-%X-%X-%X-%X-%X-%X-%X-%X-%X-%X-%X" + +#define MFXGUIDTOHEX(guid) \ + (guid)->Data0, (guid)->Data1, (guid)->Data2, (guid)->Data3, (guid)->Data4, \ + (guid)->Data5, (guid)->Data6, (guid)->Data7, (guid)->Data8, (guid)->Data9, \ + (guid)->Data10, (guid)->Data11, (guid)->Data12, (guid)->Data13, (guid)->Data14, \ + (guid)->Data15 + +#if defined(MFX_DISPATCHER_LOG) + + //---------------------------setup section------------------------ + //using of formating instead of variadic macro with NULL end, + //leads to more flexibility in format, however constructing string + //with vsprintf_s is a time wasting + #define DISPATCHER_LOG_USE_FORMATING 1 + + //creates unique object, event guid registration, factories on heap + //heap reduce stack allocation and reduce reservation time at startup + //is a vital if mediasdk wont use + #define DISPATCHER_LOG_HEAP_SINGLETONES + + // guid for all dispatcher events + #define DISPATCHER_LOG_EVENT_GUID L"{EB0538CC-4FEE-484d-ACEE-1182E9F37A57}" + + //puts a sink into listeners list + //#define DISPATCHER_LOG_REGISTER_EVENT_PROVIDER + + //puts a sink into listeners list + //#define DISPATCHER_LOG_REGISTER_FILE_WRITER + #define DISPACTHER_LOG_FW_PATH "c:\\dispatcher.log" + + #include <stdarg.h> + #include <stdio.h> + +//callback interface for intercept logging messages +class IMsgHandler { +public: + virtual ~IMsgHandler() {} + virtual void Write(int level, int opcode, const char *msg, va_list argptr) = 0; +}; + + #if DISPATCHER_LOG_USE_FORMATING + + #define DISPATCHER_LOG(lvl, opcode, str) \ + { \ + DispatcherLogBracketsHelper wrt(lvl, opcode); \ + wrt.Write str; \ + } + #else + #define DISPATCHER_LOG_VA_ARGS(...) wrt.Write(__VA_ARGS__, NULL) + //WARNING: don't use types that occupy more that 4 bytes in memory + //WARNING: don't use %s in format specifier + #define DISPATCHER_LOG(lvl, opcode, str) \ + { \ + DispatcherLogBracketsHelper wrt(lvl, opcode); \ + DISPATCHER_LOG_VA_ARGS str; \ + } + #endif //DISPATCHER_LOG_USE_FORMATING + + #define DISPATCHER_LOG_OPERATION(operation) operation + + #define __name_from_line(name, line) name##line + #define _name_from_line(name, line) __name_from_line(name, line) + #define name_from_line(name) _name_from_line(name, __LINE__) + + #define DISPATCHER_LOG_AUTO(lvl, msg) \ + DispatchLogBlockHelper name_from_line(__auto_log_)(lvl); \ + name_from_line(__auto_log_).Write msg; + + #include <list> + #include <map> + #include <memory> + #include <string> + +template <class T> +class DSSingleTone { +public: + template <class TParam1> + inline static T &get(TParam1 par1) { + T *pstored; + if (NULL == (pstored = store_or_load())) { + return *store_or_load(new T(par1)); + } + return *pstored; + } + + inline static T &get() { + T *pstored; + if (NULL == (pstored = store_or_load())) { + return *store_or_load(new T()); + } + return *pstored; + } + +private: + //if obj == NULL, then it load + //if obj != NULL then it store obj + inline static T *store_or_load(T *obj = NULL) { + static std::unique_ptr<T> instance; + if (NULL != obj) { + instance.reset(obj); + } + return instance.get(); + } +}; + +class DispatchLog : public DSSingleTone<DispatchLog> { + friend class DSSingleTone<DispatchLog>; + std::list<IMsgHandler *> m_Recepients; + int m_DispatcherLogSink; + +public: + //sets current sink + void SetSink(int nsink, IMsgHandler *pHandler); + void AttachSink(int nsink, IMsgHandler *pHandler); + void DetachSink(int nsink, IMsgHandler *pHandler); + void ExchangeSink(int nsink, IMsgHandler *pOld, IMsgHandler *pNew); + void DetachAllSinks(); + void Write(int level, int opcode, const char *msg, va_list argptr); + +protected: + DispatchLog(); +}; + +//allows to push arguments on the stack without declaring them as function parameters +struct DispatcherLogBracketsHelper { + int m_level; + int m_opcode; + DispatcherLogBracketsHelper(int level, int opcode) : m_level(level), m_opcode(opcode) {} + void Write(const char *str, ...); +}; + +//auto log on ctor dtor +struct DispatchLogBlockHelper { + int m_level; + void Write(const char *str, ...); + explicit DispatchLogBlockHelper(int level) : m_level(level) {} + ~DispatchLogBlockHelper(); +}; + + //----utility sinks----- + #if defined(DISPATCHER_LOG_REGISTER_EVENT_PROVIDER) +class ETWHandlerFactory : public DSSingleTone<ETWHandlerFactory> { + friend class DSSingleTone<ETWHandlerFactory>; + typedef std::map<std::wstring, IMsgHandler *> _storage_type; + _storage_type m_storage; + +public: + ~ETWHandlerFactory(); + IMsgHandler *GetSink(const wchar_t *sguid = DISPATCHER_LOG_EVENT_GUID); + +protected: + ETWHandlerFactory() {} +}; + #endif + + #if defined(DISPATCHER_LOG_REGISTER_FILE_WRITER) +class FileSink : public DSSingleTone<FileSink>, public IMsgHandler { + friend class DSSingleTone<FileSink>; + +public: + virtual void Write(int level, int opcode, const char *msg, va_list argptr); + FileSink() : m_hdl(NULL) {} + ~FileSink() { + if (NULL != m_hdl) + fclose(m_hdl); + } + +private: + FILE *m_hdl; + explicit FileSink(const std::string &log_file) { + fopen_s(&m_hdl, log_file.c_str(), "a"); + } +}; + #endif + +//-----utility functions +//since they are not called outside of macro we can define them here +std::string DispatcherLog_GetMFXImplString(int impl); +const char *DispatcherLog_GetMFXStatusString(int sts); + +#else // !defined(MFX_DISPATCHER_LOG) + + #define DISPATCHER_LOG(level, opcode, message) + #define DISPATCHER_LOG_AUTO(level, message) + #define DISPATCHER_LOG_OPERATION(operation) + +#endif // !defined(MFX_DISPATCHER_LOG) + +#define DISPATCHER_LOG_INFO(msg) DISPATCHER_LOG(DL_INFO, DL_EVENT_MSG, msg) +#define DISPATCHER_LOG_WRN(msg) DISPATCHER_LOG(DL_WRN, DL_EVENT_MSG, msg) +#define DISPATCHER_LOG_ERROR(msg) DISPATCHER_LOG(DL_ERROR, DL_EVENT_MSG, msg) +#define DISPATCHER_LOG_LIBRARY(msg) DISPATCHER_LOG(DL_LOADED_LIBRARY, DL_EVENT_MSG, msg) +#define DISPATCHER_LOG_BLOCK(msg) DISPATCHER_LOG_AUTO(DL_INFO, msg) + +#endif // DISPATCHER_WINDOWS_MFX_DISPATCHER_LOG_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_driver_store_loader.cpp
Added
@@ -0,0 +1,192 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include <tchar.h> + +#include "windows/mfx_dispatcher_log.h" +#include "windows/mfx_driver_store_loader.h" +#include "windows/mfx_load_dll.h" +#include "windows/mfx_vector.h" + +namespace MFX { + +inline bool IsIntelDeviceInstanceID(const wchar_t *DeviceID) { + return wcsstr(DeviceID, L"VEN_8086") || wcsstr(DeviceID, L"ven_8086"); +} + +inline bool ExctractDeviceID(const wchar_t *descrString, mfxU32 &deviceID) { + const wchar_t *begin = wcsstr(descrString, L"DEV_"); + + if (!begin) { + begin = wcsstr(descrString, L"dev_"); + if (!begin) { + DISPATCHER_LOG_WRN(("exctracting device id: failed to find device id substring\n")); + return false; + } + } + + begin += wcslen(L"DEV_"); + deviceID = wcstoul(begin, NULL, 16); + if (!deviceID) { + DISPATCHER_LOG_WRN(("exctracting device id: failed to convert device id str to int\n")); + return false; + } + + return true; +} + +DriverStoreLoader::DriverStoreLoader(void) + : m_moduleCfgMgr(NULL), + m_pCM_Get_Device_ID_List_Size(NULL), + m_pCM_Get_Device_ID_List(NULL), + m_pCM_Locate_DevNode(NULL), + m_pCM_Open_DevNode_Key(NULL) {} + +DriverStoreLoader::~DriverStoreLoader(void) {} + +bool DriverStoreLoader::GetDriverStorePath(wchar_t *path, + DWORD dwPathSize, + mfxU32 deviceID, + const wchar_t *driverKey) { + if (path == NULL || dwPathSize == 0) { + return false; + } + + // Obtain a PnP handle to the Intel graphics adapter + CONFIGRET result = CR_SUCCESS; + ULONG DeviceIDListSize = 0; + MFXVector<WCHAR> DeviceIDList; + wchar_t DisplayGUID40; + DEVINST DeviceInst; + + DISPATCHER_LOG_INFO(("Looking for MediaSDK in DriverStore\n")); + + if (!LoadCfgMgr() || !LoadCmFuncs()) { + return false; + } + + if (StringFromGUID2(GUID_DEVCLASS_DISPLAY, DisplayGUID, sizeof(DisplayGUID)) == 0) { + DISPATCHER_LOG_WRN(("Couldn't prepare string from GUID\n")); + return false; + } + + do { + result = + m_pCM_Get_Device_ID_List_Size(&DeviceIDListSize, + DisplayGUID, + CM_GETIDLIST_FILTER_CLASS | CM_GETIDLIST_FILTER_PRESENT); + if (result != CR_SUCCESS) { + break; + } + + try { + DeviceIDList.resize(DeviceIDListSize); + } + catch (...) { + return false; + } + result = m_pCM_Get_Device_ID_List(DisplayGUID, + DeviceIDList.data(), + DeviceIDListSize, + CM_GETIDLIST_FILTER_CLASS | CM_GETIDLIST_FILTER_PRESENT); + + } while (result == CR_BUFFER_SMALL); + + if (result != CR_SUCCESS) { + return false; + } + + //Look for MediaSDK record + wchar_t *begin = DeviceIDList.data(); + wchar_t *end = begin + DeviceIDList.size(); + size_t len = 0; + + for (; (begin < end) && (len = wcslen(begin)) > 0; begin += len + 1) { + if (IsIntelDeviceInstanceID(begin)) { + mfxU32 curDeviceID = 0; + if (!ExctractDeviceID(begin, curDeviceID) || curDeviceID != deviceID) { + continue; + } + + result = m_pCM_Locate_DevNode(&DeviceInst, begin, CM_LOCATE_DEVNODE_NORMAL); + if (result != CR_SUCCESS) { + continue; + } + + HKEY hKey_sw; + result = m_pCM_Open_DevNode_Key(DeviceInst, + KEY_READ, + 0, + RegDisposition_OpenExisting, + &hKey_sw, + CM_REGISTRY_SOFTWARE); + if (result != CR_SUCCESS) { + continue; + } + + ULONG nError; + + DWORD pathSize = dwPathSize; + + nError = RegQueryValueExW(hKey_sw, driverKey, 0, NULL, (LPBYTE)path, &pathSize); + + RegCloseKey(hKey_sw); + + if (ERROR_SUCCESS == nError) { + if (pathwcslen(path) - 1 != '/' && pathwcslen(path) - 1 != '\\') { + wcscat_s(path, MFX_MAX_DLL_PATH, L"\\"); + } + DISPATCHER_LOG_INFO(("DriverStore path is found\n")); + return true; + } + } + } + + DISPATCHER_LOG_INFO(("DriverStore path isn't found\n")); + return false; + +} // bool DriverStoreLoader::GetDriverStorePath(wchar_t * path, DWORD dwPathSize, wchar_t *driverKey) + +bool DriverStoreLoader::LoadCfgMgr() { + if (!m_moduleCfgMgr) { + m_moduleCfgMgr = mfx_dll_load(L"cfgmgr32.dll"); + + if (!m_moduleCfgMgr) { + DISPATCHER_LOG_WRN(("cfgmgr32.dll couldn't be loaded\n")); + return false; + } + } + + return true; + +} // bool DriverStoreLoader::LoadCfgMgr() + +bool DriverStoreLoader::LoadCmFuncs() { + if (!m_pCM_Get_Device_ID_List || !m_pCM_Get_Device_ID_List_Size || !m_pCM_Locate_DevNode || + !m_pCM_Open_DevNode_Key) { + m_pCM_Get_Device_ID_List = + (Func_CM_Get_Device_ID_ListW)mfx_dll_get_addr((HMODULE)m_moduleCfgMgr, + "CM_Get_Device_ID_ListW"); + m_pCM_Get_Device_ID_List_Size = + (Func_CM_Get_Device_ID_List_SizeW)mfx_dll_get_addr((HMODULE)m_moduleCfgMgr, + "CM_Get_Device_ID_List_SizeW"); + m_pCM_Locate_DevNode = (Func_CM_Locate_DevNodeW)mfx_dll_get_addr((HMODULE)m_moduleCfgMgr, + "CM_Locate_DevNodeW"); + m_pCM_Open_DevNode_Key = (Func_CM_Open_DevNode_Key)mfx_dll_get_addr((HMODULE)m_moduleCfgMgr, + "CM_Open_DevNode_Key"); + + if (!m_pCM_Get_Device_ID_List || !m_pCM_Get_Device_ID_List_Size || !m_pCM_Locate_DevNode || + !m_pCM_Open_DevNode_Key) { + DISPATCHER_LOG_WRN(("One of cfgmgr32.dll function isn't found\n")); + return false; + } + } + + return true; + +} // bool DriverStoreLoader::LoadCmFuncs() + +} // namespace MFX
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_driver_store_loader.h
Added
@@ -0,0 +1,75 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_WINDOWS_MFX_DRIVER_STORE_LOADER_H_ +#define DISPATCHER_WINDOWS_MFX_DRIVER_STORE_LOADER_H_ + +#include <windows.h> + +#include <cfgmgr32.h> + +// support building in MinGW environments with older versions of cfgmgr32 +#ifdef __MINGW32__ + #if !defined(CM_GETIDLIST_FILTER_PRESENT) + #define CM_GETIDLIST_FILTER_PRESENT 0x00000100 + #endif + #if !defined(CM_GETIDLIST_FILTER_CLASS) + #define CM_GETIDLIST_FILTER_CLASS 0x00000200 + #endif +#endif + +#include <devguid.h> + +#include "windows/mfx_dispatcher_defs.h" + +namespace MFX { + +typedef CONFIGRET(WINAPI *Func_CM_Get_Device_ID_List_SizeW)(PULONG pulLen, + PCWSTR pszFilter, + ULONG ulFlags); +typedef CONFIGRET(WINAPI *Func_CM_Get_Device_ID_ListW)(PCWSTR pszFilter, + PZZWSTR Buffer, + ULONG BufferLen, + ULONG ulFlags); +typedef CONFIGRET(WINAPI *Func_CM_Locate_DevNodeW)(PDEVINST pdnDevInst, + DEVINSTID_W pDeviceID, + ULONG ulFlags); +typedef CONFIGRET(WINAPI *Func_CM_Open_DevNode_Key)(DEVINST dnDevNode, + REGSAM samDesired, + ULONG ulHardwareProfile, + REGDISPOSITION Disposition, + PHKEY phkDevice, + ULONG ulFlags); + +class DriverStoreLoader { +public: + DriverStoreLoader(void); + ~DriverStoreLoader(void); + + bool GetDriverStorePath(wchar_t *path, + DWORD dwPathSize, + mfxU32 deviceID, + const wchar_t *driverKey); + +protected: + bool LoadCfgMgr(); + bool LoadCmFuncs(); + + mfxModuleHandle m_moduleCfgMgr; + Func_CM_Get_Device_ID_List_SizeW m_pCM_Get_Device_ID_List_Size; + Func_CM_Get_Device_ID_ListW m_pCM_Get_Device_ID_List; + Func_CM_Locate_DevNodeW m_pCM_Locate_DevNode; + Func_CM_Open_DevNode_Key m_pCM_Open_DevNode_Key; + +private: + // unimplemented by intent to make this class non-copyable + DriverStoreLoader(const DriverStoreLoader &); + void operator=(const DriverStoreLoader &); +}; + +} // namespace MFX + +#endif // DISPATCHER_WINDOWS_MFX_DRIVER_STORE_LOADER_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_dxva2_device.cpp
Added
@@ -0,0 +1,553 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#define INITGUID +#include <d3d9.h> +#include <dxgi.h> + +#include "windows/mfx_dxva2_device.h" +#include "windows/mfx_load_dll.h" + +using namespace MFX; + +// convert LUID to mfxU64 +mfxU64 LUIDtomfxU64(LUID luid) { + return (((mfxU64)luid.HighPart << 32) | ((mfxU64)luid.LowPart)); +} + +DXDevice::DXDevice(void) { + m_hModule = (HMODULE)0; + + m_numAdapters = 0; + + m_vendorID = 0; + m_deviceID = 0; + m_driverVersion = 0; + m_luid = {}; + +} // DXDevice::DXDevice(void) + +DXDevice::~DXDevice(void) { + Close(); + + // free DX library only when device is destroyed + UnloadDLLModule(); + +} // DXDevice::~DXDevice(void) + +mfxU32 DXDevice::GetVendorID(void) const { + return m_vendorID; + +} // mfxU32 DXDevice::GetVendorID(void) const + +mfxU32 DXDevice::GetDeviceID(void) const { + return m_deviceID; + +} // mfxU32 DXDevice::GetDeviceID(void) const + +mfxU64 DXDevice::GetDriverVersion(void) const { + return m_driverVersion; + +} // mfxU64 DXDevice::GetDriverVersion(void) const + +mfxU64 DXDevice::GetLUID(void) const { + return m_luid; + +} // mfxU64 DXDevice::GetLUID(void) const + +mfxU32 DXDevice::GetAdapterCount(void) const { + return m_numAdapters; + +} // mfxU32 DXDevice::GetAdapterCount(void) const + +void DXDevice::Close(void) { + m_numAdapters = 0; + + m_vendorID = 0; + m_deviceID = 0; + m_luid = {}; + +} // void DXDevice::Close(void) + +void DXDevice::LoadDLLModule(const wchar_t *pModuleName) { + // unload the module if it is required + UnloadDLLModule(); + +#if !defined(MEDIASDK_UWP_DISPATCHER) + DWORD prevErrorMode = 0; + // set the silent error mode + #if (_WIN32_WINNT >= 0x0600) + SetThreadErrorMode(SEM_FAILCRITICALERRORS, &prevErrorMode); + #else + prevErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); + #endif +#endif // !defined(MEDIASDK_UWP_DISPATCHER) + + // load specified library + m_hModule = LoadLibraryExW(pModuleName, NULL, 0); + +#if !defined(MEDIASDK_UWP_DISPATCHER) + // set the previous error mode + #if (_WIN32_WINNT >= 0x0600) + SetThreadErrorMode(prevErrorMode, NULL); + #else + SetErrorMode(prevErrorMode); + #endif +#endif // !defined(MEDIASDK_UWP_DISPATCHER) + +} // void LoadDLLModule(const wchar_t *pModuleName) + +void DXDevice::UnloadDLLModule(void) { + if (m_hModule) { + FreeLibrary(m_hModule); + m_hModule = (HMODULE)0; + } + +} // void DXDevice::UnloaDLLdModule(void) + +#ifdef MFX_D3D9_ENABLED +D3D9Device::D3D9Device(void) { + m_pD3D9 = (void *)0; + m_pD3D9Ex = (void *)0; + +} // D3D9Device::D3D9Device(void) + +D3D9Device::~D3D9Device(void) { + Close(); + +} // D3D9Device::~D3D9Device(void) + +void D3D9Device::Close(void) { + // release the interfaces + if (m_pD3D9Ex) { + ((IDirect3D9Ex *)m_pD3D9Ex)->Release(); + } + + // release the interfaces + if (m_pD3D9) { + ((IDirect3D9 *)m_pD3D9)->Release(); + } + + m_pD3D9 = (void *)0; + m_pD3D9Ex = (void *)0; + +} // void D3D9Device::Close(void) + +typedef IDirect3D9 *(WINAPI *D3DCreateFunctionPtr_t)(UINT); + +typedef HRESULT(WINAPI *D3DExCreateFunctionPtr_t)(UINT, IDirect3D9Ex **); + +bool D3D9Device::Init(const mfxU32 adapterNum) { + // close the device before initialization + Close(); + + // load the library + if (NULL == m_hModule) { + LoadDLLModule(L"d3d9.dll"); + } + + if (m_hModule) { + D3DCreateFunctionPtr_t pFunc; + + // load address of procedure to create D3D device + pFunc = (D3DCreateFunctionPtr_t)GetProcAddress(m_hModule, "Direct3DCreate9"); + if (pFunc) { + D3DADAPTER_IDENTIFIER9 adapterIdent; + IDirect3D9 *pD3D9; + HRESULT hRes; + + // create D3D object + m_pD3D9 = pFunc(D3D_SDK_VERSION); + + if (NULL == m_pD3D9) { + DXVA2DEVICE_TRACE(("FAIL: Direct3DCreate9(%d) : GetLastError()=0x%x", + D3D_SDK_VERSION, + GetLastError())); + return false; + } + + // cast the interface + pD3D9 = (IDirect3D9 *)m_pD3D9; + + m_numAdapters = pD3D9->GetAdapterCount(); + if (adapterNum >= m_numAdapters) { + return false; + } + + // get the card's parameters + hRes = pD3D9->GetAdapterIdentifier(adapterNum, 0, &adapterIdent); + if (D3D_OK != hRes) { + DXVA2DEVICE_TRACE(("FAIL: GetAdapterIdentifier(%d) = 0x%x \n", adapterNum, hRes)); + return false; + } + + m_vendorID = adapterIdent.VendorId; + m_deviceID = adapterIdent.DeviceId; + m_driverVersion = (mfxU64)adapterIdent.DriverVersion.QuadPart; + + // load LUID + IDirect3D9Ex *pD3D9Ex; + D3DExCreateFunctionPtr_t pFuncEx; + LUID d3d9LUID; + + // find the appropriate function + pFuncEx = (D3DExCreateFunctionPtr_t)GetProcAddress(m_hModule, "Direct3DCreate9Ex"); + if (NULL == pFuncEx) { + // the extended interface is not supported + return true; + } + + // create extended interface + hRes = pFuncEx(D3D_SDK_VERSION, &pD3D9Ex); + if (FAILED(hRes)) { + // can't create extended interface + return true; + } + m_pD3D9Ex = pD3D9Ex; + + // obtain D3D9 device LUID + hRes = pD3D9Ex->GetAdapterLUID(adapterNum, &d3d9LUID); + if (FAILED(hRes)) { + // can't get LUID + return true; + } + // copy the LUID + m_luid = LUIDtomfxU64(d3d9LUID); + } + else { + DXVA2DEVICE_TRACE_OPERATION({ + wchar_t path1024; + DWORD lastErr = GetLastError(); + GetModuleFileNameW(m_hModule, path, sizeof(path) / sizeof(path0)); + DXVA2DEVICE_TRACE(( + "FAIL: invoking GetProcAddress(Direct3DCreate9) in %S : GetLastError()==0x%x\n", + path, + lastErr)); + }); + return false; + } + } + else { + DXVA2DEVICE_TRACE( + ("FAIL: invoking LoadLibrary(\"d3d9.dll\") : GetLastError()==0x%x\n", GetLastError())); + return false; + } + + return true; + +} // bool D3D9Device::Init(const mfxU32 adapterNum) +#endif //MFX_D3D9_ENABLED + +typedef HRESULT(WINAPI *DXGICreateFactoryFunc)(REFIID riid, void **ppFactory); + +DXGI1Device::DXGI1Device(void) { + m_pDXGIFactory1 = (void *)0; + m_pDXGIAdapter1 = (void *)0; + +} // DXGI1Device::DXGI1Device(void) + +DXGI1Device::~DXGI1Device(void) { + Close(); + +} // DXGI1Device::~DXGI1Device(void) + +void DXGI1Device::Close(void) { + // release the interfaces + if (m_pDXGIAdapter1) { + ((IDXGIAdapter1 *)m_pDXGIAdapter1)->Release(); + } + + if (m_pDXGIFactory1) { + ((IDXGIFactory1 *)m_pDXGIFactory1)->Release(); + } + + m_pDXGIFactory1 = (void *)0; + m_pDXGIAdapter1 = (void *)0; + +} // void DXGI1Device::Close(void) + +bool DXGI1Device::Init(const mfxU32 adapterNum) { + // release the object before initialization + Close(); + + IDXGIFactory1 *pFactory = NULL; + IDXGIAdapter1 *pAdapter = NULL; + DXGI_ADAPTER_DESC1 desc = { 0 }; + mfxU32 curAdapter = 0; + mfxU32 maxAdapters = 0; + HRESULT hRes = E_FAIL; + + DXGICreateFactoryFunc pFunc = NULL; + + // load up the library if it is not loaded + if (NULL == m_hModule) { + LoadDLLModule(L"dxgi.dll"); + } + + if (m_hModule) { + // load address of procedure to create DXGI 1.1 factory + pFunc = (DXGICreateFactoryFunc)GetProcAddress(m_hModule, "CreateDXGIFactory1"); + } + + if (NULL == pFunc) { + return false; + } + + // create the factory +#if _MSC_VER >= 1400 + hRes = pFunc(__uuidof(IDXGIFactory1), (void **)(&pFactory)); +#else + hRes = pFunc(IID_IDXGIFactory1, (void **)(&pFactory)); +#endif + + if (FAILED(hRes)) { + return false; + } + m_pDXGIFactory1 = pFactory; + + // get the number of adapters + curAdapter = 0; + maxAdapters = 0; + do { + // get the required adapted + hRes = pFactory->EnumAdapters1(curAdapter, &pAdapter); + if (FAILED(hRes)) { + break; + } + + // if it is the required adapter, save the interface + if (curAdapter == adapterNum) { + m_pDXGIAdapter1 = pAdapter; + } + else { + pAdapter->Release(); + } + + // get the next adapter + curAdapter += 1; + + } while (SUCCEEDED(hRes)); + maxAdapters = curAdapter; + + m_numAdapters = maxAdapters; + + // there is no required adapter + if (adapterNum >= maxAdapters) { + return false; + } + pAdapter = (IDXGIAdapter1 *)m_pDXGIAdapter1; + + // get the adapter's parameters + hRes = pAdapter->GetDesc1(&desc); + if (FAILED(hRes)) { + return false; + } + + // save the parameters + m_vendorID = desc.VendorId; + m_deviceID = desc.DeviceId; + m_luid = LUIDtomfxU64(desc.AdapterLuid); + + return true; + +} // bool DXGI1Device::Init(const mfxU32 adapterNum) + +bool DXGI1Device::GetAdapterList(std::vector<DXGI1DeviceInfo> &adapterInfo) { + mfxModuleHandle hModule = MFX::mfx_dll_load(L"dxgi.dll"); + if (!hModule) + return false; + + DXGICreateFactoryFunc pFactoryFunc = NULL; + pFactoryFunc = (DXGICreateFactoryFunc)MFX::mfx_dll_get_addr(hModule, "CreateDXGIFactory1"); + if (pFactoryFunc == NULL) + return false; + + IDXGIFactory1 *pFactory = NULL; + IDXGIAdapter1 *pAdapter = NULL; + + HRESULT hRes = pFactoryFunc(__uuidof(IDXGIFactory1), (void **)(&pFactory)); + if (FAILED(hRes)) + return false; + + bool bEnumSuccess = false; + mfxU32 curAdapter = 0; + while (pFactory->EnumAdapters1(curAdapter, &pAdapter) == S_OK) { + curAdapter++; + + DXGI_ADAPTER_DESC1 desc = {}; + DXGI1DeviceInfo devInfo = {}; + if (pAdapter->GetDesc1(&desc) == S_OK) { + // save minimal descriptive info + devInfo.vendorID = desc.VendorId; + devInfo.deviceID = desc.DeviceId; + devInfo.luid = LUIDtomfxU64(desc.AdapterLuid); + + // add to list + adapterInfo.emplace_back(devInfo); + + // at least one valid adapter found + bEnumSuccess = true; + } + + pAdapter->Release(); + } + pFactory->Release(); + + mfx_dll_free(hModule); + + return bEnumSuccess; +} + +DXVA2Device::DXVA2Device(void) { + m_numAdapters = 0; + + m_vendorID = 0; + m_deviceID = 0; + + m_driverVersion = 0; + + m_luid = {}; +} // DXVA2Device::DXVA2Device(void) + +DXVA2Device::~DXVA2Device(void) { + Close(); + +} // DXVA2Device::~DXVA2Device(void) + +void DXVA2Device::Close(void) { + m_numAdapters = 0; + + m_vendorID = 0; + m_deviceID = 0; + + m_driverVersion = 0; +} // void DXVA2Device::Close(void) + +#ifdef MFX_D3D9_ENABLED +bool DXVA2Device::InitD3D9(const mfxU32 adapterNum) { + D3D9Device d3d9Device; + bool bRes; + + // release the object before initialization + Close(); + + // create 'old fashion' device + bRes = d3d9Device.Init(adapterNum); + if (false == bRes) { + return false; + } + + m_numAdapters = d3d9Device.GetAdapterCount(); + + // check if the application is under Remote Desktop + if ((0 == d3d9Device.GetVendorID()) || (0 == d3d9Device.GetDeviceID())) { + // get the required parameters alternative way and ... + UseAlternativeWay(&d3d9Device); + } + else { + // save the parameters and ... + m_vendorID = d3d9Device.GetVendorID(); + m_deviceID = d3d9Device.GetDeviceID(); + m_driverVersion = d3d9Device.GetDriverVersion(); + m_luid = d3d9Device.GetLUID(); + } + + // ... say goodbye + return true; +} // bool InitD3D9(const mfxU32 adapterNum) +#else // MFX_D3D9_ENABLED +bool DXVA2Device::InitD3D9(const mfxU32 adapterNum) { + (void)adapterNum; + return false; +} +#endif // MFX_D3D9_ENABLED + +bool DXVA2Device::InitDXGI1(const mfxU32 adapterNum) { + DXGI1Device dxgi1Device; + bool bRes; + + // release the object before initialization + Close(); + + // create modern DXGI device + bRes = dxgi1Device.Init(adapterNum); + if (false == bRes) { + return false; + } + + // save the parameters and ... + m_vendorID = dxgi1Device.GetVendorID(); + m_deviceID = dxgi1Device.GetDeviceID(); + m_numAdapters = dxgi1Device.GetAdapterCount(); + m_luid = dxgi1Device.GetLUID(); + + // ... say goodbye + return true; + +} // bool DXVA2Device::InitDXGI1(const mfxU32 adapterNum) + +#ifdef MFX_D3D9_ENABLED +void DXVA2Device::UseAlternativeWay(const D3D9Device *pD3D9Device) { + mfxU64 d3d9LUID = pD3D9Device->GetLUID(); + mfxU64 kInvalidLUID = {}; + // work only with valid LUIDs + if (kInvalidLUID == d3d9LUID) { + return; + } + DXGI1Device dxgi1Device; + mfxU32 curDevice = 0; + bool bRes = false; + + do { + // initialize the next DXGI1 or DXGI device + bRes = dxgi1Device.Init(curDevice); + if (false == bRes) { + // there is no more devices + break; + } + + // is it required device ? + if (d3d9LUID == dxgi1Device.GetLUID()) { + m_vendorID = dxgi1Device.GetVendorID(); + m_deviceID = dxgi1Device.GetDeviceID(); + m_driverVersion = dxgi1Device.GetDriverVersion(); + m_luid = dxgi1Device.GetLUID(); + return; + } + + // get the next device + curDevice += 1; + + } while (bRes); + + dxgi1Device.Close(); + // we need to match a DXGI(1) device to the D3D9 device + +} // void DXVA2Device::UseAlternativeWay(const D3D9Device *pD3D9Device) +#endif // MFX_D3D9_ENABLED + +mfxU32 DXVA2Device::GetVendorID(void) const { + return m_vendorID; + +} // mfxU32 DXVA2Device::GetVendorID(void) const + +mfxU32 DXVA2Device::GetDeviceID(void) const { + return m_deviceID; + +} // mfxU32 DXVA2Device::GetDeviceID(void) const + +mfxU64 DXVA2Device::GetDriverVersion(void) const { + return m_driverVersion; +} // mfxU64 DXVA2Device::GetDriverVersion(void) const + +mfxU32 DXVA2Device::GetAdapterCount(void) const { + return m_numAdapters; + +} // mfxU32 DXVA2Device::GetAdapterCount(void) const + +mfxU64 DXVA2Device::GetLUID(void) const { + return m_luid; +} // mfxU64 DXVA2Device::GetLUID(void) const
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_dxva2_device.h
Added
@@ -0,0 +1,192 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_WINDOWS_MFX_DXVA2_DEVICE_H_ +#define DISPATCHER_WINDOWS_MFX_DXVA2_DEVICE_H_ + +#include <windows.h> + +#include <vector> + +#include "vpl/mfx_dispatcher_vpl.h" + +#define TOSTRING(L) #L +#define STRINGIFY(L) TOSTRING(L) + +#if defined(MEDIASDK_UWP_DISPATCHER) + #if defined(MFX_D3D9_ENABLED) && !defined(MFX_FORCE_D3D9_ENABLED) + #undef MFX_D3D9_ENABLED + #endif + #if defined(MFX_FORCE_D3D9_ENABLED) + #define MFX_D3D9_ENABLED + #endif +#else + #define MFX_D3D9_ENABLED +#endif + +#include "vpl/mfxdefs.h" + +#ifdef DXVA2DEVICE_LOG + #include <stdio.h> + #define DXVA2DEVICE_TRACE(expr) printf expr; + #define DXVA2DEVICE_TRACE_OPERATION(expr) expr; +#else + #define DXVA2DEVICE_TRACE(expr) + #define DXVA2DEVICE_TRACE_OPERATION(expr) +#endif + +namespace MFX { + +// compare LUIDs +inline bool operator==(const LUID &lhs, const LUID &rhs) { + return (lhs.LowPart == rhs.LowPart && lhs.HighPart == rhs.HighPart); +} + +class DXDevice { +public: + // Default constructor + DXDevice(void); + // Destructor + virtual ~DXDevice(void) = 0; + + // Initialize device using DXGI 1.1 or VAAPI interface + virtual bool Init(const mfxU32 adapterNum) = 0; + + // Obtain graphic card's parameter + mfxU32 GetVendorID(void) const; + mfxU32 GetDeviceID(void) const; + mfxU64 GetDriverVersion(void) const; + mfxU64 GetLUID(void) const; + + // Provide the number of available adapters + mfxU32 GetAdapterCount(void) const; + + // Close the object + virtual void Close(void); + + // Load the required DLL module + void LoadDLLModule(const wchar_t *pModuleName); + +protected: + // Free DLL module + void UnloadDLLModule(void); + + // Handle to the DLL library + HMODULE m_hModule; + + // Number of adapters available + mfxU32 m_numAdapters; + + // Vendor ID + mfxU32 m_vendorID; + // Device ID + mfxU32 m_deviceID; + // x.x.x.x each x of two bytes + mfxU64 m_driverVersion; + // LUID + mfxU64 m_luid; + +private: + // unimplemented by intent to make this class and its descendants non-copyable + DXDevice(const DXDevice &); + void operator=(const DXDevice &); +}; + +#ifdef MFX_D3D9_ENABLED +class D3D9Device : public DXDevice { +public: + // Default constructor + D3D9Device(void); + // Destructor + virtual ~D3D9Device(void); + + // Initialize device using D3D v9 interface + virtual bool Init(const mfxU32 adapterNum); + + // Close the object + virtual void Close(void); + +protected: + // Pointer to the D3D v9 interface + void *m_pD3D9; + // Pointer to the D3D v9 extended interface + void *m_pD3D9Ex; +}; +#endif // MFX_D3D9_ENABLED + +class DXGI1Device : public DXDevice { +public: + // Default constructor + DXGI1Device(void); + // Destructor + virtual ~DXGI1Device(void); + + // Initialize device + virtual bool Init(const mfxU32 adapterNum); + + // Close the object + virtual void Close(void); + + // lightweight method to get list of adapters + static bool GetAdapterList(std::vector<DXGI1DeviceInfo> &adapterInfo); + +protected: + // Pointer to the DXGI1 factory + void *m_pDXGIFactory1; + // Pointer to the current DXGI1 adapter + void *m_pDXGIAdapter1; +}; + +class DXVA2Device { +public: + // Default constructor + DXVA2Device(void); + // Destructor + ~DXVA2Device(void); + + // Initialize device using D3D v9 interface + bool InitD3D9(const mfxU32 adapterNum); + + // Initialize device using DXGI 1.1 interface + bool InitDXGI1(const mfxU32 adapterNum); + + // Obtain graphic card's parameter + mfxU32 GetVendorID(void) const; + mfxU32 GetDeviceID(void) const; + mfxU64 GetDriverVersion(void) const; + mfxU64 GetLUID(void) const; + + // Provide the number of available adapters + mfxU32 GetAdapterCount(void) const; + + void Close(void); + +protected: +#ifdef MFX_D3D9_ENABLED + // Get vendor & device IDs by alternative way (D3D9 in Remote Desktop sessions) + void UseAlternativeWay(const D3D9Device *pD3D9Device); +#endif // MFX_D3D9_ENABLED + // Number of adapters available + mfxU32 m_numAdapters; + + // Vendor ID + mfxU32 m_vendorID; + // Device ID + mfxU32 m_deviceID; + //x.x.x.x + mfxU64 m_driverVersion; + // LUID + mfxU64 m_luid; + +private: + // unimplemented by intent to make this class non-copyable + DXVA2Device(const DXVA2Device &); + void operator=(const DXVA2Device &); +}; + +} // namespace MFX + +#endif // DISPATCHER_WINDOWS_MFX_DXVA2_DEVICE_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_exposed_functions_list.h
Added
@@ -0,0 +1,159 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +// +// WARNING: +// this file doesn't contain an include guard by design. +// The file may be included into a source file many times. +// That is why this header doesn't contain any include directive. +// Please, do no try to fix it. +// +// NOLINT(build/header_guard) + +// Use define API_VERSION to set the API of functions listed further +// When new functions are added new section with functions declarations must be started with updated define + +// +// API version 1.0 functions +// + +// API version where a function is added. Minor value should precedes the major value +#define API_VERSION \ + { \ + { 0, 1 } \ + } + +// CORE interface functions +FUNCTION(mfxStatus, + MFXVideoCORE_SetFrameAllocator, + (mfxSession session, mfxFrameAllocator *allocator), + (session, allocator)) +FUNCTION(mfxStatus, + MFXVideoCORE_SetHandle, + (mfxSession session, mfxHandleType type, mfxHDL hdl), + (session, type, hdl)) +FUNCTION(mfxStatus, + MFXVideoCORE_GetHandle, + (mfxSession session, mfxHandleType type, mfxHDL *hdl), + (session, type, hdl)) + +FUNCTION(mfxStatus, + MFXVideoCORE_SyncOperation, + (mfxSession session, mfxSyncPoint syncp, mfxU32 wait), + (session, syncp, wait)) + +// ENCODE interface functions +FUNCTION(mfxStatus, + MFXVideoENCODE_Query, + (mfxSession session, mfxVideoParam *in, mfxVideoParam *out), + (session, in, out)) +FUNCTION(mfxStatus, + MFXVideoENCODE_QueryIOSurf, + (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request), + (session, par, request)) +FUNCTION(mfxStatus, MFXVideoENCODE_Init, (mfxSession session, mfxVideoParam *par), (session, par)) +FUNCTION(mfxStatus, MFXVideoENCODE_Reset, (mfxSession session, mfxVideoParam *par), (session, par)) +FUNCTION(mfxStatus, MFXVideoENCODE_Close, (mfxSession session), (session)) + +FUNCTION(mfxStatus, + MFXVideoENCODE_GetVideoParam, + (mfxSession session, mfxVideoParam *par), + (session, par)) +FUNCTION(mfxStatus, + MFXVideoENCODE_GetEncodeStat, + (mfxSession session, mfxEncodeStat *stat), + (session, stat)) +FUNCTION(mfxStatus, + MFXVideoENCODE_EncodeFrameAsync, + (mfxSession session, + mfxEncodeCtrl *ctrl, + mfxFrameSurface1 *surface, + mfxBitstream *bs, + mfxSyncPoint *syncp), + (session, ctrl, surface, bs, syncp)) + +// DECODE interface functions +FUNCTION(mfxStatus, + MFXVideoDECODE_Query, + (mfxSession session, mfxVideoParam *in, mfxVideoParam *out), + (session, in, out)) +FUNCTION(mfxStatus, + MFXVideoDECODE_DecodeHeader, + (mfxSession session, mfxBitstream *bs, mfxVideoParam *par), + (session, bs, par)) +FUNCTION(mfxStatus, + MFXVideoDECODE_QueryIOSurf, + (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request), + (session, par, request)) +FUNCTION(mfxStatus, MFXVideoDECODE_Init, (mfxSession session, mfxVideoParam *par), (session, par)) +FUNCTION(mfxStatus, MFXVideoDECODE_Reset, (mfxSession session, mfxVideoParam *par), (session, par)) +FUNCTION(mfxStatus, MFXVideoDECODE_Close, (mfxSession session), (session)) + +FUNCTION(mfxStatus, + MFXVideoDECODE_GetVideoParam, + (mfxSession session, mfxVideoParam *par), + (session, par)) +FUNCTION(mfxStatus, + MFXVideoDECODE_GetDecodeStat, + (mfxSession session, mfxDecodeStat *stat), + (session, stat)) +FUNCTION(mfxStatus, + MFXVideoDECODE_SetSkipMode, + (mfxSession session, mfxSkipMode mode), + (session, mode)) +FUNCTION(mfxStatus, + MFXVideoDECODE_GetPayload, + (mfxSession session, mfxU64 *ts, mfxPayload *payload), + (session, ts, payload)) +FUNCTION(mfxStatus, + MFXVideoDECODE_DecodeFrameAsync, + (mfxSession session, + mfxBitstream *bs, + mfxFrameSurface1 *surface_work, + mfxFrameSurface1 **surface_out, + mfxSyncPoint *syncp), + (session, bs, surface_work, surface_out, syncp)) + +// VPP interface functions +FUNCTION(mfxStatus, + MFXVideoVPP_Query, + (mfxSession session, mfxVideoParam *in, mfxVideoParam *out), + (session, in, out)) +FUNCTION(mfxStatus, + MFXVideoVPP_QueryIOSurf, + (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request), + (session, par, request)) +FUNCTION(mfxStatus, MFXVideoVPP_Init, (mfxSession session, mfxVideoParam *par), (session, par)) +FUNCTION(mfxStatus, MFXVideoVPP_Reset, (mfxSession session, mfxVideoParam *par), (session, par)) +FUNCTION(mfxStatus, MFXVideoVPP_Close, (mfxSession session), (session)) + +FUNCTION(mfxStatus, + MFXVideoVPP_GetVideoParam, + (mfxSession session, mfxVideoParam *par), + (session, par)) +FUNCTION(mfxStatus, MFXVideoVPP_GetVPPStat, (mfxSession session, mfxVPPStat *stat), (session, stat)) +FUNCTION(mfxStatus, + MFXVideoVPP_RunFrameVPPAsync, + (mfxSession session, + mfxFrameSurface1 *in, + mfxFrameSurface1 *out, + mfxExtVppAuxData *aux, + mfxSyncPoint *syncp), + (session, in, out, aux, syncp)) + +#undef API_VERSION + +#define API_VERSION \ + { \ + { 19, 1 } \ + } + +FUNCTION(mfxStatus, + MFXVideoCORE_QueryPlatform, + (mfxSession session, mfxPlatform *platform), + (session, platform)) + +#undef API_VERSION
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_function_table.cpp
Added
@@ -0,0 +1,110 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include "windows/mfx_dispatcher.h" + +// +// implement a table with functions names +// +#ifdef __GNUC__ + #pragma GCC diagnostic ignored "-Wunused-function" +#endif + +#undef FUNCTION +#define FUNCTION(return_value, func_name, formal_param_list, actual_param_list) \ + { #func_name, API_VERSION }, + +const FUNCTION_DESCRIPTION APIFunceVideoFuncTotal = { + { "MFXInit", { { 0, 1 } } }, { "MFXClose", { { 0, 1 } } }, + { "MFXQueryIMPL", { { 0, 1 } } }, { "MFXQueryVersion", { { 0, 1 } } }, + + { "MFXJoinSession", { { 1, 1 } } }, { "MFXDisjoinSession", { { 1, 1 } } }, + { "MFXCloneSession", { { 1, 1 } } }, { "MFXSetPriority", { { 1, 1 } } }, + { "MFXGetPriority", { { 1, 1 } } }, + + { "MFXInitEx", { { 14, 1 } } }, + +#include "windows/mfx_exposed_functions_list.h" +}; + +// new functions for API >= 2.0 +const FUNCTION_DESCRIPTION APIVideoFunc2eVideoFunc2Total = { + { "MFXQueryImplsDescription", { { 0, 2 } } }, + { "MFXReleaseImplDescription", { { 0, 2 } } }, + { "MFXMemory_GetSurfaceForVPP", { { 0, 2 } } }, + { "MFXMemory_GetSurfaceForEncode", { { 0, 2 } } }, + { "MFXMemory_GetSurfaceForDecode", { { 0, 2 } } }, + { "MFXInitialize", { { 0, 2 } } }, + + { "MFXMemory_GetSurfaceForVPPOut", { { 1, 2 } } }, + { "MFXVideoDECODE_VPP_Init", { { 1, 2 } } }, + { "MFXVideoDECODE_VPP_DecodeFrameAsync", { { 1, 2 } } }, + { "MFXVideoDECODE_VPP_Reset", { { 1, 2 } } }, + { "MFXVideoDECODE_VPP_GetChannelParam", { { 1, 2 } } }, + { "MFXVideoDECODE_VPP_Close", { { 1, 2 } } }, + { "MFXVideoVPP_ProcessFrameAsync", { { 1, 2 } } }, +}; + +// static section of the file +namespace { + +// +// declare pseudo-functions. +// they are used as default values for call-tables. +// + +mfxStatus pseudoMFXInit(mfxIMPL impl, mfxVersion *ver, mfxSession *session) { + // touch unreferenced parameters + (void)impl; + (void)ver; + (void)session; + + return MFX_ERR_UNKNOWN; + +} // mfxStatus pseudoMFXInit(mfxIMPL impl, mfxVersion *ver, mfxSession *session) + +mfxStatus pseudoMFXClose(mfxSession session) { + // touch unreferenced parameters + (void)session; + + return MFX_ERR_UNKNOWN; + +} // mfxStatus pseudoMFXClose(mfxSession session) + +mfxStatus pseudoMFXJoinSession(mfxSession session, mfxSession child_session) { + // touch unreferenced parameters + (void)session; + (void)child_session; + + return MFX_ERR_UNKNOWN; + +} // mfxStatus pseudoMFXJoinSession(mfxSession session, mfxSession child_session) + +mfxStatus pseudoMFXCloneSession(mfxSession session, mfxSession *clone) { + // touch unreferenced parameters + (void)session; + (void)clone; + + return MFX_ERR_UNKNOWN; + +} // mfxStatus pseudoMFXCloneSession(mfxSession session, mfxSession *clone) + +void SuppressWarnings(...) { + // this functions is suppose to suppress warnings. + // Actually it does nothing. + +} // void SuppressWarnings(...) + +#undef FUNCTION +#define FUNCTION(return_value, func_name, formal_param_list, actual_param_list) \ + return_value pseudo##func_name formal_param_list { \ + SuppressWarnings actual_param_list; \ + return MFX_ERR_UNKNOWN; \ + } + +#include "windows/mfx_exposed_functions_list.h" // NOLINT(build/include) + +} // namespace
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_library_iterator.cpp
Added
@@ -0,0 +1,646 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include "windows/mfx_library_iterator.h" + +#include "windows/mfx_dispatcher.h" +#include "windows/mfx_dispatcher_log.h" + +#include "windows/mfx_dxva2_device.h" +#include "windows/mfx_load_dll.h" + +#include <tchar.h> +#include <windows.h> + +#include <vector> + +namespace MFX { + +enum { MFX_MAX_MERIT = 0x7fffffff }; + +// +// declare registry keys +// + +const wchar_t rootDispPath = L"Software\\Intel\\MediaSDK\\Dispatch"; +const wchar_t vendorIDKeyName = L"VendorID"; +const wchar_t deviceIDKeyName = L"DeviceID"; +const wchar_t meritKeyName = L"Merit"; +const wchar_t pathKeyName = L"Path"; +const wchar_t apiVersionName = L"APIVersion"; + +mfxStatus SelectImplementationType(const mfxU32 adapterNum, + mfxIMPL *pImplInterface, + mfxU32 *pVendorID, + mfxU32 *pDeviceID, + mfxU64 *pLUID) { + if (NULL == pImplInterface) { + return MFX_ERR_NULL_PTR; + } + mfxIMPL impl_via = *pImplInterface; + + DXVA2Device dxvaDevice; + if (MFX_IMPL_VIA_D3D9 == impl_via) { + // try to create the Direct3D 9 device and find right adapter + if (!dxvaDevice.InitD3D9(adapterNum)) { + DISPATCHER_LOG_INFO((("dxvaDevice.InitD3D9(%d) Failed "), adapterNum)); + return MFX_ERR_UNSUPPORTED; + } + } + else if (MFX_IMPL_VIA_D3D11 == impl_via) { + // try to open DXGI 1.1 device to get hardware ID + if (!dxvaDevice.InitDXGI1(adapterNum)) { + DISPATCHER_LOG_INFO((("dxvaDevice.InitDXGI1(%d) Failed "), adapterNum)); + return MFX_ERR_UNSUPPORTED; + } + } + else if (MFX_IMPL_VIA_ANY == impl_via) { + // try the Direct3D 9 device + if (dxvaDevice.InitD3D9(adapterNum)) { + *pImplInterface = MFX_IMPL_VIA_D3D9; // store value for GetImplementationType() call + } + // else try to open DXGI 1.1 device to get hardware ID + else if (dxvaDevice.InitDXGI1(adapterNum)) { + *pImplInterface = MFX_IMPL_VIA_D3D11; // store value for GetImplementationType() call + } + else { + DISPATCHER_LOG_INFO((("Unsupported adapter %d "), adapterNum)); + return MFX_ERR_UNSUPPORTED; + } + } + else { + DISPATCHER_LOG_ERROR((("Unknown implementation type %d "), *pImplInterface)); + return MFX_ERR_UNSUPPORTED; + } + + // obtain card's parameters + if (pVendorID && pDeviceID) { + *pVendorID = dxvaDevice.GetVendorID(); + *pDeviceID = dxvaDevice.GetDeviceID(); + } + + if (pLUID) { + *pLUID = dxvaDevice.GetLUID(); + } + + return MFX_ERR_NONE; +} + +mfxStatus SelectImplementationType(const mfxU32 adapterNum, + mfxIMPL *pImplInterface, + mfxU32 *pVendorID, + mfxU32 *pDeviceID) { + // do not return LUID + return SelectImplementationType(adapterNum, pImplInterface, pVendorID, pDeviceID, nullptr); +} + +MFXLibraryIterator::MFXLibraryIterator(void) +#if !defined(MEDIASDK_UWP_DISPATCHER) + : m_baseRegKey() +#endif +{ + m_implType = MFX_LIB_PSEUDO; + m_implInterface = MFX_IMPL_UNSUPPORTED; + + m_vendorID = 0; + m_deviceID = 0; + + m_lastLibIndex = 0; + m_lastLibMerit = MFX_MAX_MERIT; + + m_bIsSubKeyValid = 0; + m_StorageID = 0; + + m_SubKeyName0 = 0; + m_driverStoreDir0 = 0; +} // MFXLibraryIterator::MFXLibraryIterator(void) + +MFXLibraryIterator::~MFXLibraryIterator(void) { + Release(); + +} // MFXLibraryIterator::~MFXLibraryIterator(void) + +void MFXLibraryIterator::Release(void) { + m_implType = MFX_LIB_PSEUDO; + m_implInterface = MFX_IMPL_UNSUPPORTED; + + m_vendorID = 0; + m_deviceID = 0; + + m_lastLibIndex = 0; + m_lastLibMerit = MFX_MAX_MERIT; + m_SubKeyName0 = 0; + +} // void MFXLibraryIterator::Release(void) + +DECLSPEC_NOINLINE HMODULE GetThisDllModuleHandle() { + HMODULE hDll = NULL; + + GetModuleHandleExW( + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + reinterpret_cast<LPCWSTR>(&GetThisDllModuleHandle), + &hDll); + return hDll; +} + +// wchar_t* sImplPath must be allocated with size not less then msdk_disp_path_len +bool GetImplPath(int storageID, wchar_t *sImplPath) { + HMODULE hModule = NULL; + + sImplPath0 = L'\0'; + + switch (storageID) { + case MFX_APP_FOLDER: + hModule = 0; + break; + case MFX_PATH_MSDK_FOLDER: + hModule = GetThisDllModuleHandle(); + HMODULE exeModule = GetModuleHandleW(NULL); + //It should works only if Dispatcher is linked with Dynamic Linked Library + if (!hModule || !exeModule || hModule == exeModule) + return false; + break; + } + + DWORD nSize = 0; + DWORD allocSize = msdk_disp_path_len; + + nSize = GetModuleFileNameW(hModule, &sImplPath0, allocSize); + + if (nSize == 0 || nSize == allocSize) { + // nSize == 0 meanse that system can't get this info for hModule + // nSize == allocSize buffer is too small + return false; + } + + // for any case because WinXP implementation of GetModuleFileName does not add \0 to the end of string + sImplPathnSize = L'\0'; + + wchar_t *dirSeparator = wcsrchr(sImplPath, L'\\'); + if (dirSeparator != NULL && dirSeparator < (sImplPath + msdk_disp_path_len)) { + *++dirSeparator = 0; + } + return true; +} + +mfxStatus MFXLibraryIterator::Init(eMfxImplType implType, + mfxIMPL implInterface, + const mfxU32 adapterNum, + int storageID) { + // check error(s) + if ((MFX_LIB_SOFTWARE != implType) && (MFX_LIB_HARDWARE != implType)) { + return MFX_ERR_UNSUPPORTED; + } + + // release the object before initialization + Release(); + m_StorageID = storageID; + m_lastLibIndex = 0; + m_implType = implType; + m_implInterface = implInterface != 0 ? implInterface : MFX_IMPL_VIA_ANY; + + // for HW impl check impl interface, check adapter, obtain deviceID and vendorID + if (m_implType != MFX_LIB_SOFTWARE) { + mfxStatus mfxRes = + MFX::SelectImplementationType(adapterNum, &m_implInterface, &m_vendorID, &m_deviceID); + if (MFX_ERR_NONE != mfxRes) { + return mfxRes; + } + } + +#if !defined(MEDIASDK_UWP_DISPATCHER) + if (storageID == MFX_CURRENT_USER_KEY || storageID == MFX_LOCAL_MACHINE_KEY || + storageID == MFX_CURRENT_USER_KEY_ONEVPL || storageID == MFX_LOCAL_MACHINE_KEY_ONEVPL) { + return InitRegistry(storageID); + } + + #if defined(MFX_TRACER_WA_FOR_DS) + if (storageID == MFX_TRACER) { + return InitRegistryTracer(); + } + #endif + +#endif + if (storageID == MFX_DRIVER_STORE) { + m_driverStoreDir0 = 0; + if (!m_driverStoreLoader.GetDriverStorePath(m_driverStoreDir, + sizeof(m_driverStoreDir), + m_deviceID, + L"DriverStorePathForMediaSDK")) { + return MFX_ERR_UNSUPPORTED; + } + } + else if (storageID == MFX_DRIVER_STORE_ONEVPL || storageID == MFX_DRIVER_STORE_ONEVPL_MFXINIT) { + // get path to runtime directory only (without library name) + m_driverStoreDir0 = 0; + if (!m_driverStoreLoader.GetDriverStorePath(m_driverStoreDir, + sizeof(m_driverStoreDir), + m_deviceID, + L"DriverStorePathForVPL")) { + return MFX_ERR_UNSUPPORTED; + } + } + else if (!GetImplPath(storageID, m_driverStoreDir)) { + return MFX_ERR_UNSUPPORTED; + } + + // only need the path for oneVPL loader + if (storageID == MFX_DRIVER_STORE_ONEVPL || storageID == MFX_CURRENT_USER_KEY_ONEVPL || + storageID == MFX_LOCAL_MACHINE_KEY_ONEVPL) { + return MFX_ERR_NONE; + } + + return InitFolder(implType, m_driverStoreDir, storageID); + +} // mfxStatus MFXLibraryIterator::Init(eMfxImplType implType, const mfxU32 adapterNum, int storageID) + +mfxStatus MFXLibraryIterator::InitRegistry(int storageID) { +#if !defined(MEDIASDK_UWP_DISPATCHER) + HKEY rootHKey; + bool bRes; + + // open required registry key + switch (storageID) { + case MFX_LOCAL_MACHINE_KEY: + case MFX_LOCAL_MACHINE_KEY_ONEVPL: + rootHKey = HKEY_LOCAL_MACHINE; + break; + default: + rootHKey = HKEY_CURRENT_USER; + break; + } + + bRes = m_baseRegKey.Open(rootHKey, rootDispPath, KEY_READ); + if (false == bRes) { + DISPATCHER_LOG_WRN( + (("Can't open %s\\%S : RegOpenKeyExA()==0x%x\n"), + (MFX_LOCAL_MACHINE_KEY == storageID) ? ("HKEY_LOCAL_MACHINE") : ("HKEY_CURRENT_USER"), + rootDispPath, + GetLastError())) + return MFX_ERR_UNKNOWN; + } + + DISPATCHER_LOG_INFO( + (("Inspecting %s\\%S\n"), + (MFX_LOCAL_MACHINE_KEY == storageID) ? ("HKEY_LOCAL_MACHINE") : ("HKEY_CURRENT_USER"), + rootDispPath)) + + return MFX_ERR_NONE; +#else + (void)storageID; + return MFX_ERR_UNSUPPORTED; +#endif // #if !defined(MEDIASDK_UWP_DISPATCHER) + +} // mfxStatus MFXLibraryIterator::InitRegistry(int storageID) + +#if defined(MFX_TRACER_WA_FOR_DS) +mfxStatus MFXLibraryIterator::InitRegistryTracer() { + #if !defined(MEDIASDK_UWP_DISPATCHER) + + const wchar_t tracerRegKeyPath = L"Software\\Intel\\MediaSDK\\Dispatch\\tracer"; + + if (!m_baseRegKey.Open(HKEY_LOCAL_MACHINE, tracerRegKeyPath, KEY_READ) && + !m_baseRegKey.Open(HKEY_CURRENT_USER, tracerRegKeyPath, KEY_READ)) { + DISPATCHER_LOG_WRN(("can't find tracer registry key\n")) + return MFX_ERR_UNKNOWN; + } + + DISPATCHER_LOG_INFO(("found tracer registry key\n")) + return MFX_ERR_NONE; + + #else + return MFX_ERR_UNSUPPORTED; + #endif // #if !defined(MEDIASDK_UWP_DISPATCHER) + +} // mfxStatus MFXLibraryIterator::InitRegistryTracer() +#endif + +mfxStatus MFXLibraryIterator::InitFolder(eMfxImplType implType, + const wchar_t *path, + const int storageID) { + const int maxPathLen = sizeof(m_path) / sizeof(m_path0); + m_path0 = 0; + wcscpy_s(m_path, maxPathLen, path); + size_t pathLen = wcslen(m_path); + + if (storageID == MFX_APP_FOLDER) { + // we looking for runtime in application folder, it should be named libmfxsw64 or libmfxsw32 + mfx_get_default_dll_name(m_path + pathLen, msdk_disp_path_len - pathLen, MFX_LIB_SOFTWARE); + } + else if (storageID == MFX_DRIVER_STORE_ONEVPL_MFXINIT) { + mfx_get_default_onevpl_dll_name(m_path + pathLen, msdk_disp_path_len - pathLen); + } + else { + mfx_get_default_dll_name(m_path + pathLen, msdk_disp_path_len - pathLen, implType); + } + + return MFX_ERR_NONE; +} // mfxStatus MFXLibraryIterator::InitFolder(eMfxImplType implType, const wchar_t * path, const int storageID) + +mfxStatus MFXLibraryIterator::SelectDLLVersion(wchar_t *pPath, + size_t pathSize, + eMfxImplType *pImplType, + mfxVersion minVersion) { + UNREFERENCED_PARAMETER(minVersion); + + if (m_StorageID == MFX_APP_FOLDER) { + if (m_lastLibIndex != 0) + return MFX_ERR_NOT_FOUND; + if (m_vendorID != INTEL_VENDOR_ID) + return MFX_ERR_UNKNOWN; + + m_lastLibIndex = 1; + wcscpy_s(pPath, pathSize, m_path); + *pImplType = MFX_LIB_SOFTWARE; + return MFX_ERR_NONE; + } + + if (m_StorageID == MFX_PATH_MSDK_FOLDER || m_StorageID == MFX_DRIVER_STORE || + m_StorageID == MFX_DRIVER_STORE_ONEVPL_MFXINIT) { + if (m_lastLibIndex != 0) + return MFX_ERR_NOT_FOUND; + if (m_vendorID != INTEL_VENDOR_ID) + return MFX_ERR_UNKNOWN; + + m_lastLibIndex = 1; + wcscpy_s(pPath, pathSize, m_path); + // do not change impl type + return MFX_ERR_NONE; + } + +#if !defined(MEDIASDK_UWP_DISPATCHER) + + #if defined(MFX_TRACER_WA_FOR_DS) + if (m_StorageID == MFX_TRACER) { + if (m_lastLibIndex != 0) + return MFX_ERR_NOT_FOUND; + if (m_vendorID != INTEL_VENDOR_ID) + return MFX_ERR_UNKNOWN; + + m_lastLibIndex = 1; + + if (m_baseRegKey.Query(pathKeyName, REG_SZ, (LPBYTE)pPath, (DWORD *)&pathSize)) { + DISPATCHER_LOG_INFO((("loaded %S : %S\n"), pathKeyName, pPath)); + } + else { + DISPATCHER_LOG_WRN( + (("error querying %S : RegQueryValueExA()==0x%x\n"), pathKeyName, GetLastError())); + } + return MFX_ERR_NONE; + } + #endif + + wchar_t libPathMFX_MAX_DLL_PATH = L""; + DWORD libIndex = 0; + DWORD libMerit = 0; + DWORD index; + bool enumRes; + + // main query cycle + index = 0; + m_bIsSubKeyValid = false; + do { + WinRegKey subKey; + wchar_t subKeyNameMFX_MAX_REGISTRY_KEY_NAME = { 0 }; + DWORD subKeyNameSize = sizeof(subKeyName) / sizeof(subKeyName0); + + // query next value name + enumRes = m_baseRegKey.EnumKey(index, subKeyName, &subKeyNameSize); + if (!enumRes) { + DISPATCHER_LOG_WRN((("no more subkeys : RegEnumKeyExA()==0x%x\n"), GetLastError())) + } + else { + DISPATCHER_LOG_INFO((("found subkey: %S\n"), subKeyName)) + + bool bRes; + + // open the sub key + bRes = subKey.Open(m_baseRegKey, subKeyName, KEY_READ); + if (!bRes) { + DISPATCHER_LOG_WRN((("error opening key %S :RegOpenKeyExA()==0x%x\n"), + subKeyName, + GetLastError())); + } + else { + DISPATCHER_LOG_INFO((("opened key: %S\n"), subKeyName)); + + mfxU32 vendorID = 0, deviceID = 0, merit = 0; + DWORD size; + + // query vendor and device IDs + size = sizeof(vendorID); + bRes = subKey.Query(vendorIDKeyName, REG_DWORD, (LPBYTE)&vendorID, &size); + DISPATCHER_LOG_OPERATION({ + if (bRes) { + DISPATCHER_LOG_INFO((("loaded %S : 0x%x\n"), vendorIDKeyName, vendorID)); + } + else { + DISPATCHER_LOG_WRN((("querying %S : RegQueryValueExA()==0x%x\n"), + vendorIDKeyName, + GetLastError())); + } + }) + + if (bRes) { + size = sizeof(deviceID); + bRes = subKey.Query(deviceIDKeyName, REG_DWORD, (LPBYTE)&deviceID, &size); + DISPATCHER_LOG_OPERATION({ + if (bRes) { + DISPATCHER_LOG_INFO( + (("loaded %S : 0x%x\n"), deviceIDKeyName, deviceID)); + } + else { + DISPATCHER_LOG_WRN((("querying %S : RegQueryValueExA()==0x%x\n"), + deviceIDKeyName, + GetLastError())); + } + }) + } + // query merit value + if (bRes) { + size = sizeof(merit); + bRes = subKey.Query(meritKeyName, REG_DWORD, (LPBYTE)&merit, &size); + DISPATCHER_LOG_OPERATION({ + if (bRes) { + DISPATCHER_LOG_INFO((("loaded %S : %d\n"), meritKeyName, merit)); + } + else { + DISPATCHER_LOG_WRN((("querying %S : RegQueryValueExA()==0x%x\n"), + meritKeyName, + GetLastError())); + } + }) + } + + // if the library fits required parameters, + // query the library's path + if (bRes) { + // compare device's and library's IDs + if (MFX_LIB_HARDWARE == m_implType) { + if (m_vendorID != vendorID) { + bRes = false; + DISPATCHER_LOG_WRN((("%S conflict, actual = 0x%x : required = 0x%x\n"), + vendorIDKeyName, + m_vendorID, + vendorID)); + } + if (bRes && m_deviceID != deviceID) { + bRes = false; + DISPATCHER_LOG_WRN((("%S conflict, actual = 0x%x : required = 0x%x\n"), + deviceIDKeyName, + m_deviceID, + deviceID)); + } + } + + DISPATCHER_LOG_OPERATION({ + if (bRes) { + if (!(((m_lastLibMerit > merit) || + ((m_lastLibMerit == merit) && (m_lastLibIndex < index))) && + (libMerit < merit))) { + DISPATCHER_LOG_WRN(( + ("merit conflict: lastMerit = 0x%x, requiredMerit = 0x%x, libraryMerit = 0x%x, lastindex = %d, index = %d\n"), + m_lastLibMerit, + merit, + libMerit, + m_lastLibIndex, + index)); + } + } + }) + + if ((bRes) && + ((m_lastLibMerit > merit) || + ((m_lastLibMerit == merit) && (m_lastLibIndex < index))) && + (libMerit < merit)) { + wchar_t tmpPathMFX_MAX_DLL_PATH; + DWORD tmpPathSize = sizeof(tmpPath); + + bRes = subKey.Query(pathKeyName, REG_SZ, (LPBYTE)tmpPath, &tmpPathSize); + if (!bRes) { + DISPATCHER_LOG_WRN((("error querying %S : RegQueryValueExA()==0x%x\n"), + pathKeyName, + GetLastError())); + } + else { + DISPATCHER_LOG_INFO((("loaded %S : %S\n"), pathKeyName, tmpPath)); + + wcscpy_s(libPath, sizeof(libPath) / sizeof(libPath0), tmpPath); + wcscpy_s(m_SubKeyName, + sizeof(m_SubKeyName) / sizeof(m_SubKeyName0), + subKeyName); + + libMerit = merit; + libIndex = index; + + // set the library's type + if ((0 == vendorID) || (0 == deviceID)) { + *pImplType = MFX_LIB_SOFTWARE; + DISPATCHER_LOG_INFO((("Library type is MFX_LIB_SOFTWARE\n"))); + } + else { + *pImplType = MFX_LIB_HARDWARE; + DISPATCHER_LOG_INFO((("Library type is MFX_LIB_HARDWARE\n"))); + } + } + } + } + } + } + + // advance key index + index += 1; + + } while (enumRes); + + // if the library's path was successfully read, + // the merit variable holds valid value + if (0 == libMerit) { + return MFX_ERR_NOT_FOUND; + } + + wcscpy_s(pPath, pathSize, libPath); + + m_lastLibIndex = libIndex; + m_lastLibMerit = libMerit; + m_bIsSubKeyValid = true; + +#endif + + return MFX_ERR_NONE; + +} // mfxStatus MFXLibraryIterator::SelectDLLVersion(wchar_t *pPath, size_t pathSize, eMfxImplType *pImplType, mfxVersion minVersion) + +mfxIMPL MFXLibraryIterator::GetImplementationType() { + return m_implInterface; +} // mfxIMPL MFXLibraryIterator::GetImplementationType() + +bool MFXLibraryIterator::GetSubKeyName(wchar_t *subKeyName, size_t length) const { + wcscpy_s(subKeyName, length, m_SubKeyName); + return m_bIsSubKeyValid; +} + +// lightweight implementation that takes deviceID as an argument, avoiding need to init the adapter +mfxStatus MFXLibraryIterator::GetDriverStoreDir(std::wstring &driverStoreDir, + size_t length, + mfxU32 deviceID, + int storageID) { + wchar_t wcDirMFX_MAX_DLL_PATH; + wcDir0 = 0; + + DriverStoreLoader dsLoader; + + if (storageID == MFX_DRIVER_STORE_ONEVPL) { + // pass size of wcDir in bytes (see implementation of GetDriverStorePath) + if (!dsLoader.GetDriverStorePath(wcDir, sizeof(wcDir), deviceID, L"DriverStorePathForVPL")) + return MFX_ERR_UNSUPPORTED; + } + else if (storageID == MFX_DRIVER_STORE) { + if (!dsLoader.GetDriverStorePath(wcDir, + sizeof(wcDir), + deviceID, + L"DriverStorePathForMediaSDK")) + return MFX_ERR_UNSUPPORTED; + } + + if (wcslen(wcDir) == 0) + return MFX_ERR_UNSUPPORTED; + + // return path to driverStorDir + driverStoreDir = wcDir; + + return MFX_ERR_NONE; +} + +mfxStatus MFXLibraryIterator::GetRegkeyDir(std::wstring ®Dir, size_t length, int storageID) { + mfxStatus sts = MFX_ERR_UNSUPPORTED; + MFX::MFXLibraryIterator libIterator; + wchar_t wRegDirMFX_MAX_DLL_PATH; + + regDir.clear(); + sts = libIterator.Init(MFX_LIB_HARDWARE, MFX_IMPL_VIA_D3D11, 0, storageID); + if (sts) + return MFX_ERR_UNSUPPORTED; + + eMfxImplType implType = MFX_LIB_HARDWARE; + mfxVersion ver = { 0, 1 }; + sts = + libIterator.SelectDLLVersion(wRegDir, sizeof(wRegDir) / sizeof(wRegDir0), &implType, ver); + if (sts) + return MFX_ERR_UNSUPPORTED; + + // remove DLL name - only need the path + std::wstring s = wRegDir; + size_t f = s.find_last_of('\\'); + if (f == std::string::npos) + return MFX_ERR_UNSUPPORTED; + + regDir = s.substr(0, f); + + return MFX_ERR_NONE; +} + +} // namespace MFX
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_library_iterator.h
Added
@@ -0,0 +1,145 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_WINDOWS_MFX_LIBRARY_ITERATOR_H_ +#define DISPATCHER_WINDOWS_MFX_LIBRARY_ITERATOR_H_ + +#include <string> + +#include "vpl/mfxvideo.h" + +#if !defined(MEDIASDK_UWP_DISPATCHER) + #include "mfx_win_reg_key.h" +#endif + +#include "windows/mfx_dispatcher.h" +#include "windows/mfx_driver_store_loader.h" + +namespace MFX { + +// declare desired storage ID +enum { +#if defined(MFX_TRACER_WA_FOR_DS) + MFX_UNKNOWN_KEY = -1, + MFX_TRACER = 0, + MFX_DRIVER_STORE_ONEVPL_MFXINIT = 1, + MFX_DRIVER_STORE = 2, + MFX_CURRENT_USER_KEY = 3, + MFX_LOCAL_MACHINE_KEY = 4, + MFX_APP_FOLDER = 5, + MFX_PATH_MSDK_FOLDER = 6, + MFX_STORAGE_ID_FIRST = MFX_TRACER, + MFX_STORAGE_ID_LAST = MFX_PATH_MSDK_FOLDER, +#else + MFX_UNKNOWN_KEY = -1, + MFX_DRIVER_STORE = 0, + MFX_CURRENT_USER_KEY = 1, + MFX_LOCAL_MACHINE_KEY = 2, + MFX_APP_FOLDER = 3, + MFX_PATH_MSDK_FOLDER = 4, + MFX_STORAGE_ID_FIRST = MFX_DRIVER_STORE, + MFX_STORAGE_ID_LAST = MFX_PATH_MSDK_FOLDER, +#endif + MFX_DRIVER_STORE_ONEVPL = 1001, + MFX_CURRENT_USER_KEY_ONEVPL = 1002, + MFX_LOCAL_MACHINE_KEY_ONEVPL = 1003, +}; + +// Try to initialize using given implementation type. Select appropriate type automatically in case of MFX_IMPL_VIA_ANY. +// Params: adapterNum - in, pImplInterface - in/out, pVendorID - out, pDeviceID - out, pLUID - out (optional) +mfxStatus SelectImplementationType(const mfxU32 adapterNum, + mfxIMPL *pImplInterface, + mfxU32 *pVendorID, + mfxU32 *pDeviceID); + +mfxStatus SelectImplementationType(const mfxU32 adapterNum, + mfxIMPL *pImplInterface, + mfxU32 *pVendorID, + mfxU32 *pDeviceID, + mfxU64 *pLUID); + +bool GetImplPath(int storageID, wchar_t *sImplPath); + +const mfxU32 msdk_disp_path_len = 1024; + +class MFXLibraryIterator { +public: + // Default constructor + MFXLibraryIterator(void); + // Destructor + ~MFXLibraryIterator(void); + + // Initialize the iterator + mfxStatus Init(eMfxImplType implType, + mfxIMPL implInterface, + const mfxU32 adapterNum, + int storageID); + + // Get the next library path + mfxStatus SelectDLLVersion(wchar_t *pPath, + size_t pathSize, + eMfxImplType *pImplType, + mfxVersion minVersion); + + // Return interface type on which Intel adapter was found (if any): D3D9 or D3D11 + mfxIMPL GetImplementationType(); + + // Retrun registry subkey name on which dll was selected after sucesfull call to selectDllVesion + bool GetSubKeyName(wchar_t *subKeyName, size_t length) const; + + int GetStorageID() const { + return m_StorageID; + } + + static mfxStatus GetDriverStoreDir(std::wstring &driverStoreDir, + size_t length, + mfxU32 deviceID, + int storageID); + static mfxStatus GetRegkeyDir(std::wstring ®Dir, size_t length, int storageID); + +protected: + // Release the iterator + void Release(void); + + // Initialize the registry iterator + mfxStatus InitRegistry(int storageID); +#if defined(MFX_TRACER_WA_FOR_DS) + // Initialize the registry iterator for searching for tracer + mfxStatus InitRegistryTracer(); +#endif + // Initialize the app/module folder iterator + mfxStatus InitFolder(eMfxImplType implType, const wchar_t *path, const int storageID); + + eMfxImplType m_implType; // Required library implementation + mfxIMPL m_implInterface; // Required interface (D3D9, D3D11) + + mfxU32 m_vendorID; // (mfxU32) property of used graphic card + mfxU32 m_deviceID; // (mfxU32) property of used graphic card + bool m_bIsSubKeyValid; + wchar_t m_SubKeyNameMFX_MAX_REGISTRY_KEY_NAME; // registry subkey for selected module loaded + int m_StorageID; + +#if !defined(MEDIASDK_UWP_DISPATCHER) + WinRegKey m_baseRegKey; // (WinRegKey) main registry key +#endif + + mfxU32 m_lastLibIndex; // (mfxU32) index of previously returned library + mfxU32 m_lastLibMerit; // (mfxU32) merit of previously returned library + + wchar_t m_pathmsdk_disp_path_len; //NOLINT(runtime/arrays) + wchar_t m_driverStoreDirmsdk_disp_path_len; //NOLINT(runtime/arrays) + + DriverStoreLoader m_driverStoreLoader; // for loading MediaSDK from DriverStore + +private: + // unimplemented by intent to make this class non-copyable + MFXLibraryIterator(const MFXLibraryIterator &); + void operator=(const MFXLibraryIterator &); +}; + +} // namespace MFX + +#endif // DISPATCHER_WINDOWS_MFX_LIBRARY_ITERATOR_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_load_dll.cpp
Added
@@ -0,0 +1,196 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#include "windows/mfx_load_dll.h" +#include "windows/mfx_dispatcher.h" + +#include <string.h> +#include <wchar.h> +#include <windows.h> + +#if defined(_WIN64) +const wchar_t *const defaultDLLName2 = { L"libmfxhw64.dll", L"libvplswref64.dll" }; +const wchar_t *const defaultAudioDLLName2 = { L"libmfxaudiosw64.dll", L"libmfxaudiosw64.dll" }; +const wchar_t *const defaultOneVPLDLLName = { L"libmfx64-gen.dll" }; + +const wchar_t *const defaultPluginDLLName2 = { L"mfxplugin64_hw.dll", L"mfxplugin64_sw.dll" }; + #if defined(MEDIASDK_UWP_DISPATCHER) +const wchar_t *const IntelGFXAPIDLLName = { L"intel_gfx_api-x64.dll" }; + #endif + +#elif defined(_WIN32) +const wchar_t *const defaultDLLName2 = { L"libmfxhw32.dll", L"libvplswref32.dll" }; + +const wchar_t *const defaultAudioDLLName2 = { L"libmfxaudiosw32.dll", L"libmfxaudiosw32.dll" }; + +const wchar_t *const defaultOneVPLDLLName = { L"libmfx32-gen.dll" }; + +const wchar_t *const defaultPluginDLLName2 = { L"mfxplugin32_hw.dll", L"mfxplugin32_sw.dll" }; + + #if defined(MEDIASDK_UWP_DISPATCHER) +const wchar_t *const IntelGFXAPIDLLName = { L"intel_gfx_api-x86.dll" }; + #endif + +#endif // (defined(_WIN64)) + +namespace MFX { + +mfxStatus mfx_get_default_dll_name(wchar_t *pPath, size_t pathSize, eMfxImplType implType) { + if (!pPath) { + return MFX_ERR_NULL_PTR; + } + + // there are only 2 implementation with default DLL names +#if _MSC_VER >= 1400 + return 0 == wcscpy_s(pPath, pathSize, defaultDLLNameimplType & 1) ? MFX_ERR_NONE + : MFX_ERR_UNKNOWN; +#else + wcscpy(pPath, defaultDLLNameimplType & 1); + return MFX_ERR_NONE; +#endif +} // mfxStatus mfx_get_default_dll_name(wchar_t *pPath, size_t pathSize, eMfxImplType implType) + +mfxStatus mfx_get_default_onevpl_dll_name(wchar_t *pPath, size_t pathSize) { + if (!pPath) { + return MFX_ERR_NULL_PTR; + } + + // there are only 2 implementation with default DLL names +#if _MSC_VER >= 1400 + return 0 == wcscpy_s(pPath, pathSize, defaultOneVPLDLLName) ? MFX_ERR_NONE : MFX_ERR_UNKNOWN; +#else + wcscpy(pPath, defaultOneVPLDLLName); + return MFX_ERR_NONE; +#endif +} // mfxStatus mfx_get_default_onevpl_dll_name(wchar_t *pPath, size_t pathSize, eMfxImplType implType) + +#if defined(MEDIASDK_UWP_DISPATCHER) +mfxStatus mfx_get_default_intel_gfx_api_dll_name(wchar_t *pPath, size_t pathSize) { + if (!pPath) { + return MFX_ERR_NULL_PTR; + } + + #if _MSC_VER >= 1400 + return 0 == wcscpy_s(pPath, pathSize, IntelGFXAPIDLLName) ? MFX_ERR_NONE : MFX_ERR_UNKNOWN; + #else + wcscpy(pPath, IntelGFXAPIDLLName); + return MFX_ERR_NONE; + #endif +} // mfx_get_default_intel_gfx_api_dll_name(wchar_t *pPath, size_t pathSize) +#endif + +mfxStatus mfx_get_default_plugin_name(wchar_t *pPath, size_t pathSize, eMfxImplType implType) { + if (!pPath) { + return MFX_ERR_NULL_PTR; + } + + // there are only 2 implementation with default DLL names +#if _MSC_VER >= 1400 + return 0 == wcscpy_s(pPath, pathSize, defaultPluginDLLNameimplType & 1) ? MFX_ERR_NONE + : MFX_ERR_UNKNOWN; +#else + wcscpy(pPath, defaultPluginDLLNameimplType & 1); + return MFX_ERR_NONE; +#endif +} + +mfxStatus mfx_get_default_audio_dll_name(wchar_t *pPath, size_t pathSize, eMfxImplType implType) { + if (!pPath) { + return MFX_ERR_NULL_PTR; + } + + // there are only 2 implementation with default DLL names +#if _MSC_VER >= 1400 + return 0 == wcscpy_s(pPath, pathSize, defaultAudioDLLNameimplType & 1) ? MFX_ERR_NONE + : MFX_ERR_UNKNOWN; +#else + wcscpy(pPath, defaultAudioDLLNameimplType & 1); + return MFX_ERR_NONE; +#endif +} // mfxStatus mfx_get_default_audio_dll_name(wchar_t *pPath, size_t pathSize, eMfxImplType implType) + +mfxModuleHandle mfx_dll_load(const wchar_t *pFileName) { + mfxModuleHandle hModule = (mfxModuleHandle)0; + + // check error(s) + if (NULL == pFileName) { + return NULL; + } +#if !defined(MEDIASDK_UWP_DISPATCHER) + // set the silent error mode + DWORD prevErrorMode = 0; + #if (_WIN32_WINNT >= 0x0600) + SetThreadErrorMode(SEM_FAILCRITICALERRORS, &prevErrorMode); + #else + prevErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); + #endif +#endif // !defined(MEDIASDK_UWP_DISPATCHER) + + // load the library's module +#if !defined(MEDIASDK_ARM_LOADER) + hModule = LoadLibraryExW(pFileName, NULL, 0); +#endif + +#if !defined(MEDIASDK_UWP_DISPATCHER) + // set the previous error mode + #if (_WIN32_WINNT >= 0x0600) + SetThreadErrorMode(prevErrorMode, NULL); + #else + SetErrorMode(prevErrorMode); + #endif +#endif // !defined(MEDIASDK_UWP_DISPATCHER) + + return hModule; + +} // mfxModuleHandle mfx_dll_load(const wchar_t *pFileName) + +mfxFunctionPointer mfx_dll_get_addr(mfxModuleHandle handle, const char *pFunctionName) { + if (NULL == handle) { + return NULL; + } + + return (mfxFunctionPointer)GetProcAddress((HMODULE)handle, pFunctionName); +} // mfxFunctionPointer mfx_dll_get_addr(mfxModuleHandle handle, const char *pFunctionName) + +bool mfx_dll_free(mfxModuleHandle handle) { + if (NULL == handle) { + return true; + } + + BOOL bRes = FreeLibrary((HMODULE)handle); + + return !!bRes; +} // bool mfx_dll_free(mfxModuleHandle handle) + +#if !defined(MEDIASDK_UWP_DISPATCHER) +mfxModuleHandle mfx_get_dll_handle(const wchar_t *pFileName) { + mfxModuleHandle hModule = (mfxModuleHandle)0; + + // check error(s) + if (NULL == pFileName) { + return NULL; + } + + // set the silent error mode + DWORD prevErrorMode = 0; + #if (_WIN32_WINNT >= 0x0600) + SetThreadErrorMode(SEM_FAILCRITICALERRORS, &prevErrorMode); + #else + prevErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); + #endif + // load the library's module + GetModuleHandleExW(0, pFileName, (HMODULE *)&hModule); + // set the previous error mode + #if (_WIN32_WINNT >= 0x0600) + SetThreadErrorMode(prevErrorMode, NULL); + #else + SetErrorMode(prevErrorMode); + #endif + return hModule; +} +#endif //!defined(MEDIASDK_UWP_DISPATCHER) + +} // namespace MFX
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_load_dll.h
Added
@@ -0,0 +1,36 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_WINDOWS_MFX_LOAD_DLL_H_ +#define DISPATCHER_WINDOWS_MFX_LOAD_DLL_H_ + +#include "windows/mfx_dispatcher.h" + +namespace MFX { + +// +// declare DLL loading routines +// + +mfxStatus mfx_get_rt_dll_name(wchar_t *pPath, size_t pathSize); +mfxStatus mfx_get_default_dll_name(wchar_t *pPath, size_t pathSize, eMfxImplType implType); +mfxStatus mfx_get_default_onevpl_dll_name(wchar_t *pPath, size_t pathSize); +mfxStatus mfx_get_default_plugin_name(wchar_t *pPath, size_t pathSize, eMfxImplType implType); +#if defined(MEDIASDK_UWP_DISPATCHER) +mfxStatus mfx_get_default_intel_gfx_api_dll_name(wchar_t *pPath, size_t pathSize); +#endif + +mfxStatus mfx_get_default_audio_dll_name(wchar_t *pPath, size_t pathSize, eMfxImplType implType); + +mfxModuleHandle mfx_dll_load(const wchar_t *file_name); +//increments reference counter +mfxModuleHandle mfx_get_dll_handle(const wchar_t *file_name); +mfxFunctionPointer mfx_dll_get_addr(mfxModuleHandle handle, const char *func_name); +bool mfx_dll_free(mfxModuleHandle handle); + +} // namespace MFX + +#endif // DISPATCHER_WINDOWS_MFX_LOAD_DLL_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_vector.h
Added
@@ -0,0 +1,159 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#pragma once +#include <exception> +#include "vpl/mfxstructures.h" + +namespace MFX { +template <class T> +class iterator_tmpl { + template <class U> + friend class MFXVector; + mfxU32 mIndex; + T *mRecords; + iterator_tmpl(mfxU32 index, T *records) : mIndex(index), mRecords(records) {} + +public: + iterator_tmpl() : mIndex(), mRecords() {} + bool operator==(const iterator_tmpl<T> &that) const { + return mIndex == that.mIndex; + } + bool operator!=(const iterator_tmpl<T> &that) const { + return mIndex != that.mIndex; + } + mfxU32 operator-(const iterator_tmpl<T> &that) const { + return mIndex - that.mIndex; + } + iterator_tmpl<T> &operator++() { + mIndex++; + return *this; + } + iterator_tmpl<T> &operator++(int) { + mIndex++; + return *this; + } + T &operator*() { + return mRecordsmIndex; + } + T *operator->() { + return mRecords + mIndex; + } +}; + +class MFXVectorRangeError : public std::exception {}; + +template <class T> +class MFXVector { + T *mRecords; + mfxU32 mNrecords; + +public: + MFXVector() : mRecords(), mNrecords() {} + MFXVector(const MFXVector &rhs) : mRecords(), mNrecords() { + insert(end(), rhs.begin(), rhs.end()); + } + MFXVector &operator=(const MFXVector &rhs) { + if (this != &rhs) { + clear(); + insert(end(), rhs.begin(), rhs.end()); + } + return *this; + } + virtual ~MFXVector() { + clear(); + } + typedef iterator_tmpl<T> iterator; + + iterator begin() const { + return iterator(0u, mRecords); + } + iterator end() const { + return iterator(mNrecords, mRecords); + } + void insert(iterator where, iterator beg_iter, iterator end_iter) { + mfxU32 elementsToInsert = (end_iter - beg_iter); + if (!elementsToInsert) { + return; + } + if (where.mIndex > mNrecords) { + throw MFXVectorRangeError(); + } + + T *newRecords = new TmNrecords + elementsToInsert(); + mfxU32 i = 0; + + // save left + for (; i < where.mIndex; i++) { + newRecordsi = mRecordsi; + } + // insert + for (; beg_iter != end_iter; beg_iter++, i++) { + newRecordsi = *beg_iter; + } + + //save right + for (; i < mNrecords + elementsToInsert; i++) { + newRecordsi = mRecordsi - elementsToInsert; + } + + delete mRecords; + + mRecords = newRecords; + mNrecords = i; + } + T &operator(mfxU32 idx) { + return mRecordsidx; + } + void push_back(const T &obj) { + T *newRecords = new TmNrecords + 1(); + mfxU32 i = 0; + for (; i < mNrecords; i++) { + newRecordsi = mRecordsi; + } + newRecordsi = obj; + delete mRecords; + + mRecords = newRecords; + mNrecords = i + 1; + } + void erase(iterator at) { + if (at.mIndex >= mNrecords) { + throw MFXVectorRangeError(); + } + mNrecords--; + mfxU32 i = at.mIndex; + for (; i != mNrecords; i++) { + mRecordsi = mRecordsi + 1; + } + //destroy last element + mRecordsi = T(); + } + void resize(mfxU32 nSize) { + T *newRecords = new TnSize(); + for (mfxU32 i = 0; i < mNrecords; i++) { + newRecordsi = mRecordsi; + } + delete mRecords; + mRecords = newRecords; + mNrecords = nSize; + } + mfxU32 size() const { + return mNrecords; + } + void clear() { + delete mRecords; + mRecords = 0; + mNrecords = 0; + } + bool empty() { + return !mRecords; + } + T *data() const { + return mRecords; + } +}; +} // namespace MFX
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_win_reg_key.cpp
Added
@@ -0,0 +1,197 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#if !defined(MEDIASDK_UWP_DISPATCHER) + #include "windows/mfx_win_reg_key.h" + #include "windows/mfx_dispatcher_log.h" + + #define TRACE_WINREG_ERROR(str, ...) DISPATCHER_LOG_ERROR((("WINREG: " str), __VA_ARGS__)) + +namespace MFX { + +WinRegKey::WinRegKey(void) { + m_hKey = (HKEY)0; + +} // WinRegKey::WinRegKey(void) + +WinRegKey::~WinRegKey(void) { + Release(); + +} // WinRegKey::~WinRegKey(void) + +void WinRegKey::Release(void) { + // close the opened key + if (m_hKey) { + RegCloseKey(m_hKey); + } + + m_hKey = (HKEY)0; + +} // void WinRegKey::Release(void) + +bool WinRegKey::Open(HKEY hRootKey, const wchar_t *pSubKey, REGSAM samDesired) { + LONG lRes; + HKEY hTemp; + + // + // All operation are performed in this order by intention. + // It makes possible to reopen the keys, using itself as a base. + // + + // try to the open registry key + lRes = RegOpenKeyExW(hRootKey, pSubKey, 0, samDesired, &hTemp); + if (ERROR_SUCCESS != lRes) { + DISPATCHER_LOG_OPERATION(SetLastError(lRes)); + TRACE_WINREG_ERROR("Opening key \"%s\\%S\" : RegOpenKeyExW()==0x%x\n", + (HKEY_LOCAL_MACHINE == hRootKey) ? ("HKEY_LOCAL_MACHINE") + : (HKEY_CURRENT_USER == hRootKey) ? ("HKEY_CURRENT_USER") + : "UNSUPPORTED_KEY", + pSubKey, + GetLastError()); + return false; + } + + // release the object before initialization + Release(); + + // save the handle + m_hKey = hTemp; + + return true; + +} // bool WinRegKey::Open(HKEY hRootKey, const wchar_t *pSubKey, REGSAM samDesired) + +bool WinRegKey::Open(WinRegKey &rootKey, const wchar_t *pSubKey, REGSAM samDesired) { + return Open(rootKey.m_hKey, pSubKey, samDesired); + +} // bool WinRegKey::Open(WinRegKey &rootKey, const wchar_t *pSubKey, REGSAM samDesired) + +bool WinRegKey::QueryValueSize(const wchar_t *pValueName, DWORD type, LPDWORD pcbData) { + DWORD keyType = type; + LONG lRes; + + // query the value + lRes = RegQueryValueExW(m_hKey, pValueName, NULL, &keyType, 0, pcbData); + if (ERROR_SUCCESS != lRes) { + DISPATCHER_LOG_OPERATION(SetLastError(lRes)); + TRACE_WINREG_ERROR("Querying \"%S\" : RegQueryValueExA()==0x%x\n", + pValueName, + GetLastError()); + return false; + } + + return true; +} + +bool WinRegKey::Query(const wchar_t *pValueName, DWORD type, LPBYTE pData, LPDWORD pcbData) { + DWORD keyType = type; + LONG lRes; + DWORD dstSize = (pcbData) ? (*pcbData) : (0); + + // query the value + lRes = RegQueryValueExW(m_hKey, pValueName, NULL, &keyType, pData, pcbData); + if (ERROR_SUCCESS != lRes) { + DISPATCHER_LOG_OPERATION(SetLastError(lRes)); + TRACE_WINREG_ERROR("Querying \"%S\" : RegQueryValueExA()==0x%x\n", + pValueName, + GetLastError()); + return false; + } + + // check the type + if (keyType != type) { + TRACE_WINREG_ERROR("Querying \"%S\" : expectedType=%d, returned=%d\n", + pValueName, + type, + keyType); + return false; + } + + // terminate the string only if pointers not NULL + if ((REG_SZ == type || REG_EXPAND_SZ == type) && NULL != pData && NULL != pcbData) { + wchar_t *pString = (wchar_t *)pData; + size_t NullEndingSizeBytes = sizeof(wchar_t); // size of string termination null character + if (dstSize < NullEndingSizeBytes) { + TRACE_WINREG_ERROR("Querying \"%S\" : buffer is too small for null-terminated string", + pValueName); + return false; + } + size_t maxStringLengthBytes = dstSize - NullEndingSizeBytes; + size_t maxStringIndex = dstSize / sizeof(wchar_t) - 1; + + size_t lastIndex = + (maxStringLengthBytes < *pcbData) ? (maxStringIndex) : (*pcbData) / sizeof(wchar_t); + + pStringlastIndex = (wchar_t)0; + } + else if (REG_MULTI_SZ == type && NULL != pData && NULL != pcbData) { + wchar_t *pString = (wchar_t *)pData; + size_t NullEndingSizeBytes = + sizeof(wchar_t) * 2; // size of string termination null characters + if (dstSize < NullEndingSizeBytes) { + TRACE_WINREG_ERROR( + "Querying \"%S\" : buffer is too small for multi-line null-terminated string", + pValueName); + return false; + } + size_t maxStringLengthBytes = dstSize - NullEndingSizeBytes; + size_t maxStringIndex = dstSize / sizeof(wchar_t) - 1; + + size_t lastIndex = + (maxStringLengthBytes < *pcbData) ? (maxStringIndex) : (*pcbData) / sizeof(wchar_t) + 1; + + // last 2 bytes should be 0 in case of REG_MULTI_SZ + pStringlastIndex = pStringlastIndex - 1 = (wchar_t)0; + } + + return true; + +} // bool WinRegKey::Query(const wchar_t *pValueName, DWORD type, LPBYTE pData, LPDWORD pcbData) + +bool WinRegKey::EnumValue(DWORD index, wchar_t *pValueName, LPDWORD pcchValueName, LPDWORD pType) { + LONG lRes; + + // enum the values + lRes = RegEnumValueW(m_hKey, index, pValueName, pcchValueName, 0, pType, NULL, NULL); + if (ERROR_SUCCESS != lRes) { + DISPATCHER_LOG_OPERATION(SetLastError(lRes)); + return false; + } + + return true; + +} // bool WinRegKey::EnumValue(DWORD index, wchar_t *pValueName, LPDWORD pcchValueName, LPDWORD pType) + +bool WinRegKey::EnumKey(DWORD index, wchar_t *pValueName, LPDWORD pcchValueName) { + LONG lRes; + + // enum the keys + lRes = RegEnumKeyExW(m_hKey, index, pValueName, pcchValueName, NULL, NULL, NULL, NULL); + if (ERROR_SUCCESS != lRes) { + DISPATCHER_LOG_OPERATION(SetLastError(lRes)); + TRACE_WINREG_ERROR("EnumKey with index=%d: RegEnumKeyExW()==0x%x\n", index, GetLastError()); + return false; + } + + return true; + +} // bool WinRegKey::EnumKey(DWORD index, wchar_t *pValueName, LPDWORD pcchValueName) + +bool WinRegKey::QueryInfo(LPDWORD lpcSubkeys) { + LONG lRes; + + lRes = RegQueryInfoKeyW(m_hKey, NULL, 0, 0, lpcSubkeys, 0, 0, 0, 0, 0, 0, 0); + if (ERROR_SUCCESS != lRes) { + TRACE_WINREG_ERROR("RegQueryInfoKeyW()==0x%x\n", lRes); + return false; + } + return true; + +} //bool QueryInfo(LPDWORD lpcSubkeys); + +} // namespace MFX + +#endif // #if !defined(MEDIASDK_UWP_DISPATCHER)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfx_win_reg_key.h
Added
@@ -0,0 +1,99 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_WINDOWS_MFX_WIN_REG_KEY_H_ +#define DISPATCHER_WINDOWS_MFX_WIN_REG_KEY_H_ + +#include <windows.h> +#include "vpl/mfxcommon.h" +#include "windows/mfx_dispatcher_log.h" + +#if !defined(MEDIASDK_UWP_DISPATCHER) +namespace MFX { + +template <class T> +struct RegKey {}; +template <> +struct RegKey<bool> { + enum { type = REG_DWORD }; +}; +template <> +struct RegKey<mfxU32> { + enum { type = REG_DWORD }; +}; +template <> +struct RegKey<mfxVersion> { + enum { type = REG_DWORD }; +}; +template <> +struct RegKey<char *> { + enum { type = REG_SZ }; +}; +template <> +struct RegKey<wchar_t *> { + enum { type = REG_SZ }; +}; + +class WinRegKey { +public: + // Default constructor + WinRegKey(void); + // Destructor + ~WinRegKey(void); + + // Open a registry key + bool Open(HKEY hRootKey, const wchar_t *pSubKey, REGSAM samDesired); + bool Open(WinRegKey &rootKey, const wchar_t *pSubKey, REGSAM samDesired); + + // Query value + bool QueryInfo(LPDWORD lpcSubkeys); + + bool QueryValueSize(const wchar_t *pValueName, DWORD type, LPDWORD pcbData); + bool Query(const wchar_t *pValueName, DWORD type, LPBYTE pData, LPDWORD pcbData); + + bool Query(const wchar_t *pValueName, wchar_t *pData, mfxU32 &nData) { + DWORD dw = (DWORD)nData; + if (!Query(pValueName, RegKey<wchar_t *>::type, (LPBYTE)pData, &dw)) { + return false; + } + nData = dw; + return true; + } + + // Enumerate value names + bool EnumValue(DWORD index, wchar_t *pValueName, LPDWORD pcchValueName, LPDWORD pType); + bool EnumKey(DWORD index, wchar_t *pValueName, LPDWORD pcchValueName); + +protected: + // Release the object + void Release(void); + + HKEY m_hKey; // (HKEY) handle to the opened key + +private: + // unimplemented by intent to make this class non-copyable + WinRegKey(const WinRegKey &); + void operator=(const WinRegKey &); +}; + +template <class T> +inline bool QueryKey(WinRegKey &key, const wchar_t *pValueName, T &data) { + DWORD size = sizeof(data); + return key.Query(pValueName, RegKey<T>::type, (LPBYTE)&data, &size); +} + +template <> +inline bool QueryKey<bool>(WinRegKey &key, const wchar_t *pValueName, bool &data) { + mfxU32 value = 0; + bool bRes = QueryKey(key, pValueName, value); + data = (1 == value); + return bRes; +} + +} // namespace MFX +#endif // #if !defined(MEDIASDK_UWP_DISPATCHER) + +#endif // DISPATCHER_WINDOWS_MFX_WIN_REG_KEY_H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/mfxvideo++.h
Added
@@ -0,0 +1,222 @@ +/*############################################################################ + # Copyright (C) Intel Corporation + # + # SPDX-License-Identifier: MIT + ############################################################################*/ + +#ifndef DISPATCHER_WINDOWS_MFXVIDEO___H_ +#define DISPATCHER_WINDOWS_MFXVIDEO___H_ + +#include "vpl/mfxvideo.h" + +class MFXVideoSession { +public: + MFXVideoSession(void) { + m_session = (mfxSession)0; + } + virtual ~MFXVideoSession(void) { + Close(); + } + + virtual mfxStatus Init(mfxIMPL impl, mfxVersion *ver) { + return MFXInit(impl, ver, &m_session); + } + virtual mfxStatus InitEx(mfxInitParam par) { + return MFXInitEx(par, &m_session); + } + virtual mfxStatus Close(void) { + mfxStatus mfxRes; + mfxRes = MFXClose(m_session); + m_session = (mfxSession)0; + return mfxRes; + } + + virtual mfxStatus QueryIMPL(mfxIMPL *impl) { + return MFXQueryIMPL(m_session, impl); + } + virtual mfxStatus QueryVersion(mfxVersion *version) { + return MFXQueryVersion(m_session, version); + } + + virtual mfxStatus JoinSession(mfxSession child_session) { + return MFXJoinSession(m_session, child_session); + } + virtual mfxStatus DisjoinSession() { + return MFXDisjoinSession(m_session); + } + virtual mfxStatus CloneSession(mfxSession *clone) { + return MFXCloneSession(m_session, clone); + } + virtual mfxStatus SetPriority(mfxPriority priority) { + return MFXSetPriority(m_session, priority); + } + virtual mfxStatus GetPriority(mfxPriority *priority) { + return MFXGetPriority(m_session, priority); + } + + virtual mfxStatus SetFrameAllocator(mfxFrameAllocator *allocator) { + return MFXVideoCORE_SetFrameAllocator(m_session, allocator); + } + virtual mfxStatus SetHandle(mfxHandleType type, mfxHDL hdl) { + return MFXVideoCORE_SetHandle(m_session, type, hdl); + } + virtual mfxStatus GetHandle(mfxHandleType type, mfxHDL *hdl) { + return MFXVideoCORE_GetHandle(m_session, type, hdl); + } + virtual mfxStatus QueryPlatform(mfxPlatform *platform) { + return MFXVideoCORE_QueryPlatform(m_session, platform); + } + + virtual mfxStatus SyncOperation(mfxSyncPoint syncp, mfxU32 wait) { + return MFXVideoCORE_SyncOperation(m_session, syncp, wait); + } + + virtual operator mfxSession(void) { + return m_session; + } + +protected: + mfxSession m_session; // (mfxSession) handle to the owning session +private: + MFXVideoSession(const MFXVideoSession &); + void operator=(MFXVideoSession &); +}; + +class MFXVideoENCODE { +public: + explicit MFXVideoENCODE(mfxSession session) { + m_session = session; + } + virtual ~MFXVideoENCODE(void) { + Close(); + } + + virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { + return MFXVideoENCODE_Query(m_session, in, out); + } + virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { + return MFXVideoENCODE_QueryIOSurf(m_session, par, request); + } + virtual mfxStatus Init(mfxVideoParam *par) { + return MFXVideoENCODE_Init(m_session, par); + } + virtual mfxStatus Reset(mfxVideoParam *par) { + return MFXVideoENCODE_Reset(m_session, par); + } + virtual mfxStatus Close(void) { + return MFXVideoENCODE_Close(m_session); + } + + virtual mfxStatus GetVideoParam(mfxVideoParam *par) { + return MFXVideoENCODE_GetVideoParam(m_session, par); + } + virtual mfxStatus GetEncodeStat(mfxEncodeStat *stat) { + return MFXVideoENCODE_GetEncodeStat(m_session, stat); + } + + virtual mfxStatus EncodeFrameAsync(mfxEncodeCtrl *ctrl, + mfxFrameSurface1 *surface, + mfxBitstream *bs, + mfxSyncPoint *syncp) { + return MFXVideoENCODE_EncodeFrameAsync(m_session, ctrl, surface, bs, syncp); + } + +protected: + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoDECODE { +public: + explicit MFXVideoDECODE(mfxSession session) { + m_session = session; + } + virtual ~MFXVideoDECODE(void) { + Close(); + } + + virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { + return MFXVideoDECODE_Query(m_session, in, out); + } + virtual mfxStatus DecodeHeader(mfxBitstream *bs, mfxVideoParam *par) { + return MFXVideoDECODE_DecodeHeader(m_session, bs, par); + } + virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { + return MFXVideoDECODE_QueryIOSurf(m_session, par, request); + } + virtual mfxStatus Init(mfxVideoParam *par) { + return MFXVideoDECODE_Init(m_session, par); + } + virtual mfxStatus Reset(mfxVideoParam *par) { + return MFXVideoDECODE_Reset(m_session, par); + } + virtual mfxStatus Close(void) { + return MFXVideoDECODE_Close(m_session); + } + + virtual mfxStatus GetVideoParam(mfxVideoParam *par) { + return MFXVideoDECODE_GetVideoParam(m_session, par); + } + + virtual mfxStatus GetDecodeStat(mfxDecodeStat *stat) { + return MFXVideoDECODE_GetDecodeStat(m_session, stat); + } + virtual mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) { + return MFXVideoDECODE_GetPayload(m_session, ts, payload); + } + virtual mfxStatus SetSkipMode(mfxSkipMode mode) { + return MFXVideoDECODE_SetSkipMode(m_session, mode); + } + virtual mfxStatus DecodeFrameAsync(mfxBitstream *bs, + mfxFrameSurface1 *surface_work, + mfxFrameSurface1 **surface_out, + mfxSyncPoint *syncp) { + return MFXVideoDECODE_DecodeFrameAsync(m_session, bs, surface_work, surface_out, syncp); + } + +protected: + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoVPP { +public: + explicit MFXVideoVPP(mfxSession session) { + m_session = session; + } + virtual ~MFXVideoVPP(void) { + Close(); + } + + virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { + return MFXVideoVPP_Query(m_session, in, out); + } + virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest request2) { + return MFXVideoVPP_QueryIOSurf(m_session, par, request); + } + virtual mfxStatus Init(mfxVideoParam *par) { + return MFXVideoVPP_Init(m_session, par); + } + virtual mfxStatus Reset(mfxVideoParam *par) { + return MFXVideoVPP_Reset(m_session, par); + } + virtual mfxStatus Close(void) { + return MFXVideoVPP_Close(m_session); + } + + virtual mfxStatus GetVideoParam(mfxVideoParam *par) { + return MFXVideoVPP_GetVideoParam(m_session, par); + } + virtual mfxStatus GetVPPStat(mfxVPPStat *stat) { + return MFXVideoVPP_GetVPPStat(m_session, stat); + } + virtual mfxStatus RunFrameVPPAsync(mfxFrameSurface1 *in, + mfxFrameSurface1 *out, + mfxExtVppAuxData *aux, + mfxSyncPoint *syncp) { + return MFXVideoVPP_RunFrameVPPAsync(m_session, in, out, aux, syncp); + } + +protected: + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +#endif // DISPATCHER_WINDOWS_MFXVIDEO___H_
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/dispatcher/windows/version.rc.in
Added
@@ -0,0 +1,30 @@ +#include "winver.h" +#define VER_FILEVERSION @API_VERSION_MAJOR@,@API_VERSION_MINOR@,0,0 +#define VER_FILEVERSION_STR "@API_VERSION_MAJOR@.@API_VERSION_MINOR@.0.0\0" + +#define VER_PRODUCTVERSION @CMAKE_PROJECT_VERSION_MAJOR@,@CMAKE_PROJECT_VERSION_MINOR@,0,0 +#define VER_PRODUCTVERSION_STR "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@\0" + +VS_VERSION_INFO VERSIONINFO +FILEVERSION VER_FILEVERSION +PRODUCTVERSION VER_PRODUCTVERSION +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "Intel\0" + VALUE "FileDescription", "oneVPL Dispatcher\0" + VALUE "FileVersion", VER_FILEVERSION_STR + // Copyright year is the first publication date. Subsequent dates are optional + VALUE "LegalCopyright", "Copyright (C) 2021 Intel Corporation\0" + VALUE "ProductName", "VPL\0" + VALUE "ProductVersion", VER_PRODUCTVERSION_STR + END + END + + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END \ No newline at end of file
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/libmfx/meson.build
Added
@@ -0,0 +1,89 @@ +mfx_win32_sources = + 'dispatcher/windows/main.cpp', + 'dispatcher/windows/mfx_critical_section.cpp', + 'dispatcher/windows/mfx_dispatcher_log.cpp', + 'dispatcher/windows/mfx_dispatcher.cpp', + 'dispatcher/windows/mfx_driver_store_loader.cpp', + 'dispatcher/windows/mfx_dxva2_device.cpp', + 'dispatcher/windows/mfx_function_table.cpp', + 'dispatcher/windows/mfx_library_iterator.cpp', + 'dispatcher/windows/mfx_load_dll.cpp', + 'dispatcher/windows/mfx_win_reg_key.cpp', + + +mfx_linux_sources = + 'dispatcher/linux/mfxloader.cpp', + + +vpl_sources = + 'dispatcher/vpl/mfx_dispatcher_vpl_config.cpp', + 'dispatcher/vpl/mfx_dispatcher_vpl_loader.cpp', + 'dispatcher/vpl/mfx_dispatcher_vpl_log.cpp', + 'dispatcher/vpl/mfx_dispatcher_vpl_lowlatency.cpp', + 'dispatcher/vpl/mfx_dispatcher_vpl_msdk.cpp', + 'dispatcher/vpl/mfx_dispatcher_vpl.cpp', + + +libmfx_extra_args = +libmfx_extra_deps = + +libmfx_sources = vpl_sources +if host_system == 'windows' + libmfx_sources += mfx_win32_sources +elif host_system == 'linux' + libmfx_sources += mfx_linux_sources + + # Unlike Windows (libmfxhw64.dll is part of driver so it's system library), + # user can build/install libmfx on Linux, so we need to define + # "MFX_MODULES_DIR" for dispatcher to be able to search libmfx from + # additional search path. + libmfx_modules_dir = get_option('mfx-modules-dir') + if libmfx_modules_dir == '' + # This "libdir" will be likely wrong but may be fine since libmfx library + # will be installed in the distro default library path as part of libmfx package + # and dispatcher will try to load library from the distro default library path first + libmfx_modules_dir = join_paths(prefix, get_option('libdir')) + endif + + libmfx_extra_args += '-DMFX_MODULES_DIR="@0@"'.format(libmfx_modules_dir) + libmfx_extra_deps += + cc.find_library('dl'), + cc.find_library('pthread'), + +else + error('Only Windows or Linux build is supported') +endif + +# suppress build warnings +if cc.get_id() == 'msvc' + libmfx_extra_args += cc.get_supported_arguments( + '/wd4189', # local variable is initialized but not referenced + ) +else + libmfx_extra_args += cc.get_supported_arguments( + '-Wno-missing-declarations', + '-Wno-deprecated-declarations', + '-Wno-redundant-decls', + '-Wno-unused-but-set-variable', + '-Wno-unused-variable', + # clang complains + '-Wno-missing-braces', + '-Wno-format-nonliteral', + ) +endif + +libmfx_incl = include_directories('dispatcher', 'api') + +libmfx_static = static_library('libmfx-static', + libmfx_sources, + c_args : libmfx_extra_args, + cpp_args : libmfx_extra_args, + dependencies : libmfx_extra_deps + gst_dep, + include_directories : libmfx_incl, + override_options: 'werror=false', +) + +libmfx_internal_dep = declare_dependency( + link_with : libmfx_static, + include_directories: libmfx_incl, include_directories('api/vpl') +)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/meson.build
Added
@@ -0,0 +1,100 @@ +qsv_sources = + 'gstqsvallocator.cpp', + 'gstqsvav1enc.cpp', + 'gstqsvdecoder.cpp', + 'gstqsvencoder.cpp', + 'gstqsvh264dec.cpp', + 'gstqsvh264enc.cpp', + 'gstqsvh265dec.cpp', + 'gstqsvh265enc.cpp', + 'gstqsvjpegdec.cpp', + 'gstqsvjpegenc.cpp', + 'gstqsvutils.cpp', + 'gstqsvvp9dec.cpp', + 'gstqsvvp9enc.cpp', + 'plugin.cpp', + + +qsv_d3d11_sources = + 'gstqsvallocator_d3d11.cpp', + + +qsv_va_sources = + 'gstqsvallocator_va.cpp', + + +extra_args = + '-DGST_USE_UNSTABLE_API', + + +qsv_option = get_option('qsv') +if qsv_option.disabled() + subdir_done() +endif + +qsv_platform_deps = +if host_system == 'windows' + if not gstd3d11_dep.found() + if qsv_option.enabled() + error('The qsv was enabled explicitly, but required d3d11 was not found') + else + subdir_done() + endif + endif + + code = ''' + #include <windows.h> + #if !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) + #error "Not building for UWP" + #endif''' + if cc.compiles(code, name : 'building for UWP') + if qsv_option.enabled() + error('qsv plugin does not support UWP') + else + subdir_done() + endif + endif + + qsv_sources += qsv_d3d11_sources + qsv_platform_deps += gstd3d11_dep +elif host_system == 'linux' and host_machine.cpu_family() == 'x86_64' + if not gstva_dep.found() + if qsv_option.enabled() + error('The qsv was enabled explicitly, but required va was not found') + else + subdir_done() + endif + endif + qsv_sources += qsv_va_sources + qsv_platform_deps += gstva_dep +else + if qsv_option.enabled() + error('QSV plugin supports only Windows or Linux') + else + subdir_done() + endif +endif + +# suppress deprecated use of MFXInitEx. We don't use the method, +# but used in "mfxvideo++.h" +# and MinGW 32bits compiler seems to be complaining about redundant-decls +if cc.get_id() != 'msvc' + extra_args += cc.get_supported_arguments( + '-Wno-redundant-decls', + '-Wno-deprecated-declarations', + ) +endif + +subdir('libmfx') + +gstqsv = library('gstqsv', + qsv_sources, + c_args : gst_plugins_bad_args + extra_args, + cpp_args : gst_plugins_bad_args + extra_args, + include_directories : configinc, + dependencies : gstbase_dep, gstvideo_dep, gstcodecparsers_dep, libmfx_internal_dep + qsv_platform_deps, + install : true, + install_dir : plugins_install_dir, +) + +plugins += gstqsv
View file
gst-plugins-bad-1.22.0.tar.xz/sys/qsv/plugin.cpp
Added
@@ -0,0 +1,295 @@ +/* GStreamer + * Copyright (C) 2021 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/** + * SECTION:plugin-qsv + * + * Intel Quick Sync plugin. + * + * This plugin consists of various video encoder and decoder elements. + * Depending on the hardware it runs on, some elements might not be registered + * in case that underlying hardware doesn't support the for feature. + * + * To get a list of all available elements, user can run + * ```sh + * gst-inspect-1.0 qsv + * ``` + * + * Since: 1.22 + */ + +#include <gst/gst.h> +#include <mfx.h> +#include "gstqsvav1enc.h" +#include "gstqsvh264dec.h" +#include "gstqsvh264enc.h" +#include "gstqsvh265dec.h" +#include "gstqsvh265enc.h" +#include "gstqsvjpegdec.h" +#include "gstqsvjpegenc.h" +#include "gstqsvvp9dec.h" +#include "gstqsvvp9enc.h" +#include "gstqsvutils.h" +#include <string.h> + +#ifdef G_OS_WIN32 +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#include <versionhelpers.h> +#include <gst/d3d11/gstd3d11.h> +#else +#include <gst/va/gstva.h> +#endif + +GST_DEBUG_CATEGORY (gst_qsv_debug); +GST_DEBUG_CATEGORY (gst_qsv_allocator_debug); + +#define GST_CAT_DEFAULT gst_qsv_debug + +#ifdef G_OS_WIN32 +#define MFX_ACCEL_MODE MFX_ACCEL_MODE_VIA_D3D11 +#else +#define MFX_ACCEL_MODE MFX_ACCEL_MODE_VIA_VAAPI +#endif + +#ifdef G_OS_WIN32 +static mfxSession +create_session_with_platform_device (mfxLoader loader, + mfxImplDescription * desc, guint impl_index, GstObject ** d3d11_device, + GList ** devices) +{ + mfxSession session = nullptr; + mfxStatus status; + GstD3D11Device *selected = nullptr; + GList *list = *devices; + GList *iter; + mfxU16 device_id = 0; + + *d3d11_device = nullptr; + + status = MFXCreateSession (loader, impl_index, &session); + if (status != MFX_ERR_NONE) { + GST_WARNING ("Failed to create session with index %d, %d (%s)", + impl_index, QSV_STATUS_ARGS (status)); + return nullptr; + } + + if (desc->ApiVersion.Major >= 2 || + (desc->ApiVersion.Major == 1 && desc->ApiVersion.Minor >= 19)) { + mfxPlatform platform; + + memset (&platform, 0, sizeof (mfxPlatform)); + + if (MFXVideoCORE_QueryPlatform (session, &platform) == MFX_ERR_NONE) { + device_id = platform.DeviceId; + + /* XXX: re-create session, MFXVideoCORE_QueryPlatform() may cause + * later MFXVideoCORE_SetHandle() call failed with + * MFX_ERR_UNDEFINED_BEHAVIOR error */ + g_clear_pointer (&session, MFXClose); + + status = MFXCreateSession (loader, impl_index, &session); + if (status != MFX_ERR_NONE) { + GST_WARNING ("Failed to re-create session with index %d, %d (%s)", + impl_index, QSV_STATUS_ARGS (status)); + return nullptr; + } + } + } + + if (device_id) { + for (iter = list; iter; iter = g_list_next (iter)) { + GstD3D11Device *dev = GST_D3D11_DEVICE (iter->data); + guint dev_id; + + g_object_get (dev, "device-id", &dev_id, nullptr); + if (dev_id == (guint) device_id) { + selected = dev; + list = g_list_delete_link (list, iter); + break; + } + } + } + + if (!selected) { + /* Unknown device id, pick the first device */ + selected = GST_D3D11_DEVICE (list->data); + list = g_list_delete_link (list, list); + } + + *devices = list; + + status = MFXVideoCORE_SetHandle (session, MFX_HANDLE_D3D11_DEVICE, + gst_d3d11_device_get_device_handle (selected)); + if (status != MFX_ERR_NONE) { + GST_WARNING ("Failed to set d3d11 device handle, %d (%s)", + QSV_STATUS_ARGS (status)); + gst_object_unref (selected); + MFXClose (session); + + return nullptr; + } + + *d3d11_device = GST_OBJECT (selected); + + return session; +} +#else +static mfxSession +create_session_with_platform_device (mfxLoader loader, + mfxImplDescription * desc, guint impl_index, GstObject ** va_display, + GList ** devices) +{ + mfxSession session = nullptr; + mfxStatus status; + GstVaDisplay *selected; + GList *list = *devices; + + *va_display = nullptr; + + status = MFXCreateSession (loader, impl_index, &session); + if (status != MFX_ERR_NONE) { + GST_WARNING ("Failed to create session with index %d, %d (%s)", + impl_index, QSV_STATUS_ARGS (status)); + return nullptr; + } + + /* XXX: what's the relation between implementation index and VA display ? + * Pick the first available device for now */ + selected = GST_VA_DISPLAY (list->data); + list = g_list_delete_link (list, list); + *devices = list; + + status = MFXVideoCORE_SetHandle (session, MFX_HANDLE_VA_DISPLAY, + gst_va_display_get_va_dpy (selected)); + if (status != MFX_ERR_NONE) { + GST_WARNING ("Failed to set display handle, %d (%s)", + QSV_STATUS_ARGS (status)); + gst_object_unref (selected); + MFXClose (session); + + return nullptr; + } + + *va_display = GST_OBJECT (selected); + + return session; +} +#endif + +static void +plugin_deinit (gpointer data) +{ + gst_qsv_deinit (); +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + mfxLoader loader; + guint i = 0; + GList *platform_devices = nullptr; + GstRank enc_rank = GST_RANK_NONE; + +#ifdef G_OS_WIN32 + /* D3D11 Video API is supported since Windows 8. + * Do we want to support old OS (Windows 7 for example) with D3D9 ?? */ + if (!IsWindows8OrGreater ()) + return TRUE; + + enc_rank = GST_RANK_PRIMARY; +#endif + + GST_DEBUG_CATEGORY_INIT (gst_qsv_debug, "qsv", 0, "Intel Quick Sync Video"); + GST_DEBUG_CATEGORY_INIT (gst_qsv_allocator_debug, + "qsvallocator", 0, "qsvallocator"); + + loader = gst_qsv_get_loader (); + if (!loader) + return TRUE; + + platform_devices = gst_qsv_get_platform_devices (); + if (!platform_devices) { + gst_qsv_deinit (); + return TRUE; + } + + GST_INFO ("Found %d platform devices", g_list_length (platform_devices)); + + do { + mfxStatus status = MFX_ERR_NONE; + mfxSession session = nullptr; + mfxImplDescription *desc = nullptr; + GstObject *device = nullptr; + + status = MFXEnumImplementations (loader, + i, MFX_IMPLCAPS_IMPLDESCSTRUCTURE, (mfxHDL *) & desc); + + if (status != MFX_ERR_NONE) + break; + + if ((desc->Impl & MFX_IMPL_TYPE_HARDWARE) == 0) + goto next; + + if ((desc->AccelerationMode & MFX_ACCEL_MODE) == 0) + goto next; + + session = create_session_with_platform_device (loader, desc, i, &device, + &platform_devices); + if (!session) + goto next; + + gst_qsv_h264_dec_register (plugin, GST_RANK_MARGINAL, i, device, session); + gst_qsv_h265_dec_register (plugin, GST_RANK_MARGINAL, i, device, session); + gst_qsv_jpeg_dec_register (plugin, GST_RANK_SECONDARY, i, device, session); + gst_qsv_vp9_dec_register (plugin, GST_RANK_MARGINAL, i, device, session); + + gst_qsv_h264_enc_register (plugin, enc_rank, i, device, session); + gst_qsv_h265_enc_register (plugin, enc_rank, i, device, session); + gst_qsv_jpeg_enc_register (plugin, enc_rank, i, device, session); + gst_qsv_vp9_enc_register (plugin, enc_rank, i, device, session); + gst_qsv_av1_enc_register (plugin, enc_rank, i, device, session); + + next: + MFXDispReleaseImplDescription (loader, desc); + g_clear_pointer (&session, MFXClose); + gst_clear_object (&device); + i++; + + /* What's the possible maximum number of impl/device ? */ + } while (i < 16 && platform_devices != nullptr); + + if (platform_devices) + g_list_free_full (platform_devices, (GDestroyNotify) gst_object_unref); + + g_object_set_data_full (G_OBJECT (plugin), "plugin-qsv-shutdown", + (gpointer) "shutdown-data", (GDestroyNotify) plugin_deinit); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + qsv, + "Intel Quick Sync Video plugin", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/shm/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/shm/meson.build
Changed
@@ -40,6 +40,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstshm, install_dir : plugins_pkgconfig_install_dir) plugins += gstshm endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/tinyalsa/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/tinyalsa/meson.build
Changed
@@ -23,7 +23,6 @@ install: true, install_dir: plugins_install_dir ) - pkgconfig.generate(gsttinyalsa, install_dir: plugins_pkgconfig_install_dir) plugins += gsttinyalsa elif get_option('tinyalsa').enabled() error('tinyalsa plugin enabled but TinyALSA library or headers not found')
View file
gst-plugins-bad-1.20.5.tar.xz/sys/uvch264/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/uvch264/meson.build
Changed
@@ -23,6 +23,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstuvch264, install_dir : plugins_pkgconfig_install_dir) plugins += gstuvch264 endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/v4l2codecs/gstv4l2codecdevice.c -> gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/gstv4l2codecdevice.c
Changed
@@ -316,6 +316,9 @@ client = g_udev_client_new (NULL); udev_devices = g_udev_client_query_by_subsystem (client, "media"); + if (!udev_devices) + GST_DEBUG ("Found no media devices"); + for (d = udev_devices; d; d = g_list_next (d)) { GUdevDevice *udev = (GUdevDevice *) d->data; const gchar *path = g_udev_device_get_device_file (udev);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/v4l2codecs/gstv4l2codech264dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/gstv4l2codech264dec.c
Changed
@@ -75,7 +75,7 @@ GstV4l2CodecPool *src_pool; gint min_pool_size; gboolean has_videometa; - gboolean need_negotiation; + gboolean streaming; gboolean interlaced; gboolean need_sequence; gboolean copy_frames; @@ -234,6 +234,16 @@ } static void +gst_v4l2_codec_h264_dec_streamoff (GstV4l2CodecH264Dec * self) +{ + if (self->streaming) { + gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SINK); + gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SRC); + self->streaming = FALSE; + } +} + +static void gst_v4l2_codec_h264_dec_reset_allocation (GstV4l2CodecH264Dec * self) { if (self->sink_allocator) { @@ -253,9 +263,7 @@ { GstV4l2CodecH264Dec *self = GST_V4L2_CODEC_H264_DEC (decoder); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SINK); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SRC); - + gst_v4l2_codec_h264_dec_streamoff (self); gst_v4l2_codec_h264_dec_reset_allocation (self); if (self->output_state) @@ -314,15 +322,11 @@ GstCaps *filter, *caps; /* Ignore downstream renegotiation request. */ - if (!self->need_negotiation) - return TRUE; - self->need_negotiation = FALSE; + if (self->streaming) + goto done; GST_DEBUG_OBJECT (self, "Negotiate"); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SINK); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SRC); - gst_v4l2_codec_h264_dec_reset_allocation (self); if (!gst_v4l2_decoder_set_sink_fmt (self->decoder, V4L2_PIX_FMT_H264_SLICE, @@ -366,6 +370,7 @@ if (self->output_state) gst_video_codec_state_unref (self->output_state); +done: self->output_state = gst_video_decoder_set_output_state (GST_VIDEO_DECODER (self), self->vinfo.finfo->format, self->display_width, @@ -377,6 +382,9 @@ self->output_state->caps = gst_video_info_to_caps (&self->output_state->info); if (GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder)) { + if (self->streaming) + return TRUE; + if (!gst_v4l2_decoder_streamon (self->decoder, GST_PAD_SINK)) { GST_ELEMENT_ERROR (self, RESOURCE, FAILED, ("Could not enable the decoder driver."), @@ -391,6 +399,8 @@ return FALSE; } + self->streaming = TRUE; + return TRUE; } @@ -404,6 +414,11 @@ GstV4l2CodecH264Dec *self = GST_V4L2_CODEC_H264_DEC (decoder); guint min = 0, num_bitstream; + /* If we are streaming here, then it means there is nothing allocation + * related in the new state and allocation can be ignored */ + if (self->streaming) + return TRUE; + self->has_videometa = gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); @@ -559,19 +574,26 @@ (slice_hdr->field_pic_flag ? V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC : 0) | (slice_hdr->bottom_field_flag ? V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD : 0), }; + /* *INDENT-ON* */ switch (picture->field) { case GST_H264_PICTURE_FIELD_FRAME: self->decode_params.top_field_order_cnt = picture->top_field_order_cnt; self->decode_params.bottom_field_order_cnt = - picture->bottom_field_order_cnt; + picture->bottom_field_order_cnt; break; case GST_H264_PICTURE_FIELD_TOP_FIELD: self->decode_params.top_field_order_cnt = picture->top_field_order_cnt; self->decode_params.bottom_field_order_cnt = 0; + if (picture->other_field) + self->decode_params.bottom_field_order_cnt = + picture->other_field->bottom_field_order_cnt; break; case GST_H264_PICTURE_FIELD_BOTTOM_FIELD: self->decode_params.top_field_order_cnt = 0; + if (picture->other_field) + self->decode_params.top_field_order_cnt = + picture->other_field->top_field_order_cnt; self->decode_params.bottom_field_order_cnt = picture->bottom_field_order_cnt; break; @@ -599,6 +621,7 @@ } entry = &self->decode_params.dpbentry_id++; + /* *INDENT-OFF* */ *entry = (struct v4l2_h264_dpb_entry) { /* * The reference is multiplied by 1000 because it's was set as micro @@ -609,8 +632,10 @@ .pic_num = pic_num, .flags = V4L2_H264_DPB_ENTRY_FLAG_VALID | (GST_H264_PICTURE_IS_REF (ref_pic) ? V4L2_H264_DPB_ENTRY_FLAG_ACTIVE : 0) - | (GST_H264_PICTURE_IS_LONG_TERM_REF (ref_pic) ? V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM : 0), + | (GST_H264_PICTURE_IS_LONG_TERM_REF (ref_pic) ? V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM : 0) + | (ref_pic->field_pic_flag ? V4L2_H264_DPB_ENTRY_FLAG_FIELD : 0), }; + /* *INDENT-ON* */ switch (ref_pic->field) { case GST_H264_PICTURE_FIELD_FRAME: @@ -626,8 +651,6 @@ entry->bottom_field_order_cnt = ref_pic->other_field->bottom_field_order_cnt; entry->fields |= V4L2_H264_BOTTOM_FIELD_REF; - } else { - entry->flags |= V4L2_H264_DPB_ENTRY_FLAG_FIELD; } break; case GST_H264_PICTURE_FIELD_BOTTOM_FIELD: @@ -636,15 +659,12 @@ if (ref_pic->other_field) { entry->top_field_order_cnt = - ref_pic->other_field->top_field_order_cnt; + ref_pic->other_field->top_field_order_cnt; entry->fields |= V4L2_H264_TOP_FIELD_REF; - } else { - entry->flags |= V4L2_H264_DPB_ENTRY_FLAG_FIELD; } break; } } - /* *INDENT-ON* */ g_array_unref (refs); } @@ -889,7 +909,7 @@ self->need_sequence = TRUE; if (negotiation_needed) { - self->need_negotiation = TRUE; + gst_v4l2_codec_h264_dec_streamoff (self); if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); return GST_FLOW_NOT_NEGOTIATED; @@ -979,6 +999,7 @@ dpb); self->first_slice = TRUE; + self->num_slices = 0; return GST_FLOW_OK; } @@ -1040,6 +1061,13 @@ GstV4l2Request *request = gst_h264_picture_get_user_data (picture); gint ret; + if (picture->discont_state) { + if (!gst_video_decoder_negotiate (vdec)) { + GST_ERROR_OBJECT (vdec, "Could not re-negotiate with updated state"); + return FALSE; + } + } + GST_DEBUG_OBJECT (self, "Output picture %u", picture->system_frame_number); ret = gst_v4l2_request_set_done (request); @@ -1124,7 +1152,7 @@ GstV4l2Request *prev_request, *request = NULL; gsize bytesused; gboolean ret = FALSE; - guint count = 0; + guint num_controls = 0; /* *INDENT-OFF* */ /* Reserve space for controls */ @@ -1171,49 +1199,53 @@ } if (self->need_sequence) { - controlcount.id = V4L2_CID_STATELESS_H264_SPS; - controlcount.ptr = &self->sps; - controlcount.size = sizeof (self->sps); - count++; + controlnum_controls.id = V4L2_CID_STATELESS_H264_SPS; + controlnum_controls.ptr = &self->sps; + controlnum_controls.size = sizeof (self->sps); + num_controls++; self->need_sequence = FALSE; } if (self->first_slice) { - controlcount.id = V4L2_CID_STATELESS_H264_PPS; - controlcount.ptr = &self->pps; - controlcount.size = sizeof (self->pps); - count++; + controlnum_controls.id = V4L2_CID_STATELESS_H264_PPS; + controlnum_controls.ptr = &self->pps; + controlnum_controls.size = sizeof (self->pps); + num_controls++; if (self->scaling_matrix_present) { - controlcount.id = V4L2_CID_STATELESS_H264_SCALING_MATRIX; - controlcount.ptr = &self->scaling_matrix; - controlcount.size = sizeof (self->scaling_matrix); - count++; + controlnum_controls.id = V4L2_CID_STATELESS_H264_SCALING_MATRIX; + controlnum_controls.ptr = &self->scaling_matrix; + controlnum_controls.size = sizeof (self->scaling_matrix); + num_controls++; } - controlcount.id = V4L2_CID_STATELESS_H264_DECODE_PARAMS; - controlcount.ptr = &self->decode_params; - controlcount.size = sizeof (self->decode_params); - count++; + controlnum_controls.id = V4L2_CID_STATELESS_H264_DECODE_PARAMS; + controlnum_controls.ptr = &self->decode_params; + controlnum_controls.size = sizeof (self->decode_params); + num_controls++; self->first_slice = FALSE; } /* If it's not slice-based then it doesn't support per-slice controls. */ if (is_slice_based (self)) { - controlcount.id = V4L2_CID_STATELESS_H264_SLICE_PARAMS; - controlcount.ptr = self->slice_params->data; - controlcount.size = g_array_get_element_size (self->slice_params) + controlnum_controls.id = V4L2_CID_STATELESS_H264_SLICE_PARAMS; + controlnum_controls.ptr = self->slice_params->data; + controlnum_controls.size = g_array_get_element_size (self->slice_params) * self->num_slices; - count++; + num_controls++; - controlcount.id = V4L2_CID_STATELESS_H264_PRED_WEIGHTS; - controlcount.ptr = &self->pred_weight; - controlcount.size = sizeof (self->pred_weight); - count++; + controlnum_controls.id = V4L2_CID_STATELESS_H264_PRED_WEIGHTS; + controlnum_controls.ptr = &self->pred_weight; + controlnum_controls.size = sizeof (self->pred_weight); + num_controls++; } - if (!gst_v4l2_decoder_set_controls (self->decoder, request, control, count)) { + if (num_controls > G_N_ELEMENTS (control)) + g_error ("Set too many controls, increase control size"); + + if (!gst_v4l2_decoder_set_controls (self->decoder, request, control, + num_controls)) { GST_ELEMENT_ERROR (self, RESOURCE, WRITE, ("Driver did not accept the bitstream parameters."), (NULL)); goto done; @@ -1286,6 +1318,16 @@ slice->nalu.size); self->bitstream_map.size += nal_size; + switch (slice->header.type % 5) { + case GST_H264_P_SLICE: + self->decode_params.flags |= V4L2_H264_DECODE_PARAM_FLAG_PFRAME; + break; + + case GST_H264_B_SLICE: + self->decode_params.flags |= V4L2_H264_DECODE_PARAM_FLAG_BFRAME; + break; + } + return GST_FLOW_OK; } @@ -1308,11 +1350,10 @@ static GstFlowReturn gst_v4l2_codec_h264_dec_new_field_picture (GstH264Decoder * decoder, - const GstH264Picture * first_field, GstH264Picture * second_field) + GstH264Picture * first_field, GstH264Picture * second_field) { GstV4l2CodecH264Dec *self = GST_V4L2_CODEC_H264_DEC (decoder); - GstV4l2Request *request = - gst_h264_picture_get_user_data ((GstH264Picture *) first_field); + GstV4l2Request *request = gst_h264_picture_get_user_data (first_field); if (!request) { GST_WARNING_OBJECT (self, @@ -1320,7 +1361,8 @@ return GST_FLOW_OK; } - GST_DEBUG_OBJECT (self, "Assigned request %p to second field.", request); + GST_DEBUG_OBJECT (self, "Assigned request %i to second field.", + gst_v4l2_request_get_fd (request)); /* Associate the previous request with the new picture so that * submit_bitstream can create sub-request */ @@ -1441,6 +1483,7 @@ gst_video_info_init (&self->vinfo); self->slice_params = g_array_sized_new (FALSE, TRUE, sizeof (struct v4l2_ctrl_h264_slice_params), 4); + g_array_set_size (self->slice_params, 4); } static void
View file
gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/gstv4l2codech265dec.c
Added
@@ -0,0 +1,1708 @@ +/* GStreamer + * Copyright (C) 2020 Nicolas Dufresne <nicolas.dufresne@collabora.com> + * Copyright (C) 2020 Safran Passenger Innovations LLC + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "gstv4l2codecallocator.h" +#include "gstv4l2codech265dec.h" +#include "gstv4l2codecpool.h" +#include "gstv4l2format.h" +#include "linux/v4l2-controls.h" + +#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) + +#define V4L2_MIN_KERNEL_VER_MAJOR 5 +#define V4L2_MIN_KERNEL_VER_MINOR 20 +#define V4L2_MIN_KERNEL_VERSION KERNEL_VERSION(V4L2_MIN_KERNEL_VER_MAJOR, V4L2_MIN_KERNEL_VER_MINOR, 0) + +GST_DEBUG_CATEGORY_STATIC (v4l2_h265dec_debug); +#define GST_CAT_DEFAULT v4l2_h265dec_debug + +enum +{ + PROP_0, + PROP_LAST = PROP_0 +}; + +static GstStaticPadTemplate sink_template = +GST_STATIC_PAD_TEMPLATE (GST_VIDEO_DECODER_SINK_NAME, + GST_PAD_SINK, GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-h265, " + "stream-format=(string) { hvc1, hev1, byte-stream }, " + "alignment=(string) au") + ); + +static GstStaticPadTemplate src_template = +GST_STATIC_PAD_TEMPLATE (GST_VIDEO_DECODER_SRC_NAME, + GST_PAD_SRC, GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (GST_V4L2_DEFAULT_VIDEO_FORMATS))); + +struct _GstV4l2CodecH265Dec +{ + GstH265Decoder parent; + GstV4l2Decoder *decoder; + GstVideoCodecState *output_state; + GstVideoInfo vinfo; + gint display_width; + gint display_height; + gint coded_width; + gint coded_height; + guint bitdepth; + guint chroma_format_idc; + guint num_slices; + gboolean first_slice; + + GstV4l2CodecAllocator *sink_allocator; + GstV4l2CodecAllocator *src_allocator; + GstV4l2CodecPool *src_pool; + gint min_pool_size; + gboolean has_videometa; + gboolean streaming; + gboolean copy_frames; + gboolean need_sequence; + + struct v4l2_ctrl_hevc_sps sps; + struct v4l2_ctrl_hevc_pps pps; + struct v4l2_ctrl_hevc_scaling_matrix scaling_matrix; + struct v4l2_ctrl_hevc_decode_params decode_params; + GArray *slice_params; + GArray *entry_point_offsets; + + enum v4l2_stateless_hevc_decode_mode decode_mode; + enum v4l2_stateless_hevc_start_code start_code; + + GstMemory *bitstream; + GstMapInfo bitstream_map; + + gboolean support_scaling_matrix; + gboolean support_slice_parameters; + gboolean support_entry_point_offsets; + + GstVideoConverter *convert; + gboolean need_crop; + gint crop_rect_width, crop_rect_height; + gint crop_rect_x, crop_rect_y; +}; + +G_DEFINE_ABSTRACT_TYPE (GstV4l2CodecH265Dec, gst_v4l2_codec_h265_dec, + GST_TYPE_H265_DECODER); + +#define parent_class gst_v4l2_codec_h265_dec_parent_class + +static gboolean +is_frame_based (GstV4l2CodecH265Dec * self) +{ + return (self->decode_mode == + V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED) && + !self->support_slice_parameters; +} + +static gboolean +is_slice_based (GstV4l2CodecH265Dec * self) +{ + return self->decode_mode == V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED; +} + +static gboolean +is_frame_based_with_slices (GstV4l2CodecH265Dec * self) +{ + return (self->decode_mode == + V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED) && + self->support_slice_parameters; +} + +static gboolean +needs_start_codes (GstV4l2CodecH265Dec * self) +{ + return self->start_code == V4L2_STATELESS_HEVC_START_CODE_ANNEX_B; +} + +static gboolean +gst_v4l2_decoder_h265_api_check (GstV4l2Decoder * decoder) +{ + guint i, ret_size; + /* *INDENT-OFF* */ + #define SET_ID(cid) .id = (cid), .name = #cid + struct + { + const gchar *name; + unsigned int id; + unsigned int size; + gboolean optional; + } controls = { + { + SET_ID (V4L2_CID_STATELESS_HEVC_SPS), + .size = sizeof(struct v4l2_ctrl_hevc_sps), + }, { + SET_ID (V4L2_CID_STATELESS_HEVC_PPS), + .size = sizeof(struct v4l2_ctrl_hevc_pps), + }, { + SET_ID (V4L2_CID_STATELESS_HEVC_SCALING_MATRIX), + .size = sizeof(struct v4l2_ctrl_hevc_scaling_matrix), + .optional = TRUE, + }, { + SET_ID (V4L2_CID_STATELESS_HEVC_DECODE_PARAMS), + .size = sizeof(struct v4l2_ctrl_hevc_decode_params), + }, { + SET_ID (V4L2_CID_STATELESS_HEVC_SLICE_PARAMS), + .size = sizeof(struct v4l2_ctrl_hevc_slice_params), + .optional = TRUE, + } + }; + #undef SET_ID + /* *INDENT-ON* */ + + /* + * Compatibility check: make sure the pointer controls are + * the right size. + */ + for (i = 0; i < G_N_ELEMENTS (controls); i++) { + gboolean control_found; + + control_found = gst_v4l2_decoder_query_control_size (decoder, + controlsi.id, &ret_size); + + if (!controlsi.optional && !control_found) { + GST_WARNING ("Driver is missing %s support.", controlsi.name); + return FALSE; + } + + if (control_found && ret_size != controlsi.size) { + GST_WARNING ("%s control size mismatch: got %d bytes but %d expected.", + controlsi.name, ret_size, controlsi.size); + return FALSE; + } + } + + return TRUE; +} + + +static gboolean +gst_v4l2_codec_h265_dec_open (GstVideoDecoder * decoder) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (decoder); + /* *INDENT-OFF* */ + struct v4l2_ext_control control = { + { + .id = V4L2_CID_STATELESS_HEVC_DECODE_MODE, + }, + { + .id = V4L2_CID_STATELESS_HEVC_START_CODE, + }, + }; + struct v4l2_ext_control scaling_matrix = { + { + .id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX, + .ptr = &self->scaling_matrix, + .size = sizeof (self->scaling_matrix), + }, + }; + /* *INDENT-ON* */ + + if (!gst_v4l2_decoder_open (self->decoder)) { + GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ_WRITE, + ("Failed to open H265 decoder"), + ("gst_v4l2_decoder_open() failed: %s", g_strerror (errno))); + return FALSE; + } + + if (!gst_v4l2_decoder_get_controls (self->decoder, control, + G_N_ELEMENTS (control))) { + GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ_WRITE, + ("Driver did not report framing and start code method."), + ("gst_v4l2_decoder_get_controls() failed: %s", g_strerror (errno))); + return FALSE; + } + + self->support_scaling_matrix = + gst_v4l2_decoder_get_controls (self->decoder, scaling_matrix, + G_N_ELEMENTS (scaling_matrix)); + + self->support_slice_parameters = + gst_v4l2_decoder_query_control_size (self->decoder, + V4L2_CID_STATELESS_HEVC_SLICE_PARAMS, NULL); + + self->support_entry_point_offsets = + gst_v4l2_decoder_query_control_size (self->decoder, + V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS, NULL); + + self->decode_mode = control0.value; + self->start_code = control1.value; + + GST_INFO_OBJECT (self, "Opened H265 %s decoder %s", + is_frame_based (self) ? "frame based" : is_slice_based (self) ? + "slice based" : "frame based with slices", + needs_start_codes (self) ? "using start-codes" : "without start-codes"); + gst_h265_decoder_set_process_ref_pic_lists (GST_H265_DECODER (self), + is_slice_based (self) || is_frame_based_with_slices (self)); + + return TRUE; +} + +static gboolean +gst_v4l2_codec_h265_dec_close (GstVideoDecoder * decoder) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (decoder); + gst_v4l2_decoder_close (self->decoder); + return TRUE; +} + +static void +gst_v4l2_codec_h265_dec_streamoff (GstV4l2CodecH265Dec * self) +{ + if (self->streaming) { + gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SINK); + gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SRC); + self->streaming = FALSE; + } +} + +static void +gst_v4l2_codec_h265_dec_reset_allocation (GstV4l2CodecH265Dec * self) +{ + if (self->sink_allocator) { + gst_v4l2_codec_allocator_detach (self->sink_allocator); + g_clear_object (&self->sink_allocator); + } + + if (self->src_allocator) { + gst_v4l2_codec_allocator_detach (self->src_allocator); + g_clear_object (&self->src_allocator); + g_clear_object (&self->src_pool); + } +} + +static gboolean +gst_v4l2_codec_h265_dec_stop (GstVideoDecoder * decoder) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (decoder); + + gst_v4l2_codec_h265_dec_streamoff (self); + gst_v4l2_codec_h265_dec_reset_allocation (self); + + if (self->output_state) + gst_video_codec_state_unref (self->output_state); + self->output_state = NULL; + + return GST_VIDEO_DECODER_CLASS (parent_class)->stop (decoder); +} + +static gint +get_pixel_bitdepth (GstV4l2CodecH265Dec * self) +{ + gint depth; + + switch (self->chroma_format_idc) { + case 0: + /* 4:0:0 */ + depth = self->bitdepth; + break; + case 1: + /* 4:2:0 */ + depth = self->bitdepth + self->bitdepth / 2; + break; + case 2: + /* 4:2:2 */ + depth = 2 * self->bitdepth; + break; + case 3: + /* 4:4:4 */ + depth = 3 * self->bitdepth; + break; + default: + GST_WARNING_OBJECT (self, "Unsupported chroma format %i", + self->chroma_format_idc); + depth = 0; + break; + } + + return depth; +} + +static gboolean +gst_v4l2_codec_h265_dec_negotiate (GstVideoDecoder * decoder) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (decoder); + GstH265Decoder *h265dec = GST_H265_DECODER (decoder); + /* *INDENT-OFF* */ + struct v4l2_ext_control control = { + { + .id = V4L2_CID_STATELESS_HEVC_SPS, + .ptr = &self->sps, + .size = sizeof (self->sps), + }, + }; + /* *INDENT-ON* */ + GstCaps *filter, *caps; + + /* Ignore downstream renegotiation request. */ + if (self->streaming) + goto done; + + GST_DEBUG_OBJECT (self, "Negotiate"); + + gst_v4l2_codec_h265_dec_reset_allocation (self); + + if (!gst_v4l2_decoder_set_sink_fmt (self->decoder, V4L2_PIX_FMT_HEVC_SLICE, + self->coded_width, self->coded_height, get_pixel_bitdepth (self))) { + GST_ELEMENT_ERROR (self, CORE, NEGOTIATION, + ("Failed to configure H265 decoder"), + ("gst_v4l2_decoder_set_sink_fmt() failed: %s", g_strerror (errno))); + gst_v4l2_decoder_close (self->decoder); + return FALSE; + } + + if (!gst_v4l2_decoder_set_controls (self->decoder, NULL, control, + G_N_ELEMENTS (control))) { + GST_ELEMENT_ERROR (decoder, RESOURCE, WRITE, + ("Driver does not support the selected stream."), (NULL)); + return FALSE; + } + + filter = gst_v4l2_decoder_enum_src_formats (self->decoder); + if (!filter) { + GST_ELEMENT_ERROR (self, CORE, NEGOTIATION, + ("No supported decoder output formats"), (NULL)); + return FALSE; + } + GST_DEBUG_OBJECT (self, "Supported output formats: %" GST_PTR_FORMAT, filter); + + caps = gst_pad_peer_query_caps (decoder->srcpad, filter); + gst_caps_unref (filter); + GST_DEBUG_OBJECT (self, "Peer supported formats: %" GST_PTR_FORMAT, caps); + + if (!gst_v4l2_decoder_select_src_format (self->decoder, caps, &self->vinfo)) { + GST_ELEMENT_ERROR (self, CORE, NEGOTIATION, + ("Unsupported bitdepth/chroma format"), + ("No support for %ux%u %ubit chroma IDC %i", self->coded_width, + self->coded_height, self->bitdepth, self->chroma_format_idc)); + gst_caps_unref (caps); + return FALSE; + } + gst_caps_unref (caps); + +done: + if (self->output_state) + gst_video_codec_state_unref (self->output_state); + + self->output_state = + gst_video_decoder_set_output_state (GST_VIDEO_DECODER (self), + self->vinfo.finfo->format, self->display_width, + self->display_height, h265dec->input_state); + + self->output_state->caps = gst_video_info_to_caps (&self->output_state->info); + + if (GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder)) { + if (self->streaming) + return TRUE; + + if (!gst_v4l2_decoder_streamon (self->decoder, GST_PAD_SINK)) { + GST_ELEMENT_ERROR (self, RESOURCE, FAILED, + ("Could not enable the decoder driver."), + ("VIDIOC_STREAMON(SINK) failed: %s", g_strerror (errno))); + return FALSE; + } + + if (!gst_v4l2_decoder_streamon (self->decoder, GST_PAD_SRC)) { + GST_ELEMENT_ERROR (self, RESOURCE, FAILED, + ("Could not enable the decoder driver."), + ("VIDIOC_STREAMON(SRC) failed: %s", g_strerror (errno))); + return FALSE; + } + + self->streaming = TRUE; + + return TRUE; + } + + return FALSE; +} + +static gboolean +gst_v4l2_codec_h265_dec_decide_allocation (GstVideoDecoder * decoder, + GstQuery * query) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (decoder); + guint min = 0; + + if (self->streaming) + return TRUE; + + self->has_videometa = gst_query_find_allocation_meta (query, + GST_VIDEO_META_API_TYPE, NULL); + + g_clear_object (&self->src_pool); + g_clear_object (&self->src_allocator); + + if (gst_query_get_n_allocation_pools (query) > 0) + gst_query_parse_nth_allocation_pool (query, 0, NULL, NULL, &min, NULL); + + min = MAX (2, min); + + self->sink_allocator = gst_v4l2_codec_allocator_new (self->decoder, + GST_PAD_SINK, self->min_pool_size + 2); + self->src_allocator = gst_v4l2_codec_allocator_new (self->decoder, + GST_PAD_SRC, self->min_pool_size + min + 1); + self->src_pool = gst_v4l2_codec_pool_new (self->src_allocator, &self->vinfo); + + /* Our buffer pool is internal, we will let the base class create a video + * pool, and use it if we are running out of buffers or if downstream does + * not support GstVideoMeta */ + return GST_VIDEO_DECODER_CLASS (parent_class)->decide_allocation + (decoder, query); +} + +static void +gst_v4l2_codec_h265_dec_fill_sequence (GstV4l2CodecH265Dec * self, + const GstH265SPS * sps) +{ + /* Whenever we update teh sps, we need to send it again */ + self->need_sequence = TRUE; + + /* *INDENT-OFF* */ + self->sps = (struct v4l2_ctrl_hevc_sps) { + .video_parameter_set_id = sps->vps->id, + .seq_parameter_set_id = sps->id, + .pic_width_in_luma_samples = sps->pic_width_in_luma_samples, + .pic_height_in_luma_samples = sps->pic_height_in_luma_samples, + .bit_depth_luma_minus8 = sps->bit_depth_luma_minus8, + .bit_depth_chroma_minus8 = sps->bit_depth_chroma_minus8, + .log2_max_pic_order_cnt_lsb_minus4 = sps->log2_max_pic_order_cnt_lsb_minus4, + .sps_max_dec_pic_buffering_minus1 = sps->max_dec_pic_buffering_minus10, + .sps_max_num_reorder_pics = sps->max_num_reorder_pics0, + .sps_max_latency_increase_plus1 = sps->max_latency_increase_plus10, + .log2_min_luma_coding_block_size_minus3 = sps->log2_min_luma_coding_block_size_minus3, + .log2_diff_max_min_luma_coding_block_size = sps->log2_diff_max_min_luma_coding_block_size, + .log2_min_luma_transform_block_size_minus2 = sps->log2_min_transform_block_size_minus2, + .log2_diff_max_min_luma_transform_block_size = sps->log2_diff_max_min_transform_block_size, + .max_transform_hierarchy_depth_inter = sps->max_transform_hierarchy_depth_inter, + .max_transform_hierarchy_depth_intra = sps->max_transform_hierarchy_depth_intra, + .num_short_term_ref_pic_sets = sps->num_short_term_ref_pic_sets, + .num_long_term_ref_pics_sps = sps->num_long_term_ref_pics_sps, + .chroma_format_idc = sps->chroma_format_idc, + .sps_max_sub_layers_minus1 = sps->max_sub_layers_minus1, + .flags = (sps->separate_colour_plane_flag ? V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE : 0) | + (sps->scaling_list_enabled_flag ? V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED : 0) | + (sps->amp_enabled_flag ? V4L2_HEVC_SPS_FLAG_AMP_ENABLED : 0) | + (sps->sample_adaptive_offset_enabled_flag ? V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET : 0) | + (sps->long_term_ref_pics_present_flag ? V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT : 0) | + (sps->temporal_mvp_enabled_flag ? V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED : 0) | + (sps->strong_intra_smoothing_enabled_flag ? V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED : 0), + }; + /* *INDENT-ON* */ + if (sps->pcm_enabled_flag) { + self->sps.pcm_sample_bit_depth_luma_minus1 = + sps->pcm_sample_bit_depth_luma_minus1; + self->sps.pcm_sample_bit_depth_chroma_minus1 = + sps->pcm_sample_bit_depth_chroma_minus1; + self->sps.log2_min_pcm_luma_coding_block_size_minus3 = + sps->log2_min_pcm_luma_coding_block_size_minus3; + self->sps.log2_diff_max_min_pcm_luma_coding_block_size = + sps->log2_diff_max_min_pcm_luma_coding_block_size; + self->sps.flags |= + V4L2_HEVC_SPS_FLAG_PCM_ENABLED | (sps->pcm_loop_filter_disabled_flag ? + V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED : 0); + } +} + +static void +gst_v4l2_codec_h265_dec_fill_pps (GstV4l2CodecH265Dec * self, GstH265PPS * pps) +{ + gint i; + + /* *INDENT-OFF* */ + self->pps = (struct v4l2_ctrl_hevc_pps) { + .pic_parameter_set_id = pps->id, + .num_extra_slice_header_bits = pps->num_extra_slice_header_bits, + .num_ref_idx_l0_default_active_minus1 = pps->num_ref_idx_l0_default_active_minus1, + .num_ref_idx_l1_default_active_minus1 = pps->num_ref_idx_l1_default_active_minus1, + .init_qp_minus26 = pps->init_qp_minus26, + .diff_cu_qp_delta_depth = pps->diff_cu_qp_delta_depth, + .pps_cb_qp_offset = pps->cb_qp_offset, + .pps_cr_qp_offset = pps->cr_qp_offset, + .pps_beta_offset_div2 = pps->beta_offset_div2, + .pps_tc_offset_div2 = pps->tc_offset_div2, + .log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level_minus2, + .flags = (pps->dependent_slice_segments_enabled_flag ? V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED : 0) | + (pps->output_flag_present_flag ? V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT : 0) | + (pps->sign_data_hiding_enabled_flag ? V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED : 0) | + (pps->cabac_init_present_flag ? V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT : 0) | + (pps->constrained_intra_pred_flag ? V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED : 0) | + (pps->transform_skip_enabled_flag ? V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED : 0) | + (pps->cu_qp_delta_enabled_flag ? V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED : 0) | + (pps->slice_chroma_qp_offsets_present_flag ? V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT : 0) | + (pps->weighted_pred_flag ? V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED : 0) | + (pps->weighted_bipred_flag ? V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED : 0) | + (pps->transquant_bypass_enabled_flag ? V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED : 0) | + (pps->tiles_enabled_flag ? V4L2_HEVC_PPS_FLAG_TILES_ENABLED : 0) | + (pps->entropy_coding_sync_enabled_flag ? V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED : 0) | + (pps->loop_filter_across_tiles_enabled_flag ? V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED : 0) | + (pps->loop_filter_across_slices_enabled_flag ? V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED : 0 ) | + (pps->deblocking_filter_override_enabled_flag ? V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED : 0) | + (pps->deblocking_filter_disabled_flag ? V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER : 0) | + (pps->lists_modification_present_flag ? V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT : 0) | + (pps->slice_segment_header_extension_present_flag ? V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT : 0) | + (pps->deblocking_filter_control_present_flag ? V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT : 0) | + (pps->uniform_spacing_flag ? V4L2_HEVC_PPS_FLAG_UNIFORM_SPACING : 0), + }; + /* *INDENT-ON* */ + + if (pps->tiles_enabled_flag) { + self->pps.num_tile_columns_minus1 = pps->num_tile_columns_minus1; + self->pps.num_tile_rows_minus1 = pps->num_tile_rows_minus1; + + /* This should not be needed if we use uniform spacing, but Cedrus driver + * depends on it for now. As GStreamer parser do set that, lets just pass + * the information we have. */ + for (i = 0; i <= pps->num_tile_columns_minus1; i++) + self->pps.column_width_minus1i = pps->column_width_minus1i; + for (i = 0; i <= pps->num_tile_rows_minus1; i++) + self->pps.row_height_minus1i = pps->row_height_minus1i; + } +} + +static void +gst_v4l2_codec_h265_dec_fill_scaling_matrix (GstV4l2CodecH265Dec * self, + GstH265PPS * pps) +{ + GstH265ScalingList *sl; + gint i; + + if (!pps->sps->scaling_list_enabled_flag) { + memset (&self->scaling_matrix, 0, sizeof (self->scaling_matrix)); + return; + } + + if (pps->scaling_list_data_present_flag) + sl = &pps->scaling_list; + else if (pps->sps->scaling_list_data_present_flag) + sl = &pps->sps->scaling_list; + /* The default scaling list is strored in the pps */ + else + sl = &pps->scaling_list; + + for (i = 0; i < G_N_ELEMENTS (sl->scaling_lists_4x4); i++) + gst_h265_quant_matrix_4x4_get_raster_from_uprightdiagonal + (self->scaling_matrix.scaling_list_4x4i, sl->scaling_lists_4x4i); + + for (i = 0; i < G_N_ELEMENTS (sl->scaling_lists_8x8); i++) + gst_h265_quant_matrix_8x8_get_raster_from_uprightdiagonal + (self->scaling_matrix.scaling_list_8x8i, sl->scaling_lists_8x8i); + + for (i = 0; i < G_N_ELEMENTS (sl->scaling_lists_16x16); i++) + gst_h265_quant_matrix_16x16_get_raster_from_uprightdiagonal + (self->scaling_matrix.scaling_list_16x16i, + sl->scaling_lists_16x16i); + + for (i = 0; i < G_N_ELEMENTS (sl->scaling_lists_32x32); i++) + gst_h265_quant_matrix_32x32_get_raster_from_uprightdiagonal + (self->scaling_matrix.scaling_list_32x32i, + sl->scaling_lists_32x32i); + + for (i = 0; i < G_N_ELEMENTS (sl->scaling_list_dc_coef_minus8_16x16); i++) + self->scaling_matrix.scaling_list_dc_coef_16x16i = + sl->scaling_list_dc_coef_minus8_16x16i + 8; + + for (i = 0; i < G_N_ELEMENTS (sl->scaling_list_dc_coef_minus8_32x32); i++) + self->scaling_matrix.scaling_list_dc_coef_32x32i = + sl->scaling_list_dc_coef_minus8_32x32i + 8; +} + +static guint +get_slice_header_byte_offset (GstH265Slice * slice) +{ + guint epb_count, nal_header_bytes; + + epb_count = slice->header.n_emulation_prevention_bytes; + nal_header_bytes = slice->nalu.header_bytes; + + return nal_header_bytes + (slice->header.header_size + 7) / 8 - epb_count; +} + +static void +gst_v4l2_codec_h265_dec_fill_slice_params (GstV4l2CodecH265Dec * self, + GstH265Slice * slice, GstH265Picture * picture) +{ + gint n = self->num_slices++; + GstH265SliceHdr *slice_hdr = &slice->header; + GstH265PPS *pps = slice_hdr->pps; + gsize slice_size = slice->nalu.size; + gsize sc_offset = 0; + struct v4l2_ctrl_hevc_slice_params *params; + gint i, j; + gint chroma_weight, chroma_log2_weight_denom; + /* TODO adjust this if sps_ext is later supported */ + const gint32 WpOffsetHalfRangeC = 1 << 7; + + /* Ensure array is large enough */ + if (self->slice_params->len < self->num_slices) + g_array_set_size (self->slice_params, self->slice_params->len * 2); + + if (needs_start_codes (self)) + sc_offset = 3; + + /* *INDENT-OFF* */ + params = &g_array_index (self->slice_params, struct v4l2_ctrl_hevc_slice_params, n); + *params = (struct v4l2_ctrl_hevc_slice_params) { + .bit_size = (slice_size + sc_offset) * 8, + .data_byte_offset = get_slice_header_byte_offset (slice) + sc_offset, + .num_entry_point_offsets = slice_hdr->num_entry_point_offsets, + .nal_unit_type = slice->nalu.type, + .nuh_temporal_id_plus1 = slice->nalu.temporal_id_plus1, + .slice_type = slice_hdr->type, + .colour_plane_id = slice_hdr->colour_plane_id, + .slice_pic_order_cnt = picture->pic_order_cnt, + .num_ref_idx_l0_active_minus1 = slice_hdr->num_ref_idx_l0_active_minus1, + .num_ref_idx_l1_active_minus1 = slice_hdr->num_ref_idx_l1_active_minus1, + .collocated_ref_idx = slice_hdr->collocated_ref_idx, + .five_minus_max_num_merge_cand = slice_hdr->five_minus_max_num_merge_cand, + .slice_qp_delta = slice_hdr->qp_delta, + .slice_cb_qp_offset = slice_hdr->cb_qp_offset, + .slice_cr_qp_offset = slice_hdr->cr_qp_offset, + .slice_act_y_qp_offset = slice_hdr->slice_act_y_qp_offset, + .slice_act_cb_qp_offset = slice_hdr->slice_act_cb_qp_offset, + .slice_act_cr_qp_offset = slice_hdr->slice_act_cr_qp_offset, + .slice_beta_offset_div2 = slice_hdr->beta_offset_div2, + .slice_tc_offset_div2 = slice_hdr->tc_offset_div2, + .pic_struct = picture->pic_struct, + .slice_segment_addr = slice_hdr->segment_address, + .short_term_ref_pic_set_size = slice_hdr->short_term_ref_pic_set_size, + .long_term_ref_pic_set_size = slice_hdr->long_term_ref_pic_set_size, + .pred_weight_table = (struct v4l2_hevc_pred_weight_table) { + .luma_log2_weight_denom = slice_hdr->pred_weight_table.luma_log2_weight_denom, + .delta_chroma_log2_weight_denom = slice_hdr->pred_weight_table.delta_chroma_log2_weight_denom, + }, + .flags = + (slice_hdr->sao_luma_flag ? V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA : 0) | + (slice_hdr->sao_chroma_flag ? V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA : 0) | + (slice_hdr->temporal_mvp_enabled_flag ? V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED : 0) | + (slice_hdr->mvd_l1_zero_flag ? V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO : 0) | + (slice_hdr->cabac_init_flag ? V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT : 0) | + (slice_hdr->collocated_from_l0_flag ? V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0 : 0) | + (slice_hdr->use_integer_mv_flag ? V4L2_HEVC_SLICE_PARAMS_FLAG_USE_INTEGER_MV : 0) | + (slice_hdr->deblocking_filter_disabled_flag ? + V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED : 0) | + (slice_hdr->loop_filter_across_slices_enabled_flag ? + V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED : 0) | + (slice_hdr->dependent_slice_segment_flag ? + V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT : 0), + }; + /* *INDENT-ON* */ + + for (i = 0; i < slice_hdr->num_entry_point_offsets; i++) { + guint32 entry_point_offset = slice_hdr->entry_point_offset_minus1i + 1; + g_array_append_val (self->entry_point_offsets, entry_point_offset); + } + + if (GST_H265_IS_I_SLICE (slice_hdr) || + (!pps->weighted_pred_flag && GST_H265_IS_P_SLICE (slice_hdr)) || + (!pps->weighted_bipred_flag && GST_H265_IS_B_SLICE (slice_hdr))) + return; + + for (i = 0; i <= slice_hdr->num_ref_idx_l0_active_minus1; i++) { + if (!slice_hdr->pred_weight_table.luma_weight_l0_flagi) + continue; + + params->pred_weight_table.delta_luma_weight_l0i = + slice_hdr->pred_weight_table.delta_luma_weight_l0i; + params->pred_weight_table.luma_offset_l0i = + slice_hdr->pred_weight_table.luma_offset_l0i; + } + + chroma_log2_weight_denom = + slice_hdr->pred_weight_table.luma_log2_weight_denom + + slice_hdr->pred_weight_table.delta_chroma_log2_weight_denom; + + if (slice_hdr->pps->sps->chroma_array_type != 0) { + + for (i = 0; i <= slice_hdr->num_ref_idx_l0_active_minus1; i++) { + if (!slice_hdr->pred_weight_table.chroma_weight_l0_flagi) + continue; + + for (j = 0; j < 2; j++) { + gint16 delta_chroma_offset_l0 = + slice_hdr->pred_weight_table.delta_chroma_offset_l0ij; + gint chroma_offset; + + params->pred_weight_table.delta_chroma_weight_l0ij = + slice_hdr->pred_weight_table.delta_chroma_weight_l0ij; + + /* Find ChromaWeightL0 */ + chroma_weight = (1 << chroma_log2_weight_denom) + + slice_hdr->pred_weight_table.delta_chroma_weight_l0ij; + chroma_offset = WpOffsetHalfRangeC + delta_chroma_offset_l0 - + ((WpOffsetHalfRangeC * chroma_weight) >> chroma_log2_weight_denom); + + /* 7-56 */ + params->pred_weight_table.chroma_offset_l0ij = + CLAMP (chroma_offset, -WpOffsetHalfRangeC, WpOffsetHalfRangeC - 1); + } + } + } + + /* Skip l1 if this is not a B-Frame. */ + if (!GST_H265_IS_B_SLICE (slice_hdr)) + return; + + for (i = 0; i <= slice_hdr->num_ref_idx_l1_active_minus1; i++) { + if (!slice_hdr->pred_weight_table.luma_weight_l1_flagi) + continue; + + params->pred_weight_table.delta_luma_weight_l1i = + slice_hdr->pred_weight_table.delta_luma_weight_l1i; + params->pred_weight_table.luma_offset_l1i = + slice_hdr->pred_weight_table.luma_offset_l1i; + } + + if (slice_hdr->pps->sps->chroma_array_type != 0) { + for (i = 0; i <= slice_hdr->num_ref_idx_l1_active_minus1; i++) { + if (!slice_hdr->pred_weight_table.chroma_weight_l1_flagi) + continue; + + for (j = 0; j < 2; j++) { + gint16 delta_chroma_offset_l1 = + slice_hdr->pred_weight_table.delta_chroma_offset_l1ij; + gint chroma_offset; + + params->pred_weight_table.delta_chroma_weight_l1ij = + slice_hdr->pred_weight_table.delta_chroma_weight_l1ij; + + /* Find ChromaWeightL1 */ + chroma_weight = (1 << chroma_log2_weight_denom) + + slice_hdr->pred_weight_table.delta_chroma_weight_l1ij; + + chroma_offset = WpOffsetHalfRangeC + delta_chroma_offset_l1 - + ((WpOffsetHalfRangeC * chroma_weight) >> chroma_log2_weight_denom); + + /* 7-56 */ + params->pred_weight_table.chroma_offset_l1ij = + CLAMP (chroma_offset, -WpOffsetHalfRangeC, WpOffsetHalfRangeC - 1); + } + } + } +} + +static guint8 +lookup_dpb_index (struct v4l2_hevc_dpb_entry dpb16, GstH265Picture * ref_pic) +{ + guint64 ref_ts; + gint i; + + /* Reference list may have wholes in case a ref is missing, we should mark + * the whole and avoid moving items in the list */ + if (!ref_pic) + return 0xff; + + ref_ts = (guint64) ref_pic->system_frame_number * 1000; + for (i = 0; i < 16; i++) { + if (dpbi.timestamp == ref_ts) + return i; + } + + return 0xff; +} + +static void +gst_v4l2_codec_h265_dec_fill_references (GstV4l2CodecH265Dec * self, + GArray * ref_pic_list0, GArray * ref_pic_list1) +{ + struct v4l2_ctrl_hevc_slice_params *slice_params; + struct v4l2_ctrl_hevc_decode_params *decode_params = &self->decode_params; + gint i; + + slice_params = &g_array_index (self->slice_params, + struct v4l2_ctrl_hevc_slice_params, self->num_slices - 1); + + memset (slice_params->ref_idx_l0, 0xff, sizeof (slice_params->ref_idx_l0)); + memset (slice_params->ref_idx_l1, 0xff, sizeof (slice_params->ref_idx_l1)); + + for (i = 0; i < ref_pic_list0->len; i++) { + GstH265Picture *ref_pic = + g_array_index (ref_pic_list0, GstH265Picture *, i); + slice_params->ref_idx_l0i = + lookup_dpb_index (decode_params->dpb, ref_pic); + } + + for (i = 0; i < ref_pic_list1->len; i++) { + GstH265Picture *ref_pic = + g_array_index (ref_pic_list1, GstH265Picture *, i); + slice_params->ref_idx_l1i = + lookup_dpb_index (decode_params->dpb, ref_pic); + } +} + +static GstFlowReturn +gst_v4l2_codec_h265_dec_new_sequence (GstH265Decoder * decoder, + const GstH265SPS * sps, gint max_dpb_size) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (decoder); + gint crop_width = sps->width; + gint crop_height = sps->height; + gboolean negotiation_needed = FALSE; + + if (self->vinfo.finfo->format == GST_VIDEO_FORMAT_UNKNOWN) + negotiation_needed = TRUE; + + /* TODO check if CREATE_BUFS is supported, and simply grow the pool */ + if (self->min_pool_size < max_dpb_size) { + self->min_pool_size = max_dpb_size; + negotiation_needed = TRUE; + } + + self->need_crop = FALSE; + if (sps->conformance_window_flag) { + crop_width = sps->crop_rect_width; + crop_height = sps->crop_rect_height; + self->crop_rect_width = sps->crop_rect_width; + self->crop_rect_height = sps->crop_rect_height; + self->crop_rect_x = sps->crop_rect_x; + self->crop_rect_y = sps->crop_rect_y; + + /* conformance_window_flag could be set but with zeroed + * parameters so check if we really need to crop */ + self->need_crop |= self->crop_rect_width != sps->width; + self->need_crop |= self->crop_rect_height != sps->height; + self->need_crop |= self->crop_rect_x != 0; + self->need_crop |= self->crop_rect_y != 0; + } + + /* TODO Check if current buffers are large enough, and reuse them */ + if (self->display_width != crop_width || self->display_height != crop_height + || self->coded_width != sps->width || self->coded_height != sps->height) { + self->display_width = crop_width; + self->display_height = crop_height; + self->coded_width = sps->width; + self->coded_height = sps->height; + negotiation_needed = TRUE; + GST_INFO_OBJECT (self, "Resolution changed to %dx%d (%ix%i)", + self->display_width, self->display_height, + self->coded_width, self->coded_height); + } + + if (self->bitdepth != sps->bit_depth_luma_minus8 + 8) { + self->bitdepth = sps->bit_depth_luma_minus8 + 8; + negotiation_needed = TRUE; + GST_INFO_OBJECT (self, "Bitdepth changed to %u", self->bitdepth); + } + + if (self->chroma_format_idc != sps->chroma_format_idc) { + self->chroma_format_idc = sps->chroma_format_idc; + negotiation_needed = TRUE; + GST_INFO_OBJECT (self, "Chroma format changed to %i", + self->chroma_format_idc); + } + + gst_v4l2_codec_h265_dec_fill_sequence (self, sps); + + if (negotiation_needed) { + gst_v4l2_codec_h265_dec_streamoff (self); + if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { + GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); + return GST_FLOW_NOT_NEGOTIATED; + } + } + + /* Check if we can zero-copy buffers */ + if (!self->has_videometa) { + GstVideoInfo ref_vinfo; + gint i; + + gst_video_info_set_format (&ref_vinfo, GST_VIDEO_INFO_FORMAT (&self->vinfo), + self->display_width, self->display_height); + + for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->vinfo); i++) { + if (self->vinfo.stridei != ref_vinfo.stridei || + self->vinfo.offseti != ref_vinfo.offseti) { + GST_WARNING_OBJECT (self, + "GstVideoMeta support required, copying frames."); + self->copy_frames = TRUE; + break; + } + } + } else { + self->copy_frames = self->need_crop; + } + + return GST_FLOW_OK; +} + +static gboolean +gst_v4l2_codec_h265_dec_ensure_bitstream (GstV4l2CodecH265Dec * self) +{ + if (self->bitstream) + goto done; + + self->bitstream = gst_v4l2_codec_allocator_alloc (self->sink_allocator); + + if (!self->bitstream) { + GST_ELEMENT_ERROR (self, RESOURCE, NO_SPACE_LEFT, + ("Not enough memory to decode H265 stream."), (NULL)); + return FALSE; + } + + if (!gst_memory_map (self->bitstream, &self->bitstream_map, GST_MAP_WRITE)) { + GST_ELEMENT_ERROR (self, RESOURCE, WRITE, + ("Could not access bitstream memory for writing"), (NULL)); + g_clear_pointer (&self->bitstream, gst_memory_unref); + return FALSE; + } + +done: + /* We use this field to track how much we have written */ + self->bitstream_map.size = 0; + + return TRUE; +} + +static void +gst_v4l2_codec_h265_dec_fill_decode_params (GstV4l2CodecH265Dec * self, + GstH265Picture * picture, GstH265Slice * slice, GstH265Dpb * dpb) +{ + GstH265Decoder *decoder = (GstH265Decoder *) self; + GArray *refs = gst_h265_dpb_get_pictures_all (dpb); + gint i; + + /* *INDENT-OFF* */ + self->decode_params = (struct v4l2_ctrl_hevc_decode_params) { + .pic_order_cnt_val = picture->pic_order_cnt, + .num_poc_st_curr_before = decoder->NumPocStCurrBefore, + .num_poc_st_curr_after = decoder->NumPocStCurrAfter, + .num_poc_lt_curr = decoder->NumPocLtCurr, + .flags = + (GST_H265_IS_NAL_TYPE_IRAP (slice->nalu.type) ? V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC : 0) | + (GST_H265_IS_NAL_TYPE_IDR (slice->nalu.type) ? V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC : 0) | + (slice->header.no_output_of_prior_pics_flag ? V4L2_HEVC_DECODE_PARAM_FLAG_NO_OUTPUT_OF_PRIOR : 0), + }; + /* *INDENT-ON* */ + + for (i = 0; i < refs->len; i++) { + GstH265Picture *ref_pic = g_array_index (refs, GstH265Picture *, i); + + if (!ref_pic->ref) + continue; + + /* *INDENT-OFF* */ + self->decode_params.dpbself->decode_params.num_active_dpb_entries++ = + (struct v4l2_hevc_dpb_entry) { + /* + * The reference is multiplied by 1000 because it's wassed as micro + * seconds and this TS is nanosecond. + */ + .timestamp = (guint64) ref_pic->system_frame_number * 1000, + .flags = ref_pic->long_term ? V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE : 0, + .field_pic = ref_pic->pic_struct, + .pic_order_cnt_val = ref_pic->pic_order_cnt, + }; + /* *INDENT-ON* */ + } + + for (i = 0; i < 16; i++) { + self->decode_params.poc_st_curr_beforei = + lookup_dpb_index (self->decode_params.dpb, + decoder->RefPicSetStCurrBeforei); + self->decode_params.poc_st_curr_afteri = + lookup_dpb_index (self->decode_params.dpb, + decoder->RefPicSetStCurrAfteri); + self->decode_params.poc_lt_curri = + lookup_dpb_index (self->decode_params.dpb, decoder->RefPicSetLtCurri); + } + + g_array_unref (refs); +} + +static GstFlowReturn +gst_v4l2_codec_h265_dec_start_picture (GstH265Decoder * decoder, + GstH265Picture * picture, GstH265Slice * slice, GstH265Dpb * dpb) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (decoder); + + /* FIXME base class should not call us if negotiation failed */ + if (!self->sink_allocator) + return GST_FLOW_NOT_NEGOTIATED; + + if (!gst_v4l2_codec_h265_dec_ensure_bitstream (self)) + return GST_FLOW_ERROR; + + /* The base class will only emit new_sequence for allocation related changes + * in the SPS, make sure to keep the SPS upt-to-date */ + if (slice->header.pps->sps->id != self->sps.seq_parameter_set_id) + gst_v4l2_codec_h265_dec_fill_sequence (self, slice->header.pps->sps); + + gst_v4l2_codec_h265_dec_fill_pps (self, slice->header.pps); + gst_v4l2_codec_h265_dec_fill_scaling_matrix (self, slice->header.pps); + gst_v4l2_codec_h265_dec_fill_decode_params (self, picture, slice, dpb); + + self->first_slice = TRUE; + self->num_slices = 0; + g_array_set_size (self->entry_point_offsets, 0); + + return GST_FLOW_OK; +} + +static gboolean +gst_v4l2_codec_h265_dec_crop_output_buffer (GstV4l2CodecH265Dec * self, + GstVideoFrame * dest_frame, GstVideoFrame * src_frame) +{ + GstVideoInfo dst_info = dest_frame->info; + + dst_info.fps_n = src_frame->info.fps_n; + dst_info.fps_d = src_frame->info.fps_d; + + if (self->convert) { + gboolean new_convert = FALSE; + gint x = 0, y = 0, width = 0, height = 0; + const GstStructure *config = gst_video_converter_get_config (self->convert); + + if (!gst_structure_get_int (config, GST_VIDEO_CONVERTER_OPT_SRC_X, &x) + || !gst_structure_get_int (config, GST_VIDEO_CONVERTER_OPT_SRC_Y, &y) + || !gst_structure_get_int (config, GST_VIDEO_CONVERTER_OPT_SRC_WIDTH, + &width) + || !gst_structure_get_int (config, GST_VIDEO_CONVERTER_OPT_SRC_HEIGHT, + &height)) + new_convert = TRUE; + + new_convert |= (self->crop_rect_x != x); + new_convert |= (self->crop_rect_y != y); + new_convert |= (self->crop_rect_width != width); + new_convert |= (self->crop_rect_height != height); + + /* No need to check dest, it always has (0,0) -> (width, height) */ + + if (new_convert) + g_clear_pointer (&self->convert, gst_video_converter_free); + } + + if (!self->convert) { + self->convert = gst_video_converter_new (&src_frame->info, &dst_info, + gst_structure_new ("options", + GST_VIDEO_CONVERTER_OPT_DITHER_METHOD, + GST_TYPE_VIDEO_DITHER_METHOD, GST_VIDEO_DITHER_NONE, + GST_VIDEO_CONVERTER_OPT_DITHER_QUANTIZATION, + G_TYPE_UINT, 0, + GST_VIDEO_CONVERTER_OPT_CHROMA_MODE, + GST_TYPE_VIDEO_CHROMA_MODE, GST_VIDEO_CHROMA_MODE_NONE, + GST_VIDEO_CONVERTER_OPT_MATRIX_MODE, + GST_TYPE_VIDEO_MATRIX_MODE, GST_VIDEO_MATRIX_MODE_NONE, + GST_VIDEO_CONVERTER_OPT_SRC_X, G_TYPE_INT, self->crop_rect_x, + GST_VIDEO_CONVERTER_OPT_SRC_Y, G_TYPE_INT, self->crop_rect_y, + GST_VIDEO_CONVERTER_OPT_SRC_WIDTH, G_TYPE_INT, + self->crop_rect_width, GST_VIDEO_CONVERTER_OPT_SRC_HEIGHT, + G_TYPE_INT, self->crop_rect_height, GST_VIDEO_CONVERTER_OPT_DEST_X, + G_TYPE_INT, 0, GST_VIDEO_CONVERTER_OPT_DEST_Y, G_TYPE_INT, 0, + GST_VIDEO_CONVERTER_OPT_DEST_WIDTH, G_TYPE_INT, self->display_width, + GST_VIDEO_CONVERTER_OPT_DEST_HEIGHT, G_TYPE_INT, + self->display_height, NULL)); + + if (!self->convert) { + GST_WARNING_OBJECT (self, "failed to create a video convert"); + return FALSE; + } + } + + gst_video_converter_frame (self->convert, src_frame, dest_frame); + + return TRUE; +} + +static gboolean +gst_v4l2_codec_h265_dec_copy_output_buffer (GstV4l2CodecH265Dec * self, + GstVideoCodecFrame * codec_frame) +{ + GstVideoFrame src_frame; + GstVideoFrame dest_frame; + GstVideoInfo dest_vinfo; + GstBuffer *buffer; + + gst_video_info_set_format (&dest_vinfo, GST_VIDEO_INFO_FORMAT (&self->vinfo), + self->display_width, self->display_height); + + buffer = gst_video_decoder_allocate_output_buffer (GST_VIDEO_DECODER (self)); + if (!buffer) + goto fail; + + if (!gst_video_frame_map (&src_frame, &self->vinfo, + codec_frame->output_buffer, GST_MAP_READ)) + goto fail; + + if (!gst_video_frame_map (&dest_frame, &dest_vinfo, buffer, GST_MAP_WRITE)) { + gst_video_frame_unmap (&dest_frame); + goto fail; + } + + if (self->need_crop) { + if (!gst_v4l2_codec_h265_dec_crop_output_buffer (self, &dest_frame, + &src_frame)) { + gst_video_frame_unmap (&src_frame); + gst_video_frame_unmap (&dest_frame); + GST_ERROR_OBJECT (self, "fail to apply the video crop."); + goto fail; + } + } else { + /* gst_video_frame_copy can crop this, but does not know, so let make it + * think it's all right */ + GST_VIDEO_INFO_WIDTH (&src_frame.info) = self->display_width; + GST_VIDEO_INFO_HEIGHT (&src_frame.info) = self->display_height; + + if (!gst_video_frame_copy (&dest_frame, &src_frame)) { + gst_video_frame_unmap (&src_frame); + gst_video_frame_unmap (&dest_frame); + goto fail; + } + } + + gst_video_frame_unmap (&src_frame); + gst_video_frame_unmap (&dest_frame); + gst_buffer_replace (&codec_frame->output_buffer, buffer); + gst_buffer_unref (buffer); + + return TRUE; + +fail: + GST_ERROR_OBJECT (self, "Failed copy output buffer."); + return FALSE; +} + +static GstFlowReturn +gst_v4l2_codec_h265_dec_output_picture (GstH265Decoder * decoder, + GstVideoCodecFrame * frame, GstH265Picture * picture) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (decoder); + GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); + GstV4l2Request *request = gst_h265_picture_get_user_data (picture); + gint ret; + + if (picture->discont_state) { + if (!gst_video_decoder_negotiate (vdec)) { + GST_ERROR_OBJECT (vdec, "Could not re-negotiate with updated state"); + return FALSE; + } + } + + GST_DEBUG_OBJECT (self, "Output picture %u", picture->system_frame_number); + + ret = gst_v4l2_request_set_done (request); + if (ret == 0) { + GST_ELEMENT_ERROR (self, STREAM, DECODE, + ("Decoding frame %u took too long", picture->system_frame_number), + (NULL)); + goto error; + } else if (ret < 0) { + GST_ELEMENT_ERROR (self, STREAM, DECODE, + ("Decoding request failed: %s", g_strerror (errno)), (NULL)); + goto error; + } + g_return_val_if_fail (frame->output_buffer, GST_FLOW_ERROR); + + if (gst_v4l2_request_failed (request)) { + GST_ELEMENT_ERROR (self, STREAM, DECODE, + ("Failed to decode frame %u", picture->system_frame_number), (NULL)); + goto error; + } + + /* Hold on reference buffers for the rest of the picture lifetime */ + gst_h265_picture_set_user_data (picture, + gst_buffer_ref (frame->output_buffer), (GDestroyNotify) gst_buffer_unref); + + if (self->copy_frames) + gst_v4l2_codec_h265_dec_copy_output_buffer (self, frame); + + gst_h265_picture_unref (picture); + + return gst_video_decoder_finish_frame (vdec, frame); + +error: + gst_video_decoder_drop_frame (vdec, frame); + gst_h265_picture_unref (picture); + + return GST_FLOW_ERROR; +} + +static void +gst_v4l2_codec_h265_dec_reset_picture (GstV4l2CodecH265Dec * self) +{ + if (self->bitstream) { + if (self->bitstream_map.memory) + gst_memory_unmap (self->bitstream, &self->bitstream_map); + g_clear_pointer (&self->bitstream, gst_memory_unref); + self->bitstream_map = (GstMapInfo) GST_MAP_INFO_INIT; + } + + self->num_slices = 0; + g_array_set_size (self->entry_point_offsets, 0); +} + +static gboolean +gst_v4l2_codec_h265_dec_ensure_output_buffer (GstV4l2CodecH265Dec * self, + GstVideoCodecFrame * frame) +{ + GstBuffer *buffer; + GstFlowReturn flow_ret; + + if (frame->output_buffer) + return TRUE; + + flow_ret = gst_buffer_pool_acquire_buffer (GST_BUFFER_POOL (self->src_pool), + &buffer, NULL); + if (flow_ret != GST_FLOW_OK) { + if (flow_ret == GST_FLOW_FLUSHING) + GST_DEBUG_OBJECT (self, "Frame decoding aborted, we are flushing."); + else + GST_ELEMENT_ERROR (self, RESOURCE, WRITE, + ("No more picture buffer available."), (NULL)); + return FALSE; + } + + frame->output_buffer = buffer; + return TRUE; +} + +static gboolean +gst_v4l2_codec_h265_dec_submit_bitstream (GstV4l2CodecH265Dec * self, + GstH265Picture * picture, guint flags) +{ + GstV4l2Request *prev_request, *request = NULL; + gsize bytesused; + gboolean ret = FALSE; + gint num_controls = 0; + + /* *INDENT-OFF* */ + /* Reserve space for controls */ + struct v4l2_ext_control control = { + { }, /* SPS */ + { }, /* PPS */ + { }, /* DECODE_PARAMS */ + { }, /* SLICE_PARAMS */ + { }, /* SCALING_MATRIX */ + { }, /* ENTRY_POINT_OFFSETS */ + }; + /* *INDENT-ON* */ + + prev_request = gst_h265_picture_get_user_data (picture); + + bytesused = self->bitstream_map.size; + gst_memory_unmap (self->bitstream, &self->bitstream_map); + self->bitstream_map = (GstMapInfo) GST_MAP_INFO_INIT; + gst_memory_resize (self->bitstream, 0, bytesused); + + if (prev_request) { + request = gst_v4l2_decoder_alloc_sub_request (self->decoder, prev_request, + self->bitstream); + } else { + GstVideoCodecFrame *frame; + + frame = gst_video_decoder_get_frame (GST_VIDEO_DECODER (self), + picture->system_frame_number); + g_return_val_if_fail (frame, FALSE); + + if (!gst_v4l2_codec_h265_dec_ensure_output_buffer (self, frame)) + goto done; + + request = gst_v4l2_decoder_alloc_request (self->decoder, + picture->system_frame_number, self->bitstream, frame->output_buffer); + + gst_video_codec_frame_unref (frame); + } + + if (!request) { + GST_ELEMENT_ERROR (self, RESOURCE, NO_SPACE_LEFT, + ("Failed to allocate a media request object."), (NULL)); + goto done; + } + + if (self->need_sequence) { + controlnum_controls.id = V4L2_CID_STATELESS_HEVC_SPS; + controlnum_controls.ptr = &self->sps; + controlnum_controls.size = sizeof (self->sps); + num_controls++; + self->need_sequence = FALSE; + } + + if (self->first_slice) { + controlnum_controls.id = V4L2_CID_STATELESS_HEVC_PPS; + controlnum_controls.ptr = &self->pps; + controlnum_controls.size = sizeof (self->pps); + num_controls++; + + if (self->support_scaling_matrix) { + controlnum_controls.id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX; + controlnum_controls.ptr = &self->scaling_matrix; + controlnum_controls.size = sizeof (self->scaling_matrix); + num_controls++; + } + + controlnum_controls.id = V4L2_CID_STATELESS_HEVC_DECODE_PARAMS; + controlnum_controls.ptr = &self->decode_params; + controlnum_controls.size = sizeof (self->decode_params); + num_controls++; + + self->first_slice = FALSE; + } + + /* Slice parameters are only filled for slice based or frame based with + * slices decoders */ + if (self->num_slices && !is_frame_based (self)) { + controlnum_controls.id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS; + controlnum_controls.ptr = self->slice_params->data; + controlnum_controls.size = g_array_get_element_size (self->slice_params) + * self->num_slices; + num_controls++; + + if (self->support_entry_point_offsets && self->entry_point_offsets->len) { + controlnum_controls.id = V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS; + controlnum_controls.ptr = self->entry_point_offsets->data; + controlnum_controls.size = + g_array_get_element_size (self->entry_point_offsets) + * self->entry_point_offsets->len; + num_controls++; + } + } + + if (num_controls > G_N_ELEMENTS (control)) + g_error ("Set too many controls, increase control size"); + + if (!gst_v4l2_decoder_set_controls (self->decoder, request, control, + num_controls)) { + GST_ELEMENT_ERROR (self, RESOURCE, WRITE, + ("Driver did not accept the bitstream parameters."), (NULL)); + goto done; + } + + if (!gst_v4l2_request_queue (request, flags)) { + GST_ELEMENT_ERROR (self, RESOURCE, WRITE, + ("Driver did not accept the decode request."), (NULL)); + goto done; + } + + gst_h265_picture_set_user_data (picture, g_steal_pointer (&request), + (GDestroyNotify) gst_v4l2_request_unref); + ret = TRUE; + +done: + if (request) + gst_v4l2_request_unref (request); + + gst_v4l2_codec_h265_dec_reset_picture (self); + + return ret; +} + +static GstFlowReturn +gst_v4l2_codec_h265_dec_decode_slice (GstH265Decoder * decoder, + GstH265Picture * picture, GstH265Slice * slice, + GArray * ref_pic_list0, GArray * ref_pic_list1) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (decoder); + gsize sc_off = 0; + gsize nal_size; + guint8 *bitstream_data; + + if (!is_frame_based (self)) { + if (is_slice_based (self)) { + if (self->bitstream_map.size) { + /* In slice mode, we submit the pending slice asking the accelerator to + * hold on the picture */ + if (!gst_v4l2_codec_h265_dec_submit_bitstream (self, picture, + V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF) + || !gst_v4l2_codec_h265_dec_ensure_bitstream (self)) + return GST_FLOW_ERROR; + } + } + /* in frame based mode with slices, we need to provide the required data for + * the whole frame, therefore we don't submit the bitstream here */ + gst_v4l2_codec_h265_dec_fill_slice_params (self, slice, picture); + gst_v4l2_codec_h265_dec_fill_references (self, ref_pic_list0, + ref_pic_list1); + } + + /* if it is the first slice segment provide the short and long term + * reference pictures set size */ + if (slice->header.first_slice_segment_in_pic_flag) { + struct v4l2_ctrl_hevc_decode_params *decode_params = &self->decode_params; + + decode_params->short_term_ref_pic_set_size = + slice->header.short_term_ref_pic_set_size; + decode_params->long_term_ref_pic_set_size = + slice->header.long_term_ref_pic_set_size; + } + + bitstream_data = self->bitstream_map.data + self->bitstream_map.size; + + if (needs_start_codes (self)) + sc_off = 3; + nal_size = sc_off + slice->nalu.size; + + if (self->bitstream_map.size + nal_size > self->bitstream_map.maxsize) { + GST_ELEMENT_ERROR (decoder, RESOURCE, NO_SPACE_LEFT, + ("Not enough space to send all slice of an H265 frame."), (NULL)); + return GST_FLOW_ERROR; + } + + if (needs_start_codes (self)) { + bitstream_data0 = 0x00; + bitstream_data1 = 0x00; + bitstream_data2 = 0x01; + } + + memcpy (bitstream_data + sc_off, slice->nalu.data + slice->nalu.offset, + slice->nalu.size); + self->bitstream_map.size += nal_size; + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_v4l2_codec_h265_dec_end_picture (GstH265Decoder * decoder, + GstH265Picture * picture) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (decoder); + + if (!gst_v4l2_codec_h265_dec_submit_bitstream (self, picture, 0)) + return GST_FLOW_ERROR; + + return GST_FLOW_OK; +} + +static guint +gst_v4l2_codec_h265_dec_get_preferred_output_delay (GstH265Decoder * decoder, + gboolean is_live) +{ + + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (decoder); + guint delay; + + if (is_live) + delay = 0; + else + delay = 1; + + gst_v4l2_decoder_set_render_delay (self->decoder, delay); + return delay; +} + +static void +gst_v4l2_codec_h265_dec_set_flushing (GstV4l2CodecH265Dec * self, + gboolean flushing) +{ + if (self->sink_allocator) + gst_v4l2_codec_allocator_set_flushing (self->sink_allocator, flushing); + if (self->src_allocator) + gst_v4l2_codec_allocator_set_flushing (self->src_allocator, flushing); +} + +static gboolean +gst_v4l2_codec_h265_dec_flush (GstVideoDecoder * decoder) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (decoder); + + GST_DEBUG_OBJECT (self, "Flushing decoder state."); + + gst_v4l2_decoder_flush (self->decoder); + gst_v4l2_codec_h265_dec_set_flushing (self, FALSE); + + return GST_VIDEO_DECODER_CLASS (parent_class)->flush (decoder); +} + +static gboolean +gst_v4l2_codec_h265_dec_sink_event (GstVideoDecoder * decoder, GstEvent * event) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (decoder); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_START: + GST_DEBUG_OBJECT (self, "flush start"); + gst_v4l2_codec_h265_dec_set_flushing (self, TRUE); + break; + default: + break; + } + + return GST_VIDEO_DECODER_CLASS (parent_class)->sink_event (decoder, event); +} + +static GstStateChangeReturn +gst_v4l2_codec_h265_dec_change_state (GstElement * element, + GstStateChange transition) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (element); + + if (transition == GST_STATE_CHANGE_PAUSED_TO_READY) + gst_v4l2_codec_h265_dec_set_flushing (self, TRUE); + + return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); +} + +static void +gst_v4l2_codec_h265_dec_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (object); + GObject *dec = G_OBJECT (self->decoder); + + switch (prop_id) { + default: + gst_v4l2_decoder_set_property (dec, prop_id - PROP_LAST, value, pspec); + break; + } +} + +static void +gst_v4l2_codec_h265_dec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (object); + GObject *dec = G_OBJECT (self->decoder); + + switch (prop_id) { + default: + gst_v4l2_decoder_get_property (dec, prop_id - PROP_LAST, value, pspec); + break; + } +} + +static void +gst_v4l2_codec_h265_dec_init (GstV4l2CodecH265Dec * self) +{ +} + +static void +gst_v4l2_codec_h265_dec_subinit (GstV4l2CodecH265Dec * self, + GstV4l2CodecH265DecClass * klass) +{ + self->decoder = gst_v4l2_decoder_new (klass->device); + gst_video_info_init (&self->vinfo); + self->slice_params = g_array_sized_new (FALSE, TRUE, + sizeof (struct v4l2_ctrl_hevc_slice_params), 4); + g_array_set_size (self->slice_params, 4); + self->entry_point_offsets = g_array_sized_new (FALSE, TRUE, + sizeof (guint32), 4); +} + +static void +gst_v4l2_codec_h265_dec_dispose (GObject * object) +{ + GstV4l2CodecH265Dec *self = GST_V4L2_CODEC_H265_DEC (object); + + g_clear_object (&self->decoder); + g_clear_pointer (&self->slice_params, g_array_unref); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_v4l2_codec_h265_dec_class_init (GstV4l2CodecH265DecClass * klass) +{ +} + +static void +gst_v4l2_codec_h265_dec_subclass_init (GstV4l2CodecH265DecClass * klass, + GstV4l2CodecDevice * device) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_CLASS (klass); + GstH265DecoderClass *h265decoder_class = GST_H265_DECODER_CLASS (klass); + + gobject_class->set_property = gst_v4l2_codec_h265_dec_set_property; + gobject_class->get_property = gst_v4l2_codec_h265_dec_get_property; + gobject_class->dispose = gst_v4l2_codec_h265_dec_dispose; + + gst_element_class_set_static_metadata (element_class, + "V4L2 Stateless H.265 Video Decoder", + "Codec/Decoder/Video/Hardware", + "A V4L2 based H.265 video decoder", + "Nicolas Dufresne <nicolas.dufresne@collabora.com>"); + + gst_element_class_add_static_pad_template (element_class, &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + element_class->change_state = + GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_change_state); + + decoder_class->open = GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_open); + decoder_class->close = GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_close); + decoder_class->stop = GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_stop); + decoder_class->negotiate = + GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_negotiate); + decoder_class->decide_allocation = + GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_decide_allocation); + decoder_class->flush = GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_flush); + decoder_class->sink_event = + GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_sink_event); + + h265decoder_class->new_sequence = + GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_new_sequence); + h265decoder_class->output_picture = + GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_output_picture); + h265decoder_class->start_picture = + GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_start_picture); + h265decoder_class->decode_slice = + GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_decode_slice); + h265decoder_class->end_picture = + GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_end_picture); + h265decoder_class->get_preferred_output_delay = + GST_DEBUG_FUNCPTR (gst_v4l2_codec_h265_dec_get_preferred_output_delay); + + klass->device = device; + gst_v4l2_decoder_install_properties (gobject_class, PROP_LAST, device); +} + +void +gst_v4l2_codec_h265_dec_register (GstPlugin * plugin, GstV4l2Decoder * decoder, + GstV4l2CodecDevice * device, guint rank) +{ + GstCaps *src_caps; + guint version; + + GST_DEBUG_CATEGORY_INIT (v4l2_h265dec_debug, "v4l2codecs-h265dec", 0, + "V4L2 stateless h265 decoder"); + + if (!gst_v4l2_decoder_set_sink_fmt (decoder, V4L2_PIX_FMT_HEVC_SLICE, + 320, 240, 8)) + return; + src_caps = gst_v4l2_decoder_enum_src_formats (decoder); + + if (gst_caps_is_empty (src_caps)) { + GST_WARNING ("Not registering H265 decoder since it produces no " + "supported format"); + goto done; + } + + version = gst_v4l2_decoder_get_version (decoder); + if (version < V4L2_MIN_KERNEL_VERSION) + GST_WARNING ("V4L2 API v%u.%u too old, at least v%u.%u required", + (version >> 16) & 0xff, (version >> 8) & 0xff, + V4L2_MIN_KERNEL_VER_MAJOR, V4L2_MIN_KERNEL_VER_MINOR); + + if (!gst_v4l2_decoder_h265_api_check (decoder)) { + GST_WARNING ("Not registering H265 decoder as it failed ABI check."); + goto done; + } + + gst_v4l2_decoder_register (plugin, GST_TYPE_V4L2_CODEC_H265_DEC, + (GClassInitFunc) gst_v4l2_codec_h265_dec_subclass_init, + gst_mini_object_ref (GST_MINI_OBJECT (device)), + (GInstanceInitFunc) gst_v4l2_codec_h265_dec_subinit, + "v4l2sl%sh265dec", device, rank, NULL); + +done: + gst_caps_unref (src_caps); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/gstv4l2codech265dec.h
Added
@@ -0,0 +1,55 @@ +/* GStreamer + * Copyright (C) 2020 Nicolas Dufresne <nicolas.dufresne@collabora.com> + * Copyright (C) 2020 Safran Passenger Innovations LLC + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_V4L2_CODEC_H265_DEC_H__ +#define __GST_V4L2_CODEC_H265_DEC_H__ + +#define GST_USE_UNSTABLE_API +#include <gst/codecs/gsth265decoder.h> + +#include "gstv4l2decoder.h" + +G_BEGIN_DECLS + +#define GST_TYPE_V4L2_CODEC_H265_DEC (gst_v4l2_codec_h265_dec_get_type()) +#define GST_V4L2_CODEC_H265_DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2_CODEC_H265_DEC,GstV4l2CodecH265Dec)) +#define GST_V4L2_CODEC_H265_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_V4L2_CODEC_H265_DEC,GstV4l2CodecH265DecClass)) +#define GST_V4L2_CODEC_H265_DEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_V4L2_CODEC_H265_DEC, GstV4l2CodecH265DecClass)) +#define GST_IS_V4L2_CODEC_H265_DEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_V4L2_CODEC_H265_DEC)) +#define GST_IS_V4L2_CODEC_H265_DEC_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_V4L2_CODEC_H265_DEC)) + +typedef struct _GstV4l2CodecH265Dec GstV4l2CodecH265Dec; +typedef struct _GstV4l2CodecH265DecClass GstV4l2CodecH265DecClass; + +struct _GstV4l2CodecH265DecClass +{ + GstH265DecoderClass parent_class; + GstV4l2CodecDevice *device; +}; + +GType gst_v4l2_codec_h265_dec_get_type (void); +void gst_v4l2_codec_h265_dec_register (GstPlugin * plugin, + GstV4l2Decoder * decoder, + GstV4l2CodecDevice * device, + guint rank); + +G_END_DECLS + +#endif /* __GST_D3D11_H265_DEC_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/v4l2codecs/gstv4l2codecmpeg2dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/gstv4l2codecmpeg2dec.c
Changed
@@ -84,7 +84,7 @@ GstV4l2CodecPool *src_pool; gint min_pool_size; gboolean has_videometa; - gboolean need_negotiation; + gboolean streaming; GstMemory *bitstream; GstMapInfo bitstream_map; @@ -150,6 +150,16 @@ } static void +gst_v4l2_codec_mpeg2_dec_streamoff (GstV4l2CodecMpeg2Dec * self) +{ + if (self->streaming) { + gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SINK); + gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SRC); + self->streaming = FALSE; + } +} + +static void gst_v4l2_codec_mpeg2_dec_reset_allocation (GstV4l2CodecMpeg2Dec * self) { if (self->sink_allocator) { @@ -169,9 +179,7 @@ { GstV4l2CodecMpeg2Dec *self = GST_V4L2_CODEC_MPEG2_DEC (decoder); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SINK); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SRC); - + gst_v4l2_codec_mpeg2_dec_streamoff (self); gst_v4l2_codec_mpeg2_dec_reset_allocation (self); if (self->output_state) @@ -236,15 +244,11 @@ GstCaps *filter, *caps; /* Ignore downstream renegotiation request. */ - if (!self->need_negotiation) - return TRUE; - self->need_negotiation = FALSE; + if (self->streaming) + goto done; GST_DEBUG_OBJECT (self, "Negotiate"); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SINK); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SRC); - gst_v4l2_codec_mpeg2_dec_reset_allocation (self); if (!gst_v4l2_decoder_set_sink_fmt (self->decoder, V4L2_PIX_FMT_MPEG2_SLICE, @@ -285,6 +289,7 @@ } gst_caps_unref (caps); +done: if (self->output_state) gst_video_codec_state_unref (self->output_state); @@ -300,6 +305,9 @@ self->output_state->caps = gst_video_info_to_caps (&self->output_state->info); if (GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder)) { + if (self->streaming) + return TRUE; + if (!gst_v4l2_decoder_streamon (self->decoder, GST_PAD_SINK)) { GST_ELEMENT_ERROR (self, RESOURCE, FAILED, ("Could not enable the decoder driver."), @@ -314,6 +322,8 @@ return FALSE; } + self->streaming = TRUE; + return TRUE; } @@ -360,7 +370,7 @@ const GstMpegVideoSequenceHdr * seq, const GstMpegVideoSequenceExt * seq_ext, const GstMpegVideoSequenceDisplayExt * seq_display_ext, - const GstMpegVideoSequenceScalableExt * seq_scalable_ext) + const GstMpegVideoSequenceScalableExt * seq_scalable_ext, gint max_dpb_size) { GstV4l2CodecMpeg2Dec *self = GST_V4L2_CODEC_MPEG2_DEC (decoder); gboolean negotiation_needed = FALSE; @@ -418,7 +428,7 @@ GST_INFO_OBJECT (self, "Profile change %d -> %d", self->profile, mpeg_profile); self->profile = mpeg_profile; - self->need_negotiation = TRUE; + self->streaming = TRUE; } if (self->vinfo.finfo->format == GST_VIDEO_FORMAT_UNKNOWN) @@ -449,7 +459,7 @@ /* *INDENT-ON* */ if (negotiation_needed) { - self->need_negotiation = TRUE; + gst_v4l2_codec_mpeg2_dec_streamoff (self); if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); return GST_FLOW_ERROR; @@ -672,6 +682,13 @@ GstV4l2Request *request = gst_mpeg2_picture_get_user_data (picture); gint ret; + if (picture->discont_state) { + if (!gst_video_decoder_negotiate (vdec)) { + GST_ERROR_OBJECT (vdec, "Could not re-negotiate with updated state"); + return FALSE; + } + } + GST_DEBUG_OBJECT (self, "Output picture %u", picture->system_frame_number); ret = gst_v4l2_request_set_done (request);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/v4l2codecs/gstv4l2codecvp8dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/gstv4l2codecvp8dec.c
Changed
@@ -73,7 +73,7 @@ GstV4l2CodecPool *src_pool; gint min_pool_size; gboolean has_videometa; - gboolean need_negotiation; + gboolean streaming; gboolean copy_frames; struct v4l2_ctrl_vp8_frame frame_header; @@ -137,6 +137,16 @@ } static void +gst_v4l2_codec_vp8_dec_streamoff (GstV4l2CodecVp8Dec * self) +{ + if (self->streaming) { + gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SINK); + gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SRC); + self->streaming = FALSE; + } +} + +static void gst_v4l2_codec_vp8_dec_reset_allocation (GstV4l2CodecVp8Dec * self) { if (self->sink_allocator) { @@ -156,9 +166,7 @@ { GstV4l2CodecVp8Dec *self = GST_V4L2_CODEC_VP8_DEC (decoder); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SINK); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SRC); - + gst_v4l2_codec_vp8_dec_streamoff (self); gst_v4l2_codec_vp8_dec_reset_allocation (self); if (self->output_state) @@ -185,15 +193,11 @@ GstCaps *filter, *caps; /* Ignore downstream renegotiation request. */ - if (!self->need_negotiation) - return TRUE; - self->need_negotiation = FALSE; + if (self->streaming) + goto done; GST_DEBUG_OBJECT (self, "Negotiate"); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SINK); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SRC); - gst_v4l2_codec_vp8_dec_reset_allocation (self); if (!gst_v4l2_decoder_set_sink_fmt (self->decoder, V4L2_PIX_FMT_VP8_FRAME, @@ -234,6 +238,7 @@ } gst_caps_unref (caps); +done: if (self->output_state) gst_video_codec_state_unref (self->output_state); @@ -245,6 +250,9 @@ self->output_state->caps = gst_video_info_to_caps (&self->output_state->info); if (GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder)) { + if (self->streaming) + return TRUE; + if (!gst_v4l2_decoder_streamon (self->decoder, GST_PAD_SINK)) { GST_ELEMENT_ERROR (self, RESOURCE, FAILED, ("Could not enable the decoder driver."), @@ -259,6 +267,8 @@ return FALSE; } + self->streaming = TRUE; + return TRUE; } @@ -273,6 +283,9 @@ guint min = 0; guint num_bitstream; + if (self->streaming) + return TRUE; + self->has_videometa = gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); @@ -450,7 +463,7 @@ static GstFlowReturn gst_v4l2_codec_vp8_dec_new_sequence (GstVp8Decoder * decoder, - const GstVp8FrameHdr * frame_hdr) + const GstVp8FrameHdr * frame_hdr, gint max_dpb_size) { GstV4l2CodecVp8Dec *self = GST_V4L2_CODEC_VP8_DEC (decoder); gboolean negotiation_needed = FALSE; @@ -470,7 +483,7 @@ gst_v4l2_codec_vp8_dec_fill_frame_header (self, frame_hdr); if (negotiation_needed) { - self->need_negotiation = TRUE; + gst_v4l2_codec_vp8_dec_streamoff (self); if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); return GST_FLOW_NOT_NEGOTIATED; @@ -710,6 +723,13 @@ GstV4l2Request *request = gst_vp8_picture_get_user_data (picture); gint ret; + if (picture->discont_state) { + if (!gst_video_decoder_negotiate (vdec)) { + GST_ERROR_OBJECT (vdec, "Could not re-negotiate with updated state"); + return FALSE; + } + } + GST_DEBUG_OBJECT (self, "Output picture %u", picture->system_frame_number); ret = gst_v4l2_request_set_done (request);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/v4l2codecs/gstv4l2codecvp9dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/gstv4l2codecvp9dec.c
Changed
@@ -34,7 +34,7 @@ #define GST_CAT_DEFAULT v4l2_vp9dec_debug /* Used to mark picture that have been outputed */ -#define FLAG_PICTURE_OUTPUTED GST_MINI_OBJECT_FLAG_LAST +#define FLAG_PICTURE_HOLDS_BUFFER GST_MINI_OBJECT_FLAG_LAST enum { @@ -73,7 +73,7 @@ GstV4l2CodecAllocator *src_allocator; GstV4l2CodecPool *src_pool; gboolean has_videometa; - gboolean need_negotiation; + gboolean streaming; gboolean copy_frames; struct v4l2_ctrl_vp9_frame v4l2_vp9_frame; @@ -382,6 +382,10 @@ return FALSE; } + vp9dec->parse_compressed_headers = + gst_v4l2_decoder_query_control_size (self->decoder, + V4L2_CID_STATELESS_VP9_COMPRESSED_HDR, NULL); + /* V4L2 does not support non-keyframe resolution change, this will ask the * base class to drop frame until the next keyframe as a workaround. */ gst_vp9_decoder_set_non_keyframe_format_change_support (vp9dec, FALSE); @@ -398,6 +402,16 @@ } static void +gst_v4l2_codec_vp9_dec_streamoff (GstV4l2CodecVp9Dec * self) +{ + if (self->streaming) { + gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SINK); + gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SRC); + self->streaming = FALSE; + } +} + +static void gst_v4l2_codec_vp9_dec_reset_allocation (GstV4l2CodecVp9Dec * self) { if (self->sink_allocator) { @@ -447,15 +461,11 @@ GstCaps *filter, *caps; /* Ignore downstream renegotiation request. */ - if (!self->need_negotiation) - return TRUE; - self->need_negotiation = FALSE; + if (self->streaming) + goto done; GST_DEBUG_OBJECT (self, "Negotiate"); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SINK); - gst_v4l2_decoder_streamoff (self->decoder, GST_PAD_SRC); - gst_v4l2_codec_vp9_dec_reset_allocation (self); if (!gst_v4l2_decoder_set_sink_fmt (self->decoder, V4L2_PIX_FMT_VP9_FRAME, @@ -495,6 +505,7 @@ } gst_caps_unref (caps); +done: if (self->output_state) gst_video_codec_state_unref (self->output_state); @@ -506,6 +517,9 @@ self->output_state->caps = gst_video_info_to_caps (&self->output_state->info); if (GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder)) { + if (self->streaming) + return TRUE; + if (!gst_v4l2_decoder_streamon (self->decoder, GST_PAD_SINK)) { GST_ELEMENT_ERROR (self, RESOURCE, FAILED, ("Could not enable the decoder driver."), @@ -520,6 +534,8 @@ return FALSE; } + self->streaming = TRUE; + return TRUE; } @@ -576,7 +592,7 @@ static GstFlowReturn gst_v4l2_codec_vp9_dec_new_sequence (GstVp9Decoder * decoder, - const GstVp9FrameHeader * frame_hdr) + const GstVp9FrameHeader * frame_hdr, gint max_dpb_size) { GstV4l2CodecVp9Dec *self = GST_V4L2_CODEC_VP9_DEC (decoder); gboolean negotiation_needed = FALSE; @@ -636,10 +652,12 @@ } gst_v4l2_codec_vp9_dec_fill_dec_params (self, frame_hdr, NULL); - gst_v4l2_codec_vp9_dec_fill_prob_updates (self, frame_hdr); + + if (decoder->parse_compressed_headers) + gst_v4l2_codec_vp9_dec_fill_prob_updates (self, frame_hdr); if (negotiation_needed) { - self->need_negotiation = TRUE; + gst_v4l2_codec_vp9_dec_streamoff (self); if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); return GST_FLOW_ERROR; @@ -749,6 +767,7 @@ GstV4l2Request *request = NULL; GstFlowReturn flow_ret; gsize bytesused; + guint num_controls = 1; /* *INDENT-OFF* */ struct v4l2_ext_control decode_params_control = { @@ -758,11 +777,17 @@ .size = sizeof(self->v4l2_vp9_frame), }, { + /* V4L2_CID_STATELESS_VP9_COMPRESSED_HDR */ + }, + }; + + if (decoder->parse_compressed_headers) { + decode_params_controlnum_controls++ = (struct v4l2_ext_control) { .id = V4L2_CID_STATELESS_VP9_COMPRESSED_HDR, .ptr = &self->v4l2_delta_probs, .size = sizeof (self->v4l2_delta_probs), - }, - }; + }; + } /* *INDENT-ON* */ bytesused = self->bitstream_map.size; @@ -797,7 +822,7 @@ } if (!gst_v4l2_decoder_set_controls (self->decoder, request, - decode_params_control, G_N_ELEMENTS (decode_params_control))) { + decode_params_control, num_controls)) { GST_ELEMENT_ERROR (decoder, RESOURCE, WRITE, ("Driver did not accept the bitstream parameters."), (NULL)); goto fail; @@ -884,10 +909,22 @@ new_picture->frame_hdr = picture->frame_hdr; new_picture->system_frame_number = frame->system_frame_number; - if (GST_MINI_OBJECT_FLAG_IS_SET (picture, FLAG_PICTURE_OUTPUTED)) { + if (GST_MINI_OBJECT_FLAG_IS_SET (picture, FLAG_PICTURE_HOLDS_BUFFER)) { GstBuffer *output_buffer = gst_vp9_picture_get_user_data (picture); - if (output_buffer) + + if (output_buffer) { frame->output_buffer = gst_buffer_ref (output_buffer); + + /* We need to also hold on the picture so it stays alive, but also to + * ensure we can duplicate it too. */ + gst_vp9_picture_set_user_data (new_picture, + gst_buffer_ref (frame->output_buffer), + (GDestroyNotify) gst_buffer_unref); + } + + /* Flag regardless if the buffer is null, so we don't start thinking it + * should hold a request unconditionally. */ + GST_MINI_OBJECT_FLAG_SET (new_picture, FLAG_PICTURE_HOLDS_BUFFER); } else { GstV4l2Request *request = gst_vp9_picture_get_user_data (picture); gst_vp9_picture_set_user_data (new_picture, gst_v4l2_request_ref (request), @@ -904,11 +941,21 @@ { GstV4l2CodecVp9Dec *self = GST_V4L2_CODEC_VP9_DEC (decoder); GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); - GstV4l2Request *request = gst_vp9_picture_get_user_data (picture); + GstV4l2Request *request = NULL; gint ret; + if (picture->discont_state) { + if (!gst_video_decoder_negotiate (vdec)) { + GST_ERROR_OBJECT (vdec, "Could not re-negotiate with updated state"); + return FALSE; + } + } + GST_DEBUG_OBJECT (self, "Output picture %u", picture->system_frame_number); + if (!GST_MINI_OBJECT_FLAG_IS_SET (picture, FLAG_PICTURE_HOLDS_BUFFER)) + request = gst_vp9_picture_get_user_data (picture); + if (request) { ret = gst_v4l2_request_set_done (request); if (ret == 0) { @@ -933,7 +980,7 @@ gst_buffer_ref (frame->output_buffer), (GDestroyNotify) gst_buffer_unref); - GST_MINI_OBJECT_FLAG_SET (picture, FLAG_PICTURE_OUTPUTED); + GST_MINI_OBJECT_FLAG_SET (picture, FLAG_PICTURE_HOLDS_BUFFER); } /* This may happen if we duplicate a picture witch failed to decode */ @@ -1040,8 +1087,6 @@ static void gst_v4l2_codec_vp9_dec_init (GstV4l2CodecVp9Dec * self) { - GstVp9Decoder *parent = GST_VP9_DECODER (self); - parent->parse_compressed_headers = TRUE; } static void
View file
gst-plugins-bad-1.20.5.tar.xz/sys/v4l2codecs/gstv4l2decoder.c -> gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/gstv4l2decoder.c
Changed
@@ -36,7 +36,7 @@ #include <gst/base/base.h> -#define IMAGE_MINSZ 4096 +#define IMAGE_MINSZ (256*1024) /* 256kB */ GST_DEBUG_CATEGORY (v4l2_decoder_debug); #define GST_CAT_DEFAULT v4l2_decoder_debug @@ -87,6 +87,9 @@ gchar *media_device; gchar *video_device; guint render_delay; + + /* detected features */ + gboolean supports_holding_capture; }; G_DEFINE_TYPE_WITH_CODE (GstV4l2Decoder, gst_v4l2_decoder, GST_TYPE_OBJECT, @@ -353,6 +356,79 @@ return TRUE; } +static GstCaps * +gst_v4l2_decoder_enum_size_for_format (GstV4l2Decoder * self, + guint32 pixelformat, gint index, gint unscaled_width, gint unscaled_height) +{ + struct v4l2_frmsizeenum size; + GstVideoFormat format; + gint ret; + gboolean res; + + memset (&size, 0, sizeof (struct v4l2_frmsizeenum)); + size.index = index; + size.pixel_format = pixelformat; + + GST_DEBUG_OBJECT (self, "enumerate size index %d for %" GST_FOURCC_FORMAT, + index, GST_FOURCC_ARGS (pixelformat)); + + ret = ioctl (self->video_fd, VIDIOC_ENUM_FRAMESIZES, &size); + + if (ret < 0) + return NULL; + + if (size.type != V4L2_FRMSIZE_TYPE_DISCRETE) { + GST_WARNING_OBJECT (self, "V4L2_FRMSIZE type not supported"); + return NULL; + } + + if (gst_util_fraction_compare (unscaled_width, unscaled_height, + size.discrete.width, size.discrete.height)) { + GST_DEBUG_OBJECT (self, + "Pixel ratio modification not supported %dx%d %dx%d (%d)", + unscaled_width, unscaled_height, size.discrete.width, + size.discrete.height, ret); + return NULL; + } + + res = gst_v4l2_format_to_video_format (pixelformat, &format); + g_assert (res); + + GST_DEBUG_OBJECT (self, "get size (%d x %d) index %d for %" GST_FOURCC_FORMAT, + size.discrete.width, size.discrete.height, index, + GST_FOURCC_ARGS (pixelformat)); + + return gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, + gst_video_format_to_string (format), + "width", G_TYPE_INT, size.discrete.width, + "height", G_TYPE_INT, size.discrete.height, NULL); +} + +static GstCaps * +gst_v4l2_decoder_probe_caps_for_format (GstV4l2Decoder * self, + guint32 pixelformat, gint unscaled_width, gint unscaled_height) +{ + gint index = 0; + GstCaps *caps, *tmp; + GstVideoFormat format; + + GST_DEBUG_OBJECT (self, "enumerate size for %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (pixelformat)); + + if (!gst_v4l2_format_to_video_format (pixelformat, &format)) + return gst_caps_new_empty (); + + caps = gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, + gst_video_format_to_string (format), NULL); + + while ((tmp = gst_v4l2_decoder_enum_size_for_format (self, pixelformat, + index++, unscaled_width, unscaled_height))) { + caps = gst_caps_merge (caps, tmp); + } + + return caps; +} + GstCaps * gst_v4l2_decoder_enum_src_formats (GstV4l2Decoder * self) { @@ -360,10 +436,7 @@ struct v4l2_format fmt = { .type = self->src_buf_type, }; - GstVideoFormat format; GstCaps *caps; - GValue list = G_VALUE_INIT; - GValue value = G_VALUE_INIT; gint i; g_return_val_if_fail (self->opened, FALSE); @@ -374,20 +447,15 @@ return FALSE; } - /* We first place a structure with the default pixel format */ - if (gst_v4l2_format_to_video_format (fmt.fmt.pix_mp.pixelformat, &format)) - caps = gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, - gst_video_format_to_string (format), NULL); - else - caps = gst_caps_new_empty (); + caps = + gst_v4l2_decoder_probe_caps_for_format (self, + fmt.fmt.pix_mp.pixelformat, fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height); /* And then enumerate other possible formats and place that as a second * structure in the caps */ - g_value_init (&list, GST_TYPE_LIST); - g_value_init (&value, G_TYPE_STRING); - for (i = 0; ret >= 0; i++) { struct v4l2_fmtdesc fmtdesc = { i, self->src_buf_type, }; + GstCaps *tmp; ret = ioctl (self->video_fd, VIDIOC_ENUM_FMT, &fmtdesc); if (ret < 0) { @@ -397,19 +465,9 @@ continue; } - if (gst_v4l2_format_to_video_format (fmtdesc.pixelformat, &format)) { - g_value_set_static_string (&value, gst_video_format_to_string (format)); - gst_value_list_append_value (&list, &value); - } - } - g_value_reset (&value); - - if (gst_value_list_get_size (&list) > 0) { - GstStructure *str = gst_structure_new_empty ("video/x-raw"); - gst_structure_take_value (str, "format", &list); - gst_caps_append_structure (caps, str); - } else { - g_value_reset (&list); + tmp = gst_v4l2_decoder_probe_caps_for_format (self, fmtdesc.pixelformat, + fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height); + caps = gst_caps_merge (caps, tmp); } return caps; @@ -488,6 +546,13 @@ return ret; } + if (direction == GST_PAD_SINK) { + if (reqbufs.capabilities & V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF) + self->supports_holding_capture = TRUE; + else + self->supports_holding_capture = FALSE; + } + return reqbufs.count; } @@ -740,7 +805,8 @@ .id = control_id, }; - *control_size = 0; + if (control_size) + *control_size = 0; ret = ioctl (self->video_fd, VIDIOC_QUERY_EXT_CTRL, &control); if (ret < 0) @@ -750,7 +816,8 @@ */ return FALSE; - *control_size = control.elem_size; + if (control_size) + *control_size = control.elem_size; return TRUE; } @@ -1051,7 +1118,7 @@ if (request->pending) { gint idx; - GST_DEBUG_OBJECT (decoder, "Freeing pending request %p.", request); + GST_DEBUG_OBJECT (decoder, "Freeing pending request %i.", request->fd); idx = gst_queue_array_find (decoder->pending_requests, NULL, request); if (idx >= 0) @@ -1061,7 +1128,7 @@ return; } - GST_TRACE_OBJECT (decoder, "Recycling request %p.", request); + GST_TRACE_OBJECT (decoder, "Recycling request %i.", request->fd); ret = ioctl (request->fd, MEDIA_REQUEST_IOC_REINIT, NULL); if (ret < 0) { @@ -1082,7 +1149,16 @@ gint ret; guint max_pending; - GST_TRACE_OBJECT (decoder, "Queuing request %p.", request); + GST_TRACE_OBJECT (decoder, "Queuing request %i.", request->fd); + + /* this would lead to stalls if we tried to use this feature and it wasn't + * supported. */ + if ((flags & V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF) + && !decoder->supports_holding_capture) { + GST_ERROR_OBJECT (decoder, + "Driver does not support holding capture buffer."); + return FALSE; + } if (!gst_v4l2_decoder_queue_sink_mem (decoder, request, request->bitstream, request->frame_num, flags)) { @@ -1132,15 +1208,18 @@ if (!request->pending) return 1; + GST_DEBUG_OBJECT (decoder, "Waiting for request %i to complete.", + request->fd); + ret = gst_poll_wait (request->poll, GST_SECOND); if (ret == 0) { - GST_WARNING_OBJECT (decoder, "Request %p took too long.", request); + GST_WARNING_OBJECT (decoder, "Request %i took too long.", request->fd); return 0; } if (ret < 0) { - GST_WARNING_OBJECT (decoder, "Request %p error: %s (%i)", - request, g_strerror (errno), errno); + GST_WARNING_OBJECT (decoder, "Request %i error: %s (%i)", + request->fd, g_strerror (errno), errno); return ret; } @@ -1185,3 +1264,9 @@ { return gst_buffer_ref (request->pic_buf); } + +gint +gst_v4l2_request_get_fd (GstV4l2Request * request) +{ + return request->fd; +}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/v4l2codecs/gstv4l2decoder.h -> gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/gstv4l2decoder.h
Changed
@@ -138,6 +138,8 @@ GstBuffer * gst_v4l2_request_dup_pic_buf (GstV4l2Request * request); +gint gst_v4l2_request_get_fd (GstV4l2Request * request); + G_END_DECLS #endif /* __GST_V4L2_DECODER_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/v4l2codecs/gstv4l2format.c -> gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/gstv4l2format.c
Changed
@@ -36,6 +36,9 @@ {V4L2_PIX_FMT_YUYV, 1, GST_VIDEO_FORMAT_YUY2, 8, 422}, {V4L2_PIX_FMT_SUNXI_TILED_NV12, 1, GST_VIDEO_FORMAT_NV12_32L32, 8, 422}, {V4L2_PIX_FMT_NV12_4L4, 1, GST_VIDEO_FORMAT_NV12_4L4, 8, 420}, + {V4L2_PIX_FMT_MM21, 2, GST_VIDEO_FORMAT_NV12_16L32S, 8, 420}, + {V4L2_PIX_FMT_YUV420M, 3, GST_VIDEO_FORMAT_I420, 8, 420}, + {V4L2_PIX_FMT_P010, 1, GST_VIDEO_FORMAT_P010_10LE, 16, 420}, {0,} }; @@ -71,48 +74,22 @@ return ret; } -static gint -extrapolate_stride (const GstVideoFormatInfo * finfo, gint plane, gint stride) -{ - gint estride; - - switch (finfo->format) { - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV12_4L4: - case GST_VIDEO_FORMAT_NV12_32L32: - case GST_VIDEO_FORMAT_NV12_64Z32: - case GST_VIDEO_FORMAT_NV16: - case GST_VIDEO_FORMAT_NV21: - case GST_VIDEO_FORMAT_NV24: - case GST_VIDEO_FORMAT_NV61: - estride = (plane == 0 ? 1 : 2) * - GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (finfo, plane, stride); - break; - default: - estride = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (finfo, plane, stride); - break; - } - - return estride; -} - static void set_stride (GstVideoInfo * info, gint plane, gint stride) { const GstVideoFormatInfo *finfo = info->finfo; if (GST_VIDEO_FORMAT_INFO_IS_TILED (finfo)) { - gint x_tiles, y_tiles, ws, hs, padded_height; + guint x_tiles, y_tiles, tile_height, padded_height; - ws = GST_VIDEO_FORMAT_INFO_TILE_WS (finfo); - hs = GST_VIDEO_FORMAT_INFO_TILE_HS (finfo); + tile_height = GST_VIDEO_FORMAT_INFO_TILE_HEIGHT (finfo, plane); padded_height = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (finfo, plane, info->height); - padded_height = GST_ROUND_UP_N (padded_height, 1 << hs); + padded_height = (padded_height + tile_height - 1) / tile_height; - x_tiles = stride >> ws; - y_tiles = padded_height >> hs; + x_tiles = stride / GST_VIDEO_FORMAT_INFO_TILE_STRIDE (finfo, plane); + y_tiles = padded_height / tile_height; info->strideplane = GST_VIDEO_TILE_MAKE_STRIDE (x_tiles, y_tiles); } else { info->strideplane = stride; @@ -127,12 +104,21 @@ struct v4l2_pix_format *pix = &fmt->fmt.pix; gint plane; gsize offset = 0; + gboolean extrapolate = FALSE; if (!entry) return FALSE; - if (entry->num_planes != 1) { - GST_FIXME ("Multi allocation formats are not supported yet"); + /* validate the entry against the format */ + if (V4L2_TYPE_IS_MULTIPLANAR (fmt->type)) { + if (entry->num_planes != pix_mp->num_planes) { + GST_ERROR ("Miss-matched number of planes in internal entry " + "(%i != %i)", entry->num_planes, pix_mp->num_planes); + return FALSE; + } + } else if (entry->num_planes != 1) { + GST_ERROR ("Miss-matched number of planes in internal entry " + "(must be 1 for non-multiplanar, got %i)", entry->num_planes); return FALSE; } @@ -141,27 +127,52 @@ return FALSE; if (V4L2_TYPE_IS_MULTIPLANAR (fmt->type)) { - /* TODO: We don't support multi-allocation yet */ - g_return_val_if_fail (pix_mp->num_planes == 1, FALSE); - out_info->size = pix_mp->plane_fmt0.sizeimage; + out_info->size = 0; + for (plane = 0; plane < pix_mp->num_planes; plane++) + out_info->size += pix_mp->plane_fmtplane.sizeimage; } else { out_info->size = pix->sizeimage; } + /* + * When single allocation formats are used for planar formats we need to + * extrapolate the per-plane stride. Do this check once to prevent + * complex inner loop. + */ + if (entry->num_planes == 1 && out_info->finfo->n_planes != entry->num_planes) + extrapolate = TRUE; + for (plane = 0; plane < GST_VIDEO_INFO_N_PLANES (out_info); plane++) { gint stride; - if (V4L2_TYPE_IS_MULTIPLANAR (fmt->type)) - stride = extrapolate_stride (out_info->finfo, plane, - pix_mp->plane_fmt0.bytesperline); - else - stride = extrapolate_stride (out_info->finfo, plane, pix->bytesperline); + if (V4L2_TYPE_IS_MULTIPLANAR (fmt->type)) { + if (extrapolate) + stride = gst_video_format_info_extrapolate_stride (out_info->finfo, + plane, pix_mp->plane_fmt0.bytesperline); + else + stride = pix_mp->plane_fmtplane.bytesperline; + } else { + if (extrapolate) + stride = gst_video_format_info_extrapolate_stride (out_info->finfo, + plane, pix->bytesperline); + else + stride = pix->bytesperline; + } set_stride (out_info, plane, stride); out_info->offsetplane = offset; - offset += stride * GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (out_info->finfo, - plane, pix_mp->height); + if ((V4L2_TYPE_IS_MULTIPLANAR (fmt->type) && !extrapolate)) + offset += pix_mp->plane_fmtplane.sizeimage; + else + offset += stride * GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (out_info->finfo, + plane, pix_mp->height); + } + + /* Check that the extrapolation didn't overflow the reported sizeimage */ + if (extrapolate && offset > out_info->size) { + GST_ERROR ("Extrapolated plane offset overflow the image size."); + return FALSE; } return TRUE;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/v4l2codecs/gstv4l2format.h -> gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/gstv4l2format.h
Changed
@@ -24,7 +24,7 @@ #include <gst/video/video.h> #include "linux/videodev2.h" -#define GST_V4L2_DEFAULT_VIDEO_FORMATS "{ NV12, YUY2, NV12_4L4, NV12_32L32 }" +#define GST_V4L2_DEFAULT_VIDEO_FORMATS "{ NV12, YUY2, NV12_4L4, NV12_32L32, NV12_16L32S, I420, P010_10LE}" gboolean gst_v4l2_format_to_video_info (struct v4l2_format * fmt, GstVideoInfo * out_info);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/v4l2codecs/linux/v4l2-controls.h -> gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/linux/v4l2-controls.h
Changed
@@ -218,6 +218,12 @@ */ #define V4L2_CID_USER_ALLEGRO_BASE (V4L2_CID_USER_BASE + 0x1170) +/* + * The base for the isl7998x driver controls. + * We reserve 16 controls for this driver. + */ +#define V4L2_CID_USER_ISL7998X_BASE (V4L2_CID_USER_BASE + 0x1180) + /* MPEG-class control IDs */ /* The MPEG controls are applicable to all codec controls * and the 'MPEG' part of the define is historical */ @@ -440,6 +446,11 @@ #define V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES (V4L2_CID_CODEC_BASE+234) #define V4L2_CID_MPEG_VIDEO_DEC_CONCEAL_COLOR (V4L2_CID_CODEC_BASE+235) #define V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD (V4L2_CID_CODEC_BASE+236) +#define V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE (V4L2_CID_CODEC_BASE+237) +enum v4l2_mpeg_video_intra_refresh_period_type { + V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM = 0, + V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC = 1, +}; /* CIDs for the MPEG-2 Part 2 (H.262) codec */ #define V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL (V4L2_CID_CODEC_BASE+270) @@ -1560,6 +1571,8 @@ #define V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC 0x01 #define V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC 0x02 #define V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD 0x04 +#define V4L2_H264_DECODE_PARAM_FLAG_PFRAME 0x08 +#define V4L2_H264_DECODE_PARAM_FLAG_BFRAME 0x10 #define V4L2_CID_STATELESS_H264_DECODE_PARAMS (V4L2_CID_CODEC_STATELESS_BASE + 7) /** @@ -1981,6 +1994,465 @@ __u8 chroma_non_intra_quantiser_matrix64; }; +#define V4L2_CID_STATELESS_HEVC_SPS (V4L2_CID_CODEC_STATELESS_BASE + 400) +#define V4L2_CID_STATELESS_HEVC_PPS (V4L2_CID_CODEC_STATELESS_BASE + 401) +#define V4L2_CID_STATELESS_HEVC_SLICE_PARAMS (V4L2_CID_CODEC_STATELESS_BASE + 402) +#define V4L2_CID_STATELESS_HEVC_SCALING_MATRIX (V4L2_CID_CODEC_STATELESS_BASE + 403) +#define V4L2_CID_STATELESS_HEVC_DECODE_PARAMS (V4L2_CID_CODEC_STATELESS_BASE + 404) +#define V4L2_CID_STATELESS_HEVC_DECODE_MODE (V4L2_CID_CODEC_STATELESS_BASE + 405) +#define V4L2_CID_STATELESS_HEVC_START_CODE (V4L2_CID_CODEC_STATELESS_BASE + 406) +#define V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS (V4L2_CID_CODEC_STATELESS_BASE + 407) + +enum v4l2_stateless_hevc_decode_mode { + V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED, + V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED, +}; + +enum v4l2_stateless_hevc_start_code { + V4L2_STATELESS_HEVC_START_CODE_NONE, + V4L2_STATELESS_HEVC_START_CODE_ANNEX_B, +}; + +#define V4L2_HEVC_SLICE_TYPE_B 0 +#define V4L2_HEVC_SLICE_TYPE_P 1 +#define V4L2_HEVC_SLICE_TYPE_I 2 + +#define V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE (1ULL << 0) +#define V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED (1ULL << 1) +#define V4L2_HEVC_SPS_FLAG_AMP_ENABLED (1ULL << 2) +#define V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET (1ULL << 3) +#define V4L2_HEVC_SPS_FLAG_PCM_ENABLED (1ULL << 4) +#define V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED (1ULL << 5) +#define V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT (1ULL << 6) +#define V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED (1ULL << 7) +#define V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED (1ULL << 8) + +/** + * struct v4l2_ctrl_hevc_sps - ITU-T Rec. H.265: Sequence parameter set + * + * @video_parameter_set_id: specifies the value of the + * vps_video_parameter_set_id of the active VPS + * @seq_parameter_set_id: provides an identifier for the SPS for + * reference by other syntax elements + * @pic_width_in_luma_samples: specifies the width of each decoded picture + * in units of luma samples + * @pic_height_in_luma_samples: specifies the height of each decoded picture + * in units of luma samples + * @bit_depth_luma_minus8: this value plus 8specifies the bit depth of the + * samples of the luma array + * @bit_depth_chroma_minus8: this value plus 8 specifies the bit depth of the + * samples of the chroma arrays + * @log2_max_pic_order_cnt_lsb_minus4: this value plus 4 specifies the value of + * the variable MaxPicOrderCntLsb + * @sps_max_dec_pic_buffering_minus1: this value plus 1 specifies the maximum + * required size of the decoded picture + * buffer for the codec video sequence + * @sps_max_num_reorder_pics: indicates the maximum allowed number of pictures + * @sps_max_latency_increase_plus1: not equal to 0 is used to compute the + * value of SpsMaxLatencyPictures array + * @log2_min_luma_coding_block_size_minus3: plus 3 specifies the minimum + * luma coding block size + * @log2_diff_max_min_luma_coding_block_size: specifies the difference between + * the maximum and minimum luma + * coding block size + * @log2_min_luma_transform_block_size_minus2: plus 2 specifies the minimum luma + * transform block size + * @log2_diff_max_min_luma_transform_block_size: specifies the difference between + * the maximum and minimum luma + * transform block size + * @max_transform_hierarchy_depth_inter: specifies the maximum hierarchy + * depth for transform units of + * coding units coded in inter + * prediction mode + * @max_transform_hierarchy_depth_intra: specifies the maximum hierarchy + * depth for transform units of + * coding units coded in intra + * prediction mode + * @pcm_sample_bit_depth_luma_minus1: this value plus 1 specifies the number of + * bits used to represent each of PCM sample + * values of the luma component + * @pcm_sample_bit_depth_chroma_minus1: this value plus 1 specifies the number + * of bits used to represent each of PCM + * sample values of the chroma components + * @log2_min_pcm_luma_coding_block_size_minus3: this value plus 3 specifies the + * minimum size of coding blocks + * @log2_diff_max_min_pcm_luma_coding_block_size: specifies the difference between + * the maximum and minimum size of + * coding blocks + * @num_short_term_ref_pic_sets: specifies the number of st_ref_pic_set() + * syntax structures included in the SPS + * @num_long_term_ref_pics_sps: specifies the number of candidate long-term + * reference pictures that are specified in the SPS + * @chroma_format_idc: specifies the chroma sampling + * @sps_max_sub_layers_minus1: this value plus 1 specifies the maximum number + * of temporal sub-layers + * @reserved: padding field. Should be zeroed by applications. + * @flags: see V4L2_HEVC_SPS_FLAG_{} + */ +struct v4l2_ctrl_hevc_sps { + __u8 video_parameter_set_id; + __u8 seq_parameter_set_id; + __u16 pic_width_in_luma_samples; + __u16 pic_height_in_luma_samples; + __u8 bit_depth_luma_minus8; + __u8 bit_depth_chroma_minus8; + __u8 log2_max_pic_order_cnt_lsb_minus4; + __u8 sps_max_dec_pic_buffering_minus1; + __u8 sps_max_num_reorder_pics; + __u8 sps_max_latency_increase_plus1; + __u8 log2_min_luma_coding_block_size_minus3; + __u8 log2_diff_max_min_luma_coding_block_size; + __u8 log2_min_luma_transform_block_size_minus2; + __u8 log2_diff_max_min_luma_transform_block_size; + __u8 max_transform_hierarchy_depth_inter; + __u8 max_transform_hierarchy_depth_intra; + __u8 pcm_sample_bit_depth_luma_minus1; + __u8 pcm_sample_bit_depth_chroma_minus1; + __u8 log2_min_pcm_luma_coding_block_size_minus3; + __u8 log2_diff_max_min_pcm_luma_coding_block_size; + __u8 num_short_term_ref_pic_sets; + __u8 num_long_term_ref_pics_sps; + __u8 chroma_format_idc; + __u8 sps_max_sub_layers_minus1; + + __u8 reserved6; + __u64 flags; +}; + +#define V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED (1ULL << 0) +#define V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT (1ULL << 1) +#define V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED (1ULL << 2) +#define V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT (1ULL << 3) +#define V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED (1ULL << 4) +#define V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED (1ULL << 5) +#define V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED (1ULL << 6) +#define V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT (1ULL << 7) +#define V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED (1ULL << 8) +#define V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED (1ULL << 9) +#define V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED (1ULL << 10) +#define V4L2_HEVC_PPS_FLAG_TILES_ENABLED (1ULL << 11) +#define V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED (1ULL << 12) +#define V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED (1ULL << 13) +#define V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 14) +#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED (1ULL << 15) +#define V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER (1ULL << 16) +#define V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT (1ULL << 17) +#define V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT (1ULL << 18) +#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT (1ULL << 19) +#define V4L2_HEVC_PPS_FLAG_UNIFORM_SPACING (1ULL << 20) + +/** + * struct v4l2_ctrl_hevc_pps - ITU-T Rec. H.265: Picture parameter set + * + * @pic_parameter_set_id: identifies the PPS for reference by other + * syntax elements + * @num_extra_slice_header_bits: specifies the number of extra slice header + * bits that are present in the slice header RBSP + * for coded pictures referring to the PPS. + * @num_ref_idx_l0_default_active_minus1: this value plus 1 specifies the + * inferred value of num_ref_idx_l0_active_minus1 + * @num_ref_idx_l1_default_active_minus1: this value plus 1 specifies the + * inferred value of num_ref_idx_l1_active_minus1 + * @init_qp_minus26: this value plus 26 specifies the initial value of SliceQp Y for + * each slice referring to the PPS + * @diff_cu_qp_delta_depth: specifies the difference between the luma coding + * tree block size and the minimum luma coding block + * size of coding units that convey cu_qp_delta_abs + * and cu_qp_delta_sign_flag + * @pps_cb_qp_offset: specify the offsets to the luma quantization parameter Cb + * @pps_cr_qp_offset: specify the offsets to the luma quantization parameter Cr + * @num_tile_columns_minus1: this value plus 1 specifies the number of tile columns + * partitioning the picture + * @num_tile_rows_minus1: this value plus 1 specifies the number of tile rows partitioning + * the picture + * @column_width_minus1: this value plus 1 specifies the width of the each tile column in + * units of coding tree blocks + * @row_height_minus1: this value plus 1 specifies the height of the each tile row in + * units of coding tree blocks + * @pps_beta_offset_div2: specify the default deblocking parameter offsets for + * beta divided by 2 + * @pps_tc_offset_div2: specify the default deblocking parameter offsets for tC + * divided by 2 + * @log2_parallel_merge_level_minus2: this value plus 2 specifies the value of + * the variable Log2ParMrgLevel + * @reserved: padding field. Should be zeroed by applications. + * @flags: see V4L2_HEVC_PPS_FLAG_{} + */ +struct v4l2_ctrl_hevc_pps { + __u8 pic_parameter_set_id; + __u8 num_extra_slice_header_bits; + __u8 num_ref_idx_l0_default_active_minus1; + __u8 num_ref_idx_l1_default_active_minus1; + __s8 init_qp_minus26; + __u8 diff_cu_qp_delta_depth; + __s8 pps_cb_qp_offset; + __s8 pps_cr_qp_offset; + __u8 num_tile_columns_minus1; + __u8 num_tile_rows_minus1; + __u8 column_width_minus120; + __u8 row_height_minus122; + __s8 pps_beta_offset_div2; + __s8 pps_tc_offset_div2; + __u8 log2_parallel_merge_level_minus2; + __u8 reserved; + __u64 flags; +}; + +#define V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE 0x01 + +#define V4L2_HEVC_SEI_PIC_STRUCT_FRAME 0 +#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_FIELD 1 +#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_FIELD 2 +#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_BOTTOM 3 +#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_TOP 4 +#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_BOTTOM_TOP 5 +#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM 6 +#define V4L2_HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING 7 +#define V4L2_HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING 8 +#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_PAIRED_PREVIOUS_BOTTOM 9 +#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_PAIRED_PREVIOUS_TOP 10 +#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_PAIRED_NEXT_BOTTOM 11 +#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_PAIRED_NEXT_TOP 12 + +#define V4L2_HEVC_DPB_ENTRIES_NUM_MAX 16 + +/** + * struct v4l2_hevc_dpb_entry - HEVC decoded picture buffer entry + * + * @timestamp: timestamp of the V4L2 capture buffer to use as reference. + * @flags: long term flag for the reference frame + * @field_pic: whether the reference is a field picture or a frame. + * @reserved: padding field. Should be zeroed by applications. + * @pic_order_cnt_val: the picture order count of the current picture. + */ +struct v4l2_hevc_dpb_entry { + __u64 timestamp; + __u8 flags; + __u8 field_pic; + __u16 reserved; + __s32 pic_order_cnt_val; +}; + +/** + * struct v4l2_hevc_pred_weight_table - HEVC weighted prediction parameters + * + * @delta_luma_weight_l0: the difference of the weighting factor applied + * to the luma prediction value for list 0 + * @luma_offset_l0: the additive offset applied to the luma prediction value + * for list 0 + * @delta_chroma_weight_l0: the difference of the weighting factor applied + * to the chroma prediction values for list 0 + * @chroma_offset_l0: the difference of the additive offset applied to + * the chroma prediction values for list 0 + * @delta_luma_weight_l1: the difference of the weighting factor applied + * to the luma prediction value for list 1 + * @luma_offset_l1: the additive offset applied to the luma prediction value + * for list 1 + * @delta_chroma_weight_l1: the difference of the weighting factor applied + * to the chroma prediction values for list 1 + * @chroma_offset_l1: the difference of the additive offset applied to + * the chroma prediction values for list 1 + * @luma_log2_weight_denom: the base 2 logarithm of the denominator for + * all luma weighting factors + * @delta_chroma_log2_weight_denom: the difference of the base 2 logarithm + * of the denominator for all chroma + * weighting factors + */ +struct v4l2_hevc_pred_weight_table { + __s8 delta_luma_weight_l0V4L2_HEVC_DPB_ENTRIES_NUM_MAX; + __s8 luma_offset_l0V4L2_HEVC_DPB_ENTRIES_NUM_MAX; + __s8 delta_chroma_weight_l0V4L2_HEVC_DPB_ENTRIES_NUM_MAX2; + __s8 chroma_offset_l0V4L2_HEVC_DPB_ENTRIES_NUM_MAX2; + + __s8 delta_luma_weight_l1V4L2_HEVC_DPB_ENTRIES_NUM_MAX; + __s8 luma_offset_l1V4L2_HEVC_DPB_ENTRIES_NUM_MAX; + __s8 delta_chroma_weight_l1V4L2_HEVC_DPB_ENTRIES_NUM_MAX2; + __s8 chroma_offset_l1V4L2_HEVC_DPB_ENTRIES_NUM_MAX2; + + __u8 luma_log2_weight_denom; + __s8 delta_chroma_log2_weight_denom; +}; + +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA (1ULL << 0) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA (1ULL << 1) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED (1ULL << 2) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO (1ULL << 3) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT (1ULL << 4) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0 (1ULL << 5) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_USE_INTEGER_MV (1ULL << 6) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED (1ULL << 7) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 8) +#define V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT (1ULL << 9) + +/** + * struct v4l2_ctrl_hevc_slice_params - HEVC slice parameters + * + * This control is a dynamically sized 1-dimensional array, + * V4L2_CTRL_FLAG_DYNAMIC_ARRAY flag must be set when using it. + * + * @bit_size: size (in bits) of the current slice data + * @data_byte_offset: offset (in bytes) to the video data in the current slice data + * @num_entry_point_offsets: specifies the number of entry point offset syntax + * elements in the slice header. + * @nal_unit_type: specifies the coding type of the slice (B, P or I) + * @nuh_temporal_id_plus1: minus 1 specifies a temporal identifier for the NAL unit + * @slice_type: see V4L2_HEVC_SLICE_TYPE_{} + * @colour_plane_id: specifies the colour plane associated with the current slice + * @slice_pic_order_cnt: specifies the picture order count + * @num_ref_idx_l0_active_minus1: this value plus 1 specifies the maximum + * reference index for reference picture list 0 + * that may be used to decode the slice + * @num_ref_idx_l1_active_minus1: this value plus 1 specifies the maximum + * reference index for reference picture list 1 + * that may be used to decode the slice + * @collocated_ref_idx: specifies the reference index of the collocated picture used + * for temporal motion vector prediction + * @five_minus_max_num_merge_cand: specifies the maximum number of merging + * motion vector prediction candidates supported in + * the slice subtracted from 5 + * @slice_qp_delta: specifies the initial value of QpY to be used for the coding + * blocks in the slice + * @slice_cb_qp_offset: specifies a difference to be added to the value of pps_cb_qp_offset + * @slice_cr_qp_offset: specifies a difference to be added to the value of pps_cr_qp_offset + * @slice_act_y_qp_offset: screen content extension parameters + * @slice_act_cb_qp_offset: screen content extension parameters + * @slice_act_cr_qp_offset: screen content extension parameters + * @slice_beta_offset_div2: specify the deblocking parameter offsets for beta divided by 2 + * @slice_tc_offset_div2: specify the deblocking parameter offsets for tC divided by 2 + * @pic_struct: indicates whether a picture should be displayed as a frame or as one or + * more fields + * @reserved0: padding field. Should be zeroed by applications. + * @slice_segment_addr: specifies the address of the first coding tree block in + * the slice segment + * @ref_idx_l0: the list of L0 reference elements as indices in the DPB + * @ref_idx_l1: the list of L1 reference elements as indices in the DPB + * @short_term_ref_pic_set_size: specifies the size of short-term reference + * pictures set included in the SPS + * @long_term_ref_pic_set_size: specifies the size of long-term reference + * pictures set include in the SPS + * @pred_weight_table: the prediction weight coefficients for inter-picture + * prediction + * @reserved1: padding field. Should be zeroed by applications. + * @flags: see V4L2_HEVC_SLICE_PARAMS_FLAG_{} + */ +struct v4l2_ctrl_hevc_slice_params { + __u32 bit_size; + __u32 data_byte_offset; + __u32 num_entry_point_offsets; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ + __u8 nal_unit_type; + __u8 nuh_temporal_id_plus1; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u8 slice_type; + __u8 colour_plane_id; + __s32 slice_pic_order_cnt; + __u8 num_ref_idx_l0_active_minus1; + __u8 num_ref_idx_l1_active_minus1; + __u8 collocated_ref_idx; + __u8 five_minus_max_num_merge_cand; + __s8 slice_qp_delta; + __s8 slice_cb_qp_offset; + __s8 slice_cr_qp_offset; + __s8 slice_act_y_qp_offset; + __s8 slice_act_cb_qp_offset; + __s8 slice_act_cr_qp_offset; + __s8 slice_beta_offset_div2; + __s8 slice_tc_offset_div2; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ + __u8 pic_struct; + + __u8 reserved03; + /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ + __u32 slice_segment_addr; + __u8 ref_idx_l0V4L2_HEVC_DPB_ENTRIES_NUM_MAX; + __u8 ref_idx_l1V4L2_HEVC_DPB_ENTRIES_NUM_MAX; + __u16 short_term_ref_pic_set_size; + __u16 long_term_ref_pic_set_size; + + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */ + struct v4l2_hevc_pred_weight_table pred_weight_table; + + __u8 reserved12; + __u64 flags; +}; + +#define V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC 0x1 +#define V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC 0x2 +#define V4L2_HEVC_DECODE_PARAM_FLAG_NO_OUTPUT_OF_PRIOR 0x4 + +/** + * struct v4l2_ctrl_hevc_decode_params - HEVC decode parameters + * + * @pic_order_cnt_val: picture order count + * @short_term_ref_pic_set_size: specifies the size of short-term reference + * pictures set included in the SPS of the first slice + * @long_term_ref_pic_set_size: specifies the size of long-term reference + * pictures set include in the SPS of the first slice + * @num_active_dpb_entries: the number of entries in dpb + * @num_poc_st_curr_before: the number of reference pictures in the short-term + * set that come before the current frame + * @num_poc_st_curr_after: the number of reference pictures in the short-term + * set that come after the current frame + * @num_poc_lt_curr: the number of reference pictures in the long-term set + * @poc_st_curr_before: provides the index of the short term before references + * in DPB array + * @poc_st_curr_after: provides the index of the short term after references + * in DPB array + * @poc_lt_curr: provides the index of the long term references in DPB array + * @reserved: padding field. Should be zeroed by applications. + * @dpb: the decoded picture buffer, for meta-data about reference frames + * @flags: see V4L2_HEVC_DECODE_PARAM_FLAG_{} + */ +struct v4l2_ctrl_hevc_decode_params { + __s32 pic_order_cnt_val; + __u16 short_term_ref_pic_set_size; + __u16 long_term_ref_pic_set_size; + __u8 num_active_dpb_entries; + __u8 num_poc_st_curr_before; + __u8 num_poc_st_curr_after; + __u8 num_poc_lt_curr; + __u8 poc_st_curr_beforeV4L2_HEVC_DPB_ENTRIES_NUM_MAX; + __u8 poc_st_curr_afterV4L2_HEVC_DPB_ENTRIES_NUM_MAX; + __u8 poc_lt_currV4L2_HEVC_DPB_ENTRIES_NUM_MAX; + __u8 reserved4; + struct v4l2_hevc_dpb_entry dpbV4L2_HEVC_DPB_ENTRIES_NUM_MAX; + __u64 flags; +}; + +/** + * struct v4l2_ctrl_hevc_scaling_matrix - HEVC scaling lists parameters + * + * @scaling_list_4x4: scaling list is used for the scaling process for + * transform coefficients. The values on each scaling + * list are expected in raster scan order + * @scaling_list_8x8: scaling list is used for the scaling process for + * transform coefficients. The values on each scaling + * list are expected in raster scan order + * @scaling_list_16x16: scaling list is used for the scaling process for + * transform coefficients. The values on each scaling + * list are expected in raster scan order + * @scaling_list_32x32: scaling list is used for the scaling process for + * transform coefficients. The values on each scaling + * list are expected in raster scan order + * @scaling_list_dc_coef_16x16: scaling list is used for the scaling process + * for transform coefficients. The values on each + * scaling list are expected in raster scan order. + * @scaling_list_dc_coef_32x32: scaling list is used for the scaling process + * for transform coefficients. The values on each + * scaling list are expected in raster scan order. + */ +struct v4l2_ctrl_hevc_scaling_matrix { + __u8 scaling_list_4x4616; + __u8 scaling_list_8x8664; + __u8 scaling_list_16x16664; + __u8 scaling_list_32x32264; + __u8 scaling_list_dc_coef_16x166; + __u8 scaling_list_dc_coef_32x322; +}; + #define V4L2_CID_COLORIMETRY_CLASS_BASE (V4L2_CTRL_CLASS_COLORIMETRY | 0x900) #define V4L2_CID_COLORIMETRY_CLASS (V4L2_CTRL_CLASS_COLORIMETRY | 1)
View file
gst-plugins-bad-1.20.5.tar.xz/sys/v4l2codecs/linux/videodev2.h -> gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/linux/videodev2.h
Changed
@@ -595,6 +595,7 @@ #define V4L2_PIX_FMT_NV61 v4l2_fourcc('N', 'V', '6', '1') /* 16 Y/CrCb 4:2:2 */ #define V4L2_PIX_FMT_NV24 v4l2_fourcc('N', 'V', '2', '4') /* 24 Y/CbCr 4:4:4 */ #define V4L2_PIX_FMT_NV42 v4l2_fourcc('N', 'V', '4', '2') /* 24 Y/CrCb 4:4:4 */ +#define V4L2_PIX_FMT_P010 v4l2_fourcc('P', '0', '1', '0') /* 24 Y/CbCr 4:2:0 10-bit per component */ /* two non contiguous planes - one Y, one Cr + Cb interleaved */ #define V4L2_PIX_FMT_NV12M v4l2_fourcc('N', 'M', '1', '2') /* 12 Y/CbCr 4:2:0 */ @@ -702,6 +703,7 @@ #define V4L2_PIX_FMT_FWHT v4l2_fourcc('F', 'W', 'H', 'T') /* Fast Walsh Hadamard Transform (vicodec) */ #define V4L2_PIX_FMT_FWHT_STATELESS v4l2_fourcc('S', 'F', 'W', 'H') /* Stateless FWHT (vicodec) */ #define V4L2_PIX_FMT_H264_SLICE v4l2_fourcc('S', '2', '6', '4') /* H264 parsed slices */ +#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ /* Vendor-specific formats */ #define V4L2_PIX_FMT_CPIA1 v4l2_fourcc('C', 'P', 'I', 'A') /* cpia1 YUV */ @@ -1733,6 +1735,11 @@ struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quantisation; struct v4l2_ctrl_vp9_compressed_hdr *p_vp9_compressed_hdr_probs; struct v4l2_ctrl_vp9_frame *p_vp9_frame; + struct v4l2_ctrl_hevc_sps *p_hevc_sps; + struct v4l2_ctrl_hevc_pps *p_hevc_pps; + struct v4l2_ctrl_hevc_slice_params *p_hevc_slice_params; + struct v4l2_ctrl_hevc_scaling_matrix *p_hevc_scaling_matrix; + struct v4l2_ctrl_hevc_decode_params *p_hevc_decode_params; void *ptr; }; } __attribute__ ((packed)); @@ -1798,6 +1805,12 @@ V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR = 0x0260, V4L2_CTRL_TYPE_VP9_FRAME = 0x0261, + + V4L2_CTRL_TYPE_HEVC_SPS = 0x0270, + V4L2_CTRL_TYPE_HEVC_PPS = 0x0271, + V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS = 0x0272, + V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX = 0x0273, + V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS = 0x0274, }; /* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */ @@ -1853,6 +1866,7 @@ #define V4L2_CTRL_FLAG_HAS_PAYLOAD 0x0100 #define V4L2_CTRL_FLAG_EXECUTE_ON_WRITE 0x0200 #define V4L2_CTRL_FLAG_MODIFY_LAYOUT 0x0400 +#define V4L2_CTRL_FLAG_DYNAMIC_ARRAY 0x0800 /* Query flags, to be ORed with the control ID */ #define V4L2_CTRL_FLAG_NEXT_CTRL 0x80000000
View file
gst-plugins-bad-1.20.5.tar.xz/sys/v4l2codecs/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/meson.build
Changed
@@ -3,6 +3,7 @@ 'gstv4l2codecallocator.c', 'gstv4l2codecdevice.c', 'gstv4l2codech264dec.c', + 'gstv4l2codech265dec.c', 'gstv4l2codecmpeg2dec.c', 'gstv4l2codecpool.c', 'gstv4l2codecvp8dec.c', @@ -45,6 +46,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstv4l2codecs, install_dir : plugins_pkgconfig_install_dir) plugins += gstv4l2codecs endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/v4l2codecs/plugin.c -> gst-plugins-bad-1.22.0.tar.xz/sys/v4l2codecs/plugin.c
Changed
@@ -24,6 +24,7 @@ #include "gstv4l2codecdevice.h" #include "gstv4l2codech264dec.h" +#include "gstv4l2codech265dec.h" #include "gstv4l2codecmpeg2dec.h" #include "gstv4l2codecvp8dec.h" #include "gstv4l2codecvp9dec.h" @@ -54,6 +55,13 @@ gst_v4l2_codec_h264_dec_register (plugin, decoder, device, GST_RANK_PRIMARY + 1); break; + case V4L2_PIX_FMT_HEVC_SLICE: + GST_INFO_OBJECT (decoder, "Registering %s as H265 Decoder", + device->name); + gst_v4l2_codec_h265_dec_register (plugin, decoder, device, + GST_RANK_PRIMARY + 1); + break; + case V4L2_PIX_FMT_VP8_FRAME: GST_INFO_OBJECT (decoder, "Registering %s as VP8 Decoder", device->name);
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstjpegdecoder.c
Added
@@ -0,0 +1,519 @@ +/* GStreamer + * Copyright (C) 2022 Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <gst/base/base.h> +#include "gstjpegdecoder.h" + +#define MAX_SAMPLE_FACTOR 4 /* JPEG limit on sampling factors */ +#define DCT_SIZE 8 /* The basic DCT block is 8x8 samples */ + +typedef enum +{ + GST_JPEG_DECODER_STATE_GOT_SOI = 1 << 0, + GST_JPEG_DECODER_STATE_GOT_SOF = 1 << 1, + GST_JPEG_DECODER_STATE_GOT_SOS = 1 << 2, + GST_JPEG_DECODER_STATE_GOT_HUF_TABLE = 1 << 3, + GST_JPEG_DECODER_STATE_GOT_IQ_TABLE = 1 << 4, + + GST_JPEG_DECODER_STATE_VALID_PICTURE = (GST_JPEG_DECODER_STATE_GOT_SOI | + GST_JPEG_DECODER_STATE_GOT_SOF | GST_JPEG_DECODER_STATE_GOT_SOS), +} GstJpegDecoderState; + +struct _GstJpegDecoderPrivate +{ + guint state; + guint restart_interval; + GstJpegHuffmanTables huf_tables; + GstJpegQuantTables quant_tables; + GstJpegFrameHdr frame_hdr; + + guint8 max_h, max_v; + gboolean lossless; +}; + +GST_DEBUG_CATEGORY (gst_jpeg_decoder_debug); +#define GST_CAT_DEFAULT gst_jpeg_decoder_debug + +/** + * GstJpegDecoder: + * + * Base class to implement statelesss JPEG decoders + * + * Since: 1.22 + */ +#define parent_class gst_jpeg_decoder_parent_clas +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstJpegDecoder, gst_jpeg_decoder, + GST_TYPE_VIDEO_DECODER, G_ADD_PRIVATE (GstJpegDecoder); + GST_DEBUG_CATEGORY_INIT (gst_jpeg_decoder_debug, "jpegdecoder", 0, + "JPEG Image Decoder")); + +static gboolean gst_jpeg_decoder_set_format (GstVideoDecoder * decoder, + GstVideoCodecState * state); +static GstFlowReturn gst_jpeg_decoder_handle_frame (GstVideoDecoder * decoder, + GstVideoCodecFrame * frame); +static gboolean gst_jpeg_decoder_stop (GstVideoDecoder * decoder); + +static void +gst_jpeg_decoder_class_init (GstJpegDecoderClass * klass) +{ + GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_CLASS (klass); + + decoder_class->stop = GST_DEBUG_FUNCPTR (gst_jpeg_decoder_stop); + decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_jpeg_decoder_set_format); + decoder_class->handle_frame = + GST_DEBUG_FUNCPTR (gst_jpeg_decoder_handle_frame); + + gst_type_mark_as_plugin_api (GST_TYPE_JPEG_DECODER, 0); +} + +static void +gst_jpeg_decoder_init (GstJpegDecoder * self) +{ + gst_video_decoder_set_packetized (GST_VIDEO_DECODER (self), TRUE); + self->priv = gst_jpeg_decoder_get_instance_private (self); +} + +static gboolean +gst_jpeg_decoder_stop (GstVideoDecoder * decoder) +{ + GstJpegDecoder *self = GST_JPEG_DECODER (decoder); + + g_clear_pointer (&self->input_state, gst_video_codec_state_unref); + + return TRUE; +} + +static gboolean +gst_jpeg_decoder_set_format (GstVideoDecoder * decoder, + GstVideoCodecState * state) +{ + GstJpegDecoder *self = GST_JPEG_DECODER (decoder); + + GST_DEBUG_OBJECT (decoder, "Set format"); + + if (self->input_state) + gst_video_codec_state_unref (self->input_state); + + self->input_state = gst_video_codec_state_ref (state); + + return TRUE; +} + +static inline gboolean +valid_state (guint state, guint ref_state) +{ + return (state & ref_state) == ref_state; +} + +static gboolean +decode_huffman_table (GstJpegDecoder * self, GstJpegSegment * seg) +{ + GstJpegDecoderPrivate *priv = self->priv; + + if (!gst_jpeg_segment_parse_huffman_table (seg, &priv->huf_tables)) { + GST_ERROR_OBJECT (self, "failed to parse Huffman table"); + return FALSE; + } + + priv->state |= GST_JPEG_DECODER_STATE_GOT_HUF_TABLE; + return TRUE; +} + +static gboolean +decode_quant_table (GstJpegDecoder * self, GstJpegSegment * seg) +{ + GstJpegDecoderPrivate *priv = self->priv; + + if (!gst_jpeg_segment_parse_quantization_table (seg, &priv->quant_tables)) { + GST_ERROR_OBJECT (self, "failed to parse quantization table"); + return FALSE; + } + + priv->state |= GST_JPEG_DECODER_STATE_GOT_IQ_TABLE; + return TRUE; +} + +static gboolean +decode_restart_interval (GstJpegDecoder * self, GstJpegSegment * seg) +{ + GstJpegDecoderPrivate *priv = self->priv; + + if (!gst_jpeg_segment_parse_restart_interval (seg, &priv->restart_interval)) { + GST_ERROR_OBJECT (self, "failed to parse restart interval"); + return FALSE; + } + return TRUE; +} + +static GstFlowReturn +decode_frame (GstJpegDecoder * self, GstJpegSegment * seg, + GstVideoCodecFrame * frame) +{ + GstJpegDecoderPrivate *priv = self->priv; + GstJpegDecoderClass *klass = GST_JPEG_DECODER_GET_CLASS (self); + GstJpegFrameHdr *frame_hdr = &self->priv->frame_hdr; + GstFlowReturn ret = GST_FLOW_OK; + guint i; + + if (!gst_jpeg_segment_parse_frame_header (seg, frame_hdr)) { + GST_ERROR_OBJECT (self, "failed to parse frame header"); + return GST_FLOW_ERROR; + } + + /* A.1.1 Dimensions and sampling factors */ + priv->max_h = priv->max_v = 0; + for (i = 0; i < frame_hdr->num_components; i++) { + if (frame_hdr->componentsi.horizontal_factor >= MAX_SAMPLE_FACTOR + || frame_hdr->componentsi.vertical_factor >= MAX_SAMPLE_FACTOR) { + ret = GST_FLOW_ERROR; + GST_ERROR_OBJECT (self, "frame header with bad sampling factor"); + goto beach; + } + + priv->max_h = MAX (priv->max_h, frame_hdr->componentsi.horizontal_factor); + priv->max_v = MAX (priv->max_v, frame_hdr->componentsi.vertical_factor); + } + + if (priv->max_h == 0 || priv->max_v == 0) { + ret = GST_FLOW_ERROR; + GST_ERROR_OBJECT (self, "frame header with bad sampling factor"); + goto beach; + } + + priv->lossless = seg->marker == GST_JPEG_MARKER_SOF3; + + g_assert (klass->new_picture); + ret = klass->new_picture (self, frame, seg->marker, &priv->frame_hdr); + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (self, "subclass failed to handle new picture"); + goto beach; + } + + priv->state |= GST_JPEG_DECODER_STATE_GOT_SOF; + +beach: + return ret; +} + + +static const GstJpegFrameComponent * +get_component (const GstJpegFrameHdr * frame_hdr, guint selector) +{ + guint i; + + for (i = 0; i < frame_hdr->num_components; i++) { + const GstJpegFrameComponent *fcp = &frame_hdr->componentsi; + if (fcp->identifier == selector) + return fcp; + } + return NULL; +} + +static GstFlowReturn +decode_scan (GstJpegDecoder * self, GstJpegSegment * seg) +{ + GstJpegDecoderPrivate *priv = self->priv; + GstJpegDecoderClass *klass = GST_JPEG_DECODER_GET_CLASS (self); + GstJpegDecoderScan scan; + GstJpegScanHdr scan_hdr; + GstFlowReturn ret; + const guint8 *data; + guint size, scan_hdr_size; + guint64 mcus_per_row, mcu_rows_in_scan; + guint blocksize = priv->lossless ? 1 : DCT_SIZE; + + /* E.2.3 Control procedure for decoding a scan */ + if (!valid_state (priv->state, GST_JPEG_DECODER_STATE_GOT_SOF)) + return GST_FLOW_OK; /* ignore segment */ + + if (!gst_jpeg_segment_parse_scan_header (seg, &scan_hdr)) { + GST_ERROR_OBJECT (self, "failed to parse scan header"); + return GST_FLOW_ERROR; + } + + if (!valid_state (priv->state, GST_JPEG_DECODER_STATE_GOT_HUF_TABLE)) + gst_jpeg_get_default_huffman_tables (&priv->huf_tables); + + if (!valid_state (priv->state, GST_JPEG_DECODER_STATE_GOT_IQ_TABLE)) + gst_jpeg_get_default_quantization_tables (&priv->quant_tables); + + /* Non-interleaved */ + if (scan_hdr.num_components == 1) { + const guint cs = scan_hdr.components0.component_selector; + const GstJpegFrameComponent *fc = get_component (&priv->frame_hdr, cs); + + if (!fc || fc->horizontal_factor == 0 || fc->vertical_factor == 0) { + GST_ERROR_OBJECT (self, "failed to validate frame component %u", cs); + return GST_FLOW_ERROR; + } + + mcus_per_row = gst_util_uint64_scale_int_ceil (priv->frame_hdr.width, + fc->horizontal_factor, priv->max_h * blocksize); + mcu_rows_in_scan = gst_util_uint64_scale_int_ceil (priv->frame_hdr.height, + fc->vertical_factor, priv->max_v * blocksize); + } else { + mcus_per_row = gst_util_uint64_scale_int_ceil (priv->frame_hdr.width, 1, + priv->max_h * blocksize); + mcu_rows_in_scan = + gst_util_uint64_scale_int_ceil (priv->frame_hdr.height, 1, + priv->max_v * blocksize); + } + + scan_hdr_size = (seg->dataseg->offset << 8) | seg->dataseg->offset + 1; + size = seg->size - scan_hdr_size; + data = seg->data + seg->offset + scan_hdr_size; + + if (size <= 0) + return GST_FLOW_ERROR; + + /* *INDENT-OFF* */ + scan = (GstJpegDecoderScan) { + .scan_hdr = &scan_hdr, + .huffman_tables = &priv->huf_tables, + .quantization_tables = &priv->quant_tables, + .restart_interval = priv->restart_interval, + .mcus_per_row = mcus_per_row, + .mcu_rows_in_scan = mcu_rows_in_scan, + }; + /* *INDENT-ON* */ + + g_assert (klass->decode_scan); + ret = klass->decode_scan (self, &scan, data, size); + + if (ret == GST_FLOW_OK) + priv->state |= GST_JPEG_DECODER_STATE_GOT_SOS; + + return ret; +} + +#ifndef GST_DISABLE_GST_DEBUG +static const char * +_get_marker_name (guint marker) +{ +#define MARKERS(V) \ + V (SOF0) \ + V (SOF1) \ + V (SOF2) \ + V (SOF3) \ + V (SOF5) \ + V (SOF6) \ + V (SOF7) \ + V (SOF9) \ + V (SOF10) \ + V (SOF11) \ + V (SOF13) \ + V (SOF14) \ + V (SOF15) \ + V (DHT) \ + V (DAC) \ + V (RST0) \ + V (RST1) \ + V (RST2) \ + V (RST3) \ + V (RST4) \ + V (RST5) \ + V (RST6) \ + V (RST7) \ + V (SOI) \ + V (EOI) \ + V (SOS) \ + V (DQT) \ + V (DNL) \ + V (DRI) \ + V (APP0) \ + V (APP1) \ + V (APP2) \ + V (APP3) \ + V (APP4) \ + V (APP5) \ + V (APP6) \ + V (APP7) \ + V (APP8) \ + V (APP9) \ + V (APP10) \ + V (APP11) \ + V (APP12) \ + V (APP13) \ + V (APP14) \ + V (APP15) \ + V (COM) +#define CASE(marker) case G_PASTE(GST_JPEG_MARKER_, marker): return G_STRINGIFY (marker); + switch (marker) { + MARKERS (CASE) + default: + return "Unknown"; + } +#undef CASE +#undef MARKERS +} +#endif + +static GstFlowReturn +gst_jpeg_decoder_handle_frame (GstVideoDecoder * decoder, + GstVideoCodecFrame * frame) +{ + GstJpegDecoder *self = GST_JPEG_DECODER (decoder); + GstJpegDecoderPrivate *priv = self->priv; + GstJpegDecoderClass *klass = GST_JPEG_DECODER_GET_CLASS (self); + GstBuffer *in_buf = frame->input_buffer; + GstFlowReturn ret = GST_FLOW_OK; + GstMapInfo map; + GstJpegMarker marker; + GstJpegSegment seg; + guint offset = 0; + + GST_LOG_OBJECT (self, "handle frame %" GST_PTR_FORMAT, in_buf); + + if (!gst_buffer_map (in_buf, &map, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Cannot map input buffer"); + ret = GST_FLOW_ERROR; + goto error; + } + + priv->state = 0; + + /* E.2.1 Control procedure for decoding compressed image data */ + while (offset < map.size) { + if (!gst_jpeg_parse (&seg, map.data, map.size, offset)) + goto unmap_and_error; + + offset = seg.offset + seg.size; + marker = seg.marker; + + if (!valid_state (priv->state, GST_JPEG_DECODER_STATE_GOT_SOI) + && marker != GST_JPEG_MARKER_SOI) + goto unmap_and_error; + + GST_LOG_OBJECT (self, "marker %s: %" G_GSIZE_FORMAT, + _get_marker_name (marker), seg.size); + + switch (marker) { + + /* Start of Image */ + case GST_JPEG_MARKER_SOI: + priv->state |= GST_JPEG_DECODER_STATE_GOT_SOI; + priv->restart_interval = 0; + break; + + /* End of Image */ + case GST_JPEG_MARKER_EOI: + if (!valid_state (priv->state, GST_JPEG_DECODER_STATE_VALID_PICTURE)) + goto unmap_and_error; + + g_assert (klass->end_picture); + ret = klass->end_picture (self); + if (ret != GST_FLOW_OK) + goto unmap_and_error; + + priv->state = 0; + + gst_buffer_unmap (in_buf, &map); + + GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); + + g_assert (klass->output_picture); + return klass->output_picture (self, frame); + + /* Start of Scan */ + case GST_JPEG_MARKER_SOS:{ + /* get whole scan + ECSs, with RSTi */ + GstJpegSegment seg_scan; + + for (;;) { + if (!gst_jpeg_parse (&seg_scan, map.data, map.size, offset)) + goto unmap_and_error; + + if (seg_scan.marker < GST_JPEG_MARKER_RST_MIN + || seg_scan.marker > GST_JPEG_MARKER_RST_MAX) + break; + + offset = seg_scan.offset + seg_scan.size; + } + + offset = seg_scan.offset - 2; + seg.size = offset - seg.offset; + + ret = decode_scan (self, &seg); + if (ret != GST_FLOW_OK) + goto unmap_and_error; + + break; + } + + /* Interpret markers */ + case GST_JPEG_MARKER_DAC: + /* FIXME: Annex D - Arithmetic coding */ + GST_FIXME_OBJECT (self, "Arithmetic coding mode unsupported"); + goto unmap_and_error; + case GST_JPEG_MARKER_DHT: + if (!decode_huffman_table (self, &seg)) { + ret = GST_FLOW_ERROR; + goto unmap_and_error; + } + break; + case GST_JPEG_MARKER_DQT: + if (!decode_quant_table (self, &seg)) { + ret = GST_FLOW_ERROR; + goto unmap_and_error; + } + break; + + case GST_JPEG_MARKER_DRI: + if (!(valid_state (priv->state, GST_JPEG_DECODER_STATE_GOT_SOS) + && decode_restart_interval (self, &seg))) + goto unmap_and_error; + break; + case GST_JPEG_MARKER_DNL: + break; + default: + /* SOFn (Start Of Frame) */ + if (marker >= GST_JPEG_MARKER_SOF_MIN && + marker <= GST_JPEG_MARKER_SOF_MAX) { + ret = decode_frame (self, &seg, frame); + if (ret != GST_FLOW_OK) + goto unmap_and_error; + } + break; + } + } + + ret = GST_FLOW_ERROR; + +unmap_and_error: + { + gst_buffer_unmap (in_buf, &map); + goto error; + } + +error: + { + if (ret == GST_FLOW_ERROR) { + GST_VIDEO_DECODER_ERROR (self, 1, STREAM, DECODE, + ("Failed to decode data"), (NULL), ret); + } + + gst_video_decoder_drop_frame (decoder, frame); + + return ret; + } +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstjpegdecoder.h
Added
@@ -0,0 +1,147 @@ +/* GStreamer + * Copyright (C) 2022 Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_JPEG_DECODER_H__ +#define __GST_JPEG_DECODER_H__ + +#include <gst/codecs/codecs-prelude.h> + +#include <gst/video/video.h> +#include <gst/codecparsers/gstjpegparser.h> + +G_BEGIN_DECLS + +#define GST_TYPE_JPEG_DECODER (gst_jpeg_decoder_get_type()) +#define GST_JPEG_DECODER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_JPEG_DECODER,GstJpegDecoder)) +#define GST_JPEG_DECODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_JPEG_DECODER,GstJpegDecoderClass)) +#define GST_JPEG_DECODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_JPEG_DECODER,GstJpegDecoderClass)) +#define GST_IS_JPEG_DECODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_JPEG_DECODER)) +#define GST_IS_JPEG_DECODER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JPEG_DECODER)) +#define GST_JPEG_DECODER_CAST(obj) ((GstJpegDecoder*)obj) + +typedef struct _GstJpegDecoderScan GstJpegDecoderScan; + +typedef struct _GstJpegDecoder GstJpegDecoder; +typedef struct _GstJpegDecoderClass GstJpegDecoderClass; +typedef struct _GstJpegDecoderPrivate GstJpegDecoderPrivate; + + +/** + * GstJpegDecoderScan: + * + * Container for a SOS segment. + */ +struct _GstJpegDecoderScan +{ + GstJpegScanHdr *scan_hdr; + GstJpegHuffmanTables *huffman_tables; + GstJpegQuantTables *quantization_tables; + guint restart_interval; + guint mcus_per_row; + guint mcu_rows_in_scan; +}; + +/** + * GstJpegDecoder: + * + * The opaque #GstJpegDecoder data structure. + * + * Since: 1.22 + */ +struct _GstJpegDecoder +{ + /*< private >*/ + GstVideoDecoder parent; + + /*< protected >*/ + GstVideoCodecState * input_state; + + /*< private >*/ + GstJpegDecoderPrivate *priv; + gpointer paddingGST_PADDING_LARGE; +}; + +/** + * GstJpegDecoderClass: + * + * The opaque #GstJpegDecoderClass data structure. + */ +struct _GstJpegDecoderClass +{ + /*< private >*/ + GstVideoDecoderClass parent_class; + + /** + * GstJpegDecoderClass::new_picture: + * @decoder: a #GstJpegDecoder + * @frame: (transfer none): a #GstVideoCodecFrame + * @frame_hdr: (transfer none): a #GstJpegFrameHdr + * + * Called whenever new picture is detected. + */ + GstFlowReturn (*new_picture) (GstJpegDecoder * decoder, + GstVideoCodecFrame * frame, + GstJpegMarker marker, + GstJpegFrameHdr * frame_hdr); + + /** + * GstJpegDecoderClass::decode_scan: + * @decoder: a #GstJpegDecoder + * @scan: (transfer none): a #GstJpegDecoderScan + * @buffer: (transfer none): scan buffer + * @size: size of @buffer + * + * Called whenever new scan is found. + */ + GstFlowReturn (*decode_scan) (GstJpegDecoder * decoder, + GstJpegDecoderScan * scan, + const guint8 * buffer, + guint32 size); + + /** + * GstJpegDecoderClass::end_picture: + * @decoder: a #GstJpegDecoder + * + * Called whenever a picture end mark is found. + */ + GstFlowReturn (*end_picture) (GstJpegDecoder * decoder); + + /** + * GstJpegDecoderClass::output_picture: + * @decoder: a #GstJpegDecoder + * @frame: (transfer full): a #GstVideoCodecFrame + * + * Called whenever a @frame is required to be outputted. The + * #GstVideoCodecFrame must be consumed by subclass. + */ + GstFlowReturn (*output_picture) (GstJpegDecoder * decoder, + GstVideoCodecFrame * frame); + + /*< Private >*/ + gpointer paddingGST_PADDING_LARGE; +}; + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstJpegDecoder, gst_object_unref) + +GST_CODECS_API +GType gst_jpeg_decoder_get_type (void); + +G_END_DECLS + +#endif /* __GST_JPEG_DECODER_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvaav1dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvaav1dec.c
Changed
@@ -43,10 +43,10 @@ #include "config.h" #endif -#include <gst/codecs/gstav1decoder.h> +#include <gst/va/gstva.h> + #include "gstvaav1dec.h" #include "gstvabasedec.h" -#include "gstvaallocator.h" GST_DEBUG_CATEGORY_STATIC (gst_va_av1dec_debug); #ifndef GST_DISABLE_GST_DEBUG @@ -71,11 +71,10 @@ { GstVaBaseDec parent; - GstFlowReturn last_ret; - GstAV1SequenceHeaderOBU seq; - gint max_width; - gint max_height; + GstVideoFormat preferred_format; + /* Used for layers not output. */ + GstBufferPool *internal_pool; }; static GstElementClass *parent_class = NULL; @@ -94,9 +93,6 @@ { GstVaAV1Dec *self = GST_VA_AV1_DEC (decoder); GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); - GstAV1Decoder *av1dec = GST_AV1_DECODER (decoder); - GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; - GstCapsFeatures *capsfeatures = NULL; /* Ignore downstream renegotiation request. */ if (!base->need_negotiation) @@ -106,7 +102,7 @@ /* Do not re-create the context if only the frame size changes */ if (!gst_va_decoder_config_is_equal (base->decoder, base->profile, - base->rt_format, self->max_width, self->max_height)) { + base->rt_format, base->width, base->height)) { if (gst_va_decoder_is_open (base->decoder) && !gst_va_decoder_close (base->decoder)) return FALSE; @@ -114,26 +110,22 @@ if (!gst_va_decoder_open (base->decoder, base->profile, base->rt_format)) return FALSE; - if (!gst_va_decoder_set_frame_size (base->decoder, self->max_width, - self->max_height)) + if (!gst_va_decoder_set_frame_size (base->decoder, base->width, + base->height)) return FALSE; } - if (base->output_state) - gst_video_codec_state_unref (base->output_state); - - gst_va_base_dec_get_preferred_format_and_caps_features (base, &format, - &capsfeatures); + if (!gst_va_base_dec_set_output_state (base)) + return FALSE; - base->output_state = gst_video_decoder_set_output_state (decoder, format, - base->width, base->height, av1dec->input_state); - - base->output_state->caps = gst_video_info_to_caps (&base->output_state->info); - if (capsfeatures) - gst_caps_set_features_simple (base->output_state->caps, capsfeatures); - - GST_INFO_OBJECT (self, "Negotiated caps %" GST_PTR_FORMAT, - base->output_state->caps); + if (self->preferred_format != GST_VIDEO_FORMAT_UNKNOWN && + self->preferred_format != + GST_VIDEO_INFO_FORMAT (&base->output_state->info)) { + GST_WARNING_OBJECT (self, "The preferred_format is different from" + " the last result"); + return FALSE; + } + self->preferred_format = GST_VIDEO_INFO_FORMAT (&base->output_state->info); return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); } @@ -245,14 +237,84 @@ return caps; } +static void +_clear_internal_pool (GstVaAV1Dec * self) +{ + if (self->internal_pool) + gst_buffer_pool_set_active (self->internal_pool, FALSE); + + gst_clear_object (&self->internal_pool); +} + +static GstBufferPool * +_create_internal_pool (GstVaAV1Dec * self, gint width, gint height) +{ + GstVaBaseDec *base = GST_VA_BASE_DEC (self); + GstVideoInfo info; + GArray *surface_formats; + GstAllocator *allocator; + GstCaps *caps = NULL; + GstBufferPool *pool; + GstAllocationParams params = { 0, }; + + gst_allocation_params_init (¶ms); + + /* We may come here before the negotiation, make sure all pools + use the same video format. */ + if (self->preferred_format == GST_VIDEO_FORMAT_UNKNOWN) { + GstVideoFormat format; + + gst_va_base_dec_get_preferred_format_and_caps_features (base, + &format, NULL); + if (format == GST_VIDEO_FORMAT_UNKNOWN) { + GST_WARNING_OBJECT (self, "Failed to get format for internal pool"); + return NULL; + } + + self->preferred_format = format; + } + + gst_video_info_set_format (&info, self->preferred_format, width, height); + + caps = gst_video_info_to_caps (&info); + if (!caps) { + GST_WARNING_OBJECT (self, "Failed to create caps for internal pool"); + return NULL; + } + + gst_caps_set_features_simple (caps, + gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_VA)); + + surface_formats = gst_va_decoder_get_surface_formats (base->decoder); + allocator = gst_va_allocator_new (base->display, surface_formats); + + pool = gst_va_pool_new_with_config (caps, GST_VIDEO_INFO_SIZE (&info), + 1, 0, VA_SURFACE_ATTRIB_USAGE_HINT_DECODER, GST_VA_FEATURE_AUTO, + allocator, ¶ms); + + gst_clear_caps (&caps); + gst_object_unref (allocator); + + if (!pool) { + GST_WARNING_OBJECT (self, "Failed to create internal pool"); + return NULL; + } + + gst_buffer_pool_set_active (pool, TRUE); + + return pool; +} + static GstFlowReturn gst_va_av1_dec_new_sequence (GstAV1Decoder * decoder, - const GstAV1SequenceHeaderOBU * seq_hdr) + const GstAV1SequenceHeaderOBU * seq_hdr, gint max_dpb_size) { GstVaAV1Dec *self = GST_VA_AV1_DEC (decoder); GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); + GstVideoInfo *info = &base->output_info; VAProfile profile; guint rt_format; + gint width, height; GST_LOG_OBJECT (self, "new sequence"); @@ -266,69 +328,103 @@ self->seq = *seq_hdr; + width = seq_hdr->max_frame_width_minus_1 + 1; + height = seq_hdr->max_frame_height_minus_1 + 1; + if (!gst_va_decoder_config_is_equal (base->decoder, profile, - rt_format, seq_hdr->max_frame_width_minus_1 + 1, - seq_hdr->max_frame_height_minus_1 + 1)) { + rt_format, width, height)) { + _clear_internal_pool (self); + self->preferred_format = GST_VIDEO_FORMAT_UNKNOWN; + base->profile = profile; base->rt_format = rt_format; - self->max_width = seq_hdr->max_frame_width_minus_1 + 1; - self->max_height = seq_hdr->max_frame_height_minus_1 + 1; + GST_VIDEO_INFO_WIDTH (info) = base->width = width; + GST_VIDEO_INFO_HEIGHT (info) = base->height = height; base->need_negotiation = TRUE; - base->min_buffers = 7 + 4; /* dpb size + scratch surfaces */ - - /* May be changed by frame header */ - base->width = self->max_width; - base->height = self->max_height; base->need_valign = FALSE; } + g_clear_pointer (&base->input_state, gst_video_codec_state_unref); + base->input_state = gst_video_codec_state_ref (decoder->input_state); + return GST_FLOW_OK; } +static inline GstFlowReturn +_acquire_internal_buffer (GstVaAV1Dec * self, GstVideoCodecFrame * frame) +{ + GstVaBaseDec *base = GST_VA_BASE_DEC (self); + GstFlowReturn ret; + + if (!self->internal_pool) { + self->internal_pool = + _create_internal_pool (self, base->width, base->height); + if (!self->internal_pool) + return GST_FLOW_ERROR; + } + + if (base->need_negotiation) { + if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) + return GST_FLOW_NOT_NEGOTIATED; + } + + ret = gst_buffer_pool_acquire_buffer (self->internal_pool, + &frame->output_buffer, NULL); + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (self, + "Failed to allocated output buffer from internal pool, return %s", + gst_flow_get_name (ret)); + } + + return ret; +} + static GstFlowReturn gst_va_av1_dec_new_picture (GstAV1Decoder * decoder, GstVideoCodecFrame * frame, GstAV1Picture * picture) { GstVaAV1Dec *self = GST_VA_AV1_DEC (decoder); GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); - GstVaDecodePicture *pic; - GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); GstAV1FrameHeaderOBU *frame_hdr = &picture->frame_hdr; + GstVaDecodePicture *pic; + GstVideoInfo *info = &base->output_info; + GstFlowReturn ret; + + /* Only output the highest spatial layer. For non output pictures, + we just use internal pool, then no negotiation needed. */ + if (picture->spatial_id < decoder->highest_spatial_layer) { + ret = _acquire_internal_buffer (self, frame); + if (ret != GST_FLOW_OK) + return ret; + } else { + if (frame_hdr->upscaled_width != GST_VIDEO_INFO_WIDTH (info) + || frame_hdr->frame_height != GST_VIDEO_INFO_HEIGHT (info)) { + GST_VIDEO_INFO_WIDTH (info) = frame_hdr->upscaled_width; + GST_VIDEO_INFO_HEIGHT (info) = frame_hdr->frame_height; + + if (GST_VIDEO_INFO_WIDTH (info) < base->width + || GST_VIDEO_INFO_HEIGHT (info) < base->height) { + base->need_valign = TRUE; + /* *INDENT-OFF* */ + base->valign = (GstVideoAlignment) { + .padding_bottom = base->height - GST_VIDEO_INFO_HEIGHT (info), + .padding_right = base->width - GST_VIDEO_INFO_WIDTH (info), + }; + /* *INDENT-ON* */ + } - if (frame_hdr->upscaled_width != base->width - || frame_hdr->frame_height != base->height) { - base->width = frame_hdr->upscaled_width; - base->height = frame_hdr->frame_height; - - if (base->width < self->max_width || base->height < self->max_height) { - base->need_valign = TRUE; - /* *INDENT-OFF* */ - base->valign = (GstVideoAlignment){ - .padding_bottom = self->max_height - base->height, - .padding_right = self->max_width - base->width, - }; - /* *INDENT-ON* */ + base->need_negotiation = TRUE; } - base->need_negotiation = TRUE; - } - - if (base->need_negotiation) { - if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { - GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); - return GST_FLOW_NOT_NEGOTIATED; + ret = gst_va_base_dec_prepare_output_frame (base, frame); + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (self, "Failed to allocated output buffer, return %s", + gst_flow_get_name (ret)); + return ret; } } - self->last_ret = gst_video_decoder_allocate_output_frame (vdec, frame); - if (self->last_ret != GST_FLOW_OK) { - GST_WARNING_OBJECT (self, - "Failed to allocated output buffer, return %s", - gst_flow_get_name (self->last_ret)); - return self->last_ret; - } - if (picture->apply_grain) { if (!gst_va_buffer_create_aux_surface (frame->output_buffer)) { GST_WARNING_OBJECT (self, @@ -357,7 +453,7 @@ static GstAV1Picture * gst_va_av1_dec_duplicate_picture (GstAV1Decoder * decoder, - GstAV1Picture * picture) + GstVideoCodecFrame * frame, GstAV1Picture * picture) { GstVaAV1Dec *self = GST_VA_AV1_DEC (decoder); GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); @@ -839,6 +935,8 @@ { GstVaAV1Dec *self = GST_VA_AV1_DEC (decoder); GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); + GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); + gboolean ret; g_assert (picture->frame_hdr.show_frame || picture->frame_hdr.show_existing_frame); @@ -847,12 +945,6 @@ "Outputting picture %p (system_frame_number %d)", picture, picture->system_frame_number); - if (self->last_ret != GST_FLOW_OK) { - gst_av1_picture_unref (picture); - gst_video_decoder_drop_frame (GST_VIDEO_DECODER (self), frame); - return self->last_ret; - } - if (picture->frame_hdr.show_existing_frame) { GstVaDecodePicture *pic; @@ -861,12 +953,32 @@ frame->output_buffer = gst_buffer_ref (pic->gstbuffer); } - if (base->copy_frames) - gst_va_base_dec_copy_output_buffer (base, frame); - + ret = gst_va_base_dec_process_output (base, frame, picture->discont_state, 0); gst_av1_picture_unref (picture); - return gst_video_decoder_finish_frame (GST_VIDEO_DECODER (self), frame); + if (ret) + return gst_video_decoder_finish_frame (vdec, frame); + return GST_FLOW_ERROR; +} + +static gboolean +gst_va_av1_dec_start (GstVideoDecoder * decoder) +{ + GstVaAV1Dec *self = GST_VA_AV1_DEC (decoder); + + self->preferred_format = GST_VIDEO_FORMAT_UNKNOWN; + + return GST_VIDEO_DECODER_CLASS (parent_class)->start (decoder); +} + +static gboolean +gst_va_av1_dec_close (GstVideoDecoder * decoder) +{ + GstVaAV1Dec *self = GST_VA_AV1_DEC (decoder); + + _clear_internal_pool (self); + + return gst_va_base_dec_close (GST_VIDEO_DECODER (decoder)); } static void @@ -909,6 +1021,13 @@ parent_class = g_type_class_peek_parent (g_class); + /** + * GstVaAV1Dec:device-path: + * + * It shows the DRM device path used for the VA operation, if any. + * + * Since: 1.22 + */ gst_va_base_dec_class_init (GST_VA_BASE_DEC_CLASS (g_class), AV1, cdata->render_device_path, cdata->sink_caps, cdata->src_caps, src_doc_caps, sink_doc_caps); @@ -917,6 +1036,8 @@ decoder_class->getcaps = GST_DEBUG_FUNCPTR (gst_va_av1_dec_getcaps); decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_va_av1_dec_negotiate); + decoder_class->close = GST_DEBUG_FUNCPTR (gst_va_av1_dec_close); + decoder_class->start = GST_DEBUG_FUNCPTR (gst_va_av1_dec_start); av1decoder_class->new_sequence = GST_DEBUG_FUNCPTR (gst_va_av1_dec_new_sequence); @@ -984,16 +1105,14 @@ type_info.class_data = cdata; - type_name = g_strdup ("GstVaAV1Dec"); - feature_name = g_strdup ("vaav1dec"); - /* The first decoder to be registered should use a constant name, * like vaav1dec, for any additional decoders, we create unique * names, using inserting the render device name. */ - if (g_type_from_name (type_name)) { + if (device->index == 0) { + type_name = g_strdup ("GstVaAV1Dec"); + feature_name = g_strdup ("vaav1dec"); + } else { gchar *basename = g_path_get_basename (device->render_device_path); - g_free (type_name); - g_free (feature_name); type_name = g_strdup_printf ("GstVa%sAV1Dec", basename); feature_name = g_strdup_printf ("va%sav1dec", basename); cdata->description = basename;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvabasedec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvabasedec.c
Changed
@@ -20,15 +20,34 @@ #include "gstvabasedec.h" -#include "gstvaallocator.h" +#include <gst/va/gstva.h> +#include <gst/va/gstvavideoformat.h> + #include "gstvacaps.h" -#include "gstvapool.h" -#include "gstvautils.h" -#include "gstvavideoformat.h" #define GST_CAT_DEFAULT (base->debug_category) #define GST_VA_BASE_DEC_GET_PARENT_CLASS(obj) (GST_VA_BASE_DEC_GET_CLASS(obj)->parent_decoder_class) +static void +gst_va_base_dec_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstVaBaseDec *self = GST_VA_BASE_DEC (object); + + switch (prop_id) { + case GST_VA_DEC_PROP_DEVICE_PATH:{ + if (!(self->display && GST_IS_VA_DISPLAY_DRM (self->display))) { + g_value_set_string (value, NULL); + return; + } + g_object_get_property (G_OBJECT (self->display), "path", value); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + static gboolean gst_va_base_dec_open (GstVideoDecoder * decoder) { @@ -40,6 +59,8 @@ &base->display)) return FALSE; + g_object_notify (G_OBJECT (decoder), "device-path"); + if (!g_atomic_pointer_get (&base->decoder)) { GstVaDecoder *va_decoder; @@ -67,6 +88,8 @@ gst_clear_object (&base->decoder); gst_clear_object (&base->display); + g_object_notify (G_OBJECT (decoder), "device-path"); + return TRUE; } @@ -78,9 +101,8 @@ if (!gst_va_decoder_close (base->decoder)) return FALSE; - if (base->output_state) - gst_video_codec_state_unref (base->output_state); - base->output_state = NULL; + g_clear_pointer (&base->output_state, gst_video_codec_state_unref); + g_clear_pointer (&base->input_state, gst_video_codec_state_unref); if (base->other_pool) gst_buffer_pool_set_active (base->other_pool, FALSE); @@ -206,6 +228,7 @@ GArray *surface_formats = gst_va_decoder_get_surface_formats (base->decoder); allocator = gst_va_allocator_new (base->display, surface_formats); + gst_va_allocator_set_hacks (allocator, base->hacks); } return allocator; @@ -259,12 +282,22 @@ guint size = 0, min, max; GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); gboolean ret = TRUE; + gboolean dont_use_other_pool = FALSE; GstCaps *va_caps = NULL; /* If others provide a valid allocator, just use it. */ if (gst_query_get_n_allocation_params (query) > 0) { gst_query_parse_nth_allocation_param (query, 0, &other_allocator, &other_params); + GstVaDisplay *display; + + display = gst_va_allocator_peek_display (other_allocator); + /* We should not use allocator and pool from other display. */ + if (display != base->display) { + gst_clear_object (&other_allocator); + dont_use_other_pool = TRUE; + } + update_allocator = TRUE; } else { gst_allocation_params_init (&other_params); @@ -274,6 +307,8 @@ if (gst_query_get_n_allocation_pools (query) > 0) { gst_query_parse_nth_allocation_pool (query, 0, &other_pool, &size, &min, &max); + if (dont_use_other_pool) + gst_clear_object (&other_pool); min += base->min_buffers; size = MAX (size, GST_VIDEO_INFO_SIZE (info)); @@ -329,7 +364,8 @@ gst_buffer_pool_config_add_option (other_config, GST_BUFFER_POOL_OPTION_VIDEO_META); - gst_buffer_pool_config_set_va_allocation_params (other_config, 0); + gst_buffer_pool_config_set_va_allocation_params (other_config, 0, + GST_VA_FEATURE_AUTO); if (!gst_buffer_pool_set_config (other_pool, other_config)) { ret = FALSE; @@ -366,7 +402,7 @@ gst_buffer_pool_config_set_va_alignment (config, &base->valign); gst_buffer_pool_config_set_va_allocation_params (config, - VA_SURFACE_ATTRIB_USAGE_HINT_DECODER); + VA_SURFACE_ATTRIB_USAGE_HINT_DECODER, GST_VA_FEATURE_AUTO); if (!gst_buffer_pool_set_config (pool, config)) { ret = FALSE; @@ -454,6 +490,7 @@ guint size = 0, min, max; gboolean update_pool = FALSE, update_allocator = FALSE; gboolean has_videometa, has_video_crop_meta; + gboolean dont_use_other_pool = FALSE; gboolean ret = TRUE; g_assert (base->min_buffers > 0); @@ -481,13 +518,20 @@ } if (gst_query_get_n_allocation_params (query) > 0) { + GstVaDisplay *display; + gst_query_parse_nth_allocation_param (query, 0, &allocator, &other_params); - if (allocator && !(GST_IS_VA_DMABUF_ALLOCATOR (allocator) - || GST_IS_VA_ALLOCATOR (allocator))) { + display = gst_va_allocator_peek_display (allocator); + if (!display) { /* save the allocator for the other pool */ other_allocator = allocator; allocator = NULL; + } else if (display != base->display) { + /* The allocator and pool belong to other display, we should not use. */ + gst_clear_object (&allocator); + dont_use_other_pool = TRUE; } + update_allocator = TRUE; } else { gst_allocation_params_init (&other_params); @@ -503,6 +547,8 @@ "may need other pool for copy frames %" GST_PTR_FORMAT, pool); other_pool = pool; pool = NULL; + } else if (dont_use_other_pool) { + gst_clear_object (&pool); } } @@ -538,7 +584,7 @@ gst_buffer_pool_config_set_va_alignment (config, &base->valign); gst_buffer_pool_config_set_va_allocation_params (config, - VA_SURFACE_ATTRIB_USAGE_HINT_DECODER); + VA_SURFACE_ATTRIB_USAGE_HINT_DECODER, GST_VA_FEATURE_AUTO); if (!gst_buffer_pool_set_config (pool, config)) { ret = FALSE; @@ -615,10 +661,41 @@ (element))->set_context (element, context); } +static gboolean +gst_va_base_dec_negotiate (GstVideoDecoder * decoder) +{ + GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); + + /* Ignore downstream renegotiation request. */ + if (!base->need_negotiation) + return TRUE; + + base->need_negotiation = FALSE; + + if (!gst_va_decoder_config_is_equal (base->decoder, base->profile, + base->rt_format, base->width, base->height)) { + if (gst_va_decoder_is_open (base->decoder) && + !gst_va_decoder_close (base->decoder)) + return FALSE; + if (!gst_va_decoder_open (base->decoder, base->profile, base->rt_format)) + return FALSE; + if (!gst_va_decoder_set_frame_size (base->decoder, base->width, + base->height)) + return FALSE; + } + + if (!gst_va_base_dec_set_output_state (base)) + return FALSE; + + return GST_VIDEO_DECODER_CLASS (GST_VA_BASE_DEC_GET_PARENT_CLASS (decoder)) + ->negotiate (decoder); +} + void gst_va_base_dec_init (GstVaBaseDec * base, GstDebugCategory * cat) { base->debug_category = cat; + gst_video_info_init (&base->output_info); } void @@ -627,6 +704,7 @@ GstCaps * doc_src_caps, GstCaps * doc_sink_caps) { GstPadTemplate *sink_pad_templ, *src_pad_templ; + GObjectClass *object_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_CLASS (klass); @@ -653,6 +731,8 @@ gst_caps_unref (doc_src_caps); } + object_class->get_property = gst_va_base_dec_get_property; + element_class->set_context = GST_DEBUG_FUNCPTR (gst_va_base_dec_set_context); decoder_class->open = GST_DEBUG_FUNCPTR (gst_va_base_dec_open); @@ -663,36 +743,82 @@ decoder_class->sink_query = GST_DEBUG_FUNCPTR (gst_va_base_dec_sink_query); decoder_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_va_base_dec_decide_allocation); + decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_va_base_dec_negotiate); + + g_object_class_install_property (object_class, GST_VA_DEC_PROP_DEVICE_PATH, + g_param_spec_string ("device-path", "Device Path", + "DRM device path", NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } +/* XXX: if chroma has not an available format, the first format is + * returned, relying on an hypothetical internal CSC */ static GstVideoFormat -_default_video_format_from_chroma (guint chroma_type) +_find_video_format_from_chroma (const GValue * formats, guint chroma_type) { - switch (chroma_type) { - /* 4:2:0 */ - case VA_RT_FORMAT_YUV420: - return GST_VIDEO_FORMAT_NV12; - case VA_RT_FORMAT_YUV420_10: - return GST_VIDEO_FORMAT_P010_10LE; - case VA_RT_FORMAT_YUV420_12: - return GST_VIDEO_FORMAT_P012_LE; - /* 4:2:2 */ - case VA_RT_FORMAT_YUV422: - return GST_VIDEO_FORMAT_UYVY; - case VA_RT_FORMAT_YUV422_10: - return GST_VIDEO_FORMAT_Y210; - case VA_RT_FORMAT_YUV422_12: - return GST_VIDEO_FORMAT_Y212_LE; - /* 4:4:4 */ - case VA_RT_FORMAT_YUV444: - return GST_VIDEO_FORMAT_VUYA; - case VA_RT_FORMAT_YUV444_10: - return GST_VIDEO_FORMAT_Y410; - case VA_RT_FORMAT_YUV444_12: - return GST_VIDEO_FORMAT_Y412_LE; - default: - return GST_VIDEO_FORMAT_UNKNOWN; + GstVideoFormat fmt; + guint i, num_values; + + if (!formats) + return GST_VIDEO_FORMAT_UNKNOWN; + + if (G_VALUE_HOLDS_STRING (formats)) { + return gst_video_format_from_string (g_value_get_string (formats)); + } else if (GST_VALUE_HOLDS_LIST (formats)) { + GValue *val, *first_val = NULL; + + num_values = gst_value_list_get_size (formats); + for (i = 0; i < num_values; i++) { + val = (GValue *) gst_value_list_get_value (formats, i); + if (!val) + continue; + if (!first_val) + first_val = val; + fmt = gst_video_format_from_string (g_value_get_string (val)); + if (gst_va_chroma_from_video_format (fmt) == chroma_type) + return fmt; + } + + if (first_val) + return gst_video_format_from_string (g_value_get_string (first_val)); } + + return GST_VIDEO_FORMAT_UNKNOWN; +} + +static GstVideoFormat +_caps_video_format_from_chroma (GstCaps * caps, GstCapsFeatures * features, + guint chroma_type) +{ + guint i, num_structures; + GstCapsFeatures *feats; + GstStructure *structure; + const GValue *format; + + num_structures = gst_caps_get_size (caps); + for (i = 0; i < num_structures; i++) { + feats = gst_caps_get_features (caps, i); + if (!gst_caps_features_is_equal (feats, features)) + continue; + structure = gst_caps_get_structure (caps, i); + format = gst_structure_get_value (structure, "format"); + return _find_video_format_from_chroma (format, chroma_type); + } + + return GST_VIDEO_FORMAT_UNKNOWN; +} + +static GstVideoFormat +_default_video_format_from_chroma (GstVaBaseDec * base, + GstCapsFeatures * features, guint chroma_type) +{ + GstCaps *tmpl_caps; + GstVideoFormat ret = GST_VIDEO_FORMAT_UNKNOWN; + + tmpl_caps = gst_pad_get_pad_template_caps (GST_VIDEO_DECODER_SRC_PAD (base)); + ret = _caps_video_format_from_chroma (tmpl_caps, features, chroma_type); + gst_caps_unref (tmpl_caps); + + return ret; } /* Check whether the downstream supports VideoMeta; if not, we need to @@ -718,7 +844,6 @@ GstCaps *peer_caps, *preferred_caps = NULL; GstCapsFeatures *features; GstStructure *structure; - const GValue *v_format; guint num_structures, i; gboolean is_any; @@ -760,54 +885,36 @@ if (gst_caps_is_empty (preferred_caps)) { if (capsfeatures) *capsfeatures = NULL; /* system memory */ - if (format) - *format = _default_video_format_from_chroma (base->rt_format); + if (format) { + *format = _default_video_format_from_chroma (base, + GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY, base->rt_format); + } goto bail; } - if (capsfeatures) { - features = gst_caps_get_features (preferred_caps, 0); - if (features) { - *capsfeatures = gst_caps_features_copy (features); - - if (is_any - && !gst_caps_features_is_equal (features, - GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY) - && !_downstream_has_video_meta (base, preferred_caps)) { - GST_INFO_OBJECT (base, "Downstream reports ANY caps but without" - " VideoMeta support; fallback to system memory."); - gst_caps_features_free (*capsfeatures); - *capsfeatures = NULL; - } - } else { - *capsfeatures = NULL; - } + /* Use the first structure/feature is caps because is the + * "preferred" one */ + features = gst_caps_get_features (preferred_caps, 0); + if (!features) { + features = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY; + } else if (is_any + && !gst_caps_features_is_equal (features, + GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY) + && !_downstream_has_video_meta (base, preferred_caps)) { + GST_INFO_OBJECT (base, "Downstream reports ANY caps but without" + " VideoMeta support; fallback to system memory."); + features = GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY; } - if (!format) - goto bail; - structure = gst_caps_get_structure (preferred_caps, 0); - v_format = gst_structure_get_value (structure, "format"); - if (!v_format) - *format = _default_video_format_from_chroma (base->rt_format); - else if (G_VALUE_HOLDS_STRING (v_format)) - *format = gst_video_format_from_string (g_value_get_string (v_format)); - else if (GST_VALUE_HOLDS_LIST (v_format)) { - guint num_values = gst_value_list_get_size (v_format); - for (i = 0; i < num_values; i++) { - GstVideoFormat fmt; - const GValue *v_fmt = gst_value_list_get_value (v_format, i); - if (!v_fmt) - continue; - fmt = gst_video_format_from_string (g_value_get_string (v_fmt)); - if (gst_va_chroma_from_video_format (fmt) == base->rt_format) { - *format = fmt; - break; - } - } - if (i == num_values) - *format = _default_video_format_from_chroma (base->rt_format); + if (capsfeatures) + *capsfeatures = gst_caps_features_copy (features); + + /* Use the format from chroma and available format for selected + * capsfeature */ + if (format) { + *format = _default_video_format_from_chroma (base, features, + base->rt_format); } bail: @@ -902,7 +1009,7 @@ src_vinfo = &base->output_state->info; gst_video_info_set_format (&dest_vinfo, GST_VIDEO_INFO_FORMAT (src_vinfo), - base->width, base->height); + GST_VIDEO_INFO_WIDTH (src_vinfo), GST_VIDEO_INFO_HEIGHT (src_vinfo)); ret = gst_buffer_pool_acquire_buffer (base->other_pool, &buffer, NULL); if (ret != GST_FLOW_OK) @@ -927,8 +1034,8 @@ } else { /* gst_video_frame_copy can crop this, but does not know, so let * make it think it's all right */ - GST_VIDEO_INFO_WIDTH (&src_frame.info) = base->width; - GST_VIDEO_INFO_HEIGHT (&src_frame.info) = base->height; + GST_VIDEO_INFO_WIDTH (&src_frame.info) = GST_VIDEO_INFO_WIDTH (src_vinfo); + GST_VIDEO_INFO_HEIGHT (&src_frame.info) = GST_VIDEO_INFO_HEIGHT (src_vinfo); if (!gst_video_frame_copy (&dest_frame, &src_frame)) { gst_video_frame_unmap (&src_frame); @@ -951,3 +1058,95 @@ GST_ERROR_OBJECT (base, "Failed copy output buffer."); return FALSE; } + +gboolean +gst_va_base_dec_process_output (GstVaBaseDec * base, GstVideoCodecFrame * frame, + GstVideoCodecState * input_state, GstVideoBufferFlags buffer_flags) +{ + GstVideoDecoder *vdec = GST_VIDEO_DECODER (base); + + if (input_state) { + + g_assert (GST_VIDEO_INFO_WIDTH (&input_state->info) == + GST_VIDEO_INFO_WIDTH (&base->input_state->info) + && GST_VIDEO_INFO_HEIGHT (&input_state->info) == + GST_VIDEO_INFO_HEIGHT (&input_state->info)); + + g_clear_pointer (&base->input_state, gst_video_codec_state_unref); + base->input_state = gst_video_codec_state_ref (input_state); + + base->need_negotiation = TRUE; + if (!gst_video_decoder_negotiate (vdec)) { + GST_ERROR_OBJECT (base, "Could not re-negotiate with updated state"); + return GST_FLOW_ERROR; + } + } + + if (base->copy_frames) + gst_va_base_dec_copy_output_buffer (base, frame); + + if (buffer_flags != 0) { +#ifndef GST_DISABLE_GST_DEBUG + gboolean interlaced = + (buffer_flags & GST_VIDEO_BUFFER_FLAG_INTERLACED) != 0; + gboolean tff = (buffer_flags & GST_VIDEO_BUFFER_FLAG_TFF) != 0; + + GST_TRACE_OBJECT (base, + "apply buffer flags 0x%x (interlaced %d, top-field-first %d)", + buffer_flags, interlaced, tff); +#endif + GST_BUFFER_FLAG_SET (frame->output_buffer, buffer_flags); + } + + return TRUE; +} + +GstFlowReturn +gst_va_base_dec_prepare_output_frame (GstVaBaseDec * base, + GstVideoCodecFrame * frame) +{ + GstVideoDecoder *vdec = GST_VIDEO_DECODER (base); + + if (base->need_negotiation) { + if (!gst_video_decoder_negotiate (vdec)) { + GST_ERROR_OBJECT (base, "Failed to negotiate with downstream"); + return GST_FLOW_NOT_NEGOTIATED; + } + } + + if (frame) + return gst_video_decoder_allocate_output_frame (vdec, frame); + return GST_FLOW_OK; +} + +gboolean +gst_va_base_dec_set_output_state (GstVaBaseDec * base) +{ + GstVideoDecoder *decoder = GST_VIDEO_DECODER (base); + GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; + GstCapsFeatures *capsfeatures = NULL; + GstVideoInfo *info = &base->output_info; + + if (base->output_state) + gst_video_codec_state_unref (base->output_state); + + gst_va_base_dec_get_preferred_format_and_caps_features (base, &format, + &capsfeatures); + if (format == GST_VIDEO_FORMAT_UNKNOWN) + return FALSE; + + base->output_state = + gst_video_decoder_set_interlaced_output_state (decoder, format, + GST_VIDEO_INFO_INTERLACE_MODE (info), GST_VIDEO_INFO_WIDTH (info), + GST_VIDEO_INFO_HEIGHT (info), base->input_state); + + /* set caps feature */ + base->output_state->caps = gst_video_info_to_caps (&base->output_state->info); + if (capsfeatures) + gst_caps_set_features_simple (base->output_state->caps, capsfeatures); + + GST_INFO_OBJECT (base, "Negotiated caps %" GST_PTR_FORMAT, + base->output_state->caps); + + return TRUE; +}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvabasedec.h -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvabasedec.h
Changed
@@ -21,15 +21,16 @@ #pragma once +#include <gst/codecs/gstav1decoder.h> #include <gst/codecs/gsth264decoder.h> #include <gst/codecs/gsth265decoder.h> #include <gst/codecs/gstmpeg2decoder.h> #include <gst/codecs/gstvp8decoder.h> #include <gst/codecs/gstvp9decoder.h> -#include <gst/codecs/gstav1decoder.h> -#include "gstvadevice.h" +#include "gstjpegdecoder.h" #include "gstvadecoder.h" +#include "gstvadevice.h" #include "gstvaprofile.h" G_BEGIN_DECLS @@ -38,6 +39,11 @@ #define GST_VA_BASE_DEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), G_TYPE_FROM_INSTANCE (obj), GstVaBaseDecClass)) #define GST_VA_BASE_DEC_CLASS(klass) ((GstVaBaseDecClass *)(klass)) +enum { + GST_VA_DEC_PROP_DEVICE_PATH = 1, + GST_VA_DEC_PROP_LAST, +}; + typedef struct _GstVaBaseDec GstVaBaseDec; typedef struct _GstVaBaseDecClass GstVaBaseDecClass; @@ -52,6 +58,7 @@ GstVp8Decoder vp8; GstVp9Decoder vp9; GstAV1Decoder av1; + GstJpegDecoder jpeg; } parent; GstDebugCategory *debug_category; @@ -61,12 +68,15 @@ VAProfile profile; guint rt_format; + /* coded or max resolution */ gint width; gint height; guint min_buffers; + GstVideoInfo output_info; GstVideoCodecState *output_state; + GstVideoCodecState *input_state; GstBufferPool *other_pool; gboolean need_valign; @@ -78,6 +88,8 @@ GstVideoConverter *convert; gboolean need_negotiation; + + guint32 hacks; }; struct _GstVaBaseDecClass @@ -123,5 +135,12 @@ GstCapsFeatures ** capsfeatures); gboolean gst_va_base_dec_copy_output_buffer (GstVaBaseDec * base, GstVideoCodecFrame * codec_frame); +gboolean gst_va_base_dec_process_output (GstVaBaseDec * base, + GstVideoCodecFrame * frame, + GstVideoCodecState * input_state, + GstVideoBufferFlags buffer_flags); +GstFlowReturn gst_va_base_dec_prepare_output_frame (GstVaBaseDec * base, + GstVideoCodecFrame * frame); +gboolean gst_va_base_dec_set_output_state (GstVaBaseDec * base); G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvabaseenc.c
Added
@@ -0,0 +1,1147 @@ +/* GStreamer + * Copyright (C) 2022 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the0 + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "gstvabaseenc.h" + +#include <gst/va/gstva.h> +#include <gst/va/vasurfaceimage.h> + +#include "vacompat.h" +#include "gstvacaps.h" + +#define GST_CAT_DEFAULT gst_va_base_enc_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +struct _GstVaBaseEncPrivate +{ + GstVideoInfo sinkpad_info; + GstBufferPool *raw_pool; +}; + +enum +{ + PROP_DEVICE_PATH = 1, + N_PROPERTIES +}; + +static GParamSpec *propertiesN_PROPERTIES; + +/** + * GstVaBaseEnc: + * + * A base class implementation for VA-API Encoders. + * + * Since: 1.22 + */ +/* *INDENT-OFF* */ +#define gst_va_base_enc_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstVaBaseEnc, gst_va_base_enc, + GST_TYPE_VIDEO_ENCODER, G_ADD_PRIVATE (GstVaBaseEnc) + GST_DEBUG_CATEGORY_INIT (gst_va_base_enc_debug, + "vabaseenc", 0, "vabaseenc element");); +/* *INDENT-ON* */ + +static void +gst_va_base_enc_reset_state_default (GstVaBaseEnc * base) +{ + base->frame_duration = GST_CLOCK_TIME_NONE; + + base->width = 0; + base->height = 0; + base->profile = VAProfileNone; + base->rt_format = 0; + base->codedbuf_size = 0; + g_atomic_int_set (&base->reconf, FALSE); +} + +static void +_flush_all_frames (GstVaBaseEnc * base) +{ + g_queue_clear_full (&base->reorder_list, + (GDestroyNotify) gst_video_codec_frame_unref); + g_queue_clear_full (&base->output_list, + (GDestroyNotify) gst_video_codec_frame_unref); + g_queue_clear_full (&base->ref_list, + (GDestroyNotify) gst_video_codec_frame_unref); +} + +static gboolean +gst_va_base_enc_open (GstVideoEncoder * venc) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (venc); + GstVaBaseEncClass *klass = GST_VA_BASE_ENC_GET_CLASS (venc); + gboolean ret = FALSE; + + if (!gst_va_ensure_element_data (venc, klass->render_device_path, + &base->display)) + return FALSE; + + g_object_notify (G_OBJECT (base), "device-path"); + + if (!g_atomic_pointer_get (&base->encoder)) { + GstVaEncoder *va_encoder; + + va_encoder = gst_va_encoder_new (base->display, klass->codec, + klass->entrypoint); + if (va_encoder) + ret = TRUE; + + gst_object_replace ((GstObject **) (&base->encoder), + (GstObject *) va_encoder); + gst_clear_object (&va_encoder); + } else { + ret = TRUE; + } + + return ret; +} + +static gboolean +gst_va_base_enc_start (GstVideoEncoder * venc) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (venc); + + gst_va_base_enc_reset_state (base); + + base->input_frame_count = 0; + base->output_frame_count = 0; + + base->input_state = NULL; + + /* Set the minimum pts to some huge value (1000 hours). This keeps + * the dts at the start of the stream from needing to be + * negative. */ + base->start_pts = GST_SECOND * 60 * 60 * 1000; + gst_video_encoder_set_min_pts (venc, base->start_pts); + + return TRUE; +} + +static gboolean +gst_va_base_enc_close (GstVideoEncoder * venc) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (venc); + + gst_clear_object (&base->encoder); + gst_clear_object (&base->display); + + return TRUE; +} + +static gboolean +gst_va_base_enc_stop (GstVideoEncoder * venc) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (venc); + + _flush_all_frames (base); + + if (!gst_va_encoder_close (base->encoder)) { + GST_ERROR_OBJECT (base, "Failed to close the VA encoder"); + return FALSE; + } + + if (base->priv->raw_pool) + gst_buffer_pool_set_active (base->priv->raw_pool, FALSE); + gst_clear_object (&base->priv->raw_pool); + + if (base->input_state) + gst_video_codec_state_unref (base->input_state); + + return TRUE; +} + +static GstCaps * +gst_va_base_enc_get_caps (GstVideoEncoder * venc, GstCaps * filter) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (venc); + GstCaps *caps = NULL, *tmp; + + if (base->encoder) + caps = gst_va_encoder_get_sinkpad_caps (base->encoder); + + if (caps) { + if (filter) { + tmp = gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (caps); + caps = tmp; + } + } else { + caps = gst_video_encoder_proxy_getcaps (venc, NULL, filter); + } + + GST_LOG_OBJECT (base, "Returning caps %" GST_PTR_FORMAT, caps); + return caps; +} + +static GstBufferPool * +_get_sinkpad_pool (GstVaBaseEnc * base) +{ + GstAllocator *allocator; + GstAllocationParams params = { 0, }; + guint size, usage_hint = 0; + GArray *surface_formats = NULL; + GstCaps *caps = NULL; + + if (base->priv->raw_pool) + return base->priv->raw_pool; + + g_assert (base->input_state); + caps = gst_caps_copy (base->input_state->caps); + gst_caps_set_features_simple (caps, + gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_VA)); + + gst_allocation_params_init (¶ms); + + size = GST_VIDEO_INFO_SIZE (&base->input_state->info); + + surface_formats = gst_va_encoder_get_surface_formats (base->encoder); + + allocator = gst_va_allocator_new (base->display, surface_formats); + + base->priv->raw_pool = gst_va_pool_new_with_config (caps, size, 1, 0, + usage_hint, GST_VA_FEATURE_AUTO, allocator, ¶ms); + gst_clear_caps (&caps); + + if (!base->priv->raw_pool) { + gst_object_unref (allocator); + return NULL; + } + + gst_va_allocator_get_format (allocator, &base->priv->sinkpad_info, NULL, + NULL); + + gst_object_unref (allocator); + + gst_buffer_pool_set_active (base->priv->raw_pool, TRUE); + + return base->priv->raw_pool; +} + +static gboolean +_try_import_buffer (GstVaBaseEnc * base, GstBuffer * inbuf) +{ + VASurfaceID surface; + + /* The VA buffer. */ + surface = gst_va_buffer_get_surface (inbuf); + if (surface != VA_INVALID_ID && + (gst_va_buffer_peek_display (inbuf) == base->display)) + return TRUE; + + /* TODO: DMA buffer. */ + + return FALSE; +} + +static GstFlowReturn +gst_va_base_enc_import_input_buffer (GstVaBaseEnc * base, + GstBuffer * inbuf, GstBuffer ** buf) +{ + GstBuffer *buffer = NULL; + GstBufferPool *pool; + GstFlowReturn ret; + GstVideoFrame in_frame, out_frame; + gboolean imported, copied; + + imported = _try_import_buffer (base, inbuf); + if (imported) { + *buf = gst_buffer_ref (inbuf); + return GST_FLOW_OK; + } + + /* input buffer doesn't come from a vapool, thus it is required to + * have a pool, grab from it a new buffer and copy the input + * buffer to the new one */ + if (!(pool = _get_sinkpad_pool (base))) + return GST_FLOW_ERROR; + + ret = gst_buffer_pool_acquire_buffer (pool, &buffer, NULL); + if (ret != GST_FLOW_OK) + return ret; + + GST_LOG_OBJECT (base, "copying input frame"); + + if (!gst_video_frame_map (&in_frame, &base->input_state->info, + inbuf, GST_MAP_READ)) + goto invalid_buffer; + if (!gst_video_frame_map (&out_frame, &base->priv->sinkpad_info, buffer, + GST_MAP_WRITE)) { + gst_video_frame_unmap (&in_frame); + goto invalid_buffer; + } + + copied = gst_video_frame_copy (&out_frame, &in_frame); + + gst_video_frame_unmap (&out_frame); + gst_video_frame_unmap (&in_frame); + + if (!copied) + goto invalid_buffer; + + /* strictly speaking this is not needed but let's play safe */ + if (!gst_buffer_copy_into (buffer, inbuf, GST_BUFFER_COPY_FLAGS | + GST_BUFFER_COPY_TIMESTAMPS, 0, -1)) + return GST_FLOW_ERROR; + + *buf = buffer; + + return GST_FLOW_OK; + +invalid_buffer: + { + GST_ELEMENT_WARNING (base, CORE, NOT_IMPLEMENTED, (NULL), + ("invalid video buffer received")); + if (buffer) + gst_buffer_unref (buffer); + return GST_FLOW_ERROR; + } +} + +static GstBuffer * +gst_va_base_enc_create_output_buffer (GstVaBaseEnc * base, + GstVaEncodePicture * picture) +{ + guint coded_size; + goffset offset; + GstBuffer *buf = NULL; + VASurfaceID surface; + VACodedBufferSegment *seg, *seg_list; + + /* Wait for encoding to finish */ + surface = gst_va_encode_picture_get_raw_surface (picture); + if (!va_sync_surface (base->display, surface)) + goto error; + + seg_list = NULL; + if (!va_map_buffer (base->display, picture->coded_buffer, + (gpointer *) & seg_list)) + goto error; + + if (!seg_list) { + va_unmap_buffer (base->display, picture->coded_buffer); + GST_WARNING_OBJECT (base, "coded buffer has no segment list"); + goto error; + } + + coded_size = 0; + for (seg = seg_list; seg; seg = seg->next) + coded_size += seg->size; + + buf = gst_video_encoder_allocate_output_buffer (GST_VIDEO_ENCODER_CAST (base), + coded_size); + if (!buf) { + va_unmap_buffer (base->display, picture->coded_buffer); + GST_ERROR_OBJECT (base, "Failed to allocate output buffer, size %d", + coded_size); + goto error; + } + + offset = 0; + for (seg = seg_list; seg; seg = seg->next) { + gsize write_size; + + write_size = gst_buffer_fill (buf, offset, seg->buf, seg->size); + if (write_size != seg->size) { + GST_WARNING_OBJECT (base, "Segment size is %d, but copied %" + G_GSIZE_FORMAT, seg->size, write_size); + break; + } + offset += seg->size; + } + + va_unmap_buffer (base->display, picture->coded_buffer); + + return buf; + +error: + gst_clear_buffer (&buf); + return NULL; +} + +static GstAllocator * +_allocator_from_caps (GstVaBaseEnc * base, GstCaps * caps) +{ + GstAllocator *allocator = NULL; + + if (gst_caps_is_dmabuf (caps)) { + allocator = gst_va_dmabuf_allocator_new (base->display); + } else { + GArray *surface_formats = + gst_va_encoder_get_surface_formats (base->encoder); + allocator = gst_va_allocator_new (base->display, surface_formats); + } + + return allocator; +} + +static gboolean +gst_va_base_enc_propose_allocation (GstVideoEncoder * venc, GstQuery * query) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (venc); + GstAllocator *allocator = NULL; + GstAllocationParams params = { 0, }; + GstBufferPool *pool; + GstCaps *caps; + GstVideoInfo info; + gboolean need_pool = FALSE; + guint size, usage_hint = 0; + + gst_query_parse_allocation (query, &caps, &need_pool); + if (!caps) + return FALSE; + + if (!gst_video_info_from_caps (&info, caps)) { + GST_ERROR_OBJECT (base, "Cannot parse caps %" GST_PTR_FORMAT, caps); + return FALSE; + } + + size = GST_VIDEO_INFO_SIZE (&info); + + gst_allocation_params_init (¶ms); + + if (!(allocator = _allocator_from_caps (base, caps))) + return FALSE; + + pool = gst_va_pool_new_with_config (caps, size, 1, 0, usage_hint, + GST_VA_FEATURE_AUTO, allocator, ¶ms); + if (!pool) { + gst_object_unref (allocator); + goto config_failed; + } + + gst_query_add_allocation_param (query, allocator, ¶ms); + gst_query_add_allocation_pool (query, pool, size, 0, 0); + + GST_DEBUG_OBJECT (base, + "proposing %" GST_PTR_FORMAT " with allocator %" GST_PTR_FORMAT, + pool, allocator); + + gst_object_unref (allocator); + gst_object_unref (pool); + + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + + return TRUE; + + /* ERRORS */ +config_failed: + { + GST_ERROR_OBJECT (base, "failed to set config"); + return FALSE; + } +} + +static GstFlowReturn +_push_buffer_to_downstream (GstVaBaseEnc * base, GstVideoCodecFrame * frame) +{ + GstVaEncodePicture *enc_picture; + GstVaBaseEncClass *base_class = GST_VA_BASE_ENC_GET_CLASS (base); + GstBuffer *buf; + + if (base_class->prepare_output) + base_class->prepare_output (base, frame); + + enc_picture = + *((GstVaEncodePicture **) gst_video_codec_frame_get_user_data (frame)); + + buf = gst_va_base_enc_create_output_buffer (base, enc_picture); + if (!buf) { + GST_ERROR_OBJECT (base, "Failed to create output buffer"); + goto error; + } + + gst_buffer_replace (&frame->output_buffer, buf); + gst_clear_buffer (&buf); + + GST_LOG_OBJECT (base, "Push to downstream: frame system_frame_number: %d," + " pts: %" GST_TIME_FORMAT ", dts: %" GST_TIME_FORMAT + " duration: %" GST_TIME_FORMAT ", buffer size: %" G_GSIZE_FORMAT, + frame->system_frame_number, GST_TIME_ARGS (frame->pts), + GST_TIME_ARGS (frame->dts), GST_TIME_ARGS (frame->duration), + gst_buffer_get_size (frame->output_buffer)); + + return gst_video_encoder_finish_frame (GST_VIDEO_ENCODER (base), frame); + +error: + gst_clear_buffer (&frame->output_buffer); + gst_clear_buffer (&buf); + gst_video_encoder_finish_frame (GST_VIDEO_ENCODER (base), frame); + + return GST_FLOW_ERROR; +} + +static GstFlowReturn +_push_out_one_buffer (GstVaBaseEnc * base) +{ + GstVideoCodecFrame *frame_out; + GstFlowReturn ret; + guint32 system_frame_number; + + frame_out = g_queue_pop_head (&base->output_list); + gst_video_codec_frame_unref (frame_out); + + system_frame_number = frame_out->system_frame_number; + + ret = _push_buffer_to_downstream (base, frame_out); + + if (ret != GST_FLOW_OK) { + GST_DEBUG_OBJECT (base, "fails to push one buffer, system_frame_number " + "%d: %s", system_frame_number, gst_flow_get_name (ret)); + } + + return ret; +} + +static GstFlowReturn +gst_va_base_enc_drain (GstVideoEncoder * venc) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (venc); + GstVaBaseEncClass *base_class = GST_VA_BASE_ENC_GET_CLASS (base); + GstFlowReturn ret = GST_FLOW_OK; + GstVideoCodecFrame *frame_enc = NULL; + gboolean is_last = FALSE; + + GST_DEBUG_OBJECT (base, "Encoder is draining"); + + /* Kickout all cached frames */ + if (!base_class->reorder_frame (base, NULL, TRUE, &frame_enc)) { + ret = GST_FLOW_ERROR; + goto error_and_purge_all; + } + + while (frame_enc) { + is_last = FALSE; + + if (g_queue_is_empty (&base->reorder_list)) + is_last = TRUE; + + ret = base_class->encode_frame (base, frame_enc, is_last); + if (ret != GST_FLOW_OK) + goto error_and_purge_all; + + frame_enc = NULL; + + ret = _push_out_one_buffer (base); + if (ret != GST_FLOW_OK) + goto error_and_purge_all; + + if (!base_class->reorder_frame (base, NULL, TRUE, &frame_enc)) { + ret = GST_FLOW_ERROR; + goto error_and_purge_all; + } + } + + g_assert (g_queue_is_empty (&base->reorder_list)); + + /* Output all frames. */ + while (!g_queue_is_empty (&base->output_list)) { + ret = _push_out_one_buffer (base); + if (ret != GST_FLOW_OK) + goto error_and_purge_all; + } + + /* Also clear the reference list. */ + g_queue_clear_full (&base->ref_list, + (GDestroyNotify) gst_video_codec_frame_unref); + + return GST_FLOW_OK; + +error_and_purge_all: + if (frame_enc) { + gst_clear_buffer (&frame_enc->output_buffer); + gst_video_encoder_finish_frame (venc, frame_enc); + } + + if (!g_queue_is_empty (&base->output_list)) { + GST_WARNING_OBJECT (base, "Still %d frame in the output list" + " after drain", g_queue_get_length (&base->output_list)); + while (!g_queue_is_empty (&base->output_list)) { + frame_enc = g_queue_pop_head (&base->output_list); + gst_video_codec_frame_unref (frame_enc); + gst_clear_buffer (&frame_enc->output_buffer); + gst_video_encoder_finish_frame (venc, frame_enc); + } + } + + if (!g_queue_is_empty (&base->reorder_list)) { + GST_WARNING_OBJECT (base, "Still %d frame in the reorder list" + " after drain", g_queue_get_length (&base->reorder_list)); + while (!g_queue_is_empty (&base->reorder_list)) { + frame_enc = g_queue_pop_head (&base->reorder_list); + gst_video_codec_frame_unref (frame_enc); + gst_clear_buffer (&frame_enc->output_buffer); + gst_video_encoder_finish_frame (venc, frame_enc); + } + } + + /* Also clear the reference list. */ + g_queue_clear_full (&base->ref_list, + (GDestroyNotify) gst_video_codec_frame_unref); + + return ret; +} + +static gboolean +gst_va_base_enc_reset (GstVaBaseEnc * base) +{ + GstVaBaseEncClass *base_class = GST_VA_BASE_ENC_GET_CLASS (base); + + GST_DEBUG_OBJECT (base, "Reconfiguration"); + if (gst_va_base_enc_drain (GST_VIDEO_ENCODER (base)) != GST_FLOW_OK) + return FALSE; + + if (!base_class->reconfig (base)) { + GST_ERROR_OBJECT (base, "Error at reconfiguration error"); + return FALSE; + } + + return TRUE; +} + +static GstFlowReturn +gst_va_base_enc_handle_frame (GstVideoEncoder * venc, + GstVideoCodecFrame * frame) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (venc); + GstVaBaseEncClass *base_class = GST_VA_BASE_ENC_GET_CLASS (base); + GstFlowReturn ret; + GstBuffer *in_buf = NULL; + GstVideoCodecFrame *frame_encode = NULL; + + GST_LOG_OBJECT (venc, + "handle frame id %d, dts %" GST_TIME_FORMAT ", pts %" GST_TIME_FORMAT, + frame->system_frame_number, + GST_TIME_ARGS (GST_BUFFER_DTS (frame->input_buffer)), + GST_TIME_ARGS (GST_BUFFER_PTS (frame->input_buffer))); + + if (g_atomic_int_compare_and_exchange (&base->reconf, TRUE, FALSE)) { + if (!gst_va_base_enc_reset (base)) + return GST_FLOW_ERROR; + } + + ret = gst_va_base_enc_import_input_buffer (base, + frame->input_buffer, &in_buf); + if (ret != GST_FLOW_OK) + goto error_buffer_invalid; + + gst_buffer_replace (&frame->input_buffer, in_buf); + gst_clear_buffer (&in_buf); + + if (!base_class->new_frame (base, frame)) + goto error_new_frame; + + if (!base_class->reorder_frame (base, frame, FALSE, &frame_encode)) + goto error_reorder; + + /* pass it to reorder list and we should not use it again. */ + frame = NULL; + + while (frame_encode) { + ret = base_class->encode_frame (base, frame_encode, FALSE); + if (ret != GST_FLOW_OK) + goto error_encode; + + while (g_queue_get_length (&base->output_list) > 0) + ret = _push_out_one_buffer (base); + + frame_encode = NULL; + if (!base_class->reorder_frame (base, NULL, FALSE, &frame_encode)) + goto error_reorder; + } + + return ret; + +error_buffer_invalid: + { + GST_ELEMENT_ERROR (venc, STREAM, ENCODE, + ("Failed to import the input frame: %s.", gst_flow_get_name (ret)), + (NULL)); + gst_clear_buffer (&in_buf); + gst_clear_buffer (&frame->output_buffer); + gst_video_encoder_finish_frame (venc, frame); + return ret; + } +error_new_frame: + { + GST_ELEMENT_ERROR (venc, STREAM, ENCODE, + ("Failed to create the input frame."), (NULL)); + gst_clear_buffer (&frame->output_buffer); + gst_video_encoder_finish_frame (venc, frame); + return GST_FLOW_ERROR; + } +error_reorder: + { + GST_ELEMENT_ERROR (venc, STREAM, ENCODE, + ("Failed to reorder the input frame."), (NULL)); + gst_clear_buffer (&frame->output_buffer); + gst_video_encoder_finish_frame (venc, frame); + return GST_FLOW_ERROR; + } +error_encode: + { + GST_ELEMENT_ERROR (venc, STREAM, ENCODE, + ("Failed to encode the frame %s.", gst_flow_get_name (ret)), (NULL)); + gst_clear_buffer (&frame_encode->output_buffer); + gst_video_encoder_finish_frame (venc, frame_encode); + return ret; + } +} + +static GstFlowReturn +gst_va_base_enc_finish (GstVideoEncoder * venc) +{ + return gst_va_base_enc_drain (venc); +} + +static gboolean +gst_va_base_enc_set_format (GstVideoEncoder * venc, GstVideoCodecState * state) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (venc); + + g_return_val_if_fail (state->caps != NULL, FALSE); + + if (base->input_state) + gst_video_codec_state_unref (base->input_state); + base->input_state = gst_video_codec_state_ref (state); + + if (!gst_va_base_enc_reset (base)) + return FALSE; + + /* Sub class should open the encoder if reconfig succeeds. */ + return gst_va_encoder_is_open (base->encoder); +} + +static gboolean +gst_va_base_enc_flush (GstVideoEncoder * venc) +{ + _flush_all_frames (GST_VA_BASE_ENC (venc)); + return TRUE; +} + +static gboolean +_query_context (GstVaBaseEnc * base, GstQuery * query) +{ + GstVaDisplay *display = NULL; + gboolean ret; + + gst_object_replace ((GstObject **) & display, (GstObject *) base->display); + ret = gst_va_handle_context_query (GST_ELEMENT_CAST (base), query, display); + gst_clear_object (&display); + + return ret; +} + +static gboolean +gst_va_base_enc_src_query (GstVideoEncoder * venc, GstQuery * query) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (venc); + gboolean ret = FALSE; + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT:{ + ret = _query_context (base, query); + break; + } + case GST_QUERY_CAPS:{ + GstCaps *caps = NULL, *tmp, *filter = NULL; + GstVaEncoder *va_encoder = NULL; + gboolean fixed_caps; + + gst_object_replace ((GstObject **) & va_encoder, + (GstObject *) base->encoder); + + gst_query_parse_caps (query, &filter); + + fixed_caps = GST_PAD_IS_FIXED_CAPS (GST_VIDEO_ENCODER_SRC_PAD (venc)); + + if (!fixed_caps && va_encoder) + caps = gst_va_encoder_get_srcpad_caps (va_encoder); + + gst_clear_object (&va_encoder); + + if (caps) { + if (filter) { + tmp = gst_caps_intersect_full (filter, caps, + GST_CAPS_INTERSECT_FIRST); + gst_caps_unref (caps); + caps = tmp; + } + + GST_LOG_OBJECT (base, "Returning caps %" GST_PTR_FORMAT, caps); + gst_query_set_caps_result (query, caps); + gst_caps_unref (caps); + ret = TRUE; + break; + } + /* else jump to default */ + } + default: + ret = GST_VIDEO_ENCODER_CLASS (parent_class)->src_query (venc, query); + break; + } + + return ret; +} + +static gboolean +gst_va_base_enc_sink_query (GstVideoEncoder * venc, GstQuery * query) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (venc); + + if (GST_QUERY_TYPE (query) == GST_QUERY_CONTEXT) + return _query_context (base, query); + + return GST_VIDEO_ENCODER_CLASS (parent_class)->sink_query (venc, query); +} + +static void +gst_va_base_enc_set_context (GstElement * element, GstContext * context) +{ + GstVaDisplay *old_display, *new_display; + GstVaBaseEnc *base = GST_VA_BASE_ENC (element); + GstVaBaseEncClass *klass = GST_VA_BASE_ENC_GET_CLASS (base); + gboolean ret; + + old_display = base->display ? gst_object_ref (base->display) : NULL; + + ret = gst_va_handle_set_context (element, context, klass->render_device_path, + &base->display); + + new_display = base->display ? gst_object_ref (base->display) : NULL; + + if (!ret || (old_display && new_display && old_display != new_display + && base->encoder)) { + GST_ELEMENT_WARNING (element, RESOURCE, BUSY, + ("Can't replace VA display while operating"), (NULL)); + } + + gst_clear_object (&old_display); + gst_clear_object (&new_display); + + GST_ELEMENT_CLASS (parent_class)->set_context (element, context); +} + +static void +gst_va_base_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (object); + + switch (prop_id) { + case PROP_DEVICE_PATH:{ + if (!(base->display && GST_IS_VA_DISPLAY_DRM (base->display))) { + g_value_set_string (value, NULL); + return; + } + g_object_get_property (G_OBJECT (base->display), "path", value); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +gst_va_base_enc_init (GstVaBaseEnc * self) +{ + g_queue_init (&self->reorder_list); + g_queue_init (&self->ref_list); + g_queue_init (&self->output_list); + + self->priv = gst_va_base_enc_get_instance_private (self); +} + +static void +gst_va_base_enc_dispose (GObject * object) +{ + _flush_all_frames (GST_VA_BASE_ENC (object)); + gst_va_base_enc_close (GST_VIDEO_ENCODER (object)); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +void +gst_va_base_enc_class_init (GstVaBaseEncClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstVideoEncoderClass *encoder_class = GST_VIDEO_ENCODER_CLASS (klass); + + gobject_class->get_property = gst_va_base_enc_get_property; + gobject_class->dispose = gst_va_base_enc_dispose; + + element_class->set_context = GST_DEBUG_FUNCPTR (gst_va_base_enc_set_context); + + encoder_class->open = GST_DEBUG_FUNCPTR (gst_va_base_enc_open); + encoder_class->close = GST_DEBUG_FUNCPTR (gst_va_base_enc_close); + encoder_class->start = GST_DEBUG_FUNCPTR (gst_va_base_enc_start); + encoder_class->stop = GST_DEBUG_FUNCPTR (gst_va_base_enc_stop); + encoder_class->getcaps = GST_DEBUG_FUNCPTR (gst_va_base_enc_get_caps); + encoder_class->src_query = GST_DEBUG_FUNCPTR (gst_va_base_enc_src_query); + encoder_class->sink_query = GST_DEBUG_FUNCPTR (gst_va_base_enc_sink_query); + encoder_class->propose_allocation = + GST_DEBUG_FUNCPTR (gst_va_base_enc_propose_allocation); + encoder_class->handle_frame = + GST_DEBUG_FUNCPTR (gst_va_base_enc_handle_frame); + encoder_class->set_format = GST_DEBUG_FUNCPTR (gst_va_base_enc_set_format); + encoder_class->finish = GST_DEBUG_FUNCPTR (gst_va_base_enc_finish); + encoder_class->flush = GST_DEBUG_FUNCPTR (gst_va_base_enc_flush); + + klass->reset_state = GST_DEBUG_FUNCPTR (gst_va_base_enc_reset_state_default); + + /** + * GstVaBaseEnc:device-path: + * + * It shows the DRM device path used for the VA operation, if any. + */ + propertiesPROP_DEVICE_PATH = g_param_spec_string ("device-path", + "Device Path", "DRM device path", NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, N_PROPERTIES, properties); + + gst_type_mark_as_plugin_api (GST_TYPE_VA_BASE_ENC, 0); +} + +/*********************** Helper Functions ****************************/ +gboolean +gst_va_base_enc_add_rate_control_parameter (GstVaBaseEnc * base, + GstVaEncodePicture * picture, guint32 rc_mode, + guint max_bitrate_bits, guint target_percentage, + guint32 qp_i, guint32 min_qp, guint32 max_qp, guint32 mbbrc) +{ + uint32_t window_size; + struct VAEncMiscParameterRateControlWrap + { + VAEncMiscParameterType type; + VAEncMiscParameterRateControl rate_control; + } rate_control; + + if (rc_mode == VA_RC_NONE || rc_mode == VA_RC_CQP) + return TRUE; + + window_size = rc_mode == VA_RC_VBR ? max_bitrate_bits / 2 : max_bitrate_bits; + + /* *INDENT-OFF* */ + rate_control = (struct VAEncMiscParameterRateControlWrap) { + .type = VAEncMiscParameterTypeRateControl, + .rate_control = { + .bits_per_second = max_bitrate_bits, + .target_percentage = target_percentage, + .window_size = window_size, + .initial_qp = qp_i, + .min_qp = min_qp, + .max_qp = max_qp, + .rc_flags.bits.mb_rate_control = mbbrc, + .quality_factor = 0, + }, + }; + /* *INDENT-ON* */ + + if (!gst_va_encoder_add_param (base->encoder, picture, + VAEncMiscParameterBufferType, &rate_control, sizeof (rate_control))) { + GST_ERROR_OBJECT (base, "Failed to create the race control parameter"); + return FALSE; + } + + return TRUE; +} + +gboolean +gst_va_base_enc_add_quality_level_parameter (GstVaBaseEnc * base, + GstVaEncodePicture * picture, guint target_usage) +{ + /* *INDENT-OFF* */ + struct + { + VAEncMiscParameterType type; + VAEncMiscParameterBufferQualityLevel ql; + } quality_level = { + .type = VAEncMiscParameterTypeQualityLevel, + .ql.quality_level = target_usage, + }; + /* *INDENT-ON* */ + + if (target_usage == 0) + return TRUE; + + if (!gst_va_encoder_add_param (base->encoder, picture, + VAEncMiscParameterBufferType, &quality_level, + sizeof (quality_level))) { + GST_ERROR_OBJECT (base, "Failed to create the quality level parameter"); + return FALSE; + } + + return TRUE; +} + +gboolean +gst_va_base_enc_add_frame_rate_parameter (GstVaBaseEnc * base, + GstVaEncodePicture * picture) +{ + /* *INDENT-OFF* */ + struct + { + VAEncMiscParameterType type; + VAEncMiscParameterFrameRate fr; + } framerate = { + .type = VAEncMiscParameterTypeFrameRate, + /* denominator = framerate >> 16 & 0xffff; + * numerator = framerate & 0xffff; */ + .fr.framerate = + (GST_VIDEO_INFO_FPS_N (&base->input_state->info) & 0xffff) | + ((GST_VIDEO_INFO_FPS_D (&base->input_state->info) & 0xffff) << 16) + }; + /* *INDENT-ON* */ + + if (!gst_va_encoder_add_param (base->encoder, picture, + VAEncMiscParameterBufferType, &framerate, sizeof (framerate))) { + GST_ERROR_OBJECT (base, "Failed to create the frame rate parameter"); + return FALSE; + } + + return TRUE; +} + +gboolean +gst_va_base_enc_add_hrd_parameter (GstVaBaseEnc * base, + GstVaEncodePicture * picture, guint32 rc_mode, guint cpb_length_bits) +{ + /* *INDENT-OFF* */ + struct + { + VAEncMiscParameterType type; + VAEncMiscParameterHRD hrd; + } hrd = { + .type = VAEncMiscParameterTypeHRD, + .hrd = { + .buffer_size = cpb_length_bits, + .initial_buffer_fullness = cpb_length_bits / 2, + }, + }; + /* *INDENT-ON* */ + + if (rc_mode == VA_RC_NONE || rc_mode == VA_RC_CQP || rc_mode == VA_RC_VCM) + return TRUE; + + if (!gst_va_encoder_add_param (base->encoder, picture, + VAEncMiscParameterBufferType, &hrd, sizeof (hrd))) { + GST_ERROR_OBJECT (base, "Failed to create the HRD parameter"); + return FALSE; + } + + return TRUE; +} + +gboolean +gst_va_base_enc_add_trellis_parameter (GstVaBaseEnc * base, + GstVaEncodePicture * picture, gboolean use_trellis) +{ + /* *INDENT-OFF* */ + struct + { + VAEncMiscParameterType type; + VAEncMiscParameterQuantization tr; + } trellis = { + .type = VAEncMiscParameterTypeQuantization, + .tr.quantization_flags.bits = { + .disable_trellis = 0, + .enable_trellis_I = 1, + .enable_trellis_B = 1, + .enable_trellis_P = 1, + }, + }; + /* *INDENT-ON* */ + + if (!use_trellis) + return TRUE; + + if (!gst_va_encoder_add_param (base->encoder, picture, + VAEncMiscParameterBufferType, &trellis, sizeof (trellis))) { + GST_ERROR_OBJECT (base, "Failed to create the trellis parameter"); + return FALSE; + } + + return TRUE; +} + +void +gst_va_base_enc_add_codec_tag (GstVaBaseEnc * base, const gchar * codec_name) +{ + GstVideoEncoder *venc = GST_VIDEO_ENCODER (base); + GstTagList *tags = gst_tag_list_new_empty (); + const gchar *encoder_name; + guint bitrate = 0; + + g_object_get (venc, "bitrate", &bitrate, NULL); + if (bitrate > 0) + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_NOMINAL_BITRATE, + bitrate, NULL); + + if ((encoder_name = + gst_element_class_get_metadata (GST_ELEMENT_GET_CLASS (venc), + GST_ELEMENT_METADATA_LONGNAME))) + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, + encoder_name, NULL); + + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_CODEC, codec_name, + NULL); + + gst_video_encoder_merge_tags (venc, tags, GST_TAG_MERGE_REPLACE); + gst_tag_list_unref (tags); +} + +void +gst_va_base_enc_reset_state (GstVaBaseEnc * base) +{ + GstVaBaseEncClass *klass = GST_VA_BASE_ENC_GET_CLASS (base); + + g_assert (klass->reset_state); + klass->reset_state (base); +} + +/* *INDENT-OFF* */ +#define UPDATE_PROPERTY \ + GST_OBJECT_LOCK (base); \ + if (*old_val == new_val) { \ + GST_OBJECT_UNLOCK (base); \ + return; \ + } \ + *old_val = new_val; \ + GST_OBJECT_UNLOCK (base); \ + if (pspec) \ + g_object_notify_by_pspec (G_OBJECT (base), pspec); \ + +void +gst_va_base_enc_update_property_uint (GstVaBaseEnc * base, guint32 * old_val, + guint32 new_val, GParamSpec * pspec) +{ + UPDATE_PROPERTY +} + +void +gst_va_base_enc_update_property_bool (GstVaBaseEnc * base, gboolean * old_val, + gboolean new_val, GParamSpec * pspec) +{ + UPDATE_PROPERTY +} + +#undef UPDATE_PROPERTY +/* *INDENT-ON* */
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvabaseenc.h
Added
@@ -0,0 +1,147 @@ +/* GStreamer + * Copyright (C) 2022 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the0 + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "gstvadevice.h" +#include "gstvaencoder.h" +#include "gstvaprofile.h" + +G_BEGIN_DECLS + +#define GST_TYPE_VA_BASE_ENC (gst_va_base_enc_get_type()) +#define GST_VA_BASE_ENC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_VA_BASE_ENC, GstVaBaseEnc)) +#define GST_IS_VA_BASE_ENC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_VA_BASE_ENC)) +#define GST_VA_BASE_ENC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_VA_BASE_ENC, GstVaBaseEncClass)) +#define GST_IS_VA_BASE_ENC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_VA_BASE_ENC)) +#define GST_VA_BASE_ENC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_VA_BASE_ENC, GstVaBaseEncClass)) + +#define GST_VA_BASE_ENC_ENTRYPOINT(obj) (GST_VA_BASE_ENC_GET_CLASS(obj)->entrypoint) + +typedef struct _GstVaBaseEnc GstVaBaseEnc; +typedef struct _GstVaBaseEncClass GstVaBaseEncClass; +typedef struct _GstVaBaseEncPrivate GstVaBaseEncPrivate; + +struct _GstVaBaseEnc +{ + GstVideoEncoder parent_instance; + + GstVaDisplay *display; + GstVaEncoder *encoder; + + gboolean reconf; + + VAProfile profile; + gint width; + gint height; + guint rt_format; + guint codedbuf_size; + + GstClockTime start_pts; + GstClockTime frame_duration; + /* Total frames we handled since reconfig. */ + guint input_frame_count; + guint output_frame_count; + + GQueue reorder_list; + GQueue ref_list; + GQueue output_list; + + GstVideoCodecState *input_state; + + /*< private >*/ + GstVaBaseEncPrivate *priv; + + gpointer _paddingGST_PADDING; +}; + +struct _GstVaBaseEncClass +{ + GstVideoEncoderClass parent_class; + + void (*reset_state) (GstVaBaseEnc * encoder); + gboolean (*reconfig) (GstVaBaseEnc * encoder); + gboolean (*new_frame) (GstVaBaseEnc * encoder, + GstVideoCodecFrame * frame); + gboolean (*reorder_frame) (GstVaBaseEnc * base, + GstVideoCodecFrame * frame, + gboolean bump_all, + GstVideoCodecFrame ** out_frame); + gboolean (*encode_frame) (GstVaBaseEnc * encoder, + GstVideoCodecFrame * frame, + gboolean is_last); + void (*prepare_output) (GstVaBaseEnc * encoder, + GstVideoCodecFrame * frame); + + GstVaCodecs codec; + VAEntrypoint entrypoint; + gchar *render_device_path; + + gpointer _paddingGST_PADDING; +}; + +struct CData +{ + VAEntrypoint entrypoint; + gchar *render_device_path; + gchar *description; + GstCaps *sink_caps; + GstCaps *src_caps; +}; + +GType gst_va_base_enc_get_type (void); + +gboolean gst_va_base_enc_add_rate_control_parameter (GstVaBaseEnc * base, + GstVaEncodePicture * picture, + guint32 rc_mode, + guint max_bitrate_bits, + guint target_percentage, + guint32 qp_i, + guint32 min_qp, + guint32 max_qp, + guint32 mbbrc); +gboolean gst_va_base_enc_add_quality_level_parameter (GstVaBaseEnc * base, + GstVaEncodePicture * picture, + guint target_usage); +gboolean gst_va_base_enc_add_frame_rate_parameter (GstVaBaseEnc * base, + GstVaEncodePicture * picture); +gboolean gst_va_base_enc_add_hrd_parameter (GstVaBaseEnc * base, + GstVaEncodePicture * picture, + guint32 rc_mode, + guint cpb_length_bits); +gboolean gst_va_base_enc_add_trellis_parameter (GstVaBaseEnc * base, + GstVaEncodePicture * picture, + gboolean use_trellis); +void gst_va_base_enc_add_codec_tag (GstVaBaseEnc * base, + const gchar * codec_name); +void gst_va_base_enc_reset_state (GstVaBaseEnc * base); + +void gst_va_base_enc_update_property_uint (GstVaBaseEnc * base, + guint32 * old_val, + guint32 new_val, + GParamSpec * pspec); +void gst_va_base_enc_update_property_bool (GstVaBaseEnc * base, + gboolean * old_val, + gboolean new_val, + GParamSpec * pspec); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVaBaseEnc, gst_object_unref) + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvabasetransform.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvabasetransform.c
Changed
@@ -24,14 +24,21 @@ #include "gstvabasetransform.h" -#include "gstvaallocator.h" +#include <gst/va/gstva.h> + #include "gstvacaps.h" -#include "gstvapool.h" -#include "gstvautils.h" #define GST_CAT_DEFAULT gst_va_base_transform_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); +enum +{ + PROP_DEVICE_PATH = 1, + N_PROPERTIES +}; + +static GParamSpec *propertiesN_PROPERTIES; + struct _GstVaBaseTransformPrivate { GstVideoInfo srcpad_info; @@ -53,7 +60,7 @@ * Since: 1.20 */ #define gst_va_base_transform_parent_class parent_class -G_DEFINE_TYPE_WITH_CODE (GstVaBaseTransform, gst_va_base_transform, +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstVaBaseTransform, gst_va_base_transform, GST_TYPE_BASE_TRANSFORM, G_ADD_PRIVATE (GstVaBaseTransform) GST_DEBUG_CATEGORY_INIT (gst_va_base_transform_debug, "vabasetransform", 0, "vabasetransform element"); @@ -62,6 +69,26 @@ extern GRecMutex GST_VA_SHARED_LOCK; static void +gst_va_base_transform_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstVaBaseTransform *self = GST_VA_BASE_TRANSFORM (object); + + switch (prop_id) { + case PROP_DEVICE_PATH:{ + if (!(self->display && GST_IS_VA_DISPLAY_DRM (self->display))) { + g_value_set_string (value, NULL); + return; + } + g_object_get_property (G_OBJECT (self->display), "path", value); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void gst_va_base_transform_dispose (GObject * object) { GstVaBaseTransform *self = GST_VA_BASE_TRANSFORM (object); @@ -234,7 +261,7 @@ } pool = gst_va_pool_new_with_config (caps, size, 1 + self->extra_min_buffers, - 0, usage_hint, allocator, ¶ms); + 0, usage_hint, GST_VA_FEATURE_AUTO, allocator, ¶ms); if (!pool) { gst_object_unref (allocator); goto config_failed; @@ -304,6 +331,7 @@ GstVideoInfo vinfo; guint min, max, size = 0, usage_hint = VA_SURFACE_ATTRIB_USAGE_HINT_VPP_WRITE; gboolean update_pool, update_allocator, has_videometa, copy_frames; + gboolean dont_use_other_pool = FALSE; gst_query_parse_allocation (query, &outcaps, NULL); @@ -316,13 +344,20 @@ } if (gst_query_get_n_allocation_params (query) > 0) { + GstVaDisplay *display; + gst_query_parse_nth_allocation_param (query, 0, &allocator, &other_params); - if (allocator && !(GST_IS_VA_DMABUF_ALLOCATOR (allocator) - || GST_IS_VA_ALLOCATOR (allocator))) { + display = gst_va_allocator_peek_display (allocator); + if (!display) { /* save the allocator for the other pool */ other_allocator = allocator; allocator = NULL; + } else if (display != self->display) { + /* The allocator and pool belong to other display, we should not use. */ + gst_clear_object (&allocator); + dont_use_other_pool = TRUE; } + update_allocator = TRUE; } else { update_allocator = FALSE; @@ -337,6 +372,8 @@ "may need other pool for copy frames %" GST_PTR_FORMAT, pool); other_pool = pool; pool = NULL; + } else if (dont_use_other_pool) { + gst_clear_object (&pool); } } @@ -365,7 +402,8 @@ gst_buffer_pool_config_set_allocator (config, allocator, ¶ms); gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); gst_buffer_pool_config_set_params (config, outcaps, size, min, max); - gst_buffer_pool_config_set_va_allocation_params (config, usage_hint); + gst_buffer_pool_config_set_va_allocation_params (config, usage_hint, + GST_VA_FEATURE_AUTO); if (!gst_buffer_pool_set_config (pool, config)) { gst_object_unref (allocator); gst_object_unref (pool); @@ -376,7 +414,8 @@ gst_va_dmabuf_allocator_get_format (allocator, &self->priv->srcpad_info, NULL); } else if (GST_IS_VA_ALLOCATOR (allocator)) { - gst_va_allocator_get_format (allocator, &self->priv->srcpad_info, NULL); + gst_va_allocator_get_format (allocator, &self->priv->srcpad_info, NULL, + NULL); } if (update_allocator) @@ -505,6 +544,7 @@ if (!gst_va_ensure_element_data (element, klass->render_device_path, &self->display)) goto open_failed; + g_object_notify_by_pspec (G_OBJECT (self), propertiesPROP_DEVICE_PATH); gst_clear_caps (&self->priv->filter_caps); gst_clear_object (&self->filter); self->filter = gst_va_filter_new (self->display); @@ -527,6 +567,7 @@ gst_clear_caps (&self->priv->filter_caps); gst_clear_object (&self->filter); gst_clear_object (&self->display); + g_object_notify_by_pspec (G_OBJECT (self), propertiesPROP_DEVICE_PATH); break; default: break; @@ -580,6 +621,7 @@ trans_class = GST_BASE_TRANSFORM_CLASS (klass); gobject_class->dispose = gst_va_base_transform_dispose; + gobject_class->get_property = gst_va_base_transform_get_property; trans_class->query = GST_DEBUG_FUNCPTR (gst_va_base_transform_query); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_va_base_transform_set_caps); @@ -597,6 +639,19 @@ element_class->change_state = GST_DEBUG_FUNCPTR (gst_va_base_transform_change_state); + /** + * GstVaBaseTransform:device-path: + * + * It shows the DRM device path used for the VA operation, if any. + * + * Since: 1.22 + */ + propertiesPROP_DEVICE_PATH = g_param_spec_string ("device-path", + "Device Path", "DRM device path", NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, N_PROPERTIES, properties); + gst_type_mark_as_plugin_api (GST_TYPE_VA_BASE_TRANSFORM, 0); } @@ -723,7 +778,7 @@ allocator = gst_va_base_transform_allocator_from_caps (self, caps); self->priv->sinkpad_pool = gst_va_pool_new_with_config (caps, size, 1, 0, - usage_hint, allocator, ¶ms); + usage_hint, GST_VA_FEATURE_AUTO, allocator, ¶ms); if (!self->priv->sinkpad_pool) { gst_object_unref (allocator); return NULL; @@ -733,7 +788,8 @@ gst_va_dmabuf_allocator_get_format (allocator, &self->priv->sinkpad_info, NULL); } else if (GST_IS_VA_ALLOCATOR (allocator)) { - gst_va_allocator_get_format (allocator, &self->priv->sinkpad_info, NULL); + gst_va_allocator_get_format (allocator, &self->priv->sinkpad_info, NULL, + NULL); } gst_object_unref (allocator); @@ -754,7 +810,8 @@ gboolean ret; surface = gst_va_buffer_get_surface (inbuf); - if (surface != VA_INVALID_ID) + if (surface != VA_INVALID_ID && + (gst_va_buffer_peek_display (inbuf) == self->display)) return TRUE; g_rec_mutex_lock (&GST_VA_SHARED_LOCK); @@ -822,11 +879,11 @@ invalid_buffer: { - GST_ELEMENT_WARNING (self, CORE, NOT_IMPLEMENTED, (NULL), + GST_ELEMENT_WARNING (self, STREAM, FORMAT, (NULL), ("invalid video buffer received")); if (buffer) gst_buffer_unref (buffer); - return GST_FLOW_OK; + return GST_FLOW_ERROR; } }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvacaps.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvacaps.c
Changed
@@ -24,13 +24,11 @@ #include "gstvacaps.h" -#include <gst/allocators/allocators.h> - +#include <gst/va/gstvavideoformat.h> #include <va/va_drmcommon.h> #include "gstvadisplay_priv.h" #include "gstvaprofile.h" -#include "gstvavideoformat.h" GST_DEBUG_CATEGORY_EXTERN (gstva_debug); #define GST_CAT_DEFAULT gstva_debug @@ -68,9 +66,7 @@ dpy = gst_va_display_get_va_dpy (display); - gst_va_display_lock (display); status = vaQuerySurfaceAttributes (dpy, config, NULL, attrib_count); - gst_va_display_unlock (display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (display, "vaQuerySurfaceAttributes: %s", vaErrorStr (status)); @@ -79,9 +75,7 @@ attribs = g_new (VASurfaceAttrib, *attrib_count); - gst_va_display_lock (display); status = vaQuerySurfaceAttributes (dpy, config, attribs, attrib_count); - gst_va_display_unlock (display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (display, "vaQuerySurfaceAttributes: %s", vaErrorStr (status)); @@ -95,6 +89,17 @@ return NULL; } +static inline void +_value_list_append_string (GValue * list, const gchar * str) +{ + GValue item = G_VALUE_INIT; + + g_value_init (&item, G_TYPE_STRING); + g_value_set_string (&item, str); + gst_value_list_append_value (list, &item); + g_value_unset (&item); +} + gboolean gst_caps_set_format_array (GstCaps * caps, GArray * formats) { @@ -121,8 +126,6 @@ gst_value_list_init (&v_formats, formats->len); for (i = 0; i < formats->len; i++) { - GValue item = G_VALUE_INIT; - fmt = g_array_index (formats, GstVideoFormat, i); if (fmt == GST_VIDEO_FORMAT_UNKNOWN) continue; @@ -130,10 +133,7 @@ if (!format) continue; - g_value_init (&item, G_TYPE_STRING); - g_value_set_string (&item, format); - gst_value_list_append_value (&v_formats, &item); - g_value_unset (&item); + _value_list_append_string (&v_formats, format); } } else { return FALSE; @@ -145,6 +145,51 @@ return TRUE; } +/* Fix raw frames ill reported by drivers. + * + * Mesa Gallium reports P010 and P016 for H264 encoder: + * https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19443 + * + * Intel i965: reports I420 and YV12 + * XXX: add issue or pr + */ +static gboolean +fix_raw_formats (GstVaDisplay * display, VAConfigID config, GArray * formats) +{ + VADisplay dpy; + VAStatus status; + VAProfile profile; + VAEntrypoint entrypoint; + VAConfigAttrib *attribs; + GstVideoFormat format; + int num; + + if (!(GST_VA_DISPLAY_IS_IMPLEMENTATION (display, INTEL_I965) || + GST_VA_DISPLAY_IS_IMPLEMENTATION (display, MESA_GALLIUM))) + return TRUE; + + dpy = gst_va_display_get_va_dpy (display); + attribs = g_new (VAConfigAttrib, vaMaxNumConfigAttributes (dpy)); + status = vaQueryConfigAttributes (dpy, config, &profile, &entrypoint, attribs, + &num); + g_free (attribs); + + if (status != VA_STATUS_SUCCESS) { + GST_ERROR_OBJECT (display, "vaQueryConfigAttributes: %s", + vaErrorStr (status)); + return FALSE; + } + + if (gst_va_profile_codec (profile) != H264 + || entrypoint != VAEntrypointEncSlice) + return TRUE; + + formats = g_array_set_size (formats, 0); + format = GST_VIDEO_FORMAT_NV12; + g_array_append_val (formats, format); + return TRUE; +} + GstCaps * gst_va_create_raw_caps_from_config (GstVaDisplay * display, VAConfigID config) { @@ -196,6 +241,9 @@ if (formats->len == 0) goto bail; + if (!fix_raw_formats (display, config, formats)) + goto bail; + base_caps = gst_caps_new_simple ("video/x-raw", "width", GST_TYPE_INT_RANGE, min_width, max_width, "height", GST_TYPE_INT_RANGE, min_height, max_height, NULL); @@ -248,9 +296,7 @@ dpy = gst_va_display_get_va_dpy (display); - gst_va_display_lock (display); status = vaCreateConfig (dpy, profile, entrypoint, &attrib, 1, &config); - gst_va_display_unlock (display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (display, "vaCreateConfig: %s", vaErrorStr (status)); return NULL; @@ -258,9 +304,7 @@ caps = gst_va_create_raw_caps_from_config (display, config); - gst_va_display_lock (display); status = vaDestroyConfig (dpy, config); - gst_va_display_unlock (display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (display, "vaDestroyConfig: %s", vaErrorStr (status)); return NULL; @@ -269,16 +313,155 @@ return caps; } -static GstCaps * +/* the purpose of this function is to find broken configurations in + * JPEG decoders: if the driver doesn't expose a pixel format for a + * config with a specific sampling, that sampling is not valid */ +static inline gboolean +_config_has_pixel_formats (GstVaDisplay * display, VAProfile profile, + VAEntrypoint entrypoint, guint32 rt_format) +{ + guint i, fourcc, count; + gboolean found = FALSE; + VAConfigAttrib attrs = { + .type = VAConfigAttribRTFormat, + .value = rt_format, + }; + VAConfigID config; + VADisplay dpy = gst_va_display_get_va_dpy (display); + VASurfaceAttrib *attr_list; + VAStatus status; + + status = vaCreateConfig (dpy, profile, entrypoint, &attrs, 1, &config); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR_OBJECT (display, "Failed to create JPEG config"); + return FALSE; + } + attr_list = gst_va_get_surface_attribs (display, config, &count); + if (!attr_list) + goto bail; + + /* XXX: JPEG decoders handle RGB16 and RGB32 chromas, but they use + * RGBP pixel format, which its chroma is RGBP (not 16 nor 32). So + * if the requested chroma is 16 or 32 it's locally overloaded as + * RGBP. */ + if (rt_format == VA_RT_FORMAT_RGB16 || rt_format == VA_RT_FORMAT_RGB32) + rt_format = VA_RT_FORMAT_RGBP; + + for (i = 0; i < count; i++) { + if (attr_listi.type == VASurfaceAttribPixelFormat) { + fourcc = attr_listi.value.value.i; + /* ignore pixel formats without requested chroma */ + found = (gst_va_chroma_from_va_fourcc (fourcc) == rt_format); + if (found) + break; + } + } + g_free (attr_list); + +bail: + status = vaDestroyConfig (dpy, config); + if (status != VA_STATUS_SUCCESS) + GST_WARNING_OBJECT (display, "Failed to destroy JPEG config"); + + return found; +} + +static void +_add_jpeg_fields (GstVaDisplay * display, GstCaps * caps, VAProfile profile, + VAEntrypoint entrypoint, guint32 rt_formats) +{ + guint i, size; + GValue colorspace = G_VALUE_INIT, sampling = G_VALUE_INIT; + gboolean rgb, gray, yuv; + + rgb = gray = yuv = FALSE; + + gst_value_list_init (&colorspace, 3); + gst_value_list_init (&sampling, 3); + + for (i = 0; rt_formats && i < G_N_ELEMENTS (va_rt_format_list); i++) { + if (rt_formats & va_rt_format_listi) { + if (!_config_has_pixel_formats (display, profile, entrypoint, + va_rt_format_listi)) + continue; + +#define APPEND_YUV G_STMT_START \ + if (!yuv) { _value_list_append_string (&colorspace, "sYUV"); yuv = TRUE; } \ + G_STMT_END + + switch (va_rt_format_listi) { + case VA_RT_FORMAT_YUV420: + APPEND_YUV; + _value_list_append_string (&sampling, "YCbCr-4:2:0"); + break; + case VA_RT_FORMAT_YUV422: + APPEND_YUV; + _value_list_append_string (&sampling, "YCbCr-4:2:2"); + break; + case VA_RT_FORMAT_YUV444: + APPEND_YUV; + _value_list_append_string (&sampling, "YCbCr-4:4:4"); + break; + case VA_RT_FORMAT_YUV411: + APPEND_YUV; + _value_list_append_string (&sampling, "YCbCr-4:1:1"); + break; + case VA_RT_FORMAT_YUV400: + if (!gray) { + _value_list_append_string (&colorspace, "GRAY"); + _value_list_append_string (&sampling, "GRAYSCALE"); + gray = TRUE; + } + break; + case VA_RT_FORMAT_RGBP: + case VA_RT_FORMAT_RGB16: + case VA_RT_FORMAT_RGB32: + if (!rgb) { + _value_list_append_string (&colorspace, "sRGB"); + _value_list_append_string (&sampling, "RGB"); + _value_list_append_string (&sampling, "BGR"); + rgb = TRUE; + } + break; + default: + break; + } +#undef APPEND_YUV + } + } + + size = gst_value_list_get_size (&colorspace); + if (size == 1) { + gst_caps_set_value (caps, "colorspace", + gst_value_list_get_value (&colorspace, 0)); + } else if (size > 1) { + gst_caps_set_value (caps, "colorspace", &colorspace); + } + + size = gst_value_list_get_size (&sampling); + if (size == 1) { + gst_caps_set_value (caps, "sampling", + gst_value_list_get_value (&sampling, 0)); + } else if (size > 1) { + gst_caps_set_value (caps, "sampling", &sampling); + } + + g_value_unset (&colorspace); + g_value_unset (&sampling); +} + +GstCaps * gst_va_create_coded_caps (GstVaDisplay * display, VAProfile profile, VAEntrypoint entrypoint, guint32 * rt_formats_ptr) { GstCaps *caps; + /* *INDENT-OFF* */ VAConfigAttrib attribs = { - {.type = VAConfigAttribMaxPictureWidth,}, - {.type = VAConfigAttribMaxPictureHeight,}, - {.type = VAConfigAttribRTFormat,}, + { .type = VAConfigAttribMaxPictureWidth, }, + { .type = VAConfigAttribMaxPictureHeight, }, + { .type = VAConfigAttribRTFormat, }, }; + /* *INDENT-ON* */ VADisplay dpy; VAStatus status; guint32 value, rt_formats = 0; @@ -286,10 +469,8 @@ dpy = gst_va_display_get_va_dpy (display); - gst_va_display_lock (display); status = vaGetConfigAttributes (dpy, profile, entrypoint, attribs, G_N_ELEMENTS (attribs)); - gst_va_display_unlock (display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (display, "vaGetConfigAttributes: %s", vaErrorStr (status)); @@ -324,6 +505,9 @@ if (!caps) return NULL; + if (rt_formats > 0 && gst_va_profile_codec (profile) == JPEG) + _add_jpeg_fields (display, caps, profile, entrypoint, rt_formats); + if (max_width == -1 || max_height == -1) return caps; @@ -368,12 +552,12 @@ va_caps = gst_caps_simplify (va_caps); dma_caps = gst_caps_simplify (dma_caps); - sys_caps = gst_caps_merge (sys_caps, va_caps); - sys_caps = gst_caps_merge (sys_caps, dma_caps); + va_caps = gst_caps_merge (va_caps, dma_caps); + va_caps = gst_caps_merge (va_caps, sys_caps); gst_caps_unref (caps); - return sys_caps; + return va_caps; } gboolean
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvacaps.h -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvacaps.h
Changed
@@ -20,7 +20,7 @@ #pragma once -#include <gst/va/gstvadisplay.h> +#include <gst/va/gstva.h> #include <va/va.h> G_BEGIN_DECLS @@ -37,6 +37,10 @@ GstCaps * gst_va_create_raw_caps_from_config (GstVaDisplay * display, VAConfigID config); +GstCaps * gst_va_create_coded_caps (GstVaDisplay * display, + VAProfile profile, + VAEntrypoint entrypoint, + guint32 * rt_formats_ptr); gboolean gst_caps_set_format_array (GstCaps * caps, GArray * formats);
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvacompositor.c
Added
@@ -0,0 +1,1548 @@ +/* GStreamer + * Copyright (C) 2022 Intel Corporation + * Author: U. Artie Eoff <ullysses.a.eoff@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the0 + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-vacompositor + * @title: vacompositor + * @short_description: A VA-API based video compositing element + * + * A video compositing element that uses VA-API VPP to accelerate the compose, + * blending, and scaling of multiple inputs into one output. + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc \ + * ! "video/x-raw,format=(string)NV12,width=640,height=480" \ + * ! tee name=testsrc ! queue ! vacompositor name=comp \ + * sink_1::width=160 sink_1::height=120 sink_1::xpos=480 \ + * sink_1::ypos=360 sink_1::alpha=0.75 \ + * ! autovideosink testsrc. ! queue ! comp. + * ``` + * + * Since: 1.22 + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstvacompositor.h" + +#include <gst/va/gstva.h> +#include <gst/video/video.h> +#include <va/va_drmcommon.h> + +#include "gstvacaps.h" +#include "gstvadisplay_priv.h" +#include "gstvafilter.h" + +GST_DEBUG_CATEGORY_STATIC (gst_va_compositor_debug); +#define GST_CAT_DEFAULT gst_va_compositor_debug + +/** + * GstVaCompositorPad: + * + * VA aggregator pad. + * + * Since: 1.22 + */ +struct _GstVaCompositorPad +{ + GstVideoAggregatorPad parent; + + /*< private> */ + GstBufferPool *pool; + + gint xpos; + gint ypos; + gint width; + gint height; + gdouble alpha; +}; + +enum +{ + PROP_PAD_0, + PROP_PAD_XPOS, + PROP_PAD_YPOS, + PROP_PAD_WIDTH, + PROP_PAD_HEIGHT, + PROP_PAD_ALPHA, +}; + +#define DEFAULT_PAD_XPOS 0 +#define DEFAULT_PAD_YPOS 0 +#define DEFAULT_PAD_WIDTH 0 +#define DEFAULT_PAD_HEIGHT 0 +#define DEFAULT_PAD_ALPHA 1.0 + +G_DEFINE_TYPE (GstVaCompositorPad, gst_va_compositor_pad, + GST_TYPE_VIDEO_AGGREGATOR_PAD); + +static void +gst_va_compositor_pad_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstVaCompositorPad *self = GST_VA_COMPOSITOR_PAD (object); + + switch (prop_id) { + case PROP_PAD_XPOS: + g_value_set_int (value, self->xpos); + break; + case PROP_PAD_YPOS: + g_value_set_int (value, self->ypos); + break; + case PROP_PAD_WIDTH: + g_value_set_int (value, self->width); + break; + case PROP_PAD_HEIGHT: + g_value_set_int (value, self->height); + break; + case PROP_PAD_ALPHA: + g_value_set_double (value, self->alpha); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_va_compositor_pad_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVaCompositorPad *self = GST_VA_COMPOSITOR_PAD (object); + + GST_OBJECT_LOCK (object); + switch (prop_id) { + case PROP_PAD_XPOS: + self->xpos = g_value_get_int (value); + break; + case PROP_PAD_YPOS: + self->ypos = g_value_get_int (value); + break; + case PROP_PAD_WIDTH: + self->width = g_value_get_int (value); + break; + case PROP_PAD_HEIGHT: + self->height = g_value_get_int (value); + break; + case PROP_PAD_ALPHA: + self->alpha = g_value_get_double (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (object); +} + +static void +gst_va_compositor_pad_finalize (GObject * object) +{ + GstVaCompositorPad *self = GST_VA_COMPOSITOR_PAD (object); + + if (self->pool) { + gst_buffer_pool_set_active (self->pool, FALSE); + gst_clear_object (&self->pool); + } + + G_OBJECT_CLASS (gst_va_compositor_pad_parent_class)->finalize (object); +} + +static void +gst_va_compositor_pad_init (GstVaCompositorPad * self) +{ + self->pool = NULL; + self->xpos = DEFAULT_PAD_XPOS; + self->ypos = DEFAULT_PAD_YPOS; + self->width = DEFAULT_PAD_WIDTH; + self->height = DEFAULT_PAD_HEIGHT; + self->alpha = DEFAULT_PAD_ALPHA; +} + +static void +gst_va_compositor_pad_class_init (GstVaCompositorPadClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GstVideoAggregatorPadClass *vaggpad_class = + GST_VIDEO_AGGREGATOR_PAD_CLASS (klass); + + gobject_class->finalize = gst_va_compositor_pad_finalize; + gobject_class->get_property = gst_va_compositor_pad_get_property; + gobject_class->set_property = gst_va_compositor_pad_set_property; + + g_object_class_install_property (gobject_class, PROP_PAD_XPOS, + g_param_spec_int ("xpos", "X Position", "X Position of the picture", + G_MININT, G_MAXINT, DEFAULT_PAD_XPOS, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PAD_YPOS, + g_param_spec_int ("ypos", "Y Position", "Y Position of the picture", + G_MININT, G_MAXINT, DEFAULT_PAD_YPOS, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PAD_WIDTH, + g_param_spec_int ("width", "Width", + "Width of the picture (0, to use the width of the input frame)", + 0, G_MAXINT, DEFAULT_PAD_WIDTH, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PAD_HEIGHT, + g_param_spec_int ("height", "Height", + "Height of the picture (0, to use the height of the input frame)", + 0, G_MAXINT, DEFAULT_PAD_HEIGHT, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PAD_ALPHA, + g_param_spec_double ("alpha", "Alpha", "Alpha of the picture", 0.0, 1.0, + DEFAULT_PAD_ALPHA, + G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS)); + + /* Don't use mapped video frames. Handle video buffers directly */ + vaggpad_class->prepare_frame = NULL; + vaggpad_class->clean_frame = NULL; +} + +#define GST_VA_COMPOSITOR(obj) ((GstVaCompositor *) obj) +#define GST_VA_COMPOSITOR_CLASS(klass) ((GstVaCompositorClass *) klass) +#define GST_VA_COMPOSITOR_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), G_TYPE_FROM_INSTANCE (obj), GstVaCompositorClass)) + +typedef struct _GstVaCompositor GstVaCompositor; +typedef struct _GstVaCompositorClass GstVaCompositorClass; + +struct _GstVaCompositorClass +{ + GstVideoAggregatorClass parent_class; + + /*< private > */ + gchar *render_device_path; +}; + +struct _GstVaCompositor +{ + GstVideoAggregator parent; + + GstVaDisplay *display; + GstVaFilter *filter; + + GstVideoInfo other_info; /* downstream info */ + GstBufferPool *other_pool; /* downstream pool */ + + guint32 scale_method; +}; + +struct CData +{ + gchar *render_device_path; + gchar *description; +}; + +enum +{ + PROP_DEVICE_PATH = 1, + PROP_SCALE_METHOD, + N_PROPERTIES +}; + +static GParamSpec *propertiesN_PROPERTIES; +static GstElementClass *parent_class = NULL; + +static void +gst_va_compositor_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (object); + + switch (prop_id) { + case PROP_SCALE_METHOD: + { + GST_OBJECT_LOCK (object); + self->scale_method = g_value_get_enum (value); + GST_OBJECT_UNLOCK (object); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +gst_va_compositor_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (object); + + switch (prop_id) { + case PROP_DEVICE_PATH: + { + if (!(self->display && GST_IS_VA_DISPLAY_DRM (self->display))) { + g_value_set_string (value, NULL); + return; + } + g_object_get_property (G_OBJECT (self->display), "path", value); + break; + } + case PROP_SCALE_METHOD: + { + GST_OBJECT_LOCK (object); + g_value_set_enum (value, self->scale_method); + GST_OBJECT_UNLOCK (object); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static gboolean +gst_va_compositor_start (GstAggregator * agg) +{ + GstElement *element = GST_ELEMENT (agg); + GstVaCompositor *self = GST_VA_COMPOSITOR (agg); + GstVaCompositorClass *klass = GST_VA_COMPOSITOR_GET_CLASS (agg); + + if (!gst_va_ensure_element_data (element, klass->render_device_path, + &self->display)) + return FALSE; + g_object_notify_by_pspec (G_OBJECT (self), propertiesPROP_DEVICE_PATH); + + self->filter = gst_va_filter_new (self->display); + if (!gst_va_filter_open (self->filter)) + return FALSE; + + return GST_AGGREGATOR_CLASS (parent_class)->start (agg); +} + +static gboolean +gst_va_compositor_stop (GstAggregator * agg) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (agg); + + gst_va_filter_close (self->filter); + gst_clear_object (&self->filter); + gst_clear_object (&self->display); + g_object_notify_by_pspec (G_OBJECT (self), propertiesPROP_DEVICE_PATH); + + return GST_AGGREGATOR_CLASS (parent_class)->stop (agg); +} + +static void +gst_va_compositor_dispose (GObject * object) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (object); + + if (self->other_pool) { + gst_buffer_pool_set_active (self->other_pool, FALSE); + gst_clear_object (&self->other_pool); + } + + gst_clear_object (&self->display); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static GstPad * +gst_va_compositor_request_new_pad (GstElement * element, GstPadTemplate * templ, + const gchar * req_name, const GstCaps * caps) +{ + GstPad *newpad = GST_PAD (GST_ELEMENT_CLASS + (parent_class)->request_new_pad (element, templ, req_name, caps)); + + if (!newpad) + GST_DEBUG_OBJECT (element, "could not create/add pad"); + else + gst_child_proxy_child_added (GST_CHILD_PROXY (element), G_OBJECT (newpad), + GST_OBJECT_NAME (newpad)); + + return newpad; +} + +static void +gst_va_compositor_release_pad (GstElement * element, GstPad * pad) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (element); + + gst_child_proxy_child_removed (GST_CHILD_PROXY (self), G_OBJECT (pad), + GST_OBJECT_NAME (pad)); + + GST_ELEMENT_CLASS (parent_class)->release_pad (element, pad); +} + +static void +gst_va_compositor_set_context (GstElement * element, GstContext * context) +{ + GstVaDisplay *old_display, *new_display; + GstVaCompositor *self = GST_VA_COMPOSITOR (element); + GstVaCompositorClass *klass = GST_VA_COMPOSITOR_GET_CLASS (self); + gboolean ret; + + old_display = self->display ? gst_object_ref (self->display) : NULL; + ret = gst_va_handle_set_context (element, context, klass->render_device_path, + &self->display); + new_display = self->display ? gst_object_ref (self->display) : NULL; + + if (!ret + || (old_display && new_display && old_display != new_display + && self->filter)) { + GST_ELEMENT_WARNING (element, RESOURCE, BUSY, + ("Can't replace VA display while operating"), (NULL)); + } + + gst_clear_object (&old_display); + gst_clear_object (&new_display); + + GST_ELEMENT_CLASS (parent_class)->set_context (element, context); +} + +static gboolean +_handle_context_query (GstVaCompositor * self, GstQuery * query) +{ + GstVaDisplay *display = NULL; + gboolean ret = FALSE; + + gst_object_replace ((GstObject **) & display, (GstObject *) self->display); + ret = gst_va_handle_context_query (GST_ELEMENT_CAST (self), query, display); + gst_clear_object (&display); + + return ret; +} + +static GstCaps * +gst_va_compositor_sink_getcaps (GstPad * pad, GstCaps * filter) +{ + GstCaps *sinkcaps; + GstCaps *template_caps; + GstCaps *filtered_caps; + GstCaps *returned_caps; + + template_caps = gst_pad_get_pad_template_caps (pad); + + sinkcaps = gst_pad_get_current_caps (pad); + if (!sinkcaps) { + sinkcaps = gst_caps_ref (template_caps); + } else { + sinkcaps = gst_caps_merge (sinkcaps, gst_caps_ref (template_caps)); + } + + if (filter) { + filtered_caps = gst_caps_intersect (sinkcaps, filter); + gst_caps_unref (sinkcaps); + } else { + filtered_caps = sinkcaps; + } + + returned_caps = gst_caps_intersect (filtered_caps, template_caps); + + gst_caps_unref (template_caps); + gst_caps_unref (filtered_caps); + + GST_DEBUG_OBJECT (pad, "returning %" GST_PTR_FORMAT, returned_caps); + + return returned_caps; +} + +static gboolean +gst_va_compositor_sink_acceptcaps (GstPad * pad, GstCaps * caps) +{ + gboolean ret; + GstCaps *template_caps; + + template_caps = gst_pad_get_pad_template_caps (pad); + template_caps = gst_caps_make_writable (template_caps); + + ret = gst_caps_can_intersect (caps, template_caps); + GST_DEBUG_OBJECT (pad, "%saccepted caps %" GST_PTR_FORMAT, + (ret ? "" : "not "), caps); + gst_caps_unref (template_caps); + + return ret; +} + +static gboolean +gst_va_compositor_sink_query (GstAggregator * agg, GstAggregatorPad * pad, + GstQuery * query) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (agg); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + { + if (_handle_context_query (self, query)) + return TRUE; + break; + } + case GST_QUERY_CAPS: + { + GstCaps *filter, *caps; + + gst_query_parse_caps (query, &filter); + caps = gst_va_compositor_sink_getcaps (GST_PAD (pad), filter); + gst_query_set_caps_result (query, caps); + gst_caps_unref (caps); + return TRUE; + } + case GST_QUERY_ACCEPT_CAPS: + { + GstCaps *caps; + gboolean ret; + + gst_query_parse_accept_caps (query, &caps); + ret = gst_va_compositor_sink_acceptcaps (GST_PAD (pad), caps); + gst_query_set_accept_caps_result (query, ret); + return TRUE; + } + default: + break; + } + + return GST_AGGREGATOR_CLASS (parent_class)->sink_query (agg, pad, query); +} + +static gboolean +gst_va_compositor_src_query (GstAggregator * agg, GstQuery * query) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (agg); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONTEXT: + if (_handle_context_query (self, query)) + return TRUE; + break; + default: + break; + } + + return GST_AGGREGATOR_CLASS (parent_class)->src_query (agg, query); +} + +static GstAllocator * +gst_va_compositor_allocator_from_caps (GstVaCompositor * self, GstCaps * caps) +{ + GstAllocator *allocator = NULL; + + if (gst_caps_is_dmabuf (caps)) { + allocator = gst_va_dmabuf_allocator_new (self->display); + } else { + GArray *surface_formats = gst_va_filter_get_surface_formats (self->filter); + allocator = gst_va_allocator_new (self->display, surface_formats); + } + + return allocator; +} + +/* Answer upstream allocation query. */ +static gboolean +gst_va_compositor_propose_allocation (GstAggregator * agg, + GstAggregatorPad * aggpad, GstQuery * decide_query, GstQuery * query) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (agg); + GstAllocator *allocator = NULL; + GstAllocationParams params = { 0, }; + GstBufferPool *pool; + GstCaps *caps; + GstVideoInfo info; + gboolean update_allocator = FALSE; + guint size, usage_hint = VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC; + + gst_query_parse_allocation (query, &caps, NULL); + + if (!caps) + return FALSE; + + if (!gst_video_info_from_caps (&info, caps)) + return FALSE; + + if (gst_query_get_n_allocation_pools (query) > 0) + return TRUE; + + size = GST_VIDEO_INFO_SIZE (&info); + + if (gst_query_get_n_allocation_params (query) > 0) { + gst_query_parse_nth_allocation_param (query, 0, &allocator, ¶ms); + if (!GST_IS_VA_DMABUF_ALLOCATOR (allocator) + && !GST_IS_VA_ALLOCATOR (allocator)) + gst_clear_object (&allocator); + update_allocator = TRUE; + } else { + gst_allocation_params_init (¶ms); + } + + if (!allocator) { + if (!(allocator = gst_va_compositor_allocator_from_caps (self, caps))) + return FALSE; + } + + /* Now we have a VA-based allocator */ + + pool = gst_va_pool_new_with_config (caps, size, 1, 0, usage_hint, + GST_VA_FEATURE_AUTO, allocator, ¶ms); + if (!pool) { + gst_object_unref (allocator); + goto config_failed; + } + + if (update_allocator) + gst_query_set_nth_allocation_param (query, 0, allocator, ¶ms); + else + gst_query_add_allocation_param (query, allocator, ¶ms); + + gst_query_add_allocation_pool (query, pool, size, 1, 0); + + GST_DEBUG_OBJECT (self, + "proposing %" GST_PTR_FORMAT " with allocator %" GST_PTR_FORMAT, + pool, allocator); + + gst_object_unref (allocator); + gst_object_unref (pool); + + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + + return TRUE; + +config_failed: + { + GST_ERROR_OBJECT (self, "failed to set config"); + return FALSE; + } +} + +static GstBufferPool * +_create_other_pool (GstAllocator * allocator, GstAllocationParams * params, + GstCaps * caps, guint size) +{ + GstBufferPool *pool = NULL; + GstStructure *config; + + pool = gst_video_buffer_pool_new (); + config = gst_buffer_pool_get_config (pool); + + gst_buffer_pool_config_set_params (config, caps, size, 0, 0); + gst_buffer_pool_config_set_allocator (config, allocator, params); + if (!gst_buffer_pool_set_config (pool, config)) { + gst_clear_object (&pool); + } + + return pool; +} + +/* configure the allocation query that was answered downstream */ +static gboolean +gst_va_compositor_decide_allocation (GstAggregator * agg, GstQuery * query) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (agg); + GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg); + + GstAllocator *allocator = NULL, *other_allocator = NULL; + GstAllocationParams params, other_params; + GstBufferPool *pool = NULL, *other_pool = NULL; + GstCaps *caps = NULL; + GstStructure *config; + GstVideoInfo info; + guint min, max, size = 0, usage_hint = VA_SURFACE_ATTRIB_USAGE_HINT_VPP_WRITE; + gboolean update_pool, update_allocator, has_videometa, copy_frames; + gboolean dont_use_other_pool = FALSE; + + gst_query_parse_allocation (query, &caps, NULL); + + gst_allocation_params_init (&other_params); + gst_allocation_params_init (¶ms); + + if (!gst_video_info_from_caps (&info, caps)) { + GST_ERROR_OBJECT (self, "Cannot parse caps %" GST_PTR_FORMAT, caps); + return FALSE; + } + + if (gst_query_get_n_allocation_params (query) > 0) { + GstVaDisplay *display; + + gst_query_parse_nth_allocation_param (query, 0, &allocator, &other_params); + display = gst_va_allocator_peek_display (allocator); + if (!display) { + /* save the allocator for the other pool */ + other_allocator = allocator; + allocator = NULL; + } else if (display != self->display) { + /* The allocator and pool belong to other display, we should not use. */ + gst_clear_object (&allocator); + dont_use_other_pool = TRUE; + } + + update_allocator = TRUE; + } else { + update_allocator = FALSE; + } + + if (gst_query_get_n_allocation_pools (query) > 0) { + gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); + + if (pool) { + if (!GST_IS_VA_POOL (pool)) { + GST_DEBUG_OBJECT (self, + "may need other pool for copy frames %" GST_PTR_FORMAT, pool); + other_pool = pool; + pool = NULL; + } else if (dont_use_other_pool) { + gst_clear_object (&pool); + } + } + + update_pool = TRUE; + } else { + size = GST_VIDEO_INFO_SIZE (&info); + min = 1; + max = 0; + update_pool = FALSE; + } + + if (!allocator) { + if (gst_caps_is_dmabuf (caps) && GST_VIDEO_INFO_IS_RGB (&info)) + usage_hint = VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC; + if (!(allocator = gst_va_compositor_allocator_from_caps (self, caps))) + return FALSE; + } + + if (!pool) + pool = gst_va_pool_new (); + + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_set_allocator (config, allocator, ¶ms); + gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); + gst_buffer_pool_config_set_params (config, caps, size, min, max); + gst_buffer_pool_config_set_va_allocation_params (config, usage_hint, + GST_VA_FEATURE_AUTO); + if (!gst_buffer_pool_set_config (pool, config)) { + gst_object_unref (allocator); + gst_object_unref (pool); + return FALSE; + } + + if (GST_IS_VA_DMABUF_ALLOCATOR (allocator)) { + gst_va_dmabuf_allocator_get_format (allocator, &vagg->info, NULL); + } else if (GST_IS_VA_ALLOCATOR (allocator)) { + gst_va_allocator_get_format (allocator, &vagg->info, NULL, NULL); + } + + if (update_allocator) + gst_query_set_nth_allocation_param (query, 0, allocator, ¶ms); + else + gst_query_add_allocation_param (query, allocator, ¶ms); + + if (update_pool) + gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); + else + gst_query_add_allocation_pool (query, pool, size, min, max); + + has_videometa = gst_query_find_allocation_meta (query, + GST_VIDEO_META_API_TYPE, NULL); + + copy_frames = (!has_videometa && gst_va_pool_requires_video_meta (pool) + && gst_caps_is_raw (caps)); + if (copy_frames) { + if (other_pool) { + gst_object_replace ((GstObject **) & self->other_pool, + (GstObject *) other_pool); + } else { + self->other_pool = + _create_other_pool (other_allocator, &other_params, caps, size); + } + GST_DEBUG_OBJECT (self, "Use the other pool for copy %" GST_PTR_FORMAT, + self->other_pool); + } else { + gst_clear_object (&self->other_pool); + } + + GST_DEBUG_OBJECT (self, + "decided pool %" GST_PTR_FORMAT " with allocator %" GST_PTR_FORMAT, + pool, allocator); + + gst_object_unref (allocator); + gst_object_unref (pool); + gst_clear_object (&other_allocator); + gst_clear_object (&other_pool); + + return TRUE; +} + +static GstBufferPool * +_get_sinkpad_pool (GstVaCompositor * self, GstVaCompositorPad * pad) +{ + GstAllocator *allocator; + GstAllocationParams params = { 0, }; + GstCaps *caps; + GstVideoInfo info; + guint size, usage_hint = VA_SURFACE_ATTRIB_USAGE_HINT_VPP_READ; + + if (pad->pool) + return pad->pool; + + gst_allocation_params_init (¶ms); + + caps = gst_pad_get_current_caps (GST_PAD (pad)); + if (!caps) + return NULL; + if (!gst_video_info_from_caps (&info, caps)) { + GST_ERROR_OBJECT (self, "Cannot parse caps %" GST_PTR_FORMAT, caps); + gst_caps_unref (caps); + return NULL; + } + + size = GST_VIDEO_INFO_SIZE (&info); + + allocator = gst_va_compositor_allocator_from_caps (self, caps); + pad->pool = gst_va_pool_new_with_config (caps, size, 1, 0, usage_hint, + GST_VA_FEATURE_AUTO, allocator, ¶ms); + gst_caps_unref (caps); + + if (!pad->pool) { + gst_object_unref (allocator); + return NULL; + } + + if (GST_IS_VA_DMABUF_ALLOCATOR (allocator)) { + gst_va_dmabuf_allocator_get_format (allocator, &info, NULL); + } else if (GST_IS_VA_ALLOCATOR (allocator)) { + gst_va_allocator_get_format (allocator, &info, NULL, NULL); + } + + gst_object_unref (allocator); + + if (!gst_buffer_pool_set_active (pad->pool, TRUE)) { + GST_WARNING_OBJECT (self, "failed to active the sinkpad pool %" + GST_PTR_FORMAT, pad->pool); + return NULL; + } + + return pad->pool; +} + +static inline gsize +_get_plane_data_size (GstVideoInfo * info, guint plane) +{ + gint compGST_VIDEO_MAX_COMPONENTS; + gint height, padded_height; + + gst_video_format_info_component (info->finfo, plane, comp); + + height = GST_VIDEO_INFO_HEIGHT (info); + padded_height = + GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (info->finfo, comp0, height); + + return GST_VIDEO_INFO_PLANE_STRIDE (info, plane) * padded_height; +} + +static gboolean +_try_import_dmabuf_unlocked (GstVaCompositor * self, GstVideoInfo * info, + GstBuffer * inbuf) +{ + GstVideoMeta *meta; + GstMemory *memsGST_VIDEO_MAX_PLANES; + guint i, n_mem, n_planes; + gsize offsetGST_VIDEO_MAX_PLANES; + uintptr_t fdGST_VIDEO_MAX_PLANES; + + n_planes = GST_VIDEO_INFO_N_PLANES (info); + n_mem = gst_buffer_n_memory (inbuf); + meta = gst_buffer_get_video_meta (inbuf); + + /* This will eliminate most non-dmabuf out there */ + if (!gst_is_dmabuf_memory (gst_buffer_peek_memory (inbuf, 0))) + return FALSE; + + /* We cannot have multiple dmabuf per plane */ + if (n_mem > n_planes) + return FALSE; + + /* Update video info based on video meta */ + if (meta) { + GST_VIDEO_INFO_WIDTH (info) = meta->width; + GST_VIDEO_INFO_HEIGHT (info) = meta->height; + + for (i = 0; i < meta->n_planes; i++) { + GST_VIDEO_INFO_PLANE_OFFSET (info, i) = meta->offseti; + GST_VIDEO_INFO_PLANE_STRIDE (info, i) = meta->stridei; + } + } + + /* Find and validate all memories */ + for (i = 0; i < n_planes; i++) { + guint plane_size; + guint length; + guint mem_idx; + gsize mem_skip; + + plane_size = _get_plane_data_size (info, i); + + if (!gst_buffer_find_memory (inbuf, info->offseti, plane_size, + &mem_idx, &length, &mem_skip)) + return FALSE; + + /* We can't have more then one dmabuf per plane */ + if (length != 1) + return FALSE; + + memsi = gst_buffer_peek_memory (inbuf, mem_idx); + + /* And all memory found must be dmabuf */ + if (!gst_is_dmabuf_memory (memsi)) + return FALSE; + + offseti = memsi->offset + mem_skip; + fdi = gst_dmabuf_memory_get_fd (memsi); + } + + /* Now create a VASurfaceID for the buffer */ + return gst_va_dmabuf_memories_setup (self->display, info, n_planes, + mems, fd, offset, VA_SURFACE_ATTRIB_USAGE_HINT_VPP_READ); +} + +extern GRecMutex GST_VA_SHARED_LOCK; + +static gboolean +_try_import_buffer (GstVaCompositor * self, GstVideoInfo * info, + GstBuffer * inbuf) +{ + VASurfaceID surface; + gboolean ret; + + surface = gst_va_buffer_get_surface (inbuf); + if (surface != VA_INVALID_ID && + (gst_va_buffer_peek_display (inbuf) == self->display)) + return TRUE; + + g_rec_mutex_lock (&GST_VA_SHARED_LOCK); + ret = _try_import_dmabuf_unlocked (self, info, inbuf); + g_rec_mutex_unlock (&GST_VA_SHARED_LOCK); + + return ret; +} + +static GstFlowReturn +gst_va_compositor_import_buffer (GstVaCompositor * self, + GstVaCompositorPad * pad, GstBuffer * inbuf, GstBuffer ** buf) +{ + GstBuffer *buffer = NULL; + GstBufferPool *pool; + GstFlowReturn ret; + GstCaps *caps; + GstVideoInfo info; + GstVideoFrame in_frame, out_frame; + gboolean imported, copied; + + caps = gst_pad_get_current_caps (GST_PAD (pad)); + if (!caps) + return GST_FLOW_ERROR; + if (!gst_video_info_from_caps (&info, caps)) { + GST_ERROR_OBJECT (self, "Cannot parse caps %" GST_PTR_FORMAT, caps); + gst_caps_unref (caps); + return GST_FLOW_ERROR; + } + gst_caps_unref (caps); + + imported = _try_import_buffer (self, &info, inbuf); + if (imported) { + *buf = gst_buffer_ref (inbuf); + return GST_FLOW_OK; + } + + GST_LOG_OBJECT (self, "copying input frame"); + + /* input buffer doesn't come from a vapool, thus it is required to + * have a pool, grab from it a new buffer and copy the input + * buffer to the new one */ + if (!(pool = _get_sinkpad_pool (self, pad))) + return GST_FLOW_ERROR; + + ret = gst_buffer_pool_acquire_buffer (pool, &buffer, NULL); + if (ret != GST_FLOW_OK) + return ret; + + if (!gst_video_frame_map (&in_frame, &info, inbuf, GST_MAP_READ)) + goto invalid_buffer; + + if (!gst_video_frame_map (&out_frame, &info, buffer, GST_MAP_WRITE)) { + gst_video_frame_unmap (&in_frame); + goto invalid_buffer; + } + + copied = gst_video_frame_copy (&out_frame, &in_frame); + + gst_video_frame_unmap (&out_frame); + gst_video_frame_unmap (&in_frame); + + if (!copied) + goto invalid_buffer; + + *buf = buffer; + + return GST_FLOW_OK; + +invalid_buffer: + { + GST_ELEMENT_WARNING (self, CORE, NOT_IMPLEMENTED, (NULL), + ("invalid video buffer received")); + if (buffer) + gst_buffer_unref (buffer); + return GST_FLOW_OK; + } +} + +typedef struct _GstVaCompositorSampleGenerator GstVaCompositorSampleGenerator; +struct _GstVaCompositorSampleGenerator +{ + GstVaCompositor *comp; + GList *current; + GstVaComposeSample sample; +}; + +static GstVaComposeSample * +gst_va_compositor_sample_next (gpointer data) +{ + GstVaCompositorSampleGenerator *generator; + GstVideoAggregatorPad *vaggpad; + GstVaCompositorPad *pad; + GstBuffer *inbuf; + GstBuffer *buf; + GstFlowReturn res; + GstVideoCropMeta *crop = NULL; + + generator = (GstVaCompositorSampleGenerator *) data; + + /* at the end of the generator? */ + while (generator->current) { + /* get the current sinkpad for processing */ + vaggpad = GST_VIDEO_AGGREGATOR_PAD (generator->current->data); + + /* increment to next sinkpad */ + generator->current = generator->current->next; + + /* reset sample */ + /* *INDENT-OFF* */ + generator->sample = (GstVaComposeSample) { 0, }; + /* *INDENT-ON* */ + + /* current sinkpad may not be queueing buffers yet (e.g. timestamp-offset) + * or it may have reached EOS */ + if (!gst_video_aggregator_pad_has_current_buffer (vaggpad)) + continue; + + inbuf = gst_video_aggregator_pad_get_current_buffer (vaggpad); + pad = GST_VA_COMPOSITOR_PAD (vaggpad); + + res = gst_va_compositor_import_buffer (generator->comp, pad, inbuf, &buf); + if (res != GST_FLOW_OK) + return &generator->sample; + + crop = gst_buffer_get_video_crop_meta (buf); + + GST_OBJECT_LOCK (vaggpad); + /* *INDENT-OFF* */ + generator->sample = (GstVaComposeSample) { + .buffer = buf, + .input_region = (VARectangle) { + .x = crop ? crop->x : 0, + .y = crop ? crop->y : 0, + .width = crop ? crop->width : GST_VIDEO_INFO_WIDTH (&vaggpad->info), + .height = crop ? crop->height : GST_VIDEO_INFO_HEIGHT (&vaggpad->info), + }, + .output_region = (VARectangle) { + .x = pad->xpos, + .y = pad->ypos, + .width = (pad->width == DEFAULT_PAD_WIDTH) + ? GST_VIDEO_INFO_WIDTH (&vaggpad->info) : pad->width, + .height = (pad->height == DEFAULT_PAD_HEIGHT) + ? GST_VIDEO_INFO_HEIGHT (&vaggpad->info) : pad->height, + }, + .alpha = pad->alpha, + }; + /* *INDENT-ON* */ + GST_OBJECT_UNLOCK (vaggpad); + + return &generator->sample; + } + + return NULL; +} + +static gboolean +gst_va_compositor_copy_output_buffer (GstVaCompositor * self, + GstBuffer * src_buf, GstBuffer * dst_buf) +{ + GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (self); + GstVideoFrame src_frame, dst_frame; + + GST_LOG_OBJECT (self, "copying output buffer"); + + if (!gst_video_frame_map (&src_frame, &vagg->info, src_buf, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "couldn't map source buffer"); + return FALSE; + } + + if (!gst_video_frame_map (&dst_frame, &self->other_info, dst_buf, + GST_MAP_WRITE)) { + GST_ERROR_OBJECT (self, "couldn't map output buffer"); + gst_video_frame_unmap (&src_frame); + return FALSE; + } + + if (!gst_video_frame_copy (&dst_frame, &src_frame)) { + GST_ERROR_OBJECT (self, "couldn't copy output buffer"); + gst_video_frame_unmap (&src_frame); + gst_video_frame_unmap (&dst_frame); + return FALSE; + } + + gst_video_frame_unmap (&src_frame); + gst_video_frame_unmap (&dst_frame); + + return TRUE; +} + +static GstFlowReturn +gst_va_compositor_aggregate_frames (GstVideoAggregator * vagg, + GstBuffer * outbuf) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (vagg); + GstVaCompositorSampleGenerator generator; + GstVaComposeTransaction tx; + GstBuffer *vabuffer; + gboolean need_copy = FALSE; + GstFlowReturn ret = GST_FLOW_OK; + + if (self->other_pool) { + /* create a va buffer for filter */ + ret = GST_VIDEO_AGGREGATOR_CLASS (parent_class)->create_output_buffer + (vagg, &vabuffer); + if (ret != GST_FLOW_OK) + return ret; + + need_copy = TRUE; + } else { + /* already a va buffer */ + vabuffer = gst_buffer_ref (outbuf); + } + + /* *INDENT-OFF* */ + generator = (GstVaCompositorSampleGenerator) { + .comp = self, + .current = GST_ELEMENT (self)->sinkpads, + }; + tx = (GstVaComposeTransaction) { + .next = gst_va_compositor_sample_next, + .output = vabuffer, + .user_data = (gpointer) &generator, + }; + /* *INDENT-ON* */ + + GST_OBJECT_LOCK (self); + + if (!gst_va_filter_set_scale_method (self->filter, self->scale_method)) + GST_WARNING_OBJECT (self, "couldn't set filter scale method"); + + if (!gst_va_filter_compose (self->filter, &tx)) { + GST_ERROR_OBJECT (self, "couldn't apply filter"); + ret = GST_FLOW_ERROR; + } + + GST_OBJECT_UNLOCK (self); + + if (ret != GST_FLOW_OK) + goto done; + + if (need_copy && !gst_va_compositor_copy_output_buffer (self, vabuffer, + outbuf)) { + GST_ERROR_OBJECT (self, "couldn't copy va buffer to output buffer"); + ret = GST_FLOW_ERROR; + } + +done: + gst_buffer_unref (vabuffer); + return ret; +} + +static GstFlowReturn +gst_va_compositor_create_output_buffer (GstVideoAggregator * vagg, + GstBuffer ** outbuf) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (vagg); + GstFlowReturn ret; + + *outbuf = NULL; + + if (!self->other_pool) + /* no copy necessary, so use a va buffer directly */ + return GST_VIDEO_AGGREGATOR_CLASS (parent_class)->create_output_buffer + (vagg, outbuf); + + /* use output buffers from downstream pool for copy */ + if (!gst_buffer_pool_is_active (self->other_pool) && + !gst_buffer_pool_set_active (self->other_pool, TRUE)) { + GST_ERROR_OBJECT (self, "failed to activate other pool %" + GST_PTR_FORMAT, self->other_pool); + return GST_FLOW_ERROR; + } + + /* acquire a buffer from downstream pool for copy */ + ret = gst_buffer_pool_acquire_buffer (self->other_pool, outbuf, NULL); + if (ret != GST_FLOW_OK || !*outbuf) { + GST_ERROR_OBJECT (self, "failed to acquire output buffer"); + return GST_FLOW_ERROR; + } + + return GST_FLOW_OK; +} + +static gboolean +gst_va_compositor_negotiated_src_caps (GstAggregator * agg, GstCaps * caps) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (agg); + + if (!gst_video_info_from_caps (&self->other_info, caps)) { + GST_ERROR_OBJECT (self, "invalid caps"); + return FALSE; + } + + if (self->other_pool) { + gst_buffer_pool_set_active (self->other_pool, FALSE); + gst_clear_object (&self->other_pool); + } + + return GST_AGGREGATOR_CLASS (parent_class)->negotiated_src_caps (agg, caps); +} + +static void +gst_va_compositor_pad_get_output_size (GstVaCompositorPad * pad, gint * width, + gint * height) +{ + GstVideoAggregatorPad *vaggpad = GST_VIDEO_AGGREGATOR_PAD (pad); + *width = (pad->width == DEFAULT_PAD_WIDTH) + ? GST_VIDEO_INFO_WIDTH (&vaggpad->info) : pad->width; + *height = (pad->height == DEFAULT_PAD_HEIGHT) + ? GST_VIDEO_INFO_HEIGHT (&vaggpad->info) : pad->height; + + *width += MAX (pad->xpos, 0); + *height += MAX (pad->ypos, 0); +} + +static GstCaps * +gst_va_compositor_fixate_src_caps (GstAggregator * agg, GstCaps * caps) +{ + GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg); + GList *l; + gint best_width = -1, best_height = -1; + gint best_fps_n = -1, best_fps_d = -1; + gdouble best_fps = 0.; + GstCaps *ret = NULL; + GstStructure *s; + + ret = gst_caps_make_writable (caps); + + GST_OBJECT_LOCK (vagg); + for (l = GST_ELEMENT (vagg)->sinkpads; l; l = l->next) { + GstVideoAggregatorPad *vaggpad = l->data; + GstVaCompositorPad *pad = GST_VA_COMPOSITOR_PAD (vaggpad); + gint this_width, this_height; + gint fps_n, fps_d; + gdouble cur_fps; + + fps_n = GST_VIDEO_INFO_FPS_N (&vaggpad->info); + fps_d = GST_VIDEO_INFO_FPS_D (&vaggpad->info); + + gst_va_compositor_pad_get_output_size (pad, &this_width, &this_height); + + if (best_width < this_width) + best_width = this_width; + if (best_height < this_height) + best_height = this_height; + + if (fps_d == 0) + cur_fps = 0.0; + else + gst_util_fraction_to_double (fps_n, fps_d, &cur_fps); + + if (best_fps < cur_fps) { + best_fps = cur_fps; + best_fps_n = fps_n; + best_fps_d = fps_d; + } + } + GST_OBJECT_UNLOCK (vagg); + + if (best_fps_n <= 0 || best_fps_d <= 0 || best_fps == 0.0) { + best_fps_n = 25; + best_fps_d = 1; + best_fps = 25.0; + } + + s = gst_caps_get_structure (ret, 0); + gst_structure_fixate_field_nearest_int (s, "width", best_width); + gst_structure_fixate_field_nearest_int (s, "height", best_height); + if (gst_structure_has_field (s, "framerate")) { + gst_structure_fixate_field_nearest_fraction (s, "framerate", best_fps_n, + best_fps_d); + } else { + gst_structure_set (s, "framerate", GST_TYPE_FRACTION, best_fps_n, + best_fps_d, NULL); + } + + return gst_caps_fixate (ret); +} + +/* *INDENT-OFF* */ +static const gchar *caps_str = + GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_VA, + "{ NV12, I420, YV12, YUY2, RGBA, BGRA, P010_10LE, ARGB, ABGR }") " ;" + GST_VIDEO_CAPS_MAKE ("{ VUYA, GRAY8, NV12, NV21, YUY2, UYVY, YV12, " + "I420, P010_10LE, RGBA, BGRA, ARGB, ABGR }"); +/* *INDENT-ON* */ + +static void +gst_va_compositor_class_init (gpointer g_class, gpointer class_data) +{ + GstCaps *doc_caps, *caps = NULL; + GstPadTemplate *sink_pad_templ, *src_pad_templ; + GObjectClass *object_class = G_OBJECT_CLASS (g_class); + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + GstAggregatorClass *agg_class = GST_AGGREGATOR_CLASS (g_class); + GstVideoAggregatorClass *vagg_class = GST_VIDEO_AGGREGATOR_CLASS (g_class); + GstVaCompositorClass *klass = GST_VA_COMPOSITOR_CLASS (g_class); + GstVaDisplay *display; + GstVaFilter *filter; + struct CData *cdata = class_data; + gchar *long_name; + + parent_class = g_type_class_peek_parent (g_class); + + klass->render_device_path = g_strdup (cdata->render_device_path); + + if (cdata->description) { + long_name = g_strdup_printf ("VA-API Video Compositor in %s", + cdata->description); + } else { + long_name = g_strdup ("VA-API Video Compositor"); + } + + display = gst_va_display_drm_new_from_path (klass->render_device_path); + filter = gst_va_filter_new (display); + + if (gst_va_filter_open (filter)) { + caps = gst_va_filter_get_caps (filter); + } else { + caps = gst_caps_from_string (caps_str); + } + + object_class->dispose = GST_DEBUG_FUNCPTR (gst_va_compositor_dispose); + object_class->get_property = + GST_DEBUG_FUNCPTR (gst_va_compositor_get_property); + object_class->set_property = + GST_DEBUG_FUNCPTR (gst_va_compositor_set_property); + + gst_element_class_set_static_metadata (element_class, long_name, + "Filter/Editor/Video/Compositor/Hardware", + "VA-API based video compositor", + "U. Artie Eoff <ullysses.a.eoff@intel.com>"); + + element_class->request_new_pad = + GST_DEBUG_FUNCPTR (gst_va_compositor_request_new_pad); + element_class->release_pad = + GST_DEBUG_FUNCPTR (gst_va_compositor_release_pad); + element_class->set_context = + GST_DEBUG_FUNCPTR (gst_va_compositor_set_context); + + doc_caps = gst_caps_from_string (caps_str); + + sink_pad_templ = gst_pad_template_new_with_gtype ("sink_%u", GST_PAD_SINK, + GST_PAD_REQUEST, caps, GST_TYPE_VA_COMPOSITOR_PAD); + gst_element_class_add_pad_template (element_class, sink_pad_templ); + gst_pad_template_set_documentation_caps (sink_pad_templ, + gst_caps_ref (doc_caps)); + gst_type_mark_as_plugin_api (GST_TYPE_VA_COMPOSITOR_PAD, 0); + + src_pad_templ = gst_pad_template_new_with_gtype ("src", GST_PAD_SRC, + GST_PAD_ALWAYS, caps, GST_TYPE_AGGREGATOR_PAD); + gst_element_class_add_pad_template (element_class, src_pad_templ); + gst_pad_template_set_documentation_caps (src_pad_templ, + gst_caps_ref (doc_caps)); + + gst_caps_unref (doc_caps); + gst_caps_unref (caps); + + agg_class->sink_query = GST_DEBUG_FUNCPTR (gst_va_compositor_sink_query); + agg_class->src_query = GST_DEBUG_FUNCPTR (gst_va_compositor_src_query); + agg_class->start = GST_DEBUG_FUNCPTR (gst_va_compositor_start); + agg_class->stop = GST_DEBUG_FUNCPTR (gst_va_compositor_stop); + agg_class->propose_allocation = + GST_DEBUG_FUNCPTR (gst_va_compositor_propose_allocation); + agg_class->fixate_src_caps = + GST_DEBUG_FUNCPTR (gst_va_compositor_fixate_src_caps); + agg_class->negotiated_src_caps = + GST_DEBUG_FUNCPTR (gst_va_compositor_negotiated_src_caps); + agg_class->decide_allocation = + GST_DEBUG_FUNCPTR (gst_va_compositor_decide_allocation); + + vagg_class->aggregate_frames = + GST_DEBUG_FUNCPTR (gst_va_compositor_aggregate_frames); + vagg_class->create_output_buffer = + GST_DEBUG_FUNCPTR (gst_va_compositor_create_output_buffer); + + /** + * GstVaCompositor:device-path: + * + * It shows the DRM device path used for the VA operation, if any. + */ + propertiesPROP_DEVICE_PATH = g_param_spec_string ("device-path", + "Device Path", "DRM device path", NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + /** + * GstVaCompositor:scale-method: + * + * Sets the scale method algorithm to use when resizing. + */ + propertiesPROP_SCALE_METHOD = g_param_spec_enum ("scale-method", + "Scale Method", "Scale method to use", GST_TYPE_VA_SCALE_METHOD, + VA_FILTER_SCALING_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + gst_type_mark_as_plugin_api (GST_TYPE_VA_SCALE_METHOD, 0); + + g_object_class_install_properties (object_class, N_PROPERTIES, properties); + + g_free (long_name); + g_free (cdata->description); + g_free (cdata->render_device_path); + g_free (cdata); + gst_object_unref (filter); + gst_object_unref (display); +} + +static GObject * +gst_va_compositor_child_proxy_get_child_by_index (GstChildProxy * proxy, + guint index) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (proxy); + GObject *obj = NULL; + + GST_OBJECT_LOCK (self); + obj = g_list_nth_data (GST_ELEMENT_CAST (self)->sinkpads, index); + if (obj) + gst_object_ref (obj); + GST_OBJECT_UNLOCK (self); + + return obj; +} + +static guint +gst_va_compositor_child_proxy_get_children_count (GstChildProxy * proxy) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (proxy); + guint count = 0; + + GST_OBJECT_LOCK (self); + count = GST_ELEMENT_CAST (self)->numsinkpads; + GST_OBJECT_UNLOCK (self); + GST_INFO_OBJECT (self, "Children Count: %d", count); + + return count; +} + +static void +gst_va_compositor_child_proxy_init (gpointer g_iface, gpointer iface_data) +{ + GstChildProxyInterface *iface = (GstChildProxyInterface *) g_iface; + + iface->get_child_by_index = gst_va_compositor_child_proxy_get_child_by_index; + iface->get_children_count = gst_va_compositor_child_proxy_get_children_count; +} + +static void +gst_va_compositor_init (GTypeInstance * instance, gpointer g_class) +{ + GstVaCompositor *self = GST_VA_COMPOSITOR (instance); + + self->other_pool = NULL; +} + +static gpointer +_register_debug_category (gpointer data) +{ + GST_DEBUG_CATEGORY_INIT (gst_va_compositor_debug, "vacompositor", 0, + "VA Video Compositor"); + + return NULL; +} + +gboolean +gst_va_compositor_register (GstPlugin * plugin, GstVaDevice * device, + guint rank) +{ + static GOnce debug_once = G_ONCE_INIT; + GType type; + GTypeInfo type_info = { + .class_size = sizeof (GstVaCompositorClass), + .class_init = gst_va_compositor_class_init, + .instance_size = sizeof (GstVaCompositor), + .instance_init = gst_va_compositor_init, + }; + GInterfaceInfo interface_info = { + (GInterfaceInitFunc) gst_va_compositor_child_proxy_init, + }; + struct CData *cdata; + gboolean ret; + gchar *type_name, *feature_name; + + g_return_val_if_fail (GST_IS_PLUGIN (plugin), FALSE); + g_return_val_if_fail (GST_IS_VA_DEVICE (device), FALSE); + + cdata = g_new (struct CData, 1); + cdata->description = NULL; + cdata->render_device_path = g_strdup (device->render_device_path); + + type_info.class_data = cdata; + + type_name = g_strdup ("GstVaCompositor"); + feature_name = g_strdup ("vacompositor"); + + /* The first compositor to be registered should use a constant + * name, like vacompositor, for any additional compositors, we + * create unique names, using the render device name. */ + if (g_type_from_name (type_name)) { + gchar *basename = g_path_get_basename (device->render_device_path); + g_free (type_name); + g_free (feature_name); + type_name = g_strdup_printf ("GstVa%sCompositor", basename); + feature_name = g_strdup_printf ("va%scompositor", basename); + cdata->description = basename; + + /* lower rank for non-first device */ + if (rank > 0) + rank--; + } + + g_once (&debug_once, _register_debug_category, NULL); + + type = g_type_register_static (GST_TYPE_VIDEO_AGGREGATOR, type_name, + &type_info, 0); + g_type_add_interface_static (type, GST_TYPE_CHILD_PROXY, &interface_info); + + ret = gst_element_register (plugin, feature_name, rank, type); + + g_free (type_name); + g_free (feature_name); + + return ret; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvacompositor.h
Added
@@ -0,0 +1,36 @@ +/* GStreamer + * Copyright (C) 2022 Intel Corporation + * Author: U. Artie Eoff <ullysses.a.eoff@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the0 + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "gstvadevice.h" +#include <gst/video/gstvideoaggregator.h> + +G_BEGIN_DECLS + +#define GST_TYPE_VA_COMPOSITOR_PAD (gst_va_compositor_pad_get_type()) +G_DECLARE_FINAL_TYPE (GstVaCompositorPad, gst_va_compositor_pad, + GST, VA_COMPOSITOR_PAD, GstVideoAggregatorPad) + +gboolean gst_va_compositor_register (GstPlugin * plugin, + GstVaDevice * device, + guint rank); + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvadecoder.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvadecoder.c
Changed
@@ -24,11 +24,12 @@ #include "gstvadecoder.h" -#include "gstvaallocator.h" +#include <gst/va/gstva.h> +#include <gst/va/gstvavideoformat.h> + #include "gstvacaps.h" #include "gstvadisplay_priv.h" -#include "gstvavideoformat.h" -#include <gst/va/gstvadisplay_wrapped.h> +#include "gstvaprofile.h" struct _GstVaDecoder { @@ -138,7 +139,7 @@ gobject_class->dispose = gst_va_decoder_dispose; g_propertiesPROP_DISPLAY = - g_param_spec_object ("display", "GstVaDisplay", "GstVADisplay object", + g_param_spec_object ("display", "GstVaDisplay", "GstVaDisplay object", GST_TYPE_VA_DISPLAY, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); @@ -148,7 +149,7 @@ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); g_propertiesPROP_CHROMA = - g_param_spec_uint ("va-rt-format", "VARTFormat", "VA RT Fromat or chroma", + g_param_spec_uint ("va-rt-format", "VARTFormat", "VA RT Format", VA_RT_FORMAT_YUV420, VA_RT_FORMAT_PROTECTED, VA_RT_FORMAT_YUV420, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); @@ -232,14 +233,13 @@ return TRUE; if (!gst_va_decoder_has_profile (self, profile)) { - GST_ERROR_OBJECT (self, "Unsupported profile: %d", profile); + GST_ERROR_OBJECT (self, "Unsupported profile: %s", + gst_va_profile_name (profile)); return FALSE; } dpy = gst_va_display_get_va_dpy (self->display); - gst_va_display_lock (self->display); status = vaCreateConfig (dpy, profile, VAEntrypointVLD, &attrib, 1, &config); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaCreateConfig: %s", vaErrorStr (status)); return FALSE; @@ -271,16 +271,12 @@ dpy = gst_va_display_get_va_dpy (self->display); if (self->context != VA_INVALID_ID) { - gst_va_display_lock (self->display); status = vaDestroyContext (dpy, self->context); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) GST_ERROR_OBJECT (self, "vaDestroyContext: %s", vaErrorStr (status)); } - gst_va_display_lock (self->display); status = vaDestroyConfig (dpy, self->config); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaDestroyConfig: %s", vaErrorStr (status)); return FALSE; @@ -328,10 +324,8 @@ dpy = gst_va_display_get_va_dpy (self->display); - gst_va_display_lock (self->display); status = vaCreateContext (dpy, self->config, coded_width, coded_height, VA_PROGRESSIVE, render_targets, num_render_targets, &context); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaDestroyConfig: %s", vaErrorStr (status)); @@ -422,6 +416,10 @@ if (gst_va_decoder_is_open (self)) { srcpad_caps = gst_va_create_raw_caps_from_config (self->display, self->config); + if (!srcpad_caps) { + GST_WARNING_OBJECT (self, "Invalid configuration caps"); + return NULL; + } gst_caps_replace (&self->srcpad_caps, srcpad_caps); gst_caps_unref (srcpad_caps); @@ -554,9 +552,7 @@ g_return_val_if_fail (pic && data && size > 0, FALSE); dpy = gst_va_display_get_va_dpy (self->display); - gst_va_display_lock (self->display); status = vaCreateBuffer (dpy, self->context, type, size, 1, data, &buffer); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaCreateBuffer: %s", vaErrorStr (status)); return FALSE; @@ -581,19 +577,15 @@ && params_data && params_size > 0, FALSE); dpy = gst_va_display_get_va_dpy (self->display); - gst_va_display_lock (self->display); status = vaCreateBuffer (dpy, self->context, VASliceParameterBufferType, params_size, params_num, params_data, ¶ms_buffer); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaCreateBuffer: %s", vaErrorStr (status)); return FALSE; } - gst_va_display_lock (self->display); status = vaCreateBuffer (dpy, self->context, VASliceDataBufferType, slice_size, 1, slice_data, &slice_buffer); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaCreateBuffer: %s", vaErrorStr (status)); return FALSE; @@ -641,19 +633,15 @@ dpy = gst_va_display_get_va_dpy (self->display); - gst_va_display_lock (self->display); status = vaBeginPicture (dpy, self->context, surface); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_WARNING_OBJECT (self, "vaBeginPicture: %s", vaErrorStr (status)); goto fail_end_pic; } if (pic->buffers->len > 0) { - gst_va_display_lock (self->display); status = vaRenderPicture (dpy, self->context, (VABufferID *) pic->buffers->data, pic->buffers->len); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_WARNING_OBJECT (self, "vaRenderPicture: %s", vaErrorStr (status)); goto fail_end_pic; @@ -661,19 +649,15 @@ } if (pic->slices->len > 0) { - gst_va_display_lock (self->display); status = vaRenderPicture (dpy, self->context, (VABufferID *) pic->slices->data, pic->slices->len); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_WARNING_OBJECT (self, "vaRenderPicture: %s", vaErrorStr (status)); goto fail_end_pic; } } - gst_va_display_lock (self->display); status = vaEndPicture (dpy, self->context); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) GST_WARNING_OBJECT (self, "vaEndPicture: %s", vaErrorStr (status)); else @@ -686,9 +670,7 @@ fail_end_pic: { - gst_va_display_lock (self->display); status = vaEndPicture (dpy, self->context); - gst_va_display_unlock (self->display); goto bail; } } @@ -756,9 +738,7 @@ if (pic->buffers) { for (i = 0; i < pic->buffers->len; i++) { buffer = g_array_index (pic->buffers, VABufferID, i); - gst_va_display_lock (pic->display); status = vaDestroyBuffer (dpy, buffer); - gst_va_display_unlock (pic->display); if (status != VA_STATUS_SUCCESS) { ret = FALSE; GST_WARNING ("Failed to destroy parameter buffer: %s", @@ -772,9 +752,7 @@ if (pic->slices) { for (i = 0; i < pic->slices->len; i++) { buffer = g_array_index (pic->slices, VABufferID, i); - gst_va_display_lock (pic->display); status = vaDestroyBuffer (dpy, buffer); - gst_va_display_unlock (pic->display); if (status != VA_STATUS_SUCCESS) { ret = FALSE; GST_WARNING ("Failed to destroy slice buffer: %s", vaErrorStr (status));
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvadecoder.h -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvadecoder.h
Changed
@@ -20,7 +20,7 @@ #pragma once -#include <gst/va/gstvadisplay.h> +#include <gst/va/gstva.h> #include <va/va.h> G_BEGIN_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvadeinterlace.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvadeinterlace.c
Changed
@@ -51,17 +51,14 @@ #include "gstvadeinterlace.h" +#include <gst/va/gstva.h> #include <gst/video/video.h> - #include <va/va_drmcommon.h> -#include "gstvaallocator.h" #include "gstvabasetransform.h" #include "gstvacaps.h" #include "gstvadisplay_priv.h" #include "gstvafilter.h" -#include "gstvapool.h" -#include "gstvautils.h" GST_DEBUG_CATEGORY_STATIC (gst_va_deinterlace_debug); #define GST_CAT_DEFAULT gst_va_deinterlace_debug @@ -428,6 +425,7 @@ if (!gst_va_filter_process (btrans->filter, &src, &dst)) { gst_buffer_set_flags (outbuf, GST_BUFFER_FLAG_CORRUPTED); + res = GST_BASE_TRANSFORM_FLOW_DROPPED; } return res; @@ -648,15 +646,13 @@ { GstVaDeinterlace *self = GST_VA_DEINTERLACE (trans); - if (direction == GST_PAD_SRC && GST_QUERY_TYPE (query) == GST_QUERY_LATENCY) { + if (direction == GST_PAD_SRC && GST_QUERY_TYPE (query) == GST_QUERY_LATENCY + && !gst_base_transform_is_passthrough (trans)) { GstPad *peer; GstClockTime latency, min, max; gboolean res = FALSE; gboolean live; - if (gst_base_transform_is_passthrough (trans)) - return FALSE; - peer = gst_pad_get_peer (GST_BASE_TRANSFORM_SINK_PAD (trans)); if (!peer) return FALSE;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvadevice.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvadevice.c
Changed
@@ -42,7 +42,8 @@ } static GstVaDevice * -gst_va_device_new (GstVaDisplay * display, const gchar * render_device_path) +gst_va_device_new (GstVaDisplay * display, const gchar * render_device_path, + gint index) { GstVaDevice *device = g_new0 (GstVaDevice, 1); @@ -52,6 +53,7 @@ /* take ownership */ device->display = display; device->render_device_path = g_strdup (render_device_path); + device->index = index; return device; } @@ -61,7 +63,7 @@ { const GstVaDevice *pa = a, *pb = b; - return strcmp (pa->render_device_path, pb->render_device_path); + return g_strcmp0 (pa->render_device_path, pb->render_device_path); } #if HAVE_GUDEV @@ -71,6 +73,7 @@ GUdevClient *client; GList *udev_devices, *dev; GQueue devices = G_QUEUE_INIT; + gint i = 0; client = g_udev_client_new (NULL); udev_devices = g_udev_client_query_by_subsystem (client, "drm"); @@ -90,7 +93,7 @@ continue; GST_INFO ("Found VA-API device: %s", path); - g_queue_push_head (&devices, gst_va_device_new (dpy, path)); + g_queue_push_head (&devices, gst_va_device_new (dpy, path, i++)); } g_queue_sort (&devices, compare_device_path, NULL); @@ -106,7 +109,7 @@ GstVaDisplay *dpy; GQueue devices = G_QUEUE_INIT; gchar path64; - guint i; + guint i, j = 0; for (i = 0; i < 8; i++) { g_snprintf (path, sizeof (path), "/dev/dri/renderD%d", 128 + i); @@ -117,7 +120,7 @@ continue; GST_INFO ("Found VA-API device: %s", path); - g_queue_push_head (&devices, gst_va_device_new (dpy, path)); + g_queue_push_head (&devices, gst_va_device_new (dpy, path, j++)); } g_queue_sort (&devices, compare_device_path, NULL);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvadevice.h -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvadevice.h
Changed
@@ -24,7 +24,7 @@ G_BEGIN_DECLS -#include <gst/va/gstvadisplay_drm.h> +#include <gst/va/gstva.h> #define GST_TYPE_VA_DEVICE (gst_va_device_get_type()) #define GST_IS_VA_DEVICE(obj) (GST_IS_MINI_OBJECT_TYPE((obj), GST_TYPE_VA_DEVICE)) @@ -36,6 +36,7 @@ GstVaDisplay *display; gchar *render_device_path; + gint index; } GstVaDevice; GType gst_va_device_get_type (void);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvadisplay_priv.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvadisplay_priv.c
Changed
@@ -23,8 +23,10 @@ #endif #include "gstvadisplay_priv.h" + +#include <gst/va/gstvavideoformat.h> + #include "gstvaprofile.h" -#include "gstvavideoformat.h" GArray * gst_va_display_get_profiles (GstVaDisplay * self, guint32 codec, @@ -41,17 +43,13 @@ dpy = gst_va_display_get_va_dpy (self); - gst_va_display_lock (self); num_profiles = vaMaxNumProfiles (dpy); num_entrypoints = vaMaxNumEntrypoints (dpy); - gst_va_display_unlock (self); profiles = g_new (VAProfile, num_profiles); entrypoints = g_new (VAEntrypoint, num_entrypoints); - gst_va_display_lock (self); status = vaQueryConfigProfiles (dpy, profiles, &num_profiles); - gst_va_display_unlock (self); if (status != VA_STATUS_SUCCESS) { GST_ERROR ("vaQueryConfigProfile: %s", vaErrorStr (status)); goto bail; @@ -61,10 +59,8 @@ if (codec != gst_va_profile_codec (profilesi)) continue; - gst_va_display_lock (self); status = vaQueryConfigEntrypoints (dpy, profilesi, entrypoints, &num_entrypoints); - gst_va_display_unlock (self); if (status != VA_STATUS_SUCCESS) { GST_ERROR ("vaQueryConfigEntrypoints: %s", vaErrorStr (status)); goto bail; @@ -100,17 +96,13 @@ dpy = gst_va_display_get_va_dpy (self); - gst_va_display_lock (self); max = vaMaxNumImageFormats (dpy); - gst_va_display_unlock (self); if (max == 0) return NULL; va_formats = g_new (VAImageFormat, max); - gst_va_display_lock (self); status = vaQueryImageFormats (dpy, va_formats, &num); - gst_va_display_unlock (self); gst_va_video_format_fix_map (va_formats, num); @@ -148,15 +140,11 @@ dpy = gst_va_display_get_va_dpy (self); - gst_va_display_lock (self); max = vaMaxNumEntrypoints (dpy); - gst_va_display_unlock (self); entrypoints = g_new (VAEntrypoint, max); - gst_va_display_lock (self); status = vaQueryConfigEntrypoints (dpy, VAProfileNone, entrypoints, &num); - gst_va_display_unlock (self); if (status != VA_STATUS_SUCCESS) { GST_ERROR ("vaQueryImageFormats: %s", vaErrorStr (status)); goto bail;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvadisplay_priv.h -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvadisplay_priv.h
Changed
@@ -20,7 +20,7 @@ #pragma once -#include <gst/va/gstvadisplay.h> +#include <gst/va/gstva.h> #include <va/va.h> G_BEGIN_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvaencoder.c
Added
@@ -0,0 +1,1306 @@ +/* GStreamer + * Copyright (C) 2021 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstvaencoder.h" + +#include <gst/va/gstvavideoformat.h> + +#include "gstvacaps.h" +#include "gstvaprofile.h" +#include "gstvadisplay_priv.h" +#include "vacompat.h" + +struct _GstVaEncoder +{ + GstObject parent; + + GArray *available_profiles; + GstCaps *srcpad_caps; + GstCaps *sinkpad_caps; + GstVaDisplay *display; + VAConfigID config; + VAContextID context; + VAProfile profile; + VAEntrypoint entrypoint; + guint rt_format; + gint coded_width; + gint coded_height; + gint codedbuf_size; + + GstBufferPool *recon_pool; +}; + +GST_DEBUG_CATEGORY_STATIC (gst_va_encoder_debug); +#define GST_CAT_DEFAULT gst_va_encoder_debug + +#define gst_va_encoder_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstVaEncoder, gst_va_encoder, GST_TYPE_OBJECT, + GST_DEBUG_CATEGORY_INIT (gst_va_encoder_debug, "vaencoder", 0, + "VA Encoder")); + +enum +{ + PROP_DISPLAY = 1, + PROP_PROFILE, + PROP_ENTRYPOINT, + PROP_WIDTH, + PROP_HEIGHT, + PROP_CHROMA, + PROP_CODED_BUF_SIZE, + N_PROPERTIES +}; + +static GParamSpec *g_propertiesN_PROPERTIES; + +static gboolean +_destroy_buffer (GstVaDisplay * display, VABufferID buffer) +{ + VAStatus status; + gboolean ret = TRUE; + VADisplay dpy = gst_va_display_get_va_dpy (display); + + status = vaDestroyBuffer (dpy, buffer); + if (status != VA_STATUS_SUCCESS) { + ret = FALSE; + GST_WARNING ("Failed to destroy the buffer: %s", vaErrorStr (status)); + } + + return ret; +} + +static VABufferID +_create_buffer (GstVaEncoder * self, gint type, gpointer data, gsize size) +{ + VAStatus status; + VADisplay dpy = gst_va_display_get_va_dpy (self->display); + VABufferID buffer; + VAContextID context; + + GST_OBJECT_LOCK (self); + context = self->context; + GST_OBJECT_UNLOCK (self); + + dpy = gst_va_display_get_va_dpy (self->display); + status = vaCreateBuffer (dpy, context, type, size, 1, data, &buffer); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR_OBJECT (self, "vaCreateBuffer: %s", vaErrorStr (status)); + return VA_INVALID_ID; + } + + return buffer; +} + +static void +gst_va_encoder_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVaEncoder *self = GST_VA_ENCODER (object); + + GST_OBJECT_LOCK (self); + + switch (prop_id) { + case PROP_DISPLAY:{ + g_assert (!self->display); + self->display = g_value_dup_object (value); + break; + } + case PROP_ENTRYPOINT:{ + self->entrypoint = g_value_get_int (value); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (self); +} + +static void +gst_va_encoder_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstVaEncoder *self = GST_VA_ENCODER (object); + + GST_OBJECT_LOCK (self); + + switch (prop_id) { + case PROP_DISPLAY: + g_value_set_object (value, self->display); + break; + case PROP_PROFILE: + g_value_set_int (value, self->profile); + break; + case PROP_ENTRYPOINT: + g_value_set_int (value, self->entrypoint); + break; + case PROP_CHROMA: + g_value_set_uint (value, self->rt_format); + break; + case PROP_WIDTH: + g_value_set_int (value, self->coded_width); + break; + case PROP_HEIGHT: + g_value_set_int (value, self->coded_height); + break; + case PROP_CODED_BUF_SIZE: + g_value_set_int (value, self->codedbuf_size); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + GST_OBJECT_UNLOCK (self); +} + +static void +gst_va_encoder_init (GstVaEncoder * self) +{ + self->profile = VAProfileNone; + self->config = VA_INVALID_ID; +} + +static void +gst_va_encoder_reset (GstVaEncoder * self) +{ + self->profile = VAProfileNone; + self->config = VA_INVALID_ID; + self->context = VA_INVALID_ID; + self->rt_format = 0; + self->coded_width = 0; + self->coded_height = 0; + self->codedbuf_size = 0; +} + +static inline gboolean +_is_open_unlocked (GstVaEncoder * self) +{ + return (self->config != VA_INVALID_ID && self->profile != VAProfileNone); +} + +gboolean +gst_va_encoder_is_open (GstVaEncoder * self) +{ + gboolean ret; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE); + + GST_OBJECT_LOCK (self); + ret = _is_open_unlocked (self); + GST_OBJECT_UNLOCK (self); + return ret; +} + +gboolean +gst_va_encoder_close (GstVaEncoder * self) +{ + VADisplay dpy; + VAStatus status; + VAConfigID config = VA_INVALID_ID; + VAContextID context = VA_INVALID_ID; + GstBufferPool *recon_pool = NULL; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE); + + GST_OBJECT_LOCK (self); + if (!_is_open_unlocked (self)) { + GST_OBJECT_UNLOCK (self); + return TRUE; + } + + config = self->config; + context = self->context; + + recon_pool = self->recon_pool; + self->recon_pool = NULL; + + gst_va_encoder_reset (self); + GST_OBJECT_UNLOCK (self); + + gst_buffer_pool_set_active (recon_pool, FALSE); + g_clear_pointer (&recon_pool, gst_object_unref); + + dpy = gst_va_display_get_va_dpy (self->display); + + if (context != VA_INVALID_ID) { + status = vaDestroyContext (dpy, context); + if (status != VA_STATUS_SUCCESS) + GST_ERROR_OBJECT (self, "vaDestroyContext: %s", vaErrorStr (status)); + } + + status = vaDestroyConfig (dpy, config); + if (status != VA_STATUS_SUCCESS) + GST_ERROR_OBJECT (self, "vaDestroyConfig: %s", vaErrorStr (status)); + + gst_caps_replace (&self->srcpad_caps, NULL); + gst_caps_replace (&self->sinkpad_caps, NULL); + + return TRUE; +} + +static GArray * +_get_surface_formats (GstVaDisplay * display, VAConfigID config) +{ + GArray *formats; + GstVideoFormat format; + VASurfaceAttrib *attribs; + guint i, attrib_count; + + attribs = gst_va_get_surface_attribs (display, config, &attrib_count); + if (!attribs) + return NULL; + + formats = g_array_new (FALSE, FALSE, sizeof (GstVideoFormat)); + + for (i = 0; i < attrib_count; i++) { + if (attribsi.value.type != VAGenericValueTypeInteger) + continue; + switch (attribsi.type) { + case VASurfaceAttribPixelFormat: + format = gst_va_video_format_from_va_fourcc (attribsi.value.value.i); + if (format != GST_VIDEO_FORMAT_UNKNOWN) + g_array_append_val (formats, format); + break; + default: + break; + } + } + + g_free (attribs); + + if (formats->len == 0) { + g_array_unref (formats); + return NULL; + } + + return formats; +} + +static GstBufferPool * +_create_reconstruct_pool (GstVaDisplay * display, GArray * surface_formats, + GstVideoFormat format, gint coded_width, gint coded_height, + guint max_buffers) +{ + GstAllocator *allocator = NULL; + guint usage_hint = VA_SURFACE_ATTRIB_USAGE_HINT_ENCODER; + GstVideoInfo info; + GstAllocationParams params = { 0, }; + GstBufferPool *pool; + guint size; + GstCaps *caps = NULL; + + gst_video_info_set_format (&info, format, coded_width, coded_height); + + size = GST_VIDEO_INFO_SIZE (&info); + + caps = gst_video_info_to_caps (&info); + gst_caps_set_features_simple (caps, + gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_VA)); + + allocator = gst_va_allocator_new (display, surface_formats); + + gst_allocation_params_init (¶ms); + + pool = gst_va_pool_new_with_config (caps, size, 0, max_buffers, usage_hint, + GST_VA_FEATURE_AUTO, allocator, ¶ms); + + gst_clear_object (&allocator); + gst_clear_caps (&caps); + + return pool; +} + +gboolean +gst_va_encoder_open (GstVaEncoder * self, VAProfile profile, + GstVideoFormat video_format, guint rt_format, gint coded_width, + gint coded_height, gint codedbuf_size, guint max_reconstruct_surfaces, + guint rc_ctrl, guint32 packed_headers) +{ + /* *INDENT-OFF* */ + VAConfigAttrib attribs3 = { + { .type = VAConfigAttribRTFormat, .value = rt_format, }, + }; + /* *INDENT-ON* */ + VAConfigID config = VA_INVALID_ID; + VAContextID context = VA_INVALID_ID; + VADisplay dpy; + GArray *surface_formats = NULL; + VAStatus status; + GstBufferPool *recon_pool = NULL; + guint attrib_idx = 1; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE); + g_return_val_if_fail (codedbuf_size > 0, FALSE); + + if (gst_va_encoder_is_open (self)) + return TRUE; + + if (!gst_va_encoder_has_profile (self, profile)) { + GST_ERROR_OBJECT (self, "Unsupported profile: %s, entrypoint: %d", + gst_va_profile_name (profile), self->entrypoint); + return FALSE; + } + + if (rc_ctrl != VA_RC_NONE) { + attribsattrib_idx.type = VAConfigAttribRateControl; + attribsattrib_idx.value = rc_ctrl; + attrib_idx++; + } + + if (packed_headers > 0) { + attribsattrib_idx.type = VAConfigAttribEncPackedHeaders; + attribsattrib_idx.value = packed_headers; + attrib_idx++; + } + + dpy = gst_va_display_get_va_dpy (self->display); + + status = vaCreateConfig (dpy, profile, self->entrypoint, attribs, attrib_idx, + &config); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR_OBJECT (self, "vaCreateConfig: %s", vaErrorStr (status)); + goto error; + } + + surface_formats = _get_surface_formats (self->display, config); + if (!surface_formats) { + GST_ERROR_OBJECT (self, "Failed to get surface formats"); + goto error; + } + + recon_pool = _create_reconstruct_pool (self->display, surface_formats, + video_format, coded_width, coded_height, max_reconstruct_surfaces); + if (!recon_pool) { + GST_ERROR_OBJECT (self, "Failed to create reconstruct pool"); + goto error; + } + gst_buffer_pool_set_active (recon_pool, TRUE); + + status = vaCreateContext (dpy, config, coded_width, coded_height, + VA_PROGRESSIVE, NULL, 0, &context); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR_OBJECT (self, "vaCreateConfig: %s", vaErrorStr (status)); + goto error; + } + + GST_OBJECT_LOCK (self); + + self->config = config; + self->context = context; + self->profile = profile; + self->rt_format = rt_format; + self->coded_width = coded_width; + self->coded_height = coded_height; + self->codedbuf_size = codedbuf_size; + gst_object_replace ((GstObject **) & self->recon_pool, + (GstObject *) recon_pool); + + GST_OBJECT_UNLOCK (self); + + g_clear_pointer (&recon_pool, gst_object_unref); + /* now we should return now only this profile's caps */ + gst_caps_replace (&self->srcpad_caps, NULL); + + return TRUE; + +error: + g_clear_pointer (&recon_pool, gst_object_unref); + + if (config != VA_INVALID_ID) + vaDestroyConfig (dpy, config); + + if (context != VA_INVALID_ID) + vaDestroyContext (dpy, context); + + return FALSE; +} + +static void +gst_va_encoder_dispose (GObject * object) +{ + GstVaEncoder *self = GST_VA_ENCODER (object); + + gst_va_encoder_close (self); + + g_clear_pointer (&self->available_profiles, g_array_unref); + gst_clear_object (&self->display); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_va_encoder_class_init (GstVaEncoderClass * klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = gst_va_encoder_set_property; + gobject_class->get_property = gst_va_encoder_get_property; + gobject_class->dispose = gst_va_encoder_dispose; + + g_propertiesPROP_DISPLAY = + g_param_spec_object ("display", "GstVaDisplay", "GstVaDisplay object", + GST_TYPE_VA_DISPLAY, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + g_propertiesPROP_PROFILE = + g_param_spec_int ("va-profile", "VAProfile", "VA Profile", + VAProfileNone, 50, VAProfileNone, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_propertiesPROP_ENTRYPOINT = + g_param_spec_int ("va-entrypoint", "VAEntrypoint", "VA Entrypoint", + 0, 14, 0, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + g_propertiesPROP_CHROMA = + g_param_spec_uint ("va-rt-format", "VARTFormat", "VA RT Format", + VA_RT_FORMAT_YUV420, VA_RT_FORMAT_PROTECTED, VA_RT_FORMAT_YUV420, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_propertiesPROP_WIDTH = + g_param_spec_int ("coded-width", "coded-picture-width", + "coded picture width", 0, G_MAXINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_propertiesPROP_HEIGHT = + g_param_spec_int ("coded-height", "coded-picture-height", + "coded picture height", 0, G_MAXINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_propertiesPROP_CODED_BUF_SIZE = + g_param_spec_int ("coded-buf-size", "coded-buffer-size", + "coded buffer size", 0, G_MAXINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, N_PROPERTIES, g_properties); +} + +static gboolean +gst_va_encoder_initialize (GstVaEncoder * self, guint32 codec) +{ + if (self->available_profiles) + return FALSE; + + self->available_profiles = + gst_va_display_get_profiles (self->display, codec, self->entrypoint); + + if (!self->available_profiles) + return FALSE; + + if (self->available_profiles->len == 0) { + g_clear_pointer (&self->available_profiles, g_array_unref); + return FALSE; + } + + return TRUE; +} + +GstVaEncoder * +gst_va_encoder_new (GstVaDisplay * display, guint32 codec, + VAEntrypoint entrypoint) +{ + GstVaEncoder *self; + + g_return_val_if_fail (GST_IS_VA_DISPLAY (display), NULL); + + self = g_object_new (GST_TYPE_VA_ENCODER, "display", display, + "va-entrypoint", entrypoint, NULL); + if (!gst_va_encoder_initialize (self, codec)) + gst_clear_object (&self); + + return self; +} + +gboolean +gst_va_encoder_get_reconstruct_pool_config (GstVaEncoder * self, + GstCaps ** caps, guint * max_surfaces) +{ + GstStructure *config; + gboolean ret; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE); + + if (!gst_va_encoder_is_open (self)) + return FALSE; + + if (!self->recon_pool) + return FALSE; + + config = gst_buffer_pool_get_config (self->recon_pool); + ret = gst_buffer_pool_config_get_params (config, caps, NULL, NULL, + max_surfaces); + gst_structure_free (config); + return ret; +} + +gboolean +gst_va_encoder_has_profile (GstVaEncoder * self, VAProfile profile) +{ + VAProfile p; + gint i; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE); + + for (i = 0; i < self->available_profiles->len; i++) { + p = g_array_index (self->available_profiles, VAProfile, i); + if (p == profile) + return TRUE; + } + + return FALSE; +} + +gint32 +gst_va_encoder_get_max_slice_num (GstVaEncoder * self, + VAProfile profile, VAEntrypoint entrypoint) +{ + VAStatus status; + VADisplay dpy; + VAConfigAttrib attrib = {.type = VAConfigAttribEncMaxSlices }; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), -1); + + if (profile == VAProfileNone) + return -1; + + dpy = gst_va_display_get_va_dpy (self->display); + status = vaGetConfigAttributes (dpy, profile, entrypoint, &attrib, 1); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING_OBJECT (self, "Failed to query encoding slices: %s", + vaErrorStr (status)); + return -1; + } + + if (attrib.value == VA_ATTRIB_NOT_SUPPORTED) { + GST_WARNING_OBJECT (self, "Driver does not support encoding picture as " + "multiple slices"); + return -1; + } + + return attrib.value; +} + +gint32 +gst_va_encoder_get_slice_structure (GstVaEncoder * self, + VAProfile profile, VAEntrypoint entrypoint) +{ + VAStatus status; + VADisplay dpy; + VAConfigAttrib attrib = {.type = VAConfigAttribEncSliceStructure }; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), 0); + + if (profile == VAProfileNone) + return -1; + + dpy = gst_va_display_get_va_dpy (self->display); + status = vaGetConfigAttributes (dpy, profile, entrypoint, &attrib, 1); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING_OBJECT (self, "Failed to query encoding slice structure: %s", + vaErrorStr (status)); + return 0; + } + + if (attrib.value == VA_ATTRIB_NOT_SUPPORTED) { + GST_WARNING_OBJECT (self, "Driver does not support slice structure"); + return 0; + } + + return attrib.value; +} + +gboolean +gst_va_encoder_get_max_num_reference (GstVaEncoder * self, + VAProfile profile, VAEntrypoint entrypoint, + guint32 * list0, guint32 * list1) +{ + VAStatus status; + VADisplay dpy; + VAConfigAttrib attrib = {.type = VAConfigAttribEncMaxRefFrames }; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE); + + if (profile == VAProfileNone) + return FALSE; + + dpy = gst_va_display_get_va_dpy (self->display); + status = vaGetConfigAttributes (dpy, profile, entrypoint, &attrib, 1); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING_OBJECT (self, "Failed to query reference frames: %s", + vaErrorStr (status)); + return FALSE; + } + + if (attrib.value == VA_ATTRIB_NOT_SUPPORTED) { + if (list0) + *list0 = 0; + if (list1) + *list1 = 0; + + return TRUE; + } + + if (list0) + *list0 = attrib.value & 0xffff; + if (list1) + *list1 = (attrib.value >> 16) & 0xffff; + + return TRUE; +} + +guint +gst_va_encoder_get_prediction_direction (GstVaEncoder * self, + VAProfile profile, VAEntrypoint entrypoint) +{ +#if VA_CHECK_VERSION(1,9,0) + VAStatus status; + VADisplay dpy; + VAConfigAttrib attrib = {.type = VAConfigAttribPredictionDirection }; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), 0); + + if (profile == VAProfileNone) + return 0; + + if (entrypoint != self->entrypoint) + return 0; + + dpy = gst_va_display_get_va_dpy (self->display); + status = vaGetConfigAttributes (dpy, profile, entrypoint, &attrib, 1); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING_OBJECT (self, "Failed to query prediction direction: %s", + vaErrorStr (status)); + return 0; + } + + if (attrib.value == VA_ATTRIB_NOT_SUPPORTED) { + GST_WARNING_OBJECT (self, "Driver does not support query" + " prediction direction"); + return 0; + } + + return attrib.value & (VA_PREDICTION_DIRECTION_PREVIOUS | + VA_PREDICTION_DIRECTION_FUTURE | VA_PREDICTION_DIRECTION_BI_NOT_EMPTY); +#else + return 0; +#endif +} + +guint32 +gst_va_encoder_get_rate_control_mode (GstVaEncoder * self, + VAProfile profile, VAEntrypoint entrypoint) +{ + VAStatus status; + VADisplay dpy; + VAConfigAttrib attrib = {.type = VAConfigAttribRateControl }; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), 0); + + if (profile == VAProfileNone) + return 0; + + dpy = gst_va_display_get_va_dpy (self->display); + status = vaGetConfigAttributes (dpy, profile, entrypoint, &attrib, 1); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING_OBJECT (self, "Failed to query rate control mode: %s", + vaErrorStr (status)); + return 0; + } + + if (attrib.value == VA_ATTRIB_NOT_SUPPORTED) { + GST_WARNING_OBJECT (self, "Driver does not support any rate control modes"); + return 0; + } + + return attrib.value; +} + +guint32 +gst_va_encoder_get_quality_level (GstVaEncoder * self, + VAProfile profile, VAEntrypoint entrypoint) +{ + VAStatus status; + VADisplay dpy; + VAConfigAttrib attrib = {.type = VAConfigAttribEncQualityRange }; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), 0); + + if (profile == VAProfileNone) + return 0; + + dpy = gst_va_display_get_va_dpy (self->display); + status = vaGetConfigAttributes (dpy, profile, entrypoint, &attrib, 1); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING_OBJECT (self, "Failed to query the quality level: %s", + vaErrorStr (status)); + return 0; + } + + if (attrib.value == VA_ATTRIB_NOT_SUPPORTED) { + GST_WARNING_OBJECT (self, "Driver does not support quality attribute"); + return 0; + } + + return attrib.value; +} + +gboolean +gst_va_encoder_has_trellis (GstVaEncoder * self, + VAProfile profile, VAEntrypoint entrypoint) +{ + VAStatus status; + VADisplay dpy; + VAConfigAttrib attrib = {.type = VAConfigAttribEncQuantization }; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE); + + if (profile == VAProfileNone) + return FALSE; + + dpy = gst_va_display_get_va_dpy (self->display); + status = vaGetConfigAttributes (dpy, profile, entrypoint, &attrib, 1); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING_OBJECT (self, "Failed to query the trellis: %s", + vaErrorStr (status)); + return FALSE; + } + + if (attrib.value == VA_ATTRIB_NOT_SUPPORTED) { + GST_WARNING_OBJECT (self, "Driver does not support trellis"); + return FALSE; + } + + return attrib.value & VA_ENC_QUANTIZATION_TRELLIS_SUPPORTED; +} + +gboolean +gst_va_encoder_has_tile (GstVaEncoder * self, + VAProfile profile, VAEntrypoint entrypoint) +{ + VAStatus status; + VADisplay dpy; + VAConfigAttrib attrib = {.type = VAConfigAttribEncTileSupport }; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE); + + if (profile == VAProfileNone) + return FALSE; + + dpy = gst_va_display_get_va_dpy (self->display); + status = vaGetConfigAttributes (dpy, profile, entrypoint, &attrib, 1); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING_OBJECT (self, "Failed to query the tile: %s", + vaErrorStr (status)); + return FALSE; + } + + if (attrib.value == VA_ATTRIB_NOT_SUPPORTED) { + GST_WARNING_OBJECT (self, "Driver does not support tile"); + return FALSE; + } + + return attrib.value > 0; +} + +guint32 +gst_va_encoder_get_rtformat (GstVaEncoder * self, + VAProfile profile, VAEntrypoint entrypoint) +{ + VAStatus status; + VADisplay dpy; + VAConfigAttrib attrib = {.type = VAConfigAttribRTFormat }; + + if (profile == VAProfileNone) + return 0; + + dpy = gst_va_display_get_va_dpy (self->display); + status = vaGetConfigAttributes (dpy, profile, entrypoint, &attrib, 1); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR_OBJECT (self, "Failed to query rt format: %s", + vaErrorStr (status)); + return 0; + } + + if (attrib.value == VA_ATTRIB_NOT_SUPPORTED) { + GST_WARNING_OBJECT (self, "Driver does not support any rt format"); + return 0; + } + + return attrib.value; +} + +gboolean +gst_va_encoder_get_packed_headers (GstVaEncoder * self, VAProfile profile, + VAEntrypoint entrypoint, guint * packed_headers) +{ + VAStatus status; + VADisplay dpy; + VAConfigAttrib attrib = {.type = VAConfigAttribEncPackedHeaders }; + + if (profile == VAProfileNone) + return FALSE; + + dpy = gst_va_display_get_va_dpy (self->display); + status = vaGetConfigAttributes (dpy, profile, entrypoint, &attrib, 1); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR_OBJECT (self, "Failed to query packed headers: %s", + vaErrorStr (status)); + return FALSE; + } + + if (attrib.value == VA_ATTRIB_NOT_SUPPORTED) { + GST_WARNING_OBJECT (self, "Driver does not support any packed headers"); + return FALSE; + } + + if (packed_headers) + *packed_headers = attrib.value; + return TRUE; +} + +/* Add packed header such as SPS, PPS, SEI, etc. If adding slice header, + it is attached to the last slice parameter. */ +gboolean +gst_va_encoder_add_packed_header (GstVaEncoder * self, GstVaEncodePicture * pic, + gint type, gpointer data, gsize size_in_bits, gboolean has_emulation_bytes) +{ + VABufferID buffer; + VAEncPackedHeaderParameterBuffer param = { + .type = type, + .bit_length = size_in_bits, + .has_emulation_bytes = has_emulation_bytes, + }; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE); + g_return_val_if_fail (self->context != VA_INVALID_ID, FALSE); + g_return_val_if_fail (pic && data && size_in_bits > 0, FALSE); + g_return_val_if_fail (type >= VAEncPackedHeaderSequence + && type <= VAEncPackedHeaderRawData, FALSE); + + if (!gst_va_encoder_is_open (self)) { + GST_ERROR_OBJECT (self, "encoder has not been opened yet"); + return FALSE; + } + + buffer = _create_buffer (self, VAEncPackedHeaderParameterBufferType, ¶m, + sizeof (param)); + if (buffer == VA_INVALID_ID) + return FALSE; + + g_array_append_val (pic->params, buffer); + + buffer = _create_buffer (self, VAEncPackedHeaderDataBufferType, data, + (size_in_bits + 7) / 8); + if (buffer == VA_INVALID_ID) + return FALSE; + + g_array_append_val (pic->params, buffer); + + return TRUE; +} + +gboolean +gst_va_encoder_add_param (GstVaEncoder * self, GstVaEncodePicture * pic, + VABufferType type, gpointer data, gsize size) +{ + VABufferID buffer; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE); + g_return_val_if_fail (self->context != VA_INVALID_ID, FALSE); + g_return_val_if_fail (pic && data && size > 0, FALSE); + + if (!gst_va_encoder_is_open (self)) { + GST_ERROR_OBJECT (self, "encoder has not been opened yet"); + return FALSE; + } + + buffer = _create_buffer (self, type, data, size); + if (buffer == VA_INVALID_ID) + return FALSE; + + g_array_append_val (pic->params, buffer); + + return TRUE; +} + +GArray * +gst_va_encoder_get_surface_formats (GstVaEncoder * self) +{ + g_return_val_if_fail (GST_IS_VA_ENCODER (self), NULL); + + if (!gst_va_encoder_is_open (self)) + return NULL; + + return _get_surface_formats (self->display, self->config); +} + +static gboolean +_get_codec_caps (GstVaEncoder * self) +{ + GstCaps *sinkpad_caps = NULL, *srcpad_caps = NULL; + + if (!gst_va_encoder_is_open (self) + && GST_IS_VA_DISPLAY_WRAPPED (self->display)) { + if (gst_va_caps_from_profiles (self->display, self->available_profiles, + self->entrypoint, &srcpad_caps, &sinkpad_caps)) { + gst_caps_replace (&self->sinkpad_caps, sinkpad_caps); + gst_caps_replace (&self->srcpad_caps, srcpad_caps); + gst_caps_unref (srcpad_caps); + gst_caps_unref (sinkpad_caps); + + return TRUE; + } + } + + return FALSE; +} + +GstCaps * +gst_va_encoder_get_sinkpad_caps (GstVaEncoder * self) +{ + GstCaps *sinkpad_caps = NULL; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE); + + if (g_atomic_pointer_get (&self->sinkpad_caps)) + return gst_caps_ref (self->sinkpad_caps); + + if (_get_codec_caps (self)) + return gst_caps_ref (self->sinkpad_caps); + + if (gst_va_encoder_is_open (self)) { + sinkpad_caps = gst_va_create_raw_caps_from_config (self->display, + self->config); + if (!sinkpad_caps) { + GST_WARNING_OBJECT (self, "Invalid configuration caps"); + return NULL; + } + gst_caps_replace (&self->sinkpad_caps, sinkpad_caps); + gst_caps_unref (sinkpad_caps); + + return gst_caps_ref (self->sinkpad_caps); + } + + return NULL; +} + +GstCaps * +gst_va_encoder_get_srcpad_caps (GstVaEncoder * self) +{ + g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE); + + if (g_atomic_pointer_get (&self->srcpad_caps)) + return gst_caps_ref (self->srcpad_caps); + + if (_get_codec_caps (self)) + return gst_caps_ref (self->srcpad_caps); + + if (gst_va_encoder_is_open (self)) { + VAProfile profile; + VAEntrypoint entrypoint; + GstCaps *caps; + + GST_OBJECT_LOCK (self); + profile = self->profile; + entrypoint = self->entrypoint; + GST_OBJECT_UNLOCK (self); + + caps = gst_va_create_coded_caps (self->display, profile, entrypoint, NULL); + if (caps) { + gst_caps_replace (&self->srcpad_caps, caps); + return gst_caps_ref (self->srcpad_caps); + } + } + + return NULL; +} + +static gboolean +_destroy_all_buffers (GstVaEncodePicture * pic) +{ + VABufferID buffer; + guint i; + gboolean ret = TRUE; + + g_return_val_if_fail (GST_IS_VA_DISPLAY (pic->display), FALSE); + + for (i = 0; i < pic->params->len; i++) { + buffer = g_array_index (pic->params, VABufferID, i); + ret &= _destroy_buffer (pic->display, buffer); + } + pic->params = g_array_set_size (pic->params, 0); + + return ret; +} + +gboolean +gst_va_encoder_encode (GstVaEncoder * self, GstVaEncodePicture * pic) +{ + VADisplay dpy; + VAStatus status; + VASurfaceID surface; + VAContextID context; + gboolean ret = FALSE; + + g_return_val_if_fail (pic, FALSE); + + GST_OBJECT_LOCK (self); + + if (!_is_open_unlocked (self)) { + GST_OBJECT_UNLOCK (self); + GST_ERROR_OBJECT (self, "encoder has not been opened yet"); + return FALSE; + } + + context = self->context; + GST_OBJECT_UNLOCK (self); + + surface = gst_va_encode_picture_get_raw_surface (pic); + if (surface == VA_INVALID_ID) { + GST_ERROR_OBJECT (self, "Encode picture without valid raw surface"); + goto bail; + } + + GST_TRACE_OBJECT (self, "Encode the surface %#x", surface); + + dpy = gst_va_display_get_va_dpy (self->display); + + status = vaBeginPicture (dpy, context, surface); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING_OBJECT (self, "vaBeginPicture: %s", vaErrorStr (status)); + goto bail; + } + + if (pic->params->len > 0) { + status = vaRenderPicture (dpy, context, (VABufferID *) pic->params->data, + pic->params->len); + if (status != VA_STATUS_SUCCESS) { + GST_WARNING_OBJECT (self, "vaRenderPicture: %s", vaErrorStr (status)); + goto fail_end_pic; + } + } + + status = vaEndPicture (dpy, context); + ret = (status == VA_STATUS_SUCCESS); + if (!ret) + GST_WARNING_OBJECT (self, "vaEndPicture: %s", vaErrorStr (status)); + +bail: + _destroy_all_buffers (pic); + + return ret; + +fail_end_pic: + { + _destroy_all_buffers (pic); + status = vaEndPicture (dpy, context); + ret = FALSE; + goto bail; + } +} + +VASurfaceID +gst_va_encode_picture_get_reconstruct_surface (GstVaEncodePicture * pic) +{ + g_return_val_if_fail (pic, VA_INVALID_ID); + g_return_val_if_fail (pic->reconstruct_buffer, VA_INVALID_ID); + + return gst_va_buffer_get_surface (pic->reconstruct_buffer); +} + +VASurfaceID +gst_va_encode_picture_get_raw_surface (GstVaEncodePicture * pic) +{ + g_return_val_if_fail (pic, VA_INVALID_ID); + g_return_val_if_fail (pic->raw_buffer, VA_INVALID_ID); + + return gst_va_buffer_get_surface (pic->raw_buffer); +} + +GstVaEncodePicture * +gst_va_encode_picture_new (GstVaEncoder * self, GstBuffer * raw_buffer) +{ + GstVaEncodePicture *pic; + VABufferID coded_buffer; + VADisplay dpy; + VAStatus status; + gint codedbuf_size; + GstBufferPool *recon_pool = NULL; + GstBuffer *reconstruct_buffer = NULL; + GstFlowReturn ret; + GstBufferPoolAcquireParams buffer_pool_params = { + .flags = GST_BUFFER_POOL_ACQUIRE_FLAG_DONTWAIT, + }; + + g_return_val_if_fail (self && GST_IS_VA_ENCODER (self), NULL); + g_return_val_if_fail (raw_buffer && GST_IS_BUFFER (raw_buffer), NULL); + + GST_OBJECT_LOCK (self); + + if (!_is_open_unlocked (self)) { + GST_OBJECT_UNLOCK (self); + GST_ERROR_OBJECT (self, "encoder has not been opened yet"); + return NULL; + } + + if (self->codedbuf_size <= 0) { + GST_ERROR_OBJECT (self, "codedbuf_size: %d, is invalid", + self->codedbuf_size); + GST_OBJECT_UNLOCK (self); + return NULL; + } + codedbuf_size = self->codedbuf_size; + + recon_pool = gst_object_ref (self->recon_pool); + + GST_OBJECT_UNLOCK (self); + + ret = gst_buffer_pool_acquire_buffer (recon_pool, &reconstruct_buffer, + &buffer_pool_params); + gst_clear_object (&recon_pool); + + if (ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (self, "Failed to create the reconstruct picture"); + gst_clear_buffer (&reconstruct_buffer); + return NULL; + } + + dpy = gst_va_display_get_va_dpy (self->display); + status = vaCreateBuffer (dpy, self->context, VAEncCodedBufferType, + codedbuf_size, 1, NULL, &coded_buffer); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR_OBJECT (self, "vaCreateBuffer: %s", vaErrorStr (status)); + gst_clear_buffer (&reconstruct_buffer); + return NULL; + } + + pic = g_slice_new (GstVaEncodePicture); + pic->raw_buffer = gst_buffer_ref (raw_buffer); + pic->reconstruct_buffer = reconstruct_buffer; + pic->display = gst_object_ref (self->display); + pic->coded_buffer = coded_buffer; + + pic->params = g_array_sized_new (FALSE, FALSE, sizeof (VABufferID), 8); + + return pic; +} + +void +gst_va_encode_picture_free (GstVaEncodePicture * pic) +{ + g_return_if_fail (pic); + + _destroy_all_buffers (pic); + + if (pic->coded_buffer != VA_INVALID_ID) + _destroy_buffer (pic->display, pic->coded_buffer); + + gst_buffer_unref (pic->raw_buffer); + gst_buffer_unref (pic->reconstruct_buffer); + + g_clear_pointer (&pic->params, g_array_unref); + gst_clear_object (&pic->display); + + g_slice_free (GstVaEncodePicture, pic); +} + +/* currently supported rate controls */ +static const GEnumValue rate_control_map = { + {VA_RC_CBR, "Constant Bitrate", "cbr"}, + {VA_RC_VBR, "Variable Bitrate", "vbr"}, + {VA_RC_VCM, "Video Conferencing Mode (Non HRD compliant)", "vcm"}, + {VA_RC_CQP, "Constant Quantizer", "cqp"}, + /* {VA_RC_VBR_CONSTRAINED, "VBR with peak rate higher than average bitrate", */ + /* "vbr-constrained"}, */ + /* {VA_RC_ICQ, "Intelligent Constant Quality", "icq"}, */ + /* {VA_RC_MB, "Macroblock based rate control", "mb"}, */ + /* {VA_RC_CFS, "Constant Frame Size", "cfs"}, */ + /* {VA_RC_PARALLEL, "Parallel BRC", "parallel"}, */ + /* {VA_RC_QVBR, "Quality defined VBR", "qvbr"}, */ + /* {VA_RC_AVBR, "Average VBR", "avbr"}, */ +}; + +static gint +_guint32_cmp (gconstpointer a, gconstpointer b) +{ + return *((const guint32 *) a) - *((const guint32 *) b); +} + +gboolean +gst_va_encoder_get_rate_control_enum (GstVaEncoder * self, + GEnumValue ratectl16) +{ + guint i, j, k = 0; + guint32 rc, rc_prev = 0; + VAProfile profile; + GArray *rcs; + + g_return_val_if_fail (GST_IS_VA_ENCODER (self), FALSE); + + /* reseve the number of supported rate controls per profile */ + rcs = g_array_sized_new (FALSE, FALSE, sizeof (guint32), + G_N_ELEMENTS (rate_control_map) * self->available_profiles->len); + + for (i = 0; i < self->available_profiles->len; i++) { + profile = g_array_index (self->available_profiles, VAProfile, i); + rc = gst_va_encoder_get_rate_control_mode (self, profile, self->entrypoint); + if (rc == 0) + continue; + + for (j = 0; j < G_N_ELEMENTS (rate_control_map); j++) { + if (rc & rate_control_mapj.value) + rcs = g_array_append_val (rcs, rate_control_mapj.value); + } + } + + if (rcs->len == 0) { + g_clear_pointer (&rcs, g_array_unref); + return FALSE; + } + + g_array_sort (rcs, _guint32_cmp); + + for (i = 0; i < rcs->len; i++) { + rc = g_array_index (rcs, guint32, i); + if (rc == rc_prev) + continue; + + for (j = 0; j < G_N_ELEMENTS (rate_control_map); j++) { + if (rc == rate_control_mapj.value && k < 15) + ratectlk++ = rate_control_mapj; + } + + rc_prev = rc; + } + + g_clear_pointer (&rcs, g_array_unref); + if (k == 0) + return FALSE; + /* *INDENT-OFF* */ + ratectlk = (GEnumValue) { 0, NULL, NULL }; + /* *INDENT-ON* */ + return TRUE; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvaencoder.h
Added
@@ -0,0 +1,125 @@ +/* GStreamer + * Copyright (C) 2021 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/va/gstva.h> +#include <gst/video/video.h> +#include <va/va.h> + +G_BEGIN_DECLS + +#define GST_TYPE_VA_ENCODER (gst_va_encoder_get_type()) +G_DECLARE_FINAL_TYPE (GstVaEncoder, gst_va_encoder, GST, VA_ENCODER, GstObject); + +typedef struct _GstVaEncodePicture GstVaEncodePicture; +struct _GstVaEncodePicture +{ + GstVaDisplay *display; + + /* picture parameters */ + GArray *params; + + GstBuffer *raw_buffer; + GstBuffer *reconstruct_buffer; + + VABufferID coded_buffer; +}; + +gboolean gst_va_encoder_is_open (GstVaEncoder * self); +gboolean gst_va_encoder_open (GstVaEncoder * self, + VAProfile profile, + GstVideoFormat video_format, + guint rt_format, + gint coded_width, + gint coded_height, + gint codedbuf_size, + guint max_reconstruct_surfaces, + guint rc_ctrl, + guint32 packed_headers); +gboolean gst_va_encoder_close (GstVaEncoder * self); +gboolean gst_va_encoder_get_reconstruct_pool_config (GstVaEncoder * self, + GstCaps ** caps, + guint * max_surfaces); +gboolean gst_va_encoder_has_profile (GstVaEncoder * self, + VAProfile profile); +gint gst_va_encoder_get_max_slice_num (GstVaEncoder * self, + VAProfile profile, + VAEntrypoint entrypoint); +gint32 gst_va_encoder_get_slice_structure (GstVaEncoder * self, + VAProfile profile, + VAEntrypoint entrypoint); +gboolean gst_va_encoder_get_max_num_reference (GstVaEncoder * self, + VAProfile profile, + VAEntrypoint entrypoint, + guint32 * list0, + guint32 * list1); +guint gst_va_encoder_get_prediction_direction (GstVaEncoder * self, + VAProfile profile, + VAEntrypoint entrypoint); +guint32 gst_va_encoder_get_rate_control_mode (GstVaEncoder * self, + VAProfile profile, + VAEntrypoint entrypoint); +guint32 gst_va_encoder_get_quality_level (GstVaEncoder * self, + VAProfile profile, + VAEntrypoint entrypoint); +gboolean gst_va_encoder_has_trellis (GstVaEncoder * self, + VAProfile profile, + VAEntrypoint entrypoint); +gboolean gst_va_encoder_has_tile (GstVaEncoder * self, + VAProfile profile, + VAEntrypoint entrypoint); +guint32 gst_va_encoder_get_rtformat (GstVaEncoder * self, + VAProfile profile, + VAEntrypoint entrypoint); +gboolean gst_va_encoder_get_packed_headers (GstVaEncoder * self, + VAProfile profile, + VAEntrypoint entrypoint, + guint32 * packed_headers); +gboolean gst_va_encoder_get_rate_control_enum (GstVaEncoder * self, + GEnumValue ratectl16); +gboolean gst_va_encoder_add_param (GstVaEncoder * self, + GstVaEncodePicture * pic, + VABufferType type, + gpointer data, + gsize size); +gboolean gst_va_encoder_add_packed_header (GstVaEncoder * self, + GstVaEncodePicture * pic, + gint type, + gpointer data, + gsize size_in_bits, + gboolean has_emulation_bytes); +GstVaEncoder * gst_va_encoder_new (GstVaDisplay * display, + guint32 codec, + VAEntrypoint entrypoint); +GArray * gst_va_encoder_get_surface_formats (GstVaEncoder * self); +GstCaps * gst_va_encoder_get_sinkpad_caps (GstVaEncoder * self); +GstCaps * gst_va_encoder_get_srcpad_caps (GstVaEncoder * self); +gboolean gst_va_encoder_encode (GstVaEncoder * self, + GstVaEncodePicture * pic); + +GstVaEncodePicture * gst_va_encode_picture_new (GstVaEncoder * self, + GstBuffer * raw_buffer); +void gst_va_encode_picture_free (GstVaEncodePicture * pic); +VASurfaceID gst_va_encode_picture_get_raw_surface (GstVaEncodePicture * pic); +VASurfaceID gst_va_encode_picture_get_reconstruct_surface (GstVaEncodePicture * pic); + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvafilter.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvafilter.c
Changed
@@ -24,15 +24,13 @@ #include "gstvafilter.h" +#include <gst/va/gstvavideoformat.h> +#include <gst/va/vasurfaceimage.h> #include <gst/video/video.h> - #include <va/va_drmcommon.h> -#include "gstvaallocator.h" #include "gstvacaps.h" #include "gstvadisplay_priv.h" -#include "gstvavideoformat.h" -#include "vasurfaceimage.h" struct _GstVaFilter { @@ -61,6 +59,8 @@ guint rotation; GstVideoOrientationMethod orientation; + guint32 scale_method; + gboolean crop_enabled; VARectangle input_region; @@ -203,10 +203,8 @@ dpy = gst_va_display_get_va_dpy (self->display); - gst_va_display_lock (self->display); status = vaGetConfigAttributes (dpy, VAProfileNone, VAEntrypointVideoProc, attribs, G_N_ELEMENTS (attribs)); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaGetConfigAttributes: %s", vaErrorStr (status)); return FALSE; @@ -247,8 +245,7 @@ { /* https://github.com/intel/media-driver/issues/690 * https://github.com/intel/media-driver/issues/644 */ - if (!gst_va_display_is_implementation (self->display, - GST_VA_IMPLEMENTATION_INTEL_IHD)) + if (!GST_VA_DISPLAY_IS_IMPLEMENTATION (self->display, INTEL_IHD)) return TRUE; switch (format) { @@ -332,10 +329,8 @@ dpy = gst_va_display_get_va_dpy (self->display); - gst_va_display_lock (self->display); status = vaQueryVideoProcPipelineCaps (dpy, self->context, NULL, 0, &self->pipeline_caps); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaQueryVideoProcPipelineCaps: %s", vaErrorStr (status)); @@ -363,19 +358,14 @@ if (!gst_va_filter_ensure_config_attributes (self, &attrib.value)) return FALSE; - if (!gst_va_filter_ensure_pipeline_caps (self)) - return FALSE; - self->image_formats = gst_va_display_get_image_formats (self->display); if (!self->image_formats) return FALSE; dpy = gst_va_display_get_va_dpy (self->display); - gst_va_display_lock (self->display); status = vaCreateConfig (dpy, VAProfileNone, VAEntrypointVideoProc, &attrib, 1, &self->config); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaCreateConfig: %s", vaErrorStr (status)); return FALSE; @@ -384,22 +374,23 @@ if (!gst_va_filter_ensure_surface_attributes (self)) goto bail; - gst_va_display_lock (self->display); status = vaCreateContext (dpy, self->config, 0, 0, 0, NULL, 0, &self->context); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaCreateContext: %s", vaErrorStr (status)); goto bail; } + if (!gst_va_filter_ensure_pipeline_caps (self)) { + vaDestroyContext (dpy, self->context); + goto bail; + } + return TRUE; bail: { - gst_va_display_lock (self->display); status = vaDestroyConfig (dpy, self->config); - gst_va_display_unlock (self->display); return FALSE; } @@ -420,16 +411,12 @@ dpy = gst_va_display_get_va_dpy (self->display); if (self->context != VA_INVALID_ID) { - gst_va_display_lock (self->display); status = vaDestroyContext (dpy, self->context); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) GST_ERROR_OBJECT (self, "vaDestroyContext: %s", vaErrorStr (status)); } - gst_va_display_lock (self->display); status = vaDestroyConfig (dpy, self->config); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaDestroyConfig: %s", vaErrorStr (status)); return FALSE; @@ -447,15 +434,21 @@ static const struct VaFilterCapMap { VAProcFilterType type; guint count; + const char *name; } filter_cap_map = { - { VAProcFilterNoiseReduction, 1 }, - { VAProcFilterDeinterlacing, VAProcDeinterlacingCount }, - { VAProcFilterSharpening, 1 }, - { VAProcFilterColorBalance, VAProcColorBalanceCount }, - { VAProcFilterSkinToneEnhancement, 1 }, - { VAProcFilterTotalColorCorrection, VAProcTotalColorCorrectionCount }, - { VAProcFilterHVSNoiseReduction, 0 }, - { VAProcFilterHighDynamicRangeToneMapping, 1 }, +#define F(name, count) { G_PASTE (VAProcFilter, name), count, G_STRINGIFY (name) } + F(NoiseReduction, 1), + F(Deinterlacing, VAProcDeinterlacingCount), + F(Sharpening, 1), + F(ColorBalance, VAProcColorBalanceCount), + F(SkinToneEnhancement, 1), + F(TotalColorCorrection, VAProcTotalColorCorrectionCount), + F(HVSNoiseReduction, 0), + F(HighDynamicRangeToneMapping, VAProcHighDynamicRangeMetadataTypeCount), +#if VA_CHECK_VERSION (1, 12, 0) + F(3DLUT, 16), +#endif +#undef F }; /* *INDENT-ON* */ @@ -489,7 +482,11 @@ VAProcFilterCapDeinterlacing deintVAProcDeinterlacingCount; VAProcFilterCapColorBalance cbVAProcColorBalanceCount; VAProcFilterCapTotalColorCorrection ccVAProcTotalColorCorrectionCount; - VAProcFilterCapHighDynamicRange hdr; + VAProcFilterCapHighDynamicRange + hdrVAProcHighDynamicRangeMetadataTypeCount; +#if VA_CHECK_VERSION (1, 12, 0) + VAProcFilterCap3DLUT lut16; +#endif } caps; }; @@ -514,14 +511,10 @@ dpy = gst_va_display_get_va_dpy (self->display); - gst_va_display_lock (self->display); status = vaQueryVideoProcFilters (dpy, self->context, filter_types, &num); - gst_va_display_unlock (self->display); if (status == VA_STATUS_ERROR_MAX_NUM_EXCEEDED) { filter_types = g_try_realloc_n (filter_types, num, sizeof (*filter_types)); - gst_va_display_lock (self->display); status = vaQueryVideoProcFilters (dpy, self->context, filter_types, &num); - gst_va_display_unlock (self->display); } if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaQueryVideoProcFilters: %s", vaErrorStr (status)); @@ -538,10 +531,8 @@ struct VaFilter filter = { filter_typesi, num_caps, {{{0,}}} }; if (num_caps > 0) { - gst_va_display_lock (self->display); status = vaQueryVideoProcFilterCaps (dpy, self->context, filter.type, &filter.caps, &filter.num_caps); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_WARNING_OBJECT (self, "vaQueryVideoProcFiltersCaps: %s", vaErrorStr (status)); @@ -676,6 +667,19 @@ break; } + case VAProcFilterHighDynamicRangeToneMapping:{ + guint j; + for (j = 0; j < filter->num_caps; j++) { + const VAProcFilterCapHighDynamicRange *caps = &filter->caps.hdrj; + if (caps->metadata_type == VAProcHighDynamicRangeMetadataHDR10 + && (caps->caps_flag & VA_TONE_MAPPING_HDR_TO_SDR)) { + g_object_class_install_property (klass, GST_VA_FILTER_PROP_HDR, + g_param_spec_boolean ("hdr-tone-mapping", "HDR tone mapping", + "Enable HDR to SDR tone mapping", FALSE, common_flags)); + break; + } + } + } default: break; } @@ -690,37 +694,6 @@ common_flags)); } - /** - * GstVaPostProc:disable-passthrough: - * - * If set to %TRUE the filter will not enable passthrough mode, thus - * each frame will be processed. It's useful for cropping, for - * example. - * - * Since: 1.20 - */ - g_object_class_install_property (klass, - GST_VA_FILTER_PROP_DISABLE_PASSTHROUGH, - g_param_spec_boolean ("disable-passthrough", "Disable Passthrough", - "Forces passing buffers through the postprocessor", FALSE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS - | GST_PARAM_MUTABLE_READY)); - - /** - * GstVaPostProc:add-borders: - * - * If set to %TRUE the filter will add black borders if necessary to - * keep the display aspect ratio. - * - * Since: 1.20 - */ - g_object_class_install_property (klass, GST_VA_FILTER_PROP_ADD_BORDERS, - g_param_spec_boolean ("add-borders", "Add Borders", - "Add black borders if necessary to keep the display aspect ratio", - FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS - | GST_PARAM_MUTABLE_PLAYING)); - - return TRUE; } @@ -943,6 +916,18 @@ return ret; } +gboolean +gst_va_filter_set_scale_method (GstVaFilter * self, guint32 method) +{ + g_return_val_if_fail (GST_IS_VA_FILTER (self), FALSE); + + GST_OBJECT_LOCK (self); + self->scale_method = method; + GST_OBJECT_UNLOCK (self); + + return TRUE; +} + static gboolean _from_video_orientation_method (GstVideoOrientationMethod orientation, guint * mirror, guint * rotation) @@ -1382,10 +1367,8 @@ dpy = gst_va_display_get_va_dpy (self->display); - gst_va_display_lock (self->display); status = vaQueryVideoProcPipelineCaps (dpy, self->context, va_filters, num_filters, caps); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaQueryVideoProcPipelineCaps: %s", @@ -1438,6 +1421,17 @@ return TRUE; } +#ifndef GST_DISABLE_GST_DEBUG +static const gchar * +get_va_filter_name (gpointer data) +{ + VAProcFilterType type = ((VAProcFilterParameterBuffer *) data)->type; + const struct VaFilterCapMap *m = gst_va_filter_get_filter_cap (type); + + return m ? m->name : "Unknown"; +} +#endif + gboolean gst_va_filter_add_filter_buffer (GstVaFilter * self, gpointer data, gsize size, guint num) @@ -1453,15 +1447,15 @@ return FALSE; dpy = gst_va_display_get_va_dpy (self->display); - gst_va_display_lock (self->display); status = vaCreateBuffer (dpy, self->context, VAProcFilterParameterBufferType, size, num, data, &buffer); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaCreateBuffer: %s", vaErrorStr (status)); return FALSE; } + GST_DEBUG_OBJECT (self, "Added filter: %s", get_va_filter_name (data)); + /* lazy creation */ GST_OBJECT_LOCK (self); if (!self->filters) @@ -1489,9 +1483,7 @@ for (i = 0; i < self->filters->len; i++) { buffer = g_array_index (self->filters, VABufferID, i); - gst_va_display_lock (self->display); status = vaDestroyBuffer (dpy, buffer); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { ret = FALSE; GST_WARNING_OBJECT (self, "Failed to destroy filter buffer: %s", @@ -1519,24 +1511,35 @@ return ret; } +static VASurfaceID +_get_surface_from_buffer (GstVaFilter * self, GstBuffer * buffer) +{ + VASurfaceID surface = VA_INVALID_ID; + + if (buffer) + surface = gst_va_buffer_get_surface (buffer); + + if (surface != VA_INVALID_ID) { + /* @FIXME: in gallium vaQuerySurfaceStatus only seems to work with + * encoder's surfaces */ + if (!GST_VA_DISPLAY_IS_IMPLEMENTATION (self->display, MESA_GALLIUM)) + if (!va_check_surface (self->display, surface)) + surface = VA_INVALID_ID; + } + + return surface; +} + static gboolean _fill_va_sample (GstVaFilter * self, GstVaSample * sample, GstPadDirection direction) { GstVideoCropMeta *crop = NULL; - if (sample->buffer) - sample->surface = gst_va_buffer_get_surface (sample->buffer); + sample->surface = _get_surface_from_buffer (self, sample->buffer); if (sample->surface == VA_INVALID_ID) return FALSE; - /* @FIXME: in gallium vaQuerySurfaceStatus only seems to work with - * encoder's surfaces */ - if (!GST_VA_DISPLAY_IS_IMPLEMENTATION (self->display, MESA_GALLIUM)) { - if (!va_check_surface (self->display, sample->surface)) - return FALSE; - } - /* XXX: cropping occurs only in input frames */ if (direction == GST_PAD_SRC) { GST_OBJECT_LOCK (self); @@ -1608,23 +1611,24 @@ .output_surface_flag = dst->flags, .input_color_properties = self->input_color_properties, .output_color_properties = self->output_color_properties, + .filter_flags = self->scale_method, + /* output to SDR */ + .output_hdr_metadata = NULL, }; /* *INDENT-ON* */ GST_OBJECT_UNLOCK (self); dpy = gst_va_display_get_va_dpy (self->display); - gst_va_display_lock (self->display); status = vaCreateBuffer (dpy, self->context, VAProcPipelineParameterBufferType, sizeof (params), 1, ¶ms, buffer); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaCreateBuffer: %s", vaErrorStr (status)); return FALSE; } - GST_TRACE_OBJECT (self, "Created VABufferID %#x with %u filters", *buffer, - num_filters); + GST_TRACE_OBJECT (self, "Created VABufferID %#x with %u filters: " + "src %#x / dst %#x", *buffer, num_filters, src->surface, dst->surface); return TRUE; } @@ -1666,25 +1670,20 @@ dpy = gst_va_display_get_va_dpy (self->display); - gst_va_display_lock (self->display); status = vaBeginPicture (dpy, self->context, dst->surface); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaBeginPicture: %s", vaErrorStr (status)); return FALSE; } - gst_va_display_lock (self->display); status = vaRenderPicture (dpy, self->context, &buffer, 1); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { - GST_ERROR_OBJECT (self, "vaRenderPicture: %s", vaErrorStr (status)); + GST_ERROR_OBJECT (self, "vaRenderPicture: %s with buffer %#x", + vaErrorStr (status), buffer); goto fail_end_pic; } - gst_va_display_lock (self->display); status = vaEndPicture (dpy, self->context); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_ERROR_OBJECT (self, "vaEndPicture: %s", vaErrorStr (status)); goto bail; @@ -1693,9 +1692,7 @@ ret = TRUE; bail: - gst_va_display_lock (self->display); status = vaDestroyBuffer (dpy, buffer); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) { GST_WARNING_OBJECT (self, "Failed to destroy pipeline buffer: %s", vaErrorStr (status)); @@ -1705,15 +1702,148 @@ fail_end_pic: { - gst_va_display_lock (self->display); status = vaEndPicture (dpy, self->context); - gst_va_display_unlock (self->display); if (status != VA_STATUS_SUCCESS) GST_ERROR_OBJECT (self, "vaEndPicture: %s", vaErrorStr (status)); goto bail; } } +gboolean +gst_va_filter_has_compose (GstVaFilter * self) +{ + g_return_val_if_fail (GST_IS_VA_FILTER (self), FALSE); + + if (!gst_va_filter_is_open (self)) + return FALSE; + + /* HACK(uartie): i965 can't do composition */ + if (GST_VA_DISPLAY_IS_IMPLEMENTATION (self->display, INTEL_I965)) + return FALSE; + + /* some drivers can compose, but may not support blending (e.g. GALLIUM) */ +#ifndef GST_DISABLE_GST_DEBUG + if (!(self->pipeline_caps.blend_flags & VA_BLEND_GLOBAL_ALPHA)) + GST_WARNING_OBJECT (self, "VPP does not support alpha blending"); +#endif + + return TRUE; +} + +/** + * gst_va_filter_compose: + * @tx: the #GstVaComposeTransaction for input samples and output. + * + * Iterates over all inputs via #GstVaComposeTransaction:next and composes + * them onto the #GstVaComposeTransaction:output. + * + * Only csc, scaling and blending filters are applied during composition. + * All other filters are ignored here. Use #gst_va_filter_process to apply + * other filters. + * + * Returns: TRUE on successful compose, FALSE otherwise. + * + * Since: 1.22 + */ +gboolean +gst_va_filter_compose (GstVaFilter * self, GstVaComposeTransaction * tx) +{ + VADisplay dpy; + VAStatus status; + VASurfaceID out_surface; + GstVaComposeSample *sample; + + g_return_val_if_fail (GST_IS_VA_FILTER (self), FALSE); + g_return_val_if_fail (tx, FALSE); + g_return_val_if_fail (tx->next, FALSE); + g_return_val_if_fail (tx->output, FALSE); + + if (!gst_va_filter_is_open (self)) + return FALSE; + + out_surface = _get_surface_from_buffer (self, tx->output); + if (out_surface == VA_INVALID_ID) + return FALSE; + + dpy = gst_va_display_get_va_dpy (self->display); + + status = vaBeginPicture (dpy, self->context, out_surface); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR_OBJECT (self, "vaBeginPicture: %s", vaErrorStr (status)); + return FALSE; + } + + sample = tx->next (tx->user_data); + for (; sample; sample = tx->next (tx->user_data)) { + VAProcPipelineParameterBuffer params = { 0, }; + VABufferID buffer; + VASurfaceID in_surface; + VABlendState blend = { 0, }; + + in_surface = _get_surface_from_buffer (self, sample->buffer); + if (in_surface == VA_INVALID_ID) + return FALSE; + + /* (transfer full), unref it */ + gst_buffer_unref (sample->buffer); + + GST_OBJECT_LOCK (self); + /* *INDENT-OFF* */ + params = (VAProcPipelineParameterBuffer) { + .surface = in_surface, + .surface_region = &sample->input_region, + .output_region = &sample->output_region, + .output_background_color = 0xff000000, + .filter_flags = self->scale_method, + }; + /* *INDENT-ON* */ + GST_OBJECT_UNLOCK (self); + + /* only send blend state when sample is not fully opaque */ + if ((self->pipeline_caps.blend_flags & VA_BLEND_GLOBAL_ALPHA) + && sample->alpha < 1.0) { + /* *INDENT-OFF* */ + blend = (VABlendState) { + .flags = VA_BLEND_GLOBAL_ALPHA, + .global_alpha = sample->alpha, + }; + /* *INDENT-ON* */ + params.blend_state = &blend; + } + + status = vaCreateBuffer (dpy, self->context, + VAProcPipelineParameterBufferType, sizeof (params), 1, ¶ms, + &buffer); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR_OBJECT (self, "vaCreateBuffer: %s", vaErrorStr (status)); + goto fail_end_pic; + } + + status = vaRenderPicture (dpy, self->context, &buffer, 1); + vaDestroyBuffer (dpy, buffer); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR_OBJECT (self, "vaRenderPicture: %s", vaErrorStr (status)); + goto fail_end_pic; + } + } + + status = vaEndPicture (dpy, self->context); + if (status != VA_STATUS_SUCCESS) { + GST_ERROR_OBJECT (self, "vaEndPicture: %s", vaErrorStr (status)); + return FALSE; + } + + return TRUE; + +fail_end_pic: + { + status = vaEndPicture (dpy, self->context); + if (status != VA_STATUS_SUCCESS) + GST_ERROR_OBJECT (self, "vaEndPicture: %s", vaErrorStr (status)); + return FALSE; + } +} + /** * gst_va_buffer_get_surface_flags: * @buffer: the #GstBuffer to check. @@ -1793,3 +1923,26 @@ return FALSE; } + +/** + * GstVaScaleMethod: + * + * Since: 1.22 + */ +GType +gst_va_scale_method_get_type (void) +{ + static gsize type = 0; + static const GEnumValue values = { + {VA_FILTER_SCALING_DEFAULT, "Default scaling method", "default"}, + {VA_FILTER_SCALING_FAST, "Fast scaling method", "fast"}, + {VA_FILTER_SCALING_HQ, "High quality scaling method", "hq"}, + {0, NULL, NULL}, + }; + + if (g_once_init_enter (&type)) { + const GType _type = g_enum_register_static ("GstVaScaleMethod", values); + g_once_init_leave (&type, _type); + } + return type; +}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvafilter.h -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvafilter.h
Changed
@@ -20,7 +20,7 @@ #pragma once -#include <gst/va/gstvadisplay.h> +#include <gst/va/gstva.h> #include <gst/video/video.h> #include <va/va.h> @@ -50,12 +50,14 @@ GST_VA_FILTER_PROP_AUTO_SATURATION, GST_VA_FILTER_PROP_AUTO_BRIGHTNESS, GST_VA_FILTER_PROP_AUTO_CONTRAST, - GST_VA_FILTER_PROP_DISABLE_PASSTHROUGH, GST_VA_FILTER_PROP_DEINTERLACE_METHOD, - GST_VA_FILTER_PROP_ADD_BORDERS, + GST_VA_FILTER_PROP_HDR, GST_VA_FILTER_PROP_LAST }; +#define GST_TYPE_VA_SCALE_METHOD gst_va_scale_method_get_type() +GType gst_va_scale_method_get_type (void) G_GNUC_CONST; + typedef struct _GstVaSample GstVaSample; struct _GstVaSample { @@ -77,6 +79,31 @@ VARectangle rect; }; +typedef struct _GstVaComposeSample GstVaComposeSample; +struct _GstVaComposeSample +{ + /* input buffer (transfer full) */ + GstBuffer *buffer; + + VARectangle input_region; + VARectangle output_region; + + gdouble alpha; +}; + +typedef struct _GstVaComposeTransaction GstVaComposeTransaction; +struct _GstVaComposeTransaction +{ + /* input sample iterator function */ + GstVaComposeSample* (*next) (gpointer user_data); + + /* the output buffer to compose onto */ + GstBuffer *output; + + /* user data parameter for "next" function */ + gpointer user_data; +}; + GstVaFilter * gst_va_filter_new (GstVaDisplay * display); gboolean gst_va_filter_open (GstVaFilter * self); gboolean gst_va_filter_close (GstVaFilter * self); @@ -88,6 +115,8 @@ gboolean gst_va_filter_install_deinterlace_properties (GstVaFilter * self, GObjectClass * klass); +gboolean gst_va_filter_set_scale_method (GstVaFilter * self, + guint32 method); gboolean gst_va_filter_set_orientation (GstVaFilter * self, GstVideoOrientationMethod orientation); GstVideoOrientationMethod gst_va_filter_get_orientation (GstVaFilter * self); @@ -122,4 +151,8 @@ GstVideoFormat format, GstCapsFeatures * feature); +gboolean gst_va_filter_has_compose (GstVaFilter * self); +gboolean gst_va_filter_compose (GstVaFilter * self, + GstVaComposeTransaction * tx); + G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvah264dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvah264dec.c
Changed
@@ -75,10 +75,6 @@ { GstVaBaseDec parent; - GstFlowReturn last_ret; - - gint coded_width; - gint coded_height; gint dpb_size; /* Used to fill VAPictureParameterBufferH264.ReferenceFrames */ @@ -121,33 +117,19 @@ { GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); GstVaH264Dec *self = GST_VA_H264_DEC (decoder); + GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); + gboolean ret; GST_LOG_OBJECT (self, "Outputting picture %p (poc %d)", picture, picture->pic_order_cnt); - if (self->last_ret != GST_FLOW_OK) { - gst_h264_picture_unref (picture); - gst_video_decoder_drop_frame (GST_VIDEO_DECODER (self), frame); - return self->last_ret; - } - - if (base->copy_frames) - gst_va_base_dec_copy_output_buffer (base, frame); - - if (picture->buffer_flags != 0) { - gboolean interlaced = - (picture->buffer_flags & GST_VIDEO_BUFFER_FLAG_INTERLACED) != 0; - gboolean tff = (picture->buffer_flags & GST_VIDEO_BUFFER_FLAG_TFF) != 0; - - GST_TRACE_OBJECT (self, - "apply buffer flags 0x%x (interlaced %d, top-field-first %d)", - picture->buffer_flags, interlaced, tff); - GST_BUFFER_FLAG_SET (frame->output_buffer, picture->buffer_flags); - } - + ret = gst_va_base_dec_process_output (base, frame, picture->discont_state, + picture->buffer_flags); gst_h264_picture_unref (picture); - return gst_video_decoder_finish_frame (GST_VIDEO_DECODER (self), frame); + if (ret) + return gst_video_decoder_finish_frame (vdec, frame); + return GST_FLOW_ERROR; } static void @@ -491,19 +473,12 @@ GstVideoCodecFrame * frame, GstH264Picture * picture) { GstVaH264Dec *self = GST_VA_H264_DEC (decoder); - GstVaDecodePicture *pic; - GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); + GstVaDecodePicture *pic; + GstFlowReturn ret; - if (base->need_negotiation) { - if (!gst_video_decoder_negotiate (vdec)) { - GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); - return GST_FLOW_NOT_NEGOTIATED; - } - } - - self->last_ret = gst_video_decoder_allocate_output_frame (vdec, frame); - if (self->last_ret != GST_FLOW_OK) + ret = gst_va_base_dec_prepare_output_frame (base, frame); + if (ret != GST_FLOW_OK) goto error; pic = gst_va_decode_picture_new (base->decoder, frame->output_buffer); @@ -520,20 +495,20 @@ { GST_WARNING_OBJECT (self, "Failed to allocated output buffer, return %s", - gst_flow_get_name (self->last_ret)); - return self->last_ret; + gst_flow_get_name (ret)); + return ret; } } static GstFlowReturn gst_va_h264_dec_new_field_picture (GstH264Decoder * decoder, - const GstH264Picture * first_field, GstH264Picture * second_field) + GstH264Picture * first_field, GstH264Picture * second_field) { GstVaDecodePicture *first_pic, *second_pic; GstVaH264Dec *self = GST_VA_H264_DEC (decoder); GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); - first_pic = gst_h264_picture_get_user_data ((GstH264Picture *) first_field); + first_pic = gst_h264_picture_get_user_data (first_field); if (!first_pic) return GST_FLOW_ERROR; @@ -667,6 +642,7 @@ { GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); GstVaH264Dec *self = GST_VA_H264_DEC (decoder); + GstVideoInfo *info = &base->output_info; VAProfile profile; gint display_width; gint display_height; @@ -704,34 +680,35 @@ rt_format, sps->width, sps->height)) { base->profile = profile; base->rt_format = rt_format; - self->coded_width = sps->width; - self->coded_height = sps->height; + base->width = sps->width; + base->height = sps->height; negotiation_needed = TRUE; GST_INFO_OBJECT (self, "Format changed to %s %x (%dx%d)", - gst_va_profile_name (profile), rt_format, self->coded_width, - self->coded_height); + gst_va_profile_name (profile), rt_format, base->width, base->height); } - if (base->width != display_width || base->height != display_height) { - base->width = display_width; - base->height = display_height; + if (GST_VIDEO_INFO_WIDTH (info) != display_width || + GST_VIDEO_INFO_HEIGHT (info) != display_height) { + GST_VIDEO_INFO_WIDTH (info) = display_width; + GST_VIDEO_INFO_HEIGHT (info) = display_height; negotiation_needed = TRUE; - GST_INFO_OBJECT (self, "Resolution changed to %dx%d", base->width, - base->height); + GST_INFO_OBJECT (self, "Resolution changed to %dx%d", + GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info)); } interlaced = !sps->frame_mbs_only_flag; if (self->interlaced != interlaced) { self->interlaced = interlaced; - + GST_VIDEO_INFO_INTERLACE_MODE (info) = interlaced ? + GST_VIDEO_INTERLACE_MODE_MIXED : GST_VIDEO_INTERLACE_MODE_PROGRESSIVE; negotiation_needed = TRUE; GST_INFO_OBJECT (self, "Interlaced mode changed to %d", interlaced); } - base->need_valign = base->width < self->coded_width - || base->height < self->coded_height; + base->need_valign = GST_VIDEO_INFO_WIDTH (info) < base->width || + GST_VIDEO_INFO_HEIGHT (info) < base->height; if (base->need_valign) { /* *INDENT-OFF* */ if (base->valign.padding_left != padding_left || @@ -752,19 +729,35 @@ } base->min_buffers = self->dpb_size + 4; /* dpb size + scratch surfaces */ - base->need_negotiation = negotiation_needed; + g_clear_pointer (&base->input_state, gst_video_codec_state_unref); + base->input_state = gst_video_codec_state_ref (decoder->input_state); return GST_FLOW_OK; } +static inline void +_append_str (GValue * list, const gchar * str) +{ + GValue v = G_VALUE_INIT; + + g_value_init (&v, G_TYPE_STRING); + g_value_set_string (&v, str); + gst_value_list_append_value (list, &v); + g_value_unset (&v); +} + static GstCaps * _complete_sink_caps (GstCaps * sinkcaps) { GstCaps *caps = gst_caps_copy (sinkcaps); GValue val = G_VALUE_INIT; + const GValue *profiles; + GstStructure *st; const gchar *streamformat = { "avc", "avc3", "byte-stream" }; - gint i; + const gchar *high_synthetic = { "progressive-high", "constrained-high" }; + guint i, j, siz; + gboolean baseline = FALSE; g_value_init (&val, G_TYPE_STRING); g_value_set_string (&val, "au"); @@ -772,15 +765,33 @@ g_value_unset (&val); gst_value_list_init (&val, G_N_ELEMENTS (streamformat)); - for (i = 0; i < G_N_ELEMENTS (streamformat); i++) { - GValue v = G_VALUE_INIT; + for (i = 0; i < G_N_ELEMENTS (streamformat); i++) + _append_str (&val, streamformati); + gst_caps_set_value (caps, "stream-format", &val); + g_value_unset (&val); - g_value_init (&v, G_TYPE_STRING); - g_value_set_string (&v, streamformati); - gst_value_list_append_value (&val, &v); - g_value_unset (&v); + /* add synthetic profiles */ + st = gst_caps_get_structure (caps, 0); + profiles = gst_structure_get_value (st, "profile"); + siz = gst_value_list_get_size (profiles); + gst_value_list_init (&val, siz); + for (i = 0; i < siz; i++) { + const gchar *profile = + g_value_get_string (gst_value_list_get_value (profiles, i)); + + _append_str (&val, profile); + + if (g_strcmp0 (profile, "high") == 0) { + for (j = 0; j < G_N_ELEMENTS (high_synthetic); j++) + _append_str (&val, high_syntheticj); + } + if (!baseline && ((g_strcmp0 (profile, "main") == 0) + || g_strcmp0 (profile, "constrained-baseline") == 0)) { + _append_str (&val, "baseline"); + baseline = TRUE; + } } - gst_caps_set_value (caps, "stream-format", &val); + gst_caps_set_value (caps, "profile", &val); g_value_unset (&val); return caps; @@ -814,54 +825,6 @@ return caps; } -static gboolean -gst_va_h264_dec_negotiate (GstVideoDecoder * decoder) -{ - GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); - GstVaH264Dec *self = GST_VA_H264_DEC (decoder); - GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; - GstCapsFeatures *capsfeatures = NULL; - GstH264Decoder *h264dec = GST_H264_DECODER (decoder); - - /* Ignore downstream renegotiation request. */ - if (!base->need_negotiation) - return TRUE; - - base->need_negotiation = FALSE; - - if (gst_va_decoder_is_open (base->decoder) - && !gst_va_decoder_close (base->decoder)) - return FALSE; - - if (!gst_va_decoder_open (base->decoder, base->profile, base->rt_format)) - return FALSE; - - if (!gst_va_decoder_set_frame_size (base->decoder, self->coded_width, - self->coded_height)) - return FALSE; - - if (base->output_state) - gst_video_codec_state_unref (base->output_state); - - gst_va_base_dec_get_preferred_format_and_caps_features (base, &format, - &capsfeatures); - - base->output_state = - gst_video_decoder_set_output_state (decoder, format, - base->width, base->height, h264dec->input_state); - if (self->interlaced) - base->output_state->info.interlace_mode = GST_VIDEO_INTERLACE_MODE_MIXED; - - base->output_state->caps = gst_video_info_to_caps (&base->output_state->info); - if (capsfeatures) - gst_caps_set_features_simple (base->output_state->caps, capsfeatures); - - GST_INFO_OBJECT (self, "Negotiated caps %" GST_PTR_FORMAT, - base->output_state->caps); - - return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); -} - static void gst_va_h264_dec_dispose (GObject * object) { @@ -901,6 +864,13 @@ parent_class = g_type_class_peek_parent (g_class); + /** + * GstVaH264Dec:device-path: + * + * It shows the DRM device path used for the VA operation, if any. + * + * Since: 1.22 + */ gst_va_base_dec_class_init (GST_VA_BASE_DEC_CLASS (g_class), H264, cdata->render_device_path, cdata->sink_caps, cdata->src_caps, src_doc_caps, sink_doc_caps); @@ -908,7 +878,6 @@ gobject_class->dispose = gst_va_h264_dec_dispose; decoder_class->getcaps = GST_DEBUG_FUNCPTR (gst_va_h264_dec_getcaps); - decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_va_h264_dec_negotiate); h264decoder_class->new_sequence = GST_DEBUG_FUNCPTR (gst_va_h264_dec_new_sequence); @@ -946,7 +915,7 @@ self->ref_list = g_array_sized_new (FALSE, TRUE, sizeof (GstH264Picture *), 16); g_array_set_clear_func (self->ref_list, - (GDestroyNotify) gst_h264_picture_clear); + (GDestroyNotify) gst_clear_h264_picture); } static gpointer @@ -992,16 +961,14 @@ type_info.class_data = cdata; - type_name = g_strdup ("GstVaH264Dec"); - feature_name = g_strdup ("vah264dec"); - /* The first decoder to be registered should use a constant name, * like vah264dec, for any additional decoders, we create unique * names, using inserting the render device name. */ - if (g_type_from_name (type_name)) { + if (device->index == 0) { + type_name = g_strdup ("GstVaH264Dec"); + feature_name = g_strdup ("vah264dec"); + } else { gchar *basename = g_path_get_basename (device->render_device_path); - g_free (type_name); - g_free (feature_name); type_name = g_strdup_printf ("GstVa%sH264Dec", basename); feature_name = g_strdup_printf ("va%sh264dec", basename); cdata->description = basename;
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvah264enc.c
Added
@@ -0,0 +1,3855 @@ +/* GStreamer + * Copyright (C) 2021 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-vah264enc + * @title: vah264enc + * @short_description: A VA-API based H264 video encoder + * + * vah264enc encodes raw video VA surfaces into H.264 bitstreams using + * the installed and chosen VA-API(https://01.org/linuxmedia/vaapi) + * driver. + * + * The raw video frames in main memory can be imported into VA surfaces. + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc num-buffers=60 ! timeoverlay ! vah264enc ! h264parse ! mp4mux ! filesink location=test.mp4 + * ``` + * + * Since: 1.22 + * + */ + + /* @TODO: + * 1. Look ahead, which can optimize the slice type and QP. + * 2. Field encoding. + * 3. The stereo encoding such as the frame-packing or MVC. + * 4. Weight prediction of B frame. + * 5. latency calculation. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstvah264enc.h" + +#include <gst/codecparsers/gsth264bitwriter.h> +#include <gst/va/gstva.h> +#include <gst/va/gstvavideoformat.h> +#include <gst/va/vasurfaceimage.h> +#include <gst/video/video.h> +#include <va/va_drmcommon.h> + +#include "gstvabaseenc.h" +#include "gstvacaps.h" +#include "gstvadisplay_priv.h" +#include "gstvaencoder.h" +#include "gstvaprofile.h" +#include "vacompat.h" + +GST_DEBUG_CATEGORY_STATIC (gst_va_h264enc_debug); +#define GST_CAT_DEFAULT gst_va_h264enc_debug + +#define GST_VA_H264_ENC(obj) ((GstVaH264Enc *) obj) +#define GST_VA_H264_ENC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), G_TYPE_FROM_INSTANCE (obj), GstVaH264EncClass)) +#define GST_VA_H264_ENC_CLASS(klass) ((GstVaH264EncClass *) klass) + +typedef struct _GstVaH264Enc GstVaH264Enc; +typedef struct _GstVaH264EncClass GstVaH264EncClass; +typedef struct _GstVaH264EncFrame GstVaH264EncFrame; +typedef struct _GstVaH264LevelLimits GstVaH264LevelLimits; + +enum +{ + PROP_KEY_INT_MAX = 1, + PROP_BFRAMES, + PROP_IFRAMES, + PROP_NUM_REF_FRAMES, + PROP_B_PYRAMID, + PROP_NUM_SLICES, + PROP_MIN_QP, + PROP_MAX_QP, + PROP_QP_I, + PROP_QP_P, + PROP_QP_B, + PROP_DCT8X8, + PROP_CABAC, + PROP_TRELLIS, + PROP_MBBRC, + PROP_BITRATE, + PROP_TARGET_PERCENTAGE, + PROP_TARGET_USAGE, + PROP_RATE_CONTROL, + PROP_CPB_SIZE, + PROP_AUD, + PROP_CC, + N_PROPERTIES +}; + +static GParamSpec *propertiesN_PROPERTIES; + +static GstElementClass *parent_class = NULL; + +/* Scale factor for bitrate (HRD bit_rate_scale: min = 6) */ +#define SX_BITRATE 6 +/* Scale factor for CPB size (HRD cpb_size_scale: min = 4) */ +#define SX_CPB_SIZE 4 +/* Maximum sizes for common headers (in bits) */ +#define MAX_SPS_HDR_SIZE 16473 +#define MAX_VUI_PARAMS_SIZE 210 +#define MAX_HRD_PARAMS_SIZE 4103 +#define MAX_PPS_HDR_SIZE 101 +#define MAX_SLICE_HDR_SIZE 397 + 2572 + 6670 + 2402 + +#define MAX_GOP_SIZE 1024 + +/* *INDENT-OFF* */ +struct _GstVaH264EncClass +{ + GstVaBaseEncClass parent_class; + + GType rate_control_type; + char rate_control_type_name64; + GEnumValue rate_control16; +}; +/* *INDENT-ON* */ + +struct _GstVaH264Enc +{ + /*< private > */ + GstVaBaseEnc parent; + + /* properties */ + struct + { + /* kbps */ + guint bitrate; + /* VA_RC_XXX */ + guint32 rc_ctrl; + guint key_int_max; + guint32 num_ref_frames; + gboolean b_pyramid; + guint32 num_bframes; + guint32 num_iframes; + guint32 min_qp; + guint32 max_qp; + guint32 qp_i; + guint32 qp_p; + guint32 qp_b; + gboolean use_cabac; + gboolean use_dct8x8; + gboolean use_trellis; + gboolean aud; + gboolean cc; + guint32 mbbrc; + guint32 num_slices; + guint32 cpb_size; + guint32 target_percentage; + guint32 target_usage; + } prop; + + /* H264 fields */ + gint mb_width; + gint mb_height; + guint8 level_idc; + const gchar *level_str; + /* Minimum Compression Ratio (A.3.1) */ + guint min_cr; + gboolean use_cabac; + gboolean use_dct8x8; + gboolean use_trellis; + gboolean aud; + gboolean cc; + guint32 num_slices; + guint32 packed_headers; + + struct + { + /* frames between two IDR idr, ...., idr) */ + guint32 idr_period; + /* How may IDRs we have encoded */ + guint32 total_idr_count; + /* frames between I/P and P frames I, B, B, .., B, P) */ + guint32 ip_period; + /* frames between I frames I, B, B, .., B, P, ..., I), open GOP */ + guint32 i_period; + /* B frames between I/P and P. */ + guint32 num_bframes; + /* Use B pyramid structure in the GOP. */ + gboolean b_pyramid; + /* Level 0 is the simple B not acting as ref. */ + guint32 highest_pyramid_level; + /* If open GOP, I frames within a GOP. */ + guint32 num_iframes; + /* A map of all frames types within a GOP. */ + struct + { + guint8 slice_type; + gboolean is_ref; + guint8 pyramid_level; + /* Only for b pyramid */ + gint left_ref_poc_diff; + gint right_ref_poc_diff; + } frame_typesMAX_GOP_SIZE; + /* current index in the frames types map. */ + guint cur_frame_index; + /* Number of ref frames within current GOP. H264's frame num. */ + gint cur_frame_num; + /* Max frame num within a GOP. */ + guint32 max_frame_num; + guint32 log2_max_frame_num; + /* Max poc within a GOP. */ + guint32 max_pic_order_cnt; + guint32 log2_max_pic_order_cnt; + + /* Total ref frames of list0 and list1. */ + guint32 num_ref_frames; + guint32 ref_num_list0; + guint32 ref_num_list1; + + guint num_reorder_frames; + } gop; + + struct + { + guint target_usage; + guint32 rc_ctrl_mode; + + guint32 min_qp; + guint32 max_qp; + guint32 qp_i; + guint32 qp_p; + guint32 qp_b; + /* macroblock bitrate control */ + guint32 mbbrc; + guint target_bitrate; + guint target_percentage; + guint max_bitrate; + /* bitrate (bits) */ + guint max_bitrate_bits; + guint target_bitrate_bits; + /* length of CPB buffer */ + guint cpb_size; + /* length of CPB buffer (bits) */ + guint cpb_length_bits; + } rc; + + GstH264SPS sequence_hdr; +}; + +struct _GstVaH264EncFrame +{ + GstVaEncodePicture *picture; + GstH264SliceType type; + gboolean is_ref; + guint pyramid_level; + /* Only for b pyramid */ + gint left_ref_poc_diff; + gint right_ref_poc_diff; + + gint poc; + gint frame_num; + /* The pic_num will be marked as unused_for_reference, which is + * replaced by this frame. -1 if we do not need to care about it + * explicitly. */ + gint unused_for_reference_pic_num; + + /* The total frame count we handled. */ + guint total_frame_count; + + gboolean last_frame; +}; + +/** + * GstVaH264LevelLimits: + * @name: the level name + * @level_idc: the H.264 level_idc value + * @MaxMBPS: the maximum macroblock processing rate (MB/sec) + * @MaxFS: the maximum frame size (MBs) + * @MaxDpbMbs: the maxium decoded picture buffer size (MBs) + * @MaxBR: the maximum video bit rate (kbps) + * @MaxCPB: the maximum CPB size (kbits) + * @MinCR: the minimum Compression Ratio + * + * The data structure that describes the limits of an H.264 level. + */ +struct _GstVaH264LevelLimits +{ + const gchar *name; + guint8 level_idc; + guint32 MaxMBPS; + guint32 MaxFS; + guint32 MaxDpbMbs; + guint32 MaxBR; + guint32 MaxCPB; + guint32 MinCR; +}; + +/* Table A-1 - Level limits */ +/* *INDENT-OFF* */ +static const GstVaH264LevelLimits _va_h264_level_limits = { + /* level idc MaxMBPS MaxFS MaxDpbMbs MaxBR MaxCPB MinCr */ + { "1", 10, 1485, 99, 396, 64, 175, 2 }, + { "1b", 11, 1485, 99, 396, 128, 350, 2 }, + { "1.1", 11, 3000, 396, 900, 192, 500, 2 }, + { "1.2", 12, 6000, 396, 2376, 384, 1000, 2 }, + { "1.3", 13, 11880, 396, 2376, 768, 2000, 2 }, + { "2", 20, 11880, 396, 2376, 2000, 2000, 2 }, + { "2.1", 21, 19800, 792, 4752, 4000, 4000, 2 }, + { "2.2", 22, 20250, 1620, 8100, 4000, 4000, 2 }, + { "3", 30, 40500, 1620, 8100, 10000, 10000, 2 }, + { "3.1", 31, 108000, 3600, 18000, 14000, 14000, 4 }, + { "3.2", 32, 216000, 5120, 20480, 20000, 20000, 4 }, + { "4", 40, 245760, 8192, 32768, 20000, 25000, 4 }, + { "4.1", 41, 245760, 8192, 32768, 50000, 62500, 2 }, + { "4.2", 42, 522240, 8704, 34816, 50000, 62500, 2 }, + { "5", 50, 589824, 22080, 110400, 135000, 135000, 2 }, + { "5.1", 51, 983040, 36864, 184320, 240000, 240000, 2 }, + { "5.2", 52, 2073600, 36864, 184320, 240000, 240000, 2 }, + { "6", 60, 4177920, 139264, 696320, 240000, 240000, 2 }, + { "6.1", 61, 8355840, 139264, 696320, 480000, 480000, 2 }, + { "6.2", 62, 16711680, 139264, 696320, 800000, 800000, 2 }, +}; +/* *INDENT-ON* */ + +#ifndef GST_DISABLE_GST_DEBUG +static const gchar * +_slice_type_name (GstH264SliceType type) +{ + switch (type) { + case GST_H264_P_SLICE: + return "P"; + case GST_H264_B_SLICE: + return "B"; + case GST_H264_I_SLICE: + return "I"; + default: + g_assert_not_reached (); + } + + return NULL; +} + +static const gchar * +_rate_control_get_name (guint32 rc_mode) +{ + GParamSpecEnum *spec; + guint i; + + if (!(propertiesPROP_RATE_CONTROL + && G_IS_PARAM_SPEC_ENUM (propertiesPROP_RATE_CONTROL))) + return NULL; + + spec = G_PARAM_SPEC_ENUM (propertiesPROP_RATE_CONTROL); + for (i = 0; i < spec->enum_class->n_values; i++) { + if (spec->enum_class->valuesi.value == rc_mode) + return spec->enum_class->valuesi.value_nick; + } + + return NULL; +} +#endif + +static GstVaH264EncFrame * +gst_va_enc_frame_new (void) +{ + GstVaH264EncFrame *frame; + + frame = g_slice_new (GstVaH264EncFrame); + frame->frame_num = 0; + frame->unused_for_reference_pic_num = -1; + frame->picture = NULL; + frame->total_frame_count = 0; + frame->last_frame = FALSE; + + return frame; +} + +static void +gst_va_enc_frame_free (gpointer pframe) +{ + GstVaH264EncFrame *frame = pframe; + g_clear_pointer (&frame->picture, gst_va_encode_picture_free); + g_slice_free (GstVaH264EncFrame, frame); +} + +static inline GstVaH264EncFrame * +_enc_frame (GstVideoCodecFrame * frame) +{ + GstVaH264EncFrame *enc_frame = gst_video_codec_frame_get_user_data (frame); + g_assert (enc_frame); + return enc_frame; +} + +/* Normalizes bitrate (and CPB size) for HRD conformance */ +static void +_calculate_bitrate_hrd (GstVaH264Enc * self) +{ + guint bitrate_bits, cpb_bits_size; + + /* Round down bitrate. This is a hard limit mandated by the user */ + g_assert (SX_BITRATE >= 6); + bitrate_bits = (self->rc.max_bitrate * 1000) & ~((1U << SX_BITRATE) - 1); + GST_DEBUG_OBJECT (self, "Max bitrate: %u bits/sec", bitrate_bits); + self->rc.max_bitrate_bits = bitrate_bits; + + bitrate_bits = (self->rc.target_bitrate * 1000) & ~((1U << SX_BITRATE) - 1); + GST_DEBUG_OBJECT (self, "Target bitrate: %u bits/sec", bitrate_bits); + self->rc.target_bitrate_bits = bitrate_bits; + + if (self->rc.cpb_size > 0 && self->rc.cpb_size < (self->rc.max_bitrate / 2)) { + GST_INFO_OBJECT (self, "Too small cpb_size: %d", self->rc.cpb_size); + self->rc.cpb_size = 0; + } + + if (self->rc.cpb_size == 0) { + /* We cache 2 second coded data by default. */ + self->rc.cpb_size = self->rc.max_bitrate * 2; + GST_INFO_OBJECT (self, "Adjust cpb_size to: %d", self->rc.cpb_size); + } + + /* Round up CPB size. This is an HRD compliance detail */ + g_assert (SX_CPB_SIZE >= 4); + cpb_bits_size = (self->rc.cpb_size * 1000) & ~((1U << SX_CPB_SIZE) - 1); + + GST_DEBUG_OBJECT (self, "HRD CPB size: %u bits", cpb_bits_size); + self->rc.cpb_length_bits = cpb_bits_size; +} + +#define update_property(type, obj, old_val, new_val, prop_id) \ + gst_va_base_enc_update_property_##type (obj, old_val, new_val, propertiesprop_id) +#define update_property_uint(obj, old_val, new_val, prop_id) \ + update_property (uint, obj, old_val, new_val, prop_id) +#define update_property_bool(obj, old_val, new_val, prop_id) \ + update_property (bool, obj, old_val, new_val, prop_id) + +/* Estimates a good enough bitrate if none was supplied */ +static gboolean +_ensure_rate_control (GstVaH264Enc * self) +{ + /* User can specify the properties of: "bitrate", "target-percentage", + * "max-qp", "min-qp", "qpi", "qpp", "qpb", "mbbrc", "cpb-size", + * "rate-control" and "target-usage" to control the RC behavior. + * + * "target-usage" is different from the others, it controls the encoding + * speed and quality, while the others control encoding bit rate and + * quality. The lower value has better quality(maybe bigger MV search + * range) but slower speed, the higher value has faster speed but lower + * quality. + * + * The possible composition to control the bit rate and quality: + * + * 1. CQP mode: "rate-control=cqp", then "qpi", "qpp" and "qpb" + * specify the QP of I/P/B frames respectively(within the + * "max-qp" and "min-qp" range). The QP will not change during + * the whole stream. Other properties are ignored. + * + * 2. CBR mode: "rate-control=CBR", then the "bitrate" specify the + * target bit rate and the "cpb-size" specifies the max coded + * picture buffer size to avoid overflow. If the "bitrate" is not + * set, it is calculated by the picture resolution and frame + * rate. If "cpb-size" is not set, it is set to the size of + * caching 2 second coded data. Encoder will try its best to make + * the QP with in the "max-qp", "min-qp" range. "mbbrc" can + * enable bit rate control in macro block level. Other paramters + * are ignored. + * + * 3. VBR mode: "rate-control=VBR", then the "bitrate" specify the + * target bit rate, "target-percentage" is used to calculate the + * max bit rate of VBR mode by ("bitrate" * 100) / + * "target-percentage". It is also used by driver to calculate + * the min bit rate. The "cpb-size" specifies the max coded + * picture buffer size to avoid overflow. If the "bitrate" is not + * set, the target bit rate will be calculated by the picture + * resolution and frame rate. Encoder will try its best to make + * the QP with in the "max-qp", "min-qp" range. "mbbrc" can + * enable bit rate control in macro block level. Other paramters + * are ignored. + * + * 4. VCM mode: "rate-control=VCM", then the "bitrate" specify the + * target bit rate, and encoder will try its best to make the QP + * with in the "max-qp", "min-qp" range. Other paramters are + * ignored. + */ + + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint bitrate; + guint32 rc_ctrl, rc_mode, quality_level; + + quality_level = gst_va_encoder_get_quality_level (base->encoder, + base->profile, GST_VA_BASE_ENC_ENTRYPOINT (base)); + if (self->rc.target_usage > quality_level) { + GST_INFO_OBJECT (self, "User setting target-usage: %d is not supported, " + "fallback to %d", self->rc.target_usage, quality_level); + self->rc.target_usage = quality_level; + + update_property_uint (base, &self->prop.target_usage, self->rc.target_usage, + PROP_TARGET_USAGE); + } + + GST_OBJECT_LOCK (self); + rc_ctrl = self->prop.rc_ctrl; + GST_OBJECT_UNLOCK (self); + + if (rc_ctrl != VA_RC_NONE) { + rc_mode = gst_va_encoder_get_rate_control_mode (base->encoder, + base->profile, GST_VA_BASE_ENC_ENTRYPOINT (base)); + if (!(rc_mode & rc_ctrl)) { + guint32 defval = + G_PARAM_SPEC_ENUM (propertiesPROP_RATE_CONTROL)->default_value; + GST_INFO_OBJECT (self, "The rate control mode %s is not supported, " + "fallback to %s mode", _rate_control_get_name (rc_ctrl), + _rate_control_get_name (defval)); + self->rc.rc_ctrl_mode = defval; + + update_property_uint (base, &self->prop.rc_ctrl, self->rc.rc_ctrl_mode, + PROP_RATE_CONTROL); + } + } else { + self->rc.rc_ctrl_mode = VA_RC_NONE; + } + + if (self->rc.min_qp > self->rc.max_qp) { + GST_INFO_OBJECT (self, "The min_qp %d is bigger than the max_qp %d, " + "set it to the max_qp", self->rc.min_qp, self->rc.max_qp); + self->rc.min_qp = self->rc.max_qp; + + update_property_uint (base, &self->prop.min_qp, self->rc.min_qp, + PROP_MIN_QP); + } + + /* Make all the qp in the valid range */ + if (self->rc.qp_i < self->rc.min_qp) { + if (self->rc.qp_i != 26) + GST_INFO_OBJECT (self, "The qp_i %d is smaller than the min_qp %d, " + "set it to the min_qp", self->rc.qp_i, self->rc.min_qp); + self->rc.qp_i = self->rc.min_qp; + } + if (self->rc.qp_i > self->rc.max_qp) { + if (self->rc.qp_i != 26) + GST_INFO_OBJECT (self, "The qp_i %d is bigger than the max_qp %d, " + "set it to the max_qp", self->rc.qp_i, self->rc.max_qp); + self->rc.qp_i = self->rc.max_qp; + } + + if (self->rc.qp_p < self->rc.min_qp) { + if (self->rc.qp_p != 26) + GST_INFO_OBJECT (self, "The qp_p %d is smaller than the min_qp %d, " + "set it to the min_qp", self->rc.qp_p, self->rc.min_qp); + self->rc.qp_p = self->rc.min_qp; + } + if (self->rc.qp_p > self->rc.max_qp) { + if (self->rc.qp_p != 26) + GST_INFO_OBJECT (self, "The qp_p %d is bigger than the max_qp %d, " + "set it to the max_qp", self->rc.qp_p, self->rc.max_qp); + self->rc.qp_p = self->rc.max_qp; + } + + if (self->rc.qp_b < self->rc.min_qp) { + if (self->rc.qp_b != 26) + GST_INFO_OBJECT (self, "The qp_b %d is smaller than the min_qp %d, " + "set it to the min_qp", self->rc.qp_b, self->rc.min_qp); + self->rc.qp_b = self->rc.min_qp; + } + if (self->rc.qp_b > self->rc.max_qp) { + if (self->rc.qp_b != 26) + GST_INFO_OBJECT (self, "The qp_b %d is bigger than the max_qp %d, " + "set it to the max_qp", self->rc.qp_b, self->rc.max_qp); + self->rc.qp_b = self->rc.max_qp; + } + + GST_OBJECT_LOCK (self); + bitrate = self->prop.bitrate; + GST_OBJECT_UNLOCK (self); + + /* Calculate a bitrate is not set. */ + if ((self->rc.rc_ctrl_mode == VA_RC_CBR || self->rc.rc_ctrl_mode == VA_RC_VBR + || self->rc.rc_ctrl_mode == VA_RC_VCM) && bitrate == 0) { + /* Default compression: 48 bits per macroblock in "high-compression" mode */ + guint bits_per_mb = 48; + guint64 factor; + + /* According to the literature and testing, CABAC entropy coding + * mode could provide for +10% to +18% improvement in general, + * thus estimating +15% here ; and using adaptive 8x8 transforms + * in I-frames could bring up to +10% improvement. */ + if (!self->use_cabac) + bits_per_mb += (bits_per_mb * 15) / 100; + if (!self->use_dct8x8) + bits_per_mb += (bits_per_mb * 10) / 100; + + factor = (guint64) self->mb_width * self->mb_height * bits_per_mb; + bitrate = gst_util_uint64_scale (factor, + GST_VIDEO_INFO_FPS_N (&base->input_state->info), + GST_VIDEO_INFO_FPS_D (&base->input_state->info)) / 1000; + GST_INFO_OBJECT (self, "target bitrate computed to %u kbps", bitrate); + } + + /* Adjust the setting based on RC mode. */ + switch (self->rc.rc_ctrl_mode) { + case VA_RC_NONE: + case VA_RC_CQP: + self->rc.max_bitrate = 0; + self->rc.target_bitrate = 0; + self->rc.target_percentage = 0; + self->rc.cpb_size = 0; + break; + case VA_RC_CBR: + self->rc.max_bitrate = bitrate; + self->rc.target_bitrate = bitrate; + self->rc.target_percentage = 100; + self->rc.qp_i = self->rc.qp_p = self->rc.qp_b = 26; + break; + case VA_RC_VBR: + g_assert (self->rc.target_percentage >= 10); + self->rc.max_bitrate = (guint) gst_util_uint64_scale_int (bitrate, + 100, self->rc.target_percentage); + self->rc.target_bitrate = bitrate; + self->rc.qp_i = self->rc.qp_p = self->rc.qp_b = 26; + break; + case VA_RC_VCM: + self->rc.max_bitrate = bitrate; + self->rc.target_bitrate = bitrate; + self->rc.target_percentage = 0; + self->rc.qp_i = self->rc.qp_p = self->rc.qp_b = 26; + self->rc.cpb_size = 0; + + if (self->gop.num_bframes > 0) { + GST_INFO_OBJECT (self, "VCM mode just support I/P mode, no B frame"); + self->gop.num_bframes = 0; + self->gop.b_pyramid = FALSE; + } + break; + default: + GST_WARNING_OBJECT (self, "Unsupported rate control"); + return FALSE; + break; + } + + GST_DEBUG_OBJECT (self, "Max bitrate: %u bits/sec, " + "Target bitrate: %u bits/sec", self->rc.max_bitrate, + self->rc.target_bitrate); + + if (self->rc.rc_ctrl_mode != VA_RC_NONE && self->rc.rc_ctrl_mode != VA_RC_CQP) + _calculate_bitrate_hrd (self); + + /* update & notifications */ + update_property_uint (base, &self->prop.bitrate, bitrate, PROP_BITRATE); + update_property_uint (base, &self->prop.cpb_size, self->rc.cpb_size, + PROP_CPB_SIZE); + update_property_uint (base, &self->prop.target_percentage, + self->rc.target_percentage, PROP_TARGET_PERCENTAGE); + update_property_uint (base, &self->prop.qp_i, self->rc.qp_i, PROP_QP_I); + update_property_uint (base, &self->prop.qp_p, self->rc.qp_p, PROP_QP_P); + update_property_uint (base, &self->prop.qp_b, self->rc.qp_b, PROP_QP_B); + + return TRUE; +} + +static guint +_get_h264_cpb_nal_factor (VAProfile profile) +{ + guint f; + + /* Table A-2 */ + switch (profile) { + case VAProfileH264High: + f = 1500; + break; + case VAProfileH264ConstrainedBaseline: + case VAProfileH264Main: + f = 1200; + break; + case VAProfileH264MultiviewHigh: + case VAProfileH264StereoHigh: + f = 1500; /* H.10.2.1 (r) */ + break; + default: + g_assert_not_reached (); + f = 1200; + break; + } + return f; +} + +/* Derives the level from the currently set limits */ +static gboolean +_calculate_level (GstVaH264Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + const guint cpb_factor = _get_h264_cpb_nal_factor (base->profile); + guint i, PicSizeMbs, MaxDpbMbs, MaxMBPS; + + PicSizeMbs = self->mb_width * self->mb_height; + MaxDpbMbs = PicSizeMbs * (self->gop.num_ref_frames + 1); + MaxMBPS = gst_util_uint64_scale_int_ceil (PicSizeMbs, + GST_VIDEO_INFO_FPS_N (&base->input_state->info), + GST_VIDEO_INFO_FPS_D (&base->input_state->info)); + + for (i = 0; i < G_N_ELEMENTS (_va_h264_level_limits); i++) { + const GstVaH264LevelLimits *const limits = &_va_h264_level_limitsi; + if (PicSizeMbs <= limits->MaxFS && MaxDpbMbs <= limits->MaxDpbMbs + && MaxMBPS <= limits->MaxMBPS && (!self->rc.max_bitrate_bits + || self->rc.max_bitrate_bits <= (limits->MaxBR * 1000 * cpb_factor)) + && (!self->rc.cpb_length_bits + || self->rc.cpb_length_bits <= + (limits->MaxCPB * 1000 * cpb_factor))) { + + self->level_idc = _va_h264_level_limitsi.level_idc; + self->level_str = _va_h264_level_limitsi.name; + self->min_cr = _va_h264_level_limitsi.MinCR; + + return TRUE; + } + } + + GST_ERROR_OBJECT (self, + "failed to find a suitable level matching codec config"); + return FALSE; +} + +static void +_validate_parameters (GstVaH264Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + gint32 max_slices; + + /* Ensure the num_slices provided by the user not exceed the limit + * of the number of slices permitted by the stream and by the + * hardware. */ + g_assert (self->num_slices >= 1); + max_slices = gst_va_encoder_get_max_slice_num (base->encoder, + base->profile, GST_VA_BASE_ENC_ENTRYPOINT (base)); + if (self->num_slices > max_slices) + self->num_slices = max_slices; + /* The stream size limit. */ + if (self->num_slices > ((self->mb_width * self->mb_height + 1) / 2)) + self->num_slices = ((self->mb_width * self->mb_height + 1) / 2); + + update_property_uint (base, &self->prop.num_slices, + self->num_slices, PROP_NUM_SLICES); + + /* Ensure trellis. */ + if (self->use_trellis && + !gst_va_encoder_has_trellis (base->encoder, base->profile, + GST_VA_BASE_ENC_ENTRYPOINT (base))) { + GST_INFO_OBJECT (self, "The trellis is not supported"); + self->use_trellis = FALSE; + } + + update_property_bool (base, &self->prop.use_trellis, self->use_trellis, + PROP_TRELLIS); +} + +/* Get log2_max_frame_num_minus4, log2_max_pic_order_cnt_lsb_minus4 + * value, shall be in the range of 0 to 12, inclusive. */ +static guint +_get_log2_max_num (guint num) +{ + guint ret = 0; + + while (num) { + ++ret; + num >>= 1; + } + + /* shall be in the range of 0+4 to 12+4, inclusive. */ + if (ret < 4) { + ret = 4; + } else if (ret > 16) { + ret = 16; + } + return ret; +} + +static void +_print_gop_structure (GstVaH264Enc * self) +{ +#ifndef GST_DISABLE_GST_DEBUG + GString *str; + gint i; + + if (gst_debug_category_get_threshold (GST_CAT_DEFAULT) < GST_LEVEL_INFO) + return; + + str = g_string_new (NULL); + + g_string_append_printf (str, " "); + + for (i = 0; i < self->gop.idr_period; i++) { + if (i == 0) { + g_string_append_printf (str, "IDR"); + continue; + } else { + g_string_append_printf (str, ", "); + } + + g_string_append_printf (str, "%s", + _slice_type_name (self->gop.frame_typesi.slice_type)); + + if (self->gop.b_pyramid + && self->gop.frame_typesi.slice_type == GST_H264_B_SLICE) { + g_string_append_printf (str, "<L%d (%d, %d)>", + self->gop.frame_typesi.pyramid_level, + self->gop.frame_typesi.left_ref_poc_diff, + self->gop.frame_typesi.right_ref_poc_diff); + } + + if (self->gop.frame_typesi.is_ref) { + g_string_append_printf (str, "(ref)"); + } + + } + + g_string_append_printf (str, " "); + + GST_INFO_OBJECT (self, "GOP size: %d, forward reference %d, backward" + " reference %d, GOP structure: %s", self->gop.idr_period, + self->gop.ref_num_list0, self->gop.ref_num_list1, str->str); + + g_string_free (str, TRUE); +#endif +} + +struct PyramidInfo +{ + guint level; + gint left_ref_poc_diff; + gint right_ref_poc_diff; +}; + +static void +_set_pyramid_info (struct PyramidInfo *info, guint len, + guint current_level, guint highest_level) +{ + guint index; + + g_assert (len >= 1); + + if (current_level == highest_level || len == 1) { + for (index = 0; index < len; index++) { + infoindex.level = current_level; + infoindex.left_ref_poc_diff = (index + 1) * -2; + infoindex.right_ref_poc_diff = (len - index) * 2; + } + + return; + } + + index = len / 2; + infoindex.level = current_level; + infoindex.left_ref_poc_diff = (index + 1) * -2; + infoindex.right_ref_poc_diff = (len - index) * 2; + + current_level++; + + if (index > 0) + _set_pyramid_info (info, index, current_level, highest_level); + + if (index + 1 < len) + _set_pyramid_info (&infoindex + 1, len - (index + 1), + current_level, highest_level); +} + +static void +_create_gop_frame_types (GstVaH264Enc * self) +{ + guint i; + guint i_frames = self->gop.num_iframes; + struct PyramidInfo pyramid_info31 = { 0, }; + + if (self->gop.highest_pyramid_level > 0) { + g_assert (self->gop.num_bframes > 0); + _set_pyramid_info (pyramid_info, self->gop.num_bframes, + 0, self->gop.highest_pyramid_level); + } + + g_assert (self->gop.idr_period <= MAX_GOP_SIZE); + for (i = 0; i < self->gop.idr_period; i++) { + if (i == 0) { + self->gop.frame_typesi.slice_type = GST_H264_I_SLICE; + self->gop.frame_typesi.is_ref = TRUE; + continue; + } + + /* Intra only stream. */ + if (self->gop.ip_period == 0) { + self->gop.frame_typesi.slice_type = GST_H264_I_SLICE; + self->gop.frame_typesi.is_ref = FALSE; + continue; + } + + if (i % self->gop.ip_period) { + guint pyramid_index = + i % self->gop.ip_period - 1 /* The first P or IDR */ ; + + self->gop.frame_typesi.slice_type = GST_H264_B_SLICE; + self->gop.frame_typesi.pyramid_level = + pyramid_infopyramid_index.level; + self->gop.frame_typesi.is_ref = + (self->gop.frame_typesi.pyramid_level < + self->gop.highest_pyramid_level); + self->gop.frame_typesi.left_ref_poc_diff = + pyramid_infopyramid_index.left_ref_poc_diff; + self->gop.frame_typesi.right_ref_poc_diff = + pyramid_infopyramid_index.right_ref_poc_diff; + continue; + } + + if (self->gop.i_period && i % self->gop.i_period == 0 && i_frames > 0) { + /* Replace P with I. */ + self->gop.frame_typesi.slice_type = GST_H264_I_SLICE; + self->gop.frame_typesi.is_ref = TRUE; + i_frames--; + continue; + } + + self->gop.frame_typesi.slice_type = GST_H264_P_SLICE; + self->gop.frame_typesi.is_ref = TRUE; + } + + /* Force the last one to be a P */ + if (self->gop.idr_period > 1 && self->gop.ip_period > 0) { + self->gop.frame_typesself->gop.idr_period - 1.slice_type = + GST_H264_P_SLICE; + self->gop.frame_typesself->gop.idr_period - 1.is_ref = TRUE; + } +} + +/* Consider the idr_period, num_bframes, L0/L1 reference number. + * TODO: Load some preset fixed GOP structure. + * TODO: Skip this if in lookahead mode. */ +static void +_generate_gop_structure (GstVaH264Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint32 list0, list1, gop_ref_num; + gint32 p_frames; + + /* If not set, generate a idr every second */ + if (self->gop.idr_period == 0) { + self->gop.idr_period = (GST_VIDEO_INFO_FPS_N (&base->input_state->info) + + GST_VIDEO_INFO_FPS_D (&base->input_state->info) - 1) / + GST_VIDEO_INFO_FPS_D (&base->input_state->info); + } + + /* Do not use a too huge GOP size. */ + if (self->gop.idr_period > 1024) { + self->gop.idr_period = 1024; + GST_INFO_OBJECT (self, "Lowering the GOP size to %d", self->gop.idr_period); + } + + update_property_uint (base, &self->prop.key_int_max, self->gop.idr_period, + PROP_KEY_INT_MAX); + + /* Prefer have more than 1 refs for the GOP which is not very small. */ + if (self->gop.idr_period > 8) { + if (self->gop.num_bframes > (self->gop.idr_period - 1) / 2) { + self->gop.num_bframes = (self->gop.idr_period - 1) / 2; + GST_INFO_OBJECT (self, "Lowering the number of num_bframes to %d", + self->gop.num_bframes); + } + } else { + /* beign and end should be ref */ + if (self->gop.num_bframes > self->gop.idr_period - 1 - 1) { + if (self->gop.idr_period > 1) { + self->gop.num_bframes = self->gop.idr_period - 1 - 1; + } else { + self->gop.num_bframes = 0; + } + GST_INFO_OBJECT (self, "Lowering the number of num_bframes to %d", + self->gop.num_bframes); + } + } + + if (!gst_va_encoder_get_max_num_reference (base->encoder, base->profile, + GST_VA_BASE_ENC_ENTRYPOINT (base), &list0, &list1)) { + GST_INFO_OBJECT (self, "Failed to get the max num reference"); + list0 = 1; + list1 = 0; + } + + if (list0 > self->gop.num_ref_frames) + list0 = self->gop.num_ref_frames; + if (list1 > self->gop.num_ref_frames) + list1 = self->gop.num_ref_frames; + + if (list0 == 0) { + GST_INFO_OBJECT (self, + "No reference support, fallback to intra only stream"); + + /* It does not make sense that if only the list1 exists. */ + self->gop.num_ref_frames = 0; + + self->gop.ip_period = 0; + self->gop.num_bframes = 0; + self->gop.b_pyramid = FALSE; + self->gop.highest_pyramid_level = 0; + self->gop.num_iframes = self->gop.idr_period - 1 /* The idr */ ; + self->gop.ref_num_list0 = 0; + self->gop.ref_num_list1 = 0; + goto create_poc; + } + + if (self->gop.num_ref_frames <= 1) { + GST_INFO_OBJECT (self, "The number of reference frames is only %d," + " no B frame allowed, fallback to I/P mode", self->gop.num_ref_frames); + self->gop.num_bframes = 0; + list1 = 0; + } + + /* b_pyramid needs at least 1 ref for B, besides the I/P */ + if (self->gop.b_pyramid && self->gop.num_ref_frames <= 2) { + GST_INFO_OBJECT (self, "The number of reference frames is only %d," + " not enough for b_pyramid", self->gop.num_ref_frames); + self->gop.b_pyramid = FALSE; + } + + if (list1 == 0 && self->gop.num_bframes > 0) { + GST_INFO_OBJECT (self, + "No hw reference support for list 1, fallback to I/P mode"); + self->gop.num_bframes = 0; + self->gop.b_pyramid = FALSE; + } + + /* I/P mode, no list1 needed. */ + if (self->gop.num_bframes == 0) + list1 = 0; + + /* Not enough B frame, no need for b_pyramid. */ + if (self->gop.num_bframes <= 1) + self->gop.b_pyramid = FALSE; + + /* b pyramid has only one backward ref. */ + if (self->gop.b_pyramid) + list1 = 1; + + if (self->gop.num_ref_frames > list0 + list1) { + self->gop.num_ref_frames = list0 + list1; + GST_INFO_OBJECT (self, "HW limits, lowering the number of reference" + " frames to %d", self->gop.num_ref_frames); + } + + /* How many possible refs within a GOP. */ + gop_ref_num = (self->gop.idr_period + self->gop.num_bframes) / + (self->gop.num_bframes + 1); + /* The end ref */ + if (self->gop.num_bframes > 0 + /* frame_num % (self->gop.num_bframes + 1) happens to be the end P */ + && (self->gop.idr_period % (self->gop.num_bframes + 1) != 1)) + gop_ref_num++; + + /* Adjust reference num based on B frames and B pyramid. */ + if (self->gop.num_bframes == 0) { + self->gop.b_pyramid = FALSE; + self->gop.ref_num_list0 = self->gop.num_ref_frames; + self->gop.ref_num_list1 = 0; + } else if (self->gop.b_pyramid) { + guint b_frames = self->gop.num_bframes; + guint b_refs; + + /* b pyramid has only one backward ref. */ + g_assert (list1 == 1); + self->gop.ref_num_list1 = list1; + self->gop.ref_num_list0 = + self->gop.num_ref_frames - self->gop.ref_num_list1; + + b_frames = b_frames / 2; + b_refs = 0; + while (b_frames) { + /* At least 1 B ref for each level, plus begin and end 2 P/I */ + b_refs += 1; + if (b_refs + 2 > self->gop.num_ref_frames) + break; + + self->gop.highest_pyramid_level++; + b_frames = b_frames / 2; + } + + GST_INFO_OBJECT (self, "pyramid level is %d", + self->gop.highest_pyramid_level); + } else { + /* We prefer list0. Backward refs have more latency. */ + self->gop.ref_num_list1 = 1; + self->gop.ref_num_list0 = + self->gop.num_ref_frames - self->gop.ref_num_list1; + /* Balance the forward and backward refs, but not cause a big latency. */ + while ((self->gop.num_bframes * self->gop.ref_num_list1 <= 16) + && (self->gop.ref_num_list1 <= gop_ref_num) + && (self->gop.ref_num_list1 < list1) + && (self->gop.ref_num_list0 / self->gop.ref_num_list1 > 4)) { + self->gop.ref_num_list0--; + self->gop.ref_num_list1++; + } + + if (self->gop.ref_num_list0 > list0) + self->gop.ref_num_list0 = list0; + } + + /* It's OK, keep slots for GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME frame. */ + if (self->gop.ref_num_list0 > gop_ref_num) + GST_DEBUG_OBJECT (self, "num_ref_frames %d is bigger than gop_ref_num %d", + self->gop.ref_num_list0, gop_ref_num); + + /* Include the ref picture itself. */ + self->gop.ip_period = 1 + self->gop.num_bframes; + + p_frames = gop_ref_num - 1 /* IDR */ ; + if (p_frames < 0) + p_frames = 0; + if (self->gop.num_iframes > p_frames) { + self->gop.num_iframes = p_frames; + GST_INFO_OBJECT (self, "Too many I frames insertion, lowering it to %d", + self->gop.num_iframes); + } + + if (self->gop.num_iframes > 0) { + guint total_i_frames = self->gop.num_iframes + 1 /* IDR */ ; + self->gop.i_period = + (gop_ref_num / total_i_frames) * (self->gop.num_bframes + 1); + } + +create_poc: + /* init max_frame_num, max_poc */ + self->gop.log2_max_frame_num = _get_log2_max_num (self->gop.idr_period); + self->gop.max_frame_num = (1 << self->gop.log2_max_frame_num); + self->gop.log2_max_pic_order_cnt = self->gop.log2_max_frame_num + 1; + self->gop.max_pic_order_cnt = (1 << self->gop.log2_max_pic_order_cnt); + self->gop.num_reorder_frames = self->gop.b_pyramid ? + self->gop.highest_pyramid_level * 2 + 1 /* the last P frame. */ : + self->gop.ref_num_list1; + /* Should not exceed the max ref num. */ + self->gop.num_reorder_frames = + MIN (self->gop.num_reorder_frames, self->gop.num_ref_frames); + self->gop.num_reorder_frames = MIN (self->gop.num_reorder_frames, 16); + + _create_gop_frame_types (self); + _print_gop_structure (self); + + /* updates & notifications */ + update_property_uint (base, &self->prop.num_ref_frames, + self->gop.num_ref_frames, PROP_NUM_REF_FRAMES); + update_property_uint (base, &self->prop.num_iframes, self->gop.num_iframes, + PROP_IFRAMES); +} + +static void +_calculate_coded_size (GstVaH264Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint codedbuf_size = 0; + + if (base->profile == VAProfileH264High + || base->profile == VAProfileH264MultiviewHigh + || base->profile == VAProfileH264StereoHigh) { + /* The number of bits of macroblock_layer( ) data for any macroblock + is not greater than 128 + RawMbBits */ + guint RawMbBits = 0; + guint BitDepthY = 8; + guint BitDepthC = 8; + guint MbWidthC = 8; + guint MbHeightC = 8; + + switch (base->rt_format) { + case VA_RT_FORMAT_YUV420: + BitDepthY = 8; + BitDepthC = 8; + MbWidthC = 8; + MbHeightC = 8; + break; + case VA_RT_FORMAT_YUV422: + BitDepthY = 8; + BitDepthC = 8; + MbWidthC = 8; + MbHeightC = 16; + break; + case VA_RT_FORMAT_YUV444: + BitDepthY = 8; + BitDepthC = 8; + MbWidthC = 16; + MbHeightC = 16; + break; + case VA_RT_FORMAT_YUV400: + BitDepthY = 8; + BitDepthC = 0; + MbWidthC = 0; + MbHeightC = 0; + break; + case VA_RT_FORMAT_YUV420_10: + BitDepthY = 10; + BitDepthC = 10; + MbWidthC = 8; + MbHeightC = 8; + case VA_RT_FORMAT_YUV422_10: + BitDepthY = 10; + BitDepthC = 10; + MbWidthC = 8; + MbHeightC = 16; + case VA_RT_FORMAT_YUV444_10: + BitDepthY = 10; + BitDepthC = 10; + MbWidthC = 16; + MbHeightC = 16; + break; + default: + g_assert_not_reached (); + break; + } + + /* The variable RawMbBits is derived as + * RawMbBits = 256 * BitDepthY + 2 * MbWidthC * MbHeightC * BitDepthC */ + RawMbBits = 256 * BitDepthY + 2 * MbWidthC * MbHeightC * BitDepthC; + codedbuf_size = (self->mb_width * self->mb_height) * (128 + RawMbBits) / 8; + } else { + /* The number of bits of macroblock_layer( ) data for any macroblock + * is not greater than 3200 */ + codedbuf_size = (self->mb_width * self->mb_height) * (3200 / 8); + } + + /* Account for SPS header */ + /* XXX: exclude scaling lists, MVC/SVC extensions */ + codedbuf_size += 4 /* start code */ + GST_ROUND_UP_8 (MAX_SPS_HDR_SIZE + + MAX_VUI_PARAMS_SIZE + 2 * MAX_HRD_PARAMS_SIZE) / 8; + + /* Account for PPS header */ + /* XXX: exclude slice groups, scaling lists, MVC/SVC extensions */ + codedbuf_size += 4 + GST_ROUND_UP_8 (MAX_PPS_HDR_SIZE) / 8; + + /* Account for slice header */ + codedbuf_size += + self->num_slices * (4 + GST_ROUND_UP_8 (MAX_SLICE_HDR_SIZE) / 8); + + /* Add 5% for safety */ + base->codedbuf_size = (guint) ((gfloat) codedbuf_size * 1.05); + + GST_DEBUG_OBJECT (self, "Calculate codedbuf size: %u", base->codedbuf_size); +} + +static guint +_get_rtformat (GstVaH264Enc * self, GstVideoFormat format) +{ + guint chroma; + + chroma = gst_va_chroma_from_video_format (format); + + /* Check whether the rtformat is supported. */ + if (chroma != VA_RT_FORMAT_YUV420) { + GST_ERROR_OBJECT (self, "Unsupported chroma for video format: %s", + gst_video_format_to_string (format)); + return 0; + } + + return chroma; +} + +static gboolean +_init_packed_headers (GstVaH264Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint32 packed_headers; + guint32 desired_packed_headers = VA_ENC_PACKED_HEADER_SEQUENCE /* SPS */ + | VA_ENC_PACKED_HEADER_PICTURE /* PPS */ + | VA_ENC_PACKED_HEADER_SLICE /* Slice headers */ + | VA_ENC_PACKED_HEADER_RAW_DATA; /* SEI, AUD, etc. */ + + self->packed_headers = 0; + + if (!gst_va_encoder_get_packed_headers (base->encoder, base->profile, + GST_VA_BASE_ENC_ENTRYPOINT (base), &packed_headers)) + return FALSE; + + if (desired_packed_headers & ~packed_headers) { + GST_INFO_OBJECT (self, "Driver does not support some wanted packed headers " + "(wanted %#x, found %#x)", desired_packed_headers, packed_headers); + } + + self->packed_headers = desired_packed_headers & packed_headers; + + return TRUE; +} + + +static gboolean +_decide_profile (GstVaH264Enc * self, VAProfile * _profile, guint * _rt_format) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + gboolean ret = FALSE; + GstVideoFormat in_format; + VAProfile profile; + guint rt_format; + GstCaps *allowed_caps = NULL; + guint num_structures, i; + GstStructure *structure; + const GValue *v_profile; + GPtrArray *candidates = NULL; + gchar *profile_name; + + candidates = g_ptr_array_new_with_free_func (g_free); + + /* First, check whether the downstream requires a specified profile. */ + allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (base)); + if (!allowed_caps) + allowed_caps = gst_pad_query_caps (GST_VIDEO_ENCODER_SRC_PAD (base), NULL); + + if (allowed_caps && !gst_caps_is_empty (allowed_caps)) { + num_structures = gst_caps_get_size (allowed_caps); + for (i = 0; i < num_structures; i++) { + structure = gst_caps_get_structure (allowed_caps, i); + v_profile = gst_structure_get_value (structure, "profile"); + if (!v_profile) + continue; + + if (G_VALUE_HOLDS_STRING (v_profile)) { + profile_name = g_strdup (g_value_get_string (v_profile)); + g_ptr_array_add (candidates, profile_name); + } else if (GST_VALUE_HOLDS_LIST (v_profile)) { + guint j; + + for (j = 0; j < gst_value_list_get_size (v_profile); j++) { + const GValue *p = gst_value_list_get_value (v_profile, j); + if (!p) + continue; + + profile_name = g_strdup (g_value_get_string (p)); + g_ptr_array_add (candidates, profile_name); + } + } + } + } + + if (candidates->len == 0) { + GST_ERROR_OBJECT (self, "No available profile in caps"); + ret = FALSE; + goto out; + } + + in_format = GST_VIDEO_INFO_FORMAT (&base->input_state->info); + rt_format = _get_rtformat (self, in_format); + if (!rt_format) { + GST_ERROR_OBJECT (self, "unsupported video format %s", + gst_video_format_to_string (in_format)); + ret = FALSE; + goto out; + } + + /* Find the suitable profile by features and check the HW + * support. */ + ret = FALSE; + for (i = 0; i < candidates->len; i++) { + profile_name = g_ptr_array_index (candidates, i); + + /* dct8x8 require at least high profile. */ + if (self->use_dct8x8) { + if (!g_strstr_len (profile_name, -1, "high")) + continue; + } + + /* cabac require at least main profile. */ + if (self->use_cabac) { + if (!g_strstr_len (profile_name, -1, "main") + && !g_strstr_len (profile_name, -1, "high")) + continue; + } + + /* baseline only support I/P mode. */ + if (self->gop.num_bframes > 0) { + if (g_strstr_len (profile_name, -1, "baseline")) + continue; + } + + profile = gst_va_profile_from_name (H264, profile_name); + if (profile == VAProfileNone) + continue; + + if (!gst_va_encoder_has_profile (base->encoder, profile)) + continue; + + if ((rt_format & gst_va_encoder_get_rtformat (base->encoder, + profile, GST_VA_BASE_ENC_ENTRYPOINT (base))) == 0) + continue; + + *_profile = profile; + *_rt_format = rt_format; + ret = TRUE; + goto out; + } + + /* Just use the first HW available profile and disable features if + * needed. */ + profile_name = NULL; + for (i = 0; i < candidates->len; i++) { + profile_name = g_ptr_array_index (candidates, i); + profile = gst_va_profile_from_name (H264, profile_name); + if (profile == VAProfileNone) + continue; + + if (!gst_va_encoder_has_profile (base->encoder, profile)) + continue; + + if ((rt_format & gst_va_encoder_get_rtformat (base->encoder, + profile, GST_VA_BASE_ENC_ENTRYPOINT (base))) == 0) + continue; + + *_profile = profile; + *_rt_format = rt_format; + ret = TRUE; + } + + if (ret == FALSE) + goto out; + + if (self->use_dct8x8 && !g_strstr_len (profile_name, -1, "high")) { + GST_INFO_OBJECT (self, "Disable dct8x8, profile %s does not support it", + gst_va_profile_name (profile)); + self->use_dct8x8 = FALSE; + update_property_bool (base, &self->prop.use_dct8x8, self->use_dct8x8, + PROP_DCT8X8); + } + + if (self->use_cabac && (!g_strstr_len (profile_name, -1, "main") + && !g_strstr_len (profile_name, -1, "high"))) { + GST_INFO_OBJECT (self, "Disable cabac, profile %s does not support it", + gst_va_profile_name (profile)); + self->use_cabac = FALSE; + update_property_bool (base, &self->prop.use_cabac, self->use_cabac, + PROP_CABAC); + } + + if (self->gop.num_bframes > 0 && g_strstr_len (profile_name, -1, "baseline")) { + GST_INFO_OBJECT (self, "No B frames, profile %s does not support it", + gst_va_profile_name (profile)); + self->gop.num_bframes = 0; + self->gop.b_pyramid = 0; + } + +out: + g_clear_pointer (&candidates, g_ptr_array_unref); + g_clear_pointer (&allowed_caps, gst_caps_unref); + + if (ret) { + GST_INFO_OBJECT (self, "Select the profile %s", + gst_va_profile_name (profile)); + } else { + GST_ERROR_OBJECT (self, "Failed to find an available profile"); + } + + return ret; +} + +/* Clear all the info of last reconfig and set the fields based on + * property. The reconfig may change these fields because of the + * profile/level and HW limitation. */ +static void +gst_va_h264_enc_reset_state (GstVaBaseEnc * base) +{ + GstVaH264Enc *self = GST_VA_H264_ENC (base); + + GST_VA_BASE_ENC_CLASS (parent_class)->reset_state (base); + + GST_OBJECT_LOCK (self); + self->use_cabac = self->prop.use_cabac; + self->use_dct8x8 = self->prop.use_dct8x8; + self->use_trellis = self->prop.use_trellis; + self->aud = self->prop.aud; + self->cc = self->prop.cc; + self->num_slices = self->prop.num_slices; + + self->gop.idr_period = self->prop.key_int_max; + self->gop.num_bframes = self->prop.num_bframes; + self->gop.b_pyramid = self->prop.b_pyramid; + self->gop.num_iframes = self->prop.num_iframes; + self->gop.num_ref_frames = self->prop.num_ref_frames; + + self->rc.rc_ctrl_mode = self->prop.rc_ctrl; + self->rc.min_qp = self->prop.min_qp; + self->rc.max_qp = self->prop.max_qp; + self->rc.qp_i = self->prop.qp_i; + self->rc.qp_p = self->prop.qp_p; + self->rc.qp_b = self->prop.qp_b; + self->rc.mbbrc = self->prop.mbbrc; + + self->rc.target_percentage = self->prop.target_percentage; + self->rc.target_usage = self->prop.target_usage; + self->rc.cpb_size = self->prop.cpb_size; + GST_OBJECT_UNLOCK (self); + + self->level_idc = 0; + self->level_str = NULL; + self->mb_width = 0; + self->mb_height = 0; + + self->gop.i_period = 0; + self->gop.total_idr_count = 0; + self->gop.ip_period = 0; + self->gop.highest_pyramid_level = 0; + memset (self->gop.frame_types, 0, sizeof (self->gop.frame_types)); + self->gop.cur_frame_index = 0; + self->gop.cur_frame_num = 0; + self->gop.max_frame_num = 0; + self->gop.log2_max_frame_num = 0; + self->gop.max_pic_order_cnt = 0; + self->gop.log2_max_pic_order_cnt = 0; + self->gop.ref_num_list0 = 0; + self->gop.ref_num_list1 = 0; + self->gop.num_reorder_frames = 0; + + self->rc.max_bitrate = 0; + self->rc.target_bitrate = 0; + self->rc.max_bitrate_bits = 0; + self->rc.target_bitrate_bits = 0; + self->rc.cpb_length_bits = 0; + + memset (&self->sequence_hdr, 0, sizeof (GstH264SPS)); +} + +static gboolean +gst_va_h264_enc_reconfig (GstVaBaseEnc * base) +{ + GstVideoEncoder *venc = GST_VIDEO_ENCODER (base); + GstVaH264Enc *self = GST_VA_H264_ENC (base); + GstCaps *out_caps, *reconf_caps = NULL; + GstVideoCodecState *output_state = NULL; + GstVideoFormat format, reconf_format = GST_VIDEO_FORMAT_UNKNOWN; + VAProfile profile = VAProfileNone; + gboolean do_renegotiation = TRUE, do_reopen, need_negotiation; + guint max_ref_frames, max_surfaces = 0, rt_format = 0, codedbuf_size; + gint width, height; + + width = GST_VIDEO_INFO_WIDTH (&base->input_state->info); + height = GST_VIDEO_INFO_HEIGHT (&base->input_state->info); + format = GST_VIDEO_INFO_FORMAT (&base->input_state->info); + codedbuf_size = base->codedbuf_size; + + need_negotiation = + !gst_va_encoder_get_reconstruct_pool_config (base->encoder, &reconf_caps, + &max_surfaces); + if (!need_negotiation && reconf_caps) { + GstVideoInfo vi; + if (!gst_video_info_from_caps (&vi, reconf_caps)) + return FALSE; + reconf_format = GST_VIDEO_INFO_FORMAT (&vi); + } + + if (!_decide_profile (self, &profile, &rt_format)) + return FALSE; + + /* first check */ + do_reopen = !(base->profile == profile && base->rt_format == rt_format + && format == reconf_format && width == base->width + && height == base->height && self->prop.rc_ctrl == self->rc.rc_ctrl_mode); + + if (do_reopen && gst_va_encoder_is_open (base->encoder)) + gst_va_encoder_close (base->encoder); + + gst_va_base_enc_reset_state (base); + + base->profile = profile; + base->rt_format = rt_format; + base->width = width; + base->height = height; + + self->mb_width = GST_ROUND_UP_16 (base->width) / 16; + self->mb_height = GST_ROUND_UP_16 (base->height) / 16; + + /* Frame rate is needed for rate control and PTS setting. */ + if (GST_VIDEO_INFO_FPS_N (&base->input_state->info) == 0 + || GST_VIDEO_INFO_FPS_D (&base->input_state->info) == 0) { + GST_INFO_OBJECT (self, "Unknown framerate, just set to 30 fps"); + GST_VIDEO_INFO_FPS_N (&base->input_state->info) = 30; + GST_VIDEO_INFO_FPS_D (&base->input_state->info) = 1; + } + base->frame_duration = gst_util_uint64_scale (GST_SECOND, + GST_VIDEO_INFO_FPS_D (&base->input_state->info), + GST_VIDEO_INFO_FPS_N (&base->input_state->info)); + + GST_DEBUG_OBJECT (self, "resolution:%dx%d, MB size: %dx%d," + " frame duration is %" GST_TIME_FORMAT, + base->width, base->height, self->mb_width, self->mb_height, + GST_TIME_ARGS (base->frame_duration)); + + _validate_parameters (self); + + if (!_ensure_rate_control (self)) + return FALSE; + + if (!_calculate_level (self)) + return FALSE; + + _generate_gop_structure (self); + + _calculate_coded_size (self); + + /* updates & notifications */ + /* num_bframes are modified several times before */ + update_property_uint (base, &self->prop.num_bframes, self->gop.num_bframes, + PROP_BFRAMES); + update_property_bool (base, &self->prop.b_pyramid, self->gop.b_pyramid, + PROP_B_PYRAMID); + + if (!_init_packed_headers (self)) + return FALSE; + + self->aud = self->aud && self->packed_headers & VA_ENC_PACKED_HEADER_RAW_DATA; + update_property_bool (base, &self->prop.aud, self->aud, PROP_AUD); + + self->cc = self->cc && self->packed_headers & VA_ENC_PACKED_HEADER_RAW_DATA; + update_property_bool (base, &self->prop.cc, self->cc, PROP_CC); + + max_ref_frames = self->gop.num_ref_frames + 3 /* scratch frames */ ; + + /* second check after calculations */ + do_reopen |= + !(max_ref_frames == max_surfaces && codedbuf_size == base->codedbuf_size); + if (do_reopen && gst_va_encoder_is_open (base->encoder)) + gst_va_encoder_close (base->encoder); + + if (!gst_va_encoder_is_open (base->encoder) + && !gst_va_encoder_open (base->encoder, base->profile, + format, base->rt_format, base->width, base->height, + base->codedbuf_size, max_ref_frames, self->rc.rc_ctrl_mode, + self->packed_headers)) { + GST_ERROR_OBJECT (self, "Failed to open the VA encoder."); + return FALSE; + } + + /* Add some tags */ + gst_va_base_enc_add_codec_tag (base, "H264"); + + out_caps = gst_va_profile_caps (base->profile); + g_assert (out_caps); + out_caps = gst_caps_fixate (out_caps); + + if (self->level_str) + gst_caps_set_simple (out_caps, "level", G_TYPE_STRING, self->level_str, + NULL); + + gst_caps_set_simple (out_caps, "width", G_TYPE_INT, base->width, + "height", G_TYPE_INT, base->height, "alignment", G_TYPE_STRING, "au", + "stream-format", G_TYPE_STRING, "byte-stream", NULL); + + if (!need_negotiation) { + output_state = gst_video_encoder_get_output_state (venc); + do_renegotiation = TRUE; + if (output_state) { + do_renegotiation = !gst_caps_is_subset (output_state->caps, out_caps); + gst_video_codec_state_unref (output_state); + } + if (!do_renegotiation) { + gst_caps_unref (out_caps); + return TRUE; + } + } + + GST_DEBUG_OBJECT (self, "output caps is %" GST_PTR_FORMAT, out_caps); + + output_state = + gst_video_encoder_set_output_state (venc, out_caps, base->input_state); + gst_video_codec_state_unref (output_state); + + if (!gst_video_encoder_negotiate (venc)) { + GST_ERROR_OBJECT (self, "Failed to negotiate with the downstream"); + return FALSE; + } + + return TRUE; +} + +static gboolean +_push_one_frame (GstVaBaseEnc * base, GstVideoCodecFrame * gst_frame, + gboolean last) +{ + GstVaH264Enc *self = GST_VA_H264_ENC (base); + GstVaH264EncFrame *frame; + + g_return_val_if_fail (self->gop.cur_frame_index <= self->gop.idr_period, + FALSE); + + if (gst_frame) { + /* Begin a new GOP, should have a empty reorder_list. */ + if (self->gop.cur_frame_index == self->gop.idr_period) { + g_assert (g_queue_is_empty (&base->reorder_list)); + self->gop.cur_frame_index = 0; + self->gop.cur_frame_num = 0; + } + + frame = _enc_frame (gst_frame); + frame->poc = + ((self->gop.cur_frame_index * 2) % self->gop.max_pic_order_cnt); + + /* TODO: move most this logic onto vabaseenc class */ + if (self->gop.cur_frame_index == 0) { + g_assert (frame->poc == 0); + GST_LOG_OBJECT (self, "system_frame_number: %d, an IDR frame, starts" + " a new GOP", gst_frame->system_frame_number); + + g_queue_clear_full (&base->ref_list, + (GDestroyNotify) gst_video_codec_frame_unref); + + GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (gst_frame); + } + + frame->type = self->gop.frame_typesself->gop.cur_frame_index.slice_type; + frame->is_ref = self->gop.frame_typesself->gop.cur_frame_index.is_ref; + frame->pyramid_level = + self->gop.frame_typesself->gop.cur_frame_index.pyramid_level; + frame->left_ref_poc_diff = + self->gop.frame_typesself->gop.cur_frame_index.left_ref_poc_diff; + frame->right_ref_poc_diff = + self->gop.frame_typesself->gop.cur_frame_index.right_ref_poc_diff; + + if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (gst_frame)) { + GST_DEBUG_OBJECT (self, "system_frame_number: %d, a force key frame," + " promote its type from %s to %s", gst_frame->system_frame_number, + _slice_type_name (frame->type), _slice_type_name (GST_H264_I_SLICE)); + frame->type = GST_H264_I_SLICE; + frame->is_ref = TRUE; + } + + GST_LOG_OBJECT (self, "Push frame, system_frame_number: %d, poc %d, " + "frame type %s", gst_frame->system_frame_number, frame->poc, + _slice_type_name (frame->type)); + + self->gop.cur_frame_index++; + g_queue_push_tail (&base->reorder_list, + gst_video_codec_frame_ref (gst_frame)); + } + + /* ensure the last one a non-B and end the GOP. */ + if (last && self->gop.cur_frame_index < self->gop.idr_period) { + GstVideoCodecFrame *last_frame; + + /* Ensure next push will start a new GOP. */ + self->gop.cur_frame_index = self->gop.idr_period; + + if (!g_queue_is_empty (&base->reorder_list)) { + last_frame = g_queue_peek_tail (&base->reorder_list); + frame = _enc_frame (last_frame); + if (frame->type == GST_H264_B_SLICE) { + frame->type = GST_H264_P_SLICE; + frame->is_ref = TRUE; + } + } + } + + return TRUE; +} + +struct RefFramesCount +{ + gint poc; + guint num; +}; + +static void +_count_backward_ref_num (gpointer data, gpointer user_data) +{ + GstVaH264EncFrame *frame = _enc_frame (data); + struct RefFramesCount *count = (struct RefFramesCount *) user_data; + + g_assert (frame->poc != count->poc); + if (frame->poc > count->poc) + count->num++; +} + +static GstVideoCodecFrame * +_pop_pyramid_b_frame (GstVaH264Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint i; + gint index = -1; + GstVaH264EncFrame *b_vaframe; + GstVideoCodecFrame *b_frame; + struct RefFramesCount count; + + g_assert (self->gop.ref_num_list1 == 1); + + b_frame = NULL; + b_vaframe = NULL; + + /* Find the lowest level with smallest poc. */ + for (i = 0; i < g_queue_get_length (&base->reorder_list); i++) { + GstVaH264EncFrame *vaf; + GstVideoCodecFrame *f; + + f = g_queue_peek_nth (&base->reorder_list, i); + + if (!b_frame) { + b_frame = f; + b_vaframe = _enc_frame (b_frame); + index = i; + continue; + } + + vaf = _enc_frame (f); + if (b_vaframe->pyramid_level < vaf->pyramid_level) { + b_frame = f; + b_vaframe = vaf; + index = i; + continue; + } + + if (b_vaframe->poc > vaf->poc) { + b_frame = f; + b_vaframe = vaf; + index = i; + } + } + +again: + /* Check whether its refs are already poped. */ + g_assert (b_vaframe->left_ref_poc_diff != 0); + g_assert (b_vaframe->right_ref_poc_diff != 0); + for (i = 0; i < g_queue_get_length (&base->reorder_list); i++) { + GstVaH264EncFrame *vaf; + GstVideoCodecFrame *f; + + f = g_queue_peek_nth (&base->reorder_list, i); + + if (f == b_frame) + continue; + + vaf = _enc_frame (f); + if (vaf->poc == b_vaframe->poc + b_vaframe->left_ref_poc_diff + || vaf->poc == b_vaframe->poc + b_vaframe->right_ref_poc_diff) { + b_frame = f; + b_vaframe = vaf; + index = i; + goto again; + } + } + + /* Ensure we already have enough backward refs */ + count.num = 0; + count.poc = b_vaframe->poc; + g_queue_foreach (&base->ref_list, (GFunc) _count_backward_ref_num, &count); + if (count.num >= self->gop.ref_num_list1) { + GstVideoCodecFrame *f; + + /* it will unref at pop_frame */ + f = g_queue_pop_nth (&base->reorder_list, index); + g_assert (f == b_frame); + } else { + b_frame = NULL; + } + + return b_frame; +} + +static gboolean +_pop_one_frame (GstVaBaseEnc * base, GstVideoCodecFrame ** out_frame) +{ + GstVaH264Enc *self = GST_VA_H264_ENC (base); + GstVaH264EncFrame *vaframe; + GstVideoCodecFrame *frame; + struct RefFramesCount count; + + g_return_val_if_fail (self->gop.cur_frame_index <= self->gop.idr_period, + FALSE); + + *out_frame = NULL; + + if (g_queue_is_empty (&base->reorder_list)) + return TRUE; + + /* Return the last pushed non-B immediately. */ + frame = g_queue_peek_tail (&base->reorder_list); + vaframe = _enc_frame (frame); + if (vaframe->type != GST_H264_B_SLICE) { + frame = g_queue_pop_tail (&base->reorder_list); + goto get_one; + } + + if (self->gop.b_pyramid) { + frame = _pop_pyramid_b_frame (self); + if (frame == NULL) + return TRUE; + goto get_one; + } + + g_assert (self->gop.ref_num_list1 > 0); + + /* If GOP end, pop anyway. */ + if (self->gop.cur_frame_index == self->gop.idr_period) { + frame = g_queue_pop_head (&base->reorder_list); + goto get_one; + } + + /* Ensure we already have enough backward refs */ + frame = g_queue_peek_head (&base->reorder_list); + vaframe = _enc_frame (frame); + count.num = 0; + count.poc = vaframe->poc; + g_queue_foreach (&base->ref_list, _count_backward_ref_num, &count); + if (count.num >= self->gop.ref_num_list1) { + frame = g_queue_pop_head (&base->reorder_list); + goto get_one; + } + + return TRUE; + +get_one: + g_assert (self->gop.cur_frame_num < self->gop.max_frame_num); + + vaframe = _enc_frame (frame); + vaframe->frame_num = self->gop.cur_frame_num; + + /* Add the frame number for ref frames. */ + if (vaframe->is_ref) + self->gop.cur_frame_num++; + + if (vaframe->frame_num == 0) + self->gop.total_idr_count++; + + if (self->gop.b_pyramid && vaframe->type == GST_H264_B_SLICE) { + GST_LOG_OBJECT (self, "pop a pyramid B frame with system_frame_number:" + " %d, poc: %d, frame num: %d, is_ref: %s, level %d", + frame->system_frame_number, vaframe->poc, vaframe->frame_num, + vaframe->is_ref ? "true" : "false", vaframe->pyramid_level); + } else { + GST_LOG_OBJECT (self, "pop a frame with system_frame_number: %d," + " frame type: %s, poc: %d, frame num: %d, is_ref: %s", + frame->system_frame_number, _slice_type_name (vaframe->type), + vaframe->poc, vaframe->frame_num, vaframe->is_ref ? "true" : "false"); + } + + /* unref frame popped from queue or pyramid b_frame */ + gst_video_codec_frame_unref (frame); + *out_frame = frame; + return TRUE; +} + +static gboolean +gst_va_h264_enc_reorder_frame (GstVaBaseEnc * base, GstVideoCodecFrame * frame, + gboolean bump_all, GstVideoCodecFrame ** out_frame) +{ + if (!_push_one_frame (base, frame, bump_all)) { + GST_ERROR_OBJECT (base, "Failed to push the input frame" + " system_frame_number: %d into the reorder list", + frame->system_frame_number); + + *out_frame = NULL; + return FALSE; + } + + if (!_pop_one_frame (base, out_frame)) { + GST_ERROR_OBJECT (base, "Failed to pop the frame from the reorder list"); + *out_frame = NULL; + return FALSE; + } + + return TRUE; +} + +static inline gboolean +_fill_sps (GstVaH264Enc * self, VAEncSequenceParameterBufferH264 * seq_param) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + GstH264Profile profile; + guint32 constraint_set0_flag, constraint_set1_flag; + guint32 constraint_set2_flag, constraint_set3_flag; + guint32 max_dec_frame_buffering; + + /* let max_num_ref_frames <= MaxDpbFrames. */ + max_dec_frame_buffering = + MIN (self->gop.num_ref_frames + 1 /* Last frame before bump */ , + 16 /* DPB_MAX_SIZE */ ); + + constraint_set0_flag = 0; + constraint_set1_flag = 0; + constraint_set2_flag = 0; + constraint_set3_flag = 0; + + switch (base->profile) { + case VAProfileH264ConstrainedBaseline: + profile = GST_H264_PROFILE_BASELINE; + /* A.2.1 (baseline profile constraints) */ + constraint_set0_flag = 1; + constraint_set1_flag = 1; + break; + case VAProfileH264Main: + profile = GST_H264_PROFILE_MAIN; + /* A.2.2 (main profile constraints) */ + constraint_set1_flag = 1; + break; + case VAProfileH264High: + case VAProfileH264MultiviewHigh: + case VAProfileH264StereoHigh: + profile = GST_H264_PROFILE_HIGH; + break; + default: + return FALSE; + } + + /* seq_scaling_matrix_present_flag not supported now */ + g_assert (seq_param->seq_fields.bits.seq_scaling_matrix_present_flag == 0); + /* pic_order_cnt_type only support 0 now */ + g_assert (seq_param->seq_fields.bits.pic_order_cnt_type == 0); + /* only progressive frames encoding is supported now */ + g_assert (seq_param->seq_fields.bits.frame_mbs_only_flag); + + /* *INDENT-OFF* */ + GST_DEBUG_OBJECT (self, "filling SPS"); + self->sequence_hdr = (GstH264SPS) { + .id = 0, + .profile_idc = profile, + .constraint_set0_flag = constraint_set0_flag, + .constraint_set1_flag = constraint_set1_flag, + .constraint_set2_flag = constraint_set2_flag, + .constraint_set3_flag = constraint_set3_flag, + .level_idc = self->level_idc, + + .chroma_format_idc = seq_param->seq_fields.bits.chroma_format_idc, + .bit_depth_luma_minus8 = seq_param->bit_depth_luma_minus8, + .bit_depth_chroma_minus8 = seq_param->bit_depth_chroma_minus8, + + .log2_max_frame_num_minus4 = + seq_param->seq_fields.bits.log2_max_frame_num_minus4, + .pic_order_cnt_type = seq_param->seq_fields.bits.pic_order_cnt_type, + .log2_max_pic_order_cnt_lsb_minus4 = + seq_param->seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4, + + .num_ref_frames = seq_param->max_num_ref_frames, + .gaps_in_frame_num_value_allowed_flag = 0, + .pic_width_in_mbs_minus1 = seq_param->picture_width_in_mbs - 1, + .pic_height_in_map_units_minus1 = + (seq_param->seq_fields.bits.frame_mbs_only_flag ? + seq_param->picture_height_in_mbs - 1 : + seq_param->picture_height_in_mbs / 2 - 1), + .frame_mbs_only_flag = seq_param->seq_fields.bits.frame_mbs_only_flag, + .mb_adaptive_frame_field_flag = 0, + .direct_8x8_inference_flag = + seq_param->seq_fields.bits.direct_8x8_inference_flag, + .frame_cropping_flag = seq_param->frame_cropping_flag, + .frame_crop_left_offset = seq_param->frame_crop_left_offset, + .frame_crop_right_offset = seq_param->frame_crop_right_offset, + .frame_crop_top_offset = seq_param->frame_crop_top_offset, + .frame_crop_bottom_offset = seq_param->frame_crop_bottom_offset, + + .vui_parameters_present_flag = seq_param->vui_parameters_present_flag, + .vui_parameters = { + .aspect_ratio_info_present_flag = + seq_param->vui_fields.bits.aspect_ratio_info_present_flag, + .aspect_ratio_idc = seq_param->aspect_ratio_idc, + .sar_width = seq_param->sar_width, + .sar_height = seq_param->sar_height, + .overscan_info_present_flag = 0, + .overscan_appropriate_flag = 0, + .chroma_loc_info_present_flag = 0, + .timing_info_present_flag = + seq_param->vui_fields.bits.timing_info_present_flag, + .num_units_in_tick = seq_param->num_units_in_tick, + .time_scale = seq_param->time_scale, + .fixed_frame_rate_flag = seq_param->vui_fields.bits.fixed_frame_rate_flag, + + /* We do not write hrd and no need for buffering period SEI. */ + .nal_hrd_parameters_present_flag = 0, + .vcl_hrd_parameters_present_flag = 0, + + .low_delay_hrd_flag = seq_param->vui_fields.bits.low_delay_hrd_flag, + .pic_struct_present_flag = 1, + .bitstream_restriction_flag = + seq_param->vui_fields.bits.bitstream_restriction_flag, + .motion_vectors_over_pic_boundaries_flag = + seq_param->vui_fields.bits.motion_vectors_over_pic_boundaries_flag, + .max_bytes_per_pic_denom = 2, + .max_bits_per_mb_denom = 1, + .log2_max_mv_length_horizontal = + seq_param->vui_fields.bits.log2_max_mv_length_horizontal, + .log2_max_mv_length_vertical = + seq_param->vui_fields.bits.log2_max_mv_length_vertical, + .num_reorder_frames = self->gop.num_reorder_frames, + .max_dec_frame_buffering = max_dec_frame_buffering, + }, + }; + /* *INDENT-ON* */ + + return TRUE; +} + +static gboolean +_add_sequence_header (GstVaH264Enc * self, GstVaH264EncFrame * frame) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint size; +#define SPS_SIZE 4 + GST_ROUND_UP_8 (MAX_SPS_HDR_SIZE + MAX_VUI_PARAMS_SIZE + \ + 2 * MAX_HRD_PARAMS_SIZE) / 8 + guint8 packed_spsSPS_SIZE = { 0, }; +#undef SPS_SIZE + + size = sizeof (packed_sps); + if (gst_h264_bit_writer_sps (&self->sequence_hdr, TRUE, packed_sps, + &size) != GST_H264_BIT_WRITER_OK) { + GST_ERROR_OBJECT (self, "Failed to generate the sequence header"); + return FALSE; + } + + if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, + VAEncPackedHeaderSequence, packed_sps, size * 8, FALSE)) { + GST_ERROR_OBJECT (self, "Failed to add the packed sequence header"); + return FALSE; + } + + return TRUE; +} + +static inline void +_fill_sequence_param (GstVaH264Enc * self, + VAEncSequenceParameterBufferH264 * sequence) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + gboolean direct_8x8_inference_flag = TRUE; + + g_assert (self->gop.log2_max_frame_num >= 4); + g_assert (self->gop.log2_max_pic_order_cnt >= 4); + + /* A.2.3 Extended profile: + * Sequence parameter sets shall have direct_8x8_inference_flag + * equal to 1. + * + * A.3.3 Profile-specific level limits: + * direct_8x8_inference_flag is not relevant to the Baseline, + * Constrained Baseline, Constrained High, High 10 Intra, High 4:2:2 + * Intra, High 4:4:4 Intra, and CAVLC 4:4:4 Intra profiles as these + * profiles do not allow B slice types, and + * direct_8x8_inference_flag is equal to 1 for all levels of the + * Extended profile. Table A-4. We only have constrained baseline + * here. */ + if (base->profile == VAProfileH264ConstrainedBaseline) + direct_8x8_inference_flag = FALSE; + + /* *INDENT-OFF* */ + *sequence = (VAEncSequenceParameterBufferH264) { + .seq_parameter_set_id = 0, + .level_idc = self->level_idc, + .intra_period = + self->gop.i_period > 0 ? self->gop.i_period : self->gop.idr_period, + .intra_idr_period = self->gop.idr_period, + .ip_period = self->gop.ip_period, + .bits_per_second = self->rc.target_bitrate_bits, + .max_num_ref_frames = self->gop.num_ref_frames, + .picture_width_in_mbs = self->mb_width, + .picture_height_in_mbs = self->mb_height, + + .seq_fields.bits = { + /* Only support 4:2:0 now. */ + .chroma_format_idc = 1, + .frame_mbs_only_flag = 1, + .mb_adaptive_frame_field_flag = FALSE, + .seq_scaling_matrix_present_flag = FALSE, + .direct_8x8_inference_flag = direct_8x8_inference_flag, + .log2_max_frame_num_minus4 = self->gop.log2_max_frame_num - 4, + .pic_order_cnt_type = 0, + .log2_max_pic_order_cnt_lsb_minus4 = self->gop.log2_max_pic_order_cnt - 4, + }, + .bit_depth_luma_minus8 = 0, + .bit_depth_chroma_minus8 = 0, + + .vui_parameters_present_flag = TRUE, + .vui_fields.bits = { + .aspect_ratio_info_present_flag = TRUE, + .timing_info_present_flag = TRUE, + .bitstream_restriction_flag = TRUE, + .log2_max_mv_length_horizontal = 15, + .log2_max_mv_length_vertical = 15, + .fixed_frame_rate_flag = 1, + .low_delay_hrd_flag = 0, + .motion_vectors_over_pic_boundaries_flag = TRUE, + }, + .aspect_ratio_idc = 0xff, + /* FIXME: what if no framerate info is provided */ + .sar_width = GST_VIDEO_INFO_PAR_N (&base->input_state->info), + .sar_height = GST_VIDEO_INFO_PAR_D (&base->input_state->info), + .num_units_in_tick = GST_VIDEO_INFO_FPS_D (&base->input_state->info), + .time_scale = GST_VIDEO_INFO_FPS_N (&base->input_state->info) * 2, + }; + /* *INDENT-ON* */ + + /* frame_cropping_flag */ + if (base->width & 15 || base->height & 15) { + static const guint SubWidthC = { 1, 2, 2, 1 }; + static const guint SubHeightC = { 1, 2, 1, 1 }; + const guint CropUnitX = + SubWidthCsequence->seq_fields.bits.chroma_format_idc; + const guint CropUnitY = + SubHeightCsequence->seq_fields.bits.chroma_format_idc * + (2 - sequence->seq_fields.bits.frame_mbs_only_flag); + + sequence->frame_cropping_flag = 1; + sequence->frame_crop_left_offset = 0; + sequence->frame_crop_right_offset = (16 * self->mb_width - + base->width) / CropUnitX; + sequence->frame_crop_top_offset = 0; + sequence->frame_crop_bottom_offset = (16 * self->mb_height - + base->height) / CropUnitY; + } +} + +static gboolean +_add_sequence_parameter (GstVaH264Enc * self, GstVaEncodePicture * picture, + VAEncSequenceParameterBufferH264 * sequence) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + + if (!gst_va_encoder_add_param (base->encoder, picture, + VAEncSequenceParameterBufferType, sequence, sizeof (*sequence))) { + GST_ERROR_OBJECT (self, "Failed to create the sequence parameter"); + return FALSE; + } + + return TRUE; +} + +static inline gboolean +_fill_picture_parameter (GstVaH264Enc * self, GstVaH264EncFrame * frame, + VAEncPictureParameterBufferH264 * pic_param) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint i; + + /* *INDENT-OFF* */ + *pic_param = (VAEncPictureParameterBufferH264) { + .CurrPic = { + .picture_id = + gst_va_encode_picture_get_reconstruct_surface (frame->picture), + .TopFieldOrderCnt = frame->poc, + }, + .coded_buf = frame->picture->coded_buffer, + /* Only support one sps and pps now. */ + .pic_parameter_set_id = 0, + .seq_parameter_set_id = 0, + /* means last encoding picture, EOS nal added. */ + .last_picture = frame->last_frame, + .frame_num = frame->frame_num, + + .pic_init_qp = self->rc.qp_i, + /* Use slice's these fields to control ref num. */ + .num_ref_idx_l0_active_minus1 = 0, + .num_ref_idx_l1_active_minus1 = 0, + .chroma_qp_index_offset = 0, + .second_chroma_qp_index_offset = 0, + /* picture fields */ + .pic_fields.bits.idr_pic_flag = (frame->frame_num == 0), + .pic_fields.bits.reference_pic_flag = frame->is_ref, + .pic_fields.bits.entropy_coding_mode_flag = self->use_cabac, + .pic_fields.bits.weighted_pred_flag = 0, + .pic_fields.bits.weighted_bipred_idc = 0, + .pic_fields.bits.constrained_intra_pred_flag = 0, + .pic_fields.bits.transform_8x8_mode_flag = self->use_dct8x8, + /* enable debloking */ + .pic_fields.bits.deblocking_filter_control_present_flag = 1, + .pic_fields.bits.redundant_pic_cnt_present_flag = 0, + /* bottom_field_pic_order_in_frame_present_flag */ + .pic_fields.bits.pic_order_present_flag = 0, + .pic_fields.bits.pic_scaling_matrix_present_flag = 0, + }; + /* *INDENT-ON* */ + + /* Non I frame, construct reference list. */ + i = 0; + if (frame->type != GST_H264_I_SLICE) { + GstVaH264EncFrame *f; + + if (g_queue_is_empty (&base->ref_list)) { + GST_ERROR_OBJECT (self, "No reference found for frame type %s", + _slice_type_name (frame->type)); + return FALSE; + } + + g_assert (g_queue_get_length (&base->ref_list) <= self->gop.num_ref_frames); + + /* ref frames in queue are already sorted by frame_num. */ + for (; i < g_queue_get_length (&base->ref_list); i++) { + f = _enc_frame (g_queue_peek_nth (&base->ref_list, i)); + + pic_param->ReferenceFramesi.picture_id = + gst_va_encode_picture_get_reconstruct_surface (f->picture); + pic_param->ReferenceFramesi.TopFieldOrderCnt = f->poc; + pic_param->ReferenceFramesi.flags = + VA_PICTURE_H264_SHORT_TERM_REFERENCE; + pic_param->ReferenceFramesi.frame_idx = f->frame_num; + } + } + for (; i < 16; ++i) + pic_param->ReferenceFramesi.picture_id = VA_INVALID_ID; + + return TRUE; +}; + +static gboolean +_add_picture_parameter (GstVaH264Enc * self, GstVaH264EncFrame * frame, + VAEncPictureParameterBufferH264 * pic_param) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + + if (!gst_va_encoder_add_param (base->encoder, frame->picture, + VAEncPictureParameterBufferType, pic_param, + sizeof (VAEncPictureParameterBufferH264))) { + GST_ERROR_OBJECT (self, "Failed to create the picture parameter"); + return FALSE; + } + + return TRUE; +} + +static void +_fill_pps (VAEncPictureParameterBufferH264 * pic_param, GstH264SPS * sps, + GstH264PPS * pps) +{ + /* *INDENT-OFF* */ + *pps = (GstH264PPS) { + .id = 0, + .sequence = sps, + .entropy_coding_mode_flag = + pic_param->pic_fields.bits.entropy_coding_mode_flag, + .pic_order_present_flag = + pic_param->pic_fields.bits.pic_order_present_flag, + .num_slice_groups_minus1 = 0, + + .num_ref_idx_l0_active_minus1 = pic_param->num_ref_idx_l0_active_minus1, + .num_ref_idx_l1_active_minus1 = pic_param->num_ref_idx_l1_active_minus1, + + .weighted_pred_flag = pic_param->pic_fields.bits.weighted_pred_flag, + .weighted_bipred_idc = pic_param->pic_fields.bits.weighted_bipred_idc, + .pic_init_qp_minus26 = pic_param->pic_init_qp - 26, + .pic_init_qs_minus26 = 0, + .chroma_qp_index_offset = pic_param->chroma_qp_index_offset, + .deblocking_filter_control_present_flag = + pic_param->pic_fields.bits.deblocking_filter_control_present_flag, + .constrained_intra_pred_flag = + pic_param->pic_fields.bits.constrained_intra_pred_flag, + .redundant_pic_cnt_present_flag = + pic_param->pic_fields.bits.redundant_pic_cnt_present_flag, + .transform_8x8_mode_flag = + pic_param->pic_fields.bits.transform_8x8_mode_flag, + /* unsupport scaling lists */ + .pic_scaling_matrix_present_flag = 0, + .second_chroma_qp_index_offset = pic_param->second_chroma_qp_index_offset, + }; + /* *INDENT-ON* */ +} + +static gboolean +_add_picture_header (GstVaH264Enc * self, GstVaH264EncFrame * frame, + GstH264PPS * pps) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); +#define PPS_SIZE 4 + GST_ROUND_UP_8 (MAX_PPS_HDR_SIZE) / 8 + guint8 packed_ppsPPS_SIZE = { 0, }; +#undef PPS_SIZE + guint size; + + size = sizeof (packed_pps); + if (gst_h264_bit_writer_pps (pps, TRUE, packed_pps, + &size) != GST_H264_BIT_WRITER_OK) { + GST_ERROR_OBJECT (self, "Failed to generate the picture header"); + return FALSE; + } + + if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, + VAEncPackedHeaderPicture, packed_pps, size * 8, FALSE)) { + GST_ERROR_OBJECT (self, "Failed to add the packed picture header"); + return FALSE; + } + + return TRUE; +} + +static gboolean +_add_one_slice (GstVaH264Enc * self, GstVaH264EncFrame * frame, + gint start_mb, gint mb_size, + VAEncSliceParameterBufferH264 * slice, + GstVaH264EncFrame * list016, guint list0_num, + GstVaH264EncFrame * list116, guint list1_num) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + int8_t slice_qp_delta = 0; + gint i; + + /* *INDENT-OFF* */ + if (self->rc.rc_ctrl_mode == VA_RC_CQP) { + if (frame->type == GST_H264_P_SLICE) { + slice_qp_delta = self->rc.qp_p - self->rc.qp_i; + } else if (frame->type == GST_H264_B_SLICE) { + slice_qp_delta = (int8_t) (self->rc.qp_b - self->rc.qp_i); + } + g_assert (slice_qp_delta <= 51 && slice_qp_delta >= -51); + } + + *slice = (VAEncSliceParameterBufferH264) { + .macroblock_address = start_mb, + .num_macroblocks = mb_size, + .macroblock_info = VA_INVALID_ID, + .slice_type = (uint8_t) frame->type, + /* Only one parameter set supported now. */ + .pic_parameter_set_id = 0, + .idr_pic_id = self->gop.total_idr_count, + .pic_order_cnt_lsb = frame->poc, + /* Not support top/bottom. */ + .delta_pic_order_cnt_bottom = 0, + .delta_pic_order_cnt0 = 0, + .delta_pic_order_cnt1 = 0, + + .direct_spatial_mv_pred_flag = TRUE, + /* .num_ref_idx_active_override_flag = , */ + /* .num_ref_idx_l0_active_minus1 = , */ + /* .num_ref_idx_l1_active_minus1 = , */ + /* Set the reference list later. */ + + .luma_log2_weight_denom = 0, + .chroma_log2_weight_denom = 0, + .luma_weight_l0_flag = 0, + .chroma_weight_l0_flag = 0, + .luma_weight_l1_flag = 0, + .chroma_weight_l1_flag = 0, + + .cabac_init_idc = 0, + /* Just use picture default setting. */ + .slice_qp_delta = slice_qp_delta, + + .disable_deblocking_filter_idc = 0, + .slice_alpha_c0_offset_div2 = 2, + .slice_beta_offset_div2 = 2, + }; + /* *INDENT-ON* */ + + if (frame->type == GST_H264_B_SLICE || frame->type == GST_H264_P_SLICE) { + slice->num_ref_idx_active_override_flag = (list0_num > 0 || list1_num > 0); + slice->num_ref_idx_l0_active_minus1 = list0_num > 0 ? list0_num - 1 : 0; + if (frame->type == GST_H264_B_SLICE) + slice->num_ref_idx_l1_active_minus1 = list1_num > 0 ? list1_num - 1 : 0; + } + + i = 0; + if (frame->type != GST_H264_I_SLICE) { + for (; i < list0_num; i++) { + slice->RefPicList0i.picture_id = + gst_va_encode_picture_get_reconstruct_surface (list0i->picture); + slice->RefPicList0i.TopFieldOrderCnt = list0i->poc; + slice->RefPicList0i.flags |= VA_PICTURE_H264_SHORT_TERM_REFERENCE; + slice->RefPicList0i.frame_idx = list0i->frame_num; + } + } + for (; i < G_N_ELEMENTS (slice->RefPicList0); ++i) { + slice->RefPicList0i.picture_id = VA_INVALID_SURFACE; + slice->RefPicList0i.flags = VA_PICTURE_H264_INVALID; + } + + i = 0; + if (frame->type == GST_H264_B_SLICE) { + for (; i < list1_num; i++) { + slice->RefPicList1i.picture_id = + gst_va_encode_picture_get_reconstruct_surface (list1i->picture); + slice->RefPicList1i.TopFieldOrderCnt = list1i->poc; + slice->RefPicList1i.flags |= VA_PICTURE_H264_SHORT_TERM_REFERENCE; + slice->RefPicList1i.frame_idx = list1i->frame_num; + } + } + for (; i < G_N_ELEMENTS (slice->RefPicList1); ++i) { + slice->RefPicList1i.picture_id = VA_INVALID_SURFACE; + slice->RefPicList1i.flags = VA_PICTURE_H264_INVALID; + } + + if (!gst_va_encoder_add_param (base->encoder, frame->picture, + VAEncSliceParameterBufferType, slice, + sizeof (VAEncSliceParameterBufferH264))) { + GST_ERROR_OBJECT (self, "Failed to create the slice parameter"); + return FALSE; + } + + return TRUE; +} + +static gint +_poc_asc_compare (const GstVaH264EncFrame ** a, const GstVaH264EncFrame ** b) +{ + return (*a)->poc - (*b)->poc; +} + +static gint +_poc_des_compare (const GstVaH264EncFrame ** a, const GstVaH264EncFrame ** b) +{ + return (*b)->poc - (*a)->poc; +} + +static gint +_frame_num_asc_compare (const GstVaH264EncFrame ** a, + const GstVaH264EncFrame ** b) +{ + return (*a)->frame_num - (*b)->frame_num; +} + +static gint +_frame_num_des_compare (const GstVaH264EncFrame ** a, + const GstVaH264EncFrame ** b) +{ + return (*b)->frame_num - (*a)->frame_num; +} + +/* If all the pic_num in the same order, OK. */ +static gboolean +_ref_list_need_reorder (GstVaH264EncFrame * list16, guint list_num, + gboolean is_asc) +{ + guint i; + gint pic_num_diff; + + if (list_num <= 1) + return FALSE; + + for (i = 1; i < list_num; i++) { + pic_num_diff = listi->frame_num - listi - 1->frame_num; + g_assert (pic_num_diff != 0); + + if (pic_num_diff > 0 && !is_asc) + return TRUE; + + if (pic_num_diff < 0 && is_asc) + return TRUE; + } + + return FALSE; +} + +static void +_insert_ref_pic_list_modification (GstH264SliceHdr * slice_hdr, + GstVaH264EncFrame * list16, guint list_num, gboolean is_asc) +{ + GstVaH264EncFrame *list_by_pic_num16 = { }; + guint modification_num, i; + GstH264RefPicListModification *ref_pic_list_modification = NULL; + gint pic_num_diff, pic_num_lx_pred; + + memcpy (list_by_pic_num, list, sizeof (GstVaH264EncFrame *) * list_num); + + if (is_asc) { + g_qsort_with_data (list_by_pic_num, list_num, sizeof (gpointer), + (GCompareDataFunc) _frame_num_asc_compare, NULL); + } else { + g_qsort_with_data (list_by_pic_num, list_num, sizeof (gpointer), + (GCompareDataFunc) _frame_num_des_compare, NULL); + } + + modification_num = 0; + for (i = 0; i < list_num; i++) { + if (list_by_pic_numi->poc != listi->poc) + modification_num = i + 1; + } + g_assert (modification_num > 0); + + if (is_asc) { + slice_hdr->ref_pic_list_modification_flag_l1 = 1; + slice_hdr->n_ref_pic_list_modification_l1 = + modification_num + 1 /* The end operation. */ ; + ref_pic_list_modification = slice_hdr->ref_pic_list_modification_l1; + } else { + slice_hdr->ref_pic_list_modification_flag_l0 = 1; + slice_hdr->n_ref_pic_list_modification_l0 = + modification_num + 1 /* The end operation. */ ; + ref_pic_list_modification = slice_hdr->ref_pic_list_modification_l0; + } + + pic_num_lx_pred = slice_hdr->frame_num; + for (i = 0; i < modification_num; i++) { + pic_num_diff = listi->frame_num - pic_num_lx_pred; + /* For the nex loop. */ + pic_num_lx_pred = listi->frame_num; + + g_assert (pic_num_diff != 0); + + if (pic_num_diff > 0) { + ref_pic_list_modification->modification_of_pic_nums_idc = 1; + ref_pic_list_modification->value.abs_diff_pic_num_minus1 = + pic_num_diff - 1; + } else { + ref_pic_list_modification->modification_of_pic_nums_idc = 0; + ref_pic_list_modification->value.abs_diff_pic_num_minus1 = + (-pic_num_diff) - 1; + } + + ref_pic_list_modification++; + } + + ref_pic_list_modification->modification_of_pic_nums_idc = 3; +} + +static void +_insert_ref_pic_marking_for_unused_frame (GstH264SliceHdr * slice_hdr, + gint cur_frame_num, gint unused_frame_num) +{ + GstH264RefPicMarking *refpicmarking; + + slice_hdr->dec_ref_pic_marking.adaptive_ref_pic_marking_mode_flag = 1; + slice_hdr->dec_ref_pic_marking.n_ref_pic_marking = 2; + + refpicmarking = &slice_hdr->dec_ref_pic_marking.ref_pic_marking0; + + refpicmarking->memory_management_control_operation = 1; + refpicmarking->difference_of_pic_nums_minus1 = + cur_frame_num - unused_frame_num - 1; + + refpicmarking = &slice_hdr->dec_ref_pic_marking.ref_pic_marking1; + refpicmarking->memory_management_control_operation = 0; +} + +static gboolean +_add_slice_header (GstVaH264Enc * self, GstVaH264EncFrame * frame, + GstH264PPS * pps, VAEncSliceParameterBufferH264 * slice, + GstVaH264EncFrame * list016, guint list0_num, + GstVaH264EncFrame * list116, guint list1_num) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + GstH264SliceHdr slice_hdr; + guint size, trail_bits; + GstH264NalUnitType nal_type = GST_H264_NAL_SLICE; +#define SLICE_HDR_SIZE 4 + GST_ROUND_UP_8 (MAX_SLICE_HDR_SIZE) / 8 + guint8 packed_slice_hdrSLICE_HDR_SIZE = { 0, }; +#undef SLICE_HDR_SIZE + + if (frame->frame_num == 0) + nal_type = GST_H264_NAL_SLICE_IDR; + + /* *INDENT-OFF* */ + slice_hdr = (GstH264SliceHdr) { + .first_mb_in_slice = slice->macroblock_address, + .type = slice->slice_type, + .pps = pps, + .frame_num = frame->frame_num, + /* interlaced not supported now. */ + .field_pic_flag = 0, + .bottom_field_flag = 0, + .idr_pic_id = (frame->frame_num == 0 ? slice->idr_pic_id : 0), + /* only pic_order_cnt_type 1 is supported now. */ + .pic_order_cnt_lsb = slice->pic_order_cnt_lsb, + .delta_pic_order_cnt_bottom = slice->delta_pic_order_cnt_bottom, + /* Only for B frame. */ + .direct_spatial_mv_pred_flag = + (frame->type == GST_H264_B_SLICE ? + slice->direct_spatial_mv_pred_flag : 0), + + .num_ref_idx_active_override_flag = slice->num_ref_idx_active_override_flag, + .num_ref_idx_l0_active_minus1 = slice->num_ref_idx_l0_active_minus1, + .num_ref_idx_l1_active_minus1 = slice->num_ref_idx_l1_active_minus1, + /* Calculate it later. */ + .ref_pic_list_modification_flag_l0 = 0, + .ref_pic_list_modification_flag_l1 = 0, + /* We have weighted_pred_flag and weighted_bipred_idc 0 here, no + * need weight_table. */ + + .dec_ref_pic_marking = { + .no_output_of_prior_pics_flag = 0, + .long_term_reference_flag = 0, + /* If not sliding_window, we set it later. */ + .adaptive_ref_pic_marking_mode_flag = 0, + }, + + .cabac_init_idc = slice->cabac_init_idc, + .slice_qp_delta = slice->slice_qp_delta, + + .disable_deblocking_filter_idc = slice->disable_deblocking_filter_idc, + .slice_alpha_c0_offset_div2 = slice->slice_alpha_c0_offset_div2, + .slice_beta_offset_div2 = slice->slice_beta_offset_div2, + }; + /* *INDENT-ON* */ + + /* Reorder the ref lists if needed. */ + if (list0_num > 1) { + /* list0 is in poc descend order now. */ + if (_ref_list_need_reorder (list0, list0_num, FALSE)) + _insert_ref_pic_list_modification (&slice_hdr, list0, list0_num, FALSE); + } + + if (list0_num > 1) { + /* list0 is in poc ascend order now. */ + if (_ref_list_need_reorder (list1, list1_num, TRUE)) { + _insert_ref_pic_list_modification (&slice_hdr, list1, list1_num, TRUE); + } + } + + /* Mark the unused reference explicitly which this frame replaces. */ + if (frame->unused_for_reference_pic_num >= 0) { + g_assert (frame->is_ref); + _insert_ref_pic_marking_for_unused_frame (&slice_hdr, frame->frame_num, + frame->unused_for_reference_pic_num); + } + + size = sizeof (packed_slice_hdr); + trail_bits = 0; + if (gst_h264_bit_writer_slice_hdr (&slice_hdr, TRUE, nal_type, frame->is_ref, + packed_slice_hdr, &size, &trail_bits) != GST_H264_BIT_WRITER_OK) { + GST_ERROR_OBJECT (self, "Failed to generate the slice header"); + return FALSE; + } + + if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, + VAEncPackedHeaderSlice, packed_slice_hdr, size * 8 + trail_bits, + FALSE)) { + GST_ERROR_OBJECT (self, "Failed to add the packed slice header"); + return FALSE; + } + + return TRUE; +} + +static gboolean +_add_aud (GstVaH264Enc * self, GstVaH264EncFrame * frame) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint8 aud_data8 = { }; + guint size; + guint8 primary_pic_type = 0; + + switch (frame->type) { + case GST_H264_I_SLICE: + primary_pic_type = 0; + break; + case GST_H264_P_SLICE: + primary_pic_type = 1; + break; + case GST_H264_B_SLICE: + primary_pic_type = 2; + break; + default: + g_assert_not_reached (); + break; + } + + size = sizeof (aud_data); + if (gst_h264_bit_writer_aud (primary_pic_type, TRUE, aud_data, + &size) != GST_H264_BIT_WRITER_OK) { + GST_ERROR_OBJECT (self, "Failed to generate the AUD"); + return FALSE; + } + + if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, + VAEncPackedHeaderRawData, aud_data, size * 8, FALSE)) { + GST_ERROR_OBJECT (self, "Failed to add the AUD"); + return FALSE; + } + + return TRUE; +} + +static void +_create_sei_cc_message (GstVideoCaptionMeta * cc_meta, + GstH264SEIMessage * sei_msg) +{ + guint8 *data; + GstH264RegisteredUserData *user_data; + + sei_msg->payloadType = GST_H264_SEI_REGISTERED_USER_DATA; + + user_data = &sei_msg->payload.registered_user_data; + + user_data->country_code = 181; + user_data->size = 10 + cc_meta->size; + + data = g_malloc (user_data->size); + + /* 16-bits itu_t_t35_provider_code */ + data0 = 0; + data1 = 49; + /* 32-bits ATSC_user_identifier */ + data2 = 'G'; + data3 = 'A'; + data4 = '9'; + data5 = '4'; + /* 8-bits ATSC1_data_user_data_type_code */ + data6 = 3; + /* 8-bits: + * 1 bit process_em_data_flag (0) + * 1 bit process_cc_data_flag (1) + * 1 bit additional_data_flag (0) + * 5-bits cc_count + */ + data7 = ((cc_meta->size / 3) & 0x1f) | 0x40; + /* 8 bits em_data, unused */ + data8 = 255; + + memcpy (data + 9, cc_meta->data, cc_meta->size); + + /* 8 marker bits */ + datauser_data->size - 1 = 255; + + user_data->data = data; +} + +static gboolean +_create_sei_cc_data (GPtrArray * cc_list, guint8 * sei_data, guint * data_size) +{ + GArray *msg_list = NULL; + GstH264BitWriterResult ret; + gint i; + + msg_list = g_array_new (TRUE, TRUE, sizeof (GstH264SEIMessage)); + g_array_set_clear_func (msg_list, (GDestroyNotify) gst_h264_sei_clear); + g_array_set_size (msg_list, cc_list->len); + + for (i = 0; i < cc_list->len; i++) { + GstH264SEIMessage *msg = &g_array_index (msg_list, GstH264SEIMessage, i); + _create_sei_cc_message (g_ptr_array_index (cc_list, i), msg); + } + + ret = gst_h264_bit_writer_sei (msg_list, TRUE, sei_data, data_size); + + g_array_unref (msg_list); + + return (ret == GST_H264_BIT_WRITER_OK); +} + +static void +_add_sei_cc (GstVaH264Enc * self, GstVideoCodecFrame * gst_frame) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + GstVaH264EncFrame *frame; + GPtrArray *cc_list = NULL; + GstVideoCaptionMeta *cc_meta; + gpointer iter = NULL; + guint8 *packed_sei = NULL; + guint sei_size = 0; + + frame = _enc_frame (gst_frame); + + /* SEI header size */ + sei_size = 6; + while ((cc_meta = (GstVideoCaptionMeta *) + gst_buffer_iterate_meta_filtered (gst_frame->input_buffer, &iter, + GST_VIDEO_CAPTION_META_API_TYPE))) { + if (cc_meta->caption_type != GST_VIDEO_CAPTION_TYPE_CEA708_RAW) + continue; + + if (!cc_list) + cc_list = g_ptr_array_new (); + + g_ptr_array_add (cc_list, cc_meta); + /* Add enough SEI message size for bitwriter. */ + sei_size += cc_meta->size + 50; + } + + if (!cc_list) + goto out; + + packed_sei = g_malloc0 (sei_size); + + if (!_create_sei_cc_data (cc_list, packed_sei, &sei_size)) { + GST_WARNING_OBJECT (self, "Failed to write the SEI CC data"); + goto out; + } + + if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, + VAEncPackedHeaderRawData, packed_sei, sei_size * 8, FALSE)) { + GST_WARNING_OBJECT (self, "Failed to add SEI CC data"); + goto out; + } + +out: + g_clear_pointer (&cc_list, g_ptr_array_unref); + if (packed_sei) + g_free (packed_sei); +} + +static gboolean +_encode_one_frame (GstVaH264Enc * self, GstVideoCodecFrame * gst_frame) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + VAEncPictureParameterBufferH264 pic_param; + GstH264PPS pps; + GstVaH264EncFrame *list016 = { NULL, }; + guint list0_num = 0; + GstVaH264EncFrame *list116 = { NULL, }; + guint list1_num = 0; + guint slice_of_mbs, slice_mod_mbs, slice_start_mb, slice_mbs; + gint i; + GstVaH264EncFrame *frame; + + g_return_val_if_fail (gst_frame, FALSE); + + frame = _enc_frame (gst_frame); + + if (self->aud && !_add_aud (self, frame)) + return FALSE; + + /* Repeat the SPS for IDR. */ + if (frame->poc == 0) { + VAEncSequenceParameterBufferH264 sequence; + + if (!gst_va_base_enc_add_rate_control_parameter (base, frame->picture, + self->rc.rc_ctrl_mode, self->rc.max_bitrate_bits, + self->rc.target_percentage, self->rc.qp_i, self->rc.min_qp, + self->rc.max_qp, self->rc.mbbrc)) + return FALSE; + + if (!gst_va_base_enc_add_quality_level_parameter (base, frame->picture, + self->rc.target_usage)) + return FALSE; + + if (!gst_va_base_enc_add_frame_rate_parameter (base, frame->picture)) + return FALSE; + + if (!gst_va_base_enc_add_hrd_parameter (base, frame->picture, + self->rc.rc_ctrl_mode, self->rc.cpb_length_bits)) + return FALSE; + + if (!gst_va_base_enc_add_trellis_parameter (base, frame->picture, + self->use_trellis)) + return FALSE; + + _fill_sequence_param (self, &sequence); + if (!_fill_sps (self, &sequence)) + return FALSE; + + if (!_add_sequence_parameter (self, frame->picture, &sequence)) + return FALSE; + + if ((self->packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE) + && !_add_sequence_header (self, frame)) + return FALSE; + } + + /* Non I frame, construct reference list. */ + if (frame->type != GST_H264_I_SLICE) { + GstVaH264EncFrame *vaf; + GstVideoCodecFrame *f; + + for (i = g_queue_get_length (&base->ref_list) - 1; i >= 0; i--) { + f = g_queue_peek_nth (&base->ref_list, i); + vaf = _enc_frame (f); + if (vaf->poc > frame->poc) + continue; + + list0list0_num = vaf; + list0_num++; + } + + /* reorder to select the most nearest forward frames. */ + g_qsort_with_data (list0, list0_num, sizeof (gpointer), + (GCompareDataFunc) _poc_des_compare, NULL); + + if (list0_num > self->gop.ref_num_list0) + list0_num = self->gop.ref_num_list0; + } + + if (frame->type == GST_H264_B_SLICE) { + GstVaH264EncFrame *vaf; + GstVideoCodecFrame *f; + + for (i = 0; i < g_queue_get_length (&base->ref_list); i++) { + f = g_queue_peek_nth (&base->ref_list, i); + vaf = _enc_frame (f); + if (vaf->poc < frame->poc) + continue; + + list1list1_num = vaf; + list1_num++; + } + + /* reorder to select the most nearest backward frames. */ + g_qsort_with_data (list1, list1_num, sizeof (gpointer), + (GCompareDataFunc) _poc_asc_compare, NULL); + + if (list1_num > self->gop.ref_num_list1) + list1_num = self->gop.ref_num_list1; + } + + g_assert (list0_num + list1_num <= self->gop.num_ref_frames); + + if (!_fill_picture_parameter (self, frame, &pic_param)) + return FALSE; + if (!_add_picture_parameter (self, frame, &pic_param)) + return FALSE; + _fill_pps (&pic_param, &self->sequence_hdr, &pps); + + if ((self->packed_headers & VA_ENC_PACKED_HEADER_PICTURE) + && frame->type == GST_H264_I_SLICE + && !_add_picture_header (self, frame, &pps)) + return FALSE; + + if (self->cc) { + /* CC errors are not fatal */ + _add_sei_cc (self, gst_frame); + } + + slice_of_mbs = self->mb_width * self->mb_height / self->num_slices; + slice_mod_mbs = self->mb_width * self->mb_height % self->num_slices; + slice_start_mb = 0; + slice_mbs = 0; + for (i = 0; i < self->num_slices; i++) { + VAEncSliceParameterBufferH264 slice; + + slice_mbs = slice_of_mbs; + /* divide the remainder to each equally */ + if (slice_mod_mbs) { + slice_mbs++; + slice_mod_mbs--; + } + + if (!_add_one_slice (self, frame, slice_start_mb, slice_mbs, &slice, + list0, list0_num, list1, list1_num)) + return FALSE; + + if ((self->packed_headers & VA_ENC_PACKED_HEADER_SLICE) && + (!_add_slice_header (self, frame, &pps, &slice, list0, list0_num, + list1, list1_num))) + return FALSE; + + slice_start_mb += slice_mbs; + } + + if (!gst_va_encoder_encode (base->encoder, frame->picture)) { + GST_ERROR_OBJECT (self, "Encode frame error"); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_va_h264_enc_flush (GstVideoEncoder * venc) +{ + GstVaH264Enc *self = GST_VA_H264_ENC (venc); + + /* begin from an IDR after flush. */ + self->gop.cur_frame_index = 0; + self->gop.cur_frame_num = 0; + + return GST_VIDEO_ENCODER_CLASS (parent_class)->flush (venc); +} + +static void +gst_va_h264_enc_prepare_output (GstVaBaseEnc * base, GstVideoCodecFrame * frame) +{ + GstVaH264Enc *self = GST_VA_H264_ENC (base); + GstVaH264EncFrame *frame_enc; + + frame_enc = _enc_frame (frame); + + frame->pts = + base->start_pts + base->frame_duration * frame_enc->total_frame_count; + /* The PTS should always be later than the DTS. */ + frame->dts = base->start_pts + base->frame_duration * + ((gint64) base->output_frame_count - + (gint64) self->gop.num_reorder_frames); + base->output_frame_count++; + frame->duration = base->frame_duration; +} + +static gint +_sort_by_frame_num (gconstpointer a, gconstpointer b, gpointer user_data) +{ + GstVaH264EncFrame *frame1 = _enc_frame ((GstVideoCodecFrame *) a); + GstVaH264EncFrame *frame2 = _enc_frame ((GstVideoCodecFrame *) b); + + g_assert (frame1->frame_num != frame2->frame_num); + + return frame1->frame_num - frame2->frame_num; +} + +static GstVideoCodecFrame * +_find_unused_reference_frame (GstVaH264Enc * self, GstVaH264EncFrame * frame) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + GstVaH264EncFrame *b_vaframe; + GstVideoCodecFrame *b_frame; + guint i; + + /* We still have more space. */ + if (g_queue_get_length (&base->ref_list) < self->gop.num_ref_frames) + return NULL; + + /* Not b_pyramid, sliding window is enough. */ + if (!self->gop.b_pyramid) + return g_queue_peek_head (&base->ref_list); + + /* I/P frame, just using sliding window. */ + if (frame->type != GST_H264_B_SLICE) + return g_queue_peek_head (&base->ref_list); + + /* Choose the B frame with lowest POC. */ + b_frame = NULL; + b_vaframe = NULL; + for (i = 0; i < g_queue_get_length (&base->ref_list); i++) { + GstVaH264EncFrame *vaf; + GstVideoCodecFrame *f; + + f = g_queue_peek_nth (&base->ref_list, i); + vaf = _enc_frame (f); + if (vaf->type != GST_H264_B_SLICE) + continue; + + if (!b_frame) { + b_frame = f; + b_vaframe = _enc_frame (b_frame); + continue; + } + + b_vaframe = _enc_frame (b_frame); + g_assert (vaf->poc != b_vaframe->poc); + if (vaf->poc < b_vaframe->poc) { + b_frame = f; + b_vaframe = _enc_frame (b_frame); + } + } + + /* No B frame as ref. */ + if (!b_frame) + return g_queue_peek_head (&base->ref_list); + + if (b_frame != g_queue_peek_head (&base->ref_list)) { + b_vaframe = _enc_frame (b_frame); + frame->unused_for_reference_pic_num = b_vaframe->frame_num; + GST_LOG_OBJECT (self, "The frame with POC: %d, pic_num %d will be" + " replaced by the frame with POC: %d, pic_num %d explicitly by" + " using memory_management_control_operation=1", + b_vaframe->poc, b_vaframe->frame_num, frame->poc, frame->frame_num); + } + + return b_frame; +} + +static GstFlowReturn +gst_va_h264_enc_encode_frame (GstVaBaseEnc * base, + GstVideoCodecFrame * gst_frame, gboolean is_last) +{ + GstVaH264Enc *self = GST_VA_H264_ENC (base); + GstVaH264EncFrame *frame; + GstVideoCodecFrame *unused_ref = NULL; + + frame = _enc_frame (gst_frame); + frame->last_frame = is_last; + + g_assert (frame->picture == NULL); + frame->picture = gst_va_encode_picture_new (base->encoder, + gst_frame->input_buffer); + + if (!frame->picture) { + GST_ERROR_OBJECT (self, "Failed to create the encode picture"); + return GST_FLOW_ERROR; + } + + if (frame->is_ref) + unused_ref = _find_unused_reference_frame (self, frame); + + if (!_encode_one_frame (self, gst_frame)) { + GST_ERROR_OBJECT (self, "Failed to encode the frame"); + return GST_FLOW_ERROR; + } + + g_queue_push_tail (&base->output_list, gst_video_codec_frame_ref (gst_frame)); + + if (frame->is_ref) { + if (unused_ref) { + if (!g_queue_remove (&base->ref_list, unused_ref)) + g_assert_not_reached (); + + gst_video_codec_frame_unref (unused_ref); + } + + /* Add it into the reference list. */ + g_queue_push_tail (&base->ref_list, gst_video_codec_frame_ref (gst_frame)); + g_queue_sort (&base->ref_list, _sort_by_frame_num, NULL); + + g_assert (g_queue_get_length (&base->ref_list) <= self->gop.num_ref_frames); + } + + return GST_FLOW_OK; +} + +static gboolean +gst_va_h264_enc_new_frame (GstVaBaseEnc * base, GstVideoCodecFrame * frame) +{ + GstVaH264EncFrame *frame_in; + + frame_in = gst_va_enc_frame_new (); + frame_in->total_frame_count = base->input_frame_count++; + gst_video_codec_frame_set_user_data (frame, frame_in, gst_va_enc_frame_free); + + return TRUE; +} + +/* *INDENT-OFF* */ +static const gchar *sink_caps_str = + GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_VA, + "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE ("{ NV12 }"); +/* *INDENT-ON* */ + +static const gchar *src_caps_str = "video/x-h264"; + +static gpointer +_register_debug_category (gpointer data) +{ + GST_DEBUG_CATEGORY_INIT (gst_va_h264enc_debug, "vah264enc", 0, + "VA h264 encoder"); + + return NULL; +} + +static void +gst_va_h264_enc_init (GTypeInstance * instance, gpointer g_class) +{ + GstVaH264Enc *self = GST_VA_H264_ENC (instance); + + /* default values */ + self->prop.key_int_max = 0; + self->prop.num_bframes = 0; + self->prop.num_iframes = 0; + self->prop.num_ref_frames = 3; + self->prop.b_pyramid = FALSE; + self->prop.num_slices = 1; + self->prop.min_qp = 1; + self->prop.max_qp = 51; + self->prop.qp_i = 26; + self->prop.qp_p = 26; + self->prop.qp_b = 26; + self->prop.use_dct8x8 = TRUE; + self->prop.use_cabac = TRUE; + self->prop.use_trellis = FALSE; + self->prop.aud = FALSE; + self->prop.cc = TRUE; + self->prop.mbbrc = 0; + self->prop.bitrate = 0; + self->prop.target_percentage = 66; + self->prop.target_usage = 4; + if (propertiesPROP_RATE_CONTROL) { + self->prop.rc_ctrl = + G_PARAM_SPEC_ENUM (propertiesPROP_RATE_CONTROL)->default_value; + } else { + self->prop.rc_ctrl = VA_RC_NONE; + } + self->prop.cpb_size = 0; +} + +static void +gst_va_h264_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVaH264Enc *self = GST_VA_H264_ENC (object); + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + + GST_OBJECT_LOCK (self); + + switch (prop_id) { + case PROP_KEY_INT_MAX: + self->prop.key_int_max = g_value_get_uint (value); + break; + case PROP_BFRAMES: + self->prop.num_bframes = g_value_get_uint (value); + break; + case PROP_IFRAMES: + self->prop.num_iframes = g_value_get_uint (value); + break; + case PROP_NUM_REF_FRAMES: + self->prop.num_ref_frames = g_value_get_uint (value); + break; + case PROP_B_PYRAMID: + self->prop.b_pyramid = g_value_get_boolean (value); + break; + case PROP_NUM_SLICES: + self->prop.num_slices = g_value_get_uint (value); + break; + case PROP_MIN_QP: + self->prop.min_qp = g_value_get_uint (value); + break; + case PROP_MAX_QP: + self->prop.max_qp = g_value_get_uint (value); + break; + case PROP_QP_I: + self->prop.qp_i = g_value_get_uint (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + break; + case PROP_QP_P: + self->prop.qp_p = g_value_get_uint (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + break; + case PROP_QP_B: + self->prop.qp_b = g_value_get_uint (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + break; + case PROP_DCT8X8: + self->prop.use_dct8x8 = g_value_get_boolean (value); + break; + case PROP_CABAC: + self->prop.use_cabac = g_value_get_boolean (value); + break; + case PROP_TRELLIS: + self->prop.use_trellis = g_value_get_boolean (value); + break; + case PROP_AUD: + self->prop.aud = g_value_get_boolean (value); + break; + case PROP_CC: + self->prop.cc = g_value_get_boolean (value); + break; + case PROP_MBBRC:{ + /* Macroblock-level rate control. + * 0: use default, + * 1: always enable, + * 2: always disable, + * other: reserved. */ + switch (g_value_get_enum (value)) { + case GST_VA_FEATURE_DISABLED: + self->prop.mbbrc = 2; + break; + case GST_VA_FEATURE_ENABLED: + self->prop.mbbrc = 1; + break; + case GST_VA_FEATURE_AUTO: + self->prop.mbbrc = 0; + break; + } + break; + } + case PROP_BITRATE: + self->prop.bitrate = g_value_get_uint (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + break; + case PROP_TARGET_PERCENTAGE: + self->prop.target_percentage = g_value_get_uint (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + break; + case PROP_TARGET_USAGE: + self->prop.target_usage = g_value_get_uint (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + break; + case PROP_RATE_CONTROL: + self->prop.rc_ctrl = g_value_get_enum (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + break; + case PROP_CPB_SIZE: + self->prop.cpb_size = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } + + GST_OBJECT_UNLOCK (self); + +#ifndef GST_DISABLE_GST_DEBUG + if (!g_atomic_int_get (&GST_VA_BASE_ENC (self)->reconf) + && base->encoder && gst_va_encoder_is_open (base->encoder)) { + GST_WARNING_OBJECT (self, "Property `%s` change ignored while processing.", + pspec->name); + } +#endif + +} + +static void +gst_va_h264_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstVaH264Enc *const self = GST_VA_H264_ENC (object); + + GST_OBJECT_LOCK (self); + + switch (prop_id) { + case PROP_KEY_INT_MAX: + g_value_set_uint (value, self->prop.key_int_max); + break; + case PROP_BFRAMES: + g_value_set_uint (value, self->prop.num_bframes); + break; + case PROP_IFRAMES: + g_value_set_uint (value, self->prop.num_iframes); + break; + case PROP_NUM_REF_FRAMES: + g_value_set_uint (value, self->prop.num_ref_frames); + break; + case PROP_B_PYRAMID: + g_value_set_boolean (value, self->prop.b_pyramid); + break; + case PROP_NUM_SLICES: + g_value_set_uint (value, self->prop.num_slices); + break; + case PROP_MIN_QP: + g_value_set_uint (value, self->prop.min_qp); + break; + case PROP_MAX_QP: + g_value_set_uint (value, self->prop.max_qp); + break; + case PROP_QP_I: + g_value_set_uint (value, self->prop.qp_i); + break; + case PROP_QP_P: + g_value_set_uint (value, self->prop.qp_p); + break; + case PROP_QP_B: + g_value_set_uint (value, self->prop.qp_b); + break; + case PROP_DCT8X8: + g_value_set_boolean (value, self->prop.use_dct8x8); + break; + case PROP_CABAC: + g_value_set_boolean (value, self->prop.use_cabac); + break; + case PROP_TRELLIS: + g_value_set_boolean (value, self->prop.use_trellis); + break; + case PROP_AUD: + g_value_set_boolean (value, self->prop.aud); + break; + case PROP_CC: + g_value_set_boolean (value, self->prop.cc); + break; + case PROP_MBBRC: + g_value_set_enum (value, self->prop.mbbrc); + break; + case PROP_BITRATE: + g_value_set_uint (value, self->prop.bitrate); + break; + case PROP_TARGET_PERCENTAGE: + g_value_set_uint (value, self->prop.target_percentage); + break; + case PROP_TARGET_USAGE: + g_value_set_uint (value, self->prop.target_usage); + break; + case PROP_RATE_CONTROL: + g_value_set_enum (value, self->prop.rc_ctrl); + break; + case PROP_CPB_SIZE: + g_value_set_uint (value, self->prop.cpb_size); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } + + GST_OBJECT_UNLOCK (self); +} + +static void +gst_va_h264_enc_class_init (gpointer g_klass, gpointer class_data) +{ + GstCaps *src_doc_caps, *sink_doc_caps; + GstPadTemplate *sink_pad_templ, *src_pad_templ; + GObjectClass *object_class = G_OBJECT_CLASS (g_klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (g_klass); + GstVideoEncoderClass *venc_class = GST_VIDEO_ENCODER_CLASS (g_klass); + GstVaBaseEncClass *va_enc_class = GST_VA_BASE_ENC_CLASS (g_klass); + GstVaH264EncClass *vah264enc_class = GST_VA_H264_ENC_CLASS (g_klass); + GstVaDisplay *display; + GstVaEncoder *encoder; + struct CData *cdata = class_data; + gchar *long_name; + const gchar *name, *desc; + gint n_props = N_PROPERTIES; + GParamFlags param_flags = + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT; + + if (cdata->entrypoint == VAEntrypointEncSlice) { + desc = "VA-API based H.264 video encoder"; + name = "VA-API H.264 Encoder"; + } else { + desc = "VA-API based H.264 low power video encoder"; + name = "VA-API H.264 Low Power Encoder"; + } + + if (cdata->description) + long_name = g_strdup_printf ("%s in %s", name, cdata->description); + else + long_name = g_strdup (name); + + gst_element_class_set_metadata (element_class, long_name, + "Codec/Encoder/Video/Hardware", desc, "He Junyan <junyan.he@intel.com>"); + + sink_doc_caps = gst_caps_from_string (sink_caps_str); + src_doc_caps = gst_caps_from_string (src_caps_str); + + parent_class = g_type_class_peek_parent (g_klass); + + va_enc_class->codec = H264; + va_enc_class->entrypoint = cdata->entrypoint; + va_enc_class->render_device_path = g_strdup (cdata->render_device_path); + + sink_pad_templ = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + cdata->sink_caps); + gst_element_class_add_pad_template (element_class, sink_pad_templ); + + gst_pad_template_set_documentation_caps (sink_pad_templ, sink_doc_caps); + gst_caps_unref (sink_doc_caps); + + src_pad_templ = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + cdata->src_caps); + gst_element_class_add_pad_template (element_class, src_pad_templ); + + gst_pad_template_set_documentation_caps (src_pad_templ, src_doc_caps); + gst_caps_unref (src_doc_caps); + + object_class->set_property = gst_va_h264_enc_set_property; + object_class->get_property = gst_va_h264_enc_get_property; + + venc_class->flush = GST_DEBUG_FUNCPTR (gst_va_h264_enc_flush); + + va_enc_class->reset_state = GST_DEBUG_FUNCPTR (gst_va_h264_enc_reset_state); + va_enc_class->reconfig = GST_DEBUG_FUNCPTR (gst_va_h264_enc_reconfig); + va_enc_class->new_frame = GST_DEBUG_FUNCPTR (gst_va_h264_enc_new_frame); + va_enc_class->reorder_frame = + GST_DEBUG_FUNCPTR (gst_va_h264_enc_reorder_frame); + va_enc_class->encode_frame = GST_DEBUG_FUNCPTR (gst_va_h264_enc_encode_frame); + va_enc_class->prepare_output = + GST_DEBUG_FUNCPTR (gst_va_h264_enc_prepare_output); + + { + display = + gst_va_display_drm_new_from_path (va_enc_class->render_device_path); + encoder = gst_va_encoder_new (display, va_enc_class->codec, + va_enc_class->entrypoint); + if (gst_va_encoder_get_rate_control_enum (encoder, + vah264enc_class->rate_control)) { + gchar *basename = g_path_get_basename (va_enc_class->render_device_path); + g_snprintf (vah264enc_class->rate_control_type_name, + G_N_ELEMENTS (vah264enc_class->rate_control_type_name) - 1, + "GstVaEncoderRateControl_%" GST_FOURCC_FORMAT "%s_%s", + GST_FOURCC_ARGS (va_enc_class->codec), + (va_enc_class->entrypoint == VAEntrypointEncSliceLP) ? "_LP" : "", + basename); + vah264enc_class->rate_control_type = + g_enum_register_static (vah264enc_class->rate_control_type_name, + vah264enc_class->rate_control); + gst_type_mark_as_plugin_api (vah264enc_class->rate_control_type, 0); + g_free (basename); + } + gst_object_unref (encoder); + gst_object_unref (display); + } + + g_free (long_name); + g_free (cdata->description); + g_free (cdata->render_device_path); + gst_caps_unref (cdata->src_caps); + gst_caps_unref (cdata->sink_caps); + g_free (cdata); + + /** + * GstVaH264Enc:key-int-max: + * + * The maximal distance between two keyframes. + */ + propertiesPROP_KEY_INT_MAX = g_param_spec_uint ("key-int-max", + "Key frame maximal interval", + "The maximal distance between two keyframes. It decides the size of GOP" + " (0: auto-calculate)", 0, MAX_GOP_SIZE, 0, param_flags); + + /** + * GstVaH264Enc:b-frames: + * + * Number of B-frames between two reference frames. + */ + propertiesPROP_BFRAMES = g_param_spec_uint ("b-frames", "B Frames", + "Number of B frames between I and P reference frames", 0, 31, 0, + param_flags); + + /** + * GstVaH264Enc:i-frames: + * + * Force the number of i-frames insertion within one GOP. + */ + propertiesPROP_IFRAMES = g_param_spec_uint ("i-frames", "I Frames", + "Force the number of I frames insertion within one GOP, not including the " + "first IDR frame", 0, 1023, 0, param_flags); + + /** + * GstVaH264Enc:ref-frames: + * + * The number of reference frames. + */ + propertiesPROP_NUM_REF_FRAMES = g_param_spec_uint ("ref-frames", + "Number of Reference Frames", + "Number of reference frames, including both the forward and the backward", + 0, 16, 3, param_flags); + + /** + * GstVaH264Enc:b-pyramid: + * + * Enable the b-pyramid reference structure in GOP. + */ + propertiesPROP_B_PYRAMID = g_param_spec_boolean ("b-pyramid", "b pyramid", + "Enable the b-pyramid reference structure in the GOP", FALSE, + param_flags); + + /** + * GstVaH264Enc:num-slices: + * + * The number of slices per frame. + */ + propertiesPROP_NUM_SLICES = g_param_spec_uint ("num-slices", + "Number of Slices", "Number of slices per frame", 1, 200, 1, param_flags); + + /** + * GstVaH264Enc:max-qp: + * + * The maximum quantizer value. + */ + propertiesPROP_MAX_QP = g_param_spec_uint ("max-qp", "Maximum QP", + "Maximum quantizer value for each frame", 0, 51, 51, param_flags); + + /** + * GstVaH264Enc:min-qp: + * + * The minimum quantizer value. + */ + propertiesPROP_MIN_QP = g_param_spec_uint ("min-qp", "Minimum QP", + "Minimum quantizer value for each frame", 0, 51, 1, param_flags); + + /** + * GstVaH264Enc:qpi: + * + * The quantizer value for I frame. + * + * In CQP mode, it specifies the QP of I frame, in other mode, it specifies + * the init QP of all frames. + */ + propertiesPROP_QP_I = g_param_spec_uint ("qpi", "I Frame QP", + "The quantizer value for I frame. In CQP mode, it specifies the QP of I " + "frame, in other mode, it specifies the init QP of all frames", 0, 51, 26, + param_flags | GST_PARAM_MUTABLE_PLAYING); + + /** + * GstVaH264Enc:qpp: + * + * The quantizer value for P frame. Available only in CQP mode. + */ + propertiesPROP_QP_P = g_param_spec_uint ("qpp", + "The quantizer value for P frame", + "The quantizer value for P frame. Available only in CQP mode", + 0, 51, 26, param_flags | GST_PARAM_MUTABLE_PLAYING); + + /** + * GstVaH264Enc:qpb: + * + * The quantizer value for B frame. Available only in CQP mode. + */ + propertiesPROP_QP_B = g_param_spec_uint ("qpb", + "The quantizer value for B frame", + "The quantizer value for B frame. Available only in CQP mode", + 0, 51, 26, param_flags | GST_PARAM_MUTABLE_PLAYING); + + /** + * GstVaH264Enc:dct8x8: + * + * Enable adaptive use of 8x8 transforms in I-frames. This improves + * the compression ratio but requires high profile at least. + */ + propertiesPROP_DCT8X8 = g_param_spec_boolean ("dct8x8", "Enable 8x8 DCT", + "Enable adaptive use of 8x8 transforms in I-frames", TRUE, param_flags); + + /** + * GstVaH264Enc:cabac: + * + * It enables CABAC entropy coding mode to improve compression ratio, + * but requires main profile at least. + */ + propertiesPROP_CABAC = g_param_spec_boolean ("cabac", "Enable CABAC", + "Enable CABAC entropy coding mode", TRUE, param_flags); + + /** + * GstVaH264Enc:trellis: + * + * It enable the trellis quantization method. Trellis is an improved + * quantization algorithm. + */ + propertiesPROP_TRELLIS = g_param_spec_boolean ("trellis", "Enable trellis", + "Enable the trellis quantization method", FALSE, param_flags); + + /** + * GstVaH264Enc:aud: + * + * Insert the AU (Access Unit) delimeter for each frame. + */ + propertiesPROP_AUD = g_param_spec_boolean ("aud", "Insert AUD", + "Insert AU (Access Unit) delimeter for each frame", FALSE, param_flags); + + /** + * GstVaH264Enc:cc-insert: + * + * Closed Caption Insert mode. Only CEA-708 RAW format is supported for now. + */ + propertiesPROP_CC = g_param_spec_boolean ("cc-insert", + "Insert Closed Captions", + "Insert CEA-708 Closed Captions", + TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT); + + /** + * GstVaH264Enc:mbbrc: + * + * Macroblock level bitrate control. Not available in CQP mode. + */ + propertiesPROP_MBBRC = g_param_spec_enum ("mbbrc", + "Macroblock level Bitrate Control", + "Macroblock level Bitrate Control. Not available in CQP mode", + GST_TYPE_VA_FEATURE, GST_VA_FEATURE_AUTO, param_flags); + + /** + * GstVaH264Enc:bitrate: + * + * The desired target bitrate, expressed in kbps. Not available in CQP mode. + * + * * **CBR**: This applies equally to the minimum, maximum and target bitrate. + * * **VBR**: This applies to the target bitrate. The driver will use the + * "target-percentage" together to calculate the minimum and maximum + * bitrate. + * * **VCM**: This applies to the target bitrate. The minimum and maximum + * bitrate are not needed. + */ + propertiesPROP_BITRATE = g_param_spec_uint ("bitrate", "Bitrate (kbps)", + "The desired bitrate expressed in kbps (0: auto-calculate)", + 0, 2000 * 1024, 0, param_flags | GST_PARAM_MUTABLE_PLAYING); + + /** + * GstVaH264Enc:target-percentage: + * + * The target percentage of the max bitrate, and expressed in uint, equal to + * "target percentage" * 100. Available only when rate-control is VBR. + * + * "target percentage" = "target bitrate" * 100 / "max bitrate" + * + * The driver uses it to calculate the minimum and maximum bitrate. + */ + propertiesPROP_TARGET_PERCENTAGE = g_param_spec_uint ("target-percentage", + "target bitrate percentage", + "The percentage for 'target bitrate'/'maximum bitrate' (Only in VBR)", + 50, 100, 66, param_flags | GST_PARAM_MUTABLE_PLAYING); + + /** + * GstVaH264Enc:target-usage: + * + * The target usage of the encoder. + * + * It controls and balances the encoding speed and the encoding quality. The + * lower value has better quality but slower speed, the higher value has + * faster speed but lower quality. + */ + propertiesPROP_TARGET_USAGE = g_param_spec_uint ("target-usage", + "target usage", + "The target usage to control and balance the encoding speed/quality", + 1, 7, 4, param_flags | GST_PARAM_MUTABLE_PLAYING); + + /** + * GstVaH264Enc:cpb-size: + * + * The desired max CPB size in Kb (0: auto-calculate). + */ + propertiesPROP_CPB_SIZE = g_param_spec_uint ("cpb-size", + "max CPB size in Kb", + "The desired max CPB size in Kb (0: auto-calculate)", 0, 2000 * 1024, 0, + param_flags | GST_PARAM_MUTABLE_PLAYING); + + if (vah264enc_class->rate_control_type > 0) { + propertiesPROP_RATE_CONTROL = g_param_spec_enum ("rate-control", + "rate control mode", "The desired rate control mode for the encoder", + vah264enc_class->rate_control_type, + vah264enc_class->rate_control0.value, + GST_PARAM_CONDITIONALLY_AVAILABLE | GST_PARAM_MUTABLE_PLAYING + | param_flags); + } else { + n_props--; + propertiesPROP_RATE_CONTROL = NULL; + } + + g_object_class_install_properties (object_class, n_props, properties); +} + +static GstCaps * +_complete_src_caps (GstCaps * srccaps) +{ + GstCaps *caps = gst_caps_copy (srccaps); + + gst_caps_set_simple (caps, "alignment", G_TYPE_STRING, "au", "stream-format", + G_TYPE_STRING, "byte-stream", NULL); + + return caps; +} + +gboolean +gst_va_h264_enc_register (GstPlugin * plugin, GstVaDevice * device, + GstCaps * sink_caps, GstCaps * src_caps, guint rank, + VAEntrypoint entrypoint) +{ + static GOnce debug_once = G_ONCE_INIT; + GType type; + GTypeInfo type_info = { + .class_size = sizeof (GstVaH264EncClass), + .class_init = gst_va_h264_enc_class_init, + .instance_size = sizeof (GstVaH264Enc), + .instance_init = gst_va_h264_enc_init, + }; + struct CData *cdata; + gboolean ret; + gchar *type_name, *feature_name; + + g_return_val_if_fail (GST_IS_PLUGIN (plugin), FALSE); + g_return_val_if_fail (GST_IS_VA_DEVICE (device), FALSE); + g_return_val_if_fail (GST_IS_CAPS (sink_caps), FALSE); + g_return_val_if_fail (GST_IS_CAPS (src_caps), FALSE); + g_return_val_if_fail (entrypoint == VAEntrypointEncSlice || + entrypoint == VAEntrypointEncSliceLP, FALSE); + + cdata = g_new (struct CData, 1); + cdata->entrypoint = entrypoint; + cdata->description = NULL; + cdata->render_device_path = g_strdup (device->render_device_path); + cdata->sink_caps = gst_caps_ref (sink_caps); + cdata->src_caps = _complete_src_caps (src_caps); + + /* class data will be leaked if the element never gets instantiated */ + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + type_info.class_data = cdata; + + /* The first encoder to be registered should use a constant name, + * like vah264enc, for any additional encoders, we create unique + * names, using inserting the render device name. */ + if (device->index == 0) { + if (entrypoint == VAEntrypointEncSlice) { + type_name = g_strdup ("GstVaH264Enc"); + feature_name = g_strdup ("vah264enc"); + } else { + type_name = g_strdup ("GstVaH264LPEnc"); + feature_name = g_strdup ("vah264lpenc"); + } + } else { + gchar *basename = g_path_get_basename (device->render_device_path); + if (entrypoint == VAEntrypointEncSlice) { + type_name = g_strdup_printf ("GstVa%sH264Enc", basename); + feature_name = g_strdup_printf ("va%sh264enc", basename); + } else { + type_name = g_strdup_printf ("GstVa%sH264LPEnc", basename); + feature_name = g_strdup_printf ("va%sh264lpenc", basename); + } + cdata->description = basename; + /* lower rank for non-first device */ + if (rank > 0) + rank--; + } + + g_once (&debug_once, _register_debug_category, NULL); + type = g_type_register_static (GST_TYPE_VA_BASE_ENC, + type_name, &type_info, 0); + ret = gst_element_register (plugin, feature_name, rank, type); + + g_free (type_name); + g_free (feature_name); + + return ret; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvah264enc.h
Added
@@ -0,0 +1,35 @@ +/* GStreamer + * Copyright (C) 2021 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "gstvadevice.h" + +G_BEGIN_DECLS + +gboolean gst_va_h264_enc_register (GstPlugin * plugin, + GstVaDevice * device, + GstCaps * sink_caps, + GstCaps * src_caps, + guint rank, + VAEntrypoint entrypoint); + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvah265dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvah265dec.c
Changed
@@ -88,10 +88,6 @@ { GstVaBaseDec parent; - GstFlowReturn last_ret; - - gint coded_width; - gint coded_height; gint dpb_size; VAPictureParameterBufferHEVCExtension pic_param; @@ -128,9 +124,12 @@ static gboolean _is_screen_content_ext_profile (VAProfile profile) { - if (profile == VAProfileHEVCSccMain - || profile == VAProfileHEVCSccMain10 - || profile == VAProfileHEVCSccMain444) + if (profile == VAProfileHEVCSccMain || profile == VAProfileHEVCSccMain10 + || profile == VAProfileHEVCSccMain444 +#if VA_CHECK_VERSION(1, 8, 0) + || profile == VAProfileHEVCSccMain444_10 +#endif + ) return TRUE; return FALSE; @@ -229,7 +228,9 @@ { GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); GstVaH265Dec *self = GST_VA_H265_DEC (decoder); + GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); GstVaDecodePicture *va_pic; + gboolean ret; va_pic = gst_h265_picture_get_user_data (picture); g_assert (va_pic->gstbuffer); @@ -237,21 +238,15 @@ GST_LOG_OBJECT (self, "Outputting picture %p (poc %d)", picture, picture->pic_order_cnt); - if (self->last_ret != GST_FLOW_OK) { - gst_h265_picture_unref (picture); - _replace_previous_slice (self, NULL, 0); - gst_video_decoder_drop_frame (GST_VIDEO_DECODER (self), frame); - return self->last_ret; - } - gst_buffer_replace (&frame->output_buffer, va_pic->gstbuffer); - if (base->copy_frames) - gst_va_base_dec_copy_output_buffer (base, frame); - + ret = gst_va_base_dec_process_output (base, frame, picture->discont_state, + picture->buffer_flags); gst_h265_picture_unref (picture); - return gst_video_decoder_finish_frame (GST_VIDEO_DECODER (self), frame); + if (ret) + return gst_video_decoder_finish_frame (vdec, frame); + return GST_FLOW_ERROR; } static void @@ -571,7 +566,7 @@ { VAPictureParameterBufferHEVCRext *pic_param = &decoder->pic_param.rext; - GstH265SPSExtensionParams *sps_ext = &sps->sps_extnsion_params; + GstH265SPSExtensionParams *sps_ext = &sps->sps_extension_params; GstH265PPSExtensionParams *pps_ext = &pps->pps_extension_params; /* *INDENT-OFF* */ @@ -857,6 +852,7 @@ GstVaDecodePicture *pic; GstBuffer *output_buffer; GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); + GstFlowReturn ret = GST_FLOW_ERROR; if (base->need_negotiation) { if (!gst_video_decoder_negotiate (vdec)) { @@ -866,11 +862,8 @@ } output_buffer = gst_video_decoder_allocate_output_buffer (vdec); - if (!output_buffer) { - self->last_ret = GST_FLOW_ERROR; + if (!output_buffer) goto error; - } - self->last_ret = GST_FLOW_OK; pic = gst_va_decode_picture_new (base->decoder, output_buffer); gst_buffer_unref (output_buffer); @@ -887,8 +880,8 @@ { GST_WARNING_OBJECT (self, "Failed to allocated output buffer, return %s", - gst_flow_get_name (self->last_ret)); - return self->last_ret; + gst_flow_get_name (ret)); + return ret; } } @@ -971,8 +964,10 @@ P (SCREEN_EXTENDED_MAIN, SccMain), P (SCREEN_EXTENDED_MAIN_10, SccMain10), P (SCREEN_EXTENDED_MAIN_444, SccMain444), - /*P (SCREEN_EXTENDED_MAIN_444_10, ), - P (SCREEN_EXTENDED_HIGH_THROUGHPUT_444, ), +#if VA_CHECK_VERSION(1, 8, 0) + P (SCREEN_EXTENDED_MAIN_444_10, SccMain444_10), +#endif + /*P (SCREEN_EXTENDED_HIGH_THROUGHPUT_444, ), P (SCREEN_EXTENDED_HIGH_THROUGHPUT_444_10, ), P (SCREEN_EXTENDED_HIGH_THROUGHPUT_444_14, ), P (MULTIVIEW_MAIN, ), @@ -1051,6 +1046,7 @@ { GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); GstVaH265Dec *self = GST_VA_H265_DEC (decoder); + GstVideoInfo *info = &base->output_info; VAProfile profile; gint display_width; gint display_height; @@ -1087,26 +1083,26 @@ rt_format, sps->width, sps->height)) { base->profile = profile; base->rt_format = rt_format; - self->coded_width = sps->width; - self->coded_height = sps->height; + base->width = sps->width; + base->height = sps->height; negotiation_needed = TRUE; GST_INFO_OBJECT (self, "Format changed to %s %x (%dx%d)", - gst_va_profile_name (profile), rt_format, self->coded_width, - self->coded_height); + gst_va_profile_name (profile), rt_format, base->width, base->height); } - if (base->width != display_width || base->height != display_height) { - base->width = display_width; - base->height = display_height; + if (GST_VIDEO_INFO_WIDTH (info) != display_width || + GST_VIDEO_INFO_HEIGHT (info) != display_height) { + GST_VIDEO_INFO_WIDTH (info) = display_width; + GST_VIDEO_INFO_HEIGHT (info) = display_height; negotiation_needed = TRUE; - GST_INFO_OBJECT (self, "Resolution changed to %dx%d", base->width, - base->height); + GST_INFO_OBJECT (self, "Resolution changed to %dx%d", + GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info)); } - base->need_valign = base->width < self->coded_width - || base->height < self->coded_height; + base->need_valign = GST_VIDEO_INFO_WIDTH (info) < base->width || + GST_VIDEO_INFO_HEIGHT (info) < base->height; if (base->need_valign) { /* *INDENT-OFF* */ if (base->valign.padding_left != padding_left || @@ -1127,8 +1123,9 @@ } base->min_buffers = self->dpb_size + 4; /* dpb size + scratch surfaces */ - base->need_negotiation = negotiation_needed; + g_clear_pointer (&base->input_state, gst_video_codec_state_unref); + base->input_state = gst_video_codec_state_ref (decoder->input_state); { /* FIXME: We don't have parser API for sps_range_extension, so @@ -1200,52 +1197,6 @@ return caps; } -static gboolean -gst_va_h265_dec_negotiate (GstVideoDecoder * decoder) -{ - GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); - GstVaH265Dec *self = GST_VA_H265_DEC (decoder); - GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; - GstCapsFeatures *capsfeatures = NULL; - GstH265Decoder *h265dec = GST_H265_DECODER (decoder); - - /* Ignore downstream renegotiation request. */ - if (!base->need_negotiation) - return TRUE; - - base->need_negotiation = FALSE; - - if (gst_va_decoder_is_open (base->decoder) - && !gst_va_decoder_close (base->decoder)) - return FALSE; - - if (!gst_va_decoder_open (base->decoder, base->profile, base->rt_format)) - return FALSE; - - if (!gst_va_decoder_set_frame_size (base->decoder, self->coded_width, - self->coded_height)) - return FALSE; - - if (base->output_state) - gst_video_codec_state_unref (base->output_state); - - gst_va_base_dec_get_preferred_format_and_caps_features (base, &format, - &capsfeatures); - - base->output_state = - gst_video_decoder_set_output_state (decoder, format, - base->width, base->height, h265dec->input_state); - - base->output_state->caps = gst_video_info_to_caps (&base->output_state->info); - if (capsfeatures) - gst_caps_set_features_simple (base->output_state->caps, capsfeatures); - - GST_INFO_OBJECT (self, "Negotiated caps %" GST_PTR_FORMAT, - base->output_state->caps); - - return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); -} - static void gst_va_h265_dec_dispose (GObject * object) { @@ -1284,6 +1235,13 @@ parent_class = g_type_class_peek_parent (g_class); + /** + * GstVaH265Dec:device-path: + * + * It shows the DRM device path used for the VA operation, if any. + * + * Since: 1.22 + */ gst_va_base_dec_class_init (GST_VA_BASE_DEC_CLASS (g_class), HEVC, cdata->render_device_path, cdata->sink_caps, cdata->src_caps, src_doc_caps, sink_doc_caps); @@ -1291,7 +1249,6 @@ gobject_class->dispose = gst_va_h265_dec_dispose; decoder_class->getcaps = GST_DEBUG_FUNCPTR (gst_va_h265_dec_getcaps); - decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_va_h265_dec_negotiate); h265decoder_class->new_sequence = GST_DEBUG_FUNCPTR (gst_va_h265_dec_new_sequence); @@ -1366,16 +1323,14 @@ type_info.class_data = cdata; - type_name = g_strdup ("GstVaH265Dec"); - feature_name = g_strdup ("vah265dec"); - /* The first decoder to be registered should use a constant name, * like vah265dec, for any additional decoders, we create unique * names, using inserting the render device name. */ - if (g_type_from_name (type_name)) { + if (device->index == 0) { + type_name = g_strdup ("GstVaH265Dec"); + feature_name = g_strdup ("vah265dec"); + } else { gchar *basename = g_path_get_basename (device->render_device_path); - g_free (type_name); - g_free (feature_name); type_name = g_strdup_printf ("GstVa%sH265Dec", basename); feature_name = g_strdup_printf ("va%sh265dec", basename); cdata->description = basename;
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvah265enc.c
Added
@@ -0,0 +1,5334 @@ +/* GStreamer + * Copyright (C) 2022 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-vah265enc + * @title: vah265enc + * @short_description: A VA-API based H265 video encoder + * + * vah265enc encodes raw video VA surfaces into H.265 bitstreams using + * the installed and chosen VA-API(https://01.org/linuxmedia/vaapi) + * driver. + * + * The raw video frames in main memory can be imported into VA surfaces. + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc num-buffers=60 ! timeoverlay ! vah265enc ! h265parse ! mp4mux ! filesink location=test.mp4 + * ``` + * + * Since: 1.22 + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstvah265enc.h" + +#include <gst/codecparsers/gsth265bitwriter.h> +#include <gst/va/gstva.h> +#include <gst/va/gstvavideoformat.h> +#include <gst/video/video.h> +#include <va/va_drmcommon.h> + +#include "vacompat.h" +#include "gstvabaseenc.h" +#include "gstvaencoder.h" +#include "gstvacaps.h" +#include "gstvaprofile.h" +#include "gstvadisplay_priv.h" + +GST_DEBUG_CATEGORY_STATIC (gst_va_h265enc_debug); +#define GST_CAT_DEFAULT gst_va_h265enc_debug + +#define GST_VA_H265_ENC(obj) ((GstVaH265Enc *) obj) +#define GST_VA_H265_ENC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), G_TYPE_FROM_INSTANCE (obj), GstVaH265EncClass)) +#define GST_VA_H265_ENC_CLASS(klass) ((GstVaH265EncClass *) klass) + +typedef struct _GstVaH265Enc GstVaH265Enc; +typedef struct _GstVaH265EncClass GstVaH265EncClass; +typedef struct _GstVaH265EncFrame GstVaH265EncFrame; +typedef struct _GstVaH265LevelLimits GstVaH265LevelLimits; + +enum +{ + PROP_KEY_INT_MAX = 1, + PROP_BFRAMES, + PROP_IFRAMES, + PROP_NUM_REF_FRAMES, + PROP_B_PYRAMID, + PROP_NUM_SLICES, + PROP_MIN_QP, + PROP_MAX_QP, + PROP_QP_I, + PROP_QP_P, + PROP_QP_B, + PROP_TRELLIS, + PROP_MBBRC, + PROP_BITRATE, + PROP_TARGET_PERCENTAGE, + PROP_TARGET_USAGE, + PROP_RATE_CONTROL, + PROP_CPB_SIZE, + PROP_AUD, + PROP_NUM_TILE_COLS, + PROP_NUM_TILE_ROWS, + N_PROPERTIES +}; + +static GParamSpec *propertiesN_PROPERTIES; + +static GstObjectClass *parent_class = NULL; + +/* Scale factor for bitrate (HRD bit_rate_scale: min = 6) */ +#define SX_BITRATE 6 +/* Scale factor for CPB size (HRD cpb_size_scale: min = 4) */ +#define SX_CPB_SIZE 4 +/* Maximum sizes for common headers (in bits) */ +#define MAX_PROFILE_TIER_LEVEL_SIZE 684 +#define MAX_VPS_HDR_SIZE 13781 +#define MAX_SPS_HDR_SIZE 615 +#define MAX_SHORT_TERM_REFPICSET_SIZE 55 +#define MAX_VUI_PARAMS_SIZE 267 +#define MAX_HRD_PARAMS_SIZE 8196 +#define MAX_PPS_HDR_SIZE 274 +#define MAX_SLICE_HDR_SIZE 33660 + +#define MAX_GOP_SIZE 1024 + +/* The max tiles in column according to spec A1 */ +#define MAX_COL_TILES 20 +/* The max tiles in row according to spec A1 */ +#define MAX_ROW_TILES 22 + +/* *INDENT-OFF* */ +struct _GstVaH265EncClass +{ + GstVaBaseEncClass parent_class; + + GType rate_control_type; + char rate_control_type_name64; + GEnumValue rate_control16; +}; +/* *INDENT-ON* */ + +struct _GstVaH265Enc +{ + /*< private > */ + GstVaBaseEnc parent; + + /* properties */ + struct + { + /* kbps */ + guint bitrate; + /* VA_RC_XXX */ + guint32 rc_ctrl; + guint key_int_max; + guint32 num_ref_frames; + gboolean b_pyramid; + guint32 num_bframes; + guint32 num_iframes; + guint32 min_qp; + guint32 max_qp; + guint32 qp_i; + guint32 qp_p; + guint32 qp_b; + gboolean use_trellis; + gboolean aud; + guint32 mbbrc; + guint32 num_slices; + guint32 num_tile_cols; + guint32 num_tile_rows; + guint32 cpb_size; + guint32 target_percentage; + guint32 target_usage; + } prop; + + /* H265 fields */ + guint32 ctu_size; + guint32 min_coding_block_size; + guint32 ctu_width; /* CTU == Coding Tree Unit */ + guint32 ctu_height; + /* Aligned to 16 */ + guint32 luma_width; + guint32 luma_height; + /* Crop rectangle */ + gboolean conformance_window_flag; + guint32 conf_win_left_offset; + guint32 conf_win_right_offset; + guint32 conf_win_top_offset; + guint32 conf_win_bottom_offset; + + guint bits_depth_luma_minus8; + guint bits_depth_chroma_minus8; + + guint8 level_idc; + /* Set true if high tier */ + gboolean tier_flag; + const gchar *level_str; + guint min_cr; + + gboolean aud; + guint32 packed_headers; + + struct + { + guint32 num_slices; + /* start address in CTUs */ + guint32 *slice_segment_address; + /* CTUs in this slice */ + guint32 *num_ctu_in_slice; + + gboolean slice_span_tiles; + guint32 num_tile_cols; + guint32 num_tile_rows; + /* CTUs in each tile column */ + guint32 *tile_ctu_cols; + /* CTUs in each tile row */ + guint32 *tile_ctu_rows; + } partition; + + struct + { + guint8 log2_min_luma_coding_block_size_minus3; + guint8 log2_diff_max_min_luma_coding_block_size; + guint8 log2_min_transform_block_size_minus2; + guint8 log2_diff_max_min_transform_block_size; + guint8 max_transform_hierarchy_depth_inter; + guint8 max_transform_hierarchy_depth_intra; + + gboolean separate_colour_plane_flag; + guint8 colour_plane_id; + + gboolean scaling_list_enabled_flag; + gboolean scaling_list_data_present_flag; + + gboolean amp_enabled_flag; + + gboolean sample_adaptive_offset_enabled_flag; + gboolean slice_sao_luma_flag; + gboolean slice_sao_chroma_flag; + + gboolean pcm_enabled_flag; + guint8 pcm_sample_bit_depth_luma_minus1; + guint8 pcm_sample_bit_depth_chroma_minus1; + guint8 log2_min_pcm_luma_coding_block_size_minus3; + guint8 log2_max_pcm_luma_coding_block_size_minus3; + guint8 pcm_loop_filter_disabled_flag; + + gboolean temporal_mvp_enabled_flag; + gboolean collocated_from_l0_flag; + guint8 collocated_ref_idx; + + gboolean strong_intra_smoothing_enabled_flag; + + gboolean dependent_slice_segment_flag; + + gboolean sign_data_hiding_enabled_flag; + + gboolean constrained_intra_pred_flag; + + gboolean transform_skip_enabled_flag; + + gboolean cu_qp_delta_enabled_flag; + uint32_t diff_cu_qp_delta_depth; + + gboolean weighted_pred_flag; + gboolean weighted_bipred_flag; + + gboolean transquant_bypass_enabled_flag; + + gboolean use_trellis; + } features; + + struct + { + /* frames between two IDR idr, ...., idr) */ + guint32 idr_period; + /* How may IDRs we have encoded */ + guint32 total_idr_count; + /* frames between I/P and P frames I, B, B, .., B, P) */ + guint32 ip_period; + /* frames between I frames I, B, B, .., B, P, ..., I), open GOP */ + guint32 i_period; + /* B frames between I/P and P. */ + guint32 num_bframes; + /* Use B pyramid structure in the GOP. */ + gboolean b_pyramid; + /* Level 0 is the simple B not acting as ref. */ + guint32 highest_pyramid_level; + /* If open GOP, I frames within a GOP. */ + guint32 num_iframes; + /* A map of all frames types within a GOP. */ + struct + { + guint8 slice_type; + gboolean is_ref; + guint8 pyramid_level; + /* Only for b pyramid */ + gint left_ref_poc_diff; + gint right_ref_poc_diff; + } frame_typesMAX_GOP_SIZE; + + /* Max poc within a GOP. */ + guint32 max_pic_order_cnt; + guint32 log2_max_pic_order_cnt; + /* current index in the frames types map. */ + guint cur_frame_index; + + /* Total ref frames of forward and backward. */ + guint32 num_ref_frames; + guint32 max_l0_num; + guint32 max_l1_num; + guint32 forward_ref_num; + guint32 backward_ref_num; + gboolean low_delay_b_mode; + + guint num_reorder_frames; + guint max_dpb_size; + } gop; + + struct + { + guint target_usage; + guint32 rc_ctrl_mode; + + guint32 min_qp; + guint32 max_qp; + guint32 qp_i; + guint32 qp_p; + guint32 qp_b; + /* macroblock bitrate control */ + guint32 mbbrc; + guint target_bitrate; + guint target_percentage; + guint max_bitrate; + /* bitrate (bits) */ + guint max_bitrate_bits; + guint target_bitrate_bits; + /* length of CPB buffer */ + guint cpb_size; + /* length of CPB buffer (bits) */ + guint cpb_length_bits; + } rc; + + GstH265VPS vps_hdr; + GstH265SPS sps_hdr; +}; + +struct _GstVaH265EncFrame +{ + GstVaEncodePicture *picture; + GstH265SliceType type; + gboolean is_ref; + guint pyramid_level; + /* Only for b pyramid */ + gint left_ref_poc_diff; + gint right_ref_poc_diff; + + gint poc; + gboolean last_frame; + /* The total frame count we handled. */ + guint total_frame_count; +}; + +/** + * GstVaH265LevelLimits: + * @level_name: the level name + * @level_idc: the H.265 level_idc value + * @MaxLumaPs: the maximum luma picture size + * @MaxCPBTierMain: the maximum CPB size for Main tier(kbits) + * @MaxCPBTierHigh: the maximum CPB size for High tier(kbits) + * @MaxSliceSegPic: the maximum slice segments per picture + * @MaxTileRows: the maximum number of Tile Rows + * @MaxTileColumns: the maximum number of Tile Columns + * @MaxLumaSr: the maximum luma sample rate (samples/sec) + * @MaxBRTierMain: the maximum video bit rate for Main Tier(kbps) + * @MaxBRTierHigh: the maximum video bit rate for High Tier(kbps) + * @MinCr: the mimimum compression ratio + * + * The data structure that describes the limits of an H.265 level. + */ +struct _GstVaH265LevelLimits +{ + const gchar *level_name; + guint8 level_idc; + guint32 MaxLumaPs; + guint32 MaxCPBTierMain; + guint32 MaxCPBTierHigh; + guint32 MaxSliceSegPic; + guint32 MaxTileRows; + guint32 MaxTileColumns; + guint32 MaxLumaSr; + guint32 MaxBRTierMain; + guint32 MaxBRTierHigh; + guint32 MinCr; +}; + +/* Table A-1 - Level limits */ +/* *INDENT-OFF* */ +static const GstVaH265LevelLimits _va_h265_level_limits = { + /* level idc MaxLumaPs MCPBMt MCPBHt MSlSeg MTR MTC MaxLumaSr MBRMt MBRHt MinCr */ + { "1", 30, 36864, 350, 0, 16, 1, 1, 552960, 128, 0, 2 }, + { "2", 60, 122880, 1500, 0, 16, 1, 1, 3686400, 1500, 0, 2 }, + { "2.1", 63, 245760, 3000, 0, 20, 1, 1, 7372800, 3000, 0, 2 }, + { "3", 90, 552960, 6000, 0, 30, 2, 2, 16588800, 6000, 0, 2 }, + { "3.1", 93, 983040, 10000, 0, 40, 3, 3, 33177600, 10000, 0, 2 }, + { "4", 120, 2228224, 12000, 30000, 75, 5, 5, 66846720, 12000, 30000, 4 }, + { "4.1", 123, 2228224, 20000, 50000, 75, 5, 5, 133693440, 20000, 50000, 4 }, + { "5", 150, 8912896, 25000, 100000, 200, 11, 10, 267386880, 25000, 100000, 6 }, + { "5.1", 153, 8912896, 40000, 160000, 200, 11, 10, 534773760, 40000, 160000, 8 }, + { "5.2", 156, 8912896, 60000, 240000, 200, 11, 10, 1069547520, 60000, 240000, 8 }, + { "6", 180, 35651584, 60000, 240000, 600, 22, 20, 1069547520, 60000, 240000, 8 }, + { "6.1", 183, 35651584, 120000, 480000, 600, 22, 20, 2139095040, 120000, 480000, 8 }, + { "6.2", 186, 35651584, 240000, 800000, 600, 22, 20, 4278190080, 240000, 800000, 6 }, +}; +/* *INDENT-ON* */ + +#ifndef GST_DISABLE_GST_DEBUG +static const gchar * +_h265_slice_type_name (GstH265SliceType type) +{ + switch (type) { + case GST_H265_P_SLICE: + return "P"; + case GST_H265_B_SLICE: + return "B"; + case GST_H265_I_SLICE: + return "I"; + default: + g_assert_not_reached (); + } + + return NULL; +} + +static const gchar * +_rate_control_get_name (guint32 rc_mode) +{ + GParamSpecEnum *spec; + guint i; + + if (!(propertiesPROP_RATE_CONTROL + && G_IS_PARAM_SPEC_ENUM (propertiesPROP_RATE_CONTROL))) + return NULL; + + spec = G_PARAM_SPEC_ENUM (propertiesPROP_RATE_CONTROL); + for (i = 0; i < spec->enum_class->n_values; i++) { + if (spec->enum_class->valuesi.value == rc_mode) + return spec->enum_class->valuesi.value_nick; + } + + return NULL; +} +#endif /* end of GST_DISABLE_GST_DEBUG */ + +static GstVaH265EncFrame * +gst_va_h265_enc_frame_new (void) +{ + GstVaH265EncFrame *frame; + + frame = g_slice_new (GstVaH265EncFrame); + frame->last_frame = FALSE; + frame->picture = NULL; + frame->total_frame_count = 0; + + return frame; +} + +static void +gst_va_h265_enc_frame_free (gpointer pframe) +{ + GstVaH265EncFrame *frame = pframe; + g_clear_pointer (&frame->picture, gst_va_encode_picture_free); + g_slice_free (GstVaH265EncFrame, frame); +} + +static inline GstVaH265EncFrame * +_enc_frame (GstVideoCodecFrame * frame) +{ + GstVaH265EncFrame *enc_frame = gst_video_codec_frame_get_user_data (frame); + g_assert (enc_frame); + return enc_frame; +} + +static inline gboolean +_is_tile_enabled (GstVaH265Enc * self) +{ + return self->partition.num_tile_cols * self->partition.num_tile_rows > 1; +} + +static inline gboolean +_is_scc_enabled (GstVaH265Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + + if (base->profile == VAProfileHEVCSccMain + || base->profile == VAProfileHEVCSccMain10 + || base->profile == VAProfileHEVCSccMain444 +#if VA_CHECK_VERSION(1, 8, 0) + || base->profile == VAProfileHEVCSccMain444_10 +#endif + ) + return TRUE; + + return FALSE; +} + +static GstH265NalUnitType +_h265_nal_unit_type (GstVaH265EncFrame * frame) +{ + GstH265NalUnitType nal_unit_type = -1; + + switch (frame->type) { + case GST_H265_I_SLICE: + if (frame->poc == 0) { + nal_unit_type = GST_H265_NAL_SLICE_IDR_W_RADL; + } else { + nal_unit_type = GST_H265_NAL_SLICE_TRAIL_R; + } + break; + case GST_H265_P_SLICE: + nal_unit_type = GST_H265_NAL_SLICE_TRAIL_R; + break; + case GST_H265_B_SLICE: + if (frame->is_ref) { + nal_unit_type = GST_H265_NAL_SLICE_TRAIL_R; + } else { + nal_unit_type = GST_H265_NAL_SLICE_TRAIL_N; + } + break; + default: + break; + } + + g_assert (nal_unit_type >= 0); + return nal_unit_type; +} + +static gboolean +_h265_fill_ptl (GstVaH265Enc * self, + const VAEncSequenceParameterBufferHEVC * sequence, + GstH265ProfileTierLevel * ptl) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + + /* *INDENT-OFF* */ + *ptl = (GstH265ProfileTierLevel) { + .profile_space = 0, + .tier_flag = sequence->general_tier_flag, + .profile_idc = sequence->general_profile_idc, + .profile_compatibility_flag = { }, + .progressive_source_flag = 1, + .interlaced_source_flag = 0, + .non_packed_constraint_flag = 0, + .frame_only_constraint_flag = 1, + + .level_idc = sequence->general_level_idc, + }; + /* *INDENT-ON* */ + + if (sequence->general_profile_idc == 1 /* Main profile */ + /* In A.3.4, NOTE: When general_profile_compatibility_flag 3 is equal + to 1, general_profile_compatibility_flag 1 and + general_profile_compatibility_flag 2 should also be equal to 1. */ + || sequence->general_profile_idc == 3 /* Main Still Picture profile */ + ) { + ptl->profile_compatibility_flag1 = 1; + } + + if ( + /* In A.3.2, NOTE: When general_profile_compatibility_flag 1 is equal + to 1, general_profile_compatibility_flag 2 should also be equal to + 1. */ + sequence->general_profile_idc == 1 /* Main profile */ + || sequence->general_profile_idc == 2 /* Main 10 profile */ + /* In A.3.4, NOTE: When general_profile_compatibility_flag 3 is equal + to 1, general_profile_compatibility_flag 1 and + general_profile_compatibility_flag 2 should also be equal to 1. */ + || sequence->general_profile_idc == 3 /* Main Still Picture profile */ + ) { + ptl->profile_compatibility_flag2 = 1; + } + + if (sequence->general_profile_idc == 3) + ptl->profile_compatibility_flag3 = 1; + + if (sequence->general_profile_idc == 4) /* format range extensions profiles */ + ptl->profile_compatibility_flag4 = 1; + + if (sequence->general_profile_idc == 9) /* screen content coding profiles */ + ptl->profile_compatibility_flag9 = 1; + + /* additional indications specified for general_profile_idc from 4~10 */ + if (sequence->general_profile_idc == 4) { + /* In A.3.5, Format range extensions profiles. + Just support main444, main444-10 main422-10 main422-12 and main-12 + profile now, may add more profiles when needed. */ + switch (base->profile) { + case VAProfileHEVCMain444: + ptl->max_12bit_constraint_flag = 1; + ptl->max_10bit_constraint_flag = 1; + ptl->max_8bit_constraint_flag = 1; + ptl->max_422chroma_constraint_flag = 0; + ptl->max_420chroma_constraint_flag = 0; + ptl->max_monochrome_constraint_flag = 0; + ptl->intra_constraint_flag = 0; + ptl->one_picture_only_constraint_flag = 0; + ptl->lower_bit_rate_constraint_flag = 1; + break; + case VAProfileHEVCMain444_10: + ptl->max_12bit_constraint_flag = 1; + ptl->max_10bit_constraint_flag = 1; + ptl->max_8bit_constraint_flag = 0; + ptl->max_422chroma_constraint_flag = 0; + ptl->max_420chroma_constraint_flag = 0; + ptl->max_monochrome_constraint_flag = 0; + ptl->intra_constraint_flag = 0; + ptl->one_picture_only_constraint_flag = 0; + ptl->lower_bit_rate_constraint_flag = 1; + break; + case VAProfileHEVCMain422_10: + ptl->max_12bit_constraint_flag = 1; + ptl->max_10bit_constraint_flag = 1; + ptl->max_8bit_constraint_flag = 0; + ptl->max_422chroma_constraint_flag = 1; + ptl->max_420chroma_constraint_flag = 0; + ptl->max_monochrome_constraint_flag = 0; + ptl->intra_constraint_flag = 0; + ptl->one_picture_only_constraint_flag = 0; + ptl->lower_bit_rate_constraint_flag = 1; + break; + case VAProfileHEVCMain422_12: + ptl->max_12bit_constraint_flag = 1; + ptl->max_10bit_constraint_flag = 0; + ptl->max_8bit_constraint_flag = 0; + ptl->max_422chroma_constraint_flag = 1; + ptl->max_420chroma_constraint_flag = 0; + ptl->max_monochrome_constraint_flag = 0; + ptl->intra_constraint_flag = 0; + ptl->one_picture_only_constraint_flag = 0; + ptl->lower_bit_rate_constraint_flag = 1; + break; + case VAProfileHEVCMain12: + ptl->max_12bit_constraint_flag = 1; + ptl->max_10bit_constraint_flag = 0; + ptl->max_8bit_constraint_flag = 0; + ptl->max_422chroma_constraint_flag = 1; + ptl->max_420chroma_constraint_flag = 1; + ptl->max_monochrome_constraint_flag = 0; + ptl->intra_constraint_flag = 0; + ptl->one_picture_only_constraint_flag = 0; + ptl->lower_bit_rate_constraint_flag = 1; + break; + default: + GST_WARNING_OBJECT (self, "do not support the profile: %s of" + " range extensions.", gst_va_profile_name (base->profile)); + goto error; + } + } else if (sequence->general_profile_idc == 9) { + /* In A.3.7, Screen content coding extensions profiles. */ + switch (base->profile) { + case VAProfileHEVCSccMain: + ptl->max_14bit_constraint_flag = 1; + ptl->max_12bit_constraint_flag = 1; + ptl->max_10bit_constraint_flag = 1; + ptl->max_8bit_constraint_flag = 1; + ptl->max_422chroma_constraint_flag = 1; + ptl->max_420chroma_constraint_flag = 1; + ptl->max_monochrome_constraint_flag = 0; + ptl->intra_constraint_flag = 0; + ptl->one_picture_only_constraint_flag = 0; + ptl->lower_bit_rate_constraint_flag = 1; + break; + case VAProfileHEVCSccMain10: + ptl->max_14bit_constraint_flag = 1; + ptl->max_12bit_constraint_flag = 1; + ptl->max_10bit_constraint_flag = 1; + ptl->max_8bit_constraint_flag = 0; + ptl->max_422chroma_constraint_flag = 1; + ptl->max_420chroma_constraint_flag = 1; + ptl->max_monochrome_constraint_flag = 0; + ptl->intra_constraint_flag = 0; + ptl->one_picture_only_constraint_flag = 0; + ptl->lower_bit_rate_constraint_flag = 1; + break; + case VAProfileHEVCSccMain444: + ptl->max_14bit_constraint_flag = 1; + ptl->max_12bit_constraint_flag = 1; + ptl->max_10bit_constraint_flag = 1; + ptl->max_8bit_constraint_flag = 1; + ptl->max_422chroma_constraint_flag = 0; + ptl->max_420chroma_constraint_flag = 0; + ptl->max_monochrome_constraint_flag = 0; + ptl->intra_constraint_flag = 0; + ptl->one_picture_only_constraint_flag = 0; + ptl->lower_bit_rate_constraint_flag = 1; + break; +#if VA_CHECK_VERSION(1, 8, 0) + case VAProfileHEVCSccMain444_10: + ptl->max_14bit_constraint_flag = 1; + ptl->max_12bit_constraint_flag = 1; + ptl->max_10bit_constraint_flag = 1; + ptl->max_8bit_constraint_flag = 0; + ptl->max_422chroma_constraint_flag = 0; + ptl->max_420chroma_constraint_flag = 0; + ptl->max_monochrome_constraint_flag = 0; + ptl->intra_constraint_flag = 0; + ptl->one_picture_only_constraint_flag = 0; + ptl->lower_bit_rate_constraint_flag = 1; + break; +#endif + default: + GST_WARNING_OBJECT (self, "do not support the profile: %s of screen" + " content coding extensions.", gst_va_profile_name (base->profile)); + goto error; + } + } + + return TRUE; + +error: + GST_WARNING_OBJECT (self, "Failed to write Profile Tier Level"); + return FALSE; +} + +/* By now, the VPS is not really used, we just fill all its fields + with the same info from the SPS. */ +static gboolean +_h265_fill_vps (GstVaH265Enc * self, + const VAEncSequenceParameterBufferHEVC * seq_param) +{ + guint max_dec_pic_buffering = + self->gop.num_ref_frames + 1 < self->gop.max_dpb_size ? + self->gop.num_ref_frames + 1 : self->gop.max_dpb_size; + + /* *INDENT-OFF* */ + self->vps_hdr = (GstH265VPS) { + .id = 0, + .base_layer_internal_flag = 1, + .base_layer_available_flag = 1, + .max_layers_minus1 = 0, + .max_sub_layers_minus1 = 0, + .temporal_id_nesting_flag = 1, + + .sub_layer_ordering_info_present_flag = 0, + .max_dec_pic_buffering_minus1 = { max_dec_pic_buffering - 1, }, + .max_num_reorder_pics = { self->gop.num_reorder_frames, }, + .max_latency_increase_plus1 = { 0, }, + .max_layer_id = 0, + .num_layer_sets_minus1 = 0, + .timing_info_present_flag = 0, + .vps_extension = 0, + }; + /* *INDENT-ON* */ + + if (!_h265_fill_ptl (self, seq_param, &self->vps_hdr.profile_tier_level)) + return FALSE; + + return TRUE; +} + +static gboolean +_h265_fill_sps (GstVaH265Enc * self, + const VAEncSequenceParameterBufferHEVC * seq_param) +{ + guint max_dec_pic_buffering = + self->gop.num_ref_frames + 1 < self->gop.max_dpb_size ? + self->gop.num_ref_frames + 1 : self->gop.max_dpb_size; + + g_assert (self->gop.log2_max_pic_order_cnt >= 4); + /* *INDENT-OFF* */ + self->sps_hdr = (GstH265SPS) { + .id = 0, + .vps = &self->vps_hdr, + .max_sub_layers_minus1 = 0, + .temporal_id_nesting_flag = 1, + + .chroma_format_idc = seq_param->seq_fields.bits.chroma_format_idc, + .separate_colour_plane_flag = + seq_param->seq_fields.bits.separate_colour_plane_flag, + .pic_width_in_luma_samples = seq_param->pic_width_in_luma_samples, + .pic_height_in_luma_samples = seq_param->pic_height_in_luma_samples, + .conformance_window_flag = self->conformance_window_flag, + .conf_win_left_offset = self->conf_win_left_offset, + .conf_win_right_offset = self->conf_win_right_offset, + .conf_win_top_offset = self->conf_win_top_offset, + .conf_win_bottom_offset = self->conf_win_bottom_offset, + .bit_depth_luma_minus8 = seq_param->seq_fields.bits.bit_depth_luma_minus8, + .bit_depth_chroma_minus8 = + seq_param->seq_fields.bits.bit_depth_chroma_minus8, + .log2_max_pic_order_cnt_lsb_minus4 = self->gop.log2_max_pic_order_cnt - 4, + .sub_layer_ordering_info_present_flag = 0, + .max_dec_pic_buffering_minus1 = { max_dec_pic_buffering - 1, }, + .max_num_reorder_pics = { self->gop.num_reorder_frames, }, + .max_latency_increase_plus1 = { 0, }, + .log2_min_luma_coding_block_size_minus3 = + seq_param->log2_min_luma_coding_block_size_minus3, + .log2_diff_max_min_luma_coding_block_size = + seq_param->log2_diff_max_min_luma_coding_block_size, + .log2_min_transform_block_size_minus2 = + seq_param->log2_min_transform_block_size_minus2, + .log2_diff_max_min_transform_block_size = + seq_param->log2_diff_max_min_transform_block_size, + .max_transform_hierarchy_depth_inter = + seq_param->max_transform_hierarchy_depth_inter, + .max_transform_hierarchy_depth_intra = + seq_param->max_transform_hierarchy_depth_intra, + .scaling_list_enabled_flag = + seq_param->seq_fields.bits.scaling_list_enabled_flag, + .scaling_list_data_present_flag = + self->features.scaling_list_data_present_flag, + /* Do not change the scaling list now. */ + /* .scaling_list, */ + .amp_enabled_flag = seq_param->seq_fields.bits.amp_enabled_flag, + .sample_adaptive_offset_enabled_flag = + seq_param->seq_fields.bits.sample_adaptive_offset_enabled_flag, + .pcm_enabled_flag = seq_param->seq_fields.bits.pcm_enabled_flag, + .pcm_sample_bit_depth_luma_minus1 = + seq_param->pcm_sample_bit_depth_luma_minus1, + .pcm_sample_bit_depth_chroma_minus1 = + seq_param->pcm_sample_bit_depth_chroma_minus1, + .log2_min_pcm_luma_coding_block_size_minus3 = + seq_param->log2_min_pcm_luma_coding_block_size_minus3, + .log2_diff_max_min_pcm_luma_coding_block_size = + seq_param->log2_max_pcm_luma_coding_block_size_minus3 - + seq_param->log2_min_pcm_luma_coding_block_size_minus3, + .pcm_loop_filter_disabled_flag = + seq_param->seq_fields.bits.pcm_loop_filter_disabled_flag, + .num_short_term_ref_pic_sets = 0, + .long_term_ref_pics_present_flag = 0, + .temporal_mvp_enabled_flag = + seq_param->seq_fields.bits.sps_temporal_mvp_enabled_flag, + .strong_intra_smoothing_enabled_flag = + seq_param->seq_fields.bits.strong_intra_smoothing_enabled_flag, + .vui_parameters_present_flag = + seq_param->vui_parameters_present_flag, + .vui_params = { + .aspect_ratio_info_present_flag = + seq_param->vui_fields.bits.aspect_ratio_info_present_flag, + .aspect_ratio_idc = seq_param->aspect_ratio_idc, + .sar_width = seq_param->sar_width, + .sar_height = seq_param->sar_height, + .overscan_info_present_flag = 0, + .video_signal_type_present_flag = 0, + .chroma_loc_info_present_flag = 0, + .neutral_chroma_indication_flag = + seq_param->vui_fields.bits.neutral_chroma_indication_flag, + .field_seq_flag = seq_param->vui_fields.bits.field_seq_flag, + .frame_field_info_present_flag = 0, + .default_display_window_flag = 0, + .timing_info_present_flag = + seq_param->vui_fields.bits.vui_timing_info_present_flag, + .num_units_in_tick = seq_param->vui_num_units_in_tick, + .time_scale = seq_param->vui_time_scale, + .poc_proportional_to_timing_flag = 0, + /* TODO: provide HRD. */ + .hrd_parameters_present_flag = 0, + /* + .hrd_parameters_present_flag = (seq_param->bits_per_second > 0), + .hrd_params = { + .nal_hrd_parameters_present_flag = 1, + .vcl_hrd_parameters_present_flag = 0, + .sub_pic_hrd_params_present_flag = 0, + .bit_rate_scale = (SX_BITRATE - 6), + .cpb_size_scale = (SX_CPB_SIZE - 4), + .initial_cpb_removal_delay_length_minus1 = 23, + .au_cpb_removal_delay_length_minus1 = 23, + .dpb_output_delay_length_minus1 = 23, + .fixed_pic_rate_general_flag = { 0, }, + .fixed_pic_rate_within_cvs_flag = { 0, }, + .low_delay_hrd_flag = { 1, }, + .cpb_cnt_minus1 = { 0, }, + .sublayer_hrd_params = { + { .bit_rate_value_minus1 = { (seq_param->bits_per_second >> SX_BITRATE) - 1, }, + .cpb_size_value_minus1 = { (hrd_params->buffer_size >> SX_CPB_SIZE) - 1, }, + .cpb_size_du_value_minus1 = { 0, }, + .bit_rate_du_value_minus1 = { 0, }, + .cbr_flag = { self->rc_ctrl == VA_RC_CBR, }, + }, + } + }, */ + .bitstream_restriction_flag = + seq_param->vui_fields.bits.bitstream_restriction_flag, + .tiles_fixed_structure_flag = + seq_param->vui_fields.bits.tiles_fixed_structure_flag, + .motion_vectors_over_pic_boundaries_flag = + seq_param->vui_fields.bits.motion_vectors_over_pic_boundaries_flag, + .restricted_ref_pic_lists_flag = + seq_param->vui_fields.bits.restricted_ref_pic_lists_flag, + .min_spatial_segmentation_idc = seq_param->min_spatial_segmentation_idc, + .max_bytes_per_pic_denom = seq_param->max_bytes_per_pic_denom, + .max_bits_per_min_cu_denom = seq_param->max_bits_per_min_cu_denom, + .log2_max_mv_length_horizontal = + seq_param->vui_fields.bits.log2_max_mv_length_horizontal, + .log2_max_mv_length_vertical = + seq_param->vui_fields.bits.log2_max_mv_length_vertical, + }, + .sps_extension_flag = _is_scc_enabled (self), + /* if sps_extension_present_flag */ + .sps_range_extension_flag = 0, + .sps_multilayer_extension_flag = 0, + .sps_3d_extension_flag = 0, + .sps_scc_extension_flag = _is_scc_enabled (self), + /* if sps_scc_extension_flag */ +#if VA_CHECK_VERSION(1, 8, 0) + .sps_scc_extension_params = { + .sps_curr_pic_ref_enabled_flag = 1, + .palette_mode_enabled_flag = + seq_param->scc_fields.bits.palette_mode_enabled_flag, + .palette_max_size = 64, + .delta_palette_max_predictor_size = 32, + .sps_palette_predictor_initializers_present_flag = 0, + .sps_num_palette_predictor_initializer_minus1 = 0, + .sps_palette_predictor_initializer = { }, + .motion_vector_resolution_control_idc = 0, + .intra_boundary_filtering_disabled_flag = 0, + }, +#endif + }; + /* *INDENT-ON* */ + + if (!_h265_fill_ptl (self, seq_param, &self->sps_hdr.profile_tier_level)) + return FALSE; + + return TRUE; +} + +static void +_h265_fill_pps (GstVaH265Enc * self, + VAEncPictureParameterBufferHEVC * pic_param, + GstH265SPS * sps, GstH265PPS * pps) +{ + /* *INDENT-OFF* */ + *pps = (GstH265PPS) { + .id = 0, + .sps = sps, + .dependent_slice_segments_enabled_flag = + pic_param->pic_fields.bits.dependent_slice_segments_enabled_flag, + .output_flag_present_flag = 0, + .num_extra_slice_header_bits = 0, + .sign_data_hiding_enabled_flag = + pic_param->pic_fields.bits.sign_data_hiding_enabled_flag, + .cabac_init_present_flag = 0, + .num_ref_idx_l0_default_active_minus1 = + pic_param->num_ref_idx_l0_default_active_minus1, + .num_ref_idx_l1_default_active_minus1 = + pic_param->num_ref_idx_l1_default_active_minus1, + .init_qp_minus26 = pic_param->pic_init_qp - 26, + .constrained_intra_pred_flag = + pic_param->pic_fields.bits.constrained_intra_pred_flag, + .transform_skip_enabled_flag = + pic_param->pic_fields.bits.transform_skip_enabled_flag, + .cu_qp_delta_enabled_flag = + pic_param->pic_fields.bits.cu_qp_delta_enabled_flag, + .diff_cu_qp_delta_depth = pic_param->diff_cu_qp_delta_depth, + .cb_qp_offset = pic_param->pps_cb_qp_offset, + .cr_qp_offset = pic_param->pps_cr_qp_offset, + .slice_chroma_qp_offsets_present_flag = 0, + .weighted_pred_flag = pic_param->pic_fields.bits.weighted_pred_flag, + .weighted_bipred_flag = pic_param->pic_fields.bits.weighted_bipred_flag, + .transquant_bypass_enabled_flag = + pic_param->pic_fields.bits.transquant_bypass_enabled_flag, + .tiles_enabled_flag = pic_param->pic_fields.bits.tiles_enabled_flag, + .entropy_coding_sync_enabled_flag = + pic_param->pic_fields.bits.entropy_coding_sync_enabled_flag, + .num_tile_columns_minus1 = pic_param->num_tile_columns_minus1, + .num_tile_rows_minus1 = pic_param->num_tile_rows_minus1, + /* Only support uniform tile mode now. */ + .uniform_spacing_flag = 1, + .loop_filter_across_tiles_enabled_flag = + pic_param->pic_fields.bits.loop_filter_across_tiles_enabled_flag, + .loop_filter_across_slices_enabled_flag = + pic_param->pic_fields.bits.pps_loop_filter_across_slices_enabled_flag, + /* Do not change the default deblocking filter */ + .deblocking_filter_control_present_flag = 0, + .deblocking_filter_override_enabled_flag = 0, + .deblocking_filter_disabled_flag = 0, + /* .beta_offset_div2, + .tc_offset_div2, */ + .scaling_list_data_present_flag = + pic_param->pic_fields.bits.scaling_list_data_present_flag, + /* Do not change the scaling list now. */ + /* .scaling_list, */ + /* Do not change the ref list */ + .lists_modification_present_flag = 0, + .log2_parallel_merge_level_minus2 = + pic_param->log2_parallel_merge_level_minus2, + .slice_segment_header_extension_present_flag = 0, + .pps_extension_flag = _is_scc_enabled (self), + /* if pps_extension_flag*/ + .pps_range_extension_flag = 0, + .pps_multilayer_extension_flag = 0, + .pps_3d_extension_flag = 0, + .pps_scc_extension_flag = _is_scc_enabled (self), + /* if pps_scc_extension_flag*/ +#if VA_CHECK_VERSION(1, 8, 0) + .pps_scc_extension_params = { + .pps_curr_pic_ref_enabled_flag = + pic_param->scc_fields.bits.pps_curr_pic_ref_enabled_flag, + .residual_adaptive_colour_transform_enabled_flag = 0, + .pps_palette_predictor_initializers_present_flag = 0, + }, +#endif + }; + /* *INDENT-ON* */ +} + +static gboolean +_h265_fill_slice_header (GstVaH265Enc * self, GstVaH265EncFrame * frame, + GstH265PPS * pps, VAEncSliceParameterBufferHEVC * slice_param, + gboolean first_slice_segment_in_pic, + guint list_forward_num, guint list_backward_num, + gint negative_pocs16, guint num_negative_pics, + gint positive_pocs16, guint num_positive_pics, + GstH265SliceHdr * slice_hdr) +{ + gint i; + gint delta_poc; + + /* *INDENT-OFF* */ + *slice_hdr = (GstH265SliceHdr) { + .pps = pps, + .first_slice_segment_in_pic_flag = first_slice_segment_in_pic, + /* set if IDR. */ + .no_output_of_prior_pics_flag = 0, + .dependent_slice_segment_flag = + slice_param->slice_fields.bits.dependent_slice_segment_flag, + .segment_address = slice_param->slice_segment_address, + .type = slice_param->slice_type, + /* pps->output_flag_present_flag is not set now. */ + .pic_output_flag = 0, + .colour_plane_id = slice_param->slice_fields.bits.colour_plane_id, + /* Set the reference list fields later + .pic_order_cnt_lsb, + .short_term_ref_pic_set_sps_flag, + .short_term_ref_pic_sets, + .short_term_ref_pic_set_idx, + .num_long_term_sps, + .num_long_term_pics, + .lt_idx_sps16, + .poc_lsb_lt16, + .used_by_curr_pic_lt_flag16, + .delta_poc_msb_present_flag16, + .delta_poc_msb_cycle_lt16, */ + .temporal_mvp_enabled_flag = + slice_param->slice_fields.bits.slice_temporal_mvp_enabled_flag, + .sao_luma_flag = + slice_param->slice_fields.bits.slice_sao_luma_flag, + .sao_chroma_flag= + slice_param->slice_fields.bits.slice_sao_chroma_flag, + /* Set the ref num later + .num_ref_idx_active_override_flag, + .num_ref_idx_l0_active_minus1, + .num_ref_idx_l1_active_minus1, + .ref_pic_list_modification, */ + .mvd_l1_zero_flag = slice_param->slice_fields.bits.mvd_l1_zero_flag, + .cabac_init_flag = slice_param->slice_fields.bits.cabac_init_flag, + .collocated_from_l0_flag = + slice_param->slice_fields.bits.collocated_from_l0_flag, + .collocated_ref_idx = (slice_param->slice_type == GST_H265_I_SLICE ? + 0xFF : self->features.collocated_ref_idx), + /* not used now. */ + .pred_weight_table = { }, + .five_minus_max_num_merge_cand = 5 - slice_param->max_num_merge_cand, + .use_integer_mv_flag = 0, + .qp_delta = slice_param->slice_qp_delta, + .cb_qp_offset = slice_param->slice_cb_qp_offset, + .cr_qp_offset = slice_param->slice_cr_qp_offset, + /* SCC is not enabled. */ + .slice_act_y_qp_offset = 0, + .slice_act_cb_qp_offset = 0, + .slice_act_cr_qp_offset = 0, + + .cu_chroma_qp_offset_enabled_flag = 0, + /* Do not change deblocking filter setting. */ + .deblocking_filter_override_flag = 0, + .deblocking_filter_disabled_flag = 0, + /* .beta_offset_div2, + .tc_offset_div2, */ + .loop_filter_across_slices_enabled_flag = + slice_param->slice_fields.bits.slice_loop_filter_across_slices_enabled_flag, + .num_entry_point_offsets = 0, + /* .offset_len_minus1, + .entry_point_offset_minus1, */ + }; + /* *INDENT-ON* */ + + if (slice_hdr->dependent_slice_segment_flag) + return TRUE; + + if (slice_param->slice_type == GST_H265_I_SLICE) + return TRUE; + + slice_hdr->pic_order_cnt_lsb = frame->poc; + + /* Write the ref set explicitly. */ + slice_hdr->short_term_ref_pic_set_sps_flag = 0; + slice_hdr->short_term_ref_pic_sets.inter_ref_pic_set_prediction_flag = 0; + slice_hdr->short_term_ref_pic_sets.NumDeltaPocs = + num_negative_pics + num_positive_pics; + + slice_hdr->short_term_ref_pic_sets.NumNegativePics = num_negative_pics; + for (i = 0; i < num_negative_pics; i++) { + delta_poc = negative_pocsi - frame->poc; + g_assert (delta_poc < 0); + slice_hdr->short_term_ref_pic_sets.DeltaPocS0i = delta_poc; + + if (i < list_forward_num) { + slice_hdr->short_term_ref_pic_sets.UsedByCurrPicS0i = 1; + } else { + slice_hdr->short_term_ref_pic_sets.UsedByCurrPicS0i = 0; + } + } + + slice_hdr->short_term_ref_pic_sets.NumPositivePics = num_positive_pics; + for (i = 0; i < num_positive_pics; i++) { + delta_poc = positive_pocsi - frame->poc; + g_assert (delta_poc > 0); + slice_hdr->short_term_ref_pic_sets.DeltaPocS1i = delta_poc; + + if (i < list_backward_num) { + slice_hdr->short_term_ref_pic_sets.UsedByCurrPicS1i = 1; + } else { + slice_hdr->short_term_ref_pic_sets.UsedByCurrPicS1i = 0; + } + } + + /* For scc, add the current frame into ref */ + if (_is_scc_enabled (self)) { + slice_hdr->num_ref_idx_active_override_flag = 1; + } else { + slice_hdr->num_ref_idx_active_override_flag = + slice_param->slice_fields.bits.num_ref_idx_active_override_flag; + } + + if (slice_hdr->num_ref_idx_active_override_flag) { + if (_is_scc_enabled (self)) { + /* For scc, need to add 1 for current picture itself when calculating + NumRpsCurrTempList0. But slice_param->num_ref_idx_l0_active_minus1 + does not include the current frame, but the stream's + slice_hdr->num_ref_idx_l0_active_minus1 needs to include. */ + if (frame->type == GST_H265_I_SLICE) { + g_assert (slice_param->num_ref_idx_l0_active_minus1 == 0); + slice_hdr->num_ref_idx_l0_active_minus1 = 0; + } else { + slice_hdr->num_ref_idx_l0_active_minus1 = + slice_param->num_ref_idx_l0_active_minus1 + 1; + } + } else { + slice_hdr->num_ref_idx_l0_active_minus1 = + slice_param->num_ref_idx_l0_active_minus1; + } + + if (slice_param->slice_type == GST_H265_B_SLICE) + slice_hdr->num_ref_idx_l1_active_minus1 = + slice_param->num_ref_idx_l1_active_minus1; + } + + return TRUE; +} + +static gboolean +_h265_add_vps_header (GstVaH265Enc * self, GstVaH265EncFrame * frame) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint size; +#define VPS_SIZE 4 + GST_ROUND_UP_8 (MAX_VPS_HDR_SIZE + \ + MAX_PROFILE_TIER_LEVEL_SIZE + MAX_HRD_PARAMS_SIZE) / 8 + guint8 packed_vpsVPS_SIZE = { 0, }; +#undef VPS_SIZE + + size = sizeof (packed_vps); + if (gst_h265_bit_writer_vps (&self->vps_hdr, TRUE, packed_vps, &size) + != GST_H265_BIT_WRITER_OK) { + GST_ERROR_OBJECT (self, "Failed to write VPS header."); + return FALSE; + } + + /* VPS does not have its own packed header define, just reuse + VAEncPackedHeaderSequence */ + if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, + VAEncPackedHeaderSequence, packed_vps, size * 8, FALSE)) { + GST_ERROR_OBJECT (self, "Failed to add packed VPS header."); + return FALSE; + } + + return TRUE; +} + +static gboolean +_h265_add_sps_header (GstVaH265Enc * self, GstVaH265EncFrame * frame) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint size; +#define SPS_SIZE 4 + GST_ROUND_UP_8 (MAX_SPS_HDR_SIZE + \ + MAX_PROFILE_TIER_LEVEL_SIZE + 64 * MAX_SHORT_TERM_REFPICSET_SIZE + \ + MAX_VUI_PARAMS_SIZE + MAX_HRD_PARAMS_SIZE) / 8 + guint8 packed_spsSPS_SIZE = { 0, }; +#undef SPS_SIZE + + size = sizeof (packed_sps); + if (gst_h265_bit_writer_sps (&self->sps_hdr, TRUE, packed_sps, &size) + != GST_H265_BIT_WRITER_OK) { + GST_ERROR_OBJECT (self, "Failed to write SPS header."); + return FALSE; + } + + if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, + VAEncPackedHeaderSequence, packed_sps, size * 8, FALSE)) { + GST_ERROR_OBJECT (self, "Failed to add packed SPS header."); + return FALSE; + } + + return TRUE; +} + +static gboolean +_h265_add_pps_header (GstVaH265Enc * self, GstVaH265EncFrame * frame, + GstH265PPS * pps) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint size; +#define PPS_SIZE 4 + GST_ROUND_UP_8 (MAX_PPS_HDR_SIZE) / 8 + guint8 packed_ppsPPS_SIZE = { 0, }; +#undef PPS_SIZE + + size = sizeof (packed_pps); + if (gst_h265_bit_writer_pps (pps, TRUE, packed_pps, + &size) != GST_H265_BIT_WRITER_OK) { + GST_ERROR_OBJECT (self, "Failed to generate the picture header"); + return FALSE; + } + + if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, + VAEncPackedHeaderPicture, packed_pps, size * 8, FALSE)) { + GST_ERROR_OBJECT (self, "Failed to add the packed picture header"); + return FALSE; + } + + return TRUE; +} + +static gboolean +_h265_add_slice_header (GstVaH265Enc * self, GstVaH265EncFrame * frame, + GstH265SliceHdr * slice_hdr) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + GstH265NalUnitType nal_type = _h265_nal_unit_type (frame); + guint size; +#define SLICE_HDR_SIZE 4 + GST_ROUND_UP_8 (MAX_SLICE_HDR_SIZE) / 8 + guint8 packed_slice_hdrSLICE_HDR_SIZE = { 0, }; +#undef SLICE_HDR_SIZE + + size = sizeof (packed_slice_hdr); + if (gst_h265_bit_writer_slice_hdr (slice_hdr, TRUE, nal_type, + packed_slice_hdr, &size) != GST_H265_BIT_WRITER_OK) { + GST_ERROR_OBJECT (self, "Failed to generate the slice header"); + return FALSE; + } + + if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, + VAEncPackedHeaderSlice, packed_slice_hdr, size * 8, FALSE)) { + GST_ERROR_OBJECT (self, "Failed to add the packed slice header"); + return FALSE; + } + + return TRUE; +} + +static gboolean +_h265_add_aud (GstVaH265Enc * self, GstVaH265EncFrame * frame) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint8 aud_data8 = { }; + guint size; + guint8 pic_type = 0; + + switch (frame->type) { + case GST_H265_I_SLICE: + pic_type = 0; + break; + case GST_H265_P_SLICE: + pic_type = 1; + break; + case GST_H265_B_SLICE: + pic_type = 2; + break; + default: + g_assert_not_reached (); + break; + } + + size = sizeof (aud_data); + if (gst_h265_bit_writer_aud (pic_type, TRUE, aud_data, + &size) != GST_H265_BIT_WRITER_OK) { + GST_ERROR_OBJECT (self, "Failed to generate the AUD"); + return FALSE; + } + + if (!gst_va_encoder_add_packed_header (base->encoder, frame->picture, + VAEncPackedHeaderRawData, aud_data, size * 8, FALSE)) { + GST_ERROR_OBJECT (self, "Failed to add the AUD"); + return FALSE; + } + + return TRUE; +} + +/* Returns H.265 chroma_format_idc value from chroma type */ +static guint +_h265_get_chroma_format_idc (guint chroma_type) +{ + guint chroma_format_idc; + + switch (chroma_type) { + case VA_RT_FORMAT_YUV400: + chroma_format_idc = 0; + break; + case VA_RT_FORMAT_YUV420: + case VA_RT_FORMAT_YUV420_10: + case VA_RT_FORMAT_YUV420_12: + chroma_format_idc = 1; + break; + case VA_RT_FORMAT_YUV422: + case VA_RT_FORMAT_YUV422_10: + case VA_RT_FORMAT_YUV422_12: + chroma_format_idc = 2; + break; + case VA_RT_FORMAT_YUV444: + case VA_RT_FORMAT_YUV444_10: + case VA_RT_FORMAT_YUV444_12: + chroma_format_idc = 3; + break; + default: + GST_DEBUG ("unsupported GstVaapiChromaType value"); + chroma_format_idc = 1; + break; + } + return chroma_format_idc; +} + +static gboolean +_h265_fill_sequence_parameter (GstVaH265Enc * self, + VAEncSequenceParameterBufferHEVC * sequence) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint profile_idc = 0; + + switch (base->profile) { + case VAProfileHEVCMain: + profile_idc = GST_H265_PROFILE_IDC_MAIN; + break; + case VAProfileHEVCMain10: + profile_idc = GST_H265_PROFILE_IDC_MAIN; + break; + case VAProfileHEVCMain12: + case VAProfileHEVCMain422_10: + case VAProfileHEVCMain422_12: + case VAProfileHEVCMain444: + case VAProfileHEVCMain444_10: + case VAProfileHEVCMain444_12: + profile_idc = GST_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSION; + break; + case VAProfileHEVCSccMain: + case VAProfileHEVCSccMain10: + case VAProfileHEVCSccMain444: +#if VA_CHECK_VERSION(1, 8, 0) + case VAProfileHEVCSccMain444_10: +#endif + profile_idc = GST_H265_PROFILE_IDC_SCREEN_CONTENT_CODING; + break; + default: + GST_ERROR_OBJECT (self, "unsupported profile %d", base->profile); + return FALSE; + } + + /* *INDENT-OFF* */ + *sequence = (VAEncSequenceParameterBufferHEVC) { + .general_profile_idc = profile_idc, + .general_level_idc = self->level_idc, + .general_tier_flag = self->tier_flag, + .intra_period = + self->gop.i_period > 0 ? self->gop.i_period : self->gop.idr_period, + .intra_idr_period = self->gop.idr_period, + .ip_period = self->gop.ip_period, + .bits_per_second = self->rc.target_bitrate_bits, + .pic_width_in_luma_samples = self->luma_width, + .pic_height_in_luma_samples = self->luma_height, + .seq_fields.bits = { + .chroma_format_idc = _h265_get_chroma_format_idc (base->rt_format), + .separate_colour_plane_flag = self->features.separate_colour_plane_flag, + .bit_depth_luma_minus8 = self->bits_depth_luma_minus8, + .bit_depth_chroma_minus8 = self->bits_depth_chroma_minus8, + .scaling_list_enabled_flag = self->features.scaling_list_enabled_flag, + .strong_intra_smoothing_enabled_flag = + self->features.strong_intra_smoothing_enabled_flag, + .amp_enabled_flag = self->features.amp_enabled_flag, + .sample_adaptive_offset_enabled_flag = + self->features.sample_adaptive_offset_enabled_flag, + .pcm_enabled_flag = self->features.pcm_enabled_flag, + .pcm_loop_filter_disabled_flag = + self->features.pcm_loop_filter_disabled_flag, + .sps_temporal_mvp_enabled_flag = + self->features.temporal_mvp_enabled_flag, + .low_delay_seq = (self->gop.num_bframes == 0), + .hierachical_flag = self->gop.b_pyramid, + }, + .log2_min_luma_coding_block_size_minus3 = + self->features.log2_min_luma_coding_block_size_minus3, + .log2_diff_max_min_luma_coding_block_size = + self->features.log2_diff_max_min_luma_coding_block_size, + .log2_min_transform_block_size_minus2 = + self->features.log2_min_transform_block_size_minus2, + .log2_diff_max_min_transform_block_size = + self->features.log2_diff_max_min_transform_block_size, + .max_transform_hierarchy_depth_inter = + self->features.max_transform_hierarchy_depth_inter, + .max_transform_hierarchy_depth_intra = + self->features.max_transform_hierarchy_depth_intra, + /* pcm_enabled_flag is unset, ignore */ + .pcm_sample_bit_depth_luma_minus1 = + self->features.pcm_sample_bit_depth_luma_minus1, + .pcm_sample_bit_depth_chroma_minus1 = + self->features.pcm_sample_bit_depth_chroma_minus1, + .log2_min_pcm_luma_coding_block_size_minus3 = + self->features.log2_min_pcm_luma_coding_block_size_minus3, + .log2_max_pcm_luma_coding_block_size_minus3 = + self->features.log2_max_pcm_luma_coding_block_size_minus3, + /* VUI parameters are always set, at least for timing_info (framerate) */ + .vui_parameters_present_flag = TRUE, + .vui_fields.bits = { + .aspect_ratio_info_present_flag = TRUE, + .bitstream_restriction_flag = FALSE, + .vui_timing_info_present_flag = TRUE, + }, + /* if (vui_fields.bits.aspect_ratio_info_present_flag) */ + .aspect_ratio_idc = 0xff, + .sar_width = GST_VIDEO_INFO_PAR_N (&base->input_state->info), + .sar_height = GST_VIDEO_INFO_PAR_D (&base->input_state->info), + /* if (vui_fields.bits.vui_timing_info_present_flag) */ + .vui_num_units_in_tick = GST_VIDEO_INFO_FPS_D (&base->input_state->info), + .vui_time_scale = GST_VIDEO_INFO_FPS_N (&base->input_state->info), +#if VA_CHECK_VERSION(1, 8, 0) + .scc_fields.bits.palette_mode_enabled_flag = _is_scc_enabled (self), +#endif + }; + /* *INDENT-ON* */ + + return TRUE; +} + +static guint +_h265_to_va_coding_type (GstVaH265Enc * self, GstVaH265EncFrame * frame) +{ + guint coding_type = 0; + + switch (frame->type) { + case GST_H265_I_SLICE: + coding_type = 1; + break; + case GST_H265_P_SLICE: + if (self->gop.low_delay_b_mode) { + /* Convert P into forward ref B */ + coding_type = 3; + } else { + coding_type = 2; + } + break; + case GST_H265_B_SLICE: + /* We use hierarchical_level_plus1, so same for all B frames */ + coding_type = 3; + break; + default: + break; + } + + g_assert (coding_type > 0); + return coding_type; +} + +static inline gboolean +_h265_fill_picture_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame, + VAEncPictureParameterBufferHEVC * pic_param, gint collocated_poc) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint8 num_ref_idx_l0_default_active_minus1 = 0; + guint8 num_ref_idx_l1_default_active_minus1 = 0; + guint hierarchical_level_plus1 = 0; + guint i; + + /* *INDENT-OFF* */ + if (self->gop.b_pyramid) { + /* I/P is the base hierarchical level 0, L0 level B is 1, and so on. */ + hierarchical_level_plus1 = 1; + + if (frame->type == GST_H265_B_SLICE) { + hierarchical_level_plus1 += 1; + hierarchical_level_plus1 += frame->pyramid_level; + } + } + + if (frame->type == GST_H265_P_SLICE || frame->type == GST_H265_B_SLICE) { + num_ref_idx_l0_default_active_minus1 = + (self->gop.forward_ref_num > 0 ? self->gop.forward_ref_num - 1 : 0); + } + if (frame->type == GST_H265_B_SLICE) { + num_ref_idx_l1_default_active_minus1 = + (self->gop.backward_ref_num > 0 ? self->gop.backward_ref_num - 1 : 0); + } + + *pic_param = (VAEncPictureParameterBufferHEVC) { + .decoded_curr_pic.picture_id = + gst_va_encode_picture_get_reconstruct_surface (frame->picture), + .decoded_curr_pic.pic_order_cnt = frame->poc, + .decoded_curr_pic.flags = 0, + + .coded_buf = frame->picture->coded_buffer, + .last_picture = frame->last_frame, + .pic_init_qp = self->rc.qp_i, + .diff_cu_qp_delta_depth = self->features.diff_cu_qp_delta_depth, + /* Do not use qp offset in picture. */ + .pps_cb_qp_offset = 0, + .pps_cr_qp_offset = 0, + /* TODO: multi tile support */ + .num_tile_columns_minus1 = 0, + .num_tile_rows_minus1 = 0, + .log2_parallel_merge_level_minus2 = 0, + .ctu_max_bitsize_allowed = 0, + .num_ref_idx_l0_default_active_minus1 = num_ref_idx_l0_default_active_minus1, + .num_ref_idx_l1_default_active_minus1 = num_ref_idx_l1_default_active_minus1, + .slice_pic_parameter_set_id = 0, + .nal_unit_type = _h265_nal_unit_type (frame), + .pic_fields.bits = { + .idr_pic_flag = (frame->poc == 0), + .coding_type = _h265_to_va_coding_type (self, frame), + .reference_pic_flag = frame->is_ref, + /* allow slice to set dependent_slice_segment_flag */ + .dependent_slice_segments_enabled_flag = + self->features.dependent_slice_segment_flag, + .sign_data_hiding_enabled_flag = + self->features.sign_data_hiding_enabled_flag, + .constrained_intra_pred_flag = self->features.constrained_intra_pred_flag, + .transform_skip_enabled_flag = self->features.transform_skip_enabled_flag, + .cu_qp_delta_enabled_flag = self->features.cu_qp_delta_enabled_flag, + .weighted_pred_flag = self->features.weighted_pred_flag, + .weighted_bipred_flag = self->features.weighted_bipred_flag, + .transquant_bypass_enabled_flag = + self->features.transquant_bypass_enabled_flag, + .tiles_enabled_flag = _is_tile_enabled (self), + .entropy_coding_sync_enabled_flag = 0, + /* When we enable multi tiles, enable this. */ + .loop_filter_across_tiles_enabled_flag = _is_tile_enabled (self), + .pps_loop_filter_across_slices_enabled_flag = 1, + /* Should not change the scaling list, not used now */ + .scaling_list_data_present_flag = + self->features.scaling_list_data_present_flag, + .screen_content_flag = 0, + /* Depend on weighted_pred_flag and weighted_bipred_flag */ + .enable_gpu_weighted_prediction = 0, + /* set if IDR. */ + .no_output_of_prior_pics_flag = 0, + }, + /* We use coding_type here, set this to 0. */ + .hierarchical_level_plus1 = hierarchical_level_plus1, +#if VA_CHECK_VERSION(1, 8, 0) + .scc_fields.bits.pps_curr_pic_ref_enabled_flag = + _is_scc_enabled (self), +#endif + }; + /* *INDENT-ON* */ + + i = 0; + if (frame->type != GST_H265_I_SLICE) { + GstVaH265EncFrame *f; + + if (g_queue_is_empty (&base->ref_list)) { + GST_ERROR_OBJECT (self, "No reference found for frame type %s", + _h265_slice_type_name (frame->type)); + return FALSE; + } + + g_assert (g_queue_get_length (&base->ref_list) <= self->gop.num_ref_frames); + + /* ref frames in queue are already sorted by poc. */ + for (; i < g_queue_get_length (&base->ref_list); i++) { + f = _enc_frame (g_queue_peek_nth (&base->ref_list, i)); + + pic_param->reference_framesi.picture_id = + gst_va_encode_picture_get_reconstruct_surface (f->picture); + pic_param->reference_framesi.pic_order_cnt = f->poc; + pic_param->reference_framesi.flags = 0; + } + + g_assert (i < 15); + } + for (; i < 15; i++) { + pic_param->reference_framesi.picture_id = VA_INVALID_SURFACE; + pic_param->reference_framesi.flags = VA_PICTURE_HEVC_INVALID; + } + + /* If mvp enabled, collocated_ref_idx specifies the reference index of + the collocated picture used for temporal motion vector prediction. + We should find the according index in reference_frames here. */ + if (frame->type != GST_H265_I_SLICE + && self->features.temporal_mvp_enabled_flag) { + gint index = -1; + + for (i = 0; i < 15; i++) { + if (pic_param->reference_framesi.flags != VA_PICTURE_HEVC_INVALID && + pic_param->reference_framesi.pic_order_cnt == collocated_poc) { + index = i; + break; + } + } + + g_assert (index >= 0); + pic_param->collocated_ref_pic_index = index; + } else { + pic_param->collocated_ref_pic_index = 0xFF; + } + + /* Setup tile info */ + if (pic_param->pic_fields.bits.tiles_enabled_flag) { + /* Always set loop filter across tiles enabled now */ + pic_param->pic_fields.bits.loop_filter_across_tiles_enabled_flag = 1; + + pic_param->num_tile_columns_minus1 = self->partition.num_tile_cols - 1; + pic_param->num_tile_rows_minus1 = self->partition.num_tile_rows - 1; + + /* The VA row_height_minus1 and column_width_minus1 size is 1 smaller + than the MAX_COL_TILES and MAX_ROW_TILES, which means the driver + can deduce the last tile's size based on the picture info. We need + to take care of the array size here. */ + for (i = 0; i < MIN (self->partition.num_tile_cols, 19); i++) + pic_param->column_width_minus1i = self->partition.tile_ctu_colsi - 1; + for (i = 0; i < MIN (self->partition.num_tile_rows, 21); i++) + pic_param->row_height_minus1i = self->partition.tile_ctu_rowsi - 1; + } + + return TRUE; +} + +static gboolean +_h265_fill_slice_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame, + guint start_address, gint ctu_num, gboolean last_slice_of_pic, + GstVaH265EncFrame * list016, guint list0_num, + GstVaH265EncFrame * list116, guint list1_num, + VAEncSliceParameterBufferHEVC * slice) +{ + int8_t slice_qp_delta = 0; + GstH265SliceType frame_type; + gint i; + + /* *INDENT-OFF* */ + if (self->rc.rc_ctrl_mode == VA_RC_CQP) { + if (frame->type == GST_H265_P_SLICE) { + slice_qp_delta = self->rc.qp_p - self->rc.qp_i; + } else if (frame->type == GST_H265_B_SLICE) { + slice_qp_delta = (int8_t) (self->rc.qp_b - self->rc.qp_i); + } + g_assert (slice_qp_delta <= 51 && slice_qp_delta >= -51); + } + + frame_type = frame->type; + /* If low_delay_b_mode, we convert P to low delay b, which has 2 + ref lists and clone L1 from L0. */ + if (self->gop.low_delay_b_mode && frame->type == GST_H265_P_SLICE) { + g_assert (self->gop.max_l1_num > 0); + g_assert (list1_num == 0); + + frame_type = GST_H265_B_SLICE; + list1_num = (list0_num <= self->gop.max_l1_num ? + list0_num : self->gop.max_l1_num); + + for (i = 0; i < list1_num; i++) + list1i = list0i; + } + + /* In scc mode, the I frame can ref to itself and so the L0 reference + list is enabled. Then we need to change I frame to P frame because + it uses L0 list. We just leave all reference unchanged and so all + ref_pic_list0's picture is invalid, the only ref is itself enabled + by pic_param->scc_fields.bits.pps_curr_pic_ref_enabled_flag. */ + if (_is_scc_enabled (self) && frame->type == GST_H265_I_SLICE) { + frame_type = GST_H265_P_SLICE; + g_assert (list0_num == 0); + } + + *slice = (VAEncSliceParameterBufferHEVC) { + .slice_segment_address = start_address, + .num_ctu_in_slice = ctu_num, + .slice_type = frame_type, + /* Only one parameter set supported now. */ + .slice_pic_parameter_set_id = 0, + /* Set the reference list later + .num_ref_idx_l0_active_minus1, + .num_ref_idx_l1_active_minus1, + .ref_pic_list015, + .ref_pic_list115, */ + /* weighted_pred_flag or weighted_bipred_idc is not enabled. */ + .luma_log2_weight_denom = 0, + .delta_chroma_log2_weight_denom = 0, + .delta_luma_weight_l0 = { 0, }, + .luma_offset_l0 = { 0, }, + .delta_chroma_weight_l0 = { }, + .chroma_offset_l0 = { }, + .delta_luma_weight_l1 = { }, + .luma_offset_l1 = { }, + .delta_chroma_weight_l1 = { }, + .chroma_offset_l1 = { }, + + .max_num_merge_cand = 5, + .slice_qp_delta = slice_qp_delta, + .slice_cb_qp_offset = 0, + .slice_cr_qp_offset = 0, + /* deblocking_filter_control_present_flag not set now. */ + .slice_beta_offset_div2 = 0, + .slice_tc_offset_div2 = 0, + .slice_fields.bits = { + .last_slice_of_pic_flag = last_slice_of_pic, + .dependent_slice_segment_flag = (start_address == 0 ? 0 : + self->features.dependent_slice_segment_flag), + .colour_plane_id = self->features.colour_plane_id, + .slice_temporal_mvp_enabled_flag = + self->features.temporal_mvp_enabled_flag, + .slice_sao_luma_flag = self->features.slice_sao_luma_flag, + .slice_sao_chroma_flag = self->features.slice_sao_chroma_flag, + /* Set the reference list later + .num_ref_idx_active_override_flag, */ + .mvd_l1_zero_flag = 0, + /* cabac_init_present_flag is not set now. */ + .cabac_init_flag = 0, + /* deblocking_filter_control_present_flag not set now */ + .slice_deblocking_filter_disabled_flag = 0, + .slice_loop_filter_across_slices_enabled_flag = 1, + .collocated_from_l0_flag = (frame_type == GST_H265_I_SLICE ? + 0 : self->features.collocated_from_l0_flag), + }, +#if VA_CHECK_VERSION(1, 10, 0) + .pred_weight_table_bit_offset = 0, + .pred_weight_table_bit_length = 0, +#endif + }; + /* *INDENT-ON* */ + + if (frame_type == GST_H265_B_SLICE || frame_type == GST_H265_P_SLICE) { + slice->slice_fields.bits.num_ref_idx_active_override_flag = + (list0_num > 0 || list1_num > 0); + slice->num_ref_idx_l0_active_minus1 = list0_num > 0 ? list0_num - 1 : 0; + + if (frame_type == GST_H265_B_SLICE) + slice->num_ref_idx_l1_active_minus1 = list1_num > 0 ? list1_num - 1 : 0; + } + + i = 0; + if (frame_type != GST_H265_I_SLICE) { + for (; i < list0_num; i++) { + slice->ref_pic_list0i.picture_id = + gst_va_encode_picture_get_reconstruct_surface (list0i->picture); + slice->ref_pic_list0i.pic_order_cnt = list0i->poc; + } + } + for (; i < G_N_ELEMENTS (slice->ref_pic_list0); ++i) { + slice->ref_pic_list0i.picture_id = VA_INVALID_SURFACE; + slice->ref_pic_list0i.flags = VA_PICTURE_HEVC_INVALID; + } + + i = 0; + if (frame_type == GST_H265_B_SLICE) { + for (; i < list1_num; i++) { + slice->ref_pic_list1i.picture_id = + gst_va_encode_picture_get_reconstruct_surface (list1i->picture); + slice->ref_pic_list1i.pic_order_cnt = list1i->poc; + } + } + for (; i < G_N_ELEMENTS (slice->ref_pic_list1); ++i) { + slice->ref_pic_list1i.picture_id = VA_INVALID_SURFACE; + slice->ref_pic_list1i.flags = VA_PICTURE_HEVC_INVALID; + } + + return TRUE; +} + +static gboolean +_h265_add_sequence_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame, + VAEncSequenceParameterBufferHEVC * sequence) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + + if (!gst_va_encoder_add_param (base->encoder, frame->picture, + VAEncSequenceParameterBufferType, sequence, sizeof (*sequence))) { + GST_ERROR_OBJECT (self, "Failed to create the sequence parameter"); + return FALSE; + } + + return TRUE; +} + +static gboolean +_h265_add_picture_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame, + VAEncPictureParameterBufferHEVC * pic_param) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + + if (!gst_va_encoder_add_param (base->encoder, frame->picture, + VAEncPictureParameterBufferType, pic_param, + sizeof (VAEncPictureParameterBufferHEVC))) { + GST_ERROR_OBJECT (self, "Failed to create the picture parameter"); + return FALSE; + } + + return TRUE; +} + +static gboolean +_h265_add_slice_parameter (GstVaH265Enc * self, GstVaH265EncFrame * frame, + VAEncSliceParameterBufferHEVC * slice) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + + if (!gst_va_encoder_add_param (base->encoder, frame->picture, + VAEncSliceParameterBufferType, slice, + sizeof (VAEncSliceParameterBufferHEVC))) { + GST_ERROR_OBJECT (self, "Failed to add the slice parameter"); + return FALSE; + } + + return TRUE; +} + +static gboolean +_h265_add_slices (GstVaH265Enc * self, + GstVaH265EncFrame * frame, GstH265PPS * pps, + GstVaH265EncFrame * list_forward16, guint list_forward_num, + GstVaH265EncFrame * list_backward16, guint list_backward_num, + gint negative_pocs16, guint num_negative_pics, + gint positive_pocs16, guint num_positive_pics) +{ + guint i_slice; + VAEncSliceParameterBufferHEVC slice; + GstH265SliceHdr slice_hdr; + + for (i_slice = 0; i_slice < self->partition.num_slices; i_slice++) { + if (!_h265_fill_slice_parameter (self, frame, + self->partition.slice_segment_addressi_slice, + self->partition.num_ctu_in_slicei_slice, + (i_slice == self->partition.num_slices - 1), list_forward, + list_forward_num, list_backward, list_backward_num, &slice)) + return FALSE; + + if (!_h265_add_slice_parameter (self, frame, &slice)) + return FALSE; + + if (self->packed_headers & VA_ENC_PACKED_HEADER_SLICE) { + if (!_h265_fill_slice_header (self, frame, pps, &slice, i_slice == 0, + list_forward_num, list_backward_num, negative_pocs, + num_negative_pics, positive_pocs, num_positive_pics, &slice_hdr)) + return FALSE; + + if (!_h265_add_slice_header (self, frame, &slice_hdr)) + return FALSE; + } + } + + return TRUE; +} + +static gint +_poc_asc_compare (const GstVaH265EncFrame ** a, const GstVaH265EncFrame ** b) +{ + return (*a)->poc - (*b)->poc; +} + +static gint +_poc_des_compare (const GstVaH265EncFrame ** a, const GstVaH265EncFrame ** b) +{ + return (*b)->poc - (*a)->poc; +} + +static gboolean +_h265_encode_one_frame (GstVaH265Enc * self, GstVideoCodecFrame * gst_frame) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + VAEncPictureParameterBufferHEVC pic_param; + GstH265PPS pps; + GstVaH265EncFrame *frame; + GstVaH265EncFrame *list_forward16 = { NULL, }; + guint list_forward_num = 0; + GstVaH265EncFrame *list_backward16 = { NULL, }; + guint list_backward_num = 0; + gint negative_pocs16 = { }; + guint num_negative_pics = 0; + gint positive_pocs16 = { }; + guint num_positive_pics = 0; + gint collocated_poc = -1; + gint i; + + g_return_val_if_fail (gst_frame, FALSE); + + frame = _enc_frame (gst_frame); + + if (self->aud && !_h265_add_aud (self, frame)) + return FALSE; + + /* Repeat the VPS/SPS for IDR. */ + if (frame->poc == 0) { + VAEncSequenceParameterBufferHEVC sequence; + + if (!gst_va_base_enc_add_rate_control_parameter (base, frame->picture, + self->rc.rc_ctrl_mode, self->rc.max_bitrate_bits, + self->rc.target_percentage, self->rc.qp_i, self->rc.min_qp, + self->rc.max_qp, self->rc.mbbrc)) + return FALSE; + + if (!gst_va_base_enc_add_quality_level_parameter (base, frame->picture, + self->rc.target_usage)) + return FALSE; + + if (!gst_va_base_enc_add_frame_rate_parameter (base, frame->picture)) + return FALSE; + + if (!gst_va_base_enc_add_hrd_parameter (base, frame->picture, + self->rc.rc_ctrl_mode, self->rc.cpb_length_bits)) + return FALSE; + + if (!gst_va_base_enc_add_trellis_parameter (base, frame->picture, + self->features.use_trellis)) + return FALSE; + + _h265_fill_sequence_parameter (self, &sequence); + if (!_h265_add_sequence_parameter (self, frame, &sequence)) + return FALSE; + + if (self->packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE) { + if (!_h265_fill_vps (self, &sequence)) + return FALSE; + + if (!_h265_fill_sps (self, &sequence)) + return FALSE; + + if (!_h265_add_vps_header (self, frame)) + return FALSE; + + if (!_h265_add_sps_header (self, frame)) + return FALSE; + } + } + + /* Non I frame, construct reference list. */ + if (frame->type != GST_H265_I_SLICE) { + GstVaH265EncFrame *vaf; + GstVideoCodecFrame *f; + + for (i = g_queue_get_length (&base->ref_list) - 1; i >= 0; i--) { + f = g_queue_peek_nth (&base->ref_list, i); + vaf = _enc_frame (f); + if (vaf->poc > frame->poc) + continue; + + list_forwardlist_forward_num = vaf; + list_forward_num++; + } + + /* reorder to select the most nearest forward frames. */ + g_qsort_with_data (list_forward, list_forward_num, sizeof (gpointer), + (GCompareDataFunc) _poc_des_compare, NULL); + + num_negative_pics = list_forward_num; + for (i = 0; i < list_forward_num; i++) + negative_pocsi = list_forwardi->poc; + + if (list_forward_num > self->gop.forward_ref_num) + list_forward_num = self->gop.forward_ref_num; + + if (self->features.temporal_mvp_enabled_flag + && self->features.collocated_from_l0_flag) { + if (self->features.collocated_ref_idx >= list_forward_num) { + GST_ERROR_OBJECT (self, "MVP collocated_ref_idx %d is out of L0 range", + self->features.collocated_ref_idx); + return FALSE; + } + + collocated_poc = list_forwardself->features.collocated_ref_idx->poc; + } + } + + if (frame->type == GST_H265_B_SLICE) { + GstVaH265EncFrame *vaf; + GstVideoCodecFrame *f; + + for (i = 0; i < g_queue_get_length (&base->ref_list); i++) { + f = g_queue_peek_nth (&base->ref_list, i); + vaf = _enc_frame (f); + if (vaf->poc < frame->poc) + continue; + + list_backwardlist_backward_num = vaf; + list_backward_num++; + } + + /* reorder to select the most nearest backward frames. */ + g_qsort_with_data (list_backward, list_backward_num, sizeof (gpointer), + (GCompareDataFunc) _poc_asc_compare, NULL); + + num_positive_pics = list_backward_num; + for (i = 0; i < list_backward_num; i++) + positive_pocsi = list_backwardi->poc; + + if (list_backward_num > self->gop.backward_ref_num) + list_backward_num = self->gop.backward_ref_num; + + if (self->features.temporal_mvp_enabled_flag + && !self->features.collocated_from_l0_flag) { + if (self->features.collocated_ref_idx >= list_backward_num) { + GST_ERROR_OBJECT (self, "MVP collocated_ref_idx %d is out of L1 range", + self->features.collocated_ref_idx); + return FALSE; + } + + collocated_poc = list_backwardself->features.collocated_ref_idx->poc; + } + } + + g_assert (list_forward_num + list_backward_num <= self->gop.num_ref_frames); + + if (!_h265_fill_picture_parameter (self, frame, &pic_param, collocated_poc)) + return FALSE; + if (!_h265_add_picture_parameter (self, frame, &pic_param)) + return FALSE; + + _h265_fill_pps (self, &pic_param, &self->sps_hdr, &pps); + + if ((self->packed_headers & VA_ENC_PACKED_HEADER_PICTURE) + && frame->type == GST_H265_I_SLICE + && !_h265_add_pps_header (self, frame, &pps)) + return FALSE; + + if (!_h265_add_slices (self, frame, &pps, + list_forward, list_forward_num, list_backward, list_backward_num, + negative_pocs, num_negative_pics, positive_pocs, num_positive_pics)) + return FALSE; + + if (!gst_va_encoder_encode (base->encoder, frame->picture)) { + GST_ERROR_OBJECT (self, "Encode frame error"); + return FALSE; + } + + return TRUE; +} + +static gboolean +_h265_push_one_frame (GstVaBaseEnc * base, GstVideoCodecFrame * gst_frame, + gboolean last) +{ + GstVaH265Enc *self = GST_VA_H265_ENC (base); + GstVaH265EncFrame *frame; + + g_return_val_if_fail (self->gop.cur_frame_index <= self->gop.idr_period, + FALSE); + + if (gst_frame) { + /* Begin a new GOP, should have a empty reorder_list. */ + if (self->gop.cur_frame_index == self->gop.idr_period) { + g_assert (g_queue_is_empty (&base->reorder_list)); + self->gop.cur_frame_index = 0; + } + + frame = _enc_frame (gst_frame); + frame->poc = self->gop.cur_frame_index; + g_assert (self->gop.cur_frame_index <= self->gop.max_pic_order_cnt); + + if (self->gop.cur_frame_index == 0) { + g_assert (frame->poc == 0); + GST_LOG_OBJECT (self, "system_frame_number: %d, an IDR frame, starts" + " a new GOP", gst_frame->system_frame_number); + + g_queue_clear_full (&base->ref_list, + (GDestroyNotify) gst_video_codec_frame_unref); + } + + frame->type = self->gop.frame_typesself->gop.cur_frame_index.slice_type; + frame->is_ref = self->gop.frame_typesself->gop.cur_frame_index.is_ref; + frame->pyramid_level = + self->gop.frame_typesself->gop.cur_frame_index.pyramid_level; + frame->left_ref_poc_diff = + self->gop.frame_typesself->gop.cur_frame_index.left_ref_poc_diff; + frame->right_ref_poc_diff = + self->gop.frame_typesself->gop.cur_frame_index.right_ref_poc_diff; + + if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (gst_frame)) { + GST_DEBUG_OBJECT (self, "system_frame_number: %d, a force key frame," + " promote its type from %s to %s", gst_frame->system_frame_number, + _h265_slice_type_name (frame->type), + _h265_slice_type_name (GST_H265_I_SLICE)); + frame->type = GST_H265_I_SLICE; + frame->is_ref = TRUE; + } + + GST_LOG_OBJECT (self, "Push frame, system_frame_number: %d, poc %d, " + "frame type %s", gst_frame->system_frame_number, frame->poc, + _h265_slice_type_name (frame->type)); + + self->gop.cur_frame_index++; + g_queue_push_tail (&base->reorder_list, + gst_video_codec_frame_ref (gst_frame)); + } + + /* ensure the last one a non-B and end the GOP. */ + if (last && self->gop.cur_frame_index < self->gop.idr_period) { + GstVideoCodecFrame *last_frame; + + /* Ensure next push will start a new GOP. */ + self->gop.cur_frame_index = self->gop.idr_period; + + if (!g_queue_is_empty (&base->reorder_list)) { + last_frame = g_queue_peek_tail (&base->reorder_list); + frame = _enc_frame (last_frame); + if (frame->type == GST_H265_B_SLICE) { + frame->type = GST_H265_P_SLICE; + frame->is_ref = TRUE; + } + } + } + + return TRUE; +} + +struct RefFramesCount +{ + gint poc; + guint num; +}; + +static void +_count_backward_ref_num (gpointer data, gpointer user_data) +{ + GstVaH265EncFrame *frame = _enc_frame (data); + struct RefFramesCount *count = (struct RefFramesCount *) user_data; + + g_assert (frame->poc != count->poc); + if (frame->poc > count->poc) + count->num++; +} + +static GstVideoCodecFrame * +_h265_pop_pyramid_b_frame (GstVaH265Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint i; + gint index = -1; + GstVaH265EncFrame *b_vaframe; + GstVideoCodecFrame *b_frame; + struct RefFramesCount count; + + g_assert (self->gop.backward_ref_num <= 2); + + b_frame = NULL; + b_vaframe = NULL; + + /* Find the highest level with smallest poc. */ + for (i = 0; i < g_queue_get_length (&base->reorder_list); i++) { + GstVaH265EncFrame *vaf; + GstVideoCodecFrame *f; + + f = g_queue_peek_nth (&base->reorder_list, i); + + if (!b_frame) { + b_frame = f; + b_vaframe = _enc_frame (b_frame); + index = i; + continue; + } + + vaf = _enc_frame (f); + if (b_vaframe->pyramid_level < vaf->pyramid_level) { + b_frame = f; + b_vaframe = vaf; + index = i; + continue; + } + + if (b_vaframe->poc > vaf->poc) { + b_frame = f; + b_vaframe = vaf; + index = i; + } + } + +again: + /* Check whether its refs are already poped. */ + g_assert (b_vaframe->left_ref_poc_diff != 0); + g_assert (b_vaframe->right_ref_poc_diff != 0); + for (i = 0; i < g_queue_get_length (&base->reorder_list); i++) { + GstVaH265EncFrame *vaf; + GstVideoCodecFrame *f; + + f = g_queue_peek_nth (&base->reorder_list, i); + + if (f == b_frame) + continue; + + vaf = _enc_frame (f); + if (vaf->poc == b_vaframe->poc + b_vaframe->left_ref_poc_diff + || vaf->poc == b_vaframe->poc + b_vaframe->right_ref_poc_diff) { + b_frame = f; + b_vaframe = vaf; + index = i; + goto again; + } + } + + /* Ensure we already have backward refs */ + count.num = 0; + count.poc = b_vaframe->poc; + g_queue_foreach (&base->ref_list, (GFunc) _count_backward_ref_num, &count); + if (count.num >= 1) { + GstVideoCodecFrame *f; + + /* it will unref at pop_frame */ + f = g_queue_pop_nth (&base->reorder_list, index); + g_assert (f == b_frame); + } else { + b_frame = NULL; + } + + return b_frame; +} + +static gboolean +_h265_pop_one_frame (GstVaBaseEnc * base, GstVideoCodecFrame ** out_frame) +{ + GstVaH265Enc *self = GST_VA_H265_ENC (base); + GstVaH265EncFrame *vaframe; + GstVideoCodecFrame *frame; + struct RefFramesCount count; + + g_return_val_if_fail (self->gop.cur_frame_index <= self->gop.idr_period, + FALSE); + + *out_frame = NULL; + + if (g_queue_is_empty (&base->reorder_list)) + return TRUE; + + /* Return the last pushed non-B immediately. */ + frame = g_queue_peek_tail (&base->reorder_list); + vaframe = _enc_frame (frame); + if (vaframe->type != GST_H265_B_SLICE) { + frame = g_queue_pop_tail (&base->reorder_list); + goto get_one; + } + + if (self->gop.b_pyramid) { + frame = _h265_pop_pyramid_b_frame (self); + if (frame == NULL) + return TRUE; + + goto get_one; + } + + g_assert (self->gop.backward_ref_num > 0); + + /* If GOP end, pop anyway. */ + if (self->gop.cur_frame_index == self->gop.idr_period) { + frame = g_queue_pop_head (&base->reorder_list); + goto get_one; + } + + /* Ensure we already have enough backward refs */ + frame = g_queue_peek_head (&base->reorder_list); + vaframe = _enc_frame (frame); + count.num = 0; + count.poc = vaframe->poc; + g_queue_foreach (&base->ref_list, _count_backward_ref_num, &count); + if (count.num >= self->gop.backward_ref_num) { + frame = g_queue_pop_head (&base->reorder_list); + goto get_one; + } + + return TRUE; + +get_one: + vaframe = _enc_frame (frame); + + if (vaframe->poc == 0) + self->gop.total_idr_count++; + + if (self->gop.b_pyramid && vaframe->type == GST_H265_B_SLICE) { + GST_LOG_OBJECT (self, "pop a pyramid B frame with system_frame_number:" + " %d, poc: %d, is_ref: %s, level %d", + frame->system_frame_number, vaframe->poc, + vaframe->is_ref ? "true" : "false", vaframe->pyramid_level); + } else { + GST_LOG_OBJECT (self, "pop a frame with system_frame_number: %d," + " frame type: %s, poc: %d, is_ref: %s", + frame->system_frame_number, _h265_slice_type_name (vaframe->type), + vaframe->poc, vaframe->is_ref ? "true" : "false"); + } + + /* unref frame popped from queue or pyramid b_frame */ + gst_video_codec_frame_unref (frame); + *out_frame = frame; + return TRUE; +} + +static gboolean +gst_va_h265_enc_reorder_frame (GstVaBaseEnc * base, GstVideoCodecFrame * frame, + gboolean bump_all, GstVideoCodecFrame ** out_frame) +{ + if (!_h265_push_one_frame (base, frame, bump_all)) { + GST_ERROR_OBJECT (base, "Failed to push the input frame" + " system_frame_number: %d into the reorder list", + frame->system_frame_number); + + *out_frame = NULL; + return FALSE; + } + + if (!_h265_pop_one_frame (base, out_frame)) { + GST_ERROR_OBJECT (base, "Failed to pop the frame from the reorder list"); + *out_frame = NULL; + return FALSE; + } + + return TRUE; +} + +static GstVideoCodecFrame * +_h265_find_unused_reference_frame (GstVaH265Enc * self, + GstVaH265EncFrame * frame) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + GstVaH265EncFrame *b_vaframe; + GstVideoCodecFrame *b_frame; + guint i; + + /* We still have more space. */ + if (g_queue_get_length (&base->ref_list) < self->gop.num_ref_frames) + return NULL; + + /* Not b_pyramid, sliding window is enough. */ + if (!self->gop.b_pyramid) + return g_queue_peek_head (&base->ref_list); + + /* Non-b ref frame, just pop the first one. */ + if (frame->type != GST_H265_B_SLICE) + return g_queue_peek_head (&base->ref_list); + + /* Choose the B frame with lowest POC. */ + b_frame = NULL; + b_vaframe = NULL; + for (i = 0; i < g_queue_get_length (&base->ref_list); i++) { + GstVideoCodecFrame *f; + GstVaH265EncFrame *vaf; + + f = g_queue_peek_nth (&base->ref_list, i); + vaf = _enc_frame (f); + if (vaf->type != GST_H265_B_SLICE) + continue; + + if (!b_frame) { + g_assert (b_vaframe == NULL); + b_frame = f; + b_vaframe = vaf; + continue; + } + + g_assert (b_vaframe); + g_assert (vaf->poc != b_vaframe->poc); + if (vaf->poc < b_vaframe->poc) { + b_frame = f; + b_vaframe = vaf; + } + } + + /* No B frame as ref. */ + if (!b_frame) + return g_queue_peek_head (&base->ref_list); + + if (b_frame != g_queue_peek_head (&base->ref_list)) { + b_vaframe = _enc_frame (b_frame); + GST_LOG_OBJECT (self, "The frame with POC: %d will be" + " replaced by the frame with POC: %d explicitly", + b_vaframe->poc, frame->poc); + } + + return b_frame; +} + +static gint +_sort_by_poc (gconstpointer a, gconstpointer b, gpointer user_data) +{ + GstVaH265EncFrame *frame1 = _enc_frame ((GstVideoCodecFrame *) a); + GstVaH265EncFrame *frame2 = _enc_frame ((GstVideoCodecFrame *) b); + + g_assert (frame1->poc != frame2->poc); + + return frame1->poc - frame2->poc; +} + +static GstFlowReturn +gst_va_h265_enc_encode_frame (GstVaBaseEnc * base, + GstVideoCodecFrame * gst_frame, gboolean is_last) +{ + GstVaH265Enc *self = GST_VA_H265_ENC (base); + GstVaH265EncFrame *frame; + GstVideoCodecFrame *unused_ref; + + frame = _enc_frame (gst_frame); + frame->last_frame = is_last; + + g_assert (frame->picture == NULL); + frame->picture = gst_va_encode_picture_new (base->encoder, + gst_frame->input_buffer); + + if (!frame->picture) { + GST_ERROR_OBJECT (base, "Failed to create the encode picture"); + return GST_FLOW_ERROR; + } + + if (!_h265_encode_one_frame (self, gst_frame)) { + GST_ERROR_OBJECT (base, "Failed to encode the frame"); + return GST_FLOW_ERROR; + } + + g_queue_push_tail (&base->output_list, gst_video_codec_frame_ref (gst_frame)); + + if (frame->is_ref) { + unused_ref = _h265_find_unused_reference_frame (self, frame); + + if (unused_ref) { + if (!g_queue_remove (&base->ref_list, unused_ref)) + g_assert_not_reached (); + + gst_video_codec_frame_unref (unused_ref); + } + + /* Add it into the reference list. */ + g_queue_push_tail (&base->ref_list, gst_video_codec_frame_ref (gst_frame)); + g_queue_sort (&base->ref_list, _sort_by_poc, NULL); + + g_assert (g_queue_get_length (&base->ref_list) <= self->gop.num_ref_frames); + } + + return GST_FLOW_OK; +} + +/* Clear all the info of last reconfig and set the fields based on + * property. The reconfig may change these fields because of the + * profile/level and HW limitation. */ +static void +gst_va_h265_enc_reset_state (GstVaBaseEnc * base) +{ + GstVaH265Enc *self = GST_VA_H265_ENC (base); + + GST_VA_BASE_ENC_CLASS (parent_class)->reset_state (base); + + GST_OBJECT_LOCK (self); + self->features.use_trellis = self->prop.use_trellis; + self->aud = self->prop.aud; + self->partition.num_slices = self->prop.num_slices; + self->partition.num_tile_cols = self->prop.num_tile_cols; + self->partition.num_tile_rows = self->prop.num_tile_rows; + self->gop.idr_period = self->prop.key_int_max; + self->gop.num_bframes = self->prop.num_bframes; + self->gop.b_pyramid = self->prop.b_pyramid; + self->gop.num_iframes = self->prop.num_iframes; + self->gop.num_ref_frames = self->prop.num_ref_frames; + self->rc.rc_ctrl_mode = self->prop.rc_ctrl; + self->rc.min_qp = self->prop.min_qp; + self->rc.max_qp = self->prop.max_qp; + self->rc.qp_i = self->prop.qp_i; + self->rc.qp_p = self->prop.qp_p; + self->rc.qp_b = self->prop.qp_b; + self->rc.mbbrc = self->prop.mbbrc; + self->rc.target_percentage = self->prop.target_percentage; + self->rc.target_usage = self->prop.target_usage; + self->rc.cpb_size = self->prop.cpb_size; + GST_OBJECT_UNLOCK (self); + + self->level_idc = 0; + self->level_str = NULL; + self->min_cr = 0; + self->tier_flag = FALSE; + self->ctu_size = 0; + self->min_coding_block_size = 0; + self->ctu_width = 0; + self->ctu_height = 0; + self->luma_width = 0; + self->luma_height = 0; + self->conformance_window_flag = FALSE; + self->conf_win_left_offset = 0; + self->conf_win_right_offset = 0; + self->conf_win_top_offset = 0; + self->conf_win_bottom_offset = 0; + + self->bits_depth_luma_minus8 = 0; + self->bits_depth_chroma_minus8 = 0; + + self->packed_headers = 0; + + self->partition.slice_span_tiles = FALSE; + g_clear_pointer (&self->partition.slice_segment_address, g_free); + g_clear_pointer (&self->partition.num_ctu_in_slice, g_free); + g_clear_pointer (&self->partition.tile_ctu_cols, g_free); + g_clear_pointer (&self->partition.tile_ctu_rows, g_free); + + self->features.log2_min_luma_coding_block_size_minus3 = 0; + self->features.log2_diff_max_min_luma_coding_block_size = 0; + self->features.log2_diff_max_min_luma_coding_block_size = 0; + self->features.log2_min_transform_block_size_minus2 = 0; + self->features.log2_diff_max_min_transform_block_size = 0; + self->features.max_transform_hierarchy_depth_inter = 0; + self->features.max_transform_hierarchy_depth_intra = 0; + self->features.separate_colour_plane_flag = FALSE; + self->features.colour_plane_id = 0; + self->features.scaling_list_enabled_flag = FALSE; + self->features.scaling_list_data_present_flag = FALSE; + self->features.amp_enabled_flag = FALSE; + self->features.sample_adaptive_offset_enabled_flag = FALSE; + self->features.slice_sao_luma_flag = FALSE; + self->features.slice_sao_chroma_flag = FALSE; + self->features.pcm_enabled_flag = FALSE; + self->features.pcm_sample_bit_depth_luma_minus1 = 0; + self->features.pcm_sample_bit_depth_chroma_minus1 = 0; + self->features.log2_min_pcm_luma_coding_block_size_minus3 = 0; + self->features.log2_max_pcm_luma_coding_block_size_minus3 = 0; + self->features.temporal_mvp_enabled_flag = FALSE; + self->features.collocated_from_l0_flag = FALSE; + self->features.collocated_ref_idx = 0xFF; + self->features.strong_intra_smoothing_enabled_flag = FALSE; + self->features.dependent_slice_segment_flag = FALSE; + self->features.sign_data_hiding_enabled_flag = FALSE; + self->features.constrained_intra_pred_flag = FALSE; + self->features.transform_skip_enabled_flag = FALSE; + self->features.cu_qp_delta_enabled_flag = FALSE; + self->features.diff_cu_qp_delta_depth = 0; + self->features.weighted_pred_flag = FALSE; + self->features.weighted_bipred_flag = FALSE; + self->features.transquant_bypass_enabled_flag = FALSE; + + self->gop.i_period = 0; + self->gop.total_idr_count = 0; + self->gop.ip_period = 0; + self->gop.low_delay_b_mode = FALSE; + self->gop.highest_pyramid_level = 0; + memset (self->gop.frame_types, 0, sizeof (self->gop.frame_types)); + self->gop.cur_frame_index = 0; + self->gop.max_pic_order_cnt = 0; + self->gop.log2_max_pic_order_cnt = 0; + /* VAEncPictureParameterBufferHEVC.reference_frames limit 15 refs */ + self->gop.max_l0_num = 0; + self->gop.max_l1_num = 0; + self->gop.forward_ref_num = 0; + self->gop.backward_ref_num = 0; + self->gop.num_reorder_frames = 0; + self->gop.max_dpb_size = 0; + + self->rc.max_bitrate = 0; + self->rc.target_bitrate = 0; + self->rc.max_bitrate_bits = 0; + self->rc.target_bitrate_bits = 0; + self->rc.cpb_length_bits = 0; + + memset (&self->vps_hdr, 0, sizeof (GstH265VPS)); + memset (&self->sps_hdr, 0, sizeof (GstH265SPS)); +} + +static guint +_h265_get_rtformat (GstVaH265Enc * self, GstVideoFormat format, + guint * depth, guint * chrome) +{ + guint chroma; + + chroma = gst_va_chroma_from_video_format (format); + + switch (chroma) { + case VA_RT_FORMAT_YUV400: + *depth = 8; + *chrome = 0; + break; + case VA_RT_FORMAT_YUV420: + *depth = 8; + *chrome = 1; + break; + case VA_RT_FORMAT_YUV422: + *depth = 8; + *chrome = 2; + break; + case VA_RT_FORMAT_YUV444: + *depth = 8; + *chrome = 3; + break; + case VA_RT_FORMAT_YUV420_10: + *depth = 10; + *chrome = 1; + break; + case VA_RT_FORMAT_YUV422_10: + *depth = 10; + *chrome = 2; + break; + case VA_RT_FORMAT_YUV444_10: + *depth = 10; + *chrome = 3; + break; + case VA_RT_FORMAT_YUV420_12: + *depth = 12; + *chrome = 1; + break; + case VA_RT_FORMAT_YUV422_12: + *depth = 12; + *chrome = 2; + break; + case VA_RT_FORMAT_YUV444_12: + *depth = 12; + *chrome = 3; + break; + default: + chroma = 0; + GST_ERROR_OBJECT (self, "Unsupported chroma for video format: %s", + gst_video_format_to_string (format)); + break; + } + + return chroma; +} + +static gboolean +_h265_decide_profile (GstVaH265Enc * self, VAProfile * _profile, + guint * _rt_format) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + gboolean ret = FALSE; + GstVideoFormat in_format; + VAProfile profile; + guint rt_format; + GstCaps *allowed_caps = NULL; + guint num_structures, i, j; + GstStructure *structure; + const GValue *v_profile; + GArray *caps_candidates = NULL; + GArray *chroma_candidates = NULL; + guint depth = 0, chrome = 0; + gboolean support_scc = TRUE; + + /* We do not have scc_fields defined in sequence and picture + before 1.8.0, just disable scc all. */ +#if VA_CHECK_VERSION(1, 8, 0) + support_scc = TRUE; +#else + support_scc = FALSE; +#endif + + caps_candidates = g_array_new (TRUE, TRUE, sizeof (VAProfile)); + chroma_candidates = g_array_new (TRUE, TRUE, sizeof (VAProfile)); + + /* First, check whether the downstream requires a specified profile. */ + allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (base)); + if (!allowed_caps) + allowed_caps = gst_pad_query_caps (GST_VIDEO_ENCODER_SRC_PAD (base), NULL); + + if (allowed_caps && !gst_caps_is_empty (allowed_caps)) { + num_structures = gst_caps_get_size (allowed_caps); + for (i = 0; i < num_structures; i++) { + structure = gst_caps_get_structure (allowed_caps, i); + v_profile = gst_structure_get_value (structure, "profile"); + if (!v_profile) + continue; + + if (G_VALUE_HOLDS_STRING (v_profile)) { + profile = + gst_va_profile_from_name (HEVC, g_value_get_string (v_profile)); + if (profile == VAProfileNone) + continue; + + g_array_append_val (caps_candidates, profile); + } else if (GST_VALUE_HOLDS_LIST (v_profile)) { + guint j; + + for (j = 0; j < gst_value_list_get_size (v_profile); j++) { + const GValue *p = gst_value_list_get_value (v_profile, j); + if (!p) + continue; + + profile = gst_va_profile_from_name (HEVC, g_value_get_string (p)); + if (profile == VAProfileNone) + continue; + g_array_append_val (caps_candidates, profile); + } + } + } + } + + if (caps_candidates->len == 0) { + GST_ERROR_OBJECT (self, "No available profile in caps"); + ret = FALSE; + goto out; + } + + in_format = GST_VIDEO_INFO_FORMAT (&base->input_state->info); + rt_format = _h265_get_rtformat (self, in_format, &depth, &chrome); + if (!rt_format) { + GST_ERROR_OBJECT (self, "unsupported video format %s", + gst_video_format_to_string (in_format)); + ret = FALSE; + goto out; + } + + /* To make the thing a little simple here, We only consider the bit + depth compatibility for each level. For example, we will consider + that Main-4:4:4-10 is able to contain 8 bits 4:4:4 streams, but + the we wiil not consider that it will contain 10 bits 4:2:0 stream. */ + if (chrome == 3) { + /* 4:4:4 */ + if (depth == 8) { + profile = VAProfileHEVCMain444; + g_array_append_val (chroma_candidates, profile); + if (support_scc) { + profile = VAProfileHEVCSccMain444; + g_array_append_val (chroma_candidates, profile); + } + } + + if (depth <= 10) { + profile = VAProfileHEVCMain444_10; + g_array_append_val (chroma_candidates, profile); +#if VA_CHECK_VERSION(1, 8, 0) + profile = VAProfileHEVCSccMain444_10; + g_array_append_val (chroma_candidates, profile); +#endif + } + + if (depth <= 12) { + profile = VAProfileHEVCMain444_12; + g_array_append_val (chroma_candidates, profile); + } + } else if (chrome == 2) { + /* 4:2:2 */ + if (depth <= 10) { + profile = VAProfileHEVCMain422_10; + g_array_append_val (chroma_candidates, profile); + } + + if (depth <= 12) { + profile = VAProfileHEVCMain422_12; + g_array_append_val (chroma_candidates, profile); + } + } else if (chrome == 1 || chrome == 0) { + /* 4:2:0 or 4:0:0 */ + if (depth == 8) { + profile = VAProfileHEVCMain; + g_array_append_val (chroma_candidates, profile); + if (support_scc) { + profile = VAProfileHEVCSccMain; + g_array_append_val (chroma_candidates, profile); + } + } + + if (depth <= 10) { + profile = VAProfileHEVCMain10; + g_array_append_val (chroma_candidates, profile); + if (support_scc) { + profile = VAProfileHEVCSccMain10; + g_array_append_val (chroma_candidates, profile); + } + } + + if (depth <= 12) { + profile = VAProfileHEVCMain12; + g_array_append_val (chroma_candidates, profile); + } + } + + /* Just use the first HW available profile in candidate. */ + for (i = 0; i < chroma_candidates->len; i++) { + profile = g_array_index (chroma_candidates, VAProfile, i); + if (!gst_va_encoder_has_profile (base->encoder, profile)) + continue; + + if ((rt_format & gst_va_encoder_get_rtformat (base->encoder, + profile, GST_VA_BASE_ENC_ENTRYPOINT (base))) == 0) + continue; + + for (j = 0; j < caps_candidates->len; j++) { + VAProfile p = g_array_index (caps_candidates, VAProfile, j); + if (profile == p) + break; + } + if (j == caps_candidates->len) + continue; + + *_profile = profile; + *_rt_format = rt_format; + ret = TRUE; + goto out; + } + +out: + g_clear_pointer (&caps_candidates, g_array_unref); + g_clear_pointer (&chroma_candidates, g_array_unref); + g_clear_pointer (&allowed_caps, gst_caps_unref); + + if (ret) { + GST_INFO_OBJECT (self, "Select the profile %s", + gst_va_profile_name (profile)); + } else { + GST_ERROR_OBJECT (self, "Failed to find an available profile"); + } + + return ret; +} + +#define update_property(type, obj, old_val, new_val, prop_id) \ + gst_va_base_enc_update_property_##type (obj, old_val, new_val, propertiesprop_id) +#define update_property_uint(obj, old_val, new_val, prop_id) \ + update_property (uint, obj, old_val, new_val, prop_id) +#define update_property_bool(obj, old_val, new_val, prop_id) \ + update_property (bool, obj, old_val, new_val, prop_id) + +static void +_h265_calculate_tile_partition (GstVaH265Enc * self) +{ + guint32 ctu_per_slice; + guint32 left_slices; + gint32 i, j, k; + guint32 ctu_tile_width_accuMAX_COL_TILES + 1; + guint32 ctu_tile_height_accuMAX_ROW_TILES + 1; + /* CTB address in tile scan. + Add one as sentinel, hold val to calculate ctu_num */ + guint32 *tile_slice_address = + g_malloc ((self->partition.num_slices + 1) * sizeof (guint32)); + /* map the CTB address in tile scan to CTB raster scan of a picture. */ + guint32 *tile_slice_address_map = + g_malloc (self->ctu_width * self->ctu_height * sizeof (guint32)); + + self->partition.slice_segment_address = + g_malloc (self->partition.num_slices * sizeof (guint32)); + self->partition.num_ctu_in_slice = + g_malloc (self->partition.num_slices * sizeof (guint32)); + self->partition.tile_ctu_cols = g_malloc (MAX_COL_TILES * sizeof (guint32)); + self->partition.tile_ctu_rows = g_malloc (MAX_ROW_TILES * sizeof (guint32)); + + /* firstly uniformly separate CTUs into tiles, as the spec 6.5.1 define */ + for (i = 0; i < self->partition.num_tile_cols; i++) + self->partition.tile_ctu_colsi = + ((i + 1) * self->ctu_width) / self->partition.num_tile_cols - + (i * self->ctu_width) / self->partition.num_tile_cols; + for (i = 0; i < self->partition.num_tile_rows; i++) + self->partition.tile_ctu_rowsi = + ((i + 1) * self->ctu_height) / self->partition.num_tile_rows - + (i * self->ctu_height) / self->partition.num_tile_rows; + + /* The requirement that the slice should not span tiles. Firstly we + should scatter slices uniformly into each tile, bigger tile gets + more slices. Then we should assign CTUs within one tile uniformly + to each slice in that tile. */ + if (!self->partition.slice_span_tiles) { + guint32 *slices_per_tile = g_malloc (self->partition.num_tile_cols * + self->partition.num_tile_rows * sizeof (guint32)); + + ctu_per_slice = (self->ctu_width * self->ctu_height + + self->partition.num_slices - 1) / self->partition.num_slices; + g_assert (ctu_per_slice > 0); + left_slices = self->partition.num_slices; + + for (i = 0; + i < self->partition.num_tile_cols * self->partition.num_tile_rows; + i++) { + slices_per_tilei = 1; + left_slices--; + } + while (left_slices) { + /* Find the biggest CTUs/slices, and assign more. */ + gfloat largest = 0.0f; + k = -1; + for (i = 0; + i < self->partition.num_tile_cols * self->partition.num_tile_rows; + i++) { + gfloat f; + f = ((gfloat) + (self->partition.tile_ctu_colsi % self->partition.num_tile_cols * + self->partition.tile_ctu_rows + i / self->partition.num_tile_cols)) / + (gfloat) slices_per_tilei; + g_assert (f >= 1.0f); + if (f > largest) { + k = i; + largest = f; + } + } + + g_assert (k >= 0); + slices_per_tilek++; + left_slices--; + } + + /* Assign CTUs in one tile uniformly to each slice. Note: the slice start + address is CTB address in tile scan(see spec 6.5), that is, we accumulate + all CTUs in tile0, then tile1, and tile2..., not from the picture's + perspective. */ + tile_slice_address0 = 0; + k = 1; + for (i = 0; i < self->partition.num_tile_rows; i++) { + for (j = 0; j < self->partition.num_tile_cols; j++) { + guint32 s_num = slices_per_tilei * self->partition.num_tile_cols + j; + guint32 one_tile_ctus = + self->partition.tile_ctu_colsj * self->partition.tile_ctu_rowsi; + guint32 s; + + GST_LOG_OBJECT (self, "Tile(row %d col %d), has CTU in col %d," + " CTU in row is %d, total CTU %d, assigned %d slices", i, j, + self->partition.tile_ctu_colsj, self->partition.tile_ctu_rowsi, + one_tile_ctus, s_num); + + g_assert (s_num > 0); + for (s = 0; s < s_num; s++) { + tile_slice_addressk = tile_slice_addressk - 1 + + ((s + 1) * one_tile_ctus) / s_num - (s * one_tile_ctus) / s_num; + self->partition.num_ctu_in_slicek - 1 = + tile_slice_addressk - tile_slice_addressk - 1; + k++; + } + } + } + + g_assert (k == self->partition.num_slices + 1); + /* Calculate the last one */ + self->partition.num_ctu_in_sliceself->partition.num_slices - 1 = + self->ctu_width * self->ctu_height - + tile_slice_addressself->partition.num_slices - 1; + + g_free (slices_per_tile); + } + /* The easy way, just assign CTUs to each slice uniformly */ + else { + guint ctu_size, ctu_mod_slice, cur_slice_ctu, last_ctu_index; + + ctu_size = self->ctu_width * self->ctu_height; + + ctu_per_slice = ctu_size / self->partition.num_slices; + ctu_mod_slice = ctu_size % self->partition.num_slices; + last_ctu_index = 0; + + for (i = 0; i < self->partition.num_slices; i++) { + cur_slice_ctu = ctu_per_slice; + /* Scatter the remainder to each slice */ + if (ctu_mod_slice) { + ++cur_slice_ctu; + --ctu_mod_slice; + } + + tile_slice_addressi = last_ctu_index; + self->partition.num_ctu_in_slicei = cur_slice_ctu; + + /* set calculation for next slice */ + last_ctu_index += cur_slice_ctu; + g_assert (last_ctu_index <= ctu_size); + } + } + + /* Build the map to specifying the conversion between a CTB address in CTB + raster scan of a picture and a CTB address in tile scan(see spec 6.5.1 + for details). */ + ctu_tile_width_accu0 = 0; + for (i = 1; i <= self->partition.num_tile_cols; i++) + ctu_tile_width_accui = + ctu_tile_width_accui - 1 + self->partition.tile_ctu_colsi - 1; + + ctu_tile_height_accu0 = 0; + for (i = 1; i <= self->partition.num_tile_rows; i++) + ctu_tile_height_accui = + ctu_tile_height_accui - 1 + self->partition.tile_ctu_rowsi - 1; + + for (k = 0; k < self->ctu_width * self->ctu_height; k++) { + /* The ctu coordinate in the picture. */ + guint32 x = k % self->ctu_width; + guint32 y = k / self->ctu_width; + /* The ctu coordinate in the tile mode. */ + guint32 tile_x = 0; + guint32 tile_y = 0; + /* The index of the CTU in the tile mode. */ + guint32 tso = 0; + + for (i = 0; i < self->partition.num_tile_cols; i++) + if (x >= ctu_tile_width_accui) + tile_x = i; + g_assert (tile_x <= self->partition.num_tile_cols - 1); + + for (j = 0; j < self->partition.num_tile_rows; j++) + if (y >= ctu_tile_height_accuj) + tile_y = j; + g_assert (tile_y <= self->partition.num_tile_rows - 1); + + /* add all ctus in the tiles the same line before us */ + for (i = 0; i < tile_x; i++) + tso += self->partition.tile_ctu_rowstile_y * + self->partition.tile_ctu_colsi; + + /* add all ctus in the tiles above us */ + for (j = 0; j < tile_y; j++) + tso += self->ctu_width * self->partition.tile_ctu_rowsj; + + /* add the ctus inside the same tile before us */ + tso += (y - ctu_tile_height_accutile_y) * + self->partition.tile_ctu_colstile_x + + x - ctu_tile_width_accutile_x; + + g_assert (tso < self->ctu_width * self->ctu_height); + + tile_slice_address_maptso = k; + } + + for (i = 0; i < self->partition.num_slices; i++) + self->partition.slice_segment_addressi = + tile_slice_address_maptile_slice_addressi; + + g_free (tile_slice_address); + g_free (tile_slice_address_map); +} + +static void +_h265_calculate_slice_partition (GstVaH265Enc * self, gint32 slice_structure) +{ + guint ctu_size; + guint ctus_per_slice, ctus_mod_slice, cur_slice_ctus; + guint last_ctu_index; + guint i_slice; + + /* TODO: consider other slice structure modes */ + if (!(slice_structure & VA_ENC_SLICE_STRUCTURE_ARBITRARY_MACROBLOCKS) && + !(slice_structure & VA_ENC_SLICE_STRUCTURE_ARBITRARY_ROWS)) { + GST_INFO_OBJECT (self, "Driver slice structure is %x, does not support" + " ARBITRARY_MACROBLOCKS mode, fallback to no slice partition", + slice_structure); + self->partition.num_slices = 1; + } + + self->partition.slice_segment_address = + g_malloc (self->partition.num_slices * sizeof (guint32)); + self->partition.num_ctu_in_slice = + g_malloc (self->partition.num_slices * sizeof (guint32)); + + ctu_size = self->ctu_width * self->ctu_height; + + g_assert (self->partition.num_slices && + self->partition.num_slices < ctu_size); + + ctus_per_slice = ctu_size / self->partition.num_slices; + ctus_mod_slice = ctu_size % self->partition.num_slices; + last_ctu_index = 0; + + for (i_slice = 0; i_slice < self->partition.num_slices; i_slice++) { + cur_slice_ctus = ctus_per_slice; + /* Scatter the remainder to each slice */ + if (ctus_mod_slice) { + ++cur_slice_ctus; + --ctus_mod_slice; + } + + /* Align start address to the row begin */ + if (slice_structure & VA_ENC_SLICE_STRUCTURE_ARBITRARY_ROWS) { + guint ctu_width_round_factor; + + ctu_width_round_factor = + self->ctu_width - (cur_slice_ctus % self->ctu_width); + cur_slice_ctus += ctu_width_round_factor; + if ((last_ctu_index + cur_slice_ctus) > ctu_size) + cur_slice_ctus = ctu_size - last_ctu_index; + } + + self->partition.slice_segment_addressi_slice = last_ctu_index; + self->partition.num_ctu_in_slicei_slice = cur_slice_ctus; + + /* set calculation for next slice */ + last_ctu_index += cur_slice_ctus; + g_assert (last_ctu_index <= ctu_size); + } +} + +static gboolean +_h265_setup_slice_and_tile_partition (GstVaH265Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + gint32 max_slices; + gint32 slice_structure; + + /* Ensure the num_slices provided by the user not exceed the limit + * of the number of slices permitted by the stream and by the + * hardware. */ + g_assert (self->partition.num_slices >= 1); + max_slices = gst_va_encoder_get_max_slice_num (base->encoder, + base->profile, GST_VA_BASE_ENC_ENTRYPOINT (base)); + if (self->partition.num_slices > max_slices) + self->partition.num_slices = max_slices; + + /* The stream size limit. */ + if (self->partition.num_slices > + ((self->ctu_width * self->ctu_height + 1) / 2)) + self->partition.num_slices = ((self->ctu_width * self->ctu_height + 1) / 2); + + slice_structure = gst_va_encoder_get_slice_structure (base->encoder, + base->profile, GST_VA_BASE_ENC_ENTRYPOINT (base)); + + if (_is_tile_enabled (self)) { + const GstVaH265LevelLimits *level_limits; + guint i; + + if (!gst_va_encoder_has_tile (base->encoder, + base->profile, GST_VA_BASE_ENC_ENTRYPOINT (base))) { + self->partition.num_tile_cols = 1; + self->partition.num_tile_rows = 1; + } + + level_limits = NULL; + for (i = 0; i < G_N_ELEMENTS (_va_h265_level_limits); i++) { + if (_va_h265_level_limitsi.level_idc == self->level_idc) { + level_limits = &_va_h265_level_limitsi; + break; + } + } + g_assert (level_limits); + + if (self->partition.num_tile_cols > level_limits->MaxTileColumns) { + GST_INFO_OBJECT (self, "num_tile_cols:%d exceeds MaxTileColumns:%d" + " of level %s", self->partition.num_tile_cols, + level_limits->MaxTileColumns, self->level_str); + self->partition.num_tile_cols = level_limits->MaxTileColumns; + } + if (self->partition.num_tile_rows > level_limits->MaxTileRows) { + GST_INFO_OBJECT (self, "num_tile_rows:%d exceeds MaxTileRows:%d" + " of level %s", self->partition.num_tile_rows, + level_limits->MaxTileRows, self->level_str); + self->partition.num_tile_rows = level_limits->MaxTileRows; + } + + if (self->partition.num_tile_cols > self->ctu_width) { + GST_INFO_OBJECT (self, + "Only %d CTUs in width, not enough to split into %d tile columns", + self->ctu_width, self->partition.num_tile_cols); + self->partition.num_tile_cols = self->ctu_width; + } + if (self->partition.num_tile_rows > self->ctu_height) { + GST_INFO_OBJECT (self, + "Only %d CTUs in height, not enough to split into %d tile rows", + self->ctu_height, self->partition.num_tile_rows); + self->partition.num_tile_rows = self->ctu_height; + } + + /* Some driver require that the slice should not span tiles, + we need to increase slice number if needed. */ + if (gst_va_display_is_implementation (base->display, + GST_VA_IMPLEMENTATION_INTEL_IHD)) { + if (self->partition.num_slices < + self->partition.num_tile_cols * self->partition.num_tile_rows) { + if (self->partition.num_tile_cols * self->partition.num_tile_rows > + max_slices) { + GST_ERROR_OBJECT (self, "The slice can not span tiles, but total" + " tile num %d is bigger than max_slices %d", + self->partition.num_tile_cols * self->partition.num_tile_rows, + max_slices); + return FALSE; + } else { + GST_INFO_OBJECT (self, "The num_slices %d is smaller than tile" + " num %d. The slice can not span tiles, so set the num-slices" + " to tile num.", self->partition.num_slices, + self->partition.num_tile_cols * self->partition.num_tile_rows); + self->partition.num_slices = + self->partition.num_tile_cols * self->partition.num_tile_rows; + } + } + + self->partition.slice_span_tiles = FALSE; + } else { + self->partition.slice_span_tiles = TRUE; + } + + _h265_calculate_tile_partition (self); + } else { + _h265_calculate_slice_partition (self, slice_structure); + } + + update_property_uint (base, &self->prop.num_slices, + self->partition.num_slices, PROP_NUM_SLICES); + update_property_uint (base, &self->prop.num_tile_cols, + self->partition.num_tile_cols, PROP_NUM_TILE_COLS); + update_property_uint (base, &self->prop.num_tile_rows, + self->partition.num_tile_rows, PROP_NUM_TILE_ROWS); + + return TRUE; +} + +/* Normalizes bitrate (and CPB size) for HRD conformance */ +static void +_h265_calculate_bitrate_hrd (GstVaH265Enc * self) +{ + guint bitrate_bits, cpb_bits_size; + + /* Round down bitrate. This is a hard limit mandated by the user */ + g_assert (SX_BITRATE >= 6); + bitrate_bits = (self->rc.max_bitrate * 1000) & ~((1U << SX_BITRATE) - 1); + GST_DEBUG_OBJECT (self, "Max bitrate: %u bits/sec", bitrate_bits); + self->rc.max_bitrate_bits = bitrate_bits; + + bitrate_bits = (self->rc.target_bitrate * 1000) & ~((1U << SX_BITRATE) - 1); + GST_DEBUG_OBJECT (self, "Target bitrate: %u bits/sec", bitrate_bits); + self->rc.target_bitrate_bits = bitrate_bits; + + if (self->rc.cpb_size > 0 && self->rc.cpb_size < (self->rc.max_bitrate / 2)) { + GST_INFO_OBJECT (self, "Too small cpb_size: %d", self->rc.cpb_size); + self->rc.cpb_size = 0; + } + + if (self->rc.cpb_size == 0) { + /* We cache 2 second coded data by default. */ + self->rc.cpb_size = self->rc.max_bitrate * 2; + GST_INFO_OBJECT (self, "Adjust cpb_size to: %d", self->rc.cpb_size); + } + + /* Round up CPB size. This is an HRD compliance detail */ + g_assert (SX_CPB_SIZE >= 4); + cpb_bits_size = (self->rc.cpb_size * 1000) & ~((1U << SX_CPB_SIZE) - 1); + + GST_DEBUG_OBJECT (self, "HRD CPB size: %u bits", cpb_bits_size); + self->rc.cpb_length_bits = cpb_bits_size; +} + +/* Estimates a good enough bitrate if none was supplied */ +static gboolean +_h265_ensure_rate_control (GstVaH265Enc * self) +{ + /* User can specify the properties of: "bitrate", "target-percentage", + * "max-qp", "min-qp", "qpi", "qpp", "qpb", "mbbrc", "cpb-size", + * "rate-control" and "target-usage" to control the RC behavior. + * + * "target-usage" is different from the others, it controls the encoding + * speed and quality, while the others control encoding bit rate and + * quality. The lower value has better quality(maybe bigger MV search + * range) but slower speed, the higher value has faster speed but lower + * quality. + * + * The possible composition to control the bit rate and quality: + * + * 1. CQP mode: "rate-control=cqp", then "qpi", "qpp" and "qpb" + * specify the QP of I/P/B frames respectively(within the + * "max-qp" and "min-qp" range). The QP will not change during + * the whole stream. Other properties are ignored. + * + * 2. CBR mode: "rate-control=CBR", then the "bitrate" specify the + * target bit rate and the "cpb-size" specifies the max coded + * picture buffer size to avoid overflow. If the "bitrate" is not + * set, it is calculated by the picture resolution and frame + * rate. If "cpb-size" is not set, it is set to the size of + * caching 2 second coded data. Encoder will try its best to make + * the QP with in the "max-qp", "min-qp" range. "mbbrc" can + * enable bit rate control in macro block level. Other paramters + * are ignored. + * + * 3. VBR mode: "rate-control=VBR", then the "bitrate" specify the + * target bit rate, "target-percentage" is used to calculate the + * max bit rate of VBR mode by ("bitrate" * 100) / + * "target-percentage". It is also used by driver to calculate + * the min bit rate. The "cpb-size" specifies the max coded + * picture buffer size to avoid overflow. If the "bitrate" is not + * set, the target bit rate will be calculated by the picture + * resolution and frame rate. Encoder will try its best to make + * the QP with in the "max-qp", "min-qp" range. "mbbrc" can + * enable bit rate control in macro block level. Other paramters + * are ignored. + * + * 4. VCM mode: "rate-control=VCM", then the "bitrate" specify the + * target bit rate, and encoder will try its best to make the QP + * with in the "max-qp", "min-qp" range. Other paramters are + * ignored. + */ + + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint bitrate; + guint32 rc_mode, quality_level, rc_ctrl; + + quality_level = gst_va_encoder_get_quality_level (base->encoder, + base->profile, GST_VA_BASE_ENC_ENTRYPOINT (base)); + if (self->rc.target_usage > quality_level) { + GST_INFO_OBJECT (self, "User setting target-usage: %d is not supported, " + "fallback to %d", self->rc.target_usage, quality_level); + self->rc.target_usage = quality_level; + update_property_uint (base, &self->prop.target_usage, + self->rc.target_usage, PROP_TARGET_USAGE); + } + + GST_OBJECT_LOCK (self); + rc_ctrl = self->prop.rc_ctrl; + GST_OBJECT_UNLOCK (self); + + if (rc_ctrl != VA_RC_NONE) { + rc_mode = gst_va_encoder_get_rate_control_mode (base->encoder, + base->profile, GST_VA_BASE_ENC_ENTRYPOINT (base)); + if (!(rc_mode & rc_ctrl)) { + guint32 defval = + G_PARAM_SPEC_ENUM (propertiesPROP_RATE_CONTROL)->default_value; + GST_INFO_OBJECT (self, "The rate control mode %s is not supported, " + "fallback to %s mode", _rate_control_get_name (rc_ctrl), + _rate_control_get_name (defval)); + self->rc.rc_ctrl_mode = defval; + update_property_uint (base, &self->prop.rc_ctrl, + self->rc.rc_ctrl_mode, PROP_RATE_CONTROL); + } + } else { + self->rc.rc_ctrl_mode = VA_RC_NONE; + } + + if (self->rc.min_qp > self->rc.max_qp) { + GST_INFO_OBJECT (self, "The min_qp %d is bigger than the max_qp %d, " + "set it to the max_qp", self->rc.min_qp, self->rc.max_qp); + self->rc.min_qp = self->rc.max_qp; + + update_property_uint (base, &self->prop.min_qp, self->rc.min_qp, + PROP_MIN_QP); + } + + /* Make all the qp in the valid range */ + if (self->rc.qp_i < self->rc.min_qp) { + if (self->rc.qp_i != 26) + GST_INFO_OBJECT (self, "The qp_i %d is smaller than the min_qp %d, " + "set it to the min_qp", self->rc.qp_i, self->rc.min_qp); + self->rc.qp_i = self->rc.min_qp; + } + if (self->rc.qp_i > self->rc.max_qp) { + if (self->rc.qp_i != 26) + GST_INFO_OBJECT (self, "The qp_i %d is bigger than the max_qp %d, " + "set it to the max_qp", self->rc.qp_i, self->rc.max_qp); + self->rc.qp_i = self->rc.max_qp; + } + + if (self->rc.qp_p < self->rc.min_qp) { + if (self->rc.qp_p != 26) + GST_INFO_OBJECT (self, "The qp_p %d is smaller than the min_qp %d, " + "set it to the min_qp", self->rc.qp_p, self->rc.min_qp); + self->rc.qp_p = self->rc.min_qp; + } + if (self->rc.qp_p > self->rc.max_qp) { + if (self->rc.qp_p != 26) + GST_INFO_OBJECT (self, "The qp_p %d is bigger than the max_qp %d, " + "set it to the max_qp", self->rc.qp_p, self->rc.max_qp); + self->rc.qp_p = self->rc.max_qp; + } + + if (self->rc.qp_b < self->rc.min_qp) { + if (self->rc.qp_b != 26) + GST_INFO_OBJECT (self, "The qp_b %d is smaller than the min_qp %d, " + "set it to the min_qp", self->rc.qp_b, self->rc.min_qp); + self->rc.qp_b = self->rc.min_qp; + } + if (self->rc.qp_b > self->rc.max_qp) { + if (self->rc.qp_b != 26) + GST_INFO_OBJECT (self, "The qp_b %d is bigger than the max_qp %d, " + "set it to the max_qp", self->rc.qp_b, self->rc.max_qp); + self->rc.qp_b = self->rc.max_qp; + } + + GST_OBJECT_LOCK (self); + bitrate = self->prop.bitrate; + GST_OBJECT_UNLOCK (self); + + /* Calculate a bitrate is not set. */ + if ((self->rc.rc_ctrl_mode == VA_RC_CBR || self->rc.rc_ctrl_mode == VA_RC_VBR + || self->rc.rc_ctrl_mode == VA_RC_VCM) && bitrate == 0) { + /* FIXME: Provide better estimation. */ + /* Choose the max value of all levels' MinCr which is 8, and x2 for + conservative calculation. So just using a 1/16 compression ratio, + and the bits per pixel for YUV420, YUV422, YUV444, accordingly. */ + guint64 factor; + guint depth = 8, chrome = 1; + guint bits_per_pix; + + if (!_h265_get_rtformat (self, + GST_VIDEO_INFO_FORMAT (&base->input_state->info), &depth, &chrome)) + g_assert_not_reached (); + + if (chrome == 3) { + bits_per_pix = 24; + } else if (chrome == 2) { + bits_per_pix = 16; + } else { + bits_per_pix = 12; + } + bits_per_pix = bits_per_pix + bits_per_pix * (depth - 8) / 8; + + factor = (guint64) self->luma_width * self->luma_height * bits_per_pix / 16; + bitrate = gst_util_uint64_scale (factor, + GST_VIDEO_INFO_FPS_N (&base->input_state->info), + GST_VIDEO_INFO_FPS_D (&base->input_state->info)) / 1000; + + GST_INFO_OBJECT (self, "target bitrate computed to %u kbps", bitrate); + + self->prop.bitrate = bitrate; + g_object_notify_by_pspec (G_OBJECT (self), propertiesPROP_BITRATE); + } + + /* Adjust the setting based on RC mode. */ + switch (self->rc.rc_ctrl_mode) { + case VA_RC_NONE: + case VA_RC_CQP: + self->rc.max_bitrate = 0; + self->rc.target_bitrate = 0; + self->rc.target_percentage = 0; + self->rc.cpb_size = 0; + break; + case VA_RC_CBR: + self->rc.max_bitrate = bitrate; + self->rc.target_bitrate = bitrate; + self->rc.target_percentage = 100; + self->rc.qp_i = self->rc.qp_p = self->rc.qp_b = 26; + break; + case VA_RC_VBR: + g_assert (self->rc.target_percentage >= 10); + self->rc.max_bitrate = (guint) gst_util_uint64_scale_int (bitrate, + 100, self->rc.target_percentage); + self->rc.target_bitrate = bitrate; + self->rc.qp_i = self->rc.qp_p = self->rc.qp_b = 26; + break; + case VA_RC_VCM: + self->rc.max_bitrate = bitrate; + self->rc.target_bitrate = bitrate; + self->rc.target_percentage = 0; + self->rc.qp_i = self->rc.qp_p = self->rc.qp_b = 26; + self->rc.cpb_size = 0; + + if (self->gop.num_bframes > 0) { + GST_INFO_OBJECT (self, "VCM mode just support I/P mode, no B frame"); + self->gop.num_bframes = 0; + self->gop.b_pyramid = FALSE; + } + break; + default: + GST_WARNING_OBJECT (self, "Unsupported rate control"); + return FALSE; + break; + } + + GST_DEBUG_OBJECT (self, "Max bitrate: %u bits/sec, " + "Target bitrate: %u bits/sec", self->rc.max_bitrate, + self->rc.target_bitrate); + + if (self->rc.rc_ctrl_mode != VA_RC_NONE && self->rc.rc_ctrl_mode != VA_RC_CQP) + _h265_calculate_bitrate_hrd (self); + + /* notifications */ + update_property_uint (base, &self->prop.min_qp, self->rc.min_qp, PROP_MIN_QP); + update_property_uint (base, &self->prop.cpb_size, + self->rc.cpb_size, PROP_CPB_SIZE); + update_property_uint (base, &self->prop.target_percentage, + self->rc.target_percentage, PROP_TARGET_PERCENTAGE); + update_property_uint (base, &self->prop.qp_i, self->rc.qp_i, PROP_QP_I); + update_property_uint (base, &self->prop.qp_p, self->rc.qp_p, PROP_QP_P); + update_property_uint (base, &self->prop.qp_b, self->rc.qp_b, PROP_QP_B); + + return TRUE; +} + +/* Derives the level and tier from the currently set limits */ +static gboolean +_h265_calculate_tier_level (GstVaH265Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint i, PicSizeInSamplesY, LumaSr; + guint32 tier_max_bitrate; + + PicSizeInSamplesY = self->luma_width * self->luma_height; + LumaSr = gst_util_uint64_scale_int_ceil (PicSizeInSamplesY, + GST_VIDEO_INFO_FPS_N (&base->input_state->info), + GST_VIDEO_INFO_FPS_D (&base->input_state->info)); + + for (i = 0; i < G_N_ELEMENTS (_va_h265_level_limits); i++) { + const GstVaH265LevelLimits *const limits = &_va_h265_level_limitsi; + + /* Choose level by luma picture size and luma sample rate */ + if (PicSizeInSamplesY <= limits->MaxLumaPs && LumaSr <= limits->MaxLumaSr) + break; + } + + if (i == G_N_ELEMENTS (_va_h265_level_limits)) + goto error_unsupported_level; + + self->level_idc = _va_h265_level_limitsi.level_idc; + self->level_str = _va_h265_level_limitsi.level_name; + self->min_cr = _va_h265_level_limitsi.MinCr; + + if (self->rc.rc_ctrl_mode == VA_RC_CQP) { + g_assert (self->rc.max_bitrate == 0); + + /* We may need to calculate some max bit rate for CQP mode. + Just set the main tier now. */ + self->tier_flag = FALSE; + } else { + if (_va_h265_level_limitsi.MaxBRTierHigh == 0 || + self->rc.max_bitrate <= _va_h265_level_limitsi.MaxBRTierMain) { + self->tier_flag = FALSE; + } else { + self->tier_flag = TRUE; + } + } + + tier_max_bitrate = self->tier_flag ? _va_h265_level_limitsi.MaxBRTierHigh : + _va_h265_level_limitsi.MaxBRTierMain; + + if (self->rc.max_bitrate > tier_max_bitrate) { + GST_INFO_OBJECT (self, "The max bitrate of the stream is %u kbps, still" + " larger than %s profile %s level %s tier's max bit rate %d kbps", + self->rc.max_bitrate, gst_va_profile_name (base->profile), + _va_h265_level_limitsi.level_name, + (self->tier_flag ? "high" : "main"), tier_max_bitrate); + } + + GST_DEBUG_OBJECT (self, "profile: %s, level: %s, tier :%s, MinCr: %d", + gst_va_profile_name (base->profile), _va_h265_level_limitsi.level_name, + (self->tier_flag ? "high" : "main"), self->min_cr); + + return TRUE; + +error_unsupported_level: + { + GST_ERROR_OBJECT (self, + "failed to find a suitable level matching codec config"); + return FALSE; + } +} + +struct PyramidInfo +{ + guint level; + gint left_ref_poc_diff; + gint right_ref_poc_diff; +}; + +static void +_set_pyramid_info (struct PyramidInfo *info, guint len, + guint current_level, guint highest_level) +{ + guint index; + + g_assert (len >= 1); + + if (current_level == highest_level || len == 1) { + for (index = 0; index < len; index++) { + infoindex.level = current_level; + infoindex.left_ref_poc_diff = -(index + 1); + infoindex.right_ref_poc_diff = len - index; + } + + return; + } + + index = len / 2; + infoindex.level = current_level; + infoindex.left_ref_poc_diff = -(index + 1); + infoindex.right_ref_poc_diff = len - index; + + current_level++; + + if (index > 0) + _set_pyramid_info (info, index, current_level, highest_level); + + if (index + 1 < len) + _set_pyramid_info (&infoindex + 1, len - (index + 1), + current_level, highest_level); +} + +static void +_h265_create_gop_frame_types (GstVaH265Enc * self) +{ + guint i; + guint i_frames = self->gop.num_iframes; + struct PyramidInfo pyramid_info31 = { 0, }; + + if (self->gop.highest_pyramid_level > 0) { + g_assert (self->gop.num_bframes > 0); + _set_pyramid_info (pyramid_info, self->gop.num_bframes, + 0, self->gop.highest_pyramid_level); + } + + g_assert (self->gop.idr_period <= MAX_GOP_SIZE); + for (i = 0; i < self->gop.idr_period; i++) { + if (i == 0) { + self->gop.frame_typesi.slice_type = GST_H265_I_SLICE; + self->gop.frame_typesi.is_ref = TRUE; + continue; + } + + /* Intra only stream. */ + if (self->gop.ip_period == 0) { + self->gop.frame_typesi.slice_type = GST_H265_I_SLICE; + self->gop.frame_typesi.is_ref = FALSE; + continue; + } + + if (i % self->gop.ip_period) { + guint pyramid_index = + i % self->gop.ip_period - 1 /* The first P or IDR */ ; + + self->gop.frame_typesi.slice_type = GST_H265_B_SLICE; + self->gop.frame_typesi.pyramid_level = + pyramid_infopyramid_index.level; + self->gop.frame_typesi.is_ref = + (self->gop.frame_typesi.pyramid_level < + self->gop.highest_pyramid_level); + self->gop.frame_typesi.left_ref_poc_diff = + pyramid_infopyramid_index.left_ref_poc_diff; + self->gop.frame_typesi.right_ref_poc_diff = + pyramid_infopyramid_index.right_ref_poc_diff; + continue; + } + + if (self->gop.i_period && i % self->gop.i_period == 0 && i_frames > 0) { + /* Replace P with I. */ + self->gop.frame_typesi.slice_type = GST_H265_I_SLICE; + self->gop.frame_typesi.is_ref = TRUE; + i_frames--; + continue; + } + + self->gop.frame_typesi.slice_type = GST_H265_P_SLICE; + self->gop.frame_typesi.is_ref = TRUE; + } + + /* Force the last one to be a P */ + if (self->gop.idr_period > 1 && self->gop.ip_period > 0) { + self->gop.frame_typesself->gop.idr_period - 1.slice_type = + GST_H265_P_SLICE; + self->gop.frame_typesself->gop.idr_period - 1.is_ref = TRUE; + } +} + +static void +_h265_print_gop_structure (GstVaH265Enc * self) +{ +#ifndef GST_DISABLE_GST_DEBUG + GString *str; + gint i; + + if (gst_debug_category_get_threshold (GST_CAT_DEFAULT) < GST_LEVEL_INFO) + return; + + str = g_string_new (NULL); + + g_string_append_printf (str, " "); + + for (i = 0; i < self->gop.idr_period; i++) { + if (i == 0) { + g_string_append_printf (str, "IDR"); + continue; + } else { + g_string_append_printf (str, ", "); + } + + if (self->gop.low_delay_b_mode && + self->gop.frame_typesi.slice_type == GST_H265_P_SLICE) { + g_string_append_printf (str, "%s", "LDB"); + } else { + g_string_append_printf (str, "%s", + _h265_slice_type_name (self->gop.frame_typesi.slice_type)); + } + + if (self->gop.b_pyramid + && self->gop.frame_typesi.slice_type == GST_H265_B_SLICE) { + g_string_append_printf (str, "<L%d (%d, %d)>", + self->gop.frame_typesi.pyramid_level, + self->gop.frame_typesi.left_ref_poc_diff, + self->gop.frame_typesi.right_ref_poc_diff); + } + + if (self->gop.frame_typesi.is_ref) { + g_string_append_printf (str, "(ref)"); + } + + } + + g_string_append_printf (str, " "); + + GST_INFO_OBJECT (self, "GOP size: %d, forward reference %d, backward" + " reference %d, GOP structure: %s", self->gop.idr_period, + self->gop.forward_ref_num, self->gop.backward_ref_num, str->str); + + g_string_free (str, TRUE); +#endif +} + +static void +_h265_calculate_coded_size (GstVaH265Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint codedbuf_size = 0; + guint chrome, depth; + + if (!_h265_get_rtformat (self, + GST_VIDEO_INFO_FORMAT (&base->input_state->info), &depth, &chrome)) + g_assert_not_reached (); + + switch (chrome) { + case 0: + /* 4:0:0 */ + case 1: + /* 4:2:0 */ + codedbuf_size = (self->luma_width * self->luma_height * 3 / 2); + break; + case 2: + /* 4:2:2 */ + codedbuf_size = (self->luma_width * self->luma_height * 2); + break; + case 3: + /* 4:4:4 */ + codedbuf_size = (self->luma_width * self->luma_height * 3); + break; + default: + g_assert_not_reached (); + break; + } + + codedbuf_size = codedbuf_size + (codedbuf_size * (depth - 8) / 8); + codedbuf_size = codedbuf_size / (self->min_cr / 2 /* For safety */ ); + + /* FIXME: Using only a rough approximation for bitstream headers. + * Not taken into account: ScalingList, RefPicListModification, + * PredWeightTable, which is not used now. */ + /* Calculate the maximum sizes for common headers (in bits) */ + + /* Account for VPS header */ + codedbuf_size += 4 /* start code */ + GST_ROUND_UP_8 (MAX_VPS_HDR_SIZE + + MAX_PROFILE_TIER_LEVEL_SIZE + MAX_HRD_PARAMS_SIZE) / 8; + + /* Account for SPS header */ + codedbuf_size += 4 + GST_ROUND_UP_8 (MAX_SPS_HDR_SIZE + + MAX_PROFILE_TIER_LEVEL_SIZE + 64 * MAX_SHORT_TERM_REFPICSET_SIZE + + MAX_VUI_PARAMS_SIZE + MAX_HRD_PARAMS_SIZE) / 8; + + /* Account for PPS header */ + codedbuf_size += 4 + GST_ROUND_UP_8 (MAX_PPS_HDR_SIZE) / 8; + + /* Account for slice header */ + codedbuf_size += self->partition.num_slices * (4 + + GST_ROUND_UP_8 (MAX_SLICE_HDR_SIZE + MAX_SHORT_TERM_REFPICSET_SIZE) / 8); + + base->codedbuf_size = codedbuf_size; + GST_INFO_OBJECT (self, "Calculate codedbuf size: %u", base->codedbuf_size); +} + +/* Get log2_max_frame_num_minus4, log2_max_pic_order_cnt_lsb_minus4 + * value, shall be in the range of 0 to 12, inclusive. */ +static guint +_get_log2_max_num (guint num) +{ + guint ret = 0; + + while (num) { + ++ret; + num >>= 1; + } + + /* shall be in the range of 0+4 to 12+4, inclusive. */ + if (ret < 4) { + ret = 4; + } else if (ret > 16) { + ret = 16; + } + return ret; +} + +/* Consider the idr_period, num_bframes, L0/L1 reference number. + * TODO: Load some preset fixed GOP structure. + * TODO: Skip this if in lookahead mode. */ +static gboolean +_h265_generate_gop_structure (GstVaH265Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint32 log2_max_frame_num; + guint32 list0, list1, forward_num, backward_num, gop_ref_num; + gint32 p_frames; + guint32 prediction_direction; + + /* If not set, generate a idr every second */ + if (self->gop.idr_period == 0) { + self->gop.idr_period = (GST_VIDEO_INFO_FPS_N (&base->input_state->info) + + GST_VIDEO_INFO_FPS_D (&base->input_state->info) - 1) / + GST_VIDEO_INFO_FPS_D (&base->input_state->info); + } + + /* Do not use a too huge GOP size. */ + if (self->gop.idr_period > 1024) { + self->gop.idr_period = 1024; + GST_INFO_OBJECT (self, "Lowering the GOP size to %d", self->gop.idr_period); + } + + update_property_uint (base, &self->prop.key_int_max, self->gop.idr_period, + PROP_KEY_INT_MAX); + + /* Prefer have more than 1 refs for the GOP which is not very small. */ + if (self->gop.idr_period > 8) { + if (self->gop.num_bframes > (self->gop.idr_period - 1) / 2) { + self->gop.num_bframes = (self->gop.idr_period - 1) / 2; + GST_INFO_OBJECT (self, "Lowering the number of num_bframes to %d", + self->gop.num_bframes); + } + } else { + /* beign and end should be ref */ + if (self->gop.num_bframes > self->gop.idr_period - 1 - 1) { + if (self->gop.idr_period > 1) { + self->gop.num_bframes = self->gop.idr_period - 1 - 1; + } else { + self->gop.num_bframes = 0; + } + GST_INFO_OBJECT (self, "Lowering the number of num_bframes to %d", + self->gop.num_bframes); + } + } + + if (!gst_va_encoder_get_max_num_reference (base->encoder, base->profile, + GST_VA_BASE_ENC_ENTRYPOINT (base), &list0, &list1)) { + GST_INFO_OBJECT (self, "Failed to get the max num reference"); + list0 = 1; + list1 = 0; + } + self->gop.max_l0_num = list0; + self->gop.max_l1_num = list1; + GST_DEBUG_OBJECT (self, "list0 num: %d, list1 num: %d", + self->gop.max_l0_num, self->gop.max_l1_num); + + forward_num = list0; + backward_num = list1; + + prediction_direction = gst_va_encoder_get_prediction_direction (base->encoder, + base->profile, GST_VA_BASE_ENC_ENTRYPOINT (base)); + if (prediction_direction) { +#if VA_CHECK_VERSION(1,9,0) + if (!(prediction_direction & VA_PREDICTION_DIRECTION_PREVIOUS)) { + GST_INFO_OBJECT (self, "No forward prediction support"); + forward_num = 0; + /* Only backward ref is insane. */ + backward_num = 0; + } + + if (!(prediction_direction & VA_PREDICTION_DIRECTION_FUTURE)) { + GST_INFO_OBJECT (self, "No backward prediction support"); + backward_num = 0; + } + + if (prediction_direction & VA_PREDICTION_DIRECTION_BI_NOT_EMPTY) { + if (self->gop.max_l1_num == 0) { + GST_INFO_OBJECT (self, "Not possible to support " + "VA_PREDICTION_DIRECTION_BI_NOT_EMPTY while list1 is 0"); + return FALSE; + } + GST_INFO_OBJECT (self, "Enable low-delay-b mode"); + self->gop.low_delay_b_mode = TRUE; + } +#endif + } + + if (forward_num > self->gop.num_ref_frames) + forward_num = self->gop.num_ref_frames; + if (backward_num > self->gop.num_ref_frames) + backward_num = self->gop.num_ref_frames; + + if (forward_num == 0) { + GST_INFO_OBJECT (self, + "No reference support, fallback to intra only stream"); + + /* It does not make sense that if only the list1 exists. */ + self->gop.num_ref_frames = 0; + + self->gop.ip_period = 0; + self->gop.num_bframes = 0; + self->gop.b_pyramid = FALSE; + self->gop.highest_pyramid_level = 0; + self->gop.num_iframes = self->gop.idr_period - 1 /* The idr */ ; + self->gop.forward_ref_num = 0; + self->gop.backward_ref_num = 0; + goto create_poc; + } + + if (self->gop.num_ref_frames <= 1) { + GST_INFO_OBJECT (self, "The number of reference frames is only %d," + " no B frame allowed, fallback to I/P mode", self->gop.num_ref_frames); + self->gop.num_bframes = 0; + backward_num = 0; + } + + /* b_pyramid needs at least 1 ref for B, besides the I/P */ + if (self->gop.b_pyramid && self->gop.num_ref_frames <= 2) { + GST_INFO_OBJECT (self, "The number of reference frames is only %d," + " not enough for b_pyramid", self->gop.num_ref_frames); + self->gop.b_pyramid = FALSE; + } + + if (backward_num == 0 && self->gop.num_bframes > 0) { + GST_INFO_OBJECT (self, + "No hw reference support for list 1, fallback to I/P mode"); + self->gop.num_bframes = 0; + self->gop.b_pyramid = FALSE; + } + + /* I/P mode, no list1 needed. */ + if (self->gop.num_bframes == 0) + backward_num = 0; + + /* Not enough B frame, no need for b_pyramid. */ + if (self->gop.num_bframes <= 1) + self->gop.b_pyramid = FALSE; + + if (self->gop.num_ref_frames > forward_num + backward_num) { + self->gop.num_ref_frames = forward_num + backward_num; + GST_INFO_OBJECT (self, "HW limits, lowering the number of reference" + " frames to %d", self->gop.num_ref_frames); + } + self->gop.num_ref_frames = MIN (self->gop.num_ref_frames, 15); + + /* How many possible refs within a GOP. */ + gop_ref_num = (self->gop.idr_period + self->gop.num_bframes) / + (self->gop.num_bframes + 1); + /* The end ref */ + if (self->gop.num_bframes > 0 + /* frame_num % (self->gop.num_bframes + 1) happens to be the end P */ + && (self->gop.idr_period % (self->gop.num_bframes + 1) != 1)) + gop_ref_num++; + + /* Adjust reference num based on B frames and B pyramid. */ + if (self->gop.num_bframes == 0) { + self->gop.b_pyramid = FALSE; + self->gop.forward_ref_num = self->gop.num_ref_frames; + self->gop.backward_ref_num = 0; + } else if (self->gop.b_pyramid) { + guint b_frames = self->gop.num_bframes; + guint b_refs; + + /* set b pyramid one backward ref. */ + self->gop.backward_ref_num = 1; + self->gop.forward_ref_num = + self->gop.num_ref_frames - self->gop.backward_ref_num; + if (self->gop.forward_ref_num > forward_num) + self->gop.forward_ref_num = forward_num; + + /* Balance the forward and backward refs */ + if ((self->gop.forward_ref_num > self->gop.backward_ref_num * 3) + && backward_num > 1) { + self->gop.backward_ref_num++; + + self->gop.forward_ref_num = + self->gop.num_ref_frames - self->gop.backward_ref_num; + if (self->gop.forward_ref_num > forward_num) + self->gop.forward_ref_num = forward_num; + } + + b_frames = b_frames / 2; + b_refs = 0; + while (b_frames) { + /* At least 1 B ref for each level, plus begin and end 2 P/I */ + b_refs += 1; + if (b_refs + 2 > self->gop.num_ref_frames) + break; + + self->gop.highest_pyramid_level++; + b_frames = b_frames / 2; + } + + GST_INFO_OBJECT (self, "pyramid level is %d", + self->gop.highest_pyramid_level); + } else { + /* We prefer list0. Backward refs have more latency. */ + self->gop.backward_ref_num = 1; + self->gop.forward_ref_num = + self->gop.num_ref_frames - self->gop.backward_ref_num; + /* Balance the forward and backward refs, but not cause a big latency. */ + while ((self->gop.num_bframes * self->gop.backward_ref_num <= 16) + && (self->gop.backward_ref_num <= gop_ref_num) + && (self->gop.backward_ref_num < backward_num) + && (self->gop.forward_ref_num / self->gop.backward_ref_num > 4)) { + self->gop.forward_ref_num--; + self->gop.backward_ref_num++; + } + + if (self->gop.forward_ref_num > forward_num) + self->gop.forward_ref_num = forward_num; + } + + /* It's OK, keep slots for GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME frame. */ + if (self->gop.forward_ref_num > gop_ref_num) + GST_DEBUG_OBJECT (self, "num_ref_frames %d is bigger than gop_ref_num %d", + self->gop.forward_ref_num, gop_ref_num); + + /* Include the ref picture itself. */ + self->gop.ip_period = 1 + self->gop.num_bframes; + + p_frames = gop_ref_num - 1 /* IDR */ ; + if (p_frames < 0) + p_frames = 0; + if (self->gop.num_iframes > p_frames) { + self->gop.num_iframes = p_frames; + GST_INFO_OBJECT (self, "Too many I frames insertion, lowering it to %d", + self->gop.num_iframes); + } + + if (self->gop.num_iframes > 0) { + guint total_i_frames = self->gop.num_iframes + 1 /* IDR */ ; + self->gop.i_period = + (gop_ref_num / total_i_frames) * (self->gop.num_bframes + 1); + } + +create_poc: + /* init max_frame_num, max_poc */ + log2_max_frame_num = _get_log2_max_num (self->gop.idr_period); + self->gop.log2_max_pic_order_cnt = log2_max_frame_num; + self->gop.max_pic_order_cnt = 1 << self->gop.log2_max_pic_order_cnt; + self->gop.num_reorder_frames = self->gop.b_pyramid ? + self->gop.highest_pyramid_level * 2 + 1 /* the last P frame. */ : + self->gop.backward_ref_num; + /* Should not exceed the max ref num. */ + self->gop.num_reorder_frames = + MIN (self->gop.num_reorder_frames, self->gop.num_ref_frames); + self->gop.num_reorder_frames = MIN (self->gop.num_reorder_frames, 16); + self->gop.max_dpb_size = self->gop.num_ref_frames + 1; + + _h265_create_gop_frame_types (self); + _h265_print_gop_structure (self); + + /* notifications */ + update_property_uint (base, &self->prop.num_ref_frames, + self->gop.num_ref_frames, PROP_NUM_REF_FRAMES); + update_property_uint (base, &self->prop.num_iframes, + self->gop.num_iframes, PROP_IFRAMES); + update_property_uint (base, &self->prop.num_bframes, + self->gop.num_bframes, PROP_BFRAMES); + update_property_bool (base, &self->prop.b_pyramid, + self->gop.b_pyramid, PROP_B_PYRAMID); + + return TRUE; +} + +static gboolean +_h265_init_packed_headers (GstVaH265Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + guint32 packed_headers; + guint32 desired_packed_headers = VA_ENC_PACKED_HEADER_SEQUENCE /* SPS */ + | VA_ENC_PACKED_HEADER_PICTURE /* PPS */ + | VA_ENC_PACKED_HEADER_SLICE /* Slice headers */ + | VA_ENC_PACKED_HEADER_RAW_DATA; /* SEI, AUD, etc. */ + + self->packed_headers = 0; + + if (!gst_va_encoder_get_packed_headers (base->encoder, base->profile, + GST_VA_BASE_ENC_ENTRYPOINT (base), &packed_headers)) + return FALSE; + + if (desired_packed_headers & ~packed_headers) { + GST_INFO_OBJECT (self, "Driver does not support some wanted packed headers " + "(wanted %#x, found %#x)", desired_packed_headers, packed_headers); + } + + self->packed_headers = desired_packed_headers & packed_headers; + + return TRUE; +} + +static guint +_get_chroma_format_idc (guint va_chroma) +{ + guint chroma_format_idc; + + switch (va_chroma) { + case VA_RT_FORMAT_YUV400: + chroma_format_idc = 0; + break; + case VA_RT_FORMAT_YUV420: + case VA_RT_FORMAT_YUV420_10: + case VA_RT_FORMAT_YUV420_12: + chroma_format_idc = 1; + break; + case VA_RT_FORMAT_YUV422: + case VA_RT_FORMAT_YUV422_10: + case VA_RT_FORMAT_YUV422_12: + chroma_format_idc = 2; + break; + case VA_RT_FORMAT_YUV444: + case VA_RT_FORMAT_YUV444_10: + case VA_RT_FORMAT_YUV444_12: + chroma_format_idc = 3; + break; + default: + GST_WARNING ("unsupported VA chroma value"); + chroma_format_idc = 1; + break; + } + + return chroma_format_idc; +} + +static void +_h265_init_mvp (GstVaH265Enc * self, gboolean enable) +{ + if (enable) { + /* For the simplicity, we only let MVP refer to List00, + which is the last ref frame before the current frame. */ + self->features.temporal_mvp_enabled_flag = TRUE; + self->features.collocated_from_l0_flag = TRUE; + self->features.collocated_ref_idx = 0; + } else { + self->features.temporal_mvp_enabled_flag = FALSE; + self->features.collocated_from_l0_flag = FALSE; + self->features.collocated_ref_idx = 0xff; + } +} + +/* We need to decide the profile and entrypoint before call this. + It applies the optimized features provided by the va driver. */ +static void +_h265_setup_encoding_features (GstVaH265Enc * self) +{ + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + +#if VA_CHECK_VERSION(1, 13, 0) + VAConfigAttribValEncHEVCFeatures features; + VAStatus status; + VAConfigAttrib attrib = {.type = VAConfigAttribEncHEVCFeatures }; + + status = vaGetConfigAttributes (gst_va_display_get_va_dpy (base->display), + base->profile, GST_VA_BASE_ENC_ENTRYPOINT (base), &attrib, 1); + if (status != VA_STATUS_SUCCESS) { + GST_INFO_OBJECT (self, "Failed to query encoding features: %s", + vaErrorStr (status)); + goto default_options; + } + + if (attrib.value == VA_ATTRIB_NOT_SUPPORTED) { + GST_INFO_OBJECT (self, "Driver does not support query encoding features"); + goto default_options; + } + + features.value = attrib.value; + + /* We do not enable this no matter what the driver say. */ + self->features.separate_colour_plane_flag = FALSE; + self->features.colour_plane_id = 0; + + /* We do not enable scaling_list now. */ + self->features.scaling_list_enabled_flag = FALSE; + self->features.scaling_list_data_present_flag = FALSE; + + self->features.amp_enabled_flag = (features.bits.amp != 0); + + self->features.sample_adaptive_offset_enabled_flag = (features.bits.sao != 0); + self->features.slice_sao_luma_flag = (features.bits.sao != 0); + self->features.slice_sao_chroma_flag = (features.bits.sao != 0); + + self->features.pcm_enabled_flag = (features.bits.pcm != 0); + if (!self->features.pcm_enabled_flag) { + self->features.pcm_sample_bit_depth_luma_minus1 = 0; + self->features.pcm_sample_bit_depth_chroma_minus1 = 0; + self->features.log2_min_pcm_luma_coding_block_size_minus3 = 0; + self->features.log2_max_pcm_luma_coding_block_size_minus3 = 0; + } else { + self->features.pcm_sample_bit_depth_luma_minus1 = + self->bits_depth_luma_minus8 + 8 - 1; + self->features.pcm_sample_bit_depth_chroma_minus1 = + self->bits_depth_chroma_minus8 + 8 - 1; + /* log2_min_pcm_luma_coding_block_size_minus3 and + log2_diff_max_min_pcm_luma_coding_block_size set + in coding_block_size */ + } + self->features.pcm_loop_filter_disabled_flag = FALSE; + + _h265_init_mvp (self, features.bits.temporal_mvp != 0); + + self->features.strong_intra_smoothing_enabled_flag = + (features.bits.strong_intra_smoothing != 0); + + /* TODO: dependent slice */ + self->features.dependent_slice_segment_flag = FALSE; + + self->features.sign_data_hiding_enabled_flag = + (features.bits.sign_data_hiding != 0); + + self->features.constrained_intra_pred_flag = + (features.bits.constrained_intra_pred != 0); + + self->features.transform_skip_enabled_flag = + (features.bits.transform_skip != 0); + + self->features.cu_qp_delta_enabled_flag = + (self->rc.rc_ctrl_mode != VA_RC_CQP); + self->features.diff_cu_qp_delta_depth = features.bits.cu_qp_delta; + + /* TODO: use weighted pred */ + self->features.weighted_pred_flag = FALSE; + self->features.weighted_bipred_flag = FALSE; + + self->features.transquant_bypass_enabled_flag = + (features.bits.transquant_bypass != 0); + goto print_options; + +default_options: +#endif + + GST_DEBUG_OBJECT (self, "Apply default setting for features"); + + self->features.separate_colour_plane_flag = FALSE; + self->features.colour_plane_id = 0; + self->features.scaling_list_enabled_flag = FALSE; + self->features.scaling_list_data_present_flag = FALSE; + self->features.amp_enabled_flag = TRUE; + self->features.sample_adaptive_offset_enabled_flag = FALSE; + self->features.slice_sao_luma_flag = FALSE; + self->features.slice_sao_chroma_flag = FALSE; + self->features.pcm_enabled_flag = 0; + self->features.pcm_sample_bit_depth_luma_minus1 = 0; + self->features.pcm_sample_bit_depth_chroma_minus1 = 0; + self->features.log2_min_pcm_luma_coding_block_size_minus3 = 0; + self->features.log2_max_pcm_luma_coding_block_size_minus3 = 0; + self->features.pcm_loop_filter_disabled_flag = FALSE; + _h265_init_mvp (self, TRUE); + self->features.strong_intra_smoothing_enabled_flag = TRUE; + self->features.dependent_slice_segment_flag = FALSE; + self->features.sign_data_hiding_enabled_flag = FALSE; + self->features.constrained_intra_pred_flag = FALSE; + self->features.transform_skip_enabled_flag = TRUE; + self->features.cu_qp_delta_enabled_flag = + (self->rc.rc_ctrl_mode != VA_RC_CQP); + self->features.diff_cu_qp_delta_depth = 0; + self->features.weighted_pred_flag = FALSE; + self->features.weighted_bipred_flag = FALSE; + self->features.transquant_bypass_enabled_flag = FALSE; + +#if VA_CHECK_VERSION(1, 13, 0) +print_options: +#endif + GST_DEBUG_OBJECT (self, "Set features to: " + "separate_colour_plane_flag = %d, " + "colour_plane_id = %d, " + "scaling_list_enabled_flag = %d, " + "scaling_list_data_present_flag = %d, " + "amp_enabled_flag = %d, " + "sample_adaptive_offset_enabled_flag = %d, " + "slice_sao_luma_flag = %d, " + "slice_sao_chroma_flag = %d, " + "pcm_enabled_flag = %d, " + "pcm_sample_bit_depth_luma_minus1 = %d, " + "pcm_sample_bit_depth_chroma_minus1 = %d, " + "log2_min_pcm_luma_coding_block_size_minus3 = %d, " + "log2_max_pcm_luma_coding_block_size_minus3 = %d, " + "pcm_loop_filter_disabled_flag = %d, " + "temporal_mvp_enabled_flag = %d, " + "collocated_from_l0_flag = %d, " + "collocated_ref_idx = %d, " + "strong_intra_smoothing_enabled_flag = %d, " + "dependent_slice_segment_flag = %d, " + "sign_data_hiding_enabled_flag = %d, " + "constrained_intra_pred_flag = %d, " + "transform_skip_enabled_flag = %d, " + "cu_qp_delta_enabled_flag = %d, " + "diff_cu_qp_delta_depth = %d, " + "weighted_pred_flag = %d, " + "weighted_bipred_flag = %d, " + "transquant_bypass_enabled_flag = %d", + self->features.separate_colour_plane_flag, + self->features.colour_plane_id, + self->features.scaling_list_enabled_flag, + self->features.scaling_list_data_present_flag, + self->features.amp_enabled_flag, + self->features.sample_adaptive_offset_enabled_flag, + self->features.slice_sao_luma_flag, + self->features.slice_sao_chroma_flag, + self->features.pcm_enabled_flag, + self->features.pcm_sample_bit_depth_luma_minus1, + self->features.pcm_sample_bit_depth_chroma_minus1, + self->features.log2_min_pcm_luma_coding_block_size_minus3, + self->features.log2_max_pcm_luma_coding_block_size_minus3, + self->features.pcm_loop_filter_disabled_flag, + self->features.temporal_mvp_enabled_flag, + self->features.collocated_from_l0_flag, + self->features.collocated_ref_idx, + self->features.strong_intra_smoothing_enabled_flag, + self->features.dependent_slice_segment_flag, + self->features.sign_data_hiding_enabled_flag, + self->features.constrained_intra_pred_flag, + self->features.transform_skip_enabled_flag, + self->features.cu_qp_delta_enabled_flag, + self->features.diff_cu_qp_delta_depth, + self->features.weighted_pred_flag, + self->features.weighted_bipred_flag, + self->features.transquant_bypass_enabled_flag); + + /* Ensure trellis. */ + if (self->features.use_trellis && + !gst_va_encoder_has_trellis (base->encoder, base->profile, + GST_VA_BASE_ENC_ENTRYPOINT (base))) { + GST_INFO_OBJECT (self, "The trellis is not supported"); + self->features.use_trellis = FALSE; + } + + if (self->prop.use_trellis != self->features.use_trellis) { + self->prop.use_trellis = self->features.use_trellis; + g_object_notify_by_pspec (G_OBJECT (self), propertiesPROP_TRELLIS); + } +} + +/* We need to decide the profile and entrypoint before call this. + It applies the optimized block size(coding and tranform) provided + by the va driver. */ +static void +_h265_set_coding_block_size (GstVaH265Enc * self) +{ +#if VA_CHECK_VERSION(1, 13, 0) + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + + VAConfigAttribValEncHEVCBlockSizes block_size; + VAStatus status; + VAConfigAttrib attrib = {.type = VAConfigAttribEncHEVCBlockSizes }; + + status = vaGetConfigAttributes (gst_va_display_get_va_dpy (base->display), + base->profile, GST_VA_BASE_ENC_ENTRYPOINT (base), &attrib, 1); + if (status != VA_STATUS_SUCCESS) { + GST_INFO_OBJECT (self, "Failed to query coding block size: %s", + vaErrorStr (status)); + goto default_setting; + } + + if (attrib.value == VA_ATTRIB_NOT_SUPPORTED) { + GST_INFO_OBJECT (self, "Driver does not support query" + " coding block size"); + goto default_setting; + } + + block_size.value = attrib.value; + + /* We always choose the biggest coding block size and the biggest + hierarchy depth to achieve the best compression result. + TODO: May choose smaller value when fast encoding is needed. */ + + if (block_size.bits.log2_min_luma_coding_block_size_minus3 > + block_size.bits.log2_max_coding_tree_block_size_minus3) { + GST_WARNING_OBJECT (self, "Invalid log2_min_luma_coding_block_size_minus3:" + " %d, bigger than log2_max_coding_tree_block_size_minus3: %d", + block_size.bits.log2_min_luma_coding_block_size_minus3, + block_size.bits.log2_max_coding_tree_block_size_minus3); + goto default_setting; + } + if (block_size.bits.log2_min_luma_coding_block_size_minus3 > + block_size.bits.log2_min_coding_tree_block_size_minus3) { + GST_WARNING_OBJECT (self, "Invalid log2_min_luma_coding_block_size_minus3:" + " %d, bigger than log2_min_coding_tree_block_size_minus3: %d", + block_size.bits.log2_min_luma_coding_block_size_minus3, + block_size.bits.log2_min_coding_tree_block_size_minus3); + block_size.bits.log2_min_coding_tree_block_size_minus3 = + block_size.bits.log2_min_luma_coding_block_size_minus3; + } + + self->ctu_size = + 1 << (block_size.bits.log2_max_coding_tree_block_size_minus3 + 3); + self->min_coding_block_size = + 1 << (block_size.bits.log2_min_luma_coding_block_size_minus3 + 3); + self->features.log2_min_luma_coding_block_size_minus3 = + block_size.bits.log2_min_luma_coding_block_size_minus3; + self->features.log2_diff_max_min_luma_coding_block_size = + block_size.bits.log2_max_coding_tree_block_size_minus3 - + block_size.bits.log2_min_luma_coding_block_size_minus3; + + if (block_size.bits.log2_min_luma_transform_block_size_minus2 > + block_size.bits.log2_max_luma_transform_block_size_minus2) { + GST_WARNING_OBJECT (self, "Invalid" + " log2_min_luma_transform_block_size_minus2: %d, bigger" + " than log2_max_luma_transform_block_size_minus2: %d", + block_size.bits.log2_min_luma_transform_block_size_minus2, + block_size.bits.log2_max_luma_transform_block_size_minus2); + goto default_setting; + } + self->features.log2_min_transform_block_size_minus2 = + block_size.bits.log2_min_luma_transform_block_size_minus2; + self->features.log2_diff_max_min_transform_block_size = + block_size.bits.log2_max_luma_transform_block_size_minus2 - + block_size.bits.log2_min_luma_transform_block_size_minus2; + + self->features.max_transform_hierarchy_depth_inter = + block_size.bits.max_max_transform_hierarchy_depth_inter; + self->features.max_transform_hierarchy_depth_intra = + block_size.bits.max_max_transform_hierarchy_depth_intra; + + /* For PCM setting later. */ + self->features.log2_min_pcm_luma_coding_block_size_minus3 = + block_size.bits.log2_min_pcm_coding_block_size_minus3; + self->features.log2_max_pcm_luma_coding_block_size_minus3 = + block_size.bits.log2_max_pcm_coding_block_size_minus3; + + if (self->features.log2_max_pcm_luma_coding_block_size_minus3 - + self->features.log2_min_pcm_luma_coding_block_size_minus3 > + self->features.log2_diff_max_min_luma_coding_block_size) { + GST_WARNING_OBJECT (self, "Invalid" + " log2_diff_max_min_pcm_luma_coding_block_size: %d", + self->features.log2_max_pcm_luma_coding_block_size_minus3 + - self->features.log2_min_pcm_luma_coding_block_size_minus3); + self->features.log2_max_pcm_luma_coding_block_size_minus3 = 0; + self->features.log2_min_pcm_luma_coding_block_size_minus3 = 0; + } + + goto done; + +default_setting: +#endif + + GST_DEBUG_OBJECT (self, "Apply default setting for coding block"); + + /* choose some conservative value */ + self->ctu_size = 32; + self->min_coding_block_size = 8; + self->features.log2_min_luma_coding_block_size_minus3 = 0; + self->features.log2_diff_max_min_luma_coding_block_size = 2; + + self->features.log2_min_transform_block_size_minus2 = 0; + self->features.log2_diff_max_min_transform_block_size = 3; + self->features.max_transform_hierarchy_depth_inter = 2; + self->features.max_transform_hierarchy_depth_intra = 2; + self->features.pcm_sample_bit_depth_luma_minus1 = 0; + self->features.pcm_sample_bit_depth_chroma_minus1 = 0; + /* Default PCM is disabled. */ + self->features.log2_min_pcm_luma_coding_block_size_minus3 = 0; + self->features.log2_max_pcm_luma_coding_block_size_minus3 = 0; + +#if VA_CHECK_VERSION(1, 13, 0) +done: +#endif + GST_DEBUG_OBJECT (self, "Set coding block size to: " + "log2_min_luma_coding_block_size_minus3: %d, " + "log2_diff_max_min_luma_coding_block_size: %d, " + "log2_min_transform_block_size_minus2: %d, " + "log2_diff_max_min_transform_block_size: %d, " + "max_transform_hierarchy_depth_inter: %d, " + "max_transform_hierarchy_depth_intra: %d", + self->features.log2_min_luma_coding_block_size_minus3, + self->features.log2_diff_max_min_luma_coding_block_size, + self->features.log2_min_transform_block_size_minus2, + self->features.log2_diff_max_min_transform_block_size, + self->features.max_transform_hierarchy_depth_inter, + self->features.max_transform_hierarchy_depth_intra); +} + +static gboolean +gst_va_h265_enc_reconfig (GstVaBaseEnc * base) +{ + GstVideoEncoder *venc = GST_VIDEO_ENCODER (base); + GstVaH265Enc *self = GST_VA_H265_ENC (base); + GstCaps *out_caps, *reconf_caps = NULL;; + GstVideoCodecState *output_state = NULL; + GstVideoFormat format, reconf_format = GST_VIDEO_FORMAT_UNKNOWN; + VAProfile profile = VAProfileNone; + gboolean do_renegotiation = TRUE, do_reopen, need_negotiation; + guint max_ref_frames, max_surfaces = 0, rt_format = 0, codedbuf_size; + gint width, height; + + width = GST_VIDEO_INFO_WIDTH (&base->input_state->info); + height = GST_VIDEO_INFO_HEIGHT (&base->input_state->info); + format = GST_VIDEO_INFO_FORMAT (&base->input_state->info); + codedbuf_size = base->codedbuf_size; + + need_negotiation = + !gst_va_encoder_get_reconstruct_pool_config (base->encoder, &reconf_caps, + &max_surfaces); + if (!need_negotiation && reconf_caps) { + GstVideoInfo vi; + if (!gst_video_info_from_caps (&vi, reconf_caps)) + return FALSE; + reconf_format = GST_VIDEO_INFO_FORMAT (&vi); + } + + if (!_h265_decide_profile (self, &profile, &rt_format)) + return FALSE; + + /* first check */ + do_reopen = !(base->profile == profile && base->rt_format == rt_format + && format == reconf_format && width == base->width + && height == base->height && self->prop.rc_ctrl == self->rc.rc_ctrl_mode); + + if (do_reopen && gst_va_encoder_is_open (base->encoder)) + gst_va_encoder_close (base->encoder); + + gst_va_base_enc_reset_state (base); + + base->profile = profile; + base->rt_format = rt_format; + base->width = width; + base->height = height; + + self->luma_width = GST_ROUND_UP_16 (base->width); + self->luma_height = GST_ROUND_UP_16 (base->height); + + /* Frame Cropping */ + if ((base->width & 15) || (base->height & 15)) { + /* 6.1, Table 6-1 */ + static const guint SubWidthC = { 1, 2, 2, 1 }; + static const guint SubHeightC = { 1, 2, 1, 1 }; + guint index = _get_chroma_format_idc (gst_va_chroma_from_video_format + (GST_VIDEO_INFO_FORMAT (&base->input_state->info))); + + self->conformance_window_flag = 1; + self->conf_win_left_offset = 0; + self->conf_win_right_offset = + (self->luma_width - base->width) / SubWidthCindex; + self->conf_win_top_offset = 0; + self->conf_win_bottom_offset = + (self->luma_height - base->height) / SubHeightCindex; + } + + _h265_set_coding_block_size (self); + + self->ctu_width = (self->luma_width + self->ctu_size - 1) / self->ctu_size; + self->ctu_height = (self->luma_height + self->ctu_size - 1) / self->ctu_size; + if (self->ctu_width == 0 || self->ctu_height == 0) + return FALSE; + + self->bits_depth_luma_minus8 = + GST_VIDEO_FORMAT_INFO_DEPTH (base->input_state->info.finfo, 0); + self->bits_depth_luma_minus8 -= 8; + + if (GST_VIDEO_FORMAT_INFO_N_COMPONENTS (base->input_state->info.finfo)) { + self->bits_depth_chroma_minus8 = + GST_VIDEO_FORMAT_INFO_DEPTH (base->input_state->info.finfo, 1); + if (self->bits_depth_chroma_minus8 < + GST_VIDEO_FORMAT_INFO_DEPTH (base->input_state->info.finfo, 2)) + self->bits_depth_chroma_minus8 = + GST_VIDEO_FORMAT_INFO_DEPTH (base->input_state->info.finfo, 2); + + self->bits_depth_chroma_minus8 -= 8; + } else { + self->bits_depth_chroma_minus8 = 0; + } + + /* Frame rate is needed for rate control and PTS setting. */ + if (GST_VIDEO_INFO_FPS_N (&base->input_state->info) == 0 + || GST_VIDEO_INFO_FPS_D (&base->input_state->info) == 0) { + GST_INFO_OBJECT (self, "Unknown framerate, just set to 30 fps"); + GST_VIDEO_INFO_FPS_N (&base->input_state->info) = 30; + GST_VIDEO_INFO_FPS_D (&base->input_state->info) = 1; + } + base->frame_duration = gst_util_uint64_scale (GST_SECOND, + GST_VIDEO_INFO_FPS_D (&base->input_state->info), + GST_VIDEO_INFO_FPS_N (&base->input_state->info)); + + GST_DEBUG_OBJECT (self, "resolution:%dx%d, CTU size: %dx%d," + " frame duration is %" GST_TIME_FORMAT, + base->width, base->height, self->ctu_width, self->ctu_height, + GST_TIME_ARGS (base->frame_duration)); + + if (!_h265_ensure_rate_control (self)) + return FALSE; + + if (!_h265_calculate_tier_level (self)) + return FALSE; + + if (!_h265_generate_gop_structure (self)) + return FALSE; + + _h265_setup_encoding_features (self); + + _h265_calculate_coded_size (self); + + if (!_h265_setup_slice_and_tile_partition (self)) + return FALSE; + + if (!_h265_init_packed_headers (self)) + return FALSE; + + self->aud = self->aud && self->packed_headers & VA_ENC_PACKED_HEADER_RAW_DATA; + update_property_bool (base, &self->prop.aud, self->aud, PROP_AUD); + + max_ref_frames = self->gop.num_ref_frames + 3 /* scratch frames */ ; + + /* second check after calculations */ + do_reopen |= + !(max_ref_frames == max_surfaces && codedbuf_size == base->codedbuf_size); + if (do_reopen && gst_va_encoder_is_open (base->encoder)) + gst_va_encoder_close (base->encoder); + + if (!gst_va_encoder_is_open (base->encoder) + && !gst_va_encoder_open (base->encoder, base->profile, + format, base->rt_format, self->luma_width, self->luma_height, + base->codedbuf_size, max_ref_frames, self->rc.rc_ctrl_mode, + self->packed_headers)) { + GST_ERROR_OBJECT (self, "Failed to open the VA encoder."); + return FALSE; + } + + /* Add some tags */ + gst_va_base_enc_add_codec_tag (base, "H265"); + + out_caps = gst_va_profile_caps (base->profile); + g_assert (out_caps); + out_caps = gst_caps_fixate (out_caps); + + if (self->level_str) + gst_caps_set_simple (out_caps, "level", G_TYPE_STRING, self->level_str, + NULL); + + gst_caps_set_simple (out_caps, "width", G_TYPE_INT, base->width, + "height", G_TYPE_INT, base->height, "alignment", G_TYPE_STRING, "au", + "stream-format", G_TYPE_STRING, "byte-stream", NULL); + + if (!need_negotiation) { + output_state = gst_video_encoder_get_output_state (venc); + do_renegotiation = TRUE; + + if (output_state) { + do_renegotiation = !gst_caps_is_subset (output_state->caps, out_caps); + gst_video_codec_state_unref (output_state); + } + + if (!do_renegotiation) { + gst_caps_unref (out_caps); + return TRUE; + } + } + + GST_DEBUG_OBJECT (self, "output caps is %" GST_PTR_FORMAT, out_caps); + + output_state = + gst_video_encoder_set_output_state (venc, out_caps, base->input_state); + gst_video_codec_state_unref (output_state); + + if (!gst_video_encoder_negotiate (venc)) { + GST_ERROR_OBJECT (self, "Failed to negotiate with the downstream"); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_va_h265_enc_flush (GstVideoEncoder * venc) +{ + GstVaH265Enc *self = GST_VA_H265_ENC (venc); + + /* begin from an IDR after flush. */ + self->gop.cur_frame_index = 0; + + return GST_VIDEO_ENCODER_CLASS (parent_class)->flush (venc); +} + +static gboolean +gst_va_h265_enc_new_frame (GstVaBaseEnc * base, GstVideoCodecFrame * frame) +{ + GstVaH265EncFrame *frame_in; + + frame_in = gst_va_h265_enc_frame_new (); + frame_in->total_frame_count = base->input_frame_count++; + gst_video_codec_frame_set_user_data (frame, frame_in, + gst_va_h265_enc_frame_free); + + return TRUE; +} + +static void +gst_va_h265_enc_prepare_output (GstVaBaseEnc * base, GstVideoCodecFrame * frame) +{ + GstVaH265Enc *self = GST_VA_H265_ENC (base); + GstVaH265EncFrame *frame_enc; + + frame_enc = _enc_frame (frame); + + frame->pts = + base->start_pts + base->frame_duration * frame_enc->total_frame_count; + /* The PTS should always be later than the DTS. */ + frame->dts = base->start_pts + base->frame_duration * + ((gint64) base->output_frame_count - + (gint64) self->gop.num_reorder_frames); + base->output_frame_count++; + frame->duration = base->frame_duration; +} + +/* *INDENT-OFF* */ +static const gchar *sink_caps_str = + GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_VA, + "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE ("{ NV12 }"); +/* *INDENT-ON* */ + +static const gchar *src_caps_str = "video/x-h265"; + +static gpointer +_register_debug_category (gpointer data) +{ + GST_DEBUG_CATEGORY_INIT (gst_va_h265enc_debug, "vah265enc", 0, + "VA h265 encoder"); + + return NULL; +} + +static void +gst_va_h265_enc_init (GTypeInstance * instance, gpointer g_class) +{ + GstVaH265Enc *self = GST_VA_H265_ENC (instance); + + /* default values */ + self->prop.key_int_max = 0; + self->prop.num_bframes = 0; + self->prop.num_iframes = 0; + self->prop.num_ref_frames = 3; + self->prop.b_pyramid = FALSE; + self->prop.num_slices = 1; + self->prop.min_qp = 1; + self->prop.max_qp = 51; + self->prop.qp_i = 26; + self->prop.qp_p = 26; + self->prop.qp_b = 26; + self->prop.use_trellis = FALSE; + self->prop.aud = FALSE; + self->prop.mbbrc = 0; + self->prop.bitrate = 0; + self->prop.target_percentage = 66; + self->prop.target_usage = 4; + self->prop.cpb_size = 0; + if (propertiesPROP_RATE_CONTROL) { + self->prop.rc_ctrl = + G_PARAM_SPEC_ENUM (propertiesPROP_RATE_CONTROL)->default_value; + } else { + self->prop.rc_ctrl = VA_RC_NONE; + } +} + +static void +gst_va_h265_enc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVaH265Enc *const self = GST_VA_H265_ENC (object); + GstVaBaseEnc *base = GST_VA_BASE_ENC (self); + gboolean already_effect = FALSE; + + GST_OBJECT_LOCK (self); + + switch (prop_id) { + case PROP_KEY_INT_MAX: + self->prop.key_int_max = g_value_get_uint (value); + break; + case PROP_BFRAMES: + self->prop.num_bframes = g_value_get_uint (value); + break; + case PROP_IFRAMES: + self->prop.num_iframes = g_value_get_uint (value); + break; + case PROP_NUM_REF_FRAMES: + self->prop.num_ref_frames = g_value_get_uint (value); + break; + case PROP_B_PYRAMID: + self->prop.b_pyramid = g_value_get_boolean (value); + break; + case PROP_NUM_SLICES: + self->prop.num_slices = g_value_get_uint (value); + break; + case PROP_MIN_QP: + self->prop.min_qp = g_value_get_uint (value); + break; + case PROP_MAX_QP: + self->prop.max_qp = g_value_get_uint (value); + break; + case PROP_QP_I: + self->prop.qp_i = g_value_get_uint (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + already_effect = TRUE; + break; + case PROP_QP_P: + self->prop.qp_p = g_value_get_uint (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + already_effect = TRUE; + break; + case PROP_QP_B: + self->prop.qp_b = g_value_get_uint (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + already_effect = TRUE; + break; + case PROP_TRELLIS: + self->prop.use_trellis = g_value_get_boolean (value); + break; + case PROP_AUD: + self->prop.aud = g_value_get_boolean (value); + break; + case PROP_MBBRC:{ + /* Macroblock-level rate control. + * 0: use default, + * 1: always enable, + * 2: always disable, + * other: reserved. */ + switch (g_value_get_enum (value)) { + case GST_VA_FEATURE_DISABLED: + self->prop.mbbrc = 2; + break; + case GST_VA_FEATURE_ENABLED: + self->prop.mbbrc = 1; + break; + case GST_VA_FEATURE_AUTO: + self->prop.mbbrc = 0; + break; + } + break; + } + case PROP_BITRATE: + self->prop.bitrate = g_value_get_uint (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + already_effect = TRUE; + break; + case PROP_TARGET_PERCENTAGE: + self->prop.target_percentage = g_value_get_uint (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + already_effect = TRUE; + break; + case PROP_TARGET_USAGE: + self->prop.target_usage = g_value_get_uint (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + already_effect = TRUE; + break; + case PROP_NUM_TILE_COLS: + self->prop.num_tile_cols = g_value_get_uint (value); + break; + case PROP_NUM_TILE_ROWS: + self->prop.num_tile_rows = g_value_get_uint (value); + break; + case PROP_RATE_CONTROL: + self->prop.rc_ctrl = g_value_get_enum (value); + g_atomic_int_set (&GST_VA_BASE_ENC (self)->reconf, TRUE); + already_effect = TRUE; + break; + case PROP_CPB_SIZE: + self->prop.cpb_size = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } + + GST_OBJECT_UNLOCK (self); + +#ifndef GST_DISABLE_GST_DEBUG + if (!already_effect && + base->encoder && gst_va_encoder_is_open (base->encoder)) { + GST_WARNING_OBJECT (self, "Property `%s` change ignored while processing.", + pspec->name); + } +#endif +} + +static void +gst_va_h265_enc_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstVaH265Enc *const self = GST_VA_H265_ENC (object); + + GST_OBJECT_LOCK (self); + + switch (prop_id) { + case PROP_KEY_INT_MAX: + g_value_set_uint (value, self->prop.key_int_max); + break; + case PROP_BFRAMES: + g_value_set_uint (value, self->prop.num_bframes); + break; + case PROP_IFRAMES: + g_value_set_uint (value, self->prop.num_iframes); + break; + case PROP_NUM_REF_FRAMES: + g_value_set_uint (value, self->prop.num_ref_frames); + break; + case PROP_B_PYRAMID: + g_value_set_boolean (value, self->prop.b_pyramid); + break; + case PROP_NUM_SLICES: + g_value_set_uint (value, self->prop.num_slices); + break; + case PROP_MIN_QP: + g_value_set_uint (value, self->prop.min_qp); + break; + case PROP_MAX_QP: + g_value_set_uint (value, self->prop.max_qp); + break; + case PROP_QP_I: + g_value_set_uint (value, self->prop.qp_i); + break; + case PROP_QP_P: + g_value_set_uint (value, self->prop.qp_p); + break; + case PROP_QP_B: + g_value_set_uint (value, self->prop.qp_b); + break; + case PROP_TRELLIS: + g_value_set_boolean (value, self->prop.use_trellis); + break; + case PROP_AUD: + g_value_set_boolean (value, self->prop.aud); + break; + case PROP_MBBRC: + g_value_set_enum (value, self->prop.mbbrc); + break; + case PROP_BITRATE: + g_value_set_uint (value, self->prop.bitrate); + break; + case PROP_TARGET_PERCENTAGE: + g_value_set_uint (value, self->prop.target_percentage); + break; + case PROP_TARGET_USAGE: + g_value_set_uint (value, self->prop.target_usage); + break; + case PROP_NUM_TILE_COLS: + g_value_set_uint (value, self->prop.num_tile_cols); + break; + case PROP_NUM_TILE_ROWS: + g_value_set_uint (value, self->prop.num_tile_rows); + break; + case PROP_RATE_CONTROL: + g_value_set_enum (value, self->prop.rc_ctrl); + break; + case PROP_CPB_SIZE: + g_value_set_uint (value, self->prop.cpb_size); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } + + GST_OBJECT_UNLOCK (self); +} + +static void +gst_va_h265_enc_class_init (gpointer g_klass, gpointer class_data) +{ + GstCaps *src_doc_caps, *sink_doc_caps; + GstPadTemplate *sink_pad_templ, *src_pad_templ; + GObjectClass *object_class = G_OBJECT_CLASS (g_klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (g_klass); + GstVideoEncoderClass *venc_class = GST_VIDEO_ENCODER_CLASS (g_klass); + GstVaBaseEncClass *va_enc_class = GST_VA_BASE_ENC_CLASS (g_klass); + GstVaH265EncClass *vah265enc_class = GST_VA_H265_ENC_CLASS (g_klass); + GstVaDisplay *display; + GstVaEncoder *encoder; + struct CData *cdata = class_data; + gchar *long_name; + const gchar *name, *desc; + gint n_props = N_PROPERTIES; + GParamFlags param_flags = + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT; + + if (cdata->entrypoint == VAEntrypointEncSlice) { + desc = "VA-API based H.265 video encoder"; + name = "VA-API H.265 Encoder"; + } else { + desc = "VA-API based H.265 low power video encoder"; + name = "VA-API H.265 Low Power Encoder"; + } + + if (cdata->description) + long_name = g_strdup_printf ("%s in %s", name, cdata->description); + else + long_name = g_strdup (name); + + gst_element_class_set_metadata (element_class, long_name, + "Codec/Encoder/Video/Hardware", desc, "He Junyan <junyan.he@intel.com>"); + + sink_doc_caps = gst_caps_from_string (sink_caps_str); + src_doc_caps = gst_caps_from_string (src_caps_str); + + parent_class = g_type_class_peek_parent (g_klass); + + va_enc_class->codec = HEVC; + va_enc_class->entrypoint = cdata->entrypoint; + va_enc_class->render_device_path = g_strdup (cdata->render_device_path); + + sink_pad_templ = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, + cdata->sink_caps); + gst_element_class_add_pad_template (element_class, sink_pad_templ); + + gst_pad_template_set_documentation_caps (sink_pad_templ, sink_doc_caps); + gst_caps_unref (sink_doc_caps); + + src_pad_templ = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + cdata->src_caps); + gst_element_class_add_pad_template (element_class, src_pad_templ); + + gst_pad_template_set_documentation_caps (src_pad_templ, src_doc_caps); + gst_caps_unref (src_doc_caps); + + object_class->set_property = gst_va_h265_enc_set_property; + object_class->get_property = gst_va_h265_enc_get_property; + + venc_class->flush = GST_DEBUG_FUNCPTR (gst_va_h265_enc_flush); + + va_enc_class->reset_state = GST_DEBUG_FUNCPTR (gst_va_h265_enc_reset_state); + va_enc_class->reconfig = GST_DEBUG_FUNCPTR (gst_va_h265_enc_reconfig); + va_enc_class->new_frame = GST_DEBUG_FUNCPTR (gst_va_h265_enc_new_frame); + va_enc_class->reorder_frame = + GST_DEBUG_FUNCPTR (gst_va_h265_enc_reorder_frame); + va_enc_class->encode_frame = GST_DEBUG_FUNCPTR (gst_va_h265_enc_encode_frame); + va_enc_class->prepare_output = + GST_DEBUG_FUNCPTR (gst_va_h265_enc_prepare_output); + + { + display = + gst_va_display_drm_new_from_path (va_enc_class->render_device_path); + encoder = gst_va_encoder_new (display, va_enc_class->codec, + va_enc_class->entrypoint); + if (gst_va_encoder_get_rate_control_enum (encoder, + vah265enc_class->rate_control)) { + gchar *basename = g_path_get_basename (va_enc_class->render_device_path); + g_snprintf (vah265enc_class->rate_control_type_name, + G_N_ELEMENTS (vah265enc_class->rate_control_type_name) - 1, + "GstVaEncoderRateControl_%" GST_FOURCC_FORMAT "%s_%s", + GST_FOURCC_ARGS (va_enc_class->codec), + (va_enc_class->entrypoint == VAEntrypointEncSliceLP) ? "_LP" : "", + basename); + vah265enc_class->rate_control_type = + g_enum_register_static (vah265enc_class->rate_control_type_name, + vah265enc_class->rate_control); + gst_type_mark_as_plugin_api (vah265enc_class->rate_control_type, 0); + g_free (basename); + } + gst_object_unref (encoder); + gst_object_unref (display); + } + + g_free (long_name); + g_free (cdata->description); + g_free (cdata->render_device_path); + gst_caps_unref (cdata->src_caps); + gst_caps_unref (cdata->sink_caps); + g_free (cdata); + + /** + * GstVaH265Enc:key-int-max: + * + * The maximal distance between two keyframes. + */ + propertiesPROP_KEY_INT_MAX = g_param_spec_uint ("key-int-max", + "Key frame maximal interval", + "The maximal distance between two keyframes. It decides the size of GOP" + " (0: auto-calculate)", 0, MAX_GOP_SIZE, 0, param_flags); + + /** + * GstVaH265Enc:b-frames: + * + * Number of B-frames between two reference frames. + */ + propertiesPROP_BFRAMES = g_param_spec_uint ("b-frames", "B Frames", + "Number of B frames between I and P reference frames", 0, 31, 0, + param_flags); + + /** + * GstVaH265Enc:i-frames: + * + * Force the number of i-frames insertion within one GOP. + */ + propertiesPROP_IFRAMES = g_param_spec_uint ("i-frames", "I Frames", + "Force the number of I frames insertion within one GOP, not including the " + "first IDR frame", 0, 1023, 0, param_flags); + + /* The VA only define 15 refs */ + /** + * GstVaH265Enc:ref-frames: + * + * The number of reference frames. + */ + propertiesPROP_NUM_REF_FRAMES = g_param_spec_uint ("ref-frames", + "Number of Reference Frames", + "Number of reference frames, including both the forward and the backward", + 0, 15, 3, param_flags); + + /** + * GstVaH265Enc:b-pyramid: + * + * Enable the b-pyramid reference structure in GOP. + */ + propertiesPROP_B_PYRAMID = g_param_spec_boolean ("b-pyramid", "b pyramid", + "Enable the b-pyramid reference structure in the GOP", FALSE, + param_flags); + + /** + * GstVaH265Enc:num-slices: + * + * The number of slices per frame. + */ + propertiesPROP_NUM_SLICES = g_param_spec_uint ("num-slices", + "Number of Slices", "Number of slices per frame", 1, 200, 1, param_flags); + + /** + * GstVaH265Enc:max-qp: + * + * The maximum quantizer value. + */ + propertiesPROP_MAX_QP = g_param_spec_uint ("max-qp", "Maximum QP", + "Maximum quantizer value for each frame", 0, 51, 51, param_flags); + + /** + * GstVaH265Enc:min-qp: + * + * The minimum quantizer value. + */ + propertiesPROP_MIN_QP = g_param_spec_uint ("min-qp", "Minimum QP", + "Minimum quantizer value for each frame", 0, 51, 1, param_flags); + + /** + * GstVaH265Enc:qpi: + * + * The quantizer value for I frame. In CQP mode, it specifies the QP of + * I frame, in other mode, it specifies the init QP of all frames. + */ + propertiesPROP_QP_I = g_param_spec_uint ("qpi", "I Frame QP", + "The quantizer value for I frame. In CQP mode, it specifies the QP of I " + "frame, in other mode, it specifies the init QP of all frames", 0, 51, 26, + param_flags | GST_PARAM_MUTABLE_PLAYING); + + /** + * GstVaH265Enc:qpp: + * + * The quantizer value for P frame. This is available only in CQP mode. + */ + propertiesPROP_QP_P = g_param_spec_uint ("qpp", + "The quantizer value for P frame", + "The quantizer value for P frame. This is available only in CQP mode", + 0, 51, 26, param_flags | GST_PARAM_MUTABLE_PLAYING); + + /** + * GstVaH265Enc:qpb: + * + * The quantizer value for B frame. This is available only in CQP mode. + */ + propertiesPROP_QP_B = g_param_spec_uint ("qpb", + "The quantizer value for B frame", + "The quantizer value for B frame. This is available only in CQP mode", + 0, 51, 26, param_flags | GST_PARAM_MUTABLE_PLAYING); + + /** + * GstVaH265Enc:trellis: + * + * It enable the trellis quantization method. + * Trellis is an improved quantization algorithm. + */ + propertiesPROP_TRELLIS = g_param_spec_boolean ("trellis", "Enable trellis", + "Enable the trellis quantization method", FALSE, param_flags); + + /** + * GstVaH265Enc:aud: + * + * Insert the AU (Access Unit) delimeter for each frame. + */ + propertiesPROP_AUD = g_param_spec_boolean ("aud", "Insert AUD", + "Insert AU (Access Unit) delimeter for each frame", FALSE, param_flags); + + /** + * GstVaH265Enc:mbbrc: + * + * Macroblock level bitrate control. + * This is not compatible with Constant QP rate control. + */ + propertiesPROP_MBBRC = g_param_spec_enum ("mbbrc", + "Macroblock level Bitrate Control", + "Macroblock level Bitrate Control. It is not compatible with CQP", + GST_TYPE_VA_FEATURE, GST_VA_FEATURE_AUTO, param_flags); + + /** + * GstVaH265Enc:bitrate: + * + * The desired target bitrate, expressed in kbps. + * This is not available in CQP mode. + * + * CBR: This applies equally to the minimum, maximum and target bitrate. + * VBR: This applies to the target bitrate. The driver will use the + * "target-percentage" together to calculate the minimum and maximum bitrate. + * VCM: This applies to the target bitrate. The minimum and maximum bitrate + * are not needed. + */ + propertiesPROP_BITRATE = g_param_spec_uint ("bitrate", "Bitrate (kbps)", + "The desired bitrate expressed in kbps (0: auto-calculate)", + 0, 2000 * 1024, 0, param_flags | GST_PARAM_MUTABLE_PLAYING); + + /** + * GstVaH265Enc:target-percentage: + * + * The target percentage of the max bitrate, and expressed in uint, + * equal to "target percentage"*100. + * "target percentage" = "target bitrate" * 100 / "max bitrate" + * This is available only when rate-control is VBR. + * The driver uses it to calculate the minimum and maximum bitrate. + */ + propertiesPROP_TARGET_PERCENTAGE = g_param_spec_uint ("target-percentage", + "target bitrate percentage", + "The percentage for 'target bitrate'/'maximum bitrate' (Only in VBR)", + 50, 100, 66, param_flags | GST_PARAM_MUTABLE_PLAYING); + + /** + * GstVaH265Enc:target-usage: + * + * The target usage of the encoder. It controls and balances the encoding + * speed and the encoding quality. The lower value has better quality but + * slower speed, the higher value has faster speed but lower quality. + */ + propertiesPROP_TARGET_USAGE = g_param_spec_uint ("target-usage", + "target usage", + "The target usage to control and balance the encoding speed/quality", + 1, 7, 4, param_flags | GST_PARAM_MUTABLE_PLAYING); + + /** + * GstVaH265Enc:cpb-size: + * + * The desired max CPB size in Kb (0: auto-calculate). + */ + propertiesPROP_CPB_SIZE = g_param_spec_uint ("cpb-size", + "max CPB size in Kb", + "The desired max CPB size in Kb (0: auto-calculate)", 0, 2000 * 1024, 0, + param_flags); + + /** + * GstVaH265Enc:num-tile-cols: + * + * The number of tile columns when tile encoding is enabled. + */ + propertiesPROP_NUM_TILE_COLS = g_param_spec_uint ("num-tile-cols", + "number of tile columns", "The number of columns for tile encoding", + 1, MAX_COL_TILES, 1, param_flags); + + /** + * GstVaH265Enc:num-tile-rows: + * + * The number of tile rows when tile encoding is enabled. + */ + propertiesPROP_NUM_TILE_ROWS = g_param_spec_uint ("num-tile-rows", + "number of tile rows", "The number of rows for tile encoding", + 1, MAX_ROW_TILES, 1, param_flags); + + if (vah265enc_class->rate_control_type > 0) { + propertiesPROP_RATE_CONTROL = g_param_spec_enum ("rate-control", + "rate control mode", "The desired rate control mode for the encoder", + vah265enc_class->rate_control_type, + vah265enc_class->rate_control0.value, + GST_PARAM_CONDITIONALLY_AVAILABLE | GST_PARAM_MUTABLE_PLAYING + | param_flags); + } else { + n_props--; + propertiesPROP_RATE_CONTROL = NULL; + } + + g_object_class_install_properties (object_class, n_props, properties); + + /** + * GstVaFeature: + * @GST_VA_FEATURE_DISABLED: The feature is disabled. + * @GST_VA_FEATURE_ENABLED: The feature is enabled. + * @GST_VA_FEATURE_AUTO: The feature is enabled automatically. + * + * Since: 1.22 + */ + gst_type_mark_as_plugin_api (GST_TYPE_VA_FEATURE, 0); +} + +static GstCaps * +_complete_src_caps (GstCaps * srccaps) +{ + GstCaps *caps = gst_caps_copy (srccaps); + GValue val = G_VALUE_INIT; + + g_value_init (&val, G_TYPE_STRING); + g_value_set_string (&val, "au"); + gst_caps_set_value (caps, "alignment", &val); + g_value_unset (&val); + + g_value_init (&val, G_TYPE_STRING); + g_value_set_string (&val, "byte-stream"); + gst_caps_set_value (caps, "stream-format", &val); + g_value_unset (&val); + + return caps; +} + +gboolean +gst_va_h265_enc_register (GstPlugin * plugin, GstVaDevice * device, + GstCaps * sink_caps, GstCaps * src_caps, guint rank, + VAEntrypoint entrypoint) +{ + static GOnce debug_once = G_ONCE_INIT; + GType type; + GTypeInfo type_info = { + .class_size = sizeof (GstVaH265EncClass), + .class_init = gst_va_h265_enc_class_init, + .instance_size = sizeof (GstVaH265Enc), + .instance_init = gst_va_h265_enc_init, + }; + struct CData *cdata; + gboolean ret; + gchar *type_name, *feature_name; + + g_return_val_if_fail (GST_IS_PLUGIN (plugin), FALSE); + g_return_val_if_fail (GST_IS_VA_DEVICE (device), FALSE); + g_return_val_if_fail (GST_IS_CAPS (sink_caps), FALSE); + g_return_val_if_fail (GST_IS_CAPS (src_caps), FALSE); + g_return_val_if_fail (entrypoint == VAEntrypointEncSlice || + entrypoint == VAEntrypointEncSliceLP, FALSE); + + cdata = g_new (struct CData, 1); + cdata->entrypoint = entrypoint; + cdata->description = NULL; + cdata->render_device_path = g_strdup (device->render_device_path); + cdata->sink_caps = gst_caps_ref (sink_caps); + cdata->src_caps = _complete_src_caps (src_caps); + + /* class data will be leaked if the element never gets instantiated */ + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + type_info.class_data = cdata; + + /* The first encoder to be registered should use a constant name, + * like vah265enc, for any additional encoders, we create unique + * names, using inserting the render device name. */ + if (device->index == 0) { + if (entrypoint == VAEntrypointEncSlice) { + type_name = g_strdup ("GstVaH265Enc"); + feature_name = g_strdup ("vah265enc"); + } else { + type_name = g_strdup ("GstVaH265LPEnc"); + feature_name = g_strdup ("vah265lpenc"); + } + } else { + gchar *basename = g_path_get_basename (device->render_device_path); + if (entrypoint == VAEntrypointEncSlice) { + type_name = g_strdup_printf ("GstVa%sH265Enc", basename); + feature_name = g_strdup_printf ("va%sh265enc", basename); + } else { + type_name = g_strdup_printf ("GstVa%sH265LPEnc", basename); + feature_name = g_strdup_printf ("va%sh265lpenc", basename); + } + cdata->description = basename; + + /* lower rank for non-first device */ + if (rank > 0) + rank--; + } + + g_once (&debug_once, _register_debug_category, NULL); + type = g_type_register_static (GST_TYPE_VA_BASE_ENC, + type_name, &type_info, 0); + ret = gst_element_register (plugin, feature_name, rank, type); + + g_free (type_name); + g_free (feature_name); + + return ret; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvah265enc.h
Added
@@ -0,0 +1,34 @@ +/* GStreamer + * Copyright (C) 2022 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "gstvadevice.h" + +G_BEGIN_DECLS + +gboolean gst_va_h265_enc_register (GstPlugin * plugin, + GstVaDevice * device, + GstCaps * sink_caps, + GstCaps * src_caps, + guint rank, + VAEntrypoint entrypoint); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvajpegdec.c
Added
@@ -0,0 +1,651 @@ +/* GStreamer + * Copyright (C) 2022 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the0 + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-vajpegdec + * @title: vajpegdec + * @short_description: A VA-API based JPEG video decoder + * + * vajpegdec decodes JPEG images to VA surfaces using the installed + * and chosen VA-API(https://01.org/linuxmedia/vaapi) driver. + * + * The decoding surfaces can be mapped onto main memory as video + * frames. + * + * ## Example launch line + * ``` + * gst-launch-1.0 filesrc location=sample.mjpg ! parsebin ! vajpegdec ! autovideosink + * ``` + * + * Since: 1.22 + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstvajpegdec.h" + +#include <gst/va/gstvavideoformat.h> + +#include "gstvabasedec.h" + +GST_DEBUG_CATEGORY_STATIC (gst_va_jpegdec_debug); +#ifndef GST_DISABLE_GST_DEBUG +#define GST_CAT_DEFAULT gst_va_jpegdec_debug +#else +#define GST_CAT_DEFAULT NULL +#endif + +#define GST_VA_JPEG_DEC(obj) ((GstVaJpegDec *) obj) +#define GST_VA_JPEG_DEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), G_TYPE_FROM_INSTANCE (obj), GstVaJPEGDecClass)) +#define GST_VA_JPEG_DEC_CLASS(klass) ((GstVaJpegDecClass *) klass) + +typedef struct _GstVaJpegDec GstVaJpegDec; +typedef struct _GstVaJpegDecClass GstVaJpegDecClass; + +struct _GstVaJpegDecClass +{ + GstVaBaseDecClass parent_class; +}; + +struct _GstVaJpegDec +{ + GstVaBaseDec parent; + + GstVaDecodePicture *pic; +}; + +static GstElementClass *parent_class = NULL; + +/* *INDENT-OFF* */ +static const gchar *src_caps_str = + GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_VA, + "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE ("{ NV12 }"); +/* *INDENT-ON* */ + +static const gchar *sink_caps_str = "image/jpeg"; + +static VAProfile +_get_profile (GstJpegMarker marker) +{ + switch (marker) { + case GST_JPEG_MARKER_SOF0: + return VAProfileJPEGBaseline; + default: + break; + }; + + return VAProfileNone; +} + +/* taken from MediaSDK */ +#define RT_FORMAT_RGB (VA_RT_FORMAT_RGB16 | VA_RT_FORMAT_RGB32) + +/* *INDENT-OFF* */ +static const struct sampling_rtformat { + const gchar *sampling; + guint32 rt_format; +} sampling_rtformat_map = { + { "RGB", RT_FORMAT_RGB }, + { "YCbCr-4:4:4", VA_RT_FORMAT_YUV444 }, + { "YCbCr-4:2:2", VA_RT_FORMAT_YUV422 }, + { "YCbCr-4:2:0", VA_RT_FORMAT_YUV420 }, + { "GRAYSCALE", VA_RT_FORMAT_YUV400 }, + { "YCbCr-4:1:1", VA_RT_FORMAT_YUV411 }, +}; +/* *INDENT-ON* */ + +static guint32 +_get_rt_format (GstCaps * caps) +{ + GstStructure *structure; + const gchar *sampling; + guint i; + + structure = gst_caps_get_structure (caps, 0); + sampling = gst_structure_get_string (structure, "sampling"); + + for (i = 0; i < G_N_ELEMENTS (sampling_rtformat_map); i++) { + if (g_strcmp0 (sampling, sampling_rtformat_mapi.sampling) == 0) + return sampling_rtformat_mapi.rt_format; + } + + return 0; +} + +static GstFlowReturn +gst_va_jpeg_dec_new_picture (GstJpegDecoder * decoder, + GstVideoCodecFrame * frame, GstJpegMarker marker, + GstJpegFrameHdr * frame_hdr) +{ + GstVaJpegDec *self = GST_VA_JPEG_DEC (decoder); + GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); + GstVideoInfo *info = &base->output_info; + GstFlowReturn ret; + VAProfile profile; + VAPictureParameterBufferJPEGBaseline pic_param; + guint32 i, rt_format; + + GST_LOG_OBJECT (self, "new picture"); + + g_clear_pointer (&self->pic, gst_va_decode_picture_free); + + profile = _get_profile (marker); + if (profile == VAProfileNone) + return GST_FLOW_NOT_NEGOTIATED; + + /* use caps to avoid re-parsing app14 */ + rt_format = _get_rt_format (decoder->input_state->caps); + if (rt_format == 0) + return GST_FLOW_NOT_NEGOTIATED; + + if (!gst_va_decoder_config_is_equal (base->decoder, profile, rt_format, + frame_hdr->width, frame_hdr->height)) { + base->profile = profile; + base->rt_format = rt_format; + GST_VIDEO_INFO_WIDTH (info) = base->width = frame_hdr->width; + GST_VIDEO_INFO_HEIGHT (info) = base->height = frame_hdr->height; + + base->need_negotiation = TRUE; + GST_INFO_OBJECT (self, "Format changed to %s %x (%dx%d)", + gst_va_profile_name (profile), rt_format, base->width, base->height); + } + + g_clear_pointer (&base->input_state, gst_video_codec_state_unref); + base->input_state = gst_video_codec_state_ref (decoder->input_state); + + ret = gst_va_base_dec_prepare_output_frame (base, frame); + if (ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (self, "Failed to allocate output buffer: %s", + gst_flow_get_name (ret)); + return ret; + } + + self->pic = gst_va_decode_picture_new (base->decoder, frame->output_buffer); + + /* *INDENT-OFF* */ + pic_param = (VAPictureParameterBufferJPEGBaseline) { + .picture_width = frame_hdr->width, + .picture_height = frame_hdr->height, + /* .components */ + .num_components = frame_hdr->num_components, + .color_space = (rt_format == RT_FORMAT_RGB) ? 1 : 0, /* TODO: BGR */ + .rotation = VA_ROTATION_NONE, + }; + /* *INDENT-ON* */ + + for (i = 0; i < frame_hdr->num_components; i++) { + pic_param.componentsi.component_id = frame_hdr->componentsi.identifier; + pic_param.componentsi.h_sampling_factor = + frame_hdr->componentsi.horizontal_factor; + pic_param.componentsi.v_sampling_factor = + frame_hdr->componentsi.vertical_factor; + pic_param.componentsi.quantiser_table_selector = + frame_hdr->componentsi.quant_table_selector; + } + + if (!gst_va_decoder_add_param_buffer (base->decoder, self->pic, + VAPictureParameterBufferType, &pic_param, sizeof (pic_param))) + return GST_FLOW_ERROR; + + return ret; +} + +static GstFlowReturn +gst_va_jpeg_dec_decode_scan (GstJpegDecoder * decoder, + GstJpegDecoderScan * scan, const guint8 * buffer, guint32 size) +{ + GstVaJpegDec *self = GST_VA_JPEG_DEC (decoder); + GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); + VAHuffmanTableBufferJPEGBaseline huff = { 0, }; + VAIQMatrixBufferJPEGBaseline quant = { 0, }; + VASliceParameterBufferJPEGBaseline slice_param; + guint i, j; + + GST_LOG_OBJECT (self, "decoding slice"); + + for (i = 0; i < G_N_ELEMENTS (quant.load_quantiser_table); i++) { + quant.load_quantiser_tablei = + scan->quantization_tables->quant_tablesi.valid; + if (!scan->quantization_tables->quant_tablesi.valid) + continue; + for (j = 0; j < GST_JPEG_MAX_QUANT_ELEMENTS; j++) { + quant.quantiser_tableij = + scan->quantization_tables->quant_tablesi.quant_tablej; + } + + /* invalidate table */ + scan->quantization_tables->quant_tablesi.valid = FALSE; + } + + if (!gst_va_decoder_add_param_buffer (base->decoder, self->pic, + VAIQMatrixBufferType, &quant, sizeof (quant))) + return GST_FLOW_ERROR; + + for (i = 0; i < G_N_ELEMENTS (huff.huffman_table); i++) { + huff.load_huffman_tablei = scan->huffman_tables->dc_tablesi.valid + && scan->huffman_tables->ac_tablesi.valid; + + if (!huff.load_huffman_tablei) + continue; + + memcpy (huff.huffman_tablei.num_dc_codes, + scan->huffman_tables->dc_tablesi.huf_bits, + sizeof (huff.huffman_tablei.num_dc_codes)); + + memcpy (huff.huffman_tablei.dc_values, + scan->huffman_tables->dc_tablesi.huf_values, + sizeof (huff.huffman_tablei.dc_values)); + + memcpy (huff.huffman_tablei.num_ac_codes, + scan->huffman_tables->ac_tablesi.huf_bits, + sizeof (huff.huffman_tablei.num_ac_codes)); + + memcpy (huff.huffman_tablei.ac_values, + scan->huffman_tables->ac_tablesi.huf_values, + sizeof (huff.huffman_tablei.ac_values)); + } + + + /* invalidate table */ + for (i = 0; i < G_N_ELEMENTS (scan->huffman_tables->dc_tables); i++) + scan->huffman_tables->dc_tablesi.valid = FALSE; + for (i = 0; i < G_N_ELEMENTS (scan->huffman_tables->ac_tables); i++) + scan->huffman_tables->ac_tablesi.valid = FALSE; + + if (!gst_va_decoder_add_param_buffer (base->decoder, self->pic, + VAHuffmanTableBufferType, &huff, sizeof (huff))) + return GST_FLOW_ERROR; + + /* *INDENT-OFF* */ + slice_param = (VASliceParameterBufferJPEGBaseline) { + .slice_data_size = size, + .slice_data_offset = 0, + .slice_data_flag = VA_SLICE_DATA_FLAG_ALL, + .slice_horizontal_position = 0, + .slice_vertical_position = 0, + .restart_interval = scan->restart_interval, + .num_mcus = scan->mcu_rows_in_scan * scan->mcus_per_row, + .num_components = scan->scan_hdr->num_components, + }; + /* *INDENT-ON* */ + + for (i = 0; i < scan->scan_hdr->num_components; i++) { + slice_param.componentsi.component_selector = + scan->scan_hdr->componentsi.component_selector; + slice_param.componentsi.dc_table_selector = + scan->scan_hdr->componentsi.dc_selector; + slice_param.componentsi.ac_table_selector = + scan->scan_hdr->componentsi.ac_selector; + } + + if (!gst_va_decoder_add_slice_buffer (base->decoder, self->pic, &slice_param, + sizeof (slice_param), (void *) buffer, size)) + return GST_FLOW_ERROR; + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_va_jpeg_dec_end_picture (GstJpegDecoder * decoder) +{ + GstVaJpegDec *self = GST_VA_JPEG_DEC (decoder); + GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); + + GST_LOG_OBJECT (self, "end picture"); + + if (!gst_va_decoder_decode (base->decoder, self->pic)) + return GST_FLOW_ERROR; + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_va_jpeg_dec_output_picture (GstJpegDecoder * decoder, + GstVideoCodecFrame * frame) +{ + GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); + GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); + + if (gst_va_base_dec_process_output (base, frame, NULL, 0)) + return gst_video_decoder_finish_frame (vdec, frame); + return GST_FLOW_ERROR; +} + +/* @XXX: Checks for drivers that can do color convertion to nv12 + * regardless the input chroma, while it's YUV. */ +static gboolean +has_internal_nv12_color_convertion (GstVaBaseDec * base, GstVideoFormat format) +{ + if (!GST_VA_DISPLAY_IS_IMPLEMENTATION (base->display, INTEL_I965) + && !GST_VA_DISPLAY_IS_IMPLEMENTATION (base->display, INTEL_IHD)) + return FALSE; + + if (base->rt_format != VA_RT_FORMAT_YUV420 + && base->rt_format != VA_RT_FORMAT_YUV422) + return FALSE; + + if (format != GST_VIDEO_FORMAT_NV12) + return FALSE; + + return TRUE; +} + +static gboolean +gst_va_jpeg_dec_negotiate (GstVideoDecoder * decoder) +{ + GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); + GstVaJpegDec *self = GST_VA_JPEG_DEC (decoder); + GstVideoFormat format; + GstCapsFeatures *capsfeatures = NULL; + + /* Ignore downstream renegotiation request. */ + if (!base->need_negotiation) + return TRUE; + + base->need_negotiation = FALSE; + + if (GST_VA_DISPLAY_IS_IMPLEMENTATION (base->display, INTEL_I965)) + base->hacks = GST_VA_HACK_SURFACE_NO_FOURCC; + + if (gst_va_decoder_is_open (base->decoder) + && !gst_va_decoder_close (base->decoder)) + return FALSE; + + if (!gst_va_decoder_open (base->decoder, base->profile, base->rt_format)) + return FALSE; + + if (!gst_va_decoder_set_frame_size (base->decoder, base->width, base->height)) + return FALSE; + + if (base->output_state) + gst_video_codec_state_unref (base->output_state); + + /* hack for RGBP rt_format, because only RGBP is exposed as pixel + * format */ + if (base->rt_format == RT_FORMAT_RGB) + base->rt_format = VA_RT_FORMAT_RGBP; + + gst_va_base_dec_get_preferred_format_and_caps_features (base, &format, + &capsfeatures); + if (format == GST_VIDEO_FORMAT_UNKNOWN) + return FALSE; + + if (!has_internal_nv12_color_convertion (base, format) + && (gst_va_chroma_from_video_format (format) != base->rt_format)) + return FALSE; + + /* hack for RGBP rt_format */ + if (base->rt_format == VA_RT_FORMAT_RGBP) + base->rt_format = RT_FORMAT_RGB; + + base->output_state = + gst_video_decoder_set_output_state (decoder, format, + base->width, base->height, base->input_state); + + base->output_state->caps = gst_video_info_to_caps (&base->output_state->info); + if (capsfeatures) + gst_caps_set_features_simple (base->output_state->caps, capsfeatures); + + GST_INFO_OBJECT (self, "Negotiated caps %" GST_PTR_FORMAT, + base->output_state->caps); + + return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); +} + +static void +gst_va_jpeg_dec_dispose (GObject * object) +{ + GstVaJpegDec *self = GST_VA_JPEG_DEC (object); + + gst_va_base_dec_close (GST_VIDEO_DECODER (object)); + g_clear_pointer (&self->pic, gst_va_decode_picture_free); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_va_jpeg_dec_class_init (gpointer g_class, gpointer class_data) +{ + GstCaps *src_doc_caps, *sink_doc_caps; + GObjectClass *gobject_class = G_OBJECT_CLASS (g_class); + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + GstJpegDecoderClass *jpegdecoder_class = GST_JPEG_DECODER_CLASS (g_class); + GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_CLASS (g_class); + struct CData *cdata = class_data; + gchar *long_name; + + if (cdata->description) { + long_name = g_strdup_printf ("VA-API JPEG Decoder in %s", + cdata->description); + } else { + long_name = g_strdup ("VA-API JPEG Decoder"); + } + + gst_element_class_set_metadata (element_class, long_name, + "Codec/Decoder/Image/Hardware", + "VA-API based JPEG image decoder", + "Víctor Jáquez <vjaquez@igalia.com>"); + + sink_doc_caps = gst_caps_from_string (sink_caps_str); + src_doc_caps = gst_caps_from_string (src_caps_str); + + parent_class = g_type_class_peek_parent (g_class); + + /** + * GstVaJpegDec:device-path: + * + * It shows the DRM device path used for the VA operation, if any. + */ + gst_va_base_dec_class_init (GST_VA_BASE_DEC_CLASS (g_class), JPEG, + cdata->render_device_path, cdata->sink_caps, cdata->src_caps, + src_doc_caps, sink_doc_caps); + + gobject_class->dispose = gst_va_jpeg_dec_dispose; + + decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_va_jpeg_dec_negotiate); + + jpegdecoder_class->decode_scan = + GST_DEBUG_FUNCPTR (gst_va_jpeg_dec_decode_scan); + jpegdecoder_class->new_picture = + GST_DEBUG_FUNCPTR (gst_va_jpeg_dec_new_picture); + jpegdecoder_class->end_picture = + GST_DEBUG_FUNCPTR (gst_va_jpeg_dec_end_picture); + jpegdecoder_class->output_picture = + GST_DEBUG_FUNCPTR (gst_va_jpeg_dec_output_picture); + + g_free (long_name); + g_free (cdata->description); + g_free (cdata->render_device_path); + gst_caps_unref (cdata->src_caps); + gst_caps_unref (cdata->sink_caps); + g_free (cdata); +} + +static void +gst_va_jpeg_dec_init (GTypeInstance * instance, gpointer g_class) +{ + GstVaBaseDec *base = GST_VA_BASE_DEC (instance); + + gst_va_base_dec_init (base, GST_CAT_DEFAULT); + base->min_buffers = 1; +} + +static gpointer +_register_debug_category (gpointer data) +{ + GST_DEBUG_CATEGORY_INIT (gst_va_jpegdec_debug, "vajpegdec", 0, + "VA jpeg decoder"); + + return NULL; +} + +static GstCaps * +_fixup_sink_caps (GstVaDisplay * display, GstCaps * caps) +{ + if (GST_VA_DISPLAY_IS_IMPLEMENTATION (display, INTEL_I965)) { + guint i; + GstCaps *ret; + GValue sampling = G_VALUE_INIT; + const char *sampling_list = { "YCbCr-4:2:0", "YCbCr-4:2:2" }; + + ret = gst_caps_copy (caps); + gst_caps_set_simple (ret, "colorspace", G_TYPE_STRING, "sYUV", NULL); + + gst_value_list_init (&sampling, G_N_ELEMENTS (sampling_list)); + for (i = 0; i < G_N_ELEMENTS (sampling_list); i++) { + GValue samp = G_VALUE_INIT; + g_value_init (&samp, G_TYPE_STRING); + g_value_set_string (&samp, sampling_listi); + gst_value_list_append_value (&sampling, &samp); + g_value_unset (&samp); + } + + gst_caps_set_value (ret, "sampling", &sampling); + g_value_unset (&sampling); + return ret; + } + return gst_caps_ref (caps); +} + +static GstCaps * +_fixup_src_caps (GstVaDisplay * display, GstCaps * caps) +{ + if (GST_VA_DISPLAY_IS_IMPLEMENTATION (display, INTEL_IHD)) { + GstCaps *ret; + GstStructure *s; + GstCapsFeatures *f; + guint i, len; + + ret = gst_caps_copy (caps); + + len = gst_caps_get_size (ret); + for (i = 0; i < len; i++) { + s = gst_caps_get_structure (ret, i); + f = gst_caps_get_features (ret, i); + if (gst_caps_features_is_equal (f, + GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY)) { + /* rgbp is not correctly mapped into memory */ + guint i, size; + GValue out = G_VALUE_INIT; + const GValue *in = gst_structure_get_value (s, "format"); + + size = gst_value_list_get_size (in); + gst_value_list_init (&out, size); + for (i = 0; i < size; i++) { + const GValue *fmt = gst_value_list_get_value (in, i); + if (g_strcmp0 (g_value_get_string (fmt), "RGBP") != 0) + gst_value_list_append_value (&out, fmt); + } + gst_structure_set_value (s, "format", &out); + g_value_unset (&out); + } else if (gst_caps_features_contains (f, GST_CAPS_FEATURE_MEMORY_DMABUF)) { + /* dmabuf exportation only handles NV12 */ + gst_structure_set (s, "format", G_TYPE_STRING, "NV12", NULL); + } + } + + return ret; + } else if (GST_VA_DISPLAY_IS_IMPLEMENTATION (display, INTEL_I965)) { + GstCaps *ret; + GstStructure *s; + guint i, len; + + ret = gst_caps_copy (caps); + + len = gst_caps_get_size (ret); + for (i = 0; i < len; i++) { + s = gst_caps_get_structure (ret, i); + /* only NV12 works in this nigthmare */ + gst_structure_set (s, "format", G_TYPE_STRING, "NV12", NULL); + } + + return ret; + } + return gst_caps_ref (caps); +} + +gboolean +gst_va_jpeg_dec_register (GstPlugin * plugin, GstVaDevice * device, + GstCaps * sink_caps, GstCaps * src_caps, guint rank) +{ + static GOnce debug_once = G_ONCE_INIT; + GType type; + GTypeInfo type_info = { + .class_size = sizeof (GstVaJpegDecClass), + .class_init = gst_va_jpeg_dec_class_init, + .instance_size = sizeof (GstVaJpegDec), + .instance_init = gst_va_jpeg_dec_init, + }; + struct CData *cdata; + gboolean ret; + gchar *type_name, *feature_name; + + g_return_val_if_fail (GST_IS_PLUGIN (plugin), FALSE); + g_return_val_if_fail (GST_IS_VA_DEVICE (device), FALSE); + g_return_val_if_fail (GST_IS_CAPS (sink_caps), FALSE); + g_return_val_if_fail (GST_IS_CAPS (src_caps), FALSE); + + cdata = g_new (struct CData, 1); + cdata->description = NULL; + cdata->render_device_path = g_strdup (device->render_device_path); + cdata->sink_caps = _fixup_sink_caps (device->display, sink_caps); + cdata->src_caps = _fixup_src_caps (device->display, src_caps); + + /* class data will be leaked if the element never gets instantiated */ + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + type_info.class_data = cdata; + + + /* The first decoder to be registered should use a constant name, + * like vajpegdec, for any additional decoders, we create unique + * names, using inserting the render device name. */ + if (device->index == 0) { + type_name = g_strdup ("GstVaJpegDec"); + feature_name = g_strdup ("vajpegdec"); + } else { + gchar *basename = g_path_get_basename (device->render_device_path); + type_name = g_strdup_printf ("GstVa%sJpegDec", basename); + feature_name = g_strdup_printf ("va%sjpegdec", basename); + cdata->description = basename; + + /* lower rank for non-first device */ + if (rank > 0) + rank--; + } + + g_once (&debug_once, _register_debug_category, NULL); + + type = g_type_register_static (GST_TYPE_JPEG_DECODER, + type_name, &type_info, 0); + + ret = gst_element_register (plugin, feature_name, rank, type); + + g_free (type_name); + g_free (feature_name); + + return ret; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvajpegdec.h
Added
@@ -0,0 +1,33 @@ +/* GStreamer + * Copyright (C) 2022 Igalia, S.L. + * Author: Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "gstvadevice.h" + +G_BEGIN_DECLS + +gboolean gst_va_jpeg_dec_register (GstPlugin * plugin, + GstVaDevice * device, + GstCaps * sink_caps, + GstCaps * src_caps, + guint rank); + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvampeg2dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvampeg2dec.c
Changed
@@ -85,54 +85,6 @@ static const gchar *sink_caps_str = "video/x-mpeg2"; -static gboolean -gst_va_mpeg2_dec_negotiate (GstVideoDecoder * decoder) -{ - GstCapsFeatures *capsfeatures = NULL; - GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); - GstVaMpeg2Dec *self = GST_VA_MPEG2_DEC (decoder); - GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; - GstMpeg2Decoder *mpeg2dec = GST_MPEG2_DECODER (decoder); - - /* Ignore downstream renegotiation request. */ - if (!base->need_negotiation) - return TRUE; - - base->need_negotiation = FALSE; - - if (gst_va_decoder_is_open (base->decoder) - && !gst_va_decoder_close (base->decoder)) - return FALSE; - - if (!gst_va_decoder_open (base->decoder, base->profile, base->rt_format)) - return FALSE; - - if (!gst_va_decoder_set_frame_size (base->decoder, base->width, base->height)) - return FALSE; - - if (base->output_state) - gst_video_codec_state_unref (base->output_state); - - gst_va_base_dec_get_preferred_format_and_caps_features (base, &format, - &capsfeatures); - - base->output_state = - gst_video_decoder_set_output_state (decoder, format, - base->width, base->height, mpeg2dec->input_state); - - if (!self->progressive) - base->output_state->info.interlace_mode = GST_VIDEO_INTERLACE_MODE_MIXED; - - base->output_state->caps = gst_video_info_to_caps (&base->output_state->info); - if (capsfeatures) - gst_caps_set_features_simple (base->output_state->caps, capsfeatures); - - GST_INFO_OBJECT (self, "Negotiated caps %" GST_PTR_FORMAT, - base->output_state->caps); - - return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); -} - static VAProfile _map_profile (GstMpegVideoProfile profile) { @@ -220,10 +172,11 @@ const GstMpegVideoSequenceHdr * seq, const GstMpegVideoSequenceExt * seq_ext, const GstMpegVideoSequenceDisplayExt * seq_display_ext, - const GstMpegVideoSequenceScalableExt * seq_scalable_ext) + const GstMpegVideoSequenceScalableExt * seq_scalable_ext, gint max_dpb_size) { GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); GstVaMpeg2Dec *self = GST_VA_MPEG2_DEC (decoder); + GstVideoInfo *info = &base->output_info; VAProfile profile; GstMpegVideoProfile mpeg_profile; gboolean negotiation_needed = FALSE; @@ -257,8 +210,8 @@ rt_format, width, height)) { base->profile = profile; base->rt_format = rt_format; - base->width = width; - base->height = height; + GST_VIDEO_INFO_WIDTH (info) = base->width = width; + GST_VIDEO_INFO_HEIGHT (info) = base->height = height; negotiation_needed = TRUE; @@ -269,16 +222,17 @@ progressive = seq_ext ? seq_ext->progressive : 1; if (self->progressive != progressive) { self->progressive = progressive; - + GST_VIDEO_INFO_INTERLACE_MODE (info) = progressive ? + GST_VIDEO_INTERLACE_MODE_PROGRESSIVE : GST_VIDEO_INTERLACE_MODE_MIXED; negotiation_needed = TRUE; GST_INFO_OBJECT (self, "Interlaced mode changed to %d", !progressive); } base->need_valign = FALSE; - base->min_buffers = 2 + 4; /* max num pic references + scratch surfaces */ - base->need_negotiation = negotiation_needed; + g_clear_pointer (&base->input_state, gst_video_codec_state_unref); + base->input_state = gst_video_codec_state_ref (decoder->input_state); return GST_FLOW_OK; } @@ -287,20 +241,12 @@ gst_va_mpeg2_dec_new_picture (GstMpeg2Decoder * decoder, GstVideoCodecFrame * frame, GstMpeg2Picture * picture) { - GstFlowReturn ret; GstVaMpeg2Dec *self = GST_VA_MPEG2_DEC (decoder); - GstVaDecodePicture *pic; GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); - GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); - - if (base->need_negotiation) { - if (!gst_video_decoder_negotiate (vdec)) { - GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); - return GST_FLOW_NOT_NEGOTIATED; - } - } + GstVaDecodePicture *pic; + GstFlowReturn ret; - ret = gst_video_decoder_allocate_output_frame (vdec, frame); + ret = gst_va_base_dec_prepare_output_frame (base, frame); if (ret != GST_FLOW_OK) goto error; @@ -324,13 +270,13 @@ static GstFlowReturn gst_va_mpeg2_dec_new_field_picture (GstMpeg2Decoder * decoder, - const GstMpeg2Picture * first_field, GstMpeg2Picture * second_field) + GstMpeg2Picture * first_field, GstMpeg2Picture * second_field) { GstVaDecodePicture *first_pic, *second_pic; GstVaMpeg2Dec *self = GST_VA_MPEG2_DEC (decoder); GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); - first_pic = gst_mpeg2_picture_get_user_data ((GstMpeg2Picture *) first_field); + first_pic = gst_mpeg2_picture_get_user_data (first_field); if (!first_pic) return GST_FLOW_ERROR; @@ -566,33 +512,26 @@ { GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); GstVaMpeg2Dec *self = GST_VA_MPEG2_DEC (decoder); + GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); + gboolean ret; GST_LOG_OBJECT (self, "Outputting picture %p (poc %d)", picture, picture->pic_order_cnt); - if (base->copy_frames) - gst_va_base_dec_copy_output_buffer (base, frame); - - if (picture->buffer_flags != 0) { - gboolean interlaced = - (picture->buffer_flags & GST_VIDEO_BUFFER_FLAG_INTERLACED) != 0; - gboolean tff = (picture->buffer_flags & GST_VIDEO_BUFFER_FLAG_TFF) != 0; - - GST_TRACE_OBJECT (self, - "apply buffer flags 0x%x (interlaced %d, top-field-first %d)", - picture->buffer_flags, interlaced, tff); - GST_BUFFER_FLAG_SET (frame->output_buffer, picture->buffer_flags); - } - + ret = gst_va_base_dec_process_output (base, frame, picture->discont_state, + picture->buffer_flags); gst_mpeg2_picture_unref (picture); - return gst_video_decoder_finish_frame (GST_VIDEO_DECODER (self), frame); + if (ret) + return gst_video_decoder_finish_frame (vdec, frame); + return GST_FLOW_ERROR; } static void gst_va_mpeg2_dec_init (GTypeInstance * instance, gpointer g_class) { gst_va_base_dec_init (GST_VA_BASE_DEC (instance), GST_CAT_DEFAULT); + GST_VA_MPEG2_DEC (instance)->progressive = 1; } static void @@ -609,7 +548,6 @@ GObjectClass *gobject_class = G_OBJECT_CLASS (g_class); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstMpeg2DecoderClass *mpeg2decoder_class = GST_MPEG2_DECODER_CLASS (g_class); - GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_CLASS (g_class); struct CData *cdata = class_data; gchar *long_name; @@ -629,14 +567,19 @@ parent_class = g_type_class_peek_parent (g_class); + /** + * GstVaMpeg2Dec:device-path: + * + * It shows the DRM device path used for the VA operation, if any. + * + * Since: 1.22 + */ gst_va_base_dec_class_init (GST_VA_BASE_DEC_CLASS (g_class), MPEG2, cdata->render_device_path, cdata->sink_caps, cdata->src_caps, src_doc_caps, sink_doc_caps); gobject_class->dispose = gst_va_mpeg2_dec_dispose; - decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_va_mpeg2_dec_negotiate); - mpeg2decoder_class->new_sequence = GST_DEBUG_FUNCPTR (gst_va_mpeg2_dec_new_sequence); mpeg2decoder_class->new_picture = @@ -703,16 +646,14 @@ type_info.class_data = cdata; - type_name = g_strdup ("GstVaMpeg2dec"); - feature_name = g_strdup ("vampeg2dec"); - /* The first decoder to be registered should use a constant name, * like vampeg2dec, for any additional decoders, we create unique * names, using inserting the render device name. */ - if (g_type_from_name (type_name)) { + if (device->index == 0) { + type_name = g_strdup ("GstVaMpeg2Dec"); + feature_name = g_strdup ("vampeg2dec"); + } else { gchar *basename = g_path_get_basename (device->render_device_path); - g_free (type_name); - g_free (feature_name); type_name = g_strdup_printf ("GstVa%sMpeg2Dec", basename); feature_name = g_strdup_printf ("va%smpeg2dec", basename); cdata->description = basename;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvaprofile.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvaprofile.c
Changed
@@ -29,62 +29,67 @@ { VAProfile profile; GstVaCodecs codec; + const gchar *va_name; const gchar *name; const gchar *media_type; const gchar *caps_str; } profile_map = { -#define P(codec, name, media_type, caps_str) { \ - G_PASTE (G_PASTE (VAProfile, codec), name), codec, \ - G_STRINGIFY (G_PASTE (G_PASTE (VAProfile, codec), name)), \ - media_type, caps_str } - P (MPEG2, Simple, "video/mpeg", +#define P(codec, va_name, name, media_type, caps_str) { \ + G_PASTE (G_PASTE (VAProfile, codec), va_name), codec, \ + G_STRINGIFY (G_PASTE (G_PASTE (VAProfile, codec), va_name)), \ + name, media_type, caps_str } + P (MPEG2, Simple, "simple", "video/mpeg", "mpegversion = (int) 2, profile = (string) simple"), - P (MPEG2, Main, "video/mpeg", + P (MPEG2, Main, "main", "video/mpeg", "mpegversion = (int) 2, profile = (string) main"), - P (MPEG4, Simple, "video/mpeg", + P (MPEG4, Simple, "simple", "video/mpeg", "mpegversion = (int) 4, profile = (string) simple"), - P (MPEG4, AdvancedSimple, "video/mpeg", + P (MPEG4, AdvancedSimple, "advanced-simple", "video/mpeg", "mpegversion = (int) 4, profile = (string) advanced-simple"), - P (MPEG4, Main, "video/mpeg", + P (MPEG4, Main, "main", "video/mpeg", "mpegversion = (int) 4, profile = (string) main, "), - P (H264, Main, "video/x-h264", "profile = (string) { main, baseline }"), - P (H264, High, "video/x-h264", - "profile = (string) { progressive-high, constrained-high, high }"), - P (VC1, Simple, "video/x-wmv", + P (H264, Main, "main", "video/x-h264", "profile = (string) main"), + P (H264, High, "high", "video/x-h264", "profile = (string) high"), + P (VC1, Simple, "simple", "video/x-wmv", "wmvversion = (int) 3, profile = (string) simple"), - P (VC1, Main, "video/x-wmv", + P (VC1, Main, "main", "video/x-wmv", "wmvversion = (int) 3, profile = (string) main"), - P (VC1, Advanced, "video/x-wmv", + P (VC1, Advanced, "advanced", "video/x-wmv", "wmvversion = (int) 3, format = (string) WVC1, " "profile = (string) advanced"), - P (H263, Baseline, "video/x-h263", + P (H263, Baseline, "baseline", "video/x-h263", "variant = (string) itu, h263version = (string) h263, " "profile = (string) baseline"), - P (JPEG, Baseline, "image/jpeg", NULL), - P (H264, ConstrainedBaseline, "video/x-h264", - "profile = (string) { baseline, constrained-baseline }"), - P (VP8, Version0_3, "video/x-vp8", NULL), + P (JPEG, Baseline, "", "image/jpeg", "sof-marker = (int) 0"), + P (H264, ConstrainedBaseline, "constrained-baseline", "video/x-h264", + "profile = (string) constrained-baseline"), + P (VP8, Version0_3, "", "video/x-vp8", NULL), /* Unsupported profiles by current GstH264Decoder */ /* P (H264, MultiviewHigh, "video/x-h264", */ /* "profile = (string) { multiview-high, stereo-high }"), */ /* P (H264, StereoHigh, "video/x-h264", */ /* "profile = (string) { multiview-high, stereo-high }"), */ - P (HEVC, Main, "video/x-h265", "profile = (string) main"), - P (HEVC, Main10, "video/x-h265", "profile = (string) main-10"), - P (VP9, Profile0, "video/x-vp9", "profile = (string) 0"), - P (VP9, Profile1, "video/x-vp9", "profile = (string) 1"), - P (VP9, Profile2, "video/x-vp9", "profile = (string) 2"), - P (VP9, Profile3, "video/x-vp9", "profile = (string) 3"), - P (HEVC, Main12, "video/x-h265", "profile = (string) main-12"), - P (HEVC, Main422_10, "video/x-h265", "profile = (string) main-422-10"), - P (HEVC, Main422_12, "video/x-h265", "profile = (string) main-422-12"), - P (HEVC, Main444, "video/x-h265", "profile = (string) main-444"), - P (HEVC, Main444_10, "video/x-h265", "profile = (string) main-444-10"), - P (HEVC, Main444_12, "video/x-h265", "profile = (string) main-444-12"), - P (HEVC, SccMain, "video/x-h265", "profile = (string) screen-extended-main"), - P (HEVC, SccMain10, "video/x-h265", + P (HEVC, Main, "main", "video/x-h265", "profile = (string) main"), + P (HEVC, Main10, "main-10", "video/x-h265", "profile = (string) main-10"), + P (VP9, Profile0, "0", "video/x-vp9", "profile = (string) 0"), + P (VP9, Profile1, "1", "video/x-vp9", "profile = (string) 1"), + P (VP9, Profile2, "2", "video/x-vp9", "profile = (string) 2"), + P (VP9, Profile3, "3", "video/x-vp9", "profile = (string) 3"), + P (HEVC, Main12, "main-12", "video/x-h265", "profile = (string) main-12"), + P (HEVC, Main422_10, "main-422-10", "video/x-h265", + "profile = (string) main-422-10"), + P (HEVC, Main422_12, "main-422-12", "video/x-h265", + "profile = (string) main-422-12"), + P (HEVC, Main444, "main-444", "video/x-h265", "profile = (string) main-444"), + P (HEVC, Main444_10, "main-444-10", "video/x-h265", + "profile = (string) main-444-10"), + P (HEVC, Main444_12, "main-444-12", "video/x-h265", + "profile = (string) main-444-12"), + P (HEVC, SccMain, "screen-extended-main", "video/x-h265", + "profile = (string) screen-extended-main"), + P (HEVC, SccMain10, "screen-extended-main-10", "video/x-h265", "profile = (string) screen-extended-main-10"), - P (HEVC, SccMain444, "video/x-h265", + P (HEVC, SccMain444, "screen-extended-main-444", "video/x-h265", "profile = (string) screen-extended-main-444"), #if VA_CHECK_VERSION(1,7,0) /* Spec A.2: @@ -103,11 +108,11 @@ So far, all va decoders can support "0" when they support "1", we just map "0" to "main" and "1" to "high". */ - P (AV1, Profile0, "video/x-av1", "profile = (string) main"), - P (AV1, Profile1, "video/x-av1", "profile = (string) high"), + P (AV1, Profile0, "main", "video/x-av1", "profile = (string) main"), + P (AV1, Profile1, "high", "video/x-av1", "profile = (string) high"), #endif #if VA_CHECK_VERSION(1, 8, 0) - P (HEVC, SccMain444_10, "video/x-h265", + P (HEVC, SccMain444_10, "screen-extended-main-444-10", "video/x-h265", "profile = (string) screen-extended-main-444-10"), #endif #undef P @@ -138,7 +143,21 @@ gst_va_profile_name (VAProfile profile) { const struct ProfileMap *map = get_profile_map (profile); - return map ? map->name : NULL; + return map ? map->va_name : NULL; +} + +VAProfile +gst_va_profile_from_name (GstVaCodecs codec, const gchar * name) +{ + int i; + + for (i = 0; i < G_N_ELEMENTS (profile_map); i++) { + if (profile_mapi.codec == codec && + g_strcmp0 (profile_mapi.name, name) == 0) + return profile_mapi.profile; + } + + return VAProfileNone; } GstCaps *
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvaprofile.h -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvaprofile.h
Changed
@@ -42,5 +42,7 @@ guint32 gst_va_profile_codec (VAProfile profile); GstCaps * gst_va_profile_caps (VAProfile profile); const gchar * gst_va_profile_name (VAProfile profile); +VAProfile gst_va_profile_from_name (GstVaCodecs codec, + const gchar * name); G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvavp8dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvavp8dec.c
Changed
@@ -69,8 +69,6 @@ struct _GstVaVp8Dec { GstVaBaseDec parent; - - GstFlowReturn last_ret; }; static GstElementClass *parent_class = NULL; @@ -84,51 +82,6 @@ static const gchar *sink_caps_str = "video/x-vp8"; -static gboolean -gst_va_vp8_dec_negotiate (GstVideoDecoder * decoder) -{ - GstCapsFeatures *capsfeatures = NULL; - GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); - GstVaVp8Dec *self = GST_VA_VP8_DEC (decoder); - GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; - GstVp8Decoder *vp8dec = GST_VP8_DECODER (decoder); - - /* Ignore downstream renegotiation request. */ - if (!base->need_negotiation) - return TRUE; - - base->need_negotiation = FALSE; - - if (gst_va_decoder_is_open (base->decoder) - && !gst_va_decoder_close (base->decoder)) - return FALSE; - - if (!gst_va_decoder_open (base->decoder, base->profile, base->rt_format)) - return FALSE; - - if (!gst_va_decoder_set_frame_size (base->decoder, base->width, base->height)) - return FALSE; - - if (base->output_state) - gst_video_codec_state_unref (base->output_state); - - gst_va_base_dec_get_preferred_format_and_caps_features (base, &format, - &capsfeatures); - - base->output_state = - gst_video_decoder_set_output_state (decoder, format, - base->width, base->height, vp8dec->input_state); - - base->output_state->caps = gst_video_info_to_caps (&base->output_state->info); - if (capsfeatures) - gst_caps_set_features_simple (base->output_state->caps, capsfeatures); - - GST_INFO_OBJECT (self, "Negotiated caps %" GST_PTR_FORMAT, - base->output_state->caps); - - return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); -} - static VAProfile _get_profile (GstVaVp8Dec * self, const GstVp8FrameHdr * frame_hdr) { @@ -143,10 +96,11 @@ static GstFlowReturn gst_va_vp8_dec_new_sequence (GstVp8Decoder * decoder, - const GstVp8FrameHdr * frame_hdr) + const GstVp8FrameHdr * frame_hdr, gint max_dpb_size) { GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); GstVaVp8Dec *self = GST_VA_VP8_DEC (decoder); + GstVideoInfo *info = &base->output_info; VAProfile profile; guint rt_format; gboolean negotiation_needed = FALSE; @@ -169,15 +123,16 @@ if (!gst_va_decoder_config_is_equal (base->decoder, profile, rt_format, frame_hdr->width, frame_hdr->height)) { base->profile = profile; - base->width = frame_hdr->width; - base->height = frame_hdr->height; + GST_VIDEO_INFO_WIDTH (info) = base->width = frame_hdr->width; + GST_VIDEO_INFO_HEIGHT (info) = base->height = frame_hdr->height; base->rt_format = rt_format; negotiation_needed = TRUE; } base->min_buffers = 3 + 4; /* max num pic references + scratch surfaces */ - base->need_negotiation = negotiation_needed; + g_clear_pointer (&base->input_state, gst_video_codec_state_unref); + base->input_state = gst_video_codec_state_ref (decoder->input_state); return GST_FLOW_OK; } @@ -188,18 +143,11 @@ { GstVaVp8Dec *self = GST_VA_VP8_DEC (decoder); GstVaDecodePicture *pic; - GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); + GstFlowReturn ret; - if (base->need_negotiation) { - if (!gst_video_decoder_negotiate (vdec)) { - GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); - return GST_FLOW_NOT_NEGOTIATED; - } - } - - self->last_ret = gst_video_decoder_allocate_output_frame (vdec, frame); - if (self->last_ret != GST_FLOW_OK) + ret = gst_va_base_dec_prepare_output_frame (base, frame); + if (ret != GST_FLOW_OK) goto error; pic = gst_va_decode_picture_new (base->decoder, frame->output_buffer); @@ -216,8 +164,8 @@ { GST_WARNING_OBJECT (self, "Failed to allocated output buffer, return %s", - gst_flow_get_name (self->last_ret)); - return self->last_ret; + gst_flow_get_name (ret)); + return ret; } } @@ -443,23 +391,19 @@ { GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); GstVaVp8Dec *self = GST_VA_VP8_DEC (decoder); + GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); + gboolean ret; GST_LOG_OBJECT (self, "Outputting picture %p (system_frame_number %d)", picture, picture->system_frame_number); - if (self->last_ret != GST_FLOW_OK) { - gst_vp8_picture_unref (picture); - gst_video_decoder_drop_frame (GST_VIDEO_DECODER (self), frame); - return self->last_ret; - } - - if (base->copy_frames) - gst_va_base_dec_copy_output_buffer (base, frame); - + ret = gst_va_base_dec_process_output (base, frame, picture->discont_state, 0); gst_vp8_picture_unref (picture); - return gst_video_decoder_finish_frame (GST_VIDEO_DECODER (self), frame); + if (ret) + return gst_video_decoder_finish_frame (vdec, frame); + return GST_FLOW_ERROR; } static void @@ -482,7 +426,6 @@ GObjectClass *gobject_class = G_OBJECT_CLASS (g_class); GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); GstVp8DecoderClass *vp8decoder_class = GST_VP8_DECODER_CLASS (g_class); - GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_CLASS (g_class); struct CData *cdata = class_data; gchar *long_name; @@ -502,14 +445,19 @@ parent_class = g_type_class_peek_parent (g_class); + /** + * GstVaVp8Dec:device-path: + * + * It shows the DRM device path used for the VA operation, if any. + * + * Since: 1.22 + */ gst_va_base_dec_class_init (GST_VA_BASE_DEC_CLASS (g_class), VP8, cdata->render_device_path, cdata->sink_caps, cdata->src_caps, src_doc_caps, sink_doc_caps); gobject_class->dispose = gst_va_vp8_dec_dispose; - decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_va_vp8_dec_negotiate); - vp8decoder_class->new_sequence = GST_DEBUG_FUNCPTR (gst_va_vp8_dec_new_sequence); vp8decoder_class->new_picture = @@ -572,17 +520,15 @@ type_info.class_data = cdata; - type_name = g_strdup ("GstVaVp8dec"); - feature_name = g_strdup ("vavp8dec"); - /* The first decoder to be registered should use a constant name, * like vavp8dec, for any additional decoders, we create unique * names, using inserting the render device name. */ - if (g_type_from_name (type_name)) { + if (device->index == 0) { + type_name = g_strdup ("GstVaVp8Dec"); + feature_name = g_strdup ("vavp8dec"); + } else { gchar *basename = g_path_get_basename (device->render_device_path); - g_free (type_name); - g_free (feature_name); - type_name = g_strdup_printf ("GstVa%sVP8Dec", basename); + type_name = g_strdup_printf ("GstVa%sVp8Dec", basename); feature_name = g_strdup_printf ("va%svp8dec", basename); cdata->description = basename;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvavp9dec.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvavp9dec.c
Changed
@@ -145,10 +145,11 @@ static GstFlowReturn gst_va_vp9_new_sequence (GstVp9Decoder * decoder, - const GstVp9FrameHeader * frame_hdr) + const GstVp9FrameHeader * frame_hdr, gint max_dpb_size) { GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); GstVaVp9Dec *self = GST_VA_VP9_DEC (decoder); + GstVideoInfo *info = &base->output_info; VAProfile profile; gboolean negotiation_needed = FALSE; guint rt_format; @@ -171,15 +172,16 @@ if (!gst_va_decoder_config_is_equal (base->decoder, profile, rt_format, frame_hdr->width, frame_hdr->height)) { base->profile = profile; - base->width = frame_hdr->width; - base->height = frame_hdr->height; + GST_VIDEO_INFO_WIDTH (info) = base->width = frame_hdr->width; + GST_VIDEO_INFO_HEIGHT (info) = base->height = frame_hdr->height; base->rt_format = rt_format; negotiation_needed = TRUE; } base->min_buffers = GST_VP9_REF_FRAMES; - base->need_negotiation = negotiation_needed; + g_clear_pointer (&base->input_state, gst_video_codec_state_unref); + base->input_state = gst_video_codec_state_ref (decoder->input_state); return GST_FLOW_OK; } @@ -188,11 +190,12 @@ _check_resolution_change (GstVaVp9Dec * self, GstVp9Picture * picture) { GstVaBaseDec *base = GST_VA_BASE_DEC (self); + GstVideoInfo *info = &base->output_info; const GstVp9FrameHeader *frame_hdr = &picture->frame_hdr; if ((base->width != frame_hdr->width) || base->height != frame_hdr->height) { - base->width = frame_hdr->width; - base->height = frame_hdr->height; + GST_VIDEO_INFO_WIDTH (info) = base->width = frame_hdr->width; + GST_VIDEO_INFO_HEIGHT (info) = base->height = frame_hdr->height; base->need_negotiation = TRUE; if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { @@ -216,21 +219,13 @@ GstFlowReturn ret; GstVaVp9Dec *self = GST_VA_VP9_DEC (decoder); GstVaDecodePicture *pic; - GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); ret = _check_resolution_change (self, picture); if (ret != GST_FLOW_OK) return ret; - if (base->need_negotiation) { - if (!gst_video_decoder_negotiate (vdec)) { - GST_ERROR_OBJECT (self, "Failed to negotiate with downstream"); - return GST_FLOW_NOT_NEGOTIATED; - } - } - - ret = gst_video_decoder_allocate_output_frame (vdec, frame); + ret = gst_va_base_dec_prepare_output_frame (base, frame); if (ret != GST_FLOW_OK) goto error; @@ -506,15 +501,17 @@ { GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); GstVaVp9Dec *self = GST_VA_VP9_DEC (decoder); + GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); + gboolean ret; GST_LOG_OBJECT (self, "Outputting picture %p", picture); - if (base->copy_frames) - gst_va_base_dec_copy_output_buffer (base, frame); - + ret = gst_va_base_dec_process_output (base, frame, picture->discont_state, 0); gst_vp9_picture_unref (picture); - return gst_video_decoder_finish_frame (GST_VIDEO_DECODER (self), frame); + if (ret) + return gst_video_decoder_finish_frame (vdec, frame); + return GST_FLOW_ERROR; } static GstVp9Picture * @@ -546,11 +543,8 @@ static gboolean gst_va_vp9_dec_negotiate (GstVideoDecoder * decoder) { - GstCapsFeatures *capsfeatures = NULL; GstVaBaseDec *base = GST_VA_BASE_DEC (decoder); GstVaVp9Dec *self = GST_VA_VP9_DEC (decoder); - GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; - GstVp9Decoder *vp9dec = GST_VP9_DECODER (decoder); gboolean need_open; /* Ignore downstream renegotiation request. */ @@ -596,22 +590,8 @@ return FALSE; } - if (base->output_state) - gst_video_codec_state_unref (base->output_state); - - gst_va_base_dec_get_preferred_format_and_caps_features (base, &format, - &capsfeatures); - - base->output_state = - gst_video_decoder_set_output_state (decoder, format, - base->width, base->height, vp9dec->input_state); - - base->output_state->caps = gst_video_info_to_caps (&base->output_state->info); - if (capsfeatures) - gst_caps_set_features_simple (base->output_state->caps, capsfeatures); - - GST_INFO_OBJECT (self, "Negotiated caps %" GST_PTR_FORMAT, - base->output_state->caps); + if (!gst_va_base_dec_set_output_state (base)) + return FALSE; return GST_VIDEO_DECODER_CLASS (parent_class)->negotiate (decoder); } @@ -650,6 +630,13 @@ parent_class = g_type_class_peek_parent (g_class); + /** + * GstVaVp9Dec:device-path: + * + * It shows the DRM device path used for the VA operation, if any. + * + * Since: 1.22 + */ gst_va_base_dec_class_init (GST_VA_BASE_DEC_CLASS (g_class), VP9, cdata->render_device_path, cdata->sink_caps, cdata->src_caps, src_doc_caps, sink_doc_caps); @@ -731,16 +718,14 @@ type_info.class_data = cdata; - type_name = g_strdup ("GstVaVp9Dec"); - feature_name = g_strdup ("vavp9dec"); - /* The first decoder to be registered should use a constant name, * like vavp9dec, for any additional decoders, we create unique * names, using inserting the render device name. */ - if (g_type_from_name (type_name)) { + if (device->index == 0) { + type_name = g_strdup ("GstVaVp9Dec"); + feature_name = g_strdup ("vavp9dec"); + } else { gchar *basename = g_path_get_basename (device->render_device_path); - g_free (type_name); - g_free (feature_name); type_name = g_strdup_printf ("GstVa%sVp9Dec", basename); feature_name = g_strdup_printf ("va%svp9dec", basename); cdata->description = basename;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/gstvavpp.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/gstvavpp.c
Changed
@@ -56,28 +56,20 @@ * */ -/* ToDo: - * - * + HDR tone mapping - */ - #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstvavpp.h" +#include <gst/va/gstva.h> #include <gst/video/video.h> - #include <va/va_drmcommon.h> -#include "gstvaallocator.h" #include "gstvabasetransform.h" #include "gstvacaps.h" #include "gstvadisplay_priv.h" #include "gstvafilter.h" -#include "gstvapool.h" -#include "gstvautils.h" GST_DEBUG_CATEGORY_STATIC (gst_va_vpp_debug); #define GST_CAT_DEFAULT gst_va_vpp_debug @@ -121,6 +113,11 @@ gboolean add_borders; gint borders_h; gint borders_w; + guint32 scale_method; + + gboolean hdr_mapping; + gboolean has_hdr_meta; + VAHdrMetaDataHDR10 hdr_meta; GList *channels; }; @@ -133,6 +130,18 @@ gchar *description; }; +enum +{ + PROP_DISABLE_PASSTHROUGH = GST_VA_FILTER_PROP_LAST + 1, + PROP_ADD_BORDERS, + PROP_SCALE_METHOD, + N_PROPERTIES +}; + +static GParamSpec *propertiesN_PROPERTIES - GST_VA_FILTER_PROP_LAST; + +#define PROPERTIES(idx) propertiesidx - GST_VA_FILTER_PROP_LAST + /* convertions that disable passthrough */ enum { @@ -234,6 +243,9 @@ } else { self->op_flags &= ~VPP_CONVERT_DIRECTION; } + + if (!gst_va_filter_set_scale_method (btrans->filter, self->scale_method)) + GST_WARNING_OBJECT (self, "could not set the filter scale method."); } static void @@ -294,7 +306,11 @@ self->auto_contrast = g_value_get_boolean (value); g_atomic_int_set (&self->rebuild_filters, TRUE); break; - case GST_VA_FILTER_PROP_DISABLE_PASSTHROUGH:{ + case GST_VA_FILTER_PROP_HDR: + self->hdr_mapping = g_value_get_boolean (value); + g_atomic_int_set (&self->rebuild_filters, TRUE); + break; + case PROP_DISABLE_PASSTHROUGH:{ gboolean disable_passthrough = g_value_get_boolean (value); if (disable_passthrough) self->op_flags |= VPP_CONVERT_DUMMY; @@ -302,9 +318,12 @@ self->op_flags &= ~VPP_CONVERT_DUMMY; break; } - case GST_VA_FILTER_PROP_ADD_BORDERS: + case PROP_ADD_BORDERS: self->add_borders = g_value_get_boolean (value); break; + case PROP_SCALE_METHOD: + self->scale_method = g_value_get_enum (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -360,12 +379,18 @@ case GST_VA_FILTER_PROP_AUTO_CONTRAST: g_value_set_boolean (value, self->auto_contrast); break; - case GST_VA_FILTER_PROP_DISABLE_PASSTHROUGH: + case GST_VA_FILTER_PROP_HDR: + g_value_set_boolean (value, self->hdr_mapping); + break; + case PROP_DISABLE_PASSTHROUGH: g_value_set_boolean (value, (self->op_flags & VPP_CONVERT_DUMMY)); break; - case GST_VA_FILTER_PROP_ADD_BORDERS: + case PROP_ADD_BORDERS: g_value_set_boolean (value, self->add_borders); break; + case PROP_SCALE_METHOD: + g_value_set_enum (value, self->scale_method); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -394,6 +419,47 @@ _update_properties_unlocked (self); } +static void +_set_hdr_metadata (GstVaVpp * self, GstCaps * caps) +{ + GstVideoMasteringDisplayInfo mdinfo; + GstVideoContentLightLevel llevel; + + self->has_hdr_meta = FALSE; + + if (gst_video_mastering_display_info_from_caps (&mdinfo, caps)) { + self->hdr_meta.display_primaries_x0 = mdinfo.display_primaries1.x; + self->hdr_meta.display_primaries_x1 = mdinfo.display_primaries2.x; + self->hdr_meta.display_primaries_x2 = mdinfo.display_primaries0.x; + + self->hdr_meta.display_primaries_y0 = mdinfo.display_primaries1.y; + self->hdr_meta.display_primaries_y1 = mdinfo.display_primaries2.y; + self->hdr_meta.display_primaries_y2 = mdinfo.display_primaries0.y; + + self->hdr_meta.white_point_x = mdinfo.white_point.x; + self->hdr_meta.white_point_y = mdinfo.white_point.y; + + self->hdr_meta.max_display_mastering_luminance = + mdinfo.max_display_mastering_luminance; + self->hdr_meta.min_display_mastering_luminance = + mdinfo.min_display_mastering_luminance; + + self->has_hdr_meta = TRUE; + } + + + if (gst_video_content_light_level_from_caps (&llevel, caps)) { + self->hdr_meta.max_content_light_level = llevel.max_content_light_level; + self->hdr_meta.max_pic_average_light_level = + llevel.max_frame_average_light_level; + + self->has_hdr_meta = TRUE; + }; + + /* rebuild filters only if hdr mapping is enabled */ + g_atomic_int_set (&self->rebuild_filters, self->hdr_mapping); +} + static gboolean gst_va_vpp_set_info (GstVaBaseTransform * btrans, GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info) @@ -461,8 +527,14 @@ } } - if (!gst_video_info_is_equal (in_info, out_info)) { - if (GST_VIDEO_INFO_FORMAT (in_info) != GST_VIDEO_INFO_FORMAT (out_info)) + if (gst_video_info_is_equal (in_info, out_info)) { + self->op_flags &= ~VPP_CONVERT_FORMAT & ~VPP_CONVERT_SIZE; + } else { + if ((GST_VIDEO_INFO_FORMAT (in_info) != GST_VIDEO_INFO_FORMAT (out_info)) + || !gst_video_colorimetry_is_equivalent (&GST_VIDEO_INFO_COLORIMETRY + (in_info), GST_VIDEO_INFO_COMP_DEPTH (in_info, 0), + &GST_VIDEO_INFO_COLORIMETRY (out_info), + GST_VIDEO_INFO_COMP_DEPTH (out_info, 0))) self->op_flags |= VPP_CONVERT_FORMAT; else self->op_flags &= ~VPP_CONVERT_FORMAT; @@ -473,8 +545,6 @@ self->op_flags |= VPP_CONVERT_SIZE; else self->op_flags &= ~VPP_CONVERT_SIZE; - } else { - self->op_flags &= ~VPP_CONVERT_FORMAT & ~VPP_CONVERT_SIZE; } infeat = gst_caps_get_features (incaps, 0); @@ -485,6 +555,7 @@ self->op_flags &= ~VPP_CONVERT_FEATURE; if (gst_va_filter_set_video_info (btrans->filter, in_info, out_info)) { + _set_hdr_metadata (self, incaps); gst_va_vpp_update_passthrough (self, FALSE); return TRUE; } @@ -612,13 +683,51 @@ return FALSE; } +static inline gboolean +_add_filter_hdr_buffer (GstVaVpp * self, + const VAProcFilterCapHighDynamicRange * caps) +{ + GstVaBaseTransform *btrans = GST_VA_BASE_TRANSFORM (self); + /* *INDENT-OFF* */ + VAProcFilterParameterBufferHDRToneMapping params = { + .type = VAProcFilterHighDynamicRangeToneMapping, + .data = { + .metadata_type = VAProcHighDynamicRangeMetadataHDR10, + .metadata = &self->hdr_meta, + .metadata_size = sizeof (self->hdr_meta), + }, + }; + /* *INDENT-ON* */ + + /* if not has hdr meta, it may try later again */ + if (!(self->has_hdr_meta && self->hdr_mapping)) + return FALSE; + + if (!(caps && caps->metadata_type == VAProcHighDynamicRangeMetadataHDR10 + && (caps->caps_flag & VA_TONE_MAPPING_HDR_TO_SDR))) + goto bail; + + if (self->op_flags & VPP_CONVERT_FORMAT) { + GST_WARNING_OBJECT (self, "Cannot apply HDR with color conversion"); + goto bail; + } + + return gst_va_filter_add_filter_buffer (btrans->filter, ¶ms, + sizeof (params), 1); + +bail: + self->hdr_mapping = FALSE; + g_object_notify (G_OBJECT (self), "hdr-tone-mapping"); + return FALSE; +} + static void _build_filters (GstVaVpp * self) { GstVaBaseTransform *btrans = GST_VA_BASE_TRANSFORM (self); static const VAProcFilterType filter_types = { VAProcFilterNoiseReduction, VAProcFilterSharpening, VAProcFilterSkinToneEnhancement, - VAProcFilterColorBalance, + VAProcFilterColorBalance, VAProcFilterHighDynamicRangeToneMapping, }; guint i, num_caps; gboolean apply = FALSE; @@ -642,6 +751,8 @@ case VAProcFilterColorBalance: apply |= _add_filter_cb_buffer (self, caps, num_caps); break; + case VAProcFilterHighDynamicRangeToneMapping: + apply |= _add_filter_hdr_buffer (self, caps); default: break; } @@ -734,6 +845,7 @@ if (!gst_va_filter_process (btrans->filter, &src, &dst)) { gst_buffer_set_flags (outbuf, GST_BUFFER_FLAG_CORRUPTED); + res = GST_BASE_TRANSFORM_FLOW_DROPPED; } gst_buffer_unref (buf); @@ -1715,6 +1827,30 @@ } } +static void +update_hdr_fields (GstVaVpp * self, GstCaps * result) +{ + GstStructure *s = gst_caps_get_structure (result, 0); + GstVideoInfo out_info; + gboolean have_colorimetry; + + gst_structure_remove_fields (s, "mastering-display-info", + "content-light-level", "hdr-format", NULL); + + have_colorimetry = gst_structure_has_field (s, "colorimetry"); + if (!have_colorimetry) { + if (gst_video_info_from_caps (&out_info, result)) { + gchar *colorimetry_str = + gst_video_colorimetry_to_string (&out_info.colorimetry); + gst_caps_set_simple (result, "colorimetry", G_TYPE_STRING, + colorimetry_str, NULL); + g_free (colorimetry_str); + } else { + GST_WARNING_OBJECT (self, "Failed to convert src pad caps to video info"); + } + } +} + static GstCaps * gst_va_vpp_fixate_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) @@ -1742,12 +1878,14 @@ result = gst_caps_fixate (result); if (direction == GST_PAD_SINK) { - if (gst_caps_is_subset (caps, result)) { + if (self->hdr_mapping) + update_hdr_fields (self, result); + + /* Try and preserve input colorimetry / chroma information */ + transfer_colorimetry_from_input (self, caps, result); + + if (gst_caps_is_subset (caps, result)) gst_caps_replace (&result, caps); - } else { - /* Try and preserve input colorimetry / chroma information */ - transfer_colorimetry_from_input (self, caps, result); - } } GST_DEBUG_OBJECT (self, "fixated othercaps to %" GST_PTR_FORMAT, result); @@ -1759,10 +1897,10 @@ _get_scale_factor (GstVaVpp * self, gdouble * w_factor, gdouble * h_factor) { GstVaBaseTransform *btrans = GST_VA_BASE_TRANSFORM (self); - gdouble w = GST_VIDEO_INFO_WIDTH (&btrans->in_info); - gdouble h = GST_VIDEO_INFO_HEIGHT (&btrans->in_info); + gdouble w = GST_VIDEO_INFO_WIDTH (&btrans->out_info); + gdouble h = GST_VIDEO_INFO_HEIGHT (&btrans->out_info); - switch (self->direction) { + switch (gst_va_filter_get_orientation (btrans->filter)) { case GST_VIDEO_ORIENTATION_90R: case GST_VIDEO_ORIENTATION_90L: case GST_VIDEO_ORIENTATION_UR_LL: @@ -1776,10 +1914,10 @@ break; } - *w_factor = GST_VIDEO_INFO_WIDTH (&btrans->out_info); + *w_factor = GST_VIDEO_INFO_WIDTH (&btrans->in_info); *w_factor /= w; - *h_factor = GST_VIDEO_INFO_HEIGHT (&btrans->out_info); + *h_factor = GST_VIDEO_INFO_HEIGHT (&btrans->in_info); *h_factor /= h; } @@ -1788,7 +1926,6 @@ { GstVaVpp *self = GST_VA_VPP (trans); GstVaBaseTransform *btrans = GST_VA_BASE_TRANSFORM (trans); - GstStructure *structure; const GstVideoInfo *in_info = &btrans->in_info, *out_info = &btrans->out_info; gdouble new_x = 0, new_y = 0, x = 0, y = 0, w_factor = 1, h_factor = 1; gboolean ret; @@ -1802,44 +1939,41 @@ || gst_va_filter_get_orientation (btrans->filter) != GST_VIDEO_ORIENTATION_IDENTITY) { - event = - GST_EVENT (gst_mini_object_make_writable (GST_MINI_OBJECT (event))); - - structure = (GstStructure *) gst_event_get_structure (event); - if (!gst_structure_get_double (structure, "pointer_x", &x) - || !gst_structure_get_double (structure, "pointer_y", &y)) + if (!gst_navigation_event_get_coordinates (event, &x, &y)) break; + event = gst_event_make_writable (event); + /* video-direction compensation */ - switch (self->direction) { + switch (gst_va_filter_get_orientation (btrans->filter)) { case GST_VIDEO_ORIENTATION_90R: new_x = y; - new_y = GST_VIDEO_INFO_WIDTH (in_info) - 1 - x; + new_y = GST_VIDEO_INFO_WIDTH (out_info) - 1 - x; break; case GST_VIDEO_ORIENTATION_90L: - new_x = GST_VIDEO_INFO_HEIGHT (in_info) - 1 - y; + new_x = GST_VIDEO_INFO_HEIGHT (out_info) - 1 - y; new_y = x; break; - case GST_VIDEO_ORIENTATION_UR_LL: - new_x = GST_VIDEO_INFO_HEIGHT (in_info) - 1 - y; - new_y = GST_VIDEO_INFO_WIDTH (in_info) - 1 - x; - break; case GST_VIDEO_ORIENTATION_UL_LR: new_x = y; new_y = x; break; + case GST_VIDEO_ORIENTATION_UR_LL: + new_x = GST_VIDEO_INFO_HEIGHT (out_info) - 1 - y; + new_y = GST_VIDEO_INFO_WIDTH (out_info) - 1 - x; + break; case GST_VIDEO_ORIENTATION_180: /* FIXME: is this correct? */ - new_x = GST_VIDEO_INFO_WIDTH (in_info) - 1 - x; - new_y = GST_VIDEO_INFO_HEIGHT (in_info) - 1 - y; + new_x = GST_VIDEO_INFO_WIDTH (out_info) - 1 - x; + new_y = GST_VIDEO_INFO_HEIGHT (out_info) - 1 - y; break; case GST_VIDEO_ORIENTATION_HORIZ: - new_x = GST_VIDEO_INFO_WIDTH (in_info) - 1 - x; + new_x = GST_VIDEO_INFO_WIDTH (out_info) - 1 - x; new_y = y; break; case GST_VIDEO_ORIENTATION_VERT: new_x = x; - new_y = GST_VIDEO_INFO_HEIGHT (in_info) - 1 - y; + new_y = GST_VIDEO_INFO_HEIGHT (out_info) - 1 - y; break; default: new_x = x; @@ -1855,8 +1989,7 @@ /* crop compensation is done by videocrop */ GST_TRACE_OBJECT (self, "from %fx%f to %fx%f", x, y, new_x, new_y); - gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, new_x, - "pointer_y", G_TYPE_DOUBLE, new_y, NULL); + gst_navigation_event_set_coordinates (event, new_x, new_y); } break; default: @@ -1873,38 +2006,20 @@ { GstVaVpp *self = GST_VA_VPP (trans); GstTagList *taglist; - gchar *orientation; + GstVideoOrientationMethod method; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_TAG: gst_event_parse_tag (event, &taglist); - if (!gst_tag_list_get_string (taglist, "image-orientation", &orientation)) - break; - if (self->direction != GST_VIDEO_ORIENTATION_AUTO) break; - GST_DEBUG_OBJECT (self, "tag orientation %s", orientation); + if (!gst_video_orientation_from_tag (taglist, &method)) + break; GST_OBJECT_LOCK (self); - if (!g_strcmp0 ("rotate-0", orientation)) - self->tag_direction = GST_VIDEO_ORIENTATION_IDENTITY; - else if (!g_strcmp0 ("rotate-90", orientation)) - self->tag_direction = GST_VIDEO_ORIENTATION_90R; - else if (!g_strcmp0 ("rotate-180", orientation)) - self->tag_direction = GST_VIDEO_ORIENTATION_180; - else if (!g_strcmp0 ("rotate-270", orientation)) - self->tag_direction = GST_VIDEO_ORIENTATION_90L; - else if (!g_strcmp0 ("flip-rotate-0", orientation)) - self->tag_direction = GST_VIDEO_ORIENTATION_HORIZ; - else if (!g_strcmp0 ("flip-rotate-90", orientation)) - self->tag_direction = GST_VIDEO_ORIENTATION_UL_LR; - else if (!g_strcmp0 ("flip-rotate-180", orientation)) - self->tag_direction = GST_VIDEO_ORIENTATION_VERT; - else if (!g_strcmp0 ("flip-rotate-270", orientation)) - self->tag_direction = GST_VIDEO_ORIENTATION_UR_LL; - + self->tag_direction = method; _update_properties_unlocked (self); GST_OBJECT_UNLOCK (self); @@ -1919,6 +2034,55 @@ } static void +_install_static_properties (GObjectClass * klass) +{ + /** + * GstVaPostProc:disable-passthrough: + * + * If set to %TRUE the filter will not enable passthrough mode, thus + * each frame will be processed. It's useful for cropping, for + * example. + * + * Since: 1.20 + */ + PROPERTIES (PROP_DISABLE_PASSTHROUGH) = + g_param_spec_boolean ("disable-passthrough", "Disable Passthrough", + "Forces passing buffers through the postprocessor", FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY); + g_object_class_install_property (klass, PROP_DISABLE_PASSTHROUGH, + PROPERTIES (PROP_DISABLE_PASSTHROUGH)); + + /** + * GstVaPostProc:add-borders: + * + * If set to %TRUE the filter will add black borders if necessary to + * keep the display aspect ratio. + * + * Since: 1.20 + */ + PROPERTIES (PROP_ADD_BORDERS) = g_param_spec_boolean ("add-borders", + "Add Borders", + "Add black borders if necessary to keep the display aspect ratio", FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_PLAYING); + g_object_class_install_property (klass, PROP_ADD_BORDERS, + PROPERTIES (PROP_ADD_BORDERS)); + + /** + * GstVaPostProc:scale-method + * + * Sets the scale method algorithm to use when resizing. + * + * Since: 1.22 + */ + PROPERTIES (PROP_SCALE_METHOD) = g_param_spec_enum ("scale-method", + "Scale Method", "Scale method to use", GST_TYPE_VA_SCALE_METHOD, + VA_FILTER_SCALING_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS + | GST_PARAM_MUTABLE_PLAYING); + g_object_class_install_property (klass, PROP_SCALE_METHOD, + PROPERTIES (PROP_SCALE_METHOD)); +} + +static void gst_va_vpp_class_init (gpointer g_class, gpointer class_data) { GstCaps *doc_caps, *caps = NULL; @@ -1931,6 +2095,7 @@ GstVaFilter *filter; struct CData *cdata = class_data; gchar *long_name; + GString *klass; parent_class = g_type_class_peek_parent (g_class); @@ -1943,10 +2108,7 @@ long_name = g_strdup ("VA-API Video Postprocessor"); } - gst_element_class_set_metadata (element_class, long_name, - "Filter/Converter/Video/Scaler/Hardware", - "VA-API based video postprocessor", - "Víctor Jáquez <vjaquez@igalia.com>"); + klass = g_string_new ("Converter/Filter/Colorspace/Scaler/Video/Hardware"); display = gst_va_display_drm_new_from_path (btrans_class->render_device_path); filter = gst_va_filter_new (display); @@ -1960,10 +2122,32 @@ gst_caps_set_features_simple (any_caps, gst_caps_features_new_any ()); caps = gst_caps_merge (caps, any_caps); } + + /* add converter klass */ + { + int i; + VAProcFilterType types = { VAProcFilterColorBalance, + VAProcFilterSkinToneEnhancement, VAProcFilterSharpening, + VAProcFilterNoiseReduction + }; + + for (i = 0; i < G_N_ELEMENTS (types); i++) { + if (gst_va_filter_has_filter (filter, typesi)) { + g_string_prepend (klass, "Effect/"); + break; + } + } + } } else { caps = gst_caps_from_string (caps_str); } + gst_element_class_set_metadata (element_class, long_name, klass->str, + "VA-API based video postprocessor", + "Víctor Jáquez <vjaquez@igalia.com>"); + + g_string_free (klass, TRUE); + doc_caps = gst_caps_from_string (caps_str); sink_pad_templ = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, @@ -2004,6 +2188,8 @@ gst_va_filter_install_properties (filter, object_class); + _install_static_properties (object_class); + g_free (long_name); g_free (cdata->description); g_free (cdata->render_device_path); @@ -2076,6 +2262,13 @@ _create_colorbalance_channel (self, "SATURATION"); } + /* HDR tone mapping */ + pspec = g_object_class_find_property (g_class, "hdr-tone-mapping"); + if (pspec) { + self->hdr_mapping = + g_value_get_boolean (g_param_spec_get_default_value (pspec)); + } + /* enable QoS */ gst_base_transform_set_qos_enabled (GST_BASE_TRANSFORM (instance), TRUE); }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/va/meson.build
Changed
@@ -1,29 +1,35 @@ va_sources = 'plugin.c', - 'gstvaallocator.c', + 'gstjpegdecoder.c', 'gstvabasedec.c', 'gstvabasetransform.c', + 'gstvabaseenc.c', 'gstvacaps.c', + 'gstvacompositor.c', 'gstvadecoder.c', 'gstvadeinterlace.c', 'gstvadevice.c', 'gstvadisplay_priv.c', + 'gstvaencoder.c', 'gstvafilter.c', 'gstvah264dec.c', + 'gstvah264enc.c', 'gstvah265dec.c', - 'gstvapool.c', + 'gstvah265enc.c', + 'gstvajpegdec.c', + 'gstvampeg2dec.c', 'gstvaprofile.c', - 'gstvasurfacecopy.c', - 'gstvautils.c', - 'gstvavideoformat.c', 'gstvavp8dec.c', 'gstvavp9dec.c', - 'gstvampeg2dec.c', 'gstvavpp.c', - 'vasurfaceimage.c', -if not gstva_dep.found() +if host_system != 'linux' + subdir_done() +endif + +va_option = get_option('va').require(gstva_dep.found(), error_message: 'va plugin requires libgstva.') +if va_option.disabled() subdir_done() endif @@ -38,15 +44,18 @@ if driverdir == '' driverdir = join_paths(get_option('prefix'), get_option('libdir'), 'dri') endif -gstva_cargs = '-DLIBVA_DRIVERS_PATH="' + driverdir + '"' +gstva_cargs = + '-DLIBVA_DRIVERS_PATH="' + driverdir + '"', + '-std=c99', + '-DGST_USE_UNSTABLE_API', + gstva = library('gstva', va_sources, - c_args : gst_plugins_bad_args + extra_c_args + gstva_cargs + '-std=c99', + c_args : gst_plugins_bad_args + gstva_cargs, include_directories : configinc, - dependencies : gstvideo_dep, gstcodecs_dep, gstallocators_dep, gstva_dep, libgudev_dep + extra_dep, + dependencies : gstcodecs_dep, gstva_dep, libgudev_dep + extra_dep, install : true, install_dir : plugins_install_dir, ) -pkgconfig.generate(gstva, install_dir : plugins_pkgconfig_install_dir) plugins += gstva
View file
gst-plugins-bad-1.20.5.tar.xz/sys/va/plugin.c -> gst-plugins-bad-1.22.0.tar.xz/sys/va/plugin.c
Changed
@@ -29,11 +29,15 @@ #include "gstvaav1dec.h" #include "gstvacaps.h" +#include "gstvacompositor.h" #include "gstvadeinterlace.h" #include "gstvadevice.h" #include "gstvafilter.h" #include "gstvah264dec.h" +#include "gstvah264enc.h" #include "gstvah265dec.h" +#include "gstvah265enc.h" +#include "gstvajpegdec.h" #include "gstvampeg2dec.h" #include "gstvaprofile.h" #include "gstvavp8dec.h" @@ -140,6 +144,13 @@ } break; #endif + case JPEG: + if (!gst_va_jpeg_dec_register (plugin, device, sinkcaps, srccaps, + GST_RANK_NONE)) { + GST_WARNING ("Failed to register JPEG decoder: %s", + device->render_device_path); + } + break; default: GST_DEBUG ("No decoder implementation for %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (codec)); @@ -157,12 +168,6 @@ { GHashTableIter iter; gpointer key, value; - const gchar *str; - - if (entrypoint == VAEntrypointEncSliceLP) - str = "low power "; - else - str = ""; g_hash_table_iter_init (&iter, encoders); while (g_hash_table_iter_next (&iter, &key, &value)) { @@ -177,11 +182,33 @@ &srccaps, &sinkcaps)) continue; - GST_LOG ("%d encoder %scodec: %" GST_FOURCC_FORMAT, profiles->len, str, + GST_LOG ("%d encoder %scodec: %" GST_FOURCC_FORMAT, profiles->len, + (entrypoint == VAEntrypointEncSliceLP) ? "low power " : "", GST_FOURCC_ARGS (codec)); GST_LOG ("sink caps: %" GST_PTR_FORMAT, sinkcaps); GST_LOG ("src caps: %" GST_PTR_FORMAT, srccaps); + switch (codec) { + case H264: + if (!gst_va_h264_enc_register (plugin, device, sinkcaps, srccaps, + GST_RANK_NONE, entrypoint)) { + GST_WARNING ("Failed to register H264 encoder: %s", + device->render_device_path); + } + break; + case HEVC: + if (!gst_va_h265_enc_register (plugin, device, sinkcaps, srccaps, + GST_RANK_NONE, entrypoint)) { + GST_WARNING ("Failed to register H265 encoder: %s", + device->render_device_path); + } + break; + default: + GST_DEBUG ("No encoder implementation for %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (codec)); + break; + } + gst_caps_unref (srccaps); gst_caps_unref (sinkcaps); } @@ -191,16 +218,18 @@ plugin_register_vpp (GstPlugin * plugin, GstVaDevice * device) { GstVaFilter *filter; - gboolean has_colorbalance, has_deinterlace; + gboolean has_colorbalance, has_deinterlace, has_compose; has_colorbalance = FALSE; has_deinterlace = FALSE; + has_compose = FALSE; filter = gst_va_filter_new (device->display); if (gst_va_filter_open (filter)) { has_colorbalance = gst_va_filter_has_filter (filter, VAProcFilterColorBalance); has_deinterlace = gst_va_filter_has_filter (filter, VAProcFilterDeinterlacing); + has_compose = gst_va_filter_has_compose (filter); } else { GST_WARNING ("Failed open VA filter"); gst_object_unref (filter); @@ -217,6 +246,13 @@ device->render_device_path); } } + + if (has_compose) { + if (!gst_va_compositor_register (plugin, device, GST_RANK_NONE)) { + GST_WARNING ("Failed to register compositor: %s", + device->render_device_path); + } + } } static inline void
View file
gst-plugins-bad-1.22.0.tar.xz/sys/va/vacompat.h
Added
@@ -0,0 +1,27 @@ +/* GStreamer + * Copyright (C) 2022 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <glib.h> + +G_BEGIN_DECLS + +G_END_DECLS
View file
gst-plugins-bad-1.20.5.tar.xz/sys/wasapi/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/wasapi/meson.build
Changed
@@ -36,6 +36,5 @@ dependencies : gstaudio_dep, ole32_dep, ksuser_dep, install : true, install_dir : plugins_install_dir) - pkgconfig.generate(gstwasapi, install_dir : plugins_pkgconfig_install_dir) plugins += gstwasapi endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/wasapi2/gstwasapi2client.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/wasapi2/gstwasapi2client.cpp
Changed
@@ -52,6 +52,37 @@ using namespace Microsoft::WRL; using namespace Microsoft::WRL::Wrappers; +/* Copy of audioclientactivationparams.h since those types are defined only for + * NTDDI_VERSION >= NTDDI_WIN10_FE */ +#define GST_VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK L"VAD\\Process_Loopback" +typedef enum +{ + GST_PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE = 0, + GST_PROCESS_LOOPBACK_MODE_EXCLUDE_TARGET_PROCESS_TREE = 1 +} GST_PROCESS_LOOPBACK_MODE; + +typedef struct +{ + DWORD TargetProcessId; + GST_PROCESS_LOOPBACK_MODE ProcessLoopbackMode; +} GST_AUDIOCLIENT_PROCESS_LOOPBACK_PARAMS; + +typedef enum +{ + GST_AUDIOCLIENT_ACTIVATION_TYPE_DEFAULT = 0, + GST_AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK = 1 +} GST_AUDIOCLIENT_ACTIVATION_TYPE; + +typedef struct +{ + GST_AUDIOCLIENT_ACTIVATION_TYPE ActivationType; + union + { + GST_AUDIOCLIENT_PROCESS_LOOPBACK_PARAMS ProcessLoopbackParams; + } DUMMYUNIONNAME; +} GST_AUDIOCLIENT_ACTIVATION_PARAMS; +/* End of audioclientactivationparams.h */ + G_BEGIN_DECLS GST_DEBUG_CATEGORY_EXTERN (gst_wasapi2_client_debug); @@ -152,19 +183,29 @@ } HRESULT - ActivateDeviceAsync(const std::wstring &device_id) + ActivateDeviceAsync(const std::wstring &device_id, + GST_AUDIOCLIENT_ACTIVATION_PARAMS * params) { ComPtr<IAsyncAction> async_action; bool run_async = false; HRESULT hr; auto work_item = Callback<Implements<RuntimeClassFlags<ClassicCom>, - IDispatchedHandler, FtmBase>>(this, device_id{ + IDispatchedHandler, FtmBase>>(this, device_id, params{ ComPtr<IActivateAudioInterfaceAsyncOperation> async_op; HRESULT async_hr = S_OK; - - async_hr = ActivateAudioInterfaceAsync (device_id.c_str (), - __uuidof(IAudioClient), nullptr, this, &async_op); + PROPVARIANT activate_params = {}; + if (params) { + activate_params.vt = VT_BLOB; + activate_params.blob.cbSize = sizeof(GST_AUDIOCLIENT_ACTIVATION_PARAMS); + activate_params.blob.pBlobData = (BYTE *) params; + + async_hr = ActivateAudioInterfaceAsync (device_id.c_str (), + __uuidof(IAudioClient), &activate_params, this, &async_op); + } else { + async_hr = ActivateAudioInterfaceAsync (device_id.c_str (), + __uuidof(IAudioClient), nullptr, this, &async_op); + } /* for debugging */ gst_wasapi2_result (async_hr); @@ -227,6 +268,7 @@ PROP_DEVICE_CLASS, PROP_DISPATCHER, PROP_CAN_AUTO_ROUTING, + PROP_LOOPBACK_TARGET_PID, }; #define DEFAULT_DEVICE_INDEX -1 @@ -242,6 +284,7 @@ gint device_index; gpointer dispatcher; gboolean can_auto_routing; + guint target_pid; IAudioClient *audio_client; GstWasapiDeviceActivator *activator; @@ -269,6 +312,12 @@ {GST_WASAPI2_CLIENT_DEVICE_CLASS_RENDER, "Render", "render"}, {GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE, "Loopback-Capture", "loopback-capture"}, + {GST_WASAPI2_CLIENT_DEVICE_CLASS_INCLUDE_PROCESS_LOOPBACK_CAPTURE, + "Include-Process-Loopback-Capture", + "include-process-loopback-capture"}, + {GST_WASAPI2_CLIENT_DEVICE_CLASS_EXCLUDE_PROCESS_LOOPBACK_CAPTURE, + "Exclude-Process-Loopback-Capture", + "exclude-process-loopback-capture"}, {0, nullptr, nullptr} }; @@ -328,6 +377,9 @@ g_param_spec_boolean ("auto-routing", "Auto Routing", "Whether client can support automatic stream routing", FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (gobject_class, PROP_LOOPBACK_TARGET_PID, + g_param_spec_uint ("loopback-target-pid", "Loopback Target PID", + "Target process id to record", 0, G_MAXUINT32, 0, param_flags)); } static void @@ -425,6 +477,9 @@ case PROP_CAN_AUTO_ROUTING: g_value_set_boolean (value, self->can_auto_routing); break; + case PROP_LOOPBACK_TARGET_PID: + g_value_set_uint (value, self->target_pid); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -456,6 +511,9 @@ case PROP_DISPATCHER: self->dispatcher = g_value_get_pointer (value); break; + case PROP_LOOPBACK_TARGET_PID: + self->target_pid = g_value_get_uint (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -559,6 +617,46 @@ std::string target_device_id; std::string target_device_name; gboolean use_default_device = FALSE; + GST_AUDIOCLIENT_ACTIVATION_PARAMS activation_params; + gboolean process_loopback = FALSE; + + memset (&activation_params, 0, sizeof (GST_AUDIOCLIENT_ACTIVATION_PARAMS)); + activation_params.ActivationType = GST_AUDIOCLIENT_ACTIVATION_TYPE_DEFAULT; + + if (self->device_class == + GST_WASAPI2_CLIENT_DEVICE_CLASS_INCLUDE_PROCESS_LOOPBACK_CAPTURE || + self->device_class == + GST_WASAPI2_CLIENT_DEVICE_CLASS_EXCLUDE_PROCESS_LOOPBACK_CAPTURE) { + if (self->target_pid == 0) { + GST_ERROR_OBJECT (self, "Process loopback mode without PID"); + goto failed; + } + + if (!gst_wasapi2_can_process_loopback ()) { + GST_ERROR_OBJECT (self, "Process loopback is not supported"); + goto failed; + } + + process_loopback = TRUE; + activation_params.ActivationType = + GST_AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK; + activation_params.ProcessLoopbackParams.TargetProcessId = + (DWORD) self->target_pid; + target_device_id_wstring = GST_VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK; + target_device_id = convert_wstring_to_string (target_device_id_wstring); + + if (self->device_class == + GST_WASAPI2_CLIENT_DEVICE_CLASS_INCLUDE_PROCESS_LOOPBACK_CAPTURE) { + activation_params.ProcessLoopbackParams.ProcessLoopbackMode = + GST_PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE; + } else { + activation_params.ProcessLoopbackParams.ProcessLoopbackMode = + GST_PROCESS_LOOPBACK_MODE_EXCLUDE_TARGET_PROCESS_TREE; + } + + target_device_name = "Process-loopback"; + goto activate; + } GST_INFO_OBJECT (self, "requested device info, device-class: %s, device: %s, device-index: %d", @@ -773,7 +871,13 @@ /* default device supports automatic stream routing */ self->can_auto_routing = use_default_device; - hr = activator->ActivateDeviceAsync (target_device_id_wstring); + if (process_loopback) { + hr = activator->ActivateDeviceAsync (target_device_id_wstring, + &activation_params); + } else { + hr = activator->ActivateDeviceAsync (target_device_id_wstring, nullptr); + } + if (!gst_wasapi2_result (hr)) { GST_WARNING_OBJECT (self, "Failed to activate device"); goto failed; @@ -886,8 +990,12 @@ hr = client->audio_client->GetMixFormat (&mix_format); if (!gst_wasapi2_result (hr)) { - GST_WARNING_OBJECT (client, "Failed to get mix format"); - return nullptr; + if (gst_wasapi2_device_class_is_process_loopback (client->device_class)) { + mix_format = gst_wasapi2_get_default_mix_format (); + } else { + GST_WARNING_OBJECT (client, "Failed to get mix format"); + return nullptr; + } } scaps = gst_static_caps_get (&static_caps); @@ -950,7 +1058,8 @@ GstWasapi2Client * gst_wasapi2_client_new (GstWasapi2ClientDeviceClass device_class, - gint device_index, const gchar * device_id, gpointer dispatcher) + gint device_index, const gchar * device_id, guint32 target_pid, + gpointer dispatcher) { GstWasapi2Client *self; /* *INDENT-OFF* */ @@ -977,7 +1086,8 @@ self = (GstWasapi2Client *) g_object_new (GST_TYPE_WASAPI2_CLIENT, "device-class", device_class, "device-index", device_index, - "device", device_id, "dispatcher", dispatcher, nullptr); + "device", device_id, "loopback-target-pid", target_pid, + "dispatcher", dispatcher, nullptr); /* Reset explicitly to ensure that it happens before * RoInitializeWrapper dtor is called */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/wasapi2/gstwasapi2client.h -> gst-plugins-bad-1.22.0.tar.xz/sys/wasapi2/gstwasapi2client.h
Changed
@@ -31,8 +31,37 @@ GST_WASAPI2_CLIENT_DEVICE_CLASS_CAPTURE = 0, GST_WASAPI2_CLIENT_DEVICE_CLASS_RENDER, GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE, + GST_WASAPI2_CLIENT_DEVICE_CLASS_INCLUDE_PROCESS_LOOPBACK_CAPTURE, + GST_WASAPI2_CLIENT_DEVICE_CLASS_EXCLUDE_PROCESS_LOOPBACK_CAPTURE, } GstWasapi2ClientDeviceClass; +static inline gboolean +gst_wasapi2_device_class_is_loopback (GstWasapi2ClientDeviceClass device_class) +{ + switch (device_class) { + case GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE: + return TRUE; + default: + break; + } + + return FALSE; +} + +static inline gboolean +gst_wasapi2_device_class_is_process_loopback (GstWasapi2ClientDeviceClass device_class) +{ + switch (device_class) { + case GST_WASAPI2_CLIENT_DEVICE_CLASS_INCLUDE_PROCESS_LOOPBACK_CAPTURE: + case GST_WASAPI2_CLIENT_DEVICE_CLASS_EXCLUDE_PROCESS_LOOPBACK_CAPTURE: + return TRUE; + default: + break; + } + + return FALSE; +} + #define GST_TYPE_WASAPI2_CLIENT_DEVICE_CLASS (gst_wasapi2_client_device_class_get_type()) GType gst_wasapi2_client_device_class_get_type (void); @@ -43,6 +72,7 @@ GstWasapi2Client * gst_wasapi2_client_new (GstWasapi2ClientDeviceClass device_class, gint device_index, const gchar * device_id, + guint target_pid, gpointer dispatcher); gboolean gst_wasapi2_client_ensure_activation (GstWasapi2Client * client);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/wasapi2/gstwasapi2device.c -> gst-plugins-bad-1.22.0.tar.xz/sys/wasapi2/gstwasapi2device.c
Changed
@@ -283,7 +283,7 @@ gchar *device_id = NULL; gchar *device_name = NULL; - client = gst_wasapi2_client_new (client_class, i, NULL, NULL); + client = gst_wasapi2_client_new (client_class, i, NULL, 0, NULL); if (!client) return;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/wasapi2/gstwasapi2ringbuffer.cpp -> gst-plugins-bad-1.22.0.tar.xz/sys/wasapi2/gstwasapi2ringbuffer.cpp
Changed
@@ -145,6 +145,7 @@ gdouble volume; gpointer dispatcher; gboolean can_auto_routing; + guint loopback_target_pid; GstWasapi2Client *client; GstWasapi2Client *loopback_client; @@ -380,7 +381,7 @@ } self->client = gst_wasapi2_client_new (self->device_class, - -1, self->device_id, self->dispatcher); + -1, self->device_id, self->loopback_target_pid, self->dispatcher); if (!self->client) { gst_wasapi2_ring_buffer_post_open_error (self); return FALSE; @@ -389,10 +390,10 @@ g_object_get (self->client, "auto-routing", &self->can_auto_routing, nullptr); /* Open another render client to feed silence */ - if (self->device_class == GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE) { + if (gst_wasapi2_device_class_is_loopback (self->device_class)) { self->loopback_client = gst_wasapi2_client_new (GST_WASAPI2_CLIENT_DEVICE_CLASS_RENDER, - -1, self->device_id, self->dispatcher); + -1, self->device_id, 0, self->dispatcher); if (!self->loopback_client) { gst_wasapi2_ring_buffer_post_open_error (self); @@ -480,19 +481,25 @@ ", expected position %" G_GUINT64_FORMAT, to_read, position, self->expected_position); - if (self->is_first) { - self->expected_position = position + to_read; - self->is_first = FALSE; - } else { - if (position > self->expected_position) { - guint gap_frames; + /* XXX: position might not be increased in case of process loopback */ + if (!gst_wasapi2_device_class_is_process_loopback (self->device_class)) { + if (self->is_first) { + self->expected_position = position + to_read; + self->is_first = FALSE; + } else { + if (position > self->expected_position) { + guint gap_frames; - gap_frames = (guint) (position - self->expected_position); - GST_WARNING_OBJECT (self, "Found %u frames gap", gap_frames); - gap_size = gap_frames * GST_AUDIO_INFO_BPF (info); - } + gap_frames = (guint) (position - self->expected_position); + GST_WARNING_OBJECT (self, "Found %u frames gap", gap_frames); + gap_size = gap_frames * GST_AUDIO_INFO_BPF (info); + } - self->expected_position = position + to_read; + self->expected_position = position + to_read; + } + } else if (self->mute) { + /* volume clinet might not be available in case of process loopback */ + flags |= AUDCLNT_BUFFERFLAGS_SILENT; } /* Fill gap data if any */ @@ -679,6 +686,8 @@ switch (self->device_class) { case GST_WASAPI2_CLIENT_DEVICE_CLASS_CAPTURE: case GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE: + case GST_WASAPI2_CLIENT_DEVICE_CLASS_INCLUDE_PROCESS_LOOPBACK_CAPTURE: + case GST_WASAPI2_CLIENT_DEVICE_CLASS_EXCLUDE_PROCESS_LOOPBACK_CAPTURE: hr = gst_wasapi2_ring_buffer_read (self); break; case GST_WASAPI2_CLIENT_DEVICE_CLASS_RENDER: @@ -694,7 +703,8 @@ * loopback capture client doesn't seem to be able to recover status from this * situation */ if (self->can_auto_routing && - self->device_class != GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE && + !gst_wasapi2_device_class_is_loopback (self->device_class) && + !gst_wasapi2_device_class_is_process_loopback (self->device_class) && (hr == AUDCLNT_E_ENDPOINT_CREATE_FAILED || hr == AUDCLNT_E_DEVICE_INVALIDATED)) { GST_WARNING_OBJECT (self, @@ -777,8 +787,8 @@ HRESULT hr = E_FAIL; g_return_val_if_fail (GST_IS_WASAPI2_RING_BUFFER (self), E_FAIL); - g_return_val_if_fail (self->device_class == - GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE, E_FAIL); + g_return_val_if_fail (gst_wasapi2_device_class_is_loopback + (self->device_class), E_FAIL); if (!self->running) { GST_INFO_OBJECT (self, "We are not running now"); @@ -852,7 +862,7 @@ static HRESULT gst_wasapi2_ring_buffer_initialize_audio_client (GstWasapi2RingBuffer * self, IAudioClient * client_handle, WAVEFORMATEX * mix_format, guint * period, - DWORD extra_flags) + DWORD extra_flags, GstWasapi2ClientDeviceClass device_class) { GstAudioRingBuffer *ringbuffer = GST_AUDIO_RING_BUFFER_CAST (self); REFERENCE_TIME default_period, min_period; @@ -862,23 +872,35 @@ stream_flags |= extra_flags; - hr = client_handle->GetDevicePeriod (&default_period, &min_period); - if (!gst_wasapi2_result (hr)) { - GST_WARNING_OBJECT (self, "Couldn't get device period info"); - return hr; - } - - GST_INFO_OBJECT (self, "wasapi2 default period: %" G_GINT64_FORMAT - ", min period: %" G_GINT64_FORMAT, default_period, min_period); + if (!gst_wasapi2_device_class_is_process_loopback (device_class)) { + hr = client_handle->GetDevicePeriod (&default_period, &min_period); + if (!gst_wasapi2_result (hr)) { + GST_WARNING_OBJECT (self, "Couldn't get device period info"); + return hr; + } - hr = client_handle->Initialize (AUDCLNT_SHAREMODE_SHARED, stream_flags, - /* hnsBufferDuration should be same as hnsPeriodicity - * when AUDCLNT_STREAMFLAGS_EVENTCALLBACK is used. - * And in case of shared mode, hnsPeriodicity should be zero, so - * this value should be zero as well */ - 0, - /* This must always be 0 in shared mode */ - 0, mix_format, nullptr); + GST_INFO_OBJECT (self, "wasapi2 default period: %" G_GINT64_FORMAT + ", min period: %" G_GINT64_FORMAT, default_period, min_period); + + hr = client_handle->Initialize (AUDCLNT_SHAREMODE_SHARED, stream_flags, + /* hnsBufferDuration should be same as hnsPeriodicity + * when AUDCLNT_STREAMFLAGS_EVENTCALLBACK is used. + * And in case of shared mode, hnsPeriodicity should be zero, so + * this value should be zero as well */ + 0, + /* This must always be 0 in shared mode */ + 0, mix_format, nullptr); + } else { + /* XXX: virtual device will not report device period. + * Use hardcoded period 20ms, same as Microsoft sample code + * https://github.com/microsoft/windows-classic-samples/tree/main/Samples/ApplicationLoopback + */ + default_period = (20 * GST_MSECOND) / 100; + hr = client_handle->Initialize (AUDCLNT_SHAREMODE_SHARED, + AUDCLNT_STREAMFLAGS_LOOPBACK | AUDCLNT_STREAMFLAGS_EVENTCALLBACK, + default_period, + AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM, mix_format, nullptr); + } if (!gst_wasapi2_result (hr)) { GST_WARNING_OBJECT (self, "Couldn't initialize audioclient"); @@ -923,7 +945,7 @@ } hr = gst_wasapi2_ring_buffer_initialize_audio_client (self, client_handle, - mix_format, &period, 0); + mix_format, &period, 0, GST_WASAPI2_CLIENT_DEVICE_CLASS_RENDER); if (!gst_wasapi2_result (hr)) { GST_ERROR_OBJECT (self, "Failed to initialize audio client"); @@ -970,7 +992,7 @@ if (!self->client && !gst_wasapi2_ring_buffer_open_device (buf)) return FALSE; - if (self->device_class == GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE) { + if (gst_wasapi2_device_class_is_loopback (self->device_class)) { if (!gst_wasapi2_ring_buffer_prepare_loopback_client (self)) { GST_ERROR_OBJECT (self, "Failed to prepare loopback client"); goto error; @@ -991,8 +1013,12 @@ /* TODO: convert given caps to mix format */ hr = client_handle->GetMixFormat (&mix_format); if (!gst_wasapi2_result (hr)) { - GST_ERROR_OBJECT (self, "Failed to get mix format"); - goto error; + if (gst_wasapi2_device_class_is_process_loopback (self->device_class)) { + mix_format = gst_wasapi2_get_default_mix_format (); + } else { + GST_ERROR_OBJECT (self, "Failed to get mix format"); + goto error; + } } /* Only use audioclient3 when low-latency is requested because otherwise @@ -1002,7 +1028,8 @@ if (self->low_latency && /* AUDCLNT_STREAMFLAGS_LOOPBACK is not allowed for * InitializeSharedAudioStream */ - self->device_class != GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE) { + !gst_wasapi2_device_class_is_loopback (self->device_class) && + !gst_wasapi2_device_class_is_process_loopback (self->device_class)) { hr = gst_wasapi2_ring_buffer_initialize_audio_client3 (self, client_handle, mix_format, &period); } @@ -1015,11 +1042,11 @@ */ if (FAILED (hr)) { DWORD extra_flags = 0; - if (self->device_class == GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE) + if (gst_wasapi2_device_class_is_loopback (self->device_class)) extra_flags = AUDCLNT_STREAMFLAGS_LOOPBACK; hr = gst_wasapi2_ring_buffer_initialize_audio_client (self, client_handle, - mix_format, &period, extra_flags); + mix_format, &period, extra_flags, self->device_class); } if (!gst_wasapi2_result (hr)) { @@ -1090,25 +1117,24 @@ hr = client_handle->GetService (IID_PPV_ARGS (&audio_volume)); if (!gst_wasapi2_result (hr)) { - GST_ERROR_OBJECT (self, "ISimpleAudioVolume is unavailable"); - goto error; - } - - g_mutex_lock (&self->volume_lock); - self->volume_object = audio_volume.Detach (); - - if (self->mute_changed) { - self->volume_object->SetMute (self->mute, nullptr); - self->mute_changed = FALSE; + GST_WARNING_OBJECT (self, "ISimpleAudioVolume is unavailable"); } else { - self->volume_object->SetMute (FALSE, nullptr); - } + g_mutex_lock (&self->volume_lock); + self->volume_object = audio_volume.Detach (); - if (self->volume_changed) { - self->volume_object->SetMasterVolume (self->volume, nullptr); - self->volume_changed = FALSE; + if (self->mute_changed) { + self->volume_object->SetMute (self->mute, nullptr); + self->mute_changed = FALSE; + } else { + self->volume_object->SetMute (FALSE, nullptr); + } + + if (self->volume_changed) { + self->volume_object->SetMasterVolume (self->volume, nullptr); + self->volume_changed = FALSE; + } + g_mutex_unlock (&self->volume_lock); } - g_mutex_unlock (&self->volume_lock); buf->size = spec->segtotal * spec->segsize; buf->memory = (guint8 *) g_malloc (buf->size); @@ -1327,7 +1353,7 @@ GstAudioRingBuffer * gst_wasapi2_ring_buffer_new (GstWasapi2ClientDeviceClass device_class, gboolean low_latency, const gchar * device_id, gpointer dispatcher, - const gchar * name) + const gchar * name, guint loopback_target_pid) { GstWasapi2RingBuffer *self; @@ -1343,6 +1369,7 @@ self->low_latency = low_latency; self->device_id = g_strdup (device_id); self->dispatcher = dispatcher; + self->loopback_target_pid = loopback_target_pid; return GST_AUDIO_RING_BUFFER_CAST (self); }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/wasapi2/gstwasapi2ringbuffer.h -> gst-plugins-bad-1.22.0.tar.xz/sys/wasapi2/gstwasapi2ringbuffer.h
Changed
@@ -34,7 +34,8 @@ gboolean low_latency, const gchar *device_id, gpointer dispatcher, - const gchar * name); + const gchar * name, + guint loopback_target_pid); GstCaps * gst_wasapi2_ring_buffer_get_caps (GstWasapi2RingBuffer * buf);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/wasapi2/gstwasapi2sink.c -> gst-plugins-bad-1.22.0.tar.xz/sys/wasapi2/gstwasapi2sink.c
Changed
@@ -333,7 +333,7 @@ ringbuffer = gst_wasapi2_ring_buffer_new (GST_WASAPI2_CLIENT_DEVICE_CLASS_RENDER, - self->low_latency, self->device_id, self->dispatcher, name); + self->low_latency, self->device_id, self->dispatcher, name, 0); g_free (name);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/wasapi2/gstwasapi2src.c -> gst-plugins-bad-1.22.0.tar.xz/sys/wasapi2/gstwasapi2src.c
Changed
@@ -53,10 +53,72 @@ GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_WASAPI2_STATIC_CAPS)); +/** + * GstWasapi2SrcLoopbackMode: + * + * Loopback capture mode + * + * Since: 1.22 + */ +typedef enum +{ + /** + * GstWasapi2SrcLoopbackMode::default: + * + * Default loopback mode + * + * Since: 1.22 + */ + GST_WASAPI2_SRC_LOOPBACK_DEFAULT, + + /** + * GstWasapi2SrcLoopbackMode::include-process-tree: + * + * Captures only specified process and its child process + * + * Since: 1.22 + */ + GST_WASAPI2_SRC_LOOPBACK_INCLUDE_PROCESS_TREE, + + /** + * GstWasapi2SrcLoopbackMode::exclude-process-tree: + * + * Excludes specified process and its child process + * + * Since: 1.22 + */ + GST_WASAPI2_SRC_LOOPBACK_EXCLUDE_PROCESS_TREE, +} GstWasapi2SrcLoopbackMode; + +#define GST_TYPE_WASAPI2_SRC_LOOPBACK_MODE (gst_wasapi2_src_loopback_mode_get_type ()) +static GType +gst_wasapi2_src_loopback_mode_get_type (void) +{ + static GType loopback_type = 0; + static const GEnumValue types = { + {GST_WASAPI2_SRC_LOOPBACK_DEFAULT, "Default", "default"}, + {GST_WASAPI2_SRC_LOOPBACK_INCLUDE_PROCESS_TREE, + "Include process and its child processes", + "include-process-tree"}, + {GST_WASAPI2_SRC_LOOPBACK_EXCLUDE_PROCESS_TREE, + "Exclude process and its child processes", + "exclude-process-tree"}, + {0, NULL, NULL} + }; + + if (g_once_init_enter (&loopback_type)) { + GType gtype = g_enum_register_static ("GstWasapi2SrcLoopbackMode", types); + g_once_init_leave (&loopback_type, gtype); + } + + return loopback_type; +} + #define DEFAULT_LOW_LATENCY FALSE #define DEFAULT_MUTE FALSE #define DEFAULT_VOLUME 1.0 #define DEFAULT_LOOPBACK FALSE +#define DEFAULT_LOOPBACK_MODE GST_WASAPI2_SRC_LOOPBACK_DEFAULT enum { @@ -67,6 +129,8 @@ PROP_VOLUME, PROP_DISPATCHER, PROP_LOOPBACK, + PROP_LOOPBACK_MODE, + PROP_LOOPBACK_TARGET_PID, }; struct _GstWasapi2Src @@ -80,6 +144,8 @@ gdouble volume; gpointer dispatcher; gboolean loopback; + GstWasapi2SrcLoopbackMode loopback_mode; + guint loopback_pid; gboolean mute_changed; gboolean volume_changed; @@ -173,6 +239,41 @@ GST_PARAM_MUTABLE_READY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + if (gst_wasapi2_can_process_loopback ()) { + /** + * GstWasapi2Src:loopback-mode: + * + * Loopback mode. "target-process-id" must be specified in case of + * process loopback modes. + * + * This feature requires "Windows 10 build 20348" + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_LOOPBACK_MODE, + g_param_spec_enum ("loopback-mode", "Loopback Mode", + "Loopback mode to use", GST_TYPE_WASAPI2_SRC_LOOPBACK_MODE, + DEFAULT_LOOPBACK_MODE, + GST_PARAM_CONDITIONALLY_AVAILABLE | GST_PARAM_MUTABLE_READY | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstWasapi2Src:loopback-target-pid: + * + * Target process id to be recorded or excluded depending on loopback mode + * + * This feature requires "Windows 10 build 20348" + * + * Since: 1.22 + */ + g_object_class_install_property (gobject_class, PROP_LOOPBACK_TARGET_PID, + g_param_spec_uint ("loopback-target-pid", "Loopback Target PID", + "Process ID to be recorded or excluded for process loopback mode", + 0, G_MAXUINT32, 0, + GST_PARAM_CONDITIONALLY_AVAILABLE | GST_PARAM_MUTABLE_READY | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + } + gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_set_static_metadata (element_class, "Wasapi2Src", "Source/Audio/Hardware", @@ -191,6 +292,9 @@ GST_DEBUG_CATEGORY_INIT (gst_wasapi2_src_debug, "wasapi2src", 0, "Windows audio session API source"); + + if (gst_wasapi2_can_process_loopback ()) + gst_type_mark_as_plugin_api (GST_TYPE_WASAPI2_SRC_LOOPBACK_MODE, 0); } static void @@ -238,6 +342,12 @@ case PROP_LOOPBACK: self->loopback = g_value_get_boolean (value); break; + case PROP_LOOPBACK_MODE: + self->loopback_mode = g_value_get_enum (value); + break; + case PROP_LOOPBACK_TARGET_PID: + self->loopback_pid = g_value_get_uint (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -266,6 +376,12 @@ case PROP_LOOPBACK: g_value_set_boolean (value, self->loopback); break; + case PROP_LOOPBACK_MODE: + g_value_set_enum (value, self->loopback_mode); + break; + case PROP_LOOPBACK_TARGET_PID: + g_value_set_uint (value, self->loopback_pid); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -350,14 +466,27 @@ GstWasapi2ClientDeviceClass device_class = GST_WASAPI2_CLIENT_DEVICE_CLASS_CAPTURE; - if (self->loopback) + if (self->loopback_pid) { + if (self->loopback_mode == GST_WASAPI2_SRC_LOOPBACK_INCLUDE_PROCESS_TREE) { + device_class = + GST_WASAPI2_CLIENT_DEVICE_CLASS_INCLUDE_PROCESS_LOOPBACK_CAPTURE; + } else if (self->loopback_mode == + GST_WASAPI2_SRC_LOOPBACK_EXCLUDE_PROCESS_TREE) { + device_class = + GST_WASAPI2_CLIENT_DEVICE_CLASS_EXCLUDE_PROCESS_LOOPBACK_CAPTURE; + } + } else if (self->loopback) { device_class = GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE; + } + + GST_DEBUG_OBJECT (self, "Device class %d", device_class); name = g_strdup_printf ("%s-ringbuffer", GST_OBJECT_NAME (src)); ringbuffer = gst_wasapi2_ring_buffer_new (device_class, - self->low_latency, self->device_id, self->dispatcher, name); + self->low_latency, self->device_id, self->dispatcher, name, + self->loopback_pid); g_free (name); return ringbuffer;
View file
gst-plugins-bad-1.20.5.tar.xz/sys/wasapi2/gstwasapi2util.c -> gst-plugins-bad-1.22.0.tar.xz/sys/wasapi2/gstwasapi2util.c
Changed
@@ -490,3 +490,73 @@ return ret; #endif } + +gboolean +gst_wasapi2_can_process_loopback (void) +{ +#ifdef GST_WASAPI2_WINAPI_ONLY_APP + /* FIXME: Needs WinRT (Windows.System.Profile) API call + * for OS version check */ + return FALSE; +#else + static gboolean ret = FALSE; + static gsize version_once = 0; + + if (g_once_init_enter (&version_once)) { + OSVERSIONINFOEXW osverinfo; + typedef NTSTATUS (WINAPI fRtlGetVersion) (PRTL_OSVERSIONINFOEXW); + fRtlGetVersion *RtlGetVersion = NULL; + HMODULE hmodule = NULL; + + memset (&osverinfo, 0, sizeof (OSVERSIONINFOEXW)); + osverinfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEXW); + + hmodule = LoadLibraryW (L"ntdll.dll"); + if (hmodule) + RtlGetVersion = + (fRtlGetVersion *) GetProcAddress (hmodule, "RtlGetVersion"); + + if (RtlGetVersion) { + RtlGetVersion (&osverinfo); + + /* Process loopback requires Windows 10 build 20348 + * https://learn.microsoft.com/en-us/windows/win32/api/audioclientactivationparams/ns-audioclientactivationparams-audioclient_process_loopback_params + * + * Note: "Windows 10 build 20348" would mean "Windows server 2022" or + * "Windows 11", since build number of "Windows 10 version 21H2" is + * still 19044.XXX + */ + if (osverinfo.dwMajorVersion > 10 || + (osverinfo.dwMajorVersion == 10 && osverinfo.dwBuildNumber >= 20348)) + ret = TRUE; + } + + if (hmodule) + FreeLibrary (hmodule); + + g_once_init_leave (&version_once, 1); + } + + GST_INFO ("Process loopback support: %d", ret); + + return ret; +#endif +} + +WAVEFORMATEX * +gst_wasapi2_get_default_mix_format (void) +{ + WAVEFORMATEX *format; + + /* virtual loopback device might not provide mix format. Create our default + * mix format */ + format = CoTaskMemAlloc (sizeof (WAVEFORMATEX)); + format->wFormatTag = WAVE_FORMAT_PCM; + format->nChannels = 2; + format->nSamplesPerSec = 44100; + format->wBitsPerSample = 16; + format->nBlockAlign = format->nChannels * format->wBitsPerSample / 8; + format->nAvgBytesPerSec = format->nSamplesPerSec * format->nBlockAlign; + + return format; +}
View file
gst-plugins-bad-1.20.5.tar.xz/sys/wasapi2/gstwasapi2util.h -> gst-plugins-bad-1.22.0.tar.xz/sys/wasapi2/gstwasapi2util.h
Changed
@@ -65,6 +65,10 @@ gboolean gst_wasapi2_can_automatic_stream_routing (void); +gboolean gst_wasapi2_can_process_loopback (void); + +WAVEFORMATEX * gst_wasapi2_get_default_mix_format (void); + G_END_DECLS #endif /* __GST_WASAPI_UTIL_H__ */
View file
gst-plugins-bad-1.20.5.tar.xz/sys/wasapi2/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/wasapi2/meson.build
Changed
@@ -146,5 +146,4 @@ dependencies : gstaudio_dep, gstwinrt_dep + wasapi2_dep, install : true, install_dir : plugins_install_dir) -pkgconfig.generate(gstwasapi2, install_dir : plugins_pkgconfig_install_dir) plugins += gstwasapi2
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wic
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wic/gstwicdecoder.cpp
Added
@@ -0,0 +1,281 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "gstwicdecoder.h" + +#include <wrl.h> +#include <string.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + + +GST_DEBUG_CATEGORY_STATIC (gst_wic_decoder_debug); +#define GST_CAT_DEFAULT gst_wic_decoder_debug + +struct _GstWicDecoderPrivate +{ + GstWicImagingFactory *factory; + IStream *stream; +}; + +static gboolean gst_wic_decoder_open (GstVideoDecoder * decoder); +static gboolean gst_wic_decoder_close (GstVideoDecoder * decoder); +static gboolean gst_wic_decoder_stop (GstVideoDecoder * decoder); +static gboolean gst_wic_decoder_set_format (GstVideoDecoder * decoder, + GstVideoCodecState * state); +static GstFlowReturn gst_wic_decoder_handle_frame (GstVideoDecoder * decoder, + GstVideoCodecFrame * frame); + +#define gst_wic_decoder_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GstWicDecoder, gst_wic_decoder, + GST_TYPE_VIDEO_DECODER); + +static void +gst_wic_decoder_class_init (GstWicDecoderClass * klass) +{ + GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_CLASS (klass); + + decoder_class->open = GST_DEBUG_FUNCPTR (gst_wic_decoder_open); + decoder_class->close = GST_DEBUG_FUNCPTR (gst_wic_decoder_close); + decoder_class->stop = GST_DEBUG_FUNCPTR (gst_wic_decoder_stop); + decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_wic_decoder_set_format); + decoder_class->handle_frame = + GST_DEBUG_FUNCPTR (gst_wic_decoder_handle_frame); + + GST_DEBUG_CATEGORY_INIT (gst_wic_decoder_debug, + "wicdecoder", 0, "wicdecoder"); + + gst_type_mark_as_plugin_api (GST_TYPE_WIC_DECODER, (GstPluginAPIFlags) 0); +} + +static void +gst_wic_decoder_init (GstWicDecoder * self) +{ + self->priv = + (GstWicDecoderPrivate *) gst_wic_decoder_get_instance_private (self); +} + +static gboolean +gst_wic_decoder_open (GstVideoDecoder * decoder) +{ + GstWicDecoder *self = GST_WIC_DECODER (decoder); + GstWicDecoderClass *klass = GST_WIC_DECODER_GET_CLASS (self); + GstWicDecoderPrivate *priv = self->priv; + HRESULT hr; + ComPtr < IStream > stream; + + priv->factory = gst_wic_imaging_factory_new (); + if (!priv->factory) { + GST_ERROR_OBJECT (self, "Failed to create factory"); + return FALSE; + } + + hr = gst_wic_imaging_factory_check_codec_support (priv->factory, + TRUE, klass->codec_id); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Codec is not supported, hr: 0x%x", (guint) hr); + goto error; + } + + hr = CreateStreamOnHGlobal (nullptr, TRUE, &stream); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to create IStream object"); + goto error; + } + + priv->stream = stream.Detach (); + + return TRUE; + +error: + GST_WIC_CLEAR_COM (priv->stream); + gst_clear_object (&priv->factory); + + return FALSE; +} + +static gboolean +gst_wic_decoder_close (GstVideoDecoder * decoder) +{ + GstWicDecoder *self = GST_WIC_DECODER (decoder); + GstWicDecoderPrivate *priv = self->priv; + + GST_WIC_CLEAR_COM (priv->stream); + gst_clear_object (&priv->factory); + + return TRUE; +} + +static gboolean +gst_wic_decoder_stop (GstVideoDecoder * decoder) +{ + GstWicDecoder *self = GST_WIC_DECODER (decoder); + + g_clear_pointer (&self->input_state, gst_video_codec_state_unref); + + return TRUE; +} + +static gboolean +gst_wic_decoder_set_format (GstVideoDecoder * decoder, + GstVideoCodecState * state) +{ + GstWicDecoder *self = GST_WIC_DECODER (decoder); + GstWicDecoderClass *klass = GST_WIC_DECODER_GET_CLASS (self); + + self->input_state = gst_video_codec_state_ref (state); + + if (klass->set_format) + return klass->set_format (self, state); + + return TRUE; +} + +static gboolean +gst_wic_decoder_upload (GstWicDecoder * self, GstBuffer * buffer) +{ + GstWicDecoderPrivate *priv = self->priv; + IStream *stream = priv->stream; + LARGE_INTEGER pos; + ULARGE_INTEGER size; + HRESULT hr; + GstMapInfo info; + + if (!gst_buffer_map (buffer, &info, GST_MAP_READ)) { + GST_ELEMENT_ERROR (self, + RESOURCE, READ, ("Unable to map buffer"), (nullptr)); + return FALSE; + } + + size.QuadPart = info.size; + hr = stream->SetSize (size); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, + "Failed to set size to %" G_GSIZE_FORMAT, info.size); + goto read_write_error; + } + + pos.QuadPart = 0; + hr = stream->Seek (pos, STREAM_SEEK_SET, nullptr); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to seek IStream"); + gst_buffer_unmap (buffer, &info); + goto read_write_error; + } + + hr = stream->Write (info.data, info.size, nullptr); + + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to write data into IStream"); + goto read_write_error; + } + + hr = stream->Seek (pos, STREAM_SEEK_SET, nullptr); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to seek IStream"); + goto read_write_error; + } + + gst_buffer_unmap (buffer, &info); + + return TRUE; + +read_write_error: + { + gchar *error_text = g_win32_error_message ((guint) hr); + + GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ_WRITE, + ("Failed to read/write stream for decoding"), + ("HRSULT: 0x%x (%s)", (guint) hr, GST_STR_NULL (error_text))); + g_free (error_text); + + gst_buffer_unmap (buffer, &info); + + return FALSE; + } +} + +static gboolean +gst_wic_decoder_decode (GstWicDecoder * self, IWICBitmapDecoder ** decoder) +{ + GstWicDecoderClass *klass = GST_WIC_DECODER_GET_CLASS (self); + GstWicDecoderPrivate *priv = self->priv; + IStream *stream = priv->stream; + IWICImagingFactory *factory; + HRESULT hr; + ComPtr < IWICBitmapDecoder > handle; + + factory = gst_wic_imaging_factory_get_handle (priv->factory); + hr = factory->CreateDecoder (klass->codec_id, nullptr, &handle); + if (FAILED (hr)) { + GST_ELEMENT_ERROR (self, STREAM, DECODE, ("Unable to create decoder"), + ("IWICImagingFactory::IWICBitmapDecoder returned hr 0x%x", (guint) hr)); + return FALSE; + } + + hr = handle->Initialize (stream, WICDecodeMetadataCacheOnLoad); + if (FAILED (hr)) { + GST_ELEMENT_ERROR (self, STREAM, DECODE, ("Unable initialize decoder"), + ("IWICBitmapDecoder::Initialize returned hr 0x%x", (guint) hr)); + return FALSE; + } + + *decoder = handle.Detach (); + + return TRUE; +} + +static GstFlowReturn +gst_wic_decoder_handle_frame (GstVideoDecoder * decoder, + GstVideoCodecFrame * frame) +{ + GstWicDecoder *self = GST_WIC_DECODER (decoder); + GstWicDecoderClass *klass = GST_WIC_DECODER_GET_CLASS (self); + GstWicDecoderPrivate *priv = self->priv; + ComPtr < IWICBitmapDecoder > handle; + ComPtr < IWICBitmapFrameDecode > decode_frame; + HRESULT hr; + IWICImagingFactory *factory; + + factory = gst_wic_imaging_factory_get_handle (priv->factory); + + if (!gst_wic_decoder_upload (self, frame->input_buffer)) { + gst_video_decoder_release_frame (decoder, frame); + return GST_FLOW_ERROR; + } + + if (!gst_wic_decoder_decode (self, &handle)) { + gst_video_decoder_release_frame (decoder, frame); + return GST_FLOW_ERROR; + } + + hr = handle->GetFrame (0, &decode_frame); + if (FAILED (hr)) { + gst_video_decoder_release_frame (decoder, frame); + + GST_ELEMENT_ERROR (self, STREAM, DECODE, ("Failed to decode"), + ("IWICBitmapDecoder::GetFrame returned hr 0x%x", (guint) hr)); + + return GST_FLOW_ERROR; + } + + return klass->process_output (self, factory, decode_frame.Get (), frame); +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wic/gstwicdecoder.h
Added
@@ -0,0 +1,64 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include "gstwicimagingfactory.h" + +G_BEGIN_DECLS + +#define GST_TYPE_WIC_DECODER (gst_wic_decoder_get_type()) +#define GST_WIC_DECODER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WIC_DECODER,GstWicDecoder)) +#define GST_WIC_DECODER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_WIC_DECODER,GstWicDecoderClass)) +#define GST_WIC_DECODER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_WIC_DECODER,GstWicDecoderClass)) +#define GST_IS_WIC_DECODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WIC_DECODER)) +#define GST_IS_WIC_DECODER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_WIC_DECODER)) + +typedef struct _GstWicDecoder GstWicDecoder; +typedef struct _GstWicDecoderClass GstWicDecoderClass; +typedef struct _GstWicDecoderPrivate GstWicDecoderPrivate; + +struct _GstWicDecoder +{ + GstVideoDecoder parent; + + GstVideoCodecState *input_state; + + GstWicDecoderPrivate *priv; +}; + +struct _GstWicDecoderClass +{ + GstVideoDecoderClass parent_class; + GUID codec_id; + + gboolean (*set_format) (GstWicDecoder * decoder, + GstVideoCodecState * state); + + GstFlowReturn (*process_output) (GstWicDecoder * decoder, + IWICImagingFactory * factory, + IWICBitmapFrameDecode * decode_frame, + GstVideoCodecFrame * frame); +}; + +GType gst_wic_decoder_get_type (void); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wic/gstwicimagingfactory.cpp
Added
@@ -0,0 +1,192 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "gstwicimagingfactory.h" +#include <wrl.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +GST_DEBUG_CATEGORY_STATIC (gst_wic_imaging_factory_debug); +#define GST_CAT_DEFAULT gst_wic_imaging_factory_debug + +struct _GstWicImagingFactory +{ + GstObject parent; + + IWICImagingFactory *handle; + + GThread *thread; + GMutex lock; + GCond cond; + GMainContext *context; + GMainLoop *loop; +}; + +static void gst_wic_imaging_factory_constructed (GObject * object); +static void gst_wic_imaging_factory_finalize (GObject * object); +static gpointer gst_wic_imaging_factory_func (GstWicImagingFactory * self); + +#define gst_wic_imaging_factory_parent_class parent_class +G_DEFINE_TYPE (GstWicImagingFactory, gst_wic_imaging_factory, GST_TYPE_OBJECT); + +static void +gst_wic_imaging_factory_class_init (GstWicImagingFactoryClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructed = gst_wic_imaging_factory_constructed; + object_class->finalize = gst_wic_imaging_factory_finalize; +} + +static void +gst_wic_imaging_factory_init (GstWicImagingFactory * self) +{ + g_mutex_init (&self->lock); + g_cond_init (&self->cond); + + self->context = g_main_context_new (); + self->loop = g_main_loop_new (self->context, FALSE); +} + +static void +gst_wic_imaging_factory_constructed (GObject * object) +{ + GstWicImagingFactory *self = GST_WIC_IMAGING_FACTORY (object); + + g_mutex_lock (&self->lock); + self->thread = g_thread_new ("GstWicImagingFactory", + (GThreadFunc) gst_wic_imaging_factory_func, self); + while (!g_main_loop_is_running (self->loop)) + g_cond_wait (&self->cond, &self->lock); + g_mutex_unlock (&self->lock); + + G_OBJECT_CLASS (parent_class)->constructed (object); +} + +static void +gst_wic_imaging_factory_finalize (GObject * object) +{ + GstWicImagingFactory *self = GST_WIC_IMAGING_FACTORY (object); + + if (self->loop) { + g_main_loop_quit (self->loop); + g_thread_join (self->thread); + + g_main_loop_unref (self->loop); + g_main_context_unref (self->context); + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static gboolean +loop_running_cb (GstWicImagingFactory * self) +{ + g_mutex_lock (&self->lock); + g_cond_signal (&self->cond); + g_mutex_unlock (&self->lock); + + return G_SOURCE_REMOVE; +} + +static gpointer +gst_wic_imaging_factory_func (GstWicImagingFactory * self) +{ + HRESULT hr; + ComPtr < IWICImagingFactory > factory; + GSource *idle_source; + + CoInitializeEx (nullptr, COINIT_MULTITHREADED); + + g_main_context_push_thread_default (self->context); + + idle_source = g_idle_source_new (); + g_source_set_callback (idle_source, + (GSourceFunc) loop_running_cb, self, nullptr); + g_source_attach (idle_source, self->context); + g_source_unref (idle_source); + + hr = CoCreateInstance (CLSID_WICImagingFactory, nullptr, + CLSCTX_INPROC_SERVER, IID_PPV_ARGS (&factory)); + + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to create factory handle, hr: 0x%x", + (guint) hr); + } else { + self->handle = factory.Detach (); + } + +run_loop: + g_main_loop_run (self->loop); + + if (self->handle) + self->handle->Release (); + + g_main_context_pop_thread_default (self->context); + CoUninitialize (); + + return nullptr; +} + +GstWicImagingFactory * +gst_wic_imaging_factory_new (void) +{ + GstWicImagingFactory *self; + + self = (GstWicImagingFactory *) g_object_new (GST_TYPE_WIC_IMAGING_FACTORY, + nullptr); + + if (!self->handle) { + gst_object_unref (self); + return nullptr; + } + + gst_object_ref_sink (self); + + return self; +} + +IWICImagingFactory * +gst_wic_imaging_factory_get_handle (GstWicImagingFactory * factory) +{ + g_return_val_if_fail (GST_IS_WIC_IMAGING_FACTORY (factory), nullptr); + + return factory->handle; +} + +HRESULT +gst_wic_imaging_factory_check_codec_support (GstWicImagingFactory * factory, + gboolean is_decoder, REFGUID codec_id) +{ + HRESULT hr = E_FAIL; + + g_return_val_if_fail (GST_IS_WIC_IMAGING_FACTORY (factory), E_FAIL); + + if (is_decoder) { + ComPtr < IWICBitmapDecoder > decoder; + hr = factory->handle->CreateDecoder (codec_id, nullptr, &decoder); + } else { + ComPtr < IWICBitmapEncoder > encoder; + hr = factory->handle->CreateEncoder (codec_id, nullptr, &encoder); + } + + return hr; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wic/gstwicimagingfactory.h
Added
@@ -0,0 +1,39 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include "gstwicutils.h" + +G_BEGIN_DECLS + +#define GST_TYPE_WIC_IMAGING_FACTORY (gst_wic_imaging_factory_get_type()) +G_DECLARE_FINAL_TYPE (GstWicImagingFactory, gst_wic_imaging_factory, + GST, WIC_IMAGING_FACTORY, GstObject); + +GstWicImagingFactory * gst_wic_imaging_factory_new (void); + +IWICImagingFactory * gst_wic_imaging_factory_get_handle (GstWicImagingFactory * factory); + +HRESULT gst_wic_imaging_factory_check_codec_support (GstWicImagingFactory * factory, + gboolean is_decoder, + REFGUID codec_id); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wic/gstwicjpegdec.cpp
Added
@@ -0,0 +1,544 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-wicjpegdec + * @title: wicjpegdec + * + * This element decodes JPEG compressed data into RAW video data. + * + * Since: 1.22 + * + */ + +#include "gstwicjpegdec.h" + +#include <wrl.h> +#include <string.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +GST_DEBUG_CATEGORY_STATIC (gst_wic_jpeg_dec_debug); +#define GST_CAT_DEFAULT gst_wic_jpeg_dec_debug + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("image/jpeg") + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ BGR, GRAY8, NV12, Y42B, Y444 }")) + ); + + +struct _GstWicJpegDec +{ + GstWicDecoder parent; + + WICBitmapPlaneDescription plane_descGST_VIDEO_MAX_PLANES; + + GstVideoInfo info; +}; + +static gboolean gst_wic_jpeg_dec_set_format (GstWicDecoder * decoder, + GstVideoCodecState * state); +static GstFlowReturn gst_wic_jpeg_dec_process_output (GstWicDecoder * decoder, + IWICImagingFactory * factory, IWICBitmapFrameDecode * decode_frame, + GstVideoCodecFrame * frame); + +#define gst_wic_decoder_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstWicJpegDec, gst_wic_jpeg_dec, GST_TYPE_WIC_DECODER, + GST_DEBUG_CATEGORY_INIT (gst_wic_jpeg_dec_debug, + "wicjpegdec", 0, "wicjpegdec")); + +static void +gst_wic_jpeg_dec_class_init (GstWicJpegDecClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstWicDecoderClass *decoder_class = GST_WIC_DECODER_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_static_metadata (element_class, + "Windows Imaging Component JPEG decoder", "Codec/Decoder/Image", + "Jpeg image decoder using Windows Imaging Component API", + "Seungha Yang <seungha@centricular.com>"); + + decoder_class->codec_id = GUID_ContainerFormatJpeg; + decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_wic_jpeg_dec_set_format); + decoder_class->process_output = + GST_DEBUG_FUNCPTR (gst_wic_jpeg_dec_process_output); +} + +static void +gst_wic_jpeg_dec_init (GstWicJpegDec * self) +{ + gst_video_info_init (&self->info); + gst_video_decoder_set_packetized (GST_VIDEO_DECODER (self), TRUE); +} + +static gboolean +gst_wic_jpeg_dec_prepare_yuv_output (GstWicJpegDec * self, + WICJpegFrameHeader * hdr, + IWICBitmapSource * input, guint out_width, guint out_height, + IWICPlanarBitmapSourceTransform ** transform) +{ + ComPtr < IWICPlanarBitmapSourceTransform > tr; + + HRESULT hr; + BOOL is_supported = FALSE; + UINT32 supported_width = out_width; + UINT32 supported_height = out_height; + const WICPixelFormatGUID yuv_planar_formats = { + GUID_WICPixelFormat8bppY, + GUID_WICPixelFormat8bppCb, + GUID_WICPixelFormat8bppCr + }; + const WICPixelFormatGUID nv12_formats = { + GUID_WICPixelFormat8bppY, + GUID_WICPixelFormat16bppCbCr, + }; + const WICPixelFormatGUID *dst_formats = yuv_planar_formats; + guint n_planes = G_N_ELEMENTS (yuv_planar_formats); + GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN; + + switch (hdr->SampleFactors) { + case WIC_JPEG_SAMPLE_FACTORS_ONE: + /* GRAY */ + return FALSE; + case WIC_JPEG_SAMPLE_FACTORS_THREE_420: + /* NV12 is preferred over I420 on Windows, because I420 is not suppported + * by various Windows APIs, Specifically DXGI doesn't support I420 + * natively */ + format = GST_VIDEO_FORMAT_NV12; + dst_formats = nv12_formats; + n_planes = G_N_ELEMENTS (nv12_formats); + break; + case WIC_JPEG_SAMPLE_FACTORS_THREE_422: + format = GST_VIDEO_FORMAT_Y42B; + break; + case WIC_JPEG_SAMPLE_FACTORS_THREE_444: + format = GST_VIDEO_FORMAT_Y444; + break; + case WIC_JPEG_SAMPLE_FACTORS_THREE_440: + /* We don't support this format */ + return FALSE; + default: + return FALSE; + } + + hr = input->QueryInterface (IID_PPV_ARGS (&tr)); + if (FAILED (hr)) { + GST_TRACE_OBJECT (self, "IWICPlanarBitmapSourceTransform is not supported"); + return FALSE; + } + + hr = tr->DoesSupportTransform (&supported_width, + &supported_height, + WICBitmapTransformRotate0, + WICPlanarOptionsPreserveSubsampling, + dst_formats, self->plane_desc, n_planes, &is_supported); + + if (FAILED (hr) || !is_supported) { + GST_TRACE_OBJECT (self, "Transform is not supported"); + return FALSE; + } + + GST_LOG_OBJECT (self, "Transform supported %dx%d -> %dx%d", + out_width, out_height, supported_width, supported_height); + for (guint i = 0; i < n_planes; i++) { + GST_LOG_OBJECT (self, "Plane %d, %dx%d", i, + self->plane_desci.Width, self->plane_desci.Height); + } + + gst_video_info_set_format (&self->info, format, supported_width, + supported_height); + + *transform = tr.Detach (); + + return TRUE; +} + +static gboolean +gst_wic_jpeg_dec_prepare_rgb_output (GstWicJpegDec * self, + IWICImagingFactory * factory, IWICBitmapSource * input, + guint out_width, guint out_height, IWICBitmapSource ** source) +{ + WICPixelFormatGUID native_pixel_format; + GstVideoFormat native_format = GST_VIDEO_FORMAT_UNKNOWN; + HRESULT hr; + ComPtr < IWICBitmapSource > output; + + hr = input->GetPixelFormat (&native_pixel_format); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to query pixel format, hr: 0x%x", + (guint) hr); + return FALSE; + } + + /* native output formats are BGR, GRAY and CMYK but we don't support + * CMYK */ + if (!gst_wic_pixel_format_to_gst (native_pixel_format, &native_format) || + (native_format != GST_VIDEO_FORMAT_BGR && + native_format != GST_VIDEO_FORMAT_GRAY8)) { + ComPtr < IWICFormatConverter > conv; + + GST_LOG_OBJECT (self, + "Native format is not supported for output, needs conversion"); + + native_format = GST_VIDEO_FORMAT_BGR; + + if (!gst_wic_pixel_format_from_gst (native_format, &native_pixel_format)) { + GST_ERROR_OBJECT (self, "Failed to convert format to WIC"); + return FALSE; + } + + hr = factory->CreateFormatConverter (&conv); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to create converter"); + return FALSE; + } + + hr = conv->Initialize (input, native_pixel_format, + WICBitmapDitherTypeNone, nullptr, 0.0f, WICBitmapPaletteTypeCustom); + + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to initialize converter, hr: 0x%x", + (guint) hr); + return FALSE; + } + + conv.As (&output); + } else { + output = input; + } + + gst_video_info_set_format (&self->info, native_format, out_width, out_height); + + *source = output.Detach (); + + return TRUE; +} + +static gboolean +gst_wic_jpeg_dec_fill_yuv_output (GstWicJpegDec * self, + IWICImagingFactory * factory, IWICPlanarBitmapSourceTransform * transform, + GstBuffer * buffer) +{ + ComPtr < IWICBitmap > bitmapsGST_VIDEO_MAX_PLANES; + ComPtr < IWICBitmapLock > locksGST_VIDEO_MAX_PLANES; + WICBitmapPlane planesGST_VIDEO_MAX_PLANES; + HRESULT hr; + GstVideoFrame frame; + guint num_planes = GST_VIDEO_INFO_N_PLANES (&self->info); + + for (guint i = 0; i < num_planes; i++) { + hr = factory->CreateBitmap (self->plane_desci.Width, + self->plane_desci.Height, + self->plane_desci.Format, WICBitmapCacheOnLoad, &bitmapsi); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to create bitmap, hr: 0x%x", (guint) hr); + return FALSE; + } + + hr = gst_wic_lock_bitmap (bitmapsi.Get (), nullptr, + WICBitmapLockRead | WICBitmapLockWrite, &locksi, &planesi); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to lock bitmap for plane %d", i); + return FALSE; + } + } + + hr = transform->CopyPixels (nullptr, self->info.width, self->info.height, + WICBitmapTransformRotate0, WICPlanarOptionsPreserveSubsampling, planes, + num_planes); + + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to copy pixels, hr: 0x%x", (guint) hr); + return FALSE; + } + + if (!gst_video_frame_map (&frame, &self->info, buffer, GST_MAP_WRITE)) { + GST_ERROR_OBJECT (self, "Failed to map output buffer"); + return FALSE; + } + + for (guint i = 0; i < num_planes; i++) { + WICBitmapPlane *plane = &planesi; + guint height, width_in_bytes; + guint8 *src, *dst; + guint src_stride, dst_stride; + + src = plane->pbBuffer; + dst = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, i); + + src_stride = plane->cbStride; + dst_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&frame, i); + + width_in_bytes = GST_VIDEO_FRAME_COMP_WIDTH (&frame, i) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&frame, i); + height = GST_VIDEO_FRAME_COMP_HEIGHT (&frame, i); + + for (guint j = 0; j < height; j++) { + memcpy (dst, src, width_in_bytes); + src += src_stride; + dst += dst_stride; + } + } + + gst_video_frame_unmap (&frame); + + return TRUE; +} + +static gboolean +gst_wic_jpeg_dec_fill_rgb_output (GstWicJpegDec * self, + IWICImagingFactory * factory, IWICBitmapSource * source, GstBuffer * buffer) +{ + ComPtr < IWICBitmap > bitmap; + ComPtr < IWICBitmapLock > bitmap_lock; + WICBitmapPlane plane; + HRESULT hr; + GstVideoFrame frame; + guint8 *src, *dst; + guint src_stride, dst_stride; + guint height, width_in_bytes; + + hr = factory->CreateBitmapFromSource (source, WICBitmapCacheOnDemand, + &bitmap); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to create bitmap from source, hr: 0x%x", + (guint) hr); + return FALSE; + } + + hr = gst_wic_lock_bitmap (bitmap.Get (), nullptr, + WICBitmapLockRead, &bitmap_lock, &plane); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to lock bitmap"); + return FALSE; + } + + if (!gst_video_frame_map (&frame, &self->info, buffer, GST_MAP_WRITE)) { + GST_ERROR_OBJECT (self, "Failed to map output buffer"); + return FALSE; + } + + src = plane.pbBuffer; + dst = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + + src_stride = plane.cbStride; + dst_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&frame, 0); + + width_in_bytes = + GST_VIDEO_FRAME_COMP_WIDTH (&frame, 0) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&frame, 0); + height = GST_VIDEO_FRAME_COMP_HEIGHT (&frame, 0); + + for (guint i = 0; i < height; i++) { + memcpy (dst, src, width_in_bytes); + src += src_stride; + dst += dst_stride; + } + + gst_video_frame_unmap (&frame); + + return TRUE; +} + +static void +gst_wic_jpeg_dec_update_output_state (GstWicJpegDec * self) +{ + GstWicDecoder *wic = GST_WIC_DECODER (self); + GstVideoDecoder *vdec = GST_VIDEO_DECODER (self); + GstVideoCodecState *output_state; + GstVideoInfo *info = &self->info; + GstVideoInfo *output_info; + + output_state = gst_video_decoder_get_output_state (vdec); + if (output_state) { + output_info = &output_state->info; + if (GST_VIDEO_INFO_FORMAT (output_info) == GST_VIDEO_INFO_FORMAT (info) && + GST_VIDEO_INFO_WIDTH (output_info) == GST_VIDEO_INFO_WIDTH (info) && + GST_VIDEO_INFO_HEIGHT (output_info) == GST_VIDEO_INFO_HEIGHT (info)) { + gst_video_codec_state_unref (output_state); + return; + } + gst_video_codec_state_unref (output_state); + } + + output_state = gst_video_decoder_set_output_state (vdec, + GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_WIDTH (info), + GST_VIDEO_INFO_HEIGHT (info), wic->input_state); + + /* Update colorimetry and chroma-site if upstream is not specified */ + if (GST_VIDEO_INFO_IS_YUV (info)) { + GstStructure *s = gst_caps_get_structure (wic->input_state->caps, 0); + + if (wic->input_state->info.chroma_site == GST_VIDEO_CHROMA_SITE_UNKNOWN) + output_state->info.chroma_site = GST_VIDEO_CHROMA_SITE_NONE; + + if (!gst_structure_get_string (s, "colorimetry")) { + output_state->info.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255; + output_state->info.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT601; + output_state->info.colorimetry.transfer = GST_VIDEO_TRANSFER_UNKNOWN; + output_state->info.colorimetry.primaries = + GST_VIDEO_COLOR_PRIMARIES_UNKNOWN; + } + } + + gst_video_codec_state_unref (output_state); + gst_video_decoder_negotiate (vdec); + + return; +} + +static gboolean +gst_wic_jpeg_dec_set_format (GstWicDecoder * decoder, + GstVideoCodecState * state) +{ + GstWicJpegDec *self = GST_WIC_JPEG_DEC (decoder); + + gst_video_info_init (&self->info); + + return TRUE; +} + +static GstFlowReturn +gst_wic_jpeg_dec_process_output (GstWicDecoder * decoder, + IWICImagingFactory * factory, IWICBitmapFrameDecode * decode_frame, + GstVideoCodecFrame * frame) +{ + GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); + GstWicJpegDec *self = GST_WIC_JPEG_DEC (decoder); + GstVideoInfo *info = &decoder->input_state->info; + ComPtr < IWICBitmapSource > source; + ComPtr < IWICBitmapSource > input; + ComPtr < IWICPlanarBitmapSourceTransform > transform; + ComPtr < IWICJpegFrameDecode > jpeg_decode; + UINT width, height; + HRESULT hr; + guint out_width, out_height; + GstFlowReturn flow_ret; + gboolean rst; + WICJpegFrameHeader hdr; + + hr = decode_frame->GetSize (&width, &height); + if (FAILED (hr)) { + GST_ERROR_OBJECT (decoder, "Failed to get size, hr: 0x%x", (guint) hr); + goto error; + } + + hr = decode_frame->QueryInterface (IID_PPV_ARGS (&jpeg_decode)); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "IWICJpegFrameDecode interface is not supported"); + goto error; + } + + hr = jpeg_decode->GetFrameHeader (&hdr); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to get frame header, hr:0x%x", (guint) hr); + goto error; + } + + /* JPEG may have interlaced stream, but WIC supports only single jpeg + * frame per run (other field may be dropped), configure scaler to + * workaround it */ + if (width == info->width && 2 * height == info->height) { + ComPtr < IWICBitmapScaler > scaler; + + GST_LOG_OBJECT (decoder, + "Need scale %dx%d -> %dx%d", width, height, info->width, info->height); + out_width = info->width; + out_height = info->height; + + hr = factory->CreateBitmapScaler (&scaler); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to create scaler, hr: 0x%x", (guint) hr); + goto error; + } + + hr = scaler->Initialize (decode_frame, out_width, out_height, + WICBitmapInterpolationModeHighQualityCubic); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Unable to initialize scaler, hr: 0x%x", + (guint) hr); + goto error; + } + + scaler.As (&input); + } else { + out_width = width; + out_height = height; + input = decode_frame; + } + + /* WIC JPEG decoder supports GRAY8, BGR and CMYK pixel formats as native + * output formats, and staring with Windows 8.1, YUV formats support was added. + * See also + * https://docs.microsoft.com/en-us/windows/win32/wic/-wic-codec-native-pixel-formats#jpeg-native-codec + * https://docs.microsoft.com/en-us/windows/win32/wic/jpeg-ycbcr-support + * + * This element will output the native pixel format if possible, but + * conversion will/should happen for 4:4:0 YUV or CMYK since we don't have any + * defined format for those formats + */ + rst = gst_wic_jpeg_dec_prepare_yuv_output (self, + &hdr, input.Get (), out_width, out_height, &transform); + + if (!rst) { + rst = gst_wic_jpeg_dec_prepare_rgb_output (self, factory, input.Get (), + out_width, out_height, &source); + } + + if (!rst) + goto error; + + gst_wic_jpeg_dec_update_output_state (self); + + flow_ret = gst_video_decoder_allocate_output_frame (vdec, frame); + if (flow_ret != GST_FLOW_OK) { + gst_video_decoder_release_frame (vdec, frame); + GST_INFO_OBJECT (self, "Unable to allocate output"); + return flow_ret; + } + + if (transform) { + rst = gst_wic_jpeg_dec_fill_yuv_output (self, factory, transform.Get (), + frame->output_buffer); + } else { + rst = gst_wic_jpeg_dec_fill_rgb_output (self, factory, source.Get (), + frame->output_buffer); + } + + if (!rst) + goto error; + + return gst_video_decoder_finish_frame (vdec, frame); + +error: + gst_video_decoder_release_frame (vdec, frame); + return GST_FLOW_ERROR; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wic/gstwicjpegdec.h
Added
@@ -0,0 +1,31 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include "gstwicdecoder.h" + +G_BEGIN_DECLS + +#define GST_TYPE_WIC_JPEG_DEC (gst_wic_jpeg_dec_get_type()) +G_DECLARE_FINAL_TYPE (GstWicJpegDec, gst_wic_jpeg_dec, + GST, WIC_JPEG_DEC, GstWicDecoder); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wic/gstwicpngdec.cpp
Added
@@ -0,0 +1,315 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-wicpngdec + * @title: wicpngdec + * + * This element decodes PNG compressed data into RAW video data. + * + * Since: 1.22 + * + */ + +#include "gstwicpngdec.h" + +#include <wrl.h> +#include <string.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +GST_DEBUG_CATEGORY_STATIC (gst_wic_png_dec_debug); +#define GST_CAT_DEFAULT gst_wic_png_dec_debug + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("image/png") + ); + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE + ("{ RGBA64_LE, BGRA, RGBA, BGR, RGB, GRAY8, GRAY16_BE }")) + ); + + +struct _GstWicPngDec +{ + GstWicDecoder parent; + + WICBitmapPlaneDescription plane_descGST_VIDEO_MAX_PLANES; + + GstVideoInfo info; +}; + +static gboolean gst_wic_png_dec_set_format (GstWicDecoder * decoder, + GstVideoCodecState * state); +static GstFlowReturn gst_wic_png_dec_process_output (GstWicDecoder * decoder, + IWICImagingFactory * factory, IWICBitmapFrameDecode * decode_frame, + GstVideoCodecFrame * frame); + +#define gst_wic_decoder_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstWicPngDec, gst_wic_png_dec, GST_TYPE_WIC_DECODER, + GST_DEBUG_CATEGORY_INIT (gst_wic_png_dec_debug, + "wicpngdec", 0, "wicpngdec")); + +static void +gst_wic_png_dec_class_init (GstWicPngDecClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstWicDecoderClass *decoder_class = GST_WIC_DECODER_CLASS (klass); + + gst_element_class_add_static_pad_template (element_class, &sink_template); + gst_element_class_add_static_pad_template (element_class, &src_template); + + gst_element_class_set_static_metadata (element_class, + "Windows Imaging Component PNG decoder", "Codec/Decoder/Image", + "Png image decoder using Windows Imaging Component API", + "Seungha Yang <seungha@centricular.com>"); + + decoder_class->codec_id = GUID_ContainerFormatPng; + decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_wic_png_dec_set_format); + decoder_class->process_output = + GST_DEBUG_FUNCPTR (gst_wic_png_dec_process_output); +} + +static void +gst_wic_png_dec_init (GstWicPngDec * self) +{ + gst_video_info_init (&self->info); + gst_video_decoder_set_packetized (GST_VIDEO_DECODER (self), TRUE); +} + +static gboolean +gst_wic_png_dec_prepare_output (GstWicPngDec * self, + IWICImagingFactory * factory, IWICBitmapSource * input, + guint out_width, guint out_height, IWICBitmapSource ** source) +{ + WICPixelFormatGUID native_pixel_format; + GstVideoFormat native_format = GST_VIDEO_FORMAT_UNKNOWN; + HRESULT hr; + ComPtr < IWICBitmapSource > output; + + hr = input->GetPixelFormat (&native_pixel_format); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to query pixel format, hr: 0x%x", + (guint) hr); + return FALSE; + } + + if (!gst_wic_pixel_format_to_gst (native_pixel_format, &native_format)) { + ComPtr < IWICFormatConverter > conv; + + GST_LOG_OBJECT (self, + "Native format is not supported for output, needs conversion"); + + native_format = GST_VIDEO_FORMAT_BGRA; + if (IsEqualGUID (native_pixel_format, GUID_WICPixelFormat1bppIndexed) + || IsEqualGUID (native_pixel_format, GUID_WICPixelFormat2bppIndexed) + || IsEqualGUID (native_pixel_format, GUID_WICPixelFormat4bppIndexed) + || IsEqualGUID (native_pixel_format, GUID_WICPixelFormat8bppIndexed)) { + /* palette, convert to BGRA */ + native_format = GST_VIDEO_FORMAT_BGRA; + } else if (IsEqualGUID (native_pixel_format, GUID_WICPixelFormatBlackWhite) + || IsEqualGUID (native_pixel_format, GUID_WICPixelFormat2bppGray) + || IsEqualGUID (native_pixel_format, GUID_WICPixelFormat4bppGray)) { + /* gray scale */ + native_format = GST_VIDEO_FORMAT_GRAY8; + } else if (IsEqualGUID (native_pixel_format, GUID_WICPixelFormat48bppRGB)) { + /* 16bits per channel RGB, do we have defined format? */ + native_format = GST_VIDEO_FORMAT_RGBA64_LE; + } + + if (!gst_wic_pixel_format_from_gst (native_format, &native_pixel_format)) { + GST_ERROR_OBJECT (self, "Failed to convert format to WIC"); + return FALSE; + } + + hr = factory->CreateFormatConverter (&conv); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to create converter"); + return FALSE; + } + + hr = conv->Initialize (input, native_pixel_format, + WICBitmapDitherTypeNone, nullptr, 0.0f, WICBitmapPaletteTypeCustom); + + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to initialize converter, hr: 0x%x", + (guint) hr); + return FALSE; + } + + conv.As (&output); + } else { + output = input; + } + + gst_video_info_set_format (&self->info, native_format, out_width, out_height); + + *source = output.Detach (); + + return TRUE; +} + +static gboolean +gst_wic_png_dec_fill_output (GstWicPngDec * self, + IWICImagingFactory * factory, IWICBitmapSource * source, GstBuffer * buffer) +{ + ComPtr < IWICBitmap > bitmap; + ComPtr < IWICBitmapLock > bitmap_lock; + WICBitmapPlane plane; + HRESULT hr; + GstVideoFrame frame; + guint8 *src, *dst; + guint src_stride, dst_stride; + guint height, width_in_bytes; + + hr = factory->CreateBitmapFromSource (source, WICBitmapCacheOnDemand, + &bitmap); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to create bitmap from source, hr: 0x%x", + (guint) hr); + return FALSE; + } + + hr = gst_wic_lock_bitmap (bitmap.Get (), nullptr, + WICBitmapLockRead, &bitmap_lock, &plane); + if (FAILED (hr)) { + GST_ERROR_OBJECT (self, "Failed to lock bitmap"); + return FALSE; + } + + if (!gst_video_frame_map (&frame, &self->info, buffer, GST_MAP_WRITE)) { + GST_ERROR_OBJECT (self, "Failed to map output buffer"); + return FALSE; + } + + src = plane.pbBuffer; + dst = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0); + + src_stride = plane.cbStride; + dst_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&frame, 0); + + width_in_bytes = + GST_VIDEO_FRAME_COMP_WIDTH (&frame, 0) * + GST_VIDEO_FRAME_COMP_PSTRIDE (&frame, 0); + height = GST_VIDEO_FRAME_COMP_HEIGHT (&frame, 0); + + for (guint i = 0; i < height; i++) { + memcpy (dst, src, width_in_bytes); + src += src_stride; + dst += dst_stride; + } + + gst_video_frame_unmap (&frame); + + return TRUE; +} + +static void +gst_wic_png_dec_update_output_state (GstWicPngDec * self) +{ + GstWicDecoder *wic = GST_WIC_DECODER (self); + GstVideoDecoder *vdec = GST_VIDEO_DECODER (self); + GstVideoCodecState *output_state; + GstVideoInfo *info = &self->info; + GstVideoInfo *output_info; + + output_state = gst_video_decoder_get_output_state (vdec); + if (output_state) { + output_info = &output_state->info; + if (GST_VIDEO_INFO_FORMAT (output_info) == GST_VIDEO_INFO_FORMAT (info) && + GST_VIDEO_INFO_WIDTH (output_info) == GST_VIDEO_INFO_WIDTH (info) && + GST_VIDEO_INFO_HEIGHT (output_info) == GST_VIDEO_INFO_HEIGHT (info)) { + gst_video_codec_state_unref (output_state); + return; + } + gst_video_codec_state_unref (output_state); + } + + output_state = gst_video_decoder_set_output_state (vdec, + GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_WIDTH (info), + GST_VIDEO_INFO_HEIGHT (info), wic->input_state); + + gst_video_codec_state_unref (output_state); + gst_video_decoder_negotiate (vdec); + + return; +} + +static gboolean +gst_wic_png_dec_set_format (GstWicDecoder * decoder, GstVideoCodecState * state) +{ + GstWicPngDec *self = GST_WIC_PNG_DEC (decoder); + + gst_video_info_init (&self->info); + + return TRUE; +} + +static GstFlowReturn +gst_wic_png_dec_process_output (GstWicDecoder * decoder, + IWICImagingFactory * factory, IWICBitmapFrameDecode * decode_frame, + GstVideoCodecFrame * frame) +{ + GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder); + GstWicPngDec *self = GST_WIC_PNG_DEC (decoder); + ComPtr < IWICBitmapSource > source; + ComPtr < IWICPlanarBitmapSourceTransform > transform; + UINT width, height; + HRESULT hr; + GstFlowReturn flow_ret; + gboolean rst; + + hr = decode_frame->GetSize (&width, &height); + if (FAILED (hr)) { + GST_ERROR_OBJECT (decoder, "Failed to get size, hr: 0x%x", (guint) hr); + goto error; + } + + rst = gst_wic_png_dec_prepare_output (self, factory, decode_frame, + width, height, &source); + if (!rst) + goto error; + + gst_wic_png_dec_update_output_state (self); + + flow_ret = gst_video_decoder_allocate_output_frame (vdec, frame); + if (flow_ret != GST_FLOW_OK) { + gst_video_decoder_release_frame (vdec, frame); + GST_INFO_OBJECT (self, "Unable to allocate output"); + return flow_ret; + } + + rst = gst_wic_png_dec_fill_output (self, factory, source.Get (), + frame->output_buffer); + if (!rst) + goto error; + + return gst_video_decoder_finish_frame (vdec, frame); + +error: + gst_video_decoder_release_frame (vdec, frame); + return GST_FLOW_ERROR; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wic/gstwicpngdec.h
Added
@@ -0,0 +1,31 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include "gstwicdecoder.h" + +G_BEGIN_DECLS + +#define GST_TYPE_WIC_PNG_DEC (gst_wic_png_dec_get_type()) +G_DECLARE_FINAL_TYPE (GstWicPngDec, gst_wic_png_dec, + GST, WIC_PNG_DEC, GstWicDecoder); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wic/gstwicutils.cpp
Added
@@ -0,0 +1,123 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "gstwicutils.h" + +#include <wrl.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +GST_DEBUG_CATEGORY_EXTERN (gst_wic_utils_debug); +#define GST_CAT_DEFAULT gst_wic_utils_debug + +static struct +{ + WICPixelFormatGUID guid; + GstVideoFormat format; +} format_map = { + /* GRAY */ + {GUID_WICPixelFormat8bppGray, GST_VIDEO_FORMAT_GRAY8}, + {GUID_WICPixelFormat16bppGray, GST_VIDEO_FORMAT_GRAY16_LE}, + + /* RGB/BGR */ + {GUID_WICPixelFormat24bppRGB, GST_VIDEO_FORMAT_RGB}, + {GUID_WICPixelFormat24bppBGR, GST_VIDEO_FORMAT_BGR}, + {GUID_WICPixelFormat32bppRGB, GST_VIDEO_FORMAT_RGBx}, + {GUID_WICPixelFormat32bppBGR, GST_VIDEO_FORMAT_BGRx}, + {GUID_WICPixelFormat32bppRGBA, GST_VIDEO_FORMAT_RGBA}, + {GUID_WICPixelFormat32bppBGRA, GST_VIDEO_FORMAT_BGRA}, + {GUID_WICPixelFormat64bppRGBA, GST_VIDEO_FORMAT_RGBA64_LE}, +}; + +gboolean +gst_wic_pixel_format_to_gst (REFWICPixelFormatGUID guid, + GstVideoFormat * format) +{ + g_return_val_if_fail (format != nullptr, FALSE); + + *format = GST_VIDEO_FORMAT_UNKNOWN; + + for (guint i = 0; i < G_N_ELEMENTS (format_map); i++) { + if (IsEqualGUID (format_mapi.guid, guid)) { + *format = format_mapi.format; + return TRUE; + } + } + + return FALSE; +} + +gboolean +gst_wic_pixel_format_from_gst (GstVideoFormat format, WICPixelFormatGUID * guid) +{ + g_return_val_if_fail (guid != nullptr, FALSE); + + *guid = GUID_WICPixelFormatUndefined; + + for (guint i = 0; i < G_N_ELEMENTS (format_map); i++) { + if (format_mapi.format == format) { + *guid = format_mapi.guid; + return TRUE; + } + } + + return FALSE; +} + +HRESULT +gst_wic_lock_bitmap (IWICBitmap * bitmap, const WICRect * rect, + DWORD lock_flags, IWICBitmapLock ** bitmap_lock, WICBitmapPlane * plane) +{ + ComPtr < IWICBitmapLock > lock; + HRESULT hr; + + g_return_val_if_fail (bitmap != nullptr, E_INVALIDARG); + g_return_val_if_fail (bitmap_lock != nullptr, E_INVALIDARG); + g_return_val_if_fail (plane != nullptr, E_INVALIDARG); + + hr = bitmap->Lock (rect, lock_flags, &lock); + if (FAILED (hr)) { + GST_ERROR ("Failed to lock plane hr: 0x%x", (guint) hr); + return hr; + } + + hr = lock->GetStride (&plane->cbStride); + if (FAILED (hr)) { + GST_ERROR ("Failed get stride, hr: 0x%x", (guint) hr); + return hr; + } + + hr = lock->GetDataPointer (&plane->cbBufferSize, &plane->pbBuffer); + if (FAILED (hr)) { + GST_ERROR ("Failed to get data pointer, hr: 0x%x", (guint) hr); + return hr; + } + + hr = lock->GetPixelFormat (&plane->Format); + if (FAILED (hr)) { + GST_ERROR ("Failed to get pixel format, hr: 0x%x", (guint) hr); + return hr; + } + + *bitmap_lock = lock.Detach (); + + return S_OK; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wic/gstwicutils.h
Added
@@ -0,0 +1,53 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <windows.h> +#ifndef INITGUID +#include <initguid.h> +#endif + +#include <wincodec.h> +#include <wincodecsdk.h> + +G_BEGIN_DECLS + +#define GST_WIC_CLEAR_COM(obj) G_STMT_START { \ + if (obj) { \ + (obj)->Release (); \ + (obj) = NULL; \ + } \ + } G_STMT_END + +gboolean gst_wic_pixel_format_to_gst (REFWICPixelFormatGUID guid, + GstVideoFormat * format); + +gboolean gst_wic_pixel_format_from_gst (GstVideoFormat format, + WICPixelFormatGUID * guid); + +HRESULT gst_wic_lock_bitmap (IWICBitmap * bitmap, + const WICRect * rect, + DWORD lock_flags, + IWICBitmapLock ** bitmap_lock, + WICBitmapPlane * plane); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wic/meson.build
Added
@@ -0,0 +1,78 @@ +wic_sources = + 'gstwicdecoder.cpp', + 'gstwicimagingfactory.cpp', + 'gstwicjpegdec.cpp', + 'gstwicpngdec.cpp', + 'gstwicutils.cpp', + 'plugin.cpp', + + +extra_args = +wic_deps = + +wic_option = get_option('wic') +if host_system != 'windows' or wic_option.disabled() + subdir_done() +endif + +if cc.get_id() != 'msvc' + if wic_option.enabled() + error('wic plugin can only be built with MSVC') + endif + subdir_done() +endif + +windowscodecs_lib = cc.find_library('windowscodecs', required : wic_option) +have_wic = windowscodecs_lib.found() and cc.has_header('wincodec.h') and cc.has_header('wincodecsdk.h') +if not have_wic + if wic_option.enabled() + error('The wic plugin was enabled explicitly, but required libraries were not found.') + endif + subdir_done() +endif + +wic_deps += windowscodecs_lib + +win10_sdk = cxx.compiles('''#include <windows.h> + #ifndef WDK_NTDDI_VERSION + #error "unknown Windows SDK version" + #endif + #if (WDK_NTDDI_VERSION < 0x0A000000) + #error "Not a Windows 10 SDK" + #endif + ''', + name: 'building with Windows 10 SDK') + +if not win10_sdk + if wic_option.enabled() + error('wic plugin was enabled explicitly, but Windows 10 SDK is unavailable') + else + subdir_done() + endif +endif + +building_for_win10 = cxx.compiles('''#include <windows.h> + #ifndef WINVER + #error "unknown minimum supported OS version" + #endif + #if (WINVER < 0x0A00) + #error "Windows 10 API is not guaranteed" + #endif + ''', + name: 'building for Windows 10') + +if not building_for_win10 + message('Bumping target Windows version to Windows 10 for building wic plugin') + extra_args += '-DWINVER=0x0A00', '-D_WIN32_WINNT=0x0A00', '-DNTDDI_VERSION=WDK_NTDDI_VERSION' +endif + +gstwic = library('gstwic', + wic_sources, + c_args : gst_plugins_bad_args + extra_args, + cpp_args : gst_plugins_bad_args + extra_args, + include_directories : configinc, + dependencies : gstbase_dep, gstvideo_dep + wic_deps, + install : true, + install_dir : plugins_install_dir, +) +plugins += gstwic
View file
gst-plugins-bad-1.22.0.tar.xz/sys/wic/plugin.cpp
Added
@@ -0,0 +1,83 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * plugin-wic: + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include "gstwicimagingfactory.h" +#include "gstwicjpegdec.h" +#include "gstwicpngdec.h" + +GST_DEBUG_CATEGORY (gst_wic_debug); +GST_DEBUG_CATEGORY (gst_wic_utils_debug); + +#define GST_CAT_DEFAULT gst_wic_debug + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GstWicImagingFactory *factory; + HRESULT hr; + + GST_DEBUG_CATEGORY_INIT (gst_wic_debug, + "wic", 0, "Windows Imaging Component"); + GST_DEBUG_CATEGORY_INIT (gst_wic_utils_debug, "wicutils", 0, "wicutils"); + + factory = gst_wic_imaging_factory_new (); + if (!factory) + return TRUE; + + hr = gst_wic_imaging_factory_check_codec_support (factory, + TRUE, GUID_ContainerFormatJpeg); + if (SUCCEEDED (hr)) { + gst_element_register (plugin, + "wicjpegdec", GST_RANK_SECONDARY, GST_TYPE_WIC_JPEG_DEC); + } else { + GST_INFO_OBJECT (factory, + "Jpeg decoder is not supported, hr: 0x%x", (guint) hr); + } + + hr = gst_wic_imaging_factory_check_codec_support (factory, + TRUE, GUID_ContainerFormatPng); + if (SUCCEEDED (hr)) { + gst_element_register (plugin, + "wicpngdec", GST_RANK_SECONDARY, GST_TYPE_WIC_PNG_DEC); + } else { + GST_INFO_OBJECT (factory, + "Png decoder is not supported, hr: 0x%x", (guint) hr); + } + + gst_object_unref (factory); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + wic, + "Windows Imaging Component (WIC) plugin", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/gstwin32ipcutils.cpp
Added
@@ -0,0 +1,71 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "gstwin32ipcutils.h" +#include <windows.h> +#include <string> +#include <mutex> + +static ULONG global_index = 0; + +static DWORD +gst_win32_ipc_get_pid (void) +{ + static std::once_flag once_flag; + static DWORD pid = 0; + + std::call_once (once_flag,&() { + pid = GetCurrentProcessId (); + }); + + return pid; +} + +/* Create unique prefix for named shared memory */ +gchar * +gst_win32_ipc_get_mmf_prefix (void) +{ + std::string prefix = "Local\\gst.win32.ipc." + + std::to_string (gst_win32_ipc_get_pid ()) + std::string (".") + + std::to_string (InterlockedIncrement (&global_index)) + std::string ("."); + + return g_strdup (prefix.c_str ()); +} + +gboolean +gst_win32_ipc_clock_is_qpc (GstClock * clock) +{ + GstClockType clock_type = GST_CLOCK_TYPE_MONOTONIC; + GstClock *mclock; + + if (G_OBJECT_TYPE (clock) != GST_TYPE_SYSTEM_CLOCK) + return FALSE; + + g_object_get (clock, "clock-type", &clock_type, nullptr); + if (clock_type != GST_CLOCK_TYPE_MONOTONIC) + return FALSE; + + mclock = gst_clock_get_master (clock); + if (!mclock) + return TRUE; + + gst_object_unref (mclock); + + return FALSE; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/gstwin32ipcutils.h
Added
@@ -0,0 +1,30 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> + +G_BEGIN_DECLS + +gchar * gst_win32_ipc_get_mmf_prefix (void); + +gboolean gst_win32_ipc_clock_is_qpc (GstClock * clock); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/gstwin32ipcvideosink.cpp
Added
@@ -0,0 +1,463 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-win32ipcvideosink + * @title: win32ipcvideosink + * @short_description: Windows shared memory video sink + * + * win32ipcvideosink provides raw video memory to connected win32ipcvideossrc + * elements + * + * ## Example launch line + * ``` + * gst-launch-1.0 videotestsrc ! queue ! win32ipcvideosink + * ``` + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstwin32ipcvideosink.h" +#include "gstwin32ipcutils.h" +#include "protocol/win32ipcpipeserver.h" +#include <string> +#include <string.h> + +GST_DEBUG_CATEGORY_STATIC (gst_win32_ipc_video_sink_debug); +#define GST_CAT_DEFAULT gst_win32_ipc_video_sink_debug + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (GST_VIDEO_FORMATS_ALL))); + +enum +{ + PROP_0, + PROP_PIPE_NAME, +}; + +#define DEFAULT_PIPE_NAME "\\\\.\\pipe\\gst.win32.ipc.video" + +struct _GstWin32IpcVideoSink +{ + GstBaseSink parent; + + GstVideoInfo info; + Win32IpcPipeServer *pipe; + gchar *mmf_prefix; + guint64 seq_num; + LARGE_INTEGER frequency; + + Win32IpcMmf *mmf; + Win32IpcVideoInfo minfo; + + /* properties */ + gchar *pipe_name; +}; + +static void gst_win32_ipc_video_sink_finalize (GObject * object); +static void gst_win32_ipc_video_sink_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_win32_video_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstClock *gst_win32_ipc_video_sink_provide_clock (GstElement * elem); + +static gboolean gst_win32_ipc_video_sink_start (GstBaseSink * sink); +static gboolean gst_win32_ipc_video_sink_stop (GstBaseSink * sink); +static gboolean gst_win32_ipc_video_sink_unlock_stop (GstBaseSink * sink); +static gboolean gst_win32_ipc_video_sink_set_caps (GstBaseSink * sink, + GstCaps * caps); +static void gst_win32_ipc_video_sink_get_time (GstBaseSink * sink, + GstBuffer * buf, GstClockTime * start, GstClockTime * end); +static gboolean gst_win32_ipc_video_sink_propose_allocation (GstBaseSink * sink, + GstQuery * query); +static GstFlowReturn gst_win32_ipc_video_sink_prepare (GstBaseSink * sink, + GstBuffer * buf); +static GstFlowReturn gst_win32_ipc_video_sink_render (GstBaseSink * sink, + GstBuffer * buf); + +#define gst_win32_ipc_video_sink_parent_class parent_class +G_DEFINE_TYPE (GstWin32IpcVideoSink, gst_win32_ipc_video_sink, + GST_TYPE_BASE_SINK); + +static void +gst_win32_ipc_video_sink_class_init (GstWin32IpcVideoSinkClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstBaseSinkClass *sink_class = GST_BASE_SINK_CLASS (klass); + + object_class->finalize = gst_win32_ipc_video_sink_finalize; + object_class->set_property = gst_win32_ipc_video_sink_set_property; + object_class->get_property = gst_win32_video_sink_get_property; + + g_object_class_install_property (object_class, PROP_PIPE_NAME, + g_param_spec_string ("pipe-name", "Pipe Name", + "The name of Win32 named pipe to communicate with clients. " + "Validation of the pipe name is caller's responsibility", + DEFAULT_PIPE_NAME, (GParamFlags) (G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY))); + + gst_element_class_set_static_metadata (element_class, + "Win32 IPC Video Sink", "Sink/Video", + "Send video frames to win32ipcvideosrc elements", + "Seungha Yang <seungha@centricular.com>"); + gst_element_class_add_static_pad_template (element_class, &sink_template); + + element_class->provide_clock = + GST_DEBUG_FUNCPTR (gst_win32_ipc_video_sink_provide_clock); + + sink_class->start = GST_DEBUG_FUNCPTR (gst_win32_ipc_video_sink_start); + sink_class->stop = GST_DEBUG_FUNCPTR (gst_win32_ipc_video_sink_stop); + sink_class->unlock_stop = + GST_DEBUG_FUNCPTR (gst_win32_ipc_video_sink_unlock_stop); + sink_class->set_caps = GST_DEBUG_FUNCPTR (gst_win32_ipc_video_sink_set_caps); + sink_class->propose_allocation = + GST_DEBUG_FUNCPTR (gst_win32_ipc_video_sink_propose_allocation); + sink_class->get_times = GST_DEBUG_FUNCPTR (gst_win32_ipc_video_sink_get_time); + sink_class->prepare = GST_DEBUG_FUNCPTR (gst_win32_ipc_video_sink_prepare); + sink_class->render = GST_DEBUG_FUNCPTR (gst_win32_ipc_video_sink_render); + + GST_DEBUG_CATEGORY_INIT (gst_win32_ipc_video_sink_debug, "win32ipcvideosink", + 0, "win32ipcvideosink"); +} + +static void +gst_win32_ipc_video_sink_init (GstWin32IpcVideoSink * self) +{ + self->pipe_name = g_strdup (DEFAULT_PIPE_NAME); + QueryPerformanceFrequency (&self->frequency); + + GST_OBJECT_FLAG_SET (self, GST_ELEMENT_FLAG_PROVIDE_CLOCK); + GST_OBJECT_FLAG_SET (self, GST_ELEMENT_FLAG_REQUIRE_CLOCK); +} + +static void +gst_win32_ipc_video_sink_finalize (GObject * object) +{ + GstWin32IpcVideoSink *self = GST_WIN32_IPC_VIDEO_SINK (object); + + g_free (self->pipe_name); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_win32_ipc_video_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstWin32IpcVideoSink *self = GST_WIN32_IPC_VIDEO_SINK (object); + + switch (prop_id) { + case PROP_PIPE_NAME: + GST_OBJECT_LOCK (self); + g_free (self->pipe_name); + self->pipe_name = g_value_dup_string (value); + if (!self->pipe_name) + self->pipe_name = g_strdup (DEFAULT_PIPE_NAME); + GST_OBJECT_UNLOCK (self); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_win32_video_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstWin32IpcVideoSink *self = GST_WIN32_IPC_VIDEO_SINK (object); + + switch (prop_id) { + case PROP_PIPE_NAME: + GST_OBJECT_LOCK (self); + g_value_set_string (value, self->pipe_name); + GST_OBJECT_UNLOCK (self); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstClock * +gst_win32_ipc_video_sink_provide_clock (GstElement * elem) +{ + return gst_system_clock_obtain (); +} + +static gboolean +gst_win32_ipc_video_sink_start (GstBaseSink * sink) +{ + GstWin32IpcVideoSink *self = GST_WIN32_IPC_VIDEO_SINK (sink); + + GST_DEBUG_OBJECT (self, "Start"); + + self->pipe = win32_ipc_pipe_server_new (self->pipe_name); + if (!self->pipe) { + GST_ERROR_OBJECT (self, "Couldn't create pipe server"); + return FALSE; + } + + self->mmf_prefix = gst_win32_ipc_get_mmf_prefix (); + self->seq_num = 0; + + return TRUE; +} + +static gboolean +gst_win32_ipc_video_sink_stop (GstBaseSink * sink) +{ + GstWin32IpcVideoSink *self = GST_WIN32_IPC_VIDEO_SINK (sink); + + GST_DEBUG_OBJECT (self, "Stop"); + + g_clear_pointer (&self->pipe, win32_ipc_pipe_server_unref); + g_clear_pointer (&self->mmf_prefix, g_free); + g_clear_pointer (&self->mmf, win32_ipc_mmf_unref); + + return TRUE; +} + +static gboolean +gst_win32_ipc_video_sink_unlock_stop (GstBaseSink * sink) +{ + GstWin32IpcVideoSink *self = GST_WIN32_IPC_VIDEO_SINK (sink); + + g_clear_pointer (&self->mmf, win32_ipc_mmf_unref); + + return TRUE; +} + +static void +gst_win32_ipc_video_sink_get_time (GstBaseSink * sink, GstBuffer * buf, + GstClockTime * start, GstClockTime * end) +{ + GstWin32IpcVideoSink *self = GST_WIN32_IPC_VIDEO_SINK (sink); + GstClockTime timestamp; + + timestamp = GST_BUFFER_PTS (buf); + if (!GST_CLOCK_TIME_IS_VALID (timestamp)) + timestamp = GST_BUFFER_DTS (buf); + + if (GST_CLOCK_TIME_IS_VALID (timestamp)) { + *start = timestamp; + if (GST_BUFFER_DURATION_IS_VALID (buf)) { + *end = timestamp + GST_BUFFER_DURATION (buf); + } else if (self->info.fps_n > 0) { + *end = timestamp + + gst_util_uint64_scale_int (GST_SECOND, self->info.fps_d, + self->info.fps_n); + } else if (sink->segment.rate < 0) { + *end = timestamp; + } + } +} + +static gboolean +gst_win32_ipc_video_sink_set_caps (GstBaseSink * sink, GstCaps * caps) +{ + GstWin32IpcVideoSink *self = GST_WIN32_IPC_VIDEO_SINK (sink); + + if (!gst_video_info_from_caps (&self->info, caps)) { + GST_WARNING_OBJECT (self, "Invalid caps"); + return FALSE; + } + + memset (&self->minfo, 0, sizeof (Win32IpcVideoInfo)); + self->minfo.format = + (Win32IpcVideoFormat) GST_VIDEO_INFO_FORMAT (&self->info); + self->minfo.width = GST_VIDEO_INFO_WIDTH (&self->info); + self->minfo.height = GST_VIDEO_INFO_HEIGHT (&self->info); + self->minfo.fps_n = self->info.fps_n; + self->minfo.fps_d = self->info.fps_d; + self->minfo.par_n = self->info.par_n; + self->minfo.par_d = self->info.par_d; + + return TRUE; +} + +static gboolean +gst_win32_ipc_video_sink_propose_allocation (GstBaseSink * sink, + GstQuery * query) +{ + GstCaps *caps; + GstBufferPool *pool = nullptr; + GstVideoInfo info; + guint size; + gboolean need_pool; + + gst_query_parse_allocation (query, &caps, &need_pool); + if (!caps) { + GST_WARNING_OBJECT (sink, "No caps specified"); + return FALSE; + } + + if (!gst_video_info_from_caps (&info, caps)) { + GST_WARNING_OBJECT (sink, "Invalid caps %" GST_PTR_FORMAT, caps); + return FALSE; + } + + /* the normal size of a frame */ + size = info.size; + if (need_pool) { + GstStructure *config; + + pool = gst_video_buffer_pool_new (); + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_add_option (config, + GST_BUFFER_POOL_OPTION_VIDEO_META); + + size = GST_VIDEO_INFO_SIZE (&info); + + gst_buffer_pool_config_set_params (config, caps, (guint) size, 0, 0); + + if (!gst_buffer_pool_set_config (pool, config)) { + GST_ERROR_OBJECT (pool, "Couldn't set config"); + gst_object_unref (pool); + + return FALSE; + } + } + + gst_query_add_allocation_pool (query, pool, size, 0, 0); + gst_clear_object (&pool); + + gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); + + return TRUE; +} + +static GstFlowReturn +gst_win32_ipc_video_sink_prepare (GstBaseSink * sink, GstBuffer * buf) +{ + GstWin32IpcVideoSink *self = GST_WIN32_IPC_VIDEO_SINK (sink); + std::string mmf_name; + GstVideoFrame frame; + GstMapInfo info; + + g_clear_pointer (&self->mmf, win32_ipc_mmf_unref); + + if (!gst_video_frame_map (&frame, &self->info, buf, GST_MAP_READ)) { + GST_ERROR_OBJECT (self, "Couldn't map frame"); + return GST_FLOW_ERROR; + } + + mmf_name = std::string (self->mmf_prefix) + std::to_string (self->seq_num); + self->seq_num++; + + self->mmf = win32_ipc_mmf_alloc (GST_VIDEO_FRAME_SIZE (&frame), + mmf_name.c_str ()); + if (!self->mmf) { + GST_ERROR_OBJECT (self, "Couldn't create memory with name %s", + mmf_name.c_str ()); + gst_video_frame_unmap (&frame); + return GST_FLOW_ERROR; + } + + self->minfo.size = GST_VIDEO_FRAME_SIZE (&frame); + for (guint i = 0; i < GST_VIDEO_FRAME_N_PLANES (&frame); i++) { + self->minfo.offseti = GST_VIDEO_FRAME_PLANE_OFFSET (&frame, i); + self->minfo.stridei = GST_VIDEO_FRAME_PLANE_STRIDE (&frame, i); + } + gst_video_frame_unmap (&frame); + + gst_buffer_map (buf, &info, GST_MAP_READ); + memcpy (win32_ipc_mmf_get_raw (self->mmf), info.data, self->minfo.size); + gst_buffer_unmap (buf, &info); + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_win32_ipc_video_sink_render (GstBaseSink * sink, GstBuffer * buf) +{ + GstWin32IpcVideoSink *self = GST_WIN32_IPC_VIDEO_SINK (sink); + LARGE_INTEGER cur_time; + GstClockTime pts; + GstClockTime now_qpc; + GstClockTime buf_pts; + GstClockTime buffer_clock = GST_CLOCK_TIME_NONE; + + QueryPerformanceCounter (&cur_time); + pts = now_qpc = gst_util_uint64_scale (cur_time.QuadPart, GST_SECOND, + self->frequency.QuadPart); + + buf_pts = GST_BUFFER_PTS (buf); + if (!GST_CLOCK_TIME_IS_VALID (buf_pts)) + buf_pts = GST_BUFFER_DTS (buf); + + if (GST_CLOCK_TIME_IS_VALID (buf_pts)) { + buffer_clock = gst_segment_to_running_time (&sink->segment, + GST_FORMAT_TIME, buf_pts) + + GST_ELEMENT_CAST (sink)->base_time + gst_base_sink_get_latency (sink); + } + + if (GST_CLOCK_TIME_IS_VALID (buffer_clock)) { + GstClock *clock = gst_element_get_clock (GST_ELEMENT_CAST (sink)); + gboolean is_qpc = TRUE; + + is_qpc = gst_win32_ipc_clock_is_qpc (clock); + if (!is_qpc) { + GstClockTime now_gst = gst_clock_get_time (clock); + GstClockTimeDiff converted = buffer_clock; + + GST_LOG_OBJECT (self, "Clock is not QPC"); + + converted -= now_gst; + converted += now_qpc; + + if (converted < 0) { + /* Shouldn't happen */ + GST_WARNING_OBJECT (self, "Negative buffer clock"); + pts = 0; + } else { + pts = converted; + } + } else { + GST_LOG_OBJECT (self, "Clock is QPC already"); + /* buffer clock is already QPC time */ + pts = buffer_clock; + } + gst_object_unref (clock); + } + + self->minfo.qpc = pts; + + if (!self->pipe) { + GST_ERROR_OBJECT (self, "Pipe server was not configured"); + return GST_FLOW_ERROR; + } + + /* win32_ipc_pipe_server_send_mmf() takes ownership of mmf */ + if (!win32_ipc_pipe_server_send_mmf (self->pipe, + (Win32IpcMmf *) g_steal_pointer (&self->mmf), &self->minfo)) { + GST_ERROR_OBJECT (self, "Couldn't send buffer"); + return GST_FLOW_ERROR; + } + + return GST_FLOW_OK; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/gstwin32ipcvideosink.h
Added
@@ -0,0 +1,32 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/base/gstbasesink.h> +#include <gst/video/video.h> + +G_BEGIN_DECLS + +#define GST_TYPE_WIN32_IPC_VIDEO_SINK (gst_win32_ipc_video_sink_get_type()) +G_DECLARE_FINAL_TYPE (GstWin32IpcVideoSink, gst_win32_ipc_video_sink, + GST, WIN32_IPC_VIDEO_SINK, GstBaseSink); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/gstwin32ipcvideosrc.cpp
Added
@@ -0,0 +1,544 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-win32ipcvideosrc + * @title: win32ipcvideosrc + * @short_description: Windows shared memory video source + * + * win32ipcvideosrc receives raw video frames from win32ipcvideosink + * and outputs the received video frames + * + * ## Example launch line + * ``` + * gst-launch-1.0 win32ipcvideosrc ! queue ! videoconvert ! d3d11videosink + * ``` + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstwin32ipcvideosrc.h" +#include "gstwin32ipcutils.h" +#include "protocol/win32ipcpipeclient.h" +#include <string> + +GST_DEBUG_CATEGORY_STATIC (gst_win32_ipc_video_src_debug); +#define GST_CAT_DEFAULT gst_win32_ipc_video_src_debug + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (GST_VIDEO_FORMATS_ALL))); + +enum +{ + PROP_0, + PROP_PIPE_NAME, + PROP_PROCESSING_DEADLINE, +}; + +#define DEFAULT_PIPE_NAME "\\\\.\\pipe\\gst.win32.ipc.video" +#define DEFAULT_PROCESSING_DEADLINE (20 * GST_MSECOND) + +struct _GstWin32IpcVideoSrc +{ + GstBaseSrc parent; + + GstVideoInfo info; + + Win32IpcPipeClient *pipe; + GstCaps *caps; + gboolean flushing; + SRWLOCK lock; + gboolean have_video_meta; + gsize offsetGST_VIDEO_MAX_PLANES; + gint strideGST_VIDEO_MAX_PLANES; + LARGE_INTEGER frequency; + GstBufferPool *pool; + + /* properties */ + gchar *pipe_name; + GstClockTime processing_deadline; +}; + +static void gst_win32_ipc_video_src_finalize (GObject * object); +static void gst_win32_ipc_video_src_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_win32_video_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstClock *gst_win32_video_src_provide_clock (GstElement * elem); + +static gboolean gst_win32_ipc_video_src_start (GstBaseSrc * src); +static gboolean gst_win32_ipc_video_src_stop (GstBaseSrc * src); +static gboolean gst_win32_ipc_video_src_unlock (GstBaseSrc * src); +static gboolean gst_win32_ipc_video_src_unlock_stop (GstBaseSrc * src); +static gboolean gst_win32_ipc_video_src_query (GstBaseSrc * src, + GstQuery * query); +static gboolean gst_win32_ipc_video_src_decide_allocation (GstBaseSrc * src, + GstQuery * query); +static GstFlowReturn gst_win32_ipc_video_src_create (GstBaseSrc * src, + guint64 offset, guint size, GstBuffer ** buf); + +#define gst_win32_ipc_video_src_parent_class parent_class +G_DEFINE_TYPE (GstWin32IpcVideoSrc, gst_win32_ipc_video_src, GST_TYPE_BASE_SRC); + +static void +gst_win32_ipc_video_src_class_init (GstWin32IpcVideoSrcClass * klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstBaseSrcClass *src_class = GST_BASE_SRC_CLASS (klass); + + object_class->finalize = gst_win32_ipc_video_src_finalize; + object_class->set_property = gst_win32_ipc_video_src_set_property; + object_class->get_property = gst_win32_video_src_get_property; + + g_object_class_install_property (object_class, PROP_PIPE_NAME, + g_param_spec_string ("pipe-name", "Pipe Name", + "The name of Win32 named pipe to communicate with server. " + "Validation of the pipe name is caller's responsibility", + DEFAULT_PIPE_NAME, (GParamFlags) (G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY))); + g_object_class_install_property (object_class, PROP_PROCESSING_DEADLINE, + g_param_spec_uint64 ("processing-deadline", "Processing deadline", + "Maximum processing time for a buffer in nanoseconds", 0, G_MAXUINT64, + DEFAULT_PROCESSING_DEADLINE, (GParamFlags) (G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_PLAYING))); + + gst_element_class_set_static_metadata (element_class, + "Win32 IPC Video Source", "Source/Video", + "Receive video frames from the win32ipcvideosink", + "Seungha Yang <seungha@centricular.com>"); + gst_element_class_add_static_pad_template (element_class, &src_template); + + element_class->provide_clock = + GST_DEBUG_FUNCPTR (gst_win32_video_src_provide_clock); + + src_class->start = GST_DEBUG_FUNCPTR (gst_win32_ipc_video_src_start); + src_class->stop = GST_DEBUG_FUNCPTR (gst_win32_ipc_video_src_stop); + src_class->unlock = GST_DEBUG_FUNCPTR (gst_win32_ipc_video_src_unlock); + src_class->unlock_stop = + GST_DEBUG_FUNCPTR (gst_win32_ipc_video_src_unlock_stop); + src_class->query = GST_DEBUG_FUNCPTR (gst_win32_ipc_video_src_query); + src_class->decide_allocation = + GST_DEBUG_FUNCPTR (gst_win32_ipc_video_src_decide_allocation); + src_class->create = GST_DEBUG_FUNCPTR (gst_win32_ipc_video_src_create); + + GST_DEBUG_CATEGORY_INIT (gst_win32_ipc_video_src_debug, "win32ipcvideosrc", + 0, "win32ipcvideosrc"); +} + +static void +gst_win32_ipc_video_src_init (GstWin32IpcVideoSrc * self) +{ + gst_base_src_set_format (GST_BASE_SRC (self), GST_FORMAT_TIME); + gst_base_src_set_live (GST_BASE_SRC (self), TRUE); + self->pipe_name = g_strdup (DEFAULT_PIPE_NAME); + self->processing_deadline = DEFAULT_PROCESSING_DEADLINE; + QueryPerformanceFrequency (&self->frequency); + + GST_OBJECT_FLAG_SET (self, GST_ELEMENT_FLAG_PROVIDE_CLOCK); + GST_OBJECT_FLAG_SET (self, GST_ELEMENT_FLAG_REQUIRE_CLOCK); +} + +static void +gst_win32_ipc_video_src_finalize (GObject * object) +{ + GstWin32IpcVideoSrc *self = GST_WIN32_IPC_VIDEO_SRC (object); + + g_free (self->pipe_name); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_win32_ipc_video_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstWin32IpcVideoSrc *self = GST_WIN32_IPC_VIDEO_SRC (object); + + switch (prop_id) { + case PROP_PIPE_NAME: + GST_OBJECT_LOCK (self); + g_free (self->pipe_name); + self->pipe_name = g_value_dup_string (value); + if (!self->pipe_name) + self->pipe_name = g_strdup (DEFAULT_PIPE_NAME); + GST_OBJECT_UNLOCK (self); + break; + case PROP_PROCESSING_DEADLINE: + { + GstClockTime prev_val, new_val; + GST_OBJECT_LOCK (self); + prev_val = self->processing_deadline; + new_val = g_value_get_uint64 (value); + self->processing_deadline = new_val; + GST_OBJECT_UNLOCK (self); + + if (prev_val != new_val) { + GST_DEBUG_OBJECT (self, "Posting latency message"); + gst_element_post_message (GST_ELEMENT_CAST (self), + gst_message_new_latency (GST_OBJECT_CAST (self))); + } + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_win32_video_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstWin32IpcVideoSrc *self = GST_WIN32_IPC_VIDEO_SRC (object); + + switch (prop_id) { + case PROP_PIPE_NAME: + GST_OBJECT_LOCK (self); + g_value_set_string (value, self->pipe_name); + GST_OBJECT_UNLOCK (self); + break; + case PROP_PROCESSING_DEADLINE: + GST_OBJECT_LOCK (self); + g_value_set_uint64 (value, self->processing_deadline); + GST_OBJECT_UNLOCK (self); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstClock * +gst_win32_video_src_provide_clock (GstElement * elem) +{ + return gst_system_clock_obtain (); +} + +static gboolean +gst_win32_ipc_video_src_start (GstBaseSrc * src) +{ + GstWin32IpcVideoSrc *self = GST_WIN32_IPC_VIDEO_SRC (src); + + GST_DEBUG_OBJECT (self, "Start"); + + gst_video_info_init (&self->info); + + return TRUE; +} + +static gboolean +gst_win32_ipc_video_src_stop (GstBaseSrc * src) +{ + GstWin32IpcVideoSrc *self = GST_WIN32_IPC_VIDEO_SRC (src); + + GST_DEBUG_OBJECT (self, "Stop"); + + g_clear_pointer (&self->pipe, win32_ipc_pipe_client_unref); + gst_clear_caps (&self->caps); + if (self->pool) { + gst_buffer_pool_set_active (self->pool, FALSE); + gst_clear_object (&self->pool); + } + + return TRUE; +} + +static gboolean +gst_win32_ipc_video_src_unlock (GstBaseSrc * src) +{ + GstWin32IpcVideoSrc *self = GST_WIN32_IPC_VIDEO_SRC (src); + + GST_DEBUG_OBJECT (self, "Unlock"); + + AcquireSRWLockExclusive (&self->lock); + self->flushing = TRUE; + if (self->pipe) + win32_ipc_pipe_client_shutdown (self->pipe); + ReleaseSRWLockExclusive (&self->lock); + + return TRUE; +} + +static gboolean +gst_win32_ipc_video_src_unlock_stop (GstBaseSrc * src) +{ + GstWin32IpcVideoSrc *self = GST_WIN32_IPC_VIDEO_SRC (src); + + GST_DEBUG_OBJECT (self, "Unlock stop"); + + AcquireSRWLockExclusive (&self->lock); + g_clear_pointer (&self->pipe, win32_ipc_pipe_client_unref); + gst_clear_caps (&self->caps); + self->flushing = FALSE; + ReleaseSRWLockExclusive (&self->lock); + + return TRUE; +} + +static gboolean +gst_win32_ipc_video_src_query (GstBaseSrc * src, GstQuery * query) +{ + GstWin32IpcVideoSrc *self = GST_WIN32_IPC_VIDEO_SRC (src); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY: + { + GST_OBJECT_LOCK (self); + if (GST_CLOCK_TIME_IS_VALID (self->processing_deadline)) { + gst_query_set_latency (query, TRUE, self->processing_deadline, + /* pipe server can hold up to 5 memory objects */ + 5 * self->processing_deadline); + } else { + gst_query_set_latency (query, TRUE, 0, 0); + } + GST_OBJECT_UNLOCK (self); + return TRUE; + } + default: + break; + } + + return GST_BASE_SRC_CLASS (parent_class)->query (src, query); +} + +static gboolean +gst_win32_ipc_video_src_decide_allocation (GstBaseSrc * src, GstQuery * query) +{ + GstWin32IpcVideoSrc *self = GST_WIN32_IPC_VIDEO_SRC (src); + gboolean ret; + + ret = GST_BASE_SRC_CLASS (parent_class)->decide_allocation (src, query); + if (!ret) + return ret; + + self->have_video_meta = gst_query_find_allocation_meta (query, + GST_VIDEO_META_API_TYPE, nullptr); + GST_DEBUG_OBJECT (self, "Downstream supports video meta: %d", + self->have_video_meta); + + return TRUE; +} + +static GstCaps * +gst_win32_ipc_video_src_update_info_and_get_caps (GstWin32IpcVideoSrc * self, + const Win32IpcVideoInfo * info) +{ + GstVideoInfo vinfo; + + gst_video_info_set_format (&vinfo, (GstVideoFormat) info->format, + info->width, info->height); + vinfo.fps_n = info->fps_n; + vinfo.fps_d = info->fps_d; + vinfo.par_n = info->par_n; + vinfo.par_d = info->par_d; + + if (!self->caps || !gst_video_info_is_equal (&self->info, &vinfo)) { + self->info = vinfo; + return gst_video_info_to_caps (&vinfo); + } + + return nullptr; +} + +static gboolean +gst_win32_ipc_ensure_fallback_pool (GstWin32IpcVideoSrc * self) +{ + GstStructure *config; + + if (self->pool) + return TRUE; + + self->pool = gst_video_buffer_pool_new (); + config = gst_buffer_pool_get_config (self->pool); + gst_buffer_pool_config_set_params (config, self->caps, + GST_VIDEO_INFO_SIZE (&self->info), 0, 0); + if (!gst_buffer_pool_set_config (self->pool, config)) { + GST_ERROR_OBJECT (self, "Couldn't set config"); + goto error; + } + + if (!gst_buffer_pool_set_active (self->pool, TRUE)) { + GST_ERROR_OBJECT (self, "Couldn't set active"); + goto error; + } + + return TRUE; + +error: + gst_clear_object (&self->pool); + return FALSE; +} + +static GstFlowReturn +gst_win32_ipc_video_src_create (GstBaseSrc * src, guint64 offset, guint size, + GstBuffer ** buf) +{ + GstWin32IpcVideoSrc *self = GST_WIN32_IPC_VIDEO_SRC (src); + GstCaps *caps; + Win32IpcMmf *mmf; + Win32IpcVideoInfo info; + GstFlowReturn ret = GST_FLOW_OK; + GstBuffer *buffer; + GstClock *clock; + GstClockTime pts; + GstClockTime base_time; + GstClockTime now_qpc; + GstClockTime now_gst; + LARGE_INTEGER cur_time; + gboolean is_qpc = TRUE; + gboolean need_video_meta = FALSE; + + AcquireSRWLockExclusive (&self->lock); + if (self->flushing) { + ReleaseSRWLockExclusive (&self->lock); + return GST_FLOW_FLUSHING; + } + + if (!self->pipe) { + self->pipe = win32_ipc_pipe_client_new (self->pipe_name); + if (!self->pipe) { + ReleaseSRWLockExclusive (&self->lock); + GST_ERROR_OBJECT (self, "Couldn't create pipe"); + return GST_FLOW_ERROR; + } + } + ReleaseSRWLockExclusive (&self->lock); + + if (!win32_ipc_pipe_client_get_mmf (self->pipe, &mmf, &info)) { + AcquireSRWLockExclusive (&self->lock); + if (self->flushing) { + ret = GST_FLOW_FLUSHING; + GST_DEBUG_OBJECT (self, "Flushing"); + } else { + ret = GST_FLOW_EOS; + GST_WARNING_OBJECT (self, "Couldn't get buffer from server"); + } + ReleaseSRWLockExclusive (&self->lock); + return ret; + } + + caps = gst_win32_ipc_video_src_update_info_and_get_caps (self, &info); + for (guint i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->info); i++) { + self->offseti = (gsize) info.offseti; + self->stridei = (gint) info.stridei; + + if (self->offseti != self->info.offseti || + self->stridei != self->info.stridei) { + need_video_meta = TRUE; + } + } + + if (caps) { + if (self->pool) { + gst_buffer_pool_set_active (self->pool, FALSE); + gst_clear_object (&self->pool); + } + + gst_caps_replace (&self->caps, caps); + GST_DEBUG_OBJECT (self, "Setting caps %" GST_PTR_FORMAT, caps); + gst_pad_set_caps (GST_BASE_SRC_PAD (src), caps); + gst_caps_unref (caps); + } + + if (self->have_video_meta || !need_video_meta) { + buffer = gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, + win32_ipc_mmf_get_raw (mmf), win32_ipc_mmf_get_size (mmf), + 0, win32_ipc_mmf_get_size (mmf), mmf, + (GDestroyNotify) win32_ipc_mmf_unref); + + if (self->have_video_meta) { + gst_buffer_add_video_meta_full (buffer, + GST_VIDEO_FRAME_FLAG_NONE, GST_VIDEO_INFO_FORMAT (&self->info), + GST_VIDEO_INFO_WIDTH (&self->info), + GST_VIDEO_INFO_HEIGHT (&self->info), + GST_VIDEO_INFO_N_PLANES (&self->info), self->offset, self->stride); + } + } else { + GstVideoFrame mmf_frame, frame; + + if (!gst_win32_ipc_ensure_fallback_pool (self)) { + win32_ipc_mmf_unref (mmf); + return GST_FLOW_ERROR; + } + + ret = gst_buffer_pool_acquire_buffer (self->pool, &buffer, nullptr); + if (ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (self, "Couldn't acquire buffer"); + win32_ipc_mmf_unref (mmf); + return GST_FLOW_ERROR; + } + + gst_video_frame_map (&frame, &self->info, buffer, GST_MAP_WRITE); + mmf_frame.info = self->info; + + for (guint i = 0; i < GST_VIDEO_FRAME_N_PLANES (&frame); i++) { + mmf_frame.info.offseti = self->offseti; + mmf_frame.info.stridei = self->stridei; + mmf_frame.datai = (guint8 *) win32_ipc_mmf_get_raw (mmf) + + self->offseti; + } + + gst_video_frame_copy (&frame, &mmf_frame); + gst_video_frame_unmap (&frame); + win32_ipc_mmf_unref (mmf); + } + + QueryPerformanceCounter (&cur_time); + now_qpc = gst_util_uint64_scale (cur_time.QuadPart, GST_SECOND, + self->frequency.QuadPart); + clock = gst_element_get_clock (GST_ELEMENT_CAST (self)); + now_gst = gst_clock_get_time (clock); + base_time = GST_ELEMENT_CAST (self)->base_time; + + is_qpc = gst_win32_ipc_clock_is_qpc (clock); + gst_object_unref (clock); + + if (!is_qpc) { + GstClockTimeDiff now_pts = now_gst - base_time + info.qpc - now_qpc; + + if (now_pts >= 0) + pts = now_pts; + else + pts = 0; + } else { + if (info.qpc >= base_time) { + /* Our base_time is also QPC */ + pts = info.qpc - base_time; + } else { + GST_WARNING_OBJECT (self, "Server QPC is smaller than our QPC base time"); + pts = 0; + } + } + + GST_BUFFER_PTS (buffer) = pts; + GST_BUFFER_DTS (buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE; + + *buf = buffer; + + return GST_FLOW_OK; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/gstwin32ipcvideosrc.h
Added
@@ -0,0 +1,32 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> +#include <gst/base/gstbasesrc.h> +#include <gst/video/video.h> + +G_BEGIN_DECLS + +#define GST_TYPE_WIN32_IPC_VIDEO_SRC (gst_win32_ipc_video_src_get_type()) +G_DECLARE_FINAL_TYPE (GstWin32IpcVideoSrc, gst_win32_ipc_video_src, + GST, WIN32_IPC_VIDEO_SRC, GstBaseSrc); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/meson.build
Added
@@ -0,0 +1,39 @@ +win32ipc_sources = + 'protocol/win32ipcmmf.cpp', + 'protocol/win32ipcpipeclient.cpp', + 'protocol/win32ipcpipeserver.cpp', + 'protocol/win32ipcprotocol.cpp', + 'protocol/win32ipcutils.cpp', + 'gstwin32ipcutils.cpp', + 'gstwin32ipcvideosink.cpp', + 'gstwin32ipcvideosrc.cpp', + 'plugin.cpp', + + +if host_system != 'windows' or get_option('win32ipc').disabled() + subdir_done() +endif + +code = ''' +#include <windows.h> +#if !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) +#error "Not building for UWP" +#endif''' +if cc.compiles(code, name : 'building for UWP') + if get_option('win32ipc').enabled() + error('win32ipc plugin does not support UWP') + else + subdir_done() + endif +endif + +gstwin32ipc = library('gstwin32ipc', + win32ipc_sources, + c_args : gst_plugins_bad_args, + cpp_args: gst_plugins_bad_args, + include_directories : configinc, + dependencies : gstbase_dep, gstvideo_dep, + install : true, + install_dir : plugins_install_dir, +) +plugins += gstwin32ipc
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/plugin.cpp
Added
@@ -0,0 +1,56 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * plugin-win32ipc: + * + * Windows IPC plugin + * + * Since: 1.22 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include "gstwin32ipcvideosink.h" +#include "gstwin32ipcvideosrc.h" + +GST_DEBUG_CATEGORY (gst_win32_ipc_debug); +#define GST_CAT_DEFAULT gst_win32_ipc_debug + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gst_win32_ipc_debug, "win32ipc", 0, "win32ipc"); + + gst_element_register (plugin, + "win32ipcvideosink", GST_RANK_NONE, GST_TYPE_WIN32_IPC_VIDEO_SINK); + gst_element_register (plugin, + "win32ipcvideosrc", GST_RANK_NONE, GST_TYPE_WIN32_IPC_VIDEO_SRC); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + win32ipc, + "Windows IPC plugin", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/protocol
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/protocol/win32ipcmmf.cpp
Added
@@ -0,0 +1,241 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "win32ipcmmf.h" +#include "win32ipcutils.h" +#include <string> + +GST_DEBUG_CATEGORY_EXTERN (gst_win32_ipc_debug); +#define GST_CAT_DEFAULT gst_win32_ipc_debug + +struct Win32IpcMmf +{ + explicit Win32IpcMmf (HANDLE f, void * b, UINT32 s, const std::string & n) + : file (f), buffer (b), size (s), name (n), ref_count (1) + { + } + + ~Win32IpcMmf () + { + GST_TRACE ("Freeing %p (%s)", this, name.c_str ()); + if (buffer) + UnmapViewOfFile (buffer); + if (file) + CloseHandle (file); + } + + HANDLE file; + void *buffer; + UINT32 size; + std::string name; + ULONG ref_count; +}; + +static Win32IpcMmf * +win32_pic_mmf_new (HANDLE file, UINT32 size, const char * name) +{ + Win32IpcMmf *self; + void *buffer; + std::string msg; + UINT err_code; + + buffer = MapViewOfFile (file, FILE_MAP_ALL_ACCESS, 0, 0, size); + if (!buffer) { + err_code = GetLastError (); + msg = win32_ipc_error_message (err_code); + GST_ERROR ("MapViewOfFile failed with 0x%x (%s)", + err_code, msg.c_str ()); + CloseHandle (file); + return nullptr; + } + + self = new Win32IpcMmf (file, buffer, size, name); + + return self; +} + +/** + * win32_ipc_mmf_alloc: + * @size: Size of memory to allocate + * @name: The name of Memory Mapped File + * + * Creates named shared memory + * + * Returns: a new Win32IpcMmf object + */ +Win32IpcMmf * +win32_ipc_mmf_alloc (UINT32 size, const char * name) +{ + HANDLE file; + std::string msg; + UINT err_code; + + if (!size) { + GST_ERROR ("Zero size is not allowed"); + return nullptr; + } + + if (!name) { + GST_ERROR ("Name must be specified"); + return nullptr; + } + + file = CreateFileMappingA (INVALID_HANDLE_VALUE, nullptr, + PAGE_READWRITE | SEC_COMMIT, 0, size, name); + if (!file) { + err_code = GetLastError (); + msg = win32_ipc_error_message (err_code); + GST_ERROR ("CreateFileMappingA failed with 0x%x (%s)", + err_code, msg.c_str ()); + return nullptr; + } + + /* The name is already occupied, it's caller's fault... */ + if (GetLastError () == ERROR_ALREADY_EXISTS) { + GST_ERROR ("File already exists"); + CloseHandle (file); + return nullptr; + } + + return win32_pic_mmf_new (file, size, name); +} + +/** + * win32_ipc_mmf_open: + * @size: Size of memory to allocate + * @name: The name of Memory Mapped File + * + * Opens named shared memory + * + * Returns: a new Win32IpcMmf object + */ +Win32IpcMmf * +win32_ipc_mmf_open (UINT32 size, const char * name) +{ + HANDLE file; + std::string msg; + UINT err_code; + + if (!size) { + GST_ERROR ("Zero size is not allowed"); + return nullptr; + } + + if (!name) { + GST_ERROR ("Name must be specified"); + return nullptr; + } + + file = OpenFileMappingA (FILE_MAP_ALL_ACCESS, FALSE, name); + if (!file) { + err_code = GetLastError (); + msg = win32_ipc_error_message (err_code); + GST_ERROR ("OpenFileMappingA failed with 0x%x (%s)", + err_code, msg.c_str ()); + return nullptr; + } + + return win32_pic_mmf_new (file, size, name); +} + +/** + * win32_ipc_mmf_get_name: + * @mmf: a Win32IpcMmf object + * + * Returns: the name of @mmf + */ +const char * +win32_ipc_mmf_get_name (Win32IpcMmf * mmf) +{ + if (!mmf) + return nullptr; + + return mmf->name.c_str (); +} + +/** + * win32_ipc_mmf_get_size: + * @mmf: a Win32IpcMmf object + * + * Returns: the size of allocated memory + */ +UINT32 +win32_ipc_mmf_get_size (Win32IpcMmf * mmf) +{ + if (!mmf) + return 0; + + return mmf->size; +} + +/** + * win32_ipc_mmf_get_raw: + * @mmf: a Win32IpcMmf object + * + * Returns: the address of allocated memory + */ +void * +win32_ipc_mmf_get_raw (Win32IpcMmf * mmf) +{ + if (!mmf) + return nullptr; + + return mmf->buffer; +} + +/** + * win32_ipc_mmf_ref: + * @mmf: a Win32IpcMmf object + * + * Increase ref count + */ +Win32IpcMmf * +win32_ipc_mmf_ref (Win32IpcMmf * mmf) +{ + if (!mmf) + return nullptr; + + InterlockedIncrement (&mmf->ref_count); + + return mmf; +} + +/** + * win32_ipc_mmf_unref: + * @mmf: a Win32IpcMmf object + * + * Decrease ref count + */ +void +win32_ipc_mmf_unref (Win32IpcMmf * mmf) +{ + ULONG count; + + if (!mmf) + return; + + count = InterlockedDecrement (&mmf->ref_count); + if (count == 0) + delete mmf; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/protocol/win32ipcmmf.h
Added
@@ -0,0 +1,50 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include <gst/gst.h> +#include <windows.h> + +G_BEGIN_DECLS + +struct Win32IpcMmf; + +Win32IpcMmf * win32_ipc_mmf_alloc (UINT32 size, + const char * name); + +Win32IpcMmf * win32_ipc_mmf_open (UINT32 size, + const char * name); + +const char * win32_ipc_mmf_get_name (Win32IpcMmf * mmf); + +UINT32 win32_ipc_mmf_get_size (Win32IpcMmf * mmf); + +void * win32_ipc_mmf_get_raw (Win32IpcMmf * mmf); + +Win32IpcMmf * win32_ipc_mmf_ref (Win32IpcMmf * mmf); + +void win32_ipc_mmf_unref (Win32IpcMmf * mmf); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/protocol/win32ipcpipeclient.cpp
Added
@@ -0,0 +1,448 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "win32ipcpipeclient.h" +#include "win32ipcutils.h" +#include <mutex> +#include <condition_variable> +#include <memory> +#include <thread> +#include <queue> +#include <string> + +GST_DEBUG_CATEGORY_EXTERN (gst_win32_ipc_debug); +#define GST_CAT_DEFAULT gst_win32_ipc_debug + +#define CONN_BUFFER_SIZE 1024 + +struct MmfInfo +{ + Win32IpcMmf *mmf; + Win32IpcVideoInfo info; +}; + +struct ClientConnection : public OVERLAPPED +{ + ClientConnection () : pipe (INVALID_HANDLE_VALUE), to_read (0), to_write (0), + seq_num (0) + { + OVERLAPPED *parent = dynamic_cast<OVERLAPPED *> (this); + parent->Internal = 0; + parent->InternalHigh = 0; + parent->Offset = 0; + parent->OffsetHigh = 0; + } + + Win32IpcPipeClient *self; + HANDLE pipe; + UINT8 client_msgCONN_BUFFER_SIZE; + UINT32 to_read; + UINT8 server_msgCONN_BUFFER_SIZE; + UINT32 to_write; + UINT64 seq_num; +}; + +struct Win32IpcPipeClient +{ + explicit Win32IpcPipeClient (const std::string & n) + : name (n), ref_count(1), last_err (ERROR_SUCCESS) + { + cancellable = CreateEventA (nullptr, TRUE, FALSE, nullptr); + conn.pipe = INVALID_HANDLE_VALUE; + conn.self = this; + } + + ~Win32IpcPipeClient () + { + GST_DEBUG ("Free client %p", this); + win32_ipc_pipe_client_shutdown (this); + CloseHandle (cancellable); + } + + std::mutex lock; + std::condition_variable cond; + std::unique_ptr<std::thread> thread; + std::queue<MmfInfo> queue; + std::string name; + + ULONG ref_count; + HANDLE cancellable; + UINT last_err; + ClientConnection conn; +}; + +static DWORD +win32_ipc_pipe_client_send_need_data_async (Win32IpcPipeClient * self); + +static VOID WINAPI +win32_ipc_pipe_client_send_read_done_finish (DWORD error_code, DWORD n_bytes, + LPOVERLAPPED overlapped) +{ + ClientConnection *conn = (ClientConnection *) overlapped; + Win32IpcPipeClient *self = conn->self; + + if (error_code != ERROR_SUCCESS) { + std::string msg = win32_ipc_error_message (error_code); + self->last_err = error_code; + GST_WARNING ("READ-DONE failed with 0x%x (%s)", + self->last_err, msg.c_str ()); + goto error; + } + + GST_TRACE ("READ-DONE sent"); + + self->last_err = win32_ipc_pipe_client_send_need_data_async (self); + if (self->last_err != ERROR_SUCCESS) + goto error; + + /* All done, back to need-data state */ + return; + +error: + SetEvent (self->cancellable); +} + +static DWORD +win32_ipc_pipe_client_send_read_done_async (Win32IpcPipeClient * self) +{ + ClientConnection *conn = &self->conn; + + conn->to_write = win32_ipc_pkt_build_read_done (conn->client_msg, + CONN_BUFFER_SIZE, conn->seq_num); + if (conn->to_write == 0) { + GST_ERROR ("Couldn't build READ-DONE pkt"); + return ERROR_BAD_FORMAT; + } + + GST_TRACE ("Sending READ-DONE"); + + if (!WriteFileEx (conn->pipe, conn->client_msg, conn->to_write, + (OVERLAPPED *) conn, win32_ipc_pipe_client_send_read_done_finish)) { + UINT last_err = GetLastError (); + std::string msg = win32_ipc_error_message (last_err); + + GST_WARNING ("WriteFileEx failed with 0x%x (%s)", last_err, msg.c_str ()); + return last_err; + } + + return ERROR_SUCCESS; +} + +static VOID WINAPI +win32_ipc_pipe_client_receive_have_data_finish (DWORD error_code, DWORD n_bytes, + LPOVERLAPPED overlapped) +{ + ClientConnection *conn = (ClientConnection *) overlapped; + Win32IpcPipeClient *self = conn->self; + char mmf_name1024 = { '\0', }; + Win32IpcVideoInfo info; + Win32IpcMmf *mmf; + MmfInfo minfo; + + if (error_code != ERROR_SUCCESS) { + std::string msg = win32_ipc_error_message (error_code); + self->last_err = error_code; + GST_WARNING ("HAVE-DATA failed with 0x%x (%s)", + self->last_err, msg.c_str ()); + goto error; + } + + if (!win32_ipc_pkt_parse_have_data (conn->server_msg, n_bytes, + &conn->seq_num, mmf_name, &info)) { + self->last_err = ERROR_BAD_FORMAT; + GST_WARNING ("Couldn't parse HAVE-DATA pkg"); + goto error; + } + + mmf = win32_ipc_mmf_open (info.size, mmf_name); + if (!mmf) { + GST_ERROR ("Couldn't open file %s", mmf_name); + self->last_err = ERROR_BAD_FORMAT; + goto error; + } + + GST_TRACE ("Got HAVE-DATA %s", mmf_name); + + minfo.mmf = mmf; + minfo.info = info; + + { + std::lock_guard<std::mutex> lk (self->lock); + /* Drops too old data */ + while (self->queue.size () > 5) { + MmfInfo info = self->queue.front (); + + self->queue.pop (); + win32_ipc_mmf_unref (info.mmf); + } + + self->queue.push (minfo); + self->cond.notify_all (); + } + + self->last_err = win32_ipc_pipe_client_send_read_done_async (self); + if (self->last_err != ERROR_SUCCESS) + goto error; + + return; + +error: + SetEvent (self->cancellable); +} + +static DWORD +win32_ipc_pipe_client_receive_have_data_async (Win32IpcPipeClient * self) +{ + ClientConnection *conn = &self->conn; + + GST_TRACE ("Waiting HAVE-DATA"); + + if (!ReadFileEx (conn->pipe, conn->server_msg, CONN_BUFFER_SIZE, + (OVERLAPPED *) conn, win32_ipc_pipe_client_receive_have_data_finish)) { + UINT last_err = GetLastError (); + std::string msg = win32_ipc_error_message (last_err); + GST_WARNING ("ReadFileEx failed with 0x%x (%s)", last_err, msg.c_str ()); + return last_err; + } + + return ERROR_SUCCESS; +} + +static VOID WINAPI +pipe_clinet_send_need_data_finish (DWORD error_code, DWORD n_bytes, + LPOVERLAPPED overlapped) +{ + ClientConnection *conn = (ClientConnection *) overlapped; + Win32IpcPipeClient *self = conn->self; + + if (error_code != ERROR_SUCCESS) { + std::string msg = win32_ipc_error_message (error_code); + self->last_err = error_code; + GST_WARNING ("NEED-DATA failed with 0x%x (%s)", + self->last_err, msg.c_str ()); + goto error; + } + + self->last_err = win32_ipc_pipe_client_receive_have_data_async (self); + if (self->last_err != ERROR_SUCCESS) + goto error; + + return; + +error: + SetEvent (self->cancellable); +} + +static DWORD +win32_ipc_pipe_client_send_need_data_async (Win32IpcPipeClient * self) +{ + ClientConnection *conn = &self->conn; + + conn->to_write = win32_ipc_pkt_build_need_data (conn->client_msg, + CONN_BUFFER_SIZE, conn->seq_num); + if (conn->to_write == 0) { + GST_ERROR ("Couldn't build NEED-DATA pkt"); + return ERROR_BAD_FORMAT; + } + + GST_TRACE ("Sending NEED-DATA"); + + if (!WriteFileEx (conn->pipe, conn->client_msg, conn->to_write, + (OVERLAPPED *) conn, pipe_clinet_send_need_data_finish)) { + UINT last_err = GetLastError (); + std::string msg = win32_ipc_error_message (last_err); + GST_WARNING ("WriteFileEx failed with 0x%x (%s)", last_err, msg.c_str ()); + return last_err; + } + + return ERROR_SUCCESS; +} + +static VOID +win32_ipc_pipe_client_loop (Win32IpcPipeClient * self) +{ + DWORD mode = PIPE_READMODE_MESSAGE; + std::unique_lock<std::mutex> lk (self->lock); + ClientConnection *conn = &self->conn; + + conn->pipe = CreateFileA (self->name.c_str (), + GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, nullptr); + self->last_err = GetLastError (); + if (conn->pipe == INVALID_HANDLE_VALUE) { + std::string msg = win32_ipc_error_message (self->last_err); + GST_WARNING ("CreateFileA failed with 0x%x (%s)", self->last_err, + msg.c_str ()); + self->cond.notify_all (); + return; + } + + if (!SetNamedPipeHandleState (conn->pipe, &mode, nullptr, nullptr)) { + self->last_err = GetLastError (); + std::string msg = win32_ipc_error_message (self->last_err); + GST_WARNING ("SetNamedPipeHandleState failed with 0x%x (%s)", + self->last_err, msg.c_str ()); + CloseHandle (conn->pipe); + conn->pipe = INVALID_HANDLE_VALUE; + self->cond.notify_all (); + return; + } + + self->last_err = ERROR_SUCCESS; + self->cond.notify_all (); + lk.unlock (); + + /* Once connection is established, send NEED-DATA message to server, + * and then it will loop NEED-DATA -> HAVE-DATA -> READ-DONE */ + self->last_err = win32_ipc_pipe_client_send_need_data_async (self); + if (self->last_err != ERROR_SUCCESS) + goto out; + + do { + /* Enters alertable thread state and wait for I/O completion event + * or cancellable event */ + DWORD ret = WaitForSingleObjectEx (self->cancellable, INFINITE, TRUE); + if (ret == WAIT_OBJECT_0) { + GST_DEBUG ("Operation cancelled"); + CancelIoEx (conn->pipe, (OVERLAPPED *) &conn); + break; + } else if (ret != WAIT_IO_COMPLETION) { + GST_WARNING ("Unexpected wait return 0x%x", (UINT) ret); + CancelIoEx (conn->pipe, (OVERLAPPED *) &conn); + break; + } + } while (true); + +out: + if (conn->pipe != INVALID_HANDLE_VALUE) + CloseHandle (conn->pipe); + + lk.lock (); + self->last_err = ERROR_OPERATION_ABORTED; + conn->pipe = INVALID_HANDLE_VALUE; + self->cond.notify_all (); +} + +static BOOL +win32_ipc_pipe_client_run (Win32IpcPipeClient * self) +{ + std::unique_lock<std::mutex> lk (self->lock); + + self->thread = std::make_unique<std::thread> + (std::thread (win32_ipc_pipe_client_loop, self)); + self->cond.wait (lk); + + if (self->last_err != ERROR_SUCCESS) { + self->thread->join (); + self->thread = nullptr; + return FALSE; + } + + return TRUE; +} + +Win32IpcPipeClient * +win32_ipc_pipe_client_new (const char * pipe_name) +{ + Win32IpcPipeClient *self; + + if (!pipe_name) { + GST_ERROR ("Pipe name must be specified"); + return nullptr; + } + + self = new Win32IpcPipeClient (pipe_name); + + if (!win32_ipc_pipe_client_run (self)) { + win32_ipc_pipe_client_unref (self); + return nullptr; + } + + return self; +} + +Win32IpcPipeClient * +win32_ipc_pipe_client_ref (Win32IpcPipeClient * client) +{ + InterlockedIncrement (&client->ref_count); + + return client; +} + +void +win32_ipc_pipe_client_unref (Win32IpcPipeClient * client) +{ + ULONG ref_count; + + ref_count = InterlockedDecrement (&client->ref_count); + if (ref_count == 0) + delete client; +} + +void +win32_ipc_pipe_client_shutdown (Win32IpcPipeClient * client) +{ + GST_DEBUG ("Shutting down %p", client); + + SetEvent (client->cancellable); + if (client->thread) { + client->thread->join (); + client->thread = nullptr; + } + + std::lock_guard<std::mutex> lk (client->lock); + client->last_err = ERROR_OPERATION_ABORTED; + while (!client->queue.empty ()) { + MmfInfo info = client->queue.front (); + + client->queue.pop (); + win32_ipc_mmf_unref (info.mmf); + } + client->cond.notify_all (); +} + +BOOL +win32_ipc_pipe_client_get_mmf (Win32IpcPipeClient * client, Win32IpcMmf ** mmf, + Win32IpcVideoInfo * info) +{ + std::unique_lock<std::mutex> lk (client->lock); + if (client->last_err != ERROR_SUCCESS) { + GST_WARNING ("Last error code was 0x%x", client->last_err); + return FALSE; + } + + while (client->queue.empty () && client->last_err == ERROR_SUCCESS) + client->cond.wait (lk); + + if (client->last_err != ERROR_SUCCESS || client->queue.empty ()) + return FALSE; + + MmfInfo mmf_info = client->queue.front (); + client->queue.pop (); + + *mmf = mmf_info.mmf; + *info = mmf_info.info; + + return TRUE; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/protocol/win32ipcpipeclient.h
Added
@@ -0,0 +1,49 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include <windows.h> +#include <string.h> +#include "win32ipcmmf.h" +#include "win32ipcprotocol.h" +#include <gst/gst.h> + +G_BEGIN_DECLS + +struct Win32IpcPipeClient; + +Win32IpcPipeClient * win32_ipc_pipe_client_new (const char * pipe_name); + +Win32IpcPipeClient * win32_ipc_pipe_client_ref (Win32IpcPipeClient * client); + +void win32_ipc_pipe_client_unref (Win32IpcPipeClient * client); + +void win32_ipc_pipe_client_shutdown (Win32IpcPipeClient * client); + +BOOL win32_ipc_pipe_client_get_mmf (Win32IpcPipeClient * client, + Win32IpcMmf ** mmf, + Win32IpcVideoInfo * info); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/protocol/win32ipcpipeserver.cpp
Added
@@ -0,0 +1,550 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "win32ipcpipeserver.h" +#include "win32ipcutils.h" +#include <mutex> +#include <condition_variable> +#include <memory> +#include <thread> +#include <queue> +#include <vector> +#include <string> +#include <algorithm> +#include <assert.h> + +GST_DEBUG_CATEGORY_EXTERN (gst_win32_ipc_debug); +#define GST_CAT_DEFAULT gst_win32_ipc_debug + +#define CONN_BUFFER_SIZE 1024 + +struct MmfInfo +{ + explicit MmfInfo (Win32IpcMmf * m, const Win32IpcVideoInfo * i, UINT64 s) + { + mmf = m; + info = *i; + seq_num = s; + } + + ~MmfInfo() + { + if (mmf) + win32_ipc_mmf_unref (mmf); + } + + Win32IpcMmf *mmf = nullptr; + Win32IpcVideoInfo info; + UINT64 seq_num; +}; + +struct ServerConnection : public OVERLAPPED +{ + ServerConnection(Win32IpcPipeServer * server, HANDLE p) + : self(server), pipe(p) + { + OVERLAPPED *parent = dynamic_cast<OVERLAPPED *> (this); + parent->Internal = 0; + parent->InternalHigh = 0; + parent->Offset = 0; + parent->OffsetHigh = 0; + } + + Win32IpcPipeServer *self; + std::shared_ptr<MmfInfo> minfo; + HANDLE pipe = INVALID_HANDLE_VALUE; + UINT8 client_msgCONN_BUFFER_SIZE; + UINT32 to_read = 0; + UINT8 server_msgCONN_BUFFER_SIZE; + UINT32 to_write = 0; + UINT64 seq_num = 0; + BOOL pending_have_data = FALSE; +}; + +struct Win32IpcPipeServer +{ + explicit Win32IpcPipeServer (const std::string & n) + : name (n), ref_count (1), last_err (ERROR_SUCCESS), seq_num (0) + { + enqueue_event = CreateEventA (nullptr, FALSE, FALSE, nullptr); + cancellable = CreateEventA (nullptr, TRUE, FALSE, nullptr); + } + + ~Win32IpcPipeServer () + { + win32_ipc_pipe_server_shutdown (this); + CloseHandle (cancellable); + CloseHandle (enqueue_event); + } + + std::mutex lock; + std::condition_variable cond; + std::unique_ptr<std::thread> thread; + std::shared_ptr<MmfInfo> minfo; + std::string name; + std::vector<ServerConnection *> conn; + + ULONG ref_count; + HANDLE enqueue_event; + HANDLE cancellable; + UINT last_err; + UINT64 seq_num; +}; + +static void +win32_ipc_pipe_server_receive_need_data_async (ServerConnection * conn); + +static void +win32_ipc_pipe_server_close_connection (ServerConnection * conn, + BOOL remove_from_list) +{ + Win32IpcPipeServer *self = conn->self; + + GST_DEBUG ("Closing connection %p", conn); + + if (remove_from_list) { + self->conn.erase (std::remove (self->conn.begin (), self->conn.end (), + conn), self->conn.end ()); + } + + if (!DisconnectNamedPipe (conn->pipe)) { + UINT last_err = GetLastError (); + std::string msg = win32_ipc_error_message (last_err); + GST_WARNING ("DisconnectNamedPipe failed with 0x%x (%s)", + last_err, msg.c_str ()); + } + + CloseHandle (conn->pipe); + delete conn; +} + +static void WINAPI +win32_ipc_pipe_server_receive_read_done_finish (DWORD error_code, DWORD n_bytes, + LPOVERLAPPED overlapped) +{ + ServerConnection *conn = (ServerConnection *) overlapped; + + if (error_code != ERROR_SUCCESS) { + std::string msg = win32_ipc_error_message (error_code); + + GST_WARNING ("READ-DONE failed with 0x%x (%s)", + (UINT) error_code, msg.c_str ()); + win32_ipc_pipe_server_close_connection (conn, TRUE); + return; + } + + GST_TRACE ("Got READ-DONE %p", conn); + + conn->minfo = nullptr; + + /* All done, wait for need-data again */ + win32_ipc_pipe_server_receive_need_data_async (conn); +} + +static void +win32_ipc_pipe_server_receive_read_done_async (ServerConnection * conn) +{ + GST_TRACE ("Waiting READ-DONE %p", conn); + + if (!ReadFileEx (conn->pipe, conn->client_msg, CONN_BUFFER_SIZE, + (OVERLAPPED *) conn, win32_ipc_pipe_server_receive_read_done_finish)) { + UINT last_err = GetLastError (); + std::string msg = win32_ipc_error_message (last_err); + GST_WARNING ("ReadFileEx failed with 0x%x (%s)", last_err, msg.c_str ()); + + win32_ipc_pipe_server_close_connection (conn, TRUE); + } +} + +static void WINAPI +win32_ipc_pipe_server_send_have_data_finish (DWORD error_code, DWORD n_bytes, + LPOVERLAPPED overlapped) +{ + ServerConnection *conn = (ServerConnection *) overlapped; + + if (error_code != ERROR_SUCCESS) { + std::string msg = win32_ipc_error_message (error_code); + GST_WARNING ("HAVE-DATA failed with 0x%x (%s)", + (UINT) error_code, msg.c_str ()); + win32_ipc_pipe_server_close_connection (conn, TRUE); + return; + } + + GST_TRACE ("HAVE-DATA done with %s", + win32_ipc_mmf_get_name (conn->minfo->mmf)); + + win32_ipc_pipe_server_receive_read_done_async (conn); +} + +static void +win32_ipc_pipe_server_send_have_data_async (ServerConnection * conn) +{ + assert (conn->minfo != nullptr); + + conn->pending_have_data = FALSE; + conn->seq_num = conn->minfo->seq_num; + + conn->to_write = win32_ipc_pkt_build_have_data (conn->server_msg, + CONN_BUFFER_SIZE, conn->seq_num, + win32_ipc_mmf_get_name (conn->minfo->mmf), &conn->minfo->info); + if (conn->to_write == 0) { + GST_ERROR ("Couldn't build HAVE-DATA pkt"); + win32_ipc_pipe_server_close_connection (conn, TRUE); + return; + } + + conn->seq_num++; + + GST_TRACE ("Sending HAVE-DATA"); + + if (!WriteFileEx (conn->pipe, conn->server_msg, conn->to_write, + (OVERLAPPED *) conn, win32_ipc_pipe_server_send_have_data_finish)) { + UINT last_err = GetLastError (); + std::string msg = win32_ipc_error_message (last_err); + GST_WARNING ("WriteFileEx failed with 0x%x (%s)", last_err, msg.c_str ()); + win32_ipc_pipe_server_close_connection (conn, TRUE); + } +} + +static void WINAPI +win32_ipc_pipe_server_receive_need_data_finish (DWORD error_code, DWORD n_bytes, + LPOVERLAPPED overlapped) +{ + ServerConnection *conn = (ServerConnection *) overlapped; + UINT64 seq_num; + + if (error_code != ERROR_SUCCESS) { + std::string msg = win32_ipc_error_message (error_code); + GST_WARNING ("NEED-DATA failed with 0x%x (%s)", + (UINT) error_code, msg.c_str ()); + win32_ipc_pipe_server_close_connection (conn, TRUE); + return; + } + + if (!win32_ipc_pkt_parse_need_data (conn->client_msg, CONN_BUFFER_SIZE, + &seq_num)) { + GST_ERROR ("Couldn't parse NEED-DATA message"); + win32_ipc_pipe_server_close_connection (conn, TRUE); + return; + } + + GST_TRACE ("Got NEED-DATA"); + + /* Will response later once data is available */ + if (!conn->minfo) { + GST_LOG ("No data available, waiting"); + conn->pending_have_data = TRUE; + return; + } + + win32_ipc_pipe_server_send_have_data_async (conn); +} + +static void +win32_ipc_pipe_server_receive_need_data_async (ServerConnection * conn) +{ + GST_TRACE ("Waiting NEED-DATA"); + + if (!ReadFileEx (conn->pipe, conn->client_msg, CONN_BUFFER_SIZE, + (OVERLAPPED *) conn, win32_ipc_pipe_server_receive_need_data_finish)) { + UINT last_err = GetLastError (); + std::string msg = win32_ipc_error_message (last_err); + + GST_WARNING ("ReadFileEx failed with 0x%x (%s)", last_err, msg.c_str ()); + win32_ipc_pipe_server_close_connection (conn, TRUE); + } +} + +static HANDLE +win32_ipc_pipe_server_create_pipe (Win32IpcPipeServer * self, + OVERLAPPED * overlap, BOOL * io_pending) +{ + HANDLE pipe = CreateNamedPipeA (self->name.c_str (), + PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, + PIPE_UNLIMITED_INSTANCES, + CONN_BUFFER_SIZE, CONN_BUFFER_SIZE, 5000, nullptr); + if (pipe == INVALID_HANDLE_VALUE) { + self->last_err = GetLastError (); + std::string msg = win32_ipc_error_message (self->last_err); + GST_WARNING ("CreateNamedPipeA failed with 0x%x (%s)", + self->last_err, msg.c_str ()); + return INVALID_HANDLE_VALUE; + } + + /* Async pipe should return FALSE */ + if (ConnectNamedPipe (pipe, overlap)) { + self->last_err = GetLastError (); + std::string msg = win32_ipc_error_message (self->last_err); + GST_WARNING ("ConnectNamedPipe failed with 0x%x (%s)", + self->last_err, msg.c_str ()); + CloseHandle (pipe); + return INVALID_HANDLE_VALUE; + } + + *io_pending = FALSE; + self->last_err = GetLastError (); + switch (self->last_err) { + case ERROR_IO_PENDING: + *io_pending = TRUE; + break; + case ERROR_PIPE_CONNECTED: + SetEvent (overlap->hEvent); + break; + default: + { + std::string msg = win32_ipc_error_message (self->last_err); + GST_WARNING ("ConnectNamedPipe failed with 0x%x (%s)", + self->last_err, msg.c_str ()); + CloseHandle (pipe); + return INVALID_HANDLE_VALUE; + } + } + + self->last_err = ERROR_SUCCESS; + + return pipe; +} + +static void +win32_ipc_pipe_server_loop (Win32IpcPipeServer * self) +{ + BOOL io_pending = FALSE; + DWORD n_bytes; + DWORD wait_ret; + HANDLE waitables3; + HANDLE pipe; + OVERLAPPED overlap; + std::unique_lock<std::mutex> lk (self->lock); + + overlap.hEvent = CreateEvent (nullptr, TRUE, TRUE, nullptr); + pipe = win32_ipc_pipe_server_create_pipe (self, &overlap, &io_pending); + if (pipe == INVALID_HANDLE_VALUE) { + CloseHandle (overlap.hEvent); + self->cond.notify_all (); + return; + } + + self->last_err = ERROR_SUCCESS; + self->cond.notify_all (); + lk.unlock (); + + do { + ServerConnection *conn; + + waitables0 = overlap.hEvent; + waitables1 = self->enqueue_event; + waitables2 = self->cancellable; + + /* Enters alertable state and wait for + * 1) Client's connection request + * (similar to socket listen/accept in async manner) + * 2) Or, performs completion routines (finish APC) + * 3) Or, terminates if cancellable event was signalled + */ + wait_ret = WaitForMultipleObjectsEx (3, waitables, FALSE, INFINITE, TRUE); + if (wait_ret == WAIT_OBJECT_0 + 2) { + GST_DEBUG ("Operation cancelled"); + goto out; + } + + switch (wait_ret) { + case WAIT_OBJECT_0: + if (io_pending) { + BOOL ret = GetOverlappedResult (pipe, &overlap, &n_bytes, FALSE); + if (!ret) { + UINT last_err = GetLastError (); + std::string msg = win32_ipc_error_message (last_err); + GST_WARNING ("ConnectNamedPipe failed with 0x%x (%s)", + last_err, msg.c_str ()); + CloseHandle (pipe); + break; + } + } + + conn = new ServerConnection (self, pipe); + GST_DEBUG ("New connection is established %p", conn); + + /* Stores current buffer if available */ + lk.lock(); + conn->minfo = self->minfo; + lk.unlock (); + + pipe = INVALID_HANDLE_VALUE; + self->conn.push_back (conn); + win32_ipc_pipe_server_receive_need_data_async (conn); + pipe = win32_ipc_pipe_server_create_pipe (self, &overlap, &io_pending); + if (pipe == INVALID_HANDLE_VALUE) + goto out; + break; + case WAIT_OBJECT_0 + 1: + case WAIT_IO_COMPLETION: + { + std::vector<ServerConnection *> pending_conns; + std::shared_ptr<MmfInfo> minfo; + + lk.lock(); + minfo = self->minfo; + lk.unlock(); + + if (minfo) { + for (auto iter: self->conn) { + if (iter->pending_have_data && iter->seq_num <= minfo->seq_num) { + iter->minfo = minfo; + pending_conns.push_back (iter); + } + } + } + + for (auto iter: pending_conns) { + GST_LOG ("Sending pending have data to %p", iter); + win32_ipc_pipe_server_send_have_data_async (iter); + } + + break; + } + default: + GST_WARNING ("Unexpected WaitForMultipleObjectsEx return 0x%x", + (UINT) wait_ret); + goto out; + } + } while (true); + +out: + /* Cancels all I/O event issued from this thread */ + { + std::vector<HANDLE> pipes; + for (auto iter: self->conn) { + if (iter->pipe != INVALID_HANDLE_VALUE) + pipes.push_back (iter->pipe); + } + + for (auto iter: pipes) + CancelIo (iter); + } + + for (auto iter: self->conn) + win32_ipc_pipe_server_close_connection (iter, FALSE); + + self->conn.clear (); + + lk.lock (); + CloseHandle (overlap.hEvent); + self->last_err = ERROR_OPERATION_ABORTED; + self->cond.notify_all (); +} + +static BOOL +win32_ipc_pipe_server_run (Win32IpcPipeServer * self) +{ + std::unique_lock<std::mutex> lk (self->lock); + + self->thread = std::make_unique<std::thread> + (std::thread (win32_ipc_pipe_server_loop, self)); + self->cond.wait (lk); + + if (self->last_err != ERROR_SUCCESS) { + self->thread->join (); + self->thread = nullptr; + return FALSE; + } + + return TRUE; +} + +Win32IpcPipeServer * +win32_ipc_pipe_server_new (const char * pipe_name) +{ + Win32IpcPipeServer *self; + + if (!pipe_name) + return nullptr; + + self = new Win32IpcPipeServer (pipe_name); + + if (!win32_ipc_pipe_server_run (self)) { + win32_ipc_pipe_server_unref (self); + return nullptr; + } + + return self; +} + +Win32IpcPipeServer * +win32_ipc_pipe_server_ref (Win32IpcPipeServer * server) +{ + if (!server) + return nullptr; + + InterlockedIncrement (&server->ref_count); + + return server; +} + +void +win32_ipc_pipe_server_unref (Win32IpcPipeServer * server) +{ + ULONG ref_count; + + if (!server) + return; + + ref_count = InterlockedDecrement (&server->ref_count); + if (ref_count == 0) + delete server; +} + +void +win32_ipc_pipe_server_shutdown (Win32IpcPipeServer * server) +{ + GST_DEBUG ("Shutting down"); + + SetEvent (server->cancellable); + if (server->thread) { + server->thread->join (); + server->thread = nullptr; + } + + std::lock_guard<std::mutex> lk (server->lock); + server->last_err = ERROR_OPERATION_ABORTED; + server->minfo = nullptr; + server->cond.notify_all (); +} + +BOOL +win32_ipc_pipe_server_send_mmf (Win32IpcPipeServer * server, Win32IpcMmf * mmf, + const Win32IpcVideoInfo * info) +{ + std::lock_guard<std::mutex> lk (server->lock); + server->minfo = std::make_shared<MmfInfo> (mmf, info, server->seq_num); + + GST_LOG ("Enqueue mmf %s", win32_ipc_mmf_get_name (mmf)); + + server->seq_num++; + + /* Wakeup event loop */ + SetEvent (server->enqueue_event); + + return TRUE; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/protocol/win32ipcpipeserver.h
Added
@@ -0,0 +1,50 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include <windows.h> +#include <string.h> +#include "win32ipcmmf.h" +#include "win32ipcprotocol.h" +#include <gst/gst.h> + +G_BEGIN_DECLS + +struct Win32IpcPipeServer; + +Win32IpcPipeServer * win32_ipc_pipe_server_new (const char * pipe_name); + +Win32IpcPipeServer * win32_ipc_pipe_server_ref (Win32IpcPipeServer * server); + +void win32_ipc_pipe_server_unref (Win32IpcPipeServer * server); + +void win32_ipc_pipe_server_shutdown (Win32IpcPipeServer * server); + +BOOL win32_ipc_pipe_server_send_mmf (Win32IpcPipeServer * server, + Win32IpcMmf * mmf, + const Win32IpcVideoInfo * info); + +G_END_DECLS +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/protocol/win32ipcprotocol.cpp
Added
@@ -0,0 +1,237 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "win32ipcprotocol.h" +#include <string.h> + +const char * +win32_ipc_pkt_type_to_string (Win32IpcPktType type) +{ + switch (type) { + case WIN32_IPC_PKT_NEED_DATA: + return "NEED-DATA"; + case WIN32_IPC_PKT_HAVE_DATA: + return "HAVE-DATA"; + case WIN32_IPC_PKT_READ_DONE: + return "READ-DONE"; + default: + break; + } + + return "Unknown"; +} + +Win32IpcPktType +win32_ipc_pkt_type_from_raw (UINT8 type) +{ + return (Win32IpcPktType) type; +} + +UINT8 +win32_ipc_pkt_type_to_raw (Win32IpcPktType type) +{ + return (UINT8) type; +} + +#define READ_UINT32(d,v) do { \ + (*((UINT32 *) v)) = *((UINT32 *) d); \ + (d) += sizeof (UINT32); \ +} while (0) + +#define WRITE_UINT32(d,v) do { \ + *((UINT32 *) d) = v; \ + (d) += sizeof (UINT32); \ +} while (0) + +#define READ_UINT64(d,v) do { \ + (*((UINT64 *) v)) = *((UINT64 *) d); \ + (d) += sizeof (UINT64); \ +} while (0) + +#define WRITE_UINT64(d,v) do { \ + *((UINT64 *) d) = v; \ + (d) += sizeof (UINT64); \ +} while (0) + +UINT32 +win32_ipc_pkt_build_need_data (UINT8 * pkt, UINT32 pkt_len, UINT64 seq_num) +{ + UINT8 *data = pkt; + + if (!pkt || pkt_len < WIN32_IPC_PKT_NEED_DATA_SIZE) + return 0; + + data0 = win32_ipc_pkt_type_to_raw (WIN32_IPC_PKT_NEED_DATA); + data++; + + WRITE_UINT64 (data, seq_num); + + return WIN32_IPC_PKT_NEED_DATA_SIZE; +} + +BOOL +win32_ipc_pkt_parse_need_data (UINT8 * pkt, UINT32 pkt_len, UINT64 * seq_num) +{ + UINT8 *data = pkt; + + if (!pkt || pkt_len < WIN32_IPC_PKT_NEED_DATA_SIZE) + return FALSE; + + if (win32_ipc_pkt_type_from_raw (data0) != WIN32_IPC_PKT_NEED_DATA) + return FALSE; + + data++; + + READ_UINT64 (data, seq_num); + + return TRUE; +} + +UINT32 +win32_ipc_pkt_build_have_data (UINT8 * pkt, UINT32 pkt_size, UINT64 seq_num, + const char * mmf_name, const Win32IpcVideoInfo * info) +{ + UINT8 *data = pkt; + size_t len; + + if (!pkt || !mmf_name || !info) + return 0; + + len = strlen (mmf_name); + if (len == 0) + return 0; + + len++; + if (pkt_size < WIN32_IPC_PKT_HAVE_DATA_SIZE + len) + return 0; + + data0 = win32_ipc_pkt_type_to_raw (WIN32_IPC_PKT_HAVE_DATA); + data++; + + WRITE_UINT64 (data, seq_num); + + strcpy ((char *) data, mmf_name); + data += len; + + WRITE_UINT32 (data, info->format); + WRITE_UINT32 (data, info->width); + WRITE_UINT32 (data, info->height); + WRITE_UINT32 (data, info->fps_n); + WRITE_UINT32 (data, info->fps_d); + WRITE_UINT32 (data, info->par_n); + WRITE_UINT32 (data, info->par_d); + WRITE_UINT64 (data, info->size); + + for (UINT i = 0; i < 4; i++) + WRITE_UINT64 (data, info->offseti); + + for (UINT i = 0; i < 4; i++) + WRITE_UINT32 (data, info->stridei); + + WRITE_UINT64 (data, info->qpc); + + return data - pkt; +} + +BOOL +win32_ipc_pkt_parse_have_data (UINT8 * pkt, UINT32 pkt_size, UINT64 * seq_num, + char * mmf_name, Win32IpcVideoInfo * info) +{ + UINT8 *data = pkt; + size_t len; + + if (!pkt || pkt_size < WIN32_IPC_PKT_HAVE_DATA_SIZE) + return FALSE; + + if (win32_ipc_pkt_type_from_raw (pkt0) != WIN32_IPC_PKT_HAVE_DATA) + return FALSE; + + data++; + + READ_UINT64 (data, seq_num); + + len = strnlen ((const char *) data, pkt_size - (data - pkt)); + if (len == 0) + return FALSE; + + len++; + if (pkt_size < WIN32_IPC_PKT_HAVE_DATA_SIZE + len) + return FALSE; + + strcpy (mmf_name, (const char *) data); + data += len; + + READ_UINT32 (data, &info->format); + READ_UINT32 (data, &info->width); + READ_UINT32 (data, &info->height); + READ_UINT32 (data, &info->fps_n); + READ_UINT32 (data, &info->fps_d); + READ_UINT32 (data, &info->par_n); + READ_UINT32 (data, &info->par_d); + READ_UINT64 (data, &info->size); + + for (UINT i = 0; i < 4; i++) + READ_UINT64 (data, &info->offseti); + + for (UINT i = 0; i < 4; i++) + READ_UINT32 (data, &info->stridei); + + READ_UINT64 (data, &info->qpc); + + return TRUE; +} + +UINT32 +win32_ipc_pkt_build_read_done (UINT8 * pkt, UINT32 pkt_len, UINT64 seq_num) +{ + UINT8 *data = pkt; + + if (!pkt || pkt_len < WIN32_IPC_PKT_READ_DONE_SIZE) + return 0; + + data0 = win32_ipc_pkt_type_to_raw (WIN32_IPC_PKT_READ_DONE); + data++; + + WRITE_UINT64 (data, seq_num); + + return WIN32_IPC_PKT_READ_DONE_SIZE; +} + +BOOL +win32_ipc_pkt_parse_read_done (UINT8 * pkt, UINT32 pkt_len, UINT64 * seq_num) +{ + UINT8 *data = pkt; + + if (!pkt || pkt_len < WIN32_IPC_PKT_READ_DONE_SIZE) + return FALSE; + + if (win32_ipc_pkt_type_from_raw (data0) != WIN32_IPC_PKT_READ_DONE) + return FALSE; + + data++; + + READ_UINT64 (data, seq_num); + + return TRUE; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/protocol/win32ipcprotocol.h
Added
@@ -0,0 +1,243 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include <windows.h> +#include <gst/gst.h> + +G_BEGIN_DECLS + +/* + * Communication Sequence + * + * +--------+ +--------+ + * | client | | server | + * +--------+ +--------+ + * | | + * +--------- NEED-DATA ---------->| + * | +-------+ + * | | prepare named + * | | shared-memory + * | +<------+ + * +<-- HAVE-DATA (w/ shm name) ---| + * +--------+ | + * Open named | | + * shared-memory | | + * +------->+ | + * |--------- READ-DONE ---------->| + */ + +typedef enum +{ + WIN32_IPC_PKT_UNKNOWN, + WIN32_IPC_PKT_NEED_DATA, + WIN32_IPC_PKT_HAVE_DATA, + WIN32_IPC_PKT_READ_DONE, +} Win32IpcPktType; + +/* Same as GstVideoFormat */ +typedef enum +{ + WIN32_IPC_VIDEO_FORMAT_UNKNOWN, + WIN32_IPC_VIDEO_FORMAT_ENCODED, + WIN32_IPC_VIDEO_FORMAT_I420, + WIN32_IPC_VIDEO_FORMAT_YV12, + WIN32_IPC_VIDEO_FORMAT_YUY2, + WIN32_IPC_VIDEO_FORMAT_UYVY, + WIN32_IPC_VIDEO_FORMAT_AYUV, + WIN32_IPC_VIDEO_FORMAT_RGBx, + WIN32_IPC_VIDEO_FORMAT_BGRx, + WIN32_IPC_VIDEO_FORMAT_xRGB, + WIN32_IPC_VIDEO_FORMAT_xBGR, + WIN32_IPC_VIDEO_FORMAT_RGBA, + WIN32_IPC_VIDEO_FORMAT_BGRA, + WIN32_IPC_VIDEO_FORMAT_ARGB, + WIN32_IPC_VIDEO_FORMAT_ABGR, + WIN32_IPC_VIDEO_FORMAT_RGB, + WIN32_IPC_VIDEO_FORMAT_BGR, + WIN32_IPC_VIDEO_FORMAT_Y41B, + WIN32_IPC_VIDEO_FORMAT_Y42B, + WIN32_IPC_VIDEO_FORMAT_YVYU, + WIN32_IPC_VIDEO_FORMAT_Y444, + WIN32_IPC_VIDEO_FORMAT_v210, + WIN32_IPC_VIDEO_FORMAT_v216, + WIN32_IPC_VIDEO_FORMAT_NV12, + WIN32_IPC_VIDEO_FORMAT_NV21, + WIN32_IPC_VIDEO_FORMAT_GRAY8, + WIN32_IPC_VIDEO_FORMAT_GRAY16_BE, + WIN32_IPC_VIDEO_FORMAT_GRAY16_LE, + WIN32_IPC_VIDEO_FORMAT_v308, + WIN32_IPC_VIDEO_FORMAT_RGB16, + WIN32_IPC_VIDEO_FORMAT_BGR16, + WIN32_IPC_VIDEO_FORMAT_RGB15, + WIN32_IPC_VIDEO_FORMAT_BGR15, + WIN32_IPC_VIDEO_FORMAT_UYVP, + WIN32_IPC_VIDEO_FORMAT_A420, + WIN32_IPC_VIDEO_FORMAT_RGB8P, + WIN32_IPC_VIDEO_FORMAT_YUV9, + WIN32_IPC_VIDEO_FORMAT_YVU9, + WIN32_IPC_VIDEO_FORMAT_IYU1, + WIN32_IPC_VIDEO_FORMAT_ARGB64, + WIN32_IPC_VIDEO_FORMAT_AYUV64, + WIN32_IPC_VIDEO_FORMAT_r210, + WIN32_IPC_VIDEO_FORMAT_I420_10BE, + WIN32_IPC_VIDEO_FORMAT_I420_10LE, + WIN32_IPC_VIDEO_FORMAT_I422_10BE, + WIN32_IPC_VIDEO_FORMAT_I422_10LE, + WIN32_IPC_VIDEO_FORMAT_Y444_10BE, + WIN32_IPC_VIDEO_FORMAT_Y444_10LE, + WIN32_IPC_VIDEO_FORMAT_GBR, + WIN32_IPC_VIDEO_FORMAT_GBR_10BE, + WIN32_IPC_VIDEO_FORMAT_GBR_10LE, + WIN32_IPC_VIDEO_FORMAT_NV16, + WIN32_IPC_VIDEO_FORMAT_NV24, + WIN32_IPC_VIDEO_FORMAT_NV12_64Z32, + WIN32_IPC_VIDEO_FORMAT_A420_10BE, + WIN32_IPC_VIDEO_FORMAT_A420_10LE, + WIN32_IPC_VIDEO_FORMAT_A422_10BE, + WIN32_IPC_VIDEO_FORMAT_A422_10LE, + WIN32_IPC_VIDEO_FORMAT_A444_10BE, + WIN32_IPC_VIDEO_FORMAT_A444_10LE, + WIN32_IPC_VIDEO_FORMAT_NV61, + WIN32_IPC_VIDEO_FORMAT_P010_10BE, + WIN32_IPC_VIDEO_FORMAT_P010_10LE, + WIN32_IPC_VIDEO_FORMAT_IYU2, + WIN32_IPC_VIDEO_FORMAT_VYUY, + WIN32_IPC_VIDEO_FORMAT_GBRA, + WIN32_IPC_VIDEO_FORMAT_GBRA_10BE, + WIN32_IPC_VIDEO_FORMAT_GBRA_10LE, + WIN32_IPC_VIDEO_FORMAT_GBR_12BE, + WIN32_IPC_VIDEO_FORMAT_GBR_12LE, + WIN32_IPC_VIDEO_FORMAT_GBRA_12BE, + WIN32_IPC_VIDEO_FORMAT_GBRA_12LE, + WIN32_IPC_VIDEO_FORMAT_I420_12BE, + WIN32_IPC_VIDEO_FORMAT_I420_12LE, + WIN32_IPC_VIDEO_FORMAT_I422_12BE, + WIN32_IPC_VIDEO_FORMAT_I422_12LE, + WIN32_IPC_VIDEO_FORMAT_Y444_12BE, + WIN32_IPC_VIDEO_FORMAT_Y444_12LE, + WIN32_IPC_VIDEO_FORMAT_GRAY10_LE32, + WIN32_IPC_VIDEO_FORMAT_NV12_10LE32, + WIN32_IPC_VIDEO_FORMAT_NV16_10LE32, + WIN32_IPC_VIDEO_FORMAT_NV12_10LE40, + WIN32_IPC_VIDEO_FORMAT_Y210, + WIN32_IPC_VIDEO_FORMAT_Y410, + WIN32_IPC_VIDEO_FORMAT_VUYA, + WIN32_IPC_VIDEO_FORMAT_BGR10A2_LE, + WIN32_IPC_VIDEO_FORMAT_RGB10A2_LE, + WIN32_IPC_VIDEO_FORMAT_Y444_16BE, + WIN32_IPC_VIDEO_FORMAT_Y444_16LE, + WIN32_IPC_VIDEO_FORMAT_P016_BE, + WIN32_IPC_VIDEO_FORMAT_P016_LE, + WIN32_IPC_VIDEO_FORMAT_P012_BE, + WIN32_IPC_VIDEO_FORMAT_P012_LE, + WIN32_IPC_VIDEO_FORMAT_Y212_BE, + WIN32_IPC_VIDEO_FORMAT_Y212_LE, + WIN32_IPC_VIDEO_FORMAT_Y412_BE, + WIN32_IPC_VIDEO_FORMAT_Y412_LE, + WIN32_IPC_VIDEO_FORMAT_NV12_4L4, + WIN32_IPC_VIDEO_FORMAT_NV12_32L32, + WIN32_IPC_VIDEO_FORMAT_RGBP, + WIN32_IPC_VIDEO_FORMAT_BGRP, + WIN32_IPC_VIDEO_FORMAT_AV12, + WIN32_IPC_VIDEO_FORMAT_ARGB64_LE, + WIN32_IPC_VIDEO_FORMAT_ARGB64_BE, + WIN32_IPC_VIDEO_FORMAT_RGBA64_LE, + WIN32_IPC_VIDEO_FORMAT_RGBA64_BE, + WIN32_IPC_VIDEO_FORMAT_BGRA64_LE, + WIN32_IPC_VIDEO_FORMAT_BGRA64_BE, + WIN32_IPC_VIDEO_FORMAT_ABGR64_LE, + WIN32_IPC_VIDEO_FORMAT_ABGR64_BE, + WIN32_IPC_VIDEO_FORMAT_NV12_16L32S, + WIN32_IPC_VIDEO_FORMAT_NV12_8L128, + WIN32_IPC_VIDEO_FORMAT_NV12_10BE_8L128, +} Win32IpcVideoFormat; + +typedef struct +{ + Win32IpcVideoFormat format; + UINT32 width; + UINT32 height; + UINT32 fps_n; + UINT32 fps_d; + UINT32 par_n; + UINT32 par_d; + /* the size of memory */ + UINT64 size; + /* plane offsets */ + UINT64 offset4; + /* stride of each plane */ + UINT32 stride4; + /* QPC time */ + UINT64 qpc; +} Win32IpcVideoInfo; + +/* 1 byte (type) + 8 byte (seq-num) */ +#define WIN32_IPC_PKT_NEED_DATA_SIZE 9 + +/* 1 byte (type) + 8 byte (seq-num) + N bytes (name) + 4 (format) + + * 4 (width) + 4 (height) + 4 (fps_n) + 4 (fps_d) + 4 (par_n) + 4 (par_d) + + * 8 (size) + 8 * 4 (offset) + 4 * 4 (stride) + 8 (timestamp) */ +#define WIN32_IPC_PKT_HAVE_DATA_SIZE 101 + +/* 1 byte (type) + 8 byte (seq-num) */ +#define WIN32_IPC_PKT_READ_DONE_SIZE 5 + +const char * win32_ipc_pkt_type_to_string (Win32IpcPktType type); + +Win32IpcPktType win32_ipc_pkt_type_from_raw (UINT8 type); + +UINT8 win32_ipc_pkt_type_to_raw (Win32IpcPktType type); + +UINT32 win32_ipc_pkt_build_need_data (UINT8 * pkt, + UINT32 pkt_size, + UINT64 seq_num); + +BOOL win32_ipc_pkt_parse_need_data (UINT8 * pkt, + UINT32 pkt_size, + UINT64 * seq_num); + +UINT32 win32_ipc_pkt_build_have_data (UINT8 * pkt, + UINT32 pkt_size, + UINT64 seq_num, + const char * mmf_name, + const Win32IpcVideoInfo * info); + +BOOL win32_ipc_pkt_parse_have_data (UINT8 * pkt, + UINT32 pkt_size, + UINT64 * seq_num, + char * mmf_name, + Win32IpcVideoInfo * info); + +UINT32 win32_ipc_pkt_build_read_done (UINT8 * pkt, + UINT32 pkt_size, + UINT64 seq_num); + +BOOL win32_ipc_pkt_parse_read_done (UINT8 * pkt, + UINT32 pkt_size, + UINT64 * seq_num); + +G_END_DECLS +
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/protocol/win32ipcutils.cpp
Added
@@ -0,0 +1,54 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#include "win32ipcutils.h" +#include <string> +#include <locale> +#include <codecvt> +#include <algorithm> + +static inline void rtrim(std::string &s) { + s.erase (std::find_if (s.rbegin(), s.rend(), + (unsigned char ch) { + return !std::isspace (ch); + }).base (), s.end ()); +} + +std::string +win32_ipc_error_message (DWORD error_code) +{ + WCHAR buffer1024; + + if (!FormatMessageW (FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_FROM_SYSTEM, nullptr, error_code, 0, buffer, + 1024, nullptr)) { + return std::string (""); + } + + std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter; + std::string ret = converter.to_bytes (buffer); + rtrim (ret); + + return ret; +}
View file
gst-plugins-bad-1.22.0.tar.xz/sys/win32ipc/protocol/win32ipcutils.h
Added
@@ -0,0 +1,30 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include <windows.h> +#include <string> + +std::string win32_ipc_error_message (DWORD error_code);
View file
gst-plugins-bad-1.20.5.tar.xz/sys/winks/gstksvideosrc.c -> gst-plugins-bad-1.22.0.tar.xz/sys/winks/gstksvideosrc.c
Changed
@@ -47,6 +47,8 @@ #include "ksvideohelpers.h" #include "ksdeviceprovider.h" +#include <versionhelpers.h> + #define DEFAULT_DEVICE_PATH NULL #define DEFAULT_DEVICE_NAME NULL #define DEFAULT_DEVICE_INDEX -1 @@ -240,6 +242,21 @@ priv->device_index = DEFAULT_DEVICE_INDEX; priv->do_stats = DEFAULT_DO_STATS; priv->enable_quirks = DEFAULT_ENABLE_QUIRKS; + + /* MediaFoundation does not support MinGW build */ +#ifdef _MSC_VER + { + static gsize deprecated_warn = 0; + + if (g_once_init_enter (&deprecated_warn)) { + if (IsWindows8OrGreater ()) { + g_warning ("\"ksvideosrc\" is deprecated and will be removed" + "in the future. Use \"mfvideosrc\" element instead"); + } + g_once_init_leave (&deprecated_warn, 1); + } + } +#endif } static void
View file
gst-plugins-bad-1.20.5.tar.xz/sys/winks/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/winks/meson.build
Changed
@@ -26,6 +26,5 @@ install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstwinks, install_dir : plugins_pkgconfig_install_dir) plugins += gstwinks endif
View file
gst-plugins-bad-1.20.5.tar.xz/sys/winscreencap/gstdx9screencapsrc.c -> gst-plugins-bad-1.22.0.tar.xz/sys/winscreencap/gstdx9screencapsrc.c
Changed
@@ -45,6 +45,7 @@ #include "gstdx9screencapsrc.h" #include <gst/video/video.h> +#include <versionhelpers.h> GST_DEBUG_CATEGORY_STATIC (dx9screencapsrc_debug); @@ -158,6 +159,8 @@ static void gst_dx9screencapsrc_init (GstDX9ScreenCapSrc * src) { + static gsize deprecated_warn = 0; + /* Set src element initial values... */ src->surface = NULL; src->d3d9_device = NULL; @@ -177,6 +180,14 @@ g_d3d9 = Direct3DCreate9 (D3D_SDK_VERSION); else IDirect3D9_AddRef (g_d3d9); + + if (g_once_init_enter (&deprecated_warn)) { + if (IsWindows8OrGreater ()) { + g_warning ("\"dx9screencapsrc\" is deprecated and will be removed" + "in the future. Use \"d3d11screencapturesrc\" element instead"); + } + g_once_init_leave (&deprecated_warn, 1); + } } static void
View file
gst-plugins-bad-1.20.5.tar.xz/sys/winscreencap/gstgdiscreencapsrc.c -> gst-plugins-bad-1.22.0.tar.xz/sys/winscreencap/gstgdiscreencapsrc.c
Changed
@@ -48,6 +48,7 @@ #include "gstgdiscreencapsrc.h" #include <gst/video/video.h> +#include <versionhelpers.h> GST_DEBUG_CATEGORY_STATIC (gdiscreencapsrc_debug); @@ -156,6 +157,8 @@ static void gst_gdiscreencapsrc_init (GstGDIScreenCapSrc * src) { + static gsize deprecated_warn = 0; + /* Set src element initial values... */ src->dibMem = NULL; src->hBitmap = (HBITMAP) INVALID_HANDLE_VALUE; @@ -170,6 +173,14 @@ gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME); gst_base_src_set_live (GST_BASE_SRC (src), TRUE); + + if (g_once_init_enter (&deprecated_warn)) { + if (IsWindows8OrGreater ()) { + g_warning ("\"gdiscreencapsrc\" is deprecated and will be removed" + "in the future. Use \"d3d11screencapturesrc\" element instead"); + } + g_once_init_leave (&deprecated_warn, 1); + } } static void
View file
gst-plugins-bad-1.20.5.tar.xz/sys/winscreencap/gstwinscreencap.c -> gst-plugins-bad-1.22.0.tar.xz/sys/winscreencap/gstwinscreencap.c
Changed
@@ -24,12 +24,6 @@ #include "gstgdiscreencapsrc.h" #include "gstdx9screencapsrc.h" -#ifdef HAVE_DXGI_CAP -#include "gstdxgiscreencapsrc.h" - -GST_DEBUG_CATEGORY (gst_dxgi_screen_cap_src_debug); -#endif - static BOOL CALLBACK _diplay_monitor_enum (HMONITOR hMon, HDC hdc, LPRECT rect, LPARAM param) { @@ -71,11 +65,6 @@ GST_RANK_NONE, GST_TYPE_DX9SCREENCAPSRC)) { return FALSE; } -#ifdef HAVE_DXGI_CAP - GST_DEBUG_CATEGORY_INIT (gst_dxgi_screen_cap_src_debug, - "dxgiscreencapsrc", 0, "DirectX DXGI screen capture source"); - gst_dxgi_screen_cap_src_register (plugin, GST_RANK_NONE); -#endif return TRUE; }
View file
gst-plugins-bad-1.20.5.tar.xz/sys/winscreencap/meson.build -> gst-plugins-bad-1.22.0.tar.xz/sys/winscreencap/meson.build
Changed
@@ -4,49 +4,28 @@ 'gstwinscreencap.c', -have_dxgi = false -dxgi_c_args = -dxgiscreencap_sources = -dxgi_dep = - if host_system != 'windows' or get_option('winscreencap').disabled() subdir_done() endif d3d_dep = cc.find_library('d3d9', required : get_option('winscreencap')) gdi_dep = cc.find_library('gdi32', required : get_option('winscreencap')) -d3d11_dep = cc.find_library('d3d11', required : false) -dxgi_lib_dep = cc.find_library('dxgi', required : false) windowscodecs_dep = cc.find_library('windowscodecs', required : false) dxguid_dep = cc.find_library('dxguid', required : false) -have_d3d11_h = cc.has_header('d3d11.h') -have_dxgi_h = cc.has_header('dxgi1_2.h') -have_d3dcompiler_h = cc.has_header('d3dcompiler.h') -have_versionhelpers_h = cc.has_header('versionhelpers.h') - have_d3d9_h = cc.has_header('d3d9.h') if not have_d3d9_h and get_option('winscreencap').enabled() error('winscreencap plugin enabled but d3d9.h not found') endif -have_dxgi = d3d11_dep.found() and dxgi_lib_dep.found() and windowscodecs_dep.found() and dxguid_dep.found() and have_d3d11_h and have_dxgi_h and have_d3dcompiler_h and have_versionhelpers_h - -if have_dxgi - dxgi_c_args += '-DHAVE_DXGI_CAP' - dxgiscreencap_sources += 'dxgicapture.c', 'gstdxgiscreencapsrc.c' - dxgi_dep += gmodule_dep, d3d11_dep, dxgi_lib_dep, windowscodecs_dep, dxguid_dep -endif - if d3d_dep.found() and gdi_dep.found() and have_d3d9_h gstwinscreencap = library('gstwinscreencap', - winscreencap_sources + dxgiscreencap_sources, - c_args : gst_plugins_bad_args + dxgi_c_args, + winscreencap_sources, + c_args : gst_plugins_bad_args, include_directories : configinc, - dependencies : gstbase_dep, gstvideo_dep, d3d_dep, gdi_dep + dxgi_dep, + dependencies : gstbase_dep, gstvideo_dep, d3d_dep, gdi_dep, install : true, install_dir : plugins_install_dir, ) - pkgconfig.generate(gstwinscreencap, install_dir : plugins_pkgconfig_install_dir) plugins += gstwinscreencap endif
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/elements/ccconverter.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/ccconverter.c
Changed
@@ -351,16 +351,28 @@ GST_START_TEST (convert_cea608_raw_cea708_cdp) { - const guint8 in = { 0x80, 0x80 }; - const guint8 out = - { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x00, 0x72, 0xea, 0xfc, 0x80, 0x80, + const guint8 in1 = { 0x81, 0x82 }; + const guint8 in2 = { 0x80, 0x80 }; + const guint8 out1 = + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x00, 0x72, 0xea, 0xfc, 0x81, 0x82, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, - 0xfa, 0x00, 0x00, 0x74, 0x00, 0x00, 0x6e + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x00, 0x6b }; - check_conversion (in, sizeof (in), out, sizeof (out), + const guint8 out2 = + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x01, 0x72, 0xea, 0xf9, 0x80, 0x80, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x01, 0x6f + }; + const guint8 *in = { in1, in2 }; + guint in_len = { sizeof (in1), sizeof (in2) }; + const guint8 *out = { out1, out2 }; + guint out_len = { sizeof (out1), sizeof (out2) }; + check_conversion_multiple (G_N_ELEMENTS (in_len), in, in_len, + G_N_ELEMENTS (out_len), out, out_len, "closedcaption/x-cea-608,format=(string)raw,framerate=(fraction)60/1", - "closedcaption/x-cea-708,format=(string)cdp", NULL, NULL); + "closedcaption/x-cea-708,format=(string)cdp", NULL, NULL, 0); } GST_END_TEST; @@ -405,12 +417,12 @@ { const guint8 in = { 0x80, 0x80, 0x80, 0x00, 0x80, 0x80 }; const guint8 out = - { 0x96, 0x69, 0x49, 0x5f, 0x43, 0x00, 0x00, 0x72, 0xf4, 0xfc, 0x80, 0x80, - 0xfd, 0x80, 0x80, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + { 0x96, 0x69, 0x49, 0x5f, 0x43, 0x00, 0x00, 0x72, 0xf4, 0xf8, 0x80, 0x80, + 0xf9, 0x80, 0x80, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, - 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x74, 0x00, 0x00, 0xaf + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x74, 0x00, 0x00, 0xb7 }; check_conversion (in, sizeof (in), out, sizeof (out), "closedcaption/x-cea-608,format=(string)s334-1a,framerate=(fraction)30/1", @@ -446,10 +458,10 @@ { const guint8 in = { 0xfc, 0x80, 0x80, 0xfe, 0x80, 0x80 }; const guint8 out = - { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x00, 0x72, 0xea, 0xfc, 0x80, 0x80, + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x00, 0x72, 0xea, 0xf8, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, - 0xfa, 0x00, 0x00, 0x74, 0x00, 0x00, 0x6a + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x00, 0x6e }; check_conversion (in, sizeof (in), out, sizeof (out), "closedcaption/x-cea-708,format=(string)cc_data,framerate=(fraction)60/1", @@ -460,13 +472,21 @@ GST_START_TEST (convert_cea708_cdp_cea608_raw) { - const guint8 in = + const guint8 in1 = { 0x96, 0x69, 0x13, 0x5f, 0x43, 0x00, 0x00, 0x72, 0xe2, 0xfc, 0x80, 0x80, - 0xfe, 0x80, 0x80, 0x74, 0x00, 0x00, 0x8a + 0xfd, 0x80, 0x80, 0x74, 0x00, 0x00, 0x8a }; - const guint8 out = { 0x80, 0x80 }; - check_conversion_tc_passthrough (in, sizeof (in), out, sizeof (out), - "closedcaption/x-cea-708,format=(string)cdp", + const guint8 out1 = { 0x80, 0x80, }; + const guint8 in2 = + { 0x96, 0x69, 0x13, 0x5f, 0x43, 0x00, 0x00, 0x72, 0xe2, 0xfc, 0x80, 0x81, + 0xfd, 0x82, 0x83, 0x74, 0x00, 0x00, 0x8a + }; + const guint8 out2 = { 0x80, 0x81, }; + check_conversion_tc_passthrough (in1, sizeof (in1), out1, sizeof (out1), + "closedcaption/x-cea-708,format=(string)cdp,framerate=30/1", + "closedcaption/x-cea-608,format=(string)raw"); + check_conversion_tc_passthrough (in2, sizeof (in2), out2, sizeof (out2), + "closedcaption/x-cea-708,format=(string)cdp,framerate=30/1", "closedcaption/x-cea-608,format=(string)raw"); } @@ -476,11 +496,11 @@ { const guint8 in = { 0x96, 0x69, 0x13, 0x5f, 0x43, 0x00, 0x00, 0x72, 0xe2, 0xfc, 0x80, 0x80, - 0xfe, 0x80, 0x80, 0x74, 0x00, 0x00, 0x8a + 0xfd, 0x80, 0x80, 0x74, 0x00, 0x00, 0x8a }; - const guint8 out = { 0x80, 0x80, 0x80 }; + const guint8 out = { 0x80, 0x80, 0x80, 0x00, 0x80, 0x80 }; check_conversion_tc_passthrough (in, sizeof (in), out, sizeof (out), - "closedcaption/x-cea-708,format=(string)cdp", + "closedcaption/x-cea-708,format=(string)cdp,framerate=30/1", "closedcaption/x-cea-608,format=(string)s334-1a"); } @@ -490,11 +510,11 @@ { const guint8 in = { 0x96, 0x69, 0x13, 0x5f, 0x43, 0x00, 0x00, 0x72, 0xe2, 0xfc, 0x80, 0x80, - 0xfe, 0x80, 0x80, 0x74, 0x00, 0x00, 0x8a + 0xfd, 0x80, 0x80, 0x74, 0x00, 0x00, 0x8a }; - const guint8 out = { 0xfc, 0x80, 0x80, 0xfe, 0x80, 0x80 }; + const guint8 out = { 0xf8, 0x80, 0x80, 0xf9, 0x80, 0x80 }; check_conversion_tc_passthrough (in, sizeof (in), out, sizeof (out), - "closedcaption/x-cea-708,format=(string)cdp", + "closedcaption/x-cea-708,format=(string)cdp,framerate=30/1", "closedcaption/x-cea-708,format=(string)cc_data"); } @@ -504,17 +524,23 @@ { /* tests that too large input is truncated */ const guint8 in = - { 0x96, 0x69, 0x2e, 0x8f, 0x43, 0x00, 0x00, 0x72, 0xeb, 0xfc, 0x80, 0x80, + { 0x96, 0x69, 0x4c, 0x8f, 0x43, 0x00, 0x00, 0x72, 0xf5, 0xfc, 0x80, 0x80, + 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, + 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, - 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0x74, 0x00, 0x00, 0x8a, + 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, + 0x74, 0x00, 0x00, 0x8a, }; - const guint8 out = { 0xfc, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, + const guint8 out = { 0xf8, 0x80, 0x80, 0xf9, 0x80, 0x80, 0xfe, 0x80, 0x80, + 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, + 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, + 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, - 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x80, 0x80 + 0xfe, 0x80, 0x80 }; check_conversion_tc_passthrough (in, sizeof (in), out, sizeof (out), - "closedcaption/x-cea-708,format=(string)cdp", + "closedcaption/x-cea-708,format=(string)cdp,framerate=30/1", "closedcaption/x-cea-708,format=(string)cc_data"); } @@ -525,7 +551,7 @@ /* tests that packets are split exactly in half when doubling the framerate */ const guint8 in1 = { 0x96, 0x69, 0x49, 0x5f, 0x43, 0x00, 0x00, 0x72, 0xf4, 0xfc, 0x01, 0x02, - 0xfc, 0x03, 0x04, 0xfe, 0x05, 0x06, 0xfe, 0x07, 0x08, 0xfe, 0x09, 0x0a, + 0xfd, 0x03, 0x04, 0xfe, 0x05, 0x06, 0xfe, 0x07, 0x08, 0xfe, 0x09, 0x0a, 0xfe, 0x0b, 0x0c, 0xfe, 0x0d, 0x0e, 0xfe, 0x0f, 0x10, 0xfe, 0x11, 0x12, 0xfe, 0x13, 0x14, 0xfe, 0x15, 0x16, 0xfe, 0x17, 0x18, 0xfe, 0x19, 0x1a, 0xfe, 0x1b, 0x1c, 0xfe, 0x1d, 0x1e, 0xfe, 0x1f, 0x20, 0xfe, 0x21, 0x22, @@ -543,10 +569,10 @@ 0x00, 0x00, 0x10 }; const guint8 out2 = { 0x96, 0x69, 0x30, 0x8f, 0xc3, 0x00, 0x01, 0x71, 0xc1, - 0x82, 0x03, 0x09, 0x72, 0xea, 0xfc, 0x03, 0x04, 0xfe, 0x17, 0x18, 0xfe, + 0x82, 0x03, 0x09, 0x72, 0xea, 0xfd, 0x03, 0x04, 0xfe, 0x17, 0x18, 0xfe, 0x19, 0x1a, 0xfe, 0x1b, 0x1c, 0xfe, 0x1d, 0x1e, 0xfe, 0x1f, 0x20, 0xfe, 0x21, 0x22, 0xfe, 0x23, 0x24, 0xfe, 0x25, 0x26, 0xfe, 0x27, 0x28, 0x74, - 0x00, 0x01, 0xc5 + 0x00, 0x01, 0xc4 }; const guint8 *out = { out1, out2 }; guint out_len = { sizeof (out1), sizeof (out2) }; @@ -587,7 +613,7 @@ 0xfe, 0x11, 0x12, 0xfe, 0x13, 0x14, 0x74, 0x00, 0x00, 0x7a }; const guint8 in2 = { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x01, 0x72, 0xea, - 0xfc, 0x14, 0x15, 0xfe, 0x16, 0x17, 0xfe, 0x18, 0x19, 0xfe, 0x1a, 0x1b, + 0xfd, 0x14, 0x15, 0xfe, 0x16, 0x17, 0xfe, 0x18, 0x19, 0xfe, 0x1a, 0x1b, 0xfe, 0x1c, 0x1d, 0xfe, 0x1e, 0x1f, 0xfe, 0x20, 0x21, 0xfe, 0x22, 0x23, 0xfe, 0x24, 0x25, 0xfe, 0x26, 0x27, 0x74, 0x00, 0x01, 0x70 }; @@ -598,12 +624,12 @@ const guint8 out1 = { 0x96, 0x69, 0x4e, 0x5f, 0xc3, 0x00, 0x00, 0x71, 0xc1, 0x82, 0x03, 0x04, - 0x72, 0xf4, 0xfc, 0x01, 0x02, 0xfc, 0x14, 0x15, 0xfe, 0x03, 0x04, 0xfe, + 0x72, 0xf4, 0xfc, 0x01, 0x02, 0xfd, 0x14, 0x15, 0xfe, 0x03, 0x04, 0xfe, 0x05, 0x06, 0xfe, 0x07, 0x08, 0xfe, 0x09, 0x0a, 0xfe, 0x0b, 0x0c, 0xfe, 0x0d, 0x0e, 0xfe, 0x0f, 0x10, 0xfe, 0x11, 0x12, 0xfe, 0x13, 0x14, 0xfe, 0x16, 0x17, 0xfe, 0x18, 0x19, 0xfe, 0x1a, 0x1b, 0xfe, 0x1c, 0x1d, 0xfe, 0x1e, 0x1f, 0xfe, 0x20, 0x21, 0xfe, 0x22, 0x23, 0xfe, 0x24, 0x25, 0xfe, - 0x26, 0x27, 0x74, 0x00, 0x00, 0x08 + 0x26, 0x27, 0x74, 0x00, 0x00, 0x07 }; const guint8 *out = { out1 }; guint out_len = { sizeof (out1) }; @@ -653,23 +679,23 @@ const guint8 out1 = { 0x96, 0x69, 0x58, 0x1f, 0x43, 0x00, 0x00, 0x72, 0xf9, 0xfc, 0x01, 0x02, - 0xfc, 0x01, 0x02, 0xfc, 0x01, 0x02, 0xfe, 0x03, 0x04, 0xfe, 0x05, 0x06, + 0xf9, 0x80, 0x80, 0xfc, 0x01, 0x02, 0xfe, 0x03, 0x04, 0xfe, 0x05, 0x06, 0xfe, 0x07, 0x08, 0xfe, 0x09, 0x0a, 0xfe, 0x0b, 0x0c, 0xfe, 0x0d, 0x0e, 0xfe, 0x0f, 0x10, 0xfe, 0x11, 0x12, 0xfe, 0x13, 0x14, 0xfe, 0x03, 0x04, 0xfe, 0x05, 0x06, 0xfe, 0x07, 0x08, 0xfe, 0x09, 0x0a, 0xfe, 0x0b, 0x0c, 0xfe, 0x0d, 0x0e, 0xfe, 0x0f, 0x10, 0xfe, 0x11, 0x12, 0xfe, 0x13, 0x14, 0xfe, 0x03, 0x04, 0xfe, 0x05, 0x06, 0xfe, 0x07, 0x08, 0xfe, 0x09, 0x0a, - 0x74, 0x00, 0x00, 0xc5 + 0x74, 0x00, 0x00, 0xcb }; const guint8 out2 = - { 0x96, 0x69, 0x58, 0x1f, 0x43, 0x00, 0x01, 0x72, 0xf9, 0xfc, 0x01, 0x02, - 0xfc, 0x01, 0x02, 0xfc, 0x01, 0x02, 0xfe, 0x0b, 0x0c, 0xfe, 0x0d, 0x0e, + { 0x96, 0x69, 0x58, 0x1f, 0x43, 0x00, 0x01, 0x72, 0xf9, 0xf9, 0x80, 0x80, + 0xfc, 0x01, 0x02, 0xf9, 0x80, 0x80, 0xfe, 0x0b, 0x0c, 0xfe, 0x0d, 0x0e, 0xfe, 0x0f, 0x10, 0xfe, 0x11, 0x12, 0xfe, 0x13, 0x14, 0xfe, 0x03, 0x04, 0xfe, 0x05, 0x06, 0xfe, 0x07, 0x08, 0xfe, 0x09, 0x0a, 0xfe, 0x0b, 0x0c, 0xfe, 0x0d, 0x0e, 0xfe, 0x0f, 0x10, 0xfe, 0x11, 0x12, 0xfe, 0x13, 0x14, 0xfe, 0x03, 0x04, 0xfe, 0x05, 0x06, 0xfe, 0x07, 0x08, 0xfe, 0x09, 0x0a, 0xfe, 0x0b, 0x0c, 0xfe, 0x0d, 0x0e, 0xfe, 0x0f, 0x10, 0xfe, 0x11, 0x12, - 0x74, 0x00, 0x01, 0x83 + 0x74, 0x00, 0x01, 0x8f }; const guint8 *out = { out1, out2 }; guint out_len = { sizeof (out1), sizeof (out2) }; @@ -688,7 +714,7 @@ * high framerate */ const guint8 in1 = { 0x96, 0x69, 0x58, 0x1f, 0x43, 0x00, 0x00, 0x72, 0xf9, 0xfc, 0x01, 0x02, - 0xfc, 0x03, 0x04, 0xfc, 0x05, 0x06, 0xfe, 0x07, 0x08, 0xfe, 0x09, 0x0a, + 0xfd, 0x03, 0x04, 0xfc, 0x05, 0x06, 0xfe, 0x07, 0x08, 0xfe, 0x09, 0x0a, 0xfe, 0x0b, 0x0c, 0xfe, 0x0d, 0x0e, 0xfe, 0x0f, 0x10, 0xfe, 0x11, 0x12, 0xfe, 0x13, 0x14, 0xfe, 0x15, 0x16, 0xfe, 0x17, 0x18, 0xfe, 0x19, 0x1a, 0xfe, 0x1b, 0x1c, 0xfe, 0x1d, 0x1e, 0xfe, 0x1f, 0x20, 0xfe, 0x21, 0x22, @@ -705,9 +731,9 @@ 0xfe, 0x15, 0x16, 0xfe, 0x17, 0x18, 0x74, 0x00, 0x00, 0x30 }; const guint8 out2 = { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x01, 0x72, 0xea, - 0xfc, 0x03, 0x04, 0xfe, 0x19, 0x1a, 0xfe, 0x1b, 0x1c, 0xfe, 0x1d, 0x1e, + 0xfd, 0x03, 0x04, 0xfe, 0x19, 0x1a, 0xfe, 0x1b, 0x1c, 0xfe, 0x1d, 0x1e, 0xfe, 0x1f, 0x20, 0xfe, 0x21, 0x22, 0xfe, 0x23, 0x24, 0xfe, 0x25, 0x26, - 0xfe, 0x27, 0x28, 0xfe, 0x29, 0x2a, 0x74, 0x00, 0x01, 0xe6 + 0xfe, 0x27, 0x28, 0xfe, 0x29, 0x2a, 0x74, 0x00, 0x01, 0xe5 }; const guint8 out3 = { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x02, 0x72, 0xea, 0xfc, 0x05, 0x06, 0xfe, 0x2b, 0x2c, 0xfe, 0x2d, 0x2e, 0xfe, 0x2f, 0x30, @@ -715,9 +741,9 @@ 0xfe, 0x0d, 0x0e, 0xfe, 0x0f, 0x10, 0x74, 0x00, 0x02, 0x54 }; const guint8 out4 = { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x03, 0x72, 0xea, - 0xfc, 0x01, 0x02, 0xfe, 0x11, 0x12, 0xfe, 0x13, 0x14, 0xfe, 0x15, 0x16, + 0xfd, 0x03, 0x04, 0xfe, 0x11, 0x12, 0xfe, 0x13, 0x14, 0xfe, 0x15, 0x16, 0xfe, 0x17, 0x18, 0xfe, 0x19, 0x1a, 0xfe, 0x1b, 0x1c, 0xfe, 0x1d, 0x1e, - 0xfe, 0x1f, 0x20, 0xfe, 0x21, 0x22, 0x74, 0x00, 0x03, 0x76 + 0xfe, 0x1f, 0x20, 0xfe, 0x21, 0x22, 0x74, 0x00, 0x03, 0x71 }; const guint8 *out = { out1, out2, out3, out4 }; guint out_len = @@ -737,7 +763,7 @@ * high framerate and that an EOS will push the pending data */ const guint8 in1 = { 0x96, 0x69, 0x58, 0x1f, 0x43, 0x00, 0x00, 0x72, 0xf9, 0xfc, 0x01, 0x02, - 0xfc, 0x03, 0x04, 0xfc, 0x05, 0x06, 0xfe, 0x07, 0x08, 0xfe, 0x09, 0x0a, + 0xfd, 0x03, 0x04, 0xfc, 0x05, 0x06, 0xfe, 0x07, 0x08, 0xfe, 0x09, 0x0a, 0xfe, 0x0b, 0x0c, 0xfe, 0x0d, 0x0e, 0xfe, 0x0f, 0x10, 0xfe, 0x11, 0x12, 0xfe, 0x13, 0x14, 0xfe, 0x15, 0x16, 0xfe, 0x17, 0x18, 0xfe, 0x19, 0x1a, 0xfe, 0x1b, 0x1c, 0xfe, 0x1d, 0x1e, 0xfe, 0x1f, 0x20, 0xfe, 0x21, 0x22, @@ -754,9 +780,9 @@ 0xfe, 0x15, 0x16, 0xfe, 0x17, 0x18, 0x74, 0x00, 0x00, 0x30 }; const guint8 out2 = { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x01, 0x72, 0xea, - 0xfc, 0x03, 0x04, 0xfe, 0x19, 0x1a, 0xfe, 0x1b, 0x1c, 0xfe, 0x1d, 0x1e, + 0xfd, 0x03, 0x04, 0xfe, 0x19, 0x1a, 0xfe, 0x1b, 0x1c, 0xfe, 0x1d, 0x1e, 0xfe, 0x1f, 0x20, 0xfe, 0x21, 0x22, 0xfe, 0x23, 0x24, 0xfe, 0x25, 0x26, - 0xfe, 0x27, 0x28, 0xfe, 0x29, 0x2a, 0x74, 0x00, 0x01, 0xe6 + 0xfe, 0x27, 0x28, 0xfe, 0x29, 0x2a, 0x74, 0x00, 0x01, 0xe5 }; const guint8 out3 = { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x02, 0x72, 0xea, 0xfc, 0x05, 0x06, 0xfe, 0x2b, 0x2c, 0xfe, 0x2d, 0x2e, 0xfe, 0x2f, 0x30, @@ -787,21 +813,21 @@ const guint8 out1 = { 0x96, 0x69, 0x4e, 0x5f, 0xc3, 0x00, 0x00, 0x71, 0xc0, 0x81, 0x59, 0x29, - 0x72, 0xf4, 0xfc, 0x80, 0x80, 0xf8, 0x80, 0x80, 0xfa, 0x00, 0x00, 0xfa, + 0x72, 0xf4, 0xf8, 0x80, 0x80, 0xf9, 0x80, 0x80, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, - 0x00, 0x00, 0x74, 0x00, 0x00, 0xfb + 0x00, 0x00, 0x74, 0x00, 0x00, 0xfe }; const guint8 out2 = { 0x96, 0x69, 0x4e, 0x5f, 0xc3, 0x00, 0x01, 0x71, 0xc0, 0x82, 0x00, 0x00, - 0x72, 0xf4, 0xfc, 0x80, 0x80, 0xf8, 0x80, 0x80, 0xfa, 0x00, 0x00, 0xfa, + 0x72, 0xf4, 0xf8, 0x80, 0x80, 0xf9, 0x80, 0x80, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, - 0x00, 0x00, 0x74, 0x00, 0x01, 0x7a + 0x00, 0x00, 0x74, 0x00, 0x01, 0x7d }; const guint8 *out = { out1, out2 }; guint out_len = { sizeof (out1), sizeof (out2) }; @@ -838,8 +864,8 @@ GST_START_TEST (convert_cea708_cc_data_cea708_cdp_double_framerate) { - const guint8 in1 = { 0xfc, 0x80, 0x81, 0xfc, 0x82, 0x83, 0xfe, 0x84, 0x85 }; - const guint8 in2 = { 0xfc, 0x86, 0x87, 0xfc, 0x88, 0x89, 0xfe, 0x8a, 0x8b }; + const guint8 in1 = { 0xfc, 0x80, 0x81, 0xfd, 0x82, 0x83, 0xfe, 0x84, 0x85 }; + const guint8 in2 = { 0xfc, 0x86, 0x87, 0xfd, 0x88, 0x89, 0xfe, 0x8a, 0x8b }; const guint8 *in = { in1, in2 }; guint in_len = { sizeof (in1), sizeof (in2) }; const guint8 out1 = @@ -849,10 +875,10 @@ 0xfa, 0x00, 0x00, 0x74, 0x00, 0x00, 0x60 }; const guint8 out2 = - { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x01, 0x72, 0xea, 0xfc, 0x82, 0x83, + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x01, 0x72, 0xea, 0xfd, 0x82, 0x83, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, - 0xfa, 0x00, 0x00, 0x74, 0x00, 0x01, 0x67 + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x01, 0x66 }; const guint8 out3 = { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x02, 0x72, 0xea, 0xfc, 0x86, 0x87, @@ -861,10 +887,10 @@ 0xfa, 0x00, 0x00, 0x74, 0x00, 0x02, 0x44 }; const guint8 out4 = - { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x03, 0x72, 0xea, 0xfc, 0x88, 0x89, + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x03, 0x72, 0xea, 0xfd, 0x88, 0x89, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, - 0xfa, 0x00, 0x00, 0x74, 0x00, 0x03, 0x57 + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x03, 0x56 }; const guint8 *out = { out1, out2, out3, out4, }; guint out_len = @@ -880,8 +906,8 @@ GST_START_TEST (convert_cea608_raw_cea708_cdp_double_framerate) { - const guint8 in1 = { 0x80, 0x81, 0x82, 0x83 }; - const guint8 in2 = { 0x84, 0x85, 0x86, 0x87 }; + const guint8 in1 = { 0x80, 0x81 }; + const guint8 in2 = { 0x82, 0x83 }; const guint8 *in = { in1, in2 }; guint in_len = { sizeof (in1), sizeof (in2) }; const guint8 out1 = @@ -891,22 +917,22 @@ 0xfa, 0x00, 0x00, 0x74, 0x00, 0x00, 0x6d }; const guint8 out2 = - { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x01, 0x72, 0xea, 0xfc, 0x82, 0x83, + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x01, 0x72, 0xea, 0xf9, 0x80, 0x80, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, - 0xfa, 0x00, 0x00, 0x74, 0x00, 0x01, 0x67 + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x01, 0x6f }; const guint8 out3 = - { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x02, 0x72, 0xea, 0xfc, 0x84, 0x85, + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x02, 0x72, 0xea, 0xfc, 0x82, 0x83, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, - 0xfa, 0x00, 0x00, 0x74, 0x00, 0x02, 0x61 + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x02, 0x65 }; const guint8 out4 = - { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x03, 0x72, 0xea, 0xfc, 0x86, 0x87, + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x03, 0x72, 0xea, 0xf9, 0x80, 0x80, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, - 0xfa, 0x00, 0x00, 0x74, 0x00, 0x03, 0x5b + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x03, 0x6b }; const guint8 *out = { out1, out2, out3, out4, }; guint out_len = @@ -962,6 +988,184 @@ GST_END_TEST; +GST_START_TEST (convert_cea708_cdp_cea708_cc_data_double_input_data) +{ + /* caps say 60fps, data has 30fps. Ensure data is taken alternatatively from + * each field even if there is too much input data */ + const guint8 in1 = + { 0x96, 0x69, 0x16, 0x5f, 0x43, 0x00, 0x00, 0x72, 0xe3, 0xfc, 0x81, 0x82, + 0xfd, 0x83, 0x84, 0xfa, 0x00, 0x00, 0x74, 0x00, 0x00, 0xff + }; + /* padding buffer */ + const guint8 in2 = + { 0x96, 0x69, 0x16, 0x5f, 0x43, 0x00, 0x01, 0x72, 0xe3, 0xfc, 0x80, 0x80, + 0xfd, 0x80, 0x80, 0xfa, 0x00, 0x00, 0x74, 0x00, 0x01, 0xff + }; + const guint8 in3 = + { 0x96, 0x69, 0x16, 0x5f, 0x43, 0x00, 0x02, 0x72, 0xe3, 0xfc, 0x85, 0x86, + 0xfd, 0x87, 0x88, 0xfa, 0x00, 0x00, 0x74, 0x00, 0x02, 0xff + }; + const guint8 *in = { in1, in2, in3, }; + guint in_len = { sizeof (in1), sizeof (in2), sizeof (in3), }; + /* two buffers from the first buffer, then the first half of the third input + * buffer */ + const guint8 out1 = { 0xfc, 0x81, 0x82, }; + const guint8 out2 = { 0xfd, 0x83, 0x84, }; + const guint8 out3 = { 0xfc, 0x85, 0x86, }; + const guint8 *out = { out1, out2, out3, }; + guint out_len = { sizeof (out1), sizeof (out2), sizeof (out3), }; + check_conversion_multiple (G_N_ELEMENTS (in_len), in, in_len, + G_N_ELEMENTS (out_len), out, out_len, + "closedcaption/x-cea-708,format=(string)cdp,framerate=(fraction)60/1", + "closedcaption/x-cea-708,format=(string)cc_data,framerate=(fraction)60/1", + NULL, NULL, 0); +} + +GST_END_TEST; + +GST_START_TEST (convert_cea708_cc_data_cea708_cdp_double_input_data) +{ + /* caps say 60fps, but every buffer is cea608 field 1. Ensure data is taken + * alternatatively from each field even if there is too much input data */ + const guint8 in1 = { 0xfc, 0x81, 0x82 }; + const guint8 in2 = { 0xfc, 0x83, 0x84 }; + const guint8 in3 = { 0xfc, 0x85, 0x86 }; + const guint8 *in = { in1, in2, in3, }; + guint in_len = { sizeof (in1), sizeof (in2), sizeof (in3), }; + /* two buffers from the first buffer, then the first half of the third input + * buffer */ + const guint8 out1 = + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x00, 0x72, 0xea, 0xfc, 0x81, 0x82, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x00, 0x6b + }; + /* padding buffer */ + const guint8 out2 = + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x01, 0x72, 0xea, 0xf9, 0x80, 0x80, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x01, 0x6f + }; + const guint8 out3 = + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x02, 0x72, 0xea, 0xfc, 0x83, 0x84, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x02, 0x63 + }; + const guint8 out4 = + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x03, 0x72, 0xea, 0xf9, 0x80, 0x80, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x03, 0x6b + }; + const guint8 out5 = + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x04, 0x72, 0xea, 0xfc, 0x85, 0x86, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x04, 0x5b + }; + const guint8 *out = { out1, out2, out3, out4, out5 }; + guint out_len = + { sizeof (out1), sizeof (out2), sizeof (out3), sizeof (out4), + sizeof (out5) + }; + check_conversion_multiple (G_N_ELEMENTS (in_len), in, in_len, + G_N_ELEMENTS (out_len), out, out_len, + "closedcaption/x-cea-708,format=(string)cc_data,framerate=(fraction)60/1", + "closedcaption/x-cea-708,format=(string)cdp,framerate=(fraction)60/1", + NULL, NULL, FLAG_SEND_EOS); +} + +GST_END_TEST; + +static guint8 +calculate_cdp_checksum (guint8 * cdp, gsize len) +{ + guint8 checksum = 0; + gsize i; + + for (i = 0; i < len; i++) { + checksum += cdpi; + } + checksum &= 0xff; + return 256 - checksum; +} + +GST_START_TEST (convert_cea708_cc_data_cea708_cdp_field1_overflow) +{ + /* caps say 60fps, but every buffer is cea608 field 1. Ensure data is taken + * alternatatively from each field even if there is too much input data. + * Also ensure that overflow does something sane, like dropping previous data */ +#define N_INPUTS 100 + guint8 in_dataN_INPUTS * 3; + guint in_lenN_INPUTS; + guint8 *inN_INPUTS; + guint i; + +#define N_OUTPUTS 100 + guint8 out_dataN_OUTPUTS * 43; + guint out_lenN_OUTPUTS; + guint8 *outN_OUTPUTS; + + const guint8 out_template = + { 0x96, 0x69, 0x2b, 0x8f, 0x43, 0x00, 0x01, 0x72, 0xea, 0xf9, 0x80, 0x80, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, 0xfa, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0x74, 0x00, 0x01, 0x6f + }; + + G_STATIC_ASSERT (sizeof (out_template) == 43); + + /* generate input data */ + for (i = 0; i < N_INPUTS; i++) { + in_leni = 3; + in_datai * 3 + 0 = 0xfc; + in_datai * 3 + 1 = 0x81 + i * 2; + in_datai * 3 + 2 = 0x81 + i * 2 + 1; + ini = &in_datai * 3; + } + + for (i = 0; i < N_OUTPUTS; i++) { + out_leni = 43; + memcpy (&out_datai * 43, out_template, sizeof (out_template)); + /* write correct counters */ + out_datai * 43 + 6 = i; + out_datai * 43 + 41 = i; + /* write the correct cea608 data */ + if (i % 2 == 0) { + gsize in_data_offset; + /* take frames sequentially from the input */ + gsize in_idx = i / 2; + /* take the first 12 input frames, then skip the next 12 frames and take + * the next 12 frames etc. + * 24 is the byte size of the internal cea608 field buffers that we are + * overflowing but every second buffer will have cea608 field 1 in it. + * 12 frames is 24 bytes stored and is enough to cause overflow */ + in_idx = (in_idx / 6) * 12 + in_idx % 6; + in_data_offset = in_idx * 3; + + out_datai * 43 + 9 = in_datain_data_offset + 0; + out_datai * 43 + 10 = in_datain_data_offset + 1; + out_datai * 43 + 11 = in_datain_data_offset + 2; + } else { + out_datai * 43 + 9 = 0xf9; + out_datai * 43 + 10 = 0x80; + out_datai * 43 + 11 = 0x80; + } + out_datai * 43 + 42 = calculate_cdp_checksum (&out_datai * 43, 42); + outi = &out_datai * 43; + } + + check_conversion_multiple (G_N_ELEMENTS (in_len), (const guint8 **) in, + in_len, G_N_ELEMENTS (out_len), (const guint8 **) out, out_len, + "closedcaption/x-cea-708,format=(string)cc_data,framerate=(fraction)60/1", + "closedcaption/x-cea-708,format=(string)cdp,framerate=(fraction)60/1", + NULL, NULL, FLAG_SEND_EOS); +} + +GST_END_TEST; + static Suite * ccextractor_suite (void) { @@ -997,6 +1201,9 @@ tcase_add_test (tc, convert_cea708_cc_data_cea708_cdp_double_framerate); tcase_add_test (tc, convert_cea608_raw_cea708_cdp_double_framerate); tcase_add_test (tc, convert_cea608_s334_1a_cea708_cdp_double_framerate); + tcase_add_test (tc, convert_cea708_cdp_cea708_cc_data_double_input_data); + tcase_add_test (tc, convert_cea708_cc_data_cea708_cdp_double_input_data); + tcase_add_test (tc, convert_cea708_cc_data_cea708_cdp_field1_overflow); return s; }
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/elements/cudaconvert.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/cudaconvert.c
Changed
@@ -19,6 +19,18 @@ #include <gst/check/gstcheck.h> +static const gchar *run_visual_test = NULL; + +static const gchar *YUV_FORMATS = { + "I420", "YV12", "NV12", "NV21", "P010_10LE", "P016_LE", "I420_10LE", "Y444", + "Y444_16LE", "Y42B", "I422_10LE", "I422_12LE", +}; + +static const gchar *RGB_FORMATS = { + "BGRA", "RGBA", "RGBx", "BGRx", "ARGB", "ABGR", "RGB", "BGR", "BGR10A2_LE", + "RGB10A2_LE", "RGBP", "BGRP", "GBR", "GBRA", +}; + static gboolean bus_cb (GstBus * bus, GstMessage * message, gpointer data) { @@ -54,9 +66,12 @@ GMainLoop *loop = g_main_loop_new (NULL, FALSE); gchar *pipeline_str = g_strdup_printf ("videotestsrc num-buffers=1 is-live=true ! " - "video/x-raw,format=%s,framerate=3/1 ! cudaupload ! " - "cudaconvert ! cudadownload ! video/x-raw,format=%s ! " - "videoconvert ! autovideosink", in_format, out_format); + "video/x-raw,format=%s,width=128,height=64,framerate=3/1," + "pixel-aspect-ratio=1/1 ! cudaupload ! " + "cudaconvertscale ! cudadownload ! " + "video/x-raw,format=%s,width=320,height=240,pixel-aspect-ratio=1/1 ! " + "videoconvert ! %s", in_format, out_format, + run_visual_test ? "autovideosink" : "fakesink"); GstElement *pipeline; pipeline = gst_parse_launch (pipeline_str, NULL); @@ -78,20 +93,12 @@ GST_START_TEST (test_convert_yuv_yuv) { - const gchar *format_list = { - "I420", "YV12", "NV12", "NV21", "P010_10LE", "I420_10LE", - "Y444", "Y444_16LE", - }; - gint i, j; - for (i = 0; i < G_N_ELEMENTS (format_list); i++) { - for (j = 0; j < G_N_ELEMENTS (format_list); j++) { - if (i == j) - continue; - - GST_DEBUG ("run conversion %s to %s", format_listi, format_listj); - run_convert_pipelne (format_listi, format_listj); + for (i = 0; i < G_N_ELEMENTS (YUV_FORMATS); i++) { + for (j = 0; j < G_N_ELEMENTS (YUV_FORMATS); j++) { + gst_println ("run conversion %s to %s", YUV_FORMATSi, YUV_FORMATSj); + run_convert_pipelne (YUV_FORMATSi, YUV_FORMATSj); } } } @@ -100,22 +107,12 @@ GST_START_TEST (test_convert_yuv_rgb) { - const gchar *in_format_list = { - "I420", "YV12", "NV12", "NV21", "P010_10LE", "I420_10LE", - "Y444", "Y444_16LE", - }; - const gchar *out_format_list = { - "BGRA", "RGBA", "RGBx", "BGRx", "ARGB", "ABGR", "RGB", "BGR", "BGR10A2_LE", - "RGB10A2_LE", - }; - gint i, j; - for (i = 0; i < G_N_ELEMENTS (in_format_list); i++) { - for (j = 0; j < G_N_ELEMENTS (out_format_list); j++) { - GST_DEBUG ("run conversion %s to %s", in_format_listi, - out_format_listj); - run_convert_pipelne (in_format_listi, out_format_listj); + for (i = 0; i < G_N_ELEMENTS (YUV_FORMATS); i++) { + for (j = 0; j < G_N_ELEMENTS (RGB_FORMATS); j++) { + gst_println ("run conversion %s to %s", YUV_FORMATSi, RGB_FORMATSj); + run_convert_pipelne (YUV_FORMATSi, RGB_FORMATSj); } } } @@ -124,22 +121,12 @@ GST_START_TEST (test_convert_rgb_yuv) { - const gchar *in_format_list = { - "BGRA", "RGBA", "RGBx", "BGRx", "ARGB", "ABGR", "RGB", "BGR", "BGR10A2_LE", - "RGB10A2_LE", - }; - const gchar *out_format_list = { - "I420", "YV12", "NV12", "NV21", "P010_10LE", "I420_10LE", - "Y444", "Y444_16LE", - }; - gint i, j; - for (i = 0; i < G_N_ELEMENTS (in_format_list); i++) { - for (j = 0; j < G_N_ELEMENTS (out_format_list); j++) { - GST_DEBUG ("run conversion %s to %s", in_format_listi, - out_format_listj); - run_convert_pipelne (in_format_listi, out_format_listj); + for (i = 0; i < G_N_ELEMENTS (RGB_FORMATS); i++) { + for (j = 0; j < G_N_ELEMENTS (YUV_FORMATS); j++) { + gst_println ("run conversion %s to %s", RGB_FORMATSi, YUV_FORMATSj); + run_convert_pipelne (RGB_FORMATSi, YUV_FORMATSj); } } } @@ -148,20 +135,12 @@ GST_START_TEST (test_convert_rgb_rgb) { - const gchar *format_list = { - "BGRA", "RGBA", "RGBx", "BGRx", "ARGB", "ABGR", "RGB", "BGR", "BGR10A2_LE", - "RGB10A2_LE", - }; - gint i, j; - for (i = 0; i < G_N_ELEMENTS (format_list); i++) { - for (j = 0; j < G_N_ELEMENTS (format_list); j++) { - if (i == j) - continue; - - GST_DEBUG ("run conversion %s to %s", format_listi, format_listj); - run_convert_pipelne (format_listi, format_listj); + for (i = 0; i < G_N_ELEMENTS (RGB_FORMATS); i++) { + for (j = 0; j < G_N_ELEMENTS (RGB_FORMATS); j++) { + gst_println ("run conversion %s to %s", RGB_FORMATSi, RGB_FORMATSj); + run_convert_pipelne (RGB_FORMATSi, RGB_FORMATSj); } } } @@ -174,9 +153,9 @@ gboolean ret = TRUE; GstElement *upload; - upload = gst_element_factory_make ("cudaconvert", NULL); + upload = gst_element_factory_make ("cudaconvertscale", NULL); if (!upload) { - GST_WARNING ("cudaconvert is not available, possibly driver load failure"); + GST_WARNING ("cudaconvertscale is not available"); return FALSE; } @@ -186,7 +165,7 @@ } static Suite * -cudaconvert_suite (void) +cudaconvertscale_suite (void) { Suite *s; TCase *tc_chain; @@ -194,23 +173,28 @@ /* HACK: cuda device init/deinit with fork seems to problematic */ g_setenv ("CK_FORK", "no", TRUE); - s = suite_create ("cudaconvert"); + run_visual_test = g_getenv ("ENABLE_CUDA_VISUAL_TEST"); + + s = suite_create ("cudaconvertscale"); tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); if (!check_cuda_convert_available ()) { - GST_DEBUG ("Skip cudaconvert test since cannot open device"); + gst_println ("Skip convertscale test since cannot open device"); goto end; } - tcase_add_test (tc_chain, test_convert_yuv_yuv); - tcase_add_test (tc_chain, test_convert_yuv_rgb); - tcase_add_test (tc_chain, test_convert_rgb_yuv); - tcase_add_test (tc_chain, test_convert_rgb_rgb); + /* Only run test if explicitly enabled */ + if (g_getenv ("ENABLE_CUDA_CONVERSION_TEST")) { + tcase_add_test (tc_chain, test_convert_yuv_yuv); + tcase_add_test (tc_chain, test_convert_yuv_rgb); + tcase_add_test (tc_chain, test_convert_rgb_yuv); + tcase_add_test (tc_chain, test_convert_rgb_rgb); + } end: return s; } -GST_CHECK_MAIN (cudaconvert); +GST_CHECK_MAIN (cudaconvertscale);
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/elements/d3d11colorconvert.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/d3d11colorconvert.c
Changed
@@ -1,6 +1,6 @@ /* GStreamer * - * unit test for d3d11colorconvert element + * unit test for d3d11convert element * Copyright (C) 2019 Matthew Waters <matthew@centricular.com> * Copyright (C) 2019 Seungha Yang <seungha.yang@navercorp.com> * @@ -29,6 +29,8 @@ #include <gst/check/gstharness.h> #include <gst/video/video.h> +static const gchar *run_visual_test = NULL; + /* enable this define to see color conversion result with videosink */ #define RUN_VISUAL_TEST 0 @@ -48,15 +50,16 @@ static const gchar *YUV_FORMATS = { "VUYA", "NV12", "P010_10LE", "P012_LE", "P016_LE", "I420", "I420_10LE", "I420_12LE", "YV12", "NV21", "Y444", "Y444_10LE", "Y444_12LE", "Y444_16LE", - "Y42B", "I422_10LE", "I422_12LE", + "Y42B", "I422_10LE", "I422_12LE", "AYUV", "AYUV64" }; static const gchar *RGB_FORMATS = { - "BGRA", "RGBA", "RGB10A2_LE", "BGRx", "RGBx", + "BGRA", "RGBA", "RGB10A2_LE", "BGRx", "RGBx", "RGBA64_LE", "RGBP", "BGRP", + "GBR", "GBR_10LE", "GBR_12LE", "GBRA", "GBRA_10LE", "GBRA_12LE" }; static const gchar *PACKED_YUV_FORMATS = { - "Y410", + "Y410", "YUY2", }; static const gchar *GRAY_FORMATS = { @@ -68,7 +71,7 @@ {1, 1, GST_VIDEO_FORMAT_BGRA, {(guint8 *) & bgra_reorder_data}}, }; -GST_START_TEST (test_d3d11_color_convert_rgba_reorder) +GST_START_TEST (test_d3d11_convert_rgba_reorder) { GstHarness *h = gst_harness_new_parse ("d3d11upload ! d3d11convert ! d3d11download"); @@ -155,9 +158,12 @@ GMainLoop *loop = g_main_loop_new (NULL, FALSE); gchar *pipeline_str = g_strdup_printf ("videotestsrc num-buffers=1 is-live=true ! " - "video/x-raw,format=%s,framerate=3/1 ! d3d11upload ! " - "d3d11convert ! d3d11download ! video/x-raw,format=%s ! " - "videoconvert ! d3d11videosink", in_format, out_format); + "video/x-raw,format=%s,framerate=3/1,width=128,height=64," + "pixel-aspect-ratio=1/1 ! d3d11upload ! " + "d3d11convert border-color=0xffffaaaaaaaaaaaa ! d3d11download ! " + "video/x-raw,format=%s,width=320,height=240,pixel-aspect-ratio=1/1 ! " + "videoconvert ! %s", in_format, out_format, + run_visual_test ? "d3d11videosink" : "fakesink"); GstElement *pipeline; pipeline = gst_parse_launch (pipeline_str, NULL); @@ -177,15 +183,12 @@ g_main_loop_unref (loop); } -GST_START_TEST (test_d3d11_color_convert_yuv_yuv) +GST_START_TEST (test_d3d11_convert_yuv_yuv) { gint i, j; for (i = 0; i < G_N_ELEMENTS (YUV_FORMATS); i++) { for (j = 0; j < G_N_ELEMENTS (YUV_FORMATS); j++) { - if (i == j) - continue; - GST_DEBUG ("run conversion %s to %s", YUV_FORMATSi, YUV_FORMATSj); run_convert_pipelne (YUV_FORMATSi, YUV_FORMATSj); } @@ -194,15 +197,12 @@ GST_END_TEST; -GST_START_TEST (test_d3d11_color_convert_yuv_rgb) +GST_START_TEST (test_d3d11_convert_yuv_rgb) { gint i, j; for (i = 0; i < G_N_ELEMENTS (YUV_FORMATS); i++) { for (j = 0; j < G_N_ELEMENTS (RGB_FORMATS); j++) { - if (i == j) - continue; - GST_DEBUG ("run conversion %s to %s", YUV_FORMATSi, RGB_FORMATSj); run_convert_pipelne (YUV_FORMATSi, RGB_FORMATSj); } @@ -211,15 +211,12 @@ GST_END_TEST; -GST_START_TEST (test_d3d11_color_convert_yuv_gray) +GST_START_TEST (test_d3d11_convert_yuv_gray) { gint i, j; for (i = 0; i < G_N_ELEMENTS (YUV_FORMATS); i++) { for (j = 0; j < G_N_ELEMENTS (GRAY_FORMATS); j++) { - if (i == j) - continue; - GST_DEBUG ("run conversion %s to %s", YUV_FORMATSi, GRAY_FORMATSj); run_convert_pipelne (YUV_FORMATSi, GRAY_FORMATSj); } @@ -228,7 +225,7 @@ GST_END_TEST; -GST_START_TEST (test_d3d11_color_convert_rgb_yuv) +GST_START_TEST (test_d3d11_convert_rgb_yuv) { gint i, j; @@ -242,15 +239,12 @@ GST_END_TEST; -GST_START_TEST (test_d3d11_color_convert_rgb_rgb) +GST_START_TEST (test_d3d11_convert_rgb_rgb) { gint i, j; for (i = 0; i < G_N_ELEMENTS (RGB_FORMATS); i++) { for (j = 0; j < G_N_ELEMENTS (RGB_FORMATS); j++) { - if (i == j) - continue; - GST_DEBUG ("run conversion %s to %s", RGB_FORMATSi, RGB_FORMATSj); run_convert_pipelne (RGB_FORMATSi, RGB_FORMATSj); } @@ -259,7 +253,7 @@ GST_END_TEST; -GST_START_TEST (test_d3d11_color_convert_rgb_gray) +GST_START_TEST (test_d3d11_convert_rgb_gray) { gint i, j; @@ -273,7 +267,7 @@ GST_END_TEST; -GST_START_TEST (test_d3d11_color_convert_packed_yuv_yuv) +GST_START_TEST (test_d3d11_convert_packed_yuv_yuv) { gint i, j; @@ -288,7 +282,7 @@ GST_END_TEST; -GST_START_TEST (test_d3d11_color_convert_packed_yuv_rgb) +GST_START_TEST (test_d3d11_convert_packed_yuv_rgb) { gint i, j; @@ -303,7 +297,7 @@ GST_END_TEST; -GST_START_TEST (test_d3d11_color_convert_packed_yuv_gray) +GST_START_TEST (test_d3d11_convert_packed_yuv_gray) { gint i, j; @@ -318,7 +312,7 @@ GST_END_TEST; -GST_START_TEST (test_d3d11_color_convert_gray_yuv) +GST_START_TEST (test_d3d11_convert_gray_yuv) { gint i, j; @@ -332,7 +326,7 @@ GST_END_TEST; -GST_START_TEST (test_d3d11_color_convert_gray_rgb) +GST_START_TEST (test_d3d11_convert_gray_rgb) { gint i, j; @@ -347,29 +341,33 @@ GST_END_TEST; static Suite * -d3d11colorconvert_suite (void) +d3d11convert_suite (void) { - Suite *s = suite_create ("d3d11colorconvert"); + Suite *s = suite_create ("d3d11convert"); TCase *tc_basic = tcase_create ("general"); - const gchar *run_visual_test = g_getenv ("RUN_VISUAL_TEST"); + + run_visual_test = g_getenv ("ENABLE_D3D11_VISUAL_TEST"); suite_add_tcase (s, tc_basic); - tcase_add_test (tc_basic, test_d3d11_color_convert_rgba_reorder); - if (run_visual_test != NULL) { - tcase_add_test (tc_basic, test_d3d11_color_convert_yuv_yuv); - tcase_add_test (tc_basic, test_d3d11_color_convert_yuv_rgb); - tcase_add_test (tc_basic, test_d3d11_color_convert_yuv_gray); - tcase_add_test (tc_basic, test_d3d11_color_convert_rgb_yuv); - tcase_add_test (tc_basic, test_d3d11_color_convert_rgb_rgb); - tcase_add_test (tc_basic, test_d3d11_color_convert_rgb_gray); - tcase_add_test (tc_basic, test_d3d11_color_convert_packed_yuv_yuv); - tcase_add_test (tc_basic, test_d3d11_color_convert_packed_yuv_rgb); - tcase_add_test (tc_basic, test_d3d11_color_convert_packed_yuv_gray); - tcase_add_test (tc_basic, test_d3d11_color_convert_gray_yuv); - tcase_add_test (tc_basic, test_d3d11_color_convert_gray_rgb); + tcase_add_test (tc_basic, test_d3d11_convert_rgba_reorder); + + /* XXX: Some methods for device's capability checking and initialization + * are plugin internal. Enable conversion tests only when it's enabled */ + if (g_getenv ("ENABLE_D3D11_CONVERSION_TEST")) { + tcase_add_test (tc_basic, test_d3d11_convert_yuv_yuv); + tcase_add_test (tc_basic, test_d3d11_convert_yuv_rgb); + tcase_add_test (tc_basic, test_d3d11_convert_yuv_gray); + tcase_add_test (tc_basic, test_d3d11_convert_rgb_yuv); + tcase_add_test (tc_basic, test_d3d11_convert_rgb_rgb); + tcase_add_test (tc_basic, test_d3d11_convert_rgb_gray); + tcase_add_test (tc_basic, test_d3d11_convert_packed_yuv_yuv); + tcase_add_test (tc_basic, test_d3d11_convert_packed_yuv_rgb); + tcase_add_test (tc_basic, test_d3d11_convert_packed_yuv_gray); + tcase_add_test (tc_basic, test_d3d11_convert_gray_yuv); + tcase_add_test (tc_basic, test_d3d11_convert_gray_rgb); } return s; } -GST_CHECK_MAIN (d3d11colorconvert); +GST_CHECK_MAIN (d3d11convert);
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/elements/dash_mpd.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/dash_mpd.c
Changed
@@ -4231,6 +4231,57 @@ GST_END_TEST; /* + * Test getting baseURL with query + * + */ +GST_START_TEST (dash_mpdparser_get_baseURL_with_query) +{ + gboolean ret; + gchar *uri; + gint64 range_start, range_end; + const gchar *xml = + "<?xml version=\"1.0\"?>" + "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\"" + " profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">" + " <Period id=\"Period0\" duration=\"P0Y0M1DT1H1M1S\">" + " <AdaptationSet id=\"1\" mimeType=\"audio\" lang=\"en\">" + " <Representation id=\"1\" bandwidth=\"250000\">" + " <BaseURL>http://example.com/test?param1=value1&param2=value2</BaseURL>" + " <SegmentBase indexRange=\"100-200\" indexRangeExact=\"true\">" + " <Initialization range=\"0-100\" />" + " </SegmentBase>" + " </Representation></AdaptationSet></Period></MPD>"; + + GstMPDClient *mpdclient = setup_mpd_client (xml); + + /* get segment url and range from segment Initialization */ + ret = + gst_mpd_client_get_next_header (mpdclient, &uri, 0, &range_start, + &range_end); + assert_equals_int (ret, TRUE); + assert_equals_string (uri, + "http://example.com/test?param1=value1¶m2=value2"); + assert_equals_int64 (range_start, 0); + assert_equals_int64 (range_end, 100); + g_free (uri); + + /* get segment url and range from segment indexRange */ + ret = + gst_mpd_client_get_next_header_index (mpdclient, &uri, 0, &range_start, + &range_end); + assert_equals_int (ret, TRUE); + assert_equals_string (uri, + "http://example.com/test?param1=value1¶m2=value2"); + assert_equals_int64 (range_start, 100); + assert_equals_int64 (range_end, 200); + g_free (uri); + + gst_mpd_client_free (mpdclient); +} + +GST_END_TEST; + +/* * Test getting mediaPresentationDuration * */ @@ -6631,6 +6682,7 @@ tcase_add_test (tc_complexMPD, dash_mpdparser_get_baseURL6); tcase_add_test (tc_complexMPD, dash_mpdparser_get_baseURL7); tcase_add_test (tc_complexMPD, dash_mpdparser_get_baseURL8); + tcase_add_test (tc_complexMPD, dash_mpdparser_get_baseURL_with_query); tcase_add_test (tc_complexMPD, dash_mpdparser_get_mediaPresentationDuration); tcase_add_test (tc_complexMPD, dash_mpdparser_get_streamPresentationOffset); tcase_add_test (tc_complexMPD, dash_mpdparser_segments);
View file
gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/fdkaac.c
Added
@@ -0,0 +1,271 @@ +/* GStreamer unit test for fdk-aac elements + * + * Copyright (C) 2022 Tim-Philipp Müller <tim centricular com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/check/check.h> +#include <gst/app/app.h> +#include <gst/pbutils/pbutils.h> + +typedef struct +{ + const gchar *base_profile; + const gchar *profile; + guint8 buf_hdr16; + guint8 codec_data16; + gsize codec_data_len; +} AacSample; + +static AacSample +encode_with_caps (const gchar * caps_str) +{ + GstElement *pipe, *sink; + gchar *pipeline_str; + GError *err = NULL; + GstSample *sample; + AacSample aac_sample = { NULL, }; + + GST_INFO ("Encoding to %s", caps_str); + + pipeline_str = + g_strdup_printf ("audiotestsrc ! fdkaacenc ! appsink name=sink caps=%s", + caps_str); + + pipe = gst_parse_launch (pipeline_str, &err); + g_free (pipeline_str); + fail_if (err != NULL, "Error creating pipeline: %s", err->message); + + sink = gst_bin_get_by_name (GST_BIN (pipe), "sink"); + + gst_element_set_state (pipe, GST_STATE_PLAYING); + + sample = gst_app_sink_pull_preroll (GST_APP_SINK (sink)); + fail_unless (sample != NULL); + { + GstCaps *caps = gst_sample_get_caps (sample); + GstStructure *s = gst_caps_get_structure (caps, 0); + const GValue *val; + GstMapInfo map; + GstBuffer *buf; + + GST_INFO ("Got caps %" GST_PTR_FORMAT, caps); + aac_sample.base_profile = + g_intern_string (gst_structure_get_string (s, "base-profile")); + aac_sample.profile = + g_intern_string (gst_structure_get_string (s, "profile")); + + val = gst_structure_get_value (s, "codec_data"); + if (val != NULL) { + buf = gst_value_get_buffer (val); + gst_buffer_map (buf, &map, GST_MAP_READ); + g_assert (map.size <= 16); + memcpy (aac_sample.codec_data, map.data, map.size); + aac_sample.codec_data_len = map.size; + gst_buffer_unmap (buf, &map); + } else { + aac_sample.codec_data_len = 0; + } + + buf = gst_sample_get_buffer (sample); + gst_buffer_map (buf, &map, GST_MAP_READ); + g_assert (map.size >= sizeof (aac_sample.buf_hdr)); + memcpy (aac_sample.buf_hdr, map.data, sizeof (aac_sample.buf_hdr)); + gst_buffer_unmap (buf, &map); + } + gst_sample_unref (sample); + + gst_element_set_state (pipe, GST_STATE_NULL); + gst_object_unref (sink); + gst_object_unref (pipe); + + return aac_sample; +} + +typedef enum +{ + AAC_AOT_UNKNOWN = -1, + AAC_AOT_MAIN = 1, + AAC_AOT_LC = 2, + AAC_AOT_SSR = 3, + AAC_AOT_LTP = 4, + AAC_AOT_SBR = 5, + AAC_AOT_LD = 23, + AAC_AOT_PS = 29, +} AacAOT; + +static AacAOT +aac_codec_data_get_aot (const guint8 * codec_data, gsize codec_data_len) +{ + AacAOT aot = AAC_AOT_UNKNOWN; + + if (codec_data_len >= 2) { + guint8 hdr_aot = codec_data0 >> 3; // 5 bits + switch (hdr_aot) { + case AAC_AOT_MAIN: + case AAC_AOT_LC: + case AAC_AOT_SSR: + case AAC_AOT_LTP: + case AAC_AOT_SBR: + case AAC_AOT_LD: + case AAC_AOT_PS: + aot = hdr_aot; + break; + default: + break; + } + } + + return aot; +} + +GST_START_TEST (test_fdkaacenc_adts) +{ + // LC profile + { + AacSample aac; + + aac = encode_with_caps ("audio/mpeg,profile=lc,stream-format=adts"); + fail_unless_equals_string (aac.base_profile, "lc"); + fail_unless_equals_string (aac.profile, "lc"); + fail_unless (aac.codec_data_len == 0); + + // ADTS sync + fail_unless_equals_int (GST_READ_UINT16_BE (aac.buf_hdr) & 0xfff0, 0xfff0); + + // MPEG version (0 = MPEG-4) + fail_unless_equals_int (aac.buf_hdr1 & 0x08, 0); + + // AOT minus 1 (2=LC) + fail_unless_equals_int ((aac.buf_hdr2 & 0xC0) >> 6, 2 - 1); + } + + // HE-AACv1 profile + { + AacSample aac; + + aac = encode_with_caps ("audio/mpeg,profile=he-aac-v1,stream-format=adts"); + fail_unless_equals_string (aac.base_profile, "lc"); + fail_unless_equals_string (aac.profile, "he-aac-v1"); + fail_unless (aac.codec_data_len == 0); + + // ADTS sync + fail_unless_equals_int (GST_READ_UINT16_BE (aac.buf_hdr) & 0xfff0, 0xfff0); + + // MPEG version (0 = MPEG-4) + fail_unless_equals_int (aac.buf_hdr1 & 0x08, 0); + + // AOT minus 1 (2=LC) + fail_unless_equals_int ((aac.buf_hdr2 & 0xC0) >> 6, 2 - 1); + } + + // HE-AACv2 profile + { + AacSample aac; + + aac = encode_with_caps ("audio/mpeg,profile=he-aac-v2,stream-format=adts"); + fail_unless_equals_string (aac.base_profile, "lc"); + fail_unless_equals_string (aac.profile, "he-aac-v2"); + fail_unless (aac.codec_data_len == 0); + + // ADTS sync + fail_unless_equals_int (GST_READ_UINT16_BE (aac.buf_hdr) & 0xfff0, 0xfff0); + + // MPEG version (0 = MPEG-4) + fail_unless_equals_int (aac.buf_hdr1 & 0x08, 0); + + // AOT minus 1 (2=LC) + fail_unless_equals_int ((aac.buf_hdr2 & 0xC0) >> 6, 2 - 1); + } +} + +GST_END_TEST; + +GST_START_TEST (test_fdkaacenc_raw) +{ + const gchar *profile; + AacAOT aot; + + // LC profile + { + AacSample aac; + + aac = encode_with_caps ("audio/mpeg,profile=lc,stream-format=raw"); + fail_unless_equals_string (aac.base_profile, "lc"); + fail_unless_equals_string (aac.profile, "lc"); + fail_unless (aac.codec_data_len == 2); + profile = + gst_codec_utils_aac_get_profile (aac.codec_data, aac.codec_data_len); + fail_unless_equals_string (profile, "lc"); + aot = aac_codec_data_get_aot (aac.codec_data, aac.codec_data_len); + fail_unless_equals_int (aot, AAC_AOT_LC); + } + + // HE-AACv1 profile + { + AacSample aac; + + aac = encode_with_caps ("audio/mpeg,profile=he-aac-v1,stream-format=raw"); + // For raw we use non-backwards compatible hierarchical signaling, so + // caps should not contain a base-profile field + fail_if (aac.base_profile != NULL); + fail_unless (aac.profile != NULL); + fail_unless (aac.codec_data_len > 2); + profile = + gst_codec_utils_aac_get_profile (aac.codec_data, aac.codec_data_len); + fail_unless_equals_string (profile, "lc"); // FIXME: is this right for non-BC hierarchical signaling? + aot = aac_codec_data_get_aot (aac.codec_data, aac.codec_data_len); + fail_unless_equals_int (aot, AAC_AOT_SBR); + } + + // HE-AACv2 profile + { + AacSample aac; + + aac = encode_with_caps ("audio/mpeg,profile=he-aac-v2,stream-format=raw"); + // For raw we use non-backwards compatible hierarchical signaling, so + // caps should not contain a base-profile field + fail_if (aac.base_profile != NULL); + fail_unless (aac.profile != NULL); + fail_unless (aac.codec_data_len > 2); + profile = + gst_codec_utils_aac_get_profile (aac.codec_data, aac.codec_data_len); + fail_unless_equals_string (profile, "lc"); // FIXME: is this right for non-BC hierarchical signaling? + aot = aac_codec_data_get_aot (aac.codec_data, aac.codec_data_len); + fail_unless_equals_int (aot, AAC_AOT_PS); + } +} + +GST_END_TEST; + +static Suite * +fdkaac_suite (void) +{ + Suite *s = suite_create ("fdk-aac"); + TCase *tc_chain_enc = tcase_create ("fdkaacenc"); + + suite_add_tcase (s, tc_chain_enc); + tcase_add_test (tc_chain_enc, test_fdkaacenc_adts); + tcase_add_test (tc_chain_enc, test_fdkaacenc_raw); + + return s; +} + +GST_CHECK_MAIN (fdkaac);
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/elements/h264parse.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/h264parse.c
Changed
@@ -29,6 +29,7 @@ #include <gst/check/check.h> #include <gst/video/video.h> +#include <gst/video/video-sei.h> #include "gst-libs/gst/codecparsers/gsth264parser.h" #include "parser.h" @@ -1463,6 +1464,58 @@ GST_END_TEST; +GST_START_TEST (test_parse_sei_userdefinedunregistered) +{ + GstVideoSEIUserDataUnregisteredMeta *meta; + GstHarness *h; + GstBuffer *buf; + + const guint8 misb_sei = { + 0x00, 0x00, 0x00, 0x20, 0x06, 0x05, 0x1c, 0x4d, + 0x49, 0x53, 0x50, 0x6d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x65, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x1f, + 0x00, 0x05, 0xff, 0x21, 0x7e, 0xff, 0x29, 0xb5, + 0xff, 0xdc, 0x13, 0x80, + /* IDR frame (doesn't match caps) */ + 0x00, 0x00, 0x00, 0x14, 0x65, 0x88, 0x84, 0x00, + 0x10, 0xff, 0xfe, 0xf6, 0xf0, 0xfe, 0x05, 0x36, + 0x56, 0x04, 0x50, 0x96, 0x7b, 0x3f, 0x53, 0xe1 + }; + const gsize misb_sei_size = sizeof (misb_sei); + + // Expected result - time status plus padded data + const guint8 st0604_data = { + 0x1f, 0x00, 0x05, 0xff, 0x21, 0x7e, 0xff, 0x29, + 0xb5, 0xff, 0xdc, 0x13 + }; + + h = gst_harness_new ("h264parse"); + + gst_harness_set_src_caps_str (h, + "video/x-h264, stream-format=(string)avc," + " width=(int)1920, height=(int)1080, framerate=(fraction)25/1," + " bit-depth-chroma=(uint)8, parsed=(boolean)true," + " alignment=(string)au, profile=(string)high, level=(string)4," + " codec_data=(buffer)01640028ffe1001a67640028acb200f0044fcb080000030008000003019478c1924001000568ebccb22c"); + + buf = gst_buffer_new_and_alloc (misb_sei_size); + gst_buffer_fill (buf, 0, misb_sei, misb_sei_size); + fail_unless_equals_int (gst_harness_push (h, buf), GST_FLOW_OK); + + buf = gst_harness_pull (h); + meta = gst_buffer_get_video_sei_user_data_unregistered_meta (buf); + fail_unless (meta != NULL); + + fail_unless (memcmp (meta->uuid, H264_MISP_MICROSECTIME, 16) == 0); + fail_unless (memcmp (meta->data, st0604_data, 12) == 0); + + gst_buffer_unref (buf); + + gst_harness_teardown (h); +} + +GST_END_TEST; + /* * TODO: * - Both push- and pull-modes need to be tested @@ -1575,6 +1628,7 @@ tcase_add_test (tc_chain, test_parse_compatible_caps); tcase_add_test (tc_chain, test_parse_skip_to_4bytes_sc); tcase_add_test (tc_chain, test_parse_aud_insert); + tcase_add_test (tc_chain, test_parse_sei_userdefinedunregistered); nf += gst_check_run_suite (s, "h264parse", __FILE__); }
View file
gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/h264timestamper.c
Added
@@ -0,0 +1,172 @@ +/* + * GStreamer + * + * unit test for h264timestamper + * + * Copyright (C) 2022 Matthew Waters <matthew@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/check/check.h> +#include <gst/video/video.h> +/* SPS */ +static guint8 h264_sps = { + 0x00, 0x00, 0x00, 0x01, 0x67, 0x4d, 0x40, 0x15, + 0xec, 0xa4, 0xbf, 0x2e, 0x02, 0x20, 0x00, 0x00, + 0x03, 0x00, 0x2e, 0xe6, 0xb2, 0x80, 0x01, 0xe2, + 0xc5, 0xb2, 0xc0 +}; + +/* PPS */ +static guint8 h264_pps = { + 0x00, 0x00, 0x00, 0x01, 0x68, 0xeb, 0xec, 0xb2 +}; + +/* keyframes all around */ +static guint8 h264_idrframe = { + 0x00, 0x00, 0x00, 0x01, 0x65, 0x88, 0x84, 0x00, + 0x10, 0xff, 0xfe, 0xf6, 0xf0, 0xfe, 0x05, 0x36, + 0x56, 0x04, 0x50, 0x96, 0x7b, 0x3f, 0x53, 0xe1 +}; + +static GstBuffer * +create_keyframe_with_sps_pps (void) +{ + gsize size = + G_N_ELEMENTS (h264_sps) + G_N_ELEMENTS (h264_pps) + + G_N_ELEMENTS (h264_idrframe); + GstBuffer *buffer = gst_buffer_new_allocate (NULL, size, NULL); + GstMapInfo map_info; + gsize offset = 0; + + g_assert (gst_buffer_map (buffer, &map_info, GST_MAP_WRITE)); + memcpy (&map_info.dataoffset, h264_sps, G_N_ELEMENTS (h264_sps)); + offset += G_N_ELEMENTS (h264_sps); + memcpy (&map_info.dataoffset, h264_pps, G_N_ELEMENTS (h264_pps)); + offset += G_N_ELEMENTS (h264_pps); + memcpy (&map_info.dataoffset, h264_idrframe, G_N_ELEMENTS (h264_idrframe)); + offset += G_N_ELEMENTS (h264_idrframe); + + gst_buffer_unmap (buffer, &map_info); + + return buffer; +} + +GST_START_TEST (test_input_dts_none) +{ + GstHarness *h = gst_harness_new ("h264timestamper"); + GstBuffer *buffer; + int i; + + gst_harness_set_src_caps_str (h, + "video/x-h264,stream-format=byte-stream,alignment=au"); + gst_harness_set_sink_caps_str (h, + "video/x-h264,stream-format=byte-stream,alignment=au"); + + buffer = create_keyframe_with_sps_pps (); + GST_BUFFER_PTS (buffer) = 0; + fail_unless_equals_int (gst_harness_push (h, buffer), GST_FLOW_OK);; + buffer = gst_buffer_new_memdup (h264_idrframe, G_N_ELEMENTS (h264_idrframe)); + GST_BUFFER_PTS (buffer) = 1 * GST_MSECOND; + fail_unless_equals_int (gst_harness_push (h, buffer), GST_FLOW_OK);; + buffer = gst_buffer_new_memdup (h264_idrframe, G_N_ELEMENTS (h264_idrframe)); + GST_BUFFER_PTS (buffer) = 2 * GST_MSECOND; + fail_unless_equals_int (gst_harness_push (h, buffer), GST_FLOW_OK);; + buffer = gst_buffer_new_memdup (h264_idrframe, G_N_ELEMENTS (h264_idrframe)); + GST_BUFFER_PTS (buffer) = 3 * GST_MSECOND; + fail_unless_equals_int (gst_harness_push (h, buffer), GST_FLOW_OK);; + buffer = gst_buffer_new_memdup (h264_idrframe, G_N_ELEMENTS (h264_idrframe)); + GST_BUFFER_PTS (buffer) = 4 * GST_MSECOND; + fail_unless_equals_int (gst_harness_push (h, buffer), GST_FLOW_OK);; + + gst_harness_push_event (h, gst_event_new_eos ()); + + for (i = 0; i < 5; i++) { + buffer = gst_harness_pull (h); + fail_unless (buffer != NULL); + fail_unless (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_PTS (buffer))); + fail_unless (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS (buffer))); + fail_unless (GST_BUFFER_PTS (buffer) >= GST_BUFFER_DTS (buffer)); + gst_buffer_unref (buffer); + } + + gst_harness_teardown (h); +} + +GST_END_TEST; + +GST_START_TEST (test_input_pts_none) +{ + GstHarness *h = gst_harness_new ("h264timestamper"); + GstBuffer *buffer; + int i; + + gst_harness_set_src_caps_str (h, + "video/x-h264,stream-format=byte-stream,alignment=au"); + gst_harness_set_sink_caps_str (h, + "video/x-h264,stream-format=byte-stream,alignment=au"); + + buffer = create_keyframe_with_sps_pps (); + GST_BUFFER_PTS (buffer) = 0; + fail_unless_equals_int (gst_harness_push (h, buffer), GST_FLOW_OK);; + buffer = gst_buffer_new_memdup (h264_idrframe, G_N_ELEMENTS (h264_idrframe)); + GST_BUFFER_PTS (buffer) = GST_CLOCK_TIME_NONE; + fail_unless_equals_int (gst_harness_push (h, buffer), GST_FLOW_OK);; + buffer = gst_buffer_new_memdup (h264_idrframe, G_N_ELEMENTS (h264_idrframe)); + GST_BUFFER_PTS (buffer) = 2 * GST_MSECOND; + fail_unless_equals_int (gst_harness_push (h, buffer), GST_FLOW_OK);; + buffer = gst_buffer_new_memdup (h264_idrframe, G_N_ELEMENTS (h264_idrframe)); + GST_BUFFER_PTS (buffer) = GST_CLOCK_TIME_NONE; + fail_unless_equals_int (gst_harness_push (h, buffer), GST_FLOW_OK);; + buffer = gst_buffer_new_memdup (h264_idrframe, G_N_ELEMENTS (h264_idrframe)); + GST_BUFFER_PTS (buffer) = 4 * GST_MSECOND; + fail_unless_equals_int (gst_harness_push (h, buffer), GST_FLOW_OK);; + + gst_harness_push_event (h, gst_event_new_eos ()); + + for (i = 0; i < 5; i++) { + buffer = gst_harness_pull (h); + fail_unless (buffer != NULL); + fail_unless (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_PTS (buffer))); + fail_unless (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS (buffer))); + fail_unless (GST_BUFFER_PTS (buffer) >= GST_BUFFER_DTS (buffer)); + gst_buffer_unref (buffer); + } + + gst_harness_teardown (h); +} + +GST_END_TEST; +static Suite * +h264timestamper_suite (void) +{ + Suite *s = suite_create ("h264timestamper"); + TCase *tc = tcase_create ("general"); + + tcase_add_test (tc, test_input_dts_none); + tcase_add_test (tc, test_input_pts_none); + + suite_add_tcase (s, tc); + + return s; +} + +GST_CHECK_MAIN (h264timestamper);
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/elements/hlsdemux_m3u8.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/hlsdemux_m3u8.c
Changed
@@ -572,7 +572,7 @@ ret = gst_m3u8_update (pl, g_strdup (LIVE_ROTATED_PLAYLIST)); assert_equals_int (ret, TRUE); - file = gst_m3u8_get_next_fragment (pl, TRUE, NULL, NULL); + file = gst_m3u8_get_next_fragment (pl, TRUE, NULL, NULL, NULL); fail_unless (file != NULL); gst_m3u8_media_file_unref (file); @@ -805,7 +805,7 @@ pl = master->default_variant->m3u8; /* Check the next fragment */ - mf = gst_m3u8_get_next_fragment (pl, TRUE, ×tamp, &discontinuous); + mf = gst_m3u8_get_next_fragment (pl, TRUE, ×tamp, NULL, &discontinuous); fail_unless (mf != NULL); assert_equals_int (discontinuous, FALSE); assert_equals_string (mf->uri, "http://media.example.com/all.ts"); @@ -818,7 +818,7 @@ gst_m3u8_advance_fragment (pl, TRUE); /* Check next media segments */ - mf = gst_m3u8_get_next_fragment (pl, TRUE, ×tamp, &discontinuous); + mf = gst_m3u8_get_next_fragment (pl, TRUE, ×tamp, NULL, &discontinuous); fail_unless (mf != NULL); assert_equals_int (discontinuous, FALSE); assert_equals_string (mf->uri, "http://media.example.com/all.ts"); @@ -831,7 +831,7 @@ gst_m3u8_advance_fragment (pl, TRUE); /* Check next media segments */ - mf = gst_m3u8_get_next_fragment (pl, TRUE, ×tamp, &discontinuous); + mf = gst_m3u8_get_next_fragment (pl, TRUE, ×tamp, NULL, &discontinuous); assert_equals_int (discontinuous, FALSE); assert_equals_string (mf->uri, "http://media.example.com/all.ts"); assert_equals_uint64 (timestamp, 20 * GST_SECOND);
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/elements/jpegparse.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/jpegparse.c
Changed
@@ -27,25 +27,25 @@ /* This test doesn't use actual JPEG data, but some fake data that we know will trigger certain paths in jpegparse. */ -guint8 test_data_garbage = { 0x00, 0x01, 0xff, 0x32, 0x00, 0xff }; -guint8 test_data_short_frame = { 0xff, 0xd8, 0xff, 0xd9 }; +static guint8 test_data_garbage = { 0x00, 0x01, 0xff, 0x32, 0x00, 0xff }; +static guint8 test_data_short_frame = { 0xff, 0xd8, 0xff, 0xd9 }; -guint8 test_data_normal_frame = { 0xff, 0xd8, 0xff, 0x12, 0x00, 0x03, 0x33, - 0xff, 0xd9 +static guint8 test_data_normal_frame = { 0xff, 0xd8, 0xff, 0x12, 0x00, 0x03, + 0x33, 0xff, 0xd9 }; -guint8 test_data_entropy = { 0xff, 0xd8, 0xff, 0xda, 0x00, 0x04, 0x22, 0x33, - 0x44, 0xff, 0x00, 0x55, 0xff, 0x04, 0x00, 0x04, 0x22, 0x33, 0xff, 0xd9 +static guint8 test_data_entropy = { 0xff, 0xd8, 0xff, 0xda, 0x00, 0x04, 0x22, + 0x33, 0x44, 0xff, 0x00, 0x55, 0xff, 0x04, 0x00, 0x04, 0x22, 0x33, 0xff, 0xd9 }; -guint8 test_data_ff = { 0xff, 0xff }; +static guint8 test_data_ff = { 0xff, 0xff }; -guint8 test_data_extra_ff = { 0xff, 0xd8, 0xff, 0xff, 0xff, 0x12, 0x00, 0x03, - 0x33, 0xff, 0xff, 0xff, 0xd9 +static guint8 test_data_extra_ff = { 0xff, 0xd8, 0xff, 0xff, 0xff, 0x12, 0x00, + 0x03, 0x33, 0xff, 0xff, 0xff, 0xd9 }; -guint8 test_data_soi = { 0xff, 0xd8 }; +static guint8 test_data_soi = { 0xff, 0xd8 }; -guint8 test_data_app1_exif = { +static guint8 test_data_app1_exif = { 0xff, 0xe1, 0x00, 0xd2, /* length = 210 */ 0x45, 0x78, 0x69, 0x66, 0x00, /* Exif */ @@ -129,14 +129,14 @@ 0x22, 0x20, }; -guint8 test_data_comment = { +static guint8 test_data_comment = { 0xff, 0xfe, 0x00, 0x08, /* size */ /* xxxxx */ 0x78, 0x78, 0x78, 0x78, 0x78, 0x00, }; -guint8 test_data_sof0 = { +static guint8 test_data_sof0 = { 0xff, 0xc0, /* baseline dct-based */ 0x00, 0x11, /* size */ 0x08, /* precision */ @@ -148,7 +148,7 @@ 0x03, 0x11, 0x01, /* component 3 */ }; -guint8 test_data_eoi = { 0xff, 0xd9 }; +static guint8 test_data_eoi = { 0xff, 0xd9 }; static GList * _make_buffers_in (GList * buffer_in, guint8 * test_data, gsize test_data_size) @@ -192,7 +192,7 @@ caps_in = gst_caps_new_simple ("image/jpeg", "parsed", G_TYPE_BOOLEAN, FALSE, NULL); caps_out = gst_caps_new_simple ("image/jpeg", "parsed", G_TYPE_BOOLEAN, TRUE, - "framerate", GST_TYPE_FRACTION, 1, 1, NULL); + "framerate", GST_TYPE_FRACTION, 0, 1, NULL); /* Push the data byte by byte, injecting some garbage. */ buffer_in = make_buffers_in (buffer_in, test_data_garbage); @@ -262,7 +262,7 @@ buffer_in = g_list_append (buffer_in, buffer); caps_out = gst_caps_new_simple ("image/jpeg", "parsed", G_TYPE_BOOLEAN, TRUE, - "framerate", GST_TYPE_FRACTION, 1, 1, NULL); + "framerate", GST_TYPE_FRACTION, 0, 1, NULL); buffer_out = make_buffers_out (buffer_out, test_data_short_frame); buffer_out = make_buffers_out (buffer_out, test_data_normal_frame); buffer_out = make_buffers_out (buffer_out, test_data_entropy); @@ -326,8 +326,9 @@ G_TYPE_BOOLEAN, FALSE, NULL); caps_out = gst_caps_new_simple ("image/jpeg", "parsed", G_TYPE_BOOLEAN, TRUE, - "framerate", GST_TYPE_FRACTION, 1, 1, "format", G_TYPE_STRING, - "I420", "width", G_TYPE_INT, 80, "height", G_TYPE_INT, 60, NULL); + "framerate", GST_TYPE_FRACTION, 0, 1, "width", G_TYPE_INT, 80, "height", + G_TYPE_INT, 60, "sof-marker", G_TYPE_INT, 0, "colorspace", G_TYPE_STRING, + "sYUV", "sampling", G_TYPE_STRING, "YCbCr-4:2:0", NULL); buffer_in = make_my_input_buffer (test_data_app1_exif, sizeof (test_data_app1_exif)); @@ -351,8 +352,9 @@ G_TYPE_BOOLEAN, FALSE, NULL); caps_out = gst_caps_new_simple ("image/jpeg", "parsed", G_TYPE_BOOLEAN, TRUE, - "framerate", GST_TYPE_FRACTION, 1, 1, "format", G_TYPE_STRING, - "I420", "width", G_TYPE_INT, 80, "height", G_TYPE_INT, 60, NULL); + "framerate", GST_TYPE_FRACTION, 0, 1, "width", G_TYPE_INT, 80, "height", + G_TYPE_INT, 60, "sof-marker", G_TYPE_INT, 0, "colorspace", G_TYPE_STRING, + "sYUV", "sampling", G_TYPE_STRING, "YCbCr-4:2:0", NULL); buffer_in = make_my_input_buffer (test_data_comment, sizeof (test_data_comment));
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/elements/rtponviftimestamp.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/rtponviftimestamp.c
Changed
@@ -66,7 +66,8 @@ { GstStructure *structure; - structure = gst_structure_new ("GstNtpOffset", "ntp-offset", G_TYPE_UINT64, + structure = + gst_structure_new ("GstOnvifTimestamp", "ntp-offset", G_TYPE_UINT64, ntp_offset, "discont", G_TYPE_BOOLEAN, discont, NULL); return gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, structure); @@ -757,6 +758,90 @@ GST_END_TEST; +GST_START_TEST (test_reference_ts) +{ + GstCaps *ref_ts_id = gst_caps_new_empty_simple ("timestamp/x-unix"); + GstSegment segment; + GstBuffer *buffer; + guint64 timestamp; + GstRTPBuffer rtpbuffer = GST_RTP_BUFFER_INIT; + guint8 *data; + guint64 expected_ntp_time; + + /* configure element to use references timestamps */ + g_object_set (element, "use-reference-timestamps", TRUE, NULL); + + ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS); + + /* push initial events */ + gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME); + + /* a suitable segment */ + gst_segment_init (&segment, GST_FORMAT_TIME); + segment.start = 0; + segment.base = 0; + gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment)); + + /* create a buffer with PTS 0, which should result in both stream time and + * running time becoming 0 with the segment pushed above */ + buffer = create_rtp_buffer (0, FALSE); + + /* add a reference timestamp to the buffer and push it to the element */ + timestamp = 42; + ck_assert_ptr_ne (gst_buffer_add_reference_timestamp_meta (buffer, + ref_ts_id, timestamp, GST_CLOCK_TIME_NONE), NULL); + + /* the timestamp in the extension header is relative to the NTP epoch, so + * adjust the expected timestamp for the difference between unix and ntp + * epochs */ + expected_ntp_time = + gst_util_uint64_scale (timestamp + + G_GUINT64_CONSTANT (2208988800) * GST_SECOND, + (G_GINT64_CONSTANT (1) << 32), GST_SECOND); + + fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK); + fail_unless_equals_int (g_list_length (buffers), 1); + buffer = g_list_last (buffers)->data; + + /* get the extension header */ + fail_unless (gst_rtp_buffer_map (buffer, GST_MAP_READWRITE, &rtpbuffer)); + fail_unless (gst_rtp_buffer_get_extension_data (&rtpbuffer, NULL, + (gpointer) & data, NULL)); + + /* read the NTP timestamp and verify that it's the expected one, i.e. derived + * from the reference timestamp */ + timestamp = GST_READ_UINT64_BE (data); + fail_unless_equals_uint64 (timestamp, expected_ntp_time); + + gst_rtp_buffer_unmap (&rtpbuffer); + gst_check_drop_buffers (); + gst_caps_unref (ref_ts_id); +} + +GST_END_TEST; + +GST_START_TEST (test_reference_ts_not_present) +{ + GstBuffer *buffer; + + /* configure element to use references timestamps */ + g_object_set (element, "use-reference-timestamps", TRUE, NULL); + + ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS); + + /* push initial events */ + gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME); + + /* create a buffer without reference timestamp, push it and verify that + * GST_FLOW_ERROR is returned */ + buffer = create_rtp_buffer (0, FALSE); + fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_ERROR); + + gst_check_drop_buffers (); +} + +GST_END_TEST; + static Suite * onviftimestamp_suite (void) { @@ -776,6 +861,9 @@ tcase_add_test (tc_general, test_ntp_offset_event); tcase_add_test (tc_general, test_ntp_time); + tcase_add_test (tc_general, test_reference_ts); + tcase_add_test (tc_general, test_reference_ts_not_present); + tc_events = tcase_create ("events"); suite_add_tcase (s, tc_events); tcase_add_checked_fixture (tc_events, setup_with_event, cleanup_with_event);
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/elements/srtp.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/srtp.c
Changed
@@ -20,11 +20,11 @@ */ #ifdef HAVE_CONFIG_H -# include "config.h" +#include "config.h" #endif #ifdef HAVE_VALGRIND -# include <valgrind/valgrind.h> +#include <valgrind/valgrind.h> #endif #include <gst/check/gstcheck.h> @@ -48,20 +48,34 @@ GST_END_TEST; -GST_START_TEST (test_play) +static void +check_play (const gchar * encode_key, const gchar * decode_key, + guint buffer_count, guint expected_recv_count, + guint expected_recv_drop_count, guint port) { GstElement *source_pipeline, *sink_pipeline; GstBus *source_bus; GstMessage *msg; + GstStructure *stats; + guint recv_count = 0; + guint drop_count = 0; + GstElement *srtp_dec; - source_pipeline = - gst_parse_launch - ("audiotestsrc num-buffers=50 ! alawenc ! rtppcmapay ! application/x-rtp, payload=(int)8, ssrc=(uint)1356955624 ! srtpenc name=enc key=012345678901234567890123456789012345678901234567890123456789 ! udpsink port=5004 sync=false", - NULL); - sink_pipeline = - gst_parse_launch - ("udpsrc port=5004 caps=\"application/x-srtp, payload=(int)8, ssrc=(uint)1356955624, srtp-key=(buffer)012345678901234567890123456789012345678901234567890123456789, srtp-cipher=(string)aes-128-icm, srtp-auth=(string)hmac-sha1-80, srtcp-cipher=(string)aes-128-icm, srtcp-auth=(string)hmac-sha1-80\" ! srtpdec name=dec ! rtppcmadepay ! alawdec ! fakesink", - NULL); + gchar *source_pipeline_desc = g_strdup_printf ("audiotestsrc num-buffers=%d \ + ! alawenc ! rtppcmapay ! application/x-rtp, payload=(int)8, ssrc=(uint)1356955624 \ + ! srtpenc name=enc key=%s ! udpsink port=%d sync=false host=127.0.0.1", buffer_count, encode_key, port); + + gchar *sink_pipeline_desc = + g_strdup_printf ("udpsrc port=%d caps=\"application/x-srtp, \ + payload=(int)8, ssrc=(uint)1356955624, srtp-key=(buffer)%s, srtp-cipher=(string)aes-128-icm, \ + srtp-auth=(string)hmac-sha1-80, srtcp-cipher=(string)aes-128-icm, srtcp-auth=(string)hmac-sha1-80\" \ + ! srtpdec name=dec ! rtppcmadepay ! alawdec ! fakesink", port, decode_key); + + source_pipeline = gst_parse_launch (source_pipeline_desc, NULL); + sink_pipeline = gst_parse_launch (sink_pipeline_desc, NULL); + + g_free (source_pipeline_desc); + g_free (sink_pipeline_desc); fail_unless (gst_element_set_state (source_pipeline, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE); @@ -76,6 +90,17 @@ fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS); gst_message_unref (msg); + // Wait 3s that all the buffers reached the sink pipeline entirely + g_usleep (G_USEC_PER_SEC * 3); + + srtp_dec = gst_bin_get_by_name (GST_BIN (sink_pipeline), "dec"); + g_object_get (srtp_dec, "stats", &stats, NULL); + gst_structure_get_uint (stats, "recv-count", &recv_count); + fail_unless (recv_count == expected_recv_count); + gst_structure_get_uint (stats, "recv-drop-count", &drop_count); + fail_unless (drop_count == expected_recv_drop_count); + gst_object_unref (srtp_dec); + gst_structure_free (stats); gst_object_unref (source_bus); gst_element_set_state (source_pipeline, GST_STATE_NULL); @@ -85,8 +110,23 @@ gst_object_unref (sink_pipeline); } +GST_START_TEST (test_play) +{ + check_play ("012345678901234567890123456789012345678901234567890123456789", + "012345678901234567890123456789012345678901234567890123456789", 50, 50, + 0, 5064); +} + GST_END_TEST; +GST_START_TEST (test_play_key_error) +{ + check_play ("012345678901234567890123456789012345678901234567890123456789", + "000000000000000000000000000000000000000000000000000000000000", 50, 50, + 50, 5074); +} + +GST_END_TEST; typedef struct { guint counter; @@ -96,16 +136,18 @@ static guint get_roc (GstElement * e) { - const GstStructure *s, *ss; + GstStructure *stats; + const GstStructure *ss; const GValue *v; guint roc = 0; - g_object_get (e, "stats", &s, NULL); - v = gst_structure_get_value (s, "streams"); + g_object_get (e, "stats", &stats, NULL); + v = gst_structure_get_value (stats, "streams"); fail_unless (v); v = gst_value_array_get_value (v, 0); ss = gst_value_get_structure (v); gst_structure_get_uint (ss, "roc", &roc); + gst_structure_free (stats); return roc; } @@ -151,7 +193,7 @@ source_pipeline = gst_parse_launch - ("audiotestsrc num-buffers=65555 ! alawenc ! rtppcmapay ! application/x-rtp, payload=(int)8, ssrc=(uint)1356955624 ! srtpenc name=enc key=012345678901234567890123456789012345678901234567890123456789 ! udpsink port=5004 sync=false", + ("audiotestsrc num-buffers=65555 ! alawenc ! rtppcmapay ! application/x-rtp, payload=(int)8, ssrc=(uint)1356955624 ! srtpenc name=enc key=012345678901234567890123456789012345678901234567890123456789 ! udpsink port=5004 sync=false host=127.0.0.1", NULL); sink_pipeline = gst_parse_launch @@ -352,6 +394,7 @@ tcase_add_test (tc_chain, test_create_and_unref); tcase_add_test (tc_chain, test_play); tcase_add_test (tc_chain, test_roc); + tcase_add_test (tc_chain, test_play_key_error); #ifdef HAVE_SRTP2 tcase_add_test (tc_chain, test_simple_mki); tcase_add_test (tc_chain, test_srtpdec_multiple_mki);
View file
gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/vacompositor.c
Added
@@ -0,0 +1,219 @@ +/* + * vacompositor.c - GStreamer unit test for the vacompositor element + * + * Copyright (C) 2022 Intel Corporation + * Author: U. Artie Eoff <ullysses.a.eoff@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <gst/check/gstcheck.h> +#include <gst/video/video.h> + +static GMainLoop *main_loop; + +static void +message_received (GstBus * bus, GstMessage * message, GstPipeline * bin) +{ + GST_INFO ("bus message from \"%" GST_PTR_FORMAT "\": %" GST_PTR_FORMAT, + GST_MESSAGE_SRC (message), message); + + switch (message->type) { + case GST_MESSAGE_EOS: + g_main_loop_quit (main_loop); + break; + case GST_MESSAGE_WARNING:{ + GError *gerror; + gchar *debug; + + gst_message_parse_warning (message, &gerror, &debug); + gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); + g_error_free (gerror); + g_free (debug); + break; + } + case GST_MESSAGE_ERROR:{ + GError *gerror; + gchar *debug; + + gst_message_parse_error (message, &gerror, &debug); + gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); + g_error_free (gerror); + g_free (debug); + g_main_loop_quit (main_loop); + break; + } + default: + break; + } +} + +static GstBuffer *handoff_buffer = NULL; +static void +on_handoff (GstElement * element, GstBuffer * buffer, GstPad * pad, + gpointer data) +{ + gst_buffer_replace (&handoff_buffer, buffer); +} + +#define TEST_PATTERN_RED 4 +#define TEST_PATTERN_GREEN 5 + +GST_START_TEST (test_composition_position) +{ + GstElement *bin, *src1, *filter1, *src2, *filter2, *comp, *sink; + GstBus *bus; + GstPad *pad, *srcpad, *sinkpad; + GstCaps *caps; + GstVideoFrame frame; + GstVideoInfo vinfo; + + /* Check if vacompositor is available, since it is only available + * for iHD vaapi driver */ + comp = gst_element_factory_make ("vacompositor", "compositor"); + if (!comp) + return; + + /* build pipeline */ + bin = gst_pipeline_new ("pipeline"); + bus = gst_element_get_bus (bin); + gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH); + + src1 = gst_element_factory_make ("videotestsrc", "src1"); + g_object_set (src1, "num-buffers", 1, NULL); + g_object_set (src1, "pattern", TEST_PATTERN_GREEN, NULL); + filter1 = gst_element_factory_make ("capsfilter", "filter1"); + caps = gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, "NV12", + "width", G_TYPE_INT, 320, "height", G_TYPE_INT, 240, NULL); + g_object_set (filter1, "caps", caps, NULL); + gst_caps_unref (caps); + + src2 = gst_element_factory_make ("videotestsrc", "src2"); + g_object_set (src2, "num-buffers", 1, NULL); + g_object_set (src2, "pattern", TEST_PATTERN_RED, NULL); + filter2 = gst_element_factory_make ("capsfilter", "filter2"); + caps = gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, "NV12", + "width", G_TYPE_INT, 20, "height", G_TYPE_INT, 20, NULL); + g_object_set (filter2, "caps", caps, NULL); + gst_caps_unref (caps); + + sink = gst_element_factory_make ("fakesink", "sink"); + g_object_set (sink, "signal-handoffs", TRUE, NULL); + g_signal_connect (sink, "handoff", G_CALLBACK (on_handoff), NULL); + + gst_bin_add_many (GST_BIN (bin), src1, filter1, src2, filter2, comp, + sink, NULL); + gst_element_link (src1, filter1); + gst_element_link (src2, filter2); + gst_element_link (comp, sink); + + srcpad = gst_element_get_static_pad (filter1, "src"); + sinkpad = gst_element_request_pad_simple (comp, "sink_0"); + g_object_set (sinkpad, "xpos", 0, "ypos", 0, "alpha", 1.0, NULL); + gst_pad_link (srcpad, sinkpad); + gst_object_unref (sinkpad); + gst_object_unref (srcpad); + + srcpad = gst_element_get_static_pad (filter2, "src"); + sinkpad = gst_element_request_pad_simple (comp, "sink_1"); + g_object_set (sinkpad, "xpos", 10, "ypos", 10, "alpha", 1.0, NULL); + gst_pad_link (srcpad, sinkpad); + gst_object_unref (sinkpad); + gst_object_unref (srcpad); + + /* setup and run the main loop */ + main_loop = g_main_loop_new (NULL, FALSE); + g_signal_connect (bus, "message::error", (GCallback) message_received, bin); + g_signal_connect (bus, "message::warning", (GCallback) message_received, bin); + g_signal_connect (bus, "message::eos", (GCallback) message_received, bin); + gst_element_set_state (bin, GST_STATE_PAUSED); + gst_element_get_state (bin, NULL, NULL, GST_CLOCK_TIME_NONE); + gst_element_set_state (bin, GST_STATE_PLAYING); + g_main_loop_run (main_loop); + + /* validate output buffer */ + fail_unless (handoff_buffer != NULL); + pad = gst_element_get_static_pad (sink, "sink"); + caps = gst_pad_get_current_caps (pad); + gst_video_info_from_caps (&vinfo, caps); + gst_caps_unref (caps); + gst_object_unref (pad); + + gst_video_frame_map (&frame, &vinfo, handoff_buffer, GST_MAP_READ); + { + guint i, j, n_planes, plane; + n_planes = GST_VIDEO_FRAME_N_PLANES (&frame); + + for (plane = 0; plane < n_planes; plane++) { + guint8 *pd = GST_VIDEO_FRAME_PLANE_DATA (&frame, plane); + gint w = GST_VIDEO_FRAME_COMP_WIDTH (&frame, plane) + * GST_VIDEO_FRAME_COMP_PSTRIDE (&frame, plane); + gint h = GST_VIDEO_FRAME_COMP_HEIGHT (&frame, plane); + gint ps = GST_VIDEO_FRAME_PLANE_STRIDE (&frame, plane); + + for (j = 0; j < h; ++j) { + for (i = 0; i < w; ++i) { + guint8 actual = GST_READ_UINT8 (pd + i); + guint8 expect = 0xff; + if (plane == 0) { + if (i >= 10 && i < 30 && j >= 10 && j < 30) + expect = 0x51; + else + expect = 0x91; + } else { + if (i >= 10 && i < 30 && j >= 5 && j < 15) + expect = (i % 2) ? 0xf0 : 0x5a; + else + expect = (i % 2) ? 0x22 : 0x36; + } + fail_unless (actual == expect, + "Expected 0x%02x but got 0x%02x at (%u,%u,%u)", expect, actual, + plane, i, j); + } + pd += ps; + } + } + } + gst_video_frame_unmap (&frame); + + /* cleanup */ + gst_buffer_replace (&handoff_buffer, NULL); + gst_element_set_state (bin, GST_STATE_NULL); + g_main_loop_unref (main_loop); + gst_bus_remove_signal_watch (bus); + gst_object_unref (bus); + gst_object_unref (bin); +} + +GST_END_TEST; + +static Suite * +vacompositor_suite (void) +{ + Suite *s = suite_create ("vacompositor"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_composition_position); + + return s; +} + +GST_CHECK_MAIN (vacompositor);
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/elements/voamrwbenc.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/voamrwbenc.c
Changed
@@ -20,8 +20,7 @@ * Boston, MA 02110-1301, USA. */ -#include <unistd.h> - +#include <gst/audio/audio-format.h> #include <gst/check/gstcheck.h> /* For ease of programming we use globals to keep refs for our floating @@ -29,17 +28,11 @@ * get_peer, and then remove references in every test function */ static GstPad *mysrcpad, *mysinkpad; -#if G_BYTE_ORDER == G_BIG_ENDIAN -#define AFORMAT "S16BE" -#else -#define AFORMAT "S16LE" -#endif - #define AUDIO_CAPS_STRING "audio/x-raw, " \ - "format = (string) " AFORMAT ", "\ - "layout = (string) interleaved, " \ - "rate = (int) 16000, " \ - "channels = (int) 1 " + "format = (string) " GST_AUDIO_NE (S16) ", " \ + "layout = (string) interleaved, " \ + "rate = (int) 16000, " \ + "channels = (int) 1 " #define AMRWB_CAPS_STRING "audio/AMR-WB" @@ -88,13 +81,14 @@ } static void -do_test (void) +do_test (gsize sample_count) { GstElement *voamrwbenc; GstBuffer *inbuffer, *outbuffer; GstCaps *caps; gint i, num_buffers; - const gint nbuffers = 10; + const gsize buffer_size = sample_count * 2; + const gsize nbuffers = (sample_count + 319) / 320; voamrwbenc = setup_voamrwbenc (); fail_unless (gst_element_set_state (voamrwbenc, @@ -102,9 +96,9 @@ "could not set to playing"); /* corresponds to audio buffer mentioned in the caps */ - inbuffer = gst_buffer_new_and_alloc (320 * nbuffers * 2); + inbuffer = gst_buffer_new_allocate (NULL, buffer_size, NULL); /* makes valgrind's memcheck happier */ - gst_buffer_memset (inbuffer, 0, 0, 1024 * nbuffers * 2 * 2); + gst_buffer_memset (inbuffer, 0, 0, buffer_size); caps = gst_caps_from_string (AUDIO_CAPS_STRING); gst_check_setup_events (mysrcpad, voamrwbenc, caps, GST_FORMAT_TIME); @@ -156,13 +150,26 @@ buffers = NULL; } -GST_START_TEST (test_enc) +GST_START_TEST (test_enc_aligned) { - do_test (); + do_test (3200); } GST_END_TEST; +GST_START_TEST (test_enc_minus_one) +{ + do_test (3199); +} + +GST_END_TEST; + +GST_START_TEST (test_enc_plus_one) +{ + do_test (3201); +} + +GST_END_TEST; static Suite * voamrwbenc_suite (void) @@ -171,7 +178,9 @@ TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); - tcase_add_test (tc_chain, test_enc); + tcase_add_test (tc_chain, test_enc_aligned); + tcase_add_test (tc_chain, test_enc_minus_one); + tcase_add_test (tc_chain, test_enc_plus_one); return s; }
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/elements/webrtcbin.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/elements/webrtcbin.c
Changed
@@ -29,14 +29,15 @@ #include <gst/check/gstcheck.h> #include <gst/check/gstharness.h> #include <gst/webrtc/webrtc.h> +#include <gst/rtp/rtp.h> #include "../../../ext/webrtc/webrtcsdp.h" #include "../../../ext/webrtc/webrtcsdp.c" #include "../../../ext/webrtc/utils.h" #include "../../../ext/webrtc/utils.c" #define OPUS_RTP_CAPS(pt) "application/x-rtp,payload=" G_STRINGIFY(pt) ",encoding-name=OPUS,media=audio,clock-rate=48000,ssrc=(uint)3384078950" -#define VP8_RTP_CAPS(pt) "application/x-rtp,payload=" G_STRINGIFY(pt) ",encoding-name=VP8,media=video,clock-rate=90000,ssrc=(uint)3484078950" -#define H264_RTP_CAPS(pt) "application/x-rtp,payload=" G_STRINGIFY(pt) ",encoding-name=H264,media=video,clock-rate=90000,ssrc=(uint)3484078951" +#define VP8_RTP_CAPS(pt) "application/x-rtp,payload=" G_STRINGIFY(pt) ",encoding-name=VP8,media=video,clock-rate=90000,ssrc=(uint)3484078951" +#define H264_RTP_CAPS(pt) "application/x-rtp,payload=" G_STRINGIFY(pt) ",encoding-name=H264,media=video,clock-rate=90000,ssrc=(uint)3484078952" #define TEST_IS_OFFER_ELEMENT(t, e) ((((t)->offerror == 1 && (e) == (t)->webrtc1) || ((t)->offerror == 2 && (e) == (t)->webrtc2)) ? TRUE : FALSE) #define TEST_GET_OFFEROR(t) (TEST_IS_OFFER_ELEMENT(t, t->webrtc1) ? (t)->webrtc1 : t->webrtc2) @@ -46,7 +47,7 @@ typedef enum { - STATE_NEW, + STATE_NEW = 1, STATE_NEGOTIATION_NEEDED, STATE_OFFER_CREATED, STATE_OFFER_SET, @@ -57,9 +58,12 @@ STATE_CUSTOM, } TestState; +struct test_webrtc; +typedef void (*OnPadAdded) (struct test_webrtc * t, GstElement * element, + GstPad * pad, gpointer user_data); + /* basic premise of this is that webrtc1 and webrtc2 are attempting to connect * to each other in various configurations */ -struct test_webrtc; struct test_webrtc { GList *harnesses; @@ -72,8 +76,9 @@ GstElement *webrtc2; GMutex lock; GCond cond; - TestState state; + GArray *states; guint offerror; + gulong error_signal_handler_id; gpointer user_data; GDestroyNotify data_notify; /* *INDENT-OFF* */ @@ -118,16 +123,20 @@ gpointer user_data); gpointer answer_set_data; GDestroyNotify answer_set_notify; + void (*on_prepare_data_channel) (struct test_webrtc * t, + GstElement * element, + GObject * data_channel, + gboolean is_local, + gpointer user_data); + void (*on_data_channel) (struct test_webrtc * t, GstElement * element, GObject *data_channel, gpointer user_data); gpointer data_channel_data; GDestroyNotify data_channel_notify; - void (*on_pad_added) (struct test_webrtc * t, - GstElement * element, - GstPad * pad, - gpointer user_data); + + OnPadAdded on_pad_added; gpointer pad_added_data; GDestroyNotify pad_added_notify; void (*bus_message) (struct test_webrtc * t, @@ -142,7 +151,8 @@ static void test_webrtc_signal_state_unlocked (struct test_webrtc *t, TestState state) { - t->state = state; + GST_TRACE ("signal state 0x%x", state); + g_array_append_val (t->states, state); g_cond_broadcast (&t->cond); } @@ -154,6 +164,20 @@ g_mutex_unlock (&t->lock); } +#if 0 +static gboolean +test_webrtc_state_find_unlocked (struct test_webrtc *t, TestState state, + guint * idx) +{ + guint i; + for (i = 0; i < t->states->len; i++) { + if (state == g_array_index (t->states, TestState, i)) + return TRUE; + } + + return FALSE; +} +#endif static void _on_answer_set (GstPromise * promise, gpointer user_data) { @@ -164,8 +188,7 @@ if (++t->answer_set_count >= 2) { if (t->on_answer_set) t->on_answer_set (t, answerer, promise, t->answer_set_data); - if (t->state == STATE_ANSWER_CREATED) - t->state = STATE_ANSWER_SET; + test_webrtc_signal_state_unlocked (t, STATE_ANSWER_SET); g_cond_broadcast (&t->cond); } gst_promise_unref (promise); @@ -222,8 +245,7 @@ error: g_clear_error (&error); - if (t->state < STATE_ERROR) - test_webrtc_signal_state_unlocked (t, STATE_ERROR); + test_webrtc_signal_state_unlocked (t, STATE_ERROR); g_mutex_unlock (&t->lock); return; } @@ -238,8 +260,7 @@ if (++t->offer_set_count >= 2) { if (t->on_offer_set) t->on_offer_set (t, offeror, promise, t->offer_set_data); - if (t->state == STATE_OFFER_CREATED) - t->state = STATE_OFFER_SET; + test_webrtc_signal_state_unlocked (t, STATE_OFFER_SET); g_cond_broadcast (&t->cond); } gst_promise_unref (promise); @@ -281,6 +302,12 @@ if (error) goto error; + test_webrtc_signal_state_unlocked (t, STATE_OFFER_CREATED); + + gst_object_ref (offeror); + gst_object_ref (answerer); + g_mutex_unlock (&t->lock); + if (t->offer_desc) { promise = gst_promise_new_with_change_func (_on_offer_set, t, NULL); g_signal_emit_by_name (offeror, "set-local-description", t->offer_desc, @@ -293,14 +320,14 @@ g_signal_emit_by_name (answerer, "create-answer", NULL, promise); } - test_webrtc_signal_state_unlocked (t, STATE_OFFER_CREATED); - g_mutex_unlock (&t->lock); + gst_clear_object (&offeror); + gst_clear_object (&answerer); + return; error: g_clear_error (&error); - if (t->state < STATE_ERROR) - test_webrtc_signal_state_unlocked (t, STATE_ERROR); + test_webrtc_signal_state_unlocked (t, STATE_ERROR); g_mutex_unlock (&t->lock); return; } @@ -318,8 +345,9 @@ gst_message_parse_state_changed (msg, &old, &new, &pending); { - gchar *dump_name = g_strconcat ("%s-state_changed-", - GST_OBJECT_NAME (msg->src), gst_element_state_get_name (old), "_", + gchar *dump_name = + g_strconcat (GST_OBJECT_NAME (msg->src), "-state_changed-", + gst_element_state_get_name (old), "_", gst_element_state_get_name (new), NULL); GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (msg->src), GST_DEBUG_GRAPH_SHOW_ALL, dump_name); @@ -333,13 +361,11 @@ { gchar *dump_name; - dump_name = - g_strconcat ("%s-error", GST_OBJECT_NAME (t->webrtc1), NULL); + dump_name = g_strconcat (GST_OBJECT_NAME (t->webrtc1), "-error", NULL); GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (t->webrtc1), GST_DEBUG_GRAPH_SHOW_ALL, dump_name); g_free (dump_name); - dump_name = - g_strconcat ("%s-error", GST_OBJECT_NAME (t->webrtc2), NULL); + dump_name = g_strconcat (GST_OBJECT_NAME (t->webrtc2), "-error", NULL); GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (t->webrtc2), GST_DEBUG_GRAPH_SHOW_ALL, dump_name); g_free (dump_name); @@ -381,14 +407,53 @@ return TRUE; } + +static void +on_channel_error_not_reached (GObject * channel, GError * error, + gpointer user_data) +{ + g_assert_not_reached (); +} + +static void on_message_string (GObject * channel, const gchar * str, + struct test_webrtc *t); +static void on_message_data (GObject * channel, GBytes * data, + struct test_webrtc *t); + +static void +have_prepare_data_channel (struct test_webrtc *t, + GstElement * element, + GObject * data_channel, gboolean is_local, gpointer user_data) +{ + t->error_signal_handler_id = + g_signal_connect (data_channel, "on-error", + G_CALLBACK (on_channel_error_not_reached), NULL); + g_signal_connect (data_channel, "on-message-string", + G_CALLBACK (on_message_string), t); + g_signal_connect (data_channel, "on-message-data", + G_CALLBACK (on_message_data), t); +} + +static void +_on_prepare_data_channel (GstElement * webrtc, GObject * data_channel, + gboolean is_local, struct test_webrtc *t) +{ + /* We can't lock the test_webrtc mutex here because this callback might be + * called from an already locked _on_data_channel thread. This is the case for + * the test_data_channel_create_after_negotiate test. */ + if (t->on_prepare_data_channel) + t->on_prepare_data_channel (t, webrtc, data_channel, is_local, + t->data_channel_data); + +} + static void _on_negotiation_needed (GstElement * webrtc, struct test_webrtc *t) { g_mutex_lock (&t->lock); if (t->on_negotiation_needed) t->on_negotiation_needed (t, webrtc, t->negotiation_data); - if (t->state == STATE_NEW) - t->state = STATE_NEGOTIATION_NEEDED; + test_webrtc_signal_state_unlocked (t, STATE_NEGOTIATION_NEEDED); g_cond_broadcast (&t->cond); g_mutex_unlock (&t->lock); } @@ -480,8 +545,16 @@ } static void -_on_data_channel_not_reached (struct test_webrtc *t, GstElement * element, - GObject * data_channel, gpointer user_data) +_on_prepare_data_channel_not_reached (struct test_webrtc *t, + GstElement * element, GObject * data_channel, gboolean is_local, + gpointer user_data) +{ + g_assert_not_reached (); +} + +static void +_on_data_channel_not_reached (struct test_webrtc *t, + GstElement * element, GObject * data_channel, gpointer user_data) { g_assert_not_reached (); } @@ -541,13 +614,17 @@ ret->on_pad_added = _pad_added_not_reached; ret->on_offer_created = _offer_answer_not_reached; ret->on_answer_created = _offer_answer_not_reached; + ret->on_prepare_data_channel = _on_prepare_data_channel_not_reached; ret->on_data_channel = _on_data_channel_not_reached; ret->bus_message = _bus_no_errors; ret->offerror = 1; + ret->error_signal_handler_id = -1; g_mutex_init (&ret->lock); g_cond_init (&ret->cond); + ret->states = g_array_new (FALSE, TRUE, sizeof (TestState)); + ret->test_clock = GST_TEST_CLOCK (gst_test_clock_new ()); ret->thread = g_thread_new ("test-webrtc", (GThreadFunc) _bus_thread, ret); @@ -587,6 +664,10 @@ G_CALLBACK (_on_data_channel), ret); g_signal_connect (ret->webrtc2, "on-data-channel", G_CALLBACK (_on_data_channel), ret); + g_signal_connect (ret->webrtc1, "prepare-data-channel", + G_CALLBACK (_on_prepare_data_channel), ret); + g_signal_connect (ret->webrtc2, "prepare-data-channel", + G_CALLBACK (_on_prepare_data_channel), ret); g_signal_connect (ret->webrtc1, "pad-added", G_CALLBACK (_on_pad_added), ret); g_signal_connect (ret->webrtc2, "pad-added", G_CALLBACK (_on_pad_added), ret); g_signal_connect_swapped (ret->webrtc1, "notify::ice-gathering-state", @@ -604,6 +685,7 @@ static void test_webrtc_reset_negotiation (struct test_webrtc *t) { + GST_DEBUG ("resetting negotiation"); if (t->offer_desc) gst_webrtc_session_description_free (t->offer_desc); t->offer_desc = NULL; @@ -677,6 +759,9 @@ g_mutex_clear (&t->lock); g_cond_clear (&t->cond); + g_array_free (t->states, TRUE); + t->states = NULL; + g_free (t); } @@ -690,26 +775,67 @@ g_signal_emit_by_name (offeror, "create-offer", NULL, promise); } -static void +static TestState +test_webrtc_check_for_state_mask_unlocked (struct test_webrtc *t, + TestState state) +{ + guint i; + + GST_LOG ("attempting to check for state mask 0x%x", state); + for (i = 0; i < t->states->len; i++) { + TestState val = g_array_index (t->states, TestState, i); + + if (((1 << val) & state) != 0) { + GST_DEBUG ("found state 0x%x in wait mask 0x%x at idx %u", val, state, i); + g_array_remove_range (t->states, 0, i + 1); + return val; + } + } + + return 0; +} + +static TestState +test_webrtc_check_for_state_mask (struct test_webrtc *t, TestState state) +{ + TestState ret; + + g_mutex_lock (&t->lock); + ret = test_webrtc_check_for_state_mask_unlocked (t, state); + g_mutex_unlock (&t->lock); + + return ret; +} + +static TestState test_webrtc_wait_for_state_mask (struct test_webrtc *t, TestState state) { + TestState ret = 0; + g_mutex_lock (&t->lock); - while (((1 << t->state) & state) == 0) { - GST_INFO ("test state 0x%x, current 0x%x", state, (1 << t->state)); + + GST_LOG ("attempting to wait for state mask 0x%x", state); + while (TRUE) { + ret = test_webrtc_check_for_state_mask_unlocked (t, state); + + if (ret) + break; + g_cond_wait (&t->cond, &t->lock); } - GST_INFO ("have test state 0x%x, current 0x%x", state, 1 << t->state); g_mutex_unlock (&t->lock); + + return ret; } -static void +static TestState test_webrtc_wait_for_answer_error_eos (struct test_webrtc *t) { TestState states = 0; states |= (1 << STATE_ANSWER_SET); states |= (1 << STATE_EOS); states |= (1 << STATE_ERROR); - test_webrtc_wait_for_state_mask (t, states); + return test_webrtc_wait_for_state_mask (t, states); } static void @@ -834,8 +960,8 @@ test_webrtc_create_offer (t); if (wait_mask == 0) { - test_webrtc_wait_for_answer_error_eos (t); - fail_unless (t->state == STATE_ANSWER_SET); + fail_unless_equals_int (test_webrtc_wait_for_answer_error_eos (t), + STATE_ANSWER_SET); } else { test_webrtc_wait_for_state_mask (t, wait_mask); } @@ -892,22 +1018,22 @@ if (g_strcmp0 (attr->key, "inactive") == 0) { fail_unless (have_direction == FALSE, - "duplicate/multiple directions for media %u", j); + "duplicate/multiple directions for media %u", i); have_direction = TRUE; fail_unless_equals_string (attr->key, expected_directionsi); } else if (g_strcmp0 (attr->key, "sendonly") == 0) { fail_unless (have_direction == FALSE, - "duplicate/multiple directions for media %u", j); + "duplicate/multiple directions for media %u", i); have_direction = TRUE; fail_unless_equals_string (attr->key, expected_directionsi); } else if (g_strcmp0 (attr->key, "recvonly") == 0) { fail_unless (have_direction == FALSE, - "duplicate/multiple directions for media %u", j); + "duplicate/multiple directions for media %u", i); have_direction = TRUE; fail_unless_equals_string (attr->key, expected_directionsi); } else if (g_strcmp0 (attr->key, "sendrecv") == 0) { fail_unless (have_direction == FALSE, - "duplicate/multiple directions for media %u", j); + "duplicate/multiple directions for media %u", i); have_direction = TRUE; fail_unless_equals_string (attr->key, expected_directionsi); } @@ -972,7 +1098,7 @@ if (g_strcmp0 (attr->key, "setup") == 0) { fail_unless (have_setup == FALSE, - "duplicate/multiple setup for media %u", j); + "duplicate/multiple setup for media %u", i); have_setup = TRUE; fail_unless_equals_string (attr->value, expected_setupi); } @@ -982,20 +1108,24 @@ } static void -add_fake_audio_src_harness (GstHarness * h, gint pt) +add_fake_audio_src_harness (GstHarness * h, gint pt, guint ssrc) { GstCaps *caps = gst_caps_from_string (OPUS_RTP_CAPS (pt)); GstStructure *s = gst_caps_get_structure (caps, 0); + if (ssrc != 0) + gst_structure_set (s, "ssrc", G_TYPE_UINT, ssrc, NULL); gst_structure_set (s, "payload", G_TYPE_INT, pt, NULL); gst_harness_set_src_caps (h, caps); gst_harness_add_src_parse (h, "fakesrc is-live=true", TRUE); } static void -add_fake_video_src_harness (GstHarness * h, gint pt) +add_fake_video_src_harness (GstHarness * h, gint pt, guint ssrc) { GstCaps *caps = gst_caps_from_string (VP8_RTP_CAPS (pt)); GstStructure *s = gst_caps_get_structure (caps, 0); + if (ssrc != 0) + gst_structure_set (s, "ssrc", G_TYPE_UINT, ssrc, NULL); gst_structure_set (s, "payload", G_TYPE_INT, pt, NULL); gst_harness_set_src_caps (h, caps); gst_harness_add_src_parse (h, "fakesrc is-live=true", TRUE); @@ -1010,14 +1140,25 @@ t->on_negotiation_needed = NULL; t->on_ice_candidate = NULL; t->on_pad_added = _pad_added_fakesink; + t->on_prepare_data_channel = have_prepare_data_channel; h = gst_harness_new_with_element (t->webrtc1, "sink_0", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); return t; } +static void +on_new_transceiver_expected_kind (GstWebRTCBin * webrtc, + GstWebRTCRTPTransceiver * trans, gpointer user_data) +{ + GstWebRTCKind kind, expected = GPOINTER_TO_UINT (user_data); + + g_object_get (trans, "kind", &kind, NULL); + fail_unless_equals_int (kind, expected); +} + GST_START_TEST (test_audio) { struct test_webrtc *t = create_audio_test (); @@ -1039,10 +1180,18 @@ const gchar *expected_answer_direction = { "recvonly", }; VAL_SDP_INIT (answer, on_sdp_media_direction, expected_answer_direction, &answer_setup); + GstWebRTCKind expected_kind = GST_WEBRTC_KIND_AUDIO; /* check that a single stream connection creates the associated number * of media sections */ + g_signal_connect (t->webrtc1, "on-new-transceiver", + G_CALLBACK (on_new_transceiver_expected_kind), + GUINT_TO_POINTER (expected_kind)); + g_signal_connect (t->webrtc2, "on-new-transceiver", + G_CALLBACK (on_new_transceiver_expected_kind), + GUINT_TO_POINTER (expected_kind)); + test_validate_sdp (t, &offer, &answer); test_webrtc_free (t); } @@ -1128,7 +1277,7 @@ GstHarness *h; h = gst_harness_new_with_element (t->webrtc1, "sink_1", NULL); - add_fake_video_src_harness (h, 97); + add_fake_video_src_harness (h, 97, 0xBEEFDEAD); t->harnesses = g_list_prepend (t->harnesses, h); return t; @@ -1192,7 +1341,7 @@ /* check the default media directions for transceivers */ h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); test_validate_sdp (t, &offer, &answer); @@ -1291,8 +1440,8 @@ pad = gst_element_request_pad_simple (t->webrtc1, "sink_0"); fail_unless (pad == NULL); - test_webrtc_wait_for_answer_error_eos (t); - fail_unless_equals_int (STATE_ERROR, t->state); + fail_unless_equals_int (STATE_ERROR, + test_webrtc_wait_for_answer_error_eos (t)); test_webrtc_free (t); if (nicesrc) @@ -1323,8 +1472,8 @@ t->bus_message = NULL; gst_element_set_state (t->webrtc1, GST_STATE_READY); - test_webrtc_wait_for_answer_error_eos (t); - fail_unless_equals_int (STATE_ERROR, t->state); + fail_unless_equals_int (STATE_ERROR, + test_webrtc_wait_for_answer_error_eos (t)); test_webrtc_free (t); if (nicesrc) @@ -1368,7 +1517,7 @@ static void validate_rtc_stream_stats (const GstStructure * s, const GstStructure * stats) { - gchar *codec_id, *transport_id; + gchar *codec_id, *transport_id, *kind; GstStructure *codec, *transport; fail_unless (gst_structure_get (s, "codec-id", G_TYPE_STRING, &codec_id, @@ -1387,15 +1536,19 @@ gst_structure_free (transport); gst_structure_free (codec); + fail_unless (gst_structure_get (s, "kind", G_TYPE_STRING, &kind, NULL)); + fail_unless (g_str_equal (kind, "audio") || g_str_equal (kind, "video")); + g_free (codec_id); g_free (transport_id); + g_free (kind); } static void validate_inbound_rtp_stats (const GstStructure * s, const GstStructure * stats) { guint ssrc, fir, pli, nack; - gint packets_lost; + gint64 packets_lost; guint64 packets_received, bytes_received; double jitter; gchar *remote_id; @@ -1412,8 +1565,8 @@ fail_unless (gst_structure_get (s, "bytes-received", G_TYPE_UINT64, &bytes_received, NULL)); fail_unless (gst_structure_get (s, "jitter", G_TYPE_DOUBLE, &jitter, NULL)); - fail_unless (gst_structure_get (s, "packets-lost", G_TYPE_INT, &packets_lost, - NULL)); + fail_unless (gst_structure_get (s, "packets-lost", G_TYPE_INT64, + &packets_lost, NULL)); fail_unless (gst_structure_get (s, "remote-id", G_TYPE_STRING, &remote_id, NULL)); fail_unless (gst_structure_get (stats, remote_id, GST_TYPE_STRUCTURE, &remote, @@ -1429,7 +1582,7 @@ const GstStructure * stats) { guint ssrc; - gint packets_lost; + gint64 packets_lost; double jitter, rtt; gchar *local_id; GstStructure *local; @@ -1438,8 +1591,8 @@ fail_unless (gst_structure_get (s, "ssrc", G_TYPE_UINT, &ssrc, NULL)); fail_unless (gst_structure_get (s, "jitter", G_TYPE_DOUBLE, &jitter, NULL)); - fail_unless (gst_structure_get (s, "packets-lost", G_TYPE_INT, &packets_lost, - NULL)); + fail_unless (gst_structure_get (s, "packets-lost", G_TYPE_INT64, + &packets_lost, NULL)); fail_unless (gst_structure_get (s, "round-trip-time", G_TYPE_DOUBLE, &rtt, NULL)); fail_unless (gst_structure_get (s, "local-id", G_TYPE_STRING, &local_id, @@ -1470,14 +1623,14 @@ &packets_sent, NULL)); fail_unless (gst_structure_get (s, "bytes-sent", G_TYPE_UINT64, &bytes_sent, NULL)); - fail_unless (gst_structure_get (s, "remote-id", G_TYPE_STRING, &remote_id, - NULL)); - fail_unless (gst_structure_get (stats, remote_id, GST_TYPE_STRUCTURE, &remote, - NULL)); - fail_unless (remote != NULL); + if (gst_structure_get (s, "remote-id", G_TYPE_STRING, &remote_id, NULL)) { + fail_unless (gst_structure_get (stats, remote_id, GST_TYPE_STRUCTURE, + &remote, NULL)); + fail_unless (remote != NULL); - gst_structure_free (remote); - g_free (remote_id); + gst_structure_free (remote); + g_free (remote_id); + } } static void @@ -1501,6 +1654,29 @@ g_free (local_id); } +static void +validate_candidate_stats (const GstStructure * s, const GstStructure * stats) +{ + guint port; + guint64 priority; + gchar *address, *candidateType, *protocol; + + fail_unless (gst_structure_get (s, "address", G_TYPE_STRING, &address, NULL)); + fail_unless (gst_structure_get (s, "port", G_TYPE_UINT, &port, NULL)); + fail_unless (gst_structure_get (s, "candidate-type", G_TYPE_STRING, + &candidateType, NULL)); + fail_unless (gst_structure_get (s, "priority", G_TYPE_UINT64, &priority, + NULL)); + fail_unless (gst_structure_get (s, "protocol", G_TYPE_STRING, &protocol, + NULL)); + + fail_unless (strcmp (protocol, "udp") || strcmp (protocol, "tcp")); + + g_free (address); + g_free (candidateType); + g_free (protocol); +} + static gboolean validate_stats_foreach (GQuark field_id, const GValue * value, const GstStructure * stats) @@ -1534,7 +1710,9 @@ } else if (type == GST_WEBRTC_STATS_TRANSPORT) { } else if (type == GST_WEBRTC_STATS_CANDIDATE_PAIR) { } else if (type == GST_WEBRTC_STATS_LOCAL_CANDIDATE) { + validate_candidate_stats (s, stats); } else if (type == GST_WEBRTC_STATS_REMOTE_CANDIDATE) { + validate_candidate_stats (s, stats); } else if (type == GST_WEBRTC_STATS_CERTIFICATE) { } else { g_assert_not_reached (); @@ -1588,6 +1766,53 @@ GST_END_TEST; +GST_START_TEST (test_stats_with_stream) +{ + struct test_webrtc *t = create_audio_test (); + GstPromise *p; + GstCaps *caps; + GstPad *pad; + + /* test that the stats generated with stream are sane */ + + t->on_offer_created = NULL; + t->on_answer_created = NULL; + t->on_negotiation_needed = NULL; + + fail_if (gst_element_set_state (t->webrtc1, + GST_STATE_READY) == GST_STATE_CHANGE_FAILURE); + fail_if (gst_element_set_state (t->webrtc2, + GST_STATE_READY) == GST_STATE_CHANGE_FAILURE); + + test_webrtc_create_offer (t); + + fail_if (gst_element_set_state (t->webrtc1, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); + fail_if (gst_element_set_state (t->webrtc2, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); + + /* set caps for webrtcbin sink to validate codec stats */ + caps = gst_caps_from_string (OPUS_RTP_CAPS (96)); + pad = gst_element_get_static_pad (t->webrtc1, "sink_0"); + gst_pad_set_caps (pad, caps); + gst_caps_unref (caps); + + test_webrtc_wait_for_answer_error_eos (t); + test_webrtc_signal_state (t, STATE_ANSWER_SET); + + p = gst_promise_new_with_change_func (_on_stats, t, NULL); + g_signal_emit_by_name (t->webrtc1, "get-stats", NULL, p); + p = gst_promise_new_with_change_func (_on_stats, t, NULL); + g_signal_emit_by_name (t->webrtc2, "get-stats", NULL, p); + + test_webrtc_wait_for_state_mask (t, 1 << STATE_CUSTOM); + + gst_object_unref (pad); + test_webrtc_free (t); +} + +GST_END_TEST; + GST_START_TEST (test_add_transceiver) { struct test_webrtc *t = test_webrtc_new (); @@ -1628,6 +1853,30 @@ GST_END_TEST; +static void +on_sdp_media_check_mid (struct test_webrtc *t, GstElement * element, + GstWebRTCSessionDescription * desc, gpointer user_data) +{ + const char **mid = user_data; + guint i; + + for (i = 0; i < gst_sdp_message_medias_len (desc->sdp); i++) { + const GstSDPMedia *media = gst_sdp_message_get_media (desc->sdp, i); + gboolean seen_mid = FALSE; + guint j; + + for (j = 0; j < gst_sdp_media_attributes_len (media); j++) { + const GstSDPAttribute *attr = gst_sdp_media_get_attribute (media, j); + + if (g_strcmp0 (attr->key, "mid") == 0) { + fail_unless (!seen_mid); + seen_mid = TRUE; + fail_unless_equals_string (attr->value, midi); + } + } + } +} + GST_START_TEST (test_add_recvonly_transceiver) { struct test_webrtc *t = test_webrtc_new (); @@ -1640,11 +1889,12 @@ media_format_count, &no_duplicate_payloads); VAL_SDP_INIT (count, _count_num_sdp_media, GUINT_TO_POINTER (1), &media_formats); + const char *expected_mid = { "gst", }; + VAL_SDP_INIT (mid, on_sdp_media_check_mid, expected_mid, &count); const gchar *expected_offer_setup = { "actpass", }; - VAL_SDP_INIT (offer_setup, on_sdp_media_setup, expected_offer_setup, &count); + VAL_SDP_INIT (offer_setup, on_sdp_media_setup, expected_offer_setup, &mid); const gchar *expected_answer_setup = { "active", }; - VAL_SDP_INIT (answer_setup, on_sdp_media_setup, expected_answer_setup, - &count); + VAL_SDP_INIT (answer_setup, on_sdp_media_setup, expected_answer_setup, &mid); const gchar *expected_offer_direction = { "recvonly", }; VAL_SDP_INIT (offer, on_sdp_media_direction, expected_offer_direction, &offer_setup); @@ -1661,7 +1911,7 @@ t->on_pad_added = _pad_added_fakesink; /* setup recvonly transceiver */ - caps = gst_caps_from_string (OPUS_RTP_CAPS (96)); + caps = gst_caps_from_string (OPUS_RTP_CAPS (96) ", a-mid=(string)gst"); direction = GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY; g_signal_emit_by_name (t->webrtc1, "add-transceiver", direction, caps, &trans); @@ -1671,7 +1921,7 @@ /* setup sendonly peer */ h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); test_validate_sdp (t, &offer, &answer); @@ -1715,6 +1965,7 @@ /* setup recvonly transceiver */ caps = gst_caps_from_string (OPUS_RTP_CAPS (96)); + gst_caps_set_simple (caps, "ssrc", G_TYPE_UINT, 0xDEADBEEF, NULL); direction = GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY; g_signal_emit_by_name (t->webrtc1, "add-transceiver", direction, caps, &trans); @@ -1724,7 +1975,7 @@ /* setup sendonly stream */ h = gst_harness_new_with_element (t->webrtc1, "sink_1", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xBEEFDEAD); t->harnesses = g_list_prepend (t->harnesses, h); g_signal_emit_by_name (t->webrtc1, "get-transceivers", &transceivers); fail_unless (transceivers != NULL); @@ -1737,7 +1988,7 @@ /* setup sendonly peer */ h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); test_validate_sdp (t, &offer, &answer); @@ -1765,13 +2016,6 @@ fail_unless_equals_int (TRUE, have_data_channel); } -static void -on_channel_error_not_reached (GObject * channel, GError * error, - gpointer user_data) -{ - g_assert_not_reached (); -} - GST_START_TEST (test_data_channel_create) { struct test_webrtc *t = test_webrtc_new (); @@ -1782,6 +2026,7 @@ t->on_negotiation_needed = NULL; t->on_ice_candidate = NULL; + t->on_prepare_data_channel = have_prepare_data_channel; fail_if (gst_element_set_state (t->webrtc1, GST_STATE_READY) == GST_STATE_CHANGE_FAILURE); @@ -1793,8 +2038,6 @@ g_assert_nonnull (channel); g_object_get (channel, "label", &label, NULL); g_assert_cmpstr (label, ==, "label"); - g_signal_connect (channel, "on-error", - G_CALLBACK (on_channel_error_not_reached), NULL); test_validate_sdp (t, &offer, &offer); @@ -1812,8 +2055,7 @@ GObject *other = user_data; gchar *our_label, *other_label; - g_signal_connect (our, "on-error", G_CALLBACK (on_channel_error_not_reached), - NULL); + g_assert_true (t->error_signal_handler_id > 0); g_object_get (our, "label", &our_label, NULL); g_object_get (other, "label", &other_label, NULL); @@ -1835,6 +2077,7 @@ t->on_negotiation_needed = NULL; t->on_ice_candidate = NULL; + t->on_prepare_data_channel = have_prepare_data_channel; t->on_data_channel = have_data_channel; fail_if (gst_element_set_state (t->webrtc1, @@ -1846,8 +2089,6 @@ &channel); g_assert_nonnull (channel); t->data_channel_data = channel; - g_signal_connect (channel, "on-error", - G_CALLBACK (on_channel_error_not_reached), NULL); fail_if (gst_element_set_state (t->webrtc1, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); @@ -1886,17 +2127,16 @@ { GObject *other = user_data; GstWebRTCDataChannelState state; + GError *error = NULL; g_object_get (our, "ready-state", &state, NULL); fail_unless_equals_int (GST_WEBRTC_DATA_CHANNEL_STATE_OPEN, state); g_object_set_data_full (our, "expected", g_strdup (test_string), g_free); - g_signal_connect (our, "on-message-string", G_CALLBACK (on_message_string), - t); - g_signal_connect (other, "on-error", - G_CALLBACK (on_channel_error_not_reached), NULL); - g_signal_emit_by_name (other, "send-string", test_string); + fail_unless (gst_webrtc_data_channel_send_string_full (GST_WEBRTC_DATA_CHANNEL + (other), test_string, &error)); + g_assert_null (error); } GST_START_TEST (test_data_channel_transfer_string) @@ -1908,6 +2148,7 @@ t->on_negotiation_needed = NULL; t->on_ice_candidate = NULL; + t->on_prepare_data_channel = have_prepare_data_channel; t->on_data_channel = have_data_channel_transfer_string; fail_if (gst_element_set_state (t->webrtc1, @@ -1966,17 +2207,17 @@ GObject *other = user_data; GBytes *data = g_bytes_new_static (test_string, strlen (test_string)); GstWebRTCDataChannelState state; + GError *error = NULL; g_object_get (our, "ready-state", &state, NULL); fail_unless_equals_int (GST_WEBRTC_DATA_CHANNEL_STATE_OPEN, state); g_object_set_data_full (our, "expected", g_bytes_ref (data), (GDestroyNotify) g_bytes_unref); - g_signal_connect (our, "on-message-data", G_CALLBACK (on_message_data), t); - g_signal_connect (other, "on-error", - G_CALLBACK (on_channel_error_not_reached), NULL); - g_signal_emit_by_name (other, "send-data", data); + fail_unless (gst_webrtc_data_channel_send_data_full (GST_WEBRTC_DATA_CHANNEL + (other), data, &error)); + g_assert_null (error); g_bytes_unref (data); } @@ -1989,6 +2230,7 @@ t->on_negotiation_needed = NULL; t->on_ice_candidate = NULL; + t->on_prepare_data_channel = have_prepare_data_channel; t->on_data_channel = have_data_channel_transfer_data; fail_if (gst_element_set_state (t->webrtc1, @@ -2022,6 +2264,7 @@ { GObject *another; + t->on_prepare_data_channel = have_prepare_data_channel; t->on_data_channel = have_data_channel_transfer_string; g_signal_emit_by_name (t->webrtc1, "create-data-channel", "label", NULL, @@ -2029,8 +2272,6 @@ g_assert_nonnull (another); t->data_channel_data = another; t->data_channel_notify = (GDestroyNotify) g_object_unref; - g_signal_connect (another, "on-error", - G_CALLBACK (on_channel_error_not_reached), NULL); } GST_START_TEST (test_data_channel_create_after_negotiate) @@ -2042,6 +2283,7 @@ t->on_negotiation_needed = NULL; t->on_ice_candidate = NULL; + t->on_prepare_data_channel = have_prepare_data_channel; t->on_data_channel = have_data_channel_create_data_channel; fail_if (gst_element_set_state (t->webrtc1, @@ -2053,8 +2295,6 @@ &channel); g_assert_nonnull (channel); t->data_channel_data = channel; - g_signal_connect (channel, "on-error", - G_CALLBACK (on_channel_error_not_reached), NULL); fail_if (gst_element_set_state (t->webrtc1, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); @@ -2075,7 +2315,6 @@ GObject *dc2; gint n_open; gint n_closed; - gint n_destroyed; }; static void @@ -2084,7 +2323,7 @@ { struct test_data_channel *tdc = t->data_channel_data; - tdc->dc2 = our; + tdc->dc2 = g_object_ref (our); if (g_atomic_int_add (&tdc->n_open, 1) == 1) { test_webrtc_signal_state_unlocked (t, STATE_CUSTOM); } @@ -2129,28 +2368,11 @@ } } -static void -on_data_channel_destroyed (gpointer data, GObject * where_the_object_was) -{ - struct test_webrtc *t = data; - struct test_data_channel *tdc = t->data_channel_data; - - if (where_the_object_was == tdc->dc1) { - tdc->dc1 = NULL; - } else if (where_the_object_was == tdc->dc2) { - tdc->dc2 = NULL; - } - - if (g_atomic_int_add (&tdc->n_destroyed, 1) == 1) { - test_webrtc_signal_state (t, STATE_CUSTOM); - } -} - GST_START_TEST (test_data_channel_close) { #define NUM_CHANNELS 3 struct test_webrtc *t = test_webrtc_new (); - struct test_data_channel tdc = { NULL, NULL, 0, 0, 0 }; + struct test_data_channel tdc = { NULL, }; guint channel_idNUM_CHANNELS = { 0, 1, 2 }; gulong sigid = 0; int i; @@ -2159,6 +2381,7 @@ t->on_negotiation_needed = NULL; t->on_ice_candidate = NULL; + t->on_prepare_data_channel = have_prepare_data_channel; t->on_data_channel = have_data_channel_mark_open; t->data_channel_data = &tdc; @@ -2171,17 +2394,14 @@ * stream id of a previously closed data channel and that we have the same * behaviour no matter if we create the channel in READY or PLAYING state */ for (i = 0; i < NUM_CHANNELS; i++) { + GWeakRef dc1_ref, dc2_ref; tdc.n_open = 0; tdc.n_closed = 0; - tdc.n_destroyed = 0; g_signal_emit_by_name (t->webrtc1, "create-data-channel", "label", NULL, &tdc.dc1); g_assert_nonnull (tdc.dc1); - g_object_unref (tdc.dc1); /* webrtcbin should still hold a ref */ - g_object_weak_ref (tdc.dc1, on_data_channel_destroyed, t); - g_signal_connect (tdc.dc1, "on-error", - G_CALLBACK (on_channel_error_not_reached), NULL); + g_weak_ref_init (&dc1_ref, tdc.dc1); sigid = g_signal_connect (tdc.dc1, "notify::ready-state", G_CALLBACK (on_data_channel_open), t); @@ -2192,28 +2412,20 @@ GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); test_validate_sdp_full (t, &offer, &offer, 1 << STATE_CUSTOM, FALSE); - } else { - /* FIXME: Creating a data channel may result in "on-open" being sent - * before we even had a chance to register the signal. For this test we - * want to make sure that the channel is actually open before we try to - * close it. So if we didn't receive the signal we fall back to a 1s - * timeout where we explicitly check if both channels are open. */ - gint64 timeout = g_get_monotonic_time () + 1 * G_TIME_SPAN_SECOND; - g_mutex_lock (&t->lock); - while (((1 << t->state) & STATE_CUSTOM) == 0) { - if (!g_cond_wait_until (&t->cond, &t->lock, timeout)) { - g_assert (is_data_channel_open (tdc.dc1) - && is_data_channel_open (tdc.dc2)); - break; - } - } - g_mutex_unlock (&t->lock); } + /* FIXME: Creating a data channel may result in "on-open" being sent + * before we even had a chance to register the signal. For this test we + * want to make sure that the channel is actually open before we try to + * close it. So if we didn't receive the signal we fall back to a 1s + * timeout where we explicitly check if both channels are open. */ + while (!is_data_channel_open (tdc.dc1) + || !is_data_channel_open (tdc.dc2)) + g_usleep (100 * 1000); g_object_get (tdc.dc1, "id", &channel_idi, NULL); g_signal_handler_disconnect (tdc.dc1, sigid); - g_object_weak_ref (tdc.dc2, on_data_channel_destroyed, t); + g_weak_ref_init (&dc2_ref, tdc.dc2); g_signal_connect (tdc.dc1, "notify::ready-state", G_CALLBACK (on_data_channel_close), t); g_signal_connect (tdc.dc2, "notify::ready-state", @@ -2227,13 +2439,23 @@ t->on_negotiation_needed = _negotiation_not_reached; g_signal_emit_by_name (tdc.dc1, "close"); - test_webrtc_wait_for_state_mask (t, 1 << STATE_CUSTOM); + /* XXX: try to do something better here */ + while (g_atomic_int_get (&tdc.n_closed) != 2) + g_usleep (100 * 1000); + + g_clear_object (&tdc.dc1); + g_clear_object (&tdc.dc2); + + /* XXX: try to do something better here */ + while (g_weak_ref_get (&dc1_ref) != NULL + || g_weak_ref_get (&dc2_ref) != NULL) + g_usleep (100 * 1000); - assert_equals_int (g_atomic_int_get (&tdc.n_closed), 2); - assert_equals_pointer (tdc.dc1, NULL); - assert_equals_pointer (tdc.dc2, NULL); + g_weak_ref_clear (&dc1_ref); + g_weak_ref_clear (&dc2_ref); test_webrtc_signal_state (t, STATE_NEW); + test_webrtc_wait_for_state_mask (t, 1 << STATE_NEW); } /* verify the same stream id has been reused for each data channel */ @@ -2262,7 +2484,8 @@ g_signal_connect (our, "on-error", G_CALLBACK (on_channel_error_not_reached), NULL); - g_signal_emit_by_name (our, "send-string", "A"); + gst_webrtc_data_channel_send_string_full (GST_WEBRTC_DATA_CHANNEL (our), "A", + NULL); } GST_START_TEST (test_data_channel_low_threshold) @@ -2274,6 +2497,7 @@ t->on_negotiation_needed = NULL; t->on_ice_candidate = NULL; + t->on_prepare_data_channel = NULL; t->on_data_channel = have_data_channel_check_low_threshold_emitted; fail_if (gst_element_set_state (t->webrtc1, @@ -2285,8 +2509,6 @@ &channel); g_assert_nonnull (channel); t->data_channel_data = channel; - g_signal_connect (channel, "on-error", - G_CALLBACK (on_channel_error_not_reached), NULL); fail_if (gst_element_set_state (t->webrtc1, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); @@ -2302,14 +2524,6 @@ GST_END_TEST; static void -on_channel_error (GObject * channel, GError * error, struct test_webrtc *t) -{ - g_assert_nonnull (error); - - test_webrtc_signal_state (t, STATE_CUSTOM); -} - -static void have_data_channel_transfer_large_data (struct test_webrtc *t, GstElement * element, GObject * our, gpointer user_data) { @@ -2318,6 +2532,7 @@ guint8 *random_data = g_new (guint8, size); GBytes *data; gsize i; + GError *error = NULL; for (i = 0; i < size; i++) random_datai = (guint8) (i & 0xff); @@ -2329,9 +2544,15 @@ (GDestroyNotify) g_bytes_unref); g_signal_connect (our, "on-message-data", G_CALLBACK (on_message_data), t); - g_signal_connect (other, "on-error", G_CALLBACK (on_channel_error), t); - g_signal_emit_by_name (other, "send-data", data); + g_signal_connect (other, "on-error", + G_CALLBACK (on_channel_error_not_reached), NULL); + fail_if (gst_webrtc_data_channel_send_data_full (GST_WEBRTC_DATA_CHANNEL + (other), data, &error)); + g_assert_nonnull (error); + g_clear_error (&error); g_bytes_unref (data); + + test_webrtc_signal_state_unlocked (t, STATE_CUSTOM); } GST_START_TEST (test_data_channel_max_message_size) @@ -2343,6 +2564,7 @@ t->on_negotiation_needed = NULL; t->on_ice_candidate = NULL; + t->on_prepare_data_channel = NULL; t->on_data_channel = have_data_channel_transfer_large_data; fail_if (gst_element_set_state (t->webrtc1, @@ -2395,6 +2617,7 @@ t->on_negotiation_needed = NULL; t->on_ice_candidate = NULL; + t->on_prepare_data_channel = have_prepare_data_channel; fail_if (gst_element_set_state (t->webrtc1, GST_STATE_READY) == GST_STATE_CHANGE_FAILURE); @@ -2764,7 +2987,7 @@ t->negotiation_data = &negotiation_flag; h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); test_validate_sdp (t, &offer, &answer); @@ -2807,11 +3030,11 @@ /* test that each mline gets a unique transceiver even with the same caps */ h = gst_harness_new_with_element (t->webrtc1, "sink_1", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xBEEFDEAD); t->harnesses = g_list_prepend (t->harnesses, h); h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); t->on_negotiation_needed = NULL; @@ -2993,13 +3216,13 @@ /* negotiate an AV stream and then renegotiate an extra stream */ h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); test_validate_sdp (t, &offer, &answer); h = gst_harness_new_with_element (t->webrtc1, "sink_2", NULL); - add_fake_audio_src_harness (h, 98); + add_fake_audio_src_harness (h, 98, 0xBEEFFFFF); t->harnesses = g_list_prepend (t->harnesses, h); media_formats.next = &renego_fingerprint; @@ -3049,7 +3272,7 @@ /* negotiate an AV stream and then renegotiate a data channel */ h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); test_validate_sdp (t, &offer, &answer); @@ -3107,6 +3330,7 @@ t->on_ice_candidate = NULL; t->on_data_channel = NULL; t->on_pad_added = _pad_added_fakesink; + t->on_prepare_data_channel = NULL; fail_if (gst_element_set_state (t->webrtc1, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); @@ -3119,7 +3343,7 @@ test_validate_sdp_full (t, &offer, &answer, 0, FALSE); h = gst_harness_new_with_element (t->webrtc1, "sink_1", NULL); - add_fake_audio_src_harness (h, 97); + add_fake_audio_src_harness (h, 97, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); media_formats.next = &renego_fingerprint; @@ -3172,10 +3396,11 @@ t->on_negotiation_needed = NULL; t->on_ice_candidate = NULL; t->on_data_channel = NULL; + t->on_prepare_data_channel = NULL; t->on_pad_added = _pad_added_fakesink; h = gst_harness_new_with_element (t->webrtc1, "sink_0", NULL); - add_fake_audio_src_harness (h, 97); + add_fake_audio_src_harness (h, 97, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); fail_if (gst_element_set_state (t->webrtc1, @@ -3189,7 +3414,7 @@ test_validate_sdp_full (t, &offer, &answer, 0, FALSE); h = gst_harness_new_with_element (t->webrtc1, "sink_2", NULL); - add_fake_audio_src_harness (h, 97); + add_fake_audio_src_harness (h, 97, 0xBEEFDEAD); t->harnesses = g_list_prepend (t->harnesses, h); media_formats.next = &renego_fingerprint; @@ -3268,13 +3493,13 @@ /* negotiate an AV stream and then renegotiate an extra stream */ h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); test_validate_sdp (t, &offer, &answer); h = gst_harness_new_with_element (t->webrtc1, "sink_2", NULL); - add_fake_audio_src_harness (h, 98); + add_fake_audio_src_harness (h, 98, 0xBEEFFFFF); t->harnesses = g_list_prepend (t->harnesses, h); offer_setup.next = &offer_bundle_only_sdp; @@ -3348,13 +3573,13 @@ /* negotiate an AV stream and then renegotiate an extra stream */ h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); test_validate_sdp (t, &offer, &answer); h = gst_harness_new_with_element (t->webrtc1, "sink_2", NULL); - add_fake_audio_src_harness (h, 98); + add_fake_audio_src_harness (h, 98, 0xBEEFFFFF); t->harnesses = g_list_prepend (t->harnesses, h); media_formats.next = &bundle_sdp; @@ -3396,7 +3621,7 @@ /* negotiate an AV stream and then change the transceiver direction */ h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); test_validate_sdp (t, &offer, &answer); @@ -3577,7 +3802,7 @@ /* setup sendonly peer */ h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); - add_fake_video_src_harness (h, 96); + add_fake_video_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); test_validate_sdp (t, &offer, &answer); @@ -3670,7 +3895,7 @@ t->on_ice_candidate = NULL; t->on_offer_created = offer_created_produced_error; - test_validate_sdp_full (t, NULL, NULL, STATE_OFFER_CREATED, TRUE); + test_validate_sdp_full (t, NULL, NULL, 1 << STATE_ERROR, TRUE); test_webrtc_free (t); } @@ -3703,7 +3928,7 @@ t->on_ice_candidate = NULL; t->on_offer_created = offer_created_produced_error; - test_validate_sdp_full (t, NULL, NULL, STATE_OFFER_CREATED, TRUE); + test_validate_sdp_full (t, NULL, NULL, 1 << STATE_ERROR, TRUE); test_webrtc_free (t); } @@ -3757,7 +3982,7 @@ fail_unless (trans != NULL); h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); - add_fake_video_src_harness (h, 96); + add_fake_video_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); test_validate_sdp (t, &offer, &answer); @@ -3851,7 +4076,7 @@ /* setup sendonly peer */ h = gst_harness_new_with_element (t->webrtc1, "sink_1", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); /* Check that if there is no 0, we can't create an offer with a hole */ @@ -3864,14 +4089,13 @@ gst_structure_get (s, "error", G_TYPE_ERROR, &error, NULL); fail_unless (g_error_matches (error, GST_WEBRTC_ERROR, GST_WEBRTC_ERROR_INTERNAL_FAILURE)); - fail_unless (g_str_match_string - ("has locked mline 1 but the whole offer only has 0 sections", - error->message, FALSE)); + fail_unless_equals_string (error->message, + "Tranceiver <webrtctransceiver0> with mid (null) has locked mline 1 but the offer only has 0 sections"); g_clear_error (&error); gst_promise_unref (promise); h = gst_harness_new_with_element (t->webrtc1, "sink_%u", NULL); - add_fake_video_src_harness (h, 97); + add_fake_video_src_harness (h, 97, 0xBEEFDEAD); t->harnesses = g_list_prepend (t->harnesses, h); /* Adding a second sink, which will fill m-line 0, should fix it */ @@ -3882,6 +4106,36 @@ GST_END_TEST; +GST_START_TEST (test_reject_create_offer_mline_locked_no_caps) +{ + GstHarness *h; + GstPromise *promise; + const GstStructure *s; + GstPromiseResult res; + GError *error = NULL; + + h = gst_harness_new_with_padnames ("webrtcbin", "sink_0", NULL); + + promise = gst_promise_new (); + g_signal_emit_by_name (h->element, "create-offer", NULL, promise); + res = gst_promise_wait (promise); + fail_unless_equals_int (res, GST_PROMISE_RESULT_REPLIED); + s = gst_promise_get_reply (promise); + fail_unless (s != NULL); + gst_structure_get (s, "error", G_TYPE_ERROR, &error, NULL); + fail_unless (g_error_matches (error, GST_WEBRTC_ERROR, + GST_WEBRTC_ERROR_INTERNAL_FAILURE)); + fail_unless_equals_string (error->message, + "Trying to add transceiver at line 0 but there is a transceiver with a" + " locked mline for this line which doesn't have caps"); + g_clear_error (&error); + gst_promise_unref (promise); + + gst_harness_teardown (h); +} + +GST_END_TEST; + GST_START_TEST (test_reject_set_description) { struct test_webrtc *t = test_webrtc_new (); @@ -3901,7 +4155,7 @@ /* setup peer 1 */ h = gst_harness_new_with_element (t->webrtc1, "sink_0", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); /* Create a second side with specific video caps */ @@ -3938,9 +4192,9 @@ gst_structure_get (s, "error", G_TYPE_ERROR, &error, NULL); fail_unless (g_error_matches (error, GST_WEBRTC_ERROR, GST_WEBRTC_ERROR_INTERNAL_FAILURE)); - fail_unless (g_str_match_string - ("m-line 0 was locked to audio, but SDP has audio media", error->message, - FALSE)); + fail_unless_equals_string + (error->message, + "m-line 0 with transceiver <webrtctransceiver1> was locked to video, but SDP has audio media"); g_clear_error (&error); fail_unless (s != NULL); @@ -4015,7 +4269,7 @@ /* setup peer */ h = gst_harness_new_with_element (t->webrtc1, "sink_0", NULL); - add_fake_audio_src_harness (h, 96); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); /* Create a second side with specific video caps */ @@ -4027,7 +4281,7 @@ fail_unless (pad != NULL); h = gst_harness_new_with_element (t->webrtc2, GST_PAD_NAME (pad), NULL); gst_object_unref (pad); - add_fake_video_src_harness (h, 97); + add_fake_video_src_harness (h, 97, 0xBEEFDEAD); t->harnesses = g_list_prepend (t->harnesses, h); test_validate_sdp (t, &offer_count, &answer_count); @@ -4126,7 +4380,7 @@ gst_object_unref (transceiver); gst_object_unref (pad); - add_fake_video_src_harness (h, 96); + add_fake_video_src_harness (h, 96, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); promise = gst_promise_new (); @@ -4138,9 +4392,9 @@ gst_structure_get (s, "error", G_TYPE_ERROR, &error, NULL); fail_unless (g_error_matches (error, GST_WEBRTC_ERROR, GST_WEBRTC_ERROR_INTERNAL_FAILURE)); - fail_unless (g_str_match_string + fail_unless_equals_string ("Caps negotiation on pad sink_0 failed against codec preferences", - error->message, FALSE)); + error->message); g_clear_error (&error); gst_promise_unref (promise); @@ -4156,22 +4410,39 @@ static void -add_audio_test_src_harness (GstHarness * h) +add_audio_test_src_harness (GstHarness * h, guint ssrc) { #define L16_CAPS "application/x-rtp, payload=11, media=audio," \ " encoding-name=L16, clock-rate=44100, ssrc=(uint)3484078952" GstCaps *caps = gst_caps_from_string (L16_CAPS); - gst_harness_set_src_caps (h, caps); + GstElement *capsfilter; + if (ssrc != 0) { + gst_caps_set_simple (caps, "ssrc", G_TYPE_UINT, ssrc, NULL); + } gst_harness_add_src_parse (h, "audiotestsrc is-live=true ! rtpL16pay ! " - L16_CAPS " ! identity", TRUE); + "capsfilter name=capsfilter ! identity", TRUE); + capsfilter = + gst_bin_get_by_name (GST_BIN (h->src_harness->element), "capsfilter"); + g_object_set (G_OBJECT (capsfilter), "caps", caps, NULL); + gst_harness_set_src_caps (h, caps); + caps = NULL; + gst_clear_object (&capsfilter); +#undef L16_CAPS } +struct pad_added_harness_data +{ + GList *sink_harnesses; + OnPadAdded on_pad_added; + gpointer on_pad_added_data; +}; + static void _pad_added_harness (struct test_webrtc *t, GstElement * element, GstPad * pad, gpointer user_data) { + struct pad_added_harness_data *data = user_data; GstHarness *h; - GstHarness **sink_harness = user_data; if (GST_PAD_DIRECTION (pad) != GST_PAD_SRC) return; @@ -4179,9 +4450,12 @@ h = gst_harness_new_with_element (element, NULL, GST_OBJECT_NAME (pad)); t->harnesses = g_list_prepend (t->harnesses, h); - if (sink_harness) { - *sink_harness = h; + if (data) { + data->sink_harnesses = g_list_prepend (data->sink_harnesses, h); g_cond_broadcast (&t->cond); + + if (data->on_pad_added) + data->on_pad_added (t, element, pad, data->on_pad_added_data); } } @@ -4217,6 +4491,7 @@ VAL_SDP_INIT (answer_non_reject, _count_non_rejected_media, GUINT_TO_POINTER (0), &count); GstHarness *h; + struct pad_added_harness_data pad_added_data = { NULL, }; GstHarness *sink_harness = NULL; guint i; GstElement *rtpbin2; @@ -4225,7 +4500,7 @@ t->on_negotiation_needed = NULL; t->on_ice_candidate = NULL; t->on_pad_added = _pad_added_harness; - t->pad_added_data = &sink_harness; + t->pad_added_data = &pad_added_data; rtpbin2 = gst_bin_get_by_name (GST_BIN (t->webrtc2), "rtpbin"); fail_unless (rtpbin2 != NULL); @@ -4234,7 +4509,7 @@ g_object_unref (rtpbin2); h = gst_harness_new_with_element (t->webrtc1, "sink_0", NULL); - add_audio_test_src_harness (h); + add_audio_test_src_harness (h, 0xDEADBEEF); t->harnesses = g_list_prepend (t->harnesses, h); test_validate_sdp (t, &offer, &answer); @@ -4248,10 +4523,12 @@ gst_harness_push_from_src (h); g_mutex_lock (&t->lock); - while (sink_harness == NULL) { + while (pad_added_data.sink_harnesses == NULL) { gst_harness_push_from_src (h); g_cond_wait_until (&t->cond, &t->lock, g_get_monotonic_time () + 5000); } + fail_unless_equals_int (1, g_list_length (pad_added_data.sink_harnesses)); + sink_harness = (GstHarness *) pad_added_data.sink_harnesses->data; g_mutex_unlock (&t->lock); fail_unless (sink_harness->element == t->webrtc2); @@ -4267,7 +4544,25 @@ test_webrtc_reset_negotiation (t); test_validate_sdp_full (t, &offer, &answer_non_reject, 0, FALSE); + /* check that the mid/mline is correct */ + { + GstWebRTCRTPTransceiver *rtp_trans; + GstPad *srcpad; + guint mline; + + srcpad = gst_pad_get_peer (sink_harness->sinkpad); + fail_unless (srcpad != NULL); + g_object_get (srcpad, "transceiver", &rtp_trans, NULL); + gst_clear_object (&srcpad); + fail_unless (rtp_trans != NULL); + g_object_get (rtp_trans, "mlineindex", &mline, NULL); + gst_clear_object (&rtp_trans); + fail_unless_equals_int (mline, 0); + } + test_webrtc_free (t); + + g_list_free (pad_added_data.sink_harnesses); } GST_END_TEST; @@ -4355,7 +4650,7 @@ /* setup recvonly peer */ h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); - add_fake_video_src_harness (h, 101); + add_fake_video_src_harness (h, 101, 0); t->harnesses = g_list_prepend (t->harnesses, h); /* connect to "on-new-transceiver" to set codec-preferences to H264 */ @@ -4371,6 +4666,767 @@ GST_END_TEST; +GST_START_TEST (test_renego_rtx) +{ + struct test_webrtc *t = create_audio_video_test (); + VAL_SDP_INIT (no_duplicate_payloads, on_sdp_media_no_duplicate_payloads, + NULL, NULL); + guint media_format_count = { 1, 1 }; + VAL_SDP_INIT (media_formats, on_sdp_media_count_formats, + media_format_count, &no_duplicate_payloads); + VAL_SDP_INIT (count_media, _count_num_sdp_media, GUINT_TO_POINTER (2), + &media_formats); + VAL_SDP_INIT (payloads, on_sdp_media_payload_types, + GUINT_TO_POINTER (1), &count_media); + const gchar *expected_offer_direction = { "sendrecv", "sendrecv", }; + VAL_SDP_INIT (offer_direction, on_sdp_media_direction, + expected_offer_direction, &payloads); + const gchar *expected_answer_direction = { "recvonly", "recvonly", }; + VAL_SDP_INIT (answer_direction, on_sdp_media_direction, + expected_answer_direction, &payloads); + const gchar *expected_offer_setup = { "actpass", "actpass", }; + VAL_SDP_INIT (offer, on_sdp_media_setup, expected_offer_setup, + &offer_direction); + const gchar *expected_answer_setup = { "active", "active", }; + VAL_SDP_INIT (answer, on_sdp_media_setup, expected_answer_setup, + &answer_direction); + GstWebRTCRTPTransceiver *trans; + + t->on_negotiation_needed = NULL; + t->on_ice_candidate = NULL; + t->on_pad_added = _pad_added_fakesink; + + test_validate_sdp (t, &offer, &answer); + + test_webrtc_reset_negotiation (t); + + g_signal_emit_by_name (t->webrtc1, "get-transceiver", 1, &trans); + g_object_set (trans, "do-nack", TRUE, "fec-type", + GST_WEBRTC_FEC_TYPE_ULP_RED, NULL); + g_clear_object (&trans); + + g_signal_emit_by_name (t->webrtc2, "get-transceiver", 1, &trans); + g_object_set (trans, "do-nack", TRUE, "fec-type", + GST_WEBRTC_FEC_TYPE_ULP_RED, NULL); + g_clear_object (&trans); + + /* adding RTX/RED/FEC increases the number of media formats */ + media_format_count1 = 5; + + test_validate_sdp (t, &offer, &answer); + + test_webrtc_free (t); +} + +GST_END_TEST; + +GST_START_TEST (test_bundle_mid_header_extension) +{ + struct test_webrtc *t = test_webrtc_new (); + GstWebRTCRTPTransceiverDirection direction; + GstWebRTCRTPTransceiver *trans; + VAL_SDP_INIT (no_duplicate_payloads, on_sdp_media_no_duplicate_payloads, + NULL, NULL); + guint media_format_count = { 1, 1, }; + VAL_SDP_INIT (media_formats, on_sdp_media_count_formats, + media_format_count, &no_duplicate_payloads); + VAL_SDP_INIT (count, _count_num_sdp_media, GUINT_TO_POINTER (1), + &media_formats); + const char *expected_mid = { "gst", }; + VAL_SDP_INIT (mid, on_sdp_media_check_mid, expected_mid, &count); + const gchar *expected_offer_setup = { "actpass", }; + VAL_SDP_INIT (offer_setup, on_sdp_media_setup, expected_offer_setup, &mid); + const gchar *expected_answer_setup = { "active", }; + VAL_SDP_INIT (answer_setup, on_sdp_media_setup, expected_answer_setup, &mid); + const gchar *expected_offer_direction = { "recvonly", }; + VAL_SDP_INIT (offer, on_sdp_media_direction, expected_offer_direction, + &offer_setup); + const gchar *expected_answer_direction = { "sendonly", }; + VAL_SDP_INIT (answer, on_sdp_media_direction, expected_answer_direction, + &answer_setup); + GstCaps *caps; + GstHarness *h; + guint mline; + char *trans_mid; + + /* add a transceiver that will only receive an opus stream and check that + * the created offer is marked as recvonly */ + t->on_negotiation_needed = NULL; + t->on_ice_candidate = NULL; + t->on_pad_added = _pad_added_fakesink; + + /* setup recvonly transceiver */ + caps = gst_caps_from_string (OPUS_RTP_CAPS (96) ", a-mid=(string)gst"); + direction = GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY; + g_signal_emit_by_name (t->webrtc1, "add-transceiver", direction, caps, + &trans); + gst_caps_unref (caps); + fail_unless (trans != NULL); + g_object_get (trans, "mlineindex", &mline, NULL); + fail_unless_equals_int (mline, -1); + + /* setup sendonly peer */ + h = gst_harness_new_with_element (t->webrtc2, "sink_0", NULL); + add_fake_audio_src_harness (h, 96, 0xDEADBEEF); + t->harnesses = g_list_prepend (t->harnesses, h); + + test_validate_sdp (t, &offer, &answer); + + g_object_get (trans, "mlineindex", &mline, "mid", &trans_mid, NULL); + fail_unless_equals_int (mline, 0); + fail_unless_equals_string (trans_mid, "gst"); + g_clear_pointer (&trans_mid, g_free); + gst_object_unref (trans); + + test_webrtc_free (t); +} + +GST_END_TEST; + +static void +on_new_transceiver_set_rtx_fec (GstElement * webrtcbin, GObject * trans, + gpointer user_data) +{ + g_object_set (trans, "fec-type", GST_WEBRTC_FEC_TYPE_ULP_RED, + "fec-percentage", 100, "do-nack", TRUE, NULL); +} + +struct pad_properties +{ + const char *mid; + guint mlineindex; +}; + +struct new_pad_validate_properties +{ + guint n_props; + struct pad_properties *props; +}; + +static void +on_pad_added_validate_props (struct test_webrtc *t, GstElement * element, + GstPad * pad, gpointer user_data) +{ + GstWebRTCRTPTransceiver *rtp_trans; + struct new_pad_validate_properties *pad_props = user_data; + char *trans_mid; + guint mlineindex; + int i; + + g_object_get (pad, "transceiver", &rtp_trans, NULL); + fail_unless (rtp_trans); + g_object_get (rtp_trans, "mid", &trans_mid, "mlineindex", &mlineindex, NULL); + fail_unless (trans_mid != NULL); + fail_unless (mlineindex != -1); + for (i = 0; i < pad_props->n_props; i++) { + struct pad_properties *expected = &pad_props->propsi; + + if (g_strcmp0 (expected->mid, trans_mid) == 0) { + if (expected->mlineindex != -1) { + fail_unless_equals_int (mlineindex, expected->mlineindex); + break; + } + } + } + if (i == pad_props->n_props) + fail ("could not find a matching expected output pad for mid %s and mline %u", trans_mid, mlineindex); + + g_clear_pointer (&trans_mid, g_free); + gst_clear_object (&rtp_trans); +} + +GST_START_TEST (test_max_bundle_fec) +{ + struct test_webrtc *t = test_webrtc_new (); + guint media_format_count = { 5, 5, }; + VAL_SDP_INIT (media_formats, on_sdp_media_count_formats, + media_format_count, NULL); + VAL_SDP_INIT (payloads, on_sdp_media_no_duplicate_payloads, NULL, + &media_formats); + VAL_SDP_INIT (count, _count_num_sdp_media, GUINT_TO_POINTER (2), &payloads); + VAL_SDP_INIT (offer_non_reject, _count_non_rejected_media, + GUINT_TO_POINTER (1), &count); + VAL_SDP_INIT (answer_non_reject, _count_non_rejected_media, + GUINT_TO_POINTER (2), &count); + const gchar *expected_offer_setup = { "actpass", "actpass", }; + VAL_SDP_INIT (offer_setup, on_sdp_media_setup, expected_offer_setup, + &offer_non_reject); + const gchar *expected_answer_setup = { "active", "active", }; + VAL_SDP_INIT (answer_setup, on_sdp_media_setup, expected_answer_setup, + &answer_non_reject); + const gchar *expected_offer_direction = { "sendrecv", "sendrecv", }; + VAL_SDP_INIT (offer, on_sdp_media_direction, expected_offer_direction, + &offer_setup); + const gchar *expected_answer_direction = { "recvonly", "recvonly", }; + VAL_SDP_INIT (answer, on_sdp_media_direction, expected_answer_direction, + &answer_setup); + GstHarness *src0, *src1; + struct pad_properties pad_prop = { + {"audio0", 0}, + {"audio1", 1}, + }; + struct new_pad_validate_properties validate_pad = { 2, pad_prop }; + struct pad_added_harness_data pad_added_data = + { NULL, on_pad_added_validate_props, &validate_pad }; + guint i; + GstElement *rtpbin2; + GstBuffer *buf; + guint ssrcs = { 123456789, 987654321 }; + GArray *ssrcs_received; + + t->on_negotiation_needed = NULL; + t->on_ice_candidate = NULL; + t->on_pad_added = _pad_added_harness; + t->pad_added_data = &pad_added_data; + + gst_util_set_object_arg (G_OBJECT (t->webrtc1), "bundle-policy", + "max-bundle"); + gst_util_set_object_arg (G_OBJECT (t->webrtc2), "bundle-policy", + "max-bundle"); + + rtpbin2 = gst_bin_get_by_name (GST_BIN (t->webrtc2), "rtpbin"); + fail_unless (rtpbin2 != NULL); + g_signal_connect (rtpbin2, "new-jitterbuffer", + G_CALLBACK (new_jitterbuffer_set_fast_start), NULL); + g_object_unref (rtpbin2); + + g_signal_connect (t->webrtc1, "on-new-transceiver", + G_CALLBACK (on_new_transceiver_set_rtx_fec), NULL); + g_signal_connect (t->webrtc2, "on-new-transceiver", + G_CALLBACK (on_new_transceiver_set_rtx_fec), NULL); + + src0 = gst_harness_new_with_element (t->webrtc1, "sink_0", NULL); + add_audio_test_src_harness (src0, ssrcs0); + t->harnesses = g_list_prepend (t->harnesses, src0); + + src1 = gst_harness_new_with_element (t->webrtc1, "sink_1", NULL); + add_audio_test_src_harness (src1, ssrcs1); + t->harnesses = g_list_prepend (t->harnesses, src1); + + test_validate_sdp (t, &offer, &answer); + + fail_if (gst_element_set_state (t->webrtc1, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); + fail_if (gst_element_set_state (t->webrtc2, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); + + for (i = 0; i < 10; i++) { + gst_harness_push_from_src (src0); + gst_harness_push_from_src (src1); + } + + ssrcs_received = g_array_new (FALSE, TRUE, sizeof (guint32)); + + /* Get one buffer out for each ssrc sent. + */ + g_mutex_lock (&t->lock); + while (ssrcs_received->len < G_N_ELEMENTS (ssrcs)) { + GList *sink_harnesses = pad_added_data.sink_harnesses; + GList *l; + guint i; + + gst_harness_push_from_src (src0); + gst_harness_push_from_src (src1); + if (g_list_length (sink_harnesses) < 2) { + g_cond_wait_until (&t->cond, &t->lock, g_get_monotonic_time () + 5000); + if (g_list_length (sink_harnesses) < 2) + continue; + } + + g_mutex_unlock (&t->lock); + + for (l = sink_harnesses; l; l = l->next) { + GstHarness *sink_harness = (GstHarness *) l->data; + GstRTPBuffer rtp = GST_RTP_BUFFER_INIT; + guint ssrc; + + fail_unless (sink_harness->element == t->webrtc2); + + buf = gst_harness_try_pull (sink_harness); + if (!buf) + continue; + + fail_unless (gst_rtp_buffer_map (buf, GST_MAP_READ, &rtp)); + + ssrc = gst_rtp_buffer_get_ssrc (&rtp); + for (i = 0; i < ssrcs_received->len; i++) { + if (g_array_index (ssrcs_received, guint, i) == ssrc) + break; + } + if (i == ssrcs_received->len) { + g_array_append_val (ssrcs_received, ssrc); + } + + gst_rtp_buffer_unmap (&rtp); + + gst_buffer_unref (buf); + } + g_mutex_lock (&t->lock); + } + g_mutex_unlock (&t->lock); + + GST_DEBUG_BIN_TO_DOT_FILE (GST_BIN (t->webrtc1), GST_DEBUG_GRAPH_SHOW_ALL, + "webrtc1-fec-final"); + GST_DEBUG_BIN_TO_DOT_FILE (GST_BIN (t->webrtc2), GST_DEBUG_GRAPH_SHOW_ALL, + "webrtc2-fec-final"); + + test_webrtc_free (t); + g_list_free (pad_added_data.sink_harnesses); + + g_array_unref (ssrcs_received); +} + +GST_END_TEST; + +#define RTPHDREXT_MID GST_RTP_HDREXT_BASE "sdes:mid" +#define RTPHDREXT_STREAM_ID GST_RTP_HDREXT_BASE "sdes:rtp-stream-id" +#define RTPHDREXT_REPAIRED_STREAM_ID GST_RTP_HDREXT_BASE "sdes:repaired-rtp-stream-id" + +#define L16_CAPS "application/x-rtp, payload=11, media=audio," \ + " encoding-name=L16, clock-rate=44100" + +static GstCaps * +create_simulcast_audio_caps (GstWebRTCRTPTransceiverDirection direction, + guint n_rid, guint ssrc, const char *mid, guint mid_ext_id, + const char *const *rids, guint stream_ext_id, guint repaired_ext_id) +{ + GstStructure *s; + GstCaps *caps; + const char *dir_str; + + if (direction == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY) + dir_str = "recv"; + else if (direction == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDONLY) + dir_str = "send"; + else + g_assert_not_reached (); + + caps = gst_caps_from_string (L16_CAPS); + s = gst_caps_get_structure (caps, 0); + if (mid && mid_ext_id != G_MAXUINT) { + char *extmap_key = g_strdup_printf ("extmap-%u", mid_ext_id); + gst_structure_set (s, "a-mid", G_TYPE_STRING, mid, extmap_key, + G_TYPE_STRING, RTPHDREXT_MID, NULL); + g_free (extmap_key); + } + if (rids && n_rid > 0 && stream_ext_id != G_MAXUINT) { + GString *simulcast_value = g_string_new (dir_str); + char *extmap_key, *value; + int i; + + g_string_append_c (simulcast_value, ' '); + + for (i = 0; i < n_rid; i++) { + char *rid_key = g_strdup_printf ("rid-%s", ridsi); + gst_structure_set (s, rid_key, G_TYPE_STRING, dir_str, NULL); + if (i > 0) + g_string_append_c (simulcast_value, ';'); + g_string_append (simulcast_value, ridsi); + g_free (rid_key); + } + value = g_string_free (simulcast_value, FALSE); + simulcast_value = NULL; + extmap_key = g_strdup_printf ("extmap-%u", stream_ext_id); + gst_structure_set (s, extmap_key, G_TYPE_STRING, RTPHDREXT_STREAM_ID, + "a-simulcast", G_TYPE_STRING, value, NULL); + g_clear_pointer (&extmap_key, g_free); + g_clear_pointer (&value, g_free); + + if (repaired_ext_id != G_MAXUINT) { + extmap_key = g_strdup_printf ("extmap-%u", repaired_ext_id); + gst_structure_set (s, extmap_key, G_TYPE_STRING, + RTPHDREXT_REPAIRED_STREAM_ID, NULL); + g_clear_pointer (&extmap_key, g_free); + } + } + + return caps; +} + +static void +add_simulcast_audio_test_src_harness (GstHarness * h, guint n_rid, + guint ssrc, const char *mid, guint mid_ext_id, + const char *const *rids, guint stream_ext_id, guint repaired_ext_id) +{ + GstRTPHeaderExtension *ext; + GstElement *capsfilter; + char *launch_str; + GstCaps *caps; + int i; + + caps = + create_simulcast_audio_caps + (GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDONLY, n_rid, ssrc, mid, + mid_ext_id, rids, stream_ext_id, repaired_ext_id); + + gst_harness_set_src_caps (h, gst_caps_ref (caps)); + + if (n_rid == 0) { + launch_str = + g_strdup ("audiotestsrc is-live=true ! " L16_CAPS + ",ssrc=(uint)3384078954 ! rtpL16pay name=payloader0"); + } else { + GString *launch = g_string_new (NULL); + + for (i = 0; i < n_rid; i++) { + const char *rtpfunnel = "funnel."; + if (i == 0) + rtpfunnel = "rtpfunnel name=funnel ! capsfilter name=capsfilter"; + + g_string_append_printf (launch, "audiotestsrc is-live=true ! " + "rtpL16pay name=payloader%u ! " L16_CAPS ", ssrc=(uint)%u ! %s ", i, + ssrci, rtpfunnel); + } + + launch_str = g_string_free (launch, FALSE); + } + GST_INFO ("generated launch string %s", launch_str); + gst_harness_add_src_parse (h, launch_str, TRUE); + g_clear_pointer (&launch_str, g_free); + capsfilter = + gst_bin_get_by_name (GST_BIN (h->src_harness->element), "capsfilter"); + g_object_set (capsfilter, "caps", caps, NULL); + gst_clear_object (&capsfilter); + gst_clear_caps (&caps); + + for (i = 0; i == 0 || i < n_rid; i++) { + const char *rid = n_rid > 0 ? ridsi : NULL; + char *pay_name = g_strdup_printf ("payloader%u", i); + GstElement *payloader = + gst_bin_get_by_name (GST_BIN (h->src_harness->element), pay_name); + fail_unless (payloader); + g_clear_pointer (&pay_name, g_free); + + if (mid_ext_id != G_MAXUINT) { + ext = gst_rtp_header_extension_create_from_uri (RTPHDREXT_MID); + fail_unless (ext); + gst_rtp_header_extension_set_id (ext, mid_ext_id); + g_object_set (ext, "mid", mid, NULL); + g_signal_emit_by_name (payloader, "add-extension", ext); + gst_clear_object (&ext); + } + if (n_rid > 0 && stream_ext_id != G_MAXUINT) { + ext = gst_rtp_header_extension_create_from_uri (RTPHDREXT_STREAM_ID); + fail_unless (ext); + gst_rtp_header_extension_set_id (ext, stream_ext_id); + g_object_set (ext, "rid", rid, NULL); + g_signal_emit_by_name (payloader, "add-extension", ext); + gst_clear_object (&ext); + } + if (n_rid > 0 && stream_ext_id != G_MAXUINT) { + ext = gst_rtp_header_extension_create_from_uri (RTPHDREXT_STREAM_ID); + fail_unless (ext); + gst_rtp_header_extension_set_id (ext, stream_ext_id); + g_object_set (ext, "rid", rid, NULL); + g_signal_emit_by_name (payloader, "add-extension", ext); + gst_clear_object (&ext); + } + gst_clear_object (&payloader); + } +} + +#undef L16_CAPS + +static gboolean +gst_g_ptr_array_find_str (GPtrArray * ptr, const char *needle, guint * index) +{ + guint i; + + for (i = 0; i < ptr->len; i++) { + const char *test = g_ptr_array_index (ptr, i); + if (g_strcmp0 (test, needle) == 0) { + if (index) + *index = i; + return TRUE; + } + } + + return FALSE; +} + +struct ExpectedRid +{ + guint n_rid; + const char *const *rid; +}; + +static void +on_sdp_media_rid (struct test_webrtc *t, GstElement * element, + GstWebRTCSessionDescription * desc, gpointer user_data) +{ + struct ExpectedRid *expected_rids = user_data; + int i; + + for (i = 0; i < gst_sdp_message_medias_len (desc->sdp); i++) { + const GstSDPMedia *media = gst_sdp_message_get_media (desc->sdp, i); + struct ExpectedRid *expected_rid = &expected_ridsi; + GPtrArray *seen_rid = g_ptr_array_new_with_free_func (g_free); + int j; + + for (j = 0; j < gst_sdp_media_attributes_len (media); j++) { + const GstSDPAttribute *attr = gst_sdp_media_get_attribute (media, j); + + if (g_strcmp0 (attr->key, "rid") == 0) { + const char *p; + char *v; + guint k; + + p = attr->value; + /* take up to either space or nul-terminator */ + while (p && *p && *p == ' ') + p++; + v = (char *) p; + /* take up to either space or nul-terminator */ + while (p && *p && *p != ' ') + p++; + g_assert (v != p); + v = g_strndup (v, p - v); + GST_INFO ("rid = %s", v); + + fail_unless (FALSE == gst_g_ptr_array_find_str (seen_rid, v, NULL), + "duplicate/multiple rid for media %u", i); + for (k = 0; k < expected_rid->n_rid; k++) { + GST_LOG ("expected %u = %s", k, expected_rid->ridk); + if (g_strcmp0 (v, expected_rid->ridk) == 0) + break; + } + fail_unless (k < expected_rid->n_rid, "rid %s not found in media %u", + v, i); + g_ptr_array_add (seen_rid, v); + } + } + fail_unless (seen_rid->len == expected_rid->n_rid, + "mismatch in number of rid's in media %u, seen %u, expected %u", i, + seen_rid->len, expected_rid->n_rid); + g_ptr_array_unref (seen_rid); + } +} + +static void +do_test_simulcast (gboolean enable_fec_rtx) +{ + struct test_webrtc *t = test_webrtc_new (); + guint media_format_count = { enable_fec_rtx ? 5 : 1, }; + VAL_SDP_INIT (media_formats, on_sdp_media_count_formats, + media_format_count, NULL); + VAL_SDP_INIT (payloads, on_sdp_media_no_duplicate_payloads, NULL, + &media_formats); + const char *expected_rids0 = { "a", "z" }; + struct ExpectedRid expected_rids = { G_N_ELEMENTS (expected_rids0), + expected_rids0 + }; + VAL_SDP_INIT (rids, on_sdp_media_rid, &expected_rids, &payloads); + VAL_SDP_INIT (non_reject, _count_non_rejected_media, + GUINT_TO_POINTER (1), &rids); + VAL_SDP_INIT (count, _count_num_sdp_media, GUINT_TO_POINTER (1), &non_reject); + const gchar *expected_offer_setup = { "actpass", }; + VAL_SDP_INIT (offer_setup, on_sdp_media_setup, expected_offer_setup, &count); + const gchar *expected_answer_setup = { "active", }; + VAL_SDP_INIT (answer_setup, on_sdp_media_setup, expected_answer_setup, + &count); + const gchar *expected_offer_direction = { "sendrecv", }; + VAL_SDP_INIT (offer, on_sdp_media_direction, expected_offer_direction, + &offer_setup); + const gchar *expected_answer_direction = { "recvonly", }; + VAL_SDP_INIT (answer, on_sdp_media_direction, expected_answer_direction, + &answer_setup); + GstHarness *h; + GObject *trans; + guint i; + GstElement *rtpbin2; + GstBuffer *buf; + guint mid_ext_id = 1; + guint stream_ext_id = 2; + guint repaired_ext_id = 3; + const char *mid = "5"; + guint ssrcs = { 123456789, 987654321 }; + GArray *ssrcs_received; + GstCaps *caps; + struct pad_properties pad_prop = { mid, 0 }; + struct new_pad_validate_properties validate_pad = { 1, &pad_prop }; + struct pad_added_harness_data pad_added_data = + { NULL, on_pad_added_validate_props, &validate_pad }; + + t->on_negotiation_needed = NULL; + t->on_ice_candidate = NULL; + t->on_pad_added = _pad_added_harness; + t->pad_added_data = &pad_added_data; + + gst_util_set_object_arg (G_OBJECT (t->webrtc1), "bundle-policy", + "max-bundle"); + gst_util_set_object_arg (G_OBJECT (t->webrtc2), "bundle-policy", + "max-bundle"); + + if (enable_fec_rtx) { + g_signal_connect (t->webrtc1, "on-new-transceiver", + G_CALLBACK (on_new_transceiver_set_rtx_fec), NULL); + g_signal_connect (t->webrtc2, "on-new-transceiver", + G_CALLBACK (on_new_transceiver_set_rtx_fec), NULL); + } + + rtpbin2 = gst_bin_get_by_name (GST_BIN (t->webrtc2), "rtpbin"); + fail_unless (rtpbin2 != NULL); + g_signal_connect (rtpbin2, "new-jitterbuffer", + G_CALLBACK (new_jitterbuffer_set_fast_start), NULL); + g_object_unref (rtpbin2); + + h = gst_harness_new_with_element (t->webrtc1, "sink_0", NULL); + add_simulcast_audio_test_src_harness (h, expected_rids.n_rid, ssrcs, mid, + mid_ext_id, expected_rids.rid, stream_ext_id, repaired_ext_id); + t->harnesses = g_list_prepend (t->harnesses, h); + + /* setup recvonly transceiver as answer */ + caps = + create_simulcast_audio_caps + (GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY, expected_rids.n_rid, + ssrcs, mid, mid_ext_id, expected_rids.rid, stream_ext_id, + repaired_ext_id); + g_signal_emit_by_name (t->webrtc2, "add-transceiver", + GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY, caps, &trans); + gst_clear_caps (&caps); + fail_unless (trans != NULL); + g_clear_object (&trans); + + test_validate_sdp (t, &offer, &answer); + + fail_if (gst_element_set_state (t->webrtc1, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); + fail_if (gst_element_set_state (t->webrtc2, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); + + for (i = 0; i < 10; i++) { + gst_harness_push_from_src (h); + } + + ssrcs_received = g_array_new (FALSE, TRUE, sizeof (guint32)); + + /* Get one buffer out for each ssrc sent. + */ + g_mutex_lock (&t->lock); + while (ssrcs_received->len < G_N_ELEMENTS (ssrcs)) { + GList *sink_harnesses = pad_added_data.sink_harnesses; + GList *l; + guint i; + + gst_harness_push_from_src (h); + if (g_list_length (pad_added_data.sink_harnesses) < 2) { + g_cond_wait_until (&t->cond, &t->lock, g_get_monotonic_time () + 5000); + if (g_list_length (pad_added_data.sink_harnesses) < 2) + continue; + } + + g_mutex_unlock (&t->lock); + + for (l = sink_harnesses; l; l = l->next) { + GstHarness *sink_harness = (GstHarness *) l->data; + GstRTPBuffer rtp = GST_RTP_BUFFER_INIT; + guint ssrc; + + fail_unless (sink_harness->element == t->webrtc2); + + buf = gst_harness_try_pull (sink_harness); + if (!buf) + continue; + + fail_unless (gst_rtp_buffer_map (buf, GST_MAP_READ, &rtp)); + + ssrc = gst_rtp_buffer_get_ssrc (&rtp); + for (i = 0; i < ssrcs_received->len; i++) { + if (g_array_index (ssrcs_received, guint, i) == ssrc) + break; + } + if (i == ssrcs_received->len) { + g_array_append_val (ssrcs_received, ssrc); + } + + gst_rtp_buffer_unmap (&rtp); + + gst_buffer_unref (buf); + } + g_mutex_lock (&t->lock); + } + g_mutex_unlock (&t->lock); + + test_webrtc_free (t); + g_list_free (pad_added_data.sink_harnesses); + + g_array_unref (ssrcs_received); +} + +GST_START_TEST (test_simulcast) +{ + do_test_simulcast (FALSE); +} + +GST_END_TEST; + +GST_START_TEST (test_simulcast_fec_rtx) +{ + do_test_simulcast (TRUE); +} + +GST_END_TEST; + +GST_START_TEST (test_bundle_multiple_media_rtx_payload_mapping) +{ + struct test_webrtc *t = test_webrtc_new (); + guint offer_media_format_count = { 5, 5, }; + VAL_SDP_INIT (payloads0, on_sdp_media_payload_types, GUINT_TO_POINTER (0), + NULL); + VAL_SDP_INIT (payloads1, on_sdp_media_payload_types, GUINT_TO_POINTER (1), + &payloads0); + VAL_SDP_INIT (no_dup_payloads, on_sdp_media_no_duplicate_payloads, NULL, + &payloads1); + VAL_SDP_INIT (media_formats, on_sdp_media_count_formats, + offer_media_format_count, &no_dup_payloads); + const gchar *expected_offer_setup = { "actpass", "actpass", }; + VAL_SDP_INIT (setup, on_sdp_media_setup, expected_offer_setup, + &media_formats); + const gchar *expected_offer_direction = { "recvonly", "recvonly", }; + VAL_SDP_INIT (offer, on_sdp_media_direction, expected_offer_direction, + &setup); + GstWebRTCRTPTransceiverDirection direction; + GstWebRTCRTPTransceiver *trans; + GstCaps *caps; + + /* add two identical transceivers that will only receive a vp8 stream and check that + * the created offer has the same rtx/red mappings */ + t->on_negotiation_needed = NULL; + t->on_ice_candidate = NULL; + + gst_util_set_object_arg (G_OBJECT (t->webrtc1), "bundle-policy", + "max-bundle"); + gst_util_set_object_arg (G_OBJECT (t->webrtc2), "bundle-policy", + "max-bundle"); + + /* setup recvonly transceiver */ + caps = gst_caps_from_string (VP8_RTP_CAPS (97)); + direction = GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY; + g_signal_emit_by_name (t->webrtc1, "add-transceiver", direction, caps, + &trans); + fail_unless (trans != NULL); + g_object_set (GST_OBJECT (trans), "do-nack", TRUE, "fec-type", + GST_WEBRTC_FEC_TYPE_ULP_RED, NULL); + gst_object_unref (trans); + + direction = GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY; + g_signal_emit_by_name (t->webrtc1, "add-transceiver", direction, caps, + &trans); + fail_unless (trans != NULL); + g_object_set (GST_OBJECT (trans), "do-nack", TRUE, "fec-type", + GST_WEBRTC_FEC_TYPE_ULP_RED, NULL); + gst_object_unref (trans); + + gst_caps_unref (caps); + + /* don't really care about the answer */ + test_validate_sdp (t, &offer, NULL); + + test_webrtc_free (t); +} + +GST_END_TEST; + static void add_media_line (struct test_webrtc *t, GstElement * element, GstWebRTCSessionDescription * desc, gpointer user_data) @@ -4439,6 +5495,219 @@ GST_END_TEST; +#define VALID_TURN_SERVER_URL1 "turn://testuser:testpass@test.com:1234" +#define VALID_TURN_SERVER_URL2 "turns://1665056262%3Atestuser:T4VwcehYgPAa5bpFAO14gVE19so=@test.com:1234" +#define INVALID_TURN_SERVER_URL1 "testuser@testpass@test.com:1234" /* protocol of uri is missing */ +#define INVALID_TURN_SERVER_URL2 "turns://testuser:testpass/@test.com:1234" /* unescaped character in password */ +#define INVALID_TURN_SERVER_URL3 "turns://test.com:1234" /* 'user:pass' is missing */ + +GST_START_TEST (test_add_turn_server) +{ + struct test_webrtc *t = test_webrtc_new (); + gboolean ret = FALSE; + + g_signal_emit_by_name (t->webrtc1, "add-turn-server", + VALID_TURN_SERVER_URL1, &ret); + fail_unless (ret != FALSE); + + g_signal_emit_by_name (t->webrtc1, "add-turn-server", + VALID_TURN_SERVER_URL2, &ret); + fail_unless (ret != FALSE); + + g_signal_emit_by_name (t->webrtc1, "add-turn-server", + INVALID_TURN_SERVER_URL1, &ret); + fail_unless (ret != TRUE); + + g_signal_emit_by_name (t->webrtc1, "add-turn-server", + INVALID_TURN_SERVER_URL2, &ret); + fail_unless (ret != TRUE); + + g_signal_emit_by_name (t->webrtc1, "add-turn-server", + INVALID_TURN_SERVER_URL3, &ret); + fail_unless (ret != TRUE); + + test_webrtc_free (t); +} + +GST_END_TEST; + +GST_START_TEST (test_data_channel_recreate_offer) +{ + GstHarness *h; + GstWebRTCDataChannel *channel; + GstPromise *promise; + const GstStructure *s; + GstPromiseResult res; + GstPad *pad; + + h = gst_harness_new_with_padnames ("webrtcbin", "sink_0", NULL); + add_audio_test_src_harness (h, 0xDEADBEEF); + + g_signal_emit_by_name (h->element, "create-data-channel", "label", NULL, + &channel); + fail_unless (GST_IS_WEBRTC_DATA_CHANNEL (channel)); + + pad = gst_element_get_static_pad (h->element, "sink_0"); + fail_unless (pad != NULL); + + promise = gst_promise_new (); + g_signal_emit_by_name (h->element, "create-offer", NULL, promise); + res = gst_promise_wait (promise); + fail_unless_equals_int (res, GST_PROMISE_RESULT_REPLIED); + s = gst_promise_get_reply (promise); + fail_unless (s != NULL); + gst_promise_unref (promise); + + promise = gst_promise_new (); + g_signal_emit_by_name (h->element, "create-offer", NULL, promise); + res = gst_promise_wait (promise); + fail_unless_equals_int (res, GST_PROMISE_RESULT_REPLIED); + s = gst_promise_get_reply (promise); + fail_unless (s != NULL); + gst_promise_unref (promise); + + gst_object_unref (pad); + gst_object_unref (channel); + gst_harness_teardown (h); +} + +GST_END_TEST; + +static void +validate_msid (struct test_webrtc *t, GstElement * element, + GstWebRTCSessionDescription * desc, gpointer user_data) +{ + char **expected_msid = user_data; + int i; + + for (i = 0; i < gst_sdp_message_medias_len (desc->sdp); i++) { + const GstSDPMedia *media = gst_sdp_message_get_media (desc->sdp, i); + gboolean have_msid = FALSE; + char *prev_msid = NULL; + int j; + + for (j = 0; j < gst_sdp_media_attributes_len (media); j++) { + const GstSDPAttribute *attr = gst_sdp_media_get_attribute (media, j); + const char *start; + + if (!attr->value) + continue; + + start = strstr (attr->value, "msid:"); + if (start) { + const char *end; + char *msid; + + start += strlen ("msid:"); + end = strstr (start, " "); + msid = g_strndup (start, end - start); + fail_unless (end, "Invalid msid attribute"); + fail_if (have_msid && g_strcmp0 (prev_msid, msid) != 0, + "different values for multiple msid values at mline %u, " + "prev msid %s, msid %s", i, prev_msid, msid); + have_msid = TRUE; + fail_unless_equals_string (msid, expected_msidi); + g_clear_pointer (&prev_msid, g_free); + prev_msid = msid; + } + } + g_clear_pointer (&prev_msid, g_free); + fail_unless (have_msid, "no msid attribute in media %u", i); + } +} + +static void +_pad_added_src_check_msid (struct test_webrtc *t, GstElement * element, + GstPad * pad, gpointer user_data) +{ + const char *expected_msid = user_data; + char *msid; + + if (GST_PAD_DIRECTION (pad) != GST_PAD_SRC) + return; + + g_object_get (pad, "msid", &msid, NULL); + fail_unless_equals_string (msid, expected_msid); + g_clear_pointer (&msid, g_free); + + test_webrtc_signal_state_unlocked (t, STATE_CUSTOM); +} + +GST_START_TEST (test_msid) +{ + struct test_webrtc *t = create_audio_test (); + VAL_SDP_INIT (no_duplicate_payloads, on_sdp_media_no_duplicate_payloads, + NULL, NULL); + guint media_format_count = { 1, 5 }; + VAL_SDP_INIT (media_formats, on_sdp_media_count_formats, + media_format_count, &no_duplicate_payloads); + VAL_SDP_INIT (count, _count_num_sdp_media, GUINT_TO_POINTER (2), + &media_formats); + const gchar *expected_offer_msid = { "a1", "a1", }; + VAL_SDP_INIT (offer_msid, validate_msid, expected_offer_msid, &count); + const gchar *expected_offer_setup = { "actpass", "actpass", }; + VAL_SDP_INIT (offer_setup, on_sdp_media_setup, expected_offer_setup, + &offer_msid); + const gchar *expected_offer_direction = { "sendrecv", "sendrecv", }; + VAL_SDP_INIT (offer, on_sdp_media_direction, expected_offer_direction, + &offer_setup); + const gchar *expected_answer_setup = { "active", "active", }; + VAL_SDP_INIT (answer_setup, on_sdp_media_setup, expected_answer_setup, + &count); + const gchar *expected_answer_direction = { "recvonly", "recvonly", }; + VAL_SDP_INIT (answer, on_sdp_media_direction, expected_answer_direction, + &answer_setup); + GstPad *pad; + GstHarness *src; + GstElement *rtpbin2; + + t->on_pad_added = _pad_added_src_check_msid; + t->pad_added_data = (gpointer) "a1"; + + rtpbin2 = gst_bin_get_by_name (GST_BIN (t->webrtc2), "rtpbin"); + fail_unless (rtpbin2 != NULL); + g_signal_connect (rtpbin2, "new-jitterbuffer", + G_CALLBACK (new_jitterbuffer_set_fast_start), NULL); + g_object_unref (rtpbin2); + + g_signal_connect (t->webrtc1, "on-new-transceiver", + G_CALLBACK (on_new_transceiver_set_rtx_fec), NULL); + g_signal_connect (t->webrtc2, "on-new-transceiver", + G_CALLBACK (on_new_transceiver_set_rtx_fec), NULL); + + src = gst_harness_new_with_element (t->webrtc1, "sink_1", NULL); + add_audio_test_src_harness (src, 0x12345678); + t->harnesses = g_list_prepend (t->harnesses, src); + + pad = gst_element_get_static_pad (t->webrtc1, "sink_0"); + g_object_set (pad, "msid", "a1", NULL); + gst_clear_object (&pad); + + pad = gst_element_get_static_pad (t->webrtc1, "sink_1"); + g_object_set (pad, "msid", "a1", NULL); + gst_clear_object (&pad); + + test_validate_sdp (t, &offer, &answer); + + fail_if (gst_element_set_state (t->webrtc1, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); + fail_if (gst_element_set_state (t->webrtc2, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE); + + while (TRUE) { + gst_harness_push_from_src (src); + + if (test_webrtc_check_for_state_mask (t, 1 << STATE_CUSTOM)) + break; + + g_usleep (10 * 1000); + } + + test_webrtc_free (t); +} + +GST_END_TEST; + static Suite * webrtcbin_suite (void) { @@ -4461,6 +5730,7 @@ if (nicesrc && nicesink && dtlssrtpenc && dtlssrtpdec) { tcase_add_test (tc, test_sdp_no_media); tcase_add_test (tc, test_session_stats); + tcase_add_test (tc, test_stats_with_stream); tcase_add_test (tc, test_audio); tcase_add_test (tc, test_ice_port_restriction); tcase_add_test (tc, test_audio_video); @@ -4484,6 +5754,7 @@ test_bundle_codec_preferences_rtx_no_duplicate_payloads); tcase_add_test (tc, test_reject_request_pad); tcase_add_test (tc, test_reject_create_offer); + tcase_add_test (tc, test_reject_create_offer_mline_locked_no_caps); tcase_add_test (tc, test_reject_set_description); tcase_add_test (tc, test_force_second_media); tcase_add_test (tc, test_codec_preferences_caps); @@ -4493,7 +5764,15 @@ tcase_add_test (tc, test_codec_preferences_no_duplicate_extmaps); tcase_add_test (tc, test_codec_preferences_incompatible_extmaps); tcase_add_test (tc, test_codec_preferences_invalid_extmap); + tcase_add_test (tc, test_renego_rtx); + tcase_add_test (tc, test_bundle_mid_header_extension); + tcase_add_test (tc, test_max_bundle_fec); + tcase_add_test (tc, test_simulcast); + tcase_add_test (tc, test_simulcast_fec_rtx); + tcase_add_test (tc, test_bundle_multiple_media_rtx_payload_mapping); tcase_add_test (tc, test_invalid_add_media_in_answer); + tcase_add_test (tc, test_add_turn_server); + tcase_add_test (tc, test_msid); if (sctpenc && sctpdec) { tcase_add_test (tc, test_data_channel_create); tcase_add_test (tc, test_data_channel_remote_notify); @@ -4508,6 +5787,7 @@ tcase_add_test (tc, test_renego_stream_add_data_channel); tcase_add_test (tc, test_renego_data_channel_add_stream); tcase_add_test (tc, test_renego_stream_data_channel_add_stream); + tcase_add_test (tc, test_data_channel_recreate_offer); } else { GST_WARNING ("Some required elements were not found. " "All datachannel tests are disabled. sctpenc %p, sctpdec %p", sctpenc,
View file
gst-plugins-bad-1.22.0.tar.xz/tests/check/libs/h264bitwriter.c
Added
@@ -0,0 +1,540 @@ +/* GStreamer + * Copyright (C) 2020 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the0 + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include <gst/check/gstcheck.h> +#include <gst/codecparsers/gsth264bitwriter.h> + +/* *INDENT-OFF* */ +static const GstH264SPS sps = { + .id = 0, + .profile_idc = 100, + .constraint_set0_flag = 0, + .constraint_set1_flag = 0, + .constraint_set2_flag = 0, + .constraint_set3_flag = 0, + .constraint_set4_flag = 0, + .constraint_set5_flag = 0, + .level_idc = 31, + + .chroma_format_idc = 1, + .bit_depth_luma_minus8 = 0, + .bit_depth_chroma_minus8 = 0, + + .scaling_matrix_present_flag = 1, + .scaling_lists_4x40 = { 17, 32, 31, 30, 23, 15, 33, 39, 39, 35, 35, 14, 28, 32, 27, 27 }, + + .log2_max_frame_num_minus4 = 2, + .pic_order_cnt_type = 0, + .log2_max_pic_order_cnt_lsb_minus4 = 3, + + .num_ref_frames = 8, + .gaps_in_frame_num_value_allowed_flag = 0, + .pic_width_in_mbs_minus1 = 49, + .pic_height_in_map_units_minus1 = 37, + .frame_mbs_only_flag = 1, + .mb_adaptive_frame_field_flag = 0, + .direct_8x8_inference_flag = 1, + .frame_cropping_flag = 1, + .frame_crop_left_offset = 8, + .frame_crop_right_offset = 8, + .frame_crop_top_offset = 16, + .frame_crop_bottom_offset = 8, + + .vui_parameters_present_flag = 1, + .vui_parameters = { + .aspect_ratio_info_present_flag = 1, + .aspect_ratio_idc = 255, + .sar_width = 1, + .sar_height = 1, + .overscan_info_present_flag = 0, + .overscan_appropriate_flag = 0, + .chroma_loc_info_present_flag = 0, + .timing_info_present_flag = 1, + .num_units_in_tick = 1, + .time_scale = 60, + .fixed_frame_rate_flag = 1, + + .nal_hrd_parameters_present_flag = 1, + .nal_hrd_parameters = { + .cpb_cnt_minus1 = 0, + .bit_rate_scale = 4, + .cpb_size_scale = 2, + .bit_rate_value_minus10 = 1999, + .cpb_size_value_minus10 = 63999, + .cbr_flag0 = 1, + .initial_cpb_removal_delay_length_minus1 = 23, + .cpb_removal_delay_length_minus1 = 23, + .dpb_output_delay_length_minus1 = 23, + .time_offset_length = 24, + }, + + .vcl_hrd_parameters_present_flag = 0, + .low_delay_hrd_flag = 0, + .pic_struct_present_flag = 1, + .bitstream_restriction_flag = 1, + .motion_vectors_over_pic_boundaries_flag = 1, + .max_bytes_per_pic_denom = 2, + .max_bits_per_mb_denom = 1, + .log2_max_mv_length_horizontal = 13, + .log2_max_mv_length_vertical = 11, + .num_reorder_frames = 3, + .max_dec_frame_buffering = 8, + }, +}; + +static const GstH264PPS pps = { + .id = 2, + .entropy_coding_mode_flag = 1, + .pic_order_present_flag = 0, + .num_slice_groups_minus1 = 0, + + .num_ref_idx_l0_active_minus1 = 4, + .num_ref_idx_l1_active_minus1 = 2, + + .weighted_pred_flag = 0, + .weighted_bipred_idc = 0, + .pic_init_qp_minus26 = 2, + .pic_init_qs_minus26 = 0, + .chroma_qp_index_offset = 1, + .deblocking_filter_control_present_flag = 1, + .constrained_intra_pred_flag = 0, + .redundant_pic_cnt_present_flag = 0, + .transform_8x8_mode_flag = 0, + + .pic_scaling_matrix_present_flag = 0, + .second_chroma_qp_index_offset = 0, + + .sequence = (GstH264SPS *) &sps, +}; + +static const GstH264SliceHdr slice_hdr = { + .first_mb_in_slice = 0, + .type = 1, + .frame_num = 10, + + .field_pic_flag = 0, + .bottom_field_flag = 0, + .idr_pic_id = 0, + + .pic_order_cnt_lsb = 4, + .delta_pic_order_cnt_bottom = 0, + + .direct_spatial_mv_pred_flag = 1, + + .num_ref_idx_active_override_flag = 1, + .num_ref_idx_l0_active_minus1 = 2, + .num_ref_idx_l1_active_minus1 = 2, + + .ref_pic_list_modification_flag_l0 = 0, + .ref_pic_list_modification_flag_l1 = 0, + + .dec_ref_pic_marking.no_output_of_prior_pics_flag = 0, + .dec_ref_pic_marking.long_term_reference_flag = 0, + .dec_ref_pic_marking.adaptive_ref_pic_marking_mode_flag = 0, + + .cabac_init_idc = 1, + .slice_qp_delta = 8, + + .disable_deblocking_filter_idc = 0, + .slice_alpha_c0_offset_div2 = 2, + .slice_beta_offset_div2 = 2, + + .pps = (GstH264PPS *) &pps, +}; +/* *INDENT-ON* */ + +GST_START_TEST (test_h264_bitwriter_sps_pps_slice_hdr) +{ + GstH264ParserResult res; + gboolean ret; + GstH264NalUnit nalu; + GstH264NalParser *const parser = gst_h264_nal_parser_new (); + GstH264SPS sps_parsed; + GstH264PPS pps_parsed; + GstH264SliceHdr slice_parsed; + guint8 header_data128 = { 0, }; + guint8 header_nal128 = { 0, }; + guint size, trail_bits; + guint nal_size; + guint i; + + size = sizeof (header_data); + ret = gst_h264_bit_writer_sps (&sps, TRUE, header_data, &size); + fail_if (ret != GST_H264_BIT_WRITER_OK); + + nal_size = sizeof (header_nal); + ret = gst_h264_bit_writer_convert_to_nal (4, FALSE, TRUE, FALSE, + header_data, size * 8, header_nal, &nal_size); + fail_if (ret != GST_H264_BIT_WRITER_OK); + fail_if (nal_size < size); + + /* Parse it again */ + res = gst_h264_parser_identify_nalu (parser, header_nal, 0, + sizeof (header_nal), &nalu); + assert_equals_int (res, GST_H264_PARSER_NO_NAL_END); + + res = gst_h264_parser_parse_sps (parser, &nalu, &sps_parsed); + assert_equals_int (res, GST_H264_PARSER_OK); + + /* We can not do simply memcmp, the parser may set some default + value for the fields which are not used for writing. */ +#define CHECK_FIELD(FIELD) fail_if(sps_parsed.FIELD != sps.FIELD) + CHECK_FIELD (id); + CHECK_FIELD (profile_idc); + CHECK_FIELD (constraint_set0_flag); + CHECK_FIELD (constraint_set1_flag); + CHECK_FIELD (constraint_set2_flag); + CHECK_FIELD (constraint_set3_flag); + CHECK_FIELD (constraint_set4_flag); + CHECK_FIELD (constraint_set5_flag); + CHECK_FIELD (level_idc); + + CHECK_FIELD (chroma_format_idc); + CHECK_FIELD (bit_depth_luma_minus8); + CHECK_FIELD (bit_depth_chroma_minus8); + + CHECK_FIELD (scaling_matrix_present_flag); + for (i = 0; i < 16; i++) + CHECK_FIELD (scaling_lists_4x40i); + + CHECK_FIELD (log2_max_frame_num_minus4); + CHECK_FIELD (pic_order_cnt_type); + CHECK_FIELD (log2_max_pic_order_cnt_lsb_minus4); + + CHECK_FIELD (num_ref_frames); + CHECK_FIELD (gaps_in_frame_num_value_allowed_flag); + CHECK_FIELD (pic_width_in_mbs_minus1); + CHECK_FIELD (pic_height_in_map_units_minus1); + CHECK_FIELD (frame_mbs_only_flag); + CHECK_FIELD (mb_adaptive_frame_field_flag); + CHECK_FIELD (direct_8x8_inference_flag); + CHECK_FIELD (frame_cropping_flag); + CHECK_FIELD (frame_crop_left_offset); + CHECK_FIELD (frame_crop_right_offset); + CHECK_FIELD (frame_crop_top_offset); + CHECK_FIELD (frame_crop_bottom_offset); + + CHECK_FIELD (vui_parameters_present_flag); + CHECK_FIELD (vui_parameters.aspect_ratio_info_present_flag); + CHECK_FIELD (vui_parameters.aspect_ratio_idc); + CHECK_FIELD (vui_parameters.sar_width); + CHECK_FIELD (vui_parameters.sar_height); + CHECK_FIELD (vui_parameters.overscan_info_present_flag); + CHECK_FIELD (vui_parameters.overscan_appropriate_flag); + CHECK_FIELD (vui_parameters.chroma_loc_info_present_flag); + CHECK_FIELD (vui_parameters.timing_info_present_flag); + CHECK_FIELD (vui_parameters.num_units_in_tick); + CHECK_FIELD (vui_parameters.time_scale); + CHECK_FIELD (vui_parameters.fixed_frame_rate_flag); + + CHECK_FIELD (vui_parameters.nal_hrd_parameters_present_flag); + CHECK_FIELD (vui_parameters.nal_hrd_parameters.cpb_cnt_minus1); + CHECK_FIELD (vui_parameters.nal_hrd_parameters.bit_rate_scale); + CHECK_FIELD (vui_parameters.nal_hrd_parameters.cpb_size_scale); + CHECK_FIELD (vui_parameters.nal_hrd_parameters.bit_rate_value_minus10); + CHECK_FIELD (vui_parameters.nal_hrd_parameters.cpb_size_value_minus10); + CHECK_FIELD (vui_parameters.nal_hrd_parameters.cbr_flag0); + CHECK_FIELD (vui_parameters. + nal_hrd_parameters.initial_cpb_removal_delay_length_minus1); + CHECK_FIELD (vui_parameters. + nal_hrd_parameters.cpb_removal_delay_length_minus1); + CHECK_FIELD (vui_parameters. + nal_hrd_parameters.dpb_output_delay_length_minus1); + CHECK_FIELD (vui_parameters.nal_hrd_parameters.time_offset_length); + + CHECK_FIELD (vui_parameters.vcl_hrd_parameters_present_flag); + CHECK_FIELD (vui_parameters.low_delay_hrd_flag); + CHECK_FIELD (vui_parameters.pic_struct_present_flag); + CHECK_FIELD (vui_parameters.bitstream_restriction_flag); + CHECK_FIELD (vui_parameters.motion_vectors_over_pic_boundaries_flag); + CHECK_FIELD (vui_parameters.max_bytes_per_pic_denom); + CHECK_FIELD (vui_parameters.max_bits_per_mb_denom); + CHECK_FIELD (vui_parameters.log2_max_mv_length_horizontal); + CHECK_FIELD (vui_parameters.log2_max_mv_length_vertical); + CHECK_FIELD (vui_parameters.num_reorder_frames); + CHECK_FIELD (vui_parameters.max_dec_frame_buffering); +#undef CHECK_FIELD + + memset (header_data, 0, sizeof (header_data)); + memset (header_nal, 0, sizeof (header_nal)); + + size = sizeof (header_data); + ret = gst_h264_bit_writer_pps (&pps, TRUE, header_data, &size); + fail_if (ret != GST_H264_BIT_WRITER_OK); + + nal_size = sizeof (header_nal); + ret = gst_h264_bit_writer_convert_to_nal (4, FALSE, TRUE, FALSE, + header_data, size * 8, header_nal, &nal_size); + fail_if (ret != GST_H264_BIT_WRITER_OK); + fail_if (nal_size < size); + + /* Parse it again */ + res = gst_h264_parser_identify_nalu (parser, header_nal, 0, + sizeof (header_nal), &nalu); + assert_equals_int (res, GST_H264_PARSER_NO_NAL_END); + + res = gst_h264_parser_parse_pps (parser, &nalu, &pps_parsed); + assert_equals_int (res, GST_H264_PARSER_OK); + +#define CHECK_FIELD(FIELD) fail_if(pps_parsed.FIELD != pps.FIELD) + CHECK_FIELD (id); + CHECK_FIELD (entropy_coding_mode_flag); + CHECK_FIELD (pic_order_present_flag); + CHECK_FIELD (num_slice_groups_minus1); + + CHECK_FIELD (num_ref_idx_l0_active_minus1); + CHECK_FIELD (num_ref_idx_l1_active_minus1); + + CHECK_FIELD (weighted_pred_flag); + CHECK_FIELD (weighted_bipred_idc); + CHECK_FIELD (pic_init_qp_minus26); + CHECK_FIELD (pic_init_qs_minus26); + CHECK_FIELD (chroma_qp_index_offset); + CHECK_FIELD (deblocking_filter_control_present_flag); + CHECK_FIELD (constrained_intra_pred_flag); + CHECK_FIELD (redundant_pic_cnt_present_flag); + CHECK_FIELD (transform_8x8_mode_flag); + + CHECK_FIELD (pic_scaling_matrix_present_flag); + CHECK_FIELD (second_chroma_qp_index_offset); +#undef CHECK_FIELD + + memset (header_data, 0, sizeof (header_data)); + memset (header_nal, 0, sizeof (header_nal)); + + size = sizeof (header_data); + trail_bits = 0; + ret = gst_h264_bit_writer_slice_hdr (&slice_hdr, TRUE, GST_H264_NAL_SLICE, + FALSE, header_data, &size, &trail_bits); + fail_if (ret != GST_H264_BIT_WRITER_OK); + + nal_size = sizeof (header_nal); + ret = gst_h264_bit_writer_convert_to_nal (4, FALSE, TRUE, TRUE, + header_data, size * 8 + trail_bits, header_nal, &nal_size); + fail_if (ret != GST_H264_BIT_WRITER_OK); + fail_if (nal_size < size); + + /* Parse it again */ + res = gst_h264_parser_identify_nalu (parser, header_nal, 0, + sizeof (header_nal), &nalu); + assert_equals_int (res, GST_H264_PARSER_NO_NAL_END); + + res = gst_h264_parser_parse_slice_hdr (parser, &nalu, &slice_parsed, + TRUE, TRUE); + assert_equals_int (res, GST_H264_PARSER_OK); + +#define CHECK_FIELD(FIELD) fail_if(slice_parsed.FIELD != slice_hdr.FIELD) + CHECK_FIELD (first_mb_in_slice); + CHECK_FIELD (type); + CHECK_FIELD (frame_num); + CHECK_FIELD (field_pic_flag); + CHECK_FIELD (bottom_field_flag); + CHECK_FIELD (idr_pic_id); + CHECK_FIELD (pic_order_cnt_lsb); + CHECK_FIELD (delta_pic_order_cnt_bottom); + CHECK_FIELD (direct_spatial_mv_pred_flag); + CHECK_FIELD (num_ref_idx_active_override_flag); + CHECK_FIELD (num_ref_idx_l0_active_minus1); + CHECK_FIELD (num_ref_idx_l1_active_minus1); + CHECK_FIELD (ref_pic_list_modification_flag_l0); + CHECK_FIELD (ref_pic_list_modification_flag_l1); + CHECK_FIELD (dec_ref_pic_marking.no_output_of_prior_pics_flag); + CHECK_FIELD (dec_ref_pic_marking.long_term_reference_flag); + CHECK_FIELD (dec_ref_pic_marking.adaptive_ref_pic_marking_mode_flag); + CHECK_FIELD (cabac_init_idc); + CHECK_FIELD (slice_qp_delta); + CHECK_FIELD (disable_deblocking_filter_idc); + CHECK_FIELD (slice_alpha_c0_offset_div2); + CHECK_FIELD (slice_beta_offset_div2); +#undef CHECK_FIELD + + gst_h264_nal_parser_free (parser); +} + +GST_END_TEST; + +static const guint8 nalu_sps = { + 0x00, 0x00, 0x00, 0x01, 0x27, 0x64, 0x00, 0x32, 0xac, 0x2c, 0xa2, + 0x40, 0x78, 0x02, 0x27, 0xe5, 0xc0, 0x50, 0x80, 0x80, 0x80, 0xa0, + 0x00, 0x00, 0x03, 0x00, 0x20, 0x00, 0x00, 0x07, 0x9d, 0x08, 0x00, + 0x7a, 0x10, 0x00, 0x07, 0xa1, 0x23, 0x7b, 0xdf, 0x07, 0x68, 0x70, + 0xc2, 0x89, 0x80, +}; + +GST_START_TEST (test_h264_bitwriter_sei) +{ + GstH264ParserResult res; + GstH264NalUnit nalu; + GstH264SEIMessage sei_msg = { 0, }; + gboolean ret; + GstH264SPS sps_parsed; + GstH264HRDParams *hrd_param = &sps_parsed.vui_parameters.nal_hrd_parameters; + GstH264NalParser *const parser = gst_h264_nal_parser_new (); + GstH264PicTiming *pic_timing = &sei_msg.payload.pic_timing; + GstH264BufferingPeriod *buf_per = &sei_msg.payload.buffering_period; + GstH264PicTiming *pic_timing_parsed; + GstH264BufferingPeriod *buf_per_parsed; + GArray *msg_array; + GArray *sei_parsed = NULL; + GstH264SEIMessage *sei_msg_parsed; + guint size; + guint size_nal; + guint8 sei_data128 = { 0, }; + guint8 sei_nal128 = { 0, }; + + res = gst_h264_parser_identify_nalu (parser, nalu_sps, 0, sizeof (nalu_sps), + &nalu); + assert_equals_int (res, GST_H264_PARSER_NO_NAL_END); + assert_equals_int (nalu.type, GST_H264_NAL_SPS); + assert_equals_int (nalu.size, 43); + res = gst_h264_parser_parse_sps (parser, &nalu, &sps_parsed); + assert_equals_int (res, GST_H264_PARSER_OK); + + msg_array = g_array_new (FALSE, FALSE, sizeof (GstH264SEIMessage)); + + sei_msg.payloadType = GST_H264_SEI_PIC_TIMING; + pic_timing->CpbDpbDelaysPresentFlag = + sps_parsed.vui_parameters.nal_hrd_parameters_present_flag; + pic_timing->cpb_removal_delay_length_minus1 = + hrd_param->cpb_removal_delay_length_minus1; + pic_timing->dpb_output_delay_length_minus1 = + hrd_param->dpb_output_delay_length_minus1; + pic_timing->cpb_removal_delay = 1020; + pic_timing->dpb_output_delay = 80; + pic_timing->pic_struct_present_flag = 1; + pic_timing->pic_struct = 2; + + pic_timing->clock_timestamp_flag0 = 1; + pic_timing->clock_timestamp_flag1 = 0; + pic_timing->clock_timestamp_flag2 = 0; + + pic_timing->clock_timestamp0.ct_type = GST_H264_CT_TYPE_INTERLACED; + pic_timing->clock_timestamp0.nuit_field_based_flag = 1; + pic_timing->clock_timestamp0.counting_type = 0; + pic_timing->clock_timestamp0.discontinuity_flag = 0; + pic_timing->clock_timestamp0.cnt_dropped_flag = 0; + pic_timing->clock_timestamp0.n_frames = 1; + pic_timing->clock_timestamp0.seconds_flag = 1; + pic_timing->clock_timestamp0.seconds_value = 32; + pic_timing->clock_timestamp0.minutes_flag = 1; + pic_timing->clock_timestamp0.minutes_value = 52; + pic_timing->clock_timestamp0.hours_flag = 1; + pic_timing->clock_timestamp0.hours_value = 8; + pic_timing->clock_timestamp0.full_timestamp_flag = 1; + pic_timing->clock_timestamp0.time_offset = 80; + + pic_timing->time_offset_length = 24; + + g_array_append_val (msg_array, sei_msg); + + memset (&sei_msg, 0, sizeof (sei_msg)); + + sei_msg.payloadType = GST_H264_SEI_BUF_PERIOD; + + buf_per->sps = &sps_parsed; + buf_per->nal_initial_cpb_removal_delay0 = 90021; + buf_per->nal_initial_cpb_removal_delay_offset0 = 90021; + + g_array_append_val (msg_array, sei_msg); + + size = sizeof (sei_data); + ret = gst_h264_bit_writer_sei (msg_array, TRUE, sei_data, &size); + fail_if (ret != GST_H264_BIT_WRITER_OK); + + size_nal = sizeof (sei_nal); + ret = gst_h264_bit_writer_convert_to_nal (4, FALSE, TRUE, FALSE, + sei_data, size * 8, sei_nal, &size_nal); + fail_if (ret != GST_H264_BIT_WRITER_OK); + + /* Parse it again. */ + res = gst_h264_parser_identify_nalu (parser, sei_nal, 0, + sizeof (sei_nal), &nalu); + assert_equals_int (res, GST_H264_PARSER_NO_NAL_END); + + res = gst_h264_parser_parse_sei (parser, &nalu, &sei_parsed); + assert_equals_int (res, GST_H264_PARSER_OK); + assert_equals_int (sei_parsed->len, 2); + + sei_msg_parsed = &g_array_index (sei_parsed, GstH264SEIMessage, 0); + assert_equals_int (sei_msg_parsed->payloadType, GST_H264_SEI_PIC_TIMING); + pic_timing_parsed = &sei_msg_parsed->payload.pic_timing; + pic_timing = + &((g_array_index (msg_array, GstH264SEIMessage, 0)).payload.pic_timing); + +#define CHECK_FIELD(FIELD) fail_if(pic_timing_parsed->FIELD != pic_timing->FIELD) + CHECK_FIELD (CpbDpbDelaysPresentFlag); + CHECK_FIELD (cpb_removal_delay_length_minus1); + CHECK_FIELD (dpb_output_delay_length_minus1); + CHECK_FIELD (cpb_removal_delay); + CHECK_FIELD (dpb_output_delay); + CHECK_FIELD (pic_struct_present_flag); + CHECK_FIELD (pic_struct); + CHECK_FIELD (clock_timestamp_flag0); + CHECK_FIELD (clock_timestamp_flag1); + CHECK_FIELD (clock_timestamp_flag2); + CHECK_FIELD (clock_timestamp0.ct_type); + CHECK_FIELD (clock_timestamp0.nuit_field_based_flag); + CHECK_FIELD (clock_timestamp0.counting_type); + CHECK_FIELD (clock_timestamp0.discontinuity_flag); + CHECK_FIELD (clock_timestamp0.cnt_dropped_flag); + CHECK_FIELD (clock_timestamp0.n_frames); + CHECK_FIELD (clock_timestamp0.seconds_flag); + CHECK_FIELD (clock_timestamp0.seconds_value); + CHECK_FIELD (clock_timestamp0.minutes_flag); + CHECK_FIELD (clock_timestamp0.minutes_value); + CHECK_FIELD (clock_timestamp0.hours_flag); + CHECK_FIELD (clock_timestamp0.hours_value); + CHECK_FIELD (clock_timestamp0.full_timestamp_flag); + CHECK_FIELD (clock_timestamp0.time_offset); +#undef CHECK_FIELD + + sei_msg_parsed = &g_array_index (sei_parsed, GstH264SEIMessage, 1); + assert_equals_int (sei_msg_parsed->payloadType, GST_H264_SEI_BUF_PERIOD); + buf_per_parsed = &sei_msg_parsed->payload.buffering_period; + buf_per = &((g_array_index (msg_array, GstH264SEIMessage, + 1)).payload.buffering_period); + + fail_if (buf_per_parsed->nal_initial_cpb_removal_delay0 != + buf_per->nal_initial_cpb_removal_delay0); + fail_if (buf_per_parsed->nal_initial_cpb_removal_delay_offset0 != + buf_per->nal_initial_cpb_removal_delay_offset0); + + g_array_unref (sei_parsed); + g_array_unref (msg_array); + gst_h264_nal_parser_free (parser); +} + +GST_END_TEST; + +static Suite * +h264bitwriter_suite (void) +{ + Suite *s = suite_create ("H264 bitwriter library"); + + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_h264_bitwriter_sps_pps_slice_hdr); + tcase_add_test (tc_chain, test_h264_bitwriter_sei); + + return s; +} + +GST_CHECK_MAIN (h264bitwriter);
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/libs/h264parser.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/libs/h264parser.c
Changed
@@ -714,6 +714,117 @@ GST_END_TEST; +static guint8 h264_avc_codec_data = { + 0x01, 0x4d, 0x40, 0x15, 0xff, 0xe1, 0x00, 0x17, + 0x67, 0x4d, 0x40, 0x15, 0xec, 0xa4, 0xbf, 0x2e, + 0x02, 0x20, 0x00, 0x00, 0x03, 0x00, 0x2e, 0xe6, + 0xb2, 0x80, 0x01, 0xe2, 0xc5, 0xb2, 0xc0, 0x01, + 0x00, 0x04, 0x68, 0xeb, 0xec, 0xb2 +}; + +/* *INDENT-OFF* */ +static guint8 h264_avc3_codec_data = { + 0x01, /* config version, always == 1 */ + 0x4d, /* profile */ + 0x40, /* profile compatibility */ + 0x15, /* level */ + 0xff, /* 6 reserved bits, lengthSizeMinusOne */ + 0xe0, /* 3 reserved bits, numSPS */ + 0x00 /* numPPS */ +}; + +static guint8 h264_wrong_version_codec_data = { + 0x00, /* config version, wrong value 0 */ + 0x4d, /* profile */ + 0x40, /* profile compatibility */ + 0x15, /* level */ + 0xff, /* 6 reserved bits, lengthSizeMinusOne */ + 0xe0, /* 3 reserved bits, numSPS */ + 0x00 /* numPPS */ +}; + +static guint8 h264_wrong_length_size_codec_data = { + 0x01, /* config version, always == 1 */ + 0x4d, /* profile */ + 0x40, /* profile compatibility */ + 0x15, /* level */ + 0xfe, /* 6 reserved bits, invalid lengthSizeMinusOne 3 */ + 0xe0, /* 3 reserved bits, numSPS */ + 0x00 /* numPPS */ +}; +/* *INDENT-ON* */ + +GST_START_TEST (test_h264_decoder_config_record) +{ + GstH264NalParser *parser; + GstH264ParserResult ret; + GstH264DecoderConfigRecord *config = NULL; + GstH264SPS sps; + GstH264PPS pps; + GstH264NalUnit *nalu; + + parser = gst_h264_nal_parser_new (); + + /* avc */ + ret = gst_h264_parser_parse_decoder_config_record (parser, + h264_avc_codec_data, sizeof (h264_avc_codec_data), &config); + assert_equals_int (ret, GST_H264_PARSER_OK); + fail_unless (config != NULL); + assert_equals_int (config->configuration_version, 1); + assert_equals_int (config->length_size_minus_one, 3); + + assert_equals_int (config->sps->len, 1); + nalu = &g_array_index (config->sps, GstH264NalUnit, 0); + assert_equals_int (nalu->type, GST_H264_NAL_SPS); + ret = gst_h264_parser_parse_sps (parser, nalu, &sps); + assert_equals_int (ret, GST_H264_PARSER_OK); + gst_h264_sps_clear (&sps); + + assert_equals_int (config->pps->len, 1); + nalu = &g_array_index (config->pps, GstH264NalUnit, 0); + assert_equals_int (nalu->type, GST_H264_NAL_PPS); + ret = gst_h264_parser_parse_pps (parser, nalu, &pps); + assert_equals_int (ret, GST_H264_PARSER_OK); + gst_h264_pps_clear (&pps); + g_clear_pointer (&config, gst_h264_decoder_config_record_free); + + /* avc3 */ + ret = gst_h264_parser_parse_decoder_config_record (parser, + h264_avc3_codec_data, sizeof (h264_avc3_codec_data), &config); + assert_equals_int (ret, GST_H264_PARSER_OK); + fail_unless (config != NULL); + + assert_equals_int (config->configuration_version, 1); + assert_equals_int (config->length_size_minus_one, 3); + assert_equals_int (config->sps->len, 0); + assert_equals_int (config->pps->len, 0); + g_clear_pointer (&config, gst_h264_decoder_config_record_free); + + /* avc3 wrong size, return error with null config data */ + ret = gst_h264_parser_parse_decoder_config_record (parser, + h264_avc3_codec_data, sizeof (h264_avc3_codec_data) - 1, &config); + assert_equals_int (ret, GST_H264_PARSER_ERROR); + fail_unless (config == NULL); + + /* wrong version, return error with null config data */ + ret = gst_h264_parser_parse_decoder_config_record (parser, + h264_wrong_version_codec_data, sizeof (h264_wrong_version_codec_data), + &config); + assert_equals_int (ret, GST_H264_PARSER_ERROR); + fail_unless (config == NULL); + + /* wrong length size, return error with null config data */ + ret = gst_h264_parser_parse_decoder_config_record (parser, + h264_wrong_length_size_codec_data, + sizeof (h264_wrong_length_size_codec_data), &config); + assert_equals_int (ret, GST_H264_PARSER_ERROR); + fail_unless (config == NULL); + + gst_h264_nal_parser_free (parser); +} + +GST_END_TEST; + static Suite * h264parser_suite (void) { @@ -728,6 +839,7 @@ tcase_add_test (tc_chain, test_h264_parse_identify_nalu_avc); tcase_add_test (tc_chain, test_h264_parse_invalid_sei); tcase_add_test (tc_chain, test_h264_create_sei); + tcase_add_test (tc_chain, test_h264_decoder_config_record); return s; }
View file
gst-plugins-bad-1.22.0.tar.xz/tests/check/libs/h265bitwriter.c
Added
@@ -0,0 +1,963 @@ +/* GStreamer + * Copyright (C) 2022 Intel Corporation + * Author: He Junyan <junyan.he@intel.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the0 + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include <gst/check/gstcheck.h> +#include <gst/codecparsers/gsth265bitwriter.h> + +#define DEFAULT_SCALING_LIST0 \ + { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 } +#define SCALING_LIST0_4x4_0 \ + { 7, 8, 12, 25, 16, 22, 17, 17, 16, 18, 26, 26, 26, 26, 26, 26 } +#define SCALING_LIST0_4x4_1 \ + { 9, 8, 12, 25, 16, 22, 27, 17, 16, 38, 36, 26, 36, 26, 36, 26 } + +#define DEFAULT_SCALING_LIST1 \ + { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 16, \ + 17, 16, 17, 18, 17, 18, 18, 17, 18, 21, 19, 20, \ + 21, 20, 19, 21, 24, 22, 22, 24, 24, 22, 22, 24, \ + 25, 25, 27, 30, 27, 25, 25, 29, 31, 35, 35, 31, \ + 29, 36, 41, 44, 41, 36, 47, 54, 54, 47, 65, 70, \ + 65, 88, 88, 115 } +#define DEFAULT_SCALING_LIST2 \ + { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, \ + 17, 17, 17, 18, 18, 18, 18, 18, 18, 20, 20, 20, \ + 20, 20, 20, 20, 24, 24, 24, 24, 24, 24, 24, 24, \ + 25, 25, 25, 25, 25, 25, 25, 28, 28, 28, 28, 28, \ + 28, 33, 33, 33, 33, 33, 41, 41, 41, 41, 54, 54, \ + 54, 71, 71, 91 } +#define SCALING_LIST_16x16_0 \ + { 18, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, \ + 17, 17, 17, 18, 18, 18, 18, 18, 18, 20, 20, 20, \ + 21, 20, 20, 20, 24, 24, 27, 24, 24, 24, 24, 25, \ + 25, 25, 25, 25, 25, 25, 23, 28, 28, 28, 28, 28, \ + 28, 33, 33, 33, 33, 33, 21, 21, 51, 51, 54, 54, \ + 54, 88, 71, 81 } +#define SCALING_LIST_16x16_1 \ + { 10, 10, 16, 16, 16, 16, 16, 16, 16, 16, 17, 12, \ + 17, 16, 17, 18, 17, 18, 18, 17, 18, 21, 19, 20, \ + 21, 22, 39, 21, 24, 22, 22, 14, 14, 18, 22, 32, \ + 25, 25, 27, 30, 27, 21, 25, 29, 31, 35, 35, 31, \ + 29, 36, 41, 64, 41, 56, 43, 54, 54, 47, 65, 70, \ + 65, 88, 105, 115 } + +/* *INDENT-OFF* */ +static const GstH265VPS vps = { + .id = 1, + .base_layer_internal_flag = 1, + .base_layer_available_flag = 1, + .max_layers_minus1 = 0, + .max_sub_layers_minus1 = 0, + .temporal_id_nesting_flag = 1, + + .profile_tier_level = { + .profile_space = 0, + .tier_flag = 0, + .profile_idc = 4, + .profile_compatibility_flag = { 0, 0, 0, 0, 1, }, + + .progressive_source_flag = 1, + .interlaced_source_flag = 0, + .non_packed_constraint_flag = 1, + .frame_only_constraint_flag = 1, + + .max_12bit_constraint_flag = 1, + .max_10bit_constraint_flag = 1, + .max_8bit_constraint_flag = 0, + .max_422chroma_constraint_flag = 1, + .max_420chroma_constraint_flag = 0, + .max_monochrome_constraint_flag = 0, + .intra_constraint_flag = 0, + .one_picture_only_constraint_flag = 0, + .lower_bit_rate_constraint_flag = 1, + + .level_idc = 123, + + .sub_layer_profile_present_flag = { 0, }, + .sub_layer_level_present_flag = { 0, }, + }, + + .sub_layer_ordering_info_present_flag = 1, + .max_dec_pic_buffering_minus1 = { 5, }, + .max_num_reorder_pics = { 2, }, + .max_latency_increase_plus1 = { 0, }, + + .max_layer_id = 0, + .num_layer_sets_minus1 = 0, + + .timing_info_present_flag = 1, + .num_units_in_tick = 1001, + .time_scale = 60000, + .poc_proportional_to_timing_flag = 1, + .num_ticks_poc_diff_one_minus1 = 0, + + .num_hrd_parameters = 1, + .hrd_layer_set_idx = 0, + .cprms_present_flag = 1, + .hrd_params = { + .nal_hrd_parameters_present_flag = 0, + .vcl_hrd_parameters_present_flag = 1, + .sub_pic_hrd_params_present_flag = 0, + + .bit_rate_scale = 0, + .cpb_size_scale = 0, + .cpb_size_du_scale = 0, + + .initial_cpb_removal_delay_length_minus1 = 23, + .au_cpb_removal_delay_length_minus1 = 21, + .dpb_output_delay_length_minus1 = 23, + + .fixed_pic_rate_general_flag = { 1, }, + .fixed_pic_rate_within_cvs_flag = { 1, }, + + .elemental_duration_in_tc_minus1 = { 0, }, + .low_delay_hrd_flag = { 0, }, + .cpb_cnt_minus1 = { 0, }, + + .sublayer_hrd_params = { + { .bit_rate_value_minus1 = { 0, }, + .cpb_size_value_minus1 = { 0, }, + .cpb_size_du_value_minus1 = { 0, }, + .bit_rate_du_value_minus1 = { 0, }, + .cbr_flag = { 1, }, + }, + } + }, + + .vps_extension = 0, +}; + +static const GstH265SPS sps = { + .id = 2, + .max_sub_layers_minus1 = 0, + .temporal_id_nesting_flag = 1, + + .profile_tier_level = { + .profile_space = 0, + .tier_flag = 0, + .profile_idc = 4, + .profile_compatibility_flag = { 0, 0, 0, 0, 1, }, + + .progressive_source_flag = 1, + .interlaced_source_flag = 0, + .non_packed_constraint_flag = 1, + .frame_only_constraint_flag = 1, + + .max_12bit_constraint_flag = 1, + .max_10bit_constraint_flag = 1, + .max_8bit_constraint_flag = 0, + .max_422chroma_constraint_flag = 1, + .max_420chroma_constraint_flag = 0, + .max_monochrome_constraint_flag = 0, + .intra_constraint_flag = 0, + .one_picture_only_constraint_flag = 0, + .lower_bit_rate_constraint_flag = 1, + + .level_idc = 123, + + .sub_layer_profile_present_flag = { 0, }, + .sub_layer_level_present_flag = { 0, }, + }, + + .chroma_format_idc = 2, + .pic_width_in_luma_samples = 192, + .pic_height_in_luma_samples = 256, + .conformance_window_flag = 1, + .conf_win_left_offset = 0, + .conf_win_right_offset = 8, + .conf_win_top_offset = 0, + .conf_win_bottom_offset = 56, + .bit_depth_luma_minus8 = 0, + .bit_depth_chroma_minus8 = 0, + .log2_max_pic_order_cnt_lsb_minus4 = 4, + + .sub_layer_ordering_info_present_flag = 1, + .max_dec_pic_buffering_minus1 = { 5, }, + .max_num_reorder_pics = { 2, }, + .max_latency_increase_plus1 = { 0, }, + + .log2_min_luma_coding_block_size_minus3 = 2, + .log2_diff_max_min_luma_coding_block_size = 1, + .log2_min_transform_block_size_minus2 = 0, + .log2_diff_max_min_transform_block_size = 3, + .max_transform_hierarchy_depth_inter = 3, + .max_transform_hierarchy_depth_intra = 3, + + .scaling_list_enabled_flag = 1, + .scaling_list_data_present_flag = 1, + + /* Set it manually. */ + .scaling_list = { + .scaling_list_dc_coef_minus8_16x16 = { 8, 15, 9, 12, 18, 8 }, + .scaling_list_dc_coef_minus8_32x32 = { 8, 6 }, + + .scaling_lists_4x4 = { + SCALING_LIST0_4x4_0, + DEFAULT_SCALING_LIST0, + SCALING_LIST0_4x4_1, + DEFAULT_SCALING_LIST0, + SCALING_LIST0_4x4_0, + SCALING_LIST0_4x4_1 + }, + .scaling_lists_8x8 = { + DEFAULT_SCALING_LIST1, + SCALING_LIST_16x16_0, + SCALING_LIST_16x16_0, + DEFAULT_SCALING_LIST2, + SCALING_LIST_16x16_1, + SCALING_LIST_16x16_0 + }, + .scaling_lists_16x16 = { + DEFAULT_SCALING_LIST1, + SCALING_LIST_16x16_0, + DEFAULT_SCALING_LIST1, + DEFAULT_SCALING_LIST2, + SCALING_LIST_16x16_1, + DEFAULT_SCALING_LIST2 + }, + .scaling_lists_32x32 = { + DEFAULT_SCALING_LIST1, + DEFAULT_SCALING_LIST2 + } + }, + + .amp_enabled_flag = 1, + .sample_adaptive_offset_enabled_flag = 1, + .pcm_enabled_flag = 1, + .pcm_sample_bit_depth_luma_minus1 = 7, + .pcm_sample_bit_depth_chroma_minus1 = 7, + .log2_min_pcm_luma_coding_block_size_minus3 = 2, + .log2_diff_max_min_pcm_luma_coding_block_size = 0, + .pcm_loop_filter_disabled_flag = 0, + + .num_short_term_ref_pic_sets = 3, + .short_term_ref_pic_set = { + { + .inter_ref_pic_set_prediction_flag = 0, + .NumDeltaPocs = 1, + + .NumNegativePics = 0, + .DeltaPocS0 = { 0, }, + .UsedByCurrPicS0 = { 0, }, + + .NumPositivePics = 1, + .DeltaPocS1 = { 3, }, + .UsedByCurrPicS1 = { 1, }, + }, + { + .inter_ref_pic_set_prediction_flag = 0, + .NumDeltaPocs = 3, + + .NumNegativePics = 2, + .DeltaPocS0 = { -1, -3, }, + .UsedByCurrPicS0 = { 1, 1, }, + + .NumPositivePics = 1, + .DeltaPocS1 = { 2, }, + .UsedByCurrPicS1 = { 1, }, + }, + { + .inter_ref_pic_set_prediction_flag = 0, + .NumDeltaPocs = 5, + + .NumNegativePics = 3, + .DeltaPocS0 = { -1, -2, -4, }, + .UsedByCurrPicS0 = { 1, 0, 1, }, + + .NumPositivePics = 2, + .DeltaPocS1 = { 2, 7, }, + .UsedByCurrPicS1 = { 0, 1, }, + }, + }, + + .long_term_ref_pics_present_flag = 0, + + .temporal_mvp_enabled_flag = 1, + .strong_intra_smoothing_enabled_flag = 0, + + .vui_parameters_present_flag = 1, + .vui_params = { + .aspect_ratio_info_present_flag = 0, + + .overscan_info_present_flag = 1, + .overscan_appropriate_flag = 0, + .video_signal_type_present_flag = 1, + .video_format = 5, + .video_full_range_flag = 0, + .colour_description_present_flag = 0, + + .chroma_loc_info_present_flag = 1, + .chroma_sample_loc_type_top_field = 0, + .chroma_sample_loc_type_bottom_field = 0, + + .neutral_chroma_indication_flag = 0, + .field_seq_flag = 0, + .frame_field_info_present_flag = 0, + .default_display_window_flag = 1, + .def_disp_win_left_offset = 0, + .def_disp_win_right_offset = 0, + .def_disp_win_top_offset = 0, + .def_disp_win_bottom_offset = 56, + + .timing_info_present_flag = 1, + .num_units_in_tick = 1, + .time_scale = 60, + + .poc_proportional_to_timing_flag = 0, + + .hrd_parameters_present_flag = 1, + .hrd_params = { + .nal_hrd_parameters_present_flag = 0, + .vcl_hrd_parameters_present_flag = 1, + .sub_pic_hrd_params_present_flag = 0, + + .bit_rate_scale = 0, + .cpb_size_scale = 0, + + .initial_cpb_removal_delay_length_minus1 = 31, + .au_cpb_removal_delay_length_minus1 = 23, + .dpb_output_delay_length_minus1 = 23, + + .fixed_pic_rate_general_flag = { 1, }, + .fixed_pic_rate_within_cvs_flag = { 1, }, + .elemental_duration_in_tc_minus1 = { 0, }, + .cpb_cnt_minus1 = { 0, }, + + .sublayer_hrd_params = { + { + .bit_rate_value_minus1 = { 108353, }, + .cpb_size_value_minus1 = { 1602517, }, + .cbr_flag = { 1, }, + }, + } + }, + + .bitstream_restriction_flag = 1, + .tiles_fixed_structure_flag = 0, + .motion_vectors_over_pic_boundaries_flag = 1, + .restricted_ref_pic_lists_flag = 0, + .min_spatial_segmentation_idc = 0, + .max_bytes_per_pic_denom = 0, + .max_bits_per_min_cu_denom = 0, + .log2_max_mv_length_horizontal = 15, + .log2_max_mv_length_vertical = 15, + }, + + .sps_extension_flag = 1, + .sps_range_extension_flag = 1, + .sps_multilayer_extension_flag = 0, + .sps_3d_extension_flag = 0, + .sps_scc_extension_flag = 0, + + .sps_extension_params = { + .transform_skip_rotation_enabled_flag = 0, + .transform_skip_context_enabled_flag = 0, + .implicit_rdpcm_enabled_flag = 0, + .explicit_rdpcm_enabled_flag = 0, + .extended_precision_processing_flag = 0, + .intra_smoothing_disabled_flag = 0, + .high_precision_offsets_enabled_flag = 0, + .persistent_rice_adaptation_enabled_flag = 0, + .cabac_bypass_alignment_enabled_flag = 0, + }, + + .vps = (GstH265VPS *) &vps, +}; + +static const GstH265PPS pps = { + .id = 1, + .dependent_slice_segments_enabled_flag = 1, + .output_flag_present_flag = 0, + .num_extra_slice_header_bits = 0, + .sign_data_hiding_enabled_flag = 1, + .cabac_init_present_flag = 0, + .num_ref_idx_l0_default_active_minus1 = 9, + .num_ref_idx_l1_default_active_minus1 = 4, + .init_qp_minus26 = -13, + .constrained_intra_pred_flag = 0, + .transform_skip_enabled_flag = 1, + .cu_qp_delta_enabled_flag = 1, + .diff_cu_qp_delta_depth = 0, + .cb_qp_offset = 4, + .cr_qp_offset = 5, + .slice_chroma_qp_offsets_present_flag = 0, + .weighted_pred_flag = 1, + .weighted_bipred_flag = 0, + .transquant_bypass_enabled_flag = 0, + .tiles_enabled_flag = 1, + .entropy_coding_sync_enabled_flag = 0, + .num_tile_columns_minus1 = 1, + .num_tile_rows_minus1 = 2, + .uniform_spacing_flag = 0, + .column_width_minus1 = { 2, }, + .row_height_minus1 = { 1, 0 }, + .loop_filter_across_tiles_enabled_flag = 1, + .loop_filter_across_slices_enabled_flag = 1, + .deblocking_filter_control_present_flag = 1, + .deblocking_filter_override_enabled_flag = 1, + .deblocking_filter_disabled_flag = 0, + .beta_offset_div2 = 3, + .tc_offset_div2 = 6, + + .scaling_list_data_present_flag = 1, + .scaling_list = { + .scaling_list_dc_coef_minus8_16x16 = { 8, 8, 7, 15, 12, 8 }, + .scaling_list_dc_coef_minus8_32x32 = { 8, 6 }, + + .scaling_lists_4x4 = { + DEFAULT_SCALING_LIST0, + SCALING_LIST0_4x4_0, + SCALING_LIST0_4x4_1, + SCALING_LIST0_4x4_1, + SCALING_LIST0_4x4_0, + DEFAULT_SCALING_LIST0, + }, + .scaling_lists_8x8 = { + DEFAULT_SCALING_LIST1, + SCALING_LIST_16x16_0, + SCALING_LIST_16x16_0, + SCALING_LIST_16x16_1, + DEFAULT_SCALING_LIST2, + SCALING_LIST_16x16_0 + }, + .scaling_lists_16x16 = { + SCALING_LIST_16x16_1, + DEFAULT_SCALING_LIST1, + SCALING_LIST_16x16_0, + SCALING_LIST_16x16_1, + DEFAULT_SCALING_LIST2, + SCALING_LIST_16x16_1, + }, + .scaling_lists_32x32 = { + DEFAULT_SCALING_LIST1, + SCALING_LIST_16x16_0, + } + }, + + .lists_modification_present_flag = 0, + .log2_parallel_merge_level_minus2 = 3, + .slice_segment_header_extension_present_flag = 0, + .pps_extension_flag = 1, + .pps_range_extension_flag = 1, + .pps_multilayer_extension_flag = 0, + .pps_3d_extension_flag = 0, + .pps_scc_extension_flag = 0, + + .pps_extension_params = { + .log2_max_transform_skip_block_size_minus2 = 0, + .cross_component_prediction_enabled_flag = 0, + .chroma_qp_offset_list_enabled_flag = 1, + .diff_cu_chroma_qp_offset_depth = 1, + .chroma_qp_offset_list_len_minus1 = 5, + .cb_qp_offset_list = { -2, -7, -1, 3, 4, 1 }, + .cr_qp_offset_list = { -2, 6, 5, 6, 8, 9 }, + .log2_sao_offset_scale_luma = 0, + .log2_sao_offset_scale_chroma = 0, + }, + + .sps = (GstH265SPS *) &sps, +}; + +static const GstH265SliceHdr slice_hdr = { + .first_slice_segment_in_pic_flag = 1, + .type = 0, + .pic_order_cnt_lsb = 53, + .short_term_ref_pic_set_sps_flag = 1, + .short_term_ref_pic_set_idx = 2, + .temporal_mvp_enabled_flag = 1, + .sao_luma_flag = 1, + .sao_chroma_flag = 1, + .num_ref_idx_active_override_flag = 1, + .num_ref_idx_l0_active_minus1 = 3, + .num_ref_idx_l1_active_minus1 = 2, + .mvd_l1_zero_flag = 0, + .collocated_ref_idx = 1, + .five_minus_max_num_merge_cand = 1, + .qp_delta = 24, + .cu_chroma_qp_offset_enabled_flag = 0, + .deblocking_filter_override_flag = 1, + .deblocking_filter_disabled_flag = 0, + .beta_offset_div2 = 5, + .tc_offset_div2 = -1, + .num_entry_point_offsets = 0, + + .pps = (GstH265PPS *) &pps, +}; +/* *INDENT-ON* */ + +GST_START_TEST (test_h265_bitwriter_vps_sps_pps_slice_hdr) +{ + GstH265ParserResult res; + gboolean ret; + GstH265NalUnit nalu; + GstH265Parser *const parser = gst_h265_parser_new (); + GstH265VPS vps_parsed; + GstH265SPS sps_parsed; + GstH265PPS pps_parsed; + GstH265SliceHdr slice_parsed; + guint8 header_data2048 = { 0, }; + guint8 header_nal2048 = { 0, }; + guint size; + guint32 nal_size; + guint i, j; + + size = sizeof (header_data); + ret = gst_h265_bit_writer_vps (&vps, TRUE, header_data, &size); + fail_if (ret != GST_H265_BIT_WRITER_OK); + + nal_size = sizeof (header_nal); + ret = gst_h265_bit_writer_convert_to_nal (4, FALSE, TRUE, FALSE, + header_data, size * 8, header_nal, &nal_size); + fail_if (ret != GST_H265_BIT_WRITER_OK); + fail_if (nal_size < size); + + /* Parse it again */ + res = gst_h265_parser_identify_nalu (parser, header_nal, 0, + sizeof (header_nal), &nalu); + assert_equals_int (res, GST_H265_PARSER_NO_NAL_END); + + res = gst_h265_parser_parse_vps (parser, &nalu, &vps_parsed); + assert_equals_int (res, GST_H265_PARSER_OK); + + /* We can not do simply memcmp, the parser may set some default + value for the fields which are not used for writing. */ +#define CHECK_FIELD(FIELD) fail_if(vps_parsed.FIELD != vps.FIELD) + CHECK_FIELD (id); + CHECK_FIELD (base_layer_internal_flag); + CHECK_FIELD (base_layer_available_flag); + CHECK_FIELD (max_layers_minus1); + CHECK_FIELD (max_sub_layers_minus1); + CHECK_FIELD (temporal_id_nesting_flag); + CHECK_FIELD (profile_tier_level.profile_space); + CHECK_FIELD (profile_tier_level.tier_flag); + CHECK_FIELD (profile_tier_level.profile_idc); + CHECK_FIELD (profile_tier_level.profile_compatibility_flag0); + CHECK_FIELD (profile_tier_level.profile_compatibility_flag1); + CHECK_FIELD (profile_tier_level.profile_compatibility_flag2); + CHECK_FIELD (profile_tier_level.profile_compatibility_flag3); + CHECK_FIELD (profile_tier_level.profile_compatibility_flag4); + CHECK_FIELD (profile_tier_level.profile_compatibility_flag5); + CHECK_FIELD (profile_tier_level.progressive_source_flag); + CHECK_FIELD (profile_tier_level.interlaced_source_flag); + CHECK_FIELD (profile_tier_level.non_packed_constraint_flag); + CHECK_FIELD (profile_tier_level.frame_only_constraint_flag); + CHECK_FIELD (profile_tier_level.max_12bit_constraint_flag); + CHECK_FIELD (profile_tier_level.max_10bit_constraint_flag); + CHECK_FIELD (profile_tier_level.max_8bit_constraint_flag); + CHECK_FIELD (profile_tier_level.max_422chroma_constraint_flag); + CHECK_FIELD (profile_tier_level.max_420chroma_constraint_flag); + CHECK_FIELD (profile_tier_level.max_monochrome_constraint_flag); + CHECK_FIELD (profile_tier_level.intra_constraint_flag); + CHECK_FIELD (profile_tier_level.one_picture_only_constraint_flag); + CHECK_FIELD (profile_tier_level.lower_bit_rate_constraint_flag); + CHECK_FIELD (profile_tier_level.level_idc); + CHECK_FIELD (sub_layer_ordering_info_present_flag); + CHECK_FIELD (max_dec_pic_buffering_minus10); + CHECK_FIELD (max_num_reorder_pics0); + CHECK_FIELD (max_latency_increase_plus10); + CHECK_FIELD (max_layer_id); + CHECK_FIELD (num_layer_sets_minus1); + CHECK_FIELD (timing_info_present_flag); + CHECK_FIELD (num_units_in_tick); + CHECK_FIELD (time_scale); + CHECK_FIELD (poc_proportional_to_timing_flag); + CHECK_FIELD (num_ticks_poc_diff_one_minus1); + CHECK_FIELD (num_hrd_parameters); + CHECK_FIELD (hrd_layer_set_idx); + CHECK_FIELD (cprms_present_flag); + CHECK_FIELD (hrd_params.nal_hrd_parameters_present_flag); + CHECK_FIELD (hrd_params.vcl_hrd_parameters_present_flag); + CHECK_FIELD (hrd_params.sub_pic_hrd_params_present_flag); + CHECK_FIELD (hrd_params.bit_rate_scale); + CHECK_FIELD (hrd_params.cpb_size_scale); + CHECK_FIELD (hrd_params.cpb_size_du_scale); + CHECK_FIELD (hrd_params.initial_cpb_removal_delay_length_minus1); + CHECK_FIELD (hrd_params.au_cpb_removal_delay_length_minus1); + CHECK_FIELD (hrd_params.dpb_output_delay_length_minus1); + CHECK_FIELD (hrd_params.fixed_pic_rate_general_flag0); + CHECK_FIELD (hrd_params.fixed_pic_rate_within_cvs_flag0); + CHECK_FIELD (hrd_params.elemental_duration_in_tc_minus10); + CHECK_FIELD (hrd_params.low_delay_hrd_flag0); + CHECK_FIELD (hrd_params.cpb_cnt_minus10); + CHECK_FIELD (hrd_params.sublayer_hrd_params0.bit_rate_value_minus10); + CHECK_FIELD (hrd_params.sublayer_hrd_params0.cpb_size_value_minus10); + CHECK_FIELD (hrd_params.sublayer_hrd_params0.cpb_size_du_value_minus10); + CHECK_FIELD (hrd_params.sublayer_hrd_params0.bit_rate_du_value_minus10); + CHECK_FIELD (hrd_params.sublayer_hrd_params0.cbr_flag0); + CHECK_FIELD (vps_extension); +#undef CHECK_FIELD + + memset (header_data, 0, sizeof (header_data)); + memset (header_nal, 0, sizeof (header_nal)); + + size = sizeof (header_data); + ret = gst_h265_bit_writer_sps (&sps, TRUE, header_data, &size); + fail_if (ret != GST_H265_BIT_WRITER_OK); + + nal_size = sizeof (header_nal); + ret = gst_h265_bit_writer_convert_to_nal (4, FALSE, TRUE, FALSE, + header_data, size * 8, header_nal, &nal_size); + fail_if (ret != GST_H265_BIT_WRITER_OK); + fail_if (nal_size < size); + + /* Parse it again */ + res = gst_h265_parser_identify_nalu (parser, header_nal, 0, + sizeof (header_nal), &nalu); + assert_equals_int (res, GST_H265_PARSER_NO_NAL_END); + + res = gst_h265_parser_parse_sps (parser, &nalu, &sps_parsed, TRUE); + assert_equals_int (res, GST_H265_PARSER_OK); + +#define CHECK_FIELD(FIELD) fail_if(sps_parsed.FIELD != sps.FIELD) + CHECK_FIELD (id); + CHECK_FIELD (max_sub_layers_minus1); + CHECK_FIELD (temporal_id_nesting_flag); + CHECK_FIELD (profile_tier_level.profile_space); + CHECK_FIELD (profile_tier_level.tier_flag); + CHECK_FIELD (profile_tier_level.profile_idc); + CHECK_FIELD (profile_tier_level.profile_compatibility_flag0); + CHECK_FIELD (profile_tier_level.profile_compatibility_flag1); + CHECK_FIELD (profile_tier_level.profile_compatibility_flag2); + CHECK_FIELD (profile_tier_level.profile_compatibility_flag3); + CHECK_FIELD (profile_tier_level.profile_compatibility_flag4); + CHECK_FIELD (profile_tier_level.profile_compatibility_flag5); + CHECK_FIELD (profile_tier_level.progressive_source_flag); + CHECK_FIELD (profile_tier_level.interlaced_source_flag); + CHECK_FIELD (profile_tier_level.non_packed_constraint_flag); + CHECK_FIELD (profile_tier_level.frame_only_constraint_flag); + CHECK_FIELD (profile_tier_level.max_12bit_constraint_flag); + CHECK_FIELD (profile_tier_level.max_10bit_constraint_flag); + CHECK_FIELD (profile_tier_level.max_8bit_constraint_flag); + CHECK_FIELD (profile_tier_level.max_422chroma_constraint_flag); + CHECK_FIELD (profile_tier_level.max_420chroma_constraint_flag); + CHECK_FIELD (profile_tier_level.max_monochrome_constraint_flag); + CHECK_FIELD (profile_tier_level.intra_constraint_flag); + CHECK_FIELD (profile_tier_level.one_picture_only_constraint_flag); + CHECK_FIELD (profile_tier_level.lower_bit_rate_constraint_flag); + CHECK_FIELD (profile_tier_level.level_idc); + CHECK_FIELD (chroma_format_idc); + CHECK_FIELD (pic_width_in_luma_samples); + CHECK_FIELD (pic_height_in_luma_samples); + CHECK_FIELD (conformance_window_flag); + CHECK_FIELD (conf_win_left_offset); + CHECK_FIELD (conf_win_right_offset); + CHECK_FIELD (conf_win_top_offset); + CHECK_FIELD (conf_win_bottom_offset); + CHECK_FIELD (bit_depth_luma_minus8); + CHECK_FIELD (bit_depth_chroma_minus8); + CHECK_FIELD (log2_max_pic_order_cnt_lsb_minus4); + CHECK_FIELD (sub_layer_ordering_info_present_flag); + CHECK_FIELD (max_dec_pic_buffering_minus10); + CHECK_FIELD (max_num_reorder_pics0); + CHECK_FIELD (max_latency_increase_plus10); + CHECK_FIELD (log2_min_luma_coding_block_size_minus3); + CHECK_FIELD (log2_diff_max_min_luma_coding_block_size); + CHECK_FIELD (log2_min_transform_block_size_minus2); + CHECK_FIELD (log2_diff_max_min_transform_block_size); + CHECK_FIELD (max_transform_hierarchy_depth_inter); + CHECK_FIELD (max_transform_hierarchy_depth_intra); + CHECK_FIELD (scaling_list_enabled_flag); + CHECK_FIELD (scaling_list_data_present_flag); + + for (i = 0; i < 6; i++) + CHECK_FIELD (scaling_list.scaling_list_dc_coef_minus8_16x16i); + for (i = 0; i < 2; i++) + CHECK_FIELD (scaling_list.scaling_list_dc_coef_minus8_32x32i); + for (i = 0; i < 6; i++) { + for (j = 0; j < 16; j++) + CHECK_FIELD (scaling_list.scaling_lists_4x4ij); + } + for (i = 0; i < 6; i++) { + for (j = 0; j < 64; j++) + CHECK_FIELD (scaling_list.scaling_lists_8x8ij); + } + for (i = 0; i < 6; i++) { + for (j = 0; j < 64; j++) + CHECK_FIELD (scaling_list.scaling_lists_16x16ij); + } + for (i = 0; i < 2; i++) { + for (j = 0; j < 64; j++) + CHECK_FIELD (scaling_list.scaling_lists_32x32ij); + } + + CHECK_FIELD (amp_enabled_flag); + CHECK_FIELD (sample_adaptive_offset_enabled_flag); + CHECK_FIELD (pcm_enabled_flag); + CHECK_FIELD (pcm_sample_bit_depth_luma_minus1); + CHECK_FIELD (pcm_sample_bit_depth_chroma_minus1); + CHECK_FIELD (log2_min_pcm_luma_coding_block_size_minus3); + CHECK_FIELD (log2_diff_max_min_pcm_luma_coding_block_size); + CHECK_FIELD (pcm_loop_filter_disabled_flag); + CHECK_FIELD (num_short_term_ref_pic_sets); + + for (i = 0; i < 3; i++) { + CHECK_FIELD (short_term_ref_pic_seti.inter_ref_pic_set_prediction_flag); + CHECK_FIELD (short_term_ref_pic_seti.NumDeltaPocs); + CHECK_FIELD (short_term_ref_pic_seti.NumNegativePics); + for (j = 0; j < sps_parsed.short_term_ref_pic_seti.NumNegativePics; j++) { + CHECK_FIELD (short_term_ref_pic_seti.DeltaPocS0j); + CHECK_FIELD (short_term_ref_pic_seti.UsedByCurrPicS0j); + } + CHECK_FIELD (short_term_ref_pic_seti.NumPositivePics); + for (j = 0; j < sps_parsed.short_term_ref_pic_seti.NumPositivePics; j++) { + CHECK_FIELD (short_term_ref_pic_seti.DeltaPocS1j); + CHECK_FIELD (short_term_ref_pic_seti.UsedByCurrPicS1j); + } + } + + CHECK_FIELD (long_term_ref_pics_present_flag); + CHECK_FIELD (temporal_mvp_enabled_flag); + CHECK_FIELD (strong_intra_smoothing_enabled_flag); + CHECK_FIELD (vui_parameters_present_flag); + CHECK_FIELD (vui_params.aspect_ratio_info_present_flag); + CHECK_FIELD (vui_params.overscan_info_present_flag); + CHECK_FIELD (vui_params.overscan_appropriate_flag); + CHECK_FIELD (vui_params.video_signal_type_present_flag); + CHECK_FIELD (vui_params.video_format); + CHECK_FIELD (vui_params.video_full_range_flag); + CHECK_FIELD (vui_params.colour_description_present_flag); + CHECK_FIELD (vui_params.chroma_loc_info_present_flag); + CHECK_FIELD (vui_params.chroma_sample_loc_type_top_field); + CHECK_FIELD (vui_params.chroma_sample_loc_type_bottom_field); + CHECK_FIELD (vui_params.neutral_chroma_indication_flag); + CHECK_FIELD (vui_params.field_seq_flag); + CHECK_FIELD (vui_params.frame_field_info_present_flag); + CHECK_FIELD (vui_params.default_display_window_flag); + CHECK_FIELD (vui_params.def_disp_win_left_offset); + CHECK_FIELD (vui_params.def_disp_win_right_offset); + CHECK_FIELD (vui_params.def_disp_win_top_offset); + CHECK_FIELD (vui_params.def_disp_win_bottom_offset); + CHECK_FIELD (vui_params.timing_info_present_flag); + CHECK_FIELD (vui_params.num_units_in_tick); + CHECK_FIELD (vui_params.time_scale); + CHECK_FIELD (vui_params.poc_proportional_to_timing_flag); + CHECK_FIELD (vui_params.hrd_parameters_present_flag); + CHECK_FIELD (vui_params.hrd_params.nal_hrd_parameters_present_flag); + CHECK_FIELD (vui_params.hrd_params.vcl_hrd_parameters_present_flag); + CHECK_FIELD (vui_params.hrd_params.sub_pic_hrd_params_present_flag); + CHECK_FIELD (vui_params.hrd_params.bit_rate_scale); + CHECK_FIELD (vui_params.hrd_params.cpb_size_scale); + CHECK_FIELD (vui_params.hrd_params.cpb_size_du_scale); + CHECK_FIELD (vui_params.hrd_params.initial_cpb_removal_delay_length_minus1); + CHECK_FIELD (vui_params.hrd_params.au_cpb_removal_delay_length_minus1); + CHECK_FIELD (vui_params.hrd_params.dpb_output_delay_length_minus1); + CHECK_FIELD (vui_params.hrd_params.fixed_pic_rate_general_flag0); + CHECK_FIELD (vui_params.hrd_params.fixed_pic_rate_within_cvs_flag0); + CHECK_FIELD (vui_params.hrd_params.elemental_duration_in_tc_minus10); + CHECK_FIELD (vui_params.hrd_params.low_delay_hrd_flag0); + CHECK_FIELD (vui_params.hrd_params.cpb_cnt_minus10); + CHECK_FIELD + (vui_params.hrd_params.sublayer_hrd_params0.bit_rate_value_minus10); + CHECK_FIELD + (vui_params.hrd_params.sublayer_hrd_params0.cpb_size_value_minus10); + CHECK_FIELD (vui_params.hrd_params.sublayer_hrd_params0. + cpb_size_du_value_minus10); + CHECK_FIELD (vui_params.hrd_params.sublayer_hrd_params0. + bit_rate_du_value_minus10); + CHECK_FIELD (vui_params.hrd_params.sublayer_hrd_params0.cbr_flag0); + CHECK_FIELD (vui_params.bitstream_restriction_flag); + CHECK_FIELD (vui_params.tiles_fixed_structure_flag); + CHECK_FIELD (vui_params.motion_vectors_over_pic_boundaries_flag); + CHECK_FIELD (vui_params.restricted_ref_pic_lists_flag); + CHECK_FIELD (vui_params.min_spatial_segmentation_idc); + CHECK_FIELD (vui_params.max_bytes_per_pic_denom); + CHECK_FIELD (vui_params.max_bits_per_min_cu_denom); + CHECK_FIELD (vui_params.log2_max_mv_length_horizontal); + CHECK_FIELD (vui_params.log2_max_mv_length_vertical); + CHECK_FIELD (sps_extension_flag); + CHECK_FIELD (sps_range_extension_flag); + CHECK_FIELD (sps_multilayer_extension_flag); + CHECK_FIELD (sps_3d_extension_flag); + CHECK_FIELD (sps_scc_extension_flag); + CHECK_FIELD (sps_extension_params.transform_skip_rotation_enabled_flag); + CHECK_FIELD (sps_extension_params.transform_skip_context_enabled_flag); + CHECK_FIELD (sps_extension_params.implicit_rdpcm_enabled_flag); + CHECK_FIELD (sps_extension_params.explicit_rdpcm_enabled_flag); + CHECK_FIELD (sps_extension_params.extended_precision_processing_flag); + CHECK_FIELD (sps_extension_params.intra_smoothing_disabled_flag); + CHECK_FIELD (sps_extension_params.high_precision_offsets_enabled_flag); + CHECK_FIELD (sps_extension_params.persistent_rice_adaptation_enabled_flag); + CHECK_FIELD (sps_extension_params.cabac_bypass_alignment_enabled_flag); +#undef CHECK_FIELD + + memset (header_data, 0, sizeof (header_data)); + memset (header_nal, 0, sizeof (header_nal)); + + size = sizeof (header_data); + ret = gst_h265_bit_writer_pps (&pps, TRUE, header_data, &size); + fail_if (ret != GST_H265_BIT_WRITER_OK); + + nal_size = sizeof (header_nal); + ret = gst_h265_bit_writer_convert_to_nal (4, FALSE, TRUE, FALSE, + header_data, size * 8, header_nal, &nal_size); + fail_if (ret != GST_H265_BIT_WRITER_OK); + fail_if (nal_size < size); + + /* Parse it again */ + res = gst_h265_parser_identify_nalu (parser, header_nal, 0, + sizeof (header_nal), &nalu); + assert_equals_int (res, GST_H265_PARSER_NO_NAL_END); + + res = gst_h265_parser_parse_pps (parser, &nalu, &pps_parsed); + assert_equals_int (res, GST_H265_PARSER_OK); + +#define CHECK_FIELD(FIELD) fail_if(pps_parsed.FIELD != pps.FIELD) + CHECK_FIELD (id); + CHECK_FIELD (dependent_slice_segments_enabled_flag); + CHECK_FIELD (output_flag_present_flag); + CHECK_FIELD (num_extra_slice_header_bits); + CHECK_FIELD (sign_data_hiding_enabled_flag); + CHECK_FIELD (cabac_init_present_flag); + CHECK_FIELD (num_ref_idx_l0_default_active_minus1); + CHECK_FIELD (num_ref_idx_l1_default_active_minus1); + CHECK_FIELD (init_qp_minus26); + CHECK_FIELD (constrained_intra_pred_flag); + CHECK_FIELD (transform_skip_enabled_flag); + CHECK_FIELD (cu_qp_delta_enabled_flag); + CHECK_FIELD (diff_cu_qp_delta_depth); + CHECK_FIELD (cb_qp_offset); + CHECK_FIELD (cr_qp_offset); + CHECK_FIELD (slice_chroma_qp_offsets_present_flag); + CHECK_FIELD (weighted_pred_flag); + CHECK_FIELD (weighted_bipred_flag); + CHECK_FIELD (transquant_bypass_enabled_flag); + CHECK_FIELD (tiles_enabled_flag); + CHECK_FIELD (entropy_coding_sync_enabled_flag); + CHECK_FIELD (num_tile_columns_minus1); + CHECK_FIELD (num_tile_rows_minus1); + CHECK_FIELD (uniform_spacing_flag); + CHECK_FIELD (column_width_minus10); + CHECK_FIELD (row_height_minus10); + CHECK_FIELD (row_height_minus11); + CHECK_FIELD (loop_filter_across_tiles_enabled_flag); + CHECK_FIELD (loop_filter_across_slices_enabled_flag); + CHECK_FIELD (deblocking_filter_control_present_flag); + CHECK_FIELD (deblocking_filter_override_enabled_flag); + CHECK_FIELD (deblocking_filter_disabled_flag); + CHECK_FIELD (beta_offset_div2); + CHECK_FIELD (tc_offset_div2); + CHECK_FIELD (scaling_list_data_present_flag); + + for (i = 0; i < 6; i++) + CHECK_FIELD (scaling_list.scaling_list_dc_coef_minus8_16x16i); + for (i = 0; i < 2; i++) + CHECK_FIELD (scaling_list.scaling_list_dc_coef_minus8_32x32i); + for (i = 0; i < 6; i++) { + for (j = 0; j < 16; j++) + CHECK_FIELD (scaling_list.scaling_lists_4x4ij); + } + for (i = 0; i < 6; i++) { + for (j = 0; j < 64; j++) + CHECK_FIELD (scaling_list.scaling_lists_8x8ij); + } + for (i = 0; i < 6; i++) { + for (j = 0; j < 64; j++) + CHECK_FIELD (scaling_list.scaling_lists_16x16ij); + } + for (i = 0; i < 2; i++) { + for (j = 0; j < 64; j++) + CHECK_FIELD (scaling_list.scaling_lists_32x32ij); + } + + CHECK_FIELD (lists_modification_present_flag); + CHECK_FIELD (log2_parallel_merge_level_minus2); + CHECK_FIELD (slice_segment_header_extension_present_flag); + CHECK_FIELD (pps_extension_flag); + CHECK_FIELD (pps_range_extension_flag); + CHECK_FIELD (pps_multilayer_extension_flag); + CHECK_FIELD (pps_3d_extension_flag); + CHECK_FIELD (pps_scc_extension_flag); + CHECK_FIELD (pps_extension_params.log2_max_transform_skip_block_size_minus2); + CHECK_FIELD (pps_extension_params.cross_component_prediction_enabled_flag); + CHECK_FIELD (pps_extension_params.chroma_qp_offset_list_enabled_flag); + CHECK_FIELD (pps_extension_params.diff_cu_chroma_qp_offset_depth); + CHECK_FIELD (pps_extension_params.chroma_qp_offset_list_len_minus1); + for (i = 0; i < 6; i++) + CHECK_FIELD (pps_extension_params.cb_qp_offset_listi); + for (i = 0; i < 6; i++) + CHECK_FIELD (pps_extension_params.cr_qp_offset_listi); + CHECK_FIELD (pps_extension_params.log2_sao_offset_scale_luma); + CHECK_FIELD (pps_extension_params.log2_sao_offset_scale_chroma); +#undef CHECK_FIELD + + memset (header_data, 0, sizeof (header_data)); + memset (header_nal, 0, sizeof (header_nal)); + + size = sizeof (header_data); + ret = gst_h265_bit_writer_slice_hdr (&slice_hdr, TRUE, + GST_H265_NAL_SLICE_TRAIL_N, header_data, &size); + fail_if (ret != GST_H265_BIT_WRITER_OK); + + nal_size = sizeof (header_nal); + ret = gst_h265_bit_writer_convert_to_nal (4, FALSE, TRUE, FALSE, + header_data, size * 8, header_nal, &nal_size); + fail_if (ret != GST_H265_BIT_WRITER_OK); + fail_if (nal_size < size); + + /* Parse it again */ + res = gst_h265_parser_identify_nalu (parser, header_nal, 0, + sizeof (header_nal), &nalu); + assert_equals_int (res, GST_H265_PARSER_NO_NAL_END); + + res = gst_h265_parser_parse_slice_hdr (parser, &nalu, &slice_parsed); + assert_equals_int (res, GST_H265_PARSER_OK); + +#define CHECK_FIELD(FIELD) fail_if(slice_parsed.FIELD != slice_hdr.FIELD) + CHECK_FIELD (first_slice_segment_in_pic_flag); + CHECK_FIELD (type); + CHECK_FIELD (pic_order_cnt_lsb); + CHECK_FIELD (short_term_ref_pic_set_sps_flag); + CHECK_FIELD (short_term_ref_pic_set_idx); + CHECK_FIELD (temporal_mvp_enabled_flag); + CHECK_FIELD (sao_luma_flag); + CHECK_FIELD (sao_chroma_flag); + CHECK_FIELD (num_ref_idx_active_override_flag); + CHECK_FIELD (num_ref_idx_l0_active_minus1); + CHECK_FIELD (num_ref_idx_l1_active_minus1); + CHECK_FIELD (mvd_l1_zero_flag); + CHECK_FIELD (collocated_ref_idx); + CHECK_FIELD (five_minus_max_num_merge_cand); + CHECK_FIELD (qp_delta); + CHECK_FIELD (deblocking_filter_override_flag); + CHECK_FIELD (cu_chroma_qp_offset_enabled_flag); + CHECK_FIELD (deblocking_filter_override_flag); + CHECK_FIELD (beta_offset_div2); + CHECK_FIELD (tc_offset_div2); + CHECK_FIELD (num_entry_point_offsets); +#undef CHECK_FIELD + + gst_h265_parser_free (parser); +} + +GST_END_TEST; + +static Suite * +h265bitwriter_suite (void) +{ + Suite *s = suite_create ("H265 bitwriter library"); + + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_h265_bitwriter_vps_sps_pps_slice_hdr); + + return s; +} + +GST_CHECK_MAIN (h265bitwriter);
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/libs/h265parser.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/libs/h265parser.c
Changed
@@ -1175,6 +1175,203 @@ GST_END_TEST; +GST_START_TEST (test_h265_split_hevc) +{ + GstH265Parser *parser; + GArray *array; + GstH265NalUnit *nal; + static const guint8 aud = { 0x46, 0x01, 0x10 }; + static const guint8 eos = { 0x48, 0x01 }; + static const guint8 sc_3bytes = { 0x00, 0x00, 0x01 }; + static const guint8 sc_4bytes = { 0x00, 0x00, 0x00, 0x01 }; + const guint8 nal_length_size = 4; + guint8 data128; + gsize size; + GstH265ParserResult ret; + gsize consumed; + guint off; + + parser = gst_h265_parser_new (); + array = g_array_new (FALSE, FALSE, sizeof (GstH265NalUnit)); + +#define BUILD_NAL(arr) G_STMT_START { \ + memcpy (data + off, arr, sizeof (arr)); \ + off += sizeof (arr); \ +} G_STMT_END + + /* 1) Complete packetized nalu */ + size = nal_length_size + sizeof (aud); + off = nal_length_size; + GST_WRITE_UINT32_BE (data, sizeof (aud)); + BUILD_NAL (aud); + ret = gst_h265_parser_identify_and_split_nalu_hevc (parser, data, + 0, size, nal_length_size, array, &consumed); + assert_equals_int (ret, GST_H265_PARSER_OK); + assert_equals_int (array->len, 1); + assert_equals_int (consumed, size); + nal = &g_array_index (array, GstH265NalUnit, 0); + assert_equals_int (nal->type, GST_H265_NAL_AUD); + assert_equals_int (nal->sc_offset, 0); + assert_equals_int (nal->offset, nal_length_size); + assert_equals_int (nal->size, sizeof (aud)); + + /* 2-1) SC (3 bytes) + nalu */ + size = nal_length_size + sizeof (sc_3bytes) + sizeof (aud); + off = nal_length_size; + GST_WRITE_UINT32_BE (data, sizeof (sc_3bytes) + sizeof (aud)); + BUILD_NAL (sc_3bytes); + BUILD_NAL (aud); + ret = gst_h265_parser_identify_and_split_nalu_hevc (parser, data, + 0, size, nal_length_size, array, &consumed); + assert_equals_int (ret, GST_H265_PARSER_OK); + assert_equals_int (array->len, 1); + assert_equals_int (consumed, size); + nal = &g_array_index (array, GstH265NalUnit, 0); + assert_equals_int (nal->type, GST_H265_NAL_AUD); + assert_equals_int (nal->sc_offset, nal_length_size); + assert_equals_int (nal->offset, nal_length_size + sizeof (sc_3bytes)); + assert_equals_int (nal->size, sizeof (aud)); + + /* 2-2) SC (4 bytes) + nalu */ + size = nal_length_size + sizeof (sc_4bytes) + sizeof (aud); + off = nal_length_size; + GST_WRITE_UINT32_BE (data, sizeof (sc_4bytes) + sizeof (aud)); + BUILD_NAL (sc_4bytes); + BUILD_NAL (aud); + ret = gst_h265_parser_identify_and_split_nalu_hevc (parser, data, + 0, size, nal_length_size, array, &consumed); + assert_equals_int (ret, GST_H265_PARSER_OK); + assert_equals_int (array->len, 1); + assert_equals_int (consumed, size); + nal = &g_array_index (array, GstH265NalUnit, 0); + assert_equals_int (nal->type, GST_H265_NAL_AUD); + assert_equals_int (nal->sc_offset, nal_length_size); + assert_equals_int (nal->offset, nal_length_size + sizeof (sc_4bytes)); + assert_equals_int (nal->size, sizeof (aud)); + + /* 3-1) nalu + trailing SC (3 bytes) */ + size = nal_length_size + sizeof (aud) + sizeof (sc_3bytes); + off = nal_length_size; + GST_WRITE_UINT32_BE (data, sizeof (aud) + sizeof (sc_3bytes)); + BUILD_NAL (aud); + BUILD_NAL (sc_3bytes); + ret = gst_h265_parser_identify_and_split_nalu_hevc (parser, data, + 0, size, nal_length_size, array, &consumed); + assert_equals_int (ret, GST_H265_PARSER_OK); + assert_equals_int (array->len, 1); + assert_equals_int (consumed, size); + nal = &g_array_index (array, GstH265NalUnit, 0); + assert_equals_int (nal->type, GST_H265_NAL_AUD); + assert_equals_int (nal->sc_offset, 0); + assert_equals_int (nal->offset, nal_length_size); + assert_equals_int (nal->size, sizeof (aud)); + + /* 3-2) nalu + trailing SC (4 bytes) */ + size = nal_length_size + sizeof (aud) + sizeof (sc_4bytes); + off = nal_length_size; + GST_WRITE_UINT32_BE (data, sizeof (aud) + sizeof (sc_4bytes)); + BUILD_NAL (aud); + BUILD_NAL (sc_4bytes); + ret = gst_h265_parser_identify_and_split_nalu_hevc (parser, data, + 0, size, nal_length_size, array, &consumed); + assert_equals_int (ret, GST_H265_PARSER_OK); + assert_equals_int (array->len, 1); + assert_equals_int (consumed, size); + nal = &g_array_index (array, GstH265NalUnit, 0); + assert_equals_int (nal->type, GST_H265_NAL_AUD); + assert_equals_int (nal->sc_offset, 0); + assert_equals_int (nal->offset, nal_length_size); + assert_equals_int (nal->size, sizeof (aud)); + + /* 4-1) SC + nalu + SC + nalu */ + size = nal_length_size + sizeof (sc_3bytes) + sizeof (aud) + + sizeof (sc_4bytes) + sizeof (eos); + off = nal_length_size; + GST_WRITE_UINT32_BE (data, sizeof (sc_3bytes) + sizeof (aud) + + sizeof (sc_4bytes) + sizeof (eos)); + BUILD_NAL (sc_3bytes); + BUILD_NAL (aud); + BUILD_NAL (sc_4bytes); + BUILD_NAL (eos); + ret = gst_h265_parser_identify_and_split_nalu_hevc (parser, data, + 0, size, nal_length_size, array, &consumed); + assert_equals_int (ret, GST_H265_PARSER_OK); + assert_equals_int (array->len, 2); + assert_equals_int (consumed, size); + nal = &g_array_index (array, GstH265NalUnit, 0); + assert_equals_int (nal->type, GST_H265_NAL_AUD); + assert_equals_int (nal->sc_offset, nal_length_size); + assert_equals_int (nal->offset, nal_length_size + sizeof (sc_3bytes)); + assert_equals_int (nal->size, sizeof (aud)); + nal = &g_array_index (array, GstH265NalUnit, 1); + assert_equals_int (nal->type, GST_H265_NAL_EOS); + assert_equals_int (nal->sc_offset, nal_length_size + sizeof (sc_3bytes) + + sizeof (aud)); + assert_equals_int (nal->offset, nal_length_size + sizeof (sc_3bytes) + + sizeof (aud) + sizeof (sc_4bytes)); + assert_equals_int (nal->size, sizeof (eos)); + + /* 4-2) SC + nalu + SC + nalu + trailing SC */ + size = nal_length_size + sizeof (sc_3bytes) + sizeof (aud) + + sizeof (sc_4bytes) + sizeof (eos) + sizeof (sc_3bytes); + off = nal_length_size; + GST_WRITE_UINT32_BE (data, sizeof (sc_3bytes) + sizeof (aud) + + sizeof (sc_4bytes) + sizeof (eos) + sizeof (sc_3bytes)); + BUILD_NAL (sc_3bytes); + BUILD_NAL (aud); + BUILD_NAL (sc_4bytes); + BUILD_NAL (eos); + BUILD_NAL (sc_3bytes); + ret = gst_h265_parser_identify_and_split_nalu_hevc (parser, data, + 0, size, nal_length_size, array, &consumed); + assert_equals_int (ret, GST_H265_PARSER_OK); + assert_equals_int (array->len, 2); + assert_equals_int (consumed, size); + nal = &g_array_index (array, GstH265NalUnit, 0); + assert_equals_int (nal->type, GST_H265_NAL_AUD); + assert_equals_int (nal->sc_offset, nal_length_size); + assert_equals_int (nal->offset, nal_length_size + sizeof (sc_3bytes)); + assert_equals_int (nal->size, sizeof (aud)); + nal = &g_array_index (array, GstH265NalUnit, 1); + assert_equals_int (nal->type, GST_H265_NAL_EOS); + assert_equals_int (nal->sc_offset, nal_length_size + sizeof (sc_3bytes) + + sizeof (aud)); + assert_equals_int (nal->offset, nal_length_size + sizeof (sc_3bytes) + + sizeof (aud) + sizeof (sc_4bytes)); + assert_equals_int (nal->size, sizeof (eos)); + + /* 4-3) nalu + SC + nalu */ + size = nal_length_size + sizeof (aud) + sizeof (sc_4bytes) + sizeof (eos); + off = nal_length_size; + GST_WRITE_UINT32_BE (data, sizeof (aud) + sizeof (sc_4bytes) + sizeof (eos)); + BUILD_NAL (aud); + BUILD_NAL (sc_4bytes); + BUILD_NAL (eos); + ret = gst_h265_parser_identify_and_split_nalu_hevc (parser, data, + 0, size, nal_length_size, array, &consumed); + assert_equals_int (ret, GST_H265_PARSER_OK); + assert_equals_int (array->len, 2); + assert_equals_int (consumed, size); + nal = &g_array_index (array, GstH265NalUnit, 0); + assert_equals_int (nal->type, GST_H265_NAL_AUD); + assert_equals_int (nal->sc_offset, 0); + assert_equals_int (nal->offset, nal_length_size); + assert_equals_int (nal->size, sizeof (aud)); + nal = &g_array_index (array, GstH265NalUnit, 1); + assert_equals_int (nal->type, GST_H265_NAL_EOS); + assert_equals_int (nal->sc_offset, nal_length_size + sizeof (aud)); + assert_equals_int (nal->offset, + nal_length_size + sizeof (aud) + sizeof (sc_4bytes)); + assert_equals_int (nal->size, sizeof (eos)); + +#undef BUILD_NAL + + gst_h265_parser_free (parser); + g_array_unref (array); +} + +GST_END_TEST; + static Suite * h265parser_suite (void) { @@ -1197,6 +1394,7 @@ tcase_add_test (tc_chain, test_h265_nal_type_classification); tcase_add_test (tc_chain, test_h265_sei_registered_user_data); tcase_add_test (tc_chain, test_h265_create_sei); + tcase_add_test (tc_chain, test_h265_split_hevc); return s; }
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/meson.build -> gst-plugins-bad-1.22.0.tar.xz/tests/check/meson.build
Changed
@@ -32,13 +32,15 @@ 'elements/ccconverter.c', not closedcaption_dep.found(), gstvideo_dep, 'elements/cccombiner.c', not closedcaption_dep.found(), , 'elements/ccextractor.c', not closedcaption_dep.found(), , - 'elements/cudaconvert.c', false, gmodule_dep, gstgl_dep, - 'elements/cudafilter.c', false, gmodule_dep, gstgl_dep, + 'elements/cudaconvert.c', false, gstgl_dep, gmodule_dep, + 'elements/cudafilter.c', false, gstgl_dep, gmodule_dep, 'elements/d3d11colorconvert.c', host_machine.system() != 'windows', , + 'elements/fdkaac.c', not fdkaac_dep.found(), , 'elements/gdpdepay.c', get_option('gdp').disabled(), 'elements/gdppay.c', get_option('gdp').disabled(), 'elements/h263parse.c', false, libparser_dep, gstcodecparsers_dep, 'elements/h264parse.c', false, libparser_dep, gstcodecparsers_dep, + 'elements/h264timestamper.c', false, libparser_dep, gstcodecparsers_dep, 'elements/h265parse.c', false, libparser_dep, gstcodecparsers_dep, 'elements/hlsdemux_m3u8.c', not hls_dep.found(), hls_dep, 'elements/id3mux.c', get_option('id3tag').disabled(), @@ -53,6 +55,8 @@ 'elements/msdkh264enc.c', not have_msdk, msdk_dep, 'elements/mxfdemux.c', get_option('mxf').disabled(), 'elements/mxfmux.c', get_option('mxf').disabled(), + 'elements/nvenc.c', false, gstgl_dep, gmodule_dep, + 'elements/nvdec.c', not gstgl_dep.found(), gstgl_dep, gmodule_dep, 'elements/svthevcenc.c', not svthevcenc_dep.found(), svthevcenc_dep, 'elements/openjpeg.c', not openjpeg_dep.found(), openjpeg_dep, 'elements/pcapparse.c', false, libparser_dep, @@ -63,9 +67,11 @@ 'elements/rtponviftimestamp.c', get_option('onvif').disabled(), 'elements/rtpsrc.c', get_option('rtp').disabled(), 'elements/rtpsink.c', get_option('rtp').disabled(), + 'elements/srtp.c', not srtp_dep.found(), srtp_dep, 'elements/switchbin.c', get_option('switchbin').disabled(), 'elements/videoframe-audiolevel.c', get_option('videoframe_audiolevel').disabled(), 'elements/viewfinderbin.c', + 'elements/voamrwbenc.c', not voamrwbenc_dep.found(), voamrwbenc_dep, 'elements/vp9parse.c', false, gstcodecparsers_dep, 'elements/av1parse.c', false, gstcodecparsers_dep, 'elements/wasapi.c', host_machine.system() != 'windows', , @@ -83,6 +89,8 @@ 'libs/vp8parser.c', false, gstcodecparsers_dep, 'libs/vp9parser.c', false, gstcodecparsers_dep, 'libs/av1parser.c', false, gstcodecparsers_dep, + 'libs/h264bitwriter.c', false, gstcodecparsers_dep, + 'libs/h265bitwriter.c', false, gstcodecparsers_dep, 'libs/vkmemory.c', not gstvulkan_dep.found(), gstvulkan_dep, 'elements/vkcolorconvert.c', not gstvulkan_dep.found(), gstvulkan_dep, 'libs/vkwindow.c', not gstvulkan_dep.found(), gstvulkan_dep, @@ -143,6 +151,7 @@ if host_machine.system() == 'linux' base_tests += 'elements/vapostproc.c', not gstva_dep.found(), gstva_dep, + 'elements/vacompositor.c', not gstva_dep.found(), gstva_dep, endif @@ -160,7 +169,7 @@ gstbasecamerabin_dep, gstphotography_dep, gstpbutils_dep, gstcontroller_dep, gstaudio_dep, gstvideo_dep, gstrtp_dep, gsturidownloader_dep, - gstcheck_dep, gio_dep, glib_dep, gsttag_dep + gstcheck_dep, gio_dep, gsttag_dep pluginsdirs = @@ -226,6 +235,9 @@ # orc tests orc_tests = 'orc_bayer', files('../../gst/bayer/gstbayerorc.orc'), + 'orc_fieldanalysis', files('../../gst/fieldanalysis/gstfieldanalysisorc.orc'), + 'orc_gaudieffects', files('../../gst/gaudieffects/gstgaudieffectsorc.orc'), + 'orc_scenechange', files('../../gst/videofilters/gstscenechangeorc.orc'), orc_test_dep = dependency('', required : false)
View file
gst-plugins-bad-1.20.5.tar.xz/tests/check/pipelines/ipcpipeline.c -> gst-plugins-bad-1.22.0.tar.xz/tests/check/pipelines/ipcpipeline.c
Changed
@@ -35,6 +35,7 @@ #include <sys/types.h> #include <sys/socket.h> #include <gst/check/gstcheck.h> +#include <gst/video/navigation.h> #include <string.h> #ifndef HAVE_PIPE2 @@ -2988,32 +2989,29 @@ { test_data *td = user_data; navigation_master_data *d = td->md; - const GstStructure *s; - const gchar *string, *key; + GstEvent *e; + const gchar *key; double x, y; if (GST_IS_EVENT (info->data)) { if (GST_EVENT_TYPE (info->data) == GST_EVENT_NAVIGATION) { - s = gst_event_get_structure (info->data); - FAIL_UNLESS (s); + e = GST_EVENT (info->data); - /* mouse-move */ - string = gst_structure_get_string (s, "event"); - if (string && !strcmp (string, "mouse-move")) { - if (gst_structure_get_double (s, "pointer_x", &x) && x == 4.7) { - if (gst_structure_get_double (s, "pointer_y", &y) && y == 0.1) { + switch (gst_navigation_event_get_type (e)) { + case GST_NAVIGATION_EVENT_MOUSE_MOVE: + gst_navigation_event_parse_mouse_move_event (e, &x, &y); + if (x == 4.7 && y == 0.1) d->navigation_receivedTEST_NAV_MOUSE_MOVE = TRUE; - } - } - } + break; - /* key-press */ - string = gst_structure_get_string (s, "event"); - if (string && !strcmp (string, "key-press")) { - key = gst_structure_get_string (s, "key"); - if (key && !strcmp (key, "Left")) { - d->navigation_receivedTEST_NAV_KEY_PRESS = TRUE; - } + case GST_NAVIGATION_EVENT_KEY_PRESS: + gst_navigation_event_parse_key_event (e, &key); + if (!strcmp (key, "Left")) + d->navigation_receivedTEST_NAV_KEY_PRESS = TRUE; + break; + + default: + break; } /* drop at this point to imply successful handling; the upstream filesrc @@ -3067,7 +3065,6 @@ navigation_slave_data *d = td->sd; GstElement *sink; GstPad *pad, *peer; - GstStructure *s; GstEvent *e = NULL; sink = g_value_get_object (v); @@ -3080,15 +3077,12 @@ switch (d->step) { case TEST_NAV_MOUSE_MOVE: - s = gst_structure_new ("application/x-gst-navigation", "event", - G_TYPE_STRING, "mouse-move", "button", G_TYPE_INT, 0, "pointer_x", - G_TYPE_DOUBLE, 4.7, "pointer_y", G_TYPE_DOUBLE, 0.1, NULL); - e = gst_event_new_navigation (s); + e = gst_navigation_event_new_mouse_move (4.7, 0.1, + GST_NAVIGATION_MODIFIER_NONE); break; case TEST_NAV_KEY_PRESS: - s = gst_structure_new ("application/x-gst-navigation", "event", - G_TYPE_STRING, "key-press", "key", G_TYPE_STRING, "Left", NULL); - e = gst_event_new_navigation (s); + e = gst_navigation_event_new_key_press ("Left", + GST_NAVIGATION_MODIFIER_NONE); break; }
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/codecs
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/codecs/decoder-caps-update.cpp
Added
@@ -0,0 +1,324 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <stdlib.h> +#include <string> +#include <mutex> +#include "../key-handler.h" + +static GMainLoop *loop = nullptr; +static std::mutex input_lock; +static gint par = 1; +static gint fps = 30; +static gboolean set_hdr10 = FALSE; +static GstElement *setter = nullptr; +static gboolean updated = FALSE; + +static void +print_keyboard_help (void) +{ + static struct + { + const gchar *key_desc; + const gchar *key_help; + } key_controls = { + { + "q", "Quit"}, { + "right arrow", "Increase framerate"}, { + "left arrow", "Decrease framerate"}, { + "up arrow", "Increase pixel-aspect-ratio"}, { + "down arrow", "Decrease pixel-aspect-ratio"}, { + "m", "Toggle HDR10 metadata"}, { + "k", "show keyboard shortcuts"} + }; + + guint i, chars_to_pad, desc_len, max_desc_len = 0; + + gst_print ("\n\n%s\n\n", "Keyboard controls:"); + + for (i = 0; i < G_N_ELEMENTS (key_controls); ++i) { + desc_len = g_utf8_strlen (key_controlsi.key_desc, -1); + max_desc_len = MAX (max_desc_len, desc_len); + } + ++max_desc_len; + + for (i = 0; i < G_N_ELEMENTS (key_controls); ++i) { + chars_to_pad = max_desc_len - g_utf8_strlen (key_controlsi.key_desc, -1); + gst_print ("\t%s", key_controlsi.key_desc); + gst_print ("%-*s: ", chars_to_pad, ""); + gst_print ("%s\n", key_controlsi.key_help); + } + gst_print ("\n"); +} + +static void +keyboard_cb (gchar input, gboolean is_ascii, gpointer user_data) +{ + std::lock_guard<std::mutex> lk (input_lock); + + if (!is_ascii) { + switch (input) { + case KB_ARROW_UP: + par++; + updated = TRUE; + gst_println ("Increasing pixel-aspect-ratio to %d", par); + break; + case KB_ARROW_DOWN: + if (par == 1) + return; + par--; + updated = TRUE; + gst_println ("Decreasing pixel-aspect-ratio to %d", par); + break; + case KB_ARROW_RIGHT: + fps++; + updated = TRUE; + gst_println ("Increasing framerate to %d", fps); + break; + case KB_ARROW_LEFT: + if (fps == 1) + return; + fps--; + updated = TRUE; + gst_println ("Decreasing framerate to %d", fps); + break; + default: + break; + } + } else { + switch (input) { + case 'k': + case 'K': + print_keyboard_help (); + break; + case 'q': + case 'Q': + g_main_loop_quit (loop); + break; + case 'm': + case 'M': + set_hdr10 = !set_hdr10; + updated = TRUE; + gst_println ("%sable HDR10 metadata", set_hdr10 ? "En" : "Dis"); + break; + default: + break; + } + } + + if (updated && setter) { + GstPad *pad = gst_element_get_static_pad (setter, "sink"); + GstCaps *caps = gst_pad_get_current_caps (pad); + gst_object_unref (pad); + + if (!caps) + return; + + if (gst_caps_is_any (caps) || gst_caps_is_empty (caps)) { + gst_caps_unref (caps); + return; + } + + caps = gst_caps_make_writable (caps); + gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, + par, 1, "framerate", GST_TYPE_FRACTION, fps, 1, nullptr); + + if (set_hdr10) { + gst_caps_set_simple (caps, "mastering-display-info", G_TYPE_STRING, + "34000:16000:13250:34500:7500:3000:15635:16450:10000000:1", + "content-light-level", G_TYPE_STRING, "1000:400", nullptr); + } + + g_object_set (setter, "caps", caps, nullptr); + gst_caps_unref (caps); + } +} + +static void +decoder_caps_notify (GstPad * pad, GParamSpec * pspec, gpointer user_data) +{ + GstCaps *caps; + gchar *caps_str; + + g_object_get (pad, "caps", &caps, nullptr); + if (!caps) + return; + + caps_str = gst_caps_to_string (caps); + gst_println ("\nDecoder output caps\n%s\n", caps_str); + + g_free (caps_str); + gst_caps_unref (caps); +} + +static gboolean +bus_msg (GstBus * bus, GstMessage * msg, gpointer user_data) +{ + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_ERROR:{ + GError *err; + gchar *dbg; + + gst_message_parse_error (msg, &err, &dbg); + gst_printerrln ("ERROR %s", err->message); + if (dbg != NULL) + gst_printerrln ("ERROR debug information: %s", dbg); + g_clear_error (&err); + g_free (dbg); + + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_EOS: + gst_println ("Got EOS"); + g_main_loop_quit (loop); + break; + default: + break; + } + + return TRUE; +} + +gint +main (gint argc, gchar ** argv) +{ + GstElement *pipeline; + GError *error = nullptr; + GOptionContext *option_ctx; + gchar *decoder_name = nullptr; + gchar *encoder_name = nullptr; + gchar *sink_name = nullptr; + gchar *location = nullptr; + GOptionEntry options = { + {"decoder", 0, 0, G_OPTION_ARG_STRING, &decoder_name, + "Video decoder to use"}, + {"encoder", 0, 0, G_OPTION_ARG_STRING, &encoder_name, + "Video encoder description. Ignored if \"location\" is set " + "(example: \"x264enc speed-preset=ultrafast\""}, + {"videosink", 0, 0, G_OPTION_ARG_STRING, &sink_name, + "Video sink to use"}, + {"location", 0, 0, G_OPTION_ARG_STRING, &location, "File location"}, + {nullptr} + }; + + option_ctx = + g_option_context_new ("Video decoder caps update example"); + g_option_context_add_main_entries (option_ctx, options, nullptr); + g_option_context_set_help_enabled (option_ctx, TRUE); + if (!g_option_context_parse (option_ctx, &argc, &argv, &error)) { + gst_printerrln ("option parsing failed: %s\n", error->message); + g_clear_error (&error); + exit (1); + } + + g_option_context_free (option_ctx); + gst_init (nullptr, nullptr); + + if (!decoder_name) { + gst_printerrln ("Decoder must be specified"); + exit (1); + } + + if (!encoder_name && !location) { + gst_printerrln ("Encoder or file location must be specified"); + exit (1); + } + + std::string pipeline_desc; + if (location) { + pipeline_desc = "filesrc location=" + std::string (location) + + " ! parsebin ! capssetter name=setter ! " + + std::string (decoder_name) + " name=dec"; + } else { + pipeline_desc = "videotestsrc ! " + std::string (encoder_name) + + " ! parsebin ! capssetter name=setter ! " + + std::string (decoder_name) + " name=dec"; + } + + if (sink_name) { + pipeline_desc += " ! " + std::string (sink_name); + } else { + pipeline_desc += " ! fakevideosink"; + } + + gst_println ("Constructing test pipeline \"%s\"", pipeline_desc.c_str()); + + loop = g_main_loop_new (nullptr, FALSE); + pipeline = gst_parse_launch (pipeline_desc.c_str(), &error); + if (error) { + gst_printerrln ("Could not construct pipeline, error: %s", + error->message); + exit(1); + } + + setter = gst_bin_get_by_name (GST_BIN (pipeline), "setter"); + if (!setter) { + gst_printerrln ("Could not get capssetter from pipeline"); + exit(1); + } + + GstElement *dec = gst_bin_get_by_name (GST_BIN (pipeline), "dec"); + if (!dec) { + gst_printerrln ("Could not get decoder from pipeline"); + exit(1); + } + + GstPad *pad = gst_element_get_static_pad (dec, "src"); + g_signal_connect (pad, "notify::caps", G_CALLBACK (decoder_caps_notify), + nullptr); + gst_object_unref (pad); + gst_object_unref (dec); + + gst_bus_add_watch (GST_ELEMENT_BUS (pipeline), bus_msg, nullptr); + + /* run the pipeline */ + GstStateChangeReturn ret = + gst_element_set_state (pipeline, GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) { + gst_printerrln ("Pipeline doesn't want to playing"); + } else { + set_key_handler ((KeyInputCallback) keyboard_cb, nullptr); + gst_println ("Press k to see supported keyboard inputs"); + g_main_loop_run (loop); + unset_key_handler (); + } + + input_lock.lock(); + gst_clear_object (&setter); + input_lock.unlock(); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_bus_remove_watch (GST_ELEMENT_BUS (pipeline)); + + gst_object_unref (pipeline); + g_main_loop_unref (loop); + + g_free (decoder_name); + g_free (encoder_name); + g_free (location); + + return 0; +}
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/codecs/meson.build
Added
@@ -0,0 +1,10 @@ +if host_system not in 'windows', 'linux' + subdir_done() +endif + +executable('decoder-caps-update', + 'decoder-caps-update.cpp', '../key-handler.c', + include_directories : configinc, + dependencies: gst_dep, gstbase_dep, gstvideo_dep, + c_args : gst_plugins_bad_args, + install: false)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/d3d11/d3d11converter.cpp
Added
@@ -0,0 +1,604 @@ +/* + * GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/d3d11/gstd3d11.h> +#include <gst/app/app.h> +#include <windows.h> +#include <wrl.h> +#include <string> +#include <d3d11_1.h> +#include <dxgi1_2.h> +#include "../key-handler.h" + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +#define APP_DATA_PROP_NAME "AppData" + +typedef struct +{ + GMainLoop *loop; + GstElement *pipeline; + GstD3D11Device *d3d11_device; + + ID3D11Device *device; + ID3D11DeviceContext *context; + IDXGISwapChain1 *swapchain; + + GstD3D11Converter *converter; + /* Wrapping swap chain backbuffer */ + GstBuffer *backbuffer; + + GstVideoInfo source_info; + + guint direction; + + guint window_width; + guint window_height; + + HWND hwnd; +} AppData; + +static void +keyboard_cb (gchar input, gboolean is_ascii, AppData * data) +{ + if (!is_ascii) + return; + + switch (input) { + case 'q': + case 'Q': + gst_element_send_event (data->pipeline, gst_event_new_eos ()); + break; + case ' ': + gst_d3d11_device_lock (data->d3d11_device); + data->direction++; + data->direction %= (guint) GST_VIDEO_ORIENTATION_AUTO; + + gst_println ("Set orientation %d", data->direction); + gst_d3d11_device_unlock (data->d3d11_device); + break; + default: + break; + } +} + +static bool +create_device (AppData * data) +{ + ComPtr < IDXGIFactory1 > factory; + ComPtr < ID3D11Device > device; + ComPtr < ID3D11DeviceContext > context; + ComPtr < IDXGIAdapter1 > adapter; + HRESULT hr; + DXGI_ADAPTER_DESC1 desc; + static const D3D_FEATURE_LEVEL feature_levels = { + D3D_FEATURE_LEVEL_11_1, + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + }; + + hr = CreateDXGIFactory1 (IID_PPV_ARGS (&factory)); + if (FAILED (hr)) + return false; + + /* Find hardware adapter */ + for (guint i = 0; SUCCEEDED (hr); i++) { + + hr = factory->EnumAdapters1 (i, &adapter); + if (FAILED (hr)) + return false; + + hr = adapter->GetDesc1 (&desc); + if (FAILED (hr)) + return false; + + break; + } + + if (!adapter) + return false; + + hr = D3D11CreateDevice (adapter.Get (), D3D_DRIVER_TYPE_UNKNOWN, + nullptr, D3D11_CREATE_DEVICE_BGRA_SUPPORT, + feature_levels, + G_N_ELEMENTS (feature_levels), D3D11_SDK_VERSION, &device, nullptr, + &context); + + if (FAILED (hr)) + return false; + + data->device = device.Detach (); + data->context = context.Detach (); + + return true; +} + +static gboolean +bus_handler (GstBus * bus, GstMessage * msg, AppData * app_data) +{ + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_ERROR:{ + GError *err; + gchar *dbg; + + gst_message_parse_error (msg, &err, &dbg); + gst_printerrln ("ERROR %s", err->message); + if (dbg != nullptr) + gst_printerrln ("ERROR debug information: %s", dbg); + g_clear_error (&err); + g_free (dbg); + + g_main_loop_quit (app_data->loop); + break; + } + case GST_MESSAGE_EOS: + gst_println ("Got EOS"); + g_main_loop_quit (app_data->loop); + break; + default: + break; + } + + return TRUE; +} + +static GstBusSyncReply +bus_sync_handler (GstBus * bus, GstMessage * msg, AppData * data) +{ + const gchar *context_type; + GstContext *context; + gchar *context_str; + + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_HAVE_CONTEXT:{ + gchar *context_str; + + gst_message_parse_have_context (msg, &context); + + context_type = gst_context_get_context_type (context); + context_str = + gst_structure_to_string (gst_context_get_structure (context)); + gst_println ("Got context from element '%s': %s=%s", + GST_ELEMENT_NAME (GST_MESSAGE_SRC (msg)), context_type, context_str); + g_free (context_str); + gst_context_unref (context); + break; + } + case GST_MESSAGE_NEED_CONTEXT:{ + gst_message_parse_context_type (msg, &context_type); + if (g_strcmp0 (context_type, GST_D3D11_DEVICE_HANDLE_CONTEXT_TYPE) != 0) + return GST_BUS_PASS; + + context = gst_d3d11_context_new (data->d3d11_device); + context_str = + gst_structure_to_string (gst_context_get_structure (context)); + gst_println ("Setting context '%s': %s=%s", + GST_ELEMENT_NAME (GST_MESSAGE_SRC (msg)), context_type, context_str); + g_free (context_str); + gst_element_set_context (GST_ELEMENT (msg->src), context); + gst_context_unref (context); + break; + } + default: + break; + } + + return GST_BUS_PASS; +} + +static GstFlowReturn +on_new_sample (GstAppSink * appsink, gpointer user_data) +{ + AppData *app_data = (AppData *) user_data; + GstSample *sample = gst_app_sink_pull_sample (appsink); + GstBuffer *buffer; + GstVideoRectangle s, d, r; + GstFlowReturn ret = GST_FLOW_ERROR; + GstVideoOrientationMethod direction; + + if (!sample) + return GST_FLOW_ERROR; + + buffer = gst_sample_get_buffer (sample); + if (!buffer) { + gst_sample_unref (sample); + return GST_FLOW_OK; + } + + /* DXGI, ID3D11DeviceContext, and ID3D11VideoContext APIs are not thread-safe. + * Application should take d3d11 device lock */ + gst_d3d11_device_lock (app_data->d3d11_device); + + /* calculates destination render rectangle to keep aspect ratio */ + if (app_data->window_width == 0 || app_data->window_height == 0) { + /* No client area to draw */ + goto out; + } + + + direction = (GstVideoOrientationMethod) app_data->direction; + switch (direction) { + case GST_VIDEO_ORIENTATION_90R: + case GST_VIDEO_ORIENTATION_90L: + case GST_VIDEO_ORIENTATION_UL_LR: + case GST_VIDEO_ORIENTATION_UR_LL: + s.h = GST_VIDEO_INFO_WIDTH (&app_data->source_info); + s.w = GST_VIDEO_INFO_HEIGHT (&app_data->source_info); + break; + default: + s.w = GST_VIDEO_INFO_WIDTH (&app_data->source_info); + s.h = GST_VIDEO_INFO_HEIGHT (&app_data->source_info); + break; + } + + s.x = 0; + s.y = 0; + + d.x = 0; + d.y = 0; + d.w = app_data->window_width; + d.h = app_data->window_height; + + gst_video_center_rect (&s, &d, &r, TRUE); + + /* Update converter output size and direction */ + g_object_set (app_data->converter, "dest-x", r.x, "dest-y", r.y, + "dest-width", r.w, "dest-height", r.h, "video-direction", direction, + nullptr); + + if (!gst_d3d11_converter_convert_buffer_unlocked (app_data->converter, + buffer, app_data->backbuffer)) { + gst_printerrln ("Couldn't convert"); + goto out; + } + + app_data->swapchain->Present (0, 0); + ret = GST_FLOW_OK; + +out: + gst_d3d11_device_unlock (app_data->d3d11_device); + gst_sample_unref (sample); + + return ret; +} + +static bool +create_pipelne (AppData * app_data) +{ + GstElement *pipeline; + GstElement *sink; + GError *error = nullptr; + GstCaps *caps; + GstBus *bus; + GstAppSinkCallbacks callbacks = { nullptr }; + GstVideoInfo in_info, out_info; + GstStructure *config; + + /* testsrc will output NV12 texture and this example will convert + * each texture into RGBA swapchain backbuffer. + * Note that GstD3D11Converter supports dynamic input/output resolution + * and we will update output resolution later per swapchain update */ + gst_video_info_set_format (&in_info, GST_VIDEO_FORMAT_NV12, 640, 480); + gst_video_info_set_format (&out_info, GST_VIDEO_FORMAT_RGBA, 640, 480); + + /* Video processor is not required in this example, specifies only shader + * to prevent additional resource allocation for video processor */ + config = gst_structure_new ("converter-config", + GST_D3D11_CONVERTER_OPT_BACKEND, GST_TYPE_D3D11_CONVERTER_BACKEND, + GST_D3D11_CONVERTER_BACKEND_SHADER, nullptr); + + app_data->converter = gst_d3d11_converter_new (app_data->d3d11_device, + &in_info, &out_info, config); + if (!app_data->converter) { + gst_printerrln ("Couldn't create converter"); + return false; + } + + /* Enable border filling with black color (ARGB64 representation) + * in order to clear background when video direction is updated. + * Altanative approach is resizing swapchain per video direction update */ + g_object_set (app_data->converter, "fill-border", TRUE, + "border-color", (guint64) 0xffff000000000000, nullptr); + + app_data->source_info = in_info; + + pipeline = gst_parse_launch ("d3d11testsrc ! appsink name=sink", &error); + if (error) { + gst_printerrln ("Couldn't create pipeline: %s", error->message); + g_clear_error (&error); + return false; + } + + sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink"); + + callbacks.new_sample = on_new_sample; + gst_app_sink_set_callbacks (GST_APP_SINK (sink), + &callbacks, app_data, nullptr); + + in_info.fps_n = 30; + in_info.fps_d = 1; + + caps = gst_video_info_to_caps (&in_info); + /* Set d3d11 caps feature so that d3d11testsrc can output GPU memory + * instead of system memory */ + gst_caps_set_features (caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, nullptr)); + + g_object_set (sink, "caps", caps, nullptr); + gst_caps_unref (caps); + gst_object_unref (sink); + + app_data->pipeline = pipeline; + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + + /* Listen need-context message from sync handler in case that application + * wants to share application's d3d11 device with pipeline */ + gst_bus_set_sync_handler (bus, (GstBusSyncHandler) bus_sync_handler, app_data, + nullptr); + gst_bus_add_watch (bus, (GstBusFunc) bus_handler, app_data); + gst_object_unref (bus); + + return true; +} + +static void +handle_window_resize (AppData * app_data) +{ + HRESULT hr; + ComPtr < ID3D11Texture2D > backbuffer; + D3D11_TEXTURE2D_DESC desc; + GstMemory *mem; + + if (!app_data->device || !app_data->swapchain) + return; + + /* DXGI and ID3D11DeviceContext APIs are not thread-safe. + * Application must take gst_d3d11_device_lock() in those case */ + gst_d3d11_device_lock (app_data->d3d11_device); + + /* Clear previous swapchain backbuffer */ + gst_clear_buffer (&app_data->backbuffer); + + hr = app_data->swapchain->ResizeBuffers (0, + 0, 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0); + if (FAILED (hr)) { + gst_printerrln ("Failed to resize swapchain buffers"); + gst_d3d11_device_unlock (app_data->d3d11_device); + exit (1); + } + + hr = app_data->swapchain->GetBuffer (0, IID_PPV_ARGS (&backbuffer)); + if (FAILED (hr)) { + gst_printerrln ("Failed to get swapchain backbuffer"); + gst_d3d11_device_unlock (app_data->d3d11_device); + exit (1); + } + + backbuffer->GetDesc (&desc); + + mem = gst_d3d11_allocator_alloc_wrapped (nullptr, + app_data->d3d11_device, backbuffer.Get (), + /* This might not be correct CPU accessible (staging) texture size + * but it's fine since we don't use this memory for CPU access */ + desc.Width * desc.Height * 4, nullptr, nullptr); + if (!mem) { + gst_printerrln ("Failed to wrap backbuffer"); + gst_d3d11_device_unlock (app_data->d3d11_device); + exit (1); + } + + app_data->backbuffer = gst_buffer_new (); + gst_buffer_append_memory (app_data->backbuffer, mem); + + app_data->window_width = desc.Width; + app_data->window_height = desc.Height; + gst_d3d11_device_unlock (app_data->d3d11_device); +} + +static LRESULT CALLBACK +window_proc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) { + case WM_DESTROY:{ + AppData *app_data = (AppData *) GetPropA (hwnd, APP_DATA_PROP_NAME); + if (app_data) { + app_data->hwnd = nullptr; + if (app_data->loop) + g_main_loop_quit (app_data->loop); + } + break; + } + case WM_SIZE:{ + AppData *app_data = (AppData *) GetPropA (hwnd, APP_DATA_PROP_NAME); + if (!app_data) + break; + + handle_window_resize (app_data); + break; + } + default: + break; + } + + return DefWindowProc (hwnd, message, wParam, lParam); +} + +static gboolean +msg_cb (GIOChannel * source, GIOCondition condition, gpointer data) +{ + MSG msg; + + if (!PeekMessage (&msg, nullptr, 0, 0, PM_REMOVE)) + return G_SOURCE_CONTINUE; + + TranslateMessage (&msg); + DispatchMessage (&msg); + + return G_SOURCE_CONTINUE; +} + +static HWND +create_window (void) +{ + RECT wr = { 0, 0, 320, 240 }; + WNDCLASSEXA wc = { 0, }; + HINSTANCE hinstance = GetModuleHandle (nullptr); + + wc.cbSize = sizeof (WNDCLASSEXA); + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = (WNDPROC) window_proc; + wc.hInstance = hinstance; + wc.hCursor = LoadCursor (nullptr, IDC_ARROW); + wc.lpszClassName = "GstD3D11VideoSinkExample"; + RegisterClassExA (&wc); + + AdjustWindowRect (&wr, WS_OVERLAPPEDWINDOW, FALSE); + return CreateWindowExA (0, wc.lpszClassName, "GstD3D11VideoDecodeExample", + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, + wr.right - wr.left, wr.bottom - wr.top, (HWND) nullptr, (HMENU) nullptr, + hinstance, nullptr); +} + +static bool +create_swapchain (AppData * data) +{ + DXGI_SWAP_CHAIN_DESC1 desc = { 0, }; + IDXGIFactory1 *factory; + ComPtr < IDXGIFactory2 > factory2; + ComPtr < IDXGISwapChain1 > swapchain; + HRESULT hr; + + factory = gst_d3d11_device_get_dxgi_factory_handle (data->d3d11_device); + hr = factory->QueryInterface (IID_PPV_ARGS (&factory2)); + if (FAILED (hr)) + return false; + + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + desc.BufferCount = 2; + desc.Scaling = DXGI_SCALING_NONE; + desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; + desc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; + + hr = factory2->CreateSwapChainForHwnd (data->device, data->hwnd, &desc, + nullptr, nullptr, &swapchain); + if (FAILED (hr)) + return false; + + data->swapchain = swapchain.Detach (); + + return true; +} + +gint +main (gint argc, gchar ** argv) +{ + GIOChannel *msg_io_channel = nullptr; + AppData app_data = { nullptr, }; + + gst_init (nullptr, nullptr); + + app_data.loop = g_main_loop_new (nullptr, FALSE); + + /* Create D3D11 device */ + if (!create_device (&app_data)) { + gst_printerrln ("No available hardware device"); + exit (1); + } + + /* Creates GstD3D11Device using our device handle. + * Note that gst_d3d11_device_new_wrapped() method does not take ownership of + * ID3D11Device handle, instead refcount of ID3D11Device handle will be + * increased by one */ + app_data.d3d11_device = gst_d3d11_device_new_wrapped (app_data.device); + if (!app_data.d3d11_device) { + gst_printerrln ("Couldn't create GstD3D11Device object"); + exit (1); + } + + /* Creates window and swapchain */ + app_data.hwnd = create_window (); + if (!app_data.hwnd) { + gst_printerrln ("Couldn't create window handle"); + exit (1); + } + SetPropA (app_data.hwnd, APP_DATA_PROP_NAME, &app_data); + + msg_io_channel = g_io_channel_win32_new_messages (0); + g_io_add_watch (msg_io_channel, G_IO_IN, msg_cb, NULL); + + if (!create_swapchain (&app_data)) { + gst_printerrln ("Couldn't create swapchain"); + exit (1); + } + + /* Calls this manually to hold swap chain backbuffer */ + handle_window_resize (&app_data); + + if (!create_pipelne (&app_data)) + exit (1); + + /* All done! */ + set_key_handler ((KeyInputCallback) keyboard_cb, &app_data); + + gst_element_set_state (app_data.pipeline, GST_STATE_PLAYING); + ShowWindow (app_data.hwnd, SW_SHOW); + g_main_loop_run (app_data.loop); + + unset_key_handler (); + + gst_element_set_state (app_data.pipeline, GST_STATE_NULL); + gst_bus_remove_watch (GST_ELEMENT_BUS (app_data.pipeline)); + +#define CLEAR_COM(obj) G_STMT_START { \ + if (obj) { \ + (obj)->Release (); \ + } \ + } G_STMT_END + + gst_clear_buffer (&app_data.backbuffer); + CLEAR_COM (app_data.swapchain); + CLEAR_COM (app_data.context); + CLEAR_COM (app_data.device); + + if (app_data.hwnd) + DestroyWindow (app_data.hwnd); + + gst_clear_object (&app_data.d3d11_device); + gst_clear_object (&app_data.pipeline); + + if (msg_io_channel) + g_io_channel_unref (msg_io_channel); + g_main_loop_unref (app_data.loop); + + return 0; +}
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/d3d11/d3d11decoder-appsink.cpp
Added
@@ -0,0 +1,781 @@ +/* + * GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/d3d11/gstd3d11.h> +#include <gst/app/app.h> +#include <windows.h> +#include <wrl.h> +#include <string> +#include <d3d11_1.h> +#include <dxgi1_2.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +#define APP_DATA_PROP_NAME "AppData" + +typedef struct +{ + GMainLoop *loop; + GstElement *pipeline; + GstD3D11Device *d3d11_device; + + LUID luid; + + IDXGIFactory1 *factory; + ID3D11Device *device; + ID3D11DeviceContext *context; + + ID3D11VideoDevice *video_device; + ID3D11VideoContext1 *video_context; + ID3D11VideoProcessorEnumerator *proc_enum; + ID3D11VideoProcessor *processor; + + IDXGISwapChain1 *swapchain; + ID3D11VideoProcessorOutputView *pov; + + guint window_width; + guint window_height; + + HWND hwnd; +} AppData; + +static bool +create_device (AppData * data) +{ + ComPtr < IDXGIFactory1 > factory; + ComPtr < ID3D11Device > device; + ComPtr < ID3D11DeviceContext > context; + ComPtr < IDXGIAdapter1 > adapter; + HRESULT hr; + DXGI_ADAPTER_DESC1 desc; + static const D3D_FEATURE_LEVEL feature_levels = { + D3D_FEATURE_LEVEL_11_1, + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + }; + + hr = CreateDXGIFactory1 (IID_PPV_ARGS (&factory)); + if (FAILED (hr)) + return false; + + /* Find hardware adapter */ + for (guint i = 0; SUCCEEDED (hr); i++) { + + hr = factory->EnumAdapters1 (i, &adapter); + if (FAILED (hr)) + return false; + + hr = adapter->GetDesc1 (&desc); + if (FAILED (hr)) + return false; + + /* DXGI_ADAPTER_FLAG_SOFTWARE, old mingw does not define this enum */ + if ((desc.Flags & 0x2) == 0) + break; + + adapter = nullptr; + } + + if (!adapter) + return false; + + hr = D3D11CreateDevice (adapter.Get (), D3D_DRIVER_TYPE_UNKNOWN, + nullptr, D3D11_CREATE_DEVICE_BGRA_SUPPORT, + feature_levels, + G_N_ELEMENTS (feature_levels), D3D11_SDK_VERSION, &device, nullptr, + &context); + + if (FAILED (hr)) + return false; + + data->factory = factory.Detach (); + data->device = device.Detach (); + data->context = context.Detach (); + data->luid = desc.AdapterLuid; + + return true; +} + +static bool +find_decoder (gint64 luid, std::string & feature_name) +{ + GList *features; + GList *iter; + + /* Load features of d3d11 plugin */ + features = gst_registry_get_feature_list_by_plugin (gst_registry_get (), + "d3d11"); + + if (!features) + return false; + + for (iter = features; iter; iter = g_list_next (iter)) { + GstPluginFeature *f = GST_PLUGIN_FEATURE (iter->data); + GstElementFactory *factory; + const gchar *name; + GstElement *element; + gint64 adapter_luid; + + if (!GST_IS_ELEMENT_FACTORY (f)) + continue; + + factory = GST_ELEMENT_FACTORY (f); + if (!gst_element_factory_list_is_type (factory, + GST_ELEMENT_FACTORY_TYPE_DECODER)) + continue; + + name = gst_plugin_feature_get_name (f); + if (!g_strrstr (name, "h264")) + continue; + + element = gst_element_factory_create (factory, nullptr); + /* unexpected */ + if (!element) + continue; + + /* query adapter-luid associated with this decoder */ + g_object_get (element, "adapter-luid", &adapter_luid, nullptr); + gst_object_unref (element); + + /* element object can be directly used in pipeline, but this example + * demonstrates a way of plugin enumeration */ + if (adapter_luid == luid) { + feature_name = name; + break; + } + } + + gst_plugin_feature_list_free (features); + + if (feature_name.empty ()) + return false; + + return true; +} + +static bool +create_video_processor (AppData * data) +{ + ComPtr < ID3D11VideoDevice > video_device; + ComPtr < ID3D11VideoContext1 > video_context; + ComPtr < ID3D11VideoProcessorEnumerator > proc_enum; + ComPtr < ID3D11VideoProcessor > processor; + D3D11_VIDEO_PROCESSOR_CONTENT_DESC desc; + HRESULT hr; + + hr = data->device->QueryInterface (IID_PPV_ARGS (&video_device)); + if (FAILED (hr)) + return false; + + hr = data->context->QueryInterface (IID_PPV_ARGS (&video_context)); + if (FAILED (hr)) + return false; + + memset (&desc, 0, sizeof (desc)); + + /* resolution here is not that important */ + desc.InputWidth = desc.OutputWidth = 640; + desc.InputHeight = desc.OutputHeight = 480; + desc.InputFrameFormat = D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE; + desc.Usage = D3D11_VIDEO_USAGE_PLAYBACK_NORMAL; + + hr = video_device->CreateVideoProcessorEnumerator (&desc, &proc_enum); + if (FAILED (hr)) + return false; + + hr = video_device->CreateVideoProcessor (proc_enum.Get (), 0, &processor); + if (FAILED (hr)) + return false; + + video_context->VideoProcessorSetStreamColorSpace1 (processor.Get (), + 0, DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709); + video_context->VideoProcessorSetOutputColorSpace1 (processor.Get (), + DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709); + + data->video_device = video_device.Detach (); + data->video_context = video_context.Detach (); + data->proc_enum = proc_enum.Detach (); + data->processor = processor.Detach (); + + return true; +} + +static gboolean +bus_handler (GstBus * bus, GstMessage * msg, AppData * app_data) +{ + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_ERROR:{ + GError *err; + gchar *dbg; + + gst_message_parse_error (msg, &err, &dbg); + gst_printerrln ("ERROR %s", err->message); + if (dbg != nullptr) + gst_printerrln ("ERROR debug information: %s", dbg); + g_clear_error (&err); + g_free (dbg); + + g_main_loop_quit (app_data->loop); + break; + } + case GST_MESSAGE_EOS: + gst_println ("Got EOS"); + g_main_loop_quit (app_data->loop); + break; + default: + break; + } + + return TRUE; +} + +static GstBusSyncReply +bus_sync_handler (GstBus * bus, GstMessage * msg, AppData * data) +{ + const gchar *context_type; + GstContext *context; + gchar *context_str; + + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_HAVE_CONTEXT:{ + gchar *context_str; + + gst_message_parse_have_context (msg, &context); + + context_type = gst_context_get_context_type (context); + context_str = + gst_structure_to_string (gst_context_get_structure (context)); + gst_println ("Got context from element '%s': %s=%s", + GST_ELEMENT_NAME (GST_MESSAGE_SRC (msg)), context_type, context_str); + g_free (context_str); + gst_context_unref (context); + break; + } + case GST_MESSAGE_NEED_CONTEXT:{ + gst_message_parse_context_type (msg, &context_type); + if (g_strcmp0 (context_type, GST_D3D11_DEVICE_HANDLE_CONTEXT_TYPE) != 0) + return GST_BUS_PASS; + + context = gst_d3d11_context_new (data->d3d11_device); + context_str = + gst_structure_to_string (gst_context_get_structure (context)); + gst_println ("Setting context '%s': %s=%s", + GST_ELEMENT_NAME (GST_MESSAGE_SRC (msg)), context_type, context_str); + g_free (context_str); + gst_element_set_context (GST_ELEMENT (msg->src), context); + gst_context_unref (context); + break; + } + default: + break; + } + + return GST_BUS_PASS; +} + +static GstFlowReturn +on_new_sample (GstAppSink * appsink, gpointer user_data) +{ + AppData *app_data = (AppData *) user_data; + ID3D11VideoContext1 *video_context = app_data->video_context; + ID3D11VideoProcessor *processor = app_data->processor; + ID3D11VideoProcessorOutputView *pov = app_data->pov; + GstSample *sample = gst_app_sink_pull_sample (appsink); + GstCaps *caps; + GstBuffer *buffer; + GstVideoInfo video_info; + GstMemory *mem; + GstD3D11Memory *dmem; + ComPtr < ID3D11VideoProcessorInputView > piv; + D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC desc; + guint subresource_index; + HRESULT hr; + GstMapInfo info; + GstMapFlags map_flags; + ID3D11Texture2D *texture; + RECT src_rect, dest_rect; + D3D11_VIDEO_PROCESSOR_STREAM stream = { 0, }; + GstVideoRectangle s, d, r; + + if (!sample) + return GST_FLOW_ERROR; + + buffer = gst_sample_get_buffer (sample); + if (!buffer) { + gst_sample_unref (sample); + return GST_FLOW_OK; + } + + caps = gst_sample_get_caps (sample); + if (!caps) { + gst_sample_unref (sample); + return GST_FLOW_OK; + } + + if (!gst_video_info_from_caps (&video_info, caps)) { + gst_printerrln ("Invalid caps"); + return GST_FLOW_ERROR; + } + + mem = gst_buffer_peek_memory (buffer, 0); + if (!mem) { + gst_printerrln ("Empty buffer"); + gst_sample_unref (sample); + return GST_FLOW_ERROR; + } + + /* memory must be d3d11 memory */ + if (!gst_is_d3d11_memory (mem)) { + gst_printerrln ("Not a d3d11 memory"); + gst_sample_unref (sample); + return GST_FLOW_ERROR; + } + + dmem = GST_D3D11_MEMORY_CAST (mem); + /* decoder output texture may be texture array. Application should check + * subresource index */ + subresource_index = gst_d3d11_memory_get_subresource_index (dmem); + + /* Use GST_MAP_D3D11 flag to indicate that direct Direct3D11 resource + * is required instead of system memory access. + * + * CAUTION: Application must not try to write/modify texture rendered by + * video decoder since it's likely a reference frame. If it's modified by + * application, then the other decoded frames would be broken. + * Only read access is allowed in this case */ + map_flags = (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11); + + if (!gst_memory_map (mem, &info, map_flags)) { + gst_printerrln ("Couldn't map d3d11 memory"); + gst_sample_unref (sample); + return GST_FLOW_ERROR; + } + + texture = (ID3D11Texture2D *) info.data; + + desc.FourCC = 0; + desc.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D; + desc.Texture2D.MipSlice = 0; + desc.Texture2D.ArraySlice = subresource_index; + + hr = app_data->video_device->CreateVideoProcessorInputView (texture, + app_data->proc_enum, &desc, &piv); + if (FAILED (hr)) { + gst_printerrln ("Couldn't create PIV"); + gst_memory_unmap (mem, &info); + gst_sample_unref (sample); + return GST_FLOW_ERROR; + } + + /* DXGI, ID3D11DeviceContext, and ID3D11VideoContext APIs are not thread-safe. + * Application should take d3d11 device lock */ + gst_d3d11_device_lock (app_data->d3d11_device); + + /* calculates destination render rectangle to keep aspect ratio */ + if (app_data->window_width == 0 || app_data->window_height == 0) { + /* No client area to draw */ + goto out; + } + + s.x = 0; + s.y = 0; + s.w = GST_VIDEO_INFO_WIDTH (&video_info); + s.h = GST_VIDEO_INFO_HEIGHT (&video_info); + + d.x = 0; + d.y = 0; + d.w = app_data->window_width; + d.h = app_data->window_height; + + gst_video_center_rect (&s, &d, &r, TRUE); + + src_rect.left = 0; + src_rect.top = 0; + src_rect.right = GST_VIDEO_INFO_WIDTH (&video_info); + src_rect.bottom = GST_VIDEO_INFO_HEIGHT (&video_info); + + dest_rect.left = r.x; + dest_rect.top = r.y; + dest_rect.right = r.x + r.w; + dest_rect.bottom = r.y + r.h; + + /* Converts YUV -> RGBA using processor */ + stream.Enable = TRUE; + stream.pInputSurface = piv.Get (); + + video_context->VideoProcessorSetStreamSourceRect (processor, 0, TRUE, + &src_rect); + video_context->VideoProcessorSetStreamDestRect (processor, + 0, TRUE, &dest_rect); + video_context->VideoProcessorSetOutputTargetRect (processor, + TRUE, &dest_rect); + video_context->VideoProcessorBlt (processor, pov, 0, 1, &stream); + app_data->swapchain->Present (0, 0); + +out: + gst_d3d11_device_unlock (app_data->d3d11_device); + gst_memory_unmap (mem, &info); + gst_sample_unref (sample); + + return GST_FLOW_OK; +} + +static bool +create_pipelne (const std::string & decoder_name, + const gchar * location, AppData * app_data) +{ + GstElement *pipeline; + GstElement *sink; + std::string pipeline_str; + GError *error = nullptr; + GstCaps *caps; + GstBus *bus; + GstAppSinkCallbacks callbacks = { nullptr }; + + pipeline_str = "filesrc location=" + std::string (location) + + " ! parsebin ! " + decoder_name + " ! queue ! appsink name=sink"; + gst_println ("Creating pipeline %s", pipeline_str.c_str ()); + + pipeline = gst_parse_launch (pipeline_str.c_str (), &error); + if (error) { + gst_printerrln ("Couldn't create pipeline: %s", error->message); + g_clear_error (&error); + return false; + } + + sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink"); + + callbacks.new_sample = on_new_sample; + gst_app_sink_set_callbacks (GST_APP_SINK (sink), + &callbacks, app_data, nullptr); + + /* Set d3d11 caps to appsink so that d3d11 decoder can decide output + * memory type as d3d11, not system memory. + * In case that downstream does not support d3d11 memory feature, + * d3d11 decoder elements will output system memory + */ + caps = gst_caps_from_string ("video/x-raw(memory:D3D11Memory)"); + g_object_set (sink, "caps", caps, nullptr); + gst_caps_unref (caps); + gst_object_unref (sink); + + app_data->pipeline = pipeline; + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + + /* Listen need-context message from sync handler in case that application + * wants to share application's d3d11 device with pipeline */ + gst_bus_set_sync_handler (bus, (GstBusSyncHandler) bus_sync_handler, app_data, + nullptr); + gst_bus_add_watch (bus, (GstBusFunc) bus_handler, app_data); + gst_object_unref (bus); + + return true; +} + +static void +handle_window_resize (AppData * app_data) +{ + HRESULT hr; + ComPtr < ID3D11Texture2D > backbuffer; + D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC pov_desc; + D3D11_TEXTURE2D_DESC desc; + + if (!app_data->device || !app_data->swapchain || + !app_data->video_device || !app_data->video_context + || !app_data->proc_enum || !app_data->processor) + return; + + /* DXGI and ID3D11DeviceContext APIs are not thread-safe. + * Application must take gst_d3d11_device_lock() in those case */ + gst_d3d11_device_lock (app_data->d3d11_device); + + /* Clear previously configured POV if any */ + if (app_data->pov) + app_data->pov->Release (); + app_data->pov = nullptr; + + hr = app_data->swapchain->ResizeBuffers (0, + 0, 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0); + if (FAILED (hr)) { + gst_printerrln ("Failed to resize swapchain buffers"); + gst_d3d11_device_unlock (app_data->d3d11_device); + exit (1); + } + + hr = app_data->swapchain->GetBuffer (0, IID_PPV_ARGS (&backbuffer)); + if (FAILED (hr)) { + gst_printerrln ("Failed to get swapchain backbuffer"); + gst_d3d11_device_unlock (app_data->d3d11_device); + exit (1); + } + + backbuffer->GetDesc (&desc); + + pov_desc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D; + pov_desc.Texture2D.MipSlice = 0; + + hr = app_data->video_device-> + CreateVideoProcessorOutputView (backbuffer.Get (), app_data->proc_enum, + &pov_desc, &app_data->pov); + if (FAILED (hr)) { + gst_printerrln ("Failed to create POV"); + gst_d3d11_device_unlock (app_data->d3d11_device); + exit (1); + } + + app_data->window_width = desc.Width; + app_data->window_height = desc.Height; + gst_d3d11_device_unlock (app_data->d3d11_device); +} + +static LRESULT CALLBACK +window_proc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) { + case WM_DESTROY:{ + AppData *app_data = (AppData *) GetPropA (hwnd, APP_DATA_PROP_NAME); + if (app_data) { + app_data->hwnd = nullptr; + if (app_data->loop) + g_main_loop_quit (app_data->loop); + } + break; + } + case WM_SIZE:{ + AppData *app_data = (AppData *) GetPropA (hwnd, APP_DATA_PROP_NAME); + if (!app_data) + break; + + handle_window_resize (app_data); + break; + } + default: + break; + } + + return DefWindowProc (hwnd, message, wParam, lParam); +} + +static gboolean +msg_cb (GIOChannel * source, GIOCondition condition, gpointer data) +{ + MSG msg; + + if (!PeekMessage (&msg, nullptr, 0, 0, PM_REMOVE)) + return G_SOURCE_CONTINUE; + + TranslateMessage (&msg); + DispatchMessage (&msg); + + return G_SOURCE_CONTINUE; +} + +static HWND +create_window (void) +{ + RECT wr = { 0, 0, 320, 240 }; + WNDCLASSEXA wc = { 0, }; + HINSTANCE hinstance = GetModuleHandle (nullptr); + + wc.cbSize = sizeof (WNDCLASSEXA); + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = (WNDPROC) window_proc; + wc.hInstance = hinstance; + wc.hCursor = LoadCursor (nullptr, IDC_ARROW); + wc.lpszClassName = "GstD3D11VideoSinkExample"; + RegisterClassExA (&wc); + + AdjustWindowRect (&wr, WS_OVERLAPPEDWINDOW, FALSE); + return CreateWindowExA (0, wc.lpszClassName, "GstD3D11VideoDecodeExample", + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, + wr.right - wr.left, wr.bottom - wr.top, (HWND) nullptr, (HMENU) nullptr, + hinstance, nullptr); +} + +static bool +create_swapchain (AppData * data) +{ + DXGI_SWAP_CHAIN_DESC1 desc = { 0, }; + ComPtr < IDXGIFactory2 > factory2; + ComPtr < IDXGISwapChain1 > swapchain; + HRESULT hr; + + hr = data->factory->QueryInterface (IID_PPV_ARGS (&factory2)); + if (FAILED (hr)) + return false; + + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + desc.BufferCount = 2; + desc.Scaling = DXGI_SCALING_NONE; + desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; + desc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; + + hr = factory2->CreateSwapChainForHwnd (data->device, data->hwnd, &desc, + nullptr, nullptr, &swapchain); + if (FAILED (hr)) + return false; + + data->swapchain = swapchain.Detach (); + + return true; +} + +gint +main (gint argc, gchar ** argv) +{ + GIOChannel *msg_io_channel = nullptr; + GOptionContext *option_ctx; + GError *error = nullptr; + gboolean ret; + gchar *location = nullptr; + GOptionEntry options = { + {"location", 0, 0, G_OPTION_ARG_STRING, &location, + "H.264 encoded test file location", nullptr}, + {nullptr,} + }; + gint64 luid; + std::string decoder_name; + AppData app_data = { nullptr, }; + + option_ctx = g_option_context_new ("Direct3D11 decoding example"); + g_option_context_add_main_entries (option_ctx, options, nullptr); + g_option_context_add_group (option_ctx, gst_init_get_option_group ()); + ret = g_option_context_parse (option_ctx, &argc, &argv, &error); + g_option_context_free (option_ctx); + + if (!ret) { + gst_printerrln ("option parsing failed: %s", error->message); + g_clear_error (&error); + exit (1); + } + + if (!location) { + gst_printerrln ("File location is unspecified"); + exit (1); + } + + app_data.loop = g_main_loop_new (nullptr, FALSE); + + /* Create D3D11 device */ + if (!create_device (&app_data)) { + gst_printerrln ("No available hardware device"); + exit (1); + } + + /* Creates GstD3D11Device using our device handle. + * Note that gst_d3d11_device_new_wrapped() method does not take ownership of + * ID3D11Device handle, instead refcount of ID3D11Device handle will be + * increased by one */ + app_data.d3d11_device = gst_d3d11_device_new_wrapped (app_data.device); + if (!app_data.d3d11_device) { + gst_printerrln ("Couldn't create GstD3D11Device object"); + exit (1); + } + + /* Setup video processor for YUV -> RGBA conversion, since swapchain + * used in this example supports only RGBA rendering */ + if (!create_video_processor (&app_data)) { + gst_printerrln ("Couldn't setup video processor for colorspace conversion"); + exit (1); + } + + /* Creates window and swapchain */ + app_data.hwnd = create_window (); + if (!app_data.hwnd) { + gst_printerrln ("Couldn't create window handle"); + exit (1); + } + SetPropA (app_data.hwnd, APP_DATA_PROP_NAME, &app_data); + + msg_io_channel = g_io_channel_win32_new_messages (0); + g_io_add_watch (msg_io_channel, G_IO_IN, msg_cb, NULL); + + if (!create_swapchain (&app_data)) { + gst_printerrln ("Couldn't create swapchain"); + exit (1); + } + + /* Calls this manually for POV to be configured */ + handle_window_resize (&app_data); + + /* All the required preperation for rendering is done. + * Setup GStreamer pipeline now */ + /* converts LUID to int64 and enumerates decoders */ + luid = gst_d3d11_luid_to_int64 (&app_data.luid); + if (!find_decoder (luid, decoder_name)) { + gst_printerrln ("Unable to find h264 decoder element to use"); + exit (1); + } + + gst_println ("Target decoder name: %s", decoder_name.c_str ()); + if (!create_pipelne (decoder_name, location, &app_data)) + exit (1); + + /* All done! */ + gst_element_set_state (app_data.pipeline, GST_STATE_PLAYING); + ShowWindow (app_data.hwnd, SW_SHOW); + g_main_loop_run (app_data.loop); + + gst_element_set_state (app_data.pipeline, GST_STATE_NULL); + gst_bus_remove_watch (GST_ELEMENT_BUS (app_data.pipeline)); + +#define CLEAR_COM(obj) G_STMT_START { \ + if (obj) { \ + (obj)->Release (); \ + } \ + } G_STMT_END + + CLEAR_COM (app_data.pov); + CLEAR_COM (app_data.swapchain); + CLEAR_COM (app_data.processor); + CLEAR_COM (app_data.proc_enum); + CLEAR_COM (app_data.video_context); + CLEAR_COM (app_data.video_device); + CLEAR_COM (app_data.context); + CLEAR_COM (app_data.device); + CLEAR_COM (app_data.factory); + + if (app_data.hwnd) + DestroyWindow (app_data.hwnd); + + gst_clear_object (&app_data.d3d11_device); + gst_clear_object (&app_data.pipeline); + + if (msg_io_channel) + g_io_channel_unref (msg_io_channel); + g_main_loop_unref (app_data.loop); + + g_free (location); + + return 0; +}
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/d3d11/d3d11device.cpp -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/d3d11/d3d11device.cpp
Changed
@@ -126,7 +126,7 @@ ComPtr<ID3D11ShaderResourceView> shader_resource_view; if (srv) { - D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc = { 0, }; + D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc = { DXGI_FORMAT_UNKNOWN, }; srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; srv_desc.Texture2D.MipLevels = 1; srv_desc.Format = format; @@ -262,7 +262,7 @@ " return input;\n" "}\n"; - D3D11_SAMPLER_DESC sampler_desc = { 0, }; + D3D11_SAMPLER_DESC sampler_desc = { D3D11_FILTER_MIN_MAG_MIP_POINT, }; sampler_desc.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT; sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/d3d11/d3d11videosink-appsrc.cpp
Added
@@ -0,0 +1,597 @@ +/* + * GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/d3d11/gstd3d11.h> +#include <gst/app/app.h> +#include <wrl.h> +#include <math.h> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; +/* *INDENT-ON* */ + +typedef struct +{ + GMainLoop *loop; + GstElement *pipeline; + GstD3D11Device *d3d11_device; + GstBufferPool *pool; + + ID3D11Device *device; + ID3D11DeviceContext *context; + gsize mem_size; + + D3D11_TEXTURE2D_DESC desc; + GstVideoInfo video_info; + + GQueue unused_textures; + GstClockTime next_pts; + GstClockTime duration; + + GRecMutex lock; + gint remaining; + guint64 num_frames; +} AppData; + +static bool +create_device (AppData * data) +{ + ComPtr < IDXGIFactory1 > factory; + ComPtr < ID3D11Device > device; + ComPtr < ID3D11DeviceContext > context; + ComPtr < IDXGIAdapter1 > adapter; + HRESULT hr; + DXGI_ADAPTER_DESC1 desc; + static const D3D_FEATURE_LEVEL feature_levels = { + D3D_FEATURE_LEVEL_11_1, + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + }; + + hr = CreateDXGIFactory1 (IID_PPV_ARGS (&factory)); + if (FAILED (hr)) + return false; + + /* Find hardware adapter */ + for (guint i = 0; SUCCEEDED (hr); i++) { + + hr = factory->EnumAdapters1 (i, &adapter); + if (FAILED (hr)) + return false; + + hr = adapter->GetDesc1 (&desc); + if (FAILED (hr)) + return false; + + /* DXGI_ADAPTER_FLAG_SOFTWARE, old mingw does not define this enum */ + if ((desc.Flags & 0x2) == 0) + break; + + adapter = nullptr; + } + + if (!adapter) + return false; + + hr = D3D11CreateDevice (adapter.Get (), D3D_DRIVER_TYPE_UNKNOWN, + nullptr, D3D11_CREATE_DEVICE_BGRA_SUPPORT, + feature_levels, + G_N_ELEMENTS (feature_levels), D3D11_SDK_VERSION, &device, nullptr, + &context); + + if (FAILED (hr)) + return false; + + data->device = device.Detach (); + data->context = context.Detach (); + + return true; +} + +static gboolean +bus_handler (GstBus * bus, GstMessage * msg, AppData * app_data) +{ + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_ERROR:{ + GError *err; + gchar *dbg; + + gst_message_parse_error (msg, &err, &dbg); + gst_printerrln ("ERROR %s", err->message); + if (dbg != nullptr) + gst_printerrln ("ERROR debug information: %s", dbg); + g_clear_error (&err); + g_free (dbg); + + g_main_loop_quit (app_data->loop); + break; + } + case GST_MESSAGE_EOS: + gst_println ("Got EOS"); + g_main_loop_quit (app_data->loop); + break; + default: + break; + } + + return TRUE; +} + +static GstBusSyncReply +bus_sync_handler (GstBus * bus, GstMessage * msg, AppData * data) +{ + const gchar *context_type; + GstContext *context; + gchar *context_str; + + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_HAVE_CONTEXT:{ + gchar *context_str; + + gst_message_parse_have_context (msg, &context); + + context_type = gst_context_get_context_type (context); + context_str = + gst_structure_to_string (gst_context_get_structure (context)); + gst_println ("Got context from element '%s': %s=%s", + GST_ELEMENT_NAME (GST_MESSAGE_SRC (msg)), context_type, context_str); + g_free (context_str); + gst_context_unref (context); + break; + } + case GST_MESSAGE_NEED_CONTEXT:{ + gst_message_parse_context_type (msg, &context_type); + if (g_strcmp0 (context_type, GST_D3D11_DEVICE_HANDLE_CONTEXT_TYPE) != 0) + return GST_BUS_PASS; + + context = gst_d3d11_context_new (data->d3d11_device); + context_str = + gst_structure_to_string (gst_context_get_structure (context)); + gst_println ("Setting context '%s': %s=%s", + GST_ELEMENT_NAME (GST_MESSAGE_SRC (msg)), context_type, context_str); + g_free (context_str); + gst_element_set_context (GST_ELEMENT (msg->src), context); + gst_context_unref (context); + break; + } + default: + break; + } + + return GST_BUS_PASS; +} + +typedef struct +{ + AppData *app_data; + ID3D11Texture2D *texture; +} MemoryUserData; + +static void +on_memory_freed (MemoryUserData * data) +{ + g_rec_mutex_lock (&data->app_data->lock); + g_queue_push_tail (&data->app_data->unused_textures, data->texture); + g_rec_mutex_unlock (&data->app_data->lock); + + g_free (data); +} + +static gdouble +get_clear_value (guint64 num_frames, guint scale) +{ + gdouble val = (gdouble) num_frames / scale; + + val = sin (val); + val = ABS (val); + + return val; +} + +static void +on_need_data (GstAppSrc * appsrc, guint length, gpointer user_data) +{ + AppData *app_data = (AppData *) user_data; + ID3D11Texture2D *texture = nullptr; + HRESULT hr; + ComPtr < ID3D11RenderTargetView > rtv; + FLOAT clear_color4 = { 1.0, 1.0, 1.0, 1.0 }; + GstMemory *mem; + GstD3D11Memory *dmem; + MemoryUserData *memory_data; + GstBuffer *buffer; + gsize offsetGST_VIDEO_MAX_PLANES; + gint strideGST_VIDEO_MAX_PLANES; + guint pitch; + gsize dummy; + + if (app_data->remaining == 0) { + gst_app_src_end_of_stream (appsrc); + return; + } + + clear_color0 = get_clear_value (app_data->num_frames, 50); + clear_color1 = get_clear_value (app_data->num_frames, 100); + clear_color2 = get_clear_value (app_data->num_frames, 200); + app_data->num_frames++; + + g_rec_mutex_lock (&app_data->lock); + texture = (ID3D11Texture2D *) g_queue_pop_head (&app_data->unused_textures); + g_rec_mutex_unlock (&app_data->lock); + + if (!texture) { + hr = app_data->device->CreateTexture2D (&app_data->desc, nullptr, &texture); + if (FAILED (hr)) { + gst_printerrln ("Failed to create texture"); + exit (1); + } + } + + hr = app_data->device->CreateRenderTargetView (texture, nullptr, &rtv); + if (FAILED (hr)) { + gst_printerrln ("Failed to create RTV"); + exit (1); + } + + /* ID3D11DeviceContext API is not thread safe, application should takes lock + * when it's shared with GStreamer */ + gst_d3d11_device_lock (app_data->d3d11_device); + /* Clear with white */ + app_data->context->ClearRenderTargetView (rtv.Get (), clear_color); + gst_d3d11_device_unlock (app_data->d3d11_device); + + /* Demonstrating application-side texture pool. + * GstD3D11BufferPool can be used instead */ + memory_data = g_new0 (MemoryUserData, 1); + memory_data->app_data = app_data; + /* Transfer ownership of this texture to this user data */ + memory_data->texture = texture; + + /* gst_d3d11_allocator_alloc_wrapped() method does not take ownership of + * ID3D11Texture2D object, but in this example, we pass ownership via + * user data */ + mem = gst_d3d11_allocator_alloc_wrapped (nullptr, app_data->d3d11_device, + texture, app_data->mem_size, memory_data, + (GDestroyNotify) on_memory_freed); + + if (!mem) { + gst_printerrln ("Couldn't allocate memory"); + exit (1); + } + + /* update memory size with calculated value by allocator, and reuse it + * for later alloc_wrapped() call to avoid allocating staging texture */ + app_data->mem_size = mem->size; + + /* Calculates CPU accessible (via staging texture) memory layout. + * GstD3D11Memory allows CPU access but application must calculate the layout + * pitch would be likely different from width */ + dmem = GST_D3D11_MEMORY_CAST (mem); + if (!gst_d3d11_memory_get_resource_stride (dmem, &pitch)) { + gst_printerrln ("Couldn't get resource stride"); + exit (1); + } + + if (!gst_d3d11_dxgi_format_get_size (app_data->desc.Format, + app_data->desc.Width, app_data->desc.Height, pitch, offset, stride, + &dummy)) { + gst_printerrln ("Couldn't get memory layout"); + exit (1); + } + + buffer = gst_buffer_new (); + gst_buffer_append_memory (buffer, mem); + + /* Then attach video-meta to signal CPU accessible memory layout information */ + gst_buffer_add_video_meta_full (buffer, GST_VIDEO_FRAME_FLAG_NONE, + GST_VIDEO_INFO_FORMAT (&app_data->video_info), + GST_VIDEO_INFO_WIDTH (&app_data->video_info), + GST_VIDEO_INFO_HEIGHT (&app_data->video_info), + GST_VIDEO_INFO_N_PLANES (&app_data->video_info), offset, stride); + + GST_BUFFER_PTS (buffer) = app_data->next_pts; + GST_BUFFER_DTS (buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DURATION (buffer) = app_data->duration; + + app_data->next_pts += app_data->duration; + + if (gst_app_src_push_buffer (appsrc, buffer) != GST_FLOW_OK) { + gst_printerrln ("Couldn't push buffer to appsrc"); + exit (1); + } + + if (app_data->remaining > 0) + app_data->remaining--; +} + +static void +on_need_data_buffer_pool (GstAppSrc * appsrc, guint length, gpointer user_data) +{ + AppData *app_data = (AppData *) user_data; + ID3D11Texture2D *texture = nullptr; + HRESULT hr; + ComPtr < ID3D11RenderTargetView > rtv; + FLOAT clear_color4 = { 1.0, 1.0, 1.0, 1.0 }; + GstBuffer *buffer; + GstMemory *mem; + GstFlowReturn ret; + GstMapInfo info; + GstMapFlags map_flags; + + if (app_data->remaining == 0) { + gst_app_src_end_of_stream (appsrc); + return; + } + + clear_color0 = get_clear_value (app_data->num_frames, 50); + clear_color1 = get_clear_value (app_data->num_frames, 100); + clear_color2 = get_clear_value (app_data->num_frames, 200); + app_data->num_frames++; + + ret = gst_buffer_pool_acquire_buffer (app_data->pool, &buffer, nullptr); + if (ret != GST_FLOW_OK) { + gst_printerrln ("Failed to acquire buffer"); + exit (1); + } + + /* buffer acquired from d3d11 buffer pool will hold video meta already. + * Application can just update already allocated texture */ + mem = gst_buffer_peek_memory (buffer, 0); + + /* Use GST_MAP_D3D11 flag to indicate that direct Direct3D11 resource + * is required instead of system memory access */ + map_flags = (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11); + if (!gst_memory_map (mem, &info, map_flags)) { + gst_printerrln ("Failed to map memory"); + exit (1); + } + + texture = (ID3D11Texture2D *) info.data; + hr = app_data->device->CreateRenderTargetView (texture, nullptr, &rtv); + if (FAILED (hr)) { + gst_printerrln ("Failed to create RTV"); + exit (1); + } + + /* ID3D11DeviceContext API is not thread safe, application should takes lock + * when it's shared with GStreamer */ + gst_d3d11_device_lock (app_data->d3d11_device); + /* Clear with white */ + app_data->context->ClearRenderTargetView (rtv.Get (), clear_color); + gst_d3d11_device_unlock (app_data->d3d11_device); + + gst_memory_unmap (mem, &info); + + GST_BUFFER_PTS (buffer) = app_data->next_pts; + GST_BUFFER_DTS (buffer) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DURATION (buffer) = app_data->duration; + + app_data->next_pts += app_data->duration; + + if (gst_app_src_push_buffer (appsrc, buffer) != GST_FLOW_OK) { + gst_printerrln ("Couldn't push buffer to appsrc"); + exit (1); + } + + if (app_data->remaining > 0) + app_data->remaining--; +} + +static bool +create_pipelne (AppData * app_data, gboolean use_pool) +{ + GstElement *pipeline; + GstAppSrc *src; + GError *error = nullptr; + GstCaps *caps; + GstBus *bus; + GstAppSrcCallbacks callbacks = { nullptr }; + D3D11_TEXTURE2D_DESC desc = { 0, }; + + /* 640x480 RGBA format will be used in this example */ + desc.Width = 640; + desc.Height = 480; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = D3D11_USAGE_DEFAULT; + /* Bind shader resource for this texture can be used in shader and also + * RTV is used in this example */ + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; + app_data->desc = desc; + + app_data->next_pts = 0; + app_data->duration = GST_SECOND / 30; + + pipeline = gst_parse_launch ("appsrc name=src ! queue ! d3d11videosink", + &error); + if (error) { + gst_printerrln ("Couldn't create pipeline: %s", error->message); + g_clear_error (&error); + return false; + } + + src = GST_APP_SRC (gst_bin_get_by_name (GST_BIN (pipeline), "src")); + + if (use_pool) + callbacks.need_data = on_need_data_buffer_pool; + else + callbacks.need_data = on_need_data; + gst_app_src_set_callbacks (src, &callbacks, app_data, nullptr); + + caps = + gst_caps_from_string + ("video/x-raw(memory:D3D11Memory),format=RGBA,width=640,height=480,framerate=30/1"); + gst_app_src_set_caps (src, caps); + gst_video_info_from_caps (&app_data->video_info, caps); + + gst_app_src_set_stream_type (src, GST_APP_STREAM_TYPE_STREAM); + g_object_set (src, "format", GST_FORMAT_TIME, nullptr); + g_object_unref (src); + + app_data->pipeline = pipeline; + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + + /* Listen need-context message from sync handler in case that application + * wants to share application's d3d11 device with pipeline */ + gst_bus_set_sync_handler (bus, (GstBusSyncHandler) bus_sync_handler, app_data, + nullptr); + gst_bus_add_watch (bus, (GstBusFunc) bus_handler, app_data); + gst_object_unref (bus); + + if (use_pool) { + GstBufferPool *pool; + GstStructure *config; + GstD3D11AllocationParams *params; + + pool = gst_d3d11_buffer_pool_new (app_data->d3d11_device); + config = gst_buffer_pool_get_config (pool); + + gst_buffer_pool_config_set_params (config, caps, + GST_VIDEO_INFO_SIZE (&app_data->video_info), 0, 0); + + /* default allocation param doesn't use any binding flag. + * If binding flag is required, application should create + * allocation param struct and specify options */ + params = gst_d3d11_allocation_params_new (app_data->d3d11_device, + &app_data->video_info, GST_D3D11_ALLOCATION_FLAG_DEFAULT, + D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET, 0); + + gst_buffer_pool_config_set_d3d11_allocation_params (config, params); + gst_d3d11_allocation_params_free (params); + + if (!gst_buffer_pool_set_config (pool, config)) { + gst_printerrln ("Couldn't set config to pool"); + gst_object_unref (pool); + gst_caps_unref (caps); + return false; + } + + if (!gst_buffer_pool_set_active (pool, TRUE)) { + gst_printerrln ("Couldn't set active"); + gst_object_unref (pool); + gst_caps_unref (caps); + return false; + } + + app_data->pool = pool; + } + + gst_caps_unref (caps); + + return true; +} + +static void +clear_texture (ID3D11Texture2D * texture) +{ + texture->Release (); +} + +gint +main (gint argc, gchar ** argv) +{ + GOptionContext *option_ctx; + GError *error = nullptr; + gboolean ret; + gboolean use_pool = FALSE; + gint num_buffers = -1; + GOptionEntry options = { + {"use-bufferpool", 0, 0, G_OPTION_ARG_NONE, &use_pool, + "Use buffer pool", nullptr}, + {"num-buffers", 0, 0, G_OPTION_ARG_INT, &num_buffers, + "The number of buffers to run", nullptr}, + {nullptr,} + }; + AppData app_data = { nullptr, }; + + option_ctx = g_option_context_new ("Direct3D11 appsrc example"); + g_option_context_add_main_entries (option_ctx, options, nullptr); + g_option_context_add_group (option_ctx, gst_init_get_option_group ()); + ret = g_option_context_parse (option_ctx, &argc, &argv, &error); + g_option_context_free (option_ctx); + + if (!ret) { + gst_printerrln ("option parsing failed: %s", error->message); + g_clear_error (&error); + exit (1); + } + + app_data.remaining = num_buffers; + g_rec_mutex_init (&app_data.lock); + g_queue_init (&app_data.unused_textures); + + app_data.loop = g_main_loop_new (nullptr, FALSE); + + /* Create D3D11 device */ + if (!create_device (&app_data)) { + gst_printerrln ("No available hardware device"); + exit (1); + } + + /* Creates GstD3D11Device using our device handle. + * Note that gst_d3d11_device_new_wrapped() method does not take ownership of + * ID3D11Device handle, instead refcount of ID3D11Device handle will be + * increased by one */ + app_data.d3d11_device = gst_d3d11_device_new_wrapped (app_data.device); + if (!app_data.d3d11_device) { + gst_printerrln ("Couldn't create GstD3D11Device object"); + exit (1); + } + + if (!create_pipelne (&app_data, use_pool)) + exit (1); + + /* All done! */ + gst_element_set_state (app_data.pipeline, GST_STATE_PLAYING); + g_main_loop_run (app_data.loop); + + gst_element_set_state (app_data.pipeline, GST_STATE_NULL); + gst_bus_remove_watch (GST_ELEMENT_BUS (app_data.pipeline)); + +#define CLEAR_COM(obj) G_STMT_START { \ + if (obj) { \ + (obj)->Release (); \ + } \ + } G_STMT_END + + g_queue_clear_full (&app_data.unused_textures, + (GDestroyNotify) clear_texture); + g_rec_mutex_clear (&app_data.lock); + + CLEAR_COM (app_data.context); + CLEAR_COM (app_data.device); + + gst_clear_object (&app_data.d3d11_device); + gst_clear_object (&app_data.pipeline); + g_main_loop_unref (app_data.loop); + + return 0; +}
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/d3d11/d3d11videosink-present.cpp
Added
@@ -0,0 +1,670 @@ +/* + * GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <gst/d3d11/gstd3d11.h> +#include <d2d1.h> +#include <dwrite.h> +#include <wrl.h> +#include <string> +#include <queue> + +/* *INDENT-OFF* */ +using namespace Microsoft::WRL; + +struct DisplayContext +{ + HWND window_handle = nullptr; + GstElement *pipeline = nullptr; + GstElement *sink = nullptr; + GIOChannel *io_ch = nullptr; + + bool enable_overlay = false; + + ID2D1Factory *d2d_factory = nullptr; + IDWriteFactory *dwrite_factory = nullptr; + + IDWriteTextFormat *format = nullptr; + IDWriteTextLayout *layout = nullptr; + + /* D3D objects for background redraw with alpha blending */ + ID3D11BlendState *blend = nullptr; + ID3D11PixelShader *ps = nullptr; + ID3D11VertexShader *vs = nullptr; + ID3D11InputLayout *input_layout = nullptr; + ID3D11Buffer *index_buf = nullptr; + ID3D11Buffer *vertex_buf = nullptr; + + UINT width = 0; + UINT height = 0; + + SRWLOCK lock = RTL_SRWLOCK_INIT; + double avg_framerate = 0; + double last_framerate = 0; + + LARGE_INTEGER frequency; + std::queue < LARGE_INTEGER > render_timestamp; + + GMainLoop *loop = nullptr; +}; + +static const gchar templ_vs_color = + "struct VS_INPUT {\n" + " float4 Position: POSITION;\n" + " float4 Color: COLOR;\n" + "};\n" + "struct VS_OUTPUT {\n" + " float4 Position: SV_POSITION;\n" + " float4 Color: COLOR;\n" + "};\n" + "VS_OUTPUT main (VS_INPUT input)\n" + "{\n" + " return input;\n" + "}"; + +static const gchar templ_ps_color = + "struct PS_INPUT {\n" + " float4 Position: SV_POSITION;\n" + " float4 Color: COLOR;\n" + "};\n" + "float4 main(PS_INPUT input) : SV_TARGET\n" + "{\n" + " return input.Color;\n" + "}"; +/* *INDENT-ON* */ + +#define DISPLAY_CONTEXT_PROP "d3d11videosink.example.context" + +#define CLEAR_COM(obj) do { \ + if (obj) { \ + obj->Release (); \ + obj = nullptr; \ + } \ +} while (0) + +static LRESULT CALLBACK +window_proc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + DisplayContext *context = (DisplayContext *) GetPropA (hwnd, + DISPLAY_CONTEXT_PROP); + + switch (message) { + case WM_DESTROY: + gst_println ("Window is destroying"); + if (context) { + context->window_handle = nullptr; + RemovePropA (hwnd, DISPLAY_CONTEXT_PROP); + g_main_loop_quit (context->loop); + } + break; + case WM_LBUTTONUP: + if (!context) { + gst_printerrln ("Display context is not attached on HWND"); + } else { + context->enable_overlay = !context->enable_overlay; + gst_println ("Enable overlay %d", context->enable_overlay); + /* Call expose method so that videosink can immediately + * redraw client area */ + if (context->sink) + gst_video_overlay_expose (GST_VIDEO_OVERLAY (context->sink)); + } + break; + default: + break; + } + + return DefWindowProc (hwnd, message, wParam, lParam); +} + +static gboolean +bus_msg (GstBus * bus, GstMessage * msg, DisplayContext * context) +{ + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_ERROR:{ + GError *err; + gchar *dbg; + + gst_message_parse_error (msg, &err, &dbg); + gst_printerrln ("ERROR %s", err->message); + if (dbg) + gst_printerrln ("ERROR debug information: %s", dbg); + g_clear_error (&err); + g_free (dbg); + + g_main_loop_quit (context->loop); + break; + } + case GST_MESSAGE_EOS: + gst_println ("Got EOS"); + g_main_loop_quit (context->loop); + break; + default: + break; + } + + return TRUE; +} + +static gboolean +msg_cb (GIOChannel * source, GIOCondition condition, gpointer data) +{ + MSG msg; + + if (!PeekMessage (&msg, nullptr, 0, 0, PM_REMOVE)) + return G_SOURCE_CONTINUE; + + TranslateMessage (&msg); + DispatchMessage (&msg); + + return G_SOURCE_CONTINUE; +} + +typedef struct +{ + struct + { + FLOAT x; + FLOAT y; + FLOAT z; + } position; + struct + { + FLOAT r; + FLOAT g; + FLOAT b; + FLOAT a; + } color; +} VertexData; + +static void +ensure_d3d11_resource (DisplayContext * context, GstD3D11Device * device) +{ + D3D11_BLEND_DESC blend_desc; + D3D11_INPUT_ELEMENT_DESC input_desc2; + D3D11_BUFFER_DESC buffer_desc; + D3D11_MAPPED_SUBRESOURCE map; + VertexData *vertex_data; + WORD *indices; + HRESULT hr; + ID3D11Device *device_handle; + ID3D11DeviceContext *context_handle; + + if (context->blend) + return; + + device_handle = gst_d3d11_device_get_device_handle (device); + context_handle = gst_d3d11_device_get_device_context_handle (device); + + ZeroMemory (&blend_desc, sizeof (blend_desc)); + ZeroMemory (input_desc, sizeof (input_desc)); + ZeroMemory (&buffer_desc, sizeof (buffer_desc)); + + input_desc0.SemanticName = "POSITION"; + input_desc0.SemanticIndex = 0; + input_desc0.Format = DXGI_FORMAT_R32G32B32_FLOAT; + input_desc0.InputSlot = 0; + input_desc0.AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; + input_desc0.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + input_desc0.InstanceDataStepRate = 0; + + input_desc1.SemanticName = "COLOR"; + input_desc1.SemanticIndex = 0; + input_desc1.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + input_desc1.InputSlot = 0; + input_desc1.AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; + input_desc1.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + input_desc1.InstanceDataStepRate = 0; + + hr = gst_d3d11_create_vertex_shader_simple (device, templ_vs_color, + "main", input_desc, G_N_ELEMENTS (input_desc), &context->vs, + &context->input_layout); + g_assert (SUCCEEDED (hr)); + + hr = gst_d3d11_create_pixel_shader_simple (device, + templ_ps_color, "main", &context->ps); + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (VertexData) * 4; + buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, + &context->vertex_buf); + g_assert (SUCCEEDED (hr)); + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (WORD) * 6; + buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &context->index_buf); + g_assert (SUCCEEDED (hr)); + + blend_desc.AlphaToCoverageEnable = FALSE; + blend_desc.IndependentBlendEnable = FALSE; + blend_desc.RenderTarget0.BlendEnable = TRUE; + blend_desc.RenderTarget0.SrcBlend = D3D11_BLEND_SRC_ALPHA; + blend_desc.RenderTarget0.DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + blend_desc.RenderTarget0.BlendOp = D3D11_BLEND_OP_ADD; + blend_desc.RenderTarget0.SrcBlendAlpha = D3D11_BLEND_ONE; + blend_desc.RenderTarget0.DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; + blend_desc.RenderTarget0.BlendOpAlpha = D3D11_BLEND_OP_ADD; + blend_desc.RenderTarget0.RenderTargetWriteMask = + D3D11_COLOR_WRITE_ENABLE_ALL; + + hr = device_handle->CreateBlendState (&blend_desc, &context->blend); + g_assert (SUCCEEDED (hr)); + + hr = context_handle->Map (context->vertex_buf, 0, D3D11_MAP_WRITE_DISCARD, 0, + &map); + g_assert (SUCCEEDED (hr)); + vertex_data = (VertexData *) map.pData; + + hr = context_handle->Map (context->index_buf, 0, D3D11_MAP_WRITE_DISCARD, 0, + &map); + g_assert (SUCCEEDED (hr)); + indices = (WORD *) map.pData; + for (guint i = 0; i < 4; i++) { + vertex_datai.color.r = 0.0f; + vertex_datai.color.g = 0.5f; + vertex_datai.color.b = 0.5f; + vertex_datai.color.a = 0.5f; + } + + /* bottom left */ + vertex_data0.position.x = -1.0f; + vertex_data0.position.y = -1.0f; + vertex_data0.position.z = 0.0f; + + /* top left */ + vertex_data1.position.x = -1.0f; + vertex_data1.position.y = 1.0f; + vertex_data1.position.z = 0.0f; + + /* top right */ + vertex_data2.position.x = 1.0f; + vertex_data2.position.y = 1.0f; + vertex_data2.position.z = 0.0f; + + /* bottom right */ + vertex_data3.position.x = 1.0f; + vertex_data3.position.y = -1.0f; + vertex_data3.position.z = 0.0f; + + /* clockwise indexing */ + indices0 = 0; /* bottom left */ + indices1 = 1; /* top left */ + indices2 = 2; /* top right */ + + indices3 = 3; /* bottom right */ + indices4 = 0; /* bottom left */ + indices5 = 2; /* top right */ + + context_handle->Unmap (context->vertex_buf, 0); + context_handle->Unmap (context->index_buf, 0); +} + +/* This callback will be called with gst_d3d11_device_lock() taken by + * d3d11videosink. We can perform GPU operation here safely */ +static void +on_present (GstElement * sink, GstD3D11Device * device, + ID3D11RenderTargetView * rtv, DisplayContext * context) +{ + ComPtr < ID3D11Resource > resource; + ComPtr < ID3D11Texture2D > texture; + ComPtr < IDXGISurface > surface; + ComPtr < ID2D1RenderTarget > d2d_target; + ComPtr < ID2D1SolidColorBrush > text_brush; + ID3D11DeviceContext *device_context; + HRESULT hr; + D3D11_TEXTURE2D_DESC desc; + ID2D1Factory *d2d_factory; + double framerate; + D3D11_VIEWPORT viewport; + UINT vertex_stride = sizeof (VertexData); + UINT offsets = 0; + + if (!context->enable_overlay) + return; + + rtv->GetResource (&resource); + hr = resource.As (&texture); + g_assert (SUCCEEDED (hr)); + + hr = texture.As (&surface); + g_assert (SUCCEEDED (hr)); + + texture->GetDesc (&desc); + + ensure_d3d11_resource (context, device); + device_context = gst_d3d11_device_get_device_context_handle (device); + + viewport.TopLeftX = 0; + viewport.TopLeftY = 0; + viewport.Width = desc.Width; + viewport.Height = desc.Height / 5.0f; + viewport.MinDepth = 0.0f; + viewport.MaxDepth = 1.0f; + + /* Draw background using D3D11 */ + device_context->IASetPrimitiveTopology + (D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + device_context->IASetInputLayout (context->input_layout); + device_context->IASetVertexBuffers (0, 1, &context->vertex_buf, + &vertex_stride, &offsets); + device_context->IASetIndexBuffer (context->index_buf, DXGI_FORMAT_R16_UINT, + 0); + device_context->VSSetShader (context->vs, nullptr, 0); + device_context->PSSetShader (context->ps, nullptr, 0); + device_context->RSSetViewports (1, &viewport); + device_context->OMSetRenderTargets (1, &rtv, nullptr); + device_context->OMSetBlendState (context->blend, nullptr, 0xffffffff); + device_context->DrawIndexed (6, 0, 0); + + /* Creates new layout on window size or framerate change */ + AcquireSRWLockExclusive (&context->lock); + framerate = context->avg_framerate; + if (context->layout && (context->width != desc.Width || + context->height != desc.Height + || context->last_framerate != framerate)) { + CLEAR_COM (context->layout); + } + context->last_framerate = framerate; + ReleaseSRWLockExclusive (&context->lock); + + context->width = desc.Width; + context->height = desc.Height; + + if (!context->layout) { + IDWriteFactory *factory = context->dwrite_factory; + std::wstring overlay_string; + wchar_t fps_buf128; + DWRITE_TEXT_METRICS metrics; + FLOAT font_size; + bool was_decreased = false; + DWRITE_TEXT_RANGE range; + + overlay_string = L"Text Overlay, FPS: "; + std::swprintf (fps_buf, L"%.1f", framerate); + + overlay_string += fps_buf; + + hr = factory->CreateTextLayout (overlay_string.c_str (), + overlay_string.length (), + context->format, desc.Width, desc.Height / 5.0f, &context->layout); + g_assert (SUCCEEDED (hr)); + + context->layout->SetTextAlignment (DWRITE_TEXT_ALIGNMENT_CENTER); + context->layout->SetParagraphAlignment (DWRITE_PARAGRAPH_ALIGNMENT_CENTER); + + range.startPosition = 0; + range.length = overlay_string.length (); + + /* Calculate best font size */ + do { + hr = context->layout->GetMetrics (&metrics); + g_assert (SUCCEEDED (hr)); + + context->layout->GetFontSize (0, &font_size); + if (metrics.widthIncludingTrailingWhitespace >= (FLOAT) desc.Width) { + if (font_size > 1.0f) { + font_size -= 0.5f; + was_decreased = true; + hr = context->layout->SetFontSize (font_size, range); + g_assert (SUCCEEDED (hr)); + continue; + } + + break; + } + + if (was_decreased) + break; + + if (metrics.widthIncludingTrailingWhitespace < (FLOAT) desc.Width) { + if (metrics.widthIncludingTrailingWhitespace >= desc.Width * 0.7) + break; + + font_size += 0.5f; + hr = context->layout->SetFontSize (font_size, range); + g_assert (SUCCEEDED (hr)); + continue; + } + } while (true); + } + + d2d_factory = context->d2d_factory; + D2D1_RENDER_TARGET_PROPERTIES props; + props.type = D2D1_RENDER_TARGET_TYPE_DEFAULT; + props.pixelFormat.format = DXGI_FORMAT_B8G8R8A8_UNORM; + props.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED; + /* default DPI */ + props.dpiX = 0; + props.dpiY = 0; + props.usage = D2D1_RENDER_TARGET_USAGE_NONE; + props.minLevel = D2D1_FEATURE_LEVEL_DEFAULT; + + /* Creates D2D render target using swapchin's backbuffer */ + hr = d2d_factory->CreateDxgiSurfaceRenderTarget (surface.Get (), props, + &d2d_target); + g_assert (SUCCEEDED (hr)); + + /* text brush */ + hr = d2d_target->CreateSolidColorBrush (D2D1::ColorF (D2D1::ColorF::Black), + &text_brush); + g_assert (SUCCEEDED (hr)); + + d2d_target->BeginDraw (); + /* Draw text */ + d2d_target->DrawTextLayout (D2D1::Point2F (0, 0), + context->layout, text_brush.Get (), D2D1_DRAW_TEXT_OPTIONS_NONE); + d2d_target->EndDraw (); +} + +static GstPadProbeReturn +framerate_calculate_probe (GstPad * pad, GstPadProbeInfo * info, + DisplayContext * context) +{ + LARGE_INTEGER now; + + AcquireSRWLockExclusive (&context->lock); + + QueryPerformanceCounter (&now); + context->render_timestamp.push (now); + + if (context->render_timestamp.size () > 10) { + LARGE_INTEGER last = context->render_timestamp.back (); + LARGE_INTEGER first = context->render_timestamp.front (); + double diff = last.QuadPart - first.QuadPart; + context->avg_framerate = + (double) context->frequency.QuadPart * + (context->render_timestamp.size () - 1) / diff; + + std::queue < LARGE_INTEGER > empty_queue; + std::swap (context->render_timestamp, empty_queue); + } + + ReleaseSRWLockExclusive (&context->lock); + + return GST_PAD_PROBE_OK; +} + +gint +main (gint argc, gchar ** argv) +{ + WNDCLASSEXA wc = { 0, }; + HINSTANCE hinstance = GetModuleHandle (nullptr); + GOptionContext *option_ctx; + GError *error = nullptr; + RECT wr = { 0, 0, 320, 240 }; + gboolean ret; + gchar *uri = nullptr; + GOptionEntry options = { + {"uri", 0, 0, G_OPTION_ARG_STRING, &uri, "URI to play", nullptr}, + {nullptr} + }; + HRESULT hr; + DisplayContext context; + GstPad *pad; + + option_ctx = + g_option_context_new ("d3d11videosink \"present\" signal example"); + g_option_context_add_main_entries (option_ctx, options, nullptr); + g_option_context_add_group (option_ctx, gst_init_get_option_group ()); + ret = g_option_context_parse (option_ctx, &argc, &argv, &error); + g_option_context_free (option_ctx); + + if (!ret) { + gst_printerrln ("option parsing failed: %s", error->message); + g_clear_error (&error); + return 1; + } + + if (!uri) { + gst_printerrln ("File name or URI must be provided"); + return 1; + } + + if (!gst_uri_is_valid (uri)) { + gchar *file = gst_filename_to_uri (uri, nullptr); + g_free (uri); + uri = file; + } + + if (!uri) { + gst_printerrln ("No valid URI"); + return 1; + } + + /* Prepare device independent D2D objects */ + hr = D2D1CreateFactory (D2D1_FACTORY_TYPE_MULTI_THREADED, + IID_PPV_ARGS (&context.d2d_factory)); + if (FAILED (hr)) { + gst_printerrln ("Couldn't create D2D factory"); + return 1; + } + + hr = DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, + __uuidof (context.dwrite_factory), + reinterpret_cast < IUnknown ** >(&context.dwrite_factory)); + if (FAILED (hr)) { + gst_printerrln ("Couldn't create DirectWrite factory"); + return 1; + } + + /* Font size will be re-calculated on present */ + hr = context.dwrite_factory->CreateTextFormat (L"Consolas", nullptr, + DWRITE_FONT_WEIGHT_REGULAR, DWRITE_FONT_STYLE_NORMAL, + DWRITE_FONT_STRETCH_NORMAL, 12.0f, L"en-us", &context.format); + + /* For rendered framerate calculation */ + QueryPerformanceFrequency (&context.frequency); + + context.loop = g_main_loop_new (nullptr, FALSE); + + wc.cbSize = sizeof (WNDCLASSEXA); + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = (WNDPROC) window_proc; + wc.hInstance = hinstance; + wc.hCursor = LoadCursor (nullptr, IDC_ARROW); + wc.lpszClassName = "GstD3D11VideoSinkExample"; + RegisterClassExA (&wc); + + AdjustWindowRect (&wr, WS_OVERLAPPEDWINDOW, FALSE); + context.window_handle = + CreateWindowExA (0, wc.lpszClassName, "GstD3D11VideoSinkExample", + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, + wr.right - wr.left, wr.bottom - wr.top, nullptr, nullptr, + hinstance, nullptr); + + context.io_ch = g_io_channel_win32_new_messages (0); + g_io_add_watch (context.io_ch, G_IO_IN, msg_cb, context.window_handle); + + context.pipeline = gst_element_factory_make ("playbin", nullptr); + g_assert (context.pipeline); + + context.sink = gst_element_factory_make ("d3d11videosink", nullptr); + g_assert (context.sink); + + /* Enables present signal */ + g_object_set (context.sink, "emit-present", TRUE, nullptr); + + /* D2D <-> DXGI interop requires BGRA format */ + g_object_set (context.sink, "display-format", DXGI_FORMAT_B8G8R8A8_UNORM, + nullptr); + + g_signal_connect (context.sink, "present", G_CALLBACK (on_present), &context); + gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (context.sink), + (guintptr) context.window_handle); + + /* Attach our display context on HWND */ + SetPropA (context.window_handle, DISPLAY_CONTEXT_PROP, &context); + + g_object_set (context.pipeline, + "uri", uri, "video-sink", context.sink, nullptr); + gst_bus_add_watch (GST_ELEMENT_BUS (context.pipeline), + (GstBusFunc) bus_msg, &context); + + pad = gst_element_get_static_pad (context.sink, "sink"); + gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, + (GstPadProbeCallback) framerate_calculate_probe, &context, nullptr); + + if (gst_element_set_state (context.pipeline, GST_STATE_PLAYING) == + GST_STATE_CHANGE_FAILURE) { + gst_printerrln ("Could not set state to playing for uri %s", uri); + return 1; + } + + ShowWindow (context.window_handle, SW_SHOW); + gst_println ("Click window client area to toggle overlay"); + + g_main_loop_run (context.loop); + + gst_element_set_state (context.pipeline, GST_STATE_NULL); + gst_bus_remove_watch (GST_ELEMENT_BUS (context.pipeline)); + gst_object_unref (context.pipeline); + g_io_channel_unref (context.io_ch); + + if (context.window_handle) + DestroyWindow (context.window_handle); + + CLEAR_COM (context.blend); + CLEAR_COM (context.ps); + CLEAR_COM (context.vs); + CLEAR_COM (context.input_layout); + CLEAR_COM (context.index_buf); + CLEAR_COM (context.vertex_buf); + + CLEAR_COM (context.layout); + + context.format->Release (); + context.d2d_factory->Release (); + context.dwrite_factory->Release (); + + g_main_loop_unref (context.loop); + + return 0; +}
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/d3d11/d3d11videosink.c -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/d3d11/d3d11videosink.c
Changed
@@ -27,7 +27,7 @@ #include <windows.h> #include <string.h> -#include "d3d11videosink-kb.h" +#include "../key-handler.h" static GMainLoop *loop = NULL; static gboolean visible = FALSE; @@ -61,13 +61,12 @@ } static void -keyboard_cb (gchar key_input, CallbackData * data) +keyboard_cb (gchar input, gboolean is_ascii, CallbackData * data) { - gchar key; + if (!is_ascii) + return; - key = g_ascii_tolower (key_input); - - switch (key) { + switch (input) { case 'q': case 'Q': gst_element_send_event (data->pipeline, gst_event_new_eos ()); @@ -141,9 +140,9 @@ if (gst_navigation_event_parse_key_event (ev, &key)) { if (strcmp (key, "space") == 0 || strcmp (key, "Space") == 0) { - keyboard_cb (' ', data); + keyboard_cb (' ', TRUE, data); } else { - keyboard_cb (key0, data); + keyboard_cb (key0, TRUE, data); } } } @@ -300,8 +299,7 @@ gst_bus_add_watch (GST_ELEMENT_BUS (pipeline), (GstBusFunc) bus_msg, &cb_data); - gst_d3d11_video_sink_kb_set_key_handler ((GstD3D11VideoSinkKbFunc) - keyboard_cb, &cb_data); + set_key_handler ((KeyInputCallback) keyboard_cb, &cb_data); if (start_fullscreen) g_object_set (sink, "fullscreen", TRUE, NULL); @@ -339,6 +337,8 @@ gst_bus_remove_watch (GST_ELEMENT_BUS (pipeline)); terminate: + unset_key_handler (); + if (hwnd) DestroyWindow (hwnd);
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/d3d11/meson.build -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/d3d11/meson.build
Changed
@@ -1,47 +1,94 @@ -if host_system == 'windows' - executable('d3d11videosink', - 'd3d11videosink.c', 'd3d11videosink-kb.c', - c_args : gst_plugins_bad_args, - include_directories : configinc, libsinc, - dependencies: gst_dep, gstbase_dep, gstvideo_dep, - install: false, - ) +if host_system != 'windows' + subdir_done() +endif + +executable('d3d11videosink', + 'd3d11videosink.c', '../key-handler.c', + c_args : gst_plugins_bad_args, + include_directories : configinc, libsinc, + dependencies: gst_dep, gstbase_dep, gstvideo_dep, + install: false, +) - executable('d3d11screencapturesrc', - 'd3d11screencapturesrc.cpp', +executable('d3d11screencapturesrc', + 'd3d11screencapturesrc.cpp', + c_args : gst_plugins_bad_args, + cpp_args : gst_plugins_bad_args, + include_directories : configinc, libsinc, + dependencies: gst_dep, gstbase_dep, gstvideo_dep, + install: false, +) + +d3d11_lib = cc.find_library('d3d11', required : false) +dxgi_lib = cc.find_library('dxgi', required : false) +d3dcompiler_lib = cc.find_library('d3dcompiler', required: false) +have_d3d11_h = cc.has_header('d3d11.h') +have_dxgi_h = cc.has_header('dxgi1_2.h') +have_d3d11compiler_h = cc.has_header('d3dcompiler.h') + +d3d9_dep = cc.find_library('d3d9', required : false) +have_d3d9_h = cc.has_header('d3d9.h') + +d2d_dep = cc.find_library('d2d1', required: false) +have_d2d_h = cc.has_header('d2d1.h', required: false) + +dwrite_dep = cc.find_library('dwrite', required: false) +have_dwrite_h = cc.has_header('dwrite.h') + +if d3d11_lib.found() and dxgi_lib.found() and d3dcompiler_lib.found() and have_d3d11_h and have_dxgi_h and have_d3d11compiler_h + executable('d3d11videosink-shared-texture', + 'd3d11videosink-shared-texture.cpp', 'd3d11device.cpp', c_args : gst_plugins_bad_args, + cpp_args : gst_plugins_bad_args, include_directories : configinc, libsinc, - dependencies: gst_dep, gstbase_dep, gstvideo_dep, + dependencies: gst_dep, gstbase_dep, gstvideo_dep, d3d11_lib, dxgi_lib, d3dcompiler_lib, install: false, ) - d3d11_lib = cc.find_library('d3d11', required : false) - dxgi_lib = cc.find_library('dxgi', required : false) - d3dcompiler_lib = cc.find_library('d3dcompiler', required: false) - have_d3d11_h = cc.has_header('d3d11.h') - have_dxgi_h = cc.has_header('dxgi1_2.h') - have_d3d11compiler_h = cc.has_header('d3dcompiler.h') + if gstd3d11_dep.found () + executable('d3d11converter', 'd3d11converter.cpp', '../key-handler.c', + c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', + cpp_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', + include_directories : configinc, libsinc, + dependencies: gst_dep, gstbase_dep, gstvideo_dep, d3d11_lib, dxgi_lib, gstd3d11_dep, gstapp_dep, + install: false, + ) - d3d9_dep = cc.find_library('d3d9', required : false) - have_d3d9_h = cc.has_header('d3d9.h') + executable('d3d11decoder-appsink', 'd3d11decoder-appsink.cpp', + c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', + cpp_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', + include_directories : configinc, libsinc, + dependencies: gst_dep, gstbase_dep, gstvideo_dep, d3d11_lib, dxgi_lib, gstd3d11_dep, gstapp_dep, + install: false, + ) - if d3d11_lib.found() and dxgi_lib.found() and d3dcompiler_lib.found() and have_d3d11_h and have_dxgi_h and have_d3d11compiler_h - executable('d3d11videosink-shared-texture', - 'd3d11videosink-shared-texture.cpp', 'd3d11device.cpp', - c_args : gst_plugins_bad_args, + executable('d3d11videosink-appsrc', 'd3d11videosink-appsrc.cpp', + c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', + cpp_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', include_directories : configinc, libsinc, - dependencies: gst_dep, gstbase_dep, gstvideo_dep, d3d11_lib, dxgi_lib, d3dcompiler_lib, + dependencies: gst_dep, gstbase_dep, gstvideo_dep, d3d11_lib, dxgi_lib, gstd3d11_dep, gstapp_dep, install: false, ) - if d3d_dep.found() and have_d3d9_h - executable('d3d11videosink-shared-texture-d3d9ex', - 'd3d11videosink-shared-texture-d3d9ex.cpp', 'd3d11device.cpp', - c_args : gst_plugins_bad_args, + if d2d_dep.found() and have_d2d_h and dwrite_dep.found() and have_dwrite_h + executable('d3d11videosink-present', 'd3d11videosink-present.cpp', + c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', + cpp_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', include_directories : configinc, libsinc, - dependencies: gst_dep, gstbase_dep, gstvideo_dep, d3d11_lib, dxgi_lib, d3dcompiler_lib, d3d9_dep, + dependencies: gst_dep, gstbase_dep, gstvideo_dep, d3d11_lib, dxgi_lib, gstd3d11_dep, d2d_dep, dwrite_dep, install: false, ) endif endif + + if d3d_dep.found() and have_d3d9_h + executable('d3d11videosink-shared-texture-d3d9ex', + 'd3d11videosink-shared-texture-d3d9ex.cpp', 'd3d11device.cpp', + c_args : gst_plugins_bad_args, + cpp_args : gst_plugins_bad_args, + include_directories : configinc, libsinc, + dependencies: gst_dep, gstbase_dep, gstvideo_dep, d3d11_lib, dxgi_lib, d3dcompiler_lib, d3d9_dep, + install: false, + ) + endif endif
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/gtk
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/gtk/gtkwaylandsink.c
Added
@@ -0,0 +1,248 @@ +/* + * Copyright (C) 2014-2021 Collabora Ltd. + * @author George Kiagiadakis <george.kiagiadakis@collabora.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include <gst/gst.h> +#include <gtk/gtk.h> + +static gboolean live = FALSE; +static gboolean scrollable = FALSE; + +static GOptionEntry entries = { + {"live", 'l', 0, G_OPTION_ARG_NONE, &live, "Use a live source", NULL}, + {"scrollable", 's', 0, G_OPTION_ARG_NONE, &scrollable, + "Put the GtkWaylandSink into a GtkScrolledWindow ", NULL}, + {NULL} +}; + +typedef struct +{ + GtkWidget *app_widget; + + GstElement *pipeline; + + gchar **argv; + gint current_uri; /* index for argv */ + + gboolean is_fullscreen; +} DemoApp; + +static void +on_about_to_finish (GstElement * playbin, DemoApp * d) +{ + if (d->argv++d->current_uri == NULL) + d->current_uri = 1; + + g_print ("Now playing %s\n", d->argvd->current_uri); + g_object_set (playbin, "uri", d->argvd->current_uri, NULL); +} + +static void +error_cb (GstBus * bus, GstMessage * msg, gpointer user_data) +{ + DemoApp *d = user_data; + gchar *debug = NULL; + GError *err = NULL; + + gst_message_parse_error (msg, &err, &debug); + + g_print ("Error: %s\n", err->message); + g_error_free (err); + + if (debug) { + g_print ("Debug details: %s\n", debug); + g_free (debug); + } + + gst_element_set_state (d->pipeline, GST_STATE_NULL); +} + +static gboolean +video_widget_button_pressed_cb (GtkWidget * widget, + GdkEventButton * eventButton, DemoApp * d) +{ + if (eventButton->type == GDK_2BUTTON_PRESS) { + if (d->is_fullscreen) { + gtk_window_unfullscreen (GTK_WINDOW (d->app_widget)); + d->is_fullscreen = FALSE; + } else { + gtk_window_fullscreen (GTK_WINDOW (d->app_widget)); + d->is_fullscreen = TRUE; + } + } + + return FALSE; +} + +static void +playing_clicked_cb (GtkButton * button, DemoApp * d) +{ + gst_element_set_state (d->pipeline, GST_STATE_PLAYING); +} + +static void +paused_clicked_cb (GtkButton * button, DemoApp * d) +{ + gst_element_set_state (d->pipeline, GST_STATE_PAUSED); +} + +static void +ready_clicked_cb (GtkButton * button, DemoApp * d) +{ + gst_element_set_state (d->pipeline, GST_STATE_READY); +} + +static void +null_clicked_cb (GtkButton * button, DemoApp * d) +{ + gst_element_set_state (d->pipeline, GST_STATE_NULL); +} + +static void +build_window (DemoApp * d) +{ + GtkBuilder *builder; + GstElement *sink; + GtkWidget *box; + GtkWidget *widget; + GError *error = NULL; + + builder = gtk_builder_new (); + if (!gtk_builder_add_from_file (builder, "window.ui", &error)) { + g_error ("Failed to load window.ui: %s", error->message); + g_error_free (error); + goto exit; + } + + d->app_widget = GTK_WIDGET (gtk_builder_get_object (builder, "window")); + g_object_ref (d->app_widget); + g_signal_connect (d->app_widget, "destroy", G_CALLBACK (gtk_main_quit), NULL); + + box = GTK_WIDGET (gtk_builder_get_object (builder, "box")); + sink = gst_bin_get_by_name (GST_BIN (d->pipeline), "vsink"); + if (!sink && !g_strcmp0 (G_OBJECT_TYPE_NAME (d->pipeline), "GstPlayBin")) { + g_object_get (d->pipeline, "video-sink", &sink, NULL); + if (sink && g_strcmp0 (G_OBJECT_TYPE_NAME (sink), "GstGtkWaylandSink") != 0 + && GST_IS_BIN (sink)) { + GstBin *sinkbin = GST_BIN (sink); + sink = gst_bin_get_by_name (sinkbin, "vsink"); + gst_object_unref (sinkbin); + } + } + g_assert (sink); + + g_object_get (sink, "widget", &widget, NULL); + if (scrollable) { + GtkWidget *scrollable; + scrollable = gtk_scrolled_window_new (NULL, NULL); + + gtk_container_add (GTK_CONTAINER (scrollable), widget); + g_object_unref (widget); + widget = scrollable; + } + + gtk_box_pack_start (GTK_BOX (box), widget, TRUE, TRUE, 0); + gtk_box_reorder_child (GTK_BOX (box), widget, 0); + + g_signal_connect (widget, "button-press-event", + G_CALLBACK (video_widget_button_pressed_cb), d); + if (!scrollable) + g_object_unref (widget); + g_object_unref (sink); + + widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_playing")); + g_signal_connect (widget, "clicked", G_CALLBACK (playing_clicked_cb), d); + + widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_paused")); + g_signal_connect (widget, "clicked", G_CALLBACK (paused_clicked_cb), d); + + widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_ready")); + g_signal_connect (widget, "clicked", G_CALLBACK (ready_clicked_cb), d); + + widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_null")); + g_signal_connect (widget, "clicked", G_CALLBACK (null_clicked_cb), d); + + gtk_widget_show_all (d->app_widget); + +exit: + g_object_unref (builder); +} + +int +main (int argc, char **argv) +{ + DemoApp *d; + GOptionContext *context; + GstBus *bus; + GError *error = NULL; + + gtk_init (&argc, &argv); + gst_init (&argc, &argv); + + context = g_option_context_new ("- gtkwaylandsink demo"); + g_option_context_add_main_entries (context, entries, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) { + g_printerr ("option parsing failed: %s\n", error->message); + return 1; + } + + d = g_slice_new0 (DemoApp); + + if (argc > 1) { + d->argv = argv; + d->current_uri = 1; + + d->pipeline = + gst_parse_launch ("playbin video-sink=\"gtkwaylandsink name=vsink\"", + NULL); + g_object_set (d->pipeline, "uri", argvd->current_uri, NULL); + + /* enable looping */ + g_signal_connect (d->pipeline, "about-to-finish", + G_CALLBACK (on_about_to_finish), d); + } else { + if (live) { + d->pipeline = gst_parse_launch ("videotestsrc pattern=18 " + "background-color=0xFF0062FF is-live=true ! navigationtest ! " + "videoconvert ! gtkwaylandsink name=vsink", NULL); + } else { + d->pipeline = gst_parse_launch ("videotestsrc pattern=18 " + "background-color=0xFF0062FF ! navigationtest ! videoconvert ! " + "gtkwaylandsink name=vsink", NULL); + } + } + + build_window (d); + + bus = gst_pipeline_get_bus (GST_PIPELINE (d->pipeline)); + gst_bus_add_signal_watch (bus); + g_signal_connect (bus, "message::error", G_CALLBACK (error_cb), d); + gst_object_unref (bus); + + gst_element_set_state (d->pipeline, GST_STATE_PLAYING); + + gtk_main (); + + gst_element_set_state (d->pipeline, GST_STATE_NULL); + gst_object_unref (d->pipeline); + g_object_unref (d->app_widget); + g_slice_free (DemoApp, d); + + return 0; +}
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/gtk/meson.build
Added
@@ -0,0 +1,10 @@ +if gtk_dep.found() and gtk_wayland_dep.found() and use_wayland + executable('gtkwaylandsink', + 'gtkwaylandsink.c', + extra_files: 'window.ui', + install: false, + include_directories : configinc, + dependencies : gtk_dep, gst_dep, + c_args : gst_plugins_bad_args, + ) +endif
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/gtk/window.ui
Added
@@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface> + <requires lib="gtk+" version="3.0"/> + <object class="GtkWindow" id="window"> + <property name="can-focus">False</property> + <property name="title" translatable="yes">GStreamer Wayland GTK Demo</property> + <child> + <object class="GtkBox" id="box"> + <property name="height-request">300</property> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + <child> + <object class="GtkButtonBox" id="buttonbox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="layout-style">center</property> + <child> + <object class="GtkButton" id="button_playing"> + <property name="label" translatable="yes">PLAYING</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_paused"> + <property name="label" translatable="yes">PAUSED</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_ready"> + <property name="label" translatable="yes">READY</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_null"> + <property name="label" translatable="yes">NULL</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> +</interface>
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/ipcpipeline/meson.build -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/ipcpipeline/meson.build
Changed
@@ -15,12 +15,12 @@ executable('ipcpipeline1', 'ipcpipeline1.c', include_directories: configinc, - dependencies: glib_dep, gst_dep, gstbase_dep, + dependencies: gst_dep, gstbase_dep, c_args: gst_plugins_bad_args, install: false) executable('ipc-play', 'ipc-play.c', include_directories: configinc, - dependencies: glib_dep, gst_dep, gstbase_dep, gstvideo_dep, + dependencies: gst_dep, gstbase_dep, gstvideo_dep, c_args: gst_plugins_bad_args, install: false)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/key-handler.c
Added
@@ -0,0 +1,268 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "key-handler.h" + +#ifdef G_OS_WIN32 +#include <windows.h> + +typedef struct _Win32KeyHandler +{ + GThread *thread; + HANDLE cancellable; + HANDLE console_handle; + GMutex lock; + gboolean closing; + + KeyInputCallback callback; + gpointer user_data; +} Win32KeyHandler; + +typedef struct +{ + KeyInputCallback callback; + gpointer user_data; + gchar value; + gboolean is_ascii; +} KeyInputCallbackData; + +static Win32KeyHandler *_handler = NULL; + +static gboolean +handler_source_func (KeyInputCallbackData * data) +{ + data->callback (data->value, data->is_ascii, data->user_data); + + return G_SOURCE_REMOVE; +} + +static gpointer +handler_thread_func (Win32KeyHandler * handler) +{ + HANDLE handles2; + + handles0 = handler->cancellable; + handles1 = handler->console_handle; + + while (TRUE) { + DWORD ret = WaitForMultipleObjects (2, handles, FALSE, INFINITE); + INPUT_RECORD buffer; + DWORD num_read = 0; + KeyInputCallbackData *data; + + if (ret == WAIT_FAILED) { + gst_printerrln ("Wait failed"); + return NULL; + } + + g_mutex_lock (&handler->lock); + if (handler->closing) { + g_mutex_unlock (&handler->lock); + + return NULL; + } + g_mutex_unlock (&handler->lock); + + if (!PeekConsoleInput (handler->console_handle, &buffer, 1, &num_read) || + num_read != 1) + continue; + + ReadConsoleInput (handler->console_handle, &buffer, 1, &num_read); + if (buffer.EventType != KEY_EVENT || !buffer.Event.KeyEvent.bKeyDown) + continue; + + data = g_new0 (KeyInputCallbackData, 1); + data->callback = handler->callback; + data->user_data = handler->user_data; + + switch (buffer.Event.KeyEvent.wVirtualKeyCode) { + case VK_UP: + data->value = (gchar) KB_ARROW_UP; + break; + case VK_DOWN: + data->value = (gchar) KB_ARROW_DOWN; + break; + case VK_LEFT: + data->value = (gchar) KB_ARROW_LEFT; + break; + case VK_RIGHT: + data->value = (gchar) KB_ARROW_RIGHT; + break; + default: + data->value = buffer.Event.KeyEvent.uChar.AsciiChar; + data->is_ascii = TRUE; + break; + } + + g_main_context_invoke_full (NULL, + G_PRIORITY_DEFAULT, + (GSourceFunc) handler_source_func, data, (GDestroyNotify) g_free); + } +} + +void +set_key_handler (KeyInputCallback callback, gpointer user_data) +{ + if (_handler || !callback) + return; + + _handler = g_new0 (Win32KeyHandler, 1); + + SECURITY_ATTRIBUTES attr; + attr.nLength = sizeof (SECURITY_ATTRIBUTES); + attr.lpSecurityDescriptor = NULL; + attr.bInheritHandle = FALSE; + + _handler->cancellable = CreateEvent (&attr, TRUE, FALSE, NULL); + _handler->console_handle = GetStdHandle (STD_INPUT_HANDLE); + _handler->callback = callback; + _handler->user_data = user_data; + g_mutex_init (&_handler->lock); + _handler->thread = + g_thread_new ("key-handler", (GThreadFunc) handler_thread_func, _handler); +} + +void +unset_key_handler (void) +{ + if (!_handler) + return; + + g_mutex_lock (&_handler->lock); + _handler->closing = TRUE; + g_mutex_unlock (&_handler->lock); + + SetEvent (_handler->cancellable); + g_thread_join (_handler->thread); + CloseHandle (_handler->cancellable); + g_mutex_clear (&_handler->lock); + + g_clear_pointer (&_handler, g_free); +} +#else /* G_OS_WIN32 */ + +#include <termios.h> +#include <unistd.h> +#include <stdio.h> + +typedef struct _LinuxKeyHandler +{ + gulong watch_id; + struct termios term_settings; + KeyInputCallback callback; + GSource *source; + gpointer user_data; +} LinuxKeyHandler; + +static LinuxKeyHandler *_handler = NULL; + +static gboolean +_handlerio_func (GIOChannel * channel, + GIOCondition condition, LinuxKeyHandler * handler) +{ + if (condition & G_IO_IN) { + GIOStatus status; + gchar buf16 = { 0, }; + gsize read; + + status = + g_io_channel_read_chars (channel, buf, sizeof (buf) - 1, &read, NULL); + if (status == G_IO_STATUS_ERROR) { + return G_SOURCE_REMOVE; + } + + if (status == G_IO_STATUS_NORMAL) { + gchar value; + gboolean is_ascii = FALSE; + + if (g_strcmp0 (buf, "\033A") == 0) { + value = (gchar) KB_ARROW_UP; + } else if (g_strcmp0 (buf, "\033B") == 0) { + value = (gchar) KB_ARROW_DOWN; + } else if (g_strcmp0 (buf, "\033D") == 0) { + value = (gchar) KB_ARROW_LEFT; + } else if (g_strcmp0 (buf, "\033C") == 0) { + value = (gchar) KB_ARROW_RIGHT; + } else { + value = buf0; + is_ascii = TRUE; + } + + handler->callback (value, is_ascii, handler->user_data); + } + } + + return G_SOURCE_CONTINUE; +} + +void +set_key_handler (KeyInputCallback callback, gpointer user_data) +{ + struct termios new_settings; + struct termios old_settings; + GIOChannel *io_channel; + + if (_handler || !callback) + return; + + if (tcgetattr (STDIN_FILENO, &old_settings) != 0) + return; + + new_settings = old_settings; + new_settings.c_lflag &= ~(ECHO | ICANON | IEXTEN); + new_settings.c_ccVMIN = 0; + new_settings.c_ccVTIME = 0; + + if (tcsetattr (STDIN_FILENO, TCSAFLUSH, &new_settings) != 0) + return; + + setvbuf (stdin, NULL, _IONBF, 0); + + _handler = g_new0 (LinuxKeyHandler, 1); + _handler->term_settings = old_settings; + _handler->callback = callback; + _handler->user_data = user_data; + + io_channel = g_io_channel_unix_new (STDIN_FILENO); + + _handler->source = g_io_create_watch (io_channel, G_IO_IN); + g_io_channel_unref (io_channel); + + g_source_set_callback (_handler->source, (GSourceFunc) _handlerio_func, + _handler, NULL); + g_source_attach (_handler->source, NULL); +} + +void +unset_key_handler (void) +{ + if (!_handler) + return; + + if (_handler->source) { + g_source_destroy (_handler->source); + g_source_unref (_handler->source); + } + + tcsetattr (STDIN_FILENO, TCSAFLUSH, &_handler->term_settings); + setvbuf (stdin, NULL, _IOLBF, 0); + + g_clear_pointer (&_handler, g_free); +} +#endif
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/key-handler.h
Added
@@ -0,0 +1,40 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <gst/gst.h> + +G_BEGIN_DECLS + +typedef enum +{ + KB_ARROW_UP = 0, + KB_ARROW_DOWN, + KB_ARROW_LEFT, + KB_ARROW_RIGHT, +} VirtualKeyValue; + +typedef void (*KeyInputCallback) (gchar input, gboolean is_ascii, gpointer user_data); + +void set_key_handler (KeyInputCallback callback, gpointer user_data); + +void unset_key_handler (void); + +G_END_DECLS
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/mediafoundation
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/mediafoundation/meson.build
Added
@@ -0,0 +1,10 @@ +if host_system != 'windows' + subdir_done() +endif + +executable('mfvideoenc-dynamic-reconfigure', + 'mfvideoenc-dynamic-reconfigure.c', '../key-handler.c', + include_directories : configinc, + dependencies: gst_dep, gstbase_dep, gstvideo_dep, + c_args : gst_plugins_bad_args, + install: false)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/mediafoundation/mfvideoenc-dynamic-reconfigure.c
Added
@@ -0,0 +1,399 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <stdlib.h> +#include "../key-handler.h" + +static GMainLoop *loop = NULL; +static gint width = 640; +static gint height = 480; +static guint bitrate = 1000; + +G_LOCK_DEFINE_STATIC (input_lock); + +typedef struct +{ + GstElement *pipeline; + GstElement *capsfilter; + GstElement *encoder; + gulong probe_id; + + gint prev_width; + gint prev_height; +} TestCallbackData; + + +static void +print_keyboard_help (void) +{ + /* *INDENT-OFF* */ + static struct + { + const gchar *key_desc; + const gchar *key_help; + } key_controls = { + { + "q", "Quit"}, { + "right arrow", "Increase Width"}, { + "left arrow", "Decrease Width"}, { + "up arrow", "Increase Height"}, { + "down arrow", "Decrease Height"}, { + ">", "Increase bitrate by 100 kbit/sec"}, { + "<", "Decrease bitrate by 100 kbit/sec"}, { + "k", "show keyboard shortcuts"} + }; + /* *INDENT-ON* */ + + guint i, chars_to_pad, desc_len, max_desc_len = 0; + + gst_print ("\n\n%s\n\n", "Keyboard controls:"); + + for (i = 0; i < G_N_ELEMENTS (key_controls); ++i) { + desc_len = g_utf8_strlen (key_controlsi.key_desc, -1); + max_desc_len = MAX (max_desc_len, desc_len); + } + ++max_desc_len; + + for (i = 0; i < G_N_ELEMENTS (key_controls); ++i) { + chars_to_pad = max_desc_len - g_utf8_strlen (key_controlsi.key_desc, -1); + gst_print ("\t%s", key_controlsi.key_desc); + gst_print ("%-*s: ", chars_to_pad, ""); + gst_print ("%s\n", key_controlsi.key_help); + } + gst_print ("\n"); +} + +static void +keyboard_cb (gchar input, gboolean is_ascii, gpointer user_data) +{ + TestCallbackData *data = (TestCallbackData *) user_data; + + G_LOCK (input_lock); + + if (!is_ascii) { + switch (input) { + case KB_ARROW_UP: + height += 2; + gst_print ("Increase height to %d\n", height); + break; + case KB_ARROW_DOWN: + height -= 2; + height = MAX (height, 16); + gst_print ("Decrease height to %d\n", height); + break; + case KB_ARROW_LEFT: + width -= 2; + width = MAX (width, 16); + gst_print ("Decrease width to %d\n", width); + break; + case KB_ARROW_RIGHT: + width += 2; + gst_print ("Increase width to %d\n", width); + break; + default: + break; + } + } else { + switch (input) { + case 'k': + case 'K': + print_keyboard_help (); + break; + case 'q': + case 'Q': + gst_element_send_event (data->pipeline, gst_event_new_eos ()); + g_main_loop_quit (loop); + break; + case '>': + bitrate += 100; + bitrate = MIN (bitrate, 2048000); + gst_print ("Increase bitrate to %d\n", bitrate); + g_object_set (data->encoder, "bitrate", bitrate, NULL); + break; + case '<': + bitrate -= 100; + bitrate = MAX (bitrate, 100); + gst_print ("Decrease bitrate to %d\n", bitrate); + g_object_set (data->encoder, "bitrate", bitrate, NULL); + break; + default: + break; + } + } + + G_UNLOCK (input_lock); +} + +static gboolean +bus_msg (GstBus * bus, GstMessage * msg, gpointer user_data) +{ + TestCallbackData *data = (TestCallbackData *) user_data; + GstElement *pipeline = data->pipeline; + + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_STATE_CHANGED: + if (GST_MESSAGE_SRC (msg) == GST_OBJECT_CAST (pipeline)) { + gchar *state_transition_name; + GstState old, new, pending; + + gst_message_parse_state_changed (msg, &old, &new, &pending); + + state_transition_name = g_strdup_printf ("%s_%s", + gst_element_state_get_name (old), gst_element_state_get_name (new)); + + /* dump graph for (some) pipeline state changes */ + { + gchar *dump_name = g_strconcat ("mfvideoenc.", state_transition_name, + NULL); + GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), + GST_DEBUG_GRAPH_SHOW_ALL, dump_name); + g_free (dump_name); + } + g_free (state_transition_name); + } + break; + case GST_MESSAGE_ERROR:{ + GError *err; + gchar *dbg; + + GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), + GST_DEBUG_GRAPH_SHOW_ALL, "mfvideoenc.error"); + + gst_message_parse_error (msg, &err, &dbg); + gst_printerr ("ERROR %s \n", err->message); + if (dbg != NULL) + gst_printerr ("ERROR debug information: %s\n", dbg); + g_clear_error (&err); + g_free (dbg); + + g_main_loop_quit (loop); + break; + } + default: + break; + } + + return TRUE; +} + +static gboolean +check_mfvideoenc_available (const gchar * encoder_name) +{ + gboolean ret = TRUE; + GstElement *elem; + + elem = gst_element_factory_make (encoder_name, NULL); + if (!elem) { + GST_WARNING ("%s is not available", encoder_name); + return FALSE; + } + + /* GST_STATE_READY is meaning that driver could be loaded */ + if (gst_element_set_state (elem, + GST_STATE_PAUSED) != GST_STATE_CHANGE_SUCCESS) { + GST_WARNING ("cannot open device"); + ret = FALSE; + } + + gst_element_set_state (elem, GST_STATE_NULL); + gst_object_unref (elem); + + return ret; +} + +static GstPadProbeReturn +resolution_change_probe (GstPad * pad, GstPadProbeInfo * info, + gpointer user_data) +{ + GstPadProbeReturn ret = GST_PAD_PROBE_OK; + TestCallbackData *data = (TestCallbackData *) user_data; + + G_LOCK (input_lock); + + if (GST_IS_BUFFER (GST_PAD_PROBE_INFO_DATA (info))) { + GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info); + GstPad *peer = gst_pad_get_peer (pad); + GstFlowReturn flow_ret = GST_FLOW_OK; + + ret = GST_PAD_PROBE_HANDLED; + + if (peer) { + flow_ret = gst_pad_chain (peer, buffer); + + if (flow_ret != GST_FLOW_OK) { + gst_pad_remove_probe (pad, data->probe_id); + data->probe_id = 0; + } else { + if (data->prev_width != width || data->prev_height != height) { + GstCaps *caps = NULL; + gint next_width, next_height; + + next_width = width; + next_height = height; + + g_object_get (data->capsfilter, "caps", &caps, NULL); + caps = gst_caps_make_writable (caps); + gst_caps_set_simple (caps, + "width", G_TYPE_INT, next_width, "height", G_TYPE_INT, + next_height, NULL); + g_object_set (data->capsfilter, "caps", caps, NULL); + gst_caps_unref (caps); + + data->prev_width = next_width; + data->prev_height = next_height; + } + } + } + } + + G_UNLOCK (input_lock); + + return ret; +} + +gint +main (gint argc, gchar ** argv) +{ + GstElement *pipeline; + GstElement *src, *capsfilter, *enc, *enc_queue, *dec, *parser, *queue, *sink; + GstStateChangeReturn sret; + GError *error = NULL; + GOptionContext *option_ctx; + GstCaps *caps; + TestCallbackData data = { 0, }; + GstPad *pad; + gchar *encoder_name = NULL; + /* *INDENT-OFF* */ + GOptionEntry options = { + {"encoder", 0, 0, G_OPTION_ARG_STRING, &encoder_name, + "MediaFoundation encoder element to test, default: mfh264enc"}, + {NULL} + }; + /* *INDENT-ON* */ + +#define MAKE_ELEMENT_AND_ADD(elem, name) G_STMT_START { \ + GstElement *_elem = gst_element_factory_make (name, NULL); \ + if (!_elem) { \ + gst_printerrln ("%s is not available", name); \ + exit (1); \ + } \ + gst_println ("Adding element %s", name); \ + elem = _elem; \ + gst_bin_add (GST_BIN (pipeline), elem); \ +} G_STMT_END + + option_ctx = + g_option_context_new + ("MediaFoundation video encoder dynamic reconfigure example"); + g_option_context_add_main_entries (option_ctx, options, NULL); + g_option_context_set_help_enabled (option_ctx, TRUE); + if (!g_option_context_parse (option_ctx, &argc, &argv, &error)) { + gst_printerrln ("option parsing failed: %s\n", error->message); + g_clear_error (&error); + exit (1); + } + + g_option_context_free (option_ctx); + gst_init (NULL, NULL); + + if (!encoder_name) + encoder_name = g_strdup ("mfh264enc"); + + if (!check_mfvideoenc_available (encoder_name)) { + gst_printerrln ("Cannot load %s plugin", encoder_name); + exit (1); + } + + /* prepare the pipeline */ + loop = g_main_loop_new (NULL, FALSE); + + pipeline = gst_pipeline_new (NULL); + + MAKE_ELEMENT_AND_ADD (src, "videotestsrc"); + g_object_set (src, "pattern", 1, NULL); + + MAKE_ELEMENT_AND_ADD (capsfilter, "capsfilter"); + MAKE_ELEMENT_AND_ADD (enc, encoder_name); + + g_object_set (G_OBJECT (enc), "bitrate", bitrate, "gop-size", 30, + "rc-mode", 0, NULL); + + MAKE_ELEMENT_AND_ADD (enc_queue, "queue"); + if (g_strrstr (encoder_name, "h265")) { + MAKE_ELEMENT_AND_ADD (parser, "h265parse"); + MAKE_ELEMENT_AND_ADD (dec, "d3d11h265dec"); + } else if (g_strrstr (encoder_name, "vp9")) { + MAKE_ELEMENT_AND_ADD (parser, "vp9parse"); + MAKE_ELEMENT_AND_ADD (dec, "d3d11vp9dec"); + } else { + MAKE_ELEMENT_AND_ADD (parser, "h264parse"); + MAKE_ELEMENT_AND_ADD (dec, "d3d11h264dec"); + } + MAKE_ELEMENT_AND_ADD (queue, "queue"); + MAKE_ELEMENT_AND_ADD (sink, "d3d11videosink"); + + if (!gst_element_link_many (src, capsfilter, enc, enc_queue, + parser, dec, queue, sink, NULL)) { + gst_printerrln ("Failed to link element"); + exit (1); + } + + caps = gst_caps_new_simple ("video/x-raw", "width", G_TYPE_INT, + width, "height", G_TYPE_INT, height, NULL); + g_object_set (capsfilter, "caps", caps, NULL); + gst_caps_unref (caps); + + data.pipeline = pipeline; + data.capsfilter = capsfilter; + data.encoder = enc; + + pad = gst_element_get_static_pad (capsfilter, "src"); + data.probe_id = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, + (GstPadProbeCallback) resolution_change_probe, &data, NULL); + gst_object_unref (pad); + data.prev_width = width; + data.prev_height = height; + + gst_bus_add_watch (GST_ELEMENT_BUS (pipeline), bus_msg, &data); + + /* run the pipeline */ + sret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + if (sret == GST_STATE_CHANGE_FAILURE) { + gst_printerrln ("Pipeline doesn't want to playing\n"); + } else { + set_key_handler ((KeyInputCallback) keyboard_cb, &data); + g_main_loop_run (loop); + unset_key_handler (); + } + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_bus_remove_watch (GST_ELEMENT_BUS (pipeline)); + + gst_object_unref (pipeline); + g_main_loop_unref (loop); + g_free (encoder_name); + + return 0; +}
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/meson.build -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/meson.build
Changed
@@ -2,14 +2,18 @@ subdir('avsamplesink') subdir('camerabin2') subdir('codecparsers') +subdir('codecs') subdir('d3d11') subdir('directfb') +subdir('gtk') subdir('ipcpipeline') +subdir('mediafoundation') subdir('mpegts') subdir('msdk') subdir('mxf') subdir('nvcodec') subdir('opencv', if_found: opencv_dep) +subdir('qsv') subdir('uvch264') subdir('va') subdir('waylandsink')
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/nvcodec/meson.build -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/nvcodec/meson.build
Changed
@@ -1,5 +1,5 @@ executable('nvcodec', - 'nvcodec.c', 'nvcodec-kb.c', + 'nvcodec.c', '../key-handler.c', include_directories : configinc, dependencies: gst_dep, gstbase_dep, gstvideo_dep, c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API',
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/nvcodec/nvcodec.c -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/nvcodec/nvcodec.c
Changed
@@ -23,8 +23,9 @@ #include <gst/gst.h> #include <gst/video/video.h> +#include <stdlib.h> -#include "nvcodec.h" +#include "../key-handler.h" #define DEFAULT_VIDEO_SINK "autovideosink" @@ -45,29 +46,26 @@ } TestCallbackData; static void -restore_terminal (void) -{ - gst_nvcodec_kb_set_key_handler (NULL, NULL); -} - -static void print_keyboard_help (void) { + /* *INDENT-OFF* */ static struct { const gchar *key_desc; const gchar *key_help; } key_controls = { { - "q or ESC", "Quit"}, { + "q", "Quit"}, { "right arrow", "Increase Width"}, { "left arrow", "Decrease Width"}, { - "up arrow", "Increase Height"}, { + "up arrow", "Increase Height"} , { "down arrow", "Decrease Height"}, { ">", "Increase encoding bitrate by 100 kbit/sec"}, { "<", "Decrease encoding bitrate by 100 kbit/sec"}, { "k", "show keyboard shortcuts"} }; + /* *INDENT-ON* */ + guint i, chars_to_pad, desc_len, max_desc_len = 0; g_print ("\n\n%s\n\n", "Keyboard controls:"); @@ -88,55 +86,54 @@ } static void -keyboard_cb (const gchar * key_input, gpointer user_data) +keyboard_cb (gchar input, gboolean is_ascii, gpointer user_data) { TestCallbackData *data = (TestCallbackData *) user_data; - gchar key = '\0'; - - /* only want to switch/case on single char, not first char of string */ - if (key_input0 != '\0' && key_input1 == '\0') - key = g_ascii_tolower (key_input0); - switch (key) { - case 'k': - print_keyboard_help (); - break; - case 'q': - case 'Q': - gst_element_send_event (data->pipeline, gst_event_new_eos ()); - g_main_loop_quit (loop); - break; - case 27: /* ESC */ - if (key_input1 == '\0') { + if (is_ascii) { + switch (input) { + case 'k': + print_keyboard_help (); + break; + case 'q': + case 'Q': gst_element_send_event (data->pipeline, gst_event_new_eos ()); g_main_loop_quit (loop); - } + break; + case '>': + bitrate += 100; + bitrate = MIN (bitrate, 2048000); + g_print ("Increase encoding bitrate to %d\n", bitrate); + g_object_set (G_OBJECT (data->nvenc), "bitrate", bitrate, NULL); + break; + case '<': + bitrate -= 100; + bitrate = MAX (bitrate, 100); + g_print ("Decrease encoding bitrate to %d\n", bitrate); + g_object_set (G_OBJECT (data->nvenc), "bitrate", bitrate, NULL); + break; + default: + break; + } + + return; + } + + switch (input) { + case KB_ARROW_RIGHT: + g_print ("Increase width to %d\n", ++width); break; - case '>': - bitrate += 100; - bitrate = MIN (bitrate, 2048000); - g_print ("Increase encoding bitrate to %d\n", bitrate); - g_object_set (G_OBJECT (data->nvenc), "bitrate", bitrate, NULL); + case KB_ARROW_LEFT: + g_print ("Decrease width to %d\n", --width); break; - case '<': - bitrate -= 100; - bitrate = MAX (bitrate, 100); - g_print ("Decrease encoding bitrate to %d\n", bitrate); - g_object_set (G_OBJECT (data->nvenc), "bitrate", bitrate, NULL); + case KB_ARROW_UP: + g_print ("Increase height to %d\n", ++height); break; - default:{ - if (strcmp (key_input, GST_NVCODEC_KB_ARROW_RIGHT) == 0) { - g_print ("Increase width to %d\n", ++width); - } else if (strcmp (key_input, GST_NVCODEC_KB_ARROW_LEFT) == 0) { - g_print ("Decrease width to %d\n", --width); - } else if (strcmp (key_input, GST_NVCODEC_KB_ARROW_UP) == 0) { - g_print ("Increase height to %d\n", ++height); - } else if (strcmp (key_input, GST_NVCODEC_KB_ARROW_DOWN) == 0) { - g_print ("Decrease height to %d\n", --height); - } - + case KB_ARROW_DOWN: + g_print ("Decrease height to %d\n", --height); + break; + default: break; - } } } @@ -195,22 +192,32 @@ GstNavigationEventType e_type = gst_navigation_event_get_type (ev); if (e_type == GST_NAVIGATION_EVENT_KEY_PRESS) { const gchar *key; + gchar val = 0; if (gst_navigation_event_parse_key_event (ev, &key)) { + gboolean ascii = TRUE; + GST_INFO ("Key press: %s", key); - if (strcmp (key, "Left") == 0) - key = GST_NVCODEC_KB_ARROW_LEFT; - else if (strcmp (key, "Right") == 0) - key = GST_NVCODEC_KB_ARROW_RIGHT; - else if (strcmp (key, "Up") == 0) - key = GST_NVCODEC_KB_ARROW_UP; - else if (strcmp (key, "Down") == 0) - key = GST_NVCODEC_KB_ARROW_DOWN; - else if (strlen (key) > 1) + val = key0; + + if (g_strcmp0 (key, "Left") == 0) { + val = KB_ARROW_LEFT; + ascii = FALSE; + } else if (g_strcmp0 (key, "Right") == 0) { + val = KB_ARROW_RIGHT; + ascii = FALSE; + } else if (g_strcmp0 (key, "Up") == 0) { + val = KB_ARROW_UP; + ascii = FALSE; + } else if (g_strcmp0 (key, "Down") == 0) { + val = KB_ARROW_DOWN; + ascii = FALSE; + } else if (strlen (key) > 1) { break; + } - keyboard_cb (key, user_data); + keyboard_cb (val, ascii, user_data); } } } @@ -227,14 +234,15 @@ } static gboolean -check_nvcodec_available (void) +check_nvcodec_available (const gchar * encoder_name) { gboolean ret = TRUE; GstElement *elem; - elem = gst_element_factory_make ("nvh264enc", NULL); + elem = gst_element_factory_make (encoder_name, NULL); if (!elem) { - GST_WARNING ("nvh264enc is not available, possibly driver load failure"); + GST_WARNING ("%s is not available, possibly driver load failure", + encoder_name); return FALSE; } @@ -328,13 +336,16 @@ GstCaps *caps; TestCallbackData data = { 0, }; GstPad *pad; - + gchar *encoder_name = NULL; + /* *INDENT-OFF* */ GOptionEntry options = { {"use-gl", 0, 0, G_OPTION_ARG_NONE, &use_gl, - "Use OpenGL memory as input to the nvenc", NULL} - , + "Use OpenGL memory as input to the nvenc", NULL}, + {"encoder", 0, 0, G_OPTION_ARG_STRING, &encoder_name, + "NVENC encoder element to test, default: nvh264enc"}, {NULL} }; + /* *INDENT-ON* */ option_ctx = g_option_context_new ("nvcodec dynamic reconfigure example"); g_option_context_add_main_entries (option_ctx, options, NULL); @@ -348,7 +359,10 @@ g_option_context_free (option_ctx); gst_init (NULL, NULL); - if (!check_nvcodec_available ()) { + if (!encoder_name) + encoder_name = g_strdup ("nvh264enc"); + + if (!check_nvcodec_available (encoder_name)) { g_printerr ("Cannot load nvcodec plugin"); exit (1); } @@ -400,11 +414,10 @@ capsfilter = gst_element_factory_make ("capsfilter", NULL); queue = gst_element_factory_make ("queue", NULL); - enc = gst_element_factory_make ("nvh264enc", NULL); + enc = gst_element_factory_make (encoder_name, NULL); parse = gst_element_factory_make ("h264parse", NULL); - /* vbr with target bitrate */ - g_object_set (G_OBJECT (enc), "rc-mode", 4, "bitrate", bitrate, NULL); + g_object_set (G_OBJECT (enc), "bitrate", bitrate, NULL); dec = gst_element_factory_make ("nvh264dec", NULL); @@ -445,10 +458,9 @@ gst_bus_add_watch (GST_ELEMENT_BUS (pipeline), bus_msg, &data); - if (gst_nvcodec_kb_set_key_handler (keyboard_cb, &data)) { - g_print ("Press 'k' to see a list of keyboard shortcuts.\n"); - atexit (restore_terminal); - } + set_key_handler (keyboard_cb, &data); + g_print ("Press 'k' to see a list of keyboard shortcuts.\n"); + atexit (unset_key_handler); /* run the pipeline */ sret = gst_element_set_state (pipeline, GST_STATE_PLAYING); @@ -467,6 +479,7 @@ gst_object_unref (pipeline); g_main_loop_unref (loop); + g_free (encoder_name); return exitcode; }
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/opencv/meson.build -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/opencv/meson.build
Changed
@@ -7,7 +7,7 @@ executable(exe_name, src_file, include_directories: configinc, - dependencies: glib_dep, gst_dep, gstbase_dep, + dependencies: gst_dep, gstbase_dep, c_args : gst_plugins_bad_args, install: false) endforeach
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/qsv
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/qsv/meson.build
Added
@@ -0,0 +1,10 @@ +if host_system not in 'windows', 'linux' + subdir_done() +endif + +executable('qsvenc-dynamic-reconfigure', + 'qsvenc-dynamic-reconfigure.c', '../key-handler.c', + include_directories : configinc, + dependencies: gst_dep, gstbase_dep, gstvideo_dep, + c_args : gst_plugins_bad_args, + install: false)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/qsv/qsvenc-dynamic-reconfigure.c
Added
@@ -0,0 +1,582 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <stdlib.h> +#include "../key-handler.h" + +typedef enum +{ + RC_MODE_CBR, + RC_MODE_VBR, + RC_MODE_AVBR, + RC_MODE_CQP, +} RcMode; + +typedef enum +{ + CODEC_AVC, + CODEC_HEVC, + CODEC_VP9, + CODEC_AV1, +} Codec; + +static GMainLoop *loop = NULL; +static gint width = 640; +static gint height = 480; +static guint bitrate = 1000; +static guint max_bitrate = 2000; +static guint avbr_accuracy = 0; +static guint convergence = 0; +static RcMode rc_mode = RC_MODE_CBR; +static Codec codec = CODEC_AVC; +static guint qp_i = 24; +static guint qp_p = 24; +static guint qp_b = 24; +static guint max_qp = 51; + +G_LOCK_DEFINE_STATIC (input_lock); + +typedef struct +{ + GstElement *pipeline; + GstElement *capsfilter; + GstElement *encoder; + gulong probe_id; + + gint prev_width; + gint prev_height; +} TestCallbackData; + + +static void +print_keyboard_help (void) +{ + /* *INDENT-OFF* */ + static struct + { + const gchar *key_desc; + const gchar *key_help; + } key_controls = { + { + "q", "Quit"}, { + "right arrow", "Increase Width"}, { + "left arrow", "Decrease Width"}, { + "up arrow", "Increase Height"}, { + "down arrow", "Decrease Height"}, { + ">", "Increase bitrate by 100 kbps"}, { + "<", "Decrease bitrate by 100 kbps"}, { + "", "Increase max-bitrate by 100 kbps"}, { + "", "Decrease max-bitrate by 100 kbps"}, { + "A", "Increase AVBR accuracy by 10 percent"}, { + "a", "Decrease AVBR accuracy by 10 percent"}, { + "C", "Increase AVBR convergence by 100 frame"}, { + "c", "Decrease AVBR convergence by 100 frame"}, { + "I", "Increase QP-I"}, { + "i", "Decrease QP-I"}, { + "P", "Increase QP-P"}, { + "p", "Decrease QP-P"}, { + "B", "Increase QP-B"}, { + "b", "Decrease QP-B"}, { + "k", "show keyboard shortcuts"} + }; + /* *INDENT-ON* */ + + guint i, chars_to_pad, desc_len, max_desc_len = 0; + + gst_print ("\n\n%s\n\n", "Keyboard controls:"); + + for (i = 0; i < G_N_ELEMENTS (key_controls); ++i) { + desc_len = g_utf8_strlen (key_controlsi.key_desc, -1); + max_desc_len = MAX (max_desc_len, desc_len); + } + ++max_desc_len; + + for (i = 0; i < G_N_ELEMENTS (key_controls); ++i) { + chars_to_pad = max_desc_len - g_utf8_strlen (key_controlsi.key_desc, -1); + gst_print ("\t%s", key_controlsi.key_desc); + gst_print ("%-*s: ", chars_to_pad, ""); + gst_print ("%s\n", key_controlsi.key_help); + } + gst_print ("\n"); +} + +static void +keyboard_cb (gchar input, gboolean is_ascii, gpointer user_data) +{ + TestCallbackData *data = (TestCallbackData *) user_data; + + G_LOCK (input_lock); + + if (!is_ascii) { + switch (input) { + case KB_ARROW_UP: + height += 2; + gst_println ("Increase height to %d", height); + break; + case KB_ARROW_DOWN: + height -= 2; + height = MAX (height, 16); + gst_println ("Decrease height to %d", height); + break; + case KB_ARROW_LEFT: + width -= 2; + width = MAX (width, 16); + gst_println ("Decrease width to %d", width); + break; + case KB_ARROW_RIGHT: + width += 2; + gst_println ("Increase width to %d", width); + break; + default: + break; + } + } else { + switch (input) { + case 'k': + case 'K': + print_keyboard_help (); + break; + case 'q': + case 'Q': + gst_element_send_event (data->pipeline, gst_event_new_eos ()); + g_main_loop_quit (loop); + break; + case '>': + if (rc_mode != RC_MODE_CQP) { + bitrate += 100; + bitrate = MIN (bitrate, 0xffff); + + if (rc_mode == RC_MODE_VBR) + bitrate = MIN (bitrate, max_bitrate); + gst_println ("Increase bitrate to %d", bitrate); + g_object_set (data->encoder, "bitrate", bitrate, NULL); + } + break; + case '<': + if (rc_mode != RC_MODE_CQP) { + bitrate -= 100; + bitrate = MAX (bitrate, 100); + + if (rc_mode == RC_MODE_VBR) + bitrate = MIN (bitrate, max_bitrate); + gst_println ("Decrease bitrate to %d", bitrate); + g_object_set (data->encoder, "bitrate", bitrate, NULL); + } + break; + case '': + if (rc_mode == RC_MODE_VBR) { + max_bitrate += 100; + max_bitrate = MIN (max_bitrate, 0xffff); + max_bitrate = MAX (max_bitrate, bitrate); + gst_println ("Increase max-bitrate to %d", max_bitrate); + g_object_set (data->encoder, "max-bitrate", max_bitrate, NULL); + } + break; + case '': + if (rc_mode == RC_MODE_VBR) { + max_bitrate -= 100; + max_bitrate = MAX (max_bitrate, 100); + max_bitrate = MAX (max_bitrate, bitrate); + gst_println ("Decrease max-bitrate to %d", max_bitrate); + g_object_set (data->encoder, "max-bitrate", max_bitrate, NULL); + } + break; + case 'A': + if (rc_mode == RC_MODE_AVBR && avbr_accuracy <= 900) { + avbr_accuracy += 100; + gst_println ("Increase AVBR accuracy to %d", avbr_accuracy); + g_object_set (data->encoder, "avbr-accuracy", avbr_accuracy, NULL); + } + break; + case 'a': + if (rc_mode == RC_MODE_AVBR && avbr_accuracy >= 100) { + avbr_accuracy -= 100; + gst_println ("Decrease AVBR accuracy to %d", avbr_accuracy); + g_object_set (data->encoder, "avbr-accuracy", avbr_accuracy, NULL); + } + break; + case 'C': + if (rc_mode == RC_MODE_AVBR && convergence < G_MAXINT16) { + gst_println ("Increase AVBR Convergence to %d", convergence++); + g_object_set (data->encoder, "avbr-convergence", convergence, NULL); + } + break; + case 'c': + if (rc_mode == RC_MODE_AVBR && convergence > 0) { + gst_println ("Decrease AVBR Convergence to %d", convergence++); + g_object_set (data->encoder, "avbr-convergence", convergence, NULL); + } + break; + case 'I': + if (rc_mode == RC_MODE_CQP && qp_i < max_qp) { + gst_println ("Increase QP-I to %d", ++qp_i); + g_object_set (data->encoder, "qp-i", qp_i, NULL); + } + break; + case 'i': + if (rc_mode == RC_MODE_CQP && qp_i > 0) { + gst_println ("Decrease QP-I to %d", --qp_i); + g_object_set (data->encoder, "qp-i", qp_i, NULL); + } + break; + case 'P': + if (rc_mode == RC_MODE_CQP && qp_p < max_qp) { + gst_println ("Increase QP-P to %d", ++qp_p); + g_object_set (data->encoder, "qp-p", qp_p, NULL); + } + break; + case 'p': + if (rc_mode == RC_MODE_CQP && qp_p > 0) { + gst_println ("Decrease QP-P to %d", --qp_p); + g_object_set (data->encoder, "qp-p", qp_p, NULL); + } + break; + case 'B': + if (rc_mode == RC_MODE_CQP && qp_b < max_qp && codec != CODEC_VP9) { + gst_println ("Increase QP-B to %d", ++qp_b); + g_object_set (data->encoder, "qp-b", qp_b, NULL); + } + break; + case 'b': + if (rc_mode == RC_MODE_CQP && qp_b > 0 && codec != CODEC_VP9) { + gst_println ("Decrease QP-B to %d", --qp_b); + g_object_set (data->encoder, "qp-b", qp_b, NULL); + } + break; + default: + break; + } + } + + G_UNLOCK (input_lock); +} + +static gboolean +bus_msg (GstBus * bus, GstMessage * msg, gpointer user_data) +{ + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_ERROR:{ + GError *err; + gchar *dbg; + + gst_message_parse_error (msg, &err, &dbg); + gst_printerrln ("ERROR %s", err->message); + if (dbg != NULL) + gst_printerrln ("ERROR debug information: %s", dbg); + g_clear_error (&err); + g_free (dbg); + + g_main_loop_quit (loop); + break; + } + default: + break; + } + + return TRUE; +} + +static gboolean +check_qsvencoder_available (const gchar * encoder_name) +{ + gboolean ret = TRUE; + GstElement *elem; + + elem = gst_element_factory_make (encoder_name, NULL); + if (!elem) { + gst_printerrln ("%s is not available", encoder_name); + return FALSE; + } + + if (gst_element_set_state (elem, + GST_STATE_PAUSED) != GST_STATE_CHANGE_SUCCESS) { + gst_printerrln ("cannot open device"); + ret = FALSE; + } + + gst_element_set_state (elem, GST_STATE_NULL); + gst_object_unref (elem); + + return ret; +} + +static GstPadProbeReturn +resolution_change_probe (GstPad * pad, GstPadProbeInfo * info, + gpointer user_data) +{ + GstPadProbeReturn ret = GST_PAD_PROBE_OK; + TestCallbackData *data = (TestCallbackData *) user_data; + + G_LOCK (input_lock); + + if (GST_IS_BUFFER (GST_PAD_PROBE_INFO_DATA (info))) { + GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info); + GstPad *peer = gst_pad_get_peer (pad); + GstFlowReturn flow_ret = GST_FLOW_OK; + + ret = GST_PAD_PROBE_HANDLED; + + if (peer) { + flow_ret = gst_pad_chain (peer, buffer); + + if (flow_ret != GST_FLOW_OK) { + gst_pad_remove_probe (pad, data->probe_id); + data->probe_id = 0; + } else { + if (data->prev_width != width || data->prev_height != height) { + GstCaps *caps = NULL; + gint next_width, next_height; + + next_width = width; + next_height = height; + + g_object_get (data->capsfilter, "caps", &caps, NULL); + caps = gst_caps_make_writable (caps); + gst_caps_set_simple (caps, + "width", G_TYPE_INT, next_width, "height", G_TYPE_INT, + next_height, NULL); + g_object_set (data->capsfilter, "caps", caps, NULL); + gst_caps_unref (caps); + + data->prev_width = next_width; + data->prev_height = next_height; + } + } + } + } + + G_UNLOCK (input_lock); + + return ret; +} + +gint +main (gint argc, gchar ** argv) +{ + GstElement *pipeline; + GstElement *src, *capsfilter, *enc, *enc_queue, *dec, *parser, *queue, *sink; + GstStateChangeReturn sret; + GError *error = NULL; + GOptionContext *option_ctx; + GstCaps *caps; + TestCallbackData data = { 0, }; + GstPad *pad; + gchar *encoder_name = NULL; + gchar *rate_control = NULL; + gint bframes = 0; + /* *INDENT-OFF* */ + GOptionEntry options = { + {"encoder", 0, 0, G_OPTION_ARG_STRING, &encoder_name, + "QSV video encoder element to test, default: qsvh264enc"}, + {"rate-control", 0, 0, G_OPTION_ARG_STRING, &rate_control, + "Rate control method to test, default: cbr"}, + {"b-frames", 0, 0, G_OPTION_ARG_INT, &bframes, + "Number of B frames between I and P frames, default: 0"}, + {NULL} + }; + /* *INDENT-ON* */ + +#define MAKE_ELEMENT_AND_ADD(elem, name) G_STMT_START { \ + GstElement *_elem = gst_element_factory_make (name, NULL); \ + if (!_elem) { \ + gst_printerrln ("%s is not available", name); \ + exit (1); \ + } \ + gst_println ("Adding element %s", name); \ + elem = _elem; \ + gst_bin_add (GST_BIN (pipeline), elem); \ +} G_STMT_END + + option_ctx = + g_option_context_new ("QSV video encoder dynamic reconfigure example"); + g_option_context_add_main_entries (option_ctx, options, NULL); + g_option_context_set_help_enabled (option_ctx, TRUE); + if (!g_option_context_parse (option_ctx, &argc, &argv, &error)) { + gst_printerrln ("option parsing failed: %s\n", error->message); + g_clear_error (&error); + exit (1); + } + + g_option_context_free (option_ctx); + gst_init (NULL, NULL); + + if (!encoder_name) + encoder_name = g_strdup ("qsvh264enc"); + if (!rate_control) + rate_control = g_strdup ("cbr"); + + if (g_strcmp0 (encoder_name, "qsvh264enc") == 0) { + codec = CODEC_AVC; + } else if (g_strcmp0 (encoder_name, "qsvh265enc") == 0) { + codec = CODEC_HEVC; + } else if (g_strcmp0 (encoder_name, "qsvvp9enc") == 0) { + codec = CODEC_VP9; + max_qp = 255; + qp_i = 128; + qp_p = 128; + } else if (g_strcmp0 (encoder_name, "qsvav1enc") == 0) { + codec = CODEC_AV1; + max_qp = 255; + qp_i = 128; + qp_p = 128; + } else { + gst_printerrln ("Unexpected encoder %s", encoder_name); + exit (1); + } + + if (g_strcmp0 (rate_control, "cbr") == 0) { + rc_mode = RC_MODE_CBR; + } else if (g_strcmp0 (rate_control, "vbr") == 0) { + rc_mode = RC_MODE_VBR; + } else if (g_strcmp0 (rate_control, "avbr") == 0 && codec == CODEC_AVC) { + rc_mode = RC_MODE_AVBR; + } else if (g_strcmp0 (rate_control, "cqp") == 0) { + rc_mode = RC_MODE_CQP; + } else { + gst_printerrln ("Unexpected rate-control method %s for encoder %s", + rate_control, encoder_name); + exit (1); + } + + if (!check_qsvencoder_available (encoder_name)) { + gst_printerrln ("Cannot load %s plugin", encoder_name); + exit (1); + } + + /* prepare the pipeline */ + loop = g_main_loop_new (NULL, FALSE); + + pipeline = gst_pipeline_new (NULL); + + MAKE_ELEMENT_AND_ADD (src, "videotestsrc"); + g_object_set (src, "pattern", 1, NULL); + + MAKE_ELEMENT_AND_ADD (capsfilter, "capsfilter"); + MAKE_ELEMENT_AND_ADD (enc, encoder_name); + + g_object_set (enc, "bitrate", bitrate, "max-bitrate", max_bitrate, + "qp-i", qp_i, "qp-p", qp_p, "gop-size", 30, NULL); + if (codec != CODEC_VP9 && codec != CODEC_AV1) + g_object_set (enc, "qp-b", qp_b, NULL); + + gst_util_set_object_arg (G_OBJECT (enc), "rate-control", rate_control); + + MAKE_ELEMENT_AND_ADD (enc_queue, "queue"); + if (g_strrstr (encoder_name, "h265")) { + if (bframes > 0) + g_object_set (enc, "b-frames", bframes, NULL); + if (rc_mode == RC_MODE_CBR || rc_mode == RC_MODE_VBR) { + /* Disable HRD conformance for dynamic bitrate update */ + g_object_set (enc, "disable-hrd-conformance", TRUE, NULL); + } + + MAKE_ELEMENT_AND_ADD (parser, "h265parse"); +#ifdef G_OS_WIN32 + MAKE_ELEMENT_AND_ADD (dec, "d3d11h265dec"); +#else + MAKE_ELEMENT_AND_ADD (dec, "vah265dec"); +#endif + } else if (g_strrstr (encoder_name, "vp9")) { + MAKE_ELEMENT_AND_ADD (parser, "vp9parse"); +#ifdef G_OS_WIN32 + MAKE_ELEMENT_AND_ADD (dec, "d3d11vp9dec"); +#else + MAKE_ELEMENT_AND_ADD (dec, "vavp9dec"); +#endif + } else if (g_strrstr (encoder_name, "av1")) { + MAKE_ELEMENT_AND_ADD (parser, "av1parse"); +#ifdef G_OS_WIN32 + MAKE_ELEMENT_AND_ADD (dec, "d3d11av1dec"); +#else + MAKE_ELEMENT_AND_ADD (dec, "vaav1dec"); +#endif + } else { + if (bframes > 0) + g_object_set (enc, "b-frames", bframes, NULL); + + if (rc_mode == RC_MODE_CBR || rc_mode == RC_MODE_VBR) { + /* Disable HRD conformance for dynamic bitrate update */ + g_object_set (enc, "disable-hrd-conformance", TRUE, NULL); + } + + MAKE_ELEMENT_AND_ADD (parser, "h264parse"); +#ifdef G_OS_WIN32 + MAKE_ELEMENT_AND_ADD (dec, "d3d11h264dec"); +#else + MAKE_ELEMENT_AND_ADD (dec, "vah264dec"); +#endif + } + MAKE_ELEMENT_AND_ADD (queue, "queue"); + +#ifdef G_OS_WIN32 + MAKE_ELEMENT_AND_ADD (sink, "d3d11videosink"); +#else + MAKE_ELEMENT_AND_ADD (sink, "glimagesink"); +#endif + + if (!gst_element_link_many (src, capsfilter, enc, enc_queue, + parser, dec, queue, sink, NULL)) { + gst_printerrln ("Failed to link element"); + exit (1); + } + + caps = gst_caps_new_simple ("video/x-raw", "width", G_TYPE_INT, + width, "height", G_TYPE_INT, height, NULL); + g_object_set (capsfilter, "caps", caps, NULL); + gst_caps_unref (caps); + + data.pipeline = pipeline; + data.capsfilter = capsfilter; + data.encoder = enc; + + pad = gst_element_get_static_pad (capsfilter, "src"); + data.probe_id = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, + (GstPadProbeCallback) resolution_change_probe, &data, NULL); + gst_object_unref (pad); + data.prev_width = width; + data.prev_height = height; + + gst_bus_add_watch (GST_ELEMENT_BUS (pipeline), bus_msg, &data); + + /* run the pipeline */ + sret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + if (sret == GST_STATE_CHANGE_FAILURE) { + gst_printerrln ("Pipeline doesn't want to playing\n"); + } else { + set_key_handler ((KeyInputCallback) keyboard_cb, &data); + g_main_loop_run (loop); + unset_key_handler (); + } + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_bus_remove_watch (GST_ELEMENT_BUS (pipeline)); + + gst_object_unref (pipeline); + g_main_loop_unref (loop); + g_free (encoder_name); + g_free (rate_control); + + return 0; +}
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/va/main.c -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/va/main.c
Changed
@@ -11,10 +11,10 @@ #include <gtk/gtk.h> -#include <gst/gst.h> #include <gst/app/gstappsink.h> +#include <gst/gst.h> +#include <gst/va/gstva.h> #include <gst/video/video.h> -#include <gst/va/gstvadisplay.h> #include <va/va_x11.h>
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/va/meson.build -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/va/meson.build
Changed
@@ -24,3 +24,10 @@ dependencies : gst_dep, gstvideo_dep, gstva_dep, gstcontroller_dep, c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', ) + +executable('vaenc-dynamic-reconfigure', + 'vaenc-dynamic-reconfigure.c', '../key-handler.c', + include_directories : configinc, + dependencies: gst_dep, gstbase_dep, gstvideo_dep, + c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', + install: false)
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/va/multiple-vpp.c -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/va/multiple-vpp.c
Changed
@@ -1,10 +1,10 @@ #include <stdlib.h> +#include <gst/controller/gstdirectcontrolbinding.h> +#include <gst/controller/gstinterpolationcontrolsource.h> #include <gst/gst.h> +#include <gst/va/gstva.h> #include <gst/video/video.h> -#include <gst/controller/gstinterpolationcontrolsource.h> -#include <gst/controller/gstdirectcontrolbinding.h> -#include <gst/va/gstvadisplay.h> #define CHANGE_DIR_WITH_EVENT 0
View file
gst-plugins-bad-1.22.0.tar.xz/tests/examples/va/vaenc-dynamic-reconfigure.c
Added
@@ -0,0 +1,565 @@ +/* GStreamer + * Copyright (C) 2022 Seungha Yang <seungha@centricular.com> + * 2022 Víctor Jáquez <vjaquez@igalia.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <gst/gst.h> +#include <gst/video/video.h> +#include <stdlib.h> +#include "../key-handler.h" + +static GMainLoop *loop = NULL; +static gint width = 640; +static gint height = 480; +static guint rc_ctrl = 0; + +G_LOCK_DEFINE_STATIC (input_lock); + +typedef struct +{ + GstElement *pipeline; + GstElement *capsfilter; + GstElement *encoder; + gulong probe_id; + + gint prev_width; + gint prev_height; +} TestCallbackData; + +static gboolean +bus_msg (GstBus * bus, GstMessage * msg, gpointer user_data) +{ + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_ERROR:{ + GError *err; + gchar *dbg; + + gst_message_parse_error (msg, &err, &dbg); + gst_printerrln ("ERROR %s", err->message); + if (dbg != NULL) + gst_printerrln ("ERROR debug information: %s", dbg); + g_clear_error (&err); + g_free (dbg); + + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_PROPERTY_NOTIFY:{ + const GValue *val; + const gchar *name; + GstObject *obj; + gchar *val_str = NULL; + gchar *obj_name; + + gst_message_parse_property_notify (msg, &obj, &name, &val); + + if (!GST_IS_VIDEO_ENCODER (obj)) + break; + + obj_name = gst_object_get_name (GST_OBJECT (obj)); + if (val) { + if (G_VALUE_HOLDS_STRING (val)) + val_str = g_value_dup_string (val); + else if (G_VALUE_TYPE (val) == GST_TYPE_CAPS) + val_str = gst_caps_to_string (g_value_get_boxed (val)); + else if (G_VALUE_HOLDS_BOOLEAN (val) || G_VALUE_HOLDS_INT (val) + || G_VALUE_HOLDS_UINT (val) || G_VALUE_HOLDS_ENUM (val)) + val_str = gst_value_serialize (val); + else + val_str = g_strdup ("(unknown type)"); + } else { + val_str = g_strdup ("(no value)"); + } + + gst_println ("%s: %s = %s", obj_name, name, val_str); + g_free (obj_name); + g_free (val_str); + break; + } + default: + break; + } + + return TRUE; +} + +static void +loop_rate_control (GstElement * encoder) +{ + GParamSpec *pspec = + g_object_class_find_property (G_OBJECT_GET_CLASS (encoder), + "rate-control"); + GEnumClass *enum_class; + gint i, default_value; + + if (!pspec) + return; + + enum_class = G_PARAM_SPEC_ENUM (pspec)->enum_class; + + if (rc_ctrl == 0) { + default_value = G_PARAM_SPEC_ENUM (pspec)->default_value; + for (i = 0; i < enum_class->n_values; i++) { + if (enum_class->valuesi.value == default_value) { + rc_ctrl = i; + break; + } + } + } + + i = ++rc_ctrl % enum_class->n_values; + g_object_set (encoder, "rate-control", enum_class->valuesi.value, NULL); +} + +static GstPadProbeReturn +resolution_change_probe (GstPad * pad, GstPadProbeInfo * info, + gpointer user_data) +{ + GstPadProbeReturn ret = GST_PAD_PROBE_OK; + TestCallbackData *data = (TestCallbackData *) user_data; + + G_LOCK (input_lock); + + if (GST_IS_BUFFER (GST_PAD_PROBE_INFO_DATA (info))) { + GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info); + GstPad *peer = gst_pad_get_peer (pad); + GstFlowReturn flow_ret = GST_FLOW_OK; + + ret = GST_PAD_PROBE_HANDLED; + + if (peer) { + flow_ret = gst_pad_chain (peer, buffer); + + if (flow_ret != GST_FLOW_OK) { + gst_pad_remove_probe (pad, data->probe_id); + data->probe_id = 0; + } else { + if (data->prev_width != width || data->prev_height != height) { + GstCaps *caps = NULL; + gint next_width, next_height; + + next_width = width; + next_height = height; + + g_object_get (data->capsfilter, "caps", &caps, NULL); + caps = gst_caps_make_writable (caps); + gst_caps_set_simple (caps, + "width", G_TYPE_INT, next_width, "height", G_TYPE_INT, + next_height, NULL); + g_object_set (data->capsfilter, "caps", caps, NULL); + gst_caps_unref (caps); + + data->prev_width = next_width; + data->prev_height = next_height; + } + } + } + } + + G_UNLOCK (input_lock); + + return ret; +} + +static void +print_keyboard_help (void) +{ + /* *INDENT-OFF* */ + static struct + { + const gchar *key_desc; + const gchar *key_help; + } key_controls = { + { + "q", "Quit"}, { + "right arrow", "Increase Width"}, { + "left arrow", "Decrease Width"}, { + "up arrow", "Increase Height"}, { + "down arrow", "Decrease Height"}, { + "r", "Loop rate control"}, { + ">", "Increase bitrate by 100 kbps"}, { + "<", "Decrease bitrate by 100 kbps"}, { + "", "Increase target usage"}, { + "", "Decrease target usage"}, { + "}", "Increase target percentage by 10% (only in VBR)"}, { + "{", "Decrease target percentage by 10% (only in VBR)"}, { + "I", "Increase QP-I"}, { + "i", "Decrease QP-I"}, { + "P", "Increase QP-P (only in CQP)"}, { + "p", "Decrease QP-P (only in CQP)"}, { + "B", "Increase QP-B (only in CQP)"}, { + "b", "Decrease QP-B (only in CQP)"}, { + "k", "show keyboard shortcuts"} + }; + /* *INDENT-ON* */ + + guint i, chars_to_pad, desc_len, max_desc_len = 0; + + gst_print ("\n\n%s\n\n", "Keyboard controls:"); + + for (i = 0; i < G_N_ELEMENTS (key_controls); ++i) { + desc_len = g_utf8_strlen (key_controlsi.key_desc, -1); + max_desc_len = MAX (max_desc_len, desc_len); + } + ++max_desc_len; + + for (i = 0; i < G_N_ELEMENTS (key_controls); ++i) { + chars_to_pad = max_desc_len - g_utf8_strlen (key_controlsi.key_desc, -1); + gst_print ("\t%s", key_controlsi.key_desc); + gst_print ("%-*s: ", chars_to_pad, ""); + gst_print ("%s\n", key_controlsi.key_help); + } + gst_print ("\n"); +} + +static inline gboolean +is_ratectl (GstElement * encoder, guint rc) +{ + guint ratectl = 0; + + g_object_get (encoder, "rate-control", &ratectl, NULL); + return (ratectl == rc); +} + +static void +keyboard_cb (gchar input, gboolean is_ascii, gpointer user_data) +{ + TestCallbackData *data = (TestCallbackData *) user_data; + + G_LOCK (input_lock); + + if (!is_ascii) { + switch (input) { + case KB_ARROW_UP: + height += 2; + break; + case KB_ARROW_DOWN: + height -= 2; + height = MAX (height, 16); + break; + case KB_ARROW_LEFT: + width -= 2; + width = MAX (width, 16); + break; + case KB_ARROW_RIGHT: + width += 2; + break; + default: + break; + } + } else { + switch (input) { + case 'k': + case 'K': + print_keyboard_help (); + break; + case 'q': + case 'Q': + gst_element_send_event (data->pipeline, gst_event_new_eos ()); + g_main_loop_quit (loop); + break; + case 'r': + case 'R': + loop_rate_control (data->encoder); + break; + case '>':{ + guint bitrate; + + if (is_ratectl (data->encoder, 0x00000010 /* VA_RC_CQP */ )) + break; + + g_object_get (data->encoder, "bitrate", &bitrate, NULL); + bitrate += 100; + if (bitrate <= 2048000) + g_object_set (data->encoder, "bitrate", bitrate, NULL); + break; + } + case '<':{ + gint bitrate; + + if (is_ratectl (data->encoder, 0x00000010 /* VA_RC_CQP */ )) + break; + + g_object_get (data->encoder, "bitrate", &bitrate, NULL); + bitrate -= 100; + if (bitrate < 0) + bitrate = 0; + g_object_set (data->encoder, "bitrate", bitrate, NULL); + break; + } + case '':{ + guint usage; + + g_object_get (data->encoder, "target-usage", &usage, NULL); + usage += 1; + if (usage <= 7) + g_object_set (data->encoder, "target-usage", usage, NULL); + break; + } + case '':{ + guint usage; + + g_object_get (data->encoder, "target-usage", &usage, NULL); + usage -= 1; + if (usage >= 1) + g_object_set (data->encoder, "target-usage", usage, NULL); + break; + } + case '}':{ + guint target; + + if (!is_ratectl (data->encoder, 0x00000004 /* VA_RC_VBR */ )) + break; + + g_object_get (data->encoder, "target-percentage", &target, NULL); + target += 10; + if (target <= 100) + g_object_set (data->encoder, "target-percentage", target, NULL); + break; + } + case '{':{ + guint target; + + if (!is_ratectl (data->encoder, 0x00000004 /* VA_RC_VBR */ )) + break; + + g_object_get (data->encoder, "target-percentage", &target, NULL); + target -= 10; + if (target >= 50) + g_object_set (data->encoder, "target-percentage", target, NULL); + break; + } + case 'I':{ + guint qpi; + + g_object_get (data->encoder, "qpi", &qpi, NULL); + qpi += 1; + if (qpi <= 51) + g_object_set (data->encoder, "qpi", qpi, NULL); + break; + } + case 'i':{ + gint qpi; + + g_object_get (data->encoder, "qpi", &qpi, NULL); + qpi -= 1; + if (qpi >= 0) + g_object_set (data->encoder, "qpi", qpi, NULL); + break; + } + case 'P':{ + guint qpp; + + if (!is_ratectl (data->encoder, 0x00000010 /* VA_RC_CQP */ )) + break; + + g_object_get (data->encoder, "qpp", &qpp, NULL); + qpp += 1; + if (qpp <= 51) + g_object_set (data->encoder, "qpp", qpp, NULL); + break; + } + case 'p':{ + gint qpp; + + if (!is_ratectl (data->encoder, 0x00000010 /* VA_RC_CQP */ )) + break; + + g_object_get (data->encoder, "qpp", &qpp, NULL); + qpp -= 1; + if (qpp >= 0) + g_object_set (data->encoder, "qpp", qpp, NULL); + break; + } + case 'B':{ + guint qpb; + + if (!is_ratectl (data->encoder, 0x00000010 /* VA_RC_CQP */ )) + break; + + g_object_get (data->encoder, "qpb", &qpb, NULL); + qpb += 1; + if (qpb <= 51) + g_object_set (data->encoder, "qpb", qpb, NULL); + break; + } + case 'b':{ + gint qpb; + + if (!is_ratectl (data->encoder, 0x00000010 /* VA_RC_CQP */ )) + break; + + g_object_get (data->encoder, "qpb", &qpb, NULL); + qpb -= 1; + if (qpb >= 0) + g_object_set (data->encoder, "qpb", qpb, NULL); + break; + } + default: + break; + } + } + + G_UNLOCK (input_lock); +} + +gint +main (gint argc, gchar ** argv) +{ + GstElement *pipeline; + GstElement *src, *capsfilter, *convert, *enc, *dec, *parser, *vpp, *sink; + GstElement *queue0, *queue1; + GstStateChangeReturn sret; + GError *error = NULL; + GOptionContext *option_ctx; + GstCaps *caps; + GstPad *pad; + TestCallbackData data = { 0, }; + gchar *codec = NULL; + gulong deep_notify_id = 0; + guint idx; + + /* *INDENT-OFF* */ + const GOptionEntry options = { + {"codec", 'c', 0, G_OPTION_ARG_STRING, &codec, + "Codec to test: *h264, h265 "}, + {NULL} + }; + const struct { + const char *codec; + const char *encoder; + const char *parser; + const char *decoder; + } elements_map = { + { "h264", "vah264enc", "h264parse", "vah264dec" }, + { "h265", "vah265enc", "h265parse", "vah265dec" }, + }; + /* *INDENT-ON* */ + +#define MAKE_ELEMENT_AND_ADD(elem, name) G_STMT_START { \ + GstElement *_elem = gst_element_factory_make (name, NULL); \ + if (!_elem) { \ + gst_printerrln ("%s is not available", name); \ + exit (1); \ + } \ + gst_println ("Adding element %s", name); \ + elem = _elem; \ + gst_bin_add (GST_BIN (pipeline), elem); \ +} G_STMT_END + + option_ctx = + g_option_context_new ("VA video encoder dynamic reconfigure example"); + g_option_context_add_main_entries (option_ctx, options, NULL); + g_option_context_add_group (option_ctx, gst_init_get_option_group ()); + g_option_context_set_help_enabled (option_ctx, TRUE); + if (!g_option_context_parse (option_ctx, &argc, &argv, &error)) { + gst_printerrln ("option parsing failed: %s\n", error->message); + g_clear_error (&error); + exit (1); + } + + g_option_context_free (option_ctx); + gst_init (NULL, NULL); + + if (!codec) + codec = g_strdup ("h264"); + + for (idx = 0; idx < G_N_ELEMENTS (elements_map); idx++) { + if (g_strcmp0 (elements_mapidx.codec, codec) == 0) + break; + } + + if (idx == G_N_ELEMENTS (elements_map)) { + gst_printerrln ("Unsupported codec: %s", codec); + exit (1); + } + g_free (codec); + + pipeline = gst_pipeline_new (NULL); + + MAKE_ELEMENT_AND_ADD (src, "videotestsrc"); + g_object_set (src, "pattern", 1, NULL); + + MAKE_ELEMENT_AND_ADD (capsfilter, "capsfilter"); + MAKE_ELEMENT_AND_ADD (convert, "videoconvert"); + MAKE_ELEMENT_AND_ADD (enc, elements_mapidx.encoder); + MAKE_ELEMENT_AND_ADD (queue0, "queue"); + MAKE_ELEMENT_AND_ADD (parser, elements_mapidx.parser); + MAKE_ELEMENT_AND_ADD (dec, elements_mapidx.decoder); + MAKE_ELEMENT_AND_ADD (vpp, "vapostproc"); + MAKE_ELEMENT_AND_ADD (queue1, "queue"); + MAKE_ELEMENT_AND_ADD (sink, "autovideosink"); + + if (!gst_element_link_many (src, capsfilter, convert, enc, queue0, + parser, dec, vpp, queue1, sink, NULL)) { + gst_printerrln ("Failed to link element"); + exit (1); + } + + caps = gst_caps_new_simple ("video/x-raw", "width", G_TYPE_INT, + width, "height", G_TYPE_INT, height, + "format", G_TYPE_STRING, "I420", NULL); + g_object_set (capsfilter, "caps", caps, NULL); + gst_caps_unref (caps); + + g_object_set (convert, "chroma-mode", 3, NULL); + g_object_set (convert, "dither", 0, NULL); + + data.pipeline = pipeline; + data.capsfilter = capsfilter; + data.encoder = enc; + + pad = gst_element_get_static_pad (capsfilter, "src"); + data.probe_id = gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, + resolution_change_probe, &data, NULL); + gst_object_unref (pad); + data.prev_width = width; + data.prev_height = height; + + loop = g_main_loop_new (NULL, FALSE); + + deep_notify_id = + gst_element_add_property_deep_notify_watch (pipeline, NULL, TRUE); + + gst_bus_add_watch (GST_ELEMENT_BUS (pipeline), bus_msg, &data); + + /* run the pipeline */ + sret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + if (sret == GST_STATE_CHANGE_FAILURE) { + gst_printerrln ("Pipeline doesn't want to playing"); + } else { + set_key_handler ((KeyInputCallback) keyboard_cb, &data); + g_main_loop_run (loop); + unset_key_handler (); + } + + if (deep_notify_id != 0) + g_signal_handler_disconnect (pipeline, deep_notify_id); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_bus_remove_watch (GST_ELEMENT_BUS (pipeline)); + + gst_object_unref (pipeline); + g_main_loop_unref (loop); + + return 0; +}
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/waylandsink/main.c -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/waylandsink/main.c
Changed
@@ -86,14 +86,14 @@ { DemoApp *d = user_data; - if (gst_is_wayland_display_handle_need_context_message (message)) { + if (gst_is_wl_display_handle_need_context_message (message)) { GstContext *context; GdkDisplay *display; struct wl_display *display_handle; display = gtk_widget_get_display (d->video_widget); display_handle = gdk_wayland_display_get_wl_display (display); - context = gst_wayland_display_handle_context_new (display_handle); + context = gst_wl_display_handle_context_new (display_handle); gst_element_set_context (GST_ELEMENT (GST_MESSAGE_SRC (message)), context); gst_context_unref (context);
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/waylandsink/wayland-threads.c -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/waylandsink/wayland-threads.c
Changed
@@ -76,9 +76,9 @@ { App *app = user_data; - if (gst_is_wayland_display_handle_need_context_message (message)) { + if (gst_is_wl_display_handle_need_context_message (message)) { GstContext *context; - context = gst_wayland_display_handle_context_new (app->display); + context = gst_wl_display_handle_context_new (app->display); gst_element_set_context (GST_ELEMENT (GST_MESSAGE_SRC (message)), context); gst_context_unref (context);
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/webrtc/meson.build -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/webrtc/meson.build
Changed
@@ -8,7 +8,7 @@ src_file, install: false, include_directories : configinc, - dependencies : glib_dep, gst_dep, gstwebrtc_dep, + dependencies : gst_dep, gstwebrtc_dep, c_args : gst_plugins_bad_args + '-DGST_USE_UNSTABLE_API', ) endforeach
View file
gst-plugins-bad-1.20.5.tar.xz/tests/examples/wpe/meson.build -> gst-plugins-bad-1.22.0.tar.xz/tests/examples/wpe/meson.build
Changed
@@ -8,7 +8,7 @@ src_file, install: false, include_directories : configinc, - dependencies : glib_dep, gst_dep, + dependencies : gst_dep, c_args : '-DHAVE_CONFIG_H=1', ) endforeach
View file
gst-plugins-bad-1.22.0.tar.xz/tests/interactive
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/interactive/meson.build
Added
@@ -0,0 +1,6 @@ +if not get_option('soundtouch').disabled() and soundtouch_dep.found() + executable('pitch-test', 'pitch-test.c', + include_directories: configinc, + dependencies: gst_dep, gstcontroller_dep, + install: false) +endif
View file
gst-plugins-bad-1.22.0.tar.xz/tests/interactive/pitch-test.c
Added
@@ -0,0 +1,102 @@ +/* GStreamer + * + * Copyright (C) 2006 Thomas Vander Stichele <thomas at apestaart dot org> + * + * 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., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/* compile with : + * gcc -Wall $(pkg-config --cflags --libs gstreamer-0.10 gstreamer-controller-0.10) pitch.c -o pitch + */ + +#include <string.h> +#ifndef _MSC_VER +#include <unistd.h> +#endif +#include <gst/gst.h> +#include <gst/controller/gsttimedvaluecontrolsource.h> +#include <gst/controller/gstinterpolationcontrolsource.h> +#include <gst/controller/gstdirectcontrolbinding.h> + +int +main (int argc, char **argv) +{ + GMainLoop *loop; + gint i; + + GstElement *audiotestsrc; + GstElement *audioconvert1, *audioconvert2; + GstElement *pitch; + GstElement *sink; + GstElement *pipeline; + GstControlSource *cs; + GstTimedValueControlSource *tvcs; + + if (argc != 2) { + g_printerr ("Usage: %s <audiosink>\n", argv0); + return 1; + } + + /* initialize GStreamer */ + gst_init (&argc, &argv); + + loop = g_main_loop_new (NULL, FALSE); + + pipeline = gst_pipeline_new ("audio-player"); + audiotestsrc = gst_element_factory_make ("audiotestsrc", "audiotestsrc"); + g_assert (audiotestsrc != NULL); + audioconvert1 = gst_element_factory_make ("audioconvert", "audioconvert1"); + g_assert (audioconvert1 != NULL); + audioconvert2 = gst_element_factory_make ("audioconvert", "audioconvert2"); + g_assert (audioconvert2 != NULL); + pitch = gst_element_factory_make ("pitch", "pitch"); + g_assert (pitch != NULL); + sink = gst_element_factory_make (argv1, "sink"); + g_assert (sink != NULL); + + gst_bin_add_many (GST_BIN (pipeline), + audiotestsrc, audioconvert1, pitch, audioconvert2, sink, NULL); + gst_element_link_many (audiotestsrc, audioconvert1, pitch, audioconvert2, + sink, NULL); + + /* set up a controller */ + cs = gst_interpolation_control_source_new (); + g_object_set (cs, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); + + gst_object_add_control_binding (GST_OBJECT (pitch), + gst_direct_control_binding_new (GST_OBJECT (pitch), "pitch", cs)); + tvcs = (GstTimedValueControlSource *) cs; + + for (i = 0; i < 100; ++i) { + if (i % 2) + gst_timed_value_control_source_set (tvcs, i * GST_SECOND, 0.5); + else + gst_timed_value_control_source_set (tvcs, i * GST_SECOND, 1.5); + } + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + g_print ("Running\n"); + g_main_loop_run (loop); + + /* clean up nicely */ + gst_object_unref (cs); + 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)); + + return 0; +}
View file
gst-plugins-bad-1.20.5.tar.xz/tests/meson.build -> gst-plugins-bad-1.22.0.tar.xz/tests/meson.build
Changed
@@ -1,6 +1,6 @@ if not get_option('tests').disabled() and gstcheck_dep.found() subdir('check') - subdir('icles') + subdir('interactive') subdir('validate') endif if not get_option('examples').disabled()
View file
gst-plugins-bad-1.20.5.tar.xz/tests/validate/meson.build -> gst-plugins-bad-1.22.0.tar.xz/tests/validate/meson.build
Changed
@@ -4,7 +4,9 @@ endif tests = - 'opencv/cvtracker' + {'path': 'opencv/cvtracker'}, + {'path': 'testsrcbin/caps_spec'}, + {'path': 'wpe/load_bytes_first', 'skip': not building_wpe}, env = environment() @@ -16,14 +18,16 @@ 'gst-plugins-bad@' + meson.project_build_root()) foreach t: tests - test_dir_name = t.split('/') - test_name = 'validate' - foreach c: test_dir_name - test_name += '.' + c - endforeach - test_env = env - test_env.set('GST_VALIDATE_LOGSDIR', join_paths(meson.current_build_dir(), test_name)) - test_file = join_paths(meson.current_source_dir(), t + '.validatetest') - test(test_name, gst_tester, args: test_file, '--use-fakesinks', - env: test_env, timeout : 3 * 60, protocol: 'tap') + if not t.get('skip', false) + test_dir_name = t.get('path').split('/') + test_name = 'validate' + foreach c: test_dir_name + test_name += '.' + c + endforeach + test_env = env + test_env.set('GST_VALIDATE_LOGSDIR', join_paths(meson.current_build_dir(), test_name)) + test_file = join_paths(meson.current_source_dir(), t.get('path') + '.validatetest') + test(test_name, gst_tester, args: test_file, '--use-fakesinks', + env: test_env, timeout : 3 * 60, protocol: 'tap') + endif endforeach
View file
gst-plugins-bad-1.22.0.tar.xz/tests/validate/testsrcbin
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/validate/testsrcbin/caps_spec
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/validate/testsrcbin/caps_spec.validatetest
Added
@@ -0,0 +1,7 @@ +meta, + args = { + "testbin://video,caps=video/x-raw,width=1920,height=1080,num-buffers=1 ! fakesink", + }, + configs = { + "$(validateflow), pad=testsrcbin0:video_src_0", + }
View file
gst-plugins-bad-1.22.0.tar.xz/tests/validate/testsrcbin/caps_spec/flow-expectations
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/validate/testsrcbin/caps_spec/flow-expectations/log-testsrcbin0-video_src_0-expected
Added
@@ -0,0 +1,5 @@ +event stream-start: GstEventStreamStart, flags=(GstStreamFlags)GST_STREAM_FLAG_NONE, group-id=(uint)1, stream=(GstStream)"\(GstStream\)\ videotestsrc_stream_0"; +event caps: video/x-raw, format=(string)ABGR64_LE, framerate=(fraction)30/1, height=(int)1080, interlace-mode=(string)progressive, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)1/1, width=(int)1920; +event stream-collection: stream-collection, collection=(GstStreamCollection)"\(GstStreamCollection\)\ streamcollection0"; +event segment: format=TIME, start=0:00:00.000000000, offset=0:00:00.000000000, stop=none, time=0:00:00.000000000, base=0:00:00.000000000, position=0:00:00.000000000 +event eos: (no structure)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/validate/wpe
Added
+(directory)
View file
gst-plugins-bad-1.22.0.tar.xz/tests/validate/wpe/load_bytes_first.validatetest
Added
@@ -0,0 +1,13 @@ +meta, + args = { + "wpesrc name=wpesrc ! queue ! video/x-raw,width=480,height=270 ! fakesink name=sink", + } + +check-last-sample, checksum=e16c8ac11b4ad92e26abab2743d609f4c3ac2e37, playback-time=0.1 +emit-signal, + signal-name="load-bytes", + target-element-name="wpesrc", + params=< "<h1>test<h1>", > + +check-last-sample, checksum=8c0eb7a26cf0cb4cb3095a2a6f2d28c97be15874, playback-time=1.0 +stop;
View file
gst-plugins-bad-1.20.5.tar.xz/tools/gst-transcoder.c -> gst-plugins-bad-1.22.0.tar.xz/tools/gst-transcoder.c
Changed
@@ -26,6 +26,10 @@ #include <glib-unix.h> #endif +#ifdef __APPLE__ +#include <TargetConditionals.h> +#endif + static const gchar *HELP_SUMMARY = "gst-transcoder-1.0 transcodes a stream defined by its first <input-uri>\n" "argument to the place defined by its second <output-uri> argument\n" @@ -317,8 +321,8 @@ warn ("Got warning: %s", error->message); } -int -main (int argc, char *argv) +static int +real_main (int argc, char *argv) { gint res = 0; GError *err = NULL; @@ -460,3 +464,13 @@ goto done; } + +int +main (int argc, char *argv) +{ +#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE + return gst_macos_main ((GstMainFunc) real_main, argc, argv, NULL); +#else + return real_main (argc, argv); +#endif +}
View file
gst-plugins-bad-1.20.5.tar.xz/tools/meson.build -> gst-plugins-bad-1.22.0.tar.xz/tools/meson.build
Changed
@@ -1,6 +1,7 @@ executable('gst-transcoder-' + api_version, 'gst-transcoder.c', 'utils.c', install : true, + install_tag : 'bin', dependencies : gst_dep, gstpbutils_dep, gst_transcoder_dep, c_args: '-DG_LOG_DOMAIN="gst-transcoder-@0@"'.format(api_version), )
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.